ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggOTdmN2I0Zi4uNGU4M2U3YiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTMyLDYgKzMyLDcgQEAKIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAYWNtLm9yZz4KIERhdmlkIEJyb3duZWxsIDxkYXZpZC1iQHBhY2JlbGwubmV0PgogRGF2aWQgV29vZGhvdXNlIDxkd213MkBzaGlueWJvb2suaW5mcmFkZWFkLm9yZz4KK0RtaXRyeSBFcmVtaW4tU29sZW5pa292IDxkYmFyeXNoa292QGdtYWlsLmNvbT4KIERvbWVuIFB1bmNlciA8ZG9tZW5AY29kZXJvY2sub3JnPgogRG91Z2xhcyBHaWxiZXJ0IDxkb3VnZ0B0b3JxdWUubmV0PgogRWQgTC4gQ2FzaGluIDxlY2FzaGluQGNvcmFpZC5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtbWVtb3J5IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLW1lbW9yeQppbmRleCA3YTE2ZmUxLi45ZmU5MWMwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtbWVtb3J5CisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1tZW1vcnkKQEAgLTYsNyArNiw2IEBACiAJCWludGVybmFsIHN0YXRlIG9mIHRoZSBrZXJuZWwgbWVtb3J5IGJsb2Nrcy4gRmlsZXMgY291bGQgYmUKIAkJYWRkZWQgb3IgcmVtb3ZlZCBkeW5hbWljYWxseSB0byByZXByZXNlbnQgaG90LWFkZC9yZW1vdmUKIAkJb3BlcmF0aW9ucy4KLQogVXNlcnM6CQlob3RwbHVnIG1lbW9yeSBhZGQvcmVtb3ZlIHRvb2xzCiAJCWh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL3Byb2plY3RzL3Bvd2VycGMtdXRpbHMvCiAKQEAgLTE5LDYgKzE4LDU2IEBACiAJCVRoaXMgaXMgdXNlZnVsIGZvciBhIHVzZXItbGV2ZWwgYWdlbnQgdG8gZGV0ZXJtaW5lCiAJCWlkZW50aWZ5IHJlbW92YWJsZSBzZWN0aW9ucyBvZiB0aGUgbWVtb3J5IGJlZm9yZSBhdHRlbXB0aW5nCiAJCXBvdGVudGlhbGx5IGV4cGVuc2l2ZSBob3QtcmVtb3ZlIG1lbW9yeSBvcGVyYXRpb24KLQogVXNlcnM6CQlob3RwbHVnIG1lbW9yeSByZW1vdmUgdG9vbHMKIAkJaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vcHJvamVjdHMvcG93ZXJwYy11dGlscy8KKworV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcGh5c19kZXZpY2UKK0RhdGU6CQlTZXB0ZW1iZXIgMjAwOAorQ29udGFjdDoJQmFkYXJpIFB1bGF2YXJ0eSA8cGJhZGFyaUB1cy5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBmaWxlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcGh5c19kZXZpY2UKKwkJaXMgcmVhZC1vbmx5IGFuZCBpcyBkZXNpZ25lZCB0byBzaG93IHRoZSBuYW1lIG9mIHBoeXNpY2FsCisJCW1lbW9yeSBkZXZpY2UuICBJbXBsZW1lbnRhdGlvbiBpcyBjdXJyZW50bHkgaW5jb21wbGV0ZS4KKworV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcGh5c19pbmRleAorRGF0ZToJCVNlcHRlbWJlciAyMDA4CitDb250YWN0OglCYWRhcmkgUHVsYXZhcnR5IDxwYmFkYXJpQHVzLmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIGZpbGUgL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WC9waHlzX2luZGV4CisJCWlzIHJlYWQtb25seSBhbmQgY29udGFpbnMgdGhlIHNlY3Rpb24gSUQgaW4gaGV4YWRlY2ltYWwKKwkJd2hpY2ggaXMgZXF1aXZhbGVudCB0byBkZWNpbWFsIFggY29udGFpbmVkIGluIHRoZQorCQltZW1vcnkgc2VjdGlvbiBkaXJlY3RvcnkgbmFtZS4KKworV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvc3RhdGUKK0RhdGU6CQlTZXB0ZW1iZXIgMjAwOAorQ29udGFjdDoJQmFkYXJpIFB1bGF2YXJ0eSA8cGJhZGFyaUB1cy5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBmaWxlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvc3RhdGUKKwkJaXMgcmVhZC13cml0ZS4gIFdoZW4gcmVhZCwgaXQncyBjb250ZW50cyBzaG93IHRoZQorCQlvbmxpbmUvb2ZmbGluZSBzdGF0ZSBvZiB0aGUgbWVtb3J5IHNlY3Rpb24uICBXaGVuIHdyaXR0ZW4sCisJCXJvb3QgY2FuIHRvZ2dsZSB0aGUgdGhlIG9ubGluZS9vZmZsaW5lIHN0YXRlIG9mIGEgcmVtb3ZhYmxlCisJCW1lbW9yeSBzZWN0aW9uIChzZWUgcmVtb3ZhYmxlIGZpbGUgZGVzY3JpcHRpb24gYWJvdmUpCisJCXVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMuCisJCSMgZWNobyBvbmxpbmUgPiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3N0YXRlCisJCSMgZWNobyBvZmZsaW5lID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WC9zdGF0ZQorCisJCUZvciBleGFtcGxlLCBpZiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnkyMi9yZW1vdmFibGUKKwkJY29udGFpbnMgYSB2YWx1ZSBvZiAxIGFuZAorCQkvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnkyMi9zdGF0ZSBjb250YWlucyB0aGUKKwkJc3RyaW5nICJvbmxpbmUiIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQgYnkKKwkJYnkgcm9vdCB0byBvZmZsaW5lIHRoYXQgc2VjdGlvbi4KKwkJIyBlY2hvIG9mZmxpbmUgPiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnkyMi9zdGF0ZQorVXNlcnM6CQlob3RwbHVnIG1lbW9yeSByZW1vdmUgdG9vbHMKKwkJaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vcHJvamVjdHMvcG93ZXJwYy11dGlscy8KKworV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlWC9tZW1vcnlZCitEYXRlOgkJU2VwdGVtYmVyIDIwMDgKK0NvbnRhY3Q6CUdhcnkgSGFkZSA8Z2FyeWhhZGVAdXMuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlXaGVuIENPTkZJR19OVU1BIGlzIGVuYWJsZWQKKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGVYL21lbW9yeVkgaXMgYSBzeW1ib2xpYyBsaW5rIHRoYXQKKwkJcG9pbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVkKKwkJbWVtb3J5IHNlY3Rpb24gZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc3ltYm9saWMKKwkJbGluayBpcyBjcmVhdGVkIGZvciBtZW1vcnkgc2VjdGlvbiA5IG9uIG5vZGUwLgorCQkvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZTAvbWVtb3J5OSAtPiAuLi8uLi9tZW1vcnkvbWVtb3J5OQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0CmluZGV4IGM3NGZlYzguLmIyYTRkNmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0CkBAIC0yNiw3ICsyNiw3IEBACiB0cmFuc2Zlci4KIAogVGhlIGZvbGxvd2luZyBBUEkgd2lsbCB3b3JrIG9mIGNvdXJzZSBldmVuIG9uIHBsYXRmb3JtcyB3aGVyZSBubyBzdWNoCi1oYXJkd2FyZSBleGlzdHMsIHNlZSBlLmcuIGluY2x1ZGUvYXNtLWkzODYvcGNpLmggZm9yIGhvdyBpdCBpcyBpbXBsZW1lbnRlZCBvbgoraGFyZHdhcmUgZXhpc3RzLCBzZWUgZS5nLiBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaCBmb3IgaG93IGl0IGlzIGltcGxlbWVudGVkIG9uCiB0b3Agb2YgdGhlIHZpcnRfdG9fYnVzIGludGVyZmFjZS4KIAogRmlyc3Qgb2YgYWxsLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Vpby1ob3d0by50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Vpby1ob3d0by50bXBsCmluZGV4IGRmODdkMWIuLmI3ODdlNDcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay91aW8taG93dG8udG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdWlvLWhvd3RvLnRtcGwKQEAgLTQyLDYgKzQyLDEyIEBACiAKIDxyZXZoaXN0b3J5PgogCTxyZXZpc2lvbj4KKwk8cmV2bnVtYmVyPjAuNjwvcmV2bnVtYmVyPgorCTxkYXRlPjIwMDgtMTItMDU8L2RhdGU+CisJPGF1dGhvcmluaXRpYWxzPmhqazwvYXV0aG9yaW5pdGlhbHM+CisJPHJldnJlbWFyaz5BZGRlZCBkZXNjcmlwdGlvbiBvZiBwb3J0aW8gc3lzZnMgYXR0cmlidXRlcy48L3JldnJlbWFyaz4KKwk8L3JldmlzaW9uPgorCTxyZXZpc2lvbj4KIAk8cmV2bnVtYmVyPjAuNTwvcmV2bnVtYmVyPgogCTxkYXRlPjIwMDgtMDUtMjI8L2RhdGU+CiAJPGF1dGhvcmluaXRpYWxzPmhqazwvYXV0aG9yaW5pdGlhbHM+CkBAIC0zMTgsNiArMzI0LDU0IEBACiBvZmZzZXQgPSBOICogZ2V0cGFnZXNpemUoKTsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKKzxwYXJhPgorCVNvbWV0aW1lcyB0aGVyZSBpcyBoYXJkd2FyZSB3aXRoIG1lbW9yeS1saWtlIHJlZ2lvbnMgdGhhdCBjYW4gbm90IGJlCisJbWFwcGVkIHdpdGggdGhlIHRlY2huaXF1ZSBkZXNjcmliZWQgaGVyZSwgYnV0IHRoZXJlIGFyZSBzdGlsbCB3YXlzIHRvCisJYWNjZXNzIHRoZW0gZnJvbSB1c2Vyc3BhY2UuIFRoZSBtb3N0IGNvbW1vbiBleGFtcGxlIGFyZSB4ODYgaW9wb3J0cy4KKwlPbiB4ODYgc3lzdGVtcywgdXNlcnNwYWNlIGNhbiBhY2Nlc3MgdGhlc2UgaW9wb3J0cyB1c2luZworCTxmdW5jdGlvbj5pb3Blcm0oKTwvZnVuY3Rpb24+LCA8ZnVuY3Rpb24+aW9wbCgpPC9mdW5jdGlvbj4sCisJPGZ1bmN0aW9uPmluYigpPC9mdW5jdGlvbj4sIDxmdW5jdGlvbj5vdXRiKCk8L2Z1bmN0aW9uPiwgYW5kIHNpbWlsYXIKKwlmdW5jdGlvbnMuCis8L3BhcmE+Cis8cGFyYT4KKwlTaW5jZSB0aGVzZSBpb3BvcnQgcmVnaW9ucyBjYW4gbm90IGJlIG1hcHBlZCwgdGhleSB3aWxsIG5vdCBhcHBlYXIgdW5kZXIKKwk8ZmlsZW5hbWU+L3N5cy9jbGFzcy91aW8vdWlvWC9tYXBzLzwvZmlsZW5hbWU+IGxpa2UgdGhlIG5vcm1hbCBtZW1vcnkKKwlkZXNjcmliZWQgYWJvdmUuIFdpdGhvdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBvcnQgcmVnaW9ucyBhIGhhcmR3YXJlCisJaGFzIHRvIG9mZmVyLCBpdCBiZWNvbWVzIGRpZmZpY3VsdCBmb3IgdGhlIHVzZXJzcGFjZSBwYXJ0IG9mIHRoZQorCWRyaXZlciB0byBmaW5kIG91dCB3aGljaCBwb3J0cyBiZWxvbmcgdG8gd2hpY2ggVUlPIGRldmljZS4KKzwvcGFyYT4KKzxwYXJhPgorCVRvIGFkZHJlc3MgdGhpcyBzaXR1YXRpb24sIHRoZSBuZXcgZGlyZWN0b3J5CisJPGZpbGVuYW1lPi9zeXMvY2xhc3MvdWlvL3Vpb1gvcG9ydGlvLzwvZmlsZW5hbWU+IHdhcyBhZGRlZC4gSXQgb25seQorCWV4aXN0cyBpZiB0aGUgZHJpdmVyIHdhbnRzIHRvIHBhc3MgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgcG9ydAorCXJlZ2lvbnMgdG8gdXNlcnNwYWNlLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBzdWJkaXJlY3RvcmllcyBuYW1lZAorCTxmaWxlbmFtZT5wb3J0MDwvZmlsZW5hbWU+LCA8ZmlsZW5hbWU+cG9ydDE8L2ZpbGVuYW1lPiwgYW5kIHNvIG9uLAorCXdpbGwgYXBwZWFyIHVuZGVybmVhdGgKKwk8ZmlsZW5hbWU+L3N5cy9jbGFzcy91aW8vdWlvWC9wb3J0aW8vPC9maWxlbmFtZT4uCis8L3BhcmE+Cis8cGFyYT4KKwlFYWNoIDxmaWxlbmFtZT5wb3J0WC88L2ZpbGVuYW1lPiBkaXJlY3RvcnkgY29udGFpbnMgdGhyZWUgcmVhZC1vbmx5CisJZmlsZXMgdGhhdCBzaG93IHN0YXJ0LCBzaXplLCBhbmQgdHlwZSBvZiB0aGUgcG9ydCByZWdpb246Cis8L3BhcmE+Cis8aXRlbWl6ZWRsaXN0PgorPGxpc3RpdGVtPgorCTxwYXJhPgorCTxmaWxlbmFtZT5zdGFydDwvZmlsZW5hbWU+OiBUaGUgZmlyc3QgcG9ydCBvZiB0aGlzIHJlZ2lvbi4KKwk8L3BhcmE+Cis8L2xpc3RpdGVtPgorPGxpc3RpdGVtPgorCTxwYXJhPgorCTxmaWxlbmFtZT5zaXplPC9maWxlbmFtZT46IFRoZSBudW1iZXIgb2YgcG9ydHMgaW4gdGhpcyByZWdpb24uCisJPC9wYXJhPgorPC9saXN0aXRlbT4KKzxsaXN0aXRlbT4KKwk8cGFyYT4KKwk8ZmlsZW5hbWU+cG9ydHR5cGU8L2ZpbGVuYW1lPjogQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBwb3J0LgorCTwvcGFyYT4KKzwvbGlzdGl0ZW0+Cis8L2l0ZW1pemVkbGlzdD4KKworCiA8L3NlY3QxPgogPC9jaGFwdGVyPgogCkBAIC0zMzksMTIgKzM5MywxMiBAQAogCiA8aXRlbWl6ZWRsaXN0PgogPGxpc3RpdGVtPjxwYXJhPgotPHZhcm5hbWU+Y2hhciAqbmFtZTwvdmFybmFtZT46IFJlcXVpcmVkLiBUaGUgbmFtZSBvZiB5b3VyIGRyaXZlciBhcworPHZhcm5hbWU+Y29uc3QgY2hhciAqbmFtZTwvdmFybmFtZT46IFJlcXVpcmVkLiBUaGUgbmFtZSBvZiB5b3VyIGRyaXZlciBhcwogaXQgd2lsbCBhcHBlYXIgaW4gc3lzZnMuIEkgcmVjb21tZW5kIHVzaW5nIHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlIGZvciB0aGlzLgogPC9wYXJhPjwvbGlzdGl0ZW0+CiAKIDxsaXN0aXRlbT48cGFyYT4KLTx2YXJuYW1lPmNoYXIgKnZlcnNpb248L3Zhcm5hbWU+OiBSZXF1aXJlZC4gVGhpcyBzdHJpbmcgYXBwZWFycyBpbgorPHZhcm5hbWU+Y29uc3QgY2hhciAqdmVyc2lvbjwvdmFybmFtZT46IFJlcXVpcmVkLiBUaGlzIHN0cmluZyBhcHBlYXJzIGluCiA8ZmlsZW5hbWU+L3N5cy9jbGFzcy91aW8vdWlvWC92ZXJzaW9uPC9maWxlbmFtZT4uCiA8L3BhcmE+PC9saXN0aXRlbT4KIApAQCAtMzU2LDYgKzQxMCwxMyBAQAogPC9wYXJhPjwvbGlzdGl0ZW0+CiAKIDxsaXN0aXRlbT48cGFyYT4KKzx2YXJuYW1lPnN0cnVjdCB1aW9fcG9ydCBwb3J0WyBNQVhfVUlPX1BPUlRTX1JFR0lPTlMgXTwvdmFybmFtZT46IFJlcXVpcmVkCitpZiB5b3Ugd2FudCB0byBwYXNzIGluZm9ybWF0aW9uIGFib3V0IGlvcG9ydHMgdG8gdXNlcnNwYWNlLiBGb3IgZWFjaCBwb3J0CityZWdpb24geW91IG5lZWQgdG8gZmlsbCBvbmUgb2YgdGhlIDx2YXJuYW1lPnVpb19wb3J0PC92YXJuYW1lPiBzdHJ1Y3R1cmVzLgorU2VlIHRoZSBkZXNjcmlwdGlvbiBiZWxvdyBmb3IgZGV0YWlscy4KKzwvcGFyYT48L2xpc3RpdGVtPgorCis8bGlzdGl0ZW0+PHBhcmE+CiA8dmFybmFtZT5sb25nIGlycTwvdmFybmFtZT46IFJlcXVpcmVkLiBJZiB5b3VyIGhhcmR3YXJlIGdlbmVyYXRlcyBhbgogaW50ZXJydXB0LCBpdCdzIHlvdXIgbW9kdWxlcyB0YXNrIHRvIGRldGVybWluZSB0aGUgaXJxIG51bWJlciBkdXJpbmcKIGluaXRpYWxpemF0aW9uLiBJZiB5b3UgZG9uJ3QgaGF2ZSBhIGhhcmR3YXJlIGdlbmVyYXRlZCBpbnRlcnJ1cHQgYnV0CkBAIC00NDgsNiArNTA5LDQyIEBACiA8dmFybmFtZT5zdHJ1Y3QgdWlvX21lbTwvdmFybmFtZT4hIEl0IGlzIHVzZWQgYnkgdGhlIFVJTyBmcmFtZXdvcmsKIHRvIHNldCB1cCBzeXNmcyBmaWxlcyBmb3IgdGhpcyBtYXBwaW5nLiBTaW1wbHkgbGVhdmUgaXQgYWxvbmUuCiA8L3BhcmE+CisKKzxwYXJhPgorU29tZXRpbWVzLCB5b3VyIGRldmljZSBjYW4gaGF2ZSBvbmUgb3IgbW9yZSBwb3J0IHJlZ2lvbnMgd2hpY2ggY2FuIG5vdCBiZQorbWFwcGVkIHRvIHVzZXJzcGFjZS4gQnV0IGlmIHRoZXJlIGFyZSBvdGhlciBwb3NzaWJpbGl0aWVzIGZvciB1c2Vyc3BhY2UgdG8KK2FjY2VzcyB0aGVzZSBwb3J0cywgaXQgbWFrZXMgc2Vuc2UgdG8gbWFrZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9ydHMKK2F2YWlsYWJsZSBpbiBzeXNmcy4gRm9yIGVhY2ggcmVnaW9uLCB5b3UgaGF2ZSB0byBzZXQgdXAgYQorPHZhcm5hbWU+c3RydWN0IHVpb19wb3J0PC92YXJuYW1lPiBpbiB0aGUgPHZhcm5hbWU+cG9ydFtdPC92YXJuYW1lPiBhcnJheS4KK0hlcmUncyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZHMgb2YgPHZhcm5hbWU+c3RydWN0IHVpb19wb3J0PC92YXJuYW1lPjoKKzwvcGFyYT4KKworPGl0ZW1pemVkbGlzdD4KKzxsaXN0aXRlbT48cGFyYT4KKzx2YXJuYW1lPmNoYXIgKnBvcnR0eXBlPC92YXJuYW1lPjogUmVxdWlyZWQuIFNldCB0aGlzIHRvIG9uZSBvZiB0aGUgcHJlZGVmaW5lZAorY29uc3RhbnRzLiBVc2UgPHZhcm5hbWU+VUlPX1BPUlRfWDg2PC92YXJuYW1lPiBmb3IgdGhlIGlvcG9ydHMgZm91bmQgaW4geDg2CithcmNoaXRlY3R1cmVzLgorPC9wYXJhPjwvbGlzdGl0ZW0+CisKKzxsaXN0aXRlbT48cGFyYT4KKzx2YXJuYW1lPnVuc2lnbmVkIGxvbmcgc3RhcnQ8L3Zhcm5hbWU+OiBSZXF1aXJlZCBpZiB0aGUgcG9ydCByZWdpb24gaXMgdXNlZC4KK0ZpbGwgaW4gdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgcG9ydCBvZiB0aGlzIHJlZ2lvbi4KKzwvcGFyYT48L2xpc3RpdGVtPgorCis8bGlzdGl0ZW0+PHBhcmE+Cis8dmFybmFtZT51bnNpZ25lZCBsb25nIHNpemU8L3Zhcm5hbWU+OiBGaWxsIGluIHRoZSBudW1iZXIgb2YgcG9ydHMgaW4gdGhpcworcmVnaW9uLiBJZiA8dmFybmFtZT5zaXplPC92YXJuYW1lPiBpcyB6ZXJvLCB0aGUgcmVnaW9uIGlzIGNvbnNpZGVyZWQgdW51c2VkLgorTm90ZSB0aGF0IHlvdSA8ZW1waGFzaXM+bXVzdDwvZW1waGFzaXM+IGluaXRpYWxpemUgPHZhcm5hbWU+c2l6ZTwvdmFybmFtZT4KK3dpdGggemVybyBmb3IgYWxsIHVudXNlZCByZWdpb25zLgorPC9wYXJhPjwvbGlzdGl0ZW0+Cis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+CitQbGVhc2UgZG8gbm90IHRvdWNoIHRoZSA8dmFybmFtZT5wb3J0aW88L3Zhcm5hbWU+IGVsZW1lbnQgb2YKKzx2YXJuYW1lPnN0cnVjdCB1aW9fcG9ydDwvdmFybmFtZT4hIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVUlPCitmcmFtZXdvcmsgdG8gc2V0IHVwIHN5c2ZzIGZpbGVzIGZvciB0aGlzIHJlZ2lvbi4gU2ltcGx5IGxlYXZlIGl0IGFsb25lLgorPC9wYXJhPgorCiA8L3NlY3QxPgogCiA8c2VjdDEgaWQ9ImFkZGluZ19pcnFfaGFuZGxlciI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKaW5kZXggY2NlYzU1My4uY2ZiZmExNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwpAQCAtMzk3LDcgKzM5Nyw3IEBACiB9OwogCiBsb2NraW5nIHJ1bGVzOgotCUFsbCBleGNlcHQgLT5wb2xsKCkgbWF5IGJsb2NrLgorCUFsbCBtYXkgYmxvY2suCiAJCQlCS0wKIGxsc2VlazoJCQlubwkoc2VlIGJlbG93KQogcmVhZDoJCQlubwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggNzFkZjM1My4uMzJlOTQ2MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC0xMzg1LDYgKzEzODUsMTUgQEAKIHRvIHJldGFpbiBkZW50cnkgYW5kIGlub2RlIGNhY2hlcy4gIEluY3JlYXNpbmcgdmZzX2NhY2hlX3ByZXNzdXJlIGJleW9uZCAxMDAKIGNhdXNlcyB0aGUga2VybmVsIHRvIHByZWZlciB0byByZWNsYWltIGRlbnRyaWVzIGFuZCBpbm9kZXMuCiAKK2RpcnR5X2JhY2tncm91bmRfYnl0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29udGFpbnMgdGhlIGFtb3VudCBvZiBkaXJ0eSBtZW1vcnkgYXQgd2hpY2ggdGhlIHBkZmx1c2ggYmFja2dyb3VuZCB3cml0ZWJhY2sKK2RhZW1vbiB3aWxsIHN0YXJ0IHdyaXRlYmFjay4KKworSWYgZGlydHlfYmFja2dyb3VuZF9ieXRlcyBpcyB3cml0dGVuLCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvIGJlY29tZXMgYSBmdW5jdGlvbgorb2YgaXRzIHZhbHVlIChkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzIC8gdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgc3lzdGVtIG1lbW9yeSkuCisKIGRpcnR5X2JhY2tncm91bmRfcmF0aW8KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTM5MywxNCArMTQwMiwyOSBAQAogcGFnZXMgYXQgd2hpY2ggdGhlIHBkZmx1c2ggYmFja2dyb3VuZCB3cml0ZWJhY2sgZGFlbW9uIHdpbGwgc3RhcnQgd3JpdGluZyBvdXQKIGRpcnR5IGRhdGEuCiAKK0lmIGRpcnR5X2JhY2tncm91bmRfcmF0aW8gaXMgd3JpdHRlbiwgZGlydHlfYmFja2dyb3VuZF9ieXRlcyBiZWNvbWVzIGEgZnVuY3Rpb24KK29mIGl0cyB2YWx1ZSAoZGlydHlfYmFja2dyb3VuZF9yYXRpbyAqIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkpLgorCitkaXJ0eV9ieXRlcworLS0tLS0tLS0tLS0KKworQ29udGFpbnMgdGhlIGFtb3VudCBvZiBkaXJ0eSBtZW1vcnkgYXQgd2hpY2ggYSBwcm9jZXNzIGdlbmVyYXRpbmcgZGlzayB3cml0ZXMKK3dpbGwgaXRzZWxmIHN0YXJ0IHdyaXRlYmFjay4KKworSWYgZGlydHlfYnl0ZXMgaXMgd3JpdHRlbiwgZGlydHlfcmF0aW8gYmVjb21lcyBhIGZ1bmN0aW9uIG9mIGl0cyB2YWx1ZQorKGRpcnR5X2J5dGVzIC8gdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgc3lzdGVtIG1lbW9yeSkuCisKIGRpcnR5X3JhdGlvCi0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0KIAogQ29udGFpbnMsIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkgKGZyZWUgcGFnZXMgKyBtYXBwZWQKIHBhZ2VzICsgZmlsZSBjYWNoZSwgbm90IGluY2x1ZGluZyBsb2NrZWQgcGFnZXMgYW5kIEh1Z2VQYWdlcyksIHRoZSBudW1iZXIgb2YKIHBhZ2VzIGF0IHdoaWNoIGEgcHJvY2VzcyB3aGljaCBpcyBnZW5lcmF0aW5nIGRpc2sgd3JpdGVzIHdpbGwgaXRzZWxmIHN0YXJ0CiB3cml0aW5nIG91dCBkaXJ0eSBkYXRhLgogCitJZiBkaXJ0eV9yYXRpbyBpcyB3cml0dGVuLCBkaXJ0eV9ieXRlcyBiZWNvbWVzIGEgZnVuY3Rpb24gb2YgaXRzIHZhbHVlCisoZGlydHlfcmF0aW8gKiB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5KS4KKwogZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKaW5kZXggNzVkMTNjYS4uOGNlNGFhMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDcwCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MApAQCAtMzEsMTUgKzMxLDExIEBACiBsaW1pdCB2YWx1ZXMuIFRoZSBBRFQ3NDcwIHdpbGwgc2lnbmFsIGFuIEFMQVJNIGlmIGFueSBtZWFzdXJlZCB2YWx1ZSBleGNlZWRzCiBlaXRoZXIgbGltaXQuCiAKLVRoZSBBRFQ3NDcwIERPRVMgTk9UIHNhbXBsZSBhbGwgaW5wdXRzIGNvbnRpbnVvdXNseS4gIEEgc2luZ2xlIHBpbiBvbiB0aGUKLUFEVDc0NzAgaXMgY29ubmVjdGVkIHRvIGEgbXVsdGl0dWRlIG9mIHRoZXJtYWwgZGlvZGVzLCBidXQgdGhlIGNoaXAgbXVzdCBiZQotaW5zdHJ1Y3RlZCBleHBsaWNpdGx5IHRvIHJlYWQgdGhlIG11bHRpdHVkZSBvZiBkaW9kZXMuICBJZiB5b3Ugd2FudCB0byB1c2UKLWF1dG9tYXRpYyBmYW4gY29udHJvbCBtb2RlLCB5b3UgbXVzdCBtYW51YWxseSByZWFkIGFueSBvZiB0aGUgdGVtcGVyYXR1cmUKLXNlbnNvcnMgb3IgdGhlIGZhbiBjb250cm9sIGFsZ29yaXRobSB3aWxsIG5vdCBydW4uICBUaGUgY2hpcCBXSUxMIE5PVCBETyBUSElTCi1BVVRPTUFUSUNBTExZOyB0aGlzIG11c3QgYmUgZG9uZSBmcm9tIHVzZXJzcGFjZS4gIFRoaXMgbWF5IGJlIGEgYnVnIGluIHRoZSBjaGlwCi1kZXNpZ24sIGdpdmVuIHRoYXQgbWFueSBvdGhlciBBRCBjaGlwcyB0YWtlIGNhcmUgb2YgdGhpcy4gIFRoZSBkcml2ZXIgd2lsbCBub3QKLXJlYWQgdGhlIHJlZ2lzdGVycyBtb3JlIG9mdGVuIHRoYW4gb25jZSBldmVyeSA1IHNlY29uZHMuICBGdXJ0aGVyLAotY29uZmlndXJhdGlvbiBkYXRhIGlzIG9ubHkgcmVhZCBvbmNlIHBlciBtaW51dGUuCitUaGUgQURUNzQ3MCBzYW1wbGVzIGFsbCBpbnB1dHMgY29udGludW91c2x5LiAgQSBrZXJuZWwgdGhyZWFkIGlzIHN0YXJ0ZWQgdXAgZm9yCit0aGUgcHVycG9zZSBvZiBwZXJpb2RpY2FsbHkgcXVlcnlpbmcgdGhlIHRlbXBlcmF0dXJlIHNlbnNvcnMsIHRodXMgYWxsb3dpbmcgdGhlCithdXRvbWF0aWMgZmFuIHB3bSBjb250cm9sIHRvIHNldCB0aGUgZmFuIHNwZWVkLiAgVGhlIGRyaXZlciB3aWxsIG5vdCByZWFkIHRoZQorcmVnaXN0ZXJzIG1vcmUgb2Z0ZW4gdGhhbiBvbmNlIGV2ZXJ5IDUgc2Vjb25kcy4gIEZ1cnRoZXIsIGNvbmZpZ3VyYXRpb24gZGF0YSBpcworb25seSByZWFkIG9uY2UgcGVyIG1pbnV0ZS4KIAogU3BlY2lhbCBGZWF0dXJlcwogLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzIsNSArNjgsNiBAQAogTm90ZXMKIC0tLS0tCiAKLUFzIHN0YXRlZCBhYm92ZSwgdGhlIHRlbXBlcmF0dXJlIGlucHV0cyBtdXN0IGJlIHJlYWQgcGVyaW9kaWNhbGx5IGZyb20KLXVzZXJzcGFjZSBpbiBvcmRlciBmb3IgdGhlIGF1dG9tYXRpYyBwd20gYWxnb3JpdGhtIHRvIHJ1bi4KK1RoZSB0ZW1wZXJhdHVyZSBpbnB1dHMgbm8gbG9uZ2VyIG5lZWQgdG8gYmUgcmVhZCBwZXJpb2RpY2FsbHkgZnJvbSB1c2Vyc3BhY2UgaW4KK29yZGVyIGZvciB0aGUgYXV0b21hdGljIHB3bSBhbGdvcml0aG0gdG8gcnVuLiAgVGhpcyB3YXMgdGhlIGNhc2UgZm9yIGVhcmxpZXIKK3ZlcnNpb25zIG9mIHRoZSBkcml2ZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lkZS93YXJtLXBsdWctaG93dG8udHh0IGIvRG9jdW1lbnRhdGlvbi9pZGUvd2FybS1wbHVnLWhvd3RvLnR4dAppbmRleCBkNTg4NTQ2Li45ODE1MmJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lkZS93YXJtLXBsdWctaG93dG8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vaWRlL3dhcm0tcGx1Zy1ob3d0by50eHQKQEAgLTExLDMgKzExLDggQEAKICMgZWNobyAtbiAiMSIgPiAvc3lzL2NsYXNzL2lkZV9wb3J0L2lkZXgvc2NhbgogCiBkb25lCisKK05PVEU6IHBsZWFzZSBtYWtlIHN1cmUgdGhhdCBwYXJ0aXRpb25zIGFyZSB1bm1vdW50ZWQgYW5kIHRoYXQgdGhlcmUgYXJlCitubyBvdGhlciBhY3RpdmUgcmVmZXJlbmNlcyB0byBkZXZpY2VzIGJlZm9yZSBkb2luZyAiZGVsZXRlX2RldmljZXMiIHN0ZXAsCithbHNvIGRvIG5vdCBhdHRlbXB0ICJzY2FuIiBzdGVwIG9uIGRldmljZXMgY3VycmVudGx5IGluIHVzZSAtLSBvdGhlcndpc2UKK3Jlc3VsdHMgbWF5IGJlIHVucHJlZGljdGFibGUgYW5kIGxlYWQgdG8gZGF0YSBsb3NzIGlmIHlvdSdyZSB1bmx1Y2t5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKaW5kZXggODI0Njk5MS4uZjFkNjM5OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dApAQCAtODQsNyArODQsNyBAQAogJ0InCUMwLUZGCQkJCWFkdmFuY2VkIGJidXMKIAkJCQkJPG1haWx0bzptYWFzc2VuQHVuaS1mcmVpYnVyZy5kZT4KICdDJwlhbGwJbGludXgvc291bmRjYXJkLmgKLSdEJwlhbGwJYXNtLXMzOTAvZGFzZC5oCisnRCcJYWxsCWFyY2gvczM5MC9pbmNsdWRlL2FzbS9kYXNkLmgKICdFJwlhbGwJbGludXgvaW5wdXQuaAogJ0YnCWFsbAlsaW51eC9mYi5oCiAnSCcJYWxsCWxpbnV4L2hpZGRldi5oCkBAIC0xMDUsNyArMTA1LDcgQEAKICdTJwk4MC04MQlzY3NpL3Njc2lfaW9jdGwuaAljb25mbGljdCEKICdTJwk4Mi1GRglzY3NpL3Njc2kuaAkJY29uZmxpY3QhCiAnVCcJYWxsCWxpbnV4L3NvdW5kY2FyZC5oCWNvbmZsaWN0IQotJ1QnCWFsbAlhc20taTM4Ni9pb2N0bHMuaAljb25mbGljdCEKKydUJwlhbGwJYXJjaC94ODYvaW5jbHVkZS9hc20vaW9jdGxzLmgJY29uZmxpY3QhCiAnVScJMDAtRUYJbGludXgvZHJpdmVycy91c2IvdXNiLmgKICdWJwlhbGwJbGludXgvdnQuaAogJ1cnCTAwLTFGCWxpbnV4L3dhdGNoZG9nLmgJY29uZmxpY3QhCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJCQkJPG1haWx0bzpuYXRhbGlhQG5pa2hlZmsubmlraGVmLm5sPgogJ2MnCTAwLTdGCWxpbnV4L2NvbXN0YXRzLmgJY29uZmxpY3QhCiAnYycJMDAtN0YJbGludXgvY29kYS5oCQljb25mbGljdCEKLSdjJwk4MC05Rglhc20tczM5MC9jaHNjLmgKKydjJwk4MC05RglhcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hzYy5oCiAnZCcJMDAtRkYJbGludXgvY2hhci9kcm0vZHJtL2gJY29uZmxpY3QhCiAnZCcJMDAtREYJbGludXgvdmlkZW9fZGVjb2Rlci5oCWNvbmZsaWN0IQogJ2QnCUYwLUZGCWxpbnV4L2RpZ2kxLmgKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQkJCQk8bWFpbHRvOm9lQHBvcnQuZGU+CiAweDgwCTAwLTFGCWxpbnV4L2ZiLmgKIDB4ODEJMDAtMUYJbGludXgvdmlkZW90ZXh0LmgKLTB4ODkJMDAtMDYJYXNtLWkzODYvc29ja2lvcy5oCisweDg5CTAwLTA2CWFyY2gveDg2L2luY2x1ZGUvYXNtL3NvY2tpb3MuaAogMHg4OQkwQi1ERglsaW51eC9zb2NraW9zLmgKIDB4ODkJRTAtRUYJbGludXgvc29ja2lvcy5oCQlTSU9DUFJPVE9QUklWQVRFIHJhbmdlCiAweDg5CUYwLUZGCWxpbnV4L3NvY2tpb3MuaAkJU0lPQ0RFVlBSSVZBVEUgcmFuZ2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAppbmRleCBjNjg0MWVlLi5kNzNmYmQyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0CkBAIC03MSw2ICs3MSwxMSBAQAogdGhpcyBvcGVuaW5nIHNob3J0IGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGxpbmUsIHdpdGggbm8gaW50ZXJ2ZW5pbmcKIGVtcHR5IGNvbW1lbnQgbGluZXMuCiAKK0lmIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGlzICIuLi4iICh2YXJhcmdzKSwgaXQgc2hvdWxkIGJlIGxpc3RlZCBpbgora2VybmVsLWRvYyBub3RhdGlvbiBhczoKKyAqIEAuLi46IGRlc2NyaXB0aW9uCisKKwogRXhhbXBsZSBrZXJuZWwtZG9jIGRhdGEgc3RydWN0dXJlIGNvbW1lbnQuCiAKIC8qKgpAQCAtMjgyLDYgKzI4NywzMiBAQAogfTsKIAogCitJbmNsdWRpbmcgZG9jdW1lbnRhdGlvbiBibG9ja3MgaW4gc291cmNlIGZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGZhY2lsaXRhdGUgaGF2aW5nIHNvdXJjZSBjb2RlIGFuZCBjb21tZW50cyBjbG9zZSB0b2dldGhlciwgeW91IGNhbgoraW5jbHVkZSBrZXJuZWwtZG9jIGRvY3VtZW50YXRpb24gYmxvY2tzIHRoYXQgYXJlIGZyZWUtZm9ybSBjb21tZW50cworaW5zdGVhZCBvZiBiZWluZyBrZXJuZWwtZG9jIGZvciBmdW5jdGlvbnMsIHN0cnVjdHVyZXMsIHVuaW9ucywKK2VudW1zLCBvciB0eXBlZGVmcy4gIFRoaXMgY291bGQgYmUgdXNlZCBmb3Igc29tZXRoaW5nIGxpa2UgYQordGhlb3J5IG9mIG9wZXJhdGlvbiBmb3IgYSBkcml2ZXIgb3IgbGlicmFyeSBjb2RlLCBmb3IgZXhhbXBsZS4KKworVGhpcyBpcyBkb25lIGJ5IHVzaW5nIGEgRE9DOiBzZWN0aW9uIGtleXdvcmQgd2l0aCBhIHNlY3Rpb24gdGl0bGUuICBFLmcuOgorCisvKioKKyAqIERPQzogVGhlb3J5IG9mIE9wZXJhdGlvbgorICoKKyAqIFRoZSB3aGl6YmFuZyBmb29iYXIgaXMgYSBkaWxseSBvZiBhIGdpem1vLiAgSXQgY2FuIGRvIHdoYXRldmVyIHlvdQorICogd2FudCBpdCB0byBkbywgYXQgYW55IHRpbWUuICBJdCByZWFkcyB5b3VyIG1pbmQuICBIZXJlJ3MgaG93IGl0IHdvcmtzLgorICoKKyAqIGZvbyBiYXIgc3BsYXQKKyAqCisgKiBUaGUgb25seSBkcmF3YmFjayB0byB0aGlzIGdpem1vIGlzIHRoYXQgaXMgY2FuIHNvbWV0aW1lcyBkYW1hZ2UKKyAqIGhhcmR3YXJlLCBzb2Z0d2FyZSwgb3IgaXRzIHN1YmplY3QocykuCisgKi8KKworRE9DOiBzZWN0aW9ucyBhcmUgdXNlZCBpbiBTR01MIHRlbXBsYXRlcyBmaWxlcyBhcyBpbmRpY2F0ZWQgYmVsb3cuCisKKwogSG93IHRvIG1ha2UgbmV3IFNHTUwgdGVtcGxhdGUgZmlsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTMwMiw2ICszMzMsOSBAQAogIUY8ZmlsZW5hbWU+IDxmdW5jdGlvbiBbZnVuY3Rpb25zLi4uXT4gaXMgcmVwbGFjZWQgYnkgdGhlCiBkb2N1bWVudGF0aW9uLCBpbiA8ZmlsZW5hbWU+LCBmb3IgdGhlIGZ1bmN0aW9ucyBsaXN0ZWQuCiAKKyFQPGZpbGVuYW1lPiA8c2VjdGlvbiB0aXRsZT4gaXMgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBET0M6CitzZWN0aW9uIHRpdGxlZCA8c2VjdGlvbiB0aXRsZT4gZnJvbSA8ZmlsZW5hbWU+LgorU3BhY2VzIGFyZSBhbGxvd2VkIGluIDxzZWN0aW9uIHRpdGxlPjsgZG8gbm90IHF1b3RlIHRoZSA8c2VjdGlvbiB0aXRsZT4uCiAKIFRpbS4KICovIDx0d2F1Z2hAcmVkaGF0LmNvbT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggYTJkODgwNS4uMGIzZjY3MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTQ2OSw4ICs0NjksOCBAQAogCiAJY2xlYXJjcHVpZD1CSVROVU0gW1g4Nl0KIAkJCURpc2FibGUgQ1BVSUQgZmVhdHVyZSBYIGZvciB0aGUga2VybmVsLiBTZWUKLQkJCWluY2x1ZGUvYXNtLXg4Ni9jcHVmZWF0dXJlLmggZm9yIHRoZSB2YWxpZCBiaXQgbnVtYmVycy4KLQkJCU5vdGUgdGhlIExpbnV4IHNwZWNpZmljIGJpdHMgYXJlIG5vdCBuZWNlc3NhcmlseQorCQkJYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGZvciB0aGUgdmFsaWQgYml0CisJCQludW1iZXJzLiBOb3RlIHRoZSBMaW51eCBzcGVjaWZpYyBiaXRzIGFyZSBub3QgbmVjZXNzYXJpbHkKIAkJCXN0YWJsZSBvdmVyIGtlcm5lbCBvcHRpb25zLCBidXQgdGhlIHZlbmRvciBzcGVjaWZpYwogCQkJb25lcyBzaG91bGQgYmUuCiAJCQlBbHNvIG5vdGUgdGhhdCB1c2VyIHByb2dyYW1zIGNhbGxpbmcgQ1BVSUQgZGlyZWN0bHkKQEAgLTU1MSw2ICs1NTEsMTEgQEAKIAkJCW5vdCB3b3JrIHJlbGlhYmx5IHdpdGggYWxsIGNvbnNvbGVzLCBidXQgaXMga25vd24KIAkJCXRvIHdvcmsgd2l0aCBzZXJpYWwgYW5kIFZHQSBjb25zb2xlcy4KIAorCWNvcmVkdW1wX2ZpbHRlcj0KKwkJCVtLTkxdIENoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IKKwkJCS9wcm9jLzxwaWQ+L2NvcmVkdW1wX2ZpbHRlci4KKwkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQuCisKIAljcGNpaHBfZ2VuZXJpYz0JW0hXLFBDSV0gR2VuZXJpYyBwb3J0IEkvTyBDb21wYWN0UENJIGRyaXZlcgogCQkJRm9ybWF0OgogCQkJPGZpcnN0X3Nsb3Q+LDxsYXN0X3Nsb3Q+LDxwb3J0Piw8ZW51bV9iaXQ+Wyw8ZGVidWc+XQpAQCAtMTExNyw2ICsxMTIyLDggQEAKIAkJCUlmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXRjaGluZyBjb25maWd1cmF0aW9ucyBjaGFuZ2luZwogCQkJdGhlIHNhbWUgYXR0cmlidXRlLCB0aGUgbGFzdCBvbmUgaXMgdXNlZC4KIAorCWxtYj1kZWJ1ZwlbS05MXSBFbmFibGUgbG1iIGRlYnVnIG1lc3NhZ2VzLgorCiAJbG9hZF9yYW1kaXNrPQlbUkFNXSBMaXN0IG9mIHJhbWRpc2tzIHRvIGxvYWQgZnJvbSBmbG9wcHkKIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3JhbWRpc2sudHh0LgogCkBAIC0xNTY5LDYgKzE1NzYsMTAgQEAKIAogCW5yX3VhcnRzPQlbU0VSSUFMXSBtYXhpbXVtIG51bWJlciBvZiBVQVJUcyB0byBiZSByZWdpc3RlcmVkLgogCisJb2hjaTEzOTRfZG1hPWVhcmx5CVtIV10gZW5hYmxlIGRlYnVnZ2luZyB2aWEgdGhlIG9oY2kxMzk0IGRyaXZlci4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL2RlYnVnZ2luZy12aWEtb2hjaTEzOTQudHh0IGZvciBtb3JlCisJCQlpbmZvLgorCiAJb2xwY19lY190aW1lb3V0PSBbT0xQQ10gbXMgZGVsYXkgd2hlbiBpc3N1aW5nIEVDIGNvbW1hbmRzCiAJCQlSYXRoZXIgdGhhbiB0aW1pbmcgb3V0IGFmdGVyIDIwIG1zIGlmIGFuIEVDCiAJCQljb21tYW5kIGlzIG5vdCBwcm9wZXJseSBBQ0tlZCwgb3ZlcnJpZGUgdGhlIGxlbmd0aApAQCAtMTc5MywxMCArMTgwNCwxMCBAQAogCQkJYXV0b2NvbmZpZ3VyYXRpb24uCiAJCQlSYW5nZXMgYXJlIGluIHBhaXJzIChtZW1vcnkgYmFzZSBhbmQgc2l6ZSkuCiAKLQlkeW5hbWljX3ByaW50awotCQkJRW5hYmxlcyBwcl9kZWJ1ZygpL2Rldl9kYmcoKSBjYWxscyBpZgotCQkJQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGhhcyBiZWVuIGVuYWJsZWQuIFRoZXNlIGNhbiBhbHNvCi0JCQliZSBzd2l0Y2hlZCBvbi9vZmYgdmlhIDxkZWJ1Z2ZzPi9keW5hbWljX3ByaW50ay9tb2R1bGVzCisJZHluYW1pY19wcmludGsJRW5hYmxlcyBwcl9kZWJ1ZygpL2Rldl9kYmcoKSBjYWxscyBpZgorCQkJQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGhhcyBiZWVuIGVuYWJsZWQuCisJCQlUaGVzZSBjYW4gYWxzbyBiZSBzd2l0Y2hlZCBvbi9vZmYgdmlhCisJCQk8ZGVidWdmcz4vZHluYW1pY19wcmludGsvbW9kdWxlcwogCiAJcHJpbnQtZmF0YWwtc2lnbmFscz0KIAkJCVtLTkxdIGRlYnVnOiBwcmludCBmYXRhbCBzaWduYWxzCkBAIC0xODg0LDcgKzE4OTUsNyBAQAogCiAJcmVib290PQkJW0JVR1M9WDg2LTMyLEJVR1M9QVJNLEJVR1M9SUEtNjRdIFJlYm9vdGluZyBtb2RlCiAJCQlGb3JtYXQ6IDxyZWJvb3RfbW9kZT5bLDxyZWJvb3RfbW9kZTI+WywuLi5dXQotCQkJU2VlIGFyY2gvKi9rZXJuZWwvcmVib290LmMgb3IgYXJjaC8qL2tlcm5lbC9wcm9jZXNzLmMJCQkKKwkJCVNlZSBhcmNoLyova2VybmVsL3JlYm9vdC5jIG9yIGFyY2gvKi9rZXJuZWwvcHJvY2Vzcy5jCiAKIAlyZWxheF9kb21haW5fbGV2ZWw9CiAJCQlbS05MLCBTTVBdIFNldCBzY2hlZHVsZXIncyBkZWZhdWx0IHJlbGF4X2RvbWFpbl9sZXZlbC4KQEAgLTI0MzIsOCArMjQ0Myw4IEBACiAJCQlGb3JtYXQ6CiAJCQk8aXJxPiw8aXJxX21hc2s+LDxpbz4sPGZ1bGxfZHVwbGV4Piw8ZG9fc291bmQ+LDxsb2NrdXBfaGFjaz5bLDxpcnEyPlssPGlycTM+Wyw8aXJxND5dXV0KIAotCW5vcmFuZG1hcHMJRG9uJ3QgdXNlIGFkZHJlc3Mgc3BhY2UgcmFuZG9taXphdGlvbgotCQkJRXF1aXZhbGVudCB0byBlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL3JhbmRvbWl6ZV92YV9zcGFjZQorCW5vcmFuZG1hcHMJRG9uJ3QgdXNlIGFkZHJlc3Mgc3BhY2UgcmFuZG9taXphdGlvbi4gIEVxdWl2YWxlbnQgdG8KKwkJCWVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvcmFuZG9taXplX3ZhX3NwYWNlCiAKIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dCBiL0RvY3VtZW50YXRpb24va29iamVjdC50eHQKaW5kZXggZjVkMmFhZC4uYjJlMzc0NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tvYmplY3QudHh0CkBAIC0xMTgsOCArMTE4LDggQEAKIAogICAgIGludCBrb2JqZWN0X3JlbmFtZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3QgY2hhciAqbmV3X25hbWUpOwogCi1Ob3RlIGtvYmplY3RfcmVuYW1lIGRvZXMgcGVyZm9ybSBhbnkgbG9ja2luZyBvciBoYXZlIGEgc29saWQgbm90aW9uIG9mCi13aGF0IG5hbWVzIGFyZSB2YWxpZCBzbyB0aGUgcHJvdmlkZSBtdXN0IHByb3ZpZGUgdGhlaXIgb3duIHNhbml0eSBjaGVja2luZwora29iamVjdF9yZW5hbWUgZG9lcyBub3QgcGVyZm9ybSBhbnkgbG9ja2luZyBvciBoYXZlIGEgc29saWQgbm90aW9uIG9mCit3aGF0IG5hbWVzIGFyZSB2YWxpZCBzbyB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSB0aGVpciBvd24gc2FuaXR5IGNoZWNraW5nCiBhbmQgc2VyaWFsaXphdGlvbi4KIAogVGhlcmUgaXMgYSBmdW5jdGlvbiBjYWxsZWQga29iamVjdF9zZXRfbmFtZSgpIGJ1dCB0aGF0IGlzIGxlZ2FjeSBjcnVmdCBhbmQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CmluZGV4IGE3OTYzM2QuLjQ4YjNkZTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dApAQCAtNDk3LDcgKzQ5NywxMCBAQAogVGhlIHNlY29uZCBjb2x1bW4gaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBwcm9iZSAoayAtIGtwcm9iZSwgciAtIGtyZXRwcm9iZQogYW5kIGogLSBqcHJvYmUpLCB3aGlsZSB0aGUgdGhpcmQgY29sdW1uIHNwZWNpZmllcyB0aGUgc3ltYm9sK29mZnNldCBvZgogdGhlIHByb2JlLiBJZiB0aGUgcHJvYmVkIGZ1bmN0aW9uIGJlbG9uZ3MgdG8gYSBtb2R1bGUsIHRoZSBtb2R1bGUgbmFtZQotaXMgYWxzbyBzcGVjaWZpZWQuCitpcyBhbHNvIHNwZWNpZmllZC4gRm9sbG93aW5nIGNvbHVtbnMgc2hvdyBwcm9iZSBzdGF0dXMuIElmIHRoZSBwcm9iZSBpcyBvbgorYSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCBpcyBubyBsb25nZXIgdmFsaWQgKG1vZHVsZSBpbml0IHNlY3Rpb25zLCBtb2R1bGUKK3ZpcnR1YWwgYWRkcmVzc2VzIHRoYXQgY29ycmVzcG9uZCB0byBtb2R1bGVzIHRoYXQndmUgYmVlbiB1bmxvYWRlZCksCitzdWNoIHByb2JlcyBhcmUgbWFya2VkIHdpdGggW0dPTkVdLgogCiAvZGVidWcva3Byb2Jlcy9lbmFibGVkOiBUdXJuIGtwcm9iZXMgT04vT0ZGCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dCBiL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dAppbmRleCA5NTA3MDAyLi41MDVmMTk2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21hZ2ljLW51bWJlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tYWdpYy1udW1iZXIudHh0CkBAIC0xMjUsMTQgKzEyNSwxNCBAQAogUk9VVEVSX01BR0lDICAgICAgICAgIDB4NTI0ZDQxNTcgIHdhbl9kZXZpY2UgICAgICAgIGluY2x1ZGUvbGludXgvd2Fucm91dGVyLmgKIFNDQ19NQUdJQyAgICAgICAgICAgICAweDUyNjk2MzY4ICBnc19wb3J0ICAgICAgICAgICBkcml2ZXJzL2NoYXIvc2NjLmgKIFNBVkVLTVNHX01BR0lDMSAgICAgICAweDUzNDE1NjQ1ICBzYXZla21zZyAgICAgICAgICBhcmNoLyovYW1pZ2EvY29uZmlnLmMKLUdEQV9NQUdJQyAgICAgICAgICAgICAweDU4NDY0NTUyICBnZGEgICAgICAgICAgICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24vZ2RhLmgKK0dEQV9NQUdJQyAgICAgICAgICAgICAweDU4NDY0NTUyICBnZGEgICAgICAgICAgICAgICBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vZ2RhLmgKIFJFRF9NQUdJQzEgICAgICAgICAgICAweDVhMmNmMDcxICAoYW55KSAgICAgICAgICAgICBtbS9zbGFiLmMKIFNUTF9QT1JUTUFHSUMgICAgICAgICAweDVhNzE4MmM5ICBzdGxwb3J0ICAgICAgICAgICBpbmNsdWRlL2xpbnV4L3N0YWxsaW9uLmgKIEVFUFJPTV9NQUdJQ19WQUxVRSAgICAweDVhYjQ3OGQyICBsYW5haV9kZXYgICAgICAgICBkcml2ZXJzL2F0bS9sYW5haS5jCiBIRExDRFJWX01BR0lDICAgICAgICAgMHg1YWM2ZTc3OCAgaGRsY2Rydl9zdGF0ZSAgICAgaW5jbHVkZS9saW51eC9oZGxjZHJ2LmgKIEVQQ0FfTUFHSUMgICAgICAgICAgICAweDVjNmRmMTA0ICBjaGFubmVsICAgICAgICAgICBpbmNsdWRlL2xpbnV4L2VwY2EuaAogUENYWF9NQUdJQyAgICAgICAgICAgIDB4NWM2ZGYxMDQgIGNoYW5uZWwgICAgICAgICAgIGRyaXZlcnMvY2hhci9wY3h4LmgKLUtWX01BR0lDICAgICAgICAgICAgICAweDVmNGI1NjVmICBrZXJuZWxfdmFyc19zICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24va2xrZXJudmFycy5oCitLVl9NQUdJQyAgICAgICAgICAgICAgMHg1ZjRiNTY1ZiAga2VybmVsX3ZhcnNfcyAgICAgYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2tsa2VybnZhcnMuaAogSTgxMF9TVEFURV9NQUdJQyAgICAgIDB4NjM2NTczNzMgIGk4MTBfc3RhdGUgICAgICAgIHNvdW5kL29zcy9pODEwX2F1ZGlvLmMKIFRSSURFTlRfU1RBVEVfTUFHSUMgICAweDYzNjU3MzczICB0cmllbnRfc3RhdGUgICAgICBzb3VuZC9vc3MvdHJpZGVudC5jCiBNM19DQVJEX01BR0lDICAgICAgICAgMHg2NDZlNmY1MCAgbTNfY2FyZCAgICAgICAgICAgc291bmQvb3NzL21hZXN0cm8zLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogUVVFVUVfTUFHSUNfRlJFRSAgICAgIDB4ZjdlMWM5YTMgIHF1ZXVlX2VudHJ5ICAgICAgIGRyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwogUVVFVUVfTUFHSUNfVVNFRCAgICAgIDB4ZjdlMWNjMzMgIHF1ZXVlX2VudHJ5ICAgICAgIGRyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwogSFRCX0NNQUdJQyAgICAgICAgICAgIDB4RkVGQUZFRjEgIGh0Yl9jbGFzcyAgICAgICAgIG5ldC9zY2hlZC9zY2hfaHRiLmMKLU5NSV9NQUdJQyAgICAgICAgICAgICAweDQ4NDE0ZDRkNDU1MjAxIG5taV9zICAgICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24vbm1pLmgKK05NSV9NQUdJQyAgICAgICAgICAgICAweDQ4NDE0ZDRkNDU1MjAxIG5taV9zICAgICAgICBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vbm1pLmgKIAogTm90ZSB0aGF0IHRoZXJlIGFyZSBhbHNvIGRlZmluZWQgc3BlY2lhbCBwZXItZHJpdmVyIG1hZ2ljIG51bWJlcnMgaW4gc291bmQKIG1lbW9yeSBtYW5hZ2VtZW50LiBTZWUgaW5jbHVkZS9zb3VuZC9zbmRtYWdpYy5oIGZvciBjb21wbGV0ZSBsaXN0IG9mIHRoZW0uIE1hbnkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWhvdHBsdWcudHh0IGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKaW5kZXggMTY4MTE3Yi4uNGMyZWNmNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgIFRoaXMgb3B0aW9uIGNhbiBiZSBrZXJuZWwgbW9kdWxlIHRvby4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTMgc3lzZnMgZmlsZXMgZm9yIG1lbW9yeSBob3RwbHVnCis0IHN5c2ZzIGZpbGVzIGZvciBtZW1vcnkgaG90cGx1ZwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEFsbCBzZWN0aW9ucyBoYXZlIHRoZWlyIGRldmljZSBpbmZvcm1hdGlvbiB1bmRlciAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeSBhcwogCkBAIC0xMzgsMTEgKzEzOCwxMiBAQAogKDB4MTAwMDAwMDAwIC8gMUdpYiA9IDQpCiBUaGlzIGRldmljZSBjb3ZlcnMgYWRkcmVzcyByYW5nZSBbMHgxMDAwMDAwMDAgLi4uIDB4MTQwMDAwMDAwKQogCi1VbmRlciBlYWNoIHNlY3Rpb24sIHlvdSBjYW4gc2VlIDMgZmlsZXMuCitVbmRlciBlYWNoIHNlY3Rpb24sIHlvdSBjYW4gc2VlIDQgZmlsZXMuCiAKIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWC9waHlzX2luZGV4CiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYWFgvcGh5c19kZXZpY2UKIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWC9zdGF0ZQorL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WFhYL3JlbW92YWJsZQogCiAncGh5c19pbmRleCcgOiByZWFkLW9ubHkgYW5kIGNvbnRhaW5zIHNlY3Rpb24gaWQsIHNhbWUgYXMgWFhYLgogJ3N0YXRlJyAgICAgIDogcmVhZC13cml0ZQpAQCAtMTUwLDEwICsxNTEsMjAgQEAKICAgICAgICAgICAgICAgIGF0IHdyaXRlOiB1c2VyIGNhbiBzcGVjaWZ5ICJvbmxpbmUiLCAib2ZmbGluZSIgY29tbWFuZAogJ3BoeXNfZGV2aWNlJzogcmVhZC1vbmx5OiBkZXNpZ25lZCB0byBzaG93IHRoZSBuYW1lIG9mIHBoeXNpY2FsIG1lbW9yeSBkZXZpY2UuCiAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdCB3ZWxsIGltcGxlbWVudGVkIG5vdy4KKydyZW1vdmFibGUnICA6IHJlYWQtb25seTogY29udGFpbnMgYW4gaW50ZWdlciB2YWx1ZSBpbmRpY2F0aW5nCisgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtZW1vcnkgc2VjdGlvbiBpcyByZW1vdmFibGUgb3Igbm90CisgICAgICAgICAgICAgICByZW1vdmFibGUuICBBIHZhbHVlIG9mIDEgaW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeQorICAgICAgICAgICAgICAgc2VjdGlvbiBpcyByZW1vdmFibGUgYW5kIGEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdAorICAgICAgICAgICAgICAgaXQgaXMgbm90IHJlbW92YWJsZS4KIAogTk9URToKICAgVGhlc2UgZGlyZWN0b3JpZXMvZmlsZXMgYXBwZWFyIGFmdGVyIHBoeXNpY2FsIG1lbW9yeSBob3RwbHVnIHBoYXNlLgogCitJZiBDT05GSUdfTlVNQSBpcyBlbmFibGVkIHRoZQorL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WFhYIG1lbW9yeSBzZWN0aW9uCitkaXJlY3RvcmllcyBjYW4gYWxzbyBiZSBhY2Nlc3NlZCB2aWEgc3ltYm9saWMgbGlua3MgbG9jYXRlZCBpbgordGhlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlKiBkaXJlY3Rvcmllcy4gIEZvciBleGFtcGxlOgorL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGUwL21lbW9yeTkgLT4gLi4vLi4vbWVtb3J5L21lbW9yeTkKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDQuIFBoeXNpY2FsIG1lbW9yeSBob3QtYWRkIHBoYXNlCkBAIC0zNjUsNyArMzc2LDYgQEAKICAgLSBhbGxvd2luZyBtZW1vcnkgaG90LWFkZCB0byBaT05FX01PVkFCTEUuIG1heWJlIHdlIG5lZWQgc29tZSBzd2l0Y2ggbGlrZQogICAgIHN5c2N0bCBvciBuZXcgY29udHJvbCBmaWxlLgogICAtIHNob3dpbmcgbWVtb3J5IHNlY3Rpb24gYW5kIHBoeXNpY2FsIGRldmljZSByZWxhdGlvbnNoaXAuCi0gIC0gc2hvd2luZyBtZW1vcnkgc2VjdGlvbiBhbmQgbm9kZSByZWxhdGlvbnNoaXAgKG1heWJlIGdvb2QgZm9yIE5VTUEpCiAgIC0gc2hvd2luZyBtZW1vcnkgc2VjdGlvbiBpcyB1bmRlciBaT05FX01PVkFCTEUgb3Igbm90CiAgIC0gdGVzdCBhbmQgbWFrZSBpdCBiZXR0ZXIgbWVtb3J5IG9mZmxpbmluZy4KICAgLSBzdXBwb3J0IEh1Z2VUTEIgcGFnZSBtaWdyYXRpb24gYW5kIG9mZmxpbmluZy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWlwcy9BVTF4eHhfSURFLlJFQURNRSBiL0RvY3VtZW50YXRpb24vbWlwcy9BVTF4eHhfSURFLlJFQURNRQppbmRleCAyNWE2ZWQxLi5mNTQ5NjJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21pcHMvQVUxeHh4X0lERS5SRUFETUUKKysrIGIvRG9jdW1lbnRhdGlvbi9taXBzL0FVMXh4eF9JREUuUkVBRE1FCkBAIC00NCw3ICs0NCw3IEBACiAKIFR3byBmaWxlcyBhcmUgaW50cm9kdWNlZDoKIAotICBhKSAnaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgnCisgIGEpICdhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oJwogICAgICBjb250YWluZXMgOiBzdHJ1Y3QgX2F1aWRlX2h3aWYKICAgICAgICAgICAgICAgICAgdGltaW5nIHBhcmFtZXRlcnMgZm9yIFBJTyBtb2RlIDAvMS8yLzMvNAogICAgICAgICAgICAgICAgICB0aW1pbmcgcGFyYW1ldGVycyBmb3IgTVdETUEgMC8xLzIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9jcHVfZmVhdHVyZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKaW5kZXggNDcyNzM5OC4uZmZhNDE4MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKQEAgLTMxLDcgKzMxLDcgQEAKIAogQWZ0ZXIgZGV0ZWN0aW5nIHRoZSBwcm9jZXNzb3IgdHlwZSwgdGhlIGtlcm5lbCBwYXRjaGVzIG91dCBzZWN0aW9ucyBvZiBjb2RlCiB0aGF0IHNob3VsZG4ndCBiZSB1c2VkIGJ5IHdyaXRpbmcgbm9wJ3Mgb3ZlciBpdC4gVXNpbmcgY3B1ZmVhdHVyZXMgcmVxdWlyZXMKLWp1c3QgMiBtYWNyb3MgKGZvdW5kIGluIGluY2x1ZGUvYXNtLXBwYy9jcHV0YWJsZS5oKSwgYXMgc2VlbiBpbiBoZWFkLlMKK2p1c3QgMiBtYWNyb3MgKGZvdW5kIGluIGFyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oKSwgYXMgc2VlbiBpbiBoZWFkLlMKIHRyYW5zZmVyX3RvX2hhbmRsZXI6CiAKIAkjaWZkZWYgQ09ORklHX0FMVElWRUMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKaW5kZXggZDMwYTI4MS4uMTA3MTFkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKQEAgLTE0MDIsNyArMTQwMiw3IEBACiBwb3NzaWJpbGl0aWVzIG9mIHRoZXNlIGFzIHRoZSBpbnN0cnVjdGlvbiBpcyBtYWRlIHVwIG9mIGEgIDB4QSBvcGNvZGUgJiB0aGUgc2Vjb25kIGJ5dGUgYmVpbmcKIHRoZSBzeXNjYWxsIG51bWJlci4gVGhleSBhcmUgdHJhY2VkIHVzaW5nIHRoZSBzaW1wbGUgY29tbWFuZC4KIFRSIFNWQyAgPE9wdGlvbmFsIHZhbHVlIG9yIHJhbmdlPgotdGhlIHN5c2NhbGxzIGFyZSBkZWZpbmVkIGluIGxpbnV4L2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmgKK3RoZSBzeXNjYWxscyBhcmUgZGVmaW5lZCBpbiBsaW51eC9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdW5pc3RkLmgKIGUuZy4gdG8gdHJhY2UgYWxsIGZpbGUgb3BlbnMganVzdCBkbwogVFIgU1ZDIDUgKCBhcyB0aGlzIGlzIHRoZSBzeXNjYWxsIG51bWJlciBvZiBvcGVuICkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dAppbmRleCBjNGI3YjJiLi40ODBhNzhlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dApAQCAtOTgsNyArOTgsNyBAQAogb2YgdGhlbSBjYW4gYmUgZm91bmQgb24gb3RoZXIgTGludXggcGxhdGZvcm1zIGltcGxlbWVudGF0aW9ucyB0b28uCiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9uIHByb3RvdHlwZXMsIGRhdGEgZGVjbGFyYXRpb25zLCBhbmQgbWFjcm8gZGVmaW5pdGlvbnMKIGNhbiBiZSBmb3VuZCBpbiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIEMgaGVhZGVyIGZpbGUKLWxpbnV4L2luY2x1ZGUvYXNtLXMzOTAvaXJxLmguCitsaW51eC9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXJxLmguCiAKIE92ZXJ2aWV3IG9mIENEUyBpbnRlcmZhY2UgY29uY2VwdHMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CmluZGV4IGUwNTQyMDkuLjJkMTAwNTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKQEAgLTIsNyArMiw3IEBACiA9PT09PT09PT09PT09PT09PT0KIAogZmlsZXM6IGFyY2gvczM5MC9rZXJuZWwvZGVidWcuYwotICAgICAgIGluY2x1ZGUvYXNtLXMzOTAvZGVidWcuaAorICAgICAgIGFyY2gvczM5MC9pbmNsdWRlL2FzbS9kZWJ1Zy5oCiAKIERlc2NyaXB0aW9uOgogLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKaW5kZXggZDc5ZWVkYS4uY2QwNTk5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dApAQCAtNDEsNyArNDEsOCBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1kaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9yYXRpbywgZGlydHlfZXhwaXJlX2NlbnRpc2VjcywKK2RpcnR5X2J5dGVzLCBkaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9ieXRlcywKK2RpcnR5X2JhY2tncm91bmRfcmF0aW8sIGRpcnR5X2V4cGlyZV9jZW50aXNlY3MsCiBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzLCBoaWdobWVtX2lzX2RpcnR5YWJsZSwKIHZmc19jYWNoZV9wcmVzc3VyZSwgbGFwdG9wX21vZGUsIGJsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dCwKIGRyb3AtY2FjaGVzLCBodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vdW5ldmljdGFibGUtbHJ1LnR4dCBiL0RvY3VtZW50YXRpb24vdm0vdW5ldmljdGFibGUtbHJ1LnR4dAppbmRleCAxMjVlZWQ1Li4wNzA2YTcyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL3VuZXZpY3RhYmxlLWxydS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS91bmV2aWN0YWJsZS1scnUudHh0CkBAIC0xMzcsMTMgKzEzNyw2IEBACiBtYXAgaW4gdHJ5X3RvX3VubWFwKCkuICBJZiB0cnlfdG9fdW5tYXAoKSByZXR1cm5zIFNXQVBfTUxPQ0ssIHNocmlua19wYWdlX2xpc3QoKQogd2lsbCBjdWxsIHRoZSBwYWdlIGF0IHRoYXQgcG9pbnQuCiAKLU5vdGUgdGhhdCBmb3IgYW5vbnltb3VzIHBhZ2VzLCBzaHJpbmtfcGFnZV9saXN0KCkgYXR0ZW1wdHMgdG8gYWRkIHRoZSBwYWdlIHRvCi10aGUgc3dhcCBjYWNoZSBiZWZvcmUgaXQgdHJpZXMgdG8gdW5tYXAgdGhlIHBhZ2UuICBUbyBhdm9pZCB0aGlzIHVubmVjZXNzYXJ5Ci1jb25zdW1wdGlvbiBvZiBzd2FwIHNwYWNlLCBzaHJpbmtfcGFnZV9saXN0KCkgY2FsbHMgdHJ5X3RvX211bmxvY2soKSB0byBjaGVjawotd2hldGhlciBhbnkgVk1fTE9DS0VEIHZtYXMgbWFwIHRoZSBwYWdlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byB1bm1hcCB0aGUgcGFnZS4KLUlmIHRyeV90b19tdW5sb2NrKCkgcmV0dXJucyBTV0FQX01MT0NLLCBzaHJpbmtfcGFnZV9saXN0KCkgd2lsbCBjdWxsIHRoZSBwYWdlCi13aXRob3V0IGNvbnN1bWluZyBzd2FwIHNwYWNlLiAgdHJ5X3RvX211bmxvY2soKSB3aWxsIGJlIGRlc2NyaWJlZCBiZWxvdy4KLQogVG8gImN1bGwiIGFuIHVuZXZpY3RhYmxlIHBhZ2UsIHZtc2NhbiBzaW1wbHkgcHV0cyB0aGUgcGFnZSBiYWNrIG9uIHRoZSBscnUKIGxpc3QgdXNpbmcgcHV0YmFja19scnVfcGFnZSgpLS10aGUgaW52ZXJzZSBvcGVyYXRpb24gdG8gaXNvbGF0ZV9scnVfcGFnZSgpLS0KIGFmdGVyIGRyb3BwaW5nIHRoZSBwYWdlIGxvY2suICBCZWNhdXNlIHRoZSBjb25kaXRpb24gd2hpY2ggbWFrZXMgdGhlIHBhZ2UKQEAgLTE5MCw4ICsxODMsOCBAQAogICAgaW4gdGhlIFZNX0xPQ0tFRCBmbGFnIGJlaW5nIHNldCBmb3IgdGhlIHZtYS4KIDMpIGluIHRoZSBmYXVsdCBwYXRoLCBpZiBtbG9ja2VkIHBhZ2VzIGFyZSAiY3VsbGVkIiBpbiB0aGUgZmF1bHQgcGF0aCwKICAgIGFuZCB3aGVuIGEgVk1fTE9DS0VEIHN0YWNrIHNlZ21lbnQgaXMgZXhwYW5kZWQuCi00KSBhcyBtZW50aW9uZWQgYWJvdmUsIGluIHZtc2NhbjpzaHJpbmtfcGFnZV9saXN0KCkgd2l0aCBhdHRlbXB0aW5nIHRvCi0gICByZWNsYWltIGEgcGFnZSBpbiBhIFZNX0xPQ0tFRCB2bWEtLXZpYSB0cnlfdG9fdW5tYXAoKSBvciB0cnlfdG9fbXVubG9jaygpLgorNCkgYXMgbWVudGlvbmVkIGFib3ZlLCBpbiB2bXNjYW46c2hyaW5rX3BhZ2VfbGlzdCgpIHdoZW4gYXR0ZW1wdGluZyB0bworICAgcmVjbGFpbSBhIHBhZ2UgaW4gYSBWTV9MT0NLRUQgdm1hIHZpYSB0cnlfdG9fdW5tYXAoKS4KIAogTWxvY2tlZCBwYWdlcyBiZWNvbWUgdW5sb2NrZWQgYW5kIHJlc2N1ZWQgZnJvbSB0aGUgdW5ldmljdGFibGUgbGlzdCB3aGVuOgogCkBAIC0yNjAsOSArMjUzLDkgQEAKIAogMikgdm1hcyBtYXBwaW5nIGh1Z2V0bGJmcyBwYWdlIGFyZSBhbHJlYWR5IGVmZmVjdGl2ZWx5IHBpbm5lZCBpbnRvIG1lbW9yeS4KICAgIFdlIGRvbid0IG5lZWQgbm9yIHdhbnQgdG8gbWxvY2soKSB0aGVzZSBwYWdlcy4gIEhvd2V2ZXIsIHRvIHByZXNlcnZlIHRoZQotICAgcHJpb3IgYmVoYXZpb3Igb2YgbWxvY2soKS0tYmVmb3JlIHRoZSB1bmV2aWN0YWJsZS9tbG9jayBjaGFuZ2VzLS1tbG9ja19maXh1cCgpCi0gICB3aWxsIGNhbGwgbWFrZV9wYWdlc19wcmVzZW50KCkgaW4gdGhlIGh1Z2V0bGJmcyB2bWEgcmFuZ2UgdG8gYWxsb2NhdGUgdGhlCi0gICBodWdlIHBhZ2VzIGFuZCBwb3B1bGF0ZSB0aGUgcHRlcy4KKyAgIHByaW9yIGJlaGF2aW9yIG9mIG1sb2NrKCktLWJlZm9yZSB0aGUgdW5ldmljdGFibGUvbWxvY2sgY2hhbmdlcy0tCisgICBtbG9ja19maXh1cCgpIHdpbGwgY2FsbCBtYWtlX3BhZ2VzX3ByZXNlbnQoKSBpbiB0aGUgaHVnZXRsYmZzIHZtYSByYW5nZQorICAgdG8gYWxsb2NhdGUgdGhlIGh1Z2UgcGFnZXMgYW5kIHBvcHVsYXRlIHRoZSBwdGVzLgogCiAzKSB2bWFzIHdpdGggVk1fRE9OVEVYUEFORHxWTV9SRVNFUlZFRCBhcmUgZ2VuZXJhbGx5IHVzZXIgc3BhY2UgbWFwcGluZ3Mgb2YKICAgIGtlcm5lbCBwYWdlcywgc3VjaCBhcyB0aGUgdmRzbyBwYWdlLCByZWxheSBjaGFubmVsIHBhZ2VzLCBldGMuICBUaGVzZSBwYWdlcwpAQCAtMzIyLDcgKzMxNSw3IEBACiBwYXNzaW5nIGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IG11bmxvY2soKSBpcyBiZWluZyBwZXJmb3JtZWQuCiAKIEJlY2F1c2UgdGhlIHZtYSBhY2Nlc3MgcHJvdGVjdGlvbnMgY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gUFJPVF9OT05FIGFmdGVyCi1mYXVsdGluZyBpbiBhbmQgbWxvY2tpbmcgc29tZSBwYWdlcywgZ2V0X3VzZXJfcGFnZXMoKSB3YXMgdW5yZWxpYWJsZSBmb3IgdmlzaXRpbmcKK2ZhdWx0aW5nIGluIGFuZCBtbG9ja2luZyBwYWdlcywgZ2V0X3VzZXJfcGFnZXMoKSB3YXMgdW5yZWxpYWJsZSBmb3IgdmlzaXRpbmcKIHRoZXNlIHBhZ2VzIGZvciBtdW5sb2NraW5nLiAgQmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGxlYXZlIHBhZ2VzIG1sb2NrZWQoKSwKIGdldF91c2VyX3BhZ2VzKCkgd2FzIGVuaGFuY2VkIHRvIGFjY2VwdCBhIGZsYWcgdG8gaWdub3JlIHRoZSBwZXJtaXNzaW9ucyB3aGVuCiBmZXRjaGluZyB0aGUgcGFnZXMtLWFsbCBvZiB3aGljaCBzaG91bGQgYmUgcmVzaWRlbnQgYXMgYSByZXN1bHQgb2YgcHJldmlvdXMKQEAgLTQxNiw4ICs0MDksOCBAQAogV2hlbiB1bm1hcHBpbmcgYW4gbWxvY2tlZCByZWdpb24gb2YgbWVtb3J5LCB3aGV0aGVyIGJ5IGFuIGV4cGxpY2l0IGNhbGwgdG8KIG11bm1hcCgpIG9yIHZpYSBhbiBpbnRlcm5hbCB1bm1hcCBmcm9tIGV4aXQoKSBvciBleGVjKCkgcHJvY2Vzc2luZywgd2UgbXVzdAogbXVubG9jayB0aGUgcGFnZXMgaWYgd2UncmUgcmVtb3ZpbmcgdGhlIGxhc3QgVk1fTE9DS0VEIHZtYSB0aGF0IG1hcHMgdGhlIHBhZ2VzLgotQmVmb3JlIHRoZSB1bmV2aWN0YWJsZS9tbG9jayBjaGFuZ2VzLCBtbG9ja2luZyBkaWQgbm90IG1hcmsgdGhlIHBhZ2VzIGluIGFueSB3YXksCi1zbyB1bm1hcHBpbmcgdGhlbSByZXF1aXJlZCBubyBwcm9jZXNzaW5nLgorQmVmb3JlIHRoZSB1bmV2aWN0YWJsZS9tbG9jayBjaGFuZ2VzLCBtbG9ja2luZyBkaWQgbm90IG1hcmsgdGhlIHBhZ2VzIGluIGFueQord2F5LCBzbyB1bm1hcHBpbmcgdGhlbSByZXF1aXJlZCBubyBwcm9jZXNzaW5nLgogCiBUbyBtdW5sb2NrIGEgcmFuZ2Ugb2YgbWVtb3J5IHVuZGVyIHRoZSB1bmV2aWN0YWJsZS9tbG9jayBpbmZyYXN0cnVjdHVyZSwgdGhlCiBtdW5tYXAoKSBoYW5kZXIgYW5kIHRhc2sgYWRkcmVzcyBzcGFjZSB0ZWFyIGRvd24gZnVuY3Rpb24gY2FsbApAQCAtNTE3LDEyICs1MTAsMTAgQEAKIE1sb2NrZWQgcGFnZXM6ICB0cnlfdG9fbXVubG9jaygpIFJldmVyc2UgTWFwIFNjYW4KIAogVE9ETy9GSVhNRTogIGEgYmV0dGVyIG5hbWUgbWlnaHQgYmUgcGFnZV9tbG9ja2VkKCktLWFuYWxvZ291cyB0byB0aGUKLXBhZ2VfcmVmZXJlbmNlZCgpIHJldmVyc2UgbWFwIHdhbGtlci0tZXNwZWNpYWxseSBpZiB3ZSBjb250aW51ZSB0byBjYWxsIHRoaXMKLWZyb20gc2hyaW5rX3BhZ2VfbGlzdCgpLiAgU2VlIHJlbGF0ZWQgVE9ETy9GSVhNRSBiZWxvdy4KK3BhZ2VfcmVmZXJlbmNlZCgpIHJldmVyc2UgbWFwIHdhbGtlci4KIAotV2hlbiBtdW5sb2NrX3ZtYV9wYWdlKCktLXNlZSAiTWxvY2tlZCBQYWdlczogIG11bmxvY2soKS9tdW5sb2NrYWxsKCkgU3lzdGVtCi1DYWxsIEhhbmRsaW5nIiBhYm92ZS0tdHJpZXMgdG8gbXVubG9jayBhIHBhZ2UsIG9yIHdoZW4gc2hyaW5rX3BhZ2VfbGlzdCgpCi1lbmNvdW50ZXJzIGFuIGFub255bW91cyBwYWdlIHRoYXQgaXMgbm90IHlldCBpbiB0aGUgc3dhcCBjYWNoZSwgdGhleSBuZWVkIHRvCitXaGVuIG11bmxvY2tfdm1hX3BhZ2UoKS0tc2VlICJNbG9ja2VkIFBhZ2VzOiAgbXVubG9jaygpL211bmxvY2thbGwoKQorU3lzdGVtIENhbGwgSGFuZGxpbmciIGFib3ZlLS10cmllcyB0byBtdW5sb2NrIGEgcGFnZSwgaXQgbmVlZHMgdG8KIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgcGFnZSBpcyBtYXBwZWQgYnkgYW55IFZNX0xPQ0tFRCB2bWEsIHdpdGhvdXQKIGFjdHVhbGx5IGF0dGVtcHRpbmcgdG8gdW5tYXAgYWxsIHB0ZXMgZnJvbSB0aGUgcGFnZS4gIEZvciB0aGlzIHB1cnBvc2UsIHRoZQogdW5ldmljdGFibGUvbWxvY2sgaW5mcmFzdHJ1Y3R1cmUgaW50cm9kdWNlZCBhIHZhcmlhbnQgb2YgdHJ5X3RvX3VubWFwKCkgY2FsbGVkCkBAIC01MzUsMTAgKzUyNiw3IEBACiBwYWdlcyBtYXBwZWQgaW4gbGluZWFyIFZNQXMsIGFzIGluIHRoZSB0cnlfdG9fdW5tYXAoKSBjYXNlLCB0aGUgZnVuY3Rpb25zCiBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGFzc29jaWF0ZWQgbW1hcCBzZW1waG9yZSwgbWxvY2sgdGhlIHBhZ2UgdmlhCiBtbG9ja192bWFfcGFnZSgpIGFuZCByZXR1cm4gU1dBUF9NTE9DSy4gIFRoaXMgZWZmZWN0aXZlbHkgdW5kb2VzIHRoZQotcHJlLWNsZWFyaW5nIG9mIHRoZSBwYWdlJ3MgUEdfbWxvY2tlZCBkb25lIGJ5IG11bmxvY2tfdm1hX3BhZ2UoKSBhbmQgaW5mb3Jtcwotc2hyaW5rX3BhZ2VfbGlzdCgpIHRoYXQgdGhlIGFub255bW91cyBwYWdlIHNob3VsZCBiZSBjdWxsZWQgcmF0aGVyIHRoYW4gYWRkZWQKLXRvIHRoZSBzd2FwIGNhY2hlIGluIHByZXBhcmF0aW9uIGZvciBhIHRyeV90b191bm1hcCgpIHRoYXQgd2lsbCBhbG1vc3QKLWNlcnRhaW5seSBmYWlsLgorcHJlLWNsZWFyaW5nIG9mIHRoZSBwYWdlJ3MgUEdfbWxvY2tlZCBkb25lIGJ5IG11bmxvY2tfdm1hX3BhZ2UuCiAKIElmIHRyeV90b191bm1hcCgpIGlzIHVuYWJsZSB0byBhY3F1aXJlIGEgVk1fTE9DS0VEIHZtYSdzIGFzc29jaWF0ZWQgbW1hcAogc2VtYXBob3JlLCBpdCB3aWxsIHJldHVybiBTV0FQX0FHQUlOLiAgVGhpcyB3aWxsIGFsbG93IHNocmlua19wYWdlX2xpc3QoKQpAQCAtNTU3LDEwICs1NDUsNyBAQAogc3VjY2Vzc2Z1bGx5IGFjcXVpcmUgdGhlIHZtYSdzIG1tYXAgc2VtcGhvcmUgZm9yIHJlYWQgYW5kIG1sb2NrIHRoZSBwYWdlLgogQWx0aG91Z2ggdHJ5X3RvX211bmxvY2soKSBjYW4gYmUgY2FsbGVkIG1hbnkgW3ZlcnkgbWFueSFdIHRpbWVzIHdoZW4KIG11bmxvY2soKWluZyBhIGxhcmdlIHJlZ2lvbiBvciB0ZWFyaW5nIGRvd24gYSBsYXJnZSBhZGRyZXNzIHNwYWNlIHRoYXQgaGFzIGJlZW4KLW1sb2NrZWQgdmlhIG1sb2NrYWxsKCksIG92ZXJhbGwgdGhpcyBpcyBhIGZhaXJseSByYXJlIGV2ZW50LiAgSW4gYWRkaXRpb24sCi1hbHRob3VnaCBzaHJpbmtfcGFnZV9saXN0KCkgY2FsbHMgdHJ5X3RvX211bmxvY2soKSBmb3IgZXZlcnkgYW5vbnltb3VzIHBhZ2UgdGhhdAotaXQgaGFuZGxlcyB0aGF0IGlzIG5vdCB5ZXQgaW4gdGhlIHN3YXAgY2FjaGUsIG9uIGF2ZXJhZ2UgYW5vbnltb3VzIHBhZ2VzIHdpbGwKLWhhdmUgdmVyeSBzaG9ydCByZXZlcnNlIG1hcCBsaXN0cy4KK21sb2NrZWQgdmlhIG1sb2NrYWxsKCksIG92ZXJhbGwgdGhpcyBpcyBhIGZhaXJseSByYXJlIGV2ZW50LgogCiBNbG9ja2VkIFBhZ2U6ICBQYWdlIFJlY2xhaW0gaW4gc2hyaW5rXypfbGlzdCgpCiAKQEAgLTU4OCw4ICs1NzMsOCBAQAogICAgbXVubG9ja192bWFfcGFnZSgpIHdhcyBmb3JjZWQgdG8gbGV0IHRoZSBwYWdlIGJhY2sgb24gdG8gdGhlIG5vcm1hbAogICAgTFJVIGxpc3QgZm9yIHZtc2NhbiB0byBoYW5kbGUuCiAKLXNocmlua19pbmFjdGl2ZV9saXN0KCkgYWxzbyBjdWxscyBhbnkgdW5ldmljdGFibGUgcGFnZXMgdGhhdCBpdCBmaW5kcwotb24gdGhlIGluYWN0aXZlIGxpc3RzLCBhZ2FpbiBkaXZlcnRpbmcgdGhlbSB0byB0aGUgYXBwcm9wcmlhdGUgem9uZSdzIHVuZXZpY3RhYmxlCitzaHJpbmtfaW5hY3RpdmVfbGlzdCgpIGFsc28gY3VsbHMgYW55IHVuZXZpY3RhYmxlIHBhZ2VzIHRoYXQgaXQgZmluZHMgb24KK3RoZSBpbmFjdGl2ZSBsaXN0cywgYWdhaW4gZGl2ZXJ0aW5nIHRoZW0gdG8gdGhlIGFwcHJvcHJpYXRlIHpvbmUncyB1bmV2aWN0YWJsZQogbHJ1IGxpc3QuICBzaHJpbmtfaW5hY3RpdmVfbGlzdCgpIHNob3VsZCBvbmx5IHNlZSBTSE1fTE9DS2VkIHBhZ2VzIHRoYXQgYmVjYW1lCiBTSE1fTE9DS2VkIGFmdGVyIHNocmlua19hY3RpdmVfbGlzdCgpIGhhZCBtb3ZlZCB0aGVtIHRvIHRoZSBpbmFjdGl2ZSBsaXN0LCBvcgogcGFnZXMgbWFwcGVkIGludG8gVk1fTE9DS0VEIHZtYXMgdGhhdCBtdW5sb2NrX3ZtYV9wYWdlKCkgY291bGRuJ3QgaXNvbGF0ZSBmcm9tCkBAIC01OTcsMTkgKzU4Miw3IEBACiB0aGUgbGF0dGVyLCBidXQgd2lsbCBwYXNzIG9uIHRvIHNocmlua19wYWdlX2xpc3QoKS4KIAogc2hyaW5rX3BhZ2VfbGlzdCgpIGFnYWluIGN1bGxzIG9idmlvdXNseSB1bmV2aWN0YWJsZSBwYWdlcyB0aGF0IGl0IGNvdWxkCi1lbmNvdW50ZXIgZm9yIHNpbWlsYXIgcmVhc29uIHRvIHNocmlua19pbmFjdGl2ZV9saXN0KCkuICBBcyBhbHJlYWR5IGRpc2N1c3NlZCwKLXNocmlua19wYWdlX2xpc3QoKSBwcm9hY3RpdmVseSBsb29rcyBmb3IgYW5vbnltb3VzIHBhZ2VzIHRoYXQgc2hvdWxkIGhhdmUKLVBHX21sb2NrZWQgc2V0IGJ1dCBkb24ndC0tdGhlc2Ugd291bGQgbm90IGJlIGRldGVjdGVkIGJ5IHBhZ2VfZXZpY3RhYmxlKCktLXRvCi1hdm9pZCBhZGRpbmcgdGhlbSB0byB0aGUgc3dhcCBjYWNoZSB1bm5lY2Vzc2FyaWx5LiAgRmlsZSBwYWdlcyBtYXBwZWQgaW50bworZW5jb3VudGVyIGZvciBzaW1pbGFyIHJlYXNvbiB0byBzaHJpbmtfaW5hY3RpdmVfbGlzdCgpLiAgUGFnZXMgbWFwcGVkIGludG8KIFZNX0xPQ0tFRCB2bWFzIGJ1dCB3aXRob3V0IFBHX21sb2NrZWQgc2V0IHdpbGwgbWFrZSBpdCBhbGwgdGhlIHdheSB0bwotdHJ5X3RvX3VubWFwKCkuICBzaHJpbmtfcGFnZV9saXN0KCkgd2lsbCBkaXZlcnQgdGhlbSB0byB0aGUgdW5ldmljdGFibGUgbGlzdCB3aGVuCi10cnlfdG9fdW5tYXAoKSByZXR1cm5zIFNXQVBfTUxPQ0ssIGFzIGRpc2N1c3NlZCBhYm92ZS4KLQotVE9ETy9GSVhNRTogIElmIHdlIGNhbiBlbmhhbmNlIHRoZSBzd2FwIGNhY2hlIHRvIHJlbGlhYmx5IHJlbW92ZSBlbnRyaWVzCi13aXRoIHBhZ2VfY291bnQocGFnZSkgPiAyLCBhcyBsb25nIGFzIGFsbCBwdGVzIGFyZSBtYXBwZWQgdG8gdGhlIHBhZ2UgYW5kCi1ub3QgdGhlIHN3YXAgZW50cnksIHdlIGNhbiBwcm9iYWJseSByZW1vdmUgdGhlIGNhbGwgdG8gdHJ5X3RvX211bmxvY2soKSBpbgotc2hyaW5rX3BhZ2VfbGlzdCgpIGFuZCBqdXN0IHJlbW92ZSB0aGUgcGFnZSBmcm9tIHRoZSBzd2FwIGNhY2hlIHdoZW4KLXRyeV90b191bm1hcCgpIHJldHVybnMgU1dBUF9NTE9DSy4gICBDdXJyZW50bHksIHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlKCkKLWRvZXNuJ3Qgc2VlbSB0byBhbGxvdyB0aGF0LgotCi0KK3RyeV90b191bm1hcCgpLiAgc2hyaW5rX3BhZ2VfbGlzdCgpIHdpbGwgZGl2ZXJ0IHRoZW0gdG8gdGhlIHVuZXZpY3RhYmxlIGxpc3QKK3doZW4gdHJ5X3RvX3VubWFwKCkgcmV0dXJucyBTV0FQX01MT0NLLCBhcyBkaXNjdXNzZWQgYWJvdmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni96ZXJvLXBhZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvemVyby1wYWdlLnR4dAppbmRleCAxNjlhZDQyLi40ZjkxMzg1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni96ZXJvLXBhZ2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2L3plcm8tcGFnZS50eHQKQEAgLTMsNyArMyw3IEBACiByZWFsLW1vZGUgc2V0dXAgY29kZSBvZiB0aGUga2VybmVsLiBSZWZlcmVuY2VzL3NldHRpbmdzIHRvIGl0IG1haW5seQogYXJlIGluOgogCi0gIGluY2x1ZGUvYXNtLXg4Ni9ib290cGFyYW0uaAorICBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290cGFyYW0uaAogCiAKIE9mZnNldAlQcm90bwlOYW1lCQlNZWFuaW5nCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDE0MWFmZjYuLjA5NGRkNTIgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC02MTYsNyArNjE2LDcgQEAKIFM6CU1haW50YWluZWQKIAogQVJNL1RPU0EgTUFDSElORSBTVVBQT1JUCi1QOglEbWl0cnkgQmFyeXNoa292CitQOglEbWl0cnkgRXJlbWluLVNvbGVuaWtvdgogTToJZGJhcnlzaGtvdkBnbWFpbC5jb20KIFA6CURpcmsgT3BmZXIKIE06CWRpcmtAb3BmZXItb25saW5lLmRlCkBAIC0xMDkyLDExICsxMDkyLDggQEAKIAogQ0hFQ0tQQVRDSAogUDoJQW5keSBXaGl0Y3JvZnQKLU06CWFwd0BzaGFkb3dlbi5vcmcKLVA6CVJhbmR5IER1bmxhcAotTToJcmR1bmxhcEB4ZW5vdGltZS5uZXQKLVA6CUpvZWwgU2Nob3BwCi1NOglqc2Nob3BwQGF1c3Rpbi5pYm0uY29tCitNOglhcHdAY2Fub25pY2FsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiAKIENJU0NPIDEwRyBFVEhFUk5FVCBEUklWRVIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGNhODhlNTQuLjYyYjM2MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX0FMUEhBX0FUT01JQ19ICiAjZGVmaW5lIF9BTFBIQV9BVE9NSUNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYmFycmllci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApAQCAtMTMsMTQgKzE0LDYgQEAKICAqLwogCiAKLS8qCi0gKiBDb3VudGVyIGlzIHZvbGF0aWxlIHRvIG1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyCi0gKiBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MKLSAqIHRoZSB1c2VyIGdhdmUgdXMsIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGxvbmcgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCQkoIChhdG9taWNfdCkgeyAoaSkgfSApCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkJKCAoYXRvbWljNjRfdCkgeyAoaSkgfSApCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IGQ2ZWJlMzkuLmRiZmRmODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMTMyNSw2ICsxMzI1LDggQEAKIAogc291cmNlICJkcml2ZXJzL3Vpby9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9LY29uZmlnIgorCiBlbmRtZW51CiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMzI1Zjg4MS4uZWU5OTcyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTEyLDEwICsxMiw5IEBACiAjZGVmaW5lIF9fQVNNX0FSTV9BVE9NSUNfSAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZWNhcmQuYyBiL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jCmluZGV4IDYwYzA3OWQuLmVlZDJmNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jCkBAIC04MTcsNyArODE3LDcgQEAKIAllYy0+ZG1hID0gTk9fRE1BOwogCWVjLT5vcHMgPSAmZWNhcmRfZGVmYXVsdF9vcHM7CiAKLQlzbnByaW50ZihlYy0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGVjLT5kZXYuYnVzX2lkKSwgImVjYXJkJWQiLCBzbG90KTsKKwlkZXZfc2V0X25hbWUoJmVjLT5kZXYsICJlY2FyZCVkIiwgc2xvdCk7CiAJZWMtPmRldi5wYXJlbnQgPSBOVUxMOwogCWVjLT5kZXYuYnVzID0gJmVjYXJkX2J1c190eXBlOwogCWVjLT5kZXYuZG1hX21hc2sgPSAmZWMtPmRtYV9tYXNrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggM2Y5YWJlMC4uZjY5MmVmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jCkBAIC05Miw5ICs5Miw3IEBACiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpZiAocC0+YWluc24uaW5zbikgewotCQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAwKTsKLQkJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jCmluZGV4IDUwZTEzOTYuLmI1YzVmYzZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgY2xjZF9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJCQk9ICJtYjoxNiIsCisJCS5pbml0X25hbWUJCT0gIm1iOjE2IiwKIAkJLmNvaGVyZW50X2RtYV9tYXNrCT0gfjAsCiAJCS5wbGF0Zm9ybV9kYXRhCQk9ICZjbGNkX3BsYXRfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCmluZGV4IDQ3ODFmMzIuLjZkOTE1MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKQEAgLTQwOSw3ICs0MDksNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIHVhcnQxX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAkJPSAiYXBiOnVhcnQxIiwKKwkJLmluaXRfbmFtZQk9ICJhcGI6dWFydDEiLAogCQkucGxhdGZvcm1fZGF0YQk9ICZlcDkzeHhfdWFydF9kYXRhLAogCX0sCiAJLnJlcwkJPSB7CkBAIC00MjMsNyArNDIzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0Ml9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJCT0gImFwYjp1YXJ0MiIsCisJCS5pbml0X25hbWUJPSAiYXBiOnVhcnQyIiwKIAkJLnBsYXRmb3JtX2RhdGEJPSAmZXA5M3h4X3VhcnRfZGF0YSwKIAl9LAogCS5yZXMJCT0gewpAQCAtNDM3LDcgKzQzNyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgdWFydDNfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCQk9ICJhcGI6dWFydDMiLAorCQkuaW5pdF9uYW1lCT0gImFwYjp1YXJ0MyIsCiAJCS5wbGF0Zm9ybV9kYXRhCT0gJmVwOTN4eF91YXJ0X2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCmluZGV4IGM4OWM5NDkuLjZmODg3MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYwpAQCAtMzcsNyArMzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIHJ0Y19kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MTUiLAorCQkuaW5pdF9uYW1lID0gIm1iOjE1IiwKIAl9LAogCS5yZXMJCT0gewogCQkuc3RhcnQJPSBJTlRFR1JBVE9SX1JUQ19CQVNFLApAQCAtNTAsNyArNTAsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIHVhcnQwX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxNiIsCisJCS5pbml0X25hbWUgPSAibWI6MTYiLAogCQkucGxhdGZvcm1fZGF0YSA9ICZpbnRlZ3JhdG9yX3VhcnRfZGF0YSwKIAl9LAogCS5yZXMJCT0gewpAQCAtNjQsNyArNjQsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIHVhcnQxX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxNyIsCisJCS5pbml0X25hbWUgPSAibWI6MTciLAogCQkucGxhdGZvcm1fZGF0YSA9ICZpbnRlZ3JhdG9yX3VhcnRfZGF0YSwKIAl9LAogCS5yZXMJCT0gewpAQCAtNzgsNyArNzgsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIGttaTBfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOjE4IiwKKwkJLmluaXRfbmFtZSA9ICJtYjoxOCIsCiAJfSwKIAkucmVzCQk9IHsKIAkJLnN0YXJ0CT0gS01JMF9CQVNFLApAQCAtOTEsNyArOTEsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIGttaTFfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOjE5IiwKKwkJLmluaXRfbmFtZSA9ICJtYjoxOSIsCiAJfSwKIAkucmVzCQk9IHsKIAkJLnN0YXJ0CT0gS01JMV9CQVNFLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKaW5kZXggNDI3YzJkOC4uNGFjMDQwNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwpAQCAtNDA3LDcgKzQwNyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgbW1jX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxYyIsCisJCS5pbml0X25hbWUgPSAibWI6MWMiLAogCQkucGxhdGZvcm1fZGF0YSA9ICZtbWNfZGF0YSwKIAl9LAogCS5yZXMJCT0gewpAQCAtNDIxLDcgKzQyMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgYWFjaV9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MWQiLAorCQkuaW5pdF9uYW1lID0gIm1iOjFkIiwKIAl9LAogCS5yZXMJCT0gewogCQkuc3RhcnQJPSBJTlRDUF9QQV9BQUNJX0JBU0UsCkBAIC01MzIsNyArNTMyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBjbGNkX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjpjMCIsCisJCS5pbml0X25hbWUgPSAibWI6YzAiLAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmY2xjZF9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xjZC5jIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NsY2QuYwppbmRleCBhMmE1NDMyLi5jNDcyYjllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xjZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jbGNkLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBuYW1lIyNfZGV2aWNlID0gewkJCVwKIAkuZGV2ID0gewkJCQkJCVwKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gfjAsCQkJXAotCQkuYnVzX2lkCT0gYnVzaWQsCQkJCVwKKwkJLmluaXRfbmFtZSA9IGJ1c2lkLAkJCQlcCiAJCS5wbGF0Zm9ybV9kYXRhID0gcGxhdCwJCQkJXAogCQl9LAkJCQkJCVwKIAkucmVzID0gewkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC9mYi5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMKaW5kZXggOGYxZjk5Mi4uZWE4ZmE4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMKQEAgLTkxLDcgKzkxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBmYl9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAiZmIiLAorCQkuaW5pdF9uYW1lID0gImZiIiwKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gfjAsCiAJfSwKIAkucmVzCQk9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKaW5kZXggNjNiZTJhYi4uNDQyNjliMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKQEAgLTMxLDcgKzMxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgbmFtZSMjX2RldmljZSA9IHsJCQlcCiAJLmRldgkJPSB7CQkJCQlcCiAJCS5jb2hlcmVudF9kbWFfbWFzayA9IH4wLAkJCVwKLQkJLmJ1c19pZAk9IGJ1c2lkLAkJCQlcCisJCS5pbml0X25hbWUgPSBidXNpZCwJCQkJXAogCQkucGxhdGZvcm1fZGF0YSA9IHBsYXQsCQkJCVwKIAl9LAkJCQkJCQlcCiAJLnJlcwkJPSB7CQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zcGkuaAppbmRleCA3NzRmM2FkLi4xZDMwMGZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3BpLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNkZWZpbmUgX19BU01fQVJDSF9TUElfSCBfX0ZJTEVfXwogCiBzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZwkJIHBpbl9jczsJLyogc2ltcGxlIGdwaW8gY3MgKi8KKwlpbnQJCQkgcGluX2NzOwkvKiBzaW1wbGUgZ3BpbyBjcyAqLwogCXVuc2lnbmVkIGludAkJIG51bV9jczsJLyogdG90YWwgY2hpcHNlbGVjdHMgKi8KIAlpbnQJCQkgYnVzX251bTsgICAgICAgLyogYnVzIG51bWJlciB0byB1c2UuICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaAppbmRleCBhZmNhYTg1Li45ZDM5ODg2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5oCkBAIC0zNCw3ICszNCw3IEBACiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIG5hbWUjI19kZXZpY2UgPSB7CQkJXAogCS5kZXYJCT0gewkJCQkJXAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwJCQlcCi0JCS5idXNfaWQJPSBidXNpZCwJCQkJXAorCQkuaW5pdF9uYW1lID0gYnVzaWQsCQkJCVwKIAkJLnBsYXRmb3JtX2RhdGEgPSBwbGF0LAkJCQlcCiAJfSwJCQkJCQkJXAogCS5yZXMJCT0gewkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggMjExYzlmNi4uZDZiNWNhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC01OSw3ICs1OSw3IEBACiAKICNkZWZpbmUgdmlydF90b19sYnVzKHgpCQkoKHgpIC0gUEFHRV9PRkZTRVQgKyBPTUFQMTUxMF9MQl9PRkZTRVQpCiAjZGVmaW5lIGxidXNfdG9fdmlydCh4KQkJKCh4KSAtIE9NQVAxNTEwX0xCX09GRlNFVCArIFBBR0VfT0ZGU0VUKQotI2RlZmluZSBpc19sYnVzX2RldmljZShkZXYpCShjcHVfaXNfb21hcDE1eHgoKSAmJiBkZXYgJiYgKHN0cm5jbXAoZGV2LT5idXNfaWQsICJvaGNpIiwgNCkgPT0gMCkpCisjZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikJKGNwdV9pc19vbWFwMTV4eCgpICYmIGRldiAmJiAoc3RybmNtcChkZXZfbmFtZShkZXYpLCAib2hjaSIsIDQpID09IDApKQogCiAjZGVmaW5lIF9fYXJjaF9wYWdlX3RvX2RtYShkZXYsIHBhZ2UpCSh7aXNfbGJ1c19kZXZpY2UoZGV2KSA/IFwKIAkJCQkJKGRtYV9hZGRyX3QpdmlydF90b19sYnVzKHBhZ2VfYWRkcmVzcyhwYWdlKSkgOiBcCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA3ZWYzODYyLi4zMTg4MTUxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE0LDkgKzE0LDkgQEAKICNpZm5kZWYgX19BU01fQVZSMzJfQVRPTUlDX0gKICNkZWZpbmUgX19BU01fQVZSMzJfQVRPTUlDX0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKaW5kZXggMGQ5ODczNy4uZDU0N2M4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKaW5kZXggMTM4YTAwYS4uNDQyZjA4YyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJdW5zaWduZWQJaTsKIAogCS8qIHNraXAgY2xvY2tzIGNvdXBsZWQgdG8gZGV2aWNlcyB0aGF0IGFyZW4ndCByZWdpc3RlcmVkICovCi0JaWYgKHBhcmVudC0+ZGV2ICYmICFwYXJlbnQtPmRldi0+YnVzX2lkWzBdICYmICFwYXJlbnQtPnVzZXJzKQorCWlmIChwYXJlbnQtPmRldiAmJiAhZGV2X25hbWUocGFyZW50LT5kZXYpICYmICFwYXJlbnQtPnVzZXJzKQogCQlyZXR1cm47CiAKIAkvKiA8bmVzdCBzcGFjZXM+IG5hbWUgPHBhZCB0byBlbmQ+ICovCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkJcGFyZW50LT51c2VycyA/ICJvbiIgOiAib2ZmIiwJLyogTk9URTogbm90LXBhcmFub2lkISEgKi8KIAkJY2xrX2dldF9yYXRlKHBhcmVudCkpOwogCWlmIChwYXJlbnQtPmRldikKLQkJc2VxX3ByaW50ZihyLT5zLCAiLCBmb3IgJXMiLCBwYXJlbnQtPmRldi0+YnVzX2lkKTsKKwkJc2VxX3ByaW50ZihyLT5zLCAiLCBmb3IgJXMiLCBkZXZfbmFtZShwYXJlbnQtPmRldikpOwogCXNlcV9wcmludGYoci0+cywgIlxuIik7CiAKIAkvKiBjb3N0IG9mIHRoaXMgc2NhbiBpcyBzbWFsbCwgYnV0IG5vdCBsaW5lYXIuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDdjZjUwODcuLjI1Nzc2YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX19BUkNIX0JMQUNLRklOX0FUT01JQ19fCiAjZGVmaW5lIF9fQVJDSF9CTEFDS0ZJTl9BVE9NSUNfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CS8qIGxvY2FsX2lycV9YWFgoKSAqLwogCiAvKgpAQCAtMTMsOSArMTQsNiBAQAogICogVG9ueSBLb3UgKHRvbnlrb0BsaW5lby5jYSkgICBMaW5lbyBJbmMuICAgMjAwMQogICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgY291bnRlcjsKLX0gYXRvbWljX3Q7CiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9LY29uZmlnIGIvYXJjaC9jcmlzL0tjb25maWcKaW5kZXggYjE3YWVlYS4uMzQ2MjI0NSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL0tjb25maWcKKysrIGIvYXJjaC9jcmlzL0tjb25maWcKQEAgLTY4MSw2ICs2ODEsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvdXdiL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL0tjb25maWciCisKIHNvdXJjZSAiYXJjaC9jcmlzL0tjb25maWcuZGVidWciCiAKIHNvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2lvcF9md19sb2FkLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pb3BfZndfbG9hZC5jCmluZGV4IDNiMzg1N2UuLjJmOGVhMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2lvcF9md19sb2FkLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaW9wX2Z3X2xvYWQuYwpAQCAtMjQsMTIgKzI0LDEyIEBACiAjZXJyb3IgIlBsZWFzZSBjb250YWN0IDxncmVnQGtyb2FoLmNvbT4gZm9yIGRldGFpbHMgb24gaG93IHRvIGZpeCBpdCBwcm9wZXJseS4iCiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGlvcF9zcHVfZGV2aWNlWzJdID0gewotCXsgLmJ1c19pZCA9ICAgICAiaW9wLXNwdTAiLCB9LAotCXsgLmJ1c19pZCA9ICAgICAiaW9wLXNwdTEiLCB9LAorCXsgLmluaXRfbmFtZSA9ICAgICAiaW9wLXNwdTAiLCB9LAorCXsgLmluaXRfbmFtZSA9ICAgICAiaW9wLXNwdTEiLCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2UgaW9wX21wdV9kZXZpY2UgPSB7Ci0JLmJ1c19pZCA9ICAgICAgICJpb3AtbXB1IiwKKwkuaW5pdF9uYW1lID0gICAgICAgImlvcC1tcHUiLAogfTsKIAogc3RhdGljIGludCB3YWl0X21wdV9pZGxlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggZjcxZWE2OC4uNTcxOGRkOCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtNCw3ICs0LDcgQEAKICNkZWZpbmUgX19BU01fQ1JJU19BVE9NSUNfXwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFyY2gvYXRvbWljLmg+CiAKQEAgLTEzLDggKzEzLDYgQEAKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpICgodiktPmNvdW50ZXIpCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL0tjb25maWcgYi9hcmNoL2g4MzAwL0tjb25maWcKaW5kZXggMjhmMDZmZC4uOTQyMDY0OCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9LY29uZmlnCisrKyBiL2FyY2gvaDgzMDAvS2NvbmZpZwpAQCAtMjIwLDYgKzIyMCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyIKKwogc291cmNlICJmcy9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvaDgzMDAvS2NvbmZpZy5kZWJ1ZyIKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGI0Y2YwZWEuLjgzMzE4NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSwxMiArMSwxMyBAQAogI2lmbmRlZiBfX0FSQ0hfSDgzMDBfQVRPTUlDX18KICNkZWZpbmUgX19BUkNIX0g4MzAwX0FUT01JQ19fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAvKgogICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDUwYzJiODMuLmQzNzI5MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE3LDEyICsxNyw2IEBACiAjaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLS8qCi0gKiBPbiBJQS02NCwgY291bnRlciBtdXN0IGFsd2F5cyBiZSB2b2xhdGlsZSB0byBlbnN1cmUgdGhhdCB0aGF0IHRoZQotICogbWVtb3J5IGFjY2Vzc2VzIGFyZSBvcmRlcmVkLgotICovCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIF9fczMyIGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIF9fczY0IGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKIAogI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJKChhdG9taWNfdCkgeyAoaSkgfSkKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKQkoKGF0b21pYzY0X3QpIHsgKGkpIH0pCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGYwNzY4OGQuLjA5N2I4NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC02NzAsOSArNjcwLDExIEBACiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7Ci0JZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgcC0+YWluc24uaW5zdF9mbGFnICYgSU5TVF9GTEFHX0JPT1NUQUJMRSk7Ci0JbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCWlmIChwLT5haW5zbi5pbnNuKSB7CisJCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sCisJCQkgICAgICAgcC0+YWluc24uaW5zdF9mbGFnICYgSU5TVF9GTEFHX0JPT1NUQUJMRSk7CisJCXAtPmFpbnNuLmluc24gPSBOVUxMOworCX0KIH0KIC8qCiAgKiBXZSBhcmUgcmVzdW1pbmcgZXhlY3V0aW9uIGFmdGVyIGEgc2luZ2xlIHN0ZXAgZmF1bHQsIHNvIHRoZSBwdF9yZWdzCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gvaWE2NC9rZXJuZWwvcGNpLWRtYS5jCmluZGV4IDJhOTJmNjMuLmQwYWRhMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGNpLWRtYS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGNpLWRtYS5jCkBAIC0zOSw3ICszOSw3IEBACiAgICBiZSBwcm9iYWJseSBhIHNtYWxsZXIgRE1BIG1hc2ssIGJ1dCB0aGlzIGlzIGJ1Zy10by1idWcgY29tcGF0aWJsZQogICAgdG8gaTM4Ni4gKi8KIHN0cnVjdCBkZXZpY2UgZmFsbGJhY2tfZGV2ID0gewotCS5idXNfaWQgPSAiZmFsbGJhY2sgZGV2aWNlIiwKKwkuaW5pdF9uYW1lID0gImZhbGxiYWNrIGRldmljZSIsCiAJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0ssCiAJLmRtYV9tYXNrID0gJmZhbGxiYWNrX2Rldi5jb2hlcmVudF9kbWFfbWFzaywKIH07CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vaW5pdC5jIGIvYXJjaC9pYTY0L21tL2luaXQuYwppbmRleCAwNTRiY2Q5Li41NmUxMjkwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKQEAgLTY5Miw3ICs2OTIsNyBAQAogCXBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CiAKIAl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBaT05FX05PUk1BTDsKLQlyZXQgPSBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlyZXQgPSBfX2FkZF9wYWdlcyhuaWQsIHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCiAJaWYgKHJldCkKIAkJcHJpbnRrKCIlczogUHJvYmxlbSBlbmNvdW50ZXJlZCBpbiBfX2FkZF9wYWdlcygpIGFzIHJldD0lZFxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYwppbmRleCBhODhlYmEzLi4zZjg2NDIzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCkBAIC0yMDYsOCArMjA2LDcgQEAKIAljeF9kZXYtPmRldi5wYXJlbnQgPSBOVUxMOwogCWN4X2Rldi0+ZGV2LmJ1cyA9ICZ0aW9jeF9idXNfdHlwZTsKIAljeF9kZXYtPmRldi5yZWxlYXNlID0gdGlvY3hfYnVzX3JlbGVhc2U7Ci0Jc25wcmludGYoY3hfZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVkIiwKLQkJIGN4X2Rldi0+Y3hfaWQubmFzaWQpOworCWRldl9zZXRfbmFtZSgmY3hfZGV2LT5kZXYsICIlZCIsIGN4X2Rldi0+Y3hfaWQubmFzaWQpOwogCWRldmljZV9yZWdpc3RlcigmY3hfZGV2LT5kZXYpOwogCWdldF9kZXZpY2UoJmN4X2Rldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBkNTYzMmEzLi42YmI2NzQ4IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX19BUkNIX002OEtOT01NVV9BVE9NSUNfXwogI2RlZmluZSBfX0FSQ0hfTTY4S05PTU1VX0FUT01JQ19fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogLyoKQEAgLTEyLDcgKzEzLDYgQEAKICAqIFdlIGRvIG5vdCBoYXZlIFNNUCBtNjhrIHN5c3RlbXMsIHNvIHdlIGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIHRoYXQuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDEyMzJiZTMuLmM5OTZjM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE1LDEzICsxNSwxMiBAQAogI2RlZmluZSBfQVNNX0FUT01JQ19ICiAKICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KICNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgICB7IChpKSB9CiAKIC8qCkBAIC00MDQsOCArNDAzLDYgQEAKIAogI2lmZGVmIENPTkZJR182NEJJVAogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGxvbmcgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkgICAgeyAoaSkgfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKaW5kZXggMDEwYjI3ZS4uM2NhNWY0MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3ZwZS5jCkBAIC0xNDU0LDcgKzE0NTQsNyBAQAogCWRldmljZV9pbml0aWFsaXplKCZ2cGVfZGV2aWNlKTsKIAl2cGVfZGV2aWNlLmNsYXNzCT0gJnZwZV9jbGFzcywKIAl2cGVfZGV2aWNlLnBhcmVudAk9IE5VTEwsCi0Jc3RybGNweSh2cGVfZGV2aWNlLmJ1c19pZCwgInZwZTEiLCBCVVNfSURfU0laRSk7CisJZGV2X3NldF9uYW1lKCZ2cGVfZGV2aWNlLCAidnBlMSIpOwogCXZwZV9kZXZpY2UuZGV2dCA9IE1LREVWKG1ham9yLCBtaW5vcik7CiAJZXJyID0gZGV2aWNlX2FkZCgmdnBlX2RldmljZSk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA1N2ZjYzRhLi5lZGJmZTI1YyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE1NSwxNCArMTU1LDExIEBACiAjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQogI2VuZGlmCiAKLS8qIE5vdGUgdGhhdCB3ZSBuZWVkIG5vdCBsb2NrIHJlYWQgYWNjZXNzZXMgLSBhbGlnbmVkIHdvcmQgd3JpdGVzL3JlYWRzCi0gKiBhcmUgYXRvbWljLCBzbyBhIHJlYWRlciBuZXZlciBzZWVzIHVuY29uc2lzdGVudCB2YWx1ZXMuCi0gKgotICogQ2FjaGUtbGluZSBhbGlnbm1lbnQgd291bGQgY29uZmxpY3Qgd2l0aCwgZm9yIGV4YW1wbGUsIGxpbnV4L21vZHVsZS5oCisvKgorICogTm90ZSB0aGF0IHdlIG5lZWQgbm90IGxvY2sgcmVhZCBhY2Nlc3NlcyAtIGFsaWduZWQgd29yZCB3cml0ZXMvcmVhZHMKKyAqIGFyZSBhdG9taWMsIHNvIGEgcmVhZGVyIG5ldmVyIHNlZXMgaW5jb25zaXN0ZW50IHZhbHVlcy4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAvKiBJdCdzIHBvc3NpYmxlIHRvIHJlZHVjZSBhbGwgYXRvbWljIG9wZXJhdGlvbnMgdG8gZWl0aGVyCiAgKiBfX2F0b21pY19hZGRfcmV0dXJuLCBhdG9taWNfc2V0IGFuZCBhdG9taWNfcmVhZCAodGhlIGxhdHRlcgogICogaXMgdGhlcmUgb25seSBmb3IgY29uc2lzdGVuY3kpLgpAQCAtMjYwLDggKzI1Nyw2IEBACiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBzNjQgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkgKChhdG9taWM2NF90KSB7IChpKSB9KQogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA0OTliZTViLi5iNDAxOTUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC01LDcgKzUsNyBAQAogICogUG93ZXJQQyBhdG9taWMgb3BlcmF0aW9ucwogICovCiAKLXR5cGVkZWYgc3RydWN0IHsgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtMjUxLDggKzI1MSw2IEBACiAKICNpZmRlZiBfX3Bvd2VycGM2NF9fCiAKLXR5cGVkZWYgc3RydWN0IHsgbG9uZyBjb3VudGVyOyB9IGF0b21pYzY0X3Q7Ci0KICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKQl7IChpKSB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGxvbmcgYXRvbWljNjRfcmVhZChjb25zdCBhdG9taWM2NF90ICp2KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKaW5kZXggMjZmMGQwYWIuLmIxZGFmYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaApAQCAtMTgsNiArMTgsMTIgQEAKIAkJCSAgICAgIHB0ZV90ICpwdGVwKTsKIAogLyoKKyAqIFRoZSB2ZXJzaW9uIG9mIHZtYV9tbXVfcGFnZXNpemUoKSBpbiBhcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBuZWVkcworICogdG8gb3ZlcnJpZGUgdGhlIHZlcnNpb24gaW4gbW0vaHVnZXRsYi5jCisgKi8KKyNkZWZpbmUgdm1hX21tdV9wYWdlc2l6ZSB2bWFfbW11X3BhZ2VzaXplCisKKy8qCiAgKiBJZiB0aGUgYXJjaCBkb2Vzbid0IHN1cHBseSBzb21ldGhpbmcgZWxzZSwgYXNzdW1lIHRoYXQgaHVnZXBhZ2UKICAqIHNpemUgYWxpZ25lZCByZWdpb25zIGFyZSBvayB3aXRob3V0IGZ1cnRoZXIgcHJlcGFyYXRpb24uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggZGU3OTkxNS4uOTg5ZWRjZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTk2LDkgKzk2LDEwIEBACiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7Ci0JZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgMCk7Ci0JbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCWlmIChwLT5haW5zbi5pbnNuKSB7CisJCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOworCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCmluZGV4IDIwMWM3YTUuLjk5MjBkNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCkBAIC01MTIsNiArNTEyLDEzIEBACiAJcmV0dXJuIHNsaWNlX2dldF91bm1hcHBlZF9hcmVhKGFkZHIsIGxlbiwgZmxhZ3MsIG1tdV9wc2l6ZSwgMSwgMCk7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgdm1hX21tdV9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bnNpZ25lZCBpbnQgcHNpemUgPSBnZXRfc2xpY2VfcHNpemUodm1hLT52bV9tbSwgdm1hLT52bV9zdGFydCk7CisKKwlyZXR1cm4gMVVMIDw8IG1tdV9wc2l6ZV90b19zaGlmdChwc2l6ZSk7Cit9CisKIC8qCiAgKiBDYWxsZWQgYnkgYXNtIGhhc2h0YWJsZS5TIGZvciBkb2luZyBsYXp5IGljYWNoZSBmbHVzaAogICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKaW5kZXggNTNiMDZlYi4uZjAwZjA5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21lbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJLyogdGhpcyBzaG91bGQgd29yayBmb3IgbW9zdCBub24taGlnaG1lbSBwbGF0Zm9ybXMgKi8KIAl6b25lID0gcGdkYXRhLT5ub2RlX3pvbmVzOwogCi0JcmV0dXJuIF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCXJldHVybiBfX2FkZF9wYWdlcyhuaWQsIHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogfQogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVRyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMmQxODQ2NS4uZGU0MzJmMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19BUkNIX1MzOTBfQVRPTUlDX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyoKICAqICBpbmNsdWRlL2FzbS1zMzkwL2F0b21pYy5oCkBAIC0yMyw5ICsyNCw2IEBACiAgKiBTMzkwIHVzZXMgJ0NvbXBhcmUgQW5kIFN3YXAnIGZvciBhdG9taWNpdHkgaW4gU01QIGVudmlyb21lbnQKICAqLwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGNvdW50ZXI7Ci19IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpIGF0b21pY190OwogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMTQ5LDkgKzE0Nyw2IEBACiAjdW5kZWYgX19DU19MT09QCiAKICNpZmRlZiBfX3MzOTB4X18KLXR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGxvbmcgY291bnRlcjsKLX0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSkgYXRvbWljNjRfdDsKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKSAgeyAoaSkgfQogCiAjaWYgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zMzkwX3JkZXYuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zMzkwX3JkZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhMjA0NC4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vczM5MF9yZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKgotICogIGluY2x1ZGUvYXNtLXMzOTAvY2N3ZGV2LmgKLSAqCi0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgPGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbT4KLSAqICAgICAgICAgICAgICAgQ2Fyc3RlbiBPdHRlICA8Y290dGVAZGUuaWJtLmNvbT4KLSAqCi0gKiAgSW50ZXJmYWNlIGZvciBzMzkwIHJvb3QgZGV2aWNlCi0gKi8KLQotI2lmbmRlZiBfUzM5MF9SREVWX0hfCi0jZGVmaW5lIF9TMzkwX1JERVZfSF8KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlICpzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gdm9pZCBzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqKTsKLSNlbmRpZiAvKiBfUzM5MF9SREVWX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDU2OTA3OWUuLjliOTI4NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCkBAIC0yMTgsOSArMjE4LDEwIEBACiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7Ci0JZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgMCk7Ci0JbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCWlmIChwLT5haW5zbi5pbnNuKSB7CisJCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOworCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vaW5pdC5jIGIvYXJjaC9zMzkwL21tL2luaXQuYwppbmRleCAxNThiMGQ2Li5mMDI1OGNhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vaW5pdC5jCisrKyBiL2FyY2gvczM5MC9tbS9pbml0LmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCXJjID0gdm1lbV9hZGRfbWFwcGluZyhzdGFydCwgc2l6ZSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBfX2FkZF9wYWdlcyh6b25lLCBQRk5fRE9XTihzdGFydCksIFBGTl9ET1dOKHNpemUpKTsKKwlyYyA9IF9fYWRkX3BhZ2VzKG5pZCwgem9uZSwgUEZOX0RPV04oc3RhcnQpLCBQRk5fRE9XTihzaXplKSk7CiAJaWYgKHJjKQogCQl2bWVtX3JlbW92ZV9tYXBwaW5nKHN0YXJ0LCBzaXplKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBjMDQzZWYwLi42MzI3ZmZiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTcsMTYgKzcsMTUgQEAKICAqCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCSggKGF0b21pY190KSB7IChpKSB9ICkKIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKICNkZWZpbmUgYXRvbWljX3NldCh2LGkpCQkoKHYpLT5jb3VudGVyID0gKGkpKQogCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KICNpZiBkZWZpbmVkKENPTkZJR19HVVNBX1JCKQogI2luY2x1ZGUgPGFzbS9hdG9taWMtZ3JiLmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0QSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCmluZGV4IDg4ODA3YTIuLmMwYWEzZDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pbml0LmMgYi9hcmNoL3NoL21tL2luaXQuYwppbmRleCA2Y2JlZjhjLi4zZWRmMjk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2luaXQuYworKysgYi9hcmNoL3NoL21tL2luaXQuYwpAQCAtMzExLDcgKzMxMSw4IEBACiAJcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKIAogCS8qIFdlIG9ubHkgaGF2ZSBaT05FX05PUk1BTCwgc28gdGhpcyBpcyBlYXN5Li4gKi8KLQlyZXQgPSBfX2FkZF9wYWdlcyhwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlyZXQgPSBfX2FkZF9wYWdlcyhuaWQsIHBnZGF0LT5ub2RlX3pvbmVzICsgWk9ORV9OT1JNQUwsCisJCQkJc3RhcnRfcGZuLCBucl9wYWdlcyk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCXByaW50aygiJXM6IEZhaWxlZCwgX19hZGRfcGFnZXMoKSA9PSAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY18zMi5oCmluZGV4IDVjOTQ0YjUuLmNlNDY1OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaApAQCAtMTMsOCArMTMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2lmZGVmIF9fS0VSTkVMX18KIAogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKaW5kZXggNTk4MmM1YS4uYTBhNzA2NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY182NC5oCkBAIC0xMCw5ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIF9fczY0IGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJeyAoaSkgfQogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpCXsgKGkpIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHJhcC5jIGIvYXJjaC91bS9rZXJuZWwvdHJhcC5jCmluZGV4IDQ0ZTQ5MDQuLjczODRkOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RyYXAuYworKysgYi9hcmNoL3VtL2tlcm5lbC90cmFwLmMKQEAgLTY0LDExICs2NCwxMCBAQAogCiAJZG8gewogCQlpbnQgZmF1bHQ7Ci1zdXJ2aXZlOgorCiAJCWZhdWx0ID0gaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIGFkZHJlc3MsIGlzX3dyaXRlKTsKIAkJaWYgKHVubGlrZWx5KGZhdWx0ICYgVk1fRkFVTFRfRVJST1IpKSB7CiAJCQlpZiAoZmF1bHQgJiBWTV9GQVVMVF9PT00pIHsKLQkJCQllcnIgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0X29mX21lbW9yeTsKIAkJCX0gZWxzZSBpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpIHsKIAkJCQllcnIgPSAtRUFDQ0VTOwpAQCAtMTA0LDE4ICsxMDMsMTQgQEAKIG91dF9ub3NlbWFwaG9yZToKIAlyZXR1cm4gZXJyOwogCi0vKgotICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMgdGhhdCBtYWRlCi0gKiB1cyB1bmFibGUgdG8gaGFuZGxlIHRoZSBwYWdlIGZhdWx0IGdyYWNlZnVsbHkuCi0gKi8KIG91dF9vZl9tZW1vcnk6Ci0JaWYgKGlzX2dsb2JhbF9pbml0KGN1cnJlbnQpKSB7Ci0JCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JCXlpZWxkKCk7Ci0JCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQkJZ290byBzdXJ2aXZlOwotCX0KLQlnb3RvIG91dDsKKwkvKgorCSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBjYWxsIHRoZSBPT00ga2lsbGVyLCBhbmQgcmV0dXJuIHRoZSB1c2Vyc3BhY2UKKwkgKiAod2hpY2ggd2lsbCByZXRyeSB0aGUgZmF1bHQsIG9yIGtpbGwgdXMgaWYgd2UgZ290IG9vbS1raWxsZWQpLgorCSAqLworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcGFnZWZhdWx0X291dF9vZl9tZW1vcnkoKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYmFkX3NlZ3Yoc3RydWN0IGZhdWx0aW5mbyBmaSwgdW5zaWduZWQgbG9uZyBpcCkKQEAgLTIxNCw5ICsyMDksNiBAQAogCQlzaS5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcmVzczsKIAkJY3VycmVudC0+dGhyZWFkLmFyY2guZmF1bHRpbmZvID0gZmk7CiAJCWZvcmNlX3NpZ19pbmZvKFNJR0JVUywgJnNpLCBjdXJyZW50KTsKLQl9IGVsc2UgaWYgKGVyciA9PSAtRU5PTUVNKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlZNOiBraWxsaW5nIHByb2Nlc3MgJXNcbiIsIGN1cnJlbnQtPmNvbW0pOwotCQlkb19leGl0KFNJR0tJTEwpOwogCX0gZWxzZSB7CiAJCUJVR19PTihlcnIgIT0gLUVGQVVMVCk7CiAJCXNpLnNpX3NpZ25vID0gU0lHU0VHVjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY18zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKaW5kZXggYWQ1YjlmNi4uODViNDZmYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9BU01fWDg2X0FUT01JQ18zMl9ICiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9jbXB4Y2hnLmg+CiAKQEAgLTEwLDE1ICsxMSw2IEBACiAgKiByZXNvdXJjZSBjb3VudGluZyBldGMuLgogICovCiAKLS8qCi0gKiBNYWtlIHN1cmUgZ2NjIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlciBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kCi0gKiBvbiB1cy4gV2UgbmVlZCB0byB1c2UgX2V4YWN0bHlfIHRoZSBhZGRyZXNzIHRoZSB1c2VyIGdhdmUgdXMsCi0gKiBub3Qgc29tZSBhbGlhcyB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGNvdW50ZXI7Ci19IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY182NC5oCmluZGV4IDI3OWQyYTczLi44YzIxNzMxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaApAQCAtMSwyNSArMSwxNSBAQAogI2lmbmRlZiBfQVNNX1g4Nl9BVE9NSUNfNjRfSAogI2RlZmluZSBfQVNNX1g4Nl9BVE9NSUNfNjRfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KICNpbmNsdWRlIDxhc20vY21weGNoZy5oPgogCi0vKiBhdG9taWNfdCBzaG91bGQgYmUgMzIgYml0IHNpZ25lZCB0eXBlICovCi0KIC8qCiAgKiBBdG9taWMgb3BlcmF0aW9ucyB0aGF0IEMgY2FuJ3QgZ3VhcmFudGVlIHVzLiAgVXNlZnVsIGZvcgogICogcmVzb3VyY2UgY291bnRpbmcgZXRjLi4KICAqLwogCi0vKgotICogTWFrZSBzdXJlIGdjYyBkb2Vzbid0IHRyeSB0byBiZSBjbGV2ZXIgYW5kIG1vdmUgdGhpbmdzIGFyb3VuZAotICogb24gdXMuIFdlIG5lZWQgdG8gdXNlIF9leGFjdGx5XyB0aGUgYWRkcmVzcyB0aGUgdXNlciBnYXZlIHVzLAotICogbm90IHNvbWUgYWxpYXMgdGhhdCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBjb3VudGVyOwotfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKIC8qKgpAQCAtMTkxLDExICsxODEsNyBAQAogI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSAgKGF0b21pY19hZGRfcmV0dXJuKDEsIHYpKQogI2RlZmluZSBhdG9taWNfZGVjX3JldHVybih2KSAgKGF0b21pY19zdWJfcmV0dXJuKDEsIHYpKQogCi0vKiBBbiA2NGJpdCBhdG9taWMgdHlwZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JbG9uZyBjb3VudGVyOwotfSBhdG9taWM2NF90OworLyogVGhlIDY0LWJpdCBhdG9taWMgdHlwZSAqLwogCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkJeyAoaSkgfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bndpbmQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vud2luZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjA2NGJkLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vud2luZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1g4Nl9VTldJTkRfSAotI2RlZmluZSBfQVNNX1g4Nl9VTldJTkRfSAotCi0jZGVmaW5lIFVOV19QQyhmcmFtZSkgKCh2b2lkKShmcmFtZSksIDBVTCkKLSNkZWZpbmUgVU5XX1NQKGZyYW1lKSAoKHZvaWQpKGZyYW1lKSwgMFVMKQotI2RlZmluZSBVTldfRlAoZnJhbWUpICgodm9pZCkoZnJhbWUpLCAwVUwpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGFyY2hfdW53X3VzZXJfbW9kZShjb25zdCB2b2lkICppbmZvKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogX0FTTV9YODZfVU5XSU5EX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDZjMjc2NzkuLmVlYWQ2ZjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYwpAQCAtMzc2LDkgKzM3NiwxMCBAQAogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIChwLT5haW5zbi5ib29zdGFibGUgPT0gMSkpOwotCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlpZiAocC0+YWluc24uaW5zbikgeworCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAocC0+YWluc24uYm9vc3RhYmxlID09IDEpKTsKKwkJcC0+YWluc24uaW5zbiA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgc2F2ZV9wcmV2aW91c19rcHJvYmUoc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggY2U2NjUwZS4uYzlhNjY2YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KQEAgLTUxLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9mYXVsdC5jIGIvYXJjaC94ODYvbW0vZmF1bHQuYwppbmRleCA1N2VjOGM4Li45ZTI2OGI2YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCkBAIC02NjcsNyArNjY3LDYgQEAKIAlpZiAodW5saWtlbHkoaW5fYXRvbWljKCkgfHwgIW1tKSkKIAkJZ290byBiYWRfYXJlYV9ub3NlbWFwaG9yZTsKIAotYWdhaW46CiAJLyoKIAkgKiBXaGVuIHJ1bm5pbmcgaW4gdGhlIGtlcm5lbCB3ZSBleHBlY3QgZmF1bHRzIHRvIG9jY3VyIG9ubHkgdG8KIAkgKiBhZGRyZXNzZXMgaW4gdXNlciBzcGFjZS4gIEFsbCBvdGhlciBmYXVsdHMgcmVwcmVzZW50IGVycm9ycyBpbiB0aGUKQEAgLTg1OSwyNSArODU4LDE0IEBACiAJb29wc19lbmQoZmxhZ3MsIHJlZ3MsIHNpZyk7CiAjZW5kaWYKIAotLyoKLSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBvciBzb21lIG90aGVyIHRoaW5nIGhhcHBlbmVkIHRvIHVzIHRoYXQgbWFkZQotICogdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgotICovCiBvdXRfb2ZfbWVtb3J5OgorCS8qCisJICogV2UgcmFuIG91dCBvZiBtZW1vcnksIGNhbGwgdGhlIE9PTSBraWxsZXIsIGFuZCByZXR1cm4gdGhlIHVzZXJzcGFjZQorCSAqICh3aGljaCB3aWxsIHJldHJ5IHRoZSBmYXVsdCwgb3Iga2lsbCB1cyBpZiB3ZSBnb3Qgb29tLWtpbGxlZCkuCisJICovCiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQlpZiAoaXNfZ2xvYmFsX2luaXQodHNrKSkgewotCQl5aWVsZCgpOwotCQkvKgotCQkgKiBSZS1sb29rdXAgdGhlIHZtYSAtIGluIHRoZW9yeSB0aGUgdm1hIHRyZWUgbWlnaHQKLQkJICogaGF2ZSBjaGFuZ2VkOgotCQkgKi8KLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQlwcmludGsoIlZNOiBraWxsaW5nIHByb2Nlc3MgJXNcbiIsIHRzay0+Y29tbSk7Ci0JaWYgKGVycm9yX2NvZGUgJiBQRl9VU0VSKQotCQlkb19ncm91cF9leGl0KFNJR0tJTEwpOwotCWdvdG8gbm9fY29udGV4dDsKKwlwYWdlZmF1bHRfb3V0X29mX21lbW9yeSgpOworCXJldHVybjsKIAogZG9fc2lnYnVzOgogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzMyLmMgYi9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKaW5kZXggZjk5YTZjNi4uNTQ0ZDcyNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfMzIuYwpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKIAotCXJldHVybiBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlyZXR1cm4gX19hZGRfcGFnZXMobmlkLCB6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKaW5kZXggOWY3YTBkMi4uNTRjNDM3ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwpAQCAtODU3LDcgKzg1Nyw3IEBACiAJaWYgKGxhc3RfbWFwcGVkX3BmbiA+IG1heF9wZm5fbWFwcGVkKQogCQltYXhfcGZuX21hcHBlZCA9IGxhc3RfbWFwcGVkX3BmbjsKIAotCXJldCA9IF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCXJldCA9IF9fYWRkX3BhZ2VzKG5pZCwgem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CiAJV0FSTl9PTl9PTkNFKHJldCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLmMgYi9ibG9jay9ic2cuYwppbmRleCBlNzNlNTBkLi5kNDE0YmI1IDEwMDY0NAotLS0gYS9ibG9jay9ic2cuYworKysgYi9ibG9jay9ic2cuYwpAQCAtNDIsNyArNDIsNyBAQAogCWludCBkb25lX2NtZHM7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FfZG9uZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9mcmVlOwotCWNoYXIgbmFtZVtCVVNfSURfU0laRV07CisJY2hhciBuYW1lWzIwXTsKIAlpbnQgbWF4X3F1ZXVlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwpAQCAtNzgxLDcgKzc4MSw3IEBACiAJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKIAlobGlzdF9hZGRfaGVhZCgmYmQtPmRldl9saXN0LCBic2dfZGV2X2lkeF9oYXNoKGltaW5vcihpbm9kZSkpKTsKIAotCXN0cm5jcHkoYmQtPm5hbWUsIHJxLT5ic2dfZGV2LmNsYXNzX2Rldi0+YnVzX2lkLCBzaXplb2YoYmQtPm5hbWUpIC0gMSk7CisJc3RybmNweShiZC0+bmFtZSwgZGV2X25hbWUocnEtPmJzZ19kZXYuY2xhc3NfZGV2KSwgc2l6ZW9mKGJkLT5uYW1lKSAtIDEpOwogCWRwcmludGsoImJvdW5kIHRvIDwlcz4sIG1heCBxdWV1ZSAlZFxuIiwKIAkJZm9ybWF0X2Rldl90KGJ1ZiwgaW5vZGUtPmlfcmRldiksIGJkLT5tYXhfcXVldWUpOwogCkBAIC05OTIsNyArOTkyLDcgQEAKIAlpZiAobmFtZSkKIAkJZGV2bmFtZSA9IG5hbWU7CiAJZWxzZQotCQlkZXZuYW1lID0gcGFyZW50LT5idXNfaWQ7CisJCWRldm5hbWUgPSBkZXZfbmFtZShwYXJlbnQpOwogCiAJLyoKIAkgKiB3ZSBuZWVkIGEgcHJvcGVyIHRyYW5zcG9ydCB0byBzZW5kIGNvbW1hbmRzLCBub3QgYSBzdGFja2VkIGRldmljZQpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggZDg0YTdkZi4uMzk3OTYwYyAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC0xMDg0LDcgKzEwODQsNyBAQAogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CiAJCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CiAKLQkJaWYgKHN0cmNtcChkZXYtPmJ1c19pZCwgbmFtZSkpCisJCWlmIChzdHJjbXAoZGV2X25hbWUoZGV2KSwgbmFtZSkpCiAJCQljb250aW51ZTsKIAogCQlwYXJ0ID0gZGlza19nZXRfcGFydChkaXNrLCBwYXJ0bm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwppbmRleCAzOGFjYTA0Li42NmE5ZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvc19wYXJhbXMuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAKIC8qCiAgKiBJbmNsdWRlIHRoZSBhcGljIGRlZmluaXRpb25zIGZvciB4ODYgdG8gaGF2ZSB0aGUgQVBJQyB0aW1lciByZWxhdGVkIGRlZmluZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDQwNDBkOGIuLjllOTIxMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMzM2OSw3ICszMzY5LDcgQEAKIAogCWlmIChzZGV2KSB7CiAJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiZGV0YWNoaW5nIChTQ1NJICVzKVxuIiwKLQkJCSAgICAgICBzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQpOworCQkJICAgICAgIGRldl9uYW1lKCZzZGV2LT5zZGV2X2dlbmRldikpOwogCiAJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKIAkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYyBiL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKaW5kZXggZjU3NjUyZC4uYjljZGEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAkJaWMtPmNsYXNzZGV2LnBhcmVudCA9IGdldF9kZXZpY2UoZGV2KTsKIAkJaWMtPmNsYXNzZGV2LmNsYXNzID0gY29udC0+Y2xhc3M7CiAJCWNvbnQtPmNsYXNzLT5kZXZfcmVsZWFzZSA9IGF0dHJpYnV0ZV9jb250YWluZXJfcmVsZWFzZTsKLQkJc3RyY3B5KGljLT5jbGFzc2Rldi5idXNfaWQsIGRldi0+YnVzX2lkKTsKKwkJZGV2X3NldF9uYW1lKCZpYy0+Y2xhc3NkZXYsIGRldl9uYW1lKGRldikpOwogCQlpZiAoZm4pCiAJCQlmbihjb250LCBkZXYsICZpYy0+Y2xhc3NkZXYpOwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaAppbmRleCAwYTVmMDU1Li5iNjc2ZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oCisrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKQEAgLTYzLDYgKzYzLDMyIEBACiAjZGVmaW5lIHRvX2NsYXNzKG9iaikJXAogCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBjbGFzc19wcml2YXRlLCBjbGFzc19zdWJzeXMua29iaikKIAorLyoqCisgKiBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgLSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcHJpdmF0ZSB0byB0aGUgZHJpdmVyIGNvcmUgcG9ydGlvbnMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKgorICogQGtsaXN0X2NoaWxkcmVuIC0ga2xpc3QgY29udGFpbmluZyBhbGwgY2hpbGRyZW4gb2YgdGhpcyBkZXZpY2UKKyAqIEBrbm9kZV9wYXJlbnQgLSBub2RlIGluIHNpYmxpbmcgbGlzdAorICogQGtub2RlX2RyaXZlciAtIG5vZGUgaW4gZHJpdmVyIGxpc3QKKyAqIEBrbm9kZV9idXMgLSBub2RlIGluIGJ1cyBsaXN0CisgKiBAZGV2aWNlIC0gcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgY2xhc3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcworICogYXNzb2NpYXRlZCB3aXRoLgorICoKKyAqIE5vdGhpbmcgb3V0c2lkZSBvZiB0aGUgZHJpdmVyIGNvcmUgc2hvdWxkIGV2ZXIgdG91Y2ggdGhlc2UgZmllbGRzLgorICovCitzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgeworCXN0cnVjdCBrbGlzdCBrbGlzdF9jaGlsZHJlbjsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSBrbm9kZV9wYXJlbnQ7CisJc3RydWN0IGtsaXN0X25vZGUga25vZGVfZHJpdmVyOworCXN0cnVjdCBrbGlzdF9ub2RlIGtub2RlX2J1czsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Cit9OworI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQob2JqKQlcCisJY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpCisjZGVmaW5lIHRvX2RldmljZV9wcml2YXRlX2RyaXZlcihvYmopCVwKKwljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUsIGtub2RlX2RyaXZlcikKKyNkZWZpbmUgdG9fZGV2aWNlX3ByaXZhdGVfYnVzKG9iaikJXAorCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSwga25vZGVfYnVzKQorCiAvKiBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgZGV2aWNlc19pbml0KHZvaWQpOwogZXh0ZXJuIGludCBidXNlc19pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IDVhZWUxYzAuLjBmMGE1MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTI1Myw3ICsyNTMsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0JcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKSA6IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CisKKwlpZiAobikgeworCQlkZXZfcHJ2ID0gdG9fZGV2aWNlX3ByaXZhdGVfYnVzKG4pOworCQlkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIC8qKgpAQCAtMjg2LDcgKzI5Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJa2xpc3RfaXRlcl9pbml0X25vZGUoJmJ1cy0+cC0+a2xpc3RfZGV2aWNlcywgJmksCi0JCQkgICAgIChzdGFydCA/ICZzdGFydC0+a25vZGVfYnVzIDogTlVMTCkpOworCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPnAtPmtub2RlX2J1cyA6IE5VTEwpKTsKIAl3aGlsZSAoKGRldiA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGRldiwgZGF0YSk7CiAJa2xpc3RfaXRlcl9leGl0KCZpKTsKQEAgLTMyMCw3ICszMjcsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZidXMtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPmtub2RlX2J1cyA6IE5VTEwpKTsKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9idXMgOiBOVUxMKSk7CiAJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpKQogCQlpZiAobWF0Y2goZGV2LCBkYXRhKSAmJiBnZXRfZGV2aWNlKGRldikpCiAJCQlicmVhazsKQEAgLTMzMyw3ICszNDAsNyBAQAogewogCWNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhOwogCi0JcmV0dXJuIHN5c2ZzX3N0cmVxKG5hbWUsIGRldi0+YnVzX2lkKTsKKwlyZXR1cm4gc3lzZnNfc3RyZXEobmFtZSwgZGV2X25hbWUoZGV2KSk7CiB9CiAKIC8qKgpAQCAtNDYxLDEyICs0NjgsMTIgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGJ1cykgewotCQlwcl9kZWJ1ZygiYnVzOiAnJXMnOiBhZGQgZGV2aWNlICVzXG4iLCBidXMtPm5hbWUsIGRldi0+YnVzX2lkKTsKKwkJcHJfZGVidWcoImJ1czogJyVzJzogYWRkIGRldmljZSAlc1xuIiwgYnVzLT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKIAkJZXJyb3IgPSBkZXZpY2VfYWRkX2F0dHJzKGJ1cywgZGV2KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfcHV0OwogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwKLQkJCQkJCSZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkJCSZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9pZDsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLApAQCAtNDgyLDcgKzQ4OSw3IEBACiBvdXRfZGVwcmVjYXRlZDoKIAlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAic3Vic3lzdGVtIik7CiBvdXRfc3Vic3lzOgotCXN5c2ZzX3JlbW92ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwgZGV2LT5idXNfaWQpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiBvdXRfaWQ6CiAJZGV2aWNlX3JlbW92ZV9hdHRycyhidXMsIGRldik7CiBvdXRfcHV0OgpAQCAtNTA3LDcgKzUxNCw4IEBACiAJCQlyZXQgPSBkZXZpY2VfYXR0YWNoKGRldik7CiAJCVdBUk5fT04ocmV0IDwgMCk7CiAJCWlmIChyZXQgPj0gMCkKLQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2J1cywgJmJ1cy0+cC0+a2xpc3RfZGV2aWNlcyk7CisJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9idXMsCisJCQkJICAgICAgICZidXMtPnAtPmtsaXN0X2RldmljZXMpOwogCX0KIH0KIApAQCAtNTI2LDEzICs1MzQsMTMgQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwogCQlyZW1vdmVfZGVwcmVjYXRlZF9idXNfbGlua3MoZGV2KTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+YnVzLT5wLT5kZXZpY2VzX2tzZXQtPmtvYmosCi0JCQkJICBkZXYtPmJ1c19pZCk7CisJCQkJICBkZXZfbmFtZShkZXYpKTsKIAkJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYtPmJ1cywgZGV2KTsKLQkJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+a25vZGVfYnVzKSkKLQkJCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9idXMpOworCQlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmZGV2LT5wLT5rbm9kZV9idXMpKQorCQkJa2xpc3RfZGVsKCZkZXYtPnAtPmtub2RlX2J1cyk7CiAKIAkJcHJfZGVidWcoImJ1czogJyVzJzogcmVtb3ZlIGRldmljZSAlc1xuIiwKLQkJCSBkZXYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpOworCQkJIGRldi0+YnVzLT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKIAkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7CiAJCWJ1c19wdXQoZGV2LT5idXMpOwogCX0KQEAgLTgzMSwxNCArODM5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CiAKIAlnZXRfZGV2aWNlKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CiAKIAlwdXRfZGV2aWNlKGRldik7CiB9CkBAIC05OTMsMTggKzEwMDMsMjAgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJc3RydWN0IGtsaXN0X25vZGUgKm47CisJc3RydWN0IGRldmljZV9wcml2YXRlICpkZXZfcHJ2OwogCXN0cnVjdCBkZXZpY2UgKmI7CiAKIAlsaXN0X2Zvcl9lYWNoKHBvcywgbGlzdCkgewogCQluID0gY29udGFpbmVyX29mKHBvcywgc3RydWN0IGtsaXN0X25vZGUsIG5fbm9kZSk7Ci0JCWIgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwkJYiA9IGRldl9wcnYtPmRldmljZTsKIAkJaWYgKGNvbXBhcmUoYSwgYikgPD0gMCkgewotCQkJbGlzdF9tb3ZlX3RhaWwoJmEtPmtub2RlX2J1cy5uX25vZGUsCi0JCQkJICAgICAgICZiLT5rbm9kZV9idXMubl9ub2RlKTsKKwkJCWxpc3RfbW92ZV90YWlsKCZhLT5wLT5rbm9kZV9idXMubl9ub2RlLAorCQkJCSAgICAgICAmYi0+cC0+a25vZGVfYnVzLm5fbm9kZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0JbGlzdF9tb3ZlX3RhaWwoJmEtPmtub2RlX2J1cy5uX25vZGUsIGxpc3QpOworCWxpc3RfbW92ZV90YWlsKCZhLT5wLT5rbm9kZV9idXMubl9ub2RlLCBsaXN0KTsKIH0KIAogdm9pZCBidXNfc29ydF9icmVhZHRoZmlyc3Qoc3RydWN0IGJ1c190eXBlICpidXMsCkBAIC0xMDE0LDYgKzEwMjYsNyBAQAogCUxJU1RfSEVBRChzb3J0ZWRfZGV2aWNlcyk7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdG1wOwogCXN0cnVjdCBrbGlzdF9ub2RlICpuOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGtsaXN0ICpkZXZpY2Vfa2xpc3Q7CiAKQEAgLTEwMjIsNyArMTAzNSw4IEBACiAJc3Bpbl9sb2NrKCZkZXZpY2Vfa2xpc3QtPmtfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmZGV2aWNlX2tsaXN0LT5rX2xpc3QpIHsKIAkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOwotCQlkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwkJZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOwogCQlkZXZpY2VfaW5zZXJ0aW9uX3NvcnRfa2xpc3QoZGV2LCAmc29ydGVkX2RldmljZXMsIGNvbXBhcmUpOwogCX0KIAlsaXN0X3NwbGljZSgmc29ydGVkX2RldmljZXMsICZkZXZpY2Vfa2xpc3QtPmtfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA4YzJjYzI2Li42MWRmNTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTEwOSw2ICsxMDksNyBAQAogc3RhdGljIHZvaWQgZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmopOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqcCA9IGRldi0+cDsKIAogCWlmIChkZXYtPnJlbGVhc2UpCiAJCWRldi0+cmVsZWFzZShkZXYpOwpAQCAtMTE5LDcgKzEyMCw4IEBACiAJZWxzZQogCQlXQVJOKDEsIEtFUk5fRVJSICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBoYXZlIGEgcmVsZWFzZSgpICIKIAkJCSJmdW5jdGlvbiwgaXQgaXMgYnJva2VuIGFuZCBtdXN0IGJlIGZpeGVkLlxuIiwKLQkJCWRldi0+YnVzX2lkKTsKKwkJCWRldl9uYW1lKGRldikpOworCWtmcmVlKHApOwogfQogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBkZXZpY2Vfa3R5cGUgPSB7CkBAIC0yMDksNyArMjExLDcgQEAKIAkJcmV0dmFsID0gZGV2LT5idXMtPnVldmVudChkZXYsIGVudik7CiAJCWlmIChyZXR2YWwpCiAJCQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlczogYnVzIHVldmVudCgpIHJldHVybmVkICVkXG4iLAotCQkJCSBkZXYtPmJ1c19pZCwgX19mdW5jX18sIHJldHZhbCk7CisJCQkJIGRldl9uYW1lKGRldiksIF9fZnVuY19fLCByZXR2YWwpOwogCX0KIAogCS8qIGhhdmUgdGhlIGNsYXNzIHNwZWNpZmljIGZ1bmN0aW9uIGFkZCBpdHMgc3R1ZmYgKi8KQEAgLTIxNyw3ICsyMTksNyBAQAogCQlyZXR2YWwgPSBkZXYtPmNsYXNzLT5kZXZfdWV2ZW50KGRldiwgZW52KTsKIAkJaWYgKHJldHZhbCkKIAkJCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiBjbGFzcyB1ZXZlbnQoKSAiCi0JCQkJICJyZXR1cm5lZCAlZFxuIiwgZGV2LT5idXNfaWQsCisJCQkJICJyZXR1cm5lZCAlZFxuIiwgZGV2X25hbWUoZGV2KSwKIAkJCQkgX19mdW5jX18sIHJldHZhbCk7CiAJfQogCkBAIC0yMjYsNyArMjI4LDcgQEAKIAkJcmV0dmFsID0gZGV2LT50eXBlLT51ZXZlbnQoZGV2LCBlbnYpOwogCQlpZiAocmV0dmFsKQogCQkJcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IGRldl90eXBlIHVldmVudCgpICIKLQkJCQkgInJldHVybmVkICVkXG4iLCBkZXYtPmJ1c19pZCwKKwkJCQkgInJldHVybmVkICVkXG4iLCBkZXZfbmFtZShkZXYpLAogCQkJCSBfX2Z1bmNfXywgcmV0dmFsKTsKIAl9CiAKQEAgLTUwNywxNCArNTA5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGtsaXN0X2NoaWxkcmVuX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKnAgPSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQobik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcC0+ZGV2aWNlOwogCiAJZ2V0X2RldmljZShkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBrbGlzdF9jaGlsZHJlbl9wdXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX3BhcmVudCk7CisJc3RydWN0IGRldmljZV9wcml2YXRlICpwID0gdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG4pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHAtPmRldmljZTsKIAogCXB1dF9kZXZpY2UoZGV2KTsKIH0KQEAgLTUzNiw5ICs1NDAsMTUgQEAKICAqLwogdm9pZCBkZXZpY2VfaW5pdGlhbGl6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJZGV2LT5wID0ga3phbGxvYyhzaXplb2YoKmRldi0+cCksIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5wKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisJZGV2LT5wLT5kZXZpY2UgPSBkZXY7CiAJZGV2LT5rb2JqLmtzZXQgPSBkZXZpY2VzX2tzZXQ7CiAJa29iamVjdF9pbml0KCZkZXYtPmtvYmosICZkZXZpY2Vfa3R5cGUpOwotCWtsaXN0X2luaXQoJmRldi0+a2xpc3RfY2hpbGRyZW4sIGtsaXN0X2NoaWxkcmVuX2dldCwKKwlrbGlzdF9pbml0KCZkZXYtPnAtPmtsaXN0X2NoaWxkcmVuLCBrbGlzdF9jaGlsZHJlbl9nZXQsCiAJCSAgIGtsaXN0X2NoaWxkcmVuX3B1dCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZG1hX3Bvb2xzKTsKIAlpbml0X01VVEVYKCZkZXYtPnNlbSk7CkBAIC02NzIsNyArNjgyLDcgQEAKIAlpZiAoZGV2LT5rb2JqLnBhcmVudCAhPSAmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmogJiYKIAkgICAgZGV2aWNlX2lzX25vdF9wYXJ0aXRpb24oZGV2KSkgewogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkJICAmZGV2LT5rb2JqLCBkZXYtPmJ1c19pZCk7CisJCQkJCSAgJmRldi0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3N1YnN5czsKIAl9CkBAIC03MTIsMTEgKzcyMiwxMSBAQAogCWlmIChkZXYtPmtvYmoucGFyZW50ICE9ICZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiAmJgogCSAgICBkZXZpY2VfaXNfbm90X3BhcnRpdGlvbihkZXYpKQogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJICBkZXYtPmJ1c19pZCk7CisJCQkJICBkZXZfbmFtZShkZXYpKTsKICNlbHNlCiAJLyogbGluayBpbiB0aGUgY2xhc3MgZGlyZWN0b3J5IHBvaW50aW5nIHRvIHRoZSBkZXZpY2UgKi8KIAllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkgICZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkgICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfc3Vic3lzOwogCkBAIC03MjksNyArNzM5LDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2J1c2lkOgotCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgZGV2LT5idXNfaWQpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgZGV2X25hbWUoZGV2KSk7CiAjZW5kaWYKIAogb3V0X3N1YnN5czoKQEAgLTc1OCwxMiArNzY4LDEyIEBACiAJaWYgKGRldi0+a29iai5wYXJlbnQgIT0gJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqICYmCiAJICAgIGRldmljZV9pc19ub3RfcGFydGl0aW9uKGRldikpCiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkgIGRldi0+YnVzX2lkKTsKKwkJCQkgIGRldl9uYW1lKGRldikpOwogI2Vsc2UKIAlpZiAoZGV2LT5wYXJlbnQgJiYgZGV2aWNlX2lzX25vdF9wYXJ0aXRpb24oZGV2KSkKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRldmljZSIpOwogCi0Jc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCBkZXYtPmJ1c19pZCk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCBkZXZfbmFtZShkZXYpKTsKICNlbmRpZgogCiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwpAQCAtODY2LDcgKzg3Niw3IEBACiAJaWYgKCFzdHJsZW4oZGV2LT5idXNfaWQpKQogCQlnb3RvIGRvbmU7CiAKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCiAJcGFyZW50ID0gZ2V0X2RldmljZShkZXYtPnBhcmVudCk7CiAJc2V0dXBfcGFyZW50KGRldiwgcGFyZW50KTsKQEAgLTg3Niw3ICs4ODYsNyBAQAogCQlzZXRfZGV2X25vZGUoZGV2LCBkZXZfdG9fbm9kZShwYXJlbnQpKTsKIAogCS8qIGZpcnN0LCByZWdpc3RlciB3aXRoIGdlbmVyaWMgbGF5ZXIuICovCi0JZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqLCBkZXYtPmtvYmoucGFyZW50LCAiJXMiLCBkZXYtPmJ1c19pZCk7CisJZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqLCBkZXYtPmtvYmoucGFyZW50LCAiJXMiLCBkZXZfbmFtZShkZXYpKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gRXJyb3I7CiAKQEAgLTg4NCwxMSArODk0LDYgQEAKIAlpZiAocGxhdGZvcm1fbm90aWZ5KQogCQlwbGF0Zm9ybV9ub3RpZnkoZGV2KTsKIAotCS8qIG5vdGlmeSBjbGllbnRzIG9mIGRldmljZSBlbnRyeSAobmV3IHdheSkgKi8KLQlpZiAoZGV2LT5idXMpCi0JCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCi0JCQkJCSAgICAgQlVTX05PVElGWV9BRERfREVWSUNFLCBkZXYpOwotCiAJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmdWV2ZW50X2F0dHIpOwogCWlmIChlcnJvcikKIAkJZ290byBhdHRyRXJyb3I7CkBAIC05MTYsMTAgKzkyMSwxOSBAQAogCWlmIChlcnJvcikKIAkJZ290byBEUE1FcnJvcjsKIAlkZXZpY2VfcG1fYWRkKGRldik7CisKKwkvKiBOb3RpZnkgY2xpZW50cyBvZiBkZXZpY2UgYWRkaXRpb24uICBUaGlzIGNhbGwgbXVzdCBjb21lCisJICogYWZ0ZXIgZHBtX3N5c2ZfYWRkKCkgYW5kIGJlZm9yZSBrb2JqZWN0X3VldmVudCgpLgorCSAqLworCWlmIChkZXYtPmJ1cykKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKKwkJCQkJICAgICBCVVNfTk9USUZZX0FERF9ERVZJQ0UsIGRldik7CisKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0FERCk7CiAJYnVzX2F0dGFjaF9kZXZpY2UoZGV2KTsKIAlpZiAocGFyZW50KQotCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsICZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKKwkJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfcGFyZW50LAorCQkJICAgICAgICZwYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuKTsKIAogCWlmIChkZXYtPmNsYXNzKSB7CiAJCW11dGV4X2xvY2soJmRldi0+Y2xhc3MtPnAtPmNsYXNzX211dGV4KTsKQEAgLTk0MCw5ICs5NTQsNiBAQAogIERQTUVycm9yOgogCWJ1c19yZW1vdmVfZGV2aWNlKGRldik7CiAgQnVzRXJyb3I6Ci0JaWYgKGRldi0+YnVzKQotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAotCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlkZXZpY2VfcmVtb3ZlX2F0dHJzKGRldik7CiAgQXR0cnNFcnJvcjoKIAlkZXZpY2VfcmVtb3ZlX2NsYXNzX3N5bWxpbmtzKGRldik7CkBAIC0xMDI3LDEwICsxMDM4LDE2IEBACiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAJc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZjsKIAorCS8qIE5vdGlmeSBjbGllbnRzIG9mIGRldmljZSByZW1vdmFsLiAgVGhpcyBjYWxsIG11c3QgY29tZQorCSAqIGJlZm9yZSBkcG1fc3lzZnNfcmVtb3ZlKCkuCisJICovCisJaWYgKGRldi0+YnVzKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAorCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlkZXZpY2VfcG1fcmVtb3ZlKGRldik7CiAJZHBtX3N5c2ZzX3JlbW92ZShkZXYpOwogCWlmIChwYXJlbnQpCi0JCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9wYXJlbnQpOworCQlrbGlzdF9kZWwoJmRldi0+cC0+a25vZGVfcGFyZW50KTsKIAlpZiAoTUFKT1IoZGV2LT5kZXZ0KSkgewogCQlkZXZpY2VfcmVtb3ZlX3N5c19kZXZfZW50cnkoZGV2KTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldnRfYXR0cik7CkBAIC0xMDY0LDkgKzEwODEsNiBAQAogCSAqLwogCWlmIChwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKQogCQlwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKGRldik7Ci0JaWYgKGRldi0+YnVzKQotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAotCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX1JFTU9WRSk7CiAJY2xlYW51cF9kZXZpY2VfcGFyZW50KGRldik7CiAJa29iamVjdF9kZWwoJmRldi0+a29iaik7CkBAIC0xMDg2LDcgKzExMDAsNyBAQAogICovCiB2b2lkIGRldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCWRldmljZV9kZWwoZGV2KTsKIAlwdXRfZGV2aWNlKGRldik7CiB9CkBAIC0xMDk0LDcgKzExMDgsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0JcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KSA6IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKnA7CisKKwlpZiAobikgeworCQlwID0gdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG4pOworCQlkZXYgPSBwLT5kZXZpY2U7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIC8qKgpAQCAtMTExNiw3ICsxMTM3LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpjaGlsZDsKIAlpbnQgZXJyb3IgPSAwOwogCi0Ja2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CisJa2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CiAJd2hpbGUgKChjaGlsZCA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGNoaWxkLCBkYXRhKTsKIAlrbGlzdF9pdGVyX2V4aXQoJmkpOwpAQCAtMTE0Nyw3ICsxMTY4LDcgQEAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKKwlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+cC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKIAl3aGlsZSAoKGNoaWxkID0gbmV4dF9kZXZpY2UoJmkpKSkKIAkJaWYgKG1hdGNoKGNoaWxkLCBkYXRhKSAmJiBnZXRfZGV2aWNlKGNoaWxkKSkKIAkJCWJyZWFrOwpAQCAtMTE5NiwxMCArMTIxNywxMDEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9jcmVhdGVfZmlsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcmVtb3ZlX2ZpbGUpOwogCitzdHJ1Y3Qgcm9vdF9kZXZpY2UKK3sKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKK307CisKKyNkZWZpbmUgdG9fcm9vdF9kZXZpY2UoZGV2KSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgcm9vdF9kZXZpY2UsIGRldikKKworc3RhdGljIHZvaWQgcm9vdF9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJa2ZyZWUodG9fcm9vdF9kZXZpY2UoZGV2KSk7Cit9CisKKy8qKgorICogX19yb290X2RldmljZV9yZWdpc3RlciAtIGFsbG9jYXRlIGFuZCByZWdpc3RlciBhIHJvb3QgZGV2aWNlCisgKiBAbmFtZTogcm9vdCBkZXZpY2UgbmFtZQorICogQG93bmVyOiBvd25lciBtb2R1bGUgb2YgdGhlIHJvb3QgZGV2aWNlLCB1c3VhbGx5IFRISVNfTU9EVUxFCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSByb290IGRldmljZSBhbmQgcmVnaXN0ZXJzIGl0CisgKiB1c2luZyBkZXZpY2VfcmVnaXN0ZXIoKS4gSW4gb3JkZXIgdG8gZnJlZSB0aGUgcmV0dXJuZWQKKyAqIGRldmljZSwgdXNlIHJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoKS4KKyAqCisgKiBSb290IGRldmljZXMgYXJlIGR1bW15IGRldmljZXMgd2hpY2ggYWxsb3cgb3RoZXIgZGV2aWNlcworICogdG8gYmUgZ3JvdXBlZCB1bmRlciAvc3lzL2RldmljZXMuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvCisgKiBhbGxvY2F0ZSBhIHJvb3QgZGV2aWNlIGFuZCB0aGVuIHVzZSBpdCBhcyB0aGUgcGFyZW50IG9mCisgKiBhbnkgZGV2aWNlIHdoaWNoIHNob3VsZCBhcHBlYXIgdW5kZXIgL3N5cy9kZXZpY2VzL3tuYW1lfQorICoKKyAqIFRoZSAvc3lzL2RldmljZXMve25hbWV9IGRpcmVjdG9yeSB3aWxsIGFsc28gY29udGFpbiBhCisgKiAnbW9kdWxlJyBzeW1saW5rIHdoaWNoIHBvaW50cyB0byB0aGUgQG93bmVyIGRpcmVjdG9yeQorICogaW4gc3lzZnMuCisgKgorICogTm90ZTogWW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCkuCisgKi8KK3N0cnVjdCBkZXZpY2UgKl9fcm9vdF9kZXZpY2VfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJc3RydWN0IHJvb3RfZGV2aWNlICpyb290OworCWludCBlcnIgPSAtRU5PTUVNOworCisJcm9vdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByb290X2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghcm9vdCkKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCWVyciA9IGRldl9zZXRfbmFtZSgmcm9vdC0+ZGV2LCBuYW1lKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKHJvb3QpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJvb3QtPmRldi5yZWxlYXNlID0gcm9vdF9kZXZpY2VfcmVsZWFzZTsKKworCWVyciA9IGRldmljZV9yZWdpc3Rlcigmcm9vdC0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCXB1dF9kZXZpY2UoJnJvb3QtPmRldik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisjaWZkZWYgQ09ORklHX01PRFVMRQkvKiBnb3R0YSBmaW5kIGEgImNsZWFuZXIiIHdheSB0byBkbyB0aGlzICovCisJaWYgKG93bmVyKSB7CisJCXN0cnVjdCBtb2R1bGVfa29iamVjdCAqbWsgPSAmb3duZXItPm1rb2JqOworCisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZyb290LT5kZXYua29iaiwgJm1rLT5rb2JqLCAibW9kdWxlIik7CisJCWlmIChlcnIpIHsKKwkJCWRldmljZV91bnJlZ2lzdGVyKCZyb290LT5kZXYpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJfQorCQlyb290LT5vd25lciA9IG93bmVyOworCX0KKyNlbmRpZgorCisJcmV0dXJuICZyb290LT5kZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKTsKKworLyoqCisgKiByb290X2RldmljZV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhbmQgZnJlZSBhIHJvb3QgZGV2aWNlCisgKiBAcm9vdDogZGV2aWNlIGdvaW5nIGF3YXkuCisgKgorICogVGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVycyBhbmQgY2xlYW5zIHVwIGEgZGV2aWNlIHRoYXQgd2FzIGNyZWF0ZWQgYnkKKyAqIHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCkuCisgKi8KK3ZvaWQgcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJvb3RfZGV2aWNlICpyb290ID0gdG9fcm9vdF9kZXZpY2UoZGV2KTsKKworCWlmIChyb290LT5vd25lcikKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnJvb3QtPmRldi5rb2JqLCAibW9kdWxlIik7CisKKwlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocm9vdF9kZXZpY2VfdW5yZWdpc3Rlcik7CisKIAogc3RhdGljIHZvaWQgZGV2aWNlX2NyZWF0ZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCWtmcmVlKGRldik7CiB9CiAKQEAgLTEzNDQsNyArMTQ1Niw3IEBACiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IHJlbmFtaW5nIHRvICclcydcbiIsIGRldi0+YnVzX2lkLAorCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiByZW5hbWluZyB0byAnJXMnXG4iLCBkZXZfbmFtZShkZXYpLAogCQkgX19mdW5jX18sIG5ld19uYW1lKTsKIAogI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECkBAIC0xMzgxLDcgKzE0OTMsNyBAQAogI2Vsc2UKIAlpZiAoZGV2LT5jbGFzcykgewogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rX25vd2FybigmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJCQkgJmRldi0+a29iaiwgZGV2LT5idXNfaWQpOworCQkJCQkJICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLApAQCAtMTQ1OSw4ICsxNTcxLDggQEAKIAluZXdfcGFyZW50ID0gZ2V0X2RldmljZShuZXdfcGFyZW50KTsKIAluZXdfcGFyZW50X2tvYmogPSBnZXRfZGV2aWNlX3BhcmVudChkZXYsIG5ld19wYXJlbnQpOwogCi0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IG1vdmluZyB0byAnJXMnXG4iLCBkZXYtPmJ1c19pZCwKLQkJIF9fZnVuY19fLCBuZXdfcGFyZW50ID8gbmV3X3BhcmVudC0+YnVzX2lkIDogIjxOVUxMPiIpOworCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiBtb3ZpbmcgdG8gJyVzJ1xuIiwgZGV2X25hbWUoZGV2KSwKKwkJIF9fZnVuY19fLCBuZXdfcGFyZW50ID8gZGV2X25hbWUobmV3X3BhcmVudCkgOiAiPE5VTEw+Iik7CiAJZXJyb3IgPSBrb2JqZWN0X21vdmUoJmRldi0+a29iaiwgbmV3X3BhcmVudF9rb2JqKTsKIAlpZiAoZXJyb3IpIHsKIAkJY2xlYW51cF9nbHVlX2RpcihkZXYsIG5ld19wYXJlbnRfa29iaik7CkBAIC0xNDcwLDkgKzE1ODIsMTAgQEAKIAlvbGRfcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAJZGV2LT5wYXJlbnQgPSBuZXdfcGFyZW50OwogCWlmIChvbGRfcGFyZW50KQotCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfcGFyZW50KTsKKwkJa2xpc3RfcmVtb3ZlKCZkZXYtPnAtPmtub2RlX3BhcmVudCk7CiAJaWYgKG5ld19wYXJlbnQpIHsKLQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LCAmbmV3X3BhcmVudC0+a2xpc3RfY2hpbGRyZW4pOworCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9wYXJlbnQsCisJCQkgICAgICAgJm5ld19wYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuKTsKIAkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUobmV3X3BhcmVudCkpOwogCX0KIApAQCAtMTQ4NCwxMSArMTU5NywxMSBAQAogCQlkZXZpY2VfbW92ZV9jbGFzc19saW5rcyhkZXYsIG5ld19wYXJlbnQsIG9sZF9wYXJlbnQpOwogCQlpZiAoIWtvYmplY3RfbW92ZSgmZGV2LT5rb2JqLCAmb2xkX3BhcmVudC0+a29iaikpIHsKIAkJCWlmIChuZXdfcGFyZW50KQotCQkJCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9wYXJlbnQpOworCQkJCWtsaXN0X3JlbW92ZSgmZGV2LT5wLT5rbm9kZV9wYXJlbnQpOwogCQkJZGV2LT5wYXJlbnQgPSBvbGRfcGFyZW50OwogCQkJaWYgKG9sZF9wYXJlbnQpIHsKLQkJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsCi0JCQkJCSAgICAgICAmb2xkX3BhcmVudC0+a2xpc3RfY2hpbGRyZW4pOworCQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPnAtPmtub2RlX3BhcmVudCwKKwkJCQkJICAgICAgICZvbGRfcGFyZW50LT5wLT5rbGlzdF9jaGlsZHJlbik7CiAJCQkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUob2xkX3BhcmVudCkpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDIwZmViYzAuLjZmZGFmNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC0yOCwyMCArMjgsMjAgQEAKIAogc3RhdGljIHZvaWQgZHJpdmVyX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmZGV2LT5rbm9kZV9kcml2ZXIpKSB7CisJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+cC0+a25vZGVfZHJpdmVyKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2aWNlICVzIGFscmVhZHkgYm91bmRcbiIsCiAJCQlfX2Z1bmNfXywga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKIAkJcmV0dXJuOwogCX0KIAotCXByX2RlYnVnKCJkcml2ZXI6ICclcyc6ICVzOiBib3VuZCB0byBkZXZpY2UgJyVzJ1xuIiwgZGV2LT5idXNfaWQsCisJcHJfZGVidWcoImRyaXZlcjogJyVzJzogJXM6IGJvdW5kIHRvIGRldmljZSAnJXMnXG4iLCBkZXZfbmFtZShkZXYpLAogCQkgX19mdW5jX18sIGRldi0+ZHJpdmVyLT5uYW1lKTsKIAogCWlmIChkZXYtPmJ1cykKIAkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKIAkJCQkJICAgICBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUiwgZGV2KTsKIAotCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2RyaXZlciwgJmRldi0+ZHJpdmVyLT5wLT5rbGlzdF9kZXZpY2VzKTsKKwlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9kcml2ZXIsICZkZXYtPmRyaXZlci0+cC0+a2xpc3RfZGV2aWNlcyk7CiB9CiAKIHN0YXRpYyBpbnQgZHJpdmVyX3N5c2ZzX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0xMDQsMTMgKzEwNCwxMyBAQAogCiAJYXRvbWljX2luYygmcHJvYmVfY291bnQpOwogCXByX2RlYnVnKCJidXM6ICclcyc6ICVzOiBwcm9iaW5nIGRyaXZlciAlcyB3aXRoIGRldmljZSAlc1xuIiwKLQkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZHJ2LT5uYW1lLCBkZXYtPmJ1c19pZCk7CisJCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRydi0+bmFtZSwgZGV2X25hbWUoZGV2KSk7CiAJV0FSTl9PTighbGlzdF9lbXB0eSgmZGV2LT5kZXZyZXNfaGVhZCkpOwogCiAJZGV2LT5kcml2ZXIgPSBkcnY7CiAJaWYgKGRyaXZlcl9zeXNmc19hZGQoZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZXJfc3lzZnNfYWRkKCVzKSBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgZGV2LT5idXNfaWQpOworCQkJX19mdW5jX18sIGRldl9uYW1lKGRldikpOwogCQlnb3RvIHByb2JlX2ZhaWxlZDsKIAl9CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogCWRyaXZlcl9ib3VuZChkZXYpOwogCXJldCA9IDE7CiAJcHJfZGVidWcoImJ1czogJyVzJzogJXM6IGJvdW5kIGRldmljZSAlcyB0byBkcml2ZXIgJXNcbiIsCi0JCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRldi0+YnVzX2lkLCBkcnYtPm5hbWUpOworCQkgZHJ2LT5idXMtPm5hbWUsIF9fZnVuY19fLCBkZXZfbmFtZShkZXYpLCBkcnYtPm5hbWUpOwogCWdvdG8gZG9uZTsKIAogcHJvYmVfZmFpbGVkOgpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCS8qIGRyaXZlciBtYXRjaGVkIGJ1dCB0aGUgcHJvYmUgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICIlczogcHJvYmUgb2YgJXMgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCi0JCSAgICAgICBkcnYtPm5hbWUsIGRldi0+YnVzX2lkLCByZXQpOworCQkgICAgICAgZHJ2LT5uYW1lLCBkZXZfbmFtZShkZXYpLCByZXQpOwogCX0KIAkvKgogCSAqIElnbm9yZSBlcnJvcnMgcmV0dXJuZWQgYnkgLT5wcm9iZSBzbyB0aGF0IHRoZSBuZXh0IGRyaXZlciBjYW4gdHJ5CkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJZ290byBkb25lOwogCiAJcHJfZGVidWcoImJ1czogJyVzJzogJXM6IG1hdGNoZWQgZGV2aWNlICVzIHdpdGggZHJpdmVyICVzXG4iLAotCQkgZHJ2LT5idXMtPm5hbWUsIF9fZnVuY19fLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKKwkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZGV2X25hbWUoZGV2KSwgZHJ2LT5uYW1lKTsKIAogCXJldCA9IHJlYWxseV9wcm9iZShkZXYsIGRydik7CiAKQEAgLTI5OCw3ICsyOTgsNiBAQAogCWRydiA9IGRldi0+ZHJpdmVyOwogCWlmIChkcnYpIHsKIAkJZHJpdmVyX3N5c2ZzX3JlbW92ZShkZXYpOwotCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZHJpdmVyIik7CiAKIAkJaWYgKGRldi0+YnVzKQogCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKQEAgLTMxMSw3ICszMTAsNyBAQAogCQkJZHJ2LT5yZW1vdmUoZGV2KTsKIAkJZGV2cmVzX3JlbGVhc2VfYWxsKGRldik7CiAJCWRldi0+ZHJpdmVyID0gTlVMTDsKLQkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX2RyaXZlcik7CisJCWtsaXN0X3JlbW92ZSgmZGV2LT5wLT5rbm9kZV9kcml2ZXIpOwogCX0KIH0KIApAQCAtMzQxLDYgKzM0MCw3IEBACiAgKi8KIHZvaWQgZHJpdmVyX2RldGFjaChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogeworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlmb3IgKDs7KSB7CkBAIC0zNDksOCArMzQ5LDEwIEBACiAJCQlzcGluX3VubG9jaygmZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLmtfbG9jayk7CiAJCQlicmVhazsKIAkJfQotCQlkZXYgPSBsaXN0X2VudHJ5KGRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xpc3QucHJldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9kcml2ZXIubl9ub2RlKTsKKwkJZGV2X3BydiA9IGxpc3RfZW50cnkoZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLmtfbGlzdC5wcmV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9wcml2YXRlLAorCQkJCSAgICAga25vZGVfZHJpdmVyLm5fbm9kZSk7CisJCWRldiA9IGRldl9wcnYtPmRldmljZTsKIAkJZ2V0X2RldmljZShkZXYpOwogCQlzcGluX3VubG9jaygmZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLmtfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwppbmRleCAxZTJiZGE3Li5iNzZjYzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCkBAIC0xOSw3ICsxOSwxNCBAQAogc3RhdGljIHN0cnVjdCBkZXZpY2UgKm5leHRfZGV2aWNlKHN0cnVjdCBrbGlzdF9pdGVyICppKQogewogCXN0cnVjdCBrbGlzdF9ub2RlICpuID0ga2xpc3RfbmV4dChpKTsKLQlyZXR1cm4gbiA/IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9kcml2ZXIpIDogTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKKworCWlmIChuKSB7CisJCWRldl9wcnYgPSB0b19kZXZpY2VfcHJpdmF0ZV9kcml2ZXIobik7CisJCWRldiA9IGRldl9wcnYtPmRldmljZTsKKwl9CisJcmV0dXJuIGRldjsKIH0KIAogLyoqCkBAIC00Miw3ICs0OSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJa2xpc3RfaXRlcl9pbml0X25vZGUoJmRydi0+cC0+a2xpc3RfZGV2aWNlcywgJmksCi0JCQkgICAgIHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9kcml2ZXIgOiBOVUxMKTsKKwkJCSAgICAgc3RhcnQgPyAmc3RhcnQtPnAtPmtub2RlX2RyaXZlciA6IE5VTEwpOwogCXdoaWxlICgoZGV2ID0gbmV4dF9kZXZpY2UoJmkpKSAmJiAhZXJyb3IpCiAJCWVycm9yID0gZm4oZGV2LCBkYXRhKTsKIAlrbGlzdF9pdGVyX2V4aXQoJmkpOwpAQCAtNzYsNyArODMsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZkcnYtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPmtub2RlX2RyaXZlciA6IE5VTEwpKTsKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9kcml2ZXIgOiBOVUxMKSk7CiAJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpKQogCQlpZiAobWF0Y2goZGV2LCBkYXRhKSAmJiBnZXRfZGV2aWNlKGRldikpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKaW5kZXggYjdlNTcxMC4uNDQ2OTlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKQEAgLTI5MSwxMiArMjkxLDYgQEAKIAlmd19sb2FkX2Fib3J0KGZ3X3ByaXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZndfc2V0dXBfZGV2aWNlX2lkKHN0cnVjdCBkZXZpY2UgKmZfZGV2LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JLyogWFhYIHdhcm5pbmcgd2Ugc2hvdWxkIHdhdGNoIG91dCBmb3IgbmFtZSBjb2xsaXNpb25zICovCi0Jc3RybGNweShmX2Rldi0+YnVzX2lkLCBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUpOwotfQotCiBzdGF0aWMgaW50IGZ3X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgZGV2aWNlICoqZGV2X3AsIGNvbnN0IGNoYXIgKmZ3X25hbWUsCiAJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CkBAIC0zMjEsNyArMzE1LDcgQEAKIAlmd19wcml2LT50aW1lb3V0LmRhdGEgPSAodV9sb25nKSBmd19wcml2OwogCWluaXRfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQpOwogCi0JZndfc2V0dXBfZGV2aWNlX2lkKGZfZGV2LCBkZXZpY2UpOworCWRldl9zZXRfbmFtZShmX2RldiwgZGV2X25hbWUoZGV2aWNlKSk7CiAJZl9kZXYtPnBhcmVudCA9IGRldmljZTsKIAlmX2Rldi0+Y2xhc3MgPSAmZmlybXdhcmVfY2xhc3M7CiAJZGV2X3NldF9kcnZkYXRhKGZfZGV2LCBmd19wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9pc2EuYyBiL2RyaXZlcnMvYmFzZS9pc2EuYwppbmRleCBlZmQ1Nzc1Li40Nzk2OTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvaXNhLmMKKysrIGIvZHJpdmVycy9iYXNlL2lzYS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGlzYV9idXMgPSB7Ci0JLmJ1c19pZAkJPSAiaXNhIgorCS5pbml0X25hbWUJPSAiaXNhIgogfTsKIAogc3RydWN0IGlzYV9kZXYgewpAQCAtMTM1LDkgKzEzNSw4IEBACiAJCWlzYV9kZXYtPmRldi5wYXJlbnQJPSAmaXNhX2J1czsKIAkJaXNhX2Rldi0+ZGV2LmJ1cwk9ICZpc2FfYnVzX3R5cGU7CiAKLQkJc25wcmludGYoaXNhX2Rldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcy4ldSIsCi0JCQkJaXNhX2RyaXZlci0+ZHJpdmVyLm5hbWUsIGlkKTsKLQorCQlkZXZfc2V0X25hbWUoJmlzYV9kZXYtPmRldiwgIiVzLiV1IiwKKwkJCSAgICAgaXNhX2RyaXZlci0+ZHJpdmVyLm5hbWUsIGlkKTsKIAkJaXNhX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGEJPSBpc2FfZHJpdmVyOwogCQlpc2FfZGV2LT5kZXYucmVsZWFzZQkJPSBpc2FfZGV2X3JlbGVhc2U7CiAJCWlzYV9kZXYtPmlkCQkJPSBpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwppbmRleCA1MjYwZTllLi45ODk0MjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKKysrIGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCkBAIC0zNDcsOCArMzQ3LDkgQEAKICAqIHNlY3Rpb24gYmVsb25ncyB0by4uLgogICovCiAKLXN0YXRpYyBpbnQgYWRkX21lbW9yeV9ibG9jayh1bnNpZ25lZCBsb25nIG5vZGVfaWQsIHN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbiwKLQkJICAgICB1bnNpZ25lZCBsb25nIHN0YXRlLCBpbnQgcGh5c19kZXZpY2UpCitzdGF0aWMgaW50IGFkZF9tZW1vcnlfYmxvY2soaW50IG5pZCwgc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uLAorCQkJdW5zaWduZWQgbG9uZyBzdGF0ZSwgaW50IHBoeXNfZGV2aWNlLAorCQkJZW51bSBtZW1fYWRkX2NvbnRleHQgY29udGV4dCkKIHsKIAlzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0gPSBremFsbG9jKHNpemVvZigqbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaW50IHJldCA9IDA7CkBAIC0zNzAsNiArMzcxLDEwIEBACiAJCXJldCA9IG1lbV9jcmVhdGVfc2ltcGxlX2ZpbGUobWVtLCBwaHlzX2RldmljZSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IG1lbV9jcmVhdGVfc2ltcGxlX2ZpbGUobWVtLCByZW1vdmFibGUpOworCWlmICghcmV0KSB7CisJCWlmIChjb250ZXh0ID09IEhPVFBMVUcpCisJCQlyZXQgPSByZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlKG1lbSwgbmlkKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzgyLDcgKzM4Nyw3IEBACiAgKgogICogVGhpcyBjb3VsZCBiZSBtYWRlIGdlbmVyaWMgZm9yIGFsbCBzeXNkZXYgY2xhc3Nlcy4KICAqLwotc3RhdGljIHN0cnVjdCBtZW1vcnlfYmxvY2sgKmZpbmRfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbikKK3N0cnVjdCBtZW1vcnlfYmxvY2sgKmZpbmRfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbikKIHsKIAlzdHJ1Y3Qga29iamVjdCAqa29iajsKIAlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OwpAQCAtNDExLDYgKzQxNiw3IEBACiAJc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtOwogCiAJbWVtID0gZmluZF9tZW1vcnlfYmxvY2soc2VjdGlvbik7CisJdW5yZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlcyhtZW0pOwogCW1lbV9yZW1vdmVfc2ltcGxlX2ZpbGUobWVtLCBwaHlzX2luZGV4KTsKIAltZW1fcmVtb3ZlX3NpbXBsZV9maWxlKG1lbSwgc3RhdGUpOwogCW1lbV9yZW1vdmVfc2ltcGxlX2ZpbGUobWVtLCBwaHlzX2RldmljZSk7CkBAIC00MjQsOSArNDMwLDkgQEAKICAqIG5lZWQgYW4gaW50ZXJmYWNlIGZvciB0aGUgVk0gdG8gYWRkIG5ldyBtZW1vcnkgcmVnaW9ucywKICAqIGJ1dCB3aXRob3V0IG9ubGluaW5nIGl0LgogICovCi1pbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCitpbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShpbnQgbmlkLCBzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCiB7Ci0JcmV0dXJuIGFkZF9tZW1vcnlfYmxvY2soMCwgc2VjdGlvbiwgTUVNX09GRkxJTkUsIDApOworCXJldHVybiBhZGRfbWVtb3J5X2Jsb2NrKG5pZCwgc2VjdGlvbiwgTUVNX09GRkxJTkUsIDAsIEhPVFBMVUcpOwogfQogCiBpbnQgdW5yZWdpc3Rlcl9tZW1vcnlfc2VjdGlvbihzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCkBAIC00NTgsNyArNDY0LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfTUVNX1NFQ1RJT05TOyBpKyspIHsKIAkJaWYgKCFwcmVzZW50X3NlY3Rpb25fbnIoaSkpCiAJCQljb250aW51ZTsKLQkJZXJyID0gYWRkX21lbW9yeV9ibG9jaygwLCBfX25yX3RvX3NlY3Rpb24oaSksIE1FTV9PTkxJTkUsIDApOworCQllcnIgPSBhZGRfbWVtb3J5X2Jsb2NrKDAsIF9fbnJfdG9fc2VjdGlvbihpKSwgTUVNX09OTElORSwKKwkJCQkJMCwgQk9PVCk7CiAJCWlmICghcmV0KQogCQkJcmV0ID0gZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9ub2RlLmMgYi9kcml2ZXJzL2Jhc2Uvbm9kZS5jCmluZGV4IDkxNjM2Y2QuLjQzZmE5MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9ub2RlLmMKKysrIGIvZHJpdmVycy9iYXNlL25vZGUuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KQEAgLTI0OCw2ICsyNDksMTA1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFCisjZGVmaW5lIHBhZ2VfaW5pdGlhbGl6ZWQocGFnZSkgIChwYWdlLT5scnUubmV4dCkKKworc3RhdGljIGludCBnZXRfbmlkX2Zvcl9wZm4odW5zaWduZWQgbG9uZyBwZm4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoIXBmbl92YWxpZF93aXRoaW4ocGZuKSkKKwkJcmV0dXJuIC0xOworCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCWlmICghcGFnZV9pbml0aWFsaXplZChwYWdlKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBwZm5fdG9fbmlkKHBmbik7Cit9CisKKy8qIHJlZ2lzdGVyIG1lbW9yeSBzZWN0aW9uIHVuZGVyIHNwZWNpZmllZCBub2RlIGlmIGl0IHNwYW5zIHRoYXQgbm9kZSAqLworaW50IHJlZ2lzdGVyX21lbV9zZWN0X3VuZGVyX25vZGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsaywgaW50IG5pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBmbiwgc2VjdF9zdGFydF9wZm4sIHNlY3RfZW5kX3BmbjsKKworCWlmICghbWVtX2JsaykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFub2RlX29ubGluZShuaWQpKQorCQlyZXR1cm4gMDsKKwlzZWN0X3N0YXJ0X3BmbiA9IHNlY3Rpb25fbnJfdG9fcGZuKG1lbV9ibGstPnBoeXNfaW5kZXgpOworCXNlY3RfZW5kX3BmbiA9IHNlY3Rfc3RhcnRfcGZuICsgUEFHRVNfUEVSX1NFQ1RJT04gLSAxOworCWZvciAocGZuID0gc2VjdF9zdGFydF9wZm47IHBmbiA8PSBzZWN0X2VuZF9wZm47IHBmbisrKSB7CisJCWludCBwYWdlX25pZDsKKworCQlwYWdlX25pZCA9IGdldF9uaWRfZm9yX3BmbihwZm4pOworCQlpZiAocGFnZV9uaWQgPCAwKQorCQkJY29udGludWU7CisJCWlmIChwYWdlX25pZCAhPSBuaWQpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9saW5rX25vd2Fybigmbm9kZV9kZXZpY2VzW25pZF0uc3lzZGV2LmtvYmosCisJCQkJCSZtZW1fYmxrLT5zeXNkZXYua29iaiwKKwkJCQkJa29iamVjdF9uYW1lKCZtZW1fYmxrLT5zeXNkZXYua29iaikpOworCX0KKwkvKiBtZW0gc2VjdGlvbiBkb2VzIG5vdCBzcGFuIHRoZSBzcGVjaWZpZWQgbm9kZSAqLworCXJldHVybiAwOworfQorCisvKiB1bnJlZ2lzdGVyIG1lbW9yeSBzZWN0aW9uIHVuZGVyIGFsbCBub2RlcyB0aGF0IGl0IHNwYW5zICovCitpbnQgdW5yZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlcyhzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1fYmxrKQoreworCW5vZGVtYXNrX3QgdW5saW5rZWRfbm9kZXM7CisJdW5zaWduZWQgbG9uZyBwZm4sIHNlY3Rfc3RhcnRfcGZuLCBzZWN0X2VuZF9wZm47CisKKwlpZiAoIW1lbV9ibGspCisJCXJldHVybiAtRUZBVUxUOworCW5vZGVzX2NsZWFyKHVubGlua2VkX25vZGVzKTsKKwlzZWN0X3N0YXJ0X3BmbiA9IHNlY3Rpb25fbnJfdG9fcGZuKG1lbV9ibGstPnBoeXNfaW5kZXgpOworCXNlY3RfZW5kX3BmbiA9IHNlY3Rfc3RhcnRfcGZuICsgUEFHRVNfUEVSX1NFQ1RJT04gLSAxOworCWZvciAocGZuID0gc2VjdF9zdGFydF9wZm47IHBmbiA8PSBzZWN0X2VuZF9wZm47IHBmbisrKSB7CisJCXVuc2lnbmVkIGludCBuaWQ7CisKKwkJbmlkID0gZ2V0X25pZF9mb3JfcGZuKHBmbik7CisJCWlmIChuaWQgPCAwKQorCQkJY29udGludWU7CisJCWlmICghbm9kZV9vbmxpbmUobmlkKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobm9kZV90ZXN0X2FuZF9zZXQobmlkLCB1bmxpbmtlZF9ub2RlcykpCisJCQljb250aW51ZTsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJm5vZGVfZGV2aWNlc1tuaWRdLnN5c2Rldi5rb2JqLAorCQkJIGtvYmplY3RfbmFtZSgmbWVtX2Jsay0+c3lzZGV2LmtvYmopKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlua19tZW1fc2VjdGlvbnMoaW50IG5pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSBzdGFydF9wZm4gKyBOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgcGZuOworCWludCBlcnIgPSAwOworCisJZm9yIChwZm4gPSBzdGFydF9wZm47IHBmbiA8IGVuZF9wZm47IHBmbiArPSBQQUdFU19QRVJfU0VDVElPTikgeworCQl1bnNpZ25lZCBsb25nIHNlY3Rpb25fbnIgPSBwZm5fdG9fc2VjdGlvbl9ucihwZm4pOworCQlzdHJ1Y3QgbWVtX3NlY3Rpb24gKm1lbV9zZWN0OworCQlzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1fYmxrOworCQlpbnQgcmV0OworCisJCWlmICghcHJlc2VudF9zZWN0aW9uX25yKHNlY3Rpb25fbnIpKQorCQkJY29udGludWU7CisJCW1lbV9zZWN0ID0gX19ucl90b19zZWN0aW9uKHNlY3Rpb25fbnIpOworCQltZW1fYmxrID0gZmluZF9tZW1vcnlfYmxvY2sobWVtX3NlY3QpOworCQlyZXQgPSByZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlKG1lbV9ibGssIG5pZCk7CisJCWlmICghZXJyKQorCQkJZXJyID0gcmV0OworCisJCS8qIGRpc2NhcmQgcmVmIG9idGFpbmVkIGluIGZpbmRfbWVtb3J5X2Jsb2NrKCkgKi8KKwkJa29iamVjdF9wdXQoJm1lbV9ibGstPnN5c2Rldi5rb2JqKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKyNlbHNlCitzdGF0aWMgaW50IGxpbmtfbWVtX3NlY3Rpb25zKGludCBuaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFICovCisKIGludCByZWdpc3Rlcl9vbmVfbm9kZShpbnQgbmlkKQogewogCWludCBlcnJvciA9IDA7CkBAIC0yNjcsNiArMzY3LDkgQEAKIAkJCWlmIChjcHVfdG9fbm9kZShjcHUpID09IG5pZCkKIAkJCQlyZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZShjcHUsIG5pZCk7CiAJCX0KKworCQkvKiBsaW5rIG1lbW9yeSBzZWN0aW9ucyB1bmRlciB0aGlzIG5vZGUgKi8KKwkJZXJyb3IgPSBsaW5rX21lbV9zZWN0aW9ucyhuaWQpOwogCX0KIAogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggZGZjYmZlNS4uMzQ5YTEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAkJCQkgZHJpdmVyKSkKIAogc3RydWN0IGRldmljZSBwbGF0Zm9ybV9idXMgPSB7Ci0JLmJ1c19pZAkJPSAicGxhdGZvcm0iLAorCS5pbml0X25hbWUJPSAicGxhdGZvcm0iLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2J1cyk7CiAKQEAgLTI0MiwxNiArMjQyLDE1IEBACiAJcGRldi0+ZGV2LmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZTsKIAogCWlmIChwZGV2LT5pZCAhPSAtMSkKLQkJc25wcmludGYocGRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcy4lZCIsIHBkZXYtPm5hbWUsCi0JCQkgcGRldi0+aWQpOworCQlkZXZfc2V0X25hbWUoJnBkZXYtPmRldiwgIiVzLiVkIiwgcGRldi0+bmFtZSwgIHBkZXYtPmlkKTsKIAllbHNlCi0JCXN0cmxjcHkocGRldi0+ZGV2LmJ1c19pZCwgcGRldi0+bmFtZSwgQlVTX0lEX1NJWkUpOworCQlkZXZfc2V0X25hbWUoJnBkZXYtPmRldiwgcGRldi0+bmFtZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGRldi0+bnVtX3Jlc291cmNlczsgaSsrKSB7CiAJCXN0cnVjdCByZXNvdXJjZSAqcCwgKnIgPSAmcGRldi0+cmVzb3VyY2VbaV07CiAKIAkJaWYgKHItPm5hbWUgPT0gTlVMTCkKLQkJCXItPm5hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCQkJci0+bmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCiAJCXAgPSByLT5wYXJlbnQ7CiAJCWlmICghcCkgewpAQCAtMjY0LDE0ICsyNjMsMTQgQEAKIAkJaWYgKHAgJiYgaW5zZXJ0X3Jlc291cmNlKHAsIHIpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiJXM6IGZhaWxlZCB0byBjbGFpbSByZXNvdXJjZSAlZFxuIiwKLQkJCSAgICAgICBwZGV2LT5kZXYuYnVzX2lkLCBpKTsKKwkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaSk7CiAJCQlyZXQgPSAtRUJVU1k7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCX0KIAogCXByX2RlYnVnKCJSZWdpc3RlcmluZyBwbGF0Zm9ybSBkZXZpY2UgJyVzJy4gUGFyZW50IGF0ICVzXG4iLAotCQkgcGRldi0+ZGV2LmJ1c19pZCwgcGRldi0+ZGV2LnBhcmVudC0+YnVzX2lkKTsKKwkJIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBkZXZfbmFtZShwZGV2LT5kZXYucGFyZW50KSk7CiAKIAlyZXQgPSBkZXZpY2VfYWRkKCZwZGV2LT5kZXYpOwogCWlmIChyZXQgPT0gMCkKQEAgLTUwMyw4ICs1MDIsNiBAQAogCQlkcnYtPmRyaXZlci5zdXNwZW5kID0gcGxhdGZvcm1fZHJ2X3N1c3BlbmQ7CiAJaWYgKGRydi0+cmVzdW1lKQogCQlkcnYtPmRyaXZlci5yZXN1bWUgPSBwbGF0Zm9ybV9kcnZfcmVzdW1lOwotCWlmIChkcnYtPnBtKQotCQlkcnYtPmRyaXZlci5wbSA9ICZkcnYtPnBtLT5iYXNlOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcik7CkBAIC02MDksNyArNjA2LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCiAJcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7Ci0JcmV0dXJuIChzdHJuY21wKHBkZXYtPm5hbWUsIGRydi0+bmFtZSwgQlVTX0lEX1NJWkUpID09IDApOworCXJldHVybiAoc3RyY21wKHBkZXYtPm5hbWUsIGRydi0+bmFtZSkgPT0gMCk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKQEAgLTY4Niw3ICs2ODMsMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgewogCQlpZiAoZHJ2LT5wbS0+c3VzcGVuZCkKIAkJCXJldCA9IGRydi0+cG0tPnN1c3BlbmQoZGV2KTsKIAl9IGVsc2UgewpAQCAtNjk4LDE2ICs2OTgsMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpwZHJ2OworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghZGV2LT5kcml2ZXIpCisJaWYgKCFkcnYpCiAJCXJldHVybiAwOwogCi0JcGRydiA9IHRvX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKHBkcnYtPnBtKSB7Ci0JCWlmIChwZHJ2LT5wbS0+c3VzcGVuZF9ub2lycSkKLQkJCXJldCA9IHBkcnYtPnBtLT5zdXNwZW5kX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPnN1c3BlbmRfbm9pcnEpCisJCQlyZXQgPSBkcnYtPnBtLT5zdXNwZW5kX25vaXJxKGRldik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcGxhdGZvcm1fbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfU1VTUEVORCk7CiAJfQpAQCAtNzIwLDcgKzcxOSwxMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgeworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT5yZXN1bWUpCiAJCQlyZXQgPSBkcnYtPnBtLT5yZXN1bWUoZGV2KTsKIAl9IGVsc2UgewpAQCAtNzMyLDE2ICs3MzQsMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXYtPmRyaXZlcikKKwlpZiAoIWRydikKIAkJcmV0dXJuIDA7CiAKLQlwZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAocGRydi0+cG0pIHsKLQkJaWYgKHBkcnYtPnBtLT5yZXN1bWVfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+cmVzdW1lX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPnJlc3VtZV9ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnJlc3VtZV9ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKIAl9CkBAIC03ODAsMTYgKzc4MSwxNSBAQAogCiBzdGF0aWMgaW50IHBsYXRmb3JtX3BtX2ZyZWV6ZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPmZyZWV6ZV9ub2lycSkKLQkJCXJldCA9IHBkcnYtPnBtLT5mcmVlemVfbm9pcnEoZGV2KTsKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+ZnJlZXplX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+ZnJlZXplX25vaXJxKGRldik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcGxhdGZvcm1fbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfRlJFRVpFKTsKIAl9CkBAIC04MDIsNyArODAyLDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7CisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnRoYXcpCiAJCQlyZXQgPSBkcnYtPnBtLT50aGF3KGRldik7CiAJfSBlbHNlIHsKQEAgLTgxNCwxNiArODE3LDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fdGhhd19ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPnRoYXdfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+dGhhd19ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT50aGF3X25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+dGhhd19ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKIAl9CkBAIC04MzYsNyArODM4LDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7CisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnBvd2Vyb2ZmKQogCQkJcmV0ID0gZHJ2LT5wbS0+cG93ZXJvZmYoZGV2KTsKIAl9IGVsc2UgewpAQCAtODQ4LDE2ICs4NTMsMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9wb3dlcm9mZl9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKQotCQkJcmV0ID0gcGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+cG93ZXJvZmZfbm9pcnEoZGV2KTsKIAl9IGVsc2UgewogCQlyZXQgPSBwbGF0Zm9ybV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19ISUJFUk5BVEUpOwogCX0KQEAgLTg3MCw3ICs4NzQsMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgewogCQlpZiAoZHJ2LT5wbS0+cmVzdG9yZSkKIAkJCXJldCA9IGRydi0+cG0tPnJlc3RvcmUoZGV2KTsKIAl9IGVsc2UgewpAQCAtODgyLDE2ICs4ODksMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9yZXN0b3JlX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpwZHJ2OworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghZGV2LT5kcml2ZXIpCisJaWYgKCFkcnYpCiAJCXJldHVybiAwOwogCi0JcGRydiA9IHRvX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKHBkcnYtPnBtKSB7Ci0JCWlmIChwZHJ2LT5wbS0+cmVzdG9yZV9ub2lycSkKLQkJCXJldCA9IHBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPnJlc3RvcmVfbm9pcnEpCisJCQlyZXQgPSBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKGRldik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcGxhdGZvcm1fbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOwogCX0KQEAgLTkxMiwxNyArOTE4LDE1IEBACiAKICNlbmRpZiAvKiAhQ09ORklHX0hJQkVSTkFUSU9OICovCiAKLXN0YXRpYyBzdHJ1Y3QgcG1fZXh0X29wcyBwbGF0Zm9ybV9wbV9vcHMgPSB7Ci0JLmJhc2UgPSB7Ci0JCS5wcmVwYXJlID0gcGxhdGZvcm1fcG1fcHJlcGFyZSwKLQkJLmNvbXBsZXRlID0gcGxhdGZvcm1fcG1fY29tcGxldGUsCi0JCS5zdXNwZW5kID0gcGxhdGZvcm1fcG1fc3VzcGVuZCwKLQkJLnJlc3VtZSA9IHBsYXRmb3JtX3BtX3Jlc3VtZSwKLQkJLmZyZWV6ZSA9IHBsYXRmb3JtX3BtX2ZyZWV6ZSwKLQkJLnRoYXcgPSBwbGF0Zm9ybV9wbV90aGF3LAotCQkucG93ZXJvZmYgPSBwbGF0Zm9ybV9wbV9wb3dlcm9mZiwKLQkJLnJlc3RvcmUgPSBwbGF0Zm9ybV9wbV9yZXN0b3JlLAotCX0sCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgcGxhdGZvcm1fZGV2X3BtX29wcyA9IHsKKwkucHJlcGFyZSA9IHBsYXRmb3JtX3BtX3ByZXBhcmUsCisJLmNvbXBsZXRlID0gcGxhdGZvcm1fcG1fY29tcGxldGUsCisJLnN1c3BlbmQgPSBwbGF0Zm9ybV9wbV9zdXNwZW5kLAorCS5yZXN1bWUgPSBwbGF0Zm9ybV9wbV9yZXN1bWUsCisJLmZyZWV6ZSA9IHBsYXRmb3JtX3BtX2ZyZWV6ZSwKKwkudGhhdyA9IHBsYXRmb3JtX3BtX3RoYXcsCisJLnBvd2Vyb2ZmID0gcGxhdGZvcm1fcG1fcG93ZXJvZmYsCisJLnJlc3RvcmUgPSBwbGF0Zm9ybV9wbV9yZXN0b3JlLAogCS5zdXNwZW5kX25vaXJxID0gcGxhdGZvcm1fcG1fc3VzcGVuZF9ub2lycSwKIAkucmVzdW1lX25vaXJxID0gcGxhdGZvcm1fcG1fcmVzdW1lX25vaXJxLAogCS5mcmVlemVfbm9pcnEgPSBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEsCkBAIC05MzEsNyArOTM1LDcgQEAKIAkucmVzdG9yZV9ub2lycSA9IHBsYXRmb3JtX3BtX3Jlc3RvcmVfbm9pcnEsCiB9OwogCi0jZGVmaW5lIFBMQVRGT1JNX1BNX09QU19QVFIJJnBsYXRmb3JtX3BtX29wcworI2RlZmluZSBQTEFURk9STV9QTV9PUFNfUFRSCSgmcGxhdGZvcm1fZGV2X3BtX29wcykKIAogI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCA2OTJjMjBiLi42NzBjOWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAlpZiAoZGV2LT5wYXJlbnQpIHsKIAkJaWYgKGRldi0+cGFyZW50LT5wb3dlci5zdGF0dXMgPj0gRFBNX1NVU1BFTkRJTkcpCiAJCQlkZXZfd2FybihkZXYsICJwYXJlbnQgJXMgc2hvdWxkIG5vdCBiZSBzbGVlcGluZ1xuIiwKLQkJCQlkZXYtPnBhcmVudC0+YnVzX2lkKTsKKwkJCQkgZGV2X25hbWUoZGV2LT5wYXJlbnQpKTsKIAl9IGVsc2UgaWYgKHRyYW5zaXRpb25fc3RhcnRlZCkgewogCQkvKgogCQkgKiBXZSByZWZ1c2UgdG8gcmVnaXN0ZXIgcGFyZW50bGVzcyBkZXZpY2VzIHdoaWxlIGEgUE0KQEAgLTExMiw3ICsxMTIsOCBAQAogICoJQG9wczoJUE0gb3BlcmF0aW9ucyB0byBjaG9vc2UgZnJvbS4KICAqCUBzdGF0ZToJUE0gdHJhbnNpdGlvbiBvZiB0aGUgc3lzdGVtIGJlaW5nIGNhcnJpZWQgb3V0LgogICovCi1zdGF0aWMgaW50IHBtX29wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBtX29wcyAqb3BzLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHBtX29wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldl9wbV9vcHMgKm9wcywKKwkJCXBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0xNzQsNyArMTc1LDcgQEAKICAqCVRoZSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGJ5IHRoZSBvbmx5IHJlbWFpbmluZwogICoJZnVuY3Rpb25hbCBDUFUgaW4gdGhlIHN5c3RlbS4KICAqLwotc3RhdGljIGludCBwbV9ub2lycV9vcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwbV9leHRfb3BzICpvcHMsCitzdGF0aWMgaW50IHBtX25vaXJxX29wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldl9wbV9vcHMgKm9wcywKIAkJCXBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtMzU0LDcgKzM1NSw3IEBACiAJaWYgKGRldi0+YnVzKSB7CiAJCWlmIChkZXYtPmJ1cy0+cG0pIHsKIAkJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgIiIpOwotCQkJZXJyb3IgPSBwbV9vcChkZXYsICZkZXYtPmJ1cy0+cG0tPmJhc2UsIHN0YXRlKTsKKwkJCWVycm9yID0gcG1fb3AoZGV2LCBkZXYtPmJ1cy0+cG0sIHN0YXRlKTsKIAkJfSBlbHNlIGlmIChkZXYtPmJ1cy0+cmVzdW1lKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJsZWdhY3kgIik7CiAJCQllcnJvciA9IGRldi0+YnVzLT5yZXN1bWUoZGV2KTsKQEAgLTQ1MSw5ICs0NTIsOSBAQAogCQlkZXYtPnR5cGUtPnBtLT5jb21wbGV0ZShkZXYpOwogCX0KIAotCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5iYXNlLmNvbXBsZXRlKSB7CisJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5wbSAmJiBkZXYtPmJ1cy0+cG0tPmNvbXBsZXRlKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgImNvbXBsZXRpbmcgIik7Ci0JCWRldi0+YnVzLT5wbS0+YmFzZS5jb21wbGV0ZShkZXYpOworCQlkZXYtPmJ1cy0+cG0tPmNvbXBsZXRlKGRldik7CiAJfQogCiAJdXAoJmRldi0+c2VtKTsKQEAgLTYyNCw3ICs2MjUsNyBAQAogCWlmIChkZXYtPmJ1cykgewogCQlpZiAoZGV2LT5idXMtPnBtKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICIiKTsKLQkJCWVycm9yID0gcG1fb3AoZGV2LCAmZGV2LT5idXMtPnBtLT5iYXNlLCBzdGF0ZSk7CisJCQllcnJvciA9IHBtX29wKGRldiwgZGV2LT5idXMtPnBtLCBzdGF0ZSk7CiAJCX0gZWxzZSBpZiAoZGV2LT5idXMtPnN1c3BlbmQpIHsKIAkJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgImxlZ2FjeSAiKTsKIAkJCWVycm9yID0gZGV2LT5idXMtPnN1c3BlbmQoZGV2LCBzdGF0ZSk7CkBAIC02ODUsMTAgKzY4NiwxMCBAQAogCiAJZG93bigmZGV2LT5zZW0pOwogCi0JaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5wbSAmJiBkZXYtPmJ1cy0+cG0tPmJhc2UucHJlcGFyZSkgeworCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5wcmVwYXJlKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgInByZXBhcmluZyAiKTsKLQkJZXJyb3IgPSBkZXYtPmJ1cy0+cG0tPmJhc2UucHJlcGFyZShkZXYpOwotCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZGV2LT5idXMtPnBtLT5iYXNlLnByZXBhcmUsIGVycm9yKTsKKwkJZXJyb3IgPSBkZXYtPmJ1cy0+cG0tPnByZXBhcmUoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRldi0+YnVzLT5wbS0+cHJlcGFyZSwgZXJyb3IpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIEVuZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCmluZGV4IDJhYTZlOGYuLjBhMWEyYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogdm9pZCBzZXRfdHJhY2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlkZXZfaGFzaF92YWx1ZSA9IGhhc2hfc3RyaW5nKERFVlNFRUQsIGRldi0+YnVzX2lkLCBERVZIQVNIKTsKKwlkZXZfaGFzaF92YWx1ZSA9IGhhc2hfc3RyaW5nKERFVlNFRUQsIGRldl9uYW1lKGRldiksIERFVkhBU0gpOwogfQogRVhQT1JUX1NZTUJPTChzZXRfdHJhY2VfZGV2aWNlKTsKIApAQCAtMTkyLDcgKzE5Miw3IEBACiAKIAl3aGlsZSAoZW50cnkgIT0gJmRwbV9saXN0KSB7CiAJCXN0cnVjdCBkZXZpY2UgKiBkZXYgPSB0b19kZXZpY2UoZW50cnkpOwotCQl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfc3RyaW5nKERFVlNFRUQsIGRldi0+YnVzX2lkLCBERVZIQVNIKTsKKwkJdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXZfbmFtZShkZXYpLCBERVZIQVNIKTsKIAkJaWYgKGhhc2ggPT0gdmFsdWUpIHsKIAkJCWRldl9pbmZvKGRldiwgImhhc2ggbWF0Y2hlc1xuIik7CiAJCQltYXRjaCsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCAxNjk3MDQzMS4uMzU5MTRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTg0MSw3ICs4NDEsNyBAQAogCiBjb25maWcgR0VOX1JUQwogCXRyaXN0YXRlICJHZW5lcmljIC9kZXYvcnRjIGVtdWxhdGlvbiIKLQlkZXBlbmRzIG9uIFJUQyE9eSAmJiAhSUE2NCAmJiAhQVJNICYmICFNMzJSICYmICFNSVBTICYmICFTUEFSQyAmJiAhRlJWICYmICFTMzkwICYmICFTVVBFUkggJiYgIUFWUjMyCisJZGVwZW5kcyBvbiBSVEMhPXkgJiYgIUlBNjQgJiYgIUFSTSAmJiAhTTMyUiAmJiAhTUlQUyAmJiAhU1BBUkMgJiYgIUZSViAmJiAhUzM5MCAmJiAhU1VQRVJIICYmICFBVlIzMiAmJiAhQkxBQ0tGSU4KIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCiAJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwppbmRleCA0MjQ2YjhlLi40NWQzZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCisrKyBiL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQlfX2dldF91c2VyKGZvbnRwb3MsICZsaXN0LT5mb250cG9zKTsKIAkJaWYgKChlcnIxID0gY29uX2luc2VydF91bmlwYWlyKHAsIHVuaWNvZGUsZm9udHBvcykpICE9IDApCiAJCQllcnIgPSBlcnIxOwotCQkJbGlzdCsrOworCQlsaXN0Kys7CiAJfQogCQogCWlmIChjb25fdW5pZnlfdW5pbWFwKHZjLCBwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA2NDMxZjY5Li4zNTg2YjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC00MjUsOSArNDI1LDYgQEAKIH0KICNlbmRpZgogCi1leHRlcm4gbG9uZyB2cmVhZChjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIGxvbmcgdndyaXRlKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci0KICNpZmRlZiBDT05GSUdfREVWS01FTQogLyoKICAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlICp2aXJ0dWFsKiBtZW1vcnkgYXMgc2VlbiBieSB0aGUga2VybmVsLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKaW5kZXggNGY4ZDY3Zi4uOTRhZDJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYworKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCkBAIC02NjMsNyArNjYzLDcgQEAKICNpZiAwCiAJLyogc3lzZnMgKi8KIAltZW1zZXQoJm13YXZlX2RldmljZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgZGV2aWNlKSk7Ci0Jc25wcmludGYobXdhdmVfZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICJtd2F2ZSIpOworCWRldl9zZXRfbmFtZSgmbXdhdmVfZGV2aWNlLCAibXdhdmUiKTsKIAogCWlmIChkZXZpY2VfcmVnaXN0ZXIoJm13YXZlX2RldmljZSkpCiAJCWdvdG8gY2xlYW51cF9lcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCBjN2FmYzA2Li43YzEzNTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC00MDcsNyArNDA3LDcgQEAKIAkvKiByZWFkLXdyaXRlIGRhdGE6ICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGFkZF9wdHI7Ci0JaW50IGVudHJvcHlfY291bnQ7CS8qIE11c3QgYXQgbm8gdGltZSBleGNlZWQgLT5QT09MQklUUyEgKi8KKwlpbnQgZW50cm9weV9jb3VudDsKIAlpbnQgaW5wdXRfcm90YXRlOwogfTsKIApAQCAtNzY3LDExICs3NjcsMTAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JQlVHX09OKHItPmVudHJvcHlfY291bnQgPiByLT5wb29saW5mby0+UE9PTEJJVFMpOwotCiAJLyogSG9sZCBsb2NrIHdoaWxlIGFjY291bnRpbmcgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmci0+bG9jaywgZmxhZ3MpOwogCisJQlVHX09OKHItPmVudHJvcHlfY291bnQgPiByLT5wb29saW5mby0+UE9PTEJJVFMpOwogCURFQlVHX0VOVCgidHJ5aW5nIHRvIGV4dHJhY3QgJWQgYml0cyBmcm9tICVzXG4iLAogCQkgIG5ieXRlcyAqIDgsIHItPm5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3lzcnEuYyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCmluZGV4IDk0OTY2ZWQuLmQ0MWI5ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeXNycS5jCisrKyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCkBAIC04Miw3ICs4Miw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9sb2dsZXZlbF9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9sb2dsZXZlbCwKLQkuaGVscF9tc2cJPSAibG9nbGV2ZWwwLTgiLAorCS5oZWxwX21zZwk9ICJsb2dsZXZlbCgwLTkpIiwKIAkuYWN0aW9uX21zZwk9ICJDaGFuZ2luZyBMb2dsZXZlbCIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0xPRywKIH07CkBAIC0yMzMsNyArMjMzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd2FsbGNwdXNfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd2FsbGNwdXMsCi0JLmhlbHBfbXNnCT0gImFMbGNwdXMiLAorCS5oZWxwX21zZwk9ICJzaG93LWJhY2t0cmFjZS1hbGwtYWN0aXZlLWNwdXMoTCkiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgYmFja3RyYWNlIG9mIGFsbCBhY3RpdmUgQ1BVcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93cmVnc19vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9zaG93cmVncywKLQkuaGVscF9tc2cJPSAic2hvd1BjIiwKKwkuaGVscF9tc2cJPSAic2hvdy1yZWdpc3RlcnMoUCkiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgUmVncyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjU4LDcgKzI1OCw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93c3RhdGVfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd3N0YXRlLAotCS5oZWxwX21zZwk9ICJzaG93VGFza3MiLAorCS5oZWxwX21zZwk9ICJzaG93LXRhc2stc3RhdGVzKFQpIiwKIAkuYWN0aW9uX21zZwk9ICJTaG93IFN0YXRlIiwKIAkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfRFVNUCwKIH07CkBAIC0yNjksNyArMjY5LDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dzdGF0ZV9ibG9ja2VkX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dzdGF0ZV9ibG9ja2VkLAotCS5oZWxwX21zZwk9ICJzaG9XLWJsb2NrZWQtdGFza3MiLAorCS5oZWxwX21zZwk9ICJzaG93LWJsb2NrZWQtdGFza3MoVykiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgQmxvY2tlZCBTdGF0ZSIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjk3LDcgKzI5Nyw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93bWVtX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dtZW0sCi0JLmhlbHBfbXNnCT0gInNob3dNZW0iLAorCS5oZWxwX21zZwk9ICJzaG93LW1lbW9yeS11c2FnZShNKSIsCiAJLmFjdGlvbl9tc2cJPSAiU2hvdyBNZW1vcnkiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAogfTsKQEAgLTMyMyw3ICszMjMsNyBAQAogfQogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfdGVybV9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV90ZXJtLAotCS5oZWxwX21zZwk9ICJ0RXJtIiwKKwkuaGVscF9tc2cJPSAidGVybWluYXRlLWFsbC10YXNrcyhFKSIsCiAJLmFjdGlvbl9tc2cJPSAiVGVybWluYXRlIEFsbCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNDEsNyArMzQxLDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX21vb21fb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfbW9vbSwKLQkuaGVscF9tc2cJPSAiRnVsbCIsCisJLmhlbHBfbXNnCT0gIm1lbW9yeS1mdWxsLW9vbS1raWxsKEYpIiwKIAkuYWN0aW9uX21zZwk9ICJNYW51YWwgT09NIGV4ZWN1dGlvbiIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNTMsNyArMzUzLDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX2tpbGxfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfa2lsbCwKLQkuaGVscF9tc2cJPSAia0lsbCIsCisJLmhlbHBfbXNnCT0gImtpbGwtYWxsLXRhc2tzKEkpIiwKIAkuYWN0aW9uX21zZwk9ICJLaWxsIEFsbCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNjQsNyArMzY0LDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3VucnRfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfdW5ydCwKLQkuaGVscF9tc2cJPSAiTmljZSIsCisJLmhlbHBfbXNnCT0gIm5pY2UtYWxsLVJULXRhc2tzKE4pIiwKIAkuYWN0aW9uX21zZwk9ICJOaWNlIEFsbCBSVCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1JUTklDRSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvS2NvbmZpZyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCmluZGV4IGUyNjY3YTguLmVlZTQ3ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCkBAIC0xMDksNiArMTA5LDEzIEBACiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlIEludGVsCiAJICBYMzggc2VydmVyIGNoaXBzZXRzLgogCitjb25maWcgRURBQ19JNTQwMAorCXRyaXN0YXRlICJJbnRlbCA1NDAwIChTZWFidXJnKSBjaGlwc2V0cyIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kgJiYgWDg2CisJaGVscAorCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIHRoZSBJbnRlbAorCSAgaTU0MDAgTUNIIGNoaXBzZXQgKFNlYWJ1cmcpLgorCiBjb25maWcgRURBQ19JODI4NjAKIAl0cmlzdGF0ZSAiSW50ZWwgODI4NjAiCiAJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgUENJICYmIFg4Nl8zMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL01ha2VmaWxlIGIvZHJpdmVycy9lZGFjL01ha2VmaWxlCmluZGV4IDYyYzJkOWIuLmI3NTE5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19FREFDX0FNRDc2WCkJCSs9IGFtZDc2eF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k1MDAwKQkJKz0gaTUwMDBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19JNTEwMCkJCSs9IGk1MTAwX2VkYWMubworb2JqLSQoQ09ORklHX0VEQUNfSTU0MDApCQkrPSBpNTQwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0U3WFhYKQkJKz0gZTd4eHhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19FNzUyWCkJCSs9IGU3NTJ4X2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfSTgyNDQzQlhHWCkJCSs9IGk4MjQ0M2J4Z3hfZWRhYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19kZXZpY2UuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCmluZGV4IDQwNDFlOTEuLmNhOTExM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCkBAIC0zMzMsNyArMzMzLDcgQEAKIGZhaWwwOgogCWVkYWNfcHJpbnRrKEtFUk5fV0FSTklORywgRURBQ19NQywKIAkJCSIlcyAoJXMpICVzICVzIGFscmVhZHkgYXNzaWduZWQgJWRcbiIsCi0JCQlyb3Zlci0+ZGV2LT5idXNfaWQsIGVkYWNfZGV2X25hbWUocm92ZXIpLAorCQkJZGV2X25hbWUocm92ZXItPmRldiksIGVkYWNfZGV2X25hbWUocm92ZXIpLAogCQkJcm92ZXItPm1vZF9uYW1lLCByb3Zlci0+Y3RsX25hbWUsIHJvdmVyLT5kZXZfaWR4KTsKIAlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKaW5kZXggZDExMDM5Mi4uMjVkNjY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCkBAIC00MDEsNyArNDAxLDcgQEAKIAogZmFpbDA6CiAJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX01DLAotCQkiJXMgKCVzKSAlcyAlcyBhbHJlYWR5IGFzc2lnbmVkICVkXG4iLCBwLT5kZXYtPmJ1c19pZCwKKwkJIiVzICglcykgJXMgJXMgYWxyZWFkeSBhc3NpZ25lZCAlZFxuIiwgZGV2X25hbWUocC0+ZGV2KSwKIAkJZWRhY19kZXZfbmFtZShtY2kpLCBwLT5tb2RfbmFtZSwgcC0+Y3RsX25hbWUsIHAtPm1jX2lkeCk7CiAJcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpLmMKaW5kZXggMjJlYzlkNS4uNWQzYzgwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfcGNpLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogZmFpbDA6CiAJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX1BDSSwKIAkJIiVzICglcykgJXMgJXMgYWxyZWFkeSBhc3NpZ25lZCAlZFxuIiwKLQkJcm92ZXItPmRldi0+YnVzX2lkLCBlZGFjX2Rldl9uYW1lKHJvdmVyKSwKKwkJZGV2X25hbWUocm92ZXItPmRldiksIGVkYWNfZGV2X25hbWUocm92ZXIpLAogCQlyb3Zlci0+bW9kX25hbWUsIHJvdmVyLT5jdGxfbmFtZSwgcm92ZXItPnBjaV9pZHgpOwogCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19wY2lfc3lzZnMuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jCmluZGV4IDVjMTUzZGMuLjQyMjcyOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jCkBAIC01NjksNyArNTY5LDcgQEAKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotCWRlYnVnZjQoIlBDSSBTVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXYtPmRldi5idXNfaWQpOworCWRlYnVnZjQoIlBDSSBTVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCS8qIGNoZWNrIHRoZSBzdGF0dXMgcmVnIGZvciBlcnJvcnMgb24gYm9hcmRzIE5PVCBtYXJrZWQgYXMgYnJva2VuCiAJICogaWYgYnJva2VuLCB3ZSBjYW5ub3QgdHJ1c3QgYW55IG9mIHRoZSBzdGF0dXMgYml0cwpAQCAtNjAwLDEzICs2MDAsMTMgQEAKIAl9CiAKIAotCWRlYnVnZjQoIlBDSSBIRUFERVIgVFlQRT0gMHglMDJ4ICVzXG4iLCBoZWFkZXJfdHlwZSwgZGV2LT5kZXYuYnVzX2lkKTsKKwlkZWJ1Z2Y0KCJQQ0kgSEVBREVSIFRZUEU9IDB4JTAyeCAlc1xuIiwgaGVhZGVyX3R5cGUsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJaWYgKChoZWFkZXJfdHlwZSAmIDB4N0YpID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKIAkJLyogT24gYnJpZGdlcywgbmVlZCB0byBleGFtaW5lIHNlY29uZGFyeSBzdGF0dXMgcmVnaXN0ZXIgICovCiAJCXN0YXR1cyA9IGdldF9wY2lfcGFyaXR5X3N0YXR1cyhkZXYsIDEpOwogCi0JCWRlYnVnZjQoIlBDSSBTRUNfU1RBVFVTPSAweCUwNHggJXNcbiIsIHN0YXR1cywgZGV2LT5kZXYuYnVzX2lkKTsKKwkJZGVidWdmNCgiUENJIFNFQ19TVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCQkvKiBjaGVjayB0aGUgc2Vjb25kYXJ5IHN0YXR1cyByZWcgZm9yIGVycm9ycywKIAkJICogb24gTk9UIGJyb2tlbiBib2FyZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGI2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jCkBAIC0wLDAgKzEsMTQ3NiBAQAorLyoKKyAqIEludGVsIDU0MDAgY2xhc3MgTWVtb3J5IENvbnRyb2xsZXJzIGtlcm5lbCBtb2R1bGUgKFNlYWJ1cmcpCisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggYnk6CisgKgkgQmVuIFdvb2RhcmQgPHdvb2RhcmRAcmVkaGF0LmNvbT4KKyAqCSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KKyAqCisgKiBSZWQgSGF0IEluYy4gaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICogRm9ya2VkIGFuZCBhZGFwdGVkIGZyb20gdGhlIGk1MDAwX2VkYWMgZHJpdmVyIHdoaWNoIHdhcworICogd3JpdHRlbiBieSBEb3VnbGFzIFRob21wc29uIExpbnV4IE5ldHdvcnggPG5vcnNrNUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBkb2N1bWVudDoKKyAqCisgKiBJbnRlbCA1NDAwIENoaXBzZXQgTWVtb3J5IENvbnRyb2xsZXIgSHViIChNQ0gpIC0gRGF0YXNoZWV0CisgKiAJaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vZGVzaWduL2NoaXBzZXRzL2RhdGFzaHRzLzMxMzA3MC5odG0KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2VkYWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKworI2luY2x1ZGUgImVkYWNfY29yZS5oIgorCisvKgorICogQWx0ZXIgdGhpcyB2ZXJzaW9uIGZvciB0aGUgSTU0MDAgbW9kdWxlIHdoZW4gbW9kaWZpY2F0aW9ucyBhcmUgbWFkZQorICovCisjZGVmaW5lIEk1NDAwX1JFVklTSU9OICAgICIgVmVyOiAxLjAuMCAiIF9fREFURV9fCisKKyNkZWZpbmUgRURBQ19NT0RfU1RSICAgICAgImk1NDAwX2VkYWMiCisKKyNkZWZpbmUgaTU0MDBfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgXAorCWVkYWNfcHJpbnRrKGxldmVsLCAiaTU0MDAiLCBmbXQsICMjYXJnKQorCisjZGVmaW5lIGk1NDAwX21jX3ByaW50ayhtY2ksIGxldmVsLCBmbXQsIGFyZy4uLikgXAorCWVkYWNfbWNfY2hpcHNldF9wcmludGsobWNpLCBsZXZlbCwgImk1NDAwIiwgZm10LCAjI2FyZykKKworLyogTGltaXRzIGZvciBpNTQwMCAqLworI2RlZmluZSBOVU1fTVRSU19QRVJfQlJBTkNICTQKKyNkZWZpbmUgQ0hBTk5FTFNfUEVSX0JSQU5DSAkyCisjZGVmaW5lCU1BWF9DSEFOTkVMUwkJNAorI2RlZmluZSBNQVhfRElNTVMJCShNQVhfQ0hBTk5FTFMgKiA0KQkvKiBVcCB0byA0IERJTU0ncyBwZXIgY2hhbm5lbCAqLworI2RlZmluZSBNQVhfQ1NST1dTCQkoTUFYX0RJTU1TICogMikJCS8qIG1heCBwb3NzaWJsZSBjc3Jvd3MgcGVyIGNoYW5uZWwgKi8KKworLyogRGV2aWNlIDE2LAorICogRnVuY3Rpb24gMDogU3lzdGVtIEFkZHJlc3MKKyAqIEZ1bmN0aW9uIDE6IE1lbW9yeSBCcmFuY2ggTWFwLCBDb250cm9sLCBFcnJvcnMgUmVnaXN0ZXIKKyAqIEZ1bmN0aW9uIDI6IEZTQiBFcnJvciBSZWdpc3RlcnMKKyAqCisgKiBBbGwgMyBmdW5jdGlvbnMgb2YgRGV2aWNlIDE2ICgwLDEsMikgc2hhcmUgdGhlIFNBTUUgRElEIGFuZAorICogdXNlcyBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRVJSIGZvciBkZXZpY2UgMTYgKDAsMSwyKSwKKyAqIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9GQkQwIGFuZCBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRkJEMQorICogZm9yIGRldmljZSAyMSAoMCwxKS4KKyAqLworCisJLyogT0ZGU0VUUyBmb3IgRnVuY3Rpb24gMCAqLworI2RlZmluZQkJQU1CQVNFCQkJMHg0OCAvKiBBTUIgTWVtIE1hcHBlZCBSZWcgUmVnaW9uIEJhc2UgKi8KKyNkZWZpbmUJCU1BWENICQkJMHg1NiAvKiBNYXggQ2hhbm5lbCBOdW1iZXIgKi8KKyNkZWZpbmUJCU1BWERJTU1QRVJDSAkJMHg1NyAvKiBNYXggRElNTSBQRVIgQ2hhbm5lbCBOdW1iZXIgKi8KKworCS8qIE9GRlNFVFMgZm9yIEZ1bmN0aW9uIDEgKi8KKyNkZWZpbmUJCVRPTE0JCQkweDZDCisjZGVmaW5lCQlSRURNRU1CCQkJMHg3QworI2RlZmluZQkJCVJFQ19FQ0NfTE9DQVRPUl9PREQoeCkJKCh4KSAmIDB4M2ZlMDApIC8qIGJpdHMgWzE3OjldIGluZGljYXRlIE9ERCwgWzg6MF0gIGluZGljYXRlIEVWRU4gKi8KKyNkZWZpbmUJCU1JUjAJCQkweDgwCisjZGVmaW5lCQlNSVIxCQkJMHg4NAorI2RlZmluZQkJQU1JUjAJCQkweDhjCisjZGVmaW5lCQlBTUlSMQkJCTB4OTAKKworCS8qIEZhdGFsIGVycm9yIHJlZ2lzdGVycyAqLworI2RlZmluZQkJRkVSUl9GQVRfRkJECQkweDk4CS8qIGFsc28gY2FsbGVkIGFzIEZFUlJfRkFUX0ZCX0RJTU0gYXQgZGF0YXNoZWV0ICovCisjZGVmaW5lCQkJRkVSUl9GQVRfRkJEQ0hBTiAoMzw8MjgpCS8qIGNoYW5uZWwgaW5kZXggd2hlcmUgdGhlIGhpZ2hlc3Qtb3JkZXIgZXJyb3Igb2NjdXJyZWQgKi8KKworI2RlZmluZQkJTkVSUl9GQVRfRkJECQkweDljCisjZGVmaW5lCQlGRVJSX05GX0ZCRAkJMHhhMAkvKiBhbHNvIGNhbGxlZCBhcyBGRVJSX05GQVRfRkJfRElNTSBhdCBkYXRhc2hlZXQgKi8KKworCS8qIE5vbi1mYXRhbCBlcnJvciByZWdpc3RlciAqLworI2RlZmluZQkJTkVSUl9ORl9GQkQJCTB4YTQKKworCS8qIEVuYWJsZSBlcnJvciBtYXNrICovCisjZGVmaW5lCQlFTUFTS19GQkQJCTB4YTgKKworI2RlZmluZQkJRVJSMF9GQkQJCTB4YWMKKyNkZWZpbmUJCUVSUjFfRkJECQkweGIwCisjZGVmaW5lCQlFUlIyX0ZCRAkJMHhiNAorI2RlZmluZQkJTUNFUlJfRkJECQkweGI4CisKKwkvKiBObyBPRkZTRVRTIGZvciBEZXZpY2UgMTYgRnVuY3Rpb24gMiAqLworCisvKgorICogRGV2aWNlIDIxLAorICogRnVuY3Rpb24gMDogTWVtb3J5IE1hcCBCcmFuY2ggMAorICoKKyAqIERldmljZSAyMiwKKyAqIEZ1bmN0aW9uIDA6IE1lbW9yeSBNYXAgQnJhbmNoIDEKKyAqLworCisJLyogT0ZGU0VUUyBmb3IgRnVuY3Rpb24gMCAqLworI2RlZmluZSBBTUJQUkVTRU5UXzAJMHg2NAorI2RlZmluZSBBTUJQUkVTRU5UXzEJMHg2NgorI2RlZmluZSBNVFIwCQkweDgwCisjZGVmaW5lIE1UUjEJCTB4ODIKKyNkZWZpbmUgTVRSMgkJMHg4NAorI2RlZmluZSBNVFIzCQkweDg2CisKKwkvKiBPRkZTRVRTIGZvciBGdW5jdGlvbiAxICovCisjZGVmaW5lIE5SRUNGR0xPRwkJMHg3NAorI2RlZmluZSBSRUNGR0xPRwkJMHg3OAorI2RlZmluZSBOUkVDTUVNQQkJMHhiZQorI2RlZmluZSBOUkVDTUVNQgkJMHhjMAorI2RlZmluZSBOUkVDRkJfRElNTUEJCTB4YzQKKyNkZWZpbmUgTlJFQ0ZCX0RJTU1CCQkweGM4CisjZGVmaW5lIE5SRUNGQl9ESU1NQwkJMHhjYworI2RlZmluZSBOUkVDRkJfRElNTUQJCTB4ZDAKKyNkZWZpbmUgTlJFQ0ZCX0RJTU1FCQkweGQ0CisjZGVmaW5lIE5SRUNGQl9ESU1NRgkJMHhkOAorI2RlZmluZSBSRURNRU1BCQkJMHhkQworI2RlZmluZSBSRUNNRU1BCQkJMHhmMAorI2RlZmluZSBSRUNNRU1CCQkJMHhmNAorI2RlZmluZSBSRUNGQl9ESU1NQQkJMHhmOAorI2RlZmluZSBSRUNGQl9ESU1NQgkJMHhlYworI2RlZmluZSBSRUNGQl9ESU1NQwkJMHhmMAorI2RlZmluZSBSRUNGQl9ESU1NRAkJMHhmNAorI2RlZmluZSBSRUNGQl9ESU1NRQkJMHhmOAorI2RlZmluZSBSRUNGQl9ESU1NRgkJMHhmQworCisvKgorICogRXJyb3IgaW5kaWNhdG9yIGJpdHMgYW5kIG1hc2tzCisgKiBFcnJvciBtYXNrcyBhcmUgYWNjb3JkaW5nIHdpdGggVGFibGUgNS0xNyBvZiBpNTQwMCBkYXRhc2hlZXQKKyAqLworCitlbnVtIGVycm9yX21hc2sgeworCUVNQVNLX00xICA9IDE8PDAsICAvKiBNZW1vcnkgV3JpdGUgZXJyb3Igb24gbm9uLXJlZHVuZGFudCByZXRyeSAqLworCUVNQVNLX00yICA9IDE8PDEsICAvKiBNZW1vcnkgb3IgRkItRElNTSBjb25maWd1cmF0aW9uIENSQyByZWFkIGVycm9yICovCisJRU1BU0tfTTMgID0gMTw8MiwgIC8qIFJlc2VydmVkICovCisJRU1BU0tfTTQgID0gMTw8MywgIC8qIFVuY29ycmVjdGFibGUgRGF0YSBFQ0Mgb24gUmVwbGF5ICovCisJRU1BU0tfTTUgID0gMTw8NCwgIC8qIEFsaWFzZWQgVW5jb3JyZWN0YWJsZSBOb24tTWlycm9yZWQgRGVtYW5kIERhdGEgRUNDICovCisJRU1BU0tfTTYgID0gMTw8NSwgIC8qIFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJRU1BU0tfTTcgID0gMTw8NiwgIC8qIEFsaWFzZWQgVW5jb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyAqLworCUVNQVNLX004ICA9IDE8PDcsICAvKiBBbGlhc2VkIFVuY29ycmVjdGFibGUgUGF0cm9sIERhdGEgRUNDICovCisJRU1BU0tfTTkgID0gMTw8OCwgIC8qIE5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyAqLworCUVNQVNLX00xMCA9IDE8PDksICAvKiBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCUVNQVNLX00xMSA9IDE8PDEwLCAvKiBOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFJlc2lsdmVyLSBvciBTcGFyZS1Db3B5IERhdGEgRUNDICAqLworCUVNQVNLX00xMiA9IDE8PDExLCAvKiBOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyAqLworCUVNQVNLX00xMyA9IDE8PDEyLCAvKiBNZW1vcnkgV3JpdGUgZXJyb3Igb24gZmlyc3QgYXR0ZW1wdCAqLworCUVNQVNLX00xNCA9IDE8PDEzLCAvKiBGQi1ESU1NIENvbmZpZ3VyYXRpb24gV3JpdGUgZXJyb3Igb24gZmlyc3QgYXR0ZW1wdCAqLworCUVNQVNLX00xNSA9IDE8PDE0LCAvKiBNZW1vcnkgb3IgRkItRElNTSBjb25maWd1cmF0aW9uIENSQyByZWFkIGVycm9yICovCisJRU1BU0tfTTE2ID0gMTw8MTUsIC8qIENoYW5uZWwgRmFpbGVkLU92ZXIgT2NjdXJyZWQgKi8KKwlFTUFTS19NMTcgPSAxPDwxNiwgLyogQ29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyAqLworCUVNQVNLX00xOCA9IDE8PDE3LCAvKiBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCUVNQVNLX00xOSA9IDE8PDE4LCAvKiBDb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyAqLworCUVNQVNLX00yMCA9IDE8PDE5LCAvKiBDb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MgKi8KKwlFTUFTS19NMjEgPSAxPDwyMCwgLyogRkItRElNTSBOb3J0aGJvdW5kIHBhcml0eSBlcnJvciBvbiBGQi1ESU1NIFN5bmMgU3RhdHVzICovCisJRU1BU0tfTTIyID0gMTw8MjEsIC8qIFNQRCBwcm90b2NvbCBFcnJvciAqLworCUVNQVNLX00yMyA9IDE8PDIyLCAvKiBOb24tUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCAqLworCUVNQVNLX00yNCA9IDE8PDIzLCAvKiBSZWZyZXNoIGVycm9yICovCisJRU1BU0tfTTI1ID0gMTw8MjQsIC8qIE1lbW9yeSBXcml0ZSBlcnJvciBvbiByZWR1bmRhbnQgcmV0cnkgKi8KKwlFTUFTS19NMjYgPSAxPDwyNSwgLyogUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCAqLworCUVNQVNLX00yNyA9IDE8PDI2LCAvKiBDb3JyZWN0YWJsZSBDb3VudGVyIFRocmVzaG9sZCBFeGNlZWRlZCAqLworCUVNQVNLX00yOCA9IDE8PDI3LCAvKiBESU1NLVNwYXJlIENvcHkgQ29tcGxldGVkICovCisJRU1BU0tfTTI5ID0gMTw8MjgsIC8qIERJTU0tSXNvbGF0aW9uIENvbXBsZXRlZCAqLworfTsKKworLyoKKyAqIE5hbWVzIHRvIHRyYW5zbGF0ZSBiaXQgZXJyb3IgaW50byBzb21ldGhpbmcgdXNlZnVsCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICplcnJvcl9uYW1lW10gPSB7CisJWzBdICA9ICJNZW1vcnkgV3JpdGUgZXJyb3Igb24gbm9uLXJlZHVuZGFudCByZXRyeSIsCisJWzFdICA9ICJNZW1vcnkgb3IgRkItRElNTSBjb25maWd1cmF0aW9uIENSQyByZWFkIGVycm9yIiwKKwkvKiBSZXNlcnZlZCAqLworCVszXSAgPSAiVW5jb3JyZWN0YWJsZSBEYXRhIEVDQyBvbiBSZXBsYXkiLAorCVs0XSAgPSAiQWxpYXNlZCBVbmNvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCBEZW1hbmQgRGF0YSBFQ0MiLAorCS8qIE02IFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJWzZdICA9ICJBbGlhc2VkIFVuY29ycmVjdGFibGUgUmVzaWx2ZXItIG9yIFNwYXJlLUNvcHkgRGF0YSBFQ0MiLAorCVs3XSAgPSAiQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyIsCisJWzhdICA9ICJOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCBEZW1hbmQgRGF0YSBFQ0MiLAorCS8qIE0xMCBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCVsxMF0gPSAiTm9uLUFsaWFzZWQgVW5jb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyIsCisJWzExXSA9ICJOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyIsCisJWzEyXSA9ICJNZW1vcnkgV3JpdGUgZXJyb3Igb24gZmlyc3QgYXR0ZW1wdCIsCisJWzEzXSA9ICJGQi1ESU1NIENvbmZpZ3VyYXRpb24gV3JpdGUgZXJyb3Igb24gZmlyc3QgYXR0ZW1wdCIsCisJWzE0XSA9ICJNZW1vcnkgb3IgRkItRElNTSBjb25maWd1cmF0aW9uIENSQyByZWFkIGVycm9yIiwKKwlbMTVdID0gIkNoYW5uZWwgRmFpbGVkLU92ZXIgT2NjdXJyZWQiLAorCVsxNl0gPSAiQ29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyIsCisJLyogTTE4IFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJWzE4XSA9ICJDb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyIsCisJWzE5XSA9ICJDb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MiLAorCVsyMF0gPSAiRkItRElNTSBOb3J0aGJvdW5kIHBhcml0eSBlcnJvciBvbiBGQi1ESU1NIFN5bmMgU3RhdHVzIiwKKwlbMjFdID0gIlNQRCBwcm90b2NvbCBFcnJvciIsCisJWzIyXSA9ICJOb24tUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCIsCisJWzIzXSA9ICJSZWZyZXNoIGVycm9yIiwKKwlbMjRdID0gIk1lbW9yeSBXcml0ZSBlcnJvciBvbiByZWR1bmRhbnQgcmV0cnkiLAorCVsyNV0gPSAiUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCIsCisJWzI2XSA9ICJDb3JyZWN0YWJsZSBDb3VudGVyIFRocmVzaG9sZCBFeGNlZWRlZCIsCisJWzI3XSA9ICJESU1NLVNwYXJlIENvcHkgQ29tcGxldGVkIiwKKwlbMjhdID0gIkRJTU0tSXNvbGF0aW9uIENvbXBsZXRlZCIsCit9OworCisvKiBGYXRhbCBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfRkFUX01BU0sJCShFTUFTS19NMSB8IFwKKwkJCQkgRU1BU0tfTTIgfCBcCisJCQkJIEVNQVNLX00yMykKKworLyogQ29ycmVjdGFibGUgZXJyb3JzICovCisjZGVmaW5lIEVSUk9SX05GX0NPUlJFQ1RBQkxFCShFTUFTS19NMjcgfCBcCisJCQkJIEVNQVNLX00yMCB8IFwKKwkJCQkgRU1BU0tfTTE5IHwgXAorCQkJCSBFTUFTS19NMTggfCBcCisJCQkJIEVNQVNLX00xNyB8IFwKKwkJCQkgRU1BU0tfTTE2KQorI2RlZmluZSBFUlJPUl9ORl9ESU1NX1NQQVJFCShFTUFTS19NMjkgfCBcCisJCQkJIEVNQVNLX00yOCkKKyNkZWZpbmUgRVJST1JfTkZfU1BEX1BST1RPQ09MCShFTUFTS19NMjIpCisjZGVmaW5lIEVSUk9SX05GX05PUlRIX0NSQwkoRU1BU0tfTTIxKQorCisvKiBSZWNvdmVyYWJsZSBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfTkZfUkVDT1ZFUkFCTEUJKEVNQVNLX00yNiB8IFwKKwkJCQkgRU1BU0tfTTI1IHwgXAorCQkJCSBFTUFTS19NMjQgfCBcCisJCQkJIEVNQVNLX00xNSB8IFwKKwkJCQkgRU1BU0tfTTE0IHwgXAorCQkJCSBFTUFTS19NMTMgfCBcCisJCQkJIEVNQVNLX00xMiB8IFwKKwkJCQkgRU1BU0tfTTExIHwgXAorCQkJCSBFTUFTS19NOSAgfCBcCisJCQkJIEVNQVNLX004ICB8IFwKKwkJCQkgRU1BU0tfTTcgIHwgXAorCQkJCSBFTUFTS19NNSkKKworLyogdW5jb3JyZWN0YWJsZSBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfTkZfVU5DT1JSRUNUQUJMRQkoRU1BU0tfTTQpCisKKy8qIG1hc2sgdG8gYWxsIG5vbi1mYXRhbCBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfTkZfTUFTSwkJKEVSUk9SX05GX0NPUlJFQ1RBQkxFICAgfCBcCisJCQkJIEVSUk9SX05GX1VOQ09SUkVDVEFCTEUgfCBcCisJCQkJIEVSUk9SX05GX1JFQ09WRVJBQkxFICAgfCBcCisJCQkJIEVSUk9SX05GX0RJTU1fU1BBUkUgICAgfCBcCisJCQkJIEVSUk9SX05GX1NQRF9QUk9UT0NPTCAgfCBcCisJCQkJIEVSUk9SX05GX05PUlRIX0NSQykKKworLyoKKyAqIERlZmluZSBlcnJvciBtYXNrcyBmb3IgdGhlIHNldmVyYWwgcmVnaXN0ZXJzCisgKi8KKworLyogRW5hYmxlIGFsbCBmYXRhbCBhbmQgbm9uIGZhdGFsIGVycm9ycyAqLworI2RlZmluZSBFTkFCTEVfRU1BU0tfQUxMCShFUlJPUl9GQVRfTUFTSyB8IEVSUk9SX05GX01BU0spCisKKy8qIG1hc2sgZm9yIGZhdGFsIGVycm9yIHJlZ2lzdGVycyAqLworI2RlZmluZSBGRVJSX0ZBVF9NQVNLIEVSUk9SX0ZBVF9NQVNLCisKKy8qIG1hc2tzIGZvciBub24tZmF0YWwgZXJyb3IgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRvX25mX21hc2sodW5zaWduZWQgaW50IG1hc2spCit7CisJcmV0dXJuIChtYXNrICYgRU1BU0tfTTI5KSB8IChtYXNrID4+IDMpOworfTsKKworc3RhdGljIGlubGluZSBpbnQgZnJvbV9uZl9mZXJyKHVuc2lnbmVkIGludCBtYXNrKQoreworCXJldHVybiAobWFzayAmIEVNQVNLX00yOSkgfAkJLyogQml0IDI4ICovCisJICAgICAgIChtYXNrICYgKCgxIDw8IDI4KSAtIDEpIDw8IDMpOwkvKiBCaXRzIDAgdG8gMjcgKi8KK307CisKKyNkZWZpbmUgRkVSUl9ORl9NQVNLCQl0b19uZl9tYXNrKEVSUk9SX05GX01BU0spCisjZGVmaW5lIEZFUlJfTkZfQ09SUkVDVEFCTEUJdG9fbmZfbWFzayhFUlJPUl9ORl9DT1JSRUNUQUJMRSkKKyNkZWZpbmUgRkVSUl9ORl9ESU1NX1NQQVJFCXRvX25mX21hc2soRVJST1JfTkZfRElNTV9TUEFSRSkKKyNkZWZpbmUgRkVSUl9ORl9TUERfUFJPVE9DT0wJdG9fbmZfbWFzayhFUlJPUl9ORl9TUERfUFJPVE9DT0wpCisjZGVmaW5lIEZFUlJfTkZfTk9SVEhfQ1JDCXRvX25mX21hc2soRVJST1JfTkZfTk9SVEhfQ1JDKQorI2RlZmluZSBGRVJSX05GX1JFQ09WRVJBQkxFCXRvX25mX21hc2soRVJST1JfTkZfUkVDT1ZFUkFCTEUpCisjZGVmaW5lIEZFUlJfTkZfVU5DT1JSRUNUQUJMRQl0b19uZl9tYXNrKEVSUk9SX05GX1VOQ09SUkVDVEFCTEUpCisKKy8qIERlZmluZXMgdG8gZXh0cmFjdCB0aGUgdmFpb3VzIGZpZWxkcyBmcm9tIHRoZQorICoJTVRSeCAtIE1lbW9yeSBUZWNobm9sb2d5IFJlZ2lzdGVycworICovCisjZGVmaW5lIE1UUl9ESU1NU19QUkVTRU5UKG10cikJCSgobXRyKSAmICgxIDw8IDEwKSkKKyNkZWZpbmUgTVRSX0RJTU1TX0VUSFJPVFRMRShtdHIpCSgobXRyKSAmICgxIDw8IDkpKQorI2RlZmluZSBNVFJfRFJBTV9XSURUSChtdHIpCQkoKChtdHIpICYgKDEgPDwgOCkpID8gOCA6IDQpCisjZGVmaW5lIE1UUl9EUkFNX0JBTktTKG10cikJCSgoKG10cikgJiAoMSA8PCA2KSkgPyA4IDogNCkKKyNkZWZpbmUgTVRSX0RSQU1fQkFOS1NfQUREUl9CSVRTKG10cikJKChNVFJfRFJBTV9CQU5LUyhtdHIpID09IDgpID8gMyA6IDIpCisjZGVmaW5lIE1UUl9ESU1NX1JBTksobXRyKQkJKCgobXRyKSA+PiA1KSAmIDB4MSkKKyNkZWZpbmUgTVRSX0RJTU1fUkFOS19BRERSX0JJVFMobXRyKQkoTVRSX0RJTU1fUkFOSyhtdHIpID8gMiA6IDEpCisjZGVmaW5lIE1UUl9ESU1NX1JPV1MobXRyKQkJKCgobXRyKSA+PiAyKSAmIDB4MykKKyNkZWZpbmUgTVRSX0RJTU1fUk9XU19BRERSX0JJVFMobXRyKQkoTVRSX0RJTU1fUk9XUyhtdHIpICsgMTMpCisjZGVmaW5lIE1UUl9ESU1NX0NPTFMobXRyKQkJKChtdHIpICYgMHgzKQorI2RlZmluZSBNVFJfRElNTV9DT0xTX0FERFJfQklUUyhtdHIpCShNVFJfRElNTV9DT0xTKG10cikgKyAxMCkKKworLyogVGhpcyBhcHBsaWVzIHRvIEZFUlJfTkZfRkItRElNTSBhcyB3ZWxsIGFzIEZFUlJfRkFUX0ZCLURJTU0gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4dHJhY3RfZmJkY2hhbl9pbmR4KHUzMiB4KQoreworCXJldHVybiAoeD4+MjgpICYgMHgzOworfQorCisjaWZkZWYgQ09ORklHX0VEQUNfREVCVUcKKy8qIE1UUiBOVU1ST1cgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpudW1yb3dfdG9TdHJpbmdbXSA9IHsKKwkiOCwxOTIgLSAxMyByb3dzIiwKKwkiMTYsMzg0IC0gMTQgcm93cyIsCisJIjMyLDc2OCAtIDE1IHJvd3MiLAorCSI2NSw1MzYgLSAxNiByb3dzIgorfTsKKworLyogTVRSIE5VTUNPTCAqLworc3RhdGljIGNvbnN0IGNoYXIgKm51bWNvbF90b1N0cmluZ1tdID0geworCSIxLDAyNCAtIDEwIGNvbHVtbnMiLAorCSIyLDA0OCAtIDExIGNvbHVtbnMiLAorCSI0LDA5NiAtIDEyIGNvbHVtbnMiLAorCSJyZXNlcnZlZCIKK307CisjZW5kaWYKKworLyogRGV2aWNlIG5hbWUgYW5kIHJlZ2lzdGVyIERJRCAoRGV2aWNlIElEKSAqLworc3RydWN0IGk1NDAwX2Rldl9pbmZvIHsKKwljb25zdCBjaGFyICpjdGxfbmFtZTsJLyogbmFtZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwl1MTYgZnNiX21hcHBpbmdfZXJyb3JzOwkvKiBESUQgZm9yIHRoZSBicmFuY2htYXAsY29udHJvbCAqLworfTsKKworLyogVGFibGUgb2YgZGV2aWNlcyBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpNTQwMF9kZXZfaW5mbyBpNTQwMF9kZXZzW10gPSB7CisJeworCQkuY3RsX25hbWUgPSAiSTU0MDAiLAorCQkuZnNiX21hcHBpbmdfZXJyb3JzID0gUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUiwKKwl9LAorfTsKKworc3RydWN0IGk1NDAwX2RpbW1faW5mbyB7CisJaW50IG1lZ2FieXRlczsJCS8qIHNpemUsIDAgbWVhbnMgbm90IHByZXNlbnQgICovCisJaW50IGR1YWxfcmFuazsKK307CisKKy8qIGRyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgaTU0MDBfcHZ0IHsKKwlzdHJ1Y3QgcGNpX2RldiAqc3lzdGVtX2FkZHJlc3M7CQkvKiAxNi4wICovCisJc3RydWN0IHBjaV9kZXYgKmJyYW5jaG1hcF93ZXJyb3JzOwkvKiAxNi4xICovCisJc3RydWN0IHBjaV9kZXYgKmZzYl9lcnJvcl9yZWdzOwkJLyogMTYuMiAqLworCXN0cnVjdCBwY2lfZGV2ICpicmFuY2hfMDsJCS8qIDIxLjAgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqYnJhbmNoXzE7CQkvKiAyMi4wICovCisKKwl1MTYgdG9sbTsJCQkJLyogdG9wIG9mIGxvdyBtZW1vcnkgKi8KKwl1NjQgYW1iYXNlOwkJCQkvKiBBTUIgQkFSICovCisKKwl1MTYgbWlyMCwgbWlyMTsKKworCXUxNiBiMF9tdHJbTlVNX01UUlNfUEVSX0JSQU5DSF07CS8qIE1lbW9yeSBUZWNobmxvZ3kgUmVnICovCisJdTE2IGIwX2FtYnByZXNlbnQwOwkJCS8qIEJyYW5jaCAwLCBDaGFubmVsIDAgKi8KKwl1MTYgYjBfYW1icHJlc2VudDE7CQkJLyogQnJuYWNoIDAsIENoYW5uZWwgMSAqLworCisJdTE2IGIxX210cltOVU1fTVRSU19QRVJfQlJBTkNIXTsJLyogTWVtb3J5IFRlY2hubG9neSBSZWcgKi8KKwl1MTYgYjFfYW1icHJlc2VudDA7CQkJLyogQnJhbmNoIDEsIENoYW5uZWwgOCAqLworCXUxNiBiMV9hbWJwcmVzZW50MTsJCQkvKiBCcmFuY2ggMSwgQ2hhbm5lbCAxICovCisKKwkvKiBESU1NIGluZm9ybWF0aW9uIG1hdHJpeCwgYWxsb2NhdGluZyBhcmNoaXRlY3R1cmUgbWF4aW11bXMgKi8KKwlzdHJ1Y3QgaTU0MDBfZGltbV9pbmZvIGRpbW1faW5mb1tNQVhfQ1NST1dTXVtNQVhfQ0hBTk5FTFNdOworCisJLyogQWN0dWFsIHZhbHVlcyBmb3IgdGhpcyBjb250cm9sbGVyICovCisJaW50IG1heGNoOwkJCQkvKiBNYXggY2hhbm5lbHMgKi8KKwlpbnQgbWF4ZGltbXBlcmNoOwkJCS8qIE1heCBESU1NcyBwZXIgY2hhbm5lbCAqLworfTsKKworLyogSTU0MDAgTUNIIGVycm9yIGluZm9ybWF0aW9uIHJldHJpZXZlZCBmcm9tIEhhcmR3YXJlICovCitzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyB7CisJLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBhbHdheXMgcmVhZCBmcm9tIHRoZSBNQyAqLworCXUzMiBmZXJyX2ZhdF9mYmQ7CS8qIEZpcnN0IEVycm9ycyBGYXRhbCAqLworCXUzMiBuZXJyX2ZhdF9mYmQ7CS8qIE5leHQgRXJyb3JzIEZhdGFsICovCisJdTMyIGZlcnJfbmZfZmJkOwkvKiBGaXJzdCBFcnJvcnMgTm9uLUZhdGFsICovCisJdTMyIG5lcnJfbmZfZmJkOwkvKiBOZXh0IEVycm9ycyBOb24tRmF0YWwgKi8KKworCS8qIFRoZXNlIHJlZ2lzdGVycyBhcmUgaW5wdXQgT05MWSBpZiB0aGVyZSB3YXMgYSBSZWNvdmVyYWJsZSBFcnJvciAqLworCXUzMiByZWRtZW1iOwkJLyogUmVjb3ZlcmFibGUgTWVtIERhdGEgRXJyb3IgbG9nIEIgKi8KKwl1MTYgcmVjbWVtYTsJCS8qIFJlY292ZXJhYmxlIE1lbSBFcnJvciBsb2cgQSAqLworCXUzMiByZWNtZW1iOwkJLyogUmVjb3ZlcmFibGUgTWVtIEVycm9yIGxvZyBCICovCisKKwkvKiBUaGVzZSByZWdpc3RlcnMgYXJlIGlucHV0IE9OTFkgaWYgdGhlcmUgd2FzIGEgTm9uLVJlYyBFcnJvciAqLworCXUxNiBucmVjbWVtYTsJCS8qIE5vbi1SZWNvdmVyYWJsZSBNZW0gbG9nIEEgKi8KKwl1MTYgbnJlY21lbWI7CQkvKiBOb24tUmVjb3ZlcmFibGUgTWVtIGxvZyBCICovCisKK307CisKKy8qIG5vdGUgdGhhdCBucmVjX3Jkd3IgY2hhbmdlZCBmcm9tIE5SRUNNRU1BIHRvIE5SRUNNRU1CIGJldHdlZW4gdGhlIDUwMDAgYW5kCisgICA1NDAwIGJldHRlciB0byB1c2UgYW4gaW5saW5lIGZ1bmN0aW9uIHRoYW4gYSBtYWNybyBpbiB0aGlzIGNhc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfYmFuayhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKChpbmZvLT5ucmVjbWVtYSkgPj4gMTIpICYgMHg3OworfQorc3RhdGljIGlubGluZSBpbnQgbnJlY19yYW5rKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPm5yZWNtZW1hKSA+PiA4KSAmIDB4ZjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfYnVmX2lkKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPm5yZWNtZW1hKSkgJiAweGZmOworfQorc3RhdGljIGlubGluZSBpbnQgbnJlY19yZHdyKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoaW5mby0+bnJlY21lbWIpID4+IDMxOworfQorLyogVGhpcyBhcHBsaWVzIHRvIGJvdGggTlJFQyBhbmQgUkVDIHN0cmluZyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIG5yZWNfcmR3cgorICAgYW5kIHJlY19yZHdyICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnJkd3Jfc3RyKGludCByZHdyKQoreworCXJldHVybiByZHdyID8gIldyaXRlIiA6ICJSZWFkIjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfY2FzKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPm5yZWNtZW1iKSA+PiAxNikgJiAweDFmZmY7Cit9CitzdGF0aWMgaW5saW5lIGludCBucmVjX3JhcyhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKGluZm8tPm5yZWNtZW1iKSAmIDB4ZmZmZjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlY19iYW5rKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPnJlY21lbWEpID4+IDEyKSAmIDB4NzsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlY19yYW5rKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPnJlY21lbWEpID4+IDgpICYgMHhmOworfQorc3RhdGljIGlubGluZSBpbnQgcmVjX3Jkd3Ioc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuIChpbmZvLT5yZWNtZW1iKSA+PiAzMTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlY19jYXMoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuICgoaW5mby0+cmVjbWVtYikgPj4gMTYpICYgMHgxZmZmOworfQorc3RhdGljIGlubGluZSBpbnQgcmVjX3JhcyhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKGluZm8tPnJlY21lbWIpICYgMHhmZmZmOworfQorCitzdGF0aWMgc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICppNTQwMF9wY2k7CisKKy8qCisgKglpNTQwMF9nZXRfZXJyb3JfaW5mbwlSZXRyaWV2ZSB0aGUgaGFyZHdhcmUgZXJyb3IgaW5mb3JtYXRpb24gZnJvbQorICoJCQkJdGhlIGhhcmR3YXJlIGFuZCBjYWNoZSBpdCBpbiB0aGUgJ2luZm8nCisgKgkJCQlzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfZ2V0X2Vycm9yX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSBzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQ7CisJdTMyIHZhbHVlOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qIHJlYWQgaW4gdGhlIDFzdCBGQVRBTCBlcnJvciByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBGRVJSX0ZBVF9GQkQsICZ2YWx1ZSk7CisKKwkvKiBNYXNrIG9ubHkgdGhlIGJpdHMgdGhhdCB0aGUgZG9jIHNheXMgYXJlIHZhbGlkCisJICovCisJdmFsdWUgJj0gKEZFUlJfRkFUX0ZCRENIQU4gfCBGRVJSX0ZBVF9NQVNLKTsKKworCS8qIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGVuIHJlYWQgaW4gdGhlCisJICAgTkVYVCBGQVRBTCBlcnJvciByZWdpc3RlciBhbmQgdGhlIE1lbW9yeSBFcnJvciBMb2cgUmVnaXN0ZXIgQQorCSAqLworCWlmICh2YWx1ZSAmIEZFUlJfRkFUX01BU0spIHsKKwkJaW5mby0+ZmVycl9mYXRfZmJkID0gdmFsdWU7CisKKwkJLyogaGFydmVzdCB0aGUgdmFyaW91cyBlcnJvciBkYXRhIHdlIG5lZWQgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJTkVSUl9GQVRfRkJELCAmaW5mby0+bmVycl9mYXRfZmJkKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlOUkVDTUVNQSwgJmluZm8tPm5yZWNtZW1hKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlOUkVDTUVNQiwgJmluZm8tPm5yZWNtZW1iKTsKKworCQkvKiBDbGVhciB0aGUgZXJyb3IgYml0cywgYnkgd3JpdGluZyB0aGVtIGJhY2sgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCUZFUlJfRkFUX0ZCRCwgdmFsdWUpOworCX0gZWxzZSB7CisJCWluZm8tPmZlcnJfZmF0X2ZiZCA9IDA7CisJCWluZm8tPm5lcnJfZmF0X2ZiZCA9IDA7CisJCWluZm8tPm5yZWNtZW1hID0gMDsKKwkJaW5mby0+bnJlY21lbWIgPSAwOworCX0KKworCS8qIHJlYWQgaW4gdGhlIDFzdCBOT04tRkFUQUwgZXJyb3IgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgRkVSUl9ORl9GQkQsICZ2YWx1ZSk7CisKKwkvKiBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlbiByZWFkIGluIHRoZSAxc3QgTk9OLUZBVEFMIGVycm9yCisJICogcmVnaXN0ZXIgYXMgd2VsbCAqLworCWlmICh2YWx1ZSAmIEZFUlJfTkZfTUFTSykgeworCQlpbmZvLT5mZXJyX25mX2ZiZCA9IHZhbHVlOworCisJCS8qIGhhcnZlc3QgdGhlIHZhcmlvdXMgZXJyb3IgZGF0YSB3ZSBuZWVkICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCU5FUlJfTkZfRkJELCAmaW5mby0+bmVycl9uZl9mYmQpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCVJFQ01FTUEsICZpbmZvLT5yZWNtZW1hKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJUkVDTUVNQiwgJmluZm8tPnJlY21lbWIpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlSRURNRU1CLCAmaW5mby0+cmVkbWVtYik7CisKKwkJLyogQ2xlYXIgdGhlIGVycm9yIGJpdHMsIGJ5IHdyaXRpbmcgdGhlbSBiYWNrICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlGRVJSX05GX0ZCRCwgdmFsdWUpOworCX0gZWxzZSB7CisJCWluZm8tPmZlcnJfbmZfZmJkID0gMDsKKwkJaW5mby0+bmVycl9uZl9mYmQgPSAwOworCQlpbmZvLT5yZWNtZW1hID0gMDsKKwkJaW5mby0+cmVjbWVtYiA9IDA7CisJCWluZm8tPnJlZG1lbWIgPSAwOworCX0KK30KKworLyoKKyAqIGk1NDAwX3Byb2NjZXNzX25vbl9yZWNvdmVyYWJsZV9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKyAqIAkJCQkJc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8sCisgKiAJCQkJCWludCBoYW5kbGVfZXJyb3JzKTsKKyAqCisgKgloYW5kbGUgdGhlIEludGVsIEZBVEFMIGFuZCB1bnJlY292ZXJhYmxlIGVycm9ycywgaWYgYW55CisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX3Byb2NjZXNzX25vbl9yZWNvdmVyYWJsZV9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkgICAgc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWxsRXJyb3JzKQoreworCWNoYXIgbXNnW0VEQUNfTUNfTEFCRUxfTEVOICsgMSArIDkwICsgODBdOworCWludCBicmFuY2g7CisJaW50IGNoYW5uZWw7CisJaW50IGJhbms7CisJaW50IGJ1Zl9pZDsKKwlpbnQgcmFuazsKKwlpbnQgcmR3cjsKKwlpbnQgcmFzLCBjYXM7CisJaW50IGVycm51bTsKKwljaGFyICp0eXBlID0gTlVMTDsKKworCWlmICghYWxsRXJyb3JzKQorCQlyZXR1cm47CQkvKiBpZiBubyBlcnJvciwgcmV0dXJuIG5vdyAqLworCisJaWYgKGFsbEVycm9ycyAmICBFUlJPUl9GQVRfTUFTSykKKwkJdHlwZSA9ICJGQVRBTCI7CisJZWxzZSBpZiAoYWxsRXJyb3JzICYgRkVSUl9ORl9VTkNPUlJFQ1RBQkxFKQorCQl0eXBlID0gIk5PTi1GQVRBTCB1bmNvcnJlY3RlZCI7CisJZWxzZQorCQl0eXBlID0gIk5PTi1GQVRBTCByZWNvdmVyYWJsZSI7CisKKwkvKiBPTkxZIE9ORSBvZiB0aGUgcG9zc2libGUgZXJyb3IgYml0cyB3aWxsIGJlIHNldCwgYXMgcGVyIHRoZSBkb2NzICovCisKKwlicmFuY2ggPSBleHRyYWN0X2ZiZGNoYW5faW5keChpbmZvLT5mZXJyX2ZhdF9mYmQpOworCWNoYW5uZWwgPSBicmFuY2g7CisKKwkvKiBVc2UgdGhlIE5PTi1SZWNvdmVyYWJsZSBtYWNyb3MgdG8gZXh0cmFjdCBkYXRhICovCisJYmFuayA9IG5yZWNfYmFuayhpbmZvKTsKKwlyYW5rID0gbnJlY19yYW5rKGluZm8pOworCWJ1Zl9pZCA9IG5yZWNfYnVmX2lkKGluZm8pOworCXJkd3IgPSBucmVjX3Jkd3IoaW5mbyk7CisJcmFzID0gbnJlY19yYXMoaW5mbyk7CisJY2FzID0gbnJlY19jYXMoaW5mbyk7CisKKwlkZWJ1Z2YwKCJcdFx0Q1NST1c9ICVkICBDaGFubmVscz0gJWQsJWQgIChCcmFuY2g9ICVkICIKKwkJIkRSQU0gQmFuaz0gJWQgQnVmZmVyIElEID0gJWQgcmR3cj0gJXMgcmFzPSAlZCBjYXM9ICVkKVxuIiwKKwkJcmFuaywgY2hhbm5lbCwgY2hhbm5lbCArIDEsIGJyYW5jaCA+PiAxLCBiYW5rLAorCQlidWZfaWQsIHJkd3Jfc3RyKHJkd3IpLCByYXMsIGNhcyk7CisKKwkvKiBPbmx5IDEgYml0IHdpbGwgYmUgb24gKi8KKwllcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmYWxsRXJyb3JzLCBBUlJBWV9TSVpFKGVycm9yX25hbWUpKTsKKworCS8qIEZvcm0gb3V0IG1lc3NhZ2UgKi8KKwlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAorCQkgIiVzIChCcmFuY2g9JWQgRFJBTS1CYW5rPSVkIEJ1ZmZlciBJRCA9ICVkIFJEV1I9JXMgIgorCQkgIlJBUz0lZCBDQVM9JWQgJXMgRXJyPTB4JWx4ICglcykpIiwKKwkJIHR5cGUsIGJyYW5jaCA+PiAxLCBiYW5rLCBidWZfaWQsIHJkd3Jfc3RyKHJkd3IpLCByYXMsIGNhcywKKwkJIHR5cGUsIGFsbEVycm9ycywgZXJyb3JfbmFtZVtlcnJudW1dKTsKKworCS8qIENhbGwgdGhlIGhlbHBlciB0byBvdXRwdXQgbWVzc2FnZSAqLworCWVkYWNfbWNfaGFuZGxlX2ZiZF91ZShtY2ksIHJhbmssIGNoYW5uZWwsIGNoYW5uZWwgKyAxLCBtc2cpOworfQorCisvKgorICogaTU0MDBfcHJvY2Vzc19mYXRhbF9lcnJvcl9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKyAqIAkJCQlzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbywKKyAqIAkJCQlpbnQgaGFuZGxlX2Vycm9ycyk7CisgKgorICoJaGFuZGxlIHRoZSBJbnRlbCBOT04tRkFUQUwgZXJyb3JzLCBpZiBhbnkKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfcHJvY2Vzc19ub25mYXRhbF9lcnJvcl9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJY2hhciBtc2dbRURBQ19NQ19MQUJFTF9MRU4gKyAxICsgOTAgKyA4MF07CisJdW5zaWduZWQgbG9uZyBhbGxFcnJvcnM7CisJaW50IGJyYW5jaDsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgYmFuazsKKwlpbnQgcmFuazsKKwlpbnQgcmR3cjsKKwlpbnQgcmFzLCBjYXM7CisJaW50IGVycm51bTsKKworCS8qIG1hc2sgb2ZmIHRoZSBFcnJvciBiaXRzIHRoYXQgYXJlIHBvc3NpYmxlICovCisJYWxsRXJyb3JzID0gZnJvbV9uZl9mZXJyKGluZm8tPmZlcnJfbmZfZmJkICYgRkVSUl9ORl9NQVNLKTsKKwlpZiAoIWFsbEVycm9ycykKKwkJcmV0dXJuOwkJLyogaWYgbm8gZXJyb3IsIHJldHVybiBub3cgKi8KKworCS8qIE9OTFkgT05FIG9mIHRoZSBwb3NzaWJsZSBlcnJvciBiaXRzIHdpbGwgYmUgc2V0LCBhcyBwZXIgdGhlIGRvY3MgKi8KKworCWlmIChhbGxFcnJvcnMgJiAoRVJST1JfTkZfVU5DT1JSRUNUQUJMRSB8IEVSUk9SX05GX1JFQ09WRVJBQkxFKSkgeworCQlpNTQwMF9wcm9jY2Vzc19ub25fcmVjb3ZlcmFibGVfaW5mbyhtY2ksIGluZm8sIGFsbEVycm9ycyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb3JyZWN0YWJsZSBlcnJvcnMgKi8KKwlpZiAoYWxsRXJyb3JzICYgRVJST1JfTkZfQ09SUkVDVEFCTEUpIHsKKwkJZGVidWdmMCgiXHRDb3JyZWN0ZWQgYml0cz0gMHglbHhcbiIsIGFsbEVycm9ycyk7CisKKwkJYnJhbmNoID0gZXh0cmFjdF9mYmRjaGFuX2luZHgoaW5mby0+ZmVycl9uZl9mYmQpOworCisJCWNoYW5uZWwgPSAwOworCQlpZiAoUkVDX0VDQ19MT0NBVE9SX09ERChpbmZvLT5yZWRtZW1iKSkKKwkJCWNoYW5uZWwgPSAxOworCisJCS8qIENvbnZlcnQgY2hhbm5lbCB0byBiZSBiYXNlZCBmcm9tIHplcm8sIGluc3RlYWQgb2YKKwkJICogZnJvbSBicmFuY2ggYmFzZSBvZiAwICovCisJCWNoYW5uZWwgKz0gYnJhbmNoOworCisJCWJhbmsgPSByZWNfYmFuayhpbmZvKTsKKwkJcmFuayA9IHJlY19yYW5rKGluZm8pOworCQlyZHdyID0gcmVjX3Jkd3IoaW5mbyk7CisJCXJhcyA9IHJlY19yYXMoaW5mbyk7CisJCWNhcyA9IHJlY19jYXMoaW5mbyk7CisKKwkJLyogT25seSAxIGJpdCB3aWxsIGJlIG9uICovCisJCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZhbGxFcnJvcnMsIEFSUkFZX1NJWkUoZXJyb3JfbmFtZSkpOworCisJCWRlYnVnZjAoIlx0XHRDU1JPVz0gJWQgQ2hhbm5lbD0gJWQgIChCcmFuY2ggJWQgIgorCQkJIkRSQU0gQmFuaz0gJWQgcmR3cj0gJXMgcmFzPSAlZCBjYXM9ICVkKVxuIiwKKwkJCXJhbmssIGNoYW5uZWwsIGJyYW5jaCA+PiAxLCBiYW5rLAorCQkJcmR3cl9zdHIocmR3ciksIHJhcywgY2FzKTsKKworCQkvKiBGb3JtIG91dCBtZXNzYWdlICovCisJCXNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCisJCQkgIkNvcnJlY3RlZCBlcnJvciAoQnJhbmNoPSVkIERSQU0tQmFuaz0lZCBSRFdSPSVzICIKKwkJCSAiUkFTPSVkIENBUz0lZCwgQ0UgRXJyPTB4JWx4ICglcykpIiwKKwkJCSBicmFuY2ggPj4gMSwgYmFuaywgcmR3cl9zdHIocmR3ciksIHJhcywgY2FzLAorCQkJIGFsbEVycm9ycywgZXJyb3JfbmFtZVtlcnJudW1dKTsKKworCQkvKiBDYWxsIHRoZSBoZWxwZXIgdG8gb3V0cHV0IG1lc3NhZ2UgKi8KKwkJZWRhY19tY19oYW5kbGVfZmJkX2NlKG1jaSwgcmFuaywgY2hhbm5lbCwgbXNnKTsKKworCQlyZXR1cm47CisJfQorCisJLyogTWlzY2VsYW5lb3VzIGVycm9ycyAqLworCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZhbGxFcnJvcnMsIEFSUkFZX1NJWkUoZXJyb3JfbmFtZSkpOworCisJYnJhbmNoID0gZXh0cmFjdF9mYmRjaGFuX2luZHgoaW5mby0+ZmVycl9uZl9mYmQpOworCisJaTU0MDBfbWNfcHJpbnRrKG1jaSwgS0VSTl9FTUVSRywKKwkJCSJOb24tRmF0YWwgbWlzYyBlcnJvciAoQnJhbmNoPSVkIEVycj0lI2x4ICglcykpIiwKKwkJCWJyYW5jaCA+PiAxLCBhbGxFcnJvcnMsIGVycm9yX25hbWVbZXJybnVtXSk7Cit9CisKKy8qCisgKglpNTQwMF9wcm9jZXNzX2Vycm9yX2luZm8JUHJvY2VzcyB0aGUgZXJyb3IgaW5mbyB0aGF0IGlzCisgKglpbiB0aGUgJ2luZm8nIHN0cnVjdHVyZSwgcHJldmlvdXNseSByZXRyaWV2ZWQgZnJvbSBoYXJkd2FyZQorICovCitzdGF0aWMgdm9pZCBpNTQwMF9wcm9jZXNzX2Vycm9yX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCXN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQorewl1MzIgYWxsRXJyb3JzOworCisJLyogRmlyc3QgaGFuZGxlIGFueSBmYXRhbCBlcnJvcnMgdGhhdCBvY2N1cnJlZCAqLworCWFsbEVycm9ycyA9IChpbmZvLT5mZXJyX2ZhdF9mYmQgJiBGRVJSX0ZBVF9NQVNLKTsKKwlpNTQwMF9wcm9jY2Vzc19ub25fcmVjb3ZlcmFibGVfaW5mbyhtY2ksIGluZm8sIGFsbEVycm9ycyk7CisKKwkvKiBub3cgaGFuZGxlIGFueSBub24tZmF0YWwgZXJyb3JzIHRoYXQgb2NjdXJyZWQgKi8KKwlpNTQwMF9wcm9jZXNzX25vbmZhdGFsX2Vycm9yX2luZm8obWNpLCBpbmZvKTsKK30KKworLyoKKyAqCWk1NDAwX2NsZWFyX2Vycm9yCVJldHJpZXZlIGFueSBlcnJvciBmcm9tIHRoZSBoYXJkd2FyZQorICoJCQkJYnV0IGRvIE5PVCBwcm9jZXNzIHRoYXQgZXJyb3IuCisgKgkJCQlVc2VkIGZvciAnY2xlYXJpbmcnIG91dCBvZiBwcmV2aW91cyBlcnJvcnMKKyAqCQkJCUNhbGxlZCBieSB0aGUgQ29yZSBtb2R1bGUuCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX2NsZWFyX2Vycm9yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyBpbmZvOworCisJaTU0MDBfZ2V0X2Vycm9yX2luZm8obWNpLCAmaW5mbyk7Cit9CisKKy8qCisgKglpNTQwMF9jaGVja19lcnJvcglSZXRyaWV2ZSBhbmQgcHJvY2VzcyBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlCisgKgkJCQloYXJkd2FyZS4gQ2FsbGVkIGJ5IHRoZSBDb3JlIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgaTU0MDBfY2hlY2tfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvIGluZm87CisJZGVidWdmNCgiTUMlZDogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBtY2ktPm1jX2lkeCwgX19mdW5jX18pOworCWk1NDAwX2dldF9lcnJvcl9pbmZvKG1jaSwgJmluZm8pOworCWk1NDAwX3Byb2Nlc3NfZXJyb3JfaW5mbyhtY2ksICZpbmZvKTsKK30KKworLyoKKyAqCWk1NDAwX3B1dF9kZXZpY2VzCSdwdXQnIGFsbCB0aGUgZGV2aWNlcyB0aGF0IHdlIGhhdmUKKyAqCQkJCXJlc2VydmVkIHZpYSAnZ2V0JworICovCitzdGF0aWMgdm9pZCBpNTQwMF9wdXRfZGV2aWNlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qIERlY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgZGV2aWNlcyAqLworCXBjaV9kZXZfcHV0KHB2dC0+YnJhbmNoXzEpOworCXBjaV9kZXZfcHV0KHB2dC0+YnJhbmNoXzApOworCXBjaV9kZXZfcHV0KHB2dC0+ZnNiX2Vycm9yX3JlZ3MpOworCXBjaV9kZXZfcHV0KHB2dC0+YnJhbmNobWFwX3dlcnJvcnMpOworfQorCisvKgorICoJaTU0MDBfZ2V0X2RldmljZXMJRmluZCBhbmQgcGVyZm9ybSAnZ2V0JyBvcGVyYXRpb24gb24gdGhlIE1DSCdzCisgKgkJCWRldmljZS9mdW5jdGlvbnMgd2Ugd2FudCB0byByZWZlcmVuY2UgZm9yIHRoaXMgZHJpdmVyCisgKgorICoJCQlOZWVkIHRvICdnZXQnIGRldmljZSAxNiBmdW5jIDEgYW5kIGZ1bmMgMgorICovCitzdGF0aWMgaW50IGk1NDAwX2dldF9kZXZpY2VzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgaW50IGRldl9pZHgpCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlwdnQtPmJyYW5jaG1hcF93ZXJyb3JzID0gTlVMTDsKKwlwdnQtPmZzYl9lcnJvcl9yZWdzID0gTlVMTDsKKwlwdnQtPmJyYW5jaF8wID0gTlVMTDsKKwlwdnQtPmJyYW5jaF8xID0gTlVMTDsKKworCS8qIEF0dGVtcHQgdG8gJ2dldCcgdGhlIE1DSCByZWdpc3RlciB3ZSB3YW50ICovCisJcGRldiA9IE5VTEw7CisJd2hpbGUgKCFwdnQtPmJyYW5jaG1hcF93ZXJyb3JzIHx8ICFwdnQtPmZzYl9lcnJvcl9yZWdzKSB7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9FUlIsIHBkZXYpOworCQlpZiAoIXBkZXYpIHsKKwkJCS8qIEVuZCBvZiBsaXN0LCBsZWF2ZSAqLworCQkJaTU0MDBfcHJpbnRrKEtFUk5fRVJSLAorCQkJCSInc3lzdGVtIGFkZHJlc3MsUHJvY2VzcyBCdXMnICIKKwkJCQkiZGV2aWNlIG5vdCBmb3VuZDoiCisJCQkJInZlbmRvciAweCV4IGRldmljZSAweCV4IEVSUiBmdW5jcyAiCisJCQkJIihicm9rZW4gQklPUz8pXG4iLAorCQkJCVBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogU3RvcmUgZGV2aWNlIDE2IGZ1bmNzIDEgYW5kIDIgKi8KKwkJc3dpdGNoIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikpIHsKKwkJY2FzZSAxOgorCQkJcHZ0LT5icmFuY2htYXBfd2Vycm9ycyA9IHBkZXY7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcHZ0LT5mc2JfZXJyb3JfcmVncyA9IHBkZXY7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRlYnVnZjEoIlN5c3RlbSBBZGRyZXNzLCBwcm9jZXNzb3IgYnVzLSBQQ0kgQnVzIElEOiAlcyAgJXg6JXhcbiIsCisJCXBjaV9uYW1lKHB2dC0+c3lzdGVtX2FkZHJlc3MpLAorCQlwdnQtPnN5c3RlbV9hZGRyZXNzLT52ZW5kb3IsIHB2dC0+c3lzdGVtX2FkZHJlc3MtPmRldmljZSk7CisJZGVidWdmMSgiQnJhbmNobWFwLCBjb250cm9sIGFuZCBlcnJvcnMgLSBQQ0kgQnVzIElEOiAlcyAgJXg6JXhcbiIsCisJCXBjaV9uYW1lKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMpLAorCQlwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLT52ZW5kb3IsIHB2dC0+YnJhbmNobWFwX3dlcnJvcnMtPmRldmljZSk7CisJZGVidWdmMSgiRlNCIEVycm9yIFJlZ3MgLSBQQ0kgQnVzIElEOiAlcyAgJXg6JXhcbiIsCisJCXBjaV9uYW1lKHB2dC0+ZnNiX2Vycm9yX3JlZ3MpLAorCQlwdnQtPmZzYl9lcnJvcl9yZWdzLT52ZW5kb3IsIHB2dC0+ZnNiX2Vycm9yX3JlZ3MtPmRldmljZSk7CisKKwlwdnQtPmJyYW5jaF8wID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0ZCRDAsIE5VTEwpOworCWlmICghcHZ0LT5icmFuY2hfMCkgeworCQlpNTQwMF9wcmludGsoS0VSTl9FUlIsCisJCQkiTUM6ICdCUkFOQ0ggMCcgZGV2aWNlIG5vdCBmb3VuZDoiCisJCQkidmVuZG9yIDB4JXggZGV2aWNlIDB4JXggRnVuYyAwIChicm9rZW4gQklPUz8pXG4iLAorCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0ZCRDApOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIElmIHRoaXMgZGV2aWNlIGNsYWltcyB0byBoYXZlIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHRoZW4KKwkgKiBmZXRjaCBCcmFuY2ggMSdzIGluZm9ybWF0aW9uCisJICovCisJaWYgKHB2dC0+bWF4Y2ggPCBDSEFOTkVMU19QRVJfQlJBTkNIKQorCQlyZXR1cm4gMDsKKworCXB2dC0+YnJhbmNoXzEgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRkJEMSwgTlVMTCk7CisJaWYgKCFwdnQtPmJyYW5jaF8xKSB7CisJCWk1NDAwX3ByaW50ayhLRVJOX0VSUiwKKwkJCSJNQzogJ0JSQU5DSCAxJyBkZXZpY2Ugbm90IGZvdW5kOiIKKwkJCSJ2ZW5kb3IgMHgleCBkZXZpY2UgMHgleCBGdW5jIDAgIgorCQkJIihicm9rZW4gQklPUz8pXG4iLAorCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCVBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9GQkQxKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaTU0MDBfcHV0X2RldmljZXMobWNpKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAqCWRldGVybWluZV9hbWJfcHJlc2VudAorICoKKyAqCQl0aGUgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIE5VTV9NVFJTX1BFUl9CUkFOQ0ggZGlmZmVyZW50CisgKgkJcmVnaXN0ZXJzIGRldGVybWluaW5nIHdoaWNoIG9mIHRoZSBOVU1fTVRSU19QRVJfQlJBTkNIIHJlcXVpcmVzCisgKiAgICAgICAgICAgICAga25vd2luZyB3aGljaCBjaGFubmVsIGlzIGluIHF1ZXN0aW9uCisgKgorICoJMiBicmFuY2hlcywgZWFjaCB3aXRoIDIgY2hhbm5lbHMKKyAqCQliMF9hbWJwcmVzZW50MCBmb3IgY2hhbm5lbCAnMCcKKyAqCQliMF9hbWJwcmVzZW50MSBmb3IgY2hhbm5lbCAnMScKKyAqCQliMV9hbWJwcmVzZW50MCBmb3IgY2hhbm5lbCAnMicKKyAqCQliMV9hbWJwcmVzZW50MSBmb3IgY2hhbm5lbCAnMycKKyAqLworc3RhdGljIGludCBkZXRlcm1pbmVfYW1iX3ByZXNlbnRfcmVnKHN0cnVjdCBpNTQwMF9wdnQgKnB2dCwgaW50IGNoYW5uZWwpCit7CisJaW50IGFtYl9wcmVzZW50OworCisJaWYgKGNoYW5uZWwgPCBDSEFOTkVMU19QRVJfQlJBTkNIKSB7CisJCWlmIChjaGFubmVsICYgMHgxKQorCQkJYW1iX3ByZXNlbnQgPSBwdnQtPmIwX2FtYnByZXNlbnQxOworCQllbHNlCisJCQlhbWJfcHJlc2VudCA9IHB2dC0+YjBfYW1icHJlc2VudDA7CisJfSBlbHNlIHsKKwkJaWYgKGNoYW5uZWwgJiAweDEpCisJCQlhbWJfcHJlc2VudCA9IHB2dC0+YjFfYW1icHJlc2VudDE7CisJCWVsc2UKKwkJCWFtYl9wcmVzZW50ID0gcHZ0LT5iMV9hbWJwcmVzZW50MDsKKwl9CisKKwlyZXR1cm4gYW1iX3ByZXNlbnQ7Cit9CisKKy8qCisgKiBkZXRlcm1pbmVfbXRyKHB2dCwgY3Nyb3csIGNoYW5uZWwpCisgKgorICogcmV0dXJuIHRoZSBwcm9wZXIgTVRSIHJlZ2lzdGVyIGFzIGRldGVybWluZSBieSB0aGUgY3Nyb3cgYW5kIGRlc2lyZWQgY2hhbm5lbAorICovCitzdGF0aWMgaW50IGRldGVybWluZV9tdHIoc3RydWN0IGk1NDAwX3B2dCAqcHZ0LCBpbnQgY3Nyb3csIGludCBjaGFubmVsKQoreworCWludCBtdHI7CisJaW50IG47CisKKwkvKiBUaGVyZSBpcyBvbmUgTVRSIGZvciBlYWNoIHNsb3QgcGFpciBvZiBGQi1ESU1NcywKKwkgICBFYWNoIHNsb3QgbWF5IGhhdmUgb25lIG9yIHR3byByYW5rcyAoMiBjc3Jvd3MpLAorCSAgIEVhY2ggc2xvdCBwYWlyIG1heSBiZSBhdCBicmFuY2ggMCBvciBicmFuY2ggMS4KKwkgICBTbywgY3Nyb3cgc2hvdWxkIGJlIGRpdmlkZWQgYnkgZWlnaHQKKwkgKi8KKwluID0gY3Nyb3cgPj4gMzsKKworCWlmIChuID49IE5VTV9NVFJTX1BFUl9CUkFOQ0gpIHsKKwkJZGVidWdmMCgiRVJST1I6IHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBjc3JvdzogJWRcbiIsCisJCQljc3Jvdyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjaGFubmVsIDwgQ0hBTk5FTFNfUEVSX0JSQU5DSCkKKwkJbXRyID0gcHZ0LT5iMF9tdHJbbl07CisJZWxzZQorCQltdHIgPSBwdnQtPmIxX210cltuXTsKKworCXJldHVybiBtdHI7Cit9CisKKy8qCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9tdHIoaW50IHNsb3Rfcm93LCB1MTYgbXRyKQoreworCWludCBhbnM7CisKKwlhbnMgPSBNVFJfRElNTVNfUFJFU0VOVChtdHIpOworCisJZGVidWdmMigiXHRNVFIlZD0weCV4OiAgRElNTXMgYXJlICVzXG4iLCBzbG90X3JvdywgbXRyLAorCQlhbnMgPyAiUHJlc2VudCIgOiAiTk9UIFByZXNlbnQiKTsKKwlpZiAoIWFucykKKwkJcmV0dXJuOworCisJZGVidWdmMigiXHRcdFdJRFRIOiB4JWRcbiIsIE1UUl9EUkFNX1dJRFRIKG10cikpOworCisJZGVidWdmMigiXHRcdEVMRUNUUklDQUwgVEhST1RUTElORyBpcyAlc1xuIiwKKwkJTVRSX0RJTU1TX0VUSFJPVFRMRShtdHIpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwlkZWJ1Z2YyKCJcdFx0TlVNQkFOSzogJWQgYmFuayhzKVxuIiwgTVRSX0RSQU1fQkFOS1MobXRyKSk7CisJZGVidWdmMigiXHRcdE5VTVJBTks6ICVzXG4iLCBNVFJfRElNTV9SQU5LKG10cikgPyAiZG91YmxlIiA6ICJzaW5nbGUiKTsKKwlkZWJ1Z2YyKCJcdFx0TlVNUk9XOiAlc1xuIiwgbnVtcm93X3RvU3RyaW5nW01UUl9ESU1NX1JPV1MobXRyKV0pOworCWRlYnVnZjIoIlx0XHROVU1DT0w6ICVzXG4iLCBudW1jb2xfdG9TdHJpbmdbTVRSX0RJTU1fQ09MUyhtdHIpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jaGFubmVsKHN0cnVjdCBpNTQwMF9wdnQgKnB2dCwgaW50IGNzcm93LCBpbnQgY2hhbm5lbCwKKwkJCXN0cnVjdCBpNTQwMF9kaW1tX2luZm8gKmRpbmZvKQoreworCWludCBtdHI7CisJaW50IGFtYl9wcmVzZW50X3JlZzsKKwlpbnQgYWRkckJpdHM7CisKKwltdHIgPSBkZXRlcm1pbmVfbXRyKHB2dCwgY3Nyb3csIGNoYW5uZWwpOworCWlmIChNVFJfRElNTVNfUFJFU0VOVChtdHIpKSB7CisJCWFtYl9wcmVzZW50X3JlZyA9IGRldGVybWluZV9hbWJfcHJlc2VudF9yZWcocHZ0LCBjaGFubmVsKTsKKworCQkvKiBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBESU1NIHByZXNlbnQgaW4gdGhpcyBESU1NIHNsb3QgKi8KKwkJaWYgKGFtYl9wcmVzZW50X3JlZyAmICgxIDw8IChjc3JvdyA+PiAxKSkpIHsKKwkJCWRpbmZvLT5kdWFsX3JhbmsgPSBNVFJfRElNTV9SQU5LKG10cik7CisKKwkJCWlmICghKChkaW5mby0+ZHVhbF9yYW5rID09IDApICYmCisJCQkJKChjc3JvdyAmIDB4MSkgPT0gMHgxKSkpIHsKKwkJCQkvKiBTdGFydCB3aXRoIHRoZSBudW1iZXIgb2YgYml0cyBmb3IgYSBCYW5rCisJCQkJICogb24gdGhlIERSQU0gKi8KKwkJCQlhZGRyQml0cyA9IE1UUl9EUkFNX0JBTktTX0FERFJfQklUUyhtdHIpOworCQkJCS8qIEFkZCB0aGVudW1iZXIgb2YgUk9XIGJpdHMgKi8KKwkJCQlhZGRyQml0cyArPSBNVFJfRElNTV9ST1dTX0FERFJfQklUUyhtdHIpOworCQkJCS8qIGFkZCB0aGUgbnVtYmVyIG9mIENPTFVNTiBiaXRzICovCisJCQkJYWRkckJpdHMgKz0gTVRSX0RJTU1fQ09MU19BRERSX0JJVFMobXRyKTsKKworCQkJCWFkZHJCaXRzICs9IDY7CS8qIGFkZCA2NCBiaXRzIHBlciBESU1NICovCisJCQkJYWRkckJpdHMgLT0gMjA7CS8qIGRpdmlkZSBieSAyXl4yMCAqLworCQkJCWFkZHJCaXRzIC09IDM7CS8qIDggYml0cyBwZXIgYnl0ZXMgKi8KKworCQkJCWRpbmZvLT5tZWdhYnl0ZXMgPSAxIDw8IGFkZHJCaXRzOworCQkJfQorCQl9CisJfQorfQorCisvKgorICoJY2FsY3VsYXRlX2RpbW1fc2l6ZQorICoKKyAqCWFsc28gd2lsbCBvdXRwdXQgYSBESU1NIG1hdHJpeCBtYXAsIGlmIGRlYnVnIGlzIGVuYWJsZWQsIGZvciB2aWV3aW5nCisgKglob3cgdGhlIERJTU1zIGFyZSBwb3B1bGF0ZWQKKyAqLworc3RhdGljIHZvaWQgY2FsY3VsYXRlX2RpbW1fc2l6ZShzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQpCit7CisJc3RydWN0IGk1NDAwX2RpbW1faW5mbyAqZGluZm87CisJaW50IGNzcm93LCBtYXhfY3Nyb3dzOworCWNoYXIgKnAsICptZW1fYnVmZmVyOworCWludCBzcGFjZSwgbjsKKwlpbnQgY2hhbm5lbDsKKworCS8qID09PT09PT09PT09PT09PT09IEdlbmVyYXRlIHNvbWUgZGVidWcgb3V0cHV0ID09PT09PT09PT09PT09PT09ICovCisJc3BhY2UgPSBQQUdFX1NJWkU7CisJbWVtX2J1ZmZlciA9IHAgPSBrbWFsbG9jKHNwYWNlLCBHRlBfS0VSTkVMKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCWk1NDAwX3ByaW50ayhLRVJOX0VSUiwgIk1DOiAlczolcygpIGttYWxsb2MoKSBmYWlsZWRcbiIsCisJCQlfX0ZJTEVfXywgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogU2NhbiBhbGwgdGhlIGFjdHVhbCBDU1JPV1MgKHdoaWNoIGlzICMgb2YgRElNTVMgKiAyKQorCSAqIGFuZCBjYWxjdWxhdGUgdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIERJTU0KKwkgKiBTdGFydCB3aXRoIHRoZSBoaWdoZXN0IGNzcm93IGZpcnN0LCB0byBkaXNwbGF5IGl0IGZpcnN0CisJICogYW5kIHdvcmsgdG93YXJkIHRoZSAwdGggY3Nyb3cKKwkgKi8KKwltYXhfY3Nyb3dzID0gcHZ0LT5tYXhkaW1tcGVyY2ggKiAyOworCWZvciAoY3Nyb3cgPSBtYXhfY3Nyb3dzIC0gMTsgY3Nyb3cgPj0gMDsgY3Nyb3ctLSkgeworCisJCS8qIG9uIGFuIG9kZCBjc3JvdywgZmlyc3Qgb3V0cHV0IGEgJ2JvdW5kYXJ5JyBtYXJrZXIsCisJCSAqIHRoZW4gcmVzZXQgdGhlIG1lc3NhZ2UgYnVmZmVyICAqLworCQlpZiAoY3Nyb3cgJiAweDEpIHsKKwkJCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJCQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJCQlwICs9IG47CisJCQlzcGFjZSAtPSBuOworCQkJZGVidWdmMigiJXNcbiIsIG1lbV9idWZmZXIpOworCQkJcCA9IG1lbV9idWZmZXI7CisJCQlzcGFjZSA9IFBBR0VfU0laRTsKKwkJfQorCQluID0gc25wcmludGYocCwgc3BhY2UsICJjc3JvdyAlMmQgICAgIiwgY3Nyb3cpOworCQlwICs9IG47CisJCXNwYWNlIC09IG47CisKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHB2dC0+bWF4Y2g7IGNoYW5uZWwrKykgeworCQkJZGluZm8gPSAmcHZ0LT5kaW1tX2luZm9bY3Nyb3ddW2NoYW5uZWxdOworCQkJaGFuZGxlX2NoYW5uZWwocHZ0LCBjc3JvdywgY2hhbm5lbCwgZGluZm8pOworCQkJbiA9IHNucHJpbnRmKHAsIHNwYWNlLCAiJTRkIE1CICAgfCAiLCBkaW5mby0+bWVnYWJ5dGVzKTsKKwkJCXAgKz0gbjsKKwkJCXNwYWNlIC09IG47CisJCX0KKwkJZGVidWdmMigiJXNcbiIsIG1lbV9idWZmZXIpOworCQlwID0gbWVtX2J1ZmZlcjsKKwkJc3BhY2UgPSBQQUdFX1NJWkU7CisJfQorCisJLyogT3V0cHV0IHRoZSBsYXN0IGJvdHRvbSAnYm91bmRhcnknIG1hcmtlciAqLworCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCXAgKz0gbjsKKwlzcGFjZSAtPSBuOworCWRlYnVnZjIoIiVzXG4iLCBtZW1fYnVmZmVyKTsKKwlwID0gbWVtX2J1ZmZlcjsKKwlzcGFjZSA9IFBBR0VfU0laRTsKKworCS8qIG5vdyBvdXRwdXQgdGhlICdjaGFubmVsJyBsYWJlbHMgKi8KKwluID0gc25wcmludGYocCwgc3BhY2UsICIgICAgICAgICAgICAiKTsKKwlwICs9IG47CisJc3BhY2UgLT0gbjsKKwlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgcHZ0LT5tYXhjaDsgY2hhbm5lbCsrKSB7CisJCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgImNoYW5uZWwgJWQgfCAiLCBjaGFubmVsKTsKKwkJcCArPSBuOworCQlzcGFjZSAtPSBuOworCX0KKworCS8qIG91dHB1dCB0aGUgbGFzdCBtZXNzYWdlIGFuZCBmcmVlIGJ1ZmZlciAqLworCWRlYnVnZjIoIiVzXG4iLCBtZW1fYnVmZmVyKTsKKwlrZnJlZShtZW1fYnVmZmVyKTsKK30KKworLyoKKyAqCWk1NDAwX2dldF9tY19yZWdzCXJlYWQgaW4gdGhlIG5lY2Vzc2FyeSByZWdpc3RlcnMgYW5kCisgKgkJCQljYWNoZSBsb2NhbGx5CisgKgorICoJCQlGaWxscyBpbiB0aGUgcHJpdmF0ZSBkYXRhIG1lbWJlcnMKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfZ2V0X21jX3JlZ3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKwl1MzIgYWN0dWFsX3RvbG07CisJdTE2IGxpbWl0OworCWludCBzbG90X3JvdzsKKwlpbnQgbWF4Y2g7CisJaW50IG1heGRpbW1wZXJjaDsKKwlpbnQgd2F5MCwgd2F5MTsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5zeXN0ZW1fYWRkcmVzcywgQU1CQVNFLAorCQkJKHUzMiAqKSAmcHZ0LT5hbWJhc2UpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnN5c3RlbV9hZGRyZXNzLCBBTUJBU0UgKyBzaXplb2YodTMyKSwKKwkJCSgodTMyICopICZwdnQtPmFtYmFzZSkgKyBzaXplb2YodTMyKSk7CisKKwltYXhkaW1tcGVyY2ggPSBwdnQtPm1heGRpbW1wZXJjaDsKKwltYXhjaCA9IHB2dC0+bWF4Y2g7CisKKwlkZWJ1Z2YyKCJBTUJBU0U9IDB4JWx4ICBNQVhDSD0gJWQgIE1BWC1ESU1NLVBlci1DSD0gJWRcbiIsCisJCShsb25nIHVuc2lnbmVkIGludClwdnQtPmFtYmFzZSwgcHZ0LT5tYXhjaCwgcHZ0LT5tYXhkaW1tcGVyY2gpOworCisJLyogR2V0IHRoZSBCcmFuY2ggTWFwIHJlZ3MgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBUT0xNLCAmcHZ0LT50b2xtKTsKKwlwdnQtPnRvbG0gPj49IDEyOworCWRlYnVnZjIoIlxuVE9MTSAobnVtYmVyIG9mIDI1Nk0gcmVnaW9ucykgPSV1ICgweCV4KVxuIiwgcHZ0LT50b2xtLAorCQlwdnQtPnRvbG0pOworCisJYWN0dWFsX3RvbG0gPSAodTMyKSAoKDEwMDBsICogcHZ0LT50b2xtKSA+PiAoMzAgLSAyOCkpOworCWRlYnVnZjIoIkFjdHVhbCBUT0xNIGJ5dGUgYWRkcj0ldS4lMDN1IEdCICgweCV4KVxuIiwKKwkJYWN0dWFsX3RvbG0vMTAwMCwgYWN0dWFsX3RvbG0gJSAxMDAwLCBwdnQtPnRvbG0gPDwgMjgpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgTUlSMCwgJnB2dC0+bWlyMCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgTUlSMSwgJnB2dC0+bWlyMSk7CisKKwkvKiBHZXQgdGhlIE1JUlswLTFdIHJlZ3MgKi8KKwlsaW1pdCA9IChwdnQtPm1pcjAgPj4gNCkgJiAweDBmZmY7CisJd2F5MCA9IHB2dC0+bWlyMCAmIDB4MTsKKwl3YXkxID0gcHZ0LT5taXIwICYgMHgyOworCWRlYnVnZjIoIk1JUjA6IGxpbWl0PSAweCV4ICBXQVkxPSAldSAgV0FZMD0gJXhcbiIsIGxpbWl0LCB3YXkxLCB3YXkwKTsKKwlsaW1pdCA9IChwdnQtPm1pcjEgPj4gNCkgJiAweGZmZjsKKwl3YXkwID0gcHZ0LT5taXIxICYgMHgxOworCXdheTEgPSBwdnQtPm1pcjEgJiAweDI7CisJZGVidWdmMigiTUlSMTogbGltaXQ9IDB4JXggIFdBWTE9ICV1ICBXQVkwPSAleFxuIiwgbGltaXQsIHdheTEsIHdheTApOworCisJLyogR2V0IHRoZSBzZXQgb2YgTVRSWzAtM10gcmVncyBieSBlYWNoIGJyYW5jaCAqLworCWZvciAoc2xvdF9yb3cgPSAwOyBzbG90X3JvdyA8IE5VTV9NVFJTX1BFUl9CUkFOQ0g7IHNsb3Rfcm93KyspIHsKKwkJaW50IHdoZXJlID0gTVRSMCArIChzbG90X3JvdyAqIHNpemVvZih1MzIpKTsKKworCQkvKiBCcmFuY2ggMCBzZXQgb2YgTVRSIHJlZ2lzdGVycyAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8wLCB3aGVyZSwKKwkJCQkmcHZ0LT5iMF9tdHJbc2xvdF9yb3ddKTsKKworCQlkZWJ1Z2YyKCJNVFIlZCB3aGVyZT0weCV4IEIwIHZhbHVlPTB4JXhcbiIsIHNsb3Rfcm93LCB3aGVyZSwKKwkJCXB2dC0+YjBfbXRyW3Nsb3Rfcm93XSk7CisKKwkJaWYgKHB2dC0+bWF4Y2ggPCBDSEFOTkVMU19QRVJfQlJBTkNIKSB7CisJCQlwdnQtPmIxX210cltzbG90X3Jvd10gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBCcmFuY2ggMSBzZXQgb2YgTVRSIHJlZ2lzdGVycyAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8xLCB3aGVyZSwKKwkJCQkmcHZ0LT5iMV9tdHJbc2xvdF9yb3ddKTsKKwkJZGVidWdmMigiTVRSJWQgd2hlcmU9MHgleCBCMSB2YWx1ZT0weCV4XG4iLCBzbG90X3Jvdywgd2hlcmUsCisJCQlwdnQtPmIxX210cltzbG90X3Jvd10pOworCX0KKworCS8qIFJlYWQgYW5kIGR1bXAgYnJhbmNoIDAncyBNVFJzICovCisJZGVidWdmMigiXG5NZW1vcnkgVGVjaG5vbG9neSBSZWdpc3RlcnM6XG4iKTsKKwlkZWJ1Z2YyKCIgICBCcmFuY2ggMDpcbiIpOworCWZvciAoc2xvdF9yb3cgPSAwOyBzbG90X3JvdyA8IE5VTV9NVFJTX1BFUl9CUkFOQ0g7IHNsb3Rfcm93KyspCisJCWRlY29kZV9tdHIoc2xvdF9yb3csIHB2dC0+YjBfbXRyW3Nsb3Rfcm93XSk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8wLCBBTUJQUkVTRU5UXzAsCisJCQkmcHZ0LT5iMF9hbWJwcmVzZW50MCk7CisJZGVidWdmMigiXHRcdEFNQi1CcmFuY2ggMC1wcmVzZW50MCAweCV4OlxuIiwgcHZ0LT5iMF9hbWJwcmVzZW50MCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMCwgQU1CUFJFU0VOVF8xLAorCQkJJnB2dC0+YjBfYW1icHJlc2VudDEpOworCWRlYnVnZjIoIlx0XHRBTUItQnJhbmNoIDAtcHJlc2VudDEgMHgleDpcbiIsIHB2dC0+YjBfYW1icHJlc2VudDEpOworCisJLyogT25seSBpZiB3ZSBoYXZlIDIgYnJhbmNocyAoNCBjaGFubmVscykgKi8KKwlpZiAocHZ0LT5tYXhjaCA8IENIQU5ORUxTX1BFUl9CUkFOQ0gpIHsKKwkJcHZ0LT5iMV9hbWJwcmVzZW50MCA9IDA7CisJCXB2dC0+YjFfYW1icHJlc2VudDEgPSAwOworCX0gZWxzZSB7CisJCS8qIFJlYWQgYW5kIGR1bXAgIGJyYW5jaCAxJ3MgTVRScyAqLworCQlkZWJ1Z2YyKCIgICBCcmFuY2ggMTpcbiIpOworCQlmb3IgKHNsb3Rfcm93ID0gMDsgc2xvdF9yb3cgPCBOVU1fTVRSU19QRVJfQlJBTkNIOyBzbG90X3JvdysrKQorCQkJZGVjb2RlX210cihzbG90X3JvdywgcHZ0LT5iMV9tdHJbc2xvdF9yb3ddKTsKKworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8xLCBBTUJQUkVTRU5UXzAsCisJCQkJJnB2dC0+YjFfYW1icHJlc2VudDApOworCQlkZWJ1Z2YyKCJcdFx0QU1CLUJyYW5jaCAxLXByZXNlbnQwIDB4JXg6XG4iLAorCQkJcHZ0LT5iMV9hbWJwcmVzZW50MCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNoXzEsIEFNQlBSRVNFTlRfMSwKKwkJCQkmcHZ0LT5iMV9hbWJwcmVzZW50MSk7CisJCWRlYnVnZjIoIlx0XHRBTUItQnJhbmNoIDEtcHJlc2VudDEgMHgleDpcbiIsCisJCQlwdnQtPmIxX2FtYnByZXNlbnQxKTsKKwl9CisKKwkvKiBHbyBhbmQgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGVhY2ggRElNTSBhbmQgcGxhY2UgaW4gYW4KKwkgKiBvcmRlcmx5IG1hdHJpeCAqLworCWNhbGN1bGF0ZV9kaW1tX3NpemUocHZ0KTsKK30KKworLyoKKyAqCWk1NDAwX2luaXRfY3Nyb3dzCUluaXRpYWxpemUgdGhlICdjc3Jvd3MnIHRhYmxlIHdpdGhpbgorICoJCQkJdGhlIG1jaSBjb250cm9sCXN0cnVjdHVyZSB3aXRoIHRoZQorICoJCQkJYWRkcmVzc2luZyBvZiBtZW1vcnkuCisgKgorICoJcmV0dXJuOgorICoJCTAJc3VjY2VzcworICoJCTEJbm8gYWN0dWFsIG1lbW9yeSBmb3VuZCBvbiB0aGlzIE1DCisgKi8KK3N0YXRpYyBpbnQgaTU0MDBfaW5pdF9jc3Jvd3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqcF9jc3JvdzsKKwlpbnQgZW1wdHksIGNoYW5uZWxfY291bnQ7CisJaW50IG1heF9jc3Jvd3M7CisJaW50IG10cjsKKwlpbnQgY3Nyb3dfbWVnczsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgY3Nyb3c7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJY2hhbm5lbF9jb3VudCA9IHB2dC0+bWF4Y2g7CisJbWF4X2Nzcm93cyA9IHB2dC0+bWF4ZGltbXBlcmNoICogMjsKKworCWVtcHR5ID0gMTsJCS8qIEFzc3VtZSBOTyBtZW1vcnkgKi8KKworCWZvciAoY3Nyb3cgPSAwOyBjc3JvdyA8IG1heF9jc3Jvd3M7IGNzcm93KyspIHsKKwkJcF9jc3JvdyA9ICZtY2ktPmNzcm93c1tjc3Jvd107CisKKwkJcF9jc3Jvdy0+Y3Nyb3dfaWR4ID0gY3Nyb3c7CisKKwkJLyogdXNlIGJyYW5jaCAwIGZvciB0aGUgYmFzaXMgKi8KKwkJbXRyID0gZGV0ZXJtaW5lX210cihwdnQsIGNzcm93LCAwKTsKKworCQkvKiBpZiBubyBESU1NUyBvbiB0aGlzIHJvdywgY29udGludWUgKi8KKwkJaWYgKCFNVFJfRElNTVNfUFJFU0VOVChtdHIpKQorCQkJY29udGludWU7CisKKwkJLyogRkFLRSBPVVQgVkFMVUVTLCBGSVhNRSAqLworCQlwX2Nzcm93LT5maXJzdF9wYWdlID0gMCArIGNzcm93ICogMjA7CisJCXBfY3Nyb3ctPmxhc3RfcGFnZSA9IDkgKyBjc3JvdyAqIDIwOworCQlwX2Nzcm93LT5wYWdlX21hc2sgPSAweEZGRjsKKworCQlwX2Nzcm93LT5ncmFpbiA9IDg7CisKKwkJY3Nyb3dfbWVncyA9IDA7CisJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBwdnQtPm1heGNoOyBjaGFubmVsKyspCisJCQljc3Jvd19tZWdzICs9IHB2dC0+ZGltbV9pbmZvW2Nzcm93XVtjaGFubmVsXS5tZWdhYnl0ZXM7CisKKwkJcF9jc3Jvdy0+bnJfcGFnZXMgPSBjc3Jvd19tZWdzIDw8IDg7CisKKwkJLyogQXNzdW1lIEREUjIgZm9yIG5vdyAqLworCQlwX2Nzcm93LT5tdHlwZSA9IE1FTV9GQl9ERFIyOworCisJCS8qIGFzayB3aGF0IGRldmljZSB0eXBlIG9uIHRoaXMgcm93ICovCisJCWlmIChNVFJfRFJBTV9XSURUSChtdHIpKQorCQkJcF9jc3Jvdy0+ZHR5cGUgPSBERVZfWDg7CisJCWVsc2UKKwkJCXBfY3Nyb3ctPmR0eXBlID0gREVWX1g0OworCisJCXBfY3Nyb3ctPmVkYWNfbW9kZSA9IEVEQUNfUzhFQ0Q4RUQ7CisKKwkJZW1wdHkgPSAwOworCX0KKworCXJldHVybiBlbXB0eTsKK30KKworLyoKKyAqCWk1NDAwX2VuYWJsZV9lcnJvcl9yZXBvcnRpbmcKKyAqCQkJVHVybiBvbiB0aGUgbWVtb3J5IHJlcG9ydGluZyBmZWF0dXJlcyBvZiB0aGUgaGFyZHdhcmUKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfZW5hYmxlX2Vycm9yX3JlcG9ydGluZyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCXUzMiBmYmRfZXJyb3JfbWFzazsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwkvKiBSZWFkIHRoZSBGQkQgRXJyb3IgTWFzayBSZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBFTUFTS19GQkQsCisJCQkmZmJkX2Vycm9yX21hc2spOworCisJLyogRW5hYmxlIHdpdGggYSAnMCcgKi8KKwlmYmRfZXJyb3JfbWFzayAmPSB+KEVOQUJMRV9FTUFTS19BTEwpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBFTUFTS19GQkQsCisJCQlmYmRfZXJyb3JfbWFzayk7Cit9CisKKy8qCisgKiBpNTQwMF9nZXRfZGltbV9hbmRfY2hhbm5lbF9jb3VudHMocGRldiwgJm51bV9jc3Jvd3MsICZudW1fY2hhbm5lbHMpCisgKgorICoJYXNrIHRoZSBkZXZpY2UgaG93IG1hbnkgY2hhbm5lbHMgYXJlIHByZXNlbnQgYW5kIGhvdyBtYW55IENTUk9XUworICoJIGFzIHdlbGwKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfZ2V0X2RpbW1fYW5kX2NoYW5uZWxfY291bnRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQlpbnQgKm51bV9kaW1tc19wZXJfY2hhbm5lbCwKKwkJCQkJaW50ICpudW1fY2hhbm5lbHMpCit7CisJdTggdmFsdWU7CisKKwkvKiBOZWVkIHRvIHJldHJpZXZlIGp1c3QgaG93IG1hbnkgY2hhbm5lbHMgYW5kIGRpbW1zIHBlciBjaGFubmVsIGFyZQorCSAqIHN1cHBvcnRlZCBvbiB0aGlzIG1lbW9yeSBjb250cm9sbGVyCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTUFYRElNTVBFUkNILCAmdmFsdWUpOworCSpudW1fZGltbXNfcGVyX2NoYW5uZWwgPSAoaW50KXZhbHVlICogMjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE1BWENILCAmdmFsdWUpOworCSpudW1fY2hhbm5lbHMgPSAoaW50KXZhbHVlOworfQorCisvKgorICoJaTU0MDBfcHJvYmUxCVByb2JlIGZvciBPTkUgaW5zdGFuY2Ugb2YgZGV2aWNlIHRvIHNlZSBpZiBpdCBpcworICoJCQlwcmVzZW50LgorICoJcmV0dXJuOgorICoJCTAgZm9yIEZPVU5EIGEgZGV2aWNlCisgKgkJPCAwIGZvciBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaTU0MDBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZGV2X2lkeCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCWludCBudW1fY2hhbm5lbHM7CisJaW50IG51bV9kaW1tc19wZXJfY2hhbm5lbDsKKwlpbnQgbnVtX2Nzcm93czsKKworCWlmIChkZXZfaWR4ID49IEFSUkFZX1NJWkUoaTU0MDBfZGV2cykpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKSwgcGRldiBidXMgJXUgZGV2PTB4JXggZm49MHgleFxuIiwKKwkJX19mdW5jX18sCisJCXBkZXYtPmJ1cy0+bnVtYmVyLAorCQlQQ0lfU0xPVChwZGV2LT5kZXZmbiksIFBDSV9GVU5DKHBkZXYtPmRldmZuKSk7CisKKwkvKiBXZSBvbmx5IGFyZSBsb29raW5nIGZvciBmdW5jIDAgb2YgdGhlIHNldCAqLworCWlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBBc2sgdGhlIGRldmljZXMgZm9yIHRoZSBudW1iZXIgb2YgQ1NST1dTIGFuZCBDSEFOTkVMUyBzbworCSAqIHRoYXQgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgbWVtb3J5IHJlc291cmNlcywgZXRjCisJICoKKwkgKiBUaGUgQ2hpcHNldCB3aWxsIHJlcG9ydCB3aGF0IGl0IGNhbiBoYW5kbGUgd2hpY2ggd2lsbCBiZSBncmVhdGVyCisJICogb3IgZXF1YWwgdG8gd2hhdCB0aGUgbW90aGVyYm9hcmQgbWFudWZhY3R1cmVyIHdpbGwgaW1wbGVtZW50LgorCSAqCisJICogQXMgd2UgZG9uJ3QgaGF2ZSBhIG1vdGhlcmJvYXJkIGlkZW50aWZpY2F0aW9uIHJvdXRpbmUgdG8gZGV0ZXJtaW5lCisJICogYWN0dWFsIG51bWJlciBvZiBzbG90cy9kaW1tcyBwZXIgY2hhbm5lbCwgd2UgdGh1cyB1dGlsaXplIHRoZQorCSAqIHJlc291cmNlIGFzIHNwZWNpZmllZCBieSB0aGUgY2hpcHNldC4gVGh1cywgd2UgbWlnaHQgaGF2ZQorCSAqIGhhdmUgbW9yZSBESU1NcyBwZXIgY2hhbm5lbCB0aGFuIGFjdHVhbGx5IG9uIHRoZSBtb2JvLCBidXQgdGhpcworCSAqIGFsbG93cyB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgdXB0byB0aGUgY2hpcHNldCBtYXgsIHdpdGhvdXQKKwkgKiBzb21lIGZhbmN5IG1vYm8gZGV0ZXJtaW5hdGlvbi4KKwkgKi8KKwlpNTQwMF9nZXRfZGltbV9hbmRfY2hhbm5lbF9jb3VudHMocGRldiwgJm51bV9kaW1tc19wZXJfY2hhbm5lbCwKKwkJCQkJJm51bV9jaGFubmVscyk7CisJbnVtX2Nzcm93cyA9IG51bV9kaW1tc19wZXJfY2hhbm5lbCAqIDI7CisKKwlkZWJ1Z2YwKCJNQzogJXMoKTogTnVtYmVyIG9mIC0gQ2hhbm5lbHM9ICVkICBESU1NUz0gJWQgIENTUk9XUz0gJWRcbiIsCisJCV9fZnVuY19fLCBudW1fY2hhbm5lbHMsIG51bV9kaW1tc19wZXJfY2hhbm5lbCwgbnVtX2Nzcm93cyk7CisKKwkvKiBhbGxvY2F0ZSBhIG5ldyBNQyBjb250cm9sIHN0cnVjdHVyZSAqLworCW1jaSA9IGVkYWNfbWNfYWxsb2Moc2l6ZW9mKCpwdnQpLCBudW1fY3Nyb3dzLCBudW1fY2hhbm5lbHMsIDApOworCisJaWYgKG1jaSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IG1jaSA9ICVwXG4iLCBfX2Z1bmNfXywgbWNpKTsKKworCW1jaS0+ZGV2ID0gJnBkZXYtPmRldjsJLyogcmVjb3JkIHB0ciAgdG8gdGhlIGdlbmVyaWMgZGV2aWNlICovCisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCXB2dC0+c3lzdGVtX2FkZHJlc3MgPSBwZGV2OwkvKiBSZWNvcmQgdGhpcyBkZXZpY2UgaW4gb3VyIHByaXZhdGUgKi8KKwlwdnQtPm1heGNoID0gbnVtX2NoYW5uZWxzOworCXB2dC0+bWF4ZGltbXBlcmNoID0gbnVtX2RpbW1zX3Blcl9jaGFubmVsOworCisJLyogJ2dldCcgdGhlIHBjaSBkZXZpY2VzIHdlIHdhbnQgdG8gcmVzZXJ2ZSBmb3Igb3VyIHVzZSAqLworCWlmIChpNTQwMF9nZXRfZGV2aWNlcyhtY2ksIGRldl9pZHgpKQorCQlnb3RvIGZhaWwwOworCisJLyogVGltZSB0byBnZXQgc2VyaW91cyAqLworCWk1NDAwX2dldF9tY19yZWdzKG1jaSk7CS8qIHJldHJpZXZlIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgKi8KKworCW1jaS0+bWNfaWR4ID0gMDsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0ZCX0REUjI7CisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfTk9ORTsKKwltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5tb2RfbmFtZSA9ICJpNTQwMF9lZGFjLmMiOworCW1jaS0+bW9kX3ZlciA9IEk1NDAwX1JFVklTSU9OOworCW1jaS0+Y3RsX25hbWUgPSBpNTQwMF9kZXZzW2Rldl9pZHhdLmN0bF9uYW1lOworCW1jaS0+ZGV2X25hbWUgPSBwY2lfbmFtZShwZGV2KTsKKwltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIGFuIGFjdHVhbCBvcGVyYXRpb24gZnVuY3Rpb24gKi8KKwltY2ktPmVkYWNfY2hlY2sgPSBpNTQwMF9jaGVja19lcnJvcjsKKworCS8qIGluaXRpYWxpemUgdGhlIE1DIGNvbnRyb2wgc3RydWN0dXJlICdjc3Jvd3MnIHRhYmxlCisJICogd2l0aCB0aGUgbWFwcGluZyBhbmQgY29udHJvbCBpbmZvcm1hdGlvbiAqLworCWlmIChpNTQwMF9pbml0X2Nzcm93cyhtY2kpKSB7CisJCWRlYnVnZjAoIk1DOiBTZXR0aW5nIG1jaS0+ZWRhY19jYXAgdG8gRURBQ19GTEFHX05PTkVcbiIKKwkJCSIgICAgYmVjYXVzZSBpNTQwMF9pbml0X2Nzcm93cygpIHJldHVybmVkIG5vbnplcm8gIgorCQkJInZhbHVlXG4iKTsKKwkJbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19OT05FOwkvKiBubyBjc3Jvd3MgZm91bmQgKi8KKwl9IGVsc2UgeworCQlkZWJ1Z2YxKCJNQzogRW5hYmxlIGVycm9yIHJlcG9ydGluZyBub3dcbiIpOworCQlpNTQwMF9lbmFibGVfZXJyb3JfcmVwb3J0aW5nKG1jaSk7CisJfQorCisJLyogYWRkIHRoaXMgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlIHRvIEVEQUMncyBsaXN0IG9mIE1DcyAqLworCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpKSB7CisJCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fCisJCQkiOiAlcygpOiBmYWlsZWQgZWRhY19tY19hZGRfbWMoKVxuIiwgX19mdW5jX18pOworCQkvKiBGSVhNRTogcGVyaGFwcyBzb21lIGNvZGUgc2hvdWxkIGdvIGhlcmUgdGhhdCBkaXNhYmxlcyBlcnJvcgorCQkgKiByZXBvcnRpbmcgaWYgd2UganVzdCBlbmFibGVkIGl0CisJCSAqLworCQlnb3RvIGZhaWwxOworCX0KKworCWk1NDAwX2NsZWFyX2Vycm9yKG1jaSk7CisKKwkvKiBhbGxvY2F0aW5nIGdlbmVyaWMgUENJIGNvbnRyb2wgaW5mbyAqLworCWk1NDAwX3BjaSA9IGVkYWNfcGNpX2NyZWF0ZV9nZW5lcmljX2N0bCgmcGRldi0+ZGV2LCBFREFDX01PRF9TVFIpOworCWlmICghaTU0MDBfcGNpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlcygpOiBVbmFibGUgdG8gY3JlYXRlIFBDSSBjb250cm9sXG4iLAorCQkJX19mdW5jX18pOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXMoKTogUENJIGVycm9yIHJlcG9ydCB2aWEgRURBQyBub3Qgc2V0dXBcbiIsCisJCQlfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7CisKKwkvKiBFcnJvciBleGl0IHVud2luZGluZyBzdGFjayAqLworZmFpbDE6CisKKwlpNTQwMF9wdXRfZGV2aWNlcyhtY2kpOworCitmYWlsMDoKKwllZGFjX21jX2ZyZWUobWNpKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAqCWk1NDAwX2luaXRfb25lCWNvbnN0cnVjdG9yIGZvciBvbmUgaW5zdGFuY2Ugb2YgZGV2aWNlCisgKgorICogCXJldHVybnM6CisgKgkJbmVnYXRpdmUgb24gZXJyb3IKKyAqCQljb3VudCAoPj0gMCkKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgaTU0MDBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByYzsKKworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIHdha2UgdXAgZGV2aWNlICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMgPT0gLUVJTykKKwkJcmV0dXJuIHJjOworCisJLyogbm93IHByb2JlIGFuZCBlbmFibGUgdGhlIGRldmljZSAqLworCXJldHVybiBpNTQwMF9wcm9iZTEocGRldiwgaWQtPmRyaXZlcl9kYXRhKTsKK30KKworLyoKKyAqCWk1NDAwX3JlbW92ZV9vbmUJZGVzdHJ1Y3RvciBmb3Igb25lIGluc3RhbmNlIG9mIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGk1NDAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCisJZGVidWdmMChfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoaTU0MDBfcGNpKQorCQllZGFjX3BjaV9yZWxlYXNlX2dlbmVyaWNfY3RsKGk1NDAwX3BjaSk7CisKKwltY2kgPSBlZGFjX21jX2RlbF9tYygmcGRldi0+ZGV2KTsKKwlpZiAoIW1jaSkKKwkJcmV0dXJuOworCisJLyogcmV0cmlldmUgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMsIGFuZCBmcmVlIHRob3NlIHJlc291cmNlcyAqLworCWk1NDAwX3B1dF9kZXZpY2VzKG1jaSk7CisKKwllZGFjX21jX2ZyZWUobWNpKTsKK30KKworLyoKKyAqCXBjaV9kZXZpY2VfaWQJdGFibGUgZm9yIHdoaWNoIGRldmljZXMgd2UgYXJlIGxvb2tpbmcgZm9yCisgKgorICoJVGhlICJFNTAwUCIgZGV2aWNlIGlzIHRoZSBmaXJzdCBkZXZpY2Ugc3VwcG9ydGVkLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTU0MDBfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUil9LAorCXswLH0JCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpNTQwMF9wY2lfdGJsKTsKKworLyoKKyAqCWk1NDAwX2RyaXZlcglwY2lfZHJpdmVyIHN0cnVjdHVyZSBmb3IgdGhpcyBtb2R1bGUKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpNTQwMF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiaTU0MDBfZWRhYyIsCisJLnByb2JlID0gaTU0MDBfaW5pdF9vbmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGk1NDAwX3JlbW92ZV9vbmUpLAorCS5pZF90YWJsZSA9IGk1NDAwX3BjaV90YmwsCit9OworCisvKgorICoJaTU0MDBfaW5pdAkJTW9kdWxlIGVudHJ5IGZ1bmN0aW9uCisgKgkJCVRyeSB0byBpbml0aWFsaXplIHRoaXMgbW9kdWxlIGZvciBpdHMgZGV2aWNlcworICovCitzdGF0aWMgaW50IF9faW5pdCBpNTQwMF9pbml0KHZvaWQpCit7CisJaW50IHBjaV9yYzsKKworCWRlYnVnZjIoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIEVuc3VyZSB0aGF0IHRoZSBPUFNUQVRFIGlzIHNldCBjb3JyZWN0bHkgZm9yIFBPTEwgb3IgTk1JICovCisJb3BzdGF0ZV9pbml0KCk7CisKKwlwY2lfcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpNTQwMF9kcml2ZXIpOworCisJcmV0dXJuIChwY2lfcmMgPCAwKSA/IHBjaV9yYyA6IDA7Cit9CisKKy8qCisgKglpNTQwMF9leGl0KCkJTW9kdWxlIGV4aXQgZnVuY3Rpb24KKyAqCQkJVW5yZWdpc3RlciB0aGUgZHJpdmVyCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpNTQwMF9leGl0KHZvaWQpCit7CisJZGVidWdmMigiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTU0MDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTU0MDBfaW5pdCk7Cittb2R1bGVfZXhpdChpNTQwMF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmVuIFdvb2RhcmQgPHdvb2RhcmRAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBJbmMuIChodHRwOi8vd3d3LnJlZGhhdC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1DIERyaXZlciBmb3IgSW50ZWwgSTU0MDAgbWVtb3J5IGNvbnRyb2xsZXJzIC0gIgorCQkgICBJNTQwMF9SRVZJU0lPTik7CisKK21vZHVsZV9wYXJhbShlZGFjX29wX3N0YXRlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlZGFjX29wX3N0YXRlLCAiRURBQyBFcnJvciBSZXBvcnRpbmcgc3RhdGU6IDA9UG9sbCwxPU5NSSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCmluZGV4IGViYjAzN2IuLmIyZDgzYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMKQEAgLTMxMSw5ICszMTEsNyBAQAogCX0KIAogCS8qIGNhY2hlIGlzIGlycmVsZXZhbnQgZm9yIFBDSSBidXMgcmVhZHMvd3JpdGVzICovCi0Jd2luZG93ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAotCQkJCSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOwotCisJd2luZG93ID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CiAJaWYgKHdpbmRvdyA9PSBOVUxMKSB7CiAJCWk4Mjg3NXBfcHJpbnRrKEtFUk5fRVJSLCAiJXMoKTogRmFpbGVkIHRvIGlvcmVtYXAgYmFyNlxuIiwKIAkJCV9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwppbmRleCAwY2ZjYjJkLi44NTNlZjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCkBAIC02MzAsMjcgKzYzMCwyMiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X2wyX2Vycl9vZl9tYXRjaFtdID0gewotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQ0LWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU1NS1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTY4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCisvKiBkZXByZWNhdGUgdGhlIGZzbCw4NS4uIGZvcm1zIGluIHRoZSBmdXR1cmUsIDIuNi4zMD8gKi8KKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQwLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDEtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0NC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQ4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NTUtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU2OC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MS1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU1NS1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTYwLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKIAl7fSwKIH07CiAKQEAgLTk2NywyNyArOTYyLDIyIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzg1eHhfbWNfZXJyX29mX21hdGNoW10gPSB7Ci0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0NC1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0OC1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU1NS1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU2OC1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCisvKiBkZXByZWNhdGUgdGhlIGZzbCw4NS4uIGZvcm1zIGluIHRoZSBmdXR1cmUsIDIuNi4zMD8gKi8KKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQwLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQxLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQ0LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQ4LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTU1LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTY4LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQxLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTU1LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTYwLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKIAl7fSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCmluZGV4IGU4ODBkNmMuLjVhNzZkMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJfQogCiAJZG1pX2Rldi0+Y2xhc3MgPSAmZG1pX2NsYXNzOwotCXN0cmNweShkbWlfZGV2LT5idXNfaWQsICJpZCIpOworCWRldl9zZXRfbmFtZShkbWlfZGV2LCAiaWQiKTsKIAlkbWlfZGV2LT5ncm91cHMgPSBzeXNfZG1pX2F0dHJpYnV0ZV9ncm91cHM7CiAKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZG1pX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKaW5kZXggNzhiOTg5ZC4uZDc2YWRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwpAQCAtNDY4LDggKzQ2OCw4IEBACiBFWFBPUlRfU1lNQk9MKGRtaV9nZXRfc3lzdGVtX2luZm8pOwogCiAvKioKLSAqCWRtaV9uYW1lX2luX3NlcmlhbCAtIAlDaGVjayBpZiBzdHJpbmcgaXMgaW4gdGhlIERNSSBwcm9kdWN0IHNlcmlhbAotICoJCQkJaW5mb3JtYXRpb24uCisgKiBkbWlfbmFtZV9pbl9zZXJpYWwgLSBDaGVjayBpZiBzdHJpbmcgaXMgaW4gdGhlIERNSSBwcm9kdWN0IHNlcmlhbCBpbmZvcm1hdGlvbgorICogQHN0cjogc3RyaW5nIHRvIGNoZWNrIGZvcgogICovCiBpbnQgZG1pX25hbWVfaW5fc2VyaWFsKGNvbnN0IGNoYXIgKnN0cikKIHsKQEAgLTU4NSw2ICs1ODUsOCBAQAogCiAvKioKICAqIGRtaV9tYXRjaCAtIGNvbXBhcmUgYSBzdHJpbmcgdG8gdGhlIGRtaSBmaWVsZCAoaWYgZXhpc3RzKQorICogQGY6IERNSSBmaWVsZCBpZGVudGlmaWVyCisgKiBAc3RyOiBzdHJpbmcgdG8gY29tcGFyZSB0aGUgRE1JIGZpZWxkIHRvCiAgKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgZmllbGQgZXF1YWxzIHRvIHRoZSBzdHIgKGluY2x1ZGluZyBOVUxMKS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCA0OGY0OWQ5Li4zZDI1NjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtOTUsNyArOTUsNyBAQAogCSAgbnVtYmVyIGZvciB0aGVzZSBHUElPcy4KIAogY29uZmlnIEdQSU9fUENBOTUzWAotCXRyaXN0YXRlICJQQ0E5NTN4LCBQQ0E5NTV4LCBhbmQgTUFYNzMxMCBJL08gcG9ydHMiCisJdHJpc3RhdGUgIlBDQTk1M3gsIFBDQTk1NXgsIFRDQTY0eHgsIGFuZCBNQVg3MzEwIEkvTyBwb3J0cyIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBwcm92aWRlIGFjY2VzcyB0byBzZXZlcmFsIHJlZ2lzdGVyLW9yaWVudGVkCkBAIC0xMDQsOSArMTA0LDEwIEBACiAKIAkgIDQgYml0czoJcGNhOTUzNiwgcGNhOTUzNwogCi0JICA4IGJpdHM6CW1heDczMTAsIHBjYTk1MzQsIHBjYTk1MzgsIHBjYTk1NTQsIHBjYTk1NTcKKwkgIDggYml0czoJbWF4NzMxMCwgcGNhOTUzNCwgcGNhOTUzOCwgcGNhOTU1NCwgcGNhOTU1NywKKwkgIAkJdGNhNjQwOAogCi0JICAxNiBiaXRzOglwY2E5NTM1LCBwY2E5NTM5LCBwY2E5NTU1CisJICAxNiBiaXRzOglwY2E5NTM1LCBwY2E5NTM5LCBwY2E5NTU1LCB0Y2E2NDE2CiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHBjYTk1M3guCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwppbmRleCA4MjAyMGFiLi4zNWU3YWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKQEAgLTEyMTMsNyArMTIxMyw3IEBACiAJCWlmIChkZXYpCiAJCQlzZXFfcHJpbnRmKHMsICIsICVzLyVzIiwKIAkJCQlkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIm5vLWJ1cyIsCi0JCQkJZGV2LT5idXNfaWQpOworCQkJCWRldl9uYW1lKGRldikpOwogCQlpZiAoY2hpcC0+bGFiZWwpCiAJCQlzZXFfcHJpbnRmKHMsICIsICVzIiwgY2hpcC0+bGFiZWwpOwogCQlpZiAoY2hpcC0+Y2FuX3NsZWVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMKaW5kZXggOWNlZWI4OS4uMzdmMzUzODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMKKysrIGIvZHJpdmVycy9ncGlvL3BjYTk1M3guYwpAQCAtMzMsNyArMzMsMTIgQEAKIAl7ICJwY2E5NTU0IiwgOCwgfSwKIAl7ICJwY2E5NTU1IiwgMTYsIH0sCiAJeyAicGNhOTU1NyIsIDgsIH0sCisKIAl7ICJtYXg3MzEwIiwgOCwgfSwKKwl7ICJwY2E2MTA3IiwgOCwgfSwKKwl7ICJ0Y2E2NDA4IiwgOCwgfSwKKwl7ICJ0Y2E2NDE2IiwgMTYsIH0sCisJLyogTllFVDogIHsgInRjYTY0MjQiLCAyNCwgfSwgKi8KIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcGNhOTUzeF9pZCk7CkBAIC00Nyw5ICs1Miw2IEBACiAJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7CiB9OwogCi0vKiBOT1RFOiAgd2UgY2FuJ3QgY3VycmVudGx5IHJlbHkgb24gZmF1bHQgY29kZXMgdG8gY29tZSBmcm9tIFNNQnVzCi0gKiBjYWxscywgc28gd2UgbWFwIGFsbCBlcnJvcnMgdG8gRUlPIGhlcmUgYW5kIHJldHVybiB6ZXJvIG90aGVyd2lzZS4KLSAqLwogc3RhdGljIGludCBwY2E5NTN4X3dyaXRlX3JlZyhzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1aW50MTZfdCB2YWwpCiB7CiAJaW50IHJldDsKQEAgLTYxLDcgKzYzLDcgQEAKIAogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiZmFpbGVkIHdyaXRpbmcgcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTc4LDcgKzgwLDcgQEAKIAogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiZmFpbGVkIHJlYWRpbmcgcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAkqdmFsID0gKHVpbnQxNl90KXJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby90d2w0MDMwLWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby90d2w0MDMwLWdwaW8uYwppbmRleCAzN2QzZWVjLi5hZmFkMTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vdHdsNDAzMC1ncGlvLmMKKysrIGIvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jCkBAIC0yMDIsMzcgKzIwMiw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIENvbmZpZ3VyZSBkZWJvdW5jZSB0aW1pbmcgdmFsdWUgZm9yIGEgR1BJTyBwaW4gb24gVFdMNDAzMAotICovCi1pbnQgdHdsNDAzMF9zZXRfZ3Bpb19kZWJvdW5jZShpbnQgZ3BpbywgaW50IGVuYWJsZSkKLXsKLQl1OCBkX2JuayA9IGdwaW8gPj4gMzsKLQl1OCBkX21zayA9IEJJVChncGlvICYgMHg3KTsKLQl1OCByZWcgPSAwOwotCXU4IGJhc2UgPSAwOwotCWludCByZXQgPSAwOwotCi0JaWYgKHVubGlrZWx5KChncGlvID49IFRXTDQwMzBfR1BJT19NQVgpCi0JCXx8ICEoZ3Bpb191c2FnZV9jb3VudCAmIEJJVChncGlvKSkpKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JYmFzZSA9IFJFR19HUElPX0RFQkVOMSArIGRfYm5rOwotCW11dGV4X2xvY2soJmdwaW9fbG9jayk7Ci0JcmV0ID0gZ3Bpb190d2w0MDMwX3JlYWQoYmFzZSk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCWlmIChlbmFibGUpCi0JCQlyZWcgPSByZXQgfCBkX21zazsKLQkJZWxzZQotCQkJcmVnID0gcmV0ICYgfmRfbXNrOwotCi0JCXJldCA9IGdwaW9fdHdsNDAzMF93cml0ZShiYXNlLCByZWcpOwotCX0KLQltdXRleF91bmxvY2soJmdwaW9fbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wodHdsNDAzMF9zZXRfZ3Bpb19kZWJvdW5jZSk7Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBpbnQgdHdsX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQpAQCAtNDA1LDYgKzM3NCwyMyBAQAogCQkJCVJFR19HUElPUFVQRENUUjEsIDUpOwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX3R3bDQwMzBfZGVib3VuY2UodTMyIGRlYm91bmNlLCB1OCBtbWNfY2QpCit7CisJdTgJCW1lc3NhZ2VbNF07CisKKwkvKiAzMCBtc2VjIG9mIGRlYm91bmNpbmcgaXMgYWx3YXlzIHVzZWQgZm9yIE1NQyBjYXJkIGRldGVjdCwKKwkgKiBhbmQgaXMgb3B0aW9uYWwgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KKwkgKi8KKwltZXNzYWdlWzFdID0gKGRlYm91bmNlICYgMHhmZikgfCAobW1jX2NkICYgMHgwMyk7CisJZGVib3VuY2UgPj49IDg7CisJbWVzc2FnZVsyXSA9IChkZWJvdW5jZSAmIDB4ZmYpOworCWRlYm91bmNlID4+PSA4OworCW1lc3NhZ2VbM10gPSAoZGVib3VuY2UgJiAweDAzKTsKKworCXJldHVybiB0d2w0MDMwX2kyY193cml0ZShUV0w0MDMwX01PRFVMRV9HUElPLCBtZXNzYWdlLAorCQkJCVJFR19HUElPX0RFQkVOMSwgMyk7Cit9CisKIHN0YXRpYyBpbnQgZ3Bpb190d2w0MDMwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAogc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb190d2w0MDMwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC00MzksNiArNDI1LDEyIEBACiAJCQkJcGRhdGEtPnB1bGx1cHMsIHBkYXRhLT5wdWxsZG93bnMsCiAJCQkJcmV0KTsKIAorCXJldCA9IGdwaW9fdHdsNDAzMF9kZWJvdW5jZShwZGF0YS0+ZGVib3VuY2UsIHBkYXRhLT5tbWNfY2QpOworCWlmIChyZXQpCisJCWRldl9kYmcoJnBkZXYtPmRldiwgImRlYm91bmNlICUuMDN4ICUuMDF4IC0tPiAlZFxuIiwKKwkJCQlwZGF0YS0+ZGVib3VuY2UsIHBkYXRhLT5tbWNfY2QsCisJCQkJcmV0KTsKKwogCXR3bF9ncGlvY2hpcC5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKIAl0d2xfZ3Bpb2NoaXAubmdwaW8gPSBUV0w0MDMwX0dQSU9fTUFYOwogCXR3bF9ncGlvY2hpcC5kZXYgPSAmcGRldi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCAzNzMzZTM2Li5iMDZhNTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtMTgzLDYgKzE4MywxMCBAQAogCiAJb2xkX2ZvcHMgPSBmaWxwLT5mX29wOwogCWZpbHAtPmZfb3AgPSBmb3BzX2dldCgmZGV2LT5kcml2ZXItPmZvcHMpOworCWlmIChmaWxwLT5mX29wID09IE5VTEwpIHsKKwkJZmlscC0+Zl9vcCA9IG9sZF9mb3BzOworCQlnb3RvIG91dDsKKwl9CiAJaWYgKGZpbHAtPmZfb3AtPm9wZW4gJiYgKGVyciA9IGZpbHAtPmZfb3AtPm9wZW4oaW5vZGUsIGZpbHApKSkgewogCQlmb3BzX3B1dChmaWxwLT5mX29wKTsKIAkJZmlscC0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwppbmRleCA2NWQ3MmQwLi41YWE2NzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9zeXNmcy5jCkBAIC00ODgsNyArNDg4LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIG1pbm9yX3N0ciA9ICJjYXJkJWQiOwogCi0Jc25wcmludGYobWlub3ItPmtkZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgbWlub3Jfc3RyLCBtaW5vci0+aW5kZXgpOworCWRldl9zZXRfbmFtZSgmbWlub3ItPmtkZXYsIG1pbm9yX3N0ciwgbWlub3ItPmluZGV4KTsKIAogCWVyciA9IGRldmljZV9yZWdpc3RlcigmbWlub3ItPmtkZXYpOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jIGIvZHJpdmVycy9od21vbi9hZHQ3NDYyLmMKaW5kZXggNjYxMDdiNC4uMTg1MmYyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZHQ3NDYyLmMKKysrIGIvZHJpdmVycy9od21vbi9hZHQ3NDYyLmMKQEAgLTIwNCw4ICsyMDQsNiBAQAogI2RlZmluZSBNQVNLX0FORF9TSElGVCh2YWx1ZSwgcHJlZml4KQlcCiAJKCgodmFsdWUpICYgcHJlZml4IyNfTUFTSykgPj4gcHJlZml4IyNfU0hJRlQpCiAKLSNkZWZpbmUgUk9VTkRfRElWKHgsIGRpdmlzb3IpICAoKCh4KSArICgoZGl2aXNvcikgLyAyKSkgLyAoZGl2aXNvcikpCi0KIHN0cnVjdCBhZHQ3NDYyX2RhdGEgewogCXN0cnVjdCBkZXZpY2UJCSpod21vbl9kZXY7CiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAlhdHRyczsKQEAgLTg0MCw3ICs4MzgsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSB8fCAhdGVtcF9lbmFibGVkKGRhdGEsIGF0dHItPmluZGV4KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApICsgNjQ7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApICsgNjQ7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtODc4LDcgKzg3Niw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApIHx8ICF0ZW1wX2VuYWJsZWQoZGF0YSwgYXR0ci0+aW5kZXgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCkgKyA2NDsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCkgKyA2NDsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC05NDMsNyArOTQxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl0ZW1wICo9IDEwMDA7IC8qIGNvbnZlcnQgbVYgdG8gdVYgKi8KLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIHgpOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCB4KTsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC05ODUsNyArOTgzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl0ZW1wICo9IDEwMDA7IC8qIGNvbnZlcnQgbVYgdG8gdVYgKi8KLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIHgpOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCB4KTsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC0xMjUwLDcgKzEyNDgsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAxNSk7CiAKIAkvKiBwYWNrYWdlIHRoaW5ncyB1cCAqLwpAQCAtMTMzNyw3ICsxMzM1LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKSArIDY0OworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKSArIDY0OwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jIGIvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKaW5kZXggMTMxMWE1OS4uNjMzZTFhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKKysrIGIvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MkMsIDB4MkUsIDB4MkYsIEkyQ19DTElFTlRfRU5EIH07CkBAIC03NCw2ICs3NSw3IEBACiAjZGVmaW5lIEFEVDc0NzBfUkVHX1BXTTEyX0NGRwkJCTB4NjgKICNkZWZpbmUJCUFEVDc0NzBfUFdNMl9BVVRPX01BU0sJCTB4NDAKICNkZWZpbmUJCUFEVDc0NzBfUFdNMV9BVVRPX01BU0sJCTB4ODAKKyNkZWZpbmUJCUFEVDc0NzBfUFdNX0FVVE9fTUFTSwkJMHhDMAogI2RlZmluZSBBRFQ3NDcwX1JFR19QV00zNF9DRkcJCQkweDY5CiAjZGVmaW5lCQlBRFQ3NDcwX1BXTTNfQVVUT19NQVNLCQkweDQwCiAjZGVmaW5lCQlBRFQ3NDcwX1BXTTRfQVVUT19NQVNLCQkweDgwCkBAIC0xMjgsOCArMTMwLDExIEBACiAvKiBIb3cgb2Z0ZW4gZG8gd2UgcmVyZWFkIHNlbnNvciBsaW1pdCB2YWx1ZXM/IChJbiBqaWZmaWVzKSAqLwogI2RlZmluZSBMSU1JVF9SRUZSRVNIX0lOVEVSVkFMCSg2MCAqIEhaKQogCi0vKiBzbGVlcCAxcyB3aGlsZSBnYXRoZXJpbmcgdGVtcGVyYXR1cmUgZGF0YSAqLwotI2RlZmluZSBURU1QX0NPTExFQ1RJT05fVElNRQkxMDAwCisvKiBXYWl0IGF0IGxlYXN0IDIwMG1zIHBlciBzZW5zb3IgZm9yIDEwIHNlbnNvcnMgKi8KKyNkZWZpbmUgVEVNUF9DT0xMRUNUSU9OX1RJTUUJMjAwMAorCisvKiBhdXRvIHVwZGF0ZSB0aGluZyB3b24ndCBmaXJlIG1vcmUgdGhhbiBldmVyeSAycyAqLworI2RlZmluZSBBVVRPX1VQREFURV9JTlRFUlZBTAkyMDAwCiAKIC8qIGRhdGFzaGVldCBzYXlzIHRvIGRpdmlkZSB0aGlzIG51bWJlciBieSB0aGUgZmFuIHJlYWRpbmcgdG8gZ2V0IGZhbiBycG0gKi8KICNkZWZpbmUgRkFOX1BFUklPRF9UT19SUE0oeCkJKCg5MDAwMCAqIDYwKSAvICh4KSkKQEAgLTEzNyw4ICsxNDIsNiBAQAogI2RlZmluZSBGQU5fUEVSSU9EX0lOVkFMSUQJNjU1MzUKICNkZWZpbmUgRkFOX0RBVEFfVkFMSUQoeCkJKCh4KSAmJiAoeCkgIT0gRkFOX1BFUklPRF9JTlZBTElEKQogCi0jZGVmaW5lIFJPVU5EX0RJVih4LCBkaXZpc29yKQkoKCh4KSArICgoZGl2aXNvcikgLyAyKSkgLyAoZGl2aXNvcikpCi0KIHN0cnVjdCBhZHQ3NDcwX2RhdGEgewogCXN0cnVjdCBkZXZpY2UJCSpod21vbl9kZXY7CiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAlhdHRyczsKQEAgLTE0OCw2ICsxNTEsOSBAQAogCXVuc2lnbmVkIGxvbmcJCXNlbnNvcnNfbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCiAJdW5zaWduZWQgbG9uZwkJbGltaXRzX2xhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwogCisJaW50CQkJbnVtX3RlbXBfc2Vuc29yczsJLyogLTEgPSBwcm9iZSAqLworCWludAkJCXRlbXBlcmF0dXJlc19wcm9iZWQ7CisKIAlzOAkJCXRlbXBbQURUNzQ3MF9URU1QX0NPVU5UXTsKIAlzOAkJCXRlbXBfbWluW0FEVDc0NzBfVEVNUF9DT1VOVF07CiAJczgJCQl0ZW1wX21heFtBRFQ3NDcwX1RFTVBfQ09VTlRdOwpAQCAtMTYzLDYgKzE2OSwxMCBAQAogCXU4CQkJcHdtX21pbltBRFQ3NDcwX1BXTV9DT1VOVF07CiAJczgJCQlwd21fdG1pbltBRFQ3NDcwX1BXTV9DT1VOVF07CiAJdTgJCQlwd21fYXV0b190ZW1wW0FEVDc0NzBfUFdNX0NPVU5UXTsKKworCXN0cnVjdCB0YXNrX3N0cnVjdAkqYXV0b191cGRhdGU7CisJc3RydWN0IGNvbXBsZXRpb24JYXV0b191cGRhdGVfc3RvcDsKKwl1bnNpZ25lZCBpbnQJCWF1dG9fdXBkYXRlX2ludGVydmFsOwogfTsKIAogc3RhdGljIGludCBhZHQ3NDcwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0yMjAsNiArMjMwLDg4IEBACiAJfQogfQogCisvKiBQcm9iZSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29ycy4gIEFzc3VtZXMgbG9jayBpcyBoZWxkICovCitzdGF0aWMgaW50IGFkdDc0NzBfcmVhZF90ZW1wZXJhdHVyZXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgICAgIHN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyByZXM7CisJaW50IGk7CisJdTggY2ZnLCBwd21bNF0sIHB3bV9jZmdbMl07CisKKwkvKiBzYXZlIHB3bVsxLTRdIGNvbmZpZyByZWdpc3RlciAqLworCXB3bV9jZmdbMF0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV01fQ0ZHKDApKTsKKwlwd21fY2ZnWzFdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygyKSk7CisKKwkvKiBzZXQgbWFudWFsIHB3bSB0byB3aGF0ZXZlciBpdCBpcyBzZXQgdG8gbm93ICovCisJZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfRkFOX0NPVU5UOyBpKyspCisJCXB3bVtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTShpKSk7CisKKwkvKiBwdXQgcHdtIGluIG1hbnVhbCBtb2RlICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTV9DRkcoMCksCisJCXB3bV9jZmdbMF0gJiB+KEFEVDc0NzBfUFdNX0FVVE9fTUFTSykpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV01fQ0ZHKDIpLAorCQlwd21fY2ZnWzFdICYgfihBRFQ3NDcwX1BXTV9BVVRPX01BU0spKTsKKworCS8qIHdyaXRlIHB3bSBjb250cm9sIHRvIHdoYXRldmVyIGl0IHdhcyAqLworCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX0ZBTl9DT1VOVDsgaSsrKQorCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNKGkpLCBwd21baV0pOworCisJLyogc3RhcnQgcmVhZGluZyB0ZW1wZXJhdHVyZSBzZW5zb3JzICovCisJY2ZnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHKTsKKwljZmcgfD0gMHg4MDsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHLCBjZmcpOworCisJLyogRGVsYXkgaXMgMjAwbXMgKiBudW1iZXIgb2YgdGVtcCBzZW5zb3JzLiAqLworCXJlcyA9IG1zbGVlcF9pbnRlcnJ1cHRpYmxlKChkYXRhLT5udW1fdGVtcF9zZW5zb3JzID49IDAgPworCQkJCSAgICBkYXRhLT5udW1fdGVtcF9zZW5zb3JzICogMjAwIDoKKwkJCQkgICAgVEVNUF9DT0xMRUNUSU9OX1RJTUUpKTsKKworCS8qIGRvbmUgcmVhZGluZyB0ZW1wZXJhdHVyZSBzZW5zb3JzICovCisJY2ZnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHKTsKKwljZmcgJj0gfjB4ODA7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRywgY2ZnKTsKKworCS8qIHJlc3RvcmUgcHdtWzEtNF0gY29uZmlnIHJlZ2lzdGVycyAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV01fQ0ZHKDApLCBwd21fY2ZnWzBdKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygyKSwgcHdtX2NmZ1sxXSk7CisKKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGEgaGEsIGludGVycnVwdGVkIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qIE9ubHkgY291bnQgZmFucyBpZiB3ZSBoYXZlIHRvICovCisJaWYgKGRhdGEtPm51bV90ZW1wX3NlbnNvcnMgPj0gMCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9URU1QX0NPVU5UOyBpKyspIHsKKwkJZGF0YS0+dGVtcFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQlBRFQ3NDcwX1RFTVBfUkVHKGkpKTsKKwkJaWYgKGRhdGEtPnRlbXBbaV0pCisJCQlkYXRhLT5udW1fdGVtcF9zZW5zb3JzID0gaSArIDE7CisJfQorCWRhdGEtPnRlbXBlcmF0dXJlc19wcm9iZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdDc0NzBfdXBkYXRlX3RocmVhZCh2b2lkICpwKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBwOworCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCQlhZHQ3NDcwX3JlYWRfdGVtcGVyYXR1cmVzKGNsaWVudCwgZGF0YSk7CisJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YS0+YXV0b191cGRhdGVfaW50ZXJ2YWwpOworCX0KKworCWNvbXBsZXRlX2FsbCgmZGF0YS0+YXV0b191cGRhdGVfc3RvcCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYWR0NzQ3MF9kYXRhICphZHQ3NDcwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CkBAIC0yMjcsMzIgKzMxOSwzNiBAQAogCXVuc2lnbmVkIGxvbmcgbG9jYWxfamlmZmllcyA9IGppZmZpZXM7CiAJdTggY2ZnOwogCWludCBpOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7Ci0JaWYgKHRpbWVfYmVmb3JlKGxvY2FsX2ppZmZpZXMsIGRhdGEtPnNlbnNvcnNfbGFzdF91cGRhdGVkICsKLQkJU0VOU09SX1JFRlJFU0hfSU5URVJWQUwpCi0JCSYmIGRhdGEtPnNlbnNvcnNfdmFsaWQpCi0JCWdvdG8gbm9fc2Vuc29yX3VwZGF0ZTsKLQotCS8qIHN0YXJ0IHJlYWRpbmcgdGVtcGVyYXR1cmUgc2Vuc29ycyAqLwotCWNmZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7Ci0JY2ZnIHw9IDB4ODA7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRywgY2ZnKTsKKwlpbnQgbmVlZF9zZW5zb3JzID0gMTsKKwlpbnQgbmVlZF9saW1pdHMgPSAxOwogCiAJLyoKLQkgKiBEZWxheSBpcyAyMDBtcyAqIG51bWJlciBvZiB0bXAwNSBzZW5zb3JzLiAgVG9vIGJhZAotCSAqIHRoZXJlJ3Mgbm8gd2F5IHRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgYXJlIGNvbm5lY3RlZC4KLQkgKiBGb3Igbm93LCBhc3N1bWUgMXMgd2lsbCB3b3JrLgorCSAqIEZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHNoYWRvdyByZWdpc3RlcnMuCisJICogTG9ja2xlc3MgbWVhbnMgdGhhdCB3ZSBtYXkgb2NjYXNpb25hbGx5IHJlcG9ydCBvdXQgb2YKKwkgKiBkYXRlIGRhdGEuCiAJICovCi0JbXNsZWVwKFRFTVBfQ09MTEVDVElPTl9USU1FKTsKKwlpZiAodGltZV9iZWZvcmUobG9jYWxfamlmZmllcywgZGF0YS0+c2Vuc29yc19sYXN0X3VwZGF0ZWQgKworCQkJU0VOU09SX1JFRlJFU0hfSU5URVJWQUwpICYmCisJICAgIGRhdGEtPnNlbnNvcnNfdmFsaWQpCisJCW5lZWRfc2Vuc29ycyA9IDA7CiAKLQkvKiBkb25lIHJlYWRpbmcgdGVtcGVyYXR1cmUgc2Vuc29ycyAqLwotCWNmZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7Ci0JY2ZnICY9IH4weDgwOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcsIGNmZyk7CisJaWYgKHRpbWVfYmVmb3JlKGxvY2FsX2ppZmZpZXMsIGRhdGEtPmxpbWl0c19sYXN0X3VwZGF0ZWQgKworCQkJTElNSVRfUkVGUkVTSF9JTlRFUlZBTCkgJiYKKwkgICAgZGF0YS0+bGltaXRzX3ZhbGlkKQorCQluZWVkX2xpbWl0cyA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9URU1QX0NPVU5UOyBpKyspCi0JCWRhdGEtPnRlbXBbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCWlmICghbmVlZF9zZW5zb3JzICYmICFuZWVkX2xpbWl0cykKKwkJcmV0dXJuIGRhdGE7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlpZiAoIW5lZWRfc2Vuc29ycykKKwkJZ290byBub19zZW5zb3JfdXBkYXRlOworCisJaWYgKCFkYXRhLT50ZW1wZXJhdHVyZXNfcHJvYmVkKQorCQlhZHQ3NDcwX3JlYWRfdGVtcGVyYXR1cmVzKGNsaWVudCwgZGF0YSk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9URU1QX0NPVU5UOyBpKyspCisJCQlkYXRhLT50ZW1wW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkJCUFEVDc0NzBfVEVNUF9SRUcoaSkpOwogCiAJZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfRkFOX0NPVU5UOyBpKyspCkBAIC0zMDIsOSArMzk4LDcgQEAKIAlkYXRhLT5zZW5zb3JzX3ZhbGlkID0gMTsKIAogbm9fc2Vuc29yX3VwZGF0ZToKLQlpZiAodGltZV9iZWZvcmUobG9jYWxfamlmZmllcywgZGF0YS0+bGltaXRzX2xhc3RfdXBkYXRlZCArCi0JCUxJTUlUX1JFRlJFU0hfSU5URVJWQUwpCi0JCSYmIGRhdGEtPmxpbWl0c192YWxpZCkKKwlpZiAoIW5lZWRfbGltaXRzKQogCQlnb3RvIG91dDsKIAogCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX1RFTVBfQ09VTlQ7IGkrKykgewpAQCAtMzM4LDYgKzQzMiw2NiBAQAogCXJldHVybiBkYXRhOwogfQogCitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdXBkYXRlX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBhZHQ3NDcwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YXV0b191cGRhdGVfaW50ZXJ2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfYXV0b191cGRhdGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB0ZW1wOworCisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDYwMDAwKTsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWRhdGEtPmF1dG9fdXBkYXRlX2ludGVydmFsID0gdGVtcDsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X251bV90ZW1wX3NlbnNvcnMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGFkdDc0NzBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5udW1fdGVtcF9zZW5zb3JzKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X251bV90ZW1wX3NlbnNvcnMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB0ZW1wOworCisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIC0xLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlkYXRhLT5udW1fdGVtcF9zZW5zb3JzID0gdGVtcDsKKwlpZiAodGVtcCA8IDApCisJCWRhdGEtPnRlbXBlcmF0dXJlc19wcm9iZWQgPSAwOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSAgICAgY2hhciAqYnVmKQpAQCAtMzYwLDcgKzUxNCw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTM5NCw3ICs1NDgsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC02NzEsNyArODI1LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtODA0LDYgKzk1OCwxMCBAQAogfQogCiBzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1fbWFzaywgU19JUlVHTywgc2hvd19hbGFybV9tYXNrLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihudW1fdGVtcF9zZW5zb3JzLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19udW1fdGVtcF9zZW5zb3JzLAorCQkgICBzZXRfbnVtX3RlbXBfc2Vuc29ycyk7CitzdGF0aWMgREVWSUNFX0FUVFIoYXV0b191cGRhdGVfaW50ZXJ2YWwsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBzaG93X2F1dG9fdXBkYXRlX2ludGVydmFsLCBzZXRfYXV0b191cGRhdGVfaW50ZXJ2YWwpOwogCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcF9tYXgsCiAJCSAgICBzZXRfdGVtcF9tYXgsIDApOwpAQCAtOTc2LDYgKzExMzQsOCBAQAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc0NzBfYXR0cltdID0KIHsKIAkmZGV2X2F0dHJfYWxhcm1fbWFzay5hdHRyLAorCSZkZXZfYXR0cl9udW1fdGVtcF9zZW5zb3JzLmF0dHIsCisJJmRldl9hdHRyX2F1dG9fdXBkYXRlX2ludGVydmFsLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4LmRldl9hdHRyLmF0dHIsCkBAIC0xMTA4LDYgKzEyNjgsOSBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCisJZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyA9IC0xOworCWRhdGEtPmF1dG9fdXBkYXRlX2ludGVydmFsID0gQVVUT19VUERBVEVfSU5URVJWQUw7CisKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKIAltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKIApAQCAtMTEyNyw4ICsxMjkwLDE2IEBACiAJCWdvdG8gZXhpdF9yZW1vdmU7CiAJfQogCisJaW5pdF9jb21wbGV0aW9uKCZkYXRhLT5hdXRvX3VwZGF0ZV9zdG9wKTsKKwlkYXRhLT5hdXRvX3VwZGF0ZSA9IGt0aHJlYWRfcnVuKGFkdDc0NzBfdXBkYXRlX3RocmVhZCwgY2xpZW50LAorCQkJCQlkZXZfbmFtZShkYXRhLT5od21vbl9kZXYpKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmF1dG9fdXBkYXRlKSkKKwkJZ290byBleGl0X3VucmVnaXN0ZXI7CisKIAlyZXR1cm4gMDsKIAorZXhpdF91bnJlZ2lzdGVyOgorCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiBleGl0X3JlbW92ZToKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZkYXRhLT5hdHRycyk7CiBleGl0X2ZyZWU6CkBAIC0xMTQxLDYgKzEzMTIsOCBAQAogewogCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAorCWt0aHJlYWRfc3RvcChkYXRhLT5hdXRvX3VwZGF0ZSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZGF0YS0+YXV0b191cGRhdGVfc3RvcCk7CiAJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZkYXRhLT5hdHRycyk7CiAJa2ZyZWUoZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzMuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3My5jCmluZGV4IDE4YWEzMDguLjBhNmNlMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3My5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3My5jCkBAIC0xMjksOCArMTI5LDYgQEAKICNkZWZpbmUgRkFOX1BFUklPRF9JTlZBTElECTY1NTM1CiAjZGVmaW5lIEZBTl9EQVRBX1ZBTElEKHgpCSgoeCkgJiYgKHgpICE9IEZBTl9QRVJJT0RfSU5WQUxJRCkKIAotI2RlZmluZSBST1VORF9ESVYoeCwgZGl2aXNvcikJKCgoeCkgKyAoKGRpdmlzb3IpIC8gMikpIC8gKGRpdmlzb3IpKQotCiBzdHJ1Y3QgYWR0NzQ3M19kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqaHdtb25fZGV2OwogCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJYXR0cnM7CkBAIC00NTksNyArNDU3LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IGVuY29kZV90ZW1wKGRhdGEtPnRlbXBfdHdvc19jb21wbGVtZW50LCB0ZW1wKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtNDk1LDcgKzQ5Myw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBlbmNvZGVfdGVtcChkYXRhLT50ZW1wX3R3b3NfY29tcGxlbWVudCwgdGVtcCk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTcyMCw3ICs3MTgsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gZW5jb2RlX3RlbXAoZGF0YS0+dGVtcF90d29zX2NvbXBsZW1lbnQsIHRlbXApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC03NTYsNyArNzU0LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IGVuY29kZV90ZW1wKGRhdGEtPnRlbXBfdHdvc19jb21wbGVtZW50LCB0ZW1wKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jIGIvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jCmluZGV4IDA4NmMyYTUuLmRjYTQ3YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYworKysgYi9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKQEAgLTEzMSw2ICsxMzEsMTAgQEAKIC8qIFNldCAxNDogaU1hYyA2LDEgKi8KIAl7ICJUQTBQIiwgIlRDMEQiLCAiVEMwSCIsICJUQzBQIiwgIlRHMEQiLCAiVEcwSCIsICJURzBQIiwgIlRIMFAiLAogCSAgIlRPMFAiLCAiVHAwUCIsIE5VTEwgfSwKKy8qIFNldCAxNTogTWFjQm9vayBBaXIgMiwxICovCisJeyAiVEIwVCIsICJUQjFTIiwgIlRCMVQiLCAiVEIyUyIsICJUQjJUIiwgIlRDMEQiLCAiVE4wRCIsICJUVEYwIiwKKwkgICJUVjBQIiwgIlRWRlAiLCAiVFcwUCIsICJUaDBQIiwgIlRwMFAiLCAiVHAxUCIsICJUcEZQIiwgIlRzMFAiLAorCSAgIlRzMFMiLCBOVUxMIH0sCiB9OwogCiAvKiBMaXN0IG9mIGtleXMgdXNlZCB0byByZWFkL3dyaXRlIGZhbiBzcGVlZHMgKi8KQEAgLTEzMDEsMTEgKzEzMDUsMTcgQEAKIAl7IC5hY2NlbGVyb21ldGVyID0gMCwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDEzIH0sCiAvKiBpTWFjIDY6IGxpZ2h0IHNlbnNvciBvbmx5LCB0ZW1wZXJhdHVyZSBzZXQgMTQgKi8KIAl7IC5hY2NlbGVyb21ldGVyID0gMCwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDE0IH0sCisvKiBNYWNCb29rIEFpciAyLDE6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDE1ICovCisJeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSAxNSB9LAogfTsKIAogLyogTm90ZSB0aGF0IERNSV9NQVRDSCguLi4sIk1hY0Jvb2siKSB3aWxsIG1hdGNoICJNYWNCb29rUHJvMSwxIi4KICAqIFNvIHdlIG5lZWQgdG8gcHV0ICJBcHBsZSBNYWNCb29rIFBybyIgYmVmb3JlICJBcHBsZSBNYWNCb29rIi4gKi8KIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGFwcGxlc21jX3doaXRlbGlzdFtdID0geworCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBBaXIgMiIsIHsKKwkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKKwkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va0FpcjIiKSB9LAorCQkmYXBwbGVzbWNfZG1pX2RhdGFbMTVdfSwKIAl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgQWlyIiwgewogCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAogCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rQWlyIikgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwppbmRleCAwNzZhNTljLi5lMTVjM2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC03Niw3ICs3Niw3IEBACiB7CiAJaW50IGlkOwogCi0JaWYgKGxpa2VseShzc2NhbmYoZGV2LT5idXNfaWQsIEhXTU9OX0lEX0ZPUk1BVCwgJmlkKSA9PSAxKSkgeworCWlmIChsaWtlbHkoc3NjYW5mKGRldl9uYW1lKGRldiksIEhXTU9OX0lEX0ZPUk1BVCwgJmlkKSA9PSAxKSkgewogCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogCQlzcGluX2xvY2soJmlkcl9sb2NrKTsKIAkJaWRyX3JlbW92ZSgmaHdtb25faWRyLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2libXBleC5jIGIvZHJpdmVycy9od21vbi9pYm1wZXguYwppbmRleCA1MzdkOWZiLi5hMzYzNjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2libXBleC5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogc3RhdGljIGlubGluZSB1MTYgZXh0cmFjdF92YWx1ZShjb25zdCBjaGFyICpkYXRhLCBpbnQgb2Zmc2V0KQogewotCXJldHVybiBiZTE2X3RvX2NwdXAoKHUxNiAqKSZkYXRhW29mZnNldF0pOworCXJldHVybiBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSZkYXRhW29mZnNldF0pOwogfQogCiAjZGVmaW5lIFRFTVBfU0VOU09SCQkxCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzUuYyBiL2RyaXZlcnMvaHdtb24vbG03NS5jCmluZGV4IDhmOTU5NWYuLjU1YmQ4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03NS5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAl9CiAKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlczogc2Vuc29yICclcydcbiIsCi0JCWRhdGEtPmh3bW9uX2Rldi0+YnVzX2lkLCBjbGllbnQtPm5hbWUpOworCQkgZGV2X25hbWUoZGF0YS0+aHdtb25fZGV2KSwgY2xpZW50LT5uYW1lKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9LY29uZmlnIGIvZHJpdmVycy9pZGUvS2NvbmZpZwppbmRleCA0ZWU4NWZjLi4zZjk1MDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWRlL0tjb25maWcKQEAgLTUxMSw2ICs1MTEsMTMgQEAKIAkgIFRoaXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gY2hhbmdlIFBJTywgRE1BIGFuZCBVRE1BIHNwZWVkcyBhbmQgdG8KIAkgIGNvbmZpZ3VyZSB0aGUgY2hpcCB0byBvcHRpbXVtIHBlcmZvcm1hbmNlLgogCitjb25maWcgQkxLX0RFVl9JVDgxNzIKKwl0cmlzdGF0ZSAiSVQ4MTcyIElERSBzdXBwb3J0IgorCXNlbGVjdCBCTEtfREVWX0lERURNQV9QQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHRoZSBJREUgY29udHJvbGxlciBvbiB0aGUKKwkgIElUODE3MiBTeXN0ZW0gQ29udHJvbGxlci4KKwogY29uZmlnIEJMS19ERVZfSVQ4MjEzCiAJdHJpc3RhdGUgIklUODIxMyBJREUgc3VwcG9ydCIKIAlzZWxlY3QgQkxLX0RFVl9JREVETUFfUENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9NYWtlZmlsZSBiL2RyaXZlcnMvaWRlL01ha2VmaWxlCmluZGV4IDQxMDcyODkuLmMyYjljOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWRlL01ha2VmaWxlCkBAIC00Nyw2ICs0Nyw3IEBACiBvYmotJChDT05GSUdfQkxLX0RFVl9DWTgyQzY5MykJCSs9IGN5ODJjNjkzLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0RFTEtJTikJCSs9IGRlbGtpbl9jYi5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9IUFQzNjYpCQkrPSBocHQzNjYubworb2JqLSQoQ09ORklHX0JMS19ERVZfSVQ4MTcyKQkJKz0gaXQ4MTcyLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0lUODIxMykJCSs9IGl0ODIxMy5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9JVDgyMVgpCQkrPSBpdDgyMXgubwogb2JqLSQoQ09ORklHX0JMS19ERVZfSk1JQ1JPTikJCSs9IGptaWNyb24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYWVjNjJ4eC5jIGIvZHJpdmVycy9pZGUvYWVjNjJ4eC5jCmluZGV4IDQxNDJjNjkuLjQ0ODViOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2FlYzYyeHguYworKysgYi9kcml2ZXJzL2lkZS9hZWM2Mnh4LmMKQEAgLTgzLDcgKzgzLDcgQEAKIAogc3RhdGljIHZvaWQgYWVjNjIxMF9zZXRfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QJPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqYnVzX2Nsb2NrID0gaG9zdC0+aG9zdF9wcml2OwpAQCAtMTExLDcgKzExMSw3IEBACiAKIHN0YXRpYyB2b2lkIGFlYzYyNjBfc2V0X21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGlkZV9ob3N0ICpob3N0CT0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKmJ1c19jbG9jayA9IGhvc3QtPmhvc3RfcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2FsaW0xNXgzLmMgYi9kcml2ZXJzL2lkZS9hbGltMTV4My5jCmluZGV4IDQ1ZDIzNTYuLjY2ZjQzMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2FsaW0xNXgzLmMKKysrIGIvZHJpdmVycy9pZGUvYWxpbTE1eDMuYwpAQCAtNjgsNyArNjgsNyBAQAogCiBzdGF0aWMgdm9pZCBhbGlfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWRlX3RpbWluZyAqdCA9IGlkZV90aW1pbmdfZmluZF9tb2RlKFhGRVJfUElPXzAgKyBwaW8pOwogCWludCBzX3RpbWUgPSB0LT5zZXR1cCwgYV90aW1lID0gdC0+YWN0aXZlLCBjX3RpbWUgPSB0LT5jeWNsZTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCiBzdGF0aWMgdm9pZCBhbGlfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IHNwZWVkMQkJPSBzcGVlZDsKIAl1OCB1bml0CQkJPSBkcml2ZS0+ZG4gJiAxOwpAQCAtMTk4LDcgKzE5OCw3IEBACiBzdGF0aWMgaW50IGFsaTE1eDNfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZiAobTUyMjlfcmV2aXNpb24gPCAweEMyICYmIGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgewotCQlpZiAocnFfZGF0YV9kaXIoZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxKSkKKwkJaWYgKHJxX2RhdGFfZGlyKGRyaXZlLT5od2lmLT5ycSkpCiAJCQlyZXR1cm4gMTsJLyogdHJ5IFBJTyBpbnN0ZWFkIG9mIERNQSAqLwogCX0KIAlyZXR1cm4gaWRlX2RtYV9zZXR1cChkcml2ZSk7CkBAIC00OTAsOCArNDkwLDYgQEAKIAlpZiAoaWRlX2FsbG9jYXRlX2RtYV9lbmdpbmUoaHdpZikpCiAJCXJldHVybiAtMTsKIAotCWh3aWYtPmRtYV9vcHMgPSAmc2ZmX2RtYV9vcHM7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTExLDYgKzUwOSw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gYWxpMTV4M19jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CkBAIC01MTksNiArNTE4LDcgQEAKIAkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2FsaTE1eDMsCiAJLmluaXRfZG1hCT0gaW5pdF9kbWFfYWxpMTV4MywKIAkucG9ydF9vcHMJPSAmYWxpX3BvcnRfb3BzLAorCS5kbWFfb3BzCT0gJnNmZl9kbWFfb3BzLAogCS5waW9fbWFzawk9IEFUQV9QSU81LAogCS5zd2RtYV9tYXNrCT0gQVRBX1NXRE1BMiwKIAkubXdkbWFfbWFzawk9IEFUQV9NV0RNQTIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9hbWQ3NHh4LmMgYi9kcml2ZXJzL2lkZS9hbWQ3NHh4LmMKaW5kZXggYzZiY2QzMC4uNjk2NjBhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYW1kNzR4eC5jCisrKyBiL2RyaXZlcnMvaWRlL2FtZDc0eHguYwpAQCAtODIsNyArODIsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwotCWlkZV9kcml2ZV90ICpwZWVyID0gaHdpZi0+ZHJpdmVzICsgKH5kcml2ZS0+ZG4gJiAxKTsKKwlpZGVfZHJpdmVfdCAqcGVlciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCXN0cnVjdCBpZGVfdGltaW5nIHQsIHA7CiAJaW50IFQsIFVUOwogCXU4IHVkbWFfbWFzayA9IGh3aWYtPnVsdHJhX21hc2s7CkBAIC05Miw3ICs5Miw3IEBACiAKIAlpZGVfdGltaW5nX2NvbXB1dGUoZHJpdmUsIHNwZWVkLCAmdCwgVCwgVVQpOwogCi0JaWYgKHBlZXItPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7CisJaWYgKHBlZXIpIHsKIAkJaWRlX3RpbWluZ19jb21wdXRlKHBlZXIsIHBlZXItPmN1cnJlbnRfc3BlZWQsICZwLCBULCBVVCk7CiAJCWlkZV90aW1pbmdfbWVyZ2UoJnAsICZ0LCAmdCwgSURFX1RJTUlOR184QklUKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMgYi9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMKaW5kZXggMGVjOGZkMS4uNzlhMmRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYwpAQCAtMjEyLDggKzIxMiw4IEBACiBzdGF0aWMgaW50IGF1aWRlX2J1aWxkX2RtYXRhYmxlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpbnQgaSwgaXN3cml0ZSwgY291bnQgPSAwOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCV9hdWlkZV9od2lmICphaHdpZiA9ICZhdWlkZV9od2lmOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAKQEAgLTI4Niw3ICsyODYsNyBAQAogCiBzdGF0aWMgaW50IGF1aWRlX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAKIAlpZiAoaHdpZi0+c2dfbmVudHMpIHsKIAkJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOwpAQCAtMzA5LDggKzMwOSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYXVpZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsgICAgICAgCQotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAKIAlpZiAoIWF1aWRlX2J1aWxkX2RtYXRhYmxlKGRyaXZlKSkgewogCQlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CkBAIC01MDIsNyArNTAyLDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IGlkZV9yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvY21kNjQwLmMgYi9kcml2ZXJzL2lkZS9jbWQ2NDAuYwppbmRleCBlNDMwNjY0Li44ODkwMjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9jbWQ2NDAuYworKysgYi9kcml2ZXJzL2lkZS9jbWQ2NDAuYwpAQCAtNDY3LDExICs0NjcsMTAgQEAKIAkgKiBzbyB3ZSBtZXJnZSB0aGUgdGltaW5ncywgdXNpbmcgdGhlIHNsb3dlc3QgdmFsdWUgZm9yIGVhY2ggdGltaW5nLgogCSAqLwogCWlmIChpbmRleCA+IDEpIHsKLQkJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCQlpZGVfZHJpdmVfdCAqcGVlciA9ICZod2lmLT5kcml2ZXNbIShkcml2ZS0+ZG4gJiAxKV07CisJCWlkZV9kcml2ZV90ICpwZWVyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJCXVuc2lnbmVkIGludCBtYXRlID0gaW5kZXggXiAxOwogCi0JCWlmIChwZWVyLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgeworCQlpZiAocGVlcikgewogCQkJaWYgKHNldHVwX2NvdW50IDwgc2V0dXBfY291bnRzW21hdGVdKQogCQkJCXNldHVwX2NvdW50ID0gc2V0dXBfY291bnRzW21hdGVdOwogCQkJaWYgKGFjdGl2ZV9jb3VudCA8IGFjdGl2ZV9jb3VudHNbbWF0ZV0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jbWQ2NHguYyBiL2RyaXZlcnMvaWRlL2NtZDY0eC5jCmluZGV4IDM2MjNiZjAuLjJmOTY4OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2NtZDY0eC5jCisrKyBiL2RyaXZlcnMvaWRlL2NtZDY0eC5jCkBAIC0xMTUsNyArMTE1LDcgQEAKICAqLwogc3RhdGljIHZvaWQgY21kNjR4X3R1bmVfcGlvKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWRlX3RpbWluZyAqdAk9IGlkZV90aW1pbmdfZmluZF9tb2RlKFhGRVJfUElPXzAgKyBwaW8pOwogCXVuc2lnbmVkIGludCBjeWNsZV90aW1lOwpAQCAtMTM4LDEwICsxMzgsMTIgQEAKIAkgKiB0aGUgc2xvd2VzdCBhZGRyZXNzIHNldHVwIHRpbWluZyBvdXJzZWx2ZXMuCiAJICovCiAJaWYgKGh3aWYtPmNoYW5uZWwpIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlcyA9IGh3aWYtPmRyaXZlczsKKwkJaWRlX2RyaXZlX3QgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAogCQlkcml2ZS0+ZHJpdmVfZGF0YSA9IHNldHVwX2NvdW50OwotCQlzZXR1cF9jb3VudCA9IG1heChkcml2ZXNbMF0uZHJpdmVfZGF0YSwgZHJpdmVzWzFdLmRyaXZlX2RhdGEpOworCisJCWlmIChwYWlyKQorCQkJc2V0dXBfY291bnQgPSBtYXhfdCh1OCwgc2V0dXBfY291bnQsIHBhaXItPmRyaXZlX2RhdGEpOwogCX0KIAogCWlmIChzZXR1cF9jb3VudCA+IDUpCQkvKiBzaG91bGRuJ3QgYWN0dWFsbHkgaGFwcGVuLi4uICovCkBAIC0xODAsNyArMTgyLDcgQEAKIAogc3RhdGljIHZvaWQgY21kNjR4X3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCB1bml0CQkJPSBkcml2ZS0+ZG4gJiAweDAxOwogCXU4IHJlZ1UgPSAwLCBwY2lVCT0gaHdpZi0+Y2hhbm5lbCA/IFVESURFVENSMSA6IFVESURFVENSMDsKQEAgLTIyNiw3ICsyMjgsNyBAQAogCiBzdGF0aWMgaW50IGNtZDY0OF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgYmFzZQk9IGh3aWYtPmRtYV9iYXNlIC0gKGh3aWYtPmNoYW5uZWwgKiA4KTsKIAlpbnQgZXJyCQkJPSBpZGVfZG1hX2VuZChkcml2ZSk7CiAJdTggIGlycV9tYXNrCQk9IGh3aWYtPmNoYW5uZWwgPyBNUkRNT0RFX0lOVFJfQ0gxIDoKQEAgLTI0Miw3ICsyNDQsNyBAQAogCiBzdGF0aWMgaW50IGNtZDY0eF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IGlycV9yZWcJCT0gaHdpZi0+Y2hhbm5lbCA/IEFSVFRJTTIzIDogQ0ZSOwogCXU4ICBpcnFfbWFzawkJPSBod2lmLT5jaGFubmVsID8gQVJUVElNMjNfSU5UUl9DSDEgOgpAQCAtMjU5LDcgKzI2MSw3IEBACiAKIHN0YXRpYyBpbnQgY21kNjQ4X2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGJhc2UJPSBod2lmLT5kbWFfYmFzZSAtIChod2lmLT5jaGFubmVsICogOCk7CiAJdTggaXJxX21hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IE1SRE1PREVfSU5UUl9DSDEgOgogCQkJCQkJICBNUkRNT0RFX0lOVFJfQ0gwOwpAQCAtMjgyLDcgKzI4NCw3IEBACiAKIHN0YXRpYyBpbnQgY21kNjR4X2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCWludCBpcnFfcmVnCQk9IGh3aWYtPmNoYW5uZWwgPyBBUlRUSU0yMyA6IENGUjsKIAl1OCAgaXJxX21hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IEFSVFRJTTIzX0lOVFJfQ0gxIDoKQEAgLTMxMyw3ICszMTUsNyBAQAogCiBzdGF0aWMgaW50IGNtZDY0Nl8xX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMDsKIAogCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwpAQCAtMzgzLDYgKzM4NSw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBjbWQ2NHhfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzIGNtZDY0Nl9yZXYxX2RtYV9vcHMgPSB7CkBAIC0zOTQsNiArMzk3LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX2RtYV9vcHMgY21kNjQ4X2RtYV9vcHMgPSB7CkBAIC00MDUsNiArNDA5LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGNtZDY0OF9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBjbWQ2NHhfY2hpcHNldHNbXSBfX2RldmluaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvY3M1NTIwLmMgYi9kcml2ZXJzL2lkZS9jczU1MjAuYwppbmRleCA1ZWZiNDY3Li5kMDAzYmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9jczU1MjAuYworKysgYi9kcml2ZXJzL2lkZS9jczU1MjAuYwpAQCAtNTksNyArNTksNyBAQAogCiBzdGF0aWMgdm9pZCBjczU1MjBfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IGNvbnRyb2xsZXIgPSBkcml2ZS0+ZG4gPiAxID8gMSA6IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMgYi9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCmluZGV4IGQzN2JhZjguLjc0ZmM1NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKKysrIGIvZHJpdmVycy9pZGUvY3k4MmM2OTMuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAKIHN0YXRpYyB2b2lkIGN5ODJjNjkzX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJcGlvX2Nsb2Nrc190IHBjbGs7CiAJdW5zaWduZWQgaW50IGFkZHJDdHJsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvZmFsY29uaWRlLmMgYi9kcml2ZXJzL2lkZS9mYWxjb25pZGUuYwppbmRleCAzOWQ1MDBkLi5hNWJhODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9mYWxjb25pZGUuYworKysgYi9kcml2ZXJzL2lkZS9mYWxjb25pZGUuYwpAQCAtNzAsNyArNzAsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9ocHQzNjYuYyBiL2RyaXZlcnMvaWRlL2hwdDM2Ni5jCmluZGV4IGIxOGUxMGQuLjNlYjliNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2hwdDM2Ni5jCisrKyBiL2RyaXZlcnMvaWRlL2hwdDM2Ni5jCkBAIC02MjYsNyArNjI2LDcgQEAKIAogc3RhdGljIHU4IGhwdDN4eF91ZG1hX2ZpbHRlcihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JPSBocHQzeHhfZ2V0X2luZm8oaHdpZi0+ZGV2KTsKIAl1OCBtYXNrIAkJPSBod2lmLT51bHRyYV9tYXNrOwogCkBAIC02NjUsNyArNjY1LDcgQEAKIAogc3RhdGljIHU4IGhwdDN4eF9tZG1hX2ZpbHRlcihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JPSBocHQzeHhfZ2V0X2luZm8oaHdpZi0+ZGV2KTsKIAogCXN3aXRjaCAoaW5mby0+Y2hpcF90eXBlKSB7CkBAIC03NDMsNyArNzQzLDcgQEAKIAogc3RhdGljIHZvaWQgaHB0M3h4X21hc2twcm9jKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IG1hc2spCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldgkqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhwdDN4eF9nZXRfaW5mbyhod2lmLT5kZXYpOwogCkBAIC03ODgsNyArNzg4LDcgQEAKIAogc3RhdGljIHZvaWQgaHB0MzcwX2NsZWFyX2VuZ2luZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgaHdpZi0+c2VsZWN0X2RhdGEsIDB4MzcpOwpAQCAtNzk3LDcgKzc5Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGhwdDM3MF9pcnFfdGltZW91dChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXUxNiBiZmlmbwkJPSAwOwogCXU4ICBkbWFfY21kOwpAQCAtODIyLDcgKzgyMiw3IEBACiAKIHN0YXRpYyBpbnQgaHB0MzcwX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJdTggIGRtYV9zdGF0CQk9IGluYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKIAogCWlmIChkbWFfc3RhdCAmIDB4MDEpIHsKQEAgLTg0NCw3ICs4NDQsNyBAQAogLyogcmV0dXJucyAxIGlmIERNQSBJUlEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBocHQzNzRfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTE2IGJmaWZvCQk9IDA7CiAJdTggIGRtYV9zdGF0OwpAQCAtODY1LDcgKzg2NSw3IEBACiAKIHN0YXRpYyBpbnQgaHB0Mzc0X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBtY3IJPSAwLCBtY3JfYWRkcgk9IGh3aWYtPnNlbGVjdF9kYXRhOwogCXU4IGJ3c3IgPSAwLCBtYXNrCT0gaHdpZi0+Y2hhbm5lbCA/IDB4MDIgOiAweDAxOwpAQCAtOTI3LDcgKzkyNyw3IEBACiAKIHN0YXRpYyB2b2lkIGhwdDN4eG5fcndfZGlzayhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlocHQzeHhuX3NldF9jbG9jayhIV0lGKGRyaXZlKSwgcnFfZGF0YV9kaXIocnEpID8gMHgyMyA6IDB4MjEpOworCWhwdDN4eG5fc2V0X2Nsb2NrKGRyaXZlLT5od2lmLCBycV9kYXRhX2RpcihycSkgPyAweDIzIDogMHgyMSk7CiB9CiAKIC8qKgpAQCAtMTM0OSw4ICsxMzQ5LDYgQEAKIAlpZiAoaWRlX2FsbG9jYXRlX2RtYV9lbmdpbmUoaHdpZikpCiAJCXJldHVybiAtMTsKIAotCWh3aWYtPmRtYV9vcHMgPSAmc2ZmX2RtYV9vcHM7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQyNiw2ICsxNDI0LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGhwdDM3NF9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX2RtYV9vcHMgaHB0MzcwX2RtYV9vcHMgPSB7CkBAIC0xNDM3LDYgKzE0MzYsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGhwdDM3MF9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBocHQzNnhfZG1hX29wcyA9IHsKQEAgLTE0NDgsNiArMTQ0OCw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaHB0MzY2X2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gaHB0MzY2X2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2ljc2lkZS5jIGIvZHJpdmVycy9pZGUvaWNzaWRlLmMKaW5kZXggODFmNzBjYS4uOTdhMzVjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWNzaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvaWNzaWRlLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogICovCiBzdGF0aWMgdm9pZCBpY3NpZGVfbWFza3Byb2MoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbWFzaykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAKIHN0YXRpYyBpbnQgaWNzaWRlX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihod2lmLT5kZXYpOwogCiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CkBAIC0yOTksNyArMjk5LDcgQEAKIAogc3RhdGljIHZvaWQgaWNzaWRlX2RtYV9zdGFydChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGh3aWYtPmRldik7CiAKIAkvKiBXZSBjYW4gbm90IGVuYWJsZSBETUEgb24gYm90aCBjaGFubmVscyBzaW11bHRhbmVvdXNseS4gKi8KQEAgLTMwOSwxMCArMzA5LDEwIEBACiAKIHN0YXRpYyBpbnQgaWNzaWRlX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGh3aWYtPmRldik7CiAJc3RydWN0IGljc2lkZV9zdGF0ZSAqc3RhdGUgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdW5zaWduZWQgaW50IGRtYV9tb2RlOwogCiAJaWYgKHJxX2RhdGFfZGlyKHJxKSkKQEAgLTM2Miw3ICszNjIsNyBAQAogCiBzdGF0aWMgaW50IGljc2lkZV9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihod2lmLT5kZXYpOwogCXN0cnVjdCBpY3NpZGVfc3RhdGUgKnN0YXRlID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jIGIvZHJpdmVycy9pZGUvaWRlLWFjcGkuYwppbmRleCBmZDRhMzY0Li4yZjllOTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogICovCiBzdGF0aWMgYWNwaV9oYW5kbGUgaWRlX2FjcGlfZHJpdmVfZ2V0X2hhbmRsZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdAkqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QJKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlpbnQJCSBwb3J0OwogCWFjcGlfaGFuZGxlCSBkcml2ZV9oYW5kbGU7CiAKQEAgLTI2Myw3ICsyNjMsNyBAQAogCWFjcGlfc3RhdHVzCQkJc3RhdHVzOwogCXN0cnVjdCBhY3BpX2J1ZmZlcgkJb3V0cHV0OwogCXVuaW9uIGFjcGlfb2JqZWN0IAkJKm91dF9vYmo7Ci0JaWRlX2h3aWZfdAkJCSpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdAkJCSpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGRldmljZQkJCSpkZXYgPSBod2lmLT5nZW5kZXYucGFyZW50OwogCWludAkJCQllcnIgPSAtRU5PREVWOwogCWludAkJCQlwb3J0OwpAQCAtNjQxLDcgKzY0MSw4IEBACiAgKi8KIHZvaWQgaWRlX2FjcGlfc2V0X3N0YXRlKGlkZV9od2lmX3QgKmh3aWYsIGludCBvbikKIHsKLQlpbnQgdW5pdDsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaW50IGk7CiAKIAlpZiAoaWRlX25vYWNwaSB8fCBpZGVfbm9hY3BpX3BzeCkKIAkJcmV0dXJuOwpAQCAtNjU1LDkgKzY1Niw4IEBACiAJLyogY2hhbm5lbCBmaXJzdCBhbmQgdGhlbiBkcml2ZXMgZm9yIHBvd2VyIG9uIGFuZCB2ZXJzZSB2ZXJzYSBmb3IgcG93ZXIgb2ZmICovCiAJaWYgKG9uKQogCQlhY3BpX2J1c19zZXRfcG93ZXIoaHdpZi0+YWNwaWRhdGEtPm9ial9oYW5kbGUsIEFDUElfU1RBVEVfRDApOwotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKIAorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQlpZiAoIWRyaXZlLT5hY3BpZGF0YS0+b2JqX2hhbmRsZSkKIAkJCWRyaXZlLT5hY3BpZGF0YS0+b2JqX2hhbmRsZSA9IGlkZV9hY3BpX2RyaXZlX2dldF9oYW5kbGUoZHJpdmUpOwogCkBAIC03MTEsMTUgKzcxMSwxMyBAQAogCSAqIGZvciBib3RoIGRyaXZlcywgcmVnYXJkbGVzcyB3aGV0aGVyIHRoZXkgYXJlIGNvbm5lY3RlZAogCSAqIG9yIG5vdC4KIAkgKi8KLQlod2lmLT5kcml2ZXNbMF0uYWNwaWRhdGEgPSAmaHdpZi0+YWNwaWRhdGEtPm1hc3RlcjsKLQlod2lmLT5kcml2ZXNbMV0uYWNwaWRhdGEgPSAmaHdpZi0+YWNwaWRhdGEtPnNsYXZlOworCWh3aWYtPmRldmljZXNbMF0tPmFjcGlkYXRhID0gJmh3aWYtPmFjcGlkYXRhLT5tYXN0ZXI7CisJaHdpZi0+ZGV2aWNlc1sxXS0+YWNwaWRhdGEgPSAmaHdpZi0+YWNwaWRhdGEtPnNsYXZlOwogCiAJLyoKIAkgKiBTZW5kIElERU5USUZZIGZvciBlYWNoIGRyaXZlCiAJICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlkcml2ZSA9ICZod2lmLT5kcml2ZXNbaV07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJbWVtc2V0KGRyaXZlLT5hY3BpZGF0YSwgMCwgc2l6ZW9mKCpkcml2ZS0+YWNwaWRhdGEpKTsKIAogCQlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPT0gMCkKQEAgLTc0NCw5ICs3NDIsNyBAQAogCWlkZV9hY3BpX2dldF90aW1pbmcoaHdpZik7CiAJaWRlX2FjcGlfcHVzaF90aW1pbmcoaHdpZik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7Ci0JCWRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKQogCQkJLyogRXhlY3V0ZSBBQ1BJIHN0YXJ0dXAgY29kZSAqLwogCQkJaWRlX2FjcGlfZXhlY190ZnMoZHJpdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMgYi9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYwppbmRleCBlODY4OGMwLi5lOTZjMDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAKIGludCBpZGVfY2RfZXhwaXJ5KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCXVuc2lnbmVkIGxvbmcgd2FpdCA9IDA7CiAKIAlkZWJ1Z19sb2coIiVzOiBycS0+Y21kWzBdOiAweCV4XG4iLCBfX2Z1bmNfXywgcnEtPmNtZFswXSk7CkBAIC0yOTQsNyArMjk0LDcgQEAKIHsKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9IGRyaXZlLT5wYzsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAl4ZmVyX2Z1bmNfdCAqeGZlcmZ1bmM7CiAJdW5zaWduZWQgaW50IHRpbWVvdXQsIHRlbXA7CkBAIC00OTEsNyArNDkxLDcgQEAKIHsKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjICp1bmluaXRpYWxpemVkX3ZhcihwYyk7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCWlkZV9leHBpcnlfdCAqZXhwaXJ5OwogCXVuc2lnbmVkIGludCB0aW1lb3V0OwogCWludCBjbWRfbGVuOwpAQCAtNTQ5LDcgKzU0OSwxMCBAQAogCX0KIAogCS8qIFNldCB0aGUgaW50ZXJydXB0IHJvdXRpbmUgKi8KLQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGlkZV9wY19pbnRyLCB0aW1lb3V0LCBleHBpcnkpOworCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwKKwkJCShkZXZfaXNfaWRlY2QoZHJpdmUpID8gZHJpdmUtPmlycV9oYW5kbGVyCisJCQkJCSAgICAgOiBpZGVfcGNfaW50ciksCisJCQl0aW1lb3V0LCBleHBpcnkpOwogCiAJLyogQmVnaW4gRE1BLCBpZiBuZWNlc3NhcnkgKi8KIAlpZiAoZGV2X2lzX2lkZWNkKGRyaXZlKSkgewpAQCAtNTgwLDcgKzU4Myw3IEBACiAKIAlpZiAoZGV2X2lzX2lkZWNkKGRyaXZlKSkgewogCQl0Zl9mbGFncyA9IElERV9URkxBR19PVVRfTlNFQ1QgfCBJREVfVEZMQUdfT1VUX0xCQUw7Ci0JCWJjb3VudCA9IGlkZV9jZF9nZXRfeGZlcmxlbihod2lmLT5od2dyb3VwLT5ycSk7CisJCWJjb3VudCA9IGlkZV9jZF9nZXRfeGZlcmxlbihod2lmLT5ycSk7CiAJCWV4cGlyeSA9IGlkZV9jZF9leHBpcnk7CiAJCXRpbWVvdXQgPSBBVEFQSV9XQUlUX1BDOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCmluZGV4IDFhNzQxMGYuLmNhZTY5MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAogc3RhdGljIHZvaWQgY2Ryb21fZW5kX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgdXB0b2RhdGUpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAlpbnQgbnNlY3RvcnMgPSBycS0+aGFyZF9jdXJfc2VjdG9yczsKIAogCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlcywgY21kOiAweCV4LCB1cHRvZGF0ZTogMHgleCwgIgpAQCAtMzA2LDggKzMwNiw3IEBACiBzdGF0aWMgaW50IGNkcm9tX2RlY29kZV9zdGF0dXMoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZ29vZF9zdGF0LCBpbnQgKnN0YXRfcmV0KQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAlpbnQgc3RhdCwgZXJyLCBzZW5zZV9rZXk7CiAKIAkvKiBjaGVjayBmb3IgZXJyb3JzICovCkBAIC01MDIsNyArNTAxLDcgQEAKIAkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChycSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCi0JCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwkJaHdpZi0+cnEgPSBOVUxMOwogCiAJCWNkcm9tX3F1ZXVlX3JlcXVlc3Rfc2Vuc2UoZHJpdmUsIHJxLT5zZW5zZSwgcnEpOwogCX0gZWxzZQpAQCAtNTExLDEwNiArNTEwLDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV90cmFuc2Zlcl9wYWNrZXRfY29tbWFuZChpZGVfZHJpdmVfdCAqKTsKLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fbmV3cGNfaW50cihpZGVfZHJpdmVfdCAqKTsKLQotLyoKLSAqIFNldCB1cCB0aGUgZGV2aWNlIHJlZ2lzdGVycyBmb3IgdHJhbnNmZXJyaW5nIGEgcGFja2V0IGNvbW1hbmQgb24gREVWLAotICogZXhwZWN0aW5nIHRvIGxhdGVyIHRyYW5zZmVyIFhGRVJMRU4gYnl0ZXMuICBIQU5ETEVSIGlzIHRoZSByb3V0aW5lCi0gKiB3aGljaCBhY3R1YWxseSB0cmFuc2ZlcnMgdGhlIGNvbW1hbmQgdG8gdGhlIGRyaXZlLiAgSWYgdGhpcyBpcyBhCi0gKiBkcnFfaW50ZXJydXB0IGRldmljZSwgdGhpcyByb3V0aW5lIHdpbGwgYXJyYW5nZSBmb3IgSEFORExFUiB0byBiZQotICogY2FsbGVkIHdoZW4gdGhlIGludGVycnVwdCBmcm9tIHRoZSBkcml2ZSBhcnJpdmVzLiAgT3RoZXJ3aXNlLCBIQU5ETEVSCi0gKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZHJpdmUgaXMgcHJlcGFyZWQgZm9yIHRoZSB0cmFuc2Zlci4KLSAqLwotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9zdGFydF9wYWNrZXRfY29tbWFuZChpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOwotCWludCB4ZmVybGVuOwotCi0JeGZlcmxlbiA9IGlkZV9jZF9nZXRfeGZlcmxlbihycSk7Ci0KLQlpZGVfZGVidWdfbG9nKElERV9EQkdfUEMsICJDYWxsICVzLCB4ZmVybGVuOiAlZFxuIiwgX19mdW5jX18sIHhmZXJsZW4pOwotCi0JLyogRklYTUU6IGZvciBWaXJ0dWFsIERNQSB3ZSBtdXN0IGNoZWNrIGhhcmRlciAqLwotCWlmIChkcml2ZS0+ZG1hKQotCQlkcml2ZS0+ZG1hID0gIWh3aWYtPmRtYV9vcHMtPmRtYV9zZXR1cChkcml2ZSk7Ci0KLQkvKiBzZXQgdXAgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCi0JaWRlX3BrdGNtZF90Zl9sb2FkKGRyaXZlLCBJREVfVEZMQUdfT1VUX05TRUNUIHwgSURFX1RGTEFHX09VVF9MQkFMLAotCQkJICAgeGZlcmxlbiwgZHJpdmUtPmRtYSk7Ci0KLQlpZiAoZHJpdmUtPmF0YXBpX2ZsYWdzICYgSURFX0FGTEFHX0RSUV9JTlRFUlJVUFQpIHsKLQkJLyogd2FpdGluZyBmb3IgQ0RCIGludGVycnVwdCwgbm90IERNQSB5ZXQuICovCi0JCWlmIChkcml2ZS0+ZG1hKQotCQkJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7Ci0KLQkJLyogcGFja2V0IGNvbW1hbmQgKi8KLQkJaWRlX2V4ZWN1dGVfY29tbWFuZChkcml2ZSwgQVRBX0NNRF9QQUNLRVQsCi0JCQkJICAgIGNkcm9tX3RyYW5zZmVyX3BhY2tldF9jb21tYW5kLAotCQkJCSAgICBBVEFQSV9XQUlUX1BDLCBpZGVfY2RfZXhwaXJ5KTsKLQkJcmV0dXJuIGlkZV9zdGFydGVkOwotCX0gZWxzZSB7Ci0JCWlkZV9leGVjdXRlX3BrdF9jbWQoZHJpdmUpOwotCi0JCXJldHVybiBjZHJvbV90cmFuc2Zlcl9wYWNrZXRfY29tbWFuZChkcml2ZSk7Ci0JfQotfQotCi0vKgotICogU2VuZCBhIHBhY2tldCBjb21tYW5kIHRvIERSSVZFIGRlc2NyaWJlZCBieSBDTURfQlVGIGFuZCBDTURfTEVOLiBUaGUgZGV2aWNlCi0gKiByZWdpc3RlcnMgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBwcmVwYXJlZCBieSBjZHJvbV9zdGFydF9wYWNrZXRfY29tbWFuZC4KLSAqIEhBTkRMRVIgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIGNhbGwgd2hlbiB0aGUgY29tbWFuZCBjb21wbGV0ZXMgb3IKLSAqIHRoZXJlJ3MgZGF0YSByZWFkeS4KLSAqLwotI2RlZmluZSBBVEFQSV9NSU5fQ0RCX0JZVEVTIDEyCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX3RyYW5zZmVyX3BhY2tldF9jb21tYW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7Ci0JaW50IGNtZF9sZW47Ci0JaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKLQotCWlkZV9kZWJ1Z19sb2coSURFX0RCR19QQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfRFJRX0lOVEVSUlVQVCkgewotCQkvKgotCQkgKiBIZXJlIHdlIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIGFmdGVyIHJlY2VpdmluZyBhbiBpbnRlcnJ1cHQKLQkJICogZnJvbSB0aGUgZGV2aWNlLiAgRFJRIHNob3VsZCBob3cgYmUgc2V0LgotCQkgKi8KLQotCQkvKiBjaGVjayBmb3IgZXJyb3JzICovCi0JCWlmIChjZHJvbV9kZWNvZGVfc3RhdHVzKGRyaXZlLCBBVEFfRFJRLCBOVUxMKSkKLQkJCXJldHVybiBpZGVfc3RvcHBlZDsKLQotCQkvKiBvaywgbmV4dCBpbnRlcnJ1cHQgd2lsbCBiZSBETUEgaW50ZXJydXB0ICovCi0JCWlmIChkcml2ZS0+ZG1hKQotCQkJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDE7Ci0JfSBlbHNlIHsKLQkJLyogb3RoZXJ3aXNlLCB3ZSBtdXN0IHdhaXQgZm9yIERSUSB0byBnZXQgc2V0ICovCi0JCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsIGRyaXZlLCBBVEFfRFJRLAotCQkJCSAgQVRBX0JVU1ksIFdBSVRfUkVBRFkpKQotCQkJcmV0dXJuIHN0YXJ0c3RvcDsKLQl9Ci0KLQkvKiBhcm0gdGhlIGludGVycnVwdCBoYW5kbGVyICovCi0JaWRlX3NldF9oYW5kbGVyKGRyaXZlLCBjZHJvbV9uZXdwY19pbnRyLCBycS0+dGltZW91dCwgaWRlX2NkX2V4cGlyeSk7Ci0KLQkvKiBBVEFQSSBjb21tYW5kcyBnZXQgcGFkZGVkIG91dCB0byAxMiBieXRlcyBtaW5pbXVtICovCi0JY21kX2xlbiA9IENPTU1BTkRfU0laRShycS0+Y21kWzBdKTsKLQlpZiAoY21kX2xlbiA8IEFUQVBJX01JTl9DREJfQllURVMpCi0JCWNtZF9sZW4gPSBBVEFQSV9NSU5fQ0RCX0JZVEVTOwotCi0JLyogc2VuZCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlICovCi0JaHdpZi0+dHBfb3BzLT5vdXRwdXRfZGF0YShkcml2ZSwgTlVMTCwgcnEtPmNtZCwgY21kX2xlbik7Ci0KLQkvKiBzdGFydCB0aGUgRE1BIGlmIG5lZWQgYmUgKi8KLQlpZiAoZHJpdmUtPmRtYSkKLQkJaHdpZi0+ZG1hX29wcy0+ZG1hX3N0YXJ0KGRyaXZlKTsKLQotCXJldHVybiBpZGVfc3RhcnRlZDsKLX0KLQogLyoKICAqIENoZWNrIHRoZSBjb250ZW50cyBvZiB0aGUgaW50ZXJydXB0IHJlYXNvbiByZWdpc3RlciBmcm9tIHRoZSBjZHJvbQogICogYW5kIGF0dGVtcHQgdG8gcmVjb3ZlciBpZiB0aGVyZSBhcmUgcHJvYmxlbXMuICBSZXR1cm5zICAwIGlmIGV2ZXJ5dGhpbmcncwpAQCAtODU0LDggKzc1Myw3IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX25ld3BjX2ludHIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl4ZmVyX2Z1bmNfdCAqeGZlcmZ1bmM7CiAJaWRlX2V4cGlyeV90ICpleHBpcnkgPSBOVUxMOwogCWludCBkbWFfZXJyb3IgPSAwLCBkbWEsIHN0YXQsIHRoaXNsZW4sIHVwdG9kYXRlID0gMDsKQEAgLTEwNjEsNyArOTU5LDcgQEAKIAkJaWYgKGJsa19lbmRfcmVxdWVzdChycSwgMCwgZGxlbikpCiAJCQlCVUcoKTsKIAotCQlod2dyb3VwLT5ycSA9IE5VTEw7CisJCWh3aWYtPnJxID0gTlVMTDsKIAl9IGVsc2UgewogCQlpZiAoIXVwdG9kYXRlKQogCQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfRkFJTEVEOwpAQCAtMTE4Myw3ICsxMDgxLDcgQEAKIAkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCX0KIAotCXJldHVybiBjZHJvbV9zdGFydF9wYWNrZXRfY29tbWFuZChkcml2ZSk7CisJcmV0dXJuIGlkZV9pc3N1ZV9wYyhkcml2ZSk7CiB9CiAKIC8qCkBAIC0xOTE2LDcgKzE4MTQsNyBAQAogCiBzdGF0aWMgaW50IGlkZV9jZF9wcm9iZShpZGVfZHJpdmVfdCAqKTsKIAotc3RhdGljIGlkZV9kcml2ZXJfdCBpZGVfY2Ryb21fZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBpZGVfZHJpdmVyIGlkZV9jZHJvbV9kcml2ZXIgPSB7CiAJLmdlbl9kcml2ZXIgPSB7CiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJCT0gImlkZS1jZHJvbSIsCkBAIC0xOTI3LDcgKzE4MjUsNiBAQAogCS52ZXJzaW9uCQk9IElERUNEX1ZFUlNJT04sCiAJLmRvX3JlcXVlc3QJCT0gaWRlX2NkX2RvX3JlcXVlc3QsCiAJLmVuZF9yZXF1ZXN0CQk9IGlkZV9lbmRfcmVxdWVzdCwKLQkuZXJyb3IJCQk9IF9faWRlX2Vycm9yLAogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwogCS5wcm9jX2VudHJpZXMJCT0gaWRlX2NkX3Byb2NfZW50cmllcywKIAkucHJvY19kZXZzZXRzCQk9IGlkZV9jZF9wcm9jX2RldnNldHMsCkBAIC0yMDgyLDYgKzE5NzksNyBAQAogCX0KIAogCWRyaXZlLT5kZWJ1Z19tYXNrID0gZGVidWdfbWFzazsKKwlkcml2ZS0+aXJxX2hhbmRsZXIgPSBjZHJvbV9uZXdwY19pbnRyOwogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjZHJvbV9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGluZm8gPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmggYi9kcml2ZXJzL2lkZS9pZGUtY2QuaAppbmRleCBiZjY3NmIyLi5hYzQwZDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuaAorKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuaApAQCAtMzMsMzMgKzMzLDMzIEBACiAKIC8qIFN0cnVjdHVyZSBvZiBhIE1TRiBjZHJvbSBhZGRyZXNzLiAqLwogc3RydWN0IGF0YXBpX21zZiB7Ci0JYnl0ZSByZXNlcnZlZDsKLQlieXRlIG1pbnV0ZTsKLQlieXRlIHNlY29uZDsKLQlieXRlIGZyYW1lOworCXU4IHJlc2VydmVkOworCXU4IG1pbnV0ZTsKKwl1OCBzZWNvbmQ7CisJdTggZnJhbWU7CiB9OwogCiAvKiBTcGFjZSB0byBob2xkIHRoZSBkaXNrIFRPQy4gKi8KICNkZWZpbmUgTUFYX1RSQUNLUyA5OQogc3RydWN0IGF0YXBpX3RvY19oZWFkZXIgewogCXVuc2lnbmVkIHNob3J0IHRvY19sZW5ndGg7Ci0JYnl0ZSBmaXJzdF90cmFjazsKLQlieXRlIGxhc3RfdHJhY2s7CisJdTggZmlyc3RfdHJhY2s7CisJdTggbGFzdF90cmFjazsKIH07CiAKIHN0cnVjdCBhdGFwaV90b2NfZW50cnkgewotCWJ5dGUgcmVzZXJ2ZWQxOworCXU4IHJlc2VydmVkMTsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLQlfX3U4IGFkciAgICAgOiA0OwotCV9fdTggY29udHJvbCA6IDQ7CisJdTggYWRyICAgICA6IDQ7CisJdTggY29udHJvbCA6IDQ7CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKLQlfX3U4IGNvbnRyb2wgOiA0OwotCV9fdTggYWRyICAgICA6IDQ7CisJdTggY29udHJvbCA6IDQ7CisJdTggYWRyICAgICA6IDQ7CiAjZWxzZQogI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgogI2VuZGlmCi0JYnl0ZSB0cmFjazsKLQlieXRlIHJlc2VydmVkMjsKKwl1OCB0cmFjazsKKwl1OCByZXNlcnZlZDI7CiAJdW5pb24gewogCQl1bnNpZ25lZCBsYmE7CiAJCXN0cnVjdCBhdGFwaV9tc2YgbXNmOwpAQCAtNzcsMTAgKzc3LDEwIEBACiAKIC8qIEV4dHJhIHBlci1kZXZpY2UgaW5mbyBmb3IgY2Ryb20gZHJpdmVzLiAqLwogc3RydWN0IGNkcm9tX2luZm8gewotCWlkZV9kcml2ZV90CSpkcml2ZTsKLQlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKLQlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKLQlzdHJ1Y3Qga3JlZglrcmVmOworCWlkZV9kcml2ZV90CQkqZHJpdmU7CisJc3RydWN0IGlkZV9kcml2ZXIJKmRyaXZlcjsKKwlzdHJ1Y3QgZ2VuZGlzawkJKmRpc2s7CisJc3RydWN0IGtyZWYJCWtyZWY7CiAKIAkvKiBCdWZmZXIgZm9yIHRhYmxlIG9mIGNvbnRlbnRzLiAgTlVMTCBpZiB3ZSBoYXZlbid0IGFsbG9jYXRlZAogCSAgIGEgVE9DIGJ1ZmZlciBmb3IgdGhpcyBkZXZpY2UgeWV0LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKaW5kZXggZWI5ZmFjNC4uNDA4OGE2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCkBAIC04OSw3ICs4OSw3IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IF9faWRlX2RvX3J3X2Rpc2soaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkJCXNlY3Rvcl90IGJsb2NrKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJdTE2IG5zZWN0b3JzCQk9ICh1MTYpcnEtPm5yX3NlY3RvcnM7CiAJdTggbGJhNDgJCT0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCk7CiAJdTggZG1hCQkJPSAhIShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1VTSU5HX0RNQSk7CkBAIC0xODcsNyArMTg3LDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX2RvX3J3X2Rpc2soaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkJICAgICAgc2VjdG9yX3QgYmxvY2spCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAogCUJVR19PTihkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0JMT0NLRUQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jIGIvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYwppbmRleCBmNmQyZDQ0Li4xMjNkMzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMKQEAgLTUwLDYgKzUwLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3U4IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUzsKKworCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCisJCXJldHVybiByZWFkYigodm9pZCBfX2lvbWVtICopYWRkcik7CisJZWxzZQorCQlyZXR1cm4gaW5iKGFkZHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMpOworCitzdGF0aWMgdm9pZCBpZGVfZG1hX3NmZl93cml0ZV9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZiwgdTggdmFsKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVM7CisKKwlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKQorCQl3cml0ZWIodmFsLCAodm9pZCBfX2lvbWVtICopYWRkcik7CisJZWxzZQorCQlvdXRiKHZhbCwgYWRkcik7Cit9CisKIC8qKgogICoJaWRlX2RtYV9ob3N0X3NldAktCUVuYWJsZS9kaXNhYmxlIERNQSBvbiBhIGhvc3QKICAqCUBkcml2ZTogZHJpdmUgdG8gY29udHJvbApAQCAtNjIsMTggKzgzLDE0IEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOwotCXU4IGRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCXU4IGRtYV9zdGF0ID0gaHdpZi0+ZG1hX29wcy0+ZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAogCWlmIChvbikKIAkJZG1hX3N0YXQgfD0gKDEgPDwgKDUgKyB1bml0KSk7CiAJZWxzZQogCQlkbWFfc3RhdCAmPSB+KDEgPDwgKDUgKyB1bml0KSk7CiAKLQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKQotCQl3cml0ZWIoZG1hX3N0YXQsCi0JCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpKTsKLQllbHNlCi0JCW91dGIoZG1hX3N0YXQsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOworCWlkZV9kbWFfc2ZmX3dyaXRlX3N0YXR1cyhod2lmLCBkbWFfc3RhdCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfZG1hX2hvc3Rfc2V0KTsKIApAQCAtMTc1LDcgKzE5Miw3IEBACiBpbnQgaWRlX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXVuc2lnbmVkIGludCByZWFkaW5nID0gcnFfZGF0YV9kaXIocnEpID8gMCA6IEFUQV9ETUFfV1I7CiAJdTggbW1pbyA9IChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pID8gMSA6IDA7CiAJdTggZG1hX3N0YXQ7CkBAIC0xODcsNyArMjA0LDcgQEAKIAl9CiAKIAkvKiBQUkQgdGFibGUgKi8KLQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKQorCWlmIChtbWlvKQogCQl3cml0ZWwoaHdpZi0+ZG1hdGFibGVfZG1hLAogCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfVEFCTEVfT0ZTKSk7CiAJZWxzZQpAQCAtMjAwLDE1ICsyMTcsMTAgQEAKIAkJb3V0YihyZWFkaW5nLCBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKTsKIAogCS8qIHJlYWQgRE1BIHN0YXR1cyBmb3IgSU5UUiAmIEVSUk9SIGZsYWdzICovCi0JZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJLyogY2xlYXIgSU5UUiAmIEVSUk9SIGZsYWdzICovCi0JaWYgKG1taW8pCi0JCXdyaXRlYihkbWFfc3RhdCB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSLAotCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKSk7Ci0JZWxzZQotCQlvdXRiKGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIsCi0JCSAgICAgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CisJaWRlX2RtYV9zZmZfd3JpdGVfc3RhdHVzKGh3aWYsIGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIpOwogCiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDE7CiAJcmV0dXJuIDA7CkBAIC0yMzIsNyArMjQ0LDcgQEAKIHN0YXRpYyBpbnQgZG1hX3RpbWVyX2V4cGlyeShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXU4IGRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCXU4IGRtYV9zdGF0ID0gaHdpZi0+ZG1hX29wcy0+ZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAogCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlczogRE1BIHN0YXR1cyAoMHglMDJ4KVxuIiwKIAkJZHJpdmUtPm5hbWUsIF9fZnVuY19fLCBkbWFfc3RhdCk7CkBAIC0yNDAsNyArMjUyLDcgQEAKIAlpZiAoKGRtYV9zdGF0ICYgMHgxOCkgPT0gMHgxOCkJLyogQlVTWSBTdHVwaWQgRWFybHkgVGltZXIgISEgKi8KIAkJcmV0dXJuIFdBSVRfQ01EOwogCi0JaHdpZi0+aHdncm91cC0+ZXhwaXJ5ID0gTlVMTDsJLyogb25lIGZyZWUgcmlkZSBmb3Igbm93ICovCisJaHdpZi0+ZXhwaXJ5ID0gTlVMTDsJLyogb25lIGZyZWUgcmlkZSBmb3Igbm93ICovCiAKIAlpZiAoZG1hX3N0YXQgJiBBVEFfRE1BX0VSUikJLyogRVJST1IgKi8KIAkJcmV0dXJuIC0xOwpAQCAtMjg5LDEzICszMDEsMTIgQEAKIGludCBpZGVfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXU4IG1taW8gPSAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKSA/IDEgOiAwOwogCXU4IGRtYV9zdGF0ID0gMCwgZG1hX2NtZCA9IDAsIG1hc2s7CiAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKIAogCS8qIHN0b3AgRE1BICovCi0JaWYgKG1taW8pIHsKKwlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKSB7CiAJCWRtYV9jbWQgPSByZWFkYigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpKTsKIAkJd3JpdGViKGRtYV9jbWQgJiB+QVRBX0RNQV9TVEFSVCwKIAkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCkpOwpAQCAtMzA1LDE1ICszMTYsMTAgQEAKIAl9CiAKIAkvKiBnZXQgRE1BIHN0YXR1cyAqLwotCWRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCWRtYV9zdGF0ID0gaHdpZi0+ZG1hX29wcy0+ZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAotCWlmIChtbWlvKQotCQkvKiBjbGVhciB0aGUgSU5UUiAmIEVSUk9SIGJpdHMgKi8KLQkJd3JpdGViKGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIsCi0JCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpKTsKLQllbHNlCi0JCW91dGIoZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUiwKLQkJICAgICBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKKwkvKiBjbGVhciBJTlRSICYgRVJST1IgYml0cyAqLworCWlkZV9kbWFfc2ZmX3dyaXRlX3N0YXR1cyhod2lmLCBkbWFfc3RhdCB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSKTsKIAogCS8qIHB1cmdlIERNQSBtYXBwaW5ncyAqLwogCWlkZV9kZXN0cm95X2RtYXRhYmxlKGRyaXZlKTsKQEAgLTMzMSw3ICszMzcsNyBAQAogaW50IGlkZV9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQl1OCBkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwl1OCBkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAlyZXR1cm4gKGRtYV9zdGF0ICYgQVRBX0RNQV9JTlRSKSA/IDEgOiAwOwogfQpAQCAtMzQ2LDUgKzM1Miw2IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoc2ZmX2RtYV9vcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRtYS5jIGIvZHJpdmVycy9pZGUvaWRlLWRtYS5jCmluZGV4IGZmZmQxMTcuLjcyZWJhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kbWEuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKQEAgLTk2LDcgKzk2LDcgQEAKIAogCWlmIChPS19TVEFUKHN0YXQsIERSSVZFX1JFQURZLCBkcml2ZS0+YmFkX3dzdGF0IHwgQVRBX0RSUSkpIHsKIAkJaWYgKCFkbWFfc3RhdCkgewotCQkJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAogCQkJdGFza19lbmRfcmVxdWVzdChkcml2ZSwgcnEsIHN0YXQpOwogCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCmluZGV4IDBhNDhlMmQuLjNlYWIxYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKQEAgLTcxLDcgKzcxLDcgQEAKIHN0YXRpYyBpbnQgaWRlX2Zsb3BweV9lbmRfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSwgaW50IG5zZWNzKQogewogCXN0cnVjdCBpZGVfZGlza19vYmogKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCWludCBlcnJvcjsKIAogCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlc1xuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWdkLmMgYi9kcml2ZXJzL2lkZS9pZGUtZ2QuYwppbmRleCBiODA3OGIzLi43ODU3YjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZ2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZ2QuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJcmV0dXJuIGRyaXZlLT5kaXNrX29wcy0+ZW5kX3JlcXVlc3QoZHJpdmUsIHVwdG9kYXRlLCBucnNlY3MpOwogfQogCi1zdGF0aWMgaWRlX2RyaXZlcl90IGlkZV9nZF9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGlkZV9kcml2ZXIgaWRlX2dkX2RyaXZlciA9IHsKIAkuZ2VuX2RyaXZlciA9IHsKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLWdkIiwKQEAgLTE2Miw3ICsxNjIsNiBAQAogCS52ZXJzaW9uCQk9IElERV9HRF9WRVJTSU9OLAogCS5kb19yZXF1ZXN0CQk9IGlkZV9nZF9kb19yZXF1ZXN0LAogCS5lbmRfcmVxdWVzdAkJPSBpZGVfZ2RfZW5kX3JlcXVlc3QsCi0JLmVycm9yCQkJPSBfX2lkZV9lcnJvciwKICNpZmRlZiBDT05GSUdfSURFX1BST0NfRlMKIAkucHJvY19lbnRyaWVzCQk9IGlkZV9kaXNrX3Byb2NfZW50cmllcywKIAkucHJvY19kZXZzZXRzCQk9IGlkZV9kaXNrX3Byb2NfZGV2c2V0cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1nZC5oIGIvZHJpdmVycy9pZGUvaWRlLWdkLmgKaW5kZXggN2QzZDEwMS4uYTg2Nzc5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWdkLmgKKysrIGIvZHJpdmVycy9pZGUvaWRlLWdkLmgKQEAgLTE0LDExICsxNCwxMSBAQAogI2VuZGlmCiAKIHN0cnVjdCBpZGVfZGlza19vYmogewotCWlkZV9kcml2ZV90CSpkcml2ZTsKLQlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKLQlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKLQlzdHJ1Y3Qga3JlZglrcmVmOwotCXVuc2lnbmVkIGludAlvcGVuZXJzOwkvKiBwcm90ZWN0ZWQgYnkgQktMIGZvciBub3cgKi8KKwlpZGVfZHJpdmVfdAkJKmRyaXZlOworCXN0cnVjdCBpZGVfZHJpdmVyCSpkcml2ZXI7CisJc3RydWN0IGdlbmRpc2sJCSpkaXNrOworCXN0cnVjdCBrcmVmCQlrcmVmOworCXVuc2lnbmVkIGludAkJb3BlbmVyczsJLyogcHJvdGVjdGVkIGJ5IEJLTCBmb3Igbm93ICovCiAKIAkvKiBMYXN0IGZhaWxlZCBwYWNrZXQgY29tbWFuZCAqLwogCXN0cnVjdCBpZGVfYXRhcGlfcGMgKmZhaWxlZF9wYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1oODMwMC5jIGIvZHJpdmVycy9pZGUvaWRlLWg4MzAwLmMKaW5kZXggZTJjZGQyZS4uOTI3MGQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWg4MzAwLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWg4MzAwLmMKQEAgLTE1OSw3ICsxNTksNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW8uYyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCmluZGV4IDFjMzZhOGUuLmNjMTYzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pby5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCkBAIC04OCw3ICs4OCw3IEBACiAJCXJldCA9IDA7CiAKIAlpZiAocmV0ID09IDAgJiYgZGVxdWV1ZSkKLQkJZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxID0gTlVMTDsKKwkJZHJpdmUtPmh3aWYtPnJxID0gTlVMTDsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMDcsNyArMTA3LDcgQEAKIGludCBpZGVfZW5kX3JlcXVlc3QgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnJfc2VjdG9ycykKIHsKIAl1bnNpZ25lZCBpbnQgbnJfYnl0ZXMgPSBucl9zZWN0b3JzIDw8IDk7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAogCWlmICghbnJfYnl0ZXMpIHsKIAkJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkKQEAgLTE2MCw4ICsxNjAsOCBAQAogIAogdm9pZCBpZGVfZW5kX2RyaXZlX2NtZCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBzdGF0LCB1OCBlcnIpCiB7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3Z3JvdXAtPnJxOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAogCWlmIChycS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfQVRBX1RBU0tGSUxFKSB7CiAJCWlkZV90YXNrX3QgKnRhc2sgPSAoaWRlX3Rhc2tfdCAqKXJxLT5zcGVjaWFsOwpAQCAtMTg2LDcgKzE4Niw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlod2dyb3VwLT5ycSA9IE5VTEw7CisJaHdpZi0+cnEgPSBOVUxMOwogCiAJcnEtPmVycm9ycyA9IGVycjsKIApAQCAtMTk5LDkgKzE5OSw5IEBACiBzdGF0aWMgdm9pZCBpZGVfa2lsbF9ycShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlpZiAocnEtPnJxX2Rpc2spIHsKLQkJaWRlX2RyaXZlcl90ICpkcnY7CisJCXN0cnVjdCBpZGVfZHJpdmVyICpkcnY7CiAKLQkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwkJZHJ2ID0gKihzdHJ1Y3QgaWRlX2RyaXZlciAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwogCQlkcnYtPmVuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsKIAl9IGVsc2UKIAkJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsKQEAgLTI5MSw3ICsyOTEsNyBAQAogCXJldHVybiBpZGVfc3RvcHBlZDsKIH0KIAotaWRlX3N0YXJ0c3RvcF90CitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90CiBfX2lkZV9lcnJvcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgdTggc3RhdCwgdTggZXJyKQogewogCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCkBAIC0yOTksOCArMjk5LDYgQEAKIAlyZXR1cm4gaWRlX2F0YXBpX2Vycm9yKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoX19pZGVfZXJyb3IpOwotCiAvKioKICAqCWlkZV9lcnJvcgktCWhhbmRsZSBhbiBlcnJvciBvbiB0aGUgSURFCiAgKglAZHJpdmU6IGRyaXZlIHRoZSBlcnJvciBvY2N1cnJlZCBvbgpAQCAtMzIxLDcgKzMxOSw4IEBACiAKIAllcnIgPSBpZGVfZHVtcF9zdGF0dXMoZHJpdmUsIG1zZywgc3RhdCk7CiAKLQlpZiAoKHJxID0gSFdHUk9VUChkcml2ZSktPnJxKSA9PSBOVUxMKQorCXJxID0gZHJpdmUtPmh3aWYtPnJxOworCWlmIChycSA9PSBOVUxMKQogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAKIAkvKiByZXRyeSBvbmx5ICJub3JtYWwiIEkvTzogKi8KQEAgLTMzMSwxNSArMzMwLDggQEAKIAkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCX0KIAotCWlmIChycS0+cnFfZGlzaykgewotCQlpZGVfZHJpdmVyX3QgKmRydjsKLQotCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwotCQlyZXR1cm4gZHJ2LT5lcnJvcihkcml2ZSwgcnEsIHN0YXQsIGVycik7Ci0JfSBlbHNlCi0JCXJldHVybiBfX2lkZV9lcnJvcihkcml2ZSwgcnEsIHN0YXQsIGVycik7CisJcmV0dXJuIF9faWRlX2Vycm9yKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2Vycm9yKTsKIAogc3RhdGljIHZvaWQgaWRlX3RmX3NldF9zcGVjaWZ5X2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmKQpAQCAtNDYyLDcgKzQ1NCw3IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGV4ZWN1dGVfZHJpdmVfY21kIChpZGVfZHJpdmVfdCAqZHJpdmUsCiAJCXN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWlkZV90YXNrX3QgKnRhc2sgPSBycS0+c3BlY2lhbDsKIAogCWlmICh0YXNrKSB7CkBAIC01ODYsNyArNTc4LDcgQEAKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogc3RhcnRfcmVxdWVzdDogY3VycmVudD0weCUwOGx4XG4iLAotCQlIV0lGKGRyaXZlKS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHJxKTsKKwkJZHJpdmUtPmh3aWYtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBycSk7CiAjZW5kaWYKIAogCS8qIGJhaWwgZWFybHkgaWYgd2UndmUgZXhjZWVkZWQgbWF4X2ZhaWx1cmVzICovCkBAIC02MDUsNyArNTk3LDcgQEAKIAkJcmV0dXJuIHN0YXJ0c3RvcDsKIAl9CiAJaWYgKCFkcml2ZS0+c3BlY2lhbC5hbGwpIHsKLQkJaWRlX2RyaXZlcl90ICpkcnY7CisJCXN0cnVjdCBpZGVfZHJpdmVyICpkcnY7CiAKIAkJLyoKIAkJICogV2UgcmVzZXQgdGhlIGRyaXZlIHNvIHdlIG5lZWQgdG8gaXNzdWUgYSBTRVRGRUFUVVJFUy4KQEAgLTYzOCw3ICs2MzAsNyBAQAogCQkJICovCiAJCQlyZXR1cm4gaWRlX3NwZWNpYWxfcnEoZHJpdmUsIHJxKTsKIAotCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlkcnYgPSAqKHN0cnVjdCBpZGVfZHJpdmVyICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAKIAkJcmV0dXJuIGRydi0+ZG9fcmVxdWVzdChkcml2ZSwgcnEsIHJxLT5zZWN0b3IpOwogCX0KQEAgLTY1NCw3ICs2NDYsNyBAQAogICoJQHRpbWVvdXQ6IHRpbWUgdG8gc3RhbGwgZm9yIChqaWZmaWVzKQogICoKICAqCWlkZV9zdGFsbF9xdWV1ZSgpIGNhbiBiZSB1c2VkIGJ5IGEgZHJpdmUgdG8gZ2l2ZSBleGNlc3MgYmFuZHdpZHRoIGJhY2sKLSAqCXRvIHRoZSBod2dyb3VwIGJ5IHNsZWVwaW5nIGZvciB0aW1lb3V0IGppZmZpZXMuCisgKgl0byB0aGUgcG9ydCBieSBzbGVlcGluZyBmb3IgdGltZW91dCBqaWZmaWVzLgogICovCiAgCiB2b2lkIGlkZV9zdGFsbF9xdWV1ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCkBAIC02NjYsNDUgKzY1OCw1MyBAQAogfQogRVhQT1JUX1NZTUJPTChpZGVfc3RhbGxfcXVldWUpOwogCitzdGF0aWMgaW5saW5lIGludCBpZGVfbG9ja19wb3J0KGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWYgKGh3aWYtPmJ1c3kpCisJCXJldHVybiAxOworCisJaHdpZi0+YnVzeSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlkZV91bmxvY2tfcG9ydChpZGVfaHdpZl90ICpod2lmKQoreworCWh3aWYtPmJ1c3kgPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZGVfbG9ja19ob3N0KHN0cnVjdCBpZGVfaG9zdCAqaG9zdCwgaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKGhvc3QtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB7CisJCXJjID0gdGVzdF9hbmRfc2V0X2JpdF9sb2NrKElERV9IT1NUX0JVU1ksICZob3N0LT5ob3N0X2J1c3kpOworCQlpZiAocmMgPT0gMCkgeworCQkJLyogZm9yIGF0YXJpIG9ubHkgKi8KKwkJCWlkZV9nZXRfbG9jayhpZGVfaW50ciwgaHdpZik7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3VubG9ja19ob3N0KHN0cnVjdCBpZGVfaG9zdCAqaG9zdCkKK3sKKwlpZiAoaG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpIHsKKwkJLyogZm9yIGF0YXJpIG9ubHkgKi8KKwkJaWRlX3JlbGVhc2VfbG9jaygpOworCQljbGVhcl9iaXRfdW5sb2NrKElERV9IT1NUX0JVU1ksICZob3N0LT5ob3N0X2J1c3kpOworCX0KK30KKwogLyoKLSAqIElzc3VlIGEgbmV3IHJlcXVlc3QgdG8gYSBkcml2ZSBmcm9tIGh3Z3JvdXAKLSAqCi0gKiBBIGh3Z3JvdXAgaXMgYSBzZXJpYWxpemVkIGdyb3VwIG9mIElERSBpbnRlcmZhY2VzLiAgVXN1YWxseSB0aGVyZSBpcwotICogZXhhY3RseSBvbmUgaHdpZiAoaW50ZXJmYWNlKSBwZXIgaHdncm91cCwgYnV0IGJ1Z2d5IGNvbnRyb2xsZXJzIChlZy4gQ01ENjQwKQotICogbWF5IGhhdmUgYm90aCBpbnRlcmZhY2VzIGluIGEgc2luZ2xlIGh3Z3JvdXAgdG8gInNlcmlhbGl6ZSIgYWNjZXNzLgotICogT3IgcG9zc2libHkgbXVsdGlwbGUgSVNBIGludGVyZmFjZXMgY2FuIHNoYXJlIGEgY29tbW9uIElSUSBieSBiZWluZyBncm91cGVkCi0gKiB0b2dldGhlciBpbnRvIG9uZSBod2dyb3VwIGZvciBzZXJpYWxpemVkIGFjY2Vzcy4KLSAqCi0gKiBOb3RlIGFsc28gdGhhdCBzZXZlcmFsIGh3Z3JvdXBzIGNhbiBlbmQgdXAgc2hhcmluZyBhIHNpbmdsZSBJUlEsCi0gKiBwb3NzaWJseSBhbG9uZyB3aXRoIG1hbnkgb3RoZXIgZGV2aWNlcy4gIFRoaXMgaXMgZXNwZWNpYWxseSBjb21tb24gaW4KLSAqIFBDSS1iYXNlZCBzeXN0ZW1zIHdpdGggb2ZmLWJvYXJkIElERSBjb250cm9sbGVyIGNhcmRzLgotICoKLSAqIFRoZSBJREUgZHJpdmVyIHVzZXMgYSBwZXItaHdncm91cCBsb2NrIHRvIHByb3RlY3QgdGhlIGh3Z3JvdXAtPmJ1c3kgZmxhZy4KLSAqCi0gKiBUaGUgZmlyc3QgdGhyZWFkIGludG8gdGhlIGRyaXZlciBmb3IgYSBwYXJ0aWN1bGFyIGh3Z3JvdXAgc2V0cyB0aGUKLSAqIGh3Z3JvdXAtPmJ1c3kgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaHdncm91cCBpcyBub3cgYWN0aXZlLAotICogYW5kIHRoZW4gaW5pdGlhdGVzIHByb2Nlc3Npbmcgb2YgdGhlIHRvcCByZXF1ZXN0IGZyb20gdGhlIHJlcXVlc3QgcXVldWUuCi0gKgotICogT3RoZXIgdGhyZWFkcyBhdHRlbXB0aW5nIGVudHJ5IG5vdGljZSB0aGUgYnVzeSBzZXR0aW5nLCBhbmQgd2lsbCBzaW1wbHkKLSAqIHF1ZXVlIHRoZWlyIG5ldyByZXF1ZXN0cyBhbmQgZXhpdCBpbW1lZGlhdGVseS4gIE5vdGUgdGhhdCBod2dyb3VwLT5idXN5Ci0gKiByZW1haW5zIHNldCBldmVuIHdoZW4gdGhlIGRyaXZlciBpcyBtZXJlbHkgYXdhaXRpbmcgdGhlIG5leHQgaW50ZXJydXB0LgotICogVGh1cywgdGhlIG1lYW5pbmcgaXMgInRoaXMgaHdncm91cCBpcyBidXN5IHByb2Nlc3NpbmcgYSByZXF1ZXN0Ii4KLSAqCi0gKiBXaGVuIHByb2Nlc3Npbmcgb2YgYSByZXF1ZXN0IGNvbXBsZXRlcywgdGhlIGNvbXBsZXRpbmcgdGhyZWFkIG9yIElSUS1oYW5kbGVyCi0gKiB3aWxsIHN0YXJ0IHRoZSBuZXh0IHJlcXVlc3QgZnJvbSB0aGUgcXVldWUuICBJZiBubyBtb3JlIHdvcmsgcmVtYWlucywKLSAqIHRoZSBkcml2ZXIgd2lsbCBjbGVhciB0aGUgaHdncm91cC0+YnVzeSBmbGFnIGFuZCBleGl0LgotICoKLSAqIFRoZSBwZXItaHdncm91cCBzcGlubG9jayBpcyB1c2VkIHRvIHByb3RlY3QgYWxsIGFjY2VzcyB0byB0aGUKLSAqIGh3Z3JvdXAtPmJ1c3kgZmxhZywgYnV0IGlzIG90aGVyd2lzZSBub3QgbmVlZGVkIGZvciBtb3N0IHByb2Nlc3NpbmcgaW4KLSAqIHRoZSBkcml2ZXIuICBUaGlzIG1ha2VzIHRoZSBkcml2ZXIgbXVjaCBtb3JlIGZyaWVuZGxpZXIgdG8gc2hhcmVkIElSUXMKLSAqIHRoYW4gcHJldmlvdXMgZGVzaWducywgd2hpbGUgcmVtYWluaW5nIDEwMCUgKD8pIFNNUCBzYWZlIGFuZCBjYXBhYmxlLgorICogSXNzdWUgYSBuZXcgcmVxdWVzdCB0byBhIGRldmljZS4KICAqLwogdm9pZCBkb19pZGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlpZGVfZHJpdmVfdAkqZHJpdmUgPSBxLT5xdWV1ZWRhdGE7CiAJaWRlX2h3aWZfdAkqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QJKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwotCXN0cnVjdCByZXF1ZXN0CSpycTsKKwlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QgPSBod2lmLT5ob3N0OworCXN0cnVjdCByZXF1ZXN0CSpycSA9IE5VTEw7CiAJaWRlX3N0YXJ0c3RvcF90CXN0YXJ0c3RvcDsKIAogCS8qCkBAIC03MjEsMzIgKzcyMSw0MCBAQAogCQlibGtfcmVtb3ZlX3BsdWcocSk7CiAKIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAKLQlpZiAoIWlkZV9sb2NrX2h3Z3JvdXAoaHdncm91cCkpIHsKKwlpZiAoaWRlX2xvY2tfaG9zdChob3N0LCBod2lmKSkKKwkJZ290byBwbHVnX2RldmljZV8yOworCisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CisKKwlpZiAoIWlkZV9sb2NrX3BvcnQoaHdpZikpIHsKKwkJaWRlX2h3aWZfdCAqcHJldl9wb3J0OwogcmVwZWF0OgotCQlod2dyb3VwLT5ycSA9IE5VTEw7CisJCXByZXZfcG9ydCA9IGh3aWYtPmhvc3QtPmN1cl9wb3J0OworCQlod2lmLT5ycSA9IE5VTEw7CiAKIAkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfU0xFRVBJTkcpIHsKIAkJCWlmICh0aW1lX2JlZm9yZShkcml2ZS0+c2xlZXAsIGppZmZpZXMpKSB7Ci0JCQkJaWRlX3VubG9ja19od2dyb3VwKGh3Z3JvdXApOworCQkJCWlkZV91bmxvY2tfcG9ydChod2lmKTsKIAkJCQlnb3RvIHBsdWdfZGV2aWNlOwogCQkJfQogCQl9CiAKLQkJaWYgKGh3aWYgIT0gaHdncm91cC0+aHdpZikgeworCQlpZiAoKGh3aWYtPmhvc3QtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSAmJgorCQkgICAgaHdpZiAhPSBwcmV2X3BvcnQpIHsKIAkJCS8qCi0JCQkgKiBzZXQgbklFTiBmb3IgcHJldmlvdXMgaHdpZiwgZHJpdmVzIGluIHRoZQorCQkJICogc2V0IG5JRU4gZm9yIHByZXZpb3VzIHBvcnQsIGRyaXZlcyBpbiB0aGUKIAkJCSAqIHF1aXJrX2xpc3QgbWF5IG5vdCBsaWtlIGludHIgc2V0dXBzL2NsZWFudXBzCiAJCQkgKi8KLQkJCWlmIChkcml2ZS0+cXVpcmtfbGlzdCA9PSAwKQotCQkJCWh3aWYtPnRwX29wcy0+c2V0X2lycShod2lmLCAwKTsKKwkJCWlmIChwcmV2X3BvcnQgJiYgcHJldl9wb3J0LT5jdXJfZGV2LT5xdWlya19saXN0ID09IDApCisJCQkJcHJldl9wb3J0LT50cF9vcHMtPnNldF9pcnEocHJldl9wb3J0LCAwKTsKKworCQkJaHdpZi0+aG9zdC0+Y3VyX3BvcnQgPSBod2lmOwogCQl9Ci0JCWh3Z3JvdXAtPmh3aWYgPSBod2lmOwotCQlod2dyb3VwLT5kcml2ZSA9IGRyaXZlOworCQlod2lmLT5jdXJfZGV2ID0gZHJpdmU7CiAJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfihJREVfREZMQUdfU0xFRVBJTkcgfCBJREVfREZMQUdfUEFSS0VEKTsKIAotCQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCQlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCQkvKgogCQkgKiB3ZSBrbm93IHRoYXQgdGhlIHF1ZXVlIGlzbid0IGVtcHR5LCBidXQgdGhpcyBjYW4gaGFwcGVuCkBAIC03NTQsMTAgKzc2MiwxMCBAQAogCQkgKi8KIAkJcnEgPSBlbHZfbmV4dF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSk7CiAJCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQkJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCiAJCWlmICghcnEpIHsKLQkJCWlkZV91bmxvY2tfaHdncm91cChod2dyb3VwKTsKKwkJCWlkZV91bmxvY2tfcG9ydChod2lmKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTc3OCwyNyArNzg2LDMxIEBACiAJCSAgICBibGtfcG1fcmVxdWVzdChycSkgPT0gMCAmJgogCQkgICAgKHJxLT5jbWRfZmxhZ3MgJiBSRVFfUFJFRU1QVCkgPT0gMCkgewogCQkJLyogdGhlcmUgc2hvdWxkIGJlIG5vIHBlbmRpbmcgY29tbWFuZCBhdCB0aGlzIHBvaW50ICovCi0JCQlpZGVfdW5sb2NrX2h3Z3JvdXAoaHdncm91cCk7CisJCQlpZGVfdW5sb2NrX3BvcnQoaHdpZik7CiAJCQlnb3RvIHBsdWdfZGV2aWNlOwogCQl9CiAKLQkJaHdncm91cC0+cnEgPSBycTsKKwkJaHdpZi0+cnEgPSBycTsKIAotCQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCQlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCQlzdGFydHN0b3AgPSBzdGFydF9yZXF1ZXN0KGRyaXZlLCBycSk7Ci0JCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCQlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAogCQlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkKQogCQkJZ290byByZXBlYXQ7CiAJfSBlbHNlCiAJCWdvdG8gcGx1Z19kZXZpY2U7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOworCWlmIChycSA9PSBOVUxMKQorCQlpZGVfdW5sb2NrX2hvc3QoaG9zdCk7CiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAlyZXR1cm47CiAKIHBsdWdfZGV2aWNlOgotCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKKwlpZGVfdW5sb2NrX2hvc3QoaG9zdCk7CitwbHVnX2RldmljZV8yOgogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKIAlpZiAoIWVsdl9xdWV1ZV9lbXB0eShxKSkKQEAgLTgwNiwxMyArODE4LDEzIEBACiB9CiAKIC8qCi0gKiB1bi1idXN5IHRoZSBod2dyb3VwIGV0YywgYW5kIGNsZWFyIGFueSBwZW5kaW5nIERNQSBzdGF0dXMuIHdlIHdhbnQgdG8KKyAqIHVuLWJ1c3kgdGhlIHBvcnQgZXRjLCBhbmQgY2xlYXIgYW55IHBlbmRpbmcgRE1BIHN0YXR1cy4gd2Ugd2FudCB0bwogICogcmV0cnkgdGhlIGN1cnJlbnQgcmVxdWVzdCBpbiBwaW8gbW9kZSBpbnN0ZWFkIG9mIHJpc2tpbmcgdG9zc2luZyBpdAogICogYWxsIGF3YXkKICAqLwogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVfZG1hX3RpbWVvdXRfcmV0cnkoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZXJyb3IpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJaWRlX3N0YXJ0c3RvcF90IHJldCA9IGlkZV9zdG9wcGVkOwogCkBAIC04NDAsMTUgKzg1MiwxNCBAQAogCWlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOwogCiAJLyoKLQkgKiB1bi1idXN5IGRyaXZlIGV0YyAoaHdncm91cC0+YnVzeSBpcyBjbGVhcmVkIG9uIHJldHVybikgYW5kCi0JICogbWFrZSBzdXJlIHJlcXVlc3QgaXMgc2FuZQorCSAqIHVuLWJ1c3kgZHJpdmUgZXRjIGFuZCBtYWtlIHN1cmUgcmVxdWVzdCBpcyBzYW5lCiAJICovCi0JcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CiAKKwlycSA9IGh3aWYtPnJxOwogCWlmICghcnEpCiAJCWdvdG8gb3V0OwogCi0JSFdHUk9VUChkcml2ZSktPnJxID0gTlVMTDsKKwlod2lmLT5ycSA9IE5VTEw7CiAKIAlycS0+ZXJyb3JzID0gMDsKIApAQCAtODc2LDcgKzg4Nyw3IEBACiAKIC8qKgogICoJaWRlX3RpbWVyX2V4cGlyeQktCWhhbmRsZSBsYWNrIG9mIGFuIElERSBpbnRlcnJ1cHQKLSAqCUBkYXRhOiB0aW1lciBjYWxsYmFjayBtYWdpYyAoaHdncm91cCkKKyAqCUBkYXRhOiB0aW1lciBjYWxsYmFjayBtYWdpYyAoaHdpZikKICAqCiAgKglBbiBJREUgY29tbWFuZCBoYXMgdGltZWQgb3V0IGJlZm9yZSB0aGUgZXhwZWN0ZWQgZHJpdmUgcmV0dXJuCiAgKglvY2N1cnJlZC4gQXQgdGhpcyBwb2ludCB3ZSBhdHRlbXB0IHRvIGNsZWFuIHVwIHRoZSBjdXJyZW50CkBAIC04OTAsMTggKzkwMSwxOCBAQAogIAogdm9pZCBpZGVfdGltZXJfZXhwaXJ5ICh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaWRlX2h3Z3JvdXBfdAkqaHdncm91cCA9IChpZGVfaHdncm91cF90ICopIGRhdGE7CisJaWRlX2h3aWZfdAkqaHdpZiA9IChpZGVfaHdpZl90ICopZGF0YTsKIAlpZGVfZHJpdmVfdAkqdW5pbml0aWFsaXplZF92YXIoZHJpdmUpOwogCWlkZV9oYW5kbGVyX3QJKmhhbmRsZXI7Ci0JaWRlX2V4cGlyeV90CSpleHBpcnk7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAl1bnNpZ25lZCBsb25nCXdhaXQgPSAtMTsKIAlpbnQJCXBsdWdfZGV2aWNlID0gMDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAotCWlmICgoKGhhbmRsZXIgPSBod2dyb3VwLT5oYW5kbGVyKSA9PSBOVUxMKSB8fAotCSAgICAoaHdncm91cC0+cmVxX2dlbiAhPSBod2dyb3VwLT5yZXFfZ2VuX3RpbWVyKSkgeworCWhhbmRsZXIgPSBod2lmLT5oYW5kbGVyOworCisJaWYgKGhhbmRsZXIgPT0gTlVMTCB8fCBod2lmLT5yZXFfZ2VuICE9IGh3aWYtPnJlcV9nZW5fdGltZXIpIHsKIAkJLyoKIAkJICogRWl0aGVyIGEgbWFyZ2luYWwgdGltZW91dCBvY2N1cnJlZAogCQkgKiAoZ290IHRoZSBpbnRlcnJ1cHQganVzdCBhcyB0aW1lciBleHBpcmVkKSwKQEAgLTkwOSw3MiArOTIwLDY4IEBACiAJCSAqIEVpdGhlciB3YXksIHdlIGRvbid0IHJlYWxseSB3YW50IHRvIGNvbXBsYWluIGFib3V0IGFueXRoaW5nLgogCQkgKi8KIAl9IGVsc2UgewotCQlkcml2ZSA9IGh3Z3JvdXAtPmRyaXZlOwotCQlpZiAoIWRyaXZlKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImlkZV90aW1lcl9leHBpcnk6IGh3Z3JvdXAtPmRyaXZlIHdhcyBOVUxMXG4iKTsKLQkJCWh3Z3JvdXAtPmhhbmRsZXIgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJaWRlX2h3aWZfdCAqaHdpZjsKLQkJCWlkZV9zdGFydHN0b3BfdCBzdGFydHN0b3AgPSBpZGVfc3RvcHBlZDsKKwkJaWRlX2V4cGlyeV90ICpleHBpcnkgPSBod2lmLT5leHBpcnk7CisJCWlkZV9zdGFydHN0b3BfdCBzdGFydHN0b3AgPSBpZGVfc3RvcHBlZDsKIAotCQkJaWYgKChleHBpcnkgPSBod2dyb3VwLT5leHBpcnkpICE9IE5VTEwpIHsKLQkJCQkvKiBjb250aW51ZSAqLwotCQkJCWlmICgod2FpdCA9IGV4cGlyeShkcml2ZSkpID4gMCkgewotCQkJCQkvKiByZXNldCB0aW1lciAqLwotCQkJCQlod2dyb3VwLT50aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyB3YWl0OwotCQkJCQlod2dyb3VwLT5yZXFfZ2VuX3RpbWVyID0gaHdncm91cC0+cmVxX2dlbjsKLQkJCQkJYWRkX3RpbWVyKCZod2dyb3VwLT50aW1lcik7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWh3Z3JvdXAtPmhhbmRsZXIgPSBOVUxMOwotCQkJLyoKLQkJCSAqIFdlIG5lZWQgdG8gc2ltdWxhdGUgYSByZWFsIGludGVycnVwdCB3aGVuIGludm9raW5nCi0JCQkgKiB0aGUgaGFuZGxlcigpIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvCi0JCQkgKiBnbG9iYWxseSBtYXNrIHRoZSBzcGVjaWZpYyBJUlE6Ci0JCQkgKi8KLQkJCXNwaW5fdW5sb2NrKCZod2dyb3VwLT5sb2NrKTsKLQkJCWh3aWYgID0gSFdJRihkcml2ZSk7Ci0JCQkvKiBkaXNhYmxlX2lycV9ub3N5bmMgPz8gKi8KLQkJCWRpc2FibGVfaXJxKGh3aWYtPmlycSk7Ci0JCQkvKiBsb2NhbCBDUFUgb25seSwKLQkJCSAqIGFzIGlmIHdlIHdlcmUgaGFuZGxpbmcgYW4gaW50ZXJydXB0ICovCi0JCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQkJaWYgKGh3Z3JvdXAtPnBvbGxpbmcpIHsKLQkJCQlzdGFydHN0b3AgPSBoYW5kbGVyKGRyaXZlKTsKLQkJCX0gZWxzZSBpZiAoZHJpdmVfaXNfcmVhZHkoZHJpdmUpKSB7Ci0JCQkJaWYgKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpCi0JCQkJCWh3aWYtPmRtYV9vcHMtPmRtYV9sb3N0X2lycShkcml2ZSk7Ci0JCQkJKHZvaWQpaWRlX2Fja19pbnRyKGh3aWYpOwotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBsb3N0IGludGVycnVwdFxuIiwgZHJpdmUtPm5hbWUpOwotCQkJCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkgewotCQkJCQlzdGFydHN0b3AgPSBpZGVfZG1hX3RpbWVvdXRfcmV0cnkoZHJpdmUsIHdhaXQpOwotCQkJCX0gZWxzZQotCQkJCQlzdGFydHN0b3AgPQotCQkJCQlpZGVfZXJyb3IoZHJpdmUsICJpcnEgdGltZW91dCIsCi0JCQkJCQkgIGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikpOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci0JCQllbmFibGVfaXJxKGh3aWYtPmlycSk7Ci0JCQlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkKSB7Ci0JCQkJaWRlX3VubG9ja19od2dyb3VwKGh3Z3JvdXApOwotCQkJCXBsdWdfZGV2aWNlID0gMTsKKwkJZHJpdmUgPSBod2lmLT5jdXJfZGV2OworCisJCWlmIChleHBpcnkpIHsKKwkJCXdhaXQgPSBleHBpcnkoZHJpdmUpOworCQkJaWYgKHdhaXQgPiAwKSB7IC8qIGNvbnRpbnVlICovCisJCQkJLyogcmVzZXQgdGltZXIgKi8KKwkJCQlod2lmLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHdhaXQ7CisJCQkJaHdpZi0+cmVxX2dlbl90aW1lciA9IGh3aWYtPnJlcV9nZW47CisJCQkJYWRkX3RpbWVyKCZod2lmLT50aW1lcik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOworCQkJCXJldHVybjsKIAkJCX0KIAkJfQorCQlod2lmLT5oYW5kbGVyID0gTlVMTDsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBzaW11bGF0ZSBhIHJlYWwgaW50ZXJydXB0IHdoZW4gaW52b2tpbmcKKwkJICogdGhlIGhhbmRsZXIoKSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgd2UgbmVlZCB0bworCQkgKiBnbG9iYWxseSBtYXNrIHRoZSBzcGVjaWZpYyBJUlE6CisJCSAqLworCQlzcGluX3VubG9jaygmaHdpZi0+bG9jayk7CisJCS8qIGRpc2FibGVfaXJxX25vc3luYyA/PyAqLworCQlkaXNhYmxlX2lycShod2lmLT5pcnEpOworCQkvKiBsb2NhbCBDUFUgb25seSwgYXMgaWYgd2Ugd2VyZSBoYW5kbGluZyBhbiBpbnRlcnJ1cHQgKi8KKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJaWYgKGh3aWYtPnBvbGxpbmcpIHsKKwkJCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOworCQl9IGVsc2UgaWYgKGRyaXZlX2lzX3JlYWR5KGRyaXZlKSkgeworCQkJaWYgKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpCisJCQkJaHdpZi0+ZG1hX29wcy0+ZG1hX2xvc3RfaXJxKGRyaXZlKTsKKwkJCSh2b2lkKWlkZV9hY2tfaW50cihod2lmKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBsb3N0IGludGVycnVwdFxuIiwKKwkJCQlkcml2ZS0+bmFtZSk7CisJCQlzdGFydHN0b3AgPSBoYW5kbGVyKGRyaXZlKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkcml2ZS0+d2FpdGluZ19mb3JfZG1hKQorCQkJCXN0YXJ0c3RvcCA9IGlkZV9kbWFfdGltZW91dF9yZXRyeShkcml2ZSwgd2FpdCk7CisJCQllbHNlCisJCQkJc3RhcnRzdG9wID0gaWRlX2Vycm9yKGRyaXZlLCAiaXJxIHRpbWVvdXQiLAorCQkJCQlod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpKTsKKwkJfQorCQlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKKwkJZW5hYmxlX2lycShod2lmLT5pcnEpOworCQlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkKSB7CisJCQlpZGVfdW5sb2NrX3BvcnQoaHdpZik7CisJCQlwbHVnX2RldmljZSA9IDE7CisJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChwbHVnX2RldmljZSkKKwlpZiAocGx1Z19kZXZpY2UpIHsKKwkJaWRlX3VubG9ja19ob3N0KGh3aWYtPmhvc3QpOwogCQlpZGVfcGx1Z19kZXZpY2UoZHJpdmUpOworCX0KIH0KIAogLyoqCiAgKgl1bmV4cGVjdGVkX2ludHIJCS0JaGFuZGxlIGFuIHVuZXhwZWN0ZWQgSURFIGludGVycnVwdAogICoJQGlycTogaW50ZXJydXB0IGxpbmUKLSAqCUBod2dyb3VwOiBod2dyb3VwIGJlaW5nIHByb2Nlc3NlZAorICoJQGh3aWY6IHBvcnQgYmVpbmcgcHJvY2Vzc2VkCiAgKgogICoJVGhlcmUncyBub3RoaW5nIHJlYWxseSB1c2VmdWwgd2UgY2FuIGRvIHdpdGggYW4gdW5leHBlY3RlZCBpbnRlcnJ1cHQsCiAgKglvdGhlciB0aGFuIHJlYWRpbmcgdGhlIHN0YXR1cyByZWdpc3RlciAodG8gY2xlYXIgaXQpLCBhbmQgbG9nZ2luZyBpdC4KQEAgLTk5OCw1MiArMTAwNSwzOCBAQAogICoJYmVmb3JlIGNvbXBsZXRpbmcgdGhlIGlzc3VhbmNlIG9mIGFueSBuZXcgZHJpdmUgY29tbWFuZCwgc28gd2Ugd2lsbCBub3QKICAqCWJlIGFjY2lkZW50YWxseSBpbnZva2VkIGFzIGEgcmVzdWx0IG9mIGFueSB2YWxpZCBjb21tYW5kIGNvbXBsZXRpb24KICAqCWludGVycnVwdC4KLSAqCi0gKglOb3RlIHRoYXQgd2UgbXVzdCB3YWxrIHRoZSBlbnRpcmUgaHdncm91cCBoZXJlLiBXZSBrbm93IHdoaWNoIGh3aWYKLSAqCWlzIGRvaW5nIHRoZSBjdXJyZW50IGNvbW1hbmQsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGh3aWYgYnVycGVkCi0gKglteXN0ZXJpb3VzbHkuCiAgKi8KLSAKLXN0YXRpYyB2b2lkIHVuZXhwZWN0ZWRfaW50ciAoaW50IGlycSwgaWRlX2h3Z3JvdXBfdCAqaHdncm91cCkKKworc3RhdGljIHZvaWQgdW5leHBlY3RlZF9pbnRyKGludCBpcnEsIGlkZV9od2lmX3QgKmh3aWYpCiB7Ci0JdTggc3RhdDsKLQlpZGVfaHdpZl90ICpod2lmID0gaHdncm91cC0+aHdpZjsKKwl1OCBzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAotCS8qCi0JICogaGFuZGxlIHRoZSB1bmV4cGVjdGVkIGludGVycnVwdAotCSAqLwotCWRvIHsKLQkJaWYgKGh3aWYtPmlycSA9PSBpcnEpIHsKLQkJCXN0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOworCWlmICghT0tfU1RBVChzdGF0LCBBVEFfRFJEWSwgQkFEX1NUQVQpKSB7CisJCS8qIFRyeSB0byBub3QgZmxvb2QgdGhlIGNvbnNvbGUgd2l0aCBtc2dzICovCisJCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfbXNndGltZSwgY291bnQ7CisJCSsrY291bnQ7CiAKLQkJCWlmICghT0tfU1RBVChzdGF0LCBBVEFfRFJEWSwgQkFEX1NUQVQpKSB7Ci0JCQkJLyogVHJ5IHRvIG5vdCBmbG9vZCB0aGUgY29uc29sZSB3aXRoIG1zZ3MgKi8KLQkJCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X21zZ3RpbWUsIGNvdW50OwotCQkJCSsrY291bnQ7Ci0JCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF9tc2d0aW1lICsgSFopKSB7Ci0JCQkJCWxhc3RfbXNndGltZSA9IGppZmZpZXM7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXMlczogdW5leHBlY3RlZCBpbnRlcnJ1cHQsICIKLQkJCQkJCSJzdGF0dXM9MHglMDJ4LCBjb3VudD0lbGRcbiIsCi0JCQkJCQlod2lmLT5uYW1lLAotCQkJCQkJKGh3aWYtPm5leHQ9PWh3Z3JvdXAtPmh3aWYpID8gIiIgOiAiKD8pIiwgc3RhdCwgY291bnQpOwotCQkJCX0KLQkJCX0KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF9tc2d0aW1lICsgSFopKSB7CisJCQlsYXN0X21zZ3RpbWUgPSBqaWZmaWVzOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCBpbnRlcnJ1cHQsICIKKwkJCQkic3RhdHVzPTB4JTAyeCwgY291bnQ9JWxkXG4iLAorCQkJCWh3aWYtPm5hbWUsIHN0YXQsIGNvdW50KTsKIAkJfQotCX0gd2hpbGUgKChod2lmID0gaHdpZi0+bmV4dCkgIT0gaHdncm91cC0+aHdpZik7CisJfQogfQogCiAvKioKICAqCWlkZV9pbnRyCS0JZGVmYXVsdCBJREUgaW50ZXJydXB0IGhhbmRsZXIKICAqCUBpcnE6IGludGVycnVwdCBudW1iZXIKLSAqCUBkZXZfaWQ6IGh3aWYgZ3JvdXAKKyAqCUBkZXZfaWQ6IGh3aWYKICAqCUByZWdzOiB1bnVzZWQgd2VpcmRuZXNzIGZyb20gdGhlIGtlcm5lbCBpcnEgbGF5ZXIKICAqCiAgKglUaGlzIGlzIHRoZSBkZWZhdWx0IElSUSBoYW5kbGVyIGZvciB0aGUgSURFIGxheWVyLiBZb3Ugc2hvdWxkCiAgKglub3QgbmVlZCB0byBvdmVycmlkZSBpdC4gSWYgeW91IGRvIGJlIGF3YXJlIGl0IGlzIHN1YnRsZSBpbgogICoJcGxhY2VzCiAgKgotICoJaHdncm91cC0+aHdpZiBpcyB0aGUgaW50ZXJmYWNlIGluIHRoZSBncm91cCBjdXJyZW50bHkgcGVyZm9ybWluZwotICoJYSBjb21tYW5kLiBod2dyb3VwLT5kcml2ZSBpcyB0aGUgZHJpdmUgYW5kIGh3Z3JvdXAtPmhhbmRsZXIgaXMKKyAqCWh3aWYgaXMgdGhlIGludGVyZmFjZSBpbiB0aGUgZ3JvdXAgY3VycmVudGx5IHBlcmZvcm1pbmcKKyAqCWEgY29tbWFuZC4gaHdpZi0+Y3VyX2RldiBpcyB0aGUgZHJpdmUgYW5kIGh3aWYtPmhhbmRsZXIgaXMKICAqCXRoZSBJUlEgaGFuZGxlciB0byBjYWxsLiBBcyB3ZSBpc3N1ZSBhIGNvbW1hbmQgdGhlIGhhbmRsZXJzCiAgKglzdGVwIHRocm91Z2ggbXVsdGlwbGUgc3RhdGVzLCByZWFzc2lnbmluZyB0aGUgaGFuZGxlciB0byB0aGUKICAqCW5leHQgc3RlcCBpbiB0aGUgcHJvY2Vzcy4gVW5saWtlIGEgc21hcnQgU0NTSSBjb250cm9sbGVyIElERQpAQCAtMTA1NCwyNiArMTA0NywzMiBAQAogICoKICAqCVRoZSBoYW5kbGVyIGV2ZW50dWFsbHkgcmV0dXJucyBpZGVfc3RvcHBlZCB0byBpbmRpY2F0ZSB0aGUKICAqCXJlcXVlc3QgY29tcGxldGVkLiBBdCB0aGlzIHBvaW50IHdlIGlzc3VlIHRoZSBuZXh0IHJlcXVlc3QKLSAqCW9uIHRoZSBod2dyb3VwIGFuZCB0aGUgcHJvY2VzcyBiZWdpbnMgYWdhaW4uCisgKglvbiB0aGUgcG9ydCBhbmQgdGhlIHByb2Nlc3MgYmVnaW5zIGFnYWluLgogICovCi0gCisKIGlycXJldHVybl90IGlkZV9pbnRyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gKGlkZV9od2dyb3VwX3QgKilkZXZfaWQ7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IGh3Z3JvdXAtPmh3aWY7CisJaWRlX2h3aWZfdCAqaHdpZiA9IChpZGVfaHdpZl90ICopZGV2X2lkOwogCWlkZV9kcml2ZV90ICp1bmluaXRpYWxpemVkX3Zhcihkcml2ZSk7CiAJaWRlX2hhbmRsZXJfdCAqaGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWlkZV9zdGFydHN0b3BfdCBzdGFydHN0b3A7CiAJaXJxcmV0dXJuX3QgaXJxX3JldCA9IElSUV9OT05FOwogCWludCBwbHVnX2RldmljZSA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCWlmIChod2lmLT5ob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgeworCQlpZiAoaHdpZiAhPSBod2lmLT5ob3N0LT5jdXJfcG9ydCkKKwkJCWdvdG8gb3V0X2Vhcmx5OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWlkZV9hY2tfaW50cihod2lmKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoKGhhbmRsZXIgPSBod2dyb3VwLT5oYW5kbGVyKSA9PSBOVUxMIHx8IGh3Z3JvdXAtPnBvbGxpbmcpIHsKKwloYW5kbGVyID0gaHdpZi0+aGFuZGxlcjsKKworCWlmIChoYW5kbGVyID09IE5VTEwgfHwgaHdpZi0+cG9sbGluZykgewogCQkvKgogCQkgKiBOb3QgZXhwZWN0aW5nIGFuIGludGVycnVwdCBmcm9tIHRoaXMgZHJpdmUuCiAJCSAqIFRoYXQgbWVhbnMgdGhpcyBjb3VsZCBiZToKQEAgLTEwOTcsNyArMTA5Niw3IEBACiAJCQkgKiBQcm9iYWJseSBub3QgYSBzaGFyZWQgUENJIGludGVycnVwdCwKIAkJCSAqIHNvIHdlIGNhbiBzYWZlbHkgdHJ5IHRvIGRvIHNvbWV0aGluZyBhYm91dCBpdDoKIAkJCSAqLwotCQkJdW5leHBlY3RlZF9pbnRyKGlycSwgaHdncm91cCk7CisJCQl1bmV4cGVjdGVkX2ludHIoaXJxLCBod2lmKTsKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVQQ0kKIAkJfSBlbHNlIHsKIAkJCS8qCkBAIC0xMTEwLDE2ICsxMTA5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZHJpdmUgPSBod2dyb3VwLT5kcml2ZTsKLQlpZiAoIWRyaXZlKSB7Ci0JCS8qCi0JCSAqIFRoaXMgc2hvdWxkIE5FVkVSIGhhcHBlbiwgYW5kIHRoZXJlIGlzbid0IG11Y2gKLQkJICogd2UgY291bGQgZG8gYWJvdXQgaXQgaGVyZS4KLQkJICoKLQkJICogW05vdGUgLSB0aGlzIGNhbiBvY2N1ciBpZiB0aGUgZHJpdmUgaXMgaG90IHVucGx1Z2dlZF0KLQkJICovCi0JCWdvdG8gb3V0X2hhbmRsZWQ7Ci0JfQorCWRyaXZlID0gaHdpZi0+Y3VyX2RldjsKIAogCWlmICghZHJpdmVfaXNfcmVhZHkoZHJpdmUpKQogCQkvKgpAQCAtMTEzMSwxMCArMTEyMSwxMCBAQAogCQkgKi8KIAkJZ290byBvdXQ7CiAKLQlod2dyb3VwLT5oYW5kbGVyID0gTlVMTDsKLQlod2dyb3VwLT5yZXFfZ2VuKys7Ci0JZGVsX3RpbWVyKCZod2dyb3VwLT50aW1lcik7Ci0Jc3Bpbl91bmxvY2soJmh3Z3JvdXAtPmxvY2spOworCWh3aWYtPmhhbmRsZXIgPSBOVUxMOworCWh3aWYtPnJlcV9nZW4rKzsKKwlkZWxfdGltZXIoJmh3aWYtPnRpbWVyKTsKKwlzcGluX3VubG9jaygmaHdpZi0+bG9jayk7CiAKIAlpZiAoaHdpZi0+cG9ydF9vcHMgJiYgaHdpZi0+cG9ydF9vcHMtPmNsZWFyX2lycSkKIAkJaHdpZi0+cG9ydF9vcHMtPmNsZWFyX2lycShkcml2ZSk7CkBAIC0xMTQ1LDcgKzExMzUsNyBAQAogCS8qIHNlcnZpY2UgdGhpcyBpbnRlcnJ1cHQsIG1heSBzZXQgaGFuZGxlciBmb3IgbmV4dCBpbnRlcnJ1cHQgKi8KIAlzdGFydHN0b3AgPSBoYW5kbGVyKGRyaXZlKTsKIAotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCS8qCiAJICogTm90ZSB0aGF0IGhhbmRsZXIoKSBtYXkgaGF2ZSBzZXQgdGhpbmdzIHVwIGZvciBhbm90aGVyCiAJICogaW50ZXJydXB0IHRvIG9jY3VyIHNvb24sIGJ1dCBpdCBjYW5ub3QgaGFwcGVuIHVudGlsCkBAIC0xMTU0LDIwICsxMTQ0LDE4IEBACiAJICogd29uJ3QgYWxsb3cgYW5vdGhlciBvZiB0aGUgc2FtZSAob24gYW55IENQVSkgdW50aWwgd2UgcmV0dXJuLgogCSAqLwogCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpIHsKLQkJaWYgKGh3Z3JvdXAtPmhhbmRsZXIgPT0gTlVMTCkgewkvKiBwYXJhbm9pYSAqLwotCQkJaWRlX3VubG9ja19od2dyb3VwKGh3Z3JvdXApOwotCQkJcGx1Z19kZXZpY2UgPSAxOwotCQl9IGVsc2UKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBodWg/IGV4cGVjdGVkIE5VTEwgaGFuZGxlciAiCi0JCQkJCSJvbiBleGl0XG4iLCBfX2Z1bmNfXywgZHJpdmUtPm5hbWUpOworCQlCVUdfT04oaHdpZi0+aGFuZGxlcik7CisJCWlkZV91bmxvY2tfcG9ydChod2lmKTsKKwkJcGx1Z19kZXZpY2UgPSAxOwogCX0KLW91dF9oYW5kbGVkOgogCWlycV9yZXQgPSBJUlFfSEFORExFRDsKIG91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAocGx1Z19kZXZpY2UpCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOworb3V0X2Vhcmx5OgorCWlmIChwbHVnX2RldmljZSkgeworCQlpZGVfdW5sb2NrX2hvc3QoaHdpZi0+aG9zdCk7CiAJCWlkZV9wbHVnX2RldmljZShkcml2ZSk7CisJfQogCiAJcmV0dXJuIGlycV9yZXQ7CiB9CkBAIC0xMTg5LDE1ICsxMTc3LDEzIEBACiAKIHZvaWQgaWRlX2RvX2RyaXZlX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkcml2ZS0+cXVldWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwlkcml2ZS0+aHdpZi0+cnEgPSBOVUxMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCV9fZWx2X2FkZF9yZXF1ZXN0KHEsIHJxLCBFTEVWQVRPUl9JTlNFUlRfRlJPTlQsIDApOwotCWJsa19zdGFydF9xdWV1ZWluZyhxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woaWRlX2RvX2RyaXZlX2NtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jIGIvZHJpdmVycy9pZGUvaWRlLWlvcHMuYwppbmRleCBhZDhiZDY1Li5lNzI4Y2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKQEAgLTEwNSwxNSArMTA1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9yZWFkX2FsdHN0YXR1cyk7CiAKLXU4IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCi17Ci0JaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykKLQkJcmV0dXJuIHJlYWRiKCh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOwotCWVsc2UKLQkJcmV0dXJuIGluYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzKTsKLQogdm9pZCBpZGVfc2V0X2lycShpZGVfaHdpZl90ICpod2lmLCBpbnQgb24pCiB7CiAJdTggY3RsID0gQVRBX0RFVkNUTF9PQlM7CkBAIC0zODgsNyArMzc5LDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IGlkZV9yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApAQCAtNDUxLDcgKzQ0MSw3IEBACiAgKi8KIGludCBkcml2ZV9pc19yZWFkeSAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJdTggc3RhdAkJCT0gMDsKIAogCWlmIChkcml2ZS0+d2FpdGluZ19mb3JfZG1hKQpAQCAtNTAzLDcgKzQ5Myw4IEBACiAJc3RhdCA9IHRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKIAlpZiAoc3RhdCAmIEFUQV9CVVNZKSB7Ci0JCWxvY2FsX2lycV9zZXQoZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOwogCQl0aW1lb3V0ICs9IGppZmZpZXM7CiAJCXdoaWxlICgoc3RhdCA9IHRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikpICYgQVRBX0JVU1kpIHsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CkBAIC04MjIsMjUgKzgxMywyNSBAQAogc3RhdGljIHZvaWQgX19pZGVfc2V0X2hhbmRsZXIgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2hhbmRsZXJfdCAqaGFuZGxlciwKIAkJICAgICAgdW5zaWduZWQgaW50IHRpbWVvdXQsIGlkZV9leHBpcnlfdCAqZXhwaXJ5KQogewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBIV0dST1VQKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAKLQlCVUdfT04oaHdncm91cC0+aGFuZGxlcik7Ci0JaHdncm91cC0+aGFuZGxlcgk9IGhhbmRsZXI7Ci0JaHdncm91cC0+ZXhwaXJ5CQk9IGV4cGlyeTsKLQlod2dyb3VwLT50aW1lci5leHBpcmVzCT0gamlmZmllcyArIHRpbWVvdXQ7Ci0JaHdncm91cC0+cmVxX2dlbl90aW1lcgk9IGh3Z3JvdXAtPnJlcV9nZW47Ci0JYWRkX3RpbWVyKCZod2dyb3VwLT50aW1lcik7CisJQlVHX09OKGh3aWYtPmhhbmRsZXIpOworCWh3aWYtPmhhbmRsZXIJCT0gaGFuZGxlcjsKKwlod2lmLT5leHBpcnkJCT0gZXhwaXJ5OworCWh3aWYtPnRpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgdGltZW91dDsKKwlod2lmLT5yZXFfZ2VuX3RpbWVyCT0gaHdpZi0+cmVxX2dlbjsKKwlhZGRfdGltZXIoJmh3aWYtPnRpbWVyKTsKIH0KIAogdm9pZCBpZGVfc2V0X2hhbmRsZXIgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2hhbmRsZXJfdCAqaGFuZGxlciwKIAkJICAgICAgdW5zaWduZWQgaW50IHRpbWVvdXQsIGlkZV9leHBpcnlfdCAqZXhwaXJ5KQogewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAlfX2lkZV9zZXRfaGFuZGxlcihkcml2ZSwgaGFuZGxlciwgdGltZW91dCwgZXhwaXJ5KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogfQogCiBFWFBPUlRfU1lNQk9MKGlkZV9zZXRfaGFuZGxlcik7CkBAIC04NjMsMTAgKzg1NCw5IEBACiAJCQkgdW5zaWduZWQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnkpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGhhbmRsZXIsIHRpbWVvdXQsIGV4cGlyeSk7CiAJaHdpZi0+dHBfb3BzLT5leGVjX2NvbW1hbmQoaHdpZiwgY21kKTsKIAkvKgpAQCAtODc2LDI2ICs4NjYsMjUgQEAKIAkgKiBGSVhNRTogd2UgY291bGQgc2tpcCB0aGlzIGRlbGF5IHdpdGggY2FyZSBvbiBub24gc2hhcmVkIGRldmljZXMKIAkgKi8KIAluZGVsYXkoNDAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChpZGVfZXhlY3V0ZV9jb21tYW5kKTsKIAogdm9pZCBpZGVfZXhlY3V0ZV9wa3RfY21kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAlod2lmLT50cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBBVEFfQ01EX1BBQ0tFVCk7CiAJbmRlbGF5KDQwMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9leGVjdXRlX3BrdF9jbWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX2NvbXBsZXRlX2RyaXZlX3Jlc2V0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGVycikKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCiAJaWYgKHJxICYmIGJsa19zcGVjaWFsX3JlcXVlc3QocnEpICYmIHJxLT5jbWRbMF0gPT0gUkVRX0RSSVZFX1JFU0VUKQogCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIGVyciA/IGVyciA6IDEsIDApOwpAQCAtOTEzLDcgKzkwMiw2IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGF0YXBpX3Jlc2V0X3BvbGxmdW5jIChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCXU4IHN0YXQ7CiAKIAlTRUxFQ1RfRFJJVkUoZHJpdmUpOwpAQCAtOTIzLDIwICs5MTEsMjAgQEAKIAlpZiAoT0tfU1RBVChzdGF0LCAwLCBBVEFfQlVTWSkpCiAJCXByaW50aygiJXM6IEFUQVBJIHJlc2V0IGNvbXBsZXRlXG4iLCBkcml2ZS0+bmFtZSk7CiAJZWxzZSB7Ci0JCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBod2dyb3VwLT5wb2xsX3RpbWVvdXQpKSB7CisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBod2lmLT5wb2xsX3RpbWVvdXQpKSB7CiAJCQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZhdGFwaV9yZXNldF9wb2xsZnVuYywgSFovMjAsIE5VTEwpOwogCQkJLyogY29udGludWUgcG9sbGluZyAqLwogCQkJcmV0dXJuIGlkZV9zdGFydGVkOwogCQl9CiAJCS8qIGVuZCBvZiBwb2xsaW5nICovCi0JCWh3Z3JvdXAtPnBvbGxpbmcgPSAwOworCQlod2lmLT5wb2xsaW5nID0gMDsKIAkJcHJpbnRrKCIlczogQVRBUEkgcmVzZXQgdGltZWQtb3V0LCBzdGF0dXM9MHglMDJ4XG4iLAogCQkJCWRyaXZlLT5uYW1lLCBzdGF0KTsKIAkJLyogZG8gaXQgdGhlIG9sZCBmYXNoaW9uZWQgd2F5ICovCiAJCXJldHVybiBkb19yZXNldDEoZHJpdmUsIDEpOwogCX0KIAkvKiBkb25lIHBvbGxpbmcgKi8KLQlod2dyb3VwLT5wb2xsaW5nID0gMDsKKwlod2lmLT5wb2xsaW5nID0gMDsKIAlpZGVfY29tcGxldGVfZHJpdmVfcmVzZXQoZHJpdmUsIDApOwogCXJldHVybiBpZGVfc3RvcHBlZDsKIH0KQEAgLTk2OCw4ICs5NTYsNyBAQAogICovCiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHJlc2V0X3BvbGxmdW5jIChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cAk9IEhXR1JPVVAoZHJpdmUpOwotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyAqcG9ydF9vcHMgPSBod2lmLT5wb3J0X29wczsKIAl1OCB0bXA7CiAJaW50IGVyciA9IDA7CkBAIC05ODYsNyArOTczLDcgQEAKIAl0bXAgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCiAJaWYgKCFPS19TVEFUKHRtcCwgMCwgQVRBX0JVU1kpKSB7Ci0JCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBod2dyb3VwLT5wb2xsX3RpbWVvdXQpKSB7CisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBod2lmLT5wb2xsX3RpbWVvdXQpKSB7CiAJCQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZyZXNldF9wb2xsZnVuYywgSFovMjAsIE5VTEwpOwogCQkJLyogY29udGludWUgcG9sbGluZyAqLwogCQkJcmV0dXJuIGlkZV9zdGFydGVkOwpAQCAtMTAwNyw3ICs5OTQsNyBAQAogCQl9CiAJfQogb3V0OgotCWh3Z3JvdXAtPnBvbGxpbmcgPSAwOwkvKiBkb25lIHBvbGxpbmcgKi8KKwlod2lmLT5wb2xsaW5nID0gMDsJLyogZG9uZSBwb2xsaW5nICovCiAJaWRlX2NvbXBsZXRlX2RyaXZlX3Jlc2V0KGRyaXZlLCBlcnIpOwogCXJldHVybiBpZGVfc3RvcHBlZDsKIH0KQEAgLTEwODEsMTggKzEwNjgsMTggQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgZG9fcmVzZXQxIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBkb19ub3RfdHJ5X2F0YXBpKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKIAlzdHJ1Y3QgaWRlX2lvX3BvcnRzICppb19wb3J0cyA9ICZod2lmLT5pb19wb3J0czsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgKnBvcnRfb3BzOworCWlkZV9kcml2ZV90ICp0ZHJpdmU7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgdGltZW91dDsKLQl1bnNpZ25lZCBpbnQgdW5pdDsKKwlpbnQgaTsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAogCS8qIFdlIG11c3Qgbm90IHJlc2V0IHdpdGggcnVubmluZyBoYW5kbGVycyAqLwotCUJVR19PTihod2dyb3VwLT5oYW5kbGVyICE9IE5VTEwpOworCUJVR19PTihod2lmLT5oYW5kbGVyICE9IE5VTEwpOwogCiAJLyogRm9yIGFuIEFUQVBJIGRldmljZSwgZmlyc3QgdHJ5IGFuIEFUQVBJIFNSU1QuICovCiAJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayAmJiAhZG9fbm90X3RyeV9hdGFwaSkgewpAQCAtMTEwMSwxMCArMTA4OCwxMCBAQAogCQl1ZGVsYXkgKDIwKTsKIAkJdHBfb3BzLT5leGVjX2NvbW1hbmQoaHdpZiwgQVRBX0NNRF9ERVZfUkVTRVQpOwogCQluZGVsYXkoNDAwKTsKLQkJaHdncm91cC0+cG9sbF90aW1lb3V0ID0gamlmZmllcyArIFdBSVRfV09SU1RDQVNFOwotCQlod2dyb3VwLT5wb2xsaW5nID0gMTsKKwkJaHdpZi0+cG9sbF90aW1lb3V0ID0gamlmZmllcyArIFdBSVRfV09SU1RDQVNFOworCQlod2lmLT5wb2xsaW5nID0gMTsKIAkJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZhdGFwaV9yZXNldF9wb2xsZnVuYywgSFovMjAsIE5VTEwpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIGlkZV9zdGFydGVkOwogCX0KIApAQCAtMTExNCw5ICsxMTAxLDcgQEAKIAogCQlwcmVwYXJlX3RvX3dhaXQoJmlkZV9wYXJrX3dxLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQl0aW1lb3V0ID0gamlmZmllczsKLQkJZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7IHVuaXQrKykgewotCQkJaWRlX2RyaXZlX3QgKnRkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwkJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIHRkcml2ZSwgaHdpZikgewogCQkJaWYgKHRkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQgJiYKIAkJCSAgICB0ZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QQVJLRUQgJiYKIAkJCSAgICB0aW1lX2FmdGVyKHRkcml2ZS0+c2xlZXAsIHRpbWVvdXQpKQpAQCAtMTEyNyw5ICsxMTEyLDkgQEAKIAkJaWYgKHRpbWVfYmVmb3JlX2VxKHRpbWVvdXQsIG5vdykpCiAJCQlicmVhazsKIAotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHRpbWVvdXQgLSBub3cpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCX0gd2hpbGUgKHRpbWVvdXQpOwogCWZpbmlzaF93YWl0KCZpZGVfcGFya193cSwgJndhaXQpOwogCkBAIC0xMTM3LDExICsxMTIyLDExIEBACiAJICogRmlyc3QsIHJlc2V0IGFueSBkZXZpY2Ugc3RhdGUgZGF0YSB3ZSB3ZXJlIG1haW50YWluaW5nCiAJICogZm9yIGFueSBvZiB0aGUgZHJpdmVzIG9uIHRoaXMgaW50ZXJmYWNlLgogCSAqLwotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpCi0JCXByZV9yZXNldCgmaHdpZi0+ZHJpdmVzW3VuaXRdKTsKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgdGRyaXZlLCBod2lmKQorCQlwcmVfcmVzZXQodGRyaXZlKTsKIAogCWlmIChpb19wb3J0cy0+Y3RsX2FkZHIgPT0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAkJaWRlX2NvbXBsZXRlX2RyaXZlX3Jlc2V0KGRyaXZlLCAtRU5YSU8pOwogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQpAQCAtMTE2NCw4ICsxMTQ5LDggQEAKIAl0cF9vcHMtPnNldF9pcnEoaHdpZiwgZHJpdmUtPnF1aXJrX2xpc3QgPT0gMik7CiAJLyogbW9yZSB0aGFuIGVub3VnaCB0aW1lICovCiAJdWRlbGF5KDEwKTsKLQlod2dyb3VwLT5wb2xsX3RpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7Ci0JaHdncm91cC0+cG9sbGluZyA9IDE7CisJaHdpZi0+cG9sbF90aW1lb3V0ID0gamlmZmllcyArIFdBSVRfV09SU1RDQVNFOworCWh3aWYtPnBvbGxpbmcgPSAxOwogCV9faWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmcmVzZXRfcG9sbGZ1bmMsIEhaLzIwLCBOVUxMKTsKIAogCS8qCkBAIC0xMTc3LDcgKzExNjIsNyBAQAogCWlmIChwb3J0X29wcyAmJiBwb3J0X29wcy0+cmVzZXRwcm9jKQogCQlwb3J0X29wcy0+cmVzZXRwcm9jKGRyaXZlKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGlkZV9zdGFydGVkOwogfQogCkBAIC0xMjIxLDYgKzEyMDYsMyBAQAogCX0KIAlyZXR1cm4gLUVCVVNZOwogfQotCi1FWFBPUlRfU1lNQk9MX0dQTChpZGVfd2FpdF9ub3RfYnVzeSk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwppbmRleCA5ZjZlMzNkLi4wOTUyNmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCkBAIC0yNzMsNyArMjczLDcgQEAKIAogc3RhdGljIHZvaWQgaWRlX2R1bXBfb3Bjb2RlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCWlkZV90YXNrX3QgKnRhc2sgPSBOVUxMOwogCiAJaWYgKCFycSkKQEAgLTM0NiwxMCArMzQ2LDEzIEBACiAJcHJpbnRrKEtFUk5fQ09OVCAifSIpOwogCWlmICgoZXJyICYgKEFUQV9CQksgfCBBVEFfQUJPUlRFRCkpID09IEFUQV9CQksgfHwKIAkgICAgKGVyciAmIChBVEFfVU5DIHwgQVRBX0lETkYgfCBBVEFfQU1ORikpKSB7CisJCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKKwogCQlpZGVfZHVtcF9zZWN0b3IoZHJpdmUpOwotCQlpZiAoSFdHUk9VUChkcml2ZSkgJiYgSFdHUk9VUChkcml2ZSktPnJxKQorCisJCWlmIChycSkKIAkJCXByaW50ayhLRVJOX0NPTlQgIiwgc2VjdG9yPSVsbHUiLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpSFdHUk9VUChkcml2ZSktPnJxLT5zZWN0b3IpOworCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcnEtPnNlY3Rvcik7CiAJfQogCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcGFyay5jIGIvZHJpdmVycy9pZGUvaWRlLXBhcmsuYwppbmRleCA2Nzg0NTRhLi5jODc1YTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcGFyay5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMKQEAgLTcsMjIgKzcsMjIgQEAKIAogc3RhdGljIHZvaWQgaXNzdWVfcGFya19jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJaW50IHJjOwogCiAJdGltZW91dCArPSBqaWZmaWVzOwotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BBUktFRCkgewogCQlpbnQgcmVzZXRfdGltZXIgPSB0aW1lX2JlZm9yZSh0aW1lb3V0LCBkcml2ZS0+c2xlZXApOwogCQlpbnQgc3RhcnRfcXVldWUgPSAwOwogCiAJCWRyaXZlLT5zbGVlcCA9IHRpbWVvdXQ7CiAJCXdha2VfdXBfYWxsKCZpZGVfcGFya193cSk7Ci0JCWlmIChyZXNldF90aW1lciAmJiBkZWxfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKSkKKwkJaWYgKHJlc2V0X3RpbWVyICYmIGRlbF90aW1lcigmaHdpZi0+dGltZXIpKQogCQkJc3RhcnRfcXVldWUgPSAxOwotCQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCQlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCiAJCWlmIChzdGFydF9xdWV1ZSkgewogCQkJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKQEAgLTMxLDcgKzMxLDcgQEAKIAkJfQogCQlyZXR1cm47CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAogCXJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIFJFQUQsIF9fR0ZQX1dBSVQpOwogCXJxLT5jbWRbMF0gPSBSRVFfUEFSS19IRUFEUzsKQEAgLTY0LDIxICs2NCwyMSBAQAogCQkgICAgICBjaGFyICpidWYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBub3c7CiAJdW5zaWduZWQgaW50IG1zZWNzOwogCiAJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9fVU5MT0FEKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAlub3cgPSBqaWZmaWVzOwogCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BBUktFRCAmJgogCSAgICB0aW1lX2FmdGVyKGRyaXZlLT5zbGVlcCwgbm93KSkKIAkJbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGRyaXZlLT5zbGVlcCAtIG5vdyk7CiAJZWxzZQogCQltc2VjcyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIldVxuIiwgbXNlY3MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXBtLmMgYi9kcml2ZXJzL2lkZS9pZGUtcG0uYwppbmRleCA4MjgyYzYwLi40YjNiZjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcG0uYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcG0uYwpAQCAtNSw3ICs1LDcgQEAKIGludCBnZW5lcmljX2lkZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gZGV2LT5kcml2ZXJfZGF0YSwgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSBycXBtOwogCWlkZV90YXNrX3QgYXJnczsKQEAgLTM5LDcgKzM5LDcgQEAKIGludCBnZW5lcmljX2lkZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IGRldi0+ZHJpdmVyX2RhdGEsICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgcnFwbTsKIAlpZGVfdGFza190IGFyZ3M7CkBAIC02Nyw3ICs2Nyw3IEBACiAJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKIAogCWlmIChlcnIgPT0gMCAmJiBkZXYtPmRyaXZlcikgewotCQlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCQlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKIAkJaWYgKGRydi0+cmVzdW1lKQogCQkJZHJ2LT5yZXN1bWUoZHJpdmUpOwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCi0JZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxID0gTlVMTDsKKwlkcml2ZS0+aHdpZi0+cnEgPSBOVUxMOwogCiAJaWYgKGJsa19lbmRfcmVxdWVzdChycSwgMCwgMCkpCiAJCUJVRygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwppbmRleCBjNWFkYjdiLi4wY2NiYjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIHN0YXRpYyB2b2lkIGRvX2lkZW50aWZ5KGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTE2ICppZCA9IGRyaXZlLT5pZDsKIAljaGFyICptID0gKGNoYXIgKikmaWRbQVRBX0lEX1BST0RdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNjYsNyArMjY2LDcgQEAKIAogc3RhdGljIGludCBhY3R1YWxfdHJ5X3RvX2lkZW50aWZ5IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNtZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBpZGVfaW9fcG9ydHMgKmlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CiAJaW50IHVzZV9hbHRzdGF0dXMgPSAwLCByYzsKQEAgLTM0MSw3ICszNDEsNyBAQAogIAogc3RhdGljIGludCB0cnlfdG9faWRlbnRpZnkgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAlpbnQgcmV0dmFsOwogCWludCBhdXRvcHJvYmUgPSAwOwpAQCAtNDM4LDcgKzQzOCw3IEBACiAKIHN0YXRpYyBpbnQgZG9fcHJvYmUgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAlpbnQgcmM7CiAJdTggcHJlc2VudCA9ICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCksIHN0YXQ7CkBAIC00NjMsNyArNDYzLDcgQEAKIAlpZiAoaWRlX3JlYWRfZGV2aWNlKGRyaXZlKSAhPSBkcml2ZS0+c2VsZWN0ICYmIHByZXNlbnQgPT0gMCkgewogCQlpZiAoZHJpdmUtPmRuICYgMSkgewogCQkJLyogZXhpdCB3aXRoIGRyaXZlMCBzZWxlY3RlZCAqLwotCQkJU0VMRUNUX0RSSVZFKCZod2lmLT5kcml2ZXNbMF0pOworCQkJU0VMRUNUX0RSSVZFKGh3aWYtPmRldmljZXNbMF0pOwogCQkJLyogYWxsb3cgQVRBX0JVU1kgdG8gYXNzZXJ0ICYgY2xlYXIgKi8KIAkJCW1zbGVlcCg1MCk7CiAJCX0KQEAgLTUwOSw3ICs1MDksNyBAQAogCX0KIAlpZiAoZHJpdmUtPmRuICYgMSkgewogCQkvKiBleGl0IHdpdGggZHJpdmUwIHNlbGVjdGVkICovCi0JCVNFTEVDVF9EUklWRSgmaHdpZi0+ZHJpdmVzWzBdKTsKKwkJU0VMRUNUX0RSSVZFKGh3aWYtPmRldmljZXNbMF0pOwogCQltc2xlZXAoNTApOwogCQkvKiBlbnN1cmUgZHJpdmUgaXJxIGlzIGNsZWFyICovCiAJCSh2b2lkKXRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CkBAIC01MjIsNyArNTIyLDcgQEAKICAqLwogc3RhdGljIHZvaWQgZW5hYmxlX25lc3QgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CiAJdTggc3RhdDsKIApAQCAtNjk3LDcgKzY5Nyw4IEBACiAKIHN0YXRpYyBpbnQgaWRlX3BvcnRfd2FpdF9yZWFkeShpZGVfaHdpZl90ICpod2lmKQogewotCWludCB1bml0LCByYzsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaW50IGksIHJjOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIlByb2JpbmcgSURFIGludGVyZmFjZSAlcy4uLlxuIiwgaHdpZi0+bmFtZSk7CiAKQEAgLTcxNCw5ICs3MTUsNyBAQAogCQlyZXR1cm4gcmM7CiAKIAkvKiBOb3cgbWFrZSBzdXJlIGJvdGggbWFzdGVyICYgc2xhdmUgYXJlIHJlYWR5ICovCi0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7IHVuaXQrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCS8qIElnbm9yZSBkaXNrcyB0aGF0IHdlIHdpbGwgbm90IHByb2JlIGZvciBsYXRlci4gKi8KIAkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpID09IDAgfHwKIAkJICAgIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpKSB7CkBAIC03MzIsOCArNzMxLDggQEAKIAl9CiBvdXQ6CiAJLyogRXhpdCBmdW5jdGlvbiB3aXRoIG1hc3RlciByZXNlbGVjdGVkIChsZXQncyBiZSBzYW5lKSAqLwotCWlmICh1bml0KQotCQlTRUxFQ1RfRFJJVkUoJmh3aWYtPmRyaXZlc1swXSk7CisJaWYgKGkpCisJCVNFTEVDVF9EUklWRShod2lmLT5kZXZpY2VzWzBdKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTc0OSw3ICs3NDgsNyBAQAogCiB2b2lkIGlkZV91bmRlY29kZWRfc2xhdmUoaWRlX2RyaXZlX3QgKmRldjEpCiB7Ci0JaWRlX2RyaXZlX3QgKmRldjAgPSAmZGV2MS0+aHdpZi0+ZHJpdmVzWzBdOworCWlkZV9kcml2ZV90ICpkZXYwID0gZGV2MS0+aHdpZi0+ZGV2aWNlc1swXTsKIAogCWlmICgoZGV2MS0+ZG4gJiAxKSA9PSAwIHx8IChkZXYwLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPT0gMCkKIAkJcmV0dXJuOwpAQCAtNzc4LDE0ICs3NzcsMTUgQEAKIAogc3RhdGljIGludCBpZGVfcHJvYmVfcG9ydChpZGVfaHdpZl90ICpod2lmKQogeworCWlkZV9kcml2ZV90ICpkcml2ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBpcnFkOwotCWludCB1bml0LCByYyA9IC1FTk9ERVY7CisJaW50IGksIHJjID0gLUVOT0RFVjsKIAogCUJVR19PTihod2lmLT5wcmVzZW50KTsKIAotCWlmICgoaHdpZi0+ZHJpdmVzWzBdLmRldl9mbGFncyAmIElERV9ERkxBR19OT1BST0JFKSAmJgotCSAgICAoaHdpZi0+ZHJpdmVzWzFdLmRldl9mbGFncyAmIElERV9ERkxBR19OT1BST0JFKSkKKwlpZiAoKGh3aWYtPmRldmljZXNbMF0tPmRldl9mbGFncyAmIElERV9ERkxBR19OT1BST0JFKSAmJgorCSAgICAoaHdpZi0+ZGV2aWNlc1sxXS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAogCS8qCkBAIC03OTYsNyArNzk2LDggQEAKIAlpZiAoaXJxZCkKIAkJZGlzYWJsZV9pcnEoaHdpZi0+aXJxKTsKIAotCWxvY2FsX2lycV9zZXQoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfZW5hYmxlX2luX2hhcmRpcnEoKTsKIAogCWlmIChpZGVfcG9ydF93YWl0X3JlYWR5KGh3aWYpID09IC1FQlVTWSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXYWl0IGZvciByZWFkeSBmYWlsZWQgYmVmb3JlIHByb2JlICFcbiIsIGh3aWYtPm5hbWUpOwpAQCAtODA1LDkgKzgwNiw3IEBACiAJICogU2Vjb25kIGRyaXZlIHNob3VsZCBvbmx5IGV4aXN0IGlmIGZpcnN0IGRyaXZlIHdhcyBmb3VuZCwKIAkgKiBidXQgYSBsb3Qgb2YgY2Ryb20gZHJpdmVzIGFyZSBjb25maWd1cmVkIGFzIHNpbmdsZSBzbGF2ZXMuCiAJICovCi0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCSh2b2lkKSBwcm9iZV9mb3JfZHJpdmUoZHJpdmUpOwogCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKQogCQkJcmMgPSAwOwpAQCAtODI4LDIwICs4MjcsMTcgQEAKIHN0YXRpYyB2b2lkIGlkZV9wb3J0X3R1bmVfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogewogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgKnBvcnRfb3BzID0gaHdpZi0+cG9ydF9vcHM7Ci0JaW50IHVuaXQ7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWludCBpOwogCi0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7IHVuaXQrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKIAkJCWlmIChwb3J0X29wcyAmJiBwb3J0X29wcy0+cXVpcmtwcm9jKQogCQkJCXBvcnRfb3BzLT5xdWlya3Byb2MoZHJpdmUpOwogCQl9CiAJfQogCi0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKIAkJCWlkZV9zZXRfbWF4X3Bpbyhkcml2ZSk7CiAKQEAgLTg1MiwxMSArODQ4LDggQEAKIAkJfQogCX0KIAotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQotCQlpZiAoKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fSU9fMzJCSVQpIHx8Ci0JCSAgICBkcml2ZS0+aWRbQVRBX0lEX0RXT1JEX0lPXSkKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKKwkJaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fSU9fMzJCSVQpCiAJCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19OT19JT18zMkJJVDsKIAkJZWxzZQogCQkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX05PX0lPXzMyQklUOwpAQCAtODY5LDcgKzg2Miw3IEBACiBzdGF0aWMgaW50IGlkZV9pbml0X3F1ZXVlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWludCBtYXhfc2VjdG9ycyA9IDI1NjsKIAlpbnQgbWF4X3NnX2VudHJpZXMgPSBQUkRfRU5UUklFUzsKIApAQCAtOTE4LDM2ICs5MTEsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaWRlX2FkZF9kcml2ZV90b19od2dyb3VwKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7Ci0KLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLQlpZiAoIWh3Z3JvdXAtPmRyaXZlKSB7Ci0JCS8qIGZpcnN0IGRyaXZlIGZvciBod2dyb3VwLiAqLwotCQlkcml2ZS0+bmV4dCA9IGRyaXZlOwotCQlod2dyb3VwLT5kcml2ZSA9IGRyaXZlOwotCQlod2dyb3VwLT5od2lmID0gSFdJRihod2dyb3VwLT5kcml2ZSk7Ci0JfSBlbHNlIHsKLQkJZHJpdmUtPm5leHQgPSBod2dyb3VwLT5kcml2ZS0+bmV4dDsKLQkJaHdncm91cC0+ZHJpdmUtPm5leHQgPSBkcml2ZTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLX0KK3N0YXRpYyBERUZJTkVfTVVURVgoaWRlX2NmZ19tdHgpOwogCiAvKgogICogRm9yIGFueSBwcmVzZW50IGRyaXZlOgogICogLSBhbGxvY2F0ZSB0aGUgYmxvY2sgZGV2aWNlIHF1ZXVlCi0gKiAtIGxpbmsgZHJpdmUgaW50byB0aGUgaHdncm91cAogICovCiBzdGF0aWMgaW50IGlkZV9wb3J0X3NldHVwX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CiAJaW50IGksIGogPSAwOwogCiAJbXV0ZXhfbG9jaygmaWRlX2NmZ19tdHgpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPT0gMCkKIAkJCWNvbnRpbnVlOwogCkBAIC05NjEsMTM5ICs5MzcsMzkgQEAKIAkJfQogCiAJCWorKzsKLQotCQlpZGVfYWRkX2RyaXZlX3RvX2h3Z3JvdXAoZHJpdmUpOwogCX0KIAltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKIAogCXJldHVybiBqOwogfQogCi1zdGF0aWMgaWRlX2h3aWZfdCAqaWRlX3BvcnRzW01BWF9IV0lGU107Ci0KLXZvaWQgaWRlX3JlbW92ZV9wb3J0X2Zyb21faHdncm91cChpZGVfaHdpZl90ICpod2lmKQotewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwotCi0JaWRlX3BvcnRzW2h3aWYtPmluZGV4XSA9IE5VTEw7Ci0KLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLQkvKgotCSAqIFJlbW92ZSB1cyBmcm9tIHRoZSBod2dyb3VwLCBhbmQgZnJlZQotCSAqIHRoZSBod2dyb3VwIGlmIHdlIHdlcmUgdGhlIG9ubHkgbWVtYmVyCi0JICovCi0JaWYgKGh3aWYtPm5leHQgPT0gaHdpZikgewotCQlCVUdfT04oaHdncm91cC0+aHdpZiAhPSBod2lmKTsKLQkJa2ZyZWUoaHdncm91cCk7Ci0JfSBlbHNlIHsKLQkJLyogVGhlcmUgaXMgYW5vdGhlciBpbnRlcmZhY2UgaW4gaHdncm91cC4KLQkJICogVW5saW5rIHVzLCBhbmQgc2V0IGh3Z3JvdXAtPmRyaXZlIGFuZCAtPmh3aWYgdG8KLQkJICogc29tZXRoaW5nIHNhbmUuCi0JCSAqLwotCQlpZGVfaHdpZl90ICpnID0gaHdncm91cC0+aHdpZjsKLQotCQl3aGlsZSAoZy0+bmV4dCAhPSBod2lmKQotCQkJZyA9IGctPm5leHQ7Ci0JCWctPm5leHQgPSBod2lmLT5uZXh0OwotCQlpZiAoaHdncm91cC0+aHdpZiA9PSBod2lmKSB7Ci0JCQkvKiBDaG9zZSBhIHJhbmRvbSBod2lmIGZvciBod2dyb3VwLT5od2lmLgotCQkJICogSXQncyBndWFyYW50ZWVkIHRoYXQgdGhlcmUgYXJlIG5vIGRyaXZlcwotCQkJICogbGVmdCBpbiB0aGUgaHdncm91cC4KLQkJCSAqLwotCQkJQlVHX09OKGh3Z3JvdXAtPmRyaXZlICE9IE5VTEwpOwotCQkJaHdncm91cC0+aHdpZiA9IGc7Ci0JCX0KLQkJQlVHX09OKGh3Z3JvdXAtPmh3aWYgPT0gaHdpZik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci19Ci0KIC8qCi0gKiBUaGlzIHJvdXRpbmUgc2V0cyB1cCB0aGUgaXJxIGZvciBhbiBpZGUgaW50ZXJmYWNlLCBhbmQgY3JlYXRlcyBhIG5ldwotICogaHdncm91cCBmb3IgdGhlIGlycS9od2lmIGlmIG5vbmUgd2FzIHByZXZpb3VzbHkgYXNzaWduZWQuCi0gKgotICogTXVjaCBvZiB0aGUgY29kZSBpcyBmb3IgY29ycmVjdGx5IGRldGVjdGluZy9oYW5kbGluZyBpcnEgc2hhcmluZwotICogYW5kIGlycSBzZXJpYWxpemF0aW9uIHNpdHVhdGlvbnMuICBUaGlzIGlzIHNvbWV3aGF0IGNvbXBsZXggYmVjYXVzZQotICogaXQgaGFuZGxlcyBzdGF0aWMgYXMgd2VsbCBhcyBkeW5hbWljIChQQ01DSUEpIElERSBpbnRlcmZhY2VzLgorICogVGhpcyByb3V0aW5lIHNldHMgdXAgdGhlIElSUSBmb3IgYW4gSURFIGludGVyZmFjZS4KICAqLwogc3RhdGljIGludCBpbml0X2lycSAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzdHJ1Y3QgaWRlX2lvX3BvcnRzICppb19wb3J0cyA9ICZod2lmLT5pb19wb3J0czsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cDsKLQlpZGVfaHdpZl90ICptYXRjaCA9IE5VTEw7CisJaW50IHNhID0gMDsKIAogCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKLQlod2lmLT5od2dyb3VwID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmaHdpZi0+bG9jayk7CiAKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfSFdJRlM7IGluZGV4KyspIHsKLQkJaWRlX2h3aWZfdCAqaCA9IGlkZV9wb3J0c1tpbmRleF07CisJaW5pdF90aW1lcigmaHdpZi0+dGltZXIpOworCWh3aWYtPnRpbWVyLmZ1bmN0aW9uID0gJmlkZV90aW1lcl9leHBpcnk7CisJaHdpZi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWh3aWY7CiAKLQkJaWYgKGggJiYgaC0+aHdncm91cCkgeyAgLyogc2NhbiBvbmx5IGluaXRpYWxpemVkIHBvcnRzICovCi0JCQlpZiAoaHdpZi0+aG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpIHsKLQkJCQlpZiAoaHdpZi0+aG9zdCA9PSBoLT5ob3N0KQotCQkJCQltYXRjaCA9IGg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBzdGlsbCB3aXRob3V0IGEgaHdncm91cCwgdGhlbiBmb3JtIGEgbmV3IG9uZQotCSAqLwotCWlmIChtYXRjaCkgewotCQlod2dyb3VwID0gbWF0Y2gtPmh3Z3JvdXA7Ci0JCWh3aWYtPmh3Z3JvdXAgPSBod2dyb3VwOwotCQkvKgotCQkgKiBMaW5rIHVzIGludG8gdGhlIGh3Z3JvdXAuCi0JCSAqIFRoaXMgbXVzdCBiZSBkb25lIGVhcmx5LCBkbyBlbnN1cmUgdGhhdCB1bmV4cGVjdGVkX2ludHIKLQkJICogY2FuIGZpbmQgdGhlIGh3aWYgYW5kIHByZXZlbnQgaXJxIHN0b3Jtcy4KLQkJICogTm8gZHJpdmVzIGFyZSBhdHRhY2hlZCB0byB0aGUgbmV3IGh3aWYsIGNob29zZV9kcml2ZQotCQkgKiBjYW4ndCBkbyBhbnl0aGluZyBzdHVwaWQgKHlldCkuCi0JCSAqIEFkZCBvdXJzZWxmIGFzIHRoZSAybmQgZW50cnkgdG8gdGhlIGh3Z3JvdXAtPmh3aWYKLQkJICogbGlua2VkIGxpc3QsIHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgaHdpZiB0aGF0IG93bnMKLQkJICogaHdncm91cC0+aGFuZGxlciAtIGRvIG5vdCBjaGFuZ2UgdGhhdC4KLQkJICovCi0JCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCQlod2lmLT5uZXh0ID0gaHdncm91cC0+aHdpZi0+bmV4dDsKLQkJaHdncm91cC0+aHdpZi0+bmV4dCA9IGh3aWY7Ci0JCUJVR19PTihod2lmLT5uZXh0ID09IGh3aWYpOwotCQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCX0gZWxzZSB7Ci0JCWh3Z3JvdXAgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpod2dyb3VwKSwgR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLAotCQkJCSAgICAgICBod2lmX3RvX25vZGUoaHdpZikpOwotCQlpZiAoaHdncm91cCA9PSBOVUxMKQotCQkJZ290byBvdXRfdXA7Ci0KLQkJc3Bpbl9sb2NrX2luaXQoJmh3Z3JvdXAtPmxvY2spOwotCi0JCWh3aWYtPmh3Z3JvdXAgPSBod2dyb3VwOwotCQlod2dyb3VwLT5od2lmID0gaHdpZi0+bmV4dCA9IGh3aWY7Ci0KLQkJaW5pdF90aW1lcigmaHdncm91cC0+dGltZXIpOwotCQlod2dyb3VwLT50aW1lci5mdW5jdGlvbiA9ICZpZGVfdGltZXJfZXhwaXJ5OwotCQlod2dyb3VwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGh3Z3JvdXA7Ci0JfQotCi0JaWRlX3BvcnRzW2h3aWYtPmluZGV4XSA9IGh3aWY7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIHRoZSBpcnEsIGlmIG5vdCBhbHJlYWR5IG9idGFpbmVkIGZvciBhbm90aGVyIGh3aWYKLQkgKi8KLQlpZiAoIW1hdGNoIHx8IG1hdGNoLT5pcnEgIT0gaHdpZi0+aXJxKSB7Ci0JCWludCBzYSA9IDA7CiAjaWYgZGVmaW5lZChfX21jNjgwMDBfXykKLQkJc2EgPSBJUlFGX1NIQVJFRDsKKwlzYSA9IElSUUZfU0hBUkVEOwogI2VuZGlmIC8qIF9fbWM2ODAwMF9fICovCiAKLQkJaWYgKGh3aWYtPmNoaXBzZXQgPT0gaWRlX3BjaSkKLQkJCXNhID0gSVJRRl9TSEFSRUQ7CisJaWYgKGh3aWYtPmNoaXBzZXQgPT0gaWRlX3BjaSkKKwkJc2EgPSBJUlFGX1NIQVJFRDsKIAotCQlpZiAoaW9fcG9ydHMtPmN0bF9hZGRyKQotCQkJaHdpZi0+dHBfb3BzLT5zZXRfaXJxKGh3aWYsIDEpOworCWlmIChpb19wb3J0cy0+Y3RsX2FkZHIpCisJCWh3aWYtPnRwX29wcy0+c2V0X2lycShod2lmLCAxKTsKIAotCQlpZiAocmVxdWVzdF9pcnEoaHdpZi0+aXJxLCZpZGVfaW50cixzYSxod2lmLT5uYW1lLGh3Z3JvdXApKQotCSAgICAgICAJCWdvdG8gb3V0X3VubGluazsKLQl9CisJaWYgKHJlcXVlc3RfaXJxKGh3aWYtPmlycSwgJmlkZV9pbnRyLCBzYSwgaHdpZi0+bmFtZSwgaHdpZikpCisJCWdvdG8gb3V0X3VwOwogCiAJaWYgKCFod2lmLT5ycXNpemUpIHsKIAkJaWYgKChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX05PX0xCQTQ4KSB8fApAQCAtMTExMSwxNCArOTg3LDEyIEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMgYXQgMHglMDhseCBvbiBpcnEgJWQiLCBod2lmLT5uYW1lLAogCQlpb19wb3J0cy0+ZGF0YV9hZGRyLCBod2lmLT5pcnEpOwogI2VuZGlmIC8qIF9fbWM2ODAwMF9fICovCi0JaWYgKG1hdGNoKQotCQlwcmludGsoS0VSTl9DT05UICIgKHNlcmlhbGl6ZWQgd2l0aCAlcykiLCBtYXRjaC0+bmFtZSk7CisJaWYgKGh3aWYtPmhvc3QtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKQorCQlwcmludGsoS0VSTl9DT05UICIgKHNlcmlhbGl6ZWQpIik7CiAJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAogCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOwogCXJldHVybiAwOwotb3V0X3VubGluazoKLQlpZGVfcmVtb3ZlX3BvcnRfZnJvbV9od2dyb3VwKGh3aWYpOwogb3V0X3VwOgogCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOwogCXJldHVybiAxOwpAQCAtMTEzNCw3ICsxMDA4LDcgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZGF0YTsKIAlpbnQgdW5pdCA9ICpwYXJ0ID4+IFBBUlROX0JJVFM7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBod2lmLT5kZXZpY2VzW3VuaXRdOwogCiAJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDApCiAJCXJldHVybiBOVUxMOwpAQCAtMTE5Niw0NyArMTA3MCwyMyBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfaW5pdF9kaXNrKTsKIAotc3RhdGljIHZvaWQgaWRlX3JlbW92ZV9kcml2ZV9mcm9tX2h3Z3JvdXAoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKLQotCWlmIChkcml2ZSA9PSBkcml2ZS0+bmV4dCkgewotCQkvKiBzcGVjaWFsIGNhc2U6IGxhc3QgZHJpdmUgZnJvbSBod2dyb3VwLiAqLwotCQlCVUdfT04oaHdncm91cC0+ZHJpdmUgIT0gZHJpdmUpOwotCQlod2dyb3VwLT5kcml2ZSA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJaWRlX2RyaXZlX3QgKndhbGs7Ci0KLQkJd2FsayA9IGh3Z3JvdXAtPmRyaXZlOwotCQl3aGlsZSAod2Fsay0+bmV4dCAhPSBkcml2ZSkKLQkJCXdhbGsgPSB3YWxrLT5uZXh0OwotCQl3YWxrLT5uZXh0ID0gZHJpdmUtPm5leHQ7Ci0JCWlmIChod2dyb3VwLT5kcml2ZSA9PSBkcml2ZSkgewotCQkJaHdncm91cC0+ZHJpdmUgPSBkcml2ZS0+bmV4dDsKLQkJCWh3Z3JvdXAtPmh3aWYgPSBod2dyb3VwLT5kcml2ZS0+aHdpZjsKLQkJfQotCX0KLQlCVUdfT04oaHdncm91cC0+ZHJpdmUgPT0gZHJpdmUpOwotfQotCiBzdGF0aWMgdm9pZCBkcml2ZV9yZWxlYXNlX2RldiAoc3RydWN0IGRldmljZSAqZGV2KQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IGNvbnRhaW5lcl9vZihkZXYsIGlkZV9kcml2ZV90LCBnZW5kZXYpOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAKIAlpZGVfcHJvY191bnJlZ2lzdGVyX2RldmljZShkcml2ZSk7CiAKLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLQlpZGVfcmVtb3ZlX2RyaXZlX2Zyb21faHdncm91cChkcml2ZSk7CisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJa2ZyZWUoZHJpdmUtPmlkKTsKIAlkcml2ZS0+aWQgPSBOVUxMOwogCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19QUkVTRU5UOwogCS8qIE1lc3NlZCB1cCBsb2NraW5nIC4uLiAqLwotCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAlibGtfY2xlYW51cF9xdWV1ZShkcml2ZS0+cXVldWUpOwotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCWRyaXZlLT5xdWV1ZSA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCiAJY29tcGxldGUoJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOwogfQpAQCAtMTMwMiwxMCArMTE1MiwxMCBAQAogCiBzdGF0aWMgdm9pZCBod2lmX3JlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbaV07CisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkcml2ZS0+Z2VuZGV2OwogCQlpbnQgcmV0OwogCkBAIC0xMzI4LDExICsxMTc4LDEwIEBACiBzdGF0aWMgdm9pZCBpZGVfcG9ydF9pbml0X2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wcyA9IGh3aWYtPnBvcnRfb3BzOworCWlkZV9kcml2ZV90ICpkcml2ZTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQlkcml2ZS0+ZG4gPSBpICsgaHdpZi0+Y2hhbm5lbCAqIDI7CiAKIAkJaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfSU9fMzJCSVQpCkBAIC0xMzgwLDYgKzEyMjksOCBAQAogCWlmICgoZC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19ETUEpID09IDApIHsKIAkJaW50IHJjOwogCisJCWh3aWYtPmRtYV9vcHMgPSBkLT5kbWFfb3BzOworCiAJCWlmIChkLT5pbml0X2RtYSkKIAkJCXJjID0gZC0+aW5pdF9kbWEoaHdpZiwgZCk7CiAJCWVsc2UKQEAgLTEzODcsMTIgKzEyMzgsMTMgQEAKIAogCQlpZiAocmMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICIlczogRE1BIGRpc2FibGVkXG4iLCBod2lmLT5uYW1lKTsKKworCQkJaHdpZi0+ZG1hX29wcyA9IE5VTEw7CiAJCQlod2lmLT5kbWFfYmFzZSA9IDA7CiAJCQlod2lmLT5zd2RtYV9tYXNrID0gMDsKIAkJCWh3aWYtPm13ZG1hX21hc2sgPSAwOwogCQkJaHdpZi0+dWx0cmFfbWFzayA9IDA7Ci0JCX0gZWxzZSBpZiAoZC0+ZG1hX29wcykKLQkJCWh3aWYtPmRtYV9vcHMgPSBkLT5kbWFfb3BzOworCQl9CiAJfQogCiAJaWYgKChkLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgfHwKQEAgLTE0MTcsNiArMTI2OSw2NiBAQAogCX0KIH0KIAorc3RhdGljIGNvbnN0IHU4IGlkZV9od2lmX3RvX21ham9yW10gPQorCXsgSURFMF9NQUpPUiwgSURFMV9NQUpPUiwgSURFMl9NQUpPUiwgSURFM19NQUpPUiwgSURFNF9NQUpPUiwKKwkgIElERTVfTUFKT1IsIElERTZfTUFKT1IsIElERTdfTUFKT1IsIElERThfTUFKT1IsIElERTlfTUFKT1IgfTsKKworc3RhdGljIHZvaWQgaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaW50IGk7CisKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKKwkJdTggaiA9IChod2lmLT5pbmRleCAqIE1BWF9EUklWRVMpICsgaTsKKworCQltZW1zZXQoZHJpdmUsIDAsIHNpemVvZigqZHJpdmUpKTsKKworCQlkcml2ZS0+bWVkaWEJCQk9IGlkZV9kaXNrOworCQlkcml2ZS0+c2VsZWN0CQkJPSAoaSA8PCA0KSB8IEFUQV9ERVZJQ0VfT0JTOworCQlkcml2ZS0+aHdpZgkJCT0gaHdpZjsKKwkJZHJpdmUtPnJlYWR5X3N0YXQJCT0gQVRBX0RSRFk7CisJCWRyaXZlLT5iYWRfd3N0YXQJCT0gQkFEX1dfU1RBVDsKKwkJZHJpdmUtPnNwZWNpYWwuYi5yZWNhbGlicmF0ZQk9IDE7CisJCWRyaXZlLT5zcGVjaWFsLmIuc2V0X2dlb21ldHJ5CT0gMTsKKwkJZHJpdmUtPm5hbWVbMF0JCQk9ICdoJzsKKwkJZHJpdmUtPm5hbWVbMV0JCQk9ICdkJzsKKwkJZHJpdmUtPm5hbWVbMl0JCQk9ICdhJyArIGo7CisJCWRyaXZlLT5tYXhfZmFpbHVyZXMJCT0gSURFX0RFRkFVTFRfTUFYX0ZBSUxVUkVTOworCisJCUlOSVRfTElTVF9IRUFEKCZkcml2ZS0+bGlzdCk7CisJCWluaXRfY29tcGxldGlvbigmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZGVfaW5pdF9wb3J0X2RhdGEoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgaW50IGluZGV4KQoreworCS8qIGZpbGwgaW4gYW55IG5vbi16ZXJvIGluaXRpYWwgdmFsdWVzICovCisJaHdpZi0+aW5kZXgJPSBpbmRleDsKKwlod2lmLT5tYWpvcgk9IGlkZV9od2lmX3RvX21ham9yW2luZGV4XTsKKworCWh3aWYtPm5hbWVbMF0JPSAnaSc7CisJaHdpZi0+bmFtZVsxXQk9ICdkJzsKKwlod2lmLT5uYW1lWzJdCT0gJ2UnOworCWh3aWYtPm5hbWVbM10JPSAnMCcgKyBpbmRleDsKKworCWluaXRfY29tcGxldGlvbigmaHdpZi0+Z2VuZGV2X3JlbF9jb21wKTsKKworCWh3aWYtPnRwX29wcyA9ICZkZWZhdWx0X3RwX29wczsKKworCWlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGh3aWYpOworfQorCitzdGF0aWMgdm9pZCBpZGVfaW5pdF9wb3J0X2h3KGlkZV9od2lmX3QgKmh3aWYsIGh3X3JlZ3NfdCAqaHcpCit7CisJbWVtY3B5KCZod2lmLT5pb19wb3J0cywgJmh3LT5pb19wb3J0cywgc2l6ZW9mKGh3aWYtPmlvX3BvcnRzKSk7CisJaHdpZi0+aXJxID0gaHctPmlycTsKKwlod2lmLT5jaGlwc2V0ID0gaHctPmNoaXBzZXQ7CisJaHdpZi0+ZGV2ID0gaHctPmRldjsKKwlod2lmLT5nZW5kZXYucGFyZW50ID0gaHctPnBhcmVudCA/IGh3LT5wYXJlbnQgOiBody0+ZGV2OworCWh3aWYtPmFja19pbnRyID0gaHctPmFja19pbnRyOworCWh3aWYtPmNvbmZpZ19kYXRhID0gaHctPmNvbmZpZzsKK30KKwogc3RhdGljIHVuc2lnbmVkIGludCBpZGVfaW5kZXhlczsKIAogLyoqCkBAIC0xNDY2LDEyICsxMzc4LDQzIEBACiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiB9CiAKK3N0YXRpYyB2b2lkIGlkZV9wb3J0X2ZyZWVfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQoreworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaTsKKworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikKKwkJa2ZyZWUoZHJpdmUpOworfQorCitzdGF0aWMgaW50IGlkZV9wb3J0X2FsbG9jX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZiwgaW50IG5vZGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7CisJCWlkZV9kcml2ZV90ICpkcml2ZTsKKworCQlkcml2ZSA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmRyaXZlKSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJCWlmIChkcml2ZSA9PSBOVUxMKQorCQkJZ290byBvdXRfbm9tZW07CisKKwkJaHdpZi0+ZGV2aWNlc1tpXSA9IGRyaXZlOworCX0KKwlyZXR1cm4gMDsKKworb3V0X25vbWVtOgorCWlkZV9wb3J0X2ZyZWVfZGV2aWNlcyhod2lmKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwogc3RydWN0IGlkZV9ob3N0ICppZGVfaG9zdF9hbGxvYyhjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyAqZCwgaHdfcmVnc190ICoqaHdzKQogewogCXN0cnVjdCBpZGVfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBod3NbMF0gPyBod3NbMF0tPmRldiA6IE5VTEw7CisJaW50IG5vZGUgPSBkZXYgPyBkZXZfdG9fbm9kZShkZXYpIDogLTE7CiAJaW50IGk7CiAKLQlob3N0ID0ga3phbGxvYyhzaXplb2YoKmhvc3QpLCBHRlBfS0VSTkVMKTsKKwlob3N0ID0ga3phbGxvY19ub2RlKHNpemVvZigqaG9zdCksIEdGUF9LRVJORUwsIG5vZGUpOwogCWlmIChob3N0ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xNDgyLDEwICsxNDI1LDE1IEBACiAJCWlmIChod3NbaV0gPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCi0JCWh3aWYgPSBremFsbG9jKHNpemVvZigqaHdpZiksIEdGUF9LRVJORUwpOworCQlod2lmID0ga3phbGxvY19ub2RlKHNpemVvZigqaHdpZiksIEdGUF9LRVJORUwsIG5vZGUpOwogCQlpZiAoaHdpZiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKKwkJaWYgKGlkZV9wb3J0X2FsbG9jX2RldmljZXMoaHdpZiwgbm9kZSkgPCAwKSB7CisJCQlrZnJlZShod2lmKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJaWR4ID0gaWRlX2ZpbmRfcG9ydF9zbG90KGQpOwogCQlpZiAoaWR4IDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gZnJlZSBzbG90IGZvciBpbnRlcmZhY2VcbiIsCkBAIC0xNTA3LDggKzE0NTUsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoaHdzWzBdKQotCQlob3N0LT5kZXZbMF0gPSBod3NbMF0tPmRldjsKKwlob3N0LT5kZXZbMF0gPSBkZXY7CiAKIAlpZiAoZCkgewogCQlob3N0LT5pbml0X2NoaXBzZXQgPSBkLT5pbml0X2NoaXBzZXQ7CkBAIC0xNTI1LDkgKzE0NzIsNyBAQAogCWlkZV9od2lmX3QgKmh3aWYsICptYXRlID0gTlVMTDsKIAlpbnQgaSwgaiA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewotCQlod2lmID0gaG9zdC0+cG9ydHNbaV07Ci0KKwlpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIGh3aWYsIGhvc3QpIHsKIAkJaWYgKGh3aWYgPT0gTlVMTCkgewogCQkJbWF0ZSA9IE5VTEw7CiAJCQljb250aW51ZTsKQEAgLTE1NTMsOSArMTQ5OCw3IEBACiAJCWlkZV9wb3J0X2luaXRfZGV2aWNlcyhod2lmKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewotCQlod2lmID0gaG9zdC0+cG9ydHNbaV07Ci0KKwlpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIGh3aWYsIGhvc3QpIHsKIAkJaWYgKGh3aWYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xNTcwLDkgKzE1MTMsNyBAQAogCQkJaWRlX3BvcnRfdHVuZV9kZXZpY2VzKGh3aWYpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKQEAgLTE1OTcsOSArMTUzOCw3IEBACiAJCQlpZGVfYWNwaV9wb3J0X2luaXRfZGV2aWNlcyhod2lmKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewotCQlod2lmID0gaG9zdC0+cG9ydHNbaV07Ci0KKwlpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIGh3aWYsIGhvc3QpIHsKIAkJaWYgKGh3aWYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xNjA3LDkgKzE1NDYsNyBAQAogCQkJaHdpZl9yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKQEAgLTE2NDcsMTcgKzE1ODQsODUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9ob3N0X2FkZCk7CiAKK3N0YXRpYyB2b2lkIF9faWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWludCBpOworCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CisJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKKwkJCWRldmljZV91bnJlZ2lzdGVyKCZkcml2ZS0+Z2VuZGV2KTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOworCQl9CisJfQorfQorCit2b2lkIGlkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQoreworCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKKwlfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKKwlod2lmLT5wcmVzZW50ID0gMDsKKwlpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShod2lmKTsKKwltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyk7CisKKy8qKgorICoJaWRlX3VucmVnaXN0ZXIJCS0JZnJlZSBhbiBJREUgaW50ZXJmYWNlCisgKglAaHdpZjogSURFIGludGVyZmFjZQorICoKKyAqCVBlcmZvcm0gdGhlIGZpbmFsIHVucmVnaXN0ZXIgb2YgYW4gSURFIGludGVyZmFjZS4KKyAqCisgKglMb2NraW5nOgorICoJVGhlIGNhbGxlciBtdXN0IG5vdCBob2xkIHRoZSBJREUgbG9ja3MuCisgKgorICoJSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHBlbmRpbmcgSS9PIGhlcmUsCisgKglhbmQgdGhhdCB0aGUgaW50ZXJmYWNlIHdpbGwgbm90IGJlIHJlb3BlbmVkIChwcmVzZW50L3ZhbmlzaGluZworICoJbG9ja2luZyBpc24ndCB5ZXQgZG9uZSBCVFcpLgorICovCisKK3N0YXRpYyB2b2lkIGlkZV91bnJlZ2lzdGVyKGlkZV9od2lmX3QgKmh3aWYpCit7CisJQlVHX09OKGluX2ludGVycnVwdCgpKTsKKwlCVUdfT04oaXJxc19kaXNhYmxlZCgpKTsKKworCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKKworCWlmIChod2lmLT5wcmVzZW50KSB7CisJCV9faWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOworCQlod2lmLT5wcmVzZW50ID0gMDsKKwl9CisKKwlpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaHdpZik7CisKKwlmcmVlX2lycShod2lmLT5pcnEsIGh3aWYpOworCisJZGV2aWNlX3VucmVnaXN0ZXIoaHdpZi0+cG9ydGRldik7CisJZGV2aWNlX3VucmVnaXN0ZXIoJmh3aWYtPmdlbmRldik7CisJd2FpdF9mb3JfY29tcGxldGlvbigmaHdpZi0+Z2VuZGV2X3JlbF9jb21wKTsKKworCS8qCisJICogUmVtb3ZlIHVzIGZyb20gdGhlIGtlcm5lbCdzIGtub3dsZWRnZQorCSAqLworCWJsa191bnJlZ2lzdGVyX3JlZ2lvbihNS0RFVihod2lmLT5tYWpvciwgMCksIE1BWF9EUklWRVM8PFBBUlROX0JJVFMpOworCWtmcmVlKGh3aWYtPnNnX3RhYmxlKTsKKwl1bnJlZ2lzdGVyX2Jsa2Rldihod2lmLT5tYWpvciwgaHdpZi0+bmFtZSk7CisKKwlpZGVfcmVsZWFzZV9kbWFfZW5naW5lKGh3aWYpOworCisJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7Cit9CisKIHZvaWQgaWRlX2hvc3RfZnJlZShzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZjsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKKwkJaWRlX3BvcnRfZnJlZV9kZXZpY2VzKGh3aWYpOwogCQlpZGVfZnJlZV9wb3J0X3Nsb3QoaHdpZi0+aW5kZXgpOwogCQlrZnJlZShod2lmKTsKIAl9CkBAIC0xNjY4LDExICsxNjczLDEyIEBACiAKIHZvaWQgaWRlX2hvc3RfcmVtb3ZlKHN0cnVjdCBpZGVfaG9zdCAqaG9zdCkKIHsKKwlpZGVfaHdpZl90ICpod2lmOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaWYgKGhvc3QtPnBvcnRzW2ldKQotCQkJaWRlX3VucmVnaXN0ZXIoaG9zdC0+cG9ydHNbaV0pOworCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgeworCQlpZiAoaHdpZikKKwkJCWlkZV91bnJlZ2lzdGVyKGh3aWYpOwogCX0KIAogCWlkZV9ob3N0X2ZyZWUoaG9zdCk7CkBAIC0xNjkxLDggKzE2OTcsOCBAQAogCWh3aWYtPnByZXNlbnQgPSAxOwogCiAJaWRlX3BvcnRfdHVuZV9kZXZpY2VzKGh3aWYpOwotCWlkZV9hY3BpX3BvcnRfaW5pdF9kZXZpY2VzKGh3aWYpOwogCWlkZV9wb3J0X3NldHVwX2RldmljZXMoaHdpZik7CisJaWRlX2FjcGlfcG9ydF9pbml0X2RldmljZXMoaHdpZik7CiAJaHdpZl9yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOwogCWlkZV9wcm9jX3BvcnRfcmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCmluZGV4IGExNGUyOTMuLjFkODk3OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXByb2MuYwpAQCAtNDM5LDEzICs0MzksMTMgQEAKIHN0YXRpYyBpbnQgcHJvY19pZGVfcmVhZF9kcml2ZXIKIAkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JaWRlX2RyaXZlX3QJKmRyaXZlID0gKGlkZV9kcml2ZV90ICopIGRhdGE7Ci0Jc3RydWN0IGRldmljZQkqZGV2ID0gJmRyaXZlLT5nZW5kZXY7Ci0JaWRlX2RyaXZlcl90CSppZGVfZHJ2OwotCWludAkJbGVuOworCWlkZV9kcml2ZV90CQkqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKilkYXRhOworCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSAmZHJpdmUtPmdlbmRldjsKKwlzdHJ1Y3QgaWRlX2RyaXZlcgkqaWRlX2RydjsKKwlpbnQJCQlsZW47CiAKIAlpZiAoZGV2LT5kcml2ZXIpIHsKLQkJaWRlX2RydiA9IGNvbnRhaW5lcl9vZihkZXYtPmRyaXZlciwgaWRlX2RyaXZlcl90LCBnZW5fZHJpdmVyKTsKKwkJaWRlX2RydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlcyB2ZXJzaW9uICVzXG4iLAogCQkJCWRldi0+ZHJpdmVyLT5uYW1lLCBpZGVfZHJ2LT52ZXJzaW9uKTsKIAl9IGVsc2UKQEAgLTU1NSw3ICs1NTUsNyBAQAogCX0KIH0KIAotdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfZHJpdmVyX3QgKmRyaXZlcikKK3ZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9kcml2ZXIgKmRyaXZlcikKIHsKIAltdXRleF9sb2NrKCZpZGVfc2V0dGluZ19tdHgpOwogCWRyaXZlLT5zZXR0aW5ncyA9IGRyaXZlci0+cHJvY19kZXZzZXRzKGRyaXZlKTsKQEAgLTU3Nyw3ICs1NzcsNyBAQAogICoJVGFrZXMgaWRlX3NldHRpbmdfbXR4LgogICovCiAKLXZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfZHJpdmVyX3QgKmRyaXZlcikKK3ZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2RyaXZlciAqZHJpdmVyKQogewogCWlkZV9yZW1vdmVfcHJvY19lbnRyaWVzKGRyaXZlLT5wcm9jLCBkcml2ZXItPnByb2NfZW50cmllcyhkcml2ZSkpOwogCkBAIC01OTMsMTQgKzU5MywxMyBAQAogCiB2b2lkIGlkZV9wcm9jX3BvcnRfcmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogewotCWludAlkOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50ID0gaHdpZi0+cHJvYzsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CiAJY2hhciBuYW1lWzY0XTsKKwlpbnQgaTsKIAotCWZvciAoZCA9IDA7IGQgPCBNQVhfRFJJVkVTOyBkKyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tkXTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPT0gMCB8fCBkcml2ZS0+cHJvYykKIAkJCWNvbnRpbnVlOwogCkBAIC02NTMsNyArNjUyLDcgQEAKIAogc3RhdGljIGludCBwcm9jX3ByaW50X2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCB2b2lkICpkYXRhKQogewotCWlkZV9kcml2ZXJfdCAqaWRlX2RydiA9IGNvbnRhaW5lcl9vZihkcnYsIGlkZV9kcml2ZXJfdCwgZ2VuX2RyaXZlcik7CisJc3RydWN0IGlkZV9kcml2ZXIgKmlkZV9kcnYgPSB0b19pZGVfZHJpdmVyKGRydik7CiAJc3RydWN0IHNlcV9maWxlICpzID0gZGF0YTsKIAogCXNlcV9wcmludGYocywgIiVzIHZlcnNpb24gJXNcbiIsIGRydi0+bmFtZSwgaWRlX2Rydi0+dmVyc2lvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwppbmRleCA1ZDJhYTIyLi5kN2VjZDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKQEAgLTE2NiwxMCArMTY2LDEwIEBACiAgKiB0byBhbiBpbnRlcnJ1cHQgb3IgYSB0aW1lciBldmVudCBpcyBzdG9yZWQgaW4gdGhlIHN0cnVjdCBkZWZpbmVkIGJlbG93LgogICovCiB0eXBlZGVmIHN0cnVjdCBpZGVfdGFwZV9vYmogewotCWlkZV9kcml2ZV90CSpkcml2ZTsKLQlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKLQlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKLQlzdHJ1Y3Qga3JlZglrcmVmOworCWlkZV9kcml2ZV90CQkqZHJpdmU7CisJc3RydWN0IGlkZV9kcml2ZXIJKmRyaXZlcjsKKwlzdHJ1Y3QgZ2VuZGlzawkJKmRpc2s7CisJc3RydWN0IGtyZWYJCWtyZWY7CiAKIAkvKgogCSAqCWZhaWxlZF9wYyBwb2ludHMgdG8gdGhlIGxhc3QgZmFpbGVkIHBhY2tldCBjb21tYW5kLCBvciBjb250YWlucwpAQCAtNDc5LDcgKzQ3OSw3IEBACiAKIHN0YXRpYyBpbnQgaWRldGFwZV9lbmRfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSwgaW50IG5yX3NlY3RzKQogewotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyb3I7CkBAIC01MzEsNyArNTMxLDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IEVycm9yIGluIFJFUVVFU1QgU0VOU0UgIgogCQkJCQkiaXRzZWxmIC0gQWJvcnRpbmcgcmVxdWVzdCFcbiIpOwogCX0gZWxzZSBpZiAocGMtPmNbMF0gPT0gUkVBRF82IHx8IHBjLT5jWzBdID09IFdSSVRFXzYpIHsKLQkJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxOworCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJCWludCBibG9ja3MgPSBwYy0+eGZlcnJlZCAvIHRhcGUtPmJsa19zaXplOwogCiAJCXRhcGUtPmF2Z19zaXplICs9IGJsb2NrcyAqIHRhcGUtPmJsa19zaXplOwpAQCAtNTc2LDcgKzU3Niw3IEBACiAKIC8qCiAgKiBQb3N0cG9uZSB0aGUgY3VycmVudCByZXF1ZXN0IHNvIHRoYXQgaWRlLmMgd2lsbCBiZSBhYmxlIHRvIHNlcnZpY2UgcmVxdWVzdHMKLSAqIGZyb20gYW5vdGhlciBkZXZpY2Ugb24gdGhlIHNhbWUgaHdncm91cCB3aGlsZSB3ZSBhcmUgcG9sbGluZyBmb3IgRFNDLgorICogZnJvbSBhbm90aGVyIGRldmljZSBvbiB0aGUgc2FtZSBwb3J0IHdoaWxlIHdlIGFyZSBwb2xsaW5nIGZvciBEU0MuCiAgKi8KIHN0YXRpYyB2b2lkIGlkZXRhcGVfcG9zdHBvbmVfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CkBAIC01ODQsNyArNTg0LDggQEAKIAogCWRlYnVnX2xvZyhEQkdfUFJPQ1MsICJFbnRlciAlc1xuIiwgX19mdW5jX18pOwogCi0JdGFwZS0+cG9zdHBvbmVkX3JxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXRhcGUtPnBvc3Rwb25lZF9ycSA9IGRyaXZlLT5od2lmLT5ycTsKKwogCWlkZV9zdGFsbF9xdWV1ZShkcml2ZSwgdGFwZS0+ZHNjX3BvbGxfZnJlcSk7CiB9CiAKQEAgLTIzMTIsNyArMjMxMyw3IEBACiAKIHN0YXRpYyBpbnQgaWRlX3RhcGVfcHJvYmUoaWRlX2RyaXZlX3QgKik7CiAKLXN0YXRpYyBpZGVfZHJpdmVyX3QgaWRldGFwZV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGlkZV9kcml2ZXIgaWRldGFwZV9kcml2ZXIgPSB7CiAJLmdlbl9kcml2ZXIgPSB7CiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJCT0gImlkZS10YXBlIiwKQEAgLTIzMjMsNyArMjMyNCw2IEBACiAJLnZlcnNpb24JCT0gSURFVEFQRV9WRVJTSU9OLAogCS5kb19yZXF1ZXN0CQk9IGlkZXRhcGVfZG9fcmVxdWVzdCwKIAkuZW5kX3JlcXVlc3QJCT0gaWRldGFwZV9lbmRfcmVxdWVzdCwKLQkuZXJyb3IJCQk9IF9faWRlX2Vycm9yLAogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwogCS5wcm9jX2VudHJpZXMJCT0gaWRlX3RhcGVfcHJvY19lbnRyaWVzLAogCS5wcm9jX2RldnNldHMJCT0gaWRlX3RhcGVfcHJvY19kZXZzZXRzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYwppbmRleCBiZjRmYjlkLi4xNjEzOGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYwpAQCAtNTgsNyArNTgsNyBAQAogCiBpZGVfc3RhcnRzdG9wX3QgZG9fcndfdGFza2ZpbGUgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX3Rhc2tfdCAqdGFzaykKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmID0gJnRhc2stPnRmOwogCWlkZV9oYW5kbGVyX3QgKmhhbmRsZXIgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CkBAIC0zMDksOSArMzA5LDkgQEAKIAkJfQogCiAJCWlmIChzZWN0b3JzID4gMCkgewotCQkJaWRlX2RyaXZlcl90ICpkcnY7CisJCQlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2OwogCi0JCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQkJZHJ2ID0gKihzdHJ1Y3QgaWRlX2RyaXZlciAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwogCQkJZHJ2LT5lbmRfcmVxdWVzdChkcml2ZSwgMSwgc2VjdG9ycyk7CiAJCX0KIAl9CkBAIC0zMjgsOSArMzI4LDkgQEAKIAl9CiAKIAlpZiAocnEtPnJxX2Rpc2spIHsKLQkJaWRlX2RyaXZlcl90ICpkcnY7CisJCXN0cnVjdCBpZGVfZHJpdmVyICpkcnY7CiAKLQkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTs7CisJCWRydiA9ICooc3RydWN0IGlkZV9kcml2ZXIgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTs7CiAJCWRydi0+ZW5kX3JlcXVlc3QoZHJpdmUsIDEsIHJxLT5ucl9zZWN0b3JzKTsKIAl9IGVsc2UKIAkJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCAxLCBycS0+bnJfc2VjdG9ycyk7CkBAIC0zNjEsNyArMzYxLDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgdGFza19pbl9pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdTggc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKIAkvKiBFcnJvcj8gKi8KQEAgLTM5NSw3ICszOTUsNyBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCB0YXNrX291dF9pbnRyIChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1OCBzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCWlmICghT0tfU1RBVChzdGF0LCBEUklWRV9SRUFEWSwgZHJpdmUtPmJhZF93c3RhdCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUuYyBiL2RyaXZlcnMvaWRlL2lkZS5jCmluZGV4IDQ2YTJkNGNhLi4yNTg4MDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUuYwpAQCAtNjAsMTc5ICs2MCw4IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCi0KLS8qIGRlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgZmFpbHVyZXMgKi8KLSNkZWZpbmUgSURFX0RFRkFVTFRfTUFYX0ZBSUxVUkVTIAkxCi0KIHN0cnVjdCBjbGFzcyAqaWRlX3BvcnRfY2xhc3M7CiAKLXN0YXRpYyBjb25zdCB1OCBpZGVfaHdpZl90b19tYWpvcltdID0geyBJREUwX01BSk9SLCBJREUxX01BSk9SLAotCQkJCQlJREUyX01BSk9SLCBJREUzX01BSk9SLAotCQkJCQlJREU0X01BSk9SLCBJREU1X01BSk9SLAotCQkJCQlJREU2X01BSk9SLCBJREU3X01BSk9SLAotCQkJCQlJREU4X01BSk9SLCBJREU5X01BSk9SIH07Ci0KLURFRklORV9NVVRFWChpZGVfY2ZnX210eCk7Ci0KLXN0YXRpYyB2b2lkIGlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGlkZV9od2lmX3QgKik7Ci0KLS8qCi0gKiBEbyBub3QgZXZlbiAqdGhpbmsqIGFib3V0IGNhbGxpbmcgdGhpcyEKLSAqLwotdm9pZCBpZGVfaW5pdF9wb3J0X2RhdGEoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgaW50IGluZGV4KQotewotCS8qIGJ1bGsgaW5pdGlhbGl6ZSBod2lmICYgZHJpdmUgaW5mbyB3aXRoIHplcm9zICovCi0JbWVtc2V0KGh3aWYsIDAsIHNpemVvZihpZGVfaHdpZl90KSk7Ci0KLQkvKiBmaWxsIGluIGFueSBub24temVybyBpbml0aWFsIHZhbHVlcyAqLwotCWh3aWYtPmluZGV4CT0gaW5kZXg7Ci0JaHdpZi0+bWFqb3IJPSBpZGVfaHdpZl90b19tYWpvcltpbmRleF07Ci0KLQlod2lmLT5uYW1lWzBdCT0gJ2knOwotCWh3aWYtPm5hbWVbMV0JPSAnZCc7Ci0JaHdpZi0+bmFtZVsyXQk9ICdlJzsKLQlod2lmLT5uYW1lWzNdCT0gJzAnICsgaW5kZXg7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmh3aWYtPmdlbmRldl9yZWxfY29tcCk7Ci0KLQlod2lmLT50cF9vcHMgPSAmZGVmYXVsdF90cF9vcHM7Ci0KLQlpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShod2lmKTsKLX0KLQotc3RhdGljIHZvaWQgaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQlpbnQgdW5pdDsKLQotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQkJdTggaiA9IChod2lmLT5pbmRleCAqIE1BWF9EUklWRVMpICsgdW5pdDsKLQotCQltZW1zZXQoZHJpdmUsIDAsIHNpemVvZigqZHJpdmUpKTsKLQotCQlkcml2ZS0+bWVkaWEJCQk9IGlkZV9kaXNrOwotCQlkcml2ZS0+c2VsZWN0CQkJPSAodW5pdCA8PCA0KSB8IEFUQV9ERVZJQ0VfT0JTOwotCQlkcml2ZS0+aHdpZgkJCT0gaHdpZjsKLQkJZHJpdmUtPnJlYWR5X3N0YXQJCT0gQVRBX0RSRFk7Ci0JCWRyaXZlLT5iYWRfd3N0YXQJCT0gQkFEX1dfU1RBVDsKLQkJZHJpdmUtPnNwZWNpYWwuYi5yZWNhbGlicmF0ZQk9IDE7Ci0JCWRyaXZlLT5zcGVjaWFsLmIuc2V0X2dlb21ldHJ5CT0gMTsKLQkJZHJpdmUtPm5hbWVbMF0JCQk9ICdoJzsKLQkJZHJpdmUtPm5hbWVbMV0JCQk9ICdkJzsKLQkJZHJpdmUtPm5hbWVbMl0JCQk9ICdhJyArIGo7Ci0JCWRyaXZlLT5tYXhfZmFpbHVyZXMJCT0gSURFX0RFRkFVTFRfTUFYX0ZBSUxVUkVTOwotCi0JCUlOSVRfTElTVF9IRUFEKCZkcml2ZS0+bGlzdCk7Ci0JCWluaXRfY29tcGxldGlvbigmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCi0JCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKLQkJCWRldmljZV91bnJlZ2lzdGVyKCZkcml2ZS0+Z2VuZGV2KTsKLQkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOwotCQl9Ci0JfQotfQotCi12b2lkIGlkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQotewotCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKLQlfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKLQlod2lmLT5wcmVzZW50ID0gMDsKLQlpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShod2lmKTsKLQltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyk7Ci0KLS8qKgotICoJaWRlX3VucmVnaXN0ZXIJCS0JZnJlZSBhbiBJREUgaW50ZXJmYWNlCi0gKglAaHdpZjogSURFIGludGVyZmFjZQotICoKLSAqCVBlcmZvcm0gdGhlIGZpbmFsIHVucmVnaXN0ZXIgb2YgYW4gSURFIGludGVyZmFjZS4gQXQgdGhlIG1vbWVudAotICoJd2UgZG9uJ3QgcmVmY291bnQgaW50ZXJmYWNlcyBzbyB0aGlzIHdpbGwgYWxzbyBnZXQgc3BsaXQgdXAuCi0gKgotICoJTG9ja2luZzoKLSAqCVRoZSBjYWxsZXIgbXVzdCBub3QgaG9sZCB0aGUgSURFIGxvY2tzCi0gKglUaGUgZHJpdmUgcHJlc2VudC92YW5pc2hpbmcgaXMgbm90IHlldCBwcm9wZXJseSBsb2NrZWQKLSAqCVRha2UgY2FyZSB3aXRoIHRoZSBjYWxsYmFja3MuIFRoZXNlIGhhdmUgYmVlbiBzcGxpdCB0byBhdm9pZAotICoJZGVhZGxvY2tpbmcgdGhlIElERSBsYXllci4gVGhlIHNodXRkb3duIGNhbGxiYWNrIGlzIGNhbGxlZAotICoJYmVmb3JlIHdlIHRha2UgdGhlIGxvY2sgYW5kIGZyZWUgcmVzb3VyY2VzLiBJdCBpcyB1cCB0byB0aGUKLSAqCWNhbGxlciB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHBlbmRpbmcgSS9PIGhlcmUsIGFuZCB0aGF0Ci0gKgl0aGUgaW50ZXJmYWNlIHdpbGwgbm90IGJlIHJlb3BlbmVkIChwcmVzZW50L3ZhbmlzaGluZyBsb2NraW5nCi0gKglpc24ndCB5ZXQgZG9uZSBCVFcpLiBBZnRlciB3ZSBjb21taXQgdG8gdGhlIGZpbmFsIGtpbGwgd2UKLSAqCWNhbGwgdGhlIGNsZWFudXAgY2FsbGJhY2sgd2l0aCB0aGUgaWRlIGxvY2tzIGhlbGQuCi0gKgotICoJVW5yZWdpc3RlciByZXN0b3JlcyB0aGUgaHdpZiBzdHJ1Y3R1cmVzIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgotICoJVGhpcyBpcyByYXZpbmcgYm9ua2Vycy4KLSAqLwotCi12b2lkIGlkZV91bnJlZ2lzdGVyKGlkZV9od2lmX3QgKmh3aWYpCi17Ci0JaWRlX2h3aWZfdCAqZzsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwOwotCWludCBpcnFfY291bnQgPSAwOwotCi0JQlVHX09OKGluX2ludGVycnVwdCgpKTsKLQlCVUdfT04oaXJxc19kaXNhYmxlZCgpKTsKLQotCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKLQotCWlmIChod2lmLT5wcmVzZW50KSB7Ci0JCV9faWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOwotCQlod2lmLT5wcmVzZW50ID0gMDsKLQl9Ci0KLQlpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaHdpZik7Ci0KLQlod2dyb3VwID0gaHdpZi0+aHdncm91cDsKLQkvKgotCSAqIGZyZWUgdGhlIGlycSBpZiB3ZSB3ZXJlIHRoZSBvbmx5IGh3aWYgdXNpbmcgaXQKLQkgKi8KLQlnID0gaHdncm91cC0+aHdpZjsKLQlkbyB7Ci0JCWlmIChnLT5pcnEgPT0gaHdpZi0+aXJxKQotCQkJKytpcnFfY291bnQ7Ci0JCWcgPSBnLT5uZXh0OwotCX0gd2hpbGUgKGcgIT0gaHdncm91cC0+aHdpZik7Ci0JaWYgKGlycV9jb3VudCA9PSAxKQotCQlmcmVlX2lycShod2lmLT5pcnEsIGh3Z3JvdXApOwotCi0JaWRlX3JlbW92ZV9wb3J0X2Zyb21faHdncm91cChod2lmKTsKLQotCWRldmljZV91bnJlZ2lzdGVyKGh3aWYtPnBvcnRkZXYpOwotCWRldmljZV91bnJlZ2lzdGVyKCZod2lmLT5nZW5kZXYpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmh3aWYtPmdlbmRldl9yZWxfY29tcCk7Ci0KLQkvKgotCSAqIFJlbW92ZSB1cyBmcm9tIHRoZSBrZXJuZWwncyBrbm93bGVkZ2UKLQkgKi8KLQlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoaHdpZi0+bWFqb3IsIDApLCBNQVhfRFJJVkVTPDxQQVJUTl9CSVRTKTsKLQlrZnJlZShod2lmLT5zZ190YWJsZSk7Ci0JdW5yZWdpc3Rlcl9ibGtkZXYoaHdpZi0+bWFqb3IsIGh3aWYtPm5hbWUpOwotCi0JaWRlX3JlbGVhc2VfZG1hX2VuZ2luZShod2lmKTsKLQotCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOwotfQotCi12b2lkIGlkZV9pbml0X3BvcnRfaHcoaWRlX2h3aWZfdCAqaHdpZiwgaHdfcmVnc190ICpodykKLXsKLQltZW1jcHkoJmh3aWYtPmlvX3BvcnRzLCAmaHctPmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aW9fcG9ydHMpKTsKLQlod2lmLT5pcnEgPSBody0+aXJxOwotCWh3aWYtPmNoaXBzZXQgPSBody0+Y2hpcHNldDsKLQlod2lmLT5kZXYgPSBody0+ZGV2OwotCWh3aWYtPmdlbmRldi5wYXJlbnQgPSBody0+cGFyZW50ID8gaHctPnBhcmVudCA6IGh3LT5kZXY7Ci0JaHdpZi0+YWNrX2ludHIgPSBody0+YWNrX2ludHI7Ci0JaHdpZi0+Y29uZmlnX2RhdGEgPSBody0+Y29uZmlnOwotfQotCiAvKgogICoJTG9ja3MgZm9yIElERSBzZXR0aW5nIGZ1bmN0aW9uYWxpdHkKICAqLwpAQCAtMzMwLDcgKzE1OSw2IEBACiBzdGF0aWMgaW50IHNldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgKnBvcnRfb3BzID0gaHdpZi0+cG9ydF9vcHM7CiAKIAlpZiAoYXJnIDwgMCB8fCBhcmcgPiAyNTUpCkBAIC0zNDUsOSArMTczLDkgQEAKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJCS8qIHRha2UgbG9jayBmb3IgSURFX0RGTEFHX1tOT19dVU5NQVNLL1tOT19dSU9fMzJCSVQgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgYXJnKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAkJfSBlbHNlCiAJCQlwb3J0X29wcy0+c2V0X3Bpb19tb2RlKGRyaXZlLCBhcmcpOwogCX0gZWxzZSB7CkBAIC00NTMsNyArMjgxLDcgQEAKIHN0YXRpYyBpbnQgZ2VuZXJpY19pZGVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKLQlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBpZGVfZHJpdmVyICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAogCXJldHVybiBkcnYtPnByb2JlID8gZHJ2LT5wcm9iZShkcml2ZSkgOiAtRU5PREVWOwogfQpAQCAtNDYxLDcgKzI4OSw3IEBACiBzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwotCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGlkZV9kcml2ZXIgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCiAJaWYgKGRydi0+cmVtb3ZlKQogCQlkcnYtPnJlbW92ZShkcml2ZSk7CkBAIC00NzIsNyArMzAwLDcgQEAKIHN0YXRpYyB2b2lkIGdlbmVyaWNfaWRlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7Ci0JaWRlX2RyaXZlcl90ICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKIAlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zaHV0ZG93bikKIAkJZHJ2LT5zaHV0ZG93bihkcml2ZSk7CkBAIC02NjAsNiArNDg4LDcgQEAKIAogdm9pZCBpZGVfcG9ydF9hcHBseV9wYXJhbXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CiAJaW50IGk7CiAKIAlpZiAoaWRlX2lnbm9yZV9jYWJsZSAmICgxIDw8IGh3aWYtPmluZGV4KSkgewpAQCAtNjY4LDggKzQ5Nyw4IEBACiAJCWh3aWYtPmNibCA9IEFUQV9DQkxfUEFUQTQwX1NIT1JUOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspCi0JCWlkZV9kZXZfYXBwbHlfcGFyYW1zKCZod2lmLT5kcml2ZXNbaV0sIGkpOworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikKKwkJaWRlX2Rldl9hcHBseV9wYXJhbXMoZHJpdmUsIGkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaXQ4MTcyLmMgYi9kcml2ZXJzL2lkZS9pdDgxNzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaXQ4MTcyLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKiAgICAgIElUODE3MiBJREUgY29udHJvbGxlciBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNoYW5lIE1jRG9uYWxkCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBEUlZfTkFNRSAiSVQ4MTcyIgorCitzdGF0aWMgdm9pZCBpdDgxNzJfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOworCXUxNiBkcml2ZV9lbmFibGVzOworCXUzMiBkcml2ZV90aW1pbmc7CisKKwkvKgorCSAqIFRoZSBoaWdoZXN0IHZhbHVlIG9mIERJT1IvRElPVyBwdWxzZSB3aWR0aCBhbmQgcmVjb3ZlcnkgdGltZQorCSAqIHRoYXQgY2FuIGJlIHNldCBpbiB0aGUgSVQ4MTcyIGlzIDggUENJIGNsb2NrIGN5Y2xlcy4gIEFzIGEgcmVzdWx0LAorCSAqIGl0IGNhbm5vdCBiZSBjb25maWd1cmVkIGZvciBQSU8gbW9kZSAwLiAgVGhpcyB0YWJsZSBzZXRzIHRoZXNlCisJICogcGFyYW1ldGVycyB0byB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgYnkgdGhlIElUODE3Mi4KKwkgKi8KKwlzdGF0aWMgY29uc3QgdTggdGltaW5nc1tdID0geyAweDNmLCAweDNjLCAweDFiLCAweDEyLCAweDBhIH07CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NDAsICZkcml2ZV9lbmFibGVzKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQ0LCAmZHJpdmVfdGltaW5nKTsKKworCS8qCisJICogRW5hYmxlIHBvcnQgMHg0NC4gVGhlIElUODE3MiBzcGVjIGlzIGNvbmZ1c2VkOyBpdCBjYWxscworCSAqIHRoaXMgcmVnaXN0ZXIgdGhlICJTbGF2ZSBJREUgVGltaW5nIFJlZ2lzdGVyIiwgYnV0IGluIGZhY3QsCisJICogaXQgY29udHJvbHMgdGltaW5nIGZvciBib3RoIG1hc3RlciBhbmQgc2xhdmUgZHJpdmVzLgorCSAqLworCWRyaXZlX2VuYWJsZXMgfD0gMHg0MDAwOworCisJZHJpdmVfZW5hYmxlcyAmPSBkcml2ZS0+ZG4gPyAweGMwMDYgOiAweGMwNjA7CisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKKwkJLyogZW5hYmxlIHByZWZldGNoICovCisJCWRyaXZlX2VuYWJsZXMgfD0gMHgwMDA0IDw8IChkcml2ZS0+ZG4gKiA0KTsKKwlpZiAoYXRhX2lkX2hhc19pb3JkeShkcml2ZS0+aWQpKQorCQkvKiBlbmFibGUgSU9SRFkgc2FtcGxlLXBvaW50ICovCisJCWRyaXZlX2VuYWJsZXMgfD0gMHgwMDAyIDw8IChkcml2ZS0+ZG4gKiA0KTsKKworCWRyaXZlX3RpbWluZyAmPSBkcml2ZS0+ZG4gPyAweDAwMDAzZjAwIDogMHgwMDBmYzAwMDsKKwlkcml2ZV90aW1pbmcgfD0gdGltaW5nc1twaW9dIDw8IChkcml2ZS0+ZG4gKiA2ICsgOCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDQwLCBkcml2ZV9lbmFibGVzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgZHJpdmVfdGltaW5nKTsKK30KKworc3RhdGljIHZvaWQgaXQ4MTcyX3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOworCWludCBhX3NwZWVkCQk9IDMgPDwgKGRyaXZlLT5kbiAqIDQpOworCWludCB1X2ZsYWcJCT0gMSA8PCBkcml2ZS0+ZG47CisJaW50IHVfc3BlZWQJCT0gMDsKKwl1OCByZWc0OCwgcmVnNGE7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZyZWc0OCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRhLCAmcmVnNGEpOworCisJaWYgKHNwZWVkID49IFhGRVJfVURNQV8wKSB7CisJCXU4IHVkbWEgPSBzcGVlZCAtIFhGRVJfVURNQV8wOworCQl1X3NwZWVkID0gdWRtYSA8PCAoZHJpdmUtPmRuICogNCk7CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgcmVnNDggfCB1X2ZsYWcpOworCQlyZWc0YSAmPSB+YV9zcGVlZDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0YSwgcmVnNGEgfCB1X3NwZWVkKTsKKwl9IGVsc2UgeworCQljb25zdCB1OCBtd2RtYV90b19waW9bXSA9IHsgMCwgMywgNCB9OworCQl1OCBwaW87CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgcmVnNDggJiB+dV9mbGFnKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0YSwgcmVnNGEgJiB+YV9zcGVlZCk7CisKKwkJcGlvID0gbXdkbWFfdG9fcGlvW3NwZWVkIC0gWEZFUl9NV19ETUFfMF07CisKKwkJaXQ4MTcyX3NldF9waW9fbW9kZShkcml2ZSwgcGlvKTsKKwl9Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgaXQ4MTcyX3BvcnRfb3BzID0geworCS5zZXRfcGlvX21vZGUJPSBpdDgxNzJfc2V0X3Bpb19tb2RlLAorCS5zZXRfZG1hX21vZGUJPSBpdDgxNzJfc2V0X2RtYV9tb2RlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIGl0ODE3Ml9wb3J0X2luZm8gX19kZXZpbml0ZGF0YSA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkucG9ydF9vcHMJPSAmaXQ4MTcyX3BvcnRfb3BzLAorCS5lbmFibGViaXRzCT0geyB7MHg0MSwgMHg4MCwgMHg4MH0sIHsweDAwLCAweDAwLCAweDAwfSB9LAorCS5ob3N0X2ZsYWdzCT0gSURFX0hGTEFHX1NJTkdMRSwKKwkucGlvX21hc2sJPSBBVEFfUElPNCAmIH5BVEFfUElPMCwKKwkubXdkbWFfbWFzawk9IEFUQV9NV0RNQTIsCisJLnVkbWFfbWFzawk9IEFUQV9VRE1BMiwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGl0ODE3Ml9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaWYgKChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKKwkJcmV0dXJuIC1FTk9ERVY7IC8qIElUODE3MiBpcyBtb3JlIHRoYW4gYW4gSURFIGNvbnRyb2xsZXIgKi8KKwlyZXR1cm4gaWRlX3BjaV9pbml0X29uZShkZXYsICZpdDgxNzJfcG9ydF9pbmZvLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGl0ODE3Ml9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkRFVklDRShJVEUsIFBDSV9ERVZJQ0VfSURfSVRFXzgxNzIpLCAwIH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpdDgxNzJfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpdDgxNzJfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiSVQ4MTcyX0lERSIsCisJLmlkX3RhYmxlCT0gaXQ4MTcyX3BjaV90YmwsCisJLnByb2JlCQk9IGl0ODE3Ml9pbml0X29uZSwKKwkucmVtb3ZlCQk9IGlkZV9wY2lfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpdDgxNzJfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJml0ODE3Ml9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGl0ODE3Ml9pZGVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXQ4MTcyX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpdDgxNzJfaWRlX2luaXQpOworbW9kdWxlX2V4aXQoaXQ4MTcyX2lkZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU3RldmUgTG9uZ2VyYmVhbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgSVRFIDgxNzIgSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pdDgyMTMuYyBiL2RyaXZlcnMvaWRlL2l0ODIxMy5jCmluZGV4IDdjMmZlZWIuLmQ3OTY5YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2l0ODIxMy5jCisrKyBiL2RyaXZlcnMvaWRlL2l0ODIxMy5jCkBAIC0yNSw3ICsyNSw3IEBACiAKIHN0YXRpYyB2b2lkIGl0ODIxM19zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCWludCBpc19zbGF2ZQkJPSBkcml2ZS0+ZG4gJiAxOwogCWludCBtYXN0ZXJfcG9ydAkJPSAweDQwOwpAQCAtODIsNyArODIsNyBAQAogCiBzdGF0aWMgdm9pZCBpdDgyMTNfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IG1hc2xhdmUJCT0gMHg0MDsKIAlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZS0+ZG4gKiA0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2l0ODIxeC5jIGIvZHJpdmVycy9pZGUvaXQ4MjF4LmMKaW5kZXggZWYwMDQwOC4uMGJlMjdhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaXQ4MjF4LmMKKysrIGIvZHJpdmVycy9pZGUvaXQ4MjF4LmMKQEAgLTE2NywxMiArMTY3LDEwIEBACiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpZGVfZHJpdmVfdCAqcGFpcjsKKwlpZGVfZHJpdmVfdCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCWludCBjbG9jaywgYWx0Y2xvY2ssIHNlbCA9IDA7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIHY7CiAKLQlwYWlyID0gJmh3aWYtPmRyaXZlc1sxIC0gdW5pdF07Ci0KIAlpZihpdGRldi0+d2FudFswXVswXSA+IGl0ZGV2LT53YW50WzFdWzBdKSB7CiAJCWNsb2NrID0gaXRkZXYtPndhbnRbMF1bMV07CiAJCWFsdGNsb2NrID0gaXRkZXYtPndhbnRbMV1bMV07CkBAIC0yMzksMTUgKzIzNywxMyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwotCWlkZV9kcml2ZV90ICpwYWlyOworCWlkZV9kcml2ZV90ICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIHNldF9waW8gPSBwaW87CiAKIAkvKiBTcGVjIHNheXMgODkgcmVmIGRyaXZlciB1c2VzIDg4ICovCiAJc3RhdGljIHUxNiBwaW9fdGltaW5nc1tdPSB7IDB4QUE4OCwgMHhBMzgyLCAweEExODEsIDB4MzMzMiwgMHgzMTIxIH07CiAJc3RhdGljIHU4IHBpb193YW50W10gICAgPSB7IEFUQV82NiwgQVRBXzY2LCBBVEFfNjYsIEFUQV82NiwgQVRBX0FOWSB9OwogCi0JcGFpciA9ICZod2lmLT5kcml2ZXNbMSAtIHVuaXRdOwotCiAJLyoKIAkgKiBDb21wdXRlIHRoZSBiZXN0IFBJTyBtb2RlIHdlIGNhbiBmb3IgYSBnaXZlbiBkZXZpY2UuIFdlIG11c3QKIAkgKiBwaWNrIGEgc3BlZWQgdGhhdCBkb2VzIG5vdCBjYXVzZSBwcm9ibGVtcyB3aXRoIHRoZSBvdGhlciBkZXZpY2UKQEAgLTI3OSw3ICsyNzUsNyBAQAogICoJdGhlIHNoYXJlZCBNV0RNQS9QSU8gdGltaW5nIHJlZ2lzdGVyLgogICovCiAKLXN0YXRpYyB2b2lkIGl0ODIxeF90dW5lX213ZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgbW9kZV93YW50ZWQpCitzdGF0aWMgdm9pZCBpdDgyMXhfdHVuZV9td2RtYShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwpAQCAtMzE2LDcgKzMxMiw3IEBACiAgKgljb250cm9sbGVyIHdoZW4gZG9pbmcgVURNQSBtb2RlcyBpbiBwYXNzIHRocm91Z2guCiAgKi8KIAotc3RhdGljIHZvaWQgaXQ4MjF4X3R1bmVfdWRtYSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIG1vZGVfd2FudGVkKQorc3RhdGljIHZvaWQgaXQ4MjF4X3R1bmVfdWRtYShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwpAQCAtNTE2LDYgKzUxMiw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL25zODc0MTUuYyBiL2RyaXZlcnMvaWRlL25zODc0MTUuYwppbmRleCAxMzc4OTA2Li44MzY0M2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9uczg3NDE1LmMKKysrIGIvZHJpdmVycy9pZGUvbnM4NzQxNS5jCkBAIC01Niw3ICs1Niw3IEBACiAJcmV0dXJuIHN1cGVyaW9faWRlX2luYihod2lmLT5pb19wb3J0cy5zdGF0dXNfYWRkcik7CiB9CiAKLXN0YXRpYyB1OCBzdXBlcmlvX3JlYWRfc2ZmX2RtYV9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1OCBzdXBlcmlvX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlyZXR1cm4gc3VwZXJpb19pZGVfaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwogfQpAQCAtMTA5LDcgKzEwOSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBzdXBlcmlvX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBzdXBlcmlvX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApAQCAtMTMyLDE4ICsxMzEsMjAgQEAKIAl0bXAgPSBzdXBlcmlvX2lkZV9pbmIoZG1hX3N0YXQpOwogCW91dGIodG1wIHwgMHg2NiwgZG1hX3N0YXQpOwogfQorI2Vsc2UKKyNkZWZpbmUgc3VwZXJpb19kbWFfc2ZmX3JlYWRfc3RhdHVzIGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzCiAjZW5kaWYKIAogc3RhdGljIHVuc2lnbmVkIGludCBuczg3NDE1X2NvdW50ID0gMCwgbnM4NzQxNV9jb250cm9sW01BWF9IV0lGU10gPSB7IDAgfTsKIAogLyoKICAqIFRoaXMgcm91dGluZSBlaXRoZXIgZW5hYmxlcy9kaXNhYmxlcyAoYWNjb3JkaW5nIHRvIElERV9ERkxBR19QUkVTRU5UKQotICogdGhlIElSUSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQgKEhXSUYoZHJpdmUpKSwKKyAqIHRoZSBJUlEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0LAogICogYW5kIHNlbGVjdHMgZWl0aGVyIFBJTyBvciBETUEgaGFuZHNoYWtpbmcgZm9yIHRoZSBuZXh0IEkvTyBvcGVyYXRpb24uCiAgKi8KIHN0YXRpYyB2b2lkIG5zODc0MTVfcHJlcGFyZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgdXNlX2RtYSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdW5zaWduZWQgaW50IGJpdCwgb3RoZXIsIG5ldywgKm9sZCA9ICh1bnNpZ25lZCBpbnQgKikgaHdpZi0+c2VsZWN0X2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE5NywxMSArMTk4LDExIEBACiAKIHN0YXRpYyBpbnQgbnM4NzQxNV9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICAgICAgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMDsKIAogCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwotCWRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCWRtYV9zdGF0ID0gaHdpZi0+ZG1hX29wcy0+ZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAkvKiBnZXQgRE1BIGNvbW1hbmQgbW9kZSAqLwogCWRtYV9jbWQgPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCk7CiAJLyogc3RvcCBETUEgKi8KQEAgLTMwOCw2ICszMDksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IHN1cGVyaW9fZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBuczg3NDE1X2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BhbG1fYmszNzEwLmMgYi9kcml2ZXJzL2lkZS9wYWxtX2JrMzcxMC5jCmluZGV4IDEyMmVkM2MuLmE3YWM0OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BhbG1fYmszNzEwLmMKKysrIGIvZHJpdmVycy9pZGUvcGFsbV9iazM3MTAuYwpAQCAtMzI0LDggKzMyNCw2IEBACiAKIAlod2lmLT5kbWFfYmFzZSA9IGh3aWYtPmlvX3BvcnRzLmRhdGFfYWRkciAtIElERV9QQUxNX0FUQV9QUklfUkVHX09GRlNFVDsKIAotCWh3aWYtPmRtYV9vcHMgPSAmc2ZmX2RtYV9vcHM7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM4LDYgKzMzNiw3IEBACiBzdGF0aWMgc3RydWN0IGlkZV9wb3J0X2luZm8gX19kZXZpbml0ZGF0YSBwYWxtX2JrMzcxMF9wb3J0X2luZm8gPSB7CiAJLmluaXRfZG1hCQk9IHBhbG1fYmszNzEwX2luaXRfZG1hLAogCS5wb3J0X29wcwkJPSAmcGFsbV9iazM3MTBfcG9ydHNfb3BzLAorCS5kbWFfb3BzCQk9ICZzZmZfZG1hX29wcywKIAkuaG9zdF9mbGFncwkJPSBJREVfSEZMQUdfTU1JTywKIAkucGlvX21hc2sJCT0gQVRBX1BJTzQsCiAJLm13ZG1hX21hc2sJCT0gQVRBX01XRE1BMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X25ldy5jIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfbmV3LmMKaW5kZXggMjExYWU0Ni4uZjIxMjkwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGRjMjAyeHhfbmV3LmMKKysrIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfbmV3LmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiBzdGF0aWMgdm9pZCBwZGNuZXdfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IGFkagkJCT0gKGRyaXZlLT5kbiAmIDEpID8gMHgwOCA6IDB4MDA7CiAKQEAgLTIxOSw3ICsyMTksNyBAQAogCSAqIERlbGV0ZWQgdGhpcyBiZWNhdXNlIGl0IGlzIHJlZHVuZGFudCBmcm9tIHRoZSBjYWxsZXIuCiAJICovCiAJcHJpbnRrKEtFUk5fV0FSTklORyAicGRjMjAyeHhfbmV3OiAlcyBjaGFubmVsIHJlc2V0LlxuIiwKLQkJSFdJRihkcml2ZSktPmNoYW5uZWwgPyAiU2Vjb25kYXJ5IiA6ICJQcmltYXJ5Iik7CisJCWRyaXZlLT5od2lmLT5jaGFubmVsID8gIlNlY29uZGFyeSIgOiAiUHJpbWFyeSIpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKaW5kZXggNjI0ZTYyZS4uOTcxOTMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKKysrIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogc3RhdGljIHZvaWQgcGRjMjAyeHhfc2V0X21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggZHJpdmVfcGNpCQk9IDB4NjAgKyAoZHJpdmUtPmRuIDw8IDIpOwogCkBAIC0xNjksOCArMTY5LDggQEAKIAlpZiAoZHJpdmUtPmN1cnJlbnRfc3BlZWQgPiBYRkVSX1VETUFfMikKIAkJcGRjX29sZF9lbmFibGVfNjZNSHpfY2xvY2soZHJpdmUtPmh3aWYpOwogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2sgfHwgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTEJBNDgpKSB7Ci0JCXN0cnVjdCByZXF1ZXN0ICpycQk9IEhXR1JPVVAoZHJpdmUpLT5ycTsKLQkJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCQlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJCXN0cnVjdCByZXF1ZXN0ICpycQk9IGh3aWYtPnJxOwogCQl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5leHRyYV9iYXNlIC0gMTY7CiAJCXVuc2lnbmVkIGxvbmcgYXRhcGlfcmVnCT0gaGlnaF8xNiArIChod2lmLT5jaGFubmVsID8gMHgyNCA6IDB4MjApOwogCQl1MzIgd29yZF9jb3VudAk9IDA7CkBAIC0xODksNyArMTg5LDcgQEAKIHN0YXRpYyBpbnQgcGRjMjAyeHhfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayB8fCAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCkpIHsKLQkJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCQlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmV4dHJhX2Jhc2UgLSAxNjsKIAkJdW5zaWduZWQgbG9uZyBhdGFwaV9yZWcJPSBoaWdoXzE2ICsgKGh3aWYtPmNoYW5uZWwgPyAweDI0IDogMHgyMCk7CiAJCXU4IGNsb2NrCQk9IDA7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAogc3RhdGljIGludCBwZGMyMDJ4eF9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBoaWdoXzE2CT0gaHdpZi0+ZXh0cmFfYmFzZSAtIDE2OwogCXU4IGRtYV9zdGF0CQk9IGluYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKIAl1OCBzYzFkCQkJPSBpbmIoaGlnaF8xNiArIDB4MDAxZCk7CkBAIC0yNDMsNyArMjQzLDcgQEAKIAogc3RhdGljIHZvaWQgcGRjMjAyeHhfcmVzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCWlkZV9od2lmX3QgKm1hdGUJPSBod2lmLT5tYXRlOwogCiAJcGRjMjAyeHhfcmVzZXRfaG9zdChod2lmKTsKQEAgLTMzNyw2ICszMzcsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gcGRjMjAyeHhfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gcGRjMjAyeHhfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBwZGMyMDJ4eF9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBwZGMyMDI2eF9kbWFfb3BzID0gewpAQCAtMzQ4LDYgKzM0OSw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBwZGMyMDJ4eF9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBwZGMyMDJ4eF9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IHBkYzIwMnh4X2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiAjZGVmaW5lIERFQ0xBUkVfUERDMjAyNlhfREVWKHVkbWEsIHNlY3RvcnMpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BpaXguYyBiL2RyaXZlcnMvaWRlL3BpaXguYwppbmRleCA2MWQyZDkyLi5mMWUyZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9waWl4LmMKKysrIGIvZHJpdmVycy9pZGUvcGlpeC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKIHN0YXRpYyB2b2lkIHBpaXhfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXNfc2xhdmUJCT0gZHJpdmUtPmRuICYgMTsKIAlpbnQgbWFzdGVyX3BvcnQJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAKIHN0YXRpYyB2b2lkIHBpaXhfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IG1hc2xhdmUJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOwogCWludCBhX3NwZWVkCQk9IDMgPDwgKGRyaXZlLT5kbiAqIDQpOwpAQCAtMjI0LDcgKzIyNCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGljaF9jbGVhcl9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggZG1hX3N0YXQ7CiAKIAkvKgpAQCAtMjYwLDYgKzI2MCw4IEBACiAJeyAweDI3REYsIDB4MTAzQywgMHgzMEExIH0sCS8qIElDSDcgb24gSFAgQ29tcGFxIG5jMjQwMCAqLwogCXsgMHgyN0RGLCAweDEwNzEsIDB4RDIyMSB9LAkvKiBJQ0g3IG9uIEhlcmN1bGVzIEVDLTkwMCAqLwogCXsgMHgyNENBLCAweDEwMjUsIDB4MDA2MSB9LAkvKiBJQ0g0IG9uIEFjZXIgQXNwaXJlIDIwMjNXTE1pICovCisJeyAweDI0Q0EsIDB4MTAyNSwgMHgwMDNkIH0sCS8qIElDSDQgb24gQUNFUiBUTTI5MCAqLworCXsgMHgyNjZGLCAweDEwMjUsIDB4MDA2NiB9LAkvKiBJQ0g2IG9uIEFDRVIgQXNwaXJlIDE2OTRXTE1pICovCiAJeyAweDI2NTMsIDB4MTA0MywgMHg4MkQ4IH0sCS8qIElDSDZNIG9uIEFzdXMgRWVlIDcwMSAqLwogCS8qIGVuZCBtYXJrZXIgKi8KIAl7IDAsIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BtYWMuYyBiL2RyaXZlcnMvaWRlL3BtYWMuYwppbmRleCA3YzQ4MWJiLi43NDYyNWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wbWFjLmMKKysrIGIvZHJpdmVycy9pZGUvcG1hYy5jCkBAIC05NTUsNyArOTU1LDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IHBtYWNfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gcG1hY19zZXRfaXJxLAogCkBAIC0xNTEzLDEwICsxNTEyLDEwIEBACiBzdGF0aWMgaW50CiBwbWFjX2lkZV9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJcG1hY19pZGVfaHdpZl90ICpwbWlmID0KIAkJKHBtYWNfaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YShod2lmLT5nZW5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIGF0YTQgPSAocG1pZi0+a2luZCA9PSBjb250cm9sbGVyX2tsX2F0YTQpOwogCiAJaWYgKCFwbWFjX2lkZV9idWlsZF9kbWF0YWJsZShkcml2ZSwgcnEpKSB7CkBAIC0xNjM3LDcgKzE2MzYsNyBAQAogCQkJYnJlYWs7CiAJCWlmICgrK3RpbWVvdXQgPiAxMDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlkZSVkLCBpZGVfZG1hX3Rlc3RfaXJxIFwKLQkJCXRpbWVvdXQgZmx1c2hpbmcgY2hhbm5lbFxuIiwgSFdJRihkcml2ZSktPmluZGV4KTsKKwkJCXRpbWVvdXQgZmx1c2hpbmcgY2hhbm5lbFxuIiwgaHdpZi0+aW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KIAl9CQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcTQwaWRlLmMgYi9kcml2ZXJzL2lkZS9xNDBpZGUuYwppbmRleCA0YWY0YThjLi45ZjljMGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9xNDBpZGUuYworKysgYi9kcml2ZXJzL2lkZS9xNDBpZGUuYwpAQCAtOTksNyArOTksNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9xZDY1eHguYyBiL2RyaXZlcnMvaWRlL3FkNjV4eC5jCmluZGV4IGJjMjdjN2EuLjViMmUzYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9xZDY1eHguYworKysgYi9kcml2ZXJzL2lkZS9xZDY1eHguYwpAQCAtMjAyLDcgKzIwMiw4IEBACiAJCXJlY292ZXJ5X3RpbWUgPSBkcml2ZS0+aWRbQVRBX0lEX0VJREVfUElPXSAtIDEyMDsKIAl9CiAKLQlxZF9zZXRfdGltaW5nKGRyaXZlLCBxZDY1MDBfY29tcHV0ZV90aW1pbmcoSFdJRihkcml2ZSksIGFjdGl2ZV90aW1lLCByZWNvdmVyeV90aW1lKSk7CisJcWRfc2V0X3RpbWluZyhkcml2ZSwgcWQ2NTAwX2NvbXB1dGVfdGltaW5nKGRyaXZlLT5od2lmLAorCQkJCWFjdGl2ZV90aW1lLCByZWNvdmVyeV90aW1lKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHFkNjU4MF9zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCkBAIC0yNDUsMTEgKzI0NiwxMSBAQAogCQlwcmludGsoS0VSTl9JTkZPICIlczogUElPIG1vZGUlZFxuIiwgZHJpdmUtPm5hbWUscGlvKTsKIAl9CiAKLQlpZiAoIUhXSUYoZHJpdmUpLT5jaGFubmVsICYmIGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgeworCWlmICghaHdpZi0+Y2hhbm5lbCAmJiBkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spIHsKIAkJb3V0YigweDVmLCBRRF9DT05UUk9MX1BPUlQpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQVRBUEk6IGRpc2FibGVkIHJlYWQtYWhlYWQgRklGTyAiCiAJCQkiYW5kIHBvc3Qtd3JpdGUgYnVmZmVyIG9uICVzLlxuIiwKLQkJCWRyaXZlLT5uYW1lLCBIV0lGKGRyaXZlKS0+bmFtZSk7CisJCQlkcml2ZS0+bmFtZSwgaHdpZi0+bmFtZSk7CiAJfQogCiAJcWRfc2V0X3RpbWluZyhkcml2ZSwgcWQ2NTgwX2NvbXB1dGVfdGltaW5nKGFjdGl2ZV90aW1lLCByZWNvdmVyeV90aW1lKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9xZDY1eHguaCBiL2RyaXZlcnMvaWRlL3FkNjV4eC5oCmluZGV4IGM4M2RlYTguLjY2MzZmOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3FkNjV4eC5oCisrKyBiL2RyaXZlcnMvaWRlL3FkNjV4eC5oCkBAIC0zMSw4ICszMSw4IEBACiAKICNkZWZpbmUgUURfQ09ORklHKGh3aWYpCQkoKGh3aWYpLT5jb25maWdfZGF0YSAmIDB4MDBmZikKIAotI2RlZmluZSBRRF9USU1JTkcoZHJpdmUpCShieXRlKSgoKGRyaXZlKS0+ZHJpdmVfZGF0YSkgJiAweDAwZmYpCi0jZGVmaW5lIFFEX1RJTVJFRyhkcml2ZSkJKGJ5dGUpKCgoKGRyaXZlKS0+ZHJpdmVfZGF0YSkgJiAweGZmMDApID4+IDgpCisjZGVmaW5lIFFEX1RJTUlORyhkcml2ZSkJKHU4KSgoKGRyaXZlKS0+ZHJpdmVfZGF0YSkgJiAweDAwZmYpCisjZGVmaW5lIFFEX1RJTVJFRyhkcml2ZSkJKHU4KSgoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHhmZjAwKSA+PiA4KQogCiAjZGVmaW5lIFFENjUwMF9ERUZfREFUQQkJKChRRF9USU0xX1BPUlQ8PDgpIHwgKFFEX0lEMyA/IDB4MGMgOiAweDA4KSkKICNkZWZpbmUgUUQ2NTgwX0RFRl9EQVRBCQkoKFFEX1RJTTFfUE9SVDw8OCkgfCAoUURfSUQzID8gMHgwYSA6IDB4MDApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2MxMjAwLmMgYi9kcml2ZXJzL2lkZS9zYzEyMDAuYwppbmRleCBlYzdmNzY2Li5kYmRkMjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zYzEyMDAuYworKysgYi9kcml2ZXJzL2lkZS9zYzEyMDAuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAKIHN0YXRpYyB2b2lkIHNjMTIwMF9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBtb2RlKQogewotCWlkZV9od2lmX3QJCSpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdAkJKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldgkJKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1bnNpZ25lZCBpbnQJCXJlZywgdGltaW5nczsKIAl1bnNpZ25lZCBzaG9ydAkJcGNpX2Nsb2NrOwpAQCAtMTcwLDkgKzE3MCw5IEBACiAgKi8KIHN0YXRpYyBpbnQgc2MxMjAwX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBkbWFfYmFzZSA9IGh3aWYtPmRtYV9iYXNlOwotCWJ5dGUgZG1hX3N0YXQ7CisJdTggZG1hX3N0YXQ7CiAKIAlkbWFfc3RhdCA9IGluYihkbWFfYmFzZSsyKTsJCS8qIGdldCBETUEgc3RhdHVzICovCiAKQEAgLTE5OSw3ICsxOTksNyBAQAogCiBzdGF0aWMgdm9pZCBzYzEyMDBfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QJKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90CSpod2lmID0gZHJpdmUtPmh3aWY7CiAJaW50CQltb2RlID0gLTE7CiAKIAkvKgpAQCAtMjkyLDYgKzI5Miw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gc2MxMjAwX2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NjY19wYXRhLmMgYi9kcml2ZXJzL2lkZS9zY2NfcGF0YS5jCmluZGV4IDBmNDhmOWQuLjhkMjMxNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NjY19wYXRhLmMKKysrIGIvZHJpdmVycy9pZGUvc2NjX3BhdGEuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJcmV0dXJuICh1OClpbl9iZTMyKCh2b2lkICopaHdpZi0+aW9fcG9ydHMuY3RsX2FkZHIpOwogfQogCi1zdGF0aWMgdTggc2NjX3JlYWRfc2ZmX2RtYV9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1OCBzY2NfZG1hX3NmZl9yZWFkX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmKQogewogCXJldHVybiAodTgpaW5fYmUzMigodm9pZCAqKShod2lmLT5kbWFfYmFzZSArIDQpKTsKIH0KQEAgLTIxNyw3ICsyMTcsNyBAQAogCiBzdGF0aWMgdm9pZCBzY2Nfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHNjY19wb3J0cyAqcG9ydHMgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCXVuc2lnbmVkIGxvbmcgY3RsX2Jhc2UgPSBwb3J0cy0+Y3RsOwogCXVuc2lnbmVkIGxvbmcgY2NrY3RybF9wb3J0ID0gY3RsX2Jhc2UgKyAweGZmMDsKQEAgLTI0OSw3ICsyNDksNyBAQAogCiBzdGF0aWMgdm9pZCBzY2Nfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3Qgc2NjX3BvcnRzICpwb3J0cyA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJdW5zaWduZWQgbG9uZyBjdGxfYmFzZSA9IHBvcnRzLT5jdGw7CiAJdW5zaWduZWQgbG9uZyBjY2tjdHJsX3BvcnQgPSBjdGxfYmFzZSArIDB4ZmYwOwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJdW5zaWduZWQgbG9uZyBzY3Jjc3RfcG9ydCA9IGN0bF9iYXNlICsgMHgwMTQ7CiAJdW5zaWduZWQgbG9uZyB1ZGVudnRfcG9ydCA9IGN0bF9iYXNlICsgMHgwMTg7CiAJdW5zaWduZWQgbG9uZyB0ZHZoc2VsX3BvcnQgICA9IGN0bF9iYXNlICsgMHgwMjA7Ci0JaW50IGlzX3NsYXZlID0gKCZod2lmLT5kcml2ZXNbMV0gPT0gZHJpdmUpOworCWludCBpc19zbGF2ZSA9IGRyaXZlLT5kbiAmIDE7CiAJaW50IG9mZnNldCwgaWR4OwogCXVuc2lnbmVkIGxvbmcgcmVnOwogCXVuc2lnbmVkIGxvbmcgamNhY3RzZWw7CkBAIC0yOTIsNyArMjkyLDcgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDE7Ci0JdTggZG1hX3N0YXQgPSBzY2NfaWRlX2luYihod2lmLT5kbWFfYmFzZSArIDQpOworCXU4IGRtYV9zdGF0ID0gc2NjX2RtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAlpZiAob24pCiAJCWRtYV9zdGF0IHw9ICgxIDw8ICg1ICsgdW5pdCkpOwpAQCAtMzE2LDcgKzMxNiw3IEBACiBzdGF0aWMgaW50IHNjY19kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdW5zaWduZWQgaW50IHJlYWRpbmc7CiAJdTggZG1hX3N0YXQ7CiAKQEAgLTMzOCw3ICszMzgsNyBAQAogCW91dF9iZTMyKCh2b2lkIF9faW9tZW0gKilod2lmLT5kbWFfYmFzZSwgcmVhZGluZyk7CiAKIAkvKiByZWFkIERNQSBzdGF0dXMgZm9yIElOVFIgJiBFUlJPUiBmbGFncyAqLwotCWRtYV9zdGF0ID0gaW5fYmUzMigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgNCkpOworCWRtYV9zdGF0ID0gc2NjX2RtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAkvKiBjbGVhciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KIAlvdXRfYmUzMigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgNCksIGRtYV9zdGF0IHwgNik7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAkvKiBzdG9wIERNQSAqLwogCXNjY19pZGVfb3V0YihkbWFfY21kICYgfjEsIGh3aWYtPmRtYV9iYXNlKTsKIAkvKiBnZXQgRE1BIHN0YXR1cyAqLwotCWRtYV9zdGF0ID0gc2NjX2lkZV9pbmIoaHdpZi0+ZG1hX2Jhc2UgKyA0KTsKKwlkbWFfc3RhdCA9IHNjY19kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCS8qIGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLwogCXNjY19pZGVfb3V0YihkbWFfc3RhdCB8IDYsIGh3aWYtPmRtYV9iYXNlICsgNCk7CiAJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCkBAIC0zODcsNyArMzg3LDcgQEAKIAogc3RhdGljIGludCBzY2NfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl2b2lkIF9faW9tZW0gKmRtYV9iYXNlID0gKHZvaWQgX19pb21lbSAqKWh3aWYtPmRtYV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgaW50c3RzX3BvcnQgPSBod2lmLT5kbWFfYmFzZSArIDB4MDE0OwogCXUzMiByZWc7CkBAIC00MDUsMTcgKzQwNSwxOCBAQAogCQkJICAgICAgIGRyaXZlLT5uYW1lKTsKIAkJCWRhdGFfbG9zcyA9IDE7CiAJCQlpZiAocmV0cnkrKykgewotCQkJCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKLQkJCQlpbnQgdW5pdDsKKwkJCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKKwkJCQlpZGVfZHJpdmVfdCAqZHJpdmU7CisJCQkJaW50IGk7CisKIAkJCQkvKiBFUlJPUl9SRVNFVCBhbmQgZHJpdmUtPmNyY19jb3VudCBhcmUgbmVlZGVkCiAJCQkJICogdG8gcmVkdWNlIERNQSB0cmFuc2ZlciBtb2RlIGluIHJldHJ5IHByb2Nlc3MuCiAJCQkJICovCiAJCQkJaWYgKHJxKQogCQkJCQlycS0+ZXJyb3JzIHw9IEVSUk9SX1JFU0VUOwotCQkJCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyB1bml0KyspIHsKLQkJCQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKKworCQkJCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikKIAkJCQkJZHJpdmUtPmNyY19jb3VudCsrOwotCQkJCX0KIAkJCX0KIAkJfQogCX0KQEAgLTQ5Niw3ICs0OTcsNyBAQAogLyogcmV0dXJucyAxIGlmIGRtYSBpcnEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBzY2NfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXUzMiBpbnRfc3RhdCA9IGluX2JlMzIoKHZvaWQgX19pb21lbSAqKWh3aWYtPmRtYV9iYXNlICsgMHgwMTQpOwogCiAJLyogU0NDIGVycmF0YSBBMjUyLEEzMDggd29ya2Fyb3VuZDogU3RlcDQgKi8KQEAgLTg1Miw3ICs4NTMsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gc2NjX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gc2NjX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBzY2NfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBzY2NfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IHNjY19zZXRfaXJxLAogCkBAIC04NzksNiArODc5LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IHNjY19kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBzY2NfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKICNkZWZpbmUgREVDTEFSRV9TQ0NfREVWKG5hbWVfc3RyKQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2lkZS9zZXJ2ZXJ3b3Jrcy5jCmluZGV4IDQzN2JjOTEuLjM4MjEwMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NlcnZlcndvcmtzLmMKKysrIGIvZHJpdmVycy9pZGUvc2VydmVyd29ya3MuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJc3RhdGljIGNvbnN0IHU4IGRtYV9tb2Rlc1tdCQk9IHsgMHg3NywgMHgyMSwgMHgyMCB9OwogCXN0YXRpYyBjb25zdCB1OCBkcml2ZV9wY2kyW10JCT0geyAweDQ1LCAweDQ0LCAweDQ3LCAweDQ2IH07CiAKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMgYi9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYwppbmRleCA5ZjFmOTE2My4uZTg1ZDFlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKKysrIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCSAqIHdlIHR1bmUgdGhlIGRyaXZlIHRoZW4gdHJ5IHRvIGdyYWIgRE1BIG93bmVyc2hpcCBpZiB3ZSB3YW50IHRvIGJlCiAJICogdGhlIERNQSBlbmQuICBUaGlzIGhhcyB0byBiZSBiZWNvbWUgZHluYW1pYyB0byBoYW5kbGUgaG90LXBsdWcuCiAJICovCi0JZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCWlmICgoZG1hX3N0YXQgJiAweDgwKSAmJiBod2lmLT5tYXRlICYmIGh3aWYtPm1hdGUtPmRtYV9iYXNlKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzICVzOiBzaW1wbGV4IGRldmljZTogRE1BIGRpc2FibGVkXG4iLAogCQkJZC0+bmFtZSwgcGNpX25hbWUoZGV2KSk7CkBAIC0zNzcsNiArMzc3LDkgQEAKIAogCQlod2lmLT5kbWFfYmFzZSA9IGJhc2U7CiAKKwkJaWYgKGh3aWYtPmRtYV9vcHMgPT0gTlVMTCkKKwkJCWh3aWYtPmRtYV9vcHMgPSAmc2ZmX2RtYV9vcHM7CisKIAkJaWYgKGlkZV9wY2lfY2hlY2tfc2ltcGxleChod2lmLCBkKSA8IDApCiAJCQlyZXR1cm4gLTE7CiAKQEAgLTM5Myw4ICszOTYsNiBAQAogCiAJCWlmIChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKSkKIAkJCXJldHVybiAtMTsKLQotCQlod2lmLT5kbWFfb3BzID0gJnNmZl9kbWFfb3BzOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDcxLDcgKzQ3Miw3IEBACiAJICovCiAKIAlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgY2hhbm5lbHM7ICsrcG9ydCkgewotCQljb25zdCBpZGVfcGNpX2VuYWJsZWJpdF90ICplID0gJihkLT5lbmFibGViaXRzW3BvcnRdKTsKKwkJY29uc3Qgc3RydWN0IGlkZV9wY2lfZW5hYmxlYml0ICplID0gJmQtPmVuYWJsZWJpdHNbcG9ydF07CiAKIAkJaWYgKGUtPnJlZyAmJiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBlLT5yZWcsICZ0bXApIHx8CiAJCSAgICAodG1wICYgZS0+bWFzaykgIT0gZS0+dmFsKSkgewpAQCAtNTE5LDggKzUyMCw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JLyogSXMgaXQgYW4gIklERSBzdG9yYWdlIiBkZXZpY2UgaW4gbm9uLVBDSSBtb2RlPyAqLwotCWlmICgoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUgJiYgKGRldi0+Y2xhc3MgJiA1KSAhPSA1KSB7CisJaWYgKGlkZV9wY2lfaXNfaW5fY29tcGF0aWJpbGl0eV9tb2RlKGRldikpIHsKIAkJaWYgKG5vaXN5KQogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXM6IG5vdCAxMDAlJSBuYXRpdmUgbW9kZTogd2lsbCAiCiAJCQkJInByb2JlIGlycXMgbGF0ZXJcbiIsIGQtPm5hbWUsIHBjaV9uYW1lKGRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2dpaW9jNC5jIGIvZHJpdmVycy9pZGUvc2dpaW9jNC5jCmluZGV4IGE2ODdhN2QuLmZkYjlkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NnaWlvYzQuYworKysgYi9kcml2ZXJzL2lkZS9zZ2lpb2M0LmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogc2dpaW9jNF9jbGVhcmlycShpZGVfZHJpdmVfdCAqIGRyaXZlKQogewogCXUzMiBpbnRyX3JlZzsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBpZGVfaW9fcG9ydHMgKmlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwogCXVuc2lnbmVkIGxvbmcgb3RoZXJfaXIgPSBpb19wb3J0cy0+aXJxX2FkZHIgKyAoSU9DNF9JTlRSX1JFRyA8PCAyKTsKIApAQCAtMTgxLDcgKzE4MSw3IEBACiAKIHN0YXRpYyB2b2lkIHNnaWlvYzRfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgaW9jNF9kbWFfYWRkciA9IGh3aWYtPmRtYV9iYXNlICsgSU9DNF9ETUFfQ1RSTCAqIDQ7CiAJdW5zaWduZWQgaW50IHJlZyA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilpb2M0X2RtYV9hZGRyKTsKIAl1bnNpZ25lZCBpbnQgdGVtcF9yZWcgPSByZWcgfCBJT0M0X1NfRE1BX1NUQVJUOwpAQCAtMjA5LDcgKzIwOSw3IEBACiBzdGF0aWMgaW50IHNnaWlvYzRfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJdTMyIGlvYzRfZG1hLCBiY19kZXYsIGJjX21lbSwgbnVtLCB2YWxpZCA9IDAsIGNudCA9IDA7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGRtYV9iYXNlID0gaHdpZi0+ZG1hX2Jhc2U7CiAJaW50IGRtYV9zdGF0ID0gMDsKIAl1bnNpZ25lZCBsb25nICplbmRpbmdfZG1hID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKQEAgLTI3MSw3ICsyNzEsNyBAQAogLyogcmV0dXJucyAxIGlmIGRtYSBpcnEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBzZ2lpb2M0X2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JcmV0dXJuIHNnaWlvYzRfY2hlY2tpcnEoSFdJRihkcml2ZSkpOworCXJldHVybiBzZ2lpb2M0X2NoZWNraXJxKGRyaXZlLT5od2lmKTsKIH0KIAogc3RhdGljIHZvaWQgc2dpaW9jNF9kbWFfaG9zdF9zZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgb24pCkBAIC0zNjcsNyArMzY3LDcgQEAKIHNnaWlvYzRfY29uZmlndXJlX2Zvcl9kbWEoaW50IGRtYV9kaXJlY3Rpb24sIGlkZV9kcml2ZV90ICogZHJpdmUpCiB7CiAJdTMyIGlvYzRfZG1hOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBkbWFfYmFzZSA9IGh3aWYtPmRtYV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgaW9jNF9kbWFfYWRkciA9IGRtYV9iYXNlICsgSU9DNF9ETUFfQ1RSTCAqIDQ7CiAJdTMyIGRtYV9hZGRyLCBlbmRpbmdfZG1hX2FkZHI7CkBAIC00MjcsNyArNDI3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHNnaWlvYzRfYnVpbGRfZG1hX3RhYmxlKGlkZV9kcml2ZV90ICogZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGRkaXIpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBpbnQgKnRhYmxlID0gaHdpZi0+ZG1hdGFibGVfY3B1OwogCXVuc2lnbmVkIGludCBjb3VudCA9IDAsIGkgPSAxOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CkBAIC00OTIsNyArNDkyLDcgQEAKIAogc3RhdGljIGludCBzZ2lpb2M0X2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCWludCBkZGlyOwogCkBAIC01MjMsNyArNTIzLDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IHNnaWlvYzRfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NpaW1hZ2UuYyBiL2RyaXZlcnMvaWRlL3NpaW1hZ2UuYwppbmRleCA3ZDYyMmQyLi5jYjJiMzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zaWltYWdlLmMKKysrIGIvZHJpdmVycy9pZGUvc2lpbWFnZS5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNpaW1hZ2Vfc2VsZGV2KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHIpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGJhc2UJPSAodW5zaWduZWQgbG9uZylod2lmLT5od2lmX2RhdGE7CiAJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMTsKIApAQCAtMjQzLDcgKzI0Myw3IEBACiAJc3RhdGljIGNvbnN0IHUxNiB0Zl9zcGVlZFtdICAgPSB7IDB4MzI4YSwgMHgyMjgzLCAweDEyODEsIDB4MTBjMywgMHgxMGMxIH07CiAJc3RhdGljIGNvbnN0IHUxNiBkYXRhX3NwZWVkW10gPSB7IDB4MzI4YSwgMHgyMjgzLCAweDExMDQsIDB4MTBjMywgMHgxMGMxIH07CiAKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaWRlX2RyaXZlX3QgKnBhaXIJPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAl1MzIgc3BlZWR0CQk9IDA7CkBAIC0zMDAsNyArMzAwLDcgQEAKIAlzdGF0aWMgY29uc3QgdTggdWx0cmE1W10gPSB7IDB4MEMsIDB4MDcsIDB4MDUsIDB4MDQsIDB4MDIsIDB4MDEgfTsKIAlzdGF0aWMgY29uc3QgdTE2IGRtYVtdCSA9IHsgMHgyMjA4LCAweDEwQzIsIDB4MTBDMSB9OwogCi0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXVuc2lnbmVkIGxvbmcgYmFzZQk9ICh1bnNpZ25lZCBsb25nKWh3aWYtPmh3aWZfZGF0YTsKIAl1MTYgdWx0cmEgPSAwLCBtdWx0aQk9IDA7CkBAIC0zNDAsNyArMzQwLDcgQEAKIC8qIHJldHVybnMgMSBpZiBkbWEgaXJxIGlzc3VlZCwgMCBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgc2lpbWFnZV9pb19kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBkbWFfYWx0c3RhdAkJPSAwOwogCXVuc2lnbmVkIGxvbmcgYWRkcgk9IHNpaW1hZ2Vfc2VscmVnKGh3aWYsIDEpOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2lpbWFnZV9tbWlvX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGFkZHIJPSBzaWltYWdlX3NlbHJlZyhod2lmLCAweDEpOwogCXZvaWQgX19pb21lbSAqc2F0YV9lcnJvcl9hZGRyCiAJCT0gKHZvaWQgX19pb21lbSAqKWh3aWYtPnNhdGFfc2NyW1NBVEFfRVJST1JfT0ZGU0VUXTsKQEAgLTcxNyw2ICs3MTcsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gc2lpbWFnZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKICNkZWZpbmUgREVDTEFSRV9TSUlfREVWKHBfb3BzKQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zaXM1NTEzLmMgYi9kcml2ZXJzL2lkZS9zaXM1NTEzLmMKaW5kZXggYWQzMmUxOC4uOWVjMWE0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2lzNTUxMy5jCisrKyBiL2RyaXZlcnMvaWRlL3NpczU1MTMuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiAKIHN0YXRpYyB2b2lkIGNvbmZpZ19kcml2ZV9hcnRfcndwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggcmVnNGJoCQk9IDA7CiAJdTggcndfcHJlZmV0Y2gJCT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMgYi9kcml2ZXJzL2lkZS9zbDgyYzEwNS5jCmluZGV4IDg0ZGMzMzYuLjQ4Y2M3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMKKysrIGIvZHJpdmVycy9pZGUvc2w4MmMxMDUuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNsODJjMTA1X2RtYV9sb3N0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXUzMiB2YWwsIG1hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IENUUkxfSURFX0lSUUIgOiBDVFJMX0lERV9JUlFBOwogCXU4IGRtYV9jbWQ7CkBAIC0xNzcsNyArMTc3LDcgQEAKICAqLwogc3RhdGljIHZvaWQgc2w4MmMxMDVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IHJlZyAJCT0gMHg0NCArIGRyaXZlLT5kbiAqIDQ7CiAKQEAgLTI5OSw2ICsyOTksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IHNsODJjMTA1X2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gc2w4MmMxMDVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBzbDgyYzEwNV9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zbGM5MGU2Ni5jIGIvZHJpdmVycy9pZGUvc2xjOTBlNjYuYwppbmRleCAwZjc1OWU0Li40MGI0Yjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zbGM5MGU2Ni5jCisrKyBiL2RyaXZlcnMvaWRlL3NsYzkwZTY2LmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogc3RhdGljIHZvaWQgc2xjOTBlNjZfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXNfc2xhdmUJCT0gZHJpdmUtPmRuICYgMTsKIAlpbnQgbWFzdGVyX3BvcnQJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOwpAQCAtNzMsNyArNzMsNyBAQAogCiBzdGF0aWMgdm9pZCBzbGM5MGU2Nl9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggbWFzbGF2ZQkJPSBod2lmLT5jaGFubmVsID8gMHg0MiA6IDB4NDA7CiAJaW50IHNpdHJlID0gMCwgYV9zcGVlZAk9IDcgPDwgKGRyaXZlLT5kbiAqIDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdGM4NmMwMDEuYyBiL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMKaW5kZXggOTNlMmNjZS4uODQxMDlmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdGM4NmMwMDEuYworKysgYi9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIHN0YXRpYyB2b2lkIHRjODZjMDAxX3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIHNjcl9wb3J0CT0gaHdpZi0+Y29uZmlnX2RhdGEgKyAoZHJpdmUtPmRuID8gMHgwMiA6IDB4MDApOwogCXUxNiBtb2RlLCBzY3IJCT0gaW53KHNjcl9wb3J0KTsKIApAQCAtNjIsMTMgKzYyLDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgdGM4NmMwMDFfdGltZXJfZXhwaXJ5KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCWlkZV9leHBpcnlfdCAqZXhwaXJ5CT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwCT0gSFdHUk9VUChkcml2ZSk7CiAJdTggZG1hX3N0YXQJCT0gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwogCiAJLyogUmVzdG9yZSBhIGhpZ2hlciBsZXZlbCBkcml2ZXIncyBleHBpcnkgaGFuZGxlciBmaXJzdC4gKi8KLQlod2dyb3VwLT5leHBpcnkJPSBleHBpcnk7CisJaHdpZi0+ZXhwaXJ5ID0gZXhwaXJ5OwogCiAJaWYgKChkbWFfc3RhdCAmIDUpID09IDEpIHsJLyogRE1BIGFjdGl2ZSBhbmQgbm8gaW50ZXJydXB0ICovCiAJCXVuc2lnbmVkIGxvbmcgc2NfYmFzZQk9IGh3aWYtPmNvbmZpZ19kYXRhOwpAQCAtMTEwLDExICsxMDksMTAgQEAKIAogc3RhdGljIHZvaWQgdGM4NmMwMDFfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cAk9IEhXR1JPVVAoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIHNjX2Jhc2UJPSBod2lmLT5jb25maWdfZGF0YTsKIAl1bnNpZ25lZCBsb25nIHR3Y3JfcG9ydAk9IHNjX2Jhc2UgKyAoZHJpdmUtPmRuID8gMHgwNiA6IDB4MDQpOwotCXVuc2lnbmVkIGxvbmcgbnNlY3RvcnMJPSBod2dyb3VwLT5ycS0+bnJfc2VjdG9yczsKKwl1bnNpZ25lZCBsb25nIG5zZWN0b3JzCT0gaHdpZi0+cnEtPm5yX3NlY3RvcnM7CiAKIAkvKgogCSAqIFdlIGhhdmUgdG8gbWFudWFsbHkgbG9hZCB0aGUgc2VjdG9yIGNvdW50IGFuZCBzaXplIGludG8KQEAgLTEyNSw4ICsxMjMsOCBAQAogCW91dHcoU0VDVE9SX1NJWkUgLyAyLCB0d2NyX3BvcnQpOyAvKiBUcmFuc2ZlciBXb3JkIENvdW50IDEvMiAqLwogCiAJLyogSW5zdGFsbCBvdXIgdGltZW91dCBleHBpcnkgaG9vaywgc2F2aW5nIHRoZSBjdXJyZW50IGhhbmRsZXIuLi4gKi8KLQlpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGh3Z3JvdXAtPmV4cGlyeSk7Ci0JaHdncm91cC0+ZXhwaXJ5ID0gJnRjODZjMDAxX3RpbWVyX2V4cGlyeTsKKwlpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGh3aWYtPmV4cGlyeSk7CisJaHdpZi0+ZXhwaXJ5ID0gJnRjODZjMDAxX3RpbWVyX2V4cGlyeTsKIAogCWlkZV9kbWFfc3RhcnQoZHJpdmUpOwogfQpAQCAtMTkwLDYgKzE4OCw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gdGM4NmMwMDFfY2hpcHNldCBfX2RldmluaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdHJpZmxleC5jIGIvZHJpdmVycy9pZGUvdHJpZmxleC5jCmluZGV4IGI2ZmY0MDMuLjg3NzNjM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3RyaWZsZXguYworKysgYi9kcml2ZXJzL2lkZS90cmlmbGV4LmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogc3RhdGljIHZvaWQgdHJpZmxleF9zZXRfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1MzIgdHJpZmxleF90aW1pbmdzID0gMDsKIAl1MTYgdGltaW5nID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3RybTI5MC5jIGIvZHJpdmVycy9pZGUvdHJtMjkwLmMKaW5kZXggMmE1ZWE5MC4uYjZhMTI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdHJtMjkwLmMKKysrIGIvZHJpdmVycy9pZGUvdHJtMjkwLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBzdGF0aWMgdm9pZCB0cm0yOTBfcHJlcGFyZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgdXNlX2RtYSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXUxNiByZWcgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE4NCw3ICsxODQsNyBAQAogc3RhdGljIGludCB0cm0yOTBfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdW5zaWduZWQgaW50IGNvdW50LCBydzsKIAogCWlmIChycV9kYXRhX2RpcihycSkpIHsKQEAgLTIyMiwxNSArMjIyLDE1IEBACiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CiAJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCiAJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOwotCXN0YXR1cyA9IGludyhIV0lGKGRyaXZlKS0+ZG1hX2Jhc2UgKyAyKTsKKwlzdGF0dXMgPSBpbncoZHJpdmUtPmh3aWYtPmRtYV9iYXNlICsgMik7CisKIAlyZXR1cm4gc3RhdHVzICE9IDB4MDBmZjsKIH0KIAogc3RhdGljIGludCB0cm0yOTBfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQl1MTYgc3RhdHVzOworCXUxNiBzdGF0dXMgPSBpbncoZHJpdmUtPmh3aWYtPmRtYV9iYXNlICsgMik7CiAKLQlzdGF0dXMgPSBpbncoSFdJRihkcml2ZSktPmRtYV9iYXNlICsgMik7CiAJcmV0dXJuIHN0YXR1cyA9PSAweDAwZmY7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3R4NDkzOWlkZS5jIGIvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKaW5kZXggNGE4YzVhMi4uODgyZjZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKKysrIGIvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBUWDQ5MzlJREVfQkFTRShod2lmKTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1OCByZWFkaW5nOwogCWludCBuZW50OwogCkBAIC0zOTcsNiArMzk3LDE3IEBACiAJcmV0dXJuIGZvdW5kOwogfQogCisjaWZkZWYgX19CSUdfRU5ESUFOCitzdGF0aWMgdTggdHg0OTM5aWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBUWDQ5MzlJREVfQkFTRShod2lmKTsKKworCXJldHVybiB0eDQ5MzlpZGVfcmVhZGIoYmFzZSwgVFg0OTM5SURFX0RNQV9TdGF0KTsKK30KKyNlbHNlCisjZGVmaW5lIHR4NDkzOWlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzIGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzCisjZW5kaWYKKwogc3RhdGljIHZvaWQgdHg0OTM5aWRlX2luaXRfaHdpZihpZGVfaHdpZl90ICpod2lmKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IFRYNDkzOUlERV9CQVNFKGh3aWYpOwpAQCAtNDQzLDEzICs0NTQsNiBAQAogCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAKLXN0YXRpYyB1OCB0eDQ5MzlpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmKQotewotCXZvaWQgX19pb21lbSAqYmFzZSA9IFRYNDkzOUlERV9CQVNFKGh3aWYpOwotCi0JcmV0dXJuIHR4NDkzOWlkZV9yZWFkYihiYXNlLCBUWDQ5MzlJREVfRE1BX1N0YXQpOwotfQotCiAvKiBjdXN0b20gaW9wcyAoaW5kZXBlbmRlbnQgZnJvbSBTV0FQX0lPX1NQQUNFKSAqLwogc3RhdGljIHU4IHR4NDkzOWlkZV9pbmIodW5zaWduZWQgbG9uZyBwb3J0KQogewpAQCAtNTg1LDcgKzU4OSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IHR4NDkzOWlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKQEAgLTYwOSw3ICs2MTIsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCkBAIC02MzgsNiArNjQwLDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IHR4NDkzOWlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSB0eDQ5MzlpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyB0eDQ5MzlpZGVfcG9ydF9pbmZvIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS91bWM4NjcyLmMgYi9kcml2ZXJzL2lkZS91bWM4NjcyLmMKaW5kZXggZTI5OTc4Yy4uMDYwOGQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdW1jODY3Mi5jCisrKyBiL2RyaXZlcnMvaWRlL3VtYzg2NzIuYwpAQCAtMTA2LDIyICsxMDYsMjEgQEAKIAogc3RhdGljIHZvaWQgdW1jX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqbWF0ZV9od2dyb3VwID0gaHdpZi0+bWF0ZSA/IGh3aWYtPm1hdGUtPmh3Z3JvdXAgOiBOVUxMOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZiwgKm1hdGUgPSBod2lmLT5tYXRlOwogCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZmxhZ3MpOwogCiAJcHJpbnRrKCIlczogc2V0dGluZyB1bWM4NjcyIHRvIFBJTyBtb2RlJWQgKHNwZWVkICVkKVxuIiwKIAkJZHJpdmUtPm5hbWUsIHBpbywgcGlvX3RvX3VtY1twaW9dKTsKLQlpZiAobWF0ZV9od2dyb3VwKQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWF0ZV9od2dyb3VwLT5sb2NrLCBmbGFncyk7Ci0JaWYgKG1hdGVfaHdncm91cCAmJiBtYXRlX2h3Z3JvdXAtPmhhbmRsZXIpIHsKKwlpZiAobWF0ZSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hdGUtPmxvY2ssIGZsYWdzKTsKKwlpZiAobWF0ZSAmJiBtYXRlLT5oYW5kbGVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidW1jODY3Mjogb3RoZXIgaW50ZXJmYWNlIGlzIGJ1c3k6IGV4aXRpbmcgdHVuZV91bWMoKVxuIik7CiAJfSBlbHNlIHsKIAkJY3VycmVudF9zcGVlZHNbZHJpdmUtPm5hbWVbMl0gLSAnYSddID0gcGlvX3RvX3VtY1twaW9dOwogCQl1bWNfc2V0X3NwZWVkcyhjdXJyZW50X3NwZWVkcyk7CiAJfQotCWlmIChtYXRlX2h3Z3JvdXApCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hdGVfaHdncm91cC0+bG9jaywgZmxhZ3MpOworCWlmIChtYXRlKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXRlLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzIHVtYzg2NzJfcG9ydF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS92aWE4MmN4eHguYyBiL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCmluZGV4IDJhODEyZDMuLmZlY2MwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJaWRlX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBJREVfVElNSU5HXzhCSVQpOwogCX0KIAotCXZpYV9zZXRfc3BlZWQoSFdJRihkcml2ZSksIGRyaXZlLT5kbiwgJnQpOworCXZpYV9zZXRfc3BlZWQoaHdpZiwgZHJpdmUtPmRuLCAmdCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGxlL2k3MzAwX2lkbGUuYyBiL2RyaXZlcnMvaWRsZS9pNzMwMF9pZGxlLmMKaW5kZXggZmIxNzZmNi4uMTdlOGRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGxlL2k3MzAwX2lkbGUuYworKysgYi9kcml2ZXJzL2lkbGUvaTczMDBfaWRsZS5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2UgZHVtbXlfZG1hX2RldiA9IHsKLQkuYnVzX2lkID0gImZhbGxiYWNrIGRldmljZSIsCisJLmluaXRfbmFtZSA9ICJmYWxsYmFjayBkZXZpY2UiLAogCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV82NEJJVF9NQVNLLAogCS5kbWFfbWFzayA9ICZkdW1teV9kbWFfZGV2LmNvaGVyZW50X2RtYV9tYXNrLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCmluZGV4IDRmNGQxYmIuLmI0M2Y3ZDM2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCkBAIC03NzgsNyArNzc4LDcgQEAKIAljbGFzc19kZXYtPmNsYXNzICAgICAgPSAmaWJfY2xhc3M7CiAJY2xhc3NfZGV2LT5kcml2ZXJfZGF0YSA9IGRldmljZTsKIAljbGFzc19kZXYtPnBhcmVudCAgICAgPSBkZXZpY2UtPmRtYV9kZXZpY2U7Ci0Jc3RybGNweShjbGFzc19kZXYtPmJ1c19pZCwgZGV2aWNlLT5uYW1lLCBCVVNfSURfU0laRSk7CisJZGV2X3NldF9uYW1lKGNsYXNzX2RldiwgZGV2aWNlLT5uYW1lKTsKIAogCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnBvcnRfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKaW5kZXggZTYwMzczNi4uNTFiZDk2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKQEAgLTEyNjYsOCArMTI2Niw3IEBACiAJdWNtX2Rldi0+ZGV2LnBhcmVudCA9IGRldmljZS0+ZG1hX2RldmljZTsKIAl1Y21fZGV2LT5kZXYuZGV2dCA9IHVjbV9kZXYtPmNkZXYuZGV2OwogCXVjbV9kZXYtPmRldi5yZWxlYXNlID0gaWJfdWNtX3JlbGVhc2VfZGV2OwotCXNucHJpbnRmKHVjbV9kZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAidWNtJWQiLAotCQkgdWNtX2Rldi0+ZGV2bnVtKTsKKwlkZXZfc2V0X25hbWUoJnVjbV9kZXYtPmRldiwgInVjbSVkIiwgdWNtX2Rldi0+ZGV2bnVtKTsKIAlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZ1Y21fZGV2LT5kZXYpKQogCQlnb3RvIGVycl9jZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jCmluZGV4IDdjMTNkYjguLjU0YzhmZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jCkBAIC0xOTQ5LDggKzE5NDksNyBAQAogCiAJaG9zdC0+ZGV2LmNsYXNzID0gJnNycF9jbGFzczsKIAlob3N0LT5kZXYucGFyZW50ID0gZGV2aWNlLT5kZXYtPmRtYV9kZXZpY2U7Ci0Jc25wcmludGYoaG9zdC0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJzcnAtJXMtJWQiLAotCQkgZGV2aWNlLT5kZXYtPm5hbWUsIHBvcnQpOworCWRldl9zZXRfbmFtZSgmaG9zdC0+ZGV2LCAic3JwLSVzLSVkIiwgZGV2aWNlLT5kZXYtPm5hbWUsIHBvcnQpOwogCiAJaWYgKGRldmljZV9yZWdpc3RlcigmaG9zdC0+ZGV2KSkKIAkJZ290byBmcmVlX2hvc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMKaW5kZXggNWVlNjY1MS4uODM2MzliZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfcGlwZWxpbmUuYwpAQCAtOTEsNyArOTEsNyBAQAogCiAJZW50cnktPmRldi5jbGFzcyA9IGVsZW1lbnRzX2NsYXNzOwogCWRldl9zZXRfZHJ2ZGF0YSgmZW50cnktPmRldiwgZWxlbSk7Ci0Jc25wcmludGYoZW50cnktPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCBlbGVtLT5uYW1lKTsKKwlkZXZfc2V0X25hbWUoJmVudHJ5LT5kZXYsIGVsZW0tPm5hbWUpOwogCXJldCA9IGRldmljZV9yZWdpc3RlcigmZW50cnktPmRldik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKaW5kZXggOTE1ZGE2Yi4uYjRkNDRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYwpAQCAtMzIxLDEwICszMjEsNyBAQAogCiAvKiBUaGUgcm9vdCBkZXZpY2UgZm9yIHRoZSBsZ3Vlc3QgdmlydGlvIGRldmljZXMuICBUaGlzIG1ha2VzIHRoZW0gYXBwZWFyIGFzCiAgKiAvc3lzL2RldmljZXMvbGd1ZXN0LzAsMSwyIG5vdCAvc3lzL2RldmljZXMvMCwxLDIuICovCi1zdGF0aWMgc3RydWN0IGRldmljZSBsZ3Vlc3Rfcm9vdCA9IHsKLQkucGFyZW50ID0gTlVMTCwKLQkuYnVzX2lkID0gImxndWVzdCIsCi19Oworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmxndWVzdF9yb290OwogCiAvKkQ6MTIwIFRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIGxndWVzdCBidXM6IGFjdHVhbGx5IGFkZGluZyBhIG5ldyBkZXZpY2UuCiAgKiBJdCdzIGEgc2VwYXJhdGUgZnVuY3Rpb24gYmVjYXVzZSBpdCdzIG5lYXRlciB0aGF0IHdheSwgYW5kIGJlY2F1c2UgYW4KQEAgLTM1MSw3ICszNDgsNyBAQAogCX0KIAogCS8qIFRoaXMgZGV2aWNlcycgcGFyZW50IGlzIHRoZSBsZ3Vlc3QvIGRpci4gKi8KLQlsZGV2LT52ZGV2LmRldi5wYXJlbnQgPSAmbGd1ZXN0X3Jvb3Q7CisJbGRldi0+dmRldi5kZXYucGFyZW50ID0gbGd1ZXN0X3Jvb3Q7CiAJLyogV2UgaGF2ZSBhIHVuaXF1ZSBkZXZpY2UgaW5kZXggdGhhbmtzIHRvIHRoZSBkZXZfaW5kZXggY291bnRlci4gKi8KIAlsZGV2LT52ZGV2LmlkLmRldmljZSA9IGQtPnR5cGU7CiAJLyogV2UgaGF2ZSBhIHNpbXBsZSBzZXQgb2Ygcm91dGluZXMgZm9yIHF1ZXJ5aW5nIHRoZSBkZXZpY2UncwpAQCAtNDA3LDcgKzQwNCw4IEBACiAJaWYgKHN0cmNtcChwdl9pbmZvLm5hbWUsICJsZ3Vlc3QiKSAhPSAwKQogCQlyZXR1cm4gMDsKIAotCWlmIChkZXZpY2VfcmVnaXN0ZXIoJmxndWVzdF9yb290KSAhPSAwKQorCWxndWVzdF9yb290ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoImxndWVzdCIpOworCWlmIChJU19FUlIobGd1ZXN0X3Jvb3QpKQogCQlwYW5pYygiQ291bGQgbm90IHJlZ2lzdGVyIGxndWVzdCByb290Iik7CiAKIAkvKiBEZXZpY2VzIGFyZSBpbiBhIHNpbmdsZSBwYWdlIGFib3ZlIHRvcCBvZiAibm9ybWFsIiBtZW0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwppbmRleCBlYzllNWYzLi42ZTE0OWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCkBAIC0zMyw3ICszMyw3IEBACiAKICN1bmRlZiBERUJVRwogCi0jZGVmaW5lIE1BWF9OT0RFX05BTUVfU0laRSAoQlVTX0lEX1NJWkUgLSAxMikKKyNkZWZpbmUgTUFYX05PREVfTkFNRV9TSVpFICgyMCAtIDEyKQogCiBzdGF0aWMgc3RydWN0IG1hY2lvX2NoaXAgICAgICAqbWFjaW9fb25faG9sZDsKIApAQCAtMjQwLDcgKzI0MCw3IEBACiAJaWYgKGlycSAhPSBOT19JUlEpIHsKIAkJZGV2LT5pbnRlcnJ1cHRbaW5kZXhdLnN0YXJ0ID0gaXJxOwogCQlkZXYtPmludGVycnVwdFtpbmRleF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKLQkJZGV2LT5pbnRlcnJ1cHRbaW5kZXhdLm5hbWUgPSBkZXYtPm9mZGV2LmRldi5idXNfaWQ7CisJCWRldi0+aW50ZXJydXB0W2luZGV4XS5uYW1lID0gZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KTsKIAl9CiAJaWYgKGRldi0+bl9pbnRlcnJ1cHRzIDw9IGluZGV4KQogCQlkZXYtPm5faW50ZXJydXB0cyA9IGluZGV4ICsgMTsKQEAgLTMwMyw3ICszMDMsNyBAQAogCQkJYnJlYWs7CiAJCXJlcy0+c3RhcnQgPSBpcnE7CiAJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKLQkJcmVzLT5uYW1lID0gZGV2LT5vZmRldi5kZXYuYnVzX2lkOworCQlyZXMtPm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5vZmRldi5kZXYpOwogCQlpZiAobWFjaW9fcmVzb3VyY2VfcXVpcmtzKG5wLCByZXMsIGkgLSAxKSkgewogCQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQkJY29udGludWU7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJaWYgKGluZGV4ID49IE1BQ0lPX0RFVl9DT1VOVF9SRVNPVVJDRVMpCiAJCQlicmVhazsKIAkJKnJlcyA9IHI7Ci0JCXJlcy0+bmFtZSA9IGRldi0+b2ZkZXYuZGV2LmJ1c19pZDsKKwkJcmVzLT5uYW1lID0gZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KTsKIAogCQlpZiAobWFjaW9fcmVzb3VyY2VfcXVpcmtzKG5wLCByZXMsIGluZGV4KSkgewogCQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJCWlmIChpbnNlcnRfcmVzb3VyY2UocGFyZW50X3JlcywgcmVzKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgcmVxdWVzdCByZXNvdXJjZSAiCiAJCQkgICAgICAgIiVkIGZvciBNYWNJTyBkZXZpY2UgJXNcbiIsCi0JCQkgICAgICAgaW5kZXgsIGRldi0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCQkgICAgICAgaW5kZXgsIGRldl9uYW1lKCZkZXYtPm9mZGV2LmRldikpOwogCQl9CiAJfQogCWRldi0+bl9yZXNvdXJjZXMgPSBpbmRleDsKQEAgLTM4NSw4ICszODUsOCBAQAogCiAJLyogTWFjSU8gaXRzZWxmIGhhcyBhIGRpZmZlcmVudCByZWcsIHdlIHVzZSBpdCdzIFBDSSBiYXNlICovCiAJaWYgKG5wID09IGNoaXAtPm9mX25vZGUpIHsKLQkJc3ByaW50ZihkZXYtPm9mZGV2LmRldi5idXNfaWQsICIlMWQuJTA4eDolLipzIiwKLQkJCWNoaXAtPmxidXMuaW5kZXgsCisJCWRldl9zZXRfbmFtZSgmZGV2LT5vZmRldi5kZXYsICIlMWQuJTA4eDolLipzIiwKKwkJCSAgICAgY2hpcC0+bGJ1cy5pbmRleCwKICNpZmRlZiBDT05GSUdfUENJCiAJCQkodW5zaWduZWQgaW50KXBjaV9yZXNvdXJjZV9zdGFydChjaGlwLT5sYnVzLnBkZXYsIDApLAogI2Vsc2UKQEAgLTM5NSw5ICszOTUsOSBAQAogCQkJTUFYX05PREVfTkFNRV9TSVpFLCBucC0+bmFtZSk7CiAJfSBlbHNlIHsKIAkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7Ci0JCXNwcmludGYoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCAiJTFkLiUwOHg6JS4qcyIsCi0JCQljaGlwLT5sYnVzLmluZGV4LAotCQkJcmVnID8gKnJlZyA6IDAsIE1BWF9OT0RFX05BTUVfU0laRSwgbnAtPm5hbWUpOworCQlkZXZfc2V0X25hbWUoJmRldi0+b2ZkZXYuZGV2LCAiJTFkLiUwOHg6JS4qcyIsCisJCQkgICAgIGNoaXAtPmxidXMuaW5kZXgsCisJCQkgICAgIHJlZyA/ICpyZWcgOiAwLCBNQVhfTk9ERV9OQU1FX1NJWkUsIG5wLT5uYW1lKTsKIAl9CiAKIAkvKiBTZXR1cCBpbnRlcnJ1cHRzICYgcmVzb3VyY2VzICovCkBAIC00MDgsNyArNDA4LDcgQEAKIAkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KIAlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPm9mZGV2KSAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHIm1hY2lvOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGVycm9yIGZvciAlcyFcbiIsCi0JCSAgICAgICBkZXYtPm9mZGV2LmRldi5idXNfaWQpOworCQkgICAgICAgZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KSk7CiAJCWtmcmVlKGRldik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTU1OCw3ICs1NTgsNyBAQAogCQlyZXNvdXJjZV9ubywKIAkJbWFjaW9fcmVzb3VyY2VfbGVuKGRldiwgcmVzb3VyY2Vfbm8pLAogCQltYWNpb19yZXNvdXJjZV9zdGFydChkZXYsIHJlc291cmNlX25vKSwKLQkJZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KSk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCmluZGV4IDIyYmY5ODEuLjgyNjA3YWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCkBAIC01NTQsNyArNTU0LDcgQEAKIAljb25zdCB1MzIgKnByb3A7CiAJaW50IGkgPSAwLCBvZmZzZXQgPSAwOwogCWludCBlcnI7Ci0JCisKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJmYW4iKTsKIAlpZiAoIW5wKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTYxMywxMyArNjEzLDEzIEBACiAJfQogCiAJb2ZfZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgInRlbXBlcmF0dXJlcyIsIE5VTEwpOwotCQorCW9mX25vZGVfcHV0KG5wKTsKKwogCWlmIChvZl9kZXYgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHJlZ2lzdGVyIHRlbXBlcmF0dXJlcyBkZXZpY2UgIVxuIik7Ci0JCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCQorCiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjFfdGVtcGVyYXR1cmUpOwogCWVyciB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMl90ZW1wZXJhdHVyZSk7CiAJZXJyIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IxX2xpbWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKaW5kZXggNjVkNjk2Ni4uNmEzMjY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKQEAgLTc5LDYgKzc5LDEwIEBACiAJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGR2YmRldjsKIAkJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOwogCQlmaWxlLT5mX29wID0gZm9wc19nZXQoZHZiZGV2LT5mb3BzKTsKKwkJaWYgKGZpbGUtPmZfb3AgPT0gTlVMTCkgeworCQkJZmlsZS0+Zl9vcCA9IG9sZF9mb3BzOworCQkJZ290byBmYWlsOworCQl9CiAJCWlmKGZpbGUtPmZfb3AtPm9wZW4pCiAJCQllcnIgPSBmaWxlLT5mX29wLT5vcGVuKGlub2RlLGZpbGUpOwogCQlpZiAoZXJyKSB7CkBAIC05MCw2ICs5NCw3IEBACiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIGVycjsKIAl9CitmYWlsOgogCXVwX3JlYWQoJm1pbm9yX3J3c2VtKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKaW5kZXggZDQ1MGNhYi4uYjYxN2JmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwpAQCAtMjAzLDcgKzIwMyw2IEBACiAJdGFibGUgPSAmcHdxLT5wdDsKIAlmb3IgKDs7KSB7CiAJCWludCBtYXNrOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQltYXNrID0gZmlsZS0+Zl9vcC0+cG9sbChmaWxlLCB0YWJsZSk7CiAJCWlmIChtYXNrICYgUE9MTElOKQogCQkJYnJlYWs7CkBAIC0yMTIsOSArMjExLDggQEAKIAkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCWJyZWFrOwogCQl9Ci0JCXNjaGVkdWxlKCk7CisJCXBvbGxfc2NoZWR1bGUocHdxLCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXBvbGxfZnJlZXdhaXQocHdxKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwppbmRleCBjZWE0NjkwLi5hNWI0NDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwpAQCAtMzg1LDggKzM4NSw3IEBACiAKIAlpZiAoY2FyZCkgewogCQljYXJkLT5ob3N0ID0gaG9zdDsKLQkJc25wcmludGYoY2FyZC0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGNhcmQtPmRldi5idXNfaWQpLAotCQkJICIlcyIsIGhvc3QtPmRldi5idXNfaWQpOworCQlkZXZfc2V0X25hbWUoJmNhcmQtPmRldiwgIiVzIiwgZGV2X25hbWUoJmhvc3QtPmRldikpOwogCQljYXJkLT5kZXYucGFyZW50ID0gJmhvc3QtPmRldjsKIAkJY2FyZC0+ZGV2LmJ1cyA9ICZtZW1zdGlja19idXNfdHlwZTsKIAkJY2FyZC0+ZGV2LnJlbGVhc2UgPSBtZW1zdGlja19mcmVlX2NhcmQ7CkBAIC01MTksNyArNTE4LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXNucHJpbnRmKGhvc3QtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAibWVtc3RpY2sldSIsIGhvc3QtPmlkKTsKKwlkZXZfc2V0X25hbWUoJmhvc3QtPmRldiwgIm1lbXN0aWNrJXUiLCBob3N0LT5pZCk7CiAKIAlyYyA9IGRldmljZV9hZGQoJmhvc3QtPmRldik7CiAJaWYgKHJjKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCmluZGV4IDc5MTExNTEuLjFmMWUzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCkBAIC04ODcsMTQgKzg4NywxNCBAQAogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiJXM6IGNvdWxkIG5vdCBzd2l0Y2ggdG8gNC1iaXQgbW9kZSwgZXJyb3IgJWRcbiIsCi0JCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCByYyk7CisJCSAgICAgICBkZXZfbmFtZSgmY2FyZC0+ZGV2KSwgcmMpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltc2ItPnN5c3RlbSA9IE1FTVNUSUNLX1NZU19QQVI0OwogCWhvc3QtPnNldF9wYXJhbShob3N0LCBNRU1TVElDS19JTlRFUkZBQ0UsIE1FTVNUSUNLX1BBUjQpOwogCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gNC1iaXQgcGFyYWxsZWwgbW9kZVxuIiwKLQkgICAgICAgY2FyZC0+ZGV2LmJ1c19pZCk7CisJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpKTsKIAogCWlmIChtc2ItPmNhcHMgJiBNRU1TVElDS19DQVBfUEFSOCkgewogCQlyYyA9IG1zcHJvX2Jsb2NrX3NldF9pbnRlcmZhY2UoY2FyZCwgTUVNU1RJQ0tfU1lTX1BBUjgpOwpAQCAtOTA1LDExICs5MDUsMTEgQEAKIAkJCQkJTUVNU1RJQ0tfUEFSOCk7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgIiVzOiBzd2l0Y2hpbmcgdG8gOC1iaXQgcGFyYWxsZWwgbW9kZVxuIiwKLQkJCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkKTsKKwkJCSAgICAgICBkZXZfbmFtZSgmY2FyZC0+ZGV2KSk7CiAJCX0gZWxzZQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICIlczogY291bGQgbm90IHN3aXRjaCB0byA4LWJpdCBtb2RlLCBlcnJvciAlZFxuIiwKLQkJCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCByYyk7CisJCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldiksIHJjKTsKIAl9CiAKIAljYXJkLT5uZXh0X3JlcXVlc3QgPSBoX21zcHJvX2Jsb2NrX3JlcV9pbml0OwpAQCAtOTIyLDcgKzkyMiw3IEBACiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICIlczogaW50ZXJmYWNlIGVycm9yLCB0cnlpbmcgdG8gZmFsbCBiYWNrIHRvIHNlcmlhbFxuIiwKLQkJICAgICAgIGNhcmQtPmRldi5idXNfaWQpOworCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldikpOwogCQltc2ItPnN5c3RlbSA9IE1FTVNUSUNLX1NZU19TRVJJQUw7CiAJCWhvc3QtPnNldF9wYXJhbShob3N0LCBNRU1TVElDS19QT1dFUiwgTUVNU1RJQ0tfUE9XRVJfT0ZGKTsKIAkJbXNsZWVwKDEwKTsKQEAgLTk5MiwxNCArOTkyLDE0IEBACiAKIAlpZiAoYmUxNl90b19jcHUoYXR0ci0+c2lnbmF0dXJlKSAhPSBNU1BST19CTE9DS19TSUdOQVRVUkUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pemVkIGRldmljZSBzaWduYXR1cmUgJXhcbiIsCi0JCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCBiZTE2X3RvX2NwdShhdHRyLT5zaWduYXR1cmUpKTsKKwkJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpLCBiZTE2X3RvX2NwdShhdHRyLT5zaWduYXR1cmUpKTsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9mcmVlX2F0dHI7CiAJfQogCiAJaWYgKGF0dHItPmNvdW50ID4gTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdheSB0b28gbWFueSBhdHRyaWJ1dGUgZW50cmllc1xuIiwKLQkJICAgICAgIGNhcmQtPmRldi5idXNfaWQpOworCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldikpOwogCQlhdHRyX2NvdW50ID0gTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVM7CiAJfSBlbHNlCiAJCWF0dHJfY291bnQgPSBhdHRyLT5jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3QvdGlmbV9tcy5jCmluZGV4IGQzMmQ2YWQuLjAzZjcxYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L3RpZm1fbXMuYwpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJcHJpbnRrKEtFUk5fRVJSCiAJICAgICAgICIlcyA6IGNhcmQgZmFpbGVkIHRvIHJlc3BvbmQgZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZSAiCiAJICAgICAgICIoJXgsICV4KVxuIiwKLQkgICAgICAgaG9zdC0+ZGV2LT5kZXYuYnVzX2lkLCBob3N0LT5yZXEgPyBob3N0LT5yZXEtPnRwYyA6IDAsCisJICAgICAgIGRldl9uYW1lKCZob3N0LT5kZXYtPmRldiksIGhvc3QtPnJlcSA/IGhvc3QtPnJlcS0+dHBjIDogMCwKIAkgICAgICAgaG9zdC0+Y21kX2ZsYWdzKTsKIAogCXRpZm1fZWplY3QoaG9zdC0+ZGV2KTsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCWlmICghKFRJRk1fU09DS19TVEFURV9PQ0NVUElFRAogCSAgICAgICYgcmVhZGwoc29jay0+YWRkciArIFNPQ0tfUFJFU0VOVF9TVEFURSkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIDogY2FyZCBnb25lLCB1bmV4cGVjdGVkbHlcbiIsCi0JCSAgICAgICBzb2NrLT5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRldl9uYW1lKCZzb2NrLT5kZXYpKTsKIAkJcmV0dXJuIHJjOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKaW5kZXggNTRjMmU5YS4uMGVlNDI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCkBAIC01Miw3ICs1Miw2IEBACiAvKioKICAqCWkyb19kZXZpY2VfY2xhaW0gLSBjbGFpbSBhIGRldmljZSBmb3IgdXNlIGJ5IGFuIE9TTQogICoJQGRldjogSTJPIGRldmljZSB0byBjbGFpbQotICoJQGRydjogSTJPIGRyaXZlciB3aGljaCB3YW50cyB0byBjbGFpbSB0aGUgZGV2aWNlCiAgKgogICoJRG8gdGhlIGxlZyB3b3JrIHRvIGFzc2lnbiBhIGRldmljZSB0byBhIGdpdmVuIE9TTS4gSWYgdGhlIGNsYWltIHN1Y2NlZWRzLAogICoJdGhlIG93bmVyIGlzIHRoZSBwcmltYXJ5LiBJZiB0aGUgYXR0ZW1wdCBmYWlscyBhIG5lZ2F0aXZlIGVycm5vIGNvZGUKQEAgLTgwLDcgKzc5LDYgQEAKIC8qKgogICoJaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlIC0gcmVsZWFzZSBhIGRldmljZSB0aGF0IHRoZSBPU00gaXMgdXNpbmcKICAqCUBkZXY6IGRldmljZSB0byByZWxlYXNlCi0gKglAZHJ2OiBkcml2ZXIgd2hpY2ggY2xhaW1lZCB0aGUgZGV2aWNlCiAgKgogICoJRHJvcCBhIGNsYWltIGJ5IGFuIE9TTSBvbiBhIGdpdmVuIEkyTyBkZXZpY2UuCiAgKgpAQCAtMTM0LDcgKzEzMiw3IEBACiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CiAKLQlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgcmVsZWFzZWRcbiIsIGRldi0+YnVzX2lkKTsKKwlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgcmVsZWFzZWRcbiIsIGRldl9uYW1lKGRldikpOwogCiAJa2ZyZWUoaTJvX2Rldik7CiB9CkBAIC0yMjksOCArMjI3LDggQEAKIAogCWkyb19kZXYtPmxjdF9kYXRhID0gKmVudHJ5OwogCi0Jc25wcmludGYoaTJvX2Rldi0+ZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZDolMDN4IiwgYy0+dW5pdCwKLQkJIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisJZGV2X3NldF9uYW1lKCZpMm9fZGV2LT5kZXZpY2UsICIlZDolMDN4IiwgYy0+dW5pdCwKKwkJICAgICBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOwogCiAJaTJvX2Rldi0+aW9wID0gYzsKIAlpMm9fZGV2LT5kZXZpY2UucGFyZW50ID0gJmMtPmRldmljZTsKQEAgLTI4MSw3ICsyNzksNyBAQAogCiAJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZF9hbGwoaTJvX2Rldik7CiAKLQlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgYWRkZWRcbiIsIGkyb19kZXYtPmRldmljZS5idXNfaWQpOworCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyBhZGRlZFxuIiwgZGV2X25hbWUoJmkyb19kZXYtPmRldmljZSkpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RyaXZlci5jCmluZGV4IGUwZDQ3NGIuLmEwNDIxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYwpAQCAtMTczLDcgKzE3Myw2IEBACiAgKglpMm9fZHJpdmVyX2Rpc3BhdGNoIC0gZGlzcGF0Y2ggYW4gSTJPIHJlcGx5IG1lc3NhZ2UKICAqCUBjOiBJMk8gY29udHJvbGxlciBvZiB0aGUgbWVzc2FnZQogICoJQG06IEkyTyBtZXNzYWdlIG51bWJlcgotICoJQG1zZzogSTJPIG1lc3NhZ2UgdG8gYmUgZGVsaXZlcmVkCiAgKgogICoJVGhlIHJlcGx5IGlzIGRlbGl2ZXJlZCB0byB0aGUgZHJpdmVyIGZyb20gd2hpY2ggdGhlIG9yaWdpbmFsIG1lc3NhZ2UKICAqCXdhcy4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jCmluZGV4IDU0YTMwMTYuLjlhMzZiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMKQEAgLTEzMDAsNyArMTMwMCw3IEBACiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CiAKLQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBkLT5kZXZpY2UuYnVzX2lkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBkZXZfbmFtZSgmZC0+ZGV2aWNlKSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCmluZGV4IDM1YzY3ZDEuLjI3Y2Y0YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwpAQCAtMTA3Miw3ICsxMDcyLDcgQEAKIAogCWMtPmRldmljZS5yZWxlYXNlID0gJmkyb19pb3BfcmVsZWFzZTsKIAotCXNucHJpbnRmKGMtPmRldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAiaW9wJWQiLCBjLT51bml0KTsKKwlkZXZfc2V0X25hbWUoJmMtPmRldmljZSwgImlvcCVkIiwgYy0+dW5pdCk7CiAKICNpZiBCSVRTX1BFUl9MT05HID09IDY0CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmNvbnRleHRfbGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL21vZHVsZS5jCmluZGV4IGI1ZjZhZGQuLmRjMTRiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYwpAQCAtMTA0LDggKzEwNCw3IEBACiAJfQogCiAJc3AtPmlycSA9IHBkZXYtPmlycTsKLQlzcC0+YmFzZV9hZGRyZXNzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCXNwLT5iYXNlX2FkZHJlc3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CiAJaWYgKCFzcC0+YmFzZV9hZGRyZXNzKSB7CiAJCWRldl9lcnIoc3AtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIHBjaSBtZW1vcnlcbiIpOwogCQlyZXN1bHQgPSAgLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pb2M0LmMgYi9kcml2ZXJzL21pc2MvaW9jNC5jCmluZGV4IDZmNzY1NzMuLjYwYjBiMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pb2M0LmMKKysrIGIvZHJpdmVycy9taXNjL2lvYzQuYwpAQCAtMjY5LDYgKzI2OSwxNiBAQAogCXJldHVybiBJT0M0X1ZBUklBTlRfUENJX1JUOwogfQogCitzdGF0aWMgdm9pZAoraW9jNF9sb2FkX21vZHVsZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCS8qIGFyZyBqdXN0IGhhcyB0byBiZSBmcmVlZCAqLworCisJcmVxdWVzdF9tb2R1bGUoInNnaWlvYzQiKTsKKworCWtmcmVlKHdvcmspOworfQorCiAvKiBBZGRzIGEgbmV3IGluc3RhbmNlIG9mIGFuIElPQzQgY2FyZCAqLwogc3RhdGljIGludAogaW9jNF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKQEAgLTM3OCw2ICszODgsMzAgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZpb2M0X211dGV4KTsKIAorCS8qIFJlcXVlc3Qgc2dpaW9jNCBJREUgZHJpdmVyIG9uIGJvYXJkcyB0aGF0IGJyaW5nIHRoYXQgZnVuY3Rpb25hbGl0eQorCSAqIG9mZiBvZiBJT0M0LiAgVGhlIHJvb3QgZmlsZXN5c3RlbSBtYXkgYmUgaG9zdGVkIG9uIGEgZHJpdmUgY29ubmVjdGVkCisJICogdG8gSU9DNCwgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHNnaWlvYzQgZHJpdmVyIGlzIGxvYWRlZCBhcyBpdAorCSAqIHdvbid0IGJlIHBpY2tlZCB1cCBieSBtb2Rwcm9iZXMgZHVlIHRvIHRoZSBpb2M0IG1vZHVsZSBvd25pbmcgdGhlCisJICogUENJIGRldmljZS4KKwkgKi8KKwlpZiAoaWRkLT5pZGRfdmFyaWFudCAhPSBJT0M0X1ZBUklBTlRfUENJX1JUKSB7CisJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yazsKKwkJd29yayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCksIEdGUF9LRVJORUwpOworCQlpZiAoIXdvcmspIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IElPQzQgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJICAgICAgICJsb2FkIG9mIHN1Yi1tb2R1bGVzLlxuIiwgX19mdW5jX18pOworCQl9IGVsc2UgeworCQkJLyogUmVxdWVzdCB0aGUgbW9kdWxlIGZyb20gYSB3b3JrIHByb2NlZHVyZSBhcyB0aGUKKwkJCSAqIG1vZHByb2JlIGdvZXMgb3V0IHRvIGEgdXNlcmxhbmQgaGVscGVyIGFuZCB0aGF0CisJCQkgKiB3aWxsIGhhbmcgaWYgZG9uZSBkaXJlY3RseSBmcm9tIGlvYzRfcHJvYmUoKS4KKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSU9DNCBsb2FkaW5nIHNnaWlvYzQgc3VibW9kdWxlXG4iKTsKKwkJCUlOSVRfV09SSyh3b3JrLCBpb2M0X2xvYWRfbW9kdWxlcyk7CisJCQlzY2hlZHVsZV93b3JrKHdvcmspOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiAKIG91dF9taXNjX3JlZ2lvbjoKQEAgLTQ2Miw2ICs0OTYsOCBAQAogc3RhdGljIHZvaWQgX19kZXZleGl0CiBpb2M0X2V4aXQodm9pZCkKIHsKKwkvKiBFbnN1cmUgaW9jNF9sb2FkX21vZHVsZXMoKSBoYXMgY29tcGxldGVkIGJlZm9yZSBleGl0aW5nICovCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvYzRfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jCmluZGV4IGUxMWUxYWMuLjNkMmZjMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydW1haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVtYWluLmMKQEAgLTI5LDcgKzI5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGdydV9kZXZpY2UgPSB7Ci0JLmJ1c19pZCA9IHswfSwKKwkuaW5pdF9uYW1lID0gIiIsCiAJLmRyaXZlciA9ICZncnVfZHJpdmVyLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS14cC94cF9tYWluLmMgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYwppbmRleCA5YTJlNzcxLi4xNmY4ZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYwpAQCAtMjUsNyArMjUsNyBAQAogfTsKIAogc3RydWN0IGRldmljZSB4cF9kYmdfc3VibmFtZSA9IHsKLQkuYnVzX2lkID0gezB9LAkJLyogc2V0IHRvICIiICovCisJLmluaXRfbmFtZSA9ICIiLAkJLyogc2V0IHRvICIiICovCiAJLmRyaXZlciA9ICZ4cF9kYmdfbmFtZQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS14cC94cGNfbWFpbi5jIGIvZHJpdmVycy9taXNjL3NnaS14cC94cGNfbWFpbi5jCmluZGV4IGU4ZDVjZmIuLjg5MjE4ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX21haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwY19tYWluLmMKQEAgLTU5LDEyICs1OSwxMiBAQAogfTsKIAogc3RydWN0IGRldmljZSB4cGNfcGFydF9kYmdfc3VibmFtZSA9IHsKLQkuYnVzX2lkID0gezB9LAkJLyogc2V0IHRvICJwYXJ0IiBhdCB4cGNfaW5pdCgpIHRpbWUgKi8KKwkuaW5pdF9uYW1lID0gIiIsCS8qIHNldCB0byAicGFydCIgYXQgeHBjX2luaXQoKSB0aW1lICovCiAJLmRyaXZlciA9ICZ4cGNfZGJnX25hbWUKIH07CiAKIHN0cnVjdCBkZXZpY2UgeHBjX2NoYW5fZGJnX3N1Ym5hbWUgPSB7Ci0JLmJ1c19pZCA9IHswfSwJCS8qIHNldCB0byAiY2hhbiIgYXQgeHBjX2luaXQoKSB0aW1lICovCisJLmluaXRfbmFtZSA9ICIiLAkvKiBzZXQgdG8gImNoYW4iIGF0IHhwY19pbml0KCkgdGltZSAqLwogCS5kcml2ZXIgPSAmeHBjX2RiZ19uYW1lCiB9OwogCkBAIC0xMjU4LDggKzEyNTgsOCBAQAogCWludCByZXQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICprdGhyZWFkOwogCi0Jc25wcmludGYoeHBjX3BhcnQtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICJwYXJ0Iik7Ci0Jc25wcmludGYoeHBjX2NoYW4tPmJ1c19pZCwgQlVTX0lEX1NJWkUsICJjaGFuIik7CisJZGV2X3NldF9uYW1lKHhwY19wYXJ0LCAicGFydCIpOworCWRldl9zZXRfbmFtZSh4cGNfY2hhbiwgImNoYW4iKTsKIAogCWlmIChpc19zaHViKCkpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYwppbmRleCA4ZTZhYTk1Li44MTE1MmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIH07CiAKIHN0cnVjdCBkZXZpY2UgeHBuZXRfZGJnX3N1Ym5hbWUgPSB7Ci0JLmJ1c19pZCA9IHswfSwJCS8qIHNldCB0byAiIiAqLworCS5pbml0X25hbWUgPSAiIiwJLyogc2V0IHRvICIiICovCiAJLmRyaXZlciA9ICZ4cG5ldF9kYmdfbmFtZQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jIGIvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jCmluZGV4IDY3NTAzZWEuLmJlNTY3MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYworKysgYi9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogCQlpZiAoc29jaykgewogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICAgICIlcyA6IGRlbWFuZCByZW1vdmluZyBjYXJkIGZyb20gc29ja2V0ICV1OiV1XG4iLAotCQkJICAgICAgIGZtLT5kZXYuYnVzX2lkLCBmbS0+aWQsIGNudCk7CisJCQkgICAgICAgZGV2X25hbWUoJmZtLT5kZXYpLCBmbS0+aWQsIGNudCk7CiAJCQlmbS0+c29ja2V0c1tjbnRdID0gTlVMTDsKIAkJCXNvY2tfYWRkciA9IHNvY2stPmFkZHI7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbS0+bG9jaywgZmxhZ3MpOwpAQCAtMzU0LDggKzM1NCw3IEBACiAJZm0tPmhhc19tc19waWYgPSB0aWZtXzd4eDFfaGFzX21zX3BpZjsKIAlwY2lfc2V0X2RydmRhdGEoZGV2LCBmbSk7CiAKLQlmbS0+YWRkciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksCi0JCQkgICBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOworCWZtLT5hZGRyID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CiAJaWYgKCFmbS0+YWRkcikKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYyBiL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYwppbmRleCA4MmRjNzJhMS4uOThiY2JhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RpZm1fY29yZS5jCisrKyBiL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlzbnByaW50ZihmbS0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJ0aWZtJXUiLCBmbS0+aWQpOworCWRldl9zZXRfbmFtZSgmZm0tPmRldiwgInRpZm0ldSIsIGZtLT5pZCk7CiAJcmMgPSBkZXZpY2VfYWRkKCZmbS0+ZGV2KTsKIAlpZiAocmMpIHsKIAkJc3Bpbl9sb2NrKCZ0aWZtX2FkYXB0ZXJfbG9jayk7CkBAIC0yNjYsOSArMjY2LDggQEAKIAkJc29jay0+ZGV2LmRtYV9tYXNrID0gZm0tPmRldi5wYXJlbnQtPmRtYV9tYXNrOwogCQlzb2NrLT5kZXYucmVsZWFzZSA9IHRpZm1fZnJlZV9kZXZpY2U7CiAKLQkJc25wcmludGYoc29jay0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCi0JCQkgInRpZm1fJXMldToldSIsIHRpZm1fbWVkaWFfdHlwZV9uYW1lKHR5cGUsIDIpLAotCQkJIGZtLT5pZCwgaWQpOworCQlkZXZfc2V0X25hbWUoJnNvY2stPmRldiwgInRpZm1fJXMldToldSIsCisJCQkgICAgIHRpZm1fbWVkaWFfdHlwZV9uYW1lKHR5cGUsIDIpLCBmbS0+aWQsIGlkKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRQogCQkgICAgICAgIjogJXMgY2FyZCBkZXRlY3RlZCBpbiBzb2NrZXQgJXU6JXVcbiIsCiAJCSAgICAgICB0aWZtX21lZGlhX3R5cGVfbmFtZSh0eXBlLCAwKSwgZm0tPmlkLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwppbmRleCA2NjU5YjIyLi41NzMzZjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogc3RhdGljIGludCBlcmFzZV9jaGlwKHN0cnVjdCBtMjVwICpmbGFzaCkKIHsKIAlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6ICVzICVkS2lCXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCiAJCQlmbGFzaC0+bXRkLnNpemUgLyAxMDI0KTsKIAogCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KQEAgLTE5Nyw3ICsxOTcsNyBAQAogc3RhdGljIGludCBlcmFzZV9zZWN0b3Ioc3RydWN0IG0yNXAgKmZsYXNoLCB1MzIgb2Zmc2V0KQogewogCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogJXMgJWRLaUIgYXQgMHglMDh4XG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCiAJCQlmbGFzaC0+bXRkLmVyYXNlc2l6ZSAvIDEwMjQsIG9mZnNldCk7CiAKIAkvKiBXYWl0IHVudGlsIGZpbmlzaGVkIHByZXZpb3VzIHdyaXRlIGNvbW1hbmQuICovCkBAIC0yMzQsNyArMjM0LDcgQEAKIAl1MzIgYWRkcixsZW47CiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICVkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sICJhdCIsCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJhdCIsCiAJCQkodTMyKWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KQEAgLTI5NSw3ICsyOTUsNyBAQAogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwogCiAJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlemRcbiIsCi0JCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLCBfX2Z1bmNfXywgImZyb20iLAorCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLCAiZnJvbSIsCiAJCQkodTMyKWZyb20sIGxlbik7CiAKIAkvKiBzYW5pdHkgY2hlY2tzICovCkBAIC0zNjcsNyArMzY3LDcgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sICJ0byIsCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJ0byIsCiAJCQkodTMyKXRvLCBsZW4pOwogCiAJaWYgKHJldGxlbikKQEAgLTU2Myw3ICs1NjMsNyBAQAogCXRtcCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmY29kZSwgMSwgaWQsIDUpOwogCWlmICh0bXAgPCAwKSB7CiAJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogZXJyb3IgJWQgcmVhZGluZyBKRURFQyBJRFxuIiwKLQkJCXNwaS0+ZGV2LmJ1c19pZCwgdG1wKTsKKwkJCWRldl9uYW1lKCZzcGktPmRldiksIHRtcCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlqZWRlYyA9IGlkWzBdOwpAQCAtNjE3LDcgKzYxNyw3IEBACiAJCS8qIHVucmVjb2duaXplZCBjaGlwPyAqLwogCQlpZiAoaSA9PSBBUlJBWV9TSVpFKG0yNXBfZGF0YSkpIHsKIAkJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogdW5yZWNvZ25pemVkIGlkICVzXG4iLAotCQkJCQlzcGktPmRldi5idXNfaWQsIGRhdGEtPnR5cGUpOworCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBkYXRhLT50eXBlKTsKIAkJCWluZm8gPSBOVUxMOwogCiAJCS8qIHJlY29nbml6ZWQ7IGlzIHRoYXQgY2hpcCByZWFsbHkgd2hhdCdzIHRoZXJlPyAqLwpAQCAtNjU4LDcgKzY1OCw3IEBACiAJaWYgKGRhdGEgJiYgZGF0YS0+bmFtZSkKIAkJZmxhc2gtPm10ZC5uYW1lID0gZGF0YS0+bmFtZTsKIAllbHNlCi0JCWZsYXNoLT5tdGQubmFtZSA9IHNwaS0+ZGV2LmJ1c19pZDsKKwkJZmxhc2gtPm10ZC5uYW1lID0gZGV2X25hbWUoJnNwaS0+ZGV2KTsKIAogCWZsYXNoLT5tdGQudHlwZSA9IE1URF9OT1JGTEFTSDsKIAlmbGFzaC0+bXRkLndyaXRlc2l6ZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCmluZGV4IDZkZDlhZmYuLjY1MTI2Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgJWQ/XG4iLAotCQkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCQlzdGF0dXMgPSAwOwogCQl9CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogCXVpbnQ4X3QJCQkqY29tbWFuZDsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogZXJhc2UgYWRkcj0weCV4IGxlbiAweCV4XG4iLAotCQkJc3BpLT5kZXYuYnVzX2lkLAorCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwKIAkJCWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKIAogCS8qIFNhbml0eSBjaGVja3MgKi8KQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcmFzZSAleCwgZXJyICVkXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgcGFnZWFkZHIsIHN0YXR1cyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgcGFnZWFkZHIsIHN0YXR1cyk7CiAJCQkvKiBSRVZJU0lUOiAgY2FuIHJldHJ5IGluc3RyLT5yZXRyaWVzIHRpbWVzOyBvcgogCQkJICogZ2l2ZXVwIGFuZCBpbnN0ci0+ZmFpbF9hZGRyID0gaW5zdHItPmFkZHI7CiAJCQkgKi8KQEAgLTIzOSw3ICsyMzksNyBAQAogCWludAkJCXN0YXR1czsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogcmVhZCAweCV4Li4weCV4XG4iLAotCQlwcml2LT5zcGktPmRldi5idXNfaWQsICh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pKTsKKwkJZGV2X25hbWUoJnByaXYtPnNwaS0+ZGV2KSwgKHVuc2lnbmVkKWZyb20sICh1bnNpZ25lZCkoZnJvbSArIGxlbikpOwogCiAJKnJldGxlbiA9IDA7CiAKQEAgLTI4OCw3ICsyODgsNyBAQAogCQlzdGF0dXMgPSAwOwogCX0gZWxzZQogCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlYWQgJXguLiV4IC0tPiAlZFxuIiwKLQkJCXByaXYtPnNwaS0+ZGV2LmJ1c19pZCwKKwkJCWRldl9uYW1lKCZwcml2LT5zcGktPmRldiksCiAJCQkodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSwKIAkJCXN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTMxNSw3ICszMTUsNyBAQAogCXVpbnQ4X3QJCQkqY29tbWFuZDsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogd3JpdGUgMHgleC4uMHgleFxuIiwKLQkJc3BpLT5kZXYuYnVzX2lkLCAodW5zaWduZWQpdG8sICh1bnNpZ25lZCkodG8gKyBsZW4pKTsKKwkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgKHVuc2lnbmVkKXRvLCAodW5zaWduZWQpKHRvICsgbGVuKSk7CiAKIAkqcmV0bGVuID0gMDsKIApAQCAtMzc0LDcgKzM3NCw3IEBACiAJCQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtc2cpOwogCQkJaWYgKHN0YXR1cyA8IDApCiAJCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiB4ZmVyICV1IC0+ICVkIFxuIiwKLQkJCQkJc3BpLT5kZXYuYnVzX2lkLCBhZGRyLCBzdGF0dXMpOworCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCBzdGF0dXMpOwogCiAJCQkodm9pZCkgZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOwogCQl9CkBAIC0zOTYsNyArMzk2LDcgQEAKIAkJc3BpX3RyYW5zZmVyX2RlbCh4ICsgMSk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBwZ20gJXUvJXUgLT4gJWQgXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgd3JpdGVsZW4sIHN0YXR1cyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgYWRkciwgd3JpdGVsZW4sIHN0YXR1cyk7CiAKIAkJKHZvaWQpIGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKIApAQCAtNDE2LDE0ICs0MTYsMTQgQEAKIAkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGNvbXBhcmUgJXUgLT4gJWQgXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgc3RhdHVzKTsKKwkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCBzdGF0dXMpOwogCiAJCXN0YXR1cyA9IGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKIAogCQkvKiBDaGVjayByZXN1bHQgb2YgdGhlIGNvbXBhcmUgb3BlcmF0aW9uICovCiAJCWlmIChzdGF0dXMgJiAoMSA8PCA2KSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tcGFyZSBwYWdlICV1LCBlcnIgJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBwYWdlYWRkciwgc3RhdHVzKTsKKwkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBwYWdlYWRkciwgc3RhdHVzKTsKIAkJCXJlbWFpbmluZyA9IDA7CiAJCQlzdGF0dXMgPSAtRUlPOwogCQkJYnJlYWs7CkBAIC03NzksNyArNzc5LDcgQEAKIAl0bXAgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJmNvZGUsIDEsIGlkLCAzKTsKIAlpZiAodG1wIDwgMCkgewogCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IGVycm9yICVkIHJlYWRpbmcgSkVERUMgSURcbiIsCi0JCQlzcGktPmRldi5idXNfaWQsIHRtcCk7CisJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCB0bXApOwogCQlyZXR1cm4gRVJSX1BUUih0bXApOwogCX0KIAlpZiAoaWRbMF0gIT0gMHgxZikKQEAgLTg2OSw3ICs4NjksNyBAQAogCXN0YXR1cyA9IGRhdGFmbGFzaF9zdGF0dXMoc3BpKTsKIAlpZiAoc3RhdHVzIDw9IDAgfHwgc3RhdHVzID09IDB4ZmYpIHsKIAkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgZXJyb3IgJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCWlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPT0gMHhmZikKIAkJCXN0YXR1cyA9IC1FTk9ERVY7CiAJCXJldHVybiBzdGF0dXM7CkBAIC05MDUsMTMgKzkwNSwxMyBAQAogCS8qIG9ic29sZXRlIEFUNDVEQjEyODIgbm90ICh5ZXQ/KSBzdXBwb3J0ZWQgKi8KIAlkZWZhdWx0OgogCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAoJXgpXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzICYgMHgzYyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3RhdHVzICYgMHgzYyk7CiAJCXN0YXR1cyA9IC1FTk9ERVY7CiAJfQogCiAJaWYgKHN0YXR1cyA8IDApCiAJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogYWRkX2RhdGFmbGFzaCAtLT4gJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtOTIxLDcgKzkyMSw3IEBACiAJc3RydWN0IGRhdGFmbGFzaAkqZmxhc2ggPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKIAlpbnQJCQlzdGF0dXM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlbW92ZVxuIiwgc3BpLT5kZXYuYnVzX2lkKTsKKwlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlbW92ZVxuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CiAKIAlpZiAobXRkX2hhc19wYXJ0aXRpb25zKCkgJiYgZmxhc2gtPnBhcnRpdGlvbmVkKQogCQlzdGF0dXMgPSBkZWxfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9pbnRlZ3JhdG9yLWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2ludGVncmF0b3ItZmxhc2guYwppbmRleCA3MTAwZWUzLi5kMmVjMjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2ludGVncmF0b3ItZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2ludGVncmF0b3ItZmxhc2guYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJaW5mby0+bWFwLmJhbmt3aWR0aAk9IHBsYXQtPndpZHRoOwogCWluZm8tPm1hcC5waHlzCQk9IHJlcy0+c3RhcnQ7CiAJaW5mby0+bWFwLnZpcnQJCT0gYmFzZTsKLQlpbmZvLT5tYXAubmFtZQkJPSBkZXYtPmRldi5idXNfaWQ7CisJaW5mby0+bWFwLm5hbWUJCT0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAlpbmZvLT5tYXAuc2V0X3ZwcAk9IGFybWZsYXNoX3NldF92cHA7CiAKIAlzaW1wbGVfbWFwX2luaXQoJmluZm8tPm1hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCmluZGV4IDNlYTFkZTkuLmQ0ZmI5YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCkBAIC0xODgsNyArMTg4LDcgQEAKICAJICovCiAJaW5mby0+bWFwLm1hcF9wcml2XzIgPSAodW5zaWduZWQgbG9uZykgaXhwX2RhdGEtPmJhbmtfc2V0dXA7CiAKLQlpbmZvLT5tYXAubmFtZSA9IGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAubmFtZSA9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJaW5mby0+bWFwLnJlYWQgPSBpeHAyMDAwX2ZsYXNoX3JlYWQ4OwogCWluZm8tPm1hcC53cml0ZSA9IGl4cDIwMDBfZmxhc2hfd3JpdGU4OwogCWluZm8tPm1hcC5jb3B5X2Zyb20gPSBpeHAyMDAwX2ZsYXNoX2NvcHlfZnJvbTsKQEAgLTE5Niw3ICsxOTYsNyBAQAogCiAJaW5mby0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKGRldi0+cmVzb3VyY2UtPnN0YXJ0LAogCQkJZGV2LT5yZXNvdXJjZS0+ZW5kIC0gZGV2LT5yZXNvdXJjZS0+c3RhcnQgKyAxLAotCQkJZGV2LT5kZXYuYnVzX2lkKTsKKwkJCWRldl9uYW1lKCZkZXYtPmRldikpOwogCWlmICghaW5mby0+cmVzKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ291bGQgbm90IHJlc2VydmUgbWVtb3J5IHJlZ2lvblxuIik7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jIGIvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYwppbmRleCAxNjU1NWNiLi43MjE0Yjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCSAqIGhhbmRsZSB0aGF0LgogCSAqLwogCWluZm8tPm1hcC5iYW5rd2lkdGggPSAyOwotCWluZm8tPm1hcC5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm1hcC5uYW1lID0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAlpbmZvLT5tYXAucmVhZCA9IGl4cDR4eF9yZWFkMTYsCiAJaW5mby0+bWFwLndyaXRlID0gaXhwNHh4X3Byb2JlX3dyaXRlMTYsCiAJaW5mby0+bWFwLmNvcHlfZnJvbSA9IGl4cDR4eF9jb3B5X2Zyb20sCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMgYi9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMKaW5kZXggMDVmMjc2YS4uN2U1MGU5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9vbWFwX25vci5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKIAl9Ci0JaW5mby0+bWFwLm5hbWUJCT0gcGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAubmFtZQkJPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlpbmZvLT5tYXAucGh5cwkJPSByZXMtPnN0YXJ0OwogCWluZm8tPm1hcC5zaXplCQk9IHNpemU7CiAJaW5mby0+bWFwLmJhbmt3aWR0aAk9IHBkYXRhLT53aWR0aDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKaW5kZXggZGZiZjNmMi4uMWRiMTZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKQEAgLTEwOCwxMyArMTA4LDEzIEBACiAJCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJmRldi0+ZGV2LAogCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCwKIAkJCWRldi0+cmVzb3VyY2VbaV0uZW5kIC0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydCArIDEsCi0JCQlkZXYtPmRldi5idXNfaWQpKSB7CisJCQlkZXZfbmFtZSgmZGV2LT5kZXYpKSkgewogCQkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZCBub3QgcmVzZXJ2ZSBtZW1vcnkgcmVnaW9uXG4iKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAotCQlpbmZvLT5tYXBbaV0ubmFtZSA9IGRldi0+ZGV2LmJ1c19pZDsKKwkJaW5mby0+bWFwW2ldLm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOwogCQlpbmZvLT5tYXBbaV0ucGh5cyA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7CiAJCWluZm8tPm1hcFtpXS5zaXplID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQgLSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0ICsgMTsKIAkJaW5mby0+bWFwW2ldLmJhbmt3aWR0aCA9IHBoeXNtYXBfZGF0YS0+d2lkdGg7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJICogV2UgZGV0ZWN0ZWQgbXVsdGlwbGUgZGV2aWNlcy4gQ29uY2F0ZW5hdGUgdGhlbSB0b2dldGhlci4KIAkJICovCiAjaWZkZWYgQ09ORklHX01URF9DT05DQVQKLQkJaW5mby0+Y210ZCA9IG10ZF9jb25jYXRfY3JlYXRlKGluZm8tPm10ZCwgZGV2aWNlc19mb3VuZCwgZGV2LT5kZXYuYnVzX2lkKTsKKwkJaW5mby0+Y210ZCA9IG10ZF9jb25jYXRfY3JlYXRlKGluZm8tPm10ZCwgZGV2aWNlc19mb3VuZCwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAJCWlmIChpbmZvLT5jbXRkID09IE5VTEwpCiAJCQllcnIgPSAtRU5YSU87CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYwppbmRleCA1ZmNmZWMwLi5mYmYwY2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAKIAllcnIgPSAtRUJVU1k7CiAJaW5mby0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEsCi0JCQkJICAgICAgIGRldi0+ZGV2LmJ1c19pZCk7CisJCQkJICAgICAgIGRldl9uYW1lKCZkZXYtPmRldikpOwogCWlmICghaW5mby0+cmVzKQogCQlnb3RvIGVycl9vdXQ7CiAKQEAgLTE5NCw3ICsxOTQsNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JaW5mby0+bWFwLm5hbWUgPSBkZXYtPmRldi5idXNfaWQ7CisJaW5mby0+bWFwLm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOwogCWluZm8tPm1hcC5waHlzID0gcmVzLnN0YXJ0OwogCWluZm8tPm1hcC5zaXplID0gcmVzLmVuZCAtIHJlcy5zdGFydCArIDE7CiAJaW5mby0+bWFwLmJhbmt3aWR0aCA9ICp3aWR0aDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNvbmNhdC5jIGIvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKaW5kZXggNzg5ODQyZC4uMWEwNWNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKQEAgLTY5MSw3ICs2OTEsNyBAQAogICovCiBzdHJ1Y3QgbXRkX2luZm8gKm10ZF9jb25jYXRfY3JlYXRlKHN0cnVjdCBtdGRfaW5mbyAqc3ViZGV2W10sCS8qIHN1YmRldmljZXMgdG8gY29uY2F0ZW5hdGUgKi8KIAkJCQkgICBpbnQgbnVtX2RldnMsCS8qIG51bWJlciBvZiBzdWJkZXZpY2VzICAgICAgKi8KLQkJCQkgICBjaGFyICpuYW1lKQorCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CQkJCS8qIG5hbWUgZm9yIHRoZSBuZXcgZGV2aWNlICAgKi8KIAlpbnQgaTsKIAlzaXplX3Qgc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX3VwbS5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKaW5kZXggYTgzMTkyZi4uNzgxNWE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCiAJZnVuLT5ybmJfZ3BpbyA9IG9mX2dldF9ncGlvKG9mZGV2LT5ub2RlLCAwKTsKIAlpZiAoZnVuLT5ybmJfZ3BpbyA+PSAwKSB7Ci0JCXJldCA9IGdwaW9fcmVxdWVzdChmdW4tPnJuYl9ncGlvLCBvZmRldi0+ZGV2LmJ1c19pZCk7CisJCXJldCA9IGdwaW9fcmVxdWVzdChmdW4tPnJuYl9ncGlvLCBkZXZfbmFtZSgmb2ZkZXYtPmRldikpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiY2FuJ3QgcmVxdWVzdCBSTkIgZ3Bpb1xuIik7CiAJCQlnb3RvIGVycjI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYwppbmRleCBmNjc0YzU0Li43NWY5ZjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlkYXRhLT5jaGlwLnByaXYgPSAmZGF0YTsKIAlkYXRhLT5tdGQucHJpdiA9ICZkYXRhLT5jaGlwOwogCWRhdGEtPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOwotCWRhdGEtPm10ZC5uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKKwlkYXRhLT5tdGQubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCiAJZGF0YS0+Y2hpcC5JT19BRERSX1IgPSBkYXRhLT5pb19iYXNlOwogCWRhdGEtPmNoaXAuSU9fQUREUl9XID0gZGF0YS0+aW9fYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvdG1pb19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jCmluZGV4IGVkYjFlMzIyLi5kYWE2YTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvdG1pb19uYW5kLmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogCW5hbmRfY2hpcC0+Y2hpcF9kZWxheSA9IDE1OwogCiAJcmV0dmFsID0gcmVxdWVzdF9pcnEoaXJxLCAmdG1pb19pcnEsCi0JCQkJSVJRRl9ESVNBQkxFRCwgZGV2LT5kZXYuYnVzX2lkLCB0bWlvKTsKKwkJCQlJUlFGX0RJU0FCTEVELCBkZXZfbmFtZSgmZGV2LT5kZXYpLCB0bWlvKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZXJyb3IgJWRcbiIsIHJldHZhbCk7CiAJCWdvdG8gZXJyX2lycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvZ2VuZXJpYy5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKaW5kZXggYWQ4MWFiOC4uNWI2OWU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAlpbmZvLT5vbmVuYW5kLm1tY29udHJvbCA9IHBkYXRhLT5tbWNvbnRyb2w7CiAJaW5mby0+b25lbmFuZC5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCi0JaW5mby0+bXRkLm5hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm10ZC5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAJaW5mby0+bXRkLnByaXYgPSAmaW5mby0+b25lbmFuZDsKIAlpbmZvLT5tdGQub3duZXIgPSBUSElTX01PRFVMRTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jCmluZGV4IGQxZTBiOGUuLjk2ZWNjMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb21hcDIuYworKysgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMKQEAgLTY2OCw3ICs2NjgsNyBAQAogCQkgYy0+b25lbmFuZC5iYXNlKTsKIAogCWMtPnBkZXYgPSBwZGV2OwotCWMtPm10ZC5uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKKwljLT5tdGQubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCWMtPm10ZC5wcml2ID0gJmMtPm9uZW5hbmQ7CiAJYy0+bXRkLm93bmVyID0gVEhJU19NT0RVTEU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKaW5kZXggYmEwYmQzZC4uN2NhZjIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCXViaS0+ZGV2LnJlbGVhc2UgPSBkZXZfcmVsZWFzZTsKIAl1YmktPmRldi5kZXZ0ID0gdWJpLT5jZGV2LmRldjsKIAl1YmktPmRldi5jbGFzcyA9IHViaV9jbGFzczsKLQlzcHJpbnRmKCZ1YmktPmRldi5idXNfaWRbMF0sIFVCSV9OQU1FX1NUUiIlZCIsIHViaS0+dWJpX251bSk7CisJZGV2X3NldF9uYW1lKCZ1YmktPmRldiwgVUJJX05BTUVfU1RSIiVkIiwgdWJpLT51YmlfbnVtKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnViaS0+ZGV2KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ZtdC5jIGIvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCmluZGV4IDM1MzFjYTkuLjIyZTFkNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS92bXQuYworKysgYi9kcml2ZXJzL210ZC91Ymkvdm10LmMKQEAgLTMyOSw3ICszMjksNyBAQAogCXZvbC0+ZGV2LmRldnQgPSBkZXY7CiAJdm9sLT5kZXYuY2xhc3MgPSB1YmlfY2xhc3M7CiAKLQlzcHJpbnRmKCZ2b2wtPmRldi5idXNfaWRbMF0sICIlc18lZCIsIHViaS0+dWJpX25hbWUsIHZvbC0+dm9sX2lkKTsKKwlkZXZfc2V0X25hbWUoJnZvbC0+ZGV2LCAiJXNfJWQiLCB1YmktPnViaV9uYW1lLCB2b2wtPnZvbF9pZCk7CiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ2b2wtPmRldik7CiAJaWYgKGVycikgewogCQl1YmlfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgZGV2aWNlIik7CkBAIC02NzgsNyArNjc4LDcgQEAKIAl2b2wtPmRldi5wYXJlbnQgPSAmdWJpLT5kZXY7CiAJdm9sLT5kZXYuZGV2dCA9IGRldjsKIAl2b2wtPmRldi5jbGFzcyA9IHViaV9jbGFzczsKLQlzcHJpbnRmKCZ2b2wtPmRldi5idXNfaWRbMF0sICIlc18lZCIsIHViaS0+dWJpX25hbWUsIHZvbC0+dm9sX2lkKTsKKwlkZXZfc2V0X25hbWUoJnZvbC0+ZGV2LCAiJXNfJWQiLCB1YmktPnViaV9uYW1lLCB2b2wtPnZvbF9pZCk7CiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ2b2wtPmRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXRfZ2x1ZWJpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMgYi9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYwppbmRleCBhYzJhODA1Li44OTAxZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYwpAQCAtODQsNyArODQsNyBAQAogCiAJYWRkX3RpbWVyICgmdGltZXIpOwogCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSAoJnBvcnQtPnBoeXNwb3J0LT5pZWVlMTI4NC5pcnEpOwotCWlmICghZGVsX3RpbWVyICgmdGltZXIpICYmICFyZXQpCisJaWYgKCFkZWxfdGltZXJfc3luYygmdGltZXIpICYmICFyZXQpCiAJCS8qIFRpbWVkIG91dC4gKi8KIAkJcmV0ID0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IGI0Y2RkNjkuLjk5ZDg2N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTMwMCw2ICszMDAsMTQgQEAKIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCitzdGF0aWMgYm9vbCBwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisKKwlyZXR1cm4gZHJ2ICYmIChkcnYtPnN1c3BlbmQgfHwgZHJ2LT5zdXNwZW5kX2xhdGUgfHwgZHJ2LT5yZXN1bWUKKwkJfHwgZHJ2LT5yZXN1bWVfZWFybHkpOworfQorCiAvKgogICogRGVmYXVsdCAic3VzcGVuZCIgbWV0aG9kIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBubyBkcml2ZXIgcHJvdmlkZWQgc3VzcGVuZCwKICAqIG9yIG5vdCBldmVuIGEgZHJpdmVyIGF0IGFsbC4KQEAgLTMxNywxNCArMzI1LDIyIEBACiAKIC8qCiAgKiBEZWZhdWx0ICJyZXN1bWUiIG1ldGhvZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgbm8gZHJpdmVyIHByb3ZpZGVkIHJlc3VtZSwKLSAqIG9yIG5vdCBldmVuIGEgZHJpdmVyIGF0IGFsbC4KKyAqIG9yIG5vdCBldmVuIGEgZHJpdmVyIGF0IGFsbCAoZmlyc3QgcGFydCkuCiAgKi8KLXN0YXRpYyBpbnQgcGNpX2RlZmF1bHRfcG1fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQorc3RhdGljIHZvaWQgcGNpX2RlZmF1bHRfcG1fcmVzdW1lX2Vhcmx5KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewotCWludCByZXR2YWwgPSAwOwotCiAJLyogcmVzdG9yZSB0aGUgUENJIGNvbmZpZyBzcGFjZSAqLwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworfQorCisvKgorICogRGVmYXVsdCAicmVzdW1lIiBtZXRob2QgZm9yIGRldmljZXMgdGhhdCBoYXZlIG5vIGRyaXZlciBwcm92aWRlZCByZXN1bWUsCisgKiBvciBub3QgZXZlbiBhIGRyaXZlciBhdCBhbGwgKHNlY29uZCBwYXJ0KS4KKyAqLworc3RhdGljIGludCBwY2lfZGVmYXVsdF9wbV9yZXN1bWVfbGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpbnQgcmV0dmFsOworCiAJLyogaWYgdGhlIGRldmljZSB3YXMgZW5hYmxlZCBiZWZvcmUgc3VzcGVuZCwgcmVlbmFibGUgKi8KIAlyZXR2YWwgPSBwY2lfcmVlbmFibGVfZGV2aWNlKHBjaV9kZXYpOwogCS8qCkBAIC0zNzEsMTAgKzM4NywxMiBAQAogCXN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgcGNpX2RyaXZlciAqIGRydiA9IHBjaV9kZXYtPmRyaXZlcjsKIAotCWlmIChkcnYgJiYgZHJ2LT5yZXN1bWUpCisJaWYgKGRydiAmJiBkcnYtPnJlc3VtZSkgewogCQllcnJvciA9IGRydi0+cmVzdW1lKHBjaV9kZXYpOwotCWVsc2UKLQkJZXJyb3IgPSBwY2lfZGVmYXVsdF9wbV9yZXN1bWUocGNpX2Rldik7CisJfSBlbHNlIHsKKwkJcGNpX2RlZmF1bHRfcG1fcmVzdW1lX2Vhcmx5KHBjaV9kZXYpOworCQllcnJvciA9IHBjaV9kZWZhdWx0X3BtX3Jlc3VtZV9sYXRlKHBjaV9kZXYpOworCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTQyMCwxMCArNDM4LDggQEAKIAkJaWYgKGRydi0+cG0tPnN1c3BlbmQpIHsKIAkJCWVycm9yID0gZHJ2LT5wbS0+c3VzcGVuZChkZXYpOwogCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnN1c3BlbmQsIGVycm9yKTsKLQkJfSBlbHNlIHsKLQkJCXBjaV9kZWZhdWx0X3BtX3N1c3BlbmQocGNpX2Rldik7CiAJCX0KLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewogCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfU1VTUEVORCk7CiAJfQogCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHBjaV9kZXYpOwpAQCAtNDM0LDcgKzQ1MCw3IEBACiBzdGF0aWMgaW50IHBjaV9wbV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7CkBAIC00NDIsOCArNDU4LDEwIEBACiAJCQllcnJvciA9IGRydi0+cG0tPnN1c3BlbmRfbm9pcnEoZGV2KTsKIAkJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5zdXNwZW5kX25vaXJxLCBlcnJvcik7CiAJCX0KLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewogCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19TVVNQRU5EKTsKKwl9IGVsc2UgeworCQlwY2lfZGVmYXVsdF9wbV9zdXNwZW5kKHBjaV9kZXYpOwogCX0KIAogCXJldHVybiBlcnJvcjsKQEAgLTQ1MywxNSArNDcxLDE3IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwotCWludCBlcnJvcjsKKwlpbnQgZXJyb3IgPSAwOwogCiAJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKIAogCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQllcnJvciA9IGRydi0+cG0tPnJlc3VtZSA/IGRydi0+cG0tPnJlc3VtZShkZXYpIDoKLQkJCXBjaV9kZWZhdWx0X3BtX3Jlc3VtZShwY2lfZGV2KTsKLQl9IGVsc2UgeworCQlpZiAoZHJ2LT5wbS0+cmVzdW1lKQorCQkJZXJyb3IgPSBkcnYtPnBtLT5yZXN1bWUoZGV2KTsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKIAkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZShkZXYpOworCX0gZWxzZSB7CisJCWVycm9yID0gcGNpX2RlZmF1bHRfcG1fcmVzdW1lX2xhdGUocGNpX2Rldik7CiAJfQogCiAJcmV0dXJuIGVycm9yOwpAQCAtNDcwLDE2ICs0OTAsMTggQEAKIHN0YXRpYyBpbnQgcGNpX3BtX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZV9lYXJseSwgcGNpX2Rldik7CisJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lX2Vhcmx5LCB0b19wY2lfZGV2KGRldikpOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT5yZXN1bWVfbm9pcnEpCiAJCQllcnJvciA9IGRydi0+cG0tPnJlc3VtZV9ub2lycShkZXYpOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7CiAJCWVycm9yID0gcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKKwl9IGVsc2UgeworCQlwY2lfZGVmYXVsdF9wbV9yZXN1bWVfZWFybHkocGNpX2Rldik7CiAJfQogCiAJcmV0dXJuIGVycm9yOwpAQCAtNTA2LDEwICs1MjgsOCBAQAogCQlpZiAoZHJ2LT5wbS0+ZnJlZXplKSB7CiAJCQllcnJvciA9IGRydi0+cG0tPmZyZWV6ZShkZXYpOwogCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPmZyZWV6ZSwgZXJyb3IpOwotCQl9IGVsc2UgewotCQkJcGNpX2RlZmF1bHRfcG1fc3VzcGVuZChwY2lfZGV2KTsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7CiAJCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19GUkVFWkUpOwogCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9zdXNwZW5kLCBwY2lfZGV2KTsKIAl9CkBAIC01MjAsNyArNTQwLDcgQEAKIHN0YXRpYyBpbnQgcGNpX3BtX2ZyZWV6ZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAogCWlmIChkcnYgJiYgZHJ2LT5wbSkgewpAQCAtNTI4LDggKzU0OCwxMCBAQAogCQkJZXJyb3IgPSBkcnYtPnBtLT5mcmVlemVfbm9pcnEoZGV2KTsKIAkJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5mcmVlemVfbm9pcnEsIGVycm9yKTsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7CiAJCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX0ZSRUVaRSk7CisJfSBlbHNlIHsKKwkJcGNpX2RlZmF1bHRfcG1fc3VzcGVuZChwY2lfZGV2KTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC01MzcsMTQgKzU1OSwxNSBAQAogCiBzdGF0aWMgaW50IHBjaV9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAogCWlmIChkcnYgJiYgZHJ2LT5wbSkgewogCQlpZiAoZHJ2LT5wbS0+dGhhdykKIAkJCWVycm9yID0gIGRydi0+cG0tPnRoYXcoZGV2KTsKLQl9IGVsc2UgewotCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWUsIHRvX3BjaV9kZXYoZGV2KSk7CisJfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7CisJCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgcGNpX2Rldik7CiAJCWVycm9yID0gcGNpX2xlZ2FjeV9yZXN1bWUoZGV2KTsKIAl9CiAKQEAgLTU1NCwxNCArNTc3LDE0IEBACiBzdGF0aWMgaW50IHBjaV9wbV90aGF3X25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT50aGF3X25vaXJxKQogCQkJZXJyb3IgPSBkcnYtPnBtLT50aGF3X25vaXJxKGRldik7Ci0JfSBlbHNlIHsKLQkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lX2Vhcmx5LCBwY2lfZGV2KTsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKKwkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lX2Vhcmx5LCB0b19wY2lfZGV2KGRldikpOwogCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CiAJfQogCkBAIC01NzAsMTcgKzU5MywxOCBAQAogCiBzdGF0aWMgaW50IHBjaV9wbV9wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9zdXNwZW5kLCB0b19wY2lfZGV2KGRldikpOworCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHBjaV9kZXYpOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT5wb3dlcm9mZikgewogCQkJZXJyb3IgPSBkcnYtPnBtLT5wb3dlcm9mZihkZXYpOwogCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnBvd2Vyb2ZmLCBlcnJvcik7CiAJCX0KLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewogCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfSElCRVJOQVRFKTsKIAl9CiAKQEAgLTU4OSw4ICs2MTMsNyBAQAogCiBzdGF0aWMgaW50IHBjaV9wbV9wb3dlcm9mZl9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAogCWlmIChkcnYgJiYgZHJ2LT5wbSkgewpAQCAtNTk4LDcgKzYyMSw3IEBACiAJCQllcnJvciA9IGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7CiAJCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+cG93ZXJvZmZfbm9pcnEsIGVycm9yKTsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHRvX3BjaV9kZXYoZGV2KSkpIHsKIAkJZXJyb3IgPSBwY2lfbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfSElCRVJOQVRFKTsKIAl9CiAKQEAgLTYwOSwxMyArNjMyLDE1IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwotCWludCBlcnJvcjsKKwlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWVycm9yID0gZHJ2LT5wbS0+cmVzdG9yZSA/IGRydi0+cG0tPnJlc3RvcmUoZGV2KSA6Ci0JCQlwY2lfZGVmYXVsdF9wbV9yZXN1bWUocGNpX2Rldik7Ci0JfSBlbHNlIHsKKwkJaWYgKGRydi0+cG0tPnJlc3RvcmUpCisJCQllcnJvciA9IGRydi0+cG0tPnJlc3RvcmUoZGV2KTsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKIAkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZShkZXYpOworCX0gZWxzZSB7CisJCWVycm9yID0gcGNpX2RlZmF1bHRfcG1fcmVzdW1lX2xhdGUocGNpX2Rldik7CiAJfQogCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgcGNpX2Rldik7CiAKQEAgLTYyNSw3ICs2NTAsNyBAQAogc3RhdGljIGludCBwY2lfcG1fcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAogCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgcGNpX2Rldik7CkBAIC02MzMsOCArNjU4LDEwIEBACiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT5yZXN0b3JlX25vaXJxKQogCQkJZXJyb3IgPSBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKGRldik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKIAkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOworCX0gZWxzZSB7CisJCXBjaV9kZWZhdWx0X3BtX3Jlc3VtZV9lYXJseShwY2lfZGV2KTsKIAl9CiAJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lX2Vhcmx5LCBwY2lfZGV2KTsKIApAQCAtNjU0LDE3ICs2ODEsMTUgQEAKIAogI2VuZGlmIC8qICFDT05GSUdfSElCRVJOQVRJT04gKi8KIAotc3RydWN0IHBtX2V4dF9vcHMgcGNpX3BtX29wcyA9IHsKLQkuYmFzZSA9IHsKLQkJLnByZXBhcmUgPSBwY2lfcG1fcHJlcGFyZSwKLQkJLmNvbXBsZXRlID0gcGNpX3BtX2NvbXBsZXRlLAotCQkuc3VzcGVuZCA9IHBjaV9wbV9zdXNwZW5kLAotCQkucmVzdW1lID0gcGNpX3BtX3Jlc3VtZSwKLQkJLmZyZWV6ZSA9IHBjaV9wbV9mcmVlemUsCi0JCS50aGF3ID0gcGNpX3BtX3RoYXcsCi0JCS5wb3dlcm9mZiA9IHBjaV9wbV9wb3dlcm9mZiwKLQkJLnJlc3RvcmUgPSBwY2lfcG1fcmVzdG9yZSwKLQl9LAorc3RydWN0IGRldl9wbV9vcHMgcGNpX2Rldl9wbV9vcHMgPSB7CisJLnByZXBhcmUgPSBwY2lfcG1fcHJlcGFyZSwKKwkuY29tcGxldGUgPSBwY2lfcG1fY29tcGxldGUsCisJLnN1c3BlbmQgPSBwY2lfcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gcGNpX3BtX3Jlc3VtZSwKKwkuZnJlZXplID0gcGNpX3BtX2ZyZWV6ZSwKKwkudGhhdyA9IHBjaV9wbV90aGF3LAorCS5wb3dlcm9mZiA9IHBjaV9wbV9wb3dlcm9mZiwKKwkucmVzdG9yZSA9IHBjaV9wbV9yZXN0b3JlLAogCS5zdXNwZW5kX25vaXJxID0gcGNpX3BtX3N1c3BlbmRfbm9pcnEsCiAJLnJlc3VtZV9ub2lycSA9IHBjaV9wbV9yZXN1bWVfbm9pcnEsCiAJLmZyZWV6ZV9ub2lycSA9IHBjaV9wbV9mcmVlemVfbm9pcnEsCkBAIC02NzMsNyArNjk4LDcgQEAKIAkucmVzdG9yZV9ub2lycSA9IHBjaV9wbV9yZXN0b3JlX25vaXJxLAogfTsKIAotI2RlZmluZSBQQ0lfUE1fT1BTX1BUUgkmcGNpX3BtX29wcworI2RlZmluZSBQQ0lfUE1fT1BTX1BUUgkoJnBjaV9kZXZfcG1fb3BzKQogCiAjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCiAKQEAgLTcwMyw5ICs3MjgsNiBAQAogCWRydi0+ZHJpdmVyLm93bmVyID0gb3duZXI7CiAJZHJ2LT5kcml2ZXIubW9kX25hbWUgPSBtb2RfbmFtZTsKIAotCWlmIChkcnYtPnBtKQotCQlkcnYtPmRyaXZlci5wbSA9ICZkcnYtPnBtLT5iYXNlOwotCiAJc3Bpbl9sb2NrX2luaXQoJmRydi0+ZHluaWRzLmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZkcnYtPmR5bmlkcy5saXN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvY2FyZC5jIGIvZHJpdmVycy9wbnAvY2FyZC5jCmluZGV4IGU3NWIwNjAuLmVmZWExMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2NhcmQuYworKysgYi9kcml2ZXJzL3BucC9jYXJkLmMKQEAgLTE2NSw4ICsxNjUsNyBAQAogCWNhcmQtPm51bWJlciA9IGlkOwogCiAJY2FyZC0+ZGV2LnBhcmVudCA9ICZjYXJkLT5wcm90b2NvbC0+ZGV2OwotCXNwcmludGYoY2FyZC0+ZGV2LmJ1c19pZCwgIiUwMng6JTAyeCIsIGNhcmQtPnByb3RvY29sLT5udW1iZXIsCi0JCWNhcmQtPm51bWJlcik7CisJZGV2X3NldF9uYW1lKCZjYXJkLT5kZXYsICIlMDJ4OiUwMngiLCBjYXJkLT5wcm90b2NvbC0+bnVtYmVyLCBjYXJkLT5udW1iZXIpOwogCiAJY2FyZC0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gRE1BXzI0QklUX01BU0s7CiAJY2FyZC0+ZGV2LmRtYV9tYXNrID0gJmNhcmQtPmRldi5jb2hlcmVudF9kbWFfbWFzazsKQEAgLTI5NSw4ICsyOTQsOCBAQAogewogCWRldi0+ZGV2LnBhcmVudCA9ICZjYXJkLT5kZXY7CiAJZGV2LT5jYXJkX2xpbmsgPSBOVUxMOwotCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlMDJ4OiUwMnguJTAyeCIsCi0JCSBkZXYtPnByb3RvY29sLT5udW1iZXIsIGNhcmQtPm51bWJlciwgZGV2LT5udW1iZXIpOworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICIlMDJ4OiUwMnguJTAyeCIsCisJCSAgICAgZGV2LT5wcm90b2NvbC0+bnVtYmVyLCBjYXJkLT5udW1iZXIsIGRldi0+bnVtYmVyKTsKIAlzcGluX2xvY2soJnBucF9sb2NrKTsKIAlkZXYtPmNhcmQgPSBjYXJkOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+Y2FyZF9saXN0LCAmY2FyZC0+ZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9jb3JlLmMgYi9kcml2ZXJzL3BucC9jb3JlLmMKaW5kZXggMTZjMDFjNi4uMTQ4MTRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL2NvcmUuYwpAQCAtNzAsNyArNzAsNyBAQAogCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7CiAKIAlwcm90b2NvbC0+bnVtYmVyID0gbm9kZW51bTsKLQlzcHJpbnRmKHByb3RvY29sLT5kZXYuYnVzX2lkLCAicG5wJWQiLCBub2RlbnVtKTsKKwlkZXZfc2V0X25hbWUoJnByb3RvY29sLT5kZXYsICJwbnAlZCIsIG5vZGVudW0pOwogCXJldHVybiBkZXZpY2VfcmVnaXN0ZXIoJnByb3RvY29sLT5kZXYpOwogfQogCkBAIC0xNDUsOCArMTQ1LDcgQEAKIAlkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IGRldi0+ZG1hX21hc2s7CiAJZGV2LT5kZXYucmVsZWFzZSA9ICZwbnBfcmVsZWFzZV9kZXZpY2U7CiAKLQlzcHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgIiUwMng6JTAyeCIsIGRldi0+cHJvdG9jb2wtPm51bWJlciwKLQkJZGV2LT5udW1iZXIpOworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICIlMDJ4OiUwMngiLCBkZXYtPnByb3RvY29sLT5udW1iZXIsIGRldi0+bnVtYmVyKTsKIAogCWRldl9pZCA9IHBucF9hZGRfaWQoZGV2LCBwbnBpZCk7CiAJaWYgKCFkZXZfaWQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3N5c3RlbS5jIGIvZHJpdmVycy9wbnAvc3lzdGVtLmMKaW5kZXggNzY0ZjNhMy4uNTliOTA5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvc3lzdGVtLmMKKysrIGIvZHJpdmVycy9wbnAvc3lzdGVtLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAkJCSAgcmVzb3VyY2Vfc2l6ZV90IGVuZCwgaW50IHBvcnQpCiB7CiAJY2hhciAqcmVnaW9uaWQ7Ci0JY29uc3QgY2hhciAqcG5waWQgPSBkZXYtPmRldi5idXNfaWQ7CisJY29uc3QgY2hhciAqcG5waWQgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCiAJcmVnaW9uaWQgPSBrbWFsbG9jKDE2LCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYwppbmRleCAzMDhkZGIyLi4xZDc2ODkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jCkBAIC0zNTQsNyArMzU0LDcgQEAKIAlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWRpLT5kZXYJCT0gJnBkZXYtPmRldjsKIAlkaS0+dzFfZGV2CSAgICAgPSBwZGV2LT5kZXYucGFyZW50OwotCWRpLT5iYXQubmFtZQkgICA9IHBkZXYtPmRldi5idXNfaWQ7CisJZGktPmJhdC5uYW1lCSAgID0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAJZGktPmJhdC50eXBlCSAgID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKIAlkaS0+YmF0LnByb3BlcnRpZXMgICAgID0gZHMyNzYwX2JhdHRlcnlfcHJvcHM7CiAJZGktPmJhdC5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoZHMyNzYwX2JhdHRlcnlfcHJvcHMpOwpAQCAtMzcxLDcgKzM3MSw3IEBACiAJfQogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmRpLT5tb25pdG9yX3dvcmssIGRzMjc2MF9iYXR0ZXJ5X3dvcmspOwotCWRpLT5tb25pdG9yX3dxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKHBkZXYtPmRldi5idXNfaWQpOworCWRpLT5tb25pdG9yX3dxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKIAlpZiAoIWRpLT5tb25pdG9yX3dxdWV1ZSkgewogCQlyZXR2YWwgPSAtRVNSQ0g7CiAJCWdvdG8gd29ya3F1ZXVlX2ZhaWxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLWRyaXZlci5jCmluZGV4IDk1NmQzZTcuLmFkZGI4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMKKysrIGIvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYwpAQCAtNzksNyArNzksNiBAQAogCiAvKioKICAqICByaW9fZGV2aWNlX3Byb2JlIC0gVGVsbCBpZiBhIFJJTyBkZXZpY2Ugc3RydWN0dXJlIGhhcyBhIG1hdGNoaW5nIFJJTyBkZXZpY2UgaWQgc3RydWN0dXJlCi0gKiAgQGlkOiB0aGUgUklPIGRldmljZSBpZCBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAogICogIEBkZXY6IHRoZSBSSU8gZGV2aWNlIHN0cnVjdHVyZSB0byBtYXRjaCBhZ2FpbnN0CiAgKgogICogcmV0dXJuIDAgYW5kIHNldCByaW9fZGV2LT5kcml2ZXIgd2hlbiBkcnYgY2xhaW1zIHJpb19kZXYsIGVsc2UgZXJyb3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IDE2NWE4MTguLjRhZDgzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtMzUsOCArMzUsOCBAQAogCWRlZmF1bHQgInJ0YzAiCiAJaGVscAogCSAgVGhlIFJUQyBkZXZpY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gKHJlKWluaXRpYWxpemUgdGhlIHN5c3RlbQotCSAgY2xvY2ssIHVzdWFsbHkgcnRjMC4gIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgd2hlbiB0aGUgc3lzdGVtCi0JICBzdGFydHMgdXAsIGFuZCB3aGVuIGl0IHJlc3VtZXMgZnJvbSBhIGxvdyBwb3dlciBzdGF0ZS4gIFRoaXMKKwkgIGNsb2NrLCB1c3VhbGx5IHJ0YzAuIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgd2hlbiB0aGUgc3lzdGVtCisJICBzdGFydHMgdXAsIGFuZCB3aGVuIGl0IHJlc3VtZXMgZnJvbSBhIGxvdyBwb3dlciBzdGF0ZS4gVGhpcwogCSAgZGV2aWNlIHNob3VsZCByZWNvcmQgdGltZSBpbiBVVEMsIHNpbmNlIHRoZSBrZXJuZWwgd29uJ3QgZG8KIAkgIHRpbWV6b25lIGNvcnJlY3Rpb24uCiAKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkgIGZ1bmN0aW9ucyBydW4sIHNvIGl0IG11c3QgdXN1YWxseSBiZSBzdGF0aWNhbGx5IGxpbmtlZC4KIAogCSAgVGhpcyBjbG9jayBzaG91bGQgYmUgYmF0dGVyeS1iYWNrZWQsIHNvIHRoYXQgaXQgcmVhZHMgdGhlIGNvcnJlY3QKLQkgIHRpbWUgd2hlbiB0aGUgc3lzdGVtIGJvb3RzIGZyb20gYSBwb3dlci1vZmYgc3RhdGUuICBPdGhlcndpc2UsIHlvdXIKKwkgIHRpbWUgd2hlbiB0aGUgc3lzdGVtIGJvb3RzIGZyb20gYSBwb3dlci1vZmYgc3RhdGUuIE90aGVyd2lzZSwgeW91cgogCSAgc3lzdGVtIHdpbGwgbmVlZCBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2UgKGxpa2UgYW4gTlRQIHNlcnZlcikuCiAKIAkgIElmIHRoZSBjbG9jayB5b3Ugc3BlY2lmeSBoZXJlIGlzIG5vdCBiYXR0ZXJ5IGJhY2tlZCwgaXQgbWF5IHN0aWxsCkBAIC02OSw4ICs2OSw3IEBACiAJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgUlRDcyB1c2luZyBzeXNmcyBpbnRlcmZhY2VzLAogCSAgL3N5cy9jbGFzcy9ydGMvcnRjMCB0aHJvdWdoIC9zeXMvLi4uL3J0Y04uCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXN5c2ZzLgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogY29uZmlnIFJUQ19JTlRGX1BST0MKIAlib29sZWFuICIvcHJvYy9kcml2ZXIvcnRjIChwcm9jZnMgZm9yIHJ0YzApIgpAQCAtNzgsMTEgKzc3LDEwIEBACiAJZGVmYXVsdCBSVENfQ0xBU1MKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgZmlyc3QgUlRDIHRocm91Z2ggdGhlIHByb2MKLQkgIGludGVyZmFjZSwgL3Byb2MvZHJpdmVyL3J0Yy4gIE90aGVyIFJUQ3Mgd2lsbCBub3QgYmUgYXZhaWxhYmxlCisJICBpbnRlcmZhY2UsIC9wcm9jL2RyaXZlci9ydGMuIE90aGVyIFJUQ3Mgd2lsbCBub3QgYmUgYXZhaWxhYmxlCiAJICB0aHJvdWdoIHRoYXQgQVBJLgogCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1wcm9jLgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogY29uZmlnIFJUQ19JTlRGX0RFVgogCWJvb2xlYW4gIi9kZXYvcnRjTiAoY2hhcmFjdGVyIGRldmljZXMpIgpAQCAtOTAsMTIgKzg4LDE0IEBACiAJaGVscAogCSAgU2F5IHllcyBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIFJUQ3MgdXNpbmcgdGhlIC9kZXYKIAkgIGludGVyZmFjZXMsIHdoaWNoICJ1ZGV2IiBzZXRzIHVwIGFzIC9kZXYvcnRjMCB0aHJvdWdoCi0JICAvZGV2L3J0Y04uICBZb3UgbWF5IHdhbnQgdG8gc2V0IHVwIGEgc3ltYm9saWMgbGluayBzbyBvbmUKLQkgIG9mIHRoZXNlIGNhbiBiZSBhY2Nlc3NlZCBhcyAvZGV2L3J0Yywgd2hpY2ggaXMgYSBuYW1lCi0JICBleHBlY3RlZCBieSAiaHdjbG9jayIgYW5kIHNvbWUgb3RoZXIgcHJvZ3JhbXMuCisJICAvZGV2L3J0Y04uCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWRldi4KKwkgIFlvdSBtYXkgd2FudCB0byBzZXQgdXAgYSBzeW1ib2xpYyBsaW5rIHNvIG9uZSBvZiB0aGVzZQorCSAgY2FuIGJlIGFjY2Vzc2VkIGFzIC9kZXYvcnRjLCB3aGljaCBpcyBhIG5hbWUKKwkgIGV4cGVjdGVkIGJ5ICJod2Nsb2NrIiBhbmQgc29tZSBvdGhlciBwcm9ncmFtcy4gUmVjZW50CisJICB2ZXJzaW9ucyBvZiAidWRldiIgYXJlIGtub3duIHRvIHNldCB1cCB0aGUgc3ltbGluayBmb3IgeW91LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgUlRDX0lOVEZfREVWX1VJRV9FTVVMCiAJYm9vbCAiUlRDIFVJRSBlbXVsYXRpb24gb24gZGV2IGludGVyZmFjZSIKQEAgLTEzMiwxNCArMTMyLDE0IEBACiAJdHJpc3RhdGUgIkRhbGxhcy9NYXhpbSBEUzEzMDcvMzcvMzgvMzkvNDAsIFNUIE00MVQwMCIKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdmFyaW91cyBjb21wYXRpYmxlIFJUQwotCSAgY2hpcHMgKG9mdGVuIHdpdGggYmF0dGVyeSBiYWNrdXApIGNvbm5lY3RlZCB3aXRoIEkyQy4gIFRoaXMgZHJpdmVyCisJICBjaGlwcyAob2Z0ZW4gd2l0aCBiYXR0ZXJ5IGJhY2t1cCkgY29ubmVjdGVkIHdpdGggSTJDLiBUaGlzIGRyaXZlcgogCSAgc2hvdWxkIGhhbmRsZSBEUzEzMDcsIERTMTMzNywgRFMxMzM4LCBEUzEzMzksIERTMTM0MCwgU1QgTTQxVDAwLAotCSAgYW5kIHByb2JhYmx5IG90aGVyIGNoaXBzLiAgSW4gc29tZSBjYXNlcyB0aGUgUlRDIG11c3QgYWxyZWFkeQorCSAgYW5kIHByb2JhYmx5IG90aGVyIGNoaXBzLiBJbiBzb21lIGNhc2VzIHRoZSBSVEMgbXVzdCBhbHJlYWR5CiAJICBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgKGJ5IG1hbnVmYWN0dXJpbmcgb3IgYSBib290bG9hZGVyKS4KIAogCSAgVGhlIGZpcnN0IHNldmVuIHJlZ2lzdGVycyBvbiB0aGVzZSBjaGlwcyBob2xkIGFuIFJUQywgYW5kIG90aGVyCiAJICByZWdpc3RlcnMgbWF5IGFkZCBmZWF0dXJlcyBzdWNoIGFzIE5WUkFNLCBhIHRyaWNrbGUgY2hhcmdlciBmb3IKLQkgIHRoZSBSVEMvTlZSQU0gYmFja3VwIHBvd2VyLCBhbmQgYWxhcm1zLiAgTlZSQU0gaXMgdmlzaWJsZSBpbgorCSAgdGhlIFJUQy9OVlJBTSBiYWNrdXAgcG93ZXIsIGFuZCBhbGFybXMuIE5WUkFNIGlzIHZpc2libGUgaW4KIAkgIHN5c2ZzLCBidXQgb3RoZXIgY2hpcCBmZWF0dXJlcyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCkBAIC0xNTAsMTAgKzE1MCwxMCBAQAogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgotCSAgRFMxMzc0IHJlYWwtdGltZSBjbG9jayBjaGlwcy4gIElmIGFuIGludGVycnVwdCBpcyBhc3NvY2lhdGVkCisJICBEUzEzNzQgcmVhbC10aW1lIGNsb2NrIGNoaXBzLiBJZiBhbiBpbnRlcnJ1cHQgaXMgYXNzb2NpYXRlZAogCSAgd2l0aCB0aGUgZGV2aWNlLCB0aGUgYWxhcm0gZnVuY3Rpb25hbGl0eSBpcyBzdXBwb3J0ZWQuCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWRzMTM3NC4KIAogY29uZmlnIFJUQ19EUlZfRFMxNjcyCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBvbiB0aGUKIAkgIFRXTDkyMzMwICJNZW5lbGF1cyIgcG93ZXIgbWFuYWdlbWVudCBjaGlwLCB1c2VkIHdpdGggT01BUDIKLQkgIHBsYXRmb3Jtcy4gIFRoZSBzdXBwb3J0IGlzIGludGVncmF0ZWQgd2l0aCB0aGUgcmVzdCBvZgorCSAgcGxhdGZvcm1zLiBUaGUgc3VwcG9ydCBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHJlc3Qgb2YKIAkgIHRoZSBNZW5lbGF1cyBkcml2ZXI7IGl0J3Mgbm90IHNlcGFyYXRlIG1vZHVsZS4KIAogY29uZmlnIFJUQ19EUlZfVFdMNDAzMApAQCAtMzA4LDcgKzMwOCw3IEBACiAJdHJpc3RhdGUgIkRhbGxhcy9NYXhpbSBEUzEzMDUvRFMxMzA2IgogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIGRyaXZlciB0byBnZXQgc3VwcG9ydCBmb3IgdGhlIERhbGxhcy9NYXhpbSBEUzEzMDUKLQkgIGFuZCBEUzEzMDYgcmVhbCB0aW1lIGNsb2NrIGNoaXBzLiAgVGhlc2Ugc3VwcG9ydCBhIHRyaWNrbGUKKwkgIGFuZCBEUzEzMDYgcmVhbCB0aW1lIGNsb2NrIGNoaXBzLiBUaGVzZSBzdXBwb3J0IGEgdHJpY2tsZQogCSAgY2hhcmdlciwgYWxhcm1zLCBhbmQgTlZSQU0gaW4gYWRkaXRpb24gdG8gdGhlIGNsb2NrLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKQEAgLTMxNyw3ICszMTcsOCBAQAogY29uZmlnIFJUQ19EUlZfRFMxMzkwCiAJdHJpc3RhdGUgIkRhbGxhcy9NYXhpbSBEUzEzOTAvOTMvOTQiCiAJaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBEUzEzOTAvOTMvOTQgY2hpcHMuCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBEYWxsYXMvTWF4aW0gRFMxMzkwLzkzLzk0IGNoaXBzLgogCiAJICBUaGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBSVEMgZmVhdHVyZSwgYW5kIG5vdCBvdGhlciBjaGlwCiAJICBmZWF0dXJlcyBzdWNoIGFzIGFsYXJtcyBhbmQgdHJpY2tsZSBjaGFyZ2luZy4KQEAgLTM4MSw3ICszODIsNyBAQAogCSAgb3IgTFBDIGJ1cyBjaGlwcywgYW5kIHNvIG9uLgogCiAJICBZb3VyIHN5c3RlbSB3aWxsIG5lZWQgdG8gZGVmaW5lIHRoZSBwbGF0Zm9ybSBkZXZpY2UgdXNlZCBieQotCSAgdGhpcyBkcml2ZXIsIG90aGVyd2lzZSBpdCB3b24ndCBiZSBhY2Nlc3NpYmxlLiAgVGhpcyBtZWFucworCSAgdGhpcyBkcml2ZXIsIG90aGVyd2lzZSBpdCB3b24ndCBiZSBhY2Nlc3NpYmxlLiBUaGlzIG1lYW5zCiAJICB5b3UgY2FuIHNhZmVseSBlbmFibGUgdGhpcyBkcml2ZXIgaWYgeW91IGRvbid0IGtub3cgd2hldGhlcgogCSAgb3Igbm90IHlvdXIgYm9hcmQgaGFzIHRoaXMga2luZCBvZiBoYXJkd2FyZS4KIApAQCAtNTk4LDcgKzU5OSw3IEBACiAJZGVwZW5kcyBvbiBBUkNIX0FUOTFSTTkyMDAgfHwgQVJDSF9BVDkxU0FNOVJMCiAJaGVscAogCSAgRHJpdmVyIGZvciB0aGUgaW50ZXJuYWwgUlRDIChSZWFsdGltZSBDbG9jaykgbW9kdWxlIGZvdW5kIG9uCi0JICBBdG1lbCBBVDkxUk05MjAwJ3MgYW5kIEFUOTFTQU05UkwgY2hpcHMuICBPbiBTQU05UkwgY2hpcHMKKwkgIEF0bWVsIEFUOTFSTTkyMDAncyBhbmQgQVQ5MVNBTTlSTCBjaGlwcy4gT24gU0FNOVJMIGNoaXBzCiAJICB0aGlzIGlzIHBvd2VyZWQgYnkgdGhlIGJhY2t1cCBwb3dlciBzdXBwbHkuCiAKIGNvbmZpZyBSVENfRFJWX0FUOTFTQU05CkBAIC02MjAsOCArNjIxLDggQEAKIAlwcm9tcHQgIlJUVCBtb2R1bGUgTnVtYmVyIiBpZiBBUkNIX0FUOTFTQU05MjYzCiAJZGVwZW5kcyBvbiBSVENfRFJWX0FUOTFTQU05CiAJaGVscAotCSAgTW9yZSB0aGFuIG9uZSBSVFQgbW9kdWxlIGlzIGF2YWlsYWJsZS4gIFlvdSBjYW4gY2hvb3NlIHdoaWNoCi0JICBvbmUgd2lsbCBiZSB1c2VkIGFzIGFuIFJUQy4gIFRoZSBkZWZhdWx0IG9mIHplcm8gaXMgbm9ybWFsbHkKKwkgIE1vcmUgdGhhbiBvbmUgUlRUIG1vZHVsZSBpcyBhdmFpbGFibGUuIFlvdSBjYW4gY2hvb3NlIHdoaWNoCisJICBvbmUgd2lsbCBiZSB1c2VkIGFzIGFuIFJUQy4gVGhlIGRlZmF1bHQgb2YgemVybyBpcyBub3JtYWxseQogCSAgT0sgdG8gdXNlLCB0aG91Z2ggc29tZSBzeXN0ZW1zIHVzZSB0aGF0IGZvciBub24tUlRDIHB1cnBvc2VzLgogCiBjb25maWcgUlRDX0RSVl9BVDkxU0FNOV9HUEJSCkBAIC02MzMsMTAgKzYzNCwyMCBAQAogCWRlcGVuZHMgb24gUlRDX0RSVl9BVDkxU0FNOQogCWhlbHAKIAkgIFRoZSBSVEMgZHJpdmVyIG5lZWRzIHRvIHVzZSBvbmUgb2YgdGhlIEdlbmVyYWwgUHVycG9zZSBCYWNrdXAKLQkgIFJlZ2lzdGVycyAoR1BCUnMpIGFzIHdlbGwgYXMgdGhlIFJUVC4gIFlvdSBjYW4gY2hvb3NlIHdoaWNoIG9uZQotCSAgd2lsbCBiZSB1c2VkLiAgVGhlIGRlZmF1bHQgb2YgemVybyBpcyBub3JtYWxseSBPSyB0byB1c2UsIGJ1dAorCSAgUmVnaXN0ZXJzIChHUEJScykgYXMgd2VsbCBhcyB0aGUgUlRULiBZb3UgY2FuIGNob29zZSB3aGljaCBvbmUKKwkgIHdpbGwgYmUgdXNlZC4gVGhlIGRlZmF1bHQgb2YgemVybyBpcyBub3JtYWxseSBPSyB0byB1c2UsIGJ1dAogCSAgb24gc29tZSBzeXN0ZW1zIG90aGVyIHNvZnR3YXJlIG5lZWRzIHRvIHVzZSB0aGF0IHJlZ2lzdGVyLgogCitjb25maWcgUlRDX0RSVl9BVTFYWFgKKwl0cmlzdGF0ZSAiQXUxeHh4IENvdW50ZXIwIFJUQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09DX0FVMVgwMAorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBBdTF4eHggb24tY2hpcCBDb3VudGVyMCAoVGltZS1PZi1ZZWFyCisJICBjb3VudGVyKSB0byBiZSB1c2VkIGFzIGEgUlRDLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1hdTF4eHguCisKIGNvbmZpZyBSVENfRFJWX0JGSU4KIAl0cmlzdGF0ZSAiQmxhY2tmaW4gT24tQ2hpcCBSVEMiCiAJZGVwZW5kcyBvbiBCTEFDS0ZJTiAmJiAhQkY1NjEKQEAgLTY2OSw2ICs2ODAsMTcgQEAKIAkgdGhlIFJUQy4gVGhpcyBleHBvc2VzIHRoYXQgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHRoZSBnZW5lcmljIFJUQwogCSBjbGFzcy4KIAorY29uZmlnIFJUQ19EUlZfUFhBCisgICAgICAgdHJpc3RhdGUgIlBYQTI3eC9QWEEzeHgiCisgICAgICAgZGVwZW5kcyBvbiBBUkNIX1BYQQorICAgICAgIGhlbHAKKyAgICAgICAgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBhY2Nlc3MgdG8gdGhlIHJlYWwgdGltZSBjbG9jaworICAgICAgICAgYnVpbHQgaW50byB5b3VyIFBYQTI3eCBvciBQWEEzeHggQ1BVLgorCisgICAgICAgICBUaGlzIFJUQyBkcml2ZXIgdXNlcyBQWEEgUlRDIHJlZ2lzdGVycyBhdmFpbGFibGUgc2luY2UgcHhhMjd4CisgICAgICAgICBzZXJpZXMgKFJEeFIsIFJZeFIpIGluc3RlYWQgb2YgbGVnYWN5IFJDTlIsIFJUQVIuCisKKwogY29uZmlnIFJUQ19EUlZfU1VONFYKIAlib29sICJTVU40ViBIeXBlcnZpc29yIFJUQyIKIAlkZXBlbmRzIG9uIFNQQVJDNjQKQEAgLTY4Myw0ICs3MDUsMjIgQEAKIAkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgUlRDIGZvdW5kIG9uCiAJICBTdGFyZmlyZSBzeXN0ZW1zLgogCitjb25maWcgUlRDX0RSVl9UWDQ5MzkKKwl0cmlzdGF0ZSAiVFg0OTM5IFNvQyIKKwlkZXBlbmRzIG9uIFNPQ19UWDQ5MzkKKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBpbnRlcm5hbCBSVEMgKFJlYWx0aW1lIENsb2NrKSBtb2R1bGUgZm91bmQgb24KKwkgIFRvc2hpYmEgVFg0OTM5IFNvQy4KKworY29uZmlnIFJUQ19EUlZfTVYKKwl0cmlzdGF0ZSAiTWFydmVsbCBTb0MgUlRDIgorCWRlcGVuZHMgb24gQVJDSF9LSVJLV09PRAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbi1jaGlwIFJUQworCSAgdGhhdCBjYW4gYmUgZm91bmQgaW4gc29tZSBvZiBNYXJ2ZWxsJ3MgU29DIGRldmljZXMsIHN1Y2ggYXMKKwkgIHRoZSBLaXJrd29vZCA4OEY2MjgxIGFuZCA4OEY2MTkyLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tdi4KKwogZW5kaWYgIyBSVENfQ0xBU1MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKaW5kZXggNmU3OWM5MS4uOWE0MzQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX0FUMzJBUDcwMFgpKz0gcnRjLWF0MzJhcDcwMHgubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQ5MVJNOTIwMCkrPSBydGMtYXQ5MXJtOTIwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9BVDkxU0FNOSkJKz0gcnRjLWF0OTFzYW05Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0FVMVhYWCkJKz0gcnRjLWF1MXh4eC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9CRklOKQkrPSBydGMtYmZpbi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9DTU9TKQkrPSBydGMtY21vcy5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzEyMTYpCSs9IHJ0Yy1kczEyMTYubwpAQCAtNDcsNiArNDgsNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfU1RBUkZJUkUpCSs9IHJ0Yy1zdGFyZmlyZS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NQVg2OTAwKQkrPSBydGMtbWF4NjkwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NQVg2OTAyKQkrPSBydGMtbWF4NjkwMi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NVikJKz0gcnRjLW12Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX09NQVApCSs9IHJ0Yy1vbWFwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BDRjg1NjMpCSs9IHJ0Yy1wY2Y4NTYzLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BDRjg1ODMpCSs9IHJ0Yy1wY2Y4NTgzLm8KQEAgLTU0LDYgKzU2LDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX1BMMDMxKQkrPSBydGMtcGwwMzEubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUEFSSVNDKQkrPSBydGMtcGFyaXNjLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BQQykJKz0gcnRjLXBwYy5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QWEEpCSs9IHJ0Yy1weGEubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUjk3MDEpCSs9IHJ0Yy1yOTcwMS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzEzKQkrPSBydGMtcnM1YzMxMy5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzQ4KQkrPSBydGMtcnM1YzM0OC5vCkBAIC02Niw2ICs2OSw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCkJKz0gcnRjLXN0azE3dGE4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1RFU1QpCSs9IHJ0Yy10ZXN0Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1RXTDQwMzApCSs9IHJ0Yy10d2w0MDMwLm8KK29iai0kKENPTkZJR19SVENfRFJWX1RYNDkzOSkJKz0gcnRjLXR4NDkzOS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9WMzAyMCkJKz0gcnRjLXYzMDIwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1ZSNDFYWCkJKz0gcnRjLXZyNDF4eC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9XTTgzNTApCSs9IHJ0Yy13bTgzNTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvY2xhc3MuYyBiL2RyaXZlcnMvcnRjL2NsYXNzLmMKaW5kZXggNGRmZGYwMS4uYmU1YTZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvY2xhc3MuYworKysgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCkBAIC00OCw5ICs0OCw3IEBACiAJc3RydWN0IHJ0Y190aW1lCQl0bTsKIAlzdHJ1Y3QgdGltZXNwZWMJCXRzID0gY3VycmVudF9rZXJuZWxfdGltZSgpOwogCi0JaWYgKHN0cm5jbXAocnRjLT5kZXYuYnVzX2lkLAotCQkJCUNPTkZJR19SVENfSENUT1NZU19ERVZJQ0UsCi0JCQkJQlVTX0lEX1NJWkUpICE9IDApCisJaWYgKHN0cmNtcChkZXZfbmFtZSgmcnRjLT5kZXYpLCBDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKSAhPSAwKQogCQlyZXR1cm4gMDsKIAogCXJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOwpAQCAtNzEsMjAgKzY5LDE4IEBACiAJdGltZV90CQkJbmV3dGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMJCXRpbWU7CiAKLQlpZiAoc3RybmNtcChydGMtPmRldi5idXNfaWQsCi0JCQkJQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSwKLQkJCQlCVVNfSURfU0laRSkgIT0gMCkKKwlpZiAoc3RyY21wKGRldl9uYW1lKCZydGMtPmRldiksIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpICE9IDApCiAJCXJldHVybiAwOwogCiAJcnRjX3JlYWRfdGltZShydGMsICZ0bSk7CiAJaWYgKHJ0Y192YWxpZF90bSgmdG0pICE9IDApIHsKLQkJcHJfZGVidWcoIiVzOiAgYm9ndXMgcmVzdW1lIHRpbWVcbiIsIHJ0Yy0+ZGV2LmJ1c19pZCk7CisJCXByX2RlYnVnKCIlczogIGJvZ3VzIHJlc3VtZSB0aW1lXG4iLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJ0Y190bV90b190aW1lKCZ0bSwgJm5ld3RpbWUpOwogCWlmIChuZXd0aW1lIDw9IG9sZHRpbWUpIHsKIAkJaWYgKG5ld3RpbWUgPCBvbGR0aW1lKQotCQkJcHJfZGVidWcoIiVzOiAgdGltZSB0cmF2ZWwhXG4iLCBydGMtPmRldi5idXNfaWQpOworCQkJcHJfZGVidWcoIiVzOiAgdGltZSB0cmF2ZWwhXG4iLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNTYsNyArMTUyLDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGMtPmlycV9xdWV1ZSk7CiAKIAlzdHJsY3B5KHJ0Yy0+bmFtZSwgbmFtZSwgUlRDX0RFVklDRV9OQU1FX1NJWkUpOwotCXNucHJpbnRmKHJ0Yy0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJydGMlZCIsIGlkKTsKKwlkZXZfc2V0X25hbWUoJnJ0Yy0+ZGV2LCAicnRjJWQiLCBpZCk7CiAKIAlydGNfZGV2X3ByZXBhcmUocnRjKTsKIApAQCAtMTY5LDcgKzE2NSw3IEBACiAJcnRjX3Byb2NfYWRkX2RldmljZShydGMpOwogCiAJZGV2X2luZm8oZGV2LCAicnRjIGNvcmU6IHJlZ2lzdGVyZWQgJXMgYXMgJXNcbiIsCi0JCQlydGMtPm5hbWUsIHJ0Yy0+ZGV2LmJ1c19pZCk7CisJCQlydGMtPm5hbWUsIGRldl9uYW1lKCZydGMtPmRldikpOwogCiAJcmV0dXJuIHJ0YzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwppbmRleCBmZDJjNjUyLi40MzQ4YzRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwpAQCAtNTAsMTAgKzUwLDE1IEBACiAKIAlpZiAoIXJ0Yy0+b3BzKQogCQllcnIgPSAtRU5PREVWOwotCWVsc2UgaWYgKCFydGMtPm9wcy0+c2V0X3RpbWUpCi0JCWVyciA9IC1FSU5WQUw7Ci0JZWxzZQorCWVsc2UgaWYgKHJ0Yy0+b3BzLT5zZXRfdGltZSkKIAkJZXJyID0gcnRjLT5vcHMtPnNldF90aW1lKHJ0Yy0+ZGV2LnBhcmVudCwgdG0pOworCWVsc2UgaWYgKHJ0Yy0+b3BzLT5zZXRfbW1zcykgeworCQl1bnNpZ25lZCBsb25nIHNlY3M7CisJCWVyciA9IHJ0Y190bV90b190aW1lKHRtLCAmc2Vjcyk7CisJCWlmIChlcnIgPT0gMCkKKwkJCWVyciA9IHJ0Yy0+b3BzLT5zZXRfbW1zcyhydGMtPmRldi5wYXJlbnQsIHNlY3MpOworCX0gZWxzZQorCQllcnIgPSAtRUlOVkFMOwogCiAJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKIAlyZXR1cm4gZXJyOwpAQCAtMzg5LDcgKzM5NCw3IEBACiB7CiAJY2hhciAqbmFtZSA9IChjaGFyICopZGF0YTsKIAotCWlmIChzdHJuY21wKGRldi0+YnVzX2lkLCBuYW1lLCBCVVNfSURfU0laRSkgPT0gMCkKKwlpZiAoc3RyY21wKGRldl9uYW1lKGRldiksIG5hbWUpID09IDApCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtNTA0LDkgKzUwOSw2IEBACiAJaWYgKHJ0Yy0+b3BzLT5pcnFfc2V0X2ZyZXEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCWlmICghaXNfcG93ZXJfb2ZfMihmcmVxKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CiAJaWYgKHJ0Yy0+aXJxX3Rhc2sgIT0gTlVMTCAmJiB0YXNrID09IE5VTEwpCiAJCWVyciA9IC1FQlVTWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jCmluZGV4IDkwYjlhNjUuLmUxZWMzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYwpAQCAtMjA1LDcgKzIwNSw3IEBACiB7CiAJc3RydWN0IHJlc291cmNlCSpyZWdzOwogCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjOwotCWludCBpcnEgPSAtMTsKKwlpbnQgaXJxOwogCWludCByZXQ7CiAKIAlydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRjX2F0MzJhcDcwMHgpLCBHRlBfS0VSTkVMKTsKQEAgLTIyMiw3ICsyMjIsNyBAQAogCX0KIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8IDApIHsKKwlpZiAoaXJxIDw9IDApIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IGdldCBpcnFcbiIpOwogCQlyZXQgPSAtRU5YSU87CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF1MXh4eC5jIGIvZHJpdmVycy9ydGMvcnRjLWF1MXh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MDZhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtYXUxeHh4LmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBBdTF4eHggY291bnRlcjAgKGFrYSBUaW1lLU9mLVllYXIgY291bnRlcikgUlRDIGludGVyZmFjZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hbnVlbCBMYXVzcyA8bWFub0Byb2FyaW5lbGsuaG9tZWxpbnV4Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBBbGwgY3VycmVudCBBdTF4eHggU29DcyBoYXZlIDIgY291bnRlcnMgZmVkIGJ5IGFuIGV4dGVybmFsIDMyLjc2OCBrSHoKKyAqIGNyeXN0YWwuIENvdW50ZXIgMCwgd2hpY2gga2VlcHMgY291bnRpbmcgZHVyaW5nIHNsZWVwL3Bvd2VyZG93biwgaXMKKyAqIHVzZWQgdG8gY291bnQgc2Vjb25kcyBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bml4IGVwb2NoLgorICoKKyAqIFRoZSBjb3VudGVycyBtdXN0IGJlIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQgYnkgYm9vdGxvYWRlci9ib2FyZCBjb2RlOworICogbm8gY2hlY2tzIGFzIHRvIHdoZXRoZXIgdGhleSByZWFsbHkgZ2V0IGEgcHJvcGVyIDMyLjc2OGtIeiBjbG9jayBhcmUKKyAqIG1hZGUgYXMgdGhpcyB3b3VsZCB0YWtlIGZhciB0b28gbG9uZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisvKiAzMmtIeiBjbG9jayBlbmFibGVkIGFuZCBkZXRlY3RlZCAqLworI2RlZmluZSBDTlRSX09LIChTWVNfQ05UUkxfRTAgfCBTWVNfQ05UUkxfMzJTKQorCitzdGF0aWMgaW50IGF1MXh0b3lfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyB0OworCisJdCA9IGF1X3JlYWRsKFNZU19UT1lSRUFEKTsKKworCXJ0Y190aW1lX3RvX3RtKHQsIHRtKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IGF1MXh0b3lfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwlydGNfdG1fdG9fdGltZSh0bSwgJnQpOworCisJYXVfd3JpdGVsKHQsIFNZU19UT1lXUklURSk7CisJYXVfc3luYygpOworCisJLyogd2FpdCBmb3IgdGhlIHBlbmRpbmcgcmVnaXN0ZXIgd3JpdGUgdG8gc3VjY2VlZC4gIFRoaXMgY2FuCisJICogdGFrZSB1cCB0byA2IHNlY29uZHMuLi4KKwkgKi8KKwl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX0MwUykKKwkJbXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhdTF4dG95X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGF1MXh0b3lfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBhdTF4dG95X3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF1MXh0b3lfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y2RldjsKKwl1bnNpZ25lZCBsb25nIHQ7CisJaW50IHJldDsKKworCXQgPSBhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCk7CisJaWYgKCEodCAmIENOVFJfT0spKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdW50ZXJzIG5vdCB3b3JraW5nOyBhYm9ydGluZy5cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcmV0ID0gLUVUSU1FRE9VVDsKKworCS8qIHNldCBjb3VudGVyMCB0aWNrcmF0ZSB0byAxSHogaWYgbmVjZXNzYXJ5ICovCisJaWYgKGF1X3JlYWRsKFNZU19UT1lUUklNKSAhPSAzMjc2NykgeworCQkvKiB3YWl0IHVudGlsIGhhcmR3YXJlIGdpdmVzIGFjY2VzcyB0byBUUklNIHJlZ2lzdGVyICovCisJCXQgPSAweDAwMTAwMDAwOworCQl3aGlsZSAoKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9UMFMpICYmIHQtLSkKKwkJCW1zbGVlcCgxKTsKKworCQlpZiAoIXQpIHsKKwkJCS8qIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZWdpc3RlciBhY2Nlc3M7IGFzc3VtZQorCQkJICogY291bnRlcnMgYXJlIHVudXNhYmxlLgorCQkJICovCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGFjY2Vzc1xuIik7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQkvKiBzZXQgMUh6IFRPWSB0aWNrIHJhdGUgKi8KKwkJYXVfd3JpdGVsKDMyNzY3LCBTWVNfVE9ZVFJJTSk7CisJCWF1X3N5bmMoKTsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHRoZSBoYXJkd2FyZSBhbGxvd3Mgd3JpdGVzIHRvIHRoZSBjb3VudGVyIHJlZyAqLworCXdoaWxlIChhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfQzBTKQorCQltc2xlZXAoMSk7CisKKwlydGNkZXYgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJydGMtYXUxeHh4IiwgJnBkZXYtPmRldiwKKwkJCQkgICAgICZhdTF4dG95X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0Y2RldikpIHsKKwkJcmV0ID0gUFRSX0VSUihydGNkZXYpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjZGV2KTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGF1MXh0b3lfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGNkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGNkZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1MXhydGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtYXUxeHh4IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF1MXh0b3lfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdTF4dG95X3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYXUxeHJ0Y19kcml2ZXIsIGF1MXh0b3lfcnRjX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MXh0b3lfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXUxeHJ0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhdTF4dG95X3J0Y19pbml0KTsKK21vZHVsZV9leGl0KGF1MXh0b3lfcnRjX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkF1MXh4eCBUT1ktY291bnRlci1iYXNlZCBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYW51ZWwgTGF1c3MgPG1hbnVlbC5sYXVzc0BnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1hdTF4eHgiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1iZmluLmMgYi9kcml2ZXJzL3J0Yy9ydGMtYmZpbi5jCmluZGV4IDM0NDM5Y2UuLmFhZmQzZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1iZmluLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWJmaW4uYwpAQCAtMzkwLDcgKzM5MCw3IEBACiAKIAkvKiBSZWdpc3RlciBvdXIgUlRDIHdpdGggdGhlIFJUQyBmcmFtZXdvcmsgKi8KIAlydGMtPnJ0Y19kZXYgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsIGRldiwgJmJmaW5fcnRjX29wcywgVEhJU19NT0RVTEUpOwotCWlmICh1bmxpa2VseShJU19FUlIocnRjKSkpIHsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHJ0Yy0+cnRjX2RldikpKSB7CiAJCXJldCA9IFBUUl9FUlIocnRjLT5ydGNfZGV2KTsKIAkJZ290byBlcnJfaXJxOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMgYi9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCmluZGV4IDZjZjhlMjguLmI2ZDM1ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWNtb3MuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAvKiB0aGlzIGlzIGZvciAiZ2VuZXJpYyBhY2Nlc3MgdG8gUEMtc3R5bGUgUlRDIiB1c2luZyBDTU9TX1JFQUQvQ01PU19XUklURSAqLwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3J0Yy5oPgpAQCAtNTgsNyArNTksNyBAQAogfTsKIAogLyogYm90aCBwbGF0Zm9ybSBhbmQgcG5wIGJ1c3NlcyB1c2UgbmVnYXRpdmUgbnVtYmVycyBmb3IgaW52YWxpZCBpcnFzICovCi0jZGVmaW5lIGlzX3ZhbGlkX2lycShuKQkJKChuKSA+PSAwKQorI2RlZmluZSBpc192YWxpZF9pcnEobikJCSgobikgPiAwKQogCiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gInJ0Y19jbW9zIjsKIApAQCAtMzg0LDYgKzM4NSw4IEBACiAJaWYgKCFpc192YWxpZF9pcnEoY21vcy0+aXJxKSkKIAkJcmV0dXJuIC1FTlhJTzsKIAorCWlmICghaXNfcG93ZXJfb2ZfMihmcmVxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJLyogMCA9IG5vIGlycXM7IDEgPSAyXjE1IEh6IC4uLiAxNSA9IDJeMCBIeiAqLwogCWYgPSBmZnMoZnJlcSk7CiAJaWYgKGYtLSA+IDE2KQpAQCAtNzI5LDcgKzczMiw3IEBACiAKIAljbW9zX3J0Yy5kZXYgPSBkZXY7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgJmNtb3NfcnRjKTsKLQlyZW5hbWVfcmVnaW9uKHBvcnRzLCBjbW9zX3J0Yy5ydGMtPmRldi5idXNfaWQpOworCXJlbmFtZV9yZWdpb24ocG9ydHMsIGRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldikpOwogCiAJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOwogCkBAIC03NzcsNyArNzgwLDcgQEAKIAkJCXJ0Y19jbW9zX2ludF9oYW5kbGVyID0gY21vc19pbnRlcnJ1cHQ7CiAKIAkJcmV0dmFsID0gcmVxdWVzdF9pcnEocnRjX2lycSwgcnRjX2Ntb3NfaW50X2hhbmRsZXIsCi0JCQkJSVJRRl9ESVNBQkxFRCwgY21vc19ydGMucnRjLT5kZXYuYnVzX2lkLAorCQkJCUlSUUZfRElTQUJMRUQsIGRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldiksCiAJCQkJY21vc19ydGMucnRjKTsKIAkJaWYgKHJldHZhbCA8IDApIHsKIAkJCWRldl9kYmcoZGV2LCAiSVJRICVkIGlzIGFscmVhZHkgaW4gdXNlXG4iLCBydGNfaXJxKTsKQEAgLTc5NSw3ICs3OTgsNyBAQAogCX0KIAogCXByX2luZm8oIiVzOiBhbGFybXMgdXAgdG8gb25lICVzJXMsICV6ZCBieXRlcyBudnJhbSVzXG4iLAotCQkJY21vc19ydGMucnRjLT5kZXYuYnVzX2lkLAorCQkJZGV2X25hbWUoJmNtb3NfcnRjLnJ0Yy0+ZGV2KSwKIAkJCWlzX3ZhbGlkX2lycShydGNfaXJxKQogCQkJCT8gIChjbW9zX3J0Yy5tb25fYWxybQogCQkJCQk/ICJ5ZWFyIgpAQCAtODg1LDcgKzg4OCw3IEBACiAJfQogCiAJcHJfZGVidWcoIiVzOiBzdXNwZW5kJXMsIGN0cmwgJTAyeFxuIiwKLQkJCWNtb3NfcnRjLnJ0Yy0+ZGV2LmJ1c19pZCwKKwkJCWRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldiksCiAJCQkodG1wICYgUlRDX0FJRSkgPyAiLCBhbGFybSBtYXkgd2FrZSIgOiAiIiwKIAkJCXRtcCk7CiAKQEAgLTk0MSw3ICs5NDQsNyBAQAogCX0KIAogCXByX2RlYnVnKCIlczogcmVzdW1lLCBjdHJsICUwMnhcbiIsCi0JCQljbW9zX3J0Yy5ydGMtPmRldi5idXNfaWQsCisJCQlkZXZfbmFtZSgmY21vc19ydGMucnRjLT5kZXYpLAogCQkJdG1wKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jCmluZGV4IDlhMjM0YTQuLjRhZWRjNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yIgogCiBzdHJ1Y3QgZHMxMjE2X3JlZ3MgewogCXU4IHRzZWM7CkBAIC0xMDEsNyArMTAxLDggQEAKIAl0bS0+dG1feWVhciA9IGJjZDJiaW4ocmVncy55ZWFyKTsKIAlpZiAodG0tPnRtX3llYXIgPCA3MCkKIAkJdG0tPnRtX3llYXIgKz0gMTAwOwotCXJldHVybiAwOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7CiB9CiAKIHN0YXRpYyBpbnQgZHMxMjE2X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCkBAIC0xMzgsOSArMTM5LDggQEAKIAkuc2V0X3RpbWUJPSBkczEyMTZfcnRjX3NldF90aW1lLAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgZHMxMjE2X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2luaXQgZHMxMjE2X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2OwogCWludCByZXQgPSAwOwpAQCAtMTUyLDcgKzE1MiwxMCBAQAogCXByaXYgPSBremFsbG9jKHNpemVvZiAqcHJpdiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKLQlwcml2LT5zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJcHJpdi0+c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBwcml2LT5zaXplLCBwZGV2LT5uYW1lKSkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gb3V0OwpAQCAtMTYzLDIyICsxNjYsMTggQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImRzMTIxNiIsICZwZGV2LT5kZXYsCisJcHJpdi0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMjE2IiwgJnBkZXYtPmRldiwKIAkJCQkgICZkczEyMTZfcnRjX29wcywgVEhJU19NT0RVTEUpOwotCWlmIChJU19FUlIocnRjKSkgewotCQlyZXQgPSBQVFJfRVJSKHJ0Yyk7CisJaWYgKElTX0VSUihwcml2LT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+cnRjKTsKIAkJZ290byBvdXQ7CiAJfQotCXByaXYtPnJ0YyA9IHJ0YzsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKIAogCS8qIGR1bW15IHJlYWQgdG8gZ2V0IGNsb2NrIGludG8gYSBrbm93biBzdGF0ZSAqLwogCWRzMTIxNl9yZWFkKHByaXYtPmlvYWRkciwgZHVtbXkpOwogCXJldHVybiAwOwogCiBvdXQ6Ci0JaWYgKHByaXYtPnJ0YykKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnJ0Yyk7CiAJaWYgKHByaXYtPmlvYWRkcikKIAkJaW91bm1hcChwcml2LT5pb2FkZHIpOwogCWlmIChwcml2LT5iYXNlYWRkcikKQEAgLTE4Nyw3ICsxODYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGRzMTIxNl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZXhpdCBkczEyMTZfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkczEyMTZfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCkBAIC0yMDMsMTMgKzIwMiwxMiBAQAogCQkubmFtZQk9ICJydGMtZHMxMjE2IiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKLQkucHJvYmUJCT0gZHMxMjE2X3J0Y19wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRzMTIxNl9ydGNfcmVtb3ZlKSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGRzMTIxNl9ydGNfcmVtb3ZlKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGRzMTIxNl9ydGNfaW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRzMTIxNl9ydGNfcGxhdGZvcm1fZHJpdmVyKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZkczEyMTZfcnRjX3BsYXRmb3JtX2RyaXZlciwgZHMxMjE2X3J0Y19wcm9iZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkczEyMTZfcnRjX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzOTAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzOTAuYwppbmRleCA1OTllOTc2Li5lNTRiNWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzkwLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTM5MC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIHJ0Yy1kczEzOTAuYyAtLSBkcml2ZXIgZm9yIERTMTM5MC85My85NAorICogcnRjLWRzMTM5MC5jIC0tIGRyaXZlciBmb3IgdGhlIERhbGxhcy9NYXhpbSBEUzEzOTAvOTMvOTQgU1BJIFJUQwogICoKICAqIENvcHlyaWdodCAoQykgMjAwOCBNZXJjdXJ5IElNQyBMdGQKICAqIFdyaXR0ZW4gYnkgTWFyayBKYWNrc29uIDxtcGZqQG1pbWMuY28udWs+CkBAIC04LDExICs4LDEzIEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTk9URSA6IEN1cnJlbnRseSB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBiYXJlIG1pbmltdW0gZm9yIHJlYWQKLSAqIGFuZCB3cml0ZSB0aGUgUlRDLiAgVGhlIGV4dHJhIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IHRoZSBjaGlwIGZhbWlseQorICogTk9URTogQ3VycmVudGx5IHRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIGJhcmUgbWluaW11bSBmb3IgcmVhZAorICogYW5kIHdyaXRlIHRoZSBSVEMuIFRoZSBleHRyYSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGUgY2hpcCBmYW1pbHkKICAqIChhbGFybXMsIHRyaWNrbGUgY2hhcmdlciwgZGlmZmVyZW50IGNvbnRyb2wgcmVnaXN0ZXJzKSBhcmUgdW5hdmFpbGFibGUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CkBAIC00MiwyMCArNDQsNiBAQAogCXU4IHR4cnhfYnVmWzldOwkvKiBjbWQgKyA4IHJlZ2lzdGVycyAqLwogfTsKIAotc3RhdGljIHZvaWQgZHMxMzkwX3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCi0JCQkJdW5zaWduZWQgY2hhciBkYXRhKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGRzMTM5MCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JLyogU2V0IE1TQiB0byBpbmRpY2F0ZSB3cml0ZSAqLwotCWNoaXAtPnR4cnhfYnVmWzBdID0gYWRkcmVzcyB8IDB4ODA7Ci0JY2hpcC0+dHhyeF9idWZbMV0gPSBkYXRhOwotCi0JLyogZG8gdGhlIGkvbyAqLwotCXNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBjaGlwLT50eHJ4X2J1ZiwgMiwgTlVMTCwgMCk7Ci19Ci0KIHN0YXRpYyBpbnQgZHMxMzkwX2dldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCiAJCQkJdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKQEAgLTc4LDcgKzY2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkczEzOTBfZ2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgZHMxMzkwX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgZHMxMzkwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0xMDcsNyArOTUsNyBAQAogCXJldHVybiBydGNfdmFsaWRfdG0oZHQpOwogfQogCi1zdGF0aWMgaW50IGRzMTM5MF9zZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQorc3RhdGljIGludCBkczEzOTBfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAJc3RydWN0IGRzMTM5MCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMTI3LDE2ICsxMTUsNiBAQAogCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgY2hpcC0+dHhyeF9idWYsIDgsIE5VTEwsIDApOwogfQogCi1zdGF0aWMgaW50IGRzMTM5MF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBkczEzOTBfZ2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCi1zdGF0aWMgaW50IGRzMTM5MF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIGRzMTM5MF9zZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEzOTBfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gZHMxMzkwX3JlYWRfdGltZSwKIAkuc2V0X3RpbWUJPSBkczEzOTBfc2V0X3RpbWUsCkBAIC0xNDksNDYgKzEyNyw0MCBAQAogCXN0cnVjdCBkczEzOTAgKmNoaXA7CiAJaW50IHJlczsKIAotCXByaW50ayhLRVJOX0RFQlVHICJEUzEzOTAgU1BJIFJUQyBkcml2ZXJcbiIpOwotCi0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMzkwIiwKLQkJCQkmc3BpLT5kZXYsICZkczEzOTBfcnRjX29wcywgVEhJU19NT0RVTEUpOwotCWlmIChJU19FUlIocnRjKSkgewotCQlwcmludGsoS0VSTl9BTEVSVCAiUlRDIDogdW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHJ0Yyk7Ci0JfQotCiAJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKIAlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwogCXNwaV9zZXR1cChzcGkpOwogCiAJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mICpjaGlwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIlJUQyA6IHVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5XG4iKTsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JY2hpcC0+cnRjID0gcnRjOwogCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGNoaXApOwogCiAJcmVzID0gZHMxMzkwX2dldF9yZWcoJnNwaS0+ZGV2LCBEUzEzOTBfUkVHX1NFQ09ORFMsICZ0bXApOwotCWlmIChyZXMpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIlJUQyA6IHVuYWJsZSB0byByZWFkIGRldmljZVxuIik7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWlmIChyZXMgIT0gMCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgInVuYWJsZSB0byByZWFkIGRldmljZVxuIik7CisJCWtmcmVlKGNoaXApOwogCQlyZXR1cm4gcmVzOwogCX0KIAotCXJldHVybiAwOworCWNoaXAtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImRzMTM5MCIsCisJCQkJJnNwaS0+ZGV2LCAmZHMxMzkwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKGNoaXAtPnJ0YykpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgZGV2aWNlXG4iKTsKKwkJcmVzID0gUFRSX0VSUihjaGlwLT5ydGMpOworCQlrZnJlZShjaGlwKTsKKwl9CisKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEzOTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGRzMTM5MCAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNoaXAtPnJ0YzsKIAotCWlmIChydGMpCi0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPnJ0Yyk7CiAJa2ZyZWUoY2hpcCk7CiAKIAlyZXR1cm4gMDsKQEAgLTIxNSw2ICsxODcsNiBAQAogfQogbW9kdWxlX2V4aXQoZHMxMzkwX2V4aXQpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIkRTMTM5MC85My85NCBTUEkgUlRDIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYWxsYXMvTWF4aW0gRFMxMzkwLzkzLzk0IFNQSSBSVEMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJrIEphY2tzb24gPG1wZmpAbWltYy5jby51az4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwppbmRleCAyNWNhYWRhLi4yM2EwN2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCkBAIC0zMjYsOSArMzI2LDkgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApIHsKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKIAlwZGF0YS0+YWxybV9tZGF5ID0gYWxybS0+dGltZS50bV9tZGF5OwogCXBkYXRhLT5hbHJtX2hvdXIgPSBhbHJtLT50aW1lLnRtX2hvdXI7CiAJcGRhdGEtPmFscm1fbWluID0gYWxybS0+dGltZS50bV9taW47CkBAIC0zNDYsOSArMzQ2LDkgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApIHsKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKIAlhbHJtLT50aW1lLnRtX21kYXkgPSBwZGF0YS0+YWxybV9tZGF5IDwgMCA/IDAgOiBwZGF0YS0+YWxybV9tZGF5OwogCWFscm0tPnRpbWUudG1faG91ciA9IHBkYXRhLT5hbHJtX2hvdXIgPCAwID8gMCA6IHBkYXRhLT5hbHJtX2hvdXI7CiAJYWxybS0+dGltZS50bV9taW4gPSBwZGF0YS0+YWxybV9taW4gPCAwID8gMCA6IHBkYXRhLT5hbHJtX21pbjsKQEAgLTM4NSw3ICszODUsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkgeworCWlmIChwZGF0YS0+aXJxIDw9IDApIHsKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsgLyogZmFsbCBiYWNrIGludG8gcnRjLWRldidzIGVtdWxhdGlvbiAqLwogCX0KIAlzd2l0Y2ggKGNtZCkgewpAQCAtNTAzLDcgKzUwMyw2IEBACiAJaWYgKCFwZGF0YSkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcGRhdGEtPmlycSA9IC0xOwogCXBkYXRhLT5zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBwZGF0YS0+c2l6ZSwgcGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVCVVNZOwpAQCAtNTQ1LDEzICs1NDQsMTMgQEAKIAkgKiBpZiB0aGUgcGxhdGZvcm0gaGFzIGFuIGludGVycnVwdCBpbiBtaW5kIGZvciB0aGlzIGRldmljZSwKIAkgKiB0aGVuIGJ5IGFsbCBtZWFucywgc2V0IGl0CiAJICovCi0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQlydGNfcmVhZChSVENfQ01EMSk7CiAJCWlmIChyZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBkczE1MTFfaW50ZXJydXB0LAogCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELCBwZGV2LT5uYW1lLCBwZGV2KSA8IDApIHsKIAogCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImludGVycnVwdCBub3QgYXZhaWxhYmxlLlxuIik7Ci0JCQlwZGF0YS0+aXJxID0gLTE7CisJCQlwZGF0YS0+aXJxID0gMDsKIAkJfQogCX0KIApAQCAtNTcyLDcgKzU3MSw3IEBACiAJaWYgKHBkYXRhLT5ydGMpIHsKIAkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwogCX0KLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCWZyZWVfaXJxKHBkYXRhLT5pcnEsIHBkZXYpOwogCX0KIAlpZiAoZHMxNTExX2Jhc2UpIHsKQEAgLTU5NSw3ICs1OTQsNyBAQAogCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkczE1MTFfbnZyYW1fYXR0cik7CiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwogCXBkYXRhLT5ydGMgPSBOVUxMOwotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJLyoKIAkJICogZGlzYWJsZSB0aGUgYWxhcm0gaW50ZXJydXB0CiAJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCmluZGV4IGI5NDc1Y2QuLjM4ZDQ3MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlwZGF0YS0+YWxybV9tZGF5ID0gYWxybS0+dGltZS50bV9tZGF5OwogCXBkYXRhLT5hbHJtX2hvdXIgPSBhbHJtLT50aW1lLnRtX2hvdXI7CkBAIC0xNzksNyArMTc5LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJYWxybS0+dGltZS50bV9tZGF5ID0gcGRhdGEtPmFscm1fbWRheSA8IDAgPyAwIDogcGRhdGEtPmFscm1fbWRheTsKIAlhbHJtLT50aW1lLnRtX2hvdXIgPSBwZGF0YS0+YWxybV9ob3VyIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9ob3VyOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKQorCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRU5PSU9DVExDTUQ7IC8qIGZhbGwgYmFjayBpbnRvIHJ0Yy1kZXYncyBlbXVsYXRpb24gKi8KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUlRDX0FJRV9PRkY6CkBAIC0zMDEsNyArMzAxLDYgQEAKIAlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCXBkYXRhLT5pcnEgPSAtMTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBSVENfUkVHX1NJWkUsIHBkZXYtPm5hbWUpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CkBAIC0zMjcsMTMgKzMyNiwxMyBAQAogCWlmIChyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpICYgUlRDX0ZMQUdTX0JMRikKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInZvbHRhZ2UtbG93IGRldGVjdGVkLlxuIik7CiAKLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCXdyaXRlYigwLCBpb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CiAJCWlmIChyZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBkczE1NTNfcnRjX2ludGVycnVwdCwKIAkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCiAJCQkJcGRldi0+bmFtZSwgcGRldikgPCAwKSB7CiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG5vdCBhdmFpbGFibGUuXG4iKTsKLQkJCXBkYXRhLT5pcnEgPSAtMTsKKwkJCXBkYXRhLT5pcnEgPSAwOwogCQl9CiAJfQogCkBAIC0zNTMsNyArMzUyLDcgQEAKICBvdXQ6CiAJaWYgKHBkYXRhLT5ydGMpCiAJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKLQlpZiAocGRhdGEtPmlycSA+PSAwKQorCWlmIChwZGF0YS0+aXJxID4gMCkKIAkJZnJlZV9pcnEocGRhdGEtPmlycSwgcGRldik7CiAJaWYgKGlvYWRkcikKIAkJaW91bm1hcChpb2FkZHIpOwpAQCAtMzY5LDcgKzM2OCw3IEBACiAKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNTUzX252cmFtX2F0dHIpOwogCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCXdyaXRlYigwLCBwZGF0YS0+aW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOwogCQlmcmVlX2lycShwZGF0YS0+aXJxLCBwZGV2KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKaW5kZXggNGU5MTQxOS4uMDZkZmI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYwpAQCAtODMsMzIgKzgzLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHMxNjcyX3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXVuc2lnbmVkIGxvbmcgc2VjczsKLQotCWRldl9kYmcoJmNsaWVudC0+ZGV2LAotCQkiJXM6IHNlY3M9JWQsIG1pbnM9JWQsIGhvdXJzPSVkLCAiCi0JCSJtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCi0JCV9fZnVuY19fLAotCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKLQkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7Ci0KLQlydGNfdG1fdG9fdGltZSh0bSwgJnNlY3MpOwotCi0JcmV0dXJuIGRzMTY3Ml9zZXRfbW1zcyhjbGllbnQsIHNlY3MpOwotfQotCiBzdGF0aWMgaW50IGRzMTY3Ml9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKIAlyZXR1cm4gZHMxNjcyX2dldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKIH0KIAotc3RhdGljIGludCBkczE2NzJfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gZHMxNjcyX3NldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKLX0KLQogc3RhdGljIGludCBkczE2NzJfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQogewogCXJldHVybiBkczE2NzJfc2V0X21tc3ModG9faTJjX2NsaWVudChkZXYpLCBzZWNzKTsKQEAgLTE1Miw3ICsxMzEsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxNjcyX3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZSA9IGRzMTY3Ml9ydGNfcmVhZF90aW1lLAotCS5zZXRfdGltZSA9IGRzMTY3Ml9ydGNfc2V0X3RpbWUsCiAJLnNldF9tbXNzID0gZHMxNjcyX3J0Y19zZXRfbW1zcywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYwppbmRleCA0NWU1YjEwLi5jNTE1ODllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMzMjM0LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jCkBAIC0xLDQgKzEsNCBAQAotLyogZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jCisvKiBydGMtZHMzMjM0LmMKICAqCiAgKiBEcml2ZXIgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yIChEUzMyMzQpIFNQSSBSVEMgd2l0aCBJbnRlZ3JhdGVkIENyeXN0YWwKICAqIGFuZCBTUkFNLgpAQCAtOSwxMyArOSwxMCBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIENoYW5nZWxvZzoKLSAqCi0gKiAwNy1NYXktMjAwODogRGVubmlzIEFiZXJpbGxhIDxkZW56enpob21lQHlhaG9vLmNvbT4KLSAqCQktIENyZWF0ZWQgYmFzZWQgb24gdGhlIG1heDY5MDIgY29kZS4gT25seSBpbXBsZW1lbnRzIHRoZQotICoJCSAgZGF0ZS90aW1lIGtlZXBpbmcgZnVuY3Rpb25zOyBubyBTUkFNIHlldC4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgpAQCAtMzQsMTYgKzMxLDcgQEAKICNkZWZpbmUgRFMzMjM0X1JFR19DT05UUk9MCTB4MEUKICNkZWZpbmUgRFMzMjM0X1JFR19DT05UX1NUQVQJMHgwRgogCi0jdW5kZWYgRFMzMjM0X0RFQlVHCi0KLXN0cnVjdCBkczMyMzQgewotCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Ci0JdTggYnVmWzhdOyAvKiBCdXJzdCByZWFkOiBhZGRyICsgNyByZWdzICovCi0JdTggdHhfYnVmWzJdOwotCXU4IHJ4X2J1ZlsyXTsKLX07Ci0KLXN0YXRpYyB2b2lkIGRzMzIzNF9zZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAorc3RhdGljIGludCBkczMyMzRfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKIAkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKQEAgLTUzLDEwNyArNDEsNDUgQEAKIAlidWZbMF0gPSBhZGRyZXNzIHwgMHg4MDsKIAlidWZbMV0gPSBkYXRhOwogCi0Jc3BpX3dyaXRlKHNwaSwgYnVmLCAyKTsKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMiwgTlVMTCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgZHMzMjM0X2dldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCiAJCQkJdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBkczMyMzQgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7Ci0JaW50IHN0YXR1czsKIAotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJKmRhdGEgPSBhZGRyZXNzICYgMHg3ZjsKIAotCS8qIEJ1aWxkIG91ciBzcGkgbWVzc2FnZSAqLwotCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOwotCW1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKLQotCS8qIEFkZHJlc3MgKyBkdW1teSB0eCBieXRlICovCi0JeGZlci5sZW4gPSAyOwotCXhmZXIudHhfYnVmID0gY2hpcC0+dHhfYnVmOwotCXhmZXIucnhfYnVmID0gY2hpcC0+cnhfYnVmOwotCi0JY2hpcC0+dHhfYnVmWzBdID0gYWRkcmVzczsKLQljaGlwLT50eF9idWZbMV0gPSAweGZmOwotCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKLQotCS8qIGRvIHRoZSBpL28gKi8KLQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKLQlpZiAoc3RhdHVzID09IDApCi0JCXN0YXR1cyA9IG1lc3NhZ2Uuc3RhdHVzOwotCWVsc2UKLQkJcmV0dXJuIHN0YXR1czsKLQotCSpkYXRhID0gY2hpcC0+cnhfYnVmWzFdOwotCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGRhdGEsIDEsIGRhdGEsIDEpOwogfQogCi1zdGF0aWMgaW50IGRzMzIzNF9nZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQorc3RhdGljIGludCBkczMyMzRfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKIHsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgYnVmWzhdOwogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGRzMzIzNCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKLQlpbnQgc3RhdHVzOwogCi0JLyogYnVpbGQgdGhlIG1lc3NhZ2UgKi8KLQlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKLQltZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7Ci0JeGZlci5sZW4gPSAxICsgNzsJLyogQWRkciArIDcgcmVnaXN0ZXJzICovCi0JeGZlci50eF9idWYgPSBjaGlwLT5idWY7Ci0JeGZlci5yeF9idWYgPSBjaGlwLT5idWY7Ci0JY2hpcC0+YnVmWzBdID0gMHgwMDsJLyogU3RhcnQgYWRkcmVzcyAqLwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbWVzc2FnZSk7CisJYnVmWzBdID0gMHgwMDsgLyogU3RhcnQgYWRkcmVzcyAqLwogCi0JLyogZG8gdGhlIGkvbyAqLwotCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOwotCWlmIChzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gbWVzc2FnZS5zdGF0dXM7Ci0JZWxzZQotCQlyZXR1cm4gc3RhdHVzOworCWVyciA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBidWYsIDEsIGJ1ZiwgOCk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOwogCiAJLyogU2Vjb25kcywgTWludXRlcywgSG91cnMsIERheSwgRGF0ZSwgTW9udGgsIFllYXIgKi8KLQlkdC0+dG1fc2VjCT0gYmNkMmJpbihjaGlwLT5idWZbMV0pOwotCWR0LT50bV9taW4JPSBiY2QyYmluKGNoaXAtPmJ1ZlsyXSk7Ci0JZHQtPnRtX2hvdXIJPSBiY2QyYmluKGNoaXAtPmJ1ZlszXSAmIDB4M2YpOwotCWR0LT50bV93ZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNF0pIC0gMTsgLyogMCA9IFN1biAqLwotCWR0LT50bV9tZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNV0pOwotCWR0LT50bV9tb24JPSBiY2QyYmluKGNoaXAtPmJ1Zls2XSAmIDB4MWYpIC0gMTsgLyogMCA9IEphbiAqLwotCWR0LT50bV95ZWFyIAk9IGJjZDJiaW4oY2hpcC0+YnVmWzddICYgMHhmZikgKyAxMDA7IC8qIEFzc3VtZSAyMFlZICovCisJZHQtPnRtX3NlYwk9IGJjZDJiaW4oYnVmWzBdKTsKKwlkdC0+dG1fbWluCT0gYmNkMmJpbihidWZbMV0pOworCWR0LT50bV9ob3VyCT0gYmNkMmJpbihidWZbMl0gJiAweDNmKTsKKwlkdC0+dG1fd2RheQk9IGJjZDJiaW4oYnVmWzNdKSAtIDE7IC8qIDAgPSBTdW4gKi8KKwlkdC0+dG1fbWRheQk9IGJjZDJiaW4oYnVmWzRdKTsKKwlkdC0+dG1fbW9uCT0gYmNkMmJpbihidWZbNV0gJiAweDFmKSAtIDE7IC8qIDAgPSBKYW4gKi8KKwlkdC0+dG1feWVhciAJPSBiY2QyYmluKGJ1Zls2XSAmIDB4ZmYpICsgMTAwOyAvKiBBc3N1bWUgMjBZWSAqLwogCi0jaWZkZWYgRFMzMjM0X0RFQlVHCi0JZGV2X2RiZyhkZXYsICJcbiVzIDogUmVhZCBSVEMgdmFsdWVzXG4iLCBfX2Z1bmNfXyk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9ob3VyOiAlaVxuIiwgZHQtPnRtX2hvdXIpOwotCWRldl9kYmcoZGV2LCAidG1fbWluIDogJWlcbiIsIGR0LT50bV9taW4pOwotCWRldl9kYmcoZGV2LCAidG1fc2VjIDogJWlcbiIsIGR0LT50bV9zZWMpOwotCWRldl9kYmcoZGV2LCAidG1fd2RheTogJWlcbiIsIGR0LT50bV93ZGF5KTsKLQlkZXZfZGJnKGRldiwgInRtX21kYXk6ICVpXG4iLCBkdC0+dG1fbWRheSk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9tb24gOiAlaVxuIiwgZHQtPnRtX21vbik7Ci0JZGV2X2RiZyhkZXYsICJ0bV95ZWFyOiAlaVxuIiwgZHQtPnRtX3llYXIpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKGR0KTsKIH0KIAotc3RhdGljIGludCBkczMyMzRfc2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgZHMzMjM0X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKIHsKLSNpZmRlZiBEUzMyMzRfREVCVUcKLQlkZXZfZGJnKGRldiwgIlxuJXMgOiBTZXR0aW5nIFJUQyB2YWx1ZXNcbiIsIF9fZnVuY19fKTsKLQlkZXZfZGJnKGRldiwgInRtX3NlYyA6ICVpXG4iLCBkdC0+dG1fc2VjKTsKLQlkZXZfZGJnKGRldiwgInRtX21pbiA6ICVpXG4iLCBkdC0+dG1fbWluKTsKLQlkZXZfZGJnKGRldiwgInRtX2hvdXI6ICVpXG4iLCBkdC0+dG1faG91cik7Ci0JZGV2X2RiZyhkZXYsICJ0bV93ZGF5OiAlaVxuIiwgZHQtPnRtX3dkYXkpOwotCWRldl9kYmcoZGV2LCAidG1fbWRheTogJWlcbiIsIGR0LT50bV9tZGF5KTsKLQlkZXZfZGJnKGRldiwgInRtX21vbiA6ICVpXG4iLCBkdC0+dG1fbW9uKTsKLQlkZXZfZGJnKGRldiwgInRtX3llYXI6ICVpXG4iLCBkdC0+dG1feWVhcik7Ci0jZW5kaWYKLQogCWRzMzIzNF9zZXRfcmVnKGRldiwgRFMzMjM0X1JFR19TRUNPTkRTLCBiaW4yYmNkKGR0LT50bV9zZWMpKTsKIAlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfTUlOVVRFUywgYmluMmJjZChkdC0+dG1fbWluKSk7CiAJZHMzMjM0X3NldF9yZWcoZGV2LCBEUzMyMzRfUkVHX0hPVVJTLCBiaW4yYmNkKGR0LT50bV9ob3VyKSAmIDB4M2YpOwpAQCAtMTc0LDE2ICsxMDAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzMzIzNF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBkczMyMzRfZ2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCi1zdGF0aWMgaW50IGRzMzIzNF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIGRzMzIzNF9zZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczMyMzRfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gZHMzMjM0X3JlYWRfdGltZSwKIAkuc2V0X3RpbWUJPSBkczMyMzRfc2V0X3RpbWUsCkBAIC0xOTMsMzEgKzEwOSwxNSBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAJdW5zaWduZWQgY2hhciB0bXA7Ci0Jc3RydWN0IGRzMzIzNCAqY2hpcDsKIAlpbnQgcmVzOwogCi0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMzMjM0IiwKLQkJCQkmc3BpLT5kZXYsICZkczMyMzRfcnRjX29wcywgVEhJU19NT0RVTEUpOwotCWlmIChJU19FUlIocnRjKSkKLQkJcmV0dXJuIFBUUl9FUlIocnRjKTsKLQogCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CiAJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKIAlzcGlfc2V0dXAoc3BpKTsKIAotCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMzMjM0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGlwKSB7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JY2hpcC0+cnRjID0gcnRjOwotCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGNoaXApOwotCiAJcmVzID0gZHMzMjM0X2dldF9yZWcoJnNwaS0+ZGV2LCBEUzMyMzRfUkVHX1NFQ09ORFMsICZ0bXApOwotCWlmIChyZXMpIHsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJaWYgKHJlcyAhPSAwKQogCQlyZXR1cm4gcmVzOwotCX0KIAogCS8qIENvbnRyb2wgc2V0dGluZ3MKIAkgKgpAQCAtMjQ2LDI2ICsxNDYsMjcgQEAKIAlkczMyMzRfZ2V0X3JlZygmc3BpLT5kZXYsIERTMzIzNF9SRUdfQ09OVF9TVEFULCAmdG1wKTsKIAlkZXZfaW5mbygmc3BpLT5kZXYsICJDdHJsL1N0YXQgUmVnOiAweCUwMnhcbiIsIHRtcCk7CiAKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczMyMzQiLAorCQkJCSZzcGktPmRldiwgJmRzMzIzNF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgcnRjKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczMyMzRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0Jc3RydWN0IGRzMzIzNCAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNoaXAtPnJ0YzsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKIAotCWlmIChydGMpCi0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCi0Ja2ZyZWUoY2hpcCk7Ci0KKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGRzMzIzNF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJID0gImRzMzIzNCIsCi0JCS5idXMJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZQkgPSBkczMyMzRfcHJvYmUsCkBAIC0yNzQsNyArMTc1LDYgQEAKIAogc3RhdGljIF9faW5pdCBpbnQgZHMzMjM0X2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJEUzMyMzQgU1BJIFJUQyBEcml2ZXJcbiIpOwogCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZkczMyMzRfZHJpdmVyKTsKIH0KIG1vZHVsZV9pbml0KGRzMzIzNF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1lcDkzeHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1lcDkzeHguYwppbmRleCAzNmU0YWMwLi5mN2EzMjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZXA5M3h4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWVwOTN4eC5jCkBAIC00OSwxOCArNDksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVwOTN4eF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCWludCBlcnI7Ci0JdW5zaWduZWQgbG9uZyBzZWNzOwotCi0JZXJyID0gcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKLQlpZiAoZXJyICE9IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gZXA5M3h4X3J0Y19zZXRfbW1zcyhkZXYsIHNlY3MpOwotfQotCiBzdGF0aWMgaW50IGVwOTN4eF9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQogewogCXVuc2lnbmVkIHNob3J0IHByZWxvYWQsIGRlbGV0ZTsKQEAgLTc1LDcgKzYzLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGVwOTN4eF9ydGNfb3BzID0gewogCS5yZWFkX3RpbWUJPSBlcDkzeHhfcnRjX3JlYWRfdGltZSwKLQkuc2V0X3RpbWUJPSBlcDkzeHhfcnRjX3NldF90aW1lLAogCS5zZXRfbW1zcwk9IGVwOTN4eF9ydGNfc2V0X21tc3MsCiAJLnByb2MJCT0gZXA5M3h4X3J0Y19wcm9jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYwppbmRleCA0M2FmYjdhLi4zMzkyMWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jCkBAIC00NTAsNyArNDUwLDcgQEAKIAkgKiB0aGUgbW9kZSB3aXRob3V0IElSUS4KIAkgKi8KIAltNDh0NTktPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKG00OHQ1OS0+aXJxIDwgMCkKKwlpZiAobTQ4dDU5LT5pcnEgPD0gMCkKIAkJbTQ4dDU5LT5pcnEgPSBOT19JUlE7CiAKIAlpZiAobTQ4dDU5LT5pcnEgIT0gTk9fSVJRKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jIGIvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwppbmRleCAyZjY1MDdkLi4zNmE4ZWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAyLmMKQEAgLTksMTQgKzksNiBAQAogICoKICAqIERyaXZlciBmb3IgTUFYNjkwMiBzcGkgUlRDCiAgKgotICogQ2hhbmdlbG9nOgotICoKLSAqIDI0LU1heS0yMDA2OiBSYXBoYWVsIEFzc2VuYXQgPHJhcGhAOGQuY29tPgotICogICAgICAgICAgICAgICAgLSBNYWpvciByZXdvcmsKLSAqCQkJCUNvbnZlcnRlZCB0byBydGNfZGV2aWNlIGFuZCB1c2VzIHRoZSBTUEkgbGF5ZXIuCi0gKgotICogPz8tPz8/LTIwMDU6IFNvbWVvbmUgYXQgQ29tcHVsYWIKLSAqICAgICAgICAgICAgICAgIC0gSW5pdGlhbCBkcml2ZXIgY3JlYXRpb24uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjYsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjZGVmaW5lIE1BWDY5MDJfUkVHX1NFQ09ORFMJCTB4MDEKICNkZWZpbmUgTUFYNjkwMl9SRUdfTUlOVVRFUwkJMHgwMwpAQCAtMzgsMTYgKzI5LDcgQEAKICNkZWZpbmUgTUFYNjkwMl9SRUdfQ09OVFJPTAkJMHgwRgogI2RlZmluZSBNQVg2OTAyX1JFR19DRU5UVVJZCQkweDEzCiAKLSN1bmRlZiBNQVg2OTAyX0RFQlVHCi0KLXN0cnVjdCBtYXg2OTAyIHsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwotCXU4IGJ1Zls5XTsgLyogQnVyc3QgcmVhZCBjbWQgKyA4IHJlZ2lzdGVycyAqLwotCXU4IHR4X2J1ZlsyXTsKLQl1OCByeF9idWZbMl07Ci19OwotCi1zdGF0aWMgdm9pZCBtYXg2OTAyX3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCitzdGF0aWMgaW50IG1heDY5MDJfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKIAkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKQEAgLTU3LDExMyArMzksNTggQEAKIAlidWZbMF0gPSBhZGRyZXNzICYgMHg3ZjsKIAlidWZbMV0gPSBkYXRhOwogCi0Jc3BpX3dyaXRlKHNwaSwgYnVmLCAyKTsKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMiwgTlVMTCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbWF4NjkwMl9nZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAogCQkJCXVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgbWF4NjkwMiAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIEJ1aWxkIG91ciBzcGkgbWVzc2FnZSAqLwotCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOwotCW1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKLQl4ZmVyLmxlbiA9IDI7Ci0JLyogQ2FuIHR4X2J1ZiBhbmQgcnhfYnVmIGJlIGVxdWFsPyBUaGUgZG9jIGluIHNwaS5oIGlzIG5vdCBzdXJlLi4uICovCi0JeGZlci50eF9idWYgPSBjaGlwLT50eF9idWY7Ci0JeGZlci5yeF9idWYgPSBjaGlwLT5yeF9idWY7CiAKIAkvKiBTZXQgTVNCIHRvIGluZGljYXRlIHJlYWQgKi8KLQljaGlwLT50eF9idWZbMF0gPSBhZGRyZXNzIHwgMHg4MDsKKwkqZGF0YSA9IGFkZHJlc3MgfCAweDgwOwogCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKLQotCS8qIGRvIHRoZSBpL28gKi8KLQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJKmRhdGEgPSBjaGlwLT5yeF9idWZbMV07Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGRhdGEsIDEsIGRhdGEsIDEpOwogfQogCi1zdGF0aWMgaW50IG1heDY5MDJfZ2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgbWF4NjkwMl9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogewotCXVuc2lnbmVkIGNoYXIgdG1wOwotCWludCBjZW50dXJ5OwotCWludCBlcnI7CisJaW50IGVyciwgY2VudHVyeTsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBtYXg2OTAyICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1lc3NhZ2U7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOwotCWludCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBidWZbOF07CiAKLQllcnIgPSBtYXg2OTAyX2dldF9yZWcoZGV2LCBNQVg2OTAyX1JFR19DRU5UVVJZLCAmdG1wKTsKLQlpZiAoZXJyKQorCWJ1ZlswXSA9IDB4YmY7CS8qIEJ1cnN0IHJlYWQgKi8KKworCWVyciA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBidWYsIDEsIGJ1ZiwgOCk7CisJaWYgKGVyciAhPSAwKQogCQlyZXR1cm4gZXJyOwogCi0JLyogYnVpbGQgdGhlIG1lc3NhZ2UgKi8KLQlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKLQltZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7Ci0JeGZlci5sZW4gPSAxICsgNzsJLyogQnVyc3QgcmVhZCBjb21tYW5kICsgNyByZWdpc3RlcnMgKi8KLQl4ZmVyLnR4X2J1ZiA9IGNoaXAtPmJ1ZjsKLQl4ZmVyLnJ4X2J1ZiA9IGNoaXAtPmJ1ZjsKLQljaGlwLT5idWZbMF0gPSAweGJmOwkvKiBCdXJzdCByZWFkICovCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKLQotCS8qIGRvIHRoZSBpL28gKi8KLQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gc3RhdHVzOwotCiAJLyogVGhlIGNoaXAgc2VuZHMgZGF0YSBpbiB0aGlzIG9yZGVyOgogCSAqIFNlY29uZHMsIE1pbnV0ZXMsIEhvdXJzLCBEYXRlLCBNb250aCwgRGF5LCBZZWFyICovCi0JZHQtPnRtX3NlYwk9IGJjZDJiaW4oY2hpcC0+YnVmWzFdKTsKLQlkdC0+dG1fbWluCT0gYmNkMmJpbihjaGlwLT5idWZbMl0pOwotCWR0LT50bV9ob3VyCT0gYmNkMmJpbihjaGlwLT5idWZbM10pOwotCWR0LT50bV9tZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNF0pOwotCWR0LT50bV9tb24JPSBiY2QyYmluKGNoaXAtPmJ1Zls1XSkgLSAxOwotCWR0LT50bV93ZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNl0pOwotCWR0LT50bV95ZWFyID0gYmNkMmJpbihjaGlwLT5idWZbN10pOworCWR0LT50bV9zZWMJPSBiY2QyYmluKGJ1ZlswXSk7CisJZHQtPnRtX21pbgk9IGJjZDJiaW4oYnVmWzFdKTsKKwlkdC0+dG1faG91cgk9IGJjZDJiaW4oYnVmWzJdKTsKKwlkdC0+dG1fbWRheQk9IGJjZDJiaW4oYnVmWzNdKTsKKwlkdC0+dG1fbW9uCT0gYmNkMmJpbihidWZbNF0pIC0gMTsKKwlkdC0+dG1fd2RheQk9IGJjZDJiaW4oYnVmWzVdKTsKKwlkdC0+dG1feWVhcgk9IGJjZDJiaW4oYnVmWzZdKTsKIAotCWNlbnR1cnkgPSBiY2QyYmluKHRtcCkgKiAxMDA7CisJLyogUmVhZCBjZW50dXJ5ICovCisJZXJyID0gbWF4NjkwMl9nZXRfcmVnKGRldiwgTUFYNjkwMl9SRUdfQ0VOVFVSWSwgJmJ1ZlswXSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOworCisJY2VudHVyeSA9IGJjZDJiaW4oYnVmWzBdKSAqIDEwMDsKIAogCWR0LT50bV95ZWFyICs9IGNlbnR1cnk7CiAJZHQtPnRtX3llYXIgLT0gMTkwMDsKIAotI2lmZGVmIE1BWDY5MDJfREVCVUcKLQlwcmludGsoIlxuJXMgOiBSZWFkIFJUQyB2YWx1ZXNcbiIsX19mdW5jX18pOwotCXByaW50aygidG1faG91cjogJWlcbiIsZHQtPnRtX2hvdXIpOwotCXByaW50aygidG1fbWluIDogJWlcbiIsZHQtPnRtX21pbik7Ci0JcHJpbnRrKCJ0bV9zZWMgOiAlaVxuIixkdC0+dG1fc2VjKTsKLQlwcmludGsoInRtX3llYXI6ICVpXG4iLGR0LT50bV95ZWFyKTsKLQlwcmludGsoInRtX21vbiA6ICVpXG4iLGR0LT50bV9tb24pOwotCXByaW50aygidG1fbWRheTogJWlcbiIsZHQtPnRtX21kYXkpOwotCXByaW50aygidG1fd2RheTogJWlcbiIsZHQtPnRtX3dkYXkpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKGR0KTsKIH0KIAotc3RhdGljIGludCBtYXg2OTAyX3NldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCitzdGF0aWMgaW50IG1heDY5MDJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogewotCWR0LT50bV95ZWFyID0gZHQtPnRtX3llYXIrMTkwMDsKLQotI2lmZGVmIE1BWDY5MDJfREVCVUcKLQlwcmludGsoIlxuJXMgOiBTZXR0aW5nIFJUQyB2YWx1ZXNcbiIsX19mdW5jX18pOwotCXByaW50aygidG1fc2VjIDogJWlcbiIsZHQtPnRtX3NlYyk7Ci0JcHJpbnRrKCJ0bV9taW4gOiAlaVxuIixkdC0+dG1fbWluKTsKLQlwcmludGsoInRtX2hvdXI6ICVpXG4iLGR0LT50bV9ob3VyKTsKLQlwcmludGsoInRtX21kYXk6ICVpXG4iLGR0LT50bV9tZGF5KTsKLQlwcmludGsoInRtX3dkYXk6ICVpXG4iLGR0LT50bV93ZGF5KTsKLQlwcmludGsoInRtX3llYXI6ICVpXG4iLGR0LT50bV95ZWFyKTsKLSNlbmRpZgorCWR0LT50bV95ZWFyID0gZHQtPnRtX3llYXIgKyAxOTAwOwogCiAJLyogUmVtb3ZlIHdyaXRlIHByb3RlY3Rpb24gKi8KIAltYXg2OTAyX3NldF9yZWcoZGV2LCAweEYsIDApOwpAQCAtMTczLDEwICsxMDAsMTAgQEAKIAltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA1LCBiaW4yYmNkKGR0LT50bV9ob3VyKSk7CiAKIAltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA3LCBiaW4yYmNkKGR0LT50bV9tZGF5KSk7Ci0JbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwOSwgYmluMmJjZChkdC0+dG1fbW9uKzEpKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA5LCBiaW4yYmNkKGR0LT50bV9tb24gKyAxKSk7CiAJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwQiwgYmluMmJjZChkdC0+dG1fd2RheSkpOwotCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MEQsIGJpbjJiY2QoZHQtPnRtX3llYXIlMTAwKSk7Ci0JbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgxMywgYmluMmJjZChkdC0+dG1feWVhci8xMDApKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDBELCBiaW4yYmNkKGR0LT50bV95ZWFyICUgMTAwKSk7CisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgxMywgYmluMmJjZChkdC0+dG1feWVhciAvIDEwMCkpOwogCiAJLyogQ29tcHVsYWIgdXNlZCBhIGRlbGF5IGhlcmUuIEhvd2V2ZXIsIHRoZSBkYXRhc2hlZXQKIAkgKiBkb2VzIG5vdCBtZW50aW9uIGEgZGVsYXkgYmVpbmcgcmVxdWlyZWQgYW55d2hlcmUuLi4gKi8KQEAgLTE4OCwxNiArMTE1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtYXg2OTAyX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIG1heDY5MDJfZ2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCi1zdGF0aWMgaW50IG1heDY5MDJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBtYXg2OTAyX3NldF9kYXRldGltZShkZXYsIHRtKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1heDY5MDJfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gbWF4NjkwMl9yZWFkX3RpbWUsCiAJLnNldF90aW1lCT0gbWF4NjkwMl9zZXRfdGltZSwKQEAgLTIwNyw0NSArMTI0LDI5IEBACiB7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKIAl1bnNpZ25lZCBjaGFyIHRtcDsKLQlzdHJ1Y3QgbWF4NjkwMiAqY2hpcDsKIAlpbnQgcmVzOwogCisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCisJcmVzID0gbWF4NjkwMl9nZXRfcmVnKCZzcGktPmRldiwgTUFYNjkwMl9SRUdfU0VDT05EUywgJnRtcCk7CisJaWYgKHJlcyAhPSAwKQorCQlyZXR1cm4gcmVzOworCiAJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibWF4NjkwMiIsCiAJCQkJJnNwaS0+ZGV2LCAmbWF4NjkwMl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CiAJaWYgKElTX0VSUihydGMpKQogCQlyZXR1cm4gUFRSX0VSUihydGMpOwogCi0Jc3BpLT5tb2RlID0gU1BJX01PREVfMzsKLQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwotCXNwaV9zZXR1cChzcGkpOwotCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mICpjaGlwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApIHsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQljaGlwLT5ydGMgPSBydGM7Ci0JZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgY2hpcCk7Ci0KLQlyZXMgPSBtYXg2OTAyX2dldF9yZWcoJnNwaS0+ZGV2LCBNQVg2OTAyX1JFR19TRUNPTkRTLCAmdG1wKTsKLQlpZiAocmVzKSB7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYXg2OTAyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXN0cnVjdCBtYXg2OTAyICpjaGlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gY2hpcC0+cnRjOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzcGkpOwogCi0JaWYgKHJ0YykKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7Ci0KLQlrZnJlZShjaGlwKTsKLQorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwogCXJldHVybiAwOwogfQogCkBAIC0yNjEsNyArMTYyLDYgQEAKIAogc3RhdGljIF9faW5pdCBpbnQgbWF4NjkwMl9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKCJtYXg2OTAyIHNwaSBkcml2ZXJcbiIpOwogCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtYXg2OTAyX2RyaXZlcik7CiB9CiBtb2R1bGVfaW5pdChtYXg2OTAyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW12LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYxMmRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLW12LmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBSVEMgaW4gTWFydmVsbCBTb0NzLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworCisjZGVmaW5lIFJUQ19USU1FX1JFR19PRkZTCTAKKyNkZWZpbmUgUlRDX1NFQ09ORFNfT0ZGUwkwCisjZGVmaW5lIFJUQ19NSU5VVEVTX09GRlMJOAorI2RlZmluZSBSVENfSE9VUlNfT0ZGUwkJMTYKKyNkZWZpbmUgUlRDX1dEQVlfT0ZGUwkJMjQKKyNkZWZpbmUgUlRDX0hPVVJTXzEySF9NT0RFCQkoMSA8PCAyMikgLyogMTIgaG91cnMgbW9kZSAqLworCisjZGVmaW5lIFJUQ19EQVRFX1JFR19PRkZTCTQKKyNkZWZpbmUgUlRDX01EQVlfT0ZGUwkJMAorI2RlZmluZSBSVENfTU9OVEhfT0ZGUwkJOAorI2RlZmluZSBSVENfWUVBUl9PRkZTCQkxNgorCisKK3N0cnVjdCBydGNfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworfTsKKworc3RhdGljIGludCBtdl9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIJcnRjX3JlZzsKKworCXJ0Y19yZWcgPSAoYmluMmJjZCh0bS0+dG1fc2VjKSA8PCBSVENfU0VDT05EU19PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV9taW4pIDw8IFJUQ19NSU5VVEVTX09GRlMpIHwKKwkJKGJpbjJiY2QodG0tPnRtX2hvdXIpIDw8IFJUQ19IT1VSU19PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV93ZGF5KSA8PCBSVENfV0RBWV9PRkZTKTsKKwl3cml0ZWwocnRjX3JlZywgaW9hZGRyICsgUlRDX1RJTUVfUkVHX09GRlMpOworCisJcnRjX3JlZyA9IChiaW4yYmNkKHRtLT50bV9tZGF5KSA8PCBSVENfTURBWV9PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV9tb24gKyAxKSA8PCBSVENfTU9OVEhfT0ZGUykgfAorCQkoYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCkgPDwgUlRDX1lFQVJfT0ZGUyk7CisJd3JpdGVsKHJ0Y19yZWcsIGlvYWRkciArIFJUQ19EQVRFX1JFR19PRkZTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIJcnRjX3RpbWUsIHJ0Y19kYXRlOworCXVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgd2RheTsKKworCXJ0Y190aW1lID0gcmVhZGwoaW9hZGRyICsgUlRDX1RJTUVfUkVHX09GRlMpOworCXJ0Y19kYXRlID0gcmVhZGwoaW9hZGRyICsgUlRDX0RBVEVfUkVHX09GRlMpOworCisJc2Vjb25kID0gcnRjX3RpbWUgJiAweDdmOworCW1pbnV0ZSA9IChydGNfdGltZSA+PiBSVENfTUlOVVRFU19PRkZTKSAmIDB4N2Y7CisJaG91ciA9IChydGNfdGltZSA+PiBSVENfSE9VUlNfT0ZGUykgJiAweDNmOyAvKiBhc3N1bWUgMjQgaG91cnMgbW9kZSAqLworCXdkYXkgPSAocnRjX3RpbWUgPj4gUlRDX1dEQVlfT0ZGUykgJiAweDc7CisKKwlkYXkgPSBydGNfZGF0ZSAmIDB4M2Y7CisJbW9udGggPSAocnRjX2RhdGUgPj4gUlRDX01PTlRIX09GRlMpICYgMHgzZjsKKwl5ZWFyID0gKHJ0Y19kYXRlID4+IFJUQ19ZRUFSX09GRlMpICYgMHhmZjsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHNlY29uZCk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4obWludXRlKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oaG91cik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGRheSk7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHdkYXkpOworCXRtLT50bV9tb24gPSBiY2QyYmluKG1vbnRoKSAtIDE7CisJLyogaHcgY291bnRzIGZyb20geWVhciAyMDAwLCBidXQgdG1feWVhciBpcyByZWxhdGl2ZSB0byAxOTAwICovCisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHllYXIpICsgMTAwOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtdl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBtdl9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG12X3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG12X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YTsKKwlyZXNvdXJjZV9zaXplX3Qgc2l6ZTsKKwl1MzIgcnRjX3RpbWU7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCBzaXplLAorCQkJCSAgICAgcGRldi0+bmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlwZGF0YS0+aW9hZGRyID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHNpemUpOworCWlmICghcGRhdGEtPmlvYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBtYWtlIHN1cmUgdGhlIDI0IGhvdXJzIG1vZGUgaXMgZW5hYmxlZCAqLworCXJ0Y190aW1lID0gcmVhZGwocGRhdGEtPmlvYWRkciArIFJUQ19USU1FX1JFR19PRkZTKTsKKwlpZiAocnRjX3RpbWUgJiBSVENfSE9VUlNfMTJIX01PREUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiMjQgSG91cnMgbW9kZSBub3Qgc3VwcG9ydGVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKwlwZGF0YS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJCQkgJm12X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5ydGMpKQorCQlyZXR1cm4gUFRSX0VSUihwZGF0YS0+cnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBtdl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG12X3J0Y19kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChtdl9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLW12IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IG12X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtdl9ydGNfZHJpdmVyLCBtdl9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgbXZfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtdl9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXZfaW5pdCk7Cittb2R1bGVfZXhpdChtdl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2FlZWQgQmlzaGFyYSA8c2FlZWRAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtbXYiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1weGEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1weGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdlYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLXB4YS5jCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgWFNjYWxlIFBYQTI3eCBhbmQgUFhBM3h4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJvYmVydCBKYXJ6bWlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBUSU1FUl9GUkVRCQlDTE9DS19USUNLX1JBVEUKKyNkZWZpbmUgUlRDX0RFRl9ESVZJREVSCQkoMzI3NjggLSAxKQorI2RlZmluZSBSVENfREVGX1RSSU0JCTAKKyNkZWZpbmUgTUFYRlJFUV9QRVJJT0RJQwkxMDAwCisKKy8qCisgKiBQWEEgUmVnaXN0ZXJzIGFuZCBiaXRzIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgUlRTUl9QSUNFCSgxIDw8IDE1KQkvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgY291bnQgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfUElBTEUJKDEgPDwgMTQpCS8qIFBlcmlvZGljIGludGVycnVwdCBBbGFybSBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9QSUFMCSgxIDw8IDEzKQkvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9TV0FMRTIJKDEgPDwgMTEpCS8qIFJUQyBzdG9wd2F0Y2ggYWxhcm0yIGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1NXQUwyCSgxIDw8IDEwKQkvKiBSVEMgc3RvcHdhdGNoIGFsYXJtMiBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX1NXQUxFMQkoMSA8PCA5KQkvKiBSVEMgc3RvcHdhdGNoIGFsYXJtMSBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9TV0FMMQkoMSA8PCA4KQkvKiBSVEMgc3RvcHdhdGNoIGFsYXJtMSBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX1JEQUxFMgkoMSA8PCA3KQkvKiBSVEMgYWxhcm0yIGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1JEQUwyCSgxIDw8IDYpCS8qIFJUQyBhbGFybTIgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9SREFMRTEJKDEgPDwgNSkJLyogUlRDIGFsYXJtMSBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9SREFMMQkoMSA8PCA0KQkvKiBSVEMgYWxhcm0xIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfSFpFCSgxIDw8IDMpCS8qIEhaIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9BTEUJKDEgPDwgMikJLyogUlRDIGFsYXJtIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9IWgkJKDEgPDwgMSkJLyogSFogcmlzaW5nLWVkZ2UgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9BTAkJKDEgPDwgMCkJLyogUlRDIGFsYXJtIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfVFJJR19NQVNLCShSVFNSX0FMIHwgUlRTUl9IWiB8IFJUU1JfUkRBTDEgfCBSVFNSX1JEQUwyXAorCQkJIHwgUlRTUl9TV0FMMSB8IFJUU1JfU1dBTDIpCisjZGVmaW5lIFJZeFJfWUVBUl9TCTkKKyNkZWZpbmUgUll4Ul9ZRUFSX01BU0sJKDB4ZmZmIDw8IFJZeFJfWUVBUl9TKQorI2RlZmluZSBSWXhSX01PTlRIX1MJNQorI2RlZmluZSBSWXhSX01PTlRIX01BU0sJKDB4ZiA8PCBSWXhSX01PTlRIX1MpCisjZGVmaW5lIFJZeFJfREFZX01BU0sJMHgxZgorI2RlZmluZSBSRHhSX0hPVVJfUwkxMgorI2RlZmluZSBSRHhSX0hPVVJfTUFTSwkoMHgxZiA8PCBSRHhSX0hPVVJfUykKKyNkZWZpbmUgUkR4Ul9NSU5fUwk2CisjZGVmaW5lIFJEeFJfTUlOX01BU0sJKDB4M2YgPDwgUkR4Ul9NSU5fUykKKyNkZWZpbmUgUkR4Ul9TRUNfTUFTSwkweDNmCisKKyNkZWZpbmUgUlRTUgkJMHgwOAorI2RlZmluZSBSVFRSCQkweDBjCisjZGVmaW5lIFJEQ1IJCTB4MTAKKyNkZWZpbmUgUllDUgkJMHgxNAorI2RlZmluZSBSREFSMQkJMHgxOAorI2RlZmluZSBSWUFSMQkJMHgxYworI2RlZmluZSBSVENQSUNSCQkweDM0CisjZGVmaW5lIFBJQVIJCTB4MzgKKworI2RlZmluZSBydGNfcmVhZGwocHhhX3J0YywgcmVnKQlcCisJX19yYXdfcmVhZGwoKHB4YV9ydGMpLT5iYXNlICsgKHJlZykpCisjZGVmaW5lIHJ0Y193cml0ZWwocHhhX3J0YywgcmVnLCB2YWx1ZSkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocHhhX3J0YyktPmJhc2UgKyAocmVnKSkKKworc3RydWN0IHB4YV9ydGMgeworCXN0cnVjdCByZXNvdXJjZQkqcmVzczsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCWludAkJCWlycV8xSHo7CisJaW50CQkJaXJxX0Fscm07CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwlzcGlubG9ja190CQlsb2NrOwkJLyogUHJvdGVjdHMgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgcnRjX3RpbWUJCXJ0Y19hbGFybTsKK307CisKK3N0YXRpYyB1MzIgcnl4cl9jYWxjKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuICgodG0tPnRtX3llYXIgKyAxOTAwKSA8PCBSWXhSX1lFQVJfUykKKwkJfCAoKHRtLT50bV9tb24gKyAxKSA8PCBSWXhSX01PTlRIX1MpCisJCXwgdG0tPnRtX21kYXk7Cit9CisKK3N0YXRpYyB1MzIgcmR4cl9jYWxjKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuICh0bS0+dG1faG91ciA8PCBSRHhSX0hPVVJfUykgfCAodG0tPnRtX21pbiA8PCBSRHhSX01JTl9TKQorCQl8IHRtLT50bV9zZWM7Cit9CisKK3N0YXRpYyB2b2lkIHRtX2NhbGModTMyIHJ5Y3IsIHUzMiByZGNyLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXRtLT50bV95ZWFyID0gKChyeWNyICYgUll4Ul9ZRUFSX01BU0spID4+IFJZeFJfWUVBUl9TKSAtIDE5MDA7CisJdG0tPnRtX21vbiA9ICgoKHJ5Y3IgJiBSWXhSX01PTlRIX01BU0spID4+IFJZeFJfTU9OVEhfUykpIC0gMTsKKwl0bS0+dG1fbWRheSA9IChyeWNyICYgUll4Ul9EQVlfTUFTSyk7CisJdG0tPnRtX2hvdXIgPSAocmRjciAmIFJEeFJfSE9VUl9NQVNLKSA+PiBSRHhSX0hPVVJfUzsKKwl0bS0+dG1fbWluID0gKHJkY3IgJiBSRHhSX01JTl9NQVNLKSA+PiBSRHhSX01JTl9TOworCXRtLT50bV9zZWMgPSByZGNyICYgUkR4Ul9TRUNfTUFTSzsKK30KKworc3RhdGljIHZvaWQgcnRzcl9jbGVhcl9iaXRzKHN0cnVjdCBweGFfcnRjICpweGFfcnRjLCB1MzIgbWFzaykKK3sKKwl1MzIgcnRzcjsKKworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJcnRzciAmPSB+UlRTUl9UUklHX01BU0s7CisJcnRzciAmPSB+bWFzazsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJUU1IsIHJ0c3IpOworfQorCitzdGF0aWMgdm9pZCBydHNyX3NldF9iaXRzKHN0cnVjdCBweGFfcnRjICpweGFfcnRjLCB1MzIgbWFzaykKK3sKKwl1MzIgcnRzcjsKKworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJcnRzciAmPSB+UlRTUl9UUklHX01BU0s7CisJcnRzciB8PSBtYXNrOworCXJ0Y193cml0ZWwocHhhX3J0YywgUlRTUiwgcnRzcik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBweGFfcnRjX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZfaWQpOworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTMyIHJ0c3I7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCisJc3Bpbl9sb2NrKCZweGFfcnRjLT5sb2NrKTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzb3VyY2VzICovCisJcnRzciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKTsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJUU1IsIHJ0c3IpOworCisJLyogdGVtcG9yYXJ5IGRpc2FibGUgcnRjIGludGVycnVwdHMgKi8KKwlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9SREFMRTEgfCBSVFNSX1BJQUxFIHwgUlRTUl9IWkUpOworCisJLyogY2xlYXIgYWxhcm0gaW50ZXJydXB0IGlmIGl0IGhhcyBvY2N1cnJlZCAqLworCWlmIChydHNyICYgUlRTUl9SREFMMSkKKwkJcnRzciAmPSB+UlRTUl9SREFMRTE7CisKKwkvKiB1cGRhdGUgaXJxIGRhdGEgJiBjb3VudGVyICovCisJaWYgKHJ0c3IgJiBSVFNSX1JEQUwxKQorCQlldmVudHMgfD0gUlRDX0FGIHwgUlRDX0lSUUY7CisJaWYgKHJ0c3IgJiBSVFNSX0haKQorCQlldmVudHMgfD0gUlRDX1VGIHwgUlRDX0lSUUY7CisJaWYgKHJ0c3IgJiBSVFNSX1BJQUwpCisJCWV2ZW50cyB8PSBSVENfUEYgfCBSVENfSVJRRjsKKworCXJ0Y191cGRhdGVfaXJxKHB4YV9ydGMtPnJ0YywgMSwgZXZlbnRzKTsKKworCS8qIGVuYWJsZSBiYWNrIHJ0YyBpbnRlcnJ1cHRzICovCisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyICYgflJUU1JfVFJJR19NQVNLKTsKKworCXNwaW5fdW5sb2NrKCZweGFfcnRjLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19vcGVuKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShweGFfcnRjLT5pcnFfMUh6LCBweGFfcnRjX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgInJ0YyAxSHoiLCBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLCBweGFfcnRjLT5pcnFfMUh6LAorCQkJcmV0KTsKKwkJZ290byBlcnJfaXJxXzFIejsKKwl9CisJcmV0ID0gcmVxdWVzdF9pcnEocHhhX3J0Yy0+aXJxX0Fscm0sIHB4YV9ydGNfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJICAicnRjIEFscm0iLCBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLCBweGFfcnRjLT5pcnFfQWxybSwKKwkJCXJldCk7CisJCWdvdG8gZXJyX2lycV9BbHJtOworCX0KKworCXJldHVybiAwOworCitlcnJfaXJxX0Fscm06CisJZnJlZV9pcnEocHhhX3J0Yy0+aXJxXzFIeiwgZGV2KTsKK2Vycl9pcnFfMUh6OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV9ydGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCXJ0c3JfY2xlYXJfYml0cyhweGFfcnRjLCBSVFNSX1BJQUxFIHwgUlRTUl9SREFMRTEgfCBSVFNSX0haRSk7CisJc3Bpbl91bmxvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKworCWZyZWVfaXJxKHB4YV9ydGMtPmlycV9BbHJtLCBkZXYpOworCWZyZWVfaXJxKHB4YV9ydGMtPmlycV8xSHosIGRldik7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3BlcmlvZGljX2lycV9zZXRfZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBmcmVxKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHBlcmlvZF9tczsKKworCWlmIChmcmVxIDwgMSB8fCBmcmVxID4gTUFYRlJFUV9QRVJJT0RJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZXJpb2RfbXMgPSAxMDAwIC8gZnJlcTsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFBJQVIsIHBlcmlvZF9tcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcGVyaW9kaWNfaXJxX3NldF9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBlbmFibGVkKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZW5hYmxlZCkKKwkJcnRzcl9zZXRfYml0cyhweGFfcnRjLCBSVFNSX1BJQUxFIHwgUlRTUl9QSUNFKTsKKwllbHNlCisJCXJ0c3JfY2xlYXJfYml0cyhweGFfcnRjLCBSVFNSX1BJQUxFIHwgUlRTUl9QSUNFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgorCQlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9SREFMRTEpOworCQlicmVhazsKKwljYXNlIFJUQ19BSUVfT046CisJCXJ0c3Jfc2V0X2JpdHMocHhhX3J0YywgUlRTUl9SREFMRTEpOworCQlicmVhazsKKwljYXNlIFJUQ19VSUVfT0ZGOgorCQlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9IWkUpOworCQlicmVhazsKKwljYXNlIFJUQ19VSUVfT046CisJCXJ0c3Jfc2V0X2JpdHMocHhhX3J0YywgUlRTUl9IWkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiByeWNyLCByZGNyOworCisJcnljciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSWUNSKTsKKwlyZGNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJEQ1IpOworCisJdG1fY2FsYyhyeWNyLCByZGNyLCB0bSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y193cml0ZWwocHhhX3J0YywgUllDUiwgcnl4cl9jYWxjKHRtKSk7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSRENSLCByZHhyX2NhbGModG0pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHJ0c3IsIHJ5YXIsIHJkYXI7CisKKwlyeWFyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJZQVIxKTsKKwlyZGFyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJEQVIxKTsKKwl0bV9jYWxjKHJ5YXIsIHJkYXIsICZhbHJtLT50aW1lKTsKKworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJYWxybS0+ZW5hYmxlZCA9IChydHNyICYgUlRTUl9SREFMRTEpID8gMSA6IDA7CisJYWxybS0+cGVuZGluZyA9IChydHNyICYgUlRTUl9SREFMMSkgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHJ0c3I7CisKKwlzcGluX2xvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKworCXJ0Y193cml0ZWwocHhhX3J0YywgUllBUjEsIHJ5eHJfY2FsYygmYWxybS0+dGltZSkpOworCXJ0Y193cml0ZWwocHhhX3J0YywgUkRBUjEsIHJkeHJfY2FsYygmYWxybS0+dGltZSkpOworCisJcnRzciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKTsKKwlpZiAoYWxybS0+ZW5hYmxlZCkKKwkJcnRzciB8PSBSVFNSX1JEQUxFMTsKKwllbHNlCisJCXJ0c3IgJj0gflJUU1JfUkRBTEUxOworCXJ0Y193cml0ZWwocHhhX3J0YywgUlRTUiwgcnRzcik7CisKKwlzcGluX3VubG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNlcV9wcmludGYoc2VxLCAidHJpbS9kaXZpZGVyXHQ6IDB4JTA4eFxuIiwgcnRjX3JlYWRsKHB4YV9ydGMsIFJUVFIpKTsKKwlzZXFfcHJpbnRmKHNlcSwgInVwZGF0ZV9JUlFcdDogJXNcbiIsCisJCSAgIChydGNfcmVhZGwocHhhX3J0YywgUlRTUikgJiBSVFNSX0haRSkgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYoc2VxLCAicGVyaW9kaWNfSVJRXHQ6ICVzXG4iLAorCQkgICAocnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpICYgUlRTUl9QSUFMRSkgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYoc2VxLCAicGVyaW9kaWNfZnJlcVx0OiAldVxuIiwgcnRjX3JlYWRsKHB4YV9ydGMsIFBJQVIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgcHhhX3J0Y19vcHMgPSB7CisJLm9wZW4gPSBweGFfcnRjX29wZW4sCisJLnJlbGVhc2UgPSBweGFfcnRjX3JlbGVhc2UsCisJLmlvY3RsID0gcHhhX3J0Y19pb2N0bCwKKwkucmVhZF90aW1lID0gcHhhX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gcHhhX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IHB4YV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gcHhhX3J0Y19zZXRfYWxhcm0sCisJLnByb2MgPSBweGFfcnRjX3Byb2MsCisJLmlycV9zZXRfc3RhdGUgPSBweGFfcGVyaW9kaWNfaXJxX3NldF9zdGF0ZSwKKwkuaXJxX3NldF9mcmVxID0gcHhhX3BlcmlvZGljX2lycV9zZXRfZnJlcSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjOworCWludCByZXQ7CisJdTMyIHJ0dHI7CisKKwlweGFfcnRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHB4YV9ydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB4YV9ydGMpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnB4YV9ydGMtPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHB4YV9ydGMpOworCisJcmV0ID0gLUVOWElPOworCXB4YV9ydGMtPnJlc3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcHhhX3J0Yy0+cmVzcykgeworCQlkZXZfZXJyKGRldiwgIk5vIEkvTyBtZW1vcnkgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gZXJyX3Jlc3M7CisJfQorCisJcHhhX3J0Yy0+aXJxXzFIeiA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHB4YV9ydGMtPmlycV8xSHogPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gMUh6IElSUSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJZ290byBlcnJfcmVzczsKKwl9CisJcHhhX3J0Yy0+aXJxX0Fscm0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCWlmIChweGFfcnRjLT5pcnFfQWxybSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJObyBhbGFybSBJUlEgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gZXJyX3Jlc3M7CisJfQorCisJcmV0ID0gLUVOT01FTTsKKwlweGFfcnRjLT5iYXNlID0gaW9yZW1hcChweGFfcnRjLT5yZXNzLT5zdGFydCwKKwkJCQlyZXNvdXJjZV9zaXplKHB4YV9ydGMtPnJlc3MpKTsKKwlpZiAoIXB4YV9ydGMtPmJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIG1hcCBweGEgUlRDIEkvTyBtZW1vcnlcbiIpOworCQlnb3RvIGVycl9tYXA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgY2xvY2sgZGl2aWRlciBpcyB1bmluaXRpYWxpemVkIHRoZW4gcmVzZXQgaXQgdG8gdGhlCisJICogZGVmYXVsdCB2YWx1ZSB0byBnZXQgdGhlIDFIeiBjbG9jay4KKwkgKi8KKwlpZiAocnRjX3JlYWRsKHB4YV9ydGMsIFJUVFIpID09IDApIHsKKwkJcnR0ciA9IFJUQ19ERUZfRElWSURFUiArIChSVENfREVGX1RSSU0gPDwgMTYpOworCQlydGNfd3JpdGVsKHB4YV9ydGMsIFJUVFIsIHJ0dHIpOworCQlkZXZfd2FybihkZXYsICJ3YXJuaW5nOiBpbml0aWFsaXppbmcgZGVmYXVsdCBjbG9jayIKKwkJCSAiIGRpdmlkZXIvdHJpbSB2YWx1ZVxuIik7CisJfQorCisJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUElBTEUgfCBSVFNSX1JEQUxFMSB8IFJUU1JfSFpFKTsKKworCXB4YV9ydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInB4YS1ydGMiLCAmcGRldi0+ZGV2LCAmcHhhX3J0Y19vcHMsCisJCQkJCSAgIFRISVNfTU9EVUxFKTsKKwlyZXQgPSBQVFJfRVJSKHB4YV9ydGMtPnJ0Yyk7CisJaWYgKElTX0VSUihweGFfcnRjLT5ydGMpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUQyBkZXZpY2UgLT4gJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3J0Y19yZWc7CisJfQorCisJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisKKwlyZXR1cm4gMDsKKworZXJyX3J0Y19yZWc6CisJIGlvdW5tYXAocHhhX3J0Yy0+YmFzZSk7CitlcnJfcmVzczoKK2Vycl9tYXA6CisJa2ZyZWUocHhhX3J0Yyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgcHhhX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHB4YV9ydGMtPnJ0Yyk7CisKKwlzcGluX2xvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKwlpb3VubWFwKHB4YV9ydGMtPmJhc2UpOworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisKKwlrZnJlZShweGFfcnRjKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHB4YV9ydGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKHB4YV9ydGMtPmlycV9BbHJtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCWRpc2FibGVfaXJxX3dha2UocHhhX3J0Yy0+aXJxX0Fscm0pOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcHhhX3J0Y19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcHhhX3J0Y19yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB4YV9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AocHhhX3J0Y19yZW1vdmUpLAorCS5zdXNwZW5kCT0gcHhhX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHhhX3J0Y19yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJweGEtcnRjIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHhhX3J0Y19pbml0KHZvaWQpCit7CisJaWYgKGNwdV9pc19weGEyN3goKSB8fCBjcHVfaXNfcHhhM3h4KCkpCisJCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnB4YV9ydGNfZHJpdmVyLCBweGFfcnRjX3Byb2JlKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHhhX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB4YV9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHhhX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHB4YV9ydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJvYmVydCBKYXJ6bWlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBYQTI3eC9QWEEzeHggUmVhbHRpbWUgQ2xvY2sgRHJpdmVyIChSVEMpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnB4YS1ydGMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYyBiL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYwppbmRleCA3YTU2OGJlYi4uZTBkN2I5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXMzYy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYwpAQCAtOTQsNiArOTQsOSBAQAogewogCXVuc2lnbmVkIGludCB0bXA7CiAKKwlpZiAoIWlzX3Bvd2VyX29mXzIoZnJlcSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Bpbl9sb2NrX2lycSgmczNjX3J0Y19waWVfbG9jayk7CiAKIAl0bXAgPSByZWFkYihzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1RJQ05UKSAmIFMzQzI0MTBfVElDTlRfRU5BQkxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXNoLmMgYi9kcml2ZXJzL3J0Yy9ydGMtc2guYwppbmRleCBhYWY5ZDZhLi4xYzNmYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtc2guYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtc2guYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8YXNtL3J0Yy5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJzaC1ydGMiCkBAIC04OSw3ICs5MCw5IEBACiAJdm9pZCBfX2lvbWVtICpyZWdiYXNlOwogCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQl1bnNpZ25lZCBpbnQgYWxhcm1faXJxLCBwZXJpb2RpY19pcnEsIGNhcnJ5X2lycTsKKwlpbnQgYWxhcm1faXJxOworCWludCBwZXJpb2RpY19pcnE7CisJaW50IGNhcnJ5X2lycTsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjX2RldjsKIAlzcGlubG9ja190IGxvY2s7CiAJdW5zaWduZWQgbG9uZyBjYXBhYmlsaXRpZXM7CS8qIFNlZSBhc20tc2gvcnRjLmggZm9yIGNhcCBiaXRzICovCkBAIC01NDksNiArNTUyLDggQEAKIAogc3RhdGljIGludCBzaF9ydGNfaXJxX3NldF9mcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGZyZXEpCiB7CisJaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gc2hfcnRjX2lvY3RsKGRldiwgUlRDX0lSUVBfU0VULCBmcmVxKTsKIH0KIApAQCAtNTc4LDcgKzU4Myw3IEBACiAKIAkvKiBnZXQgcGVyaW9kaWMvY2FycnkvYWxhcm0gaXJxcyAqLwogCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJaWYgKHVubGlrZWx5KHJldCA8PSAwKSkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgZm9yIHBlcmlvZFxuIik7CiAJCWdvdG8gZXJyX2JhZHJlczsKQEAgLTU4Niw3ICs1OTEsNyBAQAogCXJ0Yy0+cGVyaW9kaWNfaXJxID0gcmV0OwogCiAJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKLQlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwlpZiAodW5saWtlbHkocmV0IDw9IDApKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElSUSBmb3IgY2FycnlcbiIpOwogCQlnb3RvIGVycl9iYWRyZXM7CkBAIC01OTQsNyArNTk5LDcgQEAKIAlydGMtPmNhcnJ5X2lycSA9IHJldDsKIAogCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMik7Ci0JaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJaWYgKHVubGlrZWx5KHJldCA8PSAwKSkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgZm9yIGFsYXJtXG4iKTsKIAkJZ290byBlcnJfYmFkcmVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYwppbmRleCBmNGNkNDZlLi5kYzBiNjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKQorCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCXBkYXRhLT5hbHJtX21kYXkgPSBhbHJtLT50aW1lLnRtX21kYXk7CiAJcGRhdGEtPmFscm1faG91ciA9IGFscm0tPnRpbWUudG1faG91cjsKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlhbHJtLT50aW1lLnRtX21kYXkgPSBwZGF0YS0+YWxybV9tZGF5IDwgMCA/IDAgOiBwZGF0YS0+YWxybV9tZGF5OwogCWFscm0tPnRpbWUudG1faG91ciA9IHBkYXRhLT5hbHJtX2hvdXIgPCAwID8gMCA6IHBkYXRhLT5hbHJtX2hvdXI7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsgLyogZmFsbCBiYWNrIGludG8gcnRjLWRldidzIGVtdWxhdGlvbiAqLwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVENfQUlFX09GRjoKQEAgLTMwMyw3ICszMDMsNiBAQAogCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcGRhdGEtPmlycSA9IC0xOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFJUQ19SRUdfU0laRSwgcGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDsKQEAgLTMyOSwxMyArMzI4LDEzIEBACiAJaWYgKHJlYWRiKGlvYWRkciArIFJUQ19GTEFHUykgJiBSVENfRkxBR1NfUEYpCiAJCWRldl93YXJuKCZwZGV2LT5kZXYsICJ2b2x0YWdlLWxvdyBkZXRlY3RlZC5cbiIpOwogCi0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQl3cml0ZWIoMCwgaW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOwogCQlpZiAocmVxdWVzdF9pcnEocGRhdGEtPmlycSwgc3RrMTd0YThfcnRjX2ludGVycnVwdCwKIAkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCiAJCQkJcGRldi0+bmFtZSwgcGRldikgPCAwKSB7CiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG5vdCBhdmFpbGFibGUuXG4iKTsKLQkJCXBkYXRhLT5pcnEgPSAtMTsKKwkJCXBkYXRhLT5pcnEgPSAwOwogCQl9CiAJfQogCkBAIC0zNTUsNyArMzU0LDcgQEAKICBvdXQ6CiAJaWYgKHBkYXRhLT5ydGMpCiAJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKLQlpZiAocGRhdGEtPmlycSA+PSAwKQorCWlmIChwZGF0YS0+aXJxID4gMCkKIAkJZnJlZV9pcnEocGRhdGEtPmlycSwgcGRldik7CiAJaWYgKGlvYWRkcikKIAkJaW91bm1hcChpb2FkZHIpOwpAQCAtMzcxLDcgKzM3MCw3IEBACiAKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmc3RrMTd0YThfbnZyYW1fYXR0cik7CiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJd3JpdGViKDAsIHBkYXRhLT5pb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CiAJCWZyZWVfaXJxKHBkYXRhLT5pcnEsIHBkZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMgYi9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jCmluZGV4IGJjOTMwMDIuLmU0NzgyODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXRlc3QuYwpAQCAtMzQsMTQgKzM0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZXN0X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB0ZXN0X3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKIHsKKwlkZXZfaW5mbyhkZXYsICIlcywgc2VjcyA9ICVsdVxuIiwgX19mdW5jX18sIHNlY3MpOwogCXJldHVybiAwOwogfQogCkBAIC03OCw3ICs3Myw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgdGVzdF9ydGNfb3BzID0gewogCS5wcm9jID0gdGVzdF9ydGNfcHJvYywKIAkucmVhZF90aW1lID0gdGVzdF9ydGNfcmVhZF90aW1lLAotCS5zZXRfdGltZSA9IHRlc3RfcnRjX3NldF90aW1lLAogCS5yZWFkX2FsYXJtID0gdGVzdF9ydGNfcmVhZF9hbGFybSwKIAkuc2V0X2FsYXJtID0gdGVzdF9ydGNfc2V0X2FsYXJtLAogCS5zZXRfbW1zcyA9IHRlc3RfcnRjX3NldF9tbXNzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYyBiL2RyaXZlcnMvcnRjL3J0Yy10d2w0MDMwLmMKaW5kZXggMDFkOGRhOS4uOGNlNWY3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdHdsNDAzMC5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC00MTUsOCArNDE2LDggQEAKIAlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAl1OCByZF9yZWc7CiAKLQlpZiAoaXJxIDwgMCkKLQkJcmV0dXJuIGlycTsKKwlpZiAoaXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLAogCQkJCSAgJnBkZXYtPmRldiwgJnR3bDQwMzBfcnRjX29wcywgVEhJU19NT0RVTEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jIGIvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTQ4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtdHg0OTM5LmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBUWDQ5MzkgaW50ZXJuYWwgUlRDIGRyaXZlcgorICogQmFzZWQgb24gUkJUWDQ5eHggcGF0Y2ggZnJvbSBDRUxGIHBhdGNoIGFyY2hpdmUuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogKEMpIENvcHlyaWdodCBUT1NISUJBIENPUlBPUkFUSU9OIDIwMDUtMjAwNworICovCisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vdHh4OS90eDQ5MzkuaD4KKworc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19jbWQoc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZywgaW50IGNtZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlfX3Jhd193cml0ZWwoY21kLCAmcnRjcmVnLT5jdGwpOworCS8qIFRoaXMgbWlnaHQgdGFrZSAzMHVzIChuZXh0IDMyLjc2OEtIeiBjbG9jaykgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQlVTWSkgeworCQkvKiB0aW1lb3V0IG9uIGFwcHJveC4gMTAwdXMgKEAgR0JVUzIwME1IeikgKi8KKwkJaWYgKGkrKyA+IDIwMCAqIDEwMCkKKwkJCXJldHVybiAtRUJVU1k7CisJCWNwdV9yZWxheCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworCWJ1ZlswXSA9IDA7CisJYnVmWzFdID0gMDsKKwlidWZbMl0gPSBzZWNzOworCWJ1ZlszXSA9IHNlY3MgPj4gODsKKwlidWZbNF0gPSBzZWNzID4+IDE2OworCWJ1Zls1XSA9IHNlY3MgPj4gMjQ7CisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCV9fcmF3X3dyaXRlbCgwLCAmcnRjcmVnLT5hZHIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCV9fcmF3X3dyaXRlbChidWZbaV0sICZydGNyZWctPmRhdCk7CisJcmV0ID0gdHg0OTM5X3J0Y19jbWQocnRjcmVnLAorCQkJICAgICBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfU0VUVElNRSB8CisJCQkgICAgIChfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpICYgVFg0OTM5X1JUQ0NUTF9BTE1FKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIGNoYXIgYnVmWzZdOworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldCA9IHR4NDkzOV9ydGNfY21kKHJ0Y3JlZywKKwkJCSAgICAgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX0dFVFRJTUUgfAorCQkJICAgICAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQUxNRSkpOworCWlmIChyZXQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCV9fcmF3X3dyaXRlbCgyLCAmcnRjcmVnLT5hZHIpOworCWZvciAoaSA9IDI7IGkgPCA2OyBpKyspCisJCWJ1ZltpXSA9IF9fcmF3X3JlYWRsKCZydGNyZWctPmRhdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJc2VjID0gKGJ1Zls1XSA8PCAyNCkgfCAoYnVmWzRdIDw8IDE2KSB8IChidWZbM10gPDwgOCkgfCBidWZbMl07CisJcnRjX3RpbWVfdG9fdG0oc2VjLCB0bSk7CisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyBzZWM7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisKKwlpZiAoYWxybS0+dGltZS50bV9zZWMgPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1fbWluIDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX2hvdXIgPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1fbWRheSA8IDAgfHwKKwkgICAgYWxybS0+dGltZS50bV9tb24gPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1feWVhciA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJ0Y190bV90b190aW1lKCZhbHJtLT50aW1lLCAmc2VjKTsKKwlidWZbMF0gPSAwOworCWJ1ZlsxXSA9IDA7CisJYnVmWzJdID0gc2VjOworCWJ1ZlszXSA9IHNlYyA+PiA4OworCWJ1Zls0XSA9IHNlYyA+PiAxNjsKKwlidWZbNV0gPSBzZWMgPj4gMjQ7CisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCV9fcmF3X3dyaXRlbCgwLCAmcnRjcmVnLT5hZHIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCV9fcmF3X3dyaXRlbChidWZbaV0sICZydGNyZWctPmRhdCk7CisJcmV0ID0gdHg0OTM5X3J0Y19jbWQocnRjcmVnLCBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfU0VUQUxBUk0gfAorCQkJICAgICAoYWxybS0+ZW5hYmxlZCA/IFRYNDkzOV9SVENDVExfQUxNRSA6IDApKTsKKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBsb25nIHNlYzsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKwl1MzIgY3RsOworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldCA9IHR4NDkzOV9ydGNfY21kKHJ0Y3JlZywKKwkJCSAgICAgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX0dFVEFMQVJNIHwKKwkJCSAgICAgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0FMTUUpKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCQlyZXR1cm4gcmV0OworCX0KKwlfX3Jhd193cml0ZWwoMiwgJnJ0Y3JlZy0+YWRyKTsKKwlmb3IgKGkgPSAyOyBpIDwgNjsgaSsrKQorCQlidWZbaV0gPSBfX3Jhd19yZWFkbCgmcnRjcmVnLT5kYXQpOworCWN0bCA9IF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCk7CisJYWxybS0+ZW5hYmxlZCA9IChjdGwgJiBUWDQ5MzlfUlRDQ1RMX0FMTUUpID8gMSA6IDA7CisJYWxybS0+cGVuZGluZyA9IChjdGwgJiBUWDQ5MzlfUlRDQ1RMX0FMTUQpID8gMSA6IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJc2VjID0gKGJ1Zls1XSA8PCAyNCkgfCAoYnVmWzRdIDw8IDE2KSB8IChidWZbM10gPDwgOCkgfCBidWZbMl07CisJcnRjX3RpbWVfdG9fdG0oc2VjLCAmYWxybS0+dGltZSk7CisJcmV0dXJuIHJ0Y192YWxpZF90bSgmYWxybS0+dGltZSk7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwl0eDQ5MzlfcnRjX2NtZChwZGF0YS0+cnRjcmVnLAorCQkgICAgICAgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX05PUCB8CisJCSAgICAgICAoZW5hYmxlZCA/IFRYNDkzOV9SVENDVExfQUxNRSA6IDApKTsKKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHR4NDkzOV9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXZfaWQpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gUlRDX0lSUUY7CisKKwlzcGluX2xvY2soJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlpZiAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQUxNRCkgeworCQlldmVudHMgfD0gUlRDX0FGOworCQl0eDQ5MzlfcnRjX2NtZChydGNyZWcsIFRYNDkzOV9SVENDVExfQ09NTUFORF9OT1ApOworCX0KKwlzcGluX3VubG9jaygmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJ0Y191cGRhdGVfaXJxKHBkYXRhLT5ydGMsIDEsIGV2ZW50cyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgdHg0OTM5X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQkJPSB0eDQ5MzlfcnRjX3JlYWRfdGltZSwKKwkucmVhZF9hbGFybQkJPSB0eDQ5MzlfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQkJPSB0eDQ5MzlfcnRjX3NldF9hbGFybSwKKwkuc2V0X21tc3MJCT0gdHg0OTM5X3J0Y19zZXRfbW1zcywKKwkuYWxhcm1faXJxX2VuYWJsZQk9IHR4NDkzOV9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHR4NDkzOV9ydGNfbnZyYW1fcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJc3NpemVfdCBjb3VudDsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgVFg0OTM5X1JUQ19SRUdfUkFNU0laRTsKKwkgICAgIGNvdW50KyssIHNpemUtLSkgeworCQlfX3Jhd193cml0ZWwocG9zKyssICZydGNyZWctPmFkcik7CisJCSpidWYrKyA9IF9fcmF3X3JlYWRsKCZydGNyZWctPmRhdCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgdHg0OTM5X3J0Y19udnJhbV93cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJICAgICAgY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlzc2l6ZV90IGNvdW50OworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBUWDQ5MzlfUlRDX1JFR19SQU1TSVpFOworCSAgICAgY291bnQrKywgc2l6ZS0tKSB7CisJCV9fcmF3X3dyaXRlbChwb3MrKywgJnJ0Y3JlZy0+YWRyKTsKKwkJX19yYXdfd3JpdGVsKCpidWYrKywgJnJ0Y3JlZy0+ZGF0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgdHg0OTM5X3J0Y19udnJhbV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJudnJhbSIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IFRYNDkzOV9SVENfUkVHX1JBTVNJWkUsCisJLnJlYWQgPSB0eDQ5MzlfcnRjX252cmFtX3JlYWQsCisJLndyaXRlID0gdHg0OTM5X3J0Y19udnJhbV93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkzOV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJxLCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlwZGF0YS0+cnRjcmVnID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghcGRhdGEtPnJ0Y3JlZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXR4NDkzOV9ydGNfY21kKHBkYXRhLT5ydGNyZWcsIFRYNDkzOV9SVENDVExfQ09NTUFORF9OT1ApOworCWlmIChkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgdHg0OTM5X3J0Y19pbnRlcnJ1cHQsCisJCQkgICAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwkJCSAgICAgcGRldi0+bmFtZSwgJnBkZXYtPmRldikgPCAwKSB7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkgICZ0eDQ5MzlfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKwlwZGF0YS0+cnRjID0gcnRjOworCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZ0eDQ5MzlfcnRjX252cmFtX2F0dHIpOworCWlmIChyZXQpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHR4NDkzOV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBkYXRhLT5ydGM7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwl0eDQ5MzlfcnRjX2NtZChwZGF0YS0+cnRjcmVnLCBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfTk9QKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZ0eDQ5MzlfcnRjX252cmFtX2F0dHIpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0eDQ5MzlfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHR4NDkzOV9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidHg0OTM5cnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkzOXJ0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmdHg0OTM5X3J0Y19kcml2ZXIsIHR4NDkzOV9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdHg0OTM5cnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHg0OTM5X3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0eDQ5MzlydGNfaW5pdCk7Cittb2R1bGVfZXhpdCh0eDQ5MzlydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUWDQ5MzkgaW50ZXJuYWwgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0eDQ5MzlydGMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYyBiL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYwppbmRleCA4MzRkY2M2Li5mMTEyOTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdnI0MXh4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXZyNDF4eC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtODQsOCArODUsOCBAQAogc3RhdGljIGNoYXIgcnRjX25hbWVbXSA9ICJSVEMiOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyaW9kaWNfY291bnQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IGFsYXJtX2VuYWJsZWQ7Ci1zdGF0aWMgaW50IGFpZV9pcnEgPSAtMTsKLXN0YXRpYyBpbnQgcGllX2lycSA9IC0xOworc3RhdGljIGludCBhaWVfaXJxOworc3RhdGljIGludCBwaWVfaXJxOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9lbGFwc2VkX3NlY29uZCh2b2lkKQogewpAQCAtMjEwLDYgKzIxMSw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBjb3VudDsKIAorCWlmICghaXNfcG93ZXJfb2ZfMihmcmVxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJY291bnQgPSBSVENfRlJFUVVFTkNZOwogCWRvX2Rpdihjb3VudCwgZnJlcSk7CiAKQEAgLTM2MCw3ICszNjMsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwogCiAJYWllX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGFpZV9pcnEgPCAwIHx8IGFpZV9pcnEgPj0gbnJfaXJxcykgeworCWlmIChhaWVfaXJxIDw9IDApIHsKIAkJcmV0dmFsID0gLUVCVVNZOwogCQlnb3RvIGVycl9kZXZpY2VfdW5yZWdpc3RlcjsKIAl9CkBAIC0zNzEsNyArMzc0LDcgQEAKIAkJZ290byBlcnJfZGV2aWNlX3VucmVnaXN0ZXI7CiAKIAlwaWVfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKLQlpZiAocGllX2lycSA8IDAgfHwgcGllX2lycSA+PSBucl9pcnFzKQorCWlmIChwaWVfaXJxIDw9IDApCiAJCWdvdG8gZXJyX2ZyZWVfaXJxOwogCiAJcmV0dmFsID0gcmVxdWVzdF9pcnEocGllX2lycSwgcnRjbG9uZzFfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL01ha2VmaWxlIGIvZHJpdmVycy9zMzkwL01ha2VmaWxlCmluZGV4IDRmNGU3Y2YuLmQwZWFlNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3MzOTAvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKIENGTEFHU19zeXNpbmZvLm8gKz0gLUlpbmNsdWRlL21hdGgtZW11IC1JYXJjaC9zMzkwL21hdGgtZW11IC13CiAKLW9iai15ICs9IHMzOTBtYWNoLm8gc3lzaW5mby5vIHMzOTBfcmRldi5vCitvYmoteSArPSBzMzkwbWFjaC5vIHN5c2luZm8ubwogb2JqLXkgKz0gY2lvLyBibG9jay8gY2hhci8gY3J5cHRvLyBuZXQvIHNjc2kvIGt2bS8KIAogZHJpdmVycy15ICs9IGRyaXZlcnMvczM5MC9idWlsdC1pbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwppbmRleCAyNmZmYzZhLi5jZmRjZjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogCiAjZGVmaW5lIERDU1NCTEtfTkFNRSAiZGNzc2JsayIKICNkZWZpbmUgRENTU0JMS19NSU5PUlNfUEVSX0RJU0sgMQpAQCAtOTQ2LDcgKzk0NSw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQKIGRjc3NibGtfZXhpdCh2b2lkKQogewotCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOwogCXVucmVnaXN0ZXJfYmxrZGV2KGRjc3NibGtfbWFqb3IsIERDU1NCTEtfTkFNRSk7CiB9CiAKQEAgLTk1NSwyMiArOTU0LDIyIEBACiB7CiAJaW50IHJjOwogCi0JZGNzc2Jsa19yb290X2RldiA9IHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoImRjc3NibGsiKTsKKwlkY3NzYmxrX3Jvb3RfZGV2ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoImRjc3NibGsiKTsKIAlpZiAoSVNfRVJSKGRjc3NibGtfcm9vdF9kZXYpKQogCQlyZXR1cm4gUFRSX0VSUihkY3NzYmxrX3Jvb3RfZGV2KTsKIAlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShkY3NzYmxrX3Jvb3RfZGV2LCAmZGV2X2F0dHJfYWRkKTsKIAlpZiAocmMpIHsKLQkJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOworCQlyb290X2RldmljZV91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRjc3NibGtfcm9vdF9kZXYsICZkZXZfYXR0cl9yZW1vdmUpOwogCWlmIChyYykgewotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CisJCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CiAJCXJldHVybiByYzsKIAl9CiAJcmMgPSByZWdpc3Rlcl9ibGtkZXYoMCwgRENTU0JMS19OQU1FKTsKIAlpZiAocmMgPCAwKSB7Ci0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKKwkJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKIAkJcmV0dXJuIHJjOwogCX0KIAlkY3NzYmxrX21ham9yID0gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jIGIvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYwppbmRleCAxZjVmNWQyLi45YzE0ODQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KICNpbmNsdWRlIDxhc20vcmVzZXQuaD4KICNpbmNsdWRlIDxhc20vYWlycS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KQEAgLTE1MjIsNyArMTUyMSw3IEBACiAJfQogCiAJLyogQ3JlYXRlIC9zeXMvZGV2aWNlcy9hcC4gKi8KLQlhcF9yb290X2RldmljZSA9IHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoImFwIik7CisJYXBfcm9vdF9kZXZpY2UgPSByb290X2RldmljZV9yZWdpc3RlcigiYXAiKTsKIAlyYyA9IElTX0VSUihhcF9yb290X2RldmljZSkgPyBQVFJfRVJSKGFwX3Jvb3RfZGV2aWNlKSA6IDA7CiAJaWYgKHJjKQogCQlnb3RvIG91dF9idXM7CkBAIC0xNTY1LDcgKzE1NjQsNyBAQAogCWhydGltZXJfY2FuY2VsKCZhcF9wb2xsX3RpbWVyKTsKIAlkZXN0cm95X3dvcmtxdWV1ZShhcF93b3JrX3F1ZXVlKTsKIG91dF9yb290OgotCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihhcF9yb290X2RldmljZSk7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihhcF9yb290X2RldmljZSk7CiBvdXRfYnVzOgogCXdoaWxlIChpLS0pCiAJCWJ1c19yZW1vdmVfZmlsZSgmYXBfYnVzX3R5cGUsIGFwX2J1c19hdHRyc1tpXSk7CkBAIC0xNjAwLDcgKzE1OTksNyBAQAogCWhydGltZXJfY2FuY2VsKCZhcF9wb2xsX3RpbWVyKTsKIAlkZXN0cm95X3dvcmtxdWV1ZShhcF93b3JrX3F1ZXVlKTsKIAl0YXNrbGV0X2tpbGwoJmFwX3Rhc2tsZXQpOwotCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihhcF9yb290X2RldmljZSk7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihhcF9yb290X2RldmljZSk7CiAJd2hpbGUgKChkZXYgPSBidXNfZmluZF9kZXZpY2UoJmFwX2J1c190eXBlLCBOVUxMLCBOVUxMLAogCQkgICAgX19hcF9tYXRjaF9hbGwpKSkKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYyBiL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCmluZGV4IDI4YzkwYjguLmNiYzg1NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCisrKyBiL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8YXNtL2t2bV92aXJ0aW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAKICNkZWZpbmUgVklSVElPX1NVQkNPREVfNjQgMHgwRDAwCiAKQEAgLTMzNSw3ICszMzQsNyBAQAogCWlmICghTUFDSElORV9JU19LVk0pCiAJCXJldHVybiAtRU5PREVWOwogCi0Ja3ZtX3Jvb3QgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJrdm1fczM5MCIpOworCWt2bV9yb290ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoImt2bV9zMzkwIik7CiAJaWYgKElTX0VSUihrdm1fcm9vdCkpIHsKIAkJcmMgPSBQVFJfRVJSKGt2bV9yb290KTsKIAkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIga3ZtX3MzOTAgcm9vdCBkZXZpY2UiKTsKQEAgLTM0NCw3ICszNDMsNyBAQAogCiAJcmMgPSB2bWVtX2FkZF9tYXBwaW5nKHJlYWxfbWVtb3J5X3NpemUsIFBBR0VfU0laRSk7CiAJaWYgKHJjKSB7Ci0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3Rlcihrdm1fcm9vdCk7CisJCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoa3ZtX3Jvb3QpOwogCQlyZXR1cm4gcmM7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2N1MzA4OC5jIGIvZHJpdmVycy9zMzkwL25ldC9jdTMwODguYwppbmRleCBmNGEzMjM3Li40ODM4MzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2N1MzA4OC5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY3UzMDg4LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAotI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2Njd2dyb3VwLmg+CiAKQEAgLTEyMCwxMiArMTE5LDEyIEBACiB7CiAJaW50IHJjOwogCi0JY3UzMDg4X3Jvb3RfZGV2ID0gczM5MF9yb290X2Rldl9yZWdpc3RlcigiY3UzMDg4Iik7CisJY3UzMDg4X3Jvb3RfZGV2ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoImN1MzA4OCIpOwogCWlmIChJU19FUlIoY3UzMDg4X3Jvb3RfZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoY3UzMDg4X3Jvb3RfZGV2KTsKIAlyYyA9IGNjd19kcml2ZXJfcmVnaXN0ZXIoJmN1MzA4OF9kcml2ZXIpOwogCWlmIChyYykKLQkJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGN1MzA4OF9yb290X2Rldik7CisJCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoY3UzMDg4X3Jvb3RfZGV2KTsKIAogCXJldHVybiByYzsKIH0KQEAgLTEzNCw3ICsxMzMsNyBAQAogY3UzMDg4X2V4aXQgKHZvaWQpCiB7CiAJY2N3X2RyaXZlcl91bnJlZ2lzdGVyKCZjdTMwODhfZHJpdmVyKTsKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoY3UzMDg4X3Jvb3RfZGV2KTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKGN1MzA4OF9yb290X2Rldik7CiB9CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoY2N3LGN1MzA4OF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCmluZGV4IDY4MTFkZDUuLmQxYjViZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKQEAgLTI0LDcgKzI0LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAKICNpbmNsdWRlICJxZXRoX2NvcmUuaCIKICNpbmNsdWRlICJxZXRoX2NvcmVfb2ZmbC5oIgpAQCAtNDUyNSw3ICs0NTI0LDcgQEAKIAkJCQkmZHJpdmVyX2F0dHJfZ3JvdXApOwogCWlmIChyYykKIAkJZ290byBkcml2ZXJfZXJyOwotCXFldGhfY29yZV9yb290X2RldiA9IHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoInFldGgiKTsKKwlxZXRoX2NvcmVfcm9vdF9kZXYgPSByb290X2RldmljZV9yZWdpc3RlcigicWV0aCIpOwogCXJjID0gSVNfRVJSKHFldGhfY29yZV9yb290X2RldikgPyBQVFJfRVJSKHFldGhfY29yZV9yb290X2RldikgOiAwOwogCWlmIChyYykKIAkJZ290byByZWdpc3Rlcl9lcnI7CkBAIC00NTM5LDcgKzQ1MzgsNyBAQAogCiAJcmV0dXJuIDA7CiBzbGFiX2VycjoKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIocWV0aF9jb3JlX3Jvb3RfZGV2KTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKHFldGhfY29yZV9yb290X2Rldik7CiByZWdpc3Rlcl9lcnI6CiAJZHJpdmVyX3JlbW92ZV9maWxlKCZxZXRoX2NvcmVfY2N3Z3JvdXBfZHJpdmVyLmRyaXZlciwKIAkJCSAgICZkcml2ZXJfYXR0cl9ncm91cCk7CkBAIC00NTU3LDcgKzQ1NTYsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcWV0aF9jb3JlX2V4aXQodm9pZCkKIHsKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIocWV0aF9jb3JlX3Jvb3RfZGV2KTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKHFldGhfY29yZV9yb290X2Rldik7CiAJZHJpdmVyX3JlbW92ZV9maWxlKCZxZXRoX2NvcmVfY2N3Z3JvdXBfZHJpdmVyLmRyaXZlciwKIAkJCSAgICZkcml2ZXJfYXR0cl9ncm91cCk7CiAJY2N3Z3JvdXBfZHJpdmVyX3VucmVnaXN0ZXIoJnFldGhfY29yZV9jY3dncm91cF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKaW5kZXggMjE2MjdiYS4uNTkxYTJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCkBAIC0yMCw4ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KIAotI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KLQogI2luY2x1ZGUgInFldGhfY29yZS5oIgogI2luY2x1ZGUgInFldGhfY29yZV9vZmZsLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCmluZGV4IGNmZGExZWMuLjQ2OTNlZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAKLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+Ci0KICNpbmNsdWRlICJxZXRoX2wzLmgiCiAjaW5jbHVkZSAicWV0aF9jb3JlX29mZmwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jIGIvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDM3MWMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvczM5MC9zMzkwX3JkZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiAgZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCi0gKiAgczM5MCByb290IGRldmljZQotICoKLSAqICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKLSAqCQkJIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCi0gKgkJICBDYXJzdGVuIE90dGUgIChjb3R0ZUBkZS5pYm0uY29tKQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgotCi1zdGF0aWMgdm9pZAotczM5MF9yb290X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlrZnJlZShkZXYpOwotfQotCi1zdHJ1Y3QgZGV2aWNlICoKLXMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKLQotCWlmICghc3RybGVuKG5hbWUpKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWRldl9zZXRfbmFtZShkZXYsIG5hbWUpOwotCWRldi0+cmVsZWFzZSA9IHMzOTBfcm9vdF9kZXZfcmVsZWFzZTsKLQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKGRldik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQotCXJldHVybiBkZXY7Ci19Ci0KLXZvaWQKLXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaWYgKGRldikKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLX0KLQotRVhQT1JUX1NZTUJPTChzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCmluZGV4IGRjNjhiN2UuLjQyZjRlNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtMjAzMCw3ICsyMDMwLDcgQEAKIAkJaWYgKCF0cmllcykKIAkJCXByaW50ayhLRVJOX0VSUiAiJXMlcyVzJWQ6IFVuYWJsZSB0byBkcmFpbiAiCiAJCQkJCSJ0cmFuc21pdHRlclxuIiwKLQkJCSAgICAgICBwb3J0LT5kZXYgPyBwb3J0LT5kZXYtPmJ1c19pZCA6ICIiLAorCQkJICAgICAgIHBvcnQtPmRldiA/IGRldl9uYW1lKHBvcnQtPmRldikgOiAiIiwKIAkJCSAgICAgICBwb3J0LT5kZXYgPyAiOiAiIDogIiIsCiAJCQkgICAgICAgZHJ2LT5kZXZfbmFtZSwKIAkJCSAgICAgICBkcnYtPnR0eV9kcml2ZXItPm5hbWVfYmFzZSArIHBvcnQtPmxpbmUpOwpAQCAtMjE1Niw3ICsyMTU2LDcgQEAKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICIlcyVzJXMlZCBhdCAlcyAoaXJxID0gJWQpIGlzIGEgJXNcbiIsCi0JICAgICAgIHBvcnQtPmRldiA/IHBvcnQtPmRldi0+YnVzX2lkIDogIiIsCisJICAgICAgIHBvcnQtPmRldiA/IGRldl9uYW1lKHBvcnQtPmRldikgOiAiIiwKIAkgICAgICAgcG9ydC0+ZGV2ID8gIjogIiA6ICIiLAogCSAgICAgICBkcnYtPmRldl9uYW1lLAogCSAgICAgICBkcnYtPnR0eV9kcml2ZXItPm5hbWVfYmFzZSArIHBvcnQtPmxpbmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwppbmRleCBiOWQwZWZiLi40YTZmZTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTc4LDcgKzc4LDcgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGF1MTU1MF9zcGkuCiAKIGNvbmZpZyBTUElfQklUQkFORwotCXRyaXN0YXRlICJCaXRiYW5naW5nIFNQSSBtYXN0ZXIiCisJdHJpc3RhdGUgIlV0aWxpdGllcyBmb3IgQml0YmFuZ2luZyBTUEkgbWFzdGVycyIKIAloZWxwCiAJICBXaXRoIGEgZmV3IEdQSU8gcGlucywgeW91ciBzeXN0ZW0gY2FuIGJpdGJhbmcgdGhlIFNQSSBwcm90b2NvbC4KIAkgIFNlbGVjdCB0aGlzIHRvIGdldCBTUEkgc3VwcG9ydCB0aHJvdWdoIEkvTyBwaW5zIChHUElPLCBwYXJhbGxlbApAQCAtMTAwLDYgKzEwMCwyMiBAQAogCSAgaW5leHBlbnNpdmUgYmF0dGVyeSBwb3dlcmVkIG1pY3JvY29udHJvbGxlciBldmFsdWF0aW9uIGJvYXJkLgogCSAgVGhpcyBzYW1lIGNhYmxlIGNhbiBiZSB1c2VkIHRvIGZsYXNoIG5ldyBmaXJtd2FyZS4KIAorY29uZmlnIFNQSV9HUElPCisJdHJpc3RhdGUgIkdQSU8tYmFzZWQgYml0YmFuZ2luZyBTUEkgTWFzdGVyIgorCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgVGhpcyBzaW1wbGUgR1BJTyBiaXRiYW5naW5nIFNQSSBtYXN0ZXIgdXNlcyB0aGUgYXJjaC1uZXV0cmFsIEdQSU8KKwkgIGludGVyZmFjZSB0byBtYW5hZ2UgTU9TSSwgTUlTTywgU0NLLCBhbmQgY2hpcHNlbGVjdCBzaWduYWxzLiAgU1BJCisJICBzbGF2ZXMgY29ubmVjdGVkIHRvIGEgYnVzIHVzaW5nIHRoaXMgZHJpdmVyIGFyZSBjb25maWd1cmVkIGFzIHVzdWFsLAorCSAgZXhjZXB0IHRoYXQgdGhlIHNwaV9ib2FyZF9pbmZvLmNvbnRyb2xsZXJfZGF0YSBob2xkcyB0aGUgR1BJTyBudW1iZXIKKwkgIGZvciB0aGUgY2hpcHNlbGVjdCB1c2VkIGJ5IHRoaXMgY29udHJvbGxlciBkcml2ZXIuCisKKwkgIE5vdGUgdGhhdCB0aGlzIGRyaXZlciBvZnRlbiB3b24ndCBhY2hpZXZlIGV2ZW4gMSBNYml0L3NlYyBzcGVlZHMsCisJICBtYWtpbmcgaXQgdW51c3VhbGx5IHNsb3cgZm9yIFNQSS4gIElmIHlvdXIgcGxhdGZvcm0gY2FuIGlubGluZQorCSAgR1BJTyBvcGVyYXRpb25zLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gbGV2ZXJhZ2UgdGhhdCBmb3IgYmV0dGVyCisJICBzcGVlZCB3aXRoIGEgY3VzdG9tIHZlcnNpb24gb2YgdGhpcyBkcml2ZXI7IHNlZSB0aGUgc291cmNlIGNvZGUuCisKIGNvbmZpZyBTUElfSU1YCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBpTVggU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUkNIX0lNWCAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL01ha2VmaWxlIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKaW5kZXggY2NmMThkZS4uNWU5ZjUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDcgQEAKIG9iai0kKENPTkZJR19TUElfQklUQkFORykJCSs9IHNwaV9iaXRiYW5nLm8KIG9iai0kKENPTkZJR19TUElfQVUxNTUwKQkJKz0gYXUxNTUwX3NwaS5vCiBvYmotJChDT05GSUdfU1BJX0JVVFRFUkZMWSkJCSs9IHNwaV9idXR0ZXJmbHkubworb2JqLSQoQ09ORklHX1NQSV9HUElPKQkJCSs9IHNwaV9ncGlvLm8KIG9iai0kKENPTkZJR19TUElfSU1YKQkJCSs9IHNwaV9pbXgubwogb2JqLSQoQ09ORklHX1NQSV9MTTcwX0xMUCkJCSs9IHNwaV9sbTcwbGxwLm8KIG9iai0kKENPTkZJR19TUElfUFhBMlhYKQkJKz0gcHhhMnh4X3NwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCmluZGV4IDhhYmFlNGEuLjVlMzliYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCkBAIC0zMCwxMyArMzAsNiBAQAogICogVGhlIGNvcmUgU1BJIHRyYW5zZmVyIGVuZ2luZSBqdXN0IHRhbGtzIHRvIGEgcmVnaXN0ZXIgYmFuayB0byBzZXQgdXAKICAqIERNQSB0cmFuc2ZlcnM7IHRyYW5zZmVyIHF1ZXVlIHByb2dyZXNzIGlzIGRyaXZlbiBieSBJUlFzLiAgVGhlIGNsb2NrCiAgKiBmcmFtZXdvcmsgcHJvdmlkZXMgdGhlIGJhc2UgY2xvY2ssIHN1YmRpdmlkZWQgZm9yIGVhY2ggc3BpX2RldmljZS4KLSAqCi0gKiBOZXdlciBjb250cm9sbGVycywgbWFya2VkIHdpdGggIm5ld18xIiBmbGFnLCBoYXZlOgotICogIC0gQ1IuTEFTVFhGRVIKLSAqICAtIFNQSV9NUi5ESVYzMiBtYXkgYmVjb21lIEZESVYgb3IgbXVzdC1iZS16ZXJvIChoZXJlOiBhbHdheXMgemVybykKLSAqICAtIFNQSV9TUi5UWEVNUFRZLCBTUElfU1IuTlNTUiAoYW5kIGNvcnJlc3BvbmRpbmcgaXJxcykKLSAqICAtIFNQSV9DU1J4LkNTQUFUCi0gKiAgLSBTUElfQ1NSeC5TQkNSIGFsbG93cyBmYXN0ZXIgY2xvY2tpbmcKICAqLwogc3RydWN0IGF0bWVsX3NwaSB7CiAJc3BpbmxvY2tfdAkJbG9jazsKQEAgLTQ1LDcgKzM4LDYgQEAKIAlpbnQJCQlpcnE7CiAJc3RydWN0IGNsawkJKmNsazsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OwotCXVuc2lnbmVkCQluZXdfMToxOwogCXN0cnVjdCBzcGlfZGV2aWNlCSpzdGF5OwogCiAJdTgJCQlzdG9wcGluZzsKQEAgLTU5LDEwICs1MSwzMyBAQAogCWRtYV9hZGRyX3QJCWJ1ZmZlcl9kbWE7CiB9OwogCisvKiBDb250cm9sbGVyLXNwZWNpZmljIHBlci1zbGF2ZSBzdGF0ZSAqLworc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UgeworCXVuc2lnbmVkIGludAkJbnBjc19waW47CisJdTMyCQkJY3NyOworfTsKKwogI2RlZmluZSBCVUZGRVJfU0laRQkJUEFHRV9TSVpFCiAjZGVmaW5lIElOVkFMSURfRE1BX0FERFJFU1MJMHhmZmZmZmZmZgogCiAvKgorICogVmVyc2lvbiAyIG9mIHRoZSBTUEkgY29udHJvbGxlciBoYXMKKyAqICAtIENSLkxBU1RYRkVSCisgKiAgLSBTUElfTVIuRElWMzIgbWF5IGJlY29tZSBGRElWIG9yIG11c3QtYmUtemVybyAoaGVyZTogYWx3YXlzIHplcm8pCisgKiAgLSBTUElfU1IuVFhFTVBUWSwgU1BJX1NSLk5TU1IgKGFuZCBjb3JyZXNwb25kaW5nIGlycXMpCisgKiAgLSBTUElfQ1NSeC5DU0FBVAorICogIC0gU1BJX0NTUnguU0JDUiBhbGxvd3MgZmFzdGVyIGNsb2NraW5nCisgKgorICogV2UgY2FuIGRldGVybWluZSB0aGUgY29udHJvbGxlciB2ZXJzaW9uIGJ5IHJlYWRpbmcgdGhlIFZFUlNJT04KKyAqIHJlZ2lzdGVyLCBidXQgSSBoYXZlbid0IGNoZWNrZWQgdGhhdCBpdCBleGlzdHMgb24gYWxsIGNoaXBzLCBhbmQKKyAqIHRoaXMgaXMgY2hlYXBlciBhbnl3YXkuCisgKi8KK3N0YXRpYyBib29sIGF0bWVsX3NwaV9pc192Mih2b2lkKQoreworCXJldHVybiAhY3B1X2lzX2F0OTFybTkyMDAoKTsKK30KKworLyoKICAqIEVhcmxpZXIgU1BJIGNvbnRyb2xsZXJzIChlLmcuIG9uIGF0OTFybTkyMDApIGhhdmUgYSBkZXNpZ24gYnVnIHdoZXJlYnkKICAqIHRoZXkgYXNzdW1lIHRoYXQgc3BpIHNsYXZlIGRldmljZSBzdGF0ZSB3aWxsIG5vdCBjaGFuZ2Ugb24gZGVzZWxlY3QsIHNvCiAgKiB0aGF0IGF1dG9tYWdpYyBkZXNlbGVjdGlvbiBpcyBPSy4gICgiTlBDU3ggcmlzZXMgaWYgbm8gZGF0YSBpcyB0byBiZQpAQCAtODAsMzkgKzk1LDU4IEBACiAgKiBNYXN0ZXIgb24gQ2hpcCBTZWxlY3QgMC4iKSAgTm8gd29ya2Fyb3VuZCBleGlzdHMgZm9yIHRoYXQgLi4uIHNvIGZvcgogICogbkNTMCBvbiB0aGF0IGNoaXAsIHdlIChhKSBkb24ndCB1c2UgdGhlIEdQSU8sIChiKSBjYW4ndCBzdXBwb3J0IENTX0hJR0gsCiAgKiBhbmQgKGMpIHdpbGwgdHJpZ2dlciB0aGF0IGZpcnN0IGVycmF0dW0gaW4gc29tZSBjYXNlcy4KKyAqCisgKiBUT0RPOiBUZXN0IGlmIHRoZSBhdG1lbF9zcGlfaXNfdjIoKSBicmFuY2ggYmVsb3cgd29ya3Mgb24KKyAqIEFUOTFSTTkyMDAgaWYgd2UgdXNlIHNvbWUgb3RoZXIgcmVnaXN0ZXIgdGhhbiBDU1IwLiBIb3dldmVyLCBkb24ndAorICogZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkgc2luY2UgQVA3MDAwIGhhcyBhbiBlcnJhdGEgd2hlcmUgdGhlIEJJVFMKKyAqIGZpZWxkIGluIENTUjAgb3ZlcnJpZGVzIGFsbCBvdGhlciBDU1JzLgogICovCiAKIHN0YXRpYyB2b2lkIGNzX2FjdGl2YXRlKHN0cnVjdCBhdG1lbF9zcGkgKmFzLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXVuc2lnbmVkIGdwaW8gPSAodW5zaWduZWQpIHNwaS0+Y29udHJvbGxlcl9kYXRhOworCXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlICphc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQgYWN0aXZlID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7CiAJdTMyIG1yOwotCWludCBpOwotCXUzMiBjc3I7Ci0JdTMyIGNwb2wgPSAoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gU1BJX0JJVChDUE9MKSA6IDA7CiAKLQkvKiBNYWtlIHN1cmUgY2xvY2sgcG9sYXJpdHkgaXMgY29ycmVjdCAqLwotCWZvciAoaSA9IDA7IGkgPCBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgewotCQljc3IgPSBzcGlfcmVhZGwoYXMsIENTUjAgKyA0ICogaSk7Ci0JCWlmICgoY3NyIF4gY3BvbCkgJiBTUElfQklUKENQT0wpKQotCQkJc3BpX3dyaXRlbChhcywgQ1NSMCArIDQgKiBpLCBjc3IgXiBTUElfQklUKENQT0wpKTsKKwlpZiAoYXRtZWxfc3BpX2lzX3YyKCkpIHsKKwkJLyoKKwkJICogQWx3YXlzIHVzZSBDU1IwLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY2xvY2sKKwkJICogc3dpdGNoZXMgdG8gdGhlIGNvcnJlY3QgaWRsZSBwb2xhcml0eSBiZWZvcmUgd2UKKwkJICogdG9nZ2xlIHRoZSBDUy4KKwkJICovCisJCXNwaV93cml0ZWwoYXMsIENTUjAsIGFzZC0+Y3NyKTsKKwkJc3BpX3dyaXRlbChhcywgTVIsIFNQSV9CRihQQ1MsIDB4MGUpIHwgU1BJX0JJVChNT0RGRElTKQorCQkJCXwgU1BJX0JJVChNU1RSKSk7CisJCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7CisJCWdwaW9fc2V0X3ZhbHVlKGFzZC0+bnBjc19waW4sIGFjdGl2ZSk7CisJfSBlbHNlIHsKKwkJdTMyIGNwb2wgPSAoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gU1BJX0JJVChDUE9MKSA6IDA7CisJCWludCBpOworCQl1MzIgY3NyOworCisJCS8qIE1ha2Ugc3VyZSBjbG9jayBwb2xhcml0eSBpcyBjb3JyZWN0ICovCisJCWZvciAoaSA9IDA7IGkgPCBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgeworCQkJY3NyID0gc3BpX3JlYWRsKGFzLCBDU1IwICsgNCAqIGkpOworCQkJaWYgKChjc3IgXiBjcG9sKSAmIFNQSV9CSVQoQ1BPTCkpCisJCQkJc3BpX3dyaXRlbChhcywgQ1NSMCArIDQgKiBpLAorCQkJCQkJY3NyIF4gU1BJX0JJVChDUE9MKSk7CisJCX0KKworCQltciA9IHNwaV9yZWFkbChhcywgTVIpOworCQltciA9IFNQSV9CRklOUyhQQ1MsIH4oMSA8PCBzcGktPmNoaXBfc2VsZWN0KSwgbXIpOworCQlpZiAoc3BpLT5jaGlwX3NlbGVjdCAhPSAwKQorCQkJZ3Bpb19zZXRfdmFsdWUoYXNkLT5ucGNzX3BpbiwgYWN0aXZlKTsKKwkJc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKIAl9CiAKLQltciA9IHNwaV9yZWFkbChhcywgTVIpOwotCW1yID0gU1BJX0JGSU5TKFBDUywgfigxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpLCBtcik7Ci0KIAlkZXZfZGJnKCZzcGktPmRldiwgImFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCi0JCQlncGlvLCBhY3RpdmUgPyAiIChoaWdoKSIgOiAiIiwKKwkJCWFzZC0+bnBjc19waW4sIGFjdGl2ZSA/ICIgKGhpZ2gpIiA6ICIiLAogCQkJbXIpOwotCi0JaWYgKCEoY3B1X2lzX2F0OTFybTkyMDAoKSAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDApKQotCQlncGlvX3NldF92YWx1ZShncGlvLCBhY3RpdmUpOwotCXNwaV93cml0ZWwoYXMsIE1SLCBtcik7CiB9CiAKIHN0YXRpYyB2b2lkIGNzX2RlYWN0aXZhdGUoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JdW5zaWduZWQgZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UgKmFzZCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAl1bnNpZ25lZCBhY3RpdmUgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKIAl1MzIgbXI7CiAKQEAgLTEyNiwxMSArMTYwLDExIEBACiAJfQogCiAJZGV2X2RiZygmc3BpLT5kZXYsICJERWFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCi0JCQlncGlvLCBhY3RpdmUgPyAiIChsb3cpIiA6ICIiLAorCQkJYXNkLT5ucGNzX3BpbiwgYWN0aXZlID8gIiAobG93KSIgOiAiIiwKIAkJCW1yKTsKIAotCWlmICghKGNwdV9pc19hdDkxcm05MjAwKCkgJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwKSkKLQkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgIWFjdGl2ZSk7CisJaWYgKGF0bWVsX3NwaV9pc192MigpIHx8IHNwaS0+Y2hpcF9zZWxlY3QgIT0gMCkKKwkJZ3Bpb19zZXRfdmFsdWUoYXNkLT5ucGNzX3BpbiwgIWFjdGl2ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGF0bWVsX3NwaV94ZmVyX2lzX2xhc3Qoc3RydWN0IHNwaV9tZXNzYWdlICptc2csCkBAIC01MDIsNiArNTM2LDcgQEAKIHN0YXRpYyBpbnQgYXRtZWxfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGF0bWVsX3NwaQkqYXM7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UJKmFzZDsKIAl1MzIJCQlzY2JyLCBjc3I7CiAJdW5zaWduZWQgaW50CQliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOwogCXVuc2lnbmVkIGxvbmcJCWJ1c19oejsKQEAgLTUzNiwxOSArNTcxLDE2IEBACiAJfQogCiAJLyogc2VlIG5vdGVzIGFib3ZlIHJlIGNoaXBzZWxlY3QgKi8KLQlpZiAoY3B1X2lzX2F0OTFybTkyMDAoKQorCWlmICghYXRtZWxfc3BpX2lzX3YyKCkKIAkJCSYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMAogCQkJJiYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkgewogCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBjYW4ndCBiZSBhY3RpdmUtaGlnaFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qCi0JICogUHJlLW5ld18xIGNoaXBzIHN0YXJ0IG91dCBhdCBoYWxmIHRoZSBwZXJpcGhlcmFsCi0JICogYnVzIHNwZWVkLgotCSAqLworCS8qIHYxIGNoaXBzIHN0YXJ0IG91dCBhdCBoYWxmIHRoZSBwZXJpcGhlcmFsIGJ1cyBzcGVlZC4gKi8KIAlidXNfaHogPSBjbGtfZ2V0X3JhdGUoYXMtPmNsayk7Ci0JaWYgKCFhcy0+bmV3XzEpCisJaWYgKCFhdG1lbF9zcGlfaXNfdjIoKSkKIAkJYnVzX2h6IC89IDI7CiAKIAlpZiAoc3BpLT5tYXhfc3BlZWRfaHopIHsKQEAgLTU4OSwxMSArNjIxLDIwIEBACiAKIAkvKiBjaGlwc2VsZWN0IG11c3QgaGF2ZSBiZWVuIG11eGVkIGFzIEdQSU8gKGUuZy4gaW4gYm9hcmQgc2V0dXApICovCiAJbnBjc19waW4gPSAodW5zaWduZWQgaW50KXNwaS0+Y29udHJvbGxlcl9kYXRhOwotCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKSB7CisJYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCWlmICghYXNkKSB7CisJCWFzZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYXNkKQorCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJcmV0ID0gZ3Bpb19yZXF1ZXN0KG5wY3NfcGluLCBzcGktPmRldi5idXNfaWQpOwotCQlpZiAocmV0KQorCQlpZiAocmV0KSB7CisJCQlrZnJlZShhc2QpOwogCQkJcmV0dXJuIHJldDsKLQkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gKHZvaWQgKilucGNzX3BpbjsKKwkJfQorCisJCWFzZC0+bnBjc19waW4gPSBucGNzX3BpbjsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gYXNkOwogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobnBjc19waW4sICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nCQlmbGFnczsKQEAgLTYwNSwxMSArNjQ2LDE0IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CiAJfQogCisJYXNkLT5jc3IgPSBjc3I7CisKIAlkZXZfZGJnKCZzcGktPmRldiwKIAkJInNldHVwOiAlbHUgSHogYnB3ICV1IG1vZGUgMHgleCAtPiBjc3IlZCAlMDh4XG4iLAogCQlidXNfaHogLyBzY2JyLCBiaXRzLCBzcGktPm1vZGUsIHNwaS0+Y2hpcF9zZWxlY3QsIGNzcik7CiAKLQlzcGlfd3JpdGVsKGFzLCBDU1IwICsgNCAqIHNwaS0+Y2hpcF9zZWxlY3QsIGNzcik7CisJaWYgKCFhdG1lbF9zcGlfaXNfdjIoKSkKKwkJc3BpX3dyaXRlbChhcywgQ1NSMCArIDQgKiBzcGktPmNoaXBfc2VsZWN0LCBjc3IpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02ODQsMTAgKzcyOCwxMSBAQAogc3RhdGljIHZvaWQgYXRtZWxfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlCSphc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQJCWdwaW8gPSAodW5zaWduZWQpIHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCi0JaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpCisJaWYgKCFhc2QpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhcy0+bG9jaywgZmxhZ3MpOwpAQCAtNjk3LDcgKzc0Miw5IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CiAKKwlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBOVUxMOwogCWdwaW9fZnJlZShncGlvKTsKKwlrZnJlZShhc2QpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNzU1LDggKzgwMiw2IEBACiAJCWdvdG8gb3V0X2ZyZWVfYnVmZmVyOwogCWFzLT5pcnEgPSBpcnE7CiAJYXMtPmNsayA9IGNsazsKLQlpZiAoIWNwdV9pc19hdDkxcm05MjAwKCkpCi0JCWFzLT5uZXdfMSA9IDE7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGF0bWVsX3NwaV9pbnRlcnJ1cHQsIDAsCiAJCQlwZGV2LT5kZXYuYnVzX2lkLCBtYXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCmluZGV4IDYxMDRmNDYuLmQwZmM0Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKQEAgLTE1NjEsMTEgKzE1NjEsMTIgQEAKIHN0YXRpYyBpbnQgcHhhMnh4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHNzcF9kZXZpY2UgKnNzcCA9IGRydl9kYXRhLT5zc3A7CisJc3RydWN0IHNzcF9kZXZpY2UgKnNzcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCWlmICghZHJ2X2RhdGEpCiAJCXJldHVybiAwOworCXNzcCA9IGRydl9kYXRhLT5zc3A7CiAKIAkvKiBSZW1vdmUgdGhlIHF1ZXVlICovCiAJc3RhdHVzID0gZGVzdHJveV9xdWV1ZShkcnZfZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS5jCmluZGV4IDM3MzRkYzkuLjY0MzkwOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS5jCkBAIC00Nyw3ICs0Nyw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIEJVU19JRF9TSVpFICsgMSwgIiVzXG4iLCBzcGktPm1vZGFsaWFzKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3BpLT5tb2RhbGlhcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzcGlfZGV2X2F0dHJzW10gPSB7CkBAIC02Myw3ICs2Myw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAotCXJldHVybiBzdHJuY21wKHNwaS0+bW9kYWxpYXMsIGRydi0+bmFtZSwgQlVTX0lEX1NJWkUpID09IDA7CisJcmV0dXJuIHN0cmNtcChzcGktPm1vZGFsaWFzLCBkcnYtPm5hbWUpID09IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3BpX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKQEAgLTI0Myw4ICsyNDMsNyBAQAogCX0KIAogCS8qIFNldCB0aGUgYnVzIElEIHN0cmluZyAqLwotCXNucHJpbnRmKHNwaS0+ZGV2LmJ1c19pZCwgc2l6ZW9mIHNwaS0+ZGV2LmJ1c19pZCwKLQkJCSIlcy4ldSIsIHNwaS0+bWFzdGVyLT5kZXYuYnVzX2lkLAorCWRldl9zZXRfbmFtZSgmc3BpLT5kZXYsICIlcy4ldSIsIGRldl9uYW1lKCZzcGktPm1hc3Rlci0+ZGV2KSwKIAkJCXNwaS0+Y2hpcF9zZWxlY3QpOwogCiAKQEAgLTI1NCw3ICsyNTMsNyBAQAogCSAqLwogCW11dGV4X2xvY2soJnNwaV9hZGRfbG9jayk7CiAKLQlpZiAoYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnNwaV9idXNfdHlwZSwgTlVMTCwgc3BpLT5kZXYuYnVzX2lkKQorCWlmIChidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmc3BpX2J1c190eXBlLCBOVUxMLCBkZXZfbmFtZSgmc3BpLT5kZXYpKQogCQkJIT0gTlVMTCkgewogCQlkZXZfZXJyKGRldiwgImNoaXBzZWxlY3QgJWQgYWxyZWFkeSBpbiB1c2VcbiIsCiAJCQkJc3BpLT5jaGlwX3NlbGVjdCk7CkBAIC0yNjksNyArMjY4LDcgQEAKIAlzdGF0dXMgPSBzcGktPm1hc3Rlci0+c2V0dXAoc3BpKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZXJyKGRldiwgImNhbid0ICVzICVzLCBzdGF0dXMgJWRcbiIsCi0JCQkJInNldHVwIiwgc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCSJzZXR1cCIsIGRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTI3Nyw5ICsyNzYsOSBAQAogCXN0YXR1cyA9IGRldmljZV9hZGQoJnNwaS0+ZGV2KTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZGV2X2VycihkZXYsICJjYW4ndCAlcyAlcywgc3RhdHVzICVkXG4iLAotCQkJCSJhZGQiLCBzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCQkJImFkZCIsIGRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJZWxzZQotCQlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgY2hpbGQgJXNcbiIsIHNwaS0+ZGV2LmJ1c19pZCk7CisJCWRldl9kYmcoZGV2LCAicmVnaXN0ZXJlZCBjaGlsZCAlc1xuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CiAKIGRvbmU6CiAJbXV0ZXhfdW5sb2NrKCZzcGlfYWRkX2xvY2spOwpAQCAtNTA0LDEyICs1MDMsMTEgQEAKIAkvKiByZWdpc3RlciB0aGUgZGV2aWNlLCB0aGVuIHVzZXJzcGFjZSB3aWxsIHNlZSBpdC4KIAkgKiByZWdpc3RyYXRpb24gZmFpbHMgaWYgdGhlIGJ1cyBJRCBpcyBpbiB1c2UuCiAJICovCi0Jc25wcmludGYobWFzdGVyLT5kZXYuYnVzX2lkLCBzaXplb2YgbWFzdGVyLT5kZXYuYnVzX2lkLAotCQkic3BpJXUiLCBtYXN0ZXItPmJ1c19udW0pOworCWRldl9zZXRfbmFtZSgmbWFzdGVyLT5kZXYsICJzcGkldSIsIG1hc3Rlci0+YnVzX251bSk7CiAJc3RhdHVzID0gZGV2aWNlX2FkZCgmbWFzdGVyLT5kZXYpOwogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIGRvbmU7Ci0JZGV2X2RiZyhkZXYsICJyZWdpc3RlcmVkIG1hc3RlciAlcyVzXG4iLCBtYXN0ZXItPmRldi5idXNfaWQsCisJZGV2X2RiZyhkZXYsICJyZWdpc3RlcmVkIG1hc3RlciAlcyVzXG4iLCBkZXZfbmFtZSgmbWFzdGVyLT5kZXYpLAogCQkJZHluYW1pYyA/ICIgKGR5bmFtaWMpIiA6ICIiKTsKIAogCS8qIHBvcHVsYXRlIGNoaWxkcmVuIGZyb20gYW55IHNwaSBkZXZpY2UgdGFibGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwppbmRleCA5NmNjMzllLi44NWU2MWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCS8qIHRoaXMgdGFzayBpcyB0aGUgb25seSB0aGluZyB0byB0b3VjaCB0aGUgU1BJIGJpdHMgKi8KIAliaXRiYW5nLT5idXN5ID0gMDsKIAliaXRiYW5nLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKLQkJCWJpdGJhbmctPm1hc3Rlci0+ZGV2LnBhcmVudC0+YnVzX2lkKTsKKwkJCWRldl9uYW1lKGJpdGJhbmctPm1hc3Rlci0+ZGV2LnBhcmVudCkpOwogCWlmIChiaXRiYW5nLT53b3JrcXVldWUgPT0gTlVMTCkgewogCQlzdGF0dXMgPSAtRUJVU1k7CiAJCWdvdG8gZXJyMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYyBiL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYwppbmRleCAwZWUyYjIwLi5jMjE4NDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCkBAIC0yODcsNyArMjg3LDcgQEAKIAlwcC0+ZGF0YWZsYXNoID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm9bMF0pOwogCWlmIChwcC0+ZGF0YWZsYXNoKQogCQlwcl9kZWJ1ZygiJXM6IGRhdGFmbGFzaCBhdCAlc1xuIiwgcC0+bmFtZSwKLQkJCQlwcC0+ZGF0YWZsYXNoLT5kZXYuYnVzX2lkKTsKKwkJCQlkZXZfbmFtZSgmcHAtPmRhdGFmbGFzaC0+ZGV2KSk7CiAKIAkvLyBkZXZfaW5mbyhfd2hhdD9fLCAuLi4pCiAJcHJfaW5mbygiJXM6IEFWUiBCdXR0ZXJmbHlcbiIsIHAtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2dwaW8uYyBiL2RyaXZlcnMvc3BpL3NwaV9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2OThjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9ncGlvLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBzcGlfZ3Bpby5jIC0gU1BJIG1hc3RlciBkcml2ZXIgdXNpbmcgZ2VuZXJpYyBiaXRiYW5nZWQgR1BJTworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwyMDA4IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfZ3Bpby5oPgorCisKKy8qCisgKiBUaGlzIGJpdGJhbmdpbmcgU1BJIG1hc3RlciBkcml2ZXIgc2hvdWxkIGhlbHAgbWFrZSBzeXN0ZW1zIHVzYWJsZQorICogd2hlbiBhIG5hdGl2ZSBoYXJkd2FyZSBTUEkgZW5naW5lIGlzIG5vdCBhdmFpbGFibGUsIHBlcmhhcHMgYmVjYXVzZQorICogaXRzIGRyaXZlciBpc24ndCB5ZXQgd29ya2luZyBvciBiZWNhdXNlIHRoZSBJL08gcGlucyBpdCByZXF1aXJlcworICogYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzLgorICoKKyAqIHBsYXRmb3JtX2RldmljZS0+ZHJpdmVyX2RhdGEgLi4uIHBvaW50cyB0byBzcGlfZ3BpbworICoKKyAqIHNwaS0+Y29udHJvbGxlcl9zdGF0ZSAuLi4gcmVzZXJ2ZWQgZm9yIGJpdGJhbmcgZnJhbWV3b3JrIGNvZGUKKyAqIHNwaS0+Y29udHJvbGxlcl9kYXRhIC4uLiBob2xkcyBjaGlwc2VsZWN0IEdQSU8KKyAqCisgKiBzcGktPm1hc3Rlci0+ZGV2LmRyaXZlcl9kYXRhIC4uLiBwb2ludHMgdG8gc3BpX2dwaW8tPmJpdGJhbmcKKyAqLworCitzdHJ1Y3Qgc3BpX2dwaW8geworCXN0cnVjdCBzcGlfYml0YmFuZwkJYml0YmFuZzsKKwlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQlwZGF0YTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqcGRldjsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBCZWNhdXNlIHRoZSBvdmVyaGVhZCBvZiBnb2luZyB0aHJvdWdoIGZvdXIgR1BJTyBwcm9jZWR1cmUgY2FsbHMKKyAqIHBlciB0cmFuc2ZlcnJlZCBiaXQgY2FuIG1ha2UgcGVyZm9ybWFuY2UgYSBwcm9ibGVtLCB0aGlzIGNvZGUKKyAqIGlzIHNldCB1cCBzbyB0aGF0IHlvdSBjYW4gdXNlIGl0IGluIGVpdGhlciBvZiB0d28gd2F5czoKKyAqCisgKiAgIC0gVGhlIHNsb3cgZ2VuZXJpYyB3YXk6ICBzZXQgdXAgcGxhdGZvcm1fZGF0YSB0byBob2xkIHRoZSBHUElPCisgKiAgICAgbnVtYmVycyB1c2VkIGZvciBNSVNPL01PU0kvU0NLLCBhbmQgaXNzdWUgcHJvY2VkdXJlIGNhbGxzIGZvcgorICogICAgIGVhY2ggb2YgdGhlbS4gIFRoaXMgZHJpdmVyIGNhbiBoYW5kbGUgc2V2ZXJhbCBzdWNoIGJ1c3Nlcy4KKyAqCisgKiAgIC0gVGhlIHF1aWNrZXIgaW5saW5lZCB3YXk6ICBvbmx5IGhlbHBzIHdpdGggcGxhdGZvcm0gR1BJTyBjb2RlCisgKiAgICAgdGhhdCBpbmxpbmVzIG9wZXJhdGlvbnMgZm9yIGNvbnN0YW50IEdQSU9zLiAgVGhpcyBjYW4gZ2l2ZQorICogICAgIHlvdSB0aWdodCAoZmFzdCEpIGlubmVyIGxvb3BzLCBidXQgZWFjaCBzdWNoIGJ1cyBuZWVkcyBhCisgKiAgICAgbmV3IGRyaXZlci4gIFlvdSdsbCBkZWZpbmUgYSBuZXcgQyBmaWxlLCB3aXRoIE1ha2VmaWxlIGFuZAorICogICAgIEtjb25maWcgc3VwcG9ydDsgdGhlIEMgY29kZSBjYW4gYmUgYSB0b3RhbCBvZiBzaXggbGluZXM6CisgKgorICoJCSNkZWZpbmUgRFJJVkVSX05BTUUJIm15Ym9hcmRfc3BpMiIKKyAqCQkjZGVmaW5lCVNQSV9NSVNPX0dQSU8JMTE5CisgKgkJI2RlZmluZQlTUElfTU9TSV9HUElPCTEyMAorICoJCSNkZWZpbmUJU1BJX1NDS19HUElPCTEyMQorICoJCSNkZWZpbmUJU1BJX05fQ0hJUFNFTAk0CisgKgkJI2luY2x1ZGUgInNwaV9ncGlvLmMiCisgKi8KKworI2lmbmRlZiBEUklWRVJfTkFNRQorI2RlZmluZSBEUklWRVJfTkFNRQkic3BpX2dwaW8iCisKKyNkZWZpbmUgR0VORVJJQ19CSVRCQU5HCS8qIHZzIHRpZ2h0IGlubGluZXMgKi8KKworLyogYWxsIGZ1bmN0aW9ucyByZWZlcmVuY2luZyB0aGVzZSBzeW1ib2xzIG11c3QgZGVmaW5lIHBkYXRhICovCisjZGVmaW5lIFNQSV9NSVNPX0dQSU8JKChwZGF0YSktPm1pc28pCisjZGVmaW5lIFNQSV9NT1NJX0dQSU8JKChwZGF0YSktPm1vc2kpCisjZGVmaW5lIFNQSV9TQ0tfR1BJTwkoKHBkYXRhKS0+c2NrKQorCisjZGVmaW5lIFNQSV9OX0NISVBTRUwJKChwZGF0YSktPm51bV9jaGlwc2VsZWN0KQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSAqIF9fcHVyZQorc3BpX3RvX3BkYXRhKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJY29uc3Qgc3RydWN0IHNwaV9iaXRiYW5nCSpiYW5nOworCWNvbnN0IHN0cnVjdCBzcGlfZ3BpbwkJKnNwaV9ncGlvOworCisJYmFuZyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXNwaV9ncGlvID0gY29udGFpbmVyX29mKGJhbmcsIHN0cnVjdCBzcGlfZ3BpbywgYml0YmFuZyk7CisJcmV0dXJuICZzcGlfZ3Bpby0+cGRhdGE7Cit9CisKKy8qIHRoaXMgaXMgI2RlZmluZWQgdG8gYXZvaWQgdW51c2VkLXZhcmlhYmxlIHdhcm5pbmdzIHdoZW4gaW5saW5pbmcgKi8KKyNkZWZpbmUgcGRhdGEJCXNwaV90b19wZGF0YShzcGkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRzY2soY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCWdwaW9fc2V0X3ZhbHVlKFNQSV9TQ0tfR1BJTywgaXNfb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0bW9zaShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCit7CisJZ3Bpb19zZXRfdmFsdWUoU1BJX01PU0lfR1BJTywgaXNfb24pOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRtaXNvKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKFNQSV9NSVNPX0dQSU8pOworfQorCisjdW5kZWYgcGRhdGEKKworLyoKKyAqIE5PVEU6ICB0aGlzIGNsb2NrcyAiYXMgZmFzdCBhcyB3ZSBjYW4iLiAgSXQgInNob3VsZCIgYmUgYSBmdW5jdGlvbiBvZiB0aGUKKyAqIHJlcXVlc3RlZCBkZXZpY2UgY2xvY2suICBTb2Z0d2FyZSBvdmVyaGVhZCBtZWFucyB3ZSB1c3VhbGx5IGhhdmUgdHJvdWJsZQorICogcmVhY2hpbmcgZXZlbiBvbmUgTWJpdC9zZWMgKGV4Y2VwdCB3aGVuIHdlIGNhbiBpbmxpbmUgYml0b3BzKSwgc28gZm9yIG5vdworICogd2UnbGwganVzdCBhc3N1bWUgd2UgbmV2ZXIgbmVlZCBhZGRpdGlvbmFsIHBlci1iaXQgc2xvd2Rvd25zLgorICovCisjZGVmaW5lIHNwaWRlbGF5KG5zZWNzKQlkbyB7fSB3aGlsZSAoMCkKKworI2RlZmluZQlFWFBBTkRfQklUQkFOR19UWFJYCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgY2FuIGxldmVyYWdlIGlubGluZSBleHBhbnNpb24gb2YgR1BJTyBjYWxscyB0byBzaHJpbmsKKyAqIGNvc3RzIGZvciBhIHR4cnggYml0LCBvZnRlbiBieSBmYWN0b3JzIG9mIGFyb3VuZCB0ZW4gKGJ5IGluc3RydWN0aW9uCisgKiBjb3VudCkuICBUaGF0IGlzIHBhcnRpY3VsYXJseSB2aXNpYmxlIGZvciBsYXJnZXIgd29yZCBzaXplcywgYnV0IGhlbHBzCisgKiBldmVuIHdpdGggZGVmYXVsdCA4LWJpdCB3b3Jkcy4KKyAqCisgKiBSRVZJU0lUIG92ZXJoZWFkcyBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBmb3IgZWFjaCB3b3JkIGFsc28gaGF2ZQorICogc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgY29zdHMuICBIYXZpbmcgdHhyeF9idWZzKCkgY2FsbHMgdGhhdCBpbmxpbmUKKyAqIHRoZSB0eHJ4X3dvcmQoKSBsb2dpYyB3b3VsZCBoZWxwIHBlcmZvcm1hbmNlLCBlLmcuIG9uIGxhcmdlciBibG9ja3MKKyAqIHVzZWQgd2l0aCBmbGFzaCBzdG9yYWdlIG9yIE1NQy9TRC4gIFRoZXJlIHNob3VsZCBhbHNvIGJlIHdheXMgdG8gbWFrZQorICogR0NDIGJlIGxlc3Mgc3R1cGlkIGFib3V0IHJlbG9hZGluZyByZWdpc3RlcnMgaW5zaWRlIHRoZSBJL08gbG9vcHMsCisgKiBldmVuIHdpdGhvdXQgaW5saW5lZCBHUElPIGNhbGxzOyBfX2F0dHJpYnV0ZV9fKChob3QpKSBvbiBHQ0MgNC4zPworICovCisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIHdvcmQsIGJpdHMpOworfQorCitzdGF0aWMgdTMyIHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAwLCB3b3JkLCBiaXRzKTsKK30KKworc3RhdGljIHUzMiBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMSwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDEsIHdvcmQsIGJpdHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzcGlfZ3Bpb19jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19hY3RpdmUpCit7CisJdW5zaWduZWQgbG9uZyBjcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKworCS8qIHNldCBpbml0aWFsIGNsb2NrIHBvbGFyaXR5ICovCisJaWYgKGlzX2FjdGl2ZSkKKwkJc2V0c2NrKHNwaSwgc3BpLT5tb2RlICYgU1BJX0NQT0wpOworCisJLyogU1BJIGlzIG5vcm1hbGx5IGFjdGl2ZS1sb3cgKi8KKwlncGlvX3NldF92YWx1ZShjcywgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSA/IGlzX2FjdGl2ZSA6ICFpc19hY3RpdmUpOworfQorCitzdGF0aWMgaW50IHNwaV9ncGlvX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdW5zaWduZWQgbG9uZwljcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwlpbnQJCXN0YXR1cyA9IDA7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID4gMzIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpIHsKKwkJc3RhdHVzID0gZ3Bpb19yZXF1ZXN0KGNzLCBzcGktPmRldi5idXNfaWQpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc3RhdHVzID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNzLCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCk7CisJfQorCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBzcGlfYml0YmFuZ19zZXR1cChzcGkpOworCWlmIChzdGF0dXMpIHsKKwkJaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpCisJCQlncGlvX2ZyZWUoY3MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzcGlfZ3Bpb19jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdW5zaWduZWQgbG9uZwljcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKworCWdwaW9fZnJlZShjcyk7CisJc3BpX2JpdGJhbmdfY2xlYW51cChzcGkpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzcGlfZ3Bpb19hbGxvYyh1bnNpZ25lZCBwaW4sIGNvbnN0IGNoYXIgKmxhYmVsLCBib29sIGlzX2luKQoreworCWludCB2YWx1ZTsKKworCXZhbHVlID0gZ3Bpb19yZXF1ZXN0KHBpbiwgbGFiZWwpOworCWlmICh2YWx1ZSA9PSAwKSB7CisJCWlmIChpc19pbikKKwkJCXZhbHVlID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQocGluKTsKKwkJZWxzZQorCQkJdmFsdWUgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluLCAwKTsKKwl9CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IF9faW5pdAorc3BpX2dwaW9fcmVxdWVzdChzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEsIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCWludCB2YWx1ZTsKKworCS8qIE5PVEU6ICBTUElfKl9HUElPIHN5bWJvbHMgbWF5IHJlZmVyZW5jZSAicGRhdGEiICovCisKKwl2YWx1ZSA9IHNwaV9ncGlvX2FsbG9jKFNQSV9NT1NJX0dQSU8sIGxhYmVsLCBmYWxzZSk7CisJaWYgKHZhbHVlKQorCQlnb3RvIGRvbmU7CisKKwl2YWx1ZSA9IHNwaV9ncGlvX2FsbG9jKFNQSV9NSVNPX0dQSU8sIGxhYmVsLCB0cnVlKTsKKwlpZiAodmFsdWUpCisJCWdvdG8gZnJlZV9tb3NpOworCisJdmFsdWUgPSBzcGlfZ3Bpb19hbGxvYyhTUElfU0NLX0dQSU8sIGxhYmVsLCBmYWxzZSk7CisJaWYgKHZhbHVlKQorCQlnb3RvIGZyZWVfbWlzbzsKKworCWdvdG8gZG9uZTsKKworZnJlZV9taXNvOgorCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKK2ZyZWVfbW9zaToKKwlncGlvX2ZyZWUoU1BJX01PU0lfR1BJTyk7Citkb25lOgorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQJCQkJc3RhdHVzOworCXN0cnVjdCBzcGlfbWFzdGVyCQkqbWFzdGVyOworCXN0cnVjdCBzcGlfZ3BpbwkJCSpzcGlfZ3BpbzsKKwlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQkqcGRhdGE7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworI2lmZGVmIEdFTkVSSUNfQklUQkFORworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5udW1fY2hpcHNlbGVjdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYKKworCXN0YXR1cyA9IHNwaV9ncGlvX3JlcXVlc3QocGRhdGEsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICpzcGlfZ3Bpbyk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBncGlvX2ZyZWU7CisJfQorCXNwaV9ncGlvID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNwaV9ncGlvKTsKKworCXNwaV9ncGlvLT5wZGV2ID0gcGRldjsKKwlpZiAocGRhdGEpCisJCXNwaV9ncGlvLT5wZGF0YSA9ICpwZGF0YTsKKworCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBTUElfTl9DSElQU0VMOworCW1hc3Rlci0+c2V0dXAgPSBzcGlfZ3Bpb19zZXR1cDsKKwltYXN0ZXItPmNsZWFudXAgPSBzcGlfZ3Bpb19jbGVhbnVwOworCisJc3BpX2dwaW8tPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKwlzcGlfZ3Bpby0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gc3BpX2dwaW9fY2hpcHNlbGVjdDsKKwlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTA7CisJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc3BpX2dwaW9fdHhyeF93b3JkX21vZGUxOworCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMjsKKwlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfM10gPSBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTM7CisJc3BpX2dwaW8tPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcjsKKwlzcGlfZ3Bpby0+Yml0YmFuZy5mbGFncyA9IFNQSV9DU19ISUdIOworCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnNwaV9ncGlvLT5iaXRiYW5nKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlzcGlfbWFzdGVyX3B1dChzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIpOworZ3Bpb19mcmVlOgorCQlncGlvX2ZyZWUoU1BJX01JU09fR1BJTyk7CisJCWdwaW9fZnJlZShTUElfTU9TSV9HUElPKTsKKwkJZ3Bpb19mcmVlKFNQSV9TQ0tfR1BJTyk7CisJCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2V4aXQgc3BpX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9ncGlvCQkJKnNwaV9ncGlvOworCXN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKwlpbnQJCQkJc3RhdHVzOworCisJc3BpX2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJLyogc3RvcCgpIHVucmVnaXN0ZXJzIGNoaWxkIGRldmljZXMgdG9vICovCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmc3BpX2dwaW8tPmJpdGJhbmcpOworCXNwaV9tYXN0ZXJfcHV0KHNwaV9ncGlvLT5iaXRiYW5nLm1hc3Rlcik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKKwlncGlvX2ZyZWUoU1BJX01PU0lfR1BJTyk7CisJZ3Bpb19mcmVlKFNQSV9TQ0tfR1BJTyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGlfZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlci5uYW1lCT0gRFJJVkVSX05BTUUsCisJLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5yZW1vdmUJCT0gX19leGl0X3Aoc3BpX2dwaW9fcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV9ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzcGlfZ3Bpb19kcml2ZXIsIHNwaV9ncGlvX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KHNwaV9ncGlvX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BpX2dwaW9fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzcGlfZ3Bpb19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc3BpX2dwaW9fZXhpdCk7CisKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgbWFzdGVyIGRyaXZlciB1c2luZyBnZW5lcmljIGJpdGJhbmdlZCBHUElPICIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgQnJvd25lbGwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMgYi9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jCmluZGV4IDM5ZDhkOGEuLmFmNjUyNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJcHAtPnNwaWRldl9sbTcwID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm8pOwogCWlmIChwcC0+c3BpZGV2X2xtNzApCiAJCWRldl9kYmcoJnBwLT5zcGlkZXZfbG03MC0+ZGV2LCAic3BpZGV2X2xtNzAgYXQgJXNcbiIsCi0JCQkJcHAtPnNwaWRldl9sbTcwLT5kZXYuYnVzX2lkKTsKKwkJCQlkZXZfbmFtZSgmcHAtPnNwaWRldl9sbTcwLT5kZXYpKTsKIAllbHNlIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNwaV9uZXdfZGV2aWNlIGZhaWxlZFxuIiwgRFJWTkFNRSk7CiAJCXN0YXR1cyA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwppbmRleCAyNTZkMTgzLi5iM2ViYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CkBAIC0yNyw3ICsyOCw2IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLmg+CiAKQEAgLTY2LDcgKzY2LDcgQEAKIAogc3RhdGljIHZvaWQgczNjMjR4eF9zcGlfZ3Bpb2NzKHN0cnVjdCBzM2MyNDEwX3NwaV9pbmZvICpzcGksIGludCBjcywgaW50IHBvbCkKIHsKLQlzM2MyNDEwX2dwaW9fc2V0cGluKHNwaS0+cGluX2NzLCBwb2wpOworCWdwaW9fc2V0X3ZhbHVlKHNwaS0+cGluX2NzLCBwb2wpOwogfQogCiBzdGF0aWMgdm9pZCBzM2MyNHh4X3NwaV9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKQEAgLTI0OCw4ICsyNDgsMTMgQEAKIAl3cml0ZWIoU1BQSU5fREVGQVVMVCwgaHctPnJlZ3MgKyBTM0MyNDEwX1NQUElOKTsKIAl3cml0ZWIoU1BDT05fREVGQVVMVCwgaHctPnJlZ3MgKyBTM0MyNDEwX1NQQ09OKTsKIAotCWlmIChody0+cGRhdGEgJiYgaHctPnBkYXRhLT5ncGlvX3NldHVwKQotCQlody0+cGRhdGEtPmdwaW9fc2V0dXAoaHctPnBkYXRhLCAxKTsKKwlpZiAoaHctPnBkYXRhKSB7CisJCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChody0+cGRhdGEtPnBpbl9jcywgMSk7CisKKwkJaWYgKGh3LT5wZGF0YS0+Z3Bpb19zZXR1cCkKKwkJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDEpOworCX0KIH0KIAogc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM0MywxOCArMzQ4LDI3IEBACiAJCWdvdG8gZXJyX25vX2NsazsKIAl9CiAKLQlzM2MyNHh4X3NwaV9pbml0aWFsc2V0dXAoaHcpOwotCiAJLyogc2V0dXAgYW55IGdwaW8gd2UgY2FuICovCiAKIAlpZiAoIXBkYXRhLT5zZXRfY3MpIHsKLQkJaHctPnNldF9jcyA9IHMzYzI0eHhfc3BpX2dwaW9jczsKKwkJaWYgKHBkYXRhLT5waW5fY3MgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjaGlwc2VsZWN0IHBpblxuIik7CisJCQlnb3RvIGVycl9yZWdpc3RlcjsKKwkJfQogCi0JCXMzYzI0MTBfZ3Bpb19zZXRwaW4ocGRhdGEtPnBpbl9jcywgMSk7Ci0JCXMzYzI0MTBfZ3Bpb19jZmdwaW4ocGRhdGEtPnBpbl9jcywgUzNDMjQxMF9HUElPX09VVFBVVCk7CisJCWVyciA9IGdwaW9fcmVxdWVzdChwZGF0YS0+cGluX2NzLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgZ3BpbyBmb3IgY3NcbiIpOworCQkJZ290byBlcnJfcmVnaXN0ZXI7CisJCX0KKworCQlody0+c2V0X2NzID0gczNjMjR4eF9zcGlfZ3Bpb2NzOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPnBpbl9jcywgMSk7CiAJfSBlbHNlCiAJCWh3LT5zZXRfY3MgPSBwZGF0YS0+c2V0X2NzOwogCisJczNjMjR4eF9zcGlfaW5pdGlhbHNldHVwKGh3KTsKKwogCS8qIHJlZ2lzdGVyIG91ciBzcGkgY29udHJvbGxlciAqLwogCiAJZXJyID0gc3BpX2JpdGJhbmdfc3RhcnQoJmh3LT5iaXRiYW5nKTsKQEAgLTM2Niw2ICszODAsOSBAQAogCXJldHVybiAwOwogCiAgZXJyX3JlZ2lzdGVyOgorCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKKwkJZ3Bpb19mcmVlKHBkYXRhLT5waW5fY3MpOworCiAJY2xrX2Rpc2FibGUoaHctPmNsayk7CiAJY2xrX3B1dChody0+Y2xrKTsKIApAQCAtNDAxLDYgKzQxOCw5IEBACiAJZnJlZV9pcnEoaHctPmlycSwgaHcpOwogCWlvdW5tYXAoaHctPnJlZ3MpOwogCisJaWYgKGh3LT5zZXRfY3MgPT0gczNjMjR4eF9zcGlfZ3Bpb2NzKQorCQlncGlvX2ZyZWUoaHctPnBkYXRhLT5waW5fY3MpOworCiAJcmVsZWFzZV9yZXNvdXJjZShody0+aW9hcmVhKTsKIAlrZnJlZShody0+aW9hcmVhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCA1ZDQ1N2M5Li5jZTZiYWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtNDksNiArNDksOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZTQwMDAvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VzYmlwL0tjb25maWciCkBAIC02Myw1ICs2NSwzNSBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9wb2NoL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FnbngvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvb3R1cy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcGFuZWwvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL21pbWlvL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2VwbC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWciCisKIGVuZGlmICMgIVNUQUdJTkdfRVhDTFVERV9CVUlMRAogZW5kaWYgIyBTVEFHSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggNzFjNGQ1My4uOWRkY2MyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIG9iai0kKENPTkZJR19TTElDT1NTKQkJKz0gc2xpY29zcy8KIG9iai0kKENPTkZJR19TWEcpCQkrPSBzeGcvCiBvYmotJChDT05GSUdfTUU0MDAwKQkJKz0gbWU0MDAwLworb2JqLSQoQ09ORklHX01FSUxIQVVTKQkJKz0gbWVpbGhhdXMvCiBvYmotJChDT05GSUdfVklERU9fR083MDA3KQkrPSBnbzcwMDcvCiBvYmotJChDT05GSUdfVVNCX0lQX0NPTU1PTikJKz0gdXNiaXAvCiBvYmotJChDT05GSUdfVzM1VU5EKQkJKz0gd2luYm9uZC8KQEAgLTE0LDMgKzE1LDE4IEBACiBvYmotJChDT05GSUdfRUNITykJCSs9IGVjaG8vCiBvYmotJChDT05GSUdfVVNCX0FUTUVMKQkJKz0gYXQ3Nl91c2IvCiBvYmotJChDT05GSUdfUE9DSCkJCSs9IHBvY2gvCitvYmotJChDT05GSUdfQUdOWCkJCSs9IGFnbngvCitvYmotJChDT05GSUdfT1RVUykJCSs9IG90dXMvCitvYmotJChDT05GSUdfUlQyODYwKQkJKz0gcnQyODYwLworb2JqLSQoQ09ORklHX1JUMjg3MCkJCSs9IHJ0Mjg3MC8KK29iai0kKENPTkZJR19CRU5FVCkJCSs9IGJlbmV0Lworb2JqLSQoQ09ORklHX0NPTUVESSkJCSs9IGNvbWVkaS8KK29iai0kKENPTkZJR19BU1VTX09MRUQpCQkrPSBhc3VzX29sZWQvCitvYmotJChDT05GSUdfUEFORUwpCQkrPSBwYW5lbC8KK29iai0kKENPTkZJR19BTFRFUkFfUENJRV9DSERNQSkJKz0gYWx0cGNpZWNoZG1hLworb2JqLSQoQ09ORklHX1JUTDgxODdTRSkJCSs9IHJ0bDgxODdzZS8KK29iai0kKENPTkZJR19VU0JfUlNQSSkJCSs9IHJzcGl1c2IvCitvYmotJChDT05GSUdfSU5QVVRfTUlNSU8pCSs9IG1pbWlvLworb2JqLSQoQ09ORklHX1RSQU5aUE9SVCkJCSs9IGZyb250aWVyLworb2JqLSQoQ09ORklHX0VQTCkJCSs9IGVwbC8KK29iai0kKENPTkZJR19BTkRST0lEKQkJKz0gYW5kcm9pZC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDM1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnCkBAIC0wLDAgKzEsNSBAQAorY29uZmlnIEFHTlgKKwl0cmlzdGF0ZSAiV2lyZWxlc3MgQWlyZ28gQUdOWCBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0xBTl84MDIxMSAmJiBNQUM4MDIxMQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgQWlyZ28gQUdOWDAwIHdpcmVsZXNzIGNoaXAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTY1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK29iai0kKENPTkZJR19BR05YKQkrPSBhZ254Lm8KKworYWdueC1vYmpzIDo9CXJmLm8JXAorCQlwY2kubwlcCisJCXhtaXQubwlcCisJCXRhYmxlLm8JXAorCQlzdGEubwlcCisJCXBoeS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJlYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvVE9ETwpAQCAtMCwwICsxLDIyIEBACisyMDA4IDcvMTgKKworVGhlIFJYIGhhcyBjYW4ndCByZWNlaXZlIE9GRE0gcGFja2V0IGNvcnJlY3RseSwKK0d1ZXNzIGl0IG5lZWQgYmUgZG8gUlggY2FsaWJyYXRlLgorCisKK2JlZm9yZSAyMDA4IDMvMQorCisxOiBUaGUgUlggZ2V0IHRvbyBtdWNoICJDUkMgZmFpbGVkIiBwYWtldHMsIGl0IG1ha2UgdGhlIGNhcmQgd29yayB2ZXJ5IHVuc3RhYmxlLAorMjogQWZ0ZXIgcnVubmluZyBhIHdoaWxlLCB0aGUgY2FyZCB3aWxsIGdldCBpbmZpbml0eSAiUlggRnJhbWUiIGFuZCAiRXJyb3IiCitpbnRlcnJ1cHQsIG5vdCBrbm93IHRoZSByb290IHJlYXNvbiBzbyBmYXIsIHRyeSB0byBmaXggaXQKKzM6IFVzaW5nIHR3byB0eCBxdWV1ZSB0eGQgYW5kIHR4bSBidXQgbm90IG9ubHkgdHhtLgorNDogU2V0IHRoZSBoZHIgY29ycmVjdGx5LgorNTogVHJ5IHRvIGRvIHJlY2FsaWJyYXRlIGNvcnJldnRseQorNjogVG8gc3VwcG9ydCBHIG1vZGUgaW4gZnV0dXJlCis3OiBGaXggdGhlIG1hYyBhZGRyZXNzIGNhbid0IGJlIHJlYWRlZCBhbmQgc2V0IGNvcnJlY3RseSBpbiBCRSBtYWNoaW5lLgorODogRml4IGluY2x1ZGUgYW5kIGV4Y2x1ZGUgRkNTIGluIHByb21pc291cyBtb2RlIGFuZCBtYW5hZ2UgbW9kZQorOTogVXNpbmcgc3RhX25vdGlmeSB0byBub3RpY2Ugc3RhIGNoYW5nZQorMTA6IFR1cm4gb24gZnJhbWUgcmVjZXB0aW9uIGF0IHRoZSBlbmQgb2Ygc3RhcnQKKzExOiBHdWVzcyB0aGUgY2FyZCBzdXBwb3J0IEhXX01VTFRJQ0FTVF9GSUxURVIKKzEyOiBUaGUgdHggcHJvY2VzcyBzaG91bGQgYmUgaW1wbG1lbnQgYXRvbWljPworMTM6IFVzaW5nIG1hYzgwMjExIGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIFRYJlJYIExFRC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L2FnbnguaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2FnbnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzViMGRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvYWdueC5oCkBAIC0wLDAgKzEsMTU0IEBACisjaWZuZGVmIEFHTlhfSF8KKyNkZWZpbmUgQUdOWF9IXworCisjaW5jbHVkZSAieG1pdC5oIgorCisjZGVmaW5lIFBGWAkJCQlLQlVJTERfTU9ETkFNRSAiOiAiCisKK3N0YXRpYyBpbmxpbmUgdTMyIGFnbnhfcmVhZDMyKHZvaWQgX19pb21lbSAqbWVtX3JlZ2lvbiwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gaW9yZWFkMzIobWVtX3JlZ2lvbiArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3dyaXRlMzIodm9pZCBfX2lvbWVtICptZW1fcmVnaW9uLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIG1lbV9yZWdpb24gKyBvZmZzZXQpOworfQorCisvKiBzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlIGFnbnhfcmF0ZXNfODAyMTFiW10gPSB7ICovCisvKiAJeyAucmF0ZSA9IDEwLCAqLworLyogCSAgLnZhbCA9IDB4YSwgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDSyB9LCAqLworLyogCXsgLnJhdGUgPSAyMCwgKi8KKy8qIAkgIC52YWwgPSAweDE0LCAqLworLyogCSAgLmh3X3ZhbHVlID0gLTB4MTQsICovCisvKiAJICAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9DQ0tfMiB9LCAqLworLyogCXsgLnJhdGUgPSA1NSwgKi8KKy8qIAkgIC52YWwgPSAweDM3LCAqLworLyogCSAgLnZhbDIgPSAtMHgzNywgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0sICovCisvKiAJeyAucmF0ZSA9IDExMCwgKi8KKy8qIAkgIC52YWwgPSAweDZlLCAqLworLyogCSAgLnZhbDIgPSAtMHg2ZSwgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0gKi8KKy8qIH07ICovCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBhZ254X3JhdGVzXzgwMjExZ1tdID0geworLyogCXsgLmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMSwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwgKi8KKy8qIAl7IC5iaXRyYXRlID0gMjAsIC5od192YWx1ZSA9IDIsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCisvKiAJeyAuYml0cmF0ZSA9IDU1LCAuaHdfdmFsdWUgPSAzLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LCAqLworLyogCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDQsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCisgCXsgLmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMSwgfSwKKyAJeyAuYml0cmF0ZSA9IDIwLCAuaHdfdmFsdWUgPSAyLCB9LAorIAl7IC5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDMsIH0sCisgCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDQsfSwKKworCXsgLmJpdHJhdGUgPSA2MCwgLmh3X3ZhbHVlID0gMHhCLCB9LAorCXsgLmJpdHJhdGUgPSA5MCwgLmh3X3ZhbHVlID0gMHhGLCB9LAorCXsgLmJpdHJhdGUgPSAxMjAsIC5od192YWx1ZSA9IDB4QSB9LAorCXsgLmJpdHJhdGUgPSAxODAsIC5od192YWx1ZSA9IDB4RSwgfSwKKy8vCXsgLmJpdHJhdGUgPSAyNDAsIC5od192YWx1ZSA9IDB4ZCwgfSwKKwl7IC5iaXRyYXRlID0gMzYwLCAuaHdfdmFsdWUgPSAweEQsIH0sCisJeyAuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gMHg4LCB9LAorCXsgLmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDB4QywgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgYWdueF9jaGFubmVsc1tdID0geworCXsgLmNlbnRlcl9mcmVxID0gMjQxMiwgLmh3X3ZhbHVlID0gMSwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTcsIC5od192YWx1ZSA9IDIsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzLCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQyNywgLmh3X3ZhbHVlID0gNCwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MzIsIC5od192YWx1ZSA9IDUsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDM3LCAuaHdfdmFsdWUgPSA2LCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ0MiwgLmh3X3ZhbHVlID0gNywgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NDcsIC5od192YWx1ZSA9IDgsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDUyLCAuaHdfdmFsdWUgPSA5LCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ1NywgLmh3X3ZhbHVlID0gMTAsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDYyLCAuaHdfdmFsdWUgPSAxMSwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1ZSA9IDEyLCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ3MiwgLmh3X3ZhbHVlID0gMTMsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDg0LCAuaHdfdmFsdWUgPSAxNCwgfSwKK307CisKKyNkZWZpbmUgTlVNX0RSSVZFX01PREVTCTIKKy8qIEFnbnggb3BlcmF0ZSBtb2RlICovCitlbnVtIHsKKwlBR05YX01PREVfODAyMTFBLAorCUFHTlhfTU9ERV84MDIxMUFfT09CLAorCUFHTlhfTU9ERV84MDIxMUFfTUlNTywKKwlBR05YX01PREVfODAyMTFCX1NIT1JULAorCUFHTlhfTU9ERV84MDIxMUJfTE9ORywKKwlBR05YX01PREVfODAyMTFHLAorCUFHTlhfTU9ERV84MDIxMUdfT09CLAorCUFHTlhfTU9ERV84MDIxMUdfTUlNTywKK307CisKK2VudW0geworCUFHTlhfVU5JTklULAorCUFHTlhfU1RBUlQsCisJQUdOWF9TVE9QLAorfTsKKworc3RydWN0IGFnbnhfcHJpdiB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IG11dGV4IG11dGV4OworCXVuc2lnbmVkIGludCBpbml0X3N0YXR1czsKKworCXZvaWQgX19pb21lbSAqY3RsOwkvKiBwb2ludGVyIHRvIGJhc2UgcmFtIGFkZHJlc3MgKi8KKwl2b2lkIF9faW9tZW0gKmRhdGE7CS8qIHBvaW50ZXIgdG8gbWVtIHJlZ2lvbiAjMiAqLworCisJc3RydWN0IGFnbnhfcmluZyByeDsKKwlzdHJ1Y3QgYWdueF9yaW5nIHR4bTsKKwlzdHJ1Y3QgYWdueF9yaW5nIHR4ZDsKKworCS8qIE5lZWQgdm9sYXRpbGU/ICovCisJdTMyIGlycV9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBwZXJpb2RpY193b3JrOyAvKiBQZXJpb2RpYyB0YXNrcyBsaWtlIHJlY2FsaWJyYXRlKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyBzdGF0czsKKworLy8gICAgICAgIHVuc2lnbmVkIGludCBwaHltb2RlOworCWludCBtb2RlOworCWludCBjaGFubmVsOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKwl1OCByZXZpZDsKKworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZDsKK307CisKKworI2RlZmluZSBBR05YX0NIQUlOU19NQVgJNgorI2RlZmluZSBBR05YX1BFUklPRElDX0RFTEFZIDYwMDAwIC8qIHVuaXQ6IG1zICovCisjZGVmaW5lIExPQ0FMX1NUQUlECTAJLyogdGhlIHN0YXRpb24gZW50cnkgZm9yIHRoZSBjYXJkIGl0c2VsZiAqLworI2RlZmluZSBCU1NJRF9TVEFJRAkxCS8qIHRoZSBzdGF0aW9uIGVudHJ5IGZvciB0aGUgYnNzc2lkIEFQICovCisjZGVmaW5lCXNwaV9kZWxheSgpCXVkZWxheSg0MCkKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkJdWRlbGF5KDQwKQorI2RlZmluZQlyb3V0aW5nX3RhYmxlX2RlbGF5KCkJdWRlbGF5KDUwKQorCisvKiBQRFUgcG9vbCBNRU0gcmVnaW9uICMyICovCisjZGVmaW5lIEFHTlhfUERVUE9PTAkJMHg0MDAwMAkvKiBQRFUgcG9vbCAqLworI2RlZmluZSBBR05YX1BEVVBPT0xfU0laRQkweDgwMDAJLyogUERVIHBvb2wgc2l6ZSovCisjZGVmaW5lIEFHTlhfUERVX1RYX1dRCQkweDQxMDAwCS8qIFBEVSBsaXN0IFRYIHdvcmtxdWV1ZSAqLworI2RlZmluZSBBR05YX1BEVV9GUkVFCQkweDQxODAwCS8qIEZyZWUgUG9vbCAqLworI2RlZmluZSBQRFVfU0laRQkJMHg4MAkvKiBGcmVlIFBvb2wgbm9kZSBzaXplICovCisjZGVmaW5lIFBEVV9GUkVFX0NOVAkJMHhkMCAvKiBGcmVlIHBvb2wgbm9kZSBjb3VudCAqLworCisKKy8qIFJGIHN0dWZmcyAqLworZXh0ZXJuIHZvaWQgcmZfY2hpcHNfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIHNwaV9yY193cml0ZSh2b2lkIF9faW9tZW0gKm1lbV9yZWdpb24sIHUzMiBjaGlwX2lkcywgdTMyIHN3KTsKK2V4dGVybiB2b2lkIGNhbGlicmF0ZV9vc2NpbGxhdG9yKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworZXh0ZXJuIHZvaWQgZG9fY2FsaWJyYXRpb24oc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitleHRlcm4gdm9pZCBhbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIF9fYW50ZW5uYV9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitleHRlcm4gdm9pZCBwcmludF9vZmZzZXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworZXh0ZXJuIGludCBhZ254X3NldF9jaGFubmVsKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKKworCisjZW5kaWYgLyogQUdOWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlMjVkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2RlYnVnLmgKQEAgLTAsMCArMSw0MTggQEAKKyNpZm5kZWYgQUdOWF9ERUJVR19IXworI2RlZmluZSBBR05YX0RFQlVHX0hfCisKKyNpbmNsdWRlICJhZ254LmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAieG1pdC5oIgorCisjZGVmaW5lIEFHTlhfVFJBQ0UgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiBQRlggImZ1bmN0aW9uOiVzIGxpbmU6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXykKKworI2RlZmluZSBQUklOVEtfTEUxNihwcmVmaXgsIHZhcikJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjR4XG4iLCBsZTE2X3RvX2NwdSh2YXIpKQorI2RlZmluZSBQUklOVEtfTEUzMihwcmVmaXgsIHZhcikJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjh4XG4iLCBsZTMyX3RvX2NwdSh2YXIpKQorI2RlZmluZSBQUklOVEtfVTgocHJlZml4LCB2YXIpIAkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjJ4XG4iLCB2YXIpCisjZGVmaW5lIFBSSU5US19CRTE2KHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuNHhcbiIsIGJlMTZfdG9fY3B1KHZhcikpCisjZGVmaW5lIFBSSU5US19CRTMyKHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuOHhcbiIsIGJlMzJfdG9fY3B1KHZhcikpCisjZGVmaW5lIFBSSU5US19CSVRTKHByZWZpeCwgZmllbGQpICAgIAlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICNmaWVsZCAiOiAweCV4XG4iLCAocmVnICYgZmllbGQpID4+IGZpZWxkIyNfU0hJRlQpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X2J1ZyhjaGFyICpyZWFzb24pCit7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXNcbiIsIHJlYXNvbik7CisJQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X2Rlc2Moc3RydWN0IGFnbnhfZGVzYyAqZGVzYykKK3sKKyAgICAgICAgdTMyIHJlZyA9IGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpOworCisJUFJJTlRLX0JJVFMoREVTQywgUEFDS0VUX0xFTik7CisKKwlpZiAocmVnICYgRklSU1RfRlJBRykgeworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9QQUNLRVRfTUFTSyk7CisJCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1JFU0VSVjIpOworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9US0lQX0VSUk9SKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfVEtJUF9QQUNLRVQpOworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9SRVNFUlYxKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfRlJBR19MRU4pOworCX0gZWxzZSB7CisJCVBSSU5US19CSVRTKERFU0MsIFNVQl9SRVNFUlYyKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgU1VCX1RLSVBfRVJST1IpOworCQlQUklOVEtfQklUUyhERVNDLCBTVUJfVEtJUF9QQUNLRVQpOworCQlQUklOVEtfQklUUyhERVNDLCBTVUJfUkVTRVJWMSk7CisJCVBSSU5US19CSVRTKERFU0MsIFNVQl9GUkFHX0xFTik7CisJfQorCisJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfRlJBRyk7CisJUFJJTlRLX0JJVFMoREVTQywgTEFTVF9GUkFHKTsKKwlQUklOVEtfQklUUyhERVNDLCBPV05FUik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaWVlZTgwMjExYl9waHlfaGRyKF9fYmUzMiBfMTFiMCwgX19iZTMyIF8xMWIxKQoreworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X2hkcihzdHJ1Y3QgYWdueF9oZHIgKmhkcikKK3sKKwl1MzIgcmVnOworCWludCBpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWcwKTsKKwlQUklOVEtfQklUUyhIRFIsIFJUUyk7CisJUFJJTlRLX0JJVFMoSERSLCBNVUxUSUNBU1QpOworCVBSSU5US19CSVRTKEhEUiwgQUNLKTsKKwlQUklOVEtfQklUUyhIRFIsIFRNKTsKKwlQUklOVEtfQklUUyhIRFIsIFJFTEFZKTsKKwlQUklOVEtfQklUUyhIRFIsIFJFVklTRURfRkNTKTsKKwlQUklOVEtfQklUUyhIRFIsIE5FWFRfQlVGRkVSX0FERFIpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWcxKTsKKwlQUklOVEtfQklUUyhIRFIsIE1BQ19IRFJfTEVOKTsKKwlQUklOVEtfQklUUyhIRFIsIERVUkFUSU9OX09WRVJJREUpOworCVBSSU5US19CSVRTKEhEUiwgUEhZX0hEUl9PVkVSSURFKTsKKwlQUklOVEtfQklUUyhIRFIsIENSQ19GQUlMKTsKKwlQUklOVEtfQklUUyhIRFIsIFNFUVVFTkNFX05VTUJFUik7CisJUFJJTlRLX0JJVFMoSERSLCBCVUZGX0hFQURfQUREUik7CisKKwlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzIpOworCVBSSU5US19CSVRTKEhEUiwgUERVX0NPVU5UKTsKKwlQUklOVEtfQklUUyhIRFIsIFdFUF9LRVkpOworCVBSSU5US19CSVRTKEhEUiwgVVNFU19XRVBfS0VZKTsKKwlQUklOVEtfQklUUyhIRFIsIEtFRVBfQUxJVkUpOworCVBSSU5US19CSVRTKEhEUiwgQlVGRl9UQUlMX0FERFIpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWczKTsKKwlQUklOVEtfQklUUyhIRFIsIENUU18xMUcpOworCVBSSU5US19CSVRTKEhEUiwgUlRTXzExRyk7CisJUFJJTlRLX0JJVFMoSERSLCBGUkFHX1NJWkUpOworCVBSSU5US19CSVRTKEhEUiwgUEFZTE9BRF9MRU4pOworCVBSSU5US19CSVRTKEhEUiwgRlJBR19OVU0pOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWc0KTsKKwlQUklOVEtfQklUUyhIRFIsIFJFTEFZX1NUQUlEKTsKKwlQUklOVEtfQklUUyhIRFIsIFNUQVRJT05fSUQpOworCVBSSU5US19CSVRTKEhEUiwgV09SS1FVRVVFX0lEKTsKKworCXJlZyA9IGJlMzJfdG9fY3B1KGhkci0+cmVnNSk7CisJLyogcHJpbnRmIHRoZSByb3V0ZSBmbGFnICovCisJUFJJTlRLX0JJVFMoSERSLCBST1VURV9IT1NUKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0NBUkRfQ1BVKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0VOQ1JZUFRJT04pOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfVFgpOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfUlgxKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX1JYMik7CisJUFJJTlRLX0JJVFMoSERSLCBST1VURV9DT01QUkVTU0lPTik7CisKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+XzExZzApOworCVBSSU5US19CRTMyKEhEUiwgaGRyLT5fMTFnMSk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPl8xMWIwKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+XzExYjEpOworCisJZHVtcF9pZWVlODAyMTFiX3BoeV9oZHIoaGRyLT5fMTFiMCwgaGRyLT5fMTFiMSk7CisKKwkvKiBGaXhtZSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhkci0+bWFjX2hkcik7IGkrKykgeworCQlpZiAoaSA9PSAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJJRUVFODAyMTEgSERSOiAiKTsKKwkJcHJpbnRrKCIlLjJ4ICIsIGhkci0+bWFjX2hkcltpXSk7CisJCWlmIChpICsgMSA9PSBBUlJBWV9TSVpFKGhkci0+bWFjX2hkcikpCisJCQlwcmludGsoIlxuIik7CisJfQorCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ0c19kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPmxhc3RfZHVyYXRpb24pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5zZWNfbGFzdF9kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPm90aGVyX2R1cmF0aW9uKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+dHhfb3RoZXJfZHVyYXRpb24pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5sYXN0XzExZ19sZW4pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5vdGhlcl8xMWdfbGVuKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+bGFzdF8xMWJfbGVuKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+b3RoZXJfMTFiX2xlbik7CisKKwkvKiBGSVhNRSAqLworCXJlZyA9IGJlMTZfdG9fY3B1KGhkci0+cmVnNik7CisJUFJJTlRLX0JJVFMoSERSLCBNQkYpOworCVBSSU5US19CSVRTKEhEUiwgUlNWRDQpOworCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4X2ZyYWdfc3RhdCk7CisKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+dGltZV9zdGFtcCk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPnBoeV9zdGF0c19oaSk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPnBoeV9zdGF0c19sbyk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPm1pY19rZXkwKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+bWljX2tleTEpOworfSAvKiBhZ254X3ByaW50X2hkciAqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X3J4X2hkcihzdHJ1Y3QgYWdueF9oZHIgKmhkcikKK3sKKwlhZ254X3ByaW50X2hkcihoZHIpOworCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4LnJ4X3BhY2tldF9kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4LnJlcGxheV9jbnQpOworCisJUFJJTlRLX1U4KEhEUiwgaGRyLT5yeF9jaGFubmVsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfdHhfaGRyKHN0cnVjdCBhZ254X2hkciAqaGRyKQoreworCWFnbnhfcHJpbnRfaGRyKGhkcik7CisKKwlQUklOVEtfVTgoSERSLCBoZHItPnR4LmxvbmdfcmV0cnlfbGltaXQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHguc2hvcnRfcmV0cnlfbGltaXQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHgubG9uZ19yZXRyeV9jbnQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHguc2hvcnRfcmV0cnlfY250KTsKKworCVBSSU5US19VOChIRFIsIGhkci0+cnhfY2hhbm5lbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWdueF9wcmludF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisKKwlnZXRfc3RhX3Bvd2VyKHByaXYsICZwb3dlciwgc3RhX2lkeCk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdShwb3dlci5yZWcpOworCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgU0lHTkFMKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIFJBVEUpOworCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgVElGUyk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBFRENGKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIENIQU5ORUxfQk9ORCk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBQSFlfTU9ERSk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBQT1dFUl9MRVZFTCk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBOVU1fVFJBTlNNSVRURVJTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCithZ254X3ByaW50X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCkKK3sKKwlzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgdHhfd3E7CisJdTMyIHJlZzsKKworCWdldF9zdGFfdHhfd3EocHJpdiwgJnR4X3dxLCBzdGFfaWR4LCB3cV9pZHgpOworCisJcmVnID0gbGUzMl90b19jcHUodHhfd3EucmVnMCk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBUQUlMX1BPSU5URVIpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9QT0lOVEVSX0xPVyk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWczKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEhFQURfUE9JTlRFUl9ISUdIKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEFDS19QT0lOVEVSX0xPVyk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWcxKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEFDS19QT0lOVEVSX0hJR0gpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9USU1PVVRfVEFJTF9QQUNLX0NOVCk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBBQ0tfVElNT1VUX1RBSUxfUEFDS19DTlQpOworCisJcmVnID0gbGUzMl90b19jcHUodHhfd3EucmVnMik7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBIRUFEX1RJTU9VVF9XSU5fTElNX0JZVEVfQ05UKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEhFQURfVElNT1VUX1dJTl9MSU1fRlJBR19DTlQpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgV09SS19RVUVVRV9BQ0tfVFlQRSk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBXT1JLX1FVRVVFX1ZBTElEKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfc3RhX3RyYWZmaWMoc3RydWN0IGFnbnhfc3RhX3RyYWZmaWMgKnRyYWZmaWMpCit7CisJdTMyIHJlZzsKKworCXJlZyA9IGxlMzJfdG9fY3B1KHRyYWZmaWMtPnJlZzApOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBBQ0tfVElNT1VUX0NOVCk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFRSQUZGSUNfQUNLX1RZUEUpOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBORVdfUEFDS0VUKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgVFJBRkZJQ19WQUxJRCk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFJYX0hEUl9ERVNDX1BPSU5URVIpOworCisJcmVnID0gbGUzMl90b19jcHUodHJhZmZpYy0+cmVnMSk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFJYX1BBQ0tFVF9USU1FU1RBTVApOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBUUkFGRklDX1JFU0VSVkVEKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgU1YpOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBSWF9TRVFVRU5DRV9OVU0pOworCisJUFJJTlRLX0xFMzIoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnR4X3JlcGxheV9jbnRfbG93KTsKKworCVBSSU5US19MRTE2KFNUQV9UUkFGRklDLCB0cmFmZmljLT50eF9yZXBsYXlfY250X2hpZ2gpOworCVBSSU5US19MRTE2KFNUQV9UUkFGRklDLCB0cmFmZmljLT5yeF9yZXBsYXlfY250X2hpZ2gpOworCisJUFJJTlRLX0xFMzIoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnJ4X3JlcGxheV9jbnRfbG93KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfc3RhKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4KQoreworCXN0cnVjdCBhZ254X3N0YSBzdGF0aW9uOworCXN0cnVjdCBhZ254X3N0YSAqc3RhID0gJnN0YXRpb247CisJdTMyIHJlZzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWdldF9zdGEocHJpdiwgc3RhLCBzdGFfaWR4KTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCVBSSU5US19MRTMyKFNUQSwgc3RhLT50eF9zZXNzaW9uX2tleXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCVBSSU5US19MRTMyKFNUQSwgc3RhLT5yeF9zZXNzaW9uX2tleXNbaV0pOworCisJcmVnID0gbGUzMl90b19jcHUoc3RhLT5yZWcpOworCVBSSU5US19CSVRTKFNUQSwgSURfMSk7CisJUFJJTlRLX0JJVFMoU1RBLCBJRF8wKTsKKwlQUklOVEtfQklUUyhTVEEsIEVOQUJMRV9DT05DQVRFTkFUSU9OKTsKKwlQUklOVEtfQklUUyhTVEEsIEVOQUJMRV9ERUNPTVBSRVNTSU9OKTsKKwlQUklOVEtfQklUUyhTVEEsIFNUQV9SRVNFUlZFRCk7CisJUFJJTlRLX0JJVFMoU1RBLCBFQVApOworCVBSSU5US19CSVRTKFNUQSwgRURfTlVMTCk7CisJUFJJTlRLX0JJVFMoU1RBLCBFTkNSWVBUSU9OX1BPTElDWSk7CisJUFJJTlRLX0JJVFMoU1RBLCBERUZJTkVEX0tFWV9JRCk7CisJUFJJTlRLX0JJVFMoU1RBLCBGSVhFRF9LRVkpOworCVBSSU5US19CSVRTKFNUQSwgS0VZX1ZBTElEKTsKKwlQUklOVEtfQklUUyhTVEEsIFNUQVRJT05fVkFMSUQpOworCisJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnR4X2Flc19ibGtzX3VuaWNhc3QpOworCVBSSU5US19MRTMyKFNUQSwgc3RhLT5yeF9hZXNfYmxrc191bmljYXN0KTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hZXNfZm9ybWF0X2Vycl91bmljYXN0X2NudCk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFlc19yZXBsYXlfdW5pY2FzdCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWVzX2RlY3J5cHRfZXJyX3VuaWNhc3QpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hZXNfZGVjcnlwdF9lcnJfZGVmYXVsdCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+c2luZ2xlX3JldHJ5X3BhY2tldHMpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5mYWlsZWRfdHhfcGFja2V0cyk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+bXV0aV9yZXRyeV9wYWNrZXRzKTsKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWNrX3RpbWVvdXRzKTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5mcmFnX3R4X2NudCk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnJ0c19icnFfc2VudCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+dHhfcGFja2V0cyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmN0c19iYWNrX3RpbWVvdXQpOworCisJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnBoeV9zdGF0c19oaWdoKTsKKwlQUklOVEtfTEUzMihTVEEsIHN0YS0+cGh5X3N0YXRzX2xvdyk7CisKKy8vCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJYWdueF9wcmludF9zdGFfdHJhZmZpYyhzdGEtPnRyYWZmaWMgKyAwKTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMF9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMV9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMl9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzM19mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNF9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNV9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNl9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzN19mcmFnX3N1Y2Nlc3MpOworCisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPm51bV9mcmFnX25vbl9wcmltZV9yYXRlcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFja190aW1lb3V0X25vbl9wcmltZV9yYXRlcyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaWVlZTgwMjExX2hkcihzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBjaGFyICp0YWcpCit7CisJdTE2IGZjdGw7CisgICAgICAgIGludCBoZHJsZW47CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKyAgICAgICAgZmN0bCA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7CisJc3dpdGNoIChmY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlwcmludGsoUEZYICIlcyBEQVRBICIsIHRhZyk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJcHJpbnRrKFBGWCAiJXMgQ1RMICIsIHRhZyk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6CisJCXByaW50ayhQRlggIiVzIE1HTVQgIiwgdGFnKTsKKwkJc3dpdGNoKGZjdGwgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6CisJCQlwcmludGsoIlN1YlR5cGU6IEFTU09DX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBBU1NPQ19SRVNQICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgorCQkJcHJpbnRrKCJTdWJUeXBlOiBSRUFTU09DX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6CisJCQlwcmludGsoIlN1YlR5cGU6IFJFQVNTT0NfUkVTUCAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6CisJCQlwcmludGsoIlN1YlR5cGU6IFBST0JFX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBQUk9CRV9SRVNQICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKKwkJCXByaW50aygiU3ViVHlwZTogQkVBQ09OICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FUSU06CisJCQlwcmludGsoIlN1YlR5cGU6IEFUSU0gIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6CisJCQlwcmludGsoIlN1YlR5cGU6IERJU0FTU09DICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6CisJCQlwcmludGsoIlN1YlR5cGU6IEFVVEggIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfREVBVVRIOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBERUFVVEggIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBBQ1RJT04gIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiU3ViVHlwZTogVW5rbm93XG4iKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoUEZYICIlcyBQYWNrZXQgdHlwZTogVW5rbm93XG4iLCB0YWcpOworCX0KKworICAgICAgICBoZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjdGwpOworCisJaWYgKGhkcmxlbiA+PSA0KQorCQlwcmludGsoIkZDPTB4JTA0eCBEVVI9MHglMDR4IiwKKwkJICAgICAgIGZjdGwsIGxlMTZfdG9fY3B1KGhkci0+ZHVyYXRpb25faWQpKTsKKwlpZiAoaGRybGVuID49IDEwKQorCQlwcmludGsoIiBBMT0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjEpKTsKKwlpZiAoaGRybGVuID49IDE2KQorCQlwcmludGsoIiBBMj0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjIpKTsKKwlpZiAoaGRybGVuID49IDI0KQorCQlwcmludGsoIiBBMz0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjMpKTsKKwlpZiAoaGRybGVuID49IDMwKQorCQlwcmludGsoIiBBND0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjQpKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3R4bV9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHgxZTg7IGkgKz0gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIlRYTTogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgaSkpOworCX0KK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3J4bV9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHgxMDg7IGkgKz0gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJSWE06ICV4LS0tPiAweCUuOHhcbiIsIGksIGlvcmVhZDMyKGN0bCArIDB4MjAwMCArIGkpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2JtX3JlZ2lzdGVycyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPD0weDkwOyBpICs9IDQpCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQk06ICV4LS0tPiAweCUuOHhcbiIsIGksIGlvcmVhZDMyKGN0bCArIDB4MmMwMCArIGkpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2Npcl9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHhiODsgaSArPSA0KQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIkNJUjogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgMHgzMDAwICsgaSkpOworfQorCisjZW5kaWYgLyogQUdOWF9ERUJVR19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQ2MzBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGNpLmMKQEAgLTAsMCArMSw2NDQgQEAKKy8qKgorICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KKworICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCisgKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJhZ254LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ4bWl0LmgiCisjaW5jbHVkZSAicGh5LmgiCisKK01PRFVMRV9BVVRIT1IoIkxpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFpcmdvIE1JTU8gUENJIHdpcmVsZXNzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdueF9wY2lfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxN2NiLCAweDAwMDEpIH0sCS8qIEJla2xpbiBGNWQ4MDEwLCBOZXRnZWFyIFdHTTUxMSBldGMgKi8KKwl7IFBDSV9ERVZJQ0UoMHgxN2NiLCAweDAwMDIpIH0sCS8qIE5ldGdlYXIgV3BudDUxMSAqLworCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWdueF9wY2lfaWRfdGJsKTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgYWdueF9pbnRlcnJ1cHRfYWNrKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiAqcmVhc29uKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlpZiAoICpyZWFzb24gJiBBR05YX1NUQVRfUlggKSB7CisJCS8qIE1hcmsgY29tcGxldGUgUlggKi8KKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDVEwpOworCQlyZWcgfD0gMHg0OworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENUTCk7CisJCS8qIGRpc2FibGUgUnggaW50ZXJydXB0ICovCisJfQorCWlmICggKnJlYXNvbiAmIEFHTlhfU1RBVF9UWCApIHsKKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfVFhEQ1RMKTsKKwkJaWYgKHJlZyAmIDB4NCkgeworCQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9DSVJfVFhEQ1RMKTsKKwkJCSpyZWFzb24gfD0gQUdOWF9TVEFUX1RYRDsKKwkJfQorIAkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwkJaWYgKHJlZyAmIDB4NCkgeworCQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwkJCSpyZWFzb24gfD0gQUdOWF9TVEFUX1RYTTsKKwkJfQorCX0KKwlpZiAoICpyZWFzb24gJiBBR05YX1NUQVRfWCApIHsKKy8qIAkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfU1RBVCk7ICovCisvKiAJCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfSU5UX1NUQVQpOyAqLworLyogCQkvXCogRklYTUUgcmVpbml0IGludGVycnVwdCBtYXNrICpcLyAqLworLyogCQlyZWcgPSAweGMzOTBiZjkgJiB+SVJRX1RYX0JFQUNPTjsgKi8KKy8qIAkJcmVnICY9IH5JUlFfVFhfRElTQUJMRTsgKi8KKy8qIAkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfTUFTSyk7ICovCisvKiAJCWlvd3JpdGUzMigweDgwMCwgY3RsICsgQUdOWF9DSVJfQkxLQ1RMKTsgKi8KKwl9Cit9IC8qIGFnbnhfaW50ZXJydXB0X2FjayAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWdueF9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJdTMyIGlycV9yZWFzb247CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisvLwlwcmludGsoS0VSTl9FUlIgUEZYICJHZXQgYSBpbnRlcnJ1cHQgJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChwcml2LT5pbml0X3N0YXR1cyAhPSBBR05YX1NUQVJUKQorCQlnb3RvIG91dDsKKworCS8qIEZpWE1FICBIZXJlIGhhcyBubyBsb2NrLCBJcyB0aGlzIHdpbGwgbGVhZCB0byByYWNlPyAqLworCWlycV9yZWFzb24gPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9CTEtDVEwpOworCWlmICghKGlycV9yZWFzb24gJiAweDcpKQorCQlnb3RvIG91dDsKKworCXJldCA9IElSUV9IQU5ETEVEOworCXByaXYtPmlycV9zdGF0dXMgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9TVEFUKTsKKworLy8JcHJpbnRrKFBGWCAiSW50ZXJydXB0IHJlYXNvbiBpcyAweCV4XG4iLCBpcnFfcmVhc29uKTsKKwkvKiBNYWtlIHN1cmUgdGhlIHR4bSBhbmQgdHhkIGZsYWdzIGRvbid0IGNvbmZsaWN0IHdpdGggb3RoZXIgdW5rbm93bgorCSAgIGludGVycnVwdCBmbGFnLCBtYXliZSBpcyBub3QgbmVjZXNzYXJ5ICovCisJaXJxX3JlYXNvbiAmPSAweEY7CisKKwlkaXNhYmxlX3J4X2ludGVycnVwdChwcml2KTsKKwkvKiBUT0RPIE1ha2Ugc3VyZSB0aGUgY2FyZCBmaW5pc2hlZCBpbml0aWFsaXplZCAqLworCWFnbnhfaW50ZXJydXB0X2Fjayhwcml2LCAmaXJxX3JlYXNvbik7CisKKwlpZiAoIGlycV9yZWFzb24gJiBBR05YX1NUQVRfUlggKQorCQloYW5kbGVfcnhfaXJxKHByaXYpOworCWlmICggaXJxX3JlYXNvbiAmIEFHTlhfU1RBVF9UWEQgKQorCQloYW5kbGVfdHhkX2lycShwcml2KTsKKwlpZiAoIGlycV9yZWFzb24gJiBBR05YX1NUQVRfVFhNICkKKwkJaGFuZGxlX3R4bV9pcnEocHJpdik7CisJaWYgKCBpcnFfcmVhc29uICYgQUdOWF9TVEFUX1ggKQorCQloYW5kbGVfb3RoZXJfaXJxKHByaXYpOworCisJZW5hYmxlX3J4X2ludGVycnVwdChwcml2KTsKK291dDoKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0dXJuIHJldDsKK30gLyogYWdueF9pbnRlcnJ1cHRfaGFuZGxlciAqLworCisKKy8qIEZJWE1FICovCitzdGF0aWMgaW50IGFnbnhfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIF9hZ254X3R4KGRldi0+cHJpdiwgc2tiKTsKK30gLyogYWdueF90eCAqLworCisKK3N0YXRpYyBpbnQgYWdueF9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwkvKiBBdHRlbnRpb24hIGRpcmVjdGx5IHJlYWQgdGhlIE1BQyBvciBvdGhlciBkYXRlIGZyb20gRUVQUk9NIHdpbGwKKwkgbGVhZCB0byBjYXJkYnVzKFdHTTUxMSkgbG9jayB1cCB3aGVuIHdyaXRlIHRvIFBNIFBMTCByZWdpc3RlciAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTQ0KTsKKwl1ZGVsYXkoNDApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTRjKTsKKwl1ZGVsYXkoNTApOworCS8qIEdldCB0aGUgbWFjIGFkZHJlc3MgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MzU0NCk7CisJdWRlbGF5KDQwKTsKKworCS8qIEhBQ0sgKi8KKwlyZWcgPSBjcHVfdG9fbGUzMihyZWcpOworCXByaXYtPm1hY19hZGRyWzBdID0gKCh1OCAqKSZyZWcpWzJdOworCXByaXYtPm1hY19hZGRyWzFdID0gKCh1OCAqKSZyZWcpWzNdOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTQ4KTsKKwl1ZGVsYXkoNTApOworCSooKHUzMiAqKShwcml2LT5tYWNfYWRkciArIDIpKSA9IGNwdV90b19sZTMyKHJlZyk7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIocHJpdi0+bWFjX2FkZHIpKSB7CisJCURFQ0xBUkVfTUFDX0JVRihtYnVmKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInJlYWQgbWFjICVzXG4iLCBwcmludF9tYWMobWJ1ZiwgcHJpdi0+bWFjX2FkZHIpKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkludmFsaWQgaHdhZGRyISBVc2luZyByYW5kb20gaHdhZGRyXG4iKTsKKwkJcmFuZG9tX2V0aGVyX2FkZHIocHJpdi0+bWFjX2FkZHIpOworCX0KKworCXJldHVybiAwOworfSAvKiBhZ254X2dldF9tYWNfYWRkcmVzcyAqLworCitzdGF0aWMgaW50IGFnbnhfYWxsb2NfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCUFHTlhfVFJBQ0U7CisKKwkvKiBBbGxvY2F0ZSBSWC9UWE0vVFhEIHJpbmdzIGluZm8gKi8KKwlwcml2LT5yeC5zaXplID0gQUdOWF9SWF9SSU5HX1NJWkU7CisJcHJpdi0+dHhtLnNpemUgPSBBR05YX1RYTV9SSU5HX1NJWkU7CisJcHJpdi0+dHhkLnNpemUgPSBBR05YX1RYRF9SSU5HX1NJWkU7CisKKwlsZW4gPSBwcml2LT5yeC5zaXplICsgcHJpdi0+dHhtLnNpemUgKyBwcml2LT50eGQuc2l6ZTsKKworLy8JcHJpdi0+cnguaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZ254X2luZm8pICogbGVuLCBHRlBfS0VSTkVMKTsKKwlwcml2LT5yeC5pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykgKiBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghcHJpdi0+cnguaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJcHJpdi0+dHhtLmluZm8gPSBwcml2LT5yeC5pbmZvICsgcHJpdi0+cnguc2l6ZTsKKwlwcml2LT50eGQuaW5mbyA9IHByaXYtPnR4bS5pbmZvICsgcHJpdi0+dHhtLnNpemU7CisKKwkvKiBBbGxvY2F0ZSBSWC9UWE0vVFhEIGRlc2NyaXB0b3JzICovCisJcHJpdi0+cnguZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHByaXYtPnBkZXYsIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIGxlbiwKKwkJCQkJICAgICAmcHJpdi0+cnguZG1hKTsKKwlpZiAoIXByaXYtPnJ4LmRlc2MpIHsKKwkJa2ZyZWUocHJpdi0+cnguaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaXYtPnR4bS5kZXNjID0gcHJpdi0+cnguZGVzYyArIHByaXYtPnJ4LnNpemU7CisJcHJpdi0+dHhtLmRtYSA9IHByaXYtPnJ4LmRtYSArIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIHByaXYtPnJ4LnNpemU7CisJcHJpdi0+dHhkLmRlc2MgPSBwcml2LT50eG0uZGVzYyArIHByaXYtPnR4bS5zaXplOworCXByaXYtPnR4ZC5kbWEgPSBwcml2LT50eG0uZG1hICsgc2l6ZW9mKHN0cnVjdCBhZ254X2Rlc2MpICogcHJpdi0+dHhtLnNpemU7CisKKwlyZXR1cm4gMDsKK30gLyogYWdueF9hbGxvY19yaW5ncyAqLworCitzdGF0aWMgdm9pZCByaW5nc19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IHByaXYtPnJ4LnNpemUgKyBwcml2LT50eG0uc2l6ZSArIHByaXYtPnR4ZC5zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJa2ZyZWUocHJpdi0+cnguaW5mbyk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wZGV2LCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBsZW4sCisJCQkgICAgcHJpdi0+cnguZGVzYywgcHJpdi0+cnguZG1hKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBhZ254X3BlcmlvZGljX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWdueF9wcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNfd29yay53b3JrKTsKKy8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKworCS8qIGZpeG1lOiB1c2luZyBtdXRleD8/ICovCisvLwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogVE9ETyBSZWNhbGlicmF0ZSovCisvLwljYWxpYnJhdGVfb3NjaWxsYXRvcihwcml2KTsKKy8vCWFudGVubmFfY2FsaWJyYXRlKHByaXYpOworLy8JYWdueF9zZW5kX3BhY2tldChwcml2LCA5OTcpOworCS8qIEZJWE1FICovCisvKiAJaWYgKGRlYnVnID09IDMpICovCisvKiAgICAgICAgICAgICAgICAgZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKEFHTlhfUEVSSU9ESUNfREVMQVkpOyAqLworLyogCWVsc2UgKi8KKwlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoQUdOWF9QRVJJT0RJQ19ERUxBWSk7CisvLwkJZGVsYXkgPSByb3VuZF9qaWZmaWVzKEhaICogMTUpOworCisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmh3LT53b3JrcXVldWUsICZwcml2LT5wZXJpb2RpY193b3JrLCBkZWxheSk7CisKKy8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFnbnhfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQoreworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJLyogdW5zaWduZWQgbG9uZyBkZWxheTsgKi8KKwlpbnQgZXJyID0gMDsKKwlBR05YX1RSQUNFOworCisJZXJyID0gYWdueF9hbGxvY19yaW5ncyhwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbid0IGFsbG9jIFJYL1RYTS9UWEQgcmluZ3NcbiIpOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+cGRldi0+aXJxLCAmYWdueF9pbnRlcnJ1cHRfaGFuZGxlciwKKwkJCSAgSVJRRl9TSEFSRUQsICJhZ254X3BjaSIsIGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gcmVnaXN0ZXIgSVJRIGhhbmRsZXJcbiIpOworCQlyaW5nc19mcmVlKHByaXYpOworCQlnb3RvIG91dDsKKwl9CisKKy8vCW1kZWxheSg1MDApOworCisJbWlnaHRfc2xlZXAoKTsKKwlhZ254X2h3X2luaXQocHJpdik7CisKKy8vCW1kZWxheSg1MDApOworCW1pZ2h0X3NsZWVwKCk7CisKKwlwcml2LT5pbml0X3N0YXR1cyA9IEFHTlhfU1RBUlQ7CisvKiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5wZXJpb2RpY193b3JrLCBhZ254X3BlcmlvZGljX3dvcmtfaGFuZGxlcik7ICovCisvKiAJZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKEFHTlhfUEVSSU9ESUNfREVMQVkpOyAqLworLyogICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHctPndvcmtxdWV1ZSwgJnByaXYtPnBlcmlvZGljX3dvcmssIGRlbGF5KTsgKi8KK291dDoKKwlyZXR1cm4gZXJyOworfSAvKiBhZ254X3N0YXJ0ICovCisKK3N0YXRpYyB2b2lkIGFnbnhfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCisJcHJpdi0+aW5pdF9zdGF0dXMgPSBBR05YX1NUT1A7CisJLyogbWFrZSBzdXJlIGhhcmR3YXJlIHdpbGwgbm90IGdlbmVyYXRlIGlycSAqLworCWFnbnhfaHdfcmVzZXQocHJpdik7CisJZnJlZV9pcnEocHJpdi0+cGRldi0+aXJxLCBkZXYpOworICAgICAgICBmbHVzaF93b3JrcXVldWUocHJpdi0+aHctPndvcmtxdWV1ZSk7CisvLwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnBlcmlvZGljX3dvcmspOworCXVuZmlsbF9yaW5ncyhwcml2KTsKKwlyaW5nc19mcmVlKHByaXYpOworfQorCitzdGF0aWMgaW50IGFnbnhfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBjaGFubmVsID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNvbmYtPmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwkvKiBGSVhNRSBuZWVkIHByaXYgbG9jaz8gKi8KKwlpZiAoY2hhbm5lbCAhPSBwcml2LT5jaGFubmVsKSB7CisJCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOworCQlhZ254X3NldF9jaGFubmVsKHByaXYsIHByaXYtPmNoYW5uZWwpOworCX0KKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ254X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2lmX2NvbmYgKmNvbmYpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmIChtZW1jbXAoY29uZi0+YnNzaWQsIHByaXYtPmJzc2lkLCBFVEhfQUxFTikpIHsKKy8vCQl1MzIgcmVnaGksIHJlZ2xvOworCQlhZ254X3NldF9ic3NpZChwcml2LCBjb25mLT5ic3NpZCk7CisJCW1lbWNweShwcml2LT5ic3NpZCwgY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJaGFzaF93cml0ZShwcml2LCBjb25mLT5ic3NpZCwgQlNTSURfU1RBSUQpOworCQlzdGFfaW5pdChwcml2LCBCU1NJRF9TVEFJRCk7CisJCS8qIEZJWE1FIG5lZWRlZD8gKi8KKwkJc3RhX3Bvd2VyX2luaXQocHJpdiwgQlNTSURfU1RBSUQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX01UU00sIDB4ZmYgJiB+MHgxKTsKKwl9CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXJldHVybiAwOworfSAvKiBhZ254X2NvbmZpZ19pbnRlcmZhY2UgKi8KKworCitzdGF0aWMgdm9pZCBhZ254X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCisJCQkJICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAorCQkJCSAgaW50IG1jX2NvdW50LCBzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdCkKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X2ZsYWdzID0gMDsKKworCSp0b3RhbF9mbGFncyA9IG5ld19mbGFnczsKKwkvKiBUT0RPICovCit9CisKK3N0YXRpYyBpbnQgYWdueF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJLyogRklYTUUgKi8KKwlpZiAocHJpdi0+bW9kZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGNvbmYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCXByaXYtPm1vZGUgPSBjb25mLT50eXBlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFnbnhfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisKKwkvKiBUT0RPICovCisJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7Cit9CisKK3N0YXRpYyBpbnQgYWdueF9nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJLyogVE9ETyAhISAqLworCW1lbWNweShzdGF0cywgJnByaXYtPnN0YXRzLCBzaXplb2YoKnN0YXRzKSk7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgYWdueF9nZXRfdHNmdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSAoKHN0cnVjdCBhZ254X3ByaXYgKilkZXYtPnByaXYpLT5jdGw7CisJdTMyIHRzZnRsOworCXU2NCB0c2Z0OworCUFHTlhfVFJBQ0U7CisKKwkvKiBGSVhNRSAqLworCXRzZnRsID0gaW9yZWFkMzIoY3RsICsgQUdOWF9UWE1fVElNRVNUQU1QTE8pOworCXRzZnQgPSBpb3JlYWQzMihjdGwgKyBBR05YX1RYTV9USU1FU1RBTVBISSk7CisJdHNmdCA8PD0gMzI7CisJdHNmdCB8PSB0c2Z0bDsKKworCXJldHVybiB0c2Z0OworfQorCitzdGF0aWMgaW50IGFnbnhfZ2V0X3R4X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCisJLyogRklYTUUgbm93IHdlIGp1c3QgdXNpbmcgdHhkIHF1ZXVlLCBidXQgc2hvdWxkIHVzaW5nIHR4bSBxdWV1ZSB0b28gKi8KKwlzdGF0c1swXS5sZW4gPSAocHJpdi0+dHhkLmlkeCAtIHByaXYtPnR4ZC5pZHhfc2VudCkgLyAyOworCXN0YXRzWzBdLmxpbWl0ID0gcHJpdi0+dHhkLnNpemUgLSAyOworCXN0YXRzWzBdLmNvdW50ID0gcHJpdi0+dHhkLmlkeCAvIDI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfb3BzIGFnbnhfb3BzID0geworCS50eAkJCT0gYWdueF90eCwKKwkuc3RhcnQJCQk9IGFnbnhfc3RhcnQsCisJLnN0b3AJCQk9IGFnbnhfc3RvcCwKKwkuYWRkX2ludGVyZmFjZQkJPSBhZ254X2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UJPSBhZ254X3JlbW92ZV9pbnRlcmZhY2UsCisJLmNvbmZpZwkJCT0gYWdueF9jb25maWcsCisJLmNvbmZpZ19pbnRlcmZhY2UJPSBhZ254X2NvbmZpZ19pbnRlcmZhY2UsCisgCS5jb25maWd1cmVfZmlsdGVyCT0gYWdueF9jb25maWd1cmVfZmlsdGVyLAorCS5nZXRfc3RhdHMJCT0gYWdueF9nZXRfc3RhdHMsCisJLmdldF90eF9zdGF0cwkJPSBhZ254X2dldF90eF9zdGF0cywKKwkuZ2V0X3RzZgkJPSBhZ254X2dldF90c2Z0Cit9OworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdueF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGRldik7CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+Y3RsKTsKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5kYXRhKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCWllZWU4MDIxMV9mcmVlX2h3KGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFnbnhfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2OworCXN0cnVjdCBhZ254X3ByaXYgKnByaXY7CisJdTMyIG1lbV9hZGRyMCwgbWVtX2xlbjA7CisJdTMyIG1lbV9hZGRyMSwgbWVtX2xlbjE7CisJaW50IGVycjsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgZW5hYmxlIG5ldyBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBnZXQgcGNpIHJlc291cmNlICovCisJbWVtX2FkZHIwID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCW1lbV9sZW4wID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwltZW1fYWRkcjEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJbWVtX2xlbjEgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiTWVtYWRkcjAgaXMgJXgsIGxlbmd0aCBpcyAleFxuIiwgbWVtX2FkZHIwLCBtZW1fbGVuMCk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJNZW1hZGRyMSBpcyAleCwgbGVuZ3RoIGlzICV4XG4iLCBtZW1fYWRkcjEsIG1lbV9sZW4xKTsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImFnbngtcGNpIik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBvYnRhaW4gUENJIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9yZWc7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJwZGV2LT5pcnEgaXMgJWRcbiIsIHBkZXYtPmlycSk7CisKKwlkZXYgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCpwcml2KSwgJmFnbnhfb3BzKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9yZWc7CisJfQorCS8qIGluaXQgcHJpdiAgKi8KKwlwcml2ID0gZGV2LT5wcml2OworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKKwlwcml2LT5wZGV2ID0gcGRldjsKKwlwcml2LT5odyA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcHJpdi0+aW5pdF9zdGF0dXMgPSBBR05YX1VOSU5JVDsKKworCS8qIE1hcCBtZW0gIzEgYW5kICMyICovCisJcHJpdi0+Y3RsID0gcGNpX2lvbWFwKHBkZXYsIDAsIG1lbV9sZW4wKTsKKy8vCXByaW50ayhLRVJOX0RFQlVHIFBGWCJNRU0xIG1hcHBlZCBhZGRyZXNzIGlzIDB4JXBcbiIsIHByaXYtPmN0bCk7CisJaWYgKCFwcml2LT5jdGwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgbWFwIGRldmljZSBtZW1vcnlcbiIpOworCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisJcHJpdi0+ZGF0YSA9IHBjaV9pb21hcChwZGV2LCAxLCBtZW1fbGVuMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJNRU0yIG1hcHBlZCBhZGRyZXNzIGlzIDB4JXBcbiIsIHByaXYtPmRhdGEpOworCWlmICghcHJpdi0+ZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBtYXAgZGV2aWNlIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX2lvdW5tYXAyOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnByaXYtPnJldmlkKTsKKworCXByaXYtPmJhbmQuY2hhbm5lbHMgICA9IChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKilhZ254X2NoYW5uZWxzOworCXByaXYtPmJhbmQubl9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWdueF9jaGFubmVscyk7CisJcHJpdi0+YmFuZC5iaXRyYXRlcyAgID0gKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqKWFnbnhfcmF0ZXNfODAyMTFnOworCXByaXYtPmJhbmQubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUoYWdueF9yYXRlc184MDIxMWcpOworCisJLyogSW5pdCBpZWVlODAyLjExIGRldiAgKi8KKwlTRVRfSUVFRTgwMjExX0RFVihkZXYsICZwZGV2LT5kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWRldi0+ZXh0cmFfdHhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKTsKKworCS8qIEZJWE1FIEl0IG9ubHkgaW5jbHVkZSBGQ1MgaW4gcHJvbWlvdXMgbW9kZSBidXQgbm90IG1hbmFnZSBtb2RlICovCisvKiAgICAgIGRldi0+ZmxhZ3MgPSAgSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUzsgKi8KKwlkZXYtPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSA1MDAwOworCWRldi0+bWF4X3NpZ25hbCA9IDEwMDsKKwkvKiBGSVhNRSAqLworCWRldi0+cXVldWVzID0gMTsKKworCWFnbnhfZ2V0X21hY19hZGRyZXNzKHByaXYpOworCisJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoZGV2LCBwcml2LT5tYWNfYWRkcik7CisKKy8qIAkvXCogRklYTUUgKlwvICovCisvKiAJZm9yIChpID0gMTsgaSA8IE5VTV9EUklWRV9NT0RFUzsgaSsrKSB7ICovCisvKiAJCWVyciA9IGllZWU4MDIxMV9yZWdpc3Rlcl9od21vZGUoZGV2LCAmcHJpdi0+bW9kZXNbaV0pOyAqLworLyogCQlpZiAoZXJyKSB7ICovCisvKiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciBod21vZGVcbiIpOyAqLworLyogCQkJZ290byAgZXJyX2lvdW5tYXA7ICovCisvKiAJCX0gKi8KKy8qIAl9ICovCisKKwlwcml2LT5jaGFubmVsID0gMTsKKwlkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZwcml2LT5iYW5kOworCisJZXJyID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciBoYXJkd2FyZVxuIik7CisJCWdvdG8gZXJyX2lvdW5tYXA7CisJfQorCisJYWdueF9od19yZXNldChwcml2KTsKKworCisJcHJpbnRrKFBGWCAiJXM6IGh3YWRkciAlcywgUmV2IDB4JTAyeFxuIiwgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwKKwkgICAgICAgcHJpbnRfbWFjKG1hYywgZGV2LT53aXBoeS0+cGVybV9hZGRyKSwgcHJpdi0+cmV2aWQpOworCXJldHVybiAwOworCisgZXJyX2lvdW5tYXA6CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+ZGF0YSk7CisKKyBlcnJfaW91bm1hcDI6CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+Y3RsKTsKKworIGVycl9mcmVlX2RldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKKworIGVycl9mcmVlX3JlZzoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7Cit9IC8qIGFnbnhfcGNpX3Byb2JlKi8KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGFnbnhfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJQUdOWF9UUkFDRTsKKworCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhkZXYpOworCWFnbnhfc3RvcChkZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdueF9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlBR05YX1RSQUNFOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJYWdueF9zdGFydChkZXYpOworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgYWdueF9wY2lfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGFnbnhfcGNpX3Jlc3VtZSBOVUxMCisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWdueF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ254LXBjaSIsCisJLmlkX3RhYmxlCT0gYWdueF9wY2lfaWRfdGJsLAorCS5wcm9iZQkJPSBhZ254X3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFnbnhfcGNpX3JlbW92ZSksCisJLnN1c3BlbmQJPSBhZ254X3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWdueF9wY2lfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdueF9wY2lfaW5pdCh2b2lkKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFnbnhfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ254X3BjaV9leGl0KHZvaWQpCit7CisJQUdOWF9UUkFDRTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFnbnhfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoYWdueF9wY2lfaW5pdCk7Cittb2R1bGVfZXhpdChhZ254X3BjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4ZjEwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5jCkBAIC0wLDAgKzEsOTYwIEBACisvKioKKyAqIEFpcmdvIE1JTU8gd2lyZWxlc3MgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IExpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+CisKKyAqIFRoYW5rcyBmb3IgSmVmZiBXaWxsaWFtcyA8YW5nZWxiYW5lQGdtYWlsLmNvbT4gZG8gcmV2ZXJzZSBlbmdpbmVlcgorICogd29ya3MgYW5kIHB1Ymxpc2hlZCB0aGUgU1BFQ1MgYXQgaHR0cDovL2FpcmdvLndkd2NvbnN1bHRpbmcubmV0L215bW9pbgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImFnbnguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAieG1pdC5oIgorCit1OCByZWFkX2Zyb21fZWVwcm9tKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUxNiBhZGRyZXNzKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXN0cnVjdCBhZ254X2VlcHJvbSBjbWQ7CisJdTMyIHJlZzsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmNtZCA9IEVFUFJPTV9DTURfUkVBRCA8PCBBR05YX0VFUFJPTV9DT01NQU5EX1NISUZUOworCWNtZC5hZGRyZXNzID0gYWRkcmVzczsKKwkvKiBWZXJpZnkgdGhhdCB0aGUgU3RhdHVzIGJpdCBpcyBjbGVhciAqLworCS8qIFJlYWQgQ29tbWFuZCBhbmQgQWRkcmVzcyBhcmUgd3JpdHRlbiB0byB0aGUgU2VyaWFsIEludGVyZmFjZSAqLworCWlvd3JpdGUzMigqKF9fbGUzMiAqKSZjbWQsIGN0bCArIEFHTlhfQ0lSX1NFUklBTElURik7CisJLyogV2FpdCBmb3IgdGhlIFN0YXR1cyBiaXQgdG8gY2xlYXIgYWdhaW4gKi8KKwllZXByb21fZGVsYXkoKTsKKwkvKiBSZWFkIGZyb20gRGF0YSAqLworCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1NFUklBTElURik7CisKKwljbWQgPSAqKHN0cnVjdCBhZ254X2VlcHJvbSAqKSZyZWc7CisKKwlyZXR1cm4gY21kLmRhdGE7Cit9CisKK3N0YXRpYyBpbnQgY2FyZF9mdWxsX3Jlc2V0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgMHg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwpOworCXJldHVybiAwOworfQorCitpbmxpbmUgdm9pZCBlbmFibGVfcG93ZXJfc2F2aW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnICY9IH4weDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZV9wb3dlcl9zYXZpbmcoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7Cit9CisKKwordm9pZCBkaXNhYmxlX3JlY2VpdmVyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworCS8qIEZJWE1FIERpc2FibGUgdGhlIHJlY2VpdmVyICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDApOworCS8qIFNldCBnYWluIGNvbnRyb2wgcmVzZXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDEpOworCS8qIFJlc2V0IGdhaW4gY29udHJvbCByZXNldCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MCk7Cit9CisKKworLyogRml4bWUgdGhpcyBzaG91bGUgYmUgZGlzYWJsZSBSWCwgYWJvdmUgaXMgZW5hYmxlIFJYICovCit2b2lkIGVuYWJsZV9yZWNlaXZlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCUFHTlhfVFJBQ0U7CisKKwkvKiBTZXQgYWRhcHRpdmUgZ2FpbiBjb250cm9sIGRpc2NvdmVyeSBtb2RlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDMpOworCS8qIFNldCBnYWluIGNvbnRyb2wgcmVzZXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDEpOworCS8qIENsZWFyIGdhaW4gY29udHJvbCByZXNldCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hY19hZGRyZXNzX3NldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXU4ICptYWNfYWRkciA9IHByaXYtPm1hY19hZGRyOworCXUzMiByZWc7CisKKwkvKiBGSVhNRSAqLworCXJlZyA9IChtYWNfYWRkclswXSA8PCAyNCkgfCAobWFjX2FkZHJbMV0gPDwgMTYpIHwgbWFjX2FkZHJbMl0gPDwgOCB8IG1hY19hZGRyWzNdOworCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfUlhNX01BQ0hJKTsKKyAJcmVnID0gKG1hY19hZGRyWzRdIDw8IDgpIHwgbWFjX2FkZHJbNV07CisJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fTUFDTE8pOworfQorCitzdGF0aWMgdm9pZCByZWNlaXZlcl9ic3NpZF9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKmJzc2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOworCS8qIEZJWE1FICovCisJcmVnID0gYnNzaWRbMF0gPDwgMjQgfCAoYnNzaWRbMV0gPDwgMTYpIHwgKGJzc2lkWzJdIDw8IDgpIHwgYnNzaWRbM107CisJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fQlNTSURISSk7CisgCXJlZyA9IChic3NpZFs0XSA8PCA4KSB8IGJzc2lkWzVdOworCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfUlhNX0JTU0lETE8pOworCisJLyogRW5hYmxlIHRoZSByZWNlaXZlciAqLworCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKKworCS8qIENsZWFyIHRoZSBUU0YgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UU0ZMTywgMHgwKTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UU0ZISSwgMHgwKTsgKi8KKwkvKiBDbGVhciB0aGUgVEJUVCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RCVFRMTywgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UQlRUSEksIDB4MCk7CisJZGlzYWJsZV9yZWNlaXZlcihwcml2KTsKK30gLyogcmVjZWl2ZXJfYnNzaWRfc2V0ICovCisKK3N0YXRpYyB2b2lkIGJhbmRfbWFuYWdlbWVudF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwl1MzIgcmVnOworCWludCBpOworCUFHTlhfVFJBQ0U7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1RYV0FERFIsIEFHTlhfUERVX1RYX1dRKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9BRERSV0lOLCAweDApOworCW1lbXNldF9pbyhkYXRhICsgQUdOWF9QRFVQT09MLCAweDAsIEFHTlhfUERVUE9PTF9TSVpFKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0JNQ1RMLCAweDIwMCk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NJUERVV0NOVCwgMHg0MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9TUFBEVVdDTlQsIDB4Mik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9SRlBQRFVXQ05ULCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fUkhQUERVV0NOVCwgMHgyMik7CisKKwkvKiBGSVhNRSBJbml0aWFsaXplIHRoZSBGcmVlIFBvb2wgTGlua2VkIExpc3QgKi8KKwkvKiAgICAxLiBXcml0ZSB0aGUgQWRkcmVzcyBvZiB0aGUgTmV4dCBOb2RlICgoMHg0MTgwMCArIG5vZGUqc2l6ZSkvc2l6ZSkKKwkgICAgICB0byB0aGUgZmlyc3Qgd29yZCBvZiBlYWNoIG5vZGUuICAqLworCWZvciAoaSA9IDA7IGkgPCBQRFVfRlJFRV9DTlQ7IGkrKykgeworCQlpb3dyaXRlMzIoKEFHTlhfUERVX0ZSRUUgKyAoaSsxKSpQRFVfU0laRSkvUERVX1NJWkUsCisJCQkgIGRhdGEgKyBBR05YX1BEVV9GUkVFICsgKFBEVV9TSVpFICogaSkpOworCQkvKiBUaGUgbGFzdCBub2RlIHNob3VsZCBiZSBzZXQgdG8gMHgwICovCisJCWlmICgoaSArIDEpID09IFBEVV9GUkVFX0NOVCkKKwkJCW1lbXNldF9pbyhkYXRhICsgQUdOWF9QRFVfRlJFRSArIChQRFVfU0laRSAqIGkpLAorCQkJCSAgMHgwLCBQRFVfU0laRSk7CisJfQorCisJLyogSGVhZCBpcyBGaXJzdCBQb29sIGFkZHJlc3MgKDB4NDE4MDApIC8gc2l6ZSAoMHg4MCkgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0ZQTEhQLCBBR05YX1BEVV9GUkVFL1BEVV9TSVpFKTsKKwkvKiBUYWlsIGlzIExhc3QgUG9vbCBBZGRyZXNzICgweDQ3ZjgwKSAvIHNpemUgKDB4ODApICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9GUExUUCwgMHg0N2Y4MC9QRFVfU0laRSk7CisJLyogQ291bnQgaXMgTnVtYmVyIG9mIE5vZGVzIGluIHRoZSBQb29sICgweGQwKSAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fRlBDTlQsIFBEVV9GUkVFX0NOVCk7CisKKwkvKiBTdGFydCBhbGwgd29ya3F1ZXVlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9DSVdRQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVUxXQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVUhXQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVVRYV0NUTCwgMHg4MDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9DUFVSWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fU1BSWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fU1BUWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fUkZQV0NUTCwgMHg4MDAwMCk7CisKKwkvKiBFbmFibGUgdGhlIEJhbmQgTWFuYWdlbWVudCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9CTV9CTUNUTCk7CisJcmVnIHw9IDB4MTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0JNQ1RMLCByZWcpOworfSAvKiBiYW5kX21hbmFnbWVudF9pbml0ICovCisKKworc3RhdGljIHZvaWQgc3lzdGVtX2l0Zl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fVEVTVFBIWSwgMHgxMWUxNDNhKTsKKworCWlmIChwcml2LT5yZXZpZCA9PSAwKSB7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSk7CisJCXJlZyB8PSAweDExOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCByZWcpOworCX0KKwkvKiA/Pz8gV2hhdCBpcyB0aGF0IG1lYW5zPyBpdCBzaG91bGQgZGlmZmVyZW5jZSBmb3IgZGlmZmVyaWNlIHR5cGUKKwkgb2YgY2FyZHMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYsIDB4ZmZmODEwMDYpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOLCAweDFmMDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCAweDUpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOKTsKK30KKworc3RhdGljIHZvaWQgZW5jcnlwdGlvbl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfV0VQS0VZMCwgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0VOQ1JZX1dFUEtFWTEsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9FTkNSWV9XRVBLRVkyLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfV0VQS0VZMywgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0VOQ1JZX0NDTVJFQ1RMLCAweDgpOworfQorCitzdGF0aWMgdm9pZCB0eF9tYW5hZ2VtZW50X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCS8qIEZpbGwgb3V0IHRoZSBDb21wdXRhdGlvbmFsRW5naW5lTG9va3VwVGFibGUKKwkgKiBzdGFydGluZyBhdCBtZW1vcnkgIzIgb2Zmc2V0IDB4ODAwCisJICovCisJdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChwcml2KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4MTAwMCwgMCwgMHhmZTApOworCS8qIEVuYWJsZSBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBGdW5jdGlvbnMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9FVE1GLCAweDNmZik7CisJLyogV3JpdGUgMHgzZiB0byBUcmFuc21pc3Npb24gVGVtcGxhdGUgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UWFRFTVAsIDB4M2YpOworCisJaWYgKHByaXYtPnJldmlkID49IDIpCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NJRlNQSUZTLCAweDFlMTQwYTBiKTsKKwllbHNlCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NJRlNQSUZTLCAweDFlMTkwYTBiKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMpOworCXJlZyAmPSAweGZmMDA7CisJcmVnIHw9IDB4YjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUywgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTKTsKKwlyZWcgJj0gMHhmZmZmMDBmZjsKKwlyZWcgfD0gMHhhMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMsIHJlZyk7CisJLyogRW5hYmxlIFRJRlMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVEwsIDB4NDAwMDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUyk7CisJcmVnICY9IDB4ZmYwMGZmZmY7CisJcmVnIHw9IDB4NTEwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZKTsKKwlyZWcgJj0gMHhmZjAwZmZmZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9QUk9CREVMQVksIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUyk7CisJcmVnICY9IDB4MDBmZmZmZmY7CisJcmVnIHw9IDB4MWMwMDAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9QUk9CREVMQVkpOworCXJlZyAmPSAweDAwZmZmZmZmOworCXJlZyB8PSAweDAxMDAwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSwgcmVnKTsKKworCS8qICMgU2V0IERJRiAwLTEsMi0zLDQtNSw2LTcgdG8gZGVmYXVsdHMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9ESUYwMSwgMHgzMjFkMzIxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fRElGMjMsIDB4MzIxZDMyMWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RJRjQ1LCAweDMyMWQzMjFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9ESUY2NywgMHgzMjFkMzIxZCk7CisKKwkvKiBNYXggQWNrIHRpbWVvdXQgbGltaXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9NQVhBQ0tUSU0sIDB4MWUxOSk7CisJLyogTWF4IFJYIERhdGEgVGltZW91dCBjb3VudCwgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX01BWFJYVElNRSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4ZmY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTUFYUlhUSU1FLCByZWcpOworCisJLyogQ0YgcG9sbCBSWCBUaW1lb3V0IGNvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjsKKwlyZWcgfD0gMHhmZjAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisKKwkvKiBNYXggVGltZW91dCBFeGNlZWRlZCBjb3VudCwgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX01BWFRJTU9VVCk7CisJcmVnICY9IDB4ZmYwMGZmZmY7CisJcmVnIHw9IDB4MTkwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX01BWFRJTU9VVCwgcmVnKTsKKworCS8qIENGIGFjayB0aW1lb3V0IGxpbWl0IGZvciAxMWIgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGQUNLVDExQik7CisJcmVnICY9IDB4ZmYwMDsKKwlyZWcgfD0gMHgxZTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRkFDS1QxMUIsIHJlZyk7CisKKwkvKiBNYXggQ0YgUG9sbCBUaW1lb3V0IENvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4MTk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisJLyogQ0YgUG9sbCBSWCBUaW1lb3V0IENvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4MWU7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisKKwkvKiAjIHdyaXRlIGRlZmF1bHQgdG8gKi8KKwkvKiAgICAxLiBTY2hlZHVsZSBFbXB0eSBDb3VudCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NDSEVNUENOVCwgMHg1KTsKKwkvKiAgICAyLiBDRlAgUGVyaW9kIENvdW50ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQRVJDTlQsIDB4MSk7CisJLyogICAgMy4gQ0ZQIE1EViAgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBNRFYsIDB4MTAwMDApOworCisJLyogUHJvYmUgRGVsYXkgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4NDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSwgcmVnKTsKKworCS8qIE1heCBDQ0EgY291bnQgU2xvdCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fTUFYQ0NBQ05UU0xPVCk7CisJcmVnICY9IDB4ZmZmZjAwZmY7CisJcmVnIHw9IDB4OTAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX01BWENDQUNOVFNMT1QsIHJlZyk7CisKKwkvKiBTbG90IGxpbWl0LzEgbXNlYyBMaW1pdCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fU0xPVExJTUlUKTsKKwlyZWcgJj0gMHhmZjAwZmZmZjsKKwlyZWcgfD0gMHgxNDAwNzc7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0xPVExJTUlULCByZWcpOworCisJLyogIyBTZXQgQ1cgIygwLTcpIHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzAsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzEsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzIsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzMsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzQsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzUsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzYsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzcsIDB4ZmYwMDA3KTsKKworCS8qICMgU2V0IFNob3J0L0xvbmcgbGltaXQgIygwLTcpIHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTAsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTEsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTIsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTMsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTQsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTUsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTYsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTcsICAweGEwMDBhKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwlyZWcgfD0gMHgxNDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKKwkvKiBXYWl0IGZvciBiaXQgMCBpbiBDb250cm9sIFJlZyB0byBjbGVhciAgKi8KKwl1ZGVsYXkoODApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwkvKiBPciAweDE4MDAwIHRvIENvbnRyb2wgcmVnICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCXJlZyB8PSAweDE4MDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKKwkvKiBXYWl0IGZvciBiaXQgMCBpbiBDb250cm9sIFJlZyB0byBjbGVhciAqLworCXVkZWxheSg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCisJLyogU2V0IExpc3RlbiBJbnRlcnZhbCBDb3VudCB0byBkZWZhdWx0ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTElTSU5URVJDTlQsIDB4MSk7CisJLyogU2V0IERUSU0gcGVyaW9kIGNvdW50IHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9EVElNUEVSSUNOVCwgMHgyMDAwKTsKK30gLyogdHhfbWFuYWdlbWVudF9pbml0ICovCisKK3N0YXRpYyB2b2lkIHJ4X21hbmFnZW1lbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCUFHTlhfVFJBQ0U7CisKKwkvKiBJbml0aWFsaXplIHRoZSBSb3V0aW5nIFRhYmxlICovCisJcm91dGluZ190YWJsZV9pbml0KHByaXYpOworCisJaWYgKHByaXYtPnJldmlkID49IDMpIHsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDc0LCAweDFmMTcxNzEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDc4LCAweDEwMTAwZDBkKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDdjLCAweDExMTExMDEwKTsKKwl9CisJZWxzZQorCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9ERUxBWTExLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIDB4ODE5NWUwMCk7Cit9CisKKworc3RhdGljIHZvaWQgYWdueF90aW1lcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworLyogCS9cKiBXcml0ZSAweDI0OWYwMCAodGljayBkdXJhdGlvbj8pIHRvIFRpbWVyIDEgKlwvICovCisvKiAJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNRVIxLCAweDI0OWYwMCk7ICovCisvKiAJL1wqIFdyaXRlIDB4ZTIgdG8gVGltZXIgMSBDb250cm9sICpcLyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVElNQ1RMX1RJTTFDVEwsIDB4ZTIpOyAqLworCisJLyogV3JpdGUgMHgyNDlmMDAgKHRpY2sgZHVyYXRpb24/KSB0byBUaW1lciAxICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNRVIxLCAweDApOworCS8qIFdyaXRlIDB4ZTIgdG8gVGltZXIgMSBDb250cm9sICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNMUNUTCwgMHgwKTsKKworCWlvd3JpdGUzMigweEZGRkZGRkZGLCBwcml2LT5jdGwgKyBBR05YX1RYTV9CRUFDT05fQ1RMKTsKK30KKworc3RhdGljIHZvaWQgcG93ZXJfbWFuYWdlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX01BQ01TVywgMHgxZik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9SRkNUTCwgMHgxZik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSAweGYwMGY7CisJcmVnIHw9IDB4YTA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKKworCWlmIChwcml2LT5yZXZpZCA+PSAzKSB7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNUKTsKKwkJcmVnIHw9IDB4MTg7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwl9Cit9IC8qIHBvd2VyX21hbmFnZV9pbml0ICovCisKKworc3RhdGljIHZvaWQgZ2Fpbl9jdGxjbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RSQUNOVDUsIDB4MTE5KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ2LCAweDExOCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVFJBQ05UNywgMHgxMTcpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSB+MHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9BRERSV0lOLCAweDApOworCisJLyogRklYTUUgV3JpdGUgdGhlIGluaXRpYWwgU3RhdGlvbiBEZXNjcmlwdG9yIGZvciB0aGUgY2FyZCAqLworCXN0YV9pbml0KHByaXYsIExPQ0FMX1NUQUlEKTsKKwlzdGFfaW5pdChwcml2LCBCU1NJRF9TVEFJRCk7CisKKwkvKiBFbmFibGUgc3RhaW9uIDAgYW5kIDEgY2FuIGRvIFRYICovCisJLyogSXQgc2VlbWVkIGlmIHdlIHNldCBvdGhlciBiaXQgdG8gMSB0aGUgYml0IDAgd2lsbAorCSAgIGJlIGF1dG8gY2hhbmdlIHRvIDAgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1RYVE9QRUVSLCAweDIgfCAweDEpOworLy8JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9UWFRPUEVFUiwgMHgxKTsKK30gLyogZ2Fpbl9jdGxjbnRfaW5pdCAqLworCisKK3N0YXRpYyB2b2lkIHBoeV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwkvKiBMb2FkIEluaXRpYWxHYWluVGFibGUgKi8KKwlnYWluX3RhYmxlX2luaXQocHJpdik7CisKKyAgCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0FERFJXSU4sIDB4MjAwMDAwMCk7CisKKwkvKiBDbGVhciB0aGUgZm9sbG93aW5nIG9mZnNldHMgaW4gTWVtb3J5IFJhbmdlICMyOiAqLworCW1lbXNldF9pbyhkYXRhICsgMHg1MDQwLCAwLCAweGEgKiA0KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4NTA4MCwgMCwgMHhhICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDUwYzAsIDAsIDB4YSAqIDQpOworCW1lbXNldF9pbyhkYXRhICsgMHg1NDAwLCAwLCAweDgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDYwMDAsIDAsIDB4MjgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDcwMDAsIDAsIDB4MjgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDgwMDAsIDAsIDB4MjgwICogNCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBGb2xsb3dpbmcgUmVnaXN0ZXJzIEFjY29yZGluZyB0byBQQ0kgUmV2aXNpb24gSUQgKi8KKwlpZiAocHJpdi0+cmV2aWQgPT0gMCkgeworCQkvKiBmaXhtZSB0aGUgcGFydCBoYXNuJ3QgYmVlbiB1cGRhdGUgYnV0IGJlbG93IGhhcyBiZWVuIHVwZGF0ZQorCQkgICBiYXNlZCBvbiBXR001MTEgKi8KKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweGYpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MWQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjIsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0FJQ0NIQTBPVkUsIDB4MTEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9BSUNDSEExT1ZFLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMHg2NCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBTCwgMHg0Yik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCAweDRiKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRFVOU0FULCAweDE0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRFNBVCwgMHgyNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RGSVJDQUwsIDB4OCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RHQ1RMMTFBLCAweDFhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfREdDVEwxMUIsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5JTklULCAweGQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USE5PU0lHLCAweDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DT0FSU1RFUCwgMHg3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lGU1QxMUEsIDB4MjgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUZTVDExQiwgMHgyOCk7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfQ1dERVRFQyk7CisJCXJlZyB8PSAweDE7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NXREVURUMsIHJlZyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMzgsIDB4MWUpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkxJU1RBTlQsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAweDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTUVBU0FOVCwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkNBUFRBTlQsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFBLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUDExQiwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQSwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQiwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhMRVZEUk8sIDB4MTApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhSWFRJTUUxMUEsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQiwgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUlRJTUUsIDB4MTkwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAweDc4KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCAweDFjKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUkRST1AsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0QsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFBPV0RJRkYsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RFU1RCVVMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0FOVENGRywgMHgxZik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RISlVNUCwgMHgxNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XRVIsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XQ0xJUCwgMHgzMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDB4MzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFJYMTFCUE9XTUlOLCAweDE5KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNGMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMTUwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MDAsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OTQwYywgMHg2ZmYpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MjgsIDB4YTApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MzQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwNCwgMHgxNSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwYywgMHg3Zik7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMzNCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhjMDAwLCAweDM4ZCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTQwMTgsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTYwMDAsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1NCwgMHhhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzFjLCAweDUpOworCX0gZWxzZSBpZiAocHJpdi0+cmV2aWQgPiAwKSB7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIxLCAweDIxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfQUlDQ0hBME9WRSwgMHgxMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0FJQ0NIQTFPVkUsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RVTlNBVCwgMHgxNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RTQVQsIDB4MjQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ERklSQ0FMLCAweDgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ER0NUTDExQSwgMHgxYSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RHQ1RMMTFCLCAweDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOSU5JVCwgMHhkKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhOT1NJRywgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09BUlNURVAsIDB4Nyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJRlNUMTFBLCAweDI4KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lGU1QxMUIsIDB4MjgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DV0RFVEVDLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl8wWDM4LCAweDFlKTsKKy8vCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUDExQSwgMHgzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFCLCAweDMyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQSwgMHgzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQUlgxMUIsIDB4MzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USExFVkRSTywgMHgxMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQSwgMHgxYWQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhSWFRJTUUxMUIsIDB4YTEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUlRJTUUsIDB4MTkwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUkRST1AsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0QsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ1MsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFBPV0RJRkYsIDB4NCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RFU1RCVVMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RISlVNUCwgMHgxZSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XRVIsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XQ0xJUCwgMHgyYSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDB4M2MpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFJYMTFCUE9XTUlOLCAweDE5KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNGMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMTUwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1dBVENIRE9HLCAweDM3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDAwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MGMsIDB4NmZmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDI4LCAweGEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDM0LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMDQsIDB4MTUpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMGMsIDB4N2YpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMzQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4YzAwMCwgMHgzOGQpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE0LCAweDEwMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE4LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE2MDAwLCAweDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA0LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIDB4YSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWMxYywgMHg1MCk7CisJfSBlbHNlIGlmIChwcml2LT5yZXZpZCA+IDEpIHsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjMTgpOworCQlyZWcgfD0gMHg4OworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjMTgsIHJlZyk7CisJfQorCisJLyogV3JpdGUgdGhlIFRYIEZpciBDb2VmZmljaWVudCBUYWJsZSAqLworCXR4X2Zpcl90YWJsZV9pbml0KHByaXYpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgJj0gfjB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIHJlZyk7CisKKy8qIAlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MWEwMzApOyAqLworLyogCXJlZyAmPSB+MHg0OyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIDB4MWEwMzAsIHJlZyk7ICovCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ0LCAweDExMyk7Cit9IC8qIHBoeV9pbml0ICovCisKK3N0YXRpYyB2b2lkIGNoaXBfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWJhbmRfbWFuYWdlbWVudF9pbml0KHByaXYpOworCisJcmZfY2hpcHNfaW5pdChwcml2KTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnIHw9IDB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgUEhZICovCisJcGh5X2luaXQocHJpdik7CisKKwllbmNyeXB0aW9uX2luaXQocHJpdik7CisKKwl0eF9tYW5hZ2VtZW50X2luaXQocHJpdik7CisKKwlyeF9tYW5hZ2VtZW50X2luaXQocHJpdik7CisKKwlwb3dlcl9tYW5hZ2VfaW5pdChwcml2KTsKKworCS8qIEluaXRpYWxpemUgdGhlIFRpbWVycyAqLworCWFnbnhfdGltZXJfaW5pdChwcml2KTsKKworCS8qIFdyaXRlIDB4YzM5MGJmOSB0byBJbnRlcnJ1cHQgTWFzayAoRGlzYWJsZSBUWCkgKi8KKwlyZWcgPSAweGMzOTBiZjkgJiB+SVJRX1RYX0JFQUNPTjsKKwlyZWcgJj0gfklSUV9UWF9ESVNBQkxFOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfSU5UX01BU0ssIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCk7CisJcmVnIHw9IDB4ODAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgcmVnKTsKKworCS8qIHNldCBpdCB3aGVuIG5lZWQgZ2V0IG11bHRpY2FzdCBlbmFibGU/ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9NVFNNLCAweGZmKTsKK30gLyogY2hpcF9pbml0ICovCisKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wcm9taXNfYW5kX21hbmFnZWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwIHwgMHgyKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwIHwgMHgyKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVhcm5fbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4OCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NjYW5fbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4MjApOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJLyogYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgyMTApOyovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgxMCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21hbmFnZWRfbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4Mik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FkaG9jX21vZGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDApOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgdW5rbm93X3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MCwgMHgzZSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQsIDB4YjIpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg4LCAweDE0MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweGMsIDB4MUMwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTAsIDB4MUZGKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTQsIDB4MUREKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTgsIDB4MTVGKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MWMsIDB4QTEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyMCwgMHgzRTcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyNCwgMHgzNkIpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyOCwgMHgzNDgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyYywgMHgzN0QpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzMCwgMHgzREUpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzNCwgMHgzNik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDM4LCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4M2MsIDB4NTcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg0MCwgMHgyMyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQ0LCAweDNFRCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQ4LCAweDNDOSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDRjLCAweDNDQSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDUwLCAweDNFNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDU0LCAweDgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg1OCwgMHgxRik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDVjLCAweDFhKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjYXJkX2ludGVyZmFjZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTggYnNzaWRbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCXUzMiByZWc7CisJdW5zaWduZWQgaW50IGk7CisJQUdOWF9UUkFDRTsKKworCW1pZ2h0X3NsZWVwKCk7CisJLyogQ2xlYXIgUlggQ29udHJvbCBhbmQgRW5hYmxlIFJYIHF1ZXVlcyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ1RMLCAweDgpOworCisJbWlnaHRfc2xlZXAoKTsKKwkvKiBEbyBhIGZ1bGwgcmVzZXQgb2YgdGhlIGNhcmQgKi8KKwljYXJkX2Z1bGxfcmVzZXQocHJpdik7CisJbWlnaHRfc2xlZXAoKTsKKworCS8qIENoZWNrIGFuZCBzZXQgQ2FyZCBFbmRpYW5uZXNzICovCisJcmVnID0gaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfRU5ESUFOKTsKKwkvKiBUT0RPIElmIG5vdCAweEIzQjJCMUIwIHNldCB0byAweEIzQjJCMUIwICovCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNJUl9FTkRJQU4gaXMgJXhcbiIsIHJlZyk7CisKKworCS8qIENvbmZpZyB0aGUgZWVwcm9tICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGLCAweDcwMDAwODYpOworCXVkZWxheSgxMCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4ODAwMDAwMzMpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKKwlyZWcgfD0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4MCk7CisKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOKTsKKwl1ZGVsYXkoMTApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGKTsKKworCS8qIER1bXAgdGhlIGVlcHJvbSAqLworCWRvIHsKKwkJY2hhciBlZXByb21bMHgxMDAwMDAvMHgxMDBdOworCisJCWZvciAoaSA9IDA7IGkgPCAweDEwMDAwMDsgaSArPSAweDEwMCkgeworCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGLCAweDMwMDAwMDAgKyBpKTsKKwkJCXVkZWxheSgxMyk7CisJCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX1NFUklBTElURik7CisJCQl1ZGVsYXkoNzApOworCQkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOworCQkJZWVwcm9tW2kvMHgxMDBdID0gcmVnICYgMHhGRjsKKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoUEZYICJFRVBST006ICIsIERVTVBfUFJFRklYX05PTkUsIGVlcHJvbSwKKwkJCQkgICAgIEFSUkFZX1NJWkUoZWVwcm9tKSk7CisJfSB3aGlsZSgwKTsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI2KTsKKyAgICAgICAgcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN5c3RlbSBpbnRlcmZhY2UgKi8KKwlzeXN0ZW1faXRmX2luaXQocHJpdik7CisKKwltaWdodF9zbGVlcCgpOworCS8qIENoaXAgSW5pdGlhbGl6YXRpb24gKFBvbGFyaXMpICovCisJY2hpcF9pbml0KHByaXYpOworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIGFudGVubmFlICovCisJYW50ZW5uYV9jYWxpYnJhdGUocHJpdik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4ZWM1MCk7CisJcmVnICY9IH4weDQwOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIDB4MSk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQk1fQk1DVEwpOworCXJlZyB8PSAweDgwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9CTUNUTCwgcmVnKTsKKwllbmFibGVfcmVjZWl2ZXIocHJpdik7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFKTsKKwlyZWcgfD0gMHgyMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgcmVnKTsKKwllbmFibGVfcmVjZWl2ZXIocHJpdik7CisKKwltaWdodF9zbGVlcCgpOworCS8qIEluaXRpYWxpemUgR2FpbiBDb250cm9sIENvdW50cyAqLworCWdhaW5fY3RsY250X2luaXQocHJpdik7CisKKwkvKiBXcml0ZSBJbml0aWFsIFN0YXRpb24gUG93ZXIgVGVtcGxhdGUgZm9yIHRoaXMgc3RhdGlvbigjMCkgKi8KKwlzdGFfcG93ZXJfaW5pdChwcml2LCBMT0NBTF9TVEFJRCk7CisKKwltaWdodF9zbGVlcCgpOworCS8qIEluaXRpYWxpemUgdGhlIHJ4LHRkLHRtIHJpbmdzLCBmb3IgZWFjaCBub2RlIGluIHRoZSByaW5nICovCisJZmlsbF9yaW5ncyhwcml2KTsKKworCW1pZ2h0X3NsZWVwKCk7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHg4MDAwMDAzMyk7CisJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCAweGMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHgwKTsKKworCS8qIEZJWE1FIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVEwsIDB4MTk0YzEpOworCisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworCisJbWlnaHRfc2xlZXAoKTsKKwkvKiBGSVhNRSBTZXQgdGhlIFJlY2VpdmUgQ29udHJvbCBNYWMgQWRkcmVzcyB0byBjYXJkIGFkZHJlc3MgKi8KKwltYWNfYWRkcmVzc19zZXQocHJpdik7CisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBTZXQgdGhlIHJlY2lldmUgcmVxdWVzdCByYXRlICovCisJLyogRklYTUUgRW5hYmxlIHRoZSByZXF1ZXN0ICovCisJLyogQ2hlY2sgcGFja2V0IGxlbmd0aCAqLworCS8qIFNldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCAweDg4MTk1ZTAwKTsgKi8KKy8qIAllbmFibGVfcmVjZWl2ZXIocHJpdik7ICovCisKKwkvKiBTZXQgdGhlIFJlY2VpdmVyIEJTU0lEICovCisJcmVjZWl2ZXJfYnNzaWRfc2V0KHByaXYsIGJzc2lkKTsKKworCS8qIEZJWE1FIFNldCB0byBtYW5hZ2VkIG1vZGUgKi8KKwlzZXRfbWFuYWdlZF9tb2RlKHByaXYpOworLy8Jc2V0X3Byb21pc2N1b3VzX21vZGUocHJpdik7CisvKiAJc2V0X3NjYW5fbW9kZShwcml2KTsgKi8KKy8qIAlzZXRfbGVhcm5fbW9kZShwcml2KTsgKi8KKy8vIAlzZXRfcHJvbWlzX2FuZF9tYW5hZ2VkKHByaXYpOworLy8gCXNldF9hZGhvY19tb2RlKHByaXYpOworCisJLyogU2V0IHRoZSByZWNpZXZlIHJlcXVlc3QgcmF0ZSAqLworCS8qIENoZWNrIHBhY2tldCBsZW5ndGggKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCAweDA4MDAwMDAwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUpOworCS8qIFNldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKi8KKwlyZWcgfD0gMHgwMDE5NWUwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCByZWcpOworCisJLyogQ29uZmlndXJlIHRoZSBSWCBhbmQgVFggaW50ZXJydXB0ICovCisJcmVnID0gRU5BQkxFX1JYX0lOVEVSUlVQVCB8IFJYX0NBQ0hFX0xJTkUgfCBGUkFHX0xFTl8yMDQ4IHwgRlJBR19CRTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9SWENGRywgcmVnKTsKKwkvKiBGSVhNRSAqLworCXJlZyA9IEVOQUJMRV9UWF9JTlRFUlJVUFQgfCBUWF9DQUNIRV9MSU5FIHwgRlJBR19MRU5fMjA0OCB8IEZSQUdfQkU7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhDRkcsIHJlZyk7CisKKwkvKiBFbmFibGUgUlggVFggSW50ZXJydXB0cyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ1RMLCAweDgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwsIDB4ODApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRENUTCwgMHg4MCk7CisKKwkvKiBGSVhNRSBTZXQgdGhlIG1hc3RlciBjb250cm9sIGludGVycnVwdCBpbiBibG9jayBjb250cm9sICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMLCAweDgwMCk7CisKKwkvKiBFbmFibGUgUlggYW5kIFRYIHF1ZXVlcyAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfUlhDVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDVEwsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNQ1RMLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfVFhEQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRENUTCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgMHg1KTsKKwkvKiBGSVhNRSAqLworCS8qICB1bmtub3dfcmVnaXN0ZXJfd3JpdGUocHJpdik7ICovCisJLyogVXBkYXRlIGxvY2FsIGNhcmQgaGFzaCBlbnRyeSAqLworCWhhc2hfd3JpdGUocHJpdiwgcHJpdi0+bWFjX2FkZHIsIExPQ0FMX1NUQUlEKTsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBGSVhNRSAqLworCWFnbnhfc2V0X2NoYW5uZWwocHJpdiwgMSk7CisJbWlnaHRfc2xlZXAoKTsKK30gLyogYWdueF9jYXJkX2ludGVyZmFjZV9pbml0ICovCisKKwordm9pZCBhZ254X2h3X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwlBR05YX1RSQUNFOworCW1pZ2h0X3NsZWVwKCk7CisJY2FyZF9pbnRlcmZhY2VfaW5pdChwcml2KTsKK30KKworaW50IGFnbnhfaHdfcmVzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gY2FyZF9mdWxsX3Jlc2V0KHByaXYpOworfQorCitpbnQgYWdueF9zZXRfc3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWdueF9zZXRfYnNzaWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKmJzc2lkKQoreworCXJlY2VpdmVyX2Jzc2lkX3NldChwcml2LCBic3NpZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTFlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9waHkuaApAQCAtMCwwICsxLDQwOSBAQAorI2lmbmRlZiBBR05YX1BIWV9IXworI2RlZmluZSBBR05YX1BIWV9IXworCisjaW5jbHVkZSAiYWdueC5oIgorCisvKiBUcmFuc21pc3Npb24gTWFuYWdtZW50IFJlZ2lzdGVycyAqLworI2RlZmluZSBBR05YX1RYTV9CQVNFCQkweDAwMDAKKyNkZWZpbmUgQUdOWF9UWE1fQ1RMCQkweDAwMDAJLyogY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBBR05YX1RYTV9FVE1GCQkweDAwMDQgLyogZW5hYmxlIHRyYW5zbWlzc2lvbiBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworI2RlZmluZSBBR05YX1RYTV9UWFRFTVAJCTB4MDAwOCAvKiB0cmFuc21pc3Npb24gdGVtcGxhdGUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fUkVUUllTVEFJRAkweDAwMGMgLyogUmV0cnkgU3RhdGlvbiBJRCAqLworI2RlZmluZSBBR05YX1RYTV9USU1FU1RBTVBMTwkJMHgwMDEwCS8qIFRpbWVzdGFtcCBMbyAqLworI2RlZmluZSBBR05YX1RYTV9USU1FU1RBTVBISQkJMHgwMDE0CS8qIFRpbWVzdGFtcCBIaSAqLworI2RlZmluZSBBR05YX1RYTV9UWERFTEFZCTB4MDAxOCAgLyogdHggZGVsYXkgKi8KKyNkZWZpbmUgQUdOWF9UWE1fVEJUVExPCQkweDAwMjAJLyogdGJ0dCBMbyAqLworI2RlZmluZSBBR05YX1RYTV9UQlRUSEkJCTB4MDAyNAkvKiB0YnR0IEhpICovCisjZGVmaW5lIEFHTlhfVFhNX0JFQUlOVEVSCTB4MDAyOCAvKiBCZWFjb24gSW50ZXJ2YWwgKi8KKyNkZWZpbmUgQUdOWF9UWE1fTkFWCQkweDAwMzAgLyogTkFWICovCisjZGVmaW5lIEFHTlhfVFhNX0NGUE1EVgkJMHgwMDM0IC8qIENGUCBNRFYgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ0ZQRVJDTlQJMHgwMDM4IC8qIENGUCBwZXJpb2QgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fUFJPQkRFTEFZCTB4MDAzYyAvKiBwcm9iZSBkZWxheSAqLworI2RlZmluZSBBR05YX1RYTV9MSVNJTlRFUkNOVAkweDAwNDAgLyogbGlzdGVuIGludGVydmFsIGNvdW50ICovCisjZGVmaW5lIEFHTlhfVFhNX0RUSU1QRVJJQ05UCTB4MDA0YyAvKiBEVElNIHBlcmlvZCBjb3VudCAqLworCisjZGVmaW5lIEFHTlhfVFhNX0JFQUNPTl9DVEwJMHgwMDVjIC8qIGJlYWNvbiBjb250cm9sICovCisKKyNkZWZpbmUgQUdOWF9UWE1fU0NIRU1QQ05UCTB4MDA3YyAvKiBzY2hlZHVsZSBlbXB0eSBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhUSU1PVVQJMHgwMDg0IC8qIG1heCB0aW1lb3V0IGV4Y2VlZCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhDRlBUSU0JMHgwMDg4IC8qIG1heCBDRiBwb2xsIHRpbWVvdXQgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fTUFYUlhUSU1FCTB4MDA4YyAvKiBtYXggUlggdGltZW91dCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhBQ0tUSU0JMHgwMDkwCS8qIG1heCBBQ0sgdGltZW91dCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9ESUYwMQkJMHgwMGEwIC8qIERJRiAwLTEgKi8KKyNkZWZpbmUgQUdOWF9UWE1fRElGMjMJCTB4MDBhNCAvKiBESUYgMi0zICovCisjZGVmaW5lIEFHTlhfVFhNX0RJRjQ1CQkweDAwYTggLyogRElGIDQtNSAqLworI2RlZmluZSBBR05YX1RYTV9ESUY2NwkJMHgwMGFjIC8qIERJRiA2LTcgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0lGU1BJRlMJMHgwMGIwIC8qIFNJRlMvUElGUyAqLworI2RlZmluZSBBR05YX1RYTV9USUZTRUlGUwkweDAwYjQgLyogVElGUy9FSUZTICovCisjZGVmaW5lIEFHTlhfVFhNX01BWENDQUNOVFNMT1QJMHgwMGI4IC8qIG1heCBDQ0EgY291bnQgc2xvdCAqLworI2RlZmluZSBBR05YX1RYTV9TTE9UTElNSVQJMHgwMGJjIC8qIHNsb3QgbGltaXQvMSBtc2VjIGxpbWl0ICovCisjZGVmaW5lIEFHTlhfVFhNX0NGUE9MTFJYVElNCTB4MDBmMCAvKiBDRiBwb2xsIFJYIHRpbWVvdXQgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ0ZBQ0tUMTFCCTB4MDBmNCAvKiBDRiBhY2sgdGltZW91dCBsaW1pdCBmb3IgMTFiICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMAkJMHgwMTAwIC8qIENXIDAgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0wCTB4MDEwOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAwICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMQkJMHgwMTIwIC8qIENXIDEgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0xCTB4MDEyOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAxICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMgkJMHgwMTQwIC8qIENXIDIgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0yCTB4MDE0OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAyICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMwkJMHgwMTYwIC8qIENXIDMgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0zCTB4MDE2OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAzICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNAkJMHgwMTgwIC8qIENXIDQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU00CTB4MDE4OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA0ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNQkJMHgwMWEwIC8qIENXIDUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU01CTB4MDFhOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA1ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNgkJMHgwMWMwIC8qIENXIDYgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU02CTB4MDFjOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA2ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNwkJMHgwMWUwIC8qIENXIDcgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU03CTB4MDFlOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA3ICovCisjZGVmaW5lIEFHTlhfVFhNX0JFQUNPTlRFTVAgICAgIDB4MTAwMAkvKiBiZWFjb24gdGVtcGxhdGUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU1RBUE9XVEVNUAkweDFhMDAgLyogIFN0YXRpb24gUG93ZXIgVGVtcGxhdGUgKi8KKworLyogUmVjZWl2ZSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFHTlhfUlhNX0JBU0UJCTB4MjAwMAorI2RlZmluZSBBR05YX1JYTV9SRVFSQVRFCTB4MjAwMAkvKiByZXF1ZXN0ZWQgcmF0ZSAqLworI2RlZmluZSBBR05YX1JYTV9NQUNISQkJMHgyMDA0CS8qIGZpcnN0IDQgYnl0ZXMgb2YgbWFjIGFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9SWE1fTUFDTE8JCTB4MjAwOAkvKiBsYXN0IDIgYnl0ZXMgb2YgbWFjIGFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQlNTSURISQkweDIwMGMJLyogYnNzaWQgaGkgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQlNTSURMTwkweDIwMTAJLyogYnNzaWQgbG8gKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9DTURfRkxBRwkweDIwMTQJLyogRmxhZ3MgZm9yIHRoZSBSWCBIYXNoIENvbW1hbmQgRGVmYXVsdDowICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gJMHgyMDE4CS8qIFRoZSBIaWdoIGhhbGYgb2YgdGhlIEhhc2ggQ29tbWFuZCAqLworI2RlZmluZSBBR05YX1JYTV9IQVNIX0NNRF9MT1cJMHgyMDFjCS8qIFRoZSBMb3cgaGFsZiBvZiB0aGUgSGFzaCBDb21tYW5kICovCisjZGVmaW5lIEFHTlhfUlhNX1JPVVRBQgkJMHgyMDIwCS8qIHJvdXRpbmcgdGFibGUgKi8KKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1NISUZUCTI0CisjZGVmaW5lCQlST1VUQUJfVFlQRV9TSElGVAkyOAorI2RlZmluZQkJUk9VVEFCX1NUQVRVU19TSElGVAkzMAorI2RlZmluZQkJUk9VVEFCX1JXX1NISUZUCQkzMQorI2RlZmluZQkJUk9VVEFCX1JPVVRFX0RST1AJMHhmMDAwMDAgLyogRHJvcCAqLworI2RlZmluZQkJUk9VVEFCX1JPVVRFX0NQVQkweDQwMDAwMCAvKiBDUFUgKi8KKyNkZWZpbmUJCVJPVVRBQl9ST1VURV9FTkNSWQkweDUwMDgwMCAvKiBFbmNyeXB0aW9uICovCisjZGVmaW5lCQlST1VUQUJfUk9VVEVfUkZQCTB4ODAwMDAwIC8qIFJGUCAqLworCisjZGVmaW5lCQlST1VUQUJfVFlQRV9NQU5BRwkweDAgLyogTWFuYWdlbWVudCAqLworI2RlZmluZQkJUk9VVEFCX1RZUEVfQ1RMCQkweDEgLyogQ29udHJvbCAqLworI2RlZmluZQkJUk9VVEFCX1RZUEVfREFUQQkweDIgLyogRGF0YSAqLworCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9EQVRBCQkweDAKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX0RBVEFBQ0sJCTB4MQorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfREFUQVBPTEwJCTB4MgorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfREFUQVBPTExBQ0sJMHgzCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMCQkweDQgLyogTlVMTCAqLworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfTlVMTEFDSwkJMHg1CisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMUE9MTAkJMHg2CisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMUE9MTEFDSwkweDcKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU0RBVEEJCTB4OCAvKiBRT1MgREFUQSAqLworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDSwkweDkKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU0RBVEFQT0xMCTB4YQorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDS1BPTEwJMHhiCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NOVUxMCQkweGMKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU05VTExBQ0sJMHhkCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NOVUxMUE9MTAkweGUKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU05VTExQT0xMQUNLCTB4ZgorI2RlZmluZSBBR05YX1JYTV9ERUxBWTExCSAgIDB4MjAyNAkvKiBkZWxheSAxMShBQikgKi8KKyNkZWZpbmUgQUdOWF9SWE1fU09GX0NOVAkgICAweDIwMjgJLyogU09GIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0ZSQUdfQ05UCSAgIDB4MjAyYwkvKiBGcmFnbWVudCBDb3VudCovCisjZGVmaW5lIEFHTlhfUlhNX0ZDU19DTlQJICAgMHgyMDMwCS8qIEZDUyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9CU1NJRF9NSVNTX0NOVAkgICAweDIwMzQJLyogQlNTSUQgTWlzcyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9QRFVfRVJSX0NOVAkgICAweDIwMzgJLyogUERVIEVycm9yIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0RFU1RfTUlTU19DTlQJICAgMHgyMDNDCS8qIERlc3RpbmF0aW9uIE1pc3MgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fRFJPUF9DTlQJICAgMHgyMDQwCS8qIERyb3AgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQUJPUlRfQ05UCSAgIDB4MjA0NAkvKiBBYm9ydCBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9SRUxBWV9DTlQJICAgMHgyMDQ4CS8qIFJlbGF5IENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfTUlTU19DTlQJICAgMHgyMDRjCS8qIEhhc2ggTWlzcyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9TQV9ISQkJICAgMHgyMDUwCS8qIEFkZHJlc3Mgb2YgcmVjZWl2ZWQgcGFja2V0IEhpICovCisjZGVmaW5lIEFHTlhfUlhNX1NBX0xPCQkgICAweDIwNTQJLyogQWRkcmVzcyBvZiByZWNlaXZlZCBwYWNrZXQgTG8gKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9EVU1QX0xTVAkgICAweDIxMDAJLyogQ29udGFpbnMgSGFzaCBEYXRhICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfRFVNUF9NU1QJICAgMHgyMTA0CS8qIENvbnRhaW5zIEhhc2ggRGF0YSAqLworI2RlZmluZSBBR05YX1JYTV9IQVNIX0RVTVBfREFUQSAgICAweDIxMDgJLyogVGhlIFN0YXRpb24gSUQgdG8gZHVtcCAqLworCisKKy8qIEVuY3J5cHRpb24gTWFuYWdtZW50ICovCisjZGVmaW5lIEFHTlhfRU5DUllfQkFTRQkJMHgyNDAwCisjZGVmaW5lIEFHTlhfRU5DUllfV0VQS0VZMAkweDI0NDAgLyogd2VwIGtleSAjMCAqLworI2RlZmluZSBBR05YX0VOQ1JZX1dFUEtFWTEJMHgyNDQ0IC8qIHdlcCBrZXkgIzEgKi8KKyNkZWZpbmUgQUdOWF9FTkNSWV9XRVBLRVkyCTB4MjQ0OCAvKiB3ZXAga2V5ICMyICovCisjZGVmaW5lIEFHTlhfRU5DUllfV0VQS0VZMwkweDI0NGMgLyogd2VwIGtleSAjMyAqLworI2RlZmluZSBBR05YX0VOQ1JZX0NDTVJFQ1RMCTB4MjQ2MCAvKiBjY20gcmVwbGF5IGNvbnRyb2wgKi8KKworCisvKiBCYW5kIE1hbmFnZW1lbnQgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFHTlhfQk1fQkFTRQkJMHgyYzAwCisjZGVmaW5lIEFHTlhfQk1fQk1DVEwJCTB4MmMwMCAgLyogYmFuZCBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9UWFdBRERSCQkweDJjMTggIC8qIHR4IHdvcmtxdWV1ZSBhZGRyZXNzIHN0YXJ0ICovCisjZGVmaW5lIEFHTlhfQk1fVFhUT1BFRVIJMHgyYzI0CS8qIHRyYW5zbWl0IHRvIHBlZXJzICovCisjZGVmaW5lIEFHTlhfQk1fRlBMSFAJCTB4MmMyYyAgLyogZnJlZSBwb29sIGxpc3QgaGVhZCBwb2ludGVyICovCisjZGVmaW5lIEFHTlhfQk1fRlBMVFAJCTB4MmMzMCAgLyogZnJlZSBwb29sIGxpc3QgdGFpbCBwb2ludGVyICovCisjZGVmaW5lIEFHTlhfQk1fRlBDTlQJCTB4MmMzNCAgLyogZnJlZSBwb29sIGNvdW50ICovCisjZGVmaW5lIEFHTlhfQk1fQ0lQRFVXQ05UCTB4MmMzOCAgLyogY2FyZCBpbnRlcmZhY2UgcGR1IHdvcmtxdWV1ZSBjb3VudCAqLworI2RlZmluZSBBR05YX0JNX1NQUERVV0NOVAkweDJjM2MgIC8qIHNwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9SRlBQRFVXQ05UCTB4MmM0MCAgLyogcmZwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9SSFBQRFVXQ05UCTB4MmM0NCAgLyogcmhwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9DSVdRQ1RMCQkweDJjNDggLyogQ2FyZCBJbnRlcmZhY2UgV29ya1F1ZXVlIENvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVUWFdDVEwJMHgyYzUwICAvKiBjcHUgdHggd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVSWFdDVEwJMHgyYzU4ICAvKiBjcHUgcnggd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVMV0NUTAkweDJjNjAgLyogY3B1IGxvdyB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX0NQVUhXQ1RMCTB4MmM2OCAvKiBjcHUgaGlnaCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1NQVFhXQ1RMCTB4MmM3MCAvKiBzcCB0eCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1NQUlhXQ1RMCTB4MmM3OCAvKiBzcCByeCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1JGUFdDVEwJCTB4MmM4MCAvKiBSRlAgd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9NVFNNCQkweDJjOTAgLyogTXVsdGljYXN0IFRyYW5zbWl0IFN0YXRpb24gTWFzayAqLworCisvKiBDYXJkIEludGVyZmFjZSBSZWdpc3RlcnMgKDMyYml0cykgKi8KKyNkZWZpbmUgQUdOWF9DSVJfQkFTRQkJMHgzMDAwCisjZGVmaW5lIEFHTlhfQ0lSX0JMS0NUTAkJMHgzMDAwCS8qIGJsb2NrIGNvbnRyb2wqLworI2RlZmluZQkJQUdOWF9TVEFUX1RYCTB4MQorI2RlZmluZQkJQUdOWF9TVEFUX1JYCTB4MgorI2RlZmluZQkJQUdOWF9TVEFUX1gJMHg0CisvKiBCZWxvdyB0d28gaW50ZXJydXB0IGZsYWdzIHdpbGwgYmUgc2V0IGJ5IG91ciBidXQgbm90IENQVSBvciB0aGUgY2FyZCAqLworI2RlZmluZQkJQUdOWF9TVEFUX1RYRAkweDEwCisjZGVmaW5lCQlBR05YX1NUQVRfVFhNCTB4MjAKKworI2RlZmluZSBBR05YX0NJUl9BRERSV0lOCTB4MzAwNAkvKiBBZGRyZXNzYWJsZSBXaW5kb3dzKi8KKyNkZWZpbmUgQUdOWF9DSVJfRU5ESUFOCQkweDMwMDggIC8qIGNhcmQgZW5kaWFubmVzcyAqLworI2RlZmluZSBBR05YX0NJUl9TRVJJQUxJVEYJMHgzMDIwCS8qIHNlcmlhbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDRkcJCTB4MzA0MAkvKiByZWNlaXZlIGNvbmZpZyAqLworI2RlZmluZQkJRU5BQkxFX1JYX0lOVEVSUlVQVCAweDIwCisjZGVmaW5lCQlSWF9DQUNIRV9MSU5FCSAgICAweDgKKy8qIHRoZSBSWCBmcmFnbWVudCBsZW5ndGggKi8KKyNkZWZpbmUJCUZSQUdfTEVOXzI1NgkweDAgLyogMjU2QiAqLworI2RlZmluZQkJRlJBR19MRU5fNTEyCTB4MQorI2RlZmluZQkJRlJBR19MRU5fMTAyNAkweDIKKyNkZWZpbmUJCUZSQUdfTEVOXzIwNDgJMHgzCisjZGVmaW5lCQlGUkFHX0JFCQkweDEwCisjZGVmaW5lIEFHTlhfQ0lSX1JYQ1RMCQkweDMwNTAJLyogcmVjZWl2ZSBjb250cm9sICovCisvKiBtZW1vcnkgYWRkcmVzcywgY2hpcHNpZGUgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDTVNUQVJUCTB4MzA1NAkvKiByZWNlaXZlIGNsaWVudCBtZW1vcnkgc3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDTUVORAkweDMwNTgJLyogcmVjZWl2ZSBjbGllbnQgbWVtb3J5IGVuZCAqLworLyogbWVtb3J5IGFkZHJlc3MsIHBjaSAqLworI2RlZmluZSBBR05YX0NJUl9SWEhPU1RBRERSCTB4MzA2MAkvKiByZWNlaXZlIGhvc3RzaWRlIGFkZHJlc3MgKi8KKy8qIG1lbW9yeSBhZGRyZXNzLCBjaGlwc2lkZSAqLworI2RlZmluZSBBR05YX0NJUl9SWENMSUFERFIJMHgzMDY0CS8qIHJlY2VpdmUgY2xpZW50c2lkZSBhZGRyZXNzICovCisjZGVmaW5lIEFHTlhfQ0lSX1JYRE1BQ1RMCTB4MzA2OAkvKiByZWNlaXZlIGRtYSBjb250cm9sICovCisjZGVmaW5lIEFHTlhfQ0lSX1RYQ0ZHCQkweDMwODAJLyogdHJhbnNtaXQgY29uZmlnICovCisjZGVmaW5lIEFHTlhfQ0lSX1RYTUNUTAkJMHgzMDkwIC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgQ29udHJvbCAqLworI2RlZmluZQkJRU5BQkxFX1RYX0lOVEVSUlVQVCAweDIwCisjZGVmaW5lCQlUWF9DQUNIRV9MSU5FCSAgICAweDgKKyNkZWZpbmUgQUdOWF9DSVJfVFhNU1RBUlQJMHgzMDk0IC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgU3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhNRU5ECQkweDMwOTggLyogVHJhbnNtaXQgTWFuYWdlbWVudCBFbmQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhEQ1RMCQkweDMwYTAJLyogdHJhbnNtaXQgZGF0YSBjb250cm9sICovCisvKiBtZW1lb3J5IGFkZHJlc3MsIGNoaXBzZXQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhEU1RBUlQJMHgzMGE0CS8qIHRyYW5zbWl0IGRhdGEgc3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhERU5ECQkweDMwYTgJLyogdHJhbnNtaXQgZGF0YSBlbmQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhNSEFERFIJMHgzMGIwIC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgSG9zdHNpZGUgQWRkcmVzcyAqLworI2RlZmluZSBBR05YX0NJUl9UWE1DQUREUgkweDMwYjQgLyogVHJhbnNtaXQgTWFuYWdlbWVudCBDbGllbnRzaWRlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhETUFDVEwJMHgzMGI4CS8qIHRyYW5zbWl0IGRtYSBjb250cm9sICovCisKKworLyogUG93ZXIgTWFuYWdtZW50IFVuaXQgKi8KKyNkZWZpbmUgQUdOWF9QTV9CQVNFCQkweDNjMDAKKyNkZWZpbmUgQUdOWF9QTV9QTUNUTAkJMHgzYzAwCS8qIFBNIENvbnRyb2wqLworI2RlZmluZSBBR05YX1BNX01BQ01TVwkJMHgzYzA4IC8qIE1BQyBNYW51YWwgU2xvdyBXb3JrIEVuYWJsZSAqLworI2RlZmluZSBBR05YX1BNX1JGQ1RMCQkweDNjMGMgLyogUkYgQ29udHJvbCAqLworI2RlZmluZSBBR05YX1BNX1BIWU1XCQkweDNjMTQJLyogUGh5IE1hbm5hbCBXb3JrICovCisjZGVmaW5lIEFHTlhfUE1fU09GVFJTVAkJMHgzYzE4CS8qIFBNVSBTb2Z0IFJlc2V0ICovCisjZGVmaW5lIEFHTlhfUE1fUExMQ1RMCQkweDNjMWMJLyogUE1VIFBMTCBjb250cm9sKi8KKyNkZWZpbmUgQUdOWF9QTV9URVNUUEhZCQkweDNjMjQgLyogUE1VIFRlc3QgUGh5ICovCisKKworLyogSW50ZXJydXB0IENvbnRyb2wgaW50ZXJmYWNlICovCisjZGVmaW5lIEFHTlhfSU5UX0JBU0UJCTB4NDAwMAorI2RlZmluZSBBR05YX0lOVF9TVEFUCQkweDQwMDAJLyogaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBBR05YX0lOVF9NQVNLCQkweDQwMGMJLyogaW50ZXJydXB0IG1hc2sgKi8KKy8qIEZJWE1FICovCisjZGVmaW5lCQlJUlFfVFhfQkVBQ09OCTB4MQkvKiBUWCBCZWFjb24gKi8KKyNkZWZpbmUJCUlSUV9UWF9SRVRSWQkweDgJLyogVFggUmV0cnkgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfVFhfQUNUSVZJVFkJMHgxMAkvKiBUWCBBY3Rpdml0eSAqLworI2RlZmluZQkJSVJRX1JYX0FDVElWSVRZCTB4MjAJLyogUlggQWN0aXZpdHkgKi8KKy8qIEZJWE1FIEkgZ3Vlc3MgdGhhdCBpbnN0ZWFkIFJYIGEgbm9uZSBleGlzdCBzdGFpb24ncyBwYWNrZXQgb3IKKyAgIHRoZSBzdGF0aW9uIGhhc24ndCBiZWVuIGluaXQgKi8KKyNkZWZpbmUJCUlSUV9SWF9YCTB4NDAKKyNkZWZpbmUJCUlSUV9SWF9ZCTB4ODAJLyogUlggPyAqLworI2RlZmluZQkJSVJRX1JYX0hBU0hISVQJMHgxMDAJLyogUlggSGFzaCBIaXQgKi8KKyNkZWZpbmUJCUlSUV9SWF9GUkFNRQkweDIwMAkvKiBSWCBGcmFtZSAqLworI2RlZmluZQkJSVJRX0VSUl9JTlQJMHg0MDAJLyogRXJyb3IgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfVFhfUVVFX0ZVTEwJMHg4MDAJLyogVFggV29ya3F1ZXVlIEZ1bGwgKi8KKyNkZWZpbmUJCUlSUV9CQU5ETUFOX0VSUgkweDEwMDAwCS8qIEJhbmR3aWR0aCBNYW5hZ2VtZW50IEVycm9yICovCisjZGVmaW5lCQlJUlFfVFhfRElTQUJMRQkweDIwMDAwCS8qIFRYIERpc2FibGUgKi8KKyNkZWZpbmUJCUlSUV9SWF9JVkFTRVNLRVkgMHg4MDAwMCAvKiBSWCBJbnZhbGlkIFNlc3Npb24gS2V5ICovCisjZGVmaW5lCQlJUlFfUlhfS0VZSURNSVMJMHgxMDAwMDAgLyogUlgga2V5IElEIE1pc21hdGNoICovCisjZGVmaW5lCQlJUlFfUkVQX1RISElUCTB4MjAwMDAwIC8qIFJlcGxheSBUaHJlc2hvbGQgSGl0ICovCisjZGVmaW5lCQlJUlFfVElNRVIxCTB4NDAwMDAwMCAvKiBUaW1lcjEgKi8KKyNkZWZpbmUJCUlSUV9USU1FUl9DTlQJMHgxMDAwMDAwMCAvKiBUaW1lciBDb3VudCAqLworI2RlZmluZQkJSVJRX1BIWV9GQVNUSU5UIDB4MjAwMDAwMDAgLyogUGh5IEZhc3QgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfUEhZX1NMT1dJTlQJMHg0MDAwMDAwMCAvKiBQaHkgU2xvdyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUlSUV9PVEhFUgkweDgwMDAwMDAwIC8qIFVua25vdyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUFHTlhfSVJRX0FMTCAgIAkweGZmZmZmZmZmCisKKy8qIFN5c3RlbSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9TWVNJVEZfQkFTRQkweDQ0MDAKKyNkZWZpbmUgQUdOWF9TWVNJVEZfU1lTTU9ERQkweDQ0MDAJLyogc3lzdGVtIG1vZGUgKi8KKyNkZWZpbmUgQUdOWF9TWVNJVEZfR1BJT0lOCTB4NDQxMCAvKiBHUElPIEluICovCisvKiBQSU4gbGluZXMgZm9yIGxlZHM/ICovCisjZGVmaW5lIEFHTlhfU1lTSVRGX0dQSU9VVAkweDQ0MTQJLyogR1BJTyBPdXQgKi8KKworLyogVGltZXIgQ29udHJvbCAqLworI2RlZmluZSBBR05YX1RJTUNUTF9USU1FUjEJMHg0ODAwIC8qIFRpbWVyIDEgKi8KKyNkZWZpbmUgQUdOWF9USU1DVExfVElNMUNUTAkweDQ4MDggLyogVGltZXIgMSBDb250cm9sICovCisKKworLyogQW50ZW5uYSBDYWxpYnJhdGlvbiBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfQkFTRQkJMHg1MDAwCisjZGVmaW5lIEFHTlhfQUNJX01PREUJCTB4NTAwMCAvKiBNb2RlICovCisjZGVmaW5lIEFHTlhfQUNJX01FQVNVUkUJMHg1MDA0IC8qIE1lYXN1cmUgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfU0VMQ0hBSU4JMHg1MDA4IC8qIFNlbGVjdCBDaGFpbiAqLworI2RlZmluZSBBR05YX0FDSV9MRU4JCTB4NTAwYyAvKiBMZW5ndGggKi8KKyNkZWZpbmUgQUdOWF9BQ0lfVElNRVIxCQkweDUwMTggLyogVGltZXIgMSAqLworI2RlZmluZSBBR05YX0FDSV9USU1FUjIJCTB4NTAxYyAvKiBUaW1lciAyICovCisjZGVmaW5lIEFHTlhfQUNJX09GRlNFVAkJMHg1MDIwIC8qIE9mZnNldCAqLworI2RlZmluZSBBR05YX0FDSV9TVEFUVVMJCTB4NTAzMCAvKiBTdGF0dXMgKi8KKyNkZWZpbmUJCUNBTElfSURMRQkweDAKKyNkZWZpbmUJCUNBTElfRE9ORQkweDEKKyNkZWZpbmUJCUNBTElfQlVTWQkweDIKKyNkZWZpbmUJCUNBTElfRVJSCTB4MworI2RlZmluZSBBR05YX0FDSV9BSUNDSEEwT1ZFCTB4NTAzNCAvKiBBSUMgQ2hhbm5lbCAwIE92ZXJyaWRlICovCisjZGVmaW5lIEFHTlhfQUNJX0FJQ0NIQTFPVkUJMHg1MDM4IC8qIEFJQyBDaGFubmVsIDEgT3ZlcnJpZGUgKi8KKworLyogR2FpbiBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBBR05YX0dDUl9CQVNFCQkweDkwMDAKKy8qIHRocmVzaG9sZCBvZiBwcmltYXJ5IGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhEMEEJCTB4OTAwMAkvKiB0aHJlc2hvbGQ/IEQwIEEgKi8KKy8qIGxvdyB0aHJlc2hvbGQgb2YgcHJpbWFyeSBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX1RIRDBBTAkJMHg5MDA0CS8qIHRocmVzaG9sZD8gRDAgQSBsb3cgKi8KKy8qIHRocmVzaG9sZCBvZiBzZWNvbmRhcnkgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9USEQwQgkJMHg5MDA4CS8qIHRocmVzaG9sZD8gRDBfQiAqLworI2RlZmluZSBBR05YX0dDUl9EVU5TQVQJCTB4OTAwYyAvKiBkIHVuc2F0dXJhdGVkICovCisjZGVmaW5lIEFHTlhfR0NSX0RTQVQJCTB4OTAxMCAvKiBkIHNhdHVyYXRlZCAqLworI2RlZmluZSBBR05YX0dDUl9ERklSQ0FMCTB4OTAxNCAvKiBEIEZpci9DYWwgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfREdDVEwxMUEJMHg5MDE4IC8qIGQgZ2FpbiBjb250cm9sIDExYSAqLworI2RlZmluZSBBR05YX0dDUl9ER0NUTDExQgkweDkwMWMgLyogZCBnYWluIGNvbnRyb2wgMTFiICovCisvKiBzdHJlbmd0aCBvZiBnYWluICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5JTklUCTB4OTAyMAkvKiBnYWluIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIEFHTlhfR0NSX1RITk9TSUcJMHg5MDI0IC8qIHRocmVob2xkIG5vIHNpZ25hbCAqLworI2RlZmluZSBBR05YX0dDUl9DT0FSU1RFUAkweDkwMjggLyogY29hcnNlIHN0ZXBwaW5nICovCisjZGVmaW5lIEFHTlhfR0NSX1NJRlNUMTFBCTB4OTAyYyAvKiBzaWZ4IHRpbWUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1NJRlNUMTFCCTB4OTAzMCAvKiBzaWZ4IHRpbWUgMTFiICovCisjZGVmaW5lIEFHTlhfR0NSX0NXREVURUMJMHg5MDM0IC8qIGN3IGRldGVjdGlvbiAqLworI2RlZmluZSBBR05YX0dDUl8wWDM4CQkweDkwMzggLyogPz8/PyAqLworI2RlZmluZSBBR05YX0dDUl9CT0FDVAkJMHg5MDNjCS8qIEJPIEFjdGl2ZSAqLworI2RlZmluZSBBR05YX0dDUl9CT0lOQUNUCTB4OTA0MAkvKiBCTyBJbmFjdGl2ZSAqLworI2RlZmluZSBBR05YX0dDUl9CT0RZTkEJCTB4OTA0NAkvKiBCTyBkeW5hbWljICovCisvKiA4MDIuMTEgbW9kZShhLGIsZykgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfRElTQ09WTU9ECTB4OTA0OAkvKiBkaXNjb3ZlcnkgbW9kZSAqLworI2RlZmluZSBBR05YX0dDUl9OTElTVEFOVAkweDkwNGMJLyogbnVtYmVyIG9mIGxpc3RlbmluZyBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX05BQ1RJQU5UCTB4OTA1MAkvKiBudW1iZXIgb2YgYWN0aXZlIGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTk1FQVNBTlQJMHg5MDU0CS8qIG51bWJlciBvZiBtZWFzdXJpbmcgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9OQ0FQVEFOVAkweDkwNTgJLyogbnVtYmVyIG9mIGNhcHR1cmUgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9USENBUDExQQkweDkwNWMgLyogdGhyZXNob2xkIGNhcHR1cmUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1RIQ0FQMTFCCTB4OTA2MCAvKiB0aHJlc2hvbGQgY2FwdHVyZSAxMWIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDQVBSWDExQQkweDkwNjQgLyogdGhyZXNob2xkIGNhcHR1cmUgcnggMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1RIQ0FQUlgxMUIJMHg5MDY4IC8qIHRocmVzaG9sZCBjYXB0dXJlIHJ4IDExYiAqLworI2RlZmluZSBBR05YX0dDUl9USExFVkRSTwkweDkwNmMgLyogdGhyZXNob2xkIGxldmVsIGRyb3AgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfR0FJTlNFVDAJMHg5MDcwIC8qIEdhaW5zZXQgMCAqLworI2RlZmluZSBBR05YX0dDUl9HQUlOU0VUMQkweDkwNzQgLyogR2FpbnNldCAxICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5TRVQyCTB4OTA3OCAvKiBHYWluc2V0IDIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTUFYUlhUSU1FMTFBCTB4OTA3YyAvKiBtYXhpbXVtIHJ4IHRpbWUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX01BWFJYVElNRTExQgkweDkwODAgLyogbWF4aW11bSByeCB0aW1lIDExYiAqLworI2RlZmluZSBBR05YX0dDUl9DT1JSVElNRQkweDkwODQgLyogY29ycmVjdGlvbiB0aW1lICovCisvKiByZXNldCB0aGUgc3Vic3lzdGVtLCAwID0gZGlzYWJsZSwgMSA9IGVuYWJsZSAqLworI2RlZmluZSBBR05YX0dDUl9SU1RHQ1RMCTB4OTA4OAkvKiByZXNldCBnYWluIGNvbnRyb2wgKi8KKy8qIGNoYW5uZWwgcmVjZWl2aW5nICovCisjZGVmaW5lIEFHTlhfR0NSX1JYQ0hBTkVMCTB4OTA4YwkvKiByZWNlaXZlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTk9JU0UwCQkweDkwOTAgLyogTm9pc2UgMCAqLworI2RlZmluZSBBR05YX0dDUl9OT0lTRTEJCTB4OTA5NCAvKiBOb2lzZSAxICovCisjZGVmaW5lIEFHTlhfR0NSX05PSVNFMgkJMHg5MDk4IC8qIE5vaXNlIDIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfU0lHSFRICQkweDkwOWMJLyogU2lnbmFsIEhpZ2ggVGhyZXNob2xkICovCisjZGVmaW5lIEFHTlhfR0NSX1NJR0xUSAkJMHg5MGEwCS8qIFNpZ25hbCBMb3cgVGhyZXNob2xkICovCisjZGVmaW5lIEFHTlhfR0NSX0NPUlJEUk9QCTB4OTBhNCAvKiBjb3JyZWN0aW9uIGRyb3AgKi8KKy8qIHRocmVzaG9sZCBvZiB0ZXJ0aWF5IGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDRAkJMHg5MGE4CS8qIHRocmVzaG9sZD8gQ0QgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDUwkJMHg5MGFjCS8qIHRocmVzaG9sZD8gQ1MgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTUFYUE9XRElGRgkweDkwYjggLyogbWF4aW11bSBwb3dlciBkaWZmZXJlbmNlICovCisjZGVmaW5lIEFHTlhfR0NSX1RSQUNOVDQJMHg5MGVjIC8qIFRyYW5zaXRpb24gQ291bnQgNCAqLworI2RlZmluZSBBR05YX0dDUl9UUkFDTlQ1ICAgICAgCTB4OTBmMAkvKiB0cmFuc2l0aW9uIGNvdW50IDUgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVFJBQ05UNiAgICAgICAJMHg5MGY0CS8qIHRyYW5zaXRpb24gY291bnQgNiAqLworI2RlZmluZSBBR05YX0dDUl9UUkFDTlQ3ICAgICAgIAkweDkwZjgJLyogdHJhbnNpdGlvbiBjb3V0biA3ICovCisjZGVmaW5lIEFHTlhfR0NSX1RFU1RCVVMJMHg5MTFjIC8qIHRlc3QgYnVzICovCisjZGVmaW5lIEFHTlhfR0NSX0NIQUlOTlVNCTB4OTEyMCAvKiBOdW1iZXIgb2YgQ2hhaW5zICovCisjZGVmaW5lIEFHTlhfR0NSX0FOVENGRwkJMHg5MTI0CS8qIEFudGVubmEgQ29uZmlnICovCisjZGVmaW5lIEFHTlhfR0NSX1RISlVNUAkJMHg5MTJjIC8qIHRocmVob2xkIGp1bXAgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhQT1dFUgkweDkxMzAgLyogdGhyZXNob2xkIHBvd2VyICovCisjZGVmaW5lIEFHTlhfR0NSX1RIUE9XQ0xJUAkweDkxMzQgLyogdGhyZXNob2xkIHBvd2VyIGNsaXAqLworI2RlZmluZSBBR05YX0dDUl9GT1JDRUNUTENMSwkweDkxMzggLyogRm9yY2UgR2FpbiBDb250cm9sIENsb2NrICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5TRVRXUklURQkweDkxM2MgLyogR2FpbnNldCBXcml0ZSAqLworI2RlZmluZSBBR05YX0dDUl9USEQwQlRGRVNUCTB4OTE0MAkvKiB0aHJlc2hvbGQgZDAgYiB0ZiBlc3RpbWF0ZSAqLworI2RlZmluZSBBR05YX0dDUl9USFJYMTFCUE9XTUlOCTB4OTE0NAkvKiB0aHJlc2hvbGQgcnggMTFiIHBvd2VyIG1pbmltdW0gKi8KKyNkZWZpbmUgQUdOWF9HQ1JfMFgxNGMJCTB4OTE0YyAvKiA/PyAqLworI2RlZmluZSBBR05YX0dDUl8wWDE1MAkJMHg5MTUwIC8qID8/ICovCisjZGVmaW5lIEFHTlhfR0NSX1JYT1ZFUklERQkweDkxOTQJLyogcmVjaWV2ZSBvdmVycmlkZSAqLworI2RlZmluZSBBR05YX0dDUl9XQVRDSERPRwkweDkxYjAJLyogd2F0Y2hkb2cgdGltZW91dCAqLworCisKKy8qIFNwaSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9TUElfQkFTRQkJMHhkYzAwCisjZGVmaW5lIEFHTlhfU1BJX0NGRwkJMHhkYzAwIC8qIHNwaSBjb25maWd1cmF0aW9uICovCisvKiBPbmx5IGFjY2VwdCAxNiBiaXRzICovCisjZGVmaW5lIEFHTlhfU1BJX1dNU1cJCTB4ZGMwNAkvKiB3cml0ZSBtb3N0IHNpZ25pZmljYW50IHdvcmQgKi8KKy8qIE9ubHkgYWNjZXB0IDE2IGJpdHMgKi8KKyNkZWZpbmUgQUdOWF9TUElfV0xTVwkJMHhkYzA4CS8qIHdyaXRlIGxlYXN0IHNpZ25pZmljYW50IHdvcmQgKi8KKyNkZWZpbmUgQUdOWF9TUElfQ1RMCQkweGRjMGMJLyogc3BpIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9TUElfUk1TVwkJMHhkYzEwIC8qIHJlYWQgbW9zdCBzaWduaWZpY2FudCB3b3JkICovCisjZGVmaW5lIEFHTlhfU1BJX1JMU1cJCTB4ZGMxNCAvKiByZWFkIGxlYXN0IHNpZ25pZmljYW50IHdvcmQgKi8KKy8qIFNQSSBDb250cm9sIE1hc2sgKi8KKyNkZWZpbmUJCVNQSV9SRUFEX0NUTAkJMHg0MDAwIC8qIHJlYWQgY29udHJvbCAqLworI2RlZmluZQkJU1BJX0JVU1lfQ1RMCQkweDgwMDAgLyogYnVzeSBjb250cm9sICovCisvKiBSRiBhbmQgc3ludGggY2hpcHMgaW4gc3BpICovCisjZGVmaW5lCQlSRl9DSElQMAkweDQwMAorI2RlZmluZQkJUkZfQ0hJUDEJMHg4MDAKKyNkZWZpbmUJCVJGX0NISVAyCTB4MTAwMAorI2RlZmluZQkJU1lOVEhfQ0hJUAkweDIwMDAKKworLyogVW5rbm93biByZWdpc3RlciAqLworI2RlZmluZSBBR05YX1VOS05PV05fQkFTRQkweDc4MDAKKworLyogRklYTUUgTW9uaXRvckdhaW4gKi8KKyNkZWZpbmUgQUdOWF9NT05HQ1JfQkFTRQkweDEyMDAwCisKKy8qIEdhaW4gVGFibGUgKi8KKyNkZWZpbmUgQUdOWF9HQUlOX1RBQkxFCQkweDEyNDAwCisKKy8qIFRoZSBpbml0aWFsIEZJUiBjb2VmZmljaWVudCB0YWJsZSAqLworI2RlZmluZSBBR05YX0ZJUl9CQVNFCQkweDE5ODA0CisKKyNkZWZpbmUgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTAkweDgwMAorCisvKiBlZXByb20gY29tbWFuZHMgKi8KKyNkZWZpbmUgRUVQUk9NX0NNRF9OVUxMCQkweDAgLyogTlVMTCAqLworI2RlZmluZSBFRVBST01fQ01EX1dSSVRFCTB4MiAvKiB3cml0ZSAqLworI2RlZmluZSBFRVBST01fQ01EX1JFQUQJCTB4MyAvKiByZWFkICovCisjZGVmaW5lIEVFUFJPTV9DTURfU1RBVFVTUkVBRAkweDUgLyogc3RhdHVzIHJlZ2lzdGVyIHJlYWQgKi8KKyNkZWZpbmUgRUVQUk9NX0NNRF9XUklURUVOQUJMRQkweDYgLyogd3JpdGUgZW5hYmxlICovCisjZGVmaW5lIEVFUFJPTV9DTURfQ09ORklHVVJFCTB4NyAvKiBjb25maWd1cmUgKi8KKworI2RlZmluZSBFRVBST01fREFUQUZPUkNPRklHVVJFCTB4NiAvKiA/Pz8gKi8KKworLyogZWVwcm9tIGFkZHJlc3MgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJfU1VCVklECTB4MCAvKiBTdWIgVmVuZG9yIElEICovCisjZGVmaW5lIEVFUFJPTV9BRERSX1NVQlNJRAkweDIgLyogU3ViIFN5c3RlbSBJRCAqLworI2RlZmluZSBFRVBST01fQUREUl9NQUNBRERSCTB4MTQ2IC8qIE1BQyBBZGRyZXNzICovCisjZGVmaW5lIEVFUFJPTV9BRERSX0xPVFlQRQkweDE0ZiAvKiBMTyB0eXBlICovCisKK3N0cnVjdCBhZ254X2VlcHJvbSB7CisJdTggZGF0YTsJLyogZGF0ZSAqLworCXUxNiBhZGRyZXNzOwkvKiBhZGRyZXNzIGluIEVFUFJPTSAqLworCXU4IGNtZDsJCS8qIGNvbW1hbmQsIHVua25vd24sIHN0YXR1cyAqLworfSAgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIEFHTlhfRUVQUk9NX0NPTU1BTkRfU0hJRlQJNQorI2RlZmluZSBBR05YX0VFUFJPTV9DT01NQU5EX1NUQVQJMHgwMQorCit2b2lkIGRpc2FibGVfcmVjZWl2ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGVuYWJsZV9yZWNlaXZlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3U4IHJlYWRfZnJvbV9lZXByb20oc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTE2IGFkZHJlc3MpOwordm9pZCBhZ254X2h3X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitpbnQgYWdueF9od19yZXNldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2ludCBhZ254X3NldF9zc2lkKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pOwordm9pZCBhZ254X3NldF9ic3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqYnNzaWQpOwordm9pZCBlbmFibGVfcG93ZXJfc2F2aW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBkaXNhYmxlX3Bvd2VyX3NhdmluZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgY2FsaWJyYXRlX2FudGVubmFfcGVyaW9kKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKyNlbmRpZiAvKiBBR05YX1BIWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3JmLmMKQEAgLTAsMCArMSw4OTQgQEAKKy8qKgorICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KKworICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCisgKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdueC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAidGFibGUuaCIKKworLyogRklYTUUhICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdywKKwkJICAgICAgdTE2IHNpemUsIHUzMiBjb250cm9sKQoreworCXUzMiByZWc7CisJdTMyIGxzdyA9IHN3ICYgMHhmZmZmOwkJLyogbG93ZXIgMTYgYml0cyBvZiBzdyovCisJdTMyIG1zdyA9IHN3ID4+IDE2OwkJLyogaGlnaCAxNiBiaXRzIG9mIHN3ICovCisKKwkvKiBGSVhNRSBXcml0ZSBNb3N0IFNpZ25pZmljYW50IFdvcmQgb2YgdGhlIDMyYml0IGRhdGEgdG8gTVNXICovCisJLyogRklYTUUgQW5kIExlYXN0IFNpZ25pZmljYW50IFdvcmQgdG8gTFNXICovCisJaW93cml0ZTMyKChsc3cpLCByZWdpb24gKyBBR05YX1NQSV9XTFNXKTsKKwlpb3dyaXRlMzIoKG1zdyksIHJlZ2lvbiArIEFHTlhfU1BJX1dNU1cpOworCXJlZyA9IGNoaXBfaWRzIHwgc2l6ZSB8IGNvbnRyb2w7CisJLyogV3JpdGUgY2hpcCBpZChzKSwgd3JpdGUgc2l6ZSBhbmQgYnVzeSBjb250cm9sIHRvIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlpb3dyaXRlMzIoKHJlZyksIHJlZ2lvbiArIEFHTlhfU1BJX0NUTCk7CisJLyogV2FpdCBmb3IgQnVzeSBjb250cm9sIHRvIGNsZWFyICovCisJc3BpX2RlbGF5KCk7Cit9CisKKy8qCisgKiBXcml0ZSB0byBTUEkgU3ludGggcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwaV9zeV93cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHgxNSBpcyBhIG1hZ2ljIHZhbHVlKi8KKwlzcGlfd3JpdGUocmVnaW9uLCBjaGlwX2lkcywgc3csIDB4MTUsIFNQSV9CVVNZX0NUTCk7Cit9CisKKy8qCisgKiBXcml0ZSB0byBTUEkgUkYgcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwaV9yZl93cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHhkIGlzIGEgbWFnaWMgdmFsdWUqLworCXNwaV93cml0ZShyZWdpb24sIGNoaXBfaWRzLCBzdywgMHhkLCBTUElfQlVTWV9DVEwpOworfSAvKiBzcGlfcmZfd3JpdGUgKi8KKworLyoKKyAqIFdyaXRlIHRvIFNQSSB3aXRoIFJlYWQgQ29udHJvbCBiaXQgc2V0CisgKi8KK2lubGluZSB2b2lkIHNwaV9yY193cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHhlNSBpcyBhIG1hZ2ljIHZhbHVlICovCisJc3BpX3dyaXRlKHJlZ2lvbiwgY2hpcF9pZHMsIHN3LCAweGU1LCBTUElfQlVTWV9DVEx8U1BJX1JFQURfQ1RMKTsKK30KKworLyogR2V0IHRoZSBhY3RpdmUgY2hhaW5zJ3MgY291bnQgKi8KK3N0YXRpYyBpbnQgZ2V0X2FjdGl2ZV9jaGFpbnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgbnVtID0gMDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyMSk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAocmVnID09IDEpCisJCW51bSsrOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDEsIDB4MjEpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisJaWYgKHJlZyA9PSAxKQorCQludW0rKzsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAyLCAweDIxKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCWlmIChyZWcgPT0gMSkKKwkJbnVtKys7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyNik7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgzMyAhPSByZWcpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbm1hdGNoZWQgcmYgY2hpcHMgcmVzdWx0XG4iKTsKKworCXJldHVybiBudW07Cit9IC8qIGdldF9hY3RpdmVfY2hhaW5zICovCisKK3ZvaWQgcmZfY2hpcHNfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJaW50IG51bTsKKwlBR05YX1RSQUNFOworCisJaWYgKHByaXYtPnJldmlkID09IDEpIHsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQpOworCQlyZWcgfD0gMHg4OworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIHJlZyk7CisJfQorCisJLyogU2V0IFNQSSBjbG9jayBzcGVlZCB0byAyMDBOUyAqLworICAgICAgICByZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisgICAgICAgIHJlZyAmPSB+MHhGOworICAgICAgICByZWcgfD0gMHgzOworICAgICAgICBhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NQSV9DRkcsIHJlZyk7CisKKyAgICAgICAgLyogU2V0IFNQSSBjbG9jayBzcGVlZCB0byA1ME5TICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhGOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTEwMSk7CisKKwludW0gPSBnZXRfYWN0aXZlX2NoYWlucyhwcml2KTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiQWN0aXZlIGNoYWlucyBhcmUgJWRcbiIsIG51bSk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisJcmVnICY9IH4weEY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTkwOCk7Cit9IC8qIHJmX2NoaXBzX2luaXQgKi8KKworCitzdGF0aWMgdTMyIGNoYW5uZWxfdGJsWzE1XVs5XSA9IHsKKwl7MCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsxLCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWE0LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MiwgIDB4MDAsIDB4MDAsIDB4NjE1LCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezMsICAweDAwLCAweDAwLCAweDYxYSwgMHgwMCwgMHgxYWUsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXs0LCAgMHgwMCwgMHgwMCwgMHg2MWYsIDB4MDAsIDB4MWFlLCAweDI4LCAweDAwLCAweDFlfSwKKwl7NSwgIDB4MDAsIDB4MDAsIDB4NjI0LCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezYsICAweDAwLCAweDAwLCAweDYxZiwgMHgwMCwgMHgxYjMsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXs3LCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWIzLCAweDI4LCAweDAwLCAweDFlfSwKKwl7OCwgIDB4MDAsIDB4MDAsIDB4NjI5LCAweDAwLCAweDFiMywgMHgyOCwgMHgwMCwgMHgxZX0sCisJezksICAweDAwLCAweDAwLCAweDYyNCwgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsxMCwgMHgwMCwgMHgwMCwgMHg2MjksIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MTEsIDB4MDAsIDB4MDAsIDB4NjJlLCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezEyLCAweDAwLCAweDAwLCAweDYzMywgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsxMywgMHgwMCwgMHgwMCwgMHg2MjgsIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MTQsIDB4MDAsIDB4MDAsIDB4NjQ0LCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCit9OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2hhbm5lbF90Ymxfd3JpdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCByZWdfbnVtKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlyZWcgPSBjaGFubmVsX3RibFtjaGFubmVsXVtyZWdfbnVtXTsKKwlyZWcgPDw9IDQ7CisJcmVnIHw9IHJlZ19udW07CisJc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc3ludGhfZnJlcV9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisKKwkvKiBTZXQgdGhlIENsb2NrIGJpdHMgdG8gNTBOUyAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfQ0ZHKTsKKwlyZWcgJj0gfjB4RjsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKKworCS8qIFdyaXRlIDB4MDBjMCB0byBMU1cgYW5kIDB4MyB0byBNU1cgb2YgU3ludGggQ2hpcCAqLworCXNwaV9zeV93cml0ZShjdGwsIFNZTlRIX0NISVAsIDB4MzAwYzApOworCisJc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgMHgzMik7CisKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDEgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCAxKTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDMgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCAzKTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDYgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA2KTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDUgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA1KTsKKwkvKiAjIFdyaXRlIHRvIHJlZ2lzdGVyIDggb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA4KTsKKworCS8qIEZJWE1FIENsZWFyIHRoZSBjbG9jayBiaXRzICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKK30gLyogc3ludGhfY2hpcF9pbml0ICovCisKKworc3RhdGljIHZvaWQgYW50ZW5uYV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIGludCBudW1fYW50ZW5uYSkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXN3aXRjaCAobnVtX2FudGVubmEpIHsKKwljYXNlIDE6CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAxKTsKKworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9BTlRDRkcsIDcpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMzQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAzNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPRFlOQSwgMzApOworCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMjUpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA5MCk7CisKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgODApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdIVEgsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0xUSCwgMTYpOworCQlicmVhazsKKwljYXNlIDI6CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAxNSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAzNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPSU5BQ1QsIDM2KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMjApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDcwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAxMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDMyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTElTVEFOVCwgMyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkFDVElBTlQsIDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQ0FQVEFOVCwgMyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0FOVENGRywgMzEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMzYpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAzNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPRFlOQSwgMzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAxMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgNzApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQlRGRVNULCA3MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0hUSCwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCA0OCk7CisvLwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCAxNik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3cgYW50ZW5uYSBudW1iZXJcbiIpOworCX0KK30gLyogYW50ZW5uYV9pbml0ICovCisKK3N0YXRpYyB2b2lkIGNoYWluX3VwZGF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgY2hhaW4pCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisKKwlpZiAocmVnID09IDB4NCkKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIHJlZ3wweDEwMDApOworCWVsc2UgaWYgKHJlZyAhPSAweDApCisgICAgIAkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIHJlZ3wweDEwMDApOworICAgICAgICBlbHNlIHsKKwkJaWYgKGNoYWluID09IDMgfHwgY2hhaW4gPT0gNikgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIHJlZ3wweDEwMDApOworCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCQl9IGVsc2UgaWYgKGNoYWluID09IDIgfHwgY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIHJlZ3wweDEwMDApOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTAwNSk7CisJCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4ODI0KTsKKwkJfSBlbHNlIGlmIChjaGFpbiA9PSAxKSB7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgcmVnfDB4MTAwMCk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMXxSRl9DSElQMiwgMHgxMDA0KTsKKwkJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhjMzYpOworCQl9CisJfQorCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjIpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgMDoKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKGNoYWluID09IDYgfHwgY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMik7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMDA1KTsKKwkJfSBlbHNlIGlmIChjaGFpbiA8IDMpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDIpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGNoYWluID09IDMpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTIwMSk7CisJCX0gZWxzZSBpZiAoY2hhaW4gPT0gMikgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAwKTsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxLCAweDEyMDEpOworCQl9IGVsc2UgaWYgKGNoYWluID09IDEpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTIwMCk7CisJCX0gZWxzZSBpZiAoY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAxKTsKKwkJfSBlbHNlIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTIwMSk7CisJCX0KKwl9Cit9IC8qIGNoYWluX3VwZGF0ZSAqLworCitzdGF0aWMgdm9pZCBhbnRlbm5hX2NvbmZpZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCS8qIFdyaXRlIDB4MCB0byB0aGUgVFggTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyIEVuYWJsZSBiaXQgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NUTCk7CisJcmVnICY9IH4weDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOworCisJLyogRklYTUUgKi8KKwkvKiBTZXQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBudW1iZXIgb2YgQW50ZW5uYWUgKi8KKwlhbnRlbm5hX2luaXQocHJpdiwgMyk7CisKKwkvKiBGSVhNRSBVcGRhdGUgUG93ZXIgVGVtcGxhdGVzIGZvciBjdXJyZW50IHZhbGlkIFN0YXRpb25zICovCisJLyogc3RhX3Bvd2VyX2luaXQocHJpdiwgMCk7Ki8KKworCS8qIEZJWE1FIHRoZSBudW1iZXIgb2YgY2hhaW5zIHNob3VsZCBnZXQgZnJvbSBlZXByb20qLworCWNoYWluX3VwZGF0ZShwcml2LCBBR05YX0NIQUlOU19NQVgpOworfSAvKiBhbnRlbm5hX2NvbmZpZyAqLworCit2b2lkIGNhbGlicmF0ZV9vc2NpbGxhdG9yKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7CisJcmVnIHw9IDB4MTA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIHJlZyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUV1JJVEUsIDEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDEpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7CisJLyogKFJlc2lkdWFsIERDIENhbGlicmF0aW9uKSB0byBDYWxpYnJhdGlvbiBNb2RlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgyKTsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEwMDQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHgzZmYpOworCS8qIChUWCBMTyBDYWxpYnJhdGlvbikgdG8gQ2FsaWJyYXRpb24gTW9kZSAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4NCk7CisKKwlkbyB7CisJCXUzMiAgcmVnMSwgcmVnMiwgcmVnMzsKKwkJLyogRW5hYmxlIFBvd2VyIFNhdmluZyBDb250cm9sICovCisJCWVuYWJsZV9wb3dlcl9zYXZpbmcocHJpdik7CisJCS8qIFNhdmUgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgdG8gcmVzdG9yZSAqLworCQlyZWcxID0gaW9yZWFkMzIoY3RsICsgMHgxMTAwMCk7CisJCXJlZzIgPSBpb3JlYWQzMihjdGwgKyAweGVjNTApOworCQlyZWczID0gaW9yZWFkMzIoY3RsICsgMHhlYzU0KTsKKwkJd21iKCk7CisKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwMCwgMHhjZmRmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCAweDcwKTsKKwkJLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzICovCisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDAsIHJlZzEpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIHJlZzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIHJlZzMpOworCQkvKiBEaXNhYmxlIFBvd2VyIFNhdmluZyBDb250cm9sICovCisJCWRpc2FibGVfcG93ZXJfc2F2aW5nKHByaXYpOworCX0gd2hpbGUgKDApOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMCk7Cit9IC8qIGNhbGlicmF0ZV9vc2NpbGxhdG9yICovCisKKworc3RhdGljIHZvaWQgcmFkaW9fY2hhbm5lbF9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdW5zaWduZWQgaW50IGZyZXEgPSBwcml2LT5iYW5kLmNoYW5uZWxzW2NoYW5uZWwgLSAxXS5jZW50ZXJfZnJlcTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKwkvKiBTZXQgU1BJIENsb2NrIHRvIDUwIE5zICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhGOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJLyogQ2xlYXIgdGhlIERpc2FibGUgVHggaW50ZXJydXB0IGJpdCBpbiBJbnRlcnJ1cHQgTWFzayAqLworLyogCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9JTlRfTUFTSyk7ICovCisvKiAJcmVnICY9IH5JUlFfVFhfRElTQUJMRTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0lOVF9NQVNLLCByZWcpOyAqLworCisJLyogQmFuZCBTZWxlY3Rpb24gKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCk7CisJcmVnIHw9IDB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIHJlZyk7CisKKwkvKiBGSVhNRSBTZXQgdGhlIFNpTGFicyBDaGlwIEZyZXF1ZW5jeSAqLworCXN5bnRoX2ZyZXFfc2V0KHByaXYsIGNoYW5uZWwpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOworCXJlZyB8PSAweDgwMTAwMDMwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUExMQ1RMKTsKKwlyZWcgfD0gMHgyMDAwOTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BMTENUTCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgMHg1KTsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDExMDApOworCisJLyogTG9hZCB0aGUgTW9uaXRvckdhaW4gVGFibGUgKi8KKwltb25pdG9yX2dhaW5fdGFibGVfaW5pdChwcml2KTsKKworCS8qIExvYWQgdGhlIFRYIEZpciB0YWJsZSAqLworCXR4X2Zpcl90YWJsZV9pbml0KHByaXYpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgyMik7CisJdWRlbGF5KDgwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4ZmYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKKwlyZWcgfD0gMHg0ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIHJlZyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA4LCAweDEpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMGMsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwOCwgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIDB4Yyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDB4Myk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTAsIDB4NmUpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTQsIDB4NmMpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIEFudGVubmEgKi8KKwkvKiBhbnRlbm5hX2NhbGlicmF0ZShwcml2KTsgKi8KKwkvKiBDYWxpYnJhdGUgdGhlIFR4TG9jYWxPc2NpbGxhdG9yICovCisJY2FsaWJyYXRlX29zY2lsbGF0b3IocHJpdik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSB+MHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTklOSVQsIDB4YSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDRCwgMHgwKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTgsIDB4Yik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDApOworCisJLyogV3JpdGUgRnJlcXVlbmN5IHRvIEdhaW4gQ29udHJvbCBDaGFubmVsICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhDSEFORUwsIGZyZXEpOworCS8qIFdyaXRlIDB4MTQwMDAwL0ZyZXEgdG8gMHg5YzA4ICovCisJcmVnID0gMHgxNDAwMDAvZnJlcTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweDljMDgsIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fU09GVFJTVCk7CisJcmVnICY9IH4weDgwMTAwMDMwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOworCXJlZyAmPSB+MHgyMDAwOTsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgwKTsKKworLyogRklYTUUgQWNjb3JkaW5nIHRvIE51bWJlciBvZiBDaGFpbnM6ICovCisKKy8qIAkJCSAgIDEuIDE6ICovCisvKiAgICAgICAgICAxLiBXcml0ZSAweDEyMDMgdG8gUkYgQ2hpcCAwICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcHMgMSArMiAgKi8KKy8qIAkJCSAgIDIuIDI6ICovCisvKiAgICAgICAgICAxLiBXcml0ZSAweDEyMDMgdG8gUkYgQ2hpcCAwICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcCAyICovCisvKiAgICAgICAgICAzLiBXcml0ZSAweDEyMDEgdG8gUkYgQ2hpcCAxICAqLworLyogCQkJICAgMy4gMzogKi8KKy8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKi8KKy8qICAgICAgICAgIDIuIFdyaXRlIDB4MTIwMSB0byBSRiBDaGlwIDEgKyAyICAqLworLyogCQkJICAgNC4gNDogKi8KKy8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKyAxICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcCAyICAqLworCisvKiAJCQkgICA1LiA2OiAqLworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDMpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAyLCAweDEyMDEpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCisJLyogRklYTUUgU2V0IHRoZSBEaXNhYmxlIFR4IGludGVycnVwdCBiaXQgaW4gSW50ZXJydXB0IE1hc2sKKwkgICAoT3IgMHgyMDAwMCB0byBJbnRlcnJ1cHQgTWFzaykgKi8KKy8qIAlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfSU5UX01BU0spOyAqLworLyogCXJlZyB8PSBJUlFfVFhfRElTQUJMRTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0lOVF9NQVNLLCByZWcpOyAqLworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOworCisJLyogQ29uZmlndXJlIHRoZSBBbnRlbm5hICovCisJYW50ZW5uYV9jb25maWcocHJpdik7CisKKwkvKiBXcml0ZSAweDAgdG8gRGlzY292ZXJ5IE1vZGUgRW5hYmxlIGRldGVjdCBHLCBCLCBBIHBhY2tldD8gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFKTsKKwlyZWcgfD0gMHg4MDAwMDAwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCByZWcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgwKTsKKworCS8qIGVuYWJsZSByYWRpbyBvbiBhbmQgdGhlIHBvd2VyIExFRCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VUKTsKKwlyZWcgJj0gfjB4MTsKKwlyZWcgfD0gMHgyOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKK30gLyogcmFkaW9fY2hhbm5lbF9zZXQgKi8KKworc3RhdGljIHZvaWQgYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDE3MDApOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLLCAweDApOworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI3KTsKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMSwgMHgyNyk7CisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLLCAweDEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9vZmZzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIGNoYWluKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiBvZmZzZXQ7CisKKwlpb3dyaXRlMzIoKGNoYWluKSwgY3RsICsgQUdOWF9BQ0lfU0VMQ0hBSU4pOworCXVkZWxheSgxMCk7CisJb2Zmc2V0ID0gKGlvcmVhZDMyKGN0bCArIEFHTlhfQUNJX09GRlNFVCkpOworCXByaW50ayhQRlggIkNoYWluIGlzIDB4JXgsIE9mZnNldCBpcyAweCV4XG4iLCBjaGFpbiwgb2Zmc2V0KTsKK30KKwordm9pZCBwcmludF9vZmZzZXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJcHJpbnRfb2Zmc2V0KHByaXYsIDApOworCXByaW50X29mZnNldChwcml2LCA0KTsKKwlwcmludF9vZmZzZXQocHJpdiwgMSk7CisJcHJpbnRfb2Zmc2V0KHByaXYsIDUpOworCXByaW50X29mZnNldChwcml2LCAyKTsKKwlwcmludF9vZmZzZXQocHJpdiwgNik7Cit9CisKKworc3RydWN0IGNoYWlucyB7CisJdTMyIGNhbGk7CQkvKiBjYWxpYnJhdGUgIHZhbHVlKi8KKworI2RlZmluZSAgTkVFRF9DQUxJQlJBVEUJCTAKKyNkZWZpbmUgIFNVQ0NFU1NfQ0FMSUJSQVRFCTEKKwlpbnQgc3RhdHVzOworfTsKKworc3RhdGljIHZvaWQgY2hhaW5fY2FsaWJyYXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBjaGFpbnMgKmNoYWlucywKKwkJCSAgICB1bnNpZ25lZCBpbnQgbnVtKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiBjYWxpYnJhID0gY2hhaW5zW251bV0uY2FsaTsKKworCWlmIChudW0gPCAzKQorCQljYWxpYnJhIHw9IDB4MTQwMDsKKwllbHNlCisJCWNhbGlicmEgfD0gMHgxNTAwOworCisJc3dpdGNoIChudW0pIHsKKwljYXNlIDA6CisJY2FzZSA0OgorCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgY2FsaWJyYSk7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDU6CisJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxLCBjYWxpYnJhKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgNjoKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIGNhbGlicmEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9IC8qIGNoYWluX2NhbGlicmF0ZSAqLworCisKK3N0YXRpYyB2b2lkIGlubGluZSBnZXRfY2FsaWJyZXRlX3ZhbHVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBjaGFpbnMgKmNoYWlucywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG51bSkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgb2Zmc2V0OworCisJaW93cml0ZTMyKChudW0pLCBjdGwgKyBBR05YX0FDSV9TRUxDSEFJTik7CisJLyogRklYTUUgKi8KKwl1ZGVsYXkoMTApOworCW9mZnNldCA9IChpb3JlYWQzMihjdGwgKyBBR05YX0FDSV9PRkZTRVQpKTsKKworCWlmIChvZmZzZXQgPCAweGYpIHsKKwkJY2hhaW5zW251bV0uc3RhdHVzID0gU1VDQ0VTU19DQUxJQlJBVEU7CisJCXJldHVybjsKKwl9CisKKwlpZiAobnVtID09IDAgfHwgbnVtID09IDEgfHwgbnVtID09IDIpIHsKKwkJaWYgKCAwID09IGNoYWluc1tudW1dLmNhbGkpCisJCQljaGFpbnNbbnVtXS5jYWxpID0gMHhmZjsKKwkJZWxzZQorCQkJY2hhaW5zW251bV0uY2FsaS0tOworCX0gZWxzZQorCQljaGFpbnNbbnVtXS5jYWxpKys7CisKKwljaGFpbnNbbnVtXS5zdGF0dXMgPSBORUVEX0NBTElCUkFURTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNhbGlicmFfZGVsYXkoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCXVuc2lnbmVkIGludCBpID0gMTAwOworCisJd21iKCk7CisJd2hpbGUgKGktLSkgeworCQlyZWcgPSAoaW9yZWFkMzIoY3RsICsgQUdOWF9BQ0lfU1RBVFVTKSk7CisJCWlmIChyZWcgPT0gMHg0MDAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmICghaSkKKwkJcHJpbnRrKFBGWCAiY2FsaWJyYXRpb24gZmFpbGVkXG4iKTsKK30KKwordm9pZCBkb19jYWxpYnJhdGlvbihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXN0cnVjdCBjaGFpbnMgY2hhaW5zWzddOworCXVuc2lnbmVkIGludCBpLCBqOworCUFHTlhfVFJBQ0U7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlmIChpID09IDMpCisJCQljb250aW51ZTsKKworCQljaGFpbnNbaV0uY2FsaSA9IDB4N2Y7CisJCWNoYWluc1tpXS5zdGF0dXMgPSBORUVEX0NBTElCUkFURTsKKwl9CisKKwkvKiBGSVhNRSAweDMwMCBpcyBhIG1hZ2ljIG51bWJlciAqLworCWZvciAoaiA9IDA7IGogPCAweDMwMDsgaisrKSB7CisJCWlmIChjaGFpbnNbMF0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbMV0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbMl0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNF0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNV0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNl0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFKQorCQkJYnJlYWs7CisKKwkJLyogQXR0ZW50aW9uLCB0aGVyZSBpcyBubyBjaGFpbiAzICovCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWlmIChpID09IDMpCisJCQkJY29udGludWU7CisJCQlpZiAoY2hhaW5zW2ldLnN0YXR1cyA9PSBORUVEX0NBTElCUkFURSkKKwkJCQljaGFpbl9jYWxpYnJhdGUocHJpdiwgY2hhaW5zLCBpKTsKKwkJfQorCQkvKiBXcml0ZSAweDEgdG8gQ2FsaWJyYXRpb24gTWVhc3VyZSAqLworCQlpb3dyaXRlMzIoKDB4MSksIGN0bCArIEFHTlhfQUNJX01FQVNVUkUpOworCQljYWxpYnJhX2RlbGF5KHByaXYpOworCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWlmIChpID09IDMpCisJCQkJY29udGludWU7CisKKwkJCWdldF9jYWxpYnJldGVfdmFsdWUocHJpdiwgY2hhaW5zLCBpKTsKKwkJfQorCX0KKwlwcmludGsoUEZYICJDbGlicmF0ZSB0aW1lcyBpcyAlZFxuIiwgaik7CisJcHJpbnRfb2Zmc2V0cyhwcml2KTsKK30gLyogZG9fY2FsaWJyYXRpb24gKi8KKwordm9pZCBhbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAweDMpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAweDFmKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9JTkFDVCwgMHgyNCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAweDIwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMHg2NCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgMHg0Nik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgMHgzYyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDB4MzApOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjApOworCS8qIEZpeG1lICovCisJdWRlbGF5KDgwKTsKKwkvKiAgICAxLiBTaG91bGQgcmVhZCAweDAgICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgwICE9IHJlZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDApOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjIpOworCXVkZWxheSg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgwICE9IHJlZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDUpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOworCXJlZyB8PSAweDFjMDAwMDMyOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUExMQ1RMKTsKKwlyZWcgfD0gMHgwMDAzZjA3OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjNTApOworCXJlZyB8PSAweDQwOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhmZjgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NIQUlOTlVNLCAweDYpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTk4NzQsIDB4MCk7CisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTcwMCk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIEJhc2VCYW5kRmlsdGVyICovCisJYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUocHJpdik7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxMDAyKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCAweDFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgMHgxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDIsIDB4MWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgxKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNDAwKTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNTAwKTsKKworCS8qIE1lYXN1cmUgQ2FsaWJyYXRpb24gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9NRUFTVVJFLCAweDEpOworCWNhbGlicmFfZGVsYXkocHJpdik7CisKKwkvKiBkbyBjYWxpYnJhdGlvbiAqLworCWRvX2NhbGlicmF0aW9uKHByaXYpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4Zik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwKTsKKwlyZWcgJj0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEpOworCXJlZyAmPSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMik7CisJcmVnICY9IDB4ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMiwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgwKTsKKwlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOworfSAvKiBhbnRlbm5hX2NhbGlicmF0ZSAqLworCit2b2lkIF9fYW50ZW5uYV9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJLyogQ2FsaWJyYXRlIHRoZSBCYXNlQmFuZEZpbHRlciAqLworCS8qIGJhc2VfYmFuZF9maWx0ZXJfY2FsaWJyYXRlKHByaXYpOyAqLworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDIpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMCwgMHgxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIDB4MWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCAweDFkKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgxKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNDAwKTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNTAwKTsKKwkvKiBNZWFzdXJlIENhbGlicmF0aW9uICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTUVBU1VSRSwgMHgxKTsKKwljYWxpYnJhX2RlbGF5KHByaXYpOworCWRvX2NhbGlicmF0aW9uKHByaXYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHgwKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDApOworCXJlZyAmPSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDAsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7CisJcmVnICY9IDB4ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyKTsKKwlyZWcgJj0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCByZWcpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUV1JJVEUsIDB4MCk7CisKKwkvKiBXcml0ZSAweDMgR2FpbiBDb250cm9sIERpc2NvdmVyeSBNb2RlICovCisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworfQorCitpbnQgYWdueF9zZXRfY2hhbm5lbChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlBR05YX1RSQUNFOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2hhbm5lbCBpcyAlZCAlc1xuIiwgY2hhbm5lbCwgX19mdW5jX18pOworCXJhZGlvX2NoYW5uZWxfc2V0KHByaXYsIGNoYW5uZWwpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FjNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmMKQEAgLTAsMCArMSwyMTkgQEAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKwordm9pZCBoYXNoX3JlYWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXJlZ2xvICY9IDB4RkZGRjsKKwlyZWdsbyB8PSAweDMwMDAwMDAwOworCXJlZ2xvIHw9IDB4NDAwMDAwMDA7CS8qIFNldCBzdGF0dXMgYnVzeSAqLworCXJlZ2xvIHw9IHN0YV9pZCA8PCAxNjsKKworCWlvd3JpdGUzMigwLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKKwlpb3dyaXRlMzIocmVnaGksIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworCWlvd3JpdGUzMihyZWdsbywgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKworCXJlZ2hpID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfSElHSCk7CisgICAgICAgIHJlZ2xvID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKwlwcmludGsoUEZYICJSWCBoYXNoIGNtZCBhcmUgOiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKK30KKwordm9pZCBoYXNoX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICptYWNfYWRkciwgdTggc3RhX2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWdoaSwgcmVnbG87CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjX2FkZHIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVXBkYXRlIGhhc2ggdGFibGU6IEludmFsaWQgaHdhZGRyIVxuIik7CisKKwlyZWdoaSA9IG1hY19hZGRyWzBdIDw8IDI0IHwgbWFjX2FkZHJbMV0gPDwgMTYgfCBtYWNfYWRkclsyXSA8PCA4IHwgbWFjX2FkZHJbM107CisJcmVnbG8gPSBtYWNfYWRkcls0XSA8PCA4IHwgbWFjX2FkZHJbNV07CisJcmVnbG8gfD0gMHgxMDAwMDAwMDsJLyogU2V0IGhhc2ggY29tbW1hbmQgKi8KKwlyZWdsbyB8PSAweDQwMDAwMDAwOwkvKiBTZXQgc3RhdHVzIGJ1c3kgKi8KKwlyZWdsbyB8PSBzdGFfaWQgPDwgMTY7CisKKwlpb3dyaXRlMzIoMCwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7CisJaW93cml0ZTMyKHJlZ2hpLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKwlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisKKyAgICAgICAgcmVnbG8gPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOworCWlmICghKHJlZ2xvICYgMHg4MDAwMDAwMCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVcGRhdGUgaGFzaCB0YWJsZSBmYWlsZWRcbiIpOworfQorCit2b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiByZWdoaSwgdTMyIHJlZ2xvLCB1OCBzdGFfaWQpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisKKwlyZWdsbyAmPSAweEZGRkY7CisJcmVnbG8gfD0gMHgyMDAwMDAwMDsKKwlyZWdsbyB8PSAweDQwMDAwMDAwOwkvKiBTZXQgc3RhdHVzIGJ1c3kgKi8KKwlyZWdsbyB8PSBzdGFfaWQgPDwgMTY7CisKKwlpb3dyaXRlMzIoMCwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7CisJaW93cml0ZTMyKHJlZ2hpLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKwlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKworICAgICAgICByZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcHJpbnRrKFBGWCAiUlggaGFzaCBjbWQgYXJlIDogJS44eCUuOHhcbiIsIHJlZ2hpLCByZWdsbyk7CisKK30KKwordm9pZCBoYXNoX2R1bXAoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggc3RhX2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWdoaSwgcmVnbG87CisKKwlyZWdsbyA9IDB4MDsJCS8qIGR1bXAgY29tbWFuZCAqLworCXJlZ2xvfD0gMHg0MDAwMDAwMDsgIAkvKiBzdGF0dXMgYml0ICovCisJaW93cml0ZTMyKHJlZ2xvLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOworCWlvd3JpdGUzMihzdGFfaWQgPDwgMTYsIGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9EQVRBKTsKKworCXVkZWxheSg4MCk7CisKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworICAgICAgICByZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcHJpbnRrKFBGWCAiaGFzaCBjbWQgYXJlIDogJS44eCUuOHhcbiIsIHJlZ2hpLCByZWdsbyk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKKwlwcmludGsoUEZYICJoYXNoIGZsYWcgaXMgOiAlLjh4XG4iLCByZWdoaSk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0RVTVBfTVNUKTsKKwlyZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9MU1QpOworCXByaW50ayhQRlggImhhc2ggZHVtcCBtc3QgbHN0OiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9EQVRBKTsKKwlwcmludGsoUEZYICJoYXNoIGR1bXAgZGF0YTogJS44eFxuIiwgcmVnaGkpOworfQorCit2b2lkIGdldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisgICAgICAgIG1lbWNweV9mcm9taW8ocG93ZXIsIGN0bCArIEFHTlhfVFhNX1NUQVBPV1RFTVAgKyBzaXplb2YoKnBvd2VyKSAqIHN0YV9pZHgsCisJCSAgICAgIHNpemVvZigqcG93ZXIpKTsKK30KKworaW5saW5lIHZvaWQKK3NldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJLyogRklYTUUgICAyLiBXcml0ZSBUZW1wbGF0ZSB0byBvZmZzZXQgKyBzdGF0aW9uIG51bWJlciAgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oY3RsICsgQUdOWF9UWE1fU1RBUE9XVEVNUCArIHNpemVvZigqcG93ZXIpICogc3RhX2lkeCwKKwkJICAgIHBvd2VyLCBzaXplb2YoKnBvd2VyKSk7Cit9CisKKwordm9pZCBnZXRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV90eF93cSAqdHhfd3EsCisJCSAgIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KQoreworCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7CisJbWVtY3B5X2Zyb21pbyh0eF93cSwgZGF0YSArIEFHTlhfUERVX1RYX1dRICsgc2l6ZW9mKCp0eF93cSkgKiBTVEFfVFhfV1FfTlVNICogc3RhX2lkeCArCisJCSAgICAgIHNpemVvZigqdHhfd3EpICogd3FfaWR4LCAgc2l6ZW9mKCp0eF93cSkpOworCit9CisKK2lubGluZSB2b2lkIHNldF9zdGFfdHhfd3Eoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3R4X3dxICp0eF93cSwKKwkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgsIHVuc2lnbmVkIGludCB3cV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwltZW1jcHlfdG9pbyhkYXRhICsgQUdOWF9QRFVfVFhfV1EgKyBzaXplb2YoKnR4X3dxKSAqIFNUQV9UWF9XUV9OVU0gKiBzdGFfaWR4ICsKKwkJICAgIHNpemVvZigqdHhfd3EpICogd3FfaWR4LCB0eF93cSwgc2l6ZW9mKCp0eF93cSkpOworfQorCisKK3ZvaWQgZ2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKworCW1lbWNweV9mcm9taW8oc3RhLCBkYXRhICsgQUdOWF9QRFVQT09MICsgc2l6ZW9mKCpzdGEpICogc3RhX2lkeCwKKwkJICAgICAgc2l6ZW9mKCpzdGEpKTsKK30KKworaW5saW5lIHZvaWQgc2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKworICAgICAgICBtZW1jcHlfdG9pbyhkYXRhICsgQUdOWF9QRFVQT09MICsgc2l6ZW9mKCpzdGEpICogc3RhX2lkeCwKKwkJICAgIHN0YSwgc2l6ZW9mKCpzdGEpKTsKK30KKworLyogRklYTUUgKi8KK3ZvaWQgc3RhX3Bvd2VyX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCW1lbXNldCgmcG93ZXIsIDAsIHNpemVvZihwb3dlcikpOworCXJlZyA9IGFnbnhfc2V0X2JpdHMoRURDRiwgRURDRl9TSElGVCwgMHgxKTsKKwlwb3dlci5yZWcgPSBjcHVfdG9fbGUzMihyZWcpOworCXNldF9zdGFfcG93ZXIocHJpdiwgJnBvd2VyLCBzdGFfaWR4KTsKKwl1ZGVsYXkoNDApOworfSAvKiBhZGRfcG93ZXJfdGVtcGxhdGUgKi8KKworCisvKiBAbnVtOiBUaGUgI251bWJlciBvZiBzdGF0aW9uIHRoYXQgaXMgdmlzaWJsZSB0byB0aGUgY2FyZCAqLworc3RhdGljIHZvaWQgc3RhX3R4X3dvcmtxdWV1ZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4KQoreworCXN0cnVjdCBhZ254X3N0YV90eF93cSB0eF93cTsKKwl1MzIgcmVnOworCXVuc2lnbmVkIGludCBpOworCisJbWVtc2V0KCZ0eF93cSwgMCwgc2l6ZW9mKHR4X3dxKSk7CisKKwlyZWcgPSBhZ254X3NldF9iaXRzKFdPUktfUVVFVUVfVkFMSUQsIFdPUktfUVVFVUVfVkFMSURfU0hJRlQsIDEpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFdPUktfUVVFVUVfQUNLX1RZUEUsIFdPUktfUVVFVUVfQUNLX1RZUEVfU0hJRlQsIDEpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoV09SS19RVUVVRV9BQ0tfVFlQRSwgV09SS19RVUVVRV9BQ0tfVFlQRV9TSElGVCwgMCk7CisJdHhfd3EucmVnMiB8PSBjcHVfdG9fbGUzMihyZWcpOworCisJLyogU3VwcG9zZSBhbGwgOCB0cmFmZmljIGNsYXNzIGFyZSB1c2VkICovCisJZm9yIChpID0gMDsgaSA8IFNUQV9UWF9XUV9OVU07IGkrKykKKwkJc2V0X3N0YV90eF93cShwcml2LCAmdHhfd3EsIHN0YV9pZHgsIGkpOworfSAvKiBzdGFfdHhfd29ya3F1ZXVlX2luaXQgKi8KKworCitzdGF0aWMgdm9pZCBzdGFfdHJhZmZpY19pbml0KHN0cnVjdCBhZ254X3N0YV90cmFmZmljICp0cmFmZmljKQoreworCXUzMiByZWc7CisJbWVtc2V0KHRyYWZmaWMsIDAsIHNpemVvZigqdHJhZmZpYykpOworCisJcmVnID0gYWdueF9zZXRfYml0cyhORVdfUEFDS0VULCBORVdfUEFDS0VUX1NISUZULCAxKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhUUkFGRklDX1ZBTElELCBUUkFGRklDX1ZBTElEX1NISUZULCAxKTsKKy8vCXJlZyB8PSBhZ254X3NldF9iaXRzKFRSQUZGSUNfQUNLX1RZUEUsIFRSQUZGSUNfQUNLX1RZUEVfU0hJRlQsIDEpOworCXRyYWZmaWMtPnJlZzAgPSBjcHVfdG9fbGUzMihyZWcpOworCisJLyogCTMuIHNldHRpbmcgUlggU2VxdWVuY2UgTnVtYmVyIHRvIDQwOTUgKi8KKwlyZWcgPSBhZ254X3NldF9iaXRzKFJYX1NFUVVFTkNFX05VTSwgUlhfU0VRVUVOQ0VfTlVNX1NISUZULCA0MDk1KTsKKwl0cmFmZmljLT5yZWcxID0gY3B1X3RvX2xlMzIocmVnKTsKK30KKworCisvKiBAbnVtOiBUaGUgI251bWJlciBvZiBzdGF0aW9uIHRoYXQgaXMgdmlzaWJsZSB0byB0aGUgY2FyZCAqLwordm9pZCBzdGFfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwkvKiBGSVhNRSB0aGUgbGVuZ3RoIG9mIHN0YSBpcyAyNTYgYnl0ZXMgSXMgdGhhdAorCSAqIGRhbmdlcm91cyB0byBzdGFjayBvdmVyZmxvdz8gKi8KKwlzdHJ1Y3QgYWdueF9zdGEgc3RhOworCXUzMiByZWc7CisJaW50IGk7CisKKwltZW1zZXQoJnN0YSwgMCwgc2l6ZW9mKHN0YSkpOworCS8qIFNldCB2YWxpZCB0byAxICovCisJcmVnID0gYWdueF9zZXRfYml0cyhTVEFUSU9OX1ZBTElELCBTVEFUSU9OX1ZBTElEX1NISUZULCAxKTsKKwkvKiBTZXQgRW5hYmxlIENvbmNhdGVuYXRpb24gdG8gMCAoPykgKi8KKwlyZWcgfD0gYWdueF9zZXRfYml0cyhFTkFCTEVfQ09OQ0FURU5BVElPTiwgRU5BQkxFX0NPTkNBVEVOQVRJT05fU0hJRlQsIDApOworCS8qIFNldCBFbmFibGUgRGVjb21wcmVzc2lvbiB0byAwICg/KSAqLworCXJlZyB8PSBhZ254X3NldF9iaXRzKEVOQUJMRV9ERUNPTVBSRVNTSU9OLCBFTkFCTEVfREVDT01QUkVTU0lPTl9TSElGVCwgMCk7CisJc3RhLnJlZyA9IGNwdV90b19sZTMyKHJlZyk7CisKKwkvKiBJbml0aWFsaXplIGVhY2ggb2YgdGhlIFRyYWZmaWMgQ2xhc3MgU3RydWN0dXJlcyBieTogKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlzdGFfdHJhZmZpY19pbml0KHN0YS50cmFmZmljICsgaSk7CisKKwlzZXRfc3RhKHByaXYsICZzdGEsIHN0YV9pZHgpOworCXN0YV90eF93b3JrcXVldWVfaW5pdChwcml2LCBzdGFfaWR4KTsKK30gLyogc3RhX2Rlc2NyaXB0b3JfaW5pdCAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5oIGIvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkMGIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5oCkBAIC0wLDAgKzEsMjIyIEBACisjaWZuZGVmIEFHTlhfU1RBX0hfCisjZGVmaW5lIEFHTlhfU1RBX0hfCisKKyNkZWZpbmUgU1RBX1RYX1dRX05VTQk4CS8qIFRoZSBudW1iZXIgb2YgVFggd29ya3F1ZXVlIG9uZSBTVEEgaGFzICovCisKK3N0cnVjdCBhZ254X2hhc2hfY21kIHsKKwlfX2JlMzIgY21kaGk7CisjZGVmaW5lIE1BQ0xPCQkweEZGRkYwMDAwCisjZGVmaW5lIE1BQ0xPX1NISUZUCTE2CisjZGVmaW5lIFNUQV9JRAkJMHgwMDAwRkZGMAorI2RlZmluZSBTVEFfSURfU0hJRlQJNAorI2RlZmluZSBDTUQJCTB4MDAwMDAwMEMKKyNkZWZpbmUgQ01EX1NISUZUCTIKKyNkZWZpbmUgU1RBVFVTCQkweDAwMDAwMDAyCisjZGVmaW5lIFNUQVRVU19TSElGVAkxCisjZGVmaW5lIFBBU1MJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUEFTU19TSElGVAkxCisJX19iZTMyIGNtZGxvOworfV9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCisvKgorICogU3RhdGlvbiBQb3dlciBUZW1wbGF0ZQorICogRklYTUUgSnVzdCBmb3IgYWduMTAwIHlldAorICovCitzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgeworCV9fbGUzMiByZWc7CisjZGVmaW5lIFNJR05BTAkJCTB4MDAwMDAwRkYgLyogc2lnbmFsICovCisjZGVmaW5lIFNJR05BTF9TSElGVAkJMAorI2RlZmluZSBSQVRFCQkJMHgwMDAwMEYwMAorI2RlZmluZSBSQVRFX1NISUZUCQk4CisjZGVmaW5lIFRJRlMJCQkweDAwMDAxMDAwCisjZGVmaW5lIFRJRlNfU0hJRlQJCTEyCisjZGVmaW5lIEVEQ0YJCQkweDAwMDAyMDAwCisjZGVmaW5lIEVEQ0ZfU0hJRlQJCTEzCisjZGVmaW5lIENIQU5ORUxfQk9ORAkJMHgwMDAwNDAwMAorI2RlZmluZSBDSEFOTkVMX0JPTkRfU0hJRlQJMTQKKyNkZWZpbmUgUEhZX01PREUJCTB4MDAwMzgwMDAKKyNkZWZpbmUgUEhZX01PREVfU0hJRlQJCTE1CisjZGVmaW5lIFBPV0VSX0xFVkVMCQkweDAwN0MwMDAwCisjZGVmaW5lIFBPV0VSX0xFVkVMX1NISUZUCTE4CisjZGVmaW5lIE5VTV9UUkFOU01JVFRFUlMJMHgwMDgwMDAwMAorI2RlZmluZSBOVU1fVFJBTlNNSVRURVJTX1NISUZUCTIzCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyoKKyAqIFRYIFdvcmtxdWV1ZSBEZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBhZ254X3N0YV90eF93cSB7CisJX19sZTMyIHJlZzA7CisjZGVmaW5lIEhFQURfUE9JTlRFUl9MT1cJMHhGRjAwMDAwMCAvKiBIZWFkIHBvaW50ZXIgbG93ICovCisjZGVmaW5lIEhFQURfUE9JTlRFUl9MT1dfU0hJRlQJMjQKKyNkZWZpbmUgVEFJTF9QT0lOVEVSCQkweDAwRkZGRkZGIC8qIFRhaWwgcG9pbnRlciAqLworI2RlZmluZSBUQUlMX1BPSU5URVJfU0hJRlQJMAorCisJX19sZTMyIHJlZzM7CisjZGVmaW5lIEFDS19QT0lOVEVSX0xPVwkgICAgICAgIDB4RkZGRjAwMDAJLyogQUNLIHBvaW50ZXIgbG93ICovCisjZGVmaW5lIEFDS19QT0lOVEVSX0xPV19TSElGVAkxNgorI2RlZmluZSBIRUFEX1BPSU5URVJfSElHSAkweDAwMDBGRkZGCS8qIEhlYWQgcG9pbnRlciBoaWdoICovCisjZGVmaW5lIEhFQURfUE9JTlRFUl9ISUdIX1NISUZUCTAKKworCV9fbGUzMiByZWcxOworLyogQUNLIHRpbWVvdXQgdGFpbCBwYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgQUNLX1RJTU9VVF9UQUlMX1BBQ0tfQ05UCTB4RkZGMDAwMDAKKyNkZWZpbmUgQUNLX1RJTU9VVF9UQUlMX1BBQ0tfQ05UX1NISUZUCTIwCisvKiBIZWFkIHRpbWVvdXQgdGFpbCBwYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgSEVBRF9USU1PVVRfVEFJTF9QQUNLX0NOVAkweDAwMEZGRjAwCisjZGVmaW5lIEhFQURfVElNT1VUX1RBSUxfUEFDS19DTlRfU0hJRlQJOAorI2RlZmluZSBBQ0tfUE9JTlRFUl9ISUdICSAgICAgICAgMHgwMDAwMDBGRiAvKiBBQ0sgcG9pbnRlciBoaWdoICovCisjZGVmaW5lIEFDS19QT0lOVEVSX0hJR0hfU0hJRlQJCTAKKworCV9fbGUzMiByZWcyOworI2RlZmluZSBXT1JLX1FVRVVFX1ZBTElECQkweDgwMDAwMDAwIC8qIHZhbGlkICovCisjZGVmaW5lIFdPUktfUVVFVUVfVkFMSURfU0hJRlQJCTMxCisjZGVmaW5lIFdPUktfUVVFVUVfQUNLX1RZUEUJCTB4NDAwMDAwMDAgLyogQUNLIHR5cGUgKi8KKyNkZWZpbmUgV09SS19RVUVVRV9BQ0tfVFlQRV9TSElGVAkzMAorLyogSGVhZCB0aW1lb3V0IHdpbmRvdyBsaW1pdCBmcmFnbWVudGF0aW9uIGNvdW50ICovCisjZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fRlJBR19DTlQJMHgzRkZGMDAwMAorI2RlZmluZSBIRUFEX1RJTU9VVF9XSU5fTElNX0ZSQUdfQ05UX1NISUZUCTE2CisvKiBIZWFkIHRpbWVvdXQgd2luZG93IGxpbWl0IGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgSEVBRF9USU1PVVRfV0lOX0xJTV9CWVRFX0NOVAkweDAwMDBGRkZGCisjZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fQllURV9DTlRfU0hJRlQJIDAKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKKy8qCisgKiBUcmFmZmljIENsYXNzIFN0cnVjdHVyZQorICovCitzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyB7CisJX19sZTMyIHJlZzA7CisjZGVmaW5lIEFDS19USU1PVVRfQ05UCQkweEZGODAwMDAwIC8qIEFDSyBUaW1lb3V0IENvdW50cyAqLworI2RlZmluZSBBQ0tfVElNT1VUX0NOVF9TSElGVAkyMworI2RlZmluZSBUUkFGRklDX0FDS19UWVBFCTB4MDA2MDAwMDAgLyogQUNLIFR5cGUgKi8KKyNkZWZpbmUgVFJBRkZJQ19BQ0tfVFlQRV9TSElGVAkyMQorI2RlZmluZSBORVdfUEFDS0VUCQkweDAwMTAwMDAwIC8qIE5ldyBQYWNrZXQgICovCisjZGVmaW5lIE5FV19QQUNLRVRfU0hJRlQJMjAKKyNkZWZpbmUgVFJBRkZJQ19WQUxJRAkJMHgwMDA4MDAwMCAvKiBWYWxpZCAqLworI2RlZmluZSBUUkFGRklDX1ZBTElEX1NISUZUCTE5CisjZGVmaW5lIFJYX0hEUl9ERVNDX1BPSU5URVIJMHgwMDA3RkZGRiAvKiBSWCBIZWFkZXIgRGVzY3JpcHRlciBwb2ludGVyICovCisjZGVmaW5lIFJYX0hEUl9ERVNDX1BPSU5URVJfU0hJRlQJIDAKKworCV9fbGUzMiByZWcxOworI2RlZmluZSBSWF9QQUNLRVRfVElNRVNUQU1QCTB4RkZGRjAwMDAgLyogUlggUGFja2V0IFRpbWVzdGFtcCAqLworI2RlZmluZSBSWF9QQUNLRVRfVElNRVNUQU1QX1NISUZUCTE2CisjZGVmaW5lIFRSQUZGSUNfUkVTRVJWRUQJMHgwMDAwRTAwMCAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBUUkFGRklDX1JFU0VSVkVEX1NISUZUICAxMworI2RlZmluZSBTVgkJCTB4MDAwMDEwMDAgLyogc3YgKi8KKyNkZWZpbmUgU1ZfU0hJRlQJCTEyCisjZGVmaW5lIFJYX1NFUVVFTkNFX05VTQkJMHgwMDAwMEZGRiAvKiBSWCBTZXF1ZW5jZSBOdW1iZXIgKi8KKyNkZWZpbmUgUlhfU0VRVUVOQ0VfTlVNX1NISUZUCTAKKworCV9fbGUzMiB0eF9yZXBsYXlfY250X2xvdzsgLyogVFggUmVwbGF5IENvdW50ZXIgTG93ICovCisKKwlfX2xlMTYgdHhfcmVwbGF5X2NudF9oaWdoOyAvKiBUWCBSZXBsYXkgQ291bnRlciBIaWdoICovCisJX19sZTE2IHJ4X3JlcGxheV9jbnRfaGlnaDsgLyogUlggUmVwbGF5IENvdW50ZXIgSGlnaCAqLworCisJX19iZTMyIHJ4X3JlcGxheV9jbnRfbG93OyAvKiBSWCBSZXBsYXkgQ291bnRlciBMb3cgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKgorICogU3RhdGlvbiBEZXNjcmlwdG9ycworICovCitzdHJ1Y3QgYWdueF9zdGEgeworCV9fbGUzMiB0eF9zZXNzaW9uX2tleXNbNF07IC8qIFRyYW5zbWl0IFNlc3Npb24gS2V5ICgwLTMpICovCisJX19sZTMyIHJ4X3Nlc3Npb25fa2V5c1s0XTsgLyogUmVjZWl2ZSBTZXNzaW9uIEtleSAoMC0zKSAqLworCisJX19sZTMyIHJlZzsKKyNkZWZpbmUgSURfMQkJCTB4QzAwMDAwMDAgLyogaWQgMSAqLworI2RlZmluZSBJRF8xX1NISUZUCQkzMAorI2RlZmluZSBJRF8wCQkJMHgzMDAwMDAwMCAvKiBpZCAwICovCisjZGVmaW5lIElEXzBfU0hJRlQJCTI4CisjZGVmaW5lIEVOQUJMRV9DT05DQVRFTkFUSU9OCTB4MEZGMDAwMDAgLyogRW5hYmxlIGNvbmNhdGVuYXRpb24gKi8KKyNkZWZpbmUgRU5BQkxFX0NPTkNBVEVOQVRJT05fU0hJRlQJMjAKKyNkZWZpbmUgRU5BQkxFX0RFQ09NUFJFU1NJT04JMHgwMDBGRjAwMCAvKiBFbmFibGUgZGVjb21wcmVzc2lvbiAqLworI2RlZmluZSBFTkFCTEVfREVDT01QUkVTU0lPTl9TSElGVAkxMgorI2RlZmluZSBTVEFfUkVTRVJWRUQJCTB4MDAwMDBDMDAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU1RBX1JFU0VSVkVEX1NISUZUCTEwCisjZGVmaW5lIEVBUAkJCTB4MDAwMDAyMDAgLyogRUFQICovCisjZGVmaW5lIEVBUF9TSElGVAkJOQorI2RlZmluZSBFRF9OVUxMCQkJMHgwMDAwMDEwMCAvKiBFRCBOVUxMICovCisjZGVmaW5lIEVEX05VTExfU0hJRlQJCTgKKyNkZWZpbmUgRU5DUllQVElPTl9QT0xJQ1kJMHgwMDAwMDBFMCAvKiBFbmNyeXB0aW9uIFBvbGljeSAqLworI2RlZmluZSBFTkNSWVBUSU9OX1BPTElDWV9TSElGVCA1CisjZGVmaW5lIERFRklORURfS0VZX0lECQkweDAwMDAwMDE4IC8qIERlZmluZWQgS2V5IElEICovCisjZGVmaW5lIERFRklORURfS0VZX0lEX1NISUZUCTMKKyNkZWZpbmUgRklYRURfS0VZCQkweDAwMDAwMDA0IC8qIEZpeGVkIEtleSAqLworI2RlZmluZSBGSVhFRF9LRVlfU0hJRlQJCTIKKyNkZWZpbmUgS0VZX1ZBTElECQkweDAwMDAwMDAyIC8qIEtleSBWYWxpZCAqLworI2RlZmluZSBLRVlfVkFMSURfU0hJRlQJCTEKKyNkZWZpbmUgU1RBVElPTl9WQUxJRAkJMHgwMDAwMDAwMSAvKiBTdGF0aW9uIFZhbGlkICovCisjZGVmaW5lIFNUQVRJT05fVkFMSURfU0hJRlQJMAorCisJX19sZTMyIHR4X2Flc19ibGtzX3VuaWNhc3Q7IC8qIFRYIEFFUyBCbGtzIFVuaWNhc3QgKi8KKwlfX2xlMzIgcnhfYWVzX2Jsa3NfdW5pY2FzdDsgLyogUlggQUVTIEJsa3MgVW5pY2FzdCAqLworCisJX19sZTE2IGFlc19mb3JtYXRfZXJyX3VuaWNhc3RfY250OyAvKiBBRVMgRm9ybWF0IEVycm9yIFVuaWNhc3QgQ291bnRzICovCisJX19sZTE2IGFlc19yZXBsYXlfdW5pY2FzdDsgLyogQUVTIFJlcGxheSBVbmljYXN0ICovCisKKwlfX2xlMTYgYWVzX2RlY3J5cHRfZXJyX3VuaWNhc3Q7CS8qIEFFUyBEZWNyeXB0IEVycm9yIFVuaWNhc3QgKi8KKwlfX2xlMTYgYWVzX2RlY3J5cHRfZXJyX2RlZmF1bHQ7CS8qIEFFUyBEZWNyeXB0IEVycm9yIGRlZmF1bHQgKi8KKworCV9fbGUxNiBzaW5nbGVfcmV0cnlfcGFja2V0czsgLyogU2luZ2xlIFJldHJ5IFBhY2tldHMgKi8KKwlfX2xlMTYgZmFpbGVkX3R4X3BhY2tldHM7IC8qIEZhaWxlZCBUeCBQYWNrZXRzICovCisKKwlfX2xlMTYgbXV0aV9yZXRyeV9wYWNrZXRzOyAvKiBNdWx0aXBsZSBSZXRyeSBQYWNrZXRzICovCisJX19sZTE2IGFja190aW1lb3V0czsJLyogQUNLIFRpbWVvdXRzICovCisKKwlfX2xlMTYgZnJhZ190eF9jbnQ7CS8qIEZyYWdtZW50IFRYIENvdW50cyAqLworCV9fbGUxNiBydHNfYnJxX3NlbnQ7CS8qIFJUUyBCcnEgU2VudCAqLworCisJX19sZTE2IHR4X3BhY2tldHM7CS8qIFRYIFBhY2tldHMgKi8KKwlfX2xlMTYgY3RzX2JhY2tfdGltZW91dDsgLyogQ1RTIEJhY2sgVGltZW91dCAqLworCisJX19sZTMyIHBoeV9zdGF0c19oaWdoOwkvKiBQSFkgU3RhdHMgSGlnaCAqLworCV9fbGUzMiBwaHlfc3RhdHNfbG93OwkvKiBQSFkgU3RhdHMgTG93ICovCisKKwlzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyB0cmFmZmljWzhdOwkvKiBUcmFmZmljIENsYXNzIFN0cnVjdHVyZSAoOCkgKi8KKworCV9fbGUxNiB0cmFmZmljX2NsYXNzMF9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMCBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3MxX2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyAxIEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczJfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDIgRnJhZ21lbnQgU3VjY2VzcyAqLworCV9fbGUxNiB0cmFmZmljX2NsYXNzM19mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMyBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3M0X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA0IEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczVfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDUgRnJhZ21lbnQgU3VjY2VzcyAqLworCV9fbGUxNiB0cmFmZmljX2NsYXNzNl9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgNiBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3M3X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA3IEZyYWdtZW50IFN1Y2Nlc3MgKi8KKworCV9fbGUxNiBudW1fZnJhZ19ub25fcHJpbWVfcmF0ZXM7IC8qIG51bWJlciBvZiBGcmFnbWVudHMgZm9yIG5vbi1wcmltZSByYXRlcyAqLworCV9fbGUxNiBhY2tfdGltZW91dF9ub25fcHJpbWVfcmF0ZXM7IC8qIEFDSyBUaW1lb3V0IGZvciBub24tcHJpbWUgcmF0ZXMgKi8KKworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworc3RydWN0IGFnbnhfYmVhY29uX2hkciB7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOyAvKiBUeCBTdGF0aW9uIFBvd2VyIFRlbXBsYXRlICAqLworCXU4IHBoeV9oZHJbNl07CQkvKiBQSFkgSGRyICovCisJdTggZnJhbWVfbGVuX2xvOwkvKiBGcmFtZSBMZW5ndGggTG8gKi8KKwl1OCBmcmFtZV9sZW5faGk7CS8qIEZyYW1lIExlbmd0aCBIaSAqLworCXU4IG1hY19oZHJbMjRdOwkJLyogTUFDIEhlYWRlciAqLworCS8qIEZJWE1FICovCisJLyogODAyLjExKGFiZykgYmVhY29uICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKwordm9pZCBoYXNoX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICptYWNfYWRkciwgdTggc3RhX2lkKTsKK3ZvaWQgaGFzaF9kdW1wKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4IHN0YV9pZCk7Cit2b2lkIGhhc2hfcmVhZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgcmVnaGksIHUzMiByZWdsbywgdTggc3RhX2lkKTsKK3ZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCk7CisKK3ZvaWQgZ2V0X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgKnBvd2VyLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCk7Cit2b2lkIHNldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwKKwkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgpOwordm9pZCBnZXRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV90eF93cSAqdHhfd3EsCisJCSAgIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KTsKK3ZvaWQgc2V0X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgKnR4X3dxLAorCQkgICB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCk7Cit2b2lkIGdldF9zdGEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhICpzdGEsIHVuc2lnbmVkIGludCBzdGFfaWR4KTsKK3ZvaWQgc2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpOworCit2b2lkIHN0YV9wb3dlcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBudW0pOwordm9pZCBzdGFfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgbnVtKTsKKworI2VuZGlmIC8qIEFHTlhfU1RBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAwNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvdGFibGUuYwpAQCAtMCwwICsxLDE2OCBAQAorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdueC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicGh5LmgiCisKK3N0YXRpYyBjb25zdCB1MzIKK3R4X2Zpcl90YWJsZVtdID0geyAweDE5LCAweDVkLCAweGNlLCAweDE1MSwgMHgxYzMsIDB4MWZmLCAweDFlYSwgMHgxN2MsIDB4Y2YsCisJCSAgIDB4MTksIDB4MzhlLCAweDM1MCwgMHgzNjIsIDB4M2FkLCAweDUsIDB4NDQsIDB4NTksIDB4NDksCisJCSAgIDB4MjEsIDB4M2Y3LCAweDNlMCwgMHgzZTMsIDB4M2YzLCAweDAgfTsKKwordm9pZCB0eF9maXJfdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHhfZmlyX3RhYmxlKTsgaSsrKQorCQlpb3dyaXRlMzIodHhfZmlyX3RhYmxlW2ldLCBjdGwgKyBBR05YX0ZJUl9CQVNFICsgaSo0KTsKK30gLyogZmlyX3RhYmxlX3NldHVwICovCisKKworc3RhdGljIGNvbnN0IHUzMgorZ2Fpbl90YWJsZVtdID0geyAweDgsIDB4OCwgMHhmLCAweDEzLCAweDE3LCAweDFiLCAweDFmLCAweDIzLCAweDI3LCAweDJiLAorCQkgMHgyZiwgMHgzMywgMHgzNywgMHgzYiwgMHgzZiwgMHg0MywgMHg0NywgMHg0YiwgMHg0ZiwKKwkJIDB4NTMsIDB4NTcsIDB4NWIsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsCisJCSAweDVmLCAweDVmLCAweDVmLCAweDVmIH07CisKK3ZvaWQgZ2Fpbl90YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYWluX3RhYmxlKTsgaSsrKSB7CisJCWlvd3JpdGUzMihnYWluX3RhYmxlW2ldLCBjdGwgKyBBR05YX0dBSU5fVEFCTEUgKyBpKjQpOworCQlpb3dyaXRlMzIoZ2Fpbl90YWJsZVtpXSwgY3RsICsgQUdOWF9HQUlOX1RBQkxFICsgaSo0ICsgMHg4MCk7CisJfQorfSAvKiBnYWluX3RhYmxlX2luaXQgKi8KKwordm9pZCBtb25pdG9yX2dhaW5fdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4NDQ7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHg2MSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHg2MSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorCWZvciAoaSA9IDB4NDQ7IGkgPCAweDY0OyBpICs9IDQpIHsKKwkJaW93cml0ZTMyKDB4NmUsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKKwkJaW93cml0ZTMyKDB4NmUsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOworCX0KKwlmb3IgKGkgPSAweDY0OyBpIDwgMHg5NDsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweDdhLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweDdhLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHg5NDsgaSA8IDB4ZGM7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHg4NywgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHg4NywgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorCWZvciAoaSA9IDB4ZGM7IGkgPCAweDE0ODsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweDk1LCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweDk1LCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHgxNDg7IGkgPCAweDFlODsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweGEyLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweGEyLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHgxZTg7IGkgPD0gMHgxZmM7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHhiMCwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHhiMCwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorfSAvKiBtb25pdG9yX2dhaW5fdGFibGVfaW5pdCAqLworCisKK3ZvaWQgcm91dGluZ190YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdW5zaWduZWQgaW50IHR5cGUsIHN1YnR5cGU7CisJdTMyIHJlZzsKKworCWRpc2FibGVfcmVjZWl2ZXIocHJpdik7CisKKwlmb3IgKCB0eXBlID0gMDsgdHlwZSA8IDB4MzsgdHlwZSsrICkgeworCQlmb3IgKHN1YnR5cGUgPSAwOyBzdWJ0eXBlIDwgMHgxMDsgc3VidHlwZSsrKSB7CisJCQkvKiAxLiBTZXQgUm91dGluZyB0YWJsZSB0byBSL1cgYW5kIHRvIFJldHVybiBzdGF0dXMgb24gUmVhZCAqLworCQkJcmVnID0gKHR5cGUgPDwgUk9VVEFCX1RZUEVfU0hJRlQpIHwKKwkJCQkoc3VidHlwZSA8PCBST1VUQUJfU1VCVFlQRV9TSElGVCk7CisJCQlyZWcgfD0gKDEgPDwgUk9VVEFCX1JXX1NISUZUKSB8ICgxIDw8IFJPVVRBQl9TVEFUVVNfU0hJRlQpOworCQkJaWYgKHR5cGUgPT0gUk9VVEFCX1RZUEVfREFUQSkgeworCQkJCS8qIE5VTEwgZ29lcyB0byBSRlAgKi8KKwkJCQlpZiAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMKQorLy8JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfUkZQOworCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0NQVTsKKwkJCQkvKiBRT1MgTlVMTCBnb2VzIHRvIENQVSAqLworCQkJCWVsc2UgaWYgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTCkKKwkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9DUFU7CisJCQkJLyogQWxsIERhdGEgYW5kIFFPUyBkYXRhIHN1YnR5cGVzIGdvIHRvIEVuY3J5cHRpb24gKi8KKwkJCQllbHNlIGlmICgoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9EQVRBKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfREFUQUFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX0RBVEFQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfREFUQVBPTExBQ0spIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NEQVRBKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX1FPU0RBVEFQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDS1BPTEwpKQorCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0VOQ1JZOworLy8JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfQ1BVOworCQkJCS8qRHJvcCBOVUxMIGFuZCBRT1MgTlVMTCBhY2ssIHBvbGwgYW5kIHBvbGwgYWNrKi8KKwkJCQllbHNlIGlmICgoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMQUNLKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTEFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTExQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTFBPTEwpIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMUE9MTEFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX1FPU05VTExQT0xMQUNLKSkKKy8vCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0RST1A7CisJCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfQ1BVOworCQkJfQorCQkJZWxzZQorCQkJCXJlZyB8PSAoUk9VVEFCX1JPVVRFX0NQVSk7CisJCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX1JYTV9ST1VUQUIpOworCQkJLyogQ2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIHN0YXR1cyBiaXQgY2xlYXJlZCAqLworCQkJcm91dGluZ190YWJsZV9kZWxheSgpOworCQl9CisJfQorCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKK30gLyogcm91dGluZ190YWJsZV9pbml0ICovCisKK3ZvaWQgdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDI4OyBpICs9IDQpCisJCWlvd3JpdGUzMigweGIwMGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJZm9yIChpID0gMzI7IGkgPD0gMTIwOyBpICs9IDgpIHsKKwkJaW93cml0ZTMyKDB4MWU1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwkJaW93cml0ZTMyKDB4YjAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7CisJfQorCisJZm9yIChpID0gMTI4OyBpIDw9IDE1NjsgaSArPSA0KQorCQlpb3dyaXRlMzIoMHg5ODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCWZvciAoaSA9IDE2MDsgaSA8PSAyNDg7IGkgKz0gOCkgeworCQlpb3dyaXRlMzIoMHgxODU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCQlpb3dyaXRlMzIoMHg5ODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKKwl9CisKKwlmb3IgKGkgPSAyNTY7IGkgPD0gMjg0OyBpICs9IDQpCisJCWlvd3JpdGUzMigweDk4MGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJZm9yIChpID0gMjg4OyBpIDw9IDM3NjsgaSArPSA4KSB7CisJCWlvd3JpdGUzMigweDFhNTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJCWlvd3JpdGUzMigweDE4NTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSArIDQpOworCX0KKworCWZvciAoaSA9IDUxMjsgaSA8PSA1NDA7IGkgKz0gNCkKKwkJaW93cml0ZTMyKDB4YzAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwlmb3IgKGkgPSA1NDQ7IGkgPD0gNjMyOyBpICs9IDgpIHsKKwkJaW93cml0ZTMyKDB4MjA1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwkJaW93cml0ZTMyKDB4YzAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7CisJfQorCisJZm9yIChpID0gNjQwOyBpIDw9IDY2ODsgaSArPSA0KQorCQlpb3dyaXRlMzIoMHhjODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCWZvciAoaSA9IDY3MjsgaSA8PSA3NjQ7IGkgKz0gOCkgeworCQlpb3dyaXRlMzIoMHgyMjU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCQlpb3dyaXRlMzIoMHhjODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3RhYmxlLmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjI2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgQUdOWF9UQUJMRV9IXworI2RlZmluZSBBR05YX1RBQkxFX0hfCisKK3ZvaWQgdHhfZmlyX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGdhaW5fdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgbW9uaXRvcl9nYWluX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIHJvdXRpbmdfdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKKworI2VuZGlmIC8qIEFHTlhfVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjAxNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngveG1pdC5jCkBAIC0wLDAgKzEsODE5IEBACisvKioKKyAqIEFpcmdvIE1JTU8gd2lyZWxlc3MgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IExpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+CisKKyAqIFRoYW5rcyBmb3IgSmVmZiBXaWxsaWFtcyA8YW5nZWxiYW5lQGdtYWlsLmNvbT4gZG8gcmV2ZXJzZSBlbmdpbmVlcgorICogd29ya3MgYW5kIHB1Ymxpc2hlZCB0aGUgU1BFQ1MgYXQgaHR0cDovL2FpcmdvLndkd2NvbnN1bHRpbmcubmV0L215bW9pbgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImFnbnguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInBoeS5oIgorCit1bnNpZ25lZCBpbnQgcnhfZnJhbWVfY250ID0gMDsKKy8vdW5zaWduZWQgaW50IGxvY2FsX3R4X3NlbnRfY250ID0gMDsKKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfcnhfZW5naW5lKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaW93cml0ZTMyKDB4MTAwLCBjdGwgKyBBR05YX0NJUl9SWENUTCk7CisJLyogV2FpdCBmb3IgUlggQ29udHJvbCB0byBoYXZlIHRoZSBEaXNhYmxlIFJ4IEludGVycnVwdCAoMHgxMDApIHNldCAqLworCWlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9yeF9lbmdpbmUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpb3dyaXRlMzIoMHg4MCwgY3RsICsgQUdOWF9DSVJfUlhDVEwpOworCWlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZV9yeF9pbnRlcnJ1cHQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJZGlzYWJsZV9yeF9lbmdpbmUocHJpdik7CisJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworCXJlZyAmPSB+MHgyMDsKKwlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENGRyk7CisJaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworfQorCitpbmxpbmUgdm9pZCBlbmFibGVfcnhfaW50ZXJydXB0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ0ZHKTsKKwlyZWcgfD0gMHgyMDsKKwlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENGRyk7CisJaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworCWVuYWJsZV9yeF9lbmdpbmUocHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9kZXNjX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjID0gcHJpdi0+cnguZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+cnguaW5mbyArIGlkeDsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPmRtYV9sZW4gPSBJRUVFODAyMTFfTUFYX1JUU19USFJFU0hPTEQgKyBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKTsKKwlpbmZvLT5za2IgPSBkZXZfYWxsb2Nfc2tiKGluZm8tPmRtYV9sZW4pOworCWlmIChpbmZvLT5za2IgPT0gTlVMTCkKKwkJYWdueF9idWcoInJlZmlsbCBlcnIiKTsKKworCWluZm8tPm1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBza2JfdGFpbF9wb2ludGVyKGluZm8tPnNrYiksCisJCQkJICAgICAgIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCWRlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoaW5mby0+bWFwcGluZyk7CisJLyogU2V0IHRoZSBvd25lciB0byB0aGUgY2FyZCAqLworCWRlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdShkZXNjLT5mcmFnKSB8IE9XTkVSKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2Rlc2NfcmVpbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpZHg7CisKKwkvKiBDYXVzZSBpZWVlODAyMTEgd2lsbCBmcmVlIHRoZSBza2IgYnVmZmVyLCBzbyB3ZSBuZWVkbid0IHRvIGZyZWUgaXQgYWdhaW4/ISAqLworCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgaW5mby0+bWFwcGluZywgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyeF9kZXNjX2luaXQocHJpdiwgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2Rlc2NfcmV1c2luZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT5yeC5kZXNjICsgaWR4OworCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT5yeC5pbmZvICsgaWR4OworCisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCWRlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoaW5mby0+bWFwcGluZyk7CisJLyogU2V0IHRoZSBvd25lciB0byB0aGUgY2FyZCAqLworCWRlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdShkZXNjLT5mcmFnKSB8IE9XTkVSKTsKK30KKworc3RhdGljIHZvaWQgcnhfZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnJ4LmRlc2MgKyBpZHg7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpZHg7CisKKwlCVUdfT04oIWRlc2MgfHwgIWluZm8pOworCWlmIChpbmZvLT5tYXBwaW5nKQorCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJaWYgKGluZm8tPnNrYikKKwkJZGV2X2tmcmVlX3NrYihpbmZvLT5za2IpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3R4X2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IGFnbnhfZGVzYyAqZGVzYywgc3RydWN0IGFnbnhfaW5mbyAqaW5mbykKK3sKKwlCVUdfT04oIWRlc2MgfHwgIWluZm8pOworCS8qIFRPRE8gbWFrZSBzdXJlIG1hcHBpbmcsIHNrYiBhbmQgbGVuIGFyZSBjb25zaXN0ZW5jeSAqLworCWlmIChpbmZvLT5tYXBwaW5nKQorCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsCisJCQkJIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChpbmZvLT50eXBlID09IFBBQ0tFVCkKKwkJZGV2X2tmcmVlX3NrYihpbmZvLT5za2IpOworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKK30KKworc3RhdGljIHZvaWQgdHhtX2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT50eG0uZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+dHhtLmluZm8gKyBpZHg7CisKKwlfX3R4X2Rlc2NfZnJlZShwcml2LCBkZXNjLCBpbmZvKTsKK30KKworc3RhdGljIHZvaWQgdHhkX2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT50eGQuZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+dHhkLmluZm8gKyBpZHg7CisKKwlfX3R4X2Rlc2NfZnJlZShwcml2LCBkZXNjLCBpbmZvKTsKK30KKworaW50IGZpbGxfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlwcml2LT50eGQuaWR4X3NlbnQgPSBwcml2LT50eG0uaWR4X3NlbnQgPSAwOworCXByaXYtPnJ4LmlkeCA9IHByaXYtPnR4bS5pZHggPSBwcml2LT50eGQuaWR4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeC5zaXplOyBpKyspCisJCXJ4X2Rlc2NfaW5pdChwcml2LCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhtLnNpemU7IGkrKykgeworCQltZW1zZXQocHJpdi0+dHhtLmRlc2MgKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykpOworCQltZW1zZXQocHJpdi0+dHhtLmluZm8gKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhkLnNpemU7IGkrKykgeworCQltZW1zZXQocHJpdi0+dHhkLmRlc2MgKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykpOworCQltZW1zZXQocHJpdi0+dHhkLmluZm8gKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykpOworCX0KKworCS8qIEZJWE1FIFNldCB0aGUgY2FyZCBSWCBUWE0gYW5kIFRYRCBhZGRyZXNzICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDTVNUQVJULCBwcml2LT5yeC5kbWEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ01FTkQsIHByaXYtPnR4bS5kbWEpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNU1RBUlQsIHByaXYtPnR4bS5kbWEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYTUVORCwgcHJpdi0+dHhkLmRtYSk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWERTVEFSVCwgcHJpdi0+dHhkLmRtYSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhERU5ELCBwcml2LT50eGQuZG1hICsKKwkJICAgICBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBwcml2LT50eGQuc2l6ZSk7CisKKwkvKiBGSVhNRSBSZWxpbnF1aXNoIGNvbnRyb2wgb2YgcmluZ3MgdG8gY2FyZCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMKTsKKwlyZWcgJj0gfjB4ODAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgcmVnKTsKKwlyZXR1cm4gMDsKK30gLyogZmlsbF9yaW5ncyAqLworCit2b2lkIHVuZmlsbF9yaW5ncyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnguc2l6ZTsgaSsrKQorCQlyeF9kZXNjX2ZyZWUocHJpdiwgaSk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4bS5zaXplOyBpKyspCisJCXR4bV9kZXNjX2ZyZWUocHJpdiwgaSk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4ZC5zaXplOyBpKyspCisJCXR4ZF9kZXNjX2ZyZWUocHJpdiwgaSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIEV4dHJhY3QgdGhlIGJpdHJhdGUgb3V0IG9mIGEgQ0NLIFBMQ1AgaGVhZGVyLgorICAgY29weSBmcm9tIGJjbTQzeHggZHJpdmVyICovCitzdGF0aWMgaW5saW5lIHU4IGFnbnhfcGxjcF9nZXRfYml0cmF0ZV9jY2soX19iZTMyICpwaHloZHJfMTFiKQoreworCS8qIEZJWE1FICovCisJc3dpdGNoICgqKHU4ICopcGh5aGRyXzExYikgeworCWNhc2UgMHgwQToKKwkJcmV0dXJuIDA7CisJY2FzZSAweDE0OgorCQlyZXR1cm4gMTsKKwljYXNlIDB4Mzc6CisJCXJldHVybiAyOworCWNhc2UgMHg2RToKKwkJcmV0dXJuIDM7CisJfQorCWFnbnhfYnVnKCJXcm9uZyBwbGNwIHJhdGUiKTsKKwlyZXR1cm4gMDsKK30KKworLyogRklYTUUgKi8KK3N0YXRpYyBpbmxpbmUgdTggYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oX19iZTMyICpwaHloZHJfMTFnKQoreworCXU4IHJhdGUgPSAqKHU4ICopcGh5aGRyXzExZyAmIDB4RjsKKworCXByaW50ayhQRlggIkcgbW9kZSByYXRlIGlzIDB4JXhcbiIsIHJhdGUpOworCXJldHVybiByYXRlOworfQorCisvKiBGSVhNRSAqLworc3RhdGljIHZvaWQgZ2V0X3J4X3N0YXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X2hkciAqaGRyLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXU4ICpyc3NpOworCXUzMiBub2lzZTsKKwkvKiBGSVhNRSBqdXN0IGZvciB0ZXN0ICovCisJaW50IHNuciA9IDQwOwkJLyogc2lnbmFsLXRvLW5vaXNlIHJhdGlvICovCisKKwltZW1zZXQoc3RhdCwgMCwgc2l6ZW9mKCpzdGF0KSk7CisJLyogUlNTSSAqLworCXJzc2kgPSAodTggKikmaGRyLT5waHlfc3RhdHNfbG87CisvLwlzdGF0LT5zc2kgPSAocnNzaVswXSArIHJzc2lbMV0gKyByc3NpWzJdKSAvIDM7CisJLyogTm9pc2UgKi8KKwlub2lzZSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfR0NSX05PSVNFMCk7CisJbm9pc2UgKz0gaW9yZWFkMzIoY3RsICsgQUdOWF9HQ1JfTk9JU0UxKTsKKwlub2lzZSArPSBpb3JlYWQzMihjdGwgKyBBR05YX0dDUl9OT0lTRTIpOworCXN0YXQtPm5vaXNlID0gbm9pc2UgLyAzOworCS8qIFNpZ25hbCBxdWFsaXR5ICovCisJLy9zbnIgPSBzdGF0LT5zc2kgLSBzdGF0LT5ub2lzZTsKKwlpZiAoc25yID49MCAmJiBzbnIgPCA0MCkKKwkJc3RhdC0+c2lnbmFsID0gNSAqIHNuciAvIDI7CisJZWxzZSBpZiAoc25yID49IDQwKQorCQlzdGF0LT5zaWduYWwgPSAxMDA7CisJZWxzZQorCQlzdGF0LT5zaWduYWwgPSAwOworCisKKwlpZiAoaGRyLT5fMTFiMCAmJiAhaGRyLT5fMTFnMCkgeworCQlzdGF0LT5yYXRlX2lkeCA9IGFnbnhfcGxjcF9nZXRfYml0cmF0ZV9jY2soJmhkci0+XzExYjApOworCX0gZWxzZSBpZiAoIWhkci0+XzExYjAgJiYgaGRyLT5fMTFnMCkgeworCQlwcmludGsoUEZYICJSWDogRm91bmQgRyBtb2RlIHBhY2tldFxuIik7CisJCXN0YXQtPnJhdGVfaWR4ID0gYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oJmhkci0+XzExZzApOworCX0gZWxzZQorCQlhZ254X2J1ZygiVW5rbm93biBwYWNrZXRzIHR5cGUiKTsKKworCisJc3RhdC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisJc3RhdC0+ZnJlcSA9IGFnbnhfY2hhbm5lbHNbcHJpdi0+Y2hhbm5lbCAtIDFdLmNlbnRlcl9mcmVxOworLy8Jc3RhdC0+YW50ZW5uYSA9IDM7CisvLwlzdGF0LT5tYWN0aW1lID0gYmUzMl90b19jcHUoaGRyLT50aW1lX3N0YW1wKTsKKy8vCXN0YXQtPmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21iaW5lX2hkcl9mcmFnKHN0cnVjdCBpZWVlODAyMTFfaGRyICppZWVlaGRyLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiBmY3RsOworCXVuc2lnbmVkIGludCBoZHJsZW47CisKKwlmY3RsID0gbGUxNl90b19jcHUoaWVlZWhkci0+ZnJhbWVfY29udHJvbCk7CisJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihmY3RsKTsKKwkvKiBGSVhNRSAqLworCWlmIChoZHJsZW4gPCAoMisyKzYpLyptaW5pbXVtIGhkciovIHx8CisJICAgIGhkcmxlbiA+IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImhkciBsZW4gaXMgJWRcbiIsIGhkcmxlbik7CisJCWFnbnhfYnVnKCJXcm9uZyBpZWVlODAyMTEgaGRyIGRldGVjdGVkIik7CisJfQorCXNrYl9wdXNoKHNrYiwgaGRybGVuKTsKKwltZW1jcHkoc2tiLT5kYXRhLCBpZWVlaGRyLCBoZHJsZW4pOworfSAvKiBjb21iaW5lX2hkcl9mcmFnICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFnbnhfcGFja2V0X2NoZWNrKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X2hkciAqYWdueGhkciwKKwkJCQkgICAgdW5zaWduZWQgcGFja2V0X2xlbikKK3sKKwlpZiAoYWdueF9nZXRfYml0cyhDUkNfRkFJTCwgQ1JDX0ZBSUxfU0hJRlQsIGJlMzJfdG9fY3B1KGFnbnhoZHItPnJlZzEpKSA9PSAxKXsKKwkJcHJpbnRrKFBGWCAiUlg6IENSQyBjaGVjayBmYWlsXG4iKTsKKwkJZ290byBkcm9wOworCX0KKwlpZiAocGFja2V0X2xlbiA+IDIwNDgpIHsKKwkJcHJpbnRrKFBGWCAiUlg6IFRvbyBsb25nIHBhY2tldCBkZXRlY3RlZFxuIik7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBGSVhNRSBKdXN0IHVzYWJsZSBmb3IgUHJvbWlvdXMgTW9kZSwgZm9yIE1hbmFnZSBtb2RlIGV4Y2x1ZGUgRkNTICovCisvKiAJaWYgKHBhY2tldF9sZW4gLSBzaXplb2YoKmFnbnhoZHIpIDwgRkNTX0xFTikgeyAqLworLyogCQlwcmludGsoUEZYICJSWDogVG9vIHNob3J0IHBhY2tldCBkZXRlY3RlZFxuIik7ICovCisvKiAJCWdvdG8gZHJvcDsgKi8KKy8qIAl9ICovCisJcmV0dXJuIDA7Citkcm9wOgorCXByaXYtPnN0YXRzLmRvdDExRkNTRXJyb3JDb3VudCsrOworCXJldHVybiAtMTsKK30KKwordm9pZCBoYW5kbGVfcnhfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGludCBsZW47CisvLwlBR05YX1RSQUNFOworCisJZG8geworCQlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOworCQl1MzIgZnJhZzsKKwkJc3RydWN0IGFnbnhfaW5mbyAqaW5mbzsKKwkJc3RydWN0IGFnbnhfaGRyICpoZHI7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuc2lnbmVkIGludCBpID0gcHJpdi0+cnguaWR4ICUgcHJpdi0+cnguc2l6ZTsKKworCQlkZXNjID0gcHJpdi0+cnguZGVzYyArIGk7CisJCWZyYWcgPSBiZTMyX3RvX2NwdShkZXNjLT5mcmFnKTsKKwkJaWYgKGZyYWcgJiBPV05FUikKKwkJCWJyZWFrOworCisJCWluZm8gPSBwcml2LT5yeC5pbmZvICsgaTsKKwkJc2tiID0gaW5mby0+c2tiOworCQloZHIgPSAoc3RydWN0IGFnbnhfaGRyICopKHNrYi0+ZGF0YSk7CisKKwkJbGVuID0gKGZyYWcgJiBQQUNLRVRfTEVOKSA+PiBQQUNLRVRfTEVOX1NISUZUOworCQlpZiAoYWdueF9wYWNrZXRfY2hlY2socHJpdiwgaGRyLCBsZW4pID09IC0xKSB7CisgCQkJcnhfZGVzY19yZXVzaW5nKHByaXYsIGkpOworCQkJY29udGludWU7CisJCX0KKwkJc2tiX3B1dChza2IsIGxlbik7CisKKwkJZG8geworCQkJdTE2IGZjdGw7CisJCQlmY3RsID0gbGUxNl90b19jcHUoKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkciktPmZyYW1lX2NvbnRyb2wpOworCQkJaWYgKChmY3RsICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpICE9IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pLy8gJiYgIShmY3RsICYgSUVFRTgwMjExX1NUWVBFX0JFQUNPTikpCisJCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkciwgIlJYIik7CisJCX0gd2hpbGUgKDApOworCisJCWlmIChoZHItPl8xMWIwICYmICFoZHItPl8xMWcwKSB7CisvKiAJCQlpbnQgajsgKi8KKy8qIAkJCXUxNiBmY3RsID0gbGUxNl90b19jcHUoKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkcikgKi8KKy8qIAkJCQkJICAgICAgIC0+ZnJhbWVfY29udHJvbCk7ICovCisvKiAJCQlpZiAoIChmY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpID09ICBJRUVFODAyMTFfRlRZUEVfREFUQSkgeyAqLworLyogCQkJCWFnbnhfcHJpbnRfcnhfaGRyKGhkcik7ICovCisvLyAJCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOworLyogCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspICovCisvKiAJCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCBqKTsJCSAqLworLyogCQkJfSAqLworCisJCQlnZXRfcnhfc3RhdHMocHJpdiwgaGRyLCAmc3RhdHVzKTsKKwkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwkJCWNvbWJpbmVfaGRyX2ZyYWcoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaGRyLT5tYWNfaGRyLCBza2IpOworCQl9IGVsc2UgaWYgKCFoZHItPl8xMWIwICYmIGhkci0+XzExZzApIHsKKy8vCQkJaW50IGo7CisJCQlhZ254X3ByaW50X3J4X2hkcihoZHIpOworCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOworLy8JCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJYWdueF9wcmludF9zdGFfdHhfd3EocHJpdiwgQlNTSURfU1RBSUQsIDApOworCisJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiYWdueDogUlhfUEFDS0VUOiAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkJCQkgICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4gKyA4KTsKKworLy8JCQlpZiAoYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oJmhkci0+XzExZzApID09IDApCisJCQlnZXRfcnhfc3RhdHMocHJpdiwgaGRyLCAmc3RhdHVzKTsKKwkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwkJCWNvbWJpbmVfaGRyX2ZyYWcoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopCisJCQkJCSAoKHZvaWQgKikmaGRyLT5tYWNfaGRyKSwgc2tiKTsKKy8vCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YSwgIlJYIEciKTsKKwkJfSBlbHNlCisJCQlhZ254X2J1ZygiVW5rbm93biBwYWNrZXRzIHR5cGUiKTsKKwkJaWVlZTgwMjExX3J4X2lycXNhZmUocHJpdi0+aHcsIHNrYiwgJnN0YXR1cyk7CisJCXJ4X2Rlc2NfcmVpbml0KHByaXYsIGkpOworCisJfSB3aGlsZSAoIHByaXYtPnJ4LmlkeCsrICk7Cit9IC8qIGhhbmRsZV9yeF9pcnEgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV90eF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfcmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOworCXN0cnVjdCBhZ254X2luZm8gKmluZm87CisJdW5zaWduZWQgaW50IGlkeDsKKworCWZvciAoaWR4ID0gcmluZy0+aWR4X3NlbnQ7IGlkeCA8IHJpbmctPmlkeDsgaWR4KyspIHsKKwkJdW5zaWduZWQgaW50IGkgPSBpZHggJSByaW5nLT5zaXplOworCQl1MzIgIGZyYWc7CisKKwkJZGVzYyA9IHJpbmctPmRlc2MgKyBpOworCQlpbmZvID0gcmluZy0+aW5mbyArIGk7CisKKwkJZnJhZyA9IGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpOworCQlpZiAoZnJhZyAmIE9XTkVSKSB7CisJCQlpZiAoaW5mby0+dHlwZSA9PSBIRUFERVIpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJYWdueF9idWcoIlRYIGVycm9yIik7CisJCX0KKworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWRvIHsKKy8vCQkJaW50IGo7CisJCQlzaXplX3QgbGVuOworCQkJbGVuID0gaW5mby0+c2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSArIGluZm8tPmhkcl9sZW47CisJCQkvLwlpZiAobGVuID09IDYxNCkgeworLy8JCQkJYWdueF9wcmludF9kZXNjKGRlc2MpOworCQkJCWlmIChpbmZvLT50eXBlID09IFBBQ0tFVCkgeworLy8JCQkJCWFnbnhfcHJpbnRfdHhfaGRyKChzdHJ1Y3QgYWdueF9oZHIgKilpbmZvLT5za2ItPmRhdGEpOworLyogCQkJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBMT0NBTF9TVEFJRCk7ICovCisvKiAJCQkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIExPQ0FMX1NUQUlEKTsgKi8KKy8qIC8vCQkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLworLyogCQkJCQlhZ254X3ByaW50X3N0YV90eF93cShwcml2LCBMT0NBTF9TVEFJRCwgMCk7ICovCisvLwkJCQkJYWdueF9wcmludF9zdGFfcG93ZXIocHJpdiwgQlNTSURfU1RBSUQpOworLy8JCQkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIEJTU0lEX1NUQUlEKTsKKy8vCQkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorLy8JCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCAwKTsKKwkJCQl9CisvLwkJCX0KKwkJfSB3aGlsZSAoMCk7CisKKwkJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKSB7CisvLwkJCWR1bXBfdHhtX3JlZ2lzdGVycyhwcml2KTsKKy8vCQkJZHVtcF9yeG1fcmVnaXN0ZXJzKHByaXYpOworLy8JCQlkdW1wX2JtX3JlZ2lzdGVycyhwcml2KTsKKy8vCQkJZHVtcF9jaXJfcmVnaXN0ZXJzKHByaXYpOworCQl9CisKKwkJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKSB7CisvLwkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aSA9IElFRUU4MDIxMV9TS0JfQ0IoaW5mby0+c2tiKTsKKworCQkJc2tiX3B1bGwoaW5mby0+c2tiLCBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSk7CisJCQltZW1jcHkoc2tiX3B1c2goaW5mby0+c2tiLCBpbmZvLT5oZHJfbGVuKSwgJmluZm8tPmhkciwgaW5mby0+aGRyX2xlbik7CisKKy8vCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWluZm8tPnNrYi0+ZGF0YSwgIlRYX0hBTkRMRSIpOworLyogCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImFnbng6IFRYX0hBTkRMRTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgKi8KKy8qIAkJCQkJICAgICBpbmZvLT5za2ItPmRhdGEsIGluZm8tPnNrYi0+bGVuKTsgKi8KKworCQkJaWYgKCEodHhpLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkKKwkJCQl0eGktPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKKworCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCBpbmZvLT5za2IpOworCisKKy8qIAkJCQlpbmZvLT50eF9zdGF0dXMucXVldWVfbnVtYmVyID0gKHJpbmctPnNpemUgLSBpKSAvIDI7ICovCisvKiAJCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCBpbmZvLT5za2IsICYoaW5mby0+dHhfc3RhdHVzKSk7ICovCisvKiAJCQl9IGVsc2UgKi8KKy8qIAkJCQlkZXZfa2ZyZWVfc2tiX2lycShpbmZvLT5za2IpOyAqLworIAkJfQorCQltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7CisJCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwl9CisKKwlyaW5nLT5pZHhfc2VudCA9IGlkeDsKKwkvKiBUT0RPIGZpbGwgdGhlIHByaXYtPmxvd19sZXZlbF9zdGF0cyAqLworCisJLyogaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aHcsIDApOyAqLworfQorCit2b2lkIGhhbmRsZV90eG1faXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJaGFuZGxlX3R4X2lycShwcml2LCAmcHJpdi0+dHhtKTsKK30KKwordm9pZCBoYW5kbGVfdHhkX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCWhhbmRsZV90eF9pcnEocHJpdiwgJnByaXYtPnR4ZCk7Cit9CisKK3ZvaWQgaGFuZGxlX290aGVyX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworLy8Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHN0YXR1cyA9IHByaXYtPmlycV9zdGF0dXM7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCWlmIChzdGF0dXMgJiBJUlFfVFhfQkVBQ09OKSB7CisJCWlvd3JpdGUzMihJUlFfVFhfQkVBQ09OLCBjdGwgKyBBR05YX0lOVF9TVEFUKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBCZWFjb24gY29udHJvbCBpcyAwWCUuOFhcbiIsIGlvcmVhZDMyKGN0bCArIEFHTlhfVFhNX0JFQUNPTl9DVEwpKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBCZWFjb24gcnggZnJhbWUgbnVtOiAlZFxuIiwgcnhfZnJhbWVfY250KTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9UWF9SRVRSWSkgeworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX1RYTV9SRVRSWVNUQUlEKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBSZXRyeSwgUkVUUlkgU1RBIElEIGlzICV4XG4iLCByZWcpOworCX0KKwlpZiAoc3RhdHVzICYgSVJRX1RYX0FDVElWSVRZKQorCQlwcmludGsoUEZYICJJUlE6IFRYIEFjdGl2aXR5XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1JYX0FDVElWSVRZKQorCQlwcmludGsoUEZYICJJUlE6IFJYIEFjdGl2aXR5XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1JYX1gpCisJCXByaW50ayhQRlggIklSUTogUlggWFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9SWF9ZKSB7CisJCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfSU5UX01BU0spOworCQlyZWcgJj0gfklSUV9SWF9ZOworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJaW93cml0ZTMyKElSUV9SWF9ZLCBjdGwgKyBBR05YX0lOVF9TVEFUKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBSWCBZXG4iKTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9SWF9IQVNISElUKSAgeworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJcmVnICY9IH5JUlFfUlhfSEFTSEhJVDsKKwkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfTUFTSyk7CisJCWlvd3JpdGUzMihJUlFfUlhfSEFTSEhJVCwgY3RsICsgQUdOWF9JTlRfU1RBVCk7CisJCXByaW50ayhQRlggIklSUTogUlggSGFzaCBIaXRcbiIpOworCisJfQorCWlmIChzdGF0dXMgJiBJUlFfUlhfRlJBTUUpIHsKKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfTUFTSyk7CisJCXJlZyAmPSB+SVJRX1JYX0ZSQU1FOworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJaW93cml0ZTMyKElSUV9SWF9GUkFNRSwgY3RsICsgQUdOWF9JTlRfU1RBVCk7CisJCXByaW50ayhQRlggIklSUTogUlggRnJhbWVcbiIpOworIAkJcnhfZnJhbWVfY250Kys7CisJfQorCWlmIChzdGF0dXMgJiBJUlFfRVJSX0lOVCkgeworCQlpb3dyaXRlMzIoSVJRX0VSUl9JTlQsIGN0bCArIEFHTlhfSU5UX1NUQVQpOworLy8JCWFnbnhfaHdfcmVzZXQocHJpdik7CisJCXByaW50ayhQRlggIklSUTogRXJyb3IgSW50ZXJydXB0XG4iKTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9UWF9RVUVfRlVMTCkKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBXb3JrcXVldWUgRnVsbFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9CQU5ETUFOX0VSUikKKwkJcHJpbnRrKFBGWCAiSVJROiBCYW5kd2lkdGggTWFuYWdlbWVudCBFcnJvclxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9UWF9ESVNBQkxFKQorCQlwcmludGsoUEZYICJJUlE6IFRYIERpc2FibGVcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUlhfSVZBU0VTS0VZKQorCQlwcmludGsoUEZYICJJUlE6IFJYIEludmFsaWQgU2Vzc2lvbiBLZXlcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUkVQX1RISElUKQorCQlwcmludGsoUEZYICJJUlE6IFJlcGxheSBUaHJlc2hvbGQgSGl0XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1RJTUVSMSkKKwkJcHJpbnRrKFBGWCAiSVJROiBUaW1lcjFcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfVElNRVJfQ05UKQorCQlwcmludGsoUEZYICJJUlE6IFRpbWVyIENvdW50XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1BIWV9GQVNUSU5UKQorCQlwcmludGsoUEZYICJJUlE6IFBoeSBGYXN0IEludGVycnVwdFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9QSFlfU0xPV0lOVCkKKwkJcHJpbnRrKFBGWCAiSVJROiBQaHkgU2xvdyBJbnRlcnJ1cHRcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfT1RIRVIpCisJCXByaW50ayhQRlggIklSUTogMHg4MDAwMDAwMFxuIik7Cit9IC8qIGhhbmRsZV9vdGhlcl9pcnEgKi8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcm91dGVfZmxhZ19zZXQoc3RydWN0IGFnbnhfaGRyICp0eGhkcikKK3sKKy8vCXUzMiByZWcgPSAwOworCisJLyogRklYTUUgKi8KKy8qICAJcmVnID0gKDB4NyA8PCBST1VURV9DT01QUkVTU0lPTl9TSElGVCkgJiBST1VURV9DT01QUkVTU0lPTjsgKi8KKy8qIAl0eGhkci0+cmVnNSA9IGNwdV90b19iZTMyKHJlZyk7ICovCisgCXR4aGRyLT5yZWc1ID0gKDB4YSA8PCAweDApIHwgKDB4NyA8PCAweDE4KTsKKy8vIAl0eGhkci0+cmVnNSA9IGNwdV90b19iZTMyKCgweGEgPDwgMHgwKSB8ICgweDcgPDwgMHgxOCkpOworLy8gCXR4aGRyLT5yZWc1ID0gY3B1X3RvX2JlMzIoMHg3IDw8IDB4MCk7Cit9CisKKy8qIFJldHVybiAwIGlmIG5vIG1hdGNoICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfcG93ZXJfbGV2ZWwodW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBhbnRlbm5hc19udW0pCit7CisJdW5zaWduZWQgaW50IHBvd2VyX2xldmVsOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAxMDoKKwljYXNlIDIwOgorCWNhc2UgNTU6CisJY2FzZSA2MDoKKwljYXNlIDkwOgorCWNhc2UgMTIwOiBwb3dlcl9sZXZlbCA9IDIyOyBicmVhazsKKwljYXNlIDE4MDogcG93ZXJfbGV2ZWwgPSAxOTsgYnJlYWs7CisJY2FzZSAyNDA6IHBvd2VyX2xldmVsID0gMTg7IGJyZWFrOworCWNhc2UgMzYwOiBwb3dlcl9sZXZlbCA9IDE2OyBicmVhazsKKwljYXNlIDQ4MDogcG93ZXJfbGV2ZWwgPSAxNTsgYnJlYWs7CisJY2FzZSA1NDA6IHBvd2VyX2xldmVsID0gMTQ7IGJyZWFrOworCWRlZmF1bHQ6CisJCWFnbnhfYnVnKCJFcnJvciByYXRlIHNldHRpbmdcbiIpOworCX0KKworCWlmIChwb3dlcl9sZXZlbCAmJiAoYW50ZW5uYXNfbnVtID09IDIpKQorCQlwb3dlcl9sZXZlbCAtPSAzOworCisJcmV0dXJuIHBvd2VyX2xldmVsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9hZ254X2hkcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9pbmZvICp0eF9pbmZvKQoreworCXN0cnVjdCBhZ254X2hkciAqdHhoZHIgPSAoc3RydWN0IGFnbnhfaGRyICopdHhfaW5mby0+c2tiLT5kYXRhOworCXNpemVfdCBsZW47CisJdTE2IGZjID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikmdHhfaW5mby0+aGRyKTsKKwl1MzIgcmVnOworCisJbWVtc2V0KHR4aGRyLCAwLCBzaXplb2YoKnR4aGRyKSk7CisKKy8vCXJlZyA9IGFnbnhfc2V0X2JpdHMoU1RBVElPTl9JRCwgU1RBVElPTl9JRF9TSElGVCwgTE9DQUxfU1RBSUQpOworCXJlZyA9IGFnbnhfc2V0X2JpdHMoU1RBVElPTl9JRCwgU1RBVElPTl9JRF9TSElGVCwgQlNTSURfU1RBSUQpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFdPUktRVUVVRV9JRCwgV09SS1FVRVVFX0lEX1NISUZULCAwKTsKKwl0eGhkci0+cmVnNCA9IGNwdV90b19iZTMyKHJlZyk7CisKKwkvKiBTZXQgdGhlIEhhcmR3YXJlIFNlcXVlbmNlIE51bWJlciB0byAxPyAqLworCXJlZyA9IGFnbnhfc2V0X2JpdHMoU0VRVUVOQ0VfTlVNQkVSLCBTRVFVRU5DRV9OVU1CRVJfU0hJRlQsIDApOworLy8JcmVnID0gYWdueF9zZXRfYml0cyhTRVFVRU5DRV9OVU1CRVIsIFNFUVVFTkNFX05VTUJFUl9TSElGVCwgMSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoTUFDX0hEUl9MRU4sIE1BQ19IRFJfTEVOX1NISUZULCB0eF9pbmZvLT5oZHJfbGVuKTsKKwl0eGhkci0+cmVnMSA9IGNwdV90b19iZTMyKHJlZyk7CisJLyogU2V0IHRoZSBhZ254X2hkcidzIE1BQyBoZWFkZXIgKi8KKwltZW1jcHkodHhoZHItPm1hY19oZHIsICZ0eF9pbmZvLT5oZHIsIHR4X2luZm8tPmhkcl9sZW4pOworCisJcmVnID0gYWdueF9zZXRfYml0cyhBQ0ssIEFDS19TSElGVCwgMSk7CisvLwlyZWcgPSBhZ254X3NldF9iaXRzKEFDSywgQUNLX1NISUZULCAwKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhNVUxUSUNBU1QsIE1VTFRJQ0FTVF9TSElGVCwgMCk7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhNVUxUSUNBU1QsIE1VTFRJQ0FTVF9TSElGVCwgMSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoUkVMQVksIFJFTEFZX1NISUZULCAwKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhUTSwgVE1fU0hJRlQsIDApOworCXR4aGRyLT5yZWcwID0gY3B1X3RvX2JlMzIocmVnKTsKKworCS8qIFNldCB0aGUgbG9uZyBhbmQgc2hvcnQgcmV0cnkgbGltaXRzICovCisgCXR4aGRyLT50eC5zaG9ydF9yZXRyeV9saW1pdCA9IHR4X2luZm8tPnR4aS0+Y29udHJvbC5yYXRlc1swXS5jb3VudDsKKyAJdHhoZHItPnR4LmxvbmdfcmV0cnlfbGltaXQgPSB0eF9pbmZvLT50eGktPmNvbnRyb2wucmF0ZXNbMF0uY291bnQ7CisKKwkvKiBGSVhNRSAqLworCWxlbiA9IHR4X2luZm8tPnNrYi0+bGVuIC0gc2l6ZW9mKCp0eGhkcikgKyB0eF9pbmZvLT5oZHJfbGVuICsgRkNTX0xFTjsKKwlpZiAoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpCisJCWxlbiArPSA4OworCWxlbiA9IDIzOTg7CisJcmVnID0gYWdueF9zZXRfYml0cyhGUkFHX1NJWkUsIEZSQUdfU0laRV9TSElGVCwgbGVuKTsKKwlsZW4gPSB0eF9pbmZvLT5za2ItPmxlbiAtIHNpemVvZigqdHhoZHIpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFBBWUxPQURfTEVOLCBQQVlMT0FEX0xFTl9TSElGVCwgbGVuKTsKKwl0eGhkci0+cmVnMyA9IGNwdV90b19iZTMyKHJlZyk7CisKKwlyb3V0ZV9mbGFnX3NldCh0eGhkcik7Cit9IC8qIGZpbGxfaGRyICovCisKK3N0YXRpYyB2b2lkIHR4bV9wb3dlcl9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGkpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisKKwkvKiBGSVhNRSAqLworCWlmICh0eGktPmNvbnRyb2wucmF0ZXNbMF0uaWR4IDwgMCkgeworCQkvKiBGb3IgQiBtb2RlIFNob3J0IFByZWFtYmxlICovCisJCXJlZyA9IGFnbnhfc2V0X2JpdHMoUEhZX01PREUsIFBIWV9NT0RFX1NISUZULCBBR05YX01PREVfODAyMTFCX1NIT1JUKTsKKy8vCQljb250cm9sLT50eF9yYXRlID0gLWNvbnRyb2wtPnR4X3JhdGU7CisJfSBlbHNlCisJCXJlZyA9IGFnbnhfc2V0X2JpdHMoUEhZX01PREUsIFBIWV9NT0RFX1NISUZULCBBR05YX01PREVfODAyMTFHKTsKKy8vCQlyZWcgPSBhZ254X3NldF9iaXRzKFBIWV9NT0RFLCBQSFlfTU9ERV9TSElGVCwgQUdOWF9NT0RFXzgwMjExQl9MT05HKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhTSUdOQUwsIFNJR05BTF9TSElGVCwgMHhCKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhSQVRFLCBSQVRFX1NISUZULCAweEIpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoUE9XRVJfTEVWRUwsIFBPV0VSX0xFVkVMX1NISUZULCAxNSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoUE9XRVJfTEVWRUwsIFBPV0VSX0xFVkVMX1NISUZULCAyMCk7CisJLyogaWYgcmF0ZSA8IDExTSBzZXQgaXQgdG8gMCAqLworCXJlZyB8PSBhZ254X3NldF9iaXRzKE5VTV9UUkFOU01JVFRFUlMsIE5VTV9UUkFOU01JVFRFUlNfU0hJRlQsIDEpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoRURDRiwgRURDRl9TSElGVCwgMSk7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhUSUZTLCBUSUZTX1NISUZULCAxKTsKKworCXBvd2VyLnJlZyA9IHJlZzsKKy8vCXBvd2VyLnJlZyA9IGNwdV90b19sZTMyKHJlZyk7CisKKy8vCXNldF9zdGFfcG93ZXIocHJpdiwgJnBvd2VyLCBMT0NBTF9TVEFJRCk7CisJc2V0X3N0YV9wb3dlcihwcml2LCAmcG93ZXIsIEJTU0lEX1NUQUlEKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHhfcGFja2V0X2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGllZWVfbGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKwlpZiAoc2tiLT5sZW4gPiAyMDQ4KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxlbmd0aCBpcyAlZFxuIiwgc2tiLT5sZW4pOworCQlhZ254X2J1ZygiVG9vIGxvbmcgVFggc2tiIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogRklYTUUgKi8KKwlpZiAoc2tiLT5sZW4gPT0gaWVlZV9sZW4pIHsKKwkJcHJpbnRrKFBGWCAiQSBzdHJhbmdlIFRYIHBhY2tldFxuIik7CisJCXJldHVybiAtMTsKKwkJLyogdHhfZmFpbGVfaXJxc2FmZSgpOyAqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2FnbnhfdHgoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgYWdueF9yaW5nICpyaW5nKQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmhkcl9kZXNjLCAqZnJhZ19kZXNjOworCXN0cnVjdCBhZ254X2luZm8gKmhkcl9pbmZvLCAqZnJhZ19pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhpID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogVGhlIFJYIGludGVycnVwdCBuZWVkIGJlIERpc2FibGUgdW50aWwgdGhpcyBUWCBwYWNrZXQKKwkgICBpcyBoYW5kbGVkIGluIHRoZSBuZXh0IHR4IGludGVycnVwdCAqLworCWRpc2FibGVfcnhfaW50ZXJydXB0KHByaXYpOworCisJaSA9IHJpbmctPmlkeDsKKwlyaW5nLT5pZHggKz0gMjsKKy8qICAgCWlmIChwcml2LT50eG1faWR4IC0gcHJpdi0+dHhtX2lkeF9zZW50ID09IEFHTlhfVFhNX1JJTkdfU0laRSAtIDIpICovCisvKiAJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmh3LCAwKTsgKi8KKworCS8qIFNldCBhZ254IGhlYWRlcidzIGluZm8gYW5kIGRlc2MgKi8KKwlpICU9IHJpbmctPnNpemU7CisJaGRyX2Rlc2MgPSByaW5nLT5kZXNjICsgaTsKKwloZHJfaW5mbyA9IHJpbmctPmluZm8gKyBpOworCWhkcl9pbmZvLT5oZHJfbGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKwltZW1jcHkoJmhkcl9pbmZvLT5oZHIsIHNrYi0+ZGF0YSwgaGRyX2luZm8tPmhkcl9sZW4pOworCisJLyogQWRkIHRoZSBhZ254IGhlYWRlciB0byB0aGUgZnJvbnQgb2YgdGhlIFNLQiAqLworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBhZ254X2hkcikgLSBoZHJfaW5mby0+aGRyX2xlbik7CisKKwloZHJfaW5mby0+dHhpID0gdHhpOworCWhkcl9pbmZvLT5kbWFfbGVuID0gc2l6ZW9mKHN0cnVjdCBhZ254X2hkcik7CisJaGRyX2luZm8tPnNrYiA9IHNrYjsKKwloZHJfaW5mby0+dHlwZSA9IEhFQURFUjsKKwlmaWxsX2FnbnhfaGRyKHByaXYsIGhkcl9pbmZvKTsKKwloZHJfaW5mby0+bWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgaGRyX2luZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWRvIHsKKwkJdTMyIGZyYWcgPSAwOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoRklSU1RfRlJBRywgRklSU1RfRlJBR19TSElGVCwgMSk7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhMQVNUX0ZSQUcsIExBU1RfRlJBR19TSElGVCwgMCk7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhQQUNLRVRfTEVOLCBQQUNLRVRfTEVOX1NISUZULCBza2ItPmxlbik7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhGSVJTVF9GUkFHX0xFTiwgRklSU1RfRlJBR19MRU5fU0hJRlQsIDEpOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoT1dORVIsIE9XTkVSX1NISUZULCAxKTsKKwkJaGRyX2Rlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihmcmFnKTsKKwl9IHdoaWxlICgwKTsKKwloZHJfZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihoZHJfaW5mby0+bWFwcGluZyk7CisKKworCS8qIFNldCBGcmFnJ3MgaW5mbyBhbmQgZGVzYyAqLworCWkgPSAoaSArIDEpICUgcmluZy0+c2l6ZTsKKwlmcmFnX2Rlc2MgPSByaW5nLT5kZXNjICsgaTsKKwlmcmFnX2luZm8gPSByaW5nLT5pbmZvICsgaTsKKwltZW1jcHkoZnJhZ19pbmZvLCBoZHJfaW5mbywgc2l6ZW9mKHN0cnVjdCBhZ254X2luZm8pKTsKKwlmcmFnX2luZm8tPnR5cGUgPSBQQUNLRVQ7CisJZnJhZ19pbmZvLT5kbWFfbGVuID0gc2tiLT5sZW4gLSBoZHJfaW5mby0+ZG1hX2xlbjsKKwlmcmFnX2luZm8tPm1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBza2ItPmRhdGEgKyBoZHJfaW5mby0+ZG1hX2xlbiwKKwkJCQkJICAgIGZyYWdfaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJZG8geworCQl1MzIgZnJhZyA9IDA7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhGSVJTVF9GUkFHLCBGSVJTVF9GUkFHX1NISUZULCAwKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKExBU1RfRlJBRywgTEFTVF9GUkFHX1NISUZULCAxKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKFBBQ0tFVF9MRU4sIFBBQ0tFVF9MRU5fU0hJRlQsIHNrYi0+bGVuKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKFNVQl9GUkFHX0xFTiwgU1VCX0ZSQUdfTEVOX1NISUZULCBmcmFnX2luZm8tPmRtYV9sZW4pOworCQlmcmFnX2Rlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihmcmFnKTsKKwl9IHdoaWxlICgwKTsKKwlmcmFnX2Rlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoZnJhZ19pbmZvLT5tYXBwaW5nKTsKKworCXR4bV9wb3dlcl9zZXQocHJpdiwgdHhpKTsKKworLyogCWRvIHsgKi8KKy8qIAkJaW50IGo7ICovCisvKiAJCXNpemVfdCBsZW47ICovCisvKiAJCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2luZm8tPmRtYV9sZW4gKyBoZHJfaW5mby0+aGRyX2xlbjsgICovCisvKiAvLwkJaWYgKGxlbiA9PSA2MTQpIHsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfZGVzYyhoZHJfZGVzYyk7ICovCisvKiAJCQlhZ254X3ByaW50X2Rlc2MoZnJhZ19kZXNjKTsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfdHhfaGRyKChzdHJ1Y3QgYWdueF9oZHIgKilza2ItPmRhdGEpOyAqLworLyogCQkJYWdueF9wcmludF9zdGFfcG93ZXIocHJpdiwgTE9DQUxfU1RBSUQpOyAqLworLyogCQkJYWdueF9wcmludF9zdGEocHJpdiwgTE9DQUxfU1RBSUQpOyAqLworLyogCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgKi8KKy8qIAkJCQlhZ254X3ByaW50X3N0YV90eF93cShwcml2LCBMT0NBTF9TVEFJRCwgaik7ICovCisvKiAJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBCU1NJRF9TVEFJRCk7ICovCisvKiAJCQlhZ254X3ByaW50X3N0YShwcml2LCBCU1NJRF9TVEFJRCk7ICovCisvKiAJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLworLyogCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCBqKTsgKi8KKy8qIAkJCS8vCX0gKi8KKy8qIAl9IHdoaWxlICgwKTsgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIEZJWE1FIHVnbHkgY29kZSAqLworCS8qIFRyaWdnZXIgVFhNICovCisJZG8geworCQl1MzIgcmVnOworCQlyZWcgPSAoaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhNQ1RMKSk7CisJCXJlZyB8PSAweDg7CisJCWlvd3JpdGUzMigocmVnKSwgcHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwl9d2hpbGUgKDApOworCisJLyogVHJpZ2dlciBUWEQgKi8KKwlkbyB7CisJCXUzMiByZWc7CisJCXJlZyA9IChpb3JlYWQzMihwcml2LT5jdGwgKyBBR05YX0NJUl9UWERDVEwpKTsKKwkJcmVnIHw9IDB4ODsKKwkJaW93cml0ZTMyKChyZWcpLCBwcml2LT5jdGwgKyBBR05YX0NJUl9UWERDVEwpOworCX13aGlsZSAoMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9hZ254X3R4KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTE2IGZjdGw7CisKKwlpZiAodHhfcGFja2V0X2NoZWNrKHNrYikpCisJCXJldHVybiAwOworCisvKiAJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImFnbng6IFRYX1BBQ0tFVDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgKi8KKy8qIAkJCSAgICAgc2tiLT5kYXRhLCBza2ItPmxlbik7ICovCisKKyAgICAgICAgZmN0bCA9IGxlMTZfdG9fY3B1KCooKF9fbGUxNiAqKXNrYi0+ZGF0YSkpOworCisJaWYgKCAoZmN0bCAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSAgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgKQorCQlyZXR1cm4gX19hZ254X3R4KHByaXYsIHNrYiwgJnByaXYtPnR4ZCk7CisJZWxzZQorCQlyZXR1cm4gX19hZ254X3R4KHByaXYsIHNrYiwgJnByaXYtPnR4bSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhYzQxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmgKQEAgLTAsMCArMSwyNTAgQEAKKyNpZm5kZWYgQUdOWF9YTUlUX0hfCisjZGVmaW5lIEFHTlhfWE1JVF9IXworCisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKK3N0cnVjdCBhZ254X3ByaXY7CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFnbnhfc2V0X2JpdHModTMyIG1hc2ssIHU4IHNoaWZ0LCB1MzIgdmFsdWUpCit7CisJcmV0dXJuICh2YWx1ZSA8PCBzaGlmdCkgJiBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBhZ254X2dldF9iaXRzKHUzMiBtYXNrLCB1OCBzaGlmdCwgdTMyIHZhbHVlKQoreworCXJldHVybiAodmFsdWUgJiBtYXNrKSA+PiBzaGlmdDsKK30KKworCitzdHJ1Y3QgYWdueF9yeCB7CisJX19iZTE2IHJ4X3BhY2tldF9kdXJhdGlvbjsgLyogIFJYIFBhY2tldCBEdXJhdGlvbiAqLworCV9fYmUxNiByZXBsYXlfY250OwkvKiBSZXBsYXkgQ291bnQgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKK3N0cnVjdCBhZ254X3R4IHsKKwl1OCBsb25nX3JldHJ5X2xpbWl0OyAvKiBMb25nIFJldHJ5IExpbWl0ICovCisJdTggc2hvcnRfcmV0cnlfbGltaXQ7IC8qIFNob3J0IFJldHJ5IExpbWl0ICovCisJdTggbG9uZ19yZXRyeV9jbnQ7CS8qIExvbmcgUmV0cnkgQ291bnQgKi8KKwl1OCBzaG9ydF9yZXRyeV9jbnQ7IC8qIFNob3J0IFJldHJ5IENvdW50ICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCisvKiBDb3B5IGZyb20gYmNtNDN4eCAqLworI2RlZmluZSBQNERfQllUM1MobWFnaWMsIG5yX2J5dGVzKSAgICAgIHU4IF9fcDRkZGluZyMjbWFnaWNbbnJfYnl0ZXNdCisjZGVmaW5lIFA0RF9CWVRFUyhsaW5lLCBucl9ieXRlcykgICAgICAgUDREX0JZVDNTKGxpbmUsIG5yX2J5dGVzKQorI2RlZmluZSBQQURfQllURVMobnJfYnl0ZXMpICAgICAgICAgICAgIFA0RF9CWVRFUyhfX0xJTkVfXywgbnJfYnl0ZXMpCisKKyNkZWZpbmUgUDREX0JJVDNTKG1hZ2ljLCBucl9iaXRzKSAgICAgICBfX2JlMzIgX19wYWRkaW5nIyNtYWdpYzpucl9iaXRzCisjZGVmaW5lIFA0RF9CSVRTKGxpbmUsIG5yX2JpdHMpICAgICAgICAgUDREX0JJVDNTKGxpbmUsIG5yX2JpdHMpCisjZGVmaW5lIFBBRF9CSVRTKG5yX2JpdHMpCSAgICAgICAgUDREX0JJVFMoX19MSU5FX18sIG5yX2JpdHMpCisKKworc3RydWN0IGFnbnhfaGRyIHsKKwlfX2JlMzIgcmVnMDsKKyNkZWZpbmUgUlRTCQkgICAgICAgIDB4ODAwMDAwMDAgLyogUlRTICovCisjZGVmaW5lIFJUU19TSElGVAkJMzEKKyNkZWZpbmUgTVVMVElDQVNUCSAgICAgICAgMHg0MDAwMDAwMCAvKiBtdWx0aWNhc3QgKi8KKyNkZWZpbmUgTVVMVElDQVNUX1NISUZUCQkzMAorI2RlZmluZSBBQ0sJCQkweDMwMDAwMDAwIC8qIEFDSyAqLworI2RlZmluZSBBQ0tfU0hJRlQJCTI4CisjZGVmaW5lIFRNCQkJMHgwODAwMDAwMCAvKiBUTSAqLworI2RlZmluZSBUTV9TSElGVAkJMjcKKyNkZWZpbmUgUkVMQVkJCQkweDA0MDAwMDAwIC8qIFJlbGF5ICovCisjZGVmaW5lIFJFTEFZX1NISUZUCQkyNgorLyogCVBBRF9CSVRTKDQpOyAqLworI2RlZmluZSBSRVZJU0VEX0ZDUwkJMHgwMDM4MDAwMCAvKiByZXZpc2VkIEZDUyAqLworI2RlZmluZSBSRVZJU0VEX0ZDU19TSElGVAkxOQorI2RlZmluZSBORVhUX0JVRkZFUl9BRERSCTB4MDAwN0ZGRkYgLyogTmV4dCBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBORVhUX0JVRkZFUl9BRERSX1NISUZUCTAKKworCV9fYmUzMiByZWcxOworI2RlZmluZSBNQUNfSERSX0xFTgkJMHhGQzAwMDAwMCAvKiBNQUMgSGVhZGVyIExlbmd0aCAgKi8KKyNkZWZpbmUgTUFDX0hEUl9MRU5fU0hJRlQJMjYKKyNkZWZpbmUgRFVSQVRJT05fT1ZFUklERQkweDAyMDAwMDAwIC8qIER1cmF0aW9uIE92ZXJyaWRlICovCisjZGVmaW5lIERVUkFUSU9OX09WRVJJREVfU0hJRlQJMjUKKyNkZWZpbmUgUEhZX0hEUl9PVkVSSURFCQkweDAxMDAwMDAwIC8qIFBIWSBIZWFkZXIgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgUEhZX0hEUl9PVkVSSURFX1NISUZUCTI0CisjZGVmaW5lIENSQ19GQUlMCQkweDAwODAwMDAwIC8qIENSQyBmYWlsICovCisjZGVmaW5lIENSQ19GQUlMX1NISUZUCQkyMworLyoJUEFEX0JJVFMoMSk7ICovCisjZGVmaW5lIFNFUVVFTkNFX05VTUJFUgkJMHgwMDIwMDAwMCAvKiBTZXF1ZW5jZSBOdW1iZXIgKi8KKyNkZWZpbmUgU0VRVUVOQ0VfTlVNQkVSX1NISUZUCTIxCisvKglQQURfQklUUygyKTsgKi8KKyNkZWZpbmUgQlVGRl9IRUFEX0FERFIJCTB4MDAwN0ZGRkYgLyogQnVmZmVyIEhlYWQgQWRkcmVzcyAqLworI2RlZmluZSBCVUZGX0hFQURfQUREUl9TSElGVAkwCisKKwlfX2JlMzIgcmVnMjsKKyNkZWZpbmUgUERVX0NPVU5UCQkweEZDMDAwMDAwIC8qIFBEVSBDb3VudCAqLworI2RlZmluZSBQRFVfQ09VTlRfU0hJRlQJCTI2CisvKiAJUEFEX0JJVFMoMyk7ICovCisjZGVmaW5lIFdFUF9LRVkJCQkweDAwNjAwMDAwIC8qIFdFUCBLZXkgIyAqLworI2RlZmluZSBXRVBfS0VZX1NISUZUCQkyMQorI2RlZmluZSBVU0VTX1dFUF9LRVkJCTB4MDAxMDAwMDAgLyogVXNlcyBXRVAgS2V5ICovCisjZGVmaW5lIFVTRVNfV0VQX0tFWV9TSElGVAkyMAorI2RlZmluZSBLRUVQX0FMSVZFCQkweDAwMDgwMDAwIC8qIEtlZXAgYWxpdmUgKi8KKyNkZWZpbmUgS0VFUF9BTElWRV9TSElGVAkxOQorI2RlZmluZSBCVUZGX1RBSUxfQUREUgkJMHgwMDA3RkZGRiAvKiBCdWZmZXIgVGFpbCBBZGRyZXNzICovCisjZGVmaW5lIEJVRkZfVEFJTF9BRERSX1NISUZUCTAKKworCV9fYmUzMiByZWczOworI2RlZmluZSBDVFNfMTFHCQkJMHg4MDAwMDAwMAkvKiBDVFMgaW4gMTFnICovCisjZGVmaW5lIENUU18xMUdfU0hJRlQJCTMxCisjZGVmaW5lIFJUU18xMUcJCQkweDQwMDAwMDAwCS8qIFJUUyBpbiAxMWcgKi8KKyNkZWZpbmUgUlRTXzExR19TSElGVAkJMzAKKy8qIFBBRF9CSVRTKDIpOyAqLworI2RlZmluZSBGUkFHX1NJWkUJCTB4MEZGRjAwMDAJLyogZnJhZ21lbnQgc2l6ZSAqLworI2RlZmluZSBGUkFHX1NJWkVfU0hJRlQJCTE2CisjZGVmaW5lIFBBWUxPQURfTEVOCQkweDAwMDBGRkYwCS8qIHBheWxvYWQgbGVuZ3RoICovCisjZGVmaW5lIFBBWUxPQURfTEVOX1NISUZUCTQKKyNkZWZpbmUgRlJBR19OVU0JCTB4MDAwMDAwMEYJLyogbnVtYmVyIG9mIGZyYWdzICovCisjZGVmaW5lIEZSQUdfTlVNX1NISUZUCQkwCisKKwlfX2JlMzIgcmVnNDsKKy8qIAlQQURfQklUUyg0KTsgKi8KKyNkZWZpbmUgUkVMQVlfU1RBSUQJCTB4MEZGRjAwMDAgLyogcmVsYXlTdGFsZCAqLworI2RlZmluZSBSRUxBWV9TVEFJRF9TSElGVAkxNgorI2RlZmluZSBTVEFUSU9OX0lECQkweDAwMDBGRkYwIC8qIFN0YXRpb24gSUQgKi8KKyNkZWZpbmUgU1RBVElPTl9JRF9TSElGVAk0CisjZGVmaW5lIFdPUktRVUVVRV9JRAkJMHgwMDAwMDAwRiAvKiBXb3JrcXVldWUgSUQgKi8KKyNkZWZpbmUgV09SS1FVRVVFX0lEX1NISUZUCTAKKworCS8qIEZJWE1FIHRoaXMgcmVnaXN0ZXIgbWF5YmUgaXMgTEU/ICovCisJX19iZTMyIHJlZzU7CisvKiAJUEFEX0JJVFMoNCk7ICovCisjZGVmaW5lIFJPVVRFX0hPU1QJCTB4MEYwMDAwMDAKKyNkZWZpbmUgUk9VVEVfSE9TVF9TSElGVAkyNAorI2RlZmluZSBST1VURV9DQVJEX0NQVQkJMHgwMEYwMDAwMAorI2RlZmluZSBST1VURV9DQVJEX0NQVV9TSElGVAkyMAorI2RlZmluZSBST1VURV9FTkNSWVBUSU9OCTB4MDAwRjAwMDAKKyNkZWZpbmUgUk9VVEVfRU5DUllQVElPTl9TSElGVAkxNgorI2RlZmluZSBST1VURV9UWAkJMHgwMDAwRjAwMAorI2RlZmluZSBST1VURV9UWF9TSElGVAkJMTIKKyNkZWZpbmUgUk9VVEVfUlgxCQkweDAwMDAwRjAwCisjZGVmaW5lIFJPVVRFX1JYMV9TSElGVAkJOAorI2RlZmluZSBST1VURV9SWDIJCTB4MDAwMDAwRjAKKyNkZWZpbmUgUk9VVEVfUlgyX1NISUZUCQk0CisjZGVmaW5lIFJPVVRFX0NPTVBSRVNTSU9OCTB4MDAwMDAwMEYKKyNkZWZpbmUgUk9VVEVfQ09NUFJFU1NJT05fU0hJRlQgMAorCisJX19iZTMyIF8xMWcwOwkJCS8qIDExZyAqLworCV9fYmUzMiBfMTFnMTsJCQkvKiAxMWcgKi8KKwlfX2JlMzIgXzExYjA7CQkJLyogMTFiICovCisJX19iZTMyIF8xMWIxOwkJCS8qIDExYiAqLworCXU4IG1hY19oZHJbMzJdOwkJCS8qIE1BQyBoZWFkZXIgKi8KKworCV9fYmUxNiBydHNfZHVyYXRpb247CQkvKiBSVFMgZHVyYXRpb24gKi8KKwlfX2JlMTYgbGFzdF9kdXJhdGlvbjsJCS8qIExhc3QgZHVyYXRpb24gKi8KKwlfX2JlMTYgc2VjX2xhc3RfZHVyYXRpb247CS8qIFNlY29uZCB0byBMYXN0IGR1cmF0aW9uICovCisJX19iZTE2IG90aGVyX2R1cmF0aW9uOwkJLyogT3RoZXIgZHVyYXRpb24gKi8KKwlfX2JlMTYgdHhfbGFzdF9kdXJhdGlvbjsJLyogVFggTGFzdCBkdXJhdGlvbiAqLworCV9fYmUxNiB0eF9vdGhlcl9kdXJhdGlvbjsJLyogVFggT3RoZXIgRHVyYXRpb24gKi8KKwlfX2JlMTYgbGFzdF8xMWdfbGVuOwkJLyogTGVuZ3RoIG9mIGxhc3QgMTFnICovCisJX19iZTE2IG90aGVyXzExZ19sZW47CQkvKiBMZW5naHQgb2Ygb3RoZXIgMTFnICovCisKKwlfX2JlMTYgbGFzdF8xMWJfbGVuOwkJLyogTGVuZ3RoIG9mIGxhc3QgMTFiICovCisJX19iZTE2IG90aGVyXzExYl9sZW47CQkvKiBMZW5naHQgb2Ygb3RoZXIgMTFiICovCisKKworCV9fYmUxNiByZWc2OworI2RlZmluZSBNQkYJCQkweEYwMDAgLyogbWJmICovCisjZGVmaW5lIE1CRl9TSElGVAkJMTIKKyNkZWZpbmUgUlNWRDQJCQkweDBGRkYgLyogcnN2ZDQgKi8KKyNkZWZpbmUgUlNWRDRfU0hJRlQJCTAKKworCV9fYmUxNiByeF9mcmFnX3N0YXQ7CS8qIFJYIGZyYWdtZW50YXRpb24gc3RhdHVzICovCisKKwlfX2JlMzIgdGltZV9zdGFtcDsJLyogVGltZVN0YW1wICovCisJX19iZTMyIHBoeV9zdGF0c19oaTsJLyogUEhZIHN0YXRzIGhpICovCisJX19iZTMyIHBoeV9zdGF0c19sbzsJLyogUEhZIHN0YXRzIGxvICovCisJX19iZTMyIG1pY19rZXkwOwkvKiBNSUMga2V5IDAgKi8KKwlfX2JlMzIgbWljX2tleTE7CS8qIE1JQyBrZXkgMSAqLworCisJdW5pb24gewkJCS8qIFJYL1RYIFVuaW9uICovCisJCXN0cnVjdCBhZ254X3J4IHJ4OworCQlzdHJ1Y3QgYWdueF90eCB0eDsKKwl9OworCisJdTggcnhfY2hhbm5lbDsJCS8qIFJlY2lldmUgQ2hhbm5lbCAqLworCVBBRF9CWVRFUygzKTsKKworCXU4IHJlc2VydmVkWzRdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworc3RydWN0IGFnbnhfZGVzYyB7CisjZGVmaW5lIFBBQ0tFVF9MRU4JCTB4RkZGMDAwMDAKKyNkZWZpbmUgUEFDS0VUX0xFTl9TSElGVAkyMAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEZJUlNUX1BBQ0tFVF9NQVNLCTB4MDAwODAwMDAKKyNkZWZpbmUgRklSU1RfUEFDS0VUX01BU0tfU0hJRlQJMTkKKyNkZWZpbmUgRklSU1RfUkVTRVJWMgkJMHgwMDA0MDAwMAorI2RlZmluZSBGSVJTVF9SRVNFUlYyX1NISUZUCTE4CisjZGVmaW5lIEZJUlNUX1RLSVBfRVJST1IJMHgwMDAyMDAwMAorI2RlZmluZSBGSVJTVF9US0lQX0VSUk9SX1NISUZUCTE3CisjZGVmaW5lIEZJUlNUX1RLSVBfUEFDS0VUCTB4MDAwMTAwMDAKKyNkZWZpbmUgRklSU1RfVEtJUF9QQUNLRVRfU0hJRlQJMTYKKyNkZWZpbmUgRklSU1RfUkVTRVJWMQkJMHgwMDAwRjAwMAorI2RlZmluZSBGSVJTVF9SRVNFUlYxX1NISUZUCTEyCisjZGVmaW5lIEZJUlNUX0ZSQUdfTEVOCQkweDAwMDAwRkY4CisjZGVmaW5lIEZJUlNUX0ZSQUdfTEVOX1NISUZUCTMKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBTVUJfUkVTRVJWMgkJMHgwMDBjMDAwMAorI2RlZmluZSBTVUJfUkVTRVJWMl9TSElGVAkxOAorI2RlZmluZSBTVUJfVEtJUF9FUlJPUgkJMHgwMDAyMDAwMAorI2RlZmluZSBTVUJfVEtJUF9FUlJPUl9TSElGVAkxNworI2RlZmluZSBTVUJfVEtJUF9QQUNLRVQJCTB4MDAwMTAwMDAKKyNkZWZpbmUgU1VCX1RLSVBfUEFDS0VUX1NISUZUCTE2CisjZGVmaW5lIFNVQl9SRVNFUlYxCQkweDAwMDA4MDAwCisjZGVmaW5lIFNVQl9SRVNFUlYxX1NISUZUCTE1CisjZGVmaW5lIFNVQl9GUkFHX0xFTgkJMHgwMDAwN0ZGOAorI2RlZmluZSBTVUJfRlJBR19MRU5fU0hJRlQJMworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEZJUlNUX0ZSQUcJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRklSU1RfRlJBR19TSElGVAkyCisjZGVmaW5lIExBU1RfRlJBRwkJMHgwMDAwMDAwMgorI2RlZmluZSBMQVNUX0ZSQUdfU0hJRlQJCTEKKyNkZWZpbmUgT1dORVIJCQkweDAwMDAwMDAxCisjZGVmaW5lIE9XTkVSX1NISUZUCQkwCisJX19iZTMyIGZyYWc7CisJX19iZTMyIGRtYV9hZGRyOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKK2VudW0ge0hFQURFUiwgUEFDS0VUfTsKKworc3RydWN0IGFnbnhfaW5mbyB7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIGRtYV9hZGRyX3QgbWFwcGluZzsKKwl1MzIgZG1hX2xlbjsJCS8qIGRtYSBidWZmZXIgbGVuICAqLworCS8qIEJlbG93IGZpZWxkcyBvbmx5IHVzZnVsIGZvciB0eCAqLworCXUzMiBoZHJfbGVuOwkJLyogaWVlZTgwMjExIGhlYWRlciBsZW5ndGggKi8KKwl1bnNpZ25lZCBpbnQgdHlwZTsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGk7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyIGhkcjsKK307CisKKworc3RydWN0IGFnbnhfcmluZyB7CisJc3RydWN0IGFnbnhfZGVzYyAqZGVzYzsKKwlkbWFfYWRkcl90IGRtYTsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvOworCS8qIFdpbGwgbGVhZCB0byBvdmVyZmxvdyB3aGVuIHNlbnQgcGFja2V0IG51bWJlciBlbm91Z2g/ICovCisJdW5zaWduZWQgaW50IGlkeDsKKwl1bnNpZ25lZCBpbnQgaWR4X3NlbnQ7CQkvKiBvbmx5IHVzZnVsIGZvciB0eGQgYW5kIHR4bSAqLworCXVuc2lnbmVkIGludCBzaXplOworfTsKKworI2RlZmluZSBBR05YX1JYX1JJTkdfU0laRQkxMjgKKyNkZWZpbmUgQUdOWF9UWERfUklOR19TSVpFCTI1NgorI2RlZmluZSBBR05YX1RYTV9SSU5HX1NJWkUJMTI4CisKK3ZvaWQgZGlzYWJsZV9yeF9pbnRlcnJ1cHQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGVuYWJsZV9yeF9pbnRlcnJ1cHQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitpbnQgZmlsbF9yaW5ncyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgdW5maWxsX3JpbmdzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBoYW5kbGVfcnhfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBoYW5kbGVfdHhkX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgaGFuZGxlX3R4bV9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGhhbmRsZV9vdGhlcl9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitpbnQgX2FnbnhfdHgoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisjZW5kaWYgLyogQUdOWF9YTUlUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0YmY5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACitjb25maWcgQUxURVJBX1BDSUVfQ0hETUEKKwl0cmlzdGF0ZSAiQWx0ZXJhIFBDSSBFeHByZXNzIENoYWluaW5nIERNQSBkcml2ZXIiCisJZGVwZW5kcyBvbiBQQ0kKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBBIHJlZmVyZW5jZSBkcml2ZXIgdGhhdCBleGVyY2lzZXMgdGhlIENoYWluaW5nIERNQSBsb2dpYyByZWZlcmVuY2UKKwkgIGRlc2lnbiBnZW5lcmF0ZWQgYWxvbmcgdGhlIEFsdGVyYSBGUEdBIFBDSSBFeHByZXNzIHNvZnQgb3IgaGFyZCBjb3JlLAorCSAgb25seSBpZiBpbnN0YW50aWF0ZWQgdXNpbmcgdGhlIE1lZ2FXaXphcmQsIG5vdCB0aGUgU09QQyBidWlsZGVyLCBvZgorCSAgUXVhcnR1cyA4LjEuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOGM4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FMVEVSQV9QQ0lFX0NIRE1BKQkrPSBhbHRwY2llY2hkbWEubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjOTQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvVE9ETwpAQCAtMCwwICsxLDE1IEBACitET05FOgorICAgIC0gZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIGxvZ2ljIHRlc3RiZW5jaAorCitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcy4KKwktIGtlZXAgc3RhdGUgb2YgRE1BIGVuZ2luZXMuCisJLSBrZWVwIGRhdGEgc3RydWN0dXJlIHRoYXQga2VlcHMgc3RhdGUgb2YgZWFjaCB0cmFuc2Zlci4KKwktIGludGVycnVwdCBoYW5kbGVyIHNob3VsZCBpdGVyYXRlIG92ZXIgb3V0c3RhbmRpbmcgZGVzY3JpcHRvciB0YWJsZXMuCisJLSBjb21wbGV0ZSB1c2Vyc3BhY2UgY2RldiB0byByZWFkL3dyaXRlIHVzaW5nIHRoZSBETUEgZW5naW5lcy4KKwktIHNwbGl0IG9mZiB0aGUgRE1BIHN1cHBvcnQgZnVuY3Rpb25zIGluIGEgbW9kdWxlLCByZS11c2FibGUgYnkgY3VzdG9tCisJICBkcml2ZXJzLgorCitQbGVhc2UgY29vcmRpbmF0ZSB3b3JrIHdpdGgsIGFuZCBzZW5kIHBhdGNoZXMgdG8KK0xlb24gV29lc3RlbmJlcmcgPGxlb25Ac2lkZWJyYW5jaC5jb20+CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL2FsdHBjaWVjaGRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMmI0Y2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYwpAQCAtMCwwICsxLDExODQgQEAKKy8qKgorICogRHJpdmVyIGZvciBBbHRlcmEgUENJZSBjb3JlIGNoYWluaW5nIERNQSByZWZlcmVuY2UgZGVzaWduLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBMZW9uIFdvZXN0ZW5iZXJnICA8bGVvbi53b2VzdGVuYmVyZ0BheG9uLnR2PgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5pY2tvbGFzIEhlcHBlcm1hbm4gIDxoZXBwZXJtYW5ud2R0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqCisgKiBSYXRpb25hbGU6IFRoaXMgZHJpdmVyIGV4ZXJjaXNlcyB0aGUgY2hhaW5pbmcgRE1BIHJlYWQgYW5kIHdyaXRlIGVuZ2luZQorICogaW4gdGhlIHJlZmVyZW5jZSBkZXNpZ24uIEl0IGlzIG1lYW50IGFzIGEgY29tcGxlbWVudGFyeSByZWZlcmVuY2UKKyAqIGRyaXZlciB0aGF0IGNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nIGVhcmx5IGRlc2lnbnMgYXMgd2VsbCBhcyBhIGJhc2lzIHRvCisgKiB3cml0ZSB5b3VyIGN1c3RvbSBkcml2ZXIuCisgKgorICogU3RhdHVzOiBUZXN0IHJlc3VsdHMgZnJvbSBMZW9uIFdvZXN0ZW5iZXJnICA8bGVvbi53b2VzdGVuYmVyZ0BheG9uLnR2PjoKKyAqCisgKiBTZW5kZXJvIEJvYXJkIHcvIEN5Y2xvbmUgSUkgRVAyQzM1RjY3MkM2TiwgUFgxMDExQSBQQ0llIHgxIFBIWSBvbiBhCisgKiBEZWxsIFByZWNpc2lvbiAzNzAgUEMsIHg4Niwga2VybmVsIDIuNi4yMCBmcm9tIFVidW50dSA3LjA0LgorICoKKyAqIFNlbmRlcm8gQm9hcmQgdy8gQ3ljbG9uZSBJSSBFUDJDMzVGNjcyQzZOLCBQWDEwMTFBIFBDSWUgeDEgUEhZIG9uIGEKKyAqIEZyZWVzY2FsZSBNUEM4MzEzRS1SREIgYm9hcmQsIFBvd2VyUEMsIDIuNi4yNCB3LyBGcmVlc2NhbGUgcGF0Y2hlcy4KKyAqCisgKiBEcml2ZXIgdGVzdHMgcGFzc2VkIHdpdGggUENJZSBDb21waWxlciA4LjEuIFdpdGggUENJZSA4LjAgdGhlIERNQQorICogbG9vcGJhY2sgdGVzdCBoYWQgcmVwcm9kdWNhYmxlIGNvbXBhcmUgZXJyb3JzLiBJIGFzc3VtZSBhIGNoYW5nZQorICogaW4gdGhlIGNvbXBpbGVyIG9yIHJlZmVyZW5jZSBkZXNpZ24sIGJ1dCBjb3VsZCBub3QgZmluZCBldmlkZW5jZSBub3IKKyAqIGRvY3VtZW50YXRpb24gb24gYSBjaGFuZ2Ugb3IgZml4IGluIHRoYXQgZGlyZWN0aW9uLgorICoKKyAqIFRoZSByZWZlcmVuY2UgZGVzaWduIGRvZXMgbm90IGhhdmUgcmVhZGFibGUgbG9jYXRpb25zIGFuZCB0aHVzIGEKKyAqIGR1bW15IHJlYWQsIHVzZWQgdG8gZmx1c2ggUENJIHBvc3RlZCB3cml0ZXMsIGNhbm5vdCBiZSBwZXJmb3JtZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisKKy8qIGJ5IGRlZmF1bHQgZG8gbm90IGJ1aWxkIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZSAqLworLyogWFhYIEl0IGlzIG5vbi1mdW5jdGlvbmFsIHlldCAqLworI2lmbmRlZiBBTFRQQ0lFQ0hETUFfQ0RFVgorIyAgZGVmaW5lIEFMVFBDSUVDSERNQV9DREVWIDAKKyNlbmRpZgorCisvKiBidWlsZCB0aGUgY2hhcmFjdGVyIGRldmljZSBpbnRlcmZhY2U/ICovCisjaWYgQUxUUENJRUNIRE1BX0NERVYKKyMgIGRlZmluZSBNQVhfQ0hETUFfU0laRSAoOCAqIDEwMjQgKiAxMDI0KQorIyAgaW5jbHVkZSAibWFwcGVyX3VzZXJfdG9fc2cuaCIKKyNlbmRpZgorCisvKiogZHJpdmVyIG5hbWUsIG1pbWlja3MgQWx0ZXJhIG5hbWluZyBvZiB0aGUgcmVmZXJlbmNlIGRlc2lnbiAqLworI2RlZmluZSBEUlZfTkFNRSAiYWx0cGNpZWNoZG1hIgorLyoqIG51bWJlciBvZiBCQVJzIG9uIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgQVBFX0JBUl9OVU0gKDYpCisvKiogQkFSIG51bWJlciB3aGVyZSB0aGUgUkNTTEFWRSBtZW1vcnkgc2l0cyAqLworI2RlZmluZSBBUEVfQkFSX1JDU0xBVkUgKDApCisvKiogQkFSIG51bWJlciB3aGVyZSB0aGUgRGVzY3JpcHRvciBIZWFkZXIgc2l0cyAqLworI2RlZmluZSBBUEVfQkFSX0hFQURFUiAoMikKKworLyoqIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGVzY3JpcHRvciB0YWJsZSwgY2hkbWEgbG9naWMgbGltaXQgKi8KKyNkZWZpbmUgQVBFX0NIRE1BX1RBQkxFX1NJWkUgKDQwOTYpCisvKiBzaW5nbGUgdHJhbnNmZXIgbXVzdCBub3QgZXhjZWVkIDI1NSB0YWJsZSBlbnRyaWVzLiB3b3JzdCBjYXNlIHRoaXMgY2FuIGJlCisgKiBhY2hpZXZlZCBieSAyNTUgc2NhdHRlcmVkIHBhZ2VzLCB3aXRoIG9ubHkgYSBzaW5nbGUgYnl0ZSBpbiB0aGUgaGVhZCBhbmQKKyAqIHRhaWwgcGFnZXMuIDI1MyAqIFBBR0VfU0laRSBpcyBhIHNhZmUgdXBwZXIgYm91bmQgZm9yIHRoZSB0cmFuc2ZlciBzaXplLgorICovCisjZGVmaW5lIEFQRV9DSERNQV9NQVhfVFJBTlNGRVJfTEVOICgyNTMgKiBQQUdFX1NJWkUpCisKKy8qKgorICogU3BlY2lmaWVzIHRob3NlIEJBUnMgdG8gYmUgbWFwcGVkIGFuZCB0aGUgbGVuZ3RoIG9mIGVhY2ggbWFwcGluZy4KKyAqCisgKiBaZXJvICgwKSBtZWFucyBkbyBub3QgbWFwLCBvdGhlcndpc2Ugc3BlY2lmaWVzIHRoZSBCQVIgbGVuZ3RocyB0byBiZSBtYXBwZWQuCisgKiBJZiB0aGUgYWN0dWFsIEJBUiBsZW5ndGggaXMgbGVzcywgdGhpcyBpcyBjb25zaWRlcmVkIGFuIGVycm9yOyB0aGVuCisgKiByZWNvbmZpZ3VyZSB5b3VyIFBDSWUgY29yZS4KKyAqCisgKiBAc2VlIHVnX3BjaV9leHByZXNzIDguMCwgdGFibGUgNy0yIGF0IHBhZ2UgNy0xMy4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgYmFyX21pbl9sZW5bQVBFX0JBUl9OVU1dID0KKwl7IDMyNzY4LCAwLCAyNTYsIDAsIDMyNzY4LCAwIH07CisKKy8qKgorICogRGVzY3JpcHRvciBIZWFkZXIsIGNvbnRyb2xzIHRoZSBETUEgcmVhZCBlbmdpbmUgb3Igd3JpdGUgZW5naW5lLgorICoKKyAqIFRoZSBkZXNjcmlwdG9yIGhlYWRlciBpcyB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZSBmb3Igc3RhcnRpbmcgRE1BIHRyYW5zZmVycy4KKyAqCisgKiBJdCBzaXRzIGluIEVuZCBQb2ludCAoRlBHQSkgbWVtb3J5IEJBUlsyXSBmb3IgMzItYml0IG9yIEJBUlszOjJdIGZvciA2NC1iaXQuCisgKiBJdCByZWZlcmVuY2VzIGEgZGVzY3JpcHRvciB0YWJsZSB3aGljaCBleGlzdHMgaW4gUm9vdCBDb21wbGV4IChQQykgbWVtb3J5LgorICogV3JpdGluZyB0aGUgcmNsYXN0IGZpZWxkIHN0YXJ0cyB0aGUgRE1BIG9wZXJhdGlvbiwgdGh1cyBhbGwgb3RoZXIgc3RydWN0dXJlcworICogYW5kIGZpZWxkcyBtdXN0IGJlIHNldHVwIGJlZm9yZSBkb2luZyBzby4KKyAqCisgKiBAc2VlIHVnX3BjaV9leHByZXNzIDguMCwgdGFibGVzIDctMywgNy00IGFuZCA3LTUgYXQgcGFnZSA3LTE0LgorICogQG5vdGUgVGhpcyBoZWFkZXIgbXVzdCBiZSB3cml0dGVuIGluIGZvdXIgMzItYml0IChQQ0kgRFdPUkQpIHdyaXRlcy4KKyAqLworc3RydWN0IGFwZV9jaGRtYV9oZWFkZXIgeworCS8qKgorCSAqIHcwIGNvbnNpc3RzIG9mIHR3byAxNi1iaXQgZmllbGRzOgorCSAqIGxzYiB1MTYgbnVtYmVyOyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gYXBlX2NoZG1hX3RhYmxlCisJICogbXNiIHUxNiBjb250cm9sOyBnbG9iYWwgY29udHJvbCBmbGFncworCSAqLworCXUzMiB3MDsKKwkvKiBidXMgYWRkcmVzcyB0byBhcGVfY2hkbWFfdGFibGUgaW4gUm9vdCBDb21wbGV4IG1lbW9yeSAqLworCXUzMiBiZHRfYWRkcl9oOworCXUzMiBiZHRfYWRkcl9sOworCS8qKgorCSAqIHczIGNvbnNpc3RzIG9mIHR3byAxNi1iaXQgZmllbGRzOgorCSAqIC0gbHNiIHUxNiByY2xhc3Q7IGxhc3QgZGVzY3JpcHRvciBudW1iZXIgYXZhaWxhYmxlIGluIFJvb3QgQ29tcGxleAorCSAqICAgIC0gemVybyAoMCkgbWVhbnMgdGhlIGZpcnN0IGRlc2NyaXB0b3IgaXMgcmVhZHksCisJICogICAgLSBvbmUgKDEpIG1lYW5zIHR3byBkZXNjcmlwdG9ycyBhcmUgcmVhZHksIGV0Yy4KKwkgKiAtIG1zYiB1MTYgcmVzZXJ2ZWQ7CisJICoKKwkgKiBAbm90ZSB3cml0aW5nIHRvIHRoaXMgbWVtb3J5IGxvY2F0aW9uIHN0YXJ0cyB0aGUgRE1BIG9wZXJhdGlvbiEKKwkgKi8KKwl1MzIgdzM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBEZXNjcmlwdG9yIEVudHJ5LCBkZXNjcmliaW5nIGEgKG5vbi1zY2F0dGVyZWQpIHNpbmdsZSBtZW1vcnkgYmxvY2sgdHJhbnNmZXIuCisgKgorICogVGhlcmUgaXMgb25lIGRlc2NyaXB0b3IgZm9yIGVhY2ggbWVtb3J5IGJsb2NrIGludm9sdmVkIGluIHRoZSB0cmFuc2ZlciwgYQorICogYmxvY2sgYmVpbmcgYSBjb250aWd1b3VzIGFkZHJlc3MgcmFuZ2Ugb24gdGhlIGJ1cy4KKyAqCisgKiBNdWx0aXBsZSBkZXNjcmlwdG9ycyBhcmUgY2hhaW5lZCBieSBtZWFucyBvZiB0aGUgYXBlX2NoZG1hX3RhYmxlIGRhdGEKKyAqIHN0cnVjdHVyZS4KKyAqCisgKiBAc2VlIHVnX3BjaV9leHByZXNzIDguMCwgdGFibGVzIDctNiwgNy03IGFuZCA3LTggYXQgcGFnZSA3LTE0IGFuZCBwYWdlIDctMTUuCisgKi8KK3N0cnVjdCBhcGVfY2hkbWFfZGVzYyB7CisJLyoqCisJICogdzAgY29uc2lzdHMgb2YgdHdvIDE2LWJpdCBmaWVsZHM6CisJICogbnVtYmVyIG9mIERXT1JEUyB0byB0cmFuc2ZlcgorCSAqIC0gbHNiIHUxNiBsZW5ndGg7CisJICogZ2xvYmFsIGNvbnRyb2wKKwkgKiAtIG1zYiB1MTYgY29udHJvbDsKKwkgKi8KKwl1MzIgdzA7CisJLyogYWRkcmVzcyBvZiBtZW1vcnkgaW4gdGhlIEVuZCBQb2ludCAqLworCXUzMiBlcF9hZGRyOworCS8qIGJ1cyBhZGRyZXNzIG9mIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBtZW1vcnkgaW4gdGhlIFJvb3QgQ29tcGxleCAqLworCXUzMiByY19hZGRyX2g7CisJdTMyIHJjX2FkZHJfbDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIERlc2NyaXB0b3IgVGFibGUsIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JzIGRlc2NyaWJpbmcgYSBjaGFpbmVkIHRyYW5zZmVyLgorICoKKyAqIEFuIGFycmF5IG9mIGRlc2NyaXB0b3JzLCBwcmVjZWRlZCBieSB3b3Jrc3BhY2UgZm9yIHRoZSBFbmQgUG9pbnQuCisgKiBJdCBleGlzdHMgaW4gUm9vdCBDb21wbGV4IG1lbW9yeS4KKyAqCisgKiBUaGUgRW5kIFBvaW50IGNhbiB1cGRhdGUgaXRzIGxhc3QgY29tcGxldGVkIGRlc2NyaXB0b3IgbnVtYmVyIGluIHRoZQorICogZXBsYXN0IGZpZWxkIGlmIHJlcXVlc3RlZCBieSBzZXR0aW5nIHRoZSBFUExBU1RfRU5BIGJpdCBlaXRoZXIKKyAqIGdsb2JhbGx5IGluIHRoZSBoZWFkZXIncyBvciBsb2NhbGx5IGluIGFueSBkZXNjcmlwdG9yJ3MgY29udHJvbCBmaWVsZC4KKyAqCisgKiBAbm90ZSB0aGlzIHN0cnVjdHVyZSBtYXkgbm90IGV4Y2VlZCA0MDk2IGJ5dGVzLiBUaGlzIHJlc3VsdHMgaW4gYQorICogbWF4aW11bSBvZiA0MDk2IC8gKDQgKiA0KSAtIDEgPSAyNTUgZGVzY3JpcHRvcnMgcGVyIGNoYWluZWQgdHJhbnNmZXIuCisgKgorICogQHNlZSB1Z19wY2lfZXhwcmVzcyA4LjAsIHRhYmxlcyA3LTksIDctMTAgYW5kIDctMTEgYXQgcGFnZSA3LTE3IGFuZCBwYWdlIDctMTguCisgKi8KK3N0cnVjdCBhcGVfY2hkbWFfdGFibGUgeworCS8qIHdvcmtzcGFjZSAweDAwLTB4MGIsIHJlc2VydmVkICovCisJdTMyIHJlc2VydmVkMVszXTsKKwkvKiB3b3Jrc3BhY2UgMHgwYy0weDBmLCBsYXN0IGRlc2NyaXB0b3IgaGFuZGxlZCBieSBFbmQgUG9pbnQgKi8KKwl1MzIgdzM7CisJLyogdGhlIGFjdHVhbCBhcnJheSBvZiBkZXNjcmlwdG9ycworICAgICogMHgxMC0weDFmLCAweDIwLTB4MmYsIC4uLiAweGZmMC0weGZmZiAoMjU1IGVudHJpZXMpCisgICAgKi8KKwlzdHJ1Y3QgYXBlX2NoZG1hX2Rlc2MgZGVzY1syNTVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogQWx0ZXJhIFBDSSBFeHByZXNzICgnYXBlJykgYm9hcmQgc3BlY2lmaWMgYm9vayBrZWVwaW5nIGRhdGEKKyAqCisgKiBLZWVwcyBzdGF0ZSBvZiB0aGUgUENJZSBjb3JlIGFuZCB0aGUgQ2hhaW5pbmcgRE1BIGNvbnRyb2xsZXIKKyAqIGFwcGxpY2F0aW9uLgorICovCitzdHJ1Y3QgYXBlX2RldiB7CisJLyoqIHRoZSBrZXJuZWwgcGNpIGRldmljZSBkYXRhIHN0cnVjdHVyZSBwcm92aWRlZCBieSBwcm9iZSgpICovCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJLyoqCisJICoga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIEJBUiBtZW1vcnkgYW5kIElPIHJlZ2lvbnMgb2YKKwkgKiB0aGUgRW5kIFBvaW50LiBVc2VkIGJ5IG1hcF9iYXJzKCkvdW5tYXBfYmFycygpLgorCSAqLworCXZvaWQgKiBfX2lvbWVtIGJhcltBUEVfQkFSX05VTV07CisJLyoqIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgZm9yIERlc2NyaXB0b3IgVGFibGUgaW4gUm9vdCBDb21wbGV4IG1lbW9yeSAqLworCXN0cnVjdCBhcGVfY2hkbWFfdGFibGUgKnRhYmxlX3ZpcnQ7CisJLyoqCisJICogYnVzIGFkZHJlc3MgZm9yIHRoZSBEZXNjcmlwdG9yIFRhYmxlIGluIFJvb3QgQ29tcGxleCBtZW1vcnksIGluCisJICogQ1BVLW5hdGl2ZSBlbmRpYW5lc3MKKwkgKi8KKwlkbWFfYWRkcl90IHRhYmxlX2J1czsKKwkvKiBpZiB0aGUgZGV2aWNlIHJlZ2lvbnMgY291bGQgbm90IGJlIGFsbG9jYXRlZCwgYXNzdW1lIGFuZCByZW1lbWJlciBpdAorCSAqIGlzIGluIHVzZSBieSBhbm90aGVyIGRyaXZlcjsgdGhpcyBkcml2ZXIgbXVzdCBub3QgZGlzYWJsZSB0aGUgZGV2aWNlLgorCSAqLworCWludCBpbl91c2U7CisJLyogd2hldGhlciB0aGlzIGRyaXZlciBlbmFibGVkIG1zaSBmb3IgdGhlIGRldmljZSAqLworCWludCBtc2lfZW5hYmxlZDsKKwkvKiB3aGV0aGVyIHRoaXMgZHJpdmVyIGNvdWxkIG9idGFpbiB0aGUgcmVnaW9ucyAqLworCWludCBnb3RfcmVnaW9uczsKKwkvKiBpcnEgbGluZSBzdWNjZXNmdWxseSByZXF1ZXN0ZWQgYnkgdGhpcyBkcml2ZXIsIC0xIG90aGVyd2lzZSAqLworCWludCBpcnFfbGluZTsKKwkvKiBib2FyZCByZXZpc2lvbiAqLworCXU4IHJldmlzaW9uOworCS8qIGludGVycnVwdCBjb3VudCwgaW5jcmVtZW50ZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJaW50IGlycV9jb3VudDsKKyNpZiBBTFRQQ0lFQ0hETUFfQ0RFVgorCS8qIGNoYXJhY3RlciBkZXZpY2UgKi8KKwlkZXZfdCBjZGV2bm87CisJc3RydWN0IGNkZXYgY2RldjsKKwkvKiB1c2VyIHNwYWNlIHNjYXR0ZXIgZ2F0aGVyIG1hcHBlciAqLworCXN0cnVjdCBzZ19tYXBwaW5nX3QgKnNnbTsKKyNlbmRpZgorfTsKKworLyoqCisgKiBVc2luZyB0aGUgc3Vic3lzdGVtIHZlbmRvciBpZCBhbmQgc3Vic3lzdGVtIGlkLCBpdCBpcyBwb3NzaWJsZSB0bworICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgY2FyZHMgYmFzZXMgYXJvdW5kIHRoZSBzYW1lCisgKiAodGhpcmQtcGFydHkpIGxvZ2ljIGNvcmUuCisgKgorICogRGVmYXVsdCBBbHRlcmEgdmVuZG9yIGFuZCBkZXZpY2UgSUQncywgYW5kIHNvbWUgKG5vbi1yZXNlcnZlZCkKKyAqIElEJ3MgYXJlIG5vdyB1c2VkIGhlcmUgdGhhdCBhcmUgdXNlZCBhbW9uZ3N0IHRoZSB0ZXN0ZXJzL2RldmVsb3BlcnMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpZHNbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxMTcyLCAweEUwMDEpLCB9LAorCXsgUENJX0RFVklDRSgweDIwNzEsIDB4MjA3MSksIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkcyk7CisKKyNpZiBBTFRQQ0lFQ0hETUFfQ0RFVgorLyogcHJvdG90eXBlcyBmb3IgY2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIGludCBzZ19pbml0KHN0cnVjdCBhcGVfZGV2ICphcGUpOworc3RhdGljIHZvaWQgc2dfZXhpdChzdHJ1Y3QgYXBlX2RldiAqYXBlKTsKKyNlbmRpZgorCisvKioKKyAqIGFsdHBjaWVjaGRtYV9pc3IoKSAtIEludGVycnVwdCBoYW5kbGVyCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWx0cGNpZWNoZG1hX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWRldl9pZDsKKwlpZiAoIWFwZSkKKwkJcmV0dXJuIElSUV9OT05FOworCWFwZS0+aXJxX2NvdW50Kys7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzY2FuX2JhcnMoc3RydWN0IGFwZV9kZXYgKmFwZSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVBFX0JBUl9OVU07IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGJhcl9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGkpOworCQlpZiAoYmFyX3N0YXJ0KSB7CisJCQl1bnNpZ25lZCBsb25nIGJhcl9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKGRldiwgaSk7CisJCQl1bnNpZ25lZCBsb25nIGJhcl9mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhkZXYsIGkpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkJBUiVkIDB4JTA4bHgtMHglMDhseCBmbGFncyAweCUwOGx4XG4iLAorCQkJICBpLCBiYXJfc3RhcnQsIGJhcl9lbmQsIGJhcl9mbGFncyk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVW5tYXAgdGhlIEJBUiByZWdpb25zIHRoYXQgaGFkIGJlZW4gbWFwcGVkIGVhcmxpZXIgdXNpbmcgbWFwX2JhcnMoKQorICovCitzdGF0aWMgdm9pZCB1bm1hcF9iYXJzKHN0cnVjdCBhcGVfZGV2ICphcGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFQRV9CQVJfTlVNOyBpKyspIHsKKwkgIC8qIGlzIHRoaXMgQkFSIG1hcHBlZD8gKi8KKwkJaWYgKGFwZS0+YmFyW2ldKSB7CisJCQkvKiB1bm1hcCBCQVIgKi8KKwkJCXBjaV9pb3VubWFwKGRldiwgYXBlLT5iYXJbaV0pOworCQkJYXBlLT5iYXJbaV0gPSBOVUxMOworCQl9CisJfQorfQorCisvKioKKyAqIE1hcCB0aGUgZGV2aWNlIG1lbW9yeSByZWdpb25zIGludG8ga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBhZnRlcgorICogdmVyaWZ5aW5nIHRoZWlyIHNpemVzIHJlc3BlY3QgdGhlIG1pbmltdW0gc2l6ZXMgbmVlZGVkLCBnaXZlbiBieSB0aGUKKyAqIGJhcl9taW5fbGVuW10gYXJyYXkuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IG1hcF9iYXJzKHN0cnVjdCBhcGVfZGV2ICphcGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJjOworCWludCBpOworCS8qIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIEJBUnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVBFX0JBUl9OVU07IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGJhcl9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGkpOworCQl1bnNpZ25lZCBsb25nIGJhcl9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKGRldiwgaSk7CisJCXVuc2lnbmVkIGxvbmcgYmFyX2xlbmd0aCA9IGJhcl9lbmQgLSBiYXJfc3RhcnQgKyAxOworCQlhcGUtPmJhcltpXSA9IE5VTEw7CisJCS8qIGRvIG5vdCBtYXAsIGFuZCBza2lwLCBCQVJzIHdpdGggbGVuZ3RoIDAgKi8KKwkJaWYgKCFiYXJfbWluX2xlbltpXSkKKwkJCWNvbnRpbnVlOworCQkvKiBkbyBub3QgbWFwIEJBUnMgd2l0aCBhZGRyZXNzIDAgKi8KKwkJaWYgKCFiYXJfc3RhcnQgfHwgIWJhcl9lbmQpIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJCQVIgIyVkIGlzIG5vdCBwcmVzZW50PyFcbiIsIGkpOworCQkJcmMgPSAtMTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQliYXJfbGVuZ3RoID0gYmFyX2VuZCAtIGJhcl9zdGFydCArIDE7CisJCS8qIEJBUiBsZW5ndGggaXMgbGVzcyB0aGFuIGRyaXZlciByZXF1aXJlcz8gKi8KKwkJaWYgKGJhcl9sZW5ndGggPCBiYXJfbWluX2xlbltpXSkgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkJBUiAjJWQgbGVuZ3RoID0gJWx1IGJ5dGVzIGJ1dCBkcml2ZXIgIgorICAgICAgICAgICAgInJlcXVpcmVzIGF0IGxlYXN0ICVsdSBieXRlc1xuIiwgaSwgYmFyX2xlbmd0aCwgYmFyX21pbl9sZW5baV0pOworCQkJcmMgPSAtMTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQkvKiBtYXAgdGhlIGRldmljZSBtZW1vcnkgb3IgSU8gcmVnaW9uIGludG8ga2VybmVsIHZpcnR1YWwKKwkJICogYWRkcmVzcyBzcGFjZSAqLworCQlhcGUtPmJhcltpXSA9IHBjaV9pb21hcChkZXYsIGksIGJhcl9taW5fbGVuW2ldKTsKKwkJaWYgKCFhcGUtPmJhcltpXSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBtYXAgQkFSICMlZC5cbiIsIGkpOworCQkJcmMgPSAtMTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiQkFSWyVkXSBtYXBwZWQgYXQgMHglcCB3aXRoIGxlbmd0aCAlbHUoLyVsdSkuXG4iLCBpLAorCQkJYXBlLT5iYXJbaV0sIGJhcl9taW5fbGVuW2ldLCBiYXJfbGVuZ3RoKTsKKwl9CisJLyogc3VjY2VzZnVsbHkgbWFwcGVkIGFsbCByZXF1aXJlZCBCQVIgcmVnaW9ucyAqLworCXJjID0gMDsKKwlnb3RvIHN1Y2Nlc3M7CitmYWlsOgorCS8qIHVubWFwIGFueSBCQVJzIHRoYXQgd2UgZGlkIG1hcCAqLworCXVubWFwX2JhcnMoYXBlLCBkZXYpOworc3VjY2VzczoKKwlyZXR1cm4gcmM7Cit9CisKKyNpZiAwIC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZnVsbHkgRklYTUUgYWRkIG9wY29kZSAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHJjc2xhdmVfdGVzdChzdHJ1Y3QgYXBlX2RldiAqYXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiAqcmNzbGF2ZV9tZW0gPSAodTMyICopYXBlLT5iYXJbQVBFX0JBUl9SQ1NMQVZFXTsKKwl1MzIgcmVzdWx0ID0gMDsKKwkvKiogdGhpcyBudW1iZXIgaXMgYXNzdW1lZCB0byBiZSBkaWZmZXJlbnQgZWFjaCB0aW1lIHRoaXMgdGVzdCBydW5zICovCisJdTMyIHNlZWQgPSAodTMyKWppZmZpZXM7CisJdTMyIHZhbHVlID0gc2VlZDsKKwlpbnQgaTsKKworCS8qIHdyaXRlIGxvb3AgKi8KKwl2YWx1ZSA9IHNlZWQ7CisJZm9yIChpID0gMTAyNDsgaSA8IDMyNzY4IC8gNCA7IGkrKykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiV3JpdGluZyAweCUwOHggdG8gMHglcC5cbiIsCisJCQkodTMyKXZhbHVlLCAodm9pZCAqKXJjc2xhdmVfbWVtICsgaSk7CisJCWlvd3JpdGUzMih2YWx1ZSwgcmNzbGF2ZV9tZW0gKyBpKTsKKwkJdmFsdWUrKzsKKwl9CisJLyogcmVhZC1iYWNrIGxvb3AgKi8KKwl2YWx1ZSA9IHNlZWQ7CisJZm9yIChpID0gMTAyNDsgaSA8IDMyNzY4IC8gNDsgaSsrKSB7CisJCXJlc3VsdCA9IGlvcmVhZDMyKHJjc2xhdmVfbWVtICsgaSk7CisJCWlmIChyZXN1bHQgIT0gdmFsdWUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJXcm90ZSAweCUwOHggdG8gMHglcCwgYnV0IHJlYWQgYmFjayAweCUwOHguXG4iLAorCQkJCSh1MzIpdmFsdWUsICh2b2lkICopcmNzbGF2ZV9tZW0gKyBpLCAodTMyKXJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQl2YWx1ZSsrOworCX0KK30KKyNlbmRpZgorCisvKiBvYnRhaW4gdGhlIDMyIG1vc3Qgc2lnbmlmaWNhbnQgKGhpZ2gpIGJpdHMgb2YgYSAzMi1iaXQgb3IgNjQtYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgcGNpX2RtYV9oKGFkZHIpICgoYWRkciA+PiAxNikgPj4gMTYpCisvKiBvYnRhaW4gdGhlIDMyIGxlYXN0IHNpZ25pZmljYW50IChsb3cpIGJpdHMgb2YgYSAzMi1iaXQgb3IgNjQtYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgcGNpX2RtYV9sKGFkZHIpIChhZGRyICYgMHhmZmZmZmZmZlVMKQorCisvKiBhcGVfZmlsbF9jaGRtYV9kZXNjKCkgLSBGaWxsIGEgQWx0ZXJhIFBDSSBFeHByZXNzIENoYWluaW5nIERNQSBkZXNjcmlwdG9yCisgKgorICogQGRlc2MgcG9pbnRlciB0byBkZXNjcmlwdG9yIHRvIGJlIGZpbGxlZAorICogQGFkZHIgcm9vdCBjb21wbGV4IGFkZHJlc3MKKyAqIEBlcF9hZGRyIGVuZCBwb2ludCBhZGRyZXNzCisgKiBAbGVuIG51bWJlciBvZiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcGVfY2hkbWFfZGVzY19zZXQoc3RydWN0IGFwZV9jaGRtYV9kZXNjICpkZXNjLCBkbWFfYWRkcl90IGFkZHIsIHUzMiBlcF9hZGRyLCBpbnQgbGVuKQoreworICBCVUdfT04obGVuICYgMyk7CisJZGVzYy0+dzAgPSBjcHVfdG9fbGUzMihsZW4gLyA0KTsKKwlkZXNjLT5lcF9hZGRyID0gY3B1X3RvX2xlMzIoZXBfYWRkcik7CisJZGVzYy0+cmNfYWRkcl9oID0gY3B1X3RvX2xlMzIocGNpX2RtYV9oKGFkZHIpKTsKKwlkZXNjLT5yY19hZGRyX2wgPSBjcHVfdG9fbGUzMihwY2lfZG1hX2woYWRkcikpOworfQorCisvKgorICogYXBlX3NnX3RvX2NoZG1hX3RhYmxlKCkgLSBDcmVhdGUgYSBkZXZpY2UgZGVzY3JpcHRvciB0YWJsZSBmcm9tIGEgc2NhdHRlcmxpc3QuCisgKgorICogVGhlIHNjYXR0ZXJsaXN0IG11c3QgaGF2ZSBiZWVuIG1hcHBlZCBieSBwY2lfbWFwX3NnKHNnbS0+c2dsKS4KKyAqCisgKiBAc2dsIHNjYXR0ZXJsaXN0LgorICogQG5lbnRzIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzY2F0dGVybGlzdC4KKyAqIEBmaXJzdCBTdGFydCBpbmRleCBpbiB0aGUgc2NhdHRlcmxpc3Qgc2dtLT5zZ2wuCisgKiBAZXBfYWRkciBFbmQgUG9pbnQgYWRkcmVzcyBmb3IgdGhlIHNjYXR0ZXIvZ2F0aGVyIHRyYW5zZmVyLgorICogQGRlc2MgcG9pbnRlciB0byBmaXJzdCBkZXNjcmlwdG9yCisgKgorICogUmV0dXJucyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgYXBlX3NnX3RvX2NoZG1hX3RhYmxlKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVudHMsIGludCBmaXJzdCwgc3RydWN0IGFwZV9jaGRtYV9kZXNjICpkZXNjLCB1MzIgZXBfYWRkcikKK3sKKwlpbnQgaSA9IGZpcnN0LCBqID0gMDsKKwkvKiBpbnNwZWN0IGZpcnN0IGVudHJ5ICovCisJZG1hX2FkZHJfdCBhZGRyID0gc2dfZG1hX2FkZHJlc3MoJnNnbFtpXSk7CisJdW5zaWduZWQgaW50IGxlbiA9IHNnX2RtYV9sZW4oJnNnbFtpXSk7CisJLyogY29udGlndW91cyBibG9jayAqLworCWRtYV9hZGRyX3QgY29udF9hZGRyID0gYWRkcjsKKwl1bnNpZ25lZCBpbnQgY29udF9sZW4gPSBsZW47CisJLyogaXRlcmF0ZSBvdmVyIHJlbWFpbmluZyBlbnRyaWVzICovCisJZm9yICg7IGogPCAyNSAmJiBpIDwgbmVudHMgLSAxOyBpKyspIHsKKwkJLyogYnVzIGFkZHJlc3Mgb2YgbmV4dCBlbnRyeSBpICsgMSAqLworCQlkbWFfYWRkcl90IG5leHQgPSBzZ19kbWFfYWRkcmVzcygmc2dsW2kgKyAxXSk7CisJCS8qIGxlbmd0aCBvZiB0aGlzIGVudHJ5IGkgKi8KKwkJbGVuID0gc2dfZG1hX2xlbigmc2dsW2ldKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiUwNGQ6IGFkZHI9MHglMDh4IGxlbmd0aD0weCUwOHhcbiIsIGksIGFkZHIsIGxlbik7CisJCS8qIGVudHJ5IGkgKyAxIGlzIG5vbi1jb250aWd1b3VzIHdpdGggZW50cnkgaT8gKi8KKwkJaWYgKG5leHQgIT0gYWRkciArIGxlbikgeworCQkJLyogVE9ETyBjcmVhdGUgZW50cnkgaGVyZSAod2UgY291bGQgb3ZlcndyaXRlIGkpICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJTRkOiBjb250X2FkZHI9MHglMDh4IGNvbnRfbGVuPTB4JTA4eFxuIiwgaiwgY29udF9hZGRyLCBjb250X2xlbik7CisJCQkvKiBzZXQgZGVzY3JpcHRvciBmb3IgY29udGlndW91cyB0cmFuc2ZlciAqLworCQkJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZkZXNjW2pdLCBjb250X2FkZHIsIGVwX2FkZHIsIGNvbnRfbGVuKTsKKwkJCS8qIG5leHQgZW5kIHBvaW50IG1lbW9yeSBhZGRyZXNzICovCisJCQllcF9hZGRyICs9IGNvbnRfbGVuOworCQkJLyogc3RhcnQgbmV3IGNvbnRpZ3VvdXMgYmxvY2sgKi8KKwkJCWNvbnRfYWRkciA9IG5leHQ7CisJCQljb250X2xlbiA9IDA7CisJCQlqKys7CisJCX0KKwkJLyogYWRkIGVudHJ5IGkgKyAxIHRvIGN1cnJlbnQgY29udGlndW91cyBibG9jayAqLworCQljb250X2xlbiArPSBsZW47CisJCS8qIGdvdG8gZW50cnkgaSArIDEgKi8KKwkJYWRkciA9IG5leHQ7CisJfQorCS8qIFRPRE8gY3JlYXRlIGVudHJ5IGhlcmUgICh3ZSBjb3VsZCBvdmVyd3JpdGUgaSkgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiJTA0ZDogYWRkcj0weCUwOHggbGVuZ3RoPTB4JTA4eFxuIiwgaSwgYWRkciwgbGVuKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJTRkOiBjb250X2FkZHI9MHglMDh4IGxlbmd0aD0weCUwOHhcbiIsIGosIGNvbnRfYWRkciwgY29udF9sZW4pOworCWorKzsKKwlyZXR1cm4gajsKK30KKworLyogY29tcGFyZSBidWZmZXJzICovCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlKHUzMiAqcCwgdTMyICpxLCBpbnQgbGVuKQoreworCWludCByZXN1bHQgPSAtMTsKKwlpbnQgZmFpbCA9IDA7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGxlbiAvIDQ7IGkrKykgeworCQlpZiAoKnAgPT0gKnEpIHsKKwkJCS8qIGV2ZXJ5IHNvIG1hbnkgdTMyIHdvcmRzLCBzaG93IGVxdWFscyAqLworCQkJaWYgKChpICYgMjU1KSA9PSAwKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJbJXBdID0gMHglMDh4ICAgIFslcF0gPSAweCUwOHhcbiIsIHAsICpwLCBxLCAqcSk7CisJCX0gZWxzZSB7CisJCQlmYWlsKys7CisJCQkvKiBzaG93IHRoZSBmaXJzdCBmZXcgbWlzY29tcGFyZXMgKi8KKwkJCWlmIChmYWlsIDwgMTApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiWyVwXSA9IDB4JTA4eCAhPSBbJXBdID0gMHglMDh4ID8hXG4iLCBwLCAqcCwgcSwgKnEpOworICAgICAgICAgICAgLyogYnV0IHN0b3AgYWZ0ZXIgYSB3aGlsZSAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChmYWlsID09IDEwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIi0tLW1vcmUgZXJyb3JzIGZvbGxvdyEgbm90IHByaW50ZWQtLS1cbiIpOworCQkgIAl9IGVsc2UgeworCQkJCS8qIHN0b3AgY29tcGFyZSBhZnRlciB0aGlzIG1hbnkgZXJyb3JzICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisJCX0KKwkJcCsrOworCQlxKys7CisJfQorCWlmICghZmFpbCkKKwkJcmVzdWx0ID0gMDsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBkbWFfdGVzdCgpIC0gUGVyZm9ybSBETUEgbG9vcCBiYWNrIHRlc3QgdG8gZW5kIHBvaW50IGFuZCBiYWNrIHRvIHJvb3QgY29tcGxleC4KKyAqCisgKiBBbGxvY2F0ZSBhIGNhY2hlLWNvaGVyZW50IGJ1ZmZlciBpbiBob3N0IG1lbW9yeSwgY29uc2lzdGluZyBvZiBmb3VyIHBhZ2VzLgorICoKKyAqIEZpbGwgdGhlIGZvdXIgbWVtb3J5IHBhZ2VzIHN1Y2ggdGhhdCBlYWNoIDMyLWJpdCB3b3JkIGNvbnRhaW5zIGl0cyBvd24gYWRkcmVzcy4KKyAqCisgKiBOb3cgcGVyZm9ybSBhIGxvb3AgYmFjayB0ZXN0LCBoYXZlIHRoZSBlbmQgcG9pbnQgZGV2aWNlIGNvcHkgdGhlIGZpcnN0IGJ1ZmZlcgorICogaGFsZiB0byBlbmQgcG9pbnQgbWVtb3J5LCB0aGVuIGhhdmUgaXQgY29weSBiYWNrIGludG8gdGhlIHNlY29uZCBoYWxmLgorICoKKyAqICAgQ3JlYXRlIGEgZGVzY3JpcHRvciB0YWJsZSB0byBjb3B5IHRoZSBmaXJzdCBidWZmZXIgaGFsZiBpbnRvIEVuZCBQb2ludAorICogICBtZW1vcnkuIEluc3RydWN0IHRoZSBFbmQgUG9pbnQgdG8gZG8gYSBETUEgcmVhZCB1c2luZyB0aGF0IHRhYmxlLgorICoKKyAqICAgQ3JlYXRlIGEgZGVzY3JpcHRvciB0YWJsZSB0byBjb3B5IEVuZCBQb2ludCBtZW1vcnkgdG8gdGhlIHNlY29uZCBidWZmZXIKKyAqICAgaGFsZi4gSW5zdHJ1Y3QgdGhlIEVuZCBQb2ludCB0byBkbyBhIERNQSB3cml0ZSB1c2luZyB0aGF0IHRhYmxlLgorICoKKyAqIENvbXBhcmUgcmVzdWx0cywgZmFpbCBvciBwYXNzLgorICoKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgZG1hX3Rlc3Qoc3RydWN0IGFwZV9kZXYgKmFwZSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwkvKiB0ZXN0IHJlc3VsdDsgZ3VpbHR5IHVudGlsIHByb3ZlbiBpbm5vY2VudCAqLworCWludCByZXN1bHQgPSAtMTsKKwkvKiB0aGUgRE1BIHJlYWQgaGVhZGVyIHNpdHMgYXQgYWRkcmVzcyAweDAwIG9mIHRoZSBETUEgZW5naW5lIEJBUiAqLworCXN0cnVjdCBhcGVfY2hkbWFfaGVhZGVyICp3cml0ZV9oZWFkZXIgPSAoc3RydWN0IGFwZV9jaGRtYV9oZWFkZXIgKilhcGUtPmJhcltBUEVfQkFSX0hFQURFUl07CisJLyogdGhlIHdyaXRlIERNQSBoZWFkZXIgc2l0cyBhZnRlciB0aGUgcmVhZCBoZWFkZXIgYXQgYWRkcmVzcyAweDEwICovCisJc3RydWN0IGFwZV9jaGRtYV9oZWFkZXIgKnJlYWRfaGVhZGVyID0gd3JpdGVfaGVhZGVyICsgMTsKKwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwl1OCAqYnVmZmVyX3ZpcnQgPSAwOworCS8qIGJ1cyBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJZG1hX2FkZHJfdCBidWZmZXJfYnVzID0gMDsKKwlpbnQgaSwgbiA9IDAsIGlycV9jb3VudDsKKworCS8qIHRlbXBvcmFyeSB2YWx1ZSB1c2VkIHRvIGNvbnN0cnVjdCAzMi1iaXQgZGF0YSB3b3JkcyAqLworCXUzMiB3OworCisJcHJpbnRrKEtFUk5fREVCVUcgImJhcl90ZXN0cygpLCBQQUdFX1NJWkUgPSAweCUweFxuIiwgKGludClQQUdFX1NJWkUpOworCXByaW50ayhLRVJOX0RFQlVHICJ3cml0ZV9oZWFkZXIgPSAweCVwLlxuIiwgd3JpdGVfaGVhZGVyKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicmVhZF9oZWFkZXIgPSAweCVwLlxuIiwgcmVhZF9oZWFkZXIpOworCXByaW50ayhLRVJOX0RFQlVHICImd3JpdGVfaGVhZGVyLT53MyA9IDB4JXBcbiIsICZ3cml0ZV9oZWFkZXItPnczKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJnJlYWRfaGVhZGVyLT53MyA9IDB4JXBcbiIsICZyZWFkX2hlYWRlci0+dzMpOworCXByaW50ayhLRVJOX0RFQlVHICJhcGUtPnRhYmxlX3ZpcnQgPSAweCVwLlxuIiwgYXBlLT50YWJsZV92aXJ0KTsKKworCWlmICghd3JpdGVfaGVhZGVyIHx8ICFyZWFkX2hlYWRlciB8fCAhYXBlLT50YWJsZV92aXJ0KQorICAgICAgICBnb3RvIGZhaWw7CisKKwkvKiBhbGxvY2F0ZSBhbmQgbWFwIGNvaGVyZW50bHktY2FjaGVkIG1lbW9yeSBmb3IgYSBETUEtYWJsZSBidWZmZXIgKi8KKwkvKiBAc2VlIDIuNi4yNi4yL0RvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0IGxpbmUgMzE4ICovCisJYnVmZmVyX3ZpcnQgPSAodTggKilwY2lfYWxsb2NfY29uc2lzdGVudChkZXYsIFBBR0VfU0laRSAqIDQsICZidWZmZXJfYnVzKTsKKwlpZiAoIWJ1ZmZlcl92aXJ0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgYWxsb2NhdGUgY29oZXJlbnQgRE1BIGJ1ZmZlci5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0ZWQgY2FjaGUtY29oZXJlbnQgRE1BIGJ1ZmZlciAodmlydHVhbCBhZGRyZXNzID0gMHglMDE2bGx4LCBidXMgYWRkcmVzcyA9IDB4JTAxNmxseCkuXG4iLAorCQkodTY0KWJ1ZmZlcl92aXJ0LCAodTY0KWJ1ZmZlcl9idXMpOworCisJLyogZmlsbCBmaXJzdCBoYWxmIG9mIGJ1ZmZlciB3aXRoIGl0cyB2aXJ0dWFsIGFkZHJlc3MgYXMgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCA0ICogUEFHRV9TSVpFOyBpICs9IDQpCisjaWYgMAorCQkqKHUzMiAqKShidWZmZXJfdmlydCArIGkpID0gaSAvIFBBR0VfU0laRSArIDE7CisjZWxzZQorCQkqKHUzMiAqKShidWZmZXJfdmlydCArIGkpID0gKGJ1ZmZlcl92aXJ0ICsgaSk7CisjZW5kaWYKKyNpZiAwCisgIGNvbXBhcmUoKHUzMiAqKWJ1ZmZlcl92aXJ0LCAodTMyICopKGJ1ZmZlcl92aXJ0ICsgMiAqIFBBR0VfU0laRSksIDgxOTIpOworI2VuZGlmCisKKyNpZiAwCisJLyogZmlsbCBzZWNvbmQgaGFsZiBvZiBidWZmZXIgd2l0aCB6ZXJvZXMgKi8KKwlmb3IgKGkgPSAyICogUEFHRV9TSVpFOyBpIDwgNCAqIFBBR0VfU0laRTsgaSArPSA0KQorCQkqKHUzMiAqKShidWZmZXJfdmlydCArIGkpID0gMDsKKyNlbmRpZgorCisJLyogaW52YWxpZGF0ZSBFUExBU1QsIG91dHNpZGUgMC0yNTUsIDB4RkFERSBpcyBmcm9tIHRoZSB0ZXN0YmVuY2ggKi8KKwlhcGUtPnRhYmxlX3ZpcnQtPnczID0gY3B1X3RvX2xlMzIoMHgwMDAwRkFERSk7CisKKwkvKiBmaWxsIGluIGZpcnN0IGRlc2NyaXB0b3IgKi8KKwluID0gMDsKKwkvKiByZWFkIDgxOTIgYnl0ZXMgZnJvbSBSQyBidWZmZXIgdG8gRVAgYWRkcmVzcyA0MDk2ICovCisJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZhcGUtPnRhYmxlX3ZpcnQtPmRlc2Nbbl0sIGJ1ZmZlcl9idXMsIDQwOTYsIDIgKiBQQUdFX1NJWkUpOworI2lmIDEKKwlmb3IgKGkgPSAwOyBpIDwgMjU1OyBpKyspIHsKKwkJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZhcGUtPnRhYmxlX3ZpcnQtPmRlc2NbaV0sIGJ1ZmZlcl9idXMsIDQwOTYsIDIgKiBQQUdFX1NJWkUpOworCX0KKwkvKiBpbmRleCBvZiBsYXN0IGRlc2NyaXB0b3IgKi8KKwluID0gaSAtIDE7CisjZW5kaWYKKyNpZiAwCisJLyogZmlsbCBpbiBuZXh0IGRlc2NyaXB0b3IgKi8KKwluKys7CisJLyogcmVhZCAxMDI0IGJ5dGVzIGZyb20gUkMgYnVmZmVyIHRvIEVQIGFkZHJlc3MgNDA5NiArIDEwMjQgKi8KKwlhcGVfY2hkbWFfZGVzY19zZXQoJmFwZS0+dGFibGVfdmlydC0+ZGVzY1tuXSwgYnVmZmVyX2J1cyArIDEwMjQsIDQwOTYgKyAxMDI0LCAxMDI0KTsKKyNlbmRpZgorCisjaWYgMQorCS8qIGVuYWJsZSBNU0kgYWZ0ZXIgdGhlIGxhc3QgZGVzY3JpcHRvciBpcyBjb21wbGV0ZWQgKi8KKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJYXBlLT50YWJsZV92aXJ0LT5kZXNjW25dLncwIHw9IGNwdV90b19sZTMyKDFVTCA8PCAxNikvKmxvY2FsIE1TSSovOworI2VuZGlmCisjaWYgMAorCS8qIGR1bXAgZGVzY3JpcHRvciB0YWJsZSBmb3IgZGVidWdnaW5nICovCisJcHJpbnRrKEtFUk5fREVCVUcgIkRlc2NyaXB0b3IgVGFibGUgKFJlYWQsIGluIFJvb3QgQ29tcGxleCBNZW1vcnksICMgPSAlZClcbiIsIG4gKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgNCArIChuICsgMSkgKiA0OyBpICs9IDQpIHsKKwkJdTMyICpwID0gKHUzMiAqKWFwZS0+dGFibGVfdmlydDsKKwkJcCArPSBpOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChMRU49MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCA0ICogbGUzMl90b19jcHUoKnApKTsKKwkJcCsrOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChFUEE9MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCBsZTMyX3RvX2NwdSgqcCkpOworCQlwKys7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKFJDSD0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIGxlMzJfdG9fY3B1KCpwKSk7CisJCXArKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoUkNMPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgbGUzMl90b19jcHUoKnApKTsKKwl9CisjZW5kaWYKKwkvKiBzZXQgYXZhaWxhYmxlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0YWJsZSAqLworCXcgPSAodTMyKShuICsgMSk7CisJdyB8PSAoMVVMIDw8IDE4KS8qZ2xvYmFsIEVQTEFTVF9FTiovOworI2lmIDAKKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJdyB8PSAoMVVMIDw8IDE3KS8qZ2xvYmFsIE1TSSovOworI2VuZGlmCisJcHJpbnRrKEtFUk5fREVCVUcgIndyaXRpbmcgMHglMDh4IHRvIDB4JXBcbiIsIHcsICh2b2lkICopJnJlYWRfaGVhZGVyLT53MCk7CisJaW93cml0ZTMyKHcsICZyZWFkX2hlYWRlci0+dzApOworCisJLyogd3JpdGUgdGFibGUgYWRkcmVzcyAoaGlnaGVyIDMyLWJpdHMpICovCisJcHJpbnRrKEtFUk5fREVCVUcgIndyaXRpbmcgMHglMDh4IHRvIDB4JXBcbiIsICh1MzIpKChhcGUtPnRhYmxlX2J1cyA+PiAxNikgPj4gMTYpLCAodm9pZCAqKSZyZWFkX2hlYWRlci0+YmR0X2FkZHJfaCk7CisJaW93cml0ZTMyKHBjaV9kbWFfaChhcGUtPnRhYmxlX2J1cyksICZyZWFkX2hlYWRlci0+YmR0X2FkZHJfaCk7CisKKwkvKiB3cml0ZSB0YWJsZSBhZGRyZXNzIChsb3dlciAzMi1iaXRzKSAqLworCXByaW50ayhLRVJOX0RFQlVHICJ3cml0aW5nIDB4JTA4eCB0byAweCVwXG4iLCAodTMyKShhcGUtPnRhYmxlX2J1cyAmIDB4ZmZmZmZmZmZVTCksICh2b2lkICopJnJlYWRfaGVhZGVyLT5iZHRfYWRkcl9sKTsKKwlpb3dyaXRlMzIocGNpX2RtYV9sKGFwZS0+dGFibGVfYnVzKSwgJnJlYWRfaGVhZGVyLT5iZHRfYWRkcl9sKTsKKworCS8qIG1lbW9yeSB3cml0ZSBiYXJyaWVyICovCisJd21iKCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkZsdXNoIHBvc3RlZCB3cml0ZXNcbiIpOworCS8qKiBGSVhNRSBBZGQgZHVtbXkgcmVhZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzIGJ1dCBuZWVkIGEgcmVhZGFibGUgbG9jYXRpb24hICovCisjaWYgMAorCSh2b2lkKWlvcmVhZDMyKCk7CisjZW5kaWYKKworCS8qIHJlbWVtYmVyIElSUSBjb3VudCBiZWZvcmUgdGhlIHRyYW5zZmVyICovCisJaXJxX2NvdW50ID0gYXBlLT5pcnFfY291bnQ7CisJLyogd3JpdGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIC0gdGhpcyBzdGFydHMgdGhlIERNQSAqLworCXByaW50ayhLRVJOX0RFQlVHICJcblN0YXJ0IERNQSByZWFkXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid3JpdGluZyAweCUwOHggdG8gMHglcFxuIiwgKHUzMiluLCAodm9pZCAqKSZyZWFkX2hlYWRlci0+dzMpOworCWlvd3JpdGUzMihuLCAmcmVhZF9oZWFkZXItPnczKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRVBMQVNUID0gJWx1XG4iLCBsZTMyX3RvX2NwdSgqKHUzMiAqKSZhcGUtPnRhYmxlX3ZpcnQtPnczKSAmIDB4ZmZmZlVMKTsKKworCS8qKiBtZW1vcnkgd3JpdGUgYmFycmllciAqLworCXdtYigpOworCS8qIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCS8qIEZJWE1FIE5lZWQgYSByZWFkYWJsZSBsb2NhdGlvbiEgKi8KKyNpZiAwCisJKHZvaWQpaW9yZWFkMzIoKTsKKyNlbmRpZgorCXByaW50ayhLRVJOX0RFQlVHICJQT0xMIEZPUiBSRUFEOlxuIik7CisJLyogcG9sbCBmb3IgY2hhaW4gY29tcGxldGlvbiwgMTAwMCB0aW1lcyAxIG1pbGxpc2Vjb25kICovCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXZvbGF0aWxlIHUzMiAqcCA9ICZhcGUtPnRhYmxlX3ZpcnQtPnczOworCQl1MzIgZXBsYXN0ID0gbGUzMl90b19jcHUoKnApICYgMHhmZmZmVUw7CisJCXByaW50ayhLRVJOX0RFQlVHICJFUExBU1QgPSAldSwgbiA9ICVkXG4iLCBlcGxhc3QsIG4pOworCQlpZiAoZXBsYXN0ID09IG4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJET05FXG4iKTsKKyAgICAgICAgICAgIC8qIHByaW50IElSUSBjb3VudCBiZWZvcmUgdGhlIHRyYW5zZmVyICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiI0lSUXMgZHVyaW5nIHRyYW5zZmVyOiAlZFxuIiwgYXBlLT5pcnFfY291bnQgLSBpcnFfY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCisJLyogaW52YWxpZGF0ZSBFUExBU1QsIG91dHNpZGUgMC0yNTUsIDB4RkFERSBpcyBmcm9tIHRoZSB0ZXN0YmVuY2ggKi8KKwlhcGUtPnRhYmxlX3ZpcnQtPnczID0gY3B1X3RvX2xlMzIoMHgwMDAwRkFERSk7CisKKwkvKiBzZXR1cCBmaXJzdCBkZXNjcmlwdG9yICovCisJbiA9IDA7CisJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZhcGUtPnRhYmxlX3ZpcnQtPmRlc2Nbbl0sIGJ1ZmZlcl9idXMgKyA4MTkyLCA0MDk2LCAyICogUEFHRV9TSVpFKTsKKyNpZiAxCisJZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisJCWFwZV9jaGRtYV9kZXNjX3NldCgmYXBlLT50YWJsZV92aXJ0LT5kZXNjW2ldLCBidWZmZXJfYnVzICsgODE5MiwgNDA5NiwgMiAqIFBBR0VfU0laRSk7CisJfQorCS8qIGluZGV4IG9mIGxhc3QgZGVzY3JpcHRvciAqLworCW4gPSBpIC0gMTsKKyNlbmRpZgorI2lmIDEgLyogdGVzdCB2YXJpYWJsZSwgbWFrZSBhIG1vZHVsZSBvcHRpb24gbGF0ZXIgKi8KKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJYXBlLT50YWJsZV92aXJ0LT5kZXNjW25dLncwIHw9IGNwdV90b19sZTMyKDFVTCA8PCAxNikvKmxvY2FsIE1TSSovOworI2VuZGlmCisjaWYgMAorCS8qIGR1bXAgZGVzY3JpcHRvciB0YWJsZSBmb3IgZGVidWdnaW5nICovCisJcHJpbnRrKEtFUk5fREVCVUcgIkRlc2NyaXB0b3IgVGFibGUgKFdyaXRlLCBpbiBSb290IENvbXBsZXggTWVtb3J5LCAjID0gJWQpXG4iLCBuICsgMSk7CisJZm9yIChpID0gMDsgaSA8IDQgKyAobiArIDEpICogNDsgaSArPSA0KSB7CisJCXUzMiAqcCA9ICh1MzIgKilhcGUtPnRhYmxlX3ZpcnQ7CisJCXAgKz0gaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoTEVOPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgNCAqIGxlMzJfdG9fY3B1KCpwKSk7CisJCXArKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoRVBBPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgbGUzMl90b19jcHUoKnApKTsKKwkJcCsrOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChSQ0g9MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCBsZTMyX3RvX2NwdSgqcCkpOworCQlwKys7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKFJDTD0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIGxlMzJfdG9fY3B1KCpwKSk7CisJfQorI2VuZGlmCisKKwkvKiBzZXQgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXNjcmlwdG9ycyBpbiB0aGUgdGFibGUgKi8KKwl3ID0gKHUzMikobiArIDEpOworCS8qIGVuYWJsZSB1cGRhdGVzIG9mIGVwbGFzdCBmb3IgZWFjaCBkZXNjcmlwdG9yIGNvbXBsZXRpb24gKi8KKwl3IHw9ICh1MzIpKDFVTCA8PCAxOCkvKmdsb2JhbCBFUExBU1RfRU4qLzsKKyNpZiAwIC8vIHRlc3QgdmFyaWFibGUsIG1ha2UgYSBtb2R1bGUgb3B0aW9uIGxhdGVyCisJLyogZW5hYmxlIE1TSSBmb3IgZWFjaCBkZXNjcmlwdG9yIGNvbXBsZXRpb24gKi8KKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJdyB8PSAoMVVMIDw8IDE3KS8qZ2xvYmFsIE1TSSovOworI2VuZGlmCisJaW93cml0ZTMyKHcsICZ3cml0ZV9oZWFkZXItPncwKTsKKwlpb3dyaXRlMzIocGNpX2RtYV9oKGFwZS0+dGFibGVfYnVzKSwgJndyaXRlX2hlYWRlci0+YmR0X2FkZHJfaCk7CisJaW93cml0ZTMyKHBjaV9kbWFfbChhcGUtPnRhYmxlX2J1cyksICZ3cml0ZV9oZWFkZXItPmJkdF9hZGRyX2wpOworCisJLyoqIG1lbW9yeSB3cml0ZSBiYXJyaWVyIGFuZCBmbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJd21iKCk7CisJLyogZHVtbXkgcmVhZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJLyogRklYTUUgTmVlZCBhIHJlYWRhYmxlIGxvY2F0aW9uISAqLworI2lmIDAKKwkodm9pZClpb3JlYWQzMigpOworI2VuZGlmCisJaXJxX2NvdW50ID0gYXBlLT5pcnFfY291bnQ7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiXG5TdGFydCBETUEgd3JpdGVcbiIpOworCWlvd3JpdGUzMihuLCAmd3JpdGVfaGVhZGVyLT53Myk7CisKKwkvKiogbWVtb3J5IHdyaXRlIGJhcnJpZXIgKi8KKwl3bWIoKTsKKwkvKiogZHVtbXkgcmVhZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJLy8odm9pZClpb3JlYWQzMigpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIlBPTEwgRk9SIFdSSVRFOlxuIik7CisJLyogcG9sbCBmb3IgY29tcGxldGlvbiwgMTAwMCB0aW1lcyAxIG1pbGxpc2Vjb25kICovCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXZvbGF0aWxlIHUzMiAqcCA9ICZhcGUtPnRhYmxlX3ZpcnQtPnczOworCQl1MzIgZXBsYXN0ID0gbGUzMl90b19jcHUoKnApICYgMHhmZmZmVUw7CisJCXByaW50ayhLRVJOX0RFQlVHICJFUExBU1QgPSAldSwgbiA9ICVkXG4iLCBlcGxhc3QsIG4pOworCQlpZiAoZXBsYXN0ID09IG4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJET05FXG4iKTsKKwkJCS8qIHByaW50IElSUSBjb3VudCBiZWZvcmUgdGhlIHRyYW5zZmVyICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiI0lSUXMgZHVyaW5nIHRyYW5zZmVyOiAlZFxuIiwgYXBlLT5pcnFfY291bnQgLSBpcnFfY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCS8qIHNvZnQtcmVzZXQgRE1BIHdyaXRlIGVuZ2luZSAqLworCWlvd3JpdGUzMigweDAwMDBmZmZmVUwsICZ3cml0ZV9oZWFkZXItPncwKTsKKwkvKiBzb2Z0LXJlc2V0IERNQSByZWFkIGVuZ2luZSAqLworCWlvd3JpdGUzMigweDAwMDBmZmZmVUwsICZyZWFkX2hlYWRlci0+dzApOworCisJLyoqIG1lbW9yeSB3cml0ZSBiYXJyaWVyICovCisJd21iKCk7CisJLyogZHVtbXkgcmVhZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJLyogRklYTUUgTmVlZCBhIHJlYWRhYmxlIGxvY2F0aW9uISAqLworI2lmIDAKKwkodm9pZClpb3JlYWQzMigpOworI2VuZGlmCisJLyogY29tcGFyZSBmaXJzdCBoYWxmIG9mIGJ1ZmZlciB3aXRoIHNlY29uZCBoYWxmLCBzaG91bGQgYmUgaWRlbnRpY2FsICovCisJcmVzdWx0ID0gY29tcGFyZSgodTMyICopYnVmZmVyX3ZpcnQsICh1MzIgKikoYnVmZmVyX3ZpcnQgKyAyICogUEFHRV9TSVpFKSwgODE5Mik7CisJcHJpbnRrKEtFUk5fREVCVUcgIkRNQSBsb29wIGJhY2sgdGVzdCAlcy5cbiIsIHJlc3VsdCA/ICJGQUlMRUQiIDogIlBBU1NFRCIpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYsIDQgKiBQQUdFX1NJWkUsIGJ1ZmZlcl92aXJ0LCBidWZmZXJfYnVzKTsKK2ZhaWw6CisJcHJpbnRrKEtFUk5fREVCVUcgImJhcl90ZXN0cygpIGVuZCwgcmVzdWx0ICVkXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIENhbGxlZCB3aGVuIHRoZSBQQ0kgc3ViIHN5c3RlbSB0aGlua3Mgd2UgY2FuIGNvbnRyb2wgdGhlIGdpdmVuIGRldmljZS4KKyAqIEluc3BlY3QgaWYgd2UgY2FuIHN1cHBvcnQgdGhlIGRldmljZSBhbmQgaWYgc28gdGFrZSBjb250cm9sIG9mIGl0LgorICoKKyAqIFJldHVybiAwIHdoZW4gd2UgaGF2ZSB0YWtlbiBjb250cm9sIG9mIHRoZSBnaXZlbiBkZXZpY2UuCisgKgorICogLSBhbGxvY2F0ZSBib2FyZCBzcGVjaWZpYyBib29ra2VlcGluZworICogLSBhbGxvY2F0ZSBjb2hlcmVudGx5LW1hcHBlZCBtZW1vcnkgZm9yIHRoZSBkZXNjcmlwdG9yIHRhYmxlCisgKiAtIGVuYWJsZSB0aGUgYm9hcmQKKyAqIC0gdmVyaWZ5IGJvYXJkIHJldmlzaW9uCisgKiAtIHJlcXVlc3QgcmVnaW9ucworICogLSBxdWVyeSBETUEgbWFzaworICogLSBvYnRhaW4gYW5kIHJlcXVlc3QgaXJxCisgKiAtIG1hcCByZWdpb25zIGludG8ga2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IE5VTEw7CisJdTggaXJxX3BpbiwgaXJxX2xpbmU7CisJcHJpbnRrKEtFUk5fREVCVUcgInByb2JlKGRldiA9IDB4JXAsIHBjaWlkID0gMHglcClcbiIsIGRldiwgaWQpOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBwZXItYm9hcmQgYm9vayBrZWVwaW5nICovCisJYXBlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFwZV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFwZSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGt6YWxsb2MoKWF0ZSBtZW1vcnkuXG4iKTsKKwkJZ290byBlcnJfYXBlOworCX0KKwlhcGUtPnBjaV9kZXYgPSBkZXY7CisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAodm9pZCAqKWFwZTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHJvYmUoKSBhcGUgPSAweCVwXG4iLCBhcGUpOworCisJcHJpbnRrKEtFUk5fREVCVUcgInNpemVvZihzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlKSA9ICVkLlxuIiwKKwkJKGludClzaXplb2Yoc3RydWN0IGFwZV9jaGRtYV90YWJsZSkpOworCS8qIHRoZSByZWZlcmVuY2UgZGVzaWduIGhhcyBhIHNpemUgcmVzdHJpY3Rpb24gb24gdGhlIHRhYmxlIHNpemUgKi8KKwlCVUdfT04oc2l6ZW9mKHN0cnVjdCBhcGVfY2hkbWFfdGFibGUpID4gQVBFX0NIRE1BX1RBQkxFX1NJWkUpOworCisJLyogYWxsb2NhdGUgYW5kIG1hcCBjb2hlcmVudGx5LWNhY2hlZCBtZW1vcnkgZm9yIGEgZGVzY3JpcHRvciB0YWJsZSAqLworCS8qIEBzZWUgTEREMyBwYWdlIDQ0NiAqLworCWFwZS0+dGFibGVfdmlydCA9IChzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LAorCQlBUEVfQ0hETUFfVEFCTEVfU0laRSwgJmFwZS0+dGFibGVfYnVzKTsKKwkvKiBjb3VsZCBub3QgYWxsb2NhdGUgdGFibGU/ICovCisJaWYgKCFhcGUtPnRhYmxlX3ZpcnQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBkbWFfYWxsb2MoKWF0ZV9jb2hlcmVudCBtZW1vcnkuXG4iKTsKKwkJZ290byBlcnJfdGFibGU7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgInRhYmxlX3ZpcnQgPSAweCUxNmxseCwgdGFibGVfYnVzID0gMHglMTZsbHguXG4iLAorCQkodTY0KWFwZS0+dGFibGVfdmlydCwgKHU2NClhcGUtPnRhYmxlX2J1cyk7CisKKwkvKiBlbmFibGUgZGV2aWNlICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9ERUJVRyAicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9lbmFibGU7CisJfQorCisJLyogZW5hYmxlIGJ1cyBtYXN0ZXIgY2FwYWJpbGl0eSBvbiBkZXZpY2UgKi8KKwlwY2lfc2V0X21hc3RlcihkZXYpOworCS8qIGVuYWJsZSBtZXNzYWdlIHNpZ25hbGVkIGludGVycnVwdHMgKi8KKwlyYyA9IHBjaV9lbmFibGVfbXNpKGRldik7CisJLyogY291bGQgbm90IHVzZSBNU0k/ICovCisJaWYgKHJjKSB7CisJCS8qIHJlc29ydCB0byBsZWdhY3kgaW50ZXJydXB0cyAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGVuYWJsZSBNU0kgaW50ZXJydXB0aW5nLlxuIik7CisJCWFwZS0+bXNpX2VuYWJsZWQgPSAwOworCS8qIE1TSSBlbmFibGVkLCByZW1lbWJlciBmb3IgY2xlYW51cCAqLworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJFbmFibGVkIE1TSSBpbnRlcnJ1cHRpbmcuXG4iKTsKKwkJYXBlLT5tc2lfZW5hYmxlZCA9IDE7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZhcGUtPnJldmlzaW9uKTsKKyNpZiAwIC8qIGV4YW1wbGUgKi8KKwkvKiAoZm9yIGV4YW1wbGUpIHRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgcmV2aXNpb24gMHg0MiAqLworICAgIGlmIChhcGUtPnJldmlzaW9uID09IDB4NDIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJldmlzaW9uIDB4NDIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci5cbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JldjsKKwl9CisjZW5kaWYKKwkvKiogWFhYIGNoZWNrIGZvciBuYXRpdmUgb3IgbGVnYWN5IFBDSWUgZW5kcG9pbnQ/ICovCisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCBEUlZfTkFNRSk7CisJLyogY291bGQgbm90IHJlcXVlc3QgYWxsIHJlZ2lvbnM/ICovCisJaWYgKHJjKSB7CisJCS8qIGFzc3VtZSBkZXZpY2UgaXMgaW4gdXNlIChhbmQgZG8gbm90IGRpc2FibGUgaXQgbGF0ZXIhKSAqLworCQlhcGUtPmluX3VzZSA9IDE7CisJCWdvdG8gZXJyX3JlZ2lvbnM7CisJfQorCWFwZS0+Z290X3JlZ2lvbnMgPSAxOworCisjaWYgMSAvLyBAdG9kbyBGb3Igbm93LCBkaXNhYmxlIDY0LWJpdCwgYmVjYXVzZSBJIGRvIG5vdCB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgKERBQyEpCisJLyogcXVlcnkgZm9yIERNQSB0cmFuc2ZlciAqLworCS8qIEBzZWUgRG9jdW1lbnRhdGlvbi9ETUEtbWFwcGluZy50eHQgKi8KKwlpZiAoIXBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldiwgRE1BXzY0QklUX01BU0spOworCQkvKiB1c2UgNjQtYml0IERNQSAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgYSA2NC1iaXQgRE1BIG1hc2suXG4iKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmICghcGNpX3NldF9kbWFfbWFzayhkZXYsIERNQV8zMkJJVF9NQVNLKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IHNldCA2NC1iaXQgRE1BIG1hc2suXG4iKTsKKwkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldiwgRE1BXzMyQklUX01BU0spOworCQkvKiB1c2UgMzItYml0IERNQSAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgYSAzMi1iaXQgRE1BIG1hc2suXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiTm8gc3VpdGFibGUgRE1BIHBvc3NpYmxlLlxuIik7CisJCS8qKiBAdG9kbyBDaG9vc2UgcHJvcGVyIGVycm9yIHJldHVybiBjb2RlICovCisJCXJjID0gLTE7CisJCWdvdG8gZXJyX21hc2s7CisJfQorCisJcmMgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmaXJxX3Bpbik7CisJLyogY291bGQgbm90IHJlYWQ/ICovCisJaWYgKHJjKQorCQlnb3RvIGVycl9pcnE7CisJcHJpbnRrKEtFUk5fREVCVUcgIklSUSBwaW4gIyVkICgwPW5vbmUsIDE9SU5UQSMuLi40PUlOVEQjKS5cbiIsIGlycV9waW4pOworCisJLyogQHNlZSBMREQzLCBwYWdlIDMxOCAqLworCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZpcnFfbGluZSk7CisJLyogY291bGQgbm90IHJlYWQ/ICovCisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgcXVlcnkgUENJX0lOVEVSUlVQVF9MSU5FLCBlcnJvciAlZFxuIiwgcmMpOworCQlnb3RvIGVycl9pcnE7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJJUlEgbGluZSAjJWQuXG4iLCBpcnFfbGluZSk7CisjaWYgMQorCWlycV9saW5lID0gZGV2LT5pcnE7CisJLyogQHNlZSBMREQzLCBwYWdlIDI1OSAqLworCXJjID0gcmVxdWVzdF9pcnEoaXJxX2xpbmUsIGFsdHBjaWVjaGRtYV9pc3IsIElSUUZfU0hBUkVELCBEUlZfTkFNRSwgKHZvaWQgKilhcGUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IHJlcXVlc3QgSVJRICMlZCwgZXJyb3IgJWRcbiIsIGlycV9saW5lLCByYyk7CisJCWFwZS0+aXJxX2xpbmUgPSAtMTsKKwkJZ290byBlcnJfaXJxOworCX0KKwkvKiByZW1lbWJlciB3aGljaCBpcnEgd2UgYWxsb2NhdGVkICovCisJYXBlLT5pcnFfbGluZSA9IChpbnQpaXJxX2xpbmU7CisJcHJpbnRrKEtFUk5fREVCVUcgIlN1Y2Nlc2Z1bGx5IHJlcXVlc3RlZCBJUlEgIyVkIHdpdGggZGV2X2lkIDB4JXBcbiIsIGlycV9saW5lLCBhcGUpOworI2VuZGlmCisJLyogc2hvdyBCQVJzICovCisJc2Nhbl9iYXJzKGFwZSwgZGV2KTsKKwkvKiBtYXAgQkFScyAqLworCXJjID0gbWFwX2JhcnMoYXBlLCBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfbWFwOworI2lmIEFMVFBDSUVDSERNQV9DREVWCisJLyogaW5pdGlhbGl6ZSBjaGFyYWN0ZXIgZGV2aWNlICovCisJcmMgPSBzZ19pbml0KGFwZSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9jZGV2OworI2VuZGlmCisJLyogcGVyZm9ybSBETUEgZW5naW5lcyBsb29wIGJhY2sgdGVzdCAqLworCXJjID0gZG1hX3Rlc3QoYXBlLCBkZXYpOworCSh2b2lkKXJjOworCS8qIHN1Y2Nlc2Z1bGx5IHRvb2sgdGhlIGRldmljZSAqLworCXJjID0gMDsKKwlwcmludGsoS0VSTl9ERUJVRyAicHJvYmUoKSBzdWNjZXNzZnVsLlxuIik7CisJZ290byBlbmQ7CitlcnJfY2RldjoKKwkvKiB1bm1hcCB0aGUgQkFScyAqLworCXVubWFwX2JhcnMoYXBlLCBkZXYpOworZXJyX21hcDoKKwkvKiBmcmVlIGFsbG9jYXRlZCBpcnEgKi8KKwlpZiAoYXBlLT5pcnFfbGluZSA+PSAwKQorCQlmcmVlX2lycShhcGUtPmlycV9saW5lLCAodm9pZCAqKWFwZSk7CitlcnJfaXJxOgorCWlmIChhcGUtPm1zaV9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9tc2koZGV2KTsKKwkvKiBkaXNhYmxlIHRoZSBkZXZpY2UgaWZmIGl0IGlzIG5vdCBpbiB1c2UgKi8KKwlpZiAoIWFwZS0+aW5fdXNlKQorCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAoYXBlLT5nb3RfcmVnaW9ucykKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworZXJyX21hc2s6CitlcnJfcmVnaW9uczoKK2Vycl9yZXY6CisvKiBjbGVhbiB1cCBldmVyeXRoaW5nIGJlZm9yZSBkZXZpY2UgZW5hYmxlKCkgKi8KK2Vycl9lbmFibGU6CisJaWYgKGFwZS0+dGFibGVfdmlydCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYsIEFQRV9DSERNQV9UQUJMRV9TSVpFLCBhcGUtPnRhYmxlX3ZpcnQsIGFwZS0+dGFibGVfYnVzKTsKKy8qIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgYmVmb3JlIGFsbG9jYXRpbmcgZGVzY3JpcHRvciB0YWJsZSAqLworZXJyX3RhYmxlOgorCWlmIChhcGUpCisJCWtmcmVlKGFwZSk7CitlcnJfYXBlOgorZW5kOgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBhcGVfZGV2ICphcGU7CisJcHJpbnRrKEtFUk5fREVCVUcgInJlbW92ZSgweCVwKVxuIiwgZGV2KTsKKwlpZiAoKGRldiA9PSAwKSB8fCAoZGV2LT5kZXYuZHJpdmVyX2RhdGEgPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJlbW92ZShkZXYgPSAweCVwKSBkZXYtPmRldi5kcml2ZXJfZGF0YSA9IDB4JXBcbiIsIGRldiwgZGV2LT5kZXYuZHJpdmVyX2RhdGEpOworCQlyZXR1cm47CisJfQorCWFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWRldi0+ZGV2LmRyaXZlcl9kYXRhOworCXByaW50ayhLRVJOX0RFQlVHICJyZW1vdmUoZGV2ID0gMHglcCkgd2hlcmUgZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAweCVwXG4iLCBkZXYsIGFwZSk7CisJaWYgKGFwZS0+cGNpX2RldiAhPSBkZXYpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImRldi0+ZGV2LmRyaXZlcl9kYXRhLT5wY2lfZGV2ICgweCUwOGx4KSAhPSBkZXYgKDB4JTA4bHgpXG4iLAorCQkodW5zaWduZWQgbG9uZylhcGUtPnBjaV9kZXYsICh1bnNpZ25lZCBsb25nKWRldik7CisJfQorCS8qIHJlbW92ZSBjaGFyYWN0ZXIgZGV2aWNlICovCisjaWYgQUxUUENJRUNIRE1BX0NERVYKKwlzZ19leGl0KGFwZSk7CisjZW5kaWYKKworCWlmIChhcGUtPnRhYmxlX3ZpcnQpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCBBUEVfQ0hETUFfVEFCTEVfU0laRSwgYXBlLT50YWJsZV92aXJ0LCBhcGUtPnRhYmxlX2J1cyk7CisKKwkvKiBmcmVlIElSUQorCSAqIEBzZWUgTEREMyBwYWdlIDI3OQorCSAqLworCWlmIChhcGUtPmlycV9saW5lID49IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkZyZWVpbmcgSVJRICMlZCBmb3IgZGV2X2lkIDB4JTA4bHguXG4iLAorCQlhcGUtPmlycV9saW5lLCAodW5zaWduZWQgbG9uZylhcGUpOworCQlmcmVlX2lycShhcGUtPmlycV9saW5lLCAodm9pZCAqKWFwZSk7CisJfQorCS8qIE1TSSB3YXMgZW5hYmxlZD8gKi8KKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkgeworCQkvKiBEaXNhYmxlIE1TSSBAc2VlIERvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dCAqLworCQlwY2lfZGlzYWJsZV9tc2koZGV2KTsKKwkJYXBlLT5tc2lfZW5hYmxlZCA9IDA7CisJfQorCS8qIHVubWFwIHRoZSBCQVJzICovCisJdW5tYXBfYmFycyhhcGUsIGRldik7CisJaWYgKCFhcGUtPmluX3VzZSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJaWYgKGFwZS0+Z290X3JlZ2lvbnMpCisJCS8qIHRvIGJlIGNhbGxlZCBhZnRlciBkZXZpY2UgZGlzYWJsZSAqLworCQlwY2lfcmVsZWFzZV9yZWdpb25zKGRldik7Cit9CisKKyNpZiBBTFRQQ0lFQ0hETUFfQ0RFVgorCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBnb2VzIGZyb20gdW51c2VkIHRvIHVzZWQuCisgKi8KK3N0YXRpYyBpbnQgc2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYXBlX2RldiAqYXBlOworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJfb3BlbigpXG4iKTsKKwkvKiBwb2ludGVyIHRvIGNvbnRhaW5pbmcgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIGNoYXJhY3RlciBkZXZpY2UgaW5vZGUgKi8KKwlhcGUgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2Rldiwgc3RydWN0IGFwZV9kZXYsIGNkZXYpOworCS8qIGNyZWF0ZSBhIHJlZmVyZW5jZSB0byBvdXIgZGV2aWNlIHN0YXRlIGluIHRoZSBvcGVuZWQgZmlsZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGFwZTsKKwkvKiBjcmVhdGUgdmlydHVhbCBtZW1vcnkgbWFwcGVyICovCisJYXBlLT5zZ20gPSBzZ19jcmVhdGVfbWFwcGVyKE1BWF9DSERNQV9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ29lcyBmcm9tIHVzZWQgdG8gdW51c2VkLgorICovCitzdGF0aWMgaW50IHNnX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIGZldGNoIGRldmljZSBzcGVjaWZpYyBkYXRhIHN0b3JlZCBlYXJsaWVyIGR1cmluZyBvcGVuICovCisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiX2Nsb3NlKClcbiIpOworCS8qIGRlc3Ryb3kgdmlydHVhbCBtZW1vcnkgbWFwcGVyICovCisJc2dfZGVzdHJveV9tYXBwZXIoYXBlLT5zZ20pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCS8qIGZldGNoIGRldmljZSBzcGVjaWZpYyBkYXRhIHN0b3JlZCBlYXJsaWVyIGR1cmluZyBvcGVuICovCisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkodm9pZClhcGU7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIl9yZWFkKGJ1Zj0weCVwLCBjb3VudD0lbGxkLCBwb3M9JWxsdSlcbiIsIGJ1ZiwgKHM2NCljb3VudCwgKHU2NCkqcG9zKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIHNnX3dyaXRlKCkgLSBXcml0ZSB0byB0aGUgZGV2aWNlCisgKgorICogQGJ1ZiB1c2Vyc3BhY2UgYnVmZmVyCisgKiBAY291bnQgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB1c2Vyc3BhY2UgYnVmZmVyCisgKgorICogSXRlcmF0ZSBvdmVyIHRoZSB1c2Vyc3BhY2UgYnVmZmVyLCB0YWtpbmcgYXQgbW9zdCAyNTUgKiBQQUdFX1NJWkUgYnl0ZXMgZm9yCisgKiBlYWNoIERNQSB0cmFuc2Zlci4KKyAqICAgRm9yIGVhY2ggdHJhbnNmZXIsIGdldCB0aGUgdXNlciBwYWdlcywgYnVpbGQgYSBzZ2xpc3QsIG1hcCwgYnVpbGQgYQorICogICBkZXNjcmlwdG9yIHRhYmxlLiBzdWJtaXQgdGhlIHRyYW5zZmVyLiB3YWl0IGZvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqICAgdG8gd2FrZSB1cyBvbiBjb21wbGV0aW9uLgorICovCitzdGF0aWMgc3NpemVfdCBzZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlpbnQgaHduZW50cywgdGVudHM7CisJc2l6ZV90IHRyYW5zZmVyX2xlbiwgcmVtYWluaW5nID0gY291bnQsIGRvbmUgPSAwOworCXU2NCB0cmFuc2Zlcl9hZGRyID0gKHU2NClidWY7CisJLyogZmV0Y2ggZGV2aWNlIHNwZWNpZmljIGRhdGEgc3RvcmVkIGVhcmxpZXIgZHVyaW5nIG9wZW4gKi8KKwlzdHJ1Y3QgYXBlX2RldiAqYXBlID0gKHN0cnVjdCBhcGVfZGV2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJfd3JpdGUoYnVmPTB4JXAsIGNvdW50PSVsbGQsIHBvcz0lbGx1KVxuIiwKKwkJYnVmLCAoczY0KWNvdW50LCAodTY0KSpwb3MpOworCS8qIFRPRE8gdHJhbnNmZXIgYm91bmRhcmllcyBhdCBQQUdFX1NJWkUgZ3JhbnVsYXJpdHkgKi8KKwl3aGlsZSAocmVtYWluaW5nID4gMCkKKwl7CisJCS8qIGxpbWl0IERNQSB0cmFuc2ZlciBzaXplICovCisJCXRyYW5zZmVyX2xlbiA9IChyZW1haW5pbmcgPCBBUEVfQ0hETUFfTUFYX1RSQU5TRkVSX0xFTik/IHJlbWFpbmluZzoKKwkJCUFQRV9DSERNQV9NQVhfVFJBTlNGRVJfTEVOOworCQkvKiBnZXQgYWxsIHVzZXIgc3BhY2UgYnVmZmVyIHBhZ2VzIGFuZCBjcmVhdGUgYSBzY2F0dGVyZ2F0aGVyIGxpc3QgKi8KKwkJc2dtX21hcF91c2VyX3BhZ2VzKGFwZS0+c2dtLCB0cmFuc2Zlcl9hZGRyLCB0cmFuc2Zlcl9sZW4sIDAvKnJlYWQgZnJvbSB1c2Vyc3BhY2UqLyk7CisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJtYXBwZWRfcGFnZXM9JWRcbiIsIGFwZS0+c2dtLT5tYXBwZWRfcGFnZXMpOworCQkvKiBtYXAgYWxsIGVudHJpZXMgaW4gdGhlIHNjYXR0ZXJnYXRoZXIgbGlzdCAqLworCQlod25lbnRzID0gcGNpX21hcF9zZyhhcGUtPnBjaV9kZXYsIGFwZS0+c2dtLT5zZ2wsIGFwZS0+c2dtLT5tYXBwZWRfcGFnZXMsIERNQV9UT19ERVZJQ0UpOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiaHduZW50cz0lZFxuIiwgaHduZW50cyk7CisJCS8qIGJ1aWxkIGRldmljZSBkZXNjcmlwdG9yIHRhYmxlcyBhbmQgc3VibWl0IHRoZW0gdG8gdGhlIERNQSBlbmdpbmUgKi8KKwkJdGVudHMgPSBhcGVfc2dfdG9fY2hkbWFfdGFibGUoYXBlLT5zZ20tPnNnbCwgaHduZW50cywgMCwgJmFwZS0+dGFibGVfdmlydC0+ZGVzY1swXSwgNDA5Nik7CisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJ0ZW50cz0lZFxuIiwgaHduZW50cyk7CisjaWYgMAorCQl3aGlsZSAodGFibGVzKSB7CisJCQkvKiBUT0RPIGJ1aWxkIHRhYmxlICovCisJCQkvKiBUT0RPIHN1Ym1pdCB0YWJsZSB0byB0aGUgZGV2aWNlICovCisJCQkvKiBpZiBlbmdpbmUgc3RvcHBlZCBhbmQgdW5maW5pc2hlZCB3b3JrIHRoZW4gc3RhcnQgZW5naW5lICovCisJCX0KKwkJcHV0IG91cnNlbHZlcyBvbiB3YWl0IHF1ZXVlCisjZW5kaWYKKworCQlkbWFfdW5tYXBfc2coTlVMTCwgYXBlLT5zZ20tPnNnbCwgYXBlLT5zZ20tPm1hcHBlZF9wYWdlcywgRE1BX1RPX0RFVklDRSk7CisJCS8qIGRpcnR5IGFuZCBmcmVlIHRoZSBwYWdlcyAqLworCQlzZ21fdW5tYXBfdXNlcl9wYWdlcyhhcGUtPnNnbSwgMS8qZGlydGllZCovKTsKKwkJLyogYm9vayBrZWVwaW5nICovCisJCXRyYW5zZmVyX2FkZHIgKz0gdHJhbnNmZXJfbGVuOworCQlyZW1haW5pbmcgLT0gdHJhbnNmZXJfbGVuOworCQlkb25lICs9IHRyYW5zZmVyX2xlbjsKKwl9CisJcmV0dXJuIGRvbmU7Cit9CisKKy8qCisgKiBjaGFyYWN0ZXIgZGV2aWNlIGZpbGUgb3BlcmF0aW9ucworICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZ19mb3BzID0geworICAub3duZXIgPSBUSElTX01PRFVMRSwKKyAgLm9wZW4gPSBzZ19vcGVuLAorICAucmVsZWFzZSA9IHNnX2Nsb3NlLAorICAucmVhZCA9IHNnX3JlYWQsCisgIC53cml0ZSA9IHNnX3dyaXRlLAorfTsKKworLyogc2dfaW5pdCgpIC0gSW5pdGlhbGl6ZSBjaGFyYWN0ZXIgZGV2aWNlCisgKgorICogWFhYIFNob3VsZCBpZGVhbGx5IGJlIHRpZWQgdG8gdGhlIGRldmljZSwgb24gZGV2aWNlIHByb2JlLCBub3QgbW9kdWxlIGluaXQuCisgKi8KK3N0YXRpYyBpbnQgc2dfaW5pdChzdHJ1Y3QgYXBlX2RldiAqYXBlKQoreworCWludCByYzsKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHNnX2luaXQoKVxuIik7CisJLyogYWxsb2NhdGUgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY2hhcmFjdGVyIGRldmljZSBub2RlICovCisJcmMgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZhcGUtPmNkZXZubywgMC8qcmVxdWVzdGVkIG1pbm9yKi8sIDEvKmNvdW50Ki8sIERSVl9OQU1FKTsKKwkvKiBhbGxvY2F0aW9uIGZhaWxlZD8gKi8KKwlpZiAocmMgPCAwKSB7CisJCXByaW50aygiYWxsb2NfY2hyZGV2X3JlZ2lvbigpID0gJWRcbiIsIHJjKTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKwkvKiBjb3VwbGUgdGhlIGRldmljZSBmaWxlIG9wZXJhdGlvbnMgdG8gdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KKwljZGV2X2luaXQoJmFwZS0+Y2RldiwgJnNnX2ZvcHMpOworCWFwZS0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCS8qIGJyaW5nIGNoYXJhY3RlciBkZXZpY2UgbGl2ZSAqLworCXJjID0gY2Rldl9hZGQoJmFwZS0+Y2RldiwgYXBlLT5jZGV2bm8sIDEvKmNvdW50Ki8pOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKCJjZGV2X2FkZCgpID0gJWRcbiIsIHJjKTsKKwkJZ290byBmYWlsX2FkZDsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgImFsdHBjaWVjaGRtYSA9ICVkOiVkXG4iLCBNQUpPUihhcGUtPmNkZXZubyksIE1JTk9SKGFwZS0+Y2Rldm5vKSk7CisJcmV0dXJuIDA7CitmYWlsX2FkZDoKKwkvKiBmcmVlIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY2hhcmFjdGVyIGRldmljZSBub2RlICovCisgICAgdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGFwZS0+Y2Rldm5vLCAxLypjb3VudCovKTsKK2ZhaWxfYWxsb2M6CisJcmV0dXJuIC0xOworfQorCisvKiBzZ19leGl0KCkgLSBDbGVhbnVwIGNoYXJhY3RlciBkZXZpY2UKKyAqCisgKiBYWFggU2hvdWxkIGlkZWFsbHkgYmUgdGllZCB0byB0aGUgZGV2aWNlLCBvbiBkZXZpY2UgcmVtb3ZlLCBub3QgbW9kdWxlIGV4aXQuCisgKi8KKworc3RhdGljIHZvaWQgc2dfZXhpdChzdHJ1Y3QgYXBlX2RldiAqYXBlKQoreworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgc2dfZXhpdCgpXG4iKTsKKwkvKiByZW1vdmUgdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KKwljZGV2X2RlbCgmYXBlLT5jZGV2KTsKKwkvKiBmcmVlIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY2hhcmFjdGVyIGRldmljZSBub2RlICovCisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGFwZS0+Y2Rldm5vLCAxLypjb3VudCovKTsKK30KKworI2VuZGlmIC8qIEFMVFBDSUVDSERNQV9DREVWICovCisKKy8qIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIHRoZSBQQ0kga2VybmVsIHN1YiBzeXN0ZW0KKyAqIEBzZWUgTEREMyBwYWdlIDMxMQorICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IGlkcywKKwkucHJvYmUgPSBwcm9iZSwKKwkucmVtb3ZlID0gcmVtb3ZlLAorCS8qIHJlc3VtZSwgc3VzcGVuZCBhcmUgb3B0aW9uYWwgKi8KK307CisKKy8qKgorICogYWx0ZXJhcGNpZWNoZG1hX2luaXQoKSAtIE1vZHVsZSBpbml0aWFsaXphdGlvbiwgcmVnaXN0ZXJzIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFsdGVyYXBjaWVjaGRtYV9pbml0KHZvaWQpCit7CisgIGludCByYyA9IDA7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiBpbml0KCksIGJ1aWx0IGF0ICIgX19EQVRFX18gIiAiIF9fVElNRV9fICJcbiIpOworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFBDSSBidXMgZHJpdmVyICovCisJcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwY2lfZHJpdmVyKTsKKwlpZiAocmMgPCAwKQorCSAgcmV0dXJuIHJjOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFsdGVyYXBjaWVjaGRtYV9pbml0KCkgLSBNb2R1bGUgY2xlYW51cCwgdW5yZWdpc3RlcnMgZGV2aWNlcy4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGFsdGVyYXBjaWVjaGRtYV9leGl0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiBleGl0KCksIGJ1aWx0IGF0ICIgX19EQVRFX18gIiAiIF9fVElNRV9fICJcbiIpOworCS8qIHVucmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgUENJIGJ1cyBkcml2ZXIgKi8KKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjaV9kcml2ZXIpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGFsdGVyYXBjaWVjaGRtYV9pbml0KTsKK21vZHVsZV9leGl0KGFsdGVyYXBjaWVjaGRtYV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5OTZkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKQEAgLTAsMCArMSw4NiBAQAorbWVudSAiQW5kcm9pZCIKKworY29uZmlnIEFORFJPSUQKKwlib29sICJBbmRyb2lkIERyaXZlcnMiCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHZhcmlvdXMgZHJpdmVycyBuZWVkZWQgb24gdGhlIEFuZHJvaWQgcGxhdGZvcm0KKworY29uZmlnIEFORFJPSURfQklOREVSX0lQQworCWJvb2wgIkFuZHJvaWQgQmluZGVyIElQQyBEcml2ZXIiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBTkRST0lEX0xPR0dFUgorCXRyaXN0YXRlICJBbmRyb2lkIGxvZyBkcml2ZXIiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFCisJYm9vbCAiQW5kcm9pZCBSQU0gYnVmZmVyIGNvbnNvbGUiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VOQUJMRV9WRVJCT1NFCisJYm9vbCAiRW5hYmxlIHZlcmJvc2UgY29uc29sZSBtZXNzYWdlcyBvbiBBbmRyb2lkIFJBTSBjb25zb2xlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRQorCittZW51Y29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgorCWJvb2wgIkFuZHJvaWQgUkFNIENvbnNvbGUgRW5hYmxlIGVycm9yIGNvcnJlY3Rpb24iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFCisJc2VsZWN0IFJFRURfU09MT01PTgorCXNlbGVjdCBSRUVEX1NPTE9NT05fRU5DOAorCXNlbGVjdCBSRUVEX1NPTE9NT05fREVDOAorCitpZiBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9EQVRBX1NJWkUKKwlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgRGF0YSBkYXRhIHNpemUiCisJZGVmYXVsdCAxMjgKKwloZWxwCisJICBNdXN0IGJlIGEgcG93ZXIgb2YgMi4KKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9FQ0NfU0laRQorCWludCAiQW5kcm9pZCBSQU0gQ29uc29sZSBFQ0Mgc2l6ZSIKKwlkZWZhdWx0IDE2CisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUKKwlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgU3ltYm9sIHNpemUiCisJZGVmYXVsdCA4CisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fUE9MWU5PTUlBTAorCWhleCAiQW5kcm9pZCBSQU0gQ29uc29sZSBQb2x5bm9taWFsIgorCWRlZmF1bHQgMHgxOSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNCkKKwlkZWZhdWx0IDB4MjkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDUpCisJZGVmYXVsdCAweDYxIGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA2KQorCWRlZmF1bHQgMHg4OSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNykKKwlkZWZhdWx0IDB4MTFkIGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA4KQorCitlbmRpZiAjIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCisJYm9vbCAiU3RhcnQgQW5kcm9pZCBSQU0gY29uc29sZSBlYXJseSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEUKKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfQUREUgorCWhleCAiQW5kcm9pZCBSQU0gY29uc29sZSB2aXJ0dWFsIGFkZHJlc3MiCisJZGVmYXVsdCAwCisJZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRQorCWhleCAiQW5kcm9pZCBSQU0gY29uc29sZSBidWZmZXIgc2l6ZSIKKwlkZWZhdWx0IDAKKwlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorCitjb25maWcgQU5EUk9JRF9USU1FRF9HUElPCisJdHJpc3RhdGUgIkFuZHJvaWQgdGltZWQgZ3BpbyBkcml2ZXIiCisJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KKwlkZWZhdWx0IG4KKworY29uZmlnIEFORFJPSURfTE9XX01FTU9SWV9LSUxMRVIKKwlib29sICJBbmRyb2lkIExvdyBNZW1vcnkgS2lsbGVyIgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIFJlZ2lzdGVyIHByb2Nlc3NlcyB0byBiZSBraWxsZWQgd2hlbiBtZW1vcnkgaXMgbG93CisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyMDlkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorb2JqLSQoQ09ORklHX0FORFJPSURfQklOREVSX0lQQykJKz0gYmluZGVyLm8KK29iai0kKENPTkZJR19BTkRST0lEX0xPR0dFUikJCSs9IGxvZ2dlci5vCitvYmotJChDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRSkJKz0gcmFtX2NvbnNvbGUubworb2JqLSQoQ09ORklHX0FORFJPSURfVElNRURfR1BJTykJKz0gdGltZWRfZ3Bpby5vCitvYmotJChDT05GSUdfQU5EUk9JRF9MT1dfTUVNT1JZX0tJTExFUikJKz0gbG93bWVtb3J5a2lsbGVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OWM1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9UT0RPCkBAIC0wLDAgKzEsMTAgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCisJLSBzcGFyc2UgZml4ZXMKKwktIHJlbmFtZSBmaWxlcyB0byBiZSBub3Qgc28gImdlbmVyaWMiCisJLSBtYWtlIHN1cmUgdGhpbmdzIGJ1aWxkIGFzIG1vZHVsZXMgcHJvcGVybHkKKwktIGFkZCBwcm9wZXIgYXJjaCBkZXBlbmRhbmNpZXMgYXMgbmVlZGVkCisJLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgc2FuZQorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzoKK0JyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRjZWFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMKQEAgLTAsMCArMSwzNTAzIEBACisvKiBiaW5kZXIuYworICoKKyAqIEFuZHJvaWQgSVBDIFN1YnN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSAiYmluZGVyLmgiCisKK3N0YXRpYyBERUZJTkVfTVVURVgoYmluZGVyX2xvY2spOworc3RhdGljIEhMSVNUX0hFQUQoYmluZGVyX3Byb2NzKTsKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9jb250ZXh0X21ncl9ub2RlOworc3RhdGljIHVpZF90IGJpbmRlcl9jb250ZXh0X21ncl91aWQgPSAtMTsKK3N0YXRpYyBpbnQgYmluZGVyX2xhc3RfaWQ7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdDsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jOworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGJpbmRlcl9kZWFkX25vZGVzOworCitzdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2NfcHJvYygKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CisKKy8qIFRoaXMgaXMgb25seSBkZWZpbmVkIGluIGluY2x1ZGUvYXNtLWFybS9zaXplcy5oICovCisjaWZuZGVmIFNaXzFLCisjZGVmaW5lIFNaXzFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwCisjZW5kaWYKKworI2lmbmRlZiBTWl80TQorI2RlZmluZSBTWl80TSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgX19pMzg2X18KKyNkZWZpbmUgRk9SQklEREVOX01NQVBfRkxBR1MgICAgICAgICAgICAgICAgKFZNX1dSSVRFIHwgVk1fRVhFQykKKyNlbHNlCisjZGVmaW5lIEZPUkJJRERFTl9NTUFQX0ZMQUdTICAgICAgICAgICAgICAgIChWTV9XUklURSkKKyNlbmRpZgorCisjZGVmaW5lIEJJTkRFUl9TTUFMTF9CVUZfU0laRSAoUEFHRV9TSVpFICogNjQpCisKK2VudW0geworCUJJTkRFUl9ERUJVR19VU0VSX0VSUk9SICAgICAgICAgICAgID0gMVUgPDwgMCwKKwlCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OICAgICA9IDFVIDw8IDEsCisJQklOREVSX0RFQlVHX0RFQURfVFJBTlNBQ1RJT04gICAgICAgPSAxVSA8PCAyLAorCUJJTkRFUl9ERUJVR19PUEVOX0NMT1NFICAgICAgICAgICAgID0gMVUgPDwgMywKKwlCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIgICAgICAgICAgICA9IDFVIDw8IDQsCisJQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTiAgICAgPSAxVSA8PCA1LAorCUJJTkRFUl9ERUJVR19SRUFEX1dSSVRFICAgICAgICAgICAgID0gMVUgPDwgNiwKKwlCSU5ERVJfREVCVUdfVVNFUl9SRUZTICAgICAgICAgICAgICA9IDFVIDw8IDcsCisJQklOREVSX0RFQlVHX1RIUkVBRFMgICAgICAgICAgICAgICAgPSAxVSA8PCA4LAorCUJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiAgICAgICAgICAgID0gMVUgPDwgOSwKKwlCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT05fQ09NUExFVEUgICA9IDFVIDw8IDEwLAorCUJJTkRFUl9ERUJVR19GUkVFX0JVRkZFUiAgICAgICAgICAgID0gMVUgPDwgMTEsCisJQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMgICAgICAgICAgPSAxVSA8PCAxMiwKKwlCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DICAgICAgICAgICA9IDFVIDw8IDEzLAorCUJJTkRFUl9ERUJVR19QUklPUklUWV9DQVAgICAgICAgICAgID0gMVUgPDwgMTQsCisJQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQ19BU1lOQyAgICAgPSAxVSA8PCAxNSwKK307CitzdGF0aWMgdWludDMyX3QgYmluZGVyX2RlYnVnX21hc2sgPSBCSU5ERVJfREVCVUdfVVNFUl9FUlJPUiB8CisJQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiB8IEJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX21hc2ssIGJpbmRlcl9kZWJ1Z19tYXNrLCB1aW50LCBTX0lXVVNSIHwgU19JUlVHTyk7CitzdGF0aWMgaW50IGJpbmRlcl9kZWJ1Z19ub19sb2NrOworbW9kdWxlX3BhcmFtX25hbWVkKHByb2Nfbm9fbG9jaywgYmluZGVyX2RlYnVnX25vX2xvY2ssIGJvb2wsIFNfSVdVU1IgfCBTX0lSVUdPKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChiaW5kZXJfdXNlcl9lcnJvcl93YWl0KTsKK3N0YXRpYyBpbnQgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvcjsKK3N0YXRpYyBpbnQgYmluZGVyX3NldF9zdG9wX29uX3VzZXJfZXJyb3IoCisJY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHBhcmFtX3NldF9pbnQodmFsLCBrcCk7CisJaWYgKGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPCAyKQorCQl3YWtlX3VwKCZiaW5kZXJfdXNlcl9lcnJvcl93YWl0KTsKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX3BhcmFtX2NhbGwoc3RvcF9vbl91c2VyX2Vycm9yLCBiaW5kZXJfc2V0X3N0b3Bfb25fdXNlcl9lcnJvciwKKwlwYXJhbV9nZXRfaW50LCAmYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciwgU19JV1VTUiB8IFNfSVJVR08pOworCisjZGVmaW5lIGJpbmRlcl91c2VyX2Vycm9yKHguLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1VTRVJfRVJST1IpIFwKKwkJCXByaW50ayhLRVJOX0lORk8geCk7IFwKKwkJaWYgKGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IpIFwKKwkJCWJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPSAyOyBcCisJfSB3aGlsZSAoMCkKKworZW51bSB7CisJQklOREVSX1NUQVRfUFJPQywKKwlCSU5ERVJfU1RBVF9USFJFQUQsCisJQklOREVSX1NUQVRfTk9ERSwKKwlCSU5ERVJfU1RBVF9SRUYsCisJQklOREVSX1NUQVRfREVBVEgsCisJQklOREVSX1NUQVRfVFJBTlNBQ1RJT04sCisJQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEUsCisJQklOREVSX1NUQVRfQ09VTlQKK307CisKK3N0cnVjdCBiaW5kZXJfc3RhdHMgeworCWludCBicltfSU9DX05SKEJSX0ZBSUxFRF9SRVBMWSkgKyAxXTsKKwlpbnQgYmNbX0lPQ19OUihCQ19ERUFEX0JJTkRFUl9ET05FKSArIDFdOworCWludCBvYmpfY3JlYXRlZFtCSU5ERVJfU1RBVF9DT1VOVF07CisJaW50IG9ial9kZWxldGVkW0JJTkRFUl9TVEFUX0NPVU5UXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX3N0YXRzIGJpbmRlcl9zdGF0czsKKworc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgeworCWludCBkZWJ1Z19pZDsKKwlpbnQgY2FsbF90eXBlOworCWludCBmcm9tX3Byb2M7CisJaW50IGZyb21fdGhyZWFkOworCWludCB0YXJnZXRfaGFuZGxlOworCWludCB0b19wcm9jOworCWludCB0b190aHJlYWQ7CisJaW50IHRvX25vZGU7CisJaW50IGRhdGFfc2l6ZTsKKwlpbnQgb2Zmc2V0c19zaXplOworfTsKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nIHsKKwlpbnQgbmV4dDsKKwlpbnQgZnVsbDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSBlbnRyeVszMl07Cit9Oworc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2cgYmluZGVyX3RyYW5zYWN0aW9uX2xvZzsKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nIGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZmFpbGVkOworCitzdGF0aWMgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKAorCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nICpsb2cpCit7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmU7CisJZSA9ICZsb2ctPmVudHJ5W2xvZy0+bmV4dF07CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWxvZy0+bmV4dCsrOworCWlmIChsb2ctPm5leHQgPT0gQVJSQVlfU0laRShsb2ctPmVudHJ5KSkgeworCQlsb2ctPm5leHQgPSAwOworCQlsb2ctPmZ1bGwgPSAxOworCX0KKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGJpbmRlcl93b3JrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCWVudW0geworCQlCSU5ERVJfV09SS19UUkFOU0FDVElPTiA9IDEsCisJCUJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFLAorCQlCSU5ERVJfV09SS19OT0RFLAorCQlCSU5ERVJfV09SS19ERUFEX0JJTkRFUiwKKwkJQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSLAorCQlCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04sCisJfSB0eXBlOworfTsKKworc3RydWN0IGJpbmRlcl9ub2RlIHsKKwlpbnQgZGVidWdfaWQ7CisJc3RydWN0IGJpbmRlcl93b3JrIHdvcms7CisJdW5pb24geworCQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZWFkX25vZGU7CisJfTsKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGhsaXN0X2hlYWQgcmVmczsKKwlpbnQgaW50ZXJuYWxfc3Ryb25nX3JlZnM7CisJaW50IGxvY2FsX3dlYWtfcmVmczsKKwlpbnQgbG9jYWxfc3Ryb25nX3JlZnM7CisJdm9pZCBfX3VzZXIgKnB0cjsKKwl2b2lkIF9fdXNlciAqY29va2llOworCXVuc2lnbmVkIGhhc19zdHJvbmdfcmVmIDogMTsKKwl1bnNpZ25lZCBwZW5kaW5nX3N0cm9uZ19yZWYgOiAxOworCXVuc2lnbmVkIGhhc193ZWFrX3JlZiA6IDE7CisJdW5zaWduZWQgcGVuZGluZ193ZWFrX3JlZiA6IDE7CisJdW5zaWduZWQgaGFzX2FzeW5jX3RyYW5zYWN0aW9uIDogMTsKKwl1bnNpZ25lZCBhY2NlcHRfZmRzIDogMTsKKwlpbnQgbWluX3ByaW9yaXR5IDogODsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFzeW5jX3RvZG87Cit9OworCitzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCB7CisJc3RydWN0IGJpbmRlcl93b3JrIHdvcms7CisJdm9pZCBfX3VzZXIgKmNvb2tpZTsKK307CisKK3N0cnVjdCBiaW5kZXJfcmVmIHsKKwkvKiBMb29rdXBzIG5lZWRlZDogKi8KKwkvKiAgIG5vZGUgKyBwcm9jID0+IHJlZiAodHJhbnNhY3Rpb24pICovCisJLyogICBkZXNjICsgcHJvYyA9PiByZWYgKHRyYW5zYWN0aW9uLCBpbmMvZGVjIHJlZikgKi8KKwkvKiAgIG5vZGUgPT4gcmVmcyArIHByb2NzIChwcm9jIGV4aXQpICovCisJaW50IGRlYnVnX2lkOworCXN0cnVjdCByYl9ub2RlIHJiX25vZGVfZGVzYzsKKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlX25vZGU7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZV9lbnRyeTsKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOworCXVpbnQzMl90IGRlc2M7CisJaW50IHN0cm9uZzsKKwlpbnQgd2VhazsKKwlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7Cit9OworCitzdHJ1Y3QgYmluZGVyX2J1ZmZlciB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsgLyogZnJlZSBhbmQgYWxsb2NhdGVkIGVudHJpZXMgYnkgYWRkZXNzcyAqLworCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7IC8qIGZyZWUgZW50cnkgYnkgc2l6ZSBvciBhbGxvY2F0ZWQgZW50cnkgKi8KKwkJCQkvKiBieSBhZGRyZXNzICovCisJdW5zaWduZWQgZnJlZSA6IDE7CisJdW5zaWduZWQgYWxsb3dfdXNlcl9mcmVlIDogMTsKKwl1bnNpZ25lZCBhc3luY190cmFuc2FjdGlvbiA6IDE7CisJdW5zaWduZWQgZGVidWdfaWQgOiAyOTsKKworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOworCisJc3RydWN0IGJpbmRlcl9ub2RlICp0YXJnZXRfbm9kZTsKKwlzaXplX3QgZGF0YV9zaXplOworCXNpemVfdCBvZmZzZXRzX3NpemU7CisJdWludDhfdCBkYXRhWzBdOworfTsKKworc3RydWN0IGJpbmRlcl9wcm9jIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBwcm9jX25vZGU7CisJc3RydWN0IHJiX3Jvb3QgdGhyZWFkczsKKwlzdHJ1Y3QgcmJfcm9vdCBub2RlczsKKwlzdHJ1Y3QgcmJfcm9vdCByZWZzX2J5X2Rlc2M7CisJc3RydWN0IHJiX3Jvb3QgcmVmc19ieV9ub2RlOworCWludCBwaWQ7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJdm9pZCAqYnVmZmVyOworCXNpemVfdCB1c2VyX2J1ZmZlcl9vZmZzZXQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1ZmZlcnM7CisJc3RydWN0IHJiX3Jvb3QgZnJlZV9idWZmZXJzOworCXN0cnVjdCByYl9yb290IGFsbG9jYXRlZF9idWZmZXJzOworCXNpemVfdCBmcmVlX2FzeW5jX3NwYWNlOworCisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJdWludDMyX3QgYnVmZmVyX2ZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCB0b2RvOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGl2ZXJlZF9kZWF0aDsKKwlpbnQgbWF4X3RocmVhZHM7CisJaW50IHJlcXVlc3RlZF90aHJlYWRzOworCWludCByZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkOworCWludCByZWFkeV90aHJlYWRzOworCWxvbmcgZGVmYXVsdF9wcmlvcml0eTsKK307CisKK2VudW0geworCUJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCAgPSAweDAxLAorCUJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCAgICAgPSAweDAyLAorCUJJTkRFUl9MT09QRVJfU1RBVEVfRVhJVEVEICAgICAgPSAweDA0LAorCUJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRCAgICAgPSAweDA4LAorCUJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORyAgICAgPSAweDEwLAorCUJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk4gPSAweDIwCit9OworCitzdHJ1Y3QgYmluZGVyX3RocmVhZCB7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7CisJaW50IHBpZDsKKwlpbnQgbG9vcGVyOworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uX3N0YWNrOworCXN0cnVjdCBsaXN0X2hlYWQgdG9kbzsKKwl1aW50MzJfdCByZXR1cm5fZXJyb3I7IC8qIFdyaXRlIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUgaW4gcmVhZCBidWYgKi8KKwl1aW50MzJfdCByZXR1cm5fZXJyb3IyOyAvKiBXcml0ZSBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlIGluIHJlYWQgKi8KKwkJLyogYnVmZmVyLiBVc2VkIHdoZW4gc2VuZGluZyBhIHJlcGx5IHRvIGEgZGVhZCBwcm9jZXNzIHRoYXQgKi8KKwkJLyogd2UgYXJlIGFsc28gd2FpdGluZyBvbiAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsKK307CisKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24geworCWludCBkZWJ1Z19pZDsKKwlzdHJ1Y3QgYmluZGVyX3dvcmsgd29yazsKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqZnJvbTsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpmcm9tX3BhcmVudDsKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnRvX3Byb2M7CisJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRvX3RocmVhZDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0b19wYXJlbnQ7CisJdW5zaWduZWQgbmVlZF9yZXBseSA6IDE7CisJLyp1bnNpZ25lZCBpc19kZWFkIDogMTsqLyAvKiBub3QgdXNlZCBhdCB0aGUgbW9tZW50ICovCisKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCXVuc2lnbmVkIGludAljb2RlOworCXVuc2lnbmVkIGludAlmbGFnczsKKwlsb25nCXByaW9yaXR5OworCWxvbmcJc2F2ZWRfcHJpb3JpdHk7CisJdWlkX3QJc2VuZGVyX2V1aWQ7Cit9OworCisvKgorICogY29waWVkIGZyb20gZ2V0X3VudXNlZF9mZF9mbGFncworICovCitpbnQgdGFza19nZXRfdW51c2VkX2ZkX2ZsYWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBnZXRfZmlsZXNfc3RydWN0KHRzayk7CisJaW50IGZkLCBlcnJvcjsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCXVuc2lnbmVkIGxvbmcgcmxpbV9jdXI7CisKKwlpZiAoZmlsZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FU1JDSDsKKworCWVycm9yID0gLUVNRklMRTsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCityZXBlYXQ6CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIGZkdC0+bWF4X2ZkcywKKwkJCQlmaWxlcy0+bmV4dF9mZCk7CisKKwkvKgorCSAqIE4uQi4gRm9yIGNsb25lIHRhc2tzIHNoYXJpbmcgYSBmaWxlcyBzdHJ1Y3R1cmUsIHRoaXMgdGVzdAorCSAqIHdpbGwgbGltaXQgdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IGNhbiBiZSBvcGVuZWQuCisJICovCisJcmN1X3JlYWRfbG9jaygpOworCWlmICh0c2stPnNpZ25hbCkKKwkJcmxpbV9jdXIgPSB0c2stPnNpZ25hbC0+cmxpbVtSTElNSVRfTk9GSUxFXS5ybGltX2N1cjsKKwllbHNlCisJCXJsaW1fY3VyID0gMDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAoZmQgPj0gcmxpbV9jdXIpCisJCWdvdG8gb3V0OworCisJLyogRG8gd2UgbmVlZCB0byBleHBhbmQgdGhlIGZkIGFycmF5IG9yIGZkIHNldD8gICovCisJZXJyb3IgPSBleHBhbmRfZmlsZXMoZmlsZXMsIGZkKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChlcnJvcikgeworCQkvKgorCQkgKiBJZiB3ZSBuZWVkZWQgdG8gZXhwYW5kIHRoZSBmcyBhcnJheSB3ZQorCQkgKiBtaWdodCBoYXZlIGJsb2NrZWQgLSB0cnkgYWdhaW4uCisJCSAqLworCQllcnJvciA9IC1FTUZJTEU7CisJCWdvdG8gcmVwZWF0OworCX0KKworCUZEX1NFVChmZCwgZmR0LT5vcGVuX2Zkcyk7CisJaWYgKGZsYWdzICYgT19DTE9FWEVDKQorCQlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJZWxzZQorCQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJZmlsZXMtPm5leHRfZmQgPSBmZCArIDE7CisjaWYgMQorCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChmZHQtPmZkW2ZkXSAhPSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImdldF91bnVzZWRfZmQ6IHNsb3QgJWQgbm90IE5VTEwhXG4iLCBmZCk7CisJCWZkdC0+ZmRbZmRdID0gTlVMTDsKKwl9CisjZW5kaWYKKwllcnJvciA9IGZkOworCitvdXQ6CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGNvcGllZCBmcm9tIGZkX2luc3RhbGwKKyAqLworc3RhdGljIHZvaWQgdGFza19mZF9pbnN0YWxsKAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0c2spOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisKKwlpZiAoZmlsZXMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlCVUdfT04oZmR0LT5mZFtmZF0gIT0gTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbZmRdLCBmaWxlKTsKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7Cit9CisKKy8qCisgKiBjb3BpZWQgZnJvbSBfX3B1dF91bnVzZWRfZmQgaW4gb3Blbi5jCisgKi8KK3N0YXRpYyB2b2lkIF9fcHV0X3VudXNlZF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgdW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlfX0ZEX0NMUihmZCwgZmR0LT5vcGVuX2Zkcyk7CisJaWYgKGZkIDwgZmlsZXMtPm5leHRfZmQpCisJCWZpbGVzLT5uZXh0X2ZkID0gZmQ7Cit9CisKKy8qCisgKiBjb3BpZWQgZnJvbSBzeXNfY2xvc2UKKyAqLworc3RhdGljIGxvbmcgdGFza19jbG9zZV9mZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0c2spOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisJaW50IHJldHZhbDsKKworCWlmIChmaWxlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVTUkNIOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlpZiAoZmQgPj0gZmR0LT5tYXhfZmRzKQorCQlnb3RvIG91dF91bmxvY2s7CisJZmlscCA9IGZkdC0+ZmRbZmRdOworCWlmICghZmlscCkKKwkJZ290byBvdXRfdW5sb2NrOworCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgTlVMTCk7CisJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCV9fcHV0X3VudXNlZF9mZChmaWxlcywgZmQpOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyZXR2YWwgPSBmaWxwX2Nsb3NlKGZpbHAsIGZpbGVzKTsKKworCS8qIGNhbid0IHJlc3RhcnQgY2xvc2Ugc3lzY2FsbCBiZWNhdXNlIGZpbGUgdGFibGUgZW50cnkgd2FzIGNsZWFyZWQgKi8KKwlpZiAodW5saWtlbHkocmV0dmFsID09IC1FUkVTVEFSVFNZUyB8fAorCQkgICAgIHJldHZhbCA9PSAtRVJFU1RBUlROT0lOVFIgfHwKKwkJICAgICByZXR2YWwgPT0gLUVSRVNUQVJUTk9IQU5EIHx8CisJCSAgICAgcmV0dmFsID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spKQorCQlyZXR2YWwgPSAtRUlOVFI7CisKKwlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwlyZXR1cm4gcmV0dmFsOworCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwlyZXR1cm4gLUVCQURGOworfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfc2V0X25pY2UobG9uZyBuaWNlKQoreworCWxvbmcgbWluX25pY2U7CisJaWYgKGNhbl9uaWNlKGN1cnJlbnQsIG5pY2UpKSB7CisJCXNldF91c2VyX25pY2UoY3VycmVudCwgbmljZSk7CisJCXJldHVybjsKKwl9CisJbWluX25pY2UgPSAyMCAtIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTklDRV0ucmxpbV9jdXI7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1BSSU9SSVRZX0NBUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogbmljZSB2YWx1ZSAlbGQgbm90IGFsbG93ZWQgdXNlICIKKwkJICAgICAgICIlbGQgaW5zdGVhZFxuIiwgY3VycmVudC0+cGlkLCBuaWNlLCBtaW5fbmljZSk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCBtaW5fbmljZSk7CisJaWYgKG1pbl9uaWNlIDwgMjApCisJCXJldHVybjsKKwliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBSTElNSVRfTklDRSBub3Qgc2V0XG4iLCBjdXJyZW50LT5waWQpOworfQorCitzdGF0aWMgc2l6ZV90IGJpbmRlcl9idWZmZXJfc2l6ZSgKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJaWYgKGxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKQorCQlyZXR1cm4gcHJvYy0+YnVmZmVyICsgcHJvYy0+YnVmZmVyX3NpemUgLSAodm9pZCAqKWJ1ZmZlci0+ZGF0YTsKKwllbHNlCisJCXJldHVybiAoc2l6ZV90KWxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAorCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KSAtIChzaXplX3QpYnVmZmVyLT5kYXRhOworfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKAorCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPmZyZWVfYnVmZmVycy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXNpemVfdCBuZXdfYnVmZmVyX3NpemU7CisKKwlCVUdfT04oIW5ld19idWZmZXItPmZyZWUpOworCisJbmV3X2J1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIG5ld19idWZmZXIpOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogYWRkIGZyZWUgYnVmZmVyLCBzaXplICV6ZCwgIgorCQkgICAgICAgImF0ICVwXG4iLCBwcm9jLT5waWQsIG5ld19idWZmZXJfc2l6ZSwgbmV3X2J1ZmZlcik7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWJ1ZmZlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlCVUdfT04oIWJ1ZmZlci0+ZnJlZSk7CisKKwkJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKKworCQlpZiAobmV3X2J1ZmZlcl9zaXplIDwgYnVmZmVyX3NpemUpCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCX0KKwlyYl9saW5rX25vZGUoJm5ld19idWZmZXItPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKK30KKworc3RhdGljIHZvaWQgYmluZGVyX2luc2VydF9hbGxvY2F0ZWRfYnVmZmVyKAorCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKKworCUJVR19PTihuZXdfYnVmZmVyLT5mcmVlKTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJYnVmZmVyID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCUJVR19PTihidWZmZXItPmZyZWUpOworCisJCWlmIChuZXdfYnVmZmVyIDwgYnVmZmVyKQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG5ld19idWZmZXIgPiBidWZmZXIpCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCUJVRygpOworCX0KKwlyYl9saW5rX25vZGUoJm5ld19idWZmZXItPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCAmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJpbmRlcl9idWZmZXJfbG9va3VwKAorCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdm9pZCBfX3VzZXIgKnVzZXJfcHRyKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMucmJfbm9kZTsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICprZXJuX3B0cjsKKworCWtlcm5fcHRyID0gdXNlcl9wdHIgLSBwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQKKwkJLSBvZmZzZXRvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZGF0YSk7CisKKwl3aGlsZSAobikgeworCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCUJVR19PTihidWZmZXItPmZyZWUpOworCisJCWlmIChrZXJuX3B0ciA8IGJ1ZmZlcikKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChrZXJuX3B0ciA+IGJ1ZmZlcikKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IGFsbG9jYXRlLAorCXZvaWQgKnN0YXJ0LCB2b2lkICplbmQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXZvaWQgKnBhZ2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHVzZXJfcGFnZV9hZGRyOworCXN0cnVjdCB2bV9zdHJ1Y3QgdG1wX2FyZWE7CisJc3RydWN0IHBhZ2UgKipwYWdlOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogJXMgcGFnZXMgJXAtJXBcbiIsCisJCSAgICAgICBwcm9jLT5waWQsIGFsbG9jYXRlID8gImFsbG9jYXRlIiA6ICJmcmVlIiwgc3RhcnQsIGVuZCk7CisKKwlpZiAoZW5kIDw9IHN0YXJ0KQorCQlyZXR1cm4gMDsKKworCWlmICh2bWEpCisJCW1tID0gTlVMTDsKKwllbHNlCisJCW1tID0gZ2V0X3Rhc2tfbW0ocHJvYy0+dHNrKTsKKworCWlmIChtbSkgeworCQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQl2bWEgPSBwcm9jLT52bWE7CisJfQorCisJaWYgKGFsbG9jYXRlID09IDApCisJCWdvdG8gZnJlZV9yYW5nZTsKKworCWlmICh2bWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkIHRvICIKKwkJICAgICAgICJtYXAgcGFnZXMgaW4gdXNlcnNwYWNlLCBubyB2bWFcbiIsIHByb2MtPnBpZCk7CisJCWdvdG8gZXJyX25vX3ZtYTsKKwl9CisKKwlmb3IgKHBhZ2VfYWRkciA9IHN0YXJ0OyBwYWdlX2FkZHIgPCBlbmQ7IHBhZ2VfYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJaW50IHJldDsKKwkJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5X3B0cjsKKwkJcGFnZSA9ICZwcm9jLT5wYWdlc1socGFnZV9hZGRyIC0gcHJvYy0+YnVmZmVyKSAvIFBBR0VfU0laRV07CisKKwkJQlVHX09OKCpwYWdlKTsKKwkJKnBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCpwYWdlID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBmYWlsZWQgIgorCQkJICAgICAgICJmb3IgcGFnZSBhdCAlcFxuIiwgcHJvYy0+cGlkLCBwYWdlX2FkZHIpOworCQkJZ290byBlcnJfYWxsb2NfcGFnZV9mYWlsZWQ7CisJCX0KKwkJdG1wX2FyZWEuYWRkciA9IHBhZ2VfYWRkcjsKKwkJdG1wX2FyZWEuc2l6ZSA9IFBBR0VfU0laRSArIFBBR0VfU0laRSAvKiBndWFyZCBwYWdlPyAqLzsKKwkJcGFnZV9hcnJheV9wdHIgPSBwYWdlOworCQlyZXQgPSBtYXBfdm1fYXJlYSgmdG1wX2FyZWEsIFBBR0VfS0VSTkVMLCAmcGFnZV9hcnJheV9wdHIpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKKwkJCSAgICAgICAidG8gbWFwIHBhZ2UgYXQgJXAgaW4ga2VybmVsXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgcGFnZV9hZGRyKTsKKwkJCWdvdG8gZXJyX21hcF9rZXJuZWxfZmFpbGVkOworCQl9CisJCXVzZXJfcGFnZV9hZGRyID0gKHNpemVfdClwYWdlX2FkZHIgKyBwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQ7CisJCXJldCA9IHZtX2luc2VydF9wYWdlKHZtYSwgdXNlcl9wYWdlX2FkZHIsIHBhZ2VbMF0pOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKKwkJCSAgICAgICAidG8gbWFwIHBhZ2UgYXQgJWx4IGluIHVzZXJzcGFjZVxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHVzZXJfcGFnZV9hZGRyKTsKKwkJCWdvdG8gZXJyX3ZtX2luc2VydF9wYWdlX2ZhaWxlZDsKKwkJfQorCQkvKiB2bV9pbnNlcnRfcGFnZSBkb2VzIG5vdCBzZWVtIHRvIGluY3JlbWVudCB0aGUgcmVmY291bnQgKi8KKwl9CisJaWYgKG1tKSB7CisJCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQltbXB1dChtbSk7CisJfQorCXJldHVybiAwOworCitmcmVlX3JhbmdlOgorCWZvciAocGFnZV9hZGRyID0gZW5kIC0gUEFHRV9TSVpFOyBwYWdlX2FkZHIgPj0gc3RhcnQ7CisJICAgICBwYWdlX2FkZHIgLT0gUEFHRV9TSVpFKSB7CisJCXBhZ2UgPSAmcHJvYy0+cGFnZXNbKHBhZ2VfYWRkciAtIHByb2MtPmJ1ZmZlcikgLyBQQUdFX1NJWkVdOworCQlpZiAodm1hKQorCQkJemFwX3BhZ2VfcmFuZ2Uodm1hLCAoc2l6ZV90KXBhZ2VfYWRkciArCisJCQkJcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0LCBQQUdFX1NJWkUsIE5VTEwpOworZXJyX3ZtX2luc2VydF9wYWdlX2ZhaWxlZDoKKwkJdW5tYXBfa2VybmVsX3JhbmdlKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkciwgUEFHRV9TSVpFKTsKK2Vycl9tYXBfa2VybmVsX2ZhaWxlZDoKKwkJX19mcmVlX3BhZ2UoKnBhZ2UpOworCQkqcGFnZSA9IE5VTEw7CitlcnJfYWxsb2NfcGFnZV9mYWlsZWQ6CisJCTsKKwl9CitlcnJfbm9fdm1hOgorCWlmIChtbSkgeworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpiaW5kZXJfYWxsb2NfYnVmKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKKwlzaXplX3QgZGF0YV9zaXplLCBzaXplX3Qgb2Zmc2V0c19zaXplLCBpbnQgaXNfYXN5bmMpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5mcmVlX2J1ZmZlcnMucmJfbm9kZTsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCXNpemVfdCBidWZmZXJfc2l6ZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqYmVzdF9maXQgPSBOVUxMOworCXZvaWQgKmhhc19wYWdlX2FkZHI7CisJdm9pZCAqZW5kX3BhZ2VfYWRkcjsKKwlzaXplX3Qgc2l6ZTsKKworCWlmIChwcm9jLT52bWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYsIG5vIHZtYVxuIiwKKwkJICAgICAgIHByb2MtPnBpZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNpemUgPSBBTElHTihkYXRhX3NpemUsIHNpemVvZih2b2lkICopKSArCisJCUFMSUdOKG9mZnNldHNfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworCisJaWYgKHNpemUgPCBkYXRhX3NpemUgfHwgc2l6ZSA8IG9mZnNldHNfc2l6ZSkgeworCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDogZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCisJCQkic2l6ZSAlemQtJXpkXG4iLCBwcm9jLT5waWQsIGRhdGFfc2l6ZSwgb2Zmc2V0c19zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGlzX2FzeW5jICYmCisJICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UgPCBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKSkgeworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DKQorCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkIGYiCisJCQkgICAgICAgImFpbGVkLCBubyBhc3luYyBzcGFjZSBsZWZ0XG4iLCBwcm9jLT5waWQsIHNpemUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aGlsZSAobikgeworCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCUJVR19PTighYnVmZmVyLT5mcmVlKTsKKwkJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKKworCQlpZiAoc2l6ZSA8IGJ1ZmZlcl9zaXplKSB7CisJCQliZXN0X2ZpdCA9IG47CisJCQluID0gbi0+cmJfbGVmdDsKKwkJfSBlbHNlIGlmIChzaXplID4gYnVmZmVyX3NpemUpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UgeworCQkJYmVzdF9maXQgPSBuOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGJlc3RfZml0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkIGZhaWxlZCwgIgorCQkgICAgICAgIm5vIGFkZHJlc3Mgc3BhY2VcbiIsIHByb2MtPnBpZCwgc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAobiA9PSBOVUxMKSB7CisJCWJ1ZmZlciA9IHJiX2VudHJ5KGJlc3RfZml0LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7CisJfQorCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgZ290IGJ1ZmYiCisJCSAgICAgICAiZXIgJXAgc2l6ZSAlemRcbiIsIHByb2MtPnBpZCwgc2l6ZSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKKwloYXNfcGFnZV9hZGRyID0KKwkJKHZvaWQgKikoKChzaXplX3QpYnVmZmVyLT5kYXRhICsgYnVmZmVyX3NpemUpICYgUEFHRV9NQVNLKTsKKwlpZiAobiA9PSBOVUxMKSB7CisJCWlmIChzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKSArIDQgPj0gYnVmZmVyX3NpemUpCisJCQlidWZmZXJfc2l6ZSA9IHNpemU7IC8qIG5vIHJvb20gZm9yIG90aGVyIGJ1ZmZlcnMgKi8KKwkJZWxzZQorCQkJYnVmZmVyX3NpemUgPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKKwl9CisJZW5kX3BhZ2VfYWRkciA9ICh2b2lkICopUEFHRV9BTElHTigoc2l6ZV90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKTsKKwlpZiAoZW5kX3BhZ2VfYWRkciA+IGhhc19wYWdlX2FkZHIpCisJCWVuZF9wYWdlX2FkZHIgPSBoYXNfcGFnZV9hZGRyOworCWlmIChiaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UocHJvYywgMSwKKwkgICAgKHZvaWQgKilQQUdFX0FMSUdOKChzaXplX3QpYnVmZmVyLT5kYXRhKSwgZW5kX3BhZ2VfYWRkciwgTlVMTCkpCisJCXJldHVybiBOVUxMOworCisJcmJfZXJhc2UoYmVzdF9maXQsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOworCWJ1ZmZlci0+ZnJlZSA9IDA7CisJYmluZGVyX2luc2VydF9hbGxvY2F0ZWRfYnVmZmVyKHByb2MsIGJ1ZmZlcik7CisJaWYgKGJ1ZmZlcl9zaXplICE9IHNpemUpIHsKKwkJc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIgPSAodm9pZCAqKWJ1ZmZlci0+ZGF0YSArIHNpemU7CisJCWxpc3RfYWRkKCZuZXdfYnVmZmVyLT5lbnRyeSwgJmJ1ZmZlci0+ZW50cnkpOworCQluZXdfYnVmZmVyLT5mcmVlID0gMTsKKwkJYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihwcm9jLCBuZXdfYnVmZmVyKTsKKwl9CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBnb3QgIgorCQkgICAgICAgIiVwXG4iLCBwcm9jLT5waWQsIHNpemUsIGJ1ZmZlcik7CisJYnVmZmVyLT5kYXRhX3NpemUgPSBkYXRhX3NpemU7CisJYnVmZmVyLT5vZmZzZXRzX3NpemUgPSBvZmZzZXRzX3NpemU7CisJYnVmZmVyLT5hc3luY190cmFuc2FjdGlvbiA9IGlzX2FzeW5jOworCWlmIChpc19hc3luYykgeworCQlwcm9jLT5mcmVlX2FzeW5jX3NwYWNlIC09IHNpemUgKyBzaXplb2Yoc3RydWN0IGJpbmRlcl9idWZmZXIpOworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DX0FTWU5DKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCAiCisJCQkgICAgICAgImFzeW5jIGZyZWUgJXpkXG4iLCBwcm9jLT5waWQsIHNpemUsCisJCQkgICAgICAgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7CisJfQorCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgKmJ1ZmZlcl9zdGFydF9wYWdlKHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJcmV0dXJuICh2b2lkICopKChzaXplX3QpYnVmZmVyICYgUEFHRV9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgKmJ1ZmZlcl9lbmRfcGFnZShzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXJldHVybiAodm9pZCAqKSgoKHNpemVfdCkoYnVmZmVyICsgMSkgLSAxKSAmIFBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9kZWxldGVfZnJlZV9idWZmZXIoCisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpwcmV2LCAqbmV4dCA9IE5VTEw7CisJaW50IGZyZWVfcGFnZV9lbmQgPSAxOworCWludCBmcmVlX3BhZ2Vfc3RhcnQgPSAxOworCisJQlVHX09OKHByb2MtPmJ1ZmZlcnMubmV4dCA9PSAmYnVmZmVyLT5lbnRyeSk7CisJcHJldiA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5wcmV2LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOworCUJVR19PTighcHJldi0+ZnJlZSk7CisJaWYgKGJ1ZmZlcl9lbmRfcGFnZShwcmV2KSA9PSBidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKSB7CisJCWZyZWVfcGFnZV9zdGFydCA9IDA7CisJCWlmIChidWZmZXJfZW5kX3BhZ2UocHJldikgPT0gYnVmZmVyX2VuZF9wYWdlKGJ1ZmZlcikpCisJCQlmcmVlX3BhZ2VfZW5kID0gMDsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciAlcCAiCisJCQkgICAgICAgInNoYXJlIHBhZ2Ugd2l0aCAlcFxuIiwgcHJvYy0+cGlkLCBidWZmZXIsIHByZXYpOworCX0KKworCWlmICghbGlzdF9pc19sYXN0KCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycykpIHsKKwkJbmV4dCA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAorCQkJCSAgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwkJaWYgKGJ1ZmZlcl9zdGFydF9wYWdlKG5leHQpID09IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpKSB7CisJCQlmcmVlX3BhZ2VfZW5kID0gMDsKKwkJCWlmIChidWZmZXJfc3RhcnRfcGFnZShuZXh0KSA9PQorCQkJICAgIGJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpCisJCQkJZnJlZV9wYWdlX3N0YXJ0ID0gMDsKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogbWVyZ2UgZnJlZSwgIgorCQkJCSAgICAgICAiYnVmZmVyICVwIHNoYXJlIHBhZ2Ugd2l0aCAlcFxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCBidWZmZXIsIHByZXYpOworCQl9CisJfQorCWxpc3RfZGVsKCZidWZmZXItPmVudHJ5KTsKKwlpZiAoZnJlZV9wYWdlX3N0YXJ0IHx8IGZyZWVfcGFnZV9lbmQpIHsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciAlcCBkbyAiCisJCQkgICAgICAgIm5vdCBzaGFyZSBwYWdlJXMlcyB3aXRoIHdpdGggJXAgb3IgJXBcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCBidWZmZXIsIGZyZWVfcGFnZV9zdGFydCA/ICIiIDogIiBlbmQiLAorCQkJICAgICAgIGZyZWVfcGFnZV9lbmQgPyAiIiA6ICIgc3RhcnQiLCBwcmV2LCBuZXh0KTsKKwkJYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDAsIGZyZWVfcGFnZV9zdGFydCA/CisJCQlidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpIDogYnVmZmVyX2VuZF9wYWdlKGJ1ZmZlciksCisJCQkoZnJlZV9wYWdlX2VuZCA/IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpIDoKKwkJCWJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpICsgUEFHRV9TSVpFLCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9mcmVlX2J1ZigKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJc2l6ZV90IHNpemUsIGJ1ZmZlcl9zaXplOworCisJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKKworCXNpemUgPSBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpICsKKwkJQUxJR04oYnVmZmVyLT5vZmZzZXRzX3NpemUsIHNpemVvZih2b2lkICopKTsKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBiaW5kZXJfZnJlZV9idWYgJXAgc2l6ZSAlemQgYnVmZmVyIgorCQkgICAgICAgIl9zaXplICV6ZFxuIiwgcHJvYy0+cGlkLCBidWZmZXIsIHNpemUsIGJ1ZmZlcl9zaXplKTsKKworCUJVR19PTihidWZmZXItPmZyZWUpOworCUJVR19PTihzaXplID4gYnVmZmVyX3NpemUpOworCUJVR19PTihidWZmZXItPnRyYW5zYWN0aW9uICE9IE5VTEwpOworCUJVR19PTigodm9pZCAqKWJ1ZmZlciA8IHByb2MtPmJ1ZmZlcik7CisJQlVHX09OKCh2b2lkICopYnVmZmVyID4gcHJvYy0+YnVmZmVyICsgcHJvYy0+YnVmZmVyX3NpemUpOworCisJaWYgKGJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24pIHsKKwkJcHJvYy0+ZnJlZV9hc3luY19zcGFjZSArPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQ19BU1lOQykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGJpbmRlcl9mcmVlX2J1ZiBzaXplICV6ZCAiCisJCQkgICAgICAgImFzeW5jIGZyZWUgJXpkXG4iLCBwcm9jLT5waWQsIHNpemUsCisJCQkgICAgICAgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7CisJfQorCisJYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDAsCisJCSh2b2lkICopUEFHRV9BTElHTigoc2l6ZV90KWJ1ZmZlci0+ZGF0YSksCisJCSh2b2lkICopKCgoc2l6ZV90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKSAmIFBBR0VfTUFTSyksCisJCU5VTEwpOworCXJiX2VyYXNlKCZidWZmZXItPnJiX25vZGUsICZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycyk7CisJYnVmZmVyLT5mcmVlID0gMTsKKwlpZiAoIWxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKSB7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXh0ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5Lm5leHQsCisJCQkJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOworCQlpZiAobmV4dC0+ZnJlZSkgeworCQkJcmJfZXJhc2UoJm5leHQtPnJiX25vZGUsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOworCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihwcm9jLCBuZXh0KTsKKwkJfQorCX0KKwlpZiAocHJvYy0+YnVmZmVycy5uZXh0ICE9ICZidWZmZXItPmVudHJ5KSB7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpwcmV2ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5LnByZXYsCisJCQkJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOworCQlpZiAocHJldi0+ZnJlZSkgeworCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihwcm9jLCBidWZmZXIpOworCQkJcmJfZXJhc2UoJnByZXYtPnJiX25vZGUsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOworCQkJYnVmZmVyID0gcHJldjsKKwkJfQorCX0KKwliaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHByb2MsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKgorYmluZGVyX2dldF9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdm9pZCBfX3VzZXIgKnB0cikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPm5vZGVzLnJiX25vZGU7CisJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOworCisJd2hpbGUgKG4pIHsKKwkJbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7CisKKwkJaWYgKHB0ciA8IG5vZGUtPnB0cikKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChwdHIgPiBub2RlLT5wdHIpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBub2RlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqCitiaW5kZXJfbmV3X25vZGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkIF9fdXNlciAqY29va2llKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5ub2Rlcy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJbm9kZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9ub2RlLCByYl9ub2RlKTsKKworCQlpZiAocHRyIDwgbm9kZS0+cHRyKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChwdHIgPiBub2RlLT5wdHIpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlub2RlID0ga3phbGxvYyhzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwliaW5kZXJfc3RhdHMub2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfTk9ERV0rKzsKKwlyYl9saW5rX25vZGUoJm5vZGUtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZub2RlLT5yYl9ub2RlLCAmcHJvYy0+bm9kZXMpOworCW5vZGUtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKKwlub2RlLT5wcm9jID0gcHJvYzsKKwlub2RlLT5wdHIgPSBwdHI7CisJbm9kZS0+Y29va2llID0gY29va2llOworCW5vZGUtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX05PREU7CisJSU5JVF9MSVNUX0hFQUQoJm5vZGUtPndvcmsuZW50cnkpOworCUlOSVRfTElTVF9IRUFEKCZub2RlLT5hc3luY190b2RvKTsKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgY3JlYXRlZFxuIiwKKwkJICAgICAgIHByb2MtPnBpZCwgY3VycmVudC0+cGlkLCBub2RlLT5kZWJ1Z19pZCwKKwkJICAgICAgIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIGludAorYmluZGVyX2luY19ub2RlKHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSwgaW50IHN0cm9uZywgaW50IGludGVybmFsLAorCQlzdHJ1Y3QgbGlzdF9oZWFkICp0YXJnZXRfbGlzdCkKK3sKKwlpZiAoc3Ryb25nKSB7CisJCWlmIChpbnRlcm5hbCkgeworCQkJaWYgKHRhcmdldF9saXN0ID09IE5VTEwgJiYKKwkJCSAgICBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcyA9PSAwICYmCisJCQkgICAgIShub2RlID09IGJpbmRlcl9jb250ZXh0X21ncl9ub2RlICYmCisJCQkgICAgbm9kZS0+aGFzX3N0cm9uZ19yZWYpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IGludmFsaWQgaW5jIHN0cm9uZyAiCisJCQkJCSJub2RlIGZvciAlZFxuIiwgbm9kZS0+ZGVidWdfaWQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMrKzsKKwkJfSBlbHNlCisJCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcysrOworCQlpZiAoIW5vZGUtPmhhc19zdHJvbmdfcmVmICYmIHRhcmdldF9saXN0KSB7CisJCQlsaXN0X2RlbF9pbml0KCZub2RlLT53b3JrLmVudHJ5KTsKKwkJCWxpc3RfYWRkX3RhaWwoJm5vZGUtPndvcmsuZW50cnksIHRhcmdldF9saXN0KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghaW50ZXJuYWwpCisJCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMrKzsKKwkJaWYgKCFub2RlLT5oYXNfd2Vha19yZWYgJiYgbGlzdF9lbXB0eSgmbm9kZS0+d29yay5lbnRyeSkpIHsKKwkJCWlmICh0YXJnZXRfbGlzdCA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IGludmFsaWQgaW5jIHdlYWsgbm9kZSAiCisJCQkJCSJmb3IgJWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWxpc3RfYWRkX3RhaWwoJm5vZGUtPndvcmsuZW50cnksIHRhcmdldF9saXN0KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmluZGVyX2RlY19ub2RlKHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSwgaW50IHN0cm9uZywgaW50IGludGVybmFsKQoreworCWlmIChzdHJvbmcpIHsKKwkJaWYgKGludGVybmFsKQorCQkJbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMtLTsKKwkJZWxzZQorCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMtLTsKKwkJaWYgKG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzIHx8IG5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKCFpbnRlcm5hbCkKKwkJCW5vZGUtPmxvY2FsX3dlYWtfcmVmcy0tOworCQlpZiAobm9kZS0+bG9jYWxfd2Vha19yZWZzIHx8ICFobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKG5vZGUtPnByb2MgJiYgKG5vZGUtPmhhc19zdHJvbmdfcmVmIHx8IG5vZGUtPmhhc193ZWFrX3JlZikpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJm5vZGUtPndvcmsuZW50cnkpKSB7CisJCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCAmbm9kZS0+cHJvYy0+dG9kbyk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm5vZGUtPnByb2MtPndhaXQpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGhsaXN0X2VtcHR5KCZub2RlLT5yZWZzKSAmJiAhbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMgJiYKKwkJICAgICFub2RlLT5sb2NhbF93ZWFrX3JlZnMpIHsKKwkJCWxpc3RfZGVsX2luaXQoJm5vZGUtPndvcmsuZW50cnkpOworCQkJaWYgKG5vZGUtPnByb2MpIHsKKwkJCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJm5vZGUtPnByb2MtPm5vZGVzKTsKKwkJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUykKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiByZWZsZXNzIG5vZGUgJWQgZGVsZXRlZFxuIiwgbm9kZS0+ZGVidWdfaWQpOworCQkJfSBlbHNlIHsKKwkJCQlobGlzdF9kZWwoJm5vZGUtPmRlYWRfbm9kZSk7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogZGVhZCBub2RlICVkIGRlbGV0ZWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKKwkJCX0KKwkJCWtmcmVlKG5vZGUpOworCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX05PREVdKys7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGJpbmRlcl9yZWYgKgorYmluZGVyX2dldF9yZWYoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCB1aW50MzJfdCBkZXNjKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+cmVmc19ieV9kZXNjLnJiX25vZGU7CisJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKworCXdoaWxlIChuKSB7CisJCXJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOworCisJCWlmIChkZXNjIDwgcmVmLT5kZXNjKQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGRlc2MgPiByZWYtPmRlc2MpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiByZWY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl9yZWYgKgorYmluZGVyX2dldF9yZWZfZm9yX25vZGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKm47CisJc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPnJlZnNfYnlfbm9kZS5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYsICpuZXdfcmVmOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlyZWYgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX25vZGUpOworCisJCWlmIChub2RlIDwgcmVmLT5ub2RlKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChub2RlID4gcmVmLT5ub2RlKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIHJlZjsKKwl9CisJbmV3X3JlZiA9IGt6YWxsb2Moc2l6ZW9mKCpyZWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3X3JlZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwliaW5kZXJfc3RhdHMub2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfUkVGXSsrOworCW5ld19yZWYtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKKwluZXdfcmVmLT5wcm9jID0gcHJvYzsKKwluZXdfcmVmLT5ub2RlID0gbm9kZTsKKwlyYl9saW5rX25vZGUoJm5ld19yZWYtPnJiX25vZGVfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19yZWYtPnJiX25vZGVfbm9kZSwgJnByb2MtPnJlZnNfYnlfbm9kZSk7CisKKwluZXdfcmVmLT5kZXNjID0gKG5vZGUgPT0gYmluZGVyX2NvbnRleHRfbWdyX25vZGUpID8gMCA6IDE7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpIHsKKwkJcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsIHJiX25vZGVfZGVzYyk7CisJCWlmIChyZWYtPmRlc2MgPiBuZXdfcmVmLT5kZXNjKQorCQkJYnJlYWs7CisJCW5ld19yZWYtPmRlc2MgPSByZWYtPmRlc2MgKyAxOworCX0KKworCXAgPSAmcHJvYy0+cmVmc19ieV9kZXNjLnJiX25vZGU7CisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlyZWYgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOworCisJCWlmIChuZXdfcmVmLT5kZXNjIDwgcmVmLT5kZXNjKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChuZXdfcmVmLT5kZXNjID4gcmVmLT5kZXNjKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJQlVHKCk7CisJfQorCXJiX2xpbmtfbm9kZSgmbmV3X3JlZi0+cmJfbm9kZV9kZXNjLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3X3JlZi0+cmJfbm9kZV9kZXNjLCAmcHJvYy0+cmVmc19ieV9kZXNjKTsKKwlpZiAobm9kZSkgeworCQlobGlzdF9hZGRfaGVhZCgmbmV3X3JlZi0+bm9kZV9lbnRyeSwgJm5vZGUtPnJlZnMpOworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgbmV3IHJlZiAlZCBkZXNjICVkIGZvciAiCisJCQkJIm5vZGUgJWRcbiIsIHByb2MtPnBpZCwgbmV3X3JlZi0+ZGVidWdfaWQsCisJCQkJbmV3X3JlZi0+ZGVzYywgbm9kZS0+ZGVidWdfaWQpOworCX0gZWxzZSB7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZCBuZXcgcmVmICVkIGRlc2MgJWQgZm9yICIKKwkJCQkiZGVhZCBub2RlXG4iLCBwcm9jLT5waWQsIG5ld19yZWYtPmRlYnVnX2lkLAorCQkJCW5ld19yZWYtPmRlc2MpOworCX0KKwlyZXR1cm4gbmV3X3JlZjsKK30KKworc3RhdGljIHZvaWQKK2JpbmRlcl9kZWxldGVfcmVmKHN0cnVjdCBiaW5kZXJfcmVmICpyZWYpCit7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgZGVsZXRlIHJlZiAlZCBkZXNjICVkIGZvciAiCisJCQkibm9kZSAlZFxuIiwgcmVmLT5wcm9jLT5waWQsIHJlZi0+ZGVidWdfaWQsCisJCQlyZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQpOworCXJiX2VyYXNlKCZyZWYtPnJiX25vZGVfZGVzYywgJnJlZi0+cHJvYy0+cmVmc19ieV9kZXNjKTsKKwlyYl9lcmFzZSgmcmVmLT5yYl9ub2RlX25vZGUsICZyZWYtPnByb2MtPnJlZnNfYnlfbm9kZSk7CisJaWYgKHJlZi0+c3Ryb25nKQorCQliaW5kZXJfZGVjX25vZGUocmVmLT5ub2RlLCAxLCAxKTsKKwlobGlzdF9kZWwoJnJlZi0+bm9kZV9lbnRyeSk7CisJYmluZGVyX2RlY19ub2RlKHJlZi0+bm9kZSwgMCwgMSk7CisJaWYgKHJlZi0+ZGVhdGgpIHsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZCBkZWxldGUgcmVmICVkIGRlc2MgJWQgIgorCQkJCSJoYXMgZGVhdGggbm90aWZpY2F0aW9uXG4iLCByZWYtPnByb2MtPnBpZCwKKwkJCQlyZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MpOworCQlsaXN0X2RlbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSk7CisJCWtmcmVlKHJlZi0+ZGVhdGgpOworCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfREVBVEhdKys7CisJfQorCWtmcmVlKHJlZik7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1JFRl0rKzsKK30KKworc3RhdGljIGludAorYmluZGVyX2luY19yZWYoCisJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiwgaW50IHN0cm9uZywgc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3QpCit7CisJaW50IHJldDsKKwlpZiAoc3Ryb25nKSB7CisJCWlmIChyZWYtPnN0cm9uZyA9PSAwKSB7CisJCQlyZXQgPSBiaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCAxLCAxLCB0YXJnZXRfbGlzdCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmVmLT5zdHJvbmcrKzsKKwl9IGVsc2UgeworCQlpZiAocmVmLT53ZWFrID09IDApIHsKKwkJCXJldCA9IGJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIDAsIDEsIHRhcmdldF9saXN0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZWYtPndlYWsrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorYmluZGVyX2RlY19yZWYoc3RydWN0IGJpbmRlcl9yZWYgKnJlZiwgaW50IHN0cm9uZykKK3sKKwlpZiAoc3Ryb25nKSB7CisJCWlmIChyZWYtPnN0cm9uZyA9PSAwKSB7CisJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBpbnZhbGlkIGRlYyBzdHJvbmcsICIKKwkJCQkJICAicmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkXG4iLAorCQkJCQkgIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAorCQkJCQkgIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2Vhayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWYtPnN0cm9uZy0tOworCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgeworCQkJaW50IHJldDsKKwkJCXJldCA9IGJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIHN0cm9uZywgMSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocmVmLT53ZWFrID09IDApIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkIGludmFsaWQgZGVjIHdlYWssICIKKwkJCQkJICAicmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkXG4iLAorCQkJCQkgIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAorCQkJCQkgIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2Vhayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWYtPndlYWstLTsKKwl9CisJaWYgKHJlZi0+c3Ryb25nID09IDAgJiYgcmVmLT53ZWFrID09IDApCisJCWJpbmRlcl9kZWxldGVfcmVmKHJlZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfcG9wX3RyYW5zYWN0aW9uKAorCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0YXJnZXRfdGhyZWFkLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KQoreworCWlmICh0YXJnZXRfdGhyZWFkKSB7CisJCUJVR19PTih0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayAhPSB0KTsKKwkJQlVHX09OKHRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrLT5mcm9tICE9IHRhcmdldF90aHJlYWQpOworCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9CisJCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZnJvbV9wYXJlbnQ7CisJCXQtPmZyb20gPSBOVUxMOworCX0KKwl0LT5uZWVkX3JlcGx5ID0gMDsKKwlpZiAodC0+YnVmZmVyKQorCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKKwlrZnJlZSh0KTsKKwliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05dKys7Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkoc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCwgdWludDMyX3QgZXJyb3JfY29kZSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZDsKKwlCVUdfT04odC0+ZmxhZ3MgJiBURl9PTkVfV0FZKTsKKwl3aGlsZSAoMSkgeworCQl0YXJnZXRfdGhyZWFkID0gdC0+ZnJvbTsKKwkJaWYgKHRhcmdldF90aHJlYWQpIHsKKwkJCWlmICh0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0sgJiYKKwkJCSAgIHRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcjIgPT0gQlJfT0spIHsKKwkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0KKwkJCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yOworCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX09LOworCQkJfQorCQkJaWYgKHRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvciA9PSBCUl9PSykgeworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04pCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogc2VuZCBmYWlsZWQgcmVwbHkgZm9yIHRyYW5zYWN0aW9uICVkIHRvICVkOiVkXG4iLAorCQkJCQkgICAgICAgdC0+ZGVidWdfaWQsIHRhcmdldF90aHJlYWQtPnByb2MtPnBpZCwgdGFyZ2V0X3RocmVhZC0+cGlkKTsKKworCQkJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgdCk7CisJCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yID0gZXJyb3JfY29kZTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRhcmdldF90aHJlYWQtPndhaXQpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogcmVwbHkgZmFpbGVkLCB0YXJnZXQgIgorCQkJCQkidGhyZWFkLCAlZDolZCwgaGFzIGVycm9yIGNvZGUgJWQgIgorCQkJCQkiYWxyZWFkeVxuIiwgdGFyZ2V0X3RocmVhZC0+cHJvYy0+cGlkLAorCQkJCQl0YXJnZXRfdGhyZWFkLT5waWQsCisJCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcik7CisJCQl9CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpuZXh0ID0gdC0+ZnJvbV9wYXJlbnQ7CisKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiBzZW5kIGZhaWxlZCByZXBseSAiCisJCQkJCSJmb3IgdHJhbnNhY3Rpb24gJWQsIHRhcmdldCBkZWFkXG4iLAorCQkJCQl0LT5kZWJ1Z19pZCk7CisKKwkJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgdCk7CisJCQlpZiAobmV4dCA9PSBOVUxMKSB7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6IHJlcGx5IGZhaWxlZCwiCisJCQkJCQkiIG5vIHRhcmdldCB0aHJlYWQgYXQgcm9vdFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdCA9IG5leHQ7CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiByZXBseSBmYWlsZWQsIG5vIHRhcmciCisJCQkJCSJldCB0aHJlYWQgLS0gcmV0cnkgJWRcbiIsIHQtPmRlYnVnX2lkKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2JpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCisJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyLCBzaXplX3QgKmZhaWxlZF9hdCk7CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfdHJhbnNhY3Rpb24oc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAorCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSAqdHIsIGludCByZXBseSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OworCXN0cnVjdCBiaW5kZXJfd29yayAqdGNvbXBsZXRlOworCXNpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7CisJc3RydWN0IGJpbmRlcl9wcm9jICp0YXJnZXRfcHJvYzsKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZCA9IE5VTEw7CisJc3RydWN0IGJpbmRlcl9ub2RlICp0YXJnZXRfbm9kZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKnRhcmdldF93YWl0OworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKmluX3JlcGx5X3RvID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSAqZTsKKwl1aW50MzJfdCByZXR1cm5fZXJyb3I7CisKKwllID0gYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19hZGQoJmJpbmRlcl90cmFuc2FjdGlvbl9sb2cpOworCWUtPmNhbGxfdHlwZSA9IHJlcGx5ID8gMiA6ICEhKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpOworCWUtPmZyb21fcHJvYyA9IHByb2MtPnBpZDsKKwllLT5mcm9tX3RocmVhZCA9IHRocmVhZC0+cGlkOworCWUtPnRhcmdldF9oYW5kbGUgPSB0ci0+dGFyZ2V0LmhhbmRsZTsKKwllLT5kYXRhX3NpemUgPSB0ci0+ZGF0YV9zaXplOworCWUtPm9mZnNldHNfc2l6ZSA9IHRyLT5vZmZzZXRzX3NpemU7CisKKwlpZiAocmVwbHkpIHsKKwkJaW5fcmVwbHlfdG8gPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOworCQlpZiAoaW5fcmVwbHlfdG8gPT0gTlVMTCkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKKwkJCQkJICAid2l0aCBubyB0cmFuc2FjdGlvbiBzdGFja1xuIiwKKwkJCQkJICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2VtcHR5X2NhbGxfc3RhY2s7CisJCX0KKwkJYmluZGVyX3NldF9uaWNlKGluX3JlcGx5X3RvLT5zYXZlZF9wcmlvcml0eSk7CisJCWlmIChpbl9yZXBseV90by0+dG9fdGhyZWFkICE9IHRocmVhZCkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKKwkJCQkid2l0aCBiYWQgdHJhbnNhY3Rpb24gc3RhY2ssIgorCQkJCSIgdHJhbnNhY3Rpb24gJWQgaGFzIHRhcmdldCAlZDolZFxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBpbl9yZXBseV90by0+ZGVidWdfaWQsCisJCQkJaW5fcmVwbHlfdG8tPnRvX3Byb2MgPworCQkJCWluX3JlcGx5X3RvLT50b19wcm9jLT5waWQgOiAwLAorCQkJCWluX3JlcGx5X3RvLT50b190aHJlYWQgPworCQkJCWluX3JlcGx5X3RvLT50b190aHJlYWQtPnBpZCA6IDApOworCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJaW5fcmVwbHlfdG8gPSBOVUxMOworCQkJZ290byBlcnJfYmFkX2NhbGxfc3RhY2s7CisJCX0KKwkJdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9IGluX3JlcGx5X3RvLT50b19wYXJlbnQ7CisJCXRhcmdldF90aHJlYWQgPSBpbl9yZXBseV90by0+ZnJvbTsKKwkJaWYgKHRhcmdldF90aHJlYWQgPT0gTlVMTCkgeworCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOworCQl9CisJCWlmICh0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayAhPSBpbl9yZXBseV90bykgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKKwkJCQkid2l0aCBiYWQgdGFyZ2V0IHRyYW5zYWN0aW9uIHN0YWNrICVkLCAiCisJCQkJImV4cGVjdGVkICVkXG4iLAorCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPworCQkJCXRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrLT5kZWJ1Z19pZCA6IDAsCisJCQkJaW5fcmVwbHlfdG8tPmRlYnVnX2lkKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWluX3JlcGx5X3RvID0gTlVMTDsKKwkJCXRhcmdldF90aHJlYWQgPSBOVUxMOworCQkJZ290byBlcnJfZGVhZF9iaW5kZXI7CisJCX0KKwkJdGFyZ2V0X3Byb2MgPSB0YXJnZXRfdGhyZWFkLT5wcm9jOworCX0gZWxzZSB7CisJCWlmICh0ci0+dGFyZ2V0LmhhbmRsZSkgeworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRyLT50YXJnZXQuaGFuZGxlKTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCAiCisJCQkJCSJ0cmFuc2FjdGlvbiB0byBpbnZhbGlkIGhhbmRsZVxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2ludmFsaWRfdGFyZ2V0X2hhbmRsZTsKKwkJCX0KKwkJCXRhcmdldF9ub2RlID0gcmVmLT5ub2RlOworCQl9IGVsc2UgeworCQkJdGFyZ2V0X25vZGUgPSBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZTsKKwkJCWlmICh0YXJnZXRfbm9kZSA9PSBOVUxMKSB7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9ub19jb250ZXh0X21ncl9ub2RlOworCQkJfQorCQl9CisJCWUtPnRvX25vZGUgPSB0YXJnZXRfbm9kZS0+ZGVidWdfaWQ7CisJCXRhcmdldF9wcm9jID0gdGFyZ2V0X25vZGUtPnByb2M7CisJCWlmICh0YXJnZXRfcHJvYyA9PSBOVUxMKSB7CisJCQlyZXR1cm5fZXJyb3IgPSBCUl9ERUFEX1JFUExZOworCQkJZ290byBlcnJfZGVhZF9iaW5kZXI7CisJCX0KKwkJaWYgKCEodHItPmZsYWdzICYgVEZfT05FX1dBWSkgJiYgdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjaykgeworCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdG1wOworCQkJdG1wID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKKwkJCXdoaWxlICh0bXApIHsKKwkJCQlpZiAodG1wLT5mcm9tICYmIHRtcC0+ZnJvbS0+cHJvYyA9PSB0YXJnZXRfcHJvYykKKwkJCQkJdGFyZ2V0X3RocmVhZCA9IHRtcC0+ZnJvbTsKKwkJCQl0bXAgPSB0bXAtPmZyb21fcGFyZW50OworCQkJfQorCQl9CisJfQorCWlmICh0YXJnZXRfdGhyZWFkKSB7CisJCWUtPnRvX3RocmVhZCA9IHRhcmdldF90aHJlYWQtPnBpZDsKKwkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X3RocmVhZC0+dG9kbzsKKwkJdGFyZ2V0X3dhaXQgPSAmdGFyZ2V0X3RocmVhZC0+d2FpdDsKKwl9IGVsc2UgeworCQl0YXJnZXRfbGlzdCA9ICZ0YXJnZXRfcHJvYy0+dG9kbzsKKwkJdGFyZ2V0X3dhaXQgPSAmdGFyZ2V0X3Byb2MtPndhaXQ7CisJfQorCWUtPnRvX3Byb2MgPSB0YXJnZXRfcHJvYy0+cGlkOworCisJLyogVE9ETzogcmV1c2UgaW5jb21pbmcgdHJhbnNhY3Rpb24gZm9yIHJlcGx5ICovCisJdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHQgPT0gTlVMTCkgeworCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCWdvdG8gZXJyX2FsbG9jX3RfZmFpbGVkOworCX0KKwliaW5kZXJfc3RhdHMub2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05dKys7CisKKwl0Y29tcGxldGUgPSBremFsbG9jKHNpemVvZigqdGNvbXBsZXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRjb21wbGV0ZSA9PSBOVUxMKSB7CisJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJZ290byBlcnJfYWxsb2NfdGNvbXBsZXRlX2ZhaWxlZDsKKwl9CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFXSsrOworCisJdC0+ZGVidWdfaWQgPSArK2JpbmRlcl9sYXN0X2lkOworCWUtPmRlYnVnX2lkID0gdC0+ZGVidWdfaWQ7CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pIHsKKwkJaWYgKHJlcGx5KQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19SRVBMWSAlZCAtPiAlZDolZCwgIgorCQkJICAgICAgICJkYXRhICVwLSVwIHNpemUgJXpkLSV6ZFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0LT5kZWJ1Z19pZCwKKwkJCSAgICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfdGhyZWFkLT5waWQsCisJCQkgICAgICAgdHItPmRhdGEucHRyLmJ1ZmZlciwgdHItPmRhdGEucHRyLm9mZnNldHMsCisJCQkgICAgICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfVFJBTlNBQ1RJT04gJWQgLT4gIgorCQkJICAgICAgICIlZCAtIG5vZGUgJWQsIGRhdGEgJXAtJXAgc2l6ZSAlemQtJXpkXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAorCQkJICAgICAgIHRhcmdldF9wcm9jLT5waWQsIHRhcmdldF9ub2RlLT5kZWJ1Z19pZCwKKwkJCSAgICAgICB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YS5wdHIub2Zmc2V0cywKKwkJCSAgICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKwl9CisKKwlpZiAoIXJlcGx5ICYmICEodHItPmZsYWdzICYgVEZfT05FX1dBWSkpCisJCXQtPmZyb20gPSB0aHJlYWQ7CisJZWxzZQorCQl0LT5mcm9tID0gTlVMTDsKKwl0LT5zZW5kZXJfZXVpZCA9IHByb2MtPnRzay0+Y3JlZC0+ZXVpZDsKKwl0LT50b19wcm9jID0gdGFyZ2V0X3Byb2M7CisJdC0+dG9fdGhyZWFkID0gdGFyZ2V0X3RocmVhZDsKKwl0LT5jb2RlID0gdHItPmNvZGU7CisJdC0+ZmxhZ3MgPSB0ci0+ZmxhZ3M7CisJdC0+cHJpb3JpdHkgPSB0YXNrX25pY2UoY3VycmVudCk7CisJdC0+YnVmZmVyID0gYmluZGVyX2FsbG9jX2J1Zih0YXJnZXRfcHJvYywgdHItPmRhdGFfc2l6ZSwKKwkJdHItPm9mZnNldHNfc2l6ZSwgIXJlcGx5ICYmICh0LT5mbGFncyAmIFRGX09ORV9XQVkpKTsKKwlpZiAodC0+YnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQlnb3RvIGVycl9iaW5kZXJfYWxsb2NfYnVmX2ZhaWxlZDsKKwl9CisJdC0+YnVmZmVyLT5hbGxvd191c2VyX2ZyZWUgPSAwOworCXQtPmJ1ZmZlci0+ZGVidWdfaWQgPSB0LT5kZWJ1Z19pZDsKKwl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gdDsKKwl0LT5idWZmZXItPnRhcmdldF9ub2RlID0gdGFyZ2V0X25vZGU7CisJaWYgKHRhcmdldF9ub2RlKQorCQliaW5kZXJfaW5jX25vZGUodGFyZ2V0X25vZGUsIDEsIDAsIE5VTEwpOworCisJb2ZmcCA9IChzaXplX3QgKikodC0+YnVmZmVyLT5kYXRhICsgQUxJR04odHItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcih0LT5idWZmZXItPmRhdGEsIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhX3NpemUpKSB7CisJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgIgorCQkJImRhdGEgcHRyXG4iLCBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQlnb3RvIGVycl9jb3B5X2RhdGFfZmFpbGVkOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIob2ZmcCwgdHItPmRhdGEucHRyLm9mZnNldHMsIHRyLT5vZmZzZXRzX3NpemUpKSB7CisJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgIgorCQkJIm9mZnNldHMgcHRyXG4iLCBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQlnb3RvIGVycl9jb3B5X2RhdGFfZmFpbGVkOworCX0KKwlvZmZfZW5kID0gKHZvaWQgKilvZmZwICsgdHItPm9mZnNldHNfc2l6ZTsKKwlmb3IgKDsgb2ZmcCA8IG9mZl9lbmQ7IG9mZnArKykgeworCQlzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICpmcDsKKwkJaWYgKCpvZmZwID4gdC0+YnVmZmVyLT5kYXRhX3NpemUgLSBzaXplb2YoKmZwKSkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggIgorCQkJCSJpbnZhbGlkIG9mZnNldCwgJXpkXG4iLAorCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICpvZmZwKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2JhZF9vZmZzZXQ7CisJCX0KKwkJZnAgPSAoc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqKSh0LT5idWZmZXItPmRhdGEgKyAqb2ZmcCk7CisJCXN3aXRjaCAoZnAtPnR5cGUpIHsKKwkJY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6CisJCWNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6IHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CisJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgZnAtPmJpbmRlcik7CisJCQlpZiAobm9kZSA9PSBOVUxMKSB7CisJCQkJbm9kZSA9IGJpbmRlcl9uZXdfbm9kZShwcm9jLCBmcC0+YmluZGVyLCBmcC0+Y29va2llKTsKKwkJCQlpZiAobm9kZSA9PSBOVUxMKSB7CisJCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQkJZ290byBlcnJfYmluZGVyX25ld19ub2RlX2ZhaWxlZDsKKwkJCQl9CisJCQkJbm9kZS0+bWluX3ByaW9yaXR5ID0gZnAtPmZsYWdzICYgRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLOworCQkJCW5vZGUtPmFjY2VwdF9mZHMgPSAhIShmcC0+ZmxhZ3MgJiBGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTKTsKKwkJCX0KKwkJCWlmIChmcC0+Y29va2llICE9IG5vZGUtPmNvb2tpZSkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIHNlbmRpbmcgdSVwICIKKwkJCQkJIm5vZGUgJWQsIGNvb2tpZSBtaXNtYXRjaCAlcCAhPSAlcFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJZnAtPmJpbmRlciwgbm9kZS0+ZGVidWdfaWQsCisJCQkJCWZwLT5jb29raWUsIG5vZGUtPmNvb2tpZSk7CisJCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOworCQkJfQorCQkJcmVmID0gYmluZGVyX2dldF9yZWZfZm9yX25vZGUodGFyZ2V0X3Byb2MsIG5vZGUpOworCQkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlX2ZhaWxlZDsKKwkJCX0KKwkJCWlmIChmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIpCisJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9IQU5ETEU7CisJCQllbHNlCisJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTsKKwkJCWZwLT5oYW5kbGUgPSByZWYtPmRlc2M7CisJCQliaW5kZXJfaW5jX3JlZihyZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSwgJnRocmVhZC0+dG9kbyk7CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICBub2RlICVkIHUlcCAtPiByZWYgJWQgZGVzYyAlZFxuIiwKKwkJCQkgICAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjKTsKKwkJfSBicmVhazsKKwkJY2FzZSBCSU5ERVJfVFlQRV9IQU5ETEU6CisJCWNhc2UgQklOREVSX1RZUEVfV0VBS19IQU5ETEU6IHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCBmcC0+aGFuZGxlKTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCAiCisJCQkJCSJ0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgIgorCQkJCQkiaGFuZGxlLCAlbGRcbiIsIHByb2MtPnBpZCwKKwkJCQkJdGhyZWFkLT5waWQsIGZwLT5oYW5kbGUpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mYWlsZWQ7CisJCQl9CisJCQlpZiAocmVmLT5ub2RlLT5wcm9jID09IHRhcmdldF9wcm9jKSB7CisJCQkJaWYgKGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSkKKwkJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9CSU5ERVI7CisJCQkJZWxzZQorCQkJCQlmcC0+dHlwZSA9IEJJTkRFUl9UWVBFX1dFQUtfQklOREVSOworCQkJCWZwLT5iaW5kZXIgPSByZWYtPm5vZGUtPnB0cjsKKwkJCQlmcC0+Y29va2llID0gcmVmLT5ub2RlLT5jb29raWU7CisJCQkJYmluZGVyX2luY19ub2RlKHJlZi0+bm9kZSwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfQklOREVSLCAwLCBOVUxMKTsKKwkJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgcmVmICVkIGRlc2MgJWQgLT4gbm9kZSAlZCB1JXBcbiIsCisJCQkJCSAgICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQsIHJlZi0+bm9kZS0+cHRyKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGJpbmRlcl9yZWYgKm5ld19yZWY7CisJCQkJbmV3X3JlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHRhcmdldF9wcm9jLCByZWYtPm5vZGUpOworCQkJCWlmIChuZXdfcmVmID09IE5VTEwpIHsKKwkJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7CisJCQkJfQorCQkJCWZwLT5oYW5kbGUgPSBuZXdfcmVmLT5kZXNjOworCQkJCWJpbmRlcl9pbmNfcmVmKG5ld19yZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSwgTlVMTCk7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIHJlZiAlZCBkZXNjICVkIC0+IHJlZiAlZCBkZXNjICVkIChub2RlICVkKVxuIiwKKwkJCQkJICAgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgbmV3X3JlZi0+ZGVidWdfaWQsIG5ld19yZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQpOworCQkJfQorCQl9IGJyZWFrOworCisJCWNhc2UgQklOREVSX1RZUEVfRkQ6IHsKKwkJCWludCB0YXJnZXRfZmQ7CisJCQlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCQkJaWYgKHJlcGx5KSB7CisJCQkJaWYgKCEoaW5fcmVwbHlfdG8tPmZsYWdzICYgVEZfQUNDRVBUX0ZEUykpIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHdpdGggZmQsICVsZCwgYnV0IHRhcmdldCBkb2VzIG5vdCBhbGxvdyBmZHNcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKKwkJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCQlnb3RvIGVycl9mZF9ub3RfYWxsb3dlZDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCF0YXJnZXRfbm9kZS0+YWNjZXB0X2ZkcykgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGZkLCAlbGQsIGJ1dCB0YXJnZXQgZG9lcyBub3QgYWxsb3cgZmRzXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKKwkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQkJZ290byBlcnJfZmRfbm90X2FsbG93ZWQ7CisJCQl9CisKKwkJCWZpbGUgPSBmZ2V0KGZwLT5oYW5kbGUpOworCQkJaWYgKGZpbGUgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgZmQsICVsZFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2ZnZXRfZmFpbGVkOworCQkJfQorCQkJdGFyZ2V0X2ZkID0gdGFza19nZXRfdW51c2VkX2ZkX2ZsYWdzKHRhcmdldF9wcm9jLT50c2ssIE9fQ0xPRVhFQyk7CisJCQlpZiAodGFyZ2V0X2ZkIDwgMCkgeworCQkJCWZwdXQoZmlsZSk7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2dldF91bnVzZWRfZmRfZmFpbGVkOworCQkJfQorCQkJdGFza19mZF9pbnN0YWxsKHRhcmdldF9wcm9jLT50c2ssIHRhcmdldF9mZCwgZmlsZSk7CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICBmZCAlbGQgLT4gJWRcbiIsIGZwLT5oYW5kbGUsIHRhcmdldF9mZCk7CisJCQkvKiBUT0RPOiBmcHV0PyAqLworCQkJZnAtPmhhbmRsZSA9IHRhcmdldF9mZDsKKwkJfSBicmVhazsKKworCQlkZWZhdWx0OgorCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW8iCisJCQkJIm4gd2l0aCBpbnZhbGlkIG9iamVjdCB0eXBlLCAlbHhcbiIsCisJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPnR5cGUpOworCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJZ290byBlcnJfYmFkX29iamVjdF90eXBlOworCQl9CisJfQorCWlmIChyZXBseSkgeworCQlCVUdfT04odC0+YnVmZmVyLT5hc3luY190cmFuc2FjdGlvbiAhPSAwKTsKKwkJYmluZGVyX3BvcF90cmFuc2FjdGlvbih0YXJnZXRfdGhyZWFkLCBpbl9yZXBseV90byk7CisJfSBlbHNlIGlmICghKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpIHsKKwkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMCk7CisJCXQtPm5lZWRfcmVwbHkgPSAxOworCQl0LT5mcm9tX3BhcmVudCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7CisJCXRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPSB0OworCX0gZWxzZSB7CisJCUJVR19PTih0YXJnZXRfbm9kZSA9PSBOVUxMKTsKKwkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMSk7CisJCWlmICh0YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uKSB7CisJCQl0YXJnZXRfbGlzdCA9ICZ0YXJnZXRfbm9kZS0+YXN5bmNfdG9kbzsKKwkJCXRhcmdldF93YWl0ID0gTlVMTDsKKwkJfSBlbHNlCisJCQl0YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uID0gMTsKKwl9CisJdC0+d29yay50eXBlID0gQklOREVSX1dPUktfVFJBTlNBQ1RJT047CisJbGlzdF9hZGRfdGFpbCgmdC0+d29yay5lbnRyeSwgdGFyZ2V0X2xpc3QpOworCXRjb21wbGV0ZS0+dHlwZSA9IEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCWxpc3RfYWRkX3RhaWwoJnRjb21wbGV0ZS0+ZW50cnksICZ0aHJlYWQtPnRvZG8pOworCWlmICh0YXJnZXRfd2FpdCkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHRhcmdldF93YWl0KTsKKwlyZXR1cm47CisKK2Vycl9nZXRfdW51c2VkX2ZkX2ZhaWxlZDoKK2Vycl9mZ2V0X2ZhaWxlZDoKK2Vycl9mZF9ub3RfYWxsb3dlZDoKK2Vycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ6CitlcnJfYmluZGVyX2dldF9yZWZfZmFpbGVkOgorZXJyX2JpbmRlcl9uZXdfbm9kZV9mYWlsZWQ6CitlcnJfYmFkX29iamVjdF90eXBlOgorZXJyX2JhZF9vZmZzZXQ6CitlcnJfY29weV9kYXRhX2ZhaWxlZDoKKwliaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2UodGFyZ2V0X3Byb2MsIHQtPmJ1ZmZlciwgb2ZmcCk7CisJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CisJYmluZGVyX2ZyZWVfYnVmKHRhcmdldF9wcm9jLCB0LT5idWZmZXIpOworZXJyX2JpbmRlcl9hbGxvY19idWZfZmFpbGVkOgorCWtmcmVlKHRjb21wbGV0ZSk7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFXSsrOworZXJyX2FsbG9jX3Rjb21wbGV0ZV9mYWlsZWQ6CisJa2ZyZWUodCk7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OXSsrOworZXJyX2FsbG9jX3RfZmFpbGVkOgorZXJyX2JhZF9jYWxsX3N0YWNrOgorZXJyX2VtcHR5X2NhbGxfc3RhY2s6CitlcnJfZGVhZF9iaW5kZXI6CitlcnJfaW52YWxpZF90YXJnZXRfaGFuZGxlOgorZXJyX25vX2NvbnRleHRfbWdyX25vZGU6CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCB0cmFuc2FjdGlvbiBmYWlsZWQgJWQsIHNpemUiCisJCQkJIiV6ZC0lemRcbiIsCisJCQkgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCByZXR1cm5fZXJyb3IsCisJCQkgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKworCXsKKwkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmZlOworCQlmZSA9IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKCZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZCk7CisJCSpmZSA9ICplOworCX0KKworCUJVR19PTih0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyk7CisJaWYgKGluX3JlcGx5X3RvKSB7CisJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfVFJBTlNBQ1RJT05fQ09NUExFVEU7CisJCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseShpbl9yZXBseV90bywgcmV0dXJuX2Vycm9yKTsKKwl9IGVsc2UKKwkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSByZXR1cm5fZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyLCBzaXplX3QgKmZhaWxlZF9hdCkKK3sKKwlzaXplX3QgKm9mZnAsICpvZmZfZW5kOworCWludCBkZWJ1Z19pZCA9IGJ1ZmZlci0+ZGVidWdfaWQ7CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgYnVmZmVyIHJlbGVhc2UgJWQsIHNpemUgJXpkLSV6ZCwgZmFpbGVkIGF0ICVwXG4iLAorCQkJICAgcHJvYy0+cGlkLCBidWZmZXItPmRlYnVnX2lkLAorCQkJICAgYnVmZmVyLT5kYXRhX3NpemUsIGJ1ZmZlci0+b2Zmc2V0c19zaXplLCBmYWlsZWRfYXQpOworCisJaWYgKGJ1ZmZlci0+dGFyZ2V0X25vZGUpCisJCWJpbmRlcl9kZWNfbm9kZShidWZmZXItPnRhcmdldF9ub2RlLCAxLCAwKTsKKworCW9mZnAgPSAoc2l6ZV90ICopKGJ1ZmZlci0+ZGF0YSArIEFMSUdOKGJ1ZmZlci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkpOworCWlmIChmYWlsZWRfYXQpCisJCW9mZl9lbmQgPSBmYWlsZWRfYXQ7CisJZWxzZQorCQlvZmZfZW5kID0gKHZvaWQgKilvZmZwICsgYnVmZmVyLT5vZmZzZXRzX3NpemU7CisJZm9yICg7IG9mZnAgPCBvZmZfZW5kOyBvZmZwKyspIHsKKwkJc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqZnA7CisJCWlmICgqb2ZmcCA+IGJ1ZmZlci0+ZGF0YV9zaXplIC0gc2l6ZW9mKCpmcCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCIKKwkJCQkJIm9mZnNldCAlemQsIHNpemUgJXpkXG4iLCBkZWJ1Z19pZCwgKm9mZnAsIGJ1ZmZlci0+ZGF0YV9zaXplKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZwID0gKHN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKikoYnVmZmVyLT5kYXRhICsgKm9mZnApOworCQlzd2l0Y2ggKGZwLT50eXBlKSB7CisJCWNhc2UgQklOREVSX1RZUEVfQklOREVSOgorCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfQklOREVSOiB7CisJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgZnAtPmJpbmRlcik7CisJCQlpZiAobm9kZSA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG5vZGUgJXBcbiIsIGRlYnVnX2lkLCBmcC0+YmluZGVyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIG5vZGUgJWQgdSVwXG4iLAorCQkJCSAgICAgICBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyKTsKKwkJCWJpbmRlcl9kZWNfbm9kZShub2RlLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIsIDApOworCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9UWVBFX0hBTkRMRToKKwkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTogeworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIGZwLT5oYW5kbGUpOworCQkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIGhhbmRsZSAlbGRcbiIsIGRlYnVnX2lkLCBmcC0+aGFuZGxlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIHJlZiAlZCBkZXNjICVkIChub2RlICVkKVxuIiwKKwkJCQkgICAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKKwkJCWJpbmRlcl9kZWNfcmVmKHJlZiwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfSEFORExFKTsKKwkJfSBicmVhazsKKworCQljYXNlIEJJTkRFUl9UWVBFX0ZEOgorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgZmQgJWxkXG4iLCBmcC0+aGFuZGxlKTsKKwkJCWlmIChmYWlsZWRfYXQpCisJCQkJdGFza19jbG9zZV9mZChwcm9jLT50c2ssIGZwLT5oYW5kbGUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBvYmplY3QgdHlwZSAlbHhcbiIsIGRlYnVnX2lkLCBmcC0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworaW50CitiaW5kZXJfdGhyZWFkX3dyaXRlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKKwkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIGludCBzaXplLCBzaWduZWQgbG9uZyAqY29uc3VtZWQpCit7CisJdWludDMyX3QgY21kOworCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7CisJdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7CisKKwl3aGlsZSAocHRyIDwgZW5kICYmIHRocmVhZC0+cmV0dXJuX2Vycm9yID09IEJSX09LKSB7CisJCWlmIChnZXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQlpZiAoX0lPQ19OUihjbWQpIDwgQVJSQVlfU0laRShiaW5kZXJfc3RhdHMuYmMpKSB7CisJCQliaW5kZXJfc3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOworCQkJcHJvYy0+c3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOworCQkJdGhyZWFkLT5zdGF0cy5iY1tfSU9DX05SKGNtZCldKys7CisJCX0KKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBCQ19JTkNSRUZTOgorCQljYXNlIEJDX0FDUVVJUkU6CisJCWNhc2UgQkNfUkVMRUFTRToKKwkJY2FzZSBCQ19ERUNSRUZTOiB7CisJCQl1aW50MzJfdCB0YXJnZXQ7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOworCQkJY29uc3QgY2hhciAqZGVidWdfc3RyaW5nOworCisJCQlpZiAoZ2V0X3VzZXIodGFyZ2V0LCAodWludDMyX3QgX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQkJaWYgKHRhcmdldCA9PSAwICYmIGJpbmRlcl9jb250ZXh0X21ncl9ub2RlICYmCisJCQkgICAgKGNtZCA9PSBCQ19JTkNSRUZTIHx8IGNtZCA9PSBCQ19BQ1FVSVJFKSkgeworCQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHByb2MsCisJCQkJCSAgICAgICBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSk7CisJCQkJaWYgKHJlZi0+ZGVzYyAhPSB0YXJnZXQpIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6IgorCQkJCQkJIiVkIHRyaWVkIHRvIGFjcXVpcmUgIgorCQkJCQkJInJlZmVyZW5jZSB0byBkZXNjIDAsICIKKwkJCQkJCSJnb3QgJWQgaW5zdGVhZFxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQlyZWYtPmRlc2MpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRhcmdldCk7CisJCQlpZiAocmVmID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCByZWZjb3UiCisJCQkJCSJudCBjaGFuZ2Ugb24gaW52YWxpZCByZWYgJWRcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRhcmdldCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKGNtZCkgeworCQkJY2FzZSBCQ19JTkNSRUZTOgorCQkJCWRlYnVnX3N0cmluZyA9ICJJbmNSZWZzIjsKKwkJCQliaW5kZXJfaW5jX3JlZihyZWYsIDAsIE5VTEwpOworCQkJCWJyZWFrOworCQkJY2FzZSBCQ19BQ1FVSVJFOgorCQkJCWRlYnVnX3N0cmluZyA9ICJBY3F1aXJlIjsKKwkJCQliaW5kZXJfaW5jX3JlZihyZWYsIDEsIE5VTEwpOworCQkJCWJyZWFrOworCQkJY2FzZSBCQ19SRUxFQVNFOgorCQkJCWRlYnVnX3N0cmluZyA9ICJSZWxlYXNlIjsKKwkJCQliaW5kZXJfZGVjX3JlZihyZWYsIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSBCQ19ERUNSRUZTOgorCQkJZGVmYXVsdDoKKwkJCQlkZWJ1Z19zdHJpbmcgPSAiRGVjUmVmcyI7CisJCQkJYmluZGVyX2RlY19yZWYocmVmLCAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX1JFRlMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyByZWYgJWQgZGVzYyAlZCBzICVkIHcgJWQgZm9yIG5vZGUgJWRcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRlYnVnX3N0cmluZywgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQkNfSU5DUkVGU19ET05FOgorCQljYXNlIEJDX0FDUVVJUkVfRE9ORTogeworCQkJdm9pZCBfX3VzZXIgKm5vZGVfcHRyOworCQkJdm9pZCAqY29va2llOworCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOworCisJCQlpZiAoZ2V0X3VzZXIobm9kZV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCW5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgbm9kZV9wdHIpOworCQkJaWYgKG5vZGUgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKKwkJCQkJIiVzIHUlcCBubyBtYXRjaFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJY21kID09IEJDX0lOQ1JFRlNfRE9ORSA/CisJCQkJCSJCQ19JTkNSRUZTX0RPTkUiIDoKKwkJCQkJIkJDX0FDUVVJUkVfRE9ORSIsCisJCQkJCW5vZGVfcHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjb29raWUgIT0gbm9kZS0+Y29va2llKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgJXMgdSVwIG5vZGUgJWQiCisJCQkJCSIgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQljbWQgPT0gQkNfSU5DUkVGU19ET05FID8KKwkJCQkJIkJDX0lOQ1JFRlNfRE9ORSIgOiAiQkNfQUNRVUlSRV9ET05FIiwKKwkJCQkJbm9kZV9wdHIsIG5vZGUtPmRlYnVnX2lkLAorCQkJCQljb29raWUsIG5vZGUtPmNvb2tpZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY21kID09IEJDX0FDUVVJUkVfRE9ORSkgeworCQkJCWlmIChub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPT0gMCkgeworCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCQkiQkNfQUNRVUlSRV9ET05FIG5vZGUgJWQgaGFzICIKKwkJCQkJCSJubyBwZW5kaW5nIGFjcXVpcmUgcmVxdWVzdFxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQlub2RlLT5kZWJ1Z19pZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9PSAwKSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKKwkJCQkJCSJCQ19JTkNSRUZTX0RPTkUgbm9kZSAlZCBoYXMgIgorCQkJCQkJIm5vIHBlbmRpbmcgaW5jcmVmcyByZXF1ZXN0XG4iLAorCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJCW5vZGUtPmRlYnVnX2lkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW5vZGUtPnBlbmRpbmdfd2Vha19yZWYgPSAwOworCQkJfQorCQkJYmluZGVyX2RlY19ub2RlKG5vZGUsIGNtZCA9PSBCQ19BQ1FVSVJFX0RPTkUsIDApOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1VTRVJfUkVGUykKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICVzIG5vZGUgJWQgbHMgJWQgbHcgJWRcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPyAiQkNfSU5DUkVGU19ET05FIiA6ICJCQ19BQ1FVSVJFX0RPTkUiLCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMsIG5vZGUtPmxvY2FsX3dlYWtfcmVmcyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEJDX0FUVEVNUFRfQUNRVUlSRToKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCQ19BVFRFTVBUX0FDUVVJUkUgbm90IHN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBCQ19BQ1FVSVJFX1JFU1VMVDoKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCQ19BQ1FVSVJFX1JFU1VMVCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNhc2UgQkNfRlJFRV9CVUZGRVI6IHsKKwkJCXZvaWQgX191c2VyICpkYXRhX3B0cjsKKwkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CisKKwkJCWlmIChnZXRfdXNlcihkYXRhX3B0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCisJCQlidWZmZXIgPSBiaW5kZXJfYnVmZmVyX2xvb2t1cChwcm9jLCBkYXRhX3B0cik7CisJCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCSJCQ19GUkVFX0JVRkZFUiB1JXAgbm8gbWF0Y2hcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghYnVmZmVyLT5hbGxvd191c2VyX2ZyZWUpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCSJCQ19GUkVFX0JVRkZFUiB1JXAgbWF0Y2hlZCAiCisJCQkJCSJ1bnJldHVybmVkIGJ1ZmZlclxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGF0YV9wdHIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0ZSRUVfQlVGRkVSKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfRlJFRV9CVUZGRVIgdSVwIGZvdW5kIGJ1ZmZlciAlZCBmb3IgJXMgdHJhbnNhY3Rpb25cbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyLCBidWZmZXItPmRlYnVnX2lkLAorCQkJCSAgICAgICBidWZmZXItPnRyYW5zYWN0aW9uID8gImFjdGl2ZSIgOiAiZmluaXNoZWQiKTsKKworCQkJaWYgKGJ1ZmZlci0+dHJhbnNhY3Rpb24pIHsKKwkJCQlidWZmZXItPnRyYW5zYWN0aW9uLT5idWZmZXIgPSBOVUxMOworCQkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCQkJfQorCQkJaWYgKGJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gJiYgYnVmZmVyLT50YXJnZXRfbm9kZSkgeworCQkJCUJVR19PTighYnVmZmVyLT50YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uKTsKKwkJCQlpZiAobGlzdF9lbXB0eSgmYnVmZmVyLT50YXJnZXRfbm9kZS0+YXN5bmNfdG9kbykpCisJCQkJCWJ1ZmZlci0+dGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbiA9IDA7CisJCQkJZWxzZQorCQkJCQlsaXN0X21vdmVfdGFpbChidWZmZXItPnRhcmdldF9ub2RlLT5hc3luY190b2RvLm5leHQsICZ0aHJlYWQtPnRvZG8pOworCQkJfQorCQkJYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHByb2MsIGJ1ZmZlciwgTlVMTCk7CisJCQliaW5kZXJfZnJlZV9idWYocHJvYywgYnVmZmVyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBCQ19UUkFOU0FDVElPTjoKKwkJY2FzZSBCQ19SRVBMWTogeworCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHRyOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRyLCBwdHIsIHNpemVvZih0cikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih0cik7CisJCQliaW5kZXJfdHJhbnNhY3Rpb24ocHJvYywgdGhyZWFkLCAmdHIsIGNtZCA9PSBCQ19SRVBMWSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQkNfUkVHSVNURVJfTE9PUEVSOgorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19SRUdJU1RFUl9MT09QRVJcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSB7CisJCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKKwkJCQkJIiBCQ19SRUdJU1RFUl9MT09QRVIgY2FsbGVkICIKKwkJCQkJImFmdGVyIEJDX0VOVEVSX0xPT1BFUlxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQl9IGVsc2UgaWYgKHByb2MtPnJlcXVlc3RlZF90aHJlYWRzID09IDApIHsKKwkJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQ7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IgorCQkJCQkiIEJDX1JFR0lTVEVSX0xPT1BFUiBjYWxsZWQgIgorCQkJCQkid2l0aG91dCByZXF1ZXN0XG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHMtLTsKKwkJCQlwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkKys7CisJCQl9CisJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQ7CisJCQlicmVhazsKKwkJY2FzZSBCQ19FTlRFUl9MT09QRVI6CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVEhSRUFEUykKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJDX0VOVEVSX0xPT1BFUlxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQlpZiAodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQpIHsKKwkJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQ7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IgorCQkJCQkiIEJDX0VOVEVSX0xPT1BFUiBjYWxsZWQgYWZ0ZXIgIgorCQkJCQkiQkNfUkVHSVNURVJfTE9PUEVSXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCX0KKwkJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRDsKKwkJCWJyZWFrOworCQljYXNlIEJDX0VYSVRfTE9PUEVSOgorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19FWElUX0xPT1BFUlxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0VYSVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT046CisJCWNhc2UgQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OOiB7CisJCQl1aW50MzJfdCB0YXJnZXQ7CisJCQl2b2lkIF9fdXNlciAqY29va2llOworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aDsKKworCQkJaWYgKGdldF91c2VyKHRhcmdldCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0YXJnZXQpOworCQkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgJXMgIgorCQkJCQkiaW52YWxpZCByZWYgJWRcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCWNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA/CisJCQkJCSJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIgOgorCQkJCQkiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKKwkJCQkJdGFyZ2V0KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICVzICVwIHJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZCBmb3Igbm9kZSAlZFxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkgICAgICAgY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID8KKwkJCQkgICAgICAgIkJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OIiA6CisJCQkJICAgICAgICJCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04iLAorCQkJCSAgICAgICBjb29raWUsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywKKwkJCQkgICAgICAgcmVmLT5zdHJvbmcsIHJlZi0+d2VhaywgcmVmLT5ub2RlLT5kZWJ1Z19pZCk7CisKKwkJCWlmIChjbWQgPT0gQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04pIHsKKwkJCQlpZiAocmVmLT5kZWF0aCkgeworCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolIgorCQkJCQkJImQgQkNfUkVRVUVTVF9ERUFUSF9OT1RJIgorCQkJCQkJIkZJQ0FUSU9OIGRlYXRoIG5vdGlmaWMiCisJCQkJCQkiYXRpb24gYWxyZWFkeSBzZXRcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRlYXRoID0ga3phbGxvYyhzaXplb2YoKmRlYXRoKSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKGRlYXRoID09IE5VTEwpIHsKKwkJCQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9FUlJPUjsKKwkJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTikKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgIgorCQkJCQkJCSJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiBmYWlsZWRcbiIsCisJCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQliaW5kZXJfc3RhdHMub2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfREVBVEhdKys7CisJCQkJSU5JVF9MSVNUX0hFQUQoJmRlYXRoLT53b3JrLmVudHJ5KTsKKwkJCQlkZWF0aC0+Y29va2llID0gY29va2llOworCQkJCXJlZi0+ZGVhdGggPSBkZWF0aDsKKwkJCQlpZiAocmVmLT5ub2RlLT5wcm9jID09IE5VTEwpIHsKKwkJCQkJcmVmLT5kZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVI7CisJCQkJCWlmICh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfCBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSB7CisJCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpc3RfYWRkX3RhaWwoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnksICZwcm9jLT50b2RvKTsKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChyZWYtPmRlYXRoID09IE5VTEwpIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JSIKKwkJCQkJCSJkIEJDX0NMRUFSX0RFQVRIX05PVElGSSIKKwkJCQkJCSJDQVRJT04gZGVhdGggbm90aWZpY2F0IgorCQkJCQkJImlvbiBub3QgYWN0aXZlXG4iLAorCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZWF0aCA9IHJlZi0+ZGVhdGg7CisJCQkJaWYgKGRlYXRoLT5jb29raWUgIT0gY29va2llKSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiUiCisJCQkJCQkiZCBCQ19DTEVBUl9ERUFUSF9OT1RJRkkiCisJCQkJCQkiQ0FUSU9OIGRlYXRoIG5vdGlmaWNhdCIKKwkJCQkJCSJpb24gY29va2llIG1pc21hdGNoICIKKwkJCQkJCSIlcCAhPSAlcFxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQlkZWF0aC0+Y29va2llLCBjb29raWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmVmLT5kZWF0aCA9IE5VTEw7CisJCQkJaWYgKGxpc3RfZW1wdHkoJmRlYXRoLT53b3JrLmVudHJ5KSkgeworCQkJCQlkZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OOworCQkJCQlpZiAodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgeworCQkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZ0aHJlYWQtPnRvZG8pOworCQkJCQl9IGVsc2UgeworCQkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZwcm9jLT50b2RvKTsKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlCVUdfT04oZGVhdGgtPndvcmsudHlwZSAhPSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUik7CisJCQkJCWRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUl9BTkRfQ0xFQVI7CisJCQkJfQorCQkJfQorCQl9IGJyZWFrOworCQljYXNlIEJDX0RFQURfQklOREVSX0RPTkU6IHsKKwkJCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwkJCXZvaWQgX191c2VyICpjb29raWU7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGggPSBOVUxMOworCQkJaWYgKGdldF91c2VyKGNvb2tpZSwgKHZvaWQgX191c2VyICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+ZGVsaXZlcmVkX2RlYXRoLCBlbnRyeSkgeworCQkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICp0bXBfZGVhdGggPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9yZWZfZGVhdGgsIHdvcmspOworCQkJCWlmICh0bXBfZGVhdGgtPmNvb2tpZSA9PSBjb29raWUpIHsKKwkJCQkJZGVhdGggPSB0bXBfZGVhdGg7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUikKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJDX0RFQURfQklOREVSX0RPTkUgJXAgZm91bmQgJXBcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNvb2tpZSwgZGVhdGgpOworCQkJaWYgKGRlYXRoID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBCQ19ERUFEIgorCQkJCQkiX0JJTkRFUl9ET05FICVwIG5vdCBmb3VuZFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY29va2llKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbGlzdF9kZWxfaW5pdCgmZGVhdGgtPndvcmsuZW50cnkpOworCQkJaWYgKGRlYXRoLT53b3JrLnR5cGUgPT0gQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSKSB7CisJCQkJZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjsKKwkJCQlpZiAodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgeworCQkJCQlsaXN0X2FkZF90YWlsKCZkZWF0aC0+d29yay5lbnRyeSwgJnRocmVhZC0+dG9kbyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZwcm9jLT50b2RvKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKKwkJCQl9CisJCQl9CisJCX0gYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDolZCB1bmtub3duIGNvbW1hbmQgJWRcbiIsIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkqY29uc3VtZWQgPSBwdHIgLSBidWZmZXI7CisJfQorCXJldHVybiAwOworfQorCit2b2lkCitiaW5kZXJfc3RhdF9icihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQsIHVpbnQzMl90IGNtZCkKK3sKKwlpZiAoX0lPQ19OUihjbWQpIDwgQVJSQVlfU0laRShiaW5kZXJfc3RhdHMuYnIpKSB7CisJCWJpbmRlcl9zdGF0cy5icltfSU9DX05SKGNtZCldKys7CisJCXByb2MtPnN0YXRzLmJyW19JT0NfTlIoY21kKV0rKzsKKwkJdGhyZWFkLT5zdGF0cy5icltfSU9DX05SKGNtZCldKys7CisJfQorfQorCitzdGF0aWMgaW50CitiaW5kZXJfaGFzX3Byb2Nfd29yayhzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQpCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSB8fCAodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKTsKK30KKworc3RhdGljIGludAorYmluZGVyX2hhc190aHJlYWRfd29yayhzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKSB8fCB0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyB8fAorCQkodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKTsKK30KKworc3RhdGljIGludAorYmluZGVyX3RocmVhZF9yZWFkKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKKwl2b2lkICBfX3VzZXIgKmJ1ZmZlciwgaW50IHNpemUsIHNpZ25lZCBsb25nICpjb25zdW1lZCwgaW50IG5vbl9ibG9jaykKK3sKKwl2b2lkIF9fdXNlciAqcHRyID0gYnVmZmVyICsgKmNvbnN1bWVkOworCXZvaWQgX191c2VyICplbmQgPSBidWZmZXIgKyBzaXplOworCisJaW50IHJldCA9IDA7CisJaW50IHdhaXRfZm9yX3Byb2Nfd29yazsKKworCWlmICgqY29uc3VtZWQgPT0gMCkgeworCQlpZiAocHV0X3VzZXIoQlJfTk9PUCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJfQorCityZXRyeToKKwl3YWl0X2Zvcl9wcm9jX3dvcmsgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID09IE5VTEwgJiYgbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKTsKKworCWlmICh0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyAmJiBwdHIgPCBlbmQpIHsKKwkJaWYgKHRocmVhZC0+cmV0dXJuX2Vycm9yMiAhPSBCUl9PSykgeworCQkJaWYgKHB1dF91c2VyKHRocmVhZC0+cmV0dXJuX2Vycm9yMiwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWlmIChwdHIgPT0gZW5kKQorCQkJCWdvdG8gZG9uZTsKKwkJCXRocmVhZC0+cmV0dXJuX2Vycm9yMiA9IEJSX09LOworCQl9CisJCWlmIChwdXRfdXNlcih0aHJlYWQtPnJldHVybl9lcnJvciwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfT0s7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORzsKKwlpZiAod2FpdF9mb3JfcHJvY193b3JrKQorCQlwcm9jLT5yZWFkeV90aHJlYWRzKys7CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisJaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykgeworCQlpZiAoISh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfAorCQkJCQlCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IFRocmVhZCB3YWl0aW5nICIKKwkJCQkiZm9yIHByb2Nlc3Mgd29yayBiZWZvcmUgY2FsbGluZyBCQ19SRUdJU1RFUl8iCisJCQkJIkxPT1BFUiBvciBCQ19FTlRFUl9MT09QRVIgKHN0YXRlICV4KVxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0aHJlYWQtPmxvb3Blcik7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOworCQl9CisJCWJpbmRlcl9zZXRfbmljZShwcm9jLT5kZWZhdWx0X3ByaW9yaXR5KTsKKwkJaWYgKG5vbl9ibG9jaykgeworCQkJaWYgKCFiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKQorCQkJCXJldCA9IC1FQUdBSU47CisJCX0gZWxzZQorCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX2V4Y2x1c2l2ZShwcm9jLT53YWl0LCBiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKTsKKwl9IGVsc2UgeworCQlpZiAobm9uX2Jsb2NrKSB7CisJCQlpZiAoIWJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKKwkJCQlyZXQgPSAtRUFHQUlOOworCQl9IGVsc2UKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aHJlYWQtPndhaXQsIGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSk7CisJfQorCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwlpZiAod2FpdF9mb3JfcHJvY193b3JrKQorCQlwcm9jLT5yZWFkeV90aHJlYWRzLS07CisJdGhyZWFkLT5sb29wZXIgJj0gfkJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORzsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3aGlsZSAoMSkgeworCQl1aW50MzJfdCBjbWQ7CisJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKKwkJc3RydWN0IGJpbmRlcl93b3JrICp3OworCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0ID0gTlVMTDsKKworCQlpZiAoIWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykpCisJCQl3ID0gbGlzdF9maXJzdF9lbnRyeSgmdGhyZWFkLT50b2RvLCBzdHJ1Y3QgYmluZGVyX3dvcmssIGVudHJ5KTsKKwkJZWxzZSBpZiAoIWxpc3RfZW1wdHkoJnByb2MtPnRvZG8pICYmIHdhaXRfZm9yX3Byb2Nfd29yaykKKwkJCXcgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcm9jLT50b2RvLCBzdHJ1Y3QgYmluZGVyX3dvcmssIGVudHJ5KTsKKwkJZWxzZSB7CisJCQlpZiAocHRyIC0gYnVmZmVyID09IDQgJiYgISh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk4pKSAvKiBubyBkYXRhIGFkZGVkICovCisJCQkJZ290byByZXRyeTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVuZCAtIHB0ciA8IHNpemVvZih0cikgKyA0KQorCQkJYnJlYWs7CisKKwkJc3dpdGNoICh3LT50eXBlKSB7CisJCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046IHsKKwkJCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7CisJCX0gYnJlYWs7CisJCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT05fQ09NUExFVEU6IHsKKwkJCWNtZCA9IEJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKworCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OX0NPTVBMRVRFKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQlJfVFJBTlNBQ1RJT05fQ09NUExFVEVcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCisJCQlsaXN0X2RlbCgmdy0+ZW50cnkpOworCQkJa2ZyZWUodyk7CisJCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEVdKys7CisJCX0gYnJlYWs7CisJCWNhc2UgQklOREVSX1dPUktfTk9ERTogeworCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfbm9kZSwgd29yayk7CisJCQl1aW50MzJfdCBjbWQgPSBCUl9OT09QOworCQkJY29uc3QgY2hhciAqY21kX25hbWU7CisJCQlpbnQgc3Ryb25nID0gbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMgfHwgbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnM7CisJCQlpbnQgd2VhayA9ICFobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykgfHwgbm9kZS0+bG9jYWxfd2Vha19yZWZzIHx8IHN0cm9uZzsKKwkJCWlmICh3ZWFrICYmICFub2RlLT5oYXNfd2Vha19yZWYpIHsKKwkJCQljbWQgPSBCUl9JTkNSRUZTOworCQkJCWNtZF9uYW1lID0gIkJSX0lOQ1JFRlMiOworCQkJCW5vZGUtPmhhc193ZWFrX3JlZiA9IDE7CisJCQkJbm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9IDE7CisJCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzKys7CisJCQl9IGVsc2UgaWYgKHN0cm9uZyAmJiAhbm9kZS0+aGFzX3N0cm9uZ19yZWYpIHsKKwkJCQljbWQgPSBCUl9BQ1FVSVJFOworCQkJCWNtZF9uYW1lID0gIkJSX0FDUVVJUkUiOworCQkJCW5vZGUtPmhhc19zdHJvbmdfcmVmID0gMTsKKwkJCQlub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPSAxOworCQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7CisJCQl9IGVsc2UgaWYgKCFzdHJvbmcgJiYgbm9kZS0+aGFzX3N0cm9uZ19yZWYpIHsKKwkJCQljbWQgPSBCUl9SRUxFQVNFOworCQkJCWNtZF9uYW1lID0gIkJSX1JFTEVBU0UiOworCQkJCW5vZGUtPmhhc19zdHJvbmdfcmVmID0gMDsKKwkJCX0gZWxzZSBpZiAoIXdlYWsgJiYgbm9kZS0+aGFzX3dlYWtfcmVmKSB7CisJCQkJY21kID0gQlJfREVDUkVGUzsKKwkJCQljbWRfbmFtZSA9ICJCUl9ERUNSRUZTIjsKKwkJCQlub2RlLT5oYXNfd2Vha19yZWYgPSAwOworCQkJfQorCQkJaWYgKGNtZCAhPSBCUl9OT09QKSB7CisJCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQkJCWlmIChwdXRfdXNlcihub2RlLT5wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJCWlmIChwdXRfdXNlcihub2RlLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCisJCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX1JFRlMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgJXMgJWQgdSVwIGMlcFxuIiwKKwkJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZF9uYW1lLCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0X2RlbF9pbml0KCZ3LT5lbnRyeSk7CisJCQkJaWYgKCF3ZWFrICYmICFzdHJvbmcpIHsKKwkJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIG5vZGUgJWQgdSVwIGMlcCBkZWxldGVkXG4iLAorCQkJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCQkJCXJiX2VyYXNlKCZub2RlLT5yYl9ub2RlLCAmcHJvYy0+bm9kZXMpOworCQkJCQlrZnJlZShub2RlKTsKKwkJCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX05PREVdKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIG5vZGUgJWQgdSVwIGMlcCBzdGF0ZSB1bmNoYW5nZWRcbiIsCisJCQkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJCQl9CisJCQl9CisJCX0gYnJlYWs7CisJCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6CisJCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSOgorCQljYXNlIEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogeworCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoLCB3b3JrKTsKKwkJCXVpbnQzMl90IGNtZDsKKwkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikKKwkJCQljbWQgPSBCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORTsKKwkJCWVsc2UKKwkJCQljbWQgPSBCUl9ERUFEX0JJTkRFUjsKKwkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCQlpZiAocHV0X3VzZXIoZGVhdGgtPmNvb2tpZSwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICVzICVwXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCSAgICAgICBjbWQgPT0gQlJfREVBRF9CSU5ERVIgPworCQkJCSAgICAgICAiQlJfREVBRF9CSU5ERVIiIDoKKwkJCQkgICAgICAgIkJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FIiwKKwkJCQkgICAgICAgZGVhdGgtPmNvb2tpZSk7CisKKwkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikgeworCQkJCWxpc3RfZGVsKCZ3LT5lbnRyeSk7CisJCQkJa2ZyZWUoZGVhdGgpOworCQkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9ERUFUSF0rKzsKKwkJCX0gZWxzZQorCQkJCWxpc3RfbW92ZSgmdy0+ZW50cnksICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgpOworCQkJaWYgKGNtZCA9PSBCUl9ERUFEX0JJTkRFUikKKwkJCQlnb3RvIGRvbmU7IC8qIERFQURfQklOREVSIG5vdGlmaWNhdGlvbnMgY2FuIGNhdXNlIHRyYW5zYWN0aW9ucyAqLworCQl9IGJyZWFrOworCQl9CisKKwkJaWYgKCF0KQorCQkJY29udGludWU7CisKKwkJQlVHX09OKHQtPmJ1ZmZlciA9PSBOVUxMKTsKKwkJaWYgKHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKKwkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSB0LT5idWZmZXItPnRhcmdldF9ub2RlOworCQkJdHIudGFyZ2V0LnB0ciA9IHRhcmdldF9ub2RlLT5wdHI7CisJCQl0ci5jb29raWUgPSAgdGFyZ2V0X25vZGUtPmNvb2tpZTsKKwkJCXQtPnNhdmVkX3ByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOworCQkJaWYgKHQtPnByaW9yaXR5IDwgdGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSAmJgorCQkJICAgICEodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSkKKwkJCQliaW5kZXJfc2V0X25pY2UodC0+cHJpb3JpdHkpOworCQkJZWxzZSBpZiAoISh0LT5mbGFncyAmIFRGX09ORV9XQVkpIHx8CisJCQkJIHQtPnNhdmVkX3ByaW9yaXR5ID4gdGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSkKKwkJCQliaW5kZXJfc2V0X25pY2UodGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSk7CisJCQljbWQgPSBCUl9UUkFOU0FDVElPTjsKKwkJfSBlbHNlIHsKKwkJCXRyLnRhcmdldC5wdHIgPSBOVUxMOworCQkJdHIuY29va2llID0gTlVMTDsKKwkJCWNtZCA9IEJSX1JFUExZOworCQl9CisJCXRyLmNvZGUgPSB0LT5jb2RlOworCQl0ci5mbGFncyA9IHQtPmZsYWdzOworCQl0ci5zZW5kZXJfZXVpZCA9IHQtPnNlbmRlcl9ldWlkOworCisJCWlmICh0LT5mcm9tKSB7CisJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlbmRlciA9IHQtPmZyb20tPnByb2MtPnRzazsKKwkJCXRyLnNlbmRlcl9waWQgPSB0YXNrX3RnaWRfbnJfbnMoc2VuZGVyLCBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnMpOworCQl9IGVsc2UgeworCQkJdHIuc2VuZGVyX3BpZCA9IDA7CisJCX0KKworCQl0ci5kYXRhX3NpemUgPSB0LT5idWZmZXItPmRhdGFfc2l6ZTsKKwkJdHIub2Zmc2V0c19zaXplID0gdC0+YnVmZmVyLT5vZmZzZXRzX3NpemU7CisJCXRyLmRhdGEucHRyLmJ1ZmZlciA9ICh2b2lkICopKCh2b2lkICopdC0+YnVmZmVyLT5kYXRhICsgcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0KTsKKwkJdHIuZGF0YS5wdHIub2Zmc2V0cyA9IHRyLmRhdGEucHRyLmJ1ZmZlciArIEFMSUdOKHQtPmJ1ZmZlci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSk7CisKKwkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCWlmIChjb3B5X3RvX3VzZXIocHRyLCAmdHIsIHNpemVvZih0cikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodHIpOworCisJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyAlZCAlZDolZCwgY21kICVkIgorCQkJCSJzaXplICV6ZC0lemQgcHRyICVwLSVwXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkgICAgICAgKGNtZCA9PSBCUl9UUkFOU0FDVElPTikgPyAiQlJfVFJBTlNBQ1RJT04iIDogIkJSX1JFUExZIiwKKwkJCSAgICAgICB0LT5kZWJ1Z19pZCwgdC0+ZnJvbSA/IHQtPmZyb20tPnByb2MtPnBpZCA6IDAsCisJCQkgICAgICAgdC0+ZnJvbSA/IHQtPmZyb20tPnBpZCA6IDAsIGNtZCwKKwkJCSAgICAgICB0LT5idWZmZXItPmRhdGFfc2l6ZSwgdC0+YnVmZmVyLT5vZmZzZXRzX3NpemUsCisJCQkgICAgICAgdHIuZGF0YS5wdHIuYnVmZmVyLCB0ci5kYXRhLnB0ci5vZmZzZXRzKTsKKworCQlsaXN0X2RlbCgmdC0+d29yay5lbnRyeSk7CisJCXQtPmJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlID0gMTsKKwkJaWYgKGNtZCA9PSBCUl9UUkFOU0FDVElPTiAmJiAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpIHsKKwkJCXQtPnRvX3BhcmVudCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7CisJCQl0LT50b190aHJlYWQgPSB0aHJlYWQ7CisJCQl0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID0gdDsKKwkJfSBlbHNlIHsKKwkJCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCQkJa2ZyZWUodCk7CisJCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05dKys7CisJCX0KKwkJYnJlYWs7CisJfQorCitkb25lOgorCisJKmNvbnN1bWVkID0gcHRyIC0gYnVmZmVyOworCWlmIChwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcyArIHByb2MtPnJlYWR5X3RocmVhZHMgPT0gMCAmJgorCSAgICBwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkIDwgcHJvYy0+bWF4X3RocmVhZHMgJiYKKwkgICAgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8CisJICAgICBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSAvKiB0aGUgdXNlci1zcGFjZSBjb2RlIGZhaWxzIHRvICovCisJICAgICAvKnNwYXduIGEgbmV3IHRocmVhZCBpZiB3ZSBsZWF2ZSB0aGlzIG91dCAqLykgeworCQlwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcysrOworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVEhSRUFEUykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQlJfU1BBV05fTE9PUEVSXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQlpZiAocHV0X3VzZXIoQlJfU1BBV05fTE9PUEVSLCAodWludDMyX3QgX191c2VyICopYnVmZmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmluZGVyX3JlbGVhc2Vfd29yayhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJdyA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7CisJCWxpc3RfZGVsX2luaXQoJnctPmVudHJ5KTsKKwkJc3dpdGNoICh3LT50eXBlKSB7CisJCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046IHsKKwkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7CisJCQlpZiAodC0+YnVmZmVyLT50YXJnZXRfbm9kZSAmJiAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpCisJCQkJYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KHQsIEJSX0RFQURfUkVQTFkpOworCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOiB7CisJCQlrZnJlZSh3KTsKKwkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURV0rKzsKKwkJfSBicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqYmluZGVyX2dldF90aHJlYWQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQoreworCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT50aHJlYWRzLnJiX25vZGU7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXRocmVhZCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl90aHJlYWQsIHJiX25vZGUpOworCisJCWlmIChjdXJyZW50LT5waWQgPCB0aHJlYWQtPnBpZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoY3VycmVudC0+cGlkID4gdGhyZWFkLT5waWQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlicmVhazsKKwl9CisJaWYgKCpwID09IE5VTEwpIHsKKwkJdGhyZWFkID0ga3phbGxvYyhzaXplb2YoKnRocmVhZCksIEdGUF9LRVJORUwpOworCQlpZiAodGhyZWFkID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1RIUkVBRF0rKzsKKwkJdGhyZWFkLT5wcm9jID0gcHJvYzsKKwkJdGhyZWFkLT5waWQgPSBjdXJyZW50LT5waWQ7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRocmVhZC0+d2FpdCk7CisJCUlOSVRfTElTVF9IRUFEKCZ0aHJlYWQtPnRvZG8pOworCQlyYl9saW5rX25vZGUoJnRocmVhZC0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZ0aHJlYWQtPnJiX25vZGUsICZwcm9jLT50aHJlYWRzKTsKKwkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKKwkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKKwkJdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0gQlJfT0s7CisJfQorCXJldHVybiB0aHJlYWQ7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX2ZyZWVfdGhyZWFkKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCkKK3sKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnNlbmRfcmVwbHkgPSBOVUxMOworCWludCBhY3RpdmVfdHJhbnNhY3Rpb25zID0gMDsKKworCXJiX2VyYXNlKCZ0aHJlYWQtPnJiX25vZGUsICZwcm9jLT50aHJlYWRzKTsKKwl0ID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKKwlpZiAodCAmJiB0LT50b190aHJlYWQgPT0gdGhyZWFkKQorCQlzZW5kX3JlcGx5ID0gdDsKKwl3aGlsZSAodCkgeworCQlhY3RpdmVfdHJhbnNhY3Rpb25zKys7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiByZWxlYXNlICVkOiVkIHRyYW5zYWN0aW9uICVkICVzLCBzdGlsbCBhY3RpdmVcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdC0+ZGVidWdfaWQsICh0LT50b190aHJlYWQgPT0gdGhyZWFkKSA/ICJpbiIgOiAib3V0Iik7CisJCWlmICh0LT50b190aHJlYWQgPT0gdGhyZWFkKSB7CisJCQl0LT50b19wcm9jID0gTlVMTDsKKwkJCXQtPnRvX3RocmVhZCA9IE5VTEw7CisJCQlpZiAodC0+YnVmZmVyKSB7CisJCQkJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CisJCQkJdC0+YnVmZmVyID0gTlVMTDsKKwkJCX0KKwkJCXQgPSB0LT50b19wYXJlbnQ7CisJCX0gZWxzZSBpZiAodC0+ZnJvbSA9PSB0aHJlYWQpIHsKKwkJCXQtPmZyb20gPSBOVUxMOworCQkJdCA9IHQtPmZyb21fcGFyZW50OworCQl9IGVsc2UKKwkJCUJVRygpOworCX0KKwlpZiAoc2VuZF9yZXBseSkKKwkJYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KHNlbmRfcmVwbHksIEJSX0RFQURfUkVQTFkpOworCWJpbmRlcl9yZWxlYXNlX3dvcmsoJnRocmVhZC0+dG9kbyk7CisJa2ZyZWUodGhyZWFkKTsKKwliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVEhSRUFEXSsrOworCXJldHVybiBhY3RpdmVfdHJhbnNhY3Rpb25zOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJpbmRlcl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSBOVUxMOworCWludCB3YWl0X2Zvcl9wcm9jX3dvcms7CisKKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJdGhyZWFkID0gYmluZGVyX2dldF90aHJlYWQocHJvYyk7CisKKwl3YWl0X2Zvcl9wcm9jX3dvcmsgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID09IE5VTEwgJiYKKwkJbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKSAmJiB0aHJlYWQtPnJldHVybl9lcnJvciA9PSBCUl9PSzsKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKworCWlmICh3YWl0X2Zvcl9wcm9jX3dvcmspIHsKKwkJaWYgKGJpbmRlcl9oYXNfcHJvY193b3JrKHByb2MsIHRocmVhZCkpCisJCQlyZXR1cm4gUE9MTElOOworCQlwb2xsX3dhaXQoZmlscCwgJnByb2MtPndhaXQsIHdhaXQpOworCQlpZiAoYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSkKKwkJCXJldHVybiBQT0xMSU47CisJfSBlbHNlIHsKKwkJaWYgKGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKKwkJCXJldHVybiBQT0xMSU47CisJCXBvbGxfd2FpdChmaWxwLCAmdGhyZWFkLT53YWl0LCB3YWl0KTsKKwkJaWYgKGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKKwkJCXJldHVybiBQT0xMSU47CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBiaW5kZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQ7CisJdW5zaWduZWQgaW50IHNpemUgPSBfSU9DX1NJWkUoY21kKTsKKwl2b2lkIF9fdXNlciAqdWJ1ZiA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX2lvY3RsOiAlZDolZCAleCAlbHhcbiIsIHByb2MtPnBpZCwgY3VycmVudC0+cGlkLCBjbWQsIGFyZyk7Ki8KKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwl0aHJlYWQgPSBiaW5kZXJfZ2V0X3RocmVhZChwcm9jKTsKKwlpZiAodGhyZWFkID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEJJTkRFUl9XUklURV9SRUFEOiB7CisJCXN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCBid3I7CisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZid3IsIHVidWYsIHNpemVvZihid3IpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19SRUFEX1dSSVRFKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCB3cml0ZSAlbGQgYXQgJTA4bHgsIHJlYWQgJWxkIGF0ICUwOGx4XG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGJ3ci53cml0ZV9zaXplLCBid3Iud3JpdGVfYnVmZmVyLCBid3IucmVhZF9zaXplLCBid3IucmVhZF9idWZmZXIpOworCQlpZiAoYndyLndyaXRlX3NpemUgPiAwKSB7CisJCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3dyaXRlKHByb2MsIHRocmVhZCwgKHZvaWQgX191c2VyICopYndyLndyaXRlX2J1ZmZlciwgYndyLndyaXRlX3NpemUsICZid3Iud3JpdGVfY29uc3VtZWQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlid3IucmVhZF9jb25zdW1lZCA9IDA7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCAmYndyLCBzaXplb2YoYndyKSkpCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwkJaWYgKGJ3ci5yZWFkX3NpemUgPiAwKSB7CisJCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3JlYWQocHJvYywgdGhyZWFkLCAodm9pZCBfX3VzZXIgKilid3IucmVhZF9idWZmZXIsIGJ3ci5yZWFkX3NpemUsICZid3IucmVhZF9jb25zdW1lZCwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQkJaWYgKCFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSkKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByb2MtPndhaXQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKHVidWYsICZid3IsIHNpemVvZihid3IpKSkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfUkVBRF9XUklURSkKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgd3JvdGUgJWxkIG9mICVsZCwgcmVhZCByZXR1cm4gJWxkIG9mICVsZFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBid3Iud3JpdGVfY29uc3VtZWQsIGJ3ci53cml0ZV9zaXplLCBid3IucmVhZF9jb25zdW1lZCwgYndyLnJlYWRfc2l6ZSk7CisJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnI7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQklOREVSX1NFVF9NQVhfVEhSRUFEUzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwcm9jLT5tYXhfdGhyZWFkcywgdWJ1Ziwgc2l6ZW9mKHByb2MtPm1heF90aHJlYWRzKSkpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKwljYXNlIEJJTkRFUl9TRVRfQ09OVEVYVF9NR1I6CisJCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAhPSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQklOREVSX1NFVF9DT05URVhUX01HUiBhbHJlYWR5IHNldFxuIik7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX3VpZCAhPSAtMSkgeworCQkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl91aWQgIT0gY3VycmVudC0+Y3JlZC0+ZXVpZCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCSU5ERVJfU0VUXyIKKwkJCQkgICAgICAgIkNPTlRFWFRfTUdSIGJhZCB1aWQgJWQgIT0gJWRcbiIsCisJCQkJICAgICAgIGN1cnJlbnQtPmNyZWQtPmV1aWQsCisJCQkJICAgICAgIGJpbmRlcl9jb250ZXh0X21ncl91aWQpOworCQkJCXJldCA9IC1FUEVSTTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfSBlbHNlCisJCQliaW5kZXJfY29udGV4dF9tZ3JfdWlkID0gY3VycmVudC0+Y3JlZC0+ZXVpZDsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPSBiaW5kZXJfbmV3X25vZGUocHJvYywgTlVMTCwgTlVMTCk7CisJCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmxvY2FsX3dlYWtfcmVmcysrOworCQliaW5kZXJfY29udGV4dF9tZ3Jfbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMrKzsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmhhc19zdHJvbmdfcmVmID0gMTsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmhhc193ZWFrX3JlZiA9IDE7CisJCWJyZWFrOworCWNhc2UgQklOREVSX1RIUkVBRF9FWElUOgorCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVEhSRUFEUykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgZXhpdFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJYmluZGVyX2ZyZWVfdGhyZWFkKHByb2MsIHRocmVhZCk7CisJCXRocmVhZCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgQklOREVSX1ZFUlNJT046CisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKHB1dF91c2VyKEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04sICYoKHN0cnVjdCBiaW5kZXJfdmVyc2lvbiAqKXVidWYpLT5wcm90b2NvbF92ZXJzaW9uKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSAwOworZXJyOgorCWlmICh0aHJlYWQpCisJCXRocmVhZC0+bG9vcGVyICY9IH5CSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOOworCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMik7CisJaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIGlvY3RsICV4ICVseCByZXR1cm5lZCAlZFxuIiwgcHJvYy0+cGlkLCBjdXJyZW50LT5waWQsIGNtZCwgYXJnLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZCBvcGVuIHZtIGFyZWEgJWx4LSVseCAoJWxkIEspIHZtYSAlbHggcGFnZXAgJWx4XG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIFNaXzFLLCB2bWEtPnZtX2ZsYWdzLCB2bWEtPnZtX3BhZ2VfcHJvdC5wZ3Byb3QpOworCWR1bXBfc3RhY2soKTsKK30KK3N0YXRpYyB2b2lkIGJpbmRlcl92bWFfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgY2xvc2Ugdm0gYXJlYSAlbHgtJWx4ICglbGQgSykgdm1hICVseCBwYWdlcCAlbHhcbiIsIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsIHZtYS0+dm1fcGFnZV9wcm90LnBncHJvdCk7CisJcHJvYy0+dm1hID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBiaW5kZXJfdm1fb3BzID0geworCS5vcGVuID0gYmluZGVyX3ZtYV9vcGVuLAorCS5jbG9zZSA9IGJpbmRlcl92bWFfY2xvc2UsCit9OworCitzdGF0aWMgaW50IGJpbmRlcl9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IGNoYXIgKmZhaWx1cmVfc3RyaW5nOworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CisKKwlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPiBTWl80TSkKKwkJdm1hLT52bV9lbmQgPSB2bWEtPnZtX3N0YXJ0ICsgU1pfNE07CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX21tYXA6ICVkICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBTWl8xSywgdm1hLT52bV9mbGFncywgdm1hLT52bV9wYWdlX3Byb3QucGdwcm90KTsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgRk9SQklEREVOX01NQVBfRkxBR1MpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlmYWlsdXJlX3N0cmluZyA9ICJiYWQgdm1fZmxhZ3MiOworCQlnb3RvIGVycl9iYWRfYXJnOworCX0KKwl2bWEtPnZtX2ZsYWdzID0gKHZtYS0+dm1fZmxhZ3MgfCBWTV9ET05UQ09QWSkgJiB+Vk1fTUFZV1JJVEU7CisKKwlhcmVhID0gZ2V0X3ZtX2FyZWEodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCBWTV9JT1JFTUFQKTsKKwlpZiAoYXJlYSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWZhaWx1cmVfc3RyaW5nID0gImdldF92bV9hcmVhIjsKKwkJZ290byBlcnJfZ2V0X3ZtX2FyZWFfZmFpbGVkOworCX0KKwlwcm9jLT5idWZmZXIgPSBhcmVhLT5hZGRyOworCXByb2MtPnVzZXJfYnVmZmVyX29mZnNldCA9IHZtYS0+dm1fc3RhcnQgLSAoc2l6ZV90KXByb2MtPmJ1ZmZlcjsKKworI2lmZGVmIENPTkZJR19DUFVfQ0FDSEVfVklQVAorCWlmIChjYWNoZV9pc192aXB0X2FsaWFzaW5nKCkpIHsKKwkJd2hpbGUgKENBQ0hFX0NPTE9VUigodm1hLT52bV9zdGFydCBeICh1aW50MzJfdClwcm9jLT5idWZmZXIpKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX21tYXA6ICVkICVseC0lbHggbWFwcyAlcCBiYWQgYWxpZ25tZW50XG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBwcm9jLT5idWZmZXIpOworCQkJdm1hLT52bV9zdGFydCArPSBQQUdFX1NJWkU7CisJCX0KKwl9CisjZW5kaWYKKwlwcm9jLT5wYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKHByb2MtPnBhZ2VzWzBdKSAqICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIFBBR0VfU0laRSksIEdGUF9LRVJORUwpOworCWlmIChwcm9jLT5wYWdlcyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWZhaWx1cmVfc3RyaW5nID0gImFsbG9jIHBhZ2UgYXJyYXkiOworCQlnb3RvIGVycl9hbGxvY19wYWdlc19mYWlsZWQ7CisJfQorCXByb2MtPmJ1ZmZlcl9zaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCisJdm1hLT52bV9vcHMgPSAmYmluZGVyX3ZtX29wczsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHByb2M7CisKKwlpZiAoYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDEsIHByb2MtPmJ1ZmZlciwgcHJvYy0+YnVmZmVyICsgUEFHRV9TSVpFLCB2bWEpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWZhaWx1cmVfc3RyaW5nID0gImFsbG9jIHNtYWxsIGJ1ZiI7CisJCWdvdG8gZXJyX2FsbG9jX3NtYWxsX2J1Zl9mYWlsZWQ7CisJfQorCWJ1ZmZlciA9IHByb2MtPmJ1ZmZlcjsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYy0+YnVmZmVycyk7CisJbGlzdF9hZGQoJmJ1ZmZlci0+ZW50cnksICZwcm9jLT5idWZmZXJzKTsKKwlidWZmZXItPmZyZWUgPSAxOworCWJpbmRlcl9pbnNlcnRfZnJlZV9idWZmZXIocHJvYywgYnVmZmVyKTsKKwlwcm9jLT5mcmVlX2FzeW5jX3NwYWNlID0gcHJvYy0+YnVmZmVyX3NpemUgLyAyOworCWJhcnJpZXIoKTsKKwlwcm9jLT52bWEgPSB2bWE7CisKKwkvKnByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4IG1hcHMgJXBcbiIsIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHByb2MtPmJ1ZmZlcik7Ki8KKwlyZXR1cm4gMDsKKworZXJyX2FsbG9jX3NtYWxsX2J1Zl9mYWlsZWQ6CisJa2ZyZWUocHJvYy0+cGFnZXMpOworZXJyX2FsbG9jX3BhZ2VzX2ZhaWxlZDoKKwl2ZnJlZShwcm9jLT5idWZmZXIpOworZXJyX2dldF92bV9hcmVhX2ZhaWxlZDoKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKK2Vycl9iYWRfYXJnOgorCXByaW50ayhLRVJOX0VSUiAiYmluZGVyX21tYXA6ICVkICVseC0lbHggJXMgZmFpbGVkICVkXG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBmYWlsdXJlX3N0cmluZywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJpbmRlcl9vcGVuKHN0cnVjdCBpbm9kZSAqbm9kcCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9vcGVuOiAlZDolZFxuIiwgY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5waWQsIGN1cnJlbnQtPnBpZCk7CisKKwlwcm9jID0ga3phbGxvYyhzaXplb2YoKnByb2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJvYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlnZXRfdGFza19zdHJ1Y3QoY3VycmVudCk7CisJcHJvYy0+dHNrID0gY3VycmVudDsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYy0+dG9kbyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJvYy0+d2FpdCk7CisJcHJvYy0+ZGVmYXVsdF9wcmlvcml0eSA9IHRhc2tfbmljZShjdXJyZW50KTsKKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1BST0NdKys7CisJaGxpc3RfYWRkX2hlYWQoJnByb2MtPnByb2Nfbm9kZSwgJmJpbmRlcl9wcm9jcyk7CisJcHJvYy0+cGlkID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5waWQ7CisJSU5JVF9MSVNUX0hFQUQoJnByb2MtPmRlbGl2ZXJlZF9kZWF0aCk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gcHJvYzsKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKworCWlmIChiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYykgeworCQljaGFyIHN0cmJ1ZlsxMV07CisJCXNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksICIldSIsIHByb2MtPnBpZCk7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoc3RyYnVmLCBTX0lSVUdPLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYywgYmluZGVyX3JlYWRfcHJvY19wcm9jLCBwcm9jKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW5kZXJfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm47CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCB3YWtlX2NvdW50ID0gMDsKKworCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpIHsKKwkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKKwkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKKwkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9XQUlUSU5HKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRocmVhZC0+d2FpdCk7CisJCQl3YWtlX2NvdW50Kys7CisJCX0KKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmcHJvYy0+d2FpdCk7CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX2ZsdXNoOiAlZCB3b2tlICVkIHRocmVhZHNcbiIsIHByb2MtPnBpZCwgd2FrZV9jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW5kZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKm5vZHAsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHRocmVhZHMsIG5vZGVzLCBpbmNvbWluZ19yZWZzLCBvdXRnb2luZ19yZWZzLCBidWZmZXJzLCBhY3RpdmVfdHJhbnNhY3Rpb25zLCBwYWdlX2NvdW50OworCisJaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jKSB7CisJCWNoYXIgc3RyYnVmWzExXTsKKwkJc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwgIiV1IiwgcHJvYy0+cGlkKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoc3RyYnVmLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyk7CisJfQorCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwlobGlzdF9kZWwoJnByb2MtPnByb2Nfbm9kZSk7CisJaWYgKGJpbmRlcl9jb250ZXh0X21ncl9ub2RlICYmIGJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5wcm9jID09IHByb2MpIHsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX3JlbGVhc2U6ICVkIGNvbnRleHRfbWdyX25vZGUgZ29uZVxuIiwgcHJvYy0+cGlkKTsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPSBOVUxMOworCX0KKworCXRocmVhZHMgPSAwOworCWFjdGl2ZV90cmFuc2FjdGlvbnMgPSAwOworCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKSkpIHsKKwkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKKwkJdGhyZWFkcysrOworCQlhY3RpdmVfdHJhbnNhY3Rpb25zICs9IGJpbmRlcl9mcmVlX3RocmVhZChwcm9jLCB0aHJlYWQpOworCX0KKwlub2RlcyA9IDA7CisJaW5jb21pbmdfcmVmcyA9IDA7CisJd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKSkpIHsKKwkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9ub2RlLCByYl9ub2RlKTsKKworCQlub2RlcysrOworCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKKwkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+d29yay5lbnRyeSk7CisJCWlmIChobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykpIHsKKwkJCWtmcmVlKG5vZGUpOworCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX05PREVdKys7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOworCQkJaW50IGRlYXRoID0gMDsKKworCQkJbm9kZS0+cHJvYyA9IE5VTEw7CisJCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcyA9IDA7CisJCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMgPSAwOworCQkJaGxpc3RfYWRkX2hlYWQoJm5vZGUtPmRlYWRfbm9kZSwgJmJpbmRlcl9kZWFkX25vZGVzKTsKKworCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KSB7CisJCQkJaW5jb21pbmdfcmVmcysrOworCQkJCWlmIChyZWYtPmRlYXRoKSB7CisJCQkJCWRlYXRoKys7CisJCQkJCWlmIChsaXN0X2VtcHR5KCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5KSkgeworCQkJCQkJcmVmLT5kZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVI7CisJCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmcmVmLT5wcm9jLT50b2RvKTsKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVmLT5wcm9jLT53YWl0KTsKKwkJCQkJfSBlbHNlCisJCQkJCQlCVUcoKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiBub2RlICVkIG5vdyBkZWFkLCByZWZzICVkLCBkZWF0aCAlZFxuIiwgbm9kZS0+ZGVidWdfaWQsIGluY29taW5nX3JlZnMsIGRlYXRoKTsKKwkJfQorCX0KKwlvdXRnb2luZ19yZWZzID0gMDsKKwl3aGlsZSAoKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKSkpIHsKKwkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOworCQlvdXRnb2luZ19yZWZzKys7CisJCWJpbmRlcl9kZWxldGVfcmVmKHJlZik7CisJfQorCWJpbmRlcl9yZWxlYXNlX3dvcmsoJnByb2MtPnRvZG8pOworCWJ1ZmZlcnMgPSAwOworCisJd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKSkpIHsKKwkJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKKwkJdCA9IGJ1ZmZlci0+dHJhbnNhY3Rpb247CisJCWlmICh0KSB7CisJCQl0LT5idWZmZXIgPSBOVUxMOworCQkJYnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogcmVsZWFzZSBwcm9jICVkLCB0cmFuc2FjdGlvbiAlZCwgbm90IGZyZWVkXG4iLCBwcm9jLT5waWQsIHQtPmRlYnVnX2lkKTsKKwkJCS8qQlVHKCk7Ki8KKwkJfQorCQliaW5kZXJfZnJlZV9idWYocHJvYywgYnVmZmVyKTsKKwkJYnVmZmVycysrOworCX0KKworCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9QUk9DXSsrOworCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCisJcGFnZV9jb3VudCA9IDA7CisJaWYgKHByb2MtPnBhZ2VzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcHJvYy0+YnVmZmVyX3NpemUgLyBQQUdFX1NJWkU7IGkrKykgeworCQkJaWYgKHByb2MtPnBhZ2VzW2ldKSB7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX3JlbGVhc2U6ICVkOiBwYWdlICVkIGF0ICVwIG5vdCBmcmVlZFxuIiwgcHJvYy0+cGlkLCBpLCBwcm9jLT5idWZmZXIgKyBpICogUEFHRV9TSVpFKTsKKwkJCQlfX2ZyZWVfcGFnZShwcm9jLT5wYWdlc1tpXSk7CisJCQkJcGFnZV9jb3VudCsrOworCQkJfQorCQl9CisJCWtmcmVlKHByb2MtPnBhZ2VzKTsKKwkJdmZyZWUocHJvYy0+YnVmZmVyKTsKKwl9CisKKwlwdXRfdGFza19zdHJ1Y3QocHJvYy0+dHNrKTsKKworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19PUEVOX0NMT1NFKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXJfcmVsZWFzZTogJWQgdGhyZWFkcyAlZCwgbm9kZXMgJWQgKHJlZiAlZCksIHJlZnMgJWQsIGFjdGl2ZSB0cmFuc2FjdGlvbnMgJWQsIGJ1ZmZlcnMgJWQsIHBhZ2VzICVkXG4iLAorCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWRzLCBub2RlcywgaW5jb21pbmdfcmVmcywgb3V0Z29pbmdfcmVmcywgYWN0aXZlX3RyYW5zYWN0aW9ucywgYnVmZmVycywgcGFnZV9jb3VudCk7CisKKwlrZnJlZShwcm9jKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl90cmFuc2FjdGlvbihjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KQoreworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzICVkOiAlcCBmcm9tICVkOiVkIHRvICVkOiVkIGNvZGUgJXggZmxhZ3MgJXggcHJpICVsZCByJWQiLAorCQkJcHJlZml4LCB0LT5kZWJ1Z19pZCwgdCwgdC0+ZnJvbSA/IHQtPmZyb20tPnByb2MtPnBpZCA6IDAsCisJCQl0LT5mcm9tID8gdC0+ZnJvbS0+cGlkIDogMCwKKwkJCXQtPnRvX3Byb2MgPyB0LT50b19wcm9jLT5waWQgOiAwLAorCQkJdC0+dG9fdGhyZWFkID8gdC0+dG9fdGhyZWFkLT5waWQgOiAwLAorCQkJdC0+Y29kZSwgdC0+ZmxhZ3MsIHQtPnByaW9yaXR5LCB0LT5uZWVkX3JlcGx5KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwlpZiAodC0+YnVmZmVyID09IE5VTEwpIHsKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIGJ1ZmZlciBmcmVlXG4iKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisJaWYgKHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIG5vZGUgJWQiLAorCQkJCXQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUtPmRlYnVnX2lkKTsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlyZXR1cm4gYnVmOworCX0KKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgc2l6ZSAlemQ6JXpkIGRhdGEgJXBcbiIsCisJCQl0LT5idWZmZXItPmRhdGFfc2l6ZSwgdC0+YnVmZmVyLT5vZmZzZXRzX3NpemUsCisJCQl0LT5idWZmZXItPmRhdGEpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfYnVmZmVyKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXMgJWQ6ICVwIHNpemUgJXpkOiV6ZCAlc1xuIiwKKwkJCXByZWZpeCwgYnVmZmVyLT5kZWJ1Z19pZCwgYnVmZmVyLT5kYXRhLAorCQkJYnVmZmVyLT5kYXRhX3NpemUsIGJ1ZmZlci0+b2Zmc2V0c19zaXplLAorCQkJYnVmZmVyLT50cmFuc2FjdGlvbiA/ICJhY3RpdmUiIDogImRlbGl2ZXJlZCIpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfd29yayhjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LAorCWNvbnN0IGNoYXIgKnRyYW5zYWN0aW9uX3ByZWZpeCwgc3RydWN0IGJpbmRlcl93b3JrICp3KQoreworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OworCisJc3dpdGNoICh3LT50eXBlKSB7CisJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTjoKKwkJdCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uLCB3b3JrKTsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCB0cmFuc2FjdGlvbl9wcmVmaXgsIHQpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOgorCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCisJCQkJIiVzdHJhbnNhY3Rpb24gY29tcGxldGVcbiIsIHByZWZpeCk7CisJCWJyZWFrOworCWNhc2UgQklOREVSX1dPUktfTk9ERToKKwkJbm9kZSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHdvcmspOworCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlc25vZGUgd29yayAlZDogdSVwIGMlcFxuIiwKKwkJCQlwcmVmaXgsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCWJyZWFrOworCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzaGFzIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUjoKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAorCQkJCSIlc2hhcyBjbGVhcmVkIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjoKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAorCQkJCSIlc2hhcyBjbGVhcmVkIGRlYXRoIG5vdGlmaWNhdGlvblxuIiwgcHJlZml4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXN1bmtub3duIHdvcms6IHR5cGUgJWRcbiIsCisJCQkJcHJlZml4LCB3LT50eXBlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfdGhyZWFkKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLCBpbnQgcHJpbnRfYWx3YXlzKQoreworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7CisJc3RydWN0IGJpbmRlcl93b3JrICp3OworCWNoYXIgKnN0YXJ0X2J1ZiA9IGJ1ZjsKKwljaGFyICpoZWFkZXJfYnVmOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICB0aHJlYWQgJWQ6IGwgJTAyeFxuIiwgdGhyZWFkLT5waWQsIHRocmVhZC0+bG9vcGVyKTsKKwloZWFkZXJfYnVmID0gYnVmOworCXQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOworCXdoaWxlICh0KSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWlmICh0LT5mcm9tID09IHRocmVhZCkgeworCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCAiICAgIG91dGdvaW5nIHRyYW5zYWN0aW9uIiwgdCk7CisJCQl0ID0gdC0+ZnJvbV9wYXJlbnQ7CisJCX0gZWxzZSBpZiAodC0+dG9fdGhyZWFkID09IHRocmVhZCkgeworCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCAiICAgIGluY29taW5nIHRyYW5zYWN0aW9uIiwgdCk7CisJCQl0ID0gdC0+dG9fcGFyZW50OworCQl9IGVsc2UgeworCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCAiICAgIGJhZCB0cmFuc2FjdGlvbiIsIHQpOworCQkJdCA9IE5VTEw7CisJCX0KKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmdGhyZWFkLT50b2RvLCBlbnRyeSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgICAiLAorCQkJCQkiICAgIHBlbmRpbmcgdHJhbnNhY3Rpb24iLCB3KTsKKwl9CisJaWYgKCFwcmludF9hbHdheXMgJiYgYnVmID09IGhlYWRlcl9idWYpCisJCWJ1ZiA9IHN0YXJ0X2J1ZjsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX25vZGUoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJc3RydWN0IGJpbmRlcl93b3JrICp3OworCWludCBjb3VudDsKKwljb3VudCA9IDA7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KQorCQljb3VudCsrOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBub2RlICVkOiB1JXAgYyVwIGhzICVkIGh3ICVkIGxzICVkIGx3ICVkIGlzICVkIGl3ICVkIiwKKwkJCW5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSwKKwkJCW5vZGUtPmhhc19zdHJvbmdfcmVmLCBub2RlLT5oYXNfd2Vha19yZWYsCisJCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcywgbm9kZS0+bG9jYWxfd2Vha19yZWZzLAorCQkJbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwlpZiAoY291bnQpIHsKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIHByb2MiKTsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlyZXR1cm4gYnVmOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeShyZWYsIHBvcywgJm5vZGUtPnJlZnMsIG5vZGVfZW50cnkpIHsKKwkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAlZCIsIHJlZi0+cHJvYy0+cGlkKTsKKwkJCWlmIChidWYgPj0gZW5kKQorCQkJCXJldHVybiBidWY7CisJCX0KKwl9CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiXG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZub2RlLT5hc3luY190b2RvLCBlbnRyeSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgICAiLAorCQkJCQkiICAgIHBlbmRpbmcgYXN5bmMgdHJhbnNhY3Rpb24iLCB3KTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9yZWYoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfcmVmICpyZWYpCit7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZWYgJWQ6IGRlc2MgJWQgJXNub2RlICVkIHMgJWQgdyAlZCBkICVwXG4iLAorCQkJcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPnByb2MgPyAiIiA6ICJkZWFkICIsCisJCQlyZWYtPm5vZGUtPmRlYnVnX2lkLCByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPmRlYXRoKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3Byb2MoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IHByaW50X2FsbCkKK3sKKwlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7CisJc3RydWN0IHJiX25vZGUgKm47CisJY2hhciAqc3RhcnRfYnVmID0gYnVmOworCWNoYXIgKmhlYWRlcl9idWY7CisKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJwcm9jICVkXG4iLCBwcm9jLT5waWQpOworCWhlYWRlcl9idWYgPSBidWY7CisKKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcyk7IG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7IG4gPSByYl9uZXh0KG4pKQorCQlidWYgPSBwcmludF9iaW5kZXJfdGhyZWFkKGJ1ZiwgZW5kLCByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCwgcmJfbm9kZSksIHByaW50X2FsbCk7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKTsgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsgbiA9IHJiX25leHQobikpIHsKKwkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9ub2RlLCByYl9ub2RlKTsKKwkJaWYgKHByaW50X2FsbCB8fCBub2RlLT5oYXNfYXN5bmNfdHJhbnNhY3Rpb24pCisJCQlidWYgPSBwcmludF9iaW5kZXJfbm9kZShidWYsIGVuZCwgbm9kZSk7CisJfQorCWlmIChwcmludF9hbGwpIHsKKwkJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYyk7IG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7IG4gPSByYl9uZXh0KG4pKQorCQkJYnVmID0gcHJpbnRfYmluZGVyX3JlZihidWYsIGVuZCwgcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsIHJiX25vZGVfZGVzYykpOworCX0KKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOyBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOyBuID0gcmJfbmV4dChuKSkKKwkJYnVmID0gcHJpbnRfYmluZGVyX2J1ZmZlcihidWYsIGVuZCwgIiAgYnVmZmVyIiwgcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT50b2RvLCBlbnRyeSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgIiwKKwkJCQkJIiAgcGVuZGluZyB0cmFuc2FjdGlvbiIsIHcpOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgsIGVudHJ5KSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgaGFzIGRlbGl2ZXJlZCBkZWFkIGJpbmRlclxuIik7CisJCWJyZWFrOworCX0KKwlpZiAoIXByaW50X2FsbCAmJiBidWYgPT0gaGVhZGVyX2J1ZikKKwkJYnVmID0gc3RhcnRfYnVmOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpiaW5kZXJfcmV0dXJuX3N0cmluZ3NbXSA9IHsKKwkiQlJfRVJST1IiLAorCSJCUl9PSyIsCisJIkJSX1RSQU5TQUNUSU9OIiwKKwkiQlJfUkVQTFkiLAorCSJCUl9BQ1FVSVJFX1JFU1VMVCIsCisJIkJSX0RFQURfUkVQTFkiLAorCSJCUl9UUkFOU0FDVElPTl9DT01QTEVURSIsCisJIkJSX0lOQ1JFRlMiLAorCSJCUl9BQ1FVSVJFIiwKKwkiQlJfUkVMRUFTRSIsCisJIkJSX0RFQ1JFRlMiLAorCSJCUl9BVFRFTVBUX0FDUVVJUkUiLAorCSJCUl9OT09QIiwKKwkiQlJfU1BBV05fTE9PUEVSIiwKKwkiQlJfRklOSVNIRUQiLAorCSJCUl9ERUFEX0JJTkRFUiIsCisJIkJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FIiwKKwkiQlJfRkFJTEVEX1JFUExZIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRlcl9jb21tYW5kX3N0cmluZ3NbXSA9IHsKKwkiQkNfVFJBTlNBQ1RJT04iLAorCSJCQ19SRVBMWSIsCisJIkJDX0FDUVVJUkVfUkVTVUxUIiwKKwkiQkNfRlJFRV9CVUZGRVIiLAorCSJCQ19JTkNSRUZTIiwKKwkiQkNfQUNRVUlSRSIsCisJIkJDX1JFTEVBU0UiLAorCSJCQ19ERUNSRUZTIiwKKwkiQkNfSU5DUkVGU19ET05FIiwKKwkiQkNfQUNRVUlSRV9ET05FIiwKKwkiQkNfQVRURU1QVF9BQ1FVSVJFIiwKKwkiQkNfUkVHSVNURVJfTE9PUEVSIiwKKwkiQkNfRU5URVJfTE9PUEVSIiwKKwkiQkNfRVhJVF9MT09QRVIiLAorCSJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIsCisJIkJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiIsCisJIkJDX0RFQURfQklOREVSX0RPTkUiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYmluZGVyX29ianN0YXRfc3RyaW5nc1tdID0geworCSJwcm9jIiwKKwkidGhyZWFkIiwKKwkibm9kZSIsCisJInJlZiIsCisJImRlYXRoIiwKKwkidHJhbnNhY3Rpb24iLAorCSJ0cmFuc2FjdGlvbl9jb21wbGV0ZSIKK307CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfc3RhdHMoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IGJpbmRlcl9zdGF0cyAqc3RhdHMpCit7CisJaW50IGk7CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzdGF0cy0+YmMpICE9IEFSUkFZX1NJWkUoYmluZGVyX2NvbW1hbmRfc3RyaW5ncykpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRzLT5iYyk7IGkrKykgeworCQlpZiAoc3RhdHMtPmJjW2ldKQorCQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXMlczogJWRcbiIsIHByZWZpeCwKKwkJCQkJYmluZGVyX2NvbW1hbmRfc3RyaW5nc1tpXSwgc3RhdHMtPmJjW2ldKTsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlyZXR1cm4gYnVmOworCX0KKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5icikgIT0gQVJSQVlfU0laRShiaW5kZXJfcmV0dXJuX3N0cmluZ3MpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+YnIpOyBpKyspIHsKKwkJaWYgKHN0YXRzLT5icltpXSkKKwkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6ICVkXG4iLCBwcmVmaXgsCisJCQkJCWJpbmRlcl9yZXR1cm5fc3RyaW5nc1tpXSwgc3RhdHMtPmJyW2ldKTsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlyZXR1cm4gYnVmOworCX0KKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCkgIT0gQVJSQVlfU0laRShiaW5kZXJfb2Jqc3RhdF9zdHJpbmdzKSk7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPm9ial9jcmVhdGVkKSAhPSBBUlJBWV9TSVpFKHN0YXRzLT5vYmpfZGVsZXRlZCkpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCk7IGkrKykgeworCQlpZiAoc3RhdHMtPm9ial9jcmVhdGVkW2ldIHx8IHN0YXRzLT5vYmpfZGVsZXRlZFtpXSkKKwkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6IGFjdGl2ZSAlZCB0b3RhbCAlZFxuIiwgcHJlZml4LAorCQkJCQliaW5kZXJfb2Jqc3RhdF9zdHJpbmdzW2ldLAorCQkJCQlzdGF0cy0+b2JqX2NyZWF0ZWRbaV0gLSBzdGF0cy0+b2JqX2RlbGV0ZWRbaV0sCisJCQkJCXN0YXRzLT5vYmpfY3JlYXRlZFtpXSk7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9wcm9jX3N0YXRzKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MpCit7CisJc3RydWN0IGJpbmRlcl93b3JrICp3OworCXN0cnVjdCByYl9ub2RlICpuOworCWludCBjb3VudCwgc3Ryb25nLCB3ZWFrOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAicHJvYyAlZFxuIiwgcHJvYy0+cGlkKTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwljb3VudCA9IDA7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnRocmVhZHMpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKQorCQljb3VudCsrOworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgdGhyZWFkczogJWRcbiIsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHJlcXVlc3RlZCB0aHJlYWRzOiAlZCslZC8lZFxuIgorCQkJIiAgcmVhZHkgdGhyZWFkcyAlZFxuIgorCQkJIiAgZnJlZSBhc3luYyBzcGFjZSAlemRcbiIsIHByb2MtPnJlcXVlc3RlZF90aHJlYWRzLAorCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCwgcHJvYy0+bWF4X3RocmVhZHMsCisJCQlwcm9jLT5yZWFkeV90aHJlYWRzLCBwcm9jLT5mcmVlX2FzeW5jX3NwYWNlKTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwljb3VudCA9IDA7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKKwkJY291bnQrKzsKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIG5vZGVzOiAlZFxuIiwgY291bnQpOworCWlmIChidWYgPj0gZW5kKQorCQlyZXR1cm4gYnVmOworCWNvdW50ID0gMDsKKwlzdHJvbmcgPSAwOworCXdlYWsgPSAwOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7CisJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKKwkJY291bnQrKzsKKwkJc3Ryb25nICs9IHJlZi0+c3Ryb25nOworCQl3ZWFrICs9IHJlZi0+d2VhazsKKwl9CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZWZzOiAlZCBzICVkIHcgJWRcbiIsIGNvdW50LCBzdHJvbmcsIHdlYWspOworCWlmIChidWYgPj0gZW5kKQorCQlyZXR1cm4gYnVmOworCisJY291bnQgPSAwOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpCisJCWNvdW50Kys7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBidWZmZXJzOiAlZFxuIiwgY291bnQpOworCWlmIChidWYgPj0gZW5kKQorCQlyZXR1cm4gYnVmOworCisJY291bnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByb2MtPnRvZG8sIGVudHJ5KSB7CisJCXN3aXRjaCAody0+dHlwZSkgeworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOgorCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBwZW5kaW5nIHRyYW5zYWN0aW9uczogJWRcbiIsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKworCWJ1ZiA9IHByaW50X2JpbmRlcl9zdGF0cyhidWYsIGVuZCwgIiAgIiwgJnByb2MtPnN0YXRzKTsKKworCXJldHVybiBidWY7Cit9CisKKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3N0YXRlKAorCWNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpidWYgPSBwYWdlOworCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisJaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChkb19sb2NrKQorCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJiaW5kZXIgc3RhdGU6XG4iKTsKKworCWlmICghaGxpc3RfZW1wdHkoJmJpbmRlcl9kZWFkX25vZGVzKSkKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiZGVhZCBub2RlczpcbiIpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIHBvcywgJmJpbmRlcl9kZWFkX25vZGVzLCBkZWFkX25vZGUpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX25vZGUoYnVmLCBlbmQsIG5vZGUpOworCX0KKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWJ1ZiA9IHByaW50X2JpbmRlcl9wcm9jKGJ1ZiwgZW5kLCBwcm9jLCAxKTsKKwl9CisJaWYgKGRvX2xvY2spCisJCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCWlmIChidWYgPiBwYWdlICsgUEFHRV9TSVpFKQorCQlidWYgPSBwYWdlICsgUEFHRV9TSVpFOworCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWxlbiA9IGJ1ZiAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsKKwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19zdGF0cygKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpwID0gcGFnZTsKKwlpbnQgZG9fbG9jayA9ICFiaW5kZXJfZGVidWdfbm9fbG9jazsKKworCWlmIChvZmYpCisJCXJldHVybiAwOworCisJaWYgKGRvX2xvY2spCisJCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKworCXAgKz0gc25wcmludGYocCwgUEFHRV9TSVpFLCAiYmluZGVyIHN0YXRzOlxuIik7CisKKwlwID0gcHJpbnRfYmluZGVyX3N0YXRzKHAsIHBhZ2UgKyBQQUdFX1NJWkUsICIiLCAmYmluZGVyX3N0YXRzKTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7CisJCWlmIChwID49IHBhZ2UgKyBQQUdFX1NJWkUpCisJCQlicmVhazsKKwkJcCA9IHByaW50X2JpbmRlcl9wcm9jX3N0YXRzKHAsIHBhZ2UgKyBQQUdFX1NJWkUsIHByb2MpOworCX0KKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisJaWYgKHAgPiBwYWdlICsgUEFHRV9TSVpFKQorCQlwID0gcGFnZSArIFBBR0VfU0laRTsKKworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlsZW4gPSBwIC0gcGFnZTsKKwlpZiAobGVuID4gb2ZmKQorCQlsZW4gLT0gb2ZmOworCWVsc2UKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKK30KKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9ucygKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpidWYgPSBwYWdlOworCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisJaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChkb19sb2NrKQorCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJiaW5kZXIgdHJhbnNhY3Rpb25zOlxuIik7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkocHJvYywgcG9zLCAmYmluZGVyX3Byb2NzLCBwcm9jX25vZGUpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3Byb2MoYnVmLCBlbmQsIHByb2MsIDApOworCX0KKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisJaWYgKGJ1ZiA+IHBhZ2UgKyBQQUdFX1NJWkUpCisJCWJ1ZiA9IHBhZ2UgKyBQQUdFX1NJWkU7CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJbGVuID0gYnVmIC0gcGFnZTsKKwlpZiAobGVuID4gb2ZmKQorCQlsZW4gLT0gb2ZmOworCWVsc2UKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKK30KKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3Byb2MoCisJY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZGF0YTsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpwID0gcGFnZTsKKwlpbnQgZG9fbG9jayA9ICFiaW5kZXJfZGVidWdfbm9fbG9jazsKKworCWlmIChvZmYpCisJCXJldHVybiAwOworCisJaWYgKGRvX2xvY2spCisJCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwlwICs9IHNucHJpbnRmKHAsIFBBR0VfU0laRSwgImJpbmRlciBwcm9jIHN0YXRlOlxuIik7CisJcCA9IHByaW50X2JpbmRlcl9wcm9jKHAsIHBhZ2UgKyBQQUdFX1NJWkUsIHByb2MsIDEpOworCWlmIChkb19sb2NrKQorCQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKworCWlmIChwID4gcGFnZSArIFBBR0VfU0laRSkKKwkJcCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWxlbiA9IHAgLSBwYWdlOworCWlmIChsZW4gPiBvZmYpCisJCWxlbiAtPSBvZmY7CisJZWxzZQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmUpCit7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJWQ6ICVzIGZyb20gJWQ6JWQgdG8gJWQ6JWQgbm9kZSAlZCBoYW5kbGUgJWQgc2l6ZSAlZDolZFxuIiwKKwkJCWUtPmRlYnVnX2lkLCAoZS0+Y2FsbF90eXBlID09IDIpID8gInJlcGx5IiA6CisJCQkoKGUtPmNhbGxfdHlwZSA9PSAxKSA/ICJhc3luYyIgOiAiY2FsbCAiKSwgZS0+ZnJvbV9wcm9jLAorCQkJZS0+ZnJvbV90aHJlYWQsIGUtPnRvX3Byb2MsIGUtPnRvX3RocmVhZCwgZS0+dG9fbm9kZSwKKwkJCWUtPnRhcmdldF9oYW5kbGUsIGUtPmRhdGFfc2l6ZSwgZS0+b2Zmc2V0c19zaXplKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25fbG9nKAorCWNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nICpsb2cgPSBkYXRhOworCWludCBsZW4gPSAwOworCWludCBpOworCWNoYXIgKmJ1ZiA9IHBhZ2U7CisJY2hhciAqZW5kID0gcGFnZSArIFBBR0VfU0laRTsKKworCWlmIChvZmYpCisJCXJldHVybiAwOworCisJaWYgKGxvZy0+ZnVsbCkgeworCQlmb3IgKGkgPSBsb2ctPm5leHQ7IGkgPCBBUlJBWV9TSVpFKGxvZy0+ZW50cnkpOyBpKyspIHsKKwkJCWlmIChidWYgPj0gZW5kKQorCQkJCWJyZWFrOworCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShidWYsIGVuZCwgJmxvZy0+ZW50cnlbaV0pOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBsb2ctPm5leHQ7IGkrKykgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5KGJ1ZiwgZW5kLCAmbG9nLT5lbnRyeVtpXSk7CisJfQorCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWxlbiA9IGJ1ZiAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsKKwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJpbmRlcl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5wb2xsID0gYmluZGVyX3BvbGwsCisJLnVubG9ja2VkX2lvY3RsID0gYmluZGVyX2lvY3RsLAorCS5tbWFwID0gYmluZGVyX21tYXAsCisJLm9wZW4gPSBiaW5kZXJfb3BlbiwKKwkuZmx1c2ggPSBiaW5kZXJfZmx1c2gsCisJLnJlbGVhc2UgPSBiaW5kZXJfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBiaW5kZXJfbWlzY2RldiA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAiYmluZGVyIiwKKwkuZm9wcyA9ICZiaW5kZXJfZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQgYmluZGVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QgPSBwcm9jX21rZGlyKCJiaW5kZXIiLCBOVUxMKTsKKwlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QpCisJCWJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jID0gcHJvY19ta2RpcigicHJvYyIsIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290KTsKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZiaW5kZXJfbWlzY2Rldik7CisJaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290KSB7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRlIiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsIGJpbmRlcl9yZWFkX3Byb2Nfc3RhdGUsIE5VTEwpOworCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cyIsIFNfSVJVR08sIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LCBiaW5kZXJfcmVhZF9wcm9jX3N0YXRzLCBOVUxMKTsKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidHJhbnNhY3Rpb25zIiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsIGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25zLCBOVUxMKTsKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidHJhbnNhY3Rpb25fbG9nIiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsIGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25fbG9nLCAmYmluZGVyX3RyYW5zYWN0aW9uX2xvZyk7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImZhaWxlZF90cmFuc2FjdGlvbl9sb2ciLCBTX0lSVUdPLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbl9sb2csICZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChiaW5kZXJfaW5pdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYWUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIEJhc2VkIG9uLCBidXQgbm8gbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCwgdGhlIG9yaWdpbmFsCisgKiBPcGVuQmluZGVyLm9yZyBiaW5kZXIgZHJpdmVyIGludGVyZmFjZSwgd2hpY2ggaXM6CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFBhbG1zb3VyY2UsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9CSU5ERVJfSAorI2RlZmluZSBfTElOVVhfQklOREVSX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgQl9QQUNLX0NIQVJTKGMxLCBjMiwgYzMsIGM0KSBcCisJKCgoKGMxKTw8MjQpKSB8ICgoKGMyKTw8MTYpKSB8ICgoKGMzKTw8OCkpIHwgKGM0KSkKKyNkZWZpbmUgQl9UWVBFX0xBUkdFIDB4ODUKKworZW51bSB7CisJQklOREVSX1RZUEVfQklOREVSCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfV0VBS19CSU5ERVIJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnYicsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3MnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRQk9IEJfUEFDS19DSEFSUygndycsICdoJywgJyonLCBCX1RZUEVfTEFSR0UpLAorCUJJTkRFUl9UWVBFX0ZECQk9IEJfUEFDS19DSEFSUygnZicsICdkJywgJyonLCBCX1RZUEVfTEFSR0UpLAorfTsKKworZW51bSB7CisJRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLID0gMHhmZiwKKwlGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTID0gMHgxMDAsCit9OworCisvKgorICogVGhpcyBpcyB0aGUgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgQmluZGVyIG9iamVjdCBmb3IgdHJhbnNmZXIKKyAqIGJldHdlZW4gcHJvY2Vzc2VzLiAgVGhlICdvZmZzZXRzJyBzdXBwbGllZCBhcyBwYXJ0IG9mIGEgYmluZGVyIHRyYW5zYWN0aW9uCisgKiBjb250YWlucyBvZmZzZXRzIGludG8gdGhlIGRhdGEgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBvY2N1ci4gIFRoZSBCaW5kZXIKKyAqIGRyaXZlciB0YWtlcyBjYXJlIG9mIHJlLXdyaXRpbmcgdGhlIHN0cnVjdHVyZSB0eXBlIGFuZCBkYXRhIGFzIGl0IG1vdmVzCisgKiBiZXR3ZWVuIHByb2Nlc3Nlcy4KKyAqLworc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCB7CisJLyogOCBieXRlcyBmb3IgbGFyZ2VfZmxhdF9oZWFkZXIuICovCisJdW5zaWduZWQgbG9uZwkJdHlwZTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCS8qIDggYnl0ZXMgb2YgZGF0YS4gKi8KKwl1bmlvbiB7CisJCXZvaWQJCSpiaW5kZXI7CS8qIGxvY2FsIG9iamVjdCAqLworCQlzaWduZWQgbG9uZwloYW5kbGU7CQkvKiByZW1vdGUgb2JqZWN0ICovCisJfTsKKworCS8qIGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGxvY2FsIG9iamVjdCAqLworCXZvaWQJCQkqY29va2llOworfTsKKworLyoKKyAqIE9uIDY0LWJpdCBwbGF0Zm9ybXMgd2hlcmUgdXNlciBjb2RlIG1heSBydW4gaW4gMzItYml0cyB0aGUgZHJpdmVyIG11c3QKKyAqIHRyYW5zbGF0ZSB0aGUgYnVmZmVyIChhbmQgbG9jYWwgYmluZGVyKSBhZGRyZXNzZXMgYXByb3ByaWF0ZWx5LgorICovCisKK3N0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCB7CisJc2lnbmVkIGxvbmcJd3JpdGVfc2l6ZTsJLyogYnl0ZXMgdG8gd3JpdGUgKi8KKwlzaWduZWQgbG9uZwl3cml0ZV9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCisJdW5zaWduZWQgbG9uZwl3cml0ZV9idWZmZXI7CisJc2lnbmVkIGxvbmcJcmVhZF9zaXplOwkvKiBieXRlcyB0byByZWFkICovCisJc2lnbmVkIGxvbmcJcmVhZF9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCisJdW5zaWduZWQgbG9uZwlyZWFkX2J1ZmZlcjsKK307CisKKy8qIFVzZSB3aXRoIEJJTkRFUl9WRVJTSU9OLCBkcml2ZXIgZmlsbHMgaW4gZmllbGRzLiAqLworc3RydWN0IGJpbmRlcl92ZXJzaW9uIHsKKwkvKiBkcml2ZXIgcHJvdG9jb2wgdmVyc2lvbiAtLSBpbmNyZW1lbnQgd2l0aCBpbmNvbXBhdGlibGUgY2hhbmdlICovCisJc2lnbmVkIGxvbmcJcHJvdG9jb2xfdmVyc2lvbjsKK307CisKKy8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbi4gKi8KKyNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3CisKKyNkZWZpbmUgQklOREVSX1dSSVRFX1JFQUQgICAJCV9JT1dSKCdiJywgMSwgc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKQorI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfVElNRU9VVAkJX0lPVygnYicsIDMsIGludDY0X3QpCisjZGVmaW5lCUJJTkRFUl9TRVRfTUFYX1RIUkVBRFMJCV9JT1coJ2InLCA1LCBzaXplX3QpCisjZGVmaW5lCUJJTkRFUl9TRVRfSURMRV9QUklPUklUWQlfSU9XKCdiJywgNiwgaW50KQorI2RlZmluZQlCSU5ERVJfU0VUX0NPTlRFWFRfTUdSCQlfSU9XKCdiJywgNywgaW50KQorI2RlZmluZQlCSU5ERVJfVEhSRUFEX0VYSVQJCV9JT1coJ2InLCA4LCBpbnQpCisjZGVmaW5lIEJJTkRFUl9WRVJTSU9OCQkJX0lPV1IoJ2InLCA5LCBzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pCisKKy8qCisgKiBOT1RFOiBUd28gc3BlY2lhbCBlcnJvciBjb2RlcyB5b3Ugc2hvdWxkIGNoZWNrIGZvciB3aGVuIGNhbGxpbmcKKyAqIGluIHRvIHRoZSBkcml2ZXIgYXJlOgorICoKKyAqIEVJTlRSIC0tIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gaW50ZXJ1cHRlZC4gIFRoaXMgc2hvdWxkIGJlCisgKiBoYW5kbGVkIGJ5IHJldHJ5aW5nIHRoZSBpb2N0bCgpIHVudGlsIGEgZGlmZmVyZW50IGVycm9yIGNvZGUKKyAqIGlzIHJldHVybmVkLgorICoKKyAqIEVDT05OUkVGVVNFRCAtLSBUaGUgZHJpdmVyIGlzIG5vIGxvbmdlciBhY2NlcHRpbmcgb3BlcmF0aW9ucworICogZnJvbSB5b3VyIHByb2Nlc3MuICBUaGF0IGlzLCB0aGUgcHJvY2VzcyBpcyBiZWluZyBkZXN0cm95ZWQuCisgKiBZb3Ugc2hvdWxkIGhhbmRsZSB0aGlzIGJ5IGV4aXRpbmcgZnJvbSB5b3VyIHByb2Nlc3MuICBOb3RlCisgKiB0aGF0IG9uY2UgdGhpcyBlcnJvciBjb2RlIGlzIHJldHVybmVkLCBhbGwgZnVydGhlciBjYWxscyB0bworICogdGhlIGRyaXZlciBmcm9tIGFueSB0aHJlYWQgd2lsbCByZXR1cm4gdGhpcyBzYW1lIGNvZGUuCisgKi8KKworZW51bSB0cmFuc2FjdGlvbl9mbGFncyB7CisJVEZfT05FX1dBWQk9IDB4MDEsCS8qIHRoaXMgaXMgYSBvbmUtd2F5IGNhbGw6IGFzeW5jLCBubyByZXR1cm4gKi8KKwlURl9ST09UX09CSkVDVAk9IDB4MDQsCS8qIGNvbnRlbnRzIGFyZSB0aGUgY29tcG9uZW50J3Mgcm9vdCBvYmplY3QgKi8KKwlURl9TVEFUVVNfQ09ERQk9IDB4MDgsCS8qIGNvbnRlbnRzIGFyZSBhIDMyLWJpdCBzdGF0dXMgY29kZSAqLworCVRGX0FDQ0VQVF9GRFMJPSAweDEwLAkvKiBhbGxvdyByZXBsaWVzIHdpdGggZmlsZSBkZXNjcmlwdG9ycyAqLworfTsKKworc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHsKKwkvKiBUaGUgZmlyc3QgdHdvIGFyZSBvbmx5IHVzZWQgZm9yIGJjVFJBTlNBQ1RJT04gYW5kIGJyVFJBTlNBQ1RJT04sCisJICogaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBhbmQgY29udGVudHMgb2YgdGhlIHRyYW5zYWN0aW9uLgorCSAqLworCXVuaW9uIHsKKwkJc2l6ZV90CWhhbmRsZTsJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgY29tbWFuZCB0cmFuc2FjdGlvbiAqLworCQl2b2lkCSpwdHI7CS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIHJldHVybiB0cmFuc2FjdGlvbiAqLworCX0gdGFyZ2V0OworCXZvaWQJCSpjb29raWU7CS8qIHRhcmdldCBvYmplY3QgY29va2llICovCisJdW5zaWduZWQgaW50CWNvZGU7CQkvKiB0cmFuc2FjdGlvbiBjb21tYW5kICovCisKKwkvKiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2FjdGlvbi4gKi8KKwl1bnNpZ25lZCBpbnQJZmxhZ3M7CisJcGlkX3QJCXNlbmRlcl9waWQ7CisJdWlkX3QJCXNlbmRlcl9ldWlkOworCXNpemVfdAkJZGF0YV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSAqLworCXNpemVfdAkJb2Zmc2V0c19zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2Ygb2Zmc2V0cyAqLworCisJLyogSWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBpbmxpbmUsIHRoZSBkYXRhIGltbWVkaWF0ZWx5CisJICogZm9sbG93cyBoZXJlOyBvdGhlcndpc2UsIGl0IGVuZHMgd2l0aCBhIHBvaW50ZXIgdG8KKwkgKiB0aGUgZGF0YSBidWZmZXIuCisJICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogdHJhbnNhY3Rpb24gZGF0YSAqLworCQkJY29uc3Qgdm9pZAkqYnVmZmVyOworCQkJLyogb2Zmc2V0cyBmcm9tIGJ1ZmZlciB0byBmbGF0X2JpbmRlcl9vYmplY3Qgc3RydWN0cyAqLworCQkJY29uc3Qgdm9pZAkqb2Zmc2V0czsKKwkJfSBwdHI7CisJCXVpbnQ4X3QJYnVmWzhdOworCX0gZGF0YTsKK307CisKK3N0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSB7CisJdm9pZCAqcHRyOworCXZvaWQgKmNvb2tpZTsKK307CisKK3N0cnVjdCBiaW5kZXJfcHJpX2Rlc2MgeworCWludCBwcmlvcml0eTsKKwlpbnQgZGVzYzsKK307CisKK3N0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUgeworCWludCBwcmlvcml0eTsKKwl2b2lkICpwdHI7CisJdm9pZCAqY29va2llOworfTsKKworZW51bSBCaW5kZXJEcml2ZXJSZXR1cm5Qcm90b2NvbCB7CisJQlJfRVJST1IgPSBfSU9SKCdyJywgMCwgaW50KSwKKwkvKgorCSAqIGludDogZXJyb3IgY29kZQorCSAqLworCisJQlJfT0sgPSBfSU8oJ3InLCAxKSwKKwkvKiBObyBwYXJhbWV0ZXJzISAqLworCisJQlJfVFJBTlNBQ1RJT04gPSBfSU9SKCdyJywgMiwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwlCUl9SRVBMWSA9IF9JT1IoJ3InLCAzLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCS8qCisJICogYmluZGVyX3RyYW5zYWN0aW9uX2RhdGE6IHRoZSByZWNlaXZlZCBjb21tYW5kLgorCSAqLworCisJQlJfQUNRVUlSRV9SRVNVTFQgPSBfSU9SKCdyJywgNCwgaW50KSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogaW50OiAwIGlmIHRoZSBsYXN0IGJjQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKwkgKiBFbHNlIHRoZSByZW1vdGUgb2JqZWN0IGhhcyBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlLgorCSAqLworCisJQlJfREVBRF9SRVBMWSA9IF9JTygncicsIDUpLAorCS8qCisJICogVGhlIHRhcmdldCBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiAoZWl0aGVyIGEgYmNUUkFOU0FDVElPTiBvcgorCSAqIGEgYmNBVFRFTVBUX0FDUVVJUkUpIGlzIG5vIGxvbmdlciB3aXRoIHVzLiAgTm8gcGFyYW1ldGVycy4KKwkgKi8KKworCUJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFID0gX0lPKCdyJywgNiksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLi4uIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxhc3QgdHJhbnNhY3Rpb24gcmVxdWVzdGVkCisJICogKGluY2x1ZGluZyByZXBsaWVzKS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2VudCBldmVuIGZvcgorCSAqIGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbnMuCisJICovCisKKwlCUl9JTkNSRUZTID0gX0lPUigncicsIDcsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQlJfQUNRVUlSRSA9IF9JT1IoJ3InLCA4LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCUJSX1JFTEVBU0UgPSBfSU9SKCdyJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCUl9ERUNSRUZTID0gX0lPUigncicsIDEwLCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCS8qCisJICogdm9pZCAqOglwdHIgdG8gYmluZGVyCisJICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgorCSAqLworCisJQlJfQVRURU1QVF9BQ1FVSVJFID0gX0lPUigncicsIDExLCBzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llKSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogaW50Oglwcmlvcml0eQorCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKKwkgKi8KKworCUJSX05PT1AgPSBfSU8oJ3InLCAxMiksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLiAgRG8gbm90aGluZyBhbmQgZXhhbWluZSB0aGUgbmV4dCBjb21tYW5kLiAgSXQgZXhpc3RzCisJICogcHJpbWFyaWx5IHNvIHRoYXQgd2UgY2FuIHJlcGxhY2UgaXQgd2l0aCBhIEJSX1NQQVdOX0xPT1BFUiBjb21tYW5kLgorCSAqLworCisJQlJfU1BBV05fTE9PUEVSID0gX0lPKCdyJywgMTMpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4gIFRoZSBkcml2ZXIgaGFzIGRldGVybWluZWQgdGhhdCBhIHByb2Nlc3MgaGFzIG5vCisJICogdGhyZWFkcyB3YWl0aW5nIHRvIHNlcnZpY2UgaW5jb21taW5nIHRyYW5zYWN0aW9ucy4gIFdoZW4gYSBwcm9jZXNzCisJICogcmVjZWl2ZXMgdGhpcyBjb21tYW5kLCBpdCBtdXN0IHNwYXduIGEgbmV3IHNlcnZpY2UgdGhyZWFkIGFuZAorCSAqIHJlZ2lzdGVyIGl0IHZpYSBiY0VOVEVSX0xPT1BFUi4KKwkgKi8KKworCUJSX0ZJTklTSEVEID0gX0lPKCdyJywgMTQpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBzdG9wIHRocmVhZHBvb2wgdGhyZWFkCisJICovCisKKwlCUl9ERUFEX0JJTkRFUiA9IF9JT1IoJ3InLCAxNSwgdm9pZCAqKSwKKwkvKgorCSAqIHZvaWQgKjogY29va2llCisJICovCisJQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUgPSBfSU9SKCdyJywgMTYsIHZvaWQgKiksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCisJQlJfRkFJTEVEX1JFUExZID0gX0lPKCdyJywgMTcpLAorCS8qCisJICogVGhlIHRoZSBsYXN0IHRyYW5zYWN0aW9uIChlaXRoZXIgYSBiY1RSQU5TQUNUSU9OIG9yCisJICogYSBiY0FUVEVNUFRfQUNRVUlSRSkgZmFpbGVkIChlLmcuIG91dCBvZiBtZW1vcnkpLiAgTm8gcGFyYW1ldGVycy4KKwkgKi8KK307CisKK2VudW0gQmluZGVyRHJpdmVyQ29tbWFuZFByb3RvY29sIHsKKwlCQ19UUkFOU0FDVElPTiA9IF9JT1coJ2MnLCAwLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCUJDX1JFUExZID0gX0lPVygnYycsIDEsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJLyoKKwkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHNlbnQgY29tbWFuZC4KKwkgKi8KKworCUJDX0FDUVVJUkVfUkVTVUxUID0gX0lPVygnYycsIDIsIGludCksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDogIDAgaWYgdGhlIGxhc3QgQlJfQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKwkgKiBFbHNlIHlvdSBoYXZlIGFjcXVpcmVkIGEgcHJpbWFyeSByZWZlcmVuY2Ugb24gdGhlIG9iamVjdC4KKwkgKi8KKworCUJDX0ZSRUVfQlVGRkVSID0gX0lPVygnYycsIDMsIGludCksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byB0cmFuc2FjdGlvbiBkYXRhIHJlY2VpdmVkIG9uIGEgcmVhZAorCSAqLworCisJQkNfSU5DUkVGUyA9IF9JT1coJ2MnLCA0LCBpbnQpLAorCUJDX0FDUVVJUkUgPSBfSU9XKCdjJywgNSwgaW50KSwKKwlCQ19SRUxFQVNFID0gX0lPVygnYycsIDYsIGludCksCisJQkNfREVDUkVGUyA9IF9JT1coJ2MnLCA3LCBpbnQpLAorCS8qCisJICogaW50OglkZXNjcmlwdG9yCisJICovCisKKwlCQ19JTkNSRUZTX0RPTkUgPSBfSU9XKCdjJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCQ19BQ1FVSVJFX0RPTkUgPSBfSU9XKCdjJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKKwkgKi8KKworCUJDX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1coJ2MnLCAxMCwgc3RydWN0IGJpbmRlcl9wcmlfZGVzYyksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDogcHJpb3JpdHkKKwkgKiBpbnQ6IGRlc2NyaXB0b3IKKwkgKi8KKworCUJDX1JFR0lTVEVSX0xPT1BFUiA9IF9JTygnYycsIDExKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuCisJICogUmVnaXN0ZXIgYSBzcGF3bmVkIGxvb3BlciB0aHJlYWQgd2l0aCB0aGUgZGV2aWNlLgorCSAqLworCisJQkNfRU5URVJfTE9PUEVSID0gX0lPKCdjJywgMTIpLAorCUJDX0VYSVRfTE9PUEVSID0gX0lPKCdjJywgMTMpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4KKwkgKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIHNlbnQgYXMgYW4gYXBwbGljYXRpb24tbGV2ZWwgdGhyZWFkCisJICogZW50ZXJzIGFuZCBleGl0cyB0aGUgYmluZGVyIGxvb3AsIHJlc3BlY3RpdmVseS4gIFRoZXkgYXJlCisJICogdXNlZCBzbyB0aGUgYmluZGVyIGNhbiBoYXZlIGFuIGFjY3VyYXRlIGNvdW50IG9mIHRoZSBudW1iZXIKKwkgKiBvZiBsb29waW5nIHRocmVhZHMgaXQgaGFzIGF2YWlsYWJsZS4KKwkgKi8KKworCUJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID0gX0lPVygnYycsIDE0LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCS8qCisJICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KKworCUJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llCisJICovCisKKwlCQ19ERUFEX0JJTkRFUl9ET05FID0gX0lPVygnYycsIDE2LCB2b2lkICopLAorCS8qCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KK307CisKKyNlbmRpZiAvKiBfTElOVVhfQklOREVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjMyMDAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBkcml2ZXJzL21pc2MvbG9nZ2VyLmMKKyAqCisgKiBBIExvZ2dpbmcgU3Vic3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCisgKgorICogUm9iZXJ0IExvdmUgPHJsb3ZlQGdvb2dsZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSAibG9nZ2VyLmgiCisKKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKy8qCisgKiBzdHJ1Y3QgbG9nZ2VyX2xvZyAtIHJlcHJlc2VudHMgYSBzcGVjaWZpYyBsb2csIHN1Y2ggYXMgJ21haW4nIG9yICdyYWRpbycKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBsaXZlcyBmcm9tIG1vZHVsZSBpbnNlcnRpb24gdW50aWwgbW9kdWxlIHJlbW92YWwsIHNvIGl0IGRvZXMKKyAqIG5vdCBuZWVkIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGNvdW50aW5nLiBUaGUgc3RydWN0dXJlIGlzIHByb3RlY3RlZCBieSB0aGUKKyAqIG11dGV4ICdtdXRleCcuCisgKi8KK3N0cnVjdCBsb2dnZXJfbG9nIHsKKwl1bnNpZ25lZCBjaGFyICoJCWJ1ZmZlcjsJLyogdGhlIHJpbmcgYnVmZmVyIGl0c2VsZiAqLworCXN0cnVjdCBtaXNjZGV2aWNlCW1pc2M7CS8qIG1pc2MgZGV2aWNlIHJlcHJlc2VudGluZyB0aGUgbG9nICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd3E7CS8qIHdhaXQgcXVldWUgZm9yIHJlYWRlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXJlYWRlcnM7IC8qIHRoaXMgbG9nJ3MgcmVhZGVycyAqLworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CS8qIG11dGV4IHByb3RlY3RpbmcgYnVmZmVyICovCisJc2l6ZV90CQkJd19vZmY7CS8qIGN1cnJlbnQgd3JpdGUgaGVhZCBvZmZzZXQgKi8KKwlzaXplX3QJCQloZWFkOwkvKiBuZXcgcmVhZGVycyBzdGFydCBoZXJlICovCisJc2l6ZV90CQkJc2l6ZTsJLyogc2l6ZSBvZiB0aGUgbG9nICovCit9OworCisvKgorICogc3RydWN0IGxvZ2dlcl9yZWFkZXIgLSBhIGxvZ2dpbmcgZGV2aWNlIG9wZW4gZm9yIHJlYWRpbmcKKyAqCisgKiBUaGlzIG9iamVjdCBsaXZlcyBmcm9tIG9wZW4gdG8gcmVsZWFzZSwgc28gd2UgZG9uJ3QgbmVlZCBhZGRpdGlvbmFsCisgKiByZWZlcmVuY2UgY291bnRpbmcuIFRoZSBzdHJ1Y3R1cmUgaXMgcHJvdGVjdGVkIGJ5IGxvZy0+bXV0ZXguCisgKi8KK3N0cnVjdCBsb2dnZXJfcmVhZGVyIHsKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqCWxvZzsJLyogYXNzb2NpYXRlZCBsb2cgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CS8qIGVudHJ5IGluIGxvZ2dlcl9sb2cncyBsaXN0ICovCisJc2l6ZV90CQkJcl9vZmY7CS8qIGN1cnJlbnQgcmVhZCBoZWFkIG9mZnNldCAqLworfTsKKworLyogbG9nZ2VyX29mZnNldCAtIHJldHVybnMgaW5kZXggJ24nIGludG8gdGhlIGxvZyB2aWEgKG9wdGltaXplZCkgbW9kdWx1cyAqLworI2RlZmluZSBsb2dnZXJfb2Zmc2V0KG4pCSgobikgJiAobG9nLT5zaXplIC0gMSkpCisKKy8qCisgKiBmaWxlX2dldF9sb2cgLSBHaXZlbiBhIGZpbGUgc3RydWN0dXJlLCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgbG9nCisgKgorICogVGhpcyBpc24ndCBhZXN0aGV0aWMuIFdlIGhhdmUgc2V2ZXJhbCBnb2FsczoKKyAqCisgKiAJMSkgTmVlZCB0byBxdWlja2x5IG9idGFpbiB0aGUgYXNzb2NpYXRlZCBsb2cgZHVyaW5nIGFuIEkvTyBvcGVyYXRpb24KKyAqIAkyKSBSZWFkZXJzIG5lZWQgdG8gbWFpbnRhaW4gc3RhdGUgKGxvZ2dlcl9yZWFkZXIpCisgKiAJMykgV3JpdGVycyBuZWVkIHRvIGJlIHZlcnkgZmFzdCAob3BlbigpIHNob3VsZCBiZSBhIG5lYXIgbm8tb3ApCisgKgorICogSW4gdGhlIHJlYWRlciBjYXNlLCB3ZSBjYW4gdHJpdmlhbGx5IGdvIGZpbGUtPmxvZ2dlcl9yZWFkZXItPmxvZ2dlcl9sb2cuCisgKiBGb3IgYSB3cml0ZXIsIHdlIGRvbid0IHdhbnQgdG8gbWFpbnRhaW4gYSBsb2dnZXJfcmVhZGVyLCBzbyB3ZSBqdXN0IGdvCisgKiBmaWxlLT5sb2dnZXJfbG9nLiBUaHVzIHdoYXQgZmlsZS0+cHJpdmF0ZV9kYXRhIHBvaW50cyBhdCBkZXBlbmRzIG9uIHdoZXRoZXIKKyAqIG9yIG5vdCB0aGUgZmlsZSB3YXMgb3BlbmVkIGZvciByZWFkaW5nLiBUaGlzIGZ1bmN0aW9uIGhpZGVzIHRoYXQgZGlydGluZXNzLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsb2dnZXJfbG9nICogZmlsZV9nZXRfbG9nKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXJldHVybiByZWFkZXItPmxvZzsKKwl9IGVsc2UKKwkJcmV0dXJuIGZpbGUtPnByaXZhdGVfZGF0YTsKK30KKworLyoKKyAqIGdldF9lbnRyeV9sZW4gLSBHcmFicyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXlsb2FkIG9mIHRoZSBuZXh0IGVudHJ5IHN0YXJ0aW5nCisgKiBmcm9tICdvZmYnLgorICoKKyAqIENhbGxlciBuZWVkcyB0byBob2xkIGxvZy0+bXV0ZXguCisgKi8KK3N0YXRpYyBfX3UzMiBnZXRfZW50cnlfbGVuKHN0cnVjdCBsb2dnZXJfbG9nICpsb2csIHNpemVfdCBvZmYpCit7CisJX191MTYgdmFsOworCisJc3dpdGNoIChsb2ctPnNpemUgLSBvZmYpIHsKKwljYXNlIDE6CisJCW1lbWNweSgmdmFsLCBsb2ctPmJ1ZmZlciArIG9mZiwgMSk7CisJCW1lbWNweSgoKGNoYXIgKikgJnZhbCkgKyAxLCBsb2ctPmJ1ZmZlciwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1lbWNweSgmdmFsLCBsb2ctPmJ1ZmZlciArIG9mZiwgMik7CisJfQorCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSArIHZhbDsKK30KKworLyoKKyAqIGRvX3JlYWRfbG9nX3RvX3VzZXIgLSByZWFkcyBleGFjdGx5ICdjb3VudCcgYnl0ZXMgZnJvbSAnbG9nJyBpbnRvIHRoZQorICogdXNlci1zcGFjZSBidWZmZXIgJ2J1ZicuIFJldHVybnMgJ2NvdW50JyBvbiBzdWNjZXNzLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgbG9nLT5tdXRleC4KKyAqLworc3RhdGljIHNzaXplX3QgZG9fcmVhZF9sb2dfdG9fdXNlcihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLAorCQkJCSAgIHN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIsCisJCQkJICAgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGxlbjsKKworCS8qCisJICogV2UgcmVhZCBmcm9tIHRoZSBsb2cgaW4gdHdvIGRpc2pvaW50IG9wZXJhdGlvbnMuIEZpcnN0LCB3ZSByZWFkIGZyb20KKwkgKiB0aGUgY3VycmVudCByZWFkIGhlYWQgb2Zmc2V0IHVwIHRvICdjb3VudCcgYnl0ZXMgb3IgdG8gdGhlIGVuZCBvZgorCSAqIHRoZSBsb2csIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKwkgKi8KKwlsZW4gPSBtaW4oY291bnQsIGxvZy0+c2l6ZSAtIHJlYWRlci0+cl9vZmYpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBsb2ctPmJ1ZmZlciArIHJlYWRlci0+cl9vZmYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBTZWNvbmQsIHdlIHJlYWQgYW55IHJlbWFpbmluZyBieXRlcywgc3RhcnRpbmcgYmFjayBhdCB0aGUgaGVhZCBvZgorCSAqIHRoZSBsb2cuCisJICovCisJaWYgKGNvdW50ICE9IGxlbikKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyBsZW4sIGxvZy0+YnVmZmVyLCBjb3VudCAtIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlYWRlci0+cl9vZmYgPSBsb2dnZXJfb2Zmc2V0KHJlYWRlci0+cl9vZmYgKyBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBsb2dnZXJfcmVhZCAtIG91ciBsb2cncyByZWFkKCkgbWV0aG9kCisgKgorICogQmVoYXZpb3I6CisgKgorICogCS0gT19OT05CTE9DSyB3b3JrcworICogCS0gSWYgdGhlcmUgYXJlIG5vIGxvZyBlbnRyaWVzIHRvIHJlYWQsIGJsb2NrcyB1bnRpbCBsb2cgaXMgd3JpdHRlbiB0bworICogCS0gQXRvbWljYWxseSByZWFkcyBleGFjdGx5IG9uZSBsb2cgZW50cnkKKyAqCisgKiBPcHRpbWFsIHJlYWQgc2l6ZSBpcyBMT0dHRVJfRU5UUllfTUFYX0xFTi4gV2lsbCBzZXQgZXJybm8gdG8gRUlOVkFMIGlmIHJlYWQKKyAqIGJ1ZmZlciBpcyBpbnN1ZmZpY2llbnQgdG8gaG9sZCBuZXh0IGVudHJ5LgorICovCitzdGF0aWMgc3NpemVfdCBsb2dnZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nID0gcmVhZGVyLT5sb2c7CisJc3NpemVfdCByZXQ7CisJREVGSU5FX1dBSVQod2FpdCk7CisKK3N0YXJ0OgorCXdoaWxlICgxKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmbG9nLT53cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisJCXJldCA9IChsb2ctPndfb2ZmID09IHJlYWRlci0+cl9vZmYpOworCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCisJCXNjaGVkdWxlKCk7CisJfQorCisJZmluaXNoX3dhaXQoJmxvZy0+d3EsICZ3YWl0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisKKwkvKiBpcyB0aGVyZSBzdGlsbCBzb21ldGhpbmcgdG8gcmVhZCBvciBkaWQgd2UgcmFjZT8gKi8KKwlpZiAodW5saWtlbHkobG9nLT53X29mZiA9PSByZWFkZXItPnJfb2ZmKSkgeworCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCQlnb3RvIHN0YXJ0OworCX0KKworCS8qIGdldCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBlbnRyeSAqLworCXJldCA9IGdldF9lbnRyeV9sZW4obG9nLCByZWFkZXItPnJfb2ZmKTsKKwlpZiAoY291bnQgPCByZXQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZ2V0IGV4YWN0bHkgb25lIGVudHJ5IGZyb20gdGhlIGxvZyAqLworCXJldCA9IGRvX3JlYWRfbG9nX3RvX3VzZXIobG9nLCByZWFkZXIsIGJ1ZiwgcmV0KTsKKworb3V0OgorCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZ2V0X25leHRfZW50cnkgLSByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgdmFsaWQgZW50cnkgYXQgbGVhc3QgJ2xlbicKKyAqIGJ5dGVzIGFmdGVyICdvZmYnLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgbG9nLT5tdXRleC4KKyAqLworc3RhdGljIHNpemVfdCBnZXRfbmV4dF9lbnRyeShzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3Qgb2ZmLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBjb3VudCA9IDA7CisKKwlkbyB7CisJCXNpemVfdCBuciA9IGdldF9lbnRyeV9sZW4obG9nLCBvZmYpOworCQlvZmYgPSBsb2dnZXJfb2Zmc2V0KG9mZiArIG5yKTsKKwkJY291bnQgKz0gbnI7CisJfSB3aGlsZSAoY291bnQgPCBsZW4pOworCisJcmV0dXJuIG9mZjsKK30KKworLyoKKyAqIGNsb2NrX2ludGVydmFsIC0gaXMgYSA8IGMgPCBiIGluIG1vZC1zcGFjZT8gUHV0IGFub3RoZXIgd2F5LCBkb2VzIHRoZSBsaW5lCisgKiBmcm9tIGEgdG8gYiBjcm9zcyBjPworICovCitzdGF0aWMgaW5saW5lIGludCBjbG9ja19pbnRlcnZhbChzaXplX3QgYSwgc2l6ZV90IGIsIHNpemVfdCBjKQoreworCWlmIChiIDwgYSkgeworCQlpZiAoYSA8IGMgfHwgYiA+PSBjKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaWYgKGEgPCBjICYmIGIgPj0gYykKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZml4X3VwX3JlYWRlcnMgLSB3YWxrIHRoZSBsaXN0IG9mIGFsbCByZWFkZXJzIGFuZCAiZml4IHVwIiBhbnkgd2hvIHdlcmUKKyAqIGxhcHBlZCBieSB0aGUgd3JpdGVyOyBhbHNvIGRvIHRoZSBzYW1lIGZvciB0aGUgZGVmYXVsdCAic3RhcnQgaGVhZCIuCisgKiBXZSBkbyB0aGlzIGJ5ICJwdWxsaW5nIGZvcndhcmQiIHRoZSByZWFkZXJzIGFuZCBzdGFydCBoZWFkIHRvIHRoZSBmaXJzdAorICogZW50cnkgYWZ0ZXIgdGhlIG5ldyB3cml0ZSBoZWFkLgorICoKKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgorICovCitzdGF0aWMgdm9pZCBmaXhfdXBfcmVhZGVycyhzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBvbGQgPSBsb2ctPndfb2ZmOworCXNpemVfdCBuZXcgPSBsb2dnZXJfb2Zmc2V0KG9sZCArIGxlbik7CisJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKKworCWlmIChjbG9ja19pbnRlcnZhbChvbGQsIG5ldywgbG9nLT5oZWFkKSkKKwkJbG9nLT5oZWFkID0gZ2V0X25leHRfZW50cnkobG9nLCBsb2ctPmhlYWQsIGxlbik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYWRlciwgJmxvZy0+cmVhZGVycywgbGlzdCkKKwkJaWYgKGNsb2NrX2ludGVydmFsKG9sZCwgbmV3LCByZWFkZXItPnJfb2ZmKSkKKwkJCXJlYWRlci0+cl9vZmYgPSBnZXRfbmV4dF9lbnRyeShsb2csIHJlYWRlci0+cl9vZmYsIGxlbik7Cit9CisKKy8qCisgKiBkb193cml0ZV9sb2cgLSB3cml0ZXMgJ2xlbicgYnl0ZXMgZnJvbSAnYnVmJyB0byAnbG9nJworICoKKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgorICovCitzdGF0aWMgdm9pZCBkb193cml0ZV9sb2coc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IG1pbihjb3VudCwgbG9nLT5zaXplIC0gbG9nLT53X29mZik7CisJbWVtY3B5KGxvZy0+YnVmZmVyICsgbG9nLT53X29mZiwgYnVmLCBsZW4pOworCisJaWYgKGNvdW50ICE9IGxlbikKKwkJbWVtY3B5KGxvZy0+YnVmZmVyLCBidWYgKyBsZW4sIGNvdW50IC0gbGVuKTsKKworCWxvZy0+d19vZmYgPSBsb2dnZXJfb2Zmc2V0KGxvZy0+d19vZmYgKyBjb3VudCk7CisKK30KKworLyoKKyAqIGRvX3dyaXRlX2xvZ191c2VyIC0gd3JpdGVzICdsZW4nIGJ5dGVzIGZyb20gdGhlIHVzZXItc3BhY2UgYnVmZmVyICdidWYnIHRvCisgKiB0aGUgbG9nICdsb2cnCisgKgorICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIGxvZy0+bXV0ZXguCisgKgorICogUmV0dXJucyAnY291bnQnIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHNzaXplX3QgZG9fd3JpdGVfbG9nX2Zyb21fdXNlcihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLAorCQkJCSAgICAgIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgbGVuOworCisJbGVuID0gbWluKGNvdW50LCBsb2ctPnNpemUgLSBsb2ctPndfb2ZmKTsKKwlpZiAobGVuICYmIGNvcHlfZnJvbV91c2VyKGxvZy0+YnVmZmVyICsgbG9nLT53X29mZiwgYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3VudCAhPSBsZW4pCisJCWlmIChjb3B5X2Zyb21fdXNlcihsb2ctPmJ1ZmZlciwgYnVmICsgbGVuLCBjb3VudCAtIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCWxvZy0+d19vZmYgPSBsb2dnZXJfb2Zmc2V0KGxvZy0+d19vZmYgKyBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBsb2dnZXJfYWlvX3dyaXRlIC0gb3VyIHdyaXRlIG1ldGhvZCwgaW1wbGVtZW50aW5nIHN1cHBvcnQgZm9yIHdyaXRlKCksCisgKiB3cml0ZXYoKSwgYW5kIGFpb193cml0ZSgpLiBXcml0ZXMgYXJlIG91ciBmYXN0IHBhdGgsIGFuZCB3ZSB0cnkgdG8gb3B0aW1pemUKKyAqIHRoZW0gYWJvdmUgYWxsIGVsc2UuCisgKi8KK3NzaXplX3QgbG9nZ2VyX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBwb3MpCit7CisJc3RydWN0IGxvZ2dlcl9sb2cgKmxvZyA9IGZpbGVfZ2V0X2xvZyhpb2NiLT5raV9maWxwKTsKKwlzaXplX3Qgb3JpZyA9IGxvZy0+d19vZmY7CisJc3RydWN0IGxvZ2dlcl9lbnRyeSBoZWFkZXI7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlub3cgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CisKKwloZWFkZXIucGlkID0gY3VycmVudC0+dGdpZDsKKwloZWFkZXIudGlkID0gY3VycmVudC0+cGlkOworCWhlYWRlci5zZWMgPSBub3cudHZfc2VjOworCWhlYWRlci5uc2VjID0gbm93LnR2X25zZWM7CisJaGVhZGVyLmxlbiA9IG1pbl90KHNpemVfdCwgaW9jYi0+a2lfbGVmdCwgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FEKTsKKworCS8qIG51bGwgd3JpdGVzIHN1Y2NlZWQsIHJldHVybiB6ZXJvICovCisJaWYgKHVubGlrZWx5KCFoZWFkZXIubGVuKSkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKKworCS8qCisJICogRml4IHVwIGFueSByZWFkZXJzLCBwdWxsaW5nIHRoZW0gZm9yd2FyZCB0byB0aGUgZmlyc3QgcmVhZGFibGUKKwkgKiBlbnRyeSBhZnRlciAod2hhdCB3aWxsIGJlKSB0aGUgbmV3IHdyaXRlIG9mZnNldC4gV2UgZG8gdGhpcyBub3cKKwkgKiBiZWNhdXNlIGlmIHdlIHBhcnRpYWxseSBmYWlsLCB3ZSBjYW4gZW5kIHVwIHdpdGggY2xvYmJlcmVkIGxvZworCSAqIGVudHJpZXMgdGhhdCBlbmNyb2FjaCBvbiByZWFkYWJsZSBidWZmZXIuCisJICovCisJZml4X3VwX3JlYWRlcnMobG9nLCBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgKyBoZWFkZXIubGVuKTsKKworCWRvX3dyaXRlX2xvZyhsb2csICZoZWFkZXIsIHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSk7CisKKwl3aGlsZSAobnJfc2Vncy0tID4gMCkgeworCQlzaXplX3QgbGVuOworCQlzc2l6ZV90IG5yOworCisJCS8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggb2YgdGhpcyB2ZWN0b3Igd2UgY2FuIGtlZXAgKi8KKwkJbGVuID0gbWluX3Qoc2l6ZV90LCBpb3YtPmlvdl9sZW4sIGhlYWRlci5sZW4gLSByZXQpOworCisJCS8qIHdyaXRlIG91dCB0aGlzIHNlZ21lbnQncyBwYXlsb2FkICovCisJCW5yID0gZG9fd3JpdGVfbG9nX2Zyb21fdXNlcihsb2csIGlvdi0+aW92X2Jhc2UsIGxlbik7CisJCWlmICh1bmxpa2VseShuciA8IDApKSB7CisJCQlsb2ctPndfb2ZmID0gb3JpZzsKKwkJCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisJCQlyZXR1cm4gbnI7CisJCX0KKworCQlpb3YrKzsKKwkJcmV0ICs9IG5yOworCX0KKworCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisKKwkvKiB3YWtlIHVwIGFueSBibG9ja2VkIHJlYWRlcnMgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvZy0+d3EpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nICogZ2V0X2xvZ19mcm9tX21pbm9yKGludCk7CisKKy8qCisgKiBsb2dnZXJfb3BlbiAtIHRoZSBsb2cncyBvcGVuKCkgZmlsZSBvcGVyYXRpb24KKyAqCisgKiBOb3RlIGhvdyBuZWFyIGEgbm8tb3AgdGhpcyBpcyBpbiB0aGUgd3JpdGUtb25seSBjYXNlLiBLZWVwIGl0IHRoYXQgd2F5IQorICovCitzdGF0aWMgaW50IGxvZ2dlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsb2dnZXJfbG9nICpsb2c7CisJaW50IHJldDsKKworCXJldCA9IG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlsb2cgPSBnZXRfbG9nX2Zyb21fbWlub3IoTUlOT1IoaW5vZGUtPmlfcmRldikpOworCWlmICghbG9nKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7CisKKwkJcmVhZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvZ2dlcl9yZWFkZXIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZWFkZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlyZWFkZXItPmxvZyA9IGxvZzsKKwkJSU5JVF9MSVNUX0hFQUQoJnJlYWRlci0+bGlzdCk7CisKKwkJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisJCXJlYWRlci0+cl9vZmYgPSBsb2ctPmhlYWQ7CisJCWxpc3RfYWRkX3RhaWwoJnJlYWRlci0+bGlzdCwgJmxvZy0+cmVhZGVycyk7CisJCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcmVhZGVyOworCX0gZWxzZQorCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBsb2c7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxvZ2dlcl9yZWxlYXNlIC0gdGhlIGxvZydzIHJlbGVhc2UgZmlsZSBvcGVyYXRpb24KKyAqCisgKiBOb3RlIHRoaXMgaXMgYSB0b3RhbCBuby1vcCBpbiB0aGUgd3JpdGUtb25seSBjYXNlLiBLZWVwIGl0IHRoYXQgd2F5IQorICovCitzdGF0aWMgaW50IGxvZ2dlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaWdub3JlZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJbGlzdF9kZWwoJnJlYWRlci0+bGlzdCk7CisJCWtmcmVlKHJlYWRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsb2dnZXJfcG9sbCAtIHRoZSBsb2cncyBwb2xsIGZpbGUgb3BlcmF0aW9uLCBmb3IgcG9sbC9zZWxlY3QvZXBvbGwKKyAqCisgKiBOb3RlIHdlIGFsd2F5cyByZXR1cm4gUE9MTE9VVCwgYmVjYXVzZSB5b3UgY2FuIGFsd2F5cyB3cml0ZSgpIHRvIHRoZSBsb2cuCisgKiBOb3RlIGFsc28gdGhhdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGEgcmV0dXJuIHZhbHVlIG9mIFBPTExJTiBkb2VzIG5vdAorICogZ3VhcmFudGVlIHRoYXQgdGhlIGxvZyBpcyByZWFkYWJsZSB3aXRob3V0IGJsb2NraW5nLCBhcyB0aGVyZSBpcyBhIHNtYWxsCisgKiBjaGFuY2UgdGhhdCB0aGUgd3JpdGVyIGNhbiBsYXAgdGhlIHJlYWRlciBpbiB0aGUgaW50ZXJpbSBiZXR3ZWVuIHBvbGwoKQorICogcmV0dXJuaW5nIGFuZCB0aGUgcmVhZCgpIHJlcXVlc3QuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nZ2VyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nOworCXVuc2lnbmVkIGludCByZXQgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQlyZXR1cm4gcmV0OworCisJcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWxvZyA9IHJlYWRlci0+bG9nOworCisJcG9sbF93YWl0KGZpbGUsICZsb2ctPndxLCB3YWl0KTsKKworCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOworCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCisJCXJldCB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyBsb2dnZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coZmlsZSk7CisJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKKwlsb25nIHJldCA9IC1FTk9UVFk7CisKKwltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBMT0dHRVJfR0VUX0xPR19CVUZfU0laRToKKwkJcmV0ID0gbG9nLT5zaXplOworCQlicmVhazsKKwljYXNlIExPR0dFUl9HRVRfTE9HX0xFTjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJCXJldCA9IC1FQkFERjsKKwkJCWJyZWFrOworCQl9CisJCXJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJaWYgKGxvZy0+d19vZmYgPj0gcmVhZGVyLT5yX29mZikKKwkJCXJldCA9IGxvZy0+d19vZmYgLSByZWFkZXItPnJfb2ZmOworCQllbHNlCisJCQlyZXQgPSAobG9nLT5zaXplIC0gcmVhZGVyLT5yX29mZikgKyBsb2ctPndfb2ZmOworCQlicmVhazsKKwljYXNlIExPR0dFUl9HRVRfTkVYVF9FTlRSWV9MRU46CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCisJCQlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7CisJCWVsc2UKKwkJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgTE9HR0VSX0ZMVVNIX0xPRzoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYWRlciwgJmxvZy0+cmVhZGVycywgbGlzdCkKKwkJCXJlYWRlci0+cl9vZmYgPSBsb2ctPndfb2ZmOworCQlsb2ctPmhlYWQgPSBsb2ctPndfb2ZmOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG9nZ2VyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnJlYWQgPSBsb2dnZXJfcmVhZCwKKwkuYWlvX3dyaXRlID0gbG9nZ2VyX2Fpb193cml0ZSwKKwkucG9sbCA9IGxvZ2dlcl9wb2xsLAorCS51bmxvY2tlZF9pb2N0bCA9IGxvZ2dlcl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gbG9nZ2VyX2lvY3RsLAorCS5vcGVuID0gbG9nZ2VyX29wZW4sCisJLnJlbGVhc2UgPSBsb2dnZXJfcmVsZWFzZSwKK307CisKKy8qCisgKiBEZWZpbmVzIGEgbG9nIHN0cnVjdHVyZSB3aXRoIG5hbWUgJ05BTUUnIGFuZCBhIHNpemUgb2YgJ1NJWkUnIGJ5dGVzLCB3aGljaAorICogbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgZ3JlYXRlciB0aGFuIExPR0dFUl9FTlRSWV9NQVhfTEVOLCBhbmQgbGVzcyB0aGFuCisgKiBMT05HX01BWCBtaW51cyBMT0dHRVJfRU5UUllfTUFYX0xFTi4KKyAqLworI2RlZmluZSBERUZJTkVfTE9HR0VSX0RFVklDRShWQVIsIE5BTUUsIFNJWkUpIFwKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9idWZfICMjIFZBUltTSVpFXTsgXAorc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nIFZBUiA9IHsgXAorCS5idWZmZXIgPSBfYnVmXyAjIyBWQVIsIFwKKwkubWlzYyA9IHsgXAorCQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsIFwKKwkJLm5hbWUgPSBOQU1FLCBcCisJCS5mb3BzID0gJmxvZ2dlcl9mb3BzLCBcCisJCS5wYXJlbnQgPSBOVUxMLCBcCisJfSwgXAorCS53cSA9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKFZBUiAud3EpLCBcCisJLnJlYWRlcnMgPSBMSVNUX0hFQURfSU5JVChWQVIgLnJlYWRlcnMpLCBcCisJLm11dGV4ID0gX19NVVRFWF9JTklUSUFMSVpFUihWQVIgLm11dGV4KSwgXAorCS53X29mZiA9IDAsIFwKKwkuaGVhZCA9IDAsIFwKKwkuc2l6ZSA9IFNJWkUsIFwKK307CisKK0RFRklORV9MT0dHRVJfREVWSUNFKGxvZ19tYWluLCBMT0dHRVJfTE9HX01BSU4sIDY0KjEwMjQpCitERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfZXZlbnRzLCBMT0dHRVJfTE9HX0VWRU5UUywgMjU2KjEwMjQpCitERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfcmFkaW8sIExPR0dFUl9MT0dfUkFESU8sIDY0KjEwMjQpCisKK3N0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyAqIGdldF9sb2dfZnJvbV9taW5vcihpbnQgbWlub3IpCit7CisJaWYgKGxvZ19tYWluLm1pc2MubWlub3IgPT0gbWlub3IpCisJCXJldHVybiAmbG9nX21haW47CisJaWYgKGxvZ19ldmVudHMubWlzYy5taW5vciA9PSBtaW5vcikKKwkJcmV0dXJuICZsb2dfZXZlbnRzOworCWlmIChsb2dfcmFkaW8ubWlzYy5taW5vciA9PSBtaW5vcikKKwkJcmV0dXJuICZsb2dfcmFkaW87CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbG9nKHN0cnVjdCBsb2dnZXJfbG9nICpsb2cpCit7CisJaW50IHJldDsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmxvZy0+bWlzYyk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsb2dnZXI6IGZhaWxlZCB0byByZWdpc3RlciBtaXNjICIKKwkJICAgICAgICJkZXZpY2UgZm9yIGxvZyAnJXMnIVxuIiwgbG9nLT5taXNjLm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gImxvZ2dlcjogY3JlYXRlZCAlbHVLIGxvZyAnJXMnXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZykgbG9nLT5zaXplID4+IDEwLCBsb2ctPm1pc2MubmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbG9nZ2VyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW5pdF9sb2coJmxvZ19tYWluKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpbml0X2xvZygmbG9nX2V2ZW50cyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaW5pdF9sb2coJmxvZ19yYWRpbyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KK2RldmljZV9pbml0Y2FsbChsb2dnZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjI0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaApAQCAtMCwwICsxLDQ4IEBACisvKiBpbmNsdWRlL2xpbnV4L2xvZ2dlci5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCisgKiBBdXRob3I6IFJvYmVydCBMb3ZlIDxybG92ZUBhbmRyb2lkLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9MT0dHRVJfSAorI2RlZmluZSBfTElOVVhfTE9HR0VSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworc3RydWN0IGxvZ2dlcl9lbnRyeSB7CisJX191MTYJCWxlbjsJLyogbGVuZ3RoIG9mIHRoZSBwYXlsb2FkICovCisJX191MTYJCV9fcGFkOwkvKiBubyBtYXR0ZXIgd2hhdCwgd2UgZ2V0IDIgYnl0ZXMgb2YgcGFkZGluZyAqLworCV9fczMyCQlwaWQ7CS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHBpZCAqLworCV9fczMyCQl0aWQ7CS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHRpZCAqLworCV9fczMyCQlzZWM7CS8qIHNlY29uZHMgc2luY2UgRXBvY2ggKi8KKwlfX3MzMgkJbnNlYzsJLyogbmFub3NlY29uZHMgKi8KKwljaGFyCQltc2dbMF07CS8qIHRoZSBlbnRyeSdzIHBheWxvYWQgKi8KK307CisKKyNkZWZpbmUgTE9HR0VSX0xPR19SQURJTwkibG9nX3JhZGlvIgkvKiByYWRpby1yZWxhdGVkIG1lc3NhZ2VzICovCisjZGVmaW5lIExPR0dFUl9MT0dfRVZFTlRTCSJsb2dfZXZlbnRzIgkvKiBzeXN0ZW0vaGFyZHdhcmUgZXZlbnRzICovCisjZGVmaW5lIExPR0dFUl9MT0dfTUFJTgkJImxvZ19tYWluIgkvKiBldmVyeXRoaW5nIGVsc2UgKi8KKworI2RlZmluZSBMT0dHRVJfRU5UUllfTUFYX0xFTgkJKDQqMTAyNCkKKyNkZWZpbmUgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FECVwKKwkoTE9HR0VSX0VOVFJZX01BWF9MRU4gLSBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpCisKKyNkZWZpbmUgX19MT0dHRVJJTwkweEFFCisKKyNkZWZpbmUgTE9HR0VSX0dFVF9MT0dfQlVGX1NJWkUJCV9JTyhfX0xPR0dFUklPLCAxKSAvKiBzaXplIG9mIGxvZyAqLworI2RlZmluZSBMT0dHRVJfR0VUX0xPR19MRU4JCV9JTyhfX0xPR0dFUklPLCAyKSAvKiB1c2VkIGxvZyBsZW4gKi8KKyNkZWZpbmUgTE9HR0VSX0dFVF9ORVhUX0VOVFJZX0xFTglfSU8oX19MT0dHRVJJTywgMykgLyogbmV4dCBlbnRyeSBsZW4gKi8KKyNkZWZpbmUgTE9HR0VSX0ZMVVNIX0xPRwkJX0lPKF9fTE9HR0VSSU8sIDQpIC8qIGZsdXNoIGxvZyAqLworCisjZW5kaWYgLyogX0xJTlVYX0xPR0dFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTVkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwpAQCAtMCwwICsxLDExOSBAQAorLyogZHJpdmVycy9taXNjL2xvd21lbW9yeWtpbGxlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvb29tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworc3RhdGljIGludCBsb3dtZW1fc2hyaW5rKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzayk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgbG93bWVtX3Nocmlua2VyID0geworCS5zaHJpbmsgPSBsb3dtZW1fc2hyaW5rLAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MgKiAxNgorfTsKK3N0YXRpYyB1aW50MzJfdCBsb3dtZW1fZGVidWdfbGV2ZWwgPSAyOworc3RhdGljIGludCBsb3dtZW1fYWRqWzZdID0geworCTAsCisJMSwKKwk2LAorCTEyLAorfTsKK3N0YXRpYyBpbnQgbG93bWVtX2Fkal9zaXplID0gNDsKK3N0YXRpYyBzaXplX3QgbG93bWVtX21pbmZyZWVbNl0gPSB7CisJMyo1MTIsIC8vIDZNQgorCTIqMTAyNCwgLy8gOE1CCisJNCoxMDI0LCAvLyAxNk1CCisJMTYqMTAyNCwgLy8gNjRNQgorfTsKK3N0YXRpYyBpbnQgbG93bWVtX21pbmZyZWVfc2l6ZSA9IDQ7CisKKyNkZWZpbmUgbG93bWVtX3ByaW50KGxldmVsLCB4Li4uKSBkbyB7IGlmKGxvd21lbV9kZWJ1Z19sZXZlbCA+PSAobGV2ZWwpKSBwcmludGsoeCk7IH0gd2hpbGUoMCkKKworbW9kdWxlX3BhcmFtX25hbWVkKGNvc3QsIGxvd21lbV9zaHJpbmtlci5zZWVrcywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQoYWRqLCBsb3dtZW1fYWRqLCBpbnQsICZsb3dtZW1fYWRqX3NpemUsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChtaW5mcmVlLCBsb3dtZW1fbWluZnJlZSwgdWludCwgJmxvd21lbV9taW5mcmVlX3NpemUsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sZXZlbCwgbG93bWVtX2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKK3N0YXRpYyBpbnQgbG93bWVtX3NocmluayhpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2VsZWN0ZWQgPSBOVUxMOworCWludCByZW0gPSAwOworCWludCB0YXNrc2l6ZTsKKwlpbnQgaTsKKwlpbnQgbWluX2FkaiA9IE9PTV9BREpVU1RfTUFYICsgMTsKKwlpbnQgc2VsZWN0ZWRfdGFza3NpemUgPSAwOworCWludCBhcnJheV9zaXplID0gQVJSQVlfU0laRShsb3dtZW1fYWRqKTsKKwlpbnQgb3RoZXJfZnJlZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZSRUVfUEFHRVMpICsgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9QQUdFUyk7CisJaWYobG93bWVtX2Fkal9zaXplIDwgYXJyYXlfc2l6ZSkKKwkJYXJyYXlfc2l6ZSA9IGxvd21lbV9hZGpfc2l6ZTsKKwlpZihsb3dtZW1fbWluZnJlZV9zaXplIDwgYXJyYXlfc2l6ZSkKKwkJYXJyYXlfc2l6ZSA9IGxvd21lbV9taW5mcmVlX3NpemU7CisJZm9yKGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsgaSsrKSB7CisJCWlmKG90aGVyX2ZyZWUgPCBsb3dtZW1fbWluZnJlZVtpXSkgeworCQkJbWluX2FkaiA9IGxvd21lbV9hZGpbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZihucl90b19zY2FuID4gMCkKKwkJbG93bWVtX3ByaW50KDMsICJsb3dtZW1fc2hyaW5rICVkLCAleCwgb2ZyZWUgJWQsIG1hICVkXG4iLCBucl90b19zY2FuLCBnZnBfbWFzaywgb3RoZXJfZnJlZSwgbWluX2Fkaik7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlmb3JfZWFjaF9wcm9jZXNzKHApIHsKKwkJaWYocC0+b29ta2lsbGFkaiA+PSAwICYmIHAtPm1tKSB7CisJCQl0YXNrc2l6ZSA9IGdldF9tbV9yc3MocC0+bW0pOworCQkJaWYobnJfdG9fc2NhbiA+IDAgJiYgdGFza3NpemUgPiAwICYmIHAtPm9vbWtpbGxhZGogPj0gbWluX2FkaikgeworCQkJCWlmKHNlbGVjdGVkID09IE5VTEwgfHwKKwkJCQkgICBwLT5vb21raWxsYWRqID4gc2VsZWN0ZWQtPm9vbWtpbGxhZGogfHwKKwkJCQkgICAocC0+b29ta2lsbGFkaiA9PSBzZWxlY3RlZC0+b29ta2lsbGFkaiAmJgorCQkJCSAgICB0YXNrc2l6ZSA+IHNlbGVjdGVkX3Rhc2tzaXplKSkgeworCQkJCQlzZWxlY3RlZCA9IHA7CisJCQkJCXNlbGVjdGVkX3Rhc2tzaXplID0gdGFza3NpemU7CisJCQkJCWxvd21lbV9wcmludCgyLCAic2VsZWN0ICVkICglcyksIGFkaiAlZCwgc2l6ZSAlZCwgdG8ga2lsbFxuIiwKKwkJCQkJICAgICAgICAgICAgIHAtPnBpZCwgcC0+Y29tbSwgcC0+b29ta2lsbGFkaiwgdGFza3NpemUpOworCQkJCX0KKwkJCX0KKwkJCXJlbSArPSB0YXNrc2l6ZTsKKwkJfQorCX0KKwlpZihzZWxlY3RlZCAhPSBOVUxMKSB7CisJCWxvd21lbV9wcmludCgxLCAic2VuZCBzaWdraWxsIHRvICVkICglcyksIGFkaiAlZCwgc2l6ZSAlZFxuIiwKKwkJICAgICAgICAgICAgIHNlbGVjdGVkLT5waWQsIHNlbGVjdGVkLT5jb21tLAorCQkgICAgICAgICAgICAgc2VsZWN0ZWQtPm9vbWtpbGxhZGosIHNlbGVjdGVkX3Rhc2tzaXplKTsKKwkJZm9yY2Vfc2lnKFNJR0tJTEwsIHNlbGVjdGVkKTsKKwkJcmVtIC09IHNlbGVjdGVkX3Rhc2tzaXplOworCX0KKwlsb3dtZW1fcHJpbnQoNCwgImxvd21lbV9zaHJpbmsgJWQsICV4LCByZXR1cm4gJWRcbiIsIG5yX3RvX3NjYW4sIGdmcF9tYXNrLCByZW0pOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gcmVtOworfQorCitzdGF0aWMgaW50IF9faW5pdCBsb3dtZW1faW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3Nocmlua2VyKCZsb3dtZW1fc2hyaW5rZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbG93bWVtX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZsb3dtZW1fc2hyaW5rZXIpOworfQorCittb2R1bGVfaW5pdChsb3dtZW1faW5pdCk7Cittb2R1bGVfZXhpdChsb3dtZW1fZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvcmFtX2NvbnNvbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMDY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qIGRyaXZlcnMvYW5kcm9pZC9yYW1fY29uc29sZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKyNpbmNsdWRlIDxsaW51eC9yc2xpYi5oPgorI2VuZGlmCisKK3N0cnVjdCByYW1fY29uc29sZV9idWZmZXIgeworCXVpbnQzMl90ICAgIHNpZzsKKwl1aW50MzJfdCAgICBzdGFydDsKKwl1aW50MzJfdCAgICBzaXplOworCXVpbnQ4X3QgICAgIGRhdGFbMF07Cit9OworCisjZGVmaW5lIFJBTV9DT05TT0xFX1NJRyAoMHg0MzQ3NDI0NCkgLyogREJHQyAqLworCisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorc3RhdGljIGNoYXIgX19pbml0ZGF0YQorCXJhbV9jb25zb2xlX29sZF9sb2dfaW5pdF9idWZmZXJbQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRV07CisjZW5kaWYKK3N0YXRpYyBjaGFyICpyYW1fY29uc29sZV9vbGRfbG9nOworc3RhdGljIHNpemVfdCByYW1fY29uc29sZV9vbGRfbG9nX3NpemU7CisKK3N0YXRpYyBzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpyYW1fY29uc29sZV9idWZmZXI7CitzdGF0aWMgc2l6ZV90IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KK3N0YXRpYyBjaGFyICpyYW1fY29uc29sZV9wYXJfYnVmZmVyOworc3RhdGljIHN0cnVjdCByc19jb250cm9sICpyYW1fY29uc29sZV9yc19kZWNvZGVyOworc3RhdGljIGludCByYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXM7CitzdGF0aWMgaW50IHJhbV9jb25zb2xlX2JhZF9ibG9ja3M7CisjZGVmaW5lIEVDQ19CTE9DS19TSVpFIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fREFUQV9TSVpFCisjZGVmaW5lIEVDQ19TSVpFIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fRUNDX1NJWkUKKyNkZWZpbmUgRUNDX1NZTVNJWkUgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRQorI2RlZmluZSBFQ0NfUE9MWSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1BPTFlOT01JQUwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgorc3RhdGljIHZvaWQgcmFtX2NvbnNvbGVfZW5jb2RlX3JzOCh1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuLCB1aW50OF90ICplY2MpCit7CisJaW50IGk7CisJdWludDE2X3QgcGFyW0VDQ19TSVpFXTsKKwkvKiBJbml0aWFsaXplIHRoZSBwYXJpdHkgYnVmZmVyICovCisJbWVtc2V0KHBhciwgMCwgc2l6ZW9mKHBhcikpOworCWVuY29kZV9yczgocmFtX2NvbnNvbGVfcnNfZGVjb2RlciwgZGF0YSwgbGVuLCBwYXIsIDApOworCWZvciAoaSA9IDA7IGkgPCBFQ0NfU0laRTsgaSsrKQorCQllY2NbaV0gPSBwYXJbaV07Cit9CisKK3N0YXRpYyBpbnQgcmFtX2NvbnNvbGVfZGVjb2RlX3JzOCh2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB1aW50OF90ICplY2MpCit7CisJaW50IGk7CisJdWludDE2X3QgcGFyW0VDQ19TSVpFXTsKKwlmb3IgKGkgPSAwOyBpIDwgRUNDX1NJWkU7IGkrKykKKwkJcGFyW2ldID0gZWNjW2ldOworCXJldHVybiBkZWNvZGVfcnM4KHJhbV9jb25zb2xlX3JzX2RlY29kZXIsIGRhdGEsIHBhciwgbGVuLAorCQkJCU5VTEwsIDAsIE5VTEwsIDAsIE5VTEwpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJhbV9jb25zb2xlX3VwZGF0ZShjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyID0gcmFtX2NvbnNvbGVfYnVmZmVyOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwl1aW50OF90ICpidWZmZXJfZW5kID0gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7CisJdWludDhfdCAqYmxvY2s7CisJdWludDhfdCAqcGFyOworCWludCBzaXplID0gRUNDX0JMT0NLX1NJWkU7CisjZW5kaWYKKwltZW1jcHkoYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5zdGFydCwgcywgY291bnQpOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlibG9jayA9IGJ1ZmZlci0+ZGF0YSArIChidWZmZXItPnN0YXJ0ICYgfihFQ0NfQkxPQ0tfU0laRSAtIDEpKTsKKwlwYXIgPSByYW1fY29uc29sZV9wYXJfYnVmZmVyICsKKwkgICAgICAoYnVmZmVyLT5zdGFydCAvIEVDQ19CTE9DS19TSVpFKSAqIEVDQ19TSVpFOworCWRvIHsKKwkJaWYgKGJsb2NrICsgRUNDX0JMT0NLX1NJWkUgPiBidWZmZXJfZW5kKQorCQkJc2l6ZSA9IGJ1ZmZlcl9lbmQgLSBibG9jazsKKwkJcmFtX2NvbnNvbGVfZW5jb2RlX3JzOChibG9jaywgc2l6ZSwgcGFyKTsKKwkJYmxvY2sgKz0gRUNDX0JMT0NLX1NJWkU7CisJCXBhciArPSBFQ0NfU0laRTsKKwl9IHdoaWxlIChibG9jayA8IGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+c3RhcnQgKyBjb3VudCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcmFtX2NvbnNvbGVfdXBkYXRlX2hlYWRlcih2b2lkKQoreworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIgPSByYW1fY29uc29sZV9idWZmZXI7CisJdWludDhfdCAqcGFyOworCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXIgKworCSAgICAgIERJVl9ST1VORF9VUChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSwgRUNDX0JMT0NLX1NJWkUpICogRUNDX1NJWkU7CisJcmFtX2NvbnNvbGVfZW5jb2RlX3JzOCgodWludDhfdCAqKWJ1ZmZlciwgc2l6ZW9mKCpidWZmZXIpLCBwYXIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCityYW1fY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCByZW07CisJc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyID0gcmFtX2NvbnNvbGVfYnVmZmVyOworCisJaWYgKGNvdW50ID4gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpIHsKKwkJcyArPSBjb3VudCAtIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworCQljb3VudCA9IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworCX0KKwlyZW0gPSByYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtIGJ1ZmZlci0+c3RhcnQ7CisJaWYgKHJlbSA8IGNvdW50KSB7CisJCXJhbV9jb25zb2xlX3VwZGF0ZShzLCByZW0pOworCQlzICs9IHJlbTsKKwkJY291bnQgLT0gcmVtOworCQlidWZmZXItPnN0YXJ0ID0gMDsKKwkJYnVmZmVyLT5zaXplID0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7CisJfQorCXJhbV9jb25zb2xlX3VwZGF0ZShzLCBjb3VudCk7CisKKwlidWZmZXItPnN0YXJ0ICs9IGNvdW50OworCWlmIChidWZmZXItPnNpemUgPCByYW1fY29uc29sZV9idWZmZXJfc2l6ZSkKKwkJYnVmZmVyLT5zaXplICs9IGNvdW50OworCXJhbV9jb25zb2xlX3VwZGF0ZV9oZWFkZXIoKTsKK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIHJhbV9jb25zb2xlID0geworCS5uYW1lCT0gInJhbSIsCisJLndyaXRlCT0gcmFtX2NvbnNvbGVfd3JpdGUsCisJLmZsYWdzCT0gQ09OX1BSSU5UQlVGRkVSIHwgQ09OX0VOQUJMRUQsCisJLmluZGV4CT0gLTEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQKK3JhbV9jb25zb2xlX3NhdmVfb2xkKHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciwgY2hhciAqZGVzdCkKK3sKKwlzaXplX3Qgb2xkX2xvZ19zaXplID0gYnVmZmVyLT5zaXplOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwl1aW50OF90ICpibG9jazsKKwl1aW50OF90ICpwYXI7CisJY2hhciBzdHJidWZbODBdOworCWludCBzdHJidWZfbGVuOworCisJYmxvY2sgPSBidWZmZXItPmRhdGE7CisJcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlcjsKKwl3aGlsZSAoYmxvY2sgPCBidWZmZXItPmRhdGEgKyBidWZmZXItPnNpemUpIHsKKwkJaW50IG51bWVycjsKKwkJaW50IHNpemUgPSBFQ0NfQkxPQ0tfU0laRTsKKwkJaWYgKGJsb2NrICsgc2l6ZSA+IGJ1ZmZlci0+ZGF0YSArIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplKQorCQkJc2l6ZSA9IGJ1ZmZlci0+ZGF0YSArIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplIC0gYmxvY2s7CisJCW51bWVyciA9IHJhbV9jb25zb2xlX2RlY29kZV9yczgoYmxvY2ssIHNpemUsIHBhcik7CisJCWlmIChudW1lcnIgPiAwKSB7CisjaWYgMAorCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGVycm9yIGluIGJsb2NrICVwLCAlZFxuIiwKKwkJCSAgICAgICBibG9jaywgbnVtZXJyKTsKKyNlbmRpZgorCQkJcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzICs9IG51bWVycjsKKwkJfSBlbHNlIGlmIChudW1lcnIgPCAwKSB7CisjaWYgMAorCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IHVuY29ycmVjdGFibGUgZXJyb3IgaW4gIgorCQkJICAgICAgICJibG9jayAlcFxuIiwgYmxvY2spOworI2VuZGlmCisJCQlyYW1fY29uc29sZV9iYWRfYmxvY2tzKys7CisJCX0KKwkJYmxvY2sgKz0gRUNDX0JMT0NLX1NJWkU7CisJCXBhciArPSBFQ0NfU0laRTsKKwl9CisJaWYgKHJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcyB8fCByYW1fY29uc29sZV9iYWRfYmxvY2tzKQorCQlzdHJidWZfbGVuID0gc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwKKwkJCSJcbiVkIENvcnJlY3RlZCBieXRlcywgJWQgdW5yZWNvdmVyYWJsZSBibG9ja3NcbiIsCisJCQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMsIHJhbV9jb25zb2xlX2JhZF9ibG9ja3MpOworCWVsc2UKKwkJc3RyYnVmX2xlbiA9IHNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksCisJCQkJICAgICAgIlxuTm8gZXJyb3JzIGRldGVjdGVkXG4iKTsKKwlpZiAoc3RyYnVmX2xlbiA+PSBzaXplb2Yoc3RyYnVmKSkKKwkJc3RyYnVmX2xlbiA9IHNpemVvZihzdHJidWYpIC0gMTsKKwlvbGRfbG9nX3NpemUgKz0gc3RyYnVmX2xlbjsKKyNlbmRpZgorCisJaWYgKGRlc3QgPT0gTlVMTCkgeworCQlkZXN0ID0ga21hbGxvYyhvbGRfbG9nX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJcmFtX2NvbnNvbGVfb2xkX2xvZyA9IGRlc3Q7CisJcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplID0gb2xkX2xvZ19zaXplOworCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nLAorCSAgICAgICAmYnVmZmVyLT5kYXRhW2J1ZmZlci0+c3RhcnRdLCBidWZmZXItPnNpemUgLSBidWZmZXItPnN0YXJ0KTsKKwltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZyArIGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+c3RhcnQsCisJICAgICAgICZidWZmZXItPmRhdGFbMF0sIGJ1ZmZlci0+c3RhcnQpOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZyArIG9sZF9sb2dfc2l6ZSAtIHN0cmJ1Zl9sZW4sCisJICAgICAgIHN0cmJ1Ziwgc3RyYnVmX2xlbik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfaW5pdChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIsCisJCQkJICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjaGFyICpvbGRfYnVmKQoreworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlpbnQgbnVtZXJyOworCXVpbnQ4X3QgKnBhcjsKKyNlbmRpZgorCXJhbV9jb25zb2xlX2J1ZmZlciA9IGJ1ZmZlcjsKKwlyYW1fY29uc29sZV9idWZmZXJfc2l6ZSA9CisJCWJ1ZmZlcl9zaXplIC0gc2l6ZW9mKHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIpOworCisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgorCXJhbV9jb25zb2xlX2J1ZmZlcl9zaXplIC09IChESVZfUk9VTkRfVVAocmFtX2NvbnNvbGVfYnVmZmVyX3NpemUsCisJCQkJCQlFQ0NfQkxPQ0tfU0laRSkgKyAxKSAqIEVDQ19TSVpFOworCXJhbV9jb25zb2xlX3Bhcl9idWZmZXIgPSBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKKworCisJLyogZmlyc3QgY29uc2VjdXRpdmUgcm9vdCBpcyAwCisJICogcHJpbWl0aXZlIGVsZW1lbnQgdG8gZ2VuZXJhdGUgcm9vdHMgPSAxCisJICovCisJcmFtX2NvbnNvbGVfcnNfZGVjb2RlciA9IGluaXRfcnMoRUNDX1NZTVNJWkUsIEVDQ19QT0xZLCAwLCAxLCBFQ0NfU0laRSk7CisJaWYgKHJhbV9jb25zb2xlX3JzX2RlY29kZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogaW5pdF9ycyBmYWlsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgPSAwOworCXJhbV9jb25zb2xlX2JhZF9ibG9ja3MgPSAwOworCisJcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlciArCisJICAgICAgRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLCBFQ0NfQkxPQ0tfU0laRSkgKiBFQ0NfU0laRTsKKworCW51bWVyciA9IHJhbV9jb25zb2xlX2RlY29kZV9yczgoYnVmZmVyLCBzaXplb2YoKmJ1ZmZlciksIHBhcik7CisJaWYgKG51bWVyciA+IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGVycm9yIGluIGhlYWRlciwgJWRcbiIsIG51bWVycik7CisJCXJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcyArPSBudW1lcnI7CisJfSBlbHNlIGlmIChudW1lcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJyYW1fY29uc29sZTogdW5jb3JyZWN0YWJsZSBlcnJvciBpbiBoZWFkZXJcbiIpOworCQlyYW1fY29uc29sZV9iYWRfYmxvY2tzKys7CisJfQorI2VuZGlmCisKKwlpZiAoYnVmZmVyLT5zaWcgPT0gUkFNX0NPTlNPTEVfU0lHKSB7CisJCWlmIChidWZmZXItPnNpemUgPiByYW1fY29uc29sZV9idWZmZXJfc2l6ZQorCQkgICAgfHwgYnVmZmVyLT5zdGFydCA+IGJ1ZmZlci0+c2l6ZSkKKwkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBmb3VuZCBleGlzdGluZyBpbnZhbGlkICIKKwkJCSAgICAgICAiYnVmZmVyLCBzaXplICVkLCBzdGFydCAlZFxuIiwKKwkJCSAgICAgICBidWZmZXItPnNpemUsIGJ1ZmZlci0+c3RhcnQpOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBmb3VuZCBleGlzdGluZyBidWZmZXIsICIKKwkJCSAgICAgICAic2l6ZSAlZCwgc3RhcnQgJWRcbiIsCisJCQkgICAgICAgYnVmZmVyLT5zaXplLCBidWZmZXItPnN0YXJ0KTsKKwkJCXJhbV9jb25zb2xlX3NhdmVfb2xkKGJ1ZmZlciwgb2xkX2J1Zik7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogbm8gdmFsaWQgZGF0YSBpbiBidWZmZXIgIgorCQkgICAgICAgIihzaWcgPSAweCUwOHgpXG4iLCBidWZmZXItPnNpZyk7CisJfQorCisJYnVmZmVyLT5zaWcgPSBSQU1fQ09OU09MRV9TSUc7CisJYnVmZmVyLT5zdGFydCA9IDA7CisJYnVmZmVyLT5zaXplID0gMDsKKworCXJlZ2lzdGVyX2NvbnNvbGUoJnJhbV9jb25zb2xlKTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FTkFCTEVfVkVSQk9TRQorCWNvbnNvbGVfdmVyYm9zZSgpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCitzdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9lYXJseV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoKHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKikKKwkJQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfQUREUiwKKwkJQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRSwKKwkJcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlcik7Cit9CisjZWxzZQorc3RhdGljIGludCByYW1fY29uc29sZV9kcml2ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBkZXYtPnJlc291cmNlOworCXNpemVfdCBzdGFydDsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJdm9pZCAqYnVmZmVyOworCisJaWYgKHJlcyA9PSBOVUxMIHx8IHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMSB8fAorCSAgICAhKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYW1fY29uc29sZTogaW52YWxpZCByZXNvdXJjZSwgJXAgJWQgZmxhZ3MgIgorCQkgICAgICAgIiVseFxuIiwgcmVzLCBwZGV2LT5udW1fcmVzb3VyY2VzLCByZXMgPyByZXMtPmZsYWdzIDogMCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCWJ1ZmZlcl9zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlzdGFydCA9IHJlcy0+c3RhcnQ7CisJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGdvdCBidWZmZXIgYXQgJXgsIHNpemUgJXhcbiIsCisJICAgICAgIHN0YXJ0LCBidWZmZXJfc2l6ZSk7CisJYnVmZmVyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBidWZmZXJfc2l6ZSk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBtYXAgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoYnVmZmVyLCBidWZmZXJfc2l6ZSwgTlVMTC8qIGFsbG9jYXRlICovKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmFtX2NvbnNvbGVfZHJpdmVyID0geworCS5wcm9iZSA9IHJhbV9jb25zb2xlX2RyaXZlcl9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicmFtX2NvbnNvbGUiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyYW1fY29uc29sZV9kcml2ZXIpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QgcmFtX2NvbnNvbGVfcmVhZF9vbGQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCXNzaXplX3QgY291bnQ7CisKKwlpZiAocG9zID49IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwljb3VudCA9IG1pbihsZW4sIChzaXplX3QpKHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSAtIHBvcykpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByYW1fY29uc29sZV9vbGRfbG9nICsgcG9zLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJKm9mZnNldCArPSBjb3VudDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbV9jb25zb2xlX2ZpbGVfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gcmFtX2NvbnNvbGVfcmVhZF9vbGQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9sYXRlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCisJaWYgKHJhbV9jb25zb2xlX29sZF9sb2cgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorCXJhbV9jb25zb2xlX29sZF9sb2cgPSBrbWFsbG9jKHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJhbV9jb25zb2xlX29sZF9sb2cgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJyYW1fY29uc29sZTogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3Igb2xkIGxvZ1xuIik7CisJCXJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSA9IDA7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZywKKwkgICAgICAgcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlciwgcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplKTsKKyNlbmRpZgorCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImxhc3Rfa21zZyIsIFNfSUZSRUcgfCBTX0lSVUdPLCBOVUxMKTsKKwlpZiAoIWVudHJ5KSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBjcmVhdGUgcHJvYyBlbnRyeVxuIik7CisJCWtmcmVlKHJhbV9jb25zb2xlX29sZF9sb2cpOworCQlyYW1fY29uc29sZV9vbGRfbG9nID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJZW50cnktPnByb2NfZm9wcyA9ICZyYW1fY29uc29sZV9maWxlX29wczsKKwllbnRyeS0+c2l6ZSA9IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKK2NvbnNvbGVfaW5pdGNhbGwocmFtX2NvbnNvbGVfZWFybHlfaW5pdCk7CisjZWxzZQorbW9kdWxlX2luaXQocmFtX2NvbnNvbGVfbW9kdWxlX2luaXQpOworI2VuZGlmCitsYXRlX2luaXRjYWxsKHJhbV9jb25zb2xlX2xhdGVfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWE2OGM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYwpAQCAtMCwwICsxLDE3NyBAQAorLyogZHJpdmVycy9taXNjL3RpbWVkX2dwaW8uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KKyAqIEF1dGhvcjogTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKyNpbmNsdWRlICJ0aW1lZF9ncGlvLmgiCisKKworc3RhdGljIHN0cnVjdCBjbGFzcyAqdGltZWRfZ3Bpb19jbGFzczsKKworc3RydWN0IHRpbWVkX2dwaW9fZGF0YSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBocnRpbWVyIHRpbWVyOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCAJZ3BpbzsKKwlpbnQgCQltYXhfdGltZW91dDsKKwl1OCAJCWFjdGl2ZV9sb3c7Cit9OworCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgZ3Bpb190aW1lcl9mdW5jKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEgPSBjb250YWluZXJfb2YodGltZXIsIHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEsIHRpbWVyKTsKKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2RhdGEtPmdwaW8sIGdwaW9fZGF0YS0+YWN0aXZlX2xvdyA/IDEgOiAwKTsKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdwaW9fZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEgKmdwaW9fZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZW1haW5pbmc7CisKKwlpZiAoaHJ0aW1lcl9hY3RpdmUoJmdwaW9fZGF0YS0+dGltZXIpKSB7CisJCWt0aW1lX3QgciA9IGhydGltZXJfZ2V0X3JlbWFpbmluZygmZ3Bpb19kYXRhLT50aW1lcik7CisJCXJlbWFpbmluZyA9IHIudHYuc2VjICogMTAwMCArIHIudHYubnNlYyAvIDEwMDAwMDA7CisJfSBlbHNlCisJCXJlbWFpbmluZyA9IDA7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVtYWluaW5nKTsKK30KKworc3RhdGljIHNzaXplX3QgZ3Bpb19lbmFibGVfc3RvcmUoCisJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHZhbHVlOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzc2NhbmYoYnVmLCAiJWQiLCAmdmFsdWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGF0YS0+bG9jaywgZmxhZ3MpOworCisJLyogY2FuY2VsIHByZXZpb3VzIHRpbWVyIGFuZCBzZXQgR1BJTyBhY2NvcmRpbmcgdG8gdmFsdWUgKi8KKwlocnRpbWVyX2NhbmNlbCgmZ3Bpb19kYXRhLT50aW1lcik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW9fZGF0YS0+Z3BpbywgZ3Bpb19kYXRhLT5hY3RpdmVfbG93ID8gIXZhbHVlIDogISF2YWx1ZSk7CisKKwlpZiAodmFsdWUgPiAwKSB7CisJCWlmICh2YWx1ZSA+IGdwaW9fZGF0YS0+bWF4X3RpbWVvdXQpCisJCQl2YWx1ZSA9IGdwaW9fZGF0YS0+bWF4X3RpbWVvdXQ7CisKKwkJaHJ0aW1lcl9zdGFydCgmZ3Bpb19kYXRhLT50aW1lciwKKwkJCQkJCWt0aW1lX3NldCh2YWx1ZSAvIDEwMDAsICh2YWx1ZSAlIDEwMDApICogMTAwMDAwMCksCisJCQkJCQlIUlRJTUVSX01PREVfUkVMKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2RhdGEtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgZ3Bpb19lbmFibGVfc2hvdywgZ3Bpb19lbmFibGVfc3RvcmUpOworCitzdGF0aWMgaW50IHRpbWVkX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB0aW1lZF9ncGlvICpjdXJfZ3BpbzsKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEsICpncGlvX2RhdDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmICghcGRhdGEpCisJCXJldHVybiAtRUJVU1k7CisKKwlncGlvX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhKSAqIHBkYXRhLT5udW1fZ3Bpb3MsIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2dwaW9zOyBpKyspIHsKKwkJY3VyX2dwaW8gPSAmcGRhdGEtPmdwaW9zW2ldOworCQlncGlvX2RhdCA9ICZncGlvX2RhdGFbaV07CisKKwkJaHJ0aW1lcl9pbml0KCZncGlvX2RhdC0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJCWdwaW9fZGF0LT50aW1lci5mdW5jdGlvbiA9IGdwaW9fdGltZXJfZnVuYzsKKwkJc3Bpbl9sb2NrX2luaXQoJmdwaW9fZGF0LT5sb2NrKTsKKworCQlncGlvX2RhdC0+Z3BpbyA9IGN1cl9ncGlvLT5ncGlvOworCQlncGlvX2RhdC0+bWF4X3RpbWVvdXQgPSBjdXJfZ3Bpby0+bWF4X3RpbWVvdXQ7CisJCWdwaW9fZGF0LT5hY3RpdmVfbG93ID0gY3VyX2dwaW8tPmFjdGl2ZV9sb3c7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2RhdC0+Z3BpbywgZ3Bpb19kYXQtPmFjdGl2ZV9sb3cpOworCisJCWdwaW9fZGF0LT5kZXYgPSBkZXZpY2VfY3JlYXRlKHRpbWVkX2dwaW9fY2xhc3MsICZwZGV2LT5kZXYsIDAsICIlcyIsIGN1cl9ncGlvLT5uYW1lKTsKKwkJaWYgKHVubGlrZWx5KElTX0VSUihncGlvX2RhdC0+ZGV2KSkpCisJCQlyZXR1cm4gUFRSX0VSUihncGlvX2RhdC0+ZGV2KTsKKworCQlkZXZfc2V0X2RydmRhdGEoZ3Bpb19kYXQtPmRldiwgZ3Bpb19kYXQpOworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZ3Bpb19kYXQtPmRldiwgJmRldl9hdHRyX2VuYWJsZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW9fZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1lZF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9ncGlvczsgaSsrKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZShncGlvX2RhdGFbaV0uZGV2LCAmZGV2X2F0dHJfZW5hYmxlKTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoZ3Bpb19kYXRhW2ldLmRldik7CisJfQorCisJa2ZyZWUoZ3Bpb19kYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0aW1lZF9ncGlvX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdGltZWRfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IHRpbWVkX2dwaW9fcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQkJPSAidGltZWQtZ3BpbyIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGltZWRfZ3Bpb19pbml0KHZvaWQpCit7CisJdGltZWRfZ3Bpb19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInRpbWVkX291dHB1dCIpOworCWlmIChJU19FUlIodGltZWRfZ3Bpb19jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKHRpbWVkX2dwaW9fY2xhc3MpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRpbWVkX2dwaW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRpbWVkX2dwaW9fZXhpdCh2b2lkKQoreworCWNsYXNzX2Rlc3Ryb3kodGltZWRfZ3Bpb19jbGFzcyk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRpbWVkX2dwaW9fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGltZWRfZ3Bpb19pbml0KTsKK21vZHVsZV9leGl0KHRpbWVkX2dwaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0aW1lZCBncGlvIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDQ5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmgKQEAgLTAsMCArMSwzMSBAQAorLyogaW5jbHVkZS9saW51eC90aW1lZF9ncGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisqLworCisjaWZuZGVmIF9MSU5VWF9USU1FRF9HUElPX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVEX0dQSU9fSAorCitzdHJ1Y3QgdGltZWRfZ3BpbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCAJZ3BpbzsKKwlpbnQgICAgIG1heF90aW1lb3V0OworCXU4IAkJYWN0aXZlX2xvdzsKK307CisKK3N0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgeworCWludCAJCW51bV9ncGlvczsKKwlzdHJ1Y3QgdGltZWRfZ3BpbyAqZ3Bpb3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTZkYmIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIEFTVVNfT0xFRAorCXRyaXN0YXRlICJBc3VzIE9MRUQgZHJpdmVyIgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBPTEVEIGRpc3BsYXkgcHJlc2VudCBpbiBzb21lIEFzdXMgbGFwdG9wcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWY5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19BU1VTX09MRUQpCQkrPSBhc3VzX29sZWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI5NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9SRUFETUUKQEAgLTAsMCArMSwxNTYgQEAKKworICAgIERyaXZlciBmb3IgQXN1cyBPTEVEIGRpc3BsYXkgcHJlc2VudCBpbiBzb21lIEFzdXMgbGFwdG9wcy4KKworICAgIFRoZSBjb2RlIG9mIHRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uICdhc3Vzb2xlZCcgcHJvZ3JhbSB0YWtlbiBmcm9tCisgICAgaHR0cHM6Ly9sYXVuY2hwYWQubmV0L2FzdXNvbGVkLy4gSSBqdXN0IHdhbnRlZCB0byBoYXZlIGEgc2ltcGxlCisgICAga2VybmVsIGRyaXZlciBmb3IgY29udHJvbGxpbmcgdGhpcyBkZXZpY2UsIGJ1dCBJIGRpZG4ndCBrbm93IGhvdworICAgIHRvIGRvIHRoYXQuIE5vdyBJIGtub3cgOykgQWxzbywgdGhhdCBwcm9ncmFtIGNhbiBub3QgYmUgdXNlZAorICAgIHdpdGggdXNiaGlkIGxvYWRlZCwgd2hpY2ggbWVhbnMgbm8gVVNCIG1vdXNlL2tleWJvYXJkIHdoaWxlCisgICAgY29udHJvbGxpbmcgT0xFRCBkaXNwbGF5IDooCisKKyAgICBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gQXN1cyBHMSBhbmQgZGlkbid0IGNhdXNlIGFueSBwcm9ibGVtcywKKyAgICBidXQgSSBkb24ndCBndWFyYW50ZWUgdGhhdCBpdCB3b24ndCBkbyBhbnl0aGluZyB3cm9uZyA6KQorCisgICAgSXQgY2FuIChhbmQgcHJvYmFibHkgZG9lcykgaGF2ZSBlcnJvcnMuIEl0IGlzIHVzYWJsZQorICAgIGluIG15IGNhc2UsIGFuZCBJIGhvcGUgb3RoZXJzIHdpbGwgZmluZCBpdCB1c2VmdWwgdG9vIQorCisqKioqKioqCisKK0J1aWxkaW5nIHRoZSBtb2R1bGUKKworICAgVG8gYnVpbGQgdGhlIG1vZHVsZSB5b3UgbmVlZCBrZXJuZWwgMi42IGluY2x1ZGUgZmlsZXMgYW5kIHNvbWUgQyBjb21waWxlci4KKworICAgSnVzdCBydW46CisgICBtYWtlCisgICBtYWtlIGluc3RhbGwgKGFzIGEgcm9vdCkKKworICAgSXQgd2lsbCBidWlsZCAoaG9wZWZ1bGx5KSB0aGUgbW9kdWxlIGFuZCBpbnN0YWxsIGl0IGluCisgICAvbGliL21vZHVsZXMvJ3VuYW1lIC1yJy9leHRyYS9hc3VzX29sZWQua28uCisKKyAgIFRvIGxvYWQgaXQganVzdCB1c2U6CisgICBtb2Rwcm9iZSBhc3VzX29sZWQKKworICAgWW91IGNhbiBjaGVjayBpZiBpdCBoYXMgZGV0ZWN0ZWQgeW91ciBPTEVEIGRpc3BsYXkgYnkgbG9va2luZyBpbnRvIGRtZXNnIG91dHB1dC4KKyAgIFRoZXJlIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSB0aGlzOgorICAgYXN1cy1vbGVkIDItNzoxLjA6IEF0dGFjaGVkIEFzdXMgT0xFRCBkZXZpY2UKKworICAgSWYgaXQgZG9lc24ndCBmaW5kIHlvdXIgZGlzcGxheSwgeW91IGNhbiB0cnkgcmVtb3ZpbmcgdXNiaGlkIG1vZHVsZS4KKyAgIElmIHlvdSBhZGQgYXN1c19vbGVkIGludG8gdGhlIGxpc3Qgb2YgbW9kdWxlcyBsb2FkZWQgZHVyaW5nIHN5c3RlbSBib290CisgICBiZWZvcmUgdXNiaGlkLCBpdCB3aWxsIHdvcmsgZXZlbiB3aGVuIHVzYmhpZCBpcyBwcmVzZW50LgorCisgICBJZiBpdCBzdGlsbCBkb2Vzbid0IGRldGVjdCB5b3VyIGhhcmR3YXJlLCBjaGVjayBsc3VzYiBvdXRwdXQuCisgICBUaGVyZSBzaG91bGQgYmUgc2ltaWxhciBsaW5lOgorICAgQnVzIDAwMiBEZXZpY2UgMDA1OiBJRCAwYjA1OjE3MjYgQVNVU1RlayBDb21wdXRlciwgSW5jLgorCisgICBJZiB5b3UgZG9uJ3Qgc2VlIGFueSBsaW5lcyB3aXRoICcwYjA1OjE3MjYnIGl0IG1lYW5zIHRoYXQgeW91IGhhdmUgZGlmZmVyZW50CisgICB0eXBlIG9mIGhhcmR3YXJlIHRoYXQgaXMgbm90IGRldGVjdGVkIChpdCBtYXkgb3IgbWF5IG5vdCB3b3JrLCBidXQgdGhlIGRyaXZlcgorICAga25vd3Mgb25seSAnMGIwNToxNzI2JyBkZXZpY2UpLgorCisqKioqKioqCisKK0NvbmZpZ3VyYXRpb24KKworICAgVGhlcmUgaXMgb25seSBvbmUgb3B0aW9uOiBzdGFydF9vZmYuCisgICBZb3UgY2FuIHVzZSBpdCBieTogJ21vZHByb2JlIGFzdXNfb2xlZCBzdGFydF9vZmY9MScsIG9yIGJ5IGFkZGluZyB0aGlzCisgICBsaW5lIHRvIC9ldGMvbW9kcHJvYmUuY29uZjoKKyAgIG9wdGlvbnMgYXN1c19vbGVkIHN0YXJ0X29mZj0xCisKKyAgIFdpdGggdGhpcyBvcHRpb24gcHJvdmlkZWQsIGFzdXNfb2xlZCBkcml2ZXIgd2lsbCBzd2l0Y2ggb2ZmIHRoZSBkaXNwbGF5CisgICB3aGVuIGl0IGlzIGRldGVjdGVkIGFuZCBhdHRhY2hlZC4gSXQgaXMgbmljZSBmZWF0dXJlIHRvIGp1c3Qgc3dpdGNoIG9mZiB0aGUgJ0FTVVMnCisgICBsb2dvLiBJZiB5b3UgZG9uJ3QgdXNlIHRoZSBkaXNwbGF5LCBpdCBpcyBwcm9iYWJseSB0aGUgZ29vZCBpZGVhIHRvIHN3aXRjaCBpdCBvZmYsCisgICB0byBwcm90ZWN0IE9MRURzIGZyb20gIndlYXJpbmcgb2ZmIi4KKworKioqKioqKgorCitVc2FnZQorCisgICBUaGlzIG1vZHVsZSBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHR3byBzcGVjaWFsIGZpbGVzOgorICAgL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF9OL2VuYWJsZWQKKyAgIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfTi9waWN0dXJlCisKKyAgIChOIGlzIHRoZSBkZXZpY2UgbnVtYmVyLCB0aGUgZmlyc3QsIGFuZCBwcm9iYWJseSB0aGUgb25seSwgaGFzIG51bWJlciAxLAorICAgIHNvIGl0IGlzIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfMS9lbmFibGVkCisgICAgYW5kIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfMS9waWN0dXJlKQorCisgICAnZW5hYmxlZCcgZmlsZXMgaXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsICdwaWN0dXJlJyBpcyB3cml0ZWFibGUgb25seS4KKworICAgWW91IGNhbiB3cml0ZSAwIG9yIDEgdG8gJ2VuYWJsZWQnIGZpbGUsIHdoaWNoIHdpbGwgc3dpdGNoCisgICBvbiBhbmQgb2ZmIHRoZSBkaXNwbGF5LiBSZWFkaW5nIGZyb20gdGhpcyBmaWxlIHdpbGwgdGVsbCB5b3UgdGhlIGxhc3QKKyAgIHN0YXR1cyBzZXQsIGVpdGhlciAwIG9yIDEuIEJ5IGRlZmF1bHQgaXQgaXMgMSwgc28gaWYgdGhlIGRldmljZSB3YXMgc2V0IHRvICdvZmYnLAorICAgYW5kIHRoZSBjb21wdXRlciB3YXMgcmVib290ZWQgd2l0aG91dCBwb3dlci1vZmYsIHRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gd3JvbmcKKyAgIHZhbHVlIC0gYmVjYXVzZSB0aGUgZGV2aWNlIGlzIG9mZiwgYnV0IGhhc24ndCBiZWVuIGRpc2FibGVkIHRoaXMgdGltZSBhbmQgaXMKKyAgIGFzc3VtZWQgdG8gYmUgb24uLi4KKworICAgVG8gJ3BpY3R1cmUnIGZpbGUgeW91IHdyaXRlIHBpY3R1cmVzIHRvIGJlIGRpc3BsYXllZCBieSB0aGUgT0xFRCBkZXZpY2UuCisgICBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlOgorICAgPE06V3hIPgorICAgMDAwMDExMTAwMTAxMTEwMDAKKyAgIDAwMDEwMTAxMDEwMTAxMDEwCisgICAuLi4uCisKKyAgIEZpcnN0IGxpbmUgaXMgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gTWVhbmluZyBvZiBmaWVsZHMgaW4gPE06V3hIPjoKKyAgIE0gLSBwaWN0dXJlIG1vZGUuIEl0IGNhbiBiZSBlaXRoZXIgJ3MnIGZvciBzdGF0aWMgcGljdHVyZXMsCisgICAgICAgJ3InIGZvciByb2xsaW5nIHBpY3R1cmVzLCBhbmQgJ2YnIGZvciBmbGFzaGluZyBwaWN0dXJlcy4KKyAgIFcgLSB3aWR0aCBvZiB0aGUgcGljdHVyZS4gTWF5IGJlIGJldHdlZW4gMSBhbmQgMTc5MgorICAgSCAtIGhlaWdodCBvZiB0aGUgcGljdHVyZS4gTWF5IGJlIGJldHdlZW4gMSBhbmQgMzIKKworICAgRm9yIGV4YW1wbGUgPHM6MTI4eDMyPiBtZWFucyBzdGF0aWMgcGljdHVyZSwgMTI4IHBpeGVscyBsb25nIGFuZCAzMiBwaXhlbHMgaGlnaC4KKworICAgVGhlIHBoeXNpY2FsIHNpemUgb2YgdGhlIGRpc3BsYXkgaXMgMTI4eDMyIHBpeGVscy4gU3RhdGljIGFuZCBmbGFzaGluZyBwaWN0dXJlcworICAgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gdGhhdCAoYWN0dWFsbHkgdGhleSBjYW4sIGJ1dCBvbmx5IHBhcnQgb2YgdGhlbSB3aWxsIGJlIGRpc3BsYXllZCA7KSApCisKKyAgIElmIHRoZSBwaWN0dXJlIGlzIHNtYWxsZXIgdGhhbiAxMjh4MzIgaXQgd2lsbCBiZSBjZW50ZXJlZC4gUm9sbGluZyBwaWN0dXJlcyB3aWRlciB0aGFuCisgICAxMjggcGl4ZWxzIHdpbGwgYmUgY2VudGVyZWQgdG9vLCB1bmxlc3MgdGhlaXIgd2lkdGggPSBuKjEyOC4gVmVydGljYWxseSB0aGV5IHdpbGwgYmUKKyAgIGNlbnRlcmVkIGp1c3QgbGlrZSBzdGF0aWMgcGljdHVyZXMsIGlmIHRoZWlyIGhlaWdodCBpcyBzbWFsbGVyIHRoYW4gMzIuCisKKyAgIEZsYXNoaW5nIHBpY3R1cmVzIHdpbGwgYmUgY2VudGVyZWQgaG9yaXpvbnRhbGx5IGlmIHRoZWlyIHdpZHRoIDwgMTI4LCBidXQgdGhleSB3ZXJlCisgICBjZW50ZXJlZCB2ZXJ0aWNhbGx5IGluIGEgZGlmZmVyZW50IHdheS4gSWYgdGhlaXIgaGVpZ2h0IDwgMTYsIHRoZXkgd2lsbCBiZSBjZW50ZXJlZAorICAgaW4gdGhlIHVwcGVyIGhhbGYgb2YgdGhlIGRpc3BsYXkgKHJvd3MgMC0xNSkuIFRoaXMgaXMgYmVjYXVzZSBvbmx5IHRoZSBmaXJzdCBoYWxmCisgICBvZiBmbGFzaGluZyBwaWN0dXJlcyBpcyB1c2VkIGZvciBmbGFzaGluZy4gV2hlbiB0aGUgcGljdHVyZSB3aXRoIGhlaWdoID0gMzIgaXMKKyAgIGRpc3BsYXllZCBpbiBmbGFzaGluZyBtb2RlLCBpdHMgdXBwZXIgMTYgcm93cyB3aWxsIGJlIGZsYXNoaW5nIGluIHRoZSB1cHBlciBoYWxmCisgICBvZiB0aGUgZGlzcGxheSwgYW5kIHRoZSBsb3dlciBoYWxmIHdpbGwgYmUgZW1wdHkuIEFmdGVyIGZldyBzZWNvbmRzIHVwcGVyIHBhcnQgd2lsbAorICAgc3RvcCBmbGFzaGluZyAoYnV0IHRoYXQgcGFydCBvZiB0aGUgcGljdHVyZSB3aWxsIHJlbWFpbiB0aGVyZSksIGFuZCB0aGUgbG93ZXIKKyAgIGhhbGYgb2YgdGhlIGRpc3BsYXkgd2lsbCBzdGFydCBkaXNwbGF5aW4gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIHBpY3R1cmUKKyAgIGluIHJvbGxpbmcgbW9kZSwgdW5sZXNzIGl0IGlzIGVtcHR5LCBvciB0aGUgcGljdHVyZSB3YXMgc21hbGwgZW5vdWdoIHRvIGZpdCBpbgorICAgdXBwZXIgcGFydC4gSXQgaXMgbm90IG1pbmUgaWRlYSwgdGhpcyBpcyBqdXN0IHRoZSB3YXkgQXN1cycgZGlzcGxheSB3b3JrIDspCisgICBTbyBpZiB5b3UgbmVlZCBqdXN0IGZsYXNoaW5nLCB1c2UgYXQgbW9zdCAxMjh4MTYgcGljdHVyZS4gSWYgeW91IG5lZWQgZmxhc2hpbmcgYW5kCisgICByb2xsaW5nLCB1c2Ugd2hvbGUgc2l6ZSBvZiB0aGUgZGlzcGxheS4KKworICAgTGluZXMgZm9sbG93aW5nIHRoZSBmaXJzdCwgY29uZmlndXJhdGlvbiwgbGluZSBhcmUgcGljdHVyZSBkYXRhLiBFYWNoICcxJyBtZWFucworICAgdGhhdCB0aGUgcGl4ZWwgaXMgbGl0LCBhbmQgJzAnIG1lYW5zIHRoYXQgaXQgaXMgbm90LiBZb3UgY2FuIGFsc28gdXNlICcjJyBhcyBPTiwKKyAgIGFuZCAnICcgKHNwYWNlKSBhcyBPRkYuIEVtcHR5IGxpbmVzIGFuZCBhbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgaWdub3JlZC4KKworICAgSXQgaXMgcG9zc2libGUgdG8gd3JpdGUgZXZlcnl0aGluZyBpbiBvbmUgbGluZSA8TTpXeEg+MDEwMTAxMDEwMTAxMDEwMTAuLi4sCisgICBhbmQgVypIIGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkLiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGNoYXJhY3RlcnMsIG5vdGhpbmcgd2lsbCBiZQorICAgZGlzcGxheWVkLiBIb3dldmVyLCB0aGUgJ2xpbmUgbW9kZScgaXMgZWFzaWVyIHRvIHJlYWQgKGFuZCB3cml0ZSksIGFuZCBpdCBhbHNvCisgICBsZXRzIHRvIG9taXQgcGFydHMgb2YgZGF0YS4gV2hlbmV2ZXIgRW5kLU9mLUxpbmUgY2hhcmFjdGVyIGlzIGZvdW5kLCBidXQKKyAgIHRoZSBsaW5lIGlzIG5vdCBXIGNoYXJhY3RlcnMgbG9uZywgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBtaXNzaW5nIGNoYXJhY3RlcnMKKyAgIGFyZSBlcXVhbCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGxpbmUuCisKKyAgIEZvbGxvd2luZyBsaW5lIHJlcHJlc2VudHMgJzAnLCAnMScgYW5kIGEgbG90cyBvZiAnMCdzLCBkZXBlbmRuZyBvbiB0aGUgd2lkdGggb2YgdGhlIHBpY3R1cmUKKyAgIHByb3ZpZGVkIGluIGNvbmZpZ3VyYXRpb24gZGF0YToKKyAgIDAxMAorCisgICBTbyBpZiB5b3UgbmVlZCBlbXB0eSBsaW5lLCBpdCBpcyBzdWZmaWNpZW50IHRvIHdyaXRlIGxpbmUgd2l0aCBvbmx5IG9uZSAnMCcgaW4gaXQuCisgICBUaGUgc2FtZSB3b3JrcyB3aXRoICcxJyAob3IgJyAnIGFuZCAnIycpLgorCisgICBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgZGF0YSBpbiB0aGUgZmlsZSwgdGhleSB3aWxsIGJlIGlnbm9yZWQuIElmIHlvdSBhcmUgbm90IHN1cmUKKyAgIGhvdyBtYW55IGNoYXJhY3RlcnMgeW91IGFyZSBtaXNzaW5nLCB5b3UgY2FuIGFkZCBmZXcgbGluZXMgd2l0aCBvbmUgemVybyBpbiBlYWNoIG9mIHRoZW0uCisKKyAgIFRoZXJlIGFyZSBzb21lIGV4YW1wbGUgcGljdHVyZXMgaW4gLnR4dCBmb3JtYXQsIHRoYXQgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKyAgIGNhdCBmb28udHh0ID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL3BpY3R1cmUKKworICAgSWYgdGhlIGRpc3BsYXkgaXMgc3dpdGNoZWQgb2ZmIHlvdSBhbHNvIG5lZWQgdG8gcnVuOgorICAgZWNobyAxID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL2VuYWJsZWQKKyAgIFRvIHN3aXRjaCBpdCBvZmYsIGp1c3QgdXNlOgorICAgZWNobyAwID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL2VuYWJsZWQKKworCisqKioqKioqCisKKyAgIEZvciBhbnkgYWRkaXRpb25hbCBpbmZvIHBsZWFzZSBoYXZlIGEgbG9vayBhdCBodHRwOi8vbGFwc3VzLmJlcmxpb3MuZGUvYXN1c19vbGVkLmh0bWwKKworCisKKyAgIEpha3ViIFNjaG1pZHRrZSAoc2pha3ViQGdtYWlsLmNvbSkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTQxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1RPRE8KQEAgLTAsMCArMSwxMCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKKwktIHNwYXJzZSBmaXhlcworCS0gYXVkaXQgdGhlIHVzZXJzcGFjZSBpbnRlcmZhY2UKKwkJLSBzeXNmcyB2cy4gY2hhcj8KKwktIERvY3VtZW50YXRpb24vQUJJLyBuZWVkcyB0byBiZSBhZGRlZAorCS0gcHV0IHRoZSBzYW1wbGUgLnR4dCBmaWxlcyBhbmQgUkVBRE1FIGZpbGUgc29tZXdoZXJlLgorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorQ2M6IEpha3ViIFNjaG1pZHRrZSA8c2pha3ViQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NmExODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICogIEFzdXMgT0xFRCBVU0IgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNywyMDA4IEpha3ViIFNjaG1pZHRrZSAoc2pha3ViQGdtYWlsLmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKgorICoKKyAqICBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB1c2JsZWQgYW5kIGFzdXMtbGFwdG9wIG1vZHVsZXMuCisgKgorICoKKyAqICBBc3VzIE9MRUQgc3VwcG9ydCBpcyBiYXNlZCBvbiBhc3Vzb2xlZCBwcm9ncmFtIHRha2VuIGZyb20KKyAqICBodHRwczovL2xhdW5jaHBhZC5uZXQvYXN1c29sZWQvLgorICoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjZGVmaW5lIEFTVVNfT0xFRF9WRVJTSU9OCQkiMC4wNC1kZXYiCisjZGVmaW5lIEFTVVNfT0xFRF9OQU1FCQkJImFzdXMtb2xlZCIKKyNkZWZpbmUgQVNVU19PTEVEX1VOREVSU0NPUkVfTkFNRQkiYXN1c19vbGVkIgorCisjZGVmaW5lIEFTVVNfT0xFRF9FUlJPUgkJCSJBc3VzIE9MRUQgRGlzcGxheSBFcnJvcjogIgorCisjZGVmaW5lIEFTVVNfT0xFRF9TVEFUSUMJCSdzJworI2RlZmluZSBBU1VTX09MRURfUk9MTAkJCSdyJworI2RlZmluZSBBU1VTX09MRURfRkxBU0gJCQknZicKKworI2RlZmluZSBBU1VTX09MRURfTUFYX1dJRFRICQkxNzkyCisjZGVmaW5lIEFTVVNfT0xFRF9ESVNQX0hFSUdIVAkJMzIKKyNkZWZpbmUgQVNVU19PTEVEX1BBQ0tFVF9CVUZfU0laRQkyNTYKKworTU9EVUxFX0FVVEhPUigiSmFrdWIgU2NobWlkdGtlLCBzamFrdWJAZ21haWwuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFzdXMgT0xFRCBEcml2ZXIgdiIgQVNVU19PTEVEX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IGNsYXNzICpvbGVkX2NsYXNzID0gMDsKK3N0YXRpYyBpbnQgb2xlZF9udW0gPSAwOworCitzdGF0aWMgdWludCBzdGFydF9vZmYgPSAwOworCittb2R1bGVfcGFyYW0oc3RhcnRfb2ZmLCB1aW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9vZmYsICJTZXQgdG8gMSB0byBzd2l0Y2ggb2ZmIE9MRUQgZGlzcGxheSBhZnRlciBpdCBpcyBhdHRhY2hlZCIpOworCit0eXBlZGVmIGVudW0geworCVBBQ0tfTU9ERV9HMSwKKwlQQUNLX01PREVfRzUwLAorCVBBQ0tfTU9ERV9MQVNUCit9IG9sZWRfcGFja19tb2RlX3Q7CisKK3N0cnVjdCBvbGVkX2Rldl9kZXNjX3N0ciB7CisJdWludDE2X3QJCWlkVmVuZG9yOworCXVpbnQxNl90CQlpZFByb2R1Y3Q7CisJdWludDE2X3QJCWRldldpZHRoOyAvLyB3aWR0aCBvZiBkaXNwbGF5CisJb2xlZF9wYWNrX21vZGVfdAlwYWNrTW9kZTsgLy8gZm9ybXVsYSB0byBiZSB1c2VkIHdoaWxlIHBhY2tpbmcgdGhlIHBpY3R1cmUKKwljb25zdCBjaGFyCQkqZGV2RGVzYzsKK307CisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwYjA1LCAweDE3MjYpIH0sIC8vIEFzdXMgRzEvRzIgKGFuZCB2YXJpYW50cykKKwl7IFVTQl9ERVZJQ0UoMHgwYjA1LCAweDE3NWIpIH0sIC8vIEFzdXMgRzUwViAoYW5kIHBvc3NpYmx5IG90aGVycyAtIEc3MD8gRzcxPykKKwl7IH0sCit9OworCisvKiBwYXJhbWV0ZXJzIG9mIHNwZWNpZmljIGRldmljZXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2xlZF9kZXZfZGVzY19zdHIgb2xlZF9kZXZfZGVzY190YWJsZSBbXSA9IHsKKwl7IDB4MGIwNSwgMHgxNzI2LCAxMjgsIFBBQ0tfTU9ERV9HMSwgIkcxL0cyIiB9LAorCXsgMHgwYjA1LCAweDE3NWIsIDI1NiwgUEFDS19NT0RFX0c1MCwgIkc1MCIgfSwKKwl7IH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGlkX3RhYmxlKTsKKworI2RlZmluZSBTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgdmFsMSwgdmFsMiwgdmFsMywgdmFsNCwgdmFsNSwgdmFsNiwgdmFsNykgXAorCWRvIHsJCQkJCVwKKwkJbWVtc2V0KHBhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfaGVhZGVyKSk7CQlcCisJCXBhY2tldC0+aGVhZGVyLm1hZ2ljMSA9IDB4NTU7CQlcCisJCXBhY2tldC0+aGVhZGVyLm1hZ2ljMiA9IDB4YWE7CQlcCisJCXBhY2tldC0+aGVhZGVyLmZsYWdzID0gdmFsMTsJCVwKKwkJcGFja2V0LT5oZWFkZXIudmFsdWUzID0gdmFsMjsJCVwKKwkJcGFja2V0LT5oZWFkZXIuYnVmZmVyMSA9IHZhbDM7CQlcCisJCXBhY2tldC0+aGVhZGVyLmJ1ZmZlcjIgPSB2YWw0OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTYgPSB2YWw1OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTcgPSB2YWw2OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTggPSB2YWw3OwkJXAorCX0gd2hpbGUoMCk7CisKK3N0cnVjdCBhc3VzX29sZWRfaGVhZGVyIHsKKwl1aW50OF90CQltYWdpYzE7CisJdWludDhfdAkJbWFnaWMyOworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCXZhbHVlMzsKKwl1aW50OF90CQlidWZmZXIxOworCXVpbnQ4X3QJCWJ1ZmZlcjI7CisJdWludDhfdAkJdmFsdWU2OworCXVpbnQ4X3QJCXZhbHVlNzsKKwl1aW50OF90CQl2YWx1ZTg7CisJdWludDhfdAkJcGFkZGluZzJbN107Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgeworCXN0cnVjdCBhc3VzX29sZWRfaGVhZGVyCQloZWFkZXI7CisJdWludDhfdAkJCQliaXRtYXBbQVNVU19PTEVEX1BBQ0tFVF9CVUZfU0laRV07Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IGFzdXNfb2xlZF9kZXYgeworCXN0cnVjdCB1c2JfZGV2aWNlICoJdWRldjsKKwl1aW50OF90CQkJcGljX21vZGU7CisJdWludDE2X3QJCWRldl93aWR0aDsKKwlvbGVkX3BhY2tfbW9kZV90CXBhY2tfbW9kZTsKKwlzaXplX3QJCQloZWlnaHQ7CisJc2l6ZV90CQkJd2lkdGg7CisJc2l6ZV90CQkJeF9zaGlmdDsKKwlzaXplX3QJCQl5X3NoaWZ0OworCXNpemVfdAkJCWJ1Zl9vZmZzOworCXVpbnQ4X3QJCQlsYXN0X3ZhbDsKKwlzaXplX3QJCQlidWZfc2l6ZTsKKwljaGFyCQkJKmJ1ZjsKKwl1aW50OF90CQkJZW5hYmxlZDsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworfTsKKworc3RhdGljIHZvaWQgZW5hYmxlX29sZWQoc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYsIHVpbnQ4X3QgZW5hYmwpCit7CisJaW50IGE7CisJaW50IHJldHZhbDsKKwlpbnQgYWN0X2xlbjsKKwlzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqIHBhY2tldDsKKworCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfcGFja2V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXBhY2tldCkgeworCQlkZXZfZXJyKCZvZGV2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCVNFVFVQX1BBQ0tFVF9IRUFERVIocGFja2V0LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwKTsKKworCWlmIChlbmFibCkgcGFja2V0LT5iaXRtYXBbMF0gPSAweGFmOworCWVsc2UgcGFja2V0LT5iaXRtYXBbMF0gPSAweGFlOworCisJZm9yIChhPTA7IGE8MTsgYSsrKSB7CisJCXJldHZhbCA9IHVzYl9idWxrX21zZyhvZGV2LT51ZGV2LAorCQkJdXNiX3NuZGJ1bGtwaXBlKG9kZXYtPnVkZXYsIDIpLAorCQkJcGFja2V0LAorCQkJc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfaGVhZGVyKSArIDEsCisJCQkmYWN0X2xlbiwKKwkJCS0xKTsKKworCQlpZiAocmV0dmFsKQorCQkJZGV2X2RiZygmb2Rldi0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CisJfQorCisJb2Rldi0+ZW5hYmxlZCA9IGVuYWJsOworCisJa2ZyZWUocGFja2V0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwllbmFibGVfb2xlZChvZGV2LCB0ZW1wKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgY2xhc3Nfc2V0X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYgPSAoc3RydWN0IGFzdXNfb2xlZF9kZXYgKikgZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZW5hYmxlX29sZWQob2RldiwgdGVtcCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgb2Rldi0+ZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNsYXNzX2dldF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiA9IChzdHJ1Y3QgYXN1c19vbGVkX2RldiAqKSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBvZGV2LT5lbmFibGVkKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqcGFja2V0LAorCWNoYXIgKmJ1ZiwgdWludDhfdCBwX3R5cGUsIHNpemVfdCBwX251bSkKK3sKKwlzaXplX3QgaTsKKwlpbnQgYWN0X2xlbjsKKworCWZvciAoaSA9IDA7IGkgPCBwX251bTsgaSsrKSB7CisJCWludCByZXR2YWw7CisKKwkJc3dpdGNoIChwX3R5cGUpIHsKKwkJCWNhc2UgQVNVU19PTEVEX1JPTEw6CisJCQkJU0VUVVBfUEFDS0VUX0hFQURFUihwYWNrZXQsIDB4NDAsIDB4ODAsIHBfbnVtLCBpICsgMSwgMHgwMCwgMHgwMSwgMHhmZik7CisJCQlicmVhazsKKwkJCWNhc2UgQVNVU19PTEVEX1NUQVRJQzoKKwkJCQlTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgMHgxMCArIGksIDB4ODAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDApOworCQkJYnJlYWs7CisJCQljYXNlIEFTVVNfT0xFRF9GTEFTSDoKKwkJCQlTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgMHgxMCArIGksIDB4ODAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ZmYpOworCQkJYnJlYWs7CisJCX0KKworCQltZW1jcHkocGFja2V0LT5iaXRtYXAsIGJ1ZiArIChBU1VTX09MRURfUEFDS0VUX0JVRl9TSVpFKmkpLCBBU1VTX09MRURfUEFDS0VUX0JVRl9TSVpFKTsKKworCQlyZXR2YWwgPSB1c2JfYnVsa19tc2codWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1ZGV2LCAyKSwKKwkJCXBhY2tldCwKKwkJCXNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCksCisJCQkmYWN0X2xlbiwKKwkJCS0xKTsKKworCQlpZiAocmV0dmFsKQorCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgKnBhY2tldCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbiwgY2hhciAqYnVmLCB1aW50OF90IGIxLCB1aW50OF90IGIyLCB1aW50OF90IGIzLCB1aW50OF90IGI0LCB1aW50OF90IGI1LCB1aW50OF90IGI2KXsKKwlpbnQgcmV0dmFsOworCWludCBhY3RfbGVuOworCisJU0VUVVBfUEFDS0VUX0hFQURFUihwYWNrZXQsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIDB4MDApOworCW1lbWNweShwYWNrZXQtPmJpdG1hcCwgYnVmICsgb2Zmc2V0LCBsZW4pOworCisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKHVkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUodWRldiwgMiksCisJCQlwYWNrZXQsCisJCQlzaXplb2Yoc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQpLAorCQkJJmFjdF9sZW4sCisJCQktMSk7CisKKwlpZiAocmV0dmFsKQorCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKK30KKworCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldHNfZzUwKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqcGFja2V0LCBjaGFyICpidWYpCit7CisJc2VuZF9wYWNrZXQodWRldiwgcGFja2V0LCAgICAgMCwgMHgxMDAsIGJ1ZiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMSk7CisJc2VuZF9wYWNrZXQodWRldiwgcGFja2V0LCAweDEwMCwgMHgwODAsIGJ1ZiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHg4MCwgMHgwMCk7CisKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MTgwLCAweDEwMCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAxLCAweDAwLCAweDAxKTsKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MjgwLCAweDEwMCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAyLCAweDAwLCAweDAxKTsKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MzgwLCAweDA4MCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAzLCAweDgwLCAweDAwKTsKK30KKworCitzdGF0aWMgdm9pZCBzZW5kX2RhdGEoc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYpCit7CisJc2l6ZV90IHBhY2tldF9udW0gPSBvZGV2LT5idWZfc2l6ZSAvIEFTVVNfT0xFRF9QQUNLRVRfQlVGX1NJWkU7CisJc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgKiBwYWNrZXQ7CisKKwlwYWNrZXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwYWNrZXQpIHsKKwkJZGV2X2Vycigmb2Rldi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAob2Rldi0+cGFja19tb2RlPT1QQUNLX01PREVfRzEpeworCQkvLyBXaGVuIHNlbmRpbmcgcm9sbC1tb2RlIGRhdGEgdGhlIGRpc3BsYXkgdXBkYXRlZCBvbmx5IGZpcnN0IHBhY2tldC4KKwkJLy8gSSBoYXZlIG5vIGlkZWEgd2h5LCBidXQgd2hlbiBzdGF0aWMgcGljdHVyZSBpcyBzZW5kIGp1c3QgYmVmb3JlCisJCS8vIHJvbGxpbmcgcGljdHVyZSAtIGV2ZXJ5dGhpbmcgd29ya3MgZmluZS4KKwkJaWYgKG9kZXYtPnBpY19tb2RlID09IEFTVVNfT0xFRF9ST0xMKQorCQkJc2VuZF9wYWNrZXRzKG9kZXYtPnVkZXYsIHBhY2tldCwgb2Rldi0+YnVmLCBBU1VTX09MRURfU1RBVElDLCAyKTsKKworCQkvLyBPbmx5IFJPTEwgbW9kZSBjYW4gdXNlIG1vcmUgdGhhbiAyIHBhY2tldHMuCisJCWlmIChvZGV2LT5waWNfbW9kZSAhPSBBU1VTX09MRURfUk9MTCAmJiBwYWNrZXRfbnVtID4gMikKKwkJCXBhY2tldF9udW0gPSAyOworCisJCXNlbmRfcGFja2V0cyhvZGV2LT51ZGV2LCBwYWNrZXQsIG9kZXYtPmJ1Ziwgb2Rldi0+cGljX21vZGUsIHBhY2tldF9udW0pOworCX0KKwllbHNlCisJaWYgKG9kZXYtPnBhY2tfbW9kZT09UEFDS19NT0RFX0c1MCl7CisJCXNlbmRfcGFja2V0c19nNTAob2Rldi0+dWRldiwgcGFja2V0LCBvZGV2LT5idWYpOworCX0KKworCWtmcmVlKHBhY2tldCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3ZhbHVlcyhzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiwgdWludDhfdCB2YWwsIHNpemVfdCBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJaWYgKHZhbCkgeworCQkJc2l6ZV90IHggPSBvZGV2LT5idWZfb2ZmcyAlIG9kZXYtPndpZHRoOworCQkJc2l6ZV90IHkgPSBvZGV2LT5idWZfb2ZmcyAvIG9kZXYtPndpZHRoOworCQkJc2l6ZV90IGk7CisKKwkJCXggKz0gb2Rldi0+eF9zaGlmdDsKKwkJCXkgKz0gb2Rldi0+eV9zaGlmdDsKKworCQkJc3dpdGNoKG9kZXYtPnBhY2tfbW9kZSkKKwkJCXsKKwkJCQljYXNlIFBBQ0tfTU9ERV9HMToKKwkJCQkJLy8gaSA9ICh4LzEyOCkqNjQwICsgMTI3IC0geCArICh5LzgpKjEyODsKKwkJCQkJLy8gVGhpcyBvbmUgZm9yIDEyOCBpcyB0aGUgc2FtZSwgYnV0IG1pZ2h0IGJlIGJldHRlciBmb3IgZGlmZmVyZW50IHdpZHRocz8KKwkJCQkJaSA9ICh4L29kZXYtPmRldl93aWR0aCkqNjQwICsgb2Rldi0+ZGV2X3dpZHRoIC0gMSAtIHggKyAoeS84KSpvZGV2LT5kZXZfd2lkdGg7CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIFBBQ0tfTU9ERV9HNTA6CisJCQkJCWkgPSAgKG9kZXYtPmRldl93aWR0aCAtIDEgLSB4KS84ICsgeSpvZGV2LT5kZXZfd2lkdGgvODsKKwkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWkgPSAwOworCQkJCQlwcmludGsoQVNVU19PTEVEX0VSUk9SICJVbmtub3duIE9MRUQgUGFjayBNb2RlOiAlZCFcbiIsIG9kZXYtPnBhY2tfbW9kZSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpID49IG9kZXYtPmJ1Zl9zaXplKSB7CisJCQkJcHJpbnRrKEFTVVNfT0xFRF9FUlJPUiAiQnVmZmVyIG92ZXJmbG93ISBSZXBvcnQgYSBidWcgaW4gdGhlIGRyaXZlcjogb2ZmczogJWQgPj0gJWQgaTogJWQgKHg6ICVkIHk6ICVkKVxuIiwKKwkJCQkJKGludCkgb2Rldi0+YnVmX29mZnMsIChpbnQpIG9kZXYtPmJ1Zl9zaXplLCAoaW50KSBpLCAoaW50KSB4LCAoaW50KSB5KTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJc3dpdGNoIChvZGV2LT5wYWNrX21vZGUpCisJCQl7CisJCQkJY2FzZSBQQUNLX01PREVfRzE6CisJCQkJCW9kZXYtPmJ1ZltpXSAmPSB+KDE8PCh5JTgpKTsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgUEFDS19NT0RFX0c1MDoKKwkJCQkJb2Rldi0+YnVmW2ldICY9IH4oMTw8KHglOCkpOworCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJLy8gY2Fubm90IGdldCBoZXJlOyBzdG9wcyBnY2MgY29tcGxhaW5pbmcKKwkJCQk7CisJCQl9CisJCX0KKworCQlvZGV2LT5sYXN0X3ZhbCA9IHZhbDsKKwkJb2Rldi0+YnVmX29mZnMrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgb2Rldl9zZXRfcGljdHVyZShzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IG9mZnMgPSAwLCBtYXhfb2ZmczsKKworCWlmIChjb3VudCA8IDEpIHJldHVybiAwOworCisJaWYgKHRvbG93ZXIoYnVmWzBdKSA9PSAnYicpeworCSAgICAvLyBiaW5hcnkgbW9kZSwgc2V0IHRoZSBlbnRpcmUgbWVtb3J5CisKKwkgICAgc2l6ZV90IGk7CisKKwkgICAgb2Rldi0+YnVmX3NpemUgPSAob2Rldi0+ZGV2X3dpZHRoICogQVNVU19PTEVEX0RJU1BfSEVJR0hUKSAvIDg7CisKKwkgICAgaWYgKG9kZXYtPmJ1Zikga2ZyZWUob2Rldi0+YnVmKTsKKwkgICAgb2Rldi0+YnVmID0ga21hbGxvYyhvZGV2LT5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwkgICAgbWVtc2V0KG9kZXYtPmJ1ZiwgMHhmZiwgb2Rldi0+YnVmX3NpemUpOworCisJICAgIGZvciAoaT0xOyBpIDwgY291bnQgJiYgaTw9MzIqMzI7IGkrKyl7CisJCW9kZXYtPmJ1ZltpLTFdID0gYnVmW2ldOworCQlvZGV2LT5idWZfb2ZmcyA9IGktMTsKKwkgICAgfQorCisJICAgIG9kZXYtPndpZHRoPW9kZXYtPmRldl93aWR0aCAvIDg7CisJICAgIG9kZXYtPmhlaWdodD1BU1VTX09MRURfRElTUF9IRUlHSFQ7CisJICAgIG9kZXYtPnhfc2hpZnQ9MDsKKwkgICAgb2Rldi0+eV9zaGlmdD0wOworCSAgICBvZGV2LT5sYXN0X3ZhbD0wOworCisJICAgIHNlbmRfZGF0YShvZGV2KTsKKworCSAgICByZXR1cm4gY291bnQ7CisJfQorCisJaWYgKGJ1ZlswXSA9PSAnPCcpIHsKKwkJc2l6ZV90IGk7CisJCXNpemVfdCB3ID0gMCwgaCA9IDA7CisJCXNpemVfdCB3X21lbSwgaF9tZW07CisKKwkJaWYgKGNvdW50IDwgMTAgfHwgYnVmWzJdICE9ICc6JykgeworCQkJZ290byBlcnJvcl9oZWFkZXI7CisJCX0KKworCQlzd2l0Y2godG9sb3dlcihidWZbMV0pKSB7CisJCQljYXNlIEFTVVNfT0xFRF9TVEFUSUM6CisJCQljYXNlIEFTVVNfT0xFRF9ST0xMOgorCQkJY2FzZSBBU1VTX09MRURfRkxBU0g6CisJCQkJb2Rldi0+cGljX21vZGUgPSBidWZbMV07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgbW9kZTogJyVjJy5cbiIsIGJ1ZlsxXSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGkgPSAzOyBpIDwgY291bnQ7ICsraSkgeworCQkJaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgeworCQkJCXcgPSAxMCp3ICsgKGJ1ZltpXSAtICcwJyk7CisKKwkJCQlpZiAodyA+IEFTVVNfT0xFRF9NQVhfV0lEVEgpIGdvdG8gZXJyb3Jfd2lkdGg7CisJCQl9CisJCQllbHNlIGlmICh0b2xvd2VyKGJ1ZltpXSkgPT0gJ3gnKSBicmVhazsKKwkJCWVsc2UgZ290byBlcnJvcl93aWR0aDsKKwkJfQorCisJCWZvciAoKytpOyBpIDwgY291bnQ7ICsraSkgeworCQkJaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgeworCQkJCWggPSAxMCpoICsgKGJ1ZltpXSAtICcwJyk7CisKKwkJCQlpZiAoaCA+IEFTVVNfT0xFRF9ESVNQX0hFSUdIVCkgZ290byBlcnJvcl9oZWlnaHQ7CisJCQl9CisJCQllbHNlIGlmICh0b2xvd2VyKGJ1ZltpXSkgPT0gJz4nKSBicmVhazsKKwkJCWVsc2UgZ290byBlcnJvcl9oZWlnaHQ7CisJCX0KKworCQlpZiAodyA8IDEgfHwgdyA+IEFTVVNfT0xFRF9NQVhfV0lEVEgpIGdvdG8gZXJyb3Jfd2lkdGg7CisKKwkJaWYgKGggPCAxIHx8IGggPiBBU1VTX09MRURfRElTUF9IRUlHSFQpIGdvdG8gZXJyb3JfaGVpZ2h0OworCisJCWlmIChpID49IGNvdW50IHx8IGJ1ZltpXSAhPSAnPicpIGdvdG8gZXJyb3JfaGVhZGVyOworCisJCW9mZnMgPSBpKzE7CisKKwkJaWYgKHcgJSAob2Rldi0+ZGV2X3dpZHRoKSAhPSAwKQorCQkJd19tZW0gPSAody8ob2Rldi0+ZGV2X3dpZHRoKSArIDEpKihvZGV2LT5kZXZfd2lkdGgpOworCQllbHNlCisJCQl3X21lbSA9IHc7CisKKwkJaWYgKGggPCBBU1VTX09MRURfRElTUF9IRUlHSFQpCisJCQloX21lbSA9IEFTVVNfT0xFRF9ESVNQX0hFSUdIVDsKKwkJZWxzZQorCQkJaF9tZW0gPSBoOworCisJCW9kZXYtPmJ1Zl9zaXplID0gd19tZW0gKiBoX21lbSAvIDg7CisKKwkJaWYgKG9kZXYtPmJ1Zikga2ZyZWUob2Rldi0+YnVmKTsKKwkJb2Rldi0+YnVmID0ga21hbGxvYyhvZGV2LT5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKG9kZXYtPmJ1ZiA9PSBOVUxMKSB7CisJCQlvZGV2LT5idWZfc2l6ZSA9IDA7CisJCQlwcmludGsoQVNVU19PTEVEX0VSUk9SICJPdXQgb2YgbWVtb3J5IVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCW1lbXNldChvZGV2LT5idWYsIDB4ZmYsIG9kZXYtPmJ1Zl9zaXplKTsKKworCQlvZGV2LT5idWZfb2ZmcyA9IDA7CisJCW9kZXYtPndpZHRoID0gdzsKKwkJb2Rldi0+aGVpZ2h0ID0gaDsKKwkJb2Rldi0+eF9zaGlmdCA9IDA7CisJCW9kZXYtPnlfc2hpZnQgPSAwOworCQlvZGV2LT5sYXN0X3ZhbCA9IDA7CisKKwkJaWYgKG9kZXYtPnBpY19tb2RlID09IEFTVVNfT0xFRF9GTEFTSCkgeworCQkJaWYgKGggPCBBU1VTX09MRURfRElTUF9IRUlHSFQvMikKKwkJCQlvZGV2LT55X3NoaWZ0ID0gKEFTVVNfT0xFRF9ESVNQX0hFSUdIVC8yIC0gaCkvMjsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChoIDwgQVNVU19PTEVEX0RJU1BfSEVJR0hUKQorCQkJCW9kZXYtPnlfc2hpZnQgPSAoQVNVU19PTEVEX0RJU1BfSEVJR0hUIC0gaCkvMjsKKwkJfQorCisJCWlmICh3IDwgKG9kZXYtPmRldl93aWR0aCkpCisJCQlvZGV2LT54X3NoaWZ0ID0gKChvZGV2LT5kZXZfd2lkdGgpIC0gdykvMjsKKwl9CisKKwltYXhfb2ZmcyA9IG9kZXYtPndpZHRoICogb2Rldi0+aGVpZ2h0OworCisJd2hpbGUgKG9mZnMgPCBjb3VudCAmJiBvZGV2LT5idWZfb2ZmcyA8IG1heF9vZmZzKSB7CisJCWludCByZXQ7CisKKwkJaWYgKGJ1ZltvZmZzXSA9PSAnMScgfHwgYnVmW29mZnNdID09ICcjJykgeworCQkJaWYgKCAocmV0ID0gYXBwZW5kX3ZhbHVlcyhvZGV2LCAxLCAxKSkgPCAwKSByZXR1cm4gcmV0OworCQl9CisJCWVsc2UgaWYgKGJ1ZltvZmZzXSA9PSAnMCcgfHwgYnVmW29mZnNdID09ICcgJykgeworCQkJaWYgKCAocmV0ID0gYXBwZW5kX3ZhbHVlcyhvZGV2LCAwLCAxKSkgPCAwKSByZXR1cm4gcmV0OworCQl9CisJCWVsc2UgaWYgKGJ1ZltvZmZzXSA9PSAnXG4nKSB7CisJCQkvLyBOZXcgbGluZSBkZXRlY3RlZC4gTGV0cyBhc3N1bWUsIHRoYXQgYWxsIGNoYXJhY3RlcnMgdGlsbCB0aGUgZW5kIG9mIHRoZQorCQkJLy8gbGluZSB3ZXJlIGVxdWFsIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGlzIGxpbmUuCisJCQlpZiAob2Rldi0+YnVmX29mZnMgJSBvZGV2LT53aWR0aCAhPSAwKQorCQkJCWlmICggKHJldCA9IGFwcGVuZF92YWx1ZXMob2Rldiwgb2Rldi0+bGFzdF92YWwsCisJCQkJICAgICAgb2Rldi0+d2lkdGggLSAob2Rldi0+YnVmX29mZnMgJSBvZGV2LT53aWR0aCkpKSA8IDApIHJldHVybiByZXQ7CisJCX0KKworCQlvZmZzKys7CisJfQorCisJaWYgKG9kZXYtPmJ1Zl9vZmZzID49IG1heF9vZmZzKSBzZW5kX2RhdGEob2Rldik7CisKKwlyZXR1cm4gY291bnQ7CisKK2Vycm9yX3dpZHRoOgorCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgd2lkdGggc3BlY2lmaWVkLlxuIik7CisJcmV0dXJuIC1FSU87CisKK2Vycm9yX2hlaWdodDoKKwlwcmludGsoQVNVU19PTEVEX0VSUk9SICJXcm9uZyBwaWN0dXJlIGhlaWdodCBzcGVjaWZpZWQuXG4iKTsKKwlyZXR1cm4gLUVJTzsKKworZXJyb3JfaGVhZGVyOgorCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgaGVhZGVyLlxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9waWN0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCisJcmV0dXJuIG9kZXZfc2V0X3BpY3R1cmUodXNiX2dldF9pbnRmZGF0YShpbnRmKSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNsYXNzX3NldF9waWN0dXJlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBvZGV2X3NldF9waWN0dXJlKChzdHJ1Y3QgYXN1c19vbGVkX2RldiAqKSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKSwgYnVmLCBjb3VudCk7Cit9CisKKyNkZWZpbmUgQVNVU19PTEVEX0RFVklDRV9BVFRSKF9maWxlKQkJZGV2X2F0dHJfYXN1c19vbGVkXyMjX2ZpbGUKKworc3RhdGljIERFVklDRV9BVFRSKGFzdXNfb2xlZF9lbmFibGVkLCBTX0lXVUdPIHwgU19JUlVHTywgZ2V0X2VuYWJsZWQsIHNldF9lbmFibGVkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhc3VzX29sZWRfcGljdHVyZSwgU19JV1VHTyAsIE5VTEwsIHNldF9waWN0dXJlKTsKKworc3RhdGljIERFVklDRV9BVFRSKGVuYWJsZWQsIFNfSVdVR08gfCBTX0lSVUdPLCBjbGFzc19nZXRfZW5hYmxlZCwgY2xhc3Nfc2V0X2VuYWJsZWQpOworc3RhdGljIERFVklDRV9BVFRSKHBpY3R1cmUsIFNfSVdVR08sIE5VTEwsIGNsYXNzX3NldF9waWN0dXJlKTsKKworc3RhdGljIGludCBhc3VzX29sZWRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2ID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwl1aW50MTZfdCBkZXZfd2lkdGggPSAwOworCW9sZWRfcGFja19tb2RlX3QgcGFja19tb2RlID0gUEFDS19NT0RFX0xBU1Q7CisJY29uc3Qgc3RydWN0IG9sZWRfZGV2X2Rlc2Nfc3RyICogZGV2X2Rlc2MgPSBvbGVkX2Rldl9kZXNjX3RhYmxlOworCWNvbnN0IGNoYXIgKmRlc2MgPSAwOworCisJaWYgKGlkID09IDApIHsKKwkJLy8gRXZlbiBwb3NzaWJsZT8gSnVzdCB0byBtYWtlIHN1cmUuLi4KKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJObyB1c2JfZGV2aWNlX2lkIHByb3ZpZGVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoOyBkZXZfZGVzYy0+aWRWZW5kb3I7IGRldl9kZXNjKyspCisJeworCQlpZiAoZGV2X2Rlc2MtPmlkVmVuZG9yID09IGlkLT5pZFZlbmRvcgorCQkJJiYgZGV2X2Rlc2MtPmlkUHJvZHVjdCA9PSBpZC0+aWRQcm9kdWN0KQorCQl7CisJCQlkZXZfd2lkdGggPSBkZXZfZGVzYy0+ZGV2V2lkdGg7CisJCQlkZXNjID0gZGV2X2Rlc2MtPmRldkRlc2M7CisJCQlwYWNrX21vZGUgPSBkZXZfZGVzYy0+cGFja01vZGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggIWRlc2MgfHwgZGV2X3dpZHRoIDwgMSB8fCBwYWNrX21vZGUgPT0gUEFDS19NT0RFX0xBU1QpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJNaXNzaW5nIG9yIGluY29tcGxldGUgZGV2aWNlIGRlc2NyaXB0aW9uIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX2RldiksIEdGUF9LRVJORUwpOworCisJaWYgKG9kZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CisJb2Rldi0+cGljX21vZGUgPSBBU1VTX09MRURfU1RBVElDOworCW9kZXYtPmRldl93aWR0aCA9IGRldl93aWR0aDsKKwlvZGV2LT5wYWNrX21vZGUgPSBwYWNrX21vZGU7CisJb2Rldi0+aGVpZ2h0ID0gMDsKKwlvZGV2LT53aWR0aCA9IDA7CisJb2Rldi0+eF9zaGlmdCA9IDA7CisJb2Rldi0+eV9zaGlmdCA9IDA7CisJb2Rldi0+YnVmX29mZnMgPSAwOworCW9kZXYtPmJ1Zl9zaXplID0gMDsKKwlvZGV2LT5sYXN0X3ZhbCA9IDA7CisJb2Rldi0+YnVmID0gTlVMTDsKKwlvZGV2LT5lbmFibGVkID0gMTsKKwlvZGV2LT5kZXYgPSAwOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBvZGV2KTsKKworCWlmICgocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJkFTVVNfT0xFRF9ERVZJQ0VfQVRUUihlbmFibGVkKSkpKSB7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCWlmICgocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJkFTVVNfT0xFRF9ERVZJQ0VfQVRUUihwaWN0dXJlKSkpKSB7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCW9kZXYtPmRldiA9IGRldmljZV9jcmVhdGUob2xlZF9jbGFzcywgJmludGVyZmFjZS0+ZGV2LCBNS0RFVigwLDApLAorCQkJCU5VTEwsIm9sZWRfJWQiLCArK29sZWRfbnVtKTsKKworCWlmIChJU19FUlIob2Rldi0+ZGV2KSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKG9kZXYtPmRldik7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YShvZGV2LT5kZXYsIG9kZXYpOworCisJaWYgKCAocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZWQpKSkgeworCQlnb3RvIGVycl9jbGFzc19lbmFibGVkOworCX0KKworCWlmICggKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKSkpIHsKKwkJZ290byBlcnJfY2xhc3NfcGljdHVyZTsKKwl9CisKKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJBdHRhY2hlZCBBc3VzIE9MRUQgZGV2aWNlOiAlcyBbd2lkdGggJXUsIHBhY2tfbW9kZSAlZF1cbiIsIGRlc2MsIG9kZXYtPmRldl93aWR0aCwgb2Rldi0+cGFja19tb2RlKTsKKworCWlmIChzdGFydF9vZmYpCisJCWVuYWJsZV9vbGVkKG9kZXYsIDApOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGFzc19waWN0dXJlOgorCWRldmljZV9yZW1vdmVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKTsKKworZXJyX2NsYXNzX2VuYWJsZWQ6CisJZGV2aWNlX3JlbW92ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZWQpOworCWRldmljZV91bnJlZ2lzdGVyKG9kZXYtPmRldik7CisKK2Vycl9maWxlczoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmQVNVU19PTEVEX0RFVklDRV9BVFRSKGVuYWJsZWQpKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmQVNVU19PTEVEX0RFVklDRV9BVFRSKHBpY3R1cmUpKTsKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgTlVMTCk7CisJdXNiX3B1dF9kZXYob2Rldi0+dWRldik7CisJa2ZyZWUob2Rldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBhc3VzX29sZWRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2OworCisJb2RldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBOVUxMKTsKKworCWRldmljZV9yZW1vdmVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUob2Rldi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlZCk7CisJZGV2aWNlX3VucmVnaXN0ZXIob2Rldi0+ZGV2KTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICYgQVNVU19PTEVEX0RFVklDRV9BVFRSKHBpY3R1cmUpKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmIEFTVVNfT0xFRF9ERVZJQ0VfQVRUUihlbmFibGVkKSk7CisKKwl1c2JfcHV0X2RldihvZGV2LT51ZGV2KTsKKworCWlmIChvZGV2LT5idWYpIGtmcmVlKG9kZXYtPmJ1Zik7CisKKwlrZnJlZShvZGV2KTsKKworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIkRpc2Nvbm5lY3RlZCBBc3VzIE9MRUQgZGV2aWNlXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG9sZWRfZHJpdmVyID0geworCS5uYW1lID0JCUFTVVNfT0xFRF9OQU1FLAorCS5wcm9iZSA9CWFzdXNfb2xlZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CWFzdXNfb2xlZF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWlkX3RhYmxlLAorfTsKKworc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBjbGFzcyAqZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCBBU1VTX09MRURfVU5ERVJTQ09SRV9OQU1FICIgJXNcbiIsIEFTVVNfT0xFRF9WRVJTSU9OKTsKK30KKworc3RhdGljIENMQVNTX0FUVFIodmVyc2lvbiwgU19JUlVHTywgdmVyc2lvbl9zaG93LCBOVUxMKTsKKworc3RhdGljIGludCBfX2luaXQgYXN1c19vbGVkX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlvbGVkX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBBU1VTX09MRURfVU5ERVJTQ09SRV9OQU1FKTsKKworCWlmIChJU19FUlIob2xlZF9jbGFzcykpIHsKKwkJZXJyKCJFcnJvciBjcmVhdGluZyAiIEFTVVNfT0xFRF9VTkRFUlNDT1JFX05BTUUgIiBjbGFzcyIpOworCQlyZXR1cm4gUFRSX0VSUihvbGVkX2NsYXNzKTsKKwl9CisKKwlpZiAoKHJldHZhbCA9IGNsYXNzX2NyZWF0ZV9maWxlKG9sZWRfY2xhc3MsICZjbGFzc19hdHRyX3ZlcnNpb24pKSkgeworCQllcnIoIkVycm9yIGNyZWF0aW5nIGNsYXNzIHZlcnNpb24gZmlsZSIpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcigmb2xlZF9kcml2ZXIpOworCisJaWYgKHJldHZhbCkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZCIsIHJldHZhbCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZXJyb3I6CisJY2xhc3NfZGVzdHJveShvbGVkX2NsYXNzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXN1c19vbGVkX2V4aXQodm9pZCkKK3sKKwljbGFzc19yZW1vdmVfZmlsZShvbGVkX2NsYXNzLCAmY2xhc3NfYXR0cl92ZXJzaW9uKTsKKwljbGFzc19kZXN0cm95KG9sZWRfY2xhc3MpOworCisJdXNiX2RlcmVnaXN0ZXIoJm9sZWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQgKGFzdXNfb2xlZF9pbml0KTsKK21vZHVsZV9leGl0IChhc3VzX29sZWRfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXgudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3NThiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXgudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxzOjc0eDMyPgorMAorMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAxMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAxMTExMTEwMDAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAwMDExMTAwMDAxMTExMTExMTExMTAwMDAwMTExMTEwMDExMTExMTAwMDExMTExMTAxMTExMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMDExMTExMDAwMDAxMTExMTAwMDExMTAwMDExMTExMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDExMDExMTAwMDAwMTExMTEwMDAxMTEwMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDAxMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAxMDAxMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMTExMTAxMTAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDEwMDAwMTExMDAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAxMTExMTAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTEwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDEwMDAxMTEwMDEwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAwMTExMTEwMDAwMAorMDAwMDExMTEwMDAwMDAwMDExMDAxMTExMDAxMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTExMTAwMDAKKzAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAxMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDExMDExMTEwMDAwCiswMDAwMTExMTAwMDAwMDAxMTEwMDExMTEwMTAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAxMDAwMTExMTAwMAorMDAwMTExMTEwMDAwMDExMTExMDAxMTEwMTEwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDExMTExMDAwMDAxMTAwMDAxMTExMDAKKzExMTExMTExMTExMTExMTExMTAwMDExMTEwMDAxMTExMTExMDExMTExMTEwMDAwMTExMTEwMTExMTExMDExMTExMDExMTExMTEwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswCiswCiswCiswCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2YudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eF9mLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJiODVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eF9mLnR4dApAQCAtMCwwICsxLDE4IEBACis8ZjoxMjh4MTY+CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDAwMTExMTExMTExMTAwMDAxMTExMDAxMTExMTAwMTExMTEwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMTExMTAwMDExMTEwMDAxMTEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDEwMTExMDAwMDExMTEwMDAxMTEwMDAxMTExMDAxMTExMDAwMDExMTAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMTAwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDEwMDAxMTEwMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAwMTExMDAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTAwMTExMDAxMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMTEwMDExMTAxMTAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDExMDAxMTEwMTAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMTEwMTEwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTEwMDExMTEwMDExMTExMTAxMTExMTEwMDAxMTExMDExMTExMDExMTEwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2ZyLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXhfZnIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OGUyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2ZyLnR4dApAQCAtMCwwICsxLDMzIEBACis8ZjoxMjh4MzI+CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDAwMTExMTExMTExMTAwMDAxMTExMDAxMTExMTAwMTExMTEwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMTExMTAwMDExMTEwMDAxMTEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDEwMTExMDAwMDExMTEwMDAxMTEwMDAxMTExMDAxMTExMDAwMDExMTAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMTAwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDEwMDAxMTEwMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAwMTExMDAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTAwMTExMDAxMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMTEwMDExMTAxMTAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDExMDAxMTEwMTAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMTEwMTEwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTEwMDExMTEwMDExMTExMTAxMTExMTEwMDAxMTExMDExMTExMDExMTEwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDIwNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXgudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxzOjMyeDMyPgorMDAwMDAwMDAwMDAwMDExMTExMTEwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDEgICAgICAgMTAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgICAgICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMSAgMTExICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgIDEgMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgMTExICAgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMTExMTExICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAxIDEgICAgMTAwMDAwMDAwCiswMDAwMDAwMDAwMSAgICAgIDExICAgIDEwMDAwMDAwMAorMDAwMDAwMDAwMDEgMTExMTExMTEgICAgMTAwMDAwMDAKKzAwMDAwMDAwMDEgIDExMTExMTExICAgICAxMDAwMDAwCiswMDAwMDAwMDEgICAxMTExMTExMTEgICAgMTAwMDAwMAorMDAwMDAwMDAxICAxMTExMTExMTExICAgICAxMDAwMDAKKzAwMDAwMDAxICAgMTExMTExMTExMTEgICAgMTAwMDAwCiswMDAwMDAwMSAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDAxMSAxMTExMTExMTExMSAgICAgIDEwMDAwCiswMDAwMTEgMTEgIDExMTExMTExMTExICAgIDEwMDAwMAorMDAwMSAgMTExMSAgMTExMTExMTExMTExMTExIDEwMDAKKzAwMSAxMTExMTExICAxMTExMTExMTExMTExMSAxMDAwCiswMDEgMTExMTExMSAgMTExMTExMSAgMTExMTExIDEwMAorMDAxIDExMTExMTExIDExMTExMSAgIDExMTExMTEgMTAKKzAwMSAxMTExMTExMSAgICAgICAgICAxMTExMSAgMTAwCiswMDEgIDExMTExMTEgICAgICAgICAgMTExICAxMTEwMAorMDAwMTExICAgMTExICAgMTExMTEgIDExICAxMDAwMDAKKzAwMDAwMDExMSAgIDExMTExMTExMSAgICAxMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4X3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODFhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yLnR4dApAQCAtMCwwICsxLDMzIEBACis8cjozMngzMj4KKzAwMDAwMDAwMDAwMDAxMTExMTExMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAxICAgICAgIDEwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgICAgICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDEgIDExMSAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAxIDEgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgIDExMSAgICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgMSAxICAgIDEwMDAwMDAwMAorMDAwMDAwMDAwMDEgICAgICAxMSAgICAxMDAwMDAwMDAKKzAwMDAwMDAwMDAxIDExMTExMTExICAgIDEwMDAwMDAwCiswMDAwMDAwMDAxICAxMTExMTExMSAgICAgMTAwMDAwMAorMDAwMDAwMDAxICAgMTExMTExMTExICAgIDEwMDAwMDAKKzAwMDAwMDAwMSAgMTExMTExMTExMSAgICAgMTAwMDAwCiswMDAwMDAwMSAgIDExMTExMTExMTExICAgIDEwMDAwMAorMDAwMDAwMDEgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAwMTEgMTExMTExMTExMTEgICAgICAxMDAwMAorMDAwMDExIDExICAxMTExMTExMTExMSAgICAxMDAwMDAKKzAwMDEgIDExMTEgIDExMTExMTExMTExMTExMSAxMDAwCiswMDEgMTExMTExMSAgMTExMTExMTExMTExMTEgMTAwMAorMDAxIDExMTExMTEgIDExMTExMTEgIDExMTExMSAxMDAKKzAwMSAxMTExMTExMSAxMTExMTEgICAxMTExMTExIDEwCiswMDEgMTExMTExMTEgICAgICAgICAgMTExMTEgIDEwMAorMDAxICAxMTExMTExICAgICAgICAgIDExMSAgMTExMDAKKzAwMDExMSAgIDExMSAgIDExMTExICAxMSAgMTAwMDAwCiswMDAwMDAxMTEgICAxMTExMTExMTEgICAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXhfcjIudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXhfcjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGQ4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yMi50eHQKQEAgLTAsMCArMSwzMyBAQAorPHI6MjU2eDMyPgorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxICAxMTEgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxIDEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxIDEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgMTEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIDExMTExMTExICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMTExMDAwMDExMTExMTExMTExMDAwMDAxMTExMTAwMTExMTExMDAwMTExMTExMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIDExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTExMTAwMDAwMTExMTEwMDAxMTEwMDAxMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgIDExMTExMTExMSAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDExMTAwMDAwMTExMTEwMDAxMTEwMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExMTExMTExMSAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDEwMDExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAxMDAwMDExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTExMTExMTExMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTEwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTAwMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAwMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAxMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDExMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgMTExMTExMTExMTEgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDExMTAwMTExMTAxMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDEwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgMTEgIDExMTExMTExMTExICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMDAwMDAxMTExMTAwMTExMDExMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAxMTExMTAwMDAwMTEwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTExICAxMTExMTExMTExMTExMTEgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMTExMTExMTAwMDExMTEwMDAxMTExMTExMDExMTExMTEwMDAwMTExMTEwMTExMTExMDExMTExMDExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMSAgMTExMTExMTExMTExMTEgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMSAgMTExMTExMSAgMTExMTExIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMTEgMTExMTExICAgMTExMTExMSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMTEgICAgICAgICAgMTExMTEgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExMTExMSAgICAgICAgICAxMTEgIDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExICAgMTExICAgMTExMTEgIDExICAxMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExICAgMTExMTExMTExICAgIDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3ppZy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3ppZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NzNkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvemlnLnR4dApAQCAtMCwwICsxLDMzIEBACis8cjoxMjh4MzI+CisxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKKzAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwCiswMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMAorMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAKKzAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwCiswMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMAorMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAKKzAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwCiswMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMAorMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKaW5kZXggODYwNmY5Ni4uNGMwZTU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVVNCX0FUTUVMCiAJdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTAzL2F0NzZjNTA1L2F0NzZjNTA1YSBVU0IgY2FyZHMiCi0JZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFVTQgorCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgV0xBTl84MDIxMSAmJiBVU0IKIAlkZWZhdWx0IE4KIAlzZWxlY3QgRldfTE9BREVSCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL2F0NzZfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYwppbmRleCAxNzRlMmJlLi4xODU1MzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYwpAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCBOaWNrIEpvbmVzCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQmFsaW50IFNlZWJlciA8bjBfNXA0bV9wMTM0NTNAaG90bWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgR3VpZG8gR3VlbnRoZXIgPGFneEBzaWd4Y3B1Lm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBLYWxsZSBWYWxvIDxrYWxsZS52YWxvQGlraS5maT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMTYsNiArMTcsMTMgQEAKICAqIEF0bWVsIEFUNzZDNTAzQS81MDUvNTA1QS4KICAqCiAgKiBTb21lIGl3X2hhbmRsZXIgY29kZSB3YXMgdGFrZW4gZnJvbSBhaXJvLmMsIChDKSAxOTk5IEJlbmphbWluIFJlZWQKKyAqCisgKiBUT0RPIGZvciB0aGUgbWFjODAyMTEgcG9ydDoKKyAqIG8gYWRob2Mgc3VwcG9ydAorICogbyBSVFMvQ1RTIHN1cHBvcnQKKyAqIG8gUG93ZXIgU2F2ZSBNb2RlIHN1cHBvcnQKKyAqIG8gc3VwcG9ydCBmb3Igc2hvcnQvbG9uZyBwcmVhbWJsZXMKKyAqIG8gZXhwb3J0IHZhcmlhYmxlcyB0aHJvdWdoIGRlYnVnZnMvc3lzZnMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzYsNyArNDQsNyBAQAogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJhdDc2X3VzYi5oIgogCkBAIC03NiwzMSArODQsNDMgQEAKICNkZWZpbmUgREJHX1dFX0VWRU5UUwkJMHgwODAwMDAwMAkvKiBkdW1wIHdpcmVsZXNzIGV2ZW50cyAqLwogI2RlZmluZSBEQkdfRlcJCQkweDEwMDAwMDAwCS8qIGZpcm13YXJlIGRvd25sb2FkICovCiAjZGVmaW5lIERCR19ERlUJCQkweDIwMDAwMDAwCS8qIGRldmljZSBmaXJtd2FyZSB1cGdyYWRlICovCisjZGVmaW5lIERCR19DTUQJCQkweDQwMDAwMDAwCisjZGVmaW5lIERCR19NQUM4MDIxMQkJMHg4MDAwMDAwMAogCiAjZGVmaW5lIERCR19ERUZBVUxUUwkJMAogCiAvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KICNkZWZpbmUgYXQ3Nl9kYmcoYml0cywgZm9ybWF0LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGF0NzZfZGVidWcgJiAoYml0cykpIFwKK2RvIHsJXAorCWlmIChhdDc2X2RlYnVnICYgKGJpdHMpKQlcCiAJCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpOyBcCi0JfSB3aGlsZSAoMCkKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXQ3Nl9kYmdfZHVtcChiaXRzLCBidWYsIGxlbiwgZm9ybWF0LCBhcmcuLi4pCVwKK2RvIHsJXAorCWlmIChhdDc2X2RlYnVnICYgKGJpdHMpKSB7CVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZyk7IFwKKwkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgYnVmLCBsZW4pOwlcCisJCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKIAogc3RhdGljIGludCBhdDc2X2RlYnVnID0gREJHX0RFRkFVTFRTOwogCisjZGVmaW5lIEZJUk1XQVJFX0lTX1dQQSh2ZXIpICgodmVyLm1ham9yID09IDEpICYmICh2ZXIubWlub3IgPT0gMTAzKSkKKwogLyogUHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgZmlybXdhcmUgbG9hZGluZyBhbmQgcGFyc2luZyAqLwogc3RhdGljIHN0cnVjdCBtdXRleCBmd19tdXRleDsKIAogc3RhdGljIHN0cnVjdCBmd2VudHJ5IGZpcm13YXJlc1tdID0gewotCVswXSA9IHsiIn0sCi0JW0JPQVJEXzUwM19JU0wzODYxXSA9IHsiYXRtZWxfYXQ3NmM1MDMtaTM4NjEuYmluIn0sCi0JW0JPQVJEXzUwM19JU0wzODYzXSA9IHsiYXRtZWxfYXQ3NmM1MDMtaTM4NjMuYmluIn0sCi0JW0JPQVJEXzUwM10gPSB7ImF0bWVsX2F0NzZjNTAzLXJmbWQuYmluIn0sCi0JW0JPQVJEXzUwM19BQ0NdID0geyJhdG1lbF9hdDc2YzUwMy1yZm1kLWFjYy5iaW4ifSwKLQlbQk9BUkRfNTA1XSA9IHsiYXRtZWxfYXQ3NmM1MDUtcmZtZC5iaW4ifSwKLQlbQk9BUkRfNTA1XzI5NThdID0geyJhdG1lbF9hdDc2YzUwNS1yZm1kMjk1OC5iaW4ifSwKLQlbQk9BUkRfNTA1QV0gPSB7ImF0bWVsX2F0NzZjNTA1YS1yZm1kMjk1OC5iaW4ifSwKLQlbQk9BUkRfNTA1QU1YXSA9IHsiYXRtZWxfYXQ3NmM1MDVhbXgtcmZtZC5iaW4ifSwKKwlbMF0gPSB7ICIiIH0sCisJW0JPQVJEXzUwM19JU0wzODYxXSA9IHsgImF0bWVsX2F0NzZjNTAzLWkzODYxLmJpbiIgfSwKKwlbQk9BUkRfNTAzX0lTTDM4NjNdID0geyAiYXRtZWxfYXQ3NmM1MDMtaTM4NjMuYmluIiB9LAorCVtCT0FSRF81MDNdID0geyAiYXRtZWxfYXQ3NmM1MDMtcmZtZC5iaW4iIH0sCisJW0JPQVJEXzUwM19BQ0NdID0geyAiYXRtZWxfYXQ3NmM1MDMtcmZtZC1hY2MuYmluIiB9LAorCVtCT0FSRF81MDVdID0geyAiYXRtZWxfYXQ3NmM1MDUtcmZtZC5iaW4iIH0sCisJW0JPQVJEXzUwNV8yOTU4XSA9IHsgImF0bWVsX2F0NzZjNTA1LXJmbWQyOTU4LmJpbiIgfSwKKwlbQk9BUkRfNTA1QV0gPSB7ICJhdG1lbF9hdDc2YzUwNWEtcmZtZDI5NTguYmluIiB9LAorCVtCT0FSRF81MDVBTVhdID0geyAiYXRtZWxfYXQ3NmM1MDVhbXgtcmZtZC5iaW4iIH0sCiB9OwogCiAjZGVmaW5lIFVTQl9ERVZJQ0VfREFUQShfX29wcykJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KShfX29wcykKQEAgLTExMCwxMzMgKzEzMCwxMzMgQEAKIAkgKiBhdDc2YzUwMy1pMzg2MQogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDMvMzg2MSBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBMaW5rc3lzIFdVU0IxMSB2Mi4xL3YyLjYgKi8KLQl7VVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBOZXRnZWFyIE1BMTAxIHJldi4gQSAqLwotCXtVU0JfREVWSUNFKDB4MDg2NCwgMHg0MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDg2NCwgMHg0MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIFRla3JhbSBVMzAwQyAvIEFsbG5ldCBBTEwwMTkzICovCi0Je1VTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MTIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MTIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogSFAgSE4yMTBXIEo3ODAxQSAqLwotCXtVU0JfREVWSUNFKDB4MDNmMCwgMHgwMTFjKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDNmMCwgMHgwMTFjKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIFNpdGVjb20vWi1Db20vWnl4ZWwgTTRZLTc1MCAqLwotCXtVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIER5bmFsaW5rL0Fza2V5IFdMTDAxMyAoaW50ZXJzaWwpICovCi0Je1VTQl9ERVZJQ0UoMHgwNjlhLCAweDAzMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNjlhLCAweDAzMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogRVogY29ubmVjdCAxMU1wYnMgV2lyZWxlc3MgVVNCIEFkYXB0ZXIgU01DMjY2MlcgdjEgKi8KLQl7VVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBCZW5RIEFXTDMwMCAqLwotCXtVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEFkZHRyb24gQVdVLTEyMCwgQ29tcGV4IFdMVTExICovCi0Je1VTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogSW50ZWwgQVAzMTAgQW55UG9pbnQgSUkgVVNCICovCi0Je1VTQl9ERVZJQ0UoMHg4MDg2LCAweDAyMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDAyMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogRHluYWxpbmsgTDExVSAqLwotCXtVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEFyZXNjb20gV0wtMjEwLCBGQ0MgaWQgMDdKLUdMMjQxMVVTQiAqLwotCXtVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTEwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTEwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEktTyBEQVRBIFdOLUIxMS9VU0IgKi8KLQl7VVNCX0RFVklDRSgweDA0YmIsIDB4MDkxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA0YmIsIDB4MDkxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBCVCBWb3lhZ2VyIDEwMTAgKi8KLQl7VVNCX0RFVklDRSgweDA2OWEsIDB4MDgyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA2OWEsIDB4MDgyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKgogCSAqIGF0NzZjNTAzLWkzODYzCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwMy8zODYzIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYzKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYzKSB9LAogCS8qIFNhbXN1bmcgU1dMLTIxMDBVICovCi0Je1VTQl9ERVZJQ0UoMHgwNTVkLCAweGEwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTVkLCAweGEwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjMpIH0sCiAJLyoKIAkgKiBhdDc2YzUwMy1yZm1kCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwMy9SRk1EIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA1KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogRHluYWxpbmsvQXNrZXkgV0xMMDEzIChyZm1kKSAqLwotCXtVU0JfREVWSUNFKDB4MDY5YSwgMHgwMzIxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA2OWEsIDB4MDMyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTGlua3N5cyBXVVNCMTEgdjIuNiAqLwotCXtVU0JfREVWSUNFKDB4MDc3YiwgMHgyMjE5KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3N2IsIDB4MjIxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTmV0d29yayBFdmVyeXdoZXJlIE5XVTExQiAqLwotCXtVU0JfREVWSUNFKDB4MDc3YiwgMHgyMjI3KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3N2IsIDB4MjIyNyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTmV0Z2VhciBNQTEwMSByZXYuIEIgKi8KLQl7VVNCX0RFVklDRSgweDA4NjQsIDB4NDEwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODY0LCAweDQxMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEQtTGluayBEV0wtMTIwIHJldi4gRSAqLwotCXtVU0JfREVWSUNFKDB4MjAwMSwgMHgzMjAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDIwMDEsIDB4MzIwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQWN0aW9udGVjIDgwMlVBVDEsIEhXVTAxMTUwLTAxVUsgKi8KLQl7VVNCX0RFVklDRSgweDE2NjgsIDB4NzYwNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxNjY4LCAweDc2MDUpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEFpclZhc3QgVy1CdWRkaWUgV04yMTAgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NDEwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwM2ViLCAweDQxMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIERpY2sgU21pdGggRWxlY3Ryb25pY3MgWEgxMTUzIDgwMi4xMWIgVVNCIGFkYXB0ZXIgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4NTc0MyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDU3NDMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIENOZXQgQ05VU0I2MTEgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDAwMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEZpYmVyTGluZSBGTC1XTDIwMFUgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDAwMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEJlblEgQVdMNDAwIFVTQiBzdGljayAqLwotCXtVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA0YTUsIDB4OTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogM0NvbSAzQ1JTSEVXNjk2ICovCi0Je1VTQl9ERVZJQ0UoMHgwNTA2LCAweDBhMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDUwNiwgMHgwYTAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBTaWVtZW5zIFNhbnRpcyBBRFNMIFdMQU4gVVNCIGFkYXB0ZXIgV0xMIDAxMyAqLwotCXtVU0JfREVWSUNFKDB4MDY4MSwgMHgwMDFiKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA2ODEsIDB4MDAxYiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQmVsa2luIEY1RDYwNTAsIHZlcnNpb24gMiAqLwotCXtVU0JfREVWSUNFKDB4MDUwZCwgMHgwMDUwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4MDA1MCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogaUJsaXR6eiwgQldVNjEzIChub3QgKkIgb3IgKlNCKSAqLwotCXtVU0JfREVWSUNFKDB4MDdiOCwgMHhiMDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3YjgsIDB4YjAwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogR2lnYWJ5dGUgR04tV0xCTTEwMSAqLwotCXtVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDAzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDEwNDQsIDB4ODAwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogUGxhbmV4IEdXLVVTMTFTICovCi0Je1VTQl9ERVZJQ0UoMHgyMDE5LCAweDMyMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MjAxOSwgMHgzMjIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBJbnRlcm5hbCBXTEFOIGFkYXB0ZXIgaW4gaDVbNCw1XXh4IHNlcmllcyBpUEFRcyAqLwotCXtVU0JfREVWSUNFKDB4MDQ5ZiwgMHgwMDMyKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA0OWYsIDB4MDAzMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQ29yZWdhIFdpcmVsZXNzIExBTiBVU0ItMTEgbWluaSAqLwotCXtVU0JfREVWSUNFKDB4MDdhYSwgMHgwMDExKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3YWEsIDB4MDAxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQ29yZWdhIFdpcmVsZXNzIExBTiBVU0ItMTEgbWluaTIgKi8KLQl7VVNCX0RFVklDRSgweDA3YWEsIDB4MDAxOCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwN2FhLCAweDAwMTgpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIFVuaWRlbiBQQ1cxMDAgKi8KLQl7VVNCX0RFVklDRSgweDA1ZGQsIDB4ZmYzNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzUpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qCiAJICogYXQ3NmM1MDMtcmZtZC1hY2MKIAkgKi8KIAkvKiBTTUMyNjY0VyAqLwotCXtVU0JfREVWSUNFKDB4MDgzYSwgMHgzNTAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19BQ0MpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODNhLCAweDM1MDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0FDQykgfSwKIAkvKiBCZWxraW4gRjVENjA1MCwgU01DMjY2MlcgdjIsIFNNQzI2NjJXLUFSICovCi0Je1VTQl9ERVZJQ0UoMHgwZDVjLCAweGEwMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0FDQyl9LAorCXsgVVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfQUNDKSB9LAogCS8qCiAJICogYXQ3NmM1MDUtcmZtZAogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDUvUkZNRCAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA2KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwNiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDUpIH0sCiAJLyoKIAkgKiBhdDc2YzUwNS1yZm1kMjk1OAogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDUvUkZNRCwgT3Zpc0xpbmsgV0wtMTEzMFVTQiAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIEZpYmVybGluZSBGTC1XTDI0MFUgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4MDAxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCkgfSwKIAkvKiBDTmV0IENOVVNCLTYxMUcgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAxMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4MDAxMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCkgfSwKIAkvKiBMaW5rc3lzIFdVU0IxMSB2Mi44ICovCi0Je1VTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpIH0sCiAJLyogWHRlcmFzeXMgWE4tMjEyMkIsIElCbGl0enogQldVNjEzQi9CV1U2MTNTQiAqLwotCXtVU0JfREVWSUNFKDB4MTJmZCwgMHgxMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MTJmZCwgMHgxMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIENvcmVnYSBXTEFOIFVTQiBTdGljayAxMSAqLwotCXtVU0JfREVWSUNFKDB4MDdhYSwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MDdhYSwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIE1pY3Jvc3RhciBNU0kgQm94IE1TNjk3OCAqLwotCXtVU0JfREVWSUNFKDB4MGRiMCwgMHgxMDIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MGRiMCwgMHgxMDIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qCiAJICogYXQ3NmM1MDVhLXJmbWQyOTU4CiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwNUEgZGV2aWNlICovCi0Je1VTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MTQpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1QSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKSB9LAogCS8qIEdlbmVyaWMgQVQ3NkM1MDVBUyBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjE3KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpIH0sCiAJLyogU2llbWVucyBHaWdhc2V0IFVTQiBXTEFOIEFkYXB0ZXIgMTEgKi8KLQl7VVNCX0RFVklDRSgweDE2OTAsIDB4MDcwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKX0sCisJeyBVU0JfREVWSUNFKDB4MTY5MCwgMHgwNzAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpIH0sCiAJLyoKIAkgKiBhdDc2YzUwNWFteC1yZm1kCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwNUFNWCBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBTVgpfSwKLQl7fQorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBTVgpIH0sCisJeyB9CiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2X3RhYmxlKTsKQEAgLTI0NCwyNiArMjY0LDggQEAKIC8qIFN1cHBvcnRlZCByYXRlcyBvZiB0aGlzIGhhcmR3YXJlLCBiaXQgNyBtYXJrcyBiYXNpYyByYXRlcyAqLwogc3RhdGljIGNvbnN0IHU4IGh3X3JhdGVzW10gPSB7IDB4ODIsIDB4ODQsIDB4MGIsIDB4MTYgfTsKIAotLyogRnJlcXVlbmN5IG9mIGVhY2ggY2hhbm5lbCBpbiBNSHogKi8KLXN0YXRpYyBjb25zdCBsb25nIGNoYW5uZWxfZnJlcXVlbmN5W10gPSB7Ci0JMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKLQkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0Ci19OwotCi0jZGVmaW5lIE5VTV9DSEFOTkVMUyBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcXVlbmN5KQotCiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHJlYW1ibGVzW10gPSB7ICJsb25nIiwgInNob3J0IiwgImF1dG8iIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtYWNfc3RhdGVzW10gPSB7Ci0JW01BQ19JTklUXSA9ICJJTklUIiwKLQlbTUFDX1NDQU5OSU5HXSA9ICJTQ0FOTklORyIsCi0JW01BQ19BVVRIXSA9ICJBVVRIIiwKLQlbTUFDX0FTU09DXSA9ICJBU1NPQyIsCi0JW01BQ19KT0lOSU5HXSA9ICJKT0lOSU5HIiwKLQlbTUFDX0NPTk5FQ1RFRF0gPSAiQ09OTkVDVEVEIiwKLQlbTUFDX09XTl9JQlNTXSA9ICJPV05fSUJTUyIKLX07Ci0KIC8qIEZpcm13YXJlIGRvd25sb2FkICovCiAvKiBERlUgc3RhdGVzICovCiAjZGVmaW5lIFNUQVRFX0lETEUJCQkweDAwCkBAIC0yOTgsMTcgKzMwMCwzMCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2lzX2ludGVyc2lsKGVudW0gYm9hcmRfdHlwZSBib2FyZCkKIHsKLQlyZXR1cm4gKGJvYXJkID09IEJPQVJEXzUwM19JU0wzODYxIHx8IGJvYXJkID09IEJPQVJEXzUwM19JU0wzODYzKTsKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTAzX0lTTDM4NjEgfHwgYm9hcmQgPT0gQk9BUkRfNTAzX0lTTDM4NjMpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2lzXzUwM3JmbWQoZW51bSBib2FyZF90eXBlIGJvYXJkKQogewotCXJldHVybiAoYm9hcmQgPT0gQk9BUkRfNTAzIHx8IGJvYXJkID09IEJPQVJEXzUwM19BQ0MpOworCWlmIChib2FyZCA9PSBCT0FSRF81MDMgfHwgYm9hcmQgPT0gQk9BUkRfNTAzX0FDQykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0NzZfaXNfNTA1KGVudW0gYm9hcmRfdHlwZSBib2FyZCkKK3sKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTA1IHx8IGJvYXJkID09IEJPQVJEXzUwNV8yOTU4KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9pc181MDVhKGVudW0gYm9hcmRfdHlwZSBib2FyZCkKIHsKLQlyZXR1cm4gKGJvYXJkID09IEJPQVJEXzUwNUEgfHwgYm9hcmQgPT0gQk9BUkRfNTA1QU1YKTsKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTA1QSB8fCBib2FyZCA9PSBCT0FSRF81MDVBTVgpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiAvKiBMb2FkIGEgYmxvY2sgb2YgdGhlIGZpcnN0IChpbnRlcm5hbCkgcGFydCBvZiB0aGUgZmlybXdhcmUgKi8KQEAgLTQ4OSw0MSArNTA0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZXBvcnQgdGhhdCB0aGUgc2NhbiByZXN1bHRzIGFyZSByZWFkeSAqLwotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9zY2FuX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCXdycXUuZGF0YS5sZW5ndGggPSAwOwotCXdycXUuZGF0YS5mbGFncyA9IDA7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChuZXRkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7Ci0JYXQ3Nl9kYmcoREJHX1dFX0VWRU5UUywgIiVzOiBTSU9DR0lXU0NBTiBzZW50IiwgbmV0ZGV2LT5uYW1lKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9ic3NfY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCQkgICAgdTggKmJzc2lkKQotewotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKLQl3cnF1LmRhdGEuZmxhZ3MgPSAwOwotCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgYnNzaWQsIEVUSF9BTEVOKTsKLQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCXdpcmVsZXNzX3NlbmRfZXZlbnQobmV0ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQlhdDc2X2RiZyhEQkdfV0VfRVZFTlRTLCAiJXM6ICVzOiBTSU9DR0lXQVAgc2VudCIsIG5ldGRldi0+bmFtZSwKLQkJIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKLQl3cnF1LmRhdGEuZmxhZ3MgPSAwOwotCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOwotCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChuZXRkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCWF0NzZfZGJnKERCR19XRV9FVkVOVFMsICIlczogJXM6IFNJT0NHSVdBUCBzZW50IiwgbmV0ZGV2LT5uYW1lLAotCQkgX19mdW5jX18pOwotfQotCiAjZGVmaW5lIEhFWDJTVFJfQlVGRkVSUyA0CiAjZGVmaW5lIEhFWDJTVFJfTUFYX0xFTiA2NAogI2RlZmluZSBCSU4ySEVYKHgpICgoeCkgPCAxMCA/ICcwJyArICh4KSA6ICh4KSArICdBJyAtIDEwKQpAQCAtNTk1LDM3ICs1NzUsNiBAQAogCQltb2RfdGltZXIoJmxlZHRyaWdfdHhfdGltZXIsIGppZmZpZXMgKyBIWiAvIDQpOwogfQogCi0vKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc3NpZCBpcyBoaWRkZW4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGF0NzZfaXNfaGlkZGVuX3NzaWQodTggKnNzaWQsIGludCBsZW5ndGgpCi17Ci0Jc3RhdGljIGNvbnN0IHU4IHplcm9zWzMyXTsKLQotCWlmIChsZW5ndGggPT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAobGVuZ3RoID09IDEgJiYgc3NpZFswXSA9PSAnICcpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIChtZW1jbXAoc3NpZCwgemVyb3MsIGxlbmd0aCkgPT0gMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdDc2X2ZyZWVfYnNzX2xpc3Qoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0LCAqcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXByaXYtPmN1cnJfYnNzID0gTlVMTDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZwcml2LT5ic3NfbGlzdCkgewotCQlsaXN0X2RlbChwdHIpOwotCQlrZnJlZShsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBhdDc2X3JlbWFwKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludCByZXQ7CkBAIC02NDEsMTggKzU5MCwyNSBAQAogc3RhdGljIGludCBhdDc2X2dldF9vcF9tb2RlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludCByZXQ7Ci0JdTggb3BfbW9kZTsKKwl1OCBzYXZlZDsKKwl1OCAqb3BfbW9kZTsKIAorCW9wX21vZGUgPSBrbWFsbG9jKDEsIEdGUF9OT0lPKTsKKwlpZiAoIW9wX21vZGUpCisJCXJldHVybiAtRU5PTUVNOwogCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksIDB4MzMsCiAJCQkgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX0lOIHwKIAkJCSAgICAgIFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDB4MDEsIDAsICZvcF9tb2RlLCAxLAogCQkJICAgICAgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCXNhdmVkID0gKm9wX21vZGU7CisJa2ZyZWUob3BfbW9kZSk7CisKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAllbHNlIGlmIChyZXQgPCAxKQogCQlyZXR1cm4gLUVJTzsKIAllbHNlCi0JCXJldHVybiBvcF9tb2RlOworCQlyZXR1cm4gc2F2ZWQ7CiB9CiAKIC8qIExvYWQgYSBibG9jayBvZiB0aGUgc2Vjb25kICgiZXh0ZXJuYWwiKSBwYXJ0IG9mIHRoZSBmaXJtd2FyZSAqLwpAQCAtNzIwLDcgKzY3Niw3IEBACiAJa2ZyZWUoaHdjZmcpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZ2V0IEhXIENvbmZpZyAoZXJyb3IgJWQpXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTcyOSwxNSArNjg1LDE1IEBACiB7CiAJaW50IGk7CiAJc3RhdGljIHN0cnVjdCByZWdfZG9tYWluIGNvbnN0IGZkX3RhYltdID0gewotCQl7MHgxMCwgIkZDQyAoVVNBKSIsIDB4N2ZmfSwJLyogY2ggMS0xMSAqLwotCQl7MHgyMCwgIklDIChDYW5hZGEpIiwgMHg3ZmZ9LAkvKiBjaCAxLTExICovCi0JCXsweDMwLCAiRVRTSSAobW9zdCBvZiBFdXJvcGUpIiwgMHgxZmZmfSwJLyogY2ggMS0xMyAqLwotCQl7MHgzMSwgIlNwYWluIiwgMHg2MDB9LAkvKiBjaCAxMC0xMSAqLwotCQl7MHgzMiwgIkZyYW5jZSIsIDB4MWUwMH0sCS8qIGNoIDEwLTEzICovCi0JCXsweDQwLCAiTUtLIChKYXBhbikiLCAweDIwMDB9LAkvKiBjaCAxNCAqLwotCQl7MHg0MSwgIk1LSzEgKEphcGFuKSIsIDB4M2ZmZn0sCS8qIGNoIDEtMTQgKi8KLQkJezB4NTAsICJJc3JhZWwiLCAweDNmY30sCS8qIGNoIDMtOSAqLwotCQl7MHgwMCwgIjx1bmtub3duPiIsIDB4ZmZmZmZmZmZ9CS8qIGNoIDEtMzIgKi8KKwkJeyAweDEwLCAiRkNDIChVU0EpIiwgMHg3ZmYgfSwJLyogY2ggMS0xMSAqLworCQl7IDB4MjAsICJJQyAoQ2FuYWRhKSIsIDB4N2ZmIH0sCS8qIGNoIDEtMTEgKi8KKwkJeyAweDMwLCAiRVRTSSAobW9zdCBvZiBFdXJvcGUpIiwgMHgxZmZmIH0sCS8qIGNoIDEtMTMgKi8KKwkJeyAweDMxLCAiU3BhaW4iLCAweDYwMCB9LAkvKiBjaCAxMC0xMSAqLworCQl7IDB4MzIsICJGcmFuY2UiLCAweDFlMDAgfSwJLyogY2ggMTAtMTMgKi8KKwkJeyAweDQwLCAiTUtLIChKYXBhbikiLCAweDIwMDAgfSwJLyogY2ggMTQgKi8KKwkJeyAweDQxLCAiTUtLMSAoSmFwYW4pIiwgMHgzZmZmIH0sCS8qIGNoIDEtMTQgKi8KKwkJeyAweDUwLCAiSXNyYWVsIiwgMHgzZmMgfSwJLyogY2ggMy05ICovCisJCXsgMHgwMCwgIjx1bmtub3duPiIsIDB4ZmZmZmZmZmYgfQkvKiBjaCAxLTMyICovCiAJfTsKIAogCS8qIExhc3QgZW50cnkgaXMgZmFsbGJhY2sgZm9yIHVua25vd24gZG9tYWluIGNvZGUgKi8KQEAgLTc2NSwyMCArNzIxLDQzIEBACiAvKiBSZXR1cm4gcG9zaXRpdmUgbnVtYmVyIGZvciBzdGF0dXMsIG5lZ2F0aXZlIGZvciBhbiBlcnJvciAqLwogc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9nZXRfY21kX3N0YXR1cyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggY21kKQogewotCXU4IHN0YXRfYnVmWzQwXTsKKwl1OCAqc3RhdF9idWY7CiAJaW50IHJldDsKIAorCXN0YXRfYnVmID0ga21hbGxvYyg0MCwgR0ZQX05PSU8pOworCWlmICghc3RhdF9idWYpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwgMHgyMiwKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4gfAogCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgY21kLCAwLCBzdGF0X2J1ZiwKIAkJCSAgICAgIHNpemVvZihzdGF0X2J1ZiksIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHN0YXRfYnVmWzVdOworCWtmcmVlKHN0YXRfYnVmKTsKIAotCXJldHVybiBzdGF0X2J1Zls1XTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfc2V0X2NhcmRfY29tbWFuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGNtZCwgdm9pZCAqYnVmLAorI2RlZmluZSBNQUtFX0NNRF9DQVNFKGMpIGNhc2UgKGMpOiByZXR1cm4gI2MKKworc3RhdGljIGNvbnN0IGNoYXIgKmF0NzZfZ2V0X2NtZF9zdHJpbmcodTggY21kX3N0YXR1cykKK3sKKwlzd2l0Y2ggKGNtZF9zdGF0dXMpIHsKKwkJTUFLRV9DTURfQ0FTRShDTURfU0VUX01JQik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX0dFVF9NSUIpOworCQlNQUtFX0NNRF9DQVNFKENNRF9TQ0FOKTsKKwkJTUFLRV9DTURfQ0FTRShDTURfSk9JTik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1NUQVJUX0lCU1MpOworCQlNQUtFX0NNRF9DQVNFKENNRF9SQURJT19PTik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1JBRElPX09GRik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1NUQVJUVVApOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCBjbWQsIHZvaWQgKmJ1ZiwKIAkJCQkgaW50IGJ1Zl9zaXplKQogewogCWludCByZXQ7CkBAIC03OTMsNiArNzcyLDEwIEBACiAJY21kX2J1Zi0+c2l6ZSA9IGNwdV90b19sZTE2KGJ1Zl9zaXplKTsKIAltZW1jcHkoY21kX2J1Zi0+ZGF0YSwgYnVmLCBidWZfc2l6ZSk7CiAKKwlhdDc2X2RiZ19kdW1wKERCR19DTUQsIGNtZF9idWYsIHNpemVvZihzdHJ1Y3QgYXQ3Nl9jb21tYW5kKSArIGJ1Zl9zaXplLAorCQkgICAgICAiaXNzdWluZyBjb21tYW5kICVzICgweCUwMngpIiwKKwkJICAgICAgYXQ3Nl9nZXRfY21kX3N0cmluZyhjbWQpLCBjbWQpOworCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwgMHgwZSwKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIDAsIDAsIGNtZF9idWYsCkBAIC04MzAsMTMgKzgxMywxMyBAQAogCQlzdGF0dXMgPSBhdDc2X2dldF9jbWRfc3RhdHVzKHByaXYtPnVkZXYsIGNtZCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9jbWRfc3RhdHVzIGZhaWxlZDogJWRcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgc3RhdHVzKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYXQ3Nl9kYmcoREJHX1dBSVRfQ09NUExFVEUsCiAJCQkgIiVzOiBXYWl0aW5nIG9uIGNtZCAlZCwgc3RhdHVzID0gJWQgKCVzKSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBjbWQsIHN0YXR1cywKKwkJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGNtZCwgc3RhdHVzLAogCQkJIGF0NzZfZ2V0X2NtZF9zdGF0dXNfc3RyaW5nKHN0YXR1cykpOwogCiAJCWlmIChzdGF0dXMgIT0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUwpAQCAtODQ3LDcgKzgzMCw3IEBACiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiJXM6IGNvbXBsZXRpb24gdGltZW91dCBmb3IgY29tbWFuZCAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGNtZCk7CisJCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBjbWQpOwogCQkJc3RhdHVzID0gLUVUSU1FRE9VVDsKIAkJCWJyZWFrOwogCQl9CkBAIC04NzAsNyArODUzLDcgQEAKIAlpZiAocmV0ICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgIiVzOiBzZXRfbWliOiBhdDc2X3dhaXRfY29tcGxldGlvbiBmYWlsZWQgIgotCQkgICAgICAgIndpdGggJWRcbiIsIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgICJ3aXRoICVkXG4iLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCXJldCA9IC1FSU87CiAJfQogCkBAIC04OTEsNyArODc0LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgY21kLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKCVkKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBjbWQsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGNtZCwgcmV0KTsKIAllbHNlCiAJCXJldCA9IDE7CiAKQEAgLTkxMiw0NCArODk1LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChwbV9tb2RlKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogU2V0IHRoZSBhc3NvY2lhdGlvbiBpZCBmb3IgcG93ZXIgc2F2ZSBtb2RlICovCi1zdGF0aWMgaW50IGF0NzZfc2V0X2Fzc29jaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgdTE2IGlkKQotewotCWludCByZXQgPSAwOwotCi0JcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQ19NR01UOwotCXByaXYtPm1pYl9idWYuc2l6ZSA9IDI7Ci0JcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX21nbXQsIHN0YXRpb25faWQpOwotCXByaXYtPm1pYl9idWYuZGF0YS53b3JkID0gY3B1X3RvX2xlMTYoaWQpOwotCi0JcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoYXNzb2NpZCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFNldCB0aGUgbGlzdGVuIGludGVydmFsIGZvciBwb3dlciBzYXZlIG1vZGUgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9zZXRfbGlzdGVuX2ludGVydmFsKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHUxNiBpbnRlcnZhbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUM7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMjsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWMsIGxpc3Rlbl9pbnRlcnZhbCk7Ci0JcHJpdi0+bWliX2J1Zi5kYXRhLndvcmQgPSBjcHVfdG9fbGUxNihpbnRlcnZhbCk7Ci0KLQlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICIlczogc2V0X21pYiAobGlzdGVuX2ludGVydmFsKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTk2Niw3ICs5MTIsNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHByZWFtYmxlKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTk4Myw3ICs5MjksNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKGZyYWcgdGhyZXNob2xkKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwMDAsNyArOTQ2LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChydHMpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTAxNywyNCArOTYzLDQxIEBACiAJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoYXV0b3JhdGUgZmFsbGJhY2spIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfYWRkX21hY19hZGRyZXNzKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHZvaWQgKmFkZHIpCitzdGF0aWMgaW50IGF0NzZfc2V0X3RraXBfYnNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgY29uc3Qgdm9pZCAqYWRkcikKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfQUREUjsKKwlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX0VOQ1JZUFRJT047CiAJcHJpdi0+bWliX2J1Zi5zaXplID0gRVRIX0FMRU47Ci0JcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2FkZHIsIG1hY19hZGRyKTsKKwlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiwgdGtpcF9ic3NpZCk7CiAJbWVtY3B5KHByaXYtPm1pYl9idWYuZGF0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChNQUNfQUREUiwgbWFjX2FkZHIpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKE1BQ19FTkNSWVBUSU9OLCB0a2lwX2Jzc2lkKSBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdDc2X3Jlc2V0X3JzYyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQoreworCWludCByZXQgPSAwOworCisJcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQ19FTkNSWVBUSU9OOworCXByaXYtPm1pYl9idWYuc2l6ZSA9IDQgKiA4OworCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uLCBrZXlfcnNjKTsKKwltZW1zZXQocHJpdi0+bWliX2J1Zi5kYXRhLmRhdGEsIDAgLCBwcml2LT5taWJfYnVmLnNpemUpOworCisJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoTUFDX0VOQ1JZUFRJT04sIGtleV9yc2MpIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA1MywxNiArMTAxNiwxNiBAQAogCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX2FkZHIpKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQ19BRERSKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTUFDX0FERFI6IG1hY19hZGRyICVzIHJlcyAweCV4IDB4JXgiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgbWFjMnN0cihtLT5tYWNfYWRkciksIG0tPnJlc1swXSwgbS0+cmVzWzFdKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtLT5ncm91cF9hZGRyKTsgaSsrKQogCQlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNQUNfQUREUjogZ3JvdXAgYWRkciAlZDogJXMsICIKLQkJCSAic3RhdHVzICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLCBpLAorCQkJICJzdGF0dXMgJWQiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGksCiAJCQkgbWFjMnN0cihtLT5ncm91cF9hZGRyW2ldKSwgbS0+Z3JvdXBfYWRkcl9zdGF0dXNbaV0pOwogZXhpdDoKIAlrZnJlZShtKTsKQEAgLTEwODIsMTMgKzEwNDUsMTMgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY193ZXApKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQ19XRVApIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNQUNfV0VQOiBwcml2X2ludm9rZWQgJXUgZGVmX2tleV9pZCAldSAiCiAJCSAia2V5X2xlbiAldSBleGNsX3VuZW5jciAldSB3ZXBfaWN2X2VyciAldSB3ZXBfZXhjbHVkZWQgJXUgIgotCQkgImVuY3JfbGV2ZWwgJXUga2V5ICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAorCQkgImVuY3JfbGV2ZWwgJXUga2V5ICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgbS0+cHJpdmFjeV9pbnZva2VkLCBtLT53ZXBfZGVmYXVsdF9rZXlfaWQsCiAJCSBtLT53ZXBfa2V5X21hcHBpbmdfbGVuLCBtLT5leGNsdWRlX3VuZW5jcnlwdGVkLAogCQkgbGUzMl90b19jcHUobS0+d2VwX2ljdl9lcnJvcl9jb3VudCksCkBAIC0xMTAwLDEyICsxMDYzLDU1IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykKIAkJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTUFDX1dFUDoga2V5ICVkOiAlcyIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBpLAorCQkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgaSwKIAkJCSBoZXgyc3RyKG0tPndlcF9kZWZhdWx0X2tleXZhbHVlW2ldLCBrZXlfbGVuKSk7CiBleGl0OgogCWtmcmVlKG0pOwogfQogCitzdGF0aWMgdm9pZCBhdDc2X2R1bXBfbWliX21hY19lbmNyeXB0aW9uKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCit7CisJaW50IGk7CisJaW50IHJldDsKKwkvKmludCBrZXlfbGVuOyovCisJc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiAqbTsKKworCW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtKQorCQlyZXR1cm47CisKKwlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX01BQ19FTkNSWVBUSU9OLCBtLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24pKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwcml2LT51ZGV2LT5kZXYsCisJCQkiJXM6IGF0NzZfZ2V0X21pYiAoTUFDX0VOQ1JZUFRJT04pIGZhaWxlZDogJWRcbiIsCisJCQl3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlhdDc2X2RiZyhEQkdfTUlCLAorCQkgIiVzOiBNSUIgTUFDX0VOQ1JZUFRJT046IHRraXBfYnNzaWQgJXMgcHJpdl9pbnZva2VkICV1ICIKKwkJICJjaXBoX2tleV9pZCAldSBncnBfa2V5X2lkICV1IGV4Y2xfdW5lbmNyICV1ICIKKwkJICJja2lwX2tleV9wZXJtICV1IHdlcF9pY3ZfZXJyICV1IHdlcF9leGNsdWRlZCAldSIsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIG1hYzJzdHIobS0+dGtpcF9ic3NpZCksCisJCSBtLT5wcml2YWN5X2ludm9rZWQsIG0tPmNpcGhlcl9kZWZhdWx0X2tleV9pZCwKKwkJIG0tPmNpcGhlcl9kZWZhdWx0X2dyb3VwX2tleV9pZCwgbS0+ZXhjbHVkZV91bmVuY3J5cHRlZCwKKwkJIG0tPmNraXBfa2V5X3Blcm11dGF0aW9uLAorCQkgbGUzMl90b19jcHUobS0+d2VwX2ljdl9lcnJvcl9jb3VudCksCisJCSBsZTMyX3RvX2NwdShtLT53ZXBfZXhjbHVkZWRfY291bnQpKTsKKworCS8qa2V5X2xlbiA9IChtLT5lbmNyeXB0aW9uX2xldmVsID09IDEpID8KKwkgICAgV0VQX1NNQUxMX0tFWV9MRU4gOiBXRVBfTEFSR0VfS0VZX0xFTjsqLworCisJZm9yIChpID0gMDsgaSA8IENJUEhFUl9LRVlTOyBpKyspCisJCWF0NzZfZGJnKERCR19NSUIsICIlczogTUlCIE1BQ19FTkNSWVBUSU9OOiBrZXkgJWQ6ICVzIiwKKwkJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGksCisJCQkgaGV4MnN0cihtLT5jaXBoZXJfZGVmYXVsdF9rZXl2YWx1ZVtpXSwKKwkJCQkgQ0lQSEVSX0tFWV9MRU4pKTsKK2V4aXQ6CisJa2ZyZWUobSk7Cit9CisKIHN0YXRpYyB2b2lkIGF0NzZfZHVtcF9taWJfbWFjX21nbXQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKIHsKIAlpbnQgcmV0OwpAQCAtMTExOSw3ICsxMTI1LDcgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChNQUNfTUdNVCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTEzMCw3ICsxMTM2LDcgQEAKIAkJICJwbV9tb2RlICVkIGlic3NfY2hhbmdlICVkIHJlcyAlZCAiCiAJCSAibXVsdGlfZG9tYWluX2NhcGFiaWxpdHlfaW1wbGVtZW50ZWQgJWQgIgogCQkgImludGVybmF0aW9uYWxfcm9hbWluZyAlZCBjb3VudHJ5X3N0cmluZyAlLjNzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUxNl90b19jcHUobS0+YmVhY29uX3BlcmlvZCksCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGxlMTZfdG9fY3B1KG0tPmJlYWNvbl9wZXJpb2QpLAogCQkgbGUxNl90b19jcHUobS0+Q0ZQX21heF9kdXJhdGlvbiksCiAJCSBsZTE2X3RvX2NwdShtLT5tZWRpdW1fb2NjdXBhbmN5X2xpbWl0KSwKIAkJIGxlMTZfdG9fY3B1KG0tPnN0YXRpb25faWQpLCBsZTE2X3RvX2NwdShtLT5BVElNX3dpbmRvdyksCkBAIC0xMTU1LDcgKzExNjEsNyBAQAogCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTUFDLCBtLCBzaXplb2Yoc3RydWN0IG1pYl9tYWMpKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQykgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTE2NSw3ICsxMTcxLDggQEAKIAkJICJzY2FuX3R5cGUgJWQgc2Nhbl9jaGFubmVsICVkIHByb2JlX2RlbGF5ICV1ICIKIAkJICJtaW5fY2hhbm5lbF90aW1lICVkIG1heF9jaGFubmVsX3RpbWUgJWQgbGlzdGVuX2ludCAlZCAiCiAJCSAiZGVzaXJlZF9zc2lkICVzIGRlc2lyZWRfYnNzaWQgJXMgZGVzaXJlZF9ic3N0eXBlICVkIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUzMl90b19jcHUobS0+bWF4X3R4X21zZHVfbGlmZXRpbWUpLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgbGUzMl90b19jcHUobS0+bWF4X3R4X21zZHVfbGlmZXRpbWUpLAogCQkgbGUzMl90b19jcHUobS0+bWF4X3J4X2xpZmV0aW1lKSwKIAkJIGxlMTZfdG9fY3B1KG0tPmZyYWdfdGhyZXNob2xkKSwgbGUxNl90b19jcHUobS0+cnRzX3RocmVzaG9sZCksCiAJCSBsZTE2X3RvX2NwdShtLT5jd21pbiksIGxlMTZfdG9fY3B1KG0tPmN3bWF4KSwKQEAgLTExOTEsNyArMTE5OCw3IEBACiAJcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9QSFksIG0sIHNpemVvZihzdHJ1Y3QgbWliX3BoeSkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoUEhZKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMjAwLDcgKzEyMDcsNyBAQAogCQkgIm1wZHVfbWF4X2xlbmd0aCAlZCBjY2FfbW9kZV9zdXBwb3J0ZWQgJWQgb3BlcmF0aW9uX3JhdGVfc2V0ICIKIAkJICIweCV4IDB4JXggMHgleCAweCV4IGNoYW5uZWxfaWQgJWQgY3VycmVudF9jY2FfbW9kZSAlZCAiCiAJCSAicGh5X3R5cGUgJWQgY3VycmVudF9yZWdfZG9tYWluICVkIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUzMl90b19jcHUobS0+ZWRfdGhyZXNob2xkKSwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgbGUzMl90b19jcHUobS0+ZWRfdGhyZXNob2xkKSwKIAkJIGxlMTZfdG9fY3B1KG0tPnNsb3RfdGltZSksIGxlMTZfdG9fY3B1KG0tPnNpZnNfdGltZSksCiAJCSBsZTE2X3RvX2NwdShtLT5wcmVhbWJsZV9sZW5ndGgpLAogCQkgbGUxNl90b19jcHUobS0+cGxjcF9oZWFkZXJfbGVuZ3RoKSwKQEAgLTEyMjQsMTMgKzEyMzEsMTQgQEAKIAlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX0xPQ0FMLCBtLCBzaXplb2Yoc3RydWN0IG1pYl9sb2NhbCkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTE9DQUwpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBMT0NBTDogYmVhY29uX2VuYWJsZSAlZCAiCiAJCSAidHhhdXRvcmF0ZV9mYWxsYmFjayAlZCBzc2lkX3NpemUgJWQgcHJvbWlzY3VvdXNfbW9kZSAlZCAiCi0JCSAicHJlYW1ibGVfdHlwZSAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgbS0+YmVhY29uX2VuYWJsZSwKKwkJICJwcmVhbWJsZV90eXBlICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgbS0+YmVhY29uX2VuYWJsZSwKIAkJIG0tPnR4YXV0b3JhdGVfZmFsbGJhY2ssIG0tPnNzaWRfc2l6ZSwgbS0+cHJvbWlzY3VvdXNfbW9kZSwKIAkJIG0tPnByZWFtYmxlX3R5cGUpOwogZXhpdDoKQEAgLTEyNDksMTE4ICsxMjU3LDIxIEBACiAJCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tZG9tYWluKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChNRE9NQUlOKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTURPTUFJTjogY2hhbm5lbF9saXN0ICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKIAkJIGhleDJzdHIobS0+Y2hhbm5lbF9saXN0LCBzaXplb2YobS0+Y2hhbm5lbF9saXN0KSkpOwogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTURPTUFJTjogdHhfcG93ZXJsZXZlbCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCiAJCSBoZXgyc3RyKG0tPnR4X3Bvd2VybGV2ZWwsIHNpemVvZihtLT50eF9wb3dlcmxldmVsKSkpOwogZXhpdDoKIAlrZnJlZShtKTsKIH0KIAotc3RhdGljIGludCBhdDc2X2dldF9jdXJyZW50X2Jzc2lkKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG1pYl9tYWNfbWdtdCAqbWFjX21nbXQgPQotCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW1hY19tZ210KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX01BQ19NR01ULCBtYWNfbWdtdCwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCW1lbWNweShwcml2LT5ic3NpZCwgbWFjX21nbXQtPmN1cnJlbnRfYnNzaWQsIEVUSF9BTEVOKTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgQlNTSUQgJXNcbiIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkgICAgICAgbWFjMnN0cihwcml2LT5ic3NpZCkpOwotZXJyb3I6Ci0Ja2ZyZWUobWFjX21nbXQpOwotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfZ2V0X2N1cnJlbnRfY2hhbm5lbChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBtaWJfcGh5ICpwaHkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX3BoeSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwaHkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX1BIWSwgcGh5LCBzaXplb2Yoc3RydWN0IG1pYl9waHkpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIoTUlCX1BIWSkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcHJpdi0+Y2hhbm5lbCA9IHBoeS0+Y2hhbm5lbF9pZDsKLWVycm9yOgotCWtmcmVlKHBoeSk7Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYXQ3Nl9zdGFydF9zY2FuIC0gc3RhcnQgYSBzY2FuCi0gKgotICogQHVzZV9lc3NpZCAtIHVzZSB0aGUgY29uZmlndXJlZCBFU1NJRCBpbiBub24gcGFzc2l2ZSBtb2RlCi0gKi8KLXN0YXRpYyBpbnQgYXQ3Nl9zdGFydF9zY2FuKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIGludCB1c2VfZXNzaWQpCi17Ci0Jc3RydWN0IGF0NzZfcmVxX3NjYW4gc2NhbjsKLQotCW1lbXNldCgmc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9zY2FuKSk7Ci0JbWVtc2V0KHNjYW4uYnNzaWQsIDB4ZmYsIEVUSF9BTEVOKTsKLQotCWlmICh1c2VfZXNzaWQpIHsKLQkJbWVtY3B5KHNjYW4uZXNzaWQsIHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JCXNjYW4uZXNzaWRfc2l6ZSA9IHByaXYtPmVzc2lkX3NpemU7Ci0JfSBlbHNlCi0JCXNjYW4uZXNzaWRfc2l6ZSA9IDA7Ci0KLQkvKiBqYWw6IHdoeSBzaG91bGQgd2Ugc3RhcnQgYXQgYSBjZXJ0YWluIGNoYW5uZWw/IHdlIGRvIHNjYW4gdGhlIHdob2xlCi0JICAgcmFuZ2UgYWxsb3dlZCBieSByZWcgZG9tYWluLiAqLwotCXNjYW4uY2hhbm5lbCA9IHByaXYtPmNoYW5uZWw7Ci0KLQkvKiBhdG1lbHdsYW5kcml2ZXIgZGlmZmVycyBiZXR3ZWVuIHNjYW4gdHlwZSAwIGFuZCAxIChhY3RpdmUvcGFzc2l2ZSkKLQkgICBGb3IgYWQtaG9jIG1vZGUsIGl0IHVzZXMgdHlwZSAwIG9ubHkuICovCi0Jc2Nhbi5zY2FuX3R5cGUgPSBwcml2LT5zY2FuX21vZGU7Ci0KLQkvKiBJTkZPOiBGb3IgcHJvYmVfZGVsYXksIG5vdCBtdWx0aXBseWluZyBieSAxMDI0IGFzIHRoaXMgd2lsbCBiZQotCSAgIHNsaWdodGx5IGxlc3MgdGhhbiBtaW5fY2hhbm5lbF90aW1lCi0JICAgKHBlciBzcGVjOiBwcm9iZSBkZWxheSA8IG1pbi4gY2hhbm5lbCB0aW1lKSAqLwotCXNjYW4ubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWluX3RpbWUpOwotCXNjYW4ubWF4X2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWF4X3RpbWUpOwotCXNjYW4ucHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUxNihwcml2LT5zY2FuX21pbl90aW1lICogMTAwMCk7Ci0Jc2Nhbi5pbnRlcm5hdGlvbmFsX3NjYW4gPSAwOwotCi0JLyogb3RoZXIgdmFsdWVzIGFyZSBzZXQgdG8gMCBmb3IgdHlwZSAwICovCi0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICIlczogc3RhcnRfc2NhbiAodXNlX2Vzc2lkID0gJWQsIGludGwgPSAlZCwgIgotCQkgImNoYW5uZWwgPSAlZCwgcHJvYmVfZGVsYXkgPSAlZCwgc2Nhbl9taW5fdGltZSA9ICVkLCAiCi0JCSAic2Nhbl9tYXhfdGltZSA9ICVkKSIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIHVzZV9lc3NpZCwKLQkJIHNjYW4uaW50ZXJuYXRpb25hbF9zY2FuLCBzY2FuLmNoYW5uZWwsCi0JCSBsZTE2X3RvX2NwdShzY2FuLnByb2JlX2RlbGF5KSwKLQkJIGxlMTZfdG9fY3B1KHNjYW4ubWluX2NoYW5uZWxfdGltZSksCi0JCSBsZTE2X3RvX2NwdShzY2FuLm1heF9jaGFubmVsX3RpbWUpKTsKLQotCXJldHVybiBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgQ01EX1NDQU4sICZzY2FuLCBzaXplb2Yoc2NhbikpOwotfQotCiAvKiBFbmFibGUgbW9uaXRvciBtb2RlICovCiBzdGF0aWMgaW50IGF0NzZfc3RhcnRfbW9uaXRvcihzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQogewpAQCAtMTM4MSw4NiArMTI5Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdDc2X3N0YXJ0X2lic3Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgYXQ3Nl9yZXFfaWJzcyBic3M7Ci0JaW50IHJldDsKLQotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19PV05fSUJTUyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfT1dOX0lCU1MpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQltZW1zZXQoJmJzcywgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9pYnNzKSk7Ci0JbWVtc2V0KGJzcy5ic3NpZCwgMHhmZiwgRVRIX0FMRU4pOwotCW1lbWNweShic3MuZXNzaWQsIHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JYnNzLmVzc2lkX3NpemUgPSBwcml2LT5lc3NpZF9zaXplOwotCWJzcy5ic3NfdHlwZSA9IEFESE9DX01PREU7Ci0JYnNzLmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOwotCi0JcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9TVEFSVF9JQlNTLCAmYnNzLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX2lic3MpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzdGFydF9pYnNzIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX1NUQVJUX0lCU1MpOwotCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzdGFydF9pYnNzIGZhaWxlZCB0byBjb21wbGV0ZSwgJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl9nZXRfY3VycmVudF9ic3NpZChwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGF0NzZfZ2V0X2N1cnJlbnRfY2hhbm5lbChwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIG5vdCBzdXJlIHdoYXQgdGhpcyBpcyBnb29kIGZvciA/Pz8gKi8KLQlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX01HTVQ7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMTsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfbWdtdCwgaWJzc19jaGFuZ2UpOwotCXByaXYtPm1pYl9idWYuZGF0YS5ieXRlID0gMDsKLQotCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoaWJzcyBjaGFuZ2Ugb2spIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JbmV0aWZfY2Fycmllcl9vbihwcml2LT5uZXRkZXYpOwotCW5ldGlmX3N0YXJ0X3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJlcXVlc3QgY2FyZCB0byBqb2luIEJTUyBpbiBtYW5hZ2VkIG9yIGFkLWhvYyBtb2RlICovCi1zdGF0aWMgaW50IGF0NzZfam9pbl9ic3Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0Jc3RydWN0IGF0NzZfcmVxX2pvaW4gam9pbjsKLQotCUJVR19PTighcHRyKTsKLQotCW1lbXNldCgmam9pbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7Ci0JbWVtY3B5KGpvaW4uYnNzaWQsIHB0ci0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkoam9pbi5lc3NpZCwgcHRyLT5zc2lkLCBwdHItPnNzaWRfbGVuKTsKLQlqb2luLmVzc2lkX3NpemUgPSBwdHItPnNzaWRfbGVuOwotCWpvaW4uYnNzX3R5cGUgPSAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DID8gMSA6IDIpOwotCWpvaW4uY2hhbm5lbCA9IHB0ci0+Y2hhbm5lbDsKLQlqb2luLnRpbWVvdXQgPSBjcHVfdG9fbGUxNigyMDAwKTsKLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywKLQkJICIlcyBqb2luIGFkZHIgJXMgc3NpZCAlcyB0eXBlICVkIGNoICVkIHRpbWVvdXQgJWQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKGpvaW4uYnNzaWQpLCBqb2luLmVzc2lkLAotCQkgam9pbi5ic3NfdHlwZSwgam9pbi5jaGFubmVsLCBsZTE2X3RvX2NwdShqb2luLnRpbWVvdXQpKTsKLQlyZXR1cm4gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9KT0lOLCAmam9pbiwKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfam9pbikpOwotfQotCiAvKiBDYWxjdWxhdGUgcGFkZGluZyBmcm9tIHR4YnVmLT53bGVuZ3RoICh3aGljaCBleGNsdWRlcyB0aGUgVVNCIFRYIGhlYWRlciksCiAgICBsaWtlbHkgdG8gY29tcGVuc2F0ZSBhIGZsYXcgaW4gdGhlIEFUNzZDNTAzQSBVU0IgcGFydCAuLi4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGF0NzZfY2FsY19wYWRkaW5nKGludCB3bGVuKQpAQCAtMTQ3OSwxNCArMTMxMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdlIGFyZSBkb2luZyBhIGxvdCBvZiB0aGluZ3MgaGVyZSBpbiBhbiBpbnRlcnJ1cHQuIE5lZWQKLSAgIGEgYmggaGFuZGxlciAoV2F0Y2hpbmcgVFYgd2l0aCBhIFRWIGNhcmQgaXMgcHJvYmFibHkKLSAgIGEgZ29vZCB0ZXN0OiBpZiB5b3Ugc2VlIGZsaWNrZXJzLCB3ZSBhcmUgZG9pbmcgdG9vIG11Y2guCi0gICBDdXJyZW50bHkgSSBkbyBzZWUgZmxpY2tlcnMuLi4gZXZlbiB3aXRoIG91ciB0YXNrbGV0IDotKCApCi0gICBNYXliZSBiZWNhdXNlIHRoZSBidHR2IGRyaXZlciBhbmQgdXNiLXVoY2kgdXNlIHRoZSBzYW1lIGludGVycnVwdAotKi8KLS8qIE9yIG1heWJlIGJlY2F1c2Ugb3VyIEJIIGhhbmRsZXIgaXMgcHJlZW1wdGluZyBidHR2J3MgQkggaGFuZGxlci4uIEJIcyBkb24ndAotICogc29sdmUgZXZlcnl0aGluZy4uIChhbGV4KSAqLwogc3RhdGljIHZvaWQgYXQ3Nl9yeF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IHVyYi0+Y29udGV4dDsKQEAgLTE0OTYsMTc1OCArMTMxOSw2IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBhdDc2X3R4X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqbWdtdF9idWY7Ci0JaW50IHJldDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6Ci0JCXN0YXRzLT50eF9wYWNrZXRzKys7Ci0JCWJyZWFrOwotCWNhc2UgLUVOT0VOVDoKLQljYXNlIC1FQ09OTlJFU0VUOgotCQkvKiB1cmIgaGFzIGJlZW4gdW5saW5rZWQgKi8KLQkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCWF0NzZfZGJnKERCR19VUkIsICIlcyAtIG5vbnplcm8gdHggc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKLQkJc3RhdHMtPnR4X2Vycm9ycysrOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bWdtdF9zcGlubG9jaywgZmxhZ3MpOwotCW1nbXRfYnVmID0gcHJpdi0+bmV4dF9tZ210X2J1bGs7Ci0JcHJpdi0+bmV4dF9tZ210X2J1bGsgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmICghbWdtdF9idWYpIHsKLQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZXRkZXYpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogd2UgZG9uJ3QgY29weSB0aGUgcGFkZGluZyBieXRlcywgYnV0IGFkZCB0aGVtCi0JICAgdG8gdGhlIGxlbmd0aCAqLwotCW1lbWNweShwcml2LT5idWxrX291dF9idWZmZXIsIG1nbXRfYnVmLAotCSAgICAgICBsZTE2X3RvX2NwdShtZ210X2J1Zi0+d2xlbmd0aCkgKyBBVDc2X1RYX0hEUkxFTik7Ci0JdXNiX2ZpbGxfYnVsa191cmIocHJpdi0+dHhfdXJiLCBwcml2LT51ZGV2LCBwcml2LT50eF9waXBlLAotCQkJICBwcml2LT5idWxrX291dF9idWZmZXIsCi0JCQkgIGxlMTZfdG9fY3B1KG1nbXRfYnVmLT53bGVuZ3RoKSArIG1nbXRfYnVmLT5wYWRkaW5nICsKLQkJCSAgQVQ3Nl9UWF9IRFJMRU4sIGF0NzZfdHhfY2FsbGJhY2ssIHByaXYpOwotCXJldCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgaW4gdHggc3VibWl0IHVyYjogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0KLQlrZnJlZShtZ210X2J1Zik7Ci19Ci0KLS8qIFNlbmQgYSBtYW5hZ2VtZW50IGZyYW1lIG9uIGJ1bGstb3V0LiAgdHhidWYtPndsZW5ndGggbXVzdCBiZSBzZXQgKi8KLXN0YXRpYyBpbnQgYXQ3Nl90eF9tZ210KHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqdHhidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCWludCB1cmJfc3RhdHVzOwotCXZvaWQgKm9sZGJ1ZiA9IE5VTEw7Ci0KLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwkvKiBzdG9wIG5ldGRldiB3YXRjaGRvZyAqLwotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsJLyogc3RvcCB0eCBkYXRhIHBhY2tldHMgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQl1cmJfc3RhdHVzID0gcHJpdi0+dHhfdXJiLT5zdGF0dXM7Ci0JaWYgKHVyYl9zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCS8qIGNhbm5vdCB0cmFuc21pdCBub3csIHB1dCBpbiB0aGUgcXVldWUgKi8KLQkJb2xkYnVmID0gcHJpdi0+bmV4dF9tZ210X2J1bGs7Ci0JCXByaXYtPm5leHRfbWdtdF9idWxrID0gdHhidWY7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmIChvbGRidWYpIHsKLQkJLyogYSBkYXRhL21nbXQgdHggaXMgYWxyZWFkeSBwZW5kaW5nIGluIHRoZSBVUkIgLQotCQkgICBpZiB0aGlzIGlzIG5vIGVycm9yIGluIHNvbWUgc2l0dWF0aW9ucyB3ZSBtdXN0Ci0JCSAgIGltcGxlbWVudCBhIHF1ZXVlIG9yIHNpbGVudGx5IG1vZGlmeSB0aGUgb2xkIG1zZyAqLwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZW1vdmVkIHBlbmRpbmcgbWdtdCBidWZmZXIgJXNcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGhleDJzdHIob2xkYnVmLCA2NCkpOwotCQlrZnJlZShvbGRidWYpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl0eGJ1Zi0+dHhfcmF0ZSA9IFRYX1JBVEVfMU1CSVQ7Ci0JdHhidWYtPnBhZGRpbmcgPSBhdDc2X2NhbGNfcGFkZGluZyhsZTE2X3RvX2NwdSh0eGJ1Zi0+d2xlbmd0aCkpOwotCW1lbXNldCh0eGJ1Zi0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eGJ1Zi0+cmVzZXJ2ZWQpKTsKLQotCWlmIChwcml2LT5uZXh0X21nbXRfYnVsaykKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVVJCIHN0YXR1cyAlZCwgYnV0IG1nbXQgaXMgcGVuZGluZ1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgdXJiX3N0YXR1cyk7Ci0KLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwKLQkJICIlczogdHggbWdtdDogd2xlbiAlZCB0eF9yYXRlICVkIHBhZCAlZCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIGxlMTZfdG9fY3B1KHR4YnVmLT53bGVuZ3RoKSwKLQkJIHR4YnVmLT50eF9yYXRlLCB0eGJ1Zi0+cGFkZGluZywKLQkJIGhleDJzdHIodHhidWYtPnBhY2tldCwgbGUxNl90b19jcHUodHhidWYtPndsZW5ndGgpKSk7Ci0KLQkvKiB0eGJ1ZiB3YXMgbm90IGNvbnN1bWVkIGFib3ZlIC0+IHNlbmQgbWdtdCBtc2cgaW1tZWRpYXRlbHkgKi8KLQltZW1jcHkocHJpdi0+YnVsa19vdXRfYnVmZmVyLCB0eGJ1ZiwKLQkgICAgICAgbGUxNl90b19jcHUodHhidWYtPndsZW5ndGgpICsgQVQ3Nl9UWF9IRFJMRU4pOwotCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwKLQkJCSAgcHJpdi0+YnVsa19vdXRfYnVmZmVyLAotCQkJICBsZTE2X3RvX2NwdSh0eGJ1Zi0+d2xlbmd0aCkgKyB0eGJ1Zi0+cGFkZGluZyArCi0JCQkgIEFUNzZfVFhfSERSTEVOLCBhdDc2X3R4X2NhbGxiYWNrLCBwcml2KTsKLQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yIGluIHR4IHN1Ym1pdCB1cmI6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi0Ja2ZyZWUodHhidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogR28gdG8gdGhlIG5leHQgaW5mb3JtYXRpb24gZWxlbWVudCAqLwotc3RhdGljIGlubGluZSB2b2lkIG5leHRfaWUoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKippZSkKLXsKLQkqaWUgPSAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikoJigqaWUpLT5kYXRhWygqaWUpLT5sZW5dKTsKLX0KLQotLyogQ2hhbGxlbmdlIGlzIHRoZSBjaGFsbGVuZ2Ugc3RyaW5nIChpbiBUTFYgZm9ybWF0KQotICAgd2UgZ290IHdpdGggc2VxX25yIDIgZm9yIHNoYXJlZCBzZWNyZXQgYXV0aGVudGljYXRpb24gb25seSBhbmQKLSAgIHNlbmQgaW4gc2VxX25yIDMgV0VQIGVuY3J5cHRlZCB0byBwcm92ZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFdFUCBrZXk7Ci0gICBvdGhlcndpc2UgaXQgaXMgTlVMTCAqLwotc3RhdGljIGludCBhdDc2X2F1dGhfcmVxKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBic3NfaW5mbyAqYnNzLAotCQkJIGludCBzZXFfbnIsIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICpjaGFsbGVuZ2UpCi17Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoICpyZXE7Ci0JaW50IGJ1Zl9sZW4gPSAoc2VxX25yICE9IDMgPyBBVVRIX0ZSQU1FX1NJWkUgOgotCQkgICAgICAgQVVUSF9GUkFNRV9TSVpFICsgMSArIDEgKyBjaGFsbGVuZ2UtPmxlbik7Ci0KLQlCVUdfT04oIWJzcyk7Ci0JQlVHX09OKHNlcV9uciA9PSAzICYmICFjaGFsbGVuZ2UpOwotCXR4X2J1ZmZlciA9IGttYWxsb2MoYnVmX2xlbiArIE1BWF9QQURESU5HX1NJWkUsIEdGUF9BVE9NSUMpOwotCWlmICghdHhfYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJlcSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGggKil0eF9idWZmZXItPnBhY2tldDsKLQltZ210ID0gJnJlcS0+aGVhZGVyOwotCi0JLyogbWFrZSB3aXJlbGVzcyBoZWFkZXIgKi8KLQkvKiBmaXJzdCBhdXRoIG1zZyBpcyBub3QgZW5jcnlwdGVkLCBvbmx5IHRoZSBzZWNvbmQgKHNlcV9uciA9PSAzKSAqLwotCW1nbXQtPmZyYW1lX2N0bCA9Ci0JICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX0FVVEggfAotCQkJKHNlcV9uciA9PSAzID8gSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEIDogMCkpOwotCi0JbWdtdC0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigweDgwMDApOwotCW1lbWNweShtZ210LT5hZGRyMSwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMiwgcHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMywgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1nbXQtPnNlcV9jdGwgPSBjcHVfdG9fbGUxNigwKTsKLQotCXJlcS0+YWxnb3JpdGhtID0gY3B1X3RvX2xlMTYocHJpdi0+YXV0aF9tb2RlKTsKLQlyZXEtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoc2VxX25yKTsKLQlyZXEtPnN0YXR1cyA9IGNwdV90b19sZTE2KDApOwotCi0JaWYgKHNlcV9uciA9PSAzKQotCQltZW1jcHkocmVxLT5pbmZvX2VsZW1lbnQsIGNoYWxsZW5nZSwgMSArIDEgKyBjaGFsbGVuZ2UtPmxlbik7Ci0KLQkvKiBpbml0LiBhdDc2X3ByaXYgdHggaGVhZGVyICovCi0JdHhfYnVmZmVyLT53bGVuZ3RoID0gY3B1X3RvX2xlMTYoYnVmX2xlbiAtIEFUNzZfVFhfSERSTEVOKTsKLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwgIiVzOiBBdXRoUmVxIGJzc2lkICVzIGFsZyAlZCBzZXFfbnIgJWQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlcS0+YWxnb3JpdGhtKSwgbGUxNl90b19jcHUocmVxLT50cmFuc2FjdGlvbikpOwotCWlmIChzZXFfbnIgPT0gMykKLQkJYXQ3Nl9kYmcoREJHX1RYX01HTVQsICIlczogQXV0aFJlcSBjaGFsbGVuZ2U6ICVzIC4uLiIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBoZXgyc3RyKHJlcS0+aW5mb19lbGVtZW50LCAxOCkpOwotCi0JLyogZWl0aGVyIHNlbmQgaW1tZWRpYXRlbHkgKGlmIG5vIGRhdGEgdHggaXMgcGVuZGluZwotCSAgIG9yIHB1dCBpdCBpbiBwZW5kaW5nIGxpc3QgKi8KLQlyZXR1cm4gYXQ3Nl90eF9tZ210KHByaXYsIHR4X2J1ZmZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9hc3NvY19yZXEoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpic3MpCi17Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0ICpyZXE7Ci0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmllOwotCWNoYXIgKmVzc2lkOwotCWludCBlc3NpZF9sZW47Ci0JdTE2IGNhcGE7Ci0KLQlCVUdfT04oIWJzcyk7Ci0KLQl0eF9idWZmZXIgPSBrbWFsbG9jKEFTU09DUkVRX01BWF9TSVpFICsgTUFYX1BBRERJTkdfU0laRSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0eF9idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdCAqKXR4X2J1ZmZlci0+cGFja2V0OwotCW1nbXQgPSAmcmVxLT5oZWFkZXI7Ci0JaWUgPSByZXEtPmluZm9fZWxlbWVudDsKLQotCS8qIG1ha2Ugd2lyZWxlc3MgaGVhZGVyICovCi0JbWdtdC0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAotCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOwotCi0JbWdtdC0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigweDgwMDApOwotCW1lbWNweShtZ210LT5hZGRyMSwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMiwgcHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMywgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1nbXQtPnNlcV9jdGwgPSBjcHVfdG9fbGUxNigwKTsKLQotCS8qIHdlIG11c3Qgc2V0IHRoZSBQcml2YWN5IGJpdCBpbiB0aGUgY2FwYWJpbGl0aWVzIHRvIGFzc3VyZSBhbgotCSAgIEFnZXJlLWJhc2VkIEFQIHdpdGggb3B0aW9uYWwgV0VQIHRyYW5zbWl0cyBlbmNyeXB0ZWQgZnJhbWVzCi0JICAgdG8gdXMuICBBUCBvbmx5IHNldCB0aGUgUHJpdmFjeSBiaXQgaW4gdGhlaXIgY2FwYWJpbGl0aWVzCi0JICAgaWYgV0VQIGlzIG1hbmRhdG9yeSBpbiB0aGUgQlNTISAqLwotCWNhcGEgPSBic3MtPmNhcGE7Ci0JaWYgKHByaXYtPndlcF9lbmFibGVkKQotCQljYXBhIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCWlmIChwcml2LT5wcmVhbWJsZV90eXBlICE9IFBSRUFNQkxFX1RZUEVfTE9ORykKLQkJY2FwYSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEU7Ci0JcmVxLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoY2FwYSk7Ci0KLQlyZXEtPmxpc3Rlbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KDIgKiBic3MtPmJlYWNvbl9pbnRlcnZhbCk7Ci0KLQkvKiB3cml0ZSBUTFYgZGF0YSBlbGVtZW50cyAqLwotCi0JaWUtPmlkID0gTUZJRV9UWVBFX1NTSUQ7Ci0JaWUtPmxlbiA9IGJzcy0+c3NpZF9sZW47Ci0JbWVtY3B5KGllLT5kYXRhLCBic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pOwotCW5leHRfaWUoJmllKTsKLQotCWllLT5pZCA9IE1GSUVfVFlQRV9SQVRFUzsKLQlpZS0+bGVuID0gc2l6ZW9mKGh3X3JhdGVzKTsKLQltZW1jcHkoaWUtPmRhdGEsIGh3X3JhdGVzLCBzaXplb2YoaHdfcmF0ZXMpKTsKLQluZXh0X2llKCZpZSk7CQkvKiBpZSBwb2ludHMgYmVoaW5kIHRoZSBzdXBwX3JhdGVzIGZpZWxkICovCi0KLQkvKiBpbml0LiBhdDc2X3ByaXYgdHggaGVhZGVyICovCi0JdHhfYnVmZmVyLT53bGVuZ3RoID0gY3B1X3RvX2xlMTYoKHU4ICopaWUgLSAodTggKiltZ210KTsKLQotCWllID0gcmVxLT5pbmZvX2VsZW1lbnQ7Ci0JZXNzaWQgPSBpZS0+ZGF0YTsKLQllc3NpZF9sZW4gPSBtaW5fdChpbnQsIElXX0VTU0lEX01BWF9TSVpFLCBpZS0+bGVuKTsKLQotCW5leHRfaWUoJmllKTsJCS8qIHBvaW50cyB0byBJRSBvZiByYXRlcyBub3cgKi8KLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwKLQkJICIlczogQXNzb2NSZXEgYnNzaWQgJXMgY2FwYSAweCUwNHggc3NpZCAlLipzIHJhdGVzICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihtZ210LT5hZGRyMyksCi0JCSBsZTE2X3RvX2NwdShyZXEtPmNhcGFiaWxpdHkpLCBlc3NpZF9sZW4sIGVzc2lkLAotCQkgaGV4MnN0cihpZS0+ZGF0YSwgaWUtPmxlbikpOwotCi0JLyogZWl0aGVyIHNlbmQgaW1tZWRpYXRlbHkgKGlmIG5vIGRhdGEgdHggaXMgcGVuZGluZwotCSAgIG9yIHB1dCBpdCBpbiBwZW5kaW5nIGxpc3QgKi8KLQlyZXR1cm4gYXQ3Nl90eF9tZ210KHByaXYsIHR4X2J1ZmZlcik7Ci19Ci0KLS8qIFdlIGdvdCB0byBjaGVjayB0aGUgYnNzX2xpc3QgZm9yIG9sZCBlbnRyaWVzICovCi1zdGF0aWMgdm9pZCBhdDc2X2Jzc19saXN0X3RpbWVvdXQodW5zaWduZWQgbG9uZyBwYXIpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgYXQ3Nl9wcml2ICopcGFyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0ciwgKm5wdHI7Ci0Jc3RydWN0IGJzc19pbmZvICpwdHI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShscHRyLCBucHRyLCAmcHJpdi0+YnNzX2xpc3QpIHsKLQotCQlwdHIgPSBsaXN0X2VudHJ5KGxwdHIsIHN0cnVjdCBic3NfaW5mbywgbGlzdCk7Ci0KLQkJaWYgKHB0ciAhPSBwcml2LT5jdXJyX2JzcwotCQkgICAgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBwdHItPmxhc3RfcnggKyBCU1NfTElTVF9USU1FT1VUKSkgewotCQkJYXQ3Nl9kYmcoREJHX0JTU19UQUJMRV9STSwKLQkJCQkgIiVzOiBic3NfbGlzdDogcmVtb3Zpbmcgb2xkIEJTUyAlcyBjaCAlZCIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwdHItPmJzc2lkKSwKLQkJCQkgcHRyLT5jaGFubmVsKTsKLQkJCWxpc3RfZGVsKCZwdHItPmxpc3QpOwotCQkJa2ZyZWUocHRyKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCS8qIHJlc3RhcnQgdGhlIHRpbWVyICovCi0JbW9kX3RpbWVyKCZwcml2LT5ic3NfbGlzdF90aW1lciwgamlmZmllcyArIEJTU19MSVNUX1RJTUVPVVQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXQ3Nl9zZXRfbWFjX3N0YXRlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkJICAgICAgZW51bSBtYWNfc3RhdGUgbWFjX3N0YXRlKQotewotCWF0NzZfZGJnKERCR19NQUNfU1RBVEUsICIlcyBzdGF0ZTogJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBtYWNfc3RhdGVzW21hY19zdGF0ZV0pOwotCXByaXYtPm1hY19zdGF0ZSA9IG1hY19zdGF0ZTsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9kdW1wX2Jzc190YWJsZShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBic3NfaW5mbyAqcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0cjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwgIiVzIEJTUyB0YWJsZSAoY3Vycj0lcCk6IiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgcHJpdi0+Y3Vycl9ic3MpOwotCi0JbGlzdF9mb3JfZWFjaChscHRyLCAmcHJpdi0+YnNzX2xpc3QpIHsKLQkJcHRyID0gbGlzdF9lbnRyeShscHRyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpOwotCQlhdDc2X2RiZyhEQkdfQlNTX1RBQkxFLCAiMHglcDogYnNzaWQgJXMgY2hhbm5lbCAlZCBzc2lkICUuKnMgIgotCQkJICIoJXMpIGNhcGEgMHglMDR4IHJhdGVzICVzIHJzc2kgJWQgbGluayAlZCBub2lzZSAlZCIsCi0JCQkgcHRyLCBtYWMyc3RyKHB0ci0+YnNzaWQpLCBwdHItPmNoYW5uZWwsIHB0ci0+c3NpZF9sZW4sCi0JCQkgcHRyLT5zc2lkLCBoZXgyc3RyKHB0ci0+c3NpZCwgcHRyLT5zc2lkX2xlbiksCi0JCQkgcHRyLT5jYXBhLCBoZXgyc3RyKHB0ci0+cmF0ZXMsIHB0ci0+cmF0ZXNfbGVuKSwKLQkJCSBwdHItPnJzc2ksIHB0ci0+bGlua19xdWFsLCBwdHItPm5vaXNlX2xldmVsKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotLyogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCBhc3NvY2lhdGlvbiB0byBtYXJrIGludGVyZmFjZSBhcyBjb25uZWN0ZWQgKi8KLXN0YXRpYyB2b2lkIGF0NzZfd29ya19hc3NvY19kb25lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIHdvcmtfYXNzb2NfZG9uZSk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DKTsKLQlXQVJOX09OKCFwcml2LT5jdXJyX2Jzcyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MgfHwgIXByaXYtPmN1cnJfYnNzKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7Ci0JCWlmIChwcml2LT5wbV9tb2RlICE9IEFUNzZfUE1fT0ZGKSB7Ci0JCQkvKiBjYWxjdWxhdGUgdGhlIGxpc3RlbiBpbnRlcnZhbCBpbiB1bml0cyBvZgotCQkJICAgYmVhY29uIGludGVydmFscyBvZiB0aGUgY3Vycl9ic3MgKi8KLQkJCXUzMiBwbV9wZXJpb2RfYmVhY29uID0gKHByaXYtPnBtX3BlcmlvZCA+PiAxMCkgLwotCQkJICAgIHByaXYtPmN1cnJfYnNzLT5iZWFjb25faW50ZXJ2YWw7Ci0KLQkJCXBtX3BlcmlvZF9iZWFjb24gPSBtYXgocG1fcGVyaW9kX2JlYWNvbiwgMnUpOwotCQkJcG1fcGVyaW9kX2JlYWNvbiA9IG1pbihwbV9wZXJpb2RfYmVhY29uLCAweGZmZmZ1KTsKLQotCQkJYXQ3Nl9kYmcoREJHX1BNLAotCQkJCSAiJXM6IHBtX21vZGUgJWQgYXNzb2MgaWQgMHgleCBsaXN0ZW4gaW50ICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwcml2LT5wbV9tb2RlLAotCQkJCSBwcml2LT5hc3NvY19pZCwgcG1fcGVyaW9kX2JlYWNvbik7Ci0KLQkJCWF0NzZfc2V0X2Fzc29jaWQocHJpdiwgcHJpdi0+YXNzb2NfaWQpOwotCQkJYXQ3Nl9zZXRfbGlzdGVuX2ludGVydmFsKHByaXYsICh1MTYpcG1fcGVyaW9kX2JlYWNvbik7Ci0JCX0KLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24sIEJFQUNPTl9USU1FT1VUKTsKLQl9Ci0JYXQ3Nl9zZXRfcG1fbW9kZShwcml2KTsKLQotCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+bmV0ZGV2KTsKLQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19DT05ORUNURUQpOwotCWF0NzZfaXdldmVudF9ic3NfY29ubmVjdChwcml2LT5uZXRkZXYsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCk7Ci0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiJXM6IGNvbm5lY3RlZCB0byBCU1NJRCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIocHJpdi0+Y3Vycl9ic3MtPmJzc2lkKSk7Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBXZSBvbmx5IHN0b3JlIHRoZSBuZXcgbWFjIGFkZHJlc3MgaW4gbmV0ZGV2IHN0cnVjdCwKLSAgIGl0IGdldHMgc2V0IHdoZW4gdGhlIG5ldGRldiBpcyBvcGVuZWQuICovCi1zdGF0aWMgaW50IGF0NzZfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKmFkZHIpCi17Ci0Jc3RydWN0IHNvY2thZGRyICptYWMgPSBhZGRyOwotCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIEVUSF9BTEVOKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdDc2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAmcHJpdi0+c3RhdHM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYXQ3Nl9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIlJFVFVSTiBxdWFsICVkIGxldmVsICVkIG5vaXNlICVkIHVwZGF0ZWQgJWQiLAotCQkgcHJpdi0+d3N0YXRzLnF1YWwucXVhbCwgcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwsCi0JCSBwcml2LT53c3RhdHMucXVhbC5ub2lzZSwgcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCk7Ci0KLQlyZXR1cm4gJnByaXYtPndzdGF0czsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHByb21pc2M7Ci0KLQlwcm9taXNjID0gKChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICE9IDApOwotCWlmIChwcm9taXNjICE9IHByaXYtPnByb21pc2MpIHsKLQkJLyogVGhpcyBnZXRzIGNhbGxlZCBpbiBpbnRlcnJ1cHQsIG11c3QgcmVzY2hlZHVsZSAqLwotCQlwcml2LT5wcm9taXNjID0gcHJvbWlzYzsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zZXRfcHJvbWlzYyk7Ci0JfQotfQotCi0vKiBTdG9wIGFsbCBuZXR3b3JrIGFjdGl2aXR5LCBmbHVzaCBhbGwgcGVuZGluZyB0YXNrcyAqLwotc3RhdGljIHZvaWQgYXQ3Nl9xdWllc2NlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwotCi0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19JTklUKTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24pOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19yZXN0YXJ0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci0Ja2ZyZWUocHJpdi0+bmV4dF9tZ210X2J1bGspOwotCXByaXYtPm5leHRfbWdtdF9idWxrID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBhdDc2X3ByaXYgaW1wbGVtZW50YXRpb25zIG9mIGl3X2hhbmRsZXIgZnVuY3Rpb25zOgotICovCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICB2b2lkICpudWxsLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzICVzOiByZXN0YXJ0aW5nIHRoZSBkZXZpY2UiLCBuZXRkZXYtPm5hbWUsCi0JCSBfX2Z1bmNfXyk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19JTklUKQotCQlhdDc2X3F1aWVzY2UocHJpdik7Ci0KLQkvKiBXYWl0IGhhbGYgc2Vjb25kIGJlZm9yZSB0aGUgcmVzdGFydCB0byBwcm9jZXNzIHN1YnNlcXVlbnQKLQkgKiByZXF1ZXN0cyBmcm9tIHRoZSBzYW1lIGl3Y29uZmlnIGluIGEgc2luZ2xlIHJlc3RhcnQgKi8KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX3Jlc3RhcnQsIEhaIC8gMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RyY3B5KG5hbWUsICJJRUVFIDgwMi4xMWIiKTsKLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV05BTUUgLSBuYW1lICVzIiwgbmV0ZGV2LT5uYW1lLCBuYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBjaGFuID0gLTE7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdGUkVRIC0gZnJlcS5tICVkIGZyZXEuZSAlZCIsCi0JCSBuZXRkZXYtPm5hbWUsIGZyZXEtPm0sIGZyZXEtPmUpOwotCi0JaWYgKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQotCQkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCi0JCWNoYW4gPSBmcmVxLT5tOwotCWVsc2UgewotCQkvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgKi8KLQkJaW50IG11bHQgPSAxOwotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgKDYgLSBmcmVxLT5lKTsgaSsrKQotCQkJbXVsdCAqPSAxMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspIHsKLQkJCWlmIChmcmVxLT5tID09IChjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIG11bHQpKQotCQkJCWNoYW4gPSBpICsgMTsKLQkJfQotCX0KLQotCWlmIChjaGFuIDwgMSB8fCAhcHJpdi0+ZG9tYWluKQotCQkvKiBub24tcG9zaXRpdmUgY2hhbm5lbHMgYXJlIGludmFsaWQKLQkJICogd2UgbmVlZCBhIGRvbWFpbiBpbmZvIHRvIHNldCB0aGUgY2hhbm5lbAotCQkgKiBlaXRoZXIgdGhhdCBvciBhbiBpbnZhbGlkIGZyZXF1ZW5jeSB3YXMKLQkJICogcHJvdmlkZWQgYnkgdGhlIHVzZXIgKi8KLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlIGlmICghKHByaXYtPmRvbWFpbi0+Y2hhbm5lbF9tYXAgJiAoMSA8PCAoY2hhbiAtIDEpKSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNoYW5uZWwgJWQgbm90IGFsbG93ZWQgZm9yIGRvbWFpbiAlc1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgY2hhbiwgcHJpdi0+ZG9tYWluLT5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlpZiAocmV0ID09IC1FSVdDT01NSVQpIHsKLQkJcHJpdi0+Y2hhbm5lbCA9IGNoYW47Ci0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRlJFUSAtIGNoICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkJIGNoYW4pOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWZyZXEtPm0gPSBwcml2LT5jaGFubmVsOwotCWZyZXEtPmUgPSAwOwotCi0JaWYgKHByaXYtPmNoYW5uZWwpCi0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJFUSAtIGZyZXEgJWxkIHggMTBlJWQiLAotCQkJIG5ldGRldi0+bmFtZSwgY2hhbm5lbF9mcmVxdWVuY3lbcHJpdi0+Y2hhbm5lbCAtIDFdLCA2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJFUSAtIGNoICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkgcHJpdi0+Y2hhbm5lbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdNT0RFIC0gJWQiLCBuZXRkZXYtPm5hbWUsICptb2RlKTsKLQotCWlmICgoKm1vZGUgIT0gSVdfTU9ERV9BREhPQykgJiYgKCptb2RlICE9IElXX01PREVfSU5GUkEpICYmCi0JICAgICgqbW9kZSAhPSBJV19NT0RFX01PTklUT1IpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByaXYtPml3X21vZGUgPSAqbW9kZTsKLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKQotCQlwcml2LT5wbV9tb2RlID0gQVQ3Nl9QTV9PRkY7Ci0KLQlyZXR1cm4gLUVJV0NPTU1JVDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JKm1vZGUgPSBwcml2LT5pd19tb2RlOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdNT0RFIC0gJWQiLCBuZXRkZXYtPm5hbWUsICptb2RlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCS8qIGluc3BpcmVkIGJ5IGF0bWVsLmMgKi8KLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOwotCWludCBpOwotCi0JZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7Ci0JbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7Ci0KLQkvKiBUT0RPOiByYW5nZS0+dGhyb3VnaHB1dCA9IHh4eHh4eDsgKi8KLQotCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKLQlyYW5nZS0+bWF4X253aWQgPSAweDAwMDA7Ci0KLQkvKiB0aGlzIGRyaXZlciBkb2Vzbid0IG1haW50YWluIHNlbnNpdGl2aXR5IGluZm9ybWF0aW9uICovCi0JcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMDsKLQotCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOwotCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDEwMDsKLQlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOwotCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCi0JcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA1MDsKLQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSA1MDsKLQlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwotCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCi0JcmFuZ2UtPmJpdHJhdGVbMF0gPSAxMDAwMDAwOwotCXJhbmdlLT5iaXRyYXRlWzFdID0gMjAwMDAwMDsKLQlyYW5nZS0+Yml0cmF0ZVsyXSA9IDU1MDAwMDA7Ci0JcmFuZ2UtPmJpdHJhdGVbM10gPSAxMTAwMDAwMDsKLQlyYW5nZS0+bnVtX2JpdHJhdGVzID0gNDsKLQotCXJhbmdlLT5taW5fcnRzID0gMDsKLQlyYW5nZS0+bWF4X3J0cyA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCi0JcmFuZ2UtPm1pbl9mcmFnID0gTUlOX0ZSQUdfVEhSRVNIT0xEOwotCXJhbmdlLT5tYXhfZnJhZyA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQotCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7Ci0JcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX09OOwotCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfQUxMX1I7Ci0KLQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IFdFUF9TTUFMTF9LRVlfTEVOOwotCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gV0VQX0xBUkdFX0tFWV9MRU47Ci0JcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7Ci0JcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBXRVBfS0VZUzsKLQotCS8qIGJvdGggV0wtMjQwVSBhbmQgTGlua3N5cyBXVVNCMTEgdjIuNiBzcGVjaWZ5IDE1IGRCbSBhcyBvdXRwdXQgcG93ZXIKLQkgICAtIHRha2UgdGhpcyBmb3IgYWxsIChpZ25vcmUgYW50ZW5uYSBnYWlucykgKi8KLQlyYW5nZS0+dHhwb3dlclswXSA9IDE1OwotCXJhbmdlLT5udW1fdHhwb3dlciA9IDE7Ci0JcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKLQotCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IFdJUkVMRVNTX0VYVDsKLQlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQotCS8qIHNhbWUgYXMgdGhlIHZhbHVlcyB1c2VkIGluIGF0bWVsLmMgKi8KLQlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yX3RpbWVfZmxhZ3MgPSAwOwotCXJhbmdlLT5taW5fcmV0cnkgPSAxOwotCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7Ci0KLQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gTlVNX0NIQU5ORUxTOwotCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgewotCQkvKiB0ZXN0IGlmIGNoYW5uZWwgbWFwIGJpdCBpcyByYWlzZWQgKi8KLQkJaWYgKHByaXYtPmRvbWFpbi0+Y2hhbm5lbF9tYXAgJiAoMHgxIDw8IGkpKSB7Ci0JCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSArPSAxOwotCi0JCQlyYW5nZS0+ZnJlcVtpXS5pID0gaSArIDE7Ci0JCQlyYW5nZS0+ZnJlcVtpXS5tID0gY2hhbm5lbF9mcmVxdWVuY3lbaV0gKiAxMDAwMDA7Ci0JCQlyYW5nZS0+ZnJlcVtpXS5lID0gMTsJLyogZnJlcSAqIDEwXjEgKi8KLQkJfQotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXUkFOR0UiLCBuZXRkZXYtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9zcHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1NQWSAtIG51bWJlciBvZiBhZGRyZXNzZXMgJWQiLAotCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfc2V0X3NweShwcml2LT5uZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3NweShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfZ2V0X3NweShwcml2LT5uZXRkZXYsIGluZm8sCi0JCQkJICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdTUFkgLSBudW1iZXIgb2YgYWRkcmVzc2VzICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgZGF0YS0+bGVuZ3RoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF90aHJzcHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXVEhSU1BZIC0gbnVtYmVyIG9mIGFkZHJlc3NlcyAlZCkiLAotCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfc2V0X3RocnNweShuZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgICAgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3RocnNweShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfZ2V0X3RocnNweShuZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgICAgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdUSFJTUFkgLSBudW1iZXIgb2YgYWRkcmVzc2VzICVkKSIsCi0JCSBuZXRkZXYtPm5hbWUsIGRhdGEtPmxlbmd0aCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdBUCAtIHdhcC9ic3NpZCAlcyIsIG5ldGRldi0+bmFtZSwKLQkJIG1hYzJzdHIoYXBfYWRkci0+c2FfZGF0YSkpOwotCi0JLyogaWYgdGhlIGluY29taW5nIGFkZHJlc3MgPT0gZmY6ZmY6ZmY6ZmY6ZmY6ZmYsIHRoZSB1c2VyIGhhcwotCSAgIGNob3NlbiBhbnkgb3IgYXV0byBBUCBwcmVmZXJlbmNlICovCi0JaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFwX2FkZHItPnNhX2RhdGEpCi0JICAgIHx8IGlzX3plcm9fZXRoZXJfYWRkcihhcF9hZGRyLT5zYV9kYXRhKSkKLQkJcHJpdi0+d2FudGVkX2Jzc2lkX3ZhbGlkID0gMDsKLQllbHNlIHsKLQkJLyogdXNlciB3YW50cyB0byBzZXQgYSBwcmVmZXJyZWQgQVAgYWRkcmVzcyAqLwotCQlwcml2LT53YW50ZWRfYnNzaWRfdmFsaWQgPSAxOwotCQltZW1jcHkocHJpdi0+d2FudGVkX2Jzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0JfQotCi0JcmV0dXJuIC1FSVdDT01NSVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsIHByaXYtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV0FQIC0gd2FwL2Jzc2lkICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgbWFjMnN0cihhcF9hZGRyLT5zYV9kYXRhKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1NDQU4iLCBuZXRkZXYtPm5hbWUpOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcHJpdi0+bXR4KSkKLQkJcmV0dXJuIC1FSU5UUjsKLQotCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCXJldCA9IC1FTkVURE9XTjsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIGphbDogd2UgZG9uJ3QgYWxsb3cgIml3bGlzdCBldGhYIHNjYW4iIHdoaWxlIHdlIGFyZQotCSAgIGluIG1vbml0b3IgbW9kZSAqLwotCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBEaXNjYXJkIG9sZCBzY2FuIHJlc3VsdHMgKi8KLQlpZiAoKGppZmZpZXMgLSBwcml2LT5sYXN0X3NjYW4pID4gKDIwICogSFopKQotCQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9JRExFOwotCXByaXYtPmxhc3Rfc2NhbiA9IGppZmZpZXM7Ci0KLQkvKiBJbml0aWF0ZSBhIHNjYW4gY29tbWFuZCAqLwotCWlmIChwcml2LT5zY2FuX3N0YXRlID09IFNDQU5fSU5fUFJPR1JFU1MpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHJpdi0+c2Nhbl9zdGF0ZSA9IFNDQU5fSU5fUFJPR1JFU1M7Ci0KLQlhdDc2X3F1aWVzY2UocHJpdik7Ci0KLQkvKiBUcnkgdG8gZG8gcGFzc2l2ZSBvciBhY3RpdmUgc2NhbiBpZiBXRSBhc2tzIGFzLiAqLwotCWlmICh3cnF1LT5kYXRhLmxlbmd0aAotCSAgICAmJiB3cnF1LT5kYXRhLmxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IGl3X3NjYW5fcmVxKSkgewotCQlzdHJ1Y3QgaXdfc2Nhbl9yZXEgKnJlcSA9IChzdHJ1Y3QgaXdfc2Nhbl9yZXEgKilleHRyYTsKLQotCQlpZiAocmVxLT5zY2FuX3R5cGUgPT0gSVdfU0NBTl9UWVBFX1BBU1NJVkUpCi0JCQlwcml2LT5zY2FuX21vZGUgPSBTQ0FOX1RZUEVfUEFTU0lWRTsKLQkJZWxzZSBpZiAocmVxLT5zY2FuX3R5cGUgPT0gSVdfU0NBTl9UWVBFX0FDVElWRSkKLQkJCXByaXYtPnNjYW5fbW9kZSA9IFNDQU5fVFlQRV9BQ1RJVkU7Ci0KLQkJLyogU2FuaXR5IGNoZWNrIHZhbHVlcz8gKi8KLQkJaWYgKHJlcS0+bWluX2NoYW5uZWxfdGltZSA+IDApCi0JCQlwcml2LT5zY2FuX21pbl90aW1lID0gcmVxLT5taW5fY2hhbm5lbF90aW1lOwotCi0JCWlmIChyZXEtPm1heF9jaGFubmVsX3RpbWUgPiAwKQotCQkJcHJpdi0+c2Nhbl9tYXhfdGltZSA9IHJlcS0+bWF4X2NoYW5uZWxfdGltZTsKLQl9Ci0KLQkvKiBjaGFuZ2UgdG8gc2Nhbm5pbmcgc3RhdGUgKi8KLQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX3N0YXJ0X3NjYW4pOwotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0ciwgKm5wdHI7Ci0Jc3RydWN0IGJzc19pbmZvICpjdXJyX2JzczsKLQlzdHJ1Y3QgaXdfZXZlbnQgKml3ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd19ldmVudCksIEdGUF9LRVJORUwpOwotCWNoYXIgKmN1cnJfdmFsLCAqY3Vycl9wb3MgPSBleHRyYTsKLQlpbnQgaTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXU0NBTiIsIG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoIWl3ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAocHJpdi0+c2Nhbl9zdGF0ZSAhPSBTQ0FOX0NPTVBMRVRFRCkgewotCQkvKiBzY2FuIG5vdCB5ZXQgZmluaXNoZWQgKi8KLQkJa2ZyZWUoaXdlKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobHB0ciwgbnB0ciwgJnByaXYtPmJzc19saXN0KSB7Ci0JCWN1cnJfYnNzID0gbGlzdF9lbnRyeShscHRyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV0FQOwotCQlpd2UtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCW1lbWNweShpd2UtPnUuYXBfYWRkci5zYV9kYXRhLCBjdXJyX2Jzcy0+YnNzaWQsIDYpOwotCQljdXJyX3BvcyA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJfcG9zLAotCQkJCQkJZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCBpd2UsCi0JCQkJCQlJV19FVl9BRERSX0xFTik7Ci0KLQkJaXdlLT51LmRhdGEubGVuZ3RoID0gY3Vycl9ic3MtPnNzaWRfbGVuOwotCQlpd2UtPmNtZCA9IFNJT0NHSVdFU1NJRDsKLQkJaXdlLT51LmRhdGEuZmxhZ3MgPSAxOwotCi0JCWN1cnJfcG9zID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3Vycl9wb3MsCi0JCQkJCQlleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsIGl3ZSwKLQkJCQkJCWN1cnJfYnNzLT5zc2lkKTsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdNT0RFOwotCQlpd2UtPnUubW9kZSA9IChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA/Ci0JCSAgICBJV19NT0RFX0FESE9DIDoKLQkJICAgIChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpID8KLQkJICAgIElXX01PREVfTUFTVEVSIDogSVdfTU9ERV9BVVRPOwotCQkvKiBJV19NT0RFX0FVVE8gPSAwIHdoaWNoIEkgdGhvdWdodCBpcwotCQkgKiB0aGUgbW9zdCBsb2dpY2FsIHZhbHVlIHRvIHJldHVybiBpbiB0aGlzIGNhc2UgKi8KLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJSVdfRVZfVUlOVF9MRU4pOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV0ZSRVE7Ci0JCWl3ZS0+dS5mcmVxLm0gPSBjdXJyX2Jzcy0+Y2hhbm5lbDsKLQkJaXdlLT51LmZyZXEuZSA9IDA7Ci0JCWN1cnJfcG9zID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3Vycl9wb3MsCi0JCQkJCQlleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsIGl3ZSwKLQkJCQkJCUlXX0VWX0ZSRVFfTEVOKTsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdFTkNPREU7Ci0JCWlmIChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQotCQkJaXdlLT51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKLQkJZWxzZQotCQkJaXdlLT51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0KLQkJaXdlLT51LmRhdGEubGVuZ3RoID0gMDsKLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJTlVMTCk7Ci0KLQkJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLwotCQlpd2UtPmNtZCA9IElXRVZRVUFMOwotCQlpd2UtPnUucXVhbC5ub2lzZSA9IDA7Ci0JCWl3ZS0+dS5xdWFsLnVwZGF0ZWQgPQotCQkgICAgSVdfUVVBTF9OT0lTRV9JTlZBTElEIHwgSVdfUVVBTF9MRVZFTF9VUERBVEVEOwotCQlpd2UtPnUucXVhbC5sZXZlbCA9IChjdXJyX2Jzcy0+cnNzaSAqIDEwMCAvIDQyKTsKLQkJaWYgKGl3ZS0+dS5xdWFsLmxldmVsID4gMTAwKQotCQkJaXdlLT51LnF1YWwubGV2ZWwgPSAxMDA7Ci0JCWlmIChhdDc2X2lzX2ludGVyc2lsKHByaXYtPmJvYXJkX3R5cGUpKQotCQkJaXdlLT51LnF1YWwucXVhbCA9IGN1cnJfYnNzLT5saW5rX3F1YWw7Ci0JCWVsc2UgewotCQkJaXdlLT51LnF1YWwucXVhbCA9IDA7Ci0JCQlpd2UtPnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfUVVBTF9JTlZBTElEOwotCQl9Ci0JCS8qIEFkZCBuZXcgdmFsdWUgdG8gZXZlbnQgKi8KLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJSVdfRVZfUVVBTF9MRU4pOwotCi0JCS8qIFJhdGU6IHN0dWZmaW5nIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBldmVudCByZXF1aXJlcwotCQkgKiBhIGJpdCBtb3JlIG9mIG1hZ2ljIC0gSmVhbiBJSSAqLwotCQljdXJyX3ZhbCA9IGN1cnJfcG9zICsgSVdfRVZfTENQX0xFTjsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdSQVRFOwotCQkvKiBUaG9zZSB0d28gZmxhZ3MgYXJlIGlnbm9yZWQuLi4gKi8KLQkJaXdlLT51LmJpdHJhdGUuZml4ZWQgPSAwOwotCQlpd2UtPnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7Ci0JCS8qIE1heCA4IHZhbHVlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgY3Vycl9ic3MtPnJhdGVzX2xlbjsgaSsrKSB7Ci0JCQkvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLwotCQkJaXdlLT51LmJpdHJhdGUudmFsdWUgPQotCQkJICAgICgoY3Vycl9ic3MtPnJhdGVzW2ldICYgMHg3ZikgKiA1MDAwMDApOwotCQkJLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLwotCQkJY3Vycl92YWwgPSBpd2Vfc3RyZWFtX2FkZF92YWx1ZShpbmZvLCBjdXJyX3BvcywKLQkJCQkJCQljdXJyX3ZhbCwKLQkJCQkJCQlleHRyYSArCi0JCQkJCQkJSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJCUlXX0VWX1BBUkFNX0xFTik7Ci0JCX0KLQotCQkvKiBDaGVjayBpZiB3ZSBhZGRlZCBhbnkgZXZlbnQgKi8KLQkJaWYgKChjdXJyX3ZhbCAtIGN1cnJfcG9zKSA+IElXX0VWX0xDUF9MRU4pCi0JCQljdXJyX3BvcyA9IGN1cnJfdmFsOwotCi0JCS8qIG1vcmUgaW5mb3JtYXRpb24gbWF5IGJlIHNlbnQgYmFjayB1c2luZyBJV0VDVVNUT00gKi8KLQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlkYXRhLT5sZW5ndGggPSAoY3Vycl9wb3MgLSBleHRyYSk7Ci0JZGF0YS0+ZmxhZ3MgPSAwOwotCi0Ja2ZyZWUoaXdlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRVNTSUQgLSAlcyIsIG5ldGRldi0+bmFtZSwgZXh0cmEpOwotCi0JaWYgKGRhdGEtPmZsYWdzKSB7Ci0JCW1lbWNweShwcml2LT5lc3NpZCwgZXh0cmEsIGRhdGEtPmxlbmd0aCk7Ci0JCXByaXYtPmVzc2lkX3NpemUgPSBkYXRhLT5sZW5ndGg7Ci0JfSBlbHNlCi0JCXByaXYtPmVzc2lkX3NpemUgPSAwOwkvKiBVc2UgYW55IFNTSUQgKi8KLQotCXJldHVybiAtRUlXQ09NTUlUOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JaWYgKHByaXYtPmVzc2lkX3NpemUpIHsKLQkJLyogbm90IHRoZSBBTlkgc3NpZCBpbiBwcml2LT5lc3NpZCAqLwotCQlkYXRhLT5mbGFncyA9IDE7Ci0JCWRhdGEtPmxlbmd0aCA9IHByaXYtPmVzc2lkX3NpemU7Ci0JCW1lbWNweShleHRyYSwgcHJpdi0+ZXNzaWQsIGRhdGEtPmxlbmd0aCk7Ci0JfSBlbHNlIHsKLQkJLyogdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQgKi8KLQkJaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEICYmIHByaXYtPmN1cnJfYnNzKSB7Ci0JCQkvKiByZXBvcnQgdGhlIFNTSUQgd2UgaGF2ZSBmb3VuZCAqLwotCQkJZGF0YS0+ZmxhZ3MgPSAxOwotCQkJZGF0YS0+bGVuZ3RoID0gcHJpdi0+Y3Vycl9ic3MtPnNzaWRfbGVuOwotCQkJbWVtY3B5KGV4dHJhLCBwcml2LT5jdXJyX2Jzcy0+c3NpZCwgZGF0YS0+bGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlcG9ydCBBTlkgYmFjayAqLwotCQkJZGF0YS0+ZmxhZ3MgPSAwOwotCQkJZGF0YS0+bGVuZ3RoID0gMDsKLQkJfQotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRVNTSUQgLSAlLipzIiwgbmV0ZGV2LT5uYW1lLAotCQkgZGF0YS0+bGVuZ3RoLCBleHRyYSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X3BhcmFtICpiaXRyYXRlLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXUkFURSAtICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkgYml0cmF0ZS0+dmFsdWUpOwotCi0Jc3dpdGNoIChiaXRyYXRlLT52YWx1ZSkgewotCWNhc2UgLTE6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfQVVUTzsKLQkJYnJlYWs7CQkvKiBhdXRvIHJhdGUgKi8KLQljYXNlIDEwMDAwMDA6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfMU1CSVQ7Ci0JCWJyZWFrOwotCWNhc2UgMjAwMDAwMDoKLQkJcHJpdi0+dHhyYXRlID0gVFhfUkFURV8yTUJJVDsKLQkJYnJlYWs7Ci0JY2FzZSA1NTAwMDAwOgotCQlwcml2LT50eHJhdGUgPSBUWF9SQVRFXzVfNU1CSVQ7Ci0JCWJyZWFrOwotCWNhc2UgMTEwMDAwMDA6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfMTFNQklUOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHN0cnVjdCBpd19wYXJhbSAqYml0cmF0ZSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHByaXYtPnR4cmF0ZSkgewotCQkvKiByZXR1cm4gbWF4IHJhdGUgaWYgUkFURV9BVVRPICovCi0JY2FzZSBUWF9SQVRFX0FVVE86Ci0JCWJpdHJhdGUtPnZhbHVlID0gMTEwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgVFhfUkFURV8xTUJJVDoKLQkJYml0cmF0ZS0+dmFsdWUgPSAxMDAwMDAwOwotCQlicmVhazsKLQljYXNlIFRYX1JBVEVfMk1CSVQ6Ci0JCWJpdHJhdGUtPnZhbHVlID0gMjAwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9SQVRFXzVfNU1CSVQ6Ci0JCWJpdHJhdGUtPnZhbHVlID0gNTUwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9SQVRFXzExTUJJVDoKLQkJYml0cmF0ZS0+dmFsdWUgPSAxMTAwMDAwMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQliaXRyYXRlLT5maXhlZCA9IChwcml2LT50eHJhdGUgIT0gVFhfUkFURV9BVVRPKTsKLQliaXRyYXRlLT5kaXNhYmxlZCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1JBVEUgLSAlZCIsIG5ldGRldi0+bmFtZSwKLQkJIGJpdHJhdGUtPnZhbHVlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQlpbnQgcnRociA9IHJ0cy0+dmFsdWU7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1JUUyAtIHZhbHVlICVkIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgcnRzLT52YWx1ZSwgKHJ0cy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlpZiAocnRzLT5kaXNhYmxlZCkKLQkJcnRociA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCi0JaWYgKChydGhyIDwgMCkgfHwgKHJ0aHIgPiBNQVhfUlRTX1RIUkVTSE9MRCkpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZQotCQlwcml2LT5ydHNfdGhyZXNob2xkID0gcnRocjsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCXJ0cy0+dmFsdWUgPSBwcml2LT5ydHNfdGhyZXNob2xkOwotCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA+PSBNQVhfUlRTX1RIUkVTSE9MRCk7Ci0JcnRzLT5maXhlZCA9IDE7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1JUUyAtIHZhbHVlICVkIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgcnRzLT52YWx1ZSwgKHJ0cy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQlpbnQgZnRociA9IGZyYWctPnZhbHVlOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdGUkFHIC0gdmFsdWUgJWQsIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgZnJhZy0+dmFsdWUsCi0JCSAoZnJhZy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlpZiAoZnJhZy0+ZGlzYWJsZWQpCi0JCWZ0aHIgPSBNQVhfRlJBR19USFJFU0hPTEQ7Ci0KLQlpZiAoKGZ0aHIgPCBNSU5fRlJBR19USFJFU0hPTEQpIHx8IChmdGhyID4gTUFYX0ZSQUdfVEhSRVNIT0xEKSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPmZyYWdfdGhyZXNob2xkID0gZnRociAmIH4weDE7CS8qIGdldCBhbiBldmVuIHZhbHVlICovCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JZnJhZy0+dmFsdWUgPSBwcml2LT5mcmFnX3RocmVzaG9sZDsKLQlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA+PSBNQVhfRlJBR19USFJFU0hPTEQpOwotCWZyYWctPmZpeGVkID0gMTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJBRyAtIHZhbHVlICVkLCBkaXNhYmxlZCAlcyIsCi0JCSBuZXRkZXYtPm5hbWUsIGZyYWctPnZhbHVlLAotCQkgKGZyYWctPmRpc2FibGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF90eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcG93ZXIsIGNoYXIgKmV4dHJhKQotewotCXBvd2VyLT52YWx1ZSA9IDE1OwotCXBvd2VyLT5maXhlZCA9IDE7CS8qIE5vIHBvd2VyIGNvbnRyb2wgKi8KLQlwb3dlci0+ZGlzYWJsZWQgPSAwOwotCXBvd2VyLT5mbGFncyA9IElXX1RYUE9XX0RCTTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXVFhQT1cgLSB0eHBvdyAlZCBkQm0iLCBuZXRkZXYtPm5hbWUsCi0JCSBwb3dlci0+dmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGphbDogc2hvcnQgcmV0cnkgaXMgaGFuZGxlZCBieSB0aGUgZmlybXdhcmUgKGF0IGxlYXN0IDAuOTAueCksCi0gICB3aGlsZSBsb25nIHJldHJ5IGlzIG5vdCAoPykgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcmV0cnksIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdSRVRSWSBkaXNhYmxlZCAlZCBmbGFncyAweCV4IHZhbCAlZCIsCi0JCSBuZXRkZXYtPm5hbWUsIHJldHJ5LT5kaXNhYmxlZCwgcmV0cnktPmZsYWdzLCByZXRyeS0+dmFsdWUpOwotCi0JaWYgKCFyZXRyeS0+ZGlzYWJsZWQgJiYgKHJldHJ5LT5mbGFncyAmIElXX1JFVFJZX0xJTUlUKSkgewotCQlpZiAoKHJldHJ5LT5mbGFncyAmIElXX1JFVFJZX01JTikgfHwKLQkJICAgICEocmV0cnktPmZsYWdzICYgSVdfUkVUUllfTUFYKSkKLQkJCXByaXYtPnNob3J0X3JldHJ5X2xpbWl0ID0gcmV0cnktPnZhbHVlOwotCQllbHNlCi0JCQlyZXQgPSAtRUlOVkFMOwotCX0gZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogQWRhcHRlZCAocmlwcGVkKSBmcm9tIGF0bWVsLmMgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcmV0cnksIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdSRVRSWSIsIG5ldGRldi0+bmFtZSk7Ci0KLQlyZXRyeS0+ZGlzYWJsZWQgPSAwOwkvKiBDYW4ndCBiZSBkaXNhYmxlZCAqLwotCXJldHJ5LT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJldHJ5LT52YWx1ZSA9IHByaXYtPnNob3J0X3JldHJ5X2xpbWl0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBpbmRleCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQlpbnQgbGVuID0gZW5jb2RpbmctPmxlbmd0aDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRU5DT0RFIC0gZW5jLmZsYWdzICUwOHggIgotCQkgInBvaW50ZXIgJXAgbGVuICVkIiwgbmV0ZGV2LT5uYW1lLCBlbmNvZGluZy0+ZmxhZ3MsCi0JCSBlbmNvZGluZy0+cG9pbnRlciwgZW5jb2RpbmctPmxlbmd0aCk7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DU0lXRU5DT0RFIC0gb2xkIHdlcHN0YXRlOiBlbmFibGVkICVzIGtleV9pZCAlZCAiCi0JCSAiYXV0aF9tb2RlICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgKHByaXYtPndlcF9lbmFibGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIsIHByaXYtPndlcF9rZXlfaWQsCi0JCSAocHJpdi0+YXV0aF9tb2RlID09Ci0JCSAgV0xBTl9BVVRIX1NIQVJFRF9LRVkpID8gInJlc3RyaWN0ZWQiIDogIm9wZW4iKTsKLQotCS8qIHRha2UgdGhlIG9sZCBkZWZhdWx0IGtleSBpZiBpbmRleCBpcyBpbnZhbGlkICovCi0JaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBXRVBfS0VZUykpCi0JCWluZGV4ID0gcHJpdi0+d2VwX2tleV9pZDsKLQotCWlmIChsZW4gPiAwKSB7Ci0JCWlmIChsZW4gPiBXRVBfTEFSR0VfS0VZX0xFTikKLQkJCWxlbiA9IFdFUF9MQVJHRV9LRVlfTEVOOwotCi0JCW1lbXNldChwcml2LT53ZXBfa2V5c1tpbmRleF0sIDAsIFdFUF9LRVlfTEVOKTsKLQkJbWVtY3B5KHByaXYtPndlcF9rZXlzW2luZGV4XSwgZXh0cmEsIGxlbik7Ci0JCXByaXYtPndlcF9rZXlzX2xlbltpbmRleF0gPSAobGVuIDw9IFdFUF9TTUFMTF9LRVlfTEVOKSA/Ci0JCSAgICBXRVBfU01BTExfS0VZX0xFTiA6IFdFUF9MQVJHRV9LRVlfTEVOOwotCQlwcml2LT53ZXBfZW5hYmxlZCA9IDE7Ci0JfQotCi0JcHJpdi0+d2VwX2tleV9pZCA9IGluZGV4OwotCXByaXYtPndlcF9lbmFibGVkID0gKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpID09IDApOwotCi0JaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQotCQlwcml2LT5hdXRoX21vZGUgPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKLQlpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCi0JCXByaXYtPmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9PUEVOOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DU0lXRU5DT0RFIC0gbmV3IHdlcHN0YXRlOiBlbmFibGVkICVzIGtleV9pZCAlZCAiCi0JCSAia2V5X2xlbiAlZCBhdXRoX21vZGUgJXMiLCBuZXRkZXYtPm5hbWUsCi0JCSAocHJpdi0+d2VwX2VuYWJsZWQpID8gInRydWUiIDogImZhbHNlIiwgcHJpdi0+d2VwX2tleV9pZCArIDEsCi0JCSBwcml2LT53ZXBfa2V5c19sZW5bcHJpdi0+d2VwX2tleV9pZF0sCi0JCSAocHJpdi0+YXV0aF9tb2RlID09Ci0JCSAgV0xBTl9BVVRIX1NIQVJFRF9LRVkpID8gInJlc3RyaWN0ZWQiIDogIm9wZW4iKTsKLQotCXJldHVybiAtRUlXQ09NTUlUOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgaW5kZXggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0KLQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IFdFUF9LRVlTKSkKLQkJaW5kZXggPSBwcml2LT53ZXBfa2V5X2lkOwotCi0JZW5jb2RpbmctPmZsYWdzID0KLQkgICAgKHByaXYtPmF1dGhfbW9kZSA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSkgPwotCSAgICBJV19FTkNPREVfUkVTVFJJQ1RFRCA6IElXX0VOQ09ERV9PUEVOOwotCi0JaWYgKCFwcml2LT53ZXBfZW5hYmxlZCkKLQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQotCWlmIChlbmNvZGluZy0+cG9pbnRlcikgewotCQllbmNvZGluZy0+bGVuZ3RoID0gcHJpdi0+d2VwX2tleXNfbGVuW2luZGV4XTsKLQotCQltZW1jcHkoZXh0cmEsIHByaXYtPndlcF9rZXlzW2luZGV4XSwgcHJpdi0+d2VwX2tleXNfbGVuW2luZGV4XSk7Ci0KLQkJZW5jb2RpbmctPmZsYWdzIHw9IChpbmRleCArIDEpOwotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRU5DT0RFIC0gZW5jLmZsYWdzICUwOHggIgotCQkgInBvaW50ZXIgJXAgbGVuICVkIiwgbmV0ZGV2LT5uYW1lLCBlbmNvZGluZy0+ZmxhZ3MsCi0JCSBlbmNvZGluZy0+cG9pbnRlciwgZW5jb2RpbmctPmxlbmd0aCk7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DR0lXRU5DT0RFIC0gd2Vwc3RhdGU6IGVuYWJsZWQgJXMga2V5X2lkICVkICIKLQkJICJrZXlfbGVuICVkIGF1dGhfbW9kZSAlcyIsIG5ldGRldi0+bmFtZSwKLQkJIChwcml2LT53ZXBfZW5hYmxlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiLCBwcml2LT53ZXBfa2V5X2lkICsgMSwKLQkJIHByaXYtPndlcF9rZXlzX2xlbltwcml2LT53ZXBfa2V5X2lkXSwKLQkJIChwcml2LT5hdXRoX21vZGUgPT0KLQkJICBXTEFOX0FVVEhfU0hBUkVEX0tFWSkgPyAicmVzdHJpY3RlZCIgOiAib3BlbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcHJxLCBjaGFyICpleHRyYSkKLXsKLQlpbnQgZXJyID0gLUVJV0NPTU1JVDsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwKLQkJICIlczogU0lPQ1NJV1BPV0VSIC0gZGlzYWJsZWQgJXMgZmxhZ3MgMHgleCB2YWx1ZSAweCV4IiwKLQkJIG5ldGRldi0+bmFtZSwgKHBycS0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIiwgcHJxLT5mbGFncywKLQkJIHBycS0+dmFsdWUpOwotCi0JaWYgKHBycS0+ZGlzYWJsZWQpCi0JCXByaXYtPnBtX21vZGUgPSBBVDc2X1BNX09GRjsKLQllbHNlIHsKLQkJc3dpdGNoIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgewotCQljYXNlIElXX1BPV0VSX0FMTF9SOgotCQljYXNlIElXX1BPV0VSX09OOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfUEVSSU9EKQotCQkJcHJpdi0+cG1fcGVyaW9kID0gcHJxLT52YWx1ZTsKLQotCQlpZiAocHJxLT5mbGFncyAmIElXX1BPV0VSX1RJTUVPVVQpIHsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJpdi0+cG1fbW9kZSA9IEFUNzZfUE1fT047Ci0JfQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnBvd2VyLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCXBvd2VyLT5kaXNhYmxlZCA9IChwcml2LT5wbV9tb2RlID09IEFUNzZfUE1fT0ZGKTsKLQlpZiAoIXBvd2VyLT5kaXNhYmxlZCkgewotCQlwb3dlci0+ZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9BTExfUjsKLQkJcG93ZXItPnZhbHVlID0gcHJpdi0+cG1fcGVyaW9kOwotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXUE9XRVIgLSAlcyBmbGFncyAweCV4IHZhbHVlIDB4JXgiLAotCQkgbmV0ZGV2LT5uYW1lLCBwb3dlci0+ZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAotCQkgcG93ZXItPmZsYWdzLCBwb3dlci0+dmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQcml2YXRlIElPQ1RMUwotICovCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X3Nob3J0X3ByZWFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwKLQkJCQkgICAgICBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgdmFsID0gKigoaW50ICopbmFtZSk7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfU0hPUlRfUFJFQU1CTEUsICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgdmFsKTsKLQotCWlmICh2YWwgPCBQUkVBTUJMRV9UWVBFX0xPTkcgfHwgdmFsID4gUFJFQU1CTEVfVFlQRV9BVVRPKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJcHJpdi0+cHJlYW1ibGVfdHlwZSA9IHZhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19nZXRfc2hvcnRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0Jc25wcmludGYod3JxdS0+bmFtZSwgc2l6ZW9mKHdycXUtPm5hbWUpLCAiJXMgKCVkKSIsCi0JCSBwcmVhbWJsZXNbcHJpdi0+cHJlYW1ibGVfdHlwZV0sIHByaXYtPnByZWFtYmxlX3R5cGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X2RlYnVnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0JY2hhciAqcHRyOwotCXUzMiB2YWw7Ci0KLQlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgewotCQl2YWwgPSBzaW1wbGVfc3RydG9sKGV4dHJhLCAmcHRyLCAwKTsKLQotCQlpZiAocHRyID09IGV4dHJhKQotCQkJdmFsID0gREJHX0RFRkFVTFRTOwotCi0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBBVDc2X1NFVF9ERUJVRyBpbnB1dCAlZDogJXMgLT4gMHgleCIsCi0JCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgsIGV4dHJhLCB2YWwpOwotCX0gZWxzZQotCQl2YWwgPSBEQkdfREVGQVVMVFM7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfREVCVUcsIG9sZCAweCV4LCBuZXcgMHgleCIsCi0JCSBuZXRkZXYtPm5hbWUsIGF0NzZfZGVidWcsIHZhbCk7Ci0KLQkvKiBqYWw6IHNvbWUgbW9yZSBvdXRwdXQgdG8gcGluIGRvd24gbG9ja3VwcyAqLwotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBuZXRpZiBydW5uaW5nICVkIHF1ZXVlX3N0b3BwZWQgJWQgIgotCQkgImNhcnJpZXJfb2sgJWQiLCBuZXRkZXYtPm5hbWUsIG5ldGlmX3J1bm5pbmcobmV0ZGV2KSwKLQkJIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSwgbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKTsKLQotCWF0NzZfZGVidWcgPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2dldF9kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzbnByaW50Zih3cnF1LT5uYW1lLCBzaXplb2Yod3JxdS0+bmFtZSksICIweCUwOHgiLCBhdDc2X2RlYnVnKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X3NldF9wb3dlcnNhdmVfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsCi0JCQkJICAgICAgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHZhbCA9ICooKGludCAqKW5hbWUpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLCAlZCAoJXMpIiwKLQkJIG5ldGRldi0+bmFtZSwgdmFsLAotCQkgdmFsID09IEFUNzZfUE1fT0ZGID8gImFjdGl2ZSIgOiB2YWwgPT0gQVQ3Nl9QTV9PTiA/ICJzYXZlIiA6Ci0JCSB2YWwgPT0gQVQ3Nl9QTV9TTUFSVCA/ICJzbWFydCBzYXZlIiA6ICI8aW52YWxpZD4iKTsKLQlpZiAodmFsIDwgQVQ3Nl9QTV9PRkYgfHwgdmFsID4gQVQ3Nl9QTV9TTUFSVCkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPnBtX21vZGUgPSB2YWw7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfZ2V0X3Bvd2Vyc2F2ZV9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgKnBhcmFtID0gKGludCAqKWV4dHJhOwotCi0JcGFyYW1bMF0gPSBwcml2LT5wbV9tb2RlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X3NjYW5fdGltZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsCi0JCQkJICBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgbWludCA9ICooKGludCAqKW5hbWUpOwotCWludCBtYXh0ID0gKigoaW50ICopbmFtZSArIDEpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1NDQU5fVElNRVMgLSBtaW4gJWQgbWF4ICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgbWludCwgbWF4dCk7Ci0JaWYgKG1pbnQgPD0gMCB8fCBtYXh0IDw9IDAgfHwgbWludCA+IG1heHQpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZSB7Ci0JCXByaXYtPnNjYW5fbWluX3RpbWUgPSBtaW50OwotCQlwcml2LT5zY2FuX21heF90aW1lID0gbWF4dDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfZ2V0X3NjYW5fdGltZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgKnBhcmFtID0gKGludCAqKWV4dHJhOwotCi0JcGFyYW1bMF0gPSBwcml2LT5zY2FuX21pbl90aW1lOwotCXBhcmFtWzFdID0gcHJpdi0+c2Nhbl9tYXhfdGltZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X3NldF9zY2FuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwKLQkJCQkgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHZhbCA9ICooKGludCAqKW5hbWUpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1NDQU5fTU9ERSAtIG1vZGUgJXMiLAotCQkgbmV0ZGV2LT5uYW1lLCAodmFsID0gU0NBTl9UWVBFX0FDVElWRSkgPyAiYWN0aXZlIiA6Ci0JCSAodmFsID0gU0NBTl9UWVBFX1BBU1NJVkUpID8gInBhc3NpdmUiIDogIjxpbnZhbGlkPiIpOwotCi0JaWYgKHZhbCAhPSBTQ0FOX1RZUEVfQUNUSVZFICYmIHZhbCAhPSBTQ0FOX1RZUEVfUEFTU0lWRSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPnNjYW5fbW9kZSA9IHZhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19nZXRfc2Nhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCAqcGFyYW0gPSAoaW50ICopZXh0cmE7Ci0KLQlwYXJhbVswXSA9IHByaXYtPnNjYW5fbW9kZTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBBVDc2X1NFVF9IQU5ETEVSKGgsIGYpIFtoIC0gU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIGYKLQotLyogU3RhbmRhcmQgd2lyZWxlc3MgaGFuZGxlcnMgKi8KLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIGF0NzZfaGFuZGxlcnNbXSA9IHsKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdDT01NSVQsIGF0NzZfaXdfaGFuZGxlcl9jb21taXQpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV05BTUUsIGF0NzZfaXdfaGFuZGxlcl9nZXRfbmFtZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXRlJFUSwgYXQ3Nl9pd19oYW5kbGVyX3NldF9mcmVxKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdGUkVRLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X2ZyZXEpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV01PREUsIGF0NzZfaXdfaGFuZGxlcl9zZXRfbW9kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXTU9ERSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9tb2RlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSQU5HRSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYW5nZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXU1BZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3NweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXU1BZLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3NweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXVEhSU1BZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3RocnNweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXVEhSU1BZLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3RocnNweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXQVAsIGF0NzZfaXdfaGFuZGxlcl9zZXRfd2FwKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdBUCwgYXQ3Nl9pd19oYW5kbGVyX2dldF93YXApLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1NDQU4sIGF0NzZfaXdfaGFuZGxlcl9zZXRfc2NhbiksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXU0NBTiwgYXQ3Nl9pd19oYW5kbGVyX2dldF9zY2FuKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdFU1NJRCwgYXQ3Nl9pd19oYW5kbGVyX3NldF9lc3NpZCksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXRVNTSUQsIGF0NzZfaXdfaGFuZGxlcl9nZXRfZXNzaWQpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1JBVEUsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcmF0ZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXUkFURSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYXRlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdSVFMsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcnRzKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSVFMsIGF0NzZfaXdfaGFuZGxlcl9nZXRfcnRzKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdGUkFHLCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyYWcpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV0ZSQUcsIGF0NzZfaXdfaGFuZGxlcl9nZXRfZnJhZyksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXVFhQT1csIGF0NzZfaXdfaGFuZGxlcl9nZXRfdHhwb3cpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1JFVFJZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3JldHJ5KSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSRVRSWSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yZXRyeSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXRU5DT0RFLCBhdDc2X2l3X2hhbmRsZXJfc2V0X2VuY29kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXRU5DT0RFLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X2VuY29kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXUE9XRVIsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcG93ZXIpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV1BPV0VSLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3Bvd2VyKQotfTsKLQotI2RlZmluZSBBVDc2X1NFVF9QUklWKGgsIGYpIFtoIC0gU0lPQ0lXRklSU1RQUklWXSA9IChpd19oYW5kbGVyKSBmCi0KLS8qIFByaXZhdGUgd2lyZWxlc3MgaGFuZGxlcnMgKi8KLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIGF0NzZfcHJpdl9oYW5kbGVyc1tdID0gewotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9TRVRfU0hPUlRfUFJFQU1CTEUsIGF0NzZfaXdfc2V0X3Nob3J0X3ByZWFtYmxlKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfR0VUX1NIT1JUX1BSRUFNQkxFLCBhdDc2X2l3X2dldF9zaG9ydF9wcmVhbWJsZSksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X1NFVF9ERUJVRywgYXQ3Nl9pd19zZXRfZGVidWcpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9HRVRfREVCVUcsIGF0NzZfaXdfZ2V0X2RlYnVnKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLCBhdDc2X2l3X3NldF9wb3dlcnNhdmVfbW9kZSksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERSwgYXQ3Nl9pd19nZXRfcG93ZXJzYXZlX21vZGUpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9TRVRfU0NBTl9USU1FUywgYXQ3Nl9pd19zZXRfc2Nhbl90aW1lcyksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X0dFVF9TQ0FOX1RJTUVTLCBhdDc2X2l3X2dldF9zY2FuX3RpbWVzKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfU0VUX1NDQU5fTU9ERSwgYXQ3Nl9pd19zZXRfc2Nhbl9tb2RlKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfR0VUX1NDQU5fTU9ERSwgYXQ3Nl9pd19nZXRfc2Nhbl9tb2RlKSwKLX07Ci0KLS8qIE5hbWVzIGFuZCBhcmd1bWVudHMgb2YgcHJpdmF0ZSB3aXJlbGVzcyBoYW5kbGVycyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgYXQ3Nl9wcml2X2FyZ3NbXSA9IHsKLQkvKiAwIC0gbG9uZywgMSAtIHNob3J0ICovCi0Je0FUNzZfU0VUX1NIT1JUX1BSRUFNQkxFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wcmVhbWJsZSJ9LAotCi0Je0FUNzZfR0VUX1NIT1JUX1BSRUFNQkxFLAotCSAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEwLCAiZ2V0X3ByZWFtYmxlIn0sCi0KLQkvKiB3ZSBtdXN0IHBhc3MgdGhlIG5ldyBkZWJ1ZyBtYXNrIGFzIGEgc3RyaW5nLCBiZWNhdXNlIGl3cHJpdiBjYW5ub3QKLQkgKiBwYXJzZSBoZXggbnVtYmVycyBzdGFydGluZyB3aXRoIDB4IDotKCAgKi8KLQl7QVQ3Nl9TRVRfREVCVUcsCi0JIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAsIDAsICJzZXRfZGVidWcifSwKLQotCXtBVDc2X0dFVF9ERUJVRywKLQkgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxMCwgImdldF9kZWJ1ZyJ9LAotCi0JLyogMSAtIGFjdGl2ZSwgMiAtIHBvd2VyIHNhdmUsIDMgLSBzbWFydCBwb3dlciBzYXZlICovCi0Je0FUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wb3dlcnNhdmUifSwKLQotCXtBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERSwKLQkgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRfcG93ZXJzYXZlIn0sCi0KLQkvKiBtaW5fY2hhbm5lbF90aW1lLCBtYXhfY2hhbm5lbF90aW1lICovCi0Je0FUNzZfU0VUX1NDQU5fVElNRVMsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLCAwLCAic2V0X3NjYW5fdGltZXMifSwKLQotCXtBVDc2X0dFVF9TQ0FOX1RJTUVTLAotCSAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwgImdldF9zY2FuX3RpbWVzIn0sCi0KLQkvKiAwIC0gYWN0aXZlLCAxIC0gcGFzc2l2ZSBzY2FuICovCi0Je0FUNzZfU0VUX1NDQU5fTU9ERSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfc2Nhbl9tb2RlIn0sCi0KLQl7QVQ3Nl9HRVRfU0NBTl9NT0RFLAotCSAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9zY2FuX21vZGUifSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgYXQ3Nl9oYW5kbGVyX2RlZiA9IHsKLQkubnVtX3N0YW5kYXJkID0gQVJSQVlfU0laRShhdDc2X2hhbmRsZXJzKSwKLQkubnVtX3ByaXZhdGUgPSBBUlJBWV9TSVpFKGF0NzZfcHJpdl9oYW5kbGVycyksCi0JLm51bV9wcml2YXRlX2FyZ3MgPSBBUlJBWV9TSVpFKGF0NzZfcHJpdl9hcmdzKSwKLQkuc3RhbmRhcmQgPSBhdDc2X2hhbmRsZXJzLAotCS5wcml2YXRlID0gYXQ3Nl9wcml2X2hhbmRsZXJzLAotCS5wcml2YXRlX2FyZ3MgPSBhdDc2X3ByaXZfYXJncywKLQkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gYXQ3Nl9nZXRfd2lyZWxlc3Nfc3RhdHMsCi19OwotCi1zdGF0aWMgY29uc3QgdTggc25hcHNpZ1tdID0geyAweGFhLCAweGFhLCAweDAzIH07Ci0KLS8qIFJGQyAxMDQyIGVuY2Fwc3VsYXRlcyBFdGhlcm5ldCBmcmFtZXMgaW4gODAyLjIgU05BUCAoMHhhYSwgMHhhYSwgMHgwMykgd2l0aAotICogYSBTTkFQIE9JRCBvZiAwICgweDAwLCAweDAwLCAweDAwKSAqLwotc3RhdGljIGNvbnN0IHU4IHJmYzEwNDJzaWdbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi1zdGF0aWMgaW50IGF0NzZfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHdsZW47Ci0JaW50IHN1Ym1pdF9sZW47Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXIgPSBwcml2LT5idWxrX291dF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmk4MDJfMTFfaGRyID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdHhfYnVmZmVyLT5wYWNrZXQ7Ci0JdTggKnBheWxvYWQgPSBpODAyXzExX2hkci0+cGF5bG9hZDsKLQlzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCi0JaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBjYWxsZWQgd2hpbGUgbmV0ZGV2IGlzIHN0b3BwZWRcbiIsCi0JCSAgICAgICBuZXRkZXYtPm5hbWUsIF9fZnVuY19fKTsKLQkJLyogc2tpcCB0aGlzIHBhY2tldCAqLwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChwcml2LT50eF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgY2FsbGVkIHdoaWxlIHR4IHVyYiBpcyBwZW5kaW5nXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXyk7Ci0JCS8qIHNraXAgdGhpcyBwYWNrZXQgKi8KLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogc2tiIHRvbyBzaG9ydCAoJWQpXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgc2tiLT5sZW4pOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwotCX0KLQotCWF0NzZfbGVkdHJpZ190eF9hY3Rpdml0eSgpOwkvKiB0ZWxsIGxlZHRyaWdnZXIgd2Ugc2VuZCBhIHBhY2tldCAqLwotCi0JLyogd2UgY2FuIGdldCByaWQgb2YgbWVtY3B5IGlmIHdlIHNldCBuZXRkZXYtPmhhcmRfaGVhZGVyX2xlbiB0bwotCSAgIHJlc2VydmUgZW5vdWdoIHNwYWNlLCBidXQgd2Ugd291bGQgbmVlZCB0byBrZWVwIHRoZSBza2IgYXJvdW5kICovCi0KLQlpZiAobnRvaHMoZWgtPmhfcHJvdG8pIDw9IEVUSF9EQVRBX0xFTikgewotCQkvKiB0aGlzIGlzIGEgODAyLjMgcGFja2V0ICovCi0JCWlmIChza2ItPmxlbiA+PSBFVEhfSExFTiArIHNpemVvZihyZmMxMDQyc2lnKQotCQkgICAgJiYgc2tiLT5kYXRhW0VUSF9ITEVOXSA9PSByZmMxMDQyc2lnWzBdCi0JCSAgICAmJiBza2ItPmRhdGFbRVRIX0hMRU4gKyAxXSA9PSByZmMxMDQyc2lnWzFdKSB7Ci0JCQkvKiBoaWdoZXIgbGF5ZXIgZGVsaXZlcmVkIFNOQVAgaGVhZGVyIC0ga2VlcCBpdCAqLwotCQkJbWVtY3B5KHBheWxvYWQsIHNrYi0+ZGF0YSArIEVUSF9ITEVOLAotCQkJICAgICAgIHNrYi0+bGVuIC0gRVRIX0hMRU4pOwotCQkJd2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU4gKyBza2ItPmxlbiAtIEVUSF9ITEVOOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJvcHBpbmcgbm9uLVNOQVAgODAyLjIgcGFja2V0ICIKLQkJCSAgICAgICAiKERTQVAgMHglMDJ4IFNTQVAgMHglMDJ4IGNudHJsIDB4JTAyeClcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBza2ItPmRhdGFbRVRIX0hMRU5dLAotCQkJICAgICAgIHNrYi0+ZGF0YVtFVEhfSExFTiArIDFdLAotCQkJICAgICAgIHNrYi0+ZGF0YVtFVEhfSExFTiArIDJdKTsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogYWRkIFJGQyAxMDQyIGhlYWRlciBpbiBmcm9udCAqLwotCQltZW1jcHkocGF5bG9hZCwgcmZjMTA0MnNpZywgc2l6ZW9mKHJmYzEwNDJzaWcpKTsKLQkJbWVtY3B5KHBheWxvYWQgKyBzaXplb2YocmZjMTA0MnNpZyksICZlaC0+aF9wcm90bywKLQkJICAgICAgIHNrYi0+bGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGV0aGhkciwgaF9wcm90bykpOwotCQl3bGVuID0gSUVFRTgwMjExXzNBRERSX0xFTiArIHNpemVvZihyZmMxMDQyc2lnKSArIHNrYi0+bGVuIC0KLQkJICAgIG9mZnNldG9mKHN0cnVjdCBldGhoZHIsIGhfcHJvdG8pOwotCX0KLQotCS8qIG1ha2Ugd2lyZWxlc3MgaGVhZGVyICovCi0JaTgwMl8xMV9oZHItPmZyYW1lX2N0bCA9Ci0JICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKLQkJCShwcml2LT53ZXBfZW5hYmxlZCA/IElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCA6IDApIHwKLQkJCShwcml2LT5pd19tb2RlID09Ci0JCQkgSVdfTU9ERV9JTkZSQSA/IElFRUU4MDIxMV9GQ1RMX1RPRFMgOiAwKSk7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjEsIGVoLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMiwgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjMsIHByaXYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JfSBlbHNlIGlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMSwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMiwgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjMsIGVoLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQl9Ci0KLQlpODAyXzExX2hkci0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigwKTsKLQlpODAyXzExX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KDApOwotCi0JLyogc2V0dXAgJ0F0bWVsJyBoZWFkZXIgKi8KLQl0eF9idWZmZXItPndsZW5ndGggPSBjcHVfdG9fbGUxNih3bGVuKTsKLQl0eF9idWZmZXItPnR4X3JhdGUgPSBwcml2LT50eHJhdGU7Ci0JLyogZm9yIGJyb2FkY2FzdCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIHRoZSBmaXJtd2FyZSAwLjEwMC54Ci0JICAgc2VlbXMgdG8gY2hvb3NlIHRoZSBoaWdoZXN0IHJhdGUgc2V0IHdpdGggQ01EX1NUQVJUVVAgaW4KLQkgICBiYXNpY19yYXRlX3NldCByZXBsYWNpbmcgdGhpcyB2YWx1ZSAqLwotCi0JbWVtc2V0KHR4X2J1ZmZlci0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eF9idWZmZXItPnJlc2VydmVkKSk7Ci0KLQl0eF9idWZmZXItPnBhZGRpbmcgPSBhdDc2X2NhbGNfcGFkZGluZyh3bGVuKTsKLQlzdWJtaXRfbGVuID0gd2xlbiArIEFUNzZfVFhfSERSTEVOICsgdHhfYnVmZmVyLT5wYWRkaW5nOwotCi0JYXQ3Nl9kYmcoREJHX1RYX0RBVEFfQ09OVEVOVCwgIiVzIHNrYi0+ZGF0YSAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIGhleDJzdHIoc2tiLT5kYXRhLCAzMikpOwotCWF0NzZfZGJnKERCR19UWF9EQVRBLCAiJXMgdHg6IHdsZW4gMHgleCBwYWQgMHgleCByYXRlICVkIGhkciAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBsZTE2X3RvX2NwdSh0eF9idWZmZXItPndsZW5ndGgpLAotCQkgdHhfYnVmZmVyLT5wYWRkaW5nLCB0eF9idWZmZXItPnR4X3JhdGUsCi0JCSBoZXgyc3RyKGk4MDJfMTFfaGRyLCBzaXplb2YoKmk4MDJfMTFfaGRyKSkpOwotCWF0NzZfZGJnKERCR19UWF9EQVRBX0NPTlRFTlQsICIlcyBwYXlsb2FkICVzIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgaGV4MnN0cihwYXlsb2FkLCA0OCkpOwotCi0JLyogc2VuZCBzdHVmZiAqLwotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQotCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwgdHhfYnVmZmVyLAotCQkJICBzdWJtaXRfbGVuLCBhdDc2X3R4X2NhbGxiYWNrLCBwcml2KTsKLQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXQpIHsKLQkJc3RhdHMtPnR4X2Vycm9ycysrOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiB0eCBzdWJtaXQgdXJiOiAlZFxuIiwKLQkJICAgICAgIG5ldGRldi0+bmFtZSwgcmV0KTsKLQkJaWYgKHJldCA9PSAtRUlOVkFMKQotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiAtRUlOVkFMOiB0eCB1cmIgJXAgaGNwcml2ICVwIGNvbXBsZXRlICVwXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcHJpdi0+dHhfdXJiLAotCQkJICAgICAgIHByaXYtPnR4X3VyYi0+aGNwcml2LCBwcml2LT50eF91cmItPmNvbXBsZXRlKTsKLQl9IGVsc2UgewotCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuOwotCWRldl93YXJuKCZuZXRkZXYtPmRldiwgInR4IHRpbWVvdXQuIik7Ci0KLQl1c2JfdW5saW5rX3VyYihwcml2LT50eF91cmIpOwotCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOwotfQotCiBzdGF0aWMgaW50IGF0NzZfc3VibWl0X3J4X3VyYihzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQogewogCWludCByZXQ7CkBAIC0zMjU2LDcgKzEzMjcsNyBAQAogCiAJaWYgKCFwcml2LT5yeF91cmIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IHByaXYtPnJ4X3VyYiBpcyBOVUxMXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0zMjY0LDcgKzEzMzUsNyBAQAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIpKTsKIAkJaWYgKCFza2IpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBhbGxvY2F0ZSByeCBza2J1ZmZcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKKwkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMzI4NCwxMTAgKzEzNTUsMTggQEAKIAkJCQkgInVzYl9zdWJtaXRfdXJiIHJldHVybmVkIC1FTk9ERVYiKTsKIAkJZWxzZQogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcngsIHVzYl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAl9CiAKIGV4aXQ6CiAJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9ERVYpCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBzdWJtaXQgcnggdXJiIC0gcGxlYXNlIHVubG9hZCB0aGUgIgogCQkgICAgICAgImRyaXZlciBhbmQvb3IgcG93ZXIgY3ljbGUgdGhlIGRldmljZVxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdDc2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQotCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXMoKTogZW50cnkiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdHgpKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JLyogaWYgbmV0ZGV2LT5kZXZfYWRkciAhPSBwcml2LT5tYWNfYWRkciB3ZSBtdXN0Ci0JICAgc2V0IHRoZSBtYWMgYWRkcmVzcyBpbiB0aGUgZGV2aWNlICEgKi8KLQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIsIHByaXYtPm1hY19hZGRyKSkgewotCQlpZiAoYXQ3Nl9hZGRfbWFjX2FkZHJlc3MocHJpdiwgbmV0ZGV2LT5kZXZfYWRkcikgPj0gMCkKLQkJCWF0NzZfZGJnKERCR19QUk9HUkVTUywgIiVzOiBzZXQgbmV3IE1BQyBhZGRyICVzIiwKLQkJCQkgbmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG5ldGRldi0+ZGV2X2FkZHIpKTsKLQl9Ci0KLQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9JRExFOwotCXByaXYtPmxhc3Rfc2NhbiA9IGppZmZpZXM7Ci0KLQlyZXQgPSBhdDc2X3N1Ym1pdF9yeF91cmIocHJpdik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3Blbjogc3VibWl0X3J4X3VyYiBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfcmVzdGFydCwgMCk7Ci0KLQlhdDc2X2RiZyhEQkdfUFJPQ19FTlRSWSwgIiVzKCk6IGVuZCIsIF9fZnVuY19fKTsKLWVycm9yOgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhdDc2X2RiZyhEQkdfREVWU1RBUlQsICIlczogRU5URVIiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdHgpKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JYXQ3Nl9xdWllc2NlKHByaXYpOwotCi0JaWYgKCFwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7Ci0JCS8qIFdlIGFyZSBjYWxsZWQgYnkgImlmY29uZmlnIGV0aFggZG93biIsIG5vdCBiZWNhdXNlIHRoZQotCQkgKiBkZXZpY2UgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlLiAqLwotCQlhdDc2X3NldF9yYWRpbyhwcml2LCAwKTsKLQotCQkvKiBXZSB1bmxpbmsgcnhfdXJiIGJlY2F1c2UgYXQ3Nl9vcGVuKCkgcmUtc3VibWl0cyBpdC4KLQkJICogSWYgdW5wbHVnZ2VkLCBhdDc2X2RlbGV0ZV9kZXZpY2UoKSB0YWtlcyBjYXJlIG9mIGl0LiAqLwotCQl1c2Jfa2lsbF91cmIocHJpdi0+cnhfdXJiKTsKLQl9Ci0KLQkvKiBmcmVlIHRoZSBic3NfbGlzdCAqLwotCWF0NzZfZnJlZV9ic3NfbGlzdChwcml2KTsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlhdDc2X2RiZyhEQkdfREVWU1RBUlQsICIlczogRVhJVCIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKLQlzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSSVZFUl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwotCi0JdXNiX21ha2VfcGF0aChwcml2LT51ZGV2LCBpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Ci0KLQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlZC4lZC4lZC0lZCIsCi0JCSBwcml2LT5md192ZXJzaW9uLm1ham9yLCBwcml2LT5md192ZXJzaW9uLm1pbm9yLAotCQkgcHJpdi0+ZndfdmVyc2lvbi5wYXRjaCwgcHJpdi0+ZndfdmVyc2lvbi5idWlsZCk7Ci19Ci0KLXN0YXRpYyB1MzIgYXQ3Nl9ldGh0b29sX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuIHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF0NzZfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9kcnZpbmZvID0gYXQ3Nl9ldGh0b29sX2dldF9kcnZpbmZvLAotCS5nZXRfbGluayA9IGF0NzZfZXRodG9vbF9nZXRfbGluaywKLX07Ci0KIC8qIERvd25sb2FkIGV4dGVybmFsIGZpcm13YXJlICovCiBzdGF0aWMgaW50IGF0NzZfbG9hZF9leHRlcm5hbF9mdyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IGZ3ZW50cnkgKmZ3ZSkKIHsKQEAgLTM0ODQsNDA2ICsxNDYzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfbWF0Y2hfZXNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JLyogY29tbW9uIGNyaXRlcmlhIGZvciBib3RoIG1vZGkgKi8KLQotCWludCByZXQgPSAocHJpdi0+ZXNzaWRfc2l6ZSA9PSAwIC8qIEFOWSBzc2lkICovICB8fAotCQkgICAocHJpdi0+ZXNzaWRfc2l6ZSA9PSBwdHItPnNzaWRfbGVuICYmCi0JCSAgICAhbWVtY21wKHByaXYtPmVzc2lkLCBwdHItPnNzaWQsIHB0ci0+c3NpZF9sZW4pKSk7Ci0JaWYgKCFyZXQpCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzIGJzcyB0YWJsZSBlbnRyeSAlcDogZXNzaWQgZGlkbid0IG1hdGNoIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHB0cik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9tYXRjaF9tb2RlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBic3NfaW5mbyAqcHRyKQotewotCWludCByZXQ7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQlyZXQgPSBwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKLQllbHNlCi0JCXJldCA9IHB0ci0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9FU1M7Ci0JaWYgKCFyZXQpCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzIGJzcyB0YWJsZSBlbnRyeSAlcDogbW9kZSBkaWRuJ3QgbWF0Y2giLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfbWF0Y2hfcmF0ZXMoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHRyLT5yYXRlc19sZW47IGkrKykgewotCQl1OCByYXRlID0gcHRyLT5yYXRlc1tpXTsKLQotCQlpZiAoIShyYXRlICYgMHg4MCkpCi0JCQljb250aW51ZTsKLQotCQkvKiB0aGlzIGlzIGEgYmFzaWMgcmF0ZSB3ZSBoYXZlIHRvIHN1cHBvcnQKLQkJICAgKHNlZSBJRUVFODAyLjExLCBjaC4gNy4zLjIuMikgKi8KLQkJaWYgKHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1swXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1sxXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1syXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1szXSkpIHsKLQkJCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkJICIlczogYnNzIHRhYmxlIGVudHJ5ICVwOiBiYXNpYyByYXRlICUwMnggbm90ICIKLQkJCQkgInN1cHBvcnRlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyLCByYXRlKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyogaWYgd2UgdXNlIHNob3J0IHByZWFtYmxlLCB0aGUgYnNzIG11c3Qgc3VwcG9ydCBpdCAqLwotCWlmIChwcml2LT5wcmVhbWJsZV90eXBlID09IFBSRUFNQkxFX1RZUEVfU0hPUlQgJiYKLQkgICAgIShwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpKSB7Ci0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzOiAlcCBkb2VzIG5vdCBzdXBwb3J0IHNob3J0IHByZWFtYmxlIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHB0cik7Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9tYXRjaF93ZXAoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaWYgKCFwcml2LT53ZXBfZW5hYmxlZCAmJiBwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQkvKiB3ZSBoYXZlIGRpc2FibGVkIFdFUCwgYnV0IHRoZSBCU1Mgc2lnbmFscyBwcml2YWN5ICovCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzOiBic3MgdGFibGUgZW50cnkgJXA6IHJlcXVpcmVzIGVuY3J5cHRpb24iLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIG90aGVyd2lzZSBpZiB0aGUgQlNTIGRvZXMgbm90IHNpZ25hbCBwcml2YWN5IGl0IG1heSB3ZWxsCi0JICAgYWNjZXB0IGVuY3J5cHRlZCBwYWNrZXRzIGZyb20gdXMgLi4uICovCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGF0NzZfbWF0Y2hfYnNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaWYgKCFwcml2LT53YW50ZWRfYnNzaWRfdmFsaWQgfHwKLQkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwdHItPmJzc2lkLCBwcml2LT53YW50ZWRfYnNzaWQpKQotCQlyZXR1cm4gMTsKLQotCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCSAiJXM6IHJlcXVlc3RlZCBic3NpZCAtICVzIGRvZXMgbm90IG1hdGNoIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwcml2LT53YW50ZWRfYnNzaWQpKTsKLQlhdDc2X2RiZyhEQkdfQlNTX01BVENILAotCQkgIiAgICAgIEFQIGJzc2lkIC0gJXMgb2YgYnNzIHRhYmxlIGVudHJ5ICVwIiwKLQkJIG1hYzJzdHIocHRyLT5ic3NpZCksIHB0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogYXQ3Nl9tYXRjaF9ic3MgLSB0cnkgdG8gZmluZCBhIG1hdGNoaW5nIGJzcyBpbiBwcml2LT5ic3MKLSAqCi0gKiBsYXN0IC0gbGFzdCBic3MgdHJpZWQKLSAqCi0gKiBsYXN0ID09IE5VTEwgc2lnbmFscyBhIG5ldyByb3VuZCBzdGFydGluZyB3aXRoIHByaXYtPmJzc19saXN0Lm5leHQKLSAqIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGFuIGFjcXVpcmVkIHByaXYtPmJzc19saXN0X3NwaW5sb2NrCi0gKiBvdGhlcndpc2UgdGhlIHRpbWVvdXQgb24gYnNzIG1heSByZW1vdmUgdGhlIG5ld2x5IGNob3NlbiBlbnRyeQotICovCi1zdGF0aWMgc3RydWN0IGJzc19pbmZvICphdDc2X21hdGNoX2JzcyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgYnNzX2luZm8gKmxhc3QpCi17Ci0Jc3RydWN0IGJzc19pbmZvICpwdHIgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmN1cnI7Ci0KLQljdXJyID0gbGFzdCA/IGxhc3QtPmxpc3QubmV4dCA6IHByaXYtPmJzc19saXN0Lm5leHQ7Ci0Jd2hpbGUgKGN1cnIgIT0gJnByaXYtPmJzc19saXN0KSB7Ci0JCXB0ciA9IGxpc3RfZW50cnkoY3Vyciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KTsKLQkJaWYgKGF0NzZfbWF0Y2hfZXNzaWQocHJpdiwgcHRyKSAmJiBhdDc2X21hdGNoX21vZGUocHJpdiwgcHRyKQotCQkgICAgJiYgYXQ3Nl9tYXRjaF93ZXAocHJpdiwgcHRyKSAmJiBhdDc2X21hdGNoX3JhdGVzKHByaXYsIHB0cikKLQkJICAgICYmIGF0NzZfbWF0Y2hfYnNzaWQocHJpdiwgcHRyKSkKLQkJCWJyZWFrOwotCQljdXJyID0gY3Vyci0+bmV4dDsKLQl9Ci0KLQlpZiAoY3VyciA9PSAmcHJpdi0+YnNzX2xpc3QpCi0JCXB0ciA9IE5VTEw7Ci0JLyogb3RoZXJ3aXNlIHB0ciBwb2ludHMgdG8gdGhlIHN0cnVjdCBic3NfaW5mbyB3ZSBoYXZlIGNob3NlbiAqLwotCi0JYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwgIiVzICVzOiByZXR1cm5lZCAlcCIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIF9fZnVuY19fLCBwdHIpOwotCXJldHVybiBwdHI7Ci19Ci0KLS8qIFN0YXJ0IGpvaW5pbmcgYSBtYXRjaGluZyBCU1MsIG9yIGNyZWF0ZSBvd24gSUJTUyAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX2pvaW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19qb2luKTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0pPSU5JTkcpOwotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0pPSU5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHNlY3VyZSB0aGUgYWNjZXNzIHRvIHByaXYtPmN1cnJfYnNzICEgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQlwcml2LT5jdXJyX2JzcyA9IGF0NzZfbWF0Y2hfYnNzKHByaXYsIHByaXYtPmN1cnJfYnNzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKCFwcml2LT5jdXJyX2JzcykgewotCQkvKiBoZXJlIHdlIGhhdmVuJ3QgZm91bmQgYSBtYXRjaGluZyAoaSlic3MgLi4uICovCi0JCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfT1dOX0lCU1MpOwotCQkJYXQ3Nl9zdGFydF9pYnNzKHByaXYpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCS8qIGhhdmVuJ3QgZm91bmQgYSBtYXRjaGluZyBCU1MgaW4gaW5mcmEgbW9kZSAtIHRyeSBhZ2FpbiAqLwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zdGFydF9zY2FuKTsKLQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IGF0NzZfam9pbl9ic3MocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGpvaW5fYnNzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX0pPSU4pOwotCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgewotCQlpZiAocmV0ICE9IENNRF9TVEFUVVNfVElNRV9PVVQpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBqb2luX2JzcyBjb21wbGV0ZWQgd2l0aCAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBqb2luX2JzcyBzc2lkICVzIHRpbWVkIG91dFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCQkgICAgICAgbWFjMnN0cihwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKTsKLQotCQkvKiByZXRyeSBuZXh0IEJTUyBpbW1lZGlhdGVseSAqLwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogaGVyZSB3ZSBoYXZlIGpvaW5lZCB0aGUgKEkpQlNTICovCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgewotCQlzdHJ1Y3QgYnNzX2luZm8gKmJwdHIgPSBwcml2LT5jdXJyX2JzczsKLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19DT05ORUNURUQpOwotCQkvKiBnZXQgRVNTSUQsIEJTU0lEIGFuZCBjaGFubmVsIGZvciBwcml2LT5jdXJyX2JzcyAqLwotCQlwcml2LT5lc3NpZF9zaXplID0gYnB0ci0+c3NpZF9sZW47Ci0JCW1lbWNweShwcml2LT5lc3NpZCwgYnB0ci0+c3NpZCwgYnB0ci0+c3NpZF9sZW4pOwotCQltZW1jcHkocHJpdi0+YnNzaWQsIGJwdHItPmJzc2lkLCBFVEhfQUxFTik7Ci0JCXByaXYtPmNoYW5uZWwgPSBicHRyLT5jaGFubmVsOwotCQlhdDc2X2l3ZXZlbnRfYnNzX2Nvbm5lY3QocHJpdi0+bmV0ZGV2LCBicHRyLT5ic3NpZCk7Ci0JCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+bmV0ZGV2KTsKLQkJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQkJLyoganVzdCB0byBiZSBzdXJlICovCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCk7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLQl9IGVsc2UgewotCQkvKiBzZW5kIGF1dGggcmVxICovCi0JCXByaXYtPnJldHJpZXMgPSBBVVRIX1JFVFJJRVM7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfQVVUSCk7Ci0JCWF0NzZfYXV0aF9yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MsIDEsIE5VTEwpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCwgQVVUSF9USU1FT1VUKTsKLQl9Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBSZWFwIHNjYW4gcmVzdWx0cyAqLwotc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19nZXRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaW50IHN0YXR1czsKLQlpbnQgcmV0OwotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfZ2V0X3NjYW4ud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCXN0YXR1cyA9IGF0NzZfZ2V0X2NtZF9zdGF0dXMocHJpdi0+dWRldiwgQ01EX1NDQU4pOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBhdDc2X2dldF9jbWRfc3RhdHVzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJc3RhdHVzID0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUzsKLQkJLyogSU5GTzogSG9wZSBpdCB3YXMgYSBvbmUgb2ZmIGVycm9yIC0gaWYgbm90LCBzY2FubmluZwotCQkgICBmdXJ0aGVyIGRvd24gdGhlIGxpbmUgYW5kIHN0b3AgdGhpcyBjeWNsZSAqLwotCX0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsCi0JCSAiJXMgJXM6IGdvdCBjbWRfc3RhdHVzICVkIChzdGF0ZSAlcywgbmVlZF9hbnkgJWQpIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHN0YXR1cywKLQkJIG1hY19zdGF0ZXNbcHJpdi0+bWFjX3N0YXRlXSwgcHJpdi0+c2Nhbl9uZWVkX2FueSk7Ci0KLQlpZiAoc3RhdHVzICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKLQkJaWYgKChzdGF0dXMgIT0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUykgJiYKLQkJICAgIChzdGF0dXMgIT0gQ01EX1NUQVRVU19JRExFKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBCYWQgc2NhbiBzdGF0dXM6ICVzXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sCi0JCQkgICAgICAgYXQ3Nl9nZXRfY21kX3N0YXR1c19zdHJpbmcoc3RhdHVzKSk7Ci0KLQkJLyogdGhlIGZpcnN0IGNtZCBzdGF0dXMgYWZ0ZXIgc2NhbiBzdGFydCBpcyBhbHdheXMgYSBJRExFIC0+Ci0JCSAgIHN0YXJ0IHRoZSB0aW1lciB0byBwb2xsIGFnYWluIHVudGlsIENPTVBMRVRFRCAqLwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgZm9yICVkIHRpY2tzIiwKLQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIFNDQU5fUE9MTF9JTlRFUlZBTCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfZ2V0X3NjYW4sCi0JCQkJICAgICAgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChhdDc2X2RlYnVnICYgREJHX0JTU19UQUJMRSkKLQkJYXQ3Nl9kdW1wX2Jzc190YWJsZShwcml2KTsKLQotCWlmIChwcml2LT5zY2FuX25lZWRfYW55KSB7Ci0JCXJldCA9IGF0NzZfc3RhcnRfc2Nhbihwcml2LCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6ICVzOiBzdGFydF9zY2FuIChBTlkpIGZhaWxlZCB3aXRoICVkXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHJldCk7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciBmb3IgJWQgdGlja3MiLCBfX2Z1bmNfXywKLQkJCSBfX0xJTkVfXywgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2NhbiwKLQkJCQkgICAgICBTQ0FOX1BPTExfSU5URVJWQUwpOwotCQlwcml2LT5zY2FuX25lZWRfYW55ID0gMDsKLQl9IGVsc2UgewotCQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9DT01QTEVURUQ7Ci0JCS8qIHJlcG9ydCB0aGUgZW5kIG9mIHNjYW4gdG8gdXNlciBzcGFjZSAqLwotCQlhdDc2X2l3ZXZlbnRfc2Nhbl9jb21wbGV0ZShwcml2LT5uZXRkZXYpOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0pPSU5JTkcpOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KLS8qIEhhbmRsZSBsb3NzIG9mIGJlYWNvbnMgZnJvbSB0aGUgQVAgKi8KLXN0YXRpYyB2b2lkIGF0NzZfZHdvcmtfYmVhY29uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIGR3b3JrX2JlYWNvbi53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQ09OTkVDVEVEIHx8IHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkKLQkJZ290byBleGl0OwotCi0JLyogV2UgaGF2ZW4ndCByZWNlaXZlZCBhbnkgYmVhY29ucyBmcm9tIG91dCBBUCBmb3IgQkVBQ09OX1RJTUVPVVQgKi8KLQlwcmludGsoS0VSTl9JTkZPICIlczogbG9zdCBiZWFjb24gYnNzaWQgJXNcbiIsCi0JICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKTsKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRkZXYpOwotCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfU0NBTk5JTkcpOwotCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfc3RhcnRfc2Nhbik7Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBIYW5kbGUgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgdGltZW91dCAqLwotc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19hdXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIGR3b3JrX2F1dGgud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKQotCQlnb3RvIGV4aXQ7Ci0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICIlczogYXV0aGVudGljYXRpb24gcmVzcG9uc2UgdGltZW91dCIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUpOwotCi0JaWYgKHByaXYtPnJldHJpZXMtLSA+PSAwKSB7Ci0JCWF0NzZfYXV0aF9yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MsIDEsIE5VTEwpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCwgQVVUSF9USU1FT1VUKTsKLQl9IGVsc2UgewotCQkvKiB0cnkgdG8gZ2V0IG5leHQgbWF0Y2hpbmcgQlNTICovCi0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JfQotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLX0KLQotLyogSGFuZGxlIGFzc29jaWF0aW9uIHJlc3BvbnNlIHRpbWVvdXQgKi8KLXN0YXRpYyB2b2lkIGF0NzZfZHdvcmtfYXNzb2Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfYXNzb2Mud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BU1NPQyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MpCi0JCWdvdG8gZXhpdDsKLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywgIiVzOiBhc3NvY2lhdGlvbiByZXNwb25zZSB0aW1lb3V0IiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0KLQlpZiAocHJpdi0+cmV0cmllcy0tID49IDApIHsKLQkJYXQ3Nl9hc3NvY19yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MsIEFTU09DX1RJTUVPVVQpOwotCX0gZWxzZSB7Ci0JCS8qIHRyeSB0byBnZXQgbmV4dCBtYXRjaGluZyBCU1MgKi8KLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQl9Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBSZWFkIG5ldyBic3NpZCBpbiBhZC1ob2MgbW9kZSAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX25ld19ic3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19uZXdfYnNzKTsKLQlpbnQgcmV0OwotCXN0cnVjdCBtaWJfbWFjX21nbXQgbWFjX21nbXQ7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9NQUNfTUdNVCwgJm1hY19tZ210LAotCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX21nbXQpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywgImlic3NfY2hhbmdlID0gMHglMngiLCBtYWNfbWdtdC5pYnNzX2NoYW5nZSk7Ci0JbWVtY3B5KHByaXYtPmJzc2lkLCBtYWNfbWdtdC5jdXJyZW50X2Jzc2lkLCBFVEhfQUxFTik7Ci0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAidXNpbmcgQlNTSUQgJXMiLCBtYWMyc3RyKHByaXYtPmJzc2lkKSk7Ci0KLQlhdDc2X2l3ZXZlbnRfYnNzX2Nvbm5lY3QocHJpdi0+bmV0ZGV2LCBwcml2LT5ic3NpZCk7Ci0KLQlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX01HTVQ7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMTsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfbWdtdCwgaWJzc19jaGFuZ2UpOwotCXByaXYtPm1pYl9idWYuZGF0YS5ieXRlID0gMDsKLQotCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7Ci0JaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKGlic3MgY2hhbmdlIG9rKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLX0KLQogc3RhdGljIGludCBhdDc2X3N0YXJ0dXBfZGV2aWNlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGF0NzZfY2FyZF9jb25maWcgKmNjZmcgPSAmcHJpdi0+Y2FyZF9jb25maWc7CkBAIC0zODkxLDE0ICsxNDcwLDE0IEBACiAKIAlhdDc2X2RiZyhEQkdfUEFSQU1TLAogCQkgIiVzIHBhcmFtOiBzc2lkICUuKnMgKCVzKSBtb2RlICVzIGNoICVkIHdlcCAlcyBrZXkgJWQgIgotCQkgImtleWxlbiAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgcHJpdi0+ZXNzaWRfc2l6ZSwgcHJpdi0+ZXNzaWQsCi0JCSBoZXgyc3RyKHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSksCisJCSAia2V5bGVuICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBwcml2LT5lc3NpZF9zaXplLAorCQkgcHJpdi0+ZXNzaWQsIGhleDJzdHIocHJpdi0+ZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFKSwKIAkJIHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyA/ICJhZGhvYyIgOiAiaW5mcmEiLAogCQkgcHJpdi0+Y2hhbm5lbCwgcHJpdi0+d2VwX2VuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAogCQkgcHJpdi0+d2VwX2tleV9pZCwgcHJpdi0+d2VwX2tleXNfbGVuW3ByaXYtPndlcF9rZXlfaWRdKTsKIAlhdDc2X2RiZyhEQkdfUEFSQU1TLAogCQkgIiVzIHBhcmFtOiBwcmVhbWJsZSAlcyBydHMgJWQgcmV0cnkgJWQgZnJhZyAlZCAiCi0JCSAidHhyYXRlICVzIGF1dGhfbW9kZSAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwKKwkJICJ0eHJhdGUgJXMgYXV0aF9tb2RlICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgcHJlYW1ibGVzW3ByaXYtPnByZWFtYmxlX3R5cGVdLCBwcml2LT5ydHNfdGhyZXNob2xkLAogCQkgcHJpdi0+c2hvcnRfcmV0cnlfbGltaXQsIHByaXYtPmZyYWdfdGhyZXNob2xkLAogCQkgcHJpdi0+dHhyYXRlID09IFRYX1JBVEVfMU1CSVQgPyAiMU1CaXQiIDogcHJpdi0+dHhyYXRlID09CkBAIC0zOTA5LDcgKzE0ODgsNyBAQAogCWF0NzZfZGJnKERCR19QQVJBTVMsCiAJCSAiJXMgcGFyYW06IHBtX21vZGUgJWQgcG1fcGVyaW9kICVkIGF1dGhfbW9kZSAlcyAiCiAJCSAic2Nhbl90aW1lcyAlZCAlZCBzY2FuX21vZGUgJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwcml2LT5wbV9tb2RlLCBwcml2LT5wbV9wZXJpb2QsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHByaXYtPnBtX21vZGUsIHByaXYtPnBtX3BlcmlvZCwKIAkJIHByaXYtPmF1dGhfbW9kZSA9PSBXTEFOX0FVVEhfT1BFTiA/ICJvcGVuIiA6ICJzaGFyZWRfc2VjcmV0IiwKIAkJIHByaXYtPnNjYW5fbWluX3RpbWUsIHByaXYtPnNjYW5fbWF4X3RpbWUsCiAJCSBwcml2LT5zY2FuX21vZGUgPT0gU0NBTl9UWVBFX0FDVElWRSA/ICJhY3RpdmUiIDogInBhc3NpdmUiKTsKQEAgLTM5NDMsNyArMTUyMiw4IEBACiAJY2NmZy0+c3NpZF9sZW4gPSBwcml2LT5lc3NpZF9zaXplOwogCiAJY2NmZy0+d2VwX2RlZmF1bHRfa2V5X2lkID0gcHJpdi0+d2VwX2tleV9pZDsKLQltZW1jcHkoY2NmZy0+d2VwX2RlZmF1bHRfa2V5X3ZhbHVlLCBwcml2LT53ZXBfa2V5cywgNCAqIFdFUF9LRVlfTEVOKTsKKwltZW1jcHkoY2NmZy0+d2VwX2RlZmF1bHRfa2V5X3ZhbHVlLCBwcml2LT53ZXBfa2V5cywKKwkgICAgICAgc2l6ZW9mKHByaXYtPndlcF9rZXlzKSk7CiAKIAljY2ZnLT5zaG9ydF9wcmVhbWJsZSA9IHByaXYtPnByZWFtYmxlX3R5cGU7CiAJY2NmZy0+YmVhY29uX3BlcmlvZCA9IGNwdV90b19sZTE2KHByaXYtPmJlYWNvbl9wZXJpb2QpOwpAQCAtMzk1Miw3ICsxNTMyLDcgQEAKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdDc2X2NhcmRfY29uZmlnKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9zZXRfY2FyZF9jb21tYW5kIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zOTk4LDY5ICsxNTc4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogUmVzdGFydCB0aGUgaW50ZXJmYWNlICovCi1zdGF0aWMgdm9pZCBhdDc2X2R3b3JrX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfcmVzdGFydC53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0KLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwkvKiBzdG9wIG5ldGRldiB3YXRjaGRvZyAqLwotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsJLyogc3RvcCB0eCBkYXRhIHBhY2tldHMgKi8KLQotCWF0NzZfc3RhcnR1cF9kZXZpY2UocHJpdik7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpIHsKLQkJcHJpdi0+bmV0ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zdGFydF9zY2FuKTsKLQl9IGVsc2UgewotCQlwcml2LT5uZXRkZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQOwotCQlhdDc2X3N0YXJ0X21vbml0b3IocHJpdik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBJbml0aWF0ZSBzY2FubmluZyAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX3N0YXJ0X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19zdGFydF9zY2FuKTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKLQotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCS8qIG9ubHkgY2xlYXIgdGhlIGJzcyBsaXN0IHdoZW4gYSBzY2FuIGlzIGFjdGl2ZWx5IGluaXRpYXRlZCwKLQkgKiBvdGhlcndpc2Ugc2ltcGx5IHJlbHkgb24gYXQ3Nl9ic3NfbGlzdF90aW1lb3V0ICovCi0JaWYgKHByaXYtPnNjYW5fc3RhdGUgPT0gU0NBTl9JTl9QUk9HUkVTUykgewotCQlhdDc2X2ZyZWVfYnNzX2xpc3QocHJpdik7Ci0JCXByaXYtPnNjYW5fbmVlZF9hbnkgPSAxOwotCX0gZWxzZQotCQlwcml2LT5zY2FuX25lZWRfYW55ID0gMDsKLQotCXJldCA9IGF0NzZfc3RhcnRfc2Nhbihwcml2LCAxKTsKLQotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogc3RhcnRfc2NhbiBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHJldCk7Ci0JZWxzZSB7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciBmb3IgJWQgdGlja3MiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2NhbiwKLQkJCQkgICAgICBTQ0FOX1BPTExfSU5URVJWQUwpOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KIC8qIEVuYWJsZSBvciBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KIHN0YXRpYyB2b2lkIGF0NzZfd29ya19zZXRfcHJvbWlzYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC00MDc4LDcgKzE1OTUsNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHByb21pc2N1b3VzX21vZGUpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAltdXRleF91bmxvY2soJnByaXYtPm10eCk7CiB9CkBAIC00MDk0LDg5NCArMTYxMSwxMiBAQAogCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKIH0KIAotLyogV2UgZ290IGFuIGFzc29jaWF0aW9uIHJlc3BvbnNlICovCi1zdGF0aWMgdm9pZCBhdDc2X3J4X21nbXRfYXNzb2Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlICpyZXNwID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2UgKilidWYtPnBhY2tldDsKLQl1MTYgYXNzb2NfaWQgPSBsZTE2X3RvX2NwdShyZXNwLT5haWQpOwotCXUxNiBzdGF0dXMgPSBsZTE2X3RvX2NwdShyZXNwLT5zdGF0dXMpOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsICIlczogcnggQXNzb2NSZXNwIGJzc2lkICVzIGNhcGEgMHglMDR4IHN0YXR1cyAiCi0JCSAiMHglMDR4IGFzc29jX2lkIDB4JTA0eCByYXRlcyAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIG1hYzJzdHIocmVzcC0+aGVhZGVyLmFkZHIzKSwgbGUxNl90b19jcHUocmVzcC0+Y2FwYWJpbGl0eSksCi0JCSBzdGF0dXMsIGFzc29jX2lkLCBoZXgyc3RyKHJlc3AtPmluZm9fZWxlbWVudC0+ZGF0YSwKLQkJCQkJICAgcmVzcC0+aW5mb19lbGVtZW50LT5sZW4pKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBBc3NvY1Jlc3AgaW4gc3RhdGUgJXMgaWdub3JlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQotCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MpOwotCWlmIChzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewotCQlzdHJ1Y3QgYnNzX2luZm8gKnB0ciA9IHByaXYtPmN1cnJfYnNzOwotCQlwcml2LT5hc3NvY19pZCA9IGFzc29jX2lkICYgMHgzZmZmOwotCQkvKiB1cGRhdGUgaXdjb25maWcgcGFyYW1zICovCi0JCW1lbWNweShwcml2LT5ic3NpZCwgcHRyLT5ic3NpZCwgRVRIX0FMRU4pOwotCQltZW1jcHkocHJpdi0+ZXNzaWQsIHB0ci0+c3NpZCwgcHRyLT5zc2lkX2xlbik7Ci0JCXByaXYtPmVzc2lkX3NpemUgPSBwdHItPnNzaWRfbGVuOwotCQlwcml2LT5jaGFubmVsID0gcHRyLT5jaGFubmVsOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2Fzc29jX2RvbmUpOwotCX0gZWxzZSB7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JfQotfQotCi0vKiBQcm9jZXNzIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgQVAgKi8KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9kaXNhc3NvYyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyAqcmVzcCA9Ci0JICAgIChzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICopYnVmLT5wYWNrZXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQgPSAmcmVzcC0+aGVhZGVyOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsCi0JCSAiJXM6IHJ4IERpc0Fzc29jIGJzc2lkICVzIHJlYXNvbiAweCUwNHggZGVzdGluYXRpb24gJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlc3AtPnJlYXNvbiksIG1hYzJzdHIobWdtdC0+YWRkcjEpKTsKLQotCS8qIFdlIGFyZSBub3QgY29ubmVjdGVkLCBpZ25vcmUgKi8KLQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19TQ0FOTklORyB8fCBwcml2LT5tYWNfc3RhdGUgPT0gTUFDX0lOSVQKLQkgICAgfHwgIXByaXYtPmN1cnJfYnNzKQotCQlyZXR1cm47Ci0KLQkvKiBOb3Qgb3VyIEJTU0lELCBpZ25vcmUgKi8KLQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKG1nbXQtPmFkZHIzLCBwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKQotCQlyZXR1cm47Ci0KLQkvKiBOb3QgZm9yIG91ciBTVEEgYW5kIG5vdCBicm9hZGNhc3QsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgbWdtdC0+YWRkcjEpCi0JICAgICYmICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtZ210LT5hZGRyMSkpCi0JCXJldHVybjsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQ09OTkVDVEVECi0JICAgICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfSk9JTklORykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogRGlzQXNzb2MgaW4gc3RhdGUgJXMgaWdub3JlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwcml2LT5tYWNfc3RhdGUgPT0gTUFDX0NPTk5FQ1RFRCkgewotCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwotCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCX0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3J4X21nbXRfYXV0aChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoICpyZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aCAqKWJ1Zi0+cGFja2V0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0gJnJlc3AtPmhlYWRlcjsKLQlpbnQgc2VxX25yID0gbGUxNl90b19jcHUocmVzcC0+dHJhbnNhY3Rpb24pOwotCWludCBhbGcgPSBsZTE2X3RvX2NwdShyZXNwLT5hbGdvcml0aG0pOwotCWludCBzdGF0dXMgPSBsZTE2X3RvX2NwdShyZXNwLT5zdGF0dXMpOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsCi0JCSAiJXM6IHJ4IEF1dGhGcmFtZSBic3NpZCAlcyBhbGcgJWQgc2VxX25yICVkIHN0YXR1cyAlZCAiCi0JCSAiZGVzdGluYXRpb24gJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIobWdtdC0+YWRkcjMpLAotCQkgYWxnLCBzZXFfbnIsIHN0YXR1cywgbWFjMnN0cihtZ210LT5hZGRyMSkpOwotCi0JaWYgKGFsZyA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAmJiBzZXFfbnIgPT0gMikKLQkJYXQ3Nl9kYmcoREJHX1JYX01HTVQsICIlczogQXV0aEZyYW1lIGNoYWxsZW5nZSAlcyAuLi4iLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgaGV4MnN0cihyZXNwLT5pbmZvX2VsZW1lbnQsIDE4KSk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBpZ25vcmVkIEF1dGhGcmFtZSBpbiBzdGF0ZSAlc1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocHJpdi0+YXV0aF9tb2RlICE9IGFsZykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogaWdub3JlZCBBdXRoRnJhbWUgZm9yIGFsZyAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgYWxnKTsKLQkJcmV0dXJuOwotCX0KLQotCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JLyogTm90IG91ciBCU1NJRCBvciBub3QgZm9yIG91ciBTVEEsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCkKLQkgICAgfHwgY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPm5ldGRldi0+ZGV2X2FkZHIsIG1nbXQtPmFkZHIxKSkKLQkJcmV0dXJuOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCk7Ci0JaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCS8qIHRyeSB0byBqb2luIG5leHQgYnNzICovCi0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocHJpdi0+YXV0aF9tb2RlID09IFdMQU5fQVVUSF9PUEVOIHx8IHNlcV9uciA9PSA0KSB7Ci0JCXByaXYtPnJldHJpZXMgPSBBU1NPQ19SRVRSSUVTOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0FTU09DKTsKLQkJYXQ3Nl9hc3NvY19yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MsIEFTU09DX1RJTUVPVVQpOwotCQlyZXR1cm47Ci0JfQotCi0JV0FSTl9PTihzZXFfbnIgIT0gMik7Ci0JYXQ3Nl9hdXRoX3JlcShwcml2LCBwcml2LT5jdXJyX2Jzcywgc2VxX25yICsgMSwgcmVzcC0+aW5mb19lbGVtZW50KTsKLQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLCBfX2Z1bmNfXywKLQkJIF9fTElORV9fKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgsIEFVVEhfVElNRU9VVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9kZWF1dGgoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICpyZXNwID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgKilidWYtPnBhY2tldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqbWdtdCA9ICZyZXNwLT5oZWFkZXI7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfTUdNVCB8IERCR19QUk9HUkVTUywKLQkJICIlczogcnggRGVBdXRoIGJzc2lkICVzIHJlYXNvbiAweCUwNHggZGVzdGluYXRpb24gJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlc3AtPnJlYXNvbiksIG1hYzJzdHIobWdtdC0+YWRkcjEpKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FVVEggJiYgcHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BU1NPQwotCSAgICAmJiBwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0NPTk5FQ1RFRCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogRGVBdXRoIGluIHN0YXRlICVzIGlnbm9yZWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIG1hY19zdGF0ZXNbcHJpdi0+bWFjX3N0YXRlXSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlCVUdfT04oIXByaXYtPmN1cnJfYnNzKTsKLQotCS8qIE5vdCBvdXIgQlNTSUQsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCkpCi0JCXJldHVybjsKLQotCS8qIE5vdCBmb3Igb3VyIFNUQSBhbmQgbm90IGJyb2FkY2FzdCwgaWdub3JlICovCi0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5uZXRkZXYtPmRldl9hZGRyLCBtZ210LT5hZGRyMSkKLQkgICAgJiYgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1nbXQtPmFkZHIxKSkKLQkJcmV0dXJuOwotCi0JaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEKQotCQlhdDc2X2l3ZXZlbnRfYnNzX2Rpc2Nvbm5lY3QocHJpdi0+bmV0ZGV2KTsKLQotCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0Jc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9iZWFjb24oc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlpbnQgdmFycGFyX2xlbjsKLQkvKiBiZWFjb24gY29udGVudCAqLwotCXN0cnVjdCBpZWVlODAyMTFfYmVhY29uICpiZGF0YSA9IChzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqKWJ1Zi0+cGFja2V0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0gJmJkYXRhLT5oZWFkZXI7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkICpscHRyOwotCXN0cnVjdCBic3NfaW5mbyAqbWF0Y2g7CS8qIGVudHJ5IG1hdGNoaW5nIGFkZHIzIHdpdGggaXRzIGJzc2lkICovCi0JaW50IG5ld19lbnRyeSA9IDA7Ci0JaW50IGxlbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaWU7Ci0JaW50IGhhdmVfc3NpZCA9IDA7Ci0JaW50IGhhdmVfcmF0ZXMgPSAwOwotCWludCBoYXZlX2NoYW5uZWwgPSAwOwotCWludCBrZWVwX2dvaW5nID0gMTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEKSB7Ci0JCS8qIGluIHN0YXRlIE1BQ19DT05ORUNURUQgd2UgdXNlIHRoZSBtZ210X3RpbWVyIHRvIGNvbnRyb2wKLQkJICAgdGhlIGJlYWNvbiBvZiB0aGUgQlNTICovCi0JCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPmN1cnJfYnNzLT5ic3NpZCwgbWdtdC0+YWRkcjMpKSB7Ci0JCQkvKiBXZSBnb3Qgb3VyIEFQJ3MgYmVhY29uLCBkZWZlciB0aGUgdGltZW91dCBoYW5kbGVyLgotCQkJICAgS2lsbCBwZW5kaW5nIHdvcmsgZmlyc3QsIGFzIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygpCi0JCQkgICB3b24ndCBkbyBpdC4gKi8KLQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2JlYWNvbik7Ci0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2JlYWNvbiwKLQkJCQkJICAgICAgQkVBQ09OX1RJTUVPVVQpOwotCQkJcHJpdi0+Y3Vycl9ic3MtPnJzc2kgPSBidWYtPnJzc2k7Ci0JCQlwcml2LT5iZWFjb25zX3JlY2VpdmVkKys7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQkvKiBsb29rIGlmIHdlIGhhdmUgdGhpcyBCU1MgYWxyZWFkeSBpbiB0aGUgbGlzdCAqLwotCW1hdGNoID0gTlVMTDsKLQotCWlmICghbGlzdF9lbXB0eSgmcHJpdi0+YnNzX2xpc3QpKSB7Ci0JCWxpc3RfZm9yX2VhY2gobHB0ciwgJnByaXYtPmJzc19saXN0KSB7Ci0JCQlzdHJ1Y3QgYnNzX2luZm8gKmJzc19wdHIgPQotCQkJICAgIGxpc3RfZW50cnkobHB0ciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KTsKLQkJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGJzc19wdHItPmJzc2lkLCBtZ210LT5hZGRyMykpIHsKLQkJCQltYXRjaCA9IGJzc19wdHI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIW1hdGNoKSB7Ci0JCS8qIEJTUyBub3QgaW4gdGhlIGxpc3QgLSBhcHBlbmQgaXQgKi8KLQkJbWF0Y2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnNzX2luZm8pLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFtYXRjaCkgewotCQkJYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwKLQkJCQkgIiVzOiBjYW5ub3Qga21hbGxvYyBuZXcgYnNzIGluZm8gKCV6ZCBieXRlKSIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgc2l6ZW9mKHN0cnVjdCBic3NfaW5mbykpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCW5ld19lbnRyeSA9IDE7Ci0JCWxpc3RfYWRkX3RhaWwoJm1hdGNoLT5saXN0LCAmcHJpdi0+YnNzX2xpc3QpOwotCX0KLQotCW1hdGNoLT5jYXBhID0gbGUxNl90b19jcHUoYmRhdGEtPmNhcGFiaWxpdHkpOwotCW1hdGNoLT5iZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShiZGF0YS0+YmVhY29uX2ludGVydmFsKTsKLQltYXRjaC0+cnNzaSA9IGJ1Zi0+cnNzaTsKLQltYXRjaC0+bGlua19xdWFsID0gYnVmLT5saW5rX3F1YWxpdHk7Ci0JbWF0Y2gtPm5vaXNlX2xldmVsID0gYnVmLT5ub2lzZV9sZXZlbDsKLQltZW1jcHkobWF0Y2gtPmJzc2lkLCBtZ210LT5hZGRyMywgRVRIX0FMRU4pOwotCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogYnNzaWQgJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBtYWMyc3RyKG1hdGNoLT5ic3NpZCkpOwotCi0JaWUgPSBiZGF0YS0+aW5mb19lbGVtZW50OwotCi0JLyogbGVuZ3RoIG9mIHZhciBsZW5ndGggYmVhY29uIHBhcmFtZXRlcnMgKi8KLQl2YXJwYXJfbGVuID0gbWluX3QoaW50LCBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpIC0KLQkJCSAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiksCi0JCQkgICBCRUFDT05fTUFYX0RBVEFfTEVOR1RIKTsKLQotCS8qIFRoaXMgcm91dGluZSBzdGVwcyB0aHJvdWdoIHRoZSBiZGF0YS0+ZGF0YSBhcnJheSB0byBnZXQKLQkgKiBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjZXNzIHBvaW50LgotCSAqIEN1cnJlbnRseSwgdGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZWNlaXB0IG9mOiBTU0lELAotCSAqIHN1cHBvcnRlZCB0cmFuc2ZlciByYXRlcyBhbmQgY2hhbm5lbCwgaW4gYW55IG9yZGVyLCB3aXRoIHNvbWUKLQkgKiB0b2xlcmFuY2UgZm9yIGludGVybWl0dGVudCB1bmtub3duIGNvZGVzIChhbHRob3VnaCB0aGlzCi0JICogZnVuY3Rpb25hbGl0eSBtYXkgbm90IGJlIG5lY2Vzc2FyeSBhcyB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIHdpbGwKLQkgKiB1c3VhbGx5IGFycml2ZSBpbiBjb25zZWN1dGl2ZWx5LCBidXQgdGhlcmUgaGF2ZSBiZWVuIHNvbWUKLQkgKiByZXBvcnRzIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCBpbmZvcm1hdGlvbiBmaWVsZHMgYXJyaXZpbmcgaW4gYQotCSAqIGRpZmZlcmVudCBvcmRlcikuCi0JICogSXQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbW9yZSBJRSB0eXBlcyBhbHRob3VnaCBNRklFX1RZUEVfVElNIG1heQotCSAqIGJlIHN1cHBvcnRlZCAob24gbXkgQVAgYXQgbGVhc3QpLgotCSAqIFRoZSBiZGF0YS0+ZGF0YSBhcnJheSBpcyBhYm91dCAxNTAwIGJ5dGVzIGxvbmcgYnV0IG9ubHkgfjM2IG9mIHRob3NlCi0JICogYnl0ZXMgYXJlIHVzZWZ1bCwgaGVuY2UgdGhlIGhhdmVfc3NpZCBldGMgb3B0aW1pemF0aW9ucy4gKi8KLQotCXdoaWxlIChrZWVwX2dvaW5nICYmCi0JICAgICAgICgoJmllLT5kYXRhW2llLT5sZW5dIC0gKHU4ICopYmRhdGEtPmluZm9fZWxlbWVudCkgPD0KLQkJdmFycGFyX2xlbikpIHsKLQotCQlzd2l0Y2ggKGllLT5pZCkgewotCi0JCWNhc2UgTUZJRV9UWVBFX1NTSUQ6Ci0JCQlpZiAoaGF2ZV9zc2lkKQotCQkJCWJyZWFrOwotCi0JCQlsZW4gPSBtaW5fdChpbnQsIElXX0VTU0lEX01BWF9TSVpFLCBpZS0+bGVuKTsKLQotCQkJLyogd2UgY29weSBvbmx5IGlmIHRoaXMgaXMgYSBuZXcgZW50cnksCi0JCQkgICBvciB0aGUgaW5jb21pbmcgU1NJRCBpcyBub3QgYSBoaWRkZW4gU1NJRC4gVGhpcwotCQkJICAgd2lsbCBwcm90ZWN0IHVzIGZyb20gb3ZlcndyaXRpbmcgYSByZWFsIFNTSUQgcmVhZAotCQkJICAgaW4gYSBQcm9iZVJlc3BvbnNlIHdpdGggYSBoaWRkZW4gb25lIGZyb20gYQotCQkJICAgZm9sbG93aW5nIGJlYWNvbi4gKi8KLQkJCWlmICghbmV3X2VudHJ5ICYmIGF0NzZfaXNfaGlkZGVuX3NzaWQoaWUtPmRhdGEsIGxlbikpIHsKLQkJCQloYXZlX3NzaWQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQltYXRjaC0+c3NpZF9sZW4gPSBsZW47Ci0JCQltZW1jcHkobWF0Y2gtPnNzaWQsIGllLT5kYXRhLCBsZW4pOwotCQkJYXQ3Nl9kYmcoREJHX1JYX0JFQUNPTiwgIiVzOiBTU0lEIC0gJS4qcyIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGVuLCBtYXRjaC0+c3NpZCk7Ci0JCQloYXZlX3NzaWQgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRklFX1RZUEVfUkFURVM6Ci0JCQlpZiAoaGF2ZV9yYXRlcykKLQkJCQlicmVhazsKLQotCQkJbWF0Y2gtPnJhdGVzX2xlbiA9Ci0JCQkgICAgbWluX3QoaW50LCBzaXplb2YobWF0Y2gtPnJhdGVzKSwgaWUtPmxlbik7Ci0JCQltZW1jcHkobWF0Y2gtPnJhdGVzLCBpZS0+ZGF0YSwgbWF0Y2gtPnJhdGVzX2xlbik7Ci0JCQloYXZlX3JhdGVzID0gMTsKLQkJCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogU1VQUE9SVEVEIFJBVEVTICVzIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkJCSBoZXgyc3RyKGllLT5kYXRhLCBpZS0+bGVuKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9EU19TRVQ6Ci0JCQlpZiAoaGF2ZV9jaGFubmVsKQotCQkJCWJyZWFrOwotCi0JCQltYXRjaC0+Y2hhbm5lbCA9IGllLT5kYXRhWzBdOwotCQkJaGF2ZV9jaGFubmVsID0gMTsKLQkJCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogQ0hBTk5FTCAtICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYXRjaC0+Y2hhbm5lbCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9DRl9TRVQ6Ci0JCWNhc2UgTUZJRV9UWVBFX1RJTToKLQkJY2FzZSBNRklFX1RZUEVfSUJTU19TRVQ6Ci0JCWRlZmF1bHQ6Ci0JCQlhdDc2X2RiZyhEQkdfUlhfQkVBQ09OLCAiJXM6IGJlYWNvbiBJRSBpZCAlZCBsZW4gJWQgJXMiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGllLT5pZCwgaWUtPmxlbiwKLQkJCQkgaGV4MnN0cihpZS0+ZGF0YSwgaWUtPmxlbikpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGluZm9ybWF0aW9uYWwgZWxlbWVudCAqLwotCQluZXh0X2llKCZpZSk7Ci0KLQkJLyogT3B0aW1pemF0aW9uOiBhZnRlciBhbGwsIHRoZSBiZGF0YS0+ZGF0YSBhcnJheSBpcwotCQkgKiB2YXJwYXJfbGVuIGJ5dGVzIGxvbmcsIHdoZXJlYXMgd2UgZ2V0IGFsbCBvZiB0aGUgdXNlZnVsCi0JCSAqIGluZm9ybWF0aW9uIGFmdGVyIG9ubHkgfjM2IGJ5dGVzLCB0aGlzIHNhdmVzIHVzIGEgbG90IG9mCi0JCSAqIHRpbWUgKGFuZCB0cm91YmxlIGFzIHRoZSByZW1haW5pbmcgcG9ydGlvbiBvZiB0aGUgYXJyYXkKLQkJICogY291bGQgYmUgZnVsbCBvZiBqdW5rKQotCQkgKiBDb21tZW50IHRoaXMgb3V0IGlmIHlvdSB3YW50IHRvIHNlZSB3aGF0IG90aGVyIGluZm9ybWF0aW9uCi0JCSAqIGNvbWVzIGZyb20gdGhlIEFQIC0gYWx0aG91Z2ggbGl0dGxlIG9mIGl0IG1heSBiZSB1c2VmdWwgKi8KLQl9Ci0KLQlhdDc2X2RiZyhEQkdfUlhfQkVBQ09OLCAiJXM6IEZpbmlzaGVkIHByb2Nlc3NpbmcgYmVhY29uIGRhdGEiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQotCW1hdGNoLT5sYXN0X3J4ID0gamlmZmllczsJLyogcmVjb3JkIGxhc3Qgcnggb2YgYmVhY29uICovCi0KLWV4aXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBsaW5rIGxldmVsIGZyb20gYSBnaXZlbiByeF9idWZmZXIgKi8KLXN0YXRpYyB2b2lkIGF0NzZfY2FsY19sZXZlbChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZiwKLQkJCSAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqcXVhbCkKLXsKLQkvKiBqdXN0IGEgZ3Vlc3MgZm9yIG5vdywgbWlnaHQgYmUgZGlmZmVyZW50IGZvciBvdGhlciBjaGlwcyAqLwotCWludCBtYXhfcnNzaSA9IDQyOwotCi0JcXVhbC0+bGV2ZWwgPSAoYnVmLT5yc3NpICogMTAwIC8gbWF4X3Jzc2kpOwotCWlmIChxdWFsLT5sZXZlbCA+IDEwMCkKLQkJcXVhbC0+bGV2ZWwgPSAxMDA7Ci0JcXVhbC0+dXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX1VQREFURUQ7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbGluayBxdWFsaXR5IGZyb20gYSBnaXZlbiByeF9idWZmZXIgKi8KLXN0YXRpYyB2b2lkIGF0NzZfY2FsY19xdWFsKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmLAotCQkJICAgc3RydWN0IGl3X3F1YWxpdHkgKnF1YWwpCi17Ci0JaWYgKGF0NzZfaXNfaW50ZXJzaWwocHJpdi0+Ym9hcmRfdHlwZSkpCi0JCXF1YWwtPnF1YWwgPSBidWYtPmxpbmtfcXVhbGl0eTsKLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBlbGFwc2VkOwotCi0JCS8qIFVwZGF0ZSBxdWFsIGF0IG1vc3Qgb25jZSBhIHNlY29uZCAqLwotCQllbGFwc2VkID0gamlmZmllcyAtIHByaXYtPmJlYWNvbnNfbGFzdF9xdWFsOwotCQlpZiAoZWxhcHNlZCA8IDEgKiBIWikKLQkJCXJldHVybjsKLQotCQlxdWFsLT5xdWFsID0gcXVhbC0+bGV2ZWwgKiBwcml2LT5iZWFjb25zX3JlY2VpdmVkICoKLQkJICAgIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+YmVhY29uX3BlcmlvZCkgLyBlbGFwc2VkOwotCi0JCXByaXYtPmJlYWNvbnNfbGFzdF9xdWFsID0gamlmZmllczsKLQkJcHJpdi0+YmVhY29uc19yZWNlaXZlZCA9IDA7Ci0JfQotCXF1YWwtPnF1YWwgPSAocXVhbC0+cXVhbCA+IDEwMCkgPyAxMDAgOiBxdWFsLT5xdWFsOwotCXF1YWwtPnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX1VQREFURUQ7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbm9pc2UgcXVhbGl0eSBmcm9tIGEgZ2l2ZW4gcnhfYnVmZmVyICovCi1zdGF0aWMgdm9pZCBhdDc2X2NhbGNfbm9pc2Uoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYsCi0JCQkgICAgc3RydWN0IGl3X3F1YWxpdHkgKnF1YWwpCi17Ci0JcXVhbC0+bm9pc2UgPSAwOwotCXF1YWwtPnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3VwZGF0ZV93c3RhdHMoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdfcXVhbGl0eSAqcXVhbCA9ICZwcml2LT53c3RhdHMucXVhbDsKLQotCWlmIChidWYtPnJzc2kgJiYgcHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQpIHsKLQkJcXVhbC0+dXBkYXRlZCA9IDA7Ci0JCWF0NzZfY2FsY19sZXZlbChwcml2LCBidWYsIHF1YWwpOwotCQlhdDc2X2NhbGNfcXVhbChwcml2LCBidWYsIHF1YWwpOwotCQlhdDc2X2NhbGNfbm9pc2UocHJpdiwgYnVmLCBxdWFsKTsKLQl9IGVsc2UgewotCQlxdWFsLT5xdWFsID0gMDsKLQkJcXVhbC0+bGV2ZWwgPSAwOwotCQlxdWFsLT5ub2lzZSA9IDA7Ci0JCXF1YWwtPnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9JTlZBTElEOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tZ210KHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmLT5wYWNrZXQ7Ci0JdTE2IGZyYW1lY3RsID0gbGUxNl90b19jcHUobWdtdC0+ZnJhbWVfY3RsKTsKLQotCS8qIHVwZGF0ZSB3c3RhdHMgKi8KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19JTklUICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpIHsKLQkJLyogamFsOiB0aGlzIGlzIGEgZGlydHkgaGFjayBuZWVkZWQgYnkgVGltIGluIGFkLWhvYyBtb2RlICovCi0JCS8qIERhdGEgcGFja2V0cyBhbHdheXMgc2VlbSB0byBoYXZlIGEgMCBsaW5rIGxldmVsLCBzbyB3ZQotCQkgICBvbmx5IHJlYWQgbGluayBxdWFsaXR5IGluZm8gZnJvbSBtYW5hZ2VtZW50IHBhY2tldHMuCi0JCSAgIEF0bWVsIGRyaXZlciBhY3R1YWxseSBhdmVyYWdlcyB0aGUgcHJlc2VudCwgYW5kIHByZXZpb3VzCi0JCSAgIHZhbHVlcywgd2UganVzdCBwcmVzZW50IHRoZSByYXcgdmFsdWUgYXQgdGhlIG1vbWVudCAtIFRKUyAqLwotCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DCi0JCSAgICB8fCAocHJpdi0+Y3Vycl9ic3MKLQkJCSYmICFjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsCi0JCQkJCSAgICAgICBwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKSkKLQkJCWF0NzZfdXBkYXRlX3dzdGF0cyhwcml2LCBidWYpOwotCX0KLQotCWF0NzZfZGJnKERCR19SWF9NR01UX0NPTlRFTlQsICIlcyByeCBtZ210IGZyYW1lY3RsIDB4JXggJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZWN0bCwKLQkJIGhleDJzdHIobWdtdCwgbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKSkpOwotCi0Jc3dpdGNoIChmcmFtZWN0bCAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgotCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6Ci0JCWF0NzZfcnhfbWdtdF9iZWFjb24ocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgotCQlhdDc2X3J4X21nbXRfYXNzb2MocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKLQkJYXQ3Nl9yeF9tZ210X2Rpc2Fzc29jKHByaXYsIGJ1Zik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKLQkJYXQ3Nl9yeF9tZ210X2F1dGgocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6Ci0JCWF0NzZfcnhfbWdtdF9kZWF1dGgocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlnbm9yaW5nIGZyYW1lIHdpdGggZnJhbWVjdGwgMHglMDR4XG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZWN0bCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKiBDb252ZXJ0IHRoZSA4MDIuMTEgaGVhZGVyIGludG8gYW4gZXRoZXJuZXQtc3R5bGUgaGVhZGVyLCBtYWtlIHNrYgotICogcmVhZHkgZm9yIGNvbnN1bXB0aW9uIGJ5IG5ldGlmX3J4KCkgKi8KLXN0YXRpYyB2b2lkIGF0NzZfaWVlZTgwMjExX3RvX2V0aChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaXdfbW9kZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaTgwMl8xMV9oZHI7Ci0Jc3RydWN0IGV0aGhkciAqZXRoX2hkcl9wOwotCXU4ICpzcmNfYWRkcjsKLQl1OCAqZGVzdF9hZGRyOwotCi0JaTgwMl8xMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7Ci0KLQkvKiBUaGF0IHdvdWxkIGJlIHRoZSBldGhlcm5ldCBoZWFkZXIgaWYgdGhlIGhhcmR3YXJlIGNvbnZlcnRlZAotCSAqIHRoZSBmcmFtZSBmb3IgdXMuICBNYWtlIHN1cmUgdGhlIHNvdXJjZSBhbmQgdGhlIGRlc3RpbmF0aW9uCi0JICogbWF0Y2ggdGhlIDgwMi4xMSBoZWFkZXIuICBXaGljaCBoYXJkd2FyZSBkb2VzIGl0PyAqLwotCWV0aF9oZHJfcCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1bGwoc2tiLCBJRUVFODAyMTFfM0FERFJfTEVOKTsKLQotCWRlc3RfYWRkciA9IGk4MDJfMTFfaGRyLT5hZGRyMTsKLQlpZiAoaXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQlzcmNfYWRkciA9IGk4MDJfMTFfaGRyLT5hZGRyMjsKLQllbHNlCi0JCXNyY19hZGRyID0gaTgwMl8xMV9oZHItPmFkZHIzOwotCi0JaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcl9wLT5oX3NvdXJjZSwgc3JjX2FkZHIpICYmCi0JICAgICFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcl9wLT5oX2Rlc3QsIGRlc3RfYWRkcikpCi0JCS8qIFllcywgd2UgYWxyZWFkeSBoYXZlIGFuIGV0aGVybmV0IGhlYWRlciAqLwotCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotCWVsc2UgewotCQl1MTYgbGVuOwotCi0JCS8qIE5lZWQgdG8gYnVpbGQgYW4gZXRoZXJuZXQgaGVhZGVyICovCi0JCWlmICghbWVtY21wKHNrYi0+ZGF0YSwgc25hcHNpZywgc2l6ZW9mKHNuYXBzaWcpKSkgewotCQkJLyogU05BUCBmcmFtZSAtIGRlY2Fwc3VsYXRlLCBrZWVwIHByb3RvICovCi0JCQlza2JfcHVzaChza2IsIG9mZnNldG9mKHN0cnVjdCBldGhoZHIsIGhfcHJvdG8pIC0KLQkJCQkgc2l6ZW9mKHJmYzEwNDJzaWcpKTsKLQkJCWxlbiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiA4MDIuMyBmcmFtZSwgcHJvdG8gaXMgbGVuZ3RoICovCi0JCQlsZW4gPSBza2ItPmxlbjsKLQkJCXNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotCQl9Ci0KLQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQkJZXRoX2hkcl9wID0gZXRoX2hkcihza2IpOwotCQkvKiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gdGhpcyBvcmRlciAoZXRoX2hkcl9wLT5oX2Rlc3QgbWF5Ci0JCSAqIG92ZXJsYXAgc3JjX2FkZHIpICovCi0JCW1lbWNweShldGhfaGRyX3AtPmhfc291cmNlLCBzcmNfYWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkoZXRoX2hkcl9wLT5oX2Rlc3QsIGRlc3RfYWRkciwgRVRIX0FMRU4pOwotCQlpZiAobGVuKQotCQkJZXRoX2hkcl9wLT5oX3Byb3RvID0gaHRvbnMobGVuKTsKLQl9Ci0KLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7Ci19Ci0KLS8qIENoZWNrIGZvciBmcmFnbWVudGVkIGRhdGEgaW4gcHJpdi0+cnhfc2tiLiBJZiB0aGUgcGFja2V0IHdhcyBubyBmcmFnbWVudAotICAgb3IgaXQgd2FzIHRoZSBsYXN0IG9mIGEgZnJhZ21lbnQgc2V0IGEgc2tiIGNvbnRhaW5pbmcgdGhlIHdob2xlIHBhY2tldAotICAgaXMgcmV0dXJuZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gT3RoZXJ3aXNlIHdlIGdldCBOVUxMIGFuZCBhcmUKLSAgIGRvbmUgYW5kIHRoZSBwYWNrZXQgaXMgZWl0aGVyIHN0b3JlZCBpbnNpZGUgdGhlIGZyYWdtZW50IGJ1ZmZlcgotICAgb3IgdGhyb3duIGF3YXkuICBFdmVyeSByZXR1cm5lZCBza2Igc3RhcnRzIHdpdGggdGhlIGllZWU4MDJfMTEgaGVhZGVyCi0gICBhbmQgY29udGFpbnMgX25vXyBGQ1MgYXQgdGhlIGVuZCAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICphdDc2X2NoZWNrX2Zvcl9yeF9mcmFncyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5yeF9za2I7Ci0Jc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICppODAyXzExX2hkciA9Ci0JICAgIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWJ1Zi0+cGFja2V0OwotCS8qIHNlcV9jdHJsLCBmcmFnbWVudF9udW1iZXIsIHNlcXVlbmNlIG51bWJlciBvZiBuZXcgcGFja2V0ICovCi0JdTE2IHNjdGwgPSBsZTE2X3RvX2NwdShpODAyXzExX2hkci0+c2VxX2N0bCk7Ci0JdTE2IGZyYWduciA9IHNjdGwgJiAweGY7Ci0JdTE2IHNlcW5yID0gc2N0bCA+PiA0OwotCXUxNiBmcmFtZV9jdGwgPSBsZTE2X3RvX2NwdShpODAyXzExX2hkci0+ZnJhbWVfY3RsKTsKLQotCS8qIExlbmd0aCBpbmNsdWRpbmcgdGhlIElFRUU4MDIuMTEgaGVhZGVyLCBidXQgd2l0aG91dCB0aGUgdHJhaWxpbmcKLQkgKiBGQ1MgYW5kIHdpdGhvdXQgdGhlIEF0bWVsIFJ4IGhlYWRlciAqLwotCWludCBsZW5ndGggPSBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpIC0gSUVFRTgwMjExX0ZDU19MRU47Ci0KLQkvKiB3aGVyZSBkb2VzIHRoZSBkYXRhIHBheWxvYWQgc3RhcnQgaW4gc2tiLT5kYXRhID8gKi8KLQl1OCAqZGF0YSA9IGk4MDJfMTFfaGRyLT5wYXlsb2FkOwotCi0JLyogbGVuZ3RoIG9mIHBheWxvYWQsIGV4Y2wuIHRoZSB0cmFpbGluZyBGQ1MgKi8KLQlpbnQgZGF0YV9sZW4gPSBsZW5ndGggLSBJRUVFODAyMTFfM0FERFJfTEVOOwotCi0JaW50IGk7Ci0Jc3RydWN0IHJ4X2RhdGFfYnVmICpicHRyLCAqb3B0cjsKLQl1bnNpZ25lZCBsb25nIG9sZGVzdCA9IH4wVUw7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCSAiJXM6IHJ4IGRhdGEgZnJhbWVfY3RsICUwNHggYWRkcjIgJXMgc2VxL2ZyYWcgJWQvJWQgIgotCQkgImxlbmd0aCAlZCBkYXRhICVkOiAlcyAuLi4iLCBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lX2N0bCwKLQkJIG1hYzJzdHIoaTgwMl8xMV9oZHItPmFkZHIyKSwgc2VxbnIsIGZyYWduciwgbGVuZ3RoLCBkYXRhX2xlbiwKLQkJIGhleDJzdHIoZGF0YSwgMzIpKTsKLQotCWF0NzZfZGJnKERCR19SWF9GUkFHU19TS0IsICIlczogaW5jb21pbmcgc2tiOiBoZWFkICVwIGRhdGEgJXAgIgotCQkgInRhaWwgJXAgZW5kICVwIGxlbiAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgc2tiLT5oZWFkLAotCQkgc2tiLT5kYXRhLCBza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpLAotCQkgc2tiLT5sZW4pOwotCi0JaWYgKGRhdGFfbGVuIDwgMCkgewotCQkvKiBtYWtlIHN1cmUgZGF0YSBzdGFydHMgaW4gdGhlIGJ1ZmZlciAqLwotCQlwcmludGsoS0VSTl9JTkZPICIlczogZGF0YSBmcmFtZSB0b28gc2hvcnRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlXQVJOX09OKGxlbmd0aCA8PSBBVDc2X1JYX0hEUkxFTik7Ci0JaWYgKGxlbmd0aCA8PSBBVDc2X1JYX0hEUkxFTikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiByZW1vdmUgdGhlIGF0NzZfcnhfYnVmZmVyIGhlYWRlciAtIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZSAqLwotCS8qIHdlIG5lZWQgdGhlIElFRUU4MDIuMTEgaGVhZGVyIChmb3IgdGhlIGFkZHJlc3NlcykgaWYgdGhpcyBwYWNrZXQKLQkgICBpcyB0aGUgZmlyc3Qgb2YgYSBjaGFpbiAqLwotCXNrYl9wdWxsKHNrYiwgQVQ3Nl9SWF9IRFJMRU4pOwotCi0JLyogcmVtb3ZlIEZDUyBhdCBlbmQgKi8KLQlza2JfdHJpbShza2IsIGxlbmd0aCk7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfRlJBR1NfU0tCLCAiJXM6IHRyaW1tZWQgc2tiOiBoZWFkICVwIGRhdGEgJXAgdGFpbCAlcCAiCi0JCSAiZW5kICVwIGxlbiAlZCBkYXRhICVwIGRhdGFfbGVuICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKLQkJIHNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmxlbiwgZGF0YSwgZGF0YV9sZW4pOwotCi0JaWYgKGZyYWduciA9PSAwICYmICEoZnJhbWVfY3RsICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkgewotCQkvKiB1bmZyYWdtZW50ZWQgcGFja2V0IHJlY2VpdmVkICovCi0JCS8qIFVzZSBhIG5ldyBza2IgZm9yIHRoZSBuZXh0IHJlY2VpdmUgKi8KLQkJcHJpdi0+cnhfc2tiID0gTlVMTDsKLQkJYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTLCAiJXM6IHVuZnJhZ21lbnRlZCIsIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0JCXJldHVybiBza2I7Ci0JfQotCi0JLyogbG9vayBpZiB3ZSd2ZSBnb3QgYSBjaGFpbiBmb3IgdGhlIHNlbmRlciBhZGRyZXNzLgotCSAgIGFmdGVyd2FyZHMgb3B0ciBwb2ludHMgdG8gZmlyc3QgZnJlZSBvciB0aGUgb2xkZXN0IGVudHJ5LAotCSAgIG9yLCBpZiBpIDwgTlJfUlhfREFUQV9CVUYsIGJwdHIgcG9pbnRzIHRvIHRoZSBlbnRyeSBmb3IgdGhlCi0JICAgc2VuZGVyIGFkZHJlc3MgKi8KLQkvKiBkZXRlcm1pbmluZyB0aGUgb2xkZXN0IGVudHJ5IGRvZXNuJ3QgY29wZSB3aXRoIGppZmZpZXMgd3JhcHBpbmcKLQkgICBidXQgSSBkb24ndCBjYXJlIHRvIGRlbGV0ZSBhIHlvdW5nIGVudHJ5IGF0IHRoZXNlIHJhcmUgbW9tZW50cyAuLi4gKi8KLQotCWJwdHIgPSBwcml2LT5yeF9kYXRhOwotCW9wdHIgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBOUl9SWF9EQVRBX0JVRjsgaSsrLCBicHRyKyspIHsKLQkJaWYgKCFicHRyLT5za2IpIHsKLQkJCW9wdHIgPSBicHRyOwotCQkJb2xkZXN0ID0gMFVMOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjIsIGJwdHItPnNlbmRlcikpCi0JCQlicmVhazsKLQotCQlpZiAoIW9wdHIpIHsKLQkJCW9wdHIgPSBicHRyOwotCQkJb2xkZXN0ID0gYnB0ci0+bGFzdF9yeDsKLQkJfSBlbHNlIGlmIChicHRyLT5sYXN0X3J4IDwgb2xkZXN0KQotCQkJb3B0ciA9IGJwdHI7Ci0JfQotCi0JaWYgKGkgPCBOUl9SWF9EQVRBX0JVRikgewotCi0JCWF0NzZfZGJnKERCR19SWF9GUkFHUywgIiVzOiAlZC4gY2FjaGVlbnRyeSAoc2VxL2ZyYWcgPSAlZC8lZCkgIgotCQkJICJtYXRjaGVkIHNlbmRlciBhZGRyIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGksIGJwdHItPnNlcW5yLCBicHRyLT5mcmFnbnIpOwotCi0JCS8qIGJwdHIgcG9pbnRzIHRvIGFuIGVudHJ5IGZvciB0aGUgc2VuZGVyIGFkZHJlc3MgKi8KLQkJaWYgKGJwdHItPnNlcW5yID09IHNlcW5yKSB7Ci0JCQlpbnQgbGVmdDsKLQkJCS8qIHRoZSBmcmFnbWVudCBoYXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyICovCi0JCQlpZiAoKChicHRyLT5mcmFnbnIgKyAxKSAmIDB4ZikgIT0gZnJhZ25yKSB7Ci0JCQkJLyogd3JvbmcgZnJhZ21lbnQgbnVtYmVyIC0+IGlnbm9yZSBpdCAqLwotCQkJCS8qIGlzICYgMHhmIG5lY2Vzc2FyeSBhYm92ZSA/Pz8gKi8KLQkJCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCQkJCSAiJXM6IGZyYWcgbnIgbWlzbWF0Y2g6ICVkICsgMSAhPSAlZCIsCi0JCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGJwdHItPmZyYWduciwKLQkJCQkJIGZyYWducik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlicHRyLT5sYXN0X3J4ID0gamlmZmllczsKLQkJCS8qIHRoZSBuZXh0IGZvbGxvd2luZyBmcmFnbWVudCBudW1iZXIgLT4KLQkJCSAgIGFkZCB0aGUgZGF0YSBhdCB0aGUgZW5kICovCi0KLQkJCS8qIGZvciB0ZXN0IG9ubHkgPz8/ICovCi0JCQlsZWZ0ID0gc2tiX3RhaWxyb29tKGJwdHItPnNrYik7Ci0JCQlpZiAobGVmdCA8IGRhdGFfbGVuKQotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgICAgIiVzOiBvbmx5ICVkIGJ5dGUgZnJlZSAobmVlZCAlZClcbiIsCi0JCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbGVmdCwgZGF0YV9sZW4pOwotCQkJZWxzZQotCQkJCW1lbWNweShza2JfcHV0KGJwdHItPnNrYiwgZGF0YV9sZW4pLCBkYXRhLAotCQkJCSAgICAgICBkYXRhX2xlbik7Ci0KLQkJCWJwdHItPmZyYWduciA9IGZyYWducjsKLQkJCWlmIChmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGZyYWdtZW50IC0gc2VuZCBpdCAqLwotCQkJc2tiID0gYnB0ci0+c2tiOwotCQkJYnB0ci0+c2tiID0gTlVMTDsJLyogZnJlZSB0aGUgZW50cnkgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywgIiVzOiBsYXN0IGZyYWcgb2Ygc2VxICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzZXFucik7Ci0JCQlyZXR1cm4gc2tiOwotCQl9Ci0KLQkJLyogZ290IGFub3RoZXIgc2VxdWVuY2UgbnVtYmVyICovCi0JCWlmIChmcmFnbnIgPT0gMCkgewotCQkJLyogaXQncyB0aGUgc3RhcnQgb2YgYSBuZXcgY2hhaW4gLSByZXBsYWNlIHRoZQotCQkJICAgb2xkIG9uZSBieSB0aGlzICovCi0JCQkvKiBicHRyLT5zZW5kZXIgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIGFscmVhZHkgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCQkgIiVzOiBzdGFydCBvZiBuZXcgc2VxICVkLCByZW1vdmluZyBvbGQgc2VxICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzZXFuciwgYnB0ci0+c2VxbnIpOwotCQkJYnB0ci0+c2VxbnIgPSBzZXFucjsKLQkJCWJwdHItPmZyYWduciA9IDA7Ci0JCQlicHRyLT5sYXN0X3J4ID0gamlmZmllczsKLQkJCS8qIHN3YXAgYnB0ci0+c2tiIGFuZCBwcml2LT5yeF9za2IgKi8KLQkJCXNrYiA9IGJwdHItPnNrYjsKLQkJCWJwdHItPnNrYiA9IHByaXYtPnJ4X3NrYjsKLQkJCXByaXYtPnJ4X3NrYiA9IHNrYjsKLQkJfSBlbHNlIHsKLQkJCS8qIGl0IGZyb20gdGhlIG1pZGRsZSBvZiBhIG5ldyBjaGFpbiAtPgotCQkJICAgZGVsZXRlIHRoZSBvbGQgZW50cnkgYW5kIHNraXAgdGhlIG5ldyBvbmUgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCQkgIiVzOiBtaWRkbGUgb2YgbmV3IHNlcSAlZCAoJWQpICIKLQkJCQkgInJlbW92aW5nIG9sZCBzZXEgJWQiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHNlcW5yLCBmcmFnbnIsCi0JCQkJIGJwdHItPnNlcW5yKTsKLQkJCWRldl9rZnJlZV9za2IoYnB0ci0+c2tiKTsKLQkJCWJwdHItPnNrYiA9IE5VTEw7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogaWYgd2UgZGlkbid0IGZpbmQgYSBjaGFpbiBmb3IgdGhlIHNlbmRlciBhZGRyZXNzLCBvcHRyCi0JICAgcG9pbnRzIGVpdGhlciB0byB0aGUgZmlyc3QgZnJlZSBvciB0aGUgb2xkZXN0IGVudHJ5ICovCi0KLQlpZiAoZnJhZ25yICE9IDApIHsKLQkJLyogdGhpcyBpcyBub3QgdGhlIGJlZ2luIG9mIGEgZnJhZ21lbnQgY2hhaW4gLi4uICovCi0JCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCSAiJXM6IG5vIGNoYWluIGZvciBub24tZmlyc3QgZnJhZ21lbnQgKCVkKSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFnbnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlCVUdfT04oIW9wdHIpOwotCWlmIChvcHRyLT5za2IpIHsKLQkJLyogc3dhcCB0aGUgc2tiJ3MgKi8KLQkJc2tiID0gb3B0ci0+c2tiOwotCQlvcHRyLT5za2IgPSBwcml2LT5yeF9za2I7Ci0JCXByaXYtPnJ4X3NrYiA9IHNrYjsKLQotCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCQkgIiVzOiBmcmVlIG9sZCBjb250ZW50czogc2VuZGVyICVzIHNlcS9mcmFnICVkLyVkIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIob3B0ci0+c2VuZGVyKSwKLQkJCSBvcHRyLT5zZXFuciwgb3B0ci0+ZnJhZ25yKTsKLQotCX0gZWxzZSB7Ci0JCS8qIHRha2UgdGhlIHNrYiBmcm9tIHByaXYtPnJ4X3NrYiAqLwotCQlvcHRyLT5za2IgPSBwcml2LT5yeF9za2I7Ci0JCS8qIGxldCBhdDc2X3N1Ym1pdF9yeF91cmIoKSBhbGxvY2F0ZSBhIG5ldyBza2IgKi8KLQkJcHJpdi0+cnhfc2tiID0gTlVMTDsKLQotCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsICIlczogdXNlIGEgZnJlZSBlbnRyeSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQl9Ci0JbWVtY3B5KG9wdHItPnNlbmRlciwgaTgwMl8xMV9oZHItPmFkZHIyLCBFVEhfQUxFTik7Ci0Jb3B0ci0+c2VxbnIgPSBzZXFucjsKLQlvcHRyLT5mcmFnbnIgPSAwOwotCW9wdHItPmxhc3RfcnggPSBqaWZmaWVzOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJ4IGludGVycnVwdDogd2UgZXhwZWN0IHRoZSBjb21wbGV0ZSBkYXRhIGJ1ZmZlciBpbiBwcml2LT5yeF9za2IgKi8KLXN0YXRpYyB2b2lkIGF0NzZfcnhfZGF0YShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5yeF9za2I7Ci0Jc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICppODAyXzExX2hkcjsKLQlpbnQgbGVuZ3RoID0gbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKTsKLQotCWF0NzZfZGJnKERCR19SWF9EQVRBLCAiJXMgcmVjZWl2ZWQgZGF0YSBwYWNrZXQ6ICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgaGV4MnN0cihza2ItPmRhdGEsIEFUNzZfUlhfSERSTEVOKSk7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfREFUQV9DT05URU5ULCAicnggcGFja2V0OiAlcyIsCi0JCSBoZXgyc3RyKHNrYi0+ZGF0YSArIEFUNzZfUlhfSERSTEVOLCBsZW5ndGgpKTsKLQotCXNrYiA9IGF0NzZfY2hlY2tfZm9yX3J4X2ZyYWdzKHByaXYpOwotCWlmICghc2tiKQotCQlyZXR1cm47Ci0KLQkvKiBBdG1lbCBoZWFkZXIgYW5kIHRoZSBGQ1MgYXJlIGFscmVhZHkgcmVtb3ZlZCAqLwotCWk4MDJfMTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiLT5kYXRhOwotCi0Jc2tiLT5kZXYgPSBuZXRkZXY7Ci0Jc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwkvKiBUT0RPOiBzaG91bGQgY2hlY2sgQ1JDICovCi0KLQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaTgwMl8xMV9oZHItPmFkZHIxKSkgewotCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjEsIG5ldGRldi0+YnJvYWRjYXN0KSkKLQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOwotCQllbHNlCi0JCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX01VTFRJQ0FTVDsKLQl9IGVsc2UgaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjEsIG5ldGRldi0+ZGV2X2FkZHIpKQotCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKLQotCWF0NzZfaWVlZTgwMjExX3RvX2V0aChza2IsIHByaXYtPml3X21vZGUpOwotCi0JbmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQluZXRpZl9yeChza2IpOwotCXN0YXRzLT5yeF9wYWNrZXRzKys7Ci0Jc3RhdHMtPnJ4X2J5dGVzICs9IGxlbmd0aDsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tb25pdG9yX21vZGUoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCAqcnQ7Ci0JdTggKnBheWxvYWQ7Ci0JaW50IHNrYmxlbjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OwotCXN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmID0KLQkgICAgKHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqKXByaXYtPnJ4X3NrYi0+ZGF0YTsKLQkvKiBsZW5ndGggaW5jbHVkaW5nIHRoZSBJRUVFODAyLjExIGhlYWRlciBhbmQgdGhlIHRyYWlsaW5nIEZDUywKLQkgICBidXQgbm90IGF0NzZfcnhfYnVmZmVyICovCi0JaW50IGxlbmd0aCA9IGxlMTZfdG9fY3B1KGJ1Zi0+d2xlbmd0aCk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnJ4X3NrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7Ci0KLQlpZiAobGVuZ3RoIDwgSUVFRTgwMjExX0ZDU19MRU4pIHsKLQkJLyogYnVmZmVyIGNvbnRhaW5zIG5vIGRhdGEgKi8KLQkJYXQ3Nl9kYmcoREJHX01PTklUT1JfTU9ERSwKLQkJCSAiJXM6IE1PTklUT1IgTU9ERTogcnggc2tiIHdpdGhvdXQgZGF0YSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXNrYmxlbiA9IHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCkgKyBsZW5ndGg7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYmxlbik7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogTU9OSVRPUiBNT0RFOiBkZXZfYWxsb2Nfc2tiIGZvciByYWRpb3RhcCAiCi0JCSAgICAgICAiaGVhZGVyIHJldHVybmVkIE5VTExcbiIsIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlza2JfcHV0KHNrYiwgc2tibGVuKTsKLQotCXJ0ID0gKHN0cnVjdCBhdDc2X3J4X3JhZGlvdGFwICopc2tiLT5kYXRhOwotCXBheWxvYWQgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGF0NzZfcnhfcmFkaW90YXApOwotCi0JcnQtPnJ0X2hkci5pdF92ZXJzaW9uID0gMDsKLQlydC0+cnRfaGRyLml0X3BhZCA9IDA7Ci0JcnQtPnJ0X2hkci5pdF9sZW4gPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGF0NzZfcnhfcmFkaW90YXApKTsKLQlydC0+cnRfaGRyLml0X3ByZXNlbnQgPSBjcHVfdG9fbGUzMihBVDc2X1JYX1JBRElPVEFQX1BSRVNFTlQpOwotCi0JcnQtPnJ0X3RzZnQgPSBjcHVfdG9fbGU2NChsZTMyX3RvX2NwdShidWYtPnJ4X3RpbWUpKTsKLQlydC0+cnRfcmF0ZSA9IGh3X3JhdGVzW2J1Zi0+cnhfcmF0ZV0gJiAofjB4ODApOwotCXJ0LT5ydF9zaWduYWwgPSBidWYtPnJzc2k7Ci0JcnQtPnJ0X25vaXNlID0gYnVmLT5ub2lzZV9sZXZlbDsKLQlydC0+cnRfZmxhZ3MgPSBJRUVFODAyMTFfUkFESU9UQVBfRl9GQ1M7Ci0JaWYgKGJ1Zi0+ZnJhZ21lbnRhdGlvbikKLQkJcnQtPnJ0X2ZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9GX0ZSQUc7Ci0KLQltZW1jcHkocGF5bG9hZCwgYnVmLT5wYWNrZXQsIGxlbmd0aCk7Ci0Jc2tiLT5kZXYgPSBuZXRkZXY7Ci0Jc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0Jc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0Jc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKLQotCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JbmV0aWZfcngoc2tiKTsKLQlzdGF0cy0+cnhfcGFja2V0cysrOwotCXN0YXRzLT5yeF9ieXRlcyArPSBsZW5ndGg7Ci19Ci0KLS8qIENoZWNrIGlmIHdlIHNweSBvbiB0aGUgc2VuZGVyIGFkZHJlc3MgaW4gYnVmIGFuZCB1cGRhdGUgc3RhdHMgKi8KLXN0YXRpYyB2b2lkIGF0NzZfaXdzcHlfdXBkYXRlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmLT5wYWNrZXQ7Ci0Jc3RydWN0IGl3X3F1YWxpdHkgcXVhbDsKLQotCS8qIFdlIGNhbiBvbmx5IHNldCB0aGUgbGV2ZWwgaGVyZSAqLwotCXF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9JTlZBTElEIHwgSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCXF1YWwubGV2ZWwgPSAwOwotCXF1YWwubm9pc2UgPSAwOwotCWF0NzZfY2FsY19sZXZlbChwcml2LCBidWYsICZxdWFsKTsKLQotCXNwaW5fbG9ja19iaCgmcHJpdi0+c3B5X3NwaW5sb2NrKTsKLQotCWlmIChwcml2LT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkKLQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShwcml2LT5uZXRkZXYsIGhkci0+YWRkcjIsICZxdWFsKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotfQotCiBzdGF0aWMgdm9pZCBhdDc2X3J4X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKIAlzdHJ1Y3QgdXJiICp1cmIgPSAoc3RydWN0IHVyYiAqKXBhcmFtOwogCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKIAlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaTgwMl8xMV9oZHI7Ci0JdTE2IGZyYW1lX2N0bDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXMgPSB7IDAgfTsKIAogCWlmIChwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7CiAJCWF0NzZfZGJnKERCR19ERVZTVEFSVCwgImRldmljZSB1bnBsdWdnZWQiKTsKQEAgLTQ5OTAsNjMgKzE2MjUsNDQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghcHJpdi0+cnhfc2tiIHx8ICFuZXRkZXYgfHwgIXByaXYtPnJ4X3NrYi0+ZGF0YSkKKwlpZiAoIXByaXYtPnJ4X3NrYiB8fCAhcHJpdi0+cnhfc2tiLT5kYXRhKQogCQlyZXR1cm47CiAKIAlidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopcHJpdi0+cnhfc2tiLT5kYXRhOwogCi0JaTgwMl8xMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWYtPnBhY2tldDsKLQotCWZyYW1lX2N0bCA9IGxlMTZfdG9fY3B1KGk4MDJfMTFfaGRyLT5mcmFtZV9jdGwpOwotCiAJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKIAkJaWYgKHVyYi0+c3RhdHVzICE9IC1FTk9FTlQgJiYgdXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCiAJCQlhdDc2X2RiZyhEQkdfVVJCLAogCQkJCSAiJXMgJXM6IC0gbm9uemVybyBSeCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJCSBfX2Z1bmNfXywgbmV0ZGV2LT5uYW1lLCB1cmItPnN0YXR1cyk7CisJCQkJIF9fZnVuY19fLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCisJCQkJIHVyYi0+c3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCWF0NzZfZGJnKERCR19SWF9BVE1FTF9IRFIsCi0JCSAiJXM6IHJ4IGZyYW1lOiByYXRlICVkIHJzc2kgJWQgbm9pc2UgJWQgbGluayAlZCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIGJ1Zi0+cnhfcmF0ZSwgYnVmLT5yc3NpLCBidWYtPm5vaXNlX2xldmVsLAotCQkgYnVmLT5saW5rX3F1YWxpdHksIGhleDJzdHIoaTgwMl8xMV9oZHIsIDQ4KSk7Ci0JaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7Ci0JCWF0NzZfcnhfbW9uaXRvcl9tb2RlKHByaXYpOwotCQlnb3RvIGV4aXQ7Ci0JfQorCQkgIiVzOiByeCBmcmFtZTogcmF0ZSAlZCByc3NpICVkIG5vaXNlICVkIGxpbmsgJWQiLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBidWYtPnJ4X3JhdGUsIGJ1Zi0+cnNzaSwKKwkJIGJ1Zi0+bm9pc2VfbGV2ZWwsIGJ1Zi0+bGlua19xdWFsaXR5KTsKIAotCS8qIHRoZXJlIGlzIGEgbmV3IGJzc2lkIGFyb3VuZCwgYWNjZXB0IGl0OiAqLwotCWlmIChidWYtPm5ld2JzcyAmJiBwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiJXM6IHJ4IG5ld2JzcyIsIG5ldGRldi0+bmFtZSk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfbmV3X2Jzcyk7Ci0JfQorCXNrYl90cmltKHByaXYtPnJ4X3NrYiwgbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKSArIEFUNzZfUlhfSERSTEVOKTsKKwlhdDc2X2RiZ19kdW1wKERCR19SWF9EQVRBLCAmcHJpdi0+cnhfc2tiLT5kYXRhW0FUNzZfUlhfSERSTEVOXSwKKwkJICAgICAgcHJpdi0+cnhfc2tiLT5sZW4sICJSWDogbGVuPSVkIiwKKwkJICAgICAgKGludCkocHJpdi0+cnhfc2tiLT5sZW4gLSBBVDc2X1JYX0hEUkxFTikpOwogCi0Jc3dpdGNoIChmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgewotCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6Ci0JCWF0NzZfcnhfZGF0YShwcml2KTsKLQkJYnJlYWs7CisJcnhfc3RhdHVzLnNpZ25hbCA9IGJ1Zi0+cnNzaTsKKwkvKiBGSVhNRTogaXMgcmF0ZV9pZHggc3RpbGwgcHJlc2VudCBpbiBzdHJ1Y3R1cmU/ICovCisJcnhfc3RhdHVzLnJhdGVfaWR4ID0gYnVmLT5yeF9yYXRlOworCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOworCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSVZfU1RSSVBQRUQ7CiAKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgotCQkvKiBqYWw6IFRPRE86IGZpbmQgb3V0IGlmIHdlIGNhbiB1cGRhdGUgaXdzcHkgYWxzbyBvbgotCQkgICBvdGhlciBmcmFtZXMgdGhhbiBtYW5hZ2VtZW50IChtaWdodCBkZXBlbmQgb24gdGhlCi0JCSAgIHJhZGlvIGNoaXAgLyBmaXJtd2FyZSB2ZXJzaW9uICEpICovCisJc2tiX3B1bGwocHJpdi0+cnhfc2tiLCBBVDc2X1JYX0hEUkxFTik7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiY2FsbGluZyBpZWVlODAyMTFfcnhfaXJxc2FmZSgpOiAlZC8lZCIsCisJCSBwcml2LT5yeF9za2ItPmxlbiwgcHJpdi0+cnhfc2tiLT5kYXRhX2xlbik7CisJaWVlZTgwMjExX3J4X2lycXNhZmUocHJpdi0+aHcsIHByaXYtPnJ4X3NrYiwgJnJ4X3N0YXR1cyk7CiAKLQkJYXQ3Nl9pd3NweV91cGRhdGUocHJpdiwgYnVmKTsKKwkvKiBVc2UgYSBuZXcgc2tiIGZvciB0aGUgbmV4dCByZWNlaXZlICovCisJcHJpdi0+cnhfc2tiID0gTlVMTDsKIAotCQlhdDc2X3J4X21nbXQocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCWF0NzZfZGJnKERCR19SWF9DVFJMLCAiJXM6IGlnbm9yZWQgY3RybCBmcmFtZTogJTA0eCIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZV9jdGwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogaWdub3JpbmcgZnJhbWUgd2l0aCBmcmFtZWN0bCAweCUwNHhcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lX2N0bCk7Ci0JfQotZXhpdDoKIAlhdDc2X3N1Ym1pdF9yeF91cmIocHJpdik7CiB9CiAKQEAgLTUwNzMsNyArMTY4OSw3IEBACiAJCQkgICBmd2UtPmZ3bmFtZSk7CiAJCWRldl9wcmludGsoS0VSTl9FUlIsICZ1ZGV2LT5kZXYsCiAJCQkgICAieW91IG1heSBuZWVkIHRvIGRvd25sb2FkIHRoZSBmaXJtd2FyZSBmcm9tICIKLQkJCSAgICJodHRwOi8vZGV2ZWxvcGVyLmJlcmxpb3MuZGUvcHJvamVjdHMvYXQ3NmM1MDNhLyIpOworCQkJICAgImh0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0cy9hdDc2YzUwM2EvXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNTEyNiw1NiArMTc0Miw2MjggQEAKIAkJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIGF0NzZfbWFjODAyMTFfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eF9za2IpOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJLyogRklYTUU6CisJCSAqIGlzIHRoZSBmcmFtZSByZWFsbHkgQUNLZWQgd2hlbiB0eF9jYWxsYmFjayBpcyBjYWxsZWQgPyAqLworCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CisJCWJyZWFrOworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FQ09OTlJFU0VUOgorCQkvKiBmYWlsLCB1cmIgaGFzIGJlZW4gdW5saW5rZWQgKi8KKwkJLyogRklYTUU6IGFkZCBlcnJvciBtZXNzYWdlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWF0NzZfZGJnKERCR19VUkIsICIlcyAtIG5vbnplcm8gdHggc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKKworCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShwcml2LT5odywgcHJpdi0+dHhfc2tiKTsKKworCXByaXYtPnR4X3NrYiA9IE5VTEw7CisKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworfQorCitzdGF0aWMgaW50IGF0NzZfbWFjODAyMTFfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqdHhfYnVmZmVyID0gcHJpdi0+YnVsa19vdXRfYnVmZmVyOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlpbnQgcGFkZGluZywgc3VibWl0X2xlbiwgcmV0OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCWlmIChwcml2LT50eF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgY2FsbGVkIHdoaWxlIHR4IHVyYiBpcyBwZW5kaW5nXG4iLAorCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBfX2Z1bmNfXyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOworCisJYXQ3Nl9sZWR0cmlnX3R4X2FjdGl2aXR5KCk7CS8qIHRlbGwgbGVkdHJpZ2dlciB3ZSBzZW5kIGEgcGFja2V0ICovCisKKwlXQVJOX09OKHByaXYtPnR4X3NrYiAhPSBOVUxMKTsKKworCXByaXYtPnR4X3NrYiA9IHNrYjsKKwlwYWRkaW5nID0gYXQ3Nl9jYWxjX3BhZGRpbmcoc2tiLT5sZW4pOworCXN1Ym1pdF9sZW4gPSBBVDc2X1RYX0hEUkxFTiArIHNrYi0+bGVuICsgcGFkZGluZzsKKworCS8qIHNldHVwICdBdG1lbCcgaGVhZGVyICovCisJbWVtc2V0KHR4X2J1ZmZlciwgMCwgc2l6ZW9mKCp0eF9idWZmZXIpKTsKKwl0eF9idWZmZXItPnBhZGRpbmcgPSBwYWRkaW5nOworCXR4X2J1ZmZlci0+d2xlbmd0aCA9IGNwdV90b19sZTE2KHNrYi0+bGVuKTsKKwl0eF9idWZmZXItPnR4X3JhdGUgPSBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIGluZm8pLT5od192YWx1ZTsKKwlpZiAoRklSTVdBUkVfSVNfV1BBKHByaXYtPmZ3X3ZlcnNpb24pICYmIGluZm8tPmNvbnRyb2wuaHdfa2V5KSB7CisJCXR4X2J1ZmZlci0+a2V5X2lkID0gKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5rZXlpZHgpOworCQl0eF9idWZmZXItPmNpcGhlcl90eXBlID0KKwkJCXByaXYtPmtleXNbaW5mby0+Y29udHJvbC5od19rZXktPmtleWlkeF0uY2lwaGVyOworCQl0eF9idWZmZXItPmNpcGhlcl9sZW5ndGggPQorCQkJcHJpdi0+a2V5c1tpbmZvLT5jb250cm9sLmh3X2tleS0+a2V5aWR4XS5rZXlsZW47CisJCXR4X2J1ZmZlci0+cmVzZXJ2ZWQgPSAwOworCX0gZWxzZSB7CisJCXR4X2J1ZmZlci0+a2V5X2lkID0gMDsKKwkJdHhfYnVmZmVyLT5jaXBoZXJfdHlwZSA9IDA7CisJCXR4X2J1ZmZlci0+Y2lwaGVyX2xlbmd0aCA9IDA7CisJCXR4X2J1ZmZlci0+cmVzZXJ2ZWQgPSAwOworCX07CisJLyogbWVtc2V0KHR4X2J1ZmZlci0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eF9idWZmZXItPnJlc2VydmVkKSk7ICovCisJbWVtY3B5KHR4X2J1ZmZlci0+cGFja2V0LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCWF0NzZfZGJnKERCR19UWF9EQVRBLCAiJXMgdHg6IHdsZW4gMHgleCBwYWQgMHgleCByYXRlICVkIGhkciIsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGxlMTZfdG9fY3B1KHR4X2J1ZmZlci0+d2xlbmd0aCksCisJCSB0eF9idWZmZXItPnBhZGRpbmcsIHR4X2J1ZmZlci0+dHhfcmF0ZSk7CisKKwkvKiBzZW5kIHN0dWZmICovCisJYXQ3Nl9kYmdfZHVtcChEQkdfVFhfREFUQV9DT05URU5ULCB0eF9idWZmZXIsIHN1Ym1pdF9sZW4sCisJCSAgICAgICIlcygpOiB0eF9idWZmZXIgJWQgYnl0ZXM6IiwgX19mdW5jX18sIHN1Ym1pdF9sZW4pOworCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwgdHhfYnVmZmVyLAorCQkJICBzdWJtaXRfbGVuLCBhdDc2X21hYzgwMjExX3R4X2NhbGxiYWNrLCBwcml2KTsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgaW4gdHggc3VibWl0IHVyYjogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCWlmIChyZXQgPT0gLUVJTlZBTCkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogLUVJTlZBTDogdHggdXJiICVwIGhjcHJpdiAlcCBjb21wbGV0ZSAlcFxuIiwKKwkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHByaXYtPnR4X3VyYiwKKwkJCSAgICAgICBwcml2LT50eF91cmItPmhjcHJpdiwgcHJpdi0+dHhfdXJiLT5jb21wbGV0ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9tYWM4MDIxMV9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IHJldDsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJcmV0ID0gYXQ3Nl9zdWJtaXRfcnhfdXJiKHByaXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9wZW46IHN1Ym1pdF9yeF91cmIgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlhdDc2X3N0YXJ0dXBfZGV2aWNlKHByaXYpOworCisJYXQ3Nl9zdGFydF9tb25pdG9yKHByaXYpOworCitlcnJvcjoKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9tYWM4MDIxMV9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJaWYgKCFwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7CisJCS8qIFdlIGFyZSBjYWxsZWQgYnkgImlmY29uZmlnIGV0aFggZG93biIsIG5vdCBiZWNhdXNlIHRoZQorCQkgKiBkZXZpY2UgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlLiAqLworCQlpZiAoYXQ3Nl9zZXRfcmFkaW8ocHJpdiwgMCkgPT0gMSkKKwkJCWF0NzZfd2FpdF9jb21wbGV0aW9uKHByaXYsIENNRF9SQURJT19PTik7CisKKwkJLyogV2UgdW5saW5rIHJ4X3VyYiBiZWNhdXNlIGF0NzZfb3BlbigpIHJlLXN1Ym1pdHMgaXQuCisJCSAqIElmIHVucGx1Z2dlZCwgYXQ3Nl9kZWxldGVfZGV2aWNlKCkgdGFrZXMgY2FyZSBvZiBpdC4gKi8KKwkJdXNiX2tpbGxfdXJiKHByaXYtPnJ4X3VyYik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOworfQorCitzdGF0aWMgaW50IGF0NzZfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJc3dpdGNoIChjb25mLT50eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCBhdDc2X2pvaW4oc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgYXQ3Nl9yZXFfam9pbiBqb2luOworCWludCByZXQ7CisKKwltZW1zZXQoJmpvaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfam9pbikpOworCW1lbWNweShqb2luLmVzc2lkLCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfc2l6ZSk7CisJam9pbi5lc3NpZF9zaXplID0gcHJpdi0+ZXNzaWRfc2l6ZTsKKwltZW1jcHkoam9pbi5ic3NpZCwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKKwlqb2luLmJzc190eXBlID0gSU5GUkFTVFJVQ1RVUkVfTU9ERTsKKwlqb2luLmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOworCWpvaW4udGltZW91dCA9IGNwdV90b19sZTE2KDIwMDApOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IHNlbmRpbmcgQ01EX0pPSU4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9KT0lOLCAmam9pbiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X3NldF9jYXJkX2NvbW1hbmQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX0pPSU4pOworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzOiBDTURfSk9JTiByZXR1cm5lZDogMHglMDJ4IiwgX19mdW5jX18sIHJldCk7CisJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfd2FpdF9jb21wbGV0aW9uIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXJldHVybiAwOworCX0KKworCWF0NzZfc2V0X3RraXBfYnNzaWQocHJpdiwgcHJpdi0+YnNzaWQpOworCWF0NzZfc2V0X3BtX21vZGUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19od19zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCisJCQkJCSAgICAgIGR3b3JrX2h3X3NjYW4ud29yayk7CisJaW50IHJldDsKKworCXJldCA9IGF0NzZfZ2V0X2NtZF9zdGF0dXMocHJpdi0+dWRldiwgQ01EX1NDQU4pOworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzOiBDTURfU0NBTiBzdGF0dXMgMHglMDJ4IiwgX19mdW5jX18sIHJldCk7CisKKwkvKiBGSVhNRTogYWRkIG1heGltdW0gdGltZSBmb3Igc2NhbiB0byBjb21wbGV0ZSAqLworCisJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5ody0+d29ya3F1ZXVlLCAmcHJpdi0+ZHdvcmtfaHdfc2NhbiwKKwkJCQkgICBTQ0FOX1BPTExfSU5URVJWQUwpOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHByaXYtPmh3KTsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmJzc2lkKSkgeworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCQlhdDc2X2pvaW4ocHJpdik7CisJfQorCisJaWVlZTgwMjExX3dha2VfcXVldWVzKHByaXYtPmh3KTsKKworZXhpdDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqc3NpZCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGF0NzZfcmVxX3NjYW4gc2NhbjsKKwlpbnQgcmV0OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKToiLCBfX2Z1bmNfXyk7CisJYXQ3Nl9kYmdfZHVtcChEQkdfTUFDODAyMTEsIHNzaWQsIGxlbiwgInNzaWQgJXpkIGJ5dGVzOiIsIGxlbik7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJaWVlZTgwMjExX3N0b3BfcXVldWVzKGh3KTsKKworCW1lbXNldCgmc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9zY2FuKSk7CisJbWVtc2V0KHNjYW4uYnNzaWQsIDB4RkYsIEVUSF9BTEVOKTsKKwlzY2FuLnNjYW5fdHlwZSA9IFNDQU5fVFlQRV9BQ1RJVkU7CisJaWYgKHByaXYtPmVzc2lkX3NpemUgPiAwKSB7CisJCW1lbWNweShzY2FuLmVzc2lkLCBzc2lkLCBsZW4pOworCQlzY2FuLmVzc2lkX3NpemUgPSBsZW47CisJfQorCXNjYW4ubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWluX3RpbWUpOworCXNjYW4ubWF4X2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWF4X3RpbWUpOworCXNjYW4ucHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUxNihwcml2LT5zY2FuX21pbl90aW1lICogMTAwMCk7CisJc2Nhbi5pbnRlcm5hdGlvbmFsX3NjYW4gPSAwOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IHNlbmRpbmcgQ01EX1NDQU4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9TQ0FOLCAmc2Nhbiwgc2l6ZW9mKHNjYW4pKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWVycigiQ01EX1NDQU4gZmFpbGVkOiAlZCIsIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHctPndvcmtxdWV1ZSwgJnByaXYtPmR3b3JrX2h3X3NjYW4sCisJCQkgICBTQ0FOX1BPTExfSU5URVJWQUwpOworCitleGl0OgorCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0NzZfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY2hhbm5lbCAlZCByYWRpbyAlZCIsCisJCSBfX2Z1bmNfXywgY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWUsIGNvbmYtPnJhZGlvX2VuYWJsZWQpOworCWF0NzZfZGJnX2R1bXAoREJHX01BQzgwMjExLCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfc2l6ZSwgInNzaWQ6Iik7CisJYXQ3Nl9kYmdfZHVtcChEQkdfTUFDODAyMTEsIHByaXYtPmJzc2lkLCBFVEhfQUxFTiwgImJzc2lkOiIpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKKworCXByaXYtPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsLT5od192YWx1ZTsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmJzc2lkKSkgeworCQlhdDc2X2pvaW4ocHJpdik7CisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhwcml2LT5odyk7CisJfSBlbHNlIHsKKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKKwkJYXQ3Nl9zdGFydF9tb25pdG9yKHByaXYpOworCX07CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDc2X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfaWZfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlhdDc2X2RiZ19kdW1wKERCR19NQUM4MDIxMSwgY29uZi0+YnNzaWQsIEVUSF9BTEVOLCAiYnNzaWQ6Iik7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJbWVtY3B5KHByaXYtPmJzc2lkLCBjb25mLT5ic3NpZCwgRVRIX0FMRU4pOworLy8JbWVtY3B5KHByaXYtPmVzc2lkLCBjb25mLT5zc2lkLCBjb25mLT5zc2lkX2xlbik7CisvLwlwcml2LT5lc3NpZF9zaXplID0gY29uZi0+c3NpZF9sZW47CisKKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihwcml2LT5ic3NpZCkpIHsKKwkJLyogbWFjODAyMTEgaXMgam9pbmluZyBhIGJzcyAqLworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCQlhdDc2X2pvaW4ocHJpdik7CisJfSBlbHNlCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhwcml2LT5odyk7CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogbXVzdCBiZSBhdG9taWMgKi8KK3N0YXRpYyB2b2lkIGF0NzZfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJCSAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgaW50IG1jX2NvdW50LAorCQkJCSAgc3RydWN0IGRldl9hZGRyX2xpc3QgKm1jX2xpc3QpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCBmbGFnczsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCk6IGNoYW5nZWRfZmxhZ3M9MHglMDh4ICIKKwkJICJ0b3RhbF9mbGFncz0weCUwOHggbWNfY291bnQ9JWQiLAorCQkgX19mdW5jX18sIGNoYW5nZWRfZmxhZ3MsICp0b3RhbF9mbGFncywgbWNfY291bnQpOworCisJZmxhZ3MgPSBjaGFuZ2VkX2ZsYWdzICYgQVQ3Nl9TVVBQT1JURURfRklMVEVSUzsKKwkqdG90YWxfZmxhZ3MgPSBBVDc2X1NVUFBPUlRFRF9GSUxURVJTOworCisJLyogRklYTUU6IGFjY2VzcyB0byBwcml2LT5wcm9taXNjIHNob3VsZCBiZSBwcm90ZWN0ZWQgd2l0aAorCSAqIHByaXYtPm10eCwgYnV0IGl0J3MgaW1wb3NzaWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUKKwkgKiBhdG9taWMgKi8KKworCWlmIChmbGFncyAmJiAhcHJpdi0+cHJvbWlzYykgeworCQkvKiBtYWM4MDIxMSB3YW50cyB1cyB0byBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlwcml2LT5wcm9taXNjID0gMTsKKwl9IGVsc2UgaWYgKCFmbGFncyAmJiBwcml2LT5wcm9taXNjKSB7CisJCS8qIHdlIG5lZWQgdG8gZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCXByaXYtPnByb21pc2MgPSAwOworCX0gZWxzZQorCQlyZXR1cm47CisKKwlxdWV1ZV93b3JrKGh3LT53b3JrcXVldWUsICZwcml2LT53b3JrX3NldF9wcm9taXNjKTsKK30KKworc3RhdGljIGludCBhdDc2X3NldF9rZXlfb2xkZncoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkJY29uc3QgdTggKmxvY2FsX2FkZHJlc3MsIGNvbnN0IHU4ICphZGRyZXNzLAorCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWludCBpOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY21kICVkIGtleS0+YWxnICVkIGtleS0+a2V5aWR4ICVkICIKKwkJICJrZXktPmtleWxlbiAlZCIsCisJCSBfX2Z1bmNfXywgY21kLCBrZXktPmFsZywga2V5LT5rZXlpZHgsIGtleS0+a2V5bGVuKTsKKworCWlmIChrZXktPmFsZyAhPSBBTEdfV0VQKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlrZXktPmh3X2tleV9pZHggPSBrZXktPmtleWlkeDsKKworCW11dGV4X2xvY2soJnByaXYtPm10eCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VUX0tFWToKKwkJbWVtY3B5KHByaXYtPndlcF9rZXlzW2tleS0+a2V5aWR4XSwga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKwkJcHJpdi0+d2VwX2tleXNfbGVuW2tleS0+a2V5aWR4XSA9IGtleS0+a2V5bGVuOworCisJCS8qIEZJWE1FOiBmaW5kIG91dCBob3cgdG8gZG8gdGhpcyBwcm9wZXJseSAqLworCQlwcml2LT53ZXBfa2V5X2lkID0ga2V5LT5rZXlpZHg7CisKKwkJYnJlYWs7CisJY2FzZSBESVNBQkxFX0tFWToKKwlkZWZhdWx0OgorCQlwcml2LT53ZXBfa2V5c19sZW5ba2V5LT5rZXlpZHhdID0gMDsKKwkJYnJlYWs7CisJfQorCisJcHJpdi0+d2VwX2VuYWJsZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKKwkJaWYgKHByaXYtPndlcF9rZXlzX2xlbltpXSAhPSAwKQorCQkJcHJpdi0+d2VwX2VuYWJsZWQgPSAxOworCX0KKworCWF0NzZfc3RhcnR1cF9kZXZpY2UocHJpdik7CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDc2X3NldF9rZXlfbmV3Zncoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkJY29uc3QgdTggKmxvY2FsX2FkZHJlc3MsIGNvbnN0IHU4ICphZGRyZXNzLAorCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpOiBjbWQgJWQga2V5LT5hbGcgJWQga2V5LT5rZXlpZHggJWQgIgorCQkgImtleS0+a2V5bGVuICVkIiwKKwkJIF9fZnVuY19fLCBjbWQsIGtleS0+YWxnLCBrZXktPmtleWlkeCwga2V5LT5rZXlsZW4pOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKKworCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfRU5DUllQVElPTjsKKworCWlmIChjbWQgPT0gRElTQUJMRV9LRVkpIHsKKwkJcHJpdi0+bWliX2J1Zi5zaXplID0gQ0lQSEVSX0tFWV9MRU47CisJCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uLAorCQkJCWNpcGhlcl9kZWZhdWx0X2tleXZhbHVlW2tleS0+a2V5aWR4XSk7CisJCW1lbXNldChwcml2LT5taWJfYnVmLmRhdGEuZGF0YSwgMCwgQ0lQSEVSX0tFWV9MRU4pOworCQlpZiAoYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKSAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7IC8qIC1FSU8gd291bGQgYmUgcHJvYmFibHkgYmV0dGVyICovCisJCWVsc2UgeworCisJCQlwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5jaXBoZXIgPSBDSVBIRVJfTk9ORTsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmtleWxlbiA9IDA7CisJCX07CisJCWlmIChwcml2LT5kZWZhdWx0X2dyb3VwX2tleSA9PSBrZXktPmtleWlkeCkKKwkJCXByaXYtPmRlZmF1bHRfZ3JvdXBfa2V5ID0gMHhmZjsKKworCQlpZiAocHJpdi0+ZGVmYXVsdF9wYWlyd2lzZV9rZXkgPT0ga2V5LT5rZXlpZHgpCisJCQlwcml2LT5kZWZhdWx0X3BhaXJ3aXNlX2tleSA9IDB4ZmY7CisJCS8qIElmIGRlZmF1bHQgcGFpcndpc2Uga2V5IGlzIHJlbW92ZWQsIGZhbGwgYmFjayB0bworCQkgKiBncm91cCBrZXk/ICovCisJCXJldCA9IDA7CisJCWdvdG8gZXhpdDsKKwl9OworCisJaWYgKGNtZCA9PSBTRVRfS0VZKSB7CisJCS8qIHN0b3JlIGtleSBpbnRvIE1JQiAqLworCQlwcml2LT5taWJfYnVmLnNpemUgPSBDSVBIRVJfS0VZX0xFTjsKKwkJcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24sCisJCQkJY2lwaGVyX2RlZmF1bHRfa2V5dmFsdWVba2V5LT5rZXlpZHhdKTsKKwkJbWVtc2V0KHByaXYtPm1pYl9idWYuZGF0YS5kYXRhLCAwLCBDSVBIRVJfS0VZX0xFTik7CisJCW1lbWNweShwcml2LT5taWJfYnVmLmRhdGEuZGF0YSwga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKworCQlzd2l0Y2ggKGtleS0+YWxnKSB7CisJCWNhc2UgQUxHX1dFUDoKKwkJCWlmIChrZXktPmtleWxlbiA9PSA1KSB7CisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyID0KKwkJCQkJQ0lQSEVSX1dFUDY0OworCQkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmtleWxlbiA9IDg7CisJCQl9IGVsc2UgaWYgKGtleS0+a2V5bGVuID09IDEzKSB7CisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyID0KKwkJCQkJQ0lQSEVSX1dFUDEyODsKKwkJCQkvKiBGaXJtd2FyZSBuZWVkcyB0aGlzICovCisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gODsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBleGl0OworCQkJfTsKKwkJCWJyZWFrOworCQljYXNlIEFMR19US0lQOgorCQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmNpcGhlciA9IENJUEhFUl9US0lQOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gMTI7CisJCQlicmVhazsKKworCQljYXNlIEFMR19DQ01QOgorCQkJaWYgKCFhdDc2X2lzXzUwNWEocHJpdi0+Ym9hcmRfdHlwZSkpIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9OworCQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmNpcGhlciA9IENJUEhFUl9DQ01QOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gMTY7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGV4aXQ7CisJCX07CisKKwkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMzhdID0gcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyOworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gPSAxOyAvKiBUYWtlbiBmcm9tIGF0bWVsd2xhbmRyaXZlciwKKwkJCQkJCSAgICBub3QgZG9jdW1lbnRlZCAqLworCisJCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJLyogUGFpcndpc2Uga2V5ICovCisJCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gfD0gKEtFWV9QQUlSV0lTRSB8IEtFWV9UWCk7CisJCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJLyogR3JvdXAga2V5ICovCisJCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gfD0gKEtFWV9UWCk7CisJCWVsc2UJLyogS2V5IHVzZWQgb25seSBmb3IgdHJhbnNtaXNzaW9uID8/PyAqLworCQkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMzldIHw9IChLRVlfVFgpOworCisJCWlmIChhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpICE9CisJCQkJQ01EX1NUQVRVU19DT01QTEVURSkgeworCQkJcmV0ID0gLUVPUE5PVFNVUFA7IC8qIC1FSU8gd291bGQgYmUgcHJvYmFibHkgYmV0dGVyICovCisJCQlnb3RvIGV4aXQ7CisJCX07CisKKwkJaWYgKChrZXktPmFsZyA9PSBBTEdfVEtJUCkgfHwgKGtleS0+YWxnID09IEFMR19DQ01QKSkKKwkJCWF0NzZfcmVzZXRfcnNjKHByaXYpOworCisJCWtleS0+aHdfa2V5X2lkeCA9IGtleS0+a2V5aWR4OworCisJCS8qIFNldCB1cCBkZWZhdWx0IGtleXMgKi8KKwkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJcHJpdi0+ZGVmYXVsdF9ncm91cF9rZXkgPSBrZXktPmtleWlkeDsKKwkJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkcmVzcykpCisJCQlwcml2LT5kZWZhdWx0X3BhaXJ3aXNlX2tleSA9IGtleS0+a2V5aWR4OworCisJCS8qIFNldCB1cCBlbmNyeXB0aW9uIE1JQnMgKi8KKworCQkvKiBmaXJzdCBibG9jayBvZiBzZXR0aW5ncyAqLworCQlwcml2LT5taWJfYnVmLnNpemUgPSAzOworCQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiwKKwkJCQlwcml2YWN5X2ludm9rZWQpOworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVswXSA9IDE7CS8qIHByaXZhY3lfaW52b2tlZCAqLworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsxXSA9IHByaXYtPmRlZmF1bHRfcGFpcndpc2Vfa2V5OworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsyXSA9IHByaXYtPmRlZmF1bHRfZ3JvdXBfa2V5OworCisJCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CisJCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkKKwkJCWdvdG8gZXhpdDsKKworCQkvKiBzZWNvbmQgYmxvY2sgb2Ygc2V0dGluZ3MgKi8KKwkJcHJpdi0+bWliX2J1Zi5zaXplID0gMzsKKwkJcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24sCisJCQkJZXhjbHVkZV91bmVuY3J5cHRlZCk7CisJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzBdID0gMTsJLyogZXhjbHVkZV91bmVuY3J5cHRlZCAqLworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsxXSA9IDA7CS8qIHdlcF9lbmNyeXB0aW9uX3R5cGUgKi8KKwkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMl0gPSAwOwkvKiBja2lwX2tleV9wZXJtdXRhdGlvbiAqLworCisJCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CisJCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkKKwkJCWdvdG8gZXhpdDsKKwkJcmV0ID0gMDsKKwl9OworZXhpdDoKKwlhdDc2X2R1bXBfbWliX21hY19lbmNyeXB0aW9uKHByaXYpOworCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0NzZfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCQljb25zdCB1OCAqbG9jYWxfYWRkcmVzcywgY29uc3QgdTggKmFkZHJlc3MsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY21kICVkIGtleS0+YWxnICVkIGtleS0+a2V5aWR4ICVkICIKKwkJICJrZXktPmtleWxlbiAlZCIsCisJCSBfX2Z1bmNfXywgY21kLCBrZXktPmFsZywga2V5LT5rZXlpZHgsIGtleS0+a2V5bGVuKTsKKworCWlmIChGSVJNV0FSRV9JU19XUEEocHJpdi0+ZndfdmVyc2lvbikpCisJCXJldHVybiBhdDc2X3NldF9rZXlfbmV3ZncoaHcsIGNtZCwgbG9jYWxfYWRkcmVzcywgYWRkcmVzcywga2V5KTsKKwllbHNlCisJCXJldHVybiBhdDc2X3NldF9rZXlfb2xkZncoaHcsIGNtZCwgbG9jYWxfYWRkcmVzcywgYWRkcmVzcywga2V5KTsKKworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgYXQ3Nl9vcHMgPSB7CisJLnR4ID0gYXQ3Nl9tYWM4MDIxMV90eCwKKwkuYWRkX2ludGVyZmFjZSA9IGF0NzZfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZSA9IGF0NzZfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY29uZmlnID0gYXQ3Nl9jb25maWcsCisJLmNvbmZpZ19pbnRlcmZhY2UgPSBhdDc2X2NvbmZpZ19pbnRlcmZhY2UsCisJLmNvbmZpZ3VyZV9maWx0ZXIgPSBhdDc2X2NvbmZpZ3VyZV9maWx0ZXIsCisJLnN0YXJ0ID0gYXQ3Nl9tYWM4MDIxMV9zdGFydCwKKwkuc3RvcCA9IGF0NzZfbWFjODAyMTFfc3RvcCwKKwkuaHdfc2NhbiA9IGF0NzZfaHdfc2NhbiwKKwkuc2V0X2tleSA9IGF0NzZfc2V0X2tleSwKK307CisKIC8qIEFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLwogc3RhdGljIHN0cnVjdCBhdDc2X3ByaXYgKmF0NzZfYWxsb2NfbmV3X2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCXN0cnVjdCBhdDc2X3ByaXYgKnByaXY7Ci0JaW50IGk7CiAKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KLQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGF0NzZfcHJpdikpOwotCWlmICghbmV0ZGV2KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZ1ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yoc3RydWN0IGF0NzZfcHJpdiksICZhdDc2X29wcyk7CisJaWYgKCFodykgeworCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogY291bGQgbm90IHJlZ2lzdGVyIgorCQkgICAgICAgIiBpZWVlODAyMTFfaHdcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwcml2ID0gaHctPnByaXY7CisJcHJpdi0+aHcgPSBodzsKIAogCXByaXYtPnVkZXYgPSB1ZGV2OwotCXByaXYtPm5ldGRldiA9IG5ldGRldjsKIAogCW11dGV4X2luaXQoJnByaXYtPm10eCk7Ci0JSU5JVF9XT1JLKCZwcml2LT53b3JrX2Fzc29jX2RvbmUsIGF0NzZfd29ya19hc3NvY19kb25lKTsKLQlJTklUX1dPUksoJnByaXYtPndvcmtfam9pbiwgYXQ3Nl93b3JrX2pvaW4pOwotCUlOSVRfV09SSygmcHJpdi0+d29ya19uZXdfYnNzLCBhdDc2X3dvcmtfbmV3X2Jzcyk7Ci0JSU5JVF9XT1JLKCZwcml2LT53b3JrX3N0YXJ0X3NjYW4sIGF0NzZfd29ya19zdGFydF9zY2FuKTsKIAlJTklUX1dPUksoJnByaXYtPndvcmtfc2V0X3Byb21pc2MsIGF0NzZfd29ya19zZXRfcHJvbWlzYyk7CiAJSU5JVF9XT1JLKCZwcml2LT53b3JrX3N1Ym1pdF9yeCwgYXQ3Nl93b3JrX3N1Ym1pdF9yeCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX3Jlc3RhcnQsIGF0NzZfZHdvcmtfcmVzdGFydCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2dldF9zY2FuLCBhdDc2X2R3b3JrX2dldF9zY2FuKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+ZHdvcmtfYmVhY29uLCBhdDc2X2R3b3JrX2JlYWNvbik7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2F1dGgsIGF0NzZfZHdvcmtfYXV0aCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2Fzc29jLCBhdDc2X2R3b3JrX2Fzc29jKTsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5tZ210X3NwaW5sb2NrKTsKLQlwcml2LT5uZXh0X21nbXRfYnVsayA9IE5VTEw7Ci0JcHJpdi0+bWFjX3N0YXRlID0gTUFDX0lOSVQ7Ci0KLQkvKiBpbml0aWFsaXplIGVtcHR5IEJTUyBsaXN0ICovCi0JcHJpdi0+Y3Vycl9ic3MgPSBOVUxMOwotCUlOSVRfTElTVF9IRUFEKCZwcml2LT5ic3NfbGlzdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrKTsKLQotCWluaXRfdGltZXIoJnByaXYtPmJzc19saXN0X3RpbWVyKTsKLQlwcml2LT5ic3NfbGlzdF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKLQlwcml2LT5ic3NfbGlzdF90aW1lci5mdW5jdGlvbiA9IGF0NzZfYnNzX2xpc3RfdGltZW91dDsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JLyogbWFyayBhbGwgcnggZGF0YSBlbnRyaWVzIGFzIHVudXNlZCAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9SWF9EQVRBX0JVRjsgaSsrKQotCQlwcml2LT5yeF9kYXRhW2ldLnNrYiA9IE5VTEw7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2h3X3NjYW4sIGF0NzZfZHdvcmtfaHdfc2Nhbik7CiAKIAlwcml2LT5yeF90YXNrbGV0LmZ1bmMgPSBhdDc2X3J4X3Rhc2tsZXQ7CiAJcHJpdi0+cnhfdGFza2xldC5kYXRhID0gMDsKQEAgLTUxODMsNiArMjM3MSw5IEBACiAJcHJpdi0+cG1fbW9kZSA9IEFUNzZfUE1fT0ZGOwogCXByaXYtPnBtX3BlcmlvZCA9IDA7CiAKKwkvKiB1bml0IHVzICovCisJcHJpdi0+aHctPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSAxMDAwMDA7CisKIAlyZXR1cm4gcHJpdjsKIH0KIApAQCAtNTI0NSwxMSArMjQzNiw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIGF0NzZfcmF0ZXNbXSA9IHsKKwl7IC5iaXRyYXRlID0gMTAsIC5od192YWx1ZSA9IFRYX1JBVEVfMU1CSVQsIH0sCisJeyAuYml0cmF0ZSA9IDIwLCAuaHdfdmFsdWUgPSBUWF9SQVRFXzJNQklULCB9LAorCXsgLmJpdHJhdGUgPSA1NSwgLmh3X3ZhbHVlID0gVFhfUkFURV81XzVNQklULCB9LAorCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IFRYX1JBVEVfMTFNQklULCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBhdDc2X2NoYW5uZWxzW10gPSB7CisJeyAuY2VudGVyX2ZyZXEgPSAyNDEyLCAuaHdfdmFsdWUgPSAxIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDE3LCAuaHdfdmFsdWUgPSAyIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDI3LCAuaHdfdmFsdWUgPSA0IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDMyLCAuaHdfdmFsdWUgPSA1IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDM3LCAuaHdfdmFsdWUgPSA2IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDQyLCAuaHdfdmFsdWUgPSA3IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDQ3LCAuaHdfdmFsdWUgPSA4IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDUyLCAuaHdfdmFsdWUgPSA5IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDU3LCAuaHdfdmFsdWUgPSAxMCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ2MiwgLmh3X3ZhbHVlID0gMTEgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1ZSA9IDEyIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDcyLCAuaHdfdmFsdWUgPSAxMyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ4NCwgLmh3X3ZhbHVlID0gMTQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYXQ3Nl9zdXBwb3J0ZWRfYmFuZCA9IHsKKwkuY2hhbm5lbHMgPSBhdDc2X2NoYW5uZWxzLAorCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShhdDc2X2NoYW5uZWxzKSwKKwkuYml0cmF0ZXMgPSBhdDc2X3JhdGVzLAorCS5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShhdDc2X3JhdGVzKSwKK307CisKIC8qIFJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlIGFuZCBpbml0aWFsaXplIHRoZSBoYXJkd2FyZSAqLwogc3RhdGljIGludCBhdDc2X2luaXRfbmV3X2RldmljZShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAogCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW50ZXJmYWNlLT5kZXY7CiAJaW50IHJldDsKIAogCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KQEAgLTUyNjUsMTQgKzI0ODcsMTEgQEAKIAkvKiBNQUMgYWRkcmVzcyAqLwogCXJldCA9IGF0NzZfZ2V0X2h3X2NvbmZpZyhwcml2KTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmaW50ZXJmYWNlLT5kZXYsCi0JCQkgICAiY2Fubm90IGdldCBNQUMgYWRkcmVzc1xuIik7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBNQUMgYWRkcmVzc1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlwcml2LT5kb21haW4gPSBhdDc2X2dldF9yZWdfZG9tYWluKHByaXYtPnJlZ3VsYXRvcnlfZG9tYWluKTsKLQkvKiBpbml0LiBuZXRkZXYtPmRldl9hZGRyICovCi0JbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIHByaXYtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKIAlwcml2LT5jaGFubmVsID0gREVGX0NIQU5ORUw7CiAJcHJpdi0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CkBAIC01MjgyLDQ3ICsyNTAxLDU0IEBACiAJcHJpdi0+dHhyYXRlID0gVFhfUkFURV9BVVRPOwogCXByaXYtPnByZWFtYmxlX3R5cGUgPSBQUkVBTUJMRV9UWVBFX0xPTkc7CiAJcHJpdi0+YmVhY29uX3BlcmlvZCA9IDEwMDsKLQlwcml2LT5iZWFjb25zX2xhc3RfcXVhbCA9IGppZmZpZXM7CiAJcHJpdi0+YXV0aF9tb2RlID0gV0xBTl9BVVRIX09QRU47CiAJcHJpdi0+c2Nhbl9taW5fdGltZSA9IERFRl9TQ0FOX01JTl9USU1FOwogCXByaXYtPnNjYW5fbWF4X3RpbWUgPSBERUZfU0NBTl9NQVhfVElNRTsKIAlwcml2LT5zY2FuX21vZGUgPSBTQ0FOX1RZUEVfQUNUSVZFOworCXByaXYtPmRlZmF1bHRfcGFpcndpc2Vfa2V5ID0gMHhmZjsKKwlwcml2LT5kZWZhdWx0X2dyb3VwX2tleSA9IDB4ZmY7CiAKLQluZXRkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOwkvKiBub3QgeWV0IG9yIG5ldmVyICovCi0JbmV0ZGV2LT5vcGVuID0gYXQ3Nl9vcGVuOwotCW5ldGRldi0+c3RvcCA9IGF0NzZfc3RvcDsKLQluZXRkZXYtPmdldF9zdGF0cyA9IGF0NzZfZ2V0X3N0YXRzOwotCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmYXQ3Nl9ldGh0b29sX29wczsKKwkvKiBtYWM4MDIxMSBpbml0aWFsaXNhdGlvbiAqLworCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYXQ3Nl9zdXBwb3J0ZWRfYmFuZDsKIAotCS8qIEFkZCBwb2ludGVycyB0byBlbmFibGUgaXdzcHkgc3VwcG9ydC4gKi8KLQlwcml2LT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJnByaXYtPnNweV9kYXRhOwotCW5ldGRldi0+d2lyZWxlc3NfZGF0YSA9ICZwcml2LT53aXJlbGVzc19kYXRhOworCWlmIChGSVJNV0FSRV9JU19XUEEocHJpdi0+ZndfdmVyc2lvbikgJiYKKwkJKGF0NzZfaXNfNTAzcmZtZChwcml2LT5ib2FyZF90eXBlKSB8fAorCQkgYXQ3Nl9pc181MDUocHJpdi0+Ym9hcmRfdHlwZSkpKQorCQlwcml2LT5ody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX1VOU1BFQzsKKwllbHNlCisJCXByaXYtPmh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1MgfAorCQkJCSAgSUVFRTgwMjExX0hXX1NJR05BTF9VTlNQRUM7CiAKLQluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGF0NzZfdHg7Ci0JbmV0ZGV2LT50eF90aW1lb3V0ID0gYXQ3Nl90eF90aW1lb3V0OwotCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7Ci0JbmV0ZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZhdDc2X2hhbmRsZXJfZGVmOwotCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYXQ3Nl9zZXRfbXVsdGljYXN0OwotCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gYXQ3Nl9zZXRfbWFjX2FkZHJlc3M7Ci0JZGV2X2FsbG9jX25hbWUobmV0ZGV2LCAid2xhbiVkIik7CisJcHJpdi0+aHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTik7CiAKLQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYocHJpdi0+bmV0ZGV2KTsKKwlTRVRfSUVFRTgwMjExX0RFVihwcml2LT5odywgJmludGVyZmFjZS0+ZGV2KTsKKwlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihwcml2LT5odywgcHJpdi0+bWFjX2FkZHIpOworCisJcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KHByaXYtPmh3KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJjYW5ub3QgcmVnaXN0ZXIgbmV0ZGV2aWNlIChzdGF0dXMgJWQpIVxuIiwgcmV0KTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgbWFjODAyMTEgaHcgKHN0YXR1cyAlZCkhXG4iLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQotCXByaXYtPm5ldGRldl9yZWdpc3RlcmVkID0gMTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBVU0IgJXMsIE1BQyAlcywgZmlybXdhcmUgJWQuJWQuJWQtJWRcbiIsCi0JICAgICAgIG5ldGRldi0+bmFtZSwgaW50ZXJmYWNlLT5kZXYuYnVzX2lkLCBtYWMyc3RyKHByaXYtPm1hY19hZGRyKSwKLQkgICAgICAgcHJpdi0+ZndfdmVyc2lvbi5tYWpvciwgcHJpdi0+ZndfdmVyc2lvbi5taW5vciwKLQkgICAgICAgcHJpdi0+ZndfdmVyc2lvbi5wYXRjaCwgcHJpdi0+ZndfdmVyc2lvbi5idWlsZCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ3VsYXRvcnkgZG9tYWluIDB4JTAyeDogJXNcbiIsIG5ldGRldi0+bmFtZSwKLQkgICAgICAgcHJpdi0+cmVndWxhdG9yeV9kb21haW4sIHByaXYtPmRvbWFpbi0+bmFtZSk7CisJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDE7CiAKLQkvKiB3ZSBsZXQgdGhpcyB0aW1lciBydW4gdGhlIHdob2xlIHRpbWUgdGhpcyBkcml2ZXIgaW5zdGFuY2UgbGl2ZXMgKi8KLQltb2RfdGltZXIoJnByaXYtPmJzc19saXN0X3RpbWVyLCBqaWZmaWVzICsgQlNTX0xJU1RfVElNRU9VVCk7CisJZGV2X2luZm8oZGV2LCAiJXM6IFVTQiAlcywgTUFDICVzLCBmaXJtd2FyZSAlZC4lZC4lZC0lZFxuIiwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKKwkJIGRldl9uYW1lKCZpbnRlcmZhY2UtPmRldiksIG1hYzJzdHIocHJpdi0+bWFjX2FkZHIpLAorCQkgcHJpdi0+ZndfdmVyc2lvbi5tYWpvciwgcHJpdi0+ZndfdmVyc2lvbi5taW5vciwKKwkJIHByaXYtPmZ3X3ZlcnNpb24ucGF0Y2gsIHByaXYtPmZ3X3ZlcnNpb24uYnVpbGQpOworCWRldl9pbmZvKGRldiwgIiVzOiByZWd1bGF0b3J5IGRvbWFpbiAweCUwMng6ICVzXG4iLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgcHJpdi0+cmVndWxhdG9yeV9kb21haW4sIHByaXYtPmRvbWFpbi0+bmFtZSk7CisJZGV2X2luZm8oZGV2LCAiJXM6IFdQQSBzdXBwb3J0OiAiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOworCWlmICghRklSTVdBUkVfSVNfV1BBKHByaXYtPmZ3X3ZlcnNpb24pKQorCQlwcmludGsoIm5vbmVcbiIpOworCWVsc2UgeworCQlpZiAoIWF0NzZfaXNfNTA1YShwcml2LT5ib2FyZF90eXBlKSkKKwkJCXByaW50aygiVEtJUFxuIik7CisJCWVsc2UKKwkJCXByaW50aygiVEtJUCwgQUVTL0NDTVBcbiIpOworCX07CiAKIGV4aXQ6CiAJcmV0dXJuIHJldDsKQEAgLTUzMzAsMTUgKzI1NTYsMTMgQEAKIAogc3RhdGljIHZvaWQgYXQ3Nl9kZWxldGVfZGV2aWNlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCiB7Ci0JaW50IGk7Ci0KIAlhdDc2X2RiZyhEQkdfUFJPQ19FTlRSWSwgIiVzOiBFTlRFUiIsIF9fZnVuY19fKTsKIAogCS8qIFRoZSBkZXZpY2UgaXMgZ29uZSwgZG9uJ3QgYm90aGVyIHR1cm5pbmcgaXQgb2ZmICovCiAJcHJpdi0+ZGV2aWNlX3VucGx1Z2dlZCA9IDE7CiAKLQlpZiAocHJpdi0+bmV0ZGV2X3JlZ2lzdGVyZWQpCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPm5ldGRldik7CisJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpCisJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHByaXYtPmh3KTsKIAogCS8qIGFzc3VtaW5nIHdlIHVzZWQga2V2ZW50ZCwgaXQgbXVzdCBxdWllc2NlIHRvbyAqLwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CkBAIC01MzU5LDI1ICsyNTgzLDExIEBACiAJaWYgKHByaXYtPnJ4X3NrYikKIAkJa2ZyZWVfc2tiKHByaXYtPnJ4X3NrYik7CiAKLQlhdDc2X2ZyZWVfYnNzX2xpc3QocHJpdik7Ci0JZGVsX3RpbWVyX3N5bmMoJnByaXYtPmJzc19saXN0X3RpbWVyKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQpCi0JCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JYX0RBVEFfQlVGOyBpKyspCi0JCWlmIChwcml2LT5yeF9kYXRhW2ldLnNrYikgewotCQkJZGV2X2tmcmVlX3NrYihwcml2LT5yeF9kYXRhW2ldLnNrYik7Ci0JCQlwcml2LT5yeF9kYXRhW2ldLnNrYiA9IE5VTEw7Ci0JCX0KIAl1c2JfcHV0X2Rldihwcml2LT51ZGV2KTsKIAotCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXM6IGJlZm9yZSBmcmVlaW5nIHByaXYvbmV0ZGV2IiwgX19mdW5jX18pOwotCWZyZWVfbmV0ZGV2KHByaXYtPm5ldGRldik7CS8qIHByaXYgaXMgaW4gbmV0ZGV2ICovCisJYXQ3Nl9kYmcoREJHX1BST0NfRU5UUlksICIlczogYmVmb3JlIGZyZWVpbmcgcHJpdi9pZWVlODAyMTFfaHciLAorCQkgX19mdW5jX18pOworCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKIAogCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXM6IEVYSVQiLCBfX2Z1bmNfXyk7CiB9CkBAIC01NDExLDggKzI2MjEsOCBAQAogCSAgIHdlIGdldCAyMDQgd2l0aCAyLjQuMjMsIEZpYmVybGluZSBGTC1XTDI0MHUgKDUwNUErUkZNRDI5NTgpID8/PyAqLwogCiAJaWYgKG9wX21vZGUgPT0gT1BNT0RFX0hXX0NPTkZJR19NT0RFKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJjYW5ub3QgaGFuZGxlIGEgZGV2aWNlIGluIEhXX0NPTkZJR19NT0RFXG4iKTsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkiY2Fubm90IGhhbmRsZSBhIGRldmljZSBpbiBIV19DT05GSUdfTU9ERVxuIik7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC01NDIwLDEzICsyNjMwLDEyIEBACiAJaWYgKG9wX21vZGUgIT0gT1BNT0RFX05PUk1BTF9OSUNfV0lUSF9GTEFTSAogCSAgICAmJiBvcF9tb2RlICE9IE9QTU9ERV9OT1JNQUxfTklDX1dJVEhPVVRfRkxBU0gpIHsKIAkJLyogZG93bmxvYWQgaW50ZXJuYWwgZmlybXdhcmUgcGFydCAqLwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJkb3dubG9hZGluZyBpbnRlcm5hbCBmaXJtd2FyZVxuIik7CisJCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiZG93bmxvYWRpbmcgaW50ZXJuYWwgZmlybXdhcmVcbiIpOwogCQlyZXQgPSBhdDc2X2xvYWRfaW50ZXJuYWxfZncodWRldiwgZndlKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCQkgICAiZXJyb3IgJWQgZG93bmxvYWRpbmcgaW50ZXJuYWwgZmlybXdhcmVcbiIsCi0JCQkJICAgcmV0KTsKKwkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAorCQkJCSJlcnJvciAlZCBkb3dubG9hZGluZyBpbnRlcm5hbCBmaXJtd2FyZVxuIiwKKwkJCQlyZXQpOwogCQkJZ290byBlcnJvcjsKIAkJfQogCQl1c2JfcHV0X2Rldih1ZGV2KTsKQEAgLTU0NTEsOCArMjY2MCw3IEBACiAJCW5lZWRfZXh0X2Z3ID0gMTsKIAogCWlmIChuZWVkX2V4dF9mdykgewotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJkb3dubG9hZGluZyBleHRlcm5hbCBmaXJtd2FyZVxuIik7CisJCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiZG93bmxvYWRpbmcgZXh0ZXJuYWwgZmlybXdhcmVcbiIpOwogCiAJCXJldCA9IGF0NzZfbG9hZF9leHRlcm5hbF9mdyh1ZGV2LCBmd2UpOwogCQlpZiAocmV0KQpAQCAtNTQ2MSw4ICsyNjY5LDggQEAKIAkJLyogUmUtY2hlY2sgZmlybXdhcmUgdmVyc2lvbiAqLwogCQlyZXQgPSBhdDc2X2dldF9taWIodWRldiwgTUlCX0ZXX1ZFUlNJT04sICZmd3YsIHNpemVvZihmd3YpKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCQkgICAiZXJyb3IgJWQgZ2V0dGluZyBmaXJtd2FyZSB2ZXJzaW9uXG4iLCByZXQpOworCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkJImVycm9yICVkIGdldHRpbmcgZmlybXdhcmUgdmVyc2lvblxuIiwgcmV0KTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAl9CkBAIC01NDczLDcgKzI2ODEsNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCVNFVF9ORVRERVZfREVWKHByaXYtPm5ldGRldiwgJmludGVyZmFjZS0+ZGV2KTsKIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgcHJpdik7CiAKIAltZW1jcHkoJnByaXYtPmZ3X3ZlcnNpb24sICZmd3YsIHNpemVvZihzdHJ1Y3QgbWliX2Z3X3ZlcnNpb24pKTsKQEAgLTU1MDEsNyArMjcwOCw3IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm47CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogZGlzY29ubmVjdGluZ1xuIiwgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogZGlzY29ubmVjdGluZ1xuIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpKTsKIAlhdDc2X2RlbGV0ZV9kZXZpY2UocHJpdik7CiAJZGV2X3ByaW50ayhLRVJOX0lORk8sICZpbnRlcmZhY2UtPmRldiwgImRpc2Nvbm5lY3RlZFxuIik7CiB9CkBAIC01NTU3LDUgKzI3NjQsOCBAQAogTU9EVUxFX0FVVEhPUigiTmljayBKb25lcyIpOwogTU9EVUxFX0FVVEhPUigiQmFsaW50IFNlZWJlciA8bjBfNXA0bV9wMTM0NTNAaG90bWFpbC5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiIpOworTU9EVUxFX0FVVEhPUigiR3VpZG8gR3VlbnRoZXIgPGFneEBzaWd4Y3B1Lm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIkthbGxlIFZhbG8gPGthbGxlLnZhbG9AaWtpLmZpPiIpOworTU9EVUxFX0FVVEhPUigiTWlsYW4gUGx6aWsgPG1pbGFuLnBsemlrQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCmluZGV4IGIyMGJlOWQuLjhiYjM1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCkBAIC0zNCwyMyArMzQsNiBAQAogCUJPQVJEXzUwNUFNWCA9IDgKIH07CiAKLS8qIG91ciBwcml2YXRlIGlvY3RsJ3MgKi8KLS8qIHByZWFtYmxlIGxlbmd0aCAoMCAtIGxvbmcsIDEgLSBzaG9ydCwgMiAtIGF1dG8pICovCi0jZGVmaW5lIEFUNzZfU0VUX1NIT1JUX1BSRUFNQkxFCQkoU0lPQ0lXRklSU1RQUklWICsgMCkKLSNkZWZpbmUgQVQ3Nl9HRVRfU0hPUlRfUFJFQU1CTEUJCShTSU9DSVdGSVJTVFBSSVYgKyAxKQotLyogd2hpY2ggZGVidWcgY2hhbm5lbHMgYXJlIGVuYWJsZWQgKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfREVCVUcJCQkoU0lPQ0lXRklSU1RQUklWICsgMikKLSNkZWZpbmUgQVQ3Nl9HRVRfREVCVUcJCQkoU0lPQ0lXRklSU1RQUklWICsgMykKLS8qIHBvd2VyIHNhdmUgbW9kZSAoaW5jbC4gdGhlIEF0bWVsIHByb3ByaWV0YXJ5IHNtYXJ0IHNhdmUgbW9kZSkgKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfUE9XRVJTQVZFX01PREUJCShTSU9DSVdGSVJTVFBSSVYgKyA0KQotI2RlZmluZSBBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDUpCi0vKiBtaW4gYW5kIG1heCBjaGFubmVsIHRpbWVzIGZvciBzY2FuICovCi0jZGVmaW5lIEFUNzZfU0VUX1NDQU5fVElNRVMJCShTSU9DSVdGSVJTVFBSSVYgKyA2KQotI2RlZmluZSBBVDc2X0dFVF9TQ0FOX1RJTUVTCQkoU0lPQ0lXRklSU1RQUklWICsgNykKLS8qIHNjYW4gbW9kZSAoMCAtIGFjdGl2ZSwgMSAtIHBhc3NpdmUpICovCi0jZGVmaW5lIEFUNzZfU0VUX1NDQU5fTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDgpCi0jZGVmaW5lIEFUNzZfR0VUX1NDQU5fTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDkpCi0KICNkZWZpbmUgQ01EX1NUQVRVU19JRExFCQkJCTB4MDAKICNkZWZpbmUgQ01EX1NUQVRVU19DT01QTEVURQkJCTB4MDEKICNkZWZpbmUgQ01EX1NUQVRVU19VTktOT1dOCQkJMHgwMgpAQCAtODIsNiArNjUsNyBAQAogI2RlZmluZSBNSUJfTUFDCQkJMHgwMwogI2RlZmluZSBNSUJfTUFDX01HTVQJCTB4MDUKICNkZWZpbmUgTUlCX01BQ19XRVAJCTB4MDYKKyNkZWZpbmUgTUlCX01BQ19FTkNSWVBUSU9OCTB4MDYKICNkZWZpbmUgTUlCX1BIWQkJCTB4MDcKICNkZWZpbmUgTUlCX0ZXX1ZFUlNJT04JCTB4MDgKICNkZWZpbmUgTUlCX01ET01BSU4JCTB4MDkKQEAgLTEwNiw2ICs5MCwyNiBAQAogI2RlZmluZSBBVDc2X1BNX09OCQkyCiAjZGVmaW5lIEFUNzZfUE1fU01BUlQJCTMKIAorLyogY2lwaGVyIHZhbHVlcyBmb3IgZW5jcnlwdGlvbiBrZXlzICovCisjZGVmaW5lIENJUEhFUl9OT05FCQkwCS8qIHRoaXMgdmFsdWUgaXMgb25seSBndWVzc2VkICovCisjZGVmaW5lIENJUEhFUl9XRVA2NAkJMQorI2RlZmluZSBDSVBIRVJfVEtJUAkJMgorI2RlZmluZSBDSVBIRVJfQ0NNUAkJMworI2RlZmluZSBDSVBIRVJfQ0NYCQk0CS8qIGZvciBjb25zaXN0ZW5jeSBzYWtlIG9ubHkgKi8KKyNkZWZpbmUgQ0lQSEVSX1dFUDEyOAkJNQorCisvKiBiaXQgZmxhZ3Mga2V5IHR5cGVzIGZvciBlbmNyeXB0aW9uIGtleXMgKi8KKyNkZWZpbmUgS0VZX1BBSVJXSVNFCQkyCisjZGVmaW5lIEtFWV9UWAkJCTQKKworI2RlZmluZSBDSVBIRVJfS0VZUwkJKDQpCisjZGVmaW5lIENJUEhFUl9LRVlfTEVOCQkoNDApCisKK3N0cnVjdCBrZXlfY29uZmlnIHsKKwl1OCBjaXBoZXI7CisJdTgga2V5bGVuOworfTsKKwogc3RydWN0IGh3Y2ZnX3I1MDUgewogCXU4IGNyMzlfdmFsdWVzWzE0XTsKIAl1OCByZXNlcnZlZDFbMTRdOwpAQCAtMTQ3LDYgKzE1MSw5IEBACiAKICNkZWZpbmUgV0VQX1NNQUxMX0tFWV9MRU4JKDQwIC8gOCkKICNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4JKDEwNCAvIDgpCisjZGVmaW5lIFdFUF9LRVlTCQkoNCkKKworCiAKIHN0cnVjdCBhdDc2X2NhcmRfY29uZmlnIHsKIAl1OCBleGNsdWRlX3VuZW5jcnlwdGVkOwpAQCAtMTYxLDcgKzE2OCw3IEBACiAJdTggcHJpdmFjeV9pbnZva2VkOwogCXU4IHdlcF9kZWZhdWx0X2tleV9pZDsJLyogMC4uMyAqLwogCXU4IGN1cnJlbnRfc3NpZFszMl07Ci0JdTggd2VwX2RlZmF1bHRfa2V5X3ZhbHVlWzRdW1dFUF9LRVlfTEVOXTsKKwl1OCB3ZXBfZGVmYXVsdF9rZXlfdmFsdWVbNF1bV0VQX0xBUkdFX0tFWV9MRU5dOwogCXU4IHNzaWRfbGVuOwogCXU4IHNob3J0X3ByZWFtYmxlOwogCV9fbGUxNiBiZWFjb25fcGVyaW9kOwpAQCAtMTg2LDcgKzE5Myw3IEBACiAJdTggbGlua19xdWFsaXR5OwogCXU4IG5vaXNlX2xldmVsOwogCV9fbGUzMiByeF90aW1lOwotCXU4IHBhY2tldFtJRUVFODAyMTFfRlJBTUVfTEVOICsgSUVFRTgwMjExX0ZDU19MRU5dOworCXU4IHBhY2tldFtJRUVFODAyMTFfTUFYX0ZSQUdfVEhSRVNIT0xEXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIExlbmd0aCBvZiBBdG1lbC1zcGVjaWZpYyBUeCBoZWFkZXIgYmVmb3JlIDgwMi4xMSBmcmFtZSAqLwpAQCAtMTk2LDggKzIwMywxMSBAQAogCV9fbGUxNiB3bGVuZ3RoOwogCXU4IHR4X3JhdGU7CiAJdTggcGFkZGluZzsKLQl1OCByZXNlcnZlZFs0XTsKLQl1OCBwYWNrZXRbSUVFRTgwMjExX0ZSQU1FX0xFTiArIElFRUU4MDIxMV9GQ1NfTEVOXTsKKwl1OCBrZXlfaWQ7CisJdTggY2lwaGVyX3R5cGU7CisJdTggY2lwaGVyX2xlbmd0aDsKKwl1OCByZXNlcnZlZDsKKwl1OCBwYWNrZXRbSUVFRTgwMjExX01BWF9GUkFHX1RIUkVTSE9MRF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBkZWZpbmVzIGZvciBzY2FuX3R5cGUgYmVsb3cgKi8KQEAgLTI0NCw2ICsyNTQsNyBAQAogCQl1OCBieXRlOwogCQlfX2xlMTYgd29yZDsKIAkJdTggYWRkcltFVEhfQUxFTl07CisJCXU4IGRhdGFbMjU2XTsJLyogd2UgbmVlZCBtb3JlIHNwYWNlIGZvciBtaWJfbWFjX2VuY3J5cHRpb24gKi8KIAl9IGRhdGE7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCkBAIC0zMTcsMTAgKzMyOCwyNCBAQAogCXU4IGV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CiAJX19sZTMyIHdlcF9pY3ZfZXJyb3JfY291bnQ7CiAJX19sZTMyIHdlcF9leGNsdWRlZF9jb3VudDsKLQl1OCB3ZXBfZGVmYXVsdF9rZXl2YWx1ZVtXRVBfS0VZU11bV0VQX0tFWV9MRU5dOworCXU4IHdlcF9kZWZhdWx0X2tleXZhbHVlW1dFUF9LRVlTXVtXRVBfTEFSR0VfS0VZX0xFTl07CiAJdTggZW5jcnlwdGlvbl9sZXZlbDsJLyogMSBmb3IgNDBiaXQsIDIgZm9yIDEwNGJpdCBlbmNyeXB0aW9uICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCitzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uIHsKKwl1OCBjaXBoZXJfZGVmYXVsdF9rZXl2YWx1ZVtDSVBIRVJfS0VZU11bQ0lQSEVSX0tFWV9MRU5dOworCXU4IHRraXBfYnNzaWRbNl07CisJdTggcHJpdmFjeV9pbnZva2VkOworCXU4IGNpcGhlcl9kZWZhdWx0X2tleV9pZDsKKwl1OCBjaXBoZXJfZGVmYXVsdF9ncm91cF9rZXlfaWQ7CisJdTggZXhjbHVkZV91bmVuY3J5cHRlZDsKKwl1OCB3ZXBfZW5jcnlwdGlvbl90eXBlOworCXU4IGNraXBfa2V5X3Blcm11dGF0aW9uOwkvKiBib29sICovCisJX19sZTMyIHdlcF9pY3ZfZXJyb3JfY291bnQ7CisJX19sZTMyIHdlcF9leGNsdWRlZF9jb3VudDsKKwl1OCBrZXlfcnNjW0NJUEhFUl9LRVlTXVs4XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKIHN0cnVjdCBtaWJfcGh5IHsKIAlfX2xlMzIgZWRfdGhyZXNob2xkOwogCkBAIC0zNjQsMTYgKzM4OSw2IEBACiAJX19sZTMyIGV4dF9md19sZW47CS8qIGV4dGVybmFsIGZpcm13YXJlIGltYWdlIGxlbmd0aCAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotZW51bSBtYWNfc3RhdGUgewotCU1BQ19JTklULAotCU1BQ19TQ0FOTklORywKLQlNQUNfQVVUSCwKLQlNQUNfQVNTT0MsCi0JTUFDX0pPSU5JTkcsCi0JTUFDX0NPTk5FQ1RFRCwKLQlNQUNfT1dOX0lCU1MKLX07Ci0KIC8qIGEgZGVzY3JpcHRpb24gb2YgYSByZWd1bGF0b3J5IGRvbWFpbiBhbmQgdGhlIGFsbG93ZWQgY2hhbm5lbHMgKi8KIHN0cnVjdCByZWdfZG9tYWluIHsKIAl1MTYgY29kZTsKQEAgLTM4MSw0NyArMzk2LDYgQEAKIAl1MzIgY2hhbm5lbF9tYXA7CS8qIGlmIGJpdCBOIGlzIHNldCwgY2hhbm5lbCAoTisxKSBpcyBhbGxvd2VkICovCiB9OwogCi0vKiBob3cgbG9uZyBkbyB3ZSBrZWVwIGEgKEkpQlNTIGluIHRoZSBic3NfbGlzdCBpbiBqaWZmaWVzCi0gICB0aGlzIHNob3VsZCBiZSBsb25nIGVub3VnaCBmb3IgdGhlIHVzZXIgdG8gcmV0cmlldmUgdGhlIHRhYmxlCi0gICAoYnkgaXdsaXN0ID8pIGFmdGVyIHRoZSBkZXZpY2Ugc3RhcnRlZCwgYmVjYXVzZSBhbGwgZW50cmllcyBmcm9tCi0gICBvdGhlciBjaGFubmVscyB0aGFuIHRoZSBvbmUgdGhlIGRldmljZSBsb2NrcyBvbiBnZXQgcmVtb3ZlZCwgdG9vICovCi0jZGVmaW5lIEJTU19MSVNUX1RJTUVPVVQJKDEyMCAqIEhaKQotLyogc3RydWN0IHRvIHN0b3JlIEJTUyBpbmZvIGZvdW5kIGR1cmluZyBzY2FuICovCi0jZGVmaW5lIEJTU19MSVNUX01BWF9SQVRFX0xFTgkzMgkvKiAzMiByYXRlcyBzaG91bGQgYmUgZW5vdWdoIC4uLiAqLwotCi1zdHJ1Y3QgYnNzX2luZm8gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXU4IGJzc2lkW0VUSF9BTEVOXTsJLyogYnNzaWQgKi8KLQl1OCBzc2lkW0lXX0VTU0lEX01BWF9TSVpFXTsJLyogZXNzaWQgKi8KLQl1OCBzc2lkX2xlbjsJCS8qIGxlbmd0aCBvZiBzc2lkIGFib3ZlICovCi0JdTggY2hhbm5lbDsKLQl1MTYgY2FwYTsJCS8qIEJTUyBjYXBhYmlsaXRpZXMgKi8KLQl1MTYgYmVhY29uX2ludGVydmFsOwkvKiBiZWFjb24gaW50ZXJ2YWwsIEt1cyAoMTAyNCBtaWNyb3NlY29uZHMpICovCi0JdTggcmF0ZXNbQlNTX0xJU1RfTUFYX1JBVEVfTEVOXTsJLyogc3VwcG9ydGVkIHJhdGVzIGluIHVuaXRzIG9mCi0JCQkJCQkgICA1MDAga2JwcywgT1JlZCB3aXRoIDB4ODAgZm9yCi0JCQkJCQkgICBiYXNpYyByYXRlcyAqLwotCXU4IHJhdGVzX2xlbjsKLQotCS8qIHF1YWxpdHkgb2YgcmVjZWl2ZWQgYmVhY29uICovCi0JdTggcnNzaTsKLQl1OCBsaW5rX3F1YWw7Ci0JdTggbm9pc2VfbGV2ZWw7Ci0KLQl1bnNpZ25lZCBsb25nIGxhc3Rfcng7CS8qIHRpbWUgKGppZmZpZXMpIG9mIGxhc3QgYmVhY29uIHJlY2VpdmVkICovCi19OwotCi0vKiBhIHJ4IGRhdGEgYnVmZmVyIHRvIGNvbGxlY3QgcnggZnJhZ21lbnRzICovCi1zdHJ1Y3QgcnhfZGF0YV9idWYgewotCXU4IHNlbmRlcltFVEhfQUxFTl07CS8qIHNlbmRlciBhZGRyZXNzICovCi0JdTE2IHNlcW5yOwkJLyogc2VxdWVuY2UgbnVtYmVyICovCi0JdTE2IGZyYWducjsJCS8qIGxhc3QgZnJhZ21lbnQgcmVjZWl2ZWQgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3Rfcng7CS8qIGppZmZpZXMgb2YgbGFzdCByeCAqLwotCXN0cnVjdCBza19idWZmICpza2I7CS8qID09IE5VTEwgaWYgZW50cnkgaXMgZnJlZSAqLwotfTsKLQotI2RlZmluZSBOUl9SWF9EQVRBX0JVRgkJOAotCiAvKiBEYXRhIGZvciBvbmUgbG9hZGVkIGZpcm13YXJlIGZpbGUgKi8KIHN0cnVjdCBmd2VudHJ5IHsKIAljb25zdCBjaGFyICpjb25zdCBmd25hbWU7CkBAIC00MzgsMTEgKzQxMiw5IEBACiAKIHN0cnVjdCBhdDc2X3ByaXYgewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkvKiBVU0IgZGV2aWNlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBuZXQgZGV2aWNlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0IGRldmljZSBzdGF0cyAqLwotCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsJLyogd2lyZWxlc3Mgc3RhdHMgKi8KIAogCXN0cnVjdCBza19idWZmICpyeF9za2I7CS8qIHNrYnVmZiBmb3IgcmVjZWl2aW5nIGRhdGEgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwkvKiBza2J1ZmYgZm9yIHRyYW5zbWl0dGluZyBkYXRhICovCiAJdm9pZCAqYnVsa19vdXRfYnVmZmVyOwkvKiBidWZmZXIgZm9yIHNlbmRpbmcgZGF0YSAqLwogCiAJc3RydWN0IHVyYiAqdHhfdXJiOwkvKiBVUkIgZm9yIHNlbmRpbmcgZGF0YSAqLwpAQCAtNDU0LDI2ICs0MjYsMTcgQEAKIAlzdHJ1Y3QgbXV0ZXggbXR4OwkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLwogCiAJLyogd29yayBxdWV1ZXMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19hc3NvY19kb25lOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2pvaW47Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfbmV3X2JzczsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19zdGFydF9zY2FuOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3NldF9wcm9taXNjOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3N1Ym1pdF9yeDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX3Jlc3RhcnQ7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29ya19nZXRfc2NhbjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2JlYWNvbjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2F1dGg7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29ya19hc3NvYzsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2h3X3NjYW47CiAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhfdGFza2xldDsKIAogCS8qIHRoZSBXRVAgc3R1ZmYgKi8KIAlpbnQgd2VwX2VuYWJsZWQ7CS8qIDEgaWYgV0VQIGlzIGVuYWJsZWQgKi8KIAlpbnQgd2VwX2tleV9pZDsJCS8qIGtleSBpZCB0byBiZSB1c2VkICovCi0JdTggd2VwX2tleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOXTsJLyogdGhlIGZvdXIgV0VQIGtleXMsCi0JCQkJCQkgICA1IG9yIDEzIGJ5dGVzIGFyZSB1c2VkICovCi0JdTggd2VwX2tleXNfbGVuW1dFUF9LRVlTXTsJLyogdGhlIGxlbmd0aCBvZiB0aGUgYWJvdmUga2V5cyAqLworCXU4IHdlcF9rZXlzW1dFUF9LRVlTXVtXRVBfTEFSR0VfS0VZX0xFTl07CS8qIFdFUCBrZXlzICovCisJdTggd2VwX2tleXNfbGVuW1dFUF9LRVlTXTsJLyogbGVuZ3RoIG9mIFdFUCBrZXlzICovCiAKIAlpbnQgY2hhbm5lbDsKIAlpbnQgaXdfbW9kZTsKQEAgLTQ5NSw0NCArNDU4LDEzIEBACiAJaW50IHNjYW5fbW9kZTsJCS8qIFNDQU5fVFlQRV9BQ1RJVkUsIFNDQU5fVFlQRV9QQVNTSVZFICovCiAJaW50IHNjYW5fbmVlZF9hbnk7CS8qIGlmIHNldCwgbmVlZCB0byBzY2FuIGZvciBhbnkgRVNTSUQgKi8KIAotCS8qIHRoZSBsaXN0IHdlIGdvdCBmcm9tIHNjYW5uaW5nICovCi0Jc3BpbmxvY2tfdCBic3NfbGlzdF9zcGlubG9jazsJLyogcHJvdGVjdHMgYnNzX2xpc3Qgb3BlcmF0aW9ucyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYnNzX2xpc3Q7CS8qIGxpc3Qgb2YgQlNTIHdlIGdvdCBiZWFjb25zIGZyb20gKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCBic3NfbGlzdF90aW1lcjsJLyogdGltZXIgdG8gcHVyZ2Ugb2xkIGVudHJpZXMKLQkJCQkJCSAgIGZyb20gYnNzX2xpc3QgKi8KLQlzdHJ1Y3QgYnNzX2luZm8gKmN1cnJfYnNzOwkvKiBjdXJyZW50IEJTUyAqLwogCXUxNiBhc3NvY19pZDsJCS8qIGN1cnJlbnQgYXNzb2NpYXRpb24gSUQsIGlmIGFzc29jaWF0ZWQgKi8KIAotCXU4IHdhbnRlZF9ic3NpZFtFVEhfQUxFTl07Ci0JaW50IHdhbnRlZF9ic3NpZF92YWxpZDsJLyogIT0gMCBpZiB3YW50ZWRfYnNzaWQgaXMgdG8gYmUgdXNlZCAqLwotCi0JLyogc29tZSBkYXRhIGZvciBpbmZyYXN0cnVjdHVyZSBtb2RlIG9ubHkgKi8KLQlzcGlubG9ja190IG1nbXRfc3BpbmxvY2s7CS8qIHRoaXMgc3BpbmxvY2sgcHJvdGVjdHMgYWNjZXNzIHRvCi0JCQkJCSAgIG5leHRfbWdtdF9idWxrICovCi0KLQlzdHJ1Y3QgYXQ3Nl90eF9idWZmZXIgKm5leHRfbWdtdF9idWxrOwkvKiBwZW5kaW5nIG1hbmFnZW1lbnQgbXNnIHRvCi0JCQkJCQkgICBzZW5kIHZpYSBidWxrIG91dCAqLwotCWVudW0gbWFjX3N0YXRlIG1hY19zdGF0ZTsKLQllbnVtIHsKLQkJU0NBTl9JRExFLAotCQlTQ0FOX0lOX1BST0dSRVNTLAotCQlTQ0FOX0NPTVBMRVRFRAotCX0gc2Nhbl9zdGF0ZTsKLQl0aW1lX3QgbGFzdF9zY2FuOwotCi0JaW50IHJldHJpZXM7CQkvKiByZW1haW5pbmcgcmV0cmllcyBpbiBjYXNlIG9mIHRpbWVvdXQgd2hlbgotCQkJCSAqIHNlbmRpbmcgQXV0aFJlcSBvciBBc3NvY1JlcSAqLwogCXU4IHBtX21vZGU7CQkvKiBwb3dlciBtYW5hZ2VtZW50IG1vZGUgKi8KIAl1MzIgcG1fcGVyaW9kOwkJLyogcG93ZXIgbWFuYWdlbWVudCBwZXJpb2QgaW4gbWljcm9zZWNvbmRzICovCiAKIAlzdHJ1Y3QgcmVnX2RvbWFpbiBjb25zdCAqZG9tYWluOwkvKiByZWcgZG9tYWluIGRlc2NyaXB0aW9uICovCiAKLQkvKiBpd3NweSBzdXBwb3J0ICovCi0Jc3BpbmxvY2tfdCBzcHlfc3BpbmxvY2s7Ci0Jc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOwotCi0Jc3RydWN0IGl3X3B1YmxpY19kYXRhIHdpcmVsZXNzX2RhdGE7Ci0KIAkvKiBUaGVzZSBmaWVsZHMgY29udGFpbiBIVyBjb25maWcgcHJvdmlkZWQgYnkgdGhlIGRldmljZSAobm90IGFsbCBvZgogCSAqIHRoZXNlIGZpZWxkcyBhcmUgdXNlZCBieSBhbGwgYm9hcmQgdHlwZXMpICovCiAJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwpAQCAtNTQwLDkgKzQ3Miw2IEBACiAKIAlzdHJ1Y3QgYXQ3Nl9jYXJkX2NvbmZpZyBjYXJkX2NvbmZpZzsKIAotCS8qIHN0b3JlIHJ4IGZyYWdtZW50cyB1bnRpbCBjb21wbGV0ZSAqLwotCXN0cnVjdCByeF9kYXRhX2J1ZiByeF9kYXRhW05SX1JYX0RBVEFfQlVGXTsKLQogCWVudW0gYm9hcmRfdHlwZSBib2FyZF90eXBlOwogCXN0cnVjdCBtaWJfZndfdmVyc2lvbiBmd192ZXJzaW9uOwogCkBAIC01NTAsNTggKzQ3OSwyMCBAQAogCXVuc2lnbmVkIGludCBuZXRkZXZfcmVnaXN0ZXJlZDoxOwogCXN0cnVjdCBzZXRfbWliX2J1ZmZlciBtaWJfYnVmOwkvKiBnbG9iYWwgYnVmZmVyIGZvciBzZXRfbWliIGNhbGxzICovCiAKLQkvKiBiZWFjb24gY291bnRpbmcgKi8KIAlpbnQgYmVhY29uX3BlcmlvZDsJLyogcGVyaW9kIG9mIG1nbXQgYmVhY29ucywgS3VzICovCi0JaW50IGJlYWNvbnNfcmVjZWl2ZWQ7Ci0JdW5zaWduZWQgbG9uZyBiZWFjb25zX2xhc3RfcXVhbDsJLyogdGltZSB3ZSByZXN0YXJ0ZWQgY291bnRpbmcKLQkJCQkJCSAgIGJlYWNvbnMgKi8KKworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCWludCBtYWM4MDIxMV9yZWdpc3RlcmVkOworCisJc3RydWN0IGtleV9jb25maWcga2V5c1s0XTsJLyogaW5zdGFsbGVkIGtleSB0eXBlcyAqLworCXU4IGRlZmF1bHRfcGFpcndpc2Vfa2V5OworCXU4IGRlZmF1bHRfZ3JvdXBfa2V5OwogfTsKIAotc3RydWN0IGF0NzZfcnhfcmFkaW90YXAgewotCXN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHJ0X2hkcjsKLQlfX2xlNjQgcnRfdHNmdDsKLQl1OCBydF9mbGFnczsKLQl1OCBydF9yYXRlOwotCXM4IHJ0X3NpZ25hbDsKLQlzOCBydF9ub2lzZTsKLX07CisjZGVmaW5lIEFUNzZfU1VQUE9SVEVEX0ZJTFRFUlMgRklGX1BST01JU0NfSU5fQlNTCiAKLSNkZWZpbmUgQVQ3Nl9SWF9SQURJT1RBUF9QUkVTRU5UCQkgIFwKLQkoKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpCQl8IFwKLQkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpCQl8IFwKLQkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkJCXwgXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwpCXwgXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSkpCi0KLSNkZWZpbmUgQkVBQ09OX01BWF9EQVRBX0xFTkdUSAkxNTAwCi0KLS8qIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gQXNzb2NSZXEgcGFja2V0ICovCi0jZGVmaW5lIEFTU09DUkVRX01BWF9TSVpFIFwKLSAgKEFUNzZfVFhfSERSTEVOICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdCkgKyBcCi0gICAxICsgMSArIElXX0VTU0lEX01BWF9TSVpFICsgMSArIDEgKyA0KQotCi0vKiBmb3Igc2hhcmVkIHNlY3JldCBhdXRoLCBhZGQgdGhlIGNoYWxsZW5nZSB0ZXh0IHNpemUgKi8KLSNkZWZpbmUgQVVUSF9GUkFNRV9TSVpFIChBVDc2X1RYX0hEUkxFTiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGgpKQotCi0vKiBNYXhpbWFsIG51bWJlciBvZiBBdXRoUmVxIHJldHJpZXMgKi8KLSNkZWZpbmUgQVVUSF9SRVRSSUVTCQkzCi0KLS8qIE1heGltYWwgbnVtYmVyIG9mIEFzc29jUmVxIHJldHJpZXMgKi8KLSNkZWZpbmUgQVNTT0NfUkVUUklFUwkJMwotCi0vKiBCZWFjb24gdGltZW91dCBpbiBtYW5hZ2VkIG1vZGUgd2hlbiB3ZSBhcmUgY29ubmVjdGVkICovCi0jZGVmaW5lIEJFQUNPTl9USU1FT1VUCQkoMTAgKiBIWikKLQotLyogVGltZW91dCBmb3IgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgKi8KLSNkZWZpbmUgQVVUSF9USU1FT1VUCQkoMSAqIEhaKQotCi0vKiBUaW1lb3V0IGZvciBhc3NvY2lhdGlvbiByZXNwb25zZSAqLwotI2RlZmluZSBBU1NPQ19USU1FT1VUCQkoMSAqIEhaKQotCi0vKiBQb2xsaW5nIGludGVydmFsIHdoZW4gc2NhbiBpcyBydW5uaW5nICovCiAjZGVmaW5lIFNDQU5fUE9MTF9JTlRFUlZBTAkoSFogLyA0KQogCi0vKiBDb21tYW5kIGNvbXBsZXRpb24gdGltZW91dCAqLwogI2RlZmluZSBDTURfQ09NUExFVElPTl9USU1FT1VUCSg1ICogSFopCiAKICNkZWZpbmUgREVGX1JUU19USFJFU0hPTEQJMTUzNgpAQCAtNjExLDggKzUwMiw2IEBACiAjZGVmaW5lIERFRl9TQ0FOX01JTl9USU1FCTEwCiAjZGVmaW5lIERFRl9TQ0FOX01BWF9USU1FCTEyMAogCi0jZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xECShNQVhfRlJBR19USFJFU0hPTEQgKyAxKQotCiAvKiB0aGUgbWF4IHBhZGRpbmcgc2l6ZSBmb3IgdHggaW4gYnl0ZXMgKHNlZSBjYWxjX3BhZGRpbmcpICovCiAjZGVmaW5lIE1BWF9QQURESU5HX1NJWkUJNTMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgwNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWcKQEAgLTAsMCArMSw3IEBACitjb25maWcgQkVORVQKKwl0cmlzdGF0ZSAiU2VydmVyRW5naW5lcyAxMEdiIE5JQyAtIEJsYWRlRW5naW5lIgorCWRlcGVuZHMgb24gUENJICYmIElORVQKKwlzZWxlY3QgSU5FVF9MUk8KKwloZWxwCisJICBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBOSUMgZnVuY3Rpb25hbGl0eSBmb3IgU2VydmVyRW5naW5lcworCSAgMTBHYiBuZXR3b3JrIGFkYXB0ZXIgQmxhZGVFbmdpbmUgKEVDIDMyMTApLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01BSU5UQUlORVJTIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01BSU5UQUlORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2UzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTUFJTlRBSU5FUlMKQEAgLTAsMCArMSw2IEBACitTRVJWRVIgRU5HSU5FUyAxMEdiZSBOSUMgLSBCTEFERS1FTkdJTkUKK1A6CVN1YmJ1IFNlZXRoYXJhbWFuCitNOglzdWJidXNAc2VydmVyZW5naW5lcy5jb20KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuc2VydmVyZW5naW5lcy5jb20KK1M6CVN1cHBvcnRlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MGI5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBNYWtlZmlsZSB0byBidWlsZCB0aGUgbmV0d29yayBkcml2ZXIgZm9yIFNlcnZlckVuZ2luZSdzIEJsYWRlRW5naW5lCisjCitvYmotJChDT05GSUdfQkVORVQpICs9IGJlbmV0Lm8KKworYmVuZXQteSA6PSAgYmVfaW5pdC5vIFwKKwkJCWJlX2ludC5vIFwKKwkJCWJlX25ldGlmLm8gXAorCQkJYmVfZXRodG9vbC5vIFwKKwkJCWZ1bmNvYmoubyBcCisJCQljcS5vIFwKKwkJCWVxLm8gXAorCQkJbXB1Lm8gXAorCQkJZXRoLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxZGZiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9UT0RPCkBAIC0wLDAgKzEsNiBAQAorVE9ETzoKKwktIHJlbW92ZSB3cmFwcGVycyBhcm91bmQgY29tbW9uIGlvd3JpdGUgZnVuY3Rpb25zCisJLSBmdWxsIG5ldGRldiBhdWRpdCBvZiBjb21tb24gcHJvYmxlbXMvaXNzdWVzCisKK1BsZWFzZSBzZW5kIGFsbCBwYXRjaGVzIGFuZCBxdWVzdGlvbnMgdG8gU3ViYnUgU2VldGhhcmFtYW4KKzxzdWJidXNAc2VydmVyZW5naW5lcy5jb20+IGFuZCBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2FzeW5jbWVzZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2FzeW5jbWVzZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTc3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYXN5bmNtZXNnLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2FzeW5jbWVzZ19hbWFwX2hfXworI2RlZmluZSBfX2FzeW5jbWVzZ19hbWFwX2hfXworI2luY2x1ZGUgImZ3Y21kX2NvbW1vbi5oIgorCisvKiAtLS0gQVNZTkNfRVZFTlRfQ09ERVMgLS0tICovCisjZGVmaW5lIEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSAgICAgKDEpCisjZGVmaW5lIEFTWU5DX0VWRU5UX0NPREVfSVNDU0kgICAgICAgICAgKDIpCisKKy8qIC0tLSBBU1lOQ19MSU5LX1NUQVRFUyAtLS0gKi8KKyNkZWZpbmUgQVNZTkNfRVZFTlRfTElOS19ET1dOICAgICAgICAgICAoMCkJLyogTGluayBEb3duIG9uIGEgcG9ydCAqLworI2RlZmluZSBBU1lOQ19FVkVOVF9MSU5LX1VQICAgICAgICAgICAgICgxKQkvKiBMaW5rIFVwIG9uIGEgcG9ydCAqLworCisvKgorICogVGhlIGxhc3QgNCBieXRlcyBvZiB0aGUgYXN5bmMgZXZlbnRzIGhhdmUgdGhpcyBjb21tb24gZm9ybWF0LiAgSXQgYWxsb3dzCisgKiB0aGUgZHJpdmVyIHRvIGRpc3Rpbmd1aXNoIFtsaW5rXU1DQ19DUV9FTlRSWVsvbGlua10gc3RydWN0cyBmcm9tCisgKiBhc3luY2hyb25vdXMgZXZlbnRzLiAgQm90aCBhcnJpdmUgb24gdGhlIHNhbWUgY29tcGxldGlvbiBxdWV1ZS4gIFRoaXMKKyAqIHN0cnVjdHVyZSBhbHNvIGNvbnRhaW5zIHRoZSBjb21tb24gZmllbGRzIHVzZWQgdG8gZGVjb2RlIHRoZSBhc3luYyBldmVudC4KKyAqLworc3RydWN0IEJFX0FTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCB7CisJdTggcnN2ZDBbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBldmVudF9jb2RlWzhdOwkvKiBEV09SRCAwICovCisJdTggZXZlbnRfdHlwZVs4XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzZdOwkvKiBEV09SRCAwICovCisJdTggYXN5bmNfZXZlbnQ7CS8qIERXT1JEIDAgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogQXBwbGljYWJsZSBpbiBJbml0aWF0b3IsIFRhcmdldCBhbmQgTklDIG1vZGVzLgorICogQSBsaW5rIHN0YXRlIGFzeW5jIGV2ZW50IGlzIHNlZW4gYnkgYWxsIGRldmljZSBkcml2ZXJzIGFzIHNvb24gdGhleQorICogY3JlYXRlIGFuIE1DQyByaW5nLiBUaGVyZWFmdGVyLCBhbnl0aW1lIHRoZSBsaW5rIHN0YXR1cyBjaGFuZ2VzIHRoZQorICogZHJpdmVycyB3aWxsIHJlY2VpdmUgYSBsaW5rIHN0YXRlIGFzeW5jIGV2ZW50LiBOb3RpZmljYXRpb25zIGNvbnRpbnVlIHRvCisgKiBiZSBzZW50IHVudGlsIGEgZHJpdmVyIGRlc3Ryb3lzIGl0cyBNQ0MgcmluZy4gQSBsaW5rIGRvd24gZXZlbnQgaXMKKyAqIHJlcG9ydGVkIHdoZW4gZWl0aGVyIHBvcnQgbG9zZXMgbGluay4gQSBsaW5rIHVwIGV2ZW50IGlzIHJlcG9ydGVkCisgKiB3aGVuIGVpdGhlciBwb3J0IHJlZ2FpbnMgbGluay4gV2hlbiBCRSdzIGZhaWxvdmVyIG1lY2hhbmlzbSBpcyBlbmFibGVkLCBhCisgKiBsaW5rIGRvd24gb24gdGhlIGFjdGl2ZSBwb3J0IGNhdXNlcyB0cmFmZmljIHRvIGJlIGRpdmVydGVkIHRvIHRoZSBzdGFuZGJ5CisgKiBwb3J0IGJ5IHRoZSBCRSdzIEFSTSBmaXJtd2FyZSAoYXNzdW1pbmcgdGhlIHN0YW5kYnkgcG9ydCBoYXMgbGluaykuIEluCisgKiB0aGlzIGNhc2UsIHRoZSBzdGFuZHkgcG9ydCBhc3N1bWVzIHRoZSBhY3RpdmUgc3RhdHVzLiBOb3RlOiB3aGVuIGxpbmsgaXMKKyAqIHJlc3RvcmVkIG9uIHRoZSBmYWlsZWQgcG9ydCwgdHJhZmZpYyBjb250aW51ZXMgb24gdGhlIGN1cnJlbnRseSBhY3RpdmUKKyAqIHBvcnQuIFRoZSBBUk0gZmlybXdhcmUgZG9lcyBub3QgYXR0ZW1wdCB0byAnZmFpbCBiYWNrJyB0cmFmZmljIHRvCisgKiB0aGUgcmVzdG9yZWQgcG9ydC4KKyAqLworc3RydWN0IEJFX0FTWU5DX0VWRU5UX0xJTktfU1RBVEVfQU1BUCB7CisJdTggcG9ydDBfbGlua19zdGF0dXNbOF07CisJdTggcG9ydDFfbGlua19zdGF0dXNbOF07CisJdTggYWN0aXZlX3BvcnRbOF07CisJdTggcnN2ZDBbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBwb3J0MF9kdXBsZXhbOF07CisJdTggcG9ydDBfc3BlZWRbOF07CisJdTggcG9ydDFfZHVwbGV4WzhdOworCXU4IHBvcnQxX3NwZWVkWzhdOworCXU4IHBvcnQwX2ZhdWx0WzhdOworCXU4IHBvcnQxX2ZhdWx0WzhdOworCXU4IHJzdmQxWzJdWzhdOwkvKiBEV09SRCAyICovCisJc3RydWN0IEJFX0FTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCB0cmFpbGVyOworfSBfX3BhY2tlZDsKK3N0cnVjdCBBU1lOQ19FVkVOVF9MSU5LX1NUQVRFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisjZW5kaWYgLyogX19hc3luY21lc2dfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jbS5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMWRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jbS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fYmVfY21fYW1hcF9oX18KKyNkZWZpbmUgX19iZV9jbV9hbWFwX2hfXworI2luY2x1ZGUgImJlX2NvbW1vbi5oIgorI2luY2x1ZGUgImV0eF9jb250ZXh0LmgiCisjaW5jbHVkZSAibXB1X2NvbnRleHQuaCIKKworLyoKKyAqIC0tLSBDRVZfV0FURVJNQVJLX0VOVU0gLS0tCisgKiBDUS9FUSBXYXRlcm1hcmsgRW5jb2RpbmdzLiBFbmNvZGVkIGFzIG51bWJlciBvZiBmcmVlIGVudHJpZXMgaW4KKyAqIFF1ZXVlIHdoZW4gV2F0ZXJtYXJrIGlzIHJlYWNoZWQuCisgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzAgICAgICAgICgwKQkvKiBXYXRlcm1hcmsgd2hlbiBRdWV1ZSBmdWxsICovCisjZGVmaW5lIENFVl9XTUFSS18xNiAgICAgICAoMSkJLyogV2F0ZXJtYXJrIGF0IDE2IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfMzIgICAgICAgKDIpCS8qIFdhdGVybWFyayBhdCAzMiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzQ4ICAgICAgICgzKQkvKiBXYXRlcm1hcmsgYXQgNDggZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS182NCAgICAgICAoNCkJLyogV2F0ZXJtYXJrIGF0IDY0IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfODAgICAgICAgKDUpCS8qIFdhdGVybWFyayBhdCA4MCBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzk2ICAgICAgICg2KQkvKiBXYXRlcm1hcmsgYXQgOTYgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xMTIgICAgICAoNykJLyogV2F0ZXJtYXJrIGF0IDExMiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzEyOCAgICAgICg4KQkvKiBXYXRlcm1hcmsgYXQgMTI4IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfMTQ0ICAgICAgKDkpCS8qIFdhdGVybWFyayBhdCAxNDQgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xNjAgICAgICAoMTApCS8qIFdhdGVybWFyayBhdCAxNjAgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xNzYgICAgICAoMTEpCS8qIFdhdGVybWFyayBhdCAxNzYgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xOTIgICAgICAoMTIpCS8qIFdhdGVybWFyayBhdCAxOTIgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yMDggICAgICAoMTMpCS8qIFdhdGVybWFyayBhdCAyMDggZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yMjQgICAgICAoMTQpCS8qIFdhdGVybWFyayBhdCAyMjQgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yNDAgICAgICAoMTUpCS8qIFdhdGVybWFyayBhdCAyNDAgZnJlZSBlbnRyaWVzICovCisKKy8qCisgKiAtLS0gQ1FfQ05UX0VOVU0gLS0tCisgKiBDb21wbGV0aW9uIFF1ZXVlIENvdW50IEVuY29kaW5ncy4KKyAqLworI2RlZmluZSBDRVZfQ1FfQ05UXzI1NiAgICAgICAgICAgICAgICAgICgwKQkvKiBDUSBoYXMgMjU2IGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX0NRX0NOVF81MTIgICAgICAgICAgICAgICAgICAoMSkJLyogQ1EgaGFzIDUxMiBlbnRyaWVzICovCisjZGVmaW5lIENFVl9DUV9DTlRfMTAyNCAgICAgICAgICAgICAgICAgKDIpCS8qIENRIGhhcyAxMDI0IGVudHJpZXMgKi8KKworLyoKKyAqIC0tLSBFUV9DTlRfRU5VTSAtLS0KKyAqIEV2ZW50IFF1ZXVlIENvdW50IEVuY29kaW5ncy4KKyAqLworI2RlZmluZSBDRVZfRVFfQ05UXzI1NiAgICAgKDApCS8qIEVRIGhhcyAyNTYgZW50cmllcyAoMTYtYnl0ZSBFUUVzIG9ubHkpICovCisjZGVmaW5lIENFVl9FUV9DTlRfNTEyICAgICAoMSkJLyogRVEgaGFzIDUxMiBlbnRyaWVzICgxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF8xMDI0ICAgICgyKQkvKiBFUSBoYXMgMTAyNCBlbnRyaWVzICg0LWJ5dGUgb3IgKi8KKwkJCQkvKiAxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF8yMDQ4ICAgICgzKQkvKiBFUSBoYXMgMjA0OCBlbnRyaWVzICg0LWJ5dGUgb3IgKi8KKwkJCQkvKiAxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF80MDk2ICAgICg0KQkvKiBFUSBoYXMgNDA5NiBlbnRyaWVzICg0LWJ5dGUgRVFFcyBvbmx5KSAqLworCisvKgorICogLS0tIEVRX1NJWkVfRU5VTSAtLS0KKyAqIEV2ZW50IFF1ZXVlIEVudHJ5IFNpemUgRW5jb2RpbmcuCisgKi8KKyNkZWZpbmUgQ0VWX0VRX1NJWkVfNCAgICAgICAgICAgICAgICAgICAoMCkJLyogRVFFIGlzIDQgYnl0ZXMgKi8KKyNkZWZpbmUgQ0VWX0VRX1NJWkVfMTYgICAgICAgICAgICAgICAgICAoMSkJLyogRVFFIGlzIDE2IGJ5dGVzICovCisKKy8qCisgKiBDb21wbGV0aW9uIFF1ZXVlIENvbnRleHQgVGFibGUgRW50cnkuIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIENRLgorICogTG9jYXRlZCBpbiBSQU0gd2l0aGluIHRoZSBDRVYgYmxvY2suCisgKi8KK3N0cnVjdCBCRV9DUV9DT05URVhUX0FNQVAgeworCXU4IENpZHhbMTFdOwkvKiBEV09SRCAwICovCisJdTggV2F0ZXJtYXJrWzRdOwkvKiBEV09SRCAwICovCisJdTggTm9EZWxheTsJCS8qIERXT1JEIDAgKi8KKwl1OCBFUElkeFsxMV07CS8qIERXT1JEIDAgKi8KKwl1OCBDb3VudFsyXTsJLyogRFdPUkQgMCAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMCAqLworCXU4IFNvbEV2ZW50OwkvKiBEV09SRCAwICovCisJdTggRXZlbnRhYmxlOwkvKiBEV09SRCAwICovCisJdTggUGlkeFsxMV07CS8qIERXT1JEIDEgKi8KKwl1OCBQRFsxMF07CQkvKiBEV09SRCAxICovCisJdTggRVFJRFs3XTsJCS8qIERXT1JEIDEgKi8KKwl1OCBGdW5jOwkJLyogRFdPUkQgMSAqLworCXU4IFdNRTsJCS8qIERXT1JEIDEgKi8KKwl1OCBTdGFsbGVkOwkJLyogRFdPUkQgMSAqLworCXU4IEFybWVkOwkJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDUV9DT05URVhUX0FNQVAgeworCXUzMiBkd1syXTsKK307CisKKy8qCisgKiBFdmVudCBRdWV1ZSBDb250ZXh0IFRhYmxlIEVudHJ5LiBDb250YWlucyB0aGUgc3RhdGUgb2YgYW4gRVEuCisgKiBMb2NhdGVkIGluIFJBTSBpbiB0aGUgQ0VWIGJsb2NrLgorICovCitzdHJ1Y3QgQkVfRVFfQ09OVEVYVF9BTUFQIHsKKwl1OCBDaWR4WzEzXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzJdOwkvKiBEV09SRCAwICovCisJdTggRnVuYzsJCS8qIERXT1JEIDAgKi8KKwl1OCBFUElkeFsxM107CS8qIERXT1JEIDAgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMTsJCS8qIERXT1JEIDAgKi8KKwl1OCBTaXplOwkJLyogRFdPUkQgMCAqLworCXU4IFBpZHhbMTNdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDJbM107CS8qIERXT1JEIDEgKi8KKwl1OCBQRFsxMF07CQkvKiBEV09SRCAxICovCisJdTggQ291bnRbM107CS8qIERXT1JEIDEgKi8KKwl1OCBTb2xFdmVudDsJLyogRFdPUkQgMSAqLworCXU4IFN0YWxsZWQ7CQkvKiBEV09SRCAxICovCisJdTggQXJtZWQ7CQkvKiBEV09SRCAxICovCisJdTggV2F0ZXJtYXJrWzRdOwkvKiBEV09SRCAyICovCisJdTggV01FOwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQzWzNdOwkvKiBEV09SRCAyICovCisJdTggRXZlbnRWZWN0WzZdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDRbMl07CS8qIERXT1JEIDIgKi8KKwl1OCBEZWxheVs4XTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ1WzZdOwkvKiBEV09SRCAyICovCisJdTggVE1SOwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ2OwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUV9DT05URVhUX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKyNlbmRpZiAvKiBfX2JlX2NtX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2M2RjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jb21tb24uaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fYmVfY29tbW9uX2FtYXBfaF9fCisjZGVmaW5lIF9fYmVfY29tbW9uX2FtYXBfaF9fCisKKy8qIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdHJ1Y3QgQkVfUEhZU19BRERSX0FNQVAgeworCXU4IGxvWzMyXTsJCS8qIERXT1JEIDAgKi8KKwl1OCBoaVszMl07CQkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBIWVNfQUREUl9BTUFQIHsKKwl1MzIgZHdbMl07Cit9OworCisvKiBWaXJ0dWFsIEFkZHJlc3MuICovCitzdHJ1Y3QgQkVfVklSVF9BRERSX0FNQVAgeworCXU4IGxvWzMyXTsJCS8qIERXT1JEIDAgKi8KKwl1OCBoaVszMl07CQkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFZJUlRfQUREUl9BTUFQIHsKKwl1MzIgZHdbMl07Cit9OworCisvKiBTY2F0dGVyIGdhdGhlciBlbGVtZW50LiAqLworc3RydWN0IEJFX1NHRV9BTUFQIHsKKwl1OCBhZGRyX2hpWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IGFkZHJfbG9bMzJdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAyICovCisJdTggbGVuWzE2XTsJCS8qIERXT1JEIDMgKi8KKwl1OCByc3ZkMVsxNl07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgU0dFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKyNlbmRpZiAvKiBfX2JlX2NvbW1vbl9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3YWY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9ldGh0b29sLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBiZV9ldGh0b29sLmMKKyAqCisgKiAJVGhpcyBmaWxlIGNvbnRhaW5zIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgZXRodG9vbCBjYW4gdXNlCisgKiAJdG8gdGFsayB0byB0aGUgZHJpdmVyIGFuZCB0aGUgQkUgSC9XLgorICovCisKKyNpbmNsdWRlICJiZW5ldC5oIgorCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBiZW5ldF9nc3RyaW5nc19zdGF0c1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisvKiBuZXRfZGV2aWNlX3N0YXRzICovCisJInJ4X3BhY2tldHMiLAorCSJ0eF9wYWNrZXRzIiwKKwkicnhfYnl0ZXMiLAorCSJ0eF9ieXRlcyIsCisJInJ4X2Vycm9ycyIsCisJInR4X2Vycm9ycyIsCisJInJ4X2Ryb3BwZWQiLAorCSJ0eF9kcm9wcGVkIiwKKwkibXVsdGljYXN0IiwKKwkiY29sbGlzaW9ucyIsCisJInJ4X2xlbmd0aF9lcnJvcnMiLAorCSJyeF9vdmVyX2Vycm9ycyIsCisJInJ4X2NyY19lcnJvcnMiLAorCSJyeF9mcmFtZV9lcnJvcnMiLAorCSJyeF9maWZvX2Vycm9ycyIsCisJInJ4X21pc3NlZF9lcnJvcnMiLAorCSJ0eF9hYm9ydGVkX2Vycm9ycyIsCisJInR4X2NhcnJpZXJfZXJyb3JzIiwKKwkidHhfZmlmb19lcnJvcnMiLAorCSJ0eF9oZWFydGJlYXRfZXJyb3JzIiwKKwkidHhfd2luZG93X2Vycm9ycyIsCisJInJ4X2NvbXByZXNzZWQiLAorCSJ0Y19jb21wcmVzc2VkIiwKKy8qIEJFIGRyaXZlciBTdGF0cyAqLworCSJiZXNfdHhfcmVxcyIsCisJImJlc190eF9mYWlscyIsCisJImJlc19md2RfcmVxcyIsCisJImJlc190eF93cmJzIiwKKwkiYmVzX2ludGVycnVwdHMiLAorCSJiZXNfZXZlbnRzIiwKKwkiYmVzX3R4X2V2ZW50cyIsCisJImJlc19yeF9ldmVudHMiLAorCSJiZXNfdHhfY29tcGwiLAorCSJiZXNfcnhfY29tcGwiLAorCSJiZXNfZXRocnhfcG9zdF9mYWlsIiwKKwkiYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzIiwKKwkiYmVzXzgwMl8zX21hbGZvcm1lZF9mcmFtZXMiLAorCSJiZXNfcnhfbWlzY19wa3RzIiwKKwkiYmVzX2V0aF90eF9yYXRlIiwKKwkiYmVzX2V0aF9yeF9yYXRlIiwKKwkiTnVtIFBhY2tldHMgY29sbGVjdGVkIiwKKwkiTnVtIFRpbWVzIEZsdXNoZWQiLAorfTsKKworI2RlZmluZSBORVRfREVWX1NUQVRTX0xFTiBcCisJKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjZGVmaW5lIEJFTkVUX1NUQVRTX0xFTiAgQVJSQVlfU0laRShiZW5ldF9nc3RyaW5nc19zdGF0cykKKworc3RhdGljIHZvaWQKK2JlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKworCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBiZV9kcml2ZXJfbmFtZSwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgYmVfZHJ2cl92ZXIsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sIGJlX2Z3X3ZlciwgMzIpOworCXN0cmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldikpOworCWRydmluZm8tPnRlc3RpbmZvX2xlbiA9IDA7CisJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSAwOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSAwOworfQorCitzdGF0aWMgaW50CitiZV9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisKKwljb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBhZGFwdGVyLT5tYXhfcnhfY29hbDsKKworCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyA9IGFkYXB0ZXItPmN1cl9lcWQ7CisJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2ggPSBhZGFwdGVyLT5tYXhfZXFkOworCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19sb3cgPSBhZGFwdGVyLT5taW5fZXFkOworCisJY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzID0gYWRhcHRlci0+Y3VyX2VxZDsKKwljb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3NfaGlnaCA9IGFkYXB0ZXItPm1heF9lcWQ7CisJY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzX2xvdyA9IGFkYXB0ZXItPm1pbl9lcWQ7CisKKwljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0gYWRhcHRlci0+ZW5hYmxlX2FpYzsKKwljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlID0gYWRhcHRlci0+ZW5hYmxlX2FpYzsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gc2V0IGludGVycnVwIGNvYWxlc2NpbmcgZGVsYXkgKmFzIHdlbGwgYXMqCisgKiB0aGUgbnVtYmVyIG9mIHBrdHMgdG8gY29hbGVzY2UgZm9yIExSTy4KKyAqLworc3RhdGljIGludAorYmVfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsZXNjZSkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdHA7CisJdTMyIG1heCwgbWluLCBjdXI7CisJaW50IHN0YXR1czsKKworCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCWlmIChhZGFwdGVyLT5tYXhfcnhfY29hbCA+PSBCRV9MUk9fTUFYX1BLVFMpCisJCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gQkVfTFJPX01BWF9QS1RTOworCisJaWYgKGFkYXB0ZXItPmVuYWJsZV9haWMgPT0gMCAmJgorCQljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID09IDEpIHsKKwkJLyogaWYgQUlDIGlzIGJlaW5nIHR1cm5lZCBvbiBub3csIHN0YXJ0IHdpdGggYW4gRVFEIG9mIDAgKi8KKwkJYWRhcHRlci0+Y3VyX2VxZCA9IDA7CisJfQorCWFkYXB0ZXItPmVuYWJsZV9haWMgPSBjb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlOworCisJLyogcm91bmQgb2ZmIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgOCAqLworCW1heCA9ICgoKGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoICsgNCkgPj4gMykgPDwgMyk7CisJbWluID0gKCgoY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdyArIDQpID4+IDMpIDw8IDMpOworCWN1ciA9ICgoKGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyArIDQpID4+IDMpIDw8IDMpOworCisJaWYgKGFkYXB0ZXItPmVuYWJsZV9haWMpIHsKKwkJLyogYWNjZXB0IGxvdyBhbmQgaGlnaCBpZiBBSUMgaXMgZW5hYmxlZCAqLworCQlpZiAobWF4ID4gTUFYX0VRRCkKKwkJCW1heCA9IE1BWF9FUUQ7CisJCWlmIChtaW4gPiBtYXgpCisJCQltaW4gPSBtYXg7CisJCWFkYXB0ZXItPm1heF9lcWQgPSBtYXg7CisJCWFkYXB0ZXItPm1pbl9lcWQgPSBtaW47CisJCWlmIChhZGFwdGVyLT5jdXJfZXFkID4gbWF4KQorCQkJYWRhcHRlci0+Y3VyX2VxZCA9IG1heDsKKwkJaWYgKGFkYXB0ZXItPmN1cl9lcWQgPCBtaW4pCisJCQlhZGFwdGVyLT5jdXJfZXFkID0gbWluOworCX0gZWxzZSB7CisJCS8qIGFjY2VwdCBzcGVjaWZpZWQgY29hbGVzY2VfdXNlY3Mgb25seSBpZiBBSUMgaXMgZGlzYWJsZWQgKi8KKwkJaWYgKGN1ciA+IE1BWF9FUUQpCisJCQljdXIgPSBNQVhfRVFEOworCQllcV9vYmplY3RwID0gJnBub2ItPmV2ZW50X3Ffb2JqOworCQlzdGF0dXMgPQorCQkgICAgYmVfZXFfbW9kaWZ5X2RlbGF5KCZwbm9iLT5mbl9vYmosIDEsICZlcV9vYmplY3RwLCAmY3VyLAorCQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHN0YXR1cyA9PSBCRV9TVUNDRVNTKQorCQkJYWRhcHRlci0+Y3VyX2VxZCA9IGN1cjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYmVfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXJldHVybiBhZGFwdGVyLT5yeF9jc3VtOworfQorCitzdGF0aWMgaW50IGJlX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKworCWlmIChkYXRhKQorCQlhZGFwdGVyLT5yeF9jc3VtID0gMTsKKwllbHNlCisJCWFkYXB0ZXItPnJ4X2NzdW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitiZV9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBzdHJpbmdzZXQsIHVpbnQ4X3QgKmRhdGEpCit7CisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGRhdGEsICpiZW5ldF9nc3RyaW5nc19zdGF0cywKKwkJICAgICAgIHNpemVvZihiZW5ldF9nc3RyaW5nc19zdGF0cykpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmVfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEJFTkVUX1NUQVRTX0xFTjsKK30KKworc3RhdGljIHZvaWQKK2JlX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCWludCBpOworCisJYmVuZXRfZ2V0X3N0YXRzKG5ldGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDw9IE5FVF9ERVZfU1RBVFNfTEVOOyBpKyspCisJCWRhdGFbaV0gPSAoKHVuc2lnbmVkIGxvbmcgKikmYWRhcHRlci0+YmVuZXRfc3RhdHMpW2ldOworCisJZGF0YVtpXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X3JlcXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfZmFpbHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZndkX3JlcXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfd3JiczsKKworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZXZlbnRzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2V2ZW50czsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9ldmVudHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfY29tcGw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfY29tcGw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRocnhfcG9zdF9mYWlsOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzXzgwMl8zX21hbGZvcm1lZF9mcmFtZXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfbWlzY19wa3RzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF90eF9yYXRlOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF9yeF9yYXRlOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2NvYWw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfZmx1c2g7CisKK30KKworc3RhdGljIGludCBiZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDA7CisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBSaW5nIHBhcmFtZXRlcnMgZnJvbSB0aGUgcG5vYiAqLworc3RhdGljIHZvaWQKK2JlX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFByZSBTZXQgTWF4aW1zICovCisJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBwbm9iLT5yeF9xX2xlbjsKKwlyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZzsKKwlyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IHJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nOworCXJpbmctPnR4X21heF9wZW5kaW5nID0gcG5vYi0+dHhfcV9sZW47CisKKwkvKiBDdXJyZW50IGhhcmR3YXJlIFNldHRpbmdzICAgICAgICAgICAgICAgICovCisJcmluZy0+cnhfcGVuZGluZyA9IGF0b21pY19yZWFkKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJcmluZy0+cnhfbWluaV9wZW5kaW5nID0gcmluZy0+cnhfbWluaV9wZW5kaW5nOworCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSByaW5nLT5yeF9qdW1ib19wZW5kaW5nOworCXJpbmctPnR4X3BlbmRpbmcgPSBhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKTsKKworfQorCitzdGF0aWMgdm9pZAorYmVfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZWNtZCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYm9vbCByeGZjLCB0eGZjOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBiZV9ldGhfZ2V0X2Zsb3dfY29udHJvbCgmcG5vYi0+Zm5fb2JqLCAmdHhmYywgJnJ4ZmMpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IHBhdXNlIGZyYW1lIHNldHRpbmdzXG4iKTsKKwkJLyogcmV0dXJuIGRlZmF1bHRzICovCisJCWVjbWQtPnJ4X3BhdXNlID0gMTsKKwkJZWNtZC0+dHhfcGF1c2UgPSAwOworCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHhmYyA9PSB0cnVlKQorCQllY21kLT50eF9wYXVzZSA9IDE7CisJZWxzZQorCQllY21kLT50eF9wYXVzZSA9IDA7CisKKwlpZiAocnhmYyA9PSB0cnVlKQorCQllY21kLT5yeF9wYXVzZSA9IDE7CisJZWxzZQorCQllY21kLT5yeF9wYXVzZSA9IDA7CisKKwllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7Cit9CisKK3N0YXRpYyBpbnQKK2JlX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVjbWQpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWJvb2wgdHhmYywgcnhmYzsKKwlpbnQgc3RhdHVzOworCisJaWYgKGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVjbWQtPnR4X3BhdXNlKQorCQl0eGZjID0gdHJ1ZTsKKwllbHNlCisJCXR4ZmMgPSBmYWxzZTsKKworCWlmIChlY21kLT5yeF9wYXVzZSkKKwkJcnhmYyA9IHRydWU7CisJZWxzZQorCQlyeGZjID0gZmFsc2U7CisKKwlzdGF0dXMgPSBiZV9ldGhfc2V0X2Zsb3dfY29udHJvbCgmcG5vYi0+Zm5fb2JqLCB0eGZjLCByeGZjKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiVW5hYmxlIHRvIHNldCBwYXVzZSBmcmFtZSBzZXR0aW5nc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBldGh0b29sX29wcyBiZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gYmVfZ2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGJlX2dldF9kcnZpbmZvLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9jb2FsZXNjZSA9IGJlX2dldF9jb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlID0gYmVfc2V0X2NvYWxlc2NlLAorCS5nZXRfcmluZ3BhcmFtID0gYmVfZ2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0gPSBiZV9nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0gPSBiZV9zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3J4X2NzdW0gPSBiZV9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBiZV9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0gPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCisJLmdldF9zZyA9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cgPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbyA9IGV0aHRvb2xfb3Bfc2V0X3RzbywKKwkuZ2V0X3N0cmluZ3MgPSBiZV9nZXRfc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50ID0gYmVfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IGJlX2dldF9ldGh0b29sX3N0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTAyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfaW5pdC5jCkBAIC0wLDAgKzEsMTM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAiYmVuZXQuaCIKKworI2RlZmluZSAgRFJWUl9WRVJTSU9OICAiMS4wLjcyOCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJlX2RldmljZV9pZF90YWJsZVtdID0geworCXtQQ0lfREVWSUNFKDB4MTlhMiwgMHgwMjAxKX0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmVfZGV2aWNlX2lkX3RhYmxlKTsKKworTU9EVUxFX1ZFUlNJT04oRFJWUl9WRVJTSU9OKTsKKworI2RlZmluZSBEUlZfREVTQ1JJUFRJT04gIlNlcnZlckVuZ2luZXMgQmxhZGVFbmdpbmUgTmV0d29yayBEcml2ZXIgVmVyc2lvbiAiCisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04gRFJWUl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIlNlcnZlckVuZ2luZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtc2l4ID0gMTsKK21vZHVsZV9wYXJhbShtc2l4LCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobXNpeCwgIlVzZSBNU0kteCBpbnRlcnJ1cHRzIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhidWZfc2l6ZSA9IDIwNDg7CS8qIERlZmF1bHQgUlggZnJhZyBzaXplICovCittb2R1bGVfcGFyYW0ocnhidWZfc2l6ZSwgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4YnVmX3NpemUsICJTaXplIG9mIGJ1ZmZlcnMgdG8gaG9sZCBSeCBkYXRhIik7CisKK2NvbnN0IGNoYXIgYmVfZHJ2cl92ZXJbXSA9IERSVlJfVkVSU0lPTjsKK2NoYXIgYmVfZndfdmVyWzMyXTsJCS8qIEYvVyB2ZXJzaW9uIGZpbGxlZCBpbiBieSBiZV9wcm9iZSAqLworY2hhciBiZV9kcml2ZXJfbmFtZVtdID0gImJlbmV0IjsKKworLyoKKyAqIE51bWJlciBvZiBlbnRyaWVzIGluIGVhY2ggcXVldWUuCisgKi8KKyNkZWZpbmUgRVZFTlRfUV9MRU4JCTEwMjQKKyNkZWZpbmUgRVRIX1RYUV9MRU4JCTIwNDgKKyNkZWZpbmUgRVRIX1RYQ1FfTEVOCQkxMDI0CisjZGVmaW5lIEVUSF9SWFFfTEVOCQkxMDI0CS8qIERvZXMgbm90IHN1cHBvcnQgYW55IG90aGVyIHZhbHVlICovCisjZGVmaW5lIEVUSF9VQ19SWENRX0xFTgkJMTAyNAorI2RlZmluZSBFVEhfQkNfUlhDUV9MRU4JCTI1NgorI2RlZmluZSBNQ0NfUV9MRU4gICAgICAgICAgICAgICA2NAkvKiB0b3RhbCBzaXplIG5vdCB0byBleGNlZWQgOCBwYWdlcyAqLworI2RlZmluZSBNQ0NfQ1FfTEVOICAgICAgICAgICAgICAyNTYKKworLyogQml0IG1hc2sgZGVzY3JpYmluZyBldmVudHMgb2YgaW50ZXJlc3QgdG8gYmUgdHJhY2VkICovCit1bnNpZ25lZCBpbnQgdHJhY2VfbGV2ZWw7CisKK3N0YXRpYyBpbnQKK2luaXRfcGNpX2JlX2Z1bmN0aW9uKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1NjQgcGE7CisKKwkvKiBDU1IgKi8KKwlwYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlhZGFwdGVyLT5jc3JfdmEgPSBpb3JlbWFwX25vY2FjaGUocGEsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCWlmIChhZGFwdGVyLT5jc3JfdmEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBEb29yIEJlbGwgKi8KKwlwYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsKKwlhZGFwdGVyLT5kYl92YSA9IGlvcmVtYXBfbm9jYWNoZShwYSwgKDEyOCAqIDEwMjQpKTsKKwlpZiAoYWRhcHRlci0+ZGJfdmEgPT0gTlVMTCkgeworCQlpb3VubWFwKGFkYXB0ZXItPmNzcl92YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFBDSSAqLworCXBhID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCWFkYXB0ZXItPnBjaV92YSA9IGlvcmVtYXBfbm9jYWNoZShwYSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSk7CisJaWYgKGFkYXB0ZXItPnBjaV92YSA9PSBOVUxMKSB7CisJCWlvdW5tYXAoYWRhcHRlci0+Y3NyX3ZhKTsKKwkJaW91bm1hcChhZGFwdGVyLT5kYl92YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgaW50ZXJydXB0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEV2ZW50CisgICBxdWV1ZSBJRCBmb3IgdGhlIGdpdmVuIE5ldE9iamVjdAorKi8KK3ZvaWQgYmVfZW5hYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKwljcWRiLmR3WzBdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBwbm9iLT5ldmVudF9xX2lkKTsKKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgY3FkYi5kd1swXSk7Cit9CisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBpbnRlcnJ1cHQgY29ycmVzcG9uZGluZyB0byB0aGUgRXZlbnQKKyAgIHF1ZXVlIElEIGZvciB0aGUgZ2l2ZW4gTmV0T2JqZWN0CisqLwordm9pZCBiZV9kaXNhYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKwljcWRiLmR3WzBdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZjcWRiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBwbm9iLT5ldmVudF9xX2lkKTsKKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgY3FkYi5kd1swXSk7Cit9CisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgIG5ldHdvcmsgZnVuY3Rpb24KKyAgICBvZiB0aGUgQmxhZGVFbmdpbmUuIFVzZSB0aGUgZnVuY3Rpb24gYmVfZGlzYWJsZV9lcV9pbnRyKCkKKyAgICB0byBlbmFibGUgdGhlIGludGVycnVwdCBmcm9tIHRoZSBldmVudCBxdWV1ZSBvZiBvbmx5IG9uZSBzcGVjaWZpYworICAgIE5ldE9iamVjdAorKi8KK3ZvaWQgYmVfZW5hYmxlX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIGN0cmw7CisJdTMyIGhvc3RfaW50cjsKKworCWN0cmwuZHdbMF0gPSBQQ0lDRkcxX1JFQUQoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCk7CisJaG9zdF9pbnRyID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSLAorCQkJCQkJCWhvc3RpbnRyLCBjdHJsLmR3KTsKKwlpZiAoIWhvc3RfaW50cikgeworCQlBTUFQX1NFVF9CSVRTX1BUUihQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1IsCisJCQlob3N0aW50ciwgY3RybC5kdywgMSk7CisJCVBDSUNGRzFfV1JJVEUoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCwKKwkJCWN0cmwuZHdbMF0pOworCX0KK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIGludGVycnVwdCBmcm9tIHRoZSBuZXR3b3JrIGZ1bmN0aW9uIG9mCisgICB0aGUgQmxhZGVFbmdpbmUuICBVc2UgdGhlIGZ1bmN0aW9uIGJlX2Rpc2FibGVfZXFfaW50cigpIHRvCisgICBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgZXZlbnQgcXVldWUgb2Ygb25seSBvbmUgc3BlY2lmaWMgTmV0T2JqZWN0CisqLwordm9pZCBiZV9kaXNhYmxlX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisKKwlzdHJ1Y3QgUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgY3RybDsKKwl1MzIgaG9zdF9pbnRyOworCWN0cmwuZHdbMF0gPSBQQ0lDRkcxX1JFQUQoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCk7CisJaG9zdF9pbnRyID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSLAorCQkJCQkJCWhvc3RpbnRyLCBjdHJsLmR3KTsKKwlpZiAoaG9zdF9pbnRyKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUiwgaG9zdGludHIsCisJCQljdHJsLmR3LCAwKTsKKwkJUENJQ0ZHMV9XUklURSgmcG5vYi0+Zm5fb2JqLCBob3N0X3RpbWVyX2ludF9jdHJsLAorCQkJY3RybC5kd1swXSk7CisJfQorfQorCitzdGF0aWMgaW50IGJlX2VuYWJsZV9tc2l4KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCByZXQ7CisKKwlpZiAoIW1zaXgpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBCRV9NQVhfUkVRX01TSVhfVkVDVE9SUzsgaSsrKQorCQlhZGFwdGVyLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJcmV0ID0gcGNpX2VuYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPm1zaXhfZW50cmllcywKKwkJQkVfTUFYX1JFUV9NU0lYX1ZFQ1RPUlMpOworCisJaWYgKHJldCA9PSAwKQorCQlhZGFwdGVyLT5tc2l4X2VuYWJsZWQgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmVfcmVnaXN0ZXJfaXNyKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG5vYi0+bmV0ZGV2OworCWludCBpbnR4ID0gMCwgcjsKKworCW5ldGRldi0+aXJxID0gYWRhcHRlci0+cGRldi0+aXJxOworCXIgPSBiZV9lbmFibGVfbXNpeChhZGFwdGVyKTsKKworCWlmIChyID09IDApIHsKKwkJciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1swXS52ZWN0b3IsCisJCQkJYmVfaW50LCBJUlFGX1NIQVJFRCwgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQlpZiAocikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJNU0lYIFJlcXVlc3QgSVJRIGZhaWxlZCAtIEVycm5vICVkXG4iLCByKTsKKwkJCWludHggPSAxOworCQkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKKwkJCWFkYXB0ZXItPm1zaXhfZW5hYmxlZCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlpbnR4ID0gMTsKKwl9CisKKwlpZiAoaW50eCkgeworCQlyID0gcmVxdWVzdF9pcnEobmV0ZGV2LT5pcnEsIGJlX2ludCwgSVJRRl9TSEFSRUQsCisJCQkJbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQlpZiAocikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJJTlR4IFJlcXVlc3QgSVJRIGZhaWxlZCAtIEVycm5vICVkXG4iLCByKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3VucmVnaXN0ZXJfaXNyKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXZwOworCWlmIChhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCkgeworCQlpZiAoYWRhcHRlci0+bXNpeF9lbmFibGVkKSB7CisJCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbMF0udmVjdG9yLCBuZXRkZXYpOworCQkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKKwkJCWFkYXB0ZXItPm1zaXhfZW5hYmxlZCA9IDA7CisJCX0gZWxzZSB7CisJCQlmcmVlX2lycShuZXRkZXYtPmlycSwgbmV0ZGV2KTsKKwkJfQorCQlhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCA9IDA7CisJfQorfQorCisvKgorICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBGbHVzaCBDb21wbGV0aW9ucyB0aGF0IGFyZSBpc3N1ZWQgYnkgdGhlCisgICAgQVJNIEYvVywgd2hlbiBhIFJlY3YgUmluZyBpcyBkZXN0cm95ZWQuICBBIGZsdXNoIGNvbXBsZXRpb24gaXMKKyAgICBpZGVudGlmaWVkIHdoZW4gYSBSeCBDT21wbCBkZXNjcmlwdG9yIGhhcyB0aGUgdGNwY2tzdW0gYW5kIHVkcGNrc3VtCisgICAgc2V0IGFuZCB0aGUgcGt0c2l6ZSBpcyAzMi4gIFRoZXNlIGNvbXBsZXRpb25zIGFyZSByZWNlaXZlZCBvbiB0aGUKKyAgICBSeCBDb21wbGV0aW9uIFF1ZXVlLgorKi8KK3N0YXRpYyB1MzIgYmVfcHJvY2Vzc19yeF9mbHVzaF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJd2hpbGUgKChyeGNwID0gYmVfZ2V0X3J4X2NtcGwocG5vYikpICE9IE5VTEwpIHsKKwkJYmVfbm90aWZ5X2NtcGwocG5vYiwgMSwgcG5vYi0+cnhfY3FfaWQsIDEpOworCQlpKys7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBiZV90eF9xX2NsZWFuKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXdoaWxlIChhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKSkKKwkJcHJvY2Vzc19vbmVfdHhfY29tcGwocG5vYiwgdHhfY29tcGxfbGFzdHdyYl9pZHhfZ2V0KHBub2IpKTsKK30KKworc3RhdGljIHZvaWQgYmVfcnhfcV9jbGVhbihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpZiAocG5vYi0+cnhfY3R4dCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqcnhfcGFnZV9pbmZvOworCQlmb3IgKGkgPSAwOyBpIDwgcG5vYi0+cnhfcV9sZW47IGkrKykgeworCQkJcnhfcGFnZV9pbmZvID0gJihwbm9iLT5yeF9wYWdlX2luZm9baV0pOworCQkJaWYgKCFwbm9iLT5yeF9wZ19zaGFyZWQgfHwgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCkgeworCQkJCXBjaV91bm1hcF9wYWdlKHBub2ItPmFkYXB0ZXItPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCQkJICAgICAgIHBub2ItPnJ4X2J1Zl9zaXplLAorCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0KKwkJCWlmIChyeF9wYWdlX2luZm8tPnBhZ2UpCisJCQkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCX0KKwkJcG5vYi0+cnhfcGdfaW5mb19oZCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZV9kZXN0cm95X25ldG9iaihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKHBub2ItPnR4X3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9ldGhfc3FfZGVzdHJveSgmcG5vYi0+dHhfcV9vYmopOworCQlwbm9iLT50eF9xX2NyZWF0ZWQgPSAwOworCX0KKworCWlmIChwbm9iLT5yeF9xX2NyZWF0ZWQpIHsKKwkJc3RhdHVzID0gYmVfZXRoX3JxX2Rlc3Ryb3koJnBub2ItPnJ4X3Ffb2JqKTsKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlzdGF0dXMgPSBiZV9ldGhfcnFfZGVzdHJveV9vcHRpb25zKCZwbm9iLT5yeF9xX29iaiwgMCwKKwkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCQkJQlVHX09OKHN0YXR1cyk7CisJCX0KKwkJcG5vYi0+cnhfcV9jcmVhdGVkID0gMDsKKwl9CisKKwliZV9wcm9jZXNzX3J4X2ZsdXNoX2NtcGwocG5vYik7CisKKwlpZiAocG5vYi0+dHhfY3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9jcV9kZXN0cm95KCZwbm9iLT50eF9jcV9vYmopOworCQlwbm9iLT50eF9jcV9jcmVhdGVkID0gMDsKKwl9CisKKwlpZiAocG5vYi0+cnhfY3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9jcV9kZXN0cm95KCZwbm9iLT5yeF9jcV9vYmopOworCQlwbm9iLT5yeF9jcV9jcmVhdGVkID0gMDsKKwl9CisKKwlpZiAocG5vYi0+bWNjX3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9tY2NfcmluZ19kZXN0cm95KCZwbm9iLT5tY2NfcV9vYmopOworCQlwbm9iLT5tY2NfcV9jcmVhdGVkID0gMDsKKwl9CisJaWYgKHBub2ItPm1jY19jcV9jcmVhdGVkKSB7CisJCXN0YXR1cyA9IGJlX2NxX2Rlc3Ryb3koJnBub2ItPm1jY19jcV9vYmopOworCQlwbm9iLT5tY2NfY3FfY3JlYXRlZCA9IDA7CisJfQorCisJaWYgKHBub2ItPmV2ZW50X3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9lcV9kZXN0cm95KCZwbm9iLT5ldmVudF9xX29iaik7CisJCXBub2ItPmV2ZW50X3FfY3JlYXRlZCA9IDA7CisJfQorCWJlX2Z1bmN0aW9uX2NsZWFudXAoJnBub2ItPmZuX29iaik7Cit9CisKKy8qCisgKiBmcmVlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcG5vYgorICogQ2FsbGVkIGF0IHRoZSB0aW1lIG9mIG1vZHVsZSBjbGVhbnVwIGFzIHdlbGwgYSBhbnkgZXJyb3IgZHVyaW5nCisgKiBtb2R1bGUgaW5pdC4gIFNvbWUgcmVzb3VyY2VzIG1heSBiZSBwYXJ0aWFsbHkgYWxsb2NhdGVkIGluIGEgTmV0T2JqLgorICovCitzdGF0aWMgdm9pZCBuZXRvYmplY3RfY2xlYW51cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXZwOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCWJlX3dhaXRfbmljX3R4X2NtcGx4X2NtcGwocG5vYik7CisJCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKwl9CisKKwliZV91bnJlZ2lzdGVyX2lzcihhZGFwdGVyKTsKKworCWlmIChhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQpIHsKKwkJdGFza2xldF9raWxsKCYoYWRhcHRlci0+c3RzX2hhbmRsZXIpKTsKKwkJYWRhcHRlci0+dGFza2xldF9zdGFydGVkID0gMDsKKwl9CisJaWYgKHBub2ItPmZuX29ial9jcmVhdGVkKQorCQliZV9kaXNhYmxlX2ludHIocG5vYik7CisKKwlpZiAoYWRhcHRlci0+ZGV2X3N0YXRlICE9IEJFX0RFVl9TVEFURV9OT05FKQorCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCisJaWYgKHBub2ItPmZuX29ial9jcmVhdGVkKQorCQliZV9kZXN0cm95X25ldG9iaihwbm9iKTsKKworCWFkYXB0ZXItPm5ldF9vYmogPSBOVUxMOworCWFkYXB0ZXItPm5ldGRldnAgPSBOVUxMOworCisJYmVfcnhfcV9jbGVhbihwbm9iKTsKKwlpZiAocG5vYi0+cnhfY3R4dCkgeworCQlrZnJlZShwbm9iLT5yeF9wYWdlX2luZm8pOworCQlrZnJlZShwbm9iLT5yeF9jdHh0KTsKKwl9CisKKwliZV90eF9xX2NsZWFuKHBub2IpOworCWtmcmVlKHBub2ItPnR4X2N0eHQpOworCisJaWYgKHBub2ItPm1jY19xKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1jY19xX3NpemUsCisJCQlwbm9iLT5tY2NfcSwgcG5vYi0+bWNjX3FfYnVzKTsKKworCWlmIChwbm9iLT5tY2Nfd3JiX2N0eHQpCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcG5vYi0+bWNjX3dyYl9jdHh0LAorCQkJICAgZ2V0X29yZGVyKHBub2ItPm1jY193cmJfY3R4dF9zaXplKSk7CisKKwlpZiAocG5vYi0+bWNjX2NxKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1jY19jcV9zaXplLAorCQkJcG5vYi0+bWNjX2NxLCBwbm9iLT5tY2NfY3FfYnVzKTsKKworCWlmIChwbm9iLT5ldmVudF9xKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPmV2ZW50X3Ffc2l6ZSwKKwkJCXBub2ItPmV2ZW50X3EsIHBub2ItPmV2ZW50X3FfYnVzKTsKKworCWlmIChwbm9iLT50eF9jcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9jcV9zaXplLAorCQkJcG5vYi0+dHhfY3EsIHBub2ItPnR4X2NxX2J1cyk7CisKKwlpZiAocG5vYi0+dHhfcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9xX3NpemUsCisJCQlwbm9iLT50eF9xLCBwbm9iLT50eF9xX2J1cyk7CisKKwlpZiAocG5vYi0+cnhfcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5yeF9xX3NpemUsCisJCQlwbm9iLT5yeF9xLCBwbm9iLT5yeF9xX2J1cyk7CisKKwlpZiAocG5vYi0+cnhfY3EpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+cnhfY3Ffc2l6ZSwKKwkJCXBub2ItPnJ4X2NxLCBwbm9iLT5yeF9jcV9idXMpOworCisKKwlpZiAocG5vYi0+bWJfcHRyKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1iX3NpemUsIHBub2ItPm1iX3B0ciwKKwkJCXBub2ItPm1iX2J1cyk7CisKKwlmcmVlX25ldGRldihuZXRkZXYpOworfQorCisKK3N0YXRpYyBpbnQgYmVfbm9iX3JpbmdfYWxsb2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJdTMyIHNpemU7CisKKwkvKiBNYWlsIGJveCByZDsgbWFpbGJveCBwb2ludGVyIG5lZWRzIHRvIGJlIDE2IGJ5dGUgYWxpZ25lZCAqLworCXBub2ItPm1iX3NpemUgPSBzaXplb2Yoc3RydWN0IE1DQ19NQUlMQk9YX0FNQVApICsgMTY7CisJcG5vYi0+bWJfcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWJfc2l6ZSwKKwkJCQkmcG5vYi0+bWJfYnVzKTsKKwlpZiAoIXBub2ItPm1iX2J1cykKKwkJcmV0dXJuIC0xOworCW1lbXNldChwbm9iLT5tYl9wdHIsIDAsIHBub2ItPm1iX3NpemUpOworCXBub2ItPm1iX3JkLnZhID0gUFRSX0FMSUdOKHBub2ItPm1iX3B0ciwgMTYpOworCXBub2ItPm1iX3JkLnBhID0gUFRSX0FMSUdOKHBub2ItPm1iX2J1cywgMTYpOworCXBub2ItPm1iX3JkLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgTUNDX01BSUxCT1hfQU1BUCk7CisJLyoKKwkgKiBFdmVudCBxdWV1ZQorCSAqLworCXBub2ItPmV2ZW50X3FfbGVuID0gRVZFTlRfUV9MRU47CisJcG5vYi0+ZXZlbnRfcV9zaXplID0gcG5vYi0+ZXZlbnRfcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVRX0VOVFJZX0FNQVApOworCXBub2ItPmV2ZW50X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5ldmVudF9xX3NpemUsCisJCQkJJnBub2ItPmV2ZW50X3FfYnVzKTsKKwlpZiAoIXBub2ItPmV2ZW50X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPmV2ZW50X3EsIDAsIHBub2ItPmV2ZW50X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVFggcXVldWUKKwkgKi8KKwlwbm9iLT50eF9xX2xlbiA9IEVUSF9UWFFfTEVOOworCXBub2ItPnR4X3FfcG9ydCA9IDA7CisJcG5vYi0+dHhfcV9zaXplID0gIHBub2ItPnR4X3FfbGVuICogc2l6ZW9mKHN0cnVjdCBFVEhfV1JCX0FNQVApOworCXBub2ItPnR4X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9xX3NpemUsCisJCQkJJnBub2ItPnR4X3FfYnVzKTsKKwlpZiAoIXBub2ItPnR4X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPnR4X3EsIDAsIHBub2ItPnR4X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVFggQ29tcGwgcXVldWUKKwkgKi8KKwlwbm9iLT50eGNxX2xlbiA9IEVUSF9UWENRX0xFTjsKKwlwbm9iLT50eF9jcV9zaXplID0gcG5vYi0+dHhjcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVUSF9UWF9DT01QTF9BTUFQKTsKKwlwbm9iLT50eF9jcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnR4X2NxX3NpemUsCisJCQkJJnBub2ItPnR4X2NxX2J1cyk7CisJaWYgKCFwbm9iLT50eF9jcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+dHhfY3EsIDAsIHBub2ItPnR4X2NxX3NpemUpOworCS8qCisJICogRXRoIFJYIHF1ZXVlCisJICovCisJcG5vYi0+cnhfcV9sZW4gPSBFVEhfUlhRX0xFTjsKKwlwbm9iLT5yeF9xX3NpemUgPSAgcG5vYi0+cnhfcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVUSF9SWF9EX0FNQVApOworCXBub2ItPnJ4X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5yeF9xX3NpemUsCisJCQkJJnBub2ItPnJ4X3FfYnVzKTsKKwlpZiAoIXBub2ItPnJ4X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPnJ4X3EsIDAsIHBub2ItPnJ4X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVW5pY2FzdCBSWCBDb21wbCBxdWV1ZQorCSAqLworCXBub2ItPnJ4X2NxX2xlbiA9IEVUSF9VQ19SWENRX0xFTjsKKwlwbm9iLT5yeF9jcV9zaXplID0gIHBub2ItPnJ4X2NxX2xlbiAqCisJCQlzaXplb2Yoc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQKTsKKwlwbm9iLT5yeF9jcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnJ4X2NxX3NpemUsCisJCQkJJnBub2ItPnJ4X2NxX2J1cyk7CisJaWYgKCFwbm9iLT5yeF9jcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+cnhfY3EsIDAsIHBub2ItPnJ4X2NxX3NpemUpOworCisJLyogVFggcmVzb3VyY2VzICovCisJc2l6ZSA9IHBub2ItPnR4X3FfbGVuICogc2l6ZW9mKHZvaWQgKiopOworCXBub2ItPnR4X2N0eHQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwbm9iLT50eF9jdHh0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIFJYIHJlc291cmNlcyAqLworCXNpemUgPSBwbm9iLT5yeF9xX2xlbiAqIHNpemVvZih2b2lkICopOworCXBub2ItPnJ4X2N0eHQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwbm9iLT5yeF9jdHh0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNpemUgPSAocG5vYi0+cnhfcV9sZW4gKiBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCXBub2ItPnJ4X3BhZ2VfaW5mbyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBub2ItPnJ4X3BhZ2VfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlhZGFwdGVyLT5ldGhfc3RhdHNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXB0ZXItPmV0aF9zdGF0c3AgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXBub2ItPnJ4X2J1Zl9zaXplID0gcnhidWZfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBiZV9uZXRfb2JqZWN0IGZvciBzdWJzZXF1ZW50CisgICAgbmV0d29yayBvcGVyYXRpb25zLgorCisgICAgQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIGRyaXZlciAgbXVzdCBoYXZlIGFsbG9jYXRlZAorICAgIHNwYWNlIGZvciB0aGUgTmV0T2JqZWN0IHN0cnVjdHVyZSwgaW5pdGlhbGl6ZWQgdGhlIHN0cnVjdHVyZSwKKyAgICBhbGxvY2F0ZWQgRE1BYWJsZSBtZW1vcnkgZm9yIGFsbCB0aGUgbmV0d29yayBxdWV1ZXMgdGhhdCBmb3JtCisgICAgcGFydCBvZiB0aGUgTmV0T2JqZWN0IGFuZCBwb3B1bGF0ZWQgdGhlIHN0YXJ0IGFkZHJlc3MgKHZpcnR1YWwpCisgICAgYW5kIG51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBmb3IgZWFjaCBxdWV1ZSBpbiB0aGUgTmV0T2JqZWN0IHN0cnVjdHVyZS4KKworICAgIFRoZSBkcml2ZXIgbXVzdCBhbHNvIGhhdmUgYWxsb2NhdGVkIG1lbW9yeSB0byBob2xkIHRoZQorICAgIG1haWxib3ggc3RydWN0dXJlIChNQ0NfTUFJTEJPWCkgYW5kIHBvc3QgdGhlIHBoeXNpY2FsIGFkZHJlc3MsCisgICAgdmlydHVhbCBhZGRyZXNzZXMgYW5kIHRoZSBzaXplIG9mIHRoZSBtYWlsYm94IG1lbW9yeSBpbiB0aGUKKyAgICBOZXRPYmoubWJfcmQuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IEJFQ0xJQiBmb3IKKyAgICBpbml0aWFsIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZW1iZWRkZWQgTUNDIHByb2Nlc3Nvci4gQkVDTElCCisgICAgdXNlcyB0aGUgbWFpbGJveCB1bnRpbCBNQ0MgcmluZ3MgYXJlIGNyZWF0ZWQgZm9yICBtb3JlICBlZmZpY2llbnQKKyAgICBjb21tdW5pY2F0aW9uIHdpdGggdGhlIE1DQyBwcm9jZXNzb3IuCisKKyAgICBJZiB0aGUgZHJpdmVyIHdhbnRzIHRvIGNyZWF0ZSBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZSBmb3IgbW9yZQorICAgIHRoYW4gb25lIHByb3RlY3Rpb24gZG9tYWluLCBpdCBjYW4gY2FsbCBiZV9jcmVhdGVfbmV0b2JqKCkKKyAgICBtdWx0aXBsZSB0aW1lcyAgb25jZSBmb3IgZWFjaCBwcm90ZWN0aW9uIGRvbWFpbi4gIEEgTWF4aW11bSBvZgorICAgIDMyIHByb3RlY3Rpb24gZG9tYWlucyBhcmUgc3VwcG9ydGVkLgorCisqLworc3RhdGljIGludAorYmVfY3JlYXRlX25ldG9iaihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgdTggX19pb21lbSAqY3NyX3ZhLAorCXU4IF9faW9tZW0gKmRiX3ZhLCB1OCBfX2lvbWVtICpwY2lfdmEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJYm9vbCAgZXZlbnRhYmxlID0gZmFsc2UsIHR4X25vX2RlbGF5ID0gZmFsc2UsIHJ4X25vX2RlbGF5ID0gZmFsc2U7CisJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0cCA9IE5VTEw7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiA9ICZwbm9iLT5mbl9vYmo7CisJc3RydWN0IHJpbmdfZGVzYyByZDsKKwl1MzIgc2V0X3J4YnVmX3NpemU7CisJdTMyIHR4X2NtcGxfd20gPSBDRVZfV01BUktfOTY7CS8qIDB4ZmZmZmZmZmYgdG8gZGlzYWJsZSAqLworCXUzMiByeF9jbXBsX3dtID0gQ0VWX1dNQVJLXzE2MDsJLyogMHhmZmZmZmZmZiB0byBkaXNhYmxlICovCisJdTMyIGVxX2RlbGF5ID0gMDsgLyogZGVsYXkgaW4gOHVzZWMgdW5pdHMuIDB4ZmZmZmZmZmYgdG8gZGlzYWJsZSAqLworCisJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpKTsKKworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX29iamVjdF9jcmVhdGUoY3NyX3ZhLCBkYl92YSwgcGNpX3ZhLAorCQkJQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLLCAmcG5vYi0+bWJfcmQsIHBmb2IpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKwlwbm9iLT5mbl9vYmpfY3JlYXRlZCA9IHRydWU7CisKKwlpZiAodHhfY21wbF93bSA9PSAweGZmZmZmZmZmKQorCQl0eF9ub19kZWxheSA9IHRydWU7CisJaWYgKHJ4X2NtcGxfd20gPT0gMHhmZmZmZmZmZikKKwkJcnhfbm9fZGVsYXkgPSB0cnVlOworCS8qCisJICogbm93IGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJpbmdzCisJICogRXZlbnQgUXVldWUgZmlyc3QuCisJICovCisJaWYgKHBub2ItPmV2ZW50X3FfbGVuKSB7CisJCXJkLnZhID0gcG5vYi0+ZXZlbnRfcTsKKwkJcmQucGEgPSBwbm9iLT5ldmVudF9xX2J1czsKKwkJcmQubGVuZ3RoID0gcG5vYi0+ZXZlbnRfcV9zaXplOworCisJCXN0YXR1cyA9IGJlX2VxX2NyZWF0ZShwZm9iLCAmcmQsIDQsIHBub2ItPmV2ZW50X3FfbGVuLAorCQkJCSh1MzIpIC0xLAkvKiBDRVZfV01BUktfKiBvciAtMSAqLworCQkJCWVxX2RlbGF5LAkvKiBpbiA4dXMgdW5pdHMsIG9yIC0xICovCisJCQkJJnBub2ItPmV2ZW50X3Ffb2JqKTsKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQkJZ290byBlcnJvcl9yZXQ7CisJCXBub2ItPmV2ZW50X3FfaWQgPSBwbm9iLT5ldmVudF9xX29iai5lcV9pZDsKKwkJcG5vYi0+ZXZlbnRfcV9jcmVhdGVkID0gMTsKKwkJZXZlbnRhYmxlID0gdHJ1ZTsKKwkJZXFfb2JqZWN0cCA9ICZwbm9iLT5ldmVudF9xX29iajsKKwl9CisJLyoKKwkgKiBOb3cgRXRoIFR4IENvbXBsLiBxdWV1ZS4KKwkgKi8KKwlpZiAocG5vYi0+dHhjcV9sZW4pIHsKKwkJcmQudmEgPSBwbm9iLT50eF9jcTsKKwkJcmQucGEgPSBwbm9iLT50eF9jcV9idXM7CisJCXJkLmxlbmd0aCA9IHBub2ItPnR4X2NxX3NpemU7CisKKwkJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPnR4Y3FfbGVuICogc2l6ZW9mKHN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCksCisJCQlmYWxzZSwJLyogc29saWN0ZWQgZXZlbnRzLCAgKi8KKwkJCXR4X25vX2RlbGF5LAkvKiBub2RlbGF5ICAqLworCQkJdHhfY21wbF93bSwJLyogV2F0ZXJtYXJrIGVuY29kaW5ncyAqLworCQkJZXFfb2JqZWN0cCwgJnBub2ItPnR4X2NxX29iaik7CisJCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJCWdvdG8gZXJyb3JfcmV0OworCisJCXBub2ItPnR4X2NxX2lkID0gcG5vYi0+dHhfY3Ffb2JqLmNxX2lkOworCQlwbm9iLT50eF9jcV9jcmVhdGVkID0gMTsKKwl9CisJLyoKKwkgKiBFdGggVHggcXVldWUKKwkgKi8KKwlpZiAocG5vYi0+dHhfcV9sZW4pIHsKKwkJc3RydWN0IGJlX2V0aF9zcV9wYXJhbWV0ZXJzIGV4X3BhcmFtcyA9IHsgMCB9OworCQl1MzIgdHlwZTsKKworCQlpZiAocG5vYi0+dHhfcV9wb3J0KSB7CisJCQkvKiBUWFEgdG8gYmUgYm91bmQgdG8gYSBzcGVjaWZpYyBwb3J0ICovCisJCQl0eXBlID0gQkVfRVRIX1RYX1JJTkdfVFlQRV9CT1VORDsKKwkJCWV4X3BhcmFtcy5wb3J0ID0gcG5vYi0+dHhfcV9wb3J0IC0gMTsKKwkJfSBlbHNlCisJCQl0eXBlID0gQkVfRVRIX1RYX1JJTkdfVFlQRV9TVEFOREFSRDsKKworCQlyZC52YSA9IHBub2ItPnR4X3E7CisJCXJkLnBhID0gcG5vYi0+dHhfcV9idXM7CisJCXJkLmxlbmd0aCA9IHBub2ItPnR4X3Ffc2l6ZTsKKworCQlzdGF0dXMgPSBiZV9ldGhfc3FfY3JlYXRlX2V4KHBmb2IsICZyZCwKKwkJCQlwbm9iLT50eF9xX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVRIX1dSQl9BTUFQKSwKKwkJCQl0eXBlLCAyLCAmcG5vYi0+dHhfY3Ffb2JqLAorCQkJCSZleF9wYXJhbXMsICZwbm9iLT50eF9xX29iaik7CisKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQkJZ290byBlcnJvcl9yZXQ7CisKKwkJcG5vYi0+dHhfcV9pZCA9IHBub2ItPnR4X3Ffb2JqLmJpZDsKKwkJcG5vYi0+dHhfcV9jcmVhdGVkID0gMTsKKwl9CisJLyoKKwkgKiBOb3cgRXRoIFJ4IGNvbXBsLiBxdWV1ZS4gIEFsd2F5cyBuZWVkZWQuCisJICovCisJcmQudmEgPSBwbm9iLT5yeF9jcTsKKwlyZC5wYSA9IHBub2ItPnJ4X2NxX2J1czsKKwlyZC5sZW5ndGggPSBwbm9iLT5yeF9jcV9zaXplOworCisJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPnJ4X2NxX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVApLAorCQkJZmFsc2UsCS8qIHNvbGljdGVkIGV2ZW50cywgICovCisJCQlyeF9ub19kZWxheSwJLyogbm9kZWxheSAgKi8KKwkJCXJ4X2NtcGxfd20sCS8qIFdhdGVybWFyayBlbmNvZGluZ3MgKi8KKwkJCWVxX29iamVjdHAsICZwbm9iLT5yeF9jcV9vYmopOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlwbm9iLT5yeF9jcV9pZCA9IHBub2ItPnJ4X2NxX29iai5jcV9pZDsKKwlwbm9iLT5yeF9jcV9jcmVhdGVkID0gMTsKKworCXN0YXR1cyA9IGJlX2V0aF9ycV9zZXRfZnJhZ19zaXplKHBmb2IsIHBub2ItPnJ4X2J1Zl9zaXplLAorCQkJKHUzMiAqKSAmc2V0X3J4YnVmX3NpemUpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQliZV9ldGhfcnFfZ2V0X2ZyYWdfc2l6ZShwZm9iLCAodTMyICopICZwbm9iLT5yeF9idWZfc2l6ZSk7CisJCWlmICgocG5vYi0+cnhfYnVmX3NpemUgIT0gMjA0OCkgJiYgKHBub2ItPnJ4X2J1Zl9zaXplICE9IDQwOTYpCisJCSAgICAmJiAocG5vYi0+cnhfYnVmX3NpemUgIT0gODE5MikpCisJCQlnb3RvIGVycm9yX3JldDsKKwl9IGVsc2UgeworCQlpZiAocG5vYi0+cnhfYnVmX3NpemUgIT0gc2V0X3J4YnVmX3NpemUpCisJCQlwbm9iLT5yeF9idWZfc2l6ZSA9IHNldF9yeGJ1Zl9zaXplOworCX0KKwkvKgorCSAqIEV0aCBSWCBxdWV1ZS4gYmVfZXRoX3JxX2NyZWF0ZSgpIGFsd2F5cyBhc3N1bWVzIDIgcGFnZXMgc2l6ZQorCSAqLworCXJkLnZhID0gcG5vYi0+cnhfcTsKKwlyZC5wYSA9IHBub2ItPnJ4X3FfYnVzOworCXJkLmxlbmd0aCA9IHBub2ItPnJ4X3Ffc2l6ZTsKKworCXN0YXR1cyA9IGJlX2V0aF9ycV9jcmVhdGUocGZvYiwgJnJkLCAmcG5vYi0+cnhfY3Ffb2JqLAorCQkJICAgICAmcG5vYi0+cnhfY3Ffb2JqLCAmcG5vYi0+cnhfcV9vYmopOworCisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQlnb3RvIGVycm9yX3JldDsKKworCXBub2ItPnJ4X3FfaWQgPSBwbm9iLT5yeF9xX29iai5yaWQ7CisJcG5vYi0+cnhfcV9jcmVhdGVkID0gMTsKKworCXJldHVybiBCRV9TVUNDRVNTOwkvKiBBbGwgcmVxdWlyZWQgcXVldWVzIGNyZWF0ZWQuICovCisKK2Vycm9yX3JldDoKKwliZV9kZXN0cm95X25ldG9iaihwbm9iKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGJlX25vYl9yaW5nX2luaXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1czsKKworCXBub2ItPmV2ZW50X3FfdGwgPSAwOworCisJcG5vYi0+dHhfcV9oZCA9IDA7CisJcG5vYi0+dHhfcV90bCA9IDA7CisKKwlwbm9iLT50eF9jcV90bCA9IDA7CisKKwlwbm9iLT5yeF9jcV90bCA9IDA7CisKKwltZW1zZXQocG5vYi0+ZXZlbnRfcSwgMCwgcG5vYi0+ZXZlbnRfcV9zaXplKTsKKwltZW1zZXQocG5vYi0+dHhfY3EsIDAsIHBub2ItPnR4X2NxX3NpemUpOworCW1lbXNldChwbm9iLT50eF9jdHh0LCAwLCBwbm9iLT50eF9xX2xlbiAqIHNpemVvZih2b2lkICoqKSk7CisJbWVtc2V0KHBub2ItPnJ4X2N0eHQsIDAsIHBub2ItPnJ4X3FfbGVuICogc2l6ZW9mKHZvaWQgKikpOworCXBub2ItPnJ4X3BnX2luZm9faGQgPSAwOworCXBub2ItPnJ4X3FfaGQgPSAwOworCWF0b21pY19zZXQoJnBub2ItPnJ4X3FfcG9zdGVkLCAwKTsKKworCXN0YXR1cyA9IGJlX2NyZWF0ZV9uZXRvYmoocG5vYiwgYWRhcHRlci0+Y3NyX3ZhLCBhZGFwdGVyLT5kYl92YSwKKwkJCQlhZGFwdGVyLT5wY2lfdmEpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJcmV0dXJuIC0xOworCisJYmVfcG9zdF9ldGhfcnhfYnVmZnMocG5vYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhc3luYyBjYWxsYmFjayBmb3IgbGluayBzdGF0dXMgKi8KK3N0YXRpYyB2b2lkCitiZV9saW5rX3N0YXR1c19hc3luY19jYWxsYmFjayh2b2lkICpjb250ZXh0LCB1MzIgZXZlbnRfY29kZSwgdm9pZCAqZXZlbnQpCit7CisJc3RydWN0IEFTWU5DX0VWRU5UX0xJTktfU1RBVEVfQU1BUCAqbGlua19zdGF0dXMgPSBldmVudDsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRleHQ7CisJYm9vbCBsaW5rX2VuYWJsZSA9IGZhbHNlOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCXN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVAgKmFzeW5jX3RyYWlsZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwl1MzIgYXN5bmNfZXZlbnRfY29kZSwgYXN5bmNfZXZlbnRfdHlwZSwgYWN0aXZlX3BvcnQ7CisJdTMyIHBvcnQwX2xpbmtfc3RhdHVzLCBwb3J0MV9saW5rX3N0YXR1cywgcG9ydDBfZHVwbGV4LCBwb3J0MV9kdXBsZXg7CisJdTMyIHBvcnQwX3NwZWVkLCBwb3J0MV9zcGVlZDsKKworCWlmIChldmVudF9jb2RlICE9IEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSkgeworCQkvKiBOb3Qgb3VyIGV2ZW50IHRvIGhhbmRsZSAqLworCQlyZXR1cm47CisJfQorCWFzeW5jX3RyYWlsZXIgPSAoc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCAqKQorCSAgICAoKHU4ICopIGV2ZW50ICsgc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCkgLQorCSAgICAgc2l6ZW9mKHN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVApKTsKKworCWFzeW5jX2V2ZW50X2NvZGUgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9UUkFJTEVSLCBldmVudF9jb2RlLAorCQkJCQkgICAgIGFzeW5jX3RyYWlsZXIpOworCUJVR19PTihhc3luY19ldmVudF9jb2RlICE9IEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSk7CisKKwlwbm9iID0gYWRhcHRlci0+bmV0X29iajsKKwluZXRkZXYgPSBwbm9iLT5uZXRkZXY7CisKKwkvKiBEZXRlcm1pbmUgaWYgdGhpcyBldmVudCBpcyBhIHN3aXRjaCBWTEQgb3IgYSBwaHlzaWNhbCBsaW5rIGV2ZW50ICovCisJYXN5bmNfZXZlbnRfdHlwZSA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsIGV2ZW50X3R5cGUsCisJCQkJCSAgICAgYXN5bmNfdHJhaWxlcik7CisJYWN0aXZlX3BvcnQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9MSU5LX1NUQVRFLAorCQkJCQlhY3RpdmVfcG9ydCwgbGlua19zdGF0dXMpOworCXBvcnQwX2xpbmtfc3RhdHVzID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJICAgICAgcG9ydDBfbGlua19zdGF0dXMsIGxpbmtfc3RhdHVzKTsKKwlwb3J0MV9saW5rX3N0YXR1cyA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCSAgICAgIHBvcnQxX2xpbmtfc3RhdHVzLCBsaW5rX3N0YXR1cyk7CisJcG9ydDBfZHVwbGV4ID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJIHBvcnQwX2R1cGxleCwgbGlua19zdGF0dXMpOworCXBvcnQxX2R1cGxleCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCSBwb3J0MV9kdXBsZXgsIGxpbmtfc3RhdHVzKTsKKwlwb3J0MF9zcGVlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCXBvcnQwX3NwZWVkLCBsaW5rX3N0YXR1cyk7CisJcG9ydDFfc3BlZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9MSU5LX1NUQVRFLAorCQkJCQlwb3J0MV9zcGVlZCwgbGlua19zdGF0dXMpOworCWlmIChhc3luY19ldmVudF90eXBlID09IE5UV0tfTElOS19UWVBFX1ZJUlRVQUwpIHsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfbGlua19jaGFuZ2VfdmlydHVhbCsrOworCQlpZiAoYWRhcHRlci0+YmVfbGlua19zdHMtPmFjdGl2ZV9wb3J0ICE9IGFjdGl2ZV9wb3J0KSB7CisJCQlkZXZfbm90aWNlKCZuZXRkZXYtPmRldiwKKwkJCSAgICAgICAiQWN0aXZlIHBvcnQgY2hhbmdlZCBkdWUgdG8gVkxEIG9uIHN3aXRjaFxuIik7CisJCX0gZWxzZSB7CisJCQlkZXZfbm90aWNlKCZuZXRkZXYtPmRldiwgIkxpbmsgc3RhdHVzIHVwZGF0ZVxuIik7CisJCX0KKworCX0gZWxzZSB7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2xpbmtfY2hhbmdlX3BoeXNpY2FsKys7CisJCWlmIChhZGFwdGVyLT5iZV9saW5rX3N0cy0+YWN0aXZlX3BvcnQgIT0gYWN0aXZlX3BvcnQpIHsKKwkJCWRldl9ub3RpY2UoJm5ldGRldi0+ZGV2LAorCQkJICAgICAgICJBY3RpdmUgcG9ydCBjaGFuZ2VkIGR1ZSB0byBwb3J0IGxpbmsiCisJCQkgICAgICAgIiBzdGF0dXMgY2hhbmdlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9ub3RpY2UoJm5ldGRldi0+ZGV2LCAiTGluayBzdGF0dXMgdXBkYXRlXG4iKTsKKwkJfQorCX0KKworCW1lbXNldChhZGFwdGVyLT5iZV9saW5rX3N0cywgMCwgc2l6ZW9mKGFkYXB0ZXItPmJlX2xpbmtfc3RzKSk7CisKKwlpZiAoKHBvcnQwX2xpbmtfc3RhdHVzID09IEFTWU5DX0VWRU5UX0xJTktfVVApIHx8CisJICAgIChwb3J0MV9saW5rX3N0YXR1cyA9PSBBU1lOQ19FVkVOVF9MSU5LX1VQKSkgeworCQlpZiAoKGFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID09IEJFX1BPUlRfTElOS19ET1dOKSAmJgorCQkgICAgKGFkYXB0ZXItPnBvcnQxX2xpbmtfc3RzID09IEJFX1BPUlRfTElOS19ET1dOKSkgeworCQkJLyogRWFybGllciBib3RoIHRoZSBwb3J0cyBhcmUgZG93biBTbyBsaW5rIGlzIHVwICovCisJCQlsaW5rX2VuYWJsZSA9IHRydWU7CisJCX0KKworCQlpZiAocG9ydDBfbGlua19zdGF0dXMgPT0gQVNZTkNfRVZFTlRfTElOS19VUCkgeworCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9kdXBsZXggPSBwb3J0MF9kdXBsZXg7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9zcGVlZCA9IHBvcnQwX3NwZWVkOworCQkJaWYgKGFjdGl2ZV9wb3J0ID09IE5UV0tfUE9SVF9BKQorCQkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5hY3RpdmVfcG9ydCA9IDA7CisJCX0gZWxzZQorCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlpZiAocG9ydDFfbGlua19zdGF0dXMgPT0gQVNZTkNfRVZFTlRfTElOS19VUCkgeworCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9kdXBsZXggPSBwb3J0MV9kdXBsZXg7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9zcGVlZCA9IHBvcnQxX3NwZWVkOworCQkJaWYgKGFjdGl2ZV9wb3J0ID09IE5UV0tfUE9SVF9CKQorCQkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5hY3RpdmVfcG9ydCA9IDE7CisJCX0gZWxzZQorCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlwcmludGsoS0VSTl9JTkZPICJMaW5rIFByb3BlcnRpZXMgZm9yICVzOlxuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiTGluayBQcm9wZXJ0aWVzOlxuIik7CisJCWJlX3ByaW50X2xpbmtfaW5mbyhhZGFwdGVyLT5iZV9saW5rX3N0cyk7CisKKwkJaWYgKCFsaW5rX2VuYWJsZSkKKwkJCXJldHVybjsKKwkJLyoKKwkJICogQm90aCBwb3J0cyB3ZXJlIGRvd24gcHJldmlvdXNseSwgYnV0IGF0bGVhc3Qgb25lIG9mCisJCSAqIHRoZW0gaGFzIGNvbWUgdXAgaWYgdGhpcyBuZXRkZXZpY2UncyBjYXJyaWVyIGlzIG5vdCB1cCwKKwkJICogdGhlbiBpbmRpY2F0ZSB0byBzdGFjaworCQkgKi8KKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIE5vdyBib3RoIHRoZSBwb3J0cyBhcmUgZG93bi4gVGVsbCB0aGUgc3RhY2sgYWJvdXQgaXQgKi8KKwlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJCb3RoIHBvcnRzIGFyZSBkb3duXG4iKTsKKwlhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19ET1dOOworCWFkYXB0ZXItPnBvcnQxX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBiZV9tY2NfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCisJcG5vYiA9IGFkYXB0ZXItPm5ldF9vYmo7CisJLyoKKwkgKiBDcmVhdGUgdGhlIE1DQyByaW5nIHNvIHRoYXQgYWxsIGZ1cnRoZXIgY29tbXVuaWNhdGlvbiB3aXRoCisJICogTUNDIGNhbiBnbyB0aHJ1IHRoZSByaW5nLiB3ZSBkbyB0aGlzIGF0IHRoZSBlbmQgc2luY2UKKwkgKiB3ZSBkbyBub3Qgd2FudCB0byBiZSBkZWFsaW5nIHdpdGggaW50ZXJydXB0cyB1bnRpbCB0aGUKKwkgKiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4KKwkgKi8KKwlwbm9iLT5tY2NfcV9sZW4gPSBNQ0NfUV9MRU47CisJcG5vYi0+bWNjX3Ffc2l6ZSA9IHBub2ItPm1jY19xX2xlbiAqIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKTsKKwlwbm9iLT5tY2NfcSA9ICBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5tY2NfcV9zaXplLAorCQkJCSZwbm9iLT5tY2NfcV9idXMpOworCWlmICghcG5vYi0+bWNjX3FfYnVzKQorCQlyZXR1cm4gLTE7CisJLyoKKwkgKiBzcGFjZSBmb3IgTUNDIFdSQiBjb250ZXh0CisJICovCisJcG5vYi0+bWNjX3dyYl9jdHh0TGVuID0gTUNDX1FfTEVOOworCXBub2ItPm1jY193cmJfY3R4dF9zaXplID0gIHBub2ItPm1jY193cmJfY3R4dExlbiAqCisJCXNpemVvZihzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0KTsKKwlwbm9iLT5tY2Nfd3JiX2N0eHQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJZ2V0X29yZGVyKHBub2ItPm1jY193cmJfY3R4dF9zaXplKSk7CisJaWYgKHBub2ItPm1jY193cmJfY3R4dCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJLyoKKwkgKiBTcGFjZSBmb3IgTUNDIGNvbXBsLiByaW5nCisJICovCisJcG5vYi0+bWNjX2NxX2xlbiA9IE1DQ19DUV9MRU47CisJcG5vYi0+bWNjX2NxX3NpemUgPSBwbm9iLT5tY2NfY3FfbGVuICogc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCk7CisJcG5vYi0+bWNjX2NxID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWNjX2NxX3NpemUsCisJCQkJJnBub2ItPm1jY19jcV9idXMpOworCWlmICghcG5vYi0+bWNjX2NxX2J1cykKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKgorICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgTUNDIHJlcXVlc3QgYW5kIGNvbXBsZXRpb24gcmluZyByZXF1aXJlZAorICAgIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEFSTSBwcm9jZXNzb3IuICBUaGUgY2FsbGVyIG11c3QgaGF2ZQorICAgIGFsbG9jYXRlZCByZXF1aXJlZCBhbW91bnQgb2YgbWVtb3J5IGZvciB0aGUgTUNDIHJpbmcgYW5kIE1DQworICAgIGNvbXBsZXRpb24gcmluZyBhbmQgcG9zdGVkIHRoZSB2aXJ0dWFsIGFkZHJlc3MgYW5kIG51bWJlciBvZgorICAgIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbWVtYmVycyAobWNjX3EgYW5kIG1jY19jcSkgaW4gdGhlCisgICAgTmV0T2JqZWN0IHN0cnV0dXJlLgorCisgICAgV2hlbiB0aGlzIGNhbGwgaXMgY29tcGxldGVkLCBhbGwgZnVydGhlciBjb21tdW5pY2F0aW9uIHdpdGgKKyAgICBBUk0gd2lsbCBzd2l0Y2ggZnJvbSBtYWlsYm94IHRvIHRoaXMgcmluZy4KKworICAgIHBub2IJLSBQb2ludGVyIHRvIHRoZSBOZXRPYmplY3Qgc3RydWN0dXJlLiBUaGlzIE5ldE9iamVjdCBzaG91bGQKKwkJICBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyBhIHByZXZpb3VzIGNhbGwgdG8gYmVfY3JlYXRlX25ldG9iaigpCisqLworaW50IGJlX2NyZWF0ZV9tY2NfcmluZ3Moc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHJpbmdfZGVzYyByZDsKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gJnBub2ItPmZuX29iajsKKworCW1lbXNldCgmcmQsIDAsIHNpemVvZihzdHJ1Y3QgcmluZ19kZXNjKSk7CisJaWYgKHBub2ItPm1jY19jcV9sZW4pIHsKKwkJcmQudmEgPSBwbm9iLT5tY2NfY3E7CisJCXJkLnBhID0gcG5vYi0+bWNjX2NxX2J1czsKKwkJcmQubGVuZ3RoID0gcG5vYi0+bWNjX2NxX3NpemU7CisKKwkJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPm1jY19jcV9sZW4gKiBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSwKKwkJCWZhbHNlLAkvKiBzb2xpY3RlZCBldmVudHMsICAqLworCQkJdHJ1ZSwJLyogbm9kZWxheSAgKi8KKwkJCTAsCS8qIDAgV2F0ZXJtYXJrIHNpbmNlIE5vZGVsYXkgaXMgdHJ1ZSAqLworCQkJJnBub2ItPmV2ZW50X3Ffb2JqLAorCQkJJnBub2ItPm1jY19jcV9vYmopOworCisJCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJcG5vYi0+bWNjX2NxX2lkID0gcG5vYi0+bWNjX2NxX29iai5jcV9pZDsKKwkJcG5vYi0+bWNjX2NxX2NyZWF0ZWQgPSAxOworCX0KKwlpZiAocG5vYi0+bWNjX3FfbGVuKSB7CisJCXJkLnZhID0gcG5vYi0+bWNjX3E7CisJCXJkLnBhID0gcG5vYi0+bWNjX3FfYnVzOworCQlyZC5sZW5ndGggPSBwbm9iLT5tY2NfcV9zaXplOworCisJCXN0YXR1cyA9IGJlX21jY19yaW5nX2NyZWF0ZShwZm9iLCAmcmQsCisJCQkJcG5vYi0+bWNjX3FfbGVuICogc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApLAorCQkJCXBub2ItPm1jY193cmJfY3R4dCwgcG5vYi0+bWNjX3dyYl9jdHh0TGVuLAorCQkJCSZwbm9iLT5tY2NfY3Ffb2JqLCAmcG5vYi0+bWNjX3Ffb2JqKTsKKworCQlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXBub2ItPm1jY19xX2NyZWF0ZWQgPSAxOworCX0KKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBiZV9tY2NfaW5pdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgcjsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYjsKKworCXBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCW1lbXNldChwbm9iLT5tY2NfcSwgMCwgcG5vYi0+bWNjX3Ffc2l6ZSk7CisJcG5vYi0+bWNjX3FfaGQgPSAwOworCisJbWVtc2V0KHBub2ItPm1jY193cmJfY3R4dCwgMCwgcG5vYi0+bWNjX3dyYl9jdHh0X3NpemUpOworCisJbWVtc2V0KHBub2ItPm1jY19jcSwgMCwgcG5vYi0+bWNjX2NxX3NpemUpOworCXBub2ItPm1jY19jcV90bCA9IDA7CisKKwlyID0gYmVfY3JlYXRlX21jY19yaW5ncyhhZGFwdGVyLT5uZXRfb2JqKTsKKwlpZiAociAhPSBCRV9TVUNDRVNTKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyOworCisJYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWFkYXB0ZXIpCisJCXJldHVybjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwbm9iID0gKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopYWRhcHRlci0+bmV0X29iajsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlpZiAocG5vYikgeworCQkvKiBVbnJlZ2lzdGVyIGFzeW5jIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBsaW5rIHN0YXR1cyB1cGRhdGVzICovCisJCWlmIChwbm9iLT5tY2NfcV9jcmVhdGVkKQorCQkJYmVfbWNjX2FkZF9hc3luY19ldmVudF9jYWxsYmFjaygmcG5vYi0+bWNjX3Ffb2JqLAorCQkJCQkJCQlOVUxMLCBOVUxMKTsKKwkJbmV0b2JqZWN0X2NsZWFudXAoYWRhcHRlciwgcG5vYik7CisJfQorCisJaWYgKGFkYXB0ZXItPmNzcl92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5jc3JfdmEpOworCWlmIChhZGFwdGVyLT5kYl92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5kYl92YSk7CisJaWYgKGFkYXB0ZXItPnBjaV92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5wY2lfdmEpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhhZGFwdGVyLT5wZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoYWRhcHRlci0+cGRldik7CisKKwlrZnJlZShhZGFwdGVyLT5iZV9saW5rX3N0cyk7CisJa2ZyZWUoYWRhcHRlci0+ZXRoX3N0YXRzcCk7CisKKwlpZiAoYWRhcHRlci0+dGltZXJfY3R4dC5nZXRfc3RhdHNfdGltZXIuZnVuY3Rpb24pCisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lcik7CisJa2ZyZWUoYWRhcHRlcik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgUENJIHN1Yi1zeXN0ZW0gd2hlbiBpdCBmaW5kcyBhIFBDSQorICogZGV2aWNlIHdpdGggZGV2L3ZlbmRvciBJRHMgdGhhdCBtYXRjaCB3aXRoIG9uZSBvZiBvdXIgZGV2aWNlcy4KKyAqIEFsbCBvZiB0aGUgZHJpdmVyIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBiZV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBkZXZfaWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEIGdldF9md3Y7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCXN0YXR1cyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGJlX2RyaXZlcl9uYW1lKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycm9yX3BjaV9yZXE7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlhZGFwdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJlX2FkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfYWRhcHRlcjsKKwl9CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX05PTkU7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOworCisJYWRhcHRlci0+ZW5hYmxlX2FpYyA9IDE7CisJYWRhcHRlci0+bWF4X2VxZCA9IE1BWF9FUUQ7CisJYWRhcHRlci0+bWluX2VxZCA9IDA7CisJYWRhcHRlci0+Y3VyX2VxZCA9IDA7CisKKwlzdGF0dXMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwlpZiAoIXN0YXR1cykgeworCQlhZGFwdGVyLT5kbWFfNjRiaXRfY2FwID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5kbWFfNjRiaXRfY2FwID0gZmFsc2U7CisJCXN0YXR1cyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHNldCBQQ0kgRE1BIE1hc2tcbiIpOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJc3RhdHVzID0gaW5pdF9wY2lfYmVfZnVuY3Rpb24oYWRhcHRlciwgcGRldik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBQQ0kgQkFSU1xuIik7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwliZV90cmFjZV9zZXRfbGV2ZWwoRExfQUxXQVlTIHwgRExfRVJSKTsKKworCWFkYXB0ZXItPmJlX2xpbmtfc3RzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IEJFX0xJTktfU1RBVFVTKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXB0ZXItPmJlX2xpbmtfc3RzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgbGluayBzdGF0dXMgIgorCQkgICAgICAgImJ1ZmZlciBmYWlsZWRcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50eHFfbG9jayk7CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGJlX25ldF9vYmplY3QpKTsKKwlpZiAobmV0ZGV2ID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlhZGFwdGVyLT5uZXRfb2JqID0gcG5vYjsKKwlhZGFwdGVyLT5uZXRkZXZwID0gbmV0ZGV2OworCXBub2ItPmFkYXB0ZXIgPSBhZGFwdGVyOworCXBub2ItPm5ldGRldiA9IG5ldGRldjsKKworCXN0YXR1cyA9IGJlX25vYl9yaW5nX2FsbG9jKGFkYXB0ZXIsIHBub2IpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJc3RhdHVzID0gYmVfbm9iX3JpbmdfaW5pdChhZGFwdGVyLCBwbm9iKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCWJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBmYWxzZSwgZmFsc2UsCisJCWZhbHNlLCBmYWxzZSwgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwluZXRkZXYtPmluaXQgPSAmYmVuZXRfaW5pdDsKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJihhZGFwdGVyLT5wZGV2LT5kZXYpKTsKKworCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJnBub2ItPm5hcGksIGJlX3BvbGwsIDY0KTsKKworCS8qIGlmIHRoZSByeF9mcmFnIHNpemUgaWYgMkssIG9uZSBwYWdlIGlzIHNoYXJlZCBhcyB0d28gUlggZnJhZ3MgKi8KKwlwbm9iLT5yeF9wZ19zaGFyZWQgPQorCQkocG5vYi0+cnhfYnVmX3NpemUgPD0gUEFHRV9TSVpFIC8gMikgPyB0cnVlIDogZmFsc2U7CisJaWYgKHBub2ItPnJ4X2J1Zl9zaXplICE9IHJ4YnVmX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkNvdWxkIG5vdCBzZXQgUnggYnVmZmVyIHNpemUgdG8gJWQuIFVzaW5nICVkXG4iLAorCQkJCSAgICAgICByeGJ1Zl9zaXplLCBwbm9iLT5yeF9idWZfc2l6ZSk7CisJCXJ4YnVmX3NpemUgPSBwbm9iLT5yeF9idWZfc2l6ZTsKKwl9CisKKwl0YXNrbGV0X2luaXQoJihhZGFwdGVyLT5zdHNfaGFuZGxlciksIGJlX3Byb2Nlc3NfaW50ciwKKwkJICAgICAodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKKwlhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQgPSAxOworCXNwaW5fbG9ja19pbml0KCYoYWRhcHRlci0+aW50X2xvY2spKTsKKworCXN0YXR1cyA9IGJlX3JlZ2lzdGVyX2lzcihhZGFwdGVyLCBwbm9iKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCWFkYXB0ZXItPnJ4X2NzdW0gPSAxOworCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gQkVfTFJPX01BWF9QS1RTOworCisJbWVtc2V0KCZnZXRfZnd2LCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQmxhZGVFbmdpbmUgRHJpdmVyIHZlcnNpb246JXMuICIKKwkgICAgICAgIkNvcHlyaWdodCBTZXJ2ZXJFbmdpbmVzLCBDb3Jwb3JhdGlvbiAyMDA1IC0gMjAwOFxuIiwKKwkJCSAgICAgICBiZV9kcnZyX3Zlcik7CisJc3RhdHVzID0gYmVfZnVuY3Rpb25fZ2V0X2Z3X3ZlcnNpb24oJnBub2ItPmZuX29iaiwgJmdldF9md3YsIE5VTEwsCisJCQkJCSAgICBOVUxMKTsKKwlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpIHsKKwkJc3RybmNweShiZV9md192ZXIsIGdldF9md3YuZmlybXdhcmVfdmVyc2lvbl9zdHJpbmcsIDMyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQmxhZGVFbmdpbmUgRmlybXdhcmUgVmVyc2lvbjolc1xuIiwKKwkJICAgICAgIGdldF9md3YuZmlybXdhcmVfdmVyc2lvbl9zdHJpbmcpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBnZXQgQkUgRmlybXdhcmUgVmVyc2lvblxuIik7CisJfQorCisJc2VtYV9pbml0KCZhZGFwdGVyLT5nZXRfZXRoX3N0YXRfc2VtLCAwKTsKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lcik7CisJYXRvbWljX3NldCgmYWRhcHRlci0+dGltZXJfY3R4dC5nZXRfc3RhdF9mbGFnLCAwKTsKKwlhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lci5mdW5jdGlvbiA9CisJICAgICZiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcjsKKworCXN0YXR1cyA9IGJlX21jY19jcmVhdGUoYWRhcHRlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gY2xlYW51cDsKKwlzdGF0dXMgPSBiZV9tY2NfaW5pdChhZGFwdGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBjbGVhbnVwOworCisKKwlzdGF0dXMgPSBiZV9tY2NfYWRkX2FzeW5jX2V2ZW50X2NhbGxiYWNrKCZhZGFwdGVyLT5uZXRfb2JqLT5tY2NfcV9vYmosCisJCQkgYmVfbGlua19zdGF0dXNfYXN5bmNfY2FsbGJhY2ssICh2b2lkICopYWRhcHRlcik7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkZF9hc3luY19ldmVudF9jYWxsYmFjayBmYWlsZWQiKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkxpbmsgc3RhdHVzIGNoYW5nZXMgbWF5IG5vdCBiZSByZWZsZWN0ZWRcbiIpOworCX0KKworCXN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCWJlX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfSU5JVDsKKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwliZV9yZW1vdmUocGRldik7CisJcmV0dXJuIHN0YXR1czsKK2Vycm9yX2FkYXB0ZXI6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycm9yX3BjaV9yZXE6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyb3I6CisJcHJpbnRrKEtFUk5fRVJSICJCbGFkZUVuZ2luZSBpbml0YWxpemF0aW9uIGZhaWxlZFxuIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBsaW5rIHN0YXR1cyBhbmQgcHJpbnQgdGhlIHN0YXR1cyBvbiBjb25zb2xlCisgKi8KK3ZvaWQgYmVfdXBkYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCisJc3RhdHVzID0gYmVfcnhmX2xpbmtfc3RhdHVzKCZwbm9iLT5mbl9vYmosIGFkYXB0ZXItPmJlX2xpbmtfc3RzLCBOVUxMLAorCQkJTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cyA9PSBCRV9TVUNDRVNTKSB7CisJCWlmIChhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9zcGVlZCAmJgorCQkgICAgYWRhcHRlci0+YmVfbGlua19zdHMtPm1hYzBfZHVwbGV4KQorCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCWVsc2UKKwkJCWFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisKKwkJaWYgKGFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMxX3NwZWVkICYmCisJCSAgICBhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9kdXBsZXgpCisJCQlhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19VUDsKKwkJZWxzZQorCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlkZXZfaW5mbygmcG5vYi0+bmV0ZGV2LT5kZXYsICJMaW5rIFByb3BlcnRpZXM6XG4iKTsKKwkJYmVfcHJpbnRfbGlua19pbmZvKGFkYXB0ZXItPmJlX2xpbmtfc3RzKTsKKwkJcmV0dXJuOworCX0KKwlkZXZfaW5mbygmcG5vYi0+bmV0ZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IGxpbmsgc3RhdHVzXG4iKTsKKwlyZXR1cm47Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQKK2JlX3BtX2NsZWFudXAoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJICAgICAgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwliZV93YWl0X25pY190eF9jbXBseF9jbXBsKHBub2IpOworCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKworCWlmIChhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQpIHsKKwkJdGFza2xldF9raWxsKCZhZGFwdGVyLT5zdHNfaGFuZGxlcik7CisJCWFkYXB0ZXItPnRhc2tsZXRfc3RhcnRlZCA9IDA7CisJfQorCisJYmVfdW5yZWdpc3Rlcl9pc3IoYWRhcHRlcik7CisJYmVfZGlzYWJsZV9pbnRyKHBub2IpOworCisJYmVfdHhfcV9jbGVhbihwbm9iKTsKKwliZV9yeF9xX2NsZWFuKHBub2IpOworCisJYmVfZGVzdHJveV9uZXRvYmoocG5vYik7Cit9CisKK3N0YXRpYyBpbnQgYmVfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAgYWRhcHRlci0+bmV0ZGV2cDsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlhZGFwdGVyLT5kZXZfcG1fc3RhdGUgPSBhZGFwdGVyLT5kZXZfc3RhdGU7CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX1NVU1BFTkQ7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYmVfcG1fY2xlYW51cChhZGFwdGVyLCBwbm9iLCBuZXRkZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDEpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAxKTsJLyogRDMgQ29sZCA9IDQgKi8KKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3VwKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gYWRhcHRlci0+bmV0X29iajsKKworCWlmIChwbm9iLT5udW1fdmxhbnMgIT0gMCkKKwkJYmVfcnhmX3ZsYW5fY29uZmlnKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBwbm9iLT5udW1fdmxhbnMsCisJCQlwbm9iLT52bGFuX3RhZywgTlVMTCwgTlVMTCwgTlVMTCk7CisKK30KKworc3RhdGljIGludCBiZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9ICBhZGFwdGVyLT5uZXRkZXZwOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCXN0YXR1cyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgNCwgMCk7CS8qIDQgaXMgRDMgY29sZCAqLworCisJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBmYWxzZSwKKwkJCWZhbHNlLCB0cnVlLCBmYWxzZSwgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwkJc3RhdHVzID0gYmVfbm9iX3JpbmdfaW5pdChhZGFwdGVyLCBwbm9iKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXRhc2tsZXRfaW5pdCgmKGFkYXB0ZXItPnN0c19oYW5kbGVyKSwgYmVfcHJvY2Vzc19pbnRyLAorCQkJICAgICAodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKKwkJYWRhcHRlci0+dGFza2xldF9zdGFydGVkID0gMTsKKworCQlpZiAoYmVfcmVnaXN0ZXJfaXNyKGFkYXB0ZXIsIHBub2IpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmVfcmVnaXN0ZXJfaXNyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKworCQlzdGF0dXMgPSBiZV9tY2NfaW5pdChhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmVfbWNjX2luaXQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJYmVfdXBkYXRlX2xpbmtfc3RhdHVzKGFkYXB0ZXIpOworCQkvKgorCQkgKiBSZWdpc3RlciBhc3luYyBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGxpbmsKKwkJICogc3RhdHVzIHVwZGF0ZXMKKwkJICovCisJCXN0YXR1cyA9IGJlX21jY19hZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2soCisJCQkJJmFkYXB0ZXItPm5ldF9vYmotPm1jY19xX29iaiwKKwkJCQliZV9saW5rX3N0YXR1c19hc3luY19jYWxsYmFjaywgKHZvaWQgKilhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2sgZmFpbGVkIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkxpbmsgc3RhdHVzIGNoYW5nZXMgbWF5IG5vdCBiZSByZWZsZWN0ZWRcbiIpOworCQl9CisJCWJlX2VuYWJsZV9pbnRyKHBub2IpOworCQliZV9lbmFibGVfZXFfaW50cihwbm9iKTsKKwkJYmVfdXAoYWRhcHRlcik7CisJfQorCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBhZGFwdGVyLT5kZXZfcG1fc3RhdGU7CisJcmV0dXJuIDA7CisKK30KKworI2VuZGlmCisKKy8qIFdhaXQgdW50aWwgbm8gbW9yZSBwZW5kaW5nIHRyYW5zbWl0cyAgKi8KK3ZvaWQgYmVfd2FpdF9uaWNfdHhfY21wbHhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgaTsKKworCS8qIFdhaXQgZm9yIDIwdXMgKiA1MDAwMCAoPSAxcykgYW5kIG5vIG1vcmUgKi8KKwlpID0gMDsKKwl3aGlsZSAoKHBub2ItPnR4X3FfdGwgIT0gcG5vYi0+dHhfcV9oZCkgJiYgKGkgPCA1MDAwMCkpIHsKKwkJKytpOworCQl1ZGVsYXkoMjApOworCX0KKworCS8qIENoZWNrIGZvciBubyBtb3JlIHBlbmRpbmcgdHJhbnNtaXRzICovCisJaWYgKGkgPj0gNTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkRpZCBub3QgcmVjZWl2ZSBjb21wbGV0aW9ucyBmb3IgYWxsIFRYIHJlcXVlc3RzXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBiZV9kcml2ZXIgPSB7CisJLm5hbWUgPSBiZV9kcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUgPSBiZV9kZXZpY2VfaWRfdGFibGUsCisJLnByb2JlID0gYmVfcHJvYmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBiZV9zdXNwZW5kLAorCS5yZXN1bWUgPSBiZV9yZXN1bWUsCisjZW5kaWYKKwkucmVtb3ZlID0gYmVfcmVtb3ZlCit9OworCisvKgorICogTW9kdWxlIGluaXQgZW50cnkgcG9pbnQuIFJlZ2lzdGVycyBvdXIgb3VyIGRldmljZSBhbmQgcmV0dXJuLgorICogT3VyIHByb2JlIHdpbGwgYmUgY2FsbGVkIGlmIHRoZSBkZXZpY2UgaXMgZm91bmQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJlX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCWlmIChyeGJ1Zl9zaXplICE9IDgxOTIgJiYgcnhidWZfc2l6ZSAhPSA0MDk2ICYmIHJ4YnVmX3NpemUgIT0gMjA0OCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiVW5zdXBwb3J0ZWQgcmVjZWl2ZSBidWZmZXIgc2l6ZSAoJWQpIHJlcXVlc3RlZFxuIiwKKwkJICAgICAgIHJ4YnVmX3NpemUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiTXVzdCBiZSAyMDQ4LCA0MDk2IG9yIDgxOTIuIERlZmF1bHRpbmcgdG8gMjA0OFxuIik7CisJCXJ4YnVmX3NpemUgPSAyMDQ4OworCX0KKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CisKKwlyZXR1cm4gcmV0OworfQorCittb2R1bGVfaW5pdChiZV9pbml0X21vZHVsZSk7CisKKy8qCisgKiBiZV9leGl0X21vZHVsZSAtIERyaXZlciBFeGl0IENsZWFudXAgUm91dGluZQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgYmVfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KGJlX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE5NWQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2ludC5jCkBAIC0wLDAgKzEsODYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRfbHJvLmg+CisKKyNpbmNsdWRlICJiZW5ldC5oIgorCisvKiBudW1iZXIgb2YgYnl0ZXMgb2YgUlggZnJhbWUgdGhhdCBhcmUgY29waWVkIHRvIHNrYi0+ZGF0YSAqLworI2RlZmluZSBCRV9IRFJfTEVOIDY0CisKKyNkZWZpbmUgTkVUSUZfUlgoc2tiKSBuZXRpZl9yZWNlaXZlX3NrYihza2IpCisjZGVmaW5lIFZMQU5fQUNDRUxfUlgoc2tiLCBwbm9iLCB2dCkgXAorCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBwbm9iLT52bGFuX2dycCwgdnQpCisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBub3RpZmllcyBCbGFkZUVuZ2luZSBvZiB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24KKyAgICBlbnRyaWVzIHByb2Nlc3NlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY29tcGxldGlvbiBxdWV1ZSBieSB3cml0aW5nCisgICAgdGhlIG51bWJlciBvZiBwb3BwZWQgZW50cmllcyB0byB0aGUgZG9vciBiZWxsLgorCisgICAgcG5vYgktIFBvaW50ZXIgdG8gdGhlIE5ldE9iamVjdCBzdHJ1Y3R1cmUKKyAgICBuCQktIE51bWJlciBvZiBjb21wbGV0aW9uIGVudHJpZXMgcHJvY2Vzc2VkCisgICAgY3FfaWQJLSBRdWV1ZSBJRCBvZiB0aGUgY29tcGxldGlvbiBxdWV1ZSBmb3Igd2hpY2ggbm90aWZpY2F0aW9uCisJCQlpcyBiZWluZyBkb25lLgorICAgIHJlX2FybQktIDEgIC0gcmVhcm0gdGhlIGNvbXBsZXRpb24gcmluZyB0byBnZW5lcmF0ZSBhbiBldmVudC4KKwkJLSAwICAtIGRvbnQgcmVhcm0gdGhlIGNvbXBsZXRpb24gcmluZyB0byBnZW5lcmF0ZSBhbiBldmVudAorKi8KK3ZvaWQgYmVfbm90aWZ5X2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIGludCBuLCBpbnQgY3FfaWQsIGludCByZV9hcm0pCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKworCWNxZGIuZHdbMF0gPSAwOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBjcV9pZCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmY3FkYiwgcmVfYXJtKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIG4pOworCVBEX1dSSVRFKCZwbm9iLT5mbl9vYmosIGNxX2RiLCBjcWRiLmR3WzBdKTsKK30KKworLyoKKyAqIGFkZHMgYWRkaXRpb25hbCByZWNlaXZlIGZyYWdzIGluZGljYXRlZCBieSBCRSBzdGFydGluZyBmcm9tIGdpdmVuCisgKiBmcmFnIGluZGV4IChmaSkgdG8gc3BlY2lmaWVkIHNrYidzIGZyYWcgbGlzdAorICovCitzdGF0aWMgdm9pZAorYWRkX3NrYl9mcmFncyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgICB1MzIgbnJlc2lkLCB1MzIgZmkpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiBza19mcmFnX2lkeCwgbjsKKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CisJdTMyIGZyYWdfc3ogPSBwbm9iLT5yeF9idWZfc2l6ZTsKKworCXNrX2ZyYWdfaWR4ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwl3aGlsZSAobnJlc2lkKSB7CisJCWluZGV4X2luYygmZmksIHBub2ItPnJ4X3FfbGVuKTsKKworCQlyeF9wYWdlX2luZm8gPSAoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqKXBub2ItPnJ4X2N0eHRbZmldOworCQlwbm9iLT5yeF9jdHh0W2ZpXSA9IE5VTEw7CisJCWlmICgocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCkgfHwKKwkJICAgIChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyeF9wYWdlX2luZm8sIGJ1cyksCisJCQkJICAgICAgIGZyYWdfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKworCQluID0gbWluKG5yZXNpZCwgZnJhZ19zeik7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnBhZ2UgPSByeF9wYWdlX2luZm8tPnBhZ2U7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnBhZ2Vfb2Zmc2V0CisJCSAgICA9IHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQ7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnNpemUgPSBuOworCisJCXNrX2ZyYWdfaWR4Kys7CisJCXNrYi0+bGVuICs9IG47CisJCXNrYi0+ZGF0YV9sZW4gKz0gbjsKKwkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncysrOworCQlucmVzaWQgLT0gbjsKKworCQltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCQlhdG9taWNfZGVjKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgaW5jb21pbmcgbmljIHBhY2tldHMgb3ZlciB2YXJpb3VzIFJ4IHF1ZXVlcy4KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGFkYXB0ZXIsIHRoZSBjdXJyZW50IFJ4IHN0YXR1cyBkZXNjcmlwdG9yCisgKiBlbnRyeSBhbmQgdGhlIFJ4IGNvbXBsZXRpb24gcXVldWUgSUQgYXMgYXJndW1lbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb24oc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsCisJCQkJCSAgICBzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgKnJ4Y3ApCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHVkcGNrc20sIHRjcGNrc207CisJaW50IG47CisJdTMyIG5yZXNpZCwgZmk7CisJdTMyIGZyYWdfc3ogPSBwbm9iLT5yeF9idWZfc2l6ZTsKKwl1OCAqdmE7CisJc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqcnhfcGFnZV9pbmZvOworCXUzMiBudW1mcmFncywgdnRwLCB2dG0sIHZsYW5fdGFnLCBwa3RzaXplOworCisJZmkgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGZyYWduZHgsIHJ4Y3ApOworCUJVR19PTihmaSA+PSAoaW50KXBub2ItPnJ4X3FfbGVuKTsKKwlCVUdfT04oZmkgPCAwKTsKKworCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJQlVHX09OKCFyeF9wYWdlX2luZm8tPnBhZ2UpOworCXBub2ItPnJ4X2N0eHRbZmldID0gTlVMTDsKKworCS8qCisJICogSWYgb25lIHBhZ2UgaXMgdXNlZCBwZXIgZnJhZ21lbnQgb3IgaWYgdGhpcyBpcyB0aGUgc2Vjb25kIGhhbGYgb2YKKwkgKiAgb2YgdGhlIHBhZ2UsIHVubWFwIHRoZSBwYWdlIGhlcmUKKwkgKi8KKwlpZiAoKHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQpIHx8IChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpKSB7CisJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkgICAgICAgcGNpX3VubWFwX2FkZHIocnhfcGFnZV9pbmZvLCBidXMpLCBmcmFnX3N6LAorCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorCisJYXRvbWljX2RlYygmcG5vYi0+cnhfcV9wb3N0ZWQpOworCXVkcGNrc20gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHVkcGNrc20sIHJ4Y3ApOworCXRjcGNrc20gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHRjcGNrc20sIHJ4Y3ApOworCXBrdHNpemUgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHBrdHNpemUsIHJ4Y3ApOworCS8qCisJICogZ2V0IHJpZCBvZiBSWCBmbHVzaCBjb21wbGV0aW9ucyBmaXJzdC4KKwkgKi8KKwlpZiAoKHRjcGNrc20pICYmICh1ZHBja3NtKSAmJiAocGt0c2l6ZSA9PSAzMikpIHsKKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCXNrYiA9IG5ldGRldl9hbGxvY19za2IocG5vYi0+bmV0ZGV2LCBCRV9IRFJfTEVOICsgTkVUX0lQX0FMSUdOKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJZGV2X2luZm8oJnBub2ItPm5ldGRldi0+ZGV2LCAiYWxsb2Nfc2tiKCkgZmFpbGVkXG4iKTsKKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJZ290byBmcmVlX2ZyYWdzOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwlza2ItPmRldiA9IHBub2ItPm5ldGRldjsKKworCW4gPSBtaW4ocGt0c2l6ZSwgZnJhZ19zeik7CisKKwl2YSA9IHBhZ2VfYWRkcmVzcyhyeF9wYWdlX2luZm8tPnBhZ2UpICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwlwcmVmZXRjaCh2YSk7CisKKwlza2ItPmxlbiA9IG47CisJc2tiLT5kYXRhX2xlbiA9IG47CisJaWYgKG4gPD0gQkVfSERSX0xFTikgeworCQltZW1jcHkoc2tiLT5kYXRhLCB2YSwgbik7CisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCXNrYi0+ZGF0YV9sZW4gLT0gbjsKKwkJc2tiLT50YWlsICs9IG47CisJfSBlbHNlIHsKKworCQkvKiBTZXR1cCB0aGUgU0tCIHdpdGggcGFnZSBidWZmZXIgaW5mb3JtYXRpb24gKi8KKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlID0gcnhfcGFnZV9pbmZvLT5wYWdlOworCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKys7CisKKwkJLyogQ29weSB0aGUgaGVhZGVyIGludG8gdGhlIHNrYl9kYXRhICovCisJCW1lbWNweShza2ItPmRhdGEsIHZhLCBCRV9IRFJfTEVOKTsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlX29mZnNldCA9CisJCSAgICByeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0ICsgQkVfSERSX0xFTjsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5zaXplID0gbiAtIEJFX0hEUl9MRU47CisJCXNrYi0+ZGF0YV9sZW4gLT0gQkVfSERSX0xFTjsKKwkJc2tiLT50YWlsICs9IEJFX0hEUl9MRU47CisJfQorCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJbnJlc2lkID0gcGt0c2l6ZSAtIG47CisKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwbm9iLT5uZXRkZXYpOworCisJaWYgKCh0Y3Bja3NtIHx8IHVkcGNrc20pICYmIGFkYXB0ZXItPnJ4X2NzdW0pCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJZWxzZQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJLyoKKwkgKiBpZiB3ZSBoYXZlIG1vcmUgYnl0ZXMgbGVmdCwgdGhlIGZyYW1lIGhhcyBiZWVuCisJICogZ2l2ZW4gdG8gdXMgaW4gbXVsdGlwbGUgZnJhZ21lbnRzLiAgVGhpcyBoYXBwZW5zCisJICogd2l0aCBKdW1ibyBmcmFtZXMuIEFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cyB0bworCSAqIHNrYi0+ZnJhZ3NbXSBhcnJheS4KKwkgKi8KKwlpZiAobnJlc2lkKQorCQlhZGRfc2tiX2ZyYWdzKHBub2IsIHNrYiwgbnJlc2lkLCBmaSk7CisKKwkvKiB1cGRhdGUgdGhlIHRoZSB0cnVlIHNpemUgb2YgdGhlIHNrYi4gKi8KKwlza2ItPnRydWVzaXplID0gc2tiLT5sZW4gKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOworCisJLyoKKwkgKiBJZiBhIDgwMi4zIGZyYW1lIG9yIDgwMi4yIExMQyBmcmFtZQorCSAqIChpLmUpIGNvbnRhaW5zIGxlbmd0aCBmaWVsZCBpbiBNQUMgSGRyCisJICogYW5kIGZyYW1lIGxlbiBpcyBncmVhdGVyIHRoYW4gNjQgYnl0ZXMKKwkgKi8KKwlpZiAoKChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QXzgwMl8yKSkgfHwKKwkgICAgIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QXzgwMl8zKSkpCisJICAgICYmIChwa3RzaXplID4gQkVfSERSX0xFTikpIHsKKwkJLyoKKwkJICogSWYgdGhlIGxlbmd0aCBnaXZlbiBpbiBNYWMgSGRyIGlzIGxlc3MgdGhhbiBmcmFtZSBzaXplCisJCSAqIEVycmFuZW91cyBmcmFtZSwgRHJvcCBpdAorCQkgKi8KKwkJaWYgKChudG9ocygqKHUxNiAqKSAodmEgKyAxMikpICsgRVRIX0hMRU4pIDwgcGt0c2l6ZSkgeworCQkJLyogSW5jcmVtZW50IE5vbiBFdGhlciB0eXBlIElJIGZyYW1lcyBkcm9wcGVkICovCisJCQlhZGFwdGVyLT5iZV9zdGF0LmJlc184MDJfM19kcm9wcGVkX2ZyYW1lcysrOworCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIGVsc2UgaWYgdGhlIGxlbmd0aCBnaXZlbiBpbiBNYWMgSGRyIGlzIGdyZWF0ZXIgdGhhbgorCQkgKiBmcmFtZSBzaXplLCBzaG91bGQgbm90IGJlIHNlZWluZyB0aGlzIHNvcnQgb2YgZnJhbWVzCisJCSAqIGR1bXAgdGhlIHBrdCBhbmQgcGFzcyB0byBzdGFjaworCQkgKi8KKwkJZWxzZSBpZiAoKG50b2hzKCoodTE2ICopICh2YSArIDEyKSkgKyBFVEhfSExFTikgPiBwa3RzaXplKSB7CisJCQkvKiBJbmNyZW1lbnQgTm9uIEV0aGVyIHR5cGUgSUkgZnJhbWVzIG1hbGZvcm1lZCAqLworCQkJYWRhcHRlci0+YmVfc3RhdC5iZXNfODAyXzNfbWFsZm9ybWVkX2ZyYW1lcysrOworCQl9CisJfQorCisJdnRwID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2dHAsIHJ4Y3ApOworCXZ0bSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdnRtLCByeGNwKTsKKwlpZiAodnRwICYmIHZ0bSkgeworCQkvKiBWbGFuIHRhZyBwcmVzZW50IGluIHBrdCBhbmQgQkUgZm91bmQKKwkJICogdGhhdCB0aGUgdGFnIG1hdGNoZWQgYW4gZW50cnkgaW4gVkxBTiB0YWJsZQorCQkgKi8KKwkJaWYgKCFwbm9iLT52bGFuX2dycCB8fCBwbm9iLT5udW1fdmxhbnMgPT0gMCkgeworCQkJLyogQnV0IHdlIGhhdmUgbm8gVkxBTnMgY29uZmlndXJlZC4KKwkJCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIERyb3AgdGhlIHBhY2tldC4KKwkJCSAqLworCQkJZGV2X2luZm8oJnBub2ItPm5ldGRldi0+ZGV2LAorCQkJICAgICAgICJCbGFkZUVuZ2luZTogVW5leHBlY3RlZCB2bGFuIHRhZ2dlZCBwYWNrZXRcbiIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBwYXNzIHRoZSBWTEFOIHBhY2tldCB0byBzdGFjayAqLworCQl2bGFuX3RhZyA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdmxhbl90YWcsIHJ4Y3ApOworCQlWTEFOX0FDQ0VMX1JYKHNrYiwgcG5vYiwgYmUxNl90b19jcHUodmxhbl90YWcpKTsKKworCX0gZWxzZSB7CisJCU5FVElGX1JYKHNrYik7CisJfQorCXJldHVybiAwOworCitmcmVlX2ZyYWdzOgorCS8qIGZyZWUgYWxsIGZyYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCByeGNwICovCisJbnVtZnJhZ3MgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIG51bWZyYWdzLCByeGNwKTsKKwl3aGlsZSAobnVtZnJhZ3MtLSA+IDEpIHsKKwkJaW5kZXhfaW5jKCZmaSwgcG5vYi0+cnhfcV9sZW4pOworCisJCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopCisJCSAgICBwbm9iLT5yeF9jdHh0W2ZpXTsKKwkJcG5vYi0+cnhfY3R4dFtmaV0gPSAodm9pZCAqKU5VTEw7CisJCWlmIChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0IHx8ICFwbm9iLT5yeF9wZ19zaGFyZWQpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCQkgICAgICAgZnJhZ19zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCWF0b21pY19kZWMoJnBub2ItPnJ4X3FfcG9zdGVkKTsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb25fbHJvKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLAorCQkJCQkgIHN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCByeF9mcmFnc1tCRV9NQVhfRlJBR1NfUEVSX0ZSQU1FXTsKKwl1bnNpZ25lZCBpbnQgdWRwY2tzbSwgdGNwY2tzbTsKKwl1MzIgbnVtZnJhZ3MsIHZsYW5mLCB2dG0sIHZsYW5fdGFnLCBucmVzaWQ7CisJdTE2IHZsYW50OworCXVuc2lnbmVkIGludCBmaSwgaWR4LCBuOworCXN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKnJ4X3BhZ2VfaW5mbzsKKwl1MzIgZnJhZ19zeiA9IHBub2ItPnJ4X2J1Zl9zaXplLCBwa3RzaXplOworCWJvb2wgcnhfY29hbCA9IChhZGFwdGVyLT5tYXhfcnhfY29hbCA8PSAxKSA/IDAgOiAxOworCXU4IGVyciwgKnZhOworCV9fd3N1bSBjc3VtID0gMDsKKworCWlmIChBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGlwc2VjLCByeGNwKSkgeworCQkvKiAgRHJvcCB0aGUgcGt0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IGNvbXBsZXRpb24uICAqLworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9taXNjX3BrdHMrKzsKKwkJcmV0dXJuOworCX0KKwllcnIgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGVyciwgcnhjcCk7CisJaWYgKGVyciB8fCAhcnhfY29hbCkgeworCQkvKiBXZSB3b24ndCBjb2FsZXNjZSBSeCBwa3RzIGlmIHRoZSBlcnIgYml0IHNldC4KKwkJICogdGFrZSB0aGUgcGF0aCBvZiBub3JtYWwgY29tcGxldGlvbiBwcm9jZXNzaW5nICovCisJCXByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb24ocG5vYiwgcnhjcCk7CisJCXJldHVybjsKKwl9CisKKwlmaSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgZnJhZ25keCwgcnhjcCk7CisJQlVHX09OKGZpID49IChpbnQpcG5vYi0+cnhfcV9sZW4pOworCUJVR19PTihmaSA8IDApOworCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJQlVHX09OKCFyeF9wYWdlX2luZm8tPnBhZ2UpOworCXBub2ItPnJ4X2N0eHRbZmldID0gKHZvaWQgKilOVUxMOworCS8qICBJZiBvbmUgcGFnZSBpcyB1c2VkIHBlciBmcmFnbWVudCBvciBpZiB0aGlzIGlzIHRoZQorCSAqIHNlY29uZCBoYWxmIG9mIHRoZSBwYWdlLCB1bm1hcCB0aGUgcGFnZSBoZXJlCisJICovCisJaWYgKHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgfHwgIXBub2ItPnJ4X3BnX3NoYXJlZCkgeworCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCSAgICAgICBmcmFnX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0KKworCW51bWZyYWdzID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBudW1mcmFncywgcnhjcCk7CisJdWRwY2tzbSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdWRwY2tzbSwgcnhjcCk7CisJdGNwY2tzbSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdGNwY2tzbSwgcnhjcCk7CisJdmxhbl90YWcgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHZsYW5fdGFnLCByeGNwKTsKKwl2bGFudCA9IGJlMTZfdG9fY3B1KHZsYW5fdGFnKTsKKwl2bGFuZiA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdnRwLCByeGNwKTsKKwl2dG0gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHZ0bSwgcnhjcCk7CisJcGt0c2l6ZSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgcGt0c2l6ZSwgcnhjcCk7CisKKwlhdG9taWNfZGVjKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisKKwlpZiAodGNwY2tzbSAmJiB1ZHBja3NtICYmIHBrdHNpemUgPT0gMzIpIHsKKwkJLyogZmx1c2ggY29tcGxldGlvbiBlbnRyaWVzICovCisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCXJldHVybjsKKwl9CisJLyogT25seSBvbmUgb2YgdWRwY2tzdW0gYW5kIHRjcGNrc3VtIGNhbiBiZSBzZXQgKi8KKwlCVUdfT04odWRwY2tzbSAmJiB0Y3Bja3NtKTsKKworCS8qIGp1bWJvIGZyYW1lcyBjb3VsZCBjb21lIGluIG11bHRpcGxlIGZyYWdtZW50cyAqLworCUJVR19PTihudW1mcmFncyAhPSAoKHBrdHNpemUgKyAoZnJhZ19zeiAtIDEpKSAvIGZyYWdfc3opKTsKKwluID0gbWluKHBrdHNpemUsIGZyYWdfc3opOworCW5yZXNpZCA9IHBrdHNpemUgLSBuOwkvKiB3aWxsIGJlIHVzZWZ1bCBmb3IganVtYm8gcGt0cyAqLworCWlkeCA9IDA7CisKKwl2YSA9IHBhZ2VfYWRkcmVzcyhyeF9wYWdlX2luZm8tPnBhZ2UpICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwlwcmVmZXRjaCh2YSk7CisJcnhfZnJhZ3NbaWR4XS5wYWdlID0gcnhfcGFnZV9pbmZvLT5wYWdlOworCXJ4X2ZyYWdzW2lkeF0ucGFnZV9vZmZzZXQgPSAocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCk7CisJcnhfZnJhZ3NbaWR4XS5zaXplID0gbjsKKwltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCisJLyogSWYgd2UgZ290IG11bHRpcGxlIGZyYWdtZW50cywgd2UgaGF2ZSBtb3JlIGRhdGEuICovCisJd2hpbGUgKG5yZXNpZCkgeworCQlpZHgrKzsKKwkJaW5kZXhfaW5jKCZmaSwgcG5vYi0+cnhfcV9sZW4pOworCisJCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJCXBub2ItPnJ4X2N0eHRbZmldID0gKHZvaWQgKilOVUxMOworCQlpZiAocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCB8fCAhcG5vYi0+cnhfcGdfc2hhcmVkKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyeF9wYWdlX2luZm8sIGJ1cyksCisJCQkJICAgICAgIGZyYWdfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKworCQluID0gbWluKG5yZXNpZCwgZnJhZ19zeik7CisJCXJ4X2ZyYWdzW2lkeF0ucGFnZSA9IHJ4X3BhZ2VfaW5mby0+cGFnZTsKKwkJcnhfZnJhZ3NbaWR4XS5wYWdlX29mZnNldCA9IChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0KTsKKwkJcnhfZnJhZ3NbaWR4XS5zaXplID0gbjsKKworCQlucmVzaWQgLT0gbjsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJYXRvbWljX2RlYygmcG5vYi0+cnhfcV9wb3N0ZWQpOworCX0KKworCWlmIChsaWtlbHkoISh2bGFuZiAmJiB2dG0pKSkgeworCQlscm9fcmVjZWl2ZV9mcmFncygmcG5vYi0+bHJvX21nciwgcnhfZnJhZ3MsCisJCQkJICBwa3RzaXplLCBwa3RzaXplLAorCQkJCSAgKHZvaWQgKikodW5zaWduZWQgbG9uZyljc3VtLCBjc3VtKTsKKwl9IGVsc2UgeworCQkvKiBWbGFuIHRhZyBwcmVzZW50IGluIHBrdCBhbmQgQkUgZm91bmQKKwkJICogdGhhdCB0aGUgdGFnIG1hdGNoZWQgYW4gZW50cnkgaW4gVkxBTiB0YWJsZQorCQkgKi8KKwkJaWYgKHVubGlrZWx5KCFwbm9iLT52bGFuX2dycCB8fCBwbm9iLT5udW1fdmxhbnMgPT0gMCkpIHsKKwkJCS8qIEJ1dCB3ZSBoYXZlIG5vIFZMQU5zIGNvbmZpZ3VyZWQuCisJCQkgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBEcm9wIHRoZSBwYWNrZXQuCisJCQkgKi8KKwkJCWRldl9pbmZvKCZwbm9iLT5uZXRkZXYtPmRldiwKKwkJCSAgICAgICAiQmxhZGVFbmdpbmU6IFVuZXhwZWN0ZWQgdmxhbiB0YWdnZWQgcGFja2V0XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBwYXNzIHRoZSBWTEFOIHBhY2tldCB0byBzdGFjayAqLworCQlscm9fdmxhbl9od2FjY2VsX3JlY2VpdmVfZnJhZ3MoJnBub2ItPmxyb19tZ3IsCisJCQkJCSAgICAgICByeF9mcmFncywgcGt0c2l6ZSwgcGt0c2l6ZSwKKwkJCQkJICAgICAgIHBub2ItPnZsYW5fZ3JwLCB2bGFudCwKKwkJCQkJICAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpY3N1bSwKKwkJCQkJICAgICAgIGNzdW0pOworCX0KKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2NvYWwrKzsKK30KKworc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpiZV9nZXRfcnhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgKnJ4Y3AgPSAmcG5vYi0+cnhfY3FbcG5vYi0+cnhfY3FfdGxdOworCXUzMiB2YWxpZCwgY3Q7CisKKwl2YWxpZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdmFsaWQsIHJ4Y3ApOworCWlmICh2YWxpZCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWN0ID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBjdCwgcnhjcCk7CisJaWYgKGN0ICE9IDApIHsKKwkJLyogSW52YWxpZCBjaHV0ZSAjLiB0cmVhdCBhcyBlcnJvciAqLworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGVyciwgcnhjcCwgMSk7CisJfQorCisJYmVfYWR2X3J4Y3FfdGwocG5vYik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2YWxpZCwgcnhjcCwgMCk7CisJcmV0dXJuIHJ4Y3A7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yeF9yYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIHVwZGF0ZSB0aGUgcmF0ZSBvbmNlIGluIHR3byBzZWNvbmRzICovCisJaWYgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMpID4gMiAqIChIWikpIHsKKwkJdTMyIHI7CisJCXIgPSBhZGFwdGVyLT5ldGhfcnhfYnl0ZXMgLworCQkgICAgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMpIC8gKEhaKSk7CisJCXIgPSAociAvIDEwMDAwMDApOwkvKiBNQi9TZWMgKi8KKworCQkvKiBNZWdhIEJpdHMvU2VjICovCisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF9yeF9yYXRlID0gKHIgKiA4KTsKKwkJYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMgPSBqaWZmaWVzOworCQlhZGFwdGVyLT5ldGhfcnhfYnl0ZXMgPSAwOworCX0KK30KKworc3RhdGljIGludCBwcm9jZXNzX3J4X2NvbXBsZXRpb25zKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCBpbnQgbWF4X3dvcmspCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcDsKKwl1MzIgbmMgPSAwOworCXVuc2lnbmVkIGludCBwa3RzaXplOworCisJd2hpbGUgKG1heF93b3JrICYmIChyeGNwID0gYmVfZ2V0X3J4X2NtcGwocG5vYikpKSB7CisJCXByZWZldGNoKHJ4Y3ApOworCQlwa3RzaXplID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBwa3RzaXplLCByeGNwKTsKKwkJcHJvY2Vzc19uaWNfcnhfY29tcGxldGlvbl9scm8ocG5vYiwgcnhjcCk7CisJCWFkYXB0ZXItPmV0aF9yeF9ieXRlcyArPSBwa3RzaXplOworCQl1cGRhdGVfcnhfcmF0ZShhZGFwdGVyKTsKKwkJbmMrKzsKKwkJbWF4X3dvcmstLTsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfY29tcGwrKzsKKwl9CisJaWYgKGxpa2VseShhZGFwdGVyLT5tYXhfcnhfY29hbCA+IDEpKSB7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2ZsdXNoKys7CisJCWxyb19mbHVzaF9hbGwoJnBub2ItPmxyb19tZ3IpOworCX0KKworCS8qIFJlZmlsbCB0aGUgcXVldWUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnBub2ItPnJ4X3FfcG9zdGVkKSA8IDkwMCkKKwkJYmVfcG9zdF9ldGhfcnhfYnVmZnMocG5vYik7CisKKwlyZXR1cm4gbmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgRVRIX1RYX0NPTVBMX0FNQVAgKmJlX2dldF90eF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCAqdHhjcCA9ICZwbm9iLT50eF9jcVtwbm9iLT50eF9jcV90bF07CisJdTMyIHZhbGlkOworCisJdmFsaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHZhbGlkLCB0eGNwKTsKKwlpZiAodmFsaWQgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHZhbGlkLCB0eGNwLCAwKTsKKwliZV9hZHZfdHhjcV90bChwbm9iKTsKKwlyZXR1cm4gdHhjcDsKKworfQorCit2b2lkIHByb2Nlc3Nfb25lX3R4X2NvbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCB1MzIgZW5kX2lkeCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJaW50IGN1cl9pbmRleCwgdHhfd3Jic19jb21wbGV0ZWQgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTY0IGJ1c2FkZHIsIHBhLCBwYV9sbywgcGFfaGk7CisJc3RydWN0IEVUSF9XUkJfQU1BUCAqd3JiOworCXUzMiBmcmFnX2xlbiwgbGFzdF9pbmRleCwgajsKKworCWxhc3RfaW5kZXggPSB0eF9jb21wbF9sYXN0d3JiX2lkeF9nZXQocG5vYik7CisJQlVHX09OKGxhc3RfaW5kZXggIT0gZW5kX2lkeCk7CisJcG5vYi0+dHhfY3R4dFtwbm9iLT50eF9xX3RsXSA9IE5VTEw7CisJZG8geworCQljdXJfaW5kZXggPSBwbm9iLT50eF9xX3RsOworCQl3cmIgPSAmcG5vYi0+dHhfcVtjdXJfaW5kZXhdOworCQlwYV9oaSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9XUkIsIGZyYWdfcGFfaGksIHdyYik7CisJCXBhX2xvID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19wYV9sbywgd3JiKTsKKwkJZnJhZ19sZW4gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfV1JCLCBmcmFnX2xlbiwgd3JiKTsKKwkJYnVzYWRkciA9IChwYV9oaSA8PCAzMikgfCBwYV9sbzsKKwkJaWYgKGJ1c2FkZHIgIT0gMCkgeworCQkJcGEgPSBsZTY0X3RvX2NwdShidXNhZGRyKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgcGEsCisJCQkJCSBmcmFnX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCX0KKwkJaWYgKGN1cl9pbmRleCA9PSBsYXN0X2luZGV4KSB7CisJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilwbm9iLT50eF9jdHh0W2N1cl9pbmRleF07CisJCQlCVUdfT04oIXNrYik7CisJCQlmb3IgKGogPSAwOyBqIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaisrKSB7CisJCQkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwkJCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbal07CisJCQkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQkJICAgICAgICh1bG9uZykgZnJhZy0+cGFnZSwgZnJhZy0+c2l6ZSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlwbm9iLT50eF9jdHh0W2N1cl9pbmRleF0gPSBOVUxMOworCQl9IGVsc2UgeworCQkJQlVHX09OKHBub2ItPnR4X2N0eHRbY3VyX2luZGV4XSk7CisJCX0KKwkJdHhfd3Jic19jb21wbGV0ZWQrKzsKKwkJYmVfYWR2X3R4cV90bChwbm9iKTsKKwl9IHdoaWxlIChjdXJfaW5kZXggIT0gbGFzdF9pbmRleCk7CisJYXRvbWljX3N1Yih0eF93cmJzX2NvbXBsZXRlZCwgJnBub2ItPnR4X3FfdXNlZCk7Cit9CisKKy8qIHRoZXJlIGlzIG5vIG5lZWQgdG8gdGFrZSBhbiBTTVAgbG9jayBoZXJlIHNpbmNlIGN1cnJlbnRseQorICogd2UgaGF2ZSBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgdGFza2xldCB0aGF0IGRvZXMgY29tcGxldGlvbgorICogcHJvY2Vzc2luZy4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19uaWNfdHhfY29tcGxldGlvbnMoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCAqdHhjcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG5vYi0+bmV0ZGV2OworCXUzMiBlbmRfaWR4LCBudW1fcHJvY2Vzc2VkID0gMDsKKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2V2ZW50cysrOworCisJd2hpbGUgKCh0eGNwID0gYmVfZ2V0X3R4X2NtcGwocG5vYikpKSB7CisJCWVuZF9pZHggPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHdyYl9pbmRleCwgdHhjcCk7CisJCXByb2Nlc3Nfb25lX3R4X2NvbXBsKHBub2IsIGVuZF9pZHgpOworCQludW1fcHJvY2Vzc2VkKys7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2NvbXBsKys7CisJfQorCWJlX25vdGlmeV9jbXBsKHBub2IsIG51bV9wcm9jZXNzZWQsIHBub2ItPnR4X2NxX2lkLCAxKTsKKwkvKgorCSAqIFdlIGdvdCBUeCBjb21wbGV0aW9ucyBhbmQgaGF2ZSB1c2FibGUgV1JCcy4KKwkgKiBJZiB0aGUgbmV0ZGV2J3MgcXVldWUgaGFzIGJlZW4gc3RvcHBlZAorCSAqIGJlY2F1c2Ugd2UgaGFkIHJ1biBvdXQgb2YgV1JCcywgd2FrZSBpdCBub3cuCisJICovCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50eHFfbG9jayk7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KQorCSAgICAmJiBhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKSA8IHBub2ItPnR4X3FfbGVuIC8gMikgeworCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eHFfbG9jayk7Cit9CisKK3N0YXRpYyB1MzIgcG9zdF9yeF9idWZmcyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgc3RydWN0IGxpc3RfaGVhZCAqcnhibCkKK3sKKwl1MzIgbnBvc3RlZCA9IDA7CisJc3RydWN0IEVUSF9SWF9EX0FNQVAgKnJ4ZCA9IE5VTEw7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyICpyeGJwOworCXZvaWQgKipyeF9jdHhwOworCXN0cnVjdCBSUV9EQl9BTUFQIHJxZGI7CisKKwlyeF9jdHhwID0gcG5vYi0+cnhfY3R4dDsKKworCXdoaWxlICghbGlzdF9lbXB0eShyeGJsKSAmJgorCSAgICAgICAocnhfY3R4cFtwbm9iLT5yeF9xX2hkXSA9PSBOVUxMKSAmJiBucG9zdGVkIDwgMjU1KSB7CisKKwkJcnhicCA9IGxpc3RfZmlyc3RfZW50cnkocnhibCwgc3RydWN0IGJlX3JlY3ZfYnVmZmVyLCByeGJfbGlzdCk7CisJCWxpc3RfZGVsKCZyeGJwLT5yeGJfbGlzdCk7CisJCXJ4ZCA9IHBub2ItPnJ4X3EgKyBwbm9iLT5yeF9xX2hkOworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfUlhfRCwgZnJhZ3BhX2xvLCByeGQsIHJ4YnAtPnJ4Yl9wYV9sbyk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9SWF9ELCBmcmFncGFfaGksIHJ4ZCwgcnhicC0+cnhiX3BhX2hpKTsKKworCQlyeF9jdHhwW3Bub2ItPnJ4X3FfaGRdID0gcnhicC0+cnhiX2N0eHQ7CisJCWJlX2Fkdl9yeHFfaGQocG5vYik7CisJCW5wb3N0ZWQrKzsKKwl9CisKKwlpZiAobnBvc3RlZCkgeworCQkvKiBOb3cgcHJlc3MgdGhlIGRvb3IgYmVsbCB0byBub3RpZnkgQmxhZGVFbmdpbmUuICovCisJCXJxZGIuZHdbMF0gPSAwOworCQlBTUFQX1NFVF9CSVRTX1BUUihSUV9EQiwgbnVtUG9zdGVkLCAmcnFkYiwgbnBvc3RlZCk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKFJRX0RCLCBycSwgJnJxZGIsIHBub2ItPnJ4X3FfaWQpOworCQlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBlcnhfcnFfZGIsIHJxZGIuZHdbMF0pOworCX0KKwlhdG9taWNfYWRkKG5wb3N0ZWQsICZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJcmV0dXJuIG5wb3N0ZWQ7Cit9CisKK3ZvaWQgYmVfcG9zdF9ldGhfcnhfYnVmZnMoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiBudW1fYnVmcywgcjsKKwl1NjQgYnVzYWRkciA9IDAsIHRtcF9wYTsKKwl1MzIgbWF4X2J1ZnMsIHBnX2hkOworCXUzMiBmcmFnX3NpemU7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyICpyeGJwOworCXN0cnVjdCBsaXN0X2hlYWQgcnhibDsKKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXUzMiBwYWdlX29yZGVyID0gMDsKKwlnZnBfdCBhbGxvY19mbGFncyA9IEdGUF9BVE9NSUM7CisKKwlCVUdfT04oIWFkYXB0ZXIpOworCisJbWF4X2J1ZnMgPSA2NDsJCS8qIHNob3VsZCBiZSBldmVuICMgPD0gMjU1LiAqLworCisJZnJhZ19zaXplID0gcG5vYi0+cnhfYnVmX3NpemU7CisJcGFnZV9vcmRlciA9IGdldF9vcmRlcihmcmFnX3NpemUpOworCisJaWYgKGZyYWdfc2l6ZSA9PSA4MTkyKQorCQlhbGxvY19mbGFncyB8PSAoZ2ZwX3QpIF9fR0ZQX0NPTVA7CisJLyoKKwkgKiBGb3JtIGEgbGlua2VkIGxpc3Qgb2YgUkVDVl9CVUZGRkVSIHN0cnVjdHVyZSB0byBiZSBiZSBwb3N0ZWQuCisJICogV2Ugd2lsbCBwb3N0IGV2ZW4gbnVtYmVyIG9mIGJ1ZmZlciBzbyB0aGF0IHBhZ2VzIGNhbiBiZQorCSAqIHNoYXJlZC4KKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmcnhibCk7CisKKwlmb3IgKG51bV9idWZzID0gMDsgbnVtX2J1ZnMgPCBtYXhfYnVmcyAmJgorCQkhcG5vYi0+cnhfcGFnZV9pbmZvW3Bub2ItPnJ4X3BnX2luZm9faGRdLnBhZ2U7ICsrbnVtX2J1ZnMpIHsKKworCQlyeGJwID0gJnBub2ItPmV0aF9yeF9idWZzW251bV9idWZzXTsKKwkJcGdfaGQgPSBwbm9iLT5yeF9wZ19pbmZvX2hkOworCQlyeF9wYWdlX2luZm8gPSAmcG5vYi0+cnhfcGFnZV9pbmZvW3BnX2hkXTsKKworCQlpZiAoIXBhZ2UpIHsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlcyhhbGxvY19mbGFncywgcGFnZV9vcmRlcik7CisJCQlpZiAodW5saWtlbHkocGFnZSA9PSBOVUxMKSkgeworCQkJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aHJ4X3Bvc3RfZmFpbCsrOworCQkJCXBub2ItPnJ4YnVmX3Bvc3RfZmFpbCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJcG5vYi0+cnhidWZfcG9zdF9mYWlsID0gMDsKKwkJCWJ1c2FkZHIgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgcGFnZSwgMCwKKwkJCQkJICAgICAgIGZyYWdfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgPSAwOworCQkJcnhfcGFnZV9pbmZvLT5wYWdlID0gcGFnZTsKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgc2hhcmluZyBhIHBhZ2UgYW1vbmcgdHdvIHNrYnMsCisJCQkgKiBhbGxvYyBhIG5ldyBvbmUgb24gdGhlIG5leHQgaXRlcmF0aW9uCisJCQkgKi8KKwkJCWlmIChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpCisJCQkJcGFnZSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlnZXRfcGFnZShwYWdlKTsKKwkJCXJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgKz0gZnJhZ19zaXplOworCQkJcnhfcGFnZV9pbmZvLT5wYWdlID0gcGFnZTsKKwkJCS8qCisJCQkgKiBXZSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgYWxsb2NlZCBwYWdlLAorCQkJICogQWxsb2MgYSBuZXcgb25lIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbgorCQkJICovCisJCQlwYWdlID0gTlVMTDsKKwkJfQorCQlyeGJwLT5yeGJfY3R4dCA9ICh2b2lkICopcnhfcGFnZV9pbmZvOworCQlpbmRleF9pbmMoJnBub2ItPnJ4X3BnX2luZm9faGQsIHBub2ItPnJ4X3FfbGVuKTsKKworCQlwY2lfdW5tYXBfYWRkcl9zZXQocnhfcGFnZV9pbmZvLCBidXMsIGJ1c2FkZHIpOworCQl0bXBfcGEgPSBidXNhZGRyICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwkJcnhicC0+cnhiX3BhX2xvID0gKHRtcF9wYSAmIDB4RkZGRkZGRkYpOworCQlyeGJwLT5yeGJfcGFfaGkgPSAodG1wX3BhID4+IDMyKTsKKwkJcnhicC0+cnhiX2xlbiA9IGZyYWdfc2l6ZTsKKwkJbGlzdF9hZGRfdGFpbCgmcnhicC0+cnhiX2xpc3QsICZyeGJsKTsKKwl9CQkJLyogRW5kIG9mIGZvciAqLworCisJciA9IHBvc3RfcnhfYnVmZnMocG5vYiwgJnJ4YmwpOworCUJVR19PTihyICE9IG51bV9idWZzKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQgc2VydmljZSBmb3IgbmV0d29yayBmdW5jdGlvbi4gIFdlIGp1c3Qgc2NoZWR1bGUgdGhlCisgKiB0YXNrbGV0IHdoaWNoIGRvZXMgYWxsIGNvbXBsZXRpb24gcHJvY2Vzc2luZy4KKyAqLworaXJxcmV0dXJuX3QgYmVfaW50KGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2OworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTMyIGlzcjsKKworCWlzciA9IENTUl9SRUFEKCZwbm9iLT5mbl9vYmosIGNldi5pc3IxKTsKKwlpZiAodW5saWtlbHkoIWlzcikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+aW50X2xvY2spOworCWFkYXB0ZXItPmlzciB8PSBpc3I7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPmludF9sb2NrKTsKKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHMrKzsKKworCXRhc2tsZXRfc2NoZWR1bGUoJmFkYXB0ZXItPnN0c19oYW5kbGVyKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBQb2xsIGZ1bmN0aW9uIGNhbGxlZCBieSBOQVBJIHdpdGggYSB3b3JrIGJ1ZGdldC4KKyAqIFdlIHByb2Nlc3MgYXMgbWFueSBVQy4gQkMgYW5kIE1DIHJlY2VpdmUgY29tcGxldGlvbnMKKyAqIGFzIHRoZSBidWRnZXQgYWxsb3dzIGFuZCByZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2YKKyAqIFJYIHN0c3R1dHNlcyBwcm9jZXNzZWQuCisgKi8KK2ludCBiZV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9CisJCQljb250YWluZXJfb2YobmFwaSwgc3RydWN0IGJlX25ldF9vYmplY3QsIG5hcGkpOworCXUzMiB3b3JrX2RvbmU7CisKKwlwbm9iLT5hZGFwdGVyLT5iZV9zdGF0LmJlc19wb2xscysrOworCXdvcmtfZG9uZSA9IHByb2Nlc3NfcnhfY29tcGxldGlvbnMocG5vYiwgYnVkZ2V0KTsKKwlCVUdfT04od29ya19kb25lID4gYnVkZ2V0KTsKKworCS8qIEFsbCBjb25zdW1lZCAqLworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmFwaSk7CisJCS8qIGVuYWJsZSBpbnRyICovCisJCWJlX25vdGlmeV9jbXBsKHBub2IsIHdvcmtfZG9uZSwgcG5vYi0+cnhfY3FfaWQsIDEpOworCX0gZWxzZSB7CisJCS8qIE1vcmUgdG8gYmUgY29uc3VtZWQ7IGNvbnRpbnVlIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworCQliZV9ub3RpZnlfY21wbChwbm9iLCB3b3JrX2RvbmUsIHBub2ItPnJ4X2NxX2lkLCAwKTsKKwl9CisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIHN0cnVjdCBFUV9FTlRSWV9BTUFQICpnZXRfZXZlbnQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IEVRX0VOVFJZX0FNQVAgKmVxcCA9ICYocG5vYi0+ZXZlbnRfcVtwbm9iLT5ldmVudF9xX3RsXSk7CisJaWYgKCFBTUFQX0dFVF9CSVRTX1BUUihFUV9FTlRSWSwgVmFsaWQsIGVxcCkpCisJCXJldHVybiBOVUxMOworCWJlX2Fkdl9lcV90bChwbm9iKTsKKwlyZXR1cm4gZXFwOworfQorCisvKgorICogUHJvY2Vzc2VzIGFsbCB2YWxpZCBldmVudHMgaW4gdGhlIGV2ZW50IHJpbmcgYXNzb2NpYXRlZCB3aXRoIGdpdmVuCisgKiBOZXRPYmplY3QuICBBbHNvLCBub3RpZmllcyBCRSB0aGUgbnVtYmVyIG9mIGV2ZW50cyBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHByb2Nlc3NfZXZlbnRzKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKwlzdHJ1Y3QgRVFfRU5UUllfQU1BUCAqZXFwOworCXUzMiByaWQsIG51bV9ldmVudHMgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwbm9iLT5uZXRkZXY7CisKKwl3aGlsZSAoKGVxcCA9IGdldF9ldmVudChwbm9iKSkgIT0gTlVMTCkgeworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19ldmVudHMrKzsKKwkJcmlkID0gQU1BUF9HRVRfQklUU19QVFIoRVFfRU5UUlksIFJlc291cmNlSUQsIGVxcCk7CisJCWlmIChyaWQgPT0gcG5vYi0+cnhfY3FfaWQpIHsKKwkJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2V2ZW50cysrOworCQkJbmV0aWZfcnhfc2NoZWR1bGUoJnBub2ItPm5hcGkpOworCQl9IGVsc2UgaWYgKHJpZCA9PSBwbm9iLT50eF9jcV9pZCkgeworCQkJcHJvY2Vzc19uaWNfdHhfY29tcGxldGlvbnMocG5vYik7CisJCX0gZWxzZSBpZiAocmlkID09IHBub2ItPm1jY19jcV9pZCkgeworCQkJYmVfbWNjX3Byb2Nlc3NfY3EoJnBub2ItPm1jY19xX29iaiwgMSk7CisJCX0gZWxzZSB7CisJCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsCisJCQkJCSJJbnZhbGlkIEVRIFJlc291cmNlSUQgJWRcbiIsIHJpZCk7CisJCX0KKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfRU5UUlksIFZhbGlkLCBlcXAsIDApOworCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9FTlRSWSwgUmVzb3VyY2VJRCwgZXFwLCAwKTsKKwkJbnVtX2V2ZW50cysrOworCX0KKwlyZXR1cm4gbnVtX2V2ZW50czsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2VxZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3RwOworCisJLyogdXBkYXRlIG9uY2UgYSBzZWNvbmQgKi8KKwlpZiAoKGppZmZpZXMgLSBhZGFwdGVyLT5pcHNfamlmZmllcykgPiAxICogKEhaKSkgeworCQkvKiBPbmUgc2Vjb25kIGVsYXBzZWQgc2luY2UgbGFzdCB1cGRhdGUgICovCisJCXUzMiByLCBuZXdfZXFkID0gLTE7CisJCXIgPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19pbnRzIC0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcHJldl9pbnRzOworCQlyID0gciAvICgoamlmZmllcyAtIGFkYXB0ZXItPmlwc19qaWZmaWVzKSAvIChIWikpOworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19pcHMgPSByOworCQlhZGFwdGVyLT5pcHNfamlmZmllcyA9IGppZmZpZXM7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3ByZXZfaW50cyA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHM7CisJCWlmIChyID4gSVBTX0hJX1dNICYmIGFkYXB0ZXItPmN1cl9lcWQgPCBhZGFwdGVyLT5tYXhfZXFkKQorCQkJbmV3X2VxZCA9IChhZGFwdGVyLT5jdXJfZXFkICsgOCk7CisJCWlmIChyIDwgSVBTX0xPX1dNICYmIGFkYXB0ZXItPmN1cl9lcWQgPiBhZGFwdGVyLT5taW5fZXFkKQorCQkJbmV3X2VxZCA9IChhZGFwdGVyLT5jdXJfZXFkIC0gOCk7CisJCWlmIChhZGFwdGVyLT5lbmFibGVfYWljICYmIG5ld19lcWQgIT0gLTEpIHsKKwkJCWVxX29iamVjdHAgPSAmcG5vYi0+ZXZlbnRfcV9vYmo7CisJCQlzdGF0dXMgPSBiZV9lcV9tb2RpZnlfZGVsYXkoJnBub2ItPmZuX29iaiwgMSwKKwkJCQkJCSAgICAmZXFfb2JqZWN0cCwgJm5ld19lcWQsIE5VTEwsCisJCQkJCQkgICAgTlVMTCwgTlVMTCk7CisJCQlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpCisJCQkJYWRhcHRlci0+Y3VyX2VxZCA9IG5ld19lcWQ7CisJCX0KKwl9Cit9CisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBub3RpZmllcyBCbGFkZUVuZ2luZSBvZiBob3cgbWFueSBldmVudHMgd2VyZSBwcm9jZXNzZWQKKyAgICBmcm9tIHRoZSBldmVudCBxdWV1ZSBieSByaW5naW5nIHRoZSBjb3JyZXNwb25kaW5nIGRvb3IgYmVsbCBhbmQKKyAgICBvcHRpb25hbGx5IHJlLWFybXMgdGhlIGV2ZW50IHF1ZXVlLgorICAgIG4JCS0gbnVtYmVyIG9mIGV2ZW50cyBwcm9jZXNzZWQKKyAgICByZV9hcm0JLSAxIC0gcmUtYXJtIHRoZSBFUSwgMCAtIGRvIG5vdCByZS1hcm0gdGhlIEVRCisKKyovCitzdGF0aWMgdm9pZCBiZV9ub3RpZnlfZXZlbnQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIGludCBuLCBpbnQgcmVfYXJtKQoreworCXN0cnVjdCBDUV9EQl9BTUFQIGVxZGI7CisJZXFkYi5kd1swXSA9IDA7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcWlkLCAmZXFkYiwgcG5vYi0+ZXZlbnRfcV9pZCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmZXFkYiwgcmVfYXJtKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZlcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmVxZGIsIG4pOworCS8qCisJICogVW5kZXIgc29tZSBzaXR1YXRpb25zIHdlIHNlZSBhbiBpbnRlcnJ1cHQgYW5kIG5vIHZhbGlkCisJICogRVEgZW50cnkuICBUbyBrZWVwIGdvaW5nLCB3ZSBuZWVkIHRvIHJpbmcgdGhlIERCIGV2ZW4gaWYKKwkgKiBudW1QT3N0ZWQgaXMgMC4KKwkgKi8KKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgZXFkYi5kd1swXSk7CisJcmV0dXJuOworfQorCisvKgorICogQ2FsbGVkIGZyb20gdGhlIHRhc2tsZXQgc2NoZWR1bGVkIGJ5IElTUi4gIEFsbCByZWFsIGludGVycnVwdCBwcm9jZXNzaW5nCisgKiBpcyBkb25lIGhlcmUuCisgKi8KK3ZvaWQgYmVfcHJvY2Vzc19pbnRyKHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYmVfYWRhcHRlciAqKWNvbnRleHQ7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCXUzMiBpc3IsIG47CisJdWxvbmcgZmxhZ3MgPSAwOworCisJaXNyID0gYWRhcHRlci0+aXNyOworCisJLyoKKwkgKiB3ZSBjcmVhdGUgb25seSBvbmUgTklDIGV2ZW50IHF1ZXVlIGluIExpbnV4LiBFdmVudCBpcworCSAqIGV4cGVjdGVkIG9ubHkgaW4gdGhlIGZpcnN0IGV2ZW50IHF1ZXVlCisJICovCisJQlVHX09OKGlzciAmIDB4ZmZmZmZmZmUpOworCWlmICgoaXNyICYgMSkgPT0gMCkKKwkJcmV0dXJuOwkJLyogbm90IG91ciBpbnRlcnJ1cHQgKi8KKwluID0gcHJvY2Vzc19ldmVudHMocG5vYik7CisJLyoKKwkgKiBDbGVhciB0aGUgZXZlbnQgYml0LiBhZGFwdGVyLT5pc3IgaXMgIHNldCBieQorCSAqIGhhcmQgaW50ZXJydXB0LiAgUHJldmVudCByYWNlIHdpdGggbG9jay4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+aW50X2xvY2ssIGZsYWdzKTsKKwlhZGFwdGVyLT5pc3IgJj0gfjE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aW50X2xvY2ssIGZsYWdzKTsKKwliZV9ub3RpZnlfZXZlbnQocG5vYiwgbiwgMSk7CisJLyoKKwkgKiBJZiBwcmV2aW91cyBhbGxvY2F0aW9uIGF0dGVtcHRzIGhhZCBmYWlsZWQgYW5kCisJICogQkUgaGFzIHVzZWQgdXAgYWxsIHBvc3RlZCBidWZmZXJzLCBwb3N0IFJYIGJ1ZmZlcnMgaGVyZQorCSAqLworCWlmIChwbm9iLT5yeGJ1Zl9wb3N0X2ZhaWwgJiYgYXRvbWljX3JlYWQoJnBub2ItPnJ4X3FfcG9zdGVkKSA9PSAwKQorCQliZV9wb3N0X2V0aF9yeF9idWZmcyhwbm9iKTsKKwl1cGRhdGVfZXFkKGFkYXB0ZXIsIHBub2IpOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9uZXRpZi5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX25ldGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4ZGFmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9uZXRpZi5jCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogYmVfbmV0aWYuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB2YXJpb3VzIGVudHJ5IHBvaW50cyBvZiBkcml2ZXJzIHNlZW4gYnkgdGNwL2lwIHN0YWNrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlICJiZW5ldC5oIgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKworLyogU3RyaW5ncyB0byBwcmludCBMaW5rIHByb3BlcnRpZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpsaW5rX3NwZWVkW10gPSB7CisJIkludmFsaWQgbGluayBTcGVlZCBWYWx1ZSIsCisJIjEwIE1icHMiLAorCSIxMDAgTWJwcyIsCisJIjEgR2JwcyIsCisJIjEwIEdicHMiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua19kdXBsZXhbXSA9IHsKKwkiSW52YWxpZCBEdXBsZXggVmFsdWUiLAorCSJIYWxmIER1cGxleCIsCisJIkZ1bGwgRHVwbGV4IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxpbmtfc3RhdGVbXSA9IHsKKwkiIiwKKwkiKGFjdGl2ZSkiCit9OworCit2b2lkIGJlX3ByaW50X2xpbmtfaW5mbyhzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmxua19zdGF0dXMpCit7CisJdTE2IHNpLCBkaSwgYWk7CisKKwkvKiBQb3J0IDAgKi8KKwlpZiAobG5rX3N0YXR1cy0+bWFjMF9zcGVlZCAmJiBsbmtfc3RhdHVzLT5tYWMwX2R1cGxleCkgeworCQkvKiBQb3J0IGlzIHVwIGFuZCBydW5uaW5nICovCisJCXNpID0gKGxua19zdGF0dXMtPm1hYzBfc3BlZWQgPCA1KSA/IGxua19zdGF0dXMtPm1hYzBfc3BlZWQgOiAwOworCQlkaSA9IChsbmtfc3RhdHVzLT5tYWMwX2R1cGxleCA8IDMpID8KKwkJICAgIGxua19zdGF0dXMtPm1hYzBfZHVwbGV4IDogMDsKKwkJYWkgPSAobG5rX3N0YXR1cy0+YWN0aXZlX3BvcnQgPT0gMCkgPyAxIDogMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydE5vLiAwOiBTcGVlZCAtICVzICVzICVzXG4iLAorCQkgICAgICAgbGlua19zcGVlZFtzaV0sIGxpbmtfZHVwbGV4W2RpXSwgbGlua19zdGF0ZVthaV0pOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJQb3J0Tm8uIDA6IERvd25cbiIpOworCisJLyogUG9ydCAxICovCisJaWYgKGxua19zdGF0dXMtPm1hYzFfc3BlZWQgJiYgbG5rX3N0YXR1cy0+bWFjMV9kdXBsZXgpIHsKKwkJLyogUG9ydCBpcyB1cCBhbmQgcnVubmluZyAqLworCQlzaSA9IChsbmtfc3RhdHVzLT5tYWMxX3NwZWVkIDwgNSkgPyBsbmtfc3RhdHVzLT5tYWMxX3NwZWVkIDogMDsKKwkJZGkgPSAobG5rX3N0YXR1cy0+bWFjMV9kdXBsZXggPCAzKSA/CisJCSAgICBsbmtfc3RhdHVzLT5tYWMxX2R1cGxleCA6IDA7CisJCWFpID0gKGxua19zdGF0dXMtPmFjdGl2ZV9wb3J0ID09IDApID8gMSA6IDA7CisJCXByaW50ayhLRVJOX0lORk8gIlBvcnROby4gMTogU3BlZWQgLSAlcyAlcyAlc1xuIiwKKwkJICAgICAgIGxpbmtfc3BlZWRbc2ldLCBsaW5rX2R1cGxleFtkaV0sIGxpbmtfc3RhdGVbYWldKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydE5vLiAxOiBEb3duXG4iKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAorYmVfZ2V0X2ZyYWdfaGVhZGVyKHN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWcsIHZvaWQgKiptYWNfaGRyLAorCQkgICB2b2lkICoqaXBfaGRyLCB2b2lkICoqdGNwdWRwX2hkciwKKwkJICAgdTY0ICpoZHJfZmxhZ3MsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGV0aGhkciAqZWg7CisJc3RydWN0IHZsYW5fZXRoaGRyICp2ZWg7CisJc3RydWN0IGlwaGRyICppcGg7CisJdTggKnZhID0gcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UpICsgZnJhZy0+cGFnZV9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBsbF9obGVuOworCisJLyogZmluZCB0aGUgbWFjIGhlYWRlciwgYWJvcnQgaWYgbm90IElQdjQgKi8KKworCXByZWZldGNoKHZhKTsKKwllaCA9IChzdHJ1Y3QgZXRoaGRyICopdmE7CisJKm1hY19oZHIgPSBlaDsKKwlsbF9obGVuID0gRVRIX0hMRU47CisJaWYgKGVoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkgeworCQlpZiAoZWgtPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCQl2ZWggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopdmE7CisJCQlpZiAodmVoLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWxsX2hsZW4gKz0gVkxBTl9ITEVOOworCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJKmhkcl9mbGFncyA9IExST19JUFY0OworCisJaXBoID0gKHN0cnVjdCBpcGhkciAqKSh2YSArIGxsX2hsZW4pOworCSppcF9oZHIgPSBpcGg7CisJaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCisJCXJldHVybiAtMTsKKwkqaGRyX2ZsYWdzIHw9IExST19UQ1A7CisJKnRjcHVkcF9oZHIgPSAodTggKikgKCppcF9oZHIpICsgKGlwaC0+aWhsIDw8IDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmVuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IG5ldF9scm9fbWdyICpscm9fbWdyOworCisJaWYgKGFkYXB0ZXItPmRldl9zdGF0ZSA8IEJFX0RFVl9TVEFURV9JTklUKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWxyb19tZ3IgPSAmcG5vYi0+bHJvX21ncjsKKwlscm9fbWdyLT5kZXYgPSBuZXRkZXY7CisKKwlscm9fbWdyLT5mZWF0dXJlcyA9IExST19GX05BUEk7CisJbHJvX21nci0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJbHJvX21nci0+aXBfc3VtbWVkX2FnZ3IgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwlscm9fbWdyLT5tYXhfZGVzYyA9IEJFX01BWF9MUk9fREVTQ1JJUFRPUlM7CisJbHJvX21nci0+bHJvX2FyciA9IHBub2ItPmxyb19kZXNjOworCWxyb19tZ3ItPmdldF9mcmFnX2hlYWRlciA9IGJlX2dldF9mcmFnX2hlYWRlcjsKKwlscm9fbWdyLT5tYXhfYWdnciA9IGFkYXB0ZXItPm1heF9yeF9jb2FsOworCWxyb19tZ3ItPmZyYWdfYWxpZ25fcGFkID0gMjsKKwlpZiAobHJvX21nci0+bWF4X2FnZ3IgPiBNQVhfU0tCX0ZSQUdTKQorCQlscm9fbWdyLT5tYXhfYWdnciA9IE1BWF9TS0JfRlJBR1M7CisKKwlhZGFwdGVyLT5tYXhfcnhfY29hbCA9IEJFX0xST19NQVhfUEtUUzsKKworCWJlX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKKworCS8qCisJICogU2V0IGNhcnJpZXIgb24gb25seSBpZiBQaHlzaWNhbCBMaW5rIHVwCisJICogRWl0aGVyIG9mIHRoZSBwb3J0IGxpbmsgc3RhdHVzIHVwIHNpZ25pZmllcyB0aGlzCisJICovCisJaWYgKChhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9PSBCRV9QT1JUX0xJTktfVVApIHx8CisJICAgIChhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9PSBCRV9QT1JUX0xJTktfVVApKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwl9CisKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfT1BFTjsKKwluYXBpX2VuYWJsZSgmcG5vYi0+bmFwaSk7CisJYmVfZW5hYmxlX2ludHIocG5vYik7CisJYmVfZW5hYmxlX2VxX2ludHIocG5vYik7CisJLyoKKwkgKiBSWCBjb21wbGV0aW9uIHF1ZXVlIG1heSBiZSBpbiBkaXMtYXJtZWQgc3RhdGUuIEFybSBpdC4KKwkgKi8KKwliZV9ub3RpZnlfY21wbChwbm9iLCAwLCBwbm9iLT5yeF9jcV9pZCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZW5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJc3luY2hyb25pemVfaXJxKG5ldGRldi0+aXJxKTsKKworCWJlX3dhaXRfbmljX3R4X2NtcGx4X2NtcGwocG5vYik7CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX0lOSVQ7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKworCWFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKwliZV9kaXNhYmxlX2ludHIocG5vYik7CisJYmVfZGlzYWJsZV9lcV9pbnRyKHBub2IpOworCW5hcGlfZGlzYWJsZSgmcG5vYi0+bmFwaSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldHRpbmcgYSBNYWMgQWRkcmVzcyBmb3IgQkUKKyAqIFRha2VzIG5ldGRldiBhbmQgYSB2b2lkIHBvaW50ZXIgYXMgYXJndW1lbnRzLgorICogVGhlIHBvaW50ZXIgaG9sZHMgdGhlIG5ldyBhZGRyZXMgdG8gYmUgdXNlZC4KKyAqLworc3RhdGljIGludCBiZW5ldF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKwliZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZSgmcG5vYi0+Zm5fb2JqLCAwLCAwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCisJCQkJbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisJLyoKKwkgKiBTaW5jZSB3ZSBhcmUgZG9pbmcgQWN0aXZlLVBhc3NpdmUgZmFpbG92ZXIsIGJvdGgKKwkgKiBwb3J0cyBzaG91bGQgaGF2ZSBtYXRjaGluZyBNQUMgYWRkcmVzc2VzIGV2ZXJ5dGltZS4KKwkgKi8KKwliZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZSgmcG5vYi0+Zm5fb2JqLCAxLCAwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCisJCQkJICAgICAgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IGJlX3RpbWVyX2N0eHQgKmN0eHQgPSAoc3RydWN0IGJlX3RpbWVyX2N0eHQgKiljb250ZXh0OworCisJaWYgKGF0b21pY19yZWFkKCZjdHh0LT5nZXRfc3RhdF9mbGFnKSkgeworCQlhdG9taWNfZGVjKCZjdHh0LT5nZXRfc3RhdF9mbGFnKTsKKwkJdXAoKHZvaWQgKiljdHh0LT5nZXRfc3RhdF9zZW1fYWRkcik7CisJfQorCWRlbF90aW1lcigmY3R4dC0+Z2V0X3N0YXRzX3RpbWVyKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgYmVfZ2V0X3N0YXRfY2Iodm9pZCAqY29udGV4dCwgaW50IHN0YXR1cywKKwkJICAgIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKm9wdGlvbmFsX3dyYikKK3sKKwlzdHJ1Y3QgYmVfdGltZXJfY3R4dCAqY3R4dCA9IChzdHJ1Y3QgYmVfdGltZXJfY3R4dCAqKWNvbnRleHQ7CisJLyoKKwkgKiBqdXN0IHVwIHRoZSBzZW1hcGhvcmUgaWYgdGhlIGdldF9zdGF0X2ZsYWcKKwkgKiByZWFkcyAxLiBzbyB0aGF0IHRoZSB3YWl0ZXIgY2FuIGNvbnRpbnVlLgorCSAqIElmIGl0IGlzIDAsIHRoZW4gaXQgd2FzIGhhbmRsZWQgYnkgdGhlIHRpbWVyIGhhbmRsZXIuCisJICovCisJZGVsX3RpbWVyKCZjdHh0LT5nZXRfc3RhdHNfdGltZXIpOworCWlmIChhdG9taWNfcmVhZCgmY3R4dC0+Z2V0X3N0YXRfZmxhZykpIHsKKwkJYXRvbWljX2RlYygmY3R4dC0+Z2V0X3N0YXRfZmxhZyk7CisJCXVwKCh2b2lkICopY3R4dC0+Z2V0X3N0YXRfc2VtX2FkZHIpOworCX0KK30KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJlbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTY0IHBhOworCXN0cnVjdCBiZV90aW1lcl9jdHh0ICpjdHh0ID0gJmFkYXB0ZXItPnRpbWVyX2N0eHQ7CisKKwlpZiAoYWRhcHRlci0+ZGV2X3N0YXRlICE9IEJFX0RFVl9TVEFURV9PUEVOKSB7CisJCS8qIFJldHVybiBwcmV2aW91c2x5IHJlYWQgc3RhdHMgKi8KKwkJcmV0dXJuICYoYWRhcHRlci0+YmVuZXRfc3RhdHMpOworCX0KKwkvKiBHZXQgUGh5c2ljYWwgQWRkciAqLworCXBhID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgYWRhcHRlci0+ZXRoX3N0YXRzcCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwljdHh0LT5nZXRfc3RhdF9zZW1fYWRkciA9ICh1bnNpZ25lZCBsb25nKSZhZGFwdGVyLT5nZXRfZXRoX3N0YXRfc2VtOworCWF0b21pY19pbmMoJmN0eHQtPmdldF9zdGF0X2ZsYWcpOworCisJYmVfcnhmX3F1ZXJ5X2V0aF9zdGF0aXN0aWNzKCZwbm9iLT5mbl9vYmosIGFkYXB0ZXItPmV0aF9zdGF0c3AsCisJCQkJICAgIGNwdV90b19sZTY0KHBhKSwgYmVfZ2V0X3N0YXRfY2IsIGN0eHQsCisJCQkJICAgIE5VTEwpOworCisJY3R4dC0+Z2V0X3N0YXRzX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljdHh0OworCW1vZF90aW1lcigmY3R4dC0+Z2V0X3N0YXRzX3RpbWVyLCAoamlmZmllcyArIChIWiAqIDIpKSk7CisJZG93bigodm9pZCAqKWN0eHQtPmdldF9zdGF0X3NlbV9hZGRyKTsJLyogY2FsbGJhY2sgd2lsbCB1bmJsb2NrIHVzICovCisKKwkvKiBBZGRpbmcgcG9ydDAgYW5kIHBvcnQxIHN0YXRzLiAqLworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X3BhY2tldHMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDByZWN2ZHRvdGFsZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxcmVjdmR0b3RhbGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9wYWNrZXRzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAweG1pdHVuaWNhc3RmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDF4bWl0dW5pY2FzdGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9ieXRlcyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHhtaXRieXRlc2xzZCArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMXhtaXRieXRlc2xzZDsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBjcmNlcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFjcmNlcnJvcnM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfZXJyb3JzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGFsaWdubWVudHN5bWVycnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFhbGlnbm1lbnRzeW1lcnJzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2Vycm9ycyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBpbnJhbmdlbGVuZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxaW5yYW5nZWxlbmVycm9yczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9ieXRlcyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHJlY3ZkdG90YWxieXRlc0xTRCArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMXJlY3ZkdG90YWxieXRlc0xTRDsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwY3JjZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxY3JjZXJyb3JzOworCisJYWRhcHRlci0+YmVuZXRfc3RhdHMudHhfcGFja2V0cyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDB4bWl0bXVsdGljYXN0ZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxeG1pdG11bHRpY2FzdGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9wYWNrZXRzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHhtaXRicm9hZGNhc3RmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDF4bWl0YnJvYWRjYXN0ZnJhbWVzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnR4X2Vycm9ycyA9IDA7CisKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5tdWx0aWNhc3QgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDB4bWl0bXVsdGljYXN0ZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxeG1pdG11bHRpY2FzdGZyYW1lczsKKworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwcnhmaWZvb3ZlcmZsb3dkcm9wcGVkICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxcnhmaWZvb3ZlcmZsb3dkcm9wcGVkOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGFsaWdubWVudHN5bWVycnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFhbGlnbm1lbnRzeW1lcnJzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBpbnJhbmdlbGVuZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxaW5yYW5nZWxlbmVycm9yczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMG91dHJhbmdlZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxb3V0cmFuZ2VlcnJvcnM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBmcmFtZXRvb2xvbmdlcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFmcmFtZXRvb2xvbmdlcnJvcnM7CisKKwlwY2lfdW5tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsICh1bG9uZykgYWRhcHRlci0+ZXRoX3N0YXRzcCwKKwkJCSBzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyZXR1cm4gJihhZGFwdGVyLT5iZW5ldF9zdGF0cyk7CisKK30KKworc3RhdGljIHZvaWQgYmVfc3RhcnRfdHgoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHUzMiBucG9zdGVkKQoreworI2RlZmluZSBDU1JfRVRIX01BWF9TUVBPU1RTIDI1NQorCXN0cnVjdCBTUV9EQl9BTUFQIHNxZGI7CisKKwlzcWRiLmR3WzBdID0gMDsKKworCUFNQVBfU0VUX0JJVFNfUFRSKFNRX0RCLCBjaWQsICZzcWRiLCBwbm9iLT50eF9xX2lkKTsKKwl3aGlsZSAobnBvc3RlZCkgeworCQlpZiAobnBvc3RlZCA+IENTUl9FVEhfTUFYX1NRUE9TVFMpIHsKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKFNRX0RCLCBudW1Qb3N0ZWQsICZzcWRiLAorCQkJCQkgIENTUl9FVEhfTUFYX1NRUE9TVFMpOworCQkJbnBvc3RlZCAtPSBDU1JfRVRIX01BWF9TUVBPU1RTOworCQl9IGVsc2UgeworCQkJQU1BUF9TRVRfQklUU19QVFIoU1FfREIsIG51bVBvc3RlZCwgJnNxZGIsIG5wb3N0ZWQpOworCQkJbnBvc3RlZCA9IDA7CisJCX0KKwkJUERfV1JJVEUoJnBub2ItPmZuX29iaiwgZXR4X3NxX2RiLCBzcWRiLmR3WzBdKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90eF9yYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIHVwZGF0ZSB0aGUgcmF0ZSBvbmNlIGluIHR3byBzZWNvbmRzICovCisJaWYgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3R4X2ppZmZpZXMpID4gMiAqIChIWikpIHsKKwkJdTMyIHI7CisJCXIgPSBhZGFwdGVyLT5ldGhfdHhfYnl0ZXMgLworCQkgICAgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3R4X2ppZmZpZXMpIC8gKEhaKSk7CisJCXIgPSAociAvIDEwMDAwMDApOwkvKiBNIGJ5dGVzL3MgKi8KKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRoX3R4X3JhdGUgPSAociAqIDgpOyAvKiBNIGJpdHMvcyAqLworCQlhZGFwdGVyLT5ldGhfdHhfamlmZmllcyA9IGppZmZpZXM7CisJCWFkYXB0ZXItPmV0aF90eF9ieXRlcyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHdyYl9jbnRfaW5fc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGNudCA9IDA7CisJd2hpbGUgKHNrYikgeworCQlpZiAoc2tiLT5sZW4gPiBza2ItPmRhdGFfbGVuKQorCQkJY250Kys7CisJCWNudCArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQlza2IgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwl9CisJQlVHX09OKGNudCA+IEJFX01BWF9UWF9GUkFHX0NPVU5UKTsKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgdm9pZCB3cmJfZmlsbChzdHJ1Y3QgRVRIX1dSQl9BTUFQICp3cmIsIHU2NCBhZGRyLCBpbnQgbGVuKQoreworCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGZyYWdfcGFfaGksIHdyYiwgYWRkciA+PiAzMik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19wYV9sbywgd3JiLCBhZGRyICYgMHhGRkZGRkZGRik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19sZW4sIHdyYiwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgd3JiX2ZpbGxfZXh0cmEoc3RydWN0IEVUSF9XUkJfQU1BUCAqd3JiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJd3JiLT5kd1syXSA9IDA7CisJd3JiLT5kd1szXSA9IDA7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgY3JjLCB3cmIsIDEpOworCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID4gMSAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGxzbywgd3JiLCAxKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgbHNvX21zcywgd3JiLAorCQkJCSAgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7CisJfSBlbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCXU4IHByb3RvID0gKChzdHJ1Y3QgaXBoZHIgKilpcF9oZHIoc2tiKSktPnByb3RvY29sOworCQlpZiAocHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB0Y3Bjcywgd3JiLCAxKTsKKwkJZWxzZSBpZiAocHJvdG8gPT0gSVBQUk9UT19VRFApCisJCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB1ZHBjcywgd3JiLCAxKTsKKwl9CisJaWYgKHBub2ItPnZsYW5fZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB2bGFuLCB3cmIsIDEpOworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB2bGFuX3RhZywgd3JiLCB2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JiX2NvcHlfZXh0cmEoc3RydWN0IEVUSF9XUkJfQU1BUCAqdG8sCisJCQkJICBzdHJ1Y3QgRVRIX1dSQl9BTUFQICpmcm9tKQoreworCisJdG8tPmR3WzJdID0gZnJvbS0+ZHdbMl07CisJdG8tPmR3WzNdID0gZnJvbS0+ZHdbM107Cit9CisKKy8qIFJldHVybnMgdGhlIGFjdHVhbCBjb3VudCBvZiB3cmJzIHVzZWQgaW5jbHVkaW5nIGEgcG9zc2libGUgZHVtbXkgKi8KK3N0YXRpYyBpbnQgY29weV9za2JfdG9fdHhxKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgdTMyIHdyYl9jbnQsIHUzMiAqY29waWVkKQoreworCXU2NCBidXNhZGRyOworCXN0cnVjdCBFVEhfV1JCX0FNQVAgKndyYiA9IE5VTEwsICpmaXJzdCA9IE5VTEw7CisJdTMyIGk7CisJYm9vbCBkdW1teSA9IHRydWU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwbm9iLT5hZGFwdGVyLT5wZGV2OworCisJaWYgKHdyYl9jbnQgJiAxKQorCQl3cmJfY250Kys7CisJZWxzZQorCQlkdW1teSA9IGZhbHNlOworCisJYXRvbWljX2FkZCh3cmJfY250LCAmcG5vYi0+dHhfcV91c2VkKTsKKworCXdoaWxlIChza2IpIHsKKwkJaWYgKHNrYi0+bGVuID4gc2tiLT5kYXRhX2xlbikgeworCQkJaW50IGxlbiA9IHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKKwkJCWJ1c2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIGxlbiwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1c2FkZHIgPSBjcHVfdG9fbGU2NChidXNhZGRyKTsKKwkJCXdyYiA9ICZwbm9iLT50eF9xW3Bub2ItPnR4X3FfaGRdOworCQkJaWYgKGZpcnN0ID09IE5VTEwpIHsKKwkJCQl3cmJfZmlsbF9leHRyYSh3cmIsIHNrYiwgcG5vYik7CisJCQkJZmlyc3QgPSB3cmI7CisJCQl9IGVsc2UgeworCQkJCXdyYl9jb3B5X2V4dHJhKHdyYiwgZmlyc3QpOworCQkJfQorCQkJd3JiX2ZpbGwod3JiLCBidXNhZGRyLCBsZW4pOworCQkJYmVfYWR2X3R4cV9oZChwbm9iKTsKKwkJCSpjb3BpZWQgKz0gbGVuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9CisJCQkgICAgJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQlidXNhZGRyID0gcGNpX21hcF9wYWdlKHBkZXYsIGZyYWctPnBhZ2UsCisJCQkJCSAgICAgICBmcmFnLT5wYWdlX29mZnNldCwgZnJhZy0+c2l6ZSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJYnVzYWRkciA9IGNwdV90b19sZTY0KGJ1c2FkZHIpOworCQkJd3JiID0gJnBub2ItPnR4X3FbcG5vYi0+dHhfcV9oZF07CisJCQlpZiAoZmlyc3QgPT0gTlVMTCkgeworCQkJCXdyYl9maWxsX2V4dHJhKHdyYiwgc2tiLCBwbm9iKTsKKwkJCQlmaXJzdCA9IHdyYjsKKwkJCX0gZWxzZSB7CisJCQkJd3JiX2NvcHlfZXh0cmEod3JiLCBmaXJzdCk7CisJCQl9CisJCQl3cmJfZmlsbCh3cmIsIGJ1c2FkZHIsIGZyYWctPnNpemUpOworCQkJYmVfYWR2X3R4cV9oZChwbm9iKTsKKwkJCSpjb3BpZWQgKz0gZnJhZy0+c2l6ZTsKKwkJfQorCQlza2IgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwl9CisKKwlpZiAoZHVtbXkpIHsKKwkJd3JiID0gJnBub2ItPnR4X3FbcG5vYi0+dHhfcV9oZF07CisJCUJVR19PTihmaXJzdCA9PSBOVUxMKTsKKwkJd3JiX2NvcHlfZXh0cmEod3JiLCBmaXJzdCk7CisJCXdyYl9maWxsKHdyYiwgMCwgMCk7CisJCWJlX2Fkdl90eHFfaGQocG5vYik7CisJfQorCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGNvbXBsZXRlLCB3cmIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGxhc3QsIHdyYiwgMSk7CisJcmV0dXJuIHdyYl9jbnQ7Cit9CisKKy8qIEZvciBlYWNoIHNrYiB0cmFuc21pdHRlZCwgdHhfY3R4dCBzdG9yZXMgdGhlIG51bSBvZiB3cmJzIGluIHRoZQorICogc3RhcnQgaW5kZXggYW5kIHNrYiBwb2ludGVyIGluIHRoZSBlbmQgaW5kZXgKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJlX3R4X3dyYl9pbmZvX3JlbWVtYmVyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgd3JiX2NudCwKKwkJCQkJICAgdTMyIHN0YXJ0KQoreworCSoodTMyICopICgmcG5vYi0+dHhfY3R4dFtzdGFydF0pID0gd3JiX2NudDsKKwlpbmRleF9hZHYoJnN0YXJ0LCB3cmJfY250IC0gMSwgcG5vYi0+dHhfcV9sZW4pOworCXBub2ItPnR4X2N0eHRbc3RhcnRdID0gc2tiOworfQorCitzdGF0aWMgaW50IGJlbmV0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiB3cmJfY250LCBjb3BpZWQgPSAwOworCXUzMiBzdGFydCA9IHBub2ItPnR4X3FfaGQ7CisKKwlhZGFwdGVyLT5iZV9zdGF0LmJlc190eF9yZXFzKys7CisKKwl3cmJfY250ID0gd3JiX2NudF9pbl9za2Ioc2tiKTsKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnR4cV9sb2NrKTsKKwlpZiAoKHBub2ItPnR4X3FfbGVuIC0gMiAtIGF0b21pY19yZWFkKCZwbm9iLT50eF9xX3VzZWQpKSA8PSB3cmJfY250KSB7CisJCW5ldGlmX3N0b3BfcXVldWUocG5vYi0+bmV0ZGV2KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnR4cV9sb2NrKTsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfZmFpbHMrKzsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhxX2xvY2spOworCisJd3JiX2NudCA9IGNvcHlfc2tiX3RvX3R4cShwbm9iLCBza2IsIHdyYl9jbnQsICZjb3BpZWQpOworCWJlX3R4X3dyYl9pbmZvX3JlbWVtYmVyKHBub2IsIHNrYiwgd3JiX2NudCwgc3RhcnQpOworCisJYmVfc3RhcnRfdHgocG5vYiwgd3JiX2NudCk7CisKKwlhZGFwdGVyLT5ldGhfdHhfYnl0ZXMgKz0gY29waWVkOworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X3dyYnMgKz0gd3JiX2NudDsKKwl1cGRhdGVfdHhfcmF0ZShhZGFwdGVyKTsKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gY2hhbmdlIHRoZSBtdHUgb2YgdGhlIGRldmljZQorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGFuZCBlcnJubyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBiZW5ldF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCS8qCisJICogQkUgc3VwcG9ydHMganVtYm8gZnJhbWUgc2l6ZSB1cHRvIDkwMDAgYnl0ZXMgaW5jbHVkaW5nIHRoZSBsaW5rIGxheWVyCisJICogaGVhZGVyLiBDb25zaWRlcmluZyB0aGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIGZyYW1lIGZvcm1hdHMgcG9zc2libGUKKwkgKiBsaWtlIFZMQU4sIFNOQVAvTExDLCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSBmb3IgTVRVIGlzIDg5NzQgYnl0ZXMKKwkgKi8KKworCWlmIChuZXdfbXR1IDwgKEVUSF9aTEVOICsgRVRIX0ZDU19MRU4pIHx8IChuZXdfbXR1ID4gQkVfTUFYX01UVSkpIHsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiSW52YWxpZCBNVFUgcmVxdWVzdGVkLiAiCisJCQkgICAgICAgIk11c3QgYmUgYmV0d2VlbiAlZCBhbmQgJWQgYnl0ZXNcbiIsCisJCQkJICAgICAgIChFVEhfWkxFTiArIEVUSF9GQ1NfTEVOKSwgQkVfTUFYX01UVSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJNVFUgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJCQkJbmV0ZGV2LT5tdHUsIG5ld19tdHUpOworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBlbnRyeSBwb2ludCB0byByZWdpc3RlciBhIHZsYW4gd2l0aCB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGJlbmV0X3ZsYW5fcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKwlwbm9iLT52bGFuX2dycCA9IGdycDsKKwlwbm9iLT5udW1fdmxhbnMgPSAwOworCWJlX2VuYWJsZV9lcV9pbnRyKHBub2IpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IHRvIGFkZCBhIHZsYW4gdmxhbl9pZAorICogd2l0aCB0aGUgZGV2aWNlIG5ldGRldgorICovCitzdGF0aWMgdm9pZCBiZW5ldF92bGFuX2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZsYW5faWQpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKHBub2ItPm51bV92bGFucyA9PSAoQkVfTlVNX1ZMQU5fU1VQUE9SVEVEIC0gMSkpIHsKKwkJLyogbm8gIHdheSB0byByZXR1cm4gYW4gZXJyb3IgKi8KKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LAorCQkgICAgICAgIkJsYWRlRW5naW5lOiBDYW5ub3QgY29uZmlndXJlIG1vcmUgdGhhbiAlZCBWbGFuc1xuIiwKKwkJCSAgICAgICBCRV9OVU1fVkxBTl9TVVBQT1JURUQpOworCQlyZXR1cm47CisJfQorCS8qIFRoZSBuZXcgdmxhbiB0YWcgd2lsbCBiZSBpbiB0aGUgc2xvdCBpbmRpY2F0ZWQgYnkgbnVtX3ZsYW5zLiAqLworCXBub2ItPnZsYW5fdGFnW3Bub2ItPm51bV92bGFucysrXSA9IHZsYW5faWQ7CisJYmVfcnhmX3ZsYW5fY29uZmlnKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBwbm9iLT5udW1fdmxhbnMsCisJCQkgICBwbm9iLT52bGFuX3RhZywgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gcmVtb3ZlIGEgdmxhbiB2bGFuX2lkCisgKiB3aXRoIHRoZSBkZXZpY2UgbmV0ZGV2CisgKi8KK3N0YXRpYyB2b2lkIGJlbmV0X3ZsYW5fcmVtX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmxhbl9pZCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwl1MzIgaSwgdmFsdWU7CisKKwkvKgorCSAqIEluIEJsYWRlIEVuZ2luZSwgd2Ugc3VwcG9ydCAzMiB2bGFuIHRhZyBmaWx0ZXJzIGFjcm9zcyBib3RoIHBvcnRzLgorCSAqIFRvIHByb2dyYW0gYSB2bGFuIHRhZywgdGhlIFJYRl9SVFBSX0NTUiByZWdpc3RlciBpcyB1c2VkLgorCSAqIEVhY2ggMzItYml0IHZhbHVlIG9mIFJYRl9SVERSX0NTUiBjYW4gYWRkcmVzcyAyIHZsYW4gdGFnIGVudHJpZXMuCisJICogVGhlIFZsYW4gdGFibGUgaXMgb2YgZGVwdGggMTYuIHRodXMgd2Ugc3VwcG9ydCAzMiB0YWdzLgorCSAqLworCisJdmFsdWUgPSB2bGFuX2lkIHwgVkxBTl9WQUxJRF9CSVQ7CisJZm9yIChpID0gMDsgaSA8IEJFX05VTV9WTEFOX1NVUFBPUlRFRDsgaSsrKSB7CisJCWlmIChwbm9iLT52bGFuX3RhZ1tpXSA9PSB2bGFuX2lkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQkVfTlVNX1ZMQU5fU1VQUE9SVEVEKQorCQlyZXR1cm47CisJLyogTm93IGNvbXBhY3QgdGhlIHZsYW4gdGFnIGFycmF5IGJ5IHJlbW92aW5nIGhvbGUgY3JlYXRlZC4gKi8KKwl3aGlsZSAoKGkgKyAxKSA8IEJFX05VTV9WTEFOX1NVUFBPUlRFRCkgeworCQlwbm9iLT52bGFuX3RhZ1tpXSA9IHBub2ItPnZsYW5fdGFnW2kgKyAxXTsKKwkJaSsrOworCX0KKwlpZiAoKGkgKyAxKSA9PSBCRV9OVU1fVkxBTl9TVVBQT1JURUQpCisJCXBub2ItPnZsYW5fdGFnW2ldID0gKHUxNikgMHgwOworCXBub2ItPm51bV92bGFucy0tOworCWJlX3J4Zl92bGFuX2NvbmZpZygmcG5vYi0+Zm5fb2JqLCBmYWxzZSwgcG5vYi0+bnVtX3ZsYW5zLAorCQkJICAgcG5vYi0+dmxhbl90YWcsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvZ3JhbSBtdWx0aWNhc3QKKyAqIGFkZHJlc3MgaW4gdGhlIG11bHRpY2FzdCBmaWx0ZXIgb2YgdGhlIEFTSUMuCisgKi8KK3N0YXRpYyB2b2lkIGJlX3NldF9tdWx0aWNhc3RfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOworCXU4IG1hY19hZGRyWzMyXVtFVEhfQUxFTl07CisJaW50IGk7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBzZXQgQkUgaW4gTXVsdGljYXN0IHByb21pc2N1b3VzICovCisJCWJlX3J4Zl9tdWx0aWNhc3RfY29uZmlnKCZwbm9iLT5mbl9vYmosIHRydWUsIDAsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwpOworCQlyZXR1cm47CisJfQorCisJZm9yIChtY19wdHIgPSBuZXRkZXYtPm1jX2xpc3QsIGkgPSAwOyBtY19wdHI7CisJICAgICBtY19wdHIgPSBtY19wdHItPm5leHQsIGkrKykgeworCQltZW1jcHkoJm1hY19hZGRyW2ldWzBdLCBtY19wdHItPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJfQorCisJLyogcmVzZXQgdGhlIHByb21pc2N1b3VzIG1vZGUgYWxzby4gKi8KKwliZV9yeGZfbXVsdGljYXN0X2NvbmZpZygmcG5vYi0+Zm5fb2JqLCBmYWxzZSwgaSwKKwkJCQkmbWFjX2FkZHJbMF1bMF0sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IHRvIHNldCBtdWx0aWNhc3QgbGlzdAorICogd2l0aCB0aGUgZGV2aWNlIG5ldGRldi4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8KKyAqIHNldCBwcm9taXNjdW91cyBtb2RlIG9yIG11bHRpY2FzdCBwcm9taXNjdW91cyBtb2RlCisgKiBvciBtdWx0aWNhc3QgbW9kZS4uLi4KKyAqLworc3RhdGljIHZvaWQgYmVuZXRfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQliZV9yeGZfcHJvbWlzY3VvdXMoJnBub2ItPmZuX29iaiwgMSwgMSwgTlVMTCwgTlVMTCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJYmVfcnhmX3Byb21pc2N1b3VzKCZwbm9iLT5mbl9vYmosIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCQliZV9zZXRfbXVsdGljYXN0X2ZpbHRlcihuZXRkZXYpOworCX0KK30KKworaW50IGJlbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCisJZXRoZXJfc2V0dXAobmV0ZGV2KTsKKworCW5ldGRldi0+b3BlbiA9ICZiZW5ldF9vcGVuOworCW5ldGRldi0+c3RvcCA9ICZiZW5ldF9jbG9zZTsKKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZiZW5ldF94bWl0OworCisJbmV0ZGV2LT5nZXRfc3RhdHMgPSAmYmVuZXRfZ2V0X3N0YXRzOworCisJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmYmVuZXRfc2V0X211bHRpY2FzdF9saXN0OworCisJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJmJlbmV0X2NoYW5nZV9tdHU7CisJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmYmVuZXRfc2V0X21hY19hZGRyOworCisJbmV0ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gYmVuZXRfdmxhbl9yZWdpc3RlcjsKKwluZXRkZXYtPnZsYW5fcnhfYWRkX3ZpZCA9IGJlbmV0X3ZsYW5fYWRkX3ZpZDsKKwluZXRkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBiZW5ldF92bGFuX3JlbV92aWQ7CisKKwluZXRkZXYtPmZlYXR1cmVzID0KKwkgICAgTkVUSUZfRl9TRyB8IE5FVElGX0ZfSElHSERNQSB8IE5FVElGX0ZfSFdfVkxBTl9SWCB8IE5FVElGX0ZfVFNPIHwKKwkgICAgTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUiB8IE5FVElGX0ZfSVBfQ1NVTTsKKworCW5ldGRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKworCS8qIElmIGRldmljZSBpcyBEQUMgQ2FwYWJsZSwgc2V0IHRoZSBISUdIRE1BIGZsYWcgZm9yIG5ldGRldmljZS4gKi8KKwlpZiAoYWRhcHRlci0+ZG1hXzY0Yml0X2NhcCkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmYmVfZXRodG9vbF9vcHMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWExZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlbmV0LmgKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpZm5kZWYgX0JFTkVUX0hfCisjZGVmaW5lIF9CRU5FVF9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKyNpbmNsdWRlICJod2xpYi5oIgorCisjZGVmaW5lIF9TQV9NT0RVTEVfTkFNRSAibmV0LWRyaXZlciIKKworI2RlZmluZSBWTEFOX1ZBTElEX0JJVAkJMHg4MDAwCisjZGVmaW5lIEJFX05VTV9WTEFOX1NVUFBPUlRFRAkzMgorI2RlZmluZSBCRV9QT1JUX0xJTktfRE9XTiAgICAgICAwMDAwCisjZGVmaW5lIEJFX1BPUlRfTElOS19VUCAgICAgICAgIDAwMDEKKyNkZWZpbmUJQkVfTUFYX1RYX0ZSQUdfQ09VTlQJCSgzMCkKKworLyogRmxhZyBiaXRzIGZvciBzZW5kIG9wZXJhdGlvbiAqLworI2RlZmluZSBJUENTICAgICAgICAgICAgKDEgPDwgMCkJLyogRW5hYmxlIElQIGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgVURQQ1MgICAgICAgICAgICgxIDw8IDEpCS8qIEVuYWJsZSBVRFAgY2hlY2tzdW0gb2ZmbG9hZCAqLworI2RlZmluZSBUQ1BDUyAgICAgICAgICAgKDEgPDwgMikJLyogRW5hYmxlIFRDUCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIExTTyAgICAgICAgICAgICAoMSA8PCAzKQkvKiBFbmFibGUgTGFyZ2UgU2VnbWVudCAgb2ZmbG9hZCAqLworI2RlZmluZSBFVEhWTEFOICAgICAgICAgKDEgPDwgNCkJLyogRW5hYmxlIFZMQU4gaW5zZXJ0ICovCisjZGVmaW5lIEVUSEVWRU5UICAgICAgICAoMSA8PCA1KQkvKiBHZW5lcmF0ZSAgZXZlbnQgb24gY29tcGxldGlvbiAqLworI2RlZmluZSBFVEhDT01QTEVURSAgICAgKDEgPDwgNikJLyogR2VuZXJhdGUgY29tcGxldGlvbiB3aGVuIGRvbmUgKi8KKyNkZWZpbmUgSVBTRUMgICAgICAgICAgICgxIDw8IDcpCS8qIEVuYWJsZSBJUFNFQyAqLworI2RlZmluZSBGT1JXQVJEICAgICAgICAgKDEgPDwgOCkJLyogU2VuZCB0aGUgcGFja2V0IGluIGZvcndhcmRpbmcgcGF0aCAqLworI2RlZmluZSBGSU4gICAgICAgICAgICAgKDEgPDwgOSkJLyogSXNzdWUgRklOIHNlZ21lbnQgKi8KKworI2RlZmluZSBCRV9NQVhfTVRVCTg5NzQKKworI2RlZmluZSBCRV9NQVhfTFJPX0RFU0NSSVBUT1JTCQkJOAorI2RlZmluZSBCRV9MUk9fTUFYX1BLVFMJCQkJNjQKKyNkZWZpbmUgQkVfTUFYX0ZSQUdTX1BFUl9GUkFNRQkJCTYKKworZXh0ZXJuIGNvbnN0IGNoYXIgYmVfZHJ2cl92ZXJbXTsKK2V4dGVybiBjaGFyIGJlX2Z3X3ZlcltdOworZXh0ZXJuIGNoYXIgYmVfZHJpdmVyX25hbWVbXTsKKworZXh0ZXJuIHN0cnVjdCBldGh0b29sX29wcyBiZV9ldGh0b29sX29wczsKKworI2RlZmluZSBCRV9ERVZfU1RBVEVfTk9ORSAwCisjZGVmaW5lIEJFX0RFVl9TVEFURV9JTklUIDEKKyNkZWZpbmUgQkVfREVWX1NUQVRFX09QRU4gMgorI2RlZmluZSBCRV9ERVZfU1RBVEVfU1VTUEVORCAzCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgcGh5c2ljYWwgZnJhZ21lbnRzIHRvIHVzZQorICogZm9yIERNQWluZyBkYXRhIGZyb20gTklDLgorICovCitzdHJ1Y3QgYmVfcmVjdl9idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgcnhiX2xpc3Q7CS8qIGZvciBtYWludGFpbmluZyBhIGxpbmtlZCBsaXN0ICovCisJdm9pZCAqcnhiX3ZhOwkJLyogYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLworCXUzMiByeGJfcGFfbG87CQkvKiBsb3cgcGFydCBvZiBwaHlzaWNhbCBhZGRyZXNzICovCisJdTMyIHJ4Yl9wYV9oaTsJCS8qIGhpZ2ggcGFydCBvZiBwaHlzaWNhbCBhZGRyZXNzICovCisJdTMyIHJ4Yl9sZW47CQkvKiBsZW5ndGggb2YgcmVjdiBidWZmZXIgKi8KKwl2b2lkICpyeGJfY3R4dDsJCS8qIGNvbnRleHQgZm9yIE9TTSBkcml2ZXIgdG8gdXNlICovCit9OworCisvKgorICogZnJhZ21lbnQgbGlzdCB0byBkZXNjcmliZSBzY2F0dGVyZWQgZGF0YS4KKyAqLworc3RydWN0IGJlX3R4X2ZyYWdfbGlzdCB7CisJdTMyIHR4Yl9sZW47CQkvKiBTaXplIG9mIHRoaXMgZnJhZ21lbnQgKi8KKwl1MzIgdHhiX3BhX2xvOwkJLyogTG93ZXIgMzIgYml0cyBvZiA2NCBiaXQgcGh5c2ljYWwgYWRkciAqLworCXUzMiB0eGJfcGFfaGk7CQkvKiBIaWdoZXIgMzIgYml0cyBvZiA2NCBiaXQgcGh5c2ljYWwgYWRkciAqLworfTsKKworc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyB7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZG1hX2FkZHJfdCBidXM7CisJdTE2IHBhZ2Vfb2Zmc2V0OworfTsKKworLyoKKyAqICBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgbWFpbiB0cmFja2luZyBzdHJ1Y3R1cmUgZm9yIGEgTklDIGludGVyZmFjZS4KKyAqLworc3RydWN0IGJlX25ldF9vYmplY3QgeworCS8qIE1DQyBSaW5nIC0gdXNlZCB0byBzZW5kIGZ3Y21kcyB0byBlbWJlZGRlZCBBUk0gcHJvY2Vzc29yICovCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqbWNjX3E7CS8qIFZBIG9mIHRoZSBzdGFydCBvZiB0aGUgcmluZyAqLworCXUzMiBtY2NfcV9sZW47CQkJLyogIyBvZiBXUkIgZW50cmllcyBpbiB0aGlzIHJpbmcgKi8KKwl1MzIgbWNjX3Ffc2l6ZTsKKwl1MzIgbWNjX3FfaGQ7CQkJLyogTUNDIHJpbmcgaGVhZCAqLworCXU4IG1jY19xX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9tY2Nfb2JqZWN0IG1jY19xX29iajsJLyogQkVDTElCJ3MgTUNDIHJpbmcgT2JqZWN0ICovCisJZG1hX2FkZHJfdCBtY2NfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisKKwkvKiBNQ0MgQ29tcGxldGlvbiBSaW5nIC0gRlcgcmVzcG9uc2VzIHRvIGZ3Y21kcyBzZW50IGZyb20gTUNDIHJpbmcgKi8KKwlzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKm1jY19jcTsgLyogVkEgb2YgdGhlIHN0YXJ0IG9mIHRoZSByaW5nICovCisJdTMyIG1jY19jcV9sZW47CQkJLyogIyBvZiBjb21wbC4gZW50cmllcyBpbiB0aGlzIHJpbmcgKi8KKwl1MzIgbWNjX2NxX3NpemU7CisJdTMyIG1jY19jcV90bDsJCQkvKiBjb21wbC4gcmluZyB0YWlsICovCisJdTggbWNjX2NxX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9jcV9vYmplY3QgbWNjX2NxX29iajsJLyogQkVDTElCJ3MgTUNDIGNvbXBsLiByaW5nIG9iamVjdCAqLworCXUzMiBtY2NfY3FfaWQ7CQkJLyogTUNDIHJpbmcgSUQgKi8KKwlkbWFfYWRkcl90IG1jY19jcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisKKwlzdHJ1Y3QgcmluZ19kZXNjIG1iX3JkOwkJLyogUkQgZm9yIE1DQ19NQUlMX0JPWCAqLworCXZvaWQgKm1iX3B0cjsJCQkvKiBtYWlsYm94IHB0ciB0byBiZSBmcmVlZCAgKi8KKwlkbWFfYWRkcl90IG1iX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwl1MzIgbWJfc2l6ZTsKKworCS8qIEJFQ2xpYiB1c2VzIGFuIGFycmF5IG9mIGNvbnRleHQgb2JqZWN0cyB0byB0cmFjayBvdXRzdGFuZGluZworCSAqIHJlcXVlc3RzIHRvIHRoZSBNQ0MuICBXZSBuZWVkIGFsbG9jYXRlIHRoZSBzYW1lIG51bWJlciBvZgorCSAqIGNvbmV4dCBlbnRyaWVzIGFzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgTUNDIFdSQiByaW5nCisJICovCisJdTMyIG1jY193cmJfY3R4dF9zaXplOworCXZvaWQgKm1jY193cmJfY3R4dDsJCS8qIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgYXJlYSAqLworCXUzMiBtY2Nfd3JiX2N0eHRMZW47CQkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29udGV4dCAqLworCS8qCisJICogTklDIHNlbmQgcmVxdWVzdCByaW5nIC0gdXNlZCBmb3IgeG1pdHRpbmcgcmF3IGV0aGVyIGZyYW1lcy4KKwkgKi8KKwlzdHJ1Y3QgRVRIX1dSQl9BTUFQICp0eF9xOwkvKiBWQSBvZiB0aGUgc3RhcnQgb2YgdGhlIHJpbmcgKi8KKwl1MzIgdHhfcV9sZW47CQkJLyogIyBpZiBlbnRyaWVzIGluIHRoZSBzZW5kIHJpbmcgKi8KKwl1MzIgdHhfcV9zaXplOworCXUzMiB0eF9xX2hkOwkJCS8qIEhlYWQgaW5kZXguIE5leHQgcmVxLiBnb2VzIGhlcmUgKi8KKwl1MzIgdHhfcV90bDsJCQkvKiBUYWlsIGluZHguIG9sZGVzdCBvdXRzdGFuZGluZyByZXEuICovCisJdTggdHhfcV9jcmVhdGVkOwkJLyogZmxhZyB0byBoZWxwIGNsZWFudXAgKi8KKwlzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0IHR4X3Ffb2JqOy8qIEJFQ0xJQidzIHNlbmQgUSBoYW5kbGUgKi8KKwlkbWFfYWRkcl90IHR4X3FfYnVzOwkJLyogRE1BJ2JsZSBidXMgYWRkcmVzcyAqLworCXUzMiB0eF9xX2lkOwkJCS8qIHNlbmQgcXVldWUgcmluZyBJRCAqLworCXUzMiB0eF9xX3BvcnQ7CQkJLyogMCBubyBiaW5kaW5nLCAxIHBvcnQgQSwgIDIgcG9ydCBCICovCisJYXRvbWljX3QgdHhfcV91c2VkOwkJLyogIyBvZiBXUkJzIHVzZWQgKi8KKwkvKiBwdHIgdG8gYW4gYXJyYXkgaW4gd2hpY2ggd2Ugc3RvcmUgY29udGV4dCBpbmZvIGZvciBlYWNoIHNlbmQgcmVxLiAqLworCXZvaWQgKip0eF9jdHh0OworCS8qCisJICogTklDIFNlbmQgY29tcGwuIHJpbmcgLSBjb21wbGV0aW9uIHN0YXR1cyBmb3IgYWxsIE5JQyBmcmFtZXMgeG1pdHRlZC4KKwkgKi8KKwlzdHJ1Y3QgRVRIX1RYX0NPTVBMX0FNQVAgKnR4X2NxOy8qIFZBIG9mIHN0YXJ0IG9mIHRoZSByaW5nICovCisJdTMyIHR4Y3FfbGVuOwkJCS8qICMgb2YgZW50cmllcyBpbiB0aGUgcmluZyAqLworCXUzMiB0eF9jcV9zaXplOworCS8qCisJICogaW5kZXggaW50byBjb21wbCByaW5nIHdoZXJlIHRoZSBob3N0IGV4cGVjdHMgbmV4dCBjb21wbGV0aW9uIGVudHJ5CisJICovCisJdTMyIHR4X2NxX3RsOworCXUzMiB0eF9jcV9pZDsJCQkvKiBjb21wbGV0aW9uIHF1ZXVlIGlkICovCisJdTggdHhfY3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2NxX29iamVjdCB0eF9jcV9vYmo7CisJZG1hX2FkZHJfdCB0eF9jcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBFdmVudCBRdWV1ZSAtIGFsbCBjb21wbGV0aW9uIGVudHJpZXMgcG9zdCBldmVudHMgaGVyZS4KKwkgKi8KKwlzdHJ1Y3QgRVFfRU5UUllfQU1BUCAqZXZlbnRfcTsJLyogVkEgb2Ygc3RhcnQgb2YgZXZlbnQgcXVldWUgKi8KKwl1MzIgZXZlbnRfcV9sZW47CQkvKiAjIG9mIGVudHJpZXMgKi8KKwl1MzIgZXZlbnRfcV9zaXplOworCXUzMiBldmVudF9xX3RsOwkJCS8qIFRhaWwgb2YgdGhlIGV2ZW50IHF1ZXVlICovCisJdTMyIGV2ZW50X3FfaWQ7CQkJLyogRXZlbnQgcXVldWUgSUQgKi8KKwl1OCBldmVudF9xX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9lcV9vYmplY3QgZXZlbnRfcV9vYmo7IC8qIFF1ZXVlIGhhbmRsZSAqLworCWRtYV9hZGRyX3QgZXZlbnRfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBOSUMgcmVjZWl2ZSBxdWV1ZSAtIERhdGEgYnVmZmVycyB0byBiZSB1c2VkIGZvciByZWNlaXZpbmcgdW5pY2FzdCwKKwkgKiBicm9hZGNhc3QgYW5kIG11bHRpLWNhc3QgZnJhbWVzICBhcmUgcG9zdGVkIGhlcmUuCisJICovCisJc3RydWN0IEVUSF9SWF9EX0FNQVAgKnJ4X3E7CS8qIFZBIG9mIHN0YXJ0IG9mIHRoZSBxdWV1ZSAqLworCXUzMiByeF9xX2xlbjsJCQkvKiAjIG9mIGVudHJpZXMgKi8KKwl1MzIgcnhfcV9zaXplOworCXUzMiByeF9xX2hkOwkJCS8qIEhlYWQgb2YgdGhlIHF1ZXVlICovCisJYXRvbWljX3QgcnhfcV9wb3N0ZWQ7CQkvKiBudW1iZXIgb2YgcG9zdGVkIGJ1ZmZlcnMgKi8KKwl1MzIgcnhfcV9pZDsJCQkvKiBxdWV1ZSBJRCAqLworCXU4IHJ4X3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2V0aHJxX29iamVjdCByeF9xX29iajsJLyogTklDIFJYIHF1ZXVlIGhhbmRsZSAqLworCWRtYV9hZGRyX3QgcnhfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIG9wYXF1ZSBjb250ZXh0IG9iamVjdCBmb3IgdXNlIGJ5IE9TTSBkcml2ZXIKKwkgKi8KKwl2b2lkICoqcnhfY3R4dDsKKwkvKgorCSAqIE5JQyB1bmljYXN0IFJYIGNvbXBsZXRpb24gcXVldWUgLSBhbGwgdW5pY2FzdCBldGhlciBmcmFtZSBjb21wbGV0aW9uCisJICogc3RhdHVzZXMgZnJvbSBCRSBjb21lIGhlcmUuCisJICovCisJc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpyeF9jcTsJLyogVkEgb2Ygc3RhcnQgb2YgdGhlIHF1ZXVlICovCisJdTMyIHJ4X2NxX2xlbjsJCS8qICMgb2YgZW50cmllcyAqLworCXUzMiByeF9jcV9zaXplOworCXUzMiByeF9jcV90bDsJCQkvKiBUYWlsIG9mIHRoZSBxdWV1ZSAqLworCXUzMiByeF9jcV9pZDsJCQkvKiBxdWV1ZSBJRCAqLworCXU4IHJ4X2NxX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9jcV9vYmplY3QgcnhfY3Ffb2JqOwkvKiBxdWV1ZSBoYW5kbGUgKi8KKwlkbWFfYWRkcl90IHJ4X2NxX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0IGZuX29iajsJLyogZnVuY3Rpb24gb2JqZWN0ICAgKi8KKwlib29sCWZuX29ial9jcmVhdGVkOworCXUzMiByeF9idWZfc2l6ZTsJCS8qIFNpemUgb2YgdGhlIFJYIGJ1ZmZlcnMgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyIGV0aF9yeF9idWZzWzI1Nl07CS8qIHRvIHBhc3MgUnggYnVmZmVyCisJCQkJCQkJICAgYWRkcmVzc2VzICovCisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXI7CS8qIFBvaW50ZXIgdG8gT1NNIGFkYXB0ZXIgKi8KKwl1MzIgZGV2bm87CQkvKiBPU00sIG5ldHdvcmsgZGV2IG5vLiAqLworCXUzMiB1c2VfcG9ydDsJCS8qIEN1cnJlbnQgYWN0aXZlIHBvcnQgKi8KKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CS8qIEFycmF5IG9mIFJ4IGJ1ZiBwYWdlcyAqLworCXUzMiByeF9wZ19pbmZvX2hkOwkvKiBIZWFkIG9mIHF1ZXVlICovCisJaW50IHJ4YnVmX3Bvc3RfZmFpbDsJLyogUnhCdWZmIHBvc3RpbmcgZmFpbCBjb3VudCAqLworCWJvb2wgcnhfcGdfc2hhcmVkOwkvKiBJcyBhbiBhbGxvY3N0ZWQgcGFnZSBzaGFyZWQgYXMgdHdvIGZyYWdzID8gKi8KKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncnA7CisJdTMyIG51bV92bGFuczsJCS8qIE51bWJlciBvZiB2bGFucyBpbiBCRSdzIGZpbHRlciAqLworCXUxNiB2bGFuX3RhZ1tCRV9OVU1fVkxBTl9TVVBQT1JURURdOyAvKiB2bGFucyBjdXJyZW50bHkgY29uZmlndXJlZCAqLworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworCXN0cnVjdCBuZXRfbHJvX21nciBscm9fbWdyOworCXN0cnVjdCBuZXRfbHJvX2Rlc2MgbHJvX2Rlc2NbQkVfTUFYX0xST19ERVNDUklQVE9SU107Cit9OworCisjZGVmaW5lIE5FVF9GSChucCkgICAgICAgKCYobnApLT5mbl9vYmopCisKKy8qCisgKiBCRSBkcml2ZXIgc3RhdGlzdGljcy4KKyAqLworc3RydWN0IGJlX2RydnJfc3RhdCB7CisJdTMyIGJlc190eF9yZXFzOwkvKiBudW1iZXIgb2YgVFggcmVxdWVzdHMgaW5pdGlhdGVkICovCisJdTMyIGJlc190eF9mYWlsczsJLyogbnVtYmVyIG9mIFRYIHJlcXVlc3RzIHRoYXQgZmFpbGVkICovCisJdTMyIGJlc19md2RfcmVxczsJLyogbnVtYmVyIG9mIHNlbmQgcmVxcyB0aHJvdWdoIGZvcndhcmRpbmcgaS9mICovCisJdTMyIGJlc190eF93cmJzOwkvKiBudW1iZXIgb2YgdHggV1JCcyB1c2VkICovCisKKwl1MzIgYmVzX2ludHM7CQkvKiBudW1iZXIgb2YgaW50ZXJydXB0cyAqLworCXUzMiBiZXNfcG9sbHM7CQkvKiBudW1iZXIgb2YgdGltZXMgTkFQSSBjYWxsZWQgcG9sbCBmdW5jdGlvbiAqLworCXUzMiBiZXNfZXZlbnRzOwkJLyogdG90YWwgZXZldCBlbnRyaWVzIHByb2Nlc3NlZCAqLworCXUzMiBiZXNfdHhfZXZlbnRzOwkvKiBudW1iZXIgb2YgdHggY29tcGxldGlvbiBldmVudHMgICovCisJdTMyIGJlc19yeF9ldmVudHM7CS8qIG51bWJlciBvZiB1Y2FzdCByeCBjb21wbGV0aW9uIGV2ZW50cyAgKi8KKwl1MzIgYmVzX3R4X2NvbXBsOwkvKiBudW1iZXIgb2YgdHggY29tcGxldGlvbiBlbnRyaWVzIHByb2Nlc3NlZCAqLworCXUzMiBiZXNfcnhfY29tcGw7CS8qIG51bWJlciBvZiByeCBjb21wbGV0aW9uIGVudHJpZXMKKwkJCQkgICBwcm9jZXNzZWQgKi8KKwl1MzIgYmVzX2V0aHJ4X3Bvc3RfZmFpbDsJLyogbnVtYmVyIG9mIGV0aHJ4IGJ1ZmZlciBhbGxvYworCQkJCQkgICBmYWlsdXJlcyAqLworCS8qCisJICogbnVtYmVyIG9mIG5vbiBldGhlciB0eXBlIElJIGZyYW1lcyBkcm9wcGVkIHdoZXJlCisJICogZnJhbWUgbGVuID4gbGVuZ3RoIGZpZWxkIG9mIE1hYyBIZHIKKwkgKi8KKwl1MzIgYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzOworCS8qCisJICogbnVtYmVyIG9mIG5vbiBldGhlciB0eXBlIElJIGZyYW1lcyBtYWxmb3JtZWQgd2hlcmUKKwkgKiBpbiBmcmFtZSBsZW4gPCBsZW5ndGggZmllbGQgb2YgTWFjIEhkcgorCSAqLworCXUzMiBiZXNfODAyXzNfbWFsZm9ybWVkX2ZyYW1lczsKKwl1MzIgYmVzX2lwczsJCS8qICBpbnRlcnJ1cHRzIC8gc2VjICovCisJdTMyIGJlc19wcmV2X2ludHM7CS8qIGJlc19pbnRzIGF0IGxhc3QgSVBTIGNhbGN1bGF0aW9uICAqLworCXUxNiBiZXNfZXRoX3R4X3JhdGU7CS8qICBFVEggVFggcmF0ZSAtIE1iL3NlYyAqLworCXUxNiBiZXNfZXRoX3J4X3JhdGU7CS8qICBFVEggUlggcmF0ZSAtIE1iL3NlYyAqLworCXUzMiBiZXNfcnhfY29hbDsJLyogTnVtIHBrdHMgY29hbGFzY2VkICovCisJdTMyIGJlc19yeF9mbHVzaDsJLyogTnVtIHRpbWVzIGNvYWxhc2NlZCAqLworCXUzMiBiZXNfbGlua19jaGFuZ2VfcGh5c2ljYWw7CS8qTnVtIG9mIHRpbWVzIHBoeXNpY2FsIGxpbmsgY2hhbmdlZCAqLworCXUzMiBiZXNfbGlua19jaGFuZ2VfdmlydHVhbDsJLypOdW0gb2YgdGltZXMgdmlydHVhbCBsaW5rIGNoYW5nZWQgKi8KKwl1MzIgYmVzX3J4X21pc2NfcGt0czsJLyogTWlzYyBwa3RzIHJlY2VpdmVkICovCit9OworCisvKiBNYXhpbXVtIGludGVycnVwdCBkZWxheSAoaW4gbWljcm9zZWNvbmRzKSBhbGxvd2VkICovCisjZGVmaW5lIE1BWF9FUUQJCQkJMTIwCisKKy8qCisgKiB0aW1lciB0byBwcmV2ZW50IHN5c3RlbSBzaHV0ZG93biBoYW5nIGZvciBldmVyIGlmIGgvdyBzdG9wcyByZXNwb25kaW5nCisgKi8KK3N0cnVjdCBiZV90aW1lcl9jdHh0IHsKKwlhdG9taWNfdCBnZXRfc3RhdF9mbGFnOworCXN0cnVjdCB0aW1lcl9saXN0IGdldF9zdGF0c190aW1lcjsKKwl1bnNpZ25lZCBsb25nIGdldF9zdGF0X3NlbV9hZGRyOworfSA7CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBtYWluIEJsYWRlRW5naW5lIGRyaXZlciBjb250ZXh0LiAgKi8KK3N0cnVjdCBiZV9hZGFwdGVyIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2cDsKKwlzdHJ1Y3QgYmVfZHJ2cl9zdGF0IGJlX3N0YXQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgYmVuZXRfc3RhdHM7CisKKwkvKiBQQ0kgQkFSIG1hcHBlZCBhZGRyZXNzZXMgKi8KKwl1OCBfX2lvbWVtICpjc3JfdmE7CS8qIENTUiAqLworCXU4IF9faW9tZW0gKmRiX3ZhOwkvKiBEb29yICBCZWxsICAqLworCXU4IF9faW9tZW0gKnBjaV92YTsJLyogUENJIENvbmZpZyAqLworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHN0c19oYW5kbGVyOworCXN0cnVjdCB0aW1lcl9saXN0IGNxX3RpbWVyOworCXNwaW5sb2NrX3QgaW50X2xvY2s7CS8qIHRvIHByb3RlY3QgdGhlIGlzciBmaWVsZCBpbiBhZGFwdGVyICovCisKKwlzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTICpldGhfc3RhdHNwOworCS8qCisJICogVGhpcyB3aWxsIGVuYWJsZSB0aGUgdXNlIG9mIGV0aHRvb2wgdG8gZW5hYmxlIG9yIGRpc2FibGUKKwkgKiBDaGVja3N1bSBvbiBSeCBwa3RzIHRvIGJlIG9iZXllZCBvciBkaXNvYmV5ZWQuCisJICogSWYgdGhpcyBpcyB0cnVlID0gMSwgdGhlbiB3aGF0ZXZlciBpcyB0aGUgY2hlY2tzdW0gb24gdGhlCisJICogUmVjZWl2ZWQgcGt0IGFzIHBlciBCRSwgaXQgd2lsbCBiZSBnaXZlbiB0byB0aGUgc3RhY2suCisJICogRWxzZSB0aGUgc3RhY2sgd2lsbCByZSBjYWxjdWxhdGUgaXQuCisJICovCisJYm9vbCByeF9jc3VtOworCS8qCisJICogVGhpcyB3aWxsIGVuYWJsZSB0aGUgdXNlIG9mIGV0aHRvb2wgdG8gZW5hYmxlIG9yIGRpc2FibGUKKwkgKiBDb2FsZXNlIG9uIFJ4IHBrdHMgdG8gYmUgb2JleWVkIG9yIGRpc29iZXllZC4KKwkgKiBJZiB0aGlzIGlzIGdyYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiAxNiB0aGVuIGNvYWxhc2NpbmcKKwkgKiBpcyBlbmFibGVkIGVsc2UgaXQgaXMgZGlzYWJsZWQKKwkgKi8KKwl1MzIgbWF4X3J4X2NvYWw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8qIFBvaW50ZXIgdG8gT1MncyBQQ0kgZHZpY2UgKi8KKworCXNwaW5sb2NrX3QgdHhxX2xvY2s7CS8qIHRvIHN0b3Avd2FrZSBxdWV1ZSBiYXNlZCBvbiB0eF9xX3VzZWQgKi8KKworCXUzMiBpc3I7CQkvKiBjb3B5IG9mIEludHIgc3RhdHVzIHJlZy4gKi8KKworCXUzMiBwb3J0MF9saW5rX3N0czsJLyogUG9ydCAwIGxpbmsgc3RhdHVzICovCisJdTMyIHBvcnQxX2xpbmtfc3RzOwkvKiBwb3J0IDEgbGlzdCBzdGF0dXMgKi8KKwlzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmJlX2xpbmtfc3RzOworCisJLyogcG9pbnRlciB0byB0aGUgZmlyc3QgbmV0b2JqZWN0IG9mIHRoaXMgYWRhcHRlciAqLworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpuZXRfb2JqOworCisJLyogIEZsYWdzIHRvIGluZGljYXRlIHdoYXQgdG8gY2xlYW4gdXAgKi8KKwlib29sIHRhc2tsZXRfc3RhcnRlZDsKKwlib29sIGlzcl9yZWdpc3RlcmVkOworCS8qCisJICogYWRhcHRpdmUgaW50ZXJydXB0IGNvYWxlc2NpbmcgKEFJQykgcmVsYXRlZAorCSAqLworCWJvb2wgZW5hYmxlX2FpYzsJLyogMSBpZiBBSUMgaXMgZW5hYmxlZCAqLworCXUxNiBtaW5fZXFkOwkJLyogbWluaW11bSBFUSBkZWxheSBpbiB1c2VjICovCisJdTE2IG1heF9lcWQ7CQkvKiBtaW5pbXVtIEVRIGRlbGF5IGluIHVzZWMgKi8KKwl1MTYgY3VyX2VxZDsJCS8qIGN1cnJlbnQgRVEgZGVsYXkgaW4gdXNlYyAqLworCS8qCisJICogYm9vayBrZWVwaW5nIGZvciBpbnRlcnJ1cHQgLyBzZWMgYW5kIFRYL1JYIHJhdGUgY2FsY3VsYXRpb24KKwkgKi8KKwl1bG9uZyBpcHNfamlmZmllczsJLyogamlmZmllcyBhdCBsYXN0IElQUyBjYWxjICovCisJdTMyIGV0aF90eF9ieXRlczsKKwl1bG9uZyBldGhfdHhfamlmZmllczsKKwl1MzIgZXRoX3J4X2J5dGVzOworCXVsb25nIGV0aF9yeF9qaWZmaWVzOworCisJc3RydWN0IHNlbWFwaG9yZSBnZXRfZXRoX3N0YXRfc2VtOworCisJLyogdGltZXIgY3R4dCB0byBwcmV2ZW50IHNodXRkb3duIGhhbmdpbmcgZHVlIHRvIHVuLXJlc3BvbnNpdmUgQkUgKi8KKwlzdHJ1Y3QgYmVfdGltZXJfY3R4dCB0aW1lcl9jdHh0OworCisjZGVmaW5lIEJFX01BWF9NU0lYX1ZFQ1RPUlMgICAgICAgICAgICAgMzIKKyNkZWZpbmUgQkVfTUFYX1JFUV9NU0lYX1ZFQ1RPUlMgICAgICAgICAxIC8qIG9ubHkgb25lIEVRIGluIExpbnV4IGRyaXZlciAqLworCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tCRV9NQVhfTVNJWF9WRUNUT1JTXTsKKwlib29sIG1zaXhfZW5hYmxlZDsKKwlib29sIGRtYV82NGJpdF9jYXA7CS8qIHRoZSBEZXZpY2UgREFDIGNhcGFibGUgIG9yIG5vdCAqLworCXU4IGRldl9zdGF0ZTsJLyogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRldmljZSAqLworCXU4IGRldl9wbV9zdGF0ZTsgLyogVGhlIFN0YXRlIG9mIGRldmljZSBiZWZvcmUgZ29pbmcgdG8gc3VzcGVuZCAqLworfTsKKworLyoKKyAqIEV2ZXJ5IHNlY29uZCB3ZSBsb29rIGF0IHRoZSBpbnRzL3NlYyBhbmQgYWRqdXN0IGVxX2RlbGF5CisgKiBiZXR3ZWVuIGFkYXB0ZXItPm1pbl9lcWQgYW5kIGFkYXB0ZXItPm1heF9lcWQgdG8ga2VlcCB0aGUgaW50cy9zZWMgYmV0d2VlbgorICogSVBTX0hJX1dNIGFuZCBJUFNfTE9fV00uCisgKi8KKyNkZWZpbmUgSVBTX0hJX1dNCTE4MDAwCisjZGVmaW5lIElQU19MT19XTQk4MDAwCisKKworc3RhdGljIGlubGluZSB2b2lkIGluZGV4X2Fkdih1MzIgKmluZGV4LCB1MzIgdmFsLCAgdTMyIGxpbWl0KQoreworCUJVR19PTihsaW1pdCAmIChsaW1pdC0xKSk7CisJKmluZGV4ID0gKCppbmRleCArIHZhbCkgJiAobGltaXQgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluZGV4X2luYyh1MzIgKmluZGV4LCB1MzIgbGltaXQpCit7CisJQlVHX09OKGxpbWl0ICYgKGxpbWl0LTEpKTsKKwkqaW5kZXggPSAoKmluZGV4ICsgMSkgJiAobGltaXQgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl9lcV90bChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbmRleF9pbmMoJnBub2ItPmV2ZW50X3FfdGwsIHBub2ItPmV2ZW50X3FfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl90eHFfaGQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW5kZXhfaW5jKCZwbm9iLT50eF9xX2hkLCBwbm9iLT50eF9xX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZV9hZHZfdHhxX3RsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWluZGV4X2luYygmcG5vYi0+dHhfcV90bCwgcG5vYi0+dHhfcV9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X3R4Y3FfdGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW5kZXhfaW5jKCZwbm9iLT50eF9jcV90bCwgcG5vYi0+dHhjcV9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X3J4cV9oZChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbmRleF9pbmMoJnBub2ItPnJ4X3FfaGQsIHBub2ItPnJ4X3FfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl9yeGNxX3RsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWluZGV4X2luYygmcG5vYi0+cnhfY3FfdGwsIHBub2ItPnJ4X2NxX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHR4X2NvbXBsX2xhc3R3cmJfaWR4X2dldChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlyZXR1cm4gKHBub2ItPnR4X3FfdGwgKyAqKHUzMiAqKSZwbm9iLT50eF9jdHh0W3Bub2ItPnR4X3FfdGxdIC0gMSkKKwkJICAgICYgKHBub2ItPnR4X3FfbGVuIC0gMSk7Cit9CisKK2ludCBiZW5ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOworaW50IGJlX2V0aHRvb2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICopOworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJlbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgYmVfcHJvY2Vzc19pbnRyKHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CitpcnFyZXR1cm5fdCBiZV9pbnQoaW50IGlycSwgdm9pZCAqZGV2KTsKK3ZvaWQgYmVfcG9zdF9ldGhfcnhfYnVmZnMoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX2dldF9zdGF0X2NiKHZvaWQgKiwgaW50LCBzdHJ1Y3QgTUNDX1dSQl9BTUFQICopOwordm9pZCBiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgYmVfd2FpdF9uaWNfdHhfY21wbHhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfcHJpbnRfbGlua19pbmZvKHN0cnVjdCBCRV9MSU5LX1NUQVRVUyAqKTsKK3ZvaWQgYmVfdXBkYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBiZV9hZGFwdGVyICopOwordm9pZCBiZV9pbml0X3Byb2NmcyhzdHJ1Y3QgYmVfYWRhcHRlciAqKTsKK3ZvaWQgYmVfY2xlYW51cF9wcm9jZnMoc3RydWN0IGJlX2FkYXB0ZXIgKik7CitpbnQgYmVfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKK3N0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqYmVfZ2V0X3J4X2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX25vdGlmeV9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICosIGludCwgaW50LCBpbnQpOwordm9pZCBiZV9lbmFibGVfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfZW5hYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX2Rpc2FibGVfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfZGlzYWJsZV9lcV9pbnRyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopOworaW50IGJlX3NldF91Y19tYWNfYWRyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICosIHU4LCB1OCwgdTgsCisJCSAgICB1OCAqLCBtY2Nfd3JiX2NxZV9jYWxsYmFjaywgdm9pZCAqKTsKK2ludCBiZV9nZXRfZmxvd19jdGwoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcEZuT2JqLCBib29sICosIGJvb2wgKik7Cit2b2lkIHByb2Nlc3Nfb25lX3R4X2NvbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCB1MzIgZW5kX2lkeCk7CisKKyNlbmRpZiAvKiBfQkVORVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZXN0YXR1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Jlc3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljN2E0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVzdGF0dXMuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2lmbmRlZiBfQkVTVEFUVVNfSF8KKyNkZWZpbmUgX0JFU1RBVFVTX0hfCisKKyNkZWZpbmUgQkVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMEwpCisvKgorICogTWVzc2FnZUlkOiBCRV9QRU5ESU5HCisgKiAgVGhlIEJsYWRlRW5naW5lIERyaXZlciBjYWxsIHN1Y2NlZWRlZCwgYW5kIHBlbmRlZCBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgQkVfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwNzAwMDFMKQorI2RlZmluZSBCRV9TVEFUVVNfUEVORElORyAgICAgICAgICAgICAgICAoQkVfUEVORElORykKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX05PVF9PSworICogIEFuIGVycm9yIG9jY3VycmVkLgorICovCisjZGVmaW5lIEJFX05PVF9PSyAgICAgICAgICAgICAgICAgICAgICAgICgweEUwMDcwMDAyTCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19TWVNURU1fUkVTT1VSQ0VTCisgKiAgSW5zdWZmaWNpZW50IGhvc3Qgc3lzdGVtIHJlc291cmNlcyBleGlzdCB0byBjb21wbGV0ZSB0aGUgQVBJLgorICovCisjZGVmaW5lIEJFX1NUQVRVU19TWVNURU1fUkVTT1VSQ0VTICAgICAgICgweEUwMDcwMDAzTCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19DSElQX1JFU09VUkNFUworICogIEluc3VmZmljaWVudCBjaGlwIHJlc291cmNlcyBleGlzdCB0byBjb21wbGV0ZSB0aGUgQVBJLgorICovCisjZGVmaW5lIEJFX1NUQVRVU19DSElQX1JFU09VUkNFUyAgICAgICAgICgweEUwMDcwMDA0TCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19OT19SRVNPVVJDRQorICogIEluc3VmZmljaWVudCByZXNvdXJjZXMgdG8gY29tcGxldGUgcmVxdWVzdC4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfTk9fUkVTT1VSQ0UgICAgICAgICAgICAoMHhFMDA3MDAwNUwpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfQlVTWQorICogIFJlc291cmNlIGlzIGN1cnJlbnRseSBidXN5LgorICovCisjZGVmaW5lIEJFX1NUQVRVU19CVVNZICAgICAgICAgICAgICAgICAgICgweEUwMDcwMDA2TCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUgorICogIEludmFsaWQgUGFyYW1ldGVyIGluIHJlcXVlc3QuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSICAgICAgKDB4RTAwMDAwMDdMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX05PVF9TVVBQT1JURUQKKyAqICBSZXF1ZXN0ZWQgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX05PVF9TVVBQT1JURUQgICAgICAgICAgKDB4RTAwMDAwMERMKQorCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgIEUgVCBIIEUgUiBOIEUgVCAgIFMgVCBBIFQgVSBTCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKgorICogTWVzc2FnZUlkOiBCRV9FVEhfVFhfRVJST1IKKyAqICBUaGUgRXRoZXJuZXQgZGV2aWNlIGRyaXZlciBmYWlsZWQgdG8gdHJhbnNtaXQgYSBwYWNrZXQuCisgKi8KKyNkZWZpbmUgQkVfRVRIX1RYX0VSUk9SICAgICAgICAgICAgICAgICAgKDB4RTAwNzAxMDFMKQorCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgIFMgSCBBIFIgRSBEICAgUyBUIEEgVCBVIFMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19WQkRfSU5WQUxJRF9WRVJTSU9OCisgKiAgVGhlIGRldmljZSBkcml2ZXIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgdGhlIFZCRC4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfSU5WQUxJRF9WRVJTSU9OICAgICgweEUwMDcwNDAyTCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19ET01BSU5fREVOSUVECisgKiAgVGhlIG9wZXJhdGlvbiBmYWlsZWQgdG8gY29tcGxldGUgZHVlIHRvIGluc3VmZmljaWVudCBhY2Nlc3MKKyAqICByaWdodHMgZm9yIHRoZSByZXF1ZXN0aW5nIGRvbWFpbi4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfRE9NQUlOX0RFTklFRCAgICAgICAgICAoMHhFMDA3MDQwM0wpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfVENQX05PVF9TVEFSVEVECisgKiAgVGhlIGVtYmVkZGVkIFRDUC9JUCBzdGFjayBoYXMgbm90IGJlZW4gc3RhcnRlZC4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfVENQX05PVF9TVEFSVEVEICAgICAgICAoMHhFMDA3MDQwOUwpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfTk9fTUNDX1dSQgorICogIE5vIGZyZWUgTUNDIFdSQiBhcmUgYXZhaWxhYmxlIGZvciBwb3N0aW5nIHRoZSByZXF1ZXN0LgorICovCisjZGVmaW5lIEJFX1NUQVRVU19OT19NQ0NfV1JCICAgICAgICAgICAgICAgICAoMHhFMDA3MDQxNEwpCisKKyNlbmRpZiAvKiBfQkVTVEFUVVNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvY2V2LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvY2V2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5OTY5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jZXYuaApAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Nldl9hbWFwX2hfXworI2RlZmluZSBfX2Nldl9hbWFwX2hfXworI2luY2x1ZGUgImVwLmgiCisKKy8qCisgKiBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMC4gVGhlIGZpcnN0IG9mIGZvdXIgYXBwbGljYXRpb24KKyAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzLiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHRzCisgKiBmb3IgRXZlbnQgUXVldWVzIEVRMCB0aHJvdWdoIEVRMzEuCisgKi8KK3N0cnVjdCBCRV9DRVZfSVNSMF9DU1JfQU1BUCB7CisJdTggaW50ZXJydXB0MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDIyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyNzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Mjk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDMxOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IENFVl9JU1IwX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDEuIFRoZSBzZWNvbmQgb2YgZm91ciBhcHBsaWNhdGlvbgorICogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMuIFRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGludGVycnVwdHMKKyAqIGZvciBFdmVudCBRdWV1ZXMgRVEzMiB0aHJvdWdoIEVRNjMuCisgKi8KK3N0cnVjdCBCRV9DRVZfSVNSMV9DU1JfQU1BUCB7CisJdTggaW50ZXJydXB0MzI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Mzg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzOTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0NTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0ODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDUyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDYxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NjI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2MzsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDRVZfSVNSMV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKy8qCisgKiBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMi4gVGhlIHRoaXJkIG9mIGZvdXIgYXBwbGljYXRpb24KKyAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzLiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHRzCisgKiBmb3IgRXZlbnQgUXVldWVzIEVRNjQgdGhyb3VnaCBFUTk1LgorICovCitzdHJ1Y3QgQkVfQ0VWX0lTUjJfQ1NSX0FNQVAgeworCXU4IGludGVycnVwdDY0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NjU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDY3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Njg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDcwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDczOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3NTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Nzc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3ODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDgyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDkxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5MzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDk0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTU7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQ0VWX0lTUjJfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMy4gVGhlIGZvdXJ0aCBvZiBmb3VyIGFwcGxpY2F0aW9uCisgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycy4gVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgaW50ZXJydXB0cworICogZm9yIEV2ZW50IFF1ZXVlcyBFUTk2IHRocm91Z2ggRVExMjcuCisgKi8KK3N0cnVjdCBCRV9DRVZfSVNSM19DU1JfQU1BUCB7CisJdTggaW50ZXJydXB0OTY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDk4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMjc7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQ0VWX0lTUjNfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qICBDb21wbGV0aW9ucyBhbmQgRXZlbnRzIGJsb2NrIFJlZ2lzdGVycy4gICovCitzdHJ1Y3QgQkVfQ0VWX0NTUk1BUF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVszMl07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMlszMl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkM1szMl07CS8qIERXT1JEIDMgKi8KKwlzdHJ1Y3QgQkVfQ0VWX0lTUjBfQ1NSX0FNQVAgaXNyMDsKKwlzdHJ1Y3QgQkVfQ0VWX0lTUjFfQ1NSX0FNQVAgaXNyMTsKKwlzdHJ1Y3QgQkVfQ0VWX0lTUjJfQ1NSX0FNQVAgaXNyMjsKKwlzdHJ1Y3QgQkVfQ0VWX0lTUjNfQ1NSX0FNQVAgaXNyMzsKKwl1OCByc3ZkNFszMl07CS8qIERXT1JEIDggKi8KKwl1OCByc3ZkNVszMl07CS8qIERXT1JEIDkgKi8KKwl1OCByc3ZkNlszMl07CS8qIERXT1JEIDEwICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAxMSAqLworCXU4IHJzdmQ4WzMyXTsJLyogRFdPUkQgMTIgKi8KKwl1OCByc3ZkOVszMl07CS8qIERXT1JEIDEzICovCisJdTggcnN2ZDEwWzMyXTsJLyogRFdPUkQgMTQgKi8KKwl1OCByc3ZkMTFbMzJdOwkvKiBEV09SRCAxNSAqLworCXU4IHJzdmQxMlszMl07CS8qIERXT1JEIDE2ICovCisJdTggcnN2ZDEzWzMyXTsJLyogRFdPUkQgMTcgKi8KKwl1OCByc3ZkMTRbMzJdOwkvKiBEV09SRCAxOCAqLworCXU4IHJzdmQxNVszMl07CS8qIERXT1JEIDE5ICovCisJdTggcnN2ZDE2WzMyXTsJLyogRFdPUkQgMjAgKi8KKwl1OCByc3ZkMTdbMzJdOwkvKiBEV09SRCAyMSAqLworCXU4IHJzdmQxOFszMl07CS8qIERXT1JEIDIyICovCisJdTggcnN2ZDE5WzMyXTsJLyogRFdPUkQgMjMgKi8KKwl1OCByc3ZkMjBbMzJdOwkvKiBEV09SRCAyNCAqLworCXU4IHJzdmQyMVszMl07CS8qIERXT1JEIDI1ICovCisJdTggcnN2ZDIyWzMyXTsJLyogRFdPUkQgMjYgKi8KKwl1OCByc3ZkMjNbMzJdOwkvKiBEV09SRCAyNyAqLworCXU4IHJzdmQyNFszMl07CS8qIERXT1JEIDI4ICovCisJdTggcnN2ZDI1WzMyXTsJLyogRFdPUkQgMjkgKi8KKwl1OCByc3ZkMjZbMzJdOwkvKiBEV09SRCAzMCAqLworCXU4IHJzdmQyN1szMl07CS8qIERXT1JEIDMxICovCisJdTggcnN2ZDI4WzMyXTsJLyogRFdPUkQgMzIgKi8KKwl1OCByc3ZkMjlbMzJdOwkvKiBEV09SRCAzMyAqLworCXU4IHJzdmQzMFsxOTJdOwkvKiBEV09SRCAzNCAqLworCXU4IHJzdmQzMVsxOTJdOwkvKiBEV09SRCA0MCAqLworCXU4IHJzdmQzMlsxNjBdOwkvKiBEV09SRCA0NiAqLworCXU4IHJzdmQzM1sxNjBdOwkvKiBEV09SRCA1MSAqLworCXU4IHJzdmQzNFsxNjBdOwkvKiBEV09SRCA1NiAqLworCXU4IHJzdmQzNVs5Nl07CS8qIERXT1JEIDYxICovCisJdTggcnN2ZDM2WzE5Ml1bMzJdOwkvKiBEV09SRCA2NCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDRVZfQ1NSTUFQX0FNQVAgeworCXUzMiBkd1syNTZdOworfTsKKworI2VuZGlmIC8qIF9fY2V2X2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvY3EuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDQ1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvY3EuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgImh3bGliLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKworLyoKKyAqIENvbXBsZXRpb24gUXVldWUgT2JqZWN0cworICovCisvKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAgICAgIFAgVSBCIEwgSSBDICBSIE8gVSBUIEkgTiBFIFMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgICAgVGhpcyByb3V0aW5lIGNyZWF0ZXMgYSBjb21wbGV0aW9uIHF1ZXVlIGJhc2VkIG9uIHRoZSBjbGllbnQgY29tcGxldGlvbgorICAgIHF1ZXVlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKKworICAgIEZ1bmN0aW9uT2JqZWN0ICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKyAgICBDcUJhc2VWYSAgICAgICAgICAgIC0gQmFzZSBWQSBmb3IgYSB0aGUgQ1EgcmluZworICAgIE51bUVudHJpZXMgICAgICAgICAgLSBDRVZfQ1FfQ05UXyogdmFsdWVzCisgICAgc29sRXZlbnRFbmFibGUgICAgICAtIDAgPSBBbGwgQ1FFcyBjYW4gZ2VuZXJhdGUgRXZlbnRzIGlmIENRIGlzIGV2ZW50YWJsZQorCQkJMSA9IG9ubHkgQ1FFcyB3aXRoIHNvbGljaXRlZCBiaXQgc2V0IGFyZSBldmVudGFibGUKKyAgICBldmVudGFibGUgICAgICAgICAgIC0gRXZlbnRhYmxlIENRLCBnZW5lcmF0ZXMgaW50ZXJydXB0cy4KKyAgICBub2RlbGF5ICAgICAgICAgICAgIC0gMSA9IEZvcmNlIGludGVycnVwdCwgcmVsZXZlbnQgaWYgQ1EgZXZlbnRhYmxlLgorCQkJSW50ZXJydXB0IGlzIGFzc2VydGVkIGltbWVkaWF0ZWx5IGFmdGVyIEVRRQorCQkJd3JpdGUgaXMgY29uZmlybWVkLCByZWdhcmRsZXNzIG9mIEVRIFRpbWVyCisJCQlvciB3YXRlcm1hcmsgc2V0dGluZ3MuCisgICAgd21lICAgICAgICAgICAgICAgICAtIEVuYWJsZSB3YXRlcm1hcmsgYmFzZWQgY29hbGVzY2luZworICAgIHdtVGhyZXNoICAgICAgICAgICAgLSBIaWdoIHdhdGVybWFyayhDUSBmdWxsbmVzcyBhdCB3aGljaCBldmVudAorCQkJb3IgaW50ZXJydXB0IHNob3VsZCBiZSBhc3NlcnRlZCkuICBUaGVzZSBhcmUgdGhlCisJCQlDRVZfV0FURVJNQVJLIGVuY29kZWQgdmFsdWVzLgorICAgIEVxT2JqZWN0ICAgICAgICAgICAgLSBFUSBIYW5kbGUgdG8gYXNzaWduIHRvIHRoaXMgQ1EKKyAgICBwcENxT2JqZWN0ICAgICAgICAgIC0gSW50ZXJuYWwgQ1EgSGFuZGxlIHJldHVybmVkLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgZXJyb3IgY29kZSBpcworCXJldHVybmVkLgorCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisKKyovCitpbnQgYmVfY3FfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGgsIGJvb2wgc29saWNpdGVkX2V2ZW50YWJsZSwKKwlib29sIG5vX2RlbGF5LCB1MzIgd21fdGhyZXNoLAorCXN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdCwgc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0KQoreworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXUzMiBudW1fZW50cmllc19lbmNvZGluZzsKKwl1MzIgbnVtX2VudHJpZXMgPSBsZW5ndGggLyBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKTsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0NRX0NSRUFURSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJdTMyIG47CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKHJkKTsKKwlBU1NFUlQoY3Ffb2JqZWN0KTsKKwlBU1NFUlQobGVuZ3RoICUgc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCkgPT0gMCk7CisKKwlzd2l0Y2ggKG51bV9lbnRyaWVzKSB7CisJY2FzZSAyNTY6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0NRX0NOVF8yNTY7CisJCWJyZWFrOworCWNhc2UgNTEyOgorCQludW1fZW50cmllc19lbmNvZGluZyA9IENFVl9DUV9DTlRfNTEyOworCQlicmVhazsKKwljYXNlIDEwMjQ6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0NRX0NOVF8xMDI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCXJldHVybiBCRV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisJfQorCisJLyoKKwkgKiBBbGwgY3EgZW50cmllcyBhbGwgdGhlIHNhbWUgc2l6ZS4gIFVzZSBpU0NTSSB2ZXJzaW9uCisJICogYXMgYSB0ZXN0IGZvciB0aGUgcHJvcGVyIHJkIGxlbmd0aC4KKwkgKi8KKwltZW1zZXQoY3Ffb2JqZWN0LCAwLCBzaXplb2YoKmNxX29iamVjdCkpOworCisJYXRvbWljX3NldCgmY3Ffb2JqZWN0LT5yZWZfY291bnQsIDApOworCWNxX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uID0gcGZvYjsKKwljcV9vYmplY3QtPmVxX29iamVjdCA9IGVxX29iamVjdDsKKwljcV9vYmplY3QtPm51bV9lbnRyaWVzID0gbnVtX2VudHJpZXM7CisJLyogc2F2ZSBmb3IgTUNDIGNxIHByb2Nlc3NpbmcgKi8KKwljcV9vYmplY3QtPnZhID0gcmQtPnZhOworCisJLyogbWFwIGludG8gVVQuICovCisJbGVuZ3RoID0gbnVtX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGNyZWF0ZSBFUS4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fQ1FfQ1JFQVRFKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fcGFnZXMgPSBQQUdFU19TUEFOTkVEKE9GRlNFVF9JTl9QQUdFKHJkLT52YSksCisJCQkJCQkJCQlsZW5ndGgpOworCisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgdmFsaWQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMSk7CisJbiA9IHBmb2ItPnBjaV9mdW5jdGlvbl9udW1iZXI7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgRnVuYywgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKworCW4gPSAoZXFfb2JqZWN0ICE9IE5VTEwpOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIEV2ZW50YWJsZSwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIEFybWVkLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDEpOworCisJbiA9IGVxX29iamVjdCA/IGVxX29iamVjdC0+ZXFfaWQgOiAwOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIEVRSUQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgQ291bnQsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG51bV9lbnRyaWVzX2VuY29kaW5nKTsKKworCW4gPSAwOyAvKiBQcm90ZWN0aW9uIERvbWFpbiBpcyBhbHdheXMgMCBpbiAgTGludXggIGRyaXZlciAqLworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIFBELCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIE5vRGVsYXksCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBub19kZWxheSk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgU29sRXZlbnQsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIHNvbGljaXRlZF9ldmVudGFibGUpOworCisJbiA9ICh3bV90aHJlc2ggIT0gMHhGRkZGRkZGRik7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgV01FLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJbiA9IChuID8gd21fdGhyZXNoIDogMCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgV2F0ZXJtYXJrLAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisJLyogQ3JlYXRlIGEgcGFnZSBsaXN0IGZvciB0aGUgRldDTUQuICovCisJYmVfcmRfdG9fcGFfbGlzdChyZCwgZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzLAorCQkJICBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcykpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJNQ0MgdG8gY3JlYXRlIENRIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUmVtZW1iZXIgdGhlIENRIGlkLiAqLworCWNxX29iamVjdC0+Y3FfaWQgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmNxX2lkOworCisJLyogaW5zZXJ0IHRoaXMgY3EgaW50byBlcV9vYmplY3QgcmVmZXJlbmNlICovCisJaWYgKGVxX29iamVjdCkgeworCQlhdG9taWNfaW5jKCZlcV9vYmplY3QtPnJlZl9jb3VudCk7CisJCWxpc3RfYWRkX3RhaWwoJmNxX29iamVjdC0+Y3FsaXN0X2Zvcl9lcSwKKwkJCQkJJmVxX29iamVjdC0+Y3FfbGlzdF9oZWFkKTsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisKKyAgICBEZWZlcmVuY2VzIHRoZSBnaXZlbiBvYmplY3QuIE9uY2UgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0bworICAgIHplcm8sIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkIGFuZCBhbGwgcmVzb3VyY2VzIHRoYXQgYXJlIGhlbGQgYnkgdGhpcyBvYmplY3QKKyAgICBhcmUgcmVsZWFzZWQuICBUaGUgb24tY2hpcCBjb250ZXh0IGlzIGFsc28gZGVzdHJveWVkIGFsb25nIHdpdGggdGhlIHF1ZXVlCisgICAgSUQsIGFuZCBhbnkgbWFwcGluZ3MgbWFkZSBpbnRvIHRoZSBVVC4KKworICAgIGNxX29iamVjdCAgICAgICAgICAgIC0gQ1EgaGFuZGxlIHJldHVybmVkIGZyb20gY3Ffb2JqZWN0X2NyZWF0ZS4KKworICAgIHJldHVybnMgdGhlIGN1cnJlbnQgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBvYmplY3QKKworICAgIElSUUw6IElSUUwgPCBESVNQQVRDSF9MRVZFTAorKi8KK2ludCBiZV9jcV9kZXN0cm95KHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCS8qIE5vdGhpbmcgc2hvdWxkIHJlZmVyZW5jZSB0aGlzIENRIGF0IHRoaXMgcG9pbnQuICovCisJQVNTRVJUKGF0b21pY19yZWFkKCZjcV9vYmplY3QtPnJlZl9jb3VudCkgPT0gMCk7CisKKwkvKiBTZW5kIGZ3Y21kIHRvIGRlc3Ryb3kgdGhlIENRLiAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShjcV9vYmplY3QtPnBhcmVudF9mdW5jdGlvbiwKKwkJICAgICBjcV9vYmplY3QtPmNxX2lkLCBGV0NNRF9SSU5HX1RZUEVfQ1EsCisJCQkJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCUFTU0VSVChzdGF0dXMgPT0gMCk7CisKKwkvKiBSZW1vdmUgcmVmZXJlbmNlIGlmIHRoaXMgaXMgYW4gZXZlbnRhYmxlIENRLiAqLworCWlmIChjcV9vYmplY3QtPmVxX29iamVjdCkgeworCQlhdG9taWNfZGVjKCZjcV9vYmplY3QtPmVxX29iamVjdC0+cmVmX2NvdW50KTsKKwkJbGlzdF9kZWwoJmNxX29iamVjdC0+Y3FsaXN0X2Zvcl9lcSk7CisJfQorCXJldHVybiBCRV9TVUNDRVNTOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZGVzY3JpcHRvcnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kZXNjcmlwdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTQzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZGVzY3JpcHRvcnMuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZGVzY3JpcHRvcnNfYW1hcF9oX18KKyNkZWZpbmUgX19kZXNjcmlwdG9yc19hbWFwX2hfXworCisvKgorICogLS0tIElQQ19OT0RFX0lEX0VOVU0gLS0tCisgKiBJUEMgcHJvY2Vzc29yIGlkIHZhbHVlcworICovCisjZGVmaW5lIFRQT1NUX05PREVfSUQgICAgICAgICAgICAgICAgICAgKDApCS8qIFRQT1NUIElEICovCisjZGVmaW5lIFRQUkVfTk9ERV9JRCAgICAgICAgICAgICAgICAgICAgKDEpCS8qIFRQUkUgSUQgKi8KKyNkZWZpbmUgVFhVTFAwX05PREVfSUQgICAgICAgICAgICAgICAgICAoMikJLyogVFhVTFAwIElEICovCisjZGVmaW5lIFRYVUxQMV9OT0RFX0lEICAgICAgICAgICAgICAgICAgKDMpCS8qIFRYVUxQMSBJRCAqLworI2RlZmluZSBUWFVMUDJfTk9ERV9JRCAgICAgICAgICAgICAgICAgICg0KQkvKiBUWFVMUDIgSUQgKi8KKyNkZWZpbmUgUlhVTFAwX05PREVfSUQgICAgICAgICAgICAgICAgICAoNSkJLyogUlhVTFAwIElEICovCisjZGVmaW5lIFJYVUxQMV9OT0RFX0lEICAgICAgICAgICAgICAgICAgKDYpCS8qIFJYVUxQMSBJRCAqLworI2RlZmluZSBSWFVMUDJfTk9ERV9JRCAgICAgICAgICAgICAgICAgICg3KQkvKiBSWFVMUDIgSUQgKi8KKyNkZWZpbmUgTVBVX05PREVfSUQgICAgICAgICAgICAgICAgICAgICAoMTUpCS8qIE1QVSBJRCAqLworCisvKgorICogLS0tIE1BQ19JRF9FTlVNIC0tLQorICogTWVhbmluZyBvZiB0aGUgbWFjX2lkIGZpZWxkIGluIHJ4cHBfZXRoX2QKKyAqLworI2RlZmluZSBQT1JUMF9IT1NUX01BQzAgICAgKDApICAvKiBQRCAwLCBQb3J0IDAsIGhvc3QgbmV0d29ya2luZywgTUFDIDAuICovCisjZGVmaW5lIFBPUlQwX0hPU1RfTUFDMSAgICAoMSkJLyogUEQgMCwgUG9ydCAwLCBob3N0IG5ldHdvcmtpbmcsIE1BQyAxLiAqLworI2RlZmluZSBQT1JUMF9TVE9SQUdFX01BQzAgKDIpCS8qIFBEIDAsIFBvcnQgMCwgaG9zdCBzdG9yYWdlLCBNQUMgMC4gKi8KKyNkZWZpbmUgUE9SVDBfU1RPUkFHRV9NQUMxICgzKQkvKiBQRCAwLCBQb3J0IDAsIGhvc3Qgc3RvcmFnZSwgTUFDIDEuICovCisjZGVmaW5lIFBPUlQxX0hPU1RfTUFDMCAgICAoNCkJLyogUEQgMCwgUG9ydCAxIGhvc3QgbmV0d29ya2luZywgTUFDIDAuICovCisjZGVmaW5lIFBPUlQxX0hPU1RfTUFDMSAgICAoNSkJLyogUEQgMCwgUG9ydCAxIGhvc3QgbmV0d29ya2luZywgTUFDIDEuICovCisjZGVmaW5lIFBPUlQxX1NUT1JBR0VfTUFDMCAoNikJLyogUEQgMCwgUG9ydCAxIGhvc3Qgc3RvcmFnZSwgTUFDIDAuICovCisjZGVmaW5lIFBPUlQxX1NUT1JBR0VfTUFDMSAoNykJLyogUEQgMCwgUG9ydCAxIGhvc3Qgc3RvcmFnZSwgTUFDIDEuICovCisjZGVmaW5lIEZJUlNUX1ZNX01BQyAgICAgICAoOCkJLyogUEQgMSBNQUMuIFByb3RlY3Rpb24gZG9tYWlucyBoYXZlIElEcyAqLworCQkJCS8qIGZyb20gMHg4LTB4MjYsIG9uZSBwZXIgUEQuICovCisjZGVmaW5lIExBU1RfVk1fTUFDICAgICAgICAoMzgpCS8qIFBEIDMxIE1BQy4gKi8KKyNkZWZpbmUgTUdNVF9NQUMgICAgICAgICAgICgzOSkJLyogTWFuYWdlbWVudCBwb3J0IE1BQy4gKi8KKyNkZWZpbmUgTUFSQkxFX01BQzAgICAgICAgICg1OSkJLyogVXNlZCBmb3IgZmx1c2hpbmcgZnVuY3Rpb24gMCByZWNlaXZlICovCisJCQkJICAvKgorCQkJCSAgICogcXVldWVzIGJlZm9yZSByZS11c2luZyBhIHRvcm4tZG93bgorCQkJCSAgICogcmVjZWl2ZSByaW5nLiB0aGUgREEgPQorCQkJCSAgICogMDAtMDAtMDAtMDAtMDAtMDAsIGFuZCB0aGUgTVNCIG9mIHRoZQorCQkJCSAgICogU0EgPSAwMAorCQkJCSAgICovCisjZGVmaW5lIE1BUkJMRV9NQUMxICAgICAgICAoNjApCS8qIFVzZWQgZm9yIGZsdXNoaW5nIGZ1bmN0aW9uIDEgcmVjZWl2ZSAqLworCQkJCSAgLyoKKwkJCQkgICAqIHF1ZXVlcyBiZWZvcmUgcmUtdXNpbmcgYSB0b3JuLWRvd24KKwkJCQkgICAqIHJlY2VpdmUgcmluZy4gdGhlIERBID0KKwkJCQkgICAqIDAwLTAwLTAwLTAwLTAwLTAwLCBhbmQgdGhlIE1TQiBvZiB0aGUKKwkJCQkgICAqIFNBICE9IDAwCisJCQkJICAgKi8KKyNkZWZpbmUgTlVMTF9NQUMgICAgICAgICAgICg2MSkJLyogUHJvbWlzY3VvdXMgbW9kZSwgaW5kaWNhdGVzIG5vIG1hdGNoICovCisjZGVmaW5lIE1DQVNUX01BQyAgICAgICAgICAoNjIpCS8qIE11bHRpY2FzdCBtYXRjaC4gKi8KKyNkZWZpbmUgQkNBU1RfTUFUQ0ggICAgICAgICg2MykJLyogQnJvYWRjYXN0IG1hdGNoLiAqLworCisjZW5kaWYgLyogX19kZXNjcmlwdG9yc19hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Rvb3JiZWxscy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Rvb3JiZWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MGNjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZG9vcmJlbGxzLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19kb29yYmVsbHNfYW1hcF9oX18KKyNkZWZpbmUgX19kb29yYmVsbHNfYW1hcF9oX18KKworLyogVGhlIFRYL1JETUEgc2VuZCBxdWV1ZSBkb29yYmVsbC4gKi8KK3N0cnVjdCBCRV9TUV9EQl9BTUFQIHsKKwl1OCBjaWRbMTFdOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzVdOwkvKiBEV09SRCAwICovCisJdTggbnVtUG9zdGVkWzE0XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFNRX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFRoZSByZWNlaXZlIHF1ZXVlIGRvb3JiZWxsLiAqLworc3RydWN0IEJFX1JRX0RCX0FNQVAgeworCXU4IHJxWzEwXTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxM107CS8qIERXT1JEIDAgKi8KKwl1OCBJbnZhbGlkYXRlOwkvKiBEV09SRCAwICovCisJdTggbnVtUG9zdGVkWzhdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFJRX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBUaGUgQ1EvRVEgZG9vcmJlbGwuIFNvZnR3YXJlIE1VU1Qgc2V0IHJlc2VydmVkIGZpZWxkcyBpbiB0aGlzCisgKiBkZXNjcmlwdG9yIHRvIHplcm8sIG90aGVyd2lzZSAoQ0VWKSBoYXJkd2FyZSB3aWxsIG5vdCBleGVjdXRlIHRoZQorICogZG9vcmJlbGwgKGZsYWdnaW5nIGEgYmFkX2RiX3FpZCBlcnJvciBpbnN0ZWFkKS4KKyAqLworc3RydWN0IEJFX0NRX0RCX0FNQVAgeworCXU4IHFpZFsxMF07CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNF07CS8qIERXT1JEIDAgKi8KKwl1OCByZWFybTsJCS8qIERXT1JEIDAgKi8KKwl1OCBldmVudDsJCS8qIERXT1JEIDAgKi8KKwl1OCBudW1fcG9wcGVkWzEzXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzNdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IENRX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKK3N0cnVjdCBCRV9UUE1fUlFfREJfQU1BUCB7CisJdTggcWlkWzEwXTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs2XTsJLyogRFdPUkQgMCAqLworCXU4IG51bVBvc3RlZFsxMV07CS8qIERXT1JEIDAgKi8KKwl1OCBtc3NfY250WzVdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFRQTV9SUV9EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogUG9zdCBXUkIgUXVldWUgRG9vcmJlbGwgUmVnaXN0ZXIgdXNlZCBieSB0aGUgaG9zdCBTdG9yYWdlIHN0YWNrCisgKiB0byBub3RpZnkgdGhlIGNvbnRyb2xsZXIgb2YgYSBwb3N0ZWQgV29yayBSZXF1ZXN0IEJsb2NrCisgKi8KK3N0cnVjdCBCRV9XUkJfUE9TVF9EQl9BTUFQIHsKKwl1OCB3cmJfY2lkWzEwXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzZdOwkvKiBEV09SRCAwICovCisJdTggd3JiX2luZGV4WzhdOwkvKiBEV09SRCAwICovCisJdTggbnVtYmVyUG9zdGVkWzhdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFdSQl9QT1NUX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBVcGRhdGUgRGVmYXVsdCBQRFUgUXVldWUgRG9vcmJlbGwgUmVnaXN0ZXIgdXNlZCB0byBjb21tdW5pY2F0ZQorICogdG8gdGhlIGNvbnRyb2xsZXIgdGhhdCB0aGUgZHJpdmVyIGhhcyBzdG9wcGVkIHByb2Nlc3NpbmcgdGhlIHF1ZXVlCisgKiBhbmQgd2hlcmUgaW4gdGhlIHF1ZXVlIGl0IHN0b3BwZWQsIHRoaXMgaXMKKyAqIGEgQ1EgRW50cnkgVHlwZS4gVXNlZCBieSBzdG9yYWdlIGRyaXZlci4KKyAqLworc3RydWN0IEJFX0RFRkFVTFRfUERVX0RCX0FNQVAgeworCXU4IHFpZFsxMF07CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNF07CS8qIERXT1JEIDAgKi8KKwl1OCByZWFybTsJCS8qIERXT1JEIDAgKi8KKwl1OCBldmVudDsJCS8qIERXT1JEIDAgKi8KKwl1OCBjcXByb2NbMTRdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgREVGQVVMVF9QRFVfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTWFuYWdlbWVudCBDb21tYW5kIGFuZCBDb250cm9sbGVyIGRlZmF1bHQgZnJhZ21lbnQgcmluZyAqLworc3RydWN0IEJFX01DQ19EQl9BTUFQIHsKKwl1OCByaWRbMTFdOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzVdOwkvKiBEV09SRCAwICovCisJdTggbnVtUG9zdGVkWzE0XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IE1DQ19EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogVXNlZCBmb3IgYm9vdHN0cmFwcGluZyB0aGUgSG9zdCBpbnRlcmZhY2UuIFRoaXMgcmVnaXN0ZXIgaXMKKyAqIHVzZWQgZm9yIGRyaXZlciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIE1QVSB3aGVuIG5vIE1DQyBSaW5ncyBleGlzdC4KKyAqIFRoZSBzb2Z0d2FyZSBtdXN0IHdyaXRlIHRoaXMgcmVnaXN0ZXIgdHdpY2UgdG8gcG9zdCBhbnkgTUNDCisgKiBjb21tYW5kLiBGaXJzdCwgaXQgd3JpdGVzIHRoZSByZWdpc3RlciB3aXRoIGhpPTEgYW5kIHRoZSB1cHBlciBiaXRzIG9mCisgKiB0aGUgIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBNQ0NfTUFJTEJPWCBzdHJ1Y3R1cmUuICBTb2Z0d2FyZSBtdXN0IHBvbGwKKyAqIHRoZSByZWFkeSBiaXQgdW50aWwgdGhpcyBpcyBhY2tub3dsZWRnZWQuICBUaGVuLCBzb3R3YXJlIHdyaXRlcyB0aGUKKyAqIHJlZ2lzdGVyIHdpdGggaGk9MCB3aXRoIHRoZSBsb3dlciBiaXRzIGluIHRoZSBhZGRyZXNzLiAgSXQgbXVzdAorICogcG9sbCB0aGUgcmVhZHkgYml0IHVudGlsIHRoZSBNQ0MgY29tbWFuZCBpcyBjb21wbGV0ZS4gIFVwb24gY29tcGxldGlvbiwKKyAqIHRoZSBNQ0NfTUFJTEJPWCB3aWxsIGNvbnRhaW4gYSB2YWxpZCBjb21wbGV0aW9uIHF1ZXVlICBlbnRyeS4KKyAqLworc3RydWN0IEJFX01QVV9NQUlMQk9YX0RCX0FNQVAgeworCXU4IHJlYWR5OwkJLyogRFdPUkQgMCAqLworCXU4IGhpOwkJLyogRFdPUkQgMCAqLworCXU4IGFkZHJlc3NbMzBdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IE1QVV9NQUlMQk9YX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiAgVGhpcyBpcyB0aGUgcHJvdGVjdGlvbiBkb21haW4gZG9vcmJlbGwgcmVnaXN0ZXIgbWFwLiBOb3RlIHRoYXQKKyAqICB3aGlsZSB0aGlzIG1hcCBzaG93cyBkb29yYmVsbHMgZm9yIGFsbCBCbGFkZSBFbmdpbmUgc3VwcG9ydGVkCisgKiAgcHJvdG9jb2xzLCBub3QgYWxsIG9mIHRoZXNlIG1heSBiZSB2YWxpZCBpbiBhIGdpdmVuIGZ1bmN0aW9uIG9yCisgKiAgcHJvdGVjdGlvbiBkb21haW4uIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgYXBwbGljYXRpb24KKyAqICBhY2Nlc3NpbmcgdGhlIGRvb3JiZWxscyB0byBrbm93IHdoaWNoIGFyZSB2YWxpZC4gRWFjaCBkb29yYmVsbAorICogIG9jY3VwaWVzIDMyIGJ5dGVzIG9mIHNwYWNlLCBidXQgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsCisgKiAgb25seSB0aGUgZmlyc3QgNCBieXRlcyBzaG91bGQgYmUgd3JpdHRlbi4gIFRoZXJlIGFyZSAzMiBpbnN0YW5jZXMKKyAqICBvZiB0aGVzZSBkb29yYmVsbHMgZm9yIHRoZSBob3N0IGFuZCAzMSB2aXJ0dWFsIG1hY2hpbmVzIHJlc3BlY3RpdmVseS4KKyAqICBUaGUgaG9zdCBhbmQgVk1zIHdpbGwgb25seSBtYXAgdGhlIGRvb3JiZWxsIHBhZ2VzIGJlbG9uZ2luZyB0byBpdHMKKyAqICBwcm90ZWN0aW9uIGRvbWFpbi4gSXQgd2lsbCBub3QgYmUgYWJsZSB0byB0b3VjaCB0aGUgZG9vcmJlbGxzIGZvcgorICogIGFub3RoZXIgVk0uIFRoZSBkb29yYmVsbHMgYXJlIHRoZSBvbmx5IHJlZ2lzdGVycyBkaXJlY3RseSBhY2Nlc3NpYmxlCisgKiAgYnkgYSB2aXJ0dWFsIG1hY2hpbmUuIFNpbWlsYXJseSwgdGhlcmUgYXJlIDUxMSBhZGRpdGlvbmFsCisgKiAgZG9vcmJlbGxzIGZvciBSRE1BIHByb3RlY3Rpb24gZG9tYWlucy4gUEQgMCBmb3IgUkRNQSBzaGFyZXMKKyAqICB0aGUgc2FtZSBwaHlzaWNhbCBwcm90ZWN0aW9uIGRvbWFpbiBkb29yYmVsbCBwYWdlIGFzIEVUSC9pU0NTSS4KKyAqCisgKi8KK3N0cnVjdCBCRV9QUk9URUNUSU9OX0RPTUFJTl9EQk1BUF9BTUFQIHsKKwl1OCByc3ZkMFs1MTJdOwkvKiBEV09SRCAwICovCisJc3RydWN0IEJFX1NRX0RCX0FNQVAgcmRtYV9zcV9kYjsKKwl1OCByc3ZkMVs3XVszMl07CS8qIERXT1JEIDE3ICovCisJc3RydWN0IEJFX1dSQl9QT1NUX0RCX0FNQVAgaXNjc2lfd3JiX3Bvc3RfZGI7CisJdTggcnN2ZDJbN11bMzJdOwkvKiBEV09SRCAyNSAqLworCXN0cnVjdCBCRV9TUV9EQl9BTUFQIGV0eF9zcV9kYjsKKwl1OCByc3ZkM1s3XVszMl07CS8qIERXT1JEIDMzICovCisJc3RydWN0IEJFX1JRX0RCX0FNQVAgcmRtYV9ycV9kYjsKKwl1OCByc3ZkNFs3XVszMl07CS8qIERXT1JEIDQxICovCisJc3RydWN0IEJFX0RFRkFVTFRfUERVX0RCX0FNQVAgaXNjc2lfZGVmYXVsdF9wZHVfZGI7CisJdTggcnN2ZDVbN11bMzJdOwkvKiBEV09SRCA0OSAqLworCXN0cnVjdCBCRV9UUE1fUlFfREJfQU1BUCB0cG1fcnFfZGI7CisJdTggcnN2ZDZbN11bMzJdOwkvKiBEV09SRCA1NyAqLworCXN0cnVjdCBCRV9SUV9EQl9BTUFQIGVyeF9ycV9kYjsKKwl1OCByc3ZkN1s3XVszMl07CS8qIERXT1JEIDY1ICovCisJc3RydWN0IEJFX0NRX0RCX0FNQVAgY3FfZGI7CisJdTggcnN2ZDhbN11bMzJdOwkvKiBEV09SRCA3MyAqLworCXN0cnVjdCBCRV9NQ0NfREJfQU1BUCBtcHVfbWNjX2RiOworCXU4IHJzdmQ5WzddWzMyXTsJLyogRFdPUkQgODEgKi8KKwlzdHJ1Y3QgQkVfTVBVX01BSUxCT1hfREJfQU1BUCBtY2NfYm9vdHN0cmFwX2RiOworCXU4IHJzdmQxMFs5MzVdWzMyXTsJLyogRFdPUkQgODkgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUFJPVEVDVElPTl9ET01BSU5fREJNQVBfQU1BUCB7CisJdTMyIGR3WzEwMjRdOworfTsKKworI2VuZGlmIC8qIF9fZG9vcmJlbGxzX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZmNmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXAuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZXBfYW1hcF9oX18KKyNkZWZpbmUgX19lcF9hbWFwX2hfXworCisvKiBHZW5lcmFsIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9FUF9DT05UUk9MX0NTUl9BTUFQIHsKKwl1OCBtMF9SeFBidWY7CS8qIERXT1JEIDAgKi8KKwl1OCBtMV9SeFBidWY7CS8qIERXT1JEIDAgKi8KKwl1OCBtMl9SeFBidWY7CS8qIERXT1JEIDAgKi8KKwl1OCBmZl9lbjsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsyN107CS8qIERXT1JEIDAgKi8KKwl1OCBDUFVfcmVzZXQ7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVBfQ09OVFJPTF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogU2VtYXBob3JlIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX0VQX1NFTUFQSE9SRV9DU1JfQU1BUCB7CisJdTggdmFsdWVbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IEVQX1NFTUFQSE9SRV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogRW1iZWRkZWQgUHJvY2Vzc29yIFNwZWNpZmljIFJlZ2lzdGVycy4gKi8KK3N0cnVjdCBCRV9FUF9DU1JNQVBfQU1BUCB7CisJc3RydWN0IEJFX0VQX0NPTlRST0xfQ1NSX0FNQVAgZXBfY29udHJvbDsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVszMl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkMlszMl07CS8qIERXT1JEIDMgKi8KKwl1OCByc3ZkM1szMl07CS8qIERXT1JEIDQgKi8KKwl1OCByc3ZkNFszMl07CS8qIERXT1JEIDUgKi8KKwl1OCByc3ZkNVs4XVsxMjhdOwkvKiBEV09SRCA2ICovCisJdTggcnN2ZDZbMzJdOwkvKiBEV09SRCAzOCAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgMzkgKi8KKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDQwICovCisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCA0MSAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDQyICovCisJc3RydWN0IEJFX0VQX1NFTUFQSE9SRV9DU1JfQU1BUCBlcF9zZW1hcGhvcmU7CisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgNDQgKi8KKwl1OCByc3ZkMTJbMTldWzMyXTsJLyogRFdPUkQgNDUgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVBfQ1NSTUFQX0FNQVAgeworCXUzMiBkd1s2NF07Cit9OworCisjZW5kaWYgLyogX19lcF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2VxLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjkyY2NkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2VxLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpbmNsdWRlICJod2xpYi5oIgorI2luY2x1ZGUgImJlc3RhdHVzLmgiCisvKgorICAgIFRoaXMgcm91dGluZSBjcmVhdGVzIGFuIGV2ZW50IHF1ZXVlIGJhc2VkIG9uIHRoZSBjbGllbnQgY29tcGxldGlvbgorICAgIHF1ZXVlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKKyAgICBGdW5jdGlvbk9iamVjdCAgICAgIC0gSGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisgICAgRXFCYXNlVmEgICAgICAgICAgICAtIEJhc2UgVkEgZm9yIGEgdGhlIEVRIHJpbmcKKyAgICBTaXplRW5jb2RpbmcgICAgICAgIC0gVGhlIGVuY29kZWQgc2l6ZSBmb3IgdGhlIEVRIGVudHJpZXMuIFRoaXMgdmFsdWUgaXMKKwkJCWVpdGhlciBDRVZfRVFfU0laRV80IG9yIENFVl9FUV9TSVpFXzE2CisgICAgTnVtRW50cmllcyAgICAgICAgICAtIENFVl9DUV9DTlRfKiB2YWx1ZXMuCisgICAgV2F0ZXJtYXJrICAgICAgICAgICAtIEVuYWJsZXMgd2F0ZXJtYXJrIGJhc2VkIGNvYWxlc2NpbmcuICBUaGlzIHBhcmFtZXRlcgorCQkJbXVzdCBiZSBvZiB0aGUgdHlwZSBDRVZfV01BUktfKiBpZiB3YXRlcm1hcmtzCisJCQlhcmUgZW5hYmxlZC4gIElmIHdhdGVybWFya3MgdG8gdG8gYmUgZGlzYWJsZWQKKwkJCXRoaXMgdmFsdWUgc2hvdWxkIGJlLTEuCisgICAgVGltZXJEZWxheSAgICAgICAgICAtIElmIGEgdGltZXIgZGVsYXkgaXMgZW5hYmxlZCB0aGlzIHZhbHVlIHNob3VsZCBiZSB0aGUKKwkJCXRpbWUgb2YgdGhlIGRlbGF5IGluIDggbWljcm9zZWNvbmQgdW5pdHMuICBJZgorCQkJZGVsYXlzIGFyZSBub3QgdXNlZCB0aGlzIHBhcmFtZXRlciBzaG91bGQgYmUKKwkJCXNldCB0byAtMS4KKyAgICBwcEVxT2JqZWN0ICAgICAgICAgIC0gSW50ZXJuYWwgRVEgSGFuZGxlIHJldHVybmVkLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGVycm9yIGNvZGUKKwlpcyByZXR1cm5lZC4KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorKi8KK2ludAorYmVfZXFfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgZXFlX3NpemUsIHUzMiBudW1fZW50cmllcywKKwkJdTMyIHdhdGVybWFyaywJLyogQ0VWX1dNQVJLXyogb3IgLTEgKi8KKwkJdTMyIHRpbWVyX2RlbGF5LAkvKiBpbiA4dXMgdW5pdHMsIG9yIC0xICovCisJCXN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdCkKK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwl1MzIgbnVtX2VudHJpZXNfZW5jb2RpbmcsIGVxZV9zaXplX2VuY29kaW5nLCBsZW5ndGg7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9FUV9DUkVBVEUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXUzMiBuOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVChyZCk7CisJQVNTRVJUKGVxX29iamVjdCk7CisKKwlzd2l0Y2ggKG51bV9lbnRyaWVzKSB7CisJY2FzZSAyNTY6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0VRX0NOVF8yNTY7CisJCWJyZWFrOworCWNhc2UgNTEyOgorCQludW1fZW50cmllc19lbmNvZGluZyA9IENFVl9FUV9DTlRfNTEyOworCQlicmVhazsKKwljYXNlIDEwMjQ6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0VRX0NOVF8xMDI0OworCQlicmVhazsKKwljYXNlIDIwNDg6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0VRX0NOVF8yMDQ4OworCQlicmVhazsKKwljYXNlIDQwOTY6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0VRX0NOVF80MDk2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCXJldHVybiBCRV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisJfQorCisJc3dpdGNoIChlcWVfc2l6ZSkgeworCWNhc2UgNDoKKwkJZXFlX3NpemVfZW5jb2RpbmcgPSBDRVZfRVFfU0laRV80OworCQlicmVhazsKKwljYXNlIDE2OgorCQllcWVfc2l6ZV9lbmNvZGluZyA9IENFVl9FUV9TSVpFXzE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCXJldHVybiBCRV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisJfQorCisJaWYgKChlcWVfc2l6ZSA9PSA0ICYmIG51bV9lbnRyaWVzIDwgMTAyNCkgfHwKKwkgICAgKGVxZV9zaXplID09IDE2ICYmIG51bV9lbnRyaWVzID09IDQwOTYpKSB7CisJCVRSQUNFKERMX0VSUiwgIkJhZCBFUSBzaXplLiBlcWVfc2l6ZTolZCBudW1fZW50cmllczolZCIsCisJCSAgICAgIGVxZV9zaXplLCBudW1fZW50cmllcyk7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwltZW1zZXQoZXFfb2JqZWN0LCAwLCBzaXplb2YoKmVxX29iamVjdCkpOworCisJYXRvbWljX3NldCgmZXFfb2JqZWN0LT5yZWZfY291bnQsIDApOworCWVxX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uID0gcGZvYjsKKwllcV9vYmplY3QtPmVxX2lkID0gMHhGRkZGRkZGRjsKKworCUlOSVRfTElTVF9IRUFEKCZlcV9vYmplY3QtPmNxX2xpc3RfaGVhZCk7CisKKwlsZW5ndGggPSBudW1fZW50cmllcyAqIGVxZV9zaXplOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJQVNTRVJUKHdyYik7CisJCVRSQUNFKERMX0VSUiwgIk5vIGZyZWUgTUNDIFdSQnMgaW4gY3JlYXRlIEVRLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9FUV9DUkVBVEUpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9wYWdlcyA9IFBBR0VTX1NQQU5ORUQoT0ZGU0VUX0lOX1BBR0UocmQtPnZhKSwKKwkJCQkJCQkJCWxlbmd0aCk7CisJbiA9IHBmb2ItPnBjaV9mdW5jdGlvbl9udW1iZXI7CisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgRnVuYywgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKworCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIHZhbGlkLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDEpOworCisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgU2l6ZSwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgZXFlX3NpemVfZW5jb2RpbmcpOworCisJbiA9IDA7IC8qIFByb3RlY3Rpb24gRG9tYWluIGlzIGFsd2F5cyAwIGluICBMaW51eCAgZHJpdmVyICovCisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgUEQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisKKwkvKiBMZXQgdGhlIGNhbGxlciBBUk0gdGhlIEVRIHdpdGggdGhlIGRvb3JiZWxsLiAqLworCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIEFybWVkLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDApOworCisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgQ291bnQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwKKwkJCQkJbnVtX2VudHJpZXNfZW5jb2RpbmcpOworCisJbiA9IHBmb2ItPnBjaV9mdW5jdGlvbl9udW1iZXIgKiAzMjsKKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBFdmVudFZlY3QsCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKwlpZiAod2F0ZXJtYXJrICE9IC0xKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFdNRSwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDEpOworCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBXYXRlcm1hcmssCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCB3YXRlcm1hcmspOworCQlBU1NFUlQod2F0ZXJtYXJrIDw9IENFVl9XTUFSS18yNDApOworCX0gZWxzZQorCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBXTUUsCisJCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMCk7CisJaWYgKHRpbWVyX2RlbGF5ICE9IC0xKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFRNUiwKKwkJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAxKTsKKworCQlBU1NFUlQodGltZXJfZGVsYXkgPD0gMjUwKTsJLyogbWF4IHZhbHVlIGFjY29yZGluZyB0byBFQVMgKi8KKwkJdGltZXJfZGVsYXkgPSBtaW4odGltZXJfZGVsYXksICh1MzIpMjUwKTsKKworCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBEZWxheSwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIHRpbWVyX2RlbGF5KTsKKwl9IGVsc2UgeworCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBUTVIsCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAwKTsKKwl9CisJLyogQ3JlYXRlIGEgcGFnZSBsaXN0IGZvciB0aGUgRldDTUQuICovCisJYmVfcmRfdG9fcGFfbGlzdChyZCwgZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzLAorCQkJICBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcykpOworCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJNQ0MgdG8gY3JlYXRlIEVRIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogR2V0IHRoZSBFUSBpZC4gIFRoZSBNUFUgYWxsb2NhdGVzIHRoZSBJRHMuICovCisJZXFfb2JqZWN0LT5lcV9pZCA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuZXFfaWQ7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgRGVmZXJlbmNlcyB0aGUgZ2l2ZW4gb2JqZWN0LiBPbmNlIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8KKyAgICB6ZXJvLCB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCBhbmQgYWxsIHJlc291cmNlcyB0aGF0IGFyZSBoZWxkIGJ5IHRoaXMKKyAgICBvYmplY3QgYXJlIHJlbGVhc2VkLiAgVGhlIG9uLWNoaXAgY29udGV4dCBpcyBhbHNvIGRlc3Ryb3llZCBhbG9uZyB3aXRoCisgICAgdGhlIHF1ZXVlIElELCBhbmQgYW55IG1hcHBpbmdzIG1hZGUgaW50byB0aGUgVVQuCisKKyAgICBlcV9vYmplY3QgICAgICAgICAgICAtIEVRIGhhbmRsZSByZXR1cm5lZCBmcm9tIGVxX29iamVjdF9jcmVhdGUuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBlcnJvciBjb2RlCisJaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKyovCitpbnQgYmVfZXFfZGVzdHJveShzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3QpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmVxX29iamVjdC0+cmVmX2NvdW50KSA9PSAwKTsKKwkvKiBubyBDUXMgc2hvdWxkIHJlZmVyZW5jZSB0aGlzIEVRIG5vdyAqLworCUFTU0VSVChsaXN0X2VtcHR5KCZlcV9vYmplY3QtPmNxX2xpc3RfaGVhZCkpOworCisJLyogU2VuZCBmd2NtZCB0byBkZXN0cm95IHRoZSBFUS4gKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3koZXFfb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24sCisJCQkgICAgIGVxX29iamVjdC0+ZXFfaWQsIEZXQ01EX1JJTkdfVFlQRV9FUSwKKwkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJQVNTRVJUKHN0YXR1cyA9PSAwKTsKKworCXJldHVybiBCRV9TVUNDRVNTOworfQorLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZXFfbW9kaWZ5X2RlbGF5CisgKiAgIENoYW5nZXMgdGhlIEVRIGRlbGF5IGZvciBhIGdyb3VwIG9mIEVRcy4KKyAqIG51bV9lcSAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgRVFzIGluIHRoZSBlcV9hcnJheSB0byBhZGp1c3QuCisgKiAJCQlUaGlzIGFsc28gaXMgdGhlIG51bWJlciBvZiBkZWxheSB2YWx1ZXMgaW4KKyAqIAkJCXRoZSBlcV9kZWxheV9hcnJheS4KKyAqIGVxX2FycmF5ICAgICAgICAgICAtIEFycmF5IG9mIHN0cnVjdCBiZV9lcV9vYmplY3QgcG9pbnRlcnMgdG8gYWRqdXN0LgorICogZXFfZGVsYXlfYXJyYXkgICAgIC0gQXJyYXkgb2YgIm51bV9lcSIgdGltZXIgZGVsYXlzIGluIHVuaXRzCisgKiAJCQlvZiBtaWNyb3NlY29uZHMuIFRoZSBiZV9lcV9xdWVyeV9kZWxheV9yYW5nZQorICogCQkJZndjbWQgcmV0dXJucyB0aGUgcmVzb2x1dGlvbiBhbmQgcmFuZ2Ugb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIGxlZ2FsIEVRIGRlbGF5cy4KKyAqIGNiICAgICAgICAgICAtCisgKiBjYl9jb250ZXh0ICAgLQorICogcV9jdHh0ICAgICAgICAgICAgIC0gT3B0aW9uYWwuIFBvaW50ZXIgdG8gYSBwcmV2aW91c2x5IGFsbG9jYXRlZAorICogCQkJc3RydWN0LiBJZiB0aGUgTUNDIFdSQiByaW5nIGlzIGZ1bGwsIHRoaXMKKyAqIAkJCXN0cnVjdHVyZSBpcyB1c2VkIHRvIHF1ZXVlIHRoZSBvcGVyYXRpb24uIEl0CisgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHBvc3RlZCB0byB0aGUgTUNDIHJpbmcgd2hlbiBzcGFjZQorICogICAgICAgICAgICAgICAgICAgICAgYmVjb21lcyBhdmFpbGFibGUuIEFsbCBxdWV1ZWQgY29tbWFuZHMgd2lsbAorICogICAgICAgICAgICAgICAgICAgICAgYmUgcG9zdGVkIHRvIHRoZSByaW5nIGluIHRoZSBvcmRlciB0aGV5IGFyZQorICogICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQuIEl0IGlzIGFsd2F5cyB2YWxpZCB0byBwYXNzIGEgcG9pbnRlciB0bworICogICAgICAgICAgICAgICAgICAgICAgYSBnZW5lcmljIGJlX2dlbmVyaWNfcV9jbnR4dC4gSG93ZXZlciwKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBzcGVjaWZpYyBjb250ZXh0IHN0cnVjdHMKKyAqICAgICAgICAgICAgICAgICAgICAgIGFyZSBnZW5lcmFsbHkgc21hbGxlciB0aGFuIHRoZSBnZW5lcmljIHN0cnVjdC4KKyAqIHJldHVybiBwZW5kX3N0YXR1cyAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuCisgKiAJCQlCRV9QRU5ESU5HIChwb3N0aXZlIHZhbHVlKSBpZiB0aGUgRldDTUQKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gaXMgcGVuZGluZy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZXFfbW9kaWZ5X2RlbGF5KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIHUzMiBudW1fZXEsIHN0cnVjdCBiZV9lcV9vYmplY3QgKiplcV9hcnJheSwKKwkJICAgdTMyICplcV9kZWxheV9hcnJheSwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgIHZvaWQgKmNiX2NvbnRleHQsIHN0cnVjdCBiZV9lcV9tb2RpZnlfZGVsYXlfcV9jdHh0ICpxX2N0eHQpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9NT0RJRllfRVFfREVMQVkgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqZ2VuX2N0eHQgPSBOVUxMOworCXUzMiBpOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCWlmIChxX2N0eHQgJiYgY2IpIHsKKwkJCXdyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICZxX2N0eHQtPndyYl9oZWFkZXI7CisJCQlnZW5fY3R4dCA9IChzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKikgcV9jdHh0OworCQkJZ2VuX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9NT0RJRllfRVFfREVMQVkpOworCisJQVNTRVJUKG51bV9lcSA+IDApOworCUFTU0VSVChudW1fZXEgPD0gQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QuZGVsYXkpKTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX2VxID0gbnVtX2VxOworCWZvciAoaSA9IDA7IGkgPCBudW1fZXE7IGkrKykgeworCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuZGVsYXlbaV0uZXFfaWQgPSBlcV9hcnJheVtpXS0+ZXFfaWQ7CisJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5kZWxheVtpXS5kZWxheV9pbl9taWNyb3NlY29uZHMgPQorCQkgICAgZXFfZGVsYXlfYXJyYXlbaV07CisJfQorCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5fY3R4dCwKKwkJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ldGguYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQxYjYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2V0aC5jCkBAIC0wLDAgKzEsMTI3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSAiaHdsaWIuaCIKKyNpbmNsdWRlICJiZXN0YXR1cy5oIgorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9ldGhfc3FfY3JlYXRlX2V4CisgKiAgIENyZWF0ZXMgYW4gZXRoZXJuZXQgc2VuZCByaW5nIC0gZXh0ZW5kZWQgdmVyc2lvbiB3aXRoCisgKiAgIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KKyAqIHBmb2IgLQorICogcmQgICAgICAgICAgICAgLSByaW5nIGFkZHJlc3MKKyAqIGxlbmd0aF9pbl9ieXRlcyAtCisgKiB0eXBlICAgICAgICAgICAgLSBUaGUgdHlwZSBvZiByaW5nIHRvIGNyZWF0ZS4KKyAqIHVscCAgICAgICAgICAgICAtIFRoZSByZXF1ZXN0ZWQgVUxQIG51bWJlciBmb3IgdGhlIHJpbmcuCisgKiAJCSAgICAgVGhpcyBzaG91bGQgYmUgemVybyBiYXNlZCwgaS5lLiAwLDEsMi4gVGhpcyBtdXN0CisgKiAJCSAgICAgYmUgdmFsaWQgTklDIFVMUCBiYXNlZCBvbiB0aGUgZmlybXdhcmUgY29uZmlnLgorICogICAgICAgICAgICAgICAgICAgQWxsIGRvb3JiZWxscyBmb3IgdGhpcyByaW5nIG11c3QgYmUgc2VudCB0bworICogICAgICAgICAgICAgICAgICAgdGhpcyBVTFAuIFRoZSBmaXJzdCBuZXR3b3JrIHJpbmcgYWxsb2NhdGVkIGZvcgorICogICAgICAgICAgICAgICAgICAgZWFjaCBVTFAgYXJlIGhpZ2hlciBwZXJmb3JtYW5jZSB0aGFuIHN1YnNlcXVlbnQgcmluZ3MuCisgKiBjcV9vYmplY3QgICAgICAgLSBjcSBvYmplY3QgZm9yIGNvbXBsZXRpb25zCisgKiBleF9wYXJhbWV0ZXJzICAgLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgKHRoYXQgbWF5IGluY3JlYXNlIGluCisgKiAJCSAgICAgZnV0dXJlIHJldmlzaW9ucykuIFRoZXNlIHBhcmFtZXRlcnMgYXJlIG9ubHkgdXNlZAorICogCQkgICAgIGZvciBjZXJ0YWluIHJpbmcgdHlwZXMgLS0gc2VlCisgKiAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmVfZXRoX3NxX3BhcmFtZXRlcnMgZm9yIGRldGFpbHMuCisgKiBldGhfc3EgICAgICAgICAgLQorICogcmV0dXJuIHN0YXR1cyAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9ldGhfc3FfY3JlYXRlX2V4KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHN0cnVjdCByaW5nX2Rlc2MgKnJkLAorCQl1MzIgbGVuZ3RoLCB1MzIgdHlwZSwgdTMyIHVscCwgc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0LAorCQlzdHJ1Y3QgYmVfZXRoX3NxX3BhcmFtZXRlcnMgKmV4X3BhcmFtZXRlcnMsCisJCXN0cnVjdCBiZV9ldGhzcV9vYmplY3QgKmV0aF9zcSkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0VUSF9UWF9DUkVBVEUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXUzMiBuOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVChyZCk7CisJQVNTRVJUKGV0aF9zcSk7CisJQVNTRVJUKGV4X3BhcmFtZXRlcnMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwltZW1zZXQoZXRoX3NxLCAwLCBzaXplb2YoKmV0aF9zcSkpOworCisJZXRoX3NxLT5wYXJlbnRfZnVuY3Rpb24gPSBwZm9iOworCWV0aF9zcS0+YmlkID0gMHhGRkZGRkZGRjsKKwlldGhfc3EtPmNxX29iamVjdCA9IGNxX29iamVjdDsKKworCS8qIFRyYW5zbGF0ZSBod2xpYiBpbnRlcmZhY2UgdG8gYXJtIGludGVyZmFjZS4gKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEJFX0VUSF9UWF9SSU5HX1RZUEVfRk9SV0FSRElORzoKKwkJdHlwZSA9IEVUSF9UWF9SSU5HX1RZUEVfRk9SV0FSRElORzsKKwkJYnJlYWs7CisJY2FzZSBCRV9FVEhfVFhfUklOR19UWVBFX1NUQU5EQVJEOgorCQl0eXBlID0gRVRIX1RYX1JJTkdfVFlQRV9TVEFOREFSRDsKKwkJYnJlYWs7CisJY2FzZSBCRV9FVEhfVFhfUklOR19UWVBFX0JPVU5EOgorCQlBU1NFUlQoZXhfcGFyYW1ldGVycy0+cG9ydCA8IDIpOworCQl0eXBlID0gRVRIX1RYX1JJTkdfVFlQRV9CT1VORDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVFJBQ0UoRExfRVJSLCAiSW52YWxpZCBldGggdHggcmluZyB0eXBlOiVkIiwgdHlwZSk7CisJCXJldHVybiBCRV9OT1RfT0s7CisJCWJyZWFrOworCX0KKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlBU1NFUlQod3JiKTsKKwkJVFJBQ0UoRExfRVJSLCAiTm8gZnJlZSBNQ0MgV1JCcyBpbiBjcmVhdGUgRVEuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBOSUMgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgY29uZmlnLiAqLworCUFTU0VSVChwZm9iLT5md19jb25maWcubmljX3VscF9tYXNrKTsKKworCS8qCisJICogVGhlIHVscCBwYXJhbWV0ZXIgbXVzdCBzZWxlY3QgYSB2YWxpZCBOSUMgVUxQCisJICogZm9yIHRoZSBjdXJyZW50IGNvbmZpZy4KKwkgKi8KKwlBU1NFUlQoKDEgPDwgdWxwKSAmIHBmb2ItPmZ3X2NvbmZpZy5uaWNfdWxwX21hc2spOworCisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9FVEhfVFhfQ1JFQVRFKTsKKwlmd2NtZC0+aGVhZGVyLnJlcXVlc3QucG9ydF9udW1iZXIgPSBleF9wYXJhbWV0ZXJzLT5wb3J0OworCisJQU1BUF9TRVRfQklUU19QVFIoRVRYX0NPTlRFWFQsIHBkX2lkLAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMCk7CisKKwluID0gYmVfcmluZ19sZW5ndGhfdG9fZW5jb2RpbmcobGVuZ3RoLCBzaXplb2Yoc3RydWN0IEVUSF9XUkJfQU1BUCkpOworCUFNQVBfU0VUX0JJVFNfUFRSKEVUWF9DT05URVhULCB0eF9yaW5nX3NpemUsCisJCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFVFhfQ09OVEVYVCwgY3FfaWRfc2VuZCwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgY3Ffb2JqZWN0LT5jcV9pZCk7CisKKwluID0gcGZvYi0+cGNpX2Z1bmN0aW9uX251bWJlcjsKKwlBTUFQX1NFVF9CSVRTX1BUUihFVFhfQ09OVEVYVCwgZnVuYywgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC50eXBlID0gdHlwZTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QudWxwX251bSAgPSAoMSA8PCB1bHApOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fcGFnZXMgPSBESVZfUk9VTkRfVVAobGVuZ3RoLCBQQUdFX1NJWkUpOworCUFTU0VSVChQQUdFU19TUEFOTkVEKHJkLT52YSwgcmQtPmxlbmd0aCkgPj0KKwkJCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3BhZ2VzKTsKKworCS8qIENyZWF0ZSBhIHBhZ2UgbGlzdCBmb3IgdGhlIEZXQ01ELiAqLworCWJlX3JkX3RvX3BhX2xpc3QocmQsIGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcywKKwkJCSAgQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMpKTsKKworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHRvIGNyZWF0ZSBldHggcXVldWUgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBzYXZlIHRoZSBidXRsZXIgSUQgKi8KKwlldGhfc3EtPmJpZCA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuY2lkOworCisJLyogYWRkIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JyZXNwb25kaW5nIENRICovCisJYXRvbWljX2luYygmY3Ffb2JqZWN0LT5yZWZfY291bnQpOworCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgICAgVGhpcyByb3V0aW5lIGRlc3Ryb3lzIGFuIGV0aGVybmV0IHNlbmQgcXVldWUKKworICAgIEV0aFNxIC0gRXRoU3EgSGFuZGxlIHJldHVybmVkIGZyb20gRXRoU3FDcmVhdGUKKworICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybiBCRV9TVUNDRVNTLgorCisgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyBtZW1vcnkgYWxsb2NhdGVkIGJ5IEV0aFNxQ3JlYXRlIGZvciB0aGUgRXRoU3EgT2JqZWN0LgorCisqLworaW50IGJlX2V0aF9zcV9kZXN0cm95KHN0cnVjdCBiZV9ldGhzcV9vYmplY3QgKmV0aF9zcSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCS8qIFNlbmQgZndjbWQgdG8gZGVzdHJveSB0aGUgcXVldWUuICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KGV0aF9zcS0+cGFyZW50X2Z1bmN0aW9uLCBldGhfc3EtPmJpZCwKKwkJICAgICBGV0NNRF9SSU5HX1RZUEVfRVRIX1RYLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlBU1NFUlQoc3RhdHVzID09IDApOworCisJLyogRGVyZWZlbmNlIGFueSBhc3NvY2lhdGVkIENRcy4gKi8KKwlhdG9taWNfZGVjKCZldGhfc3EtPmNxX29iamVjdC0+cmVmX2NvdW50KTsKKwlyZXR1cm4gc3RhdHVzOworfQorLyoKKyAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gc2V0IHRoZSB0cmFuc21pdCBmbG93IGNvbnRyb2wgcGFyYW1ldGVycy4KKworICAgIEZ1bmN0aW9uT2JqZWN0ICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKworICAgIHR4ZmNfZW5hYmxlICAgICAgICAgLSB0cmFuc21pdCBmbG93IGNvbnRyb2wgZW5hYmxlIC0gdHJ1ZSBmb3IKKwkJCSAgZW5hYmxlLCBmYWxzZSBmb3IgZGlzYWJsZQorCisgICAgcnhmY19lbmFibGUgICAgICAgICAtIHJlY2VpdmUgZmxvdyBjb250cm9sIGVuYWJsZSAtIHRydWUgZm9yCisJCQkJZW5hYmxlLCBmYWxzZSBmb3IgZGlzYWJsZQorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGVycm9yCisgICAgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKworICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIGZhaWxzIGluIG5vbi1wcml2aWxlZ2VkIG1hY2hpbmUgY29udGV4dC4KKyovCitpbnQKK2JlX2V0aF9zZXRfZmxvd19jb250cm9sKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQlib29sIHR4ZmNfZW5hYmxlLCBib29sIHJ4ZmNfZW5hYmxlKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fU0VUX0ZMT1dfQ09OVFJPTCAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fU0VUX0ZMT1dfQ09OVFJPTCk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucnhfZmxvd19jb250cm9sID0gcnhmY19lbmFibGU7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnR4X2Zsb3dfY29udHJvbCA9IHR4ZmNfZW5hYmxlOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAic2V0IGZsb3cgY29udHJvbCBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBnZXQgdGhlIHRyYW5zbWl0IGZsb3cgY29udHJvbCBwYXJhbWV0ZXJzLgorCisgICAgcGZvYiAgICAgIC0gSGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisKKyAgICB0eGZjX2VuYWJsZSAgICAgICAgIC0gdHJhbnNtaXQgZmxvdyBjb250cm9sIGVuYWJsZSAtIHRydWUgZm9yCisJCQllbmFibGUsIGZhbHNlIGZvciBkaXNhYmxlCisKKyAgICByeGZjX2VuYWJsZSAgICAgICAgIC0gcmVjZWl2ZSBmbG93IGNvbnRyb2wgZW5hYmxlIC0gdHJ1ZSBmb3IgZW5hYmxlLAorCQkJZmFsc2UgZm9yIGRpc2FibGUKKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBlcnJvciBjb2RlCisJCQlpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKworICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIGZhaWxzIGluIG5vbi1wcml2aWxlZ2VkIG1hY2hpbmUgY29udGV4dC4KKyovCitpbnQKK2JlX2V0aF9nZXRfZmxvd19jb250cm9sKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQlib29sICp0eGZjX2VuYWJsZSwgYm9vbCAqcnhmY19lbmFibGUpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRkxPV19DT05UUk9MICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9HRVRfRkxPV19DT05UUk9MKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJnZXQgZmxvdyBjb250cm9sIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqdHhmY19lbmFibGUgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLnR4X2Zsb3dfY29udHJvbDsKKwkqcnhmY19lbmFibGUgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLnJ4X2Zsb3dfY29udHJvbDsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZXRoX3NldF9xb3MKKyAqICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBldGhlcm5ldCB0cmFuc21pdCBRdWFsaXR5IG9mIFNlcnZpY2UgKFFvUykKKyAqICAgY2hhcmFjdGVyaXN0aWNzIG9mIEJsYWRlRW5naW5lIGZvciB0aGUgZG9tYWluLiBBbGwgZXRoZXJuZXQKKyAqICAgdHJhbnNtaXQgcmluZ3Mgb2YgdGhlIGRvbWFpbiB3aWxsIGV2ZW5seSBzaGFyZSB0aGUgYmFuZHdpZHRoLgorICogICBUaGUgZXhlY2VwdGlvbiB0byBzaGFyaW5nIGlzIHRoZSBob3N0IHByaW1hcnkgKHN1cGVyKSBldGhlcm5ldAorICogICB0cmFuc21pdCByaW5nIGFzIHdlbGwgYXMgdGhlIGhvc3QgZXRoZXJuZXQgZm9yd2FyZGluZyByaW5nCisgKiAgIGZvciBtaXNzZWQgb2ZmbG9hZCBkYXRhLgorICogcGZvYiAtCisgKiBtYXhfYnBzICAgICAgICAgLSB0aGUgbWF4aW11bSBiaXRzIHBlciBzZWNvbmQgaW4gdW5pdHMgb2YKKyAqIAkJCTEwIE1icHMgKHZhbGlkIDAtMTAwKQorICogbWF4X3BwcyAgICAgICAgIC0gdGhlIG1heGltdW0gcGFja2V0cyBwZXIgc2Vjb25kIGluIHVuaXRzCisgKiAJCQlvZiAxIEtwcHMgKDAgaW5kaWNhdGVzIG5vIGxpbWl0KQorICogcmV0dXJuIHN0YXR1cyAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9ldGhfc2V0X3FvcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCB1MzIgbWF4X2JwcywgdTMyIG1heF9wcHMpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfUU9TICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9TRVRfUU9TKTsKKworCS8qIFNldCBmaWVsZHMgaW4gZndjbWQgKi8KKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWF4X2JpdHNfcGVyX3NlY29uZF9OSUMgPSBtYXhfYnBzOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYXhfcGFja2V0c19wZXJfc2Vjb25kX05JQyA9IG1heF9wcHM7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnZhbGlkX2ZsYWdzID0gUU9TX0JJVFNfTklDIHwgUU9TX1BLVFNfTklDOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IDApCisJCVRSQUNFKERMX0VSUiwgIm5ldHdvcmsgc2V0IHFvcyBmd2NtZCBmYWlsZWQuIik7CisKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9ldGhfZ2V0X3FvcworICogICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgZXRoZXJuZXQgdHJhbnNtaXQgUXVhbGl0eSBvZiBTZXJ2aWNlIChRb1MpCisgKiAgIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIGRvbWFpbi4KKyAqIG1heF9icHMgICAgICAgICAtIHRoZSBtYXhpbXVtIGJpdHMgcGVyIHNlY29uZCBpbiB1bml0cyBvZgorICogCQkJMTAgTWJwcyAodmFsaWQgMC0xMDApCisgKiBtYXhfcHBzICAgICAgICAgLSB0aGUgbWF4aW11bSBwYWNrZXRzIHBlciBzZWNvbmQgaW4gdW5pdHMgb2YKKyAqIAkJCTEgS3BwcyAoMCBpbmRpY2F0ZXMgbm8gbGltaXQpCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2V0aF9nZXRfcW9zKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHUzMiAqbWF4X2JwcywgdTMyICptYXhfcHBzKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fR0VUX1FPUyAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fR0VUX1FPUyk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJuZXR3b3JrIGdldCBxb3MgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworCSptYXhfYnBzID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5tYXhfYml0c19wZXJfc2Vjb25kX05JQzsKKwkqbWF4X3BwcyA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UubWF4X3BhY2tldHNfcGVyX3NlY29uZF9OSUM7CisKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9ldGhfc2V0X2ZyYW1lX3NpemUKKyAqICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBldGhlcm5ldCBtYXhpbXVtIGZyYW1lIHNpemUuIFRoZSBwcmV2aW91cworICogICB2YWx1ZXMgYXJlIHJldHVybmVkLgorICogcGZvYiAtCisgKiB0eF9mcmFtZV9zaXplICAgLSBtYXhpbXVtIHRyYW5zbWl0IGZyYW1lIHNpemUgaW4gYnl0ZXMKKyAqIHJ4X2ZyYW1lX3NpemUgICAtIG1heGltdW0gcmVjZWl2ZSBmcmFtZSBzaXplIGluIGJ5dGVzCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2V0aF9zZXRfZnJhbWVfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICAgICB1MzIgKnR4X2ZyYW1lX3NpemUsIHUzMiAqcnhfZnJhbWVfc2l6ZSkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9GUkFNRV9TSVpFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9TRVRfRlJBTUVfU0laRSk7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1heF90eF9mcmFtZV9zaXplID0gKnR4X2ZyYW1lX3NpemU7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1heF9yeF9mcmFtZV9zaXplID0gKnJ4X2ZyYW1lX3NpemU7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAibmV0d29yayBzZXQgZnJhbWUgc2l6ZSBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJKnR4X2ZyYW1lX3NpemUgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmNoaXBfbWF4X3R4X2ZyYW1lX3NpemU7CisJKnJ4X2ZyYW1lX3NpemUgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmNoaXBfbWF4X3J4X2ZyYW1lX3NpemU7CisKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgICAgVGhpcyByb3V0aW5lIGNyZWF0ZXMgYSBFdGhlcm5ldCByZWNlaXZlIHJpbmcuCisKKyAgICBwZm9iICAgICAgLSBoYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKyAgICBycV9iYXNlX3ZhICAgICAgICAgICAgLSBiYXNlIFZBIGZvciB0aGUgZGVmYXVsdCByZWNlaXZlIHJpbmcuIHRoaXMgbXVzdCBiZQorCQkJZXhhY3RseSA4SyBpbiBsZW5ndGggYW5kIGNvbnRpbmd1b3VzIHBoeXNpY2FsIG1lbW9yeS4KKyAgICBjcV9vYmplY3QgICAgICAgICAgICAtIGhhbmRsZSB0byBhIHByZXZpb3VzbHkgY3JlYXRlZCBDUSB0byBiZSBhc3NvY2lhdGVkCisJCQl3aXRoIHRoZSBSUS4KKyAgICBwcF9ldGhfcnEgICAgICAgICAgICAgLSBwb2ludGVyIHRvIGFuIG9wcWF1ZSBoYW5kbGUgd2hlcmUgYW4gZXRoCisJCQlyZWNlaXZlIG9iamVjdCBpcyByZXR1cm5lZC4KKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsICwgb3RoZXJ3aXNlIGEgdXNlZnVsCisgICAgaW50IGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisgICAgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpvYmplY3QuCisgICAgdGhlcmUgbXVzdCBiZSBubyBtb3JlIHRoYW4gMSBvZiB0aGVzZSBwZXIgZnVuY3Rpb24gb2JqZWN0LCB1bmxlc3MgdGhlCisgICAgZnVuY3Rpb24gb2JqZWN0IHN1cHBvcnRzIFJTUyAoaXMgbmV0d29ya2luZyBhbmQgb24gdGhlIGhvc3QpLgorICAgIHRoZSBycV9iYXNlX3ZhIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgb2YgZXhhY3RseSA4Sy4KKyAgICB0aGUgZXJ4Ojpob3N0X2NxaWQgKG9yIGhvc3Rfc3Rvcl9jcWlkKSByZWdpc3RlciBhbmQgZXJ4OjpyaW5nX3BhZ2UgcmVnaXN0ZXJzCisgICAgd2lsbCBiZSB1cGRhdGVkIGFzIGFwcHJvcHJpYXRlIG9uIHJldHVybgorKi8KK2ludAorYmVfZXRoX3JxX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJc3RydWN0IHJpbmdfZGVzYyAqcmQsIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdCwKKwkJCXN0cnVjdCBiZV9jcV9vYmplY3QgKmJjbWNfY3Ffb2JqZWN0LAorCQkJc3RydWN0IGJlX2V0aHJxX29iamVjdCAqZXRoX3JxKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9FVEhfUlhfQ1JFQVRFICpmd2NtZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJLyogTVBVIHdpbGwgc2V0IHRoZSAgKi8KKwlBU1NFUlQocmQpOworCUFTU0VSVChldGhfcnEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlldGhfcnEtPnBhcmVudF9mdW5jdGlvbiA9IHBmb2I7CisJZXRoX3JxLT5jcV9vYmplY3QgPSBjcV9vYmplY3Q7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fRVRIX1JYX0NSRUFURSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3BhZ2VzID0gMjsJLyogcmVxdWlyZWQgbGVuZ3RoICovCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNxX2lkID0gY3Ffb2JqZWN0LT5jcV9pZDsKKworCWlmIChiY21jX2NxX29iamVjdCkKKwkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmJjbWNfY3FfaWQgPSBiY21jX2NxX29iamVjdC0+Y3FfaWQ7CisJZWxzZQorCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuYmNtY19jcV9pZCA9IDB4RkZGRjsKKworCS8qIENyZWF0ZSBhIHBhZ2UgbGlzdCBmb3IgdGhlIEZXQ01ELiAqLworCWJlX3JkX3RvX3BhX2xpc3QocmQsIGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcywKKwkJCSAgQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMpKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiZndjbWQgdG8gbWFwIGV0aCByeHEgZnJhZ3MgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBTYXZlIHRoZSByaW5nIElEIGZvciBjbGVhbnVwLiAqLworCWV0aF9ycS0+cmlkID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5pZDsKKworCWF0b21pY19pbmMoJmNxX29iamVjdC0+cmVmX2NvdW50KTsKKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgZGVzdHJveXMgYW4gRXRoZXJuZXQgcmVjZWl2ZSBxdWV1ZQorCisgICAgZXRoX3JxIC0gZXRoZXJuZXQgcmVjZWl2ZSBxdWV1ZSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBldGhfcnFfY3JlYXRlCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgaW50IG9uIGZhaWx1cmUuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGZyZWVzIHJlc291cmNzIGFsbG9jYXRlZCBieSBFdGhScUNyZWF0ZS4KKyAgICBUaGUgZXJ4Ojpob3N0X2NxaWQgKG9yIGhvc3Rfc3Rvcl9jcWlkKSByZWdpc3RlciBhbmQgZXJ4OjpyaW5nX3BhZ2UKKyAgICByZWdpc3RlcnMgd2lsbCBiZSB1cGRhdGVkIGFzIGFwcHJvcHJpYXRlIG9uIHJldHVybgorICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKyovCisKK3N0YXRpYyB2b2lkIGJlX2V0aF9ycV9kZXN0cm95X2ludGVybmFsX2NiKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMsCisJCQkJCSBzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIpCit7CisJc3RydWN0IGJlX2V0aHJxX29iamVjdCAqZXRoX3JxID0gKHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKikgY29udGV4dDsKKworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJEZXN0cm95IGV0aCBycSBmYWlsZWQgaW4gaW50ZXJuYWwgY2FsbGJhY2suXG4iKTsKKwl9IGVsc2UgeworCQkvKiBEZXJlZmVyZW5jZSBhbnkgQ1FzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHF1ZXVlLiAqLworCQlhdG9taWNfZGVjKCZldGhfcnEtPmNxX29iamVjdC0+cmVmX2NvdW50KTsKKwl9CisKKwlyZXR1cm47Cit9CisKK2ludCBiZV9ldGhfcnFfZGVzdHJveShzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEpCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisKKwkvKiBTZW5kIGZ3Y21kIHRvIGRlc3Ryb3kgdGhlIFJRLiAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShldGhfcnEtPnBhcmVudF9mdW5jdGlvbiwKKwkJCWV0aF9ycS0+cmlkLCBGV0NNRF9SSU5HX1RZUEVfRVRIX1JYLCBOVUxMLCBOVUxMLAorCQkJYmVfZXRoX3JxX2Rlc3Ryb3lfaW50ZXJuYWxfY2IsIGV0aF9ycSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9ldGhfcnFfZGVzdHJveV9vcHRpb25zCisgKiAgIERlc3Ryb3lzIGFuIGV0aGVybmV0IHJlY2VpdmUgcmluZyB3aXRoIGZpbmVyIGdyYW51bGFyaXR5IG9wdGlvbnMKKyAqICAgdGhhbiB0aGUgc3RhbmRhcmQgYmVfZXRoX3JxX2Rlc3Ryb3koKSBBUEkgZnVuY3Rpb24uCisgKiBldGhfcnEgICAgICAgICAgIC0KKyAqIGZsdXNoICAgICAgICAgICAgLSBTZXQgdG8gMSB0byBmbHVzaCB0aGUgcmluZywgc2V0IHRvIDAgdG8gYnlwYXNzIHRoZSBmbHVzaAorICogY2IgICAgICAgICAgICAgICAtIENhbGxiYWNrIGZ1bmN0aW9uIG9uIGNvbXBsZXRpb24KKyAqIGNiX2NvbnRleHQgICAgICAgLSBDYWxsYmFjayBjb250ZXh0CisgKiByZXR1cm4gc3RhdHVzICAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZXRoX3JxX2Rlc3Ryb3lfb3B0aW9ucyhzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEsIGJvb2wgZmx1c2gsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0KQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fUklOR19ERVNUUk9ZICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlwZm9iID0gZXRoX3JxLT5wYXJlbnRfZnVuY3Rpb247CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCVRSQUNFKERMX0lORk8sICJEZXN0cm95IGV0aF9ycSByaW5nIGlkOiVkLCBmbHVzaDolZCIsIGV0aF9ycS0+cmlkLAorCSAgICAgIGZsdXNoKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlBU1NFUlQod3JiKTsKKwkJVFJBQ0UoRExfRVJSLCAiTm8gZnJlZSBNQ0MgV1JCcyBpbiBkZXN0cm95IGV0aF9ycSByaW5nLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9SSU5HX0RFU1RST1kpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmlkID0gZXRoX3JxLT5yaWQ7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnJpbmdfdHlwZSA9IEZXQ01EX1JJTkdfVFlQRV9FVEhfUlg7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmJ5cGFzc19mbHVzaCA9ICgoMCA9PSBmbHVzaCkgPyAxIDogMCk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIGNiLCBjYl9jb250ZXh0LAorCQkJYmVfZXRoX3JxX2Rlc3Ryb3lfaW50ZXJuYWxfY2IsIGV0aF9ycSwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTICYmIHN0YXR1cyAhPSBCRV9QRU5ESU5HKSB7CisJCVRSQUNFKERMX0VSUiwgImV0aF9ycSByaW5nIGRlc3Ryb3kgZmFpbGVkLiBpZDolZCwgZmx1c2g6JWQiLAorCQkgICAgICBldGhfcnEtPnJpZCwgZmx1c2gpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgcXVlcmllcyB0aGUgZnJhZyBzaXplIGZvciBlcnguCisKKyAgICBwZm9iICAgICAgLSBoYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKworICAgIGZyYWdfc2l6ZV9ieXRlcyAgICAgICAtIGVyeCBmcmFnIHNpemUgaW4gYnl0ZXMgdGhhdCBpcy93YXMgc2V0LgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGVycm9yCisgICAgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKworKi8KK2ludAorYmVfZXRoX3JxX2dldF9mcmFnX3NpemUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgdTMyICpmcmFnX3NpemVfYnl0ZXMpCit7CisJc3RydWN0IEZXQ01EX0VUSF9HRVRfUlhfRlJBR19TSVpFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQoZnJhZ19zaXplX2J5dGVzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXJldHVybiBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIEVUSF9HRVRfUlhfRlJBR19TSVpFKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAiZ2V0IGZyYWcgc2l6ZSBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJKmZyYWdfc2l6ZV9ieXRlcyA9IDEgPDwgZndjbWQtPnBhcmFtcy5yZXNwb25zZS5hY3R1YWxfZnJhZ3NpemVfbG9nMjsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gc2V0IHRoZSBmcmFnIHNpemUgZm9yIGVyeC4gIElmIHRoZSBmcmFnIHNpemUgaXMKKyAgICBhbHJlYWR5IHNldCwgdGhlIGF0dGVtcHQgZmFpbHMgYW5kIHRoZSBjdXJyZW50IGZyYWcgc2l6ZSBpcyByZXR1cm5lZC4KKworICAgIHBmb2IgICAgICAtIEhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorCisgICAgZnJhZ19zaXplICAgICAgIC0gRXJ4IGZyYWcgc2l6ZSBpbiBieXRlcyB0aGF0IGlzL3dhcyBzZXQuCisKKyAgICBjdXJyZW50X2ZyYWdfc2l6ZV9ieXRlcyAgICAtIFBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgY3VycnJlbnQgZnJhZworCQkJCSBpcyB0byBiZSBydHVybmVkCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgZXJyb3IKKyAgICBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgZmFpbHMgaW4gbm9uLXByaXZpbGVnZWQgbWFjaGluZSBjb250ZXh0LgorKi8KK2ludAorYmVfZXRoX3JxX3NldF9mcmFnX3NpemUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCXUzMiBmcmFnX3NpemUsIHUzMiAqZnJhZ19zaXplX2J5dGVzKQoreworCXN0cnVjdCBGV0NNRF9FVEhfU0VUX1JYX0ZSQUdfU0laRSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKGZyYWdfc2l6ZV9ieXRlcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIEVUSF9TRVRfUlhfRlJBR19TSVpFKTsKKworCUFTU0VSVChmcmFnX3NpemUgPj0gMTI4ICYmIGZyYWdfc2l6ZSA8PSAxNiAqIDEwMjQpOworCisJLyogVGhpcyBpcyB0aGUgbG9nMiBvZiB0aGUgZnJhZ3NpemUuICBUaGlzIGlzIG5vdCB0aGUgZXhhY3QKKwkgKiBFUlggZW5jb2RpbmcuICovCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm5ld19mcmFnc2l6ZV9sb2cyID0gX19pbG9nMl91MzIoZnJhZ19zaXplKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAic2V0IGZyYWcgc2l6ZSBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJKmZyYWdfc2l6ZV9ieXRlcyA9IDEgPDwgZndjbWQtPnBhcmFtcy5yZXNwb25zZS5hY3R1YWxfZnJhZ3NpemVfbG9nMjsKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAgICBUaGlzIHJvdXRpbmUgZ2V0cyBvciBzZXRzIGEgbWFjIGFkZHJlc3MgZm9yIGEgZG9tYWluCisgICAgZ2l2ZW4gdGhlIHBvcnQgYW5kIG1hYy4KKworICAgIEZ1bmN0aW9uT2JqZWN0ICAtIEZ1bmN0aW9uIG9iamVjdCBoYW5kbGUuCisgICAgcG9ydDEgICAgICAgICAgIC0gU2V0IHRvIFRSVUUgaWYgdGhpcyBmdW5jdGlvbiB3aWxsIHNldC9nZXQgdGhlIFBvcnQgMQorCQkJYWRkcmVzcy4gIE9ubHkgdGhlIGhvc3QgbWF5IHNldCB0aGlzIHRvIFRSVUUuCisgICAgbWFjMSAgICAgICAgICAgIC0gU2V0IHRvIFRSVUUgaWYgdGhpcyBmdW5jdGlvbiB3aWxsIHNldC9nZXQgdGhlCisJCQlNQUMgMSBhZGRyZXNzLiAgT25seSB0aGUgaG9zdCBtYXkgc2V0IHRoaXMgdG8gVFJVRS4KKyAgICB3cml0ZSAgICAgICAgICAgLSBTZXQgdG8gVFJVRSBpZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCB3cml0ZSB0aGUgbWFjIGFkZHJlc3MuCisgICAgbWFjX2FkZHJlc3MgICAgICAtIEJ1ZmZlciBvZiB0aGUgbWFjIGFkZHJlc3MgdG8gcmVhZCBvciB3cml0ZS4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKyovCitpbnQgYmVfcnhmX21hY19hZGRyZXNzX3JlYWRfd3JpdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJYm9vbCBwb3J0MSwJLyogVk0gbXVzdCBhbHdheXMgc2V0IHRvIGZhbHNlICovCisJCWJvb2wgbWFjMSwJLyogVk0gbXVzdCBhbHdheXMgc2V0IHRvIGZhbHNlICovCisJCWJvb2wgbWdtdCwgYm9vbCB3cml0ZSwKKwkJYm9vbCBwZXJtYW5lbnQsIHU4ICptYWNfYWRkcmVzcywKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCS8qIG9wdGlvbmFsICovCisJCXZvaWQgKmNiX2NvbnRleHQpCS8qIG9wdGlvbmFsICovCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJdW5pb24geworCQlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTUFDX1FVRVJZICpxdWVyeTsKKwkJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01BQ19TRVQgKnNldDsKKwl9IGZ3Y21kID0ge05VTEx9OworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJdTMyIHR5cGUgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlBU1NFUlQobWFjX2FkZHJlc3MpOworCisJQVNTRVJUKHBvcnQxID09IGZhbHNlKTsKKwlBU1NFUlQobWFjMSA9PSBmYWxzZSk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCisJaWYgKG1nbXQpIHsKKwkJdHlwZSA9IE1BQ19BRERSRVNTX1RZUEVfTUFOQUdFTUVOVDsKKwl9IGVsc2UgeworCQlpZiAocGZvYi0+dHlwZSA9PSBCRV9GVU5DVElPTl9UWVBFX05FVFdPUkspCisJCQl0eXBlID0gTUFDX0FERFJFU1NfVFlQRV9ORVRXT1JLOworCQllbHNlCisJCQl0eXBlID0gTUFDX0FERFJFU1NfVFlQRV9TVE9SQUdFOworCX0KKworCWlmICh3cml0ZSkgeworCQkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nCisJCSAqIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuCisJCSAqLworCQlmd2NtZC5zZXQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsCisJCQkJCSAgICAgICB3cmIsIENPTU1PTl9OVFdLX01BQ19TRVQpOworCisJCWZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QuaW52YWxpZGF0ZSA9IDA7CisJCWZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QubWFjMSA9IChtYWMxID8gMSA6IDApOworCQlmd2NtZC5zZXQtPnBhcmFtcy5yZXF1ZXN0LnBvcnQgPSAocG9ydDEgPyAxIDogMCk7CisJCWZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QudHlwZSA9IHR5cGU7CisKKwkJLyogQ29weSB0aGUgbWFjIGFkZHJlc3MgdG8gc2V0LiAqLworCQlmd2NtZC5zZXQtPnBhcmFtcy5yZXF1ZXN0Lm1hYy5TaXplT2ZTdHJ1Y3R1cmUgPQorCQkJICAgIHNpemVvZihmd2NtZC5zZXQtPnBhcmFtcy5yZXF1ZXN0Lm1hYyk7CisJCW1lbWNweShmd2NtZC5zZXQtPnBhcmFtcy5yZXF1ZXN0Lm1hYy5NQUNBZGRyZXNzLAorCQkJbWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKKworCQkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCQlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLAorCQkJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZC5zZXQsIE5VTEwpOworCisJfSBlbHNlIHsKKworCQkvKgorCQkgKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nCisJCSAqIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuCisJCSAqLworCQlmd2NtZC5xdWVyeSA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwKKwkJCQkJICAgICAgIHdyYiwgQ09NTU9OX05UV0tfTUFDX1FVRVJZKTsKKworCQlmd2NtZC5xdWVyeS0+cGFyYW1zLnJlcXVlc3QubWFjMSA9IChtYWMxID8gMSA6IDApOworCQlmd2NtZC5xdWVyeS0+cGFyYW1zLnJlcXVlc3QucG9ydCA9IChwb3J0MSA/IDEgOiAwKTsKKwkJZndjbWQucXVlcnktPnBhcmFtcy5yZXF1ZXN0LnR5cGUgPSB0eXBlOworCQlmd2NtZC5xdWVyeS0+cGFyYW1zLnJlcXVlc3QucGVybWFuZW50ID0gcGVybWFuZW50OworCisJCXJjLmxlbmd0aCA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTUFDX1FVRVJZLAorCQkJCQkJcGFyYW1zLnJlc3BvbnNlLm1hYy5NQUNBZGRyZXNzKTsKKwkJcmMuZndjbWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01BQ19RVUVSWSwKKwkJCQkJCXBhcmFtcy5yZXNwb25zZS5tYWMuTUFDQWRkcmVzcyk7CisJCXJjLnZhID0gbWFjX2FkZHJlc3M7CisJCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICh3aXRoIGEgY29weSBmb3IgdGhlIHJlc3BvbnNlKSAqLworCQlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBjYiwKKwkJCQljYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZC5xdWVyeSwgJnJjKTsKKwl9CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJtYWMgc2V0L3F1ZXJ5IGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSB3cml0ZXMgZGF0YSB0byBjb250ZXh0IG1lbW9yeS4KKworICAgIHBmb2IgIC0gRnVuY3Rpb24gb2JqZWN0IGhhbmRsZS4KKyAgICBtYWNfdGFibGUgICAgIC0gU2V0IHRvIHRoZSAxMjgtYml0IG11bHRpY2FzdCBhZGRyZXNzIGhhc2ggdGFibGUuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisqLworCitpbnQgYmVfcnhmX211bHRpY2FzdF9jb25maWcoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJYm9vbCBwcm9taXNjdW91cywgdTMyIG51bSwgdTggKm1hY190YWJsZSwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCS8qIG9wdGlvbmFsICovCisJCXZvaWQgKmNiX2NvbnRleHQsCisJCXN0cnVjdCBiZV9tdWx0aWNhc3RfcV9jdHh0ICpxX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVQgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqZ2VuZXJpY19jdHh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQobnVtIDw9IEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1hYykpOworCisJaWYgKG51bSA+IEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1hYykpIHsKKwkJVFJBQ0UoRExfRVJSLCAiVG9vIG1hbnkgbXVsdGljYXN0IGFkZHJlc3Nlcy4gQkUgc3VwcG9ydHMgJWQuIiwKKwkJICAgICAgKGludCkgQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWFjKSk7CisJCXJldHVybiBCRV9OT1RfT0s7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbmVyaWNfY3R4dCA9IChzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKikgcV9jdHh0OworCQkJZ2VuZXJpY19jdHh0LT5jb250ZXh0LmJ5dGVzID0gc2l6ZW9mKCpxX2N0eHQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCQlnb3RvIEVycm9yOworCQl9CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fTlRXS19NVUxUSUNBU1RfU0VUKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wcm9taXNjdW91cyA9IHByb21pc2N1b3VzOworCWlmICghcHJvbWlzY3VvdXMpIHsKKwkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9tYWMgPSBudW07CisJCWlmIChudW0gPiAwKSB7CisJCQlBU1NFUlQobWFjX3RhYmxlKTsKKwkJCW1lbWNweShmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWFjLAorCQkJCQkJbWFjX3RhYmxlLCBFVEhfQUxFTiAqIG51bSk7CisJCX0KKwl9CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbmVyaWNfY3R4dCwKKwkJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAibXVsdGljYXN0IGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBhZGRzIG9yIHJlbW92ZXMgYSB2bGFuIHRhZyBmcm9tIHRoZSByeGYgdGFibGUuCisKKyAgICBGdW5jdGlvbk9iamVjdCAgLSBGdW5jdGlvbiBvYmplY3QgaGFuZGxlLgorICAgIFZMYW5UYWcgICAgICAgICAtIFZMYW4gdGFnIHRvIGFkZCBvciByZW1vdmUuCisgICAgQWRkICAgICAgICAgICAgIC0gU2V0IHRvIFRSVUUgaWYgdGhpcyB3aWxsIGFkZCBhIHZsYW4gdGFnCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisqLworaW50IGJlX3J4Zl92bGFuX2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlib29sIHByb21pc2N1b3VzLCB1MzIgbnVtLCB1MTYgKnZsYW5fdGFnX2FycmF5LAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwJLyogb3B0aW9uYWwgKi8KKwkJdm9pZCAqY2JfY29udGV4dCwKKwkJc3RydWN0IGJlX3ZsYW5fcV9jdHh0ICpxX2N0eHQpCS8qIG9wdGlvbmFsICovCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1ZMQU5fQ09ORklHICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKmdlbmVyaWNfY3R4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJaWYgKG51bSA+IEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnZsYW5fdGFnKSkgeworCQlUUkFDRShETF9FUlIsICJUb28gbWFueSBWTEFOIHRhZ3MuIik7CisJCXJldHVybiBCRV9OT1RfT0s7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbmVyaWNfY3R4dCA9IChzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKikgcV9jdHh0OworCQkJZ2VuZXJpY19jdHh0LT5jb250ZXh0LmJ5dGVzID0gc2l6ZW9mKCpxX2N0eHQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCQlnb3RvIEVycm9yOworCQl9CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fTlRXS19WTEFOX0NPTkZJRyk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucHJvbWlzY3VvdXMgPSBwcm9taXNjdW91czsKKwlpZiAoIXByb21pc2N1b3VzKSB7CisJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fdmxhbiA9IG51bTsKKworCQlpZiAobnVtID4gMCkgeworCQkJQVNTRVJUKHZsYW5fdGFnX2FycmF5KTsKKwkJCW1lbWNweShmd2NtZC0+cGFyYW1zLnJlcXVlc3Qudmxhbl90YWcsIHZsYW5fdGFnX2FycmF5LAorCQkJCSAgbnVtICogc2l6ZW9mKHZsYW5fdGFnX2FycmF5WzBdKSk7CisJCX0KKwl9CisKKwkvKiBQb3N0IHRoZSBjb21tYWRuICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgZ2VuZXJpY19jdHh0LAorCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJ2bGFuIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisKK2ludCBiZV9yeGZfbGlua19zdGF0dXMoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IEJFX0xJTktfU1RBVFVTICpsaW5rX3N0YXR1cywKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCXZvaWQgKmNiX2NvbnRleHQsCisJCXN0cnVjdCBiZV9saW5rX3N0YXR1c19xX2N0eHQgKnFfY3R4dCkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlkgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqZ2VuZXJpY19jdHh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSByYzsKKworCUFTU0VSVChsaW5rX3N0YXR1cyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKworCWlmICghd3JiKSB7CisJCWlmIChxX2N0eHQgJiYgY2IpIHsKKwkJCXdyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICZxX2N0eHQtPndyYl9oZWFkZXI7CisJCQlnZW5lcmljX2N0eHQgPSAoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICopIHFfY3R4dDsKKwkJCWdlbmVyaWNfY3R4dC0+Y29udGV4dC5ieXRlcyA9IHNpemVvZigqcV9jdHh0KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQkJZ290byBFcnJvcjsKKwkJfQorCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwKKwkJCQkJICAgICAgIENPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZKTsKKworCXJjLmxlbmd0aCA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlksCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMuZndjbWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLnZhID0gbGlua19zdGF0dXM7CisJLyogUG9zdCBvciBxdWV1ZSB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsICZyYyk7CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJsaW5rIHN0YXR1cyBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50CitiZV9yeGZfcXVlcnlfZXRoX3N0YXRpc3RpY3Moc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgIHN0cnVjdCBGV0NNRF9FVEhfR0VUX1NUQVRJU1RJQ1MgKnZhX2Zvcl9md2NtZCwKKwkJICAgIHU2NCBwYV9mb3JfZndjbWQsIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQkgICAgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgIHN0cnVjdCBiZV9ub25lbWJlZGRlZF9xX2N0eHQgKnFfY3R4dCkKK3sKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqZ2VuZXJpY19jdHh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQodmFfZm9yX2Z3Y21kKTsKKwlBU1NFUlQocGFfZm9yX2Z3Y21kKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbmVyaWNfY3R4dCA9IChzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKikgcV9jdHh0OworCQkJZ2VuZXJpY19jdHh0LT5jb250ZXh0LmJ5dGVzID0gc2l6ZW9mKCpxX2N0eHQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCQlnb3RvIEVycm9yOworCQl9CisJfQorCisJVFJBQ0UoRExfSU5GTywgIlF1ZXJ5IGV0aCBzdGF0cy4gZndjbWQgdmE6JXAgcGE6MHglMDh4XyUwOHgiLAorCSAgICAgIHZhX2Zvcl9md2NtZCwgdXBwZXJfMzJfYml0cyhwYV9mb3JfZndjbWQpLCAodTMyKXBhX2Zvcl9md2NtZCk7CisKKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJdmFfZm9yX2Z3Y21kID0gQkVfUFJFUEFSRV9OT05FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsCisJCQkgIHZhX2Zvcl9md2NtZCwgcGFfZm9yX2Z3Y21kLCBFVEhfR0VUX1NUQVRJU1RJQ1MpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCB2YV9mb3JfZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgImV0aCBzdGF0cyBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50CitiZV9yeGZfcHJvbWlzY3VvdXMoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgYm9vbCBlbmFibGVfcG9ydDAsIGJvb2wgZW5hYmxlX3BvcnQxLAorCQkgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgc3RydWN0IGJlX3Byb21pc2N1b3VzX3FfY3R4dCAqcV9jdHh0KQoreworCXN0cnVjdCBGV0NNRF9FVEhfUFJPTUlTQ1VPVVMgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqZ2VuZXJpY19jdHh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbmVyaWNfY3R4dCA9IChzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKikgcV9jdHh0OworCQkJZ2VuZXJpY19jdHh0LT5jb250ZXh0LmJ5dGVzID0gc2l6ZW9mKCpxX2N0eHQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCQlnb3RvIEVycm9yOworCQl9CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBFVEhfUFJPTUlTQ1VPVVMpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBvcnQwX3Byb21pc2N1b3VzID0gZW5hYmxlX3BvcnQwOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wb3J0MV9wcm9taXNjdW91cyA9IGVuYWJsZV9wb3J0MTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgZ2VuZXJpY19jdHh0LAorCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgInByb21pc2N1b3VzIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9yeGZfZmlsdGVyX2NvbmZpZworICogICBDb25maWd1cmVzIEJsYWRlRW5naW5lIGV0aGVybmV0IHJlY2VpdmUgZmlsdGVyIHNldHRpbmdzLgorICogcGZvYiAgICAtCisgKiBzZXR0aW5ncyAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgZmlsdGVyIHNldHRpbmdzLgorICogCQkJVGhlIHJlc3BvbnNlIGZyb20gQmxhZGVFbmdpbmUgd2lsbCBiZSBwbGFjZWQgYmFjaworICogCQkJaW4gdGhpcyBzdHJ1Y3R1cmUuCisgKiBjYiAgICAgICAgICAgICAgICAgLSBvcHRpb25hbAorICogY2JfY29udGV4dCAgICAgICAgIC0gb3B0aW9uYWwKKyAqIHFfY3R4dCAgICAgICAgICAgICAtIE9wdGlvbmFsLiBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgc3RydWN0LgorICogCQkJSWYgdGhlIE1DQyBXUkIgcmluZyBpcyBmdWxsLCB0aGlzIHN0cnVjdHVyZSBpcworICogCQkJdXNlZCB0byBxdWV1ZSB0aGUgb3BlcmF0aW9uLiBJdCB3aWxsIGJlIHBvc3RlZAorICogCQkJdG8gdGhlIE1DQyByaW5nIHdoZW4gc3BhY2UgYmVjb21lcyBhdmFpbGFibGUuIEFsbAorICogICAgICAgICAgICAgICAgICAgICAgcXVldWVkIGNvbW1hbmRzIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSByaW5nIGluCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgb3JkZXIgdGhleSBhcmUgcmVjZWl2ZWQuIEl0IGlzIGFsd2F5cyB2YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgdG8gcGFzcyBhIHBvaW50ZXIgdG8gYSBnZW5lcmljCisgKiAgICAgICAgICAgICAgICAgICAgICBiZV9nZW5lcmljX3FfY3R4dC4gSG93ZXZlciwgdGhlIHNwZWNpZmljCisgKiAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0IHN0cnVjdHMgYXJlIGdlbmVyYWxseSBzbWFsbGVyIHRoYW4KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBnZW5lcmljIHN0cnVjdC4KKyAqIHJldHVybiBwZW5kX3N0YXR1cyAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuCisgKiAJCQlCRV9QRU5ESU5HIChwb3N0aXZlIHZhbHVlKSBpZiB0aGUgRldDTUQKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gaXMgcGVuZGluZy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9yeGZfZmlsdGVyX2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICAgIHN0cnVjdCBOVFdLX1JYX0ZJTFRFUl9TRVRUSU5HUyAqc2V0dGluZ3MsCisJCSAgICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgICAgc3RydWN0IGJlX3J4Zl9maWx0ZXJfcV9jdHh0ICpxX2N0eHQpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IHJjOworCisJQVNTRVJUKHNldHRpbmdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbmVyaWNfY3R4dCA9IChzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKikgcV9jdHh0OworCQkJZ2VuZXJpY19jdHh0LT5jb250ZXh0LmJ5dGVzID0gc2l6ZW9mKCpxX2N0eHQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCQlnb3RvIEVycm9yOworCQl9CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fTlRXS19SWF9GSUxURVIpOworCW1lbWNweSgmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LCBzZXR0aW5ncywgc2l6ZW9mKCpzZXR0aW5ncykpOworCisJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19SWF9GSUxURVIsCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMuZndjbWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy52YSA9IHNldHRpbmdzOworCS8qIFBvc3Qgb3IgcXVldWUgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgZ2VuZXJpY19jdHh0LAorCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCAmcmMpOworCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAiUlhGL0VSWCBmaWx0ZXIgY29uZmlnIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2V0eF9jb250ZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXR4X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTRmYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2V0eF9jb250ZXh0LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2V0eF9jb250ZXh0X2FtYXBfaF9fCisjZGVmaW5lIF9fZXR4X2NvbnRleHRfYW1hcF9oX18KKworLyogRVRYIHJpbmcgIGNvbnRleHQgc3RydWN0dXJlLiAqLworc3RydWN0IEJFX0VUWF9DT05URVhUX0FNQVAgeworCXU4IHR4X2NpZHhbMTFdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNV07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCB0eF9waWR4WzExXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQyOwkJLyogRFdPUkQgMSAqLworCXU4IHR4X3Jpbmdfc2l6ZVs0XTsJLyogRFdPUkQgMSAqLworCXU4IHBkX2lkWzVdOwkvKiBEV09SRCAxICovCisJdTggcGRfaWRfbm90X3ZhbGlkOwkvKiBEV09SRCAxICovCisJdTggY3FfaWRfc2VuZFsxMF07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkM1szMl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkNFszMl07CS8qIERXT1JEIDMgKi8KKwl1OCBjdXJfYnl0ZXNbMzJdOwkvKiBEV09SRCA0ICovCisJdTggbWF4X2J5dGVzWzMyXTsJLyogRFdPUkQgNSAqLworCXU4IHRpbWVfc3RhbXBbMzJdOwkvKiBEV09SRCA2ICovCisJdTggcnN2ZDVbMTFdOwkvKiBEV09SRCA3ICovCisJdTggZnVuYzsJCS8qIERXT1JEIDcgKi8KKwl1OCByc3ZkNlsyMF07CS8qIERXT1JEIDcgKi8KKwl1OCBjdXJfdHhkX2NvdW50WzMyXTsJLyogRFdPUkQgOCAqLworCXU4IG1heF90eGRfY291bnRbMzJdOwkvKiBEV09SRCA5ICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAxMCAqLworCXU4IHJzdmQ4WzMyXTsJLyogRFdPUkQgMTEgKi8KKwl1OCByc3ZkOVszMl07CS8qIERXT1JEIDEyICovCisJdTggcnN2ZDEwWzMyXTsJLyogRFdPUkQgMTMgKi8KKwl1OCByc3ZkMTFbMzJdOwkvKiBEV09SRCAxNCAqLworCXU4IHJzdmQxMlszMl07CS8qIERXT1JEIDE1ICovCit9IF9fcGFja2VkOworc3RydWN0IEVUWF9DT05URVhUX0FNQVAgeworCXUzMiBkd1sxNl07Cit9OworCisjZW5kaWYgLyogX19ldHhfY29udGV4dF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z1bmNvYmouYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9mdW5jb2JqLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1N2ViNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9mdW5jb2JqLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpbmNsdWRlICJod2xpYi5oIgorI2luY2x1ZGUgImJlc3RhdHVzLmgiCisKKworaW50CitiZV9mdW5jdGlvbl9pbnRlcm5hbF9xdWVyeV9maXJtd2FyZV9jb25maWcoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCQkgICBzdHJ1Y3QgQkVfRklSTVdBUkVfQ09ORklHICpjb25maWcpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9GSVJNV0FSRV9DT05GSUcgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fRklSTVdBUkVfQ09ORklHKTsKKworCXJjLmxlbmd0aCA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgRldDTURfQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRywKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy5md2NtZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRldDTURfQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRywKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy52YSA9IGNvbmZpZzsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgZndjbWQsICZyYyk7CitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBmdW5jdGlvbiBvYmplY3QgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uCisgICAgcHJvdmlkZWQgYnkgdXBwZXIgbGF5ZXIgZHJpdmVycy4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBpbnQgb24gZmFpbHVyZS4KKworICAgIEEgZnVuY3Rpb24gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgQmxhZGVFbmdpbmUgKGxvZ2ljYWwpIFBDSSBmdW5jdGlvbi4KKyAgICBUaGF0IGlzIGEgZnVuY3Rpb24gb2JqZWN0IGVpdGhlciByZXByZXNlbnRzCisgICAgdGhlIG5ldHdvcmtpbmcgc2lkZSBvZiBCbGFkZUVuZ2luZSBvciB0aGUgaVNDU0kgc2lkZSBvZiBCbGFkZUVuZ2luZS4KKworICAgIFRoaXMgcm91dGluZSB3aWxsIGFsc28gZGV0ZWN0IGFuZCBjcmVhdGUgYW4gYXBwcm9wcmlhdGUgUEQgb2JqZWN0IGZvciB0aGUKKyAgICBQQ0kgZnVuY3Rpb24gYXMgbmVlZGVkLgorKi8KK2ludAorYmVfZnVuY3Rpb25fb2JqZWN0X2NyZWF0ZSh1OCBfX2lvbWVtICpjc3JfdmEsIHU4IF9faW9tZW0gKmRiX3ZhLAorCQl1OCBfX2lvbWVtICpwY2lfdmEsIHUzMiBmdW5jdGlvbl90eXBlLAorCQlzdHJ1Y3QgcmluZ19kZXNjICptYWlsYm94LCBzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCWludCBzdGF0dXM7CisKKwlBU1NFUlQocGZvYik7CS8qIG5vdCBhIG1hZ2ljIGFzc2VydCAqLworCUFTU0VSVChmdW5jdGlvbl90eXBlIDw9IDIpOworCisJVFJBQ0UoRExfSU5GTywgIkNyZWF0ZSBmdW5jdGlvbiBvYmplY3QuIHR5cGU6JXMgb2JqZWN0OjB4JXAiLAorCSAgICAgIChmdW5jdGlvbl90eXBlID09IEJFX0ZVTkNUSU9OX1RZUEVfSVNDU0kgPyAiaVNDU0kiIDoKKwkgICAgICAgKGZ1bmN0aW9uX3R5cGUgPT0gQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLID8gIk5ldHdvcmsiIDoKKwkJIkFybSIpKSwgcGZvYik7CisKKwltZW1zZXQocGZvYiwgMCwgc2l6ZW9mKCpwZm9iKSk7CisKKwlwZm9iLT50eXBlID0gZnVuY3Rpb25fdHlwZTsKKwlwZm9iLT5jc3JfdmEgPSBjc3JfdmE7CisJcGZvYi0+ZGJfdmEgPSBkYl92YTsKKwlwZm9iLT5wY2lfdmEgPSBwY2lfdmE7CisKKwlzcGluX2xvY2tfaW5pdCgmcGZvYi0+Y3FfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBmb2ItPnBvc3RfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBmb2ItPm1jY19jb250ZXh0X2xvY2spOworCisKKwlwZm9iLT5wY2lfZnVuY3Rpb25fbnVtYmVyID0gMTsKKworCisJcGZvYi0+ZW11bGF0ZSA9IGZhbHNlOworCVRSQUNFKERMX05PVEUsICJOb24tZW11bGF0aW9uIG1vZGUiKTsKKwlzdGF0dXMgPSBiZV9kcml2ZV9QT1NUKHBmb2IpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJCbGFkZUVuZ2luZSBQT1NUIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBtYWlsYm94ICovCisJc3RhdHVzID0gYmVfbXB1X2luaXRfbWFpbGJveChwZm9iLCBtYWlsYm94KTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgbWFpbGJveC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJLyoKKwkgKiBDYWNoZSB0aGUgZmlybXdhcmUgY29uZmlnIGZvciBBU1NFUlRzIGluIGh3Y2xpYiBhbmQgbGF0ZXIKKwkgKiBkcml2ZXIgcXVlcmllcy4KKwkgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9pbnRlcm5hbF9xdWVyeV9maXJtd2FyZV9jb25maWcocGZvYiwKKwkJCQkJICAgICAgICZwZm9iLT5md19jb25maWcpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJGYWlsZWQgdG8gcXVlcnkgZmlybXdhcmUgY29uZmlnLiIpOworCQlnb3RvIGVycm9yOworCX0KKworZXJyb3I6CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCS8qIE5vIGNsZWFudXAgbmVjZXNzYXJ5ICovCisJCVRSQUNFKERMX0VSUiwgIkZhaWxlZCB0byBjcmVhdGUgZnVuY3Rpb24uIik7CisJCW1lbXNldChwZm9iLCAwLCBzaXplb2YoKnBmb2IpKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgZHJvcHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBhIGdpdmVuIGZ1bmN0aW9uIG9iamVjdC4gT25jZQorICAgIHRoZSByZWZlcmVuY2UgY291bnQgZmFsbHMgdG8gemVybywgdGhlIGZ1bmN0aW9uIG9iamVjdCBpcyBkZXN0cm95ZWQgYW5kIGFsbAorICAgIHJlc291cmNlcyBoZWxkIGFyZSBmcmVlZC4KKworICAgIEZ1bmN0aW9uT2JqZWN0ICAgICAgLSBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGRyb3AgdGhlIHJlZmVyZW5jZSB0by4KKyovCitpbnQgYmVfZnVuY3Rpb25fb2JqZWN0X2Rlc3Ryb3koc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlUUkFDRShETF9JTkZPLCAiRGVzdHJveSBwZm9iLiBPYmplY3Q6MHglcCIsCisJICAgICAgcGZvYik7CisKKworCUFTU0VSVChwZm9iLT5tY2MgPT0gTlVMTCk7CisKKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKworaW50IGJlX2Z1bmN0aW9uX2NsZWFudXAoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgaXNyOworCXUzMiBob3N0X2ludHI7CisJc3RydWN0IFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIGN0cmw7CisKKworCWlmIChwZm9iLT50eXBlID09IEJFX0ZVTkNUSU9OX1RZUEVfTkVUV09SSykgeworCQlzdGF0dXMgPSBiZV9yeGZfbXVsdGljYXN0X2NvbmZpZyhwZm9iLCBmYWxzZSwgMCwKKwkJCQkJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCQlBU1NFUlQoc3RhdHVzID09IEJFX1NVQ0NFU1MpOworCX0KKwkvKiBWTEFOICovCisJc3RhdHVzID0gYmVfcnhmX3ZsYW5fY29uZmlnKHBmb2IsIGZhbHNlLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlBU1NFUlQoc3RhdHVzID09IEJFX1NVQ0NFU1MpOworCS8qCisJICogTUNDIFF1ZXVlIC0tIFN3aXRjaGVzIHRvIG1haWxib3ggbW9kZS4gIE1heSB3YW50IHRvIGRlc3Ryb3kKKwkgKiBhbGwgYnV0IHRoZSBNQ0MgQ1EgYmVmb3JlIHRoaXMgY2FsbCBpZiBwb2xsaW5nIENRIGlzIG11Y2ggYmV0dGVyCisJICogcGVyZm9ybWFuY2UgdGhhbiBwb2xsaW5nIG1haWxib3ggcmVnaXN0ZXIuCisJICovCisJaWYgKHBmb2ItPm1jYykKKwkJc3RhdHVzID0gYmVfbWNjX3JpbmdfZGVzdHJveShwZm9iLT5tY2MpOworCS8qCisJICogSWYgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIGNsZWFyIGFueSBDRVYgaW50ZXJydXB0IGFzc2VydGlvbnMgdGhhdAorCSAqIGZpcmVkIGFmdGVyIHdlIHN0b3BwZWQgcHJvY2Vzc2luZyBFUXMuCisJICovCisJY3RybC5kd1swXSA9IFBDSUNGRzFfUkVBRChwZm9iLCBob3N0X3RpbWVyX2ludF9jdHJsKTsKKwlob3N0X2ludHIgPSBBTUFQX0dFVF9CSVRTX1BUUihQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1IsCisJCQkJCQkJaG9zdGludHIsIGN0cmwuZHcpOworCWlmICghaG9zdF9pbnRyKQorCQlpZiAocGZvYi0+dHlwZSA9PSBCRV9GVU5DVElPTl9UWVBFX05FVFdPUkspCisJCQlpc3IgPSBDU1JfUkVBRChwZm9iLCBjZXYuaXNyMSk7CisJCWVsc2UKKwkJCWlzciA9IENTUl9SRUFEKHBmb2IsIGNldi5pc3IwKTsKKwllbHNlCisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLiAqLworCQlUUkFDRShETF9FUlIsICJmdW5jdGlvbl9jbGVhbnVwIGNhbGxlZCB3aXRoIGludGVycnVwdCBlbmFibGVkIik7CisJLyogRnVuY3Rpb24gb2JqZWN0IGRlc3Ryb3kgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9vYmplY3RfZGVzdHJveShwZm9iKTsKKwlBU1NFUlQoc3RhdHVzID09IEJFX1NVQ0NFU1MpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkICoKK2JlX2Z1bmN0aW9uX3ByZXBhcmVfZW1iZWRkZWRfZndjbWQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsIHUzMiBwYXlsZF9sZW4sIHUzMiByZXF1ZXN0X2xlbmd0aCwKKwl1MzIgcmVzcG9uc2VfbGVuZ3RoLCB1MzIgb3Bjb2RlLCB1MzIgc3Vic3lzdGVtKQoreworCXN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiAqaGVhZGVyID0gTlVMTDsKKwl1MzIgbjsKKworCUFTU0VSVCh3cmIpOworCisJbiA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfV1JCX0FNQVAsIHBheWxvYWQpLzg7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQiwgZW1iZWRkZWQsIHdyYiwgMSk7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQiwgcGF5bG9hZF9sZW5ndGgsIHdyYiwgbWluKHBheWxkX2xlbiwgbikpOworCWhlYWRlciA9IChzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKikoKHU4ICopd3JiICsgbik7CisKKwloZWFkZXItPnRpbWVvdXQgPSAwOworCWhlYWRlci0+ZG9tYWluID0gMDsKKwloZWFkZXItPnJlcXVlc3RfbGVuZ3RoID0gbWF4KHJlcXVlc3RfbGVuZ3RoLCByZXNwb25zZV9sZW5ndGgpOworCWhlYWRlci0+b3Bjb2RlID0gb3Bjb2RlOworCWhlYWRlci0+c3Vic3lzdGVtID0gc3Vic3lzdGVtOworCisJcmV0dXJuIGhlYWRlcjsKK30KKwordm9pZCAqCitiZV9mdW5jdGlvbl9wcmVwYXJlX25vbmVtYmVkZGVkX2Z3Y21kKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLAorCXZvaWQgKmZ3Y21kX3ZhLCB1NjQgZndjbWRfcGEsCisJdTMyIHBheWxkX2xlbiwKKwl1MzIgcmVxdWVzdF9sZW5ndGgsCisJdTMyIHJlc3BvbnNlX2xlbmd0aCwKKwl1MzIgb3Bjb2RlLCB1MzIgc3Vic3lzdGVtKQoreworCXN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiAqaGVhZGVyID0gTlVMTDsKKwl1MzIgbjsKKwlzdHJ1Y3QgTUNDX1dSQl9QQVlMT0FEX0FNQVAgKnBscDsKKworCUFTU0VSVCh3cmIpOworCUFTU0VSVChmd2NtZF92YSk7CisKKwloZWFkZXIgPSAoc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICopIGZ3Y21kX3ZhOworCisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQiwgZW1iZWRkZWQsIHdyYiwgMCk7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQiwgcGF5bG9hZF9sZW5ndGgsIHdyYiwgcGF5bGRfbGVuKTsKKworCS8qCisJICogQXNzdW1lIG9uZSBmcmFnbWVudC4gVGhlIGNhbGxlciBtYXkgb3ZlcnJpZGUgdGhlIFNHTCBieQorCSAqIHJld3JpdGluZyB0aGUgMHRoIGxlbmd0aCBhbmQgYWRkaW5nIG1vcmUgZW50cmllcy4gIFRoZXkKKwkgKiB3aWxsIGFsc28gbmVlZCB0byB1cGRhdGUgdGhlIHNnZV9jb3VudC4KKwkgKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBzZ2VfY291bnQsIHdyYiwgMSk7CisKKwluID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19XUkJfQU1BUCwgcGF5bG9hZCkvODsKKwlwbHAgPSAoc3RydWN0IE1DQ19XUkJfUEFZTE9BRF9BTUFQICopKCh1OCAqKXdyYiArIG4pOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkJfUEFZTE9BRCwgc2dsWzBdLmxlbmd0aCwgcGxwLCBwYXlsZF9sZW4pOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkJfUEFZTE9BRCwgc2dsWzBdLnBhX2xvLCBwbHAsICh1MzIpZndjbWRfcGEpOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkJfUEFZTE9BRCwgc2dsWzBdLnBhX2hpLCBwbHAsCisJCQkJCXVwcGVyXzMyX2JpdHMoZndjbWRfcGEpKTsKKworCWhlYWRlci0+dGltZW91dCA9IDA7CisJaGVhZGVyLT5kb21haW4gPSAwOworCWhlYWRlci0+cmVxdWVzdF9sZW5ndGggPSBtYXgocmVxdWVzdF9sZW5ndGgsIHJlc3BvbnNlX2xlbmd0aCk7CisJaGVhZGVyLT5vcGNvZGUgPSBvcGNvZGU7CisJaGVhZGVyLT5zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07CisKKwlyZXR1cm4gaGVhZGVyOworfQorCitzdHJ1Y3QgTUNDX1dSQl9BTUFQICoKK2JlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJdTMyIG9mZnNldDsKKworCWlmIChwZm9iLT5tY2MpCisJCXdyYiA9IF9iZV9tcHVfcGVla19yaW5nX3dyYihwZm9iLT5tY2MsIGZhbHNlKTsKKwllbHNlIHsKKwkJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19NQUlMQk9YX0FNQVAsIHdyYikvODsKKwkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgKCh1OCAqKSBwZm9iLT5tYWlsYm94LnZhICsKKwkJCQlvZmZzZXQpOworCX0KKworCWlmICh3cmIpCisJCW1lbXNldCh3cmIsIDAsIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSk7CisKKwlyZXR1cm4gd3JiOworfQorCisjaWYgZGVmaW5lZChCRV9ERUJVRykKK3ZvaWQgYmVfZnVuY3Rpb25fZGVidWdfcHJpbnRfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgdm9pZCAqb3B0aW9uYWxfZndjbWRfdmEsCisJCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0KQoreworCisJc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICpoZWFkZXIgPSBOVUxMOworCXU4IGVtYmVkZGVkOworCXUzMiBuOworCisJZW1iZWRkZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfV1JCLCBlbWJlZGRlZCwgd3JiKTsKKworCWlmIChlbWJlZGRlZCkgeworCQluID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19XUkJfQU1BUCwgcGF5bG9hZCkvODsKKwkJaGVhZGVyID0gKHN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiAqKSgodTggKil3cmIgKyBuKTsKKwl9IGVsc2UgeworCQloZWFkZXIgPSAoc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICopIG9wdGlvbmFsX2Z3Y21kX3ZhOworCX0KKworCS8qIFNhdmUgdGhlIGNvbXBsZXRlZCBjb3VudCBiZWZvcmUgcG9zdGluZyBmb3IgYSBkZWJ1ZyBhc3NlcnQuICovCisKKwlpZiAoaGVhZGVyKSB7CisJCXdyYl9jb250ZXh0LT5vcGNvZGUgPSBoZWFkZXItPm9wY29kZTsKKwkJd3JiX2NvbnRleHQtPnN1YnN5c3RlbSA9IGhlYWRlci0+c3Vic3lzdGVtOworCisJfSBlbHNlIHsKKwkJd3JiX2NvbnRleHQtPm9wY29kZSA9IDA7CisJCXdyYl9jb250ZXh0LT5zdWJzeXN0ZW0gPSAwOworCX0KK30KKyNlbHNlCisjZGVmaW5lIGJlX2Z1bmN0aW9uX2RlYnVnX3ByaW50X3dyYihhXywgYl8sIGNfLCBkXykKKyNlbmRpZgorCitpbnQKK2JlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsCisJCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqcV9jdHh0LAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2IsCisJCXZvaWQgKmludGVybmFsX2NiX2NvbnRleHQsIHZvaWQgKm9wdGlvbmFsX2Z3Y21kX3ZhLAorCQlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5ICpyYykKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0ID0gTlVMTDsKKwl1NjQgKnA7CisKKwlpZiAocV9jdHh0KSB7CisJCS8qIEluaXRpYWxpemUgY29udGV4dC4gICAgICAgICAqLworCQlxX2N0eHQtPmNvbnRleHQuaW50ZXJuYWxfY2IgPSBpbnRlcm5hbF9jYjsKKwkJcV9jdHh0LT5jb250ZXh0LmludGVybmFsX2NiX2NvbnRleHQgPSBpbnRlcm5hbF9jYl9jb250ZXh0OworCQlxX2N0eHQtPmNvbnRleHQuY2IgPSBjYjsKKwkJcV9jdHh0LT5jb250ZXh0LmNiX2NvbnRleHQgPSBjYl9jb250ZXh0OworCQlpZiAocmMpIHsKKwkJCXFfY3R4dC0+Y29udGV4dC5jb3B5Lmxlbmd0aCA9IHJjLT5sZW5ndGg7CisJCQlxX2N0eHQtPmNvbnRleHQuY29weS5md2NtZF9vZmZzZXQgPSByYy0+ZndjbWRfb2Zmc2V0OworCQkJcV9jdHh0LT5jb250ZXh0LmNvcHkudmEgPSByYy0+dmE7CisJCX0gZWxzZQorCQkJcV9jdHh0LT5jb250ZXh0LmNvcHkubGVuZ3RoID0gMDsKKworCQlxX2N0eHQtPmNvbnRleHQub3B0aW9uYWxfZndjbWRfdmEgPSBvcHRpb25hbF9md2NtZF92YTsKKworCQkvKiBRdWV1ZSB0aGlzIHJlcXVlc3QgKi8KKwkJc3RhdHVzID0gYmVfZnVuY3Rpb25fcXVldWVfbWNjX3dyYihwZm9iLCBxX2N0eHQpOworCisJCWdvdG8gRXJyb3I7CisJfQorCS8qCisJICogQWxsb2NhdGUgYSBXUkIgY29udGV4dCBzdHJ1Y3QgdG8gaG9sZCB0aGUgY2FsbGJhY2sgcG9pbnRlcnMsCisJICogc3RhdHVzLCBldGMuICBUaGlzIGlzIHJlcXVpcmVkIGlmIGNvbW1hbmRzIGNvbXBsZXRlIG91dCBvZiBvcmRlci4KKwkgKi8KKwl3cmJfY29udGV4dCA9IF9iZV9tY2NfYWxsb2NhdGVfd3JiX2NvbnRleHQocGZvYik7CisJaWYgKCF3cmJfY29udGV4dCkgeworCQlUUkFDRShETF9XQVJOLCAiRmFpbGVkIHRvIGFsbG9jYXRlIE1DQyBXUkIgY29udGV4dC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX1NZU1RFTV9SRVNPVVJDRVM7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIEluaXRpYWxpemUgY29udGV4dC4gKi8KKwltZW1zZXQod3JiX2NvbnRleHQsIDAsIHNpemVvZigqd3JiX2NvbnRleHQpKTsKKwl3cmJfY29udGV4dC0+aW50ZXJuYWxfY2IgPSBpbnRlcm5hbF9jYjsKKwl3cmJfY29udGV4dC0+aW50ZXJuYWxfY2JfY29udGV4dCA9IGludGVybmFsX2NiX2NvbnRleHQ7CisJd3JiX2NvbnRleHQtPmNiID0gY2I7CisJd3JiX2NvbnRleHQtPmNiX2NvbnRleHQgPSBjYl9jb250ZXh0OworCWlmIChyYykgeworCQl3cmJfY29udGV4dC0+Y29weS5sZW5ndGggPSByYy0+bGVuZ3RoOworCQl3cmJfY29udGV4dC0+Y29weS5md2NtZF9vZmZzZXQgPSByYy0+ZndjbWRfb2Zmc2V0OworCQl3cmJfY29udGV4dC0+Y29weS52YSA9IHJjLT52YTsKKwl9IGVsc2UKKwkJd3JiX2NvbnRleHQtPmNvcHkubGVuZ3RoID0gMDsKKwl3cmJfY29udGV4dC0+d3JiID0gd3JiOworCisJLyoKKwkgKiBDb3B5IHRoZSBjb250ZXh0IHBvaW50ZXIgaW50byB0aGUgV1JCIG9wYXF1ZSB0YWcgZmllbGQuCisJICogVmVyaWZ5IGFzc3VtcHRpb24gb2YgNjQtYml0IHRhZyB3aXRoIGEgY29tcGlsZSB0aW1lIGFzc2VydC4KKwkgKi8KKwlwID0gKHU2NCAqKSAoKHU4ICopd3JiICsgb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19XUkJfQU1BUCwgdGFnKS84KTsKKwkqcCA9ICh1NjQpKHNpemVfdCl3cmJfY29udGV4dDsKKworCS8qIFByaW50IGluZm8gYWJvdXQgdGhpcyBGV0NNRCBmb3IgZGVidWcgYnVpbGRzLiAqLworCWJlX2Z1bmN0aW9uX2RlYnVnX3ByaW50X3dyYihwZm9iLCB3cmIsIG9wdGlvbmFsX2Z3Y21kX3ZhLCB3cmJfY29udGV4dCk7CisKKwkvKgorCSAqIGlzc3VlIHRoZSBXUkIgdG8gdGhlIE1QVSBhcyBhcHByb3ByaWF0ZQorCSAqLworCWlmIChwZm9iLT5tY2MpIHsKKwkJLyoKKwkJICogd2UncmUgaW4gV1JCIG1vZGUsIHBhc3MgdG8gdGhlIG1jYyBsYXllcgorCQkgKi8KKwkJc3RhdHVzID0gX2JlX21wdV9wb3N0X3dyYl9yaW5nKHBmb2ItPm1jYywgd3JiLCB3cmJfY29udGV4dCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogd2UncmUgaW4gbWFpbGJveCBtb2RlCisJCSAqLworCQlzdGF0dXMgPSBfYmVfbXB1X3Bvc3Rfd3JiX21haWxib3gocGZvYiwgd3JiLCB3cmJfY29udGV4dCk7CisKKwkJLyogbWFpbGJveCBtb2RlIGFsd2F5cyBjb21wbGV0ZXMgc3luY2hyb25vdXNseSAqLworCQlBU1NFUlQoc3RhdHVzICE9IEJFX1NUQVRVU19QRU5ESU5HKTsKKwl9CisKK0Vycm9yOgorCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50CitiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3koc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJdTMyIGlkLCB1MzIgcmluZ190eXBlLCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJdm9pZCAqY2JfY29udGV4dCwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2IsCisJCXZvaWQgKmludGVybmFsX2NiX2NvbnRleHQpCit7CisKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1JJTkdfREVTVFJPWSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlUUkFDRShETF9JTkZPLCAiRGVzdHJveSByaW5nIGlkOiVkIHR5cGU6JWQiLCBpZCwgcmluZ190eXBlKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlBU1NFUlQod3JiKTsKKwkJVFJBQ0UoRExfRVJSLCAiTm8gZnJlZSBNQ0MgV1JCcyBpbiBkZXN0cm95IHJpbmcuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX1JJTkdfREVTVFJPWSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuaWQgPSBpZDsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucmluZ190eXBlID0gcmluZ190eXBlOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBjYiwgY2JfY29udGV4dCwKKwkJCQlpbnRlcm5hbF9jYiwgaW50ZXJuYWxfY2JfY29udGV4dCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gQkVfUEVORElORykgeworCQlUUkFDRShETF9FUlIsICJSaW5nIGRlc3Ryb3kgZndjbWQgZmFpbGVkLiBpZDolZCByaW5nX3R5cGU6JWQiLAorCQkJaWQsIHJpbmdfdHlwZSk7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAorYmVfcmRfdG9fcGFfbGlzdChzdHJ1Y3QgcmluZ19kZXNjICpyZCwgc3RydWN0IFBIWVNfQUREUiAqcGFfbGlzdCwgdTMyIG1heF9udW0pCit7CisJdTMyIG51bV9wYWdlcyA9IFBBR0VTX1NQQU5ORUQocmQtPnZhLCByZC0+bGVuZ3RoKTsKKwl1MzIgaSA9IDA7CisJdTY0IHBhID0gcmQtPnBhOworCV9fbGU2NCBsZXBhOworCisJQVNTRVJUKHBhX2xpc3QpOworCUFTU0VSVChwYSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWluKG51bV9wYWdlcywgbWF4X251bSk7IGkrKykgeworCQlsZXBhID0gY3B1X3RvX2xlNjQocGEpOworCQlwYV9saXN0W2ldLmxvID0gKHUzMilsZXBhOworCQlwYV9saXN0W2ldLmhpID0gdXBwZXJfMzJfYml0cyhsZXBhKTsKKwkJcGEgKz0gUEFHRV9TSVpFOworCX0KK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9mdW5jdGlvbl9nZXRfZndfdmVyc2lvbgorICogICBSZXRyaWV2ZXMgdGhlIGZpcm13YXJlIHZlcnNpb24gb24gdGhlIGFkcGF0ZXIuIElmIHRoZSBjYWxsYmFjayBpcworICogICBOVUxMIHRoaXMgY2FsbCBleGVjdXRlcyBzeW5jaHJvbm91c2x5LiBJZiB0aGUgY2FsbGJhY2sgaXMgbm90IE5VTEwsCisgKiAgIHRoZSByZXR1cm5lZCBzdGF0dXMgd2lsbCBiZSBCRV9QRU5ESU5HIGlmIHRoZSBjb21tYW5kIHdhcyBpc3N1ZWQKKyAqICAgc3VjY2Vzc2Z1bGx5LgorICogcGZvYiAgICAtCisgKiBmd3YgICAgICAgICAtIFBvaW50ZXIgdG8gcmVzcG9uc2UgYnVmZmVyIGlmIGNhbGxiYWNrIGlzIE5VTEwuCisgKiBjYiAgICAgICAgICAgLSBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdGhlIEZXQ01EIGNvbXBsZXRlcy4KKyAqIGNiX2NvbnRleHQgICAtIFBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgKiByZXR1cm4gcGVuZF9zdGF0dXMgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLgorICogCQkJQkVfUEVORElORyAocG9zdGl2ZSB2YWx1ZSkgaWYgdGhlIEZXQ01ECisgKiAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uIGlzIHBlbmRpbmcuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZnVuY3Rpb25fZ2V0X2Z3X3ZlcnNpb24oc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEICpmd3YsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0KQoreworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTiAqZndjbWQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCisJaWYgKCFjYiAmJiAhZnd2KSB7CisJCVRSQUNFKERMX0VSUiwgImNhbGxiYWNrIGFuZCByZXNwb25zZSBidWZmZXIgTlVMTCEiKTsKKwkJc3RhdHVzID0gQkVfTk9UX09LOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0dFVF9GV19WRVJTSU9OKTsKKworCXJjLmxlbmd0aCA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLmZ3Y21kX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT04sCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMudmEgPSBmd3Y7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIGNiLAorCQkJCWNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCAmcmMpOworCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50CitiZV9mdW5jdGlvbl9xdWV1ZV9tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQkgIHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqcV9jdHh0KQoreworCWludCBzdGF0dXM7CisKKwlBU1NFUlQocV9jdHh0KTsKKworCS8qCisJICogaXNzdWUgdGhlIFdSQiB0byB0aGUgTVBVIGFzIGFwcHJvcHJpYXRlCisJICovCisJaWYgKHBmb2ItPm1jYykgeworCisJCS8qIFdlJ3JlIGluIHJpbmcgbW9kZS4gIFF1ZXVlIHRoaXMgaXRlbS4gKi8KKwkJcGZvYi0+bWNjLT5iYWNrbG9nX2xlbmd0aCsrOworCQlsaXN0X2FkZF90YWlsKCZxX2N0eHQtPmNvbnRleHQubGlzdCwgJnBmb2ItPm1jYy0+YmFja2xvZyk7CisJCXN0YXR1cyA9IEJFX1BFTkRJTkc7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gQkVfTk9UX09LOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2ZTBkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9jb21tb24uaApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Z3Y21kX2NvbW1vbl9hbWFwX2hfXworI2RlZmluZSBfX2Z3Y21kX2NvbW1vbl9hbWFwX2hfXworI2luY2x1ZGUgImhvc3Rfc3RydWN0LmgiCisKKy8qIC0tLSBQSFlfTElOS19EVVBMRVhfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUEhZX0xJTktfRFVQTEVYX05PTkUgICAgICAgICAgICAoMCkKKyNkZWZpbmUgUEhZX0xJTktfRFVQTEVYX0hBTEYgICAgICAgICAgICAoMSkKKyNkZWZpbmUgUEhZX0xJTktfRFVQTEVYX0ZVTEwgICAgICAgICAgICAoMikKKworLyogLS0tIFBIWV9MSU5LX1NQRUVEX0VOVU0gLS0tICovCisjZGVmaW5lIFBIWV9MSU5LX1NQRUVEX1pFUk8gICAgICAgICAgICAgKDApCS8qIE5vIGxpbmsuICovCisjZGVmaW5lIFBIWV9MSU5LX1NQRUVEXzEwTUJQUyAgICAgICAgICAgKDEpCS8qIDEwIE1icHMgKi8KKyNkZWZpbmUgUEhZX0xJTktfU1BFRURfMTAwTUJQUyAgICAgICAgICAoMikJLyogMTAwIE1icHMgKi8KKyNkZWZpbmUgUEhZX0xJTktfU1BFRURfMUdCUFMgICAgICAgICAgICAoMykJLyogMSBHYnBzICovCisjZGVmaW5lIFBIWV9MSU5LX1NQRUVEXzEwR0JQUyAgICAgICAgICAgKDQpCS8qIDEwIEdicHMgKi8KKworLyogLS0tIFBIWV9MSU5LX0ZBVUxUX0VOVU0gLS0tICovCisjZGVmaW5lIFBIWV9MSU5LX0ZBVUxUX05PTkUgICAgICAgICAgICAgKDApCS8qIE5vIGZhdWx0IHN0YXR1cworCQkJCQkJCWF2YWlsYWJsZSBvciBkZXRlY3RlZCAqLworI2RlZmluZSBQSFlfTElOS19GQVVMVF9MT0NBTCAgICAgICAgICAgICgxKQkvKiBMb2NhbCBmYXVsdCBkZXRlY3RlZCAqLworI2RlZmluZSBQSFlfTElOS19GQVVMVF9SRU1PVEUgICAgICAgICAgICgyKQkvKiBSZW1vdGUgZmF1bHQgZGV0ZWN0ZWQgKi8KKworLyogLS0tIEJFX1VMUF9NQVNLIC0tLSAqLworI2RlZmluZSBCRV9VTFAwX01BU0sgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBCRV9VTFAxX01BU0sgICAgICAgICAgICAgICAgICAgICgyKQorI2RlZmluZSBCRV9VTFAyX01BU0sgICAgICAgICAgICAgICAgICAgICg0KQorCisvKiAtLS0gTlRXS19BQ1RJVkVfUE9SVCAtLS0gKi8KKyNkZWZpbmUgTlRXS19QT1JUX0EgICAgICAgICAgICAgICAgICAgICAoMCkJLyogUG9ydCBBIGlzIGN1cnJlbnRseSBhY3RpdmUgKi8KKyNkZWZpbmUgTlRXS19QT1JUX0IgICAgICAgICAgICAgICAgICAgICAoMSkJLyogUG9ydCBCIGlzIGN1cnJlbnRseSBhY3RpdmUgKi8KKyNkZWZpbmUgTlRXS19OT19BQ1RJVkVfUE9SVCAgICAgICAgICAgICAoMTUpCS8qIEJvdGggcG9ydHMgaGF2ZSBsb3N0IGxpbmsgKi8KKworLyogLS0tIE5UV0tfTElOS19UWVBFIC0tLSAqLworI2RlZmluZSBOVFdLX0xJTktfVFlQRV9QSFlTSUNBTCAgICAgICAgICgwKQkvKiBsaW5rIHVwL2Rvd24gZXZlbnQKKwkJCQkJCSAgIGFwcGxpZXMgdG8gQmxhZGVFbmdpbmUncworCQkJCQkJICAgUGh5c2ljYWwgUG9ydHMKKwkJCQkJCSAgICovCisjZGVmaW5lIE5UV0tfTElOS19UWVBFX1ZJUlRVQUwgICAgICAgICAgKDEpCS8qIFZpcnR1YWwgbGluayB1cC9kb3duIGV2ZW50CisJCQkJCQkgICByZXBvcnRlZCBieSBCbGFkZUV4Y2hhbmdlLgorCQkJCQkJICAgVGhpcyBhcHBsaWVzIG9ubHkgd2hlbiB0aGUKKwkJCQkJCSAgIFZMRCBmZWF0dXJlIGlzIGVuYWJsZWQKKwkJCQkJCSAgICovCisKKy8qCisgKiAtLS0gRldDTURfTUFDX1RZUEVfRU5VTSAtLS0KKyAqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSB0eXBlcyBvZiBNQUMgYWRkcmVzc2VzIGluIHRoZSBSWEYgTUFDIEFkZHJlc3MgVGFibGUuCisgKi8KKyNkZWZpbmUgTUFDX0FERFJFU1NfVFlQRV9TVE9SQUdFICAgICAgICAoMCkJLyogU3RvcmFnZSBNQUMgQWRkcmVzcyAqLworI2RlZmluZSBNQUNfQUREUkVTU19UWVBFX05FVFdPUksgICAgICAgICgxKQkvKiBOZXR3b3JrIE1BQyBBZGRyZXNzICovCisjZGVmaW5lIE1BQ19BRERSRVNTX1RZUEVfUEQgICAgICAgICAgICAgKDIpCS8qIFByb3RlY3Rpb24gRG9tYWluIE1BQyBBZGRyICovCisjZGVmaW5lIE1BQ19BRERSRVNTX1RZUEVfTUFOQUdFTUVOVCAgICAgKDMpCS8qIE1hbmFnbWVudCBNQUMgQWRkcmVzcyAqLworCisKKy8qIC0tLSBGV0NNRF9SSU5HX1RZUEVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX0VUSF9SWCAgICAgICAgICAoMSkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX0VUSF9SWF9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9FVEhfVFggICAgICAgICAgKDIpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9FVEhfVFhfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfSVNDU0lfV1JCUSAgICAgICgzKQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fSVNDU0lfV1JCUV9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9JU0NTSV9ERUZRICAgICAgKDQpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9JU0NTSV9ERUZRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX1RQTV9XUkJRICAgICAgICAoNSkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX1RQTV9XUkJRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX1RQTV9ERUZRICAgICAgICAoNikJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OVFBNX1RERUZRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX1RQTV9SUSAgICAgICAgICAoNykJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX1RQTV9SUV9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9NQ0MgICAgICAgICAgICAgKDgpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9NQ0NfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfQ1EgICAgICAgICAgICAgICg5KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fQ1FfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfRVEgICAgICAgICAgICAgICgxMCkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX0VRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX1FQICAgICAgICAgICAgICAoMTEpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX1JETUFfUVBfQ1JFQVRFLiAqLworCisKKy8qIC0tLSBFVEhfVFhfUklOR19UWVBFX0VOVU0gLS0tICovCisjZGVmaW5lIEVUSF9UWF9SSU5HX1RZUEVfRk9SV0FSRElORyAgICAgKDEpCS8qIEV0aGVybmV0IHJpbmcgZm9yCisJCQkJCQkgICBmb3J3YXJkaW5nIHBhY2tldHMgKi8KKyNkZWZpbmUgRVRIX1RYX1JJTkdfVFlQRV9TVEFOREFSRCAgICAgICAoMikJLyogRXRoZXJuZXQgcmluZyBmb3Igc2VuZGluZworCQkJCQkJICAgbmV0d29yayBwYWNrZXRzLiAqLworI2RlZmluZSBFVEhfVFhfUklOR19UWVBFX0JPVU5EICAgICAgICAgICgzKQkvKiBFdGhlcm5ldCByaW5nIGJvdW5kIHRvIHRoZQorCQkJCQkJICAgcG9ydCBzcGVjaWZpZWQgaW4gdGhlIGNvbW1hbmQKKwkJCQkJCSAgIGhlYWRlci5wb3J0X251bWJlciBmaWVsZC4KKwkJCQkJCSAgIFJpbmdzIG9mIHRoaXMgdHlwZSBhcmUKKwkJCQkJCSAgIE5PVCBzdWJqZWN0IHRvIHRoZQorCQkJCQkJICAgZmFpbG92ZXIgbG9naWMgaW1wbGVtZW50ZWQKKwkJCQkJCSAgIGluIHRoZSBCbGFkZUVuZ2luZS4KKwkJCQkJCSAgICovCisKKy8qIC0tLSBGV0NNRF9DT01NT05fUU9TX1RZUEVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUU9TX0JJVFNfTklDICAgICAgICAgICAgICAgICAgICAoMSkJLyogbWF4X2JpdHNfcGVyX3NlY29uZF9OSUMgKi8KKwkJCQkJCSAgLyogZmllbGQgaXMgdmFsaWQuICAqLworI2RlZmluZSBRT1NfUEtUU19OSUMgICAgICAgICAgICAgICAgICAgICgyKQkvKiBtYXhfcGFja2V0c19wZXJfc2Vjb25kX05JQyAqLworCQkJCQkJICAvKiBmaWVsZCBpcyB2YWxpZC4gICovCisjZGVmaW5lIFFPU19JT1BTX0lTQ1NJICAgICAgICAgICAgICAgICAgKDQpCS8qIG1heF9pb3NfcGVyX3NlY29uZF9pU0NTSSAqLworCQkJCQkJICAvKmZpZWxkIGlzIHZhbGlkLiAgKi8KKyNkZWZpbmUgUU9TX1ZMQU5fVEFHICAgICAgICAgICAgICAgICAgICAoOCkJLyogZG9tYWluX1ZMQU5fdGFnIGZpZWxkCisJCQkJCQkgICBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgUU9TX0ZBQlJJQ19JRCAgICAgICAgICAgICAgICAgICAoMTYpCS8qIGZhYnJpY19kb21haW5fSUQgZmllbGQKKwkJCQkJCSAgIGlzIHZhbGlkLiAqLworI2RlZmluZSBRT1NfT0VNX1BBUkFNUyAgICAgICAgICAgICAgICAgICgzMikJLyogcW9zX3BhcmFtc19vZW0gZmllbGQKKwkJCQkJCSAgIGlzIHZhbGlkLiAqLworI2RlZmluZSBRT1NfVFBVVF9JU0NTSSAgICAgICAgICAgICAgICAgICg2NCkJLyogbWF4X2J5dGVzX3Blcl9zZWNvbmRfaVNDU0kKKwkJCQkJCSAgIGZpZWxkICBpcyB2YWxpZC4gICovCisKKworLyoKKyAqIC0tLSBGQUlMT1ZFUl9DT05GSUdfRU5VTSAtLS0KKyAqIEZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZyB1c2VkIGluIEZXQ01EX0NPTU1PTl9GT1JDRV9GQUlMT1ZFUgorICovCisjZGVmaW5lIEZBSUxPVkVSX0NPTkZJR19OT19DSEFOR0UgICAgICAgKDApCS8qIE5vIGNoYW5nZSB0byBhdXRvbWF0aWMgKi8KKwkJCQkJCSAgLyogcG9ydCBmYWlsb3ZlciBzZXR0aW5nLiAqLworI2RlZmluZSBGQUlMT1ZFUl9DT05GSUdfT04gICAgICAgICAgICAgICgxKQkvKiBBdXRvbWF0aWMgcG9ydCBmYWlsb3ZlcgorCQkJCQkJICAgb24gbGluayBkb3duICBpcyBlbmFibGVkLiAqLworI2RlZmluZSBGQUlMT1ZFUl9DT05GSUdfT0ZGICAgICAgICAgICAgICgyKQkvKiBBdXRvbWF0aWMgcG9ydCBmYWlsb3ZlcgorCQkJCQkJICAgb24gbGluayBkb3duIGlzIGRpc2FibGVkLiAqLworCisvKgorICogLS0tIEZBSUxPVkVSX1BPUlRfRU5VTSAtLS0KKyAqIEZhaWxvdmVyIHBvcnQgc2V0dGluZyB1c2VkIGluIEZXQ01EX0NPTU1PTl9GT1JDRV9GQUlMT1ZFUgorICovCisjZGVmaW5lIEZBSUxPVkVSX1BPUlRfQSAgICAgICAgICAgICAgICAgKDApCS8qIFNlbGVjdHMgcG9ydCBBLiAqLworI2RlZmluZSBGQUlMT1ZFUl9QT1JUX0IgICAgICAgICAgICAgICAgICgxKQkvKiBTZWxlY3RzIHBvcnQgQi4gKi8KKyNkZWZpbmUgRkFJTE9WRVJfUE9SVF9OT05FICAgICAgICAgICAgICAoMTUpCS8qIE5vIHBvcnQgY2hhbmdlIHJlcXVlc3RlZC4gKi8KKworCisvKgorICogLS0tIE1HTVRfRkxBU0hST01fT1BDT0RFIC0tLQorICogRmxhc2ggUk9NIG9wZXJhdGlvbiBjb2RlCisgKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUENPREVfRkxBU0ggICAgICAoMSkJLyogQ29tbWl0IGRvd25sb2FkZWQgZGF0YQorCQkJCQkJICAgdG8gRmxhc2ggUk9NICovCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BDT0RFX1NBVkUgICAgICAgKDIpCS8qIFNhdmUgZG93bmxvYWRlZCBkYXRhIHRvCisJCQkJCQkgICBBUk0ncyBERFIgLSBkbyBub3QgZmxhc2ggKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUENPREVfQ0xFQVIgICAgICAoMykJLyogRXJhc2Ugc3BlY2lmaWVkIGNvbXBvbmVudAorCQkJCQkJICAgZnJvbSBGbGFzaFJPTSAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QQ09ERV9SRVBPUlQgICAgICg0KQkvKiBSZWFkIHNwZWNpZmllZCBjb21wb25lbnQKKwkJCQkJCSAgIGZyb20gRmxhc2ggUk9NICovCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BDT0RFX0lNQUdFX0lORk8gKDUpCS8qIFJldHVybnMgc2l6ZSBvZiBhCisJCQkJCQkgICBjb21wb25lbnQgKi8KKworLyoKKyAqIC0tLSBNR01UX0ZMQVNIUk9NX09QVFlQRSAtLS0KKyAqIEZsYXNoIFJPTSBvcGVyYXRpb24gdHlwZQorICovCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NPREVfRklSTVdBUkUgKDApCS8qIEluY2x1ZGVzIEFSTSBmaXJtd2FyZSwKKwkJCQkJCSAgIElQU2VjIChvcHRpb25hbCkgYW5kIEVQCisJCQkJCQkgICBmaXJtd2FyZSAgKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfQ09ERV9SRURCT09UICgxKQorI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9DT0RFX0JJT1MgICgyKQorI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9DT0RFX1BYRV9CSU9TICgzKQorI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9DT0RFX0NUUkxTICg0KQorI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9DRkdfSVBTRUMgICg1KQorI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9DRkdfSU5JICAgICg2KQorI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9ST01fT0ZGU0VUX1NQRUNJRklFRCAoNykKKworLyoKKyAqIC0tLSBGTEFTSFJPTV9UWVBFIC0tLQorICogRmxhc2ggUk9NIG1hbnVmYWN0dXJlcnMgc3VwcG9ydGVkIGluIHRoZSBmL3cKKyAqLworI2RlZmluZSBJTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTUEFOU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBNSUNST04gICAgICAgICAgICAgICAgICAgICAgICAgICgyKQorCisvKiAtLS0gRERSX0NBU19UWVBFIC0tLSAqLworI2RlZmluZSBDQVNfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDQVNfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDQVNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICgyKQorCisvKiAtLS0gRERSX1NJWkVfVFlQRSAtLS0gKi8KKyNkZWZpbmUgU0laRV8yNTZNQiAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0laRV81MTJNQiAgICAgICAgICAgICAgICAgICAgICAoMSkKKworLyogLS0tIEREUl9NT0RFX1RZUEUgLS0tICovCisjZGVmaW5lIEREUl9OT19FQ0MgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIEREUl9FQ0MgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisKKy8qIC0tLSBJTlRFUkZBQ0VfMTBHQl9UWVBFIC0tLSAqLworI2RlZmluZSBDWDRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBYRlBfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICgxKQorCisvKiAtLS0gQkVfQ0hJUF9NQVhfTVRVIC0tLSAqLworI2RlZmluZSBDSElQX01BWF9NVFUgICAgICAgICAgICAgICAgICAgICg5MDAwKQorCisvKiAtLS0gWEFVSV9TVEFURV9FTlVNIC0tLSAqLworI2RlZmluZSBYQVVJX1NUQVRFX0VOQUJMRSAgICAgICAgICAgICAgICgwKQkvKiBUaGlzIE1VU1QgYmUgdGhlIGRlZmF1bHQKKwkJCQkJCSAgIHZhbHVlIGZvciBhbGwgcmVxdWVzdHMKKwkJCQkJCSAgIHdoaWNoIHNldC9jaGFuZ2UKKwkJCQkJCSAgIGVxdWFsaXphdGlvbiBwYXJhbWV0ZXIuICAqLworI2RlZmluZSBYQVVJX1NUQVRFX0RJU0FCTEUgICAgICAgICAgICAgICgyNTUpCS8qIFRoZSBYQVVJIGZvciBib3RoIHBvcnRzCisJCQkJCQkgICBtYXkgYmUgZGlzYWJsZWQgZm9yIEVNSQorCQkJCQkJICAgdGVzdHMuIFRoZXJlIGlzIG5vCisJCQkJCQkgICBwcm92aXNpb24gZm9yIHR1cm5pbmcgb2ZmCisJCQkJCQkgICBpbmRpdmlkdWFsIHBvcnRzLgorCQkJCQkJICAgKi8KKy8qIC0tLSBCRV9BU0lDX1JFVklTSU9OIC0tLSAqLworI2RlZmluZSBCRV9BU0lDX1JFVl9BMCAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBCRV9BU0lDX1JFVl9BMSAgICAgICAgICAgICAgICAgICgyKQorCisjZW5kaWYgLyogX19md2NtZF9jb21tb25fYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9jb21tb25fYm1hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbl9ibWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwN2NmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9jb21tb25fYm1hcC5oCkBAIC0wLDAgKzEsNzE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfY29tbW9uX2JtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfY29tbW9uX2JtYXBfaF9fCisjaW5jbHVkZSAiZndjbWRfdHlwZXNfYm1hcC5oIgorI2luY2x1ZGUgImZ3Y21kX2hkcl9ibWFwLmgiCisKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyAgIC8qIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdHJ1Y3QgUEhZU19BRERSIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MzIgbG87CS8qIERXT1JEIDAgKi8KKwkJCXUzMiBoaTsJLyogRFdPUkQgMSAqLworCQl9IF9fcGFja2VkOwkvKiB1bm5hbWVkIHN0cnVjdCAqLworCQl1MzIgZHdbMl07CS8qIGR3b3JkIHVuaW9uICovCisJfTsJCQkvKiB1bm5hbWVkIHVuaW9uICovCit9IF9fcGFja2VkIDsKKworCisjZWxzZQorICAgLyogUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0cnVjdCBQSFlTX0FERFIgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsbzsJLyogRFdPUkQgMCAqLworCQkJdTMyIGhpOwkvKiBEV09SRCAxICovCisJCX0gX19wYWNrZWQ7CS8qIHVubmFtZWQgc3RydWN0ICovCisJCXUzMiBkd1syXTsJLyogZHdvcmQgdW5pb24gKi8KKwl9OwkJCS8qIHVubmFtZWQgdW5pb24gKi8KK30gX19wYWNrZWQgOworCitzdHJ1Y3QgQkVfTElOS19TVEFUVVMgeworCXU4IG1hYzBfZHVwbGV4OworCXU4IG1hYzBfc3BlZWQ7CisJdTggbWFjMV9kdXBsZXg7CisJdTggbWFjMV9zcGVlZDsKKwl1OCBtZ210X21hY19kdXBsZXg7CisJdTggbWdtdF9tYWNfc3BlZWQ7CisJdTggYWN0aXZlX3BvcnQ7CisJdTggcnN2ZDA7CisJdTggbWFjMF9mYXVsdDsKKwl1OCBtYWMxX2ZhdWx0OworCXUxNiByc3ZkMTsKK30gX19wYWNrZWQ7CisjZW5kaWYKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3MF9SRVFVRVNUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBMSU5LX1NUQVRVU19RVUVSWV9QQVJBTVMgeworCXN0cnVjdCBCRV9MSU5LX1NUQVRVUyByZXNwb25zZTsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcwX1JFUVVFU1QgcmVxdWVzdDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgUXVlcmllcyB0aGUgdGhlIGxpbmsgc3RhdHVzIGZvciBhbGwgcG9ydHMuICBUaGUgdmFsaWQgdmFsdWVzIGJlbG93CisgKiAgRE8gTk9UIGluZGljYXRlIHRoYXQgIGEgcGFydGljdWxhciBkdXBsZXggb3Igc3BlZWQgaXMgc3VwcG9ydGVkIGJ5CisgKiAgQmxhZGVFbmdpbmUuIFRoZXNlIGVudW1lcmF0aW9ucyBzaW1wbHkgIGxpc3QgYWxsIHBvc3NpYmxlIGR1cGxleGVzCisgKiAgYW5kIHNwZWVkcyBmb3IgYW55IHBvcnQuIENvbnN1bHQgQmxhZGVFbmdpbmUgcHJvZHVjdCAgZG9jdW1lbnRhdGlvbgorICogIGZvciB0aGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBMSU5LX1NUQVRVU19RVUVSWV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3MV9SRVFVRVNUIHsKKwl1OCB0eXBlOworCXU4IHBvcnQ7CisJdTggbWFjMTsKKwl1OCBwZXJtYW5lbnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcyX1JFU1BPTlNFIHsKKwlzdHJ1Y3QgTUFDX0FERFJFU1NfRk9STUFUIG1hYzsKK30gX19wYWNrZWQ7CisKK3VuaW9uIE5UV0tfTUFDX1FVRVJZX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3MV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3Ml9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFF1ZXJpZXMgb25lIE1BQyBhZGRyZXNzLiAgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NQUNfUVVFUlkgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gTlRXS19NQUNfUVVFUllfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBNQUNfU0VUX1BBUkFNU19JTiB7CisJdTggdHlwZTsKKwl1OCBwb3J0OworCXU4IG1hYzE7CisJdTggaW52YWxpZGF0ZTsKKwlzdHJ1Y3QgTUFDX0FERFJFU1NfRk9STUFUIG1hYzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBNQUNfU0VUX1BBUkFNU19PVVQgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIE1BQ19TRVRfUEFSQU1TIHsKKwlzdHJ1Y3QgTUFDX1NFVF9QQVJBTVNfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgTUFDX1NFVF9QQVJBTVNfT1VUIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogU2V0cyBhIE1BQyBhZGRyZXNzLiAgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NQUNfU0VUIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIE1BQ19TRVRfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKKy8qIE1BQyBhZGRyZXNzIGxpc3QuICovCitzdHJ1Y3QgTlRXS19NVUxUSUNBU1RfTUFDX0xJU1QgeworCXU4IGJ5dGVbNl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVF9SRVFVRVNUX1BBWUxPQUQgeworCXUxNiBudW1fbWFjOworCXU4IHByb21pc2N1b3VzOworCXU4IHJzdmQwOworCXN0cnVjdCBOVFdLX01VTFRJQ0FTVF9NQUNfTElTVCBtYWNbMzJdOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3NF9SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMTczX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVRfUkVRVUVTVF9QQVlMT0FEIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3NF9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgU2V0cyBtdWx0aWNhc3QgYWRkcmVzcyBoYXNoLiBUaGUgTVBVIHdpbGwgbWVyZ2UgdGhlIE1BQyBhZGRyZXNzIGxpc3RzCisgKiAgZnJvbSBhbGwgY2xpZW50cywgIGluY2x1ZGluZyB0aGUgbmV0d29ya2luZyBhbmQgc3RvcmFnZSBmdW5jdGlvbnMuCisgKiAgVGhpcyBjb21tYW5kIG1heSBmYWlsIGlmIHRoZSBmaW5hbCBtZXJnZWQgIGxpc3Qgb2YgTUFDIGFkZHJlc3NlcyBleGNlZWRzCisgKiAgMzIgZW50cmllcy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVQgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMTczX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfVkxBTl9DT05GSUdfUkVRVUVTVF9QQVlMT0FEIHsKKwl1MTYgbnVtX3ZsYW47CisJdTggcHJvbWlzY3VvdXM7CisJdTggcnN2ZDA7CisJdTE2IHZsYW5fdGFnWzMyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzZfUkVTUE9OU0UgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE3NV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19WTEFOX0NPTkZJR19SRVFVRVNUX1BBWUxPQUQgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTc2X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBTZXRzIFZMQU4gdGFnIGZpbHRlci4gVGhlIE1QVSB3aWxsIG1lcmdlIHRoZSBWTEFOIHRhZyBsaXN0IGZyb20gYWxsCisgKiAgY2xpZW50cywgaW5jbHVkaW5nICB0aGUgbmV0d29ya2luZyBhbmQgc3RvcmFnZSBmdW5jdGlvbnMuIFRoaXMgY29tbWFuZAorICogIG1heSBmYWlsIGlmIHRoZSBmaW5hbCB2bGFuX3RhZyBhcnJheSAgKGZyb20gYWxsIGZ1bmN0aW9ucykgaXMgbG9uZ2VyCisgKiAgdGhhbiAzMiBlbnRyaWVzLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfVkxBTl9DT05GSUcgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMTc1X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgUklOR19ERVNUUk9ZX1JFUVVFU1QgeworCXUxNiByaW5nX3R5cGU7CisJdTE2IGlkOworCXU4IGJ5cGFzc19mbHVzaDsKKwl1OCByc3ZkMDsKKwl1MTYgcnN2ZDE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTkwX1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xODlfUEFSQU1TIHsKKwlzdHJ1Y3QgUklOR19ERVNUUk9ZX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTkwX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKy8qCisgKiAgQ29tbWFuZCBmb3IgZGVzdHJveWluZyBhbnkgcmluZy4gVGhlIGNvbm5lY3Rpb24ocykgdXNpbmcgdGhlIHJpbmcgc2hvdWxkCisgKiAgYmUgcXVpZXNjZWQgIGJlZm9yZSBkZXN0cm95aW5nIHRoZSByaW5nLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX1JJTkdfREVTVFJPWSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xODlfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTJfUkVRVUVTVCB7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgcnN2ZDA7CisJc3RydWN0IENRX0NPTlRFWFRfQU1BUCBjb250ZXh0OworCXN0cnVjdCBQSFlTX0FERFIgcGFnZXNbNF07Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5M19SRVNQT05TRSB7CisJdTE2IGNxX2lkOworfSBfX3BhY2tlZCA7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE5MV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTJfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTNfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkIDsKKworLyoKKyAqICBDb21tYW5kIGZvciBjcmVhdGluZyBhIGNvbXBsZXRpb24gcXVldWUuIEEgQ29tcGxldGlvbiBRdWV1ZSBtdXN0IHNwYW4KKyAqICBhdCBsZWFzdCAxIHBhZ2UgYW5kICBhdCBtb3N0IDQgcGFnZXMuIEVhY2ggY29tcGxldGlvbiBxdWV1ZSBlbnRyeQorICogIGlzIDE2IGJ5dGVzIHJlZ2FyZGxlc3Mgb2YgQ1EgZW50cnkgZm9ybWF0LiAgVGh1cyB0aGUgcmluZyBtdXN0IGJlCisgKiAgYXQgbGVhc3QgMjU2IGVudHJpZXMgZGVlcCAoY29ycmVzcG9uZGluZyB0byAxIHBhZ2UpIGFuZCBjYW4gYmUgYXQKKyAqICAgbW9zdCAxMDI0IGVudHJpZXMgZGVlcCAoY29ycmVzcG9uZGluZyB0byA0IHBhZ2VzKS4gVGhlIG51bWJlciBvZgorICogIHBhZ2VzIHBvc3RlZCBtdXN0ICBjb250YWluIHRoZSBDUSByaW5nIHNpemUgYXMgZW5jb2RlZCBpbiB0aGUgY29udGV4dC4KKyAqCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fQ1FfQ1JFQVRFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE5MV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOThfUkVRVUVTVCB7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgcnN2ZDA7CisJc3RydWN0IEVRX0NPTlRFWFRfQU1BUCBjb250ZXh0OworCXN0cnVjdCBQSFlTX0FERFIgcGFnZXNbOF07Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5OV9SRVNQT05TRSB7CisJdTE2IGVxX2lkOworfSBfX3BhY2tlZCA7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE5N19QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOThfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTlfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkIDsKKworLyoKKyAqICBDb21tYW5kIGZvciBjcmVhdGluZyBhIGV2ZW50IHF1ZXVlLiBBbiBFdmVudCBRdWV1ZSBtdXN0IHNwYW4gYXQgbGVhc3QKKyAqICAxIHBhZ2UgYW5kIGF0IG1vc3QgIDggcGFnZXMuIFRoZSBudW1iZXIgb2YgcGFnZXMgcG9zdGVkIG11c3QgY29udGFpbgorICogIHRoZSBFUSByaW5nLiBUaGUgcmluZyBpcyBkZWZpbmVkIGJ5ICB0aGUgc2l6ZSBvZiB0aGUgRVEgZW50cmllcyAoZW5jb2RlZAorICogIGluIHRoZSBjb250ZXh0KSBhbmQgdGhlIG51bWJlciBvZiBFUSBlbnRyaWVzIChhbHNvICBlbmNvZGVkIGluIHRoZQorICogIGNvbnRleHQpLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0VRX0NSRUFURSB7CisJdW5pb24gIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMTk3X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwMV9SRVFVRVNUIHsKKwl1MTYgY3FfaWQ7CisJdTE2IGJjbWNfY3FfaWQ7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgcnN2ZDA7CisJc3RydWN0IFBIWVNfQUREUiBwYWdlc1syXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMDJfUkVTUE9OU0UgeworCXUxNiBpZDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIwMF9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMDFfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMDJfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIENvbW1hbmQgZm9yIGNyZWF0aW5nIEV0aGVybmV0IHJlY2VpdmUgcmluZy4gIEFuIEVSWCByaW5nIGNvbnRhaW5zIEVUSF9SWF9ECisgKiAgZW50cmllcyAoOCAgYnl0ZXMgZWFjaCkuIEFuIEVSWCByaW5nIG11c3QgYmUgMTAyNCBlbnRyaWVzIGRlZXAKKyAqICAoY29ycmVzcG9uZGluZyB0byAyIHBhZ2VzKS4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9FVEhfUlhfQ1JFQVRFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIwMF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwNF9SRVFVRVNUIHsKKwl1MTYgbnVtX3BhZ2VzOworCXU4IHVscF9udW07CisJdTggdHlwZTsKKwlzdHJ1Y3QgRVRYX0NPTlRFWFRfQU1BUCBjb250ZXh0OworCXN0cnVjdCBQSFlTX0FERFIgcGFnZXNbOF07Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwNV9SRVNQT05TRSB7CisJdTE2IGNpZDsKKwl1OCB1bHBfbnVtOworCXU4IHJzdmQwOworfSBfX3BhY2tlZCA7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIwM19QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMDRfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMDVfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkIDsKKworLyoKKyAqICBDb21tYW5kIGZvciBjcmVhdGluZyBhbiBFdGhlcm5ldCB0cmFuc21pdCByaW5nLiAgQW4gRVRYIHJpbmcgY29udGFpbnMKKyAqICBFVEhfV1JCIGVudHJpZXMgKDE2ICBieXRlcyBlYWNoKS4gQW4gRVRYIHJpbmcgbXVzdCBiZSBhdCBsZWFzdCAyNTYKKyAqICBlbnRyaWVzIGRlZXAgKGNvcnJlc3BvbmRpbmcgdG8gMSBwYWdlKSAgYW5kIGF0IG1vc3QgMmsgZW50cmllcyBkZWVwCisgKiAgKGNvcnJlc3BvbmRpbmcgdG8gOCBwYWdlcykuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fRVRIX1RYX0NSRUFURSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMDNfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjIyX1JFUVVFU1QgeworCXUxNiBudW1fcGFnZXM7CisJdTE2IHJzdmQwOworCXN0cnVjdCBNQ0NfUklOR19DT05URVhUX0FNQVAgY29udGV4dDsKKwlzdHJ1Y3QgUEhZU19BRERSIHBhZ2VzWzhdOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMjNfUkVTUE9OU0UgeworCXUxNiBpZDsKK30gX19wYWNrZWQgOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMjFfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjIyX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjIzX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZCA7CisKKy8qCisgKiAgQ29tbWFuZCBmb3IgY3JlYXRpbmcgdGhlIE1DQyByaW5nLiBBbiBNQ0MgcmluZyBtdXN0IGJlIGF0IGxlYXN0IDE2CisgKiAgZW50cmllcyBkZWVwICAoY29ycmVzcG9uZGluZyB0byAxIHBhZ2UpIGFuZCBhdCBtb3N0IDEyOCBlbnRyaWVzIGRlZXAKKyAqICAoY29ycmVzcG9uZGluZyB0byA4IHBhZ2VzKS4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9NQ0NfQ1JFQVRFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIyMV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBHRVRfUU9TX0lOIHsKKwl1MzIgcW9zX3BhcmFtc19yc3ZkOworfSBfX3BhY2tlZDsKKworc3RydWN0IEdFVF9RT1NfT1VUIHsKKwl1MzIgbWF4X2JpdHNfcGVyX3NlY29uZF9OSUM7CisJdTMyIG1heF9wYWNrZXRzX3Blcl9zZWNvbmRfTklDOworCXUzMiBtYXhfaW9zX3Blcl9zZWNvbmRfaVNDU0k7CisJdTMyIG1heF9ieXRlc19wZXJfc2Vjb25kX2lTQ1NJOworCXUxNiBkb21haW5fVkxBTl90YWc7CisJdTE2IGZhYnJpY19kb21haW5fSUQ7CisJdTMyIHFvc19wYXJhbXNfb2VtWzRdOworfSBfX3BhY2tlZDsKKwordW5pb24gR0VUX1FPU19QQVJBTVMgeworCXN0cnVjdCBHRVRfUU9TX0lOIHJlcXVlc3Q7CisJc3RydWN0IEdFVF9RT1NfT1VUIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogUU9TL0JhbmR3aWR0aCBzZXR0aW5ncyBwZXIgZG9tYWluLiBBcHBsaWNhYmxlIG9ubHkgaW4gVk1zLiAgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fR0VUX1FPUyB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBHRVRfUU9TX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgU0VUX1FPU19JTiB7CisJdTMyIHZhbGlkX2ZsYWdzOworCXUzMiBtYXhfYml0c19wZXJfc2Vjb25kX05JQzsKKwl1MzIgbWF4X3BhY2tldHNfcGVyX3NlY29uZF9OSUM7CisJdTMyIG1heF9pb3NfcGVyX3NlY29uZF9pU0NTSTsKKwl1MzIgbWF4X2J5dGVzX3Blcl9zZWNvbmRfaVNDU0k7CisJdTE2IGRvbWFpbl9WTEFOX3RhZzsKKwl1MTYgZmFicmljX2RvbWFpbl9JRDsKKwl1MzIgcW9zX3BhcmFtc19vZW1bNF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgU0VUX1FPU19PVVQgeworCXUzMiBxb3NfcGFyYW1zX3JzdmQ7Cit9IF9fcGFja2VkOworCit1bmlvbiBTRVRfUU9TX1BBUkFNUyB7CisJc3RydWN0IFNFVF9RT1NfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgU0VUX1FPU19PVVQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBRT1MvQmFuZHdpZHRoIHNldHRpbmdzIHBlciBkb21haW4uIEFwcGxpY2FibGUgb25seSBpbiBWTXMuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfUU9TIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIFNFVF9RT1NfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBTRVRfRlJBTUVfU0laRV9JTiB7CisJdTMyIG1heF90eF9mcmFtZV9zaXplOworCXUzMiBtYXhfcnhfZnJhbWVfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBTRVRfRlJBTUVfU0laRV9PVVQgeworCXUzMiBjaGlwX21heF90eF9mcmFtZV9zaXplOworCXUzMiBjaGlwX21heF9yeF9mcmFtZV9zaXplOworfSBfX3BhY2tlZDsKKwordW5pb24gU0VUX0ZSQU1FX1NJWkVfUEFSQU1TIHsKKwlzdHJ1Y3QgU0VUX0ZSQU1FX1NJWkVfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgU0VUX0ZSQU1FX1NJWkVfT1VUIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogU2V0IGZyYW1lIHNpemUgY29tbWFuZC4gT25seSBob3N0IGRvbWFpbiBtYXkgaXNzdWUgdGhpcyBjb21tYW5kLiAgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fU0VUX0ZSQU1FX1NJWkUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gU0VUX0ZSQU1FX1NJWkVfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGT1JDRV9GQUlMT1ZFUl9JTiB7CisJdTMyIG1vdmVfdG9fcG9ydDsKKwl1MzIgZmFpbG92ZXJfY29uZmlnOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIzMV9SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjMwX1BBUkFNUyB7CisJc3RydWN0IEZPUkNFX0ZBSUxPVkVSX0lOIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIzMV9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVXNlIHRoaXMgY29tbWFuZCB0byBjb250cm9sIGZhaWxvdmVyIGluIEJsYWRlRW5naW5lLiBJdCBtYXkgYmUgdXNlZAorICogIHRvIGZhaWxiYWNrIHRvIGEgIHJlc3RvcmVkIHBvcnQgb3IgdG8gZm9yY2libHkgbW92ZSB0cmFmZmljIGZyb20KKyAqICBvbmUgcG9ydCB0byBhbm90aGVyLiBJdCBtYXkgYWxzbyBiZSB1c2VkICB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUKKyAqICBhdXRvbWF0aWMgZmFpbG92ZXIgZmVhdHVyZS4gVGhpcyBjb21tYW5kIGNhbiBvbmx5IGJlIGlzc3VlZCBieSAgZG9tYWluCisgKiAgMC4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9GT1JDRV9GQUlMT1ZFUiB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMzBfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDBfUkVRVUVTVCB7CisJdTY0IGNvbnRleHQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQxX1JFU1BPTlNFIHsKKwl1NjQgY29udGV4dDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIzOV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDBfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDFfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBieSBjbGllbnRzIGFzIGEgbm8tb3BlcmF0aW9uIHJlcXVlc3QuIFR5cGljYWwKKyAqICB1c2VzIGZvciBkcml2ZXJzICBhcmUgYXMgYSBoZWFydGJlYXQgbWVjaGFuaXNtLCBvciBkZWZlcnJlZCBwcm9jZXNzaW5nCisgKiAgY2F0YWx5c3QuIFRoZSBBUk0gd2lsbCBhbHdheXMgIGNvbXBsZXRlIHRoaXMgY29tbWFuZCB3aXRoIGEgZ29vZCBjb21wbGV0aW9uLgorICogIFRoZSA2NC1iaXQgcGFyYW1ldGVyIGlzIG5vdCB0b3VjaGVkIGJ5IHRoZSAgQVJNIHByb2Nlc3Nvci4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OT1AgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjM5X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgTlRXS19SWF9GSUxURVJfU0VUVElOR1MgeworCXU4IHByb21pc2N1b3VzOworCXU4IGlwX2Nrc3VtOworCXU4IHRjcF9ja3N1bTsKKwl1OCB1ZHBfY2tzdW07CisJdTggcGFzc19lcnI7CisJdTggcGFzc19ja2VycjsKKwl1OCBzdHJpcF9jcmM7CisJdTggbWNhc3RfZW47CisJdTggYmNhc3RfZW47CisJdTggbWNhc3RfcHJvbWlzY3VvdXNfZW47CisJdTggdW5pY2FzdF9lbjsKKwl1OCB2bGFuX3Byb21pc2N1b3VzOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQyX1BBUkFNUyB7CisJc3RydWN0IE5UV0tfUlhfRklMVEVSX1NFVFRJTkdTIHJlcXVlc3Q7CisJc3RydWN0IE5UV0tfUlhfRklMVEVSX1NFVFRJTkdTIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBtb2RpZnkgdGhlIGV0aGVybmV0IHJlY2VpdmUgZmlsdGVyIGNvbmZpZ3VyYXRpb24uCisgKiAgT25seSBkb21haW4gMCAgbmV0d29yayBmdW5jdGlvbiBkcml2ZXJzIG1heSBpc3N1ZSB0aGlzIGNvbW1hbmQuIFRoZQorICogIGFwcGxpZWQgY29uZmlndXJhdGlvbiBpcyByZXR1cm5lZCBpbiAgdGhlIHJlc3BvbnNlIHBheWxvYWQuIE5vdGU6CisgKiAgU29tZSByZWNlaXZlIHBhY2tldCBmaWx0ZXIgc2V0dGluZ3MgYXJlIGdsb2JhbCBvbiAgQmxhZGVFbmdpbmUgYW5kCisgKiAgY2FuIGFmZmVjdCBib3RoIHRoZSBzdG9yYWdlIGFuZCBuZXR3b3JrIGZ1bmN0aW9uIGNsaWVudHMgdGhhdCB0aGUKKyAqICAgQmxhZGVFbmdpbmUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHNlcnZlLiBBZGRpdGlvbmFseSwgZGVwZW5kaW5nCisgKiAgb24gdGhlIHJldmlzaW9uIG9mICBCbGFkZUVuZ2luZSwgc29tZSBldGhlcm5ldCByZWNlaXZlIGZpbHRlciBzZXR0aW5ncworICogIGFyZSBkZXBlbmRlbnQgb24gb3RoZXJzLiBJZiBhICBkZXBlbmRlbmN5IGV4aXN0cyBiZXR3ZWVuIHNldHRpbmdzCisgKiAgZm9yIHRoZSBCbGFkZUVuZ2luZSByZXZpc2lvbiwgYW5kIHRoZSBjb21tYW5kIHJlcXVlc3QgIHNldHRpbmdzIGRvCisgKiAgbm90IG1lZXQgdGhlIGRlcGVuZGVuY3kgcmVxdWlyZW1lbnQsIHRoZSBpbnZhbGlkIHNldHRpbmdzIHdpbGwgbm90CisgKiAgYmUgIGFwcGxpZWQgZGVzcGl0ZSB0aGUgY29tYW5kIHN1Y2NlZWRpbmcuIEZvciBleGFtcGxlOiBhIGRyaXZlciBtYXkKKyAqICByZXF1ZXN0IHRvIGVuYWJsZSAgYnJvYWRjYXN0IHBhY2tldHMsIGJ1dCBub3QgZW5hYmxlIG11bHRpY2FzdCBwYWNrZXRzLgorICogIE9uIGVhcmx5IHJldmlzaW9ucyBvZiBCbGFkZUVuZ2luZSwgIHRoZXJlIG1heSBiZSBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuCisgKiAgYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgZmlsdGVycywgc28gYnJvYWRjYXN0IGNvdWxkICBub3QgYmUgZW5hYmxlZAorICogIHdpdGhvdXQgZW5hYmxpbmcgbXVsdGljYXN0LiBJbiB0aGlzIHNjZW5hcmlvLCB0aGUgY29tYW5kIHdvdWxkIHN0aWxsCisgKiAgIHN1Y2NlZWQsIGJ1dCB0aGUgcmVzcG9uc2UgcGF5bG9hZCB3b3VsZCBpbmRpY2F0ZSB0aGUgcHJldmlvdXNseQorICogIGNvbmZpZ3VyZWQgYnJvYWRjYXN0ICBhbmQgbXVsdGljYXN0IHNldHRpbmcuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19SWF9GSUxURVIgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQyX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDRfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEIHsKKwl1OCBmaXJtd2FyZV92ZXJzaW9uX3N0cmluZ1szMl07CisJdTggZndfb25fZmxhc2hfdmVyc2lvbl9zdHJpbmdbMzJdOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQzX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0NF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogVGhpcyBjb21hbmQgcmV0cmlldmVzIHRoZSBmaXJtd2FyZSB2ZXJzaW9uLiAgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT04geworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQzX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ2X1JFUVVFU1QgeworCXUxNiB0eF9mbG93X2NvbnRyb2w7CisJdTE2IHJ4X2Zsb3dfY29udHJvbDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDdfUkVTUE9OU0UgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0NV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDZfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDdfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tYW5kIGlzIHVzZWQgdG8gcHJvZ3JhbSBCbGFkZUVuZ2luZSBmbG93IGNvbnRyb2wgYmVoYXZpb3IuCisgKiAgT25seSB0aGUgaG9zdCAgbmV0d29ya2luZyBkcml2ZXIgaXMgYWxsb3dlZCB0byB1c2UgdGhpcyBjb21hbmQuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fU0VUX0ZMT1dfQ09OVFJPTCB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDVfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDlfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI1MF9SRVNQT05TRSB7CisJdTE2IHR4X2Zsb3dfY29udHJvbDsKKwl1MTYgcnhfZmxvd19jb250cm9sOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQ4X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0OV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI1MF9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFRoaXMgY29tYW5kIGlzIHVzZWQgdG8gcmVhZCBCbGFkZUVuZ2luZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRkxPV19DT05UUk9MIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0OF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEVRX0RFTEFZX1BBUkFNUyB7CisJdTMyIGVxX2lkOworCXUzMiBkZWxheV9pbl9taWNyb3NlY29uZHM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjU3X1JFUVVFU1QgeworCXUzMiBudW1fZXE7CisJdTMyIHJzdmQwOworCXN0cnVjdCBFUV9ERUxBWV9QQVJBTVMgZGVsYXlbMTZdOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI1OF9SRVNQT05TRSB7CisJdTMyIGRlbGF5X3Jlc29sdXRpb25faW5fbWljcm9zZWNvbmRzOworCXUzMiBkZWxheV9tYXhfaW5fbWljcm9zZWNvbmRzOworfSBfX3BhY2tlZDsKKwordW5pb24gTU9ESUZZX0VRX0RFTEFZX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI1N19SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI1OF9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFRoaXMgY29tYW5kIGNoYW5nZXMgdGhlIEVRIGRlbGF5IGZvciBhIGdpdmVuIHNldCBvZiBFUXMuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9NT0RJRllfRVFfREVMQVkgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gTU9ESUZZX0VRX0RFTEFZX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjYwX1JFUVVFU1QgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBCRV9GSVJNV0FSRV9DT05GSUcgeworCXUxNiBiZV9jb25maWdfbnVtYmVyOworCXUxNiBhc2ljX3JldmlzaW9uOworCXUzMiBuaWNfdWxwX21hc2s7CisJdTMyIHR1bHBfbWFzazsKKwl1MzIgaXNjc2lfdWxwX21hc2s7CisJdTMyIHJkbWFfdWxwX21hc2s7CisJdTMyIHJzdmQwWzRdOworCXUzMiBldGhfdHhfaWRfc3RhcnQ7CisJdTMyIGV0aF90eF9pZF9jb3VudDsKKwl1MzIgZXRoX3J4X2lkX3N0YXJ0OworCXUzMiBldGhfcnhfaWRfY291bnQ7CisJdTMyIHRwbV93cmJxX2lkX3N0YXJ0OworCXUzMiB0cG1fd3JicV9pZF9jb3VudDsKKwl1MzIgdHBtX2RlZnFfaWRfc3RhcnQ7CisJdTMyIHRwbV9kZWZxX2lkX2NvdW50OworCXUzMiBpc2NzaV93cmJxX2lkX3N0YXJ0OworCXUzMiBpc2NzaV93cmJxX2lkX2NvdW50OworCXUzMiBpc2NzaV9kZWZxX2lkX3N0YXJ0OworCXUzMiBpc2NzaV9kZWZxX2lkX2NvdW50OworCXUzMiByZG1hX3FwX2lkX3N0YXJ0OworCXUzMiByZG1hX3FwX2lkX2NvdW50OworCXUzMiByc3ZkMVs4XTsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI1OV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjBfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBCRV9GSVJNV0FSRV9DT05GSUcgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tYW5kIHF1ZXJpZXMgdGhlIGN1cnJlbnQgZmlybXdhcmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorICogICBUaGUgc3RhdGljICBjb25maWd1cmF0aW9uIHR5cGUgaXMgZGVmaW5lZCBieSBiZV9jb25maWdfbnVtYmVyLiBUaGlzCisgKiAgZGlmZmVyZW50aWF0ZXMgZGlmZmVyZW50ICBCbGFkZUVuZ2luZSBidWlsZHMsIHN1Y2ggYXMgaVNDU0kgSW5pdGlhdG9yCisgKiAgdmVyc3VzIGlTQ1NJIFRhcmdldC4gIEZvciBhIGdpdmVuIHN0YXRpYyAgY29uZmlndXJhdGlvbiwgdGhlIFVwcGVyCisgKiAgTGF5ZXIgUHJvdG9jb2wgKFVMUCkgcHJvY2Vzc29ycyBtYXkgYmUgcmVjb25maWd1cmVkIHRvIHN1cHBvcnQgIGRpZmZlcmVudAorICogIHByb3RvY29scy4gRWFjaCBVTFAgcHJvY2Vzc29yIHN1cHBvcnRzIG9uZSBvciBtb3JlIHByb3RvY29scy4gVGhlCisgKiAgbWFza3MgIGluZGljYXRlIHdoaWNoIHByb2Nlc3NvcnMgYXJlIGNvbmZpZ3VyZWQgZm9yIGVhY2ggcHJvdG9jb2wuCisgKiAgIEZvciBhIGdpdmVuIHN0YXRpYyAgY29uZmlndXJhdGlvbiwgdGhlIG51bWJlciBvZiBUQ1AgY29ubmVjdGlvbnMKKyAqICBzdXBwb3J0ZWQgZm9yIGVhY2ggcHJvdG9jb2wgbWF5IHZhcnkuIFRoZSAgKl9pZF9zdGFydCBhbmQgKl9pZF9jb3VudAorICogIHZhcmlhYmxlcyBkZWZpbmUgYSBsaW5lYXIgcmFuZ2Ugb2YgSURzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgIGVhY2gKKyAqICBzdXBwb3J0ZWQgcHJvdG9jb2wuIFRoZSAqX2lkX2NvdW50IG1heSBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIgdG8gYWxsb2NhdGUKKyAqICB0aGUgIGFwcHJvcHJpYXRlIG51bWJlciBvZiBjb25uZWN0aW9uIHJlc291cmNlcy4gVGhlICpfaWRfc3RhcnQgbWF5CisgKiAgYmUgdXNlZCB0byBtYXAgdGhlICBhcmJpdHJhcnkgcmFuZ2Ugb2YgSURzIHRvIGEgemVyby1iYXNlZCByYW5nZQorICogIG9mIGluZGljZXMuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fRklSTVdBUkVfQ09ORklHIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI1OV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9QT1JUX0VRVUFMSVpBVElPTl9QQVJBTVMgeworCXUzMiBlbXBoX2xldl9zZWxfcG9ydDA7CisJdTMyIGVtcGhfbGV2X3NlbF9wb3J0MTsKKwl1OCB4YXVpX3ZvX3NlbDsKKwl1OCB4YXVpX3N0YXRlOworCXUxNiByc3ZkMDsKKwl1MzIgeGF1aV9lcV92ZWN0b3I7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjYyX1JFUVVFU1QgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI2MV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjJfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fUE9SVF9FUVVBTElaQVRJT05fUEFSQU1TIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBUaGlzIGNvbWFuZCBjYW4gYmUgdXNlZCB0byByZWFkIFhBVUkgZXF1YWxpemF0aW9uIHBhcmFtZXRlcnMuIFRoZQorICogIEFSTSBmaXJtd2FyZSBhcHBsaWVzICBkZWZhdWx0IGVxdWFsaXphdGlvbiBwYXJhbWV0ZXJzIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqICBUaGVzZSBwYXJhbWV0ZXJzIG1heSBiZSAgY3VzdG9tZXItc3BlY2lmaWMgd2hlbiBkZXJpdmVkIGZyb20gdGhlCisgKiAgU0VFUFJPTS4gU2VlIFNFRVBST01fREFUQSBmb3IgZXF1YWxpemF0aW9uICBzcGVjaWZpYyBmaWVsZHMuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fR0VUX1BPUlRfRVFVQUxJWkFUSU9OIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI2MV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI2NF9SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjYzX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9QT1JUX0VRVUFMSVpBVElPTl9QQVJBTVMgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjY0X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBUaGlzIGNvbWFuZCBjYW4gYmUgdXNlZCB0byBzZXQgWEFVSSBlcXVhbGl6YXRpb24gcGFyYW1ldGVycy4gVGhlIEFSTQorICogIGZpcm13YXJlIGFwcGxpZXMgIGRlZmF1bHQgZXF1YWxpemF0aW9uIHBhcmFtZXRlcnMgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICogIFRoZXNlIHBhcmFtZXRlcnMgbWF5IGJlICBjdXN0b21lci1zcGVjaWZpYyB3aGVuIGRlcml2ZWQgZnJvbSB0aGUKKyAqICBTRUVQUk9NLiBTZWUgU0VFUFJPTV9EQVRBIGZvciBlcXVhbGl6YXRpb24gIHNwZWNpZmljIGZpZWxkcy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfUE9SVF9FUVVBTElaQVRJT04geworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjYzX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19md2NtZF9jb21tb25fYm1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9ldGhfYm1hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2V0aF9ibWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0YjE3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9ldGhfYm1hcC5oCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfZXRoX2JtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfZXRoX2JtYXBfaF9fCisjaW5jbHVkZSAiZndjbWRfaGRyX2JtYXAuaCIKKyNpbmNsdWRlICJmd2NtZF90eXBlc19ibWFwLmgiCisKK3N0cnVjdCBNSUJfRVRIX1NUQVRJU1RJQ1NfUEFSQU1TX0lOIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgQkVfUlhGX1NUQVRTIHsKKwl1MzIgcDByZWN2ZHRvdGFsYnl0ZXNMU0Q7CS8qIERXT1JEIDAgKi8KKwl1MzIgcDByZWN2ZHRvdGFsYnl0ZXNNU0Q7CS8qIERXT1JEIDEgKi8KKwl1MzIgcDByZWN2ZHRvdGFsZnJhbWVzOwkvKiBEV09SRCAyICovCisJdTMyIHAwcmVjdmR1bmljYXN0ZnJhbWVzOwkvKiBEV09SRCAzICovCisJdTMyIHAwcmVjdmRtdWx0aWNhc3RmcmFtZXM7CS8qIERXT1JEIDQgKi8KKwl1MzIgcDByZWN2ZGJyb2FkY2FzdGZyYW1lczsJLyogRFdPUkQgNSAqLworCXUzMiBwMGNyY2Vycm9yczsJLyogRFdPUkQgNiAqLworCXUzMiBwMGFsaWdubWVudHN5bWVycnM7CS8qIERXT1JEIDcgKi8KKwl1MzIgcDBwYXVzZWZyYW1lc3JlY3ZkOwkvKiBEV09SRCA4ICovCisJdTMyIHAwY29udHJvbGZyYW1lc3JlY3ZkOwkvKiBEV09SRCA5ICovCisJdTMyIHAwaW5yYW5nZWxlbmVycm9yczsJLyogRFdPUkQgMTAgKi8KKwl1MzIgcDBvdXRyYW5nZWVycm9yczsJLyogRFdPUkQgMTEgKi8KKwl1MzIgcDBmcmFtZXRvb2xvbmdlcnJvcnM7CS8qIERXT1JEIDEyICovCisJdTMyIHAwZHJvcHBlZGFkZHJlc3NtYXRjaDsJLyogRFdPUkQgMTMgKi8KKwl1MzIgcDBkcm9wcGVkdmxhbm1pc21hdGNoOwkvKiBEV09SRCAxNCAqLworCXUzMiBwMGlwZHJvcHBlZHRvb3NtYWxsOwkvKiBEV09SRCAxNSAqLworCXUzMiBwMGlwZHJvcHBlZHRvb3Nob3J0OwkvKiBEV09SRCAxNiAqLworCXUzMiBwMGlwZHJvcHBlZGhkcnRvb3NtYWxsOwkvKiBEV09SRCAxNyAqLworCXUzMiBwMHRjcGRyb3BwZWRsZW47CS8qIERXT1JEIDE4ICovCisJdTMyIHAwZHJvcHBlZHJ1bnQ7CS8qIERXT1JEIDE5ICovCisJdTMyIHAwcmVjdmQ2NDsJCS8qIERXT1JEIDIwICovCisJdTMyIHAwcmVjdmQ2NV8xMjc7CS8qIERXT1JEIDIxICovCisJdTMyIHAwcmVjdmQxMjhfMjU2OwkvKiBEV09SRCAyMiAqLworCXUzMiBwMHJlY3ZkMjU2XzUxMTsJLyogRFdPUkQgMjMgKi8KKwl1MzIgcDByZWN2ZDUxMl8xMDIzOwkvKiBEV09SRCAyNCAqLworCXUzMiBwMHJlY3ZkMTUxOF8xNTIyOwkvKiBEV09SRCAyNSAqLworCXUzMiBwMHJlY3ZkMTUyMl8yMDQ3OwkvKiBEV09SRCAyNiAqLworCXUzMiBwMHJlY3ZkMjA0OF80MDk1OwkvKiBEV09SRCAyNyAqLworCXUzMiBwMHJlY3ZkNDA5Nl84MTkxOwkvKiBEV09SRCAyOCAqLworCXUzMiBwMHJlY3ZkODE5Ml85MjE2OwkvKiBEV09SRCAyOSAqLworCXUzMiBwMHJjdmRpcGNrc21lcnJzOwkvKiBEV09SRCAzMCAqLworCXUzMiBwMHJlY3ZkdGNwY2tzbWVycnM7CS8qIERXT1JEIDMxICovCisJdTMyIHAwcmVjdmR1ZHBja3NtZXJyczsJLyogRFdPUkQgMzIgKi8KKwl1MzIgcDByZWN2ZG5vbnJzc3BhY2tldHM7CS8qIERXT1JEIDMzICovCisJdTMyIHAwcmVjdmRpcHBhY2tldHM7CS8qIERXT1JEIDM0ICovCisJdTMyIHAwcmVjdmRjaHV0ZTFwYWNrZXRzOwkvKiBEV09SRCAzNSAqLworCXUzMiBwMHJlY3ZkY2h1dGUycGFja2V0czsJLyogRFdPUkQgMzYgKi8KKwl1MzIgcDByZWN2ZGNodXRlM3BhY2tldHM7CS8qIERXT1JEIDM3ICovCisJdTMyIHAwcmVjdmRpcHNlY3BhY2tldHM7CS8qIERXT1JEIDM4ICovCisJdTMyIHAwcmVjdmRtYW5hZ2VtZW50cGFja2V0czsJLyogRFdPUkQgMzkgKi8KKwl1MzIgcDB4bWl0Ynl0ZXNsc2Q7CS8qIERXT1JEIDQwICovCisJdTMyIHAweG1pdGJ5dGVzbXNkOwkvKiBEV09SRCA0MSAqLworCXUzMiBwMHhtaXR1bmljYXN0ZnJhbWVzOwkvKiBEV09SRCA0MiAqLworCXUzMiBwMHhtaXRtdWx0aWNhc3RmcmFtZXM7CS8qIERXT1JEIDQzICovCisJdTMyIHAweG1pdGJyb2FkY2FzdGZyYW1lczsJLyogRFdPUkQgNDQgKi8KKwl1MzIgcDB4bWl0cGF1c2VmcmFtZXM7CS8qIERXT1JEIDQ1ICovCisJdTMyIHAweG1pdGNvbnRyb2xmcmFtZXM7CS8qIERXT1JEIDQ2ICovCisJdTMyIHAweG1pdDY0OwkJLyogRFdPUkQgNDcgKi8KKwl1MzIgcDB4bWl0NjVfMTI3OwkvKiBEV09SRCA0OCAqLworCXUzMiBwMHhtaXQxMjhfMjU2OwkvKiBEV09SRCA0OSAqLworCXUzMiBwMHhtaXQyNTZfNTExOwkvKiBEV09SRCA1MCAqLworCXUzMiBwMHhtaXQ1MTJfMTAyMzsJLyogRFdPUkQgNTEgKi8KKwl1MzIgcDB4bWl0MTUxOF8xNTIyOwkvKiBEV09SRCA1MiAqLworCXUzMiBwMHhtaXQxNTIyXzIwNDc7CS8qIERXT1JEIDUzICovCisJdTMyIHAweG1pdDIwNDhfNDA5NTsJLyogRFdPUkQgNTQgKi8KKwl1MzIgcDB4bWl0NDA5Nl84MTkxOwkvKiBEV09SRCA1NSAqLworCXUzMiBwMHhtaXQ4MTkyXzkyMTY7CS8qIERXT1JEIDU2ICovCisJdTMyIHAwcnhmaWZvb3ZlcmZsb3dkcm9wcGVkOwkvKiBEV09SRCA1NyAqLworCXUzMiBwMGlwc2VjbG9va3VwZmFpbGVkZHJvcHBlZDsJLyogRFdPUkQgNTggKi8KKwl1MzIgcDFyZWN2ZHRvdGFsYnl0ZXNMU0Q7CS8qIERXT1JEIDU5ICovCisJdTMyIHAxcmVjdmR0b3RhbGJ5dGVzTVNEOwkvKiBEV09SRCA2MCAqLworCXUzMiBwMXJlY3ZkdG90YWxmcmFtZXM7CS8qIERXT1JEIDYxICovCisJdTMyIHAxcmVjdmR1bmljYXN0ZnJhbWVzOwkvKiBEV09SRCA2MiAqLworCXUzMiBwMXJlY3ZkbXVsdGljYXN0ZnJhbWVzOwkvKiBEV09SRCA2MyAqLworCXUzMiBwMXJlY3ZkYnJvYWRjYXN0ZnJhbWVzOwkvKiBEV09SRCA2NCAqLworCXUzMiBwMWNyY2Vycm9yczsJLyogRFdPUkQgNjUgKi8KKwl1MzIgcDFhbGlnbm1lbnRzeW1lcnJzOwkvKiBEV09SRCA2NiAqLworCXUzMiBwMXBhdXNlZnJhbWVzcmVjdmQ7CS8qIERXT1JEIDY3ICovCisJdTMyIHAxY29udHJvbGZyYW1lc3JlY3ZkOwkvKiBEV09SRCA2OCAqLworCXUzMiBwMWlucmFuZ2VsZW5lcnJvcnM7CS8qIERXT1JEIDY5ICovCisJdTMyIHAxb3V0cmFuZ2VlcnJvcnM7CS8qIERXT1JEIDcwICovCisJdTMyIHAxZnJhbWV0b29sb25nZXJyb3JzOwkvKiBEV09SRCA3MSAqLworCXUzMiBwMWRyb3BwZWRhZGRyZXNzbWF0Y2g7CS8qIERXT1JEIDcyICovCisJdTMyIHAxZHJvcHBlZHZsYW5taXNtYXRjaDsJLyogRFdPUkQgNzMgKi8KKwl1MzIgcDFpcGRyb3BwZWR0b29zbWFsbDsJLyogRFdPUkQgNzQgKi8KKwl1MzIgcDFpcGRyb3BwZWR0b29zaG9ydDsJLyogRFdPUkQgNzUgKi8KKwl1MzIgcDFpcGRyb3BwZWRoZHJ0b29zbWFsbDsJLyogRFdPUkQgNzYgKi8KKwl1MzIgcDF0Y3Bkcm9wcGVkbGVuOwkvKiBEV09SRCA3NyAqLworCXUzMiBwMWRyb3BwZWRydW50OwkvKiBEV09SRCA3OCAqLworCXUzMiBwMXJlY3ZkNjQ7CQkvKiBEV09SRCA3OSAqLworCXUzMiBwMXJlY3ZkNjVfMTI3OwkvKiBEV09SRCA4MCAqLworCXUzMiBwMXJlY3ZkMTI4XzI1NjsJLyogRFdPUkQgODEgKi8KKwl1MzIgcDFyZWN2ZDI1Nl81MTE7CS8qIERXT1JEIDgyICovCisJdTMyIHAxcmVjdmQ1MTJfMTAyMzsJLyogRFdPUkQgODMgKi8KKwl1MzIgcDFyZWN2ZDE1MThfMTUyMjsJLyogRFdPUkQgODQgKi8KKwl1MzIgcDFyZWN2ZDE1MjJfMjA0NzsJLyogRFdPUkQgODUgKi8KKwl1MzIgcDFyZWN2ZDIwNDhfNDA5NTsJLyogRFdPUkQgODYgKi8KKwl1MzIgcDFyZWN2ZDQwOTZfODE5MTsJLyogRFdPUkQgODcgKi8KKwl1MzIgcDFyZWN2ZDgxOTJfOTIxNjsJLyogRFdPUkQgODggKi8KKwl1MzIgcDFyY3ZkaXBja3NtZXJyczsJLyogRFdPUkQgODkgKi8KKwl1MzIgcDFyZWN2ZHRjcGNrc21lcnJzOwkvKiBEV09SRCA5MCAqLworCXUzMiBwMXJlY3ZkdWRwY2tzbWVycnM7CS8qIERXT1JEIDkxICovCisJdTMyIHAxcmVjdmRub25yc3NwYWNrZXRzOwkvKiBEV09SRCA5MiAqLworCXUzMiBwMXJlY3ZkaXBwYWNrZXRzOwkvKiBEV09SRCA5MyAqLworCXUzMiBwMXJlY3ZkY2h1dGUxcGFja2V0czsJLyogRFdPUkQgOTQgKi8KKwl1MzIgcDFyZWN2ZGNodXRlMnBhY2tldHM7CS8qIERXT1JEIDk1ICovCisJdTMyIHAxcmVjdmRjaHV0ZTNwYWNrZXRzOwkvKiBEV09SRCA5NiAqLworCXUzMiBwMXJlY3ZkaXBzZWNwYWNrZXRzOwkvKiBEV09SRCA5NyAqLworCXUzMiBwMXJlY3ZkbWFuYWdlbWVudHBhY2tldHM7CS8qIERXT1JEIDk4ICovCisJdTMyIHAxeG1pdGJ5dGVzbHNkOwkvKiBEV09SRCA5OSAqLworCXUzMiBwMXhtaXRieXRlc21zZDsJLyogRFdPUkQgMTAwICovCisJdTMyIHAxeG1pdHVuaWNhc3RmcmFtZXM7CS8qIERXT1JEIDEwMSAqLworCXUzMiBwMXhtaXRtdWx0aWNhc3RmcmFtZXM7CS8qIERXT1JEIDEwMiAqLworCXUzMiBwMXhtaXRicm9hZGNhc3RmcmFtZXM7CS8qIERXT1JEIDEwMyAqLworCXUzMiBwMXhtaXRwYXVzZWZyYW1lczsJLyogRFdPUkQgMTA0ICovCisJdTMyIHAxeG1pdGNvbnRyb2xmcmFtZXM7CS8qIERXT1JEIDEwNSAqLworCXUzMiBwMXhtaXQ2NDsJCS8qIERXT1JEIDEwNiAqLworCXUzMiBwMXhtaXQ2NV8xMjc7CS8qIERXT1JEIDEwNyAqLworCXUzMiBwMXhtaXQxMjhfMjU2OwkvKiBEV09SRCAxMDggKi8KKwl1MzIgcDF4bWl0MjU2XzUxMTsJLyogRFdPUkQgMTA5ICovCisJdTMyIHAxeG1pdDUxMl8xMDIzOwkvKiBEV09SRCAxMTAgKi8KKwl1MzIgcDF4bWl0MTUxOF8xNTIyOwkvKiBEV09SRCAxMTEgKi8KKwl1MzIgcDF4bWl0MTUyMl8yMDQ3OwkvKiBEV09SRCAxMTIgKi8KKwl1MzIgcDF4bWl0MjA0OF80MDk1OwkvKiBEV09SRCAxMTMgKi8KKwl1MzIgcDF4bWl0NDA5Nl84MTkxOwkvKiBEV09SRCAxMTQgKi8KKwl1MzIgcDF4bWl0ODE5Ml85MjE2OwkvKiBEV09SRCAxMTUgKi8KKwl1MzIgcDFyeGZpZm9vdmVyZmxvd2Ryb3BwZWQ7CS8qIERXT1JEIDExNiAqLworCXUzMiBwMWlwc2VjbG9va3VwZmFpbGVkZHJvcHBlZDsJLyogRFdPUkQgMTE3ICovCisJdTMyIHB4ZHJvcHBlZG5vcGJ1ZjsJLyogRFdPUkQgMTE4ICovCisJdTMyIHB4ZHJvcHBlZG5vdHhwYjsJLyogRFdPUkQgMTE5ICovCisJdTMyIHB4ZHJvcHBlZG5vaXBzZWNidWY7CS8qIERXT1JEIDEyMCAqLworCXUzMiBweGRyb3BwZWRub2VyeGRlc2NyOwkvKiBEV09SRCAxMjEgKi8KKwl1MzIgcHhkcm9wcGVkbm90cHJlZGVzY3I7CS8qIERXT1JEIDEyMiAqLworCXUzMiBweHJlY3ZkbWFuYWdlbWVudHBvcnRwYWNrZXRzOwkvKiBEV09SRCAxMjMgKi8KKwl1MzIgcHhyZWN2ZG1hbmFnZW1lbnRwb3J0Ynl0ZXM7CS8qIERXT1JEIDEyNCAqLworCXUzMiBweHJlY3ZkbWFuYWdlbWVudHBvcnRwYXVzZWZyYW1lczsJLyogRFdPUkQgMTI1ICovCisJdTMyIHB4cmVjdmRtYW5hZ2VtZW50cG9ydGVycm9yczsJLyogRFdPUkQgMTI2ICovCisJdTMyIHB4eG1pdG1hbmFnZW1lbnRwb3J0cGFja2V0czsJLyogRFdPUkQgMTI3ICovCisJdTMyIHB4eG1pdG1hbmFnZW1lbnRwb3J0Ynl0ZXM7CS8qIERXT1JEIDEyOCAqLworCXUzMiBweHhtaXRtYW5hZ2VtZW50cG9ydHBhdXNlOwkvKiBEV09SRCAxMjkgKi8KKwl1MzIgcHh4bWl0bWFuYWdlbWVudHBvcnRyeGZpZm9vdmVyZmxvdzsJLyogRFdPUkQgMTMwICovCisJdTMyIHB4cmVjdmRpcHNlY2lwY2tzbWVycnM7CS8qIERXT1JEIDEzMSAqLworCXUzMiBweHJlY3ZkdGNwc2VjaXBja3NtZXJyczsJLyogRFdPUkQgMTMyICovCisJdTMyIHB4cmVjdmR1ZHBzZWNpcGNrc21lcnJzOwkvKiBEV09SRCAxMzMgKi8KKwl1MzIgcHhpcHNlY3J1bnQ7CS8qIERXT1JEIDEzNCAqLworCXUzMiBweGlwc2VjYWRkcmVzc21pc21hdGNoZHJvcHBlZDsJLyogRFdPUkQgMTM1ICovCisJdTMyIHB4aXBzZWNyeGZpZm9vdmVyZmxvd2Ryb3BwZWQ7CS8qIERXT1JEIDEzNiAqLworCXUzMiBweGlwc2VjZnJhbWVzdG9vbG9uZzsJLyogRFdPUkQgMTM3ICovCisJdTMyIHB4aXBzZWN0b3RhbGlwZnJhbWVzOwkvKiBEV09SRCAxMzggKi8KKwl1MzIgcHhpcHNlY2lwdG9vc21hbGw7CS8qIERXT1JEIDEzOSAqLworCXUzMiBweGlwc2VjaXB0b29zaG9ydDsJLyogRFdPUkQgMTQwICovCisJdTMyIHB4aXBzZWNpcGhkcnRvb3NtYWxsOwkvKiBEV09SRCAxNDEgKi8KKwl1MzIgcHhpcHNlY3RjcGhkcmJhZDsJLyogRFdPUkQgMTQyICovCisJdTMyIHB4cmVjdmRpcHNlY2NodXRlMTsJLyogRFdPUkQgMTQzICovCisJdTMyIHB4cmVjdmRpcHNlY2NodXRlMjsJLyogRFdPUkQgMTQ0ICovCisJdTMyIHB4cmVjdmRpcHNlY2NodXRlMzsJLyogRFdPUkQgMTQ1ICovCisJdTMyIHB4ZHJvcHBlZDdmcmFnczsJLyogRFdPUkQgMTQ2ICovCisJdTMyIHB4ZHJvcHBlZGZyYWdzOwkvKiBEV09SRCAxNDcgKi8KKwl1MzIgcHhkcm9wcGVkaW52YWxpZGZyYWdyaW5nOwkvKiBEV09SRCAxNDggKi8KKwl1MzIgcHhudW1mb3J3YXJkZWRwYWNrZXRzOwkvKiBEV09SRCAxNDkgKi8KK30gX19wYWNrZWQ7CisKK3VuaW9uIE1JQl9FVEhfU1RBVElTVElDU19QQVJBTVMgeworCXN0cnVjdCBNSUJfRVRIX1NUQVRJU1RJQ1NfUEFSQU1TX0lOIHJlcXVlc3Q7CisJc3RydWN0IEJFX1JYRl9TVEFUUyByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgUXVlcnkgZXRoZXJuZXQgc3RhdGlzdGljcy4gQWxsIGRvbWFpbnMgbWF5IGlzc3VlIHRoaXMgY29tbWFuZC4gVGhlCisgKiAgaG9zdCBkb21haW4gZHJpdmVycyAgbWF5IG9wdGlvbmFsbHkgcmVzZXQgaW50ZXJuYWwgc3RhdGlzdGljIGNvdW50ZXJzCisgKiAgd2l0aCBhIHF1ZXJ5LgorICovCitzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIE1JQl9FVEhfU1RBVElTVElDU19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworCitzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc1X1JFUVVFU1QgeworCXU4IHBvcnQwX3Byb21pc2N1b3VzOworCXU4IHBvcnQxX3Byb21pc2N1b3VzOworCXUxNiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzZfUkVTUE9OU0UgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0VUSF9BTk9OXzE3NF9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzVfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzZfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBFbmFibGVzL0Rpc2FibGVzIHByb21pc2N1b3VzIGV0aGVybmV0IHJlY2VpdmUgbW9kZS4gICovCitzdHJ1Y3QgRldDTURfRVRIX1BST01JU0NVT1VTIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0VUSF9BTk9OXzE3NF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3OF9SRVFVRVNUIHsKKwl1MzIgbmV3X2ZyYWdzaXplX2xvZzI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc5X1JFU1BPTlNFIHsKKwl1MzIgYWN0dWFsX2ZyYWdzaXplX2xvZzI7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9FVEhfQU5PTl8xNzdfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc4X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc5X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBTZXRzIHRoZSBFdGhlcm5ldCBSWCBmcmFnbWVudCBzaXplLiBPbmx5IGhvc3QgKGRvbWFpbiAwKSBuZXR3b3JraW5nCisgKiAgZHJpdmVycyBtYXkgaXNzdWUgIHRoaXMgY29tbWFuZC4gIFRoaXMgY2FsbCB3aWxsIGZhaWwgZm9yIG5vbi1ob3N0CisgKiAgcHJvdGVjdGlvbiBkb21haW5zLiBJbiB0aGlzIHNpdHVhdGlvbiB0aGUgIE1DQyBDUSBzdGF0dXMgd2lsbCBpbmRpY2F0ZQorICogIGEgZmFpbHVyZSBkdWUgdG8gaW5zdWZmaWNpZW50IHByaXZpbGVkZ2VzLiBUaGUgcmVzcG9uc2UgIHNob3VsZCBiZQorICogIGlnbm9yZWQsIGFuZCB0aGUgZHJpdmVyIHNob3VsZCB1c2UgdGhlIEZXQ01EX0VUSF9HRVRfRlJBR19TSVpFIHRvCisgKiAgcXVlcnkgdGhlICBleGlzdGluZyBldGhlcm5ldCByZWNlaXZlIGZyYWdtZW50IHNpemUuIEl0IG11c3QgdXNlIHRoaXMKKyAqICBmcmFnbWVudCBzaXplIGZvciBhbGwgIGZyYWdtZW50cyBpbiB0aGUgZXRoZXJuZXQgcmVjZWl2ZSByaW5nLiAgSWYKKyAqICB0aGUgY29tbWFuZCBzdWNjZWVkcywgdGhlIGRyaXZlciBtdXN0IHVzZSB0aGUgIGZyYWcgc2l6ZSBpbmRpY2F0ZWQKKyAqICBpbiB0aGUgY29tbWFuZCByZXNwb25zZSBzaW5jZSB0aGUgcmVxdWVzdGVkIGZyYWcgc2l6ZSBtYXkgbm90IGJlICBhcHBsaWVkCisgKiAgdW50aWwgdGhlIG5leHQgcmVib290LiBXaGVuIHRoZSByZXF1ZXN0ZWQgZnJhZ3NpemUgbWF0Y2hlcyB0aGUgcmVzcG9uc2UKKyAqICAgZnJhZ3NpemUsIHRoaXMgaW5kaWNhdGVzIHRoZSByZXF1ZXN0IHdhcyBhcHBsaWVkIGltbWVkaWF0ZWx5LgorICovCitzdHJ1Y3QgRldDTURfRVRIX1NFVF9SWF9GUkFHX1NJWkUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfRVRIX0FOT05fMTc3X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTgxX1JFUVVFU1QgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xODJfUkVTUE9OU0UgeworCXUzMiBhY3R1YWxfZnJhZ3NpemVfbG9nMjsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0VUSF9BTk9OXzE4MF9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9FVEhfQU5PTl8xODFfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9FVEhfQU5PTl8xODJfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFF1ZXJpZXMgdGhlIEV0aGVybmV0IFJYIGZyYWdtZW50IHNpemUuIEFsbCBkb21haW5zIG1heSBpc3N1ZSB0aGlzCisgKiAgY29tbWFuZC4gIFRoZSBkcml2ZXIgIHNob3VsZCBjYWxsIHRoaXMgY29tbWFuZCB0byBkZXRlcm1pbmUgdGhlIG1pbmltdW0KKyAqICByZXF1aXJlZCBmcmFnbWVudCBzaXplIGZvciB0aGUgZXRoZXJuZXQgIFJYIHJpbmcgYnVmZmVycy4gRHJpdmVycworICogIG1heSBjaG9vc2UgdG8gdXNlIGEgbGFyZ2VyIHNpemUgZm9yIGVhY2ggZnJhZ21lbnQgYnVmZmVyLCBidXQgIEJsYWRlRW5naW5lCisgKiAgd2lsbCB1c2UgdXAgdG8gdGhlIGNvbmZpZ3VyZWQgbWluaW11bSByZXF1aXJlZCBmcmFnc2l6ZSBpbiBlYWNoIGV0aGVybmV0CisgKiAgIHJlY2VpdmUgZnJhZ21lbnQgYnVmZmVyLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGV0aGVybmV0IHJlY2VpdmUgZnJhZ21lbnQKKyAqICBzaXplIGlzICBjb25maWd1cmVkIHRvIDRrQiwgYW5kIGEgZHJpdmVyIHVzZXMgOGtCIGZyYWdtZW50cywgYSA2a0IKKyAqICBldGhlcm5ldCBwYWNrZXQgcmVjZWl2ZWQgYnkgIEJsYWRlRW5naW5lIHdpbGwgYmUgc3BsaXQgYWNjcm9zcyB0d28KKyAqICBvZiB0aGUgZHJpdmVyJ3MgcmVjZWl2ZSBmcmFtZ2VudHMgKDRrQiBpbiBvbmUgIGZyYWdtZW50IGJ1ZmZlciwgYW5kCisgKiAgMmtCIGluIHRoZSBzdWJzZXF1ZW50IGZyYWdtZW50IGJ1ZmZlcikuCisgKi8KK3N0cnVjdCBGV0NNRF9FVEhfR0VUX1JYX0ZSQUdfU0laRSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9FVEhfQU5PTl8xODBfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX2Z3Y21kX2V0aF9ibWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2hkcl9ibWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfaGRyX2JtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI0NTMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2hkcl9ibWFwLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Z3Y21kX2hkcl9ibWFwX2hfXworI2RlZmluZSBfX2Z3Y21kX2hkcl9ibWFwX2hfXworCitzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgeworCXU4IG9wY29kZTsKKwl1OCBzdWJzeXN0ZW07CisJdTggcG9ydF9udW1iZXI7CisJdTggZG9tYWluOworCXUzMiB0aW1lb3V0OworCXUzMiByZXF1ZXN0X2xlbmd0aDsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfUkVTUE9OU0VfSEVBREVSIHsKKwl1OCBvcGNvZGU7CisJdTggc3Vic3lzdGVtOworCXU4IHJzdmQwOworCXU4IGRvbWFpbjsKKwl1OCBzdGF0dXM7CisJdTggYWRkaXRpb25hbF9zdGF0dXM7CisJdTE2IHJzdmQxOworCXUzMiByZXNwb25zZV9sZW5ndGg7CisJdTMyIGFjdHVhbF9yZXNwb25zZV9sZW5ndGg7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoZSBmaXJtd2FyZS9kcml2ZXIgb3ZlcndyaXRlcyB0aGUgaW5wdXQgRldDTURfUkVRVUVTVF9IRUFERVIgd2l0aAorICogIHRoZSBvdXRwdXQgIEZXQ01EX1JFU1BPTlNFX0hFQURFUi4KKyAqLwordW5pb24gRldDTURfSEVBREVSIHsKKwlzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfUkVTUE9OU0VfSEVBREVSIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworI2VuZGlmIC8qIF9fZndjbWRfaGRyX2JtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfbWNjLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfbWNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlY2E4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9tY2MuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfbWNjX2FtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfbWNjX2FtYXBfaF9fCisjaW5jbHVkZSAiZndjbWRfb3Bjb2Rlcy5oIgorLyoKKyAqIFdoZXJlIGFwcGxpY2FibGUsIGEgV1JCLCBtYXkgY29udGFpbiBhIGxpc3Qgb2YgU2NhdHRlci1nYXRoZXIgZWxlbWVudHMuCisgKiBFYWNoIGVsZW1lbnQgc3VwcG9ydHMgYSA2NCBiaXQgYWRkcmVzcyBhbmQgYSAzMmJpdCBsZW5ndGggZmllbGQuCisgKi8KK3N0cnVjdCBCRV9NQ0NfU0dFX0FNQVAgeworCXU4IHBhX2xvWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHBhX2hpWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IGxlbmd0aFszMl07CS8qIERXT1JEIDIgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX1NHRV9BTUFQIHsKKwl1MzIgZHdbM107Cit9OworLyoKKyAqIFRoZSBkZXNpZ24gb2YgYW4gTUNDX1NHRSBhbGxvd3MgdXAgdG8gMTkgZWxlbWVudHMgdG8gYmUgZW1iZWRkZWQKKyAqIGluIGEgV1JCLCBzdXBwb3J0aW5nIDY0S0IgZGF0YSB0cmFuc2ZlcnMgKGFzc3VtaW5nIGEgNEtCIHBhZ2Ugc2l6ZSkuCisgKi8KK3N0cnVjdCBCRV9NQ0NfV1JCX1BBWUxPQURfQU1BUCB7CisJdW5pb24geworCQlzdHJ1Y3QgQkVfTUNDX1NHRV9BTUFQIHNnbFsxOV07CisJCXU4IGVtYmVkZGVkWzU5XVszMl07CS8qIERXT1JEIDAgKi8KKwl9OworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfV1JCX1BBWUxPQURfQU1BUCB7CisJdTMyIGR3WzU5XTsKK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE1DQyBDb21tYW5kIFdSQiBmb3IgY29tbWFuZHMKKyAqIHNlbnQgdG8gdGhlIE1hbmFnZW1lbnQgUHJvY2Vzc2luZyBVbml0IChNUFUpLiBTZWUgc2VjdGlvbgorICogZm9yIHVzYWdlIGluIGVtYmVkZGVkIGFuZCBub24tZW1iZWRkZWQgbW9kZXMuCisgKi8KK3N0cnVjdCBCRV9NQ0NfV1JCX0FNQVAgeworCXU4IGVtYmVkZGVkOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMl07CS8qIERXT1JEIDAgKi8KKwl1OCBzZ2VfY291bnRbNV07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBzcGVjaWFsWzhdOwkvKiBEV09SRCAwICovCisJdTggcGF5bG9hZF9sZW5ndGhbMzJdOwkvKiBEV09SRCAxICovCisJdTggdGFnWzJdWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgNCAqLworCXN0cnVjdCBCRV9NQ0NfV1JCX1BBWUxPQURfQU1BUCBwYXlsb2FkOworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfV1JCX0FNQVAgeworCXUzMiBkd1s2NF07Cit9OworCisvKiAgVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBNQ0MgQ29tcGxldGlvbiBxdWV1ZSBlbnRyeSAgKi8KK3N0cnVjdCBCRV9NQ0NfQ1FfRU5UUllfQU1BUCB7CisJdTggY29tcGxldGlvbl9zdGF0dXNbMTZdOwkvKiBEV09SRCAwICovCisJdTggZXh0ZW5kZWRfc3RhdHVzWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IG1jY190YWdbMl1bMzJdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDBbMjddOwkvKiBEV09SRCAzICovCisJdTggY29uc3VtZWQ7CS8qIERXT1JEIDMgKi8KKwl1OCBjb21wbGV0ZWQ7CS8qIERXT1JEIDMgKi8KKwl1OCBocGlfYnVmZmVyX2NvbXBsZXRpb247CS8qIERXT1JEIDMgKi8KKwl1OCBhc3luY19ldmVudDsJLyogRFdPUkQgMyAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworLyogTWFpbGJveCBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIE1QVSBkdXJpbmcgYm9vdHN0cmFwICovCitzdHJ1Y3QgQkVfTUNDX01BSUxCT1hfQU1BUCB7CisJc3RydWN0IEJFX01DQ19XUkJfQU1BUCB3cmI7CisJc3RydWN0IEJFX01DQ19DUV9FTlRSWV9BTUFQIGNxOworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfTUFJTEJPWF9BTUFQIHsKKwl1MzIgZHdbNjhdOworfTsKKworI2VuZGlmIC8qIF9fZndjbWRfbWNjX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfb3Bjb2Rlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX29wY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Q1NjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX29wY29kZXMuaApAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Z3Y21kX29wY29kZXNfYW1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9vcGNvZGVzX2FtYXBfaF9fCisKKy8qCisgKiAtLS0gRldDTURfU1VCU1lTVEVNUyAtLS0KKyAqIFRoZSBjb21tYW5kcyBhcmUgZ3JvdXBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc3Vic3lzdGVtcy4gVGhlIHN1YnN5c3RlbQorICogY29kZSBhbG9uZyB3aXRoIHRoZSBvcGNvZGUgdW5pcXVlbHkgaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIGZ3Y21kLgorICovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9SU1ZEICAoMCkJLyogVGhpcyBzdWJzeXN0ZW0gaXMgcmVzZXJ2ZWQuIEl0IGlzICovCisJCQkJCQkgIC8qIG5ldmVyIHVzZWQuICovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9DT01NT04gKDEpCS8qIENNRHMgaW4gdGhpcyBncm91cCBhcmUgY29tbW9uIHRvCisJCQkJCSogYWxsIHN1YnN5c3RlbXMuIFNlZQorCQkJCQkqIENPTU1PTl9TVUJTWVNURU1fT1BDT0RFUyBmb3Igb3Bjb2RlcworCQkJCQkqIGFuZCBDb21tb24gSG9zdCBDb25maWd1cmF0aW9uIENNRHMKKwkJCQkJKiBmb3IgdGhlIEZXQ01EIGRlc2NyaXB0aW9ucy4KKwkJCQkJKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX0NPTU1PTl9JU0NTSSAgICAoMikgLyogQ01EcyBpbiB0aGlzIGdyb3VwIGFyZSAqLworCQkJCQkvKgorCQkJCQkqIGNvbW1vbiB0byBJbml0aWF0b3IgYW5kIFRhcmdldC4gU2VlCisJCQkJCSogQ09NTU9OX0lTQ1NJX1NVQlNZU1RFTV9PUENPREVTIGFuZAorCQkJCQkqIENvbW1vbiBpU0NTSSBJbml0aWF0b3IgYW5kIFRhcmdldAorCQkJCQkqIENNRHMgZm9yIHRoZSBjb21tYW5kIGRlc2NyaXB0aW9ucy4KKwkJCQkJKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX0VUSCAgICAgICAgICAgICAoMykJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZCB0bworCQkJCQkJZXhlY3V0ZSAgRXRoZXJuZXQgY29tbWFuZHMuICAqLworCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9UUE0gICAgICAgICAgICAgKDQpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQKKwkJCQkJCSB0byBleGVjdXRlIFRQTSAgY29tbWFuZHMuICAqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fUFhFX1VOREkgICAgICAgICg1KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkCisJCQkJCQkqIHRvIGV4ZWN1dGUgUFhFCisJCQkJCQkqIGFuZCBVTkRJIHNwZWNpZmljIGNvbW1hbmRzLgorCQkJCQkJKi8KKworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fSVNDU0lfSU5JICAgICAgICg2KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkIHRvCisJCQkJCQlleGVjdXRlIElTQ1NJIEluaXRpYXRvcgorCQkJCQkJc3BlY2lmaWMgY29tbWFuZHMuCisJCQkJCQkqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fSVNDU0lfVEdUICAgICAgICg3KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkCisJCQkJCQl0byBleGVjdXRlIGlTQ1NJIFRhcmdldAorCQkJCQkJc3BlY2lmaWMgY29tbWFuZHMuYmV0d2VlbgorCQkJCQkJUFRMIGFuZCBBUk0gZmlybXdhcmUuCisJCQkJCQkqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fTUlMSV9QVEwgICAgICAgICg4KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkIHRvCisJCQkJCQlleGVjdXRlIGlTQ1NJIFRhcmdldCBzcGVjaWZpYworCQkJCQkJY29tbWFuZHMuYmV0d2VlbiBNSUxJCisJCQkJCQlhbmQgUFRMLiAgKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX01JTElfVE1EICAgICAgICAoOSkJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZCB0bworCQkJCQkJZXhlY3V0ZSBpU0NTSSBUYXJnZXQgc3BlY2lmaWMKKwkJCQkJCWNvbW1hbmRzIGJldHdlZW4gTUlMSQorCQkJCQkJYW5kIFRNRC4gICovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9QUk9YWSAgICAgICAgICAgKDExKQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkCisJCQkJCQl0byBleGVjdXRlIHByb3hpZWQgY29tbWFuZHMKKwkJCQkJCXdpdGhpbiB0aGUgaG9zdCBhdCB0aGUKKwkJCQkJCWV4cGxpY2l0IHJlcXVlc3Qgb2YgYQorCQkJCQkJbm9uIHByaXZpbGVkZ2VkIGRvbWFpbi4KKwkJCQkJCVRoaXMgJ3N1YnN5c3RlbScgaXMgZW50aXJlbHkKKwkJCQkJCXZpcnR1YWwgZnJvbSB0aGUgY29udHJvbGxlcgorCQkJCQkJYW5kIGZpcm13YXJlIHBlcnNwZWN0aXZlIGFzCisJCQkJCQlpdCBpcyBpbXBsZW1lbnRlZCBpbiBob3N0CisJCQkJCQlkcml2ZXJzLgorCQkJCQkJKi8KKworLyoKKyAqIC0tLSBDT01NT05fU1VCU1lTVEVNX09QQ09ERVMgLS0tCisgKiBUaGVzZSBvcGNvZGVzIGFyZSBjb21tb24gdG8gYm90aCBuZXR3b3JraW5nIGFuZCBzdG9yYWdlIFBDSQorICogZnVuY3Rpb25zLiBUaGV5IGFyZSB1c2VkIHRvIHJlc2VydmUgcmVzb3VyY2VzIGFuZCBjb25maWd1cmUKKyAqIEJsYWRlRW5naW5lLiBUaGVzZSBvcGNvZGVzIGFsbCB1c2UgdGhlIEZXQ01EX1NVQlNZU1RFTV9DT01NT04KKyAqIHN1YnN5c3RlbSBjb2RlLgorICovCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19NQUNfUVVFUlkgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19NQUNfUVVFUlkgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19NQUNfU0VUICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05UV0tfVkxBTl9DT05GSUcgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9SRUFEX0ZMQVNIUk9NICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9XUklURV9GTEFTSFJPTSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9RVUVSWV9NQVhfRldDTURfQlVGRkVSX1NJWkUgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fQUREX1BBR0VfVEFCTEVTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1JFTU9WRV9QQUdFX1RBQkxFUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9SSU5HX0RFU1RST1kgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9DUV9DUkVBVEUgICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9FUV9DUkVBVEUgICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9FVEhfUlhfQ1JFQVRFICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9FVEhfVFhfQ1JFQVRFICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9JU0NTSV9ERUZRX0NSRUFURSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9JU0NTSV9XUkJRX0NSRUFURSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9NQ0NfQ1JFQVRFICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9KRUxMX0NPTkZJRyAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9GT1JDRV9GQUlMT1ZFUiAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9BRERfVEVNUExBVEVfSEVBREVSX0JVRkZFUlMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUkVNT1ZFX1RFTVBMQVRFX0hFQURFUl9CVUZGRVJTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1BPU1RfWkVST19CVUZGRVIgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX1FPUyAgICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VUX1FPUyAgICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fVENQX0dFVF9TVEFUSVNUSUNTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFRVBST01fUkVBRCAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1RDUF9TVEFURV9RVUVSWSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05PUCAgICAgICAgICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05UV0tfUlhfRklMVEVSICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9GV19WRVJTSU9OICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFVF9GTE9XX0NPTlRST0wgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX0ZMT1dfQ09OVFJPTCAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRVRfVENQX1BBUkFNRVRFUlMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VUX0ZSQU1FX1NJWkUgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX0ZBVCAgICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTU9ESUZZX0VRX0RFTEFZICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9FTkFCTEVfRElTQUJMRV9ET01BSU5TICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9ET01BSU5fQ09ORklHICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFVF9WTERfQ09ORklHICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9WTERfQ09ORklHICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9QT1JUX0VRVUFMSVpBVElPTiAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRVRfUE9SVF9FUVVBTElaQVRJT04gKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUkVEX0NPTkZJRyAgICAgKDEpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19NQUNfU0VUICAgICAgKDIpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUICgzKQorI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfVkxBTl9DT05GSUcgICg0KQorI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlkgKDUpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUkVBRF9GTEFTSFJPTSAgICAgKDYpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fV1JJVEVfRkxBU0hST00gICAgKDcpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUVVFUllfTUFYX0ZXQ01EX0JVRkZFUl9TSVpFICg4KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0FERF9QQUdFX1RBQkxFUyAgICg5KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1JFTU9WRV9QQUdFX1RBQkxFUyAoMTApCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUklOR19ERVNUUk9ZICAgICAgKDExKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0NRX0NSRUFURSAgICAgICAgICgxMikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FUV9DUkVBVEUgICAgICAgICAoMTMpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fRVRIX1JYX0NSRUFURSAgICAgKDE0KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0VUSF9UWF9DUkVBVEUgICAgICgxNSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9ORVRfUkVTRVJWRUQwICAgICAoMTYpCS8qIFJlc2VydmVkICovCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTkVUX1JFU0VSVkVEMSAgICAgKDE3KQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBPUENPREVfQ09NTU9OX05FVF9SRVNFUlZFRDIgICAgICgxOCkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9ERUZRX0NSRUFURSAoMTkpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fSVNDU0lfV1JCUV9DUkVBVEUgKDIwKQorI2RlZmluZSBPUENPREVfQ09NTU9OX01DQ19DUkVBVEUgICAgICAgICgyMSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9KRUxMX0NPTkZJRyAgICAgICAoMjIpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fRk9SQ0VfRkFJTE9WRVIgICAgKDIzKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0FERF9URU1QTEFURV9IRUFERVJfQlVGRkVSUyAoMjQpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUkVNT1ZFX1RFTVBMQVRFX0hFQURFUl9CVUZGRVJTICgyNSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9QT1NUX1pFUk9fQlVGRkVSICAoMjYpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX1FPUyAgICAgICAgICAgKDI3KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9RT1MgICAgICAgICAgICgyOCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9UQ1BfR0VUX1NUQVRJU1RJQ1MgKDI5KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFRVBST01fUkVBRCAgICAgICgzMCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9UQ1BfU1RBVEVfUVVFUlkgICAoMzEpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0NOVExfQVRUUklCVVRFUyAoMzIpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTk9QICAgICAgICAgICAgICAgKDMzKQorI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfUlhfRklMVEVSICAgICgzNCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRldfVkVSU0lPTiAgICAoMzUpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX0ZMT1dfQ09OVFJPTCAgKDM2KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wgICgzNykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfVENQX1BBUkFNRVRFUlMgKDM4KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9GUkFNRV9TSVpFICAgICgzOSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRkFUICAgICAgICAgICAoNDApCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTU9ESUZZX0VRX0RFTEFZICAgKDQxKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRyAgICg0MikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FTkFCTEVfRElTQUJMRV9ET01BSU5TICg0MykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRE9NQUlOX0NPTkZJRyAoNDQpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX1ZMRF9DT05GSUcgICAgKDQ1KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9WTERfQ09ORklHICAgICg0NikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfUE9SVF9FUVVBTElaQVRJT04gKDQ3KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9QT1JUX0VRVUFMSVpBVElPTiAoNDgpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUkVEX0NPTkZJRyAgICAgICAgKDQ5KQorCisKKworLyoKKyAqIC0tLSBFVEhfU1VCU1lTVEVNX09QQ09ERVMgLS0tCisgKiBUaGVzZSBvcGNvZGVzIGFyZSB1c2VkIGZvciBjb25maWd1cmluZyB0aGUgRXRoZXJuZXQgaW50ZXJmYWNlcy4gVGhlc2UKKyAqIG9wY29kZXMgYWxsIHVzZSB0aGUgRldDTURfU1VCU1lTVEVNX0VUSCBzdWJzeXN0ZW0gY29kZS4KKyAqLworI2RlZmluZSBPUENPREVfRVRIX1JTU19DT05GSUcgICAgICAgICAgICgxKQorI2RlZmluZSBPUENPREVfRVRIX0FDUElfQ09ORklHICAgICAgICAgICgyKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX1JTU19DT05GSUcgICAgICAgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX0FDUElfQ09ORklHICAgICAgICgzKQorI2RlZmluZSBPUENPREVfRVRIX1BST01JU0NVT1VTICAgICAgICAgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX1BST01JU0NVT1VTICAgICAgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX0dFVF9TVEFUSVNUSUNTICAgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX0dFVF9SWF9GUkFHX1NJWkUgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX1NFVF9SWF9GUkFHX1NJWkUgICgzKQorI2RlZmluZSBPUENPREVfRVRIX0dFVF9TVEFUSVNUSUNTICAgICAgICg0KQorI2RlZmluZSBPUENPREVfRVRIX0dFVF9SWF9GUkFHX1NJWkUgICAgICg1KQorI2RlZmluZSBPUENPREVfRVRIX1NFVF9SWF9GUkFHX1NJWkUgICAgICg2KQorCisKKworCisKKy8qCisgKiAtLS0gTUNDX1NUQVRVU19DT0RFIC0tLQorICogVGhlc2UgYXJlIHRoZSBnbG9iYWwgc3RhdHVzIGNvZGVzIHVzZWQgYnkgYWxsIHN1YnN5c3RlbXMKKyAqLworI2RlZmluZSBNQ0NfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICgwKQkvKiBJbmRpY2F0ZXMgYSBzdWNjZXNzZnVsCisJCQkJCQljb21wbGV0aW9uIG9mICB0aGUgY29tbWFuZCAqLworI2RlZmluZSBNQ0NfU1RBVFVTX0lOU1VGRklDSUVOVF9QUklWSUxFR0VTICgxKQkvKiBUaGUgY2xpZW50IGRvZXMgbm90IGhhdmUKKwkJCQkJCXN1ZmZpY2llbnQgcHJpdmlsZWdlcyB0bworCQkJCQkJZXhlY3V0ZSB0aGUgY29tbWFuZCAqLworI2RlZmluZSBNQ0NfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSICAgICgyKQkvKiBBIHBhcmFtZXRlciBpbiB0aGUgY29tbWFuZAorCQkJCQkJd2FzIGludmFsaWQuIFRoZSBleHRlbmRlZAorCQkJCQkJc3RhdHVzIGNvbnRhaW5zIHRoZSBpbmRleAorCQkJCQkJb2YgdGhlIHBhcmFtZXRlciAqLworI2RlZmluZSBNQ0NfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgKDMpCS8qIFRoZXJlIGFyZSBpbnN1ZmZpY2llbnQKKwkJCQkJCWNoaXAgcmVzb3VyY2VzIHRvIGV4ZWN1dGUKKwkJCQkJCXRoZSBjb21tYW5kICovCisjZGVmaW5lIE1DQ19TVEFUVVNfUVVFVUVfRkxVU0hJTkcgICAgICAgKDQpCS8qIFRoZSBjb21tYW5kIGlzIGNvbXBsZXRpbmcKKwkJCQkJCWJlY2F1c2UgdGhlIHF1ZXVlIHdhcworCQkJCQkJZ2V0dGluZyBmbHVzaGVkICovCisjZGVmaW5lIE1DQ19TVEFUVVNfRE1BX0ZBSUxFRCAgICAgICAgICAgKDUpCS8qIFRoZSBjb21tYW5kIGlzIGNvbXBsZXRpbmcKKwkJCQkJCXdpdGggYSBETUEgZXJyb3IgKi8KKworLyoKKyAqIC0tLSBNR01UX0VSUk9SX0NPREVTIC0tLQorICogRXJyb3IgQ29kZXMgcmV0dXJuZWQgaW4gdGhlIHN0YXR1cyBmaWVsZCBvZiB0aGUgRldDTUQgcmVzcG9uc2UgaGVhZGVyCisgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAoMCkJLyogVGhlIEZXQ01EIGNvbXBsZXRlZAorCQkJCQkJd2l0aG91dCBlcnJvcnMgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfRkFJTEVEICAgICAgICAgICAgICAoMSkJLyogRXJyb3Igc3RhdHVzIGluIHRoZSBTdGF0dXMKKwkJCQkJCWZpZWxkIG9mICB0aGUKKwkJCQkJCXN0cnVjdCBGV0NNRF9SRVNQT05TRV9IRUFERVIgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfSUxMRUdBTF9SRVFVRVNUICAgICAoMikJLyogSW52YWxpZCBGV0NNRCBvcGNvZGUgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfSUxMRUdBTF9GSUVMRCAgICAgICAoMykJLyogSW52YWxpZCBwYXJhbWV0ZXIgaW4KKwkJCQkJCXRoZSBGV0NNRCAgcGF5bG9hZCAqLworCisjZW5kaWYgLyogX19md2NtZF9vcGNvZGVzX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfdHlwZXNfYm1hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX3R5cGVzX2JtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjIxN2FmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX3R5cGVzX2JtYXAuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfdHlwZXNfYm1hcF9oX18KKyNkZWZpbmUgX19md2NtZF90eXBlc19ibWFwX2hfXworCisvKiBNQUMgYWRkcmVzcyBmb3JtYXQgICovCitzdHJ1Y3QgTUFDX0FERFJFU1NfRk9STUFUIHsKKwl1MTYgU2l6ZU9mU3RydWN0dXJlOworCXU4IE1BQ0FkZHJlc3NbNl07Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19md2NtZF90eXBlc19ibWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2hvc3Rfc3RydWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvaG9zdF9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU2NzIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2hvc3Rfc3RydWN0LmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19ob3N0X3N0cnVjdF9hbWFwX2hfXworI2RlZmluZSBfX2hvc3Rfc3RydWN0X2FtYXBfaF9fCisjaW5jbHVkZSAiYmVfY20uaCIKKyNpbmNsdWRlICJiZV9jb21tb24uaCIKKyNpbmNsdWRlICJkZXNjcmlwdG9ycy5oIgorCisvKiAtLS0gRVFfQ09NUExFVElPTl9NQUpPUl9DT0RFX0VOVU0gLS0tICovCisjZGVmaW5lIEVRX01BSk9SX0NPREVfQ09NUExFVElPTiAgICAgICAgKDApCS8qIENvbXBsZXRpb24gZXZlbnQgb24gYSAqLworCQkJCQkJICAvKiBxY29tcGxldGlvbiB1ZXVlLiAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX0VUSCAgICAgICAgICAgICAgICgxKQkvKiBBZmZpbGlhdGVkIEV0aGVybmV0IEV2ZW50LiAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX1JFU0VSVkVEICAgICAgICAgICgyKQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX1JETUEgICAgICAgICAgICAgICgzKQkvKiBBZmZpbGlhdGVkIFJETUEgRXZlbnQuICovCisjZGVmaW5lIEVRX01BSk9SX0NPREVfSVNDU0kgICAgICAgICAgICAgKDQpCS8qIEFmZmlsaWF0ZWQgSVNDU0kgRXZlbnQgKi8KKyNkZWZpbmUgRVFfTUFKT1JfQ09ERV9VTkFGRklMSUFURUQgICAgICAoNSkJLyogVW5hZmZpbGlhdGVkIEV2ZW50ICovCisKKy8qIC0tLSBFUV9DT01QTEVUSU9OX01JTk9SX0NPREVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgRVFfTUlOT1JfQ09ERV9DT01QTEVUSU9OICAgICAgICAoMCkJLyogQ29tcGxldGlvbiBldmVudCBvbiBhICovCisJCQkJCQkgIC8qIGNvbXBsZXRpb24gcXVldWUuICovCisjZGVmaW5lIEVRX01JTk9SX0NPREVfT1RIRVIgICAgICAgICAgICAgKDEpCS8qIE90aGVyIEV2ZW50IChUQkQpLiAqLworCisvKiBRdWV1ZSBFbnRyeSBEZWZpbml0aW9uIGZvciBhbGwgNCBieXRlIGV2ZW50IHF1ZXVlIHR5cGVzLiAqLworc3RydWN0IEJFX0VRX0VOVFJZX0FNQVAgeworCXU4IFZhbGlkOwkJLyogRFdPUkQgMCAqLworCXU4IE1ham9yQ29kZVszXTsJLyogRFdPUkQgMCAqLworCXU4IE1pbm9yQ29kZVsxMl07CS8qIERXT1JEIDAgKi8KKwl1OCBSZXNvdXJjZUlEWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUV9FTlRSWV9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogLS0tIEVUSF9FVkVOVF9DT0RFIC0tLQorICogVGhlc2UgY29kZXMgYXJlIHJldHVybmVkIGJ5IHRoZSBNUFUgd2hlbiBvbmUgb2YgdGhlc2UgZXZlbnRzIGhhcyBvY2N1cnJlZCwKKyAqIGFuZCB0aGUgZXZlbnQgaXMgY29uZmlndXJlZCB0byByZXBvcnQgdG8gYW4gRXZlbnQgUXVldWUgd2hlbiBhbiBldmVudAorICogaXMgZGV0ZWN0ZWQuCisgKi8KKyNkZWZpbmUgRVRIX0VRX0xJTktfU1RBVFVTICAgICAgICAgICAgICAoMCkJLyogTGluayBzdGF0dXMgY2hhbmdlIGV2ZW50ICovCisJCQkJCQkgIC8qIGRldGVjdGVkLiAqLworI2RlZmluZSBFVEhfRVFfV0FURVJNQVJLICAgICAgICAgICAgICAgICgxKQkvKiB3YXRlcm1hcmsgZXZlbnQgZGV0ZWN0ZWQuICovCisjZGVmaW5lIEVUSF9FUV9NQUdJQ19QS1QgICAgICAgICAgICAgICAgKDIpCS8qIG1hZ2ljIHBrdCBldmVudCBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgRVRIX0VRX0FDUElfUEtUMCAgICAgICAgICAgICAgICAoMykJLyogQUNQSSBpbnRlcmVzdGluZyBwYWNrZXQgKi8KKwkJCQkJCSAgLyogZGV0ZWN0ZWQuICovCisjZGVmaW5lIEVUSF9FUV9BQ1BJX1BLVDEgICAgICAgICAgICAgICAgKDMpCS8qIEFDUEkgaW50ZXJlc3RpbmcgcGFja2V0ICovCisJCQkJCQkgIC8qIGRldGVjdGVkLiAqLworI2RlZmluZSBFVEhfRVFfQUNQSV9QS1QyICAgICAgICAgICAgICAgICgzKQkvKiBBQ1BJIGludGVyZXN0aW5nIHBhY2tldCAqLworCQkJCQkJICAvKiBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgRVRIX0VRX0FDUElfUEtUMyAgICAgICAgICAgICAgICAoMykJLyogQUNQSSBpbnRlcmVzdGluZyBwYWNrZXQgKi8KKwkJCQkJCSAgLyogZGV0ZWN0ZWQuICovCisKKy8qCisgKiAtLS0gRVRIX1RYX0NPTVBMX1NUQVRVU19FTlVNIC0tLQorICogU3RhdHVzIGNvZGVzIGNvbnRhaW5lZCBpbiBFdGhlcm5ldCBUWCBjb21wbGV0aW9uIGRlc2NyaXB0b3JzLgorICovCisjZGVmaW5lIEVUSF9DT01QX1ZBTElEICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIEVUSF9DT01QX0VSUk9SICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEVUSF9DT01QX0lOVkFMSUQgICAgICAgICAgICAgICAgKDE1KQorCisvKgorICogLS0tIEVUSF9UWF9DT01QTF9QT1JUX0VOVU0gLS0tCisgKiBQb3J0IGluZGljYXRvciBjb250YWluZWQgaW4gRXRoZXJuZXQgVFggY29tcGxldGlvbiBkZXNjcmlwdG9ycy4KKyAqLworI2RlZmluZSBFVEhfQ09NUF9QT1JUMCAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBFVEhfQ09NUF9QT1JUMSAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBFVEhfQ09NUF9NR01UICAgICAgICAgICAgICAgICAgICgyKQorCisvKgorICogLS0tIEVUSF9UWF9DT01QTF9DVF9FTlVNIC0tLQorICogQ29tcGxldGlvbiB0eXBlIGluZGljYXRvciBjb250YWluZWQgaW4gRXRoZXJuZXQgVFggY29tcGxldGlvbiBkZXNjcmlwdG9ycy4KKyAqLworI2RlZmluZSBFVEhfQ09NUF9FVEggICAgICAgICAgICAgICAgICAgICgwKQorCisvKgorICogV29yayByZXF1ZXN0IGJsb2NrIHRoYXQgdGhlIGRyaXZlciBpc3N1ZXMgdG8gdGhlIGNoaXAgZm9yCisgKiBFdGhlcm5ldCB0cmFuc21pc3Npb25zLiBBbGwgY29udHJvbCBmaWVsZHMgbXVzdCBiZSB2YWxpZCBpbiBlYWNoIFdSQiBmb3IKKyAqIGEgbWVzc2FnZS4gVGhlIGNvbnRyb2xsZXIsIGFzIHNwZWNpZmllZCBieSB0aGUgZmxhZ3MsIG9wdGlvbmFsbHkgd3JpdGVzCisgKiBhbiBlbnRyeSB0byB0aGUgQ29tcGxldGlvbiBSaW5nIGFuZCBnZW5lcmF0ZSBhbiBldmVudC4KKyAqLworc3RydWN0IEJFX0VUSF9XUkJfQU1BUCB7CisJdTggZnJhZ19wYV9oaVszMl07CS8qIERXT1JEIDAgKi8KKwl1OCBmcmFnX3BhX2xvWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IGNvbXBsZXRlOwkvKiBEV09SRCAyICovCisJdTggZXZlbnQ7CQkvKiBEV09SRCAyICovCisJdTggY3JjOwkJLyogRFdPUkQgMiAqLworCXU4IGZvcndhcmQ7CQkvKiBEV09SRCAyICovCisJdTggaXBzZWM7CQkvKiBEV09SRCAyICovCisJdTggbWdtdDsJCS8qIERXT1JEIDIgKi8KKwl1OCBpcGNzOwkJLyogRFdPUkQgMiAqLworCXU4IHVkcGNzOwkJLyogRFdPUkQgMiAqLworCXU4IHRjcGNzOwkJLyogRFdPUkQgMiAqLworCXU4IGxzbzsJCS8qIERXT1JEIDIgKi8KKwl1OCBsYXN0OwkJLyogRFdPUkQgMiAqLworCXU4IHZsYW47CQkvKiBEV09SRCAyICovCisJdTggZGJnWzNdOwkJLyogRFdPUkQgMiAqLworCXU4IGhhc2hfdmFsWzNdOwkvKiBEV09SRCAyICovCisJdTggbHNvX21zc1sxNF07CS8qIERXT1JEIDIgKi8KKwl1OCBmcmFnX2xlblsxNl07CS8qIERXT1JEIDMgKi8KKwl1OCB2bGFuX3RhZ1sxNl07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVRIX1dSQl9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisvKiBUaGlzIGlzIGFuIEV0aGVybmV0IHRyYW5zbWl0IGNvbXBsZXRpb24gZGVzY3JpcHRvciAqLworc3RydWN0IEJFX0VUSF9UWF9DT01QTF9BTUFQIHsKKwl1OCB1c2VyX2J5dGVzWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IG53aF9ieXRlc1s4XTsJLyogRFdPUkQgMCAqLworCXU4IGxzbzsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs3XTsJLyogRFdPUkQgMCAqLworCXU4IHdyYl9pbmRleFsxNl07CS8qIERXT1JEIDEgKi8KKwl1OCBjdFsyXTsJCS8qIERXT1JEIDEgKi8KKwl1OCBwb3J0WzJdOwkJLyogRFdPUkQgMSAqLworCXU4IHJzdmQxWzhdOwkvKiBEV09SRCAxICovCisJdTggc3RhdHVzWzRdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDJbMTZdOwkvKiBEV09SRCAyICovCisJdTggcmluZ2lkWzExXTsJLyogRFdPUkQgMiAqLworCXU4IGhhc2hfdmFsWzRdOwkvKiBEV09SRCAyICovCisJdTggdmFsaWQ7CQkvKiBEV09SRCAyICovCisJdTggcnN2ZDNbMzJdOwkvKiBEV09SRCAzICovCit9IF9fcGFja2VkOworc3RydWN0IEVUSF9UWF9DT01QTF9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisvKiBFdGhlcm5ldCBSZWNlaXZlIEJ1ZmZlciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgQkVfRVRIX1JYX0RfQU1BUCB7CisJdTggZnJhZ3BhX2hpWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IGZyYWdwYV9sb1szMl07CS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVRIX1JYX0RfQU1BUCB7CisJdTMyIGR3WzJdOworfTsKKworLyogVGhpcyBpcyBhbiBFdGhlcm5ldCBSZWNlaXZlIENvbXBsZXRpb24gRGVzY3JpcHRvciAqLworc3RydWN0IEJFX0VUSF9SWF9DT01QTF9BTUFQIHsKKwl1OCB2bGFuX3RhZ1sxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBwa3RzaXplWzE0XTsJLyogRFdPUkQgMCAqLworCXU4IHBvcnQ7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDA7CQkvKiBEV09SRCAwICovCisJdTggZXJyOwkJLyogRFdPUkQgMSAqLworCXU4IHJzc2hwOwkJLyogRFdPUkQgMSAqLworCXU4IGlwZjsJCS8qIERXT1JEIDEgKi8KKwl1OCB0Y3BmOwkJLyogRFdPUkQgMSAqLworCXU4IHVkcGY7CQkvKiBEV09SRCAxICovCisJdTggaXBja3NtOwkJLyogRFdPUkQgMSAqLworCXU4IHRjcGNrc207CQkvKiBEV09SRCAxICovCisJdTggdWRwY2tzbTsJCS8qIERXT1JEIDEgKi8KKwl1OCBtYWNkc3RbNl07CS8qIERXT1JEIDEgKi8KKwl1OCB2dHA7CQkvKiBEV09SRCAxICovCisJdTggdnRtOwkJLyogRFdPUkQgMSAqLworCXU4IGZyYWduZHhbMTBdOwkvKiBEV09SRCAxICovCisJdTggY3RbMl07CQkvKiBEV09SRCAxICovCisJdTggaXBzZWM7CQkvKiBEV09SRCAxICovCisJdTggbnVtZnJhZ3NbM107CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVszMV07CS8qIERXT1JEIDIgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDIgKi8KKwl1OCByc3NoYXNoWzMyXTsJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworI2VuZGlmIC8qIF9faG9zdF9zdHJ1Y3RfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9od2xpYi5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2h3bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZGY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9od2xpYi5oCkBAIC0wLDAgKzEsODMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaWZuZGVmIF9faHdsaWJfaF9fCisjZGVmaW5lIF9faHdsaWJfaF9fCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAicmVnbWFwLmgiCQkvKiBzcmNnZW4gYXJyYXkgbWFwIG91dHB1dCAqLworCisjaW5jbHVkZSAiYXN5bmNtZXNnLmgiCisjaW5jbHVkZSAiZndjbWRfb3Bjb2Rlcy5oIgorI2luY2x1ZGUgInBvc3RfY29kZXMuaCIKKyNpbmNsdWRlICJmd2NtZF9tY2MuaCIKKworI2luY2x1ZGUgImZ3Y21kX3R5cGVzX2JtYXAuaCIKKyNpbmNsdWRlICJmd2NtZF9jb21tb25fYm1hcC5oIgorI2luY2x1ZGUgImZ3Y21kX2V0aF9ibWFwLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKy8qCisgKgorICogTWFjcm9zIGZvciByZWFkaW5nL3dyaXRpbmcgYSBwcm90ZWN0aW9uIGRvbWFpbiBvciBDU1IgcmVnaXN0ZXJzCisgKiBpbiBCbGFkZUVuZ2luZS4KKyAqLworI2RlZmluZSBQRF9SRUFEKGZvLCBmaWVsZCkJaW9yZWFkMzIoKGZvKS0+ZGJfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9QUk9URUNUSU9OX0RPTUFJTl9EQk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBQRF9XUklURShmbywgZmllbGQsIHZhbCkgaW93cml0ZTMyKHZhbCwgKGZvKS0+ZGJfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9QUk9URUNUSU9OX0RPTUFJTl9EQk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBDU1JfUkVBRChmbywgZmllbGQpCWlvcmVhZDMyKChmbyktPmNzcl92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX0JMQURFX0VOR0lORV9DU1JNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNkZWZpbmUgQ1NSX1dSSVRFKGZvLCBmaWVsZCwgdmFsKQlpb3dyaXRlMzIodmFsLCAoZm8pLT5jc3JfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9CTEFERV9FTkdJTkVfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBDSUNGRzBfUkVBRChmbywgZmllbGQpCWlvcmVhZDMyKChmbyktPnBjaV92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BDSUNGRzBfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBDSUNGRzBfV1JJVEUoZm8sIGZpZWxkLCB2YWwpCWlvd3JpdGUzMih2YWwsIChmbyktPnBjaV92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BDSUNGRzBfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBDSUNGRzFfUkVBRChmbywgZmllbGQpCWlvcmVhZDMyKChmbyktPnBjaV92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BDSUNGRzFfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBDSUNGRzFfV1JJVEUoZm8sIGZpZWxkLCB2YWwpCWlvd3JpdGUzMih2YWwsIChmbyktPnBjaV92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BDSUNGRzFfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjaWZkZWYgQkVfREVCVUcKKyNkZWZpbmUgQVNTRVJUKGMpICAgICAgIEJVR19PTighKGMpKTsKKyNlbHNlCisjZGVmaW5lIEFTU0VSVChjKQorI2VuZGlmCisKKy8qIGRlYnVnIGxldmVscyAqLworZW51bSBCRV9ERUJVR19MRVZFTFMgeworCURMX0FMV0FZUyA9IDAsCQkvKiBjYW5ub3QgYmUgbWFza2VkICovCisJRExfRVJSID0gMHgxLAkJLyogZXJyb3JzIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCURMX1dBUk4gPSAweDIsCQkvKiBzb21ldGhpbmcgcXVlc3Rpb25hYmxlLgorCQkJCSAgIHJlY292ZXJhYmxlIGVycm9ycyAqLworCURMX05PVEUgPSAweDQsCQkvKiBpbmZyZXF1ZW50LCBpbXBvcnRhbnQgZGVidWcgaW5mbyAqLworCURMX0lORk8gPSAweDgsCQkvKiBkZWJ1ZyBpbmZvcm1hdGlvbiAqLworCURMX1ZFUkJPU0UgPSAweDEwLAkvKiBkZXRhaWxlZCBpbmZvLCBzdWNoIGFzIGJ1ZmZlciB0cmFjZXMgKi8KKwlCRV9ETF9NSU5fVkFMVUUgPSAweDEsCS8qIHRoaXMgaXMgdGhlIG1pbiB2YWx1ZSB1c2VkICovCisJQkVfRExfTUFYX1ZBTFVFID0gMHg4MAkvKiB0aGlzIGlzIHRoZSBoaWdoZXNldCB2YWx1ZSB1c2VkICovCit9IDsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB0cmFjZV9sZXZlbDsKKworI2RlZmluZSBUUkFDRShsbSwgZm10LCBhcmdzLi4uKSAgewkJCQlcCisJCWlmICh0cmFjZV9sZXZlbCAmIGxtKSB7CQkJCVwKKwkJCXByaW50ayhLRVJOX05PVElDRSAiQkU6ICVzOiVkIFxuIiBmbXQsCVwKKwkJCV9fRklMRV9fICwgX19MSU5FX18gLCAjIyBhcmdzKTsJCVwKKwkJfQkJCQkJCVwKKwl9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJlX3RyYWNlX3NldF9sZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpCit7CisJdW5zaWduZWQgaW50IG9sZF9sZXZlbCA9IHRyYWNlX2xldmVsOworCXRyYWNlX2xldmVsID0gbGV2ZWw7CisJcmV0dXJuIG9sZF9sZXZlbDsKK30KKworI2RlZmluZSBiZV90cmFjZV9nZXRfbGV2ZWwoKSAJdHJhY2VfbGV2ZWwKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBwYWdlcyBzcGFubmVkIGJ5IHRoZSBzaXplIG9mIGRhdGEKKyAqIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBhZGRyZXNzLgorICovCisjZGVmaW5lIFBBR0VTX1NQQU5ORUQoX2FkZHJlc3MsIF9zaXplKSBcCisgICAoKHUzMikoKCgoc2l6ZV90KShfYWRkcmVzcykgJiAoUEFHRV9TSVpFIC0gMSkpICsgXAorCQkoX3NpemUpICsgKFBBR0VfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUKSkKKy8qIEJ5dGUgb2Zmc2V0IGludG8gdGhlIHBhZ2UgY29ycmVzcG9uZGluZyB0byBnaXZlbiBhZGRyZXNzICovCisjZGVmaW5lIE9GRlNFVF9JTl9QQUdFKF9hZGRyXykgKChzaXplX3QpKF9hZGRyXykgJiAoUEFHRV9TSVpFLTEpKQorCisvKgorICogY2lyY3VsYXIgc3VidHJhY3QuCisgKiBSZXR1cm5zIGEgLSBiIGFzc3VtaW5nIGEgY2lyY3VsYXIgbnVtYmVyIHN5c3RlbSwgd2hlcmUgYSBhbmQgYiBhcmUKKyAqIGluIHJhbmdlICgwLCBtYXhWYWx1ZS0xKS4gSWYgYT09YiwgemVybyBpcyByZXR1cm5lZCBzbyB0aGUKKyAqIGhpZ2hlc3QgdmFsdWUgcG9zc2libGUgd2l0aCB0aGlzIHN1YnRyYWN0aW9uIGlzIG1heFZhbHVlLTEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJlX3N1YmModTMyIGEsIHUzMiBiLCB1MzIgbWF4KQoreworCUFTU0VSVChhIDw9IG1heCAmJiBiIDw9IG1heCk7CisJQVNTRVJUKG1heCA+IDApOworCXJldHVybiBhID49IGIgPyAoYSAtIGIpIDogKG1heCAtIGIgKyBhKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgYmVfYWRkYyh1MzIgYSwgdTMyIGIsIHUzMiBtYXgpCit7CisJQVNTRVJUKGEgPCBtYXgpOworCUFTU0VSVChtYXggPiAwKTsKKwlyZXR1cm4gKG1heCAtIGEgPiBiKSA/IChhICsgYikgOiAoYiArIGEgLSBtYXgpOworfQorCisvKiBkZXNjcmlwdG9yIGZvciBhIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgdXNlZCBmb3IgcmluZyAqLworc3RydWN0IHJpbmdfZGVzYyB7CisJdTMyIGxlbmd0aDsJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJdm9pZCAqdmE7IAkvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1NjQgcGE7CQkvKiBidXMgYWRkcmVzcyAqLworfSA7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSByaW5nIHNoYXJlZCBiZXR3ZWVuIGhhcmR3YXJlCisgKiBhbmQgc29mdHdhcmUuICBFYWNoIHJpbmcgaXMgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIgaW4gdGhlIHVuY2FjaGVkCisgKiBleHRlbnNpb24gYW5kIG1hcHBlZCBpbnRvIEJsYWRlRW5naW5lJ3MgdW5pZmllZCB0YWJsZS4KKyAqLworc3RydWN0IG1wX3JpbmcgeworCXUzMiBwYWdlczsJCS8qIHF1ZXVlIHNpemUgaW4gcGFnZXMgKi8KKwl1MzIgaWQ7CQkJLyogcXVldWUgaWQgYXNzaWduZWQgYnkgYmVrbGliICovCisJdTMyIG51bTsJCS8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBxdWV1ZSAqLworCXUzMiBjaWR4OwkJLyogY29uc3VtZXIgaW5kZXggKi8KKwl1MzIgcGlkeDsJCS8qIHByb2R1Y2VyIGluZGV4IC0tIG5vdCB1c2VkIGJ5IG1vc3QgcmluZ3MgKi8KKwl1MzIgaXRlbVNpemU7CQkvKiBzaXplIGluIGJ5dGVzIG9mIG9uZSBvYmplY3QgKi8KKworCXZvaWQgKnZhOwkJLyogVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcmluZy4KKwkJCQkgICBUaGlzIHNob3VsZCBiZSBsYXN0IHRvIGFsbG93IDMyICYgNjQKKwkJCQkgICBiaXQgZGVidWdnZXIgZXh0ZW5zaW9ucyB0byB3b3JrLiAqLworfSA7CisKKy8qLS0tLS0tLS0tLS0gIGFtYXAgYml0IGZpbGVkIGdldCAvIHNldCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyAtLS0tLSovCisvKgorICogU3RydWN0dXJlcyBkZWZpbmVkIGluIHRoZSBtYXAgaGVhZGVyIGZpbGVzICh1bmRlciBmdy9hbWFwLykgd2l0aCBuYW1lcworICogaW4gdGhlIGZvcm1hdCBCRV88bmFtZT5fQU1BUCBhcmUgcHNldWRvIHN0cnVjdHVyZXMgd2l0aCBtZW1iZXJzCisgKiBvZiB0eXBlIHU4LiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSB0ZW1wbGF0ZXMgdGhhdCBhcmUgdXNlZCBpbgorICogY29uanVudGlvbiB3aXRoIHRoZSBzdHJ1Y3R1cmVzIHdpdGggbmFtZXMgaW4gdGhlIGZvcm1hdAorICogPG5hbWU+X0FNQVAgdG8gY2FsY3VsYXRlIHRoZSBiaXQgbWFza3MgYW5kIGJpdCBvZmZzZXRzIHRvIGdldCBvciBzZXQKKyAqIGJpdCBmaWVsZHMgaW4gc3RydWN0dXJlcy4gVGhlIHN0cnVjdHVyZXMgPG5hbWU+X0FNQVAgYXJlIGFycmF5cworICogb2YgMzIgYml0cyB3b3JkcyBhbmQgaGF2ZSB0aGUgY29ycmVjdCBzaXplLiAgVGhlIGZvbGxvd2luZyBtYWNyb3MKKyAqIHByb3ZpZGUgY29udmVuaWVudCB3YXlzIHRvIGdldCBhbmQgc2V0IHRoZSB2YXJpb3VzIG1lbWJlcnMKKyAqIGluIHRoZSBzdHJ1Y3R1cmVzIHdpdGhvdXQgdXNpbmcgc3RydWNjdHVyZXMgd2l0aCBiaXQgZmllbGRzLgorICogQWx3YXlzIHVzZSB0aGUgbWFjcm9zIEFNQVBfR0VUX0JJVFNfUFRSIGFuZCBBTUFQX1NFVF9CSVRTX1BUUgorICogbWFjcm9zIHRvIGV4dHJhY3QgYW5kIHNldCB2YXJpb3VzIG1lbWJlcnMuCisgKi8KKworLyoKKyAqIFJldHVybnMgdGhlIGEgYml0IG1hc2sgZm9yIHRoZSByZWdpc3RlciB0aGF0IGlzIE5PVCBzaGlmdGVkIGludG8gbG9jYXRpb24uCisgKiBUaGF0IG1lYW5zIHJldHVybiB2YWx1ZXMgYWx3YXlzIGxvb2sgbGlrZTogMHgxLCAweEZGLCAweDdGRiwgZXRjLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGFtYXBfbWFzayh1MzIgYml0X3NpemUpCit7CisJcmV0dXJuIGJpdF9zaXplID09IDMyID8gMHhGRkZGRkZGRiA6ICgxIDw8IGJpdF9zaXplKSAtIDE7Cit9CisKKyNkZWZpbmUgQU1BUF9CSVRfTUFTSyhfc3RydWN0XywgZmllbGQpICAgICAgIFwKKwlhbWFwX21hc2soQU1BUF9CSVRfU0laRShfc3RydWN0XywgZmllbGQpKQorCisvKgorICogbm9uLW9wdGltaXplZCBzZXQgYml0cyBmdW5jdGlvbi4gRmlyc3QgY2xlYXJzIHRoZSBiaXRzIGFuZCB0aGVuIGFzc2lnbnMgdGhlbS4KKyAqIFRoaXMgZG9lcyBub3QgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgdGhlIHBhcnRpY3VsYXIgRFdPUkQgeW91IGFyZSBzZXR0aW5nLgorICogZS5nLiBBTUFQX1NFVF9CSVRTX1BUUiAoc3RydWN0LCBmaWVsZDEsICZjb250ZXh0TWVtb3J5LCAxMjMpOworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FtYXBfc2V0KHZvaWQgKnB0ciwgdTMyIGR3X29mZnNldCwgdTMyIG1hc2ssIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgKmR3ID0gKHUzMiAqKXB0cjsKKwkqKGR3ICsgZHdfb2Zmc2V0KSAmPSB+KG1hc2sgPDwgb2Zmc2V0KTsKKwkqKGR3ICsgZHdfb2Zmc2V0KSB8PSAobWFzayAmIHZhbHVlKSA8PCBvZmZzZXQ7Cit9CisKKyNkZWZpbmUgQU1BUF9TRVRfQklUU19QVFIoX3N0cnVjdF8sIGZpZWxkLCBfc3RydWN0UHRyXywgdmFsKQlcCisJYW1hcF9zZXQoX3N0cnVjdFB0cl8sIEFNQVBfV09SRF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSxcCisJCUFNQVBfQklUX01BU0soX3N0cnVjdF8sIGZpZWxkKSwJCQlcCisJCUFNQVBfQklUX09GRlNFVChfc3RydWN0XywgZmllbGQpLCB2YWwpCisvKgorICogTm9uLW9wdGltaXplZCByb3V0aW5lIHRoYXQgZ2V0cyB0aGUgYml0cyB3aXRob3V0IGtub3dpbmcgdGhlIGNvcnJlY3QgRFdPUkQuCisgKiBlLmcuIGZpZWxkVmFsdWUgPSBBTUFQX0dFVF9CSVRTX1BUUiAoc3RydWN0LCBmaWVsZDEsICZjb250ZXh0TWVtb3J5KTsKKyAqLworc3RhdGljIGlubGluZSB1MzIKK2FtYXBfZ2V0KHZvaWQgKnB0ciwgdTMyIGR3X29mZnNldCwgdTMyIG1hc2ssIHUzMiBvZmZzZXQpCit7CisJdTMyICpkdyA9ICh1MzIgKilwdHI7CisJcmV0dXJuIG1hc2sgJiAoKihkdyArIGR3X29mZnNldCkgPj4gb2Zmc2V0KTsKK30KKyNkZWZpbmUgQU1BUF9HRVRfQklUU19QVFIoX3N0cnVjdF8sIGZpZWxkLCBfc3RydWN0UHRyXykJCQlcCisJYW1hcF9nZXQoX3N0cnVjdFB0cl8sIEFNQVBfV09SRF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSwJXAorCQlBTUFQX0JJVF9NQVNLKF9zdHJ1Y3RfLCBmaWVsZCksCQkJCVwKKwkJQU1BUF9CSVRfT0ZGU0VUKF9zdHJ1Y3RfLCBmaWVsZCkpCisKKy8qIFJldHVybnMgMC0zMSByZXByZXNlbnRpbmcgYml0IG9mZnNldCB3aXRoaW4gYSBEV09SRCBvZiBhIGJpdGZpZWxkLiAqLworI2RlZmluZSBBTUFQX0JJVF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSAgICAgICAgICAgICAgICAgIFwKKwkob2Zmc2V0b2Yoc3RydWN0IEJFXyAjIyBfc3RydWN0XyAjIyBfQU1BUCwgZmllbGQpICUgMzIpCisKKy8qIFJldHVybnMgMC1uIHJlcHJlc2VudGluZyBEV09SRCBvZmZzZXQgb2YgYml0ZmllbGQgd2l0aGluIHRoZSBzdHJ1Y3R1cmUuICovCisjZGVmaW5lIEFNQVBfV09SRF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSAgXAorCQkgIChvZmZzZXRvZihzdHJ1Y3QgQkVfICMjIF9zdHJ1Y3RfICMjIF9BTUFQLCBmaWVsZCkvMzIpCisKKy8qIFJldHVybnMgc2l6ZSBvZiBiaXRmaWVsZCBpbiBiaXRzLiAqLworI2RlZmluZSBBTUFQX0JJVF9TSVpFKF9zdHJ1Y3RfLCBmaWVsZCkgXAorCQlzaXplb2YoKChzdHJ1Y3QgQkVfICMjIF9zdHJ1Y3RfICMjIF9BTUFQKikwKS0+ZmllbGQpCisKK3N0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgeworCXUxNiBsZW5ndGg7CQkvKiBieXRlcyBpbiByZXNwb25zZSAqLworCXUxNiBmd2NtZF9vZmZzZXQ7CS8qIG9mZnNldCB3aXRoaW4gdGhlIHdyYiBvZiB0aGUgcmVzcG9uc2UgKi8KKwl2b2lkICp2YTsJCS8qIHVzZXIncyB2YSB0byBjb3B5IHJlc3BvbnNlIGludG8gKi8KKworfSA7Cit0eXBlZGVmIHZvaWQgKCptY2Nfd3JiX2NxZV9jYWxsYmFjaykgKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMsCisJCQkJc3RydWN0IE1DQ19XUkJfQU1BUCAqb3B0aW9uYWxfd3JiKTsKK3N0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgeworCisJbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2I7CS8qIEZ1bmN0aW9uIHRvIGNhbGwgb24KKwkJCQkJCWNvbXBsZXRpb24gKi8KKwl2b2lkICppbnRlcm5hbF9jYl9jb250ZXh0OwkvKiBQYXJhbWV0ZXIgdG8gcGFzcworCQkJCQkJICAgdG8gY29tcGxldGlvbiBmdW5jdGlvbiAqLworCisJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2I7CS8qIEZ1bmN0aW9uIHRvIGNhbGwgb24gY29tcGxldGlvbiAqLworCXZvaWQgKmNiX2NvbnRleHQ7CS8qIFBhcmFtZXRlciB0byBwYXNzIHRvIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKworCWludCAqdXNlcnNfZmluYWxfc3RhdHVzOwkvKiBwb2ludGVyIHRvIGEgbG9jYWwKKwkJCQkJCXZhcmlhYmxlIGZvciBzeW5jaHJvbm91cworCQkJCQkJY29tbWFuZHMgKi8KKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmI7CS8qIHBvaW50ZXIgdG8gb3JpZ2luYWwgd3JiIGZvciBlbWJlZGRlZAorCQkJCQkJY29tbWFuZHMgb25seSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsJLyogbGlua3MgY29udGV4dCBzdHJ1Y3RzIHRvZ2V0aGVyIGluCisJCQkJICAgZnJlZSBsaXN0ICovCisKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IGNvcHk7CS8qIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gY29weQorCQkJCQkgICBlbWJlZGRlZCByZXNwb25zZSB0byB1c2VyJ3MgdmEgKi8KKworI2lmIGRlZmluZWQoQkVfREVCVUcpCisJdTE2IHN1YnN5c3RlbSwgb3Bjb2RlOwkvKiBUcmFjayB0aGlzIEZXQ01EIGZvciBkZWJ1ZyBidWlsZHMuICovCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqcmluZ193cmI7CisJdTMyIGNvbnN1bWVkX2NvdW50OworI2VuZGlmCit9IDsKKworLyoKKyAgICBSZXByZXNlbnRzIGEgZnVuY3Rpb24gb2JqZWN0IGZvciBuZXR3b3JrIG9yIHN0b3JhZ2UuICBUaGlzCisgICAgaXMgdXNlZCB0byBtYW5hZ2UgcGVyLWZ1bmN0aW9uIHJlc291cmNlcyBsaWtlIE1DQyBDUXMsIGV0Yy4KKyovCitzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0IHsKKworCXUzMiBtYWdpYzsJCS8qITwgbWFnaWMgZm9yIGRldGVjdGluZyBtZW1vcnkgY29ycnVwdGlvbi4gKi8KKworCS8qIFBDSSBCQVIgbWFwcGVkIGFkZHJlc3NlcyAqLworCXU4IF9faW9tZW0gKmNzcl92YTsJLyogQ1NSICovCisJdTggX19pb21lbSAqZGJfdmE7CS8qIERvb3IgQmVsbCAqLworCXU4IF9faW9tZW0gKnBjaV92YTsJLyogUENJIGNvbmZpZyBzcGFjZSAqLworCXUzMiBlbXVsYXRlOwkJLyogaWYgc2V0LCBNUFUgaXMgbm90IGF2YWlsYWJsZS4KKwkJCQkgIEVtdWxhdGUgZXZlcnl0aGluZy4gICAgICovCisJdTMyIHBlbmRfcXVldWVfZHJpdmluZzsJLyogaWYgc2V0LCBkcml2ZSB0aGUgcXVldWVkIFdSQnMKKwkJCQkgICBhZnRlciByZWxlYXNpbmcgdGhlIFdSQiBsb2NrICovCisKKwlzcGlubG9ja190IHBvc3RfbG9jazsJLyogbG9jayBmb3IgdmVyaWZ5aW5nIG9uZSB0aHJlYWQgcG9zdGluZyB3cmJzICovCisJc3BpbmxvY2tfdCBjcV9sb2NrOwkvKiBsb2NrIGZvciB2ZXJpZnlpbmcgb25lIHRocmVhZAorCQkJCSAgIHByb2Nlc3NpbmcgY3EgKi8KKwlzcGlubG9ja190IG1jY19jb250ZXh0X2xvY2s7CS8qIGxvY2sgZm9yIHByb3RlY3RpbmcgbWNjCisJCQkJCSAgIGNvbnRleHQgZnJlZSBsaXN0ICovCisJdW5zaWduZWQgbG9uZyBwb3N0X2lycTsKKwl1bnNpZ25lZCBsb25nIGNxX2lycTsKKworCXUzMiB0eXBlOworCXUzMiBwY2lfZnVuY3Rpb25fbnVtYmVyOworCisJc3RydWN0IGJlX21jY19vYmplY3QgKm1jYzsJLyogbWNjIHJpbmdzLiAqLworCisJc3RydWN0IHsKKwkJc3RydWN0IE1DQ19NQUlMQk9YX0FNQVAgKnZhOwkvKiBWQSB0byB0aGUgbWFpbGJveCAqLworCQl1NjQgcGE7CS8qIFBBIHRvIHRoZSBtYWlsYm94ICovCisJCXUzMiBsZW5ndGg7CS8qIGJ5dGUgbGVuZ3RoIG9mIG1haWxib3ggKi8KKworCQkvKiBPbmUgZGVmYXVsdCBjb250ZXh0IHN0cnVjdCB1c2VkIGZvciBwb3N0aW5nIGF0CisJCSAqIGxlYXN0IG9uZSBNQ0NfV1JCCisJCSAqLworCQlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0IGRlZmF1bHRfY29udGV4dDsKKwkJYm9vbCBkZWZhdWx0X2NvbnRleHRfYWxsb2NhdGVkOworCX0gbWFpbGJveDsKKworCXN0cnVjdCB7CisKKwkJLyogV2FrZSBvbiBsYW5zIGNvbmZpZ3VyZWQuICovCisJCXUzMiB3b2xfYml0bWFzazsJLyogYml0cyAwLDEsMiwzIGFyZSBzZXQgaWYKKwkJCQkJICAgY29ycmVzcG9uZGluZyBpbmRleCBpcyBlbmFibGVkICovCisJfSBjb25maWc7CisKKworCXN0cnVjdCBCRV9GSVJNV0FSRV9DT05GSUcgZndfY29uZmlnOworfSA7CisKKy8qCisgICAgICBSZXByZXNlbnRzIGFuIEV2ZW50IFF1ZXVlCisqLworc3RydWN0IGJlX2VxX29iamVjdCB7CisJdTMyIG1hZ2ljOworCWF0b21pY190IHJlZl9jb3VudDsKKworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBhcmVudF9mdW5jdGlvbjsKKworCXN0cnVjdCBsaXN0X2hlYWQgZXFfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNxX2xpc3RfaGVhZDsKKworCXUzMiBlcV9pZDsKKwl2b2lkICpjYl9jb250ZXh0OworCit9IDsKKworLyoKKyAgICBNYW5hZ2VzIGEgY29tcGxldGlvbiBxdWV1ZQorKi8KK3N0cnVjdCBiZV9jcV9vYmplY3QgeworCXUzMiBtYWdpYzsKKwlhdG9taWNfdCByZWZfY291bnQ7CisKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwYXJlbnRfZnVuY3Rpb247CisJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0OworCisJc3RydWN0IGxpc3RfaGVhZCBjcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgY3FsaXN0X2Zvcl9lcTsKKworCXZvaWQgKnZhOworCXUzMiBudW1fZW50cmllczsKKworCXZvaWQgKmNiX2NvbnRleHQ7CisKKwl1MzIgY3FfaWQ7CisKK30gOworCisvKgorICAgIE1hbmFnZXMgYW4gZXRoZXJuZXQgc2VuZCBxdWV1ZQorKi8KK3N0cnVjdCBiZV9ldGhzcV9vYmplY3QgeworCXUzMiBtYWdpYzsKKworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBhcmVudF9mdW5jdGlvbjsKKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3Q7CisJdTMyIGJpZDsKKworfSA7CisKKy8qCitAYnJpZWYKKyAgICBNYW5hZ2VzIGFuIGV0aGVybmV0IHJlY2VpdmUgcXVldWUKKyovCitzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0IHsKKwl1MzIgbWFnaWM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBhcmVudF9mdW5jdGlvbjsKKwl1MzIgcmlkOworCXN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdDsKKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpyc3NfY3Ffb2JqZWN0WzRdOworCit9IDsKKworLyoKKyAgICBNYW5hZ2VzIGFuIE1DQworKi8KK3R5cGVkZWYgdm9pZCAoKm1jY19hc3luY19ldmVudF9jYWxsYmFjaykgKHZvaWQgKmNvbnRleHQsIHUzMiBldmVudF9jb2RlLAorCQkJCXZvaWQgKmV2ZW50KTsKK3N0cnVjdCBiZV9tY2Nfb2JqZWN0IHsKKwl1MzIgbWFnaWM7CisKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwYXJlbnRfZnVuY3Rpb247CisJc3RydWN0IGxpc3RfaGVhZCBtY2NfbGlzdDsKKworCXN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdDsKKworCS8qIEFzeW5jIGV2ZW50IGNhbGxiYWNrIGZvciBNQ0MgQ1EuICovCisJbWNjX2FzeW5jX2V2ZW50X2NhbGxiYWNrIGFzeW5jX2NiOworCXZvaWQgKmFzeW5jX2NvbnRleHQ7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpiYXNlOworCQl1MzIgbnVtOworCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfaGVhZDsKKwl9IHdyYl9jb250ZXh0OworCisJc3RydWN0IHsKKwkJc3RydWN0IHJpbmdfZGVzYyAqcmQ7CisJCXN0cnVjdCBtcF9yaW5nIHJpbmc7CisJfSBzcTsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBtcF9yaW5nIHJpbmc7CisJfSBjcTsKKworCXUzMiBwcm9jZXNzaW5nOwkJLyogZmxhZyBpbmRpY2F0aW5nIHRoYXQgb25lIHRocmVhZAorCQkJCSAgIGlzIHByb2Nlc3NpbmcgQ1EgKi8KKwl1MzIgcmVhcm07CQkvKiBkb29yYmVsbCByZWFybSBzZXR0aW5nIHRvIG1ha2UKKwkJCQkgICBzdXJlIHRoZSBhY3RpdmUgcHJvY2Vzc2luZyB0aHJlYWQgKi8KKwkvKiByZWFybXMgdGhlIENRIGlmIGFueSBvZiB0aGUgdGhyZWFkcyByZXF1ZXN0ZWQgaXQuICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJhY2tsb2c7CisJdTMyIGJhY2tsb2dfbGVuZ3RoOworCXUzMiBkcml2aW5nX2JhY2tsb2c7CisJdTMyIGNvbnN1bWVkX2luZGV4OworCit9IDsKKworCisvKiBRdWV1ZSBjb250ZXh0IGhlYWRlciAtLSB0aGUgcmVxdWlyZWQgc29mdHdhcmUgaW5mb3JtYXRpb24gZm9yCisgKiBxdWV1ZWluZyBhIFdSQi4KKyAqLworc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IHsKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYjsJLyogRnVuY3Rpb24gdG8gY2FsbCBvbgorCQkJCQkJICAgY29tcGxldGlvbiAqLworCXZvaWQgKmludGVybmFsX2NiX2NvbnRleHQ7CS8qIFBhcmFtZXRlciB0byBwYXNzCisJCQkJCQkgICB0byBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYjsJLyogRnVuY3Rpb24gdG8gY2FsbCBvbiBjb21wbGV0aW9uICovCisJdm9pZCAqY2JfY29udGV4dDsJLyogUGFyYW1ldGVyIHRvIHBhc3MgdG8gY29tcGxldGlvbiBmdW5jdGlvbiAqLworCisJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSBjb3B5OwkvKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGNvcHkKKwkJCQkJICAgZW1iZWRkZWQgcmVzcG9uc2UgdG8gdXNlcidzIHZhICovCisJdm9pZCAqb3B0aW9uYWxfZndjbWRfdmE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMiBieXRlczsKK30gOworCisvKgorICogQ29tbW9uIE1DQyBXUkIgaGVhZGVyIHRoYXQgYWxsIGNvbW1hbmRzIHJlcXVpcmUuCisgKi8KK3N0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB7CisJdTggcnN2ZFtvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCBwYXlsb2FkKS84XTsKK30gOworCisvKgorICogQWxsIG5vbiBlbWJlZGRlZCBjb21tYW5kcyBzdXBwb3J0ZWQgYnkgaHdsaWIgZnVuY3Rpb25zIG9ubHkgYWxsb3cKKyAqIDEgU0dFLiAgVGhpcyBxdWV1ZSBjb250ZXh0IGhhbmRsZXMgdGhlbSBhbGwuCisgKi8KK3N0cnVjdCBiZV9ub25lbWJlZGRlZF9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBNQ0NfU0dFX0FNQVAgc2dlWzFdOworfSA7CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIHNwZWNpZmljIHF1ZXVlIHN0cnVjdCBmb3IgZWFjaCBjb21tYW5kLgorICogIFRoZSB1c2VyIGNvdWxkIGFsd2F5cyBwcm92aWRlIGEgYmVfZ2VuZXJpY19xX2N0eHQgYnV0IHRoaXMgaXMgYQorICogIHJhdGhlciBsYXJnZSBzdHJ1Y3QuICBCeSB1c2luZyB0aGUgc3BlY2lmaWMgc3RydWN0LCBtZW1vcnkgY29uc3VtcHRpb24KKyAqICBjYW4gYmUgcmVkdWNlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0cnVjdCBiZV9saW5rX3N0YXR1c19xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSBmd2NtZDsKK30gOworCitzdHJ1Y3QgYmVfbXVsdGljYXN0X3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVQgZndjbWQ7Cit9IDsKKworCitzdHJ1Y3QgYmVfdmxhbl9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19WTEFOX0NPTkZJRyBmd2NtZDsKK30gOworCitzdHJ1Y3QgYmVfcHJvbWlzY3VvdXNfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgRldDTURfRVRIX1BST01JU0NVT1VTIGZ3Y21kOworfSA7CisKK3N0cnVjdCBiZV9mb3JjZV9mYWlsb3Zlcl9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fRk9SQ0VfRkFJTE9WRVIgZndjbWQ7Cit9IDsKKworCitzdHJ1Y3QgYmVfcnhmX2ZpbHRlcl9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19SWF9GSUxURVIgZndjbWQ7Cit9IDsKKworc3RydWN0IGJlX2VxX21vZGlmeV9kZWxheV9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTU9ESUZZX0VRX0RFTEFZIGZ3Y21kOworfSA7CisKKy8qCisgKiBUaGUgZ2VuZXJpYyBjb250ZXh0IGlzIHRoZSBsYXJnZXN0IHNpemUgdGhhdCB3b3VsZCBiZSByZXF1aXJlZC4KKyAqIEl0IGlzIHRoZSBzb2Z0d2FyZSBjb250ZXh0IHBsdXMgYW4gZW50aXJlIFdSQi4KKyAqLworc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgTUNDX1dSQl9QQVlMT0FEX0FNQVAgcGF5bG9hZDsKK30gOworCisvKgorICogVHlwZXMgZm9yIHRoZSBCRV9RVUVVRV9DT05URVhUIG9iamVjdC4KKyAqLworI2RlZmluZSBCRV9RVUVVRV9JTlZBTElECSgwKQorI2RlZmluZSBCRV9RVUVVRV9MSU5LX1NUQVRVUwkoMHhBMDA2KQorI2RlZmluZSBCRV9RVUVVRV9FVEhfU1RBVFMJKDB4QTAwNykKKyNkZWZpbmUgQkVfUVVFVUVfVFBNX1NUQVRTCSgweEEwMDgpCisjZGVmaW5lIEJFX1FVRVVFX1RDUF9TVEFUUwkoMHhBMDA5KQorI2RlZmluZSBCRV9RVUVVRV9NVUxUSUNBU1QJKDB4QTAwQSkKKyNkZWZpbmUgQkVfUVVFVUVfVkxBTgkJKDB4QTAwQikKKyNkZWZpbmUgQkVfUVVFVUVfUlNTCQkoMHhBMDBDKQorI2RlZmluZSBCRV9RVUVVRV9GT1JDRV9GQUlMT1ZFUgkoMHhBMDBEKQorI2RlZmluZSBCRV9RVUVVRV9QUk9NSVNDVU9VUwkoMHhBMDBFKQorI2RlZmluZSBCRV9RVUVVRV9XQUtFX09OX0xBTgkoMHhBMDBGKQorI2RlZmluZSBCRV9RVUVVRV9OT1AJCSgweEEwMTApCisKKy8qIC0tLSBCRV9GVU5DVElPTl9FTlVNIC0tLSAqLworI2RlZmluZSBCRV9GVU5DVElPTl9UWVBFX0lTQ1NJICAgICAgICAgICgwKQorI2RlZmluZSBCRV9GVU5DVElPTl9UWVBFX05FVFdPUksgICAgICAgICgxKQorI2RlZmluZSBCRV9GVU5DVElPTl9UWVBFX0FSTSAgICAgICAgICAgICgyKQorCisvKiAtLS0gQkVfRVRIX1RYX1JJTkdfVFlQRV9FTlVNIC0tLSAqLworI2RlZmluZSBCRV9FVEhfVFhfUklOR19UWVBFX0ZPUldBUkRJTkcgICgxKSAJLyogRXRoZXIgcmluZyBmb3IgZm9yd2FyZGluZyAqLworI2RlZmluZSBCRV9FVEhfVFhfUklOR19UWVBFX1NUQU5EQVJEICAgICgyKQkvKiBFdGhlciByaW5nIGZvciBzZW5kaW5nICovCisJCQkJCQkvKiBuZXR3b3JrIHBhY2tldHMuICovCisjZGVmaW5lIEJFX0VUSF9UWF9SSU5HX1RZUEVfQk9VTkQgICAgICAgKDMpCS8qIEV0aGVybmV0IHJpbmcgZm9yIHNlbmRpbmcgKi8KKwkJCQkJCS8qIG5ldHdvcmsgcGFja2V0cywgYm91bmQgKi8KKwkJCQkJCS8qIHRvIGEgcGh5c2ljYWwgcG9ydC4gKi8KKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIEFQSSBNQUNST1MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXykgICAgIHN0cnVjdCBGV0NNRF8jI19zaG9ydF9uYW1lXworI2RlZmluZSBCRV9PUENPREVfTkFNRShfc2hvcnRfbmFtZV8pICAgIE9QQ09ERV8jI19zaG9ydF9uYW1lXworI2RlZmluZSBCRV9TVUJTWVNURU1fTkFNRShfc2hvcnRfbmFtZV8pIFNVQlNZU1RFTV8jI19zaG9ydF9uYW1lXworCisKKyNkZWZpbmUgQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChfcGZvYl8sIF93cmJfLCBfc2hvcnRfbmFtZV8pCVwKKwkoKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSAqKQkJCQlcCisJYmVfZnVuY3Rpb25fcHJlcGFyZV9lbWJlZGRlZF9md2NtZChfcGZvYl8sIF93cmJfLAlcCisJCXNpemVvZihCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXykpLAkJXAorCQlGSUVMRF9TSVpFT0YoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pLCBwYXJhbXMucmVxdWVzdCksIFwKKwkJRklFTERfU0laRU9GKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSwgcGFyYW1zLnJlc3BvbnNlKSwgXAorCQlCRV9PUENPREVfTkFNRShfc2hvcnRfbmFtZV8pLAkJCQlcCisJCUJFX1NVQlNZU1RFTV9OQU1FKF9zaG9ydF9uYW1lXykpKTsKKworI2RlZmluZSBCRV9QUkVQQVJFX05PTkVNQkVEREVEX0ZXQ01EKF9wZm9iXywgX3dyYl8sIF9pdmFfLCBfaXBhXywgX3Nob3J0X25hbWVfKVwKKwkoKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSAqKQkJCQlcCisJYmVfZnVuY3Rpb25fcHJlcGFyZV9ub25lbWJlZGRlZF9md2NtZChfcGZvYl8sIF93cmJfLCAoX2l2YV8pLCAoX2lwYV8pLCBcCisJCXNpemVvZihCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXykpLAkJXAorCQlGSUVMRF9TSVpFT0YoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pLCBwYXJhbXMucmVxdWVzdCksIFwKKwkJRklFTERfU0laRU9GKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSwgcGFyYW1zLnJlc3BvbnNlKSwgXAorCQlCRV9PUENPREVfTkFNRShfc2hvcnRfbmFtZV8pLAkJCQlcCisJCUJFX1NVQlNZU1RFTV9OQU1FKF9zaG9ydF9uYW1lXykpKTsKKworaW50IGJlX2Z1bmN0aW9uX29iamVjdF9jcmVhdGUodTggX19pb21lbSAqY3NyX3ZhLCB1OCBfX2lvbWVtICpkYl92YSwKKwl1OCBfX2lvbWVtICpwY2lfdmEsIHUzMiBmdW5jdGlvbl90eXBlLCBzdHJ1Y3QgcmluZ19kZXNjICptYWlsYm94X3JkLAorCSAgc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKK2ludCBiZV9mdW5jdGlvbl9vYmplY3RfZGVzdHJveShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKTsKK2ludCBiZV9mdW5jdGlvbl9jbGVhbnVwKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCisKK2ludCBiZV9mdW5jdGlvbl9nZXRfZndfdmVyc2lvbihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT05fUkVTUE9OU0VfUEFZTE9BRCAqZndfdmVyc2lvbiwKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCk7CisKKworaW50IGJlX2VxX21vZGlmeV9kZWxheShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICB1MzIgbnVtX2VxLCBzdHJ1Y3QgYmVfZXFfb2JqZWN0ICoqZXFfYXJyYXksCisJCSAgIHUzMiAqZXFfZGVsYXlfYXJyYXksIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQkgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICBzdHJ1Y3QgYmVfZXFfbW9kaWZ5X2RlbGF5X3FfY3R4dCAqcV9jdHh0KTsKKworCisKK2ludCBiZV9lcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkgICAgIHN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgZXFlX3NpemUsIHUzMiBudW1fZW50cmllcywKKwkgICAgIHUzMiB3YXRlcm1hcmssIHUzMiB0aW1lcl9kZWxheSwgc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0KTsKKworaW50IGJlX2VxX2Rlc3Ryb3koc3RydWN0IGJlX2VxX29iamVjdCAqZXEpOworCitpbnQgYmVfY3FfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGgsCisJYm9vbCBzb2xpY2l0ZWRfZXZlbnRhYmxlLCBib29sIG5vX2RlbGF5LAorCXUzMiB3bV90aHJlc2gsIHN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdCwKKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QpOworCitpbnQgYmVfY3FfZGVzdHJveShzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcSk7CisKK2ludCBiZV9tY2NfcmluZ19jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGgsCisJCSAgIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKmNvbnRleHRfYXJyYXksCisJCSAgIHUzMiBudW1fY29udGV4dF9lbnRyaWVzLAorCQkgICBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcSwgc3RydWN0IGJlX21jY19vYmplY3QgKm1jYyk7CitpbnQgYmVfbWNjX3JpbmdfZGVzdHJveShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjX29iamVjdCk7CisKK2ludCBiZV9tY2NfcHJvY2Vzc19jcShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjX29iamVjdCwgYm9vbCByZWFybSk7CisKK2ludCBiZV9tY2NfYWRkX2FzeW5jX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2Nfb2JqZWN0LAorCQltY2NfYXN5bmNfZXZlbnRfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpOworCitpbnQgYmVfcGNpX3NvZnRfcmVzZXQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKKworaW50IGJlX2RyaXZlX1BPU1Qoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKKworaW50IGJlX2V0aF9zcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGhfaW5fYnl0ZXMsCisJCXUzMiB0eXBlLCB1MzIgdWxwLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCXN0cnVjdCBiZV9ldGhzcV9vYmplY3QgKmV0aF9zcSk7CisKK3N0cnVjdCBiZV9ldGhfc3FfcGFyYW1ldGVycyB7CisJdTMyIHBvcnQ7CisJdTMyIHJzdmQwWzJdOworfSA7CisKK2ludCBiZV9ldGhfc3FfY3JlYXRlX2V4KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICBzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aF9pbl9ieXRlcywKKwkJICAgIHUzMiB0eXBlLCB1MzIgdWxwLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCSAgICBzdHJ1Y3QgYmVfZXRoX3NxX3BhcmFtZXRlcnMgKmV4X3BhcmFtZXRlcnMsCisJCSAgICBzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0ICpldGhfc3EpOworaW50IGJlX2V0aF9zcV9kZXN0cm95KHN0cnVjdCBiZV9ldGhzcV9vYmplY3QgKmV0aF9zcSk7CisKK2ludCBiZV9ldGhfc2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJYm9vbCB0eGZjX2VuYWJsZSwgYm9vbCByeGZjX2VuYWJsZSk7CisKK2ludCBiZV9ldGhfZ2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJYm9vbCAqdHhmY19lbmFibGUsIGJvb2wgKnJ4ZmNfZW5hYmxlKTsKK2ludCBiZV9ldGhfc2V0X3FvcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCB1MzIgbWF4X2JwcywgdTMyIG1heF9wcHMpOworCitpbnQgYmVfZXRoX2dldF9xb3Moc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgdTMyICptYXhfYnBzLCB1MzIgKm1heF9wcHMpOworCitpbnQgYmVfZXRoX3NldF9mcmFtZV9zaXplKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgIHUzMiAqdHhfZnJhbWVfc2l6ZSwgdTMyICpyeF9mcmFtZV9zaXplKTsKKworaW50IGJlX2V0aF9ycV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJIHN0cnVjdCByaW5nX2Rlc2MgKnJkLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCSBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpiY21jX2NxX29iamVjdCwKKwkJIHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSk7CisKK2ludCBiZV9ldGhfcnFfZGVzdHJveShzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEpOworCitpbnQgYmVfZXRoX3JxX2Rlc3Ryb3lfb3B0aW9ucyhzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEsIGJvb2wgZmx1c2gsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0KTsKK2ludCBiZV9ldGhfcnFfc2V0X2ZyYWdfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQl1MzIgbmV3X2ZyYWdfc2l6ZV9ieXRlcywgdTMyICphY3R1YWxfZnJhZ19zaXplX2J5dGVzKTsKK2ludCBiZV9ldGhfcnFfZ2V0X2ZyYWdfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJCQkJdTMyICpmcmFnX3NpemVfYnl0ZXMpOworCit2b2lkICpiZV9mdW5jdGlvbl9wcmVwYXJlX2VtYmVkZGVkX2Z3Y21kKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwKKwkJICAgdTMyIHBheWxvYWRfbGVuZ3RoLCB1MzIgcmVxdWVzdF9sZW5ndGgsCisJCSAgIHUzMiByZXNwb25zZV9sZW5ndGgsIHUzMiBvcGNvZGUsIHUzMiBzdWJzeXN0ZW0pOwordm9pZCAqYmVfZnVuY3Rpb25fcHJlcGFyZV9ub25lbWJlZGRlZF9md2NtZChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgdm9pZCAqZndjbWRfaGVhZGVyX3ZhLCB1NjQgZndjbWRfaGVhZGVyX3BhLAorCXUzMiBwYXlsb2FkX2xlbmd0aCwgdTMyIHJlcXVlc3RfbGVuZ3RoLCB1MzIgcmVzcG9uc2VfbGVuZ3RoLAorCXUzMiBvcGNvZGUsIHUzMiBzdWJzeXN0ZW0pOworCisKK3N0cnVjdCBNQ0NfV1JCX0FNQVAgKgorYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCitpbnQgYmVfcnhmX21hY19hZGRyZXNzX3JlYWRfd3JpdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkgICAgICBib29sIHBvcnQxLCBib29sIG1hYzEsIGJvb2wgbWdtdCwKKwkgICAgICBib29sIHdyaXRlLCBib29sIHBlcm1hbmVudCwgdTggKm1hY19hZGRyZXNzLAorCSAgICAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCSAgICAgIHZvaWQgKmNiX2NvbnRleHQpOworCitpbnQgYmVfcnhmX211bHRpY2FzdF9jb25maWcoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCWJvb2wgcHJvbWlzY3VvdXMsIHUzMiBudW0sIHU4ICptYWNfdGFibGUsCisJCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJCXZvaWQgKmNiX2NvbnRleHQsCisJCQlzdHJ1Y3QgYmVfbXVsdGljYXN0X3FfY3R4dCAqcV9jdHh0KTsKKworaW50IGJlX3J4Zl92bGFuX2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCSAgIGJvb2wgcHJvbWlzY3VvdXMsIHUzMiBudW0sIHUxNiAqdmxhbl90YWdfYXJyYXksCisJICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQsCisJICAgc3RydWN0IGJlX3ZsYW5fcV9jdHh0ICpxX2N0eHQpOworCisKK2ludCBiZV9yeGZfbGlua19zdGF0dXMoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgc3RydWN0IEJFX0xJTktfU1RBVFVTICpsaW5rX3N0YXR1cywKKwkJICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgIHN0cnVjdCBiZV9saW5rX3N0YXR1c19xX2N0eHQgKnFfY3R4dCk7CisKKworaW50IGJlX3J4Zl9xdWVyeV9ldGhfc3RhdGlzdGljcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTICp2YV9mb3JfZndjbWQsCisJCXU2NCBwYV9mb3JfZndjbWQsIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQl2b2lkICpjYl9jb250ZXh0LAorCQlzdHJ1Y3QgYmVfbm9uZW1iZWRkZWRfcV9jdHh0ICpxX2N0eHQpOworCitpbnQgYmVfcnhmX3Byb21pc2N1b3VzKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIGJvb2wgZW5hYmxlX3BvcnQwLCBib29sIGVuYWJsZV9wb3J0MSwKKwkJICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgIHN0cnVjdCBiZV9wcm9taXNjdW91c19xX2N0eHQgKnFfY3R4dCk7CisKKworaW50IGJlX3J4Zl9maWx0ZXJfY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgc3RydWN0IE5UV0tfUlhfRklMVEVSX1NFVFRJTkdTICpzZXR0aW5ncywKKwkJICAgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJICAgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICAgIHN0cnVjdCBiZV9yeGZfZmlsdGVyX3FfY3R4dCAqcV9jdHh0KTsKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIGludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGJ5IGh3bGliCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisKK2ludCBiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3koc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgICAgIHUzMiBpZCwgdTMyIHJpbmdfdHlwZSwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgICAgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICAgICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2IsCisJCSAgICAgICB2b2lkICppbnRlcm5hbF9jYWxsYmFja19jb250ZXh0KTsKKworaW50IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsCisJCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqcV9jdHh0LAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2IsCisJCXZvaWQgKmludGVybmFsX2NiX2NvbnRleHQsIHZvaWQgKm9wdGlvbmFsX2Z3Y21kX3ZhLAorCQlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5ICpyZXNwb25zZV9jb3B5KTsKKworaW50IGJlX2Z1bmN0aW9uX3F1ZXVlX21jY193cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCSAgc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpxX2N0eHQpOworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgTUNDIFFVRVVFCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQgYmVfbXB1X2luaXRfbWFpbGJveChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCBzdHJ1Y3QgcmluZ19kZXNjICpyZCk7CisKKworc3RydWN0IE1DQ19XUkJfQU1BUCAqCitfYmVfbXB1X3BlZWtfcmluZ193cmIoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYywgYm9vbCBkcml2aW5nX3F1ZXVlKTsKKworc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqCitfYmVfbWNjX2FsbG9jYXRlX3dyYl9jb250ZXh0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCit2b2lkIF9iZV9tY2NfZnJlZV93cmJfY29udGV4dChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKmNvbnRleHQpOworCitpbnQgX2JlX21wdV9wb3N0X3dyYl9tYWlsYm94KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQpOworCitpbnQgX2JlX21wdV9wb3N0X3dyYl9yaW5nKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLCBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCk7CisKK3ZvaWQgYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjKTsKKworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgUmluZyBTaXplcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJlX3JpbmdfZW5jb2RpbmdfdG9fbGVuZ3RoKHUzMiBlbmNvZGluZywgdTMyIG9iamVjdF9zaXplKQoreworCisJQVNTRVJUKGVuY29kaW5nICE9IDEpOwkvKiAxIGlzIHJzdmQgKi8KKwlBU1NFUlQoZW5jb2RpbmcgPCAxNik7CisJQVNTRVJUKG9iamVjdF9zaXplID4gMCk7CisKKwlpZiAoZW5jb2RpbmcgPT0gMCkJLyogMzJrIGRlZXAgKi8KKwkJZW5jb2RpbmcgPSAxNjsKKworCXJldHVybiAoMSA8PCAoZW5jb2RpbmcgLSAxKSkgKiBvYmplY3Rfc2l6ZTsKK30KKworc3RhdGljIGlubGluZQordTMyIGJlX3JpbmdfbGVuZ3RoX3RvX2VuY29kaW5nKHUzMiBsZW5ndGhfaW5fYnl0ZXMsIHUzMiBvYmplY3Rfc2l6ZSkKK3sKKworCXUzMiBjb3VudCwgZW5jb2Rpbmc7CisKKwlBU1NFUlQob2JqZWN0X3NpemUgPiAwKTsKKwlBU1NFUlQobGVuZ3RoX2luX2J5dGVzICUgb2JqZWN0X3NpemUgPT0gMCk7CisKKwljb3VudCA9IGxlbmd0aF9pbl9ieXRlcyAvIG9iamVjdF9zaXplOworCisJQVNTRVJUKGNvdW50ID4gMSk7CisJQVNTRVJUKGNvdW50IDw9IDMyICogMTAyNCk7CisJQVNTRVJUKGxlbmd0aF9pbl9ieXRlcyA8PSA4ICogUEFHRV9TSVpFKTsgLyogbWF4IHJpbmcgc2l6ZSBpbiBVVCAqLworCisJZW5jb2RpbmcgPSBfX2lsb2cyX3UzMihjb3VudCkgKyAxOworCisJaWYgKGVuY29kaW5nID09IDE2KQorCQllbmNvZGluZyA9IDA7CS8qIDMyayBkZWVwICovCisKKwlyZXR1cm4gZW5jb2Rpbmc7Cit9CisKK3ZvaWQgYmVfcmRfdG9fcGFfbGlzdChzdHJ1Y3QgcmluZ19kZXNjICpyZCwgc3RydWN0IFBIWVNfQUREUiAqcGFfbGlzdCwKKwkJCQkJCXUzMiBtYXhfbnVtKTsKKyNlbmRpZiAvKiBfX2h3bGliX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdS5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OWNjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmMKQEAgLTAsMCArMSwxMzY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJod2xpYi5oIgorI2luY2x1ZGUgImJlc3RhdHVzLmgiCisKK3N0YXRpYworaW5saW5lIHZvaWQgbXBfcmluZ19jcmVhdGUoc3RydWN0IG1wX3JpbmcgKnJpbmcsIHUzMiBudW0sIHUzMiBzaXplLCB2b2lkICp2YSkKK3sKKwlBU1NFUlQocmluZyk7CisJbWVtc2V0KHJpbmcsIDAsIHNpemVvZihzdHJ1Y3QgbXBfcmluZykpOworCXJpbmctPm51bSA9IG51bTsKKwlyaW5nLT5wYWdlcyA9IERJVl9ST1VORF9VUChudW0gKiBzaXplLCBQQUdFX1NJWkUpOworCXJpbmctPml0ZW1TaXplID0gc2l6ZTsKKwlyaW5nLT52YSA9IHZhOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVyZmFjZSBmb3IgMiBpbmRleCByaW5ncy4gaS5lLiBjb25zdW1lci9wcm9kdWNlciByaW5ncworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBSZXR1cm5zIG51bWJlciBpdGVtcyBwZW5kaW5nIG9uIHJpbmcuICovCitzdGF0aWMgaW5saW5lIHUzMiBtcF9yaW5nX251bV9wZW5kaW5nKHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlpZiAocmluZy0+bnVtID09IDApCisJCXJldHVybiAwOworCXJldHVybiBiZV9zdWJjKHJpbmctPnBpZHgsIHJpbmctPmNpZHgsIHJpbmctPm51bSk7Cit9CisKKy8qIFJldHVybnMgbnVtYmVyIGl0ZW1zIGZyZWUgb24gcmluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1wX3JpbmdfbnVtX2VtcHR5KHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlyZXR1cm4gcmluZy0+bnVtIC0gMSAtIG1wX3JpbmdfbnVtX3BlbmRpbmcocmluZyk7Cit9CisKKy8qIENvbnN1bWUgMSBpdGVtICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXBfcmluZ19jb25zdW1lKHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlBU1NFUlQocmluZy0+cGlkeCAhPSByaW5nLT5jaWR4KTsKKworCXJpbmctPmNpZHggPSBiZV9hZGRjKHJpbmctPmNpZHgsIDEsIHJpbmctPm51bSk7Cit9CisKKy8qIFByb2R1Y2UgMSBpdGVtICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXBfcmluZ19wcm9kdWNlKHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlyaW5nLT5waWR4ID0gYmVfYWRkYyhyaW5nLT5waWR4LCAxLCByaW5nLT5udW0pOworfQorCisvKiBDb25zdW1lIGNvdW50IGl0ZW1zICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXBfcmluZ19jb25zdW1lX211bHRpcGxlKHN0cnVjdCBtcF9yaW5nICpyaW5nLCB1MzIgY291bnQpCit7CisJQVNTRVJUKHJpbmcpOworCUFTU0VSVChtcF9yaW5nX251bV9wZW5kaW5nKHJpbmcpID49IGNvdW50KTsKKwlyaW5nLT5jaWR4ID0gYmVfYWRkYyhyaW5nLT5jaWR4LCBjb3VudCwgcmluZy0+bnVtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICptcF9yaW5nX2l0ZW0oc3RydWN0IG1wX3JpbmcgKnJpbmcsIHUzMiBpbmRleCkKK3sKKwlBU1NFUlQocmluZyk7CisJQVNTRVJUKGluZGV4IDwgcmluZy0+bnVtKTsKKwlBU1NFUlQocmluZy0+aXRlbVNpemUgPiAwKTsKKwlyZXR1cm4gKHU4ICopIHJpbmctPnZhICsgaW5kZXggKiByaW5nLT5pdGVtU2l6ZTsKK30KKworLyogUHRyIHRvIHByb2R1Y2UgaXRlbSAqLworc3RhdGljIGlubGluZSB2b2lkICptcF9yaW5nX3Byb2R1Y2VyX3B0cihzdHJ1Y3QgbXBfcmluZyAqcmluZykKK3sKKwlBU1NFUlQocmluZyk7CisJcmV0dXJuIG1wX3JpbmdfaXRlbShyaW5nLCByaW5nLT5waWR4KTsKK30KKworLyoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSByaW5nLgorICogVGhpcyBpcyB1c2VkIGZvciByaW5ncyB3aXRoIDEgaW5kZXguCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXBfcmluZ19jdXJyZW50KHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlBU1NFUlQocmluZy0+cGlkeCA9PSAwKTsJLyogbm90IHVzZWQgKi8KKworCXJldHVybiBtcF9yaW5nX2l0ZW0ocmluZywgcmluZy0+Y2lkeCk7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgaW5kZXggZm9yIHJpbmdzIHdpdGggb25seSAxIGluZGV4LgorICogVGhpcyBpcyB1c2VkIGZvciByaW5ncyB3aXRoIDEgaW5kZXguCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXBfcmluZ19uZXh0KHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlBU1NFUlQocmluZy0+bnVtID4gMCk7CisJQVNTRVJUKHJpbmctPnBpZHggPT0gMCk7CS8qIG5vdCB1c2VkICovCisKKwlyaW5nLT5jaWR4ID0gYmVfYWRkYyhyaW5nLT5jaWR4LCAxLCByaW5nLT5udW0pOworCXJldHVybiBtcF9yaW5nX2N1cnJlbnQocmluZyk7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHdhaXRzIGZvciBhIHByZXZpb3VzbHkgcG9zdGVkIG1haWxib3ggV1JCIHRvIGJlIGNvbXBsZXRlZC4KKyAgICBTcGVjaWZpY2FsbHkgaXQgd2FpdHMgZm9yIHRoZSBtYWlsYm94IHRvIHNheSB0aGF0IGl0J3MgcmVhZHkgdG8gYWNjZXB0CisgICAgbW9yZSBkYXRhIGJ5IHNldHRpbmcgdGhlIExTQiBvZiB0aGUgbWFpbGJveCBwZCByZWdpc3RlciB0byAxLgorCisgICAgcGNvbnRyb2xsZXIgICAgICAtIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gcG9zdCB0aGlzIGRhdGEgdG8KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorKi8KK3N0YXRpYyB2b2lkIGJlX21jY19tYWlsYm94X3dhaXQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTVBVX01BSUxCT1hfREJfQU1BUCBtYWlsYm94X2RiOworCXUzMiBpID0gMDsKKwl1MzIgcmVhZHk7CisKKwlpZiAocGZvYi0+ZW11bGF0ZSkgeworCQkvKiBObyB3YWl0aW5nIGZvciBtYWlsYm94IGluIGVtdWxhdGVkIG1vZGUuICovCisJCXJldHVybjsKKwl9CisKKwltYWlsYm94X2RiLmR3WzBdID0gUERfUkVBRChwZm9iLCBtY2NfYm9vdHN0cmFwX2RiKTsKKwlyZWFkeSA9IEFNQVBfR0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCByZWFkeSwgJm1haWxib3hfZGIpOworCisJd2hpbGUgKHJlYWR5ID09IGZhbHNlKSB7CisJCWlmICgoKytpICYgMHgzRkZGRikgPT0gMCkgeworCQkJVFJBQ0UoRExfV0FSTiwgIldhaXRpbmcgZm9yIG1haWxib3ggcmVhZHkgLSAlZGsgcG9sbHMiLAorCQkJCQkJCQlpIC8gMTAwMCk7CisJCX0KKwkJdWRlbGF5KDEpOworCQltYWlsYm94X2RiLmR3WzBdID0gUERfUkVBRChwZm9iLCBtY2NfYm9vdHN0cmFwX2RiKTsKKwkJcmVhZHkgPSBBTUFQX0dFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgcmVhZHksICZtYWlsYm94X2RiKTsKKwl9Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHRlbGxzIHRoZSBNQ0MgbWFpbGJveCB0aGF0IHRoZXJlIGlzIGRhdGEgdG8gcHJvY2Vzc2VkCisgICAgaW4gdGhlIG1haWxib3guIEl0IGRvZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUKKyAgICBtYWlsYm94IGxvY2F0aW9uIGFuZCBjbGVhcmluZyB0aGUgTFNCLiAgVGhpcyByb3V0aW5lIHJldHVybnMgaW1tZWRpYXRlbHkKKyAgICBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgdGhlIFdSQiB0byBiZSBwcm9jZXNzZWQuCisKKyAgICBwY29udHJvbGxlciAgICAgIC0gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBwb3N0IHRoaXMgZGF0YSB0bworCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisKKyovCitzdGF0aWMgdm9pZCBiZV9tY2NfbWFpbGJveF9ub3RpZnkoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTVBVX01BSUxCT1hfREJfQU1BUCBtYWlsYm94X2RiOworCXUzMiBwYTsKKworCUFTU0VSVChwZm9iLT5tYWlsYm94LnBhKTsKKwlBU1NFUlQocGZvYi0+bWFpbGJveC52YSk7CisKKwkvKiBJZiBlbXVsYXRlZCwgZG8gbm90IHJpbmcgdGhlIG1haWxib3ggKi8KKwlpZiAocGZvYi0+ZW11bGF0ZSkgeworCQlUUkFDRShETF9XQVJOLCAiTVBVIGRpc2FibGVkLiBTa2lwcGluZyBtYWlsYm94IG5vdGlmeS4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGZvcm0gdGhlIGhpZ2hlciBiaXRzIGluIHRoZSBhZGRyZXNzICovCisJbWFpbGJveF9kYi5kd1swXSA9IDA7CS8qIGluaXQgKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgaGksICZtYWlsYm94X2RiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgcmVhZHksICZtYWlsYm94X2RiLCAwKTsKKworCS8qIGJpdHMgMzQgdG8gNjMgKi8KKwlwYSA9ICh1MzIpIChwZm9iLT5tYWlsYm94LnBhID4+IDM0KTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgYWRkcmVzcywgJm1haWxib3hfZGIsIHBhKTsKKworCS8qIFdhaXQgZm9yIHRoZSBNUFUgdG8gYmUgcmVhZHkgKi8KKwliZV9tY2NfbWFpbGJveF93YWl0KHBmb2IpOworCisJLyogUmluZyBkb29yYmVsbCAxc3QgdGltZSAqLworCVBEX1dSSVRFKHBmb2IsIG1jY19ib290c3RyYXBfZGIsIG1haWxib3hfZGIuZHdbMF0pOworCisJLyogV2FpdCBmb3IgMXN0IHdyaXRlIHRvIGJlIGFja25vd2xlZGdlZC4gKi8KKwliZV9tY2NfbWFpbGJveF93YWl0KHBmb2IpOworCisJLyogbG93ZXIgYml0cyAzMCBiaXRzIGZyb20gNHRoIGJpdCAoYml0cyA0IHRvIDMzKSovCisJcGEgPSAodTMyKSAocGZvYi0+bWFpbGJveC5wYSA+PiA0KSAmIDB4M0ZGRkZGRkY7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgaGksICZtYWlsYm94X2RiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgcmVhZHksICZtYWlsYm94X2RiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgYWRkcmVzcywgJm1haWxib3hfZGIsIHBhKTsKKworCS8qIFJpbmcgZG9vcmJlbGwgMm5kIHRpbWUgKi8KKwlQRF9XUklURShwZm9iLCBtY2NfYm9vdHN0cmFwX2RiLCBtYWlsYm94X2RiLmR3WzBdKTsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgdGVsbHMgdGhlIE1DQyBtYWlsYm94IHRoYXQgdGhlcmUgaXMgZGF0YSB0byBwcm9jZXNzZWQKKyAgICBpbiB0aGUgbWFpbGJveC4gSXQgZG9lcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZQorICAgIG1haWxib3ggbG9jYXRpb24gYW5kIGNsZWFyaW5nIHRoZSBMU0IuICBUaGlzIHJvdXRpbmUgc3BpbnMgdW50aWwgdGhlCisgICAgTVBVIHdyaXRlcyBhIDEgaW50byB0aGUgTFNCIGluZGljYXRpbmcgdGhhdCB0aGUgZGF0YSBoYXMgYmVlbiByZWNlaXZlZAorICAgIGFuZCBpcyByZWFkeSB0byBiZSBwcm9jZXNzZWQuCisKKyAgICBwY29udHJvbGxlciAgICAgIC0gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBwb3N0IHRoaXMgZGF0YSB0bworCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisqLworc3RhdGljIHZvaWQKK2JlX21jY19tYWlsYm94X25vdGlmeV9hbmRfd2FpdChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCS8qCisJICogTm90aWZ5IGl0CisJICovCisJYmVfbWNjX21haWxib3hfbm90aWZ5KHBmb2IpOworCS8qCisJICogTm93IHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgV1JCCisJICovCisJYmVfbWNjX21haWxib3hfd2FpdChwZm9iKTsKK30KKwordm9pZAorYmVfbWNjX3Byb2Nlc3NfY3FlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQkJc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICpjcWUpCit7CisJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQgPSBOVUxMOworCXUzMiBvZmZzZXQsIHN0YXR1czsKKwl1OCAqcDsKKworCUFTU0VSVChjcWUpOworCS8qCisJICogQSBjb21tYW5kIGNvbXBsZXRlZC4gIENvbW1hbmRzIGNvbXBsZXRlIG91dC1vZi1vcmRlci4KKwkgKiBEZXRlcm1pbmUgd2hpY2ggY29tbWFuZCBjb21wbGV0ZWQgZnJvbSB0aGUgVEFHLgorCSAqLworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfQ1FfRU5UUllfQU1BUCwgbWNjX3RhZykvODsKKwlwID0gKHU4ICopIGNxZSArIG9mZnNldDsKKwl3cmJfY29udGV4dCA9IChzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICopKHZvaWQgKikoc2l6ZV90KSgqKHU2NCAqKXApOworCUFTU0VSVCh3cmJfY29udGV4dCk7CisKKwkvKgorCSAqIFBlcmZvcm0gYSByZXNwb25zZSBjb3B5IGlmIHJlcXVlc3RlZC4KKwkgKiBPbmx5IGNvcHkgZGF0YSBpZiB0aGUgRldDTUQgaXMgc3VjY2Vzc2Z1bC4KKwkgKi8KKwlzdGF0dXMgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksIGNvbXBsZXRpb25fc3RhdHVzLCBjcWUpOworCWlmIChzdGF0dXMgPT0gTUdNVF9TVEFUVVNfU1VDQ0VTUyAmJiB3cmJfY29udGV4dC0+Y29weS5sZW5ndGggPiAwKSB7CisJCUFTU0VSVCh3cmJfY29udGV4dC0+d3JiKTsKKwkJQVNTRVJUKHdyYl9jb250ZXh0LT5jb3B5LnZhKTsKKwkJcCA9ICh1OCAqKXdyYl9jb250ZXh0LT53cmIgKworCQkJCW9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfV1JCX0FNQVAsIHBheWxvYWQpLzg7CisJCW1lbWNweSh3cmJfY29udGV4dC0+Y29weS52YSwKKwkJCSAgKHU4ICopcCArIHdyYl9jb250ZXh0LT5jb3B5LmZ3Y21kX29mZnNldCwKKwkJCSAgd3JiX2NvbnRleHQtPmNvcHkubGVuZ3RoKTsKKwl9CisKKwlpZiAoc3RhdHVzKQorCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJLyogaW50ZXJuYWwgY2FsbGJhY2sgKi8KKwlpZiAod3JiX2NvbnRleHQtPmludGVybmFsX2NiKSB7CisJCXdyYl9jb250ZXh0LT5pbnRlcm5hbF9jYih3cmJfY29udGV4dC0+aW50ZXJuYWxfY2JfY29udGV4dCwKKwkJCQkJCXN0YXR1cywgd3JiX2NvbnRleHQtPndyYik7CisJfQorCisJLyogY2FsbGJhY2sgKi8KKwlpZiAod3JiX2NvbnRleHQtPmNiKSB7CisJCXdyYl9jb250ZXh0LT5jYih3cmJfY29udGV4dC0+Y2JfY29udGV4dCwKKwkJCQkJICAgICAgc3RhdHVzLCB3cmJfY29udGV4dC0+d3JiKTsKKwl9CisJLyogRnJlZSB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgKi8KKwlfYmVfbWNjX2ZyZWVfd3JiX2NvbnRleHQocGZvYiwgd3JiX2NvbnRleHQpOworfQorCit2b2lkIGJlX2RyaXZlX21jY193cmJfcXVldWUoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYykKK3sKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gQkVfUEVORElORzsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKnFfY3R4dDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmI7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqcXVldWVfd3JiOworCXUzMiBsZW5ndGgsIHBheWxvYWRfbGVuZ3RoLCBzZ2VfY291bnQsIGVtYmVkZGVkOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUJVSUxEX0JVR19PTigoc2l6ZW9mKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCkgPAorCQkJICBzaXplb2Yoc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0KSArCisJCQkJCXNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSkpOworCXBmb2IgPSBtY2MtPnBhcmVudF9mdW5jdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKG1jYy0+ZHJpdmluZ19iYWNrbG9nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCQl9CisJCXJldHVybjsKKwl9CisJLyogQWNxdWlyZSB0aGUgZmxhZyB0byBsaW1pdCAxIHRocmVhZCB0byByZWRyaXZlIHBvc3RzLiAqLworCW1jYy0+ZHJpdmluZ19iYWNrbG9nID0gMTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbWNjLT5iYWNrbG9nKSkgeworCQl3cmIgPSBfYmVfbXB1X3BlZWtfcmluZ193cmIobWNjLCB0cnVlKTsJLyogRHJpdmluZyB0aGUgcXVldWUgKi8KKwkJaWYgKCF3cmIpCisJCQlicmVhazsJLyogTm8gc3BhY2UgaW4gdGhlIHJpbmcgeWV0LiAqLworCQkvKiBHZXQgdGhlIG5leHQgcXVldWVkIGVudHJ5IHRvIHByb2Nlc3MuICovCisJCXFfY3R4dCA9IGxpc3RfZmlyc3RfZW50cnkoJm1jYy0+YmFja2xvZywKKwkJCQlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQsIGNvbnRleHQubGlzdCk7CisJCWxpc3RfZGVsKCZxX2N0eHQtPmNvbnRleHQubGlzdCk7CisJCXBmb2ItPm1jYy0+YmFja2xvZ19sZW5ndGgtLTsKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgcmVxdWlyZWQgbGVuZ3RoIG9mIHRoZSBXUkIuCisJCSAqIFNpbmNlIHRoZSBxdWV1ZSBlbGVtZW50IG1heSBiZSBzbWFsbGVyIHRoYW4KKwkJICogdGhlIGNvbXBsZXRlIFdSQiwgY29weSBvbmx5IHRoZSByZXF1aXJlZCBudW1iZXIgb2YgYnl0ZXMuCisJCSAqLworCQlxdWV1ZV93cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQllbWJlZGRlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19XUkIsIGVtYmVkZGVkLCBxdWV1ZV93cmIpOworCQlpZiAoZW1iZWRkZWQpIHsKKwkJCXBheWxvYWRfbGVuZ3RoID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX1dSQiwKKwkJCQkJCXBheWxvYWRfbGVuZ3RoLCBxdWV1ZV93cmIpOworCQkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlcikgKworCQkJCQkJCQlwYXlsb2FkX2xlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCXNnZV9jb3VudCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19XUkIsIHNnZV9jb3VudCwKKwkJCQkJCQkJcXVldWVfd3JiKTsKKwkJCUFTU0VSVChzZ2VfY291bnQgPT0gMSk7IC8qIG9ubHkgMSBmcmFnLiAqLworCQkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlcikgKworCQkJICAgIHNnZV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgTUNDX1NHRV9BTUFQKTsKKwkJfQorCisJCS8qCisJCSAqIFRydW5jYXRlIHRoZSBsZW5ndGggYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlCisJCSAqIHF1ZXVlIGVsZW1lbnQuICBTb21lIGVsZW1lbnRzIHRoYXQgaGF2ZSBvdXRwdXQgcGFyYW1ldGVycworCQkgKiBjYW4gYmUgc21hbGxlciB0aGFuIHRoZSBwYXlsb2FkX2xlbmd0aCBmaWVsZCB3b3VsZAorCQkgKiBpbmRpY2F0ZS4gIFdlIHJlYWxseSBvbmx5IG5lZWQgdG8gY29weSB0aGUgcmVxdWVzdAorCQkgKiBwYXJhbWV0ZXJzLCBub3QgdGhlIHJlc3BvbnNlLgorCQkgKi8KKwkJbGVuZ3RoID0gbWluKGxlbmd0aCwgKHUzMikgKHFfY3R4dC0+Y29udGV4dC5ieXRlcyAtCisJCQlvZmZzZXRvZihzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQsIHdyYl9oZWFkZXIpKSk7CisKKwkJLyogQ29weSB0aGUgcXVldWUgZWxlbWVudCBXUkIgaW50byB0aGUgcmluZy4gKi8KKwkJbWVtY3B5KHdyYiwgJnFfY3R4dC0+d3JiX2hlYWRlciwgbGVuZ3RoKTsKKworCQkvKiBQb3N0IHRoZSB3cmIuICBUaGlzIHNob3VsZCBub3QgZmFpbCBhc3N1bWluZyB3ZSBoYXZlCisJCSAqIGVub3VnaCBjb250ZXh0IHN0cnVjdHMuICovCisJCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsCisJCQkgICBxX2N0eHQtPmNvbnRleHQuY2IsIHFfY3R4dC0+Y29udGV4dC5jYl9jb250ZXh0LAorCQkJICAgcV9jdHh0LT5jb250ZXh0LmludGVybmFsX2NiLAorCQkJICAgcV9jdHh0LT5jb250ZXh0LmludGVybmFsX2NiX2NvbnRleHQsCisJCQkgICBxX2N0eHQtPmNvbnRleHQub3B0aW9uYWxfZndjbWRfdmEsCisJCQkgICAmcV9jdHh0LT5jb250ZXh0LmNvcHkpOworCisJCWlmIChzdGF0dXMgPT0gQkVfU1VDQ0VTUykgeworCQkJLyoKKwkJCSAqIFN5bmNocm9ub3VzIGNvbXBsZXRpb24uIFNpbmNlIGl0IHdhcyBxdWV1ZWQsCisJCQkgKiB3ZSB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2suCisJCQkgKiBUbyB0aGUgdXNlciwgdGhpcyBpcyBhbiBhc3luY2hyb25vdXMgcmVxdWVzdC4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwkJCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCQkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJCQl9CisKKwkJCUFTU0VSVChxX2N0eHQtPmNvbnRleHQuY2IpOworCisJCQlxX2N0eHQtPmNvbnRleHQuY2IoCisJCQkJcV9jdHh0LT5jb250ZXh0LmNiX2NvbnRleHQsCisJCQkJCQlCRV9TVUNDRVNTLCBOVUxMKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwkJfSBlbHNlIGlmIChzdGF0dXMgIT0gQkVfUEVORElORykgeworCQkJLyoKKwkJCSAqIEFub3RoZXIgcmVzb3VyY2UgZmFpbGVkLiAgU2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJICogaWYgd2UgaGF2ZSBzdWZmaWNpZW50IE1DQ19XUkJfQ09OVEVYVCBzdHJ1Y3RzLgorCQkJICogUmV0dXJuIHRvIGhlYWQgb2YgdGhlIHF1ZXVlLgorCQkJICovCisJCQlUUkFDRShETF9XQVJOLCAiRmFpbGVkIHRvIHBvc3QgYSBxdWV1ZWQgV1JCLiAweCV4IiwKKwkJCSAgICAgIHN0YXR1cyk7CisJCQlsaXN0X2FkZCgmcV9jdHh0LT5jb250ZXh0Lmxpc3QsICZtY2MtPmJhY2tsb2cpOworCQkJcGZvYi0+bWNjLT5iYWNrbG9nX2xlbmd0aCsrOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBGcmVlIHRoZSBmbGFnIHRvIGxpbWl0IDEgdGhyZWFkIHRvIHJlZHJpdmUgcG9zdHMuICovCisJbWNjLT5kcml2aW5nX2JhY2tsb2cgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gYXNzZXJ0cyB0aGF0IHRoZSBXUkIgd2FzIGNvbnN1bWVkIGluIG9yZGVyLiAqLworI2lmZGVmIEJFX0RFQlVHCit1MzIgYmVfbWNjX3dyYl9jb25zdW1lZF9pbl9vcmRlcihzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjLAorCQkJCQlzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKmNxZSkKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCA9IE5VTEw7CisJdTMyIHdyYl9pbmRleDsKKwl1MzIgd3JiX2NvbnN1bWVkX2luX29yZGVyOworCXUzMiBvZmZzZXQ7CisJdTggKnA7CisKKwlBU1NFUlQoY3FlKTsKKwkvKgorCSAqIEEgY29tbWFuZCBjb21wbGV0ZWQuICBDb21tYW5kcyBjb21wbGV0ZSBvdXQtb2Ytb3JkZXIuCisJICogRGV0ZXJtaW5lIHdoaWNoIGNvbW1hbmQgY29tcGxldGVkIGZyb20gdGhlIFRBRy4KKwkgKi8KKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX0NRX0VOVFJZX0FNQVAsIG1jY190YWcpLzg7CisJcCA9ICh1OCAqKSBjcWUgKyBvZmZzZXQ7CisJd3JiX2NvbnRleHQgPSAoc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqKSh2b2lkICopKHNpemVfdCkoKih1NjQgKilwKTsKKworCUFTU0VSVCh3cmJfY29udGV4dCk7CisKKwl3cmJfaW5kZXggPSAodTMyKSAoKCh1NjQpKHNpemVfdCl3cmJfY29udGV4dC0+cmluZ193cmIgLQorCQkodTY0KShzaXplX3QpbWNjLT5zcS5yaW5nLnZhKSAvIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSk7CisKKwlBU1NFUlQod3JiX2luZGV4IDwgbWNjLT5zcS5yaW5nLm51bSk7CisKKwl3cmJfY29uc3VtZWRfaW5fb3JkZXIgPSAodTMyKSAod3JiX2luZGV4ID09IG1jYy0+Y29uc3VtZWRfaW5kZXgpOworCW1jYy0+Y29uc3VtZWRfaW5kZXggPSBiZV9hZGRjKG1jYy0+Y29uc3VtZWRfaW5kZXgsIDEsIG1jYy0+c3EucmluZy5udW0pOworCXJldHVybiB3cmJfY29uc3VtZWRfaW5fb3JkZXI7Cit9CisjZW5kaWYKKworaW50IGJlX21jY19wcm9jZXNzX2NxKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsIGJvb2wgcmVhcm0pCit7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiA9IE5VTEw7CisJc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICpjcWU7CisJc3RydWN0IENRX0RCX0FNQVAgZGI7CisJc3RydWN0IG1wX3JpbmcgKmNxX3JpbmcgPSAmbWNjLT5jcS5yaW5nOworCXN0cnVjdCBtcF9yaW5nICptcF9yaW5nID0gJm1jYy0+c3EucmluZzsKKwl1MzIgbnVtX3Byb2Nlc3NlZCA9IDA7CisJdTMyIGNvbnN1bWVkID0gMCwgdmFsaWQsIGNvbXBsZXRlZCwgY3FlX2NvbnN1bWVkLCBhc3luY19ldmVudDsKKworCXBmb2IgPSBtY2MtPnBhcmVudF9mdW5jdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5jcV9sb2NrLCBwZm9iLT5jcV9pcnEpOworCisJLyoKKwkgKiBWZXJpZnkgdGhhdCBvbmx5IG9uZSB0aHJlYWQgaXMgcHJvY2Vzc2luZyB0aGUgQ1EgYXQgb25jZS4KKwkgKiBXZSBjYW5ub3QgaG9sZCB0aGUgbG9jayB3aGlsZSBwcm9jZXNzaW5nIHRoZSBDUSBkdWUgdG8KKwkgKiB0aGUgY2FsbGJhY2tzIGludG8gdGhlIE9TLiAgVGhlcmVmb3JlLCB0aGlzIGZsYWcgaXMgdXNlZAorCSAqIHRvIGNvbnRyb2wgaXQuICBJZiBhbnkgb2YgdGhlIHRocmVhZHMgd2FudCB0bworCSAqIHJlYXJtIHRoZSBDUSwgd2UgbmVlZCB0byBob25vciB0aGF0LgorCSAqLworCWlmIChtY2MtPnByb2Nlc3NpbmcgIT0gMCkgeworCQltY2MtPnJlYXJtID0gbWNjLT5yZWFybSB8fCByZWFybTsKKwkJZ290byBFcnJvcjsKKwl9IGVsc2UgeworCQltY2MtPnByb2Nlc3NpbmcgPSAxOwkvKiBsb2NrIHByb2Nlc3NpbmcgZm9yIHRoaXMgdGhyZWFkLiAqLworCQltY2MtPnJlYXJtID0gcmVhcm07CS8qIHNldCBvdXIgcmVhcm0gc2V0dGluZyAqLworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPmNxX2xvY2ssIHBmb2ItPmNxX2lycSk7CisKKwljcWUgPSBtcF9yaW5nX2N1cnJlbnQoY3FfcmluZyk7CisJdmFsaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksIHZhbGlkLCBjcWUpOworCXdoaWxlICh2YWxpZCkgeworCisJCWlmIChudW1fcHJvY2Vzc2VkID49IDgpIHsKKwkJCS8qIGNvYWxlc2NlIGRvb3JiZWxscywgYnV0IGZyZWUgc3BhY2UgaW4gY3EKKwkJCSAqIHJpbmcgd2hpbGUgcHJvY2Vzc2luZy4gKi8KKwkJCWRiLmR3WzBdID0gMDsJLyogY2xlYXIgKi8KKwkJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZkYiwgY3FfcmluZy0+aWQpOworCQkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmZGIsIGZhbHNlKTsKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBldmVudCwgJmRiLCBmYWxzZSk7CisJCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmRiLAorCQkJCQkJCW51bV9wcm9jZXNzZWQpOworCQkJbnVtX3Byb2Nlc3NlZCA9IDA7CisKKwkJCVBEX1dSSVRFKHBmb2IsIGNxX2RiLCBkYi5kd1swXSk7CisJCX0KKworCQlhc3luY19ldmVudCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwgYXN5bmNfZXZlbnQsIGNxZSk7CisJCWlmIChhc3luY19ldmVudCkgeworCQkJLyogVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgZXZlbnQuICovCisJCQlzdHJ1Y3QgQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQICphc3luY190cmFpbGVyID0KKwkJCSAgICAoc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCAqKQorCQkJICAgICgodTggKikgY3FlICsgc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCkgLQorCQkJICAgICBzaXplb2Yoc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCkpOworCQkJdTMyIGV2ZW50X2NvZGU7CisJCQlhc3luY19ldmVudCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsCisJCQkJCQlhc3luY19ldmVudCwgYXN5bmNfdHJhaWxlcik7CisJCQlBU1NFUlQoYXN5bmNfZXZlbnQgPT0gMSk7CisKKworCQkJdmFsaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9UUkFJTEVSLAorCQkJCQkJdmFsaWQsIGFzeW5jX3RyYWlsZXIpOworCQkJQVNTRVJUKHZhbGlkID09IDEpOworCisJCQkvKiBDYWxsIHRoZSBhc3luYyBldmVudCBoYW5kbGVyIGlmIGl0IGlzIGluc3RhbGxlZC4gKi8KKwkJCWlmIChtY2MtPmFzeW5jX2NiKSB7CisJCQkJZXZlbnRfY29kZSA9CisJCQkJCUFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsCisJCQkJCQlldmVudF9jb2RlLCBhc3luY190cmFpbGVyKTsKKwkJCQltY2MtPmFzeW5jX2NiKG1jYy0+YXN5bmNfY29udGV4dCwKKwkJCQkJICAgICh1MzIpIGV2ZW50X2NvZGUsICh2b2lkICopIGNxZSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCS8qIFRoaXMgaXMgYSBjb21wbGV0aW9uIGVudHJ5LiAqLworCisJCQkvKiBObyB2bSBmb3J3YXJkaW5nIGluIHRoaXMgZHJpdmVyLiAqLworCisJCQljcWVfY29uc3VtZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksCisJCQkJCQljb25zdW1lZCwgY3FlKTsKKwkJCWlmIChjcWVfY29uc3VtZWQpIHsKKwkJCQkvKgorCQkJCSAqIEEgY29tbWFuZCBvbiB0aGUgTUNDIHJpbmcgd2FzIGNvbnN1bWVkLgorCQkJCSAqIFVwZGF0ZSB0aGUgY29uc3VtZXIgaW5kZXguCisJCQkJICogVGhlc2Ugb2NjdXIgaW4gb3JkZXIuCisJCQkJICovCisJCQkJQVNTRVJUKGJlX21jY193cmJfY29uc3VtZWRfaW5fb3JkZXIobWNjLCBjcWUpKTsKKwkJCQljb25zdW1lZCsrOworCQkJfQorCisJCQljb21wbGV0ZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksCisJCQkJCWNvbXBsZXRlZCwgY3FlKTsKKwkJCWlmIChjb21wbGV0ZWQpIHsKKwkJCQkvKiBBIGNvbW1hbmQgY29tcGxldGVkLiAgVXNlIHRhZyB0bworCQkJCSAqIGRldGVybWluZSB3aGljaCBjb21tYW5kLiAgKi8KKwkJCQliZV9tY2NfcHJvY2Vzc19jcWUocGZvYiwgY3FlKTsKKwkJCX0KKwkJfQorCisJCS8qIFJlc2V0IHRoZSBDUUUgKi8KKwkJQU1BUF9TRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLCB2YWxpZCwgY3FlLCBmYWxzZSk7CisJCW51bV9wcm9jZXNzZWQrKzsKKworCQkvKiBVcGRhdGUgb3VyIHRyYWNraW5nIGZvciB0aGUgQ1EgcmluZy4gKi8KKwkJY3FlID0gbXBfcmluZ19uZXh0KGNxX3JpbmcpOworCQl2YWxpZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwgdmFsaWQsIGNxZSk7CisJfQorCisJVFJBQ0UoRExfSU5GTywgIm51bV9wcm9jZXNzZWQ6MHgleCwgYW5kIGNvbnN1bWVkOjB4JXgiLAorCSAgICAgIG51bV9wcm9jZXNzZWQsIGNvbnN1bWVkKTsKKwkvKgorCSAqIEdyYWIgdGhlIENRIGxvY2sgdG8gc3luY2hyb25pemUgdGhlICJyZWFybSIgc2V0dGluZyBmb3IKKwkgKiB0aGUgZG9vcmJlbGwsIGFuZCBmb3IgY2xlYXJpbmcgdGhlICJwcm9jZXNzaW5nIiBmbGFnLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5jcV9sb2NrLCBwZm9iLT5jcV9pcnEpOworCisJLyoKKwkgKiBSZWFybSB0aGUgY3EuICBUaGlzIGlzIGRvbmUgYmFzZWQgb24gdGhlIGdsb2JhbCBtY2MtPnJlYXJtCisJICogZmxhZyB3aGljaCBjb21iaW5lcyB0aGUgcmVhcm0gcGFyYW1ldGVyIGZyb20gdGhlIGN1cnJlbnQKKwkgKiBjYWxsIHRvIHByb2Nlc3NfY3EgYW5kIGFueSBvdGhlciB0aHJlYWRzCisJICogdGhhdCB0cmllZCB0byBwcm9jZXNzIHRoZSBDUSB3aGlsZSB0aGlzIG9uZSB3YXMgYWN0aXZlLgorCSAqIFRoaXMgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIGEgc3luYy4gZndjbWQgd2FzIHByb2Nlc3NpbmcKKwkgKiB0aGUgQ1Egd2hpbGUgdGhlIGludGVycnVwdC9kcGMgdHJpZXMgdG8gcHJvY2VzcyBpdC4KKwkgKiBUaGUgc3luYyBwcm9jZXNzIGdldHMgdG8gY29udGludWUgLS0gYnV0IGl0IGlzIG5vdworCSAqIHJlc3BvbnNpYmxlIGZvciB0aGUgcmVhcm1pbmcuCisJICovCisJaWYgKG51bV9wcm9jZXNzZWQgPiAwIHx8IG1jYy0+cmVhcm0gPT0gdHJ1ZSkgeworCQlkYi5kd1swXSA9IDA7CS8qIGNsZWFyICovCisJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZkYiwgY3FfcmluZy0+aWQpOworCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZkYiwgbWNjLT5yZWFybSk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBldmVudCwgJmRiLCBmYWxzZSk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBudW1fcG9wcGVkLCAmZGIsIG51bV9wcm9jZXNzZWQpOworCisJCVBEX1dSSVRFKHBmb2IsIGNxX2RiLCBkYi5kd1swXSk7CisJfQorCS8qCisJICogVXBkYXRlIHRoZSBjb25zdW1lciBpbmRleCBhZnRlciByaW5naW5nIHRoZSBDUSBkb29yYmVsbC4KKwkgKiBXZSBkb24ndCB3YW50IGFub3RoZXIgdGhyZWFkIHRvIHBvc3QgbW9yZSBXUkJzIGJlZm9yZSB3ZQorCSAqIGhhdmUgQ1Egc3BhY2UgYXZhaWxhYmxlLgorCSAqLworCW1wX3JpbmdfY29uc3VtZV9tdWx0aXBsZShtcF9yaW5nLCBjb25zdW1lZCk7CisKKwkvKiBDbGVhciB0aGUgcHJvY2Vzc2luZyBmbGFnLiAqLworCW1jYy0+cHJvY2Vzc2luZyA9IDA7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPmNxX2xvY2ssIHBmb2ItPmNxX2lycSk7CisJLyoKKwkgKiBVc2UgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGRldGVjdCBpZiB0aGUgY3VycmVudCB0aHJlYWQKKwkgKiBob2xkcyB0aGUgV1JCIHBvc3QgbG9jay4gIElmIHJlYXJtIGlzIGZhbHNlLCB0aGlzIGlzCisJICogZWl0aGVyIGEgc3luY2hyb25vdXMgY29tbWFuZCwgb3IgdGhlIHVwcGVyIGxheWVyIGRyaXZlciBpcyBwb2xsaW5nCisJICogZnJvbSBhIHRocmVhZC4gIFdlIGRvIG5vdCBkcml2ZSB0aGUgcXVldWUgZnJvbSB0aGF0CisJICogY29udGV4dCBzaW5jZSB0aGUgZHJpdmVyIG1heSBob2xkIHRoZQorCSAqIHdyYiBwb3N0IGxvY2sgYWxyZWFkeS4KKwkgKi8KKwlpZiAocmVhcm0pCisJCWJlX2RyaXZlX21jY193cmJfcXVldWUobWNjKTsKKwllbHNlCisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDE7CisKKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKworLyoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICBQIFUgQiBMIEkgQyAgUiBPIFUgVCBJIE4gRSBTCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICAgIFRoaXMgcm91dGluZSBjcmVhdGVzIGFuIE1DQyBvYmplY3QuICBUaGlzIG9iamVjdCBjb250YWlucyBhbiBNQ0Mgc2VuZCBxdWV1ZQorICAgIGFuZCBhIENRIHByaXZhdGUgdG8gdGhlIE1DQy4KKworICAgIHBjb250cm9sbGVyICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKworICAgIEVxT2JqZWN0ICAgICAgICAgICAgLSBFUSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBNQ0MKKworICAgIHBwTWNjT2JqZWN0ICAgICAgICAgLSBQb2ludGVyIHRvIGFuIGludGVybmFsIE1jYyBPYmplY3QgcmV0dXJuZWQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsLCBvdGhlcndpc2UgYSB1c2VmdWwgZXJyb3IgY29kZQorCWlzIHJldHVybmVkLgorCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisKKyovCitpbnQKK2JlX21jY19yaW5nX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICBzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aCwKKwkJICAgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqY29udGV4dF9hcnJheSwKKwkJICAgdTMyIG51bV9jb250ZXh0X2VudHJpZXMsCisJCSAgIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxLCBzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjKQoreworCWludCBzdGF0dXMgPSAwOworCisJc3RydWN0IEZXQ01EX0NPTU1PTl9NQ0NfQ1JFQVRFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgbnVtX2VudHJpZXNfZW5jb2RlZCwgbiwgaTsKKwl2b2lkICp2YSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSAqIDIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiSW52YWxpZCBNQ0MgcmluZyBsZW5ndGg6JWQiLCBsZW5ndGgpOworCQlyZXR1cm4gQkVfTk9UX09LOworCX0KKwkvKgorCSAqIFJlZHVjZSB0aGUgYWN0dWFsIHJpbmcgc2l6ZSB0byBiZSBsZXNzIHRoYW4gdGhlIG51bWJlcgorCSAqIG9mIGNvbnRleHQgZW50cmllcy4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHJ1biBvdXQgb2YKKwkgKiByaW5nIFdSQnMgZmlyc3Qgc28gdGhlIHF1ZXVpbmcgd29ya3MgY29ycmVjdGx5LiAgV2UgbmV2ZXIKKwkgKiBxdWV1ZSBiYXNlZCBvbiBjb250ZXh0IHN0cnVjdHMuCisJICovCisJaWYgKG51bV9jb250ZXh0X2VudHJpZXMgKyAxIDwKKwkJCWxlbmd0aCAvIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSAtIDEpIHsKKworCQl1MzIgbWF4X2xlbmd0aCA9CisJCSAgICAobnVtX2NvbnRleHRfZW50cmllcyArIDIpICogc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApOworCisJCWlmIChpc19wb3dlcl9vZl8yKG1heF9sZW5ndGgpKQorCQkJbGVuZ3RoID0gX19yb3VuZHVwX3Bvd19vZl90d28obWF4X2xlbmd0aCsxKSAvIDI7CisJCWVsc2UKKwkJCWxlbmd0aCA9IF9fcm91bmR1cF9wb3dfb2ZfdHdvKG1heF9sZW5ndGgpIC8gMjsKKworCQlBU1NFUlQobGVuZ3RoIDw9IG1heF9sZW5ndGgpOworCisJCVRSQUNFKERMX1dBUk4sCisJCQkiTUNDIHJpbmcgbGVuZ3RoIHJlZHVjZWQgYmFzZWQgb24gY29udGV4dCBlbnRyaWVzLiIKKwkJCSIgbGVuZ3RoOiVkIHdyYnM6JWQgY29udGV4dF9lbnRyaWVzOiVkIiwgbGVuZ3RoLAorCQkJKGludCkgKGxlbmd0aCAvIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSksCisJCQludW1fY29udGV4dF9lbnRyaWVzKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCW51bV9lbnRyaWVzX2VuY29kZWQgPQorCSAgICBiZV9yaW5nX2xlbmd0aF90b19lbmNvZGluZyhsZW5ndGgsIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSk7CisKKwkvKiBJbml0IE1DQyBvYmplY3QuICovCisJbWVtc2V0KG1jYywgMCwgc2l6ZW9mKCptY2MpKTsKKwltY2MtPnBhcmVudF9mdW5jdGlvbiA9IHBmb2I7CisJbWNjLT5jcV9vYmplY3QgPSBjcTsKKworCUlOSVRfTElTVF9IRUFEKCZtY2MtPmJhY2tsb2cpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGNyZWF0ZSBFUS4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fTUNDX0NSRUFURSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3BhZ2VzID0gRElWX1JPVU5EX1VQKGxlbmd0aCwgUEFHRV9TSVpFKTsKKwkvKgorCSAqIFByb2dyYW0gTUNDIHJpbmcgY29udGV4dAorCSAqLworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19SSU5HX0NPTlRFWFQsIHBkaWQsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19SSU5HX0NPTlRFWFQsIGludmFsaWQsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIGZhbHNlKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfUklOR19DT05URVhULCByaW5nX3NpemUsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG51bV9lbnRyaWVzX2VuY29kZWQpOworCisJbiA9IGNxLT5jcV9pZDsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfUklOR19DT05URVhULAorCQkJCWNxX2lkLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCWJlX3JkX3RvX3BhX2xpc3QocmQsIGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcywKKwkJCQlBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcykpOworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHRvIGNyZWF0ZSBDUSBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qCisJICogQ3JlYXRlIGEgbGlua2VkIGxpc3Qgb2YgY29udGV4dCBzdHJ1Y3R1cmVzCisJICovCisJbWNjLT53cmJfY29udGV4dC5iYXNlID0gY29udGV4dF9hcnJheTsKKwltY2MtPndyYl9jb250ZXh0Lm51bSA9IG51bV9jb250ZXh0X2VudHJpZXM7CisJSU5JVF9MSVNUX0hFQUQoJm1jYy0+d3JiX2NvbnRleHQubGlzdF9oZWFkKTsKKwltZW1zZXQoY29udGV4dF9hcnJheSwgMCwKKwkJICAgIHNpemVvZihzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0KSAqIG51bV9jb250ZXh0X2VudHJpZXMpOworCWZvciAoaSA9IDA7IGkgPCBtY2MtPndyYl9jb250ZXh0Lm51bTsgaSsrKSB7CisJCWxpc3RfYWRkX3RhaWwoJmNvbnRleHRfYXJyYXlbaV0ubmV4dCwKKwkJCQkJJm1jYy0+d3JiX2NvbnRleHQubGlzdF9oZWFkKTsKKwl9CisKKwkvKgorCSAqCisJICogQ3JlYXRlIGFuIG1jY19yaW5nIGZvciB0cmFja2luZyBXUkIgaHcgcmluZworCSAqLworCXZhID0gcmQtPnZhOworCUFTU0VSVCh2YSk7CisJbXBfcmluZ19jcmVhdGUoJm1jYy0+c3EucmluZywgbGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApLAorCQkJCXNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSwgdmEpOworCW1jYy0+c3EucmluZy5pZCA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuaWQ7CisJLyoKKwkgKiBJbml0IGEgbWNjX3JpbmcgZm9yIHRyYWNraW5nIHRoZSBNQ0MgQ1EuCisJICovCisJQVNTRVJUKGNxLT52YSk7CisJbXBfcmluZ19jcmVhdGUoJm1jYy0+Y3EucmluZywgY3EtPm51bV9lbnRyaWVzLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCksIGNxLT52YSk7CisJbWNjLT5jcS5yaW5nLmlkID0gY3EtPmNxX2lkOworCisJLyogRm9yY2UgemVyb2luZyBvZiBDUS4gKi8KKwltZW1zZXQoY3EtPnZhLCAwLCBjcS0+bnVtX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSk7CisKKwkvKiBJbml0aWFsaXplIGRlYnVnIGluZGV4LiAqLworCW1jYy0+Y29uc3VtZWRfaW5kZXggPSAwOworCisJYXRvbWljX2luYygmY3EtPnJlZl9jb3VudCk7CisJcGZvYi0+bWNjID0gbWNjOworCisJVFJBQ0UoRExfSU5GTywgIk1DQyByaW5nIGNyZWF0ZWQuIGlkOiVkIGJ5dGVzOiVkIGNxX2lkOiVkIGNxX2VudHJpZXM6JWQiCisJICAgICAgIiBudW1fY29udGV4dDolZCIsIG1jYy0+c3EucmluZy5pZCwgbGVuZ3RoLAorCSAgICAgIGNxLT5jcV9pZCwgY3EtPm51bV9lbnRyaWVzLCBudW1fY29udGV4dF9lbnRyaWVzKTsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGRlc3Ryb3lzIGFuIE1DQyBzZW5kIHF1ZXVlCisKKyAgICBNY2NPYmplY3QgICAgICAgICAtIEludGVybmFsIE1jYyBPYmplY3QgdG8gYmUgZGVzdHJveWVkLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorCisgICAgVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgbXVzdCBlbnN1cmUgdGhhdCBubyBvdGhlciBXUkIgbWF5IGJlIHBvc3RlZAorICAgIHVudGlsIHRoaXMgcm91dGluZSByZXR1cm5zLgorCisqLworaW50IGJlX21jY19yaW5nX2Rlc3Ryb3koc3RydWN0IGJlX21jY19vYmplY3QgKm1jYykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gbWNjLT5wYXJlbnRfZnVuY3Rpb247CisKKworCUFTU0VSVChtY2MtPnByb2Nlc3NpbmcgPT0gMCk7CisKKwkvKgorCSAqIFJlbW92ZSB0aGUgcmluZyBmcm9tIHRoZSBmdW5jdGlvbiBvYmplY3QuCisJICogVGhpcyB0cmFuc2l0aW9ucyBiYWNrIHRvIG1haWxib3ggbW9kZS4KKwkgKi8KKwlwZm9iLT5tY2MgPSBOVUxMOworCisJLyogU2VuZCBmd2NtZCB0byBkZXN0cm95IHRoZSBxdWV1ZS4gIChVc2luZyB0aGUgbWFpbGJveC4pICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KG1jYy0+cGFyZW50X2Z1bmN0aW9uLCBtY2MtPnNxLnJpbmcuaWQsCisJCQkgICAgIEZXQ01EX1JJTkdfVFlQRV9NQ0MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCUFTU0VSVChzdGF0dXMgPT0gMCk7CisKKwkvKiBSZWxlYXNlIHRoZSBTUSByZWZlcmVuY2UgdG8gdGhlIENRICovCisJYXRvbWljX2RlYygmbWNjLT5jcV9vYmplY3QtPnJlZl9jb3VudCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZAorbWNjX3dyYl9zeW5jX2NiKHZvaWQgKmNvbnRleHQsIGludCBzdGF1cywgc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiKQoreworCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0ID0KKwkJCQkoc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqKSBjb250ZXh0OworCUFTU0VSVCh3cmJfY29udGV4dCk7CisJKndyYl9jb250ZXh0LT51c2Vyc19maW5hbF9zdGF0dXMgPSBzdGF1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgcG9zdHMgYSBjb21tYW5kIHRvIHRoZSBNQ0Mgc2VuZCBxdWV1ZQorCisgICAgbWNjICAgICAgIC0gSW50ZXJuYWwgTWNjIE9iamVjdCB0byBiZSBkZXN0cm95ZWQuCisKKyAgICB3cmIgICAgICAgICAgICAgLSB3cmIgdG8gcG9zdC4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwgaWYgQ29tcGxldGlvbkNhbGxiYWNrIGlzIG5vdCBOVUxMCisgICAgSVJRTCA8PURJU1BBVENIX0xFVkVMIGlmIENvbXBsZXRpb25DYWxsYmFjayBpcyAgTlVMTAorCisgICAgSWYgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aXRoIENvbXBsZXRpb25DYWxsYmFjayAhPSBOVUxMIHRoZQorICAgIGNhbGwgaXMgY29uc2lkZXJlZCB0byBiZSBhc3luY2hyb25vdXMgYW5kIHdpbGwgcmV0dXJuIGFzIHNvb24KKyAgICBhcyB0aGUgV1JCIGlzIHBvc3RlZCB0byB0aGUgTUNDIHdpdGggQkVfUEVORElORy4KKworICAgIElmIENvbXBsZXRpb25DYWxsYmFjayBpcyBOVUxMLCB0aGVuIHRoaXMgcm91dGluZSB3aWxsIG5vdCByZXR1cm4gdW50aWwKKyAgICBhIGNvbXBsZXRpb24gZm9yIHRoaXMgTUNDIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLgorICAgIElmIGNhbGxlZCBhdCBESVNQQVRDSF9MRVZFTCB0aGUgQ29tcGxldGlvbkNhbGxiYWNrIG11c3QgYmUgTlVMTC4KKworICAgIFRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIE1QVSBoYXMgYmVlbiBib29zdHJhcGVkIHBhc3QKKyAgICBtYWlsYm94IG1vZGUuCisKKworKi8KK2ludAorX2JlX21wdV9wb3N0X3dyYl9yaW5nKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwKKwkJCQlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCkKK3sKKworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKnJpbmdfd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gQkVfUEVORElORzsKKwlpbnQgZmluYWxfc3RhdHVzID0gQkVfUEVORElORzsKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiA9IE5VTEw7CisJc3RydWN0IE1DQ19EQl9BTUFQIG1jY19kYjsKKwl1MzIgZW1iZWRkZWQ7CisKKwlBU1NFUlQobXBfcmluZ19udW1fZW1wdHkoJm1jYy0+c3EucmluZykgPiAwKTsKKwkvKgorCSAqIElucHV0IHdyYiBpcyBtb3N0IGxpa2VseSB0aGUgbmV4dCB3cmIgaW4gdGhlIHJpbmcsIHNpbmNlIHRoZSBjbGllbnQKKwkgKiBjYW4gcGVlayBhdCB0aGUgYWRkcmVzcy4KKwkgKi8KKwlyaW5nX3dyYiA9IG1wX3JpbmdfcHJvZHVjZXJfcHRyKCZtY2MtPnNxLnJpbmcpOworCWlmICh3cmIgIT0gcmluZ193cmIpIHsKKwkJLyogSWYgbm90IGVxdWFsLCBjb3B5IGl0IGludG8gdGhlIHJpbmcuICovCisJCW1lbWNweShyaW5nX3dyYiwgd3JiLCBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkpOworCX0KKyNpZmRlZiBCRV9ERUJVRworCXdyYl9jb250ZXh0LT5yaW5nX3dyYiA9IHJpbmdfd3JiOworI2VuZGlmCisJZW1iZWRkZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfV1JCLCBlbWJlZGRlZCwgcmluZ193cmIpOworCWlmIChlbWJlZGRlZCkgeworCQkvKiBlbWJlZGRlZCBjb21tYW5kcyB3aWxsIGhhdmUgdGhlIHJlc3BvbnNlIHdpdGhpbiB0aGUgV1JCLiAqLworCQl3cmJfY29udGV4dC0+d3JiID0gcmluZ193cmI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogbm9uLWVtYmVkZGVkIGNvbW1hbmRzIHdpbGwgbm90IGhhdmUgdGhlIHJlc3BvbnNlCisJCSAqIHdpdGhpbiB0aGUgV1JCLCBhbmQgdGhleSBtYXkgY29tcGxldGUgb3V0LW9mLW9yZGVyLgorCQkgKiBUaGUgV1JCIHdpbGwgbm90IGJlIHZhbGlkIHRvIGluc3BlY3QKKwkJICogZHVyaW5nIHRoZSBjb21wbGV0aW9uLgorCQkgKi8KKwkJd3JiX2NvbnRleHQtPndyYiA9IE5VTEw7CisJfQorCWNiID0gd3JiX2NvbnRleHQtPmNiOworCisJaWYgKGNiID09IE5VTEwpIHsKKwkJLyogQXNzaWduIG91ciBpbnRlcm5hbCBjYWxsYmFjayBpZiB0aGlzIGlzIGEKKwkJICogc3luY2hyb25vdXMgY2FsbC4gKi8KKwkJd3JiX2NvbnRleHQtPmNiID0gbWNjX3dyYl9zeW5jX2NiOworCQl3cmJfY29udGV4dC0+Y2JfY29udGV4dCA9IHdyYl9jb250ZXh0OworCQl3cmJfY29udGV4dC0+dXNlcnNfZmluYWxfc3RhdHVzID0gJmZpbmFsX3N0YXR1czsKKwl9CisJLyogSW5jcmVtZW50IHByb2R1Y2VyIGluZGV4ICovCisKKwltY2NfZGIuZHdbMF0gPSAwOwkJLyogaW5pdGlhbGl6ZSAqLworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19EQiwgcmlkLCAmbWNjX2RiLCBtY2MtPnNxLnJpbmcuaWQpOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19EQiwgbnVtUG9zdGVkLCAmbWNjX2RiLCAxKTsKKworCW1wX3JpbmdfcHJvZHVjZSgmbWNjLT5zcS5yaW5nKTsKKwlQRF9XUklURShtY2MtPnBhcmVudF9mdW5jdGlvbiwgbXB1X21jY19kYiwgbWNjX2RiLmR3WzBdKTsKKwlUUkFDRShETF9JTkZPLCAicGlkeDogJXggYW5kIGNpZHg6ICV4LiIsIG1jYy0+c3EucmluZy5waWR4LAorCSAgICAgIG1jYy0+c3EucmluZy5jaWR4KTsKKworCWlmIChjYiA9PSBOVUxMKSB7CisJCWludCBwb2xscyA9IDA7CS8qIEF0ID49IDEgdXMgcGVyIHBvbGwgICAqLworCQkvKiBXYWl0IHVudGlsIHRoaXMgY29tbWFuZCBjb21wbGV0ZXMsIHBvbGxpbmcgdGhlIENRLiAqLworCQlkbyB7CisJCQlUUkFDRShETF9JTkZPLCAiRldDTUQgc3VibWl0dGVkIGluIHRoZSBwb2xsIG1vZGUuIik7CisJCQkvKiBEbyBub3QgcmVhcm0gQ1EgaW4gdGhpcyBjb250ZXh0LiAqLworCQkJYmVfbWNjX3Byb2Nlc3NfY3EobWNjLCBmYWxzZSk7CisKKwkJCWlmIChmaW5hbF9zdGF0dXMgPT0gQkVfUEVORElORykgeworCQkJCWlmICgoKytwb2xscyAmIDB4N0ZGRkYpID09IDApIHsKKwkJCQkJVFJBQ0UoRExfV0FSTiwKKwkJCQkJICAgICAgIldhcm5pbmcgOiBwb2xsaW5nIE1DQyBDUSBmb3IgJWQiCisJCQkJCSAgICAgICJtcy4iLCBwb2xscyAvIDEwMDApOworCQkJCX0KKworCQkJCXVkZWxheSgxKTsKKwkJCX0KKworCQkJLyogZmluYWxfc3RhdHVzIGNoYW5nZWQgd2hlbiB0aGUgY29tbWFuZCBjb21wbGV0ZXMgKi8KKwkJfSB3aGlsZSAoZmluYWxfc3RhdHVzID09IEJFX1BFTkRJTkcpOworCisJCXN0YXR1cyA9IGZpbmFsX3N0YXR1czsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdHJ1Y3QgTUNDX1dSQl9BTUFQICoKK19iZV9tcHVfcGVla19yaW5nX3dyYihzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjLCBib29sIGRyaXZpbmdfcXVldWUpCit7CisJLyogSWYgd2UgaGF2ZSBxdWV1ZWQgaXRlbXMsIGRvIG5vdCBhbGxvdyBhIHBvc3QgdG8gYnlwYXNzIHRoZSBxdWV1ZS4gKi8KKwlpZiAoIWRyaXZpbmdfcXVldWUgJiYgIWxpc3RfZW1wdHkoJm1jYy0+YmFja2xvZykpCisJCXJldHVybiBOVUxMOworCisJaWYgKG1wX3JpbmdfbnVtX2VtcHR5KCZtY2MtPnNxLnJpbmcpIDw9IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSBtcF9yaW5nX3Byb2R1Y2VyX3B0cigmbWNjLT5zcS5yaW5nKTsKK30KKworaW50CitiZV9tcHVfaW5pdF9tYWlsYm94KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHN0cnVjdCByaW5nX2Rlc2MgKm1haWxib3gpCit7CisJQVNTRVJUKG1haWxib3gpOworCXBmb2ItPm1haWxib3gudmEgPSBtYWlsYm94LT52YTsKKwlwZm9iLT5tYWlsYm94LnBhID0gIGNwdV90b19sZTY0KG1haWxib3gtPnBhKTsKKwlwZm9iLT5tYWlsYm94Lmxlbmd0aCA9IG1haWxib3gtPmxlbmd0aDsKKworCUFTU0VSVCgoKHUzMikoc2l6ZV90KXBmb2ItPm1haWxib3gudmEgJiAweGYpID09IDApOworCUFTU0VSVCgoKHUzMikoc2l6ZV90KXBmb2ItPm1haWxib3gucGEgJiAweGYpID09IDApOworCS8qCisJICogSXNzdWUgdGhlIFdSQiB0byBzZXQgTVBVIGVuZGlhbm5lc3MKKwkgKi8KKwl7CisJCXU2NCAqZW5kaWFuX2NoZWNrID0gKHU2NCAqKSAocGZvYi0+bWFpbGJveC52YSArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19NQUlMQk9YX0FNQVAsIHdyYikvOCk7CisJCSplbmRpYW5fY2hlY2sgPSAweEZGMTIzNEZGRkY1Njc4RkZVTEw7CisJfQorCisJYmVfbWNjX21haWxib3hfbm90aWZ5X2FuZF93YWl0KHBmb2IpOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisKKworLyoKKyAgICBUaGlzIHJvdXRpbmUgcG9zdHMgYSBjb21tYW5kIHRvIHRoZSBNQ0MgbWFpbGJveC4KKworICAgIEZ1bmNPYmogICAgICAgICAtIEZ1bmN0aW9uIE9iamVjdCB0byBwb3N0IHRoZSBXUkIgb24gYmVoYWxmIG9mLgorICAgIHdyYiAgICAgICAgICAgICAtIHdyYiB0byBwb3N0LgorICAgIENvbXBsZXRpb25DYWxsYmFjayAgLSBBZGRyZXNzIG9mIGEgY2FsbGJhY2sgcm91dGluZSB0byBpbnZva2Ugb25jZSB0aGUgV1JCCisJCQkJaXMgY29tcGxldGVkLgorICAgIENvbXBsZXRpb25DYWxsYmFja0NvbnRleHQgLSBPcGFxdWUgY29udGV4dCB0byBiZSBwYXNzZWQgZHVyaW5nIHRoZSBjYWxsIHRvCisJCQkJdGhlIENvbXBsZXRpb25DYWxsYmFjay4KKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTCA8PURJU1BBVENIX0xFVkVMIGlmIENvbXBsZXRpb25DYWxsYmFjayBpcyAgTlVMTAorCisgICAgVGhpcyByb3V0aW5lIHdpbGwgYmxvY2sgdW50aWwgYSBjb21wbGV0aW9uIGZvciB0aGlzIE1DQyBjb21tYW5kIGhhcyBiZWVuCisgICAgcHJvY2Vzc2VkLiBJZiBjYWxsZWQgYXQgRElTUEFUQ0hfTEVWRUwgdGhlIENvbXBsZXRpb25DYWxsYmFjayBtdXN0IGJlIE5VTEwuCisKKyAgICBUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBNUFUgaGFzIG5vdCBiZWVuIGJvb3N0cmFwZWQgcGFzdAorICAgIG1haWxib3ggbW9kZS4KKyovCitpbnQKK19iZV9tcHVfcG9zdF93cmJfbWFpbGJveChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCSBzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0KQoreworCXN0cnVjdCBNQ0NfTUFJTEJPWF9BTUFQICptYWlsYm94ID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICptYl93cmI7CisJc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICptYl9jcTsKKwl1MzIgb2Zmc2V0LCBzdGF0dXM7CisKKwlBU1NFUlQocGZvYi0+bWNjID09IE5VTEwpOworCW1haWxib3ggPSBwZm9iLT5tYWlsYm94LnZhOworCUFTU0VSVChtYWlsYm94KTsKKworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfTUFJTEJPWF9BTUFQLCB3cmIpLzg7CisJbWJfd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgKHU4ICopbWFpbGJveCArIG9mZnNldDsKKwlpZiAobWJfd3JiICE9IHdyYikgeworCQltZW1zZXQobWFpbGJveCwgMCwgc2l6ZW9mKCptYWlsYm94KSk7CisJCW1lbWNweShtYl93cmIsIHdyYiwgc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKTsKKwl9CisJLyogVGhlIGNhbGxiYWNrIGNhbiBpbnNwZWN0IHRoZSBmaW5hbCBXUkIgdG8gZ2V0IG91dHB1dCBwYXJhbWV0ZXJzLiAqLworCXdyYl9jb250ZXh0LT53cmIgPSBtYl93cmI7CisKKwliZV9tY2NfbWFpbGJveF9ub3RpZnlfYW5kX3dhaXQocGZvYik7CisKKwkvKiBBIGNvbW1hbmQgY29tcGxldGVkLiAgVXNlIHRhZyB0byBkZXRlcm1pbmUgd2hpY2ggY29tbWFuZC4gKi8KKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX01BSUxCT1hfQU1BUCwgY3EpLzg7CisJbWJfY3EgPSAoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICopICgodTggKiltYWlsYm94ICsgb2Zmc2V0KTsKKwliZV9tY2NfcHJvY2Vzc19jcWUocGZvYiwgbWJfY3EpOworCisJc3RhdHVzID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLCBjb21wbGV0aW9uX3N0YXR1cywgbWJfY3EpOworCWlmIChzdGF0dXMpCisJCXN0YXR1cyA9IEJFX05PVF9PSzsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICoKK19iZV9tY2NfYWxsb2NhdGVfd3JiX2NvbnRleHQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5tY2NfY29udGV4dF9sb2NrLCBpcnEpOworCisJaWYgKCFwZm9iLT5tYWlsYm94LmRlZmF1bHRfY29udGV4dF9hbGxvY2F0ZWQpIHsKKwkJLyogVXNlIHRoZSBzaW5nbGUgZGVmYXVsdCBjb250ZXh0IHRoYXQgd2UKKwkJICogYWx3YXlzIGhhdmUgYWxsb2NhdGVkLiAqLworCQlwZm9iLT5tYWlsYm94LmRlZmF1bHRfY29udGV4dF9hbGxvY2F0ZWQgPSB0cnVlOworCQljb250ZXh0ID0gJnBmb2ItPm1haWxib3guZGVmYXVsdF9jb250ZXh0OworCX0gZWxzZSBpZiAocGZvYi0+bWNjKSB7CisJCS8qIEdldCBhIGNvbnRleHQgZnJvbSB0aGUgZnJlZSBsaXN0LiBJZiBhbnkgYXJlIGF2YWlsYWJsZS4gKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZwZm9iLT5tY2MtPndyYl9jb250ZXh0Lmxpc3RfaGVhZCkpIHsKKwkJCWNvbnRleHQgPSBsaXN0X2ZpcnN0X2VudHJ5KAorCQkJCSZwZm9iLT5tY2MtPndyYl9jb250ZXh0Lmxpc3RfaGVhZCwKKwkJCQkJIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQsIG5leHQpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+bWNjX2NvbnRleHRfbG9jaywgaXJxKTsKKworCXJldHVybiBjb250ZXh0OworfQorCit2b2lkCitfYmVfbWNjX2ZyZWVfd3JiX2NvbnRleHQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCSBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpjb250ZXh0KQoreworCXVuc2lnbmVkIGxvbmcgaXJxOworCisJQVNTRVJUKGNvbnRleHQpOworCS8qCisJICogWmVybyBkdXJpbmcgZnJlZSB0byB0cnkgYW5kIGNhdGNoIGFueSBidWdzIHdoZXJlIHRoZSBjb250ZXh0CisJICogaXMgYWNjZXNzZWQgYWZ0ZXIgYSBmcmVlLgorCSAqLworCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2YoY29udGV4dCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPm1jY19jb250ZXh0X2xvY2ssIGlycSk7CisKKwlpZiAoY29udGV4dCA9PSAmcGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHQpIHsKKwkJLyogRnJlZSB0aGUgZGVmYXVsdCBjb250ZXh0LiAqLworCQlBU1NFUlQocGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHRfYWxsb2NhdGVkKTsKKwkJcGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHRfYWxsb2NhdGVkID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJLyogQWRkIHRvIGZyZWUgbGlzdC4gKi8KKwkJQVNTRVJUKHBmb2ItPm1jYyk7CisJCWxpc3RfYWRkX3RhaWwoJmNvbnRleHQtPm5leHQsCisJCQkJJnBmb2ItPm1jYy0+d3JiX2NvbnRleHQubGlzdF9oZWFkKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5tY2NfY29udGV4dF9sb2NrLCBpcnEpOworfQorCitpbnQKK2JlX21jY19hZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2soc3RydWN0IGJlX21jY19vYmplY3QgKm1jY19vYmplY3QsCisJCW1jY19hc3luY19ldmVudF9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCkKK3sKKwkvKiBMb2NrIGFnYWluc3QgYW55b25lIHRyeWluZyB0byBjaGFuZ2UgdGhlIGNhbGxiYWNrL2NvbnRleHQgcG9pbnRlcnMKKwkgKiB3aGlsZSBiZWluZyB1c2VkLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2Nfb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24tPmNxX2xvY2ssCisJCW1jY19vYmplY3QtPnBhcmVudF9mdW5jdGlvbi0+Y3FfaXJxKTsKKworCS8qIEFzc2lnbiB0aGUgYXN5bmMgY2FsbGJhY2suICovCisJbWNjX29iamVjdC0+YXN5bmNfY29udGV4dCA9IGNiX2NvbnRleHQ7CisJbWNjX29iamVjdC0+YXN5bmNfY2IgPSBjYjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jY19vYmplY3QtPnBhcmVudF9mdW5jdGlvbi0+Y3FfbG9jaywKKwkJCQkJbWNjX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uLT5jcV9pcnEpOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTVBVX0VQX0NPTlRST0wgMAorI2RlZmluZSBNUFVfRVBfU0VNQVBIT1JFIDB4YWMKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX3dhaXRfZm9yX1BPU1RfY29tcGxldGUKKyAqICAgV2FpdHMgdW50aWwgdGhlIEJsYWRlRW5naW5lIFBPU1QgY29tcGxldGVzIChlaXRoZXIgaW4gZXJyb3Igb3Igc3VjY2VzcykuCisgKiBwZm9iIC0KKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGJlX3dhaXRfZm9yX1BPU1RfY29tcGxldGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNUX0FNQVAgc3RhdHVzOworCWludCBzOworCXUzMiBwb3N0X2Vycm9yLCBwb3N0X3N0YWdlOworCisJY29uc3QgdTMyIHVzX3Blcl9sb29wID0gMTAwMDsJLyogMTAwMHVzICovCisJY29uc3QgdTMyIHByaW50X2ZyZXF1ZW5jeV9sb29wcyA9IDEwMDAwMDAgLyB1c19wZXJfbG9vcDsKKwljb25zdCB1MzIgbWF4X2xvb3BzID0gNjAgKiBwcmludF9mcmVxdWVuY3lfbG9vcHM7CisJdTMyIGxvb3BzID0gMDsKKworCS8qCisJICogV2FpdCBmb3IgYXJtIGZ3IGluZGljYXRpbmcgaXQgaXMgZG9uZSBvciBhIGZhdGFsIGVycm9yIGhhcHBlbmVkLgorCSAqIE5vdGU6IFBPU1QgY2FuIHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uCisJICogc2V0dGluZ3MgKGNvbnNpZGVyIEFSTSBhdHRlbXB0cyB0byBhY3F1aXJlIGFuIElQIGFkZHJlc3MKKwkgKiBvdmVyIERIQ1AhISEpLgorCSAqCisJICovCisJZG8geworCQlzdGF0dXMuZHdbMF0gPSBpb3JlYWQzMihwZm9iLT5jc3JfdmEgKyBNUFVfRVBfU0VNQVBIT1JFKTsKKwkJcG9zdF9lcnJvciA9IEFNQVBfR0VUX0JJVFNfUFRSKE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVCwKKwkJCQkJCWVycm9yLCAmc3RhdHVzKTsKKwkJcG9zdF9zdGFnZSA9IEFNQVBfR0VUX0JJVFNfUFRSKE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVCwKKwkJCQkJCXN0YWdlLCAmc3RhdHVzKTsKKwkJaWYgKDAgPT0gKGxvb3BzICUgcHJpbnRfZnJlcXVlbmN5X2xvb3BzKSkgeworCQkJLyogUHJpbnQgY3VycmVudCBzdGF0dXMgKi8KKwkJCVRSQUNFKERMX0lORk8sICJQT1NUIHN0YXR1cyA9IDB4JXggKHN0YWdlID0gMHgleCkiLAorCQkJCXN0YXR1cy5kd1swXSwgcG9zdF9zdGFnZSk7CisJCX0KKwkJdWRlbGF5KHVzX3Blcl9sb29wKTsKKwl9IHdoaWxlICgocG9zdF9lcnJvciAhPSAxKSAmJgorCQkgKHBvc3Rfc3RhZ2UgIT0gUE9TVF9TVEFHRV9BUk1GV19SRUFEWSkgJiYKKwkJICgrK2xvb3BzIDwgbWF4X2xvb3BzKSk7CisKKwlpZiAocG9zdF9lcnJvciA9PSAxKSB7CisJCVRSQUNFKERMX0VSUiwgIlBPU1QgZXJyb3IhIFN0YXR1cyA9IDB4JXggKHN0YWdlID0gMHgleCkiLAorCQkgICAgICBzdGF0dXMuZHdbMF0sIHBvc3Rfc3RhZ2UpOworCQlzID0gQkVfTk9UX09LOworCX0gZWxzZSBpZiAocG9zdF9zdGFnZSAhPSBQT1NUX1NUQUdFX0FSTUZXX1JFQURZKSB7CisJCVRSQUNFKERMX0VSUiwgIlBPU1QgdGltZS1vdXQhIFN0YXR1cyA9IDB4JXggKHN0YWdlID0gMHgleCkiLAorCQkgICAgICBzdGF0dXMuZHdbMF0sIHBvc3Rfc3RhZ2UpOworCQlzID0gQkVfTk9UX09LOworCX0gZWxzZSB7CisJCXMgPSBCRV9TVUNDRVNTOworCX0KKwlyZXR1cm4gczsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2tpY2tvZmZfYW5kX3dhaXRfZm9yX1BPU1QKKyAqICAgSW50ZXJhY3RzIHdpdGggdGhlIEJsYWRlRW5naW5lIG1hbmFnZW1lbnQgcHJvY2Vzc29yIHRvIGluaXRpYXRlIFBPU1QsIGFuZAorICogICBzdWJzZXF1ZW50bHkgd2FpdHMgdW50aWwgUE9TVCBjb21wbGV0ZXMgKGVpdGhlciBpbiBlcnJvciBvciBzdWNjZXNzKS4KKyAqICAgVGhlIGNhbGxlciBtdXN0IGFjcXVpcmUgdGhlIHJlc2V0IHNlbWFwaG9yZSBiZWZvcmUgaW5pdGlhdGluZyBQT1NUCisgKiAgIHRvIHByZXZlbnQgbXVsdGlwbGUgZHJpdmVycyBpbnRlcmFjdGluZyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3Nvci4KKyAqICAgT25jZSBQT1NUIGlzIGNvbXBsZXRlIHRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSByZXNldCBzZW1hcGhvcmUuCisgKiAgIENhbGxlcnMgd2hvIG9ubHkgd2FudCB0byB3YWl0IGZvciBQT1NUIGNvbXBsZXRlIG1heSBjYWxsCisgKiAgIGJlX3dhaXRfZm9yX1BPU1RfY29tcGxldGUuCisgKiBwZm9iIC0KKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50CitiZV9raWNrb2ZmX2FuZF93YWl0X2Zvcl9QT1NUKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHN0YXR1czsKKwlpbnQgczsKKworCWNvbnN0IHUzMiB1c19wZXJfbG9vcCA9IDEwMDA7CS8qIDEwMDB1cyAqLworCWNvbnN0IHUzMiBwcmludF9mcmVxdWVuY3lfbG9vcHMgPSAxMDAwMDAwIC8gdXNfcGVyX2xvb3A7CisJY29uc3QgdTMyIG1heF9sb29wcyA9IDUgKiBwcmludF9mcmVxdWVuY3lfbG9vcHM7CisJdTMyIGxvb3BzID0gMDsKKwl1MzIgcG9zdF9lcnJvciwgcG9zdF9zdGFnZTsKKworCS8qIFdhaXQgZm9yIGFybSBmdyBhd2FpdGluZyBob3N0IHJlYWR5IG9yIGEgZmF0YWwgZXJyb3IgaGFwcGVuZWQuICovCisJVFJBQ0UoRExfSU5GTywgIldhaXQgZm9yIEJsYWRlRW5naW5lIHJlYWR5IHRvIFBPU1QiKTsKKwlkbyB7CisJCXN0YXR1cy5kd1swXSA9IGlvcmVhZDMyKHBmb2ItPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkUpOworCQlwb3N0X2Vycm9yID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULAorCQkJCQkJZXJyb3IsICZzdGF0dXMpOworCQlwb3N0X3N0YWdlID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULAorCQkJCQkJc3RhZ2UsICZzdGF0dXMpOworCQlpZiAoMCA9PSAobG9vcHMgJSBwcmludF9mcmVxdWVuY3lfbG9vcHMpKSB7CisJCQkvKiBQcmludCBjdXJyZW50IHN0YXR1cyAqLworCQkJVFJBQ0UoRExfSU5GTywgIlBPU1Qgc3RhdHVzID0gMHgleCAoc3RhZ2UgPSAweCV4KSIsCisJCQkgICAgICBzdGF0dXMuZHdbMF0sIHBvc3Rfc3RhZ2UpOworCQl9CisJCXVkZWxheSh1c19wZXJfbG9vcCk7CisJfSB3aGlsZSAoKHBvc3RfZXJyb3IgIT0gMSkgJiYKKwkJIChwb3N0X3N0YWdlIDwgUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSkgJiYKKwkJICgrK2xvb3BzIDwgbWF4X2xvb3BzKSk7CisKKwlpZiAocG9zdF9lcnJvciA9PSAxKSB7CisJCVRSQUNFKERMX0VSUiwgIlByZS1QT1NUIGVycm9yISBTdGF0dXMgPSAweCV4IChzdGFnZSA9IDB4JXgpIiwKKwkJICAgICAgc3RhdHVzLmR3WzBdLCBwb3N0X3N0YWdlKTsKKwkJcyA9IEJFX05PVF9PSzsKKwl9IGVsc2UgaWYgKHBvc3Rfc3RhZ2UgPT0gUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSkgeworCQlpb3dyaXRlMzIoUE9TVF9TVEFHRV9IT1NUX1JEWSwgcGZvYi0+Y3NyX3ZhICsgTVBVX0VQX1NFTUFQSE9SRSk7CisKKwkJLyogV2FpdCBmb3IgUE9TVCB0byBjb21wbGV0ZSAqLworCQlzID0gYmVfd2FpdF9mb3JfUE9TVF9jb21wbGV0ZShwZm9iKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBFaXRoZXIgYSB0aW1lb3V0IHdhaXRpbmcgZm9yIGhvc3QgcmVhZHkgc2lnbmFsIG9yIFBPU1QgaGFzCisJCSAqIG1vdmVkIGFoZWFkIHdpdGhvdXQgcmVxdWlyaW5nIGEgaG9zdCByZWFkeSBzaWduYWwuCisJCSAqIE1pZ2h0IGFzIHdlbGwgZ2l2ZSBQT1NUIGEgY2hhbmNlIHRvIGNvbXBsZXRlCisJCSAqIChvciB0aW1lb3V0IGFnYWluKS4KKwkJICovCisJCXMgPSBiZV93YWl0X2Zvcl9QT1NUX2NvbXBsZXRlKHBmb2IpOworCX0KKwlyZXR1cm4gczsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX3BjaV9zb2Z0X3Jlc2V0CisgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGlzc3VlIGEgQmxhZGVFbmdpbmUgc29mdCByZXNldC4KKyAqICAgQ2FsbGVycyBzaG91bGQgYWNxdWlyZSB0aGUgc29mdCByZXNldCBzZW1hcGhvcmUgYmVmb3JlIGNhbGxpbmcgdGhpcworICogICBmdW5jdGlvbi4gQWRkaXRpb25hbHksIGNhbGxlcnMgc2hvdWxkIGVuc3VyZSB0aGV5IGNhbm5vdCBiZSBwcmUtZW1wdGVkCisgKiAgIHdoaWxlIHRoZSByb3V0aW5lIGV4ZWN1dGVzLiBVcG9uIGNvbXBsZXRpb24gb2YgdGhpcyByb3V0aW5lLCBjYWxsZXJzCisgKiAgIHNob3VsZCByZWxlYXNlIHRoZSByZXNldCBzZW1hcGhvcmUuIFRoaXMgcm91dGluZSBpbXBsaWNpdGx5IHdhaXRzCisgKiAgIGZvciBCbGFkZUVuZ2luZSBQT1NUIHRvIGNvbXBsZXRlLgorICogcGZvYiAtCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IGJlX3BjaV9zb2Z0X3Jlc2V0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IFBDSUNGR19TT0ZUX1JFU0VUX0NTUl9BTUFQIHNvZnRfcmVzZXQ7CisJc3RydWN0IFBDSUNGR19PTkxJTkUwX0NTUl9BTUFQIHBjaU9ubGluZTA7CisJc3RydWN0IFBDSUNGR19PTkxJTkUxX0NTUl9BTUFQIHBjaU9ubGluZTE7CisJc3RydWN0IEVQX0NPTlRST0xfQ1NSX0FNQVAgZXBDb250cm9sQ3NyOworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXUzMiBpLCBzb2Z0X3Jlc2V0X2JpdDsKKworCVRSQUNFKERMX05PVEUsICJQQ0kgcmVzZXQuLi4iKTsKKworCS8qIElzc3VlIHNvZnQgcmVzZXQgIzEgdG8gZ2V0IEJsYWRlRW5naW5lIGludG8gYSBrbm93biBzdGF0ZS4gKi8KKwlzb2Z0X3Jlc2V0LmR3WzBdID0gUENJQ0ZHMF9SRUFEKHBmb2IsIHNvZnRfcmVzZXQpOworCUFNQVBfU0VUX0JJVFNfUFRSKFBDSUNGR19TT0ZUX1JFU0VUX0NTUiwgc29mdHJlc2V0LCBzb2Z0X3Jlc2V0LmR3LCAxKTsKKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIGhvc3RfdGltZXJfaW50X2N0cmwsIHNvZnRfcmVzZXQuZHdbMF0pOworCS8qCisJICogd2FpdCB0aWwgc29mdCByZXNldCBpcyBkZWFzc2VydGVkIC0gaGFyZHdhcmUKKwkgKiBkZWFzc2VydHMgYWZ0ZXIgc29tZSB0aW1lLgorCSAqLworCWkgPSAwOworCWRvIHsKKwkJdWRlbGF5KDUwKTsKKwkJc29mdF9yZXNldC5kd1swXSA9IFBDSUNGRzBfUkVBRChwZm9iLCBzb2Z0X3Jlc2V0KTsKKwkJc29mdF9yZXNldF9iaXQgPSBBTUFQX0dFVF9CSVRTX1BUUihQQ0lDRkdfU09GVF9SRVNFVF9DU1IsCisJCQkJCXNvZnRyZXNldCwgc29mdF9yZXNldC5kdyk7CisJfSB3aGlsZSAoc29mdF9yZXNldF9iaXQgICYmIChpKysgPCAxMDI0KSk7CisJaWYgKHNvZnRfcmVzZXRfYml0ICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAiU29mdC1yZXNldCAjMSBkaWQgbm90IGRlYXNzZXJ0IGFzIGV4cGVjdGVkLiIpOworCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJCWdvdG8gRXJyb3JfbGFiZWw7CisJfQorCS8qIE1hc2sgZXZlcnl0aGluZyAgKi8KKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIHVlX3N0YXR1c19sb3dfbWFzaywgMHhGRkZGRkZGRik7CisJUENJQ0ZHMF9XUklURShwZm9iLCB1ZV9zdGF0dXNfaGlfbWFzaywgMHhGRkZGRkZGRik7CisJLyoKKwkgKiBTZXQgZXZlcnl0aGluZyBvZmZsaW5lIGV4Y2VwdCBNUFUgSVJBTSAoaXQgaXMgb2ZmbGluZSB3aXRoCisJICogdGhlIHNvZnQtcmVzZXQsIGJ1dCBzb2Z0LXJlc2V0IGRvZXMgbm90IHJlc2V0IHRoZSBQQ0lDRkcgcmVnaXN0ZXJzISkKKwkgKi8KKwlwY2lPbmxpbmUwLmR3WzBdID0gMDsKKwlwY2lPbmxpbmUxLmR3WzBdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihQQ0lDRkdfT05MSU5FMV9DU1IsIG1wdV9pcmFtX29ubGluZSwKKwkJCQlwY2lPbmxpbmUxLmR3LCAxKTsKKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIG9ubGluZTAsIHBjaU9ubGluZTAuZHdbMF0pOworCVBDSUNGRzBfV1JJVEUocGZvYiwgb25saW5lMSwgcGNpT25saW5lMS5kd1swXSk7CisKKwl1ZGVsYXkoMjAwMDApOworCisJLyogSXNzdWUgc29mdCByZXNldCAjMi4gKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihQQ0lDRkdfU09GVF9SRVNFVF9DU1IsIHNvZnRyZXNldCwgc29mdF9yZXNldC5kdywgMSk7CisJUENJQ0ZHMF9XUklURShwZm9iLCBob3N0X3RpbWVyX2ludF9jdHJsLCBzb2Z0X3Jlc2V0LmR3WzBdKTsKKwkvKgorCSAqIHdhaXQgdGlsIHNvZnQgcmVzZXQgaXMgZGVhc3NlcnRlZCAtIGhhcmR3YXJlCisJICogZGVhc3NlcnRzIGFmdGVyIHNvbWUgdGltZS4KKwkgKi8KKwlpID0gMDsKKwlkbyB7CisJCXVkZWxheSg1MCk7CisJCXNvZnRfcmVzZXQuZHdbMF0gPSBQQ0lDRkcwX1JFQUQocGZvYiwgc29mdF9yZXNldCk7CisJCXNvZnRfcmVzZXRfYml0ID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSLAorCQkJCQlzb2Z0cmVzZXQsIHNvZnRfcmVzZXQuZHcpOworCX0gd2hpbGUgKHNvZnRfcmVzZXRfYml0ICAmJiAoaSsrIDwgMTAyNCkpOworCWlmIChzb2Z0X3Jlc2V0X2JpdCAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgIlNvZnQtcmVzZXQgIzEgZGlkIG5vdCBkZWFzc2VydCBhcyBleHBlY3RlZC4iKTsKKwkJc3RhdHVzID0gQkVfTk9UX09LOworCQlnb3RvIEVycm9yX2xhYmVsOworCX0KKworCisJdWRlbGF5KDIwMDAwKTsKKworCS8qIFRha2UgTVBVIG91dCBvZiByZXNldC4gKi8KKworCWVwQ29udHJvbENzci5kd1swXSA9IGlvcmVhZDMyKHBmb2ItPmNzcl92YSArIE1QVV9FUF9DT05UUk9MKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihFUF9DT05UUk9MX0NTUiwgQ1BVX3Jlc2V0LCAmZXBDb250cm9sQ3NyLCAwKTsKKwlpb3dyaXRlMzIoKHUzMillcENvbnRyb2xDc3IuZHdbMF0sIHBmb2ItPmNzcl92YSArIE1QVV9FUF9DT05UUk9MKTsKKworCS8qIEtpY2tvZmYgQkUgUE9TVCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbiAqLworCXN0YXR1cyA9IGJlX2tpY2tvZmZfYW5kX3dhaXRfZm9yX1BPU1QocGZvYik7CisKK0Vycm9yX2xhYmVsOgorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX3BjaV9yZXNldF9yZXF1aXJlZAorICogICBUaGlzIHByaXZhdGUgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRldGVjdCBpZiBhIGhvc3QgZW50aXR5IGlzCisgKiAgIHJlcXVpcmVkIHRvIGlzc3VlIGEgUENJIHNvZnQgcmVzZXQgYW5kIHN1YnNlcXVlbnRseSBkcml2ZQorICogICBCbGFkZUVuZ2luZSBQT1NULiBTY2VuYXJpb3Mgd2hlcmUgdGhpcyBpcyByZXF1aXJlZDoKKyAqICAgMSkgQklPUy1sZXNzIGNvbmZpZ3VyYXRpb24KKyAqICAgMikgSG90LXN3YXAvcGx1Zy9wb3dlci1vbgorICogcGZvYiAtCisgKiByZXR1cm4gICB0cnVlIGlmIGEgcmVzZXQgaXMgcmVxdWlyZWQsIGZhbHNlIG90aGVyd2lzZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBib29sIGJlX3BjaV9yZXNldF9yZXF1aXJlZChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1RfQU1BUCBzdGF0dXM7CisJYm9vbCBkb19yZXNldCA9IGZhbHNlOworCXUzMiBwb3N0X2Vycm9yLCBwb3N0X3N0YWdlOworCisJLyoKKwkgKiBSZWFkIHRoZSBQT1NUIHN0YXR1cyByZWdpc3RlcgorCSAqLworCXN0YXR1cy5kd1swXSA9IGlvcmVhZDMyKHBmb2ItPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkUpOworCXBvc3RfZXJyb3IgPSBBTUFQX0dFVF9CSVRTX1BUUihNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1QsIGVycm9yLAorCQkJCQkJCQkmc3RhdHVzKTsKKwlwb3N0X3N0YWdlID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULCBzdGFnZSwKKwkJCQkJCQkJJnN0YXR1cyk7CisJaWYgKHBvc3Rfc3RhZ2UgPD0gUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSkgeworCQkvKgorCQkgKiBJZiBCbGFkZUVuZ2luZSBpcyB3YWl0aW5nIGZvciBob3N0IHJlYWR5IGluZGljYXRpb24sCisJCSAqIHdlIHdhbnQgdG8gZG8gYSBQQ0kgcmVzZXQuCisJCSAqLworCQlkb19yZXNldCA9IHRydWU7CisJfQorCisJcmV0dXJuIGRvX3Jlc2V0OworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZHJpdmVfUE9TVAorICogICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkcml2ZSBCbGFkZUVuZ2luZSBQT1NULiBUaGUKKyAqICAgY2FsbGVyIHNob3VsZCBlbnN1cmUgdGhleSBjYW5ub3QgYmUgcHJlLWVtcHRlZCB3aGlsZSB0aGlzIHJvdXRpbmUgZXhlY3V0ZXMuCisgKiBwZm9iIC0KKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgYmVfZHJpdmVfUE9TVChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoZmFsc2UgIT0gYmVfcGNpX3Jlc2V0X3JlcXVpcmVkKHBmb2IpKSB7CisJCS8qIFBDSSByZXNldCBpcyBuZWVkZWQgKGltcGxpY2l0bHkgc3RhcnRzIGFuZCB3YWl0cyBmb3IgUE9TVCkgKi8KKwkJc3RhdHVzID0gYmVfcGNpX3NvZnRfcmVzZXQocGZvYik7CisJfSBlbHNlIHsKKwkJLyogTm8gUENJIHJlc2V0IGlzIG5lZWRlZCwgc3RhcnQgUE9TVCAqLworCQlzdGF0dXMgPSBiZV9raWNrb2ZmX2FuZF93YWl0X2Zvcl9QT1NUKHBmb2IpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmM2Y4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHUuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fbXB1X2FtYXBfaF9fCisjZGVmaW5lIF9fbXB1X2FtYXBfaF9fCisjaW5jbHVkZSAiZXAuaCIKKworLyogUHJvdmlkZSBjb250cm9sIHBhcmFtZXRlcnMgZm9yIHRoZSBNYW5hZ21lbnQgUHJvY2Vzc29yIFVuaXQuICovCitzdHJ1Y3QgQkVfTVBVX0NTUk1BUF9BTUFQIHsKKwlzdHJ1Y3QgQkVfRVBfQ1NSTUFQX0FNQVAgZXA7CisJdTggcnN2ZDBbMTI4XTsJLyogRFdPUkQgNjQgKi8KKwl1OCByc3ZkMVszMl07CS8qIERXT1JEIDY4ICovCisJdTggcnN2ZDJbMTkyXTsJLyogRFdPUkQgNjkgKi8KKwl1OCByc3ZkM1sxOTJdOwkvKiBEV09SRCA3NSAqLworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgODEgKi8KKwl1OCByc3ZkNVszMl07CS8qIERXT1JEIDgyICovCisJdTggcnN2ZDZbMzJdOwkvKiBEV09SRCA4MyAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgODQgKi8KKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDg1ICovCisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCA4NiAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDg3ICovCisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgODggKi8KKwl1OCByc3ZkMTJbMzJdOwkvKiBEV09SRCA4OSAqLworCXU4IHJzdmQxM1szMl07CS8qIERXT1JEIDkwICovCisJdTggcnN2ZDE0WzMyXTsJLyogRFdPUkQgOTEgKi8KKwl1OCByc3ZkMTVbMzJdOwkvKiBEV09SRCA5MiAqLworCXU4IHJzdmQxNlszMl07CS8qIERXT1JEIDkzICovCisJdTggcnN2ZDE3WzMyXTsJLyogRFdPUkQgOTQgKi8KKwl1OCByc3ZkMThbMzJdOwkvKiBEV09SRCA5NSAqLworCXU4IHJzdmQxOVszMl07CS8qIERXT1JEIDk2ICovCisJdTggcnN2ZDIwWzMyXTsJLyogRFdPUkQgOTcgKi8KKwl1OCByc3ZkMjFbMzJdOwkvKiBEV09SRCA5OCAqLworCXU4IHJzdmQyMlszMl07CS8qIERXT1JEIDk5ICovCisJdTggcnN2ZDIzWzMyXTsJLyogRFdPUkQgMTAwICovCisJdTggcnN2ZDI0WzMyXTsJLyogRFdPUkQgMTAxICovCisJdTggcnN2ZDI1WzMyXTsJLyogRFdPUkQgMTAyICovCisJdTggcnN2ZDI2WzMyXTsJLyogRFdPUkQgMTAzICovCisJdTggcnN2ZDI3WzMyXTsJLyogRFdPUkQgMTA0ICovCisJdTggcnN2ZDI4Wzk2XTsJLyogRFdPUkQgMTA1ICovCisJdTggcnN2ZDI5WzMyXTsJLyogRFdPUkQgMTA4ICovCisJdTggcnN2ZDMwWzMyXTsJLyogRFdPUkQgMTA5ICovCisJdTggcnN2ZDMxWzMyXTsJLyogRFdPUkQgMTEwICovCisJdTggcnN2ZDMyWzMyXTsJLyogRFdPUkQgMTExICovCisJdTggcnN2ZDMzWzMyXTsJLyogRFdPUkQgMTEyICovCisJdTggcnN2ZDM0Wzk2XTsJLyogRFdPUkQgMTEzICovCisJdTggcnN2ZDM1WzMyXTsJLyogRFdPUkQgMTE2ICovCisJdTggcnN2ZDM2WzMyXTsJLyogRFdPUkQgMTE3ICovCisJdTggcnN2ZDM3WzMyXTsJLyogRFdPUkQgMTE4ICovCisJdTggcnN2ZDM4WzMyXTsJLyogRFdPUkQgMTE5ICovCisJdTggcnN2ZDM5WzMyXTsJLyogRFdPUkQgMTIwICovCisJdTggcnN2ZDQwWzMyXTsJLyogRFdPUkQgMTIxICovCisJdTggcnN2ZDQxWzEzNF1bMzJdOwkvKiBEV09SRCAxMjIgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTVBVX0NTUk1BUF9BTUFQIHsKKwl1MzIgZHdbMjU2XTsKK307CisKKyNlbmRpZiAvKiBfX21wdV9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdV9jb250ZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U5MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdV9jb250ZXh0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX21wdV9jb250ZXh0X2FtYXBfaF9fCisjZGVmaW5lIF9fbXB1X2NvbnRleHRfYW1hcF9oX18KKworLyoKKyAqIE1hbmFnZW1lbnQgY29tbWFuZCBhbmQgY29udHJvbCByaW5nIGNvbnRleHQuIFRoZSBNUFVzIEJUTFJfQ1RSTDEgQ1NSCisgKiBjb250cm9scyB0aGUgd3JpdGViYWNrIGJlaGF2aW9yIG9mIHRoZSBwcm9kdWNlciBhbmQgY29uc3VtZXIgaW5kZXggdmFsdWVzLgorICovCitzdHJ1Y3QgQkVfTUNDX1JJTkdfQ09OVEVYVF9BTUFQIHsKKwl1OCBjb25faW5kZXhbMTZdOwkvKiBEV09SRCAwICovCisJdTggcmluZ19zaXplWzRdOwkvKiBEV09SRCAwICovCisJdTggY3FfaWRbMTFdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDA7CQkvKiBEV09SRCAwICovCisJdTggcHJvZF9pbmRleFsxNl07CS8qIERXT1JEIDEgKi8KKwl1OCBwZGlkWzE1XTsJLyogRFdPUkQgMSAqLworCXU4IGludmFsaWQ7CQkvKiBEV09SRCAxICovCisJdTggY21kX3BlbmRpbmdfY3VycmVudFs3XTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQxWzI1XTsJLyogRFdPUkQgMiAqLworCXU4IGhwaV9wb3J0X2NxX2lkWzExXTsJLyogRFdPUkQgMyAqLworCXU4IHJzdmQyWzVdOwkvKiBEV09SRCAzICovCisJdTggY21kX3BlbmRpbmdfbWF4WzddOwkvKiBEV09SRCAzICovCisJdTggcnN2ZDNbOV07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX1JJTkdfQ09OVEVYVF9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisjZW5kaWYgLyogX19tcHVfY29udGV4dF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3BjaWNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3BjaWNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTU2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcGNpY2ZnLmgKQEAgLTAsMCArMSw4MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19wY2ljZmdfYW1hcF9oX18KKyNkZWZpbmUgX19wY2ljZmdfYW1hcF9oX18KKworLyogVmVuZG9yIGFuZCBEZXZpY2UgSUQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0lEX0NTUl9BTUFQIHsKKwl1OCB2ZW5kb3JpZFsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBkZXZpY2VpZFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0lEX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBJTyBCYXIgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0lPQkFSX0NTUl9BTUFQIHsKKwl1OCBpb3NwYWNlOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCisJdTggaW9iYXJbMjRdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19JT0JBUl9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTWVtb3J5IEJBUiAwIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIwX0NTUl9BTUFQIHsKKwl1OCBtZW1zcGFjZTsJLyogRFdPUkQgMCAqLworCXU4IHR5cGVbMl07CQkvKiBEV09SRCAwICovCisJdTggcGY7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTBdOwkvKiBEV09SRCAwICovCisJdTggbWVtYmFyMFsxOF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01FTUJBUjBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1lbW9yeSBCQVIgMSAtIExvdyBBZGRyZXNzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0xPX0NTUl9BTUFQIHsKKwl1OCBtZW1zcGFjZTsJLyogRFdPUkQgMCAqLworCXU4IHR5cGVbMl07CQkvKiBEV09SRCAwICovCisJdTggcGY7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTNdOwkvKiBEV09SRCAwICovCisJdTggbWVtYmFyMWxvWzE1XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTUVNQkFSMV9MT19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTWVtb3J5IEJBUiAxIC0gSGlnaCBBZGRyZXNzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIHsKKwl1OCBtZW1iYXIxaGlbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBNZW1vcnkgQkFSIDIgLSBMb3cgQWRkcmVzcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9MT19DU1JfQU1BUCB7CisJdTggbWVtc3BhY2U7CS8qIERXT1JEIDAgKi8KKwl1OCB0eXBlWzJdOwkJLyogRFdPUkQgMCAqLworCXU4IHBmOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzE3XTsJLyogRFdPUkQgMCAqLworCXU4IG1lbWJhcjJsb1sxMV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01FTUJBUjJfTE9fQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1lbW9yeSBCQVIgMiAtIEhpZ2ggQWRkcmVzcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCB7CisJdTggbWVtYmFyMmhpWzMyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogU3Vic3lzdGVtIFZlbmRvciBhbmQgSUQgKEZ1bmN0aW9uIDApIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19TVUJTWVNURU1fSURfRjBfQ1NSX0FNQVAgeworCXU4IHN1YnN5c192ZW5kb3JfaWRbMTZdOwkvKiBEV09SRCAwICovCisJdTggc3Vic3lzX2lkWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfU1VCU1lTVEVNX0lEX0YwX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTdWJzeXN0ZW0gVmVuZG9yIGFuZCBJRCAoRnVuY3Rpb24gMSkgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1NVQlNZU1RFTV9JRF9GMV9DU1JfQU1BUCB7CisJdTggc3Vic3lzX3ZlbmRvcl9pZFsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBzdWJzeXNfaWRbMTZdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TVUJTWVNURU1fSURfRjFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFNlbWFwaG9yZSBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfU0VNQVBIT1JFX0NTUl9BTUFQIHsKKwl1OCBsb2NrZWQ7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMzFdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TRU1BUEhPUkVfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFNvZnQgUmVzZXQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSX0FNQVAgeworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCisJdTggc29mdHJlc2V0OwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMTZdOwkvKiBEV09SRCAwICovCisJdTggbmVjX2xsX3JjdmRldGVjdF9pWzhdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TT0ZUX1JFU0VUX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBVbnJlY292ZXJhYmxlIEVycm9yIFN0YXR1cyAoTG93KSBSZWdpc3Rlci4gRWFjaCBiaXQgY29ycmVzcG9uZHMgdG8KKyAqIGFuIGludGVybmFsIFVucmVjb3ZlcmFibGUgRXJyb3IuICBUaGVzZSBhcmUgc2V0IGJ5IGhhcmR3YXJlIGFuZCBtYXkgYmUKKyAqIGNsZWFyZWQgYnkgd3JpdGluZyBhIG9uZSB0byB0aGUgcmVzcGVjdGl2ZSBiaXQocykgdG8gYmUgY2xlYXJlZC4gIEFueQorICogYml0IGJlaW5nIHNldCB0aGF0IGlzIGFsc28gdW5tYXNrZWQgd2lsbCByZXN1bHQgaW4gVW5yZWNvdmVyYWJsZSBFcnJvcgorICogaW50ZXJydXB0IG5vdGlmaWNhdGlvbiB0byB0aGUgaG9zdCBDUFUgYW5kL29yIFNlcnZlciBNYW5hZ2VtZW50IGNoaXAKKyAqIGFuZCB0aGUgdHJhbnNpdGlvbmluZyBvZiBCbGFkZUVuZ2luZSB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfQ1NSX0FNQVAgeworCXU4IGNldl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBjdHhfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggZGJ1Zl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBlcnhfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaG9zdF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggbmRtYV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwdGNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcmRtYV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByeGZfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcnhpcHNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAwX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDJfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdGltX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHRwb3N0X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHRwcmVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHhpcHNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHh1bHAwX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB1Y191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB3ZG1hX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0MV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwMF9vYl9saW5rX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHAxX29iX2xpbmtfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaG9zdF9ncGlvX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1ib3hfbmV0d191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X3N0b3JfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggYXhnbWFjMF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBheGdtYWMxX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pbnRwZW5kX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfVUVfU1RBVFVTX0xPV19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVW5yZWNvdmVyYWJsZSBFcnJvciBTdGF0dXMgKEhpZ2gpIFJlZ2lzdGVyLiBFYWNoIGJpdCBjb3JyZXNwb25kcyB0bworICogYW4gaW50ZXJuYWwgVW5yZWNvdmVyYWJsZSBFcnJvci4gIFRoZXNlIGFyZSBzZXQgYnkgaGFyZHdhcmUgYW5kIG1heSBiZQorICogY2xlYXJlZCBieSB3cml0aW5nIGEgb25lIHRvIHRoZSByZXNwZWN0aXZlIGJpdChzKSB0byBiZSBjbGVhcmVkLiAgQW55CisgKiBiaXQgYmVpbmcgc2V0IHRoYXQgaXMgYWxzbyB1bm1hc2tlZCB3aWxsIHJlc3VsdCBpbiBVbnJlY292ZXJhYmxlIEVycm9yCisgKiBpbnRlcnJ1cHQgbm90aWZpY2F0aW9uIHRvIHRoZSBob3N0IENQVSBhbmQvb3IgU2VydmVyIE1hbmFnZW1lbnQgY2hpcDsKKyAqIGFuZCB0aGUgdHJhbnNpdGlvbmluZyBvZiBCbGFkZUVuZ2luZSB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19ISV9DU1JfQU1BUCB7CisJdTgganRhZ191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBscGNtZW1ob3N0X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1nbXRfbWFjX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pcmFtX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHBjczBvbmxpbmVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcGNzMW9ubGluZV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwbWVtX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJyX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJ4cHBfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHhwYl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggeGF1aV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBhcm1fdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaXBjX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfVUVfU1RBVFVTX0hJX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBVbnJlY292ZXJhYmxlIEVycm9yIE1hc2sgKExvdykgUmVnaXN0ZXIuIEVhY2ggYml0LCB3aGVuIHNldCB0byBvbmUsCisgKiB3aWxsIG1hc2sgdGhlIGFzc29jaWF0ZWQgVW5yZWNvdmVyYWJsZSAgRXJyb3Igc3RhdHVzIGJpdCBmcm9tIG5vdGlmaWNhdGlvbgorICogb2YgVW5yZWNvdmVyYWJsZSBFcnJvciB0byB0aGUgaG9zdCBDUFUgYW5kL29yIFNlcnZlciBNYW5hZ21lbnQgY2hpcCBhbmQgdGhlCisgKiB0cmFuc2l0aW9uaW5nIG9mIGFsbCBCbGFkZUVuZ2luZSB1bml0cyB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB7CisJdTggY2V2X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBjdHhfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGRidWZfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGVyeF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaG9zdF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbXB1X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBuZG1hX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwdGNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJkbWFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJ4Zl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnhpcHNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAxX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDJfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHRpbV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdHBvc3RfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHRwcmVfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4aXBzX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdWNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHdkbWFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaG9zdDFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHAwX29iX2xpbmtfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHAxX29iX2xpbmtfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfZ3Bpb191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbWJveF9uZXR3X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X3N0b3JfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pbnRwZW5kX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVW5yZWNvdmVyYWJsZSBFcnJvciBNYXNrIChIaWdoKSBSZWdpc3Rlci4gRWFjaCBiaXQsIHdoZW4gc2V0IHRvIG9uZSwKKyAqIHdpbGwgbWFzayB0aGUgYXNzb2NpYXRlZCBVbnJlY292ZXJhYmxlIEVycm9yIHN0YXR1cyBiaXQgZnJvbSBub3RpZmljYXRpb24KKyAqIG9mIFVucmVjb3ZlcmFibGUgRXJyb3IgdG8gdGhlIGhvc3QgQ1BVIGFuZC9vciBTZXJ2ZXIgTWFuYWdtZW50IGNoaXAgYW5kIHRoZQorICogdHJhbnNpdGlvbmluZyBvZiBhbGwgQmxhZGVFbmdpbmUgdW5pdHMgdG8gYW4gT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfSElfTUFTS19DU1JfQU1BUCB7CisJdTgganRhZ191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbHBjbWVtaG9zdF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbWdtdF9tYWNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pcmFtX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mwb25saW5lX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mxb25saW5lX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcGN0bDFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHBtZW1fdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJyX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByeHBwX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBiX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHhhdWlfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGFybV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaXBjX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1VFX1NUQVRVU19ISV9NQVNLX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBPbmxpbmUgQ29udHJvbCBSZWdpc3RlciAwLiBUaGlzIHJlZ2lzdGVyIGNvbnRyb2xzIHZhcmlvdXMgdW5pdHMgd2l0aGluCisgKiBCbGFkZUVuZ2luZSBiZWluZyBpbiBhbiBPbmxpbmUgb3IgT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19PTkxJTkUwX0NTUl9BTUFQIHsKKwl1OCBjZXZfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggY3R4X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGRidWZfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggZXJ4X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGhvc3Rfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbXB1X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IG5kbWFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcHRjX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJkbWFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnhmX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJ4aXBzX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAyX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHRpbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0cG9zdF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0cHJlX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4aXBzX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdWNfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggd2RtYV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDJfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggaG9zdDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcDBfb2JfbGlua19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBwMV9vYl9saW5rX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfZ3Bpb19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X25ldHdfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbWJveF9zdG9yX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzBfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggYXhnbWFjMV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaW50cGVuZF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX09OTElORTBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE9ubGluZSBDb250cm9sIFJlZ2lzdGVyIDEuIFRoaXMgcmVnaXN0ZXIgY29udHJvbHMgdmFyaW91cyB1bml0cyB3aXRoaW4KKyAqIEJsYWRlRW5naW5lIGJlaW5nIGluIGFuIE9ubGluZSBvciBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgeworCXU4IGp0YWdfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbHBjbWVtaG9zdF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtZ210X21hY19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaXJhbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mwb25saW5lX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHBjczFvbmxpbmVfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcGN0bDBfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcGN0bDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcG1lbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBycl9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByeHBwX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4cGJfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdHhwX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHhhdWlfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggYXJtX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGlwY19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIEhvc3QgVGltZXIgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgeworCXU4IGhvc3R0aW1lclsyNF07CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0aW50cjsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTY3JhdGNocGFkIFJlZ2lzdGVyIChmb3Igc29mdHdhcmUgdXNlKS4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfU0NSQVRDSFBBRF9DU1JfQU1BUCB7CisJdTggc2NyYXRjaHBhZFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1NDUkFUQ0hQQURfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIENhcGFiaWxpdGllcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfUENJRV9DQVBfQ1NSX0FNQVAgeworCXU4IGNhcGlkWzhdOwkvKiBEV09SRCAwICovCisJdTggbmV4dGNhcFs4XTsJLyogRFdPUkQgMCAqLworCXU4IGNhcHZlcls0XTsJLyogRFdPUkQgMCAqLworCXU4IGRldnBvcnRbNF07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs2XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19QQ0lFX0NBUF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgRGV2aWNlIENhcGFiaWxpdGllcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfUENJRV9ERVZDQVBfQ1NSX0FNQVAgeworCXU4IHBheWxvYWRbM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFszXTsJLyogRFdPUkQgMCAqLworCXU4IGxvX2xhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IGwxX2xhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzNdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDJbM107CS8qIERXT1JEIDAgKi8KKwl1OCBwd3JfdmFsdWVbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBwd3Jfc2NhbGVbMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkM1s0XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9ERVZDQVBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIERldmljZSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcnMuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ09OVFJPTF9TVEFUVVNfQ1NSX0FNQVAgeworCXU4IENvcnJFcnJSZXBvcnRFbjsJLyogRFdPUkQgMCAqLworCXU4IE5vbkZhdGFsRXJyUmVwb3J0RW47CS8qIERXT1JEIDAgKi8KKwl1OCBGYXRhbEVyclJlcG9ydEVuOwkvKiBEV09SRCAwICovCisJdTggVW5zdXBwUmVxUmVwb3J0RW47CS8qIERXT1JEIDAgKi8KKwl1OCBFbmFibGVSZWxheE9yZGVyOwkvKiBEV09SRCAwICovCisJdTggTWF4X1BheWxvYWRfU2l6ZVszXTsJLyogRFdPUkQgMCAqLworCXU4IEV4dGVuZFRhZ0ZpZWxkRW5hYmxlOwkvKiBEV09SRCAwICovCisJdTggUGhhbnRvbUZuRW5hYmxlOwkvKiBEV09SRCAwICovCisJdTggQXV4UHdyUE1FbmFibGU7CS8qIERXT1JEIDAgKi8KKwl1OCBFbmFibGVOb1Nub29wOwkvKiBEV09SRCAwICovCisJdTggTWF4X1JlYWRfUmVxX1NpemVbM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMDsJCS8qIERXT1JEIDAgKi8KKwl1OCBDb3JyRXJyRGV0ZWN0OwkvKiBEV09SRCAwICovCisJdTggTm9uRmF0YWxFcnJEZXRlY3Q7CS8qIERXT1JEIDAgKi8KKwl1OCBGYXRhbEVyckRldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IFVuc3VwcFJlcURldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IEF1eFB3ckRldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IFRyYW5zUGVuZGluZzsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzEwXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9DT05UUk9MX1NUQVRVU19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTGluayBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19DQVBfQ1NSX0FNQVAgeworCXU4IE1heExpbmtTcGVlZFs0XTsJLyogRFdPUkQgMCAqLworCXU4IE1heExpbmtXaWR0aFs2XTsJLyogRFdPUkQgMCAqLworCXU4IEFTUE1TdXBwb3J0WzJdOwkvKiBEV09SRCAwICovCisJdTggTDBzRXhpdExhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IEwxRXhpdExhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzZdOwkvKiBEV09SRCAwICovCisJdTggUG9ydE51bVs4XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9MSU5LX0NBUF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTGluayBTdGF0dXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19TVEFUVVNfQ1NSX0FNQVAgeworCXU4IEFTUE1DdGxbMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMDsJCS8qIERXT1JEIDAgKi8KKwl1OCBSZWFkQ21wbEJuZHJ5OwkvKiBEV09SRCAwICovCisJdTggTGlua0Rpc2FibGU7CS8qIERXT1JEIDAgKi8KKwl1OCBSZXRyYWluTGluazsJLyogRFdPUkQgMCAqLworCXU4IENvbW1vbkNsa0NvbmZpZzsJLyogRFdPUkQgMCAqLworCXU4IEV4dGVuZFN5bmM7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVs4XTsJLyogRFdPUkQgMCAqLworCXU4IExpbmtTcGVlZFs0XTsJLyogRFdPUkQgMCAqLworCXU4IE5lZ0xpbmtXaWR0aFs2XTsJLyogRFdPUkQgMCAqLworCXU4IExpbmtUcmFpbkVycjsJLyogRFdPUkQgMCAqLworCXU4IExpbmtUcmFpbjsJLyogRFdPUkQgMCAqLworCXU4IFNsb3RDbGtDb25maWc7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMlszXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9MSU5LX1NUQVRVU19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTVNJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSV9DU1JfQU1BUCB7CisJdTggY2FwaWRbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBuZXh0cHRyWzhdOwkvKiBEV09SRCAwICovCisJdTggdGFibGVzaXplWzExXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzNdOwkvKiBEV09SRCAwICovCisJdTggZnVuY21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBlbjsJCS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTVNJLVggVGFibGUgT2Zmc2V0IFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NU0lYX1RBQkxFX0NTUl9BTUFQIHsKKwl1OCB0YWJsZWJpclszXTsJLyogRFdPUkQgMCAqLworCXU4IG9mZnNldFsyOV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfVEFCTEVfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1TSS1YIFBCQSBPZmZzZXQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfUEJBX0NTUl9BTUFQIHsKKwl1OCBwYmFiaXJbM107CS8qIERXT1JEIDAgKi8KKwl1OCBvZmZzZXRbMjldOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX1BCQV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTVNJLVggTWVzc2FnZSBWZWN0b3IgQ29udHJvbCBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9WRUNUT1JfQ09OVFJPTF9DU1JfQU1BUCB7CisJdTggdmVjdG9yX2NvbnRyb2w7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFszMV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfVkVDVE9SX0NPTlRST0xfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgRGF0YSBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfREFUQV9DU1JfQU1BUCB7CisJdTggZGF0YVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfTVNHX0RBVEFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgQWRkcmVzcyBSZWdpc3RlciAtIEhpZ2ggUGFydC4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9ISV9DU1JfQU1BUCB7CisJdTggYWRkclszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfTVNHX0FERFJfSElfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgQWRkcmVzcyBSZWdpc3RlciAtIExvdyBQYXJ0LiAqLworc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIHsKKwl1OCByc3ZkMFsyXTsJLyogRFdPUkQgMCAqLworCXU4IGFkZHJbMzBdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMThfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMThfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMTlfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMTlfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMjBfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsyNV1bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzIwX1JTVkRfQU1BUCB7CisJdTMyIGR3WzI2XTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yMV9SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzE5MTldWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yMV9SU1ZEX0FNQVAgeworCXUzMiBkd1sxOTIwXTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yMl9NRVNTQUdFX0FNQVAgeworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9WRUNUT1JfQ09OVFJPTF9DU1JfQU1BUCB2ZWNfY3RybDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfTVNHX0RBVEFfQ1NSX0FNQVAgbXNnX2RhdGE7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0hJX0NTUl9BTUFQIGFkZHJfaGk7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIGFkZHJfbG93OworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yMl9NRVNTQUdFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yM19SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzg5NV1bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzIzX1JTVkRfQU1BUCB7CisJdTMyIGR3Wzg5Nl07Cit9OworCisvKiBUaGVzZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSByZWdpc3RlcnMgYXJlIGZvciB0aGUgU3RvcmFnZSAgRnVuY3Rpb24gb2YKKyAqIEJsYWRlRW5naW5lIChGdW5jdGlvbiAwKS4gSW4gdGhlIG1lbW9yeSBtYXAgb2YgdGhlIHJlZ2lzdGVycyBiZWxvdyB0aGVpcgorICogdGFibGUsCisgKi8KK3N0cnVjdCBCRV9QQ0lDRkcwX0NTUk1BUF9BTUFQIHsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX0lEX0NTUl9BTUFQIGlkOworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgMyAqLworCXN0cnVjdCBCRV9QQ0lDRkdfSU9CQVJfQ1NSX0FNQVAgaW9iYXI7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIwX0NTUl9BTUFQIG1lbWJhcjA7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0xPX0NTUl9BTUFQIG1lbWJhcjFfbG87CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIG1lbWJhcjFfaGk7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIyX0xPX0NTUl9BTUFQIG1lbWJhcjJfbG87CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIyX0hJX0NTUl9BTUFQIG1lbWJhcjJfaGk7CisJdTggcnN2ZDNbMzJdOwkvKiBEV09SRCAxMCAqLworCXN0cnVjdCBCRV9QQ0lDRkdfU1VCU1lTVEVNX0lEX0YwX0NTUl9BTUFQIHN1YnN5c3RlbV9pZDsKKwl1OCByc3ZkNFszMl07CS8qIERXT1JEIDEyICovCisJdTggcnN2ZDVbMzJdOwkvKiBEV09SRCAxMyAqLworCXU4IHJzdmQ2WzMyXTsJLyogRFdPUkQgMTQgKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDE1ICovCisJc3RydWN0IEJFX1BDSUNGR19TRU1BUEhPUkVfQ1NSX0FNQVAgc2VtYXBob3JlWzRdOworCXN0cnVjdCBCRV9QQ0lDRkdfU09GVF9SRVNFVF9DU1JfQU1BUCBzb2Z0X3Jlc2V0OworCXU4IHJzdmQ4WzMyXTsJLyogRFdPUkQgMjEgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NDUkFUQ0hQQURfQ1NSX0FNQVAgc2NyYXRjaHBhZDsKKwl1OCByc3ZkOVszMl07CS8qIERXT1JEIDIzICovCisJdTggcnN2ZDEwWzMyXTsJLyogRFdPUkQgMjQgKi8KKwl1OCByc3ZkMTFbMzJdOwkvKiBEV09SRCAyNSAqLworCXU4IHJzdmQxMlszMl07CS8qIERXT1JEIDI2ICovCisJdTggcnN2ZDEzWzMyXTsJLyogRFdPUkQgMjcgKi8KKwl1OCByc3ZkMTRbMl1bMzJdOwkvKiBEV09SRCAyOCAqLworCXU4IHJzdmQxNVszMl07CS8qIERXT1JEIDMwICovCisJdTggcnN2ZDE2WzMyXTsJLyogRFdPUkQgMzEgKi8KKwl1OCByc3ZkMTdbOF1bMzJdOwkvKiBEV09SRCAzMiAqLworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0xPV19DU1JfQU1BUCB1ZV9zdGF0dXNfbG93OworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0hJX0NTUl9BTUFQIHVlX3N0YXR1c19oaTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB1ZV9zdGF0dXNfbG93X21hc2s7CisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfSElfTUFTS19DU1JfQU1BUCB1ZV9zdGF0dXNfaGlfbWFzazsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTBfQ1NSX0FNQVAgb25saW5lMDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgb25saW5lMTsKKwl1OCByc3ZkMThbMzJdOwkvKiBEV09SRCA0NiAqLworCXU4IHJzdmQxOVszMl07CS8qIERXT1JEIDQ3ICovCisJdTggcnN2ZDIwWzMyXTsJLyogRFdPUkQgNDggKi8KKwl1OCByc3ZkMjFbMzJdOwkvKiBEV09SRCA0OSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1JfQU1BUCBob3N0X3RpbWVyX2ludF9jdHJsOworCXU4IHJzdmQyMlszMl07CS8qIERXT1JEIDUxICovCisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0NBUF9DU1JfQU1BUCBwY2llX2NhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfREVWQ0FQX0NTUl9BTUFQIHBjaWVfZGV2Y2FwOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9DT05UUk9MX1NUQVRVU19DU1JfQU1BUCBwY2llX2NvbnRyb2xfc3RhdHVzOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9MSU5LX0NBUF9DU1JfQU1BUCBwY2llX2xpbmtfY2FwOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9MSU5LX1NUQVRVU19DU1JfQU1BUCBwY2llX2xpbmtfc3RhdHVzOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJX0NTUl9BTUFQIG1zaTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfVEFCTEVfQ1NSX0FNQVAgbXNpeF90YWJsZV9vZmZzZXQ7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX1BCQV9DU1JfQU1BUCBtc2l4X3BiYV9vZmZzZXQ7CisJdTggcnN2ZDIzWzMyXTsJLyogRFdPUkQgNjAgKi8KKwl1OCByc3ZkMjRbMzJdOwkvKiBEV09SRCA2MSAqLworCXU4IHJzdmQyNVszMl07CS8qIERXT1JEIDYyICovCisJdTggcnN2ZDI2WzMyXTsJLyogRFdPUkQgNjMgKi8KKwl1OCByc3ZkMjdbMzJdOwkvKiBEV09SRCA2NCAqLworCXU4IHJzdmQyOFszMl07CS8qIERXT1JEIDY1ICovCisJdTggcnN2ZDI5WzMyXTsJLyogRFdPUkQgNjYgKi8KKwl1OCByc3ZkMzBbMzJdOwkvKiBEV09SRCA2NyAqLworCXU4IHJzdmQzMVszMl07CS8qIERXT1JEIDY4ICovCisJdTggcnN2ZDMyWzMyXTsJLyogRFdPUkQgNjkgKi8KKwl1OCByc3ZkMzNbMzJdOwkvKiBEV09SRCA3MCAqLworCXU4IHJzdmQzNFszMl07CS8qIERXT1JEIDcxICovCisJdTggcnN2ZDM1WzMyXTsJLyogRFdPUkQgNzIgKi8KKwl1OCByc3ZkMzZbMzJdOwkvKiBEV09SRCA3MyAqLworCXU4IHJzdmQzN1szMl07CS8qIERXT1JEIDc0ICovCisJdTggcnN2ZDM4WzMyXTsJLyogRFdPUkQgNzUgKi8KKwl1OCByc3ZkMzlbMzJdOwkvKiBEV09SRCA3NiAqLworCXU4IHJzdmQ0MFszMl07CS8qIERXT1JEIDc3ICovCisJdTggcnN2ZDQxWzMyXTsJLyogRFdPUkQgNzggKi8KKwl1OCByc3ZkNDJbMzJdOwkvKiBEV09SRCA3OSAqLworCXU4IHJzdmQ0M1szMl07CS8qIERXT1JEIDgwICovCisJdTggcnN2ZDQ0WzMyXTsJLyogRFdPUkQgODEgKi8KKwl1OCByc3ZkNDVbMzJdOwkvKiBEV09SRCA4MiAqLworCXU4IHJzdmQ0NlszMl07CS8qIERXT1JEIDgzICovCisJdTggcnN2ZDQ3WzMyXTsJLyogRFdPUkQgODQgKi8KKwl1OCByc3ZkNDhbMzJdOwkvKiBEV09SRCA4NSAqLworCXU4IHJzdmQ0OVszMl07CS8qIERXT1JEIDg2ICovCisJdTggcnN2ZDUwWzMyXTsJLyogRFdPUkQgODcgKi8KKwl1OCByc3ZkNTFbMzJdOwkvKiBEV09SRCA4OCAqLworCXU4IHJzdmQ1MlszMl07CS8qIERXT1JEIDg5ICovCisJdTggcnN2ZDUzWzMyXTsJLyogRFdPUkQgOTAgKi8KKwl1OCByc3ZkNTRbMzJdOwkvKiBEV09SRCA5MSAqLworCXU4IHJzdmQ1NVszMl07CS8qIERXT1JEIDkyICovCisJdTggcnN2ZDU2WzgzMl07CS8qIERXT1JEIDkzICovCisJdTggcnN2ZDU3WzMyXTsJLyogRFdPUkQgMTE5ICovCisJdTggcnN2ZDU4WzMyXTsJLyogRFdPUkQgMTIwICovCisJdTggcnN2ZDU5WzMyXTsJLyogRFdPUkQgMTIxICovCisJdTggcnN2ZDYwWzMyXTsJLyogRFdPUkQgMTIyICovCisJdTggcnN2ZDYxWzMyXTsJLyogRFdPUkQgMTIzICovCisJdTggcnN2ZDYyWzMyXTsJLyogRFdPUkQgMTI0ICovCisJdTggcnN2ZDYzWzMyXTsJLyogRFdPUkQgMTI1ICovCisJdTggcnN2ZDY0WzMyXTsJLyogRFdPUkQgMTI2ICovCisJdTggcnN2ZDY1WzMyXTsJLyogRFdPUkQgMTI3ICovCisJdTggcnN2ZDY2WzYxNDQwXTsJLyogRFdPUkQgMTI4ICovCisJc3RydWN0IEJFX1BDSUNGR19BTk9OXzIyX01FU1NBR0VfQU1BUCBtZXNzYWdlWzMyXTsKKwl1OCByc3ZkNjdbMjg2NzJdOwkvKiBEV09SRCAyMTc2ICovCisJdTggcnN2ZDY4WzMyXTsJLyogRFdPUkQgMzA3MiAqLworCXU4IHJzdmQ2OVsxMDIzXVszMl07CS8qIERXT1JEIDMwNzMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHMF9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzQwOTZdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI0X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI0X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI1X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI1X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI2X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI2X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI3X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI3X1JTVkRfQU1BUCB7CisJdTMyIGR3WzJdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI4X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbM11bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI4X1JTVkRfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI5X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMzZdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yOV9SU1ZEX0FNQVAgeworCXUzMiBkd1szN107Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzBfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxOTMwXVszMl07CS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMzBfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMTkzMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIHsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfVkVDVE9SX0NPTlRST0xfQ1NSX0FNQVAgdmVjX2N0cmw7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19EQVRBX0NTUl9BTUFQIG1zZ19kYXRhOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9ISV9DU1JfQU1BUCBhZGRyX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9MT19DU1JfQU1BUCBhZGRyX2xvdzsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzJfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVs4OTVdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8zMl9SU1ZEX0FNQVAgeworCXUzMiBkd1s4OTZdOworfTsKKworLyogVGhpcyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlciBtYXAgaXMgZm9yIHRoZSAgTmV0d29ya2luZyBGdW5jdGlvbiBvZgorICogQmxhZGVFbmdpbmUgKEZ1bmN0aW9uIDEpLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHMV9DU1JNQVBfQU1BUCB7CisJc3RydWN0IEJFX1BDSUNGR19JRF9DU1JfQU1BUCBpZDsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVszMl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkMlszMl07CS8qIERXT1JEIDMgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0lPQkFSX0NTUl9BTUFQIGlvYmFyOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMF9DU1JfQU1BUCBtZW1iYXIwOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9MT19DU1JfQU1BUCBtZW1iYXIxX2xvOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9ISV9DU1JfQU1BUCBtZW1iYXIxX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9MT19DU1JfQU1BUCBtZW1iYXIyX2xvOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCBtZW1iYXIyX2hpOworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMTAgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NVQlNZU1RFTV9JRF9GMV9DU1JfQU1BUCBzdWJzeXN0ZW1faWQ7CisJdTggcnN2ZDRbMzJdOwkvKiBEV09SRCAxMiAqLworCXU4IHJzdmQ1WzMyXTsJLyogRFdPUkQgMTMgKi8KKwl1OCByc3ZkNlszMl07CS8qIERXT1JEIDE0ICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAxNSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfU0VNQVBIT1JFX0NTUl9BTUFQIHNlbWFwaG9yZVs0XTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSX0FNQVAgc29mdF9yZXNldDsKKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDIxICovCisJc3RydWN0IEJFX1BDSUNGR19TQ1JBVENIUEFEX0NTUl9BTUFQIHNjcmF0Y2hwYWQ7CisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCAyMyAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDI0ICovCisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgMjUgKi8KKwl1OCByc3ZkMTJbMzJdOwkvKiBEV09SRCAyNiAqLworCXU4IHJzdmQxM1szMl07CS8qIERXT1JEIDI3ICovCisJdTggcnN2ZDE0WzJdWzMyXTsJLyogRFdPUkQgMjggKi8KKwl1OCByc3ZkMTVbMzJdOwkvKiBEV09SRCAzMCAqLworCXU4IHJzdmQxNlszMl07CS8qIERXT1JEIDMxICovCisJdTggcnN2ZDE3WzhdWzMyXTsJLyogRFdPUkQgMzIgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfQ1NSX0FNQVAgdWVfc3RhdHVzX2xvdzsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19ISV9DU1JfQU1BUCB1ZV9zdGF0dXNfaGk7CisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfTE9XX01BU0tfQ1NSX0FNQVAgdWVfc3RhdHVzX2xvd19tYXNrOworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0hJX01BU0tfQ1NSX0FNQVAgdWVfc3RhdHVzX2hpX21hc2s7CisJc3RydWN0IEJFX1BDSUNGR19PTkxJTkUwX0NTUl9BTUFQIG9ubGluZTA7CisJc3RydWN0IEJFX1BDSUNGR19PTkxJTkUxX0NTUl9BTUFQIG9ubGluZTE7CisJdTggcnN2ZDE4WzMyXTsJLyogRFdPUkQgNDYgKi8KKwl1OCByc3ZkMTlbMzJdOwkvKiBEV09SRCA0NyAqLworCXU4IHJzdmQyMFszMl07CS8qIERXT1JEIDQ4ICovCisJdTggcnN2ZDIxWzMyXTsJLyogRFdPUkQgNDkgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgaG9zdF90aW1lcl9pbnRfY3RybDsKKwl1OCByc3ZkMjJbMzJdOwkvKiBEV09SRCA1MSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9DQVBfQ1NSX0FNQVAgcGNpZV9jYXA7CisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0RFVkNBUF9DU1JfQU1BUCBwY2llX2RldmNhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ09OVFJPTF9TVEFUVVNfQ1NSX0FNQVAgcGNpZV9jb250cm9sX3N0YXR1czsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19DQVBfQ1NSX0FNQVAgcGNpZV9saW5rX2NhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19TVEFUVVNfQ1NSX0FNQVAgcGNpZV9saW5rX3N0YXR1czsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSV9DU1JfQU1BUCBtc2k7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX1RBQkxFX0NTUl9BTUFQIG1zaXhfdGFibGVfb2Zmc2V0OworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9QQkFfQ1NSX0FNQVAgbXNpeF9wYmFfb2Zmc2V0OworCXU4IHJzdmQyM1s2NF07CS8qIERXT1JEIDYwICovCisJdTggcnN2ZDI0WzMyXTsJLyogRFdPUkQgNjIgKi8KKwl1OCByc3ZkMjVbMzJdOwkvKiBEV09SRCA2MyAqLworCXU4IHJzdmQyNlszMl07CS8qIERXT1JEIDY0ICovCisJdTggcnN2ZDI3WzMyXTsJLyogRFdPUkQgNjUgKi8KKwl1OCByc3ZkMjhbMzJdOwkvKiBEV09SRCA2NiAqLworCXU4IHJzdmQyOVszMl07CS8qIERXT1JEIDY3ICovCisJdTggcnN2ZDMwWzMyXTsJLyogRFdPUkQgNjggKi8KKwl1OCByc3ZkMzFbMzJdOwkvKiBEV09SRCA2OSAqLworCXU4IHJzdmQzMlszMl07CS8qIERXT1JEIDcwICovCisJdTggcnN2ZDMzWzMyXTsJLyogRFdPUkQgNzEgKi8KKwl1OCByc3ZkMzRbMzJdOwkvKiBEV09SRCA3MiAqLworCXU4IHJzdmQzNVszMl07CS8qIERXT1JEIDczICovCisJdTggcnN2ZDM2WzMyXTsJLyogRFdPUkQgNzQgKi8KKwl1OCByc3ZkMzdbMTI4XTsJLyogRFdPUkQgNzUgKi8KKwl1OCByc3ZkMzhbMzJdOwkvKiBEV09SRCA3OSAqLworCXU4IHJzdmQzOVsxMTg0XTsJLyogRFdPUkQgODAgKi8KKwl1OCByc3ZkNDBbNjE3OTJdOwkvKiBEV09SRCAxMTcgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIG1lc3NhZ2VbMzJdOworCXU4IHJzdmQ0MVsyODY3Ml07CS8qIERXT1JEIDIxNzYgKi8KKwl1OCByc3ZkNDJbMzJdOwkvKiBEV09SRCAzMDcyICovCisJdTggcnN2ZDQzWzEwMjNdWzMyXTsJLyogRFdPUkQgMzA3MyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkcxX0NTUk1BUF9BTUFQIHsKKwl1MzIgZHdbNDA5Nl07Cit9OworCisjZW5kaWYgLyogX19wY2ljZmdfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9wb3N0X2NvZGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcG9zdF9jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTYyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcG9zdF9jb2Rlcy5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fcG9zdF9jb2Rlc19hbWFwX2hfXworI2RlZmluZSBfX3Bvc3RfY29kZXNfYW1hcF9oX18KKworLyogLS0tIE1HTVRfSEJBX1BPU1RfU1RBR0VfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9QT1dFUl9PTl9SRVNFVCAgICgwKQkvKiBTdGF0ZSBhZnRlciBhIGNvbGQgb3Igd2FybSBib290LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0FXQUlUSU5HX0hPU1RfUkRZICgxKQkvKiBBUk0gYm9vdCBjb2RlIGF3YWl0aW5nIGEKKwkJCQkJCWdvLWFoZWQgZnJvbSAgdGhlIGhvc3QuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfSE9TVF9SRFkgKDIpCS8qIEhvc3QgaGFzIGdpdmVuIGdvLWFoZWQgdG8gQVJNLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0JFX1JFU0VUICgzKQkvKiBIb3N0IHdhbnRzIHRvIHJlc2V0IGNoaXAsIHRoaXMgaXMgYSAgY2hpcAorCQkJCQkJd29ya2Fyb3VuZCAgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9TRUVQUk9NX0NTX1NUQVJUICgyNTYpCS8qIFNFRVBST00gY2hlY2tzdW0KKwkJCQkJCXRlc3Qgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfU0VFUFJPTV9DU19ET05FICAoMjU3KQkvKiBTRUVQUk9NIGNoZWNrc3VtIHRlc3QKKwkJCQkJCQlkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0REUl9DT05GSUdfU1RBUlQgKDUxMikJLyogRERSIGNvbmZpZ3VyYXRpb24gc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRERSX0NPTkZJR19ET05FICAoNTEzKQkvKiBERFIgY29uZmlndXJhdGlvbiBkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0REUl9DQUxJQlJBVEVfU1RBUlQgICg3NjgpCS8qIEREUiBjYWxpYnJhdGlvbiBzdGFydC4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ERFJfQ0FMSUJSQVRFX0RPTkUgICAoNzY5KQkvKiBERFIgY2FsaWJyYXRpb24gZG9uZS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ERFJfVEVTVF9TVEFSVCAgICgxMDI0KQkvKiBERFIgbWVtb3J5IHRlc3Qgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRERSX1RFU1RfRE9ORSAgICAoMTAyNSkJLyogRERSIG1lbW9yeSB0ZXN0IGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkVEQk9PVF9JTklUX1NUQVJUICAgKDE1MzYpCS8qIFJlZGJvb3Qgc3RhcnRzIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9SRURCT09UX0lOSVRfRE9ORSAoMTUzNykJLyogUmVkYm9vdCBkb25lIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9GV19JTUFHRV9MT0FEX1NUQVJUICgxNzkyKQkvKiBGaXJtd2FyZSBpbWFnZSBsb2FkIHRvCisJCQkJCQkJRERSIHN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0ZXX0lNQUdFX0xPQURfRE9ORSAgICgxNzkzKQkvKiBGaXJtd2FyZSBpbWFnZSBsb2FkCisJCQkJCQkJdG8gRERSIGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQVJNRldfU1RBUlQgICAgICAgICAgKDIwNDgpCS8qIEFSTWZ3IHJ1bnRpbWUgY29kZQorCQkJCQkJc3RhcnRzIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ESENQX1FVRVJZX1NUQVJUICAgICAoMjMwNCkJLyogREhDUCBzZXJ2ZXIgcXVlcnkgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfREhDUF9RVUVSWV9ET05FICAgICAgKDIzMDUpCS8qIERIQ1Agc2VydmVyIHF1ZXJ5IGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQk9PVF9UQVJHRVRfRElTQ09WRVJZX1NUQVJUICgyNTYwKQkvKiBCb290IFRhcmdldAorCQkJCQkJRGlzY292ZXJ5IFN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0JPT1RfVEFSR0VUX0RJU0NPVkVSWV9ET05FICgyNTYxKQkvKiBCb290IFRhcmdldAorCQkJCQkJRGlzY292ZXJ5IERvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkNfT1BUSU9OX1NFVCAgICAgICAgKDI4MTYpCS8qIFJlbW90ZSBjb25maWd1cmF0aW9uCisJCQkJCQlvcHRpb24gaXMgc2V0IGluICBTRUVQUk9NICAqLworI2RlZmluZSBQT1NUX1NUQUdFX1NXSVRDSF9MSU5LICAgICAgICAgICgyODE3KQkvKiBXYWl0IGZvciBsaW5rIHVwIG9uIHN3aXRjaCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1NFTkRfSUNEU19NRVNTQUdFICAgICgyODE4KQkvKiBTZW5kIHRoZSBJQ0RTIG1lc3NhZ2UKKwkJCQkJCXRvIHN3aXRjaCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1BFUkZST01fVEZUUCAgICAgICAgICgyODE5KQkvKiBEb3dubG9hZCB4bWwgdXNpbmcgVEZUUCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1BBUlNFX1hNTCAgICAgICAgICAgICgyODIwKQkvKiBQYXJzZSBYTUwgZmlsZSAqLworI2RlZmluZSBQT1NUX1NUQUdFX0RPV05MT0FEX0lNQUdFICAgICAgICgyODIxKQkvKiBEb3dubG9hZCBJTUFHRSBmcm9tCisJCQkJCQlURlRQIHNlcnZlciAqLworI2RlZmluZSBQT1NUX1NUQUdFX0ZMQVNIX0lNQUdFICAgICAgICAgICgyODIyKQkvKiBGbGFzaCB0aGUgSU1BR0UgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9SQ19ET05FICAgICAgICAgICAgICAoMjgyMykJLyogUmVtb3RlIGNvbmZpZ3VyYXRpb24KKwkJCQkJCWNvbXBsZXRlICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkVCT09UX1NZU1RFTSAgICAgICAgKDI4MjQpCS8qIFVwZ3JhZGUgSU1BR0UgZG9uZSwKKwkJCQkJCXJlYm9vdCByZXF1aXJlZCAqLworI2RlZmluZSBQT1NUX1NUQUdFX01BQ19BRERSRVNTICAgICAgICAgICgzMDcyKQkvKiBNQUMgQWRkcmVzcyBDaGVjayAqLworI2RlZmluZSBQT1NUX1NUQUdFX0FSTUZXX1JFQURZICAgICAgICAgICg0OTE1MikJLyogQVJNZncgaXMgZG9uZSB3aXRoIFBPU1QKKwkJCQkJCWFuZCByZWFkeS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9BUk1GV19VRSAgICAgICAgICAgICAoNjE0NDApCS8qIEFSTWZ3IGhhcyBhc3NlcnRlZCBhbgorCQkJCQkJdW5yZWNvdmVyYWJsZSBlcnJvci4gVGhlCisJCQkJCQlsb3dlciAzIGhleCBkaWdpdHMgb2YgdGhlCisJCQkJCQlzdGFnZSBjb2RlIGlkZW50aWZ5IHRoZQorCQkJCQkJdW5pcXVlIGVycm9yIGNvZGUuCisJCQkJCQkqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgdGhlIE1QVSBzZW1hcGhvcmUKKyAqIHJlZ2lzdGVyIHdoZW4gdXNlZCBmb3IgUE9TVC4KKyAqLworc3RydWN0IEJFX01HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHsKKwl1OCBzdGFnZVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxMF07CS8qIERXT1JEIDAgKi8KKwl1OCBpc2NzaV9kcml2ZXJfbG9hZGVkOwkvKiBEV09SRCAwICovCisJdTggb3B0aW9uX3JvbV9pbnN0YWxsZWQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpc2NzaV9pcF9jb25mbGljdDsJLyogRFdPUkQgMCAqLworCXU4IGlzY3NpX25vX2lwOwkvKiBEV09SRCAwICovCisJdTggYmFja3VwX2Z3OwkvKiBEV09SRCAwICovCisJdTggZXJyb3I7CQkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiAtLS0gTUdNVF9IQkFfUE9TVF9EVU1NWV9CSVRTX0VOVU0gLS0tICovCisjZGVmaW5lIFBPU1RfQklUX0lTQ1NJX0xPQURFRCAgICAgICAgICAgKDI2KQorI2RlZmluZSBQT1NUX0JJVF9PUFRST01fSU5TVCAgICAgICAgICAgICgyNykKKyNkZWZpbmUgUE9TVF9CSVRfQkFEX0lQX0FERFIgICAgICAgICAgICAoMjgpCisjZGVmaW5lIFBPU1RfQklUX05PX0lQX0FERFIgICAgICAgICAgICAgKDI5KQorI2RlZmluZSBQT1NUX0JJVF9CQUNLVVBfRlcgICAgICAgICAgICAgICgzMCkKKyNkZWZpbmUgUE9TVF9CSVRfRVJST1IgICAgICAgICAgICAgICAgICAoMzEpCisKKy8qIC0tLSBNR01UX0hCQV9QT1NUX0RVTU1ZX1ZBTFVFU19FTlVNIC0tLSAqLworI2RlZmluZSBQT1NUX0lTQ1NJX0RSSVZFUl9MT0FERUQgICAgICAgICg2NzEwODg2NCkKKyNkZWZpbmUgUE9TVF9PUFRST01fSU5TVEFMTEVEICAgICAgICAgICAoMTM0MjE3NzI4KQorI2RlZmluZSBQT1NUX0lTQ1NJX0lQX0FERFJFU1NfQ09ORkxJQ1QgICgyNjg0MzU0NTYpCisjZGVmaW5lIFBPU1RfSVNDU0lfTk9fSVBfQUREUkVTUyAgICAgICAgKDUzNjg3MDkxMikKKyNkZWZpbmUgUE9TVF9CQUNLVVBfRldfTE9BREVEICAgICAgICAgICAoMTA3Mzc0MTgyNCkKKyNkZWZpbmUgUE9TVF9GQVRBTF9FUlJPUiAgICAgICAgICAgICAgICAoMjE0NzQ4MzY0OCkKKworI2VuZGlmIC8qIF9fcG9zdF9jb2Rlc19hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3JlZ21hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3JlZ21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTZiYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcmVnbWFwLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX3JlZ21hcF9hbWFwX2hfXworI2RlZmluZSBfX3JlZ21hcF9hbWFwX2hfXworI2luY2x1ZGUgInBjaWNmZy5oIgorI2luY2x1ZGUgImVwLmgiCisjaW5jbHVkZSAiY2V2LmgiCisjaW5jbHVkZSAibXB1LmgiCisjaW5jbHVkZSAiZG9vcmJlbGxzLmgiCisKKy8qCisgKiBUaGlzIGlzIHRoZSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgbWFwIGZvciBCbGFkZUVuZ2luZSwgc2hvd2luZworICogdGhlIHJlbGF0aXZlIHNpemUgYW5kIG9mZnNldCBvZiBlYWNoIHN1Yi1tb2R1bGUuIFRoZSBDU1IgcmVnaXN0ZXJzCisgKiBhcmUgaWRlbnRpY2FsIGZvciB0aGUgbmV0d29yayBhbmQgc3RvcmFnZSBQQ0kgZnVuY3Rpb25zLiBUaGUKKyAqIENTUiBtYXAgaXMgc2hvd24gYmVsb3csIGZvbGxvd2VkIGJ5IGRldGFpbHMgb2YgZWFjaCBibG9jaywKKyAqIGluIHN1Yi1zZWN0aW9ucy4gIFRoZSBzdWItc2VjdGlvbnMgYmVnaW4gd2l0aCBhIGRlc2NyaXB0aW9uCisgKiBvZiBDU1JzIHRoYXQgYXJlIGluc3RhbnRpYXRlZCBpbiBtdWx0aXBsZSBibG9ja3MuCisgKi8KK3N0cnVjdCBCRV9CTEFERV9FTkdJTkVfQ1NSTUFQX0FNQVAgeworCXN0cnVjdCBCRV9NUFVfQ1NSTUFQX0FNQVAgbXB1OworCXU4IHJzdmQwWzgxOTJdOwkvKiBEV09SRCAyNTYgKi8KKwl1OCByc3ZkMVs4MTkyXTsJLyogRFdPUkQgNTEyICovCisJc3RydWN0IEJFX0NFVl9DU1JNQVBfQU1BUCBjZXY7CisJdTggcnN2ZDJbODE5Ml07CS8qIERXT1JEIDEwMjQgKi8KKwl1OCByc3ZkM1s4MTkyXTsJLyogRFdPUkQgMTI4MCAqLworCXU4IHJzdmQ0WzgxOTJdOwkvKiBEV09SRCAxNTM2ICovCisJdTggcnN2ZDVbODE5Ml07CS8qIERXT1JEIDE3OTIgKi8KKwl1OCByc3ZkNls4MTkyXTsJLyogRFdPUkQgMjA0OCAqLworCXU4IHJzdmQ3WzgxOTJdOwkvKiBEV09SRCAyMzA0ICovCisJdTggcnN2ZDhbODE5Ml07CS8qIERXT1JEIDI1NjAgKi8KKwl1OCByc3ZkOVs4MTkyXTsJLyogRFdPUkQgMjgxNiAqLworCXU4IHJzdmQxMFs4MTkyXTsJLyogRFdPUkQgMzA3MiAqLworCXU4IHJzdmQxMVs4MTkyXTsJLyogRFdPUkQgMzMyOCAqLworCXU4IHJzdmQxMls4MTkyXTsJLyogRFdPUkQgMzU4NCAqLworCXU4IHJzdmQxM1s4MTkyXTsJLyogRFdPUkQgMzg0MCAqLworCXU4IHJzdmQxNFs4MTkyXTsJLyogRFdPUkQgNDA5NiAqLworCXU4IHJzdmQxNVs4MTkyXTsJLyogRFdPUkQgNDM1MiAqLworCXU4IHJzdmQxNls4MTkyXTsJLyogRFdPUkQgNDYwOCAqLworCXU4IHJzdmQxN1s4MTkyXTsJLyogRFdPUkQgNDg2NCAqLworCXU4IHJzdmQxOFs4MTkyXTsJLyogRFdPUkQgNTEyMCAqLworCXU4IHJzdmQxOVs4MTkyXTsJLyogRFdPUkQgNTM3NiAqLworCXU4IHJzdmQyMFs4MTkyXTsJLyogRFdPUkQgNTYzMiAqLworCXU4IHJzdmQyMVs4MTkyXTsJLyogRFdPUkQgNTg4OCAqLworCXU4IHJzdmQyMls4MTkyXTsJLyogRFdPUkQgNjE0NCAqLworCXU4IHJzdmQyM1sxNzE1Ml1bMzJdOwkvKiBEV09SRCA2NDAwICovCit9IF9fcGFja2VkOworc3RydWN0IEJMQURFX0VOR0lORV9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzIzNTUyXTsKK307CisKKyNlbmRpZiAvKiBfX3JlZ21hcF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKQEAgLTAsMCArMSwyNyBAQAorY29uZmlnIENPTUVESQorCXRyaXN0YXRlICJEYXRhIEFjcXVpc2lvbiBzdXBwb3J0IChjb21lZGkpIgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGEgd2lkZSByYW5nZSBvZiBkYXRhIGFjcXVpc2lvbiBkZXZpY2VzCisJICBmb3IgTGludXguCisKK2NvbmZpZyBDT01FRElfUlQKKwl0cmlzdGF0ZSAiQ29tZWRpIFJlYWwtdGltZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ09NRURJICYmIFJUCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIFJlYWwgdGltZSBzdXBwb3J0IGZvciB0aGUgQ29tZWRpIGNvcmUuCisKK2NvbmZpZyBDT01FRElfUENJX0RSSVZFUlMKKwl0cmlzdGF0ZSAiQ29tZWRpIFBDSSBkcml2ZXJzIgorCWRlcGVuZHMgb24gQ09NRURJICYmIFBDSQorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBsb3RzIG9mIGNvbWVkaSBQQ0kgZHJpdmVycyB0byBiZSBidWlsdAorCitjb25maWcgQ09NRURJX1VTQl9EUklWRVJTCisJdHJpc3RhdGUgIkNvbWVkaSBVU0IgZHJpdmVycyIKKwlkZXBlbmRzIG9uIENPTUVESSAmJiBVU0IKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgbG90cyBvZiBjb21lZGkgVVNCIGRyaXZlcnMgdG8gYmUgYnVpbHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDFhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKK29iai0kKENPTkZJR19DT01FREkpICs9IGNvbWVkaS5vCitvYmotJChDT05GSUdfQ09NRURJX1JUKSArPSBjb21lZGlfcnQubworCitvYmotJChDT05GSUdfQ09NRURJKQkrPSBrY29tZWRpbGliLworb2JqLSQoQ09ORklHX0NPTUVESSkJKz0gZHJpdmVycy8KKworY29tZWRpLW9ianMgOj0JCVwKKwljb21lZGlfZm9wcy5vCVwKKwlwcm9jLm8JCVwKKwlyYW5nZS5vCQlcCisJZHJpdmVycy5vCVwKKwljb21lZGlfY29tcGF0MzIubyBcCisJY29tZWRpX2tzeW1zLm8JXAorCitjb21lZGlfcnQtb2JqcyA6PQlcCisJcnRfcGVuZF90cS5vCVwKKwlydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3ODEyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8KQEAgLTAsMCArMSwxNCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKKwktIExpbmRlbnQKKwktIHJlbW92ZSBhbGwgd3JhcHBlcnMKKwktIHJlbW92ZSB0eXBlZGVmcworCS0gYXVkaXQgdXNlcnNwYWNlIGludGVyZmFjZQorCS0gcmVzZXJ2ZSBtYWpvciBudW1iZXIKKwktIGNsZWFudXAgdGhlIGluZGl2aWR1YWwgY29tZWRpIGRyaXZlcnMgYXMgd2VsbAorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorY29weToKKwlJYW4gQWJib3R0IDxhYmJvdHRpQG1ldi5jby51az4KKwlGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisJRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQyZTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGkuaApAQCAtMCwwICsxLDkxNiBAQAorLyoKKyAgICBpbmNsdWRlL2NvbWVkaS5oIChpbnN0YWxsZWQgYXMgL3Vzci9pbmNsdWRlL2NvbWVkaS5oKQorICAgIGhlYWRlciBmaWxlIGZvciBjb21lZGkKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfQ09NRURJX0gKKyNkZWZpbmUgX0NPTUVESV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBDT01FRElfTUFKT1JWRVJTSU9OCTAKKyNkZWZpbmUgQ09NRURJX01JTk9SVkVSU0lPTgk3CisjZGVmaW5lIENPTUVESV9NSUNST1ZFUlNJT04JNzYKKyNkZWZpbmUgVkVSU0lPTgkiMC43Ljc2IgorCisvKiBjb21lZGkncyBtYWpvciBkZXZpY2UgbnVtYmVyICovCisjZGVmaW5lIENPTUVESV9NQUpPUiA5OAorCisvKgorICAgbWF4aW11bSBudW1iZXIgb2YgbWlub3IgZGV2aWNlcy4gIFRoaXMgY2FuIGJlIGluY3JlYXNlZCwgYWx0aG91Z2gKKyAgIGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBjdXJyZW50bHkgc3RhdGljYWxseSBhbGxvY2F0ZWQsIHRodXMgeW91CisgICBkb24ndCB3YW50IHRoaXMgdG8gYmUgbXVjaCBtb3JlIHRoYW4geW91IGFjdHVhbGx5IHVzZS4KKyAqLworI2RlZmluZSBDT01FRElfTkRFVklDRVMgMTYKKworLyogbnVtYmVyIG9mIGNvbmZpZyBvcHRpb25zIGluIHRoZSBjb25maWcgc3RydWN0dXJlICovCisjZGVmaW5lIENPTUVESV9OREVWQ09ORk9QVFMgMzIKKy8qbGVuZ3RoIG9mIG50aCBjaHVuayBvZiBmaXJtd2FyZSBkYXRhKi8KKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEEzX0xFTkdUSAkJMjUKKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEEyX0xFTkdUSAkJMjYKKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEExX0xFTkdUSAkJMjcKKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEEwX0xFTkdUSAkJMjgKKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfSEkJCTI5CS8qIG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBwb2ludGVyIGFkZHJlc3MgKGlmIG5lZWRlZCkgKi8KKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTE8JCTMwCS8qIGxlYXN0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgcG9pbnRlciBhZGRyZXNzICovCisjZGVmaW5lIENPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSAkJMzEJLyogdG90YWwgZGF0YSBsZW5ndGggKi8KKworLyogbWF4IGxlbmd0aCBvZiBkZXZpY2UgYW5kIGRyaXZlciBuYW1lcyAqLworI2RlZmluZSBDT01FRElfTkFNRUxFTiAyMAorCisJdHlwZWRlZiB1bnNpZ25lZCBpbnQgbHNhbXBsX3Q7CisJdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBzYW1wbF90OworCisvKiBwYWNrcyBhbmQgdW5wYWNrcyBhIGNoYW5uZWwvcmFuZ2UgbnVtYmVyICovCisKKyNkZWZpbmUgQ1JfUEFDSyhjaGFuLCBybmcsIGFyZWYpCQkoKCgoYXJlZikmMHgzKTw8MjQpIHwgKCgocm5nKSYweGZmKTw8MTYpIHwgKGNoYW4pKQorI2RlZmluZSBDUl9QQUNLX0ZMQUdTKGNoYW4sIHJhbmdlLCBhcmVmLCBmbGFncykJKENSX1BBQ0soY2hhbiwgcmFuZ2UsIGFyZWYpIHwgKChmbGFncykgJiBDUl9GTEFHU19NQVNLKSkKKworI2RlZmluZSBDUl9DSEFOKGEpCSgoYSkmMHhmZmZmKQorI2RlZmluZSBDUl9SQU5HRShhKQkoKChhKT4+MTYpJjB4ZmYpCisjZGVmaW5lIENSX0FSRUYoYSkJKCgoYSk+PjI0KSYweDAzKQorCisjZGVmaW5lIENSX0ZMQUdTX01BU0sJMHhmYzAwMDAwMAorI2RlZmluZSBDUl9BTFRfRklMVEVSCSgxPDwyNikKKyNkZWZpbmUgQ1JfRElUSEVSCUNSX0FMVF9GSUxURVIKKyNkZWZpbmUgQ1JfREVHTElUQ0gJQ1JfQUxUX0ZJTFRFUgorI2RlZmluZSBDUl9BTFRfU09VUkNFCSgxPDwyNykKKyNkZWZpbmUgQ1JfRURHRQkJKDE8PDMwKQorI2RlZmluZSBDUl9JTlZFUlQJKDE8PDMxKQorCisjZGVmaW5lIEFSRUZfR1JPVU5ECTB4MDAJLyogYW5hbG9nIHJlZiA9IGFuYWxvZyBncm91bmQgKi8KKyNkZWZpbmUgQVJFRl9DT01NT04JMHgwMQkvKiBhbmFsb2cgcmVmID0gYW5hbG9nIGNvbW1vbiAqLworI2RlZmluZSBBUkVGX0RJRkYJMHgwMgkvKiBhbmFsb2cgcmVmID0gZGlmZmVyZW50aWFsICovCisjZGVmaW5lIEFSRUZfT1RIRVIJMHgwMwkvKiBhbmFsb2cgcmVmID0gb3RoZXIgKHVuZGVmaW5lZCkgKi8KKworLyogY291bnRlcnMgLS0gdGhlc2UgYXJlIGFyYml0cmFyeSB2YWx1ZXMgKi8KKyNkZWZpbmUgR1BDVF9SRVNFVAkJMHgwMDAxCisjZGVmaW5lIEdQQ1RfU0VUX1NPVVJDRQkJMHgwMDAyCisjZGVmaW5lIEdQQ1RfU0VUX0dBVEUJCTB4MDAwNAorI2RlZmluZSBHUENUX1NFVF9ESVJFQ1RJT04JMHgwMDA4CisjZGVmaW5lIEdQQ1RfU0VUX09QRVJBVElPTgkweDAwMTAKKyNkZWZpbmUgR1BDVF9BUk0JCTB4MDAyMAorI2RlZmluZSBHUENUX0RJU0FSTQkJMHgwMDQwCisjZGVmaW5lIEdQQ1RfR0VUX0lOVF9DTEtfRlJRCTB4MDA4MAorCisjZGVmaW5lIEdQQ1RfSU5UX0NMT0NLCQkweDAwMDEKKyNkZWZpbmUgR1BDVF9FWFRfUElOCQkweDAwMDIKKyNkZWZpbmUgR1BDVF9OT19HQVRFCQkweDAwMDQKKyNkZWZpbmUgR1BDVF9VUAkJCTB4MDAwOAorI2RlZmluZSBHUENUX0RPV04JCTB4MDAxMAorI2RlZmluZSBHUENUX0hXVUQJCTB4MDAyMAorI2RlZmluZSBHUENUX1NJTVBMRV9FVkVOVAkweDAwNDAKKyNkZWZpbmUgR1BDVF9TSU5HTEVfUEVSSU9ECTB4MDA4MAorI2RlZmluZSBHUENUX1NJTkdMRV9QVwkJMHgwMTAwCisjZGVmaW5lIEdQQ1RfQ09OVF9QVUxTRV9PVVQJMHgwMjAwCisjZGVmaW5lIEdQQ1RfU0lOR0xFX1BVTFNFX09VVAkweDA0MDAKKworLyogaW5zdHJ1Y3Rpb25zICovCisKKyNkZWZpbmUgSU5TTl9NQVNLX1dSSVRFCQkweDgwMDAwMDAKKyNkZWZpbmUgSU5TTl9NQVNLX1JFQUQJCTB4NDAwMDAwMAorI2RlZmluZSBJTlNOX01BU0tfU1BFQ0lBTAkweDIwMDAwMDAKKworI2RlZmluZSBJTlNOX1JFQUQJCSgwIHwgSU5TTl9NQVNLX1JFQUQpCisjZGVmaW5lIElOU05fV1JJVEUJCSgxIHwgSU5TTl9NQVNLX1dSSVRFKQorI2RlZmluZSBJTlNOX0JJVFMJCSgyIHwgSU5TTl9NQVNLX1JFQUR8SU5TTl9NQVNLX1dSSVRFKQorI2RlZmluZSBJTlNOX0NPTkZJRwkJKDMgfCBJTlNOX01BU0tfUkVBRHxJTlNOX01BU0tfV1JJVEUpCisjZGVmaW5lIElOU05fR1RPRAkJKDQgfCBJTlNOX01BU0tfUkVBRHxJTlNOX01BU0tfU1BFQ0lBTCkKKyNkZWZpbmUgSU5TTl9XQUlUCQkoNSB8IElOU05fTUFTS19XUklURXxJTlNOX01BU0tfU1BFQ0lBTCkKKyNkZWZpbmUgSU5TTl9JTlRUUklHCQkoNiB8IElOU05fTUFTS19XUklURXxJTlNOX01BU0tfU1BFQ0lBTCkKKworLyogdHJpZ2dlciBmbGFncyAqLworLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgaW4gY29tZWRpX3RyaWcgc3RydWN0dXJlcyAqLworCisjZGVmaW5lIFRSSUdfQk9HVVMJMHgwMDAxCS8qIGRvIHRoZSBtb3Rpb25zICovCisjZGVmaW5lIFRSSUdfRElUSEVSCTB4MDAwMgkvKiBlbmFibGUgZGl0aGVyaW5nICovCisjZGVmaW5lIFRSSUdfREVHTElUQ0gJMHgwMDA0CS8qIGVuYWJsZSBkZWdsaXRjaGluZyAqLworLyojZGVmaW5lIFRSSUdfUlQgICAgICAgMHgwMDA4ICovCS8qIHBlcmZvcm0gb3AgaW4gcmVhbCB0aW1lICovCisjZGVmaW5lIFRSSUdfQ09ORklHCTB4MDAxMAkvKiBwZXJmb3JtIGNvbmZpZ3VyYXRpb24sIG5vdCB0cmlnZ2VyaW5nICovCisjZGVmaW5lIFRSSUdfV0FLRV9FT1MJMHgwMDIwCS8qIHdha2UgdXAgb24gZW5kLW9mLXNjYW4gZXZlbnRzICovCisvKiNkZWZpbmUgVFJJR19XUklURSAgICAweDAwNDAqLwkvKiB3cml0ZSB0byBiaWRpcmVjdGlvbmFsIGRldmljZXMgKi8KKworLyogY29tbWFuZCBmbGFncyAqLworLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgaW4gY29tZWRpX2NtZCBzdHJ1Y3R1cmVzICovCisKKyNkZWZpbmUgQ01ERl9QUklPUklUWQkJMHgwMDAwMDAwOAkvKiB0cnkgdG8gdXNlIGEgcmVhbC10aW1lIGludGVycnVwdCB3aGlsZSBwZXJmb3JtaW5nIGNvbW1hbmQgKi8KKworI2RlZmluZSBUUklHX1JUCQlDTURGX1BSSU9SSVRZCS8qIGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbiAqLworCisjZGVmaW5lIENNREZfV1JJVEUJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFJJR19XUklURQlDTURGX1dSSVRFCS8qIGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbiAqLworCisjZGVmaW5lIENNREZfUkFXREFUQQkJMHgwMDAwMDA4MAorCisjZGVmaW5lIENPTUVESV9FVl9TVEFSVAkJMHgwMDA0MDAwMAorI2RlZmluZSBDT01FRElfRVZfU0NBTl9CRUdJTgkweDAwMDgwMDAwCisjZGVmaW5lIENPTUVESV9FVl9DT05WRVJUCTB4MDAxMDAwMDAKKyNkZWZpbmUgQ09NRURJX0VWX1NDQU5fRU5ECTB4MDAyMDAwMDAKKyNkZWZpbmUgQ09NRURJX0VWX1NUT1AJCTB4MDA0MDAwMDAKKworI2RlZmluZSBUUklHX1JPVU5EX01BU0sJCTB4MDAwMzAwMDAKKyNkZWZpbmUgVFJJR19ST1VORF9ORUFSRVNUCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFJJR19ST1VORF9ET1dOCQkweDAwMDEwMDAwCisjZGVmaW5lIFRSSUdfUk9VTkRfVVAJCTB4MDAwMjAwMDAKKyNkZWZpbmUgVFJJR19ST1VORF9VUF9ORVhUCTB4MDAwMzAwMDAKKworLyogdHJpZ2dlciBzb3VyY2VzICovCisKKyNkZWZpbmUgVFJJR19BTlkJMHhmZmZmZmZmZgorI2RlZmluZSBUUklHX0lOVkFMSUQJMHgwMDAwMDAwMAorCisjZGVmaW5lIFRSSUdfTk9ORQkweDAwMDAwMDAxCS8qIG5ldmVyIHRyaWdnZXIgKi8KKyNkZWZpbmUgVFJJR19OT1cJMHgwMDAwMDAwMgkvKiB0cmlnZ2VyIG5vdyArIE4gbnMgKi8KKyNkZWZpbmUgVFJJR19GT0xMT1cJMHgwMDAwMDAwNAkvKiB0cmlnZ2VyIG9uIG5leHQgbG93ZXIgbGV2ZWwgdHJpZyAqLworI2RlZmluZSBUUklHX1RJTUUJMHgwMDAwMDAwOAkvKiB0cmlnZ2VyIGF0IHRpbWUgTiBucyAqLworI2RlZmluZSBUUklHX1RJTUVSCTB4MDAwMDAwMTAJLyogdHJpZ2dlciBhdCByYXRlIE4gbnMgKi8KKyNkZWZpbmUgVFJJR19DT1VOVAkweDAwMDAwMDIwCS8qIHRyaWdnZXIgd2hlbiBjb3VudCByZWFjaGVzIE4gKi8KKyNkZWZpbmUgVFJJR19FWFQJMHgwMDAwMDA0MAkvKiB0cmlnZ2VyIG9uIGV4dGVybmFsIHNpZ25hbCBOICovCisjZGVmaW5lIFRSSUdfSU5UCTB4MDAwMDAwODAJLyogdHJpZ2dlciBvbiBjb21lZGktaW50ZXJuYWwgc2lnbmFsIE4gKi8KKyNkZWZpbmUgVFJJR19PVEhFUgkweDAwMDAwMTAwCS8qIGRyaXZlciBkZWZpbmVkICovCisKKy8qIHN1YmRldmljZSBmbGFncyAqLworCisjZGVmaW5lIFNERl9CVVNZCTB4MDAwMQkvKiBkZXZpY2UgaXMgYnVzeSAqLworI2RlZmluZSBTREZfQlVTWV9PV05FUgkweDAwMDIJLyogZGV2aWNlIGlzIGJ1c3kgd2l0aCB5b3VyIGpvYiAqLworI2RlZmluZSBTREZfTE9DS0VECTB4MDAwNAkvKiBzdWJkZXZpY2UgaXMgbG9ja2VkICovCisjZGVmaW5lIFNERl9MT0NLX09XTkVSCTB4MDAwOAkvKiB5b3Ugb3duIGxvY2sgKi8KKyNkZWZpbmUgU0RGX01BWERBVEEJMHgwMDEwCS8qIG1heGRhdGEgZGVwZW5kcyBvbiBjaGFubmVsICovCisjZGVmaW5lIFNERl9GTEFHUwkweDAwMjAJLyogZmxhZ3MgZGVwZW5kIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0RGX1JBTkdFVFlQRQkweDAwNDAJLyogcmFuZ2UgdHlwZSBkZXBlbmRzIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0RGX01PREUwCTB4MDA4MAkvKiBjYW4gZG8gbW9kZSAwICovCisjZGVmaW5lIFNERl9NT0RFMQkweDAxMDAJLyogY2FuIGRvIG1vZGUgMSAqLworI2RlZmluZSBTREZfTU9ERTIJMHgwMjAwCS8qIGNhbiBkbyBtb2RlIDIgKi8KKyNkZWZpbmUgU0RGX01PREUzCTB4MDQwMAkvKiBjYW4gZG8gbW9kZSAzICovCisjZGVmaW5lIFNERl9NT0RFNAkweDA4MDAJLyogY2FuIGRvIG1vZGUgNCAqLworI2RlZmluZSBTREZfQ01ECQkweDEwMDAJLyogY2FuIGRvIGNvbW1hbmRzIChkZXByZWNhdGVkKSAqLworI2RlZmluZSBTREZfU09GVF9DQUxJQlJBVEVECTB4MjAwMAkvKiBzdWJkZXZpY2UgdXNlcyBzb2Z0d2FyZSBjYWxpYnJhdGlvbiAqLworI2RlZmluZSBTREZfQ01EX1dSSVRFCQkweDQwMDAJLyogY2FuIGRvIG91dHB1dCBjb21tYW5kcyAqLworI2RlZmluZSBTREZfQ01EX1JFQUQJCTB4ODAwMAkvKiBjYW4gZG8gaW5wdXQgY29tbWFuZHMgKi8KKworI2RlZmluZSBTREZfUkVBREFCTEUJMHgwMDAxMDAwMAkvKiBzdWJkZXZpY2UgY2FuIGJlIHJlYWQgKGUuZy4gYW5hbG9nIGlucHV0KSAqLworI2RlZmluZSBTREZfV1JJVEFCTEUJMHgwMDAyMDAwMAkvKiBzdWJkZXZpY2UgY2FuIGJlIHdyaXR0ZW4gKGUuZy4gYW5hbG9nIG91dHB1dCkgKi8KKyNkZWZpbmUgU0RGX1dSSVRFQUJMRQlTREZfV1JJVEFCTEUJLyogc3BlbGxpbmcgZXJyb3IgaW4gQVBJICovCisjZGVmaW5lIFNERl9JTlRFUk5BTAkweDAwMDQwMDAwCS8qIHN1YmRldmljZSBkb2VzIG5vdCBoYXZlIGV4dGVybmFsbHkgdmlzaWJsZSBsaW5lcyAqLworI2RlZmluZSBTREZfUlQJCTB4MDAwODAwMDAJLyogREVQUkVDQVRFRDogc3ViZGV2aWNlIGlzIFJUIGNhcGFibGUgKi8KKyNkZWZpbmUgU0RGX0dST1VORAkweDAwMTAwMDAwCS8qIGNhbiBkbyBhcmVmPWdyb3VuZCAqLworI2RlZmluZSBTREZfQ09NTU9OCTB4MDAyMDAwMDAJLyogY2FuIGRvIGFyZWY9Y29tbW9uICovCisjZGVmaW5lIFNERl9ESUZGCTB4MDA0MDAwMDAJLyogY2FuIGRvIGFyZWY9ZGlmZiAqLworI2RlZmluZSBTREZfT1RIRVIJMHgwMDgwMDAwMAkvKiBjYW4gZG8gYXJlZj1vdGhlciAqLworI2RlZmluZSBTREZfRElUSEVSCTB4MDEwMDAwMDAJLyogY2FuIGRvIGRpdGhlcmluZyAqLworI2RlZmluZSBTREZfREVHTElUQ0gJMHgwMjAwMDAwMAkvKiBjYW4gZG8gZGVnbGl0Y2hpbmcgKi8KKyNkZWZpbmUgU0RGX01NQVAJMHgwNDAwMDAwMAkvKiBjYW4gZG8gbW1hcCgpICovCisjZGVmaW5lIFNERl9SVU5OSU5HCTB4MDgwMDAwMDAJLyogc3ViZGV2aWNlIGlzIGFjcXVpcmluZyBkYXRhICovCisjZGVmaW5lIFNERl9MU0FNUEwJMHgxMDAwMDAwMAkvKiBzdWJkZXZpY2UgdXNlcyAzMi1iaXQgc2FtcGxlcyAqLworI2RlZmluZSBTREZfUEFDS0VECTB4MjAwMDAwMDAJLyogc3ViZGV2aWNlIGNhbiBkbyBwYWNrZWQgRElPICovCisvKiByZSByZWN5bGUgdGhlc2UgZmxhZ3MgZm9yIFBXTSAqLworI2RlZmluZSBTREZfUFdNX0NPVU5URVIgU0RGX01PREUwICAgICAgIC8qIFBXTSBjYW4gYXV0b21hdGljYWxseSBzd2l0Y2ggb2ZmICovCisjZGVmaW5lIFNERl9QV01fSEJSSURHRSBTREZfTU9ERTEgICAgICAgLyogUFdNIGlzIHNpZ25lZCAoSC1icmlkZ2UpICovCisKKworCisvKiBzdWJkZXZpY2UgdHlwZXMgKi8KKworZW51bSBjb21lZGlfc3ViZGV2aWNlX3R5cGUgeworCUNPTUVESV9TVUJEX1VOVVNFRCwJLyogdW51c2VkIGJ5IGRyaXZlciAqLworCUNPTUVESV9TVUJEX0FJLAkvKiBhbmFsb2cgaW5wdXQgKi8KKwlDT01FRElfU1VCRF9BTywJLyogYW5hbG9nIG91dHB1dCAqLworCUNPTUVESV9TVUJEX0RJLAkvKiBkaWdpdGFsIGlucHV0ICovCisJQ09NRURJX1NVQkRfRE8sCS8qIGRpZ2l0YWwgb3V0cHV0ICovCisJQ09NRURJX1NVQkRfRElPLAkvKiBkaWdpdGFsIGlucHV0L291dHB1dCAqLworCUNPTUVESV9TVUJEX0NPVU5URVIsCS8qIGNvdW50ZXIgKi8KKwlDT01FRElfU1VCRF9USU1FUiwJLyogdGltZXIgKi8KKwlDT01FRElfU1VCRF9NRU1PUlksCS8qIG1lbW9yeSwgRUVQUk9NLCBEUFJBTSAqLworCUNPTUVESV9TVUJEX0NBTElCLAkvKiBjYWxpYnJhdGlvbiBEQUNzICovCisJQ09NRURJX1NVQkRfUFJPQywJLyogcHJvY2Vzc29yLCBEU1AgKi8KKwlDT01FRElfU1VCRF9TRVJJQUwsCS8qIHNlcmlhbCBJTyAqLworCUNPTUVESV9TVUJEX1BXTSAgICAgICAgIC8qIFBXTSAqLworfTsKKworLyogY29uZmlndXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KKworZW51bSBjb25maWd1cmF0aW9uX2lkcyB7CisJSU5TTl9DT05GSUdfRElPX0lOUFVUID0gMCwKKwlJTlNOX0NPTkZJR19ESU9fT1VUUFVUID0gMSwKKwlJTlNOX0NPTkZJR19ESU9fT1BFTkRSQUlOID0gMiwKKwlJTlNOX0NPTkZJR19BTkFMT0dfVFJJRyA9IDE2LAorLyoJSU5TTl9DT05GSUdfV0FWRUZPUk0gPSAxNywgKi8KKy8qCUlOU05fQ09ORklHX1RSSUcgPSAxOCwgKi8KKy8qCUlOU05fQ09ORklHX0NPVU5URVIgPSAxOSwgKi8KKwlJTlNOX0NPTkZJR19BTFRfU09VUkNFID0gMjAsCisJSU5TTl9DT05GSUdfRElHSVRBTF9UUklHID0gMjEsCisJSU5TTl9DT05GSUdfQkxPQ0tfU0laRSA9IDIyLAorCUlOU05fQ09ORklHX1RJTUVSXzEgPSAyMywKKwlJTlNOX0NPTkZJR19GSUxURVIgPSAyNCwKKwlJTlNOX0NPTkZJR19DSEFOR0VfTk9USUZZID0gMjUsCisKKwkgLypBTFBIQSovIElOU05fQ09ORklHX1NFUklBTF9DTE9DSyA9IDI2LAorCUlOU05fQ09ORklHX0JJRElSRUNUSU9OQUxfREFUQSA9IDI3LAorCUlOU05fQ09ORklHX0RJT19RVUVSWSA9IDI4LAorCUlOU05fQ09ORklHX1BXTV9PVVRQVVQgPSAyOSwKKwlJTlNOX0NPTkZJR19HRVRfUFdNX09VVFBVVCA9IDMwLAorCUlOU05fQ09ORklHX0FSTSA9IDMxLAorCUlOU05fQ09ORklHX0RJU0FSTSA9IDMyLAorCUlOU05fQ09ORklHX0dFVF9DT1VOVEVSX1NUQVRVUyA9IDMzLAorCUlOU05fQ09ORklHX1JFU0VUID0gMzQsCisJSU5TTl9DT05GSUdfR1BDVF9TSU5HTEVfUFVMU0VfR0VORVJBVE9SID0gMTAwMSwJLyogVXNlIENUUiBhcyBzaW5nbGUgcHVsc2VnZW5lcmF0b3IgKi8KKwlJTlNOX0NPTkZJR19HUENUX1BVTFNFX1RSQUlOX0dFTkVSQVRPUiA9IDEwMDIsCS8qIFVzZSBDVFIgYXMgcHVsc2V0cmFpbmdlbmVyYXRvciAqLworCUlOU05fQ09ORklHX0dQQ1RfUVVBRFJBVFVSRV9FTkNPREVSID0gMTAwMywJLyogVXNlIHRoZSBjb3VudGVyIGFzIGVuY29kZXIgKi8KKwlJTlNOX0NPTkZJR19TRVRfR0FURV9TUkMgPSAyMDAxLAkvKiBTZXQgZ2F0ZSBzb3VyY2UgKi8KKwlJTlNOX0NPTkZJR19HRVRfR0FURV9TUkMgPSAyMDAyLAkvKiBHZXQgZ2F0ZSBzb3VyY2UgKi8KKwlJTlNOX0NPTkZJR19TRVRfQ0xPQ0tfU1JDID0gMjAwMywJLyogU2V0IG1hc3RlciBjbG9jayBzb3VyY2UgKi8KKwlJTlNOX0NPTkZJR19HRVRfQ0xPQ0tfU1JDID0gMjAwNCwJLyogR2V0IG1hc3RlciBjbG9jayBzb3VyY2UgKi8KKwlJTlNOX0NPTkZJR19TRVRfT1RIRVJfU1JDID0gMjAwNSwJLyogU2V0IG90aGVyIHNvdXJjZSAqLworLyoJSU5TTl9DT05GSUdfR0VUX09USEVSX1NSQyA9IDIwMDYsKi8JLyogR2V0IG90aGVyIHNvdXJjZSAqLworCUlOU05fQ09ORklHX0dFVF9IQVJEV0FSRV9CVUZGRVJfU0laRSwJLyogR2V0IHNpemUgaW4gYnl0ZXMgb2YKKwkJCQkJCSAgc3ViZGV2aWNlJ3Mgb24tYm9hcmQgZmlmb3MKKwkJCQkJCSAgdXNlZCBkdXJpbmcgc3RyZWFtaW5nCisJCQkJCQkgIGlucHV0L291dHB1dCAqLworCUlOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUgPSA0MDk3LAorCUlOU05fQ09ORklHXzgyNTRfU0VUX01PREUgPSBJTlNOX0NPTkZJR19TRVRfQ09VTlRFUl9NT0RFLAkvKiBkZXByZWNhdGVkICovCisJSU5TTl9DT05GSUdfODI1NF9SRUFEX1NUQVRVUyA9IDQwOTgsCisJSU5TTl9DT05GSUdfU0VUX1JPVVRJTkcgPSA0MDk5LAorCUlOU05fQ09ORklHX0dFVF9ST1VUSU5HID0gNDEwOSwKKy8qIFBXTSAqLworCUlOU05fQ09ORklHX1BXTV9TRVRfUEVSSU9EID0gNTAwMCwgICAvKiBzZXRzIGZyZXF1ZW5jeSAqLworCUlOU05fQ09ORklHX1BXTV9HRVRfUEVSSU9EID0gNTAwMSwgICAvKiBnZXRzIGZyZXF1ZW5jeSAqLworCUlOU05fQ09ORklHX0dFVF9QV01fU1RBVFVTID0gNTAwMiwgICAgICAgICAgLyogaXMgaXQgcnVubmluZz8gKi8KKwlJTlNOX0NPTkZJR19QV01fU0VUX0hfQlJJREdFID0gNTAwMywgLyogc2V0cyBIIGJyaWRnZTogZHV0eSBjeWNsZSBhbmQgc2lnbiBiaXQgZm9yIGEgcmVsYXkgIGF0IHRoZSBzYW1lIHRpbWUqLworCUlOU05fQ09ORklHX1BXTV9HRVRfSF9CUklER0UgPSA1MDA0ICAvKiBnZXRzIEggYnJpZGdlIGRhdGE6IGR1dHkgY3ljbGUgYW5kIHRoZSBzaWduIGJpdCAqLworfTsKKworZW51bSBjb21lZGlfaW9fZGlyZWN0aW9uIHsKKwlDT01FRElfSU5QVVQgPSAwLAorCUNPTUVESV9PVVRQVVQgPSAxLAorCUNPTUVESV9PUEVORFJBSU4gPSAyCit9OworCitlbnVtIGNvbWVkaV9zdXBwb3J0X2xldmVsIHsKKwlDT01FRElfVU5LTk9XTl9TVVBQT1JUID0gMCwKKwlDT01FRElfU1VQUE9SVEVELAorCUNPTUVESV9VTlNVUFBPUlRFRAorfTsKKworLyogaW9jdGxzICovCisKKyNkZWZpbmUgQ0lPICdkJworI2RlZmluZSBDT01FRElfREVWQ09ORklHIF9JT1coQ0lPLCAwLCBjb21lZGlfZGV2Y29uZmlnKQorI2RlZmluZSBDT01FRElfREVWSU5GTyBfSU9SKENJTywgMSwgY29tZWRpX2RldmluZm8pCisjZGVmaW5lIENPTUVESV9TVUJESU5GTyBfSU9SKENJTywgMiwgY29tZWRpX3N1YmRpbmZvKQorI2RlZmluZSBDT01FRElfQ0hBTklORk8gX0lPUihDSU8sIDMsIGNvbWVkaV9jaGFuaW5mbykKKyNkZWZpbmUgQ09NRURJX1RSSUcgX0lPV1IoQ0lPLCA0LCBjb21lZGlfdHJpZykKKyNkZWZpbmUgQ09NRURJX0xPQ0sgX0lPKENJTywgNSkKKyNkZWZpbmUgQ09NRURJX1VOTE9DSyBfSU8oQ0lPLCA2KQorI2RlZmluZSBDT01FRElfQ0FOQ0VMIF9JTyhDSU8sIDcpCisjZGVmaW5lIENPTUVESV9SQU5HRUlORk8gX0lPUihDSU8sIDgsIGNvbWVkaV9yYW5nZWluZm8pCisjZGVmaW5lIENPTUVESV9DTUQgX0lPUihDSU8sIDksIGNvbWVkaV9jbWQpCisjZGVmaW5lIENPTUVESV9DTURURVNUIF9JT1IoQ0lPLCAxMCwgY29tZWRpX2NtZCkKKyNkZWZpbmUgQ09NRURJX0lOU05MSVNUIF9JT1IoQ0lPLCAxMSwgY29tZWRpX2luc25saXN0KQorI2RlZmluZSBDT01FRElfSU5TTiBfSU9SKENJTywgMTIsIGNvbWVkaV9pbnNuKQorI2RlZmluZSBDT01FRElfQlVGQ09ORklHIF9JT1IoQ0lPLCAxMywgY29tZWRpX2J1ZmNvbmZpZykKKyNkZWZpbmUgQ09NRURJX0JVRklORk8gX0lPV1IoQ0lPLCAxNCwgY29tZWRpX2J1ZmluZm8pCisjZGVmaW5lIENPTUVESV9QT0xMIF9JTyhDSU8sIDE1KQorCisvKiBzdHJ1Y3R1cmVzICovCisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV90cmlnX3N0cnVjdCBjb21lZGlfdHJpZzsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9jbWRfc3RydWN0IGNvbWVkaV9jbWQ7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfaW5zbl9zdHJ1Y3QgY29tZWRpX2luc247Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfaW5zbmxpc3Rfc3RydWN0IGNvbWVkaV9pbnNubGlzdDsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9jaGFuaW5mb19zdHJ1Y3QgY29tZWRpX2NoYW5pbmZvOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX3N1YmRpbmZvX3N0cnVjdCBjb21lZGlfc3ViZGluZm87Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfZGV2aW5mb19zdHJ1Y3QgY29tZWRpX2RldmluZm87Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnX3N0cnVjdCBjb21lZGlfZGV2Y29uZmlnOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX3JhbmdlaW5mb19zdHJ1Y3QgY29tZWRpX3JhbmdlaW5mbzsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9rcmFuZ2Vfc3RydWN0IGNvbWVkaV9rcmFuZ2U7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfYnVmY29uZmlnX3N0cnVjdCBjb21lZGlfYnVmY29uZmlnOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2J1ZmluZm9fc3RydWN0IGNvbWVkaV9idWZpbmZvOworCitzdHJ1Y3QgY29tZWRpX3RyaWdfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2OwkvKiBzdWJkZXZpY2UgKi8KKwl1bnNpZ25lZCBpbnQgbW9kZTsJLyogbW9kZSAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbl9jaGFuOwkvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0OwkvKiBjaGFubmVsL3JhbmdlIGxpc3QgKi8KKwlzYW1wbF90ICpkYXRhOwkvKiBkYXRhIGxpc3QsIHNpemUgZGVwZW5kcyBvbiBzdWJkIGZsYWdzICovCisJdW5zaWduZWQgaW50IG47CS8qIG51bWJlciBvZiBzY2FucyAqLworCXVuc2lnbmVkIGludCB0cmlnc3JjOworCXVuc2lnbmVkIGludCB0cmlndmFyOworCXVuc2lnbmVkIGludCB0cmlndmFyMTsKKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47CisJdW5zaWduZWQgaW50IHVudXNlZFszXTsKK307CisKK3N0cnVjdCBjb21lZGlfaW5zbl9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBpbnNuOworCXVuc2lnbmVkIGludCBuOworCWxzYW1wbF90ICpkYXRhOworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJdW5zaWduZWQgaW50IGNoYW5zcGVjOworCXVuc2lnbmVkIGludCB1bnVzZWRbM107Cit9OworCitzdHJ1Y3QgY29tZWRpX2luc25saXN0X3N0cnVjdCB7CisJdW5zaWduZWQgaW50IG5faW5zbnM7CisJY29tZWRpX2luc24gKmluc25zOworfTsKKworc3RydWN0IGNvbWVkaV9jbWRfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2OworCXVuc2lnbmVkIGludCBmbGFnczsKKworCXVuc2lnbmVkIGludCBzdGFydF9zcmM7CisJdW5zaWduZWQgaW50IHN0YXJ0X2FyZzsKKworCXVuc2lnbmVkIGludCBzY2FuX2JlZ2luX3NyYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9iZWdpbl9hcmc7CisKKwl1bnNpZ25lZCBpbnQgY29udmVydF9zcmM7CisJdW5zaWduZWQgaW50IGNvbnZlcnRfYXJnOworCisJdW5zaWduZWQgaW50IHNjYW5fZW5kX3NyYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9lbmRfYXJnOworCisJdW5zaWduZWQgaW50IHN0b3Bfc3JjOworCXVuc2lnbmVkIGludCBzdG9wX2FyZzsKKworCXVuc2lnbmVkIGludCAqY2hhbmxpc3Q7CS8qIGNoYW5uZWwvcmFuZ2UgbGlzdCAqLworCXVuc2lnbmVkIGludCBjaGFubGlzdF9sZW47CisKKwlzYW1wbF90ICpkYXRhOwkvKiBkYXRhIGxpc3QsIHNpemUgZGVwZW5kcyBvbiBzdWJkIGZsYWdzICovCisJdW5zaWduZWQgaW50IGRhdGFfbGVuOworfTsKKworc3RydWN0IGNvbWVkaV9jaGFuaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJbHNhbXBsX3QgKm1heGRhdGFfbGlzdDsKKwl1bnNpZ25lZCBpbnQgKmZsYWdsaXN0OworCXVuc2lnbmVkIGludCAqcmFuZ2VsaXN0OworCXVuc2lnbmVkIGludCB1bnVzZWRbNF07Cit9OworCitzdHJ1Y3QgY29tZWRpX3JhbmdlaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCByYW5nZV90eXBlOworCXZvaWQgKnJhbmdlX3B0cjsKK307CisKK3N0cnVjdCBjb21lZGlfa3JhbmdlX3N0cnVjdCB7CisJaW50IG1pbjsJLyogZml4ZWQgcG9pbnQsIG11bHRpcGx5IGJ5IDFlLTYgKi8KKwlpbnQgbWF4OwkvKiBmaXhlZCBwb2ludCwgbXVsdGlwbHkgYnkgMWUtNiAqLworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKworc3RydWN0IGNvbWVkaV9zdWJkaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBuX2NoYW47CisJdW5zaWduZWQgaW50IHN1YmRfZmxhZ3M7CisJdW5zaWduZWQgaW50IHRpbWVyX3R5cGU7CisJdW5zaWduZWQgaW50IGxlbl9jaGFubGlzdDsKKwlsc2FtcGxfdCBtYXhkYXRhOworCXVuc2lnbmVkIGludCBmbGFnczsJLyogY2hhbm5lbCBmbGFncyAqLworCXVuc2lnbmVkIGludCByYW5nZV90eXBlOwkvKiBsb29rdXAgaW4ga2VybmVsICovCisJdW5zaWduZWQgaW50IHNldHRsaW5nX3RpbWVfMDsKKwl1bnNpZ25lZCBpbnNuX2JpdHNfc3VwcG9ydDsJLyogc2VlIHN1cHBvcnRfbGV2ZWwgZW51bSBmb3IgdmFsdWVzKi8KKwl1bnNpZ25lZCBpbnQgdW51c2VkWzhdOworfTsKKworc3RydWN0IGNvbWVkaV9kZXZpbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHZlcnNpb25fY29kZTsKKwl1bnNpZ25lZCBpbnQgbl9zdWJkZXZzOworCWNoYXIgZHJpdmVyX25hbWVbQ09NRURJX05BTUVMRU5dOworCWNoYXIgYm9hcmRfbmFtZVtDT01FRElfTkFNRUxFTl07CisJaW50IHJlYWRfc3ViZGV2aWNlOworCWludCB3cml0ZV9zdWJkZXZpY2U7CisJaW50IHVudXNlZFszMF07Cit9OworCitzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZ19zdHJ1Y3QgeworCWNoYXIgYm9hcmRfbmFtZVtDT01FRElfTkFNRUxFTl07CisJaW50IG9wdGlvbnNbQ09NRURJX05ERVZDT05GT1BUU107Cit9OworCitzdHJ1Y3QgY29tZWRpX2J1ZmNvbmZpZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJdW5zaWduZWQgaW50IG1heGltdW1fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXVuc2lnbmVkIGludCB1bnVzZWRbNF07Cit9OworCitzdHJ1Y3QgY29tZWRpX2J1ZmluZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCBieXRlc19yZWFkOworCisJdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9wdHI7CisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX3B0cjsKKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2NvdW50OworCXVuc2lnbmVkIGludCBidWZfcmVhZF9jb3VudDsKKworCXVuc2lnbmVkIGludCBieXRlc193cml0dGVuOworCisJdW5zaWduZWQgaW50IHVudXNlZFs0XTsKK307CisKKy8qIHJhbmdlIHN0dWZmICovCisKKyNkZWZpbmUgX19SQU5HRShhLCBiKQkoKCgoYSkmMHhmZmZmKTw8MTYpfCgoYikmMHhmZmZmKSkKKworI2RlZmluZSBSQU5HRV9PRkZTRVQoYSkJCSgoKGEpPj4xNikmMHhmZmZmKQorI2RlZmluZSBSQU5HRV9MRU5HVEgoYikJCSgoYikmMHhmZmZmKQorCisjZGVmaW5lIFJGX1VOSVQoZmxhZ3MpCQkoKGZsYWdzKSYweGZmKQorI2RlZmluZSBSRl9FWFRFUk5BTAkJKDE8PDgpCisKKyNkZWZpbmUgVU5JVF92b2x0CQkwCisjZGVmaW5lIFVOSVRfbUEJCQkxCisjZGVmaW5lIFVOSVRfbm9uZQkJMgorCisjZGVmaW5lIENPTUVESV9NSU5fU1BFRUQJKCh1bnNpZ25lZCBpbnQpMHhmZmZmZmZmZikKKworLyogY2FsbGJhY2sgc3R1ZmYgKi8KKy8qIG9ubHkgcmVsZXZhbnQgdG8ga2VybmVsIG1vZHVsZXMuICovCisKKyNkZWZpbmUgQ09NRURJX0NCX0VPUwkJMQkvKiBlbmQgb2Ygc2NhbiAqLworI2RlZmluZSBDT01FRElfQ0JfRU9BCQkyCS8qIGVuZCBvZiBhY3F1aXNpdGlvbiAqLworI2RlZmluZSBDT01FRElfQ0JfQkxPQ0sJCTQJLyogREVQUkVDQVRFRDogY29udmVuaWVudCBibG9jayBzaXplICovCisjZGVmaW5lIENPTUVESV9DQl9FT0JVRgkJOAkvKiBERVBSRUNBVEVEOiBlbmQgb2YgYnVmZmVyICovCisjZGVmaW5lIENPTUVESV9DQl9FUlJPUgkJMTYJLyogY2FyZCBlcnJvciBkdXJpbmcgYWNxdWlzaXRpb24gKi8KKyNkZWZpbmUgQ09NRURJX0NCX09WRVJGTE9XCTMyCS8qIGJ1ZmZlciBvdmVyZmxvdy91bmRlcmZsb3cgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBldmVyeXRoaW5nIGFmdGVyIHRoaXMgbGluZSBpcyBBTFBIQSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgIDgyNTQgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKworICBJdCBzdXBwb3J0cyB0d28gY29uZmlnIGNvbW1hbmRzOgorCisgIDAgSUQ6IElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUKKyAgMSA4MjU0IE1vZGUKKyAgICBJODI1NF9NT0RFMCwgSTgyNTRfTU9ERTEsIC4uLiwgSTgyNTRfTU9ERTUKKyAgICBPUidlZCB3aXRoOgorICAgIEk4MjU0X0JDRCwgSTgyNTRfQklOQVJZCisKKyAgMCBJRDogSU5TTl9DT05GSUdfODI1NF9SRUFEX1NUQVRVUworICAxIDwtLSBTdGF0dXMgYnl0ZSByZXR1cm5lZCBoZXJlLgorICAgIEI3ID0gT3V0cHV0CisgICAgQjYgPSBOVUxMIENvdW50CisgICAgQjUgLSBCMCBDdXJyZW50IG1vZGUuCisKKyovCisKK2VudW0gaTgyNTRfbW9kZSB7CisJSTgyNTRfTU9ERTAgPSAoMCA8PCAxKSwJLyogSW50ZXJydXB0IG9uIHRlcm1pbmFsIGNvdW50ICovCisJSTgyNTRfTU9ERTEgPSAoMSA8PCAxKSwJLyogSGFyZHdhcmUgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdCAqLworCUk4MjU0X01PREUyID0gKDIgPDwgMSksCS8qIFJhdGUgZ2VuZXJhdG9yICovCisJSTgyNTRfTU9ERTMgPSAoMyA8PCAxKSwJLyogU3F1YXJlIHdhdmUgbW9kZSAqLworCUk4MjU0X01PREU0ID0gKDQgPDwgMSksCS8qIFNvZnR3YXJlIHRyaWdnZXJlZCBzdHJvYmUgKi8KKwlJODI1NF9NT0RFNSA9ICg1IDw8IDEpLAkvKiBIYXJkd2FyZSB0cmlnZ2VyZWQgc3Ryb2JlIChyZXRyaWdnZXJhYmxlKSAqLworCUk4MjU0X0JDRCA9IDEsCS8qIHVzZSBiaW5hcnktY29kZWQgZGVjaW1hbCBpbnN0ZWFkIG9mIGJpbmFyeSAocHJldHR5IHVzZWxlc3MpICovCisJSTgyNTRfQklOQVJZID0gMAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9VU1VBTF9QRklfU0VMRUNUKHVuc2lnbmVkIHBmaV9jaGFubmVsKQoreworCWlmIChwZmlfY2hhbm5lbCA8IDEwKQorCQlyZXR1cm4gMHgxICsgcGZpX2NoYW5uZWw7CisJZWxzZQorCQlyZXR1cm4gMHhiICsgcGZpX2NoYW5uZWw7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX1VTVUFMX1JUU0lfU0VMRUNUKHVuc2lnbmVkIHJ0c2lfY2hhbm5lbCkKK3sKKwlpZiAocnRzaV9jaGFubmVsIDwgNykKKwkJcmV0dXJuIDB4YiArIHJ0c2lfY2hhbm5lbDsKKwllbHNlCisJCXJldHVybiAweDFiOworfQorLyogbW9kZSBiaXRzIGZvciBOSSBnZW5lcmFsLXB1cnBvc2UgY291bnRlcnMsIHNldCB3aXRoCisgKiBJTlNOX0NPTkZJR19TRVRfQ09VTlRFUl9NT0RFICovCisjZGVmaW5lIE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCAxNgorI2RlZmluZSBOSV9HUENUX0lOREVYX1BIQVNFX0JJVFNISUZUIDIwCisjZGVmaW5lIE5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1NISUZUIDI0CitlbnVtIG5pX2dwY3RfbW9kZV9iaXRzIHsKKwlOSV9HUENUX0dBVEVfT05fQk9USF9FREdFU19CSVQgPSAweDQsCisJTklfR1BDVF9FREdFX0dBVEVfTU9ERV9NQVNLID0gMHgxOCwKKwlOSV9HUENUX0VER0VfR0FURV9TVEFSVFNfU1RPUFNfQklUUyA9IDB4MCwKKwlOSV9HUENUX0VER0VfR0FURV9TVE9QU19TVEFSVFNfQklUUyA9IDB4OCwKKwlOSV9HUENUX0VER0VfR0FURV9TVEFSVFNfQklUUyA9IDB4MTAsCisJTklfR1BDVF9FREdFX0dBVEVfTk9fU1RBUlRTX05PX1NUT1BTX0JJVFMgPSAweDE4LAorCU5JX0dQQ1RfU1RPUF9NT0RFX01BU0sgPSAweDYwLAorCU5JX0dQQ1RfU1RPUF9PTl9HQVRFX0JJVFMgPSAweDAwLAorCU5JX0dQQ1RfU1RPUF9PTl9HQVRFX09SX1RDX0JJVFMgPSAweDIwLAorCU5JX0dQQ1RfU1RPUF9PTl9HQVRFX09SX1NFQ09ORF9UQ19CSVRTID0gMHg0MCwKKwlOSV9HUENUX0xPQURfQl9TRUxFQ1RfQklUID0gMHg4MCwKKwlOSV9HUENUX09VVFBVVF9NT0RFX01BU0sgPSAweDMwMCwKKwlOSV9HUENUX09VVFBVVF9UQ19QVUxTRV9CSVRTID0gMHgxMDAsCisJTklfR1BDVF9PVVRQVVRfVENfVE9HR0xFX0JJVFMgPSAweDIwMCwKKwlOSV9HUENUX09VVFBVVF9UQ19PUl9HQVRFX1RPR0dMRV9CSVRTID0gMHgzMDAsCisJTklfR1BDVF9IQVJEV0FSRV9ESVNBUk1fTUFTSyA9IDB4YzAwLAorCU5JX0dQQ1RfTk9fSEFSRFdBUkVfRElTQVJNX0JJVFMgPSAweDAwMCwKKwlOSV9HUENUX0RJU0FSTV9BVF9UQ19CSVRTID0gMHg0MDAsCisJTklfR1BDVF9ESVNBUk1fQVRfR0FURV9CSVRTID0gMHg4MDAsCisJTklfR1BDVF9ESVNBUk1fQVRfVENfT1JfR0FURV9CSVRTID0gMHhjMDAsCisJTklfR1BDVF9MT0FESU5HX09OX1RDX0JJVCA9IDB4MTAwMCwKKwlOSV9HUENUX0xPQURJTkdfT05fR0FURV9CSVQgPSAweDQwMDAsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX01BU0sgPSAweDcgPDwgTklfR1BDVF9DT1VOVElOR19NT0RFX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9OT1JNQUxfQklUUyA9CisJCTB4MCA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX1FVQURSQVRVUkVfWDFfQklUUyA9CisJCTB4MSA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX1FVQURSQVRVUkVfWDJfQklUUyA9CisJCTB4MiA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX1FVQURSQVRVUkVfWDRfQklUUyA9CisJCTB4MyA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX1RXT19QVUxTRV9CSVRTID0KKwkJMHg0IDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfU1lOQ19TT1VSQ0VfQklUUyA9CisJCTB4NiA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9JTkRFWF9QSEFTRV9NQVNLID0gMHgzIDw8IE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQsCisJTklfR1BDVF9JTkRFWF9QSEFTRV9MT1dfQV9MT1dfQl9CSVRTID0KKwkJMHgwIDw8IE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQsCisJTklfR1BDVF9JTkRFWF9QSEFTRV9MT1dfQV9ISUdIX0JfQklUUyA9CisJCTB4MSA8PCBOSV9HUENUX0lOREVYX1BIQVNFX0JJVFNISUZULAorCU5JX0dQQ1RfSU5ERVhfUEhBU0VfSElHSF9BX0xPV19CX0JJVFMgPQorCQkweDIgPDwgTklfR1BDVF9JTkRFWF9QSEFTRV9CSVRTSElGVCwKKwlOSV9HUENUX0lOREVYX1BIQVNFX0hJR0hfQV9ISUdIX0JfQklUUyA9CisJCTB4MyA8PCBOSV9HUENUX0lOREVYX1BIQVNFX0JJVFNISUZULAorCU5JX0dQQ1RfSU5ERVhfRU5BQkxFX0JJVCA9IDB4NDAwMDAwLAorCU5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX01BU0sgPQorCQkweDMgPDwgTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fRE9XTl9CSVRTID0KKwkJMHgwMCA8PCBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9VUF9CSVRTID0KKwkJMHgxIDw8IE5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX0hXX1VQX0RPV05fQklUUyA9CisJCTB4MiA8PCBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9IV19HQVRFX0JJVFMgPQorCQkweDMgPDwgTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fU0hJRlQsCisJTklfR1BDVF9SRUxPQURfU09VUkNFX01BU0sgPSAweGMwMDAwMDAsCisJTklfR1BDVF9SRUxPQURfU09VUkNFX0ZJWEVEX0JJVFMgPSAweDAsCisJTklfR1BDVF9SRUxPQURfU09VUkNFX1NXSVRDSElOR19CSVRTID0gMHg0MDAwMDAwLAorCU5JX0dQQ1RfUkVMT0FEX1NPVVJDRV9HQVRFX1NFTEVDVF9CSVRTID0gMHg4MDAwMDAwLAorCU5JX0dQQ1RfT1JfR0FURV9CSVQgPSAweDEwMDAwMDAwLAorCU5JX0dQQ1RfSU5WRVJUX09VVFBVVF9CSVQgPSAweDIwMDAwMDAwCit9OworCisvKiBCaXRzIGZvciBzZXR0aW5nIGEgY2xvY2sgc291cmNlIHdpdGgKKyAqIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkMgd2hlbiB1c2luZyBOSSBnZW5lcmFsLXB1cnBvc2UgY291bnRlcnMuICovCitlbnVtIG5pX2dwY3RfY2xvY2tfc291cmNlX2JpdHMgeworCU5JX0dQQ1RfQ0xPQ0tfU1JDX1NFTEVDVF9NQVNLID0gMHgzZiwKKwlOSV9HUENUX1RJTUVCQVNFXzFfQ0xPQ0tfU1JDX0JJVFMgPSAweDAsCisJTklfR1BDVF9USU1FQkFTRV8yX0NMT0NLX1NSQ19CSVRTID0gMHgxLAorCU5JX0dQQ1RfVElNRUJBU0VfM19DTE9DS19TUkNfQklUUyA9IDB4MiwKKwlOSV9HUENUX0xPR0lDX0xPV19DTE9DS19TUkNfQklUUyA9IDB4MywKKwlOSV9HUENUX05FWFRfR0FURV9DTE9DS19TUkNfQklUUyA9IDB4NCwKKwlOSV9HUENUX05FWFRfVENfQ0xPQ0tfU1JDX0JJVFMgPSAweDUsCisJTklfR1BDVF9TT1VSQ0VfUElOX2lfQ0xPQ0tfU1JDX0JJVFMgPSAweDYsCS8qIE5JIDY2MHgtc3BlY2lmaWMgKi8KKwlOSV9HUENUX1BYSTEwX0NMT0NLX1NSQ19CSVRTID0gMHg3LAorCU5JX0dQQ1RfUFhJX1NUQVJfVFJJR0dFUl9DTE9DS19TUkNfQklUUyA9IDB4OCwKKwlOSV9HUENUX0FOQUxPR19UUklHR0VSX09VVF9DTE9DS19TUkNfQklUUyA9IDB4OSwKKwlOSV9HUENUX1BSRVNDQUxFX01PREVfQ0xPQ0tfU1JDX01BU0sgPSAweDMwMDAwMDAwLAorCU5JX0dQQ1RfTk9fUFJFU0NBTEVfQ0xPQ0tfU1JDX0JJVFMgPSAweDAsCisJTklfR1BDVF9QUkVTQ0FMRV9YMl9DTE9DS19TUkNfQklUUyA9IDB4MTAwMDAwMDAsIC8qIGRpdmlkZSBzb3VyY2UgYnkgMiAqLworCU5JX0dQQ1RfUFJFU0NBTEVfWDhfQ0xPQ0tfU1JDX0JJVFMgPSAweDIwMDAwMDAwLCAvKiBkaXZpZGUgc291cmNlIGJ5IDggKi8KKwlOSV9HUENUX0lOVkVSVF9DTE9DS19TUkNfQklUID0gMHg4MDAwMDAwMAorfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9TT1VSQ0VfUElOX0NMT0NLX1NSQ19CSVRTKHVuc2lnbmVkIG4pCit7CisJLyogTkkgNjYweC1zcGVjaWZpYyAqLworCXJldHVybiAweDEwICsgbjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9SVFNJX0NMT0NLX1NSQ19CSVRTKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIDB4MTggKyBuOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1BGSV9DTE9DS19TUkNfQklUUyh1bnNpZ25lZCBuKQoreworCS8qIG5vIHBmaSBvbiBOSSA2NjB4ICovCisJcmV0dXJuIDB4MjAgKyBuOworfQorCisvKiBQb3NzaWJpbGl0aWVzIGZvciBzZXR0aW5nIGEgZ2F0ZSBzb3VyY2Ugd2l0aAorSU5TTl9DT05GSUdfU0VUX0dBVEVfU1JDIHdoZW4gdXNpbmcgTkkgZ2VuZXJhbC1wdXJwb3NlIGNvdW50ZXJzLgorTWF5IGJlIGJpdHdpc2Utb3InZCB3aXRoIENSX0VER0Ugb3IgQ1JfSU5WRVJULiAqLworZW51bSBuaV9ncGN0X2dhdGVfc2VsZWN0IHsKKwkvKiBtLXNlcmllcyBnYXRlcyAqLworCU5JX0dQQ1RfVElNRVNUQU1QX01VWF9HQVRFX1NFTEVDVCA9IDB4MCwKKwlOSV9HUENUX0FJX1NUQVJUMl9HQVRFX1NFTEVDVCA9IDB4MTIsCisJTklfR1BDVF9QWElfU1RBUl9UUklHR0VSX0dBVEVfU0VMRUNUID0gMHgxMywKKwlOSV9HUENUX05FWFRfT1VUX0dBVEVfU0VMRUNUID0gMHgxNCwKKwlOSV9HUENUX0FJX1NUQVJUMV9HQVRFX1NFTEVDVCA9IDB4MWMsCisJTklfR1BDVF9ORVhUX1NPVVJDRV9HQVRFX1NFTEVDVCA9IDB4MWQsCisJTklfR1BDVF9BTkFMT0dfVFJJR0dFUl9PVVRfR0FURV9TRUxFQ1QgPSAweDFlLAorCU5JX0dQQ1RfTE9HSUNfTE9XX0dBVEVfU0VMRUNUID0gMHgxZiwKKwkvKiBtb3JlIGdhdGVzIGZvciA2NjB4ICovCisJTklfR1BDVF9TT1VSQ0VfUElOX2lfR0FURV9TRUxFQ1QgPSAweDEwMCwKKwlOSV9HUENUX0dBVEVfUElOX2lfR0FURV9TRUxFQ1QgPSAweDEwMSwKKwkvKiBtb3JlIGdhdGVzIGZvciA2NjB4ICJzZWNvbmQgZ2F0ZSIgKi8KKwlOSV9HUENUX1VQX0RPV05fUElOX2lfR0FURV9TRUxFQ1QgPSAweDIwMSwKKwlOSV9HUENUX1NFTEVDVEVEX0dBVEVfR0FURV9TRUxFQ1QgPSAweDIxZSwKKwkvKiBtLXNlcmllcyAic2Vjb25kIGdhdGUiIHNvdXJjZXMgYXJlIHVua25vd24sCisJICAgd2Ugc2hvdWxkIGFkZCB0aGVtIGhlcmUgd2l0aCBhbiBvZmZzZXQgb2YgMHgzMDAgd2hlbiBrbm93bi4gKi8KKwlOSV9HUENUX0RJU0FCTEVEX0dBVEVfU0VMRUNUID0gMHg4MDAwLAorfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9HQVRFX1BJTl9HQVRFX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiAweDEwMiArIG47Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0dQQ1RfUlRTSV9HQVRFX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiBOSV9VU1VBTF9SVFNJX1NFTEVDVChuKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9QRklfR0FURV9TRUxFQ1QodW5zaWduZWQgbikKK3sKKwlyZXR1cm4gTklfVVNVQUxfUEZJX1NFTEVDVChuKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9VUF9ET1dOX1BJTl9HQVRFX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiAweDIwMiArIG47Cit9CisKKy8qIFBvc3NpYmlsaXRpZXMgZm9yIHNldHRpbmcgYSBzb3VyY2Ugd2l0aAorSU5TTl9DT05GSUdfU0VUX09USEVSX1NSQyB3aGVuIHVzaW5nIE5JIGdlbmVyYWwtcHVycG9zZSBjb3VudGVycy4gKi8KK2VudW0gbmlfZ3BjdF9vdGhlcl9pbmRleCB7CisJTklfR1BDVF9TT1VSQ0VfRU5DT0RFUl9BLAorCU5JX0dQQ1RfU09VUkNFX0VOQ09ERVJfQiwKKwlOSV9HUENUX1NPVVJDRV9FTkNPREVSX1oKK307CitlbnVtIG5pX2dwY3Rfb3RoZXJfc2VsZWN0IHsKKwkvKiBtLXNlcmllcyBnYXRlcyAqLworCS8qIFN0aWxsIHVua25vd24sIHByb2JhYmx5IG9ubHkgbmVlZCBOSV9HUENUX1BGSV9PVEhFUl9TRUxFQ1QgKi8KKwlOSV9HUENUX0RJU0FCTEVEX09USEVSX1NFTEVDVCA9IDB4ODAwMCwKK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0dQQ1RfUEZJX09USEVSX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiBOSV9VU1VBTF9QRklfU0VMRUNUKG4pOworfQorCisvKiBzdGFydCBzb3VyY2VzIGZvciBuaSBnZW5lcmFsLXB1cnBvc2UgY291bnRlcnMgZm9yIHVzZSB3aXRoCitJTlNOX0NPTkZJR19BUk0gKi8KK2VudW0gbmlfZ3BjdF9hcm1fc291cmNlIHsKKwlOSV9HUENUX0FSTV9JTU1FRElBVEUgPSAweDAsCisJTklfR1BDVF9BUk1fUEFJUkVEX0lNTUVESUFURSA9IDB4MSwJLyogU3RhcnQgYm90aCB0aGUgY291bnRlciBhbmQKKwkJCQkJCSAgIHRoZSBhZGphY2VudCBwYWlyZWQgY291bnRlcgorCQkJCQkJICAgc2ltdWx0YW5lb3VzbHkgKi8KKwkvKiBOSSBkb2Vzbid0IGRvY3VtZW50IGJpdHMgZm9yIHNlbGVjdGluZyBoYXJkd2FyZSBhcm0gdHJpZ2dlcnMuICBJZgorCSAqIHRoZSBOSV9HUENUX0FSTV9VTktOT1dOIGJpdCBpcyBzZXQsIHdlIHdpbGwgcGFzcyB0aGUgbGVhc3QKKwkgKiBzaWduaWZpY2FudCBiaXRzICgzIGJpdHMgZm9yIDY2MHggb3IgNSBiaXRzIGZvciBtLXNlcmllcykgdGhyb3VnaCB0bworCSAqIHRoZSBoYXJkd2FyZS4gIFRoaXMgd2lsbCBhdCBsZWFzdCBhbGxvdyBzb21lb25lIHRvIGZpZ3VyZSBvdXQgd2hhdAorCSAqIHRoZSBiaXRzIGRvIGxhdGVyLiAqLworCU5JX0dQQ1RfQVJNX1VOS05PV04gPSAweDEwMDAsCit9OworCisvKiBkaWdpdGFsIGZpbHRlcmluZyBvcHRpb25zIGZvciBuaSA2NjB4IGZvciB1c2Ugd2l0aCBJTlNOX0NPTkZJR19GSUxURVIuICovCitlbnVtIG5pX2dwY3RfZmlsdGVyX3NlbGVjdCB7CisJTklfR1BDVF9GSUxURVJfT0ZGID0gMHgwLAorCU5JX0dQQ1RfRklMVEVSX1RJTUVCQVNFXzNfU1lOQyA9IDB4MSwKKwlOSV9HUENUX0ZJTFRFUl8xMDB4X1RJTUVCQVNFXzEgPSAweDIsCisJTklfR1BDVF9GSUxURVJfMjB4X1RJTUVCQVNFXzEgPSAweDMsCisJTklfR1BDVF9GSUxURVJfMTB4X1RJTUVCQVNFXzEgPSAweDQsCisJTklfR1BDVF9GSUxURVJfMnhfVElNRUJBU0VfMSA9IDB4NSwKKwlOSV9HUENUX0ZJTFRFUl8yeF9USU1FQkFTRV8zID0gMHg2Cit9OworCisvKiBQRkkgZGlnaXRhbCBmaWx0ZXJpbmcgb3B0aW9ucyBmb3IgbmkgbS1zZXJpZXMgZm9yIHVzZSB3aXRoCisgKiBJTlNOX0NPTkZJR19GSUxURVIuICovCitlbnVtIG5pX3BmaV9maWx0ZXJfc2VsZWN0IHsKKwlOSV9QRklfRklMVEVSX09GRiA9IDB4MCwKKwlOSV9QRklfRklMVEVSXzEyNW5zID0gMHgxLAorCU5JX1BGSV9GSUxURVJfNjQyNW5zID0gMHgyLAorCU5JX1BGSV9GSUxURVJfMjU1MHVzID0gMHgzCit9OworCisvKiBtYXN0ZXIgY2xvY2sgc291cmNlcyBmb3IgbmkgbWlvIGJvYXJkcyBhbmQgSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQyAqLworZW51bSBuaV9taW9fY2xvY2tfc291cmNlIHsKKwlOSV9NSU9fSU5URVJOQUxfQ0xPQ0sgPSAwLAorCU5JX01JT19SVFNJX0NMT0NLID0gMSwJLyogZG9lc24ndCB3b3JrIGZvciBtLXNlcmllcywgdXNlCisJCQkJICAgTklfTUlPX1BMTF9SVFNJX0NMT0NLKCkgKi8KKwkvKiB0aGUgTklfTUlPX1BMTF8qIHNvdXJjZXMgYXJlIG0tc2VyaWVzIG9ubHkgKi8KKwlOSV9NSU9fUExMX1BYSV9TVEFSX1RSSUdHRVJfQ0xPQ0sgPSAyLAorCU5JX01JT19QTExfUFhJMTBfQ0xPQ0sgPSAzLAorCU5JX01JT19QTExfUlRTSTBfQ0xPQ0sgPSA0Cit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9NSU9fUExMX1JUU0lfQ0xPQ0sodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9NSU9fUExMX1JUU0kwX0NMT0NLICsgcnRzaV9jaGFubmVsOworfQorCisvKiBTaWduYWxzIHdoaWNoIGNhbiBiZSByb3V0ZWQgdG8gYW4gTkkgUlRTSSBwaW4gd2l0aCBJTlNOX0NPTkZJR19TRVRfUk9VVElORy4KKyBUaGUgbnVtYmVycyBhc3NpZ25lZCBhcmUgbm90IGFyYml0cmFyeSwgdGhleSBjb3JyZXNwb25kIHRvIHRoZSBiaXRzIHJlcXVpcmVkCisgdG8gcHJvZ3JhbSB0aGUgYm9hcmQuICovCitlbnVtIG5pX3J0c2lfcm91dGluZyB7CisJTklfUlRTSV9PVVRQVVRfQURSX1NUQVJUMSA9IDAsCisJTklfUlRTSV9PVVRQVVRfQURSX1NUQVJUMiA9IDEsCisJTklfUlRTSV9PVVRQVVRfU0NMS0cgPSAyLAorCU5JX1JUU0lfT1VUUFVUX0RBQ1VQRE4gPSAzLAorCU5JX1JUU0lfT1VUUFVUX0RBX1NUQVJUMSA9IDQsCisJTklfUlRTSV9PVVRQVVRfR19TUkMwID0gNSwKKwlOSV9SVFNJX09VVFBVVF9HX0dBVEUwID0gNiwKKwlOSV9SVFNJX09VVFBVVF9SR09VVDAgPSA3LAorCU5JX1JUU0lfT1VUUFVUX1JUU0lfQlJEXzAgPSA4LAorCU5JX1JUU0lfT1VUUFVUX1JUU0lfT1NDID0gMTIJLyogcHJlLW0tc2VyaWVzIGFsd2F5cyBoYXZlIFJUU0kgY2xvY2sKKwkJCQkJICAgb24gbGluZSA3ICovCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9SVFNJX09VVFBVVF9SVFNJX0JSRCh1bnNpZ25lZCBuKQoreworCXJldHVybiBOSV9SVFNJX09VVFBVVF9SVFNJX0JSRF8wICsgbjsKK30KKworLyogU2lnbmFscyB3aGljaCBjYW4gYmUgcm91dGVkIHRvIGFuIE5JIFBGSSBwaW4gb24gYW4gbS1zZXJpZXMgYm9hcmQgd2l0aAorICogSU5TTl9DT05GSUdfU0VUX1JPVVRJTkcuICBUaGVzZSBudW1iZXJzIGFyZSBhbHNvIHJldHVybmVkIGJ5CisgKiBJTlNOX0NPTkZJR19HRVRfUk9VVElORyBvbiBwcmUtbS1zZXJpZXMgYm9hcmRzLCBldmVuIHRob3VnaCB0aGVpciByb3V0aW5nCisgKiBjYW5ub3QgYmUgY2hhbmdlZC4gIFRoZSBudW1iZXJzIGFzc2lnbmVkIGFyZSBub3QgYXJiaXRyYXJ5LCB0aGV5IGNvcnJlc3BvbmQKKyAqIHRvIHRoZSBiaXRzIHJlcXVpcmVkIHRvIHByb2dyYW0gdGhlIGJvYXJkLiAqLworZW51bSBuaV9wZmlfcm91dGluZyB7CisJTklfUEZJX09VVFBVVF9QRklfREVGQVVMVCA9IDAsCisJTklfUEZJX09VVFBVVF9BSV9TVEFSVDEgPSAxLAorCU5JX1BGSV9PVVRQVVRfQUlfU1RBUlQyID0gMiwKKwlOSV9QRklfT1VUUFVUX0FJX0NPTlZFUlQgPSAzLAorCU5JX1BGSV9PVVRQVVRfR19TUkMxID0gNCwKKwlOSV9QRklfT1VUUFVUX0dfR0FURTEgPSA1LAorCU5JX1BGSV9PVVRQVVRfQU9fVVBEQVRFX04gPSA2LAorCU5JX1BGSV9PVVRQVVRfQU9fU1RBUlQxID0gNywKKwlOSV9QRklfT1VUUFVUX0FJX1NUQVJUX1BVTFNFID0gOCwKKwlOSV9QRklfT1VUUFVUX0dfU1JDMCA9IDksCisJTklfUEZJX09VVFBVVF9HX0dBVEUwID0gMTAsCisJTklfUEZJX09VVFBVVF9FWFRfU1RST0JFID0gMTEsCisJTklfUEZJX09VVFBVVF9BSV9FWFRfTVVYX0NMSyA9IDEyLAorCU5JX1BGSV9PVVRQVVRfR09VVDAgPSAxMywKKwlOSV9QRklfT1VUUFVUX0dPVVQxID0gMTQsCisJTklfUEZJX09VVFBVVF9GUkVRX09VVCA9IDE1LAorCU5JX1BGSV9PVVRQVVRfUEZJX0RPID0gMTYsCisJTklfUEZJX09VVFBVVF9JX0FUUklHID0gMTcsCisJTklfUEZJX09VVFBVVF9SVFNJMCA9IDE4LAorCU5JX1BGSV9PVVRQVVRfUFhJX1NUQVJfVFJJR0dFUl9JTiA9IDI2LAorCU5JX1BGSV9PVVRQVVRfU0NYSV9UUklHMSA9IDI3LAorCU5JX1BGSV9PVVRQVVRfRElPX0NIQU5HRV9ERVRFQ1RfUlRTSSA9IDI4LAorCU5JX1BGSV9PVVRQVVRfQ0RJX1NBTVBMRSA9IDI5LAorCU5JX1BGSV9PVVRQVVRfQ0RPX1VQREFURSA9IDMwCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9QRklfT1VUUFVUX1JUU0kodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9QRklfT1VUUFVUX1JUU0kwICsgcnRzaV9jaGFubmVsOworfQorCisvKiBTaWduYWxzIHdoaWNoIGNhbiBiZSByb3V0ZWQgdG8gb3V0cHV0IG9uIGEgTkkgUEZJIHBpbiBvbiBhIDY2MHggYm9hcmQKKyB3aXRoIElOU05fQ09ORklHX1NFVF9ST1VUSU5HLiAgVGhlIG51bWJlcnMgYXNzaWduZWQgYXJlCisgbm90IGFyYml0cmFyeSwgdGhleSBjb3JyZXNwb25kIHRvIHRoZSBiaXRzIHJlcXVpcmVkCisgdG8gcHJvZ3JhbSB0aGUgYm9hcmQuICBMaW5lcyAwIHRvIDcgY2FuIG9ubHkgYmUgc2V0IHRvCisgTklfNjYwWF9QRklfT1VUUFVUX0RJTy4gIExpbmVzIDMyIHRvIDM5IGNhbiBvbmx5IGJlIHNldCB0bworIE5JXzY2MFhfUEZJX09VVFBVVF9DT1VOVEVSLiAqLworZW51bSBuaV82NjB4X3BmaV9yb3V0aW5nIHsKKwlOSV82NjBYX1BGSV9PVVRQVVRfQ09VTlRFUiA9IDEsCS8qIGNvdW50ZXIgKi8KKwlOSV82NjBYX1BGSV9PVVRQVVRfRElPID0gMiwJLyogc3RhdGljIGRpZ2l0YWwgb3V0cHV0ICovCit9OworCisvKiBOSSBFeHRlcm5hbCBUcmlnZ2VyIGxpbmVzLiAgVGhlc2UgdmFsdWVzIGFyZSBub3QgYXJiaXRyYXJ5LCBidXQgYXJlIHJlbGF0ZWQKKyAqIHRvIHRoZSBiaXRzIHJlcXVpcmVkIHRvIHByb2dyYW0gdGhlIGJvYXJkIChvZmZzZXQgYnkgMSBmb3IgaGlzdG9yaWNhbAorICogcmVhc29ucykuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0VYVF9QRkkodW5zaWduZWQgcGZpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1BGSV9TRUxFQ1QocGZpX2NoYW5uZWwpIC0gMTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfRVhUX1JUU0kodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9VU1VBTF9SVFNJX1NFTEVDVChydHNpX2NoYW5uZWwpIC0gMTsKK30KKworLyogc3RhdHVzIGJpdHMgZm9yIElOU05fQ09ORklHX0dFVF9DT1VOVEVSX1NUQVRVUyAqLworZW51bSBjb21lZGlfY291bnRlcl9zdGF0dXNfZmxhZ3MgeworCUNPTUVESV9DT1VOVEVSX0FSTUVEID0gMHgxLAorCUNPTUVESV9DT1VOVEVSX0NPVU5USU5HID0gMHgyLAorCUNPTUVESV9DT1VOVEVSX1RFUk1JTkFMX0NPVU5UID0gMHg0LAorfTsKKworLyogQ2xvY2sgc291cmNlcyBmb3IgQ0RJTyBzdWJkZXZpY2Ugb24gTkkgbS1zZXJpZXMgYm9hcmRzLiAgVXNlZCBhcyB0aGUKKyAqIHNjYW5fYmVnaW5fYXJnIGZvciBhIGNvbWVkaV9jb21tYW5kLiBUaGVzZSBzb3VyY2VzIG1heSBhbHNvIGJlIGJpdHdpc2Utb3InZAorICogd2l0aCBDUl9JTlZFUlQgdG8gY2hhbmdlIHBvbGFyaXR5LiAqLworZW51bSBuaV9tX3Nlcmllc19jZGlvX3NjYW5fYmVnaW5fc3JjIHsKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0dST1VORCA9IDAsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19BSV9TVEFSVCA9IDE4LAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfQUlfQ09OVkVSVCA9IDE5LAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfUFhJX1NUQVJfVFJJR0dFUiA9IDIwLAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfRzBfT1VUID0gMjgsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19HMV9PVVQgPSAyOSwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0FOQUxPR19UUklHR0VSID0gMzAsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19BT19VUERBVEUgPSAzMSwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0ZSRVFfT1VUID0gMzIsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19ESU9fQ0hBTkdFX0RFVEVDVF9JUlEgPSAzMworfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19QRkkodW5zaWduZWQgcGZpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1BGSV9TRUxFQ1QocGZpX2NoYW5uZWwpOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9DRElPX1NDQU5fQkVHSU5fU1JDX1JUU0kodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9VU1VBTF9SVFNJX1NFTEVDVChydHNpX2NoYW5uZWwpOworfQorCisvKiBzY2FuX2JlZ2luX3NyYyBmb3Igc2Nhbl9iZWdpbl9hcmc9PVRSSUdfRVhUIHdpdGggYW5hbG9nIG91dHB1dCBjb21tYW5kIG9uIE5JCisgKiBib2FyZHMuICBUaGVzZSBzY2FuIGJlZ2luIHNvdXJjZXMgY2FuIGFsc28gYmUgYml0d2lzZS1vcidkIHdpdGggQ1JfSU5WRVJUIHRvCisgKiBjaGFuZ2UgcG9sYXJpdHkuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0FPX1NDQU5fQkVHSU5fU1JDX1BGSSh1bnNpZ25lZCBwZmlfY2hhbm5lbCkKK3sKKwlyZXR1cm4gTklfVVNVQUxfUEZJX1NFTEVDVChwZmlfY2hhbm5lbCk7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0FPX1NDQU5fQkVHSU5fU1JDX1JUU0kodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9VU1VBTF9SVFNJX1NFTEVDVChydHNpX2NoYW5uZWwpOworfQorCisvKiBCaXRzIGZvciBzZXR0aW5nIGEgY2xvY2sgc291cmNlIHdpdGgKKyAqIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkMgd2hlbiB1c2luZyBOSSBmcmVxdWVuY3kgb3V0cHV0IHN1YmRldmljZS4gKi8KK2VudW0gbmlfZnJlcV9vdXRfY2xvY2tfc291cmNlX2JpdHMgeworCU5JX0ZSRVFfT1VUX1RJTUVCQVNFXzFfRElWXzJfQ0xPQ0tfU1JDLAkvKiAxMCBNSHogKi8KKwlOSV9GUkVRX09VVF9USU1FQkFTRV8yX0NMT0NLX1NSQwkvKiAxMDAgS0h6ICovCit9OworCisvKiBWYWx1ZXMgZm9yIHNldHRpbmcgYSBjbG9jayBzb3VyY2Ugd2l0aCBJTlNOX0NPTkZJR19TRVRfQ0xPQ0tfU1JDIGZvcgorICogODI1NCBjb3VudGVyIHN1YmRldmljZXMgb24gQW1wbGljb24gRElPIGJvYXJkcyAoYW1wbGNfZGlvMjAwIGRyaXZlcikuICovCisJZW51bSBhbXBsY19kaW9fY2xvY2tfc291cmNlIHsKKwkJQU1QTENfRElPX0NMS19DTEtOLAkvKiBwZXIgY2hhbm5lbCBleHRlcm5hbCBjbG9jaworCQkJCQkgICBpbnB1dC9vdXRwdXQgcGluIChwaW4gaXMgb25seSBhbgorCQkJCQkgICBpbnB1dCB3aGVuIGNsb2NrIHNvdXJjZSBzZXQgdG8gdGhpcworCQkJCQkgICB2YWx1ZSwgb3RoZXJ3aXNlIGl0IGlzIGFuIG91dHB1dCkgKi8KKwkJQU1QTENfRElPX0NMS18xME1IWiwJLyogMTAgTUh6IGludGVybmFsIGNsb2NrICovCisJCUFNUExDX0RJT19DTEtfMU1IWiwJLyogMSBNSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS18xMDBLSFosCS8qIDEwMCBrSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS18xMEtIWiwJLyogMTAga0h6IGludGVybmFsIGNsb2NrICovCisJCUFNUExDX0RJT19DTEtfMUtIWiwJLyogMSBrSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS19PVVROTTEsCS8qIG91dHB1dCBvZiBwcmVjZWRpbmcgY291bnRlciBjaGFubmVsCisJCQkJCSAgIChmb3IgY2hhbm5lbCAwLCBwcmVjZWRpbmcgY291bnRlcgorCQkJCQkgICBjaGFubmVsIGlzIGNoYW5uZWwgMiBvbiBwcmVjZWRpbmcKKwkJCQkJICAgY291bnRlciBzdWJkZXZpY2UsIGZvciBmaXJzdCBjb3VudGVyCisJCQkJCSAgIHN1YmRldmljZSwgcHJlY2VkaW5nIGNvdW50ZXIKKwkJCQkJICAgc3ViZGV2aWNlIGlzIHRoZSBsYXN0IGNvdW50ZXIKKwkJCQkJICAgc3ViZGV2aWNlKSAqLworCQlBTVBMQ19ESU9fQ0xLX0VYVAkvKiBwZXIgY2hpcCBleHRlcm5hbCBpbnB1dCBwaW4gKi8KKwl9OworCisvKiBWYWx1ZXMgZm9yIHNldHRpbmcgYSBnYXRlIHNvdXJjZSB3aXRoIElOU05fQ09ORklHX1NFVF9HQVRFX1NSQyBmb3IKKyAqIDgyNTQgY291bnRlciBzdWJkZXZpY2VzIG9uIEFtcGxpY29uIERJTyBib2FyZHMgKGFtcGxjX2RpbzIwMCBkcml2ZXIpLiAqLworCWVudW0gYW1wbGNfZGlvX2dhdGVfc291cmNlIHsKKwkJQU1QTENfRElPX0dBVF9WQ0MsCS8qIGludGVybmFsIGhpZ2ggbG9naWMgbGV2ZWwgKi8KKwkJQU1QTENfRElPX0dBVF9HTkQsCS8qIGludGVybmFsIGxvdyBsb2dpYyBsZXZlbCAqLworCQlBTVBMQ19ESU9fR0FUX0dBVE4sCS8qIHBlciBjaGFubmVsIGV4dGVybmFsIGdhdGUgaW5wdXQgKi8KKwkJQU1QTENfRElPX0dBVF9OT1VUTk0yLAkvKiBuZWdhdGVkIG91dHB1dCBvZiBjb3VudGVyIGNoYW5uZWwKKwkJCQkJICAgbWludXMgMiAoZm9yIGNoYW5uZWxzIDAgb3IgMSwKKwkJCQkJICAgY2hhbm5lbCBtaW51cyAyIGlzIGNoYW5uZWwgMSBvciAyIG9uCisJCQkJCSAgIHRoZSBwcmVjZWRpbmcgY291bnRlciBzdWJkZXZpY2UsIGZvcgorCQkJCQkgICB0aGUgZmlyc3QgY291bnRlciBzdWJkZXZpY2UgdGhlCisJCQkJCSAgIHByZWNlZGluZyBjb3VudGVyIHN1YmRldmljZSBpcyB0aGUKKwkJCQkJICAgbGFzdCBjb3VudGVyIHN1YmRldmljZSkgKi8KKwkJQU1QTENfRElPX0dBVF9SRVNFUlZFRDQsCisJCUFNUExDX0RJT19HQVRfUkVTRVJWRUQ1LAorCQlBTVBMQ19ESU9fR0FUX1JFU0VSVkVENiwKKwkJQU1QTENfRElPX0dBVF9SRVNFUlZFRDcKKwl9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0NPTUVESV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDAxMTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuYwpAQCAtMCwwICsxLDU5NyBAQAorLyoKKyAgICBjb21lZGkvY29tZWRpX2NvbXBhdDMyLmMKKyAgICAzMi1iaXQgaW9jdGwgY29tcGF0aWJpbGl0eSBmb3IgNjQtYml0IGNvbWVkaSBrZXJuZWwgbW9kdWxlLgorCisgICAgQXV0aG9yOiBJYW4gQWJib3R0LCBNRVYgTHRkLiA8YWJib3R0aUBtZXYuY28udWs+CisgICAgQ29weXJpZ2h0IChDKSAyMDA3IE1FViBMdGQuIDxodHRwOi8vd3d3Lm1ldi5jby51ay8+CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDcgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgImNvbWVkaS5oIgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImNvbWVkaV9jb21wYXQzMi5oIgorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisjaWZuZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgkvKiBmb3IgKHVuKXJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbiAqLworI2VuZGlmCisKKyNkZWZpbmUgQ09NRURJMzJfQ0hBTklORk8gX0lPUihDSU8sMyxjb21lZGkzMl9jaGFuaW5mbykKKyNkZWZpbmUgQ09NRURJMzJfUkFOR0VJTkZPIF9JT1IoQ0lPLDgsY29tZWRpMzJfcmFuZ2VpbmZvKQorLyogTi5CLiBDT01FREkzMl9DTUQgYW5kIENPTUVESV9DTUQgb3VnaHQgdG8gdXNlIF9JT1dSLCBub3QgX0lPUi4KKyAqIEl0J3MgdG9vIGxhdGUgdG8gY2hhbmdlIGl0IG5vdywgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUgY29tbWFuZCBudW1iZXIuICovCisjZGVmaW5lIENPTUVESTMyX0NNRCBfSU9SKENJTyw5LGNvbWVkaTMyX2NtZCkKKy8qIE4uQi4gQ09NRURJMzJfQ01EVEVTVCBhbmQgQ09NRURJX0NNRFRFU1Qgb3VnaHQgdG8gdXNlIF9JT1dSLCBub3QgX0lPUi4KKyAqIEl0J3MgdG9vIGxhdGUgdG8gY2hhbmdlIGl0IG5vdywgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUgY29tbWFuZCBudW1iZXIuICovCisjZGVmaW5lIENPTUVESTMyX0NNRFRFU1QgX0lPUihDSU8sMTAsY29tZWRpMzJfY21kKQorI2RlZmluZSBDT01FREkzMl9JTlNOTElTVCBfSU9SKENJTywxMSxjb21lZGkzMl9pbnNubGlzdCkKKyNkZWZpbmUgQ09NRURJMzJfSU5TTiBfSU9SKENJTywxMixjb21lZGkzMl9pbnNuKQorCit0eXBlZGVmIHN0cnVjdCBjb21lZGkzMl9jaGFuaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJY29tcGF0X3VwdHJfdCBtYXhkYXRhX2xpc3Q7CS8qIDMyLWJpdCAnbHNhbXBsX3QgKicgKi8KKwljb21wYXRfdXB0cl90IGZsYWdsaXN0OwkJLyogMzItYml0ICd1bnNpZ25lZCBpbnQgKicgKi8KKwljb21wYXRfdXB0cl90IHJhbmdlbGlzdDsJLyogMzItYml0ICd1bnNpZ25lZCBpbnQgKicgKi8KKwl1bnNpZ25lZCBpbnQgdW51c2VkWzRdOworfSBjb21lZGkzMl9jaGFuaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpMzJfcmFuZ2VpbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHJhbmdlX3R5cGU7CisJY29tcGF0X3VwdHJfdCByYW5nZV9wdHI7CS8qIDMyLWJpdCAndm9pZCAqJyAqLworfSBjb21lZGkzMl9yYW5nZWluZm87CisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaTMyX2NtZF9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBzdGFydF9zcmM7CisJdW5zaWduZWQgaW50IHN0YXJ0X2FyZzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9iZWdpbl9zcmM7CisJdW5zaWduZWQgaW50IHNjYW5fYmVnaW5fYXJnOworCXVuc2lnbmVkIGludCBjb252ZXJ0X3NyYzsKKwl1bnNpZ25lZCBpbnQgY29udmVydF9hcmc7CisJdW5zaWduZWQgaW50IHNjYW5fZW5kX3NyYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9lbmRfYXJnOworCXVuc2lnbmVkIGludCBzdG9wX3NyYzsKKwl1bnNpZ25lZCBpbnQgc3RvcF9hcmc7CisJY29tcGF0X3VwdHJfdCBjaGFubGlzdDsJCS8qIDMyLWJpdCAndW5zaWduZWQgaW50IConICovCisJdW5zaWduZWQgaW50IGNoYW5saXN0X2xlbjsKKwljb21wYXRfdXB0cl90IGRhdGE7CQkvKiAzMi1iaXQgJ3NhbXBsX3QgKicgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47Cit9IGNvbWVkaTMyX2NtZDsKKwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpMzJfaW5zbl9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBpbnNuOworCXVuc2lnbmVkIGludCBuOworCWNvbXBhdF91cHRyX3QgZGF0YTsJCS8qIDMyLWJpdCAnbHNhbXBsX3QgKicgKi8KKwl1bnNpZ25lZCBpbnQgc3ViZGV2OworCXVuc2lnbmVkIGludCBjaGFuc3BlYzsKKwl1bnNpZ25lZCBpbnQgdW51c2VkWzNdOworfSBjb21lZGkzMl9pbnNuOworCit0eXBlZGVmIHN0cnVjdCBjb21lZGkzMl9pbnNubGlzdF9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBuX2luc25zOworCWNvbXBhdF91cHRyX3QgaW5zbnM7CQkvKiAzMi1iaXQgJ2NvbWVkaV9pbnNuIConICovCit9IGNvbWVkaTMyX2luc25saXN0OworCisvKiBIYW5kbGUgdHJhbnNsYXRlZCBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgdHJhbnNsYXRlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKCFmaWxlLT5mX29wKSB7CisJCXJldHVybiAtRU5PVFRZOworCX0KKyNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCisJaWYgKGZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKSB7CisJCWludCByYyA9IChpbnQpKCpmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkoZmlsZSwgY21kLCBhcmcpOworCQlpZiAocmMgPT0gLUVOT0lPQ1RMQ01EKSB7CisJCQlyYyA9IC1FTk9UVFk7CisJCX0KKwkJcmV0dXJuIHJjOworCX0KKyNlbmRpZgorCWlmIChmaWxlLT5mX29wLT5pb2N0bCkgeworCQlpbnQgcmM7CisJCWxvY2tfa2VybmVsKCk7CisJCXJjID0gKCpmaWxlLT5mX29wLT5pb2N0bCkoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQkJZmlsZSwgY21kLCBhcmcpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0NIQU5JTkZPIGlvY3RsLiAqLworc3RhdGljIGludCBjb21wYXRfY2hhbmluZm8oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNvbWVkaV9jaGFuaW5mbyBfX3VzZXIgKmNoYW5pbmZvOworCWNvbWVkaTMyX2NoYW5pbmZvIF9fdXNlciAqY2hhbmluZm8zMjsKKwlpbnQgZXJyOworCXVuaW9uIHsKKwkJdW5zaWduZWQgaW50IHVpbnQ7CisJCWNvbXBhdF91cHRyX3QgdXB0cjsKKwl9IHRlbXA7CisKKwljaGFuaW5mbzMyID0gY29tcGF0X3B0cihhcmcpOworCWNoYW5pbmZvID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjaGFuaW5mbykpOworCisJLyogQ29weSBjaGFuaW5mbyBzdHJ1Y3R1cmUuICBJZ25vcmUgdW51c2VkIG1lbWJlcnMuICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGNoYW5pbmZvMzIsIHNpemVvZigqY2hhbmluZm8zMikpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgY2hhbmluZm8sCisJCQkJc2l6ZW9mKCpjaGFuaW5mbykpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwllcnIgPSAwOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNoYW5pbmZvMzItPnN1YmRldik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY2hhbmluZm8tPnN1YmRldik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmY2hhbmluZm8zMi0+bWF4ZGF0YV9saXN0KTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZjaGFuaW5mby0+bWF4ZGF0YV9saXN0KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjaGFuaW5mbzMyLT5mbGFnbGlzdCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY29tcGF0X3B0cih0ZW1wLnVwdHIpLCAmY2hhbmluZm8tPmZsYWdsaXN0KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjaGFuaW5mbzMyLT5yYW5nZWxpc3QpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmNoYW5pbmZvLT5yYW5nZWxpc3QpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX0NIQU5JTkZPLCAodW5zaWduZWQgbG9uZyljaGFuaW5mbyk7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX1JBTkdFSU5GTyBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgY29tcGF0X3JhbmdlaW5mbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX3JhbmdlaW5mbyBfX3VzZXIgKnJhbmdlaW5mbzsKKwljb21lZGkzMl9yYW5nZWluZm8gX191c2VyICpyYW5nZWluZm8zMjsKKwlpbnQgZXJyOworCXVuaW9uIHsKKwkJdW5zaWduZWQgaW50IHVpbnQ7CisJCWNvbXBhdF91cHRyX3QgdXB0cjsKKwl9IHRlbXA7CisKKwlyYW5nZWluZm8zMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwlyYW5nZWluZm8gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJhbmdlaW5mbykpOworCisJLyogQ29weSByYW5nZWluZm8gc3RydWN0dXJlLiAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCByYW5nZWluZm8zMiwgc2l6ZW9mKCpyYW5nZWluZm8zMikpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmFuZ2VpbmZvLAorCQkJCXNpemVvZigqcmFuZ2VpbmZvKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciA9IDA7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmcmFuZ2VpbmZvMzItPnJhbmdlX3R5cGUpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJnJhbmdlaW5mby0+cmFuZ2VfdHlwZSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmcmFuZ2VpbmZvMzItPnJhbmdlX3B0cik7CisJZXJyIHw9IF9fcHV0X3VzZXIoY29tcGF0X3B0cih0ZW1wLnVwdHIpLCAmcmFuZ2VpbmZvLT5yYW5nZV9wdHIpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX1JBTkdFSU5GTywKKwkJCSh1bnNpZ25lZCBsb25nKXJhbmdlaW5mbyk7Cit9CisKKy8qIENvcHkgMzItYml0IGNtZCBzdHJ1Y3R1cmUgdG8gbmF0aXZlIGNtZCBzdHJ1Y3R1cmUuICovCitzdGF0aWMgaW50IGdldF9jb21wYXRfY21kKGNvbWVkaV9jbWQgX191c2VyICpjbWQsCisJCWNvbWVkaTMyX2NtZCBfX3VzZXIgKmNtZDMyKQoreworCWludCBlcnI7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgdWludDsKKwkJY29tcGF0X3VwdHJfdCB1cHRyOworCX0gdGVtcDsKKworCS8qIENvcHkgY21kIHN0cnVjdHVyZS4gKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY21kMzIsIHNpemVvZigqY21kMzIpKQorCQkJfHwgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGNtZCwgc2l6ZW9mKCpjbWQpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyID0gMDsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c3ViZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnN1YmRldik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPmZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPmZsYWdzKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c3RhcnRfc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnN0YXJ0X2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zdGFydF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnNjYW5fYmVnaW5fYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+Y29udmVydF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5jb252ZXJ0X2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5jb252ZXJ0X2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnNjYW5fZW5kX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zY2FuX2VuZF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zY2FuX2VuZF9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c2Nhbl9lbmRfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c3RvcF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zdG9wX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zdG9wX2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmY21kMzItPmNoYW5saXN0KTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZjbWQtPmNoYW5saXN0KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmY21kMzItPmRhdGEpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmNtZC0+ZGF0YSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPmRhdGFfbGVuKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPmRhdGFfbGVuKTsKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIENvcHkgbmF0aXZlIGNtZCBzdHJ1Y3R1cmUgdG8gMzItYml0IGNtZCBzdHJ1Y3R1cmUuICovCitzdGF0aWMgaW50IHB1dF9jb21wYXRfY21kKGNvbWVkaTMyX2NtZCBfX3VzZXIgKmNtZDMyLCBjb21lZGlfY21kIF9fdXNlciAqY21kKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwkvKiBDb3B5IGJhY2sgbW9zdCBvZiBjbWQgc3RydWN0dXJlLiAqLworCS8qIEFzc3VtZSB0aGUgcG9pbnRlciB2YWx1ZXMgYXJlIGFscmVhZHkgdmFsaWQuICovCisJLyogKENvdWxkIHVzZSBwdHJfdG9fY29tcGF0KCkgdG8gc2V0IHRoZW0sIGJ1dCB0aGF0IHdhc24ndCBpbXBsZW1lbnRlZAorCSAqIHVudGlsIGtlcm5lbCB2ZXJzaW9uIDIuNi4xMS4pICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGNtZCwgc2l6ZW9mKCpjbWQpKQorCQkJfHwgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGNtZDMyLCBzaXplb2YoKmNtZDMyKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciA9IDA7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c3ViZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnN1YmRldik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+ZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+ZmxhZ3MpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zdGFydF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnN0YXJ0X2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zdGFydF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zY2FuX2JlZ2luX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zY2FuX2JlZ2luX2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+Y29udmVydF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPmNvbnZlcnRfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPmNvbnZlcnRfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zY2FuX2VuZF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c2Nhbl9lbmRfc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zY2FuX2VuZF9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c2Nhbl9lbmRfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zdG9wX3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c3RvcF9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c3RvcF9hcmcpOworCS8qIEFzc3VtZSBjaGFubGlzdCBwb2ludGVyIGlzIHVuY2hhbmdlZC4gKi8KKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+Y2hhbmxpc3RfbGVuKTsKKwkvKiBBc3N1bWUgZGF0YSBwb2ludGVyIGlzIHVuY2hhbmdlZC4gKi8KKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5kYXRhX2xlbik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5kYXRhX2xlbik7CisJcmV0dXJuIGVyciA/IC1FRkFVTFQgOiAwOworfQorCisvKiBIYW5kbGUgMzItYml0IENPTUVESV9DTUQgaW9jdGwuICovCitzdGF0aWMgaW50IGNvbXBhdF9jbWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNvbWVkaV9jbWQgX191c2VyICpjbWQ7CisJY29tZWRpMzJfY21kIF9fdXNlciAqY21kMzI7CisJaW50IHJjOworCisJY21kMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJY21kID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjbWQpKTsKKworCXJjID0gZ2V0X2NvbXBhdF9jbWQoY21kLCBjbWQzMik7CisJaWYgKHJjKSB7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBDT01FRElfQ01ELCAodW5zaWduZWQgbG9uZyljbWQpOworfQorCisvKiBIYW5kbGUgMzItYml0IENPTUVESV9DTURURVNUIGlvY3RsLiAqLworc3RhdGljIGludCBjb21wYXRfY21kdGVzdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX2NtZCBfX3VzZXIgKmNtZDsKKwljb21lZGkzMl9jbWQgX191c2VyICpjbWQzMjsKKwlpbnQgcmMsIGVycjsKKworCWNtZDMyID0gY29tcGF0X3B0cihhcmcpOworCWNtZCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqY21kKSk7CisKKwlyYyA9IGdldF9jb21wYXRfY21kKGNtZCwgY21kMzIpOworCWlmIChyYykgeworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIENPTUVESV9DTURURVNULCAodW5zaWduZWQgbG9uZyljbWQpOworCWlmIChyYyA8IDApIHsKKwkJcmV0dXJuIHJjOworCX0KKworCWVyciA9IHB1dF9jb21wYXRfY21kKGNtZDMyLCBjbWQpOworCWlmIChlcnIpIHsKKwkJcmMgPSBlcnI7CisJfQorCXJldHVybiByYzsKK30KKworLyogQ29weSAzMi1iaXQgaW5zbiBzdHJ1Y3R1cmUgdG8gbmF0aXZlIGluc24gc3RydWN0dXJlLiAqLworc3RhdGljIGludCBnZXRfY29tcGF0X2luc24oY29tZWRpX2luc24gX191c2VyICppbnNuLAorCQljb21lZGkzMl9pbnNuIF9fdXNlciAqaW5zbjMyKQoreworCWludCBlcnI7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgdWludDsKKwkJY29tcGF0X3VwdHJfdCB1cHRyOworCX0gdGVtcDsKKworCS8qIENvcHkgaW5zbiBzdHJ1Y3R1cmUuICBJZ25vcmUgdGhlIHVudXNlZCBtZW1iZXJzLiAqLworCWVyciA9IDA7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGluc24zMiwgc2l6ZW9mKCppbnNuMzIpKQorCQkJfHwgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGluc24sIHNpemVvZigqaW5zbikpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuMzItPmluc24pOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmluc24tPmluc24pOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmluc24zMi0+bik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmaW5zbi0+bik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmaW5zbjMyLT5kYXRhKTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZpbnNuLT5kYXRhKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuMzItPnN1YmRldik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmaW5zbi0+c3ViZGV2KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuMzItPmNoYW5zcGVjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuLT5jaGFuc3BlYyk7CisJcmV0dXJuIGVyciA/IC1FRkFVTFQgOiAwOworfQorCisvKiBIYW5kbGUgMzItYml0IENPTUVESV9JTlNOTElTVCBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgY29tcGF0X2luc25saXN0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY29tYmluZWRfaW5zbmxpc3QgeworCQljb21lZGlfaW5zbmxpc3QgaW5zbmxpc3Q7CisJCWNvbWVkaV9pbnNuIGluc25bMV07CisJfSBfX3VzZXIgKnM7CisJY29tZWRpMzJfaW5zbmxpc3QgX191c2VyICppbnNubGlzdDMyOworCWNvbWVkaTMyX2luc24gX191c2VyICppbnNuMzI7CisJY29tcGF0X3VwdHJfdCB1cHRyOworCXVuc2lnbmVkIGludCBuX2luc25zLCBuOworCWludCBlcnIsIHJjOworCisJaW5zbmxpc3QzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCS8qIEdldCAzMi1iaXQgaW5zbmxpc3Qgc3RydWN0dXJlLiAgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaW5zbmxpc3QzMiwgc2l6ZW9mKCppbnNubGlzdDMyKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciA9IDA7CisJZXJyIHw9IF9fZ2V0X3VzZXIobl9pbnNucywgJmluc25saXN0MzItPm5faW5zbnMpOworCWVyciB8PSBfX2dldF91c2VyKHVwdHIsICZpbnNubGlzdDMyLT5pbnNucyk7CisJaW5zbjMyID0gY29tcGF0X3B0cih1cHRyKTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIEFsbG9jYXRlIHVzZXIgbWVtb3J5IHRvIGNvcHkgaW5zbmxpc3QgYW5kIGluc25zIGludG8uICovCisJcyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG9mZnNldG9mKHN0cnVjdCBjb21iaW5lZF9pbnNubGlzdCwKKwkJCQlpbnNuW25faW5zbnNdKSk7CisKKwkvKiBTZXQgbmF0aXZlIGluc25saXN0IHN0cnVjdHVyZS4gKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICZzLT5pbnNubGlzdCwgc2l6ZW9mKHMtPmluc25saXN0KSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciB8PSBfX3B1dF91c2VyKG5faW5zbnMsICZzLT5pbnNubGlzdC5uX2luc25zKTsKKwllcnIgfD0gX19wdXRfdXNlcigmcy0+aW5zblswXSwgJnMtPmluc25saXN0Lmluc25zKTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIENvcHkgaW5zbiBzdHJ1Y3R1cmVzLiAqLworCWZvciAobiA9IDA7IG4gPCBuX2luc25zOyBuKyspIHsKKwkJcmMgPSBnZXRfY29tcGF0X2luc24oJnMtPmluc25bbl0sICZpbnNuMzJbbl0pOworCQlpZiAocmMpIHsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIENPTUVESV9JTlNOTElTVCwKKwkJCSh1bnNpZ25lZCBsb25nKSZzLT5pbnNubGlzdCk7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0lOU04gaW9jdGwuICovCitzdGF0aWMgaW50IGNvbXBhdF9pbnNuKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwljb21lZGlfaW5zbiBfX3VzZXIgKmluc247CisJY29tZWRpMzJfaW5zbiBfX3VzZXIgKmluc24zMjsKKwlpbnQgcmM7CisKKwlpbnNuMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJaW5zbiA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW5zbikpOworCisJcmMgPSBnZXRfY29tcGF0X2luc24oaW5zbiwgaW5zbjMyKTsKKwlpZiAocmMpIHsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIENPTUVESV9JTlNOLCAodW5zaWduZWQgbG9uZylpbnNuKTsKK30KKworLyogUHJvY2VzcyB1bnRyYW5zbGF0ZWQgaW9jdGwuICovCisvKiBSZXR1cm5zIC1FTk9JT0NUTENNRCBmb3IgdW5yZWNvZ25pc2VkIGlvY3RsIGNvZGVzLiAqLworc3RhdGljIGlubGluZSBpbnQgcmF3X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ09NRURJX0RFVkNPTkZJRzoKKwljYXNlIENPTUVESV9ERVZJTkZPOgorCWNhc2UgQ09NRURJX1NVQkRJTkZPOgorCWNhc2UgQ09NRURJX0JVRkNPTkZJRzoKKwljYXNlIENPTUVESV9CVUZJTkZPOgorCQkvKiBKdXN0IG5lZWQgdG8gdHJhbnNsYXRlIHRoZSBwb2ludGVyIGFyZ3VtZW50LiAqLworCQlhcmcgPSAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZyk7CisJCXJjID0gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0xPQ0s6CisJY2FzZSBDT01FRElfVU5MT0NLOgorCWNhc2UgQ09NRURJX0NBTkNFTDoKKwljYXNlIENPTUVESV9QT0xMOgorCQkvKiBObyB0cmFuc2xhdGlvbiBuZWVkZWQuICovCisJCXJjID0gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJMzJfQ0hBTklORk86CisJCXJjID0gY29tcGF0X2NoYW5pbmZvKGZpbGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJMzJfUkFOR0VJTkZPOgorCQlyYyA9IGNvbXBhdF9yYW5nZWluZm8oZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9DTUQ6CisJCXJjID0gY29tcGF0X2NtZChmaWxlLCBhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESTMyX0NNRFRFU1Q6CisJCXJjID0gY29tcGF0X2NtZHRlc3QoZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9JTlNOTElTVDoKKwkJcmMgPSBjb21wYXRfaW5zbmxpc3QoZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9JTlNOOgorCQlyYyA9IGNvbXBhdF9pbnNuKGZpbGUsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgSEFWRV9DT01QQVRfSU9DVEwJLyogZGVmaW5lZCBpbiA8bGludXgvZnMuaD4gMi42LjExIG9ud2FyZHMgKi8KKworLyogY29tcGF0X2lvY3RsIGZpbGUgb3BlcmF0aW9uLiAqLworLyogUmV0dXJucyAtRU5PSU9DVExDTUQgZm9yIHVucmVjb2duaXNlZCBpb2N0bCBjb2Rlcy4gKi8KK2xvbmcgY29tZWRpX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHJhd19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Cit9CisKKyNlbHNlIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCisKKy8qCisgKiBCcmFpbi1kZWFkIGlvY3RsIGNvbXBhdGliaWxpdHkgZm9yIDIuNi4xMCBhbmQgZWFybGllci4KKyAqCisgKiBJdCdzIGJyYWluLWRlYWQgYmVjYXVzZSBjbWQgbnVtYmVycyBuZWVkIHRvIGJlIHVuaXF1ZSBzeXN0ZW0td2lkZSEKKyAqIFRoZSBjb21lZGkgZHJpdmVyIGNvdWxkIGVuZCB1cCBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgaW9jdGxzIGZvciBub24tQ29tZWRpCisgKiBkZXZpY2VzIGJlY2F1c2UgaXQgcmVnaXN0ZXJlZCB0aGUgc3lzdGVtLXdpZGUgY21kIGNvZGUgZmlyc3QuICBTaW1pbGFybHksCisgKiBhbm90aGVyIGRyaXZlciBjb3VsZCBlbmQgdXAgYXR0ZW1wdGluZyB0byBleGVjdXRlIGlvY3RscyBmb3IgYSBDb21lZGkKKyAqIGRldmljZSBiZWNhdXNlIGl0IHJlZ2lzdGVyZWQgdGhlIGNtZCBjb2RlIGZpcnN0LiAgQ2hhb3MgZW5zdWVzLgorICovCisKKy8qIEhhbmRsZXIgZm9yIGFsbCAzMi1iaXQgaW9jdGwgY29kZXMgcmVnaXN0ZXJlZCBieSB0aGlzIGRyaXZlci4gKi8KK3N0YXRpYyBpbnQgbWFwcGVkX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCXN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByYzsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgQ29tZWRpIGRldmljZS4gKi8KKwlpZiAoaW1ham9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAhPSBDT01FRElfTUFKT1IpIHsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCXJjID0gcmF3X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkvKiBEbyBub3QgcmV0dXJuIC1FTk9JT0NUTENNRC4gKi8KKwlpZiAocmMgPT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJjID0gLUVOT1RUWTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgaW9jdGwzMl9tYXAgeworCXVuc2lnbmVkIGludCBjbWQ7CisJaW50ICgqaGFuZGxlcikodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcsCisJCQlzdHJ1Y3QgZmlsZSAqKTsKKwlpbnQgcmVnaXN0ZXJlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW9jdGwzMl9tYXAgY29tZWRpX2lvY3RsMzJfbWFwW10gPSB7CisJeyBDT01FRElfREVWQ09ORklHLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9ERVZJTkZPLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9TVUJESU5GTywgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FRElfQlVGQ09ORklHLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9CVUZJTkZPLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9MT0NLLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9VTkxPQ0ssIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX0NBTkNFTCwgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FRElfUE9MTCwgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9DSEFOSU5GTywgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9SQU5HRUlORk8sIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJMzJfQ01ELCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESTMyX0NNRFRFU1QsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJMzJfSU5TTkxJU1QsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJMzJfSU5TTiwgbWFwcGVkX2lvY3RsLCAwIH0sCit9OworCisjZGVmaW5lIE5VTV9JT0NUTDMyX01BUFMgQVJSQVlfU0laRShjb21lZGlfaW9jdGwzMl9tYXApCisKKy8qIFJlZ2lzdGVyIHN5c3RlbS13aWRlIDMyLWJpdCBpb2N0bCBoYW5kbGVycy4gKi8KK3ZvaWQgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIodm9pZCkKK3sKKwlpbnQgbiwgcmM7CisKKwlmb3IgKG4gPSAwOyBuIDwgTlVNX0lPQ1RMMzJfTUFQUzsgbisrKSB7CisJCXJjID0gcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKGNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQsCisJCQkJY29tZWRpX2lvY3RsMzJfbWFwW25dLmhhbmRsZXIpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJImNvbWVkaTogZmFpbGVkIHRvIHJlZ2lzdGVyIDMyLWJpdCAiCisJCQkJCSJjb21wYXRpYmxlIGlvY3RsIGhhbmRsZXIgZm9yIDB4JVggLSAiCisJCQkJCSJleHBlY3QgYmFkIHRoaW5ncyB0byBoYXBwZW4hXG4iLAorCQkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0uY21kKTsKKwkJfQorCQljb21lZGlfaW9jdGwzMl9tYXBbbl0ucmVnaXN0ZXJlZCA9ICFyYzsKKwl9Cit9CisKKy8qIFVucmVnaXN0ZXIgc3lzdGVtLXdpZGUgMzItYml0IGlvY3RsIHRyYW5zbGF0aW9ucy4gKi8KK3ZvaWQgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMih2b2lkKQoreworCWludCBuLCByYzsKKworCWZvciAobiA9IDA7IG4gPCBOVU1fSU9DVEwzMl9NQVBTOyBuKyspIHsKKwkJaWYgKGNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkKSB7CisJCQlyYyA9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKAorCQkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0uY21kLAorCQkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0uaGFuZGxlcik7CisJCQlpZiAocmMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaTogZmFpbGVkIHRvIHVucmVnaXN0ZXIgMzItYml0ICIKKwkJCQkJImNvbXBhdGlibGUgaW9jdGwgaGFuZGxlciBmb3IgMHglWCAtICIKKwkJCQkJImV4cGVjdCBrZXJuZWwgT29wcyFcbiIsCisJCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQpOworCQkJfSBlbHNlIHsKKwkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0ucmVnaXN0ZXJlZCA9IDA7CisJCQl9CisJCX0KKwl9Cit9CisKKyNlbmRpZgkvKiBIQVZFX0NPTVBBVF9JT0NUTCAqLworCisjZW5kaWYJLyogQ09ORklHX0NPTVBBVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhMDE2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAgICBjb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKKyAgICAzMi1iaXQgaW9jdGwgY29tcGF0aWJpbGl0eSBmb3IgNjQtYml0IGNvbWVkaSBrZXJuZWwgbW9kdWxlLgorCisgICAgQXV0aG9yOiBJYW4gQWJib3R0LCBNRVYgTHRkLiA8YWJib3R0aUBtZXYuY28udWs+CisgICAgQ29weXJpZ2h0IChDKSAyMDA3IE1FViBMdGQuIDxodHRwOi8vd3d3Lm1ldi5jby51ay8+CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDcgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfQ09NRURJX0NPTVBBVDMyX0gKKyNkZWZpbmUgX0NPTUVESV9DT01QQVQzMl9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgkvKiBGb3IgSEFWRV9DT01QQVRfSU9DVEwgYW5kIEhBVkVfVU5MT0NLRURfSU9DVEwgKi8KKworI2lmZGVmIENPTkZJR19DT01QQVQKKworI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCisKK2V4dGVybiBsb25nIGNvbWVkaV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKTsKKyNkZWZpbmUgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQorCisjZWxzZSAvKiBIQVZFX0NPTVBBVF9JT0NUTCAqLworCisjZGVmaW5lIGNvbWVkaV9jb21wYXRfaW9jdGwgMAkvKiBOVUxMICovCitleHRlcm4gdm9pZCBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMih2b2lkKTsKK2V4dGVybiB2b2lkIGNvbWVkaV91bnJlZ2lzdGVyX2lvY3RsMzIodm9pZCk7CisKKyNlbmRpZiAvKiBIQVZFX0NPTVBBVF9JT0NUTCAqLworCisjZWxzZSAvKiBDT05GSUdfQ09NUEFUICovCisKKyNkZWZpbmUgY29tZWRpX2NvbXBhdF9pb2N0bCAwCS8qIE5VTEwgKi8KKyNkZWZpbmUgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCisjZW5kaWYgLyogX0NPTUVESV9DT01QQVQzMl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4Yzk2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpAQCAtMCwwICsxLDIyNDQgQEAKKy8qCisgICAgY29tZWRpL2NvbWVkaV9mb3BzLmMKKyAgICBjb21lZGkga2VybmVsIG1vZHVsZQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyN1bmRlZiBERUJVRworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSAiY29tZWRpX2ZvcHMuaCIKKyNpbmNsdWRlICJjb21lZGlfY29tcGF0MzIuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKy8qICNpbmNsdWRlICJrdm1lbS5oIiAqLworCitNT0RVTEVfQVVUSE9SKCJodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGNvcmUgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCitpbnQgY29tZWRpX2RlYnVnOworbW9kdWxlX3BhcmFtKGNvbWVkaV9kZWJ1ZywgaW50LCAwNjQ0KTsKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jayk7CitzdGF0aWMgc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvCisgICAgKmNvbWVkaV9maWxlX2luZm9fdGFibGVbQ09NRURJX05VTV9NSU5PUlNdOworCitzdGF0aWMgaW50IGRvX2RldmNvbmZpZ19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKmFyZyk7CitzdGF0aWMgaW50IGRvX2J1ZmNvbmZpZ19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50IGRvX2RldmluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2aW5mbyAqYXJnLAorCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fc3ViZGluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGluZm8gKmFyZywKKwkJCSAgICAgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX2NoYW5pbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2NoYW5pbmZvICphcmcpOworc3RhdGljIGludCBkb19idWZpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgZG9fY21kX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnLCB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fbG9ja19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb191bmxvY2tfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYXJnLCB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fY2FuY2VsX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX2NtZHRlc3RfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb19pbnNubGlzdF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX2luc25faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb19wb2xsX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN1YmQsIHZvaWQgKmZpbGUpOworCitleHRlcm4gdm9pZCBkb19iZWNvbWVfbm9uYnVzeShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCBkb19jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKTsKKworc3RhdGljIGludCBjb21lZGlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbik7CisKK3N0YXRpYyBpbnQgaXNfZGV2aWNlX2J1c3koY29tZWRpX2RldmljZSAqZGV2KTsKKworI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKK3N0YXRpYyBsb25nIGNvbWVkaV91bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQorI2Vsc2UKK3N0YXRpYyBpbnQgY29tZWRpX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjZW5kaWYKK3sKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisJaW50IHJjOworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisKKwkvKiBEZXZpY2UgY29uZmlnIGlzIHNwZWNpYWwsIGJlY2F1c2UgaXQgbXVzdCB3b3JrIG9uCisJICogYW4gdW5jb25maWd1cmVkIGRldmljZS4gKi8KKwlpZiAoY21kID09IENPTUVESV9ERVZDT05GSUcpIHsKKwkJcmMgPSBkb19kZXZjb25maWdfaW9jdGwoZGV2LCAodm9pZCAqKWFyZyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJRFBSSU5USygibm8gZHJpdmVyIGNvbmZpZ3VyZWQgb24gL2Rldi9jb21lZGklaVxuIiwgZGV2LT5taW5vcik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDT01FRElfQlVGQ09ORklHOgorCQlyYyA9IGRvX2J1ZmNvbmZpZ19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfREVWSU5GTzoKKwkJcmMgPSBkb19kZXZpbmZvX2lvY3RsKGRldiwgKHZvaWQgKilhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9TVUJESU5GTzoKKwkJcmMgPSBkb19zdWJkaW5mb19pb2N0bChkZXYsICh2b2lkICopYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfQ0hBTklORk86CisJCXJjID0gZG9fY2hhbmluZm9faW9jdGwoZGV2LCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX1JBTkdFSU5GTzoKKwkJcmMgPSBkb19yYW5nZWluZm9faW9jdGwoZGV2LCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0JVRklORk86CisJCXJjID0gZG9fYnVmaW5mb19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfTE9DSzoKKwkJcmMgPSBkb19sb2NrX2lvY3RsKGRldiwgYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfVU5MT0NLOgorCQlyYyA9IGRvX3VubG9ja19pb2N0bChkZXYsIGFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0NBTkNFTDoKKwkJcmMgPSBkb19jYW5jZWxfaW9jdGwoZGV2LCBhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9DTUQ6CisJCXJjID0gZG9fY21kX2lvY3RsKGRldiwgKHZvaWQgKilhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9DTURURVNUOgorCQlyYyA9IGRvX2NtZHRlc3RfaW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0lOU05MSVNUOgorCQlyYyA9IGRvX2luc25saXN0X2lvY3RsKGRldiwgKHZvaWQgKilhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9JTlNOOgorCQlyYyA9IGRvX2luc25faW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX1BPTEw6CisJCXJjID0gZG9fcG9sbF9pb2N0bChkZXYsIGFyZywgZmlsZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT1RUWTsKKwkJYnJlYWs7CisJfQorCitkb25lOgorCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJcmV0dXJuIHJjOworfQorCisvKgorCUNPTUVESV9ERVZDT05GSUcKKwlkZXZpY2UgY29uZmlnIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gZGV2Y29uZmlnIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCWRldmNvbmZpZyBzdHJ1Y3R1cmUgYXQgYXJnCisKKwl3cml0ZXM6CisJCW5vbmUKKyovCitzdGF0aWMgaW50IGRvX2RldmNvbmZpZ19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKmFyZykKK3sKKwljb21lZGlfZGV2Y29uZmlnIGl0OworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciAqYXV4X2RhdGEgPSBOVUxMOworCWludCBhdXhfbGVuOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGFyZyA9PSBOVUxMKSB7CisJCWlmIChpc19kZXZpY2VfYnVzeShkZXYpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKGRldi0+YXR0YWNoZWQpIHsKKwkJCXN0cnVjdCBtb2R1bGUgKmRyaXZlcl9tb2R1bGUgPSBkZXYtPmRyaXZlci0+bW9kdWxlOworCQkJY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCW1vZHVsZV9wdXQoZHJpdmVyX21vZHVsZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpdCwgYXJnLCBzaXplb2YoY29tZWRpX2RldmNvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWl0LmJvYXJkX25hbWVbQ09NRURJX05BTUVMRU4gLSAxXSA9IDA7CisKKwlpZiAoY29tZWRpX2F1eF9kYXRhKGl0Lm9wdGlvbnMsIDApICYmCisJICAgIGl0Lm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RIXSkgeworCQlpbnQgYml0X3NoaWZ0OworCQlhdXhfbGVuID0gaXQub3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdOworCQlpZiAoYXV4X2xlbiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlhdXhfZGF0YSA9IHZtYWxsb2MoYXV4X2xlbik7CisJCWlmICghYXV4X2RhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoYXV4X2RhdGEsCisJCQkJICAgY29tZWRpX2F1eF9kYXRhKGl0Lm9wdGlvbnMsIDApLCBhdXhfbGVuKSkgeworCQkJdmZyZWUoYXV4X2RhdGEpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaXQub3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MT10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpYXV4X2RhdGE7CisJCWlmIChzaXplb2Yodm9pZCAqKSA+IHNpemVvZihpbnQpKSB7CisJCQliaXRfc2hpZnQgPSBzaXplb2YoaW50KSAqIDg7CisJCQlpdC5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0hJXSA9CisJCQkgICAgKCh1bnNpZ25lZCBsb25nKWF1eF9kYXRhKSA+PiBiaXRfc2hpZnQ7CisJCX0gZWxzZQorCQkJaXQub3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9ISV0gPSAwOworCX0KKworCXJldCA9IGNvbWVkaV9kZXZpY2VfYXR0YWNoKGRldiwgJml0KTsKKwlpZiAocmV0ID09IDApIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRyaXZlci0+bW9kdWxlKSkgeworCQkJY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCXJldHVybiAtRU5PU1lTOworCQl9CisJfQorCisJaWYgKGF1eF9kYXRhKQorCQl2ZnJlZShhdXhfZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9CVUZDT05GSUcKKwlidWZmZXIgY29uZmlndXJhdGlvbiBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIGJ1ZmNvbmZpZyBzdHJ1Y3R1cmUKKworCXJlYWRzOgorCQlidWZjb25maWcgYXQgYXJnCisKKwl3cml0ZXM6CisJCW1vZGlmaWVkIGJ1ZmNvbmZpZyBhdCBhcmcKKworKi8KK3N0YXRpYyBpbnQgZG9fYnVmY29uZmlnX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKQoreworCWNvbWVkaV9idWZjb25maWcgYmM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiYywgYXJnLCBzaXplb2YoY29tZWRpX2J1ZmNvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChiYy5zdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMgfHwgYmMuc3ViZGV2aWNlIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgYmMuc3ViZGV2aWNlOworCWFzeW5jID0gcy0+YXN5bmM7CisKKwlpZiAoIWFzeW5jKSB7CisJCURQUklOVEsoInN1YmRldmljZSBkb2VzIG5vdCBoYXZlIGFzeW5jIGNhcGFiaWxpdHlcbiIpOworCQliYy5zaXplID0gMDsKKwkJYmMubWF4aW11bV9zaXplID0gMDsKKwkJZ290byBjb3B5YmFjazsKKwl9CisKKwlpZiAoYmMubWF4aW11bV9zaXplKSB7CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJYXN5bmMtPm1heF9idWZzaXplID0gYmMubWF4aW11bV9zaXplOworCX0KKworCWlmIChiYy5zaXplKSB7CisJCWlmIChiYy5zaXplID4gYXN5bmMtPm1heF9idWZzaXplKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAocy0+YnVzeSkgeworCQkJRFBSSU5USygic3ViZGV2aWNlIGlzIGJ1c3ksIGNhbm5vdCByZXNpemUgYnVmZmVyXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaWYgKGFzeW5jLT5tbWFwX2NvdW50KSB7CisJCQlEUFJJTlRLKCJzdWJkZXZpY2UgaXMgbW1hcHBlZCwgY2Fubm90IHJlc2l6ZSBidWZmZXJcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCWlmICghYXN5bmMtPnByZWFsbG9jX2J1ZikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIG1ha2Ugc3VyZSBidWZmZXIgaXMgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHBhZ2VzCisJCSAqICh3ZSByb3VuZCB1cCkgKi8KKwkJYmMuc2l6ZSA9IChiYy5zaXplICsgUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0s7CisKKwkJcmV0ID0gY29tZWRpX2J1Zl9hbGxvYyhkZXYsIHMsIGJjLnNpemUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHMtPmJ1Zl9jaGFuZ2UpIHsKKwkJCXJldCA9IHMtPmJ1Zl9jaGFuZ2UoZGV2LCBzLCBiYy5zaXplKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlEUFJJTlRLKCJjb21lZGklaSBzdWJkICVkIGJ1ZmZlciByZXNpemVkIHRvICVpIGJ5dGVzXG4iLAorCQkJZGV2LT5taW5vciwgYmMuc3ViZGV2aWNlLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOworCX0KKworCWJjLnNpemUgPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJYmMubWF4aW11bV9zaXplID0gYXN5bmMtPm1heF9idWZzaXplOworCitjb3B5YmFjazoKKwlpZiAoY29weV90b191c2VyKGFyZywgJmJjLCBzaXplb2YoY29tZWRpX2J1ZmNvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorCUNPTUVESV9ERVZJTkZPCisJZGV2aWNlIGluZm8gaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBkZXZpbmZvIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJZGV2aW5mbyBzdHJ1Y3R1cmUKKworKi8KK3N0YXRpYyBpbnQgZG9fZGV2aW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZpbmZvICphcmcsCisJCQkgICAgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY29tZWRpX2RldmluZm8gZGV2aW5mbzsKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfc3ViZGV2aWNlICpyZWFkX3N1YmRldiA9CisJICAgIGNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisJY29tZWRpX3N1YmRldmljZSAqd3JpdGVfc3ViZGV2ID0KKwkgICAgY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisKKwltZW1zZXQoJmRldmluZm8sIDAsIHNpemVvZihkZXZpbmZvKSk7CisKKwkvKiBmaWxsIGRldmluZm8gc3RydWN0dXJlICovCisJZGV2aW5mby52ZXJzaW9uX2NvZGUgPSBDT01FRElfVkVSU0lPTl9DT0RFOworCWRldmluZm8ubl9zdWJkZXZzID0gZGV2LT5uX3N1YmRldmljZXM7CisJbWVtY3B5KGRldmluZm8uZHJpdmVyX25hbWUsIGRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwgQ09NRURJX05BTUVMRU4pOworCW1lbWNweShkZXZpbmZvLmJvYXJkX25hbWUsIGRldi0+Ym9hcmRfbmFtZSwgQ09NRURJX05BTUVMRU4pOworCisJaWYgKHJlYWRfc3ViZGV2KQorCQlkZXZpbmZvLnJlYWRfc3ViZGV2aWNlID0gcmVhZF9zdWJkZXYgLSBkZXYtPnN1YmRldmljZXM7CisJZWxzZQorCQlkZXZpbmZvLnJlYWRfc3ViZGV2aWNlID0gLTE7CisKKwlpZiAod3JpdGVfc3ViZGV2KQorCQlkZXZpbmZvLndyaXRlX3N1YmRldmljZSA9IHdyaXRlX3N1YmRldiAtIGRldi0+c3ViZGV2aWNlczsKKwllbHNlCisJCWRldmluZm8ud3JpdGVfc3ViZGV2aWNlID0gLTE7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmRldmluZm8sIHNpemVvZihjb21lZGlfZGV2aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorCUNPTUVESV9TVUJESU5GTworCXN1YmRldmljZSBpbmZvIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gYXJyYXkgb2Ygc3ViZGV2aWNlIGluZm8gc3RydWN0dXJlcworCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJYXJyYXkgb2Ygc3ViZGV2aWNlIGluZm8gc3RydWN0dXJlcyBhdCBhcmcKKworKi8KK3N0YXRpYyBpbnQgZG9fc3ViZGluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGluZm8gKmFyZywKKwkJCSAgICAgdm9pZCAqZmlsZSkKK3sKKwlpbnQgcmV0LCBpOworCWNvbWVkaV9zdWJkaW5mbyAqdG1wLCAqdXM7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCXRtcCA9IGtjYWxsb2MoZGV2LT5uX3N1YmRldmljZXMsIHNpemVvZihjb21lZGlfc3ViZGluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBmaWxsIHN1YmRpbmZvIHN0cnVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKKwkJdXMgPSB0bXAgKyBpOworCisJCXVzLT50eXBlID0gcy0+dHlwZTsKKwkJdXMtPm5fY2hhbiA9IHMtPm5fY2hhbjsKKwkJdXMtPnN1YmRfZmxhZ3MgPSBzLT5zdWJkZXZfZmxhZ3M7CisJCWlmIChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIFNSRl9SVU5OSU5HKQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX1JVTk5JTkc7CisjZGVmaW5lIFRJTUVSX25hbm9zZWMgNQkJLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKwkJdXMtPnRpbWVyX3R5cGUgPSBUSU1FUl9uYW5vc2VjOworCQl1cy0+bGVuX2NoYW5saXN0ID0gcy0+bGVuX2NoYW5saXN0OworCQl1cy0+bWF4ZGF0YSA9IHMtPm1heGRhdGE7CisJCWlmIChzLT5yYW5nZV90YWJsZSkgeworCQkJdXMtPnJhbmdlX3R5cGUgPQorCQkJICAgIChpIDw8IDI0KSB8ICgwIDw8IDE2KSB8IChzLT5yYW5nZV90YWJsZS0+bGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCXVzLT5yYW5nZV90eXBlID0gMDsJLyogWFhYICovCisJCX0KKwkJdXMtPmZsYWdzID0gcy0+ZmxhZ3M7CisKKwkJaWYgKHMtPmJ1c3kpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfQlVTWTsKKwkJaWYgKHMtPmJ1c3kgPT0gZmlsZSkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9CVVNZX09XTkVSOworCQlpZiAocy0+bG9jaykKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9MT0NLRUQ7CisJCWlmIChzLT5sb2NrID09IGZpbGUpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfTE9DS19PV05FUjsKKwkJaWYgKCFzLT5tYXhkYXRhICYmIHMtPm1heGRhdGFfbGlzdCkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9NQVhEQVRBOworCQlpZiAocy0+ZmxhZ2xpc3QpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfRkxBR1M7CisJCWlmIChzLT5yYW5nZV90YWJsZV9saXN0KQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX1JBTkdFVFlQRTsKKwkJaWYgKHMtPmRvX2NtZCkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9DTUQ7CisKKwkJaWYgKHMtPmluc25fYml0cyAhPSAmaW5zbl9pbnZhbCkKKwkJCXVzLT5pbnNuX2JpdHNfc3VwcG9ydCA9IENPTUVESV9TVVBQT1JURUQ7CisJCWVsc2UKKwkJCXVzLT5pbnNuX2JpdHNfc3VwcG9ydCA9IENPTUVESV9VTlNVUFBPUlRFRDsKKworCQl1cy0+c2V0dGxpbmdfdGltZV8wID0gcy0+c2V0dGxpbmdfdGltZV8wOworCX0KKworCXJldCA9IGNvcHlfdG9fdXNlcihhcmcsIHRtcCwKKwkJCSAgIGRldi0+bl9zdWJkZXZpY2VzICogc2l6ZW9mKGNvbWVkaV9zdWJkaW5mbykpOworCisJa2ZyZWUodG1wKTsKKworCXJldHVybiByZXQgPyAtRUZBVUxUIDogMDsKK30KKworLyoKKwlDT01FRElfQ0hBTklORk8KKwlzdWJkZXZpY2UgaW5mbyBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIGNoYW5pbmZvIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCWNoYW5pbmZvIHN0cnVjdHVyZSBhdCBhcmcKKworCXdyaXRlczoKKwkJYXJyYXlzIGF0IGVsZW1lbnRzIG9mIGNoYW5pbmZvIHN0cnVjdHVyZQorCisqLworc3RhdGljIGludCBkb19jaGFuaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9jaGFuaW5mbyAqYXJnKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2NoYW5pbmZvIGl0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpdCwgYXJnLCBzaXplb2YoY29tZWRpX2NoYW5pbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGl0LnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGl0LnN1YmRldjsKKworCWlmIChpdC5tYXhkYXRhX2xpc3QpIHsKKwkJaWYgKHMtPm1heGRhdGEgfHwgIXMtPm1heGRhdGFfbGlzdCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV90b191c2VyKGl0Lm1heGRhdGFfbGlzdCwgcy0+bWF4ZGF0YV9saXN0LAorCQkJCSBzLT5uX2NoYW4gKiBzaXplb2YobHNhbXBsX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChpdC5mbGFnbGlzdCkgeworCQlpZiAoIXMtPmZsYWdsaXN0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X3RvX3VzZXIoaXQuZmxhZ2xpc3QsIHMtPmZsYWdsaXN0LAorCQkJCSBzLT5uX2NoYW4gKiBzaXplb2YodW5zaWduZWQgaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoaXQucmFuZ2VsaXN0KSB7CisJCWludCBpOworCisJCWlmICghcy0+cmFuZ2VfdGFibGVfbGlzdCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmb3IgKGkgPSAwOyBpIDwgcy0+bl9jaGFuOyBpKyspIHsKKwkJCWludCB4OworCisJCQl4ID0gKGRldi0+bWlub3IgPDwgMjgpIHwgKGl0LnN1YmRldiA8PCAyNCkgfCAoaSA8PCAxNikgfAorCQkJICAgIChzLT5yYW5nZV90YWJsZV9saXN0W2ldLT5sZW5ndGgpOworCQkJcHV0X3VzZXIoeCwgaXQucmFuZ2VsaXN0ICsgaSk7CisJCX0KKyNpZiAwCisJCWlmIChjb3B5X3RvX3VzZXIoaXQucmFuZ2VsaXN0LCBzLT5yYW5nZV90eXBlX2xpc3QsCisJCQkJIHMtPm5fY2hhbipzaXplb2YodW5zaWduZWQgaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworfQorCisgLyoKKyAgICBDT01FRElfQlVGSU5GTworICAgIGJ1ZmZlciBpbmZvcm1hdGlvbiBpb2N0bAorCisgICAgYXJnOgorICAgIHBvaW50ZXIgdG8gYnVmaW5mbyBzdHJ1Y3R1cmUKKworICAgIHJlYWRzOgorICAgIGJ1ZmluZm8gYXQgYXJnCisKKyAgICB3cml0ZXM6CisgICAgbW9kaWZpZWQgYnVmaW5mbyBhdCBhcmcKKworICAqLworc3RhdGljIGludCBkb19idWZpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKQoreworCWNvbWVkaV9idWZpbmZvIGJpOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmksIGFyZywgc2l6ZW9mKGNvbWVkaV9idWZpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGJpLnN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcyB8fCBiaS5zdWJkZXZpY2UgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBiaS5zdWJkZXZpY2U7CisJYXN5bmMgPSBzLT5hc3luYzsKKworCWlmICghYXN5bmMpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlIGRvZXMgbm90IGhhdmUgYXN5bmMgY2FwYWJpbGl0eVxuIik7CisJCWJpLmJ1Zl93cml0ZV9wdHIgPSAwOworCQliaS5idWZfcmVhZF9wdHIgPSAwOworCQliaS5idWZfd3JpdGVfY291bnQgPSAwOworCQliaS5idWZfcmVhZF9jb3VudCA9IDA7CisJCWdvdG8gY29weWJhY2s7CisJfQorCisJaWYgKGJpLmJ5dGVzX3JlYWQgJiYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfUkVBRCkpIHsKKwkJYmkuYnl0ZXNfcmVhZCA9IGNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgYmkuYnl0ZXNfcmVhZCk7CisJCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBiaS5ieXRlc19yZWFkKTsKKworCQlpZiAoIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIChTUkZfRVJST1IgfAorCQkJCQkJCSAgU1JGX1JVTk5JTkcpKQorCQkgICAgJiYgYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCA9PSBhc3luYy0+YnVmX3JlYWRfY291bnQpIHsKKwkJCWRvX2JlY29tZV9ub25idXN5KGRldiwgcyk7CisJCX0KKwl9CisKKwlpZiAoYmkuYnl0ZXNfd3JpdHRlbiAmJiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9XUklURSkpIHsKKwkJYmkuYnl0ZXNfd3JpdHRlbiA9CisJCSAgICBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBiaS5ieXRlc193cml0dGVuKTsKKwkJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBiaS5ieXRlc193cml0dGVuKTsKKwl9CisKKwliaS5idWZfd3JpdGVfY291bnQgPSBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworCWJpLmJ1Zl93cml0ZV9wdHIgPSBhc3luYy0+YnVmX3dyaXRlX3B0cjsKKwliaS5idWZfcmVhZF9jb3VudCA9IGFzeW5jLT5idWZfcmVhZF9jb3VudDsKKwliaS5idWZfcmVhZF9wdHIgPSBhc3luYy0+YnVmX3JlYWRfcHRyOworCitjb3B5YmFjazoKKwlpZiAoY29weV90b191c2VyKGFyZywgJmJpLCBzaXplb2YoY29tZWRpX2J1ZmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9pbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhLAorCQkgICAgICB2b2lkICpmaWxlKTsKKy8qCisgKiAJQ09NRURJX0lOU05MSVNUCisgKiAJc3luY2hyb25vdXMgaW5zdHJ1Y3Rpb25zCisgKgorICogCWFyZzoKKyAqIAkJcG9pbnRlciB0byBzeW5jIGNtZCBzdHJ1Y3R1cmUKKyAqCisgKiAJcmVhZHM6CisgKiAJCXN5bmMgY21kIHN0cnVjdCBhdCBhcmcKKyAqIAkJaW5zdHJ1Y3Rpb24gbGlzdAorICogCQlkYXRhIChmb3Igd3JpdGVzKQorICoKKyAqIAl3cml0ZXM6CisgKiAJCWRhdGEgKGZvciByZWFkcykKKyAqLworLyogYXJiaXRyYXJ5IGxpbWl0cyAqLworI2RlZmluZSBNQVhfU0FNUExFUyAyNTYKK3N0YXRpYyBpbnQgZG9faW5zbmxpc3RfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX2luc25saXN0IGluc25saXN0OworCWNvbWVkaV9pbnNuICppbnNucyA9IE5VTEw7CisJbHNhbXBsX3QgKmRhdGEgPSBOVUxMOworCWludCBpID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zbmxpc3QsIGFyZywgc2l6ZW9mKGNvbWVkaV9pbnNubGlzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihsc2FtcGxfdCkgKiBNQVhfU0FNUExFUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCURQUklOVEsoImttYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpbnNucyA9IGttYWxsb2Moc2l6ZW9mKGNvbWVkaV9pbnNuKSAqIGluc25saXN0Lm5faW5zbnMsIEdGUF9LRVJORUwpOworCWlmICghaW5zbnMpIHsKKwkJRFBSSU5USygia21hbGxvYyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihpbnNucywgaW5zbmxpc3QuaW5zbnMsCisJCQkgICBzaXplb2YoY29tZWRpX2luc24pICogaW5zbmxpc3Qubl9pbnNucykpIHsKKwkJRFBSSU5USygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbmxpc3Qubl9pbnNuczsgaSsrKSB7CisJCWlmIChpbnNuc1tpXS5uID4gTUFYX1NBTVBMRVMpIHsKKwkJCURQUklOVEsoIm51bWJlciBvZiBzYW1wbGVzIHRvbyBsYXJnZVxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAoaW5zbnNbaV0uaW5zbiAmIElOU05fTUFTS19XUklURSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGluc25zW2ldLmRhdGEsCisJCQkJCSAgIGluc25zW2ldLm4gKiBzaXplb2YobHNhbXBsX3QpKSkgeworCQkJCURQUklOVEsoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJCXJldCA9IHBhcnNlX2luc24oZGV2LCBpbnNucyArIGksIGRhdGEsIGZpbGUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmIChpbnNuc1tpXS5pbnNuICYgSU5TTl9NQVNLX1JFQUQpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoaW5zbnNbaV0uZGF0YSwgZGF0YSwKKwkJCQkJIGluc25zW2ldLm4gKiBzaXplb2YobHNhbXBsX3QpKSkgeworCQkJCURQUklOVEsoImNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlzY2hlZHVsZSgpOworCX0KKworZXJyb3I6CisJa2ZyZWUoaW5zbnMpOworCWtmcmVlKGRhdGEpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaW5zbl9jb25maWdfbGVuZ3RoKGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpZiAoaW5zbi0+biA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fT1VUUFVUOgorCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCWNhc2UgSU5TTl9DT05GSUdfRElTQVJNOgorCWNhc2UgSU5TTl9DT05GSUdfUkVTRVQ6CisJCWlmIChpbnNuLT5uID09IDEpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19BUk06CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJY2FzZSBJTlNOX0NPTkZJR19CTE9DS19TSVpFOgorCWNhc2UgSU5TTl9DT05GSUdfRklMVEVSOgorCWNhc2UgSU5TTl9DT05GSUdfU0VSSUFMX0NMT0NLOgorCWNhc2UgSU5TTl9DT05GSUdfQklESVJFQ1RJT05BTF9EQVRBOgorCWNhc2UgSU5TTl9DT05GSUdfQUxUX1NPVVJDRToKKwljYXNlIElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREU6CisJY2FzZSBJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTOgorCWNhc2UgSU5TTl9DT05GSUdfU0VUX1JPVVRJTkc6CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfUk9VVElORzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9QV01fU1RBVFVTOgorCWNhc2UgSU5TTl9DT05GSUdfUFdNX1NFVF9QRVJJT0Q6CisJY2FzZSBJTlNOX0NPTkZJR19QV01fR0VUX1BFUklPRDoKKwkJaWYgKGluc24tPm4gPT0gMikKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX1NFVF9HQVRFX1NSQzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9HQVRFX1NSQzoKKwljYXNlIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkM6CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfQ0xPQ0tfU1JDOgorCWNhc2UgSU5TTl9DT05GSUdfU0VUX09USEVSX1NSQzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9DT1VOVEVSX1NUQVRVUzoKKwljYXNlIElOU05fQ09ORklHX1BXTV9TRVRfSF9CUklER0U6CisJY2FzZSBJTlNOX0NPTkZJR19QV01fR0VUX0hfQlJJREdFOgorCWNhc2UgSU5TTl9DT05GSUdfR0VUX0hBUkRXQVJFX0JVRkZFUl9TSVpFOgorCQlpZiAoaW5zbi0+biA9PSAzKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfUFdNX09VVFBVVDoKKwljYXNlIElOU05fQ09ORklHX0FOQUxPR19UUklHOgorCQlpZiAoaW5zbi0+biA9PSA1KQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCS8qIGJ5IGRlZmF1bHQgd2UgYWxsb3cgdGhlIGluc24gc2luY2Ugd2UgZG9uJ3QgaGF2ZSBjaGVja3MgZm9yCisJICogYWxsIHBvc3NpYmxlIGNhc2VzIHlldCAqLworCWRlZmF1bHQ6CisJCXJ0X3ByaW50aygiY29tZWRpOiBubyBjaGVjayBmb3IgZGF0YSBsZW5ndGggb2YgY29uZmlnIGluc24gaWQgIgorCQkJICAiJWkgaXMgaW1wbGVtZW50ZWQuXG4iCisJCQkgICIgQWRkIGEgY2hlY2sgdG8gJXMgaW4gJXMuXG4iCisJCQkgICIgQXNzdW1pbmcgbj0laSBpcyBjb3JyZWN0LlxuIiwgZGF0YVswXSwgX19mdW5jX18sCisJCQkgIF9fRklMRV9fLCBpbnNuLT5uKTsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBwYXJzZV9pbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhLAorCQkgICAgICB2b2lkICpmaWxlKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAoaW5zbi0+aW5zbiAmIElOU05fTUFTS19TUEVDSUFMKSB7CisJCS8qIGEgbm9uLXN1YmRldmljZSBpbnN0cnVjdGlvbiAqLworCisJCXN3aXRjaCAoaW5zbi0+aW5zbikgeworCQljYXNlIElOU05fR1RPRDoKKwkJCXsKKwkJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQkJCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCQkJZGF0YVswXSA9IHR2LnR2X3NlYzsKKwkJCQlkYXRhWzFdID0gdHYudHZfdXNlYzsKKwkJCQlyZXQgPSAyOworCisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgSU5TTl9XQUlUOgorCQkJaWYgKGluc24tPm4gIT0gMSB8fCBkYXRhWzBdID49IDEwMDAwMCkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoZGF0YVswXSAvIDEwMDApOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fSU5UVFJJRzoKKwkJCWlmIChpbnNuLT5uICE9IDEpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGluc24tPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQkJCURQUklOVEsoIiVkIG5vdCB1c2FibGUgc3ViZGV2aWNlXG4iLAorCQkJCQlpbnNuLT5zdWJkZXYpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaW5zbi0+c3ViZGV2OworCQkJaWYgKCFzLT5hc3luYykgeworCQkJCURQUklOVEsoIm5vIGFzeW5jXG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzLT5hc3luYy0+aW50dHJpZykgeworCQkJCURQUklOVEsoIm5vIGludHRyaWdcbiIpOworCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBzLT5hc3luYy0+aW50dHJpZyhkZXYsIHMsIGluc24tPmRhdGFbMF0pOworCQkJaWYgKHJldCA+PSAwKQorCQkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoImludmFsaWQgaW5zblxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBhIHN1YmRldmljZSBpbnN0cnVjdGlvbiAqLworCQlsc2FtcGxfdCBtYXhkYXRhOworCisJCWlmIChpbnNuLT5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJCURQUklOVEsoInN1YmRldmljZSAlZCBvdXQgb2YgcmFuZ2VcbiIsIGluc24tPnN1YmRldik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGluc24tPnN1YmRldjsKKworCQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpIHsKKwkJCURQUklOVEsoIiVkIG5vdCB1c2FibGUgc3ViZGV2aWNlXG4iLCBpbnNuLT5zdWJkZXYpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogYXJlIHdlIGxvY2tlZD8gKGlvY3RsIGxvY2spICovCisJCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkgeworCQkJRFBSSU5USygiZGV2aWNlIGxvY2tlZFxuIik7CisJCQlyZXQgPSAtRUFDQ0VTOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBjaGVja19jaGFubGlzdChzLCAxLCAmaW5zbi0+Y2hhbnNwZWMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCURQUklOVEsoImJhZCBjaGFuc3BlY1xuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChzLT5idXN5KSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiBUaGlzIGxvb2tzIGFyYml0cmFyeS4gIEl0IGlzLiAqLworCQlzLT5idXN5ID0gJnBhcnNlX2luc247CisJCXN3aXRjaCAoaW5zbi0+aW5zbikgeworCQljYXNlIElOU05fUkVBRDoKKwkJCXJldCA9IHMtPmluc25fcmVhZChkZXYsIHMsIGluc24sIGRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9XUklURToKKwkJCW1heGRhdGEgPSBzLT5tYXhkYXRhX2xpc3QKKwkJCSAgICA/IHMtPm1heGRhdGFfbGlzdFtDUl9DSEFOKGluc24tPmNoYW5zcGVjKV0KKwkJCSAgICA6IHMtPm1heGRhdGE7CisJCQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgKytpKSB7CisJCQkJaWYgKGRhdGFbaV0gPiBtYXhkYXRhKSB7CisJCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJCURQUklOVEsoImJhZCBkYXRhIHZhbHVlKHMpXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldCA9IHMtPmluc25fd3JpdGUoZGV2LCBzLCBpbnNuLCBkYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fQklUUzoKKwkJCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0ID0gcy0+aW5zbl9iaXRzKGRldiwgcywgaW5zbiwgZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX0NPTkZJRzoKKwkJCXJldCA9IGNoZWNrX2luc25fY29uZmlnX2xlbmd0aChpbnNuLCBkYXRhKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlyZXQgPSBzLT5pbnNuX2NvbmZpZyhkZXYsIHMsIGluc24sIGRhdGEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlzLT5idXN5ID0gTlVMTDsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogCUNPTUVESV9JTlNOCisgKiAJc3luY2hyb25vdXMgaW5zdHJ1Y3Rpb25zCisgKgorICogCWFyZzoKKyAqIAkJcG9pbnRlciB0byBpbnNuCisgKgorICogCXJlYWRzOgorICogCQljb21lZGlfaW5zbiBzdHJ1Y3QgYXQgYXJnCisgKiAJCWRhdGEgKGZvciB3cml0ZXMpCisgKgorICogCXdyaXRlczoKKyAqIAkJZGF0YSAoZm9yIHJlYWRzKQorICovCitzdGF0aWMgaW50IGRvX2luc25faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX2luc24gaW5zbjsKKwlsc2FtcGxfdCAqZGF0YSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlkYXRhID0ga21hbGxvYyhzaXplb2YobHNhbXBsX3QpICogTUFYX1NBTVBMRVMsIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zbiwgYXJnLCBzaXplb2YoY29tZWRpX2luc24pKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFRoaXMgaXMgd2hlcmUgdGhlIGJlaGF2aW9yIG9mIGluc24gYW5kIGluc25saXN0IGRldmlhdGUuICovCisJaWYgKGluc24ubiA+IE1BWF9TQU1QTEVTKQorCQlpbnNuLm4gPSBNQVhfU0FNUExFUzsKKwlpZiAoaW5zbi5pbnNuICYgSU5TTl9NQVNLX1dSSVRFKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBpbnNuLmRhdGEsIGluc24ubiAqIHNpemVvZihsc2FtcGxfdCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlyZXQgPSBwYXJzZV9pbnNuKGRldiwgJmluc24sIGRhdGEsIGZpbGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChpbnNuLmluc24gJiBJTlNOX01BU0tfUkVBRCkgeworCQlpZiAoY29weV90b191c2VyKGluc24uZGF0YSwgZGF0YSwgaW5zbi5uICogc2l6ZW9mKGxzYW1wbF90KSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCXJldCA9IGluc24ubjsKKworZXJyb3I6CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9DTUQKKwljb21tYW5kIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gY21kIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCWNtZCBzdHJ1Y3R1cmUgYXQgYXJnCisJCWNoYW5uZWwvcmFuZ2UgbGlzdAorCisJd3JpdGVzOgorCQltb2RpZmllZCBjbWQgc3RydWN0dXJlIGF0IGFyZworCisqLworc3RhdGljIGludCBkb19jbWRfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX2NtZCB1c2VyX2NtZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50ICpjaGFubGlzdF9zYXZlciA9IE5VTEw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfY21kLCBhcmcsIHNpemVvZihjb21lZGlfY21kKSkpIHsKKwkJRFBSSU5USygiYmFkIGNtZCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8qIHNhdmUgdXNlcidzIGNoYW5saXN0IHBvaW50ZXIgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyICovCisJY2hhbmxpc3Rfc2F2ZXIgPSB1c2VyX2NtZC5jaGFubGlzdDsKKworCWlmICh1c2VyX2NtZC5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJRFBSSU5USygiJWQgbm8gc3VjaCBzdWJkZXZpY2VcbiIsIHVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyB1c2VyX2NtZC5zdWJkZXY7CisJYXN5bmMgPSBzLT5hc3luYzsKKworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgeworCQlEUFJJTlRLKCIlZCBub3QgdmFsaWQgc3ViZGV2aWNlXG4iLCB1c2VyX2NtZC5zdWJkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIXMtPmRvX2NtZCB8fCAhcy0+ZG9fY21kdGVzdCB8fCAhcy0+YXN5bmMpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlICVpIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZHNcbiIsCisJCQl1c2VyX2NtZC5zdWJkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBhcmUgd2UgbG9ja2VkPyAoaW9jdGwgbG9jaykgKi8KKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlIGxvY2tlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIGFyZSB3ZSBidXN5PyAqLworCWlmIChzLT5idXN5KSB7CisJCURQUklOVEsoInN1YmRldmljZSBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcy0+YnVzeSA9IGZpbGU7CisKKwkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIGxvbmcgKi8KKwlpZiAodXNlcl9jbWQuY2hhbmxpc3RfbGVuID4gcy0+bGVuX2NoYW5saXN0KSB7CisJCURQUklOVEsoImNoYW5uZWwvZ2FpbiBsaXN0IHRvbyBsb25nICV1ID4gJWRcbiIsCisJCQl1c2VyX2NtZC5jaGFubGlzdF9sZW4sIHMtPmxlbl9jaGFubGlzdCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIHNob3J0ICovCisJaWYgKHVzZXJfY21kLmNoYW5saXN0X2xlbiA8IDEpIHsKKwkJRFBSSU5USygiY2hhbm5lbC9nYWluIGxpc3QgdG9vIHNob3J0ICV1IDwgMVxuIiwKKwkJCXVzZXJfY21kLmNoYW5saXN0X2xlbik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlrZnJlZShhc3luYy0+Y21kLmNoYW5saXN0KTsKKwlhc3luYy0+Y21kID0gdXNlcl9jbWQ7CisJYXN5bmMtPmNtZC5kYXRhID0gTlVMTDsKKwkvKiBsb2FkIGNoYW5uZWwvZ2FpbiBsaXN0ICovCisJYXN5bmMtPmNtZC5jaGFubGlzdCA9CisJICAgIGttYWxsb2MoYXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKiBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhc3luYy0+Y21kLmNoYW5saXN0KSB7CisJCURQUklOVEsoImFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihhc3luYy0+Y21kLmNoYW5saXN0LCB1c2VyX2NtZC5jaGFubGlzdCwKKwkJCSAgIGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICogc2l6ZW9mKGludCkpKSB7CisJCURQUklOVEsoImZhdWx0IHJlYWRpbmcgY2hhbmxpc3RcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogbWFrZSBzdXJlIGVhY2ggZWxlbWVudCBpbiBjaGFubmVsL2dhaW4gbGlzdCBpcyB2YWxpZCAqLworCXJldCA9IGNoZWNrX2NoYW5saXN0KHMsIGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuLCBhc3luYy0+Y21kLmNoYW5saXN0KTsKKwlpZiAocmV0IDwgMCkgeworCQlEUFJJTlRLKCJiYWQgY2hhbmxpc3RcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0ID0gcy0+ZG9fY21kdGVzdChkZXYsIHMsICZhc3luYy0+Y21kKTsKKworCWlmIChhc3luYy0+Y21kLmZsYWdzICYgVFJJR19CT0dVUyB8fCByZXQpIHsKKwkJRFBSSU5USygidGVzdCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJdXNlcl9jbWQgPSBhc3luYy0+Y21kOworCQkvKiByZXN0b3JlIGNoYW5saXN0IHBvaW50ZXIgYmVmb3JlIGNvcHlpbmcgYmFjayAqLworCQl1c2VyX2NtZC5jaGFubGlzdCA9IGNoYW5saXN0X3NhdmVyOworCQl1c2VyX2NtZC5kYXRhID0gTlVMTDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1c2VyX2NtZCwgc2l6ZW9mKGNvbWVkaV9jbWQpKSkgeworCQkJRFBSSU5USygiZmF1bHQgd3JpdGluZyBjbWRcbiIpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKCFhc3luYy0+cHJlYWxsb2NfYnVmc3opIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJRFBSSU5USygibm8gYnVmZmVyICg/KVxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwljb21lZGlfcmVzZXRfYXN5bmNfYnVmKGFzeW5jKTsKKworCWFzeW5jLT5jYl9tYXNrID0KKwkgICAgQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FUlJPUiB8CisJICAgIENPTUVESV9DQl9PVkVSRkxPVzsKKwlpZiAoYXN5bmMtPmNtZC5mbGFncyAmIFRSSUdfV0FLRV9FT1MpCisJCWFzeW5jLT5jYl9tYXNrIHw9IENPTUVESV9DQl9FT1M7CisKKwljb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCB+MCwgU1JGX1VTRVIgfCBTUkZfUlVOTklORyk7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJaWYgKGFzeW5jLT5jbWQuZmxhZ3MgJiBUUklHX1JUKSB7CisJCWlmIChjb21lZGlfc3dpdGNoX3RvX3J0KGRldikgPT0gMCkKKwkJCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIFNSRl9SVCwgU1JGX1JUKTsKKwl9CisjZW5kaWYKKworCXJldCA9IHMtPmRvX2NtZChkZXYsIHMpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CisKK2NsZWFudXA6CisJZG9fYmVjb21lX25vbmJ1c3koZGV2LCBzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0NNRFRFU1QKKwljb21tYW5kIHRlc3RpbmcgaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBjbWQgc3RydWN0dXJlCisKKwlyZWFkczoKKwkJY21kIHN0cnVjdHVyZSBhdCBhcmcKKwkJY2hhbm5lbC9yYW5nZSBsaXN0CisKKwl3cml0ZXM6CisJCW1vZGlmaWVkIGNtZCBzdHJ1Y3R1cmUgYXQgYXJnCisKKyovCitzdGF0aWMgaW50IGRvX2NtZHRlc3RfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX2NtZCB1c2VyX2NtZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCAqY2hhbmxpc3QgPSBOVUxMOworCXVuc2lnbmVkIGludCAqY2hhbmxpc3Rfc2F2ZXIgPSBOVUxMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyX2NtZCwgYXJnLCBzaXplb2YoY29tZWRpX2NtZCkpKSB7CisJCURQUklOVEsoImJhZCBjbWQgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvKiBzYXZlIHVzZXIncyBjaGFubGlzdCBwb2ludGVyIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciAqLworCWNoYW5saXN0X3NhdmVyID0gdXNlcl9jbWQuY2hhbmxpc3Q7CisKKwlpZiAodXNlcl9jbWQuc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCURQUklOVEsoIiVkIG5vIHN1Y2ggc3ViZGV2aWNlXG4iLCB1c2VyX2NtZC5zdWJkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgdXNlcl9jbWQuc3ViZGV2OworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgeworCQlEUFJJTlRLKCIlZCBub3QgdmFsaWQgc3ViZGV2aWNlXG4iLCB1c2VyX2NtZC5zdWJkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIXMtPmRvX2NtZCB8fCAhcy0+ZG9fY21kdGVzdCkgeworCQlEUFJJTlRLKCJzdWJkZXZpY2UgJWkgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kc1xuIiwKKwkJCXVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gbG9uZyAqLworCWlmICh1c2VyX2NtZC5jaGFubGlzdF9sZW4gPiBzLT5sZW5fY2hhbmxpc3QpIHsKKwkJRFBSSU5USygiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJWQgPiAlZFxuIiwKKwkJCXVzZXJfY21kLmNoYW5saXN0X2xlbiwgcy0+bGVuX2NoYW5saXN0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIGxvYWQgY2hhbm5lbC9nYWluIGxpc3QgKi8KKwlpZiAodXNlcl9jbWQuY2hhbmxpc3QpIHsKKwkJY2hhbmxpc3QgPQorCQkgICAga21hbGxvYyh1c2VyX2NtZC5jaGFubGlzdF9sZW4gKiBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2hhbmxpc3QpIHsKKwkJCURQUklOVEsoImFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoY2hhbmxpc3QsIHVzZXJfY21kLmNoYW5saXN0LAorCQkJCSAgIHVzZXJfY21kLmNoYW5saXN0X2xlbiAqIHNpemVvZihpbnQpKSkgeworCQkJRFBSSU5USygiZmF1bHQgcmVhZGluZyBjaGFubGlzdFxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogbWFrZSBzdXJlIGVhY2ggZWxlbWVudCBpbiBjaGFubmVsL2dhaW4gbGlzdCBpcyB2YWxpZCAqLworCQlyZXQgPSBjaGVja19jaGFubGlzdChzLCB1c2VyX2NtZC5jaGFubGlzdF9sZW4sIGNoYW5saXN0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURQUklOVEsoImJhZCBjaGFubGlzdFxuIik7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQl1c2VyX2NtZC5jaGFubGlzdCA9IGNoYW5saXN0OworCX0KKworCXJldCA9IHMtPmRvX2NtZHRlc3QoZGV2LCBzLCAmdXNlcl9jbWQpOworCisJLyogcmVzdG9yZSBjaGFubGlzdCBwb2ludGVyIGJlZm9yZSBjb3B5aW5nIGJhY2sgKi8KKwl1c2VyX2NtZC5jaGFubGlzdCA9IGNoYW5saXN0X3NhdmVyOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1c2VyX2NtZCwgc2l6ZW9mKGNvbWVkaV9jbWQpKSkgeworCQlEUFJJTlRLKCJiYWQgY21kIGFkZHJlc3NcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGNsZWFudXA7CisJfQorY2xlYW51cDoKKwlrZnJlZShjaGFubGlzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9MT0NLCisJbG9jayBzdWJkZXZpY2UKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJbm9uZQorCisqLworCitzdGF0aWMgaW50IGRvX2xvY2tfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYXJnLCB2b2lkICpmaWxlKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBhcmc7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCWlmIChzLT5idXN5IHx8IHMtPmxvY2spCisJCXJldCA9IC1FQlVTWTsKKwllbHNlCisJCXMtPmxvY2sgPSBmaWxlOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisjaWYgMAorCWlmIChzLT5sb2NrX2YpCisJCXJldCA9IHMtPmxvY2tfZihkZXYsIHMpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9VTkxPQ0sKKwl1bmxvY2sgc3ViZGV2aWNlCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub25lCisKKwl3cml0ZXM6CisJCW5vbmUKKworCVRoaXMgZnVuY3Rpb24gaXNuJ3QgcHJvdGVjdGVkIGJ5IHRoZSBzZW1hcGhvcmUsIHNpbmNlCisJd2UgYWxyZWFkeSBvd24gdGhlIGxvY2suCisqLworc3RhdGljIGludCBkb191bmxvY2tfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYXJnLCB2b2lkICpmaWxlKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoYXJnID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgYXJnOworCisJaWYgKHMtPmJ1c3kpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKHMtPmxvY2sgPT0gZmlsZSkgeworI2lmIDAKKwkJaWYgKHMtPnVubG9jaykKKwkJCXMtPnVubG9jayhkZXYsIHMpOworI2VuZGlmCisKKwkJcy0+bG9jayA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisJQ09NRURJX0NBTkNFTAorCWNhbmNlbCBhY3F1aXNpdGlvbiBpb2N0bAorCisJYXJnOgorCQlzdWJkZXZpY2UgbnVtYmVyCisKKwlyZWFkczoKKwkJbm90aGluZworCisJd3JpdGVzOgorCQlub3RoaW5nCisKKyovCitzdGF0aWMgaW50IGRvX2NhbmNlbF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBhcmc7CisJaWYgKHMtPmFzeW5jID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSBmaWxlKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWlmICghcy0+YnVzeSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocy0+YnVzeSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIGRvX2NhbmNlbChkZXYsIHMpOworfQorCisvKgorCUNPTUVESV9QT0xMIGlvY3RsCisJaW5zdHJ1Y3RzIGRyaXZlciB0byBzeW5jaHJvbml6ZSBidWZmZXJzCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub3RoaW5nCisKKwl3cml0ZXM6CisJCW5vdGhpbmcKKworKi8KK3N0YXRpYyBpbnQgZG9fcG9sbF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBhcmc7CisKKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKCFzLT5idXN5KQorCQlyZXR1cm4gMDsKKworCWlmIChzLT5idXN5ICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocy0+cG9sbCkKKwkJcmV0dXJuIHMtPnBvbGwoZGV2LCBzKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRvX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JVTk5JTkcpICYmIHMtPmNhbmNlbCkKKwkJcmV0ID0gcy0+Y2FuY2VsKGRldiwgcyk7CisKKwlkb19iZWNvbWVfbm9uYnVzeShkZXYsIHMpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjb21lZGlfdW5tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJY29tZWRpX2RldmljZSAqZGV2OworCisJYXN5bmMgPSBhcmVhLT52bV9wcml2YXRlX2RhdGE7CisJZGV2ID0gYXN5bmMtPnN1YmRldmljZS0+ZGV2aWNlOworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJYXN5bmMtPm1tYXBfY291bnQtLTsKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGNvbWVkaV92bV9vcHMgPSB7CisJLmNsb3NlID0JY29tZWRpX3VubWFwLAorfTsKKworc3RhdGljIGludCBjb21lZGlfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgbl9wYWdlczsKKwlpbnQgaTsKKwlpbnQgcmV0dmFsOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJRFBSSU5USygibm8gZHJpdmVyIGNvbmZpZ3VyZWQgb24gY29tZWRpJWlcbiIsIGRldi0+bWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCisJCXMgPSBjb21lZGlfZ2V0X3dyaXRlX3N1YmRldmljZShkZXZfZmlsZV9pbmZvKTsKKwllbHNlCisJCXMgPSBjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCisJaWYgKHMgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJRFBSSU5USygiY29tZWRpOiBtbWFwKCkgb2Zmc2V0IG11c3QgYmUgMC5cbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IGFzeW5jLT5wcmVhbGxvY19idWZzeikgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChzaXplICYgKH5QQUdFX01BU0spKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwluX3BhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWZvciAoaSA9IDA7IGkgPCBuX3BhZ2VzOyArK2kpIHsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LAorCQkJCSAgICBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2UoYXN5bmMtPgorCQkJCQkJCSAgICAgYnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQkgICAgIHZpcnRfYWRkcikpLAorCQkJCSAgICBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzdGFydCArPSBQQUdFX1NJWkU7CisJfQorCisJdm1hLT52bV9vcHMgPSAmY29tZWRpX3ZtX29wczsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IGFzeW5jOworCisJYXN5bmMtPm1tYXBfY291bnQrKzsKKworCXJldHZhbCA9IDA7Citkb25lOgorCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjb21lZGlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKnJlYWRfc3ViZGV2OworCWNvbWVkaV9zdWJkZXZpY2UgKndyaXRlX3N1YmRldjsKKworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiBjb21lZGklaVxuIiwgZGV2LT5taW5vcik7CisJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCW1hc2sgPSAwOworCXJlYWRfc3ViZGV2ID0gY29tZWRpX2dldF9yZWFkX3N1YmRldmljZShkZXZfZmlsZV9pbmZvKTsKKwlpZiAocmVhZF9zdWJkZXYpIHsKKwkJcG9sbF93YWl0KGZpbGUsICZyZWFkX3N1YmRldi0+YXN5bmMtPndhaXRfaGVhZCwgd2FpdCk7CisJCWlmICghcmVhZF9zdWJkZXYtPmJ1c3kKKwkJICAgIHx8IGNvbWVkaV9idWZfcmVhZF9uX2F2YWlsYWJsZShyZWFkX3N1YmRldi0+YXN5bmMpID4gMAorCQkgICAgfHwgIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhyZWFkX3N1YmRldikgJgorCQkJIFNSRl9SVU5OSU5HKSkgeworCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9CisJfQorCXdyaXRlX3N1YmRldiA9IGNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWlmICh3cml0ZV9zdWJkZXYpIHsKKwkJcG9sbF93YWl0KGZpbGUsICZ3cml0ZV9zdWJkZXYtPmFzeW5jLT53YWl0X2hlYWQsIHdhaXQpOworCQljb21lZGlfYnVmX3dyaXRlX2FsbG9jKHdyaXRlX3N1YmRldi0+YXN5bmMsCisJCQkJICAgICAgIHdyaXRlX3N1YmRldi0+YXN5bmMtPnByZWFsbG9jX2J1ZnN6KTsKKwkJaWYgKCF3cml0ZV9zdWJkZXYtPmJ1c3kKKwkJICAgIHx8ICEoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3Mod3JpdGVfc3ViZGV2KSAmCisJCQkgU1JGX1JVTk5JTkcpCisJCSAgICB8fCBjb21lZGlfYnVmX3dyaXRlX25fYWxsb2NhdGVkKHdyaXRlX3N1YmRldi0+YXN5bmMpID49CisJCSAgICBieXRlc19wZXJfc2FtcGxlKHdyaXRlX3N1YmRldi0+YXN5bmMtPnN1YmRldmljZSkpIHsKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgc3NpemVfdCBjb21lZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKKwkJCSAgICBsb2ZmX3QgKm9mZnNldCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IG4sIG0sIGNvdW50ID0gMCwgcmV0dmFsID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJRFBSSU5USygibm8gZHJpdmVyIGNvbmZpZ3VyZWQgb24gY29tZWRpJWlcbiIsIGRldi0+bWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJcyA9IGNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWlmIChzID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKwlhc3luYyA9IHMtPmFzeW5jOworCisJaWYgKCFuYnl0ZXMpIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIXMtPmJ1c3kpIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBkb25lOworCX0KKwlpZiAocy0+YnVzeSAhPSBmaWxlKSB7CisJCXJldHZhbCA9IC1FQUNDRVM7CisJCWdvdG8gZG9uZTsKKwl9CisJYWRkX3dhaXRfcXVldWUoJmFzeW5jLT53YWl0X2hlYWQsICZ3YWl0KTsKKwl3aGlsZSAobmJ5dGVzID4gMCAmJiAhcmV0dmFsKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJbiA9IG5ieXRlczsKKworCQltID0gbjsKKwkJaWYgKGFzeW5jLT5idWZfd3JpdGVfcHRyICsgbSA+IGFzeW5jLT5wcmVhbGxvY19idWZzeikKKwkJCW0gPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSBhc3luYy0+YnVmX3dyaXRlX3B0cjsKKwkJY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhhc3luYywgYXN5bmMtPnByZWFsbG9jX2J1ZnN6KTsKKwkJaWYgKG0gPiBjb21lZGlfYnVmX3dyaXRlX25fYWxsb2NhdGVkKGFzeW5jKSkKKwkJCW0gPSBjb21lZGlfYnVmX3dyaXRlX25fYWxsb2NhdGVkKGFzeW5jKTsKKwkJaWYgKG0gPCBuKQorCQkJbiA9IG07CisKKwkJaWYgKG4gPT0gMCkgeworCQkJaWYgKCEoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlVOTklORykpIHsKKwkJCQlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJgorCQkJCSAgICBTUkZfRVJST1IpIHsKKwkJCQkJcmV0dmFsID0gLUVQSVBFOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHZhbCA9IDA7CisJCQkJfQorCQkJCWRvX2JlY29tZV9ub25idXN5KGRldiwgcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmICghcy0+YnVzeSkKKwkJCQlicmVhazsKKwkJCWlmIChzLT5idXN5ICE9IGZpbGUpIHsKKwkJCQlyZXR2YWwgPSAtRUFDQ0VTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQltID0gY29weV9mcm9tX3VzZXIoYXN5bmMtPnByZWFsbG9jX2J1ZiArIGFzeW5jLT5idWZfd3JpdGVfcHRyLAorCQkJCSAgIGJ1Ziwgbik7CisJCWlmIChtKSB7CisJCQluIC09IG07CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQl9CisJCWNvbWVkaV9idWZfd3JpdGVfZnJlZShhc3luYywgbik7CisKKwkJY291bnQgKz0gbjsKKwkJbmJ5dGVzIC09IG47CisKKwkJYnVmICs9IG47CisJCWJyZWFrOwkJLyogbWFrZXMgZGV2aWNlIHdvcmsgbGlrZSBhIHBpcGUgKi8KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmYXN5bmMtPndhaXRfaGVhZCwgJndhaXQpOworCitkb25lOgorCXJldHVybiBjb3VudCA/IGNvdW50IDogcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdCBjb21lZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzLAorCQkJICAgbG9mZl90ICpvZmZzZXQpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCWludCBuLCBtLCBjb3VudCA9IDAsIHJldHZhbCA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCisJaWYgKCFkZXYtPmF0dGFjaGVkKSB7CisJCURQUklOVEsoIm5vIGRyaXZlciBjb25maWd1cmVkIG9uIGNvbWVkaSVpXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCXMgPSBjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWlmIChzID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKwlhc3luYyA9IHMtPmFzeW5jOworCWlmICghbmJ5dGVzKSB7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCFzLT5idXN5KSB7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHMtPmJ1c3kgIT0gZmlsZSkgeworCQlyZXR2YWwgPSAtRUFDQ0VTOworCQlnb3RvIGRvbmU7CisJfQorCisJYWRkX3dhaXRfcXVldWUoJmFzeW5jLT53YWl0X2hlYWQsICZ3YWl0KTsKKwl3aGlsZSAobmJ5dGVzID4gMCAmJiAhcmV0dmFsKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJbiA9IG5ieXRlczsKKworCQltID0gY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKGFzeW5jKTsKKwkJLyogcHJpbnRrKCIlZCBhdmFpbGFibGVcbiIsbSk7ICovCisJCWlmIChhc3luYy0+YnVmX3JlYWRfcHRyICsgbSA+IGFzeW5jLT5wcmVhbGxvY19idWZzeikKKwkJCW0gPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSBhc3luYy0+YnVmX3JlYWRfcHRyOworCQkvKiBwcmludGsoIiVkIGNvbnRpZ3VvdXNcbiIsbSk7ICovCisJCWlmIChtIDwgbikKKwkJCW4gPSBtOworCisJCWlmIChuID09IDApIHsKKwkJCWlmICghKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JVTk5JTkcpKSB7CisJCQkJZG9fYmVjb21lX25vbmJ1c3koZGV2LCBzKTsKKwkJCQlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJgorCQkJCSAgICBTUkZfRVJST1IpIHsKKwkJCQkJcmV0dmFsID0gLUVQSVBFOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHZhbCA9IDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoIXMtPmJ1c3kpIHsKKwkJCQlyZXR2YWwgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHMtPmJ1c3kgIT0gZmlsZSkgeworCQkJCXJldHZhbCA9IC1FQUNDRVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQltID0gY29weV90b191c2VyKGJ1ZiwgYXN5bmMtPnByZWFsbG9jX2J1ZiArCisJCQkJIGFzeW5jLT5idWZfcmVhZF9wdHIsIG4pOworCQlpZiAobSkgeworCQkJbiAtPSBtOworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJfQorCisJCWNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgbik7CisJCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBuKTsKKworCQljb3VudCArPSBuOworCQluYnl0ZXMgLT0gbjsKKworCQlidWYgKz0gbjsKKwkJYnJlYWs7CQkvKiBtYWtlcyBkZXZpY2Ugd29yayBsaWtlIGEgcGlwZSAqLworCX0KKwlpZiAoIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIChTUkZfRVJST1IgfCBTUkZfUlVOTklORykpICYmCisJICAgIGFzeW5jLT5idWZfcmVhZF9jb3VudCAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQgPT0gMCkgeworCQlkb19iZWNvbWVfbm9uYnVzeShkZXYsIHMpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZhc3luYy0+d2FpdF9oZWFkLCAmd2FpdCk7CisKK2RvbmU6CisJcmV0dXJuIGNvdW50ID8gY291bnQgOiByZXR2YWw7Cit9CisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIGEgc3ViZGV2aWNlIHRvIGFuIGlkbGUgc3RhdGUuCisgKi8KK3ZvaWQgZG9fYmVjb21lX25vbmJ1c3koY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKKworCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIFNSRl9SVU5OSU5HLCAwKTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJaWYgKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JUKSB7CisJCWNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KGRldik7CisJCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIFNSRl9SVCwgMCk7CisJfQorI2VuZGlmCisJaWYgKGFzeW5jKSB7CisJCWNvbWVkaV9yZXNldF9hc3luY19idWYoYXN5bmMpOworCQlhc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiQlVHOiAoPykgZG9fYmVjb21lX25vbmJ1c3kgY2FsbGVkIHdpdGggYXN5bmM9MFxuIik7CisJfQorCisJcy0+YnVzeSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY2hhciBtb2RbMzJdOworCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQorCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJRFBSSU5USygiaW52YWxpZCBtaW5vciBudW1iZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBUaGlzIGlzIHNsaWdodGx5IGhhY2t5LCBidXQgd2Ugd2FudCBtb2R1bGUgYXV0b2xvYWRpbmcKKwkgKiB0byB3b3JrIGZvciByb290LgorCSAqIGNhc2U6IHVzZXIgb3BlbnMgZGV2aWNlLCBhdHRhY2hlZCAtPiBvaworCSAqIGNhc2U6IHVzZXIgb3BlbnMgZGV2aWNlLCB1bmF0dGFjaGVkLCBpbl9yZXF1ZXN0X21vZHVsZT0wIC0+IGF1dG9sb2FkCisJICogY2FzZTogdXNlciBvcGVucyBkZXZpY2UsIHVuYXR0YWNoZWQsIGluX3JlcXVlc3RfbW9kdWxlPTEgLT4gZmFpbAorCSAqIGNhc2U6IHJvb3Qgb3BlbnMgZGV2aWNlLCBhdHRhY2hlZCAtPiBvaworCSAqIGNhc2U6IHJvb3Qgb3BlbnMgZGV2aWNlLCB1bmF0dGFjaGVkLCBpbl9yZXF1ZXN0X21vZHVsZT0xIC0+IG9rCisJICogICAodHlwaWNhbGx5IGNhbGxlZCBmcm9tIG1vZHByb2JlKQorCSAqIGNhc2U6IHJvb3Qgb3BlbnMgZGV2aWNlLCB1bmF0dGFjaGVkLCBpbl9yZXF1ZXN0X21vZHVsZT0wIC0+IGF1dG9sb2FkCisJICoKKwkgKiBUaGUgbGFzdCBjb3VsZCBiZSBjaGFuZ2VkIHRvICItPiBvayIsIHdoaWNoIHdvdWxkIGRlbnkgcm9vdAorCSAqIGF1dG9sb2FkaW5nLgorCSAqLworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWlmIChkZXYtPmF0dGFjaGVkKQorCQlnb3RvIG9rOworCWlmICghY2FwYWJsZShDQVBfU1lTX01PRFVMRSkgJiYgZGV2LT5pbl9yZXF1ZXN0X21vZHVsZSkgeworCQlEUFJJTlRLKCJpbiByZXF1ZXN0IG1vZHVsZVxuIik7CisJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoY2FwYWJsZShDQVBfU1lTX01PRFVMRSkgJiYgZGV2LT5pbl9yZXF1ZXN0X21vZHVsZSkKKwkJZ290byBvazsKKworCWRldi0+aW5fcmVxdWVzdF9tb2R1bGUgPSAxOworCisJc3ByaW50Zihtb2QsICJjaGFyLW1ham9yLSVpLSVpIiwgQ09NRURJX01BSk9SLCBkZXYtPm1pbm9yKTsKKyNpZmRlZiBDT05GSUdfS01PRAorCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJcmVxdWVzdF9tb2R1bGUobW9kKTsKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKyNlbmRpZgorCisJZGV2LT5pbl9yZXF1ZXN0X21vZHVsZSA9IDA7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQgJiYgIWNhcGFibGUoQ0FQX1NZU19NT0RVTEUpKSB7CisJCURQUklOVEsoIm5vdCBhdHRhY2hlZCBhbmQgbm90IENBUF9TWVNfTU9EVUxFXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorb2s6CisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCWlmIChkZXYtPmF0dGFjaGVkKSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQoZGV2LT5kcml2ZXItPm1vZHVsZSkpIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJCXJldHVybiAtRU5PU1lTOworCQl9CisJfQorCisJaWYgKGRldi0+YXR0YWNoZWQgJiYgZGV2LT51c2VfY291bnQgPT0gMCAmJiBkZXYtPm9wZW4pCisJCWRldi0+b3BlbihkZXYpOworCisJZGV2LT51c2VfY291bnQrKzsKKworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBOVUxMOworCWludCBpOworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisKKwlpZiAoZGV2LT5zdWJkZXZpY2VzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKKworCQkJaWYgKHMtPmJ1c3kgPT0gZmlsZSkKKwkJCQlkb19jYW5jZWwoZGV2LCBzKTsKKwkJCWlmIChzLT5sb2NrID09IGZpbGUpCisJCQkJcy0+bG9jayA9IE5VTEw7CisJCX0KKwl9CisJaWYgKGRldi0+YXR0YWNoZWQgJiYgZGV2LT51c2VfY291bnQgPT0gMSAmJiBkZXYtPmNsb3NlKQorCQlkZXYtPmNsb3NlKGRldik7CisKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlpZiAoZGV2LT5hdHRhY2hlZCkKKwkJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+bW9kdWxlKTsKKworCWRldi0+dXNlX2NvdW50LS07CisKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGQVNZTkMpCisJCWNvbWVkaV9mYXN5bmMoLTEsIGZpbGUsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCit7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZkZXYtPmFzeW5jX3F1ZXVlKTsKK30KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb21lZGlfZm9wcyA9IHsKKyAgICAgIC5vd25lciA9CQlUSElTX01PRFVMRSwKKyNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCisgICAgICAudW5sb2NrZWRfaW9jdGwgPQljb21lZGlfdW5sb2NrZWRfaW9jdGwsCisjZWxzZQorICAgICAgLmlvY3RsID0JCWNvbWVkaV9pb2N0bCwKKyNlbmRpZgorI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCisgICAgICAuY29tcGF0X2lvY3RsID0JY29tZWRpX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorICAgICAgLm9wZW4gPQkJY29tZWRpX29wZW4sCisgICAgICAucmVsZWFzZSA9CWNvbWVkaV9jbG9zZSwKKyAgICAgIC5yZWFkID0JCWNvbWVkaV9yZWFkLAorICAgICAgLndyaXRlID0JCWNvbWVkaV93cml0ZSwKKyAgICAgIC5tbWFwID0JCWNvbWVkaV9tbWFwLAorICAgICAgLnBvbGwgPQkJY29tZWRpX3BvbGwsCisgICAgICAuZmFzeW5jID0JCWNvbWVkaV9mYXN5bmMsCit9OworCitzdHJ1Y3QgY2xhc3MgKmNvbWVkaV9jbGFzczsKK3N0YXRpYyBzdHJ1Y3QgY2RldiBjb21lZGlfY2RldjsKKworc3RhdGljIHZvaWQgY29tZWRpX2NsZWFudXBfbGVnYWN5X21pbm9ycyh2b2lkKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9MRUdBQ1lfTUlOT1JTOyBpKyspCisJCWNvbWVkaV9mcmVlX2JvYXJkX21pbm9yKGkpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjb21lZGlfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCByZXR2YWw7CisKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGk6IHZlcnNpb24gIiBDT01FRElfUkVMRUFTRQorCSAgICAgICAiIC0gaHR0cDovL3d3dy5jb21lZGkub3JnXG4iKTsKKworCW1lbXNldChjb21lZGlfZmlsZV9pbmZvX3RhYmxlLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICopICogQ09NRURJX05VTV9NSU5PUlMpOworCisJcmV0dmFsID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLAorCQkJCQlDT01FRElfTlVNX01JTk9SUywgImNvbWVkaSIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiAtRUlPOworCWNkZXZfaW5pdCgmY29tZWRpX2NkZXYsICZjb21lZGlfZm9wcyk7CisJY29tZWRpX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwlrb2JqZWN0X3NldF9uYW1lKCZjb21lZGlfY2Rldi5rb2JqLCAiY29tZWRpIik7CisJaWYgKGNkZXZfYWRkKCZjb21lZGlfY2RldiwgTUtERVYoQ09NRURJX01BSk9SLCAwKSwgQ09NRURJX05VTV9NSU5PUlMpKSB7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLAorCQkJCQkgQ09NRURJX05VTV9NSU5PUlMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJY29tZWRpX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiY29tZWRpIik7CisJaWYgKElTX0VSUihjb21lZGlfY2xhc3MpKSB7CisJCXByaW50aygiY29tZWRpOiBmYWlsZWQgdG8gY3JlYXRlIGNsYXNzIik7CisJCWNkZXZfZGVsKCZjb21lZGlfY2Rldik7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLAorCQkJCQkgQ09NRURJX05VTV9NSU5PUlMpOworCQlyZXR1cm4gUFRSX0VSUihjb21lZGlfY2xhc3MpOworCX0KKworCS8qIFhYWCByZXF1aXJlcyAvcHJvYyBpbnRlcmZhY2UgKi8KKwljb21lZGlfcHJvY19pbml0KCk7CisKKwkvKiBjcmVhdGUgZGV2aWNlcyBmaWxlcyBmb3IgbGVnYWN5L21hbnVhbCB1c2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9MRUdBQ1lfTUlOT1JTOyBpKyspIHsKKwkJaW50IG1pbm9yOworCQltaW5vciA9IGNvbWVkaV9hbGxvY19ib2FyZF9taW5vcihOVUxMKTsKKwkJaWYgKG1pbm9yIDwgMCkgeworCQkJY29tZWRpX2NsZWFudXBfbGVnYWN5X21pbm9ycygpOworCQkJY2Rldl9kZWwoJmNvbWVkaV9jZGV2KTsKKwkJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLAorCQkJCQkJIENPTUVESV9OVU1fTUlOT1JTKTsKKwkJCXJldHVybiBtaW5vcjsKKwkJfQorCX0KKworCWNvbWVkaV9ydF9pbml0KCk7CisKKwljb21lZGlfcmVnaXN0ZXJfaW9jdGwzMigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb21lZGlfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJY29tZWRpX2NsZWFudXBfbGVnYWN5X21pbm9ycygpOworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX01JTk9SUzsgKytpKQorCQlCVUdfT04oY29tZWRpX2ZpbGVfaW5mb190YWJsZVtpXSk7CisKKworCWNsYXNzX2Rlc3Ryb3koY29tZWRpX2NsYXNzKTsKKwljZGV2X2RlbCgmY29tZWRpX2NkZXYpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLCBDT01FRElfTlVNX01JTk9SUyk7CisKKwljb21lZGlfcHJvY19jbGVhbnVwKCk7CisKKwljb21lZGlfcnRfY2xlYW51cCgpOworCisJY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMigpOworfQorCittb2R1bGVfaW5pdChjb21lZGlfaW5pdCk7Cittb2R1bGVfZXhpdChjb21lZGlfY2xlYW51cCk7CisKK3ZvaWQgY29tZWRpX2Vycm9yKGNvbnN0IGNvbWVkaV9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcykKK3sKKwlydF9wcmludGsoImNvbWVkaSVkOiAlczogJXNcbiIsIGRldi0+bWlub3IsIGRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwKKwkJICBzKTsKK30KKwordm9pZCBjb21lZGlfZXZlbnQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKKwl1bnNpZ25lZCBydW5mbGFncyA9IDA7CisJdW5zaWduZWQgcnVuZmxhZ3NfbWFzayA9IDA7CisKKwkvKiBEUFJJTlRLKCJjb21lZGlfZXZlbnQgMHgleFxuIixtYXNrKTsgKi8KKworCWlmICgoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlVOTklORykgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKHMtPmFzeW5jLT4KKwkgICAgZXZlbnRzICYgKENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfT1ZFUkZMT1cpKSB7CisJCXJ1bmZsYWdzX21hc2sgfD0gU1JGX1JVTk5JTkc7CisJfQorCS8qIHJlbWVtYmVyIGlmIGFuIGVycm9yIGV2ZW50IGhhcyBvY2N1cmVkLCBzbyBhbiBlcnJvcgorCSAqIGNhbiBiZSByZXR1cm5lZCB0aGUgbmV4dCB0aW1lIHRoZSB1c2VyIGRvZXMgYSByZWFkKCkgKi8KKwlpZiAocy0+YXN5bmMtPmV2ZW50cyAmIChDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfT1ZFUkZMT1cpKSB7CisJCXJ1bmZsYWdzX21hc2sgfD0gU1JGX0VSUk9SOworCQlydW5mbGFncyB8PSBTUkZfRVJST1I7CisJfQorCWlmIChydW5mbGFnc19tYXNrKSB7CisJCS8qc2V0cyBTUkZfRVJST1IgYW5kIFNSRl9SVU5OSU5HIHRvZ2V0aGVyIGF0b21pY2FsbHkgKi8KKwkJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgcnVuZmxhZ3NfbWFzaywgcnVuZmxhZ3MpOworCX0KKworCWlmIChhc3luYy0+Y2JfbWFzayAmIHMtPmFzeW5jLT5ldmVudHMpIHsKKwkJaWYgKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1VTRVIpIHsKKworCQkJaWYgKGRldi0+cnQpIHsKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJCQkJLyogcGVuZCB3YWtlIHVwICovCisJCQkJY29tZWRpX3J0X3BlbmRfd2FrZXVwKCZhc3luYy0+d2FpdF9oZWFkKTsKKyNlbHNlCisJCQkJcHJpbnRrCisJCQkJICAgICgiQlVHOiBjb21lZGlfZXZlbnQoKSBjb2RlIHVucmVhY2hhYmxlXG4iKTsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFzeW5jLT53YWl0X2hlYWQpOworCQkJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1JFQUQpIHsKKwkJCQkJa2lsbF9mYXN5bmMoJmRldi0+YXN5bmNfcXVldWUsIFNJR0lPLAorCQkJCQkJICAgIFBPTExfSU4pOworCQkJCX0KKwkJCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9XUklURSkgeworCQkJCQlraWxsX2Zhc3luYygmZGV2LT5hc3luY19xdWV1ZSwgU0lHSU8sCisJCQkJCQkgICAgUE9MTF9PVVQpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChhc3luYy0+Y2JfZnVuYykKKwkJCQlhc3luYy0+Y2JfZnVuYyhzLT5hc3luYy0+ZXZlbnRzLCBhc3luYy0+Y2JfYXJnKTsKKwkJCS8qIFhYWCBidWcgaGVyZS4gIElmIHN1YmRldmljZSBBIGlzIHJ0LCBhbmQKKwkJCSAqIHN1YmRldmljZSBCIHRyaWVzIHRvIGNhbGxiYWNrIHRvIGEgbm9ybWFsCisJCQkgKiBsaW51eCBrZXJuZWwgZnVuY3Rpb24sIGl0IHdpbGwgYmUgYXQgdGhlCisJCQkgKiB3cm9uZyBwcmlvcml0eS4gIFNpbmNlIHRoaXMgaXNuJ3QgdmVyeQorCQkJICogY29tbW9uLCBJJ20gbm90IGdvaW5nIHRvIHdvcnJ5IGFib3V0IGl0LiAqLworCQl9CisJfQorCXMtPmFzeW5jLT5ldmVudHMgPSAwOworfQorCit2b2lkIGNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIG1hc2ssCisJCQkJICAgdW5zaWduZWQgYml0cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKwlzLT5ydW5mbGFncyAmPSB+bWFzazsKKwlzLT5ydW5mbGFncyB8PSAoYml0cyAmIG1hc2spOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKK30KKwordW5zaWduZWQgY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MoY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHJ1bmZsYWdzOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKwlydW5mbGFncyA9IHMtPnJ1bmZsYWdzOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcnVuZmxhZ3M7Cit9CisKK3N0YXRpYyBpbnQgaXNfZGV2aWNlX2J1c3koY29tZWRpX2RldmljZSAqZGV2KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IGk7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGk7CisJCWlmIChzLT5idXN5KQorCQkJcmV0dXJuIDE7CisJCWlmIChzLT5hc3luYyAmJiBzLT5hc3luYy0+bW1hcF9jb3VudCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9kZXZpY2VfaW5pdChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKGNvbWVkaV9kZXZpY2UpKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5zcGlubG9jayk7CisJbXV0ZXhfaW5pdCgmZGV2LT5tdXRleCk7CisJZGV2LT5taW5vciA9IC0xOworfQorCit2b2lkIGNvbWVkaV9kZXZpY2VfY2xlYW51cChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJmRldi0+bXV0ZXgpOworfQorCitpbnQgY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKHN0cnVjdCBkZXZpY2UgKmhhcmR3YXJlX2RldmljZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbzsKKwlkZXZpY2VfY3JlYXRlX3Jlc3VsdF90eXBlICpjc2RldjsKKwl1bnNpZ25lZCBpOworCisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChpbmZvID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWluZm8tPmRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKGNvbWVkaV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mby0+ZGV2aWNlID09IE5VTEwpIHsKKwkJa2ZyZWUoaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljb21lZGlfZGV2aWNlX2luaXQoaW5mby0+ZGV2aWNlKTsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0JPQVJEX01JTk9SUzsgKytpKSB7CisJCWlmIChjb21lZGlfZmlsZV9pbmZvX3RhYmxlW2ldID09IE5VTEwpIHsKKwkJCWNvbWVkaV9maWxlX2luZm9fdGFibGVbaV0gPSBpbmZvOworCQkJYnJlYWs7CisJCX0KKwl9CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCWlmIChpID09IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKSB7CisJCWNvbWVkaV9kZXZpY2VfY2xlYW51cChpbmZvLT5kZXZpY2UpOworCQlrZnJlZShpbmZvLT5kZXZpY2UpOworCQlrZnJlZShpbmZvKTsKKwkJcnRfcHJpbnRrCisJCSAgICAoImNvbWVkaTogZXJyb3I6IHJhbiBvdXQgb2YgbWlub3IgbnVtYmVycyBmb3IgYm9hcmQgZGV2aWNlIGZpbGVzLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWluZm8tPmRldmljZS0+bWlub3IgPSBpOworCWNzZGV2ID0gQ09NRURJX0RFVklDRV9DUkVBVEUoY29tZWRpX2NsYXNzLCBOVUxMLAorCQkJCSAgICAgTUtERVYoQ09NRURJX01BSk9SLCBpKSwgTlVMTCwKKwkJCQkgICAgIGhhcmR3YXJlX2RldmljZSwgImNvbWVkaSVpIiwgaSk7CisJaWYgKCFJU19FUlIoY3NkZXYpKQorCQlpbmZvLT5kZXZpY2UtPmNsYXNzX2RldiA9IGNzZGV2OworCisJcmV0dXJuIGk7Cit9CisKK3ZvaWQgY29tZWRpX2ZyZWVfYm9hcmRfbWlub3IodW5zaWduZWQgbWlub3IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmluZm87CisKKwlCVUdfT04obWlub3IgPj0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJaW5mbyA9IGNvbWVkaV9maWxlX2luZm9fdGFibGVbbWlub3JdOworCWNvbWVkaV9maWxlX2luZm9fdGFibGVbbWlub3JdID0gTlVMTDsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mbykgeworCQljb21lZGlfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXZpY2U7CisJCWlmIChkZXYpIHsKKwkJCWlmIChkZXYtPmNsYXNzX2RldikgeworCQkJCWRldmljZV9kZXN0cm95KGNvbWVkaV9jbGFzcywKKwkJCQkJICAgICAgIE1LREVWKENPTUVESV9NQUpPUiwgZGV2LT5taW5vcikpOworCQkJfQorCQkJY29tZWRpX2RldmljZV9jbGVhbnVwKGRldik7CisJCQlrZnJlZShkZXYpOworCQl9CisJCWtmcmVlKGluZm8pOworCX0KK30KKworaW50IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VfbWlub3IoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvOworCWRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGUgKmNzZGV2OworCXVuc2lnbmVkIGk7CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5mby0+ZGV2aWNlID0gZGV2OworCWluZm8tPnJlYWRfc3ViZGV2aWNlID0gczsKKwlpbmZvLT53cml0ZV9zdWJkZXZpY2UgPSBzOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gQ09NRURJX0ZJUlNUX1NVQkRFVklDRV9NSU5PUjsgaSA8IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTOyArK2kpIHsKKwkJaWYgKGNvbWVkaV9maWxlX2luZm9fdGFibGVbaV0gPT0gTlVMTCkgeworCQkJY29tZWRpX2ZpbGVfaW5mb190YWJsZVtpXSA9IGluZm87CisJCQlicmVhazsKKwkJfQorCX0KKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJaWYgKGkgPT0gQ09NRURJX05VTV9NSU5PUlMpIHsKKwkJa2ZyZWUoaW5mbyk7CisJCXJ0X3ByaW50aworCQkgICAgKCJjb21lZGk6IGVycm9yOiByYW4gb3V0IG9mIG1pbm9yIG51bWJlcnMgZm9yIGJvYXJkIGRldmljZSBmaWxlcy5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzLT5taW5vciA9IGk7CisJY3NkZXYgPSBDT01FRElfREVWSUNFX0NSRUFURShjb21lZGlfY2xhc3MsIGRldi0+Y2xhc3NfZGV2LAorCQkJCSAgICAgTUtERVYoQ09NRURJX01BSk9SLCBpKSwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICJjb21lZGklaV9zdWJkJWkiLCBkZXYtPm1pbm9yLAorCQkJCSAgICAgKGludCkocyAtIGRldi0+c3ViZGV2aWNlcykpOworCWlmICghSVNfRVJSKGNzZGV2KSkKKwkJcy0+Y2xhc3NfZGV2ID0gY3NkZXY7CisKKwlyZXR1cm4gaTsKK30KKwordm9pZCBjb21lZGlfZnJlZV9zdWJkZXZpY2VfbWlub3IoY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbzsKKworCWlmIChzID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAocy0+bWlub3IgPCAwKQorCQlyZXR1cm47CisKKwlCVUdfT04ocy0+bWlub3IgPj0gQ09NRURJX05VTV9NSU5PUlMpOworCUJVR19PTihzLT5taW5vciA8IENPTUVESV9GSVJTVF9TVUJERVZJQ0VfTUlOT1IpOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpbmZvID0gY29tZWRpX2ZpbGVfaW5mb190YWJsZVtzLT5taW5vcl07CisJY29tZWRpX2ZpbGVfaW5mb190YWJsZVtzLT5taW5vcl0gPSBOVUxMOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKworCWlmIChzLT5jbGFzc19kZXYpIHsKKwkJZGV2aWNlX2Rlc3Ryb3koY29tZWRpX2NsYXNzLCBNS0RFVihDT01FRElfTUFKT1IsIHMtPm1pbm9yKSk7CisJCXMtPmNsYXNzX2RldiA9IE5VTEw7CisJfQorCWtmcmVlKGluZm8pOworfQorCitzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyh1bnNpZ25lZCBtaW5vcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbzsKKworCUJVR19PTihtaW5vciA+PSBDT01FRElfTlVNX01JTk9SUyk7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpbmZvID0gY29tZWRpX2ZpbGVfaW5mb190YWJsZVttaW5vcl07CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCXJldHVybiBpbmZvOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjhkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmgKQEAgLTAsMCArMSw4IEBACisKKyNpZm5kZWYgX0NPTUVESV9GT1BTX0gKKyNkZWZpbmUgX0NPTUVESV9GT1BTX0gKKworZXh0ZXJuIHN0cnVjdCBjbGFzcyAqY29tZWRpX2NsYXNzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29tZWRpX2ZvcHM7CisKKyNlbmRpZiAvKiBfQ09NRURJX0ZPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfa3N5bXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkNTcyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2tzeW1zLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAgICBtb2R1bGUvZXhwX2lvY3RsLmMKKyAgICBleHBvcnRlZCBjb21lZGkgZnVuY3Rpb25zCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2lmbmRlZiBFWFBPUlRfU1lNVEFCCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKyNlbmRpZgorCisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCisKKy8qIGZvciBkcml2ZXJzICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZjaGVjayk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2RvbmUpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9lcnJvcl9kb25lKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2Vycm9yKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZW9idWYpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9lb3MpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZXZlbnQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfYmlwb2xhcjEwKTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfYmlwb2xhcjUpOworRVhQT1JUX1NZTUJPTChyYW5nZV9iaXBvbGFyMl81KTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfdW5pcG9sYXIxMCk7CitFWFBPUlRfU1lNQk9MKHJhbmdlX3VuaXBvbGFyNSk7CitFWFBPUlRfU1lNQk9MKHJhbmdlX3Vua25vd24pOworI2lmZGVmIENPTkZJR19DT01FRElfUlQKK0VYUE9SVF9TWU1CT0woY29tZWRpX2ZyZWVfaXJxKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3JlcXVlc3RfaXJxKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3N3aXRjaF90b19ydCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KTsKK0VYUE9SVF9TWU1CT0wocnRfcGVuZF9jYWxsKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RlYnVnKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV9mcmVlX2JvYXJkX21pbm9yKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV9wY2lfYXV0b19jb25maWcpOworRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKTsKKworLyogZm9yIGtjb21lZGlsaWIgKi8KK0VYUE9SVF9TWU1CT0woY2hlY2tfY2hhbmxpc3QpOworRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKTsKKworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3B1dCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZfZ2V0KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl93cml0ZV9mcmVlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl93cml0ZV9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZfcmVhZF9mcmVlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9yZWFkX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9tZW1jcHlfdG8pOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX21lbWNweV9mcm9tKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3Jlc2V0X2FzeW5jX2J1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg1MmJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcnQuaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAgICBtb2R1bGUvY29tZWRpX3J0LmgKKyAgICBoZWFkZXIgZmlsZSBmb3IgcmVhbC10aW1lIHN0cnVjdHVyZXMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50cworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX0NPTUVESV9SVF9ICisjZGVmaW5lIF9DT01FRElfUlRfSAorCisjaWZuZGVmIF9DT01FRElERVZfSAorI2Vycm9yIGNvbWVkaV9ydC5oIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGJ5IGNvbWVkaWRldi5oCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKyNpbmNsdWRlIDxydGFpLmg+CisjaW5jbHVkZSA8cnRhaV9zY2hlZC5oPgorI2luY2x1ZGUgPHJ0YWlfdmVyc2lvbi5oPgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKyNpbmNsdWRlIDxydGxfY29yZS5oPgorI2luY2x1ZGUgPHJ0bF90aW1lLmg+CisvKiAjaWZkZWYgUlRMSU5VWF9WRVJTSU9OX0NPREUgKi8KKyNpbmNsdWRlIDxydGxfc3luYy5oPgorLyogI2VuZGlmICovCisjZGVmaW5lIHJ0X3ByaW50ayBydGxfcHJpbnRmCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX0ZVU0lPTgorI2RlZmluZSBydF9wcmludGsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbmRpZiAvKiBDT05GSUdfQ09NRURJX0ZVU0lPTiAqLworI2lmZGVmIENPTkZJR19QUklPUklUWV9JUlEKKyNkZWZpbmUgcnRfcHJpbnRrIHByaW50aworI2VuZGlmCisKK2ludCBjb21lZGlfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QoKmhhbmRsZXIpIChpbnQsCisJCXZvaWQgKlBUX1JFR1NfQVJHKSwgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2aWNlLAorCQljb21lZGlfZGV2aWNlICpkZXZfaWQpOwordm9pZCBjb21lZGlfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgY29tZWRpX2RldmljZSAqZGV2X2lkKTsKK3ZvaWQgY29tZWRpX3J0X2luaXQodm9pZCk7Cit2b2lkIGNvbWVkaV9ydF9jbGVhbnVwKHZvaWQpOworaW50IGNvbWVkaV9zd2l0Y2hfdG9fcnQoY29tZWRpX2RldmljZSAqZGV2KTsKK3ZvaWQgY29tZWRpX3N3aXRjaF90b19ub25fcnQoY29tZWRpX2RldmljZSAqZGV2KTsKK3ZvaWQgY29tZWRpX3J0X3BlbmRfd2FrZXVwKHdhaXRfcXVldWVfaGVhZF90ICpxKTsKK2V4dGVybiBpbnQgcnRfcGVuZF9jYWxsKHZvaWQgKCpmdW5jKSAoaW50IGFyZzEsIHZvaWQgKmFyZzIpLCBpbnQgYXJnMSwKKwl2b2lkICphcmcyKTsKKworI2Vsc2UKKworI2RlZmluZSBjb21lZGlfcmVxdWVzdF9pcnEoYSwgYiwgYywgZCwgZSkgcmVxdWVzdF9pcnEoYSwgYiwgYywgZCwgZSkKKyNkZWZpbmUgY29tZWRpX2ZyZWVfaXJxKGEsIGIpIGZyZWVfaXJxKGEsIGIpCisjZGVmaW5lIGNvbWVkaV9ydF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNvbWVkaV9ydF9jbGVhbnVwKCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNvbWVkaV9zd2l0Y2hfdG9fcnQoYSkgKC0xKQorI2RlZmluZSBjb21lZGlfc3dpdGNoX3RvX25vbl9ydChhKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3J0X3BlbmRfd2FrZXVwKGEpIGRvIHt9IHdoaWxlICgwKQorCisjZGVmaW5lIHJ0X3ByaW50ayhmb3JtYXQsIGFyZ3MuLi4pCXByaW50ayhmb3JtYXQsICMjYXJncykKKworI2VuZGlmCisKKy8qIERlZmluZSBhIHNwaW5fbG9ja19pcnFzYXZlIGZ1bmN0aW9uIHRoYXQgd2lsbCB3b3JrIHdpdGggcnQgb3Igd2l0aG91dC4KKyAqIFVzZSBpbmxpbmUgZnVuY3Rpb25zIGluc3RlYWQgb2YganVzdCBtYWNyb3MgdG8gZW5mb3JjZSBzb21lIHR5cGUgY2hlY2tpbmcuCisgKi8KKyNkZWZpbmUgY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyLCBmbGFncykgXAorCShmbGFncyA9IF9fY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyKSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKHNwaW5sb2NrX3QgKmxvY2tfcHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRBSSkKKwlmbGFncyA9IHJ0X3NwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTCkKKwlydGxfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIsIGZsYWdzKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTF9WMSkKKwlydGxfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIsIGZsYWdzKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX0ZVU0lPTikKKwlydGhhbF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrX3B0ciwgZmxhZ3MpOworI2Vsc2UKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZW5kaWYKKworCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKHNwaW5sb2NrX3QgKmxvY2tfcHRyLAorCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRBSSkKKwlydF9zcGluX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzLCBsb2NrX3B0cik7CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEwpCisJcnRsX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9ja19wdHIsIGZsYWdzKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTF9WMSkKKwlydGxfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrX3B0ciwgZmxhZ3MpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX0ZVU0lPTikKKwlydGhhbF9zcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2tfcHRyLCBmbGFncyk7CisjZWxzZQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9ja19wdHIsIGZsYWdzKTsKKworI2VuZGlmCisKK30KKworLyogZGVmaW5lIGEgUlQgc2FmZSB1ZGVsYXkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfdWRlbGF5KHVuc2lnbmVkIGludCB1c2VjKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEFJKQorCXN0YXRpYyBjb25zdCBpbnQgbmFub3NlY19wZXJfdXNlYyA9IDEwMDA7CisJcnRfYnVzeV9zbGVlcCh1c2VjICogbmFub3NlY19wZXJfdXNlYyk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMKQorCXN0YXRpYyBjb25zdCBpbnQgbmFub3NlY19wZXJfdXNlYyA9IDEwMDA7CisJcnRsX2RlbGF5KHVzZWMgKiBuYW5vc2VjX3Blcl91c2VjKTsKKyNlbHNlCisJdWRlbGF5KHVzZWMpOworI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNTM1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKQEAgLTAsMCArMSw1MzcgQEAKKy8qCisgICAgaW5jbHVkZS9saW51eC9jb21lZGlkZXYuaAorICAgIGhlYWRlciBmaWxlIGZvciBrZXJuZWwtb25seSBzdHJ1Y3R1cmVzLCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9DT01FRElERVZfSAorI2RlZmluZSBfQ09NRURJREVWX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgImludGVycnVwdC5oIgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJjb21lZGkuaCIKKworI2RlZmluZSBEUFJJTlRLKGZvcm1hdCwgYXJncy4uLikJZG8gewkJXAorCWlmIChjb21lZGlfZGVidWcpCQkJCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogIiBmb3JtYXQgLCAjIyBhcmdzKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT01FRElfVkVSU0lPTihhLCBiLCBjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKQorI2RlZmluZSBDT01FRElfVkVSU0lPTl9DT0RFIENPTUVESV9WRVJTSU9OKENPTUVESV9NQUpPUlZFUlNJT04sIENPTUVESV9NSU5PUlZFUlNJT04sIENPTUVESV9NSUNST1ZFUlNJT04pCisjZGVmaW5lIENPTUVESV9SRUxFQVNFIFZFUlNJT04KKworI2RlZmluZSBDT01FRElfSU5JVENMRUFOVVBfTk9NT0RVTEUoeCkJCQkJCVwKKwlzdGF0aWMgaW50IF9faW5pdCB4ICMjIF9pbml0X21vZHVsZSh2b2lkKQkJCVwKKwkJe3JldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCYoeCkpO30JCQlcCisJc3RhdGljIHZvaWQgX19leGl0IHggIyMgX2NsZWFudXBfbW9kdWxlKHZvaWQpCQkJXAorCQl7Y29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCYoeCkpO30gCQkJXAorCW1vZHVsZV9pbml0KHggIyMgX2luaXRfbW9kdWxlKTsJCQkJCVwKKwltb2R1bGVfZXhpdCh4ICMjIF9jbGVhbnVwX21vZHVsZSk7CQkJCQlcCisKKyNkZWZpbmUgQ09NRURJX01PRFVMRV9NQUNST1MJCQkJCQlcCisJTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOwkJXAorCU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsJCQlcCisJTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwkJCQkJCVwKKworI2RlZmluZSBDT01FRElfSU5JVENMRUFOVVAoeCkJCQkJCQlcCisJQ09NRURJX01PRFVMRV9NQUNST1MJCVwKKwlDT01FRElfSU5JVENMRUFOVVBfTk9NT0RVTEUoeCkKKworI2RlZmluZSBDT01FRElfUENJX0lOSVRDTEVBTlVQX05PTU9EVUxFKGNvbWVkaV9kcml2ZXIsIHBjaV9pZF90YWJsZSkgXAorCXN0YXRpYyBpbnQgX19kZXZpbml0IGNvbWVkaV9kcml2ZXIgIyMgX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBcCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpIFwKKwl7IFwKKwkJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBjb21lZGlfZHJpdmVyLmRyaXZlcl9uYW1lKTsgXAorCX0gXAorCXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjb21lZGlfZHJpdmVyICMjIF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpIFwKKwl7IFwKKwkJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7IFwKKwl9IFwKKwlzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlciA9IFwKKwl7IFwKKwkJLmlkX3RhYmxlID0gcGNpX2lkX3RhYmxlLCBcCisJCS5wcm9iZSA9ICZjb21lZGlfZHJpdmVyICMjIF9wY2lfcHJvYmUsIFwKKwkJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZjb21lZGlfZHJpdmVyICMjIF9wY2lfcmVtb3ZlKSBcCisJfTsgXAorCXN0YXRpYyBpbnQgX19pbml0IGNvbWVkaV9kcml2ZXIgIyMgX2luaXRfbW9kdWxlKHZvaWQpIFwKKwl7IFwKKwkJaW50IHJldHZhbDsgXAorCQlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZjb21lZGlfZHJpdmVyKTsgXAorCQlpZiAocmV0dmFsIDwgMCkgXAorCQkJcmV0dXJuIHJldHZhbDsgXAorCQljb21lZGlfZHJpdmVyICMjIF9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWNvbWVkaV9kcml2ZXIuZHJpdmVyX25hbWU7IFwKKwkJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIpOyBcCisJfSBcCisJc3RhdGljIHZvaWQgX19leGl0IGNvbWVkaV9kcml2ZXIgIyMgX2NsZWFudXBfbW9kdWxlKHZvaWQpIFwKKwl7IFwKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjb21lZGlfZHJpdmVyICMjIF9wY2lfZHJpdmVyKTsgXAorCQljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmNvbWVkaV9kcml2ZXIpOyBcCisJfSBcCisJbW9kdWxlX2luaXQoY29tZWRpX2RyaXZlciAjIyBfaW5pdF9tb2R1bGUpOyBcCisJbW9kdWxlX2V4aXQoY29tZWRpX2RyaXZlciAjIyBfY2xlYW51cF9tb2R1bGUpOworCisjZGVmaW5lIENPTUVESV9QQ0lfSU5JVENMRUFOVVAoY29tZWRpX2RyaXZlciwgcGNpX2lkX3RhYmxlKSBcCisJQ09NRURJX01PRFVMRV9NQUNST1MgXAorCUNPTUVESV9QQ0lfSU5JVENMRUFOVVBfTk9NT0RVTEUoY29tZWRpX2RyaXZlciwgcGNpX2lkX3RhYmxlKQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5PVkEJCTB4MTA0YworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05BVElOU1QJCTB4MTA5MworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RBVFgJCTB4MTExNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTVBVVEVSQk9BUkRTCTB4MTMwNworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FEVkFOVEVDSAkJMHgxM2ZlCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUlRECQkweDE0MzUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTVBMSUNPTgkJMHgxNGRjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURMSU5LCQkweDE0NGEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JQ1AJCTB4MTA0YworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTlRFQwkJMHgxMjIxCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUVJTEhBVVMJCTB4MTQwMgorCisjZGVmaW5lIENPTUVESV9OVU1fTUlOT1JTIDB4MTAwCisjZGVmaW5lIENPTUVESV9OVU1fTEVHQUNZX01JTk9SUyAweDEwCisjZGVmaW5lIENPTUVESV9OVU1fQk9BUkRfTUlOT1JTIDB4MzAKKyNkZWZpbmUgQ09NRURJX0ZJUlNUX1NVQkRFVklDRV9NSU5PUiBDT01FRElfTlVNX0JPQVJEX01JTk9SUworCit0eXBlZGVmIHN0cnVjdCBjb21lZGlfZGV2aWNlX3N0cnVjdCBjb21lZGlfZGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZV9zdHJ1Y3QgY29tZWRpX3N1YmRldmljZTsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9hc3luY19zdHJ1Y3QgY29tZWRpX2FzeW5jOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2RyaXZlcl9zdHJ1Y3QgY29tZWRpX2RyaXZlcjsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9scmFuZ2Vfc3RydWN0IGNvbWVkaV9scmFuZ2U7CisKK3R5cGVkZWYgc3RydWN0IGRldmljZSBkZXZpY2VfY3JlYXRlX3Jlc3VsdF90eXBlOworCisjZGVmaW5lIENPTUVESV9ERVZJQ0VfQ1JFQVRFKGNzLCBwYXJlbnQsIGRldnQsIGRydmRhdGEsIGRldmljZSwgZm10Li4uKSBcCisJZGV2aWNlX2NyZWF0ZShjcywgKChwYXJlbnQpID8gKHBhcmVudCkgOiAoZGV2aWNlKSksIGRldnQsIGRydmRhdGEsIGZtdCkKKworc3RydWN0IGNvbWVkaV9zdWJkZXZpY2Vfc3RydWN0IHsKKwljb21lZGlfZGV2aWNlICpkZXZpY2U7CisJaW50IHR5cGU7CisJaW50IG5fY2hhbjsKKwl2b2xhdGlsZSBpbnQgc3ViZGV2X2ZsYWdzOworCWludCBsZW5fY2hhbmxpc3Q7CS8qIG1heGltdW0gbGVuZ3RoIG9mIGNoYW5uZWwvZ2FpbiBsaXN0ICovCisKKwl2b2lkICpwcml2YXRlOworCisJY29tZWRpX2FzeW5jICphc3luYzsKKworCXZvaWQgKmxvY2s7CisJdm9pZCAqYnVzeTsKKwl1bnNpZ25lZCBydW5mbGFnczsKKwlzcGlubG9ja190IHNwaW5fbG9jazsKKworCWludCBpb19iaXRzOworCisJbHNhbXBsX3QgbWF4ZGF0YTsJLyogaWYgbWF4ZGF0YT09MCwgdXNlIGxpc3QgKi8KKwljb25zdCBsc2FtcGxfdCAqbWF4ZGF0YV9saXN0OwkvKiBsaXN0IGlzIGNoYW5uZWwgc3BlY2lmaWMgKi8KKworCXVuc2lnbmVkIGludCBmbGFnczsKKwljb25zdCB1bnNpZ25lZCBpbnQgKmZsYWdsaXN0OworCisJdW5zaWduZWQgaW50IHNldHRsaW5nX3RpbWVfMDsKKworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlX3RhYmxlOworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKmNvbnN0ICpyYW5nZV90YWJsZV9saXN0OworCisJdW5zaWduZWQgaW50ICpjaGFubGlzdDsJLyogZHJpdmVyLW93bmVkIGNoYW5saXN0IChub3QgdXNlZCkgKi8KKworCWludCAoKmluc25fcmVhZCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqLCBjb21lZGlfaW5zbiAqLAorCQlsc2FtcGxfdCAqKTsKKwlpbnQgKCppbnNuX3dyaXRlKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9pbnNuICosCisJCWxzYW1wbF90ICopOworCWludCAoKmluc25fYml0cykgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqLCBjb21lZGlfaW5zbiAqLAorCQlsc2FtcGxfdCAqKTsKKwlpbnQgKCppbnNuX2NvbmZpZykgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqLCBjb21lZGlfaW5zbiAqLAorCQlsc2FtcGxfdCAqKTsKKworCWludCAoKmRvX2NtZCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqKTsKKwlpbnQgKCpkb19jbWR0ZXN0KSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9jbWQgKik7CisJaW50ICgqcG9sbCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqKTsKKwlpbnQgKCpjYW5jZWwpIChjb21lZGlfZGV2aWNlICosIGNvbWVkaV9zdWJkZXZpY2UgKik7CisJLyogaW50ICgqZG9fbG9jaykoY29tZWRpX2RldmljZSAqLGNvbWVkaV9zdWJkZXZpY2UgKik7ICovCisJLyogaW50ICgqZG9fdW5sb2NrKShjb21lZGlfZGV2aWNlICosY29tZWRpX3N1YmRldmljZSAqKTsgKi8KKworCS8qIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgY2hhbmdlcyAqLworCWludCAoKmJ1Zl9jaGFuZ2UpIChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCXVuc2lnbmVkIGxvbmcgbmV3X3NpemUpOworCisJdm9pZCAoKm11bmdlKSAoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLCB2b2lkICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgbnVtX2J5dGVzLCB1bnNpZ25lZCBpbnQgc3RhcnRfY2hhbl9pbmRleCk7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gYXN5bmNfZG1hX2RpcjsKKworCXVuc2lnbmVkIGludCBzdGF0ZTsKKworCWRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGUgKmNsYXNzX2RldjsKKwlpbnQgbWlub3I7Cit9OworCitzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlIHsKKwl2b2lkICp2aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKK307CisKK3N0cnVjdCBjb21lZGlfYXN5bmNfc3RydWN0IHsKKwljb21lZGlfc3ViZGV2aWNlICpzdWJkZXZpY2U7CisKKwl2b2lkICpwcmVhbGxvY19idWY7CS8qIHByZS1hbGxvY2F0ZWQgYnVmZmVyICovCisJdW5zaWduZWQgaW50IHByZWFsbG9jX2J1ZnN6OwkvKiBidWZmZXIgc2l6ZSwgaW4gYnl0ZXMgKi8KKwlzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlICpidWZfcGFnZV9saXN0OwkvKiB2aXJ0dWFsIGFuZCBkbWEgYWRkcmVzcyBvZiBlYWNoIHBhZ2UgKi8KKwl1bnNpZ25lZCBuX2J1Zl9wYWdlczsJLyogbnVtIGVsZW1lbnRzIGluIGJ1Zl9wYWdlX2xpc3QgKi8KKworCXVuc2lnbmVkIGludCBtYXhfYnVmc2l6ZTsJLyogbWF4aW11bSBidWZmZXIgc2l6ZSwgYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgbW1hcF9jb3VudDsJLyogY3VycmVudCBudW1iZXIgb2YgbW1hcHMgb2YgcHJlYWxsb2NfYnVmICovCisKKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKHdyaXRlIGNvbXBsZXRlZCkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2FsbG9jX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKGFsbG9jYXRlZCBmb3Igd3JpdGluZykgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHJlYWRlciAocmVhZCBjb21wbGV0ZWQpICovCisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2FsbG9jX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciByZWFkZXIgKGFsbG9jYXRlZCBmb3IgcmVhZGluZykgKi8KKworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfcHRyOwkvKiBidWZmZXIgbWFya2VyIGZvciB3cml0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfcHRyOwkvKiBidWZmZXIgbWFya2VyIGZvciByZWFkZXIgKi8KKworCXVuc2lnbmVkIGludCBjdXJfY2hhbjsJLyogdXNlbGVzcyBjaGFubmVsIG1hcmtlciBmb3IgaW50ZXJydXB0ICovCisJLyogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHJlY2VpdmVkIGZvciBjdXJyZW50IHNjYW4gKi8KKwl1bnNpZ25lZCBpbnQgc2Nhbl9wcm9ncmVzczsKKwkvKiBrZWVwcyB0cmFjayBvZiB3aGVyZSB3ZSBhcmUgaW4gY2hhbmxpc3QgYXMgZm9yIG11bmdpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbXVuZ2VfY2hhbjsKKwkvKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gbXVuZ2VkICovCisJdW5zaWduZWQgaW50IG11bmdlX2NvdW50OworCS8qIGJ1ZmZlciBtYXJrZXIgZm9yIG11bmdpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbXVuZ2VfcHRyOworCisJdW5zaWduZWQgaW50IGV2ZW50czsJLyogZXZlbnRzIHRoYXQgaGF2ZSBvY2N1cnJlZCAqLworCisJY29tZWRpX2NtZCBjbWQ7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2hlYWQ7CisKKwkvKiBjYWxsYmFjayBzdHVmZiAqLworCXVuc2lnbmVkIGludCBjYl9tYXNrOworCWludCAoKmNiX2Z1bmMpICh1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKik7CisJdm9pZCAqY2JfYXJnOworCisJaW50ICgqaW50dHJpZykgKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXVuc2lnbmVkIGludCB4KTsKK307CisKK3N0cnVjdCBjb21lZGlfZHJpdmVyX3N0cnVjdCB7CisJc3RydWN0IGNvbWVkaV9kcml2ZXJfc3RydWN0ICpuZXh0OworCisJY29uc3QgY2hhciAqZHJpdmVyX25hbWU7CisJc3RydWN0IG1vZHVsZSAqbW9kdWxlOworCWludCAoKmF0dGFjaCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX2RldmNvbmZpZyAqKTsKKwlpbnQgKCpkZXRhY2gpIChjb21lZGlfZGV2aWNlICopOworCisJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJvYXJkX25hbWUgYW5kIGJvYXJkX2lkIGFycmF5cyAqLworCXVuc2lnbmVkIGludCBudW1fbmFtZXM7CisJY29uc3QgY2hhciAqY29uc3QgKmJvYXJkX25hbWU7CisJLyogb2Zmc2V0IGluIGJ5dGVzIGZyb20gb25lIGJvYXJkIG5hbWUgcG9pbnRlciB0byB0aGUgbmV4dCAqLworCWludCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgY29tZWRpX2RldmljZV9zdHJ1Y3QgeworCWludCB1c2VfY291bnQ7CisJY29tZWRpX2RyaXZlciAqZHJpdmVyOworCXZvaWQgKnByaXZhdGU7CisKKwlkZXZpY2VfY3JlYXRlX3Jlc3VsdF90eXBlICpjbGFzc19kZXY7CisJaW50IG1pbm9yOworCS8qIGh3X2RldiBpcyBwYXNzZWQgdG8gZG1hX2FsbG9jX2NvaGVyZW50IHdoZW4gYWxsb2NhdGluZyBhc3luYyBidWZmZXJzCisJICogZm9yIHN1YmRldmljZXMgdGhhdCBoYXZlIGFzeW5jX2RtYV9kaXIgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuCisJICogRE1BX05PTkUgKi8KKwlzdHJ1Y3QgZGV2aWNlICpod19kZXY7CisKKwljb25zdCBjaGFyICpib2FyZF9uYW1lOworCWNvbnN0IHZvaWQgKmJvYXJkX3B0cjsKKwlpbnQgYXR0YWNoZWQ7CisJaW50IHJ0OworCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CisJc3RydWN0IG11dGV4IG11dGV4OworCWludCBpbl9yZXF1ZXN0X21vZHVsZTsKKworCWludCBuX3N1YmRldmljZXM7CisJY29tZWRpX3N1YmRldmljZSAqc3ViZGV2aWNlczsKKworCS8qIGR1bWIgKi8KKwl1bnNpZ25lZCBsb25nIGlvYmFzZTsKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJY29tZWRpX3N1YmRldmljZSAqcmVhZF9zdWJkZXY7CisJY29tZWRpX3N1YmRldmljZSAqd3JpdGVfc3ViZGV2OworCisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmFzeW5jX3F1ZXVlOworCisJdm9pZCAoKm9wZW4pIChjb21lZGlfZGV2aWNlICpkZXYpOworCXZvaWQgKCpjbG9zZSkgKGNvbWVkaV9kZXZpY2UgKmRldik7Cit9OworCitzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8geworCWNvbWVkaV9kZXZpY2UgKmRldmljZTsKKwljb21lZGlfc3ViZGV2aWNlICpyZWFkX3N1YmRldmljZTsKKwljb21lZGlfc3ViZGV2aWNlICp3cml0ZV9zdWJkZXZpY2U7Cit9OworCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworZXh0ZXJuIGludCBjb21lZGlfZGVidWc7CisjZWxzZQorc3RhdGljIGNvbnN0IGludCBjb21lZGlfZGVidWc7CisjZW5kaWYKKworLyoKKyAqIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworCit2b2lkIGNvbWVkaV9ldmVudChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOwordm9pZCBjb21lZGlfZXJyb3IoY29uc3QgY29tZWRpX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpzKTsKKworLyogd2UgY2FuIGV4cGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBlbmNvZGUgZGV2aWNlcy9zdWJkZXZpY2VzIGludG8KKyB0aGUgbWlub3IgbnVtYmVyIHNvb24sIGFmdGVyIG1vcmUgZGlzdHJvcyBzdXBwb3J0ID4gOCBiaXQgbWlub3IgbnVtYmVycworIChsaWtlIGFmdGVyIERlYmlhbiBFdGNoIGdldHMgcmVsZWFzZWQpICovCitlbnVtIGNvbWVkaV9taW5vcl9iaXRzIHsKKwlDT01FRElfREVWSUNFX01JTk9SX01BU0sgPSAweGYsCisJQ09NRURJX1NVQkRFVklDRV9NSU5PUl9NQVNLID0gMHhmMAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBDT01FRElfU1VCREVWSUNFX01JTk9SX1NISUZUID0gNDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBDT01FRElfU1VCREVWSUNFX01JTk9SX09GRlNFVCA9IDE7CisKK3N0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKHVuc2lnbmVkIG1pbm9yKTsKKworc3RhdGljIGlubGluZSBjb21lZGlfc3ViZGV2aWNlICpjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKAorCQkJCWNvbnN0IHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+cmVhZF9zdWJkZXZpY2UpCisJCXJldHVybiBpbmZvLT5yZWFkX3N1YmRldmljZTsKKwlpZiAoaW5mby0+ZGV2aWNlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBpbmZvLT5kZXZpY2UtPnJlYWRfc3ViZGV2OworfQorCitzdGF0aWMgaW5saW5lIGNvbWVkaV9zdWJkZXZpY2UgKmNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKAorCQkJCWNvbnN0IHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+d3JpdGVfc3ViZGV2aWNlKQorCQlyZXR1cm4gaW5mby0+d3JpdGVfc3ViZGV2aWNlOworCWlmIChpbmZvLT5kZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGluZm8tPmRldmljZS0+d3JpdGVfc3ViZGV2OworfQorCit2b2lkIGNvbWVkaV9kZXZpY2VfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldik7CitpbnQgY29tZWRpX2RldmljZV9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCk7CitpbnQgY29tZWRpX2RyaXZlcl9yZWdpc3Rlcihjb21lZGlfZHJpdmVyICopOworaW50IGNvbWVkaV9kcml2ZXJfdW5yZWdpc3Rlcihjb21lZGlfZHJpdmVyICopOworCit2b2lkIGluaXRfcG9sbGluZyh2b2lkKTsKK3ZvaWQgY2xlYW51cF9wb2xsaW5nKHZvaWQpOwordm9pZCBzdGFydF9wb2xsaW5nKGNvbWVkaV9kZXZpY2UgKik7Cit2b2lkIHN0b3BfcG9sbGluZyhjb21lZGlfZGV2aWNlICopOworCitpbnQgY29tZWRpX2J1Zl9hbGxvYyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGxvbmcKKwluZXdfc2l6ZSk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBjb21lZGlfcHJvY19pbml0KHZvaWQpOwordm9pZCBjb21lZGlfcHJvY19jbGVhbnVwKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfcHJvY19pbml0KHZvaWQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgY29tZWRpX3Byb2NfY2xlYW51cCh2b2lkKQoreworfQorI2VuZGlmCisKKy8qIHN1YmRldmljZSBydW5mbGFncyAqLworZW51bSBzdWJkZXZpY2VfcnVuZmxhZ3MgeworCVNSRl9VU0VSID0gMHgwMDAwMDAwMSwKKwlTUkZfUlQgPSAweDAwMDAwMDAyLAorCS8qIGluZGljYXRlcyBhbiBDT01FRElfQ0JfRVJST1IgZXZlbnQgaGFzIG9jY3VycmVkIHNpbmNlIHRoZSBsYXN0CisJICogY29tbWFuZCB3YXMgc3RhcnRlZCAqLworCVNSRl9FUlJPUiA9IDB4MDAwMDAwMDQsCisJU1JGX1JVTk5JTkcgPSAweDA4MDAwMDAwCit9OworCisvKgorICAgdmFyaW91cyBpbnRlcm5hbCBjb21lZGkgZnVuY3Rpb25zCisgKi8KKworaW50IGRvX3JhbmdlaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9yYW5nZWluZm8gKmFyZyk7CitpbnQgY2hlY2tfY2hhbmxpc3QoY29tZWRpX3N1YmRldmljZSAqcywgaW50IG4sIHVuc2lnbmVkIGludCAqY2hhbmxpc3QpOwordm9pZCBjb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBtYXNrLAorCXVuc2lnbmVkIGJpdHMpOwordW5zaWduZWQgY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MoY29tZWRpX3N1YmRldmljZSAqcyk7CitpbnQgaW5zbl9pbnZhbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKTsKKworLyogcmFuZ2Ugc3R1ZmYgKi8KKworI2RlZmluZSBSQU5HRShhLCBiKQkJeyhhKSoxZTYsIChiKSoxZTYsIDB9CisjZGVmaW5lIFJBTkdFX2V4dChhLCBiKQkJeyhhKSoxZTYsIChiKSoxZTYsIFJGX0VYVEVSTkFMfQorI2RlZmluZSBSQU5HRV9tQShhLCBiKQkJeyhhKSoxZTYsIChiKSoxZTYsIFVOSVRfbUF9CisjZGVmaW5lIFJBTkdFX3VuaXRsZXNzKGEsIGIpCXsoYSkqMWU2LCAoYikqMWU2LCAwfQkvKiBYWFggKi8KKyNkZWZpbmUgQklQX1JBTkdFKGEpCQl7LShhKSoxZTYsIChhKSoxZTYsIDB9CisjZGVmaW5lIFVOSV9SQU5HRShhKQkJezAsIChhKSoxZTYsIDB9CisKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIxMDsKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXI1OworZXh0ZXJuIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjJfNTsKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VuaXBvbGFyMTA7CitleHRlcm4gY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmlwb2xhcjU7CitleHRlcm4gY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmtub3duOworCisjZGVmaW5lIHJhbmdlX2RpZ2l0YWwJCXJhbmdlX3VuaXBvbGFyNQorCisjaWYgX19HTlVDX18gPj0gMworI2RlZmluZSBHQ0NfWkVST19MRU5HVEhfQVJSQVkKKyNlbHNlCisjZGVmaW5lIEdDQ19aRVJPX0xFTkdUSF9BUlJBWSAwCisjZW5kaWYKKworc3RydWN0IGNvbWVkaV9scmFuZ2Vfc3RydWN0IHsKKwlpbnQgbGVuZ3RoOworCWNvbWVkaV9rcmFuZ2UgcmFuZ2VbR0NDX1pFUk9fTEVOR1RIX0FSUkFZXTsKK307CisKKy8qIHNvbWUgc2lsbHkgbGl0dGxlIGlubGluZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWxsb2Nfc3ViZGV2aWNlcyhjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgdW5zaWduZWQgaW50IG51bV9zdWJkZXZpY2VzKQoreworCXVuc2lnbmVkIGk7CisKKwlkZXYtPm5fc3ViZGV2aWNlcyA9IG51bV9zdWJkZXZpY2VzOworCWRldi0+c3ViZGV2aWNlcyA9CisJCWtjYWxsb2MobnVtX3N1YmRldmljZXMsIHNpemVvZihjb21lZGlfc3ViZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPnN1YmRldmljZXMpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBudW1fc3ViZGV2aWNlczsgKytpKSB7CisJCWRldi0+c3ViZGV2aWNlc1tpXS5kZXZpY2UgPSBkZXY7CisJCWRldi0+c3ViZGV2aWNlc1tpXS5hc3luY19kbWFfZGlyID0gRE1BX05PTkU7CisJCXNwaW5fbG9ja19pbml0KCZkZXYtPnN1YmRldmljZXNbaV0uc3Bpbl9sb2NrKTsKKwkJZGV2LT5zdWJkZXZpY2VzW2ldLm1pbm9yID0gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhbGxvY19wcml2YXRlKGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IHNpemUpCit7CisJZGV2LT5wcml2YXRlID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+cHJpdmF0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9zYW1wbGUoY29uc3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCkKK3sKKwlpZiAoc3ViZC0+c3ViZGV2X2ZsYWdzICYgU0RGX0xTQU1QTCkKKwkJcmV0dXJuIHNpemVvZihsc2FtcGxfdCk7CisJZWxzZQorCQlyZXR1cm4gc2l6ZW9mKHNhbXBsX3QpOworfQorCisvKiBtdXN0IGJlIHVzZWQgaW4gYXR0YWNoIHRvIHNldCBkZXYtPmh3X2RldiBpZiB5b3Ugd2lzaCB0byBkbWEgZGlyZWN0bHkKK2ludG8gY29tZWRpJ3MgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29tZWRpX3NldF9od19kZXYoY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpod19kZXYpCit7CisJaWYgKGRldi0+aHdfZGV2KQorCQlwdXRfZGV2aWNlKGRldi0+aHdfZGV2KTsKKworCWRldi0+aHdfZGV2ID0gaHdfZGV2OworCWlmIChkZXYtPmh3X2RldikgeworCQlkZXYtPmh3X2RldiA9IGdldF9kZXZpY2UoZGV2LT5od19kZXYpOworCQlCVUdfT04oZGV2LT5od19kZXYgPT0gTlVMTCk7CisJfQorfQorCitpbnQgY29tZWRpX2J1Zl9wdXQoY29tZWRpX2FzeW5jICphc3luYywgc2FtcGxfdCB4KTsKK2ludCBjb21lZGlfYnVmX2dldChjb21lZGlfYXN5bmMgKmFzeW5jLCBzYW1wbF90ICp4KTsKKwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfd3JpdGVfbl9hdmFpbGFibGUoY29tZWRpX2FzeW5jICphc3luYyk7Cit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhjb21lZGlfYXN5bmMgKmFzeW5jLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3dyaXRlX2FsbG9jX3N0cmljdChjb21lZGlfYXN5bmMgKmFzeW5jLAorCXVuc2lnbmVkIGludCBuYnl0ZXMpOwordW5zaWduZWQgY29tZWRpX2J1Zl93cml0ZV9mcmVlKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwordW5zaWduZWQgY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIG5ieXRlcyk7Cit1bnNpZ25lZCBjb21lZGlfYnVmX3JlYWRfZnJlZShjb21lZGlfYXN5bmMgKmFzeW5jLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUoY29tZWRpX2FzeW5jICphc3luYyk7Cit2b2lkIGNvbWVkaV9idWZfbWVtY3B5X3RvKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJY29uc3Qgdm9pZCAqc291cmNlLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKK3ZvaWQgY29tZWRpX2J1Zl9tZW1jcHlfZnJvbShjb21lZGlfYXN5bmMgKmFzeW5jLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCXZvaWQgKmRlc3RpbmF0aW9uLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29tZWRpX2J1Zl93cml0ZV9uX2FsbG9jYXRlZChjb21lZGlfYXN5bmMgKmFzeW5jKQoreworCXJldHVybiBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50IC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29tZWRpX2J1Zl9yZWFkX25fYWxsb2NhdGVkKGNvbWVkaV9hc3luYyAqYXN5bmMpCit7CisJcmV0dXJuIGFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCAtIGFzeW5jLT5idWZfcmVhZF9jb3VudDsKK30KKwordm9pZCBjb21lZGlfcmVzZXRfYXN5bmNfYnVmKGNvbWVkaV9hc3luYyAqYXN5bmMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmNvbWVkaV9hdXhfZGF0YShpbnQgb3B0aW9uc1tdLCBpbnQgbikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzTG93OworCWludCBiaXRfc2hpZnQ7CisJaWYgKHNpemVvZihpbnQpID49IHNpemVvZih2b2lkICopKQorCQlhZGRyZXNzID0gb3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MT107CisJZWxzZSB7CisJCWFkZHJlc3MgPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0hJXTsKKwkJYml0X3NoaWZ0ID0gc2l6ZW9mKGludCkgKiA4OworCQlhZGRyZXNzIDw8PSBiaXRfc2hpZnQ7CisJCWFkZHJlc3NMb3cgPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xPXTsKKwkJYWRkcmVzc0xvdyAmPSAoMVVMIDw8IGJpdF9zaGlmdCkgLSAxOworCQlhZGRyZXNzIHw9IGFkZHJlc3NMb3c7CisJfQorCWlmIChuID49IDEpCisJCWFkZHJlc3MgKz0gb3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQTBfTEVOR1RIXTsKKwlpZiAobiA+PSAyKQorCQlhZGRyZXNzICs9IG9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEExX0xFTkdUSF07CisJaWYgKG4gPj0gMykKKwkJYWRkcmVzcyArPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBMl9MRU5HVEhdOworCUJVR19PTihuID4gMyk7CisJcmV0dXJuICh2b2lkICopYWRkcmVzczsKK30KKworaW50IGNvbWVkaV9hbGxvY19ib2FyZF9taW5vcihzdHJ1Y3QgZGV2aWNlICpoYXJkd2FyZV9kZXZpY2UpOwordm9pZCBjb21lZGlfZnJlZV9ib2FyZF9taW5vcih1bnNpZ25lZCBtaW5vcik7CitpbnQgY29tZWRpX2FsbG9jX3N1YmRldmljZV9taW5vcihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOwordm9pZCBjb21lZGlfZnJlZV9zdWJkZXZpY2VfbWlub3IoY29tZWRpX3N1YmRldmljZSAqcyk7CitpbnQgY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBjaGFyICpib2FyZF9uYW1lKTsKK3ZvaWQgY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpOworCisjaW5jbHVkZSAiY29tZWRpX3J0LmgiCisKKyNlbmRpZiAvKiBfQ09NRURJREVWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpbGliLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNWZjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWxpYi5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICAgIGxpbnV4L2luY2x1ZGUvY29tZWRpbGliLmgKKyAgICBoZWFkZXIgZmlsZSBmb3Iga2NvbWVkaWxpYgorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX0xJTlVYX0NPTUVESUxJQl9ICisjZGVmaW5lIF9MSU5VWF9DT01FRElMSUJfSAorCisjaW5jbHVkZSAiY29tZWRpLmgiCisKKy8qIEtlcm5lbCBpbnRlcm5hbCBzdHVmZi4gIE5lZWRlZCBieSByZWFsLXRpbWUgbW9kdWxlcyBhbmQgc3VjaC4gKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjZXJyb3IgbGludXgvY29tZWRpbGliLmggc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBieSBub24ta2VybmVsLXNwYWNlIGNvZGUKKyNlbmRpZgorCisvKiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KKworI2lmbmRlZiBLQ09NRURJTElCX0RFUFJFQ0FURUQKKwordHlwZWRlZiB2b2lkIGNvbWVkaV90OworCisvKiB0aGVzZSBmdW5jdGlvbnMgbWF5IG5vdCBiZSBjYWxsZWQgYXQgcmVhbC10aW1lIHByaW9yaXR5ICovCisKK2NvbWVkaV90ICpjb21lZGlfb3Blbihjb25zdCBjaGFyICpwYXRoKTsKK2ludCBjb21lZGlfY2xvc2UoY29tZWRpX3QgKmRldik7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSBwcmlvcml0eSwgYnV0IG1heSBmYWlsIGF0CisgICByZWFsLXRpbWUgcHJpb3JpdHkgKi8KKworaW50IGNvbWVkaV9sb2NrKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYpOworaW50IGNvbWVkaV91bmxvY2soY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldik7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSBwcmlvcml0eSwgYnV0IHlvdSBtdXN0IGhvbGQKKyAgIHRoZSBsb2NrIGZvciB0aGUgc3ViZGV2aWNlICovCisKK2ludCBjb21lZGlfbG9nbGV2ZWwoaW50IGxvZ2xldmVsKTsKK3ZvaWQgY29tZWRpX3BlcnJvcihjb25zdCBjaGFyICpzKTsKK2NoYXIgKmNvbWVkaV9zdHJlcnJvcihpbnQgZXJybnVtKTsKK2ludCBjb21lZGlfZXJybm8odm9pZCk7CitpbnQgY29tZWRpX2ZpbGVubyhjb21lZGlfdCAqZGV2KTsKKworaW50IGNvbWVkaV9jYW5jZWwoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX3JlZ2lzdGVyX2NhbGxiYWNrKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IG1hc2ssIGludCAoKmNiKSAodW5zaWduZWQgaW50LCB2b2lkICopLCB2b2lkICphcmcpOworCitpbnQgY29tZWRpX2NvbW1hbmQoY29tZWRpX3QgKmRldiwgY29tZWRpX2NtZCAqY21kKTsKK2ludCBjb21lZGlfY29tbWFuZF90ZXN0KGNvbWVkaV90ICpkZXYsIGNvbWVkaV9jbWQgKmNtZCk7CitpbnQgY29tZWRpX3RyaWdnZXIoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgY29tZWRpX3RyaWcgKml0KTsKK2ludCBfX2NvbWVkaV90cmlnZ2VyKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIGNvbWVkaV90cmlnICppdCk7CitpbnQgY29tZWRpX2RhdGFfd3JpdGUoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZiwgbHNhbXBsX3QgZGF0YSk7CitpbnQgY29tZWRpX2RhdGFfcmVhZChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCAqZGF0YSk7CitpbnQgY29tZWRpX2RhdGFfcmVhZF9oaW50KGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYpOworaW50IGNvbWVkaV9kYXRhX3JlYWRfZGVsYXllZChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LAorCXVuc2lnbmVkIGludCBjaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLAorCWxzYW1wbF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgbmFub19zZWMpOworaW50IGNvbWVkaV9kaW9fY29uZmlnKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCBpbyk7CitpbnQgY29tZWRpX2Rpb19yZWFkKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBjb21lZGlfZGlvX3dyaXRlKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCB2YWwpOworaW50IGNvbWVkaV9kaW9fYml0ZmllbGQoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IG1hc2ssCisJdW5zaWduZWQgaW50ICpiaXRzKTsKK2ludCBjb21lZGlfZ2V0X25fc3ViZGV2aWNlcyhjb21lZGlfdCAqZGV2KTsKK2ludCBjb21lZGlfZ2V0X3ZlcnNpb25fY29kZShjb21lZGlfdCAqZGV2KTsKK2NvbnN0IGNoYXIgKmNvbWVkaV9nZXRfZHJpdmVyX25hbWUoY29tZWRpX3QgKmRldik7Citjb25zdCBjaGFyICpjb21lZGlfZ2V0X2JvYXJkX25hbWUoY29tZWRpX3QgKmRldik7CitpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfdHlwZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2ludCBjb21lZGlfZmluZF9zdWJkZXZpY2VfYnlfdHlwZShjb21lZGlfdCAqZGV2LCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN1YmQpOworaW50IGNvbWVkaV9nZXRfbl9jaGFubmVscyhjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2xzYW1wbF90IGNvbWVkaV9nZXRfbWF4ZGF0YShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZAorCWludCBjaGFuKTsKK2ludCBjb21lZGlfZ2V0X25fcmFuZ2VzKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludAorCWNoYW4pOworaW50IGNvbWVkaV9kb19pbnNuKGNvbWVkaV90ICpkZXYsIGNvbWVkaV9pbnNuICppbnNuKTsKK2ludCBjb21lZGlfcG9sbChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKKworLyogREVQUkVDQVRFRCBmdW5jdGlvbnMgKi8KK2ludCBjb21lZGlfZ2V0X3JhbmdldHlwZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBjaGFuKTsKKworLyogQUxQSEEgZnVuY3Rpb25zICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfZmxhZ3MoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9sZW5fY2hhbmxpc3QoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9rcmFuZ2UoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQgaW50CisJY2hhbiwgdW5zaWduZWQgaW50IHJhbmdlLCBjb21lZGlfa3JhbmdlICprcmFuZ2UpOwordW5zaWduZWQgaW50IGNvbWVkaV9nZXRfYnVmX2hlYWRfcG9zKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworaW50IGNvbWVkaV9zZXRfdXNlcl9pbnRfY291bnQoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgYnVmX3VzZXJfY291bnQpOworaW50IGNvbWVkaV9tYXAoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdm9pZCAqcHRyKTsKK2ludCBjb21lZGlfdW5tYXAoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX2dldF9idWZmZXJfc2l6ZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKK2ludCBjb21lZGlfbWFya19idWZmZXJfcmVhZChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworaW50IGNvbWVkaV9tYXJrX2J1ZmZlcl93cml0dGVuKGNvbWVkaV90ICpkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworaW50IGNvbWVkaV9nZXRfYnVmZmVyX2NvbnRlbnRzKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworaW50IGNvbWVkaV9nZXRfYnVmZmVyX29mZnNldChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKKworI2Vsc2UKKworLyogdGhlc2UgZnVuY3Rpb25zIG1heSBub3QgYmUgY2FsbGVkIGF0IHJlYWwtdGltZSBwcmlvcml0eSAqLworCitpbnQgY29tZWRpX29wZW4odW5zaWduZWQgaW50IG1pbm9yKTsKK3ZvaWQgY29tZWRpX2Nsb3NlKHVuc2lnbmVkIGludCBtaW5vcik7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSBwcmlvcml0eSwgYnV0IG1heSBmYWlsIGF0CisgICByZWFsLXRpbWUgcHJpb3JpdHkgKi8KKworaW50IGNvbWVkaV9sb2NrKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX3VubG9jayh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYpOworCisvKiB0aGVzZSBmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZCBhdCBhbnkgcHJpb3JpdHksIGJ1dCB5b3UgbXVzdCBob2xkCisgICB0aGUgbG9jayBmb3IgdGhlIHN1YmRldmljZSAqLworCitpbnQgY29tZWRpX2NhbmNlbCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYpOworaW50IGNvbWVkaV9yZWdpc3Rlcl9jYWxsYmFjayh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IG1hc2ssIGludCAoKmNiKSAodW5zaWduZWQgaW50LCB2b2lkICopLCB2b2lkICphcmcpOworCitpbnQgY29tZWRpX2NvbW1hbmQodW5zaWduZWQgaW50IG1pbm9yLCBjb21lZGlfY21kICpjbWQpOworaW50IGNvbWVkaV9jb21tYW5kX3Rlc3QodW5zaWduZWQgaW50IG1pbm9yLCBjb21lZGlfY21kICpjbWQpOworaW50IGNvbWVkaV90cmlnZ2VyKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldiwgY29tZWRpX3RyaWcgKml0KTsKK2ludCBfX2NvbWVkaV90cmlnZ2VyKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldiwgY29tZWRpX3RyaWcgKml0KTsKK2ludCBjb21lZGlfZGF0YV93cml0ZSh1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCBkYXRhKTsKK2ludCBjb21lZGlfZGF0YV9yZWFkKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90ICpkYXRhKTsKK2ludCBjb21lZGlfZGlvX2NvbmZpZyh1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgaW8pOworaW50IGNvbWVkaV9kaW9fcmVhZCh1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgY29tZWRpX2Rpb193cml0ZSh1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBjb21lZGlfZGlvX2JpdGZpZWxkKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCAqYml0cyk7CitpbnQgY29tZWRpX2dldF9uX3N1YmRldmljZXModW5zaWduZWQgaW50IGRldik7CitpbnQgY29tZWRpX2dldF92ZXJzaW9uX2NvZGUodW5zaWduZWQgaW50IGRldik7CitjaGFyICpjb21lZGlfZ2V0X2RyaXZlcl9uYW1lKHVuc2lnbmVkIGludCBkZXYpOworY2hhciAqY29tZWRpX2dldF9ib2FyZF9uYW1lKHVuc2lnbmVkIGludCBtaW5vcik7CitpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfdHlwZSh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworaW50IGNvbWVkaV9maW5kX3N1YmRldmljZV9ieV90eXBlKHVuc2lnbmVkIGludCBtaW5vciwgaW50IHR5cGUsCisJdW5zaWduZWQgaW50IHN1YmQpOworaW50IGNvbWVkaV9nZXRfbl9jaGFubmVscyh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworbHNhbXBsX3QgY29tZWRpX2dldF9tYXhkYXRhKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQKKwlpbnQgY2hhbik7CitpbnQgY29tZWRpX2dldF9uX3Jhbmdlcyh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludAorCWNoYW4pOworaW50IGNvbWVkaV9kb19pbnNuKHVuc2lnbmVkIGludCBtaW5vciwgY29tZWRpX2luc24gKmluc24pOworaW50IGNvbWVkaV9wb2xsKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CisKKy8qIERFUFJFQ0FURUQgZnVuY3Rpb25zICovCitpbnQgY29tZWRpX2dldF9yYW5nZXR5cGUodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBjaGFuKTsKKworLyogQUxQSEEgZnVuY3Rpb25zICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfZmxhZ3ModW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQKKwlzdWJkZXZpY2UpOworaW50IGNvbWVkaV9nZXRfbGVuX2NoYW5saXN0KHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9rcmFuZ2UodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZCBpbnQKKwljaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIGNvbWVkaV9rcmFuZ2UgKmtyYW5nZSk7Cit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9idWZfaGVhZF9wb3ModW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQKKwlzdWJkZXZpY2UpOworaW50IGNvbWVkaV9zZXRfdXNlcl9pbnRfY291bnQodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBidWZfdXNlcl9jb3VudCk7CitpbnQgY29tZWRpX21hcCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYsIHZvaWQgKipwdHIpOworaW50IGNvbWVkaV91bm1hcCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYpOworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzcyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAgICBtb2R1bGUvZHJpdmVycy5jCisgICAgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgZHJpdmVycworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgImNvbWVkaV9mb3BzLmgiCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKyNpbmNsdWRlICJ3cmFwcGVyLmgiCisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgkvKiBmb3IgU3VTRSBicm9rZW5uZXNzICovCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgaW50IHBvc3Rjb25maWcoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IGluc25fcndfZW11bGF0ZV9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyB2b2lkICpjb21lZGlfcmVjb2duaXplKGNvbWVkaV9kcml2ZXIgKiBkcml2LCBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyB2b2lkIGNvbWVkaV9yZXBvcnRfYm9hcmRzKGNvbWVkaV9kcml2ZXIgKiBkcml2KTsKK3N0YXRpYyBpbnQgcG9sbF9pbnZhbGlkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKK2ludCBjb21lZGlfYnVmX2FsbG9jKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGxvbmcgbmV3X3NpemUpOworCitjb21lZGlfZHJpdmVyICpjb21lZGlfZHJpdmVyczsKKworaW50IGNvbWVkaV9tb2Rwcm9iZShpbnQgbWlub3IpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZGV2aWNlKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJaW50IGk7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChkZXYtPnN1YmRldmljZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOworCQkJY29tZWRpX2ZyZWVfc3ViZGV2aWNlX21pbm9yKHMpOworCQkJaWYgKHMtPmFzeW5jKSB7CisJCQkJY29tZWRpX2J1Zl9hbGxvYyhkZXYsIHMsIDApOworCQkJCWtmcmVlKHMtPmFzeW5jKTsKKwkJCX0KKwkJfQorCQlrZnJlZShkZXYtPnN1YmRldmljZXMpOworCQlkZXYtPnN1YmRldmljZXMgPSBOVUxMOworCQlkZXYtPm5fc3ViZGV2aWNlcyA9IDA7CisJfQorCWlmIChkZXYtPnByaXZhdGUpIHsKKwkJa2ZyZWUoZGV2LT5wcml2YXRlKTsKKwkJZGV2LT5wcml2YXRlID0gTlVMTDsKKwl9CisJZGV2LT5kcml2ZXIgPSAwOworCWRldi0+Ym9hcmRfbmFtZSA9IE5VTEw7CisJZGV2LT5ib2FyZF9wdHIgPSBOVUxMOworCWRldi0+aW9iYXNlID0gMDsKKwlkZXYtPmlycSA9IDA7CisJZGV2LT5yZWFkX3N1YmRldiA9IE5VTEw7CisJZGV2LT53cml0ZV9zdWJkZXYgPSBOVUxMOworCWRldi0+b3BlbiA9IE5VTEw7CisJZGV2LT5jbG9zZSA9IE5VTEw7CisJY29tZWRpX3NldF9od19kZXYoZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgX19jb21lZGlfZGV2aWNlX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCWRldi0+YXR0YWNoZWQgPSAwOworCWlmIChkZXYtPmRyaXZlcikgeworCQlkZXYtPmRyaXZlci0+ZGV0YWNoKGRldik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJCVUc6IGRldi0+ZHJpdmVyPU5VTEwgaW4gY29tZWRpX2RldmljZV9kZXRhY2goKVxuIik7CisJfQorCWNsZWFudXBfZGV2aWNlKGRldik7Cit9CisKK3ZvaWQgY29tZWRpX2RldmljZV9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpZiAoIWRldi0+YXR0YWNoZWQpCisJCXJldHVybjsKKwlfX2NvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7Cit9CisKK2ludCBjb21lZGlfZGV2aWNlX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisJY29tZWRpX2RyaXZlciAqZHJpdjsKKwlpbnQgcmV0OworCisJaWYgKGRldi0+YXR0YWNoZWQpCisJCXJldHVybiAtRUJVU1k7CisKKwlmb3IgKGRyaXYgPSBjb21lZGlfZHJpdmVyczsgZHJpdjsgZHJpdiA9IGRyaXYtPm5leHQpIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkcml2LT5tb2R1bGUpKSB7CisJCQlwcmludGsoImNvbWVkaTogZmFpbGVkIHRvIGluY3JlbWVudCBtb2R1bGUgY291bnQsIHNraXBwaW5nXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChkcml2LT5udW1fbmFtZXMpIHsKKwkJCWRldi0+Ym9hcmRfcHRyID0gY29tZWRpX3JlY29nbml6ZShkcml2LCBpdC0+Ym9hcmRfbmFtZSk7CisJCQlpZiAoZGV2LT5ib2FyZF9wdHIgPT0gTlVMTCkgeworCQkJCW1vZHVsZV9wdXQoZHJpdi0+bW9kdWxlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAoZHJpdi0+ZHJpdmVyX25hbWUsIGl0LT5ib2FyZF9uYW1lKSkgeworCQkJCW1vZHVsZV9wdXQoZHJpdi0+bW9kdWxlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkvL2luaXRpYWxpemUgZGV2LT5kcml2ZXIgaGVyZSBzbyBjb21lZGlfZXJyb3IoKSBjYW4gYmUgY2FsbGVkIGZyb20gYXR0YWNoCisJCWRldi0+ZHJpdmVyID0gZHJpdjsKKwkJcmV0ID0gZHJpdi0+YXR0YWNoKGRldiwgaXQpOworCQlpZiAocmV0IDwgMCkgeworCQkJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+bW9kdWxlKTsKKwkJCV9fY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZ290byBhdHRhY2hlZDsKKwl9CisKKwkvLyByZWNvZ25pemUgaGFzIGZhaWxlZCBpZiB3ZSBnZXQgaGVyZQorCS8vIHJlcG9ydCB2YWxpZCBib2FyZCBuYW1lcyBiZWZvcmUgcmV0dXJuaW5nIGVycm9yCisJZm9yIChkcml2ID0gY29tZWRpX2RyaXZlcnM7IGRyaXY7IGRyaXYgPSBkcml2LT5uZXh0KSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQoZHJpdi0+bW9kdWxlKSkgeworCQkJcHJpbnRrKCJjb21lZGk6IGZhaWxlZCB0byBpbmNyZW1lbnQgbW9kdWxlIGNvdW50XG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNvbWVkaV9yZXBvcnRfYm9hcmRzKGRyaXYpOworCQltb2R1bGVfcHV0KGRyaXYtPm1vZHVsZSk7CisJfQorCXJldHVybiAtRUlPOworCithdHRhY2hlZDoKKwkvKiBkbyBhIGxpdHRsZSBwb3N0LWNvbmZpZyBjbGVhbnVwICovCisJcmV0ID0gcG9zdGNvbmZpZyhkZXYpOworCW1vZHVsZV9wdXQoZGV2LT5kcml2ZXItPm1vZHVsZSk7CisJaWYgKHJldCA8IDApIHsKKwkJX19jb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghZGV2LT5ib2FyZF9uYW1lKSB7CisJCXByaW50aygiQlVHOiBkZXYtPmJvYXJkX25hbWU9PCVwPlxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKKwkJZGV2LT5ib2FyZF9uYW1lID0gIkJVRyI7CisJfQorCXNtcF93bWIoKTsKKwlkZXYtPmF0dGFjaGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgY29tZWRpX2RyaXZlcl9yZWdpc3Rlcihjb21lZGlfZHJpdmVyICogZHJpdmVyKQoreworCWRyaXZlci0+bmV4dCA9IGNvbWVkaV9kcml2ZXJzOworCWNvbWVkaV9kcml2ZXJzID0gZHJpdmVyOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoY29tZWRpX2RyaXZlciAqIGRyaXZlcikKK3sKKwljb21lZGlfZHJpdmVyICpwcmV2OworCWludCBpOworCisJLyogY2hlY2sgZm9yIGRldmljZXMgdXNpbmcgdGhpcyBkcml2ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9CT0FSRF9NSU5PUlM7IGkrKykgeworCQlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8oaSk7CisJCWNvbWVkaV9kZXZpY2UgKmRldjsKKworCQlpZihkZXZfZmlsZV9pbmZvID09IE5VTEwpIGNvbnRpbnVlOworCQlkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJCWlmIChkZXYtPmF0dGFjaGVkICYmIGRldi0+ZHJpdmVyID09IGRyaXZlcikgeworCQkJaWYgKGRldi0+dXNlX2NvdW50KQorCQkJCXByaW50aygiQlVHISBkZXRhY2hpbmcgZGV2aWNlIHdpdGggdXNlX2NvdW50PSVkXG4iLCBkZXYtPnVzZV9jb3VudCk7CisJCQljb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQl9CisJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJfQorCisJaWYgKGNvbWVkaV9kcml2ZXJzID09IGRyaXZlcikgeworCQljb21lZGlfZHJpdmVycyA9IGRyaXZlci0+bmV4dDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChwcmV2ID0gY29tZWRpX2RyaXZlcnM7IHByZXYtPm5leHQ7IHByZXYgPSBwcmV2LT5uZXh0KSB7CisJCWlmIChwcmV2LT5uZXh0ID09IGRyaXZlcikgeworCQkJcHJldi0+bmV4dCA9IGRyaXZlci0+bmV4dDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHBvc3Rjb25maWcoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpbnQgaTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBOVUxMOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKKworCQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpCisJCQljb250aW51ZTsKKworCQlpZiAocy0+bGVuX2NoYW5saXN0ID09IDApCisJCQlzLT5sZW5fY2hhbmxpc3QgPSAxOworCisJCWlmIChzLT5kb19jbWQpIHsKKwkJCUJVR19PTigocy0+c3ViZGV2X2ZsYWdzICYgKFNERl9DTURfUkVBRCB8CisJCQkJU0RGX0NNRF9XUklURSkpID09IDApOworCQkJQlVHX09OKCFzLT5kb19jbWR0ZXN0KTsKKworCQkJYXN5bmMgPSBremFsbG9jKHNpemVvZihjb21lZGlfYXN5bmMpLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChhc3luYyA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCJmYWlsZWQgdG8gYWxsb2NhdGUgYXN5bmMgc3RydWN0XG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFzeW5jLT53YWl0X2hlYWQpOworCQkJYXN5bmMtPnN1YmRldmljZSA9IHM7CisJCQlzLT5hc3luYyA9IGFzeW5jOworCisjZGVmaW5lIERFRkFVTFRfQlVGX01BWFNJWkUgKDY0KjEwMjQpCisjZGVmaW5lIERFRkFVTFRfQlVGX1NJWkUgKDY0KjEwMjQpCisKKwkJCWFzeW5jLT5tYXhfYnVmc2l6ZSA9IERFRkFVTFRfQlVGX01BWFNJWkU7CisKKwkJCWFzeW5jLT5wcmVhbGxvY19idWYgPSBOVUxMOworCQkJYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID0gMDsKKwkJCWlmIChjb21lZGlfYnVmX2FsbG9jKGRldiwgcywgREVGQVVMVF9CVUZfU0laRSkgPCAwKSB7CisJCQkJcHJpbnRrKCJCdWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaWYgKHMtPmJ1Zl9jaGFuZ2UpIHsKKwkJCQlyZXQgPSBzLT5idWZfY2hhbmdlKGRldiwgcywgREVGQVVMVF9CVUZfU0laRSk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQljb21lZGlfYWxsb2Nfc3ViZGV2aWNlX21pbm9yKGRldiwgcyk7CisJCX0KKworCQlpZiAoIXMtPnJhbmdlX3RhYmxlICYmICFzLT5yYW5nZV90YWJsZV9saXN0KQorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKKworCQlpZiAoIXMtPmluc25fcmVhZCAmJiBzLT5pbnNuX2JpdHMpCisJCQlzLT5pbnNuX3JlYWQgPSBpbnNuX3J3X2VtdWxhdGVfYml0czsKKwkJaWYgKCFzLT5pbnNuX3dyaXRlICYmIHMtPmluc25fYml0cykKKwkJCXMtPmluc25fd3JpdGUgPSBpbnNuX3J3X2VtdWxhdGVfYml0czsKKworCQlpZiAoIXMtPmluc25fcmVhZCkKKwkJCXMtPmluc25fcmVhZCA9IGluc25faW52YWw7CisJCWlmICghcy0+aW5zbl93cml0ZSkKKwkJCXMtPmluc25fd3JpdGUgPSBpbnNuX2ludmFsOworCQlpZiAoIXMtPmluc25fYml0cykKKwkJCXMtPmluc25fYml0cyA9IGluc25faW52YWw7CisJCWlmICghcy0+aW5zbl9jb25maWcpCisJCQlzLT5pbnNuX2NvbmZpZyA9IGluc25faW52YWw7CisKKwkJaWYgKCFzLT5wb2xsKQorCQkJcy0+cG9sbCA9IHBvbGxfaW52YWxpZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy8gZ2VuZXJpYyByZWNvZ25pemUgZnVuY3Rpb24gZm9yIGRyaXZlcnMgdGhhdCByZWdpc3RlciB0aGVpciBzdXBwb3J0ZWQgYm9hcmQgbmFtZXMKK3ZvaWQgKmNvbWVkaV9yZWNvZ25pemUoY29tZWRpX2RyaXZlciAqIGRyaXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaTsKKwljb25zdCBjaGFyICpjb25zdCAqbmFtZV9wdHIgPSBkcml2LT5ib2FyZF9uYW1lOworCWZvciAoaSA9IDA7IGkgPCBkcml2LT5udW1fbmFtZXM7IGkrKykgeworCQlpZiAoc3RyY21wKCpuYW1lX3B0ciwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiAodm9pZCAqKW5hbWVfcHRyOworCQluYW1lX3B0ciA9CisJCQkoY29uc3QgY2hhciAqY29uc3QgKikoKGNvbnN0IGNoYXIgKiluYW1lX3B0ciArCisJCQlkcml2LT5vZmZzZXQpOworCX0KKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGNvbWVkaV9yZXBvcnRfYm9hcmRzKGNvbWVkaV9kcml2ZXIgKiBkcml2KQoreworCXVuc2lnbmVkIGludCBpOworCWNvbnN0IGNoYXIgKmNvbnN0ICpuYW1lX3B0cjsKKworCXByaW50aygiY29tZWRpOiB2YWxpZCBib2FyZCBuYW1lcyBmb3IgJXMgZHJpdmVyIGFyZTpcbiIsCisJCWRyaXYtPmRyaXZlcl9uYW1lKTsKKworCW5hbWVfcHRyID0gZHJpdi0+Ym9hcmRfbmFtZTsKKwlmb3IgKGkgPSAwOyBpIDwgZHJpdi0+bnVtX25hbWVzOyBpKyspIHsKKwkJcHJpbnRrKCIgJXNcbiIsICpuYW1lX3B0cik7CisJCW5hbWVfcHRyID0gKGNvbnN0IGNoYXIgKiopKChjaGFyICopbmFtZV9wdHIgKyBkcml2LT5vZmZzZXQpOworCX0KKworCWlmIChkcml2LT5udW1fbmFtZXMgPT0gMCkKKwkJcHJpbnRrKCIgJXNcbiIsIGRyaXYtPmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIGludCBwb2xsX2ludmFsaWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBpbnNuX2ludmFsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGluc25fcndfZW11bGF0ZV9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWNvbWVkaV9pbnNuIG5ld19pbnNuOworCWludCByZXQ7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxzX3Blcl9iaXRmaWVsZCA9IDMyOworCisJdW5zaWduZWQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWNvbnN0IHVuc2lnbmVkIGJhc2VfYml0ZmllbGRfY2hhbm5lbCA9CisJCShjaGFuIDwgY2hhbm5lbHNfcGVyX2JpdGZpZWxkKSA/IDAgOiBjaGFuOworCWxzYW1wbF90IG5ld19kYXRhWzJdOworCW1lbXNldChuZXdfZGF0YSwgMCwgc2l6ZW9mKG5ld19kYXRhKSk7CisJbWVtc2V0KCZuZXdfaW5zbiwgMCwgc2l6ZW9mKG5ld19pbnNuKSk7CisJbmV3X2luc24uaW5zbiA9IElOU05fQklUUzsKKwluZXdfaW5zbi5jaGFuc3BlYyA9IGJhc2VfYml0ZmllbGRfY2hhbm5lbDsKKwluZXdfaW5zbi5uID0gMjsKKwluZXdfaW5zbi5kYXRhID0gbmV3X2RhdGE7CisJbmV3X2luc24uc3ViZGV2ID0gaW5zbi0+c3ViZGV2OworCisJaWYgKGluc24tPmluc24gPT0gSU5TTl9XUklURSkgeworCQlpZiAoIShzLT5zdWJkZXZfZmxhZ3MgJiBTREZfV1JJVEFCTEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5ld19kYXRhWzBdID0gMSA8PCAoY2hhbiAtIGJhc2VfYml0ZmllbGRfY2hhbm5lbCk7CS8qIG1hc2sgKi8KKwkJbmV3X2RhdGFbMV0gPSBkYXRhWzBdID8gKDEgPDwgKGNoYW4gLSBiYXNlX2JpdGZpZWxkX2NoYW5uZWwpKSA6IDA7CS8qIGJpdHMgKi8KKwl9CisKKwlyZXQgPSBzLT5pbnNuX2JpdHMoZGV2LCBzLCAmbmV3X2luc24sIG5ld19kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpbnNuLT5pbnNuID09IElOU05fUkVBRCkgeworCQlkYXRhWzBdID0gKG5ld19kYXRhWzFdID4+IChjaGFuIC0gYmFzZV9iaXRmaWVsZF9jaGFubmVsKSkgJiAxOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdXZpcnRfdG9fa3ZhKHBnZF90ICogcGdkLCB1bnNpZ25lZCBsb25nIGFkcikKK3sKKwl1bnNpZ25lZCBsb25nIHJldCA9IDBVTDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGVwLCBwdGU7CisJcHVkX3QgKnB1ZDsKKworCWlmICghcGdkX25vbmUoKnBnZCkpIHsKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkcik7CisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZHIpOworCQlpZiAoIXBtZF9ub25lKCpwbWQpKSB7CisJCQlwdGVwID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZHIpOworCQkJcHRlID0gKnB0ZXA7CisJCQlpZiAocHRlX3ByZXNlbnQocHRlKSkgeworCQkJCXJldCA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQlwYWdlX2FkZHJlc3MocHRlX3BhZ2UocHRlKSk7CisJCQkJcmV0IHw9IChhZHIgJiAoUEFHRV9TSVpFIC0gMSkpOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrdmlydF90b19rdmEodW5zaWduZWQgbG9uZyBhZHIpCit7CisJdW5zaWduZWQgbG9uZyB2YSwga3ZhOworCisJdmEgPSBhZHI7CisJa3ZhID0gdXZpcnRfdG9fa3ZhKHBnZF9vZmZzZXRfayh2YSksIHZhKTsKKworCXJldHVybiBrdmE7Cit9CisKK2ludCBjb21lZGlfYnVmX2FsbG9jKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGxvbmcgbmV3X3NpemUpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCisJLyogUm91bmQgdXAgbmV3X3NpemUgdG8gbXVsdGlwbGUgb2YgUEFHRV9TSVpFICovCisJbmV3X3NpemUgPSAobmV3X3NpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKworCS8qIGlmIG5vIGNoYW5nZSBpcyByZXF1aXJlZCwgZG8gbm90aGluZyAqLworCWlmIChhc3luYy0+cHJlYWxsb2NfYnVmICYmIGFzeW5jLT5wcmVhbGxvY19idWZzeiA9PSBuZXdfc2l6ZSkgeworCQlyZXR1cm4gMDsKKwl9CisJLy8gZGVhbGxvY2F0ZSBvbGQgYnVmZmVyCisJaWYgKGFzeW5jLT5wcmVhbGxvY19idWYpIHsKKwkJdnVubWFwKGFzeW5jLT5wcmVhbGxvY19idWYpOworCQlhc3luYy0+cHJlYWxsb2NfYnVmID0gTlVMTDsKKwkJYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID0gMDsKKwl9CisJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0KSB7CisJCXVuc2lnbmVkIGk7CisJCWZvciAoaSA9IDA7IGkgPCBhc3luYy0+bl9idWZfcGFnZXM7ICsraSkgeworCQkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkcikgeworCQkJCW1lbV9tYXBfdW5yZXNlcnZlKHZpcnRfdG9fcGFnZShhc3luYy0+CisJCQkJCQlidWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkcikpOworCQkJCWlmIChzLT5hc3luY19kbWFfZGlyICE9IERNQV9OT05FKSB7CisJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAorCQkJCQkJUEFHRV9TSVpFLAorCQkJCQkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQl2aXJ0X2FkZHIsCisJCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCWRtYV9hZGRyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYXN5bmMtPgorCQkJCQkJYnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpOworCQkJCX0KKwkJCX0KKwkJfQorCQl2ZnJlZShhc3luYy0+YnVmX3BhZ2VfbGlzdCk7CisJCWFzeW5jLT5idWZfcGFnZV9saXN0ID0gTlVMTDsKKwkJYXN5bmMtPm5fYnVmX3BhZ2VzID0gMDsKKwl9CisJLy8gYWxsb2NhdGUgbmV3IGJ1ZmZlcgorCWlmIChuZXdfc2l6ZSkgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJdW5zaWduZWQgbl9wYWdlcyA9IG5ld19zaXplID4+IFBBR0VfU0hJRlQ7CisJCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOworCisJCWFzeW5jLT5idWZfcGFnZV9saXN0ID0KKwkJCXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21lZGlfYnVmX3BhZ2UpICogbl9wYWdlcyk7CisJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdCkgeworCQkJbWVtc2V0KGFzeW5jLT5idWZfcGFnZV9saXN0LCAwLAorCQkJCXNpemVvZihzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlKSAqIG5fcGFnZXMpOworCQkJcGFnZXMgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG5fcGFnZXMpOworCQl9CisJCWlmIChwYWdlcykgeworCQkJZm9yIChpID0gMDsgaSA8IG5fcGFnZXM7IGkrKykgeworCQkJCWlmIChzLT5hc3luY19kbWFfZGlyICE9IERNQV9OT05FKSB7CisJCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciA9CisJCQkJCQlkbWFfYWxsb2NfY29oZXJlbnQoZGV2LT5od19kZXYsCisJCQkJCQlQQUdFX1NJWkUsCisJCQkJCQkmYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQlkbWFfYWRkciwKKwkJCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9DT01QKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIgPQorCQkJCQkJKHZvaWQgKikKKwkJCQkJCWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJCQl9CisJCQkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciA9PSBOVUxMKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltZW1fbWFwX3Jlc2VydmUodmlydF90b19wYWdlKGFzeW5jLT4KKwkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKSk7CisJCQkJcGFnZXNbaV0gPQorCQkJCQl2aXJ0X3RvX3BhZ2UoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCXZpcnRfYWRkcik7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gbl9wYWdlcykgeworCQkJYXN5bmMtPnByZWFsbG9jX2J1ZiA9CisJCQkJdm1hcChwYWdlcywgbl9wYWdlcywgVk1fTUFQLAorCQkJCVBBR0VfS0VSTkVMX05PQ0FDSEUpOworCQl9CisJCWlmIChwYWdlcykgeworCQkJdmZyZWUocGFnZXMpOworCQl9CisJCWlmIChhc3luYy0+cHJlYWxsb2NfYnVmID09IE5VTEwpIHsKKwkJCS8qIFNvbWUgYWxsb2NhdGlvbiBmYWlsZWQgYWJvdmUuICovCisJCQlpZiAoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbl9wYWdlczsgaSsrKSB7CisJCQkJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIgPT0KKwkJCQkJCU5VTEwpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW1lbV9tYXBfdW5yZXNlcnZlKHZpcnRfdG9fcGFnZShhc3luYy0+CisJCQkJCQkJYnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIpKTsKKwkJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKKwkJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAorCQkJCQkJCVBBR0VfU0laRSwKKwkJCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIsCisJCQkJCQkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQkJZG1hX2FkZHIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFzeW5jLT4KKwkJCQkJCQlidWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCXZpcnRfYWRkcik7CisJCQkJCX0KKwkJCQl9CisJCQkJdmZyZWUoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QpOworCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0ID0gTlVMTDsKKwkJCX0KKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWFzeW5jLT5uX2J1Zl9wYWdlcyA9IG5fcGFnZXM7CisJfQorCWFzeW5jLT5wcmVhbGxvY19idWZzeiA9IG5ld19zaXplOworCisJcmV0dXJuIDA7Cit9CisKKy8qIG11bmdpbmcgaXMgYXBwbGllZCB0byBkYXRhIGJ5IGNvcmUgYXMgaXQgcGFzc2VzIGJldHdlZW4gdXNlcgorICogYW5kIGtlcm5lbCBzcGFjZSAqLwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfbXVuZ2UoY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGFzeW5jLT5zdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwljb25zdCB1bnNpZ25lZCBudW1fc2FtcGxlX2J5dGVzID0gYnl0ZXNfcGVyX3NhbXBsZShzKTsKKworCWlmIChzLT5tdW5nZSA9PSBOVUxMIHx8IChhc3luYy0+Y21kLmZsYWdzICYgQ01ERl9SQVdEQVRBKSkgeworCQlhc3luYy0+bXVuZ2VfY291bnQgKz0gbnVtX2J5dGVzOworCQlpZiAoKGludCkoYXN5bmMtPm11bmdlX2NvdW50IC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCkgPiAwKQorCQkJQlVHKCk7CisJCXJldHVybiBudW1fYnl0ZXM7CisJfQorCS8qIGRvbid0IG11bmdlIHBhcnRpYWwgc2FtcGxlcyAqLworCW51bV9ieXRlcyAtPSBudW1fYnl0ZXMgJSBudW1fc2FtcGxlX2J5dGVzOworCXdoaWxlIChjb3VudCA8IG51bV9ieXRlcykgeworCQlpbnQgYmxvY2tfc2l6ZTsKKworCQlibG9ja19zaXplID0gbnVtX2J5dGVzIC0gY291bnQ7CisJCWlmIChibG9ja19zaXplIDwgMCkgeworCQkJcnRfcHJpbnRrKCIlczogJXM6IGJ1ZyEgYmxvY2tfc2l6ZSBpcyBuZWdhdGl2ZVxuIiwKKwkJCQlfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoaW50KShhc3luYy0+bXVuZ2VfcHRyICsgYmxvY2tfc2l6ZSAtCisJCQkJYXN5bmMtPnByZWFsbG9jX2J1ZnN6KSA+IDApCisJCQlibG9ja19zaXplID0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gYXN5bmMtPm11bmdlX3B0cjsKKworCQlzLT5tdW5nZShzLT5kZXZpY2UsIHMsIGFzeW5jLT5wcmVhbGxvY19idWYgKyBhc3luYy0+bXVuZ2VfcHRyLAorCQkJYmxvY2tfc2l6ZSwgYXN5bmMtPm11bmdlX2NoYW4pOworCisJCXNtcF93bWIoKTsJLy9iYXJyaWVyIGluc3VyZXMgZGF0YSBpcyBtdW5nZWQgaW4gYnVmZmVyIGJlZm9yZSBtdW5nZV9jb3VudCBpcyBpbmNyZW1lbnRlZAorCisJCWFzeW5jLT5tdW5nZV9jaGFuICs9IGJsb2NrX3NpemUgLyBudW1fc2FtcGxlX2J5dGVzOworCQlhc3luYy0+bXVuZ2VfY2hhbiAlPSBhc3luYy0+Y21kLmNoYW5saXN0X2xlbjsKKwkJYXN5bmMtPm11bmdlX2NvdW50ICs9IGJsb2NrX3NpemU7CisJCWFzeW5jLT5tdW5nZV9wdHIgKz0gYmxvY2tfc2l6ZTsKKwkJYXN5bmMtPm11bmdlX3B0ciAlPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJCWNvdW50ICs9IGJsb2NrX3NpemU7CisJfQorCWlmICgoaW50KShhc3luYy0+bXVuZ2VfY291bnQgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50KSA+IDApCisJCUJVRygpOworCXJldHVybiBjb3VudDsKK30KKwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfd3JpdGVfbl9hdmFpbGFibGUoY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJdW5zaWduZWQgaW50IGZyZWVfZW5kOworCXVuc2lnbmVkIGludCBuYnl0ZXM7CisKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmcmVlX2VuZCA9IGFzeW5jLT5idWZfcmVhZF9jb3VudCArIGFzeW5jLT5wcmVhbGxvY19idWZzejsKKwluYnl0ZXMgPSBmcmVlX2VuZCAtIGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQ7CisJbmJ5dGVzIC09IG5ieXRlcyAlIGJ5dGVzX3Blcl9zYW1wbGUoYXN5bmMtPnN1YmRldmljZSk7CisJLyogYmFycmllciBpbnN1cmVzIHRoZSByZWFkIG9mIGJ1Zl9yZWFkX2NvdW50IGluIHRoaXMKKwkgICBxdWVyeSBvY2N1cnMgYmVmb3JlIGFueSBmb2xsb3dpbmcgd3JpdGVzIHRvIHRoZSBidWZmZXIgd2hpY2gKKwkgICBtaWdodCBiZSBiYXNlZCBvbiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBxdWVyeS4KKwkgKi8KKwlzbXBfbWIoKTsKKwlyZXR1cm4gbmJ5dGVzOworfQorCisvKiBhbGxvY2F0ZXMgY2h1bmsgZm9yIHRoZSB3cml0ZXIgZnJvbSBmcmVlIGJ1ZmZlciBzcGFjZSAqLwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfd3JpdGVfYWxsb2MoY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJdW5zaWduZWQgaW50IGZyZWVfZW5kID0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ICsgYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCisJaWYgKChpbnQpKGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgKyBuYnl0ZXMgLSBmcmVlX2VuZCkgPiAwKSB7CisJCW5ieXRlcyA9IGZyZWVfZW5kIC0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudDsKKwl9CisJYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCArPSBuYnl0ZXM7CisJLyogYmFycmllciBpbnN1cmVzIHRoZSByZWFkIG9mIGJ1Zl9yZWFkX2NvdW50IGFib3ZlIG9jY3VycyBiZWZvcmUKKwkgICB3ZSB3cml0ZSBkYXRhIHRvIHRoZSB3cml0ZS1hbGxvYydlZCBidWZmZXIgc3BhY2UgKi8KKwlzbXBfbWIoKTsKKwlyZXR1cm4gbmJ5dGVzOworfQorCisvKiBhbGxvY2F0ZXMgbm90aGluZyB1bmxlc3MgaXQgY2FuIGNvbXBsZXRlbHkgZnVsZmlsbCB0aGUgcmVxdWVzdCAqLwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfd3JpdGVfYWxsb2Nfc3RyaWN0KGNvbWVkaV9hc3luYyAqIGFzeW5jLAorCXVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJdW5zaWduZWQgaW50IGZyZWVfZW5kID0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ICsgYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCisJaWYgKChpbnQpKGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgKyBuYnl0ZXMgLSBmcmVlX2VuZCkgPiAwKSB7CisJCW5ieXRlcyA9IDA7CisJfQorCWFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgKz0gbmJ5dGVzOworCS8qIGJhcnJpZXIgaW5zdXJlcyB0aGUgcmVhZCBvZiBidWZfcmVhZF9jb3VudCBhYm92ZSBvY2N1cnMgYmVmb3JlCisJICAgd2Ugd3JpdGUgZGF0YSB0byB0aGUgd3JpdGUtYWxsb2MnZWQgYnVmZmVyIHNwYWNlICovCisJc21wX21iKCk7CisJcmV0dXJuIG5ieXRlczsKK30KKworLyogdHJhbnNmZXJzIGEgY2h1bmsgZnJvbSB3cml0ZXIgdG8gZmlsbGVkIGJ1ZmZlciBzcGFjZSAqLwordW5zaWduZWQgY29tZWRpX2J1Zl93cml0ZV9mcmVlKGNvbWVkaV9hc3luYyAqIGFzeW5jLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCWlmICgoaW50KShhc3luYy0+YnVmX3dyaXRlX2NvdW50ICsgbmJ5dGVzIC0KKwkJCWFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQpID4gMCkgeworCQlydF9wcmludGsKKwkJCSgiY29tZWRpOiBhdHRlbXB0ZWQgdG8gd3JpdGUtZnJlZSBtb3JlIGJ5dGVzIHRoYW4gaGF2ZSBiZWVuIHdyaXRlLWFsbG9jYXRlZC5cbiIpOworCQluYnl0ZXMgPSBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50IC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudDsKKwl9CisJYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCArPSBuYnl0ZXM7CisJYXN5bmMtPmJ1Zl93cml0ZV9wdHIgKz0gbmJ5dGVzOworCWNvbWVkaV9idWZfbXVuZ2UoYXN5bmMsIGFzeW5jLT5idWZfd3JpdGVfY291bnQgLSBhc3luYy0+bXVuZ2VfY291bnQpOworCWlmIChhc3luYy0+YnVmX3dyaXRlX3B0ciA+PSBhc3luYy0+cHJlYWxsb2NfYnVmc3opIHsKKwkJYXN5bmMtPmJ1Zl93cml0ZV9wdHIgJT0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCX0KKwlyZXR1cm4gbmJ5dGVzOworfQorCisvKiBhbGxvY2F0ZXMgYSBjaHVuayBmb3IgdGhlIHJlYWRlciBmcm9tIGZpbGxlZCAoYW5kIG11bmdlZCkgYnVmZmVyIHNwYWNlICovCit1bnNpZ25lZCBjb21lZGlfYnVmX3JlYWRfYWxsb2MoY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIG5ieXRlcykKK3sKKwlpZiAoKGludCkoYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50ICsgbmJ5dGVzIC0gYXN5bmMtPm11bmdlX2NvdW50KSA+CisJCTApIHsKKwkJbmJ5dGVzID0gYXN5bmMtPm11bmdlX2NvdW50IC0gYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50OworCX0KKwlhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQgKz0gbmJ5dGVzOworCS8qIGJhcnJpZXIgaW5zdXJlcyByZWFkIG9mIG11bmdlX2NvdW50IG9jY3VycyBiZWZvcmUgd2UgYWN0dWFsbHkgcmVhZAorCSAgIGRhdGEgb3V0IG9mIGJ1ZmZlciAqLworCXNtcF9ybWIoKTsKKwlyZXR1cm4gbmJ5dGVzOworfQorCisvKiB0cmFuc2ZlcnMgY29udHJvbCBvZiBhIGNodW5rIGZyb20gcmVhZGVyIHRvIGZyZWUgYnVmZmVyIHNwYWNlICovCit1bnNpZ25lZCBjb21lZGlfYnVmX3JlYWRfZnJlZShjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwkvLyBiYXJyaWVyIGluc3VyZXMgZGF0YSBoYXMgYmVlbiByZWFkIG91dCBvZiBidWZmZXIgYmVmb3JlIHJlYWQgY291bnQgaXMgaW5jcmVtZW50ZWQKKwlzbXBfbWIoKTsKKwlpZiAoKGludCkoYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ICsgbmJ5dGVzIC0KKwkJCWFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCkgPiAwKSB7CisJCXJ0X3ByaW50aworCQkJKCJjb21lZGk6IGF0dGVtcHRlZCB0byByZWFkLWZyZWUgbW9yZSBieXRlcyB0aGFuIGhhdmUgYmVlbiByZWFkLWFsbG9jYXRlZC5cbiIpOworCQluYnl0ZXMgPSBhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQgLSBhc3luYy0+YnVmX3JlYWRfY291bnQ7CisJfQorCWFzeW5jLT5idWZfcmVhZF9jb3VudCArPSBuYnl0ZXM7CisJYXN5bmMtPmJ1Zl9yZWFkX3B0ciArPSBuYnl0ZXM7CisJYXN5bmMtPmJ1Zl9yZWFkX3B0ciAlPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJcmV0dXJuIG5ieXRlczsKK30KKwordm9pZCBjb21lZGlfYnVmX21lbWNweV90byhjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgaW50IG9mZnNldCwKKwljb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQoreworCXVuc2lnbmVkIGludCB3cml0ZV9wdHIgPSBhc3luYy0+YnVmX3dyaXRlX3B0ciArIG9mZnNldDsKKworCWlmICh3cml0ZV9wdHIgPj0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KQorCQl3cml0ZV9wdHIgJT0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCisJd2hpbGUgKG51bV9ieXRlcykgeworCQl1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZTsKKworCQlpZiAod3JpdGVfcHRyICsgbnVtX2J5dGVzID4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KQorCQkJYmxvY2tfc2l6ZSA9IGFzeW5jLT5wcmVhbGxvY19idWZzeiAtIHdyaXRlX3B0cjsKKwkJZWxzZQorCQkJYmxvY2tfc2l6ZSA9IG51bV9ieXRlczsKKworCQltZW1jcHkoYXN5bmMtPnByZWFsbG9jX2J1ZiArIHdyaXRlX3B0ciwgZGF0YSwgYmxvY2tfc2l6ZSk7CisKKwkJZGF0YSArPSBibG9ja19zaXplOworCQludW1fYnl0ZXMgLT0gYmxvY2tfc2l6ZTsKKworCQl3cml0ZV9wdHIgPSAwOworCX0KK30KKwordm9pZCBjb21lZGlfYnVmX21lbWNweV9mcm9tKGNvbWVkaV9hc3luYyAqIGFzeW5jLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCXZvaWQgKmRlc3QsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJdm9pZCAqc3JjOworCXVuc2lnbmVkIGludCByZWFkX3B0ciA9IGFzeW5jLT5idWZfcmVhZF9wdHIgKyBvZmZzZXQ7CisKKwlpZiAocmVhZF9wdHIgPj0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KQorCQlyZWFkX3B0ciAlPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisKKwl3aGlsZSAobmJ5dGVzKSB7CisJCXVuc2lnbmVkIGludCBibG9ja19zaXplOworCisJCXNyYyA9IGFzeW5jLT5wcmVhbGxvY19idWYgKyByZWFkX3B0cjsKKworCQlpZiAobmJ5dGVzID49IGFzeW5jLT5wcmVhbGxvY19idWZzeiAtIHJlYWRfcHRyKQorCQkJYmxvY2tfc2l6ZSA9IGFzeW5jLT5wcmVhbGxvY19idWZzeiAtIHJlYWRfcHRyOworCQllbHNlCisJCQlibG9ja19zaXplID0gbmJ5dGVzOworCisJCW1lbWNweShkZXN0LCBzcmMsIGJsb2NrX3NpemUpOworCQluYnl0ZXMgLT0gYmxvY2tfc2l6ZTsKKwkJZGVzdCArPSBibG9ja19zaXplOworCQlyZWFkX3B0ciA9IDA7CisJfQorfQorCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKGNvbWVkaV9hc3luYyAqIGFzeW5jKQoreworCXVuc2lnbmVkIG51bV9ieXRlczsKKworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwludW1fYnl0ZXMgPSBhc3luYy0+bXVuZ2VfY291bnQgLSBhc3luYy0+YnVmX3JlYWRfY291bnQ7CisJLyogYmFycmllciBpbnN1cmVzIHRoZSByZWFkIG9mIG11bmdlX2NvdW50IGluIHRoaXMKKwkgICBxdWVyeSBvY2N1cnMgYmVmb3JlIGFueSBmb2xsb3dpbmcgcmVhZHMgb2YgdGhlIGJ1ZmZlciB3aGljaAorCSAgIG1pZ2h0IGJlIGJhc2VkIG9uIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIHF1ZXJ5LgorCSAqLworCXNtcF9ybWIoKTsKKwlyZXR1cm4gbnVtX2J5dGVzOworfQorCitpbnQgY29tZWRpX2J1Zl9nZXQoY29tZWRpX2FzeW5jICogYXN5bmMsIHNhbXBsX3QgKiB4KQoreworCXVuc2lnbmVkIGludCBuID0gY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKGFzeW5jKTsKKworCWlmIChuIDwgc2l6ZW9mKHNhbXBsX3QpKQorCQlyZXR1cm4gMDsKKwljb21lZGlfYnVmX3JlYWRfYWxsb2MoYXN5bmMsIHNpemVvZihzYW1wbF90KSk7CisJKnggPSAqKHNhbXBsX3QgKikgKGFzeW5jLT5wcmVhbGxvY19idWYgKyBhc3luYy0+YnVmX3JlYWRfcHRyKTsKKwljb21lZGlfYnVmX3JlYWRfZnJlZShhc3luYywgc2l6ZW9mKHNhbXBsX3QpKTsKKwlyZXR1cm4gMTsKK30KKworaW50IGNvbWVkaV9idWZfcHV0KGNvbWVkaV9hc3luYyAqIGFzeW5jLCBzYW1wbF90IHgpCit7CisJdW5zaWduZWQgaW50IG4gPSBjb21lZGlfYnVmX3dyaXRlX2FsbG9jX3N0cmljdChhc3luYywgc2l6ZW9mKHNhbXBsX3QpKTsKKworCWlmIChuIDwgc2l6ZW9mKHNhbXBsX3QpKSB7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQlyZXR1cm4gMDsKKwl9CisJKihzYW1wbF90ICopIChhc3luYy0+cHJlYWxsb2NfYnVmICsgYXN5bmMtPmJ1Zl93cml0ZV9wdHIpID0geDsKKwljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIHNpemVvZihzYW1wbF90KSk7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgY29tZWRpX3Jlc2V0X2FzeW5jX2J1Zihjb21lZGlfYXN5bmMgKiBhc3luYykKK3sKKwlhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50ID0gMDsKKwlhc3luYy0+YnVmX3dyaXRlX2NvdW50ID0gMDsKKwlhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQgPSAwOworCWFzeW5jLT5idWZfcmVhZF9jb3VudCA9IDA7CisKKwlhc3luYy0+YnVmX3dyaXRlX3B0ciA9IDA7CisJYXN5bmMtPmJ1Zl9yZWFkX3B0ciA9IDA7CisKKwlhc3luYy0+Y3VyX2NoYW4gPSAwOworCWFzeW5jLT5zY2FuX3Byb2dyZXNzID0gMDsKKwlhc3luYy0+bXVuZ2VfY2hhbiA9IDA7CisJYXN5bmMtPm11bmdlX2NvdW50ID0gMDsKKwlhc3luYy0+bXVuZ2VfcHRyID0gMDsKKworCWFzeW5jLT5ldmVudHMgPSAwOworfQorCitpbnQgY29tZWRpX2F1dG9fY29uZmlnKHN0cnVjdCBkZXZpY2UgKmhhcmR3YXJlX2RldmljZSwgY29uc3QgY2hhciAqYm9hcmRfbmFtZSwgY29uc3QgaW50ICpvcHRpb25zLCB1bnNpZ25lZCBudW1fb3B0aW9ucykKK3sKKwljb21lZGlfZGV2Y29uZmlnIGl0OworCWludCBtaW5vcjsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm87CisJaW50IHJldHZhbDsKKworCW1pbm9yID0gY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKGhhcmR3YXJlX2RldmljZSk7CisJaWYobWlub3IgPCAwKSByZXR1cm4gbWlub3I7CisJZGV2X3NldF9kcnZkYXRhKGhhcmR3YXJlX2RldmljZSwgKHZvaWQqKSh1bnNpZ25lZCBsb25nKW1pbm9yKTsKKworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCisJbWVtc2V0KCZpdCwgMCwgc2l6ZW9mKGl0KSk7CisJc3RybmNweShpdC5ib2FyZF9uYW1lLCBib2FyZF9uYW1lLCBDT01FRElfTkFNRUxFTik7CisJaXQuYm9hcmRfbmFtZVtDT01FRElfTkFNRUxFTiAtIDFdID0gJ1wwJzsKKwlCVUdfT04obnVtX29wdGlvbnMgPiBDT01FRElfTkRFVkNPTkZPUFRTKTsKKwltZW1jcHkoaXQub3B0aW9ucywgb3B0aW9ucywgbnVtX29wdGlvbnMgKiBzaXplb2YoaW50KSk7CisKKwltdXRleF9sb2NrKCZkZXZfZmlsZV9pbmZvLT5kZXZpY2UtPm11dGV4KTsKKwlyZXR2YWwgPSBjb21lZGlfZGV2aWNlX2F0dGFjaChkZXZfZmlsZV9pbmZvLT5kZXZpY2UsICZpdCk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfZmlsZV9pbmZvLT5kZXZpY2UtPm11dGV4KTsKKwlpZihyZXR2YWwgPCAwKQorCXsKKwkJY29tZWRpX2ZyZWVfYm9hcmRfbWlub3IobWlub3IpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIGNvbWVkaV9hdXRvX3VuY29uZmlnKHN0cnVjdCBkZXZpY2UgKmhhcmR3YXJlX2RldmljZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbm9yID0gKHVuc2lnbmVkIGxvbmcpZGV2X2dldF9kcnZkYXRhKGhhcmR3YXJlX2RldmljZSk7CisKKwlCVUdfT04obWlub3IgPj0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpOworCisJY29tZWRpX2ZyZWVfYm9hcmRfbWlub3IobWlub3IpOworfQorCitpbnQgY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBjaGFyICpib2FyZF9uYW1lKQoreworCWludCBvcHRpb25zWzJdOworCisJLy8gcGNpIGJ1cworCW9wdGlvbnNbMF0gPSBwY2lkZXYtPmJ1cy0+bnVtYmVyOworCS8vIHBjaSBzbG90CisJb3B0aW9uc1sxXSA9IFBDSV9TTE9UKHBjaWRldi0+ZGV2Zm4pOworCisJcmV0dXJuIGNvbWVkaV9hdXRvX2NvbmZpZygmcGNpZGV2LT5kZXYsIGJvYXJkX25hbWUsIG9wdGlvbnMsIHNpemVvZihvcHRpb25zKSAvIHNpemVvZihvcHRpb25zWzBdKSk7Cit9CisKK3ZvaWQgY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJY29tZWRpX2F1dG9fdW5jb25maWcoJnBjaWRldi0+ZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjdhNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMgTWFrZWZpbGUgZm9yIGluZGl2aWR1YWwgY29tZWRpIGRyaXZlcnMKKyMKKworIyBDb21lZGkgImhlbHBlciIgbW9kdWxlcworb2JqLSQoQ09ORklHX0NPTUVESSkJCQkrPSBjb21lZGlfZmMubworb2JqLSQoQ09ORklHX0NPTUVESSkJCQkrPSBjb21lZGlfYm9uZC5vCitvYmotJChDT05GSUdfQ09NRURJKQkJCSs9IGNvbWVkaV90ZXN0Lm8KK29iai0kKENPTkZJR19DT01FREkpCQkJKz0gY29tZWRpX3BhcnBvcnQubworCisjIENvbWVkaSBQQ0kgZHJpdmVycworb2JqLSQoQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUykJKz0gbWl0ZS5vCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBpY3BfbXVsdGkubworb2JqLSQoQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUykJKz0gbWVfZGFxLm8KK29iai0kKENPTkZJR19DT01FRElfUENJX0RSSVZFUlMpCSs9IG1lNDAwMC5vCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBydGQ1MjAubworb2JqLSQoQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUykJKz0gczYyNi5vCisKKyMgQ29tZWRpIFVTQiBkcml2ZXJzCitvYmotJChDT05GSUdfQ09NRURJX1VTQl9EUklWRVJTKQkrPSB1c2JkdXgubworb2JqLSQoQ09ORklHX0NPTUVESV9VU0JfRFJJVkVSUykJKz0gdXNiZHV4ZmFzdC5vCitvYmotJChDT05GSUdfQ09NRURJX1VTQl9EUklWRVJTKQkrPSBkdDk4MTIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU0OTZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYworICAgIEEgQ29tZWRpIGRyaXZlciB0byAnYm9uZCcgb3IgbWVyZ2UgbXVsdGlwbGUgZHJpdmVycyBhbmQgZGV2aWNlcyBhcyBvbmUuCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwNSBDYWxpbiBBLiBDdWxpYW51IDxjYWxpbkBhanZhci5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKy8qCitEcml2ZXI6IGNvbWVkaV9ib25kCitEZXNjcmlwdGlvbjogQSBkcml2ZXIgdG8gJ2JvbmQnIChtZXJnZSkgbXVsdGlwbGUgc3ViZGV2aWNlcyBmcm9tIG11bHRpcGxlCisJICAgICBkZXZpY2VzIHRvZ2V0aGVyIGFzIG9uZS4KK0RldmljZXM6CitBdXRob3I6IGRzCitVcGRhdGVkOiBNb24sIDEwIE9jdCAwMDoxODoyNSAtMDUwMAorU3RhdHVzOiB3b3JrcworCitUaGlzIGRyaXZlciBhbGxvd3MgeW91IHRvICdib25kJyAobWVyZ2UpIG11bHRpcGxlIGNvbWVkaSBzdWJkZXZpY2VzCisoY29taW5nIGZyb20gcG9zc2libHkgZGlmZmVyZW5jZSBib2FyZHMgYW5kL29yIGRyaXZlcnMpIHRvZ2V0aGVyLiAgRm9yCitleGFtcGxlLCBpZiB5b3UgaGFkIGEgYm9hcmQgd2l0aCAyIGRpZmZlcmVudCBESU8gc3ViZGV2aWNlcywgYW5kCithbm90aGVyIHdpdGggMSBESU8gc3ViZGV2aWNlLCB5b3UgY291bGQgJ2JvbmQnIHRoZW0gd2l0aCB0aGlzIGRyaXZlcgorc28gdGhhdCB0aGV5IGxvb2sgbGlrZSBvbmUgYmlnIGZhdCBESU8gc3ViZGV2aWNlLiAgVGhpcyBtYWtlcyB3cml0aW5nCithcHBsaWNhdGlvbnMgc2xpZ2h0bHkgZWFzaWVyIGFzIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IG1hbmFnaW5nCitkaWZmZXJlbnQgc3ViZGV2aWNlcyBpbiB0aGUgYXBwbGljYXRpb24gLS0geW91IGp1c3Qgd29ycnkgYWJvdXQKK2luZGV4aW5nIG9uZSBsaW5lYXIgYXJyYXkgb2YgY2hhbm5lbCBpZCdzLgorCitSaWdodCBub3cgb25seSBESU8gc3ViZGV2aWNlcyBhcmUgc3VwcG9ydGVkIGFzIHRoYXQncyB0aGUgcGVyc29uYWwgaXRjaAorSSBhbSBzY3JhdGNoaW5nIHdpdGggdGhpcyBkcml2ZXIuICBJZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgQUkgYW5kIEFPCitzdWJkZXZzLCBnbyByaWdodCBvbiBhaGVhZCBhbmQgZG8gc28hCisKK0NvbW1hbmRzIGFyZW4ndCBzdXBwb3J0ZWQgLS0gYWx0aG91Z2ggaXQgd291bGQgYmUgY29vbCBpZiB0aGV5IHdlcmUuCisKK0NvbmZpZ3VyYXRpb24gT3B0aW9uczoKKyAgTGlzdCBvZiBjb21lZGktbWlub3JzIHRvIGJvbmQuICBBbGwgc3ViZGV2aWNlcyBvZiB0aGUgc2FtZSB0eXBlCisgIHdpdGhpbiBlYWNoIG1pbm9yIHdpbGwgYmUgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyIGluIHRoZSBvcmRlciBnaXZlbiBoZXJlLgorKi8KKworLyoKKyAqIFRoZSBwcmV2aW91cyBibG9jayBjb21tZW50IGlzIHVzZWQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZQorICogZG9jdW1lbnRhdGlvbiBpbiBDb21lZGkgYW5kIENvbWVkaWxpYi4gIFRoZSBmaWVsZHM6CisgKgorICogRHJpdmVyOiB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyCisgKiBEZXNjcmlwdGlvbjogYSBzaG9ydCBwaHJhc2UgZGVzY3JpYmluZyB0aGUgZHJpdmVyLiAgRG9uJ3QgbGlzdCBib2FyZHMuCisgKiBEZXZpY2VzOiBhIGZ1bGwgbGlzdCBvZiB0aGUgYm9hcmRzIHRoYXQgYXR0ZW1wdCB0byBiZSBzdXBwb3J0ZWQgYnkKKyAqICAgdGhlIGRyaXZlci4gIEZvcm1hdCBpcyAiKG1hbnVmYWN0dXJlcikgYm9hcmQgbmFtZSBbY29tZWRpIG5hbWVdIiwKKyAqICAgd2hlcmUgY29tZWRpX25hbWUgaXMgdGhlIG5hbWUgdGhhdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYm9hcmQuCisgKiAgIFNlZSB0aGUgY29tbWVudCBuZWFyIGJvYXJkX25hbWU6IGluIHRoZSBjb21lZGlfZHJpdmVyIHN0cnVjdHVyZQorICogICBiZWxvdy4gIElmIChtYW51ZmFjdHVyZXIpIG9yIFtjb21lZGkgbmFtZV0gaXMgbWlzc2luZywgdGhlIHByZXZpb3VzCisgKiAgIHZhbHVlIGlzIHVzZWQuCisgKiBBdXRob3I6IHlvdQorICogVXBkYXRlZDogZGF0ZSB3aGVuIHRoZSBfZG9jdW1lbnRhdGlvbl8gd2FzIGxhc3QgdXBkYXRlZC4gIFVzZSAnZGF0ZSAtUicKKyAqICAgdG8gZ2V0IGEgdmFsdWUgZm9yIHRoaXMuCisgKiBTdGF0dXM6IGEgb25lLXdvcmQgZGVzY3JpcHRpb24gb2YgdGhlIHN0YXR1cy4gIFZhbGlkIHZhbHVlcyBhcmU6CisgKiAgIHdvcmtzIC0gZHJpdmVyIHdvcmtzIGNvcnJlY3RseSBvbiBtb3N0IGJvYXJkcyBzdXBwb3J0ZWQsIGFuZAorICogICAgIHBhc3NlcyBjb21lZGlfdGVzdC4KKyAqICAgdW5rbm93biAtIHVua25vd24uICBVc3VhbGx5IHB1dCB0aGVyZSBieSBkcy4KKyAqICAgZXhwZXJpbWVudGFsIC0gbWF5IG5vdCB3b3JrIGluIGFueSBwYXJ0aWN1bGFyIHJlbGVhc2UuICBBdXRob3IKKyAqICAgICBwcm9iYWJseSB3YW50cyBhc3Npc3RhbmNlIHRlc3RpbmcgaXQuCisgKiAgIGJpdHJvdHRlbiAtIGRyaXZlciBoYXMgbm90IGJlZW4gdXBkYXRlIGluIGEgbG9uZyB0aW1lLCBwcm9iYWJseQorICogICAgIGRvZXNuJ3Qgd29yaywgYW5kIHByb2JhYmx5IGlzIG1pc3Npbmcgc3VwcG9ydCBmb3Igc2lnbmlmaWNhbnQKKyAqICAgICBDb21lZGkgaW50ZXJmYWNlIGZlYXR1cmVzLgorICogICB1bnRlc3RlZCAtIGF1dGhvciBwcm9iYWJseSB3cm90ZSBpdCAiYmxpbmQiLCBhbmQgaXMgYmVsaWV2ZWQgdG8KKyAqICAgICB3b3JrLCBidXQgbm8gY29uZmlybWF0aW9uLgorICoKKyAqIFRoZXNlIGhlYWRlcnMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSwgYW5kIGFueSBjb21tZW50cworICogeW91IHdpc2ggdG8gc2F5IGFib3V0IHRoZSBkcml2ZXIuICBUaGUgY29tbWVudCBhcmVhIGlzIHRoZSBwbGFjZQorICogdG8gcHV0IGFueSBrbm93biBidWdzLCBsaW1pdGF0aW9ucywgdW5zdXBwb3J0ZWQgZmVhdHVyZXMsIHN1cHBvcnRlZAorICogY29tbWFuZCB0cmlnZ2Vycywgd2hldGhlciBvciBub3QgY29tbWFuZHMgYXJlIHN1cHBvcnRlZCBvbiBwYXJ0aWN1bGFyCisgKiBzdWJkZXZpY2VzLCBldGMuCisgKgorICogU29tZXdoZXJlIGluIHRoZSBjb21tZW50IHNob3VsZCBiZSBpbmZvcm1hdGlvbiBhYm91dCBjb25maWd1cmF0aW9uCisgKiBvcHRpb25zIHRoYXQgYXJlIHVzZWQgd2l0aCBjb21lZGlfY29uZmlnLgorICovCisKKyNpbmNsdWRlICIuLi9jb21lZGlsaWIuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyogVGhlIG1heGl1bXVtIG51bWJlciBvZiBjaGFubmVscyBwZXIgc3ViZGV2aWNlLiAqLworI2RlZmluZSBNQVhfQ0hBTlMgMjU2CisKKyNkZWZpbmUgTU9EVUxFX05BTUUgImNvbWVkaV9ib25kIgorI2lmZGVmIE1PRFVMRV9MSUNFTlNFCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZW5kaWYKKyNpZm5kZWYgU1RSCisjICBkZWZpbmUgU1RSMSh4KSAjeAorIyAgZGVmaW5lIFNUUih4KSBTVFIxKHgpCisjZW5kaWYKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJJZiB0cnVlLCBwcmludCBleHRyYSBjcnlwdGljIGRlYnVnZ2luZyBvdXRwdXQgdXNlZnVsIgorCQkgIm9ubHkgdG8gZGV2ZWxvcGVycy4iKTsKKworI2RlZmluZSBMT0dfTVNHKHguLi4pIHByaW50ayhLRVJOX0lORk8gTU9EVUxFX05BTUUiOiAieCkKKyNkZWZpbmUgREVCVUcoeC4uLikJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGRlYnVnKQkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHIE1PRFVMRV9OQU1FIjogREVCVUc6ICJ4KTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIFdBUk5JTkcoeC4uLikgIHByaW50ayhLRVJOX1dBUk5JTkcgTU9EVUxFX05BTUUgIjogV0FSTklORzogIngpCisjZGVmaW5lIEVSUk9SKHguLi4pICBwcmludGsoS0VSTl9FUlIgTU9EVUxFX05BTUUgIjogSU5URVJOQUwgRVJST1I6ICJ4KQorTU9EVUxFX0FVVEhPUigiQ2FsaW4gQS4gQ3VsaWFudSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKE1PRFVMRV9OQU1FICJBIGRyaXZlciBmb3IgQ09NRURJIHRvIGJvbmQgbXVsdGlwbGUgQ09NRURJICIKKwkJICAgImRldmljZXMgdG9nZXRoZXIgYXMgb25lLiAgSW4gdGhlIHdvcmRzIG9mIEpvaG4gTGVubm9uOiAiCisJCSAgICInQW5kIHRoZSB3b3JsZCB3aWxsIGxpdmUgYXMgb25lLi4uJyIpOworCisvKgorICogQm9hcmQgZGVzY3JpcHRpb25zIGZvciB0d28gaW1hZ2luYXJ5IGJvYXJkcy4gIERlc2NyaWJpbmcgdGhlCisgKiBib2FyZHMgaW4gdGhpcyB3YXkgaXMgb3B0aW9uYWwsIGFuZCBjb21wbGV0ZWx5IGRyaXZlci1kZXBlbmRlbnQuCisgKiBTb21lIGRyaXZlcnMgdXNlIGFycmF5cyBzdWNoIGFzIHRoaXMsIG90aGVyIGRvIG5vdC4KKyAqLworc3RydWN0IEJvbmRpbmdCb2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgQm9uZGluZ0JvYXJkIGJvbmRpbmdCb2FyZHNbXSA9IHsKKwl7CisJCS5uYW1lID0JTU9EVUxFX05BTUUsCisJfSwKK307CisKKy8qCisgKiBVc2VmdWwgZm9yIHNob3J0aGFuZCBhY2Nlc3MgdG8gdGhlIHBhcnRpY3VsYXIgYm9hcmQgc3RydWN0dXJlCisgKi8KKyNkZWZpbmUgdGhpc2JvYXJkICgoY29uc3Qgc3RydWN0IEJvbmRpbmdCb2FyZCAqKWRldi0+Ym9hcmRfcHRyKQorCitzdHJ1Y3QgQm9uZGVkRGV2aWNlIHsKKwljb21lZGlfdCAqZGV2OworCXVuc2lnbmVkIG1pbm9yOworCXVuc2lnbmVkIHN1YmRldjsKKwl1bnNpZ25lZCBzdWJkZXZfdHlwZTsKKwl1bnNpZ25lZCBuY2hhbnM7CisJdW5zaWduZWQgY2hhbmlkX29mZnNldDsJLyogVGhlIG9mZnNldCBpbnRvIG91ciB1bmlmaWVkIGxpbmVhcgorCQkJCSAgIGNoYW5uZWwtaWQncyBvZiBjaGFuaWQgMCBvbiB0aGlzCisJCQkJICAgc3ViZGV2aWNlLiAqLworfTsKKworLyogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAgSWYKKyAgIHNldmVyYWwgaGFyZHdhcmUgZHJpdmVycyBrZWVwIHNpbWlsYXIgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUsCisgICBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBjb21lZGlfZGV2aWNlIHN0cnVjdC4gICovCitzdHJ1Y3QgUHJpdmF0ZSB7CisjIGRlZmluZSBNQVhfQk9BUkRfTkFNRSAyNTYKKwljaGFyIG5hbWVbTUFYX0JPQVJEX05BTUVdOworCXN0cnVjdCBCb25kZWREZXZpY2UgKipkZXZzOworCXVuc2lnbmVkIG5kZXZzOworCXN0cnVjdCBCb25kZWREZXZpY2UgKmNoYW5JZERldk1hcFtNQVhfQ0hBTlNdOworCXVuc2lnbmVkIG5jaGFuczsKK307CisKKy8qCisgKiBtb3N0IGRyaXZlcnMgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8gdG8gbWFrZSBpdCBlYXN5IHRvCisgKiBhY2Nlc3MgdGhlIHByaXZhdGUgc3RydWN0dXJlLgorICovCisjZGVmaW5lIGRldnByaXYgKChzdHJ1Y3QgUHJpdmF0ZSAqKWRldi0+cHJpdmF0ZSkKKworLyoKKyAqIFRoZSBjb21lZGlfZHJpdmVyIHN0cnVjdHVyZSB0ZWxscyB0aGUgQ29tZWRpIGNvcmUgbW9kdWxlCisgKiB3aGljaCBmdW5jdGlvbnMgdG8gY2FsbCB0byBjb25maWd1cmUvZGVjb25maWd1cmUgKGF0dGFjaC9kZXRhY2gpCisgKiB0aGUgYm9hcmQsIGFuZCBhbHNvIGFib3V0IHRoZSBrZXJuZWwgbW9kdWxlIHRoYXQgY29udGFpbnMKKyAqIHRoZSBkZXZpY2UgY29kZS4KKyAqLworc3RhdGljIGludCBib25kaW5nX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK3N0YXRpYyBpbnQgYm9uZGluZ19kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KTsKKy8qKiBCdWlsZCBQcml2YXRlIGFycmF5IG9mIGFsbCBkZXZpY2VzLi4gKi8KK3N0YXRpYyBpbnQgZG9EZXZDb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCk7CitzdGF0aWMgdm9pZCBkb0RldlVuY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldik7CisvKiBVZ2x5IGltcGxlbWVudGF0aW9uIG9mIHJlYWxsb2MgdGhhdCBhbHdheXMgY29waWVzIG1lbW9yeSBhcm91bmQgLS0gSSdtIGxhenksCisgKiB3aGF0IGNhbiBJIHNheT8gIEkgbGlrZSB0byBkbyB3YXN0ZWZ1bCBtZW1jb3BpZXMuLiA6KSAqLworc3RhdGljIHZvaWQgKlJlYWxsb2MoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgbGVuLCBzaXplX3Qgb2xkX2xlbik7CisKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl9ib25kaW5nID0geworICAgICAgLmRyaXZlcl9uYW1lID0JTU9EVUxFX05BTUUsCisgICAgICAubW9kdWxlID0JCVRISVNfTU9EVUxFLAorICAgICAgLmF0dGFjaCA9CQlib25kaW5nX2F0dGFjaCwKKyAgICAgIC5kZXRhY2ggPQkJYm9uZGluZ19kZXRhY2gsCisJLyogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGlmIHlvdSBhcmUKKwkgKiB3cml0aW5nIGEgZHJpdmVyIGZvciBhIElTQSBQblAgb3IgUENJIGNhcmQgKi8KKwkvKiBNb3N0IGRyaXZlcnMgd2lsbCBzdXBwb3J0IG11bHRpcGxlIHR5cGVzIG9mIGJvYXJkcyBieQorCSAqIGhhdmluZyBhbiBhcnJheSBvZiBib2FyZCBzdHJ1Y3R1cmVzLiAgVGhlc2Ugd2VyZSBkZWZpbmVkCisJICogaW4gc2tlbF9ib2FyZHNbXSBhYm92ZS4gIE5vdGUgdGhhdCB0aGUgZWxlbWVudCAnbmFtZScKKwkgKiB3YXMgZmlyc3QgaW4gdGhlIHN0cnVjdHVyZSAtLSBDb21lZGkgdXNlcyB0aGlzIGZhY3QgdG8KKwkgKiBleHRyYWN0IHRoZSBuYW1lIG9mIHRoZSBib2FyZCB3aXRob3V0IGtub3dpbmcgYW55IGRldGFpbHMKKwkgKiBhYm91dCB0aGUgc3RydWN0dXJlIGV4Y2VwdCBmb3IgaXRzIGxlbmd0aC4KKwkgKiBXaGVuIGEgZGV2aWNlIGlzIGF0dGFjaGVkIChieSBjb21lZGlfY29uZmlnKSwgdGhlIG5hbWUKKwkgKiBvZiB0aGUgZGV2aWNlIGlzIGdpdmVuIHRvIENvbWVkaSwgYW5kIENvbWVkaSB0cmllcyB0bworCSAqIG1hdGNoIGl0IGJ5IGdvaW5nIHRocm91Z2ggdGhlIGxpc3Qgb2YgYm9hcmQgbmFtZXMuICBJZgorCSAqIHRoZXJlIGlzIGEgbWF0Y2gsIHRoZSBhZGRyZXNzIG9mIHRoZSBwb2ludGVyIGlzIHB1dAorCSAqIGludG8gZGV2LT5ib2FyZF9wdHIgYW5kIGRyaXZlci0+YXR0YWNoKCkgaXMgY2FsbGVkLgorCSAqCisJICogTm90ZSB0aGF0IHRoZXNlIGFyZSBub3QgbmVjZXNzYXJ5IGlmIHlvdSBjYW4gZGV0ZXJtaW5lCisJICogdGhlIHR5cGUgb2YgYm9hcmQgaW4gc29mdHdhcmUuICBJU0EgUG5QLCBQQ0ksIGFuZCBQQ01DSUEKKwkgKiBkZXZpY2VzIGFyZSBzdWNoIGJvYXJkcy4KKwkgKi8KKyAgICAgIC5ib2FyZF9uYW1lID0JJmJvbmRpbmdCb2FyZHNbMF0ubmFtZSwKKyAgICAgIC5vZmZzZXQgPQkJc2l6ZW9mKHN0cnVjdCBCb25kaW5nQm9hcmQpLAorICAgICAgLm51bV9uYW1lcyA9CXNpemVvZihib25kaW5nQm9hcmRzKSAvIHNpemVvZihzdHJ1Y3QgQm9uZGluZ0JvYXJkKSwKK307CisKK3N0YXRpYyBpbnQgYm9uZGluZ19kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKTsKK3N0YXRpYyBpbnQgYm9uZGluZ19kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSk7CisKKy8qCisgKiBBdHRhY2ggaXMgY2FsbGVkIGJ5IHRoZSBDb21lZGkgY29yZSB0byBjb25maWd1cmUgdGhlIGRyaXZlcgorICogZm9yIGEgcGFydGljdWxhciBib2FyZC4gIElmIHlvdSBzcGVjaWZpZWQgYSBib2FyZF9uYW1lIGFycmF5CisgKiBpbiB0aGUgZHJpdmVyIHN0cnVjdHVyZSwgZGV2LT5ib2FyZF9wdHIgY29udGFpbnMgdGhhdAorICogYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBib25kaW5nX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlMT0dfTVNHKCJjb21lZGklZFxuIiwgZGV2LT5taW5vcik7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBhcmVhLiAgYWxsb2NfcHJpdmF0ZSgpIGlzIGEKKwkgKiBjb252ZW5pZW50IG1hY3JvIGRlZmluZWQgaW4gY29tZWRpZGV2LmguCisJICovCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IFByaXZhdGUpKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBTZXR1cCBvdXIgYm9uZGluZyBmcm9tIGNvbmZpZyBwYXJhbXMuLiBzZXRzIHVwIG91ciBQcml2YXRlIHN0cnVjdC4uCisJICovCisJaWYgKCFkb0RldkNvbmZpZyhkZXYsIGl0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIEluaXRpYWxpemUgZGV2LT5ib2FyZF9uYW1lLiAgTm90ZSB0aGF0IHdlIGNhbiB1c2UgdGhlICJ0aGlzYm9hcmQiCisJICogbWFjcm8gbm93LCBzaW5jZSB3ZSBqdXN0IGluaXRpYWxpemVkIGl0IGluIHRoZSBsYXN0IGxpbmUuCisJICovCisJZGV2LT5ib2FyZF9uYW1lID0gZGV2cHJpdi0+bmFtZTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHN1YmRldmljZSBzdHJ1Y3R1cmVzLiAgYWxsb2Nfc3ViZGV2aWNlKCkgaXMgYQorCSAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4KKwkgKi8KKwlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDEpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4gPSBkZXZwcml2LT5uY2hhbnM7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMgPSBib25kaW5nX2Rpb19pbnNuX2JpdHM7CisJcy0+aW5zbl9jb25maWcgPSBib25kaW5nX2Rpb19pbnNuX2NvbmZpZzsKKworCUxPR19NU0coImF0dGFjaGVkIHdpdGggJXUgRElPIGNoYW5uZWxzIGNvbWluZyBmcm9tICV1IGRpZmZlcmVudCAiCisJCSJzdWJkZXZpY2VzIGFsbCBib25kZWQgdG9nZXRoZXIuICAiCisJCSJKb2huIExlbm5vbiB3b3VsZCBiZSBwcm91ZCFcbiIsCisJCWRldnByaXYtPm5jaGFucywgZGV2cHJpdi0+bmRldnMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBfZGV0YWNoIGlzIGNhbGxlZCB0byBkZWNvbmZpZ3VyZSBhIGRldmljZS4gIEl0IHNob3VsZCBkZWFsbG9jYXRlCisgKiByZXNvdXJjZXMuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIHdoZW4gX2F0dGFjaCgpIGZhaWxzLCBzbyBpdCBzaG91bGQgYmUKKyAqIGNhcmVmdWwgbm90IHRvIHJlbGVhc2UgcmVzb3VyY2VzIHRoYXQgd2VyZSBub3QgbmVjZXNzYXJpbHkKKyAqIGFsbG9jYXRlZCBieSBfYXR0YWNoKCkuICBkZXYtPnByaXZhdGUgYW5kIGRldi0+c3ViZGV2aWNlcyBhcmUKKyAqIGRlYWxsb2NhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNvcmUuCisgKi8KK3N0YXRpYyBpbnQgYm9uZGluZ19kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCUxPR19NU0coImNvbWVkaSVkOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCWRvRGV2VW5jb25maWcoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogRElPIGRldmljZXMgYXJlIHNsaWdodGx5IHNwZWNpYWwuICBBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0bworICogaW1wbGVtZW50IHRoZSBpbnNuX3JlYWQvaW5zbl93cml0ZSBpbnRlcmZhY2UsIGl0IGlzIG11Y2ggbW9yZQorICogdXNlZnVsIHRvIGFwcGxpY2F0aW9ucyBpZiB5b3UgaW1wbGVtZW50IHRoZSBpbnNuX2JpdHMgaW50ZXJmYWNlLgorICogVGhpcyBhbGxvd3MgcGFja2VkIHJlYWRpbmcvd3JpdGluZyBvZiB0aGUgRElPIGNoYW5uZWxzLiAgVGhlCisgKiBjb21lZGkgY29yZSBjYW4gY29udmVydCBiZXR3ZWVuIGluc25fYml0cyBhbmQgaW5zbl9yZWFkL3dyaXRlICovCitzdGF0aWMgaW50IGJvbmRpbmdfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKyNkZWZpbmUgTFNBTVBMX0JJVFMgKHNpemVvZihsc2FtcGxfdCkqOCkKKwl1bnNpZ25lZCBuY2hhbnMgPSBMU0FNUExfQklUUywgbnVtX2RvbmUgPSAwLCBpOworCWlmIChpbnNuLT5uICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRldnByaXYtPm5jaGFucyA8IG5jaGFucykKKwkJbmNoYW5zID0gZGV2cHJpdi0+bmNoYW5zOworCisJLyogVGhlIGluc24gZGF0YSBpcyBhIG1hc2sgaW4gZGF0YVswXSBhbmQgdGhlIG5ldyBkYXRhCisJICogaW4gZGF0YVsxXSwgZWFjaCBjaGFubmVsIGNvb3Jlc3BvbmRpbmcgdG8gYSBiaXQuICovCisJZm9yIChpID0gMDsgbnVtX2RvbmUgPCBuY2hhbnMgJiYgaSA8IGRldnByaXYtPm5kZXZzOyArK2kpIHsKKwkJc3RydWN0IEJvbmRlZERldmljZSAqYmRldiA9IGRldnByaXYtPmRldnNbaV07CisJCS8qIEdyYWIgdGhlIGNoYW5uZWwgbWFzayBhbmQgZGF0YSBvZiBvbmx5IHRoZSBiaXRzIGNvcnJlc3BvbmRpbmcKKwkJICAgdG8gdGhpcyBzdWJkZXZpY2UuLiBuZWVkIHRvIHNoaWZ0IHRoZW0gdG8gemVybyBwb3NpdGlvbiBvZgorCQkgICBjb3Vyc2UuICovCisJCS8qIEJpdHMgY29ycmVzcG9uZGluZyB0byB0aGlzIHN1YmRldi4gKi8KKwkJbHNhbXBsX3Qgc3ViZGV2TWFzayA9ICgoMSA8PCBiZGV2LT5uY2hhbnMpIC0gMSk7CisJCWxzYW1wbF90IHdyaXRlTWFzaywgZGF0YUJpdHM7CisKKwkJLyogQXJnaCwgd2UgaGF2ZSA+PSBMU0FNUExfQklUUyBjaGFucy4uIHRha2UgYWxsIGJpdHMgKi8KKwkJaWYgKGJkZXYtPm5jaGFucyA+PSBMU0FNUExfQklUUykKKwkJCXN1YmRldk1hc2sgPSAobHNhbXBsX3QpICgtMSk7CisKKwkJd3JpdGVNYXNrID0gKGRhdGFbMF0gPj4gbnVtX2RvbmUpICYgc3ViZGV2TWFzazsKKwkJZGF0YUJpdHMgPSAoZGF0YVsxXSA+PiBudW1fZG9uZSkgJiBzdWJkZXZNYXNrOworCisJCS8qIFJlYWQvV3JpdGUgdGhlIG5ldyBkaWdpdGFsIGxpbmVzICovCisJCWlmIChjb21lZGlfZGlvX2JpdGZpZWxkKGJkZXYtPmRldiwgYmRldi0+c3ViZGV2LCB3cml0ZU1hc2ssCisJCQkJJmRhdGFCaXRzKSAhPSAyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogTWFrZSByb29tIGZvciB0aGUgbmV3IGJpdHMgaW4gZGF0YVsxXSwgdGhlIHJldHVybiB2YWx1ZSAqLworCQlkYXRhWzFdICY9IH4oc3ViZGV2TWFzayA8PCBudW1fZG9uZSk7CisJCS8qIFB1dCB0aGUgYml0cyBpbiB0aGUgcmV0dXJuIHZhbHVlICovCisJCWRhdGFbMV0gfD0gKGRhdGFCaXRzICYgc3ViZGV2TWFzaykgPDwgbnVtX2RvbmU7CisJCS8qIFNhdmUgdGhlIG5ldyBiaXRzIHRvIHRoZSBzYXZlZCBzdGF0ZS4uICovCisJCXMtPnN0YXRlID0gZGF0YVsxXTsKKworCQludW1fZG9uZSArPSBiZGV2LT5uY2hhbnM7CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgYm9uZGluZ19kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpLCByZXQsIGlvX2JpdHMgPSBzLT5pb19iaXRzOworCXVuc2lnbmVkIGludCBpbzsKKwlzdHJ1Y3QgQm9uZGVkRGV2aWNlICpiZGV2OworCisJaWYgKGNoYW4gPCAwIHx8IGNoYW4gPj0gZGV2cHJpdi0+bmNoYW5zKQorCQlyZXR1cm4gLUVJTlZBTDsKKwliZGV2ID0gZGV2cHJpdi0+Y2hhbklkRGV2TWFwW2NoYW5dOworCisJLyogVGhlIGlucHV0IG9yIG91dHB1dCBjb25maWd1cmF0aW9uIG9mIGVhY2ggZGlnaXRhbCBsaW5lIGlzCisJICogY29uZmlndXJlZCBieSBhIHNwZWNpYWwgaW5zbl9jb25maWcgaW5zdHJ1Y3Rpb24uICBjaGFuc3BlYworCSAqIGNvbnRhaW5zIHRoZSBjaGFubmVsIHRvIGJlIGNoYW5nZWQsIGFuZCBkYXRhWzBdIGNvbnRhaW5zIHRoZQorCSAqIHZhbHVlIENPTUVESV9JTlBVVCBvciBDT01FRElfT1VUUFVULiAqLworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfRElPX09VVFBVVDoKKwkJaW8gPSBDT01FRElfT1VUUFVUOwkvKiBpcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/ICovCisJCWlvX2JpdHMgfD0gMSA8PCBjaGFuOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0RJT19JTlBVVDoKKwkJaW8gPSBDT01FRElfSU5QVVQ7CS8qIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKwkJaW9fYml0cyAmPSB+KDEgPDwgY2hhbik7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX1FVRVJZOgorCQlkYXRhWzFdID0KKwkJCShpb19iaXRzICYgKDEgPDwgY2hhbikpID8gQ09NRURJX09VVFBVVCA6IENPTUVESV9JTlBVVDsKKwkJcmV0dXJuIGluc24tPm47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJLyogJ3JlYWwnIGNoYW5uZWwgaWQgZm9yIHRoaXMgc3ViZGV2Li4gKi8KKwljaGFuIC09IGJkZXYtPmNoYW5pZF9vZmZzZXQ7CisJcmV0ID0gY29tZWRpX2Rpb19jb25maWcoYmRldi0+ZGV2LCBiZGV2LT5zdWJkZXYsIGNoYW4sIGlvKTsKKwlpZiAocmV0ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCS8qIEZpbmFsbHksIHNhdmUgdGhlIG5ldyBpb19iaXRzIHZhbHVlcyBzaW5jZSB3ZSBkaWRuJ3QgZ2V0CisJICAgYW4gZXJyb3IgYWJvdmUuICovCisJcy0+aW9fYml0cyA9IGlvX2JpdHM7CisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyB2b2lkICpSZWFsbG9jKGNvbnN0IHZvaWQgKm9sZG1lbSwgc2l6ZV90IG5ld2xlbiwgc2l6ZV90IG9sZGxlbikKK3sKKwl2b2lkICpuZXdtZW0gPSBrbWFsbG9jKG5ld2xlbiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAobmV3bWVtICYmIG9sZG1lbSkKKwkJbWVtY3B5KG5ld21lbSwgb2xkbWVtLCBtaW4ob2xkbGVuLCBuZXdsZW4pKTsKKwlrZnJlZShvbGRtZW0pOworCXJldHVybiBuZXdtZW07Cit9CisKK3N0YXRpYyBpbnQgZG9EZXZDb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlpbnQgaTsKKwljb21lZGlfdCAqZGV2c19vcGVuZWRbQ09NRURJX05VTV9CT0FSRF9NSU5PUlNdOworCisJbWVtc2V0KGRldnNfb3BlbmVkLCAwLCBzaXplb2YoZGV2c19vcGVuZWQpKTsKKwlkZXZwcml2LT5uYW1lWzBdID0gMDs7CisJLyogTG9vcCB0aHJvdWdoIGFsbCBjb21lZGkgZGV2aWNlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZSwKKwkgICBidWlsZGluZyBvdXIgZGV2aWNlIGxpc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05ERVZDT05GT1BUUyAmJiAoIWkgfHwgaXQtPm9wdGlvbnNbaV0pOyArK2kpIHsKKwkJY2hhciBmaWxlW10gPSAiL2Rldi9jb21lZGlYWFhYWFgiOworCQlpbnQgbWlub3IgPSBpdC0+b3B0aW9uc1tpXTsKKwkJY29tZWRpX3QgKmQ7CisJCWludCBzZGV2ID0gLTEsIG5jaGFucywgdG1wOworCQlzdHJ1Y3QgQm9uZGVkRGV2aWNlICpiZGV2ID0gTlVMTDsKKworCQlpZiAobWlub3IgPCAwIHx8IG1pbm9yID4gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpIHsKKwkJCUVSUk9SKCJNaW5vciAlZCBpcyBpbnZhbGlkIVxuIiwgbWlub3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKG1pbm9yID09IGRldi0+bWlub3IpIHsKKwkJCUVSUk9SKCJDYW5ub3QgYm9uZCB0aGlzIGRyaXZlciB0byBpdHNlbGYhXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChkZXZzX29wZW5lZFttaW5vcl0pIHsKKwkJCUVSUk9SKCJNaW5vciAlZCBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UhXG4iLCBtaW5vcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIi9kZXYvY29tZWRpJXUiLCBtaW5vcik7CisJCWZpbGVbc2l6ZW9mKGZpbGUpIC0gMV0gPSAwOworCisJCWQgPSBkZXZzX29wZW5lZFttaW5vcl0gPSBjb21lZGlfb3BlbihmaWxlKTsKKworCQlpZiAoIWQpIHsKKwkJCUVSUk9SKCJNaW5vciAldSBjb3VsZCBub3QgYmUgb3BlbmVkXG4iLCBtaW5vcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIERvIERJTywgYXMgdGhhdCdzIGFsbCB3ZSBzdXBwb3J0IG5vdy4uICovCisJCXdoaWxlICgoc2RldiA9IGNvbWVkaV9maW5kX3N1YmRldmljZV9ieV90eXBlKGQsIENPTUVESV9TVUJEX0RJTywKKwkJCQkJc2RldiArIDEpKSA+IC0xKSB7CisJCQluY2hhbnMgPSBjb21lZGlfZ2V0X25fY2hhbm5lbHMoZCwgc2Rldik7CisJCQlpZiAobmNoYW5zIDw9IDApIHsKKwkJCQlFUlJPUigiY29tZWRpX2dldF9uX2NoYW5uZWxzKCkgcmV0dXJuZWQgJWQgIgorCQkJCSAgICAgICJvbiBtaW5vciAldSBzdWJkZXYgJWQhXG4iLAorCQkJCSAgICAgIG5jaGFucywgbWlub3IsIHNkZXYpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYmRldiA9IGttYWxsb2Moc2l6ZW9mKCpiZGV2KSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWJkZXYpIHsKKwkJCQlFUlJPUigiT3V0IG9mIG1lbW9yeS5cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYmRldi0+ZGV2ID0gZDsKKwkJCWJkZXYtPm1pbm9yID0gbWlub3I7CisJCQliZGV2LT5zdWJkZXYgPSBzZGV2OworCQkJYmRldi0+c3ViZGV2X3R5cGUgPSBDT01FRElfU1VCRF9ESU87CisJCQliZGV2LT5uY2hhbnMgPSBuY2hhbnM7CisJCQliZGV2LT5jaGFuaWRfb2Zmc2V0ID0gZGV2cHJpdi0+bmNoYW5zOworCisJCQkvKiBtYXAgY2hhbm5lbCBpZCdzIHRvIEJvbmRlZERldmljZSAqIHBvaW50ZXIuLiAqLworCQkJd2hpbGUgKG5jaGFucy0tKQorCQkJCWRldnByaXYtPmNoYW5JZERldk1hcFtkZXZwcml2LT5uY2hhbnMrK10gPSBiZGV2OworCisJCQkvKiBOb3cgcHV0IGJkZXYgcG9pbnRlciBhdCBlbmQgb2YgZGV2cHJpdi0+ZGV2cyBhcnJheQorCQkJICogbGlzdC4uICovCisKKwkJCS8qIGVyZ2guLiB1Z2x5Li4gd2UgbmVlZCB0byByZWFsbG9jIDooICAqLworCQkJdG1wID0gZGV2cHJpdi0+bmRldnMgKiBzaXplb2YoYmRldik7CisJCQlkZXZwcml2LT5kZXZzID0KKwkJCQlSZWFsbG9jKGRldnByaXYtPmRldnMsCisJCQkJKytkZXZwcml2LT5uZGV2cyAqIHNpemVvZihiZGV2KSwgdG1wKTsKKwkJCWlmICghZGV2cHJpdi0+ZGV2cykgeworCQkJCUVSUk9SKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5LiAiCisJCQkJICAgICAgIk91dCBvZiBtZW1vcnk/Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWRldnByaXYtPmRldnNbZGV2cHJpdi0+bmRldnMgLSAxXSA9IGJkZXY7CisJCQl7CisJLyoqIEFwcGVuZCBkZXY6c3ViZGV2IHRvIGRldnByaXYtPm5hbWUgKi8KKwkJCQljaGFyIGJ1ZlsyMF07CisJCQkJaW50IGxlZnQgPQorCQkJCQlNQVhfQk9BUkRfTkFNRSAtIHN0cmxlbihkZXZwcml2LT5uYW1lKSAtCisJCQkJCTE7CisJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkOiVkICIsIGRldi0+bWlub3IsCisJCQkJCWJkZXYtPnN1YmRldik7CisJCQkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOworCQkJCXN0cm5jYXQoZGV2cHJpdi0+bmFtZSwgYnVmLCBsZWZ0KTsKKwkJCX0KKworCQl9CisJfQorCisJaWYgKCFkZXZwcml2LT5uY2hhbnMpIHsKKwkJRVJST1IoIk5vIGNoYW5uZWxzIGZvdW5kIVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkb0RldlVuY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGRldnNfY2xvc2VkID0gMDsKKworCWlmIChkZXZwcml2KSB7CisJCXdoaWxlIChkZXZwcml2LT5uZGV2cy0tICYmIGRldnByaXYtPmRldnMpIHsKKwkJCXN0cnVjdCBCb25kZWREZXZpY2UgKmJkZXY7CisKKwkJCWJkZXYgPSBkZXZwcml2LT5kZXZzW2RldnByaXYtPm5kZXZzXTsKKwkJCWlmICghYmRldikKKwkJCQljb250aW51ZTsKKwkJCWlmICghKGRldnNfY2xvc2VkICYgKDB4MSA8PCBiZGV2LT5taW5vcikpKSB7CisJCQkJY29tZWRpX2Nsb3NlKGJkZXYtPmRldik7CisJCQkJZGV2c19jbG9zZWQgfD0gKDB4MSA8PCBiZGV2LT5taW5vcik7CisJCQl9CisJCQlrZnJlZShiZGV2KTsKKwkJfQorCQlrZnJlZShkZXZwcml2LT5kZXZzKTsKKwkJZGV2cHJpdi0+ZGV2cyA9IE5VTEw7CisJCWtmcmVlKGRldnByaXYpOworCQlkZXYtPnByaXZhdGUgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfYm9uZGluZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfYm9uZGluZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3NGRiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYworCisgICAgVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgorICAgIHR3byBvciBtb3JlIGRyaXZlcnMuICBmYyBpcyBzaG9ydAorICAgIGZvciBmcmFuay1jb21tb24uCisKKyAgICBBdXRob3I6ICBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyYW5rIE1vcmkgSGVzcworCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisKK3N0YXRpYyB2b2lkIGluY3JlbWVudF9zY2FuX3Byb2dyZXNzKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCisJCQkJICAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHN1YmQtPmFzeW5jOworCXVuc2lnbmVkIGludCBzY2FuX2xlbmd0aCA9IGNmY19ieXRlc19wZXJfc2NhbihzdWJkKTsKKworCWFzeW5jLT5zY2FuX3Byb2dyZXNzICs9IG51bV9ieXRlczsKKwlpZiAoYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgPj0gc2Nhbl9sZW5ndGgpIHsKKwkJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgJT0gc2Nhbl9sZW5ndGg7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKKwl9Cit9CisKKy8qIFdyaXRlcyBhbiBhcnJheSBvZiBkYXRhIHBvaW50cyB0byBjb21lZGkncyBidWZmZXIgKi8KK3Vuc2lnbmVkIGludCBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsIHZvaWQgKmRhdGEsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHN1YmQtPmFzeW5jOworCXVuc2lnbmVkIGludCByZXR2YWw7CisKKwlpZiAobnVtX2J5dGVzID09IDApCisJCXJldHVybiAwOworCisJcmV0dmFsID0gY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhhc3luYywgbnVtX2J5dGVzKTsKKwlpZiAocmV0dmFsICE9IG51bV9ieXRlcykgeworCQlydF9wcmludGsoImNvbWVkaTogYnVmZmVyIG92ZXJydW5cbiIpOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKwkJcmV0dXJuIDA7CisJfQorCisJY29tZWRpX2J1Zl9tZW1jcHlfdG8oYXN5bmMsIDAsIGRhdGEsIG51bV9ieXRlcyk7CisJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBudW1fYnl0ZXMpOworCWluY3JlbWVudF9zY2FuX3Byb2dyZXNzKHN1YmQsIG51bV9ieXRlcyk7CisJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisKKwlyZXR1cm4gbnVtX2J5dGVzOworfQorRVhQT1JUX1NZTUJPTChjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKTsKKwordW5zaWduZWQgaW50IGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsIHZvaWQgKmRhdGEsCisJCQkJCXVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHN1YmQtPmFzeW5jOworCisJaWYgKG51bV9ieXRlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCW51bV9ieXRlcyA9IGNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgbnVtX2J5dGVzKTsKKwljb21lZGlfYnVmX21lbWNweV9mcm9tKGFzeW5jLCAwLCBkYXRhLCBudW1fYnl0ZXMpOworCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBudW1fYnl0ZXMpOworCWluY3JlbWVudF9zY2FuX3Byb2dyZXNzKHN1YmQsIG51bV9ieXRlcyk7CisJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisKKwlyZXR1cm4gbnVtX2J5dGVzOworfQorRVhQT1JUX1NZTUJPTChjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcik7CisKK3Vuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQpCit7CisJdW5zaWduZWQgaW50IGV2ZW50cyA9IHN1YmQtPmFzeW5jLT5ldmVudHM7CisKKwlpZiAoZXZlbnRzID09IDApCisJCXJldHVybiBldmVudHM7CisKKwlpZiAoZXZlbnRzICYgKENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfT1ZFUkZMT1cpKQorCQlzdWJkLT5jYW5jZWwoZGV2LCBzdWJkKTsKKworCWNvbWVkaV9ldmVudChkZXYsIHN1YmQpOworCisJcmV0dXJuIGV2ZW50czsKK30KK0VYUE9SVF9TWU1CT0woY2ZjX2hhbmRsZV9ldmVudHMpOworCitNT0RVTEVfQVVUSE9SKCJGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNoYXJlZCBmdW5jdGlvbnMgZm9yIENvbWVkaSBsb3ctbGV2ZWwgZHJpdmVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBjb21lZGlfZmNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvbWVkaV9mY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChjb21lZGlfZmNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoY29tZWRpX2ZjX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTUyZmUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgICAgY29tZWRpX2ZjLmgKKworICAgIFRoaXMgaXMgYSBwbGFjZSBmb3IgY29kZSBkcml2ZXIgd3JpdGVycyB3aXNoIHRvIHNoYXJlIGJldHdlZW4KKyAgICB0d28gb3IgbW9yZSBkcml2ZXJzLiBUaGVzZSBmdW5jdGlvbnMgYXJlIG1lYW50IHRvIGJlIHVzZWQgb25seQorICAgIGJ5IGRyaXZlcnMsIHRoZXkgYXJlIE5PVCBwYXJ0IG9mIHRoZSBrY29tZWRpbGliIEFQSSEKKworICAgIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DT01FRElfRkNfSAorI2RlZmluZSBfQ09NRURJX0ZDX0gKKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisvKiBXcml0ZXMgYW4gYXJyYXkgb2YgZGF0YSBwb2ludHMgdG8gY29tZWRpJ3MgYnVmZmVyICovCitleHRlcm4gdW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwKKwkJCQkJICAgICAgdm9pZCAqZGF0YSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY193cml0ZV90b19idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwKKwkJCQkJICAgICAgIHNhbXBsX3QgZGF0YSkKK3sKKwlyZXR1cm4gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzdWJkLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY193cml0ZV9sb25nX3RvX2J1ZmZlcihjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorCQkJCQkJICAgIGxzYW1wbF90IGRhdGEpCit7CisJcmV0dXJuIGNmY193cml0ZV9hcnJheV90b19idWZmZXIoc3ViZCwgJmRhdGEsIHNpemVvZihkYXRhKSk7Cit9OworCitleHRlcm4gdW5zaWduZWQgaW50IGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCisJCQkJCSAgICAgICB2b2lkICpkYXRhLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgY2ZjX2hhbmRsZV9ldmVudHMoY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgIGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjZmNfYnl0ZXNfcGVyX3NjYW4oY29tZWRpX3N1YmRldmljZSAqc3ViZCkKK3sKKwlpbnQgbnVtX3NhbXBsZXM7CisJaW50IGJpdHNfcGVyX3NhbXBsZTsKKworCXN3aXRjaCAoc3ViZC0+dHlwZSkgeworCWNhc2UgQ09NRURJX1NVQkRfREk6CisJY2FzZSBDT01FRElfU1VCRF9ETzoKKwljYXNlIENPTUVESV9TVUJEX0RJTzoKKwkJYml0c19wZXJfc2FtcGxlID0gOCAqIGJ5dGVzX3Blcl9zYW1wbGUoc3ViZCk7CisJCW51bV9zYW1wbGVzID0gKHN1YmQtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICsKKwkJCSAgICAgICBiaXRzX3Blcl9zYW1wbGUgLSAxKSAvIGJpdHNfcGVyX3NhbXBsZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnVtX3NhbXBsZXMgPSBzdWJkLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsKKwkJYnJlYWs7CisJfQorCXJldHVybiBudW1fc2FtcGxlcyAqIGJ5dGVzX3Blcl9zYW1wbGUoc3ViZCk7Cit9CisKKyNlbmRpZiAvKiBfQ09NRURJX0ZDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4MzhmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMKKyAgICBoYXJkd2FyZSBkcml2ZXIgZm9yIHN0YW5kYXJkIHBhcmFsbGVsIHBvcnQKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgsMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworLyoKK0RyaXZlcjogY29tZWRpX3BhcnBvcnQKK0Rlc2NyaXB0aW9uOiBTdGFuZGFyZCBQQyBwYXJhbGxlbCBwb3J0CitBdXRob3I6IGRzCitTdGF0dXM6IHdvcmtzIGluIGltbWVkaWF0ZSBtb2RlCitEZXZpY2VzOiBbc3RhbmRhcmRdIHBhcmFsbGVsIHBvcnQgKGNvbWVkaV9wYXJwb3J0KQorVXBkYXRlZDogVHVlLCAzMCBBcHIgMjAwMiAyMToxMTo0NSAtMDcwMAorCitBIGNoZWFwIGFuZCBlYXN5IHdheSB0byBnZXQgYSBmZXcgbW9yZSBkaWdpdGFsIEkvTyBsaW5lcy4gIFN0ZWFsCithZGRpdGlvbmFsIHBhcmFsbGVsIHBvcnRzIGZyb20gb2xkIGNvbXB1dGVycyBvciB5b3VyIG5laWdoYm9ycycKK2NvbXB1dGVycy4KKworT3B0aW9uIGxpc3Q6CisgMDogSS9PIHBvcnQgYmFzZSBmb3IgdGhlIHBhcmFsbGVsIHBvcnQuCisgMTogSVJRCisKK1BhcmFsbGVsIFBvcnQgTGluZXM6CisKK3BpbiAgICAgc3ViZGV2ICBjaGFuICAgIGFrYQorLS0tICAgICAtLS0tLS0gIC0tLS0gICAgLS0tCisxICAgICAgIDIgICAgICAgMCAgICAgICBzdHJvYmUKKzIgICAgICAgMCAgICAgICAwICAgICAgIGRhdGEgMAorMyAgICAgICAwICAgICAgIDEgICAgICAgZGF0YSAxCis0ICAgICAgIDAgICAgICAgMiAgICAgICBkYXRhIDIKKzUgICAgICAgMCAgICAgICAzICAgICAgIGRhdGEgMworNiAgICAgICAwICAgICAgIDQgICAgICAgZGF0YSA0Cis3ICAgICAgIDAgICAgICAgNSAgICAgICBkYXRhIDUKKzggICAgICAgMCAgICAgICA2ICAgICAgIGRhdGEgNgorOSAgICAgICAwICAgICAgIDcgICAgICAgZGF0YSA3CisxMCAgICAgIDEgICAgICAgMyAgICAgICBhY2tub3dsZWRnZQorMTEgICAgICAxICAgICAgIDQgICAgICAgYnVzeQorMTIgICAgICAxICAgICAgIDIgICAgICAgb3V0cHV0CisxMyAgICAgIDEgICAgICAgMSAgICAgICBwcmludGVyIHNlbGVjdGVkCisxNCAgICAgIDIgICAgICAgMSAgICAgICBhdXRvIExGCisxNSAgICAgIDEgICAgICAgMCAgICAgICBlcnJvcgorMTYgICAgICAyICAgICAgIDIgICAgICAgaW5pdAorMTcgICAgICAyICAgICAgIDMgICAgICAgc2VsZWN0IHByaW50ZXIKKzE4LTI1ICAgZ3JvdW5kCisKK05vdGVzOgorCitTdWJkZXZpY2VzIDAgaXMgZGlnaXRhbCBJL08sIHN1YmRldmljZSAxIGlzIGRpZ2l0YWwgaW5wdXQsIGFuZAorc3ViZGV2aWNlIDIgaXMgZGlnaXRhbCBvdXRwdXQuICBVbmxpa2Ugb3RoZXIgQ29tZWRpIGRldmljZXMsCitzdWJkZXZpY2UgMCBkZWZhdWx0cyB0byBvdXRwdXQuCisKK1BpbnMgMTMgYW5kIDE0IGFyZSBpbnZlcnRlZCBvbmNlIGJ5IENvbWVkaSBhbmQgb25jZSBieSB0aGUKK2hhcmR3YXJlLCB0aHVzIGNhbmNlbGxpbmcgdGhlIGVmZmVjdC4KKworUGluIDEgaXMgYSBzdHJvYmUsIHRodXMgYWN0cyBsaWtlIG9uZS4gIFRoZXJlJ3Mgbm8gd2F5IGluIHNvZnR3YXJlCit0byBjaGFuZ2UgdGhpcywgYXQgbGVhc3Qgb24gYSBzdGFuZGFyZCBwYXJhbGxlbCBwb3J0LgorCitTdWJkZXZpY2UgMyBwcmV0ZW5kcyB0byBiZSBhIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlLCBidXQgaXQgYWx3YXlzCityZXR1cm5zIDAgd2hlbiByZWFkLiAgSG93ZXZlciwgaWYgeW91IHJ1biBhIGNvbW1hbmQgd2l0aAorc2Nhbl9iZWdpbl9zcmM9VFJJR19FWFQsIGl0IHVzZXMgcGluIDEwIGFzIGEgZXh0ZXJuYWwgdHJpZ2dlcmluZworcGluLCB3aGljaCBjYW4gYmUgdXNlZCB0byB3YWtlIHVwIHRhc2tzLgorKi8KKy8qCisgICBzZWUgaHR0cDovL3d3dy5iZXlvbmRsb2dpYy5vcmcvIGZvciBpbmZvcm1hdGlvbi4KKyAgIG9yIGh0dHA6Ly93d3cubGludXgtbWFnYXppbi5kZS9hdXNnYWJlLzE5OTkvMTAvSU8vaW8uaHRtbAorICovCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2RlZmluZSBQQVJQT1JUX1NJWkUgMworCisjZGVmaW5lIFBBUlBPUlRfQSAwCisjZGVmaW5lIFBBUlBPUlRfQiAxCisjZGVmaW5lIFBBUlBPUlRfQyAyCisKK3N0YXRpYyBpbnQgcGFycG9ydF9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCk7CitzdGF0aWMgaW50IHBhcnBvcnRfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldik7CitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfcGFycG9ydCA9IHsKKyAgICAgIC5kcml2ZXJfbmFtZSA9CSJjb21lZGlfcGFycG9ydCIsCisgICAgICAubW9kdWxlID0JCVRISVNfTU9EVUxFLAorICAgICAgLmF0dGFjaCA9CQlwYXJwb3J0X2F0dGFjaCwKKyAgICAgIC5kZXRhY2ggPQkJcGFycG9ydF9kZXRhY2gsCit9OworCitDT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX3BhcnBvcnQpOworCitzdHJ1Y3QgcGFycG9ydF9wcml2YXRlIHsKKwl1bnNpZ25lZCBpbnQgYV9kYXRhOworCXVuc2lnbmVkIGludCBjX2RhdGE7CisJaW50IGVuYWJsZV9pcnE7Cit9OworI2RlZmluZSBkZXZwcml2ICgoc3RydWN0IHBhcnBvcnRfcHJpdmF0ZSAqKShkZXYtPnByaXZhdGUpKQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW5zbl9hKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWlmIChkYXRhWzBdKSB7CisJCWRldnByaXYtPmFfZGF0YSAmPSB+ZGF0YVswXTsKKwkJZGV2cHJpdi0+YV9kYXRhIHw9IChkYXRhWzBdICYgZGF0YVsxXSk7CisKKwkJb3V0YihkZXZwcml2LT5hX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9BKTsKKwl9CisKKwlkYXRhWzFdID0gaW5iKGRldi0+aW9iYXNlICsgUEFSUE9SVF9BKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW5zbl9jb25maWdfYShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpZiAoZGF0YVswXSkgeworCQlzLT5pb19iaXRzID0gMHhmZjsKKwkJZGV2cHJpdi0+Y19kYXRhICY9IH4oMSA8PCA1KTsKKwl9IGVsc2UgeworCQlzLT5pb19iaXRzID0gMDsKKwkJZGV2cHJpdi0+Y19kYXRhIHw9ICgxIDw8IDUpOworCX0KKwlvdXRiKGRldnByaXYtPmNfZGF0YSwgZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0MpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnNuX2IoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaWYgKGRhdGFbMF0pIHsKKwkJLyogc2hvdWxkIHdyaXRlcyBiZSBpZ25vcmVkPyAqLworCQkvKiBhbnlvbmU/Pz8gKi8KKwl9CisKKwlkYXRhWzFdID0gKGluYihkZXYtPmlvYmFzZSArIFBBUlBPUlRfQikgPj4gMyk7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2luc25fYyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlkYXRhWzBdICY9IDB4MGY7CisJaWYgKGRhdGFbMF0pIHsKKwkJZGV2cHJpdi0+Y19kYXRhICY9IH5kYXRhWzBdOworCQlkZXZwcml2LT5jX2RhdGEgfD0gKGRhdGFbMF0gJiBkYXRhWzFdKTsKKworCQlvdXRiKGRldnByaXYtPmNfZGF0YSwgZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0MpOworCX0KKworCWRhdGFbMV0gPSBkZXZwcml2LT5jX2RhdGEgJiAweGY7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2ludHJfaW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpZiAoaW5zbi0+biA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YVsxXSA9IDA7CisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnRyX2NtZHRlc3QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCWNvbWVkaV9jbWQgKmNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgdG1wOworCisJLyogc3RlcCAxICovCisKKwl0bXAgPSBjbWQtPnN0YXJ0X3NyYzsKKwljbWQtPnN0YXJ0X3NyYyAmPSBUUklHX05PVzsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19FWFQ7CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX0ZPTExPVzsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19OT05FOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qIHN0ZXAgMjogaWdub3JlZCAqLworCisJaWYgKGVycikKKwkJcmV0dXJuIDI7CisKKwkvKiBzdGVwIDM6ICovCisKKwlpZiAoY21kLT5zdGFydF9hcmcgIT0gMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyAhPSAwKSB7CisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+Y29udmVydF9hcmcgIT0gMCkgeworCQljbWQtPmNvbnZlcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSAxKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMTsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJY21kLT5zdG9wX2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJLyogc3RlcCA0OiBpZ25vcmVkICovCisKKwlpZiAoZXJyKQorCQlyZXR1cm4gNDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW50cl9jbWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWRldnByaXYtPmNfZGF0YSB8PSAweDEwOworCW91dGIoZGV2cHJpdi0+Y19kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQyk7CisKKwlkZXZwcml2LT5lbmFibGVfaXJxID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW50cl9jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXByaW50ayhLRVJOX0RFQlVHICJwYXJwb3J0X2ludHJfY2FuY2VsKClcbiIpOworCisJZGV2cHJpdi0+Y19kYXRhICY9IH4weDEwOworCW91dGIoZGV2cHJpdi0+Y19kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQyk7CisKKwlkZXZwcml2LT5lbmFibGVfaXJxID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcGFycG9ydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCBQVF9SRUdTX0FSRykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCisJaWYgKCFkZXZwcml2LT5lbmFibGVfaXJxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpX3BhcnBvcnQ6IGJvZ3VzIGlycSwgaWdub3JlZFxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwljb21lZGlfYnVmX3B1dChzLT5hc3luYywgMCk7CisJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0sgfCBDT01FRElfQ0JfRU9TOworCisJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpb2Jhc2UgPSBpdC0+b3B0aW9uc1swXTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogcGFycG9ydDogMHglMDRseCAiLCBkZXYtPm1pbm9yLCBpb2Jhc2UpOworCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBQQVJQT1JUX1NJWkUsICJwYXJwb3J0IChjb21lZGkpIikpIHsKKwkJcHJpbnRrKCJJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXYtPmlvYmFzZSA9IGlvYmFzZTsKKworCWlycSA9IGl0LT5vcHRpb25zWzFdOworCWlmIChpcnEpIHsKKwkJcHJpbnRrKCIgaXJxPSV1IiwgaXJxKTsKKwkJcmV0ID0gY29tZWRpX3JlcXVlc3RfaXJxKGlycSwgcGFycG9ydF9pbnRlcnJ1cHQsIDAsCisJCQkiY29tZWRpX3BhcnBvcnQiLCBkZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKCIgaXJxIG5vdCBhdmFpbGFibGVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCWRldi0+Ym9hcmRfbmFtZSA9ICJwYXJwb3J0IjsKKworCXJldCA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBwYXJwb3J0X3ByaXZhdGUpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IDg7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMgPSBwYXJwb3J0X2luc25fYTsKKwlzLT5pbnNuX2NvbmZpZyA9IHBhcnBvcnRfaW5zbl9jb25maWdfYTsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAxOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuID0gNTsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cyA9IHBhcnBvcnRfaW5zbl9iOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDI7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4gPSA0OworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzID0gcGFycG9ydF9pbnNuX2M7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMzsKKwlpZiAoaXJxKSB7CisJCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9DTURfUkVBRDsKKwkJcy0+bl9jaGFuID0gMTsKKwkJcy0+bWF4ZGF0YSA9IDE7CisJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJCXMtPmluc25fYml0cyA9IHBhcnBvcnRfaW50cl9pbnNuOworCQlzLT5kb19jbWR0ZXN0ID0gcGFycG9ydF9pbnRyX2NtZHRlc3Q7CisJCXMtPmRvX2NtZCA9IHBhcnBvcnRfaW50cl9jbWQ7CisJCXMtPmNhbmNlbCA9IHBhcnBvcnRfaW50cl9jYW5jZWw7CisJfSBlbHNlIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CisKKwlkZXZwcml2LT5hX2RhdGEgPSAwOworCW91dGIoZGV2cHJpdi0+YV9kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQSk7CisJZGV2cHJpdi0+Y19kYXRhID0gMDsKKwlvdXRiKGRldnByaXYtPmNfZGF0YSwgZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0MpOworCisJcHJpbnRrKCJcbiIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoImNvbWVkaSVkOiBwYXJwb3J0OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCisJaWYgKGRldi0+aW9iYXNlKQorCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvYmFzZSwgUEFSUE9SVF9TSVpFKTsKKworCWlmIChkZXYtPmlycSkKKwkJY29tZWRpX2ZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTRhMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wY2kuaApAQCAtMCwwICsxLDYwIEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV9wY2kuaAorICAgIFZhcmlvdXMgUENJIGZ1bmN0aW9ucyBmb3IgZHJpdmVycy4KKworICAgIENvcHlyaWdodCAoQykgMjAwNyBNRVYgTHRkLiA8aHR0cDovL3d3dy5tZXYuY28udWsvPgorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9DT01FRElfUENJX0hfCisjZGVmaW5lIF9DT01FRElfUENJX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworLyoKKyAqIEVuYWJsZSB0aGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCB0aGUgcmVnaW9ucy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY29tZWRpX3BjaV9lbmFibGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCWludCByYzsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIHJlc19uYW1lKTsKKwlpZiAocmMgPCAwKQorCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSByZWdpb25zIGFuZCBkaXNhYmxlIHRoZSBQQ0kgZGV2aWNlLgorICoKKyAqIFRoaXMgbXVzdCBiZSBtYXRjaGVkIHdpdGggYSBwcmV2aW91cyBzdWNjZXNzZnVsIGNhbGwgdG8gY29tZWRpX3BjaV9lbmFibGUoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNvbWVkaV9wY2lfZGlzYWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNGMzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jCisKKyAgICBHZW5lcmF0ZXMgZmFrZSB3YXZlZm9ybSBzaWduYWxzIHRoYXQgY2FuIGJlIHJlYWQgdGhyb3VnaAorICAgIHRoZSBjb21tYW5kIGludGVyZmFjZS4gIEl0IGRvZXMgX25vdF8gcmVhZCBmcm9tIGFueSBib2FyZDsKKyAgICBpdCBqdXN0IGdlbmVyYXRlcyBkZXRlcm1pbmlzdGljIHdhdmVmb3Jtcy4KKyAgICBVc2VmdWwgZm9yIHZhcmlvdXMgdGVzdGluZyBwdXJwb3Nlcy4KKworICAgIENvcHlyaWdodCAoQykgMjAwMiBKb2FjaGltIFd1dHRrZSA8Sm9hY2hpbS5XdXR0a2VAaWNuLnNpZW1lbnMuZGU+CisgICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKK0RyaXZlcjogY29tZWRpX3Rlc3QKK0Rlc2NyaXB0aW9uOiBnZW5lcmF0ZXMgZmFrZSB3YXZlZm9ybXMKK0F1dGhvcjogSm9hY2hpbSBXdXR0a2UgPEpvYWNoaW0uV3V0dGtlQGljbi5zaWVtZW5zLmRlPiwgRnJhbmsgTW9yaSBIZXNzCisgIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PiwgZHMKK0RldmljZXM6CitTdGF0dXM6IHdvcmtzCitVcGRhdGVkOiBTYXQsIDE2IE1hciAyMDAyIDE3OjM0OjQ4IC0wODAwCisKK1RoaXMgZHJpdmVyIGlzIG1haW5seSBmb3IgdGVzdGluZyBwdXJwb3NlcywgYnV0IGNhbiBhbHNvIGJlIHVzZWQgdG8KK2dlbmVyYXRlIHNhbXBsZSB3YXZlZm9ybXMgb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgZGF0YSBhY3F1aXNpdGlvbgoraGFyZHdhcmUuCisKK0NvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAgWzBdIC0gQW1wbGl0dWRlIGluIG1pY3Jvdm9sdHMgZm9yIGZha2Ugd2F2ZWZvcm1zIChkZWZhdWx0IDEgdm9sdCkKKyAgWzFdIC0gUGVyaW9kIGluIG1pY3Jvc2Vjb25kcyBmb3IgZmFrZSB3YXZlZm9ybXMgKGRlZmF1bHQgMC4xIHNlYykKKworR2VuZXJhdGVzIGEgc2F3dG9vdGggd2F2ZSBvbiBjaGFubmVsIDAsIHNxdWFyZSB3YXZlIG9uIGNoYW5uZWwgMSwgYWRkaXRpb25hbAord2F2ZWZvcm1zIGNvdWxkIGJlIGFkZGVkIHRvIG90aGVyIGNoYW5uZWxzIChjdXJyZW50bHkgdGhleSByZXR1cm4gZmxhdGxpbmUKK3plcm8gdm9sdHMpLgorCisqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorCisvKiBCb2FyZCBkZXNjcmlwdGlvbnMgKi8KK3N0cnVjdCB3YXZlZm9ybV9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgYWlfY2hhbnM7CisJaW50IGFpX2JpdHM7CisJaW50IGhhdmVfZGlvOworfTsKKworI2RlZmluZSBOX0NIQU5TIDgKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3YXZlZm9ybV9ib2FyZCB3YXZlZm9ybV9ib2FyZHNbXSA9IHsKKwl7CisJCS5uYW1lID0JCSJjb21lZGlfdGVzdCIsCisJCS5haV9jaGFucyA9CU5fQ0hBTlMsCisJCS5haV9iaXRzID0JMTYsCisJCS5oYXZlX2RpbyA9CTAsCisJfSwKK307CisKKyNkZWZpbmUgdGhpc2JvYXJkICgoY29uc3Qgc3RydWN0IHdhdmVmb3JtX2JvYXJkICopZGV2LT5ib2FyZF9wdHIpCisKKy8qIERhdGEgdW5pcXVlIHRvIHRoaXMgZHJpdmVyICovCitzdHJ1Y3Qgd2F2ZWZvcm1fcHJpdmF0ZSB7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IHRpbWV2YWwgbGFzdDsJLyogdGltZSBhdCB3aGljaCBsYXN0IHRpbWVyIGludGVycnVwdCBvY2N1cmVkICovCisJdW5zaWduZWQgaW50IHV2b2x0X2FtcGxpdHVkZTsJLyogd2F2ZWZvcm0gYW1wbGl0dWRlIGluIG1pY3Jvdm9sdHMgKi8KKwl1bnNpZ25lZCBsb25nIHVzZWNfcGVyaW9kOwkvKiB3YXZlZm9ybSBwZXJpb2QgaW4gbWljcm9zZWNvbmRzICovCisJdW5zaWduZWQgbG9uZyB1c2VjX2N1cnJlbnQ7IC8qIGN1cnJlbnQgdGltZSAobW9kdWxvIHdhdmVmb3JtIHBlcmlvZCkgKi8KKwl1bnNpZ25lZCBsb25nIHVzZWNfcmVtYWluZGVyOwkvKiB1c2VjIHNpbmNlIGxhc3Qgc2NhbjsgKi8KKwl1bnNpZ25lZCBsb25nIGFpX2NvdW50OwkvKiBudW1iZXIgb2YgY29udmVyc2lvbnMgcmVtYWluaW5nICovCisJdW5zaWduZWQgaW50IHNjYW5fcGVyaW9kOwkvKiBzY2FuIHBlcmlvZCBpbiB1c2VjICovCisJdW5zaWduZWQgaW50IGNvbnZlcnRfcGVyaW9kOwkvKiBjb252ZXJzaW9uIHBlcmlvZCBpbiB1c2VjICovCisJdW5zaWduZWQgdGltZXJfcnVubmluZzoxOworCWxzYW1wbF90IGFvX2xvb3BiYWNrc1tOX0NIQU5TXTsKK307CisjZGVmaW5lIGRldnByaXYgKChzdHJ1Y3Qgd2F2ZWZvcm1fcHJpdmF0ZSAqKWRldi0+cHJpdmF0ZSkKKworc3RhdGljIGludCB3YXZlZm9ybV9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCk7CitzdGF0aWMgaW50IHdhdmVmb3JtX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpOworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX3dhdmVmb3JtID0geworICAgICAgLmRyaXZlcl9uYW1lID0JImNvbWVkaV90ZXN0IiwKKyAgICAgIC5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisgICAgICAuYXR0YWNoID0JCXdhdmVmb3JtX2F0dGFjaCwKKyAgICAgIC5kZXRhY2ggPQkJd2F2ZWZvcm1fZGV0YWNoLAorICAgICAgLmJvYXJkX25hbWUgPQkmd2F2ZWZvcm1fYm9hcmRzWzBdLm5hbWUsCisgICAgICAub2Zmc2V0ID0JCXNpemVvZihzdHJ1Y3Qgd2F2ZWZvcm1fYm9hcmQpLAorICAgICAgLm51bV9uYW1lcyA9CXNpemVvZih3YXZlZm9ybV9ib2FyZHMpIC8gc2l6ZW9mKHN0cnVjdCB3YXZlZm9ybV9ib2FyZCksCit9OworCitDT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX3dhdmVmb3JtKTsKKworc3RhdGljIGludCB3YXZlZm9ybV9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBjb21lZGlfY21kICpjbWQpOworc3RhdGljIGludCB3YXZlZm9ybV9haV9jbWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKTsKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcyk7CitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSk7CitzdGF0aWMgaW50IHdhdmVmb3JtX2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKTsKK3N0YXRpYyBzYW1wbF90IGZha2Vfc2F3dG9vdGgoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2UsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKTsKK3N0YXRpYyBzYW1wbF90IGZha2Vfc3F1YXJld2F2ZShjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByYW5nZSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSk7CitzdGF0aWMgc2FtcGxfdCBmYWtlX2ZsYXRsaW5lKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJhbmdlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSk7CitzdGF0aWMgc2FtcGxfdCBmYWtlX3dhdmVmb3JtKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkgICAgIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpOworCisvKiAxMDAwIG5hbm9zZWMgaW4gYSBtaWNyb3NlYyAqLworc3RhdGljIGNvbnN0IGludCBuYW5vX3Blcl9taWNybyA9IDEwMDA7CisKKy8qIGZha2UgYW5hbG9nIGlucHV0IHJhbmdlcyAqLworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2Ugd2F2ZWZvcm1fYWlfcmFuZ2VzID0geworCTIsCisJeworCQkJQklQX1JBTkdFKDEwKSwKKwkJCUJJUF9SQU5HRSg1KSwKKwkJfQorfTsKKworLyoKKyAgIFRoaXMgaXMgdGhlIGJhY2tncm91bmQgcm91dGluZSB1c2VkIHRvIGdlbmVyYXRlIGFyYml0cmFyeSBkYXRhLgorICAgSXQgc2hvdWxkIHJ1biBpbiB0aGUgYmFja2dyb3VuZDsgdGhlcmVmb3JlIGl0IGlzIHNjaGVkdWxlZCBieQorICAgYSB0aW1lciBtZWNoYW5pc20uCisqLworc3RhdGljIHZvaWQgd2F2ZWZvcm1fYWlfaW50ZXJydXB0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGFyZzsKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gZGV2LT5yZWFkX3N1YmRldi0+YXN5bmM7CisJY29tZWRpX2NtZCAqY21kID0gJmFzeW5jLT5jbWQ7CisJdW5zaWduZWQgaW50IGksIGo7CisJLyogYWxsIHRpbWVzIGluIG1pY3Jvc2VjICovCisJdW5zaWduZWQgbG9uZyBlbGFwc2VkX3RpbWU7CisJdW5zaWduZWQgaW50IG51bV9zY2FuczsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisKKwllbGFwc2VkX3RpbWUgPQorCQkxMDAwMDAwICogKG5vdy50dl9zZWMgLSBkZXZwcml2LT5sYXN0LnR2X3NlYykgKyBub3cudHZfdXNlYyAtCisJCWRldnByaXYtPmxhc3QudHZfdXNlYzsKKwlkZXZwcml2LT5sYXN0ID0gbm93OworCW51bV9zY2FucyA9CisJCShkZXZwcml2LT51c2VjX3JlbWFpbmRlciArIGVsYXBzZWRfdGltZSkgLyBkZXZwcml2LT5zY2FuX3BlcmlvZDsKKwlkZXZwcml2LT51c2VjX3JlbWFpbmRlciA9CisJCShkZXZwcml2LT51c2VjX3JlbWFpbmRlciArIGVsYXBzZWRfdGltZSkgJSBkZXZwcml2LT5zY2FuX3BlcmlvZDsKKwlhc3luYy0+ZXZlbnRzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2NhbnM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgY21kLT5jaGFubGlzdF9sZW47IGorKykgeworCQkJY2ZjX3dyaXRlX3RvX2J1ZmZlcihkZXYtPnJlYWRfc3ViZGV2LAorCQkJCWZha2Vfd2F2ZWZvcm0oZGV2LCBDUl9DSEFOKGNtZC0+Y2hhbmxpc3Rbal0pLAorCQkJCQlDUl9SQU5HRShjbWQtPmNoYW5saXN0W2pdKSwKKwkJCQkJZGV2cHJpdi0+dXNlY19jdXJyZW50ICsKKwkJCQkJaSAqIGRldnByaXYtPnNjYW5fcGVyaW9kICsKKwkJCQkJaiAqIGRldnByaXYtPmNvbnZlcnRfcGVyaW9kKSk7CisJCX0KKwkJZGV2cHJpdi0+YWlfY291bnQrKzsKKwkJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVAorCQkJJiYgZGV2cHJpdi0+YWlfY291bnQgPj0gY21kLT5zdG9wX2FyZykgeworCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZXZwcml2LT51c2VjX2N1cnJlbnQgKz0gZWxhcHNlZF90aW1lOworCWRldnByaXYtPnVzZWNfY3VycmVudCAlPSBkZXZwcml2LT51c2VjX3BlcmlvZDsKKworCWlmICgoYXN5bmMtPmV2ZW50cyAmIENPTUVESV9DQl9FT0EpID09IDAgJiYgZGV2cHJpdi0+dGltZXJfcnVubmluZykKKwkJbW9kX3RpbWVyKCZkZXZwcml2LT50aW1lciwgamlmZmllcyArIDEpOworCWVsc2UKKwkJZGVsX3RpbWVyKCZkZXZwcml2LT50aW1lcik7CisKKwljb21lZGlfZXZlbnQoZGV2LCBkZXYtPnJlYWRfc3ViZGV2KTsKK30KKworc3RhdGljIGludCB3YXZlZm9ybV9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCBhbXBsaXR1ZGUgPSBpdC0+b3B0aW9uc1swXTsKKwlpbnQgcGVyaW9kID0gaXQtPm9wdGlvbnNbMV07CisJaW50IGk7CisKKwlkZXYtPmJvYXJkX25hbWUgPSB0aGlzYm9hcmQtPm5hbWU7CisKKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3Qgd2F2ZWZvcm1fcHJpdmF0ZSkpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBzZXQgZGVmYXVsdCBhbXBsaXR1ZGUgYW5kIHBlcmlvZCAqLworCWlmIChhbXBsaXR1ZGUgPD0gMCkKKwkJYW1wbGl0dWRlID0gMTAwMDAwMDsJLyogMSB2b2x0ICovCisJaWYgKHBlcmlvZCA8PSAwKQorCQlwZXJpb2QgPSAxMDAwMDA7CS8qIDAuMSBzZWMgKi8KKworCWRldnByaXYtPnV2b2x0X2FtcGxpdHVkZSA9IGFtcGxpdHVkZTsKKwlkZXZwcml2LT51c2VjX3BlcmlvZCA9IHBlcmlvZDsKKworCWRldi0+bl9zdWJkZXZpY2VzID0gMjsKKwlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIGRldi0+bl9zdWJkZXZpY2VzKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJLyogYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NNRF9SRUFEOworCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YWlfY2hhbnM7CisJcy0+bWF4ZGF0YSA9ICgxIDw8IHRoaXNib2FyZC0+YWlfYml0cykgLSAxOworCXMtPnJhbmdlX3RhYmxlID0gJndhdmVmb3JtX2FpX3JhbmdlczsKKwlzLT5sZW5fY2hhbmxpc3QgPSBzLT5uX2NoYW4gKiAyOworCXMtPmluc25fcmVhZCA9IHdhdmVmb3JtX2FpX2luc25fcmVhZDsKKwlzLT5kb19jbWQgPSB3YXZlZm9ybV9haV9jbWQ7CisJcy0+ZG9fY21kdGVzdCA9IHdhdmVmb3JtX2FpX2NtZHRlc3Q7CisJcy0+Y2FuY2VsID0gd2F2ZWZvcm1fYWlfY2FuY2VsOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJZGV2LT53cml0ZV9zdWJkZXYgPSBzOworCS8qIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIChsb29wYmFjaykgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRFQUJMRSB8IFNERl9HUk9VTkQ7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haV9jaGFuczsKKwlzLT5tYXhkYXRhID0gKDEgPDwgdGhpc2JvYXJkLT5haV9iaXRzKSAtIDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmd2F2ZWZvcm1fYWlfcmFuZ2VzOworCXMtPmxlbl9jaGFubGlzdCA9IHMtPm5fY2hhbiAqIDI7CisJcy0+aW5zbl93cml0ZSA9IHdhdmVmb3JtX2FvX2luc25fd3JpdGU7CisJcy0+ZG9fY21kID0gTlVMTDsKKwlzLT5kb19jbWR0ZXN0ID0gTlVMTDsKKwlzLT5jYW5jZWwgPSBOVUxMOworCisJLyogT3VyIGRlZmF1bHQgbG9vcGJhY2sgdmFsdWUgaXMganVzdCBhIDBWIGZsYXRsaW5lICovCisJZm9yIChpID0gMDsgaSA8IHMtPm5fY2hhbjsgaSsrKQorCQlkZXZwcml2LT5hb19sb29wYmFja3NbaV0gPSBzLT5tYXhkYXRhIC8gMjsKKworCWluaXRfdGltZXIoJihkZXZwcml2LT50aW1lcikpOworCWRldnByaXYtPnRpbWVyLmZ1bmN0aW9uID0gd2F2ZWZvcm1fYWlfaW50ZXJydXB0OworCWRldnByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogY29tZWRpX3Rlc3Q6ICIKKwkJIiVpIG1pY3Jvdm9sdCwgJWxpIG1pY3Jvc2Vjb25kIHdhdmVmb3JtIGF0dGFjaGVkXG4iLCBkZXYtPm1pbm9yLAorCQlkZXZwcml2LT51dm9sdF9hbXBsaXR1ZGUsIGRldnByaXYtPnVzZWNfcGVyaW9kKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB3YXZlZm9ybV9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCXByaW50aygiY29tZWRpJWQ6IGNvbWVkaV90ZXN0OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCisJaWYgKGRldi0+cHJpdmF0ZSkKKwkJd2F2ZWZvcm1fYWlfY2FuY2VsKGRldiwgZGV2LT5yZWFkX3N1YmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YXZlZm9ybV9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBjb21lZGlfY21kICpjbWQpCit7CisJaW50IGVyciA9IDA7CisJaW50IHRtcDsKKworCS8qIHN0ZXAgMTogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCisKKwl0bXAgPSBjbWQtPnN0YXJ0X3NyYzsKKwljbWQtPnN0YXJ0X3NyYyAmPSBUUklHX05PVzsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUjsKKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19USU1FUjsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlCisJICovCisKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX05PVyAmJiBjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfVElNRVIpCisJCWVycisrOworCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX05PTkUpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDI7CisKKwkvKiBzdGVwIDM6IG1ha2Ugc3VyZSBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoY21kLT5zdGFydF9hcmcgIT0gMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX05PVykgeworCQlpZiAoY21kLT5jb252ZXJ0X2FyZyAhPSAwKSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCBuYW5vX3Blcl9taWNybykgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IG5hbm9fcGVyX21pY3JvOworCQkJZXJyKys7CisJCX0KKwkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUiAmJgorCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA8CisJCQljbWQtPmNvbnZlcnRfYXJnICogY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPQorCQkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCWVycisrOworCQl9CisJfQorCS8qCisJICogWFhYIHRoZXNlIGNoZWNrcyBhcmUgZ2VuZXJpYyBhbmQgc2hvdWxkIGdvIGluIGNvcmUgaWYgbm90IHRoZXJlCisJICogYWxyZWFkeQorCSAqLworCWlmICghY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5jaGFubGlzdF9sZW4gPSAxOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gY21kLT5jaGFubGlzdF9sZW47CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJaWYgKCFjbWQtPnN0b3BfYXJnKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMTsKKwkJCWVycisrOworCQl9CisJfSBlbHNlIHsJCS8qIFRSSUdfTk9ORSAqLworCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CisJCS8qIHJvdW5kIHRvIG5lYXJlc3QgbWljcm9zZWMgKi8KKwkJY21kLT5zY2FuX2JlZ2luX2FyZyA9CisJCQluYW5vX3Blcl9taWNybyAqICgodG1wICsKKwkJCQkobmFub19wZXJfbWljcm8gLyAyKSkgLyBuYW5vX3Blcl9taWNybyk7CisJCWlmICh0bXAgIT0gY21kLT5zY2FuX2JlZ2luX2FyZykKKwkJCWVycisrOworCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7CisJCS8qIHJvdW5kIHRvIG5lYXJlc3QgbWljcm9zZWMgKi8KKwkJY21kLT5jb252ZXJ0X2FyZyA9CisJCQluYW5vX3Blcl9taWNybyAqICgodG1wICsKKwkJCQkobmFub19wZXJfbWljcm8gLyAyKSkgLyBuYW5vX3Blcl9taWNybyk7CisJCWlmICh0bXAgIT0gY21kLT5jb252ZXJ0X2FyZykKKwkJCWVycisrOworCX0KKworCWlmIChlcnIpCisJCXJldHVybiA0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfY21kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKworCWlmIChjbWQtPmZsYWdzICYgVFJJR19SVCkgeworCQljb21lZGlfZXJyb3IoZGV2LAorCQkJImNvbW1hbmRzIGF0IFJUIHByaW9yaXR5IG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBkcml2ZXIiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRldnByaXYtPnRpbWVyX3J1bm5pbmcgPSAxOworCWRldnByaXYtPmFpX2NvdW50ID0gMDsKKwlkZXZwcml2LT5zY2FuX3BlcmlvZCA9IGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyBuYW5vX3Blcl9taWNybzsKKworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XKQorCQlkZXZwcml2LT5jb252ZXJ0X3BlcmlvZCA9IDA7CisJZWxzZSBpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQorCQlkZXZwcml2LT5jb252ZXJ0X3BlcmlvZCA9IGNtZC0+Y29udmVydF9hcmcgLyBuYW5vX3Blcl9taWNybzsKKwllbHNlIHsKKwkJY29tZWRpX2Vycm9yKGRldiwgImJ1ZyBzZXR0aW5nIGNvbnZlcnNpb24gcGVyaW9kIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkb19nZXR0aW1lb2ZkYXkoJmRldnByaXYtPmxhc3QpOworCWRldnByaXYtPnVzZWNfY3VycmVudCA9IGRldnByaXYtPmxhc3QudHZfdXNlYyAlIGRldnByaXYtPnVzZWNfcGVyaW9kOworCWRldnByaXYtPnVzZWNfcmVtYWluZGVyID0gMDsKKworCWRldnByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwlhZGRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YXZlZm9ybV9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWRldnByaXYtPnRpbWVyX3J1bm5pbmcgPSAwOworCWRlbF90aW1lcigmZGV2cHJpdi0+dGltZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc2FtcGxfdCBmYWtlX3Nhd3Rvb3RoKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJhbmdlX2luZGV4LAorCQkJICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcy0+bWF4ZGF0YSAvIDI7CisJdTY0IHZhbHVlOworCWNvbnN0IGNvbWVkaV9rcmFuZ2UgKmtyYW5nZSA9ICZzLT5yYW5nZV90YWJsZS0+cmFuZ2VbcmFuZ2VfaW5kZXhdOworCXU2NCBiaW5hcnlfYW1wbGl0dWRlOworCisJYmluYXJ5X2FtcGxpdHVkZSA9IHMtPm1heGRhdGE7CisJYmluYXJ5X2FtcGxpdHVkZSAqPSBkZXZwcml2LT51dm9sdF9hbXBsaXR1ZGU7CisJZG9fZGl2KGJpbmFyeV9hbXBsaXR1ZGUsIGtyYW5nZS0+bWF4IC0ga3JhbmdlLT5taW4pOworCisJY3VycmVudF90aW1lICU9IGRldnByaXYtPnVzZWNfcGVyaW9kOworCXZhbHVlID0gY3VycmVudF90aW1lOworCXZhbHVlICo9IGJpbmFyeV9hbXBsaXR1ZGUgKiAyOworCWRvX2Rpdih2YWx1ZSwgZGV2cHJpdi0+dXNlY19wZXJpb2QpOworCXZhbHVlIC09IGJpbmFyeV9hbXBsaXR1ZGU7CS8qIGdldCByaWQgb2Ygc2F3dG9vdGgncyBkYyBvZmZzZXQgKi8KKworCXJldHVybiBvZmZzZXQgKyB2YWx1ZTsKK30KK3N0YXRpYyBzYW1wbF90IGZha2Vfc3F1YXJld2F2ZShjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByYW5nZV9pbmRleCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcy0+bWF4ZGF0YSAvIDI7CisJdTY0IHZhbHVlOworCWNvbnN0IGNvbWVkaV9rcmFuZ2UgKmtyYW5nZSA9ICZzLT5yYW5nZV90YWJsZS0+cmFuZ2VbcmFuZ2VfaW5kZXhdOworCWN1cnJlbnRfdGltZSAlPSBkZXZwcml2LT51c2VjX3BlcmlvZDsKKworCXZhbHVlID0gcy0+bWF4ZGF0YTsKKwl2YWx1ZSAqPSBkZXZwcml2LT51dm9sdF9hbXBsaXR1ZGU7CisJZG9fZGl2KHZhbHVlLCBrcmFuZ2UtPm1heCAtIGtyYW5nZS0+bWluKTsKKworCWlmIChjdXJyZW50X3RpbWUgPCBkZXZwcml2LT51c2VjX3BlcmlvZCAvIDIpCisJCXZhbHVlICo9IC0xOworCisJcmV0dXJuIG9mZnNldCArIHZhbHVlOworfQorCitzdGF0aWMgc2FtcGxfdCBmYWtlX2ZsYXRsaW5lKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJhbmdlX2luZGV4LAorCQkJICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSkKK3sKKwlyZXR1cm4gZGV2LT5yZWFkX3N1YmRldi0+bWF4ZGF0YSAvIDI7Cit9CisKKy8qIGdlbmVyYXRlcyBhIGRpZmZlcmVudCB3YXZlZm9ybSBkZXBlbmRpbmcgb24gd2hhdCBjaGFubmVsIGlzIHJlYWQgKi8KK3N0YXRpYyBzYW1wbF90IGZha2Vfd2F2ZWZvcm0oY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSkKK3sKKwllbnVtIHsKKwkJU0FXVE9PVEhfQ0hBTiwKKwkJU1FVQVJFX0NIQU4sCisJfTsKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIFNBV1RPT1RIX0NIQU46CisJCXJldHVybiBmYWtlX3Nhd3Rvb3RoKGRldiwgcmFuZ2UsIGN1cnJlbnRfdGltZSk7CisJCWJyZWFrOworCWNhc2UgU1FVQVJFX0NIQU46CisJCXJldHVybiBmYWtlX3NxdWFyZXdhdmUoZGV2LCByYW5nZSwgY3VycmVudF90aW1lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZha2VfZmxhdGxpbmUoZGV2LCByYW5nZSwgY3VycmVudF90aW1lKTsKK30KKworc3RhdGljIGludCB3YXZlZm9ybV9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGksIGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19sb29wYmFja3NbY2hhbl07CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCB3YXZlZm9ybV9hb19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgaSwgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGV2cHJpdi0+YW9fbG9vcGJhY2tzW2NoYW5dID0gZGF0YVtpXTsKKworCXJldHVybiBpbnNuLT5uOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0OTgxMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0OTgxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZDIxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMKQEAgLTAsMCArMSwxMTYyIEBACisvKgorICogY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMKKyAqICAgQ09NRURJIGRyaXZlciBmb3IgRGF0YVRyYW5zbGF0aW9uIERUOTgxMiBVU0IgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFuZGVycyBCbG9tZGVsbCA8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPgorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisvKgorRHJpdmVyOiBkdDk4MTIKK0Rlc2NyaXB0aW9uOiBEYXRhIFRyYW5zbGF0aW9uIERUOTgxMiBVU0IgbW9kdWxlCitBdXRob3I6IGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZSAoQW5kZXJzIEJsb21kZWxsKQorU3RhdHVzOiBpbiBkZXZlbG9wbWVudAorRGV2aWNlczogW0RhdGEgVHJhbnNsYXRpb25dIERUOTgxMiAoZHQ5ODEyKQorVXBkYXRlZDogU3VuIE5vdiAyMCAyMDoxODozNCBFU1QgMjAwNQorCitUaGlzIGRyaXZlciB3b3JrcywgYnV0IGJ1bGsgdHJhbnNmZXJzIG5vdCBpbXBsZW1lbnRlZC4gTWlnaHQgYmUgYSBzdGFydGluZyBwb2ludAorZm9yIHNvbWVvbmUgZWxzZS4gSSBmb3VuZCBvdXQgdG9vIGxhdGUgdGhhdCBVU0IgaGFzIHRvbyBoaWdoIGxhdGVuY2llcyAoPjEgbXMpCitmb3IgbXkgbmVlZHMuCisqLworCisvKgorICogTm90YSBCZW5lOgorICogICAxLiBBbGwgd3JpdGVzIHRvIGNvbW1hbmQgcGlwZSBoYXMgdG8gYmUgMzIgYnl0ZXMgKElTUDExODFCIFNIUlRQPTAgPykKKyAqICAgMi4gVGhlIERESyBzb3VyY2UgKGFzIG9mIHNlcCAyMDA1KSBpcyBpbiBlcnJvciByZWdhcmRpbmcgdGhlCisgKiAgICAgIGlucHV0IE1VWCBiaXRzIChleGFtcGxlIGNvZGUgc2F5cyBQNCwgYnV0IGZpcm13YXJlIHNjaGVtYXRpY3MKKyAqICAgICAgc2F5cyBQMSkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNkZWZpbmUgRFQ5ODEyX0RJQUdTX0JPQVJEX0lORk9fQUREUgkweEZCRkYKKyNkZWZpbmUgRFQ5ODEyX01BWF9XUklURV9DTURfUElQRV9TSVpFCTMyCisjZGVmaW5lIERUOTgxMl9NQVhfUkVBRF9DTURfUElQRV9TSVpFCTMyCisKKy8qCisgKiBTZWUgU2lsaWNhbiBMYWJvcmF0b3JpZXMgQzgwNTFGMDIwLzEvMi8zIG1hbnVhbAorICovCisjZGVmaW5lIEYwMjBfU0ZSX1A0CQkJMHg4NAorI2RlZmluZSBGMDIwX1NGUl9QMQkJCTB4OTAKKyNkZWZpbmUgRjAyMF9TRlJfUDIJCQkweGEwCisjZGVmaW5lIEYwMjBfU0ZSX1AzCQkJMHhiMAorI2RlZmluZSBGMDIwX1NGUl9BTVgwQ0YJCQkweGJhCisjZGVmaW5lIEYwMjBfU0ZSX0FNWDBTTAkJCTB4YmIKKyNkZWZpbmUgRjAyMF9TRlJfQURDMENGCQkJMHhiYworI2RlZmluZSBGMDIwX1NGUl9BREMwTAkJCTB4YmUKKyNkZWZpbmUgRjAyMF9TRlJfQURDMEgJCQkweGJmCisjZGVmaW5lIEYwMjBfU0ZSX0RBQzBMCQkJMHhkMgorI2RlZmluZSBGMDIwX1NGUl9EQUMwSAkJCTB4ZDMKKyNkZWZpbmUgRjAyMF9TRlJfREFDMENOCQkJMHhkNAorI2RlZmluZSBGMDIwX1NGUl9EQUMxTAkJCTB4ZDUKKyNkZWZpbmUgRjAyMF9TRlJfREFDMUgJCQkweGQ2CisjZGVmaW5lIEYwMjBfU0ZSX0RBQzFDTgkJCTB4ZDcKKyNkZWZpbmUgRjAyMF9TRlJfQURDMENOCQkJMHhlOAorCisjZGVmaW5lIEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMAkweDAxCisjZGVmaW5lIEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMQkweDAyCisjZGVmaW5lIEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMgkweDA0CisKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDTl9BRDBFTgkJMHg4MAorI2RlZmluZSBGMDIwX01BU0tfQURDMENOX0FEMElOVAkJMHgyMAorI2RlZmluZSBGMDIwX01BU0tfQURDMENOX0FEMEJVU1kJMHgxMAorCisjZGVmaW5lIEYwMjBfTUFTS19EQUN4Q05fREFDeEVOCQkweDgwCisKK2VudW0geworCQkJCS8qIEEvRCAgRC9BICBESSAgRE8gIENUICovCisJRFQ5ODEyX0RFVklEX0RUOTgxMl8xMCwJLyogIDggICAgMiAgIDggICA4ICAgMSAgKy8tIDEwViAqLworCURUOTgxMl9ERVZJRF9EVDk4MTJfMlBUNSwvKiA4ICAgIDIgICA4ICAgOCAgIDEgIDAtMi40NFYgKi8KKyNpZiAwCisJRFQ5ODEyX0RFVklEX0RUOTgxMywJLyogIDE2ICAgMiAgIDQgICA0ICAgMSAgKy8tIDEwViAqLworCURUOTgxMl9ERVZJRF9EVDk4MTQJLyogIDI0ICAgMiAgIDAgICAwICAgMSAgKy8tIDEwViAqLworI2VuZGlmCit9OworCitlbnVtIGR0OTgxMl9nYWluIHsKKwlEVDk4MTJfR0FJTl8wUFQyNSA9IDEsCisJRFQ5ODEyX0dBSU5fMFBUNSA9IDIsCisJRFQ5ODEyX0dBSU5fMSA9IDQsCisJRFQ5ODEyX0dBSU5fMiA9IDgsCisJRFQ5ODEyX0dBSU5fNCA9IDE2LAorCURUOTgxMl9HQUlOXzggPSAzMiwKKwlEVDk4MTJfR0FJTl8xNiA9IDY0LAorfTsKKworZW51bSB7CisJRFQ5ODEyX0xFQVNUX1VTQl9GSVJNV0FSRV9DTURfQ09ERSA9IDAsCisJLyogV3JpdGUgRmxhc2ggbWVtb3J5ICovCisJRFQ5ODEyX1dfRkxBU0hfREFUQSA9IDAsCisJLyogUmVhZCBGbGFzaCBtZW1vcnkgbWlzYyBjb25maWcgaW5mbyAqLworCURUOTgxMl9SX0ZMQVNIX0RBVEEgPSAxLAorCisJLyoKKwkgKiBSZWdpc3RlciByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciBwcm9jZXNzb3IKKwkgKi8KKworCS8qIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZiBVU0IgbWVtb3J5ICovCisJRFQ5ODEyX1JfU0lOR0xFX0JZVEVfUkVHID0gMiwKKwkvKiBXcml0ZSBhIHNpbmdsZSBieXRlIG9mIFVTQiBtZW1vcnkgKi8KKwlEVDk4MTJfV19TSU5HTEVfQllURV9SRUcgPSAzLAorCS8qIE11bHRpcGxlIFJlYWRzIG9mIFVTQiBtZW1vcnkgKi8KKwlEVDk4MTJfUl9NVUxUSV9CWVRFX1JFRyA9IDQsCisJLyogTXVsdGlwbGUgV3JpdGVzIG9mIFVTQiBtZW1vcnkgKi8KKwlEVDk4MTJfV19NVUxUSV9CWVRFX1JFRyA9IDUsCisJLyogUmVhZCwgKEFORCkgd2l0aCBtYXNrLCBPUiB2YWx1ZSwgdGhlbiB3cml0ZSAoc2luZ2xlKSAqLworCURUOTgxMl9STVdfU0lOR0xFX0JZVEVfUkVHID0gNiwKKwkvKiBSZWFkLCAoQU5EKSB3aXRoIG1hc2ssIE9SIHZhbHVlLCB0aGVuIHdyaXRlIChtdWx0aXBsZSkgKi8KKwlEVDk4MTJfUk1XX01VTFRJX0JZVEVfUkVHID0gNywKKworCS8qCisJICogUmVnaXN0ZXIgcmVhZC93cml0ZSBjb21tYW5kcyBmb3IgU01CdXMKKwkgKi8KKworCS8qIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZiBTTUJ1cyAqLworCURUOTgxMl9SX1NJTkdMRV9CWVRFX1NNQlVTID0gOCwKKwkvKiBXcml0ZSBhIHNpbmdsZSBieXRlIG9mIFNNQnVzICovCisJRFQ5ODEyX1dfU0lOR0xFX0JZVEVfU01CVVMgPSA5LAorCS8qIE11bHRpcGxlIFJlYWRzIG9mIFNNQnVzICovCisJRFQ5ODEyX1JfTVVMVElfQllURV9TTUJVUyA9IDEwLAorCS8qIE11bHRpcGxlIFdyaXRlcyBvZiBTTUJ1cyAqLworCURUOTgxMl9XX01VTFRJX0JZVEVfU01CVVMgPSAxMSwKKworCS8qCisJICogUmVnaXN0ZXIgcmVhZC93cml0ZSBjb21tYW5kcyBmb3IgYSBkZXZpY2UKKwkgKi8KKworCS8qIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZiBhIGRldmljZSAqLworCURUOTgxMl9SX1NJTkdMRV9CWVRFX0RFViA9IDEyLAorCS8qIFdyaXRlIGEgc2luZ2xlIGJ5dGUgb2YgYSBkZXZpY2UgKi8KKwlEVDk4MTJfV19TSU5HTEVfQllURV9ERVYgPSAxMywKKwkvKiBNdWx0aXBsZSBSZWFkcyBvZiBhIGRldmljZSAqLworCURUOTgxMl9SX01VTFRJX0JZVEVfREVWID0gMTQsCisJLyogTXVsdGlwbGUgV3JpdGVzIG9mIGEgZGV2aWNlICovCisJRFQ5ODEyX1dfTVVMVElfQllURV9ERVYgPSAxNSwKKworCS8qIE5vdCBzdXJlIGlmIHdlJ2xsIG5lZWQgdGhpcyAqLworCURUOTgxMl9XX0RBQ19USFJFU0hPTEQgPSAxNiwKKworCS8qIFNldCBpbnRlcnJ1cHQgb24gY2hhbmdlIG1hc2sgKi8KKwlEVDk4MTJfV19JTlRfT05fQ0hBTkdFX01BU0sgPSAxNywKKworCS8qIFdyaXRlIChvciBDbGVhcikgdGhlIENHTCBmb3IgdGhlIEFEQyAqLworCURUOTgxMl9XX0NHTCA9IDE4LAorCS8qIE11bHRpcGxlIFJlYWRzIG9mIFVTQiBtZW1vcnkgKi8KKwlEVDk4MTJfUl9NVUxUSV9CWVRFX1VTQk1FTSA9IDE5LAorCS8qIE11bHRpcGxlIFdyaXRlcyB0byBVU0IgbWVtb3J5ICovCisJRFQ5ODEyX1dfTVVMVElfQllURV9VU0JNRU0gPSAyMCwKKworCS8qIElzc3VlIGEgc3RhcnQgY29tbWFuZCB0byBhIGdpdmVuIHN1YnN5c3RlbSAqLworCURUOTgxMl9TVEFSVF9TVUJTWVNURU0gPSAyMSwKKwkvKiBJc3N1ZSBhIHN0b3AgY29tbWFuZCB0byBhIGdpdmVuIHN1YnN5c3RlbSAqLworCURUOTgxMl9TVE9QX1NVQlNZU1RFTSA9IDIyLAorCisJLyogY2FsaWJyYXRlIHRoZSBib2FyZCB1c2luZyBDQUxfUE9UX0NNRCAqLworCURUOTgxMl9DQUxJQlJBVEVfUE9UID0gMjMsCisJLyogc2V0IHRoZSBEQUMgRklGTyBzaXplICovCisJRFQ5ODEyX1dfREFDX0ZJRk9fU0laRSA9IDI0LAorCS8qIFdyaXRlIG9yIENsZWFyIHRoZSBDR0wgZm9yIHRoZSBEQUMgKi8KKwlEVDk4MTJfV19DR0xfREFDID0gMjUsCisJLyogUmVhZCBhIHNpbmdsZSB2YWx1ZSBmcm9tIGEgc3Vic3lzdGVtICovCisJRFQ5ODEyX1JfU0lOR0xFX1ZBTFVFX0NNRCA9IDI2LAorCS8qIFdyaXRlIGEgc2luZ2xlIHZhbHVlIHRvIGEgc3Vic3lzdGVtICovCisJRFQ5ODEyX1dfU0lOR0xFX1ZBTFVFX0NNRCA9IDI3LAorCS8qIFZhbGlkIERUOTgxMl9VU0JfRklSTVdBUkVfQ01EX0NPREUncyB3aWxsIGJlIGxlc3MgdGhhbiB0aGlzIG51bWJlciAqLworCURUOTgxMl9NQVhfVVNCX0ZJUk1XQVJFX0NNRF9DT0RFLAorfTsKKworc3RydWN0IGR0OTgxMl9mbGFzaF9kYXRhIHsKKwl1MTYgbnVtYnl0ZXM7CisJdTE2IGFkZHJlc3M7Cit9OworCisjZGVmaW5lIERUOTgxMl9NQVhfTlVNX01VTFRJX0JZVEVfUkRTICBcCisgICAgKChEVDk4MTJfTUFYX1dSSVRFX0NNRF9QSVBFX1NJWkUgLSA0IC0gMSkgLyBzaXplb2YodTgpKQorCitzdHJ1Y3QgZHQ5ODEyX3JlYWRfbXVsdGkgeworCXU4IGNvdW50OworCXU4IGFkZHJlc3NbRFQ5ODEyX01BWF9OVU1fTVVMVElfQllURV9SRFNdOworfTsKKworc3RydWN0IGR0OTgxMl93cml0ZV9ieXRlIHsKKwl1OCBhZGRyZXNzOworCXU4IHZhbHVlOworfTsKKworI2RlZmluZSBEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1dSVFMgIFwKKyAgICAoKERUOTgxMl9NQVhfV1JJVEVfQ01EX1BJUEVfU0laRSAtIDQgLSAxKSAvIFwKKyAgICAgIHNpemVvZihzdHJ1Y3QgZHQ5ODEyX3dyaXRlX2J5dGUpKQorCitzdHJ1Y3QgZHQ5ODEyX3dyaXRlX211bHRpIHsKKwl1OCBjb3VudDsKKwlzdHJ1Y3QgZHQ5ODEyX3dyaXRlX2J5dGUgd3JpdGVbRFQ5ODEyX01BWF9OVU1fTVVMVElfQllURV9XUlRTXTsKK307CisKK3N0cnVjdCBkdDk4MTJfcm13X2J5dGUgeworCXU4IGFkZHJlc3M7CisJdTggYW5kX21hc2s7CisJdTggb3JfdmFsdWU7Cit9OworCisjZGVmaW5lIERUOTgxMl9NQVhfTlVNX01VTFRJX0JZVEVfUk1XUyAgXAorICAgICgoRFQ5ODEyX01BWF9XUklURV9DTURfUElQRV9TSVpFIC0gNCAtIDEpIC8gc2l6ZW9mKHN0cnVjdCBkdDk4MTJfcm13X2J5dGUpKQorCitzdHJ1Y3QgZHQ5ODEyX3Jtd19tdWx0aSB7CisJdTggY291bnQ7CisJc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSBybXdbRFQ5ODEyX01BWF9OVU1fTVVMVElfQllURV9STVdTXTsKK307CisKK3N0cnVjdCBkdDk4MTJfdXNiX2NtZCB7CisJdTMyIGNtZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBkdDk4MTJfZmxhc2hfZGF0YSBmbGFzaF9kYXRhX2luZm87CisJCXN0cnVjdCBkdDk4MTJfcmVhZF9tdWx0aSByZWFkX211bHRpX2luZm87CisJCXN0cnVjdCBkdDk4MTJfd3JpdGVfbXVsdGkgd3JpdGVfbXVsdGlfaW5mbzsKKwkJc3RydWN0IGR0OTgxMl9ybXdfbXVsdGkgcm13X211bHRpX2luZm87CisJfSB1OworI2lmIDAKKwlXUklURV9CWVRFX0lORk8gV3JpdGVCeXRlSW5mbzsKKwlSRUFEX0JZVEVfSU5GTyBSZWFkQnl0ZUluZm87CisJV1JJVEVfTVVMVElfSU5GTyBXcml0ZU11bHRpSW5mbzsKKwlSRUFEX01VTFRJX0lORk8gUmVhZE11bHRpSW5mbzsKKwlSTVdfQllURV9JTkZPIFJNV0J5dGVJbmZvOworCVJNV19NVUxUSV9JTkZPIFJNV011bHRpSW5mbzsKKwlEQUNfVEhSRVNIT0xEX0lORk8gRGFjVGhyZXNob2xkSW5mbzsKKwlJTlRfT05fQ0hBTkdFX01BU0tfSU5GTyBJbnRPbkNoYW5nZU1hc2tJbmZvOworCUNHTF9JTkZPIENnbEluZm87CisJU1VCU1lTVEVNX0lORk8gU3Vic3lzdGVtSW5mbzsKKwlDQUxfUE9UX0NNRCBDYWxQb3RDbWQ7CisJV1JJVEVfREVWX0JZVEVfSU5GTyBXcml0ZURldkJ5dGVJbmZvOworCVJFQURfREVWX0JZVEVfSU5GTyBSZWFkRGV2Qnl0ZUluZm87CisJV1JJVEVfREVWX01VTFRJX0lORk8gV3JpdGVEZXZNdWx0aUluZm87CisJUkVBRF9ERVZfTVVMVElfSU5GTyBSZWFkRGV2TXVsdGlJbmZvOworCVJFQURfU0lOR0xFX1ZBTFVFX0lORk8gUmVhZFNpbmdsZVZhbHVlSW5mbzsKKwlXUklURV9TSU5HTEVfVkFMVUVfSU5GTyBXcml0ZVNpbmdsZVZhbHVlSW5mbzsKKyNlbmRpZgorfTsKKworI2RlZmluZSBEVDk4MTJfTlVNX1NMT1RTCTE2CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGR0OTgxMl9tdXRleCk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkdDk4MTJfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRSgweDA4NjcsIDB4OTgxMil9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZHQ5ODEyX3RhYmxlKTsKKworc3RydWN0IHVzYl9kdDk4MTIgeworCXN0cnVjdCBzbG90X2R0OTgxMiAqc2xvdDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXUxNiB2ZW5kb3I7CisJdTE2IHByb2R1Y3Q7CisJdTE2IGRldmljZTsKKwl1MzIgc2VyaWFsOworCXN0cnVjdCB7CisJCV9fdTggYWRkcjsKKwkJc2l6ZV90IHNpemU7CisJfSBtZXNzYWdlX3BpcGUsIGNvbW1hbmRfd3JpdGUsIGNvbW1hbmRfcmVhZCwgd3JpdGVfc3RyZWFtLCByZWFkX3N0cmVhbTsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXUxNiBhbmFsb2dfb3V0X3NoYWRvd1syXTsKKwl1OCBkaWdpdGFsX291dF9zaGFkb3c7Cit9OworCitzdHJ1Y3QgY29tZWRpX2R0OTgxMiB7CisJc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90OworCXUzMiBzZXJpYWw7Cit9OworCitzdHJ1Y3Qgc2xvdF9kdDk4MTIgeworCXN0cnVjdCBzZW1hcGhvcmUgbXV0ZXg7CisJdTMyIHNlcmlhbDsKKwlzdHJ1Y3QgdXNiX2R0OTgxMiAqdXNiOworCXN0cnVjdCBjb21lZGlfZHQ5ODEyICpjb21lZGk7Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBkdDk4MTJfMTBfYWluX3JhbmdlID0geyAxLCB7CisJCQlCSVBfUkFOR0UoMTApLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIGR0OTgxMl8ycHQ1X2Fpbl9yYW5nZSA9IHsgMSwgeworCQkJVU5JX1JBTkdFKDIuNSksCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgZHQ5ODEyXzEwX2FvdXRfcmFuZ2UgPSB7IDEsIHsKKwkJCUJJUF9SQU5HRSgxMCksCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgZHQ5ODEyXzJwdDVfYW91dF9yYW5nZSA9IHsgMSwgeworCQkJVU5JX1JBTkdFKDIuNSksCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzbG90X2R0OTgxMiBkdDk4MTJbRFQ5ODEyX05VTV9TTE9UU107CisKKy8qIFVzZWZ1bCBzaG9ydGhhbmQgYWNjZXNzIHRvIHByaXZhdGUgZGF0YSAqLworI2RlZmluZSBkZXZwcml2ICgoc3RydWN0IGNvbWVkaV9kdDk4MTIgKilkZXYtPnByaXZhdGUpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9kdDk4MTIgKnRvX2R0OTgxMl9kZXYoc3RydWN0IGtyZWYgKmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdXNiX2R0OTgxMiwga3JlZik7Cit9CisKK3N0YXRpYyB2b2lkIGR0OTgxMl9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHVzYl9kdDk4MTIgKmRldiA9IHRvX2R0OTgxMl9kZXYoa3JlZik7CisKKwl1c2JfcHV0X2RldihkZXYtPnVkZXYpOworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX3JlYWRfaW5mbyhzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2LCBpbnQgb2Zmc2V0LCB2b2lkICpidWYsCisJCQkgICAgc2l6ZV90IGJ1Zl9zaXplKQoreworCXN0cnVjdCBkdDk4MTJfdXNiX2NtZCBjbWQ7CisJaW50IGNvdW50LCByZXR2YWw7CisKKwljbWQuY21kID0gY3B1X3RvX2xlMzIoRFQ5ODEyX1JfRkxBU0hfREFUQSk7CisJY21kLnUuZmxhc2hfZGF0YV9pbmZvLmFkZHJlc3MgPQorCQljcHVfdG9fbGUxNihEVDk4MTJfRElBR1NfQk9BUkRfSU5GT19BRERSICsgb2Zmc2V0KTsKKwljbWQudS5mbGFzaF9kYXRhX2luZm8ubnVtYnl0ZXMgPSBjcHVfdG9fbGUxNihidWZfc2l6ZSk7CisKKwkvKiBEVDk4MTIgb25seSByZXNwb25kcyB0byAzMiBieXRlIHdyaXRlcyEhICovCisJY291bnQgPSAzMjsKKwlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LAorCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwKKwkJCQkJICAgICAgZGV2LT5jb21tYW5kX3dyaXRlLmFkZHIpLAorCQkJICAgICAgJmNtZCwgMzIsICZjb3VudCwgSFogKiAxKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfcmVhZC5hZGRyKSwKKwkJCSAgICAgIGJ1ZiwgYnVmX3NpemUsICZjb3VudCwgSFogKiAxKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9yZWFkX211bHRpcGxlX3JlZ2lzdGVycyhzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2LCBpbnQgcmVnX2NvdW50LAorCQkJCQkgIHU4ICphZGRyZXNzLCB1OCAqdmFsdWUpCit7CisJc3RydWN0IGR0OTgxMl91c2JfY21kIGNtZDsKKwlpbnQgaSwgY291bnQsIHJldHZhbDsKKworCWNtZC5jbWQgPSBjcHVfdG9fbGUzMihEVDk4MTJfUl9NVUxUSV9CWVRFX1JFRyk7CisJY21kLnUucmVhZF9tdWx0aV9pbmZvLmNvdW50ID0gcmVnX2NvdW50OworCWZvciAoaSA9IDA7IGkgPCByZWdfY291bnQ7IGkrKykKKwkJY21kLnUucmVhZF9tdWx0aV9pbmZvLmFkZHJlc3NbaV0gPSBhZGRyZXNzW2ldOworCisJLyogRFQ5ODEyIG9ubHkgcmVzcG9uZHMgdG8gMzIgYnl0ZSB3cml0ZXMhISAqLworCWNvdW50ID0gMzI7CisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKKwkJCSAgICAgIHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCSAgICAgIGRldi0+Y29tbWFuZF93cml0ZS5hZGRyKSwKKwkJCSAgICAgICZjbWQsIDMyLCAmY291bnQsIEhaICogMSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LAorCQkJICAgICAgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwKKwkJCQkJICAgICAgZGV2LT5jb21tYW5kX3JlYWQuYWRkciksCisJCQkgICAgICB2YWx1ZSwgcmVnX2NvdW50LCAmY291bnQsIEhaICogMSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkdDk4MTJfd3JpdGVfbXVsdGlwbGVfcmVnaXN0ZXJzKHN0cnVjdCB1c2JfZHQ5ODEyICpkZXYsCisJCQkJCSAgIGludCByZWdfY291bnQsIHU4ICphZGRyZXNzLAorCQkJCQkgICB1OCAqdmFsdWUpCit7CisJc3RydWN0IGR0OTgxMl91c2JfY21kIGNtZDsKKwlpbnQgaSwgY291bnQsIHJldHZhbDsKKworCWNtZC5jbWQgPSBjcHVfdG9fbGUzMihEVDk4MTJfV19NVUxUSV9CWVRFX1JFRyk7CisJY21kLnUucmVhZF9tdWx0aV9pbmZvLmNvdW50ID0gcmVnX2NvdW50OworCWZvciAoaSA9IDA7IGkgPCByZWdfY291bnQ7IGkrKykgeworCQljbWQudS53cml0ZV9tdWx0aV9pbmZvLndyaXRlW2ldLmFkZHJlc3MgPSBhZGRyZXNzW2ldOworCQljbWQudS53cml0ZV9tdWx0aV9pbmZvLndyaXRlW2ldLnZhbHVlID0gdmFsdWVbaV07CisJfQorCS8qIERUOTgxMiBvbmx5IHJlc3BvbmRzIHRvIDMyIGJ5dGUgd3JpdGVzISEgKi8KKwlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LAorCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwKKwkJCQkJICAgICAgZGV2LT5jb21tYW5kX3dyaXRlLmFkZHIpLAorCQkJICAgICAgJmNtZCwgMzIsICZjb3VudCwgSFogKiAxKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9ybXdfbXVsdGlwbGVfcmVnaXN0ZXJzKHN0cnVjdCB1c2JfZHQ5ODEyICpkZXYsIGludCByZWdfY291bnQsCisJCQkJCSBzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlICpybXcpCit7CisJc3RydWN0IGR0OTgxMl91c2JfY21kIGNtZDsKKwlpbnQgaSwgY291bnQsIHJldHZhbDsKKworCWNtZC5jbWQgPSBjcHVfdG9fbGUzMihEVDk4MTJfUk1XX01VTFRJX0JZVEVfUkVHKTsKKwljbWQudS5ybXdfbXVsdGlfaW5mby5jb3VudCA9IHJlZ19jb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgcmVnX2NvdW50OyBpKyspCisJCWNtZC51LnJtd19tdWx0aV9pbmZvLnJtd1tpXSA9IHJtd1tpXTsKKworCS8qIERUOTgxMiBvbmx5IHJlc3BvbmRzIHRvIDMyIGJ5dGUgd3JpdGVzISEgKi8KKwlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LAorCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwKKwkJCQkJICAgICAgZGV2LT5jb21tYW5kX3dyaXRlLmFkZHIpLAorCQkJICAgICAgJmNtZCwgMzIsICZjb3VudCwgSFogKiAxKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kaWdpdGFsX2luKHN0cnVjdCBzbG90X2R0OTgxMiAqc2xvdCwgdTggKmJpdHMpCit7CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisKKwlkb3duKCZzbG90LT5tdXRleCk7CisJaWYgKHNsb3QtPnVzYikgeworCQl1OCByZWdbMl0gPSB7IEYwMjBfU0ZSX1AzLCBGMDIwX1NGUl9QMSB9OworCQl1OCB2YWx1ZVsyXTsKKworCQlyZXN1bHQgPSBkdDk4MTJfcmVhZF9tdWx0aXBsZV9yZWdpc3RlcnMoc2xvdC0+dXNiLCAyLCByZWcsCisJCQkJCQkJdmFsdWUpOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCS8qCisJCQkgKiBiaXRzIDAtNiBpbiBGMDIwX1NGUl9QMyBhcmUgYml0cyAwLTYgaW4gdGhlIGRpZ2l0YWwKKwkJCSAqIGlucHV0IHBvcnQgYml0IDMgaW4gRjAyMF9TRlJfUDEgaXMgYml0IDcgaW4gdGhlCisJCQkgKiBkaWdpdGFsIGlucHV0IHBvcnQKKwkJCSAqLworCQkJKmJpdHMgPSAodmFsdWVbMF0gJiAweDdmKSB8ICgodmFsdWVbMV0gJiAweDA4KSA8PCA0KTsKKwkJCS8qIHByaW50aygiJTIuMngsICUyLjJ4IC0+ICUyLjJ4XG4iLAorCQkJCSAgdmFsdWVbMF0sIHZhbHVlWzFdLCAqYml0cyk7ICovCisJCX0KKwl9CisJdXAoJnNsb3QtPm11dGV4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2RpZ2l0YWxfb3V0KHN0cnVjdCBzbG90X2R0OTgxMiAqc2xvdCwgdTggYml0cykKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvd24oJnNsb3QtPm11dGV4KTsKKwlpZiAoc2xvdC0+dXNiKSB7CisJCXU4IHJlZ1sxXTsKKwkJdTggdmFsdWVbMV07CisKKwkJcmVnWzBdID0gRjAyMF9TRlJfUDI7CisJCXZhbHVlWzBdID0gYml0czsKKwkJcmVzdWx0ID0gZHQ5ODEyX3dyaXRlX211bHRpcGxlX3JlZ2lzdGVycyhzbG90LT51c2IsIDEsIHJlZywKKwkJCQkJCQkgdmFsdWUpOworCQlzbG90LT51c2ItPmRpZ2l0YWxfb3V0X3NoYWRvdyA9IGJpdHM7CisJfQorCXVwKCZzbG90LT5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdDk4MTJfZGlnaXRhbF9vdXRfc2hhZG93KHN0cnVjdCBzbG90X2R0OTgxMiAqc2xvdCwgdTggKmJpdHMpCit7CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisKKwlkb3duKCZzbG90LT5tdXRleCk7CisJaWYgKHNsb3QtPnVzYikgeworCQkqYml0cyA9IHNsb3QtPnVzYi0+ZGlnaXRhbF9vdXRfc2hhZG93OworCQlyZXN1bHQgPSAwOworCX0KKwl1cCgmc2xvdC0+bXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGR0OTgxMl9jb25maWd1cmVfbXV4KHN0cnVjdCB1c2JfZHQ5ODEyICpkZXYsCisJCQkJIHN0cnVjdCBkdDk4MTJfcm13X2J5dGUgKnJtdywgaW50IGNoYW5uZWwpCit7CisJaWYgKGRldi0+ZGV2aWNlID09IERUOTgxMl9ERVZJRF9EVDk4MTJfMTApIHsKKwkJLyogSW4gdGhlIERUOTgxMi8xMFYgTVVYIGlzIHNlbGVjdGVkIGJ5IFAxLjUtNyAqLworCQlybXctPmFkZHJlc3MgPSBGMDIwX1NGUl9QMTsKKwkJcm13LT5hbmRfbWFzayA9IDB4ZTA7CisJCXJtdy0+b3JfdmFsdWUgPSBjaGFubmVsIDw8IDU7CisJfSBlbHNlIHsKKwkJLyogSW4gdGhlIERUOTgxMi8yLjVWLCBpbnRlcm5hbCBtdXggaXMgc2VsZWN0ZWQgYnkgYml0cyAwOjIgKi8KKwkJcm13LT5hZGRyZXNzID0gRjAyMF9TRlJfQU1YMFNMOworCQlybXctPmFuZF9tYXNrID0gMHhmZjsKKwkJcm13LT5vcl92YWx1ZSA9IGNoYW5uZWwgJiAweDA3OworCX0KK30KKworc3RhdGljIHZvaWQgZHQ5ODEyX2NvbmZpZ3VyZV9nYWluKHN0cnVjdCB1c2JfZHQ5ODEyICpkZXYsCisJCQkJICBzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlICpybXcsCisJCQkJICBlbnVtIGR0OTgxMl9nYWluIGdhaW4pCit7CisJaWYgKGRldi0+ZGV2aWNlID09IERUOTgxMl9ERVZJRF9EVDk4MTJfMTApIHsKKwkJLyogSW4gdGhlIERUOTgxMi8xMFYsIHRoZXJlIGlzIGFuIGV4dGVybmFsIGdhaW4gb2YgMC41ICovCisJCWdhaW4gPDw9IDE7CisJfQorCisJcm13LT5hZGRyZXNzID0gRjAyMF9TRlJfQURDMENGOworCXJtdy0+YW5kX21hc2sgPSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjIgfAorCQkJRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04xIHwKKwkJCUYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMDsKKwlzd2l0Y2ggKGdhaW4pIHsKKwkJLyoKKwkJICogMDAwIC0+IEdhaW4gPSAgMQorCQkgKiAwMDEgLT4gR2FpbiA9ICAyCisJCSAqIDAxMCAtPiBHYWluID0gIDQKKwkJICogMDExIC0+IEdhaW4gPSAgOAorCQkgKiAxMHggLT4gR2FpbiA9IDE2CisJCSAqIDExeCAtPiBHYWluID0gIDAuNQorCQkgKi8KKwljYXNlIERUOTgxMl9HQUlOXzBQVDU6CisJCXJtdy0+b3JfdmFsdWUgPSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjIgfHwKKwkJCQlGMDIwX01BU0tfQURDMENGX0FNUDBHTjE7CisJCWJyZWFrOworCWNhc2UgRFQ5ODEyX0dBSU5fMToKKwkJcm13LT5vcl92YWx1ZSA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgRFQ5ODEyX0dBSU5fMjoKKwkJcm13LT5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMDsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfR0FJTl80OgorCQlybXctPm9yX3ZhbHVlID0gRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04xOworCQlicmVhazsKKwljYXNlIERUOTgxMl9HQUlOXzg6CisJCXJtdy0+b3JfdmFsdWUgPSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjEgfHwKKwkJCQlGMDIwX01BU0tfQURDMENGX0FNUDBHTjA7CisJCWJyZWFrOworCWNhc2UgRFQ5ODEyX0dBSU5fMTY6CisJCXJtdy0+b3JfdmFsdWUgPSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiSWxsZWdhbCBnYWluICVkXG4iLCBnYWluKTsKKworCX0KK30KKworc3RhdGljIGludCBkdDk4MTJfYW5hbG9nX2luKHN0cnVjdCBzbG90X2R0OTgxMiAqc2xvdCwgaW50IGNoYW5uZWwsIHUxNiAqdmFsdWUsCisJCQkgICAgZW51bSBkdDk4MTJfZ2FpbiBnYWluKQoreworCXN0cnVjdCBkdDk4MTJfcm13X2J5dGUgcm13WzNdOworCXU4IHJlZ1szXSA9IHsKKwkJRjAyMF9TRlJfQURDMENOLAorCQlGMDIwX1NGUl9BREMwSCwKKwkJRjAyMF9TRlJfQURDMEwKKwl9OworCXU4IHZhbFszXTsKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvd24oJnNsb3QtPm11dGV4KTsKKwlpZiAoIXNsb3QtPnVzYikKKwkJZ290byBleGl0OworCisJLyogMSBzZWxlY3QgdGhlIGdhaW4gKi8KKwlkdDk4MTJfY29uZmlndXJlX2dhaW4oc2xvdC0+dXNiLCAmcm13WzBdLCBnYWluKTsKKworCS8qIDIgc2V0IHRoZSBNVVggdG8gc2VsZWN0IHRoZSBjaGFubmVsICovCisJZHQ5ODEyX2NvbmZpZ3VyZV9tdXgoc2xvdC0+dXNiLCAmcm13WzFdLCBjaGFubmVsKTsKKworCS8qIDMgc3RhcnQgY29udmVyc2lvbiAqLworCXJtd1syXS5hZGRyZXNzID0gRjAyMF9TRlJfQURDMENOOworCXJtd1syXS5hbmRfbWFzayA9IDB4ZmY7CisJcm13WzJdLm9yX3ZhbHVlID0gRjAyMF9NQVNLX0FEQzBDTl9BRDBFTiB8IEYwMjBfTUFTS19BREMwQ05fQUQwQlVTWTsKKworCXJlc3VsdCA9IGR0OTgxMl9ybXdfbXVsdGlwbGVfcmVnaXN0ZXJzKHNsb3QtPnVzYiwgMywgcm13KTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGV4aXQ7CisKKwkvKiByZWFkIHRoZSBzdGF0dXMgYW5kIEFEQyAqLworCXJlc3VsdCA9IGR0OTgxMl9yZWFkX211bHRpcGxlX3JlZ2lzdGVycyhzbG90LT51c2IsIDMsIHJlZywgdmFsKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGV4aXQ7CisJLyoKKwkgKiBBbiBBREMgY29udmVyc2lvbiB0YWtlcyAxNiBTQVIgY2xvY2tzIGN5Y2xlcywgaS5lLiBhYm91dCA5dXMuCisJICogVGhlcmVmb3JlLCBiZXR3ZWVuIHRoZSBpbnN0YW50IHRoYXQgQUQwQlVTWSB3YXMgc2V0IHZpYQorCSAqIGR0OTgxMl9ybXdfbXVsdGlwbGVfcmVnaXN0ZXJzIGFuZCB0aGUgcmVhZCBvZiBBRDBCVVNZIHZpYQorCSAqIGR0OTgxMl9yZWFkX211bHRpcGxlX3JlZ2lzdGVycywgdGhlIGNvbnZlcnNpb24gc2hvdWxkIGJlIGNvbXBsZXRlCisJICogc2luY2UgdGhlc2UgdHdvIG9wZXJhdGlvbnMgcmVxdWlyZSB0d28gVVNCIHRyYW5zYWN0aW9ucyBlYWNoIHRha2luZworCSAqIGF0IGxlYXN0IGEgbWlsbGlzZWNvbmQgdG8gY29tcGxldGUuICBIb3dldmVyLCBsZXRzIG1ha2Ugc3VyZSB0aGF0CisJICogY29udmVyc2lvbiBpcyBmaW5pc2hlZC4KKwkgKi8KKwlpZiAoKHZhbFswXSAmIChGMDIwX01BU0tfQURDMENOX0FEMElOVCB8IEYwMjBfTUFTS19BREMwQ05fQUQwQlVTWSkpID09CisJICAgIEYwMjBfTUFTS19BREMwQ05fQUQwSU5UKSB7CisJCXN3aXRjaCAoc2xvdC0+dXNiLT5kZXZpY2UpIHsKKwkJY2FzZSBEVDk4MTJfREVWSURfRFQ5ODEyXzEwOgorCQkJLyoKKwkJCSAqIEZvciBEVDk4MTItMTBWIHRoZSBwZXJzb25hbGl0eSBtb2R1bGUgc2V0IHRoZQorCQkJICogZW5jb2RpbmcgdG8gMidzIGNvbXBsZW1lbnQuIEhlbmNlLCBjb252ZXJ0IGl0IGJlZm9yZQorCQkJICogcmV0dXJuaW5nIGl0CisJCQkgKi8KKwkJCSp2YWx1ZSA9ICgodmFsWzFdIDw8IDgpIHwgdmFsWzJdKSArIDB4ODAwOworCQkJYnJlYWs7CisJCWNhc2UgRFQ5ODEyX0RFVklEX0RUOTgxMl8yUFQ1OgorCQkJKnZhbHVlID0gKHZhbFsxXSA8PCA4KSB8IHZhbFsyXTsKKwkJCWJyZWFrOworCQl9CisJfQorCitleGl0OgorCXVwKCZzbG90LT5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdDk4MTJfYW5hbG9nX291dF9zaGFkb3coc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCBpbnQgY2hhbm5lbCwKKwkJCQkgICAgdTE2ICp2YWx1ZSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvd24oJnNsb3QtPm11dGV4KTsKKwlpZiAoc2xvdC0+dXNiKSB7CisJCSp2YWx1ZSA9IHNsb3QtPnVzYi0+YW5hbG9nX291dF9zaGFkb3dbY2hhbm5lbF07CisJCXJlc3VsdCA9IDA7CisJfQorCXVwKCZzbG90LT5tdXRleCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR0OTgxMl9hbmFsb2dfb3V0KHN0cnVjdCBzbG90X2R0OTgxMiAqc2xvdCwgaW50IGNoYW5uZWwsIHUxNiB2YWx1ZSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvd24oJnNsb3QtPm11dGV4KTsKKwlpZiAoc2xvdC0+dXNiKSB7CisJCXN0cnVjdCBkdDk4MTJfcm13X2J5dGUgcm13WzNdOworCisJCXN3aXRjaCAoY2hhbm5lbCkgeworCQljYXNlIDA6CisJCQkvKiAxLiBTZXQgREFDIG1vZGUgKi8KKwkJCXJtd1swXS5hZGRyZXNzID0gRjAyMF9TRlJfREFDMENOOworCQkJcm13WzBdLmFuZF9tYXNrID0gMHhmZjsKKwkJCXJtd1swXS5vcl92YWx1ZSA9IEYwMjBfTUFTS19EQUN4Q05fREFDeEVOOworCisJCQkvKiAyIGxvYWQgbG93IGJ5dGUgb2YgREFDIHZhbHVlIGZpcnN0ICovCisJCQlybXdbMV0uYWRkcmVzcyA9IEYwMjBfU0ZSX0RBQzBMOworCQkJcm13WzFdLmFuZF9tYXNrID0gMHhmZjsKKwkJCXJtd1sxXS5vcl92YWx1ZSA9IHZhbHVlICYgMHhmZjsKKworCQkJLyogMyBsb2FkIGhpZ2ggYnl0ZSBvZiBEQUMgdmFsdWUgbmV4dCB0byBsYXRjaCB0aGUKKwkJCSAgIDEyLWJpdCB2YWx1ZSAqLworCQkJcm13WzJdLmFkZHJlc3MgPSBGMDIwX1NGUl9EQUMwSDsKKwkJCXJtd1syXS5hbmRfbWFzayA9IDB4ZmY7CisJCQlybXdbMl0ub3JfdmFsdWUgPSAodmFsdWUgPj4gOCkgJiAweGY7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQkvKiAxLiBTZXQgREFDIG1vZGUgKi8KKwkJCXJtd1swXS5hZGRyZXNzID0gRjAyMF9TRlJfREFDMUNOOworCQkJcm13WzBdLmFuZF9tYXNrID0gMHhmZjsKKwkJCXJtd1swXS5vcl92YWx1ZSA9IEYwMjBfTUFTS19EQUN4Q05fREFDeEVOOworCisJCQkvKiAyIGxvYWQgbG93IGJ5dGUgb2YgREFDIHZhbHVlIGZpcnN0ICovCisJCQlybXdbMV0uYWRkcmVzcyA9IEYwMjBfU0ZSX0RBQzFMOworCQkJcm13WzFdLmFuZF9tYXNrID0gMHhmZjsKKwkJCXJtd1sxXS5vcl92YWx1ZSA9IHZhbHVlICYgMHhmZjsKKworCQkJLyogMyBsb2FkIGhpZ2ggYnl0ZSBvZiBEQUMgdmFsdWUgbmV4dCB0byBsYXRjaCB0aGUKKwkJCSAgIDEyLWJpdCB2YWx1ZSAqLworCQkJcm13WzJdLmFkZHJlc3MgPSBGMDIwX1NGUl9EQUMxSDsKKwkJCXJtd1syXS5hbmRfbWFzayA9IDB4ZmY7CisJCQlybXdbMl0ub3JfdmFsdWUgPSAodmFsdWUgPj4gOCkgJiAweGY7CisJCQlicmVhazsKKwkJfQorCQlyZXN1bHQgPSBkdDk4MTJfcm13X211bHRpcGxlX3JlZ2lzdGVycyhzbG90LT51c2IsIDMsIHJtdyk7CisJCXNsb3QtPnVzYi0+YW5hbG9nX291dF9zaGFkb3dbY2hhbm5lbF0gPSB2YWx1ZTsKKwl9CisJdXAoJnNsb3QtPm11dGV4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBVU0IgZnJhbWV3b3JrIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgZHQ5ODEyX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJc3RydWN0IHVzYl9kdDk4MTIgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCBpOworCXU4IGZ3OworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlrcmVmX2luaXQoJmRldi0+a3JlZik7CisKKwlkZXYtPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCWRldi0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCisJLyogQ2hlY2sgZW5kcG9pbnRzICovCisJaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisKKwlpZiAoaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDUpIHsKKwkJZXJyKCJXcm9uZyBudW1iZXIgb2YgZW5kcGludHMuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWludCBkaXJlY3Rpb24gPSAtMTsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWRpcmVjdGlvbiA9IFVTQl9ESVJfSU47CisJCQlkZXYtPm1lc3NhZ2VfcGlwZS5hZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlkZXYtPm1lc3NhZ2VfcGlwZS5zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWRpcmVjdGlvbiA9IFVTQl9ESVJfT1VUOworCQkJZGV2LT5jb21tYW5kX3dyaXRlLmFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCWRldi0+Y29tbWFuZF93cml0ZS5zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkaXJlY3Rpb24gPSBVU0JfRElSX0lOOworCQkJZGV2LT5jb21tYW5kX3JlYWQuYWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJZGV2LT5jb21tYW5kX3JlYWQuc2l6ZSA9CisJCQkJCWxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJZGlyZWN0aW9uID0gVVNCX0RJUl9PVVQ7CisJCQlkZXYtPndyaXRlX3N0cmVhbS5hZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlkZXYtPndyaXRlX3N0cmVhbS5zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlkaXJlY3Rpb24gPSBVU0JfRElSX0lOOworCQkJZGV2LT5yZWFkX3N0cmVhbS5hZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlkZXYtPnJlYWRfc3RyZWFtLnNpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pICE9IGRpcmVjdGlvbikgeworCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkJIkVuZHBvaW50IGhhcyB3cm9uZyBkaXJlY3Rpb24uXG4iKTsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCWlmIChkdDk4MTJfcmVhZF9pbmZvKGRldiwgMCwgJmZ3LCBzaXplb2YoZncpKSAhPSAwKSB7CisJCS8qCisJCSAqIFNlZW1zIGxpa2UgYSBjb25maWd1cmF0aW9uIHJlc2V0IGlzIG5lY2Vzc2FyeSBpZiBkcml2ZXIgaXMKKwkJICogcmVsb2FkZWQgd2hpbGUgZGV2aWNlIGlzIGF0dGFjaGVkCisJCSAqLworCQl1c2JfcmVzZXRfY29uZmlndXJhdGlvbihkZXYtPnVkZXYpOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJcmV0dmFsID0gZHQ5ODEyX3JlYWRfaW5mbyhkZXYsIDEsICZmdywgc2l6ZW9mKGZ3KSk7CisJCQlpZiAocmV0dmFsID09IDApIHsKKwkJCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsCisJCQkJCSAidXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24gc3VjY2VkZWQgIgorCQkJCQkgImFmdGVyICVkIGl0ZXJhdGlvbnNcbiIsIGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGR0OTgxMl9yZWFkX2luZm8oZGV2LCAxLCAmZGV2LT52ZW5kb3IsIHNpemVvZihkZXYtPnZlbmRvcikpICE9IDApIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVhZCB2ZW5kb3IuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkdDk4MTJfcmVhZF9pbmZvKGRldiwgMywgJmRldi0+cHJvZHVjdCwKKwkJCSAgICAgc2l6ZW9mKGRldi0+cHJvZHVjdCkpICE9IDApIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVhZCBwcm9kdWN0LiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoZHQ5ODEyX3JlYWRfaW5mbyhkZXYsIDUsICZkZXYtPmRldmljZSwgc2l6ZW9mKGRldi0+ZGV2aWNlKSkgIT0gMCkgeworCQllcnIoIkZhaWxlZCB0byByZWFkIGRldmljZS4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGR0OTgxMl9yZWFkX2luZm8oZGV2LCA3LCAmZGV2LT5zZXJpYWwsIHNpemVvZihkZXYtPnNlcmlhbCkpICE9IDApIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVhZCBzZXJpYWwuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPnZlbmRvcik7CisJZGV2LT5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT5wcm9kdWN0KTsKKwlkZXYtPmRldmljZSA9IGxlMTZfdG9fY3B1KGRldi0+ZGV2aWNlKTsKKwlkZXYtPnNlcmlhbCA9IGxlMzJfdG9fY3B1KGRldi0+c2VyaWFsKTsKKwlzd2l0Y2ggKGRldi0+ZGV2aWNlKSB7CisJY2FzZSBEVDk4MTJfREVWSURfRFQ5ODEyXzEwOgorCQlkZXYtPmFuYWxvZ19vdXRfc2hhZG93WzBdID0gMHgwODAwOworCQlkZXYtPmFuYWxvZ19vdXRfc2hhZG93WzFdID0gMHg4MDA7CisJCWJyZWFrOworCWNhc2UgRFQ5ODEyX0RFVklEX0RUOTgxMl8yUFQ1OgorCQlkZXYtPmFuYWxvZ19vdXRfc2hhZG93WzBdID0gMHgwMDAwOworCQlkZXYtPmFuYWxvZ19vdXRfc2hhZG93WzFdID0gMHgwMDAwOworCQlicmVhazsKKwl9CisJZGV2LT5kaWdpdGFsX291dF9zaGFkb3cgPSAwOworCisJLyogc2F2ZSBvdXIgZGF0YSBwb2ludGVyIGluIHRoaXMgaW50ZXJmYWNlIGRldmljZSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOworCisJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIlVTQiBEVDk4MTIgKCU0LjR4LiU0LjR4LiU0LjR4KSAjMHglOC44eFxuIiwKKwkJIGRldi0+dmVuZG9yLCBkZXYtPnByb2R1Y3QsIGRldi0+ZGV2aWNlLCBkZXYtPnNlcmlhbCk7CisKKwlkb3duKCZkdDk4MTJfbXV0ZXgpOworCXsKKwkJLyogRmluZCBhIHNsb3QgZm9yIHRoZSBVU0IgZGV2aWNlICovCisJCXN0cnVjdCBzbG90X2R0OTgxMiAqZmlyc3QgPSBOVUxMOworCQlzdHJ1Y3Qgc2xvdF9kdDk4MTIgKmJlc3QgPSBOVUxMOworCisJCWZvciAoaSA9IDA7IGkgPCBEVDk4MTJfTlVNX1NMT1RTOyBpKyspIHsKKwkJCWlmICghZmlyc3QgJiYgIWR0OTgxMltpXS51c2IgJiYgZHQ5ODEyW2ldLnNlcmlhbCA9PSAwKQorCQkJCWZpcnN0ID0gJmR0OTgxMltpXTsKKwkJCWlmICghYmVzdCAmJiBkdDk4MTJbaV0uc2VyaWFsID09IGRldi0+c2VyaWFsKQorCQkJCWJlc3QgPSAmZHQ5ODEyW2ldOworCQl9CisKKwkJaWYgKCFiZXN0KQorCQkJYmVzdCA9IGZpcnN0OworCisJCWlmIChiZXN0KSB7CisJCQlkb3duKCZiZXN0LT5tdXRleCk7CisJCQliZXN0LT51c2IgPSBkZXY7CisJCQlkZXYtPnNsb3QgPSBiZXN0OworCQkJdXAoJmJlc3QtPm11dGV4KTsKKwkJfQorCX0KKwl1cCgmZHQ5ODEyX211dGV4KTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoZGV2KQorCQlrcmVmX3B1dCgmZGV2LT5rcmVmLCBkdDk4MTJfZGVsZXRlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBkdDk4MTJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCB1c2JfZHQ5ODEyICpkZXY7CisJaW50IG1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKKworCWRvd24oJmR0OTgxMl9tdXRleCk7CisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWlmIChkZXYtPnNsb3QpIHsKKwkJZG93bigmZGV2LT5zbG90LT5tdXRleCk7CisJCWRldi0+c2xvdC0+dXNiID0gTlVMTDsKKwkJdXAoJmRldi0+c2xvdC0+bXV0ZXgpOworCQlkZXYtPnNsb3QgPSBOVUxMOworCX0KKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJdXAoJmR0OTgxMl9tdXRleCk7CisKKwkvKiBxdWV1ZSBmaW5hbCBkZXN0cnVjdGlvbiAqLworCWtyZWZfcHV0KCZkZXYtPmtyZWYsIGR0OTgxMl9kZWxldGUpOworCisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiVVNCIER0OTgxMiAjJWQgbm93IGRpc2Nvbm5lY3RlZFxuIiwgbWlub3IpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZHQ5ODEyX3VzYl9kcml2ZXIgPSB7CisJLm5hbWUgPSAiZHQ5ODEyIiwKKwkucHJvYmUgPSBkdDk4MTJfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkdDk4MTJfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBkdDk4MTJfdGFibGUsCit9OworCisvKgorICogQ29tZWRpIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIGR0OTgxMl9jb21lZGlfb3Blbihjb21lZGlfZGV2aWNlICpkZXYpCit7CisJZG93bigmZGV2cHJpdi0+c2xvdC0+bXV0ZXgpOworCWlmIChkZXZwcml2LT5zbG90LT51c2IpIHsKKwkJLyogV2UgaGF2ZSBhbiBhdHRhY2hlZCBkZXZpY2UsIGZpbGwgaW4gY3VycmVudCByYW5nZSBpbmZvICovCisJCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07CisJCXMtPm5fY2hhbiA9IDg7CisJCXMtPm1heGRhdGEgPSAxOworCisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzFdOworCQlzLT5uX2NoYW4gPSA4OworCQlzLT5tYXhkYXRhID0gMTsKKworCQlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKKwkJcy0+bl9jaGFuID0gODsKKwkJc3dpdGNoIChkZXZwcml2LT5zbG90LT51c2ItPmRldmljZSkgeworCQljYXNlIDA6eworCQkJCXMtPm1heGRhdGEgPSA0MDk1OworCQkJCXMtPnJhbmdlX3RhYmxlID0gJmR0OTgxMl8xMF9haW5fcmFuZ2U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOnsKKwkJCQlzLT5tYXhkYXRhID0gNDA5NTsKKwkJCQlzLT5yYW5nZV90YWJsZSA9ICZkdDk4MTJfMnB0NV9haW5fcmFuZ2U7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOworCQlzLT5uX2NoYW4gPSAyOworCQlzd2l0Y2ggKGRldnByaXYtPnNsb3QtPnVzYi0+ZGV2aWNlKSB7CisJCWNhc2UgMDp7CisJCQkJcy0+bWF4ZGF0YSA9IDQwOTU7CisJCQkJcy0+cmFuZ2VfdGFibGUgPSAmZHQ5ODEyXzEwX2FvdXRfcmFuZ2U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOnsKKwkJCQlzLT5tYXhkYXRhID0gNDA5NTsKKwkJCQlzLT5yYW5nZV90YWJsZSA9ICZkdDk4MTJfMnB0NV9hb3V0X3JhbmdlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJdXAoJmRldnByaXYtPnNsb3QtPm11dGV4KTsKK30KKworc3RhdGljIGludCBkdDk4MTJfZGlfcmluc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBuOworCXU4IGJpdHMgPSAwOworCisJZHQ5ODEyX2RpZ2l0YWxfaW4oZGV2cHJpdi0+c2xvdCwgJmJpdHMpOworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCisJCWRhdGFbbl0gPSAoKDEgPDwgaW5zbi0+Y2hhbnNwZWMpICYgYml0cykgIT0gMDsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBkdDk4MTJfZG9fd2luc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBuOworCXU4IGJpdHMgPSAwOworCisJZHQ5ODEyX2RpZ2l0YWxfb3V0X3NoYWRvdyhkZXZwcml2LT5zbG90LCAmYml0cyk7CisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCQl1OCBtYXNrID0gMSA8PCBpbnNuLT5jaGFuc3BlYzsKKworCQliaXRzICY9IH5tYXNrOworCQlpZiAoZGF0YVtuXSkKKwkJCWJpdHMgfD0gbWFzazsKKwl9CisJZHQ5ODEyX2RpZ2l0YWxfb3V0KGRldnByaXYtPnNsb3QsIGJpdHMpOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9haV9yaW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJCXUxNiB2YWx1ZSA9IDA7CisKKwkJZHQ5ODEyX2FuYWxvZ19pbihkZXZwcml2LT5zbG90LCBpbnNuLT5jaGFuc3BlYywgJnZhbHVlLAorCQkJCSBEVDk4MTJfR0FJTl8xKTsKKwkJZGF0YVtuXSA9IHZhbHVlOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBkdDk4MTJfYW9fcmluc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBuOworCXUxNiB2YWx1ZTsKKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwkJdmFsdWUgPSAwOworCQlkdDk4MTJfYW5hbG9nX291dF9zaGFkb3coZGV2cHJpdi0+c2xvdCwgaW5zbi0+Y2hhbnNwZWMsICZ2YWx1ZSk7CisJCWRhdGFbbl0gPSB2YWx1ZTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2FvX3dpbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgbjsKKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCisJCWR0OTgxMl9hbmFsb2dfb3V0KGRldnByaXYtPnNsb3QsIGluc24tPmNoYW5zcGVjLCBkYXRhW25dKTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBkdDk4MTJfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJaW50IGk7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWRldi0+Ym9hcmRfbmFtZSA9ICJkdDk4MTIiOworCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGNvbWVkaV9kdDk4MTIpKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBTcGVjaWFsIG9wZW4gcm91dGluZSwgc2luY2UgVVNCIHVuaXQgbWF5IGJlIHVuYXR0YWNoZWQgYXQKKwkgKiBjb21lZGlfY29uZmlnIHRpbWUsIGhlbmNlIHJhbmdlIGNhbiBub3QgYmUgZGV0ZXJtaW5lZAorCSAqLworCWRldi0+b3BlbiA9IGR0OTgxMl9jb21lZGlfb3BlbjsKKworCWRldnByaXYtPnNlcmlhbCA9IGl0LT5vcHRpb25zWzBdOworCisJLyogQWxsb2NhdGUgc3ViZGV2aWNlcyAqLworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgNCkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSAwOworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9yZWFkID0gJmR0OTgxMl9kaV9yaW5zbjsKKworCS8qIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAxOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFOworCXMtPm5fY2hhbiA9IDA7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX3dyaXRlID0gJmR0OTgxMl9kb193aW5zbjsKKworCS8qIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORDsKKwlzLT5uX2NoYW4gPSAwOworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gTlVMTDsKKwlzLT5pbnNuX3JlYWQgPSAmZHQ5ODEyX2FpX3JpbnNuOworCisJLyogYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMzsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRFQUJMRTsKKwlzLT5uX2NoYW4gPSAwOworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gTlVMTDsKKwlzLT5pbnNuX3dyaXRlID0gJmR0OTgxMl9hb193aW5zbjsKKwlzLT5pbnNuX3JlYWQgPSAmZHQ5ODEyX2FvX3JpbnNuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHN1Y2Nlc3NmdWxseSBhdHRhY2hlZCB0byBkdDk4MTIuXG4iLAorCSAgICAgICBkZXYtPm1pbm9yKTsKKworCWRvd24oJmR0OTgxMl9tdXRleCk7CisJLyogRmluZCBhIHNsb3QgZm9yIHRoZSBjb21lZGkgZGV2aWNlICovCisJeworCQlzdHJ1Y3Qgc2xvdF9kdDk4MTIgKmZpcnN0ID0gTlVMTDsKKwkJc3RydWN0IHNsb3RfZHQ5ODEyICpiZXN0ID0gTlVMTDsKKwkJZm9yIChpID0gMDsgaSA8IERUOTgxMl9OVU1fU0xPVFM7IGkrKykgeworCQkJaWYgKCFmaXJzdCAmJiAhZHQ5ODEyW2ldLmNvbWVkaSkgeworCQkJCS8qIEZpcnN0IGZyZWUgc2xvdCBmcm9tIGNvbWVkaSBzaWRlICovCisJCQkJZmlyc3QgPSAmZHQ5ODEyW2ldOworCQkJfQorCQkJaWYgKCFiZXN0ICYmCisJCQkgICAgZHQ5ODEyW2ldLnVzYiAmJgorCQkJICAgIGR0OTgxMltpXS51c2ItPnNlcmlhbCA9PSBkZXZwcml2LT5zZXJpYWwpIHsKKwkJCQkvKiBXZSBoYXZlIGFuIGF0dGFjZWQgZGV2aWNlIHdpdGggbWF0Y2hpbmcgSUQgKi8KKwkJCQliZXN0ID0gJmR0OTgxMltpXTsKKwkJCX0KKwkJfQorCQlpZiAoIWJlc3QpCisJCQliZXN0ID0gZmlyc3Q7CisJCWlmIChiZXN0KSB7CisJCQlkb3duKCZiZXN0LT5tdXRleCk7CisJCQliZXN0LT5jb21lZGkgPSBkZXZwcml2OworCQkJYmVzdC0+c2VyaWFsID0gZGV2cHJpdi0+c2VyaWFsOworCQkJZGV2cHJpdi0+c2xvdCA9IGJlc3Q7CisJCQl1cCgmYmVzdC0+bXV0ZXgpOworCQl9CisJfQorCXVwKCZkdDk4MTJfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGR0OTgxMl9jb21lZGlfZHJpdmVyID0geworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUgPSAiZHQ5ODEyIiwKKwkuYXR0YWNoID0gZHQ5ODEyX2F0dGFjaCwKKwkuZGV0YWNoID0gZHQ5ODEyX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVzYl9kdDk4MTJfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQsIGk7CisKKwkvKiBJbml0aWFsaXplIGFsbCBkcml2ZXIgc2xvdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRFQ5ODEyX05VTV9TTE9UUzsgaSsrKSB7CisJCWluaXRfTVVURVgoJmR0OTgxMltpXS5tdXRleCk7CisJCWR0OTgxMltpXS5zZXJpYWwgPSAwOworCQlkdDk4MTJbaV0udXNiID0gTlVMTDsKKwkJZHQ5ODEyW2ldLmNvbWVkaSA9IE5VTEw7CisJfQorCWR0OTgxMlsxMl0uc2VyaWFsID0gMHgwOworCisJLyogcmVnaXN0ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmZHQ5ODEyX3VzYl9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FCisJCSAgICAgICAiOiB1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWRcbiIsIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qIHJlZ2lzdGVyIHdpdGggY29tZWRpICovCisJcmVzdWx0ID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHQ5ODEyX2NvbWVkaV9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJdXNiX2RlcmVnaXN0ZXIoJmR0OTgxMl91c2JfZHJpdmVyKTsKKwkJZXJyKCJjb21lZGlfZHJpdmVyX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmVzdWx0KTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX2R0OTgxMl9leGl0KHZvaWQpCit7CisJLyogdW5yZWdpc3RlciB3aXRoIGNvbWVkaSAqLworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHQ5ODEyX2NvbWVkaV9kcml2ZXIpOworCisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmR0OTgxMl91c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodXNiX2R0OTgxMl9pbml0KTsKK21vZHVsZV9leGl0KHVzYl9kdDk4MTJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZGVycyBCbG9tZGVsbCA8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgRFQ5ODEyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTQ0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKQEAgLTAsMCArMSwxMDg1IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworLyoKK0RyaXZlcjogaWNwX211bHRpCitEZXNjcmlwdGlvbjogSW5vdmEgSUNQX01VTFRJCitBdXRob3I6IEFubmUgU21vcnRoaXQgPGFubmUuc21vcnRoaXRAc2Z3dGUuY2g+CitEZXZpY2VzOiBbSW5vdmFdIElDUF9NVUxUSSAoaWNwX211bHRpKQorU3RhdHVzOiB3b3JrcworCitUaGUgZHJpdmVyIHdvcmtzIGZvciBhbmFsb2cgaW5wdXQgYW5kIG91dHB1dCBhbmQgZGlnaXRhbCBpbnB1dCBhbmQgb3V0cHV0LgorSXQgZG9lcyBub3Qgd29yayB3aXRoIGludGVycnVwdHMgb3Igd2l0aCB0aGUgY291bnRlcnMuICBDdXJyZW50bHkgbm8gc3VwcG9ydAorZm9yIERNQS4KKworSXQgaGFzIDE2IHNpbmdsZS1lbmRlZCBvciA4IGRpZmZlcmVudGlhbCBBbmFsb2d1ZSBJbnB1dCBjaGFubmVscyB3aXRoIDEyLWJpdAorcmVzb2x1dGlvbi4gIFJhbmdlcyA6IDVWLCAxMFYsICsvLTVWLCArLy0xMFYsIDAuLjIwbUEgYW5kIDQuLjIwbUEuICBJbnB1dAorcmFuZ2VzIGNhbiBiZSBpbmRpdmlkdWFsbHkgcHJvZ3JhbW1lZCBmb3IgZWFjaCBjaGFubmVsLiAgVm9sdGFnZSBvciBjdXJyZW50CittZWFzdXJlbWVudCBpcyBzZWxlY3RlZCBieSBqdW1wZXIuCisKK1RoZXJlIGFyZSA0IHggMTItYml0IEFuYWxvZ3VlIE91dHB1dHMuICBSYW5nZXMgOiA1ViwgMTBWLCArLy01ViwgKy8tMTBWCisKKzE2IHggRGlnaXRhbCBJbnB1dHMsIDI0VgorCis4IHggRGlnaXRhbCBPdXRwdXRzLCAyNFYsIDFBCisKKzQgeCAxNi1iaXQgY291bnRlcnMKKworT3B0aW9uczoKKyBbMF0gLSBQQ0kgYnVzIG51bWJlciAtIGlmIGJ1cyBudW1iZXIgYW5kIHNsb3QgbnVtYmVyIGFyZSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkcml2ZXIgc2VhcmNoIGZvciBmaXJzdCB1bnVzZWQgY2FyZAorIFsxXSAtIFBDSSBzbG90IG51bWJlcgorKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgImljcF9tdWx0aS5oIgorCisjZGVmaW5lIERFVklDRV9JRAkweDgwMDAJLyogRGV2aWNlIElEICovCisKKyNkZWZpbmUgSUNQX01VTFRJX0VYVERFQlVHCisKKy8vIEhhcmR3YXJlIHR5cGVzIG9mIHRoZSBjYXJkcworI2RlZmluZSBUWVBFX0lDUF9NVUxUSQkwCisKKyNkZWZpbmUgSU9SQU5HRV9JQ1BfTVVMVEkgCTMyCisKKyNkZWZpbmUgSUNQX01VTFRJX0FEQ19DU1IJMAkvKiBSL1c6IEFEQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBJQ1BfTVVMVElfQUkJCTIJLyogUjogICBBbmFsb2d1ZSBpbnB1dCBkYXRhICovCisjZGVmaW5lIElDUF9NVUxUSV9EQUNfQ1NSCTQJLyogUi9XOiBEQUMgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0FPCQk2CS8qIFIvVzogQW5hbG9ndWUgb3V0cHV0IGRhdGEgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0RJCQk4CS8qIFIvVzogRGlnaXRhbCBpbm91dHMgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0RPCQkweDBBCS8qIFIvVzogRGlnaXRhbCBvdXRwdXRzICovCisjZGVmaW5lIElDUF9NVUxUSV9JTlRfRU4JMHgwQwkvKiBSL1c6IEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0lOVF9TVEFUCTB4MEUJLyogUi9XOiBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElDUF9NVUxUSV9DTlRSMAkJMHgxMAkvKiBSL1c6IENvdW50ZXIgMCAqLworI2RlZmluZSBJQ1BfTVVMVElfQ05UUjEJCTB4MTIJLyogUi9XOiBjb3VudGVyIDEgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0NOVFIyCQkweDE0CS8qIFIvVzogQ291bnRlciAyICovCisjZGVmaW5lIElDUF9NVUxUSV9DTlRSMwkJMHgxNgkvKiBSL1c6IENvdW50ZXIgMyAqLworCisjZGVmaW5lIElDUF9NVUxUSV9TSVpFCQkweDIwCS8qIDMyIGJ5dGVzICovCisKKy8vIERlZmluZSBiaXRzIGZyb20gQURDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lCUFEQ19TVAkJMHgwMDAxCS8qIFN0YXJ0IEFEQyAqLworI2RlZmluZQlBRENfQlNZCQkweDAwMDEJLyogQURDIGJ1c3kgKi8KKyNkZWZpbmUgQURDX0JJCQkweDAwMTAJLyogQmlwb2xhciBpbnB1dCByYW5nZSAxID0gYmlwb2xhciAqLworI2RlZmluZSBBRENfUkEJCTB4MDAyMAkvKiBJbnB1dCByYW5nZSAwID0gNVYsIDEgPSAxMFYgKi8KKyNkZWZpbmUJQURDX0RJCQkweDAwNDAJLyogRGlmZmVyZW50aWFsIGlucHV0IG1vZGUgMSA9IGRpZmZlcmVudGlhbCAqLworCisvLyBEZWZpbmUgYml0cyBmcm9tIERBQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlcgorI2RlZmluZQlEQUNfU1QJCTB4MDAwMQkvKiBTdGFydCBEQUMgKi8KKyNkZWZpbmUgREFDX0JTWQkJMHgwMDAxCS8qIERBQyBidXN5ICovCisjZGVmaW5lCURBQ19CSQkJMHgwMDEwCS8qIEJpcG9sYXIgaW5wdXQgcmFuZ2UgMSA9IGJpcG9sYXIgKi8KKyNkZWZpbmUJREFDX1JBCQkweDAwMjAJLyogSW5wdXQgcmFuZ2UgMCA9IDVWLCAxID0gMTBWICovCisKKy8vIERlZmluZSBiaXRzIGZyb20gaW50ZXJydXB0IGVuYWJsZS9zdGF0dXMgcmVnaXN0ZXJzCisjZGVmaW5lCUFEQ19SRUFEWQkweDAwMDEJLyogQS9kIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0ICovCisjZGVmaW5lCURBQ19SRUFEWQkweDAwMDIJLyogRC9hIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0ICovCisjZGVmaW5lCURPVVRfRVJST1IJMHgwMDA0CS8qIERpZ2l0YWwgb3V0cHV0IGVycm9yIGludGVycnVwdCAqLworI2RlZmluZQlESU5fU1RBVFVTCTB4MDAwOAkvKiBEaWdpdGFsIGlucHV0IHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0ICovCisjZGVmaW5lCUNJRTAJCTB4MDAxMAkvKiBDb3VudGVyIDAgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQ0lFMQkJMHgwMDIwCS8qIENvdW50ZXIgMSBvdmVycnVuIGludGVycnVwdCAqLworI2RlZmluZQlDSUUyCQkweDAwNDAJLyogQ291bnRlciAyIG92ZXJydW4gaW50ZXJydXB0ICovCisjZGVmaW5lCUNJRTMJCTB4MDA4MAkvKiBDb3VudGVyIDMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKworLy8gVXNlZnVsIGRlZmluaXRpb25zCisjZGVmaW5lCVN0YXR1c19JUlEJMHgwMGZmCS8vIEFsbCBpbnRlcnJ1cHRzCisKKy8vIERlZmluZSBhbmFsb2d1ZSByYW5nZQorc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYW5hbG9nID0geyA0LCB7CisJCQlVTklfUkFOR0UoNSksCisJCQlVTklfUkFOR0UoMTApLAorCQkJQklQX1JBTkdFKDUpLAorCQkJQklQX1JBTkdFKDEwKQorCX0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIHJhbmdlX2NvZGVzX2FuYWxvZ1tdID0geyAweDAwLCAweDIwLCAweDEwLCAweDMwIH07CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlGb3J3YXJkIGRlY2xhcmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCk7CitzdGF0aWMgaW50IGljcF9tdWx0aV9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldik7CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEYXRhICYgU3RydWN0dXJlIGRlY2xhcmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBjaV9saXN0X2J1aWxkZWQgPSAwOwkvKj4wIGxpc3Qgb2YgY2FyZCBpcyBrbm93biAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsJLy8gZHJpdmVyIG5hbWUKKwlpbnQgZGV2aWNlX2lkOworCWludCBpb3JhbmdlOwkJLy8gSS9PIHJhbmdlIGxlbgorCWNoYXIgaGF2ZV9pcnE7CQkvLyAxPWNhcmQgc3VwcG9ydCBJUlEKKwljaGFyIGNhcmR0eXBlOwkJLy8gMD1JQ1AgTXVsdGkKKwlpbnQgbl9haWNoYW47CQkvLyBudW0gb2YgQS9EIGNoYW5zCisJaW50IG5fYWljaGFuZDsJCS8vIG51bSBvZiBBL0QgY2hhbnMgaW4gZGlmZiBtb2RlCisJaW50IG5fYW9jaGFuOwkJLy8gbnVtIG9mIEQvQSBjaGFucworCWludCBuX2RpY2hhbjsJCS8vIG51bSBvZiBESSBjaGFucworCWludCBuX2RvY2hhbjsJCS8vIG51bSBvZiBETyBjaGFucworCWludCBuX2N0cnM7CQkvLyBudW0gb2YgY291bnRlcnMKKwlpbnQgYWlfbWF4ZGF0YTsJCS8vIHJlc29sdXRpb24gb2YgQS9ECisJaW50IGFvX21heGRhdGE7CQkvLyByZXNvbHV0aW9uIG9mIEQvQQorCWNvbnN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlbGlzdF9haTsJLy8gcmFuZ2VsaXN0IGZvciBBL0QKKwljb25zdCBjaGFyICpyYW5nZWNvZGU7CS8vIHJhbmdlIGNvZGVzIGZvciBwcm9ncmFtbWluZworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlbGlzdF9hbzsJLy8gcmFuZ2VsaXN0IGZvciBEL0EKK30gYm9hcmR0eXBlOworCitzdGF0aWMgY29uc3QgYm9hcmR0eXBlIGJvYXJkdHlwZXNbXSA9IHsKKwl7ImljcF9tdWx0aSIsCQkvLyBEcml2ZXIgbmFtZQorCQkJREVWSUNFX0lELAkvLyBQQ0kgZGV2aWNlIElECisJCQlJT1JBTkdFX0lDUF9NVUxUSSwJLy8gSS9PIHJhbmdlIGxlbmd0aAorCQkJMSwJLy8gMT1DYXJkIHN1cHBvcnRzIGludGVycnVwdHMKKwkJCVRZUEVfSUNQX01VTFRJLAkvLyBDYXJkIHR5cGUgPSBJQ1AgTVVMVEkKKwkJCTE2LAkvLyBOdW0gb2YgQS9EIGNoYW5uZWxzCisJCQk4LAkvLyBOdW0gb2YgQS9EIGNoYW5uZWxzIGluIGRpZmYgbW9kZQorCQkJNCwJLy8gTnVtIG9mIEQvQSBjaGFubmVscworCQkJMTYsCS8vIE51bSBvZiBkaWdpdGFsIGlucHV0cworCQkJOCwJLy8gTnVtIG9mIGRpZ2l0YWwgb3V0cHV0cworCQkJNCwJLy8gTnVtIG9mIGNvdW50ZXJzCisJCQkweDBmZmYsCS8vIFJlc29sdXRpb24gb2YgQS9ECisJCQkweDBmZmYsCS8vIFJlc29sdXRpb24gb2YgRC9BCisJCQkmcmFuZ2VfYW5hbG9nLAkvLyBSYW5nZWxpc3QgZm9yIEEvRAorCQkJcmFuZ2VfY29kZXNfYW5hbG9nLAkvLyBSYW5nZSBjb2RlcyBmb3IgcHJvZ3JhbW1pbmcKKwkJJnJhbmdlX2FuYWxvZ30sCS8vIFJhbmdlbGlzdCBmb3IgRC9BCit9OworCisjZGVmaW5lIG5fYm9hcmR0eXBlcyAoc2l6ZW9mKGJvYXJkdHlwZXMpL3NpemVvZihib2FyZHR5cGUpKQorCitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfaWNwX211bHRpID0geworICAgICAgZHJpdmVyX25hbWU6ImljcF9tdWx0aSIsCisgICAgICBtb2R1bGU6VEhJU19NT0RVTEUsCisgICAgICBhdHRhY2g6aWNwX211bHRpX2F0dGFjaCwKKyAgICAgIGRldGFjaDppY3BfbXVsdGlfZGV0YWNoLAorICAgICAgbnVtX25hbWVzOm5fYm9hcmR0eXBlcywKKyAgICAgIGJvYXJkX25hbWU6JmJvYXJkdHlwZXNbMF0ubmFtZSwKKyAgICAgIG9mZnNldDpzaXplb2YoYm9hcmR0eXBlKSwKK307CisKK0NPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfaWNwX211bHRpKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICpjYXJkOwkvLyBwb2ludGVyIHRvIGNhcmQKKwljaGFyIHZhbGlkOwkJLy8gY2FyZCBpcyB1c2FibGUKKwl2b2lkICppb19hZGRyOwkJLy8gUG9pbnRlciB0byBtYXBwZWQgaW8gYWRkcmVzcworCXJlc291cmNlX3NpemVfdCBwaHlzX2lvYmFzZTsJLy8gUGh5c2ljYWwgaW8gYWRkcmVzcworCXVuc2lnbmVkIGludCBBZGNDbWRTdGF0dXM7CS8vIEFEQyBDb21tYW5kL1N0YXR1cyByZWdpc3RlcgorCXVuc2lnbmVkIGludCBEYWNDbWRTdGF0dXM7CS8vIERBQyBDb21tYW5kL1N0YXR1cyByZWdpc3RlcgorCXVuc2lnbmVkIGludCBJbnRFbmFibGU7CS8vIEludGVycnVwdCBFbmFibGUgcmVnaXN0ZXIKKwl1bnNpZ25lZCBpbnQgSW50U3RhdHVzOwkvLyBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyCisJdW5zaWduZWQgaW50IGFjdF9jaGFubGlzdFszMl07CS8vIGxpc3Qgb2Ygc2NhbmVkIGNoYW5uZWwKKwl1bnNpZ25lZCBjaGFyIGFjdF9jaGFubGlzdF9sZW47CS8vIGxlbiBvZiBzY2FubGlzdAorCXVuc2lnbmVkIGNoYXIgYWN0X2NoYW5saXN0X3BvczsJLy8gYWN0dWFsIHBvc2l0aW9uIGluIE1VWCBsaXN0CisJdW5zaWduZWQgaW50ICphaV9jaGFubGlzdDsJLy8gYWN0YXVsIGNoYW5saXN0CisJc2FtcGxfdCAqYWlfZGF0YTsJLy8gZGF0YSBidWZmZXIKKwlzYW1wbF90IGFvX2RhdGFbNF07CS8vIGRhdGEgb3V0cHV0IGJ1ZmZlcgorCXNhbXBsX3QgZGlfZGF0YTsJLy8gRGlnaXRhbCBpbnB1dCBkYXRhCisJdW5zaWduZWQgaW50IGRvX2RhdGE7CS8vIFJlbWVtYmVyIGRpZ2l0YWwgb3V0cHV0IGRhdGEKK30gaWNwX211bHRpX3ByaXZhdGU7CisKKyNkZWZpbmUgZGV2cHJpdiAoKGljcF9tdWx0aV9wcml2YXRlICopZGV2LT5wcml2YXRlKQorI2RlZmluZSB0aGlzX2JvYXJkICgoY29uc3QgYm9hcmR0eXBlICopZGV2LT5ib2FyZF9wdHIpCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlNb3JlIGZvcndhcmQgZGVjbGFyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpZiAwCitzdGF0aWMgaW50IGNoZWNrX2NoYW5uZWxfbGlzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0LCB1bnNpZ25lZCBpbnQgbl9jaGFuKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgc2V0dXBfY2hhbm5lbF9saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4pOworc3RhdGljIGludCBpY3BfbXVsdGlfcmVzZXQoY29tZWRpX2RldmljZSAqIGRldik7CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlGdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9haQorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzaW5nbGUgYW5hbG9ndWUgaW5wdXQuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJCWxzYW1wbF90ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIGlucHV0IGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IG4sIHRpbWVvdXQ7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKVxuIik7CisjZW5kaWYKKwkvLyBEaXNhYmxlIEEvRCBjb252ZXJzaW9uIHJlYWR5IGludGVycnVwdAorCWRldnByaXYtPkludEVuYWJsZSAmPSB+QURDX1JFQURZOworCXdyaXRldyhkZXZwcml2LT5JbnRFbmFibGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKKworCS8vIENsZWFyIGludGVycnVwdCBzdGF0dXMKKwlkZXZwcml2LT5JbnRTdGF0dXMgfD0gQURDX1JFQURZOworCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOworCisJLy8gU2V0IHVwIGFwcHJvcHJpYXRlIGNoYW5uZWwsIG1vZGUgYW5kIHJhbmdlIGRhdGEsIGZvciBzcGVjaWZpZWQgY2hhbm5lbAorCXNldHVwX2NoYW5uZWxfbGlzdChkZXYsIHMsICZpbnNuLT5jaGFuc3BlYywgMSk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcF9tdWx0aSBBIFNUPSU0eCBJTz0lcFxuIiwKKwkJcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKSwKKwkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKTsKKyNlbmRpZgorCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCQkvLyBTZXQgc3RhcnQgQURDIGJpdAorCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgfD0gQURDX1NUOworCQl3cml0ZXcoZGV2cHJpdi0+QWRjQ21kU3RhdHVzLAorCQkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKTsKKwkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzICY9IH5BRENfU1Q7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJcHJpbnRrKCJpY3AgbXVsdGkgQiBuPSVkIFNUPSU0eFxuIiwgbiwKKwkJCXJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUikpOworI2VuZGlmCisKKwkJY29tZWRpX3VkZWxheSgxKTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQlwcmludGsoImljcCBtdWx0aSBDIG49JWQgU1Q9JTR4XG4iLCBuLAorCQkJcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKSk7CisjZW5kaWYKKworCQkvLyBXYWl0IGZvciBjb252ZXJzaW9uIHRvIGNvbXBsZXRlLCBvciBnZXQgZmVkIHVwIHdhaXRpbmcKKwkJdGltZW91dCA9IDEwMDsKKwkJd2hpbGUgKHRpbWVvdXQtLSkgeworCQkJaWYgKCEocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCisJCQkJCQlJQ1BfTVVMVElfQURDX0NTUikgJiBBRENfQlNZKSkKKwkJCQlnb3RvIGNvbnZfZmluaXNoOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCQlpZiAoISh0aW1lb3V0ICUgMTApKQorCQkJCXByaW50aygiaWNwIG11bHRpIEQgbj0lZCB0bT0lZCBTVD0lNHhcbiIsIG4sCisJCQkJCXRpbWVvdXQsCisJCQkJCXJlYWR3KGRldnByaXYtPmlvX2FkZHIgKworCQkJCQkJSUNQX01VTFRJX0FEQ19DU1IpKTsKKyNlbmRpZgorCisJCQljb21lZGlfdWRlbGF5KDEpOworCQl9CisKKwkJLy8gSWYgd2UgcmVhY2ggaGVyZSwgYSB0aW1lb3V0IGhhcyBvY2N1cnJlZAorCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIGluc24gdGltZW91dCIpOworCisJCS8vIERpc2FibGUgaW50ZXJydXB0CisJCWRldnByaXYtPkludEVuYWJsZSAmPSB+QURDX1JFQURZOworCQl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisKKwkJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cworCQlkZXZwcml2LT5JbnRTdGF0dXMgfD0gQURDX1JFQURZOworCQl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLAorCQkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwkJLy8gQ2xlYXIgZGF0YSByZWNlaXZlZAorCQlkYXRhW25dID0gMDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKSBuPSVkXG4iLCBuKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVUSU1FOworCisJICAgICAgY29udl9maW5pc2g6CisJCWRhdGFbbl0gPQorCQkJKHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQUkpID4+IDQpICYgMHgwZmZmOworCX0KKworCS8vIERpc2FibGUgaW50ZXJydXB0CisJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOworCisJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cworCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKSBuPSVkXG4iLCBuKTsKKyNlbmRpZgorCXJldHVybiBuOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfaW5zbl93cml0ZV9hbworCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgc2luZ2xlIGFuYWxvZ3VlIG91dHB1dC4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBuLCBjaGFuLCByYW5nZSwgdGltZW91dDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKVxuIik7CisjZW5kaWYKKwkvLyBEaXNhYmxlIEQvQSBjb252ZXJzaW9uIHJlYWR5IGludGVycnVwdAorCWRldnByaXYtPkludEVuYWJsZSAmPSB+REFDX1JFQURZOworCXdyaXRldyhkZXZwcml2LT5JbnRFbmFibGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKKworCS8vIENsZWFyIGludGVycnVwdCBzdGF0dXMKKwlkZXZwcml2LT5JbnRTdGF0dXMgfD0gREFDX1JFQURZOworCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOworCisJLy8gR2V0IGNoYW5uZWwgbnVtYmVyIGFuZCByYW5nZQorCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlyYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKworCS8vIFNldCB1cCByYW5nZSBhbmQgY2hhbm5lbCBkYXRhCisJLy8gQml0IDQgPSAxIDogQmlwb2xhcgorCS8vIEJpdCA1ID0gMCA6IDVWCisJLy8gQml0IDUgPSAxIDogMTBWCisJLy8gQml0cyA4LTkgOiBDaGFubmVsIG51bWJlcgorCWRldnByaXYtPkRhY0NtZFN0YXR1cyAmPSAweGZjY2Y7CisJZGV2cHJpdi0+RGFjQ21kU3RhdHVzIHw9IHRoaXNfYm9hcmQtPnJhbmdlY29kZVtyYW5nZV07CisJZGV2cHJpdi0+RGFjQ21kU3RhdHVzIHw9IChjaGFuIDw8IDgpOworCisJd3JpdGV3KGRldnByaXYtPkRhY0NtZFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9EQUNfQ1NSKTsKKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwkJLy8gV2FpdCBmb3IgYW5hbG9ndWUgb3V0cHV0IGRhdGEgcmVnaXN0ZXIgdG8gYmUgcmVhZHkgZm9yIG5ldyBkYXRhLCBvciBnZXQgZmVkIHVwIHdhaXRpbmcKKwkJdGltZW91dCA9IDEwMDsKKwkJd2hpbGUgKHRpbWVvdXQtLSkgeworCQkJaWYgKCEocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCisJCQkJCQlJQ1BfTVVMVElfREFDX0NTUikgJiBEQUNfQlNZKSkKKwkJCQlnb3RvIGRhY19yZWFkeTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQkJaWYgKCEodGltZW91dCAlIDEwKSkKKwkJCQlwcmludGsoImljcCBtdWx0aSBBIG49JWQgdG09JWQgU1Q9JTR4XG4iLCBuLAorCQkJCQl0aW1lb3V0LAorCQkJCQlyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKKwkJCQkJCUlDUF9NVUxUSV9EQUNfQ1NSKSk7CisjZW5kaWYKKworCQkJY29tZWRpX3VkZWxheSgxKTsKKwkJfQorCisJCS8vIElmIHdlIHJlYWNoIGhlcmUsIGEgdGltZW91dCBoYXMgb2NjdXJyZWQKKwkJY29tZWRpX2Vycm9yKGRldiwgIkQvQSBpbnNuIHRpbWVvdXQiKTsKKworCQkvLyBEaXNhYmxlIGludGVycnVwdAorCQlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkRBQ19SRUFEWTsKKwkJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOworCisJCS8vIENsZWFyIGludGVycnVwdCBzdGF0dXMKKwkJZGV2cHJpdi0+SW50U3RhdHVzIHw9IERBQ19SRUFEWTsKKwkJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywKKwkJCWRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOworCisJCS8vIENsZWFyIGRhdGEgcmVjZWl2ZWQKKwkJZGV2cHJpdi0+YW9fZGF0YVtjaGFuXSA9IDA7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pIG49JWRcbiIsIG4pOworI2VuZGlmCisJCXJldHVybiAtRVRJTUU7CisKKwkgICAgICBkYWNfcmVhZHk6CisJCS8vIFdyaXRlIGRhdGEgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEgcmVnaXN0ZXIKKwkJd3JpdGV3KGRhdGFbbl0sIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQU8pOworCisJCS8vIFNldCBEQUNfU1QgYml0IHRvIHdyaXRlIHRoZSBkYXRhIHRvIHNlbGVjdGVkIGNoYW5uZWwKKwkJZGV2cHJpdi0+RGFjQ21kU3RhdHVzIHw9IERBQ19TVDsKKwkJd3JpdGV3KGRldnByaXYtPkRhY0NtZFN0YXR1cywKKwkJCWRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREFDX0NTUik7CisJCWRldnByaXYtPkRhY0NtZFN0YXR1cyAmPSB+REFDX1NUOworCisJCS8vIFNhdmUgYW5hbG9ndWUgb3V0cHV0IGRhdGEKKwkJZGV2cHJpdi0+YW9fZGF0YVtjaGFuXSA9IGRhdGFbbl07CisJfQorCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pIG49JWRcbiIsIG4pOworI2VuZGlmCisJcmV0dXJuIG47Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfYW8KKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgc2luZ2xlIGFuYWxvZ3VlIG91dHB1dC4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3JlYWRfYW8oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IG4sIGNoYW47CisKKwkvLyBHZXQgY2hhbm5lbCBudW1iZXIKKwljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwkvLyBSZWFkIGFuYWxvZ3VlIG91dHB1dHMKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKQorCQlkYXRhW25dID0gZGV2cHJpdi0+YW9fZGF0YVtjaGFuXTsKKworCXJldHVybiBuOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfaW5zbl9iaXRzX2RpCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgZGlnaXRhbCBpbnB1dHMuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJCWxzYW1wbF90ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCisKKwlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl9iaXRzX2RpKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWRhdGFbMV0gPSByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RJKTsKKworCXJldHVybiAyOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfaW5zbl9iaXRzX2RvCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGFwcHJvcHJpYXRlIGRpZ2l0YWwgb3V0cHV0cy4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX2JpdHNfZG8oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvKC4uLilcbiIpOworI2VuZGlmCisKKwlpZiAoZGF0YVswXSkgeworCQlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKKwkJcy0+c3RhdGUgfD0gKGRhdGFbMF0gJiBkYXRhWzFdKTsKKworCQlwcmludGsoIkRpZ2l0YWwgb3V0cHV0cyA9ICU0eCBcbiIsIHMtPnN0YXRlKTsKKworCQl3cml0ZXcocy0+c3RhdGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfRE8pOworCX0KKworCWRhdGFbMV0gPSByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RJKTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fYml0c19kbyguLi4pXG4iKTsKKyNlbmRpZgorCXJldHVybiAyOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2N0cgorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHNwZWNpZmllZCBjb3VudGVyLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBjb3VudGVyIGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3JlYWRfY3RyKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfaW5zbl93cml0ZV9jdHIKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHdyaXRlIHRvIHRoZSBzcGVjaWZpZWQgY291bnRlci4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gY291bnRlciBkYXRhCisKKwlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl93cml0ZV9jdHIoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aQorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGFsbAorCQlpbnRlcnJ1cHRzIGdlbmVyYXRlZCBieSB0aGUgaWNwIG11bHRpIGJvYXJkLgorCisJUGFyYW1ldGVyczoKKwkJaW50IGlycQorCQl2b2lkICpkCQkJUG9pbnRlciB0byBjdXJyZW50IGRldmljZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKGludCBpcnEsIHZvaWQgKmQgUFRfUkVHU19BUkcpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwlpbnQgaW50X25vOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoJWQsLi4uKVxuIiwKKwkJaXJxKTsKKyNlbmRpZgorCisJLy8gSXMgdGhpcyBpbnRlcnJ1cHQgZnJvbSBvdXIgYm9hcmQ/CisJaW50X25vID0gcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCkgJiBTdGF0dXNfSVJROworCWlmICghaW50X25vKQorCQkvLyBObywgZXhpdAorCQlyZXR1cm4gSVJRX05PTkU7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoKSBTVDogJTR4XG4iLAorCQlyZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKSk7CisjZW5kaWYKKworCS8vIERldGVybWluZSB3aGljaCBpbnRlcnJ1cHQgaXMgYWN0aXZlICYgaGFuZGxlIGl0CisJc3dpdGNoIChpbnRfbm8pIHsKKwljYXNlIEFEQ19SRUFEWToKKwkJYnJlYWs7CisJY2FzZSBEQUNfUkVBRFk6CisJCWJyZWFrOworCWNhc2UgRE9VVF9FUlJPUjoKKwkJYnJlYWs7CisJY2FzZSBESU5fU1RBVFVTOgorCQlicmVhazsKKwljYXNlIENJRTA6CisJCWJyZWFrOworCWNhc2UgQ0lFMToKKwkJYnJlYWs7CisJY2FzZSBDSUUyOgorCQlicmVhazsKKwljYXNlIENJRTM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCisJfQorCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoLi4uKVxuIik7CisjZW5kaWYKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZiAwCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOgljaGVja19jaGFubmVsX2xpc3QKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY2hhbm5lbCBsaXN0LCBwcm92aWRlZCBieSB1c2VyCisJCWlzIGJ1aWx0IGNvcnJlY3RseQorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJdW5zaWduZWQgaW50ICpjaGFubGlzdAlQb2ludGVyIHRvIHBhY2tlZCBjaGFubmVsIGxpc3QKKwkJdW5zaWduZWQgaW50IG5fY2hhbglOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgorCisJUmV0dXJuczppbnQgMCA9IGZhaWx1cmUKKwkJICAgIDEgPSBzdWNjZXNzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgY2hlY2tfY2hhbm5lbF9saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4pCit7CisJdW5zaWduZWQgaW50IGk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiAgY2hlY2tfY2hhbm5lbF9saXN0KC4uLiwlZClcbiIsIG5fY2hhbik7CisjZW5kaWYKKwkvLyBDaGVjayB0aGF0IHdlIGF0IGxlYXN0IGhhdmUgb25lIGNoYW5uZWwgdG8gY2hlY2sKKwlpZiAobl9jaGFuIDwgMSkgeworCQljb21lZGlfZXJyb3IoZGV2LCAicmFuZ2UvY2hhbm5lbCBsaXN0IGlzIGVtcHR5ISIpOworCQlyZXR1cm4gMDsKKwl9CisJLy8gQ2hlY2sgYWxsIGNoYW5uZWxzCisJZm9yIChpID0gMDsgaSA8IG5fY2hhbjsgaSsrKSB7CisJCS8vIENoZWNrIHRoYXQgY2hhbm5lbCBudW1iZXIgaXMgPCBtYXhpbXVtCisJCWlmIChDUl9BUkVGKGNoYW5saXN0W2ldKSA9PSBBUkVGX0RJRkYpIHsKKwkJCWlmIChDUl9DSEFOKGNoYW5saXN0W2ldKSA+IHRoaXNfYm9hcmQtPm5fYWljaGFuZCkgeworCQkJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkJCSJJbmNvcnJlY3QgZGlmZmVyZW50aWFsIGFpIGNoYW5uZWwgbnVtYmVyIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoQ1JfQ0hBTihjaGFubGlzdFtpXSkgPiB0aGlzX2JvYXJkLT5uX2FpY2hhbikgeworCQkJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkJCSJJbmNvcnJlY3QgYWkgY2hhbm5lbCBudW1iZXIiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglzZXR1cF9jaGFubmVsX2xpc3QKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgc2VsZWN0aW9uLAorCQlkaWZmZXJlbnRpYWwgaW5wdXQgbW9kZSBhbmQgcmFuZ2UgYml0cyBpbiB0aGUgQURDIENvbW1hbmQvCisJCVN0YXR1cyByZWdpc3Rlci4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCXVuc2lnbmVkIGludCAqY2hhbmxpc3QJUG9pbnRlciB0byBwYWNrZWQgY2hhbm5lbCBsaXN0CisJCXVuc2lnbmVkIGludCBuX2NoYW4JTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4KKworCVJldHVybnM6Vm9pZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdm9pZCBzZXR1cF9jaGFubmVsX2xpc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgcmFuZ2UsIGNoYW5wcm9nOworCXVuc2lnbmVkIGludCBkaWZmOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogIHNldHVwX2NoYW5uZWxfbGlzdCguLi4sJWQpXG4iLCBuX2NoYW4pOworI2VuZGlmCisJZGV2cHJpdi0+YWN0X2NoYW5saXN0X2xlbiA9IG5fY2hhbjsKKwlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBuX2NoYW47IGkrKykgeworCQkvLyBHZXQgY2hhbm5lbAorCQljaGFucHJvZyA9IENSX0NIQU4oY2hhbmxpc3RbaV0pOworCisJCS8vIERldGVybWluZSBpZiBpdCBpcyBhIGRpZmZlcmVudGlhbCBjaGFubmVsIChCaXQgMTUgID0gMSkKKwkJaWYgKENSX0FSRUYoY2hhbmxpc3RbaV0pID09IEFSRUZfRElGRikgeworCQkJZGlmZiA9IDE7CisJCQljaGFucHJvZyAmPSAweDAwMDc7CisJCX0gZWxzZSB7CisJCQlkaWZmID0gMDsKKwkJCWNoYW5wcm9nICY9IDB4MDAwZjsKKwkJfQorCisJCS8vIENsZWFyIGNoYW5uZWwsIHJhbmdlIGFuZCBpbnB1dCBtb2RlIGJpdHMgaW4gQS9EIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyCisJCWRldnByaXYtPkFkY0NtZFN0YXR1cyAmPSAweGYwMGY7CisKKwkJLy8gU2V0IGNoYW5uZWwgbnVtYmVyIGFuZCBkaWZmZXJlbnRpYWwgbW9kZSBzdGF0dXMgYml0CisJCWlmIChkaWZmKSB7CisJCQkvLyBTZXQgY2hhbm5lbCBudW1iZXIsIGJpdHMgOS0xMSAmIG1vZGUsIGJpdCA2CisJCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgfD0gKGNoYW5wcm9nIDw8IDkpOworCQkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzIHw9IEFEQ19ESTsKKwkJfSBlbHNlCisJCQkvLyBTZXQgY2hhbm5lbCBudW1iZXIsIGJpdHMgOC0xMQorCQkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzIHw9IChjaGFucHJvZyA8PCA4KTsKKworCQkvLyBHZXQgcmFuZ2UgZm9yIGN1cnJlbnQgY2hhbm5lbAorCQlyYW5nZSA9IHRoaXNfYm9hcmQtPnJhbmdlY29kZVtDUl9SQU5HRShjaGFubGlzdFtpXSldOworCQkvLyBTZXQgcmFuZ2UuIGJpdHMgNC01CisJCWRldnByaXYtPkFkY0NtZFN0YXR1cyB8PSByYW5nZTsKKworCQkvKiBPdXRwdXQgY2hhbm5lbCwgcmFuZ2UsIG1vZGUgdG8gSUNQIE11bHRpICovCisJCXdyaXRldyhkZXZwcml2LT5BZGNDbWRTdGF0dXMsCisJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCXByaW50aygiR1M6ICUyZC4gWyU0eF09JTR4ICU0eFxuIiwgaSwgY2hhbnByb2csIHJhbmdlLAorCQkJZGV2cHJpdi0+YWN0X2NoYW5saXN0W2ldKTsKKyNlbmRpZgorCX0KKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfcmVzZXQKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgaWNwIG11bHRpIGRldmljZSB0byBhICdzYWZlJyBzdGF0ZQorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCisKKwlSZXR1cm5zOmludAkwID0gc3VjY2VzcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9yZXNldChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGludCBpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3BfbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfcmVzZXQoLi4uKVxuIik7CisjZW5kaWYKKwkvLyBDbGVhciBJTlQgZW5hYmxlcyBhbmQgcmVxdWVzdHMKKwl3cml0ZXcoMCwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOworCXdyaXRldygweDAwZmYsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOworCisJaWYgKHRoaXNfYm9hcmQtPm5fYW9jaGFuKQorCQkvLyBTZXQgREFDcyB0byAwLi41ViByYW5nZSBhbmQgMFYgb3V0cHV0CisJCWZvciAoaSA9IDA7IGkgPCB0aGlzX2JvYXJkLT5uX2FvY2hhbjsgaSsrKSB7CisJCQlkZXZwcml2LT5EYWNDbWRTdGF0dXMgJj0gMHhmY2NlOworCisJCQkvLyBTZXQgY2hhbm5lbCBudW1iZXIKKwkJCWRldnByaXYtPkRhY0NtZFN0YXR1cyB8PSAoaSA8PCA4KTsKKworCQkJLy8gT3V0cHV0IDBWCisJCQl3cml0ZXcoMCwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BTyk7CisKKwkJCS8vIFNldCBzdGFydCBjb252ZXJzaW9uIGJpdAorCQkJZGV2cHJpdi0+RGFjQ21kU3RhdHVzIHw9IERBQ19TVDsKKworCQkJLy8gT3V0cHV0IHRvIGNvbW1hbmQgLyBzdGF0dXMgcmVnaXN0ZXIKKwkJCXdyaXRldyhkZXZwcml2LT5EYWNDbWRTdGF0dXMsCisJCQkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9EQUNfQ1NSKTsKKworCQkJLy8gRGVsYXkgdG8gYWxsb3cgREFDIHRpbWUgdG8gcmVjb3ZlcgorCQkJY29tZWRpX3VkZWxheSgxKTsKKwkJfQorCS8vIERpZ2l0YWwgb3V0cHV0cyB0byAwCisJd3JpdGV3KDAsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfRE8pOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfcmVzZXQoLi4uKVxuIik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2F0dGFjaAorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gc2V0cyB1cCBhbGwgdGhlIGFwcHJvcHJpYXRlIGRhdGEgZm9yIHRoZSBjdXJyZW50CisJCWRldmljZS4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfZGV2Y29uZmlnICppdAlQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKworCVJldHVybnM6aW50CTAgPSBzdWNjZXNzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0LCBzdWJkZXYsIG5fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICpjYXJkID0gTlVMTDsKKwlyZXNvdXJjZV9zaXplX3QgaW9fYWRkcls1XSwgaW9iYXNlOworCXVuc2lnbmVkIGNoYXIgcGNpX2J1cywgcGNpX3Nsb3QsIHBjaV9mdW5jOworCisJcHJpbnRrKCJpY3BfbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfYXR0YWNoKC4uLilcbiIpOworCisJLy8gQWxvY2F0ZSBwcml2YXRlIGRhdGEgc3RvcmFnZSBzcGFjZQorCWlmICgocmV0ID0gYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihpY3BfbXVsdGlfcHJpdmF0ZSkpKSA8IDApCisJCXJldHVybiByZXQ7CisKKwkvLyBJbml0aWFsaXNlIGxpc3Qgb2YgUENJIGNhcmRzIGluIHN5c3RlbSwgaWYgbm90IGFscmVhZHkgZG9uZSBzbworCWlmIChwY2lfbGlzdF9idWlsZGVkKysgPT0gMCkgeworCQlwY2lfY2FyZF9saXN0X2luaXQoUENJX1ZFTkRPUl9JRF9JQ1AsCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCQkxCisjZWxzZQorCQkJMAorI2VuZGlmCisJCQkpOworCX0KKworCXByaW50aygiQW5uZSdzIGNvbWVkaSVkOiBpY3BfbXVsdGk6IGJvYXJkPSVzIiwgZGV2LT5taW5vciwKKwkJdGhpc19ib2FyZC0+bmFtZSk7CisKKwlpZiAoKGNhcmQgPSBzZWxlY3RfYW5kX2FsbG9jX3BjaV9jYXJkKFBDSV9WRU5ET1JfSURfSUNQLAorCQkJCXRoaXNfYm9hcmQtPmRldmljZV9pZCwgaXQtPm9wdGlvbnNbMF0sCisJCQkJaXQtPm9wdGlvbnNbMV0pKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCWRldnByaXYtPmNhcmQgPSBjYXJkOworCisJaWYgKChwY2lfY2FyZF9kYXRhKGNhcmQsICZwY2lfYnVzLCAmcGNpX3Nsb3QsICZwY2lfZnVuYywgJmlvX2FkZHJbMF0sCisJCQkJJmlycSkpIDwgMCkgeworCQlwcmludGsoIiAtIENhbid0IGdldCBjb25maWd1cmF0aW9uIGRhdGEhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaW9iYXNlID0gaW9fYWRkclsyXTsKKwlkZXZwcml2LT5waHlzX2lvYmFzZSA9IGlvYmFzZTsKKworCXByaW50aygiLCBiOnM6Zj0lZDolZDolZCwgaW89MHglOGxseCBcbiIsIHBjaV9idXMsIHBjaV9zbG90LCBwY2lfZnVuYywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylpb2Jhc2UpOworCisJZGV2cHJpdi0+aW9fYWRkciA9IGlvcmVtYXAoaW9iYXNlLCBJQ1BfTVVMVElfU0laRSk7CisKKwlpZiAoZGV2cHJpdi0+aW9fYWRkciA9PSBOVUxMKSB7CisJCXByaW50aygiaW9yZW1hcCBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiMHglMDhsbHggbWFwcGVkIHRvICVwLCAiLCAodW5zaWduZWQgbG9uZyBsb25nKWlvYmFzZSwKKwkJZGV2cHJpdi0+aW9fYWRkcik7CisjZW5kaWYKKworCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNfYm9hcmQtPm5hbWU7CisKKwluX3N1YmRldmljZXMgPSAwOworCWlmICh0aGlzX2JvYXJkLT5uX2FpY2hhbikKKwkJbl9zdWJkZXZpY2VzKys7CisJaWYgKHRoaXNfYm9hcmQtPm5fYW9jaGFuKQorCQluX3N1YmRldmljZXMrKzsKKwlpZiAodGhpc19ib2FyZC0+bl9kaWNoYW4pCisJCW5fc3ViZGV2aWNlcysrOworCWlmICh0aGlzX2JvYXJkLT5uX2RvY2hhbikKKwkJbl9zdWJkZXZpY2VzKys7CisJaWYgKHRoaXNfYm9hcmQtPm5fY3RycykKKwkJbl9zdWJkZXZpY2VzKys7CisKKwlpZiAoKHJldCA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCBuX3N1YmRldmljZXMpKSA8IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpY3BfbXVsdGlfcmVzZXQoZGV2KTsKKworCWlmICh0aGlzX2JvYXJkLT5oYXZlX2lycSkgeworCQlpZiAoaXJxKSB7CisJCQlpZiAoY29tZWRpX3JlcXVlc3RfaXJxKGlycSwgaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpLAorCQkJCQlJUlFGX1NIQVJFRCwgIklub3ZhIEljcCBNdWx0aSIsIGRldikpIHsKKwkJCQlwcmludGsoIiwgdW5hYmxlIHRvIGFsbG9jYXRlIElSUSAldSwgRElTQUJMSU5HIElUIiwgaXJxKTsKKwkJCQlpcnEgPSAwOwkvKiBDYW4ndCB1c2UgSVJRICovCisJCQl9IGVsc2UKKwkJCQlwcmludGsoIiwgaXJxPSV1IiwgaXJxKTsKKwkJfSBlbHNlCisJCQlwcmludGsoIiwgSVJRIGRpc2FibGVkIik7CisJfSBlbHNlCisJCWlycSA9IDA7CisKKwlkZXYtPmlycSA9IGlycTsKKworCXByaW50aygiLlxuIik7CisKKwlzdWJkZXYgPSAwOworCisJaWYgKHRoaXNfYm9hcmQtPm5fYWljaGFuKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9DT01NT04gfCBTREZfR1JPVU5EOworCQlpZiAodGhpc19ib2FyZC0+bl9haWNoYW5kKQorCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9ESUZGOworCQlzLT5uX2NoYW4gPSB0aGlzX2JvYXJkLT5uX2FpY2hhbjsKKwkJcy0+bWF4ZGF0YSA9IHRoaXNfYm9hcmQtPmFpX21heGRhdGE7CisJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPm5fYWljaGFuOworCQlzLT5yYW5nZV90YWJsZSA9IHRoaXNfYm9hcmQtPnJhbmdlbGlzdF9haTsKKwkJcy0+aW5zbl9yZWFkID0gaWNwX211bHRpX2luc25fcmVhZF9haTsKKwkJc3ViZGV2Kys7CisJfQorCisJaWYgKHRoaXNfYm9hcmQtPm5fYW9jaGFuKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX0dST1VORCB8IFNERl9DT01NT047CisJCXMtPm5fY2hhbiA9IHRoaXNfYm9hcmQtPm5fYW9jaGFuOworCQlzLT5tYXhkYXRhID0gdGhpc19ib2FyZC0+YW9fbWF4ZGF0YTsKKwkJcy0+bGVuX2NoYW5saXN0ID0gdGhpc19ib2FyZC0+bl9hb2NoYW47CisJCXMtPnJhbmdlX3RhYmxlID0gdGhpc19ib2FyZC0+cmFuZ2VsaXN0X2FvOworCQlzLT5pbnNuX3dyaXRlID0gaWNwX211bHRpX2luc25fd3JpdGVfYW87CisJCXMtPmluc25fcmVhZCA9IGljcF9tdWx0aV9pbnNuX3JlYWRfYW87CisJCXN1YmRldisrOworCX0KKworCWlmICh0aGlzX2JvYXJkLT5uX2RpY2hhbikgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2OworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRTsKKwkJcy0+bl9jaGFuID0gdGhpc19ib2FyZC0+bl9kaWNoYW47CisJCXMtPm1heGRhdGEgPSAxOworCQlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzX2JvYXJkLT5uX2RpY2hhbjsKKwkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwkJcy0+aW9fYml0cyA9IDA7CisJCXMtPmluc25fYml0cyA9IGljcF9tdWx0aV9pbnNuX2JpdHNfZGk7CisJCXN1YmRldisrOworCX0KKworCWlmICh0aGlzX2JvYXJkLT5uX2RvY2hhbikgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2OworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfRE87CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKKwkJcy0+bl9jaGFuID0gdGhpc19ib2FyZC0+bl9kb2NoYW47CisJCXMtPm1heGRhdGEgPSAxOworCQlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzX2JvYXJkLT5uX2RvY2hhbjsKKwkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwkJcy0+aW9fYml0cyA9ICgxIDw8IHRoaXNfYm9hcmQtPm5fZG9jaGFuKSAtIDE7CisJCXMtPnN0YXRlID0gMDsKKwkJcy0+aW5zbl9iaXRzID0gaWNwX211bHRpX2luc25fYml0c19kbzsKKwkJc3ViZGV2Kys7CisJfQorCisJaWYgKHRoaXNfYm9hcmQtPm5fY3RycykgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2OworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX0dST1VORCB8IFNERl9DT01NT047CisJCXMtPm5fY2hhbiA9IHRoaXNfYm9hcmQtPm5fY3RyczsKKwkJcy0+bWF4ZGF0YSA9IDB4ZmZmZjsKKwkJcy0+bGVuX2NoYW5saXN0ID0gdGhpc19ib2FyZC0+bl9jdHJzOworCQlzLT5zdGF0ZSA9IDA7CisJCXMtPmluc25fcmVhZCA9IGljcF9tdWx0aV9pbnNuX3JlYWRfY3RyOworCQlzLT5pbnNuX3dyaXRlID0gaWNwX211bHRpX2luc25fd3JpdGVfY3RyOworCQlzdWJkZXYrKzsKKwl9CisKKwlkZXZwcml2LT52YWxpZCA9IDE7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9hdHRhY2goLi4uKVxuIik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfZGV0YWNoCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBhbGwgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBjdXJyZW50CisJCWRldmljZS4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCisJUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisKKwlpZiAoZGV2LT5wcml2YXRlKQorCQlpZiAoZGV2cHJpdi0+dmFsaWQpCisJCQlpY3BfbXVsdGlfcmVzZXQoZGV2KTsKKworCWlmIChkZXYtPmlycSkKKwkJY29tZWRpX2ZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJaWYgKGRldi0+cHJpdmF0ZSAmJiBkZXZwcml2LT5pb19hZGRyKQorCQlpb3VubWFwKGRldnByaXYtPmlvX2FkZHIpOworCisJaWYgKGRldi0+cHJpdmF0ZSAmJiBkZXZwcml2LT5jYXJkKQorCQlwY2lfY2FyZF9mcmVlKGRldnByaXYtPmNhcmQpOworCisJaWYgKC0tcGNpX2xpc3RfYnVpbGRlZCA9PSAwKSB7CisJCXBjaV9jYXJkX2xpc3RfY2xlYW51cChQQ0lfVkVORE9SX0lEX0lDUCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmNGE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuaApAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuaAorCisgICAgU3R1ZmYgZm9yIElDUCBNdWx0aQorCisgICAgQXV0aG9yOiBBbm5lIFNtb3J0aGl0IDxhbm5lLnNtb3J0aGl0QHNmd3RlLmNoPgorCisqLworCisjaWZuZGVmIF9JQ1BfTVVMVElfSF8KKyNkZWZpbmUgX0lDUF9NVUxUSV9IXworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHBjaWxzdF9zdHJ1Y3QgeworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICpuZXh0OworCWludCB1c2VkOworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJdW5zaWduZWQgc2hvcnQgdmVuZG9yOworCXVuc2lnbmVkIHNob3J0IGRldmljZTsKKwl1bnNpZ25lZCBjaGFyIHBjaV9idXM7CisJdW5zaWduZWQgY2hhciBwY2lfc2xvdDsKKwl1bnNpZ25lZCBjaGFyIHBjaV9mdW5jOworCXJlc291cmNlX3NpemVfdCBpb19hZGRyWzVdOworCXVuc2lnbmVkIGludCBpcnE7Cit9OworCitzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmFfZGV2aWNlczsJLy8gcHRyIHRvIHJvb3QgbGlzdCBvZiBhbGwgSW5vdmEgZGV2aWNlcworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgcGNpX2NhcmRfbGlzdF9pbml0KHVuc2lnbmVkIHNob3J0IHBjaV92ZW5kb3IsIGNoYXIgZGlzcGxheSk7CitzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2NsZWFudXAodW5zaWduZWQgc2hvcnQgcGNpX3ZlbmRvcik7CitzdGF0aWMgc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmZpbmRfZnJlZV9wY2lfY2FyZF9ieV9kZXZpY2UodW5zaWduZWQgc2hvcnQKKwl2ZW5kb3JfaWQsIHVuc2lnbmVkIHNob3J0IGRldmljZV9pZCk7CitzdGF0aWMgaW50IGZpbmRfZnJlZV9wY2lfY2FyZF9ieV9wb3NpdGlvbih1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLCB1bnNpZ25lZCBzaG9ydCBwY2lfYnVzLAorCXVuc2lnbmVkIHNob3J0IHBjaV9zbG90LCBzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqKmNhcmQpOworc3RhdGljIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICpzZWxlY3RfYW5kX2FsbG9jX3BjaV9jYXJkKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsIHVuc2lnbmVkIHNob3J0IHBjaV9idXMsCisJdW5zaWduZWQgc2hvcnQgcGNpX3Nsb3QpOworCitzdGF0aWMgaW50IHBjaV9jYXJkX2FsbG9jKHN0cnVjdCBwY2lsc3Rfc3RydWN0ICphbWNjKTsKK3N0YXRpYyBpbnQgcGNpX2NhcmRfZnJlZShzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqYW1jYyk7CitzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2Rpc3BsYXkodm9pZCk7CitzdGF0aWMgaW50IHBjaV9jYXJkX2RhdGEoc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmFtY2MsCisJdW5zaWduZWQgY2hhciAqcGNpX2J1cywgdW5zaWduZWQgY2hhciAqcGNpX3Nsb3QsCisJdW5zaWduZWQgY2hhciAqcGNpX2Z1bmMsIHJlc291cmNlX3NpemVfdCAqIGlvX2FkZHIsIHVuc2lnbmVkIGludCAqaXJxKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGJ1aWxkIGxpc3Qgb2YgSW5vdmEgY2FyZHMgaW4gdGhpcyBzeXN0ZW0gKi8KK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfaW5pdCh1bnNpZ25lZCBzaG9ydCBwY2lfdmVuZG9yLCBjaGFyIGRpc3BsYXkpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsICpsYXN0OworCWludCBpOworCisJaW5vdmFfZGV2aWNlcyA9IE5VTEw7CisJbGFzdCA9IE5VTEw7CisKKwlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOworCQlwY2lkZXYgIT0gTlVMTDsKKwkJcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpZGV2KSkgeworCQlpZiAocGNpZGV2LT52ZW5kb3IgPT0gcGNpX3ZlbmRvcikgeworCQkJaW5vdmEgPSBrbWFsbG9jKHNpemVvZigqaW5vdmEpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghaW5vdmEpIHsKKwkJCQlwcmludGsoImljcF9tdWx0aTogcGNpX2NhcmRfbGlzdF9pbml0OiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcGNpX2Rldl9wdXQocGNpZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1lbXNldChpbm92YSwgMCwgc2l6ZW9mKCppbm92YSkpOworCisJCQlpbm92YS0+cGNpZGV2ID0gcGNpX2Rldl9nZXQocGNpZGV2KTsKKwkJCWlmIChsYXN0KSB7CisJCQkJbGFzdC0+bmV4dCA9IGlub3ZhOworCQkJfSBlbHNlIHsKKwkJCQlpbm92YV9kZXZpY2VzID0gaW5vdmE7CisJCQl9CisJCQlsYXN0ID0gaW5vdmE7CisKKwkJCWlub3ZhLT52ZW5kb3IgPSBwY2lkZXYtPnZlbmRvcjsKKwkJCWlub3ZhLT5kZXZpY2UgPSBwY2lkZXYtPmRldmljZTsKKwkJCWlub3ZhLT5wY2lfYnVzID0gcGNpZGV2LT5idXMtPm51bWJlcjsKKwkJCWlub3ZhLT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBjaWRldi0+ZGV2Zm4pOworCQkJaW5vdmEtPnBjaV9mdW5jID0gUENJX0ZVTkMocGNpZGV2LT5kZXZmbik7CisJCQkvKiBOb3RlOiByZXNvdXJjZXMgbWF5IGJlIGludmFsaWQgaWYgUENJIGRldmljZQorCQkJICogbm90IGVuYWJsZWQsIGJ1dCB0aGV5IGFyZSBjb3JyZWN0ZWQgaW4KKwkJCSAqIHBjaV9jYXJkX2FsbG9jLiAqLworCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJCQlpbm92YS0+aW9fYWRkcltpXSA9CisJCQkJCXBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIGkpOworCQkJaW5vdmEtPmlycSA9IHBjaWRldi0+aXJxOworCQl9CisJfQorCisJaWYgKGRpc3BsYXkpCisJCXBjaV9jYXJkX2xpc3RfZGlzcGxheSgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZyZWUgdXAgbGlzdCBvZiBhbWNjIGNhcmRzIGluIHRoaXMgc3lzdGVtICovCitzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2NsZWFudXAodW5zaWduZWQgc2hvcnQgcGNpX3ZlbmRvcikKK3sKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsICpuZXh0OworCisJZm9yIChpbm92YSA9IGlub3ZhX2RldmljZXM7IGlub3ZhOyBpbm92YSA9IG5leHQpIHsKKwkJbmV4dCA9IGlub3ZhLT5uZXh0OworCQlwY2lfZGV2X3B1dChpbm92YS0+cGNpZGV2KTsKKwkJa2ZyZWUoaW5vdmEpOworCX0KKworCWlub3ZhX2RldmljZXMgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZpbmQgZmlyc3QgdW51c2VkIGNhcmQgd2l0aCB0aGlzIGRldmljZV9pZCAqLworc3RhdGljIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICpmaW5kX2ZyZWVfcGNpX2NhcmRfYnlfZGV2aWNlKHVuc2lnbmVkIHNob3J0CisJdmVuZG9yX2lkLCB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQpCit7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhLCAqbmV4dDsKKworCWZvciAoaW5vdmEgPSBpbm92YV9kZXZpY2VzOyBpbm92YTsgaW5vdmEgPSBuZXh0KSB7CisJCW5leHQgPSBpbm92YS0+bmV4dDsKKwkJaWYgKCghaW5vdmEtPnVzZWQpICYmIChpbm92YS0+ZGV2aWNlID09IGRldmljZV9pZCkKKwkJCSYmIChpbm92YS0+dmVuZG9yID09IHZlbmRvcl9pZCkpCisJCQlyZXR1cm4gaW5vdmE7CisKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBmaW5kIGNhcmQgb24gcmVxdWVzdGVkIHBvc2l0aW9uICovCitzdGF0aWMgaW50IGZpbmRfZnJlZV9wY2lfY2FyZF9ieV9wb3NpdGlvbih1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLCB1bnNpZ25lZCBzaG9ydCBwY2lfYnVzLAorCXVuc2lnbmVkIHNob3J0IHBjaV9zbG90LCBzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqKmNhcmQpCit7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhLCAqbmV4dDsKKworCSpjYXJkID0gTlVMTDsKKwlmb3IgKGlub3ZhID0gaW5vdmFfZGV2aWNlczsgaW5vdmE7IGlub3ZhID0gbmV4dCkgeworCQluZXh0ID0gaW5vdmEtPm5leHQ7CisJCWlmICgoaW5vdmEtPnZlbmRvciA9PSB2ZW5kb3JfaWQpICYmIChpbm92YS0+ZGV2aWNlID09IGRldmljZV9pZCkKKwkJCSYmIChpbm92YS0+cGNpX2J1cyA9PSBwY2lfYnVzKQorCQkJJiYgKGlub3ZhLT5wY2lfc2xvdCA9PSBwY2lfc2xvdCkpIHsKKwkJCWlmICghKGlub3ZhLT51c2VkKSkgeworCQkJCSpjYXJkID0gaW5vdmE7CisJCQkJcmV0dXJuIDA7CS8vIG9rLCBjYXJkIGlzIGZvdW5kCisJCQl9IGVsc2UgeworCQkJCXJldHVybiAyOwkvLyBjYXJkIGV4aXN0IGJ1dCBpcyB1c2VkCisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMTsJCS8vIG5vIGNhcmQgZm91bmQKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBtYXJrIGNhcmQgYXMgdXNlZCAqLworc3RhdGljIGludCBwY2lfY2FyZF9hbGxvYyhzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEpCit7CisJaW50IGk7CisKKwlpZiAoIWlub3ZhKSB7CisJCXJ0X3ByaW50aygiIC0gQlVHISEgaW5vdmEgaXMgTlVMTCFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGlub3ZhLT51c2VkKQorCQlyZXR1cm4gMTsKKwlpZiAoY29tZWRpX3BjaV9lbmFibGUoaW5vdmEtPnBjaWRldiwgImljcF9tdWx0aSIpKSB7CisJCXJ0X3ByaW50aygiIC0gQ2FuJ3QgZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucyFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIFJlc291cmNlcyB3aWxsIGJlIGFjY3VyYXRlIG5vdy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlpbm92YS0+aW9fYWRkcltpXSA9IHBjaV9yZXNvdXJjZV9zdGFydChpbm92YS0+cGNpZGV2LCBpKTsKKwlpbm92YS0+aXJxID0gaW5vdmEtPnBjaWRldi0+aXJxOworCWlub3ZhLT51c2VkID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBtYXJrIGNhcmQgYXMgZnJlZSAqLworc3RhdGljIGludCBwY2lfY2FyZF9mcmVlKHN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSkKK3sKKwlpZiAoIWlub3ZhKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWlub3ZhLT51c2VkKQorCQlyZXR1cm4gMTsKKwlpbm92YS0+dXNlZCA9IDA7CisJY29tZWRpX3BjaV9kaXNhYmxlKGlub3ZhLT5wY2lkZXYpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGRpc3BsYXkgbGlzdCBvZiBmb3VuZCBjYXJkcyAqLworc3RhdGljIHZvaWQgcGNpX2NhcmRfbGlzdF9kaXNwbGF5KHZvaWQpCit7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhLCAqbmV4dDsKKworCXByaW50aygiQW5uZSdzIExpc3Qgb2YgcGNpIGNhcmRzXG4iKTsKKwlwcmludGsoImJ1czpzbG90OmZ1bmMgdmVuZG9yIGRldmljZSBpb19pbm92YSBpb19kYXEgaXJxIHVzZWRcbiIpOworCisJZm9yIChpbm92YSA9IGlub3ZhX2RldmljZXM7IGlub3ZhOyBpbm92YSA9IG5leHQpIHsKKwkJbmV4dCA9IGlub3ZhLT5uZXh0OworCQlwcmludGsoIiUyZCAgICUyZCAgICUyZCAgMHglNHggMHglNHggICAweCU4bGx4IDB4JThsbHggICUydSAgJTJkXG4iLCBpbm92YS0+cGNpX2J1cywgaW5vdmEtPnBjaV9zbG90LCBpbm92YS0+cGNpX2Z1bmMsIGlub3ZhLT52ZW5kb3IsIGlub3ZhLT5kZXZpY2UsICh1bnNpZ25lZCBsb25nIGxvbmcpaW5vdmEtPmlvX2FkZHJbMF0sICh1bnNpZ25lZCBsb25nIGxvbmcpaW5vdmEtPmlvX2FkZHJbMl0sIGlub3ZhLT5pcnEsIGlub3ZhLT51c2VkKTsKKworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiByZXR1cm4gYWxsIGNhcmQgaW5mb3JtYXRpb24gZm9yIGRyaXZlciAqLworc3RhdGljIGludCBwY2lfY2FyZF9kYXRhKHN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSwKKwl1bnNpZ25lZCBjaGFyICpwY2lfYnVzLCB1bnNpZ25lZCBjaGFyICpwY2lfc2xvdCwKKwl1bnNpZ25lZCBjaGFyICpwY2lfZnVuYywgcmVzb3VyY2Vfc2l6ZV90ICogaW9fYWRkciwgdW5zaWduZWQgaW50ICppcnEpCit7CisJaW50IGk7CisKKwlpZiAoIWlub3ZhKQorCQlyZXR1cm4gLTE7CisJKnBjaV9idXMgPSBpbm92YS0+cGNpX2J1czsKKwkqcGNpX3Nsb3QgPSBpbm92YS0+cGNpX3Nsb3Q7CisJKnBjaV9mdW5jID0gaW5vdmEtPnBjaV9mdW5jOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWlvX2FkZHJbaV0gPSBpbm92YS0+aW9fYWRkcltpXTsKKwkqaXJxID0gaW5vdmEtPmlycTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzZWxlY3QgYW5kIGFsbG9jIGNhcmQgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqc2VsZWN0X2FuZF9hbGxvY19wY2lfY2FyZCh1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLCB1bnNpZ25lZCBzaG9ydCBwY2lfYnVzLAorCXVuc2lnbmVkIHNob3J0IHBjaV9zbG90KQoreworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICpjYXJkOworCWludCBlcnI7CisKKwlpZiAoKHBjaV9idXMgPCAxKSAmIChwY2lfc2xvdCA8IDEpKSB7CS8vIHVzZSBhdXRvZGV0ZWN0aW9uCisJCWlmICgoY2FyZCA9IGZpbmRfZnJlZV9wY2lfY2FyZF9ieV9kZXZpY2UodmVuZG9yX2lkLAorCQkJCQlkZXZpY2VfaWQpKSA9PSBOVUxMKSB7CisJCQlydF9wcmludGsoIiAtIFVudXNlZCBjYXJkIG5vdCBmb3VuZCBpbiBzeXN0ZW0hXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChmaW5kX2ZyZWVfcGNpX2NhcmRfYnlfcG9zaXRpb24odmVuZG9yX2lkLCBkZXZpY2VfaWQsCisJCQkJcGNpX2J1cywgcGNpX3Nsb3QsICZjYXJkKSkgeworCQljYXNlIDE6CisJCQlydF9wcmludGsKKwkJCQkoIiAtIENhcmQgbm90IGZvdW5kIG9uIHJlcXVlc3RlZCBwb3NpdGlvbiBiOnMgJWQ6JWQhXG4iLAorCQkJCXBjaV9idXMsIHBjaV9zbG90KTsKKwkJCXJldHVybiBOVUxMOworCQljYXNlIDI6CisJCQlydF9wcmludGsKKwkJCQkoIiAtIENhcmQgb24gcmVxdWVzdGVkIHBvc2l0aW9uIGlzIHVzZWQgYjpzICVkOiVkIVxuIiwKKwkJCQlwY2lfYnVzLCBwY2lfc2xvdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWlmICgoZXJyID0gcGNpX2NhcmRfYWxsb2MoY2FyZCkpICE9IDApIHsKKwkJaWYgKGVyciA+IDApCisJCQlydF9wcmludGsoIiAtIENhbid0IGFsbG9jYXRlIGNhcmQhXG4iKTsKKwkJLyogZWxzZTogZXJyb3IgYWxyZWFkeSBwcmludGVkLiAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gY2FyZDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzMmFhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwpAQCAtMCwwICsxLDIzNjIgQEAKKy8qCisgICBjb21lZGkvZHJpdmVycy9tZTQwMDAuYworICAgU291cmNlIGNvZGUgZm9yIHRoZSBNZWlsaGF1cyBNRS00MDAwIGJvYXJkIGZhbWlseS4KKworICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKi8KKy8qCitEcml2ZXI6IG1lNDAwMAorRGVzY3JpcHRpb246IE1laWxoYXVzIE1FLTQwMDAgc2VyaWVzIGJvYXJkcworRGV2aWNlczogW01laWxoYXVzXSBNRS00NjUwIChtZTQwMDApLCBNRS00NjcwaSwgTUUtNDY4MCwgTUUtNDY4MGksIE1FLTQ2ODBpcworQXV0aG9yOiBnZyAoR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5jb20+KQorVXBkYXRlZDogTW9uLCAxOCBNYXIgMjAwMiAxNTozNDowMSAtMDgwMAorU3RhdHVzOiBicm9rZW4gKG5vIHN1cHBvcnQgZm9yIGxvYWRpbmcgZmlybXdhcmUpCisKK1N1cHBvcnRzOgorCisgICAgLSBBbmFsb2cgSW5wdXQKKyAgICAtIEFuYWxvZyBPdXRwdXQKKyAgICAtIERpZ2l0YWwgSS9PCisgICAgLSBDb3VudGVyCisKK0NvbmZpZ3VyYXRpb24gT3B0aW9uczoKKworICAgIFswXSAtIFBDSSBidXMgbnVtYmVyIChvcHRpb25hbCkKKyAgICBbMV0gLSBQQ0kgc2xvdCBudW1iZXIgKG9wdGlvbmFsKQorCisgICAgSWYgYnVzL3Nsb3QgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZpcnN0IGF2YWlsYWJsZSBQQ0kKKyAgICBkZXZpY2Ugd2lsbCBiZSB1c2VkLgorCitUaGUgZmlybXdhcmUgcmVxdWlyZWQgYnkgdGhlc2UgYm9hcmRzIGlzIGF2YWlsYWJsZSBpbiB0aGUKK2NvbWVkaV9ub25mcmVlX2Zpcm13YXJlIHRhcmJhbGwgYXZhaWxhYmxlIGZyb20KK2h0dHA6Ly93d3cuY29tZWRpLm9yZy4gIEhvd2V2ZXIsIHRoZSBkcml2ZXIncyBzdXBwb3J0IGZvcgorbG9hZGluZyB0aGUgZmlybXdhcmUgdGhyb3VnaCBjb21lZGlfY29uZmlnIGlzIGN1cnJlbnRseQorYnJva2VuLgorCisgKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgImNvbWVkaV9wY2kuaCIKKyNpbmNsdWRlICJtZTQwMDAuaCIKKyNpZiAwCisvKiBmaWxlIHJlbW92ZWQgZHVlIHRvIEdQTCBpbmNvbXBhdGliaWxpdHkgKi8KKyNpbmNsdWRlICJtZTQwMDBfZncuaCIKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFBDSSBkZXZpY2UgdGFibGUuCisgIFRoaXMgaXMgdXNlZCBieSBtb2Rwcm9iZSB0byB0cmFuc2xhdGUgUENJIElEcyB0byBkcml2ZXJzLgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUobWU0MDAwX3BjaV90YWJsZSkgPSB7CisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjYwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjYzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NzMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY4MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY4MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY4MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY4MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtZTQwMDBfcGNpX3RhYmxlKTsKKworc3RhdGljIGNvbnN0IG1lNDAwMF9ib2FyZF90IG1lNDAwMF9ib2FyZHNbXSA9IHsKKwl7Ik1FLTQ2NTAiLCAweDQ2NTAsIHswLCAwfSwgezE2LCAwLCAwLCAwfSwgezR9LCB7MH19LAorCisJeyJNRS00NjYwIiwgMHg0NjYwLCB7MCwgMH0sIHszMiwgMCwgMTYsIDB9LCB7NH0sIHszfX0sCisJeyJNRS00NjYwaSIsIDB4NDY2MSwgezAsIDB9LCB7MzIsIDAsIDE2LCAwfSwgezR9LCB7M319LAorCXsiTUUtNDY2MHMiLCAweDQ2NjIsIHswLCAwfSwgezMyLCA4LCAxNiwgMH0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2NjBpcyIsIDB4NDY2MywgezAsIDB9LCB7MzIsIDgsIDE2LCAwfSwgezR9LCB7M319LAorCisJeyJNRS00NjcwIiwgMHg0NjcwLCB7NCwgMH0sIHszMiwgMCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjcwaSIsIDB4NDY3MSwgezQsIDB9LCB7MzIsIDAsIDE2LCAxfSwgezR9LCB7M319LAorCXsiTUUtNDY3MHMiLCAweDQ2NzIsIHs0LCAwfSwgezMyLCA4LCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2NzBpcyIsIDB4NDY3MywgezQsIDB9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M319LAorCisJeyJNRS00NjgwIiwgMHg0NjgwLCB7NCwgNH0sIHszMiwgMCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjgwaSIsIDB4NDY4MSwgezQsIDR9LCB7MzIsIDAsIDE2LCAxfSwgezR9LCB7M319LAorCXsiTUUtNDY4MHMiLCAweDQ2ODIsIHs0LCA0fSwgezMyLCA4LCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2ODBpcyIsIDB4NDY4MywgezQsIDR9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M319LAorCisJezB9LAorfTsKKworI2RlZmluZSBNRTQwMDBfQk9BUkRfVkVSU0lPTlMgKHNpemVvZihtZTQwMDBfYm9hcmRzKSAvIHNpemVvZihtZTQwMDBfYm9hcmRfdCkgLSAxKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIENvbWVkaSBmdW5jdGlvbiBwcm90b3R5cGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1lNDAwMF9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KTsKK3N0YXRpYyBpbnQgbWU0MDAwX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl9tZTQwMDAgPSB7CisgICAgICBkcml2ZXJfbmFtZToibWU0MDAwIiwKKyAgICAgIG1vZHVsZTpUSElTX01PRFVMRSwKKyAgICAgIGF0dGFjaDptZTQwMDBfYXR0YWNoLAorICAgICAgZGV0YWNoOm1lNDAwMF9kZXRhY2gsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1laWxoYXVzIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWU0MDAwX3Byb2JlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCk7CitzdGF0aWMgaW50IGdldF9yZWdpc3RlcnMoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfcCk7CitzdGF0aWMgaW50IGluaXRfYm9hcmRfaW5mbyhjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9wKTsKK3N0YXRpYyBpbnQgaW5pdF9hb19jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCBpbml0X2FpX2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IGluaXRfZGlvX2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IGluaXRfY250X2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IHhpbGlueF9kb3dubG9hZChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgcmVzZXRfYm9hcmQoY29tZWRpX2RldmljZSAqIGRldik7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IG1lNDAwMF9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IGNudF9yZXNldChjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CisKK3N0YXRpYyBpbnQgY250X2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCXVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgbW9kZSk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfY250X2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKKworc3RhdGljIGludCBhaV9jaGVja19jaGFubGlzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKTsKKworc3RhdGljIGludCBhaV9yb3VuZF9jbWRfYXJncyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQsCisJdW5zaWduZWQgaW50ICppbml0X3RpY2tzLAorCXVuc2lnbmVkIGludCAqc2Nhbl90aWNrcywgdW5zaWduZWQgaW50ICpjaGFuX3RpY2tzKTsKKworc3RhdGljIGludCBhaV9wcmVwYXJlKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCwKKwl1bnNpZ25lZCBpbnQgaW5pdF90aWNrcywKKwl1bnNpZ25lZCBpbnQgc2Nhbl90aWNrcywgdW5zaWduZWQgaW50IGNoYW5fdGlja3MpOworCitzdGF0aWMgaW50IGFpX3dyaXRlX2NoYW5saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU0MDAwX2FpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQgUFRfUkVHU19BUkcpOworCitzdGF0aWMgaW50IG1lNDAwMF9haV9kb19jbWRfdGVzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKTsKKworc3RhdGljIGludCBtZTQwMDBfYWlfZG9fY21kKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKKworc3RhdGljIGludCBtZTQwMDBfYW9faW5zbl93cml0ZShjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FvX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWVpbGhhdXMgaW5saW5lIGZ1bmN0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWU0MDAwX291dGIoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgY2hhciB2YWx1ZSwKKwl1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJUE9SVF9QREVCVUcoIi0tPiAweCUwMlggcG9ydCAweCUwNGxYXG4iLCB2YWx1ZSwgcG9ydCk7CisJb3V0Yih2YWx1ZSwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZTQwMDBfb3V0bChjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIHZhbHVlLAorCXVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlQT1JUX1BERUJVRygiLS0+IDB4JTA4bFggcG9ydCAweCUwNGxYXG4iLCB2YWx1ZSwgcG9ydCk7CisJb3V0bCh2YWx1ZSwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtZTQwMDBfaW5sKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXZhbHVlID0gaW5sKHBvcnQpOworCVBPUlRfUERFQlVHKCI8LS0gMHglMDhsWCBwb3J0IDB4JTA0bFhcbiIsIHZhbHVlLCBwb3J0KTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtZTQwMDBfaW5iKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOworCXZhbHVlID0gaW5iKHBvcnQpOworCVBPUlRfUERFQlVHKCI8LS0gMHglMDhYIHBvcnQgMHglMDRsWFxuIiwgdmFsdWUsIHBvcnQpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgbWU0MDAwX2FpX3JhbmdlID0geworCTQsCisJeworCQkJVU5JX1JBTkdFKDIuNSksCisJCQlVTklfUkFOR0UoMTApLAorCQkJQklQX1JBTkdFKDIuNSksCisJCQlCSVBfUkFOR0UoMTApLAorCQl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBtZTQwMDBfYW9fcmFuZ2UgPSB7CisJMSwKKwl7CisJCQlCSVBfUkFOR0UoMTApLAorCQl9Cit9OworCitzdGF0aWMgaW50IG1lNDAwMF9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJlc3VsdDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfYXR0YWNoKClcbiIpOworCisJcmVzdWx0ID0gbWU0MDAwX3Byb2JlKGRldiwgaXQpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlcy4gIGFsbG9jX3N1YmRldmljZSgpIGlzIGEKKwkgKiBjb252ZW5pZW50IG1hY3JvIGRlZmluZWQgaW4gY29tZWRpZGV2LmguICBJdCByZWxpZXMgb24KKwkgKiBuX3N1YmRldmljZXMgYmVpbmcgc2V0IGNvcnJlY3RseS4KKwkgKi8KKwlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIEFuYWxvZyBpbnB1dCBzdWJkZXZpY2UKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKworCWlmICh0aGlzYm9hcmQtPmFpLmNvdW50KSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0KKwkJCVNERl9SRUFEQUJMRSB8IFNERl9DT01NT04gfCBTREZfR1JPVU5EIHwgU0RGX0RJRkY7CisJCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YWkuY291bnQ7CisJCXMtPm1heGRhdGEgPSAweEZGRkY7CS8vIDE2IGJpdCBBREMKKwkJcy0+bGVuX2NoYW5saXN0ID0gTUU0MDAwX0FJX0NIQU5ORUxfTElTVF9DT1VOVDsKKwkJcy0+cmFuZ2VfdGFibGUgPSAmbWU0MDAwX2FpX3JhbmdlOworCQlzLT5pbnNuX3JlYWQgPSBtZTQwMDBfYWlfaW5zbl9yZWFkOworCisJCWlmIChpbmZvLT5pcnEgPiAwKSB7CisJCQlpZiAoY29tZWRpX3JlcXVlc3RfaXJxKGluZm8tPmlycSwgbWU0MDAwX2FpX2lzciwKKwkJCQkJSVJRRl9TSEFSRUQsICJNRS00MDAwIiwgZGV2KSkgeworCQkJCXByaW50aygiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2F0dGFjaCgpOiBVbmFibGUgdG8gYWxsb2NhdGUgaXJxXG4iLCBkZXYtPm1pbm9yKTsKKwkJCX0gZWxzZSB7CisJCQkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9DTURfUkVBRDsKKwkJCQlzLT5jYW5jZWwgPSBtZTQwMDBfYWlfY2FuY2VsOworCQkJCXMtPmRvX2NtZHRlc3QgPSBtZTQwMDBfYWlfZG9fY21kX3Rlc3Q7CisJCQkJcy0+ZG9fY21kID0gbWU0MDAwX2FpX2RvX2NtZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2F0dGFjaCgpOiBObyBpbnRlcnJ1cHQgYXZhaWxhYmxlXG4iLAorCQkJCWRldi0+bWlub3IpOworCQl9CisJfSBlbHNlIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CisKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIEFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisKKwlpZiAodGhpc2JvYXJkLT5hby5jb3VudCkgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklURUFCTEUgfCBTREZfQ09NTU9OIHwgU0RGX0dST1VORDsKKwkJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5hby5jb3VudDsKKwkJcy0+bWF4ZGF0YSA9IDB4RkZGRjsJLy8gMTYgYml0IERBQworCQlzLT5yYW5nZV90YWJsZSA9ICZtZTQwMDBfYW9fcmFuZ2U7CisJCXMtPmluc25fd3JpdGUgPSBtZTQwMDBfYW9faW5zbl93cml0ZTsKKwkJcy0+aW5zbl9yZWFkID0gbWU0MDAwX2FvX2luc25fcmVhZDsKKwl9IGVsc2UgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KKworICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgRGlnaXRhbCBJL08gc3ViZGV2aWNlCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDI7CisKKwlpZiAodGhpc2JvYXJkLT5kaW8uY291bnQpIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCQlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmRpby5jb3VudCAqIDg7CisJCXMtPm1heGRhdGEgPSAxOworCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCQlzLT5pbnNuX2JpdHMgPSBtZTQwMDBfZGlvX2luc25fYml0czsKKwkJcy0+aW5zbl9jb25maWcgPSBtZTQwMDBfZGlvX2luc25fY29uZmlnOworCX0gZWxzZSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3Igb3B0b2lzb2xhdGVkIE1FLTQwMDAgdmVyc2lvbi4gSWYgb25lIHRoZSBmaXJzdAorCSAqIHBvcnQgaXMgYSBmaXhlZCBvdXRwdXQgcG9ydCBhbmQgdGhlIHNlY29uZCBpcyBhIGZpeGVkIGlucHV0IHBvcnQuCisJICovCisJaWYgKCFtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQuZGlyX3JlZykpIHsKKwkJcy0+aW9fYml0cyB8PSAweEZGOworCQltZTQwMDBfb3V0bChkZXYsIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wLAorCQkJaW5mby0+ZGlvX2NvbnRleHQuZGlyX3JlZyk7CisJfQorCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBDb3VudGVyIHN1YmRldmljZQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCisJaWYgKHRoaXNib2FyZC0+Y250LmNvdW50KSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+Y250LmNvdW50OworCQlzLT5tYXhkYXRhID0gMHhGRkZGOwkvLyAxNiBiaXQgY291bnRlcnMKKwkJcy0+aW5zbl9yZWFkID0gbWU0MDAwX2NudF9pbnNuX3JlYWQ7CisJCXMtPmluc25fd3JpdGUgPSBtZTQwMDBfY250X2luc25fd3JpdGU7CisJCXMtPmluc25fY29uZmlnID0gbWU0MDAwX2NudF9pbnNuX2NvbmZpZzsKKwl9IGVsc2UgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9wcm9iZShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2U7CisJaW50IHJlc3VsdCwgaTsKKwltZTQwMDBfYm9hcmRfdCAqYm9hcmQ7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX3Byb2JlKClcbiIpOworCisJLyogQWxsb2NhdGUgcHJpdmF0ZSBtZW1vcnkgKi8KKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihtZTQwMDBfaW5mb190KSkgPCAwKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKgorCSAqIFByb2JlIHRoZSBkZXZpY2UgdG8gZGV0ZXJtaW5lIHdoYXQgZGV2aWNlIGluIHRoZSBzZXJpZXMgaXQgaXMuCisJICovCisJZm9yIChwY2lfZGV2aWNlID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaV9kZXZpY2UgIT0gTlVMTDsKKwkJcGNpX2RldmljZSA9CisJCXBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXZpY2UpKSB7CisJCWlmIChwY2lfZGV2aWNlLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9NRUlMSEFVUykgeworCQkJZm9yIChpID0gMDsgaSA8IE1FNDAwMF9CT0FSRF9WRVJTSU9OUzsgaSsrKSB7CisJCQkJaWYgKG1lNDAwMF9ib2FyZHNbaV0uZGV2aWNlX2lkID09CisJCQkJCXBjaV9kZXZpY2UtPmRldmljZSkgeworCQkJCQkvKiBXYXMgYSBwYXJ0aWN1bGFyIGJ1cy9zbG90IHJlcXVlc3RlZD8gKi8KKwkJCQkJaWYgKChpdC0+b3B0aW9uc1swXSAhPSAwKQorCQkJCQkJfHwgKGl0LT5vcHRpb25zWzFdICE9IDApKSB7CisJCQkJCQkvKiBBcmUgd2Ugb24gdGhlIHdyb25nIGJ1cy9zbG90PyAqLworCQkJCQkJaWYgKHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyICE9CisJCQkJCQkJaXQtPm9wdGlvbnNbMF0KKwkJCQkJCQl8fCBQQ0lfU0xPVChwY2lfZGV2aWNlLT4KKwkJCQkJCQkJZGV2Zm4pICE9CisJCQkJCQkJaXQtPm9wdGlvbnNbMV0pIHsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlkZXYtPmJvYXJkX3B0ciA9IG1lNDAwMF9ib2FyZHMgKyBpOworCQkJCQlib2FyZCA9IChtZTQwMDBfYm9hcmRfdCAqKSBkZXYtPgorCQkJCQkJYm9hcmRfcHRyOworCQkJCQlpbmZvLT5wY2lfZGV2X3AgPSBwY2lfZGV2aWNlOworCQkJCQlnb3RvIGZvdW5kOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaW50ayhLRVJOX0VSUgorCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IE5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKKwkJZGV2LT5taW5vciwgaXQtPm9wdGlvbnNbMF0sIGl0LT5vcHRpb25zWzFdKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgZm91bmQ6CisKKwlwcmludGsoS0VSTl9JTkZPCisJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogRm91bmQgJXMgYXQgUENJIGJ1cyAlZCwgc2xvdCAlZFxuIiwKKwkJZGV2LT5taW5vciwgbWU0MDAwX2JvYXJkc1tpXS5uYW1lLCBwY2lfZGV2aWNlLT5idXMtPm51bWJlciwKKwkJUENJX1NMT1QocGNpX2RldmljZS0+ZGV2Zm4pKTsKKworCS8qIFNldCBkYXRhIGluIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlkZXYtPmJvYXJkX25hbWUgPSBib2FyZC0+bmFtZTsKKworCS8qIEVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnMgKi8KKwlyZXN1bHQgPSBjb21lZGlfcGNpX2VuYWJsZShwY2lfZGV2aWNlLCBkZXYtPmJvYXJkX25hbWUpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCBJL08gcmVnaW9uc1xuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEdldCB0aGUgUENJIGJhc2UgcmVnaXN0ZXJzICovCisJcmVzdWx0ID0gZ2V0X3JlZ2lzdGVycyhkZXYsIHBjaV9kZXZpY2UpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBnZXQgcmVnaXN0ZXJzXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qIEluaXRpYWxpemUgYm9hcmQgaW5mbyAqLworCXJlc3VsdCA9IGluaXRfYm9hcmRfaW5mbyhkZXYsIHBjaV9kZXZpY2UpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBpbml0IGJhb3JkIGluZm9cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBJbml0IGFuYWxvZyBvdXRwdXQgY29udGV4dCAqLworCXJlc3VsdCA9IGluaXRfYW9fY29udGV4dChkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBpbml0IGFvIGNvbnRleHRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBJbml0IGFuYWxvZyBpbnB1dCBjb250ZXh0ICovCisJcmVzdWx0ID0gaW5pdF9haV9jb250ZXh0KGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgYWkgY29udGV4dFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEluaXQgZGlnaXRhbCBJL08gY29udGV4dCAqLworCXJlc3VsdCA9IGluaXRfZGlvX2NvbnRleHQoZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgaW5pdCBkaW8gY29udGV4dFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEluaXQgY291bnRlciBjb250ZXh0ICovCisJcmVzdWx0ID0gaW5pdF9jbnRfY29udGV4dChkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBpbml0IGNudCBjb250ZXh0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogRG93bmxvYWQgdGhlIHhpbGlueCBmaXJtd2FyZSAqLworCXJlc3VsdCA9IHhpbGlueF9kb3dubG9hZChkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbid0IGRvd25sb2FkIGZpcm13YXJlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogTWFrZSBhIGhhcmR3YXJlIHJlc2V0ICovCisJcmVzdWx0ID0gcmVzZXRfYm9hcmQoZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW4ndCByZXNldCBib2FyZFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9yZWdpc3RlcnMoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfcCkKK3sKKworCUNBTExfUERFQlVHKCJJbiBnZXRfcmVnaXN0ZXJzKClcbiIpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGx4IHJlZ2Jhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWluZm8tPnBseF9yZWdiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZfcCwgMSk7CisJaWYgKGluZm8tPnBseF9yZWdiYXNlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiBQQ0kgYmFzZSBhZGRyZXNzIDEgaXMgbm90IGF2YWlsYWJsZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaW5mby0+cGx4X3JlZ2Jhc2Vfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldl9wLCAxKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lNDAwMCByZWdiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlpbmZvLT5tZTQwMDBfcmVnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2X3AsIDIpOworCWlmIChpbmZvLT5tZTQwMDBfcmVnYmFzZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGdldF9yZWdpc3RlcnMoKTogUENJIGJhc2UgYWRkcmVzcyAyIGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWluZm8tPm1lNDAwMF9yZWdiYXNlX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZfcCwgMik7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0aW1lciByZWdiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlpbmZvLT50aW1lcl9yZWdiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZfcCwgMyk7CisJaWYgKGluZm8tPnRpbWVyX3JlZ2Jhc2UgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBnZXRfcmVnaXN0ZXJzKCk6IFBDSSBiYXNlIGFkZHJlc3MgMyBpcyBub3QgYXZhaWxhYmxlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpbmZvLT50aW1lcl9yZWdiYXNlX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZfcCwgMyk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm9ncmFtIHJlZ2Jhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWluZm8tPnByb2dyYW1fcmVnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2X3AsIDUpOworCWlmIChpbmZvLT5wcm9ncmFtX3JlZ2Jhc2UgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBnZXRfcmVnaXN0ZXJzKCk6IFBDSSBiYXNlIGFkZHJlc3MgNSBpcyBub3QgYXZhaWxhYmxlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpbmZvLT5wcm9ncmFtX3JlZ2Jhc2Vfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldl9wLCA1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfYm9hcmRfaW5mbyhjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9wKQoreworCWludCByZXN1bHQ7CisKKwlDQUxMX1BERUJVRygiSW4gaW5pdF9ib2FyZF9pbmZvKClcbiIpOworCisJLyogSW5pdCBzcGluIGxvY2tzICovCisJLy9zcGluX2xvY2tfaW5pdCgmaW5mby0+cHJlbG9hZF9sb2NrKTsKKwkvL3NwaW5fbG9ja19pbml0KCZpbmZvLT5haV9jdHJsX2xvY2spOworCisJLyogR2V0IHRoZSBzZXJpYWwgbnVtYmVyICovCisJcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXZfcCwgMHgyQywgJmluZm8tPnNlcmlhbF9ubyk7CisJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBHZXQgdGhlIGhhcmR3YXJlIHJldmlzaW9uICovCisJcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2Rldl9wLCAweDA4LCAmaW5mby0+aHdfcmV2aXNpb24pOworCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogR2V0IHRoZSB2ZW5kb3IgaWQgKi8KKwlpbmZvLT52ZW5kb3JfaWQgPSBwY2lfZGV2X3AtPnZlbmRvcjsKKworCS8qIEdldCB0aGUgZGV2aWNlIGlkICovCisJaW5mby0+ZGV2aWNlX2lkID0gcGNpX2Rldl9wLT5kZXZpY2U7CisKKwkvKiBHZXQgdGhlIGlycSBhc3NpZ25lZCB0byB0aGUgYm9hcmQgKi8KKwlpbmZvLT5pcnEgPSBwY2lfZGV2X3AtPmlycTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfYW9fY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KQoreworCWludCBpOworCisJQ0FMTF9QREVCVUcoIkluIGluaXRfYW9fY29udGV4dCgpXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCB0aGlzYm9hcmQtPmFvLmNvdW50OyBpKyspIHsKKwkJLy9zcGluX2xvY2tfaW5pdCgmaW5mby0+YW9fY29udGV4dFtpXS51c2VfbG9jayk7CisJCWluZm8tPmFvX2NvbnRleHRbaV0uaXJxID0gaW5mby0+aXJxOworCisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmN0cmxfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9DVFJMX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfU1RBVFVTX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uZmlmb19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX0ZJRk9fUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zaW5nbGVfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9TSU5HTEVfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS50aW1lcl9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX1RJTUVSX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uaXJxX3N0YXR1c19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0lSUV9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5wcmVsb2FkX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fTE9BRFNFVFJFR19YWDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmN0cmxfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMV9DVFJMX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfU1RBVFVTX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uZmlmb19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX0ZJRk9fUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zaW5nbGVfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMV9TSU5HTEVfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS50aW1lcl9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX1RJTUVSX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uaXJxX3N0YXR1c19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0lSUV9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5wcmVsb2FkX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fTE9BRFNFVFJFR19YWDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmN0cmxfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9DVFJMX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfU1RBVFVTX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uZmlmb19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX0ZJRk9fUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zaW5nbGVfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9TSU5HTEVfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS50aW1lcl9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX1RJTUVSX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uaXJxX3N0YXR1c19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0lSUV9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5wcmVsb2FkX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fTE9BRFNFVFJFR19YWDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmN0cmxfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19DVFJMX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfU1RBVFVTX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uZmlmb19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX0ZJRk9fUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zaW5nbGVfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19TSU5HTEVfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS50aW1lcl9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX1RJTUVSX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uaXJxX3N0YXR1c19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0lSUV9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5wcmVsb2FkX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fTE9BRFNFVFJFR19YWDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2FpX2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKworCUNBTExfUERFQlVHKCJJbiBpbml0X2FpX2NvbnRleHQoKVxuIik7CisKKwlpbmZvLT5haV9jb250ZXh0LmlycSA9IGluZm8tPmlycTsKKworCWluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcgPSBpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9DVFJMX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LnN0YXR1c19yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9TVEFUVVNfUkVHOworCWluZm8tPmFpX2NvbnRleHQuY2hhbm5lbF9saXN0X3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX0NIQU5ORUxfTElTVF9SRUc7CisJaW5mby0+YWlfY29udGV4dC5kYXRhX3JlZyA9IGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX0RBVEFfUkVHOworCWluZm8tPmFpX2NvbnRleHQuY2hhbl90aW1lcl9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9DSEFOX1RJTUVSX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LmNoYW5fcHJlX3RpbWVyX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX0NIQU5fUFJFX1RJTUVSX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LnNjYW5fdGltZXJfbG93X3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NDQU5fVElNRVJfTE9XX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LnNjYW5fdGltZXJfaGlnaF9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9TQ0FOX1RJTUVSX0hJR0hfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc2Nhbl9wcmVfdGltZXJfbG93X3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NDQU5fUFJFX1RJTUVSX0xPV19SRUc7CisJaW5mby0+YWlfY29udGV4dC5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NDQU5fUFJFX1RJTUVSX0hJR0hfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc3RhcnRfcmVnID0gaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU1RBUlRfUkVHOworCWluZm8tPmFpX2NvbnRleHQuaXJxX3N0YXR1c19yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9JUlFfU1RBVFVTX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LnNhbXBsZV9jb3VudGVyX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NBTVBMRV9DT1VOVEVSX1JFRzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfZGlvX2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKworCUNBTExfUERFQlVHKCJJbiBpbml0X2Rpb19jb250ZXh0KClcbiIpOworCisJaW5mby0+ZGlvX2NvbnRleHQuZGlyX3JlZyA9IGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19ESVJfUkVHOworCWluZm8tPmRpb19jb250ZXh0LmN0cmxfcmVnID0gaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX0NUUkxfUkVHOworCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMF9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8wX1JFRzsKKwlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzFfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMV9SRUc7CisJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8yX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19QT1JUXzJfUkVHOworCWluZm8tPmRpb19jb250ZXh0LnBvcnRfM19yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8zX1JFRzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfY250X2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKworCUNBTExfUERFQlVHKCJJbiBpbml0X2NudF9jb250ZXh0KClcbiIpOworCisJaW5mby0+Y250X2NvbnRleHQuY3RybF9yZWcgPSBpbmZvLT50aW1lcl9yZWdiYXNlICsgTUU0MDAwX0NOVF9DVFJMX1JFRzsKKwlpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnID0KKwkJaW5mby0+dGltZXJfcmVnYmFzZSArIE1FNDAwMF9DTlRfQ09VTlRFUl8wX1JFRzsKKwlpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnID0KKwkJaW5mby0+dGltZXJfcmVnYmFzZSArIE1FNDAwMF9DTlRfQ09VTlRFUl8xX1JFRzsKKwlpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnID0KKwkJaW5mby0+dGltZXJfcmVnYmFzZSArIE1FNDAwMF9DTlRfQ09VTlRFUl8yX1JFRzsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEZJUk1XQVJFX05PVF9BVkFJTEFCTEUgMQorI2lmIEZJUk1XQVJFX05PVF9BVkFJTEFCTEUKK2V4dGVybiB1bnNpZ25lZCBjaGFyICp4aWxpbnhfZmlybTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHhpbGlueF9kb3dubG9hZChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXUzMiB2YWx1ZSA9IDA7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisJaW50IGlkeCA9IDA7CisJaW50IHNpemUgPSAwOworCisJQ0FMTF9QREVCVUcoIkluIHhpbGlueF9kb3dubG9hZCgpXG4iKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCS8qCisJICogU2V0IFBMWCBsb2NhbCBpbnRlcnJ1cHQgMiBwb2xhcml0eSB0byBoaWdoLgorCSAqIEludGVycnVwdCBpcyB0aHJvd24gYnkgaW5pdCBwaW4gb2YgeGlsaW54LgorCSAqLworCW91dGwoMHgxMCwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKTsKKworCS8qIFNldCAvQ1MgYW5kIC9XUklURSBvZiB0aGUgWGlsaW54ICovCisJdmFsdWUgPSBpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKwl2YWx1ZSB8PSAweDEwMDsKKwlvdXRsKHZhbHVlLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCisJLyogSW5pdCBYaWxpbnggd2l0aCBDUzEgKi8KKwlpbmIoaW5mby0+cHJvZ3JhbV9yZWdiYXNlICsgMHhDOCk7CisKKwkvKiBXYWl0IHVudGlsIC9JTklUIHBpbiBpcyBzZXQgKi8KKwl1ZGVsYXkoMjApOworCWlmICghaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lOVENTUikgJiAweDIwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiBDYW4ndCBpbml0IFhpbGlueFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBSZXNldCAvQ1MgYW5kIC9XUklURSBvZiB0aGUgWGlsaW54ICovCisJdmFsdWUgPSBpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKwl2YWx1ZSAmPSB+MHgxMDA7CisJb3V0bCh2YWx1ZSwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKwlpZiAoRklSTVdBUkVfTk9UX0FWQUlMQUJMRSkgeworCQljb21lZGlfZXJyb3IoZGV2LAorCQkJInhpbGlueCBmaXJtd2FyZSB1bmF2YWlsYWJsZSBkdWUgdG8gbGljZW5zaW5nLCBhYm9ydGluZyIpOworCQlyZXR1cm4gLUVJTzsKKwl9IGVsc2UgeworCQkvKiBEb3dubG9hZCBYaWxpbnggZmlybXdhcmUgKi8KKwkJc2l6ZSA9ICh4aWxpbnhfZmlybVswXSA8PCAyNCkgKyAoeGlsaW54X2Zpcm1bMV0gPDwgMTYpICsKKwkJCSh4aWxpbnhfZmlybVsyXSA8PCA4KSArIHhpbGlueF9maXJtWzNdOworCQl1ZGVsYXkoMTApOworCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgc2l6ZTsgaWR4KyspIHsKKwkJCW91dGIoeGlsaW54X2Zpcm1bMTYgKyBpZHhdLCBpbmZvLT5wcm9ncmFtX3JlZ2Jhc2UpOworCQkJdWRlbGF5KDEwKTsKKworCQkJLyogQ2hlY2sgaWYgQlVTWSBmbGFnIGlzIGxvdyAqLworCQkJaWYgKGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpICYgMHgyMCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IFhpbGlueCBpcyBzdGlsbCBidXN5IChpZHggPSAlZClcbiIsCisJCQkJCWRldi0+bWlub3IsIGlkeCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwl9CisKKwkvKiBJZiBkb25lIGZsYWcgaXMgaGlnaCBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCAqLworCWlmIChpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKSAmIDB4NCkgeworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiBET05FIGZsYWcgaXMgbm90IHNldFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogRG93bmxvYWQgbm90IHN1Y2Nlc2Z1bFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBTZXQgL0NTIGFuZCAvV1JJVEUgKi8KKwl2YWx1ZSA9IGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCXZhbHVlIHw9IDB4MTAwOworCW91dGwodmFsdWUsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXNldF9ib2FyZChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaWNyOworCisJQ0FMTF9QREVCVUcoIkluIHJlc2V0X2JvYXJkKClcbiIpOworCisJLyogTWFrZSBhIGhhcmR3YXJlIHJlc2V0ICovCisJaWNyID0gbWU0MDAwX2lubChkZXYsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisJaWNyIHw9IDB4NDAwMDAwMDA7CisJbWU0MDAwX291dGwoZGV2LCBpY3IsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisJaWNyICY9IH4weDQwMDAwMDAwOworCW1lNDAwMF9vdXRsKGRldiwgaWNyLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCisJLyogMHg4MDAwIHRvIHRoZSBEQUNzIG1lYW5zIGFuIG91dHB1dCB2b2x0YWdlIG9mIDBWICovCisJbWU0MDAwX291dGwoZGV2LCAweDgwMDAsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX1NJTkdMRV9SRUcpOworCW1lNDAwMF9vdXRsKGRldiwgMHg4MDAwLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMV9TSU5HTEVfUkVHKTsKKwltZTQwMDBfb3V0bChkZXYsIDB4ODAwMCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfU0lOR0xFX1JFRyk7CisJbWU0MDAwX291dGwoZGV2LCAweDgwMDAsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX1NJTkdMRV9SRUcpOworCisJLyogU2V0IGJvdGggc3RvcCBiaXRzIGluIHRoZSBhbmFsb2cgaW5wdXQgY29udHJvbCByZWdpc3RlciAqLworCW1lNDAwMF9vdXRsKGRldiwKKwkJTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0MDAwX0FJX0NUUkxfQklUX1NUT1AsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX0NUUkxfUkVHKTsKKworCS8qIFNldCBib3RoIHN0b3AgYml0cyBpbiB0aGUgYW5hbG9nIG91dHB1dCBjb250cm9sIHJlZ2lzdGVyICovCisJbWU0MDAwX291dGwoZGV2LAorCQlNRTQwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQwMDBfQU9fQ1RSTF9CSVRfU1RPUCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfQ1RSTF9SRUcpOworCW1lNDAwMF9vdXRsKGRldiwKKwkJTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0MDAwX0FPX0NUUkxfQklUX1NUT1AsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX0NUUkxfUkVHKTsKKwltZTQwMDBfb3V0bChkZXYsCisJCU1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BT19DVFJMX0JJVF9TVE9QLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9DVFJMX1JFRyk7CisJbWU0MDAwX291dGwoZGV2LAorCQlNRTQwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQwMDBfQU9fQ1RSTF9CSVRfU1RPUCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfQ1RSTF9SRUcpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBMWCAqLworCW1lNDAwMF9vdXRsKGRldiwgMHg0MywgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKTsKKworCS8qIFNldCB0aGUgYWR1c3RtZW50IHJlZ2lzdGVyIGZvciBBTyBkZW11eCAqLworCW1lNDAwMF9vdXRsKGRldiwgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9WQUxVRSwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fREVNVVhfQURKVVNUX1JFRyk7CisKKwkvKiBTZXQgZGlnaXRhbCBJL08gZGlyZWN0aW9uIGZvciBwb3J0IDAgdG8gb3V0cHV0IG9uIGlzb2xhdGVkIHZlcnNpb25zICovCisJaWYgKCEobWU0MDAwX2lubChkZXYsIGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19ESVJfUkVHKSAmIDB4MSkpIHsKKwkJbWU0MDAwX291dGwoZGV2LCAweDEsCisJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fQ1RSTF9SRUcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2RldGFjaCgpXG4iKTsKKworCWlmIChpbmZvKSB7CisJCWlmIChpbmZvLT5wY2lfZGV2X3ApIHsKKwkJCXJlc2V0X2JvYXJkKGRldik7CisJCQlpZiAoaW5mby0+cGx4X3JlZ2Jhc2UpIHsKKwkJCQljb21lZGlfcGNpX2Rpc2FibGUoaW5mby0+cGNpX2Rldl9wKTsKKwkJCX0KKwkJCXBjaV9kZXZfcHV0KGluZm8tPnBjaV9kZXZfcCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBbmFsb2cgaW5wdXQgc2VjdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IG1lNDAwMF9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogc3ViZGV2aWNlLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJhbmcgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJaW50IGFyZWYgPSBDUl9BUkVGKGluc24tPmNoYW5zcGVjKTsKKworCXVuc2lnbmVkIGxvbmcgZW50cnkgPSAwOworCXVuc2lnbmVkIGxvbmcgdG1wOworCWxvbmcgbHZhbDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfYWlfaW5zbl9yZWFkKClcbiIpOworCisJaWYgKGluc24tPm4gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGluc24tPm4gPiAxKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChyYW5nKSB7CisJY2FzZSAwOgorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8yXzU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMTA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzU7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBJbnZhbGlkIHJhbmdlIHNwZWNpZmllZFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGFyZWYpIHsKKwljYXNlIEFSRUZfR1JPVU5EOgorCWNhc2UgQVJFRl9DT01NT046CisJCWlmIChjaGFuID49IHRoaXNib2FyZC0+YWkuY291bnQpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IEFuYWxvZyBpbnB1dCBpcyBub3QgYXZhaWxhYmxlXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEIHwgY2hhbjsKKwkJYnJlYWs7CisKKwljYXNlIEFSRUZfRElGRjoKKwkJaWYgKHJhbmcgPT0gMCB8fCByYW5nID09IDEpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IFJhbmdlIG11c3QgYmUgYmlwb2xhciB3aGVuIGFyZWYgPSBkaWZmXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY2hhbiA+PSB0aGlzYm9hcmQtPmFpLmRpZmZfY291bnQpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IEFuYWxvZyBpbnB1dCBpcyBub3QgYXZhaWxhYmxlXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMIHwgY2hhbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBJbnZhbGlkIGFyZWYgc3BlY2lmaWVkXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX0xBU1RfRU5UUlk7CisKKwkvKiBDbGVhciBjaGFubmVsIGxpc3QsIGRhdGEgZmlmbyBhbmQgYm90aCBzdG9wIGJpdHMgKi8KKwl0bXAgPSBtZTQwMDBfaW5sKGRldiwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8CisJCU1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8gfAorCQlNRTQwMDBfQUlfQ1RSTF9CSVRfU1RPUCB8IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogU2V0IHRoZSBhY3F1aXNpdGlvbiBtb2RlIHRvIHNpbmdsZSAqLworCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzAgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8xIHwKKwkJTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMik7CisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogRW5hYmxlIGNoYW5uZWwgbGlzdCBhbmQgZGF0YSBmaWZvICovCisJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfCBNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKworCS8qIEdlbmVyYXRlIGNoYW5uZWwgbGlzdCBlbnRyeSAqLworCW1lNDAwMF9vdXRsKGRldiwgZW50cnksIGluZm8tPmFpX2NvbnRleHQuY2hhbm5lbF9saXN0X3JlZyk7CisKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIG1heGltdW0gc2FtcGxlIHJhdGUgKi8KKwltZTQwMDBfb3V0bChkZXYsIE1FNDAwMF9BSV9NSU5fVElDS1MsIGluZm8tPmFpX2NvbnRleHQuY2hhbl90aW1lcl9yZWcpOworCW1lNDAwMF9vdXRsKGRldiwgTUU0MDAwX0FJX01JTl9USUNLUywKKwkJaW5mby0+YWlfY29udGV4dC5jaGFuX3ByZV90aW1lcl9yZWcpOworCisJLyogU3RhcnQgY29udmVyc2lvbiBieSBkdW1teSByZWFkICovCisJbWU0MDAwX2lubChkZXYsIGluZm8tPmFpX2NvbnRleHQuc3RhcnRfcmVnKTsKKworCS8qIFdhaXQgdW50aWwgcmVhZHkgKi8KKwl1ZGVsYXkoMTApOworCWlmICghKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LgorCQkJCXN0YXR1c19yZWcpICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBWYWx1ZSBub3QgYXZhaWxhYmxlIGFmdGVyIHdhaXRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogUmVhZCB2YWx1ZSBmcm9tIGRhdGEgZmlmbyAqLworCWx2YWwgPSBtZTQwMDBfaW5sKGRldiwgaW5mby0+YWlfY29udGV4dC5kYXRhX3JlZykgJiAweEZGRkY7CisJZGF0YVswXSA9IGx2YWwgXiAweDgwMDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtZTQwMDBfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9haV9jYW5jZWwoKVxuIik7CisKKwkvKiBTdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KKwl0bXAgPSBtZTQwMDBfaW5sKGRldiwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX1NUT1AgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKworCS8qIENsZWFyIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisJbWU0MDAwX291dGwoZGV2LCAweDAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWlfY2hlY2tfY2hhbmxpc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCkKK3sKKwlpbnQgYXJlZjsKKwlpbnQgaTsKKworCUNBTExfUERFQlVHKCJJbiBhaV9jaGVja19jaGFubGlzdCgpXG4iKTsKKworCS8qIENoZWNrIHdoZXRoZXIgYSBjaGFubmVsIGxpc3QgaXMgYXZhaWxhYmxlICovCisJaWYgKCFjbWQtPmNoYW5saXN0X2xlbikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBObyBjaGFubmVsIGxpc3QgYXZhaWxhYmxlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIHRoZSBjaGFubmVsIGxpc3Qgc2l6ZSAqLworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IE1FNDAwMF9BSV9DSEFOTkVMX0xJU1RfQ09VTlQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogQ2hhbm5lbCBsaXN0IGlzIHRvIGxhcmdlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIHRoZSBwb2ludGVyICovCisJaWYgKCFjbWQtPmNoYW5saXN0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IE5VTEwgcG9pbnRlciB0byBjaGFubmVsIGxpc3RcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogQ2hlY2sgd2hldGhlciBhcmVmIGlzIGVxdWFsIGZvciBhbGwgZW50cmllcyAqLworCWFyZWYgPSBDUl9BUkVGKGNtZC0+Y2hhbmxpc3RbMF0pOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCWlmIChDUl9BUkVGKGNtZC0+Y2hhbmxpc3RbaV0pICE9IGFyZWYpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBNb2RlIGlzIG5vdCBlcXVhbCBmb3IgYWxsIGVudHJpZXNcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIENoZWNrIHdoZXRoZXIgY2hhbm5lbHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBlbmRpbmcgKi8KKwlpZiAoYXJlZiA9PSBTREZfRElGRikgeworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQkJaWYgKENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSkgPj0KKwkJCQl0aGlzYm9hcmQtPmFpLmRpZmZfY291bnQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IENoYW5uZWwgbnVtYmVyIHRvIGhpZ2hcbiIsCisJCQkJCWRldi0+bWlub3IpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJCWlmIChDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pID49IHRoaXNib2FyZC0+YWkuY291bnQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IENoYW5uZWwgbnVtYmVyIHRvIGhpZ2hcbiIsCisJCQkJCWRldi0+bWlub3IpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJLyogQ2hlY2sgaWYgYmlwb2xhciBpcyBzZXQgZm9yIGFsbCBlbnRyaWVzIHdoZW4gaW4gZGlmZmVyZW50aWFsIG1vZGUgKi8KKwlpZiAoYXJlZiA9PSBTREZfRElGRikgeworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pICE9IDEgJiYKKwkJCQlDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKSAhPSAyKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBCaXBvbGFyIGlzIG5vdCBzZWxlY3RlZCBpbiBkaWZmZXJlbnRpYWwgbW9kZVxuIiwKKwkJCQkJZGV2LT5taW5vcik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaV9yb3VuZF9jbWRfYXJncyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQsCisJdW5zaWduZWQgaW50ICppbml0X3RpY2tzLAorCXVuc2lnbmVkIGludCAqc2Nhbl90aWNrcywgdW5zaWduZWQgaW50ICpjaGFuX3RpY2tzKQoreworCisJaW50IHJlc3Q7CisKKwlDQUxMX1BERUJVRygiSW4gYWlfcm91bmRfY21kX2FyZ3MoKVxuIik7CisKKwkqaW5pdF90aWNrcyA9IDA7CisJKnNjYW5fdGlja3MgPSAwOworCSpjaGFuX3RpY2tzID0gMDsKKworCVBERUJVRygiYWlfcm91bmRfY21kX2FyZygpOiBzdGFydF9hcmcgPSAlZFxuIiwgY21kLT5zdGFydF9hcmcpOworCVBERUJVRygiYWlfcm91bmRfY21kX2FyZygpOiBzY2FuX2JlZ2luX2FyZyA9ICVkXG4iLAorCQljbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwlQREVCVUcoImFpX3JvdW5kX2NtZF9hcmcoKTogY29udmVydF9hcmcgPSAlZFxuIiwgY21kLT5jb252ZXJ0X2FyZyk7CisKKwlpZiAoY21kLT5zdGFydF9hcmcpIHsKKwkJKmluaXRfdGlja3MgPSAoY21kLT5zdGFydF9hcmcgKiAzMykgLyAxMDAwOworCQlyZXN0ID0gKGNtZC0+c3RhcnRfYXJnICogMzMpICUgMTAwMDsKKworCQlpZiAoY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTkVBUkVTVCkgeworCQkJaWYgKHJlc3QgPiAzMykgeworCQkJCSgqaW5pdF90aWNrcykrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChjbWQtPmZsYWdzICYgVFJJR19ST1VORF9VUCkgeworCQkJaWYgKHJlc3QpCisJCQkJKCppbml0X3RpY2tzKSsrOworCQl9CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcpIHsKKwkJKnNjYW5fdGlja3MgPSAoY21kLT5zY2FuX2JlZ2luX2FyZyAqIDMzKSAvIDEwMDA7CisJCXJlc3QgPSAoY21kLT5zY2FuX2JlZ2luX2FyZyAqIDMzKSAlIDEwMDA7CisKKwkJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX05FQVJFU1QpIHsKKwkJCWlmIChyZXN0ID4gMzMpIHsKKwkJCQkoKnNjYW5fdGlja3MpKys7CisJCQl9CisJCX0gZWxzZSBpZiAoY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfVVApIHsKKwkJCWlmIChyZXN0KQorCQkJCSgqc2Nhbl90aWNrcykrKzsKKwkJfQorCX0KKworCWlmIChjbWQtPmNvbnZlcnRfYXJnKSB7CisJCSpjaGFuX3RpY2tzID0gKGNtZC0+Y29udmVydF9hcmcgKiAzMykgLyAxMDAwOworCQlyZXN0ID0gKGNtZC0+Y29udmVydF9hcmcgKiAzMykgJSAxMDAwOworCisJCWlmIChjbWQtPmZsYWdzICYgVFJJR19ST1VORF9ORUFSRVNUKSB7CisJCQlpZiAocmVzdCA+IDMzKSB7CisJCQkJKCpjaGFuX3RpY2tzKSsrOworCQkJfQorCQl9IGVsc2UgaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX1VQKSB7CisJCQlpZiAocmVzdCkKKwkJCQkoKmNoYW5fdGlja3MpKys7CisJCX0KKwl9CisKKwlQREVCVUcoImFpX3JvdW5kX2NtZF9hcmdzKCk6IGluaXRfdGlja3MgPSAlZFxuIiwgKmluaXRfdGlja3MpOworCVBERUJVRygiYWlfcm91bmRfY21kX2FyZ3MoKTogc2Nhbl90aWNrcyA9ICVkXG4iLCAqc2Nhbl90aWNrcyk7CisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJncygpOiBjaGFuX3RpY2tzID0gJWRcbiIsICpjaGFuX3RpY2tzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaV93cml0ZV90aW1lcihjb21lZGlfZGV2aWNlICogZGV2LAorCXVuc2lnbmVkIGludCBpbml0X3RpY2tzLAorCXVuc2lnbmVkIGludCBzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgY2hhbl90aWNrcykKK3sKKworCUNBTExfUERFQlVHKCJJbiBhaV93cml0ZV90aW1lcigpXG4iKTsKKworCW1lNDAwMF9vdXRsKGRldiwgaW5pdF90aWNrcyAtIDEsCisJCWluZm8tPmFpX2NvbnRleHQuc2Nhbl9wcmVfdGltZXJfbG93X3JlZyk7CisJbWU0MDAwX291dGwoZGV2LCAweDAsIGluZm8tPmFpX2NvbnRleHQuc2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcpOworCisJaWYgKHNjYW5fdGlja3MpIHsKKwkJbWU0MDAwX291dGwoZGV2LCBzY2FuX3RpY2tzIC0gMSwKKwkJCWluZm8tPmFpX2NvbnRleHQuc2Nhbl90aW1lcl9sb3dfcmVnKTsKKwkJbWU0MDAwX291dGwoZGV2LCAweDAsIGluZm8tPmFpX2NvbnRleHQuc2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJfQorCisJbWU0MDAwX291dGwoZGV2LCBjaGFuX3RpY2tzIC0gMSwgaW5mby0+YWlfY29udGV4dC5jaGFuX3ByZV90aW1lcl9yZWcpOworCW1lNDAwMF9vdXRsKGRldiwgY2hhbl90aWNrcyAtIDEsIGluZm8tPmFpX2NvbnRleHQuY2hhbl90aW1lcl9yZWcpOworfQorCitzdGF0aWMgaW50IGFpX3ByZXBhcmUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kLAorCXVuc2lnbmVkIGludCBpbml0X3RpY2tzLAorCXVuc2lnbmVkIGludCBzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgY2hhbl90aWNrcykKK3sKKworCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKKworCUNBTExfUERFQlVHKCJJbiBhaV9wcmVwYXJlKClcbiIpOworCisJLyogV3JpdGUgdGltZXIgYXJndW1lbnRzICovCisJYWlfd3JpdGVfdGltZXIoZGV2LCBpbml0X3RpY2tzLCBzY2FuX3RpY2tzLCBjaGFuX3RpY2tzKTsKKworCS8qIFJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwkvKiBTdGFydCBzb3VyY2VzICovCisJaWYgKChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCisJCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHx8CisJCShjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVyAmJgorCQkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSkgeworCQl0bXAgPSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXRtcCA9IE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzIgfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7CisJCXRtcCA9IE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzAgfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMSB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJfSBlbHNlIHsKKwkJdG1wID0gTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMCB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJfQorCisJLyogU3RvcCB0cmlnZ2VycyAqLworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJbWU0MDAwX291dGwoZGV2LCBjbWQtPmNoYW5saXN0X2xlbiAqIGNtZC0+c3RvcF9hcmcsCisJCQlpbmZvLT5haV9jb250ZXh0LnNhbXBsZV9jb3VudGVyX3JlZyk7CisJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwgTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUTsKKwl9IGVsc2UgaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FICYmCisJCWNtZC0+c2Nhbl9lbmRfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJbWU0MDAwX291dGwoZGV2LCBjbWQtPnNjYW5fZW5kX2FyZywKKwkJCWluZm8tPmFpX2NvbnRleHQuc2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJROworCX0gZWxzZSB7CisJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJROworCX0KKworCS8qIFdyaXRlIHRoZSBzZXR1cCB0byB0aGUgY29udHJvbCByZWdpc3RlciAqLworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKworCS8qIFdyaXRlIHRoZSBjaGFubmVsIGxpc3QgKi8KKwlhaV93cml0ZV9jaGFubGlzdChkZXYsIHMsIGNtZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaV93cml0ZV9jaGFubGlzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKQoreworCXVuc2lnbmVkIGludCBlbnRyeTsKKwl1bnNpZ25lZCBpbnQgY2hhbjsKKwl1bnNpZ25lZCBpbnQgcmFuZzsKKwl1bnNpZ25lZCBpbnQgYXJlZjsKKwlpbnQgaTsKKworCUNBTExfUERFQlVHKCJJbiBhaV93cml0ZV9jaGFubGlzdCgpXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCWNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOworCQlyYW5nID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSk7CisJCWFyZWYgPSBDUl9BUkVGKGNtZC0+Y2hhbmxpc3RbaV0pOworCisJCWVudHJ5ID0gY2hhbjsKKworCQlpZiAocmFuZyA9PSAwKSB7CisJCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8yXzU7CisJCX0gZWxzZSBpZiAocmFuZyA9PSAxKSB7CisJCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMDsKKwkJfSBlbHNlIGlmIChyYW5nID09IDIpIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMl81OworCQl9IGVsc2UgeworCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMDsKKwkJfQorCisJCWlmIChhcmVmID09IFNERl9ESUZGKSB7CisJCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUw7CisJCX0gZWxzZSB7CisJCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQ7CisJCX0KKworCQltZTQwMDBfb3V0bChkZXYsIGVudHJ5LCBpbmZvLT5haV9jb250ZXh0LmNoYW5uZWxfbGlzdF9yZWcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9haV9kb19jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaW5pdF90aWNrcyA9IDA7CisJdW5zaWduZWQgaW50IHNjYW5fdGlja3MgPSAwOworCXVuc2lnbmVkIGludCBjaGFuX3RpY2tzID0gMDsKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfYWlfZG9fY21kKClcbiIpOworCisJLyogUmVzZXQgdGhlIGFuYWxvZyBpbnB1dCAqLworCWVyciA9IG1lNDAwMF9haV9jYW5jZWwoZGV2LCBzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUm91bmQgdGhlIHRpbWVyIGFyZ3VtZW50cyAqLworCWVyciA9IGFpX3JvdW5kX2NtZF9hcmdzKGRldiwKKwkJcywgY21kLCAmaW5pdF90aWNrcywgJnNjYW5fdGlja3MsICZjaGFuX3RpY2tzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUHJlcGFyZSB0aGUgQUkgZm9yIGFjcXVpc2l0aW9uICovCisJZXJyID0gYWlfcHJlcGFyZShkZXYsIHMsIGNtZCwgaW5pdF90aWNrcywgc2Nhbl90aWNrcywgY2hhbl90aWNrcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFN0YXJ0IGFjcXVpc3Rpb24gYnkgZHVtbXkgcmVhZCAqLworCW1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LnN0YXJ0X3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOgorICoKKyAqIFRoZSBkZW1vIGNtZC5jIGluIC4vY29tZWRpbGliL2RlbW8gc3BlY2lmaWVzIDYgcmV0dXJuIHZhbHVlczoKKyAqIC0gc3VjY2VzcworICogLSBpbnZhbGlkIHNvdXJjZQorICogLSBzb3VyY2UgY29uZmxpY3QKKyAqIC0gaW52YWxpZCBhcmd1bWVudAorICogLSBhcmd1bWVudCBjb25mbGljdAorICogLSBpbnZhbGlkIGNoYW5saXN0CisgKiBTbyBJIHRyaWVkIHRvIGFkb3B0IHRoaXMgc2NoZW1lLgorICovCitzdGF0aWMgaW50IG1lNDAwMF9haV9kb19jbWRfdGVzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKQoreworCisJdW5zaWduZWQgaW50IGluaXRfdGlja3M7CisJdW5zaWduZWQgaW50IGNoYW5fdGlja3M7CisJdW5zaWduZWQgaW50IHNjYW5fdGlja3M7CisJaW50IGVyciA9IDA7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2FpX2RvX2NtZF90ZXN0KClcbiIpOworCisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc3ViZGV2ICAgICAgICAgPSAlZFxuIiwgY21kLT5zdWJkZXYpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IGZsYWdzICAgICAgICAgID0gJTA4WFxuIiwgY21kLT5mbGFncyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc3RhcnRfc3JjICAgICAgPSAlMDhYXG4iLAorCQljbWQtPnN0YXJ0X3NyYyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc3RhcnRfYXJnICAgICAgPSAlZFxuIiwKKwkJY21kLT5zdGFydF9hcmcpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHNjYW5fYmVnaW5fc3JjID0gJTA4WFxuIiwKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc2Nhbl9iZWdpbl9hcmcgPSAlZFxuIiwKKwkJY21kLT5zY2FuX2JlZ2luX2FyZyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogY29udmVydF9zcmMgICAgPSAlMDhYXG4iLAorCQljbWQtPmNvbnZlcnRfc3JjKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBjb252ZXJ0X2FyZyAgICA9ICVkXG4iLAorCQljbWQtPmNvbnZlcnRfYXJnKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzY2FuX2VuZF9zcmMgICA9ICUwOFhcbiIsCisJCWNtZC0+c2Nhbl9lbmRfc3JjKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzY2FuX2VuZF9hcmcgICA9ICVkXG4iLAorCQljbWQtPnNjYW5fZW5kX2FyZyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc3RvcF9zcmMgICAgICAgPSAlMDhYXG4iLAorCQljbWQtPnN0b3Bfc3JjKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdG9wX2FyZyAgICAgICA9ICVkXG4iLCBjbWQtPnN0b3BfYXJnKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBjaGFubGlzdCAgICAgICA9ICVkXG4iLAorCQkodW5zaWduZWQgaW50KWNtZC0+Y2hhbmxpc3QpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IGNoYW5saXN0X2xlbiAgID0gJWRcbiIsCisJCWNtZC0+Y2hhbmxpc3RfbGVuKTsKKworCS8qIE9ubHkgcm91bmRpbmcgZmxhZ3MgYXJlIGltcGxlbWVudGVkICovCisJY21kLT5mbGFncyAmPSBUUklHX1JPVU5EX05FQVJFU1QgfCBUUklHX1JPVU5EX1VQIHwgVFJJR19ST1VORF9ET1dOOworCisJLyogUm91bmQgdGhlIHRpbWVyIGFyZ3VtZW50cyAqLworCWFpX3JvdW5kX2NtZF9hcmdzKGRldiwgcywgY21kLCAmaW5pdF90aWNrcywgJnNjYW5fdGlja3MsICZjaGFuX3RpY2tzKTsKKworCS8qCisJICogU3RhZ2UgMS4gQ2hlY2sgaWYgdGhlIHRyaWdnZXIgc291cmNlcyBhcmUgZ2VuZXJhbGx5IHZhbGlkLgorCSAqLworCXN3aXRjaCAoY21kLT5zdGFydF9zcmMpIHsKKwljYXNlIFRSSUdfTk9XOgorCWNhc2UgVFJJR19FWFQ6CisJCWJyZWFrOworCWNhc2UgVFJJR19BTlk6CisJCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19FWFQ7CisJCWVycisrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBzb3VyY2VcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zdGFydF9zcmMgPSBUUklHX05PVzsKKwkJZXJyKys7CisJfQorCXN3aXRjaCAoY21kLT5zY2FuX2JlZ2luX3NyYykgeworCWNhc2UgVFJJR19GT0xMT1c6CisJY2FzZSBUUklHX1RJTUVSOgorCWNhc2UgVFJJR19FWFQ6CisJCWJyZWFrOworCWNhc2UgVFJJR19BTlk6CisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19GT0xMT1cgfCBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CisJCWVycisrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzY2FuIGJlZ2luIHNvdXJjZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnNjYW5fYmVnaW5fc3JjID0gVFJJR19GT0xMT1c7CisJCWVycisrOworCX0KKwlzd2l0Y2ggKGNtZC0+Y29udmVydF9zcmMpIHsKKwljYXNlIFRSSUdfVElNRVI6CisJY2FzZSBUUklHX0VYVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CisJCWVycisrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IHNvdXJjZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPmNvbnZlcnRfc3JjID0gVFJJR19USU1FUjsKKwkJZXJyKys7CisJfQorCXN3aXRjaCAoY21kLT5zY2FuX2VuZF9zcmMpIHsKKwljYXNlIFRSSUdfTk9ORToKKwljYXNlIFRSSUdfQ09VTlQ6CisJCWJyZWFrOworCWNhc2UgVFJJR19BTlk6CisJCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfTk9ORSB8IFRSSUdfQ09VTlQ7CisJCWVycisrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzY2FuIGVuZCBzb3VyY2VcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zY2FuX2VuZF9zcmMgPSBUUklHX05PTkU7CisJCWVycisrOworCX0KKwlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKKwljYXNlIFRSSUdfTk9ORToKKwljYXNlIFRSSUdfQ09VTlQ6CisJCWJyZWFrOworCWNhc2UgVFJJR19BTlk6CisJCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19OT05FIHwgVFJJR19DT1VOVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0b3Agc291cmNlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c3RvcF9zcmMgPSBUUklHX05PTkU7CisJCWVycisrOworCX0KKwlpZiAoZXJyKSB7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogU3RhZ2UgMi4gQ2hlY2sgZm9yIHRyaWdnZXIgc291cmNlIGNvbmZsaWN0cy4KKwkgKi8KKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVyAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgdHJpZ2dlciBjb21iaW5hdGlvblxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnN0YXJ0X3NyYyA9IFRSSUdfTk9XOworCQljbWQtPnNjYW5fYmVnaW5fc3JjID0gVFJJR19GT0xMT1c7CisJCWNtZC0+Y29udmVydF9zcmMgPSBUUklHX1RJTUVSOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUgJiYgY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19OT05FKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKKwkJY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19OT05FKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSAmJgorCQljbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKKwkJY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19DT1VOVCkgeworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0b3AgdHJpZ2dlciBjb21iaW5hdGlvblxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnN0b3Bfc3JjID0gVFJJR19OT05FOworCQljbWQtPnNjYW5fZW5kX3NyYyA9IFRSSUdfTk9ORTsKKwkJZXJyKys7CisJfQorCWlmIChlcnIpIHsKKwkJcmV0dXJuIDI7CisJfQorCisJLyoKKwkgKiBTdGFnZSAzLiBDaGVjayBpZiBhcmd1bWVudHMgYXJlIGdlbmVyYWxseSB2YWxpZC4KKwkgKi8KKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPCAxKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBObyBjaGFubmVsIGxpc3RcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5jaGFubGlzdF9sZW4gPSAxOworCQllcnIrKzsKKwl9CisJaWYgKGluaXRfdGlja3MgPCA2NikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogU3RhcnQgYXJnIHRvIGxvd1xuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CisJCWVycisrOworCX0KKwlpZiAoc2Nhbl90aWNrcyAmJiBzY2FuX3RpY2tzIDwgNjcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IFNjYW4gYmVnaW4gYXJnIHRvIGxvd1xuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMjAzMTsKKwkJZXJyKys7CisJfQorCWlmIChjaGFuX3RpY2tzIDwgNjYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IENvbnZlcnQgYXJnIHRvIGxvd1xuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsKKwkJZXJyKys7CisJfQorCWlmIChlcnIpIHsKKwkJcmV0dXJuIDM7CisJfQorCisJLyoKKwkgKiBTdGFnZSA0LiBDaGVjayBmb3IgYXJndW1lbnQgY29uZmxpY3RzLgorCSAqLworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisKKwkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCisJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChjaGFuX3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoc2Nhbl90aWNrcyA8PSBjbWQtPmNoYW5saXN0X2xlbiAqIGNoYW5fdGlja3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzY2FuIGVuZCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnNjYW5fZW5kX2FyZyA9IDIwMDAgKiBjbWQtPmNoYW5saXN0X2xlbiArIDMxOwkvLyBBdCBsZWFzdCBvbmUgdGljayBtb3JlCisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVyAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKworCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KKwkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKGNoYW5fdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisKKwkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCisJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChjaGFuX3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoc2Nhbl90aWNrcyA8PSBjbWQtPmNoYW5saXN0X2xlbiAqIGNoYW5fdGlja3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzY2FuIGVuZCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnNjYW5fZW5kX2FyZyA9IDIwMDAgKiBjbWQtPmNoYW5saXN0X2xlbiArIDMxOwkvLyBBdCBsZWFzdCBvbmUgdGljayBtb3JlCisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVyAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKworCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KKwkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKGNoYW5fdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCisJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLworCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCkgeworCisJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLworCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCWlmIChjbWQtPnN0b3BfYXJnID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdG9wIGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RvcF9hcmcgPSAxOworCQkJZXJyKys7CisJCX0KKwl9CisJaWYgKGNtZC0+c2Nhbl9lbmRfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzY2FuIGVuZCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnNjYW5fZW5kX2FyZyA9IDE7CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoZXJyKSB7CisJCXJldHVybiA0OworCX0KKworCS8qCisJICogU3RhZ2UgNS4gQ2hlY2sgdGhlIGNoYW5uZWwgbGlzdC4KKwkgKi8KKwlpZiAoYWlfY2hlY2tfY2hhbmxpc3QoZGV2LCBzLCBjbWQpKQorCQlyZXR1cm4gNTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU0MDAwX2FpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQgUFRfUkVHU19BUkcpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlczsKKwltZTQwMDBfYWlfY29udGV4dF90ICphaV9jb250ZXh0ID0gJmluZm8tPmFpX2NvbnRleHQ7CisJaW50IGk7CisJaW50IGMgPSAwOworCWxvbmcgbHZhbDsKKworCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKSBpcyBleGVjdXRlZFxuIik7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpIHByZW1hdHVyZSBpbnRlcnJ1cHRcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyogUmVzZXQgYWxsIGV2ZW50cyAqLworCXMtPmFzeW5jLT5ldmVudHMgPSAwOworCisJLyogQ2hlY2sgaWYgaXJxIG51bWJlciBpcyByaWdodCAqLworCWlmIChpcnEgIT0gYWlfY29udGV4dC0+aXJxKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkXG4iLAorCQkJZGV2LT5taW5vciwgaXJxKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChtZTQwMDBfaW5sKGRldiwKKwkJCWFpX2NvbnRleHQtPgorCQkJaXJxX3N0YXR1c19yZWcpICYgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKSB7CisJCUlTUl9QREVCVUcKKwkJCSgibWU0MDAwX2FpX2lzcigpOiBGaWZvIGhhbGYgZnVsbCBpbnRlcnJ1cHQgb2NjdXJlZFxuIik7CisKKwkJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCAqLworCQl0bXAgPSBtZTQwMDBfaW5sKGRldiwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCisJCWlmICghKHRtcCAmIE1FNDAwMF9BSV9TVEFUVVNfQklUX0ZGX0RBVEEpICYmCisJCQkhKHRtcCAmIE1FNDAwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpICYmCisJCQkodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkpIHsKKwkJCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKTogRmlmbyBmdWxsXG4iKTsKKwkJCWMgPSBNRTQwMDBfQUlfRklGT19DT1VOVDsKKworCQkJLyogRklGTyBvdmVyZmxvdywgc28gc3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8CisJCQkJTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUSk7CisJCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7CisKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IEZJRk8gb3ZlcmZsb3dcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCX0gZWxzZSBpZiAoKHRtcCAmIE1FNDAwMF9BSV9TVEFUVVNfQklUX0ZGX0RBVEEpCisJCQkmJiAhKHRtcCAmIE1FNDAwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpCisJCQkmJiAodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkpIHsKKwkJCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKTogRmlmbyBoYWxmIGZ1bGxcbiIpOworCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKworCQkJYyA9IE1FNDAwMF9BSV9GSUZPX0NPVU5UIC8gMjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IENhbid0IGRldGVybWluZSBzdGF0ZSBvZiBmaWZvXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJYyA9IDA7CisKKwkJCS8qIFVuZGVmaW5lZCBzdGF0ZSwgc28gc3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8CisJCQkJTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUSk7CisJCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7CisKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IFVuZGVmaW5lZCBGSUZPIHN0YXRlXG4iLAorCQkJCWRldi0+bWlub3IpOworCQl9CisKKwkJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpOiBUcnkgdG8gcmVhZCAlZCB2YWx1ZXNcbiIsIGMpOworCisJCWZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKwkJCS8qIFJlYWQgdmFsdWUgZnJvbSBkYXRhIGZpZm8gKi8KKwkJCWx2YWwgPSBpbmwoYWlfY29udGV4dC0+ZGF0YV9yZWcpICYgMHhGRkZGOworCQkJbHZhbCBePSAweDgwMDA7CisKKwkJCWlmICghY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIGx2YWwpKSB7CisJCQkJLyogQnVmZmVyIG92ZXJmbG93LCBzbyBzdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkJCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfAorCQkJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwkJCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCisJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CisKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogQnVmZmVyIG92ZXJmbG93XG4iLAorCQkJCQlkZXYtPm1pbm9yKTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogV29yayBpcyBkb25lLCBzbyByZXNldCB0aGUgaW50ZXJydXB0ICovCisJCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKTogUmVzZXQgZmlmbyBoYWxmIGZ1bGwgaW50ZXJydXB0XG4iKTsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKwl9CisKKwlpZiAobWU0MDAwX2lubChkZXYsCisJCQlhaV9jb250ZXh0LT4KKwkJCWlycV9zdGF0dXNfcmVnKSAmIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9TQykgeworCQlJU1JfUERFQlVHCisJCQkoIm1lNDAwMF9haV9pc3IoKTogU2FtcGxlIGNvdW50ZXIgaW50ZXJydXB0IG9jY3VyZWRcbiIpOworCisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLIHwgQ09NRURJX0NCX0VPQTsKKworCQkvKiBBY3F1aXNpdGlvbiBpcyBjb21wbGV0ZSwgc28gc3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKworCQkvKiBQb2xsIGRhdGEgdW50aWwgZmlmbyBlbXB0eSAqLworCQl3aGlsZSAoaW5sKGFpX2NvbnRleHQtPmN0cmxfcmVnKSAmIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpIHsKKwkJCS8qIFJlYWQgdmFsdWUgZnJvbSBkYXRhIGZpZm8gKi8KKwkJCWx2YWwgPSBpbmwoYWlfY29udGV4dC0+ZGF0YV9yZWcpICYgMHhGRkZGOworCQkJbHZhbCBePSAweDgwMDA7CisKKwkJCWlmICghY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIGx2YWwpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IEJ1ZmZlciBvdmVyZmxvd1xuIiwKKwkJCQkJZGV2LT5taW5vcik7CisJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBXb3JrIGlzIGRvbmUsIHNvIHJlc2V0IHRoZSBpbnRlcnJ1cHQgKi8KKwkJSVNSX1BERUJVRworCQkJKCJtZTQwMDBfYWlfaXNyKCk6IFJlc2V0IGludGVycnVwdCBmcm9tIHNhbXBsZSBjb3VudGVyXG4iKTsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKwl9CisKKwlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCk6IEV2ZW50cyA9IDB4JVhcbiIsIHMtPmFzeW5jLT5ldmVudHMpOworCisJaWYgKHMtPmFzeW5jLT5ldmVudHMpCisJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFuYWxvZyBvdXRwdXQgc2VjdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IG1lNDAwMF9hb19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmFuZyA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgYXJlZiA9IENSX0FSRUYoaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9hb19pbnNuX3dyaXRlKClcbiIpOworCisJaWYgKGluc24tPm4gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGluc24tPm4gPiAxKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hb19pbnNuX3dyaXRlKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFuID49IHRoaXNib2FyZC0+YW8uY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogSW52YWxpZCBjaGFubmVsICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyYW5nICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogSW52YWxpZCByYW5nZSAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYXJlZiAhPSBBUkVGX0dST1VORCAmJiBhcmVmICE9IEFSRUZfQ09NTU9OKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hb19pbnNuX3dyaXRlKCk6IEludmFsaWQgYXJlZiAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KKwl0bXAgPSBtZTQwMDBfaW5sKGRldiwgaW5mby0+YW9fY29udGV4dFtjaGFuXS5jdHJsX3JlZyk7CisJdG1wIHw9IE1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YW9fY29udGV4dFtjaGFuXS5jdHJsX3JlZyk7CisKKwkvKiBDbGVhciBjb250cm9sIHJlZ2lzdGVyIGFuZCBzZXQgdG8gc2luZ2xlIG1vZGUgKi8KKwltZTQwMDBfb3V0bChkZXYsIDB4MCwgaW5mby0+YW9fY29udGV4dFtjaGFuXS5jdHJsX3JlZyk7CisKKwkvKiBXcml0ZSBkYXRhIHZhbHVlICovCisJbWU0MDAwX291dGwoZGV2LCBkYXRhWzBdLCBpbmZvLT5hb19jb250ZXh0W2NoYW5dLnNpbmdsZV9yZWcpOworCisJLyogU3RvcmUgaW4gdGhlIG1pcnJvciAqLworCWluZm8tPmFvX2NvbnRleHRbY2hhbl0ubWlycm9yID0gZGF0YVswXTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9hb19pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpbnNuLT5uID4gMSkgeworCQlwcmludGsoImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hb19pbnNuX3JlYWQoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGhcbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhWzBdID0gaW5mby0+YW9fY29udGV4dFtjaGFuXS5taXJyb3I7CisKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEaWdpdGFsIEkvTyBzZWN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgbWU0MDAwX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2Rpb19pbnNuX2JpdHMoKVxuIik7CisKKwkvKiBMZW5ndGggb2YgZGF0YSBtdXN0IGJlIDIgKG1hc2sgYW5kIG5ldyBkYXRhLCBzZWUgYmVsb3cpICovCisJaWYgKGluc24tPm4gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGluc24tPm4gIT0gMikgeworCQlwcmludGsoImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9kaW9faW5zbl9iaXRzKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBUaGUgaW5zbiBkYXRhIGNvbnNpc3RzIG9mIGEgbWFzayBpbiBkYXRhWzBdIGFuZCB0aGUgbmV3IGRhdGEKKwkgKiBpbiBkYXRhWzFdLiBUaGUgbWFzayBkZWZpbmVzIHdoaWNoIGJpdHMgd2UgYXJlIGNvbmNlcm5pbmcgYWJvdXQuCisJICogVGhlIG5ldyBkYXRhIG11c3QgYmUgYW5kZWQgd2l0aCB0aGUgbWFzay4KKwkgKiBFYWNoIGNoYW5uZWwgY29ycmVzcG9uZHMgdG8gYSBiaXQuCisJICovCisJaWYgKGRhdGFbMF0pIHsKKwkJLyogQ2hlY2sgaWYgcmVxdWVzdGVkIHBvcnRzIGFyZSBjb25maWd1cmVkIGZvciBvdXRwdXQgKi8KKwkJaWYgKChzLT5pb19iaXRzICYgZGF0YVswXSkgIT0gZGF0YVswXSkKKwkJCXJldHVybiAtRUlPOworCisJCXMtPnN0YXRlICY9IH5kYXRhWzBdOworCQlzLT5zdGF0ZSB8PSBkYXRhWzBdICYgZGF0YVsxXTsKKworCQkvKiBXcml0ZSBvdXQgdGhlIG5ldyBkaWdpdGFsIG91dHB1dCBsaW5lcyAqLworCQltZTQwMDBfb3V0bChkZXYsIChzLT5zdGF0ZSA+PiAwKSAmIDB4RkYsCisJCQlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzBfcmVnKTsKKwkJbWU0MDAwX291dGwoZGV2LCAocy0+c3RhdGUgPj4gOCkgJiAweEZGLAorCQkJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8xX3JlZyk7CisJCW1lNDAwMF9vdXRsKGRldiwgKHMtPnN0YXRlID4+IDE2KSAmIDB4RkYsCisJCQlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzJfcmVnKTsKKwkJbWU0MDAwX291dGwoZGV2LCAocy0+c3RhdGUgPj4gMjQpICYgMHhGRiwKKwkJCWluZm8tPmRpb19jb250ZXh0LnBvcnRfM19yZWcpOworCX0KKworCS8qIE9uIHJldHVybiwgZGF0YVsxXSBjb250YWlucyB0aGUgdmFsdWUgb2YKKwkgICB0aGUgZGlnaXRhbCBpbnB1dCBhbmQgb3V0cHV0IGxpbmVzLiAqLworCWRhdGFbMV0gPQorCQkoKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5wb3J0XzBfcmVnKSAmIDB4RkYpIDw8IDApIHwKKwkJKChtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQucG9ydF8xX3JlZykgJiAweEZGKSA8PCA4KSB8CisJCSgobWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LnBvcnRfMl9yZWcpICYgMHhGRikgPDwgMTYpIHwKKwkJKChtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQucG9ydF8zX3JlZykgJiAweEZGKSA8PCAyNCk7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBtZTQwMDBfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2Rpb19pbnNuX2NvbmZpZygpXG4iKTsKKworCWlmIChkYXRhWzBdID09IElOU05fQ09ORklHX0RJT19RVUVSWSkgeworCQlkYXRhWzFdID0KKwkJCShzLT4KKwkJCWlvX2JpdHMgJiAoMSA8PCBjaGFuKSkgPyBDT01FRElfT1VUUFVUIDogQ09NRURJX0lOUFVUOworCQlyZXR1cm4gaW5zbi0+bjsKKwl9CisKKwkvKgorCSAqIFRoZSBpbnB1dCBvciBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiBlYWNoIGRpZ2l0YWwgbGluZSBpcworCSAqIGNvbmZpZ3VyZWQgYnkgYSBzcGVjaWFsIGluc25fY29uZmlnIGluc3RydWN0aW9uLiAgY2hhbnNwZWMKKwkgKiBjb250YWlucyB0aGUgY2hhbm5lbCB0byBiZSBjaGFuZ2VkLCBhbmQgZGF0YVswXSBjb250YWlucyB0aGUKKwkgKiB2YWx1ZSBDT01FRElfSU5QVVQgb3IgQ09NRURJX09VVFBVVC4KKwkgKiBPbiB0aGUgTUUtNDAwMCBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIHN3aXRjaCBwb3J0IHdpc2UgKDggYml0KQorCSAqLworCisJdG1wID0gbWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LmN0cmxfcmVnKTsKKworCWlmIChkYXRhWzBdID09IENPTUVESV9PVVRQVVQpIHsKKwkJaWYgKGNoYW4gPCA4KSB7CisJCQlzLT5pb19iaXRzIHw9IDB4RkY7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzEpOworCQkJdG1wIHw9IE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wOworCQl9IGVsc2UgaWYgKGNoYW4gPCAxNikgeworCQkJLyoKKwkJCSAqIENoZWNoIGZvciBvcHRvaXNvbGF0ZWQgTUUtNDAwMCB2ZXJzaW9uLiBJZiBvbmUgdGhlIGZpcnN0CisJCQkgKiBwb3J0IGlzIGEgZml4ZWQgb3V0cHV0IHBvcnQgYW5kIHRoZSBzZWNvbmQgaXMgYSBmaXhlZCBpbnB1dCBwb3J0LgorCQkJICovCisJCQlpZiAoIW1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnKSkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkJcy0+aW9fYml0cyB8PSAweEZGMDA7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMiB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzMpOworCQkJdG1wIHw9IE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yOworCQl9IGVsc2UgaWYgKGNoYW4gPCAyNCkgeworCQkJcy0+aW9fYml0cyB8PSAweEZGMDAwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV80IHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNSk7CisJCQl0bXAgfD0gTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzQ7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDMyKSB7CisJCQlzLT5pb19iaXRzIHw9IDB4RkYwMDAwMDA7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNiB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzcpOworCQkJdG1wIHw9IE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV82OworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY2hhbiA8IDgpIHsKKwkJCS8qCisJCQkgKiBDaGVjaCBmb3Igb3B0b2lzb2xhdGVkIE1FLTQwMDAgdmVyc2lvbi4gSWYgb25lIHRoZSBmaXJzdAorCQkJICogcG9ydCBpcyBhIGZpeGVkIG91dHB1dCBwb3J0IGFuZCB0aGUgc2Vjb25kIGlzIGEgZml4ZWQgaW5wdXQgcG9ydC4KKwkJCSAqLworCQkJaWYgKCFtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQuZGlyX3JlZykpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJCXMtPmlvX2JpdHMgJj0gfjB4RkY7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzEpOworCQl9IGVsc2UgaWYgKGNoYW4gPCAxNikgeworCQkJcy0+aW9fYml0cyAmPSB+MHhGRjAwOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzIgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8zKTsKKwkJfSBlbHNlIGlmIChjaGFuIDwgMjQpIHsKKwkJCXMtPmlvX2JpdHMgJj0gfjB4RkYwMDAwOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzQgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV81KTsKKwkJfSBlbHNlIGlmIChjaGFuIDwgMzIpIHsKKwkJCXMtPmlvX2JpdHMgJj0gfjB4RkYwMDAwMDA7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNiB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzcpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+ZGlvX2NvbnRleHQuY3RybF9yZWcpOworCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ291bnRlciBzZWN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY250X3Jlc2V0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCisJQ0FMTF9QREVCVUcoIkluIGNudF9yZXNldCgpXG4iKTsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgMDoKKwkJbWU0MDAwX291dGIoZGV2LCAweDMwLCBpbmZvLT5jbnRfY29udGV4dC5jdHJsX3JlZyk7CisJCW1lNDAwMF9vdXRiKGRldiwgMHgwMCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyk7CisJCW1lNDAwMF9vdXRiKGRldiwgMHgwMCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbWU0MDAwX291dGIoZGV2LCAweDcwLCBpbmZvLT5jbnRfY29udGV4dC5jdHJsX3JlZyk7CisJCW1lNDAwMF9vdXRiKGRldiwgMHgwMCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyk7CisJCW1lNDAwMF9vdXRiKGRldiwgMHgwMCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbWU0MDAwX291dGIoZGV2LCAweEIwLCBpbmZvLT5jbnRfY29udGV4dC5jdHJsX3JlZyk7CisJCW1lNDAwMF9vdXRiKGRldiwgMHgwMCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyk7CisJCW1lNDAwMF9vdXRiKGRldiwgMHgwMCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGNudF9yZXNldCgpOiBJbnZhbGlkIGNoYW5uZWxcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY250X2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwl1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlpbnQgdG1wID0gMDsKKworCUNBTExfUERFQlVHKCJJbiBjbnRfY29uZmlnKClcbiIpOworCisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSAwOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9DT1VOVEVSXzA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdG1wIHw9IE1FNDAwMF9DTlRfQ09VTlRFUl8xOworCQlicmVhazsKKwljYXNlIDI6CisJCXRtcCB8PSBNRTQwMDBfQ05UX0NPVU5URVJfMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogY250X2NvbmZpZygpOiBJbnZhbGlkIGNoYW5uZWxcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAwOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9NT0RFXzA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdG1wIHw9IE1FNDAwMF9DTlRfTU9ERV8xOworCQlicmVhazsKKwljYXNlIDI6CisJCXRtcCB8PSBNRTQwMDBfQ05UX01PREVfMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9NT0RFXzM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdG1wIHw9IE1FNDAwMF9DTlRfTU9ERV80OworCQlicmVhazsKKwljYXNlIDU6CisJCXRtcCB8PSBNRTQwMDBfQ05UX01PREVfNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogY250X2NvbmZpZygpOiBJbnZhbGlkIGNvdW50ZXIgbW9kZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBXcml0ZSB0aGUgY29udHJvbCB3b3JkICovCisJdG1wIHw9IDB4MzA7CisJbWU0MDAwX291dGIoZGV2LCB0bXAsIGluZm8tPmNudF9jb250ZXh0LmN0cmxfcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlpbnQgZXJyOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9jbnRfaW5zbl9jb25maWcoKVxuIik7CisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIEdQQ1RfUkVTRVQ6CisJCWlmIChpbnNuLT5uICE9IDEpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fY29uZmlnKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoJWRcbiIsCisJCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWVyciA9IGNudF9yZXNldChkZXYsIGluc24tPmNoYW5zcGVjKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgR1BDVF9TRVRfT1BFUkFUSU9OOgorCQlpZiAoaW5zbi0+biAhPSAyKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCVkXG4iLAorCQkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQllcnIgPSBjbnRfY29uZmlnKGRldiwgaW5zbi0+Y2hhbnNwZWMsIGRhdGFbMV0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpOiBJbnZhbGlkIGluc3RydWN0aW9uXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJdW5zaWduZWQgc2hvcnQgdG1wOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9jbnRfaW5zbl9yZWFkKClcbiIpOworCisJaWYgKGluc24tPm4gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGluc24tPm4gPiAxKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9yZWFkKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoaW5zbi0+Y2hhbnNwZWMpIHsKKwljYXNlIDA6CisJCXRtcCA9IG1lNDAwMF9pbmIoZGV2LCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJZGF0YVswXSA9IHRtcDsKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcpOworCQlkYXRhWzBdIHw9IHRtcCA8PCA4OworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCA9IG1lNDAwMF9pbmIoZGV2LCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJZGF0YVswXSA9IHRtcDsKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcpOworCQlkYXRhWzBdIHw9IHRtcCA8PCA4OworCQlicmVhazsKKwljYXNlIDI6CisJCXRtcCA9IG1lNDAwMF9pbmIoZGV2LCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJZGF0YVswXSA9IHRtcDsKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcpOworCQlkYXRhWzBdIHw9IHRtcCA8PCA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fcmVhZCgpOiBJbnZhbGlkIGNoYW5uZWwgJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5jaGFuc3BlYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl93cml0ZShjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCXVuc2lnbmVkIHNob3J0IHRtcDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfY250X2luc25fd3JpdGUoKVxuIik7CisKKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaW5zbi0+biA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX3dyaXRlKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoaW5zbi0+Y2hhbnNwZWMpIHsKKwljYXNlIDA6CisJCXRtcCA9IGRhdGFbMF0gJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyk7CisJCXRtcCA9IChkYXRhWzBdID4+IDgpICYgMHhGRjsKKwkJbWU0MDAwX291dGIoZGV2LCB0bXAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcpOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCA9IGRhdGFbMF0gJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyk7CisJCXRtcCA9IChkYXRhWzBdID4+IDgpICYgMHhGRjsKKwkJbWU0MDAwX291dGIoZGV2LCB0bXAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRtcCA9IGRhdGFbMF0gJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyk7CisJCXRtcCA9IChkYXRhWzBdID4+IDgpICYgMHhGRjsKKwkJbWU0MDAwX291dGIoZGV2LCB0bXAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fd3JpdGUoKTogSW52YWxpZCBjaGFubmVsICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+Y2hhbnNwZWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfbWU0MDAwLCBtZTQwMDBfcGNpX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJiODg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5oCkBAIC0wLDAgKzEsNDQ2IEBACisvKgorICAgIG1lNDAwMC5oCisgICAgUmVnaXN0ZXIgZGVzY3JpcHRpb25zIGFuZCBkZWZpbmVzIGZvciB0aGUgTUUtNDAwMCBib2FyZCBmYW1pbHkKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtOSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9NRTQwMDBfSF8KKyNkZWZpbmUgX01FNDAwMF9IXworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlYnVnIHNlY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI3VuZGVmIE1FNDAwMF9DQUxMX0RFQlVHCS8vIERlYnVnIGZ1bmN0aW9uIGVudHJ5IGFuZCBleGl0CisjdW5kZWYgTUU0MDAwX1BPUlRfREVCVUcJLy8gRGVidWcgcG9ydCBhY2Nlc3MKKyN1bmRlZiBNRTQwMDBfSVNSX0RFQlVHCQkvLyBEZWJ1ZyB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorI3VuZGVmIE1FNDAwMF9ERUJVRwkJLy8gR2VuZXJhbCBwdXJwb3NlIGRlYnVnIG1hc3NlZ2VzCisKKyNpZmRlZiBNRTQwMDBfQ0FMTF9ERUJVRworI3VuZGVmIENBTExfUERFQlVHCisjZGVmaW5lIENBTExfUERFQlVHKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUciY29tZWRpJWQ6IG1lNDAwMDogIiBmbXQsIGRldi0+bWlub3IsICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBDQUxMX1BERUJVRyhmbXQsIGFyZ3MuLi4pCS8vIG5vIGRlYnVnZ2luZywgZG8gbm90aGluZworI2VuZGlmCisKKyNpZmRlZiBNRTQwMDBfUE9SVF9ERUJVRworI3VuZGVmIFBPUlRfUERFQlVHCisjZGVmaW5lIFBPUlRfUERFQlVHKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUciY29tZWRpJWQ6IG1lNDAwMDogIiBmbXQsIGRldi0+bWlub3IsICAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQT1JUX1BERUJVRyhmbXQsIGFyZ3MuLi4pCS8vIG5vIGRlYnVnZ2luZywgZG8gbm90aGluZworI2VuZGlmCisKKyNpZmRlZiBNRTQwMDBfSVNSX0RFQlVHCisjdW5kZWYgSVNSX1BERUJVRworI2RlZmluZSBJU1JfUERFQlVHKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUciY29tZWRpJWQ6IG1lNDAwMDogIiBmbXQsIGRldi0+bWlub3IsICAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBJU1JfUERFQlVHKGZtdCwgYXJncy4uLikJLy8gbm8gZGVidWdnaW5nLCBkbyBub3RoaW5nCisjZW5kaWYKKworI2lmZGVmIE1FNDAwMF9ERUJVRworI3VuZGVmIFBERUJVRworI2RlZmluZSBQREVCVUcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyJjb21lZGklZDogbWU0MDAwOiAiIGZtdCwgZGV2LT5taW5vciwgICMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pCS8vIG5vIGRlYnVnZ2luZywgZG8gbm90aGluZworI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIHZlbmRvciBhbmQgZGV2aWNlIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUVJTEhBVVMgMHgxNDAyCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTAJMHg0NjUwCS8vIExvdyBDb3N0IHZlcnNpb24KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MAkweDQ2NjAJLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEkJMHg0NjYxCS8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTCTB4NDY2MgkvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVMJMHg0NjYzCS8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MAkweDQ2NzAJLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEkJMHg0NjcxCS8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTCTB4NDY3MgkvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVMJMHg0NjczCS8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MAkweDQ2ODAJLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MEkJMHg0NjgxCS8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTCTB4NDY4MgkvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVMJMHg0NjgzCS8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBNRS00MDAwIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0cworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BT18wMF9DVFJMX1JFRwkJCTB4MDAJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wMF9TVEFUVVNfUkVHCQkJMHgwNAkvLyBSL18KKyNkZWZpbmUgTUU0MDAwX0FPXzAwX0ZJRk9fUkVHCQkJMHgwOAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAwX1NJTkdMRV9SRUcJCQkweDBDCS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDBfVElNRVJfUkVHCQkJMHgxMAkvLyBfL1cKKworI2RlZmluZSBNRTQwMDBfQU9fMDFfQ1RSTF9SRUcJCQkweDE4CS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDFfU1RBVFVTX1JFRwkJCTB4MUMJLy8gUi9fCisjZGVmaW5lIE1FNDAwMF9BT18wMV9GSUZPX1JFRwkJCTB4MjAJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BT18wMV9TSU5HTEVfUkVHCQkJMHgyNAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAxX1RJTUVSX1JFRwkJCTB4MjgJLy8gXy9XCisKKyNkZWZpbmUgTUU0MDAwX0FPXzAyX0NUUkxfUkVHCQkJMHgzMAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAyX1NUQVRVU19SRUcJCQkweDM0CS8vIFIvXworI2RlZmluZSBNRTQwMDBfQU9fMDJfRklGT19SRUcJCQkweDM4CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQU9fMDJfU0lOR0xFX1JFRwkJCTB4M0MJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wMl9USU1FUl9SRUcJCQkweDQwCS8vIF8vVworCisjZGVmaW5lIE1FNDAwMF9BT18wM19DVFJMX1JFRwkJCTB4NDgJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wM19TVEFUVVNfUkVHCQkJMHg0QwkvLyBSL18KKyNkZWZpbmUgTUU0MDAwX0FPXzAzX0ZJRk9fUkVHCQkJMHg1MAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAzX1NJTkdMRV9SRUcJCQkweDU0CS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDNfVElNRVJfUkVHCQkJMHg1OAkvLyBfL1cKKworI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9SRUcJCQkweDc0CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX1JFRwkJCTB4NzQJLy8gUi9fCisjZGVmaW5lIE1FNDAwMF9BSV9DSEFOTkVMX0xJU1RfUkVHCQkweDc4CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfREFUQV9SRUcJCQkweDdDCS8vIFIvXworI2RlZmluZSBNRTQwMDBfQUlfQ0hBTl9USU1FUl9SRUcJCTB4ODAJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9DSEFOX1BSRV9USU1FUl9SRUcJCTB4ODQJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TQ0FOX1RJTUVSX0xPV19SRUcJCTB4ODgJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TQ0FOX1RJTUVSX0hJR0hfUkVHCQkweDhDCS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfU0NBTl9QUkVfVElNRVJfTE9XX1JFRwkweDkwCS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfU0NBTl9QUkVfVElNRVJfSElHSF9SRUcJMHg5NAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVJUX1JFRwkJCTB4OTgJLy8gUi9fCisKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfUkVHCQkJMHg5QwkvLyBSL18KKworI2RlZmluZSBNRTQwMDBfRElPX1BPUlRfMF9SRUcJCQkweEEwCS8vIFIvVworI2RlZmluZSBNRTQwMDBfRElPX1BPUlRfMV9SRUcJCQkweEE0CS8vIFIvVworI2RlZmluZSBNRTQwMDBfRElPX1BPUlRfMl9SRUcJCQkweEE4CS8vIFIvVworI2RlZmluZSBNRTQwMDBfRElPX1BPUlRfM19SRUcJCQkweEFDCS8vIFIvVworI2RlZmluZSBNRTQwMDBfRElPX0RJUl9SRUcJCQkweEIwCS8vIFIvVworCisjZGVmaW5lIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYCQkJMHhCNAkvLyBSL1cKKworI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfUkVHCQkJMHhCOAkvLyBSL1cKKworI2RlZmluZSBNRTQwMDBfQU9fREVNVVhfQURKVVNUX1JFRwkJMHhCQwkvLyAtL1cKKworI2RlZmluZSBNRTQwMDBfQUlfU0FNUExFX0NPVU5URVJfUkVHCQkweEMwCS8vIF8vVworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFZhbHVlIHRvIGFkanVzdCBEZW11eAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BT19ERU1VWF9BREpVU1RfVkFMVUUgICAgICAgICAgICAweDRDCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ291bnRlciBiYXNlIHJlZ2lzdGVyIG9mZnNldHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfQ05UX0NPVU5URVJfMF9SRUcJCTB4MDAKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzFfUkVHCQkweDAxCisjZGVmaW5lIE1FNDAwMF9DTlRfQ09VTlRFUl8yX1JFRwkJMHgwMgorI2RlZmluZSBNRTQwMDBfQ05UX0NUUkxfUkVHCQkJMHgwMworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFBMWCBiYXNlIHJlZ2lzdGVyIG9mZnNldHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQTFhfSU5UQ1NSCTB4NEMJLy8gSW50ZXJydXB0IGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcgorI2RlZmluZSBQTFhfSUNSCQkweDUwCS8vIEluaXRpYWxpemF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgUExYX0lDU1IgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfRU4gICAgICAgICAgICAgMHgwMQkvLyBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAxIGlzIGVuYWJsZWQgKHIvdykKKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQxX1BPTCAgICAgICAgICAgIDB4MDIJLy8gSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMSBwb2xhcml0eSBpcyBhY3RpdmUgaGlnaCAoci93KQorI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfU1RBVEUgICAgICAgICAgMHgwNAkvLyBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAxIGlzIGFjdGl2ZSAoci9fKQorI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gICAgICAgICAgICAgMHgwOAkvLyBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAyIGlzIGVuYWJsZWQgKHIvdykKKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCAgICAgICAgICAgIDB4MTAJLy8gSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMiBwb2xhcml0eSBpcyBhY3RpdmUgaGlnaCAoci93KQorI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfU1RBVEUgICAgICAgICAgMHgyMAkvLyBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAyIGlzIGFjdGl2ZSAgKHIvXykKKyNkZWZpbmUgUExYX0lOVENTUl9QQ0lfSU5UX0VOICAgICAgICAgICAgICAgIDB4NDAJLy8gSWYgc2V0LCBQQ0kgaW50ZXJydXB0IGlzIGVuYWJsZWQgKHIvdykKKyNkZWZpbmUgUExYX0lOVENTUl9TT0ZUX0lOVCAgICAgICAgICAgICAgICAgIDB4ODAJLy8gSWYgc2V0LCBhIHNvZnR3YXJlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgKHIvdykKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgUExYX0lDUiByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9DTE9DS19TRVQJCTB4MDEwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX0NISVBfU0VMRUNUCQkweDAyMDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9XUklURQkJMHgwNDAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fUkVBRAkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX1ZBTElECQkweDEwMDAwMDAwCisKKyNkZWZpbmUgUExYX0lDUl9NQVNLX0VFUFJPTQkJCTB4MUYwMDAwMDAKKworI2RlZmluZSBFRVBST01fREVMQVkJCQkJMQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBNRTQwMDBfQU9fQ1RSTF9SRUcgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfTU9ERV8wCQkweDAwMQorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfTU9ERV8xCQkweDAwMgorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9NQVNLX01PREUJCTB4MDAzCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9TVE9QCQkJMHgwMDQKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPCQkweDAwOAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcJMHgwMTAKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRQkJMHgwMjAKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCTB4MDgwCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRE8JCTB4MTAwCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRCQkweDIwMAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJRCQkweDQwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBNRTQwMDBfQU9fU1RBVFVTX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BT19TVEFUVVNfQklUX0ZTTQkJMHgwMQorI2RlZmluZSBNRTQwMDBfQU9fU1RBVFVTX0JJVF9GRgkJCTB4MDIKKyNkZWZpbmUgTUU0MDAwX0FPX1NUQVRVU19CSVRfSEYJCQkweDA0CisjZGVmaW5lIE1FNDAwMF9BT19TVEFUVVNfQklUX0VGCQkJMHgwOAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBNRTQwMDBfQUlfQ1RSTF9SRUcgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8wCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzEJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMgkJMHgwMDAwMDAwNAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfU0FNUExFX0hPTEQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX1NUT1AJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8JCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTwkJMHgwMDAwMDA4MAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRlVMTFNDQUxFCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9PRkZTRVQJCTB4MDAwMDAyMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0VYX1RSSUdfQU5BTE9HCTB4MDAwMDA0MDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0VYX1RSSUcJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0VYX1RSSUdfRkFMTElORwkweDAwMDAxMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9FWF9JUlEJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVAkJMHgwMDAwNDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfTEVfSVJRCQkweDAwMDA4MDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9MRV9JUlFfUkVTRVQJCTB4MDAwMTAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUQkJMHgwMDAyMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUCQkweDAwMDQwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlEJCTB4MDAwODAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVAkJMHgwMDEwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FECQkweDAwMjAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0JPVEgJCTB4ODAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgTUU0MDAwX0FJX1NUQVRVU19SRUcgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9DSEFOTkVMCQkweDAwNDAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0hGX0NIQU5ORUwJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfRkZfQ0hBTk5FTAkJMHgwMTAwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBCQkweDAyMDAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEJCTB4MDQwMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfRkZfREFUQQkJMHgwODAwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9MRQkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfRlNNCQkweDIwMDAwMDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9JUlFfU1RBVFVTX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9FWAkJMHgwMQorI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfTEUJCTB4MDIKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FJX0hGCQkweDA0CisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9BT18wX0hGCQkweDA4CisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9BT18xX0hGCQkweDEwCisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9BT18yX0hGCQkweDIwCisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9BT18zX0hGCQkweDQwCisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9TQwkJMHg4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBNRTQwMDBfRElPX0NUUkxfUkVHIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAJCTB4MDAwMQorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMQkJMHgwMDAyCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yCQkweDAwMDQKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzMJCTB4MDAwOAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNAkJMHgwMDEwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV81CQkweDAwMjAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzYJCTB4MDA0MAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNwkJMHgwMDgwCisKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wCQkweDAxMDAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xCQkweDAyMDAKKworI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wCQkweDA0MDAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMQkJMHgwODAwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzIJCTB4MTAwMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8zCQkweDIwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaGFyZHdhcmUgY2FwYWJpbGl0aWVzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9hb19pbmZvIHsKKwlpbnQgY291bnQ7CisJaW50IGZpZm9fY291bnQ7Cit9IG1lNDAwMF9hb19pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9haV9pbmZvIHsKKwlpbnQgY291bnQ7CisJaW50IHNoX2NvdW50OworCWludCBkaWZmX2NvdW50OworCWludCBleF90cmlnX2FuYWxvZzsKK30gbWU0MDAwX2FpX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2Rpb19pbmZvIHsKKwlpbnQgY291bnQ7Cit9IG1lNDAwMF9kaW9faW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfY250X2luZm8geworCWludCBjb3VudDsKK30gbWU0MDAwX2NudF9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQ7CisJbWU0MDAwX2FvX2luZm9fdCBhbzsKKwltZTQwMDBfYWlfaW5mb190IGFpOworCW1lNDAwMF9kaW9faW5mb190IGRpbzsKKwltZTQwMDBfY250X2luZm9fdCBjbnQ7Cit9IG1lNDAwMF9ib2FyZF90OworCisjZGVmaW5lIHRoaXNib2FyZCAoKGNvbnN0IG1lNDAwMF9ib2FyZF90ICopZGV2LT5ib2FyZF9wdHIpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgR2xvYmFsIGJvYXJkIGFuZCBzdWJkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0dXJlcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCB7CisJaW50IGlycTsKKworCXVuc2lnbmVkIGxvbmcgbWlycm9yOwkvLyBTdG9yZSB0aGUgbGFzdCB3cml0dGVuIHZhbHVlCisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZpZm9fcmVnOworCXVuc2lnbmVkIGxvbmcgc2luZ2xlX3JlZzsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgcHJlbG9hZF9yZWc7Cit9IG1lNDAwMF9hb19jb250ZXh0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9haV9jb250ZXh0IHsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFubmVsX2xpc3RfcmVnOworCXVuc2lnbmVkIGxvbmcgZGF0YV9yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFuX3RpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNoYW5fcHJlX3RpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXJfbG93X3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXJfaGlnaF9yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3ByZV90aW1lcl9sb3dfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9wcmVfdGltZXJfaGlnaF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGFydF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNhbXBsZV9jb3VudGVyX3JlZzsKK30gbWU0MDAwX2FpX2NvbnRleHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2Rpb19jb250ZXh0IHsKKwl1bnNpZ25lZCBsb25nIGRpcl9yZWc7CisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfMF9yZWc7CisJdW5zaWduZWQgbG9uZyBwb3J0XzFfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF8yX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfM19yZWc7Cit9IG1lNDAwMF9kaW9fY29udGV4dF90OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfY250X2NvbnRleHQgeworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyXzBfcmVnOworCXVuc2lnbmVkIGxvbmcgY291bnRlcl8xX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNvdW50ZXJfMl9yZWc7Cit9IG1lNDAwMF9jbnRfY29udGV4dF90OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBwbHhfcmVnYmFzZTsJLy8gUExYIGNvbmZpZ3VyYXRpb24gc3BhY2UgYmFzZSBhZGRyZXNzCisJdW5zaWduZWQgbG9uZyBtZTQwMDBfcmVnYmFzZTsJLy8gQmFzZSBhZGRyZXNzIG9mIHRoZSBNRTQwMDAKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3JlZ2Jhc2U7CS8vIEJhc2UgYWRkcmVzcyBvZiB0aGUgdGltZXIgY2lyY3VpdAorCXVuc2lnbmVkIGxvbmcgcHJvZ3JhbV9yZWdiYXNlOwkvLyBCYXNlIGFkZHJlc3MgdG8gc2V0IHRoZSBwcm9ncmFtIHBpbiBmb3IgdGhlIHhpbGlueAorCisJdW5zaWduZWQgbG9uZyBwbHhfcmVnYmFzZV9zaXplOwkvLyBQTFggcmVnaXN0ZXIgc2V0IHNwYWNlCisJdW5zaWduZWQgbG9uZyBtZTQwMDBfcmVnYmFzZV9zaXplOwkvLyBNRTQwMDAgcmVnaXN0ZXIgc2V0IHNwYWNlCisJdW5zaWduZWQgbG9uZyB0aW1lcl9yZWdiYXNlX3NpemU7CS8vIFRpbWVyIGNpcmN1aXQgcmVnaXN0ZXIgc2V0IHNwYWNlCisJdW5zaWduZWQgbG9uZyBwcm9ncmFtX3JlZ2Jhc2Vfc2l6ZTsJLy8gU2l6ZSBvZiBwcm9ncmFtIGJhc2UgYWRkcmVzcyBvZiB0aGUgTUU0MDAwCisKKwl1bnNpZ25lZCBpbnQgc2VyaWFsX25vOwkvLyBTZXJpYWwgbnVtYmVyIG9mIHRoZSBib2FyZAorCXVuc2lnbmVkIGNoYXIgaHdfcmV2aXNpb247CS8vIEhhcmR3YXJlIHJldmlzaW9uIG9mIHRoZSBib2FyZAorCXVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZDsJLy8gTWVpbGhhdXMgdmVuZG9yIGlkCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkOwkvLyBEZXZpY2UgaWQKKworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X3A7CS8vIEdlbmVyYWwgUENJIGluZm9ybWF0aW9uCisKKwl1bnNpZ25lZCBpbnQgaXJxOwkvLyBJUlEgYXNzaWduZWQgZnJvbSB0aGUgUENJIEJJT1MKKworCXN0cnVjdCBtZTQwMDBfYWlfY29udGV4dCBhaV9jb250ZXh0OwkvLyBBbmFsb2cgaW5wdXQgIHNwZWNpZmljIGNvbnRleHQKKwlzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQgYW9fY29udGV4dFs0XTsJLy8gVmVjdG9yIHdpdGggYW5hbG9nIG91dHB1dCBzcGVjaWZpYyBjb250ZXh0CisJc3RydWN0IG1lNDAwMF9kaW9fY29udGV4dCBkaW9fY29udGV4dDsJLy8gRGlnaXRhbCBJL08gc3BlY2lmaWMgY29udGV4dAorCXN0cnVjdCBtZTQwMDBfY250X2NvbnRleHQgY250X2NvbnRleHQ7CS8vIENvdW50ZXIgc3BlY2lmaWMgY29udGV4dAorfSBtZTQwMDBfaW5mb190OworCisjZGVmaW5lIGluZm8JKChtZTQwMDBfaW5mb190ICopZGV2LT5wcml2YXRlKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERlZmluZXMgZm9yIGFuYWxvZyBpbnB1dAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHZW5lcmFsIHN0dWZmICovCisjZGVmaW5lIE1FNDAwMF9BSV9GSUZPX0NPVU5UCQkJMjA0OAorCisjZGVmaW5lIE1FNDAwMF9BSV9NSU5fVElDS1MJCQk2NgorI2RlZmluZSBNRTQwMDBfQUlfTUlOX1NBTVBMRV9USU1FCQkyMDAwCS8vIE1pbmltdW0gc2FtcGxlIHRpbWUgW25zXQorI2RlZmluZSBNRTQwMDBfQUlfQkFTRV9GUkVRVUVOQ1kJCSh1bnNpZ25lZCBpbnQpIDMzRTYKKworLyogQ2hhbm5lbCBsaXN0IGRlZmluZXMgYW5kIG1hc2tzICovCisjZGVmaW5lIE1FNDAwMF9BSV9DSEFOTkVMX0xJU1RfQ09VTlQJCTEwMjQKKworI2RlZmluZSBNRTQwMDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQJMHgwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMCTB4MDIwCisKKyNkZWZpbmUgTUU0MDAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMAkJMHgwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzUJMHgwNDAKKyNkZWZpbmUgTUU0MDAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMTAJMHgwODAKKyNkZWZpbmUgTUU0MDAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81CTB4MEMwCisKKyNkZWZpbmUgTUU0MDAwX0FJX0xJU1RfTEFTVF9FTlRSWQkJMHgxMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEZWZpbmVzIGZvciBjb3VudGVycworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1FNDAwMF9DTlRfQ09VTlRFUl8wICAweDAwCisjZGVmaW5lIE1FNDAwMF9DTlRfQ09VTlRFUl8xICAweDQwCisjZGVmaW5lIE1FNDAwMF9DTlRfQ09VTlRFUl8yICAweDgwCisKKyNkZWZpbmUgTUU0MDAwX0NOVF9NT0RFXzAgICAgIDB4MDAJLy8gQ2hhbmdlIHN0YXRlIGlmIHplcm8gY3Jvc3NpbmcKKyNkZWZpbmUgTUU0MDAwX0NOVF9NT0RFXzEgICAgIDB4MDIJLy8gUmV0cmlnZ2VyYWJsZSBPbmUtU2hvdAorI2RlZmluZSBNRTQwMDBfQ05UX01PREVfMiAgICAgMHgwNAkvLyBBc3ltbWV0cmljYWwgZGl2aWRlcgorI2RlZmluZSBNRTQwMDBfQ05UX01PREVfMyAgICAgMHgwNgkvLyBTeW1tZXRyaWNhbCBkaXZpZGVyCisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV80ICAgICAweDA4CS8vIENvdW50ZXIgc3RhcnQgYnkgc29mdHdhcmUgdHJpZ2dlcgorI2RlZmluZSBNRTQwMDBfQ05UX01PREVfNSAgICAgMHgwQQkvLyBDb3VudGVyIHN0YXJ0IGJ5IGhhcmR3YXJlIHRyaWdnZXIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjY2VjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYwpAQCAtMCwwICsxLDg0NSBAQAorLyoKKworICAgY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKKworICAgSGFyZHdhcmUgZHJpdmVyIGZvciBNZWlsaGF1cyBkYXRhIGFjcXVpc2l0aW9uIGNhcmRzOgorCisgICAgIE1FLTIwMDBpLCBNRS0yNjAwaSwgTUUtMzAwMHZtMQorCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWljaGFlbCBIaWxsbWFubiA8aGlsbG1hbm5Ac3lzY29uZ3JvdXAuZGU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCitEcml2ZXI6IG1lX2RhcQorRGVzY3JpcHRpb246IE1laWxoYXVzIFBDSSBkYXRhIGFjcXVpc2l0aW9uIGNhcmRzCitBdXRob3I6IE1pY2hhZWwgSGlsbG1hbm4gPGhpbGxtYW5uQHN5c2Nvbmdyb3VwLmRlPgorRGV2aWNlczogW01laWxoYXVzXSBNRS0yNjAwaSAobWVfZGFxKSwgTUUtMjAwMGkKK1N0YXR1czogZXhwZXJpbWVudGFsCisKK1N1cHBvcnRzOgorCisgICAgQW5hbG9nIE91dHB1dAorCitDb25maWd1cmF0aW9uIG9wdGlvbnM6CisKKyAgICBbMF0gLSBQQ0kgYnVzIG51bWJlciAob3B0aW9uYWwpCisgICAgWzFdIC0gUENJIHNsb3QgbnVtYmVyIChvcHRpb25hbCkKKworICAgIElmIGJ1cy9zbG90IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhdmFpbGFibGUgUENJCisgICAgZGV2aWNlIHdpbGwgYmUgdXNlZC4KKworVGhlIDI2MDAgcmVxdWlyZXMgYSBmaXJtd2FyZSB1cGxvYWQsIHdoaWNoIGNhbiBiZSBhY2NvbXBsaXNoZWQKK3VzaW5nIHRoZSAtaSBvciAtLWluaXQtZGF0YSBvcHRpb24gb2YgY29tZWRpX2NvbmZpZy4KK1RoZSBmaXJtd2FyZSBjYW4gYmUKK2ZvdW5kIGluIHRoZSBjb21lZGlfbm9uZnJlZV9maXJtd2FyZSB0YXJiYWxsIGF2YWlsYWJsZQorZnJvbSBodHRwOi8vd3d3LmNvbWVkaS5vcmcKKworKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorCisvKiNpbmNsdWRlICJtZTI2MDBfZncuaCIgKi8KKworI2RlZmluZSBNRV9EUklWRVJfTkFNRQkJIm1lX2RhcSIKKworI2RlZmluZSBNRTIwMDBfREVWSUNFX0lECTB4MjAwMAorI2RlZmluZSBNRTI2MDBfREVWSUNFX0lECTB4MjYwMAorCisjZGVmaW5lIFBMWF9JTlRDU1IJCTB4NEMJLyogUExYIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElMSU5YX0RPV05MT0FEX1JFU0VUCTB4NDIJLyogWGlsaW54IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE1FX0NPTlRST0xfMQkJCTB4MDAwMAkvKiAtIHwgVyAqLworI2RlZmluZSAgIElOVEVSUlVQVF9FTkFCTEUJCSgxPDwxNSkKKyNkZWZpbmUgICBDT1VOVEVSX0JfSVJRCQkJKDE8PDEyKQorI2RlZmluZSAgIENPVU5URVJfQV9JUlEJCQkoMTw8MTEpCisjZGVmaW5lICAgQ0hBTkxJU1RfUkVBRFlfSVJRCQkoMTw8MTApCisjZGVmaW5lICAgRVhUX0lSUQkJCSgxPDw5KQorI2RlZmluZSAgIEFERklGT19IQUxGRlVMTF9JUlEJCSgxPDw4KQorI2RlZmluZSAgIFNDQU5fQ09VTlRfRU5BQkxFCQkoMTw8NSkKKyNkZWZpbmUgICBTSU1VTFRBTkVPVVNfRU5BQkxFCQkoMTw8NCkKKyNkZWZpbmUgICBUUklHR0VSX0ZBTExJTkdfRURHRQkJKDE8PDMpCisjZGVmaW5lICAgQ09OVElOVU9VU19NT0RFCQkoMTw8MikKKyNkZWZpbmUgICBESVNBQkxFX0FEQwkJCSgwPDwwKQorI2RlZmluZSAgIFNPRlRXQVJFX1RSSUdHRVJFRF9BREMJKDE8PDApCisjZGVmaW5lICAgU0NBTl9UUklHR0VSRURfQURDCQkoMjw8MCkKKyNkZWZpbmUgICBFWFRfVFJJR0dFUkVEX0FEQwkJKDM8PDApCisjZGVmaW5lIE1FX0FEQ19TVEFSVAkJCTB4MDAwMAkvKiBSIHwgLSAqLworI2RlZmluZSBNRV9DT05UUk9MXzIJCQkweDAwMDIJLyogLSB8IFcgKi8KKyNkZWZpbmUgICBFTkFCTEVfQURGSUZPCQkJKDE8PDEwKQorI2RlZmluZSAgIEVOQUJMRV9DSEFOTElTVAkJKDE8PDkpCisjZGVmaW5lICAgRU5BQkxFX1BPUlRfQgkJCSgxPDw3KQorI2RlZmluZSAgIEVOQUJMRV9QT1JUX0EJCQkoMTw8NikKKyNkZWZpbmUgICBFTkFCTEVfQ09VTlRFUl9CCQkoMTw8NCkKKyNkZWZpbmUgICBFTkFCTEVfQ09VTlRFUl9BCQkoMTw8MykKKyNkZWZpbmUgICBFTkFCTEVfREFDCQkJKDE8PDEpCisjZGVmaW5lICAgQlVGRkVSRURfREFDCQkJKDE8PDApCisjZGVmaW5lIE1FX0RBQ19VUERBVEUJCQkweDAwMDIJLyogUiB8IC0gKi8KKyNkZWZpbmUgTUVfU1RBVFVTCQkJMHgwMDA0CS8qIFIgfCAtICovCisjZGVmaW5lICAgQ09VTlRFUl9CX0lSUV9QRU5ESU5HCQkoMTw8MTIpCisjZGVmaW5lICAgQ09VTlRFUl9BX0lSUV9QRU5ESU5HCQkoMTw8MTEpCisjZGVmaW5lICAgQ0hBTkxJU1RfUkVBRFlfSVJRX1BFTkRJTkcJKDE8PDEwKQorI2RlZmluZSAgIEVYVF9JUlFfUEVORElORwkJKDE8PDkpCisjZGVmaW5lICAgQURGSUZPX0hBTEZGVUxMX0lSUV9QRU5ESU5HCSgxPDw4KQorI2RlZmluZSAgIEFERklGT19GVUxMCQkJKDE8PDQpCisjZGVmaW5lICAgQURGSUZPX0hBTEZGVUxMCQkoMTw8MykKKyNkZWZpbmUgICBBREZJRk9fRU1QVFkJCQkoMTw8MikKKyNkZWZpbmUgICBDSEFOTElTVF9GVUxMCQkJKDE8PDEpCisjZGVmaW5lICAgRlNUX0FDVElWRQkJCSgxPDwwKQorI2RlZmluZSBNRV9SRVNFVF9JTlRFUlJVUFQJCTB4MDAwNAkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9ESU9fUE9SVF9BCQkJMHgwMDA2CS8qIFIgfCBXICovCisjZGVmaW5lIE1FX0RJT19QT1JUX0IJCQkweDAwMDgJLyogUiB8IFcgKi8KKyNkZWZpbmUgTUVfVElNRVJfREFUQV8wCQkJMHgwMDBBCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX1RJTUVSX0RBVEFfMQkJCTB4MDAwQwkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9USU1FUl9EQVRBXzIJCQkweDAwMEUJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfQ0hBTk5FTF9MSVNUCQkJMHgwMDEwCS8qIC0gfCBXICovCisjZGVmaW5lICAgQURDX1VOSVBPTEFSCQkJKDE8PDYpCisjZGVmaW5lICAgQURDX0dBSU5fMAkJCSgwPDw0KQorI2RlZmluZSAgIEFEQ19HQUlOXzEJCQkoMTw8NCkKKyNkZWZpbmUgICBBRENfR0FJTl8yCQkJKDI8PDQpCisjZGVmaW5lICAgQURDX0dBSU5fMwkJCSgzPDw0KQorI2RlZmluZSBNRV9SRUFEX0FEX0ZJRk8JCQkweDAwMTAJLyogUiB8IC0gKi8KKyNkZWZpbmUgTUVfREFDX0NPTlRST0wJCQkweDAwMTIJLyogLSB8IFcgKi8KKyNkZWZpbmUgICBEQUNfVU5JUE9MQVJfRAkJKDA8PDQpCisjZGVmaW5lICAgREFDX0JJUE9MQVJfRAkJCSgxPDw0KQorI2RlZmluZSAgIERBQ19VTklQT0xBUl9DCQkoMDw8NSkKKyNkZWZpbmUgICBEQUNfQklQT0xBUl9DCQkJKDE8PDUpCisjZGVmaW5lICAgREFDX1VOSVBPTEFSX0IJCSgwPDw2KQorI2RlZmluZSAgIERBQ19CSVBPTEFSX0IJCQkoMTw8NikKKyNkZWZpbmUgICBEQUNfVU5JUE9MQVJfQQkJKDA8PDcpCisjZGVmaW5lICAgREFDX0JJUE9MQVJfQQkJCSgxPDw3KQorI2RlZmluZSAgIERBQ19HQUlOXzBfRAkJCSgwPDw4KQorI2RlZmluZSAgIERBQ19HQUlOXzFfRAkJCSgxPDw4KQorI2RlZmluZSAgIERBQ19HQUlOXzBfQwkJCSgwPDw5KQorI2RlZmluZSAgIERBQ19HQUlOXzFfQwkJCSgxPDw5KQorI2RlZmluZSAgIERBQ19HQUlOXzBfQgkJCSgwPDwxMCkKKyNkZWZpbmUgICBEQUNfR0FJTl8xX0IJCQkoMTw8MTApCisjZGVmaW5lICAgREFDX0dBSU5fMF9BCQkJKDA8PDExKQorI2RlZmluZSAgIERBQ19HQUlOXzFfQQkJCSgxPDwxMSkKKyNkZWZpbmUgTUVfREFDX0NPTlRST0xfVVBEQVRFCQkweDAwMTIJLyogUiB8IC0gKi8KKyNkZWZpbmUgTUVfREFDX0RBVEFfQQkJCTB4MDAxNAkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9EQUNfREFUQV9CCQkJMHgwMDE2CS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0RBQ19EQVRBX0MJCQkweDAwMTgJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfREFDX0RBVEFfRAkJCTB4MDAxQQkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9DT1VOVEVSX0VORERBVEFfQQkJMHgwMDFDCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0NPVU5URVJfRU5EREFUQV9CCQkweDAwMUUJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9TVEFSVERBVEFfQQkJMHgwMDIwCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0NPVU5URVJfVkFMVUVfQQkJMHgwMDIwCS8qIFIgfCAtICovCisjZGVmaW5lIE1FX0NPVU5URVJfU1RBUlREQVRBX0IJCTB4MDAyMgkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9DT1VOVEVSX1ZBTFVFX0IJCTB4MDAyMgkvKiBSIHwgLSAqLworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IG1lX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK3N0YXRpYyBpbnQgbWVfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIG1lMjAwMF9haV9yYW5nZSA9IHsKKwk4LAorCXsKKwkJQklQX1JBTkdFKDEwKSwKKwkJQklQX1JBTkdFKDUpLAorCQlCSVBfUkFOR0UoMi41KSwKKwkJQklQX1JBTkdFKDEuMjUpLAorCQlVTklfUkFOR0UoMTApLAorCQlVTklfUkFOR0UoNSksCisJCVVOSV9SQU5HRSgyLjUpLAorCQlVTklfUkFOR0UoMS4yNSkKKwl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBtZTI2MDBfYWlfcmFuZ2UgPSB7CisJOCwKKwl7CisJCQlCSVBfUkFOR0UoMTApLAorCQkJQklQX1JBTkdFKDUpLAorCQkJQklQX1JBTkdFKDIuNSksCisJCQlCSVBfUkFOR0UoMS4yNSksCisJCQlVTklfUkFOR0UoMTApLAorCQkJVU5JX1JBTkdFKDUpLAorCQkJVU5JX1JBTkdFKDIuNSksCisJCQlVTklfUkFOR0UoMS4yNSkKKwkJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgbWUyNjAwX2FvX3JhbmdlID0geworCTMsCisJeworCQkJQklQX1JBTkdFKDEwKSwKKwkJCUJJUF9SQU5HRSg1KSwKKwkJCVVOSV9SQU5HRSgxMCkKKwkJfQorfTsKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKG1lX3BjaV90YWJsZSkgPSB7CisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIE1FMjYwMF9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCTB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBNRTIwMDBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQkwfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtZV9wY2lfdGFibGUpOworCisvKiBCb2FyZCBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqLworc3RydWN0IG1lX2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOwkvKiBkcml2ZXIgbmFtZSAqLworCWludCBkZXZpY2VfaWQ7CisJaW50IGFvX2NoYW5uZWxfbmJyOwkvKiBEQSBjb25maWcgKi8KKwlpbnQgYW9fcmVzb2x1dGlvbjsKKwlpbnQgYW9fcmVzb2x1dGlvbl9tYXNrOworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX2xpc3Q7CisJaW50IGFpX2NoYW5uZWxfbmJyOwkvKiBBRCBjb25maWcgKi8KKwlpbnQgYWlfcmVzb2x1dGlvbjsKKwlpbnQgYWlfcmVzb2x1dGlvbl9tYXNrOworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKmFpX3JhbmdlX2xpc3Q7CisJaW50IGRpb19jaGFubmVsX25icjsJLyogRElPIGNvbmZpZyAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZV9ib2FyZCBtZV9ib2FyZHNbXSA9IHsKKwl7CisJCS8qIC0tIE1FLTI2MDBpIC0tICovCisJCS5uYW1lID0gCQlNRV9EUklWRVJfTkFNRSwKKwkJLmRldmljZV9pZCA9CQlNRTI2MDBfREVWSUNFX0lELAorCQkvKiBBbmFsb2cgT3V0cHV0ICovCisJCS5hb19jaGFubmVsX25iciA9CTQsCisJCS5hb19yZXNvbHV0aW9uID0JMTIsCisJCS5hb19yZXNvbHV0aW9uX21hc2sgPQkweDBmZmYsCisJCS5hb19yYW5nZV9saXN0ID0JJm1lMjYwMF9hb19yYW5nZSwKKwkJLmFpX2NoYW5uZWxfbmJyID0JMTYsCisJCS8qIEFuYWxvZyBJbnB1dCAqLworCQkuYWlfcmVzb2x1dGlvbiA9CTEyLAorCQkuYWlfcmVzb2x1dGlvbl9tYXNrID0JMHgwZmZmLAorCQkuYWlfcmFuZ2VfbGlzdCA9CSZtZTI2MDBfYWlfcmFuZ2UsCisJCS5kaW9fY2hhbm5lbF9uYnIgPQkzMiwKKwkJfSwKKwl7CisJCS8qIC0tIE1FLTIwMDBpIC0tICovCisJCS5uYW1lID0JCQlNRV9EUklWRVJfTkFNRSwKKwkJLmRldmljZV9pZCA9CQlNRTIwMDBfREVWSUNFX0lELAorCQkvKiBBbmFsb2cgT3V0cHV0ICovCisJCS5hb19jaGFubmVsX25iciA9CTAsCisJCS5hb19yZXNvbHV0aW9uID0JMCwKKwkJLmFvX3Jlc29sdXRpb25fbWFzayA9CTAsCisJCS5hb19yYW5nZV9saXN0ID0JTlVMTCwKKwkJLmFpX2NoYW5uZWxfbmJyID0JMTYsCisJCS8qIEFuYWxvZyBJbnB1dCAqLworCQkuYWlfcmVzb2x1dGlvbiA9CTEyLAorCQkuYWlfcmVzb2x1dGlvbl9tYXNrID0JMHgwZmZmLAorCQkuYWlfcmFuZ2VfbGlzdCA9CSZtZTIwMDBfYWlfcmFuZ2UsCisJCS5kaW9fY2hhbm5lbF9uYnIgPQkzMiwKKwkJfQorfTsKKworI2RlZmluZSBtZV9ib2FyZF9uYnIgKHNpemVvZihtZV9ib2FyZHMpL3NpemVvZihzdHJ1Y3QgbWVfYm9hcmQpKQorCitzdGF0aWMgY29tZWRpX2RyaXZlciBtZV9kcml2ZXIgPSB7CisgICAgICAuZHJpdmVyX25hbWUgPQlNRV9EUklWRVJfTkFNRSwKKyAgICAgIC5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisgICAgICAuYXR0YWNoID0JCW1lX2F0dGFjaCwKKyAgICAgIC5kZXRhY2ggPQkJbWVfZGV0YWNoLAorfTsKK0NPTUVESV9QQ0lfSU5JVENMRUFOVVAobWVfZHJpdmVyLCBtZV9wY2lfdGFibGUpOworCisvKiBQcml2YXRlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgbWVfcHJpdmF0ZV9kYXRhIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZTsKKwl2b2lkIF9faW9tZW0gKnBseF9yZWdiYXNlOwkvKiBQTFggY29uZmlndXJhdGlvbiBiYXNlIGFkZHJlc3MgKi8KKwl2b2lkIF9faW9tZW0gKm1lX3JlZ2Jhc2U7CS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgTWVpbGhhdXMgY2FyZCAqLworCXVuc2lnbmVkIGxvbmcgcGx4X3JlZ2Jhc2Vfc2l6ZTsJLyogU2l6ZSBvZiBQTFggY29uZmlndXJhdGlvbiBzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcgbWVfcmVnYmFzZV9zaXplOwkvKiBTaXplIG9mIE1laWxoYXVzIHNwYWNlICovCisKKwl1bnNpZ25lZCBzaG9ydCBjb250cm9sXzE7CS8qIE1pcnJvciBvZiBDT05UUk9MXzEgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBjb250cm9sXzI7CS8qIE1pcnJvciBvZiBDT05UUk9MXzIgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBkYWNfY29udHJvbDsJLyogTWlycm9yIG9mIHRoZSBEQUNfQ09OVFJPTCByZWdpc3RlciAqLworCWludCBhb19yZWFkYmFja1s0XTsJLyogTWlycm9yIG9mIGFuYWxvZyBvdXRwdXQgZGF0YSAqLworfTsKKworI2RlZmluZSBkZXZfcHJpdmF0ZSAoKHN0cnVjdCBtZV9wcml2YXRlX2RhdGEgKilkZXYtPnByaXZhdGUpCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIZWxwZnVsIGZ1bmN0aW9ucworICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2xlZXAodW5zaWduZWQgc2VjKQoreworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlX3RpbWVvdXQoc2VjICogSFopOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRElHSVRBTCBJTlBVVC9PVVRQVVQgU0VDVElPTgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IG1lX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGJpdHM7CisJaW50IG1hc2sgPSAxIDw8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJLyogY2FsY3VsYXRlIHBvcnQgKi8KKwlpZiAobWFzayAmIDB4MDAwMGZmZmYpIHsJLyogUG9ydCBBIGluIHVzZSAqLworCQliaXRzID0gMHgwMDAwZmZmZjsKKworCQkvKiBFbmFibGUgUG9ydCBBICovCisJCWRldl9wcml2YXRlLT5jb250cm9sXzIgfD0gRU5BQkxFX1BPUlRfQTsKKwkJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzIsCisJCQlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisJfSBlbHNlIHsJCS8qIFBvcnQgQiBpbiB1c2UgKi8KKworCQliaXRzID0gMHhmZmZmMDAwMDsKKworCQkvKiBFbmFibGUgUG9ydCBCICovCisJCWRldl9wcml2YXRlLT5jb250cm9sXzIgfD0gRU5BQkxFX1BPUlRfQjsKKwkJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzIsCisJCQlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisJfQorCisJaWYgKGRhdGFbMF0pIHsKKwkJLyogQ29uZmlnIHBvcnQgYXMgb3V0cHV0ICovCisJCXMtPmlvX2JpdHMgfD0gYml0czsKKwl9IGVsc2UgeworCQkvKiBDb25maWcgcG9ydCBhcyBpbnB1dCAqLworCQlzLT5pb19iaXRzICY9IH5iaXRzOworCX0KKworCXJldHVybiAxOworfQorCisvKiBEaWdpdGFsIGluc3RhbnQgaW5wdXQvb3V0cHV0cyAqLworc3RhdGljIGludCBtZV9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSBkYXRhWzBdOworCXMtPnN0YXRlICY9IH5tYXNrOworCXMtPnN0YXRlIHw9IChtYXNrICYgZGF0YVsxXSk7CisKKwltYXNrICY9IHMtPmlvX2JpdHM7CisJaWYgKG1hc2sgJiAweDAwMDBmZmZmKSB7CS8qIFBvcnQgQSAqLworCQl3cml0ZXcoKHMtPnN0YXRlICYgMHhmZmZmKSwKKwkJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfRElPX1BPUlRfQSk7CisJfSBlbHNlIHsKKwkJZGF0YVsxXSAmPSB+MHgwMDAwZmZmZjsKKwkJZGF0YVsxXSB8PSByZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RJT19QT1JUX0EpOworCX0KKworCWlmIChtYXNrICYgMHhmZmZmMDAwMCkgewkvKiBQb3J0IEIgKi8KKwkJd3JpdGV3KCgocy0+c3RhdGUgPj4gMTYpICYgMHhmZmZmKSwKKwkJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfRElPX1BPUlRfQik7CisJfSBlbHNlIHsKKwkJZGF0YVsxXSAmPSB+MHhmZmZmMDAwMDsKKwkJZGF0YVsxXSB8PSByZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RJT19QT1JUX0IpIDw8IDE2OworCX0KKworCXJldHVybiAyOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQU5BTE9HIElOUFVUIFNFQ1RJT04KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBBbmFsb2cgaW5zdGFudCBpbnB1dCAqLworc3RhdGljIGludCBtZV9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsdWU7CisJaW50IGNoYW4gPSBDUl9DSEFOKCgmaW5zbi0+Y2hhbnNwZWMpWzBdKTsKKwlpbnQgcmFuZyA9IENSX1JBTkdFKCgmaW5zbi0+Y2hhbnNwZWMpWzBdKTsKKwlpbnQgYXJlZiA9IENSX0FSRUYoKCZpbnNuLT5jaGFuc3BlYylbMF0pOworCWludCBpOworCisJLyogc3RvcCBhbnkgcnVubmluZyBjb252ZXJzaW9uICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSAmPSAweEZGRkM7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzEsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8xKTsKKworCS8qIGNsZWFyIGNoYW5saXN0IGFuZCBhZCBmaWZvICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiAmPSB+KEVOQUJMRV9BREZJRk8gfCBFTkFCTEVfQ0hBTkxJU1QpOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8yLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisKKwkvKiByZXNldCBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwl3cml0ZXcoMHgwMCwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9SRVNFVF9JTlRFUlJVUFQpOworCisJLyogZW5hYmxlIHRoZSBjaGFubGlzdCBhbmQgQURDIGZpZm8gKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yIHw9IChFTkFCTEVfQURGSUZPIHwgRU5BQkxFX0NIQU5MSVNUKTsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzIpOworCisJLyogd3JpdGUgdG8gY2hhbm5lbCBsaXN0IGZpZm8gKi8KKwkvKiBiMzpiMCBhcmUgdGhlIGNoYW5uZWwgbnVtYmVyICovCisJdmFsdWUgPSBjaGFuICYgMHgwZjsKKwkvKiBiNTpiNCBhcmUgdGhlIGNoYW5uZWwgZ2FpbiAqLworCXZhbHVlIHw9IChyYW5nICYgMHgwMykgPDwgNDsKKwkvKiBiNiBjaGFubmVsIHBvbGFyaXR5ICovCisJdmFsdWUgfD0gKHJhbmcgJiAweDA0KSA8PCA0OworCS8qIGI3IHNpbmdsZSBvciBkaWZmZXJlbnRpYWwgKi8KKwl2YWx1ZSB8PSAoKGFyZWYgJiBBUkVGX0RJRkYpID8gMHg4MCA6IDApOworCXdyaXRldyh2YWx1ZSAmIDB4ZmYsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ0hBTk5FTF9MSVNUKTsKKworCS8qIHNldCBBREMgbW9kZSB0byBzb2Z0d2FyZSB0cmlnZ2VyICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSB8PSBTT0ZUV0FSRV9UUklHR0VSRURfQURDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8xLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMSk7CisKKwkvKiBzdGFydCBjb252ZXJzaW9uIGJ5IHJlYWRpbmcgZnJvbSBBRENfU1RBUlQgKi8KKwlyZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0FEQ19TVEFSVCk7CisKKwkvKiB3YWl0IGZvciBBREMgZmlmbyBub3QgZW1wdHkgZmxhZyAqLworCWZvciAoaSA9IDEwMDAwMDsgaSA+IDA7IGktLSkKKwkJaWYgKCEocmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9TVEFUVVMpICYgMHgwMDA0KSkKKwkJCWJyZWFrOworCisJLyogZ2V0IHZhbHVlIGZyb20gQURDIGZpZm8gKi8KKwlpZiAoaSkgeworCQlkYXRhWzBdID0KKwkJCShyZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArCisJCQkJTUVfUkVBRF9BRF9GSUZPKSBeIDB4ODAwKSAmIDB4MEZGRjsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBDYW5ub3QgZ2V0IHNpbmdsZSB2YWx1ZVxuIiwKKwkJICAgICAgIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBzdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xICY9IDB4RkZGQzsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzEpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIQVJEV0FSRSBUUklHR0VSRUQgQU5BTE9HIElOUFVUIFNFQ1RJT04KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBDYW5jZWwgYW5hbG9nIGlucHV0IGF1dG9zY2FuICovCitzdGF0aWMgaW50IG1lX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisKKwkvKiBzdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xICY9IDB4RkZGQzsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRlc3QgYW5hbG9nIGlucHV0IGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgbWVfYWlfZG9fY21kX3Rlc3QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBjb21lZGlfY21kICpjbWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFuYWxvZyBpbnB1dCBjb21tYW5kICovCitzdGF0aWMgaW50IG1lX2FpX2RvX2NtZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEFOQUxPRyBPVVRQVVQgU0VDVElPTgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIEFuYWxvZyBpbnN0YW50IG91dHB1dCAqLworc3RhdGljIGludCBtZV9hb19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGNoYW47CisJaW50IHJhbmc7CisJaW50IGk7CisKKwkvKiBFbmFibGUgYWxsIERBQyAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzIgfD0gRU5BQkxFX0RBQzsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzIpOworCisJLyogYW5kIHNldCBEQUMgdG8gImJ1ZmZlcmVkIiBtb2RlICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiB8PSBCVUZGRVJFRF9EQUM7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzIsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKworCS8qIFNldCBkYWMtY29udHJvbCByZWdpc3RlciAqLworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJY2hhbiA9IENSX0NIQU4oKCZpbnNuLT5jaGFuc3BlYylbaV0pOworCQlyYW5nID0gQ1JfUkFOR0UoKCZpbnNuLT5jaGFuc3BlYylbaV0pOworCisJCS8qIGNsZWFyIGJpdHMgZm9yIHRoaXMgY2hhbm5lbCAqLworCQlkZXZfcHJpdmF0ZS0+ZGFjX2NvbnRyb2wgJj0gfigweDA4ODAgPj4gY2hhbik7CisJCWlmIChyYW5nID09IDApCisJCQlkZXZfcHJpdmF0ZS0+ZGFjX2NvbnRyb2wgfD0KKwkJCQkoKERBQ19CSVBPTEFSX0EgfCBEQUNfR0FJTl8xX0EpID4+IGNoYW4pOworCQllbHNlIGlmIChyYW5nID09IDEpCisJCQlkZXZfcHJpdmF0ZS0+ZGFjX2NvbnRyb2wgfD0KKwkJCQkoKERBQ19CSVBPTEFSX0EgfCBEQUNfR0FJTl8wX0EpID4+IGNoYW4pOworCX0KKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmRhY19jb250cm9sLAorCQlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RBQ19DT05UUk9MKTsKKworCS8qIFVwZGF0ZSBkYWMtY29udHJvbCByZWdpc3RlciAqLworCXJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfREFDX0NPTlRST0xfVVBEQVRFKTsKKworCS8qIFNldCBkYXRhIHJlZ2lzdGVyICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQljaGFuID0gQ1JfQ0hBTigoJmluc24tPmNoYW5zcGVjKVtpXSk7CisJCXdyaXRldygoZGF0YVswXSAmIHMtPm1heGRhdGEpLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9EQUNfREFUQV9BICsgKGNoYW4gPDwgMSkpOworCQlkZXZfcHJpdmF0ZS0+YW9fcmVhZGJhY2tbY2hhbl0gPSAoZGF0YVswXSAmIHMtPm1heGRhdGEpOworCX0KKworCS8qIFVwZGF0ZSBkYWMgd2l0aCBkYXRhIHJlZ2lzdGVycyAqLworCXJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfREFDX1VQREFURSk7CisKKwlyZXR1cm4gaTsKK30KKworLyogQW5hbG9nIG91dHB1dCByZWFkYmFjayAqLworc3RhdGljIGludCBtZV9hb19pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkYXRhW2ldID0KKwkJCWRldl9wcml2YXRlLT5hb19yZWFkYmFja1tDUl9DSEFOKCgmaW5zbi0+Y2hhbnNwZWMpW2ldKV07CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJTklUSUFMSVNBVElPTiBTRUNUSU9OCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogWGlsaW54IGZpcm13YXJlIGRvd25sb2FkIGZvciBjYXJkOiBNRS0yNjAwaSAqLworc3RhdGljIGludCBtZTI2MDBfeGlsaW54X2Rvd25sb2FkKGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKm1lMjYwMF9maXJtd2FyZSwKKwkJCQkgIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXVuc2lnbmVkIGludCBmaWxlX2xlbmd0aDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIGRpc2FibGUgaXJxJ3Mgb24gUExYICovCisJd3JpdGVsKDB4MDAsIGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCisJLyogRmlyc3QsIG1ha2UgYSBkdW1teSByZWFkIHRvIHJlc2V0IHhpbGlueCAqLworCXZhbHVlID0gcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBYSUxJTlhfRE9XTkxPQURfUkVTRVQpOworCisJLyogV2FpdCB1bnRpbCByZXNldCBpcyBvdmVyICovCisJc2xlZXAoMSk7CisKKwkvKiBXcml0ZSBhIGR1bW15IHZhbHVlIHRvIFhpbGlueCAqLworCXdyaXRlYigweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIDB4MCk7CisJc2xlZXAoMSk7CisKKwkvKgorCSAqIEZvcm1hdCBvZiB0aGUgZmlybXdhcmUKKwkgKiBCdWlsZCBsb25ncyBmcm9tIHRoZSBieXRlLXdpc2UgY29kZWQgaGVhZGVyCisJICogQnl0ZSAxLTM6ICAgbGVuZ3RoIG9mIHRoZSBhcnJheQorCSAqIEJ5dGUgNC03OiAgIHZlcnNpb24KKwkgKiBCeXRlIDgtMTE6ICBkYXRlCisJICogQnl0ZSAxMi0xNTogcmVzZXJ2ZWQKKwkgKi8KKwlpZiAobGVuZ3RoIDwgMTYpCisJCXJldHVybiAtRUlOVkFMOworCWZpbGVfbGVuZ3RoID0gKCgodW5zaWduZWQgaW50KW1lMjYwMF9maXJtd2FyZVswXSAmIDB4ZmYpIDw8IDI0KSArCisJCSAgICAgICgoKHVuc2lnbmVkIGludCltZTI2MDBfZmlybXdhcmVbMV0gJiAweGZmKSA8PCAxNikgKworCQkgICAgICAoKCh1bnNpZ25lZCBpbnQpbWUyNjAwX2Zpcm13YXJlWzJdICYgMHhmZikgPDwgOCkgKworCQkgICAgICAoKHVuc2lnbmVkIGludCltZTI2MDBfZmlybXdhcmVbM10gJiAweGZmKTsKKworCS8qCisJICogTG9vcCBmb3Igd3JpdGluZyBmaXJtd2FyZSBieXRlIGJ5IGJ5dGUgdG8geGlsaW54CisJICogRmlybXdhcmUgZGF0YSBzdGFydCBhdCBvZmZmc2V0IDE2CisJICovCisJZm9yIChpID0gMDsgaSA8IGZpbGVfbGVuZ3RoOyBpKyspCisJCXdyaXRlYigobWUyNjAwX2Zpcm13YXJlWzE2ICsgaV0gJiAweGZmKSwKKwkJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgMHgwKTsKKworCS8qIFdyaXRlIDUgZHVtbXkgdmFsdWVzIHRvIHhpbGlueCAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXdyaXRlYigweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIDB4MCk7CisKKwkvKiBUZXN0IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgZG93bmxvYWQgLT4gSU5UQiB3YXMgdGhyb3duICovCisJdmFsdWUgPSByZWFkbChkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKTsKKwlpZiAodmFsdWUgJiAweDIwKSB7CisJCS8qIERpc2FibGUgaW50ZXJydXB0ICovCisJCXdyaXRlbCgweDAwLCBkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogWGlsaW54IGRvd25sb2FkIGZhaWxlZFxuIiwKKwkJICAgICAgIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBXYWl0IHVudGlsIHRoZSBYaWxpbnggaXMgcmVhZHkgZm9yIHJlYWwgd29yayAqLworCXNsZWVwKDEpOworCisJLyogRW5hYmxlIFBMWC1JbnRlcnJ1cHRzICovCisJd3JpdGVsKDB4NDMsIGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc2V0IGRldmljZSAqLworc3RhdGljIGludCBtZV9yZXNldChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogUmVzZXQgYm9hcmQgKi8KKwl3cml0ZXcoMHgwMCwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzEpOworCXdyaXRldygweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisJd3JpdGV3KDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfUkVTRVRfSU5URVJSVVBUKTsKKwl3cml0ZXcoMHgwMCwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9EQUNfQ09OVFJPTCk7CisKKwkvKiBTYXZlIHZhbHVlcyBpbiB0aGUgYm9hcmQgY29udGV4dCAqLworCWRldl9wcml2YXRlLT5kYWNfY29udHJvbCA9IDA7CisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSA9IDA7CisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEF0dGFjaAorICoKKyAqIC0gUmVnaXN0ZXIgUENJIGRldmljZQorICogLSBEZWNsYXJlIGRldmljZSBkcml2ZXIgY2FwYWJpbGl0eQorICovCitzdGF0aWMgaW50IG1lX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKnN1YmRldmljZTsKKwlzdHJ1Y3QgbWVfYm9hcmQgKmJvYXJkOworCXJlc291cmNlX3NpemVfdCBwbHhfcmVnYmFzZV90bXA7CisJdW5zaWduZWQgbG9uZyBwbHhfcmVnYmFzZV9zaXplX3RtcDsKKwlyZXNvdXJjZV9zaXplX3QgbWVfcmVnYmFzZV90bXA7CisJdW5zaWduZWQgbG9uZyBtZV9yZWdiYXNlX3NpemVfdG1wOworCXJlc291cmNlX3NpemVfdCBzd2FwX3JlZ2Jhc2VfdG1wOworCXVuc2lnbmVkIGxvbmcgc3dhcF9yZWdiYXNlX3NpemVfdG1wOworCXJlc291cmNlX3NpemVfdCByZWdiYXNlX3RtcDsKKwlpbnQgcmVzdWx0LCBlcnJvciwgaTsKKworCS8qIEFsbG9jYXRlIHByaXZhdGUgbWVtb3J5ICovCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IG1lX3ByaXZhdGVfZGF0YSkpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBQcm9iZSB0aGUgZGV2aWNlIHRvIGRldGVybWluZSB3aGF0IGRldmljZSBpbiB0aGUgc2VyaWVzIGl0IGlzLiAqLworCWZvciAocGNpX2RldmljZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOworCQlwY2lfZGV2aWNlICE9IE5VTEw7CisJCXBjaV9kZXZpY2UgPQorCQlwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2aWNlKSkgeworCQlpZiAocGNpX2RldmljZS0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTUVJTEhBVVMpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBtZV9ib2FyZF9uYnI7IGkrKykgeworCQkJCWlmIChtZV9ib2FyZHNbaV0uZGV2aWNlX2lkID09CisJCQkJCXBjaV9kZXZpY2UtPmRldmljZSkgeworCQkJCQkvKgorCQkJCQkgKiB3YXMgYSBwYXJ0aWN1bGFyIGJ1cy9zbG90IHJlcXVlc3RlZD8KKwkJCQkJICovCisJCQkJCWlmICgoaXQtPm9wdGlvbnNbMF0gIT0gMCkKKwkJCQkJCXx8IChpdC0+b3B0aW9uc1sxXSAhPSAwKSkgeworCQkJCQkJLyoKKwkJCQkJCSAqIGFyZSB3ZSBvbiB0aGUgd3JvbmcgYnVzL3Nsb3Q/CisJCQkJCQkgKi8KKwkJCQkJCWlmIChwY2lfZGV2aWNlLT5idXMtPm51bWJlciAhPQorCQkJCQkJCWl0LT5vcHRpb25zWzBdCisJCQkJCQkJfHwgUENJX1NMT1QocGNpX2RldmljZS0+CisJCQkJCQkJCWRldmZuKSAhPQorCQkJCQkJCWl0LT5vcHRpb25zWzFdKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlkZXYtPmJvYXJkX3B0ciA9IG1lX2JvYXJkcyArIGk7CisJCQkJCWJvYXJkID0gKHN0cnVjdCBtZV9ib2FyZCAqKSBkZXYtPgorCQkJCQkJYm9hcmRfcHRyOworCQkJCQlkZXZfcHJpdmF0ZS0+cGNpX2RldmljZSA9IHBjaV9kZXZpY2U7CisJCQkJCWdvdG8gZm91bmQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpbnRrKEtFUk5fRVJSCisJICAgICAgICJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKKwkgICAgICAgZGV2LT5taW5vciwgaXQtPm9wdGlvbnNbMF0sIGl0LT5vcHRpb25zWzFdKTsKKwlyZXR1cm4gLUVJTzsKKworZm91bmQ6CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGZvdW5kICVzIGF0IFBDSSBidXMgJWQsIHNsb3QgJWRcbiIsCisJCWRldi0+bWlub3IsIG1lX2JvYXJkc1tpXS5uYW1lLAorCQlwY2lfZGV2aWNlLT5idXMtPm51bWJlciwgUENJX1NMT1QocGNpX2RldmljZS0+ZGV2Zm4pKTsKKworCS8qIEVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IFBDSSByZWdpb25zICovCisJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKHBjaV9kZXZpY2UsIE1FX0RSSVZFUl9OQU1FKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCAiCisJCSAgICAgICAicmVxdWVzdCByZWdpb25zXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogU2V0IGRhdGEgaW4gZGV2aWNlIHN0cnVjdHVyZSAqLworCWRldi0+Ym9hcmRfbmFtZSA9IGJvYXJkLT5uYW1lOworCisJLyogUmVhZCBQTFggcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIFtQQ0lfQkFTRV9BRERSRVNTICMwXS4gKi8KKwlwbHhfcmVnYmFzZV90bXAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldmljZSwgMCk7CisJcGx4X3JlZ2Jhc2Vfc2l6ZV90bXAgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZpY2UsIDApOworCWRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSA9CisJCWlvcmVtYXAocGx4X3JlZ2Jhc2VfdG1wLCBwbHhfcmVnYmFzZV9zaXplX3RtcCk7CisJZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlX3NpemUgPSBwbHhfcmVnYmFzZV9zaXplX3RtcDsKKwlpZiAoIWRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSkgeworCQlwcmludGsoImNvbWVkaSVkOiBGYWlsZWQgdG8gcmVtYXAgSS9PIG1lbW9yeVxuIiwgZGV2LT5taW5vcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFJlYWQgU3dhcCBiYXNlIGFkZHJlc3MgW1BDSV9CQVNFX0FERFJFU1MgIzVdLiAqLworCisJc3dhcF9yZWdiYXNlX3RtcCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2aWNlLCA1KTsKKwlzd2FwX3JlZ2Jhc2Vfc2l6ZV90bXAgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZpY2UsIDUpOworCisJaWYgKCFzd2FwX3JlZ2Jhc2VfdG1wKQorCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBTd2FwIG5vdCBwcmVzZW50XG4iLCBkZXYtPm1pbm9yKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXb3JrYXJvdW5kIHN0YXJ0IC0tLSovCisJaWYgKHBseF9yZWdiYXNlX3RtcCAmIDB4MDA4MCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBQTFgtQnVnIGRldGVjdGVkXG4iLCBkZXYtPm1pbm9yKTsKKworCQlpZiAoc3dhcF9yZWdiYXNlX3RtcCkgeworCQkJcmVnYmFzZV90bXAgPSBwbHhfcmVnYmFzZV90bXA7CisJCQlwbHhfcmVnYmFzZV90bXAgPSBzd2FwX3JlZ2Jhc2VfdG1wOworCQkJc3dhcF9yZWdiYXNlX3RtcCA9IHJlZ2Jhc2VfdG1wOworCisJCQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXZpY2UsCisJCQkJUENJX0JBU0VfQUREUkVTU18wLCBwbHhfcmVnYmFzZV90bXApOworCQkJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCisJCQkJcmV0dXJuIC1FSU87CisKKwkJCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldmljZSwKKwkJCQlQQ0lfQkFTRV9BRERSRVNTXzUsIHN3YXBfcmVnYmFzZV90bXApOworCQkJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSB7CisJCQlwbHhfcmVnYmFzZV90bXAgLT0gMHg4MDsKKwkJCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldmljZSwKKwkJCQlQQ0lfQkFTRV9BRERSRVNTXzAsIHBseF9yZWdiYXNlX3RtcCk7CisJCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXb3JrYXJvdW5kIGVuZCAtLS0tLSovCisKKwkvKiBSZWFkIE1laWxoYXVzIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBbUENJX0JBU0VfQUREUkVTUyAjMl0uICovCisKKwltZV9yZWdiYXNlX3RtcCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2aWNlLCAyKTsKKwltZV9yZWdiYXNlX3NpemVfdG1wID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2aWNlLCAyKTsKKwlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZV9zaXplID0gbWVfcmVnYmFzZV9zaXplX3RtcDsKKwlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSA9IGlvcmVtYXAobWVfcmVnYmFzZV90bXAsIG1lX3JlZ2Jhc2Vfc2l6ZV90bXApOworCWlmICghZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogRmFpbGVkIHRvIHJlbWFwIEkvTyBtZW1vcnlcbiIsCisJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIERvd25sb2FkIGZpcm13YXJlIGFuZCByZXNldCBjYXJkICovCisJaWYgKGJvYXJkLT5kZXZpY2VfaWQgPT0gTUUyNjAwX0RFVklDRV9JRCkgeworCQl1bnNpZ25lZCBjaGFyICphdXhfZGF0YTsKKwkJaW50IGF1eF9sZW47CisKKwkJYXV4X2RhdGEgPSBjb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApOworCQlhdXhfbGVuID0gaXQtPm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RIXTsKKworCQlpZiAoIWF1eF9kYXRhIHx8IGF1eF9sZW4gPCAxKSB7CisJCQljb21lZGlfZXJyb3IoZGV2LCAiWW91IG11c3QgcHJvdmlkZSBtZTI2MDAgZmlybXdhcmUgIgorCQkJCSAgICAgInVzaW5nIHRoZSAtLWluaXQtZGF0YSBvcHRpb24gb2YgIgorCQkJCSAgICAgImNvbWVkaV9jb25maWciKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1lMjYwMF94aWxpbnhfZG93bmxvYWQoZGV2LCBhdXhfZGF0YSwgYXV4X2xlbik7CisJfQorCisJbWVfcmVzZXQoZGV2KTsKKworCS8qIGRldmljZSBkcml2ZXIgY2FwYWJpbGl0aWVzICovCisJZXJyb3IgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgMyk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJc3ViZGV2aWNlID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlzdWJkZXZpY2UtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwlzdWJkZXZpY2UtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9DT01NT04gfCBTREZfQ01EX1JFQUQ7CisJc3ViZGV2aWNlLT5uX2NoYW4gPSBib2FyZC0+YWlfY2hhbm5lbF9uYnI7CisJc3ViZGV2aWNlLT5tYXhkYXRhID0gYm9hcmQtPmFpX3Jlc29sdXRpb25fbWFzazsKKwlzdWJkZXZpY2UtPmxlbl9jaGFubGlzdCA9IGJvYXJkLT5haV9jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPnJhbmdlX3RhYmxlID0gYm9hcmQtPmFpX3JhbmdlX2xpc3Q7CisJc3ViZGV2aWNlLT5jYW5jZWwgPSBtZV9haV9jYW5jZWw7CisJc3ViZGV2aWNlLT5pbnNuX3JlYWQgPSBtZV9haV9pbnNuX3JlYWQ7CisJc3ViZGV2aWNlLT5kb19jbWR0ZXN0ID0gbWVfYWlfZG9fY21kX3Rlc3Q7CisJc3ViZGV2aWNlLT5kb19jbWQgPSBtZV9haV9kb19jbWQ7CisKKwlzdWJkZXZpY2UgPSBkZXYtPnN1YmRldmljZXMgKyAxOworCXN1YmRldmljZS0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCXN1YmRldmljZS0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRFQUJMRSB8IFNERl9DT01NT047CisJc3ViZGV2aWNlLT5uX2NoYW4gPSBib2FyZC0+YW9fY2hhbm5lbF9uYnI7CisJc3ViZGV2aWNlLT5tYXhkYXRhID0gYm9hcmQtPmFvX3Jlc29sdXRpb25fbWFzazsKKwlzdWJkZXZpY2UtPmxlbl9jaGFubGlzdCA9IGJvYXJkLT5hb19jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPnJhbmdlX3RhYmxlID0gYm9hcmQtPmFvX3JhbmdlX2xpc3Q7CisJc3ViZGV2aWNlLT5pbnNuX3JlYWQgPSBtZV9hb19pbnNuX3JlYWQ7CisJc3ViZGV2aWNlLT5pbnNuX3dyaXRlID0gbWVfYW9faW5zbl93cml0ZTsKKworCXN1YmRldmljZSA9IGRldi0+c3ViZGV2aWNlcyArIDI7CisJc3ViZGV2aWNlLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXN1YmRldmljZS0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRFQUJMRTsKKwlzdWJkZXZpY2UtPm5fY2hhbiA9IGJvYXJkLT5kaW9fY2hhbm5lbF9uYnI7CisJc3ViZGV2aWNlLT5tYXhkYXRhID0gMTsKKwlzdWJkZXZpY2UtPmxlbl9jaGFubGlzdCA9IGJvYXJkLT5kaW9fY2hhbm5lbF9uYnI7CisJc3ViZGV2aWNlLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXN1YmRldmljZS0+aW5zbl9iaXRzID0gbWVfZGlvX2luc25fYml0czsKKwlzdWJkZXZpY2UtPmluc25fY29uZmlnID0gbWVfZGlvX2luc25fY29uZmlnOworCXN1YmRldmljZS0+aW9fYml0cyA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogIk1FX0RSSVZFUl9OQU1FIiBhdHRhY2hlZC5cbiIsIGRldi0+bWlub3IpOworCXJldHVybiAwOworfQorCisvKiBEZXRhY2ggKi8KK3N0YXRpYyBpbnQgbWVfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2X3ByaXZhdGUpIHsKKwkJaWYgKGRldl9wcml2YXRlLT5tZV9yZWdiYXNlKSB7CisJCQltZV9yZXNldChkZXYpOworCQkJaW91bm1hcChkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSk7CisJCX0KKwkJaWYgKGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSkKKwkJCWlvdW5tYXAoZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlKTsKKwkJaWYgKGRldl9wcml2YXRlLT5wY2lfZGV2aWNlKSB7CisJCQlpZiAoZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlX3NpemUpCisJCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldl9wcml2YXRlLT5wY2lfZGV2aWNlKTsKKworCQkJcGNpX2Rldl9wdXQoZGV2X3ByaXZhdGUtPnBjaV9kZXZpY2UpOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjNTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKQEAgLTAsMCArMSw4MDkgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvbWl0ZS5jCisgICAgSGFyZHdhcmUgZHJpdmVyIGZvciBOSSBNaXRlIFBDSSBpbnRlcmZhY2UgY2hpcAorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKy8qCisJVGhlIFBDSS1NSU8gRSBzZXJpZXMgZHJpdmVyIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKwlUb21hc3ogTW90eWxld3NraSA8Li4uPiwgYW5kIHBvcnRlZCB0byBjb21lZGkgYnkgZHMuCisKKwlSZWZlcmVuY2VzIGZvciBzcGVjaWZpY2F0aW9uczoKKworCSAgIDMyMTc0N2IucGRmICBSZWdpc3RlciBMZXZlbCBQcm9ncmFtbWVyIE1hbnVhbCAob2Jzb2xldGUpCisJICAgMzIxNzQ3Yy5wZGYgIFJlZ2lzdGVyIExldmVsIFByb2dyYW1tZXIgTWFudWFsIChuZXcpCisJICAgREFRLVNUQyByZWZlcmVuY2UgbWFudWFsCisKKwlPdGhlciBwb3NzaWJseSByZWxldmFudCBpbmZvOgorCisJICAgMzIwNTE3Yy5wZGYgIFVzZXIgbWFudWFsIChvYnNvbGV0ZSkKKwkgICAzMjA1MTdmLnBkZiAgVXNlciBtYW51YWwgKG5ldykKKwkgICAzMjA4ODlhLnBkZiAgZGVsZXRlCisJICAgMzIwOTA2Yy5wZGYgIG1heGltdW0gc2lnbmFsIHJhdGluZ3MKKwkgICAzMjEwNjZhLnBkZiAgYWJvdXQgMTZ4CisJICAgMzIxNzkxYS5wZGYgIGRpc2NvbnRpbnVhdGlvbiBvZiBhdC1taW8tMTZlLTEwIHJldi4gYworCSAgIDMyMTgwOGEucGRmICBhYm91dCBhdC1taW8tMTZlLTEwIHJldiBQCisJICAgMzIxODM3YS5wZGYgIGRpc2NvbnRpbnVhdGlvbiBvZiBhdC1taW8tMTZkZS0xMCByZXYgZAorCSAgIDMyMTgzOGEucGRmICBhYm91dCBhdC1taW8tMTZkZS0xMCByZXYgTgorCisJSVNTVUVTOgorCisqLworCisvLyNkZWZpbmUgVVNFX0tNQUxMT0MKKworI2luY2x1ZGUgIm1pdGUuaCIKKworI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgImNvbWVkaV9wY2kuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBQQ0lfTUlURV9TSVpFCQk0MDk2CisjZGVmaW5lIFBDSV9EQVFfU0laRQkJNDA5NgorI2RlZmluZSBQQ0lfREFRX1NJWkVfNjYwWCAgICAgICA4MTkyCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IG1pdGVfc3RydWN0ICptaXRlX2RldmljZXMgPSBOVUxMOworCisjZGVmaW5lIFRPUF9PRl9QQUdFKHgpICgoeCl8KH4oUEFHRV9NQVNLKSkpCisKK3ZvaWQgbWl0ZV9pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGU7CisKKwlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOworCQlwY2lkZXYgIT0gTlVMTDsKKwkJcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpZGV2KSkgeworCQlpZiAocGNpZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OQVRJTlNUKSB7CisJCQl1bnNpZ25lZCBpOworCisJCQltaXRlID0ga3phbGxvYyhzaXplb2YoKm1pdGUpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghbWl0ZSkgeworCQkJCXByaW50aygibWl0ZTogYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCXBjaV9kZXZfcHV0KHBjaWRldik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJc3Bpbl9sb2NrX2luaXQoJm1pdGUtPmxvY2spOworCQkJbWl0ZS0+cGNpZGV2ID0gcGNpX2Rldl9nZXQocGNpZGV2KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfTUlURV9ETUFfQ0hBTk5FTFM7ICsraSkgeworCQkJCW1pdGUtPmNoYW5uZWxzW2ldLm1pdGUgPSBtaXRlOworCQkJCW1pdGUtPmNoYW5uZWxzW2ldLmNoYW5uZWwgPSBpOworCQkJCW1pdGUtPmNoYW5uZWxzW2ldLmRvbmUgPSAxOworCQkJfQorCQkJbWl0ZS0+bmV4dCA9IG1pdGVfZGV2aWNlczsKKwkJCW1pdGVfZGV2aWNlcyA9IG1pdGU7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY2hpcF9zaWduYXR1cmUodTMyIGNzaWdyX2JpdHMpCit7CisJcHJpbnRrKCJtaXRlOiB2ZXJzaW9uID0gJWksIHR5cGUgPSAlaSwgbWl0ZSBtb2RlID0gJWksIGludGVyZmFjZSBtb2RlID0gJWlcbiIsIG1pdGVfY3NpZ3JfdmVyc2lvbihjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl90eXBlKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX21tb2RlKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX2ltb2RlKGNzaWdyX2JpdHMpKTsKKwlwcmludGsoIm1pdGU6IG51bSBjaGFubmVscyA9ICVpLCB3cml0ZSBwb3N0IGZpZm8gZGVwdGggPSAlaSwgd2lucyA9ICVpLCBpb3dpbnMgPSAlaVxuIiwgbWl0ZV9jc2lncl9kbWFjKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX3dwZGVwKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX3dpbnMoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfaW93aW5zKGNzaWdyX2JpdHMpKTsKK30KKwordW5zaWduZWQgbWl0ZV9maWZvX3NpemUoc3RydWN0IG1pdGVfc3RydWN0ICogbWl0ZSwgdW5zaWduZWQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBmY3JfYml0cyA9IHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArCisJCU1JVEVfRkNSKGNoYW5uZWwpKTsKKwl1bnNpZ25lZCBlbXB0eV9jb3VudCA9IChmY3JfYml0cyA+PiAxNikgJiAweGZmOworCXVuc2lnbmVkIGZ1bGxfY291bnQgPSBmY3JfYml0cyAmIDB4ZmY7CisJcmV0dXJuIGVtcHR5X2NvdW50ICsgZnVsbF9jb3VudDsKK30KKworaW50IG1pdGVfc2V0dXAyKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgdW5zaWduZWQgdXNlX2lvZHdic3JfMSkKK3sKKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsKKwlyZXNvdXJjZV9zaXplX3QgYWRkcjsKKwlpbnQgaTsKKwl1MzIgY3NpZ3JfYml0czsKKwl1bnNpZ25lZCB1bmtub3duX2RtYV9idXJzdF9iaXRzOworCisJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKG1pdGUtPnBjaWRldiwgIm1pdGUiKSkgeworCQlwcmludGsoImVycm9yIGVuYWJsaW5nIG1pdGUgYW5kIHJlcXVlc3RpbmcgaW8gcmVnaW9uc1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlwY2lfc2V0X21hc3RlcihtaXRlLT5wY2lkZXYpOworCisJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChtaXRlLT5wY2lkZXYsIDApOworCW1pdGUtPm1pdGVfcGh5c19hZGRyID0gYWRkcjsKKwltaXRlLT5taXRlX2lvX2FkZHIgPSBpb3JlbWFwKGFkZHIsIFBDSV9NSVRFX1NJWkUpOworCWlmICghbWl0ZS0+bWl0ZV9pb19hZGRyKSB7CisJCXByaW50aygiZmFpbGVkIHRvIHJlbWFwIG1pdGUgaW8gbWVtb3J5IGFkZHJlc3NcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHJpbnRrKCJNSVRFOjB4JTA4bGx4IG1hcHBlZCB0byAlcCAiLAorCQkodW5zaWduZWQgbG9uZyBsb25nKW1pdGUtPm1pdGVfcGh5c19hZGRyLCBtaXRlLT5taXRlX2lvX2FkZHIpOworCisJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChtaXRlLT5wY2lkZXYsIDEpOworCW1pdGUtPmRhcV9waHlzX2FkZHIgPSBhZGRyOworCWxlbmd0aCA9IHBjaV9yZXNvdXJjZV9sZW4obWl0ZS0+cGNpZGV2LCAxKTsKKwkvLyBJbiBjYXNlIG9mIGEgNjYweCBib2FyZCwgREFRIHNpemUgaXMgOGsgaW5zdGVhZCBvZiA0ayAoc2VlIGFzIHNob3duIGJ5IGxzcGNpIG91dHB1dCkKKwltaXRlLT5kYXFfaW9fYWRkciA9IGlvcmVtYXAobWl0ZS0+ZGFxX3BoeXNfYWRkciwgbGVuZ3RoKTsKKwlpZiAoIW1pdGUtPmRhcV9pb19hZGRyKSB7CisJCXByaW50aygiZmFpbGVkIHRvIHJlbWFwIGRhcSBpbyBtZW1vcnkgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcmludGsoIkRBUToweCUwOGxseCBtYXBwZWQgdG8gJXBcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWl0ZS0+ZGFxX3BoeXNfYWRkciwgbWl0ZS0+ZGFxX2lvX2FkZHIpOworCisJaWYgKHVzZV9pb2R3YnNyXzEpIHsKKwkJd3JpdGVsKDAsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0JTUik7CisJCXByaW50aygibWl0ZTogdXNpbmcgSS9PIFdpbmRvdyBCYXNlIFNpemUgcmVnaXN0ZXIgMVxuIik7CisJCXdyaXRlbChtaXRlLT4KKwkJCWRhcV9waHlzX2FkZHIgfCBXRU5BQiB8CisJCQlNSVRFX0lPRFdCU1JfMV9XU0laRV9iaXRzKGxlbmd0aCksCisJCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0lPRFdCU1JfMSk7CisJCXdyaXRlbCgwLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0lPRFdDUl8xKTsKKwl9IGVsc2UgeworCQl3cml0ZWwobWl0ZS0+ZGFxX3BoeXNfYWRkciB8IFdFTkFCLAorCQkJbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9JT0RXQlNSKTsKKwl9CisJLyogbWFrZSBzdXJlIGRtYSBidXJzdHMgd29yay4gIEkgZ290IHRoaXMgZnJvbSBydW5uaW5nIGEgYnVzIGFuYWx5emVyCisJICAgb24gYSBweGktNjI4MSBhbmQgYSBweGktNjcxMy4gIDY3MTMgcG93ZXJlZCB1cCB3aXRoIHJlZ2lzdGVyIHZhbHVlCisJICAgb2YgMHg2MWYgYW5kIGJ1cnN0cyB3b3JrZWQuICA2MjgxIHBvd2VyZWQgdXAgd2l0aCByZWdpc3RlciB2YWx1ZSBvZgorCSAgIDB4MWYgYW5kIGJ1cnN0cyBkaWRuJ3Qgd29yay4gIFRoZSBOSSB3aW5kb3dzIGRyaXZlciByZWFkcyB0aGUgcmVnaXN0ZXIsCisJICAgdGhlbiBkb2VzIGEgYml0d2lzZS1vciBvZiAweDYwMCB3aXRoIGl0IGFuZCB3cml0ZXMgaXQgYmFjay4KKwkgKi8KKwl1bmtub3duX2RtYV9idXJzdF9iaXRzID0KKwkJcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9VTktOT1dOX0RNQV9CVVJTVF9SRUcpOworCXVua25vd25fZG1hX2J1cnN0X2JpdHMgfD0gVU5LTk9XTl9ETUFfQlVSU1RfRU5BQkxFX0JJVFM7CisJd3JpdGVsKHVua25vd25fZG1hX2J1cnN0X2JpdHMsCisJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfVU5LTk9XTl9ETUFfQlVSU1RfUkVHKTsKKworCWNzaWdyX2JpdHMgPSByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NTSUdSKTsKKwltaXRlLT5udW1fY2hhbm5lbHMgPSBtaXRlX2NzaWdyX2RtYWMoY3NpZ3JfYml0cyk7CisJaWYgKG1pdGUtPm51bV9jaGFubmVscyA+IE1BWF9NSVRFX0RNQV9DSEFOTkVMUykgeworCQlwcmludGsoIm1pdGU6IGJ1Zz8gY2hpcCBjbGFpbXMgdG8gaGF2ZSAlaSBkbWEgY2hhbm5lbHMuICBTZXR0aW5nIHRvICVpLlxuIiwgbWl0ZS0+bnVtX2NoYW5uZWxzLCBNQVhfTUlURV9ETUFfQ0hBTk5FTFMpOworCQltaXRlLT5udW1fY2hhbm5lbHMgPSBNQVhfTUlURV9ETUFfQ0hBTk5FTFM7CisJfQorCWR1bXBfY2hpcF9zaWduYXR1cmUoY3NpZ3JfYml0cyk7CisJZm9yIChpID0gMDsgaSA8IG1pdGUtPm51bV9jaGFubmVsczsgaSsrKSB7CisJCXdyaXRlbChDSE9SX0RNQVJFU0VULCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IoaSkpOworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJd3JpdGVsKENIQ1JfQ0xSX0RNQV9JRSB8IENIQ1JfQ0xSX0xJTktQX0lFIHwgQ0hDUl9DTFJfU0FSX0lFIHwKKwkJCUNIQ1JfQ0xSX0RPTkVfSUUgfCBDSENSX0NMUl9NUkRZX0lFIHwgQ0hDUl9DTFJfRFJEWV9JRSB8CisJCQlDSENSX0NMUl9MQ19JRSB8IENIQ1JfQ0xSX0NPTlRfUkJfSUUsCisJCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIQ1IoaSkpOworCX0KKwltaXRlLT5maWZvX3NpemUgPSBtaXRlX2ZpZm9fc2l6ZShtaXRlLCAwKTsKKwlwcmludGsoIm1pdGU6IGZpZm8gc2l6ZSBpcyAlaS5cbiIsIG1pdGUtPmZpZm9fc2l6ZSk7CisJbWl0ZS0+dXNlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1pdGVfc2V0dXAoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKQoreworCXJldHVybiBtaXRlX3NldHVwMihtaXRlLCAwKTsKK30KKwordm9pZCBtaXRlX2NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsICpuZXh0OworCisJZm9yIChtaXRlID0gbWl0ZV9kZXZpY2VzOyBtaXRlOyBtaXRlID0gbmV4dCkgeworCQlwY2lfZGV2X3B1dChtaXRlLT5wY2lkZXYpOworCQluZXh0ID0gbWl0ZS0+bmV4dDsKKwkJa2ZyZWUobWl0ZSk7CisJfQorfQorCit2b2lkIG1pdGVfdW5zZXR1cChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpCit7CisJLy91bnNpZ25lZCBsb25nIG9mZnNldCwgc3RhcnQsIGxlbmd0aDsKKworCWlmICghbWl0ZSkKKwkJcmV0dXJuOworCisJaWYgKG1pdGUtPm1pdGVfaW9fYWRkcikgeworCQlpb3VubWFwKG1pdGUtPm1pdGVfaW9fYWRkcik7CisJCW1pdGUtPm1pdGVfaW9fYWRkciA9IE5VTEw7CisJfQorCWlmIChtaXRlLT5kYXFfaW9fYWRkcikgeworCQlpb3VubWFwKG1pdGUtPmRhcV9pb19hZGRyKTsKKwkJbWl0ZS0+ZGFxX2lvX2FkZHIgPSBOVUxMOworCX0KKwlpZiAobWl0ZS0+bWl0ZV9waHlzX2FkZHIpIHsKKwkJY29tZWRpX3BjaV9kaXNhYmxlKG1pdGUtPnBjaWRldik7CisJCW1pdGUtPm1pdGVfcGh5c19hZGRyID0gMDsKKwl9CisKKwltaXRlLT51c2VkID0gMDsKK30KKwordm9pZCBtaXRlX2xpc3RfZGV2aWNlcyh2b2lkKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgKm5leHQ7CisKKwlwcmludGsoIkF2YWlsYWJsZSBOSSBkZXZpY2UgSURzOiIpOworCWlmIChtaXRlX2RldmljZXMpCisJCWZvciAobWl0ZSA9IG1pdGVfZGV2aWNlczsgbWl0ZTsgbWl0ZSA9IG5leHQpIHsKKwkJCW5leHQgPSBtaXRlLT5uZXh0OworCQkJcHJpbnRrKCIgMHglMDR4IiwgbWl0ZV9kZXZpY2VfaWQobWl0ZSkpOworCQkJaWYgKG1pdGUtPnVzZWQpCisJCQkJcHJpbnRrKCIodXNlZCkiKTsKKwkJfQorCXByaW50aygiXG4iKTsKKworfQorCitzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsCisJc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZywgdW5zaWduZWQgbWluX2NoYW5uZWwsCisJdW5zaWduZWQgbWF4X2NoYW5uZWwpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbWl0ZV9jaGFubmVsICpjaGFubmVsID0gTlVMTDsKKworCS8vIHNwaW4gbG9jayBzbyBtaXRlX3JlbGVhc2VfY2hhbm5lbCBjYW4gYmUgY2FsbGVkIHNhZmVseSBmcm9tIGludGVycnVwdHMKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSBtaW5fY2hhbm5lbDsgaSA8PSBtYXhfY2hhbm5lbDsgKytpKSB7CisJCWlmIChtaXRlLT5jaGFubmVsX2FsbG9jYXRlZFtpXSA9PSAwKSB7CisJCQltaXRlLT5jaGFubmVsX2FsbG9jYXRlZFtpXSA9IDE7CisJCQljaGFubmVsID0gJm1pdGUtPmNoYW5uZWxzW2ldOworCQkJY2hhbm5lbC0+cmluZyA9IHJpbmc7CisJCQlicmVhazsKKwkJfQorCX0KKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCXJldHVybiBjaGFubmVsOworfQorCit2b2lkIG1pdGVfcmVsZWFzZV9jaGFubmVsKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8vIHNwaW4gbG9jayB0byBwcmV2ZW50IHJhY2VzIHdpdGggbWl0ZV9yZXF1ZXN0X2NoYW5uZWwKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwlpZiAobWl0ZS0+Y2hhbm5lbF9hbGxvY2F0ZWRbbWl0ZV9jaGFuLT5jaGFubmVsXSkgeworCQltaXRlX2RtYV9kaXNhcm0obWl0ZV9jaGFuKTsKKwkJbWl0ZV9kbWFfcmVzZXQobWl0ZV9jaGFuKTsKKy8qIGRpc2FibGUgYWxsIGNoYW5uZWwncyBpbnRlcnJ1cHRzIChkbyBpdCBhZnRlciBkaXNhcm0vcmVzZXQgc28KK01JVEVfQ0hDUiByZWcgaXNuJ3QgY2hhbmdlZCB3aGlsZSBkbWEgaXMgc3RpbGwgYWN0aXZlISkgKi8KKwkJd3JpdGVsKENIQ1JfQ0xSX0RNQV9JRSB8IENIQ1JfQ0xSX0xJTktQX0lFIHwKKwkJCUNIQ1JfQ0xSX1NBUl9JRSB8IENIQ1JfQ0xSX0RPTkVfSUUgfAorCQkJQ0hDUl9DTFJfTVJEWV9JRSB8IENIQ1JfQ0xSX0RSRFlfSUUgfAorCQkJQ0hDUl9DTFJfTENfSUUgfCBDSENSX0NMUl9DT05UX1JCX0lFLAorCQkJbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSENSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCQltaXRlLT5jaGFubmVsX2FsbG9jYXRlZFttaXRlX2NoYW4tPmNoYW5uZWxdID0gMDsKKwkJbWl0ZV9jaGFuLT5yaW5nID0gTlVMTDsKKwkJbW1pb3diKCk7CisJfQorCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgbWl0ZV9kbWFfYXJtKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJaW50IGNob3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCU1EUFJJTlRLKCJtaXRlX2RtYV9hcm0gY2glaVxuIiwgY2hhbm5lbCk7CisJLyogbWVtb3J5IGJhcnJpZXIgaXMgaW50ZW5kZWQgdG8gaW5zdXJlIGFueSB0d2lkZGxpbmcgd2l0aCB0aGUgYnVmZmVyCisJICAgaXMgZG9uZSBiZWZvcmUgd3JpdGluZyB0byB0aGUgbWl0ZSB0byBhcm0gZG1hIHRyYW5zZmVyICovCisJc21wX21iKCk7CisJLyogYXJtICovCisJY2hvciA9IENIT1JfU1RBUlQ7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJbWl0ZV9jaGFuLT5kb25lID0gMDsKKwl3cml0ZWwoY2hvciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCW1taW93YigpOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisvLyAgICAgIG1pdGVfZG1hX3RjcihtaXRlLCBjaGFubmVsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbWl0ZV9idWZfY2hhbmdlKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcsIGNvbWVkaV9hc3luYyAqIGFzeW5jKQoreworCXVuc2lnbmVkIGludCBuX2xpbmtzOworCWludCBpOworCisJaWYgKHJpbmctPmRlc2NyaXB0b3JzKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KHJpbmctPmh3X2RldiwKKwkJCXJpbmctPm5fbGlua3MgKiBzaXplb2Yoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3IpLAorCQkJcmluZy0+ZGVzY3JpcHRvcnMsIHJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyKTsKKwl9CisJcmluZy0+ZGVzY3JpcHRvcnMgPSBOVUxMOworCXJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyID0gMDsKKwlyaW5nLT5uX2xpbmtzID0gMDsKKworCWlmIChhc3luYy0+cHJlYWxsb2NfYnVmc3ogPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJbl9saW5rcyA9IGFzeW5jLT5wcmVhbGxvY19idWZzeiA+PiBQQUdFX1NISUZUOworCisJTURQUklOVEsoInJpbmctPmh3X2Rldj0lcCwgbl9saW5rcz0weCUwNHhcbiIsIHJpbmctPmh3X2Rldiwgbl9saW5rcyk7CisKKwlyaW5nLT5kZXNjcmlwdG9ycyA9CisJCWRtYV9hbGxvY19jb2hlcmVudChyaW5nLT5od19kZXYsCisJCW5fbGlua3MgKiBzaXplb2Yoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3IpLAorCQkmcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghcmluZy0+ZGVzY3JpcHRvcnMpIHsKKwkJcHJpbnRrKCJtaXRlOiByaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyaW5nLT5uX2xpbmtzID0gbl9saW5rczsKKworCWZvciAoaSA9IDA7IGkgPCBuX2xpbmtzOyBpKyspIHsKKwkJcmluZy0+ZGVzY3JpcHRvcnNbaV0uY291bnQgPSBjcHVfdG9fbGUzMihQQUdFX1NJWkUpOworCQlyaW5nLT5kZXNjcmlwdG9yc1tpXS5hZGRyID0KKwkJCWNwdV90b19sZTMyKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLmRtYV9hZGRyKTsKKwkJcmluZy0+ZGVzY3JpcHRvcnNbaV0ubmV4dCA9CisJCQljcHVfdG9fbGUzMihyaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkciArIChpICsKKwkJCQkxKSAqIHNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcikpOworCX0KKwlyaW5nLT5kZXNjcmlwdG9yc1tuX2xpbmtzIC0gMV0ubmV4dCA9CisJCWNwdV90b19sZTMyKHJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyKTsKKwkvKiBiYXJyaWVyIGlzIG1lYW50IHRvIGluc3VyZSB0aGF0IGFsbCB0aGUgd3JpdGVzIHRvIHRoZSBkbWEgZGVzY3JpcHRvcnMKKwkgICBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgdGhlIGRtYSBjb250cm9sbGVyIGlzIGNvbW1hbmRlZCB0byByZWFkIHRoZW0gKi8KKwlzbXBfd21iKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWl0ZV9wcmVwX2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sCisJdW5zaWduZWQgaW50IG51bV9kZXZpY2VfYml0cywgdW5zaWduZWQgaW50IG51bV9tZW1vcnlfYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgY2hvciwgY2hjciwgbWNyLCBkY3IsIGxrY3I7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCisJTURQUklOVEsoIm1pdGVfcHJlcF9kbWEgY2glaVxuIiwgbWl0ZV9jaGFuLT5jaGFubmVsKTsKKworCS8qIHJlc2V0IERNQSBhbmQgRklGTyAqLworCWNob3IgPSBDSE9SX0RNQVJFU0VUIHwgQ0hPUl9GUkVTRVQ7CisJd3JpdGVsKGNob3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCS8qIHNob3J0IGxpbmsgY2hhaW5pbmcgbW9kZSAqLworCWNoY3IgPSBDSENSX1NFVF9ETUFfSUUgfCBDSENSX0xJTktTSE9SVCB8IENIQ1JfU0VUX0RPTkVfSUUgfAorCQlDSENSX0JVUlNURU47CisJLyoKKwkgKiBMaW5rIENvbXBsZXRlIEludGVycnVwdDogaW50ZXJydXB0IGV2ZXJ5IHRpbWUgYSBsaW5rCisJICogaW4gTUlURV9SSU5HIGlzIGNvbXBsZXRlZC4gVGhpcyBjYW4gZ2VuZXJhdGUgYSBsb3Qgb2YKKwkgKiBleHRyYSBpbnRlcnJ1cHRzLCBidXQgcmlnaHQgbm93IHdlIHVwZGF0ZSB0aGUgdmFsdWVzCisJICogb2YgYnVmX2ludF9wdHIgYW5kIGJ1Zl9pbnRfY291bnQgYXQgZWFjaCBpbnRlcnJ1cHQuICBBCisJICogYmV0dGVyIG1ldGhvZCBpcyB0byBwb2xsIHRoZSBNSVRFIGJlZm9yZSBlYWNoIHVzZXIKKwkgKiAicmVhZCgpIiB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuCisJICovCisJY2hjciB8PSBDSENSX1NFVF9MQ19JRTsKKwlpZiAobnVtX21lbW9yeV9iaXRzID09IDMyICYmIG51bV9kZXZpY2VfYml0cyA9PSAxNikgeworCQkvKiBEb2luZyBhIGNvbWJpbmVkIDMyIGFuZCAxNiBiaXQgYnl0ZXN3YXAgZ2V0cyB0aGUgMTYgYml0IHNhbXBsZXMgaW50byB0aGUgZmlmbyBpbiB0aGUgcmlnaHQgb3JkZXIuCisJCSAgIFRlc3RlZCBkb2luZyAzMiBiaXQgbWVtb3J5IHRvIDE2IGJpdCBkZXZpY2UgdHJhbnNmZXJzIHRvIHRoZSBhbmFsb2cgb3V0IG9mIGEgcHhpLTYyODEsCisJCSAgIHdoaWNoIGhhcyBtaXRlIHZlcnNpb24gPSAxLCB0eXBlID0gNC4gIFRoaXMgYWxzbyB3b3JrcyBmb3IgZG1hIHJlYWRzIGZyb20gdGhlIGNvdW50ZXJzCisJCSAgIG9uIGUtc2VyaWVzIGJvYXJkcy4gICovCisJCWNoY3IgfD0gQ0hDUl9CWVRFX1NXQVBfREVWSUNFIHwgQ0hDUl9CWVRFX1NXQVBfTUVNT1JZOworCX0KKwlpZiAobWl0ZV9jaGFuLT5kaXIgPT0gQ09NRURJX0lOUFVUKSB7CisJCWNoY3IgfD0gQ0hDUl9ERVZfVE9fTUVNOworCX0KKwl3cml0ZWwoY2hjciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSENSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJLyogdG8vZnJvbSBtZW1vcnkgKi8KKwltY3IgPSBDUl9STCg2NCkgfCBDUl9BU0VRVVA7CisJc3dpdGNoIChudW1fbWVtb3J5X2JpdHMpIHsKKwljYXNlIDg6CisJCW1jciB8PSBDUl9QU0laRTg7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCW1jciB8PSBDUl9QU0laRTE2OworCQlicmVhazsKKwljYXNlIDMyOgorCQltY3IgfD0gQ1JfUFNJWkUzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcnRfcHJpbnRrCisJCQkoIm1pdGU6IGJ1ZyEgaW52YWxpZCBtZW0gYml0IHdpZHRoIGZvciBkbWEgdHJhbnNmZXJcbiIpOworCQlicmVhazsKKwl9CisJd3JpdGVsKG1jciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9NQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwkvKiBmcm9tL3RvIGRldmljZSAqLworCWRjciA9IENSX1JMKDY0KSB8IENSX0FTRVFVUDsKKwlkY3IgfD0gQ1JfUE9SVElPIHwgQ1JfQU1ERVZJQ0UgfCBDUl9SRVFTRFJRKG1pdGVfY2hhbi0+Y2hhbm5lbCk7CisJc3dpdGNoIChudW1fZGV2aWNlX2JpdHMpIHsKKwljYXNlIDg6CisJCWRjciB8PSBDUl9QU0laRTg7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWRjciB8PSBDUl9QU0laRTE2OworCQlicmVhazsKKwljYXNlIDMyOgorCQlkY3IgfD0gQ1JfUFNJWkUzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcnRfcHJpbnRrCisJCQkoIm1pdGU6IGJ1ZyEgaW52YWxpZCBkZXYgYml0IHdpZHRoIGZvciBkbWEgdHJhbnNmZXJcbiIpOworCQlicmVhazsKKwl9CisJd3JpdGVsKGRjciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9EQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwkvKiByZXNldCB0aGUgREFSICovCisJd3JpdGVsKDAsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfREFSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJLyogdGhlIGxpbmsgaXMgMzJiaXRzICovCisJbGtjciA9IENSX1JMKDY0KSB8IENSX0FTRVFVUCB8IENSX1BTSVpFMzI7CisJd3JpdGVsKGxrY3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfTEtDUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCS8qIHN0YXJ0aW5nIGFkZHJlc3MgZm9yIGxpbmsgY2hhaW5pbmcgKi8KKwl3cml0ZWwobWl0ZV9jaGFuLT5yaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkciwKKwkJbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9MS0FSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJTURQUklOVEsoImV4aXQgbWl0ZV9wcmVwX2RtYVxuIik7Cit9CisKK3UzMiBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCXJldHVybiByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0RBUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKK30KKwordTMyIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwlyZXR1cm4gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsKKwkJTUlURV9GQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSkgJiAweDAwMDAwMEZGOworfQorCisvLyByZXR1cm5zIGxvd2VyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgdG8gbWVtb3J5Cit1MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQoreworCXUzMiBkZXZpY2VfYnl0ZV9jb3VudDsKKworCWRldmljZV9ieXRlX2NvdW50ID0gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKTsKKwlyZXR1cm4gZGV2aWNlX2J5dGVfY291bnQgLSBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKK30KKworLy8gcmV0dXJucyB1cHBlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlIHRvIG1lbW9yeQordTMyIG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKK3sKKwl1MzIgaW5fdHJhbnNpdF9jb3VudDsKKworCWluX3RyYW5zaXRfY291bnQgPSBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKKwlyZXR1cm4gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKSAtIGluX3RyYW5zaXRfY291bnQ7Cit9CisKKy8vIHJldHVybnMgbG93ZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gbWVtb3J5IGZvciB0cmFuc2ZlciB0byBkZXZpY2UKK3UzMiBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfbGIoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKK3sKKwl1MzIgZGV2aWNlX2J5dGVfY291bnQ7CisKKwlkZXZpY2VfYnl0ZV9jb3VudCA9IG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKG1pdGVfY2hhbik7CisJcmV0dXJuIGRldmljZV9ieXRlX2NvdW50ICsgbWl0ZV9ieXRlc19pbl90cmFuc2l0KG1pdGVfY2hhbik7Cit9CisKKy8vIHJldHVybnMgdXBwZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gbWVtb3J5IGZvciB0cmFuc2ZlciB0byBkZXZpY2UKK3UzMiBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfdWIoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKK3sKKwl1MzIgaW5fdHJhbnNpdF9jb3VudDsKKworCWluX3RyYW5zaXRfY291bnQgPSBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKKwlyZXR1cm4gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKSArIGluX3RyYW5zaXRfY291bnQ7Cit9CisKK3Vuc2lnbmVkIG1pdGVfZG1hX3RjcihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCWludCB0Y3I7CisJaW50IGxrYXI7CisKKwlsa2FyID0gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9MS0FSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCXRjciA9IHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfVENSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCU1EUFJJTlRLKCJtaXRlX2RtYV90Y3IgY2glaSwgbGthcj0weCUwOHggdGNyPSVkXG4iLCBtaXRlX2NoYW4tPmNoYW5uZWwsCisJCWxrYXIsIHRjcik7CisKKwlyZXR1cm4gdGNyOworfQorCit2b2lkIG1pdGVfZG1hX2Rpc2FybShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCXVuc2lnbmVkIGNob3I7CisKKwkvKiBkaXNhcm0gKi8KKwljaG9yID0gQ0hPUl9BQk9SVDsKKwl3cml0ZWwoY2hvciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworfQorCitpbnQgbWl0ZV9zeW5jX2lucHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sIGNvbWVkaV9hc3luYyAqIGFzeW5jKQoreworCWludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzLCBvbGRfYWxsb2NfY291bnQ7CisJY29uc3QgdW5zaWduZWQgYnl0ZXNfcGVyX3NjYW4gPSBjZmNfYnl0ZXNfcGVyX3NjYW4oYXN5bmMtPnN1YmRldmljZSk7CisKKwlvbGRfYWxsb2NfY291bnQgPSBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50OworCS8vIHdyaXRlIGFsbG9jIGFzIG11Y2ggYXMgd2UgY2FuCisJY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhhc3luYywgYXN5bmMtPnByZWFsbG9jX2J1ZnN6KTsKKworCW5ieXRlcyA9IG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIobWl0ZV9jaGFuKTsKKwlpZiAoKGludCkobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihtaXRlX2NoYW4pIC0KKwkJCW9sZF9hbGxvY19jb3VudCkgPiAwKSB7CisJCXJ0X3ByaW50aygibWl0ZTogRE1BIG92ZXJ3cml0ZSBvZiBmcmVlIGFyZWFcbiIpOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvdW50ID0gbmJ5dGVzIC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudDsKKwkvKiBpdCdzIHBvc3NpYmxlIGNvdW50IHdpbGwgYmUgbmVnYXRpdmUgZHVlIHRvCisJICogY29uc2VydmF0aXZlIHZhbHVlIHJldHVybmVkIGJ5IG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIgKi8KKwlpZiAoY291bnQgPD0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBjb3VudCk7CisKKwlhc3luYy0+c2Nhbl9wcm9ncmVzcyArPSBjb3VudDsKKwlpZiAoYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgPj0gYnl0ZXNfcGVyX3NjYW4pIHsKKwkJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgJT0gYnl0ZXNfcGVyX3NjYW47CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKKwl9CisJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtaXRlX3N5bmNfb3V0cHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sIGNvbWVkaV9hc3luYyAqIGFzeW5jKQoreworCWludCBjb3VudDsKKwl1MzIgbmJ5dGVzX3ViLCBuYnl0ZXNfbGI7CisJdW5zaWduZWQgaW50IG9sZF9hbGxvY19jb3VudDsKKwl1MzIgc3RvcF9jb3VudCA9CisJCWFzeW5jLT5jbWQuc3RvcF9hcmcgKiBjZmNfYnl0ZXNfcGVyX3NjYW4oYXN5bmMtPnN1YmRldmljZSk7CisKKwlvbGRfYWxsb2NfY291bnQgPSBhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQ7CisJLy8gcmVhZCBhbGxvYyBhcyBtdWNoIGFzIHdlIGNhbgorCWNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgYXN5bmMtPnByZWFsbG9jX2J1ZnN6KTsKKwluYnl0ZXNfbGIgPSBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfbGIobWl0ZV9jaGFuKTsKKwlpZiAoYXN5bmMtPmNtZC5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCisJCShpbnQpKG5ieXRlc19sYiAtIHN0b3BfY291bnQpID4gMCkKKwkJbmJ5dGVzX2xiID0gc3RvcF9jb3VudDsKKwluYnl0ZXNfdWIgPSBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfdWIobWl0ZV9jaGFuKTsKKwlpZiAoYXN5bmMtPmNtZC5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCisJCShpbnQpKG5ieXRlc191YiAtIHN0b3BfY291bnQpID4gMCkKKwkJbmJ5dGVzX3ViID0gc3RvcF9jb3VudDsKKwlpZiAoKGludCkobmJ5dGVzX3ViIC0gb2xkX2FsbG9jX2NvdW50KSA+IDApIHsKKwkJcnRfcHJpbnRrKCJtaXRlOiBETUEgdW5kZXJydW5cbiIpOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKwkJcmV0dXJuIC0xOworCX0KKwljb3VudCA9IG5ieXRlc19sYiAtIGFzeW5jLT5idWZfcmVhZF9jb3VudDsKKwlpZiAoY291bnQgPD0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNvdW50KSB7CisJCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBjb3VudCk7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCX0KKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgbWl0ZV9nZXRfc3RhdHVzKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJdW5zaWduZWQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIU1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJaWYgKHN0YXR1cyAmIENIU1JfRE9ORSkgeworCQltaXRlX2NoYW4tPmRvbmUgPSAxOworCQl3cml0ZWwoQ0hPUl9DTFJET05FLAorCQkJbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCX0KKwltbWlvd2IoKTsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBtaXRlX2RvbmUoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBkb25lOworCisJbWl0ZV9nZXRfc3RhdHVzKG1pdGVfY2hhbik7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJZG9uZSA9IG1pdGVfY2hhbi0+ZG9uZTsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCXJldHVybiBkb25lOworfQorCisjaWZkZWYgREVCVUdfTUlURQorCitzdGF0aWMgdm9pZCBtaXRlX2RlY29kZShjaGFyICoqYml0X3N0ciwgdW5zaWduZWQgaW50IGJpdHMpOworCisvKiBuYW1lcyBvZiBiaXRzIGluIG1pdGUgcmVnaXN0ZXJzICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXRlX0NIT1Jfc3RyaW5nc1tdID0geworCSJzdGFydCIsICJjb250IiwgInN0b3AiLCAiYWJvcnQiLAorCSJmcmVzZXQiLCAiY2xybGMiLCAiY2xycmIiLCAiY2xyZG9uZSIsCisJImNscl9scGF1c2UiLCAic2V0X2xwYXVzZSIsICJjbHJfc2VuZF90YyIsCisJInNldF9zZW5kX3RjIiwgIjEyIiwgIjEzIiwgIjE0IiwKKwkiMTUiLCAiMTYiLCAiMTciLCAiMTgiLAorCSIxOSIsICIyMCIsICIyMSIsICIyMiIsCisJIjIzIiwgIjI0IiwgIjI1IiwgIjI2IiwKKwkiMjciLCAiMjgiLCAiMjkiLCAiMzAiLAorCSJkbWFyZXNldCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWl0ZV9DSENSX3N0cmluZ3NbXSA9IHsKKwkiY29udGludWUiLCAicmluZ2J1ZmYiLCAiMiIsICIzIiwKKwkiNCIsICI1IiwgIjYiLCAiNyIsCisJIjgiLCAiOSIsICIxMCIsICIxMSIsCisJIjEyIiwgIjEzIiwgImJ1cnN0ZW4iLCAiZmlmb2RpcyIsCisJImNscl9jb250X3JiX2llIiwgInNldF9jb250X3JiX2llIiwgImNscl9sY19pZSIsICJzZXRfbGNfaWUiLAorCSJjbHJfZHJkeV9pZSIsICJzZXRfZHJkeV9pZSIsICJjbHJfbXJkeV9pZSIsICJzZXRfbXJkeV9pZSIsCisJImNscl9kb25lX2llIiwgInNldF9kb25lX2llIiwgImNscl9zYXJfaWUiLCAic2V0X3Nhcl9pZSIsCisJImNscl9saW5rcF9pZSIsICJzZXRfbGlua3BfaWUiLCAiY2xyX2RtYV9pZSIsICJzZXRfZG1hX2llIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXRlX01DUl9zdHJpbmdzW10gPSB7CisJImFtZGV2aWNlIiwgIjEiLCAiMiIsICIzIiwKKwkiNCIsICI1IiwgInBvcnRpbyIsICJwb3J0dnhpIiwKKwkicHNpemVieXRlIiwgInBzaXplaGFsZiAoYnl0ZSAmIGhhbGYgPSB3b3JkKSIsICJhc2VxeHAxIiwgIjExIiwKKwkiMTIiLCAiMTMiLCAiYmxvY2tlbiIsICJiZXJoYW5kIiwKKwkicmVxc2ludGxpbS9yZXFzMCIsICJyZXFzMSIsICJyZXFzMiIsICJyZDMyIiwKKwkicmQ1MTIiLCAicmwxIiwgInJsMiIsICJybDgiLAorCSIyNCIsICIyNSIsICIyNiIsICIyNyIsCisJIjI4IiwgIjI5IiwgIjMwIiwgInN0b3BlbiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWl0ZV9EQ1Jfc3RyaW5nc1tdID0geworCSJhbWRldmljZSIsICIxIiwgIjIiLCAiMyIsCisJIjQiLCAiNSIsICJwb3J0aW8iLCAicG9ydHZ4aSIsCisJInBzaXplYnl0ZSIsICJwc2l6ZWhhbGYgKGJ5dGUgJiBoYWxmID0gd29yZCkiLCAiYXNlcXhwMSIsICJhc2VxeHAyIiwKKwkiYXNlcXhwOCIsICIxMyIsICJibG9ja2VuIiwgImJlcmhhbmQiLAorCSJyZXFzaW50bGltIiwgInJlcXMxIiwgInJlcXMyIiwgInJkMzIiLAorCSJyZDUxMiIsICJybDEiLCAicmwyIiwgInJsOCIsCisJIjIzIiwgIjI0IiwgIjI1IiwgIjI3IiwKKwkiMjgiLCAid3NkZXZjIiwgIndzZGV2cyIsICJyd2RldnBhY2siLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfTEtDUl9zdHJpbmdzW10gPSB7CisJImFtZGV2aWNlIiwgIjEiLCAiMiIsICIzIiwKKwkiNCIsICI1IiwgInBvcnRpbyIsICJwb3J0dnhpIiwKKwkicHNpemVieXRlIiwgInBzaXplaGFsZiAoYnl0ZSAmIGhhbGYgPSB3b3JkKSIsICJhc2VxdXAiLCAiYXNlcWRvd24iLAorCSIxMiIsICIxMyIsICIxNCIsICJiZXJoYW5kIiwKKwkiMTYiLCAiMTciLCAiMTgiLCAicmQzMiIsCisJInJkNTEyIiwgInJsMSIsICJybDIiLCAicmw4IiwKKwkiMjQiLCAiMjUiLCAiMjYiLCAiMjciLAorCSIyOCIsICIyOSIsICIzMCIsICJjaG5nZW5kIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXRlX0NIU1Jfc3RyaW5nc1tdID0geworCSJkLmVycjAiLCAiZC5lcnIxIiwgIm0uZXJyMCIsICJtLmVycjEiLAorCSJsLmVycjAiLCAibC5lcnIxIiwgImRycTAiLCAiZHJxMSIsCisJImVuZCIsICJ4ZmVyciIsICJvcGVycjAiLCAib3BlcnIxIiwKKwkic3RvcHMiLCAiaGFib3J0IiwgInNhYm9ydCIsICJlcnJvciIsCisJIjE2IiwgImNvbnRzX3JiIiwgIjE4IiwgImxpbmtjIiwKKwkiMjAiLCAiZHJkeSIsICIyMiIsICJtcmR5IiwKKwkiMjQiLCAiZG9uZSIsICIyNiIsICJzYXJzIiwKKwkiMjgiLCAibHBhdXNlcyIsICIzMCIsICJpbnQiLAorfTsKKwordm9pZCBtaXRlX2R1bXBfcmVncyhzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJdW5zaWduZWQgbG9uZyBtaXRlX2lvX2FkZHIgPQorCQkodW5zaWduZWQgbG9uZyltaXRlX2NoYW4tPm1pdGUtPm1pdGVfaW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7CisKKwlwcmludGsoIm1pdGVfZHVtcF9yZWdzIGNoJWlcbiIsIG1pdGVfY2hhbi0+Y2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIGFkZHJlc3MgaXMgID0weCUwOGx4XG4iLCBtaXRlX2lvX2FkZHIpOworCisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0NIT1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJCXJlYWRsKGFkZHIpKTsKKwltaXRlX2RlY29kZShtaXRlX0NIT1Jfc3RyaW5ncywgdGVtcCk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfQ0hDUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0NIQ1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJCXJlYWRsKGFkZHIpKTsKKwltaXRlX2RlY29kZShtaXRlX0NIQ1Jfc3RyaW5ncywgdGVtcCk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfVENSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbVENSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9NQ1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tNQ1JdIGF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCQlyZWFkbChhZGRyKSk7CisJbWl0ZV9kZWNvZGUobWl0ZV9NQ1Jfc3RyaW5ncywgdGVtcCk7CisKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9NQVIoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tNQVJdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0RDUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0RDUl0gYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJCXJlYWRsKGFkZHIpKTsKKwltaXRlX2RlY29kZShtaXRlX0RDUl9zdHJpbmdzLCB0ZW1wKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9EQVIoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tEQVJdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0xLQ1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tMS0NSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCQlyZWFkbChhZGRyKSk7CisJbWl0ZV9kZWNvZGUobWl0ZV9MS0NSX3N0cmluZ3MsIHRlbXApOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0xLQVIoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tMS0FSXWF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOworCisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfQ0hTUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0NIU1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJCXJlYWRsKGFkZHIpKTsKKwltaXRlX2RlY29kZShtaXRlX0NIU1Jfc3RyaW5ncywgdGVtcCk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfRkNSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbRkNSXSBhdCAweCUwOGx4ID0weCUwOHhcblxuIiwgYWRkciwgcmVhZGwoYWRkcikpOworfQorCitzdGF0aWMgdm9pZCBtaXRlX2RlY29kZShjaGFyICoqYml0X3N0ciwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGJpdHMgJiAoMSA8PCBpKSkgeworCQkJcHJpbnRrKCIgJXMiLCBiaXRfc3RyW2ldKTsKKwkJfQorCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworI2lmZGVmIE1PRFVMRQoraW50IF9faW5pdCBpbml0X21vZHVsZSh2b2lkKQoreworCW1pdGVfaW5pdCgpOworCW1pdGVfbGlzdF9kZXZpY2VzKCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwltaXRlX2NsZWFudXAoKTsKK30KKworRVhQT1JUX1NZTUJPTChtaXRlX2RtYV90Y3IpOworRVhQT1JUX1NZTUJPTChtaXRlX2RtYV9hcm0pOworRVhQT1JUX1NZTUJPTChtaXRlX2RtYV9kaXNhcm0pOworRVhQT1JUX1NZTUJPTChtaXRlX3N5bmNfaW5wdXRfZG1hKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9zeW5jX291dHB1dF9kbWEpOworRVhQT1JUX1NZTUJPTChtaXRlX3NldHVwKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9zZXR1cDIpOworRVhQT1JUX1NZTUJPTChtaXRlX3Vuc2V0dXApOworI2lmIDAKK0VYUE9SVF9TWU1CT0wobWl0ZV9rdm1lbV9zZWdtZW50X2xvYWQpOworRVhQT1JUX1NZTUJPTChtaXRlX2xsX2Zyb21fa3ZtZW0pOworRVhQT1JUX1NZTUJPTChtaXRlX3NldHJlZ3MpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKG1pdGVfZGV2aWNlcyk7CitFWFBPUlRfU1lNQk9MKG1pdGVfbGlzdF9kZXZpY2VzKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9yZXF1ZXN0X2NoYW5uZWxfaW5fcmFuZ2UpOworRVhQT1JUX1NZTUJPTChtaXRlX3JlbGVhc2VfY2hhbm5lbCk7CitFWFBPUlRfU1lNQk9MKG1pdGVfcHJlcF9kbWEpOworRVhQT1JUX1NZTUJPTChtaXRlX2J1Zl9jaGFuZ2UpOworRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91Yik7CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYik7CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91Yik7CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfaW5fdHJhbnNpdCk7CitFWFBPUlRfU1lNQk9MKG1pdGVfZ2V0X3N0YXR1cyk7CitFWFBPUlRfU1lNQk9MKG1pdGVfZG9uZSk7CisjaWZkZWYgREVCVUdfTUlURQorRVhQT1JUX1NZTUJPTChtaXRlX2RlY29kZSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfZHVtcF9yZWdzKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NGVhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICAgIG1vZHVsZS9taXRlLmgKKyAgICBIYXJkd2FyZSBkcml2ZXIgZm9yIE5JIE1pdGUgUENJIGludGVyZmFjZSBjaGlwCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX01JVEVfSF8KKyNkZWZpbmUgX01JVEVfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkFUSU5TVAkJMHgxMDkzCisKKy8vICNkZWZpbmUgREVCVUdfTUlURQorI2RlZmluZSBQQ0lNSU9fQ09NUEFUCisKKyNpZmRlZiBERUJVR19NSVRFCisjZGVmaW5lIE1EUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQlwcmludGsoZm9ybWF0ICwgIyMgYXJncyApCisjZWxzZQorI2RlZmluZSBNRFBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9NSVRFX0RNQV9DSEFOTkVMUyA4CisKK3N0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yIHsKKwl1MzIgY291bnQ7CisJdTMyIGFkZHI7CisJdTMyIG5leHQ7CisJdTMyIGRhcjsKK307CisKK3N0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgeworCXN0cnVjdCBkZXZpY2UgKmh3X2RldjsKKwl1bnNpZ25lZCBpbnQgbl9saW5rczsKKwlzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciAqZGVzY3JpcHRvcnM7CisJZG1hX2FkZHJfdCBkZXNjcmlwdG9yc19kbWFfYWRkcjsKK307CisKK3N0cnVjdCBtaXRlX2NoYW5uZWwgeworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZTsKKwl1bnNpZ25lZCBjaGFubmVsOworCWludCBkaXI7CisJaW50IGRvbmU7CisJc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZzsKK307CisKK3N0cnVjdCBtaXRlX3N0cnVjdCB7CisJc3RydWN0IG1pdGVfc3RydWN0ICpuZXh0OworCWludCB1c2VkOworCisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwlyZXNvdXJjZV9zaXplX3QgbWl0ZV9waHlzX2FkZHI7CisJdm9pZCAqbWl0ZV9pb19hZGRyOworCXJlc291cmNlX3NpemVfdCBkYXFfcGh5c19hZGRyOworCXZvaWQgKmRhcV9pb19hZGRyOworCisJc3RydWN0IG1pdGVfY2hhbm5lbCBjaGFubmVsc1tNQVhfTUlURV9ETUFfQ0hBTk5FTFNdOworCXNob3J0IGNoYW5uZWxfYWxsb2NhdGVkW01BWF9NSVRFX0RNQV9DSEFOTkVMU107CisJaW50IG51bV9jaGFubmVsczsKKwl1bnNpZ25lZCBmaWZvX3NpemU7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICptaXRlX2FsbG9jX3Jpbmcoc3RydWN0CisJbWl0ZV9zdHJ1Y3QgKm1pdGUpCit7CisJc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZyA9CisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmluZyA9PSBOVUxMKQorCQlyZXR1cm4gcmluZzsKKwlyaW5nLT5od19kZXYgPSBnZXRfZGV2aWNlKCZtaXRlLT5wY2lkZXYtPmRldik7CisJaWYgKHJpbmctPmh3X2RldiA9PSBOVUxMKSB7CisJCWtmcmVlKHJpbmcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmluZy0+bl9saW5rcyA9IDA7CisJcmluZy0+ZGVzY3JpcHRvcnMgPSBOVUxMOworCXJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyID0gMDsKKwlyZXR1cm4gcmluZzsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaXRlX2ZyZWVfcmluZyhzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nKQoreworCWlmIChyaW5nKSB7CisJCWlmIChyaW5nLT5kZXNjcmlwdG9ycykgeworCQkJZG1hX2ZyZWVfY29oZXJlbnQocmluZy0+aHdfZGV2LAorCQkJCXJpbmctPm5fbGlua3MgKgorCQkJCXNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciksCisJCQkJcmluZy0+ZGVzY3JpcHRvcnMsIHJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyKTsKKwkJfQorCQlwdXRfZGV2aWNlKHJpbmctPmh3X2Rldik7CisJCWtmcmVlKHJpbmcpOworCX0KK307CisKK2V4dGVybiBzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGVfZGV2aWNlczsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWl0ZV9pcnEoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKQoreworCXJldHVybiBtaXRlLT5wY2lkZXYtPmlycTsKK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtaXRlX2RldmljZV9pZChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpCit7CisJcmV0dXJuIG1pdGUtPnBjaWRldi0+ZGV2aWNlOworfTsKKwordm9pZCBtaXRlX2luaXQodm9pZCk7Cit2b2lkIG1pdGVfY2xlYW51cCh2b2lkKTsKK2ludCBtaXRlX3NldHVwKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSk7CitpbnQgbWl0ZV9zZXR1cDIoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCB1bnNpZ25lZCB1c2VfaW9kd2Jzcl8xKTsKK3ZvaWQgbWl0ZV91bnNldHVwKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSk7Cit2b2lkIG1pdGVfbGlzdF9kZXZpY2VzKHZvaWQpOworc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9yZXF1ZXN0X2NoYW5uZWxfaW5fcmFuZ2Uoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLAorCXN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcsIHVuc2lnbmVkIG1pbl9jaGFubmVsLAorCXVuc2lnbmVkIG1heF9jaGFubmVsKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9yZXF1ZXN0X2NoYW5uZWwoc3RydWN0IG1pdGVfc3RydWN0CisJKm1pdGUsIHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcpCit7CisJcmV0dXJuIG1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKG1pdGUsIHJpbmcsIDAsCisJCW1pdGUtPm51bV9jaGFubmVscyAtIDEpOworfQordm9pZCBtaXRlX3JlbGVhc2VfY2hhbm5lbChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOworCit1bnNpZ25lZCBtaXRlX2RtYV90Y3Ioc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK3ZvaWQgbWl0ZV9kbWFfYXJtKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7Cit2b2lkIG1pdGVfZG1hX2Rpc2FybShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOworaW50IG1pdGVfc3luY19pbnB1dF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLCBjb21lZGlfYXN5bmMgKiBhc3luYyk7CitpbnQgbWl0ZV9zeW5jX291dHB1dF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLCBjb21lZGlfYXN5bmMgKiBhc3luYyk7Cit1MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordTMyIG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK3UzMiBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfbGIoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK3UzMiBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfdWIoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK3UzMiBtaXRlX2J5dGVzX2luX3RyYW5zaXQoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK3Vuc2lnbmVkIG1pdGVfZ2V0X3N0YXR1cyhzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOworaW50IG1pdGVfZG9uZShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOworCisjaWYgMAordW5zaWduZWQgbG9uZyBtaXRlX2xsX2Zyb21fa3ZtZW0oc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCBjb21lZGlfYXN5bmMgKiBhc3luYywKKwlpbnQgbGVuKTsKK3ZvaWQgbWl0ZV9zZXRyZWdzKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgdW5zaWduZWQgbG9uZyBsbF9zdGFydCwgaW50IGNoYW4sCisJaW50IGRpcik7CisjZW5kaWYKKwordm9pZCBtaXRlX3ByZXBfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwKKwl1bnNpZ25lZCBpbnQgbnVtX2RldmljZV9iaXRzLCB1bnNpZ25lZCBpbnQgbnVtX21lbW9yeV9iaXRzKTsKK2ludCBtaXRlX2J1Zl9jaGFuZ2Uoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZywKKwljb21lZGlfYXN5bmMgKiBhc3luYyk7CisKKyNpZmRlZiBERUJVR19NSVRFCit2b2lkIG1pdGVfcHJpbnRfY2hzcih1bnNpZ25lZCBpbnQgY2hzcik7Cit2b2lkIG1pdGVfZHVtcF9yZWdzKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgQ0hBTl9PRkZTRVQoaW50IGNoYW5uZWwpCit7CisJcmV0dXJuIDB4NTAwICsgMHgxMDAgKiBjaGFubmVsOworfTsKKworZW51bSBtaXRlX3JlZ2lzdGVycyB7CisJLyogVGhlIGJpdHMgMHg5MDE4MDcwMCBpbiBNSVRFX1VOS05PV05fRE1BX0JVUlNUX1JFRyBjYW4gYmUKKwkgICB3cml0dGVuIGFuZCByZWFkIGJhY2suICBUaGUgYml0cyAweDFmIGFsd2F5cyByZWFkIGFzIDEuCisJICAgVGhlIHJlc3QgYWx3YXlzIHJlYWQgYXMgemVyby4gKi8KKwlNSVRFX1VOS05PV05fRE1BX0JVUlNUX1JFRyA9IDB4MjgsCisJTUlURV9JT0RXQlNSID0gMHhjMCwJLy9JTyBEZXZpY2UgV2luZG93IEJhc2UgU2l6ZSBSZWdpc3RlcgorCU1JVEVfSU9EV0JTUl8xID0gMHhjNCwJLy8gSU8gRGV2aWNlIFdpbmRvdyBCYXNlIFNpemUgUmVnaXN0ZXIgMQorCU1JVEVfSU9EV0NSXzEgPSAweGY0LAorCU1JVEVfUENJX0NPTkZJR19PRkZTRVQgPSAweDMwMCwKKwlNSVRFX0NTSUdSID0gMHg0NjAJLy9jaGlwIHNpZ25hdHVyZQorfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfQ0hPUihpbnQgY2hhbm5lbCkJLy8gY2hhbm5lbCBvcGVyYXRpb24KK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9DSENSKGludCBjaGFubmVsKQkvLyBjaGFubmVsIGNvbnRyb2wKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDQ7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9UQ1IoaW50IGNoYW5uZWwpCS8vIHRyYW5zZmVyIGNvdW50Cit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHg4OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfTUNSKGludCBjaGFubmVsKQkvLyBtZW1vcnkgY29uZmlndXJhdGlvbgoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4YzsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX01BUihpbnQgY2hhbm5lbCkJLy8gbWVtb3J5IGFkZHJlc3MKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDEwOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfRENSKGludCBjaGFubmVsKQkvLyBkZXZpY2UgY29uZmlndXJhdGlvbgoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MTQ7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9EQVIoaW50IGNoYW5uZWwpCS8vIGRldmljZSBhZGRyZXNzCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgxODsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0xLQ1IoaW50IGNoYW5uZWwpCS8vIGxpbmsgY29uZmlndXJhdGlvbgoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MWM7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9MS0FSKGludCBjaGFubmVsKQkvLyBsaW5rIGFkZHJlc3MKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDIwOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfTExLQVIoaW50IGNoYW5uZWwpCS8vIHNlZSBtaXRlIHNlY3Rpb24gb2YgdG50NTAwMiBtYW51YWwKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDI0OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfQkFSKGludCBjaGFubmVsKQkvLyBiYXNlIGFkZHJlc3MKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDI4OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfQkNSKGludCBjaGFubmVsKQkvLyBiYXNlIGNvdW50Cit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgyYzsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX1NBUihpbnQgY2hhbm5lbCkJLy8gPyBhZGRyZXNzCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgzMDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX1dTQ1IoaW50IGNoYW5uZWwpCS8vID8KK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDM0OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfV1NFUihpbnQgY2hhbm5lbCkJLy8gPworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4Mzg7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9DSFNSKGludCBjaGFubmVsKQkvLyBjaGFubmVsIHN0YXR1cworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4M2M7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9GQ1IoaW50IGNoYW5uZWwpCS8vIGZpZm8gY291bnQKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDQwOworfTsKKworZW51bSBNSVRFX0lPRFdCU1JfYml0cyB7CisJV0VOQUIgPSAweDgwLAkJLy8gd2luZG93IGVuYWJsZQorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBNSVRFX0lPRFdCU1JfMV9XU0laRV9iaXRzKHVuc2lnbmVkIHNpemUpCit7CisJdW5zaWduZWQgb3JkZXIgPSAwOworCXdoaWxlIChzaXplID4+PSAxKQorCQkrK29yZGVyOworCUJVR19PTihvcmRlciA8IDEpOworCXJldHVybiAob3JkZXIgLSAxKSAmIDB4MWY7Cit9CisKK2VudW0gTUlURV9VTktOT1dOX0RNQV9CVVJTVF9iaXRzIHsKKwlVTktOT1dOX0RNQV9CVVJTVF9FTkFCTEVfQklUUyA9IDB4NjAwCit9OworCitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX3ZlcnNpb24odTMyIGNzaWdyX2JpdHMpCit7CisJcmV0dXJuIGNzaWdyX2JpdHMgJiAweGY7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl90eXBlKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyBvcmlnaW5hbCBtaXRlID0gMCwgbWluaW1pdGUgPSAxCisJcmV0dXJuIChjc2lncl9iaXRzID4+IDQpICYgMHhmOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3JfbW1vZGUodTMyIGNzaWdyX2JpdHMpCit7CQkJCS8vIG1pdGUgbW9kZSwgbWluaW1pdGUgPSAxCisJcmV0dXJuIChjc2lncl9iaXRzID4+IDgpICYgMHgzOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3JfaW1vZGUodTMyIGNzaWdyX2JpdHMpCit7CQkJCS8vIGNwdSBwb3J0IGludGVyZmFjZSBtb2RlLCBwY2kgPSAweDMKKwlyZXR1cm4gKGNzaWdyX2JpdHMgPj4gMTIpICYgMHgzOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3JfZG1hYyh1MzIgY3NpZ3JfYml0cykKK3sJCQkJLy8gbnVtYmVyIG9mIGRtYSBjaGFubmVscworCXJldHVybiAoY3NpZ3JfYml0cyA+PiAxNikgJiAweGY7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl93cGRlcCh1MzIgY3NpZ3JfYml0cykKK3sJCQkJLy8gd3JpdGUgcG9zdCBmaWZvIGRlcHRoCisJdW5zaWduZWQgaW50IHdwZGVwX2JpdHMgPSAoY3NpZ3JfYml0cyA+PiAyMCkgJiAweDc7CisJaWYgKHdwZGVwX2JpdHMgPT0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMSA8PCAod3BkZXBfYml0cyAtIDEpOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3Jfd2lucyh1MzIgY3NpZ3JfYml0cykKK3sKKwlyZXR1cm4gKGNzaWdyX2JpdHMgPj4gMjQpICYgMHgxZjsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX2lvd2lucyh1MzIgY3NpZ3JfYml0cykKK3sJCQkJLy8gbnVtYmVyIG9mIGlvIHdpbmRvd3MKKwlyZXR1cm4gKGNzaWdyX2JpdHMgPj4gMjkpICYgMHg3OworfTsKKworZW51bSBNSVRFX01DUl9iaXRzIHsKKwlNQ1JQT04gPSAwLAorfTsKKworZW51bSBNSVRFX0RDUl9iaXRzIHsKKwlEQ1JfTk9STUFMID0gKDEgPDwgMjkpLAorCURDUlBPTiA9IDAsCit9OworCitlbnVtIE1JVEVfQ0hPUl9iaXRzIHsKKwlDSE9SX0RNQVJFU0VUID0gKDEgPDwgMzEpLAorCUNIT1JfU0VUX1NFTkRfVEMgPSAoMSA8PCAxMSksCisJQ0hPUl9DTFJfU0VORF9UQyA9ICgxIDw8IDEwKSwKKwlDSE9SX1NFVF9MUEFVU0UgPSAoMSA8PCA5KSwKKwlDSE9SX0NMUl9MUEFVU0UgPSAoMSA8PCA4KSwKKwlDSE9SX0NMUkRPTkUgPSAoMSA8PCA3KSwKKwlDSE9SX0NMUlJCID0gKDEgPDwgNiksCisJQ0hPUl9DTFJMQyA9ICgxIDw8IDUpLAorCUNIT1JfRlJFU0VUID0gKDEgPDwgNCksCisJQ0hPUl9BQk9SVCA9ICgxIDw8IDMpLAkvKiBzdG9wIHdpdGhvdXQgZW1wdHlpbmcgZmlmbyAqLworCUNIT1JfU1RPUCA9ICgxIDw8IDIpLAkvKiBzdG9wIGFmdGVyIGVtcHR5aW5nIGZpZm8gKi8KKwlDSE9SX0NPTlQgPSAoMSA8PCAxKSwKKwlDSE9SX1NUQVJUID0gKDEgPDwgMCksCisJQ0hPUl9QT04gPSAoQ0hPUl9DTFJfU0VORF9UQyB8IENIT1JfQ0xSX0xQQVVTRSksCit9OworCitlbnVtIE1JVEVfQ0hDUl9iaXRzIHsKKwlDSENSX1NFVF9ETUFfSUUgPSAoMSA8PCAzMSksCisJQ0hDUl9DTFJfRE1BX0lFID0gKDEgPDwgMzApLAorCUNIQ1JfU0VUX0xJTktQX0lFID0gKDEgPDwgMjkpLAorCUNIQ1JfQ0xSX0xJTktQX0lFID0gKDEgPDwgMjgpLAorCUNIQ1JfU0VUX1NBUl9JRSA9ICgxIDw8IDI3KSwKKwlDSENSX0NMUl9TQVJfSUUgPSAoMSA8PCAyNiksCisJQ0hDUl9TRVRfRE9ORV9JRSA9ICgxIDw8IDI1KSwKKwlDSENSX0NMUl9ET05FX0lFID0gKDEgPDwgMjQpLAorCUNIQ1JfU0VUX01SRFlfSUUgPSAoMSA8PCAyMyksCisJQ0hDUl9DTFJfTVJEWV9JRSA9ICgxIDw8IDIyKSwKKwlDSENSX1NFVF9EUkRZX0lFID0gKDEgPDwgMjEpLAorCUNIQ1JfQ0xSX0RSRFlfSUUgPSAoMSA8PCAyMCksCisJQ0hDUl9TRVRfTENfSUUgPSAoMSA8PCAxOSksCisJQ0hDUl9DTFJfTENfSUUgPSAoMSA8PCAxOCksCisJQ0hDUl9TRVRfQ09OVF9SQl9JRSA9ICgxIDw8IDE3KSwKKwlDSENSX0NMUl9DT05UX1JCX0lFID0gKDEgPDwgMTYpLAorCUNIQ1JfRklGT0RJUyA9ICgxIDw8IDE1KSwKKwlDSENSX0ZJRk9fT04gPSAwLAorCUNIQ1JfQlVSU1RFTiA9ICgxIDw8IDE0KSwKKwlDSENSX05PX0JVUlNURU4gPSAwLAorCUNIQ1JfQllURV9TV0FQX0RFVklDRSA9ICgxIDw8IDYpLAorCUNIQ1JfQllURV9TV0FQX01FTU9SWSA9ICgxIDw8IDQpLAorCUNIQ1JfRElSID0gKDEgPDwgMyksCisJQ0hDUl9ERVZfVE9fTUVNID0gQ0hDUl9ESVIsCisJQ0hDUl9NRU1fVE9fREVWID0gMCwKKwlDSENSX05PUk1BTCA9ICgwIDw8IDApLAorCUNIQ1JfQ09OVElOVUUgPSAoMSA8PCAwKSwKKwlDSENSX1JJTkdCVUZGID0gKDIgPDwgMCksCisJQ0hDUl9MSU5LU0hPUlQgPSAoNCA8PCAwKSwKKwlDSENSX0xJTktMT05HID0gKDUgPDwgMCksCisJQ0hDUlBPTiA9CisJCShDSENSX0NMUl9ETUFfSUUgfCBDSENSX0NMUl9MSU5LUF9JRSB8IENIQ1JfQ0xSX1NBUl9JRSB8CisJCUNIQ1JfQ0xSX0RPTkVfSUUgfCBDSENSX0NMUl9NUkRZX0lFIHwgQ0hDUl9DTFJfRFJEWV9JRSB8CisJCUNIQ1JfQ0xSX0xDX0lFIHwgQ0hDUl9DTFJfQ09OVF9SQl9JRSksCit9OworCitlbnVtIENvbmZpZ1JlZ2lzdGVyX2JpdHMgeworCUNSX1JFUVNfTUFTSyA9IDB4NyA8PCAxNiwKKwlDUl9BU0VRRE9OVCA9IDB4MCA8PCAxMCwKKwlDUl9BU0VRVVAgPSAweDEgPDwgMTAsCisJQ1JfQVNFUURPV04gPSAweDIgPDwgMTAsCisJQ1JfQVNFUV9NQVNLID0gMHgzIDw8IDEwLAorCUNSX1BTSVpFOCA9ICgxIDw8IDgpLAorCUNSX1BTSVpFMTYgPSAoMiA8PCA4KSwKKwlDUl9QU0laRTMyID0gKDMgPDwgOCksCisJQ1JfUE9SVENQVSA9ICgwIDw8IDYpLAorCUNSX1BPUlRJTyA9ICgxIDw8IDYpLAorCUNSX1BPUlRWWEkgPSAoMiA8PCA2KSwKKwlDUl9QT1JUTVhJID0gKDMgPDwgNiksCisJQ1JfQU1ERVZJQ0UgPSAoMSA8PCAwKSwKK307CitzdGF0aWMgaW5saW5lIGludCBDUl9SRVFTKGludCBzb3VyY2UpCit7CisJcmV0dXJuIChzb3VyY2UgJiAweDcpIDw8IDE2OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IENSX1JFUVNEUlEodW5zaWduZWQgZHJxX2xpbmUpCit7CisJLyogVGhpcyBhbHNvIHdvcmtzIG9uIG0tc2VyaWVzIHdoZW4KKwkgICB1c2luZyBjaGFubmVscyAoZHJxX2xpbmUpIDQgb3IgNS4gKi8KKwlyZXR1cm4gQ1JfUkVRUygoZHJxX2xpbmUgJiAweDMpIHwgMHg0KTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IENSX1JMKHVuc2lnbmVkIGludCByZXRyeV9saW1pdCkKK3sKKwlpbnQgdmFsdWUgPSAwOworCisJd2hpbGUgKHJldHJ5X2xpbWl0KSB7CisJCXJldHJ5X2xpbWl0ID4+PSAxOworCQl2YWx1ZSsrOworCX0KKwlpZiAodmFsdWUgPiAweDcpCisJCXJ0X3ByaW50aygiY29tZWRpOiBidWchIHJldHJ5X2xpbWl0IHRvbyBsYXJnZVxuIik7CisJcmV0dXJuICh2YWx1ZSAmIDB4NykgPDwgMjE7Cit9CisKK2VudW0gQ0hTUl9iaXRzIHsKKwlDSFNSX0lOVCA9ICgxIDw8IDMxKSwKKwlDSFNSX0xQQVVTRVMgPSAoMSA8PCAyOSksCisJQ0hTUl9TQVJTID0gKDEgPDwgMjcpLAorCUNIU1JfRE9ORSA9ICgxIDw8IDI1KSwKKwlDSFNSX01SRFkgPSAoMSA8PCAyMyksCisJQ0hTUl9EUkRZID0gKDEgPDwgMjEpLAorCUNIU1JfTElOS0MgPSAoMSA8PCAxOSksCisJQ0hTUl9DT05UU19SQiA9ICgxIDw8IDE3KSwKKwlDSFNSX0VSUk9SID0gKDEgPDwgMTUpLAorCUNIU1JfU0FCT1JUID0gKDEgPDwgMTQpLAorCUNIU1JfSEFCT1JUID0gKDEgPDwgMTMpLAorCUNIU1JfU1RPUFMgPSAoMSA8PCAxMiksCisJQ0hTUl9PUEVSUl9tYXNrID0gKDMgPDwgMTApLAorCUNIU1JfT1BFUlJfTk9FUlJPUiA9ICgwIDw8IDEwKSwKKwlDSFNSX09QRVJSX0ZJRk9FUlJPUiA9ICgxIDw8IDEwKSwKKwlDSFNSX09QRVJSX0xJTktFUlJPUiA9ICgxIDw8IDEwKSwJLyogPz8/ICovCisJQ0hTUl9YRkVSUiA9ICgxIDw8IDkpLAorCUNIU1JfRU5EID0gKDEgPDwgOCksCisJQ0hTUl9EUlExID0gKDEgPDwgNyksCisJQ0hTUl9EUlEwID0gKDEgPDwgNiksCisJQ0hTUl9MeEVSUl9tYXNrID0gKDMgPDwgNCksCisJQ0hTUl9MQkVSUiA9ICgxIDw8IDQpLAorCUNIU1JfTFJFUlIgPSAoMiA8PCA0KSwKKwlDSFNSX0xPRVJSID0gKDMgPDwgNCksCisJQ0hTUl9NeEVSUl9tYXNrID0gKDMgPDwgMiksCisJQ0hTUl9NQkVSUiA9ICgxIDw8IDIpLAorCUNIU1JfTVJFUlIgPSAoMiA8PCAyKSwKKwlDSFNSX01PRVJSID0gKDMgPDwgMiksCisJQ0hTUl9EeEVSUl9tYXNrID0gKDMgPDwgMCksCisJQ0hTUl9EQkVSUiA9ICgxIDw8IDApLAorCUNIU1JfRFJFUlIgPSAoMiA8PCAwKSwKKwlDSFNSX0RPRVJSID0gKDMgPDwgMCksCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbWl0ZV9kbWFfcmVzZXQoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXdyaXRlbChDSE9SX0RNQVJFU0VUIHwgQ0hPUl9GUkVTRVQsCisJCW1pdGVfY2hhbi0+bWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWExYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaApAQCAtMCwwICsxLDQyOSBAQAorLyogcGx4OTA4MC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIEkgbW9kaWZpZWQgdGhpcyBmaWxlIGZyb20gdGhlIHBseDkwNjAuaCBoZWFkZXIgZm9yIHRoZQorICogd2FuWEwgZGV2aWNlIGRyaXZlciBpbiB0aGUgbGludXgga2VybmVsLAorICogZm9yIHRoZSByZWdpc3RlciBvZmZzZXRzIGFuZCBiaXQgZGVmaW5pdGlvbnMuICBNYWRlIG1pbm9yIG1vZGlmaWNhdGlvbnMsCisgKiBhZGRlZCBwbHg5MDgwIHJlZ2lzdGVycyBhbmQKKyAqIHN0cmlwcGVkIG91dCBzdHVmZiB0aGF0IHdhcyBzcGVjaWZpY2FsbHkgZm9yIHRoZSB3YW5YTCBkcml2ZXIuCisgKiBOb3RlOiBJJ3ZlIG9ubHkgbWFkZSBzdXJlIHRoZSBkZWZpbml0aW9ucyBhcmUgY29ycmVjdCBhcyBmYXIKKyAqIGFzIEkgbWFrZSB1c2Ugb2YgdGhlbS4gIFRoZXJlIGFyZSBzdGlsbCB2YXJpb3VzIHBseDkwNjAtaXNtcworICogbGVmdCBpbiB0aGlzIGhlYWRlciBmaWxlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBSRyBTdHVkaW8gcy5jLiwgaHR0cDovL3d3dy5yZ3N0dWRpby5jb20ucGwvCisgKiBXcml0dGVuIGJ5IEtyenlzenRvZiBIYWxhc2EgPGtoY0ByZ3N0dWRpby5jb20ucGw+CisgKgorICogUG9ydGlvbnMgKEMpIFNCRSBJbmMuLCB1c2VkIGJ5IHBlcm1pc3Npb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQ09NRURJX1BMWDkwODBfSAorI2RlZmluZSBfX0NPTUVESV9QTFg5MDgwX0gKKworLy8gZGVzY3JpcHRvciBibG9jayB1c2VkIGZvciBjaGFpbmVkIGRtYSB0cmFuc2ZlcnMKK3N0cnVjdCBwbHhfZG1hX2Rlc2MgeworCXZvbGF0aWxlIHVpbnQzMl90IHBjaV9zdGFydF9hZGRyOworCXZvbGF0aWxlIHVpbnQzMl90IGxvY2FsX3N0YXJ0X2FkZHI7CisJLyogdHJhbnNmZXJfc2l6ZSBpcyBpbiBieXRlcywgb25seSBmaXJzdCAyMyBiaXRzIG9mIHJlZ2lzdGVyIGFyZSB1c2VkICovCisJdm9sYXRpbGUgdWludDMyX3QgdHJhbnNmZXJfc2l6ZTsKKwkvKiBhZGRyZXNzIG9mIG5leHQgZGVzY3JpcHRvciAocXVhZCB3b3JkIGFsaWduZWQpLCBwbHVzIHNvbWUKKwkgKiBhZGRpdGlvbmFsIGJpdHMgKHNlZSBQTFhfRE1BMF9ERVNDUklQVE9SX1JFRykgKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBuZXh0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICAgICAgICAgICAgUmVnaXN0ZXIgT2Zmc2V0cyBhbmQgQml0IERlZmluaXRpb25zCisqKgorKiogTm90ZTogQWxsIG9mZnNldHMgemVybyByZWxhdGl2ZS4gIElFLiBTb21lIHN0YW5kYXJkIGJhc2UgYWRkcmVzcworKiogbXVzdCBiZSBhZGRlZCB0byB0aGUgUmVnaXN0ZXIgTnVtYmVyIHRvIHByb3Blcmx5IGFjY2VzcyB0aGUgcmVnaXN0ZXIuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQTFhfTEFTMFJOR19SRUcgICAgICAgICAweDAwMDAJLyogTCwgTG9jYWwgQWRkciBTcGFjZSAwIFJhbmdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBMWF9MQVMxUk5HX1JFRyAgICAgICAgIDB4MDBmMAkvKiBMLCBMb2NhbCBBZGRyIFNwYWNlIDEgUmFuZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIExSTkdfSU8gICAgICAgICAgIDB4MDAwMDAwMDEJLyogTWFwIHRvOiAxPUkvTywgMD1NZW0gKi8KKyNkZWZpbmUgIExSTkdfQU5ZMzIgICAgICAgIDB4MDAwMDAwMDAJLyogTG9jYXRlIGFueXdoZXJlIGluIDMyIGJpdCAqLworI2RlZmluZSAgTFJOR19MVDFNQiAgICAgICAgMHgwMDAwMDAwMgkvKiBMb2NhdGUgaW4gMXN0IG1lZyAqLworI2RlZmluZSAgTFJOR19BTlk2NCAgICAgICAgMHgwMDAwMDAwNAkvKiBMb2NhdGUgYW55d2hlcmUgaW4gNjQgYml0ICovCisjZGVmaW5lICBMUk5HX01FTV9NQVNLICAgICAweGZmZmZmZmYwCS8vIGJpdHMgdGhhdCBzcGVjaWZ5IHJhbmdlIGZvciBtZW1vcnkgaW8KKyNkZWZpbmUgIExSTkdfSU9fTUFTSyAgICAgMHhmZmZmZmZmYQkvLyBiaXRzIHRoYXQgc3BlY2lmeSByYW5nZSBmb3Igbm9ybWFsIGlvCisKKyNkZWZpbmUgUExYX0xBUzBNQVBfUkVHICAgICAgICAgMHgwMDA0CS8qIEwsIExvY2FsIEFkZHIgU3BhY2UgMCBSZW1hcCBSZWdpc3RlciAqLworI2RlZmluZSBQTFhfTEFTMU1BUF9SRUcgICAgICAgICAweDAwZjQJLyogTCwgTG9jYWwgQWRkciBTcGFjZSAxIFJlbWFwIFJlZ2lzdGVyICovCisjZGVmaW5lICBMTUFQX0VOICAgICAgICAgICAweDAwMDAwMDAxCS8qIEVuYWJsZSBzbGF2ZSBkZWNvZGUgKi8KKyNkZWZpbmUgIExNQVBfTUVNX01BU0sgICAgIDB4ZmZmZmZmZjAJLy8gYml0cyB0aGF0IHNwZWNpZnkgZGVjb2RlIGZvciBtZW1vcnkgaW8KKyNkZWZpbmUgIExNQVBfSU9fTUFTSyAgICAgMHhmZmZmZmZmYQkvLyBiaXRzIHRoYXQgc3BlY2lmeSBkZWNvZGUgYml0cyBmb3Igbm9ybWFsIGlvCisKKy8qIE1vZGUvQXJiaXRyYXRpb24gUmVnaXN0ZXIuCisqLworI2RlZmluZSBQTFhfTUFSQl9SRUcgICAgICAgICAweDgJLyogTCwgTG9jYWwgQXJiaXRyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUExYX0RNQUFSQl9SRUcgICAgICAweGFjCitlbnVtIG1hcmJfYml0cyB7CisJTUFSQl9MTFRfTUFTSyA9IDB4MDAwMDAwZmYsCS8qIExvY2FsIEJ1cyBMYXRlbmN5IFRpbWVyICovCisJTUFSQl9MUFRfTUFTSyA9IDB4MDAwMGZmMDAsCS8qIExvY2FsIEJ1cyBQYXVzZSBUaW1lciAqLworCU1BUkJfTFRFTiA9IDB4MDAwMTAwMDAsCS8qIExhdGVuY3kgVGltZXIgRW5hYmxlICovCisJTUFSQl9MUEVOID0gMHgwMDAyMDAwMCwJLyogUGF1c2UgVGltZXIgRW5hYmxlICovCisJTUFSQl9CUkVRID0gMHgwMDA0MDAwMCwJLyogTG9jYWwgQnVzIEJSRVEgRW5hYmxlICovCisJTUFSQl9ETUFfUFJJT1JJVFlfTUFTSyA9IDB4MDAxODAwMDAsCisJTUFSQl9MQkRTX0dJVkVfVVBfQlVTX01PREUgPSAweDAwMjAwMDAwLAkvKiBsb2NhbCBidXMgZGlyZWN0IHNsYXZlIGdpdmUgdXAgYnVzIG1vZGUgKi8KKwlNQVJCX0RTX0xMT0NLX0VOQUJMRSA9IDB4MDA0MDAwMDAsCS8qIGRpcmVjdCBzbGF2ZSBMTE9DS28jIGVuYWJsZSAqLworCU1BUkJfUENJX1JFUVVFU1RfTU9ERSA9IDB4MDA4MDAwMDAsCisJTUFSQl9QQ0l2MjFfTU9ERSA9IDB4MDEwMDAwMDAsCS8qIHBjaSBzcGVjaWZpY2F0aW9uIHYyLjEgbW9kZSAqLworCU1BUkJfUENJX1JFQURfTk9fV1JJVEVfTU9ERSA9IDB4MDIwMDAwMDAsCisJTUFSQl9QQ0lfUkVBRF9XSVRIX1dSSVRFX0ZMVVNIX01PREUgPSAweDA0MDAwMDAwLAorCU1BUkJfR0FURV9USU1FUl9XSVRIX0JSRVEgPSAweDA4MDAwMDAwLAkvKiBnYXRlIGxvY2FsIGJ1cyBsYXRlbmN5IHRpbWVyIHdpdGggQlJFUSAqLworCU1BUkJfUENJX1JFQURfTk9fRkxVU0hfTU9ERSA9IDB4MTAwMDAwMDAsCisJTUFSQl9VU0VfU1VCU1lTVEVNX0lEUyA9IDB4MjAwMDAwMDAsCit9OworCisjZGVmaW5lIFBMWF9CSUdFTkRfUkVHIDB4YworZW51bSBiaWdlbmRfYml0cyB7CisJQklHRU5EX0NPTkZJRyA9IDB4MSwJLyogdXNlIGJpZyBlbmRpYW4gb3JkZXJpbmcgZm9yIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYWNjZXNzZXMgKi8KKwlCSUdFTkRfRElSRUNUX01BU1RFUiA9IDB4MiwKKwlCSUdFTkRfRElSRUNUX1NMQVZFX0xPQ0FMMCA9IDB4NCwKKwlCSUdFTkRfUk9NID0gMHg4LAorCUJJR0VORF9CWVRFX0xBTkUgPSAweDEwLAkvKiB1c2UgYnl0ZSBsYW5lIGNvbnNpc3Rpbmcgb2YgbW9zdCBzaWduaWZpY2FudCBiaXRzIGluc3RlYWQgb2YgbGVhc3Qgc2lnbmlmaWNhbnQgKi8KKwlCSUdFTkRfRElSRUNUX1NMQVZFX0xPQ0FMMSA9IDB4MjAsCisJQklHRU5EX0RNQTEgPSAweDQwLAorCUJJR0VORF9ETUEwID0gMHg4MCwKK307CisKKy8qIE5vdGU6IFRoZSBFeHBhbnNpb24gUk9NICBzdHVmZiBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZSBQQyBlbnZpcm9ubWVudC4KKyoqICAgICAgIFRoaXMgZXhwYW5zaW9uIFJPTSBjb2RlIGlzIGV4ZWN1dGVkIGJ5IHRoZSBob3N0IENQVSBhdCBib290IHRpbWUuCisqKiAgICAgICBGb3IgdGhpcyByZWFzb24gbm8gYml0IGRlZmluaXRpb25zIGFyZSBwcm92aWRlZCBoZXJlLgorKi8KKyNkZWZpbmUgUExYX1JPTVJOR19SRUcgICAgICAgICAweDAwMTAJLyogTCwgRXhwbiBST00gU3BhY2UgUmFuZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUExYX1JPTU1BUF9SRUcgICAgICAgICAweDAwMTQJLyogTCwgTG9jYWwgQWRkciBTcGFjZSBSYW5nZSBSZWdpc3RlciAqLworCisjZGVmaW5lIFBMWF9SRUdJT04wX1JFRyAgICAgICAgIDB4MDAxOAkvKiBMLCBMb2NhbCBCdXMgUmVnaW9uIDAgRGVzY3JpcHRvciAqLworI2RlZmluZSAgUkdOX1dJRFRIICAgICAgICAgMHgwMDAwMDAwMgkvKiBMb2NhbCBidXMgd2lkdGggYml0cyAqLworI2RlZmluZSAgUkdOXzhCSVRTICAgICAgICAgMHgwMDAwMDAwMAkvKiAwOCBiaXQgTG9jYWwgQnVzICovCisjZGVmaW5lICBSR05fMTZCSVRTICAgICAgICAweDAwMDAwMDAxCS8qIDE2IGJpdCBMb2NhbCBCdXMgKi8KKyNkZWZpbmUgIFJHTl8zMkJJVFMgICAgICAgIDB4MDAwMDAwMDIJLyogMzIgYml0IExvY2FsIEJ1cyAqLworI2RlZmluZSAgUkdOX01XUyAgICAgICAgICAgMHgwMDAwMDAzQwkvKiBNZW1vcnkgQWNjZXNzIFdhaXQgU3RhdGVzICovCisjZGVmaW5lICBSR05fME1XUyAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lICBSR05fMU1XUyAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lICBSR05fMk1XUyAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lICBSR05fM01XUyAgICAgICAgICAweDAwMDAwMDBDCisjZGVmaW5lICBSR05fNE1XUyAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lICBSR05fNk1XUyAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lICBSR05fOE1XUyAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lICBSR05fTVJFICAgICAgICAgICAweDAwMDAwMDQwCS8qIE1lbW9yeSBTcGFjZSBSZWFkeSBJbnB1dCBFbmFibGUgKi8KKyNkZWZpbmUgIFJHTl9NQkUgICAgICAgICAgIDB4MDAwMDAwODAJLyogTWVtb3J5IFNwYWNlIEJ0ZXJtIElucHV0IEVuYWJsZSAqLworI2RlZmluZSAgUkdOX1JFQURfUFJFRkVUQ0hfRElTQUJMRSAweDAwMDAwMTAwCisjZGVmaW5lICBSR05fUk9NX1BSRUZFVENIX0RJU0FCTEUgMHgwMDAwMDIwMAorI2RlZmluZSAgUkdOX1JFQURfUFJFRkVUQ0hfQ09VTlRfRU5BQkxFIDB4MDAwMDA0MDAKKyNkZWZpbmUgIFJHTl9SV1MgICAgICAgICAgIDB4MDAzQzAwMDAJLyogRXhwbiBST00gV2FpdCBTdGF0ZXMgKi8KKyNkZWZpbmUgIFJHTl9SUkUgICAgICAgICAgIDB4MDA0MDAwMDAJLyogUk9NIFNwYWNlIFJlYWR5IElucHV0IEVuYWJsZSAqLworI2RlZmluZSAgUkdOX1JCRSAgICAgICAgICAgMHgwMDgwMDAwMAkvKiBST00gU3BhY2UgQnRlcm0gSW5wdXQgRW5hYmxlICovCisjZGVmaW5lICBSR05fTUJFTiAgICAgICAgICAweDAxMDAwMDAwCS8qIE1lbW9yeSBTcGFjZSBCdXJzdCBFbmFibGUgKi8KKyNkZWZpbmUgIFJHTl9SQkVOICAgICAgICAgIDB4MDQwMDAwMDAJLyogUk9NIFNwYWNlIEJ1cnN0IEVuYWJsZSAqLworI2RlZmluZSAgUkdOX1RIUk9UICAgICAgICAgMHgwODAwMDAwMAkvKiBEZS1hc3NlcnQgVFJEWSB3aGVuIEZJRk8gZnVsbCAqLworI2RlZmluZSAgUkdOX1RSRCAgICAgICAgICAgMHhGMDAwMDAwMAkvKiBUYXJnZXQgUmVhZHkgRGVsYXkgLzggKi8KKworI2RlZmluZSBQTFhfUkVHSU9OMV9SRUcgICAgICAgICAweDAwZjgJLyogTCwgTG9jYWwgQnVzIFJlZ2lvbiAxIERlc2NyaXB0b3IgKi8KKworI2RlZmluZSBQTFhfRE1STkdfUkVHICAgICAgICAgIDB4MDAxQwkvKiBMLCBEaXJlY3QgTWFzdGVyIFJhbmdlIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUExYX0xCQVBNRU1fUkVHICAgICAgICAweDAwMjAJLyogTCwgTGNsIEJhc2UgQWRkciBmb3IgUENJIG1lbSBzcGFjZSAqLworCisjZGVmaW5lIFBMWF9MQkFQSU9fUkVHICAgICAgICAgMHgwMDI0CS8qIEwsIExjbCBCYXNlIEFkZHIgZm9yIFBDSSBJL08gc3BhY2UgKi8KKworI2RlZmluZSBQTFhfRE1NQVBfUkVHICAgICAgICAgIDB4MDAyOAkvKiBMLCBEaXJlY3QgTWFzdGVyIFJlbWFwIFJlZ2lzdGVyICovCisjZGVmaW5lICBETU1fTUFFICAgICAgICAgICAweDAwMDAwMDAxCS8qIERpcmVjdCBNc3RyIE1lbW9yeSBBY2MgRW5hYmxlICovCisjZGVmaW5lICBETU1fSUFFICAgICAgICAgICAweDAwMDAwMDAyCS8qIERpcmVjdCBNc3RyIEkvTyBBY2MgRW5hYmxlICovCisjZGVmaW5lICBETU1fTENLICAgICAgICAgICAweDAwMDAwMDA0CS8qIExPQ0sgSW5wdXQgRW5hYmxlICovCisjZGVmaW5lICBETU1fUEY0ICAgICAgICAgICAweDAwMDAwMDA4CS8qIFByZWZldGNoIDQgTW9kZSBFbmFibGUgKi8KKyNkZWZpbmUgIERNTV9USFJPVCAgICAgICAgIDB4MDAwMDAwMTAJLyogQXNzZXJ0IElSRFkgd2hlbiByZWFkIEZJRk8gZnVsbCAqLworI2RlZmluZSAgRE1NX1BBRjAgICAgICAgICAgMHgwMDAwMDAwMAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUYxICAgICAgICAgIDB4MDAwMDAwMjAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGMiAgICAgICAgICAweDAwMDAwMDQwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjMgICAgICAgICAgMHgwMDAwMDA2MAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUY0ICAgICAgICAgIDB4MDAwMDAwODAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGNSAgICAgICAgICAweDAwMDAwMEEwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjYgICAgICAgICAgMHgwMDAwMDBDMAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUY3ICAgICAgICAgIDB4MDAwMDAwRDAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fTUFQICAgICAgICAgICAweEZGRkYwMDAwCS8qIFJlbWFwIEFkZHJlc3MgQml0cyAqLworCisjZGVmaW5lIFBMWF9DQVJfUkVHICAgICAgICAgICAgMHgwMDJDCS8qIEwsIENvbmZpZ3VyYXRpb24gQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSAgQ0FSX0NUMCAgICAgICAgICAgMHgwMDAwMDAwMAkvKiBDb25maWcgVHlwZSAwICovCisjZGVmaW5lICBDQVJfQ1QxICAgICAgICAgICAweDAwMDAwMDAxCS8qIENvbmZpZyBUeXBlIDEgKi8KKyNkZWZpbmUgIENBUl9SRUcgICAgICAgICAgIDB4MDAwMDAwRkMJLyogUmVnaXN0ZXIgTnVtYmVyIEJpdHMgKi8KKyNkZWZpbmUgIENBUl9GVU4gICAgICAgICAgIDB4MDAwMDA3MDAJLyogRnVuY3Rpb24gTnVtYmVyIEJpdHMgKi8KKyNkZWZpbmUgIENBUl9ERVYgICAgICAgICAgIDB4MDAwMEY4MDAJLyogRGV2aWNlIE51bWJlciBCaXRzICovCisjZGVmaW5lICBDQVJfQlVTICAgICAgICAgICAweDAwRkYwMDAwCS8qIEJ1cyBOdW1iZXIgQml0cyAqLworI2RlZmluZSAgQ0FSX0NGRyAgICAgICAgICAgMHg4MDAwMDAwMAkvKiBDb25maWcgU3BjIEFjY2VzcyBFbmFibGUgKi8KKworI2RlZmluZSBQTFhfREJSX0lOX1JFRyAgICAgICAgIDB4MDA2MAkvKiBMLCBQQ0kgdG8gTG9jYWwgRG9vcmJlbGwgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQTFhfREJSX09VVF9SRUcgICAgICAgIDB4MDA2NAkvKiBMLCBMb2NhbCB0byBQQ0kgRG9vcmJlbGwgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQTFhfSU5UUkNTX1JFRyAgICAgICAgIDB4MDA2OAkvKiBMLCBJbnRlcnJ1cHQgQ29udHJvbC9TdGF0dXMgUmVnICovCisjZGVmaW5lICBJQ1NfQUVSUiAgICAgICAgICAweDAwMDAwMDAxCS8qIEFzc2VydCBMU0VSUiBvbiBBQk9SVCAqLworI2RlZmluZSAgSUNTX1BFUlIgICAgICAgICAgMHgwMDAwMDAwMgkvKiBBc3NlcnQgTFNFUlIgb24gUGFyaXR5IEVycm9yICovCisjZGVmaW5lICBJQ1NfU0VSUiAgICAgICAgICAweDAwMDAwMDA0CS8qIEdlbmVyYXRlIFBDSSBTRVJSIyAqLworI2RlZmluZSAgSUNTX01CSUUgICAgICAgICAgMHgwMDAwMDAwOAkvLyBtYWlsYm94IGludGVycnVwdCBlbmFibGUKKyNkZWZpbmUgIElDU19QSUUgICAgICAgICAgIDB4MDAwMDAxMDAJLyogUENJIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19QRElFICAgICAgICAgIDB4MDAwMDAyMDAJLyogUENJIERvb3JiZWxsIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19QQUlFICAgICAgICAgIDB4MDAwMDA0MDAJLyogUENJIEFib3J0IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19QTElFICAgICAgICAgIDB4MDAwMDA4MDAJLyogUENJIExvY2FsIEludCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19SQUUgICAgICAgICAgIDB4MDAwMDEwMDAJLyogUmV0cnkgQWJvcnQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfUERJQSAgICAgICAgICAweDAwMDAyMDAwCS8qIFBDSSBEb29yYmVsbCBJbnRlcnJ1cHQgQWN0aXZlICovCisjZGVmaW5lICBJQ1NfUEFJQSAgICAgICAgICAweDAwMDA0MDAwCS8qIFBDSSBBYm9ydCBJbnRlcnJ1cHQgQWN0aXZlICovCisjZGVmaW5lICBJQ1NfTElBICAgICAgICAgICAweDAwMDA4MDAwCS8qIExvY2FsIEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19MSUUgICAgICAgICAgIDB4MDAwMTAwMDAJLyogTG9jYWwgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX0xESUUgICAgICAgICAgMHgwMDAyMDAwMAkvKiBMb2NhbCBEb29yYmVsbCBJbnQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfRE1BMF9FICAgICAgICAweDAwMDQwMDAwCS8qIERNQSAjMCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfRE1BMV9FICAgICAgICAweDAwMDgwMDAwCS8qIERNQSAjMSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfTERJQSAgICAgICAgICAweDAwMTAwMDAwCS8qIExvY2FsIERvb3JiZWxsIEludCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19ETUEwX0EgICAgICAgIDB4MDAyMDAwMDAJLyogRE1BICMwIEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19ETUExX0EgICAgICAgIDB4MDA0MDAwMDAJLyogRE1BICMxIEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19CSUEgICAgICAgICAgIDB4MDA4MDAwMDAJLyogQklTVCBJbnRlcnJ1cHQgQWN0aXZlICovCisjZGVmaW5lICBJQ1NfVEFfRE0gICAgICAgICAweDAxMDAwMDAwCS8qIFRhcmdldCBBYm9ydCAtIERpcmVjdCBNYXN0ZXIgKi8KKyNkZWZpbmUgIElDU19UQV9ETUEwICAgICAgIDB4MDIwMDAwMDAJLyogVGFyZ2V0IEFib3J0IC0gRE1BICMwICovCisjZGVmaW5lICBJQ1NfVEFfRE1BMSAgICAgICAweDA0MDAwMDAwCS8qIFRhcmdldCBBYm9ydCAtIERNQSAjMSAqLworI2RlZmluZSAgSUNTX1RBX1JBICAgICAgICAgMHgwODAwMDAwMAkvKiBUYXJnZXQgQWJvcnQgLSBSZXRyeSBUaW1lb3V0ICovCisjZGVmaW5lICBJQ1NfTUJJQSh4KSAgICAgICAoMHgxMDAwMDAwMCA8PCAoKHgpICYgMHgzKSkJLy8gbWFpbGJveCB4IGlzIGFjdGl2ZQorCisjZGVmaW5lIFBMWF9DT05UUk9MX1JFRyAgICAgICAgMHgwMDZDCS8qIEwsIEVFUFJPTSBDbnRsICYgUENJIENtZCBDb2RlcyAqLworI2RlZmluZSAgQ1RMX1JETUEgICAgICAgICAgMHgwMDAwMDAwRQkvKiBETUEgUmVhZCBDb21tYW5kICovCisjZGVmaW5lICBDVExfV0RNQSAgICAgICAgICAweDAwMDAwMDcwCS8qIERNQSBXcml0ZSBDb21tYW5kICovCisjZGVmaW5lICBDVExfUk1FTSAgICAgICAgICAweDAwMDAwNjAwCS8qIE1lbW9yeSBSZWFkIENvbW1hbmQgKi8KKyNkZWZpbmUgIENUTF9XTUVNICAgICAgICAgIDB4MDAwMDcwMDAJLyogTWVtb3J5IFdyaXRlIENvbW1hbmQgKi8KKyNkZWZpbmUgIENUTF9VU0VSTyAgICAgICAgIDB4MDAwMTAwMDAJLyogVVNFUk8gb3V0cHV0IHBpbiBjb250cm9sIGJpdCAqLworI2RlZmluZSAgQ1RMX1VTRVJJICAgICAgICAgMHgwMDAyMDAwMAkvKiBVU0VSSSBpbnB1dCBwaW4gYml0ICovCisjZGVmaW5lICBDVExfRUVfQ0xLICAgICAgICAweDAxMDAwMDAwCS8qIEVFUFJPTSBDbG9jayBsaW5lICovCisjZGVmaW5lICBDVExfRUVfQ1MgICAgICAgICAweDAyMDAwMDAwCS8qIEVFUFJPTSBDaGlwIFNlbGVjdCAqLworI2RlZmluZSAgQ1RMX0VFX1cgICAgICAgICAgMHgwNDAwMDAwMAkvKiBFRVBST00gV3JpdGUgYml0ICovCisjZGVmaW5lICBDVExfRUVfUiAgICAgICAgICAweDA4MDAwMDAwCS8qIEVFUFJPTSBSZWFkIGJpdCAqLworI2RlZmluZSAgQ1RMX0VFQ0hLICAgICAgICAgMHgxMDAwMDAwMAkvKiBFRVBST00gUHJlc2VudCBiaXQgKi8KKyNkZWZpbmUgIENUTF9FRVJMRCAgICAgICAgIDB4MjAwMDAwMDAJLyogRUVQUk9NIFJlbG9hZCBSZWdpc3RlciAqLworI2RlZmluZSAgQ1RMX1JFU0VUICAgICAgICAgMHg0MDAwMDAwMAkvKiAhISBBZGFwdGVyIFJlc2V0ICEhICovCisjZGVmaW5lICBDVExfUkVBRFkgICAgICAgICAweDgwMDAwMDAwCS8qIExvY2FsIEluaXQgRG9uZSAqLworCisjZGVmaW5lIFBMWF9JRF9SRUcJMHg3MAkvLyBoYXJkLWNvZGVkIHBseCB2ZW5kb3IgYW5kIGRldmljZSBpZHMKKworI2RlZmluZSBQTFhfUkVWSVNJT05fUkVHCTB4NzQJLy8gc2lsaWNvbiByZXZpc2lvbgorCisjZGVmaW5lIFBMWF9ETUEwX01PREVfUkVHCTB4ODAJLy8gZG1hIGNoYW5uZWwgMCBtb2RlIHJlZ2lzdGVyCisjZGVmaW5lIFBMWF9ETUExX01PREVfUkVHCTB4OTQJLy8gZG1hIGNoYW5uZWwgMCBtb2RlIHJlZ2lzdGVyCisjZGVmaW5lICBQTFhfTE9DQUxfQlVTXzE2X1dJREVfQklUUwkweDEKKyNkZWZpbmUgIFBMWF9MT0NBTF9CVVNfMzJfV0lERV9CSVRTCTB4MworI2RlZmluZSAgUExYX0xPQ0FMX0JVU19XSURUSF9NQVNLCTB4MworI2RlZmluZSAgUExYX0RNQV9FTl9SRUFEWUlOX0JJVAkweDQwCS8vIGVuYWJsZSByZWFkeSBpbiBpbnB1dAorI2RlZmluZSAgUExYX0VOX0JURVJNX0JJVAkweDgwCS8vIGVuYWJsZSBCVEVSTSMgaW5wdXQKKyNkZWZpbmUgIFBMWF9ETUFfTE9DQUxfQlVSU1RfRU5fQklUCTB4MTAwCS8vIGVuYWJsZSBsb2NhbCBidXJzdCBtb2RlCisjZGVmaW5lICBQTFhfRU5fQ0hBSU5fQklUCTB4MjAwCS8vIGVuYWJsZXMgY2hhaW5pbmcKKyNkZWZpbmUgIFBMWF9FTl9ETUFfRE9ORV9JTlRSX0JJVAkweDQwMAkvLyBlbmFibGVzIGludGVycnVwdCBvbiBkbWEgZG9uZQorI2RlZmluZSAgUExYX0xPQ0FMX0FERFJfQ09OU1RfQklUCTB4ODAwCS8vIGhvbGQgbG9jYWwgYWRkcmVzcyBjb25zdGFudCAoZG9uJ3QgaW5jcmVtZW50KQorI2RlZmluZSAgUExYX0RFTUFORF9NT0RFX0JJVAkweDEwMDAJLy8gZW5hYmxlcyBkZW1hbmQtbW9kZSBmb3IgZG1hIHRyYW5zZmVyCisjZGVmaW5lICBQTFhfRU9UX0VOQUJMRV9CSVQJMHg0MDAwCisjZGVmaW5lICBQTFhfU1RPUF9NT0RFX0JJVCAweDgwMDAKKyNkZWZpbmUgIFBMWF9ETUFfSU5UUl9QQ0lfQklUCTB4MjAwMDAJLy8gcm91dGVzIGRtYSBpbnRlcnJ1cHQgdG8gcGNpIGJ1cyAoaW5zdGVhZCBvZiBsb2NhbCBidXMpCisKKyNkZWZpbmUgUExYX0RNQTBfUENJX0FERFJFU1NfUkVHCTB4ODQJLy8gcGNpIGFkZHJlc3MgdGhhdCBkbWEgdHJhbnNmZXJzIHN0YXJ0IGF0CisjZGVmaW5lIFBMWF9ETUExX1BDSV9BRERSRVNTX1JFRwkweDk4CisKKyNkZWZpbmUgUExYX0RNQTBfTE9DQUxfQUREUkVTU19SRUcJMHg4OAkvLyBsb2NhbCBhZGRyZXNzIHRoYXQgZG1hIHRyYW5zZmVycyBzdGFydCBhdAorI2RlZmluZSBQTFhfRE1BMV9MT0NBTF9BRERSRVNTX1JFRwkweDljCisKKyNkZWZpbmUgUExYX0RNQTBfVFJBTlNGRVJfU0laRV9SRUcJMHg4YwkvLyBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgKGZpcnN0IDIzIGJpdHMpCisjZGVmaW5lIFBMWF9ETUExX1RSQU5TRkVSX1NJWkVfUkVHCTB4YTAKKworI2RlZmluZSBQTFhfRE1BMF9ERVNDUklQVE9SX1JFRwkweDkwCS8vIGRlc2NyaXB0b3IgcG9pbnRlciByZWdpc3RlcgorI2RlZmluZSBQTFhfRE1BMV9ERVNDUklQVE9SX1JFRwkweGE0CisjZGVmaW5lICBQTFhfREVTQ19JTl9QQ0lfQklUCTB4MQkvLyBkZXNjcmlwdG9yIGlzIGxvY2F0ZWQgaW4gcGNpIHNwYWNlIChub3QgbG9jYWwgc3BhY2UpCisjZGVmaW5lICBQTFhfRU5EX09GX0NIQUlOX0JJVAkweDIJLy8gZW5kIG9mIGNoYWluIGJpdAorI2RlZmluZSAgUExYX0lOVFJfVEVSTV9DT1VOVAkweDQJLy8gaW50ZXJydXB0IHdoZW4gdGhpcyBkZXNjcmlwdG9yJ3MgdHJhbnNmZXIgaXMgZmluaXNoZWQKKyNkZWZpbmUgIFBMWF9YRkVSX0xPQ0FMX1RPX1BDSSAweDgJLy8gdHJhbnNmZXIgZnJvbSBsb2NhbCB0byBwY2kgYnVzIChub3QgcGNpIHRvIGxvY2FsKQorCisjZGVmaW5lIFBMWF9ETUEwX0NTX1JFRwkweGE4CS8vIGNvbW1hbmQgc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIFBMWF9ETUExX0NTX1JFRwkweGE5CisjZGVmaW5lICBQTFhfRE1BX0VOX0JJVAkweDEJLy8gZW5hYmxlIGRtYSBjaGFubmVsCisjZGVmaW5lICBQTFhfRE1BX1NUQVJUX0JJVAkweDIJLy8gc3RhcnQgZG1hIHRyYW5zZmVyCisjZGVmaW5lICBQTFhfRE1BX0FCT1JUX0JJVAkweDQJLy8gYWJvcnQgZG1hIHRyYW5zZmVyCisjZGVmaW5lICBQTFhfQ0xFQVJfRE1BX0lOVFJfQklUCTB4OAkvLyBjbGVhciBkbWEgaW50ZXJydXB0CisjZGVmaW5lICBQTFhfRE1BX0RPTkVfQklUCTB4MTAJLy8gdHJhbnNmZXIgZG9uZSBzdGF0dXMgYml0CisKKyNkZWZpbmUgUExYX0RNQTBfVEhSRVNIT0xEX1JFRwkweGIwCS8vIGNvbW1hbmQgc3RhdHVzIHJlZ2lzdGVyCisKKy8qCisgKiBBY2Nlc3NlcyBuZWFyIHRoZSBlbmQgb2YgbWVtb3J5IGNhbiBjYXVzZSB0aGUgUExYIGNoaXAKKyAqIHRvIHByZS1mZXRjaCBkYXRhIG9mZiBvZiBlbmQtb2YtcmFtLiAgTGltaXQgdGhlIHNpemUgb2YKKyAqIG1lbW9yeSBzbyBob3N0LXNpZGUgYWNjZXNzZXMgY2Fubm90IG9jY3VyLgorICovCisKKyNkZWZpbmUgUExYX1BSRUZFVENIICAgMzIKKworLyoKKyAqIFRoZSBQQ0kgSW50ZXJmYWNlLCB2aWEgdGhlIFBDSS05MDYwIENoaXAsIGhhcyB1cCB0byBlaWdodCAoOCkgTWFpbGJveAorICogUmVnaXN0ZXJzLiAgVGhlIFBVVFMgKFBvd2VyLVVwIFRlc3QgU3VpdGUpIGhhbmRsZXMgdGhlIGJvYXJkLXNpZGUKKyAqIGludGVyZmFjZS9pbnRlcmFjdGlvbiB1c2luZyB0aGUgZmlyc3QgNCByZWdpc3RlcnMuICBTcGVjaWZpY2F0aW9ucyBmb3IKKyAqIHRoZSB1c2Ugb2YgdGhlIGZ1bGwgUFVUUycgY29tbWFuZCBhbmQgc3RhdHVzIGludGVyZmFjZSBpcyBjb250YWluZWQKKyAqIHdpdGhpbiBhIHNlcGFyYXRlIFNCRSBQVVRTIE1hbnVhbC4gIFRoZSBIb3N0LVNpZGUgRGV2aWNlIERyaXZlciBvbmx5CisgKiB1c2VzIGEgc3Vic2V0IG9mIHRoZSBmdWxsIFBVVFMgaW50ZXJmYWNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjKC0xKSAtIE1FTSBBQ0NFU1MgU1RTICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfU1RTX1ZBTElEICAgICAgMHg1NzU4NDc0NAkvKiAnV1hHRCcgKi8KKyNkZWZpbmUgTUJYX1NUU19ESUxBViAgICAgIDB4NDQ0NzU4NTcJLyogc3dhcHBlZCA9ICdER1hXJyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgIE1BSUxCT1ggIzAgIC0gIFBVVFMgU1RBVFVTICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUJYX1NUU19NQVNLICAgICAgIDB4MDAwMDAwZmYJLyogUFVUUyBTdGF0dXMgUmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBNQlhfU1RTX1RNQVNLICAgICAgMHgwMDAwMDAwZgkvKiByZWdpc3RlciBiaXRzIGZvciBURVNUIG51bWJlciAqLworCisjZGVmaW5lIE1CWF9TVFNfUENJUkVTRVQgICAweDAwMDAwMTAwCS8qIEhvc3QgaXNzdWVkIFBDSSByZXNldCByZXF1ZXN0ICovCisjZGVmaW5lIE1CWF9TVFNfQlVTWSAgICAgICAweDAwMDAwMDgwCS8qIFBVVFMgaXMgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgTUJYX1NUU19FUlJPUiAgICAgIDB4MDAwMDAwNDAJLyogUFVUUyBoYXMgZmFpbGVkICovCisjZGVmaW5lIE1CWF9TVFNfUkVTRVJWRUQgICAweDAwMDAwMGMwCS8qIFVuZGVmaW5lZCAtPiBzdGF0dXMgaW4gdHJhbnNpdGlvbi4KKwkJCQkJICAgV2UgYXJlIGluIHByb2Nlc3Mgb2YgY2hhbmdpbmcKKwkJCQkJICAgYml0czsgd2UgU0VUIEVycm9yIGJpdCBiZWZvcmUKKwkJCQkJICAgUkVTRVQgb2YgQnVzeSBiaXQgKi8KKworI2RlZmluZSBNQlhfUkVTRVJWRURfNSAgICAgMHgwMDAwMDAyMAkvKiBGWUk6IHJlc2VydmVkL3VudXNlZCBiaXQgKi8KKyNkZWZpbmUgTUJYX1JFU0VSVkVEXzQgICAgIDB4MDAwMDAwMTAJLyogRllJOiByZXNlcnZlZC91bnVzZWQgYml0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgIE1BSUxCT1ggIzEgIC0gIFBVVFMgQ09NTUFORFMgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEFueSBhdHRlbXB0IHRvIGV4ZWN1dGUgYW4gdW5pbXBsZW1lbnQgY29tbWFuZCByZXN1bHRzIGluIHRoZSBQVVRTCisgKiBpbnRlcmZhY2UgZXhlY3V0aW5nIGEgTk9PUCBhbmQgY29udGludWluZyBhcyBpZiB0aGUgb2ZmZW5kaW5nIGNvbW1hbmQKKyAqIGNvbXBsZXRlZCBub3JtYWxseS4gIE5vdGU6IHRoaXMgc3VwcGxpZXMgYSBzaW1wbGUgbWV0aG9kIHRvIGludGVycm9nYXRlCisgKiBtYWlsYm94IGNvbW1hbmQgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5LgorICovCisKKyNkZWZpbmUgTUJYX0NNRF9NQVNLICAgICAgIDB4ZmZmZjAwMDAJLyogUFVUUyBDb21tYW5kIFJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBNQlhfQ01EX0FCT1JUSiAgICAgMHg4NTAwMDAwMAkvKiBhYm9ydCBhbmQganVtcCAqLworI2RlZmluZSBNQlhfQ01EX1JFU0VUUCAgICAgMHg4NjAwMDAwMAkvKiByZXNldCBhbmQgcGF1c2UgYXQgc3RhcnQgKi8KKyNkZWZpbmUgTUJYX0NNRF9QQVVTRSAgICAgIDB4ODcwMDAwMDAJLyogcGF1c2UgaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUgTUJYX0NNRF9QQVVTRUMgICAgIDB4ODgwMDAwMDAJLyogcGF1c2Ugb24gY29tcGxldGlvbiAqLworI2RlZmluZSBNQlhfQ01EX1JFU1VNRSAgICAgMHg4OTAwMDAwMAkvKiByZXN1bWUgb3BlcmF0aW9uICovCisjZGVmaW5lIE1CWF9DTURfU1RFUCAgICAgICAweDhhMDAwMDAwCS8qIHNpbmdsZSBzdGVwIHRlc3RzICovCisKKyNkZWZpbmUgTUJYX0NNRF9CU1dBUCAgICAgIDB4OGMwMDAwMDAJLyogaWRlbnRpZnkgYnl0ZSBzd2FwIHNjaGVtZSAqLworI2RlZmluZSBNQlhfQ01EX0JTV0FQXzAgICAgMHg4YzAwMDAwMAkvKiB1c2Ugc2NoZW1lIDAgKi8KKyNkZWZpbmUgTUJYX0NNRF9CU1dBUF8xICAgIDB4OGMwMDAwMDEJLyogdXNlIHNjaGVtZSAxICovCisKKyNkZWZpbmUgTUJYX0NNRF9TRVRITVMgICAgIDB4OGQwMDAwMDAJLyogc2V0dXAgaG9zdCBtZW1vcnkgYWNjZXNzIHdpbmRvdworCQkJCQkgICBzaXplICovCisjZGVmaW5lIE1CWF9DTURfU0VUSEJBICAgICAweDhlMDAwMDAwCS8qIHNldHVwIGhvc3QgbWVtb3J5IGFjY2VzcyBiYXNlCisJCQkJCSAgIGFkZHJlc3MgKi8KKyNkZWZpbmUgTUJYX0NNRF9NR08gICAgICAgIDB4OGYwMDAwMDAJLyogcGVyZm9ybSBtZW1vcnkgc2V0dXAgYW5kIGNvbnRpbnVlCisJCQkJCSAgIChJRS4gRG9uZSkgKi8KKyNkZWZpbmUgTUJYX0NNRF9OT09QICAgICAgIDB4RkYwMDAwMDAJLyogZHVtbXksIGlsbGVnYWwgY29tbWFuZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgIE1BSUxCT1ggIzIgIC0gIE1FTU9SWSBTSVpFICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUJYX01FTVNaX01BU0sgICAgIDB4ZmZmZjAwMDAJLyogUFVUUyBNZW1vcnkgU2l6ZSBSZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgTUJYX01FTVNaXzEyOEtCICAgIDB4MDAwMjAwMDAJLyogMTI4IGtpbG9ieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl8yNTZLQiAgICAweDAwMDQwMDAwCS8qIDI1NiBraWxvYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfNTEyS0IgICAgMHgwMDA4MDAwMAkvKiA1MTIga2lsb2J5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzFNQiAgICAgIDB4MDAxMDAwMDAJLyogMSBtZWdhYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfMk1CICAgICAgMHgwMDIwMDAwMAkvKiAyIG1lZ2FieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl80TUIgICAgICAweDAwNDAwMDAwCS8qIDQgbWVnYWJ5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzhNQiAgICAgIDB4MDA4MDAwMDAJLyogOCBtZWdhYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfMTZNQiAgICAgMHgwMTAwMDAwMAkvKiAxNiBtZWdhYnl0ZSBib2FyZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICBNQUlMQk9YICMyICAtICBCT0FSRCBUWVBFICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUJYX0JUWVBFX01BU0sgICAgICAgICAgMHgwMDAwZmZmZgkvKiBQVVRTIEJvYXJkIFR5cGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUJYX0JUWVBFX0ZBTUlMWV9NQVNLICAgMHgwMDAwZmYwMAkvKiBQVVRTIEJvYXJkIEZhbWlseSBSZWdpc3RlciAqLworI2RlZmluZSBNQlhfQlRZUEVfU1VCVFlQRV9NQVNLICAweDAwMDAwMGZmCS8qIFBVVFMgQm9hcmQgU3VidHlwZSAqLworCisjZGVmaW5lIE1CWF9CVFlQRV9QTFg5MDYwICAgICAgIDB4MDAwMDAxMDAJLyogUExYIGZhbWlseSB0eXBlICovCisjZGVmaW5lIE1CWF9CVFlQRV9QTFg5MDgwICAgICAgIDB4MDAwMDAzMDAJLyogUExYIHdhblhMMTAwcyBmYW1pbHkgdHlwZSAqLworCisjZGVmaW5lIE1CWF9CVFlQRV9XQU5YTF80ICAgICAgIDB4MDAwMDAxMDQJLyogd2FuWEw0MDAsIDQtcG9ydCAqLworI2RlZmluZSBNQlhfQlRZUEVfV0FOWExfMiAgICAgICAweDAwMDAwMTAyCS8qIHdhblhMMjAwLCAyLXBvcnQgKi8KKyNkZWZpbmUgTUJYX0JUWVBFX1dBTlhMXzFzICAgICAgMHgwMDAwMDMwMQkvKiB3YW5YTDEwMHMsIDEtcG9ydCAqLworI2RlZmluZSBNQlhfQlRZUEVfV0FOWExfMXQgICAgICAweDAwMDAwNDAxCS8qIHdhblhMMTAwVDEsIDEtcG9ydCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgIE1BSUxCT1ggIzMgIC0gIFNITVEgTUFJTEJPWCAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUJYX1NNQlhfTUFTSyAgICAgICAgICAgMHgwMDAwMDBmZgkvKiBQVVRTIFNITVEgTWFpbGJveCBiaXRzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgIEdFTkVSSUMgSE9TVC1TSURFIERSSVZFUiAgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfRVJSICAgIDAKKyNkZWZpbmUgTUJYX09LICAgICAxCisKKy8qIG1haWxib3ggY2hlY2sgcm91dGluZSAtIHR5cGUgb2YgdGVzdGluZyAqLworI2RlZmluZSBNQlhDSEtfU1RTICAgICAgMHgwMAkvKiBjaGVjayBmb3IgUFVUUyBzdGF0dXMgKi8KKyNkZWZpbmUgTUJYQ0hLX05PV0FJVCAgIDB4MDEJLyogZG9udCBjYXJlIGFib3V0IFBVVFMgc3RhdHVzICovCisKKy8qIHN5c3RlbSBhbGxvY2F0ZXMgdGhpcyBtYW55IGJ5dGVzIGZvciBhZGRyZXNzIG1hcHBpbmcgbWFpbGJveCBzcGFjZSAqLworI2RlZmluZSBNQlhfQUREUl9TUEFDRV8zNjAgMHg4MAkvKiB3YW5YTDEwMHMvMjAwLzQwMCAqLworI2RlZmluZSBNQlhfQUREUl9NQVNLXzM2MCAoTUJYX0FERFJfU1BBQ0VfMzYwLTEpCisKK3N0YXRpYyBpbmxpbmUgaW50IHBseDkwODBfYWJvcnRfZG1hKHZvaWQgKmlvYmFzZSwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdm9pZCAqZG1hX2NzX2FkZHI7CisJdWludDhfdCBkbWFfc3RhdHVzOworCWNvbnN0IGludCB0aW1lb3V0ID0gMTAwMDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoY2hhbm5lbCkKKwkJZG1hX2NzX2FkZHIgPSBpb2Jhc2UgKyBQTFhfRE1BMV9DU19SRUc7CisJZWxzZQorCQlkbWFfY3NfYWRkciA9IGlvYmFzZSArIFBMWF9ETUEwX0NTX1JFRzsKKworCS8vIGFib3J0IGRtYSB0cmFuc2ZlciBpZiBuZWNlc3NhcnkKKwlkbWFfc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCWlmICgoZG1hX3N0YXR1cyAmIFBMWF9ETUFfRU5fQklUKSA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwkvLyB3YWl0IHRvIG1ha2Ugc3VyZSBkb25lIGJpdCBpcyB6ZXJvCisJZm9yIChpID0gMDsgKGRtYV9zdGF0dXMgJiBQTFhfRE1BX0RPTkVfQklUKSAmJiBpIDwgdGltZW91dDsgaSsrKSB7CisJCWNvbWVkaV91ZGVsYXkoMSk7CisJCWRtYV9zdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJfQorCWlmIChpID09IHRpbWVvdXQpIHsKKwkJcnRfcHJpbnRrCisJCQkoInBseDkwODA6IGNhbmNlbCgpIHRpbWVkIG91dCB3YWl0aW5nIGZvciBkbWEgJWkgZG9uZSBjbGVhclxuIiwKKwkJCWNoYW5uZWwpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJLy8gZGlzYWJsZSBhbmQgYWJvcnQgY2hhbm5lbAorCXdyaXRlYihQTFhfRE1BX0FCT1JUX0JJVCwgZG1hX2NzX2FkZHIpOworCS8vIHdhaXQgZm9yIGRtYSBkb25lIGJpdAorCWRtYV9zdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJZm9yIChpID0gMDsgKGRtYV9zdGF0dXMgJiBQTFhfRE1BX0RPTkVfQklUKSA9PSAwICYmIGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJY29tZWRpX3VkZWxheSgxKTsKKwkJZG1hX3N0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwl9CisJaWYgKGkgPT0gdGltZW91dCkgeworCQlydF9wcmludGsKKwkJCSgicGx4OTA4MDogY2FuY2VsKCkgdGltZWQgb3V0IHdhaXRpbmcgZm9yIGRtYSAlaSBkb25lIHNldFxuIiwKKwkJCWNoYW5uZWwpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9fQ09NRURJX1BMWDkwODBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDUyNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKQEAgLTAsMCArMSwyMjgzIEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCisgICAgQ29tZWRpIGRyaXZlciBmb3IgUmVhbCBUaW1lIERldmljZXMgKFJURCkgUENJNDUyMC9ETTc1MjAKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisvKgorRHJpdmVyOiBydGQ1MjAKK0Rlc2NyaXB0aW9uOiBSZWFsIFRpbWUgRGV2aWNlcyBQQ0k0NTIwL0RNNzUyMAorQXV0aG9yOiBEYW4gQ2hyaXN0aWFuCitEZXZpY2VzOiBbUmVhbCBUaW1lIERldmljZXNdIERNNzUyMEhSLTEgKHJ0ZDUyMCksIERNNzUyMEhSLTgsCisgIFBDSTQ1MjAsIFBDSTQ1MjAtOAorU3RhdHVzOiBXb3Jrcy4gIE9ubHkgdGVzdGVkIG9uIERNNzUyMC04LiAgTm90IFNNUCBzYWZlLgorCitDb25maWd1cmF0aW9uIG9wdGlvbnM6CisgIFswXSAtIFBDSSBidXMgb2YgZGV2aWNlIChvcHRpb25hbCkKKyAgICAgICAgICBJZiBidXMvc2xvdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYXZhaWxhYmxlIFBDSQorICAgICAgICAgIGRldmljZSB3aWxsIGJlIHVzZWQuCisgIFsxXSAtIFBDSSBzbG90IG9mIGRldmljZSAob3B0aW9uYWwpCisqLworLyoKKyAgICBDcmVhdGVkIGJ5IERhbiBDaHJpc3RpYW4sIE5BU0EgQW1lcyBSZXNlYXJjaCBDZW50ZXIuCisKKyAgICBUaGUgUENJNDUyMCBpcyBhIFBDSSBjYXJkLiAgVGhlIERNNzUyMCBpcyBhIFBDLzEwNC1wbHVzIGNhcmQuCisgICAgQm90aCBoYXZlOgorICAgIDgvMTYgMTIgYml0IEFEQyB3aXRoIEZJRk8gYW5kIGNoYW5uZWwgZ2FpbiB0YWJsZQorICAgIDggYml0cyBoaWdoIHNwZWVkIGRpZ2l0YWwgb3V0IChmb3IgZXh0ZXJuYWwgTVVYKSAob3IgOCBpbiBvciA4IG91dCkKKyAgICA4IGJpdHMgaGlnaCBzcGVlZCBkaWdpdGFsIGluIHdpdGggRklGTyBhbmQgaW50ZXJydXB0IG9uIGNoYW5nZSAob3IgOCBJTykKKyAgICAyIDEyIGJpdCBEQUNzIHdpdGggRklGT3MKKyAgICAyIGJpdHMgb3V0cHV0CisgICAgMiBiaXRzIGlucHV0CisgICAgYnVzIG1hc3RlcmluZyBETUEKKyAgICB0aW1lcnM6IEFEQyBzYW1wbGUsIHBhY2VyLCBidXJzdCwgYWJvdXQsIGRlbGF5LCBEQTEsIERBMgorICAgIHNhbXBsZSBjb3VudGVyCisgICAgMyB1c2VyIHRpbWVyL2NvdW50ZXJzICg4MjU0KQorICAgIGV4dGVybmFsIGludGVycnVwdAorCisgICAgVGhlIERNNzUyMCBoYXMgc2xpZ2h0bHkgZmV3ZXIgZmVhdHVyZXMgKGZld2VyIGdhaW4gc3RlcHMpLgorCisgICAgVGhlc2UgYm9hcmRzIGNhbiBzdXBwb3J0IGV4dGVybmFsIG11bHRpcGxleG9ycyBhbmQgbXVsdGktYm9hcmQKKyAgICBzeW5jaHJvbml6YXRpb24sIGJ1dCB0aGlzIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgdGhhdC4KKworICAgIEJvYXJkIGRvY3M6IGh0dHA6Ly93d3cucnRkdXNhLmNvbS9QQzEwNC9ETS9hbmFsb2clMjBJTy9kbTc1MjAuaHRtCisgICAgRGF0YSBzaGVldDogaHR0cDovL3d3dy5ydGR1c2EuY29tL3BkZi9kbTc1MjAucGRmCisgICAgRXhhbXBsZSBzb3VyY2U6IGh0dHA6Ly93d3cucnRkdXNhLmNvbS9leGFtcGxlcy9kbS9kbTc1MjAuemlwCisgICAgQ2FsbCB0aGVtIGFuZCBhc2sgZm9yIHRoZSByZWdpc3RlciBsZXZlbCBtYW51YWwuCisgICAgUENJIGNoaXA6IGh0dHA6Ly93d3cucGx4dGVjaC5jb20vcHJvZHVjdHMvdG9vbGJveC85MDgwLmh0bQorCisgICAgTm90ZXM6CisgICAgVGhpcyBib2FyZCBpcyBtZW1vcnkgbWFwcGVkLiAgVGhlcmUgaXMgc29tZSBJTyBzdHVmZiwgYnV0IGl0IGlzbid0IG5lZWRlZC4KKworICAgIEkgdXNlIGEgcHJldHR5IGxvb3NlIG5hbWluZyBzdHlsZSB3aXRoaW4gdGhlIGRyaXZlciAocnRkX2JsYWgpLgorICAgIEFsbCBleHRlcm5hbGx5IHZpc2libGUgbmFtZXMgc2hvdWxkIGJlIHJ0ZDUyMF9ibGFoLgorICAgIEkgdXNlIGNhbWVsQ2FzZSBmb3Igc3RydWN0dXJlcyAoYW5kIGluc2lkZSB0aGVtKS4KKyAgICBJIG1heSBhbHNvIHVzZSB1cHBlciBDYW1lbENhc2UgZm9yIGZ1bmN0aW9uIG5hbWVzIChvbGQgaGFiaXQpLgorCisgICAgVGhpcyBib2FyZCBpcyBzb21ld2hhdCByZWxhdGVkIHRvIHRoZSBSVEQgUENJNDQwMCBib2FyZC4KKworICAgIEkgYm9ycm93ZWQgaGVhdmlseSBmcm9tIHRoZSBuaV9taW9fY29tbW9uLCBuaV9hdG1pbzE2ZCwgbWl0ZSwgYW5kCisgICAgZGFzMTgwMCwgc2luY2UgdGhleSBoYXZlIHRoZSBiZXN0IGRvY3VtZW50ZWQgY29kZS4gIERyaXZlcgorICAgIGNiX3BjaWRhczY0LmMgdXNlcyB0aGUgc2FtZSBETUEgY29udHJvbGxlci4KKworICAgIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0aGUgQWJvdXQgaW50ZXJydXB0IGRvZXNudCB3b3JrIGlmIFNhbXBsZSBpcworICAgIGFsc28gZW5hYmxlZC4gIEl0IHR1cm5zIG91dCB0aGF0IEFib3V0IHJlYWxseSBpc24ndCBuZWVkZWQsIHNpbmNlCisgICAgd2UgYWx3YXlzIGNvdW50IGRvd24gc2FtcGxlcyByZWFkLgorCisgICAgVGhlcmUgd2FzIHNvbWUgdGltZXIvY291bnRlciBjb2RlLCBidXQgaXQgZGlkbid0IGZvbGxvdyB0aGUgcmlnaHQgQVBJLgorCisqLworCisvKgorICBkcml2ZXIgc3RhdHVzOgorCisgIEFuYWxvZy1JbiBzdXBwb3J0cyBpbnN0cnVjdGlvbiBhbmQgY29tbWFuZCBtb2RlLgorCisgIFdpdGggRE1BLCB5b3UgY2FuIHNhbXBsZSBhdCAxLjE1TWh6IHdpdGggNzAlIGlkbGUgb24gYSA0MDBNaHogSzYtMgorICAoc2luZ2xlIGNoYW5uZWwsIDY0SyByZWFkIGJ1ZmZlcikuICBJIGdldCByYW5kb20gc3lzdGVtIGxvY2t1cHMgd2hlbgorICB1c2luZyBETUEgd2l0aCBBTEktMTV4eCBiYXNlZCBzeXN0ZW1zLiAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0ZXN0CisgIGFueSBvdGhlciBjaGlwc2V0cy4gIFRoZSBsb2NrdXBzIGhhcHBlbiBzb29uIGFmdGVyIHRoZSBzdGFydCBvZiBhbgorICBhY3F1aXN0aW9uLCBub3QgaW4gdGhlIG1pZGRsZSBvZiBhIGxvbmcgcnVuLgorCisgIFdpdGhvdXQgRE1BLCB5b3UgY2FuIGRvIDYyMEtoeiBzYW1wbGluZyB3aXRoIDIwJSBpZGxlIG9uIGEgNDAwTWh6IEs2LTIKKyAgKHdpdGggYSAyNTZLIHJlYWQgYnVmZmVyKS4KKworICBEaWdpdGFsLUlPIGFuZCBBbmFsb2ctT3V0IG9ubHkgc3VwcG9ydCBpbnN0cnVjdGlvbiBtb2RlLgorCisqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgImNvbWVkaV9wY2kuaCIKKworI2RlZmluZSBEUlZfTkFNRSAicnRkNTIwIgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRHJpdmVyIHNwZWNpZmljIHN0dWZmICh0dW5hYmxlKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBFbmFibGUgdGhpcyB0byB0ZXN0IHRoZSBuZXcgRE1BIHN1cHBvcnQuIFlvdSBtYXkgZ2V0IGhhcmQgbG9jayB1cHMgKi8KKy8qI2RlZmluZSBVU0VfRE1BKi8KKworLyogV2UgcmVhbGx5IG9ubHkgbmVlZCAyIGJ1ZmZlcnMuICBNb3JlIHRoYW4gdGhhdCBtZWFucyBiZWluZyBtdWNoCisgICBzbWFydGVyIGFib3V0IGtub3dpbmcgd2hpY2ggb25lcyBhcmUgZnVsbC4gKi8KKyNkZWZpbmUgRE1BX0NIQUlOX0NPVU5UIDIJLyogbWF4IERNQSBzZWdtZW50cy9idWZmZXJzIGluIGEgcmluZyAobWluIDIpICovCisKKy8qIFRhcmdldCBwZXJpb2QgZm9yIHBlcmlvZGljIHRyYW5zZmVycy4gIFRoaXMgc2V0cyB0aGUgdXNlciByZWFkIGxhdGVuY3kuICovCisvKiBOb3RlOiBUaGVyZSBhcmUgY2VydGFpbiByYXRlcyB3aGVyZSB3ZSBnaXZlIHRoaXMgdXAgYW5kIHRyYW5zZmVyIDEvMiBGSUZPICovCisvKiBJZiB0aGlzIGlzIHRvbyBsb3csIGVmZmljaWVuY3kgaXMgcG9vciAqLworI2RlZmluZSBUUkFOU19UQVJHRVRfUEVSSU9EIDEwMDAwMDAwCS8qIDEwIG1zIChpbiBuYW5vc2Vjb25kcykgKi8KKworLyogU2V0IGEgcHJhY3RpY2FsIGxpbWl0IG9uIGhvdyBsb25nIGEgbGlzdCB0byBzdXBwb3J0IChhZmZlY3RzIG1lbW9yeSB1c2UpICovCisvKiBUaGUgYm9hcmQgc3VwcG9ydCBhIGNoYW5uZWwgbGlzdCB1cCB0byB0aGUgRklGTyBsZW5ndGggKDFLIG9yIDhLKSAqLworI2RlZmluZSBSVERfTUFYX0NIQU5MSVNUCTEyOAkvKiBtYXggY2hhbm5lbCBsaXN0IHRoYXQgd2UgYWxsb3cgKi8KKworLyogdHVuaW5nIGZvciBhaS9hbyBpbnN0cnVjdGlvbiBkb25lIHBvbGxpbmcgKi8KKyNpZmRlZiBGQVNUX1NQSU4KKyNkZWZpbmUgV0FJVF9RVUlFVExZCQkvKiBhcyBub3RoaW5nLCBzcGluIG9uIGRvbmUgYml0ICovCisjZGVmaW5lIFJURF9BRENfVElNRU9VVAk2NjAwMAkvKiAyIG1zZWMgYXQgMzNtaHogYnVzIHJhdGUgKi8KKyNkZWZpbmUgUlREX0RBQ19USU1FT1VUCTY2MDAwCisjZGVmaW5lIFJURF9ETUFfVElNRU9VVAkzMzAwMAkvKiAxIG1zZWMgKi8KKyNlbHNlCisvKiBieSBkZWxheWluZywgcG93ZXIgYW5kIGVsZWN0cmljYWwgbm9pc2UgYXJlIHJlZHVjZWQgc29tZXdoYXQgKi8KKyNkZWZpbmUgV0FJVF9RVUlFVExZCWNvbWVkaV91ZGVsYXkgKDEpCisjZGVmaW5lIFJURF9BRENfVElNRU9VVAkyMDAwCS8qIGluIHVzZWMgKi8KKyNkZWZpbmUgUlREX0RBQ19USU1FT1VUCTIwMDAJLyogaW4gdXNlYyAqLworI2RlZmluZSBSVERfRE1BX1RJTUVPVVQJMTAwMAkvKiBpbiB1c2VjICovCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJvYXJkIHNwZWNpZmljIHN0dWZmCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogcmVnaXN0ZXJzICAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JURAkweDE0MzUKKy8qCisgIFRoZSBib2FyZCBoYXMgdGhyZWUgbWVtb3J5IHdpbmRvd3M6IGxhczAsIGxhczEsIGFuZCBsY2ZnICh0aGUgUENJIGNoaXApCisgIExhczEgaGFzIHRoZSBkYXRhIGFuZCBjYW4gYmUgYnVyc3QgRE1BZWQgMzJiaXRzIGF0IGEgdGltZS4KKyovCisjZGVmaW5lIExDRkdfUENJSU5ERVgJMAorLyogUENJIHJlZ2lvbiAxIGlzIGEgMjU2IGJ5dGUgSU8gc3BhY2UgbWFwcGluZy4gIFVzZT8/PyAqLworI2RlZmluZSBMQVMwX1BDSUlOREVYCTIJLyogUENJIG1lbW9yeSByZXNvdXJjZXMgKi8KKyNkZWZpbmUgTEFTMV9QQ0lJTkRFWAkzCisjZGVmaW5lIExDRkdfUENJU0laRQkweDEwMAorI2RlZmluZSBMQVMwX1BDSVNJWkUJMHgyMDAKKyNkZWZpbmUgTEFTMV9QQ0lTSVpFCTB4MTAKKworI2RlZmluZSBSVERfQ0xPQ0tfUkFURQk4MDAwMDAwCS8qIDhNaHogb25ib2FyZCBjbG9jayAqLworI2RlZmluZSBSVERfQ0xPQ0tfQkFTRQkxMjUJLyogY2xvY2sgcGVyaW9kIGluIG5zICovCisKKy8qIE5vdGU6IHRoZXNlIHNwZWVkIGFyZSBzbG93ZXIgdGhhbiB0aGUgc3BlYywgYnV0IGZpdCB0aGUgY291bnRlciByZXNvbHV0aW9uKi8KKyNkZWZpbmUgUlREX01BWF9TUEVFRAkxNjI1CS8qIHdoZW4gc2FtcGxpbmcsIGluIG5hbm9zZWNvbmRzICovCisvKiBtYXggc3BlZWQgaWYgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBzZXR0bGluZyAqLworI2RlZmluZSBSVERfTUFYX1NQRUVEXzEJODc1CS8qIGlmIHNpbmdsZSBjaGFubmVsLCBpbiBuYW5vc2Vjb25kcyAqLworCisjZGVmaW5lIFJURF9NSU5fU1BFRUQJMjA5NzE1MTg3NQkvKiAoMjRiaXQgY291bnRlcikgaW4gbmFub3NlY29uZHMgKi8KKy8qIG1pbiBzcGVlZCB3aGVuIG9ubHkgMSBjaGFubmVsIChubyBidXJzdCBjb3VudGVyKSAqLworI2RlZmluZSBSVERfTUlOX1NQRUVEXzEJNTAwMDAwMAkvKiAyMDBIeiwgaW4gbmFub3NlY29uZHMgKi8KKworI2luY2x1ZGUgInJ0ZDUyMC5oIgorI2luY2x1ZGUgInBseDkwODAuaCIKKworLyogU2V0dXAgY29udGludW91cyByaW5nIG9mIDEvMiBGSUZPIHRyYW5zZmVycy4gIFNlZSBSVEQgbWFudWFsIHA5MSAqLworI2RlZmluZSBETUFfTU9ERV9CSVRTIChcCisJCSAgICAgICBQTFhfTE9DQUxfQlVTXzE2X1dJREVfQklUUyBcCisJCSAgICAgICB8IFBMWF9ETUFfRU5fUkVBRFlJTl9CSVQgXAorCQkgICAgICAgfCBQTFhfRE1BX0xPQ0FMX0JVUlNUX0VOX0JJVCBcCisJCSAgICAgICB8IFBMWF9FTl9DSEFJTl9CSVQgXAorCQkgICAgICAgfCBQTFhfRE1BX0lOVFJfUENJX0JJVCBcCisJCSAgICAgICB8IFBMWF9MT0NBTF9BRERSX0NPTlNUX0JJVCBcCisJCSAgICAgICB8IFBMWF9ERU1BTkRfTU9ERV9CSVQpCisKKyNkZWZpbmUgRE1BX1RSQU5TRkVSX0JJVFMgKFwKKy8qIGRlc2NyaXB0b3JzIGluIFBDSSBtZW1vcnkqLyAJUExYX0RFU0NfSU5fUENJX0JJVCBcCisvKiBpbnRlcnJ1cHQgYXQgZW5kIG9mIGJsb2NrICovIHwgUExYX0lOVFJfVEVSTV9DT1VOVCBcCisvKiBmcm9tIGJvYXJkIHRvIFBDSSAqLwkJfCBQTFhfWEZFUl9MT0NBTF9UT19QQ0kpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDb21lZGkgc3BlY2lmaWMgc3R1ZmYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICBUaGUgYm9hcmQgaGFzIDMgaW5wdXQgbW9kZXMgYW5kIHRoZSBnYWlucyBvZiAxLDIsNCwuLi4zMiAoLCA2NCwgMTI4KQorKi8KK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHJ0ZF9haV83NTIwX3JhbmdlID0geyAxOCwgeworCQkJLyogKy01ViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlCSVBfUkFOR0UoNS4wKSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAyKSwKKwkJCUJJUF9SQU5HRSg1LjAgLyA0KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyA4KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAxNiksCisJCQlCSVBfUkFOR0UoNS4wIC8gMzIpLAorCQkJLyogKy0xMFYgaW5wdXQgcmFuZ2UgZ2FpbiBzdGVwcyAqLworCQkJQklQX1JBTkdFKDEwLjApLAorCQkJQklQX1JBTkdFKDEwLjAgLyAyKSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gNCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDgpLAorCQkJQklQX1JBTkdFKDEwLjAgLyAxNiksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDMyKSwKKwkJCS8qICsxMFYgaW5wdXQgcmFuZ2UgZ2FpbiBzdGVwcyAqLworCQkJVU5JX1JBTkdFKDEwLjApLAorCQkJVU5JX1JBTkdFKDEwLjAgLyAyKSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gNCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDgpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyAxNiksCisJCQlVTklfUkFOR0UoMTAuMCAvIDMyKSwKKworCX0KK307CisKKy8qIFBDSTQ1MjAgaGFzIHR3byBtb3JlIGdhaW5zICg2IG1vcmUgZW50cmllcykgKi8KK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHJ0ZF9haV80NTIwX3JhbmdlID0geyAyNCwgeworCQkJLyogKy01ViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlCSVBfUkFOR0UoNS4wKSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAyKSwKKwkJCUJJUF9SQU5HRSg1LjAgLyA0KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyA4KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAxNiksCisJCQlCSVBfUkFOR0UoNS4wIC8gMzIpLAorCQkJQklQX1JBTkdFKDUuMCAvIDY0KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAxMjgpLAorCQkJLyogKy0xMFYgaW5wdXQgcmFuZ2UgZ2FpbiBzdGVwcyAqLworCQkJQklQX1JBTkdFKDEwLjApLAorCQkJQklQX1JBTkdFKDEwLjAgLyAyKSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gNCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDgpLAorCQkJQklQX1JBTkdFKDEwLjAgLyAxNiksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDMyKSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gNjQpLAorCQkJQklQX1JBTkdFKDEwLjAgLyAxMjgpLAorCQkJLyogKzEwViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlVTklfUkFOR0UoMTAuMCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDIpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyA0KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gOCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDE2KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMzIpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyA2NCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDEyOCksCisJfQorfTsKKworLyogVGFibGUgb3JkZXIgbWF0Y2hlcyByYW5nZSB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHJ0ZF9hb19yYW5nZSA9IHsgNCwgeworCQkJUkFOR0UoMCwgNSksCisJCQlSQU5HRSgwLCAxMCksCisJCQlSQU5HRSgtNSwgNSksCisJCQlSQU5HRSgtMTAsIDEwKSwKKwl9Cit9OworCisvKgorICBCb2FyZCBkZXNjcmlwdGlvbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcnRkQm9hcmRfc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOwkvKiBtdXN0IGJlIGZpcnN0ICovCisJaW50IGRldmljZV9pZDsKKwlpbnQgYWlDaGFuczsKKwlpbnQgYWlCaXRzOworCWludCBhaU1heEdhaW47CisJaW50IHJhbmdlMTBTdGFydDsJLyogc3RhcnQgb2YgKy0xMFYgcmFuZ2UgKi8KKwlpbnQgcmFuZ2VVbmlTdGFydDsJLyogc3RhcnQgb2YgKzEwViByYW5nZSAqLworfSBydGRCb2FyZDsKKworc3RhdGljIGNvbnN0IHJ0ZEJvYXJkIHJ0ZDUyMEJvYXJkc1tdID0geworCXsKKwkgICAgICBuYW1lOgkiRE03NTIwIiwKKwkgICAgICBkZXZpY2VfaWQ6MHg3NTIwLAorCSAgICAgIGFpQ2hhbnM6CTE2LAorCSAgICAgIGFpQml0czoJMTIsCisJICAgICAgYWlNYXhHYWluOjMyLAorCSAgICAgIHJhbmdlMTBTdGFydDo2LAorCSAgICAgIHJhbmdlVW5pU3RhcnQ6MTIsCisJCX0sCisJeworCSAgICAgIG5hbWU6CSJQQ0k0NTIwIiwKKwkgICAgICBkZXZpY2VfaWQ6MHg0NTIwLAorCSAgICAgIGFpQ2hhbnM6CTE2LAorCSAgICAgIGFpQml0czoJMTIsCisJICAgICAgYWlNYXhHYWluOjEyOCwKKwkgICAgICByYW5nZTEwU3RhcnQ6OCwKKwkgICAgICByYW5nZVVuaVN0YXJ0OjE2LAorCQl9LAorfTsKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHJ0ZDUyMF9wY2lfdGFibGUpID0geworCXtQQ0lfVkVORE9SX0lEX1JURCwgMHg3NTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9SVEQsIDB4NDUyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnRkNTIwX3BjaV90YWJsZSk7CisKKy8qCisgKiBVc2VmdWwgZm9yIHNob3J0aGFuZCBhY2Nlc3MgdG8gdGhlIHBhcnRpY3VsYXIgYm9hcmQgc3RydWN0dXJlCisgKi8KKyNkZWZpbmUgdGhpc2JvYXJkICgoY29uc3QgcnRkQm9hcmQgKilkZXYtPmJvYXJkX3B0cikKKworLyoKKyAgIFRoaXMgc3RydWN0dXJlIGlzIGZvciBkYXRhIHVuaXF1ZSB0byB0aGlzIGhhcmR3YXJlIGRyaXZlci4KKyAgIFRoaXMgaXMgYWxzbyB1bmlxdWUgZm9yIGVhY2ggYm9hcmQgaW4gdGhlIHN5c3RlbS4KKyovCit0eXBlZGVmIHN0cnVjdCB7CisJLyogbWVtb3J5IG1hcHBlZCBib2FyZCBzdHJ1Y3R1cmVzICovCisJdm9pZCAqbGFzMDsKKwl2b2lkICpsYXMxOworCXZvaWQgKmxjZmc7CisKKwl1bnNpZ25lZCBsb25nIGludENvdW50OwkvKiBpbnRlcnJ1cHQgY291bnQgKi8KKwlsb25nIGFpQ291bnQ7CQkvKiB0b3RhbCB0cmFuc2ZlciBzaXplIChzYW1wbGVzKSAqLworCWludCB0cmFuc0NvdW50OwkJLyogIyB0byB0cmFuZmVyIGRhdGEuIDAtPjEvMkZJRk8gKi8KKwlpbnQgZmxhZ3M7CQkvKiBmbGFnIGV2ZW50IG1vZGVzICovCisKKwkvKiBQQ0kgZGV2aWNlIGluZm8gKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlpbnQgZ290X3JlZ2lvbnM7CS8qIG5vbi16ZXJvIGlmIFBDSSByZWdpb25zIG93bmVkICovCisKKwkvKiBjaGFubmVsIGxpc3QgaW5mbyAqLworCS8qIGNoYW5CaXBvbGFyIHRyYWNrcyB3aGV0aGVyIGEgY2hhbm5lbCBpcyBiaXBvbGFyIChhbmQgbmVlZHMgKzIwNDgpICovCisJdW5zaWduZWQgY2hhciBjaGFuQmlwb2xhcltSVERfTUFYX0NIQU5MSVNUIC8gOF07CS8qIGJpdCBhcnJheSAqLworCisJLyogcmVhZCBiYWNrIGRhdGEgKi8KKwlsc2FtcGxfdCBhb1ZhbHVlWzJdOwkvKiBVc2VkIGZvciBBTyByZWFkIGJhY2sgKi8KKworCS8qIHRpbWVyIGdhdGUgKHdoZW4gZW5hYmxlZCkgKi8KKwl1OCB1dGNHYXRlWzRdOwkJLyogMSBleHRyYSBhbGxvd3Mgc2ltcGxlIHJhbmdlIGNoZWNrICovCisKKwkvKiBzaGFkb3cgcmVnaXN0ZXJzIGFmZmVjdCBvdGhlciByZWdpc3RlcnMsIGJ1dCBjYW50IGJlIHJlYWQgYmFjayAqLworCS8qIFRoZSBtYWNyb3MgYmVsb3cgdXBkYXRlIHRoZXNlIG9uIHdyaXRlcyAqLworCXUxNiBpbnRNYXNrOwkJLyogaW50ZXJydXB0IG1hc2sgKi8KKwl1MTYgaW50Q2xlYXJNYXNrOwkvKiBpbnRlcnJ1cHQgY2xlYXIgbWFzayAqLworCXU4IHV0Y0N0cmxbNF07CQkvKiBjcnRsIG1vZGUgZm9yIDMgdXRjICsgcmVhZCBiYWNrICovCisJdTggZGlvU3RhdHVzOwkJLyogY291bGQgYmUgcmVhZCBiYWNrIChkaW8wQ3RybCkgKi8KKyNpZmRlZiBVU0VfRE1BCisJLyogQWx3YXlzIERNQSAxLzIgRklGTy4gIEJ1ZmZlciAoZG1hQnVmZj8pIGlzIChhdCBsZWFzdCkgdHdpY2UgdGhhdCBzaXplLgorCSAgIEFmdGVyIHRyYW5zZmVycmluZywgaW50ZXJydXB0IHByb2Nlc3NlcyAxLzIgRklGTyBhbmQgcGFzc2VzIHRvIGNvbWVkaSAqLworCXMxNiBkbWEwT2Zmc2V0OwkJLyogY3VycmVudCBwcm9jZXNzaW5nIG9mZnNldCAoMCwgMS8yKSAqLworCXVpbnQxNl90ICpkbWEwQnVmZltETUFfQ0hBSU5fQ09VTlRdOwkvKiBETUEgYnVmZmVycyAoZm9yIEFEQykgKi8KKwlkbWFfYWRkcl90IGRtYTBCdWZmUGh5c0FkZHJbRE1BX0NIQUlOX0NPVU5UXTsJLyogcGh5c2ljYWwgYWRkcmVzc2VzICovCisJc3RydWN0IHBseF9kbWFfZGVzYyAqZG1hMENoYWluOwkvKiBETUEgZGVzY3JpcHRvciByaW5nIGZvciBkbWFCdWZmICovCisJZG1hX2FkZHJfdCBkbWEwQ2hhaW5QaHlzQWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzc2VzICovCisJLyogc2hhZG93IHJlZ2lzdGVycyAqLworCXU4IGRtYTBDb250cm9sOworCXU4IGRtYTFDb250cm9sOworI2VuZGlmCQkJCS8qIFVTRV9ETUEgKi8KKwl1bnNpZ25lZCBmaWZvTGVuOworfSBydGRQcml2YXRlOworCisvKiBiaXQgZGVmaW5lcyBmb3IgImZsYWdzIiAqLworI2RlZmluZSBTRU5EX0VPUwkweDAxCS8qIHNlbmQgRW5kIE9mIFNjYW4gZXZlbnRzICovCisjZGVmaW5lIERNQTBfQUNUSVZFCTB4MDIJLyogRE1BMCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgRE1BMV9BQ1RJVkUJMHgwNAkvKiBETUExIGlzIGFjdGl2ZSAqLworCisvKiBNYWNyb3MgZm9yIGFjY2Vzc2luZyBjaGFubmVsIGxpc3QgYml0IGFycmF5ICovCisjZGVmaW5lIENIQU5fQVJSQVlfVEVTVChhcnJheSxpbmRleCkgXAorCSgoKGFycmF5KVsoaW5kZXgpLzhdID4+ICgoaW5kZXgpICYgMHg3KSkgJiAweDEpCisjZGVmaW5lIENIQU5fQVJSQVlfU0VUKGFycmF5LGluZGV4KSBcCisJKCgoYXJyYXkpWyhpbmRleCkvOF0gfD0gMSA8PCAoKGluZGV4KSAmIDB4NykpKQorI2RlZmluZSBDSEFOX0FSUkFZX0NMRUFSKGFycmF5LGluZGV4KSBcCisJKCgoYXJyYXkpWyhpbmRleCkvOF0gJj0gfigxIDw8ICgoaW5kZXgpICYgMHg3KSkpKQorCisvKgorICogbW9zdCBkcml2ZXJzIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvIHRvIG1ha2UgaXQgZWFzeSB0bworICogYWNjZXNzIHRoZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBkZXZwcml2ICgocnRkUHJpdmF0ZSAqKWRldi0+cHJpdmF0ZSkKKworLyogTWFjcm9zIHRvIGFjY2VzcyByZWdpc3RlcnMgKi8KKworLyogUmVzZXQgYm9hcmQgKi8KKyNkZWZpbmUgUnRkUmVzZXRCb2FyZChkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9CT0FSRF9SRVNFVCkKKworLyogUmVzZXQgY2hhbm5lbCBnYWluIHRhYmxlIHJlYWQgcG9pbnRlciAqLworI2RlZmluZSBSdGRSZXNldENHVChkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9DR1RfUkVTRVQpCisKKy8qIFJlc2V0IGNoYW5uZWwgZ2FpbiB0YWJsZSByZWFkIGFuZCB3cml0ZSBwb2ludGVycyAqLworI2RlZmluZSBSdGRDbGVhckNHVChkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9DR1RfQ0xFQVIpCisKKy8qIFJlc2V0IGNoYW5uZWwgZ2FpbiB0YWJsZSByZWFkIGFuZCB3cml0ZSBwb2ludGVycyAqLworI2RlZmluZSBSdGRFbmFibGVDR1QoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2ID4gMCkgPyAxIDogMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHVF9FTkFCTEUpCisKKy8qIFdyaXRlIGNoYW5uZWwgZ2FpbiB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBSdGRXcml0ZUNHVGFibGUoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9DR1RfV1JJVEUpCisKKy8qIFdyaXRlIENoYW5uZWwgR2FpbiBMYXRjaCAqLworI2RlZmluZSBSdGRXcml0ZUNHTGF0Y2goZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9DR0xfV1JJVEUpCisKKy8qIFJlc2V0IEFEQyBGSUZPICovCisjZGVmaW5lIFJ0ZEFkY0NsZWFyRmlmbyhkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9BRENfRklGT19DTEVBUikKKworLyogU2V0IEFEQyBzdGFydCBjb252ZXJzaW9uIHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9BRENfQ09OVkVSU0lPTikKKworLyogU2V0IGJ1cnN0IHN0YXJ0IHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZEJ1cnN0U3RhcnRTb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9CVVJTVF9TVEFSVCkKKworLyogU2V0IFBhY2VyIHN0YXJ0IHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZFBhY2VyU3RhcnRTb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9QQUNFUl9TVEFSVCkKKworLyogU2V0IFBhY2VyIHN0b3Agc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkUGFjZXJTdG9wU291cmNlKGRldix2KSBcCisgICAgd3JpdGVsICh2LCBkZXZwcml2LT5sYXMwK0xBUzBfUEFDRVJfU1RPUCkKKworLyogU2V0IFBhY2VyIGNsb2NrIHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpIDA9ZXh0ZXJuYWwgMT1pbnRlcm5hbCAqLworI2RlZmluZSBSdGRQYWNlckNsb2NrU291cmNlKGRldix2KSBcCisgICAgd3JpdGVsICgodiA+IDApID8gMSA6IDAsIGRldnByaXYtPmxhczArTEFTMF9QQUNFUl9TRUxFQ1QpCisKKy8qIFNldCBzYW1wbGUgY291bnRlciBzb3VyY2Ugc2VsZWN0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRBZGNTYW1wbGVDb3VudGVyU291cmNlKGRldix2KSBcCisgICAgd3JpdGVsICh2LCBkZXZwcml2LT5sYXMwK0xBUzBfQURDX1NDTlRfU1JDKQorCisvKiBTZXQgUGFjZXIgdHJpZ2dlciBtb2RlIHNlbGVjdCAod3JpdGUgb25seSkgMD1zaW5nbGUgY3ljbGUsIDE9cmVwZWF0ICovCisjZGVmaW5lIFJ0ZFBhY2VyVHJpZ2dlck1vZGUoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2ID4gMCkgPyAxIDogMCwgZGV2cHJpdi0+bGFzMCtMQVMwX1BBQ0VSX1JFUEVBVCkKKworLyogU2V0IEFib3V0IGNvdW50ZXIgc3RvcCBlbmFibGUgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZEFib3V0U3RvcEVuYWJsZShkZXYsdikgXAorICAgIHdyaXRlbCAoKHYgPiAwKSA/IDEgOiAwLCBkZXZwcml2LT5sYXMwK0xBUzBfQUNOVF9TVE9QX0VOQUJMRSkKKworLyogU2V0IGV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkgKHdyaXRlIG9ubHkpIDA9cG9zaXRpdmUgZWRnZSwgMT1uZWdhdGl2ZSAqLworI2RlZmluZSBSdGRUcmlnZ2VyUG9sYXJpdHkoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2ID4gMCkgPyAxIDogMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0VUUkdfUE9MQVJJVFkpCisKKy8qIFN0YXJ0IHNpbmdsZSBBREMgY29udmVyc2lvbiAqLworI2RlZmluZSBSdGRBZGNTdGFydChkZXYpIFwKKyAgICB3cml0ZXcgKDAsIGRldnByaXYtPmxhczArTEFTMF9BREMpCisKKy8qIFJlYWQgb25lIEFEQyBkYXRhIHZhbHVlICgxMmJpdCAod2l0aCBzaWduIGV4dGVuZCkgYXMgMTZiaXQpICovCisvKiBOb3RlOiBtYXRjaGVzIHdoYXQgRE1BIHdvdWxkIGdldC4gIEFjdHVhbCB2YWx1ZSA+PiAzICovCisjZGVmaW5lIFJ0ZEFkY0ZpZm9HZXQoZGV2KSBcCisgICAgcmVhZHcgKGRldnByaXYtPmxhczErTEFTMV9BRENfRklGTykKKworLyogUmVhZCB0d28gQURDIGRhdGEgdmFsdWVzIChET0VTTlQgV09SSykgKi8KKyNkZWZpbmUgUnRkQWRjRmlmb0dldDIoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczErTEFTMV9BRENfRklGTykKKworLyogRklGTyBzdGF0dXMgKi8KKyNkZWZpbmUgUnRkRmlmb1N0YXR1cyhkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX0FEQykKKworLyogcGFjZXIgc3RhcnQvc3RvcCByZWFkPXN0YXJ0LCB3cml0ZT1zdG9wKi8KKyNkZWZpbmUgUnRkUGFjZXJTdGFydChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX1BBQ0VSKQorI2RlZmluZSBSdGRQYWNlclN0b3AoZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfUEFDRVIpCisKKy8qIEludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgUnRkSW50ZXJydXB0U3RhdHVzKGRldikgXAorICAgIHJlYWR3IChkZXZwcml2LT5sYXMwK0xBUzBfSVQpCisKKy8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lIFJ0ZEludGVycnVwdE1hc2soZGV2LHYpIFwKKyAgICB3cml0ZXcgKChkZXZwcml2LT5pbnRNYXNrID0gKHYpKSxkZXZwcml2LT5sYXMwK0xBUzBfSVQpCisKKy8qIEludGVycnVwdCBzdGF0dXMgY2xlYXIgKG9ubHkgYml0cyBzZXQgaW4gbWFzaykgKi8KKyNkZWZpbmUgUnRkSW50ZXJydXB0Q2xlYXIoZGV2KSBcCisgICAgcmVhZHcgKGRldnByaXYtPmxhczArTEFTMF9DTEVBUikKKworLyogSW50ZXJydXB0IGNsZWFyIG1hc2sgKi8KKyNkZWZpbmUgUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldix2KSBcCisgICAgd3JpdGV3ICgoZGV2cHJpdi0+aW50Q2xlYXJNYXNrID0gKHYpKSwgZGV2cHJpdi0+bGFzMCtMQVMwX0NMRUFSKQorCisvKiBJbnRlcnJ1cHQgb3ZlcnJ1biBzdGF0dXMgKi8KKyNkZWZpbmUgUnRkSW50ZXJydXB0T3ZlcnJ1blN0YXR1cyhkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX09WRVJSVU4pCisKKy8qIEludGVycnVwdCBvdmVycnVuIGNsZWFyICovCisjZGVmaW5lIFJ0ZEludGVycnVwdE92ZXJydW5DbGVhcihkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9PVkVSUlVOKQorCisvKiBQYWNlciBjb3VudGVyLCAyNGJpdCAqLworI2RlZmluZSBSdGRQYWNlckNvdW50KGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfUENMSykKKyNkZWZpbmUgUnRkUGFjZXJDb3VudGVyKGRldix2KSBcCisgICAgd3JpdGVsICgodikgJiAweGZmZmZmZixkZXZwcml2LT5sYXMwK0xBUzBfUENMSykKKworLyogQnVyc3QgY291bnRlciwgMTBiaXQgKi8KKyNkZWZpbmUgUnRkQnVyc3RDb3VudChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX0JDTEspCisjZGVmaW5lIFJ0ZEJ1cnN0Q291bnRlcihkZXYsdikgXAorICAgIHdyaXRlbCAoKHYpICYgMHgzZmYsZGV2cHJpdi0+bGFzMCtMQVMwX0JDTEspCisKKy8qIERlbGF5IGNvdW50ZXIsIDE2Yml0ICovCisjZGVmaW5lIFJ0ZERlbGF5Q291bnQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9EQ0xLKQorI2RlZmluZSBSdGREZWxheUNvdW50ZXIoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2KSAmIDB4ZmZmZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0RDTEspCisKKy8qIEFib3V0IGNvdW50ZXIsIDE2Yml0ICovCisjZGVmaW5lIFJ0ZEFib3V0Q291bnQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9BQ05UKQorI2RlZmluZSBSdGRBYm91dENvdW50ZXIoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2KSAmIDB4ZmZmZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0FDTlQpCisKKy8qIEFEQyBzYW1wbGUgY291bnRlciwgMTBiaXQgKi8KKyNkZWZpbmUgUnRkQWRjU2FtcGxlQ291bnQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9BRENfU0NOVCkKKyNkZWZpbmUgUnRkQWRjU2FtcGxlQ291bnRlcihkZXYsdikgXAorICAgIHdyaXRlbCAoKHYpICYgMHgzZmYsIGRldnByaXYtPmxhczArTEFTMF9BRENfU0NOVCkKKworLyogVXNlciBUaW1lci9Db3VudGVyICg4MjU0KSAqLworI2RlZmluZSBSdGRVdGNDb3VudGVyR2V0KGRldixuKSBcCisgICAgcmVhZGIgKGRldnByaXYtPmxhczAgXAorICAgICAgICArICgobiA8PSAwKSA/IExBUzBfVVRDMCA6ICgoMSA9PSBuKSA/IExBUzBfVVRDMSA6IExBUzBfVVRDMikpKQorCisjZGVmaW5lIFJ0ZFV0Y0NvdW50ZXJQdXQoZGV2LG4sdikgXAorICAgIHdyaXRlYiAoKHYpICYgMHhmZiwgZGV2cHJpdi0+bGFzMCBcCisgICAgICAgICsgKChuIDw9IDApID8gTEFTMF9VVEMwIDogKCgxID09IG4pID8gTEFTMF9VVEMxIDogTEFTMF9VVEMyKSkpCisKKy8qIFNldCBVVEMgKDgyNTQpIGNvbnRyb2wgYnl0ZSAgKi8KKyNkZWZpbmUgUnRkVXRjQ3RybFB1dChkZXYsbix2KSBcCisgICAgd3JpdGViIChkZXZwcml2LT51dGNDdHJsWyhuKSAmIDNdID0gKCgobikgJiAzKSA8PCA2KSB8ICgodikgJiAweDNmKSwgXAorICAgICAgZGV2cHJpdi0+bGFzMCArIExBUzBfVVRDX0NUUkwpCisKKy8qIFNldCBVVENuIGNsb2NrIHNvdXJjZSAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkVXRjQ2xvY2tTb3VyY2UoZGV2LG4sdikgXAorICAgIHdyaXRldyAodiwgZGV2cHJpdi0+bGFzMCBcCisgICAgICAgICsgKChuIDw9IDApID8gTEFTMF9VVEMwX0NMT0NLIDogXAorICAgICAgICAgICAoKDEgPT0gbikgPyBMQVMwX1VUQzFfQ0xPQ0sgOiBMQVMwX1VUQzJfQ0xPQ0spKSkKKworLyogU2V0IFVUQ24gZ2F0ZSBzb3VyY2UgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZFV0Y0dhdGVTb3VyY2UoZGV2LG4sdikgXAorICAgIHdyaXRldyAodiwgZGV2cHJpdi0+bGFzMCBcCisgICAgICAgICsgKChuIDw9IDApID8gTEFTMF9VVEMwX0dBVEUgOiBcCisgICAgICAgICAgICgoMSA9PSBuKSA/IExBUzBfVVRDMV9HQVRFIDogTEFTMF9VVEMyX0dBVEUpKSkKKworLyogVXNlciBvdXRwdXQgTiBzb3VyY2Ugc2VsZWN0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRVc3JPdXRTb3VyY2UoZGV2LG4sdikgXAorICAgIHdyaXRlbCAodixkZXZwcml2LT5sYXMwKygobiA8PSAwKSA/IExBUzBfVU9VVDBfU0VMRUNUIDogTEFTMF9VT1VUMV9TRUxFQ1QpKQorCisvKiBEaWdpdGFsIElPICovCisjZGVmaW5lIFJ0ZERpbzBSZWFkKGRldikgXAorICAgIChyZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0RJTzApICYgMHhmZikKKyNkZWZpbmUgUnRkRGlvMFdyaXRlKGRldix2KSBcCisgICAgd3JpdGV3ICgodikgJiAweGZmLCBkZXZwcml2LT5sYXMwK0xBUzBfRElPMCkKKworI2RlZmluZSBSdGREaW8xUmVhZChkZXYpIFwKKyAgICAocmVhZHcgKGRldnByaXYtPmxhczArTEFTMF9ESU8xKSAmIDB4ZmYpCisjZGVmaW5lIFJ0ZERpbzFXcml0ZShkZXYsdikgXAorICAgIHdyaXRldyAoKHYpICYgMHhmZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0RJTzEpCisKKyNkZWZpbmUgUnRkRGlvU3RhdHVzUmVhZChkZXYpIFwKKyAgICAocmVhZHcgKGRldnByaXYtPmxhczArTEFTMF9ESU9fU1RBVFVTKSAmIDB4ZmYpCisjZGVmaW5lIFJ0ZERpb1N0YXR1c1dyaXRlKGRldix2KSBcCisgICAgd3JpdGV3ICgoZGV2cHJpdi0+ZGlvU3RhdHVzID0gKHYpKSwgZGV2cHJpdi0+bGFzMCtMQVMwX0RJT19TVEFUVVMpCisKKyNkZWZpbmUgUnRkRGlvMEN0cmxSZWFkKGRldikgXAorICAgIChyZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0RJTzBfQ1RSTCkgJiAweGZmKQorI2RlZmluZSBSdGREaW8wQ3RybFdyaXRlKGRldix2KSBcCisgICAgd3JpdGV3ICgodikgJiAweGZmLCBkZXZwcml2LT5sYXMwK0xBUzBfRElPMF9DVFJMKQorCisvKiBEaWdpdGFsIHRvIEFuYWxvZyBjb252ZXJ0ZXIgKi8KKy8qIFdyaXRlIG9uZSBkYXRhIHZhbHVlIChzaWduICsgMTJiaXQgKyBtYXJrZXIgYml0cykgKi8KKy8qIE5vdGU6IG1hdGNoZXMgd2hhdCBETUEgd291bGQgcHV0LiAgQWN0dWFsIHZhbHVlIDw8IDMgKi8KKyNkZWZpbmUgUnRkRGFjRmlmb1B1dChkZXYsbix2KSBcCisgICAgd3JpdGV3ICgodiksIGRldnByaXYtPmxhczEgKygoKG4pID09IDApID8gTEFTMV9EQUMxX0ZJRk8gOiBMQVMxX0RBQzJfRklGTykpCisKKy8qIFN0YXJ0IHNpbmdsZSBEQUMgY29udmVyc2lvbiAqLworI2RlZmluZSBSdGREYWNVcGRhdGUoZGV2LG4pIFwKKyAgICB3cml0ZXcgKDAsIGRldnByaXYtPmxhczAgKygoKG4pID09IDApID8gTEFTMF9EQUMxIDogTEFTMF9EQUMyKSkKKworLyogU3RhcnQgc2luZ2xlIERBQyBjb252ZXJzaW9uIG9uIGJvdGggREFDcyAqLworI2RlZmluZSBSdGREYWNCb3RoVXBkYXRlKGRldikgXAorICAgIHdyaXRldyAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0RBQykKKworLyogU2V0IERBQyBvdXRwdXQgdHlwZSBhbmQgcmFuZ2UgKi8KKyNkZWZpbmUgUnRkRGFjUmFuZ2UoZGV2LG4sdikgXAorICAgIHdyaXRldyAoKHYpICYgNywgZGV2cHJpdi0+bGFzMCBcCisJKygoKG4pID09IDApID8gTEFTMF9EQUMxX0NUUkwgOiBMQVMwX0RBQzJfQ1RSTCkpCisKKy8qIFJlc2V0IERBQyBGSUZPICovCisjZGVmaW5lIFJ0ZERhY0NsZWFyRmlmbyhkZXYsbikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCsoKChuKSA9PSAwKSA/IExBUzBfREFDMV9SRVNFVCA6IExBUzBfREFDMl9SRVNFVCkpCisKKy8qIFNldCBzb3VyY2UgZm9yIERNQSAwICh3cml0ZSBvbmx5LCBzaGFkb3c/KSAqLworI2RlZmluZSBSdGREbWEwU291cmNlKGRldixuKSBcCisgICAgd3JpdGVsICgobikgJiAweGYsIGRldnByaXYtPmxhczArTEFTMF9ETUEwX1NSQykKKworLyogU2V0IHNvdXJjZSBmb3IgRE1BIDEgKHdyaXRlIG9ubHksIHNoYWRvdz8pICovCisjZGVmaW5lIFJ0ZERtYTFTb3VyY2UoZGV2LG4pIFwKKyAgICB3cml0ZWwgKChuKSAmIDB4ZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0RNQTFfU1JDKQorCisvKiBSZXNldCBib2FyZCBzdGF0ZSBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hMFJlc2V0KGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0RNQTBfUkVTRVQpCisKKy8qIFJlc2V0IGJvYXJkIHN0YXRlIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExUmVzZXQoZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfRE1BMV9TUkMpCisKKy8qIFBMWDkwODAgaW50ZXJydXB0IG1hc2sgYW5kIHN0YXR1cyAqLworI2RlZmluZSBSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sY2ZnK0xDRkdfSVRDU1IpCisjZGVmaW5lIFJ0ZFBseEludGVycnVwdFdyaXRlKGRldix2KSBcCisgICAgd3JpdGVsICh2LCBkZXZwcml2LT5sY2ZnK0xDRkdfSVRDU1IpCisKKy8qIFNldCAgbW9kZSBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hME1vZGUoZGV2LG0pIFwKKyAgICB3cml0ZWwgKChtKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQU1PREUwKQorCisvKiBTZXQgUENJIGFkZHJlc3MgZm9yIERNQSAwICovCisjZGVmaW5lIFJ0ZERtYTBQY2lBZGRyKGRldixhKSBcCisgICAgd3JpdGVsICgoYSksIGRldnByaXYtPmxjZmcrTENGR19ETUFQQURSMCkKKworLyogU2V0IGxvY2FsIGFkZHJlc3MgZm9yIERNQSAwICovCisjZGVmaW5lIFJ0ZERtYTBMb2NhbEFkZHIoZGV2LGEpIFwKKyAgICB3cml0ZWwgKChhKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQUxBRFIwKQorCisvKiBTZXQgYnl0ZSBjb3VudCBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hMENvdW50KGRldixjKSBcCisgICAgd3JpdGVsICgoYyksIGRldnByaXYtPmxjZmcrTENGR19ETUFTSVowKQorCisvKiBTZXQgbmV4dCBkZXNjcmlwdG9yIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwTmV4dChkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BRFBSMCkKKworLyogU2V0ICBtb2RlIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExTW9kZShkZXYsbSkgXAorICAgIHdyaXRlbCAoKG0pLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BTU9ERTEpCisKKy8qIFNldCBQQ0kgYWRkcmVzcyBmb3IgRE1BIDEgKi8KKyNkZWZpbmUgUnRkRG1hMVBjaUFkZHIoZGV2LGEpIFwKKyAgICB3cml0ZWwgKChhKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQUFEUjEpCisKKy8qIFNldCBsb2NhbCBhZGRyZXNzIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExTG9jYWxBZGRyKGRldixhKSBcCisgICAgd3JpdGVsICgoYSksIGRldnByaXYtPmxjZmcrTENGR19ETUFMQURSMSkKKworLyogU2V0IGJ5dGUgY291bnQgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFDb3VudChkZXYsYykgXAorICAgIHdyaXRlbCAoKGMpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BU0laMSkKKworLyogU2V0IG5leHQgZGVzY3JpcHRvciBmb3IgRE1BIDEgKi8KKyNkZWZpbmUgUnRkRG1hMU5leHQoZGV2LGEpIFwKKyAgICB3cml0ZWwgKChhKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQURQUjEpCisKKy8qIFNldCBjb250cm9sIGZvciBETUEgMCAod3JpdGUgb25seSwgc2hhZG93PykgKi8KKyNkZWZpbmUgUnRkRG1hMENvbnRyb2woZGV2LG4pIFwKKyAgICB3cml0ZWIgKGRldnByaXYtPmRtYTBDb250cm9sID0gKG4pLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BQ1NSMCkKKworLyogR2V0IHN0YXR1cyBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hMFN0YXR1cyhkZXYpIFwKKyAgICByZWFkYiAoZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQUNTUjApCisKKy8qIFNldCBjb250cm9sIGZvciBETUEgMSAod3JpdGUgb25seSwgc2hhZG93PykgKi8KKyNkZWZpbmUgUnRkRG1hMUNvbnRyb2woZGV2LG4pIFwKKyAgICB3cml0ZWIgKGRldnByaXYtPmRtYTFDb250cm9sID0gKG4pLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BQ1NSMSkKKworLyogR2V0IHN0YXR1cyBmb3IgRE1BIDEgKi8KKyNkZWZpbmUgUnRkRG1hMVN0YXR1cyhkZXYpIFwKKyAgICByZWFkYiAoZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQUNTUjEpCisKKy8qCisgKiBUaGUgY29tZWRpX2RyaXZlciBzdHJ1Y3R1cmUgdGVsbHMgdGhlIENvbWVkaSBjb3JlIG1vZHVsZQorICogd2hpY2ggZnVuY3Rpb25zIHRvIGNhbGwgdG8gY29uZmlndXJlL2RlY29uZmlndXJlIChhdHRhYy9kZXRhY2gpCisgKiB0aGUgYm9hcmQsIGFuZCBhbHNvIGFib3V0IHRoZSBrZXJuZWwgbW9kdWxlIHRoYXQgY29udGFpbnMKKyAqIHRoZSBkZXZpY2UgY29kZS4KKyAqLworc3RhdGljIGludCBydGRfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCk7CitzdGF0aWMgaW50IHJ0ZF9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldik7CisKK3N0YXRpYyBjb21lZGlfZHJpdmVyIHJ0ZDUyMERyaXZlciA9IHsKKyAgICAgIGRyaXZlcl9uYW1lOiBEUlZfTkFNRSwKKyAgICAgIG1vZHVsZTpUSElTX01PRFVMRSwKKyAgICAgIGF0dGFjaDpydGRfYXR0YWNoLAorICAgICAgZGV0YWNoOnJ0ZF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IHJ0ZF9haV9yaW5zbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHJ0ZF9hb193aW5zbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHJ0ZF9hb19yaW5zbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHJ0ZF9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHJ0ZF9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQpOworc3RhdGljIGludCBydGRfYWlfY21kKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKK3N0YXRpYyBpbnQgcnRkX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcyk7CisvL3N0YXRpYyBpbnQgcnRkX2FpX3BvbGwgKGNvbWVkaV9kZXZpY2UgKmRldixjb21lZGlfc3ViZGV2aWNlICpzKTsKK3N0YXRpYyBpbnQgcnRkX25zX3RvX3RpbWVyKHVuc2lnbmVkIGludCAqbnMsIGludCByb3VuZE1vZGUpOworc3RhdGljIGlycXJldHVybl90IHJ0ZF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCBQVF9SRUdTX0FSRyk7CitzdGF0aWMgaW50IHJ0ZDUyMF9wcm9iZV9maWZvX2RlcHRoKGNvbWVkaV9kZXZpY2UgKmRldik7CisKKy8qCisgKiBBdHRhY2ggaXMgY2FsbGVkIGJ5IHRoZSBDb21lZGkgY29yZSB0byBjb25maWd1cmUgdGhlIGRyaXZlcgorICogZm9yIGEgcGFydGljdWxhciBib2FyZC4gIElmIHlvdSBzcGVjaWZpZWQgYSBib2FyZF9uYW1lIGFycmF5CisgKiBpbiB0aGUgZHJpdmVyIHN0cnVjdHVyZSwgZGV2LT5ib2FyZF9wdHIgY29udGFpbnMgdGhhdAorICogYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBydGRfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sJCQkJLyogYm9hcmQgbmFtZSBhbmQgb3B0aW9ucyBmbGFncyAqLworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwlpbnQgcmV0OworCXJlc291cmNlX3NpemVfdCBwaHlzTGFzMDsJLyogY29uZmlndWF0aW9uICovCisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMxOwkvKiBkYXRhIGFyZWEgKi8KKwlyZXNvdXJjZV9zaXplX3QgcGh5c0xjZmc7CS8qIFBMWDkwODAgKi8KKyNpZmRlZiBVU0VfRE1BCisJaW50IGluZGV4OworI2VuZGlmCisKKwlwcmludGsoImNvbWVkaSVkOiBydGQ1MjAgYXR0YWNoaW5nLlxuIiwgZGV2LT5taW5vcik7CisKKyNpZiBkZWZpbmVkIChDT05GSUdfQ09NRURJX0RFQlVHKSAmJiBkZWZpbmVkIChVU0VfRE1BKQorCS8qIFlvdSBjYW4gc2V0IHRoaXMgYSBsb2FkIHRpbWU6IG1vZHByb2JlIGNvbWVkaSBjb21lZGlfZGVidWc9MSAqLworCWlmICgwID09IGNvbWVkaV9kZWJ1ZykJLyogZm9yY2UgRE1BIGRlYnVnIHByaW50a3MgKi8KKwkJY29tZWRpX2RlYnVnID0gMTsKKyNlbmRpZgorCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgYXJlYS4gIGFsbG9jX3ByaXZhdGUoKSBpcyBhCisJICogY29udmVuaWVudCBtYWNybyBkZWZpbmVkIGluIGNvbWVkaWRldi5oLgorCSAqLworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHJ0ZFByaXZhdGUpKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBQcm9iZSB0aGUgZGV2aWNlIHRvIGRldGVybWluZSB3aGF0IGRldmljZSBpbiB0aGUgc2VyaWVzIGl0IGlzLgorCSAqLworCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9SVEQsIFBDSV9BTllfSUQsIE5VTEwpOworCQlwY2lkZXYgIT0gTlVMTDsKKwkJcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9SVEQsIFBDSV9BTllfSUQsIHBjaWRldikpIHsKKwkJaW50IGk7CisKKwkJaWYgKGl0LT5vcHRpb25zWzBdIHx8IGl0LT5vcHRpb25zWzFdKSB7CisJCQlpZiAocGNpZGV2LT5idXMtPm51bWJlciAhPSBpdC0+b3B0aW9uc1swXQorCQkJCXx8IFBDSV9TTE9UKHBjaWRldi0+ZGV2Zm4pICE9CisJCQkJaXQtPm9wdGlvbnNbMV0pIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlmb3IoaSA9IDA7IGkgPCBzaXplb2YocnRkNTIwQm9hcmRzKSAvIHNpemVvZihydGQ1MjBCb2FyZHNbMF0pOyArK2kpCisJCXsKKwkJCWlmKHBjaWRldi0+ZGV2aWNlID09IHJ0ZDUyMEJvYXJkc1tpXS5kZXZpY2VfaWQpCisJCQl7CisJCQkJZGV2LT5ib2FyZF9wdHIgPSAmcnRkNTIwQm9hcmRzW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmKGRldi0+Ym9hcmRfcHRyKSBicmVhazsJLyogZm91bmQgb25lICovCisJfQorCWlmICghcGNpZGV2KSB7CisJCWlmIChpdC0+b3B0aW9uc1swXSAmJiBpdC0+b3B0aW9uc1sxXSkgeworCQkJcHJpbnRrKCJObyBSVEQgY2FyZCBhdCBidXM9JWQgc2xvdD0lZC5cbiIsCisJCQkJaXQtPm9wdGlvbnNbMF0sIGl0LT5vcHRpb25zWzFdKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiTm8gUlREIGNhcmQgZm91bmQuXG4iKTsKKwkJfQorCQlyZXR1cm4gLUVJTzsKKwl9CisJZGV2cHJpdi0+cGNpX2RldiA9IHBjaWRldjsKKwlkZXYtPmJvYXJkX25hbWUgPSB0aGlzYm9hcmQtPm5hbWU7CisKKwlpZiAoKHJldCA9IGNvbWVkaV9wY2lfZW5hYmxlKHBjaWRldiwgRFJWX05BTUUpKSA8IDApIHsKKwkJcHJpbnRrKCJGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucy5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZwcml2LT5nb3RfcmVnaW9ucyA9IDE7CisKKwkvKgorCSAqIEluaXRpYWxpemUgYmFzZSBhZGRyZXNzZXMKKwkgKi8KKwkvKiBHZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZnJvbSBQQ0kgY29uZmlnICovCisJcGh5c0xhczAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cHJpdi0+cGNpX2RldiwgTEFTMF9QQ0lJTkRFWCk7CisJcGh5c0xhczEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cHJpdi0+cGNpX2RldiwgTEFTMV9QQ0lJTkRFWCk7CisJcGh5c0xjZmcgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cHJpdi0+cGNpX2RldiwgTENGR19QQ0lJTkRFWCk7CisJLyogTm93IGhhdmUgdGhlIGtlcm5lbCBtYXAgdGhpcyBpbnRvIG1lbW9yeSAqLworCS8qIEFTU1VNRSBwYWdlIGFsaWduZWQgKi8KKwlkZXZwcml2LT5sYXMwID0gaW9yZW1hcF9ub2NhY2hlKHBoeXNMYXMwLCBMQVMwX1BDSVNJWkUpOworCWRldnByaXYtPmxhczEgPSBpb3JlbWFwX25vY2FjaGUocGh5c0xhczEsIExBUzFfUENJU0laRSk7CisJZGV2cHJpdi0+bGNmZyA9IGlvcmVtYXBfbm9jYWNoZShwaHlzTGNmZywgTENGR19QQ0lTSVpFKTsKKworCWlmICghZGV2cHJpdi0+bGFzMCB8fCAhZGV2cHJpdi0+bGFzMSB8fCAhZGV2cHJpdi0+bGNmZykgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlEUFJJTlRLKCIlczogTEFTMD0lbGx4LCBMQVMxPSVsbHgsIENGRz0lbGx4LlxuIiwgZGV2LT5ib2FyZF9uYW1lLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXBoeXNMYXMwLCAodW5zaWduZWQgbG9uZyBsb25nKXBoeXNMYXMxLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXBoeXNMY2ZnKTsKKwl7CQkJLyogVGhlIFJURCBkcml2ZXIgZG9lcyB0aGlzICovCisJCXVuc2lnbmVkIGNoYXIgcGNpX2xhdGVuY3k7CisJCXUxNiByZXZpc2lvbjsKKwkJLyp1aW50MzJfdCBlcGxkX3ZlcnNpb247ICovCisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2cHJpdi0+cGNpX2RldiwgUENJX1JFVklTSU9OX0lELAorCQkJJnJldmlzaW9uKTsKKwkJRFBSSU5USygiJXM6IFBDSSByZXZpc2lvbiAlZC5cbiIsIGRldi0+Ym9hcmRfbmFtZSwgcmV2aXNpb24pOworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldnByaXYtPnBjaV9kZXYsCisJCQlQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KTsKKwkJaWYgKHBjaV9sYXRlbmN5IDwgMzIpIHsKKwkJCXByaW50aygiJXM6IFBDSSBsYXRlbmN5IGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQlkZXYtPmJvYXJkX25hbWUsIHBjaV9sYXRlbmN5LCAzMik7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2cHJpdi0+cGNpX2RldiwKKwkJCQlQQ0lfTEFURU5DWV9USU1FUiwgMzIpOworCQl9IGVsc2UgeworCQkJRFBSSU5USygicnRkNTIwOiBQQ0kgbGF0ZW5jeSA9ICVkXG4iLCBwY2lfbGF0ZW5jeSk7CisJCX0KKworCQkvKiBVbmRvY3VtZW50ZWQgRVBMRCB2ZXJzaW9uIChkb2VzbnQgbWF0Y2ggUlREIGRyaXZlciByZXN1bHRzKSAqLworCQkvKkRQUklOVEsgKCJydGQ1MjA6IFJlYWRpbmcgZXBsZCBmcm9tICVwXG4iLAorCQkgICBkZXZwcml2LT5sYXMwKzApOworCQkgICBlcGxkX3ZlcnNpb24gPSByZWFkbCAoZGV2cHJpdi0+bGFzMCswKTsKKwkJICAgaWYgKChlcGxkX3ZlcnNpb24gJiAweEYwKSA+PiA0ID09IDB4MEYpIHsKKwkJICAgRFBSSU5USygicnRkNTIwOiBwcmUtdjggRVBMRC4gKCV4KVxuIiwgZXBsZF92ZXJzaW9uKTsKKwkJICAgfSBlbHNlIHsKKwkJICAgRFBSSU5USygicnRkNTIwOiBFUExEIHZlcnNpb24gJXguXG4iLCBlcGxkX3ZlcnNpb24gPj4gNCk7CisJCSAgIH0gKi8KKwl9CisKKwkvKiBTaG93IGJvYXJkIGNvbmZpZ3VyYXRpb24gKi8KKwlwcmludGsoIiVzOiIsIGRldi0+Ym9hcmRfbmFtZSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlcy4gIGFsbG9jX3N1YmRldmljZSgpIGlzIGEKKwkgKiBjb252ZW5pZW50IG1hY3JvIGRlZmluZWQgaW4gY29tZWRpZGV2LmguCisJICovCisJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCA0KSA8IDApIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJLyogYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwlzLT5zdWJkZXZfZmxhZ3MgPQorCQlTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NPTU1PTiB8IFNERl9ESUZGIHwKKwkJU0RGX0NNRF9SRUFEOworCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YWlDaGFuczsKKwlzLT5tYXhkYXRhID0gKDEgPDwgdGhpc2JvYXJkLT5haUJpdHMpIC0gMTsKKwlpZiAodGhpc2JvYXJkLT5haU1heEdhaW4gPD0gMzIpIHsKKwkJcy0+cmFuZ2VfdGFibGUgPSAmcnRkX2FpXzc1MjBfcmFuZ2U7CisJfSBlbHNlIHsKKwkJcy0+cmFuZ2VfdGFibGUgPSAmcnRkX2FpXzQ1MjBfcmFuZ2U7CisJfQorCXMtPmxlbl9jaGFubGlzdCA9IFJURF9NQVhfQ0hBTkxJU1Q7CS8qIGRldnByaXYtPmZpZm9MZW4gKi8KKwlzLT5pbnNuX3JlYWQgPSBydGRfYWlfcmluc247CisJcy0+ZG9fY21kID0gcnRkX2FpX2NtZDsKKwlzLT5kb19jbWR0ZXN0ID0gcnRkX2FpX2NtZHRlc3Q7CisJcy0+Y2FuY2VsID0gcnRkX2FpX2NhbmNlbDsKKwkvKnMtPnBvbGwgPSBydGRfYWlfcG9sbDsgKi8vKiBub3QgcmVhZHkgeWV0ICovCisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKwkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuID0gMjsKKwlzLT5tYXhkYXRhID0gKDEgPDwgdGhpc2JvYXJkLT5haUJpdHMpIC0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZydGRfYW9fcmFuZ2U7CisJcy0+aW5zbl93cml0ZSA9IHJ0ZF9hb193aW5zbjsKKwlzLT5pbnNuX3JlYWQgPSBydGRfYW9fcmluc247CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKwkvKiBkaWdpdGFsIGkvbyBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwkvKiB3ZSBvbmx5IHN1cHBvcnQgcG9ydCAwIHJpZ2h0IG5vdy4gIElnbm9yaW5nIHBvcnQgMSBhbmQgdXNlciBJTyAqLworCXMtPm5fY2hhbiA9IDg7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMgPSBydGRfZGlvX2luc25fYml0czsKKwlzLT5pbnNuX2NvbmZpZyA9IHJ0ZF9kaW9faW5zbl9jb25maWc7CisKKwkvKiB0aW1lci9jb3VudGVyIHN1YmRldmljZXMgKG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKSAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4gPSAzOworCXMtPm1heGRhdGEgPSAweGZmZmY7CisKKwkvKiBpbml0aWFsaXplIGJvYXJkLCBwZXIgUlREIHNwZWMgKi8KKwkvKiBhbHNvLCBpbml0aWFsaXplIHNoYWRvdyByZWdpc3RlcnMgKi8KKwlSdGRSZXNldEJvYXJkKGRldik7CisJY29tZWRpX3VkZWxheSgxMDApOwkvKiBuZWVkZWQ/ICovCisJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LCAwKTsKKwlSdGRJbnRlcnJ1cHRNYXNrKGRldiwgMCk7CS8qIGFuZCBzZXRzIHNoYWRvdyAqLworCVJ0ZEludGVycnVwdENsZWFyTWFzayhkZXYsIH4wKTsJLyogYW5kIHNldHMgc2hhZG93ICovCisJUnRkSW50ZXJydXB0Q2xlYXIoZGV2KTsJLyogY2xlYXJzIGJpdHMgc2V0IGJ5IG1hc2sgKi8KKwlSdGRJbnRlcnJ1cHRPdmVycnVuQ2xlYXIoZGV2KTsKKwlSdGRDbGVhckNHVChkZXYpOworCVJ0ZEFkY0NsZWFyRmlmbyhkZXYpOworCVJ0ZERhY0NsZWFyRmlmbyhkZXYsIDApOworCVJ0ZERhY0NsZWFyRmlmbyhkZXYsIDEpOworCS8qIGNsZWFyIGRpZ2l0YWwgSU8gZmlmbyAqLworCVJ0ZERpb1N0YXR1c1dyaXRlKGRldiwgMCk7CS8qIHNhZmUgc3RhdGUsIHNldCBzaGFkb3cgKi8KKwlSdGRVdGNDdHJsUHV0KGRldiwgMCwgMHgzMCk7CS8qIHNhZmUgc3RhdGUsIHNldCBzaGFkb3cgKi8KKwlSdGRVdGNDdHJsUHV0KGRldiwgMSwgMHgzMCk7CS8qIHNhZmUgc3RhdGUsIHNldCBzaGFkb3cgKi8KKwlSdGRVdGNDdHJsUHV0KGRldiwgMiwgMHgzMCk7CS8qIHNhZmUgc3RhdGUsIHNldCBzaGFkb3cgKi8KKwlSdGRVdGNDdHJsUHV0KGRldiwgMywgMCk7CS8qIHNhZmUgc3RhdGUsIHNldCBzaGFkb3cgKi8KKwkvKiBUT0RPOiBzZXQgdXNlciBvdXQgc291cmNlID8/PyAqLworCisJLyogY2hlY2sgaWYgb3VyIGludGVycnVwdCBpcyBhdmFpbGFibGUgYW5kIGdldCBpdCAqLworCWlmICgocmV0ID0gY29tZWRpX3JlcXVlc3RfaXJxKGRldnByaXYtPnBjaV9kZXYtPmlycSwgcnRkX2ludGVycnVwdCwKKwkJCQlJUlFGX1NIQVJFRCwgRFJWX05BTUUsIGRldikpIDwgMCkgeworCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgaW50ZXJydXB0ISAoJXUpXG4iLAorCQkJZGV2cHJpdi0+cGNpX2Rldi0+aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGV2LT5pcnEgPSBkZXZwcml2LT5wY2lfZGV2LT5pcnE7CisJcHJpbnRrKCIoIGlycT0ldSApIiwgZGV2LT5pcnEpOworCisJcmV0ID0gcnRkNTIwX3Byb2JlX2ZpZm9fZGVwdGgoZGV2KTsKKwlpZihyZXQgPCAwKSB7CisJCXJldHVybiByZXQ7CisJfQorCWRldnByaXYtPmZpZm9MZW4gPSByZXQ7CisJcHJpbnRrKCIoIGZpZm9MZW49JWQgKSIsIGRldnByaXYtPmZpZm9MZW4pOworCisjaWZkZWYgVVNFX0RNQQorCWlmIChkZXYtPmlycSA+IDApIHsKKwkJcHJpbnRrKCIoIERNQSBidWZmPSVkIClcbiIsIERNQV9DSEFJTl9DT1VOVCk7CisJCS8qIFRoZSBQTFg5MDgwIGhhcyAyIERNQSBjb250cm9sbGVycywgYnV0IHRoZXJlIGNvdWxkIGJlIDQgc291cmNlczoKKwkJICAgQURDLCBkaWdpdGFsLCBEQUMxLCBhbmQgREFDMi4gIFNpbmNlIG9ubHkgdGhlIEFEQyBzdXBwb3J0cyBjbWQgbW9kZQorCQkgICByaWdodCBub3csIHRoaXMgaXNuJ3QgYW4gaXNzdWUgKHlldCkgKi8KKwkJZGV2cHJpdi0+ZG1hME9mZnNldCA9IDA7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgRE1BX0NIQUlOX0NPVU5UOyBpbmRleCsrKSB7CisJCQlkZXZwcml2LT5kbWEwQnVmZltpbmRleF0gPQorCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQkJc2l6ZW9mKHUxNikgKiBkZXZwcml2LT5maWZvTGVuIC8gMiwKKwkJCQkmZGV2cHJpdi0+ZG1hMEJ1ZmZQaHlzQWRkcltpbmRleF0pOworCQkJaWYgKGRldnByaXYtPmRtYTBCdWZmW2luZGV4XSA9PSBOVUxMKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIHJ0ZF9hdHRhY2hfZGllX2Vycm9yOworCQkJfQorCQkJLypEUFJJTlRLICgiYnVmZlslZF0gQCAlcCB2aXJ0dWFsLCAleCBQQ0lcbiIsCisJCQkgICBpbmRleCwKKwkJCSAgIGRldnByaXYtPmRtYTBCdWZmW2luZGV4XSwgZGV2cHJpdi0+ZG1hMEJ1ZmZQaHlzQWRkcltpbmRleF0pOyAqLworCQl9CisKKwkJLyogc2V0dXAgRE1BIGRlc2NyaXB0b3IgcmluZyAodXNlIGNwdV90b19sZTMyIGZvciBieXRlIG9yZGVyaW5nPykgKi8KKwkJZGV2cHJpdi0+ZG1hMENoYWluID0KKwkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQlzaXplb2Yoc3RydWN0IHBseF9kbWFfZGVzYykgKiBETUFfQ0hBSU5fQ09VTlQsCisJCQkmZGV2cHJpdi0+ZG1hMENoYWluUGh5c0FkZHIpOworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBETUFfQ0hBSU5fQ09VTlQ7IGluZGV4KyspIHsKKwkJCWRldnByaXYtPmRtYTBDaGFpbltpbmRleF0ucGNpX3N0YXJ0X2FkZHIgPQorCQkJCWRldnByaXYtPmRtYTBCdWZmUGh5c0FkZHJbaW5kZXhdOworCQkJZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5sb2NhbF9zdGFydF9hZGRyID0KKwkJCQlETUFMQUREUl9BREM7CisJCQlkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLnRyYW5zZmVyX3NpemUgPQorCQkJCXNpemVvZih1MTYpICogZGV2cHJpdi0+Zmlmb0xlbiAvIDI7CisJCQlkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLm5leHQgPQorCQkJCShkZXZwcml2LT5kbWEwQ2hhaW5QaHlzQWRkciArICgoaW5kZXggKworCQkJCQkJMSkgJSAoRE1BX0NIQUlOX0NPVU5UKSkKKwkJCQkqIHNpemVvZihkZXZwcml2LT5kbWEwQ2hhaW5bMF0pKQorCQkJCXwgRE1BX1RSQU5TRkVSX0JJVFM7CisJCQkvKkRQUklOVEsgKCJyaW5nWyVkXSBAJWx4IFBDSTogJXgsIGxvY2FsOiAleCwgTjogMHgleCwgbmV4dDogJXhcbiIsCisJCQkgICBpbmRleCwKKwkJCSAgICgobG9uZylkZXZwcml2LT5kbWEwQ2hhaW5QaHlzQWRkcgorCQkJICAgKyAoaW5kZXggKiBzaXplb2YoZGV2cHJpdi0+ZG1hMENoYWluWzBdKSkpLAorCQkJICAgZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5wY2lfc3RhcnRfYWRkciwKKwkJCSAgIGRldnByaXYtPmRtYTBDaGFpbltpbmRleF0ubG9jYWxfc3RhcnRfYWRkciwKKwkJCSAgIGRldnByaXYtPmRtYTBDaGFpbltpbmRleF0udHJhbnNmZXJfc2l6ZSwKKwkJCSAgIGRldnByaXYtPmRtYTBDaGFpbltpbmRleF0ubmV4dCk7ICovCisJCX0KKworCQlpZiAoZGV2cHJpdi0+ZG1hMENoYWluID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIHJ0ZF9hdHRhY2hfZGllX2Vycm9yOworCQl9CisKKwkJUnRkRG1hME1vZGUoZGV2LCBETUFfTU9ERV9CSVRTKTsKKwkJUnRkRG1hMFNvdXJjZShkZXYsIERNQVNfQURGSUZPX0hBTEZfRlVMTCk7CS8qIHNldCBETUEgdHJpZ2dlciBzb3VyY2UgKi8KKwl9IGVsc2UgeworCQlwcmludGsoIiggbm8gSVJRLT5ubyBETUEgKSIpOworCX0KKyNlbmRpZiAvKiBVU0VfRE1BICovCisKKwlpZiAoZGV2LT5pcnEpIHsJCS8qIGVuYWJsZSBwbHg5MDgwIGludGVycnVwdHMgKi8KKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LCBJQ1NfUElFIHwgSUNTX1BMSUUpOworCX0KKworCXByaW50aygiXG5jb21lZGklZDogcnRkNTIwIGRyaXZlciBhdHRhY2hlZC5cbiIsIGRldi0+bWlub3IpOworCisJcmV0dXJuIDE7CisKKyNpZiAwCisJLyogaGl0IGFuIGVycm9yLCBjbGVhbiB1cCBtZW1vcnkgYW5kIHJldHVybiByZXQgKi8KKy8vcnRkX2F0dGFjaF9kaWVfZXJyb3I6CisjaWZkZWYgVVNFX0RNQQorCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IERNQV9DSEFJTl9DT1VOVDsgaW5kZXgrKykgeworCQlpZiAoTlVMTCAhPSBkZXZwcml2LT5kbWEwQnVmZltpbmRleF0pIHsJLyogZnJlZSBidWZmZXIgbWVtb3J5ICovCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQkJc2l6ZW9mKHUxNikgKiBkZXZwcml2LT5maWZvTGVuIC8gMiwKKwkJCQlkZXZwcml2LT5kbWEwQnVmZltpbmRleF0sCisJCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZQaHlzQWRkcltpbmRleF0pOworCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoTlVMTCAhPSBkZXZwcml2LT5kbWEwQ2hhaW4pIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXZwcml2LT5wY2lfZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCBwbHhfZG1hX2Rlc2MpCisJCQkqIERNQV9DSEFJTl9DT1VOVCwKKwkJCWRldnByaXYtPmRtYTBDaGFpbiwgZGV2cHJpdi0+ZG1hMENoYWluUGh5c0FkZHIpOworCQlkZXZwcml2LT5kbWEwQ2hhaW4gPSBOVUxMOworCX0KKyNlbmRpZiAvKiBVU0VfRE1BICovCisJLyogc3ViZGV2aWNlcyBhbmQgcHJpdiBhcmUgZnJlZWQgYnkgdGhlIGNvcmUgKi8KKwlpZiAoZGV2LT5pcnEpIHsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsIFJ0ZFBseEludGVycnVwdFJlYWQoZGV2KQorCQkJJiB+KElDU19QTElFIHwgSUNTX0RNQTBfRSB8IElDU19ETUExX0UpKTsKKwkJY29tZWRpX2ZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCX0KKworCS8qIHJlbGVhc2UgYWxsIHJlZ2lvbnMgdGhhdCB3ZXJlIGFsbG9jYXRlZCAqLworCWlmIChkZXZwcml2LT5sYXMwKSB7CisJCWlvdW5tYXAoZGV2cHJpdi0+bGFzMCk7CisJfQorCWlmIChkZXZwcml2LT5sYXMxKSB7CisJCWlvdW5tYXAoZGV2cHJpdi0+bGFzMSk7CisJfQorCWlmIChkZXZwcml2LT5sY2ZnKSB7CisJCWlvdW5tYXAoZGV2cHJpdi0+bGNmZyk7CisJfQorCWlmIChkZXZwcml2LT5wY2lfZGV2KSB7CisJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBjaV9kZXYpOworCX0KKwlyZXR1cm4gcmV0OworI2VuZGlmCit9CisKKy8qCisgKiBfZGV0YWNoIGlzIGNhbGxlZCB0byBkZWNvbmZpZ3VyZSBhIGRldmljZS4gIEl0IHNob3VsZCBkZWFsbG9jYXRlCisgKiByZXNvdXJjZXMuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIHdoZW4gX2F0dGFjaCgpIGZhaWxzLCBzbyBpdCBzaG91bGQgYmUKKyAqIGNhcmVmdWwgbm90IHRvIHJlbGVhc2UgcmVzb3VyY2VzIHRoYXQgd2VyZSBub3QgbmVjZXNzYXJpbHkKKyAqIGFsbG9jYXRlZCBieSBfYXR0YWNoKCkuICBkZXYtPnByaXZhdGUgYW5kIGRldi0+c3ViZGV2aWNlcyBhcmUKKyAqIGRlYWxsb2NhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNvcmUuCisgKi8KK3N0YXRpYyBpbnQgcnRkX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworI2lmZGVmIFVTRV9ETUEKKwlpbnQgaW5kZXg7CisjZW5kaWYKKworCURQUklOVEsoImNvbWVkaSVkOiBydGQ1MjA6IHJlbW92aW5nICglbGQgaW50cylcbiIsCisJCWRldi0+bWlub3IsIChkZXZwcml2ID8gZGV2cHJpdi0+aW50Q291bnQgOiAwTCkpOworCWlmIChkZXZwcml2ICYmIGRldnByaXYtPmxjZmcpIHsKKwkJRFBSSU5USygiKGludCBzdGF0dXMgMHgleCwgb3ZlcnJ1biBzdGF0dXMgMHgleCwgZmlmbyBzdGF0dXMgMHgleCkuLi5cbiIsIDB4ZmZmZiAmIFJ0ZEludGVycnVwdFN0YXR1cyhkZXYpLCAweGZmZmYgJiBSdGRJbnRlcnJ1cHRPdmVycnVuU3RhdHVzKGRldiksICgweGZmZmYgJiBSdGRGaWZvU3RhdHVzKGRldikpIF4gMHg2NjY2KTsKKwl9CisKKwlpZiAoZGV2cHJpdikgeworCQkvKiBTaHV0IGRvd24gYW55IGJvYXJkIG9wcyBieSByZXNldHRpbmcgaXQgKi8KKyNpZmRlZiBVU0VfRE1BCisJCWlmIChkZXZwcml2LT5sY2ZnKSB7CisJCQlSdGREbWEwQ29udHJvbChkZXYsIDApOwkvKiBkaXNhYmxlIERNQSAqLworCQkJUnRkRG1hMUNvbnRyb2woZGV2LCAwKTsJLyogZGlzYWJsZSBETUEgKi8KKwkJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwgSUNTX1BJRSB8IElDU19QTElFKTsKKwkJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKwkJaWYgKGRldnByaXYtPmxhczApIHsKKwkJCVJ0ZFJlc2V0Qm9hcmQoZGV2KTsKKwkJCVJ0ZEludGVycnVwdE1hc2soZGV2LCAwKTsKKwkJCVJ0ZEludGVycnVwdENsZWFyTWFzayhkZXYsIH4wKTsKKwkJCVJ0ZEludGVycnVwdENsZWFyKGRldik7CS8qIGNsZWFycyBiaXRzIHNldCBieSBtYXNrICovCisJCX0KKyNpZmRlZiBVU0VfRE1BCisJCS8qIHJlbGVhc2UgRE1BICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IERNQV9DSEFJTl9DT1VOVDsgaW5kZXgrKykgeworCQkJaWYgKE5VTEwgIT0gZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdKSB7CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXZwcml2LT5wY2lfZGV2LAorCQkJCQlzaXplb2YodTE2KSAqIGRldnByaXYtPmZpZm9MZW4gLyAyLAorCQkJCQlkZXZwcml2LT5kbWEwQnVmZltpbmRleF0sCisJCQkJCWRldnByaXYtPmRtYTBCdWZmUGh5c0FkZHJbaW5kZXhdKTsKKwkJCQlkZXZwcml2LT5kbWEwQnVmZltpbmRleF0gPSBOVUxMOworCQkJfQorCQl9CisJCWlmIChOVUxMICE9IGRldnByaXYtPmRtYTBDaGFpbikgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXZwcml2LT5wY2lfZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgcGx4X2RtYV9kZXNjKSAqIERNQV9DSEFJTl9DT1VOVCwKKwkJCQlkZXZwcml2LT5kbWEwQ2hhaW4sIGRldnByaXYtPmRtYTBDaGFpblBoeXNBZGRyKTsKKwkJCWRldnByaXYtPmRtYTBDaGFpbiA9IE5VTEw7CisJCX0KKyNlbmRpZiAvKiBVU0VfRE1BICovCisKKwkJLyogcmVsZWFzZSBJUlEgKi8KKwkJaWYgKGRldi0+aXJxKSB7CisJCQkvKiBkaXNhYmxlIGludGVycnVwdCBjb250cm9sbGVyICovCisJCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsIFJ0ZFBseEludGVycnVwdFJlYWQoZGV2KQorCQkJCSYgfihJQ1NfUExJRSB8IElDU19ETUEwX0UgfCBJQ1NfRE1BMV9FKSk7CisJCQljb21lZGlfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCX0KKworCQkvKiByZWxlYXNlIGFsbCByZWdpb25zIHRoYXQgd2VyZSBhbGxvY2F0ZWQgKi8KKwkJaWYgKGRldnByaXYtPmxhczApIHsKKwkJCWlvdW5tYXAoZGV2cHJpdi0+bGFzMCk7CisJCX0KKwkJaWYgKGRldnByaXYtPmxhczEpIHsKKwkJCWlvdW5tYXAoZGV2cHJpdi0+bGFzMSk7CisJCX0KKwkJaWYgKGRldnByaXYtPmxjZmcpIHsKKwkJCWlvdW5tYXAoZGV2cHJpdi0+bGNmZyk7CisJCX0KKwkJaWYgKGRldnByaXYtPnBjaV9kZXYpIHsKKwkJCWlmIChkZXZwcml2LT5nb3RfcmVnaW9ucykgeworCQkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZwcml2LT5wY2lfZGV2KTsKKwkJCX0KKwkJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBjaV9kZXYpOworCQl9CisJfQorCisJcHJpbnRrKCJjb21lZGklZDogcnRkNTIwOiByZW1vdmVkLlxuIiwgZGV2LT5taW5vcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgQ29udmVydCBhIHNpbmdsZSBjb21lZGkgY2hhbm5lbC1nYWluIGVudHJ5IHRvIGEgUlRENTIwIHRhYmxlIGVudHJ5CisqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJ0ZENvbnZlcnRDaGFuR2Fpbihjb21lZGlfZGV2aWNlICogZGV2LAorCXVuc2lnbmVkIGludCBjb21lZGlDaGFuLCBpbnQgY2hhbkluZGV4KQorewkJCQkvKiBpbmRleCBpbiBjaGFubmVsIGxpc3QgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbiwgcmFuZ2UsIGFyZWY7CisJdW5zaWduZWQgc2hvcnQgciA9IDA7CisKKwljaGFuID0gQ1JfQ0hBTihjb21lZGlDaGFuKTsKKwlyYW5nZSA9IENSX1JBTkdFKGNvbWVkaUNoYW4pOworCWFyZWYgPSBDUl9BUkVGKGNvbWVkaUNoYW4pOworCisJciB8PSBjaGFuICYgMHhmOworCisJLyogTm90ZTogd2UgYWxzbyBzZXR1cCB0aGUgY2hhbm5lbCBsaXN0IGJpcG9sYXIgZmxhZyBhcnJheSAqLworCWlmIChyYW5nZSA8IHRoaXNib2FyZC0+cmFuZ2UxMFN0YXJ0KSB7CS8qIGZpcnN0IGJhdGNoIGFyZSArLTUgKi8KKwkJciB8PSAweDAwMDsJLyogKy01IHJhbmdlICovCisJCXIgfD0gKHJhbmdlICYgMHg3KSA8PCA0OwkvKiBnYWluICovCisJCUNIQU5fQVJSQVlfU0VUKGRldnByaXYtPmNoYW5CaXBvbGFyLCBjaGFuSW5kZXgpOworCX0gZWxzZSBpZiAocmFuZ2UgPCB0aGlzYm9hcmQtPnJhbmdlVW5pU3RhcnQpIHsJLyogc2Vjb25kIGJhdGNoIGFyZSArLTEwICovCisJCXIgfD0gMHgxMDA7CS8qICstMTAgcmFuZ2UgKi8KKwkJciB8PSAoKHJhbmdlIC0gdGhpc2JvYXJkLT5yYW5nZTEwU3RhcnQpICYgMHg3KSA8PCA0OwkvKiBnYWluICovCisJCUNIQU5fQVJSQVlfU0VUKGRldnByaXYtPmNoYW5CaXBvbGFyLCBjaGFuSW5kZXgpOworCX0gZWxzZSB7CQkvKiBsYXN0IGJhdGNoIGlzICsxMCAqLworCQlyIHw9IDB4MjAwOwkvKiArMTAgcmFuZ2UgKi8KKwkJciB8PSAoKHJhbmdlIC0gdGhpc2JvYXJkLT5yYW5nZVVuaVN0YXJ0KSAmIDB4NykgPDwgNDsJLyogZ2FpbiAqLworCQlDSEFOX0FSUkFZX0NMRUFSKGRldnByaXYtPmNoYW5CaXBvbGFyLCBjaGFuSW5kZXgpOworCX0KKworCXN3aXRjaCAoYXJlZikgeworCWNhc2UgQVJFRl9HUk9VTkQ6CS8qIG9uLWJvYXJkIGdyb3VuZCAqLworCQlicmVhazsKKworCWNhc2UgQVJFRl9DT01NT046CisJCXIgfD0gMHg4MDsJLyogcmVmIGV4dGVybmFsIGFuYWxvZyBjb21tb24gKi8KKwkJYnJlYWs7CisKKwljYXNlIEFSRUZfRElGRjoKKwkJciB8PSAweDQwMDsJLyogZGlmZmVyZW50aWFsIGlucHV0cyAqLworCQlicmVhazsKKworCWNhc2UgQVJFRl9PVEhFUjoJLyogPz8/ICovCisJCWJyZWFrOworCX0KKwkvKnByaW50ayAoImNoYW49JWQgcj0lZCBhPSVkIC0+IDB4JXhcbiIsCisJICAgY2hhbiwgcmFuZ2UsIGFyZWYsIHIpOyAqLworCXJldHVybiByOworfQorCisvKgorICBTZXR1cCB0aGUgY2hhbm5lbC1nYWluIHRhYmxlIGZyb20gYSBjb21lZGkgbGlzdAorKi8KK3N0YXRpYyB2b2lkIHJ0ZF9sb2FkX2NoYW5uZWxnYWluX2xpc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwl1bnNpZ25lZCBpbnQgbl9jaGFuLCB1bnNpZ25lZCBpbnQgKmxpc3QpCit7CisJaWYgKG5fY2hhbiA+IDEpIHsJLyogc2V0dXAgY2hhbm5lbCBnYWluIHRhYmxlICovCisJCWludCBpaTsKKwkJUnRkQ2xlYXJDR1QoZGV2KTsKKwkJUnRkRW5hYmxlQ0dUKGRldiwgMSk7CS8qIGVuYWJsZSB0YWJsZSAqLworCQlmb3IgKGlpID0gMDsgaWkgPCBuX2NoYW47IGlpKyspIHsKKwkJCVJ0ZFdyaXRlQ0dUYWJsZShkZXYsIHJ0ZENvbnZlcnRDaGFuR2FpbihkZXYsIGxpc3RbaWldLAorCQkJCQlpaSkpOworCQl9CisJfSBlbHNlIHsJCS8qIGp1c3QgdXNlIHRoZSBjaGFubmVsIGdhaW4gbGF0Y2ggKi8KKwkJUnRkRW5hYmxlQ0dUKGRldiwgMCk7CS8qIGRpc2FibGUgdGFibGUsIGVuYWJsZSBsYXRjaCAqLworCQlSdGRXcml0ZUNHTGF0Y2goZGV2LCBydGRDb252ZXJ0Q2hhbkdhaW4oZGV2LCBsaXN0WzBdLCAwKSk7CisJfQorfQorCisvKiBkZXRlcm1pbmUgZmlmbyBzaXplIGJ5IGRvaW5nIGFkYyBjb252ZXJzaW9ucyB1bnRpbCB0aGUgZmlmbyBoYWxmCitlbXB0eSBzdGF0dXMgZmxhZyBjbGVhcnMgKi8KK3N0YXRpYyBpbnQgcnRkNTIwX3Byb2JlX2ZpZm9fZGVwdGgoY29tZWRpX2RldmljZSAqZGV2KQoreworCWxzYW1wbF90IGNoYW5zcGVjID0gQ1JfUEFDSygwLCAwLCBBUkVGX0dST1VORCk7CisJdW5zaWduZWQgaTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgbGltaXQgPSAweDIwMDA7CisJdW5zaWduZWQgZmlmb19zaXplID0gMDsKKworCVJ0ZEFkY0NsZWFyRmlmbyhkZXYpOworCXJ0ZF9sb2FkX2NoYW5uZWxnYWluX2xpc3QoZGV2LCAxLCAmY2hhbnNwZWMpOworCVJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgKi8KKwkvKiBjb252ZXJ0ICBzYW1wbGVzICovCisJZm9yIChpID0gMDsgaSA8IGxpbWl0OyArK2kpIHsKKwkJdW5zaWduZWQgZmlmb19zdGF0dXM7CisJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLworCQlSdGRBZGNTdGFydChkZXYpOworCQljb21lZGlfdWRlbGF5KDEpOworCQlmaWZvX3N0YXR1cyA9IFJ0ZEZpZm9TdGF0dXMoZGV2KTsKKwkJaWYoKGZpZm9fc3RhdHVzICYgRlNfQURDX0hFTVBUWSkgPT0gMCkgeworCQkJZmlmb19zaXplID0gMiAqIGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZihpID09IGxpbWl0KQorCXsKKwkJcnRfcHJpbnRrKCJcbmNvbWVkaTogJXM6IGZhaWxlZCB0byBwcm9iZSBmaWZvIHNpemUuXG4iLCBEUlZfTkFNRSk7CisJCXJldHVybiAtRUlPOworCX0KKwlSdGRBZGNDbGVhckZpZm8oZGV2KTsKKwlpZihmaWZvX3NpemUgIT0gMHg0MDAgfHwgZmlmb19zaXplICE9IDB4MjAwMCkKKwl7CisJCXJ0X3ByaW50aygiXG5jb21lZGk6ICVzOiB1bmV4cGVjdGVkIGZpZm8gc2l6ZSBvZiAlaSwgZXhwZWN0ZWQgMTAyNCBvciA4MTkyLlxuIiwKKwkJCURSVl9OQU1FLCBmaWZvX3NpemUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIGZpZm9fc2l6ZTsKK30KKworLyoKKyAgImluc3RydWN0aW9ucyIgcmVhZC93cml0ZSBkYXRhIGluICJvbmUtc2hvdCIgb3IgInNvZnR3YXJlLXRyaWdnZXJlZCIKKyAgbW9kZSAoc2ltcGxlc3QgY2FzZSkuCisgIFRoaXMgZG9lc250IHVzZSBpbnRlcnJ1cHRzLgorCisgIE5vdGUsIHdlIGRvbid0IGRvIGFueSBzZXR0bGluZyBkZWxheXMuICBVc2UgYSBpbnN0cnVjdGlvbiBsaXN0IHRvCisgIHNlbGVjdCwgZGVsYXksIHRoZW4gcmVhZC4KKyAqLworc3RhdGljIGludCBydGRfYWlfcmluc24oY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IG4sIGlpOworCWludCBzdGF0OworCisJLyogY2xlYXIgYW55IG9sZCBmaWZvIGRhdGEgKi8KKwlSdGRBZGNDbGVhckZpZm8oZGV2KTsKKworCS8qIHdyaXRlIGNoYW5uZWwgdG8gbXVsdGlwbGV4ZXIgYW5kIGNsZWFyIGNoYW5uZWwgZ2FpbiB0YWJsZSAqLworCXJ0ZF9sb2FkX2NoYW5uZWxnYWluX2xpc3QoZGV2LCAxLCAmaW5zbi0+Y2hhbnNwZWMpOworCisJLyogc2V0IGNvbnZlcnNpb24gc291cmNlICovCisJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSAqLworCisJLyogY29udmVydCBuIHNhbXBsZXMgKi8KKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJCXMxNiBkOworCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KKwkJUnRkQWRjU3RhcnQoZGV2KTsKKworCQlmb3IgKGlpID0gMDsgaWkgPCBSVERfQURDX1RJTUVPVVQ7ICsraWkpIHsKKwkJCXN0YXQgPSBSdGRGaWZvU3RhdHVzKGRldik7CisJCQlpZiAoc3RhdCAmIEZTX0FEQ19OT1RfRU1QVFkpCS8qIDEgLT4gbm90IGVtcHR5ICovCisJCQkJYnJlYWs7CisJCQlXQUlUX1FVSUVUTFk7CisJCX0KKwkJaWYgKGlpID49IFJURF9BRENfVElNRU9VVCkgeworCQkJRFBSSU5USygicnRkNTIwOiBFcnJvcjogQURDIG5ldmVyIGZpbmlzaGVkISBGaWZvU3RhdHVzPTB4JXhcbiIsIHN0YXQgXiAweDY2NjYpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQkvKiByZWFkIGRhdGEgKi8KKwkJZCA9IFJ0ZEFkY0ZpZm9HZXQoZGV2KTsJLyogZ2V0IDJzIGNvbXAgdmFsdWUgKi8KKwkJLypwcmludGsgKCJydGQ1MjA6IEdvdCAweCV4IGFmdGVyICVkIHVzZWNcbiIsIGQsIGlpKzEpOyAqLworCQlkID0gZCA+PiAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KKwkJaWYgKENIQU5fQVJSQVlfVEVTVChkZXZwcml2LT5jaGFuQmlwb2xhciwgMCkpIHsKKwkJCWRhdGFbbl0gPSBkICsgMjA0ODsJLyogY29udmVydCB0byBjb21lZGkgdW5zaWduZWQgZGF0YSAqLworCQl9IGVsc2UgeworCQkJZGF0YVtuXSA9IGQ7CisJCX0KKwl9CisKKwkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHJlYWQvd3JpdHRlbiAqLworCXJldHVybiBuOworfQorCisvKgorICBHZXQgd2hhdCB3ZSBrbm93IGlzIHRoZXJlLi4uLiBGYXN0IQorICBUaGlzIHVzZXMgMS8yIHRoZSBidXMgY3ljbGVzIG9mIHJlYWRfZHJlZ3MgKGJlbG93KS4KKworICBUaGUgbWFudWFsIGNsYWltcyB0aGF0IHdlIGNhbiBkbyBhIGx3b3JkIHJlYWQsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgaGVyZS4KKyovCitzdGF0aWMgaW50IGFpX3JlYWRfbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywgaW50IGNvdW50KQoreworCWludCBpaTsKKworCWZvciAoaWkgPSAwOyBpaSA8IGNvdW50OyBpaSsrKSB7CisJCXNhbXBsX3Qgc2FtcGxlOworCQlzMTYgZDsKKworCQlpZiAoMCA9PSBkZXZwcml2LT5haUNvdW50KSB7CS8qIGRvbmUgKi8KKwkJCWQgPSBSdGRBZGNGaWZvR2V0KGRldik7CS8qIFJlYWQgTiBhbmQgZGlzY2FyZCAqLworCQkJY29udGludWU7CisJCX0KKyNpZiAwCisJCWlmICgwID09IChSdGRGaWZvU3RhdHVzKGRldikgJiBGU19BRENfTk9UX0VNUFRZKSkgewkvKiBERUJVRyAqLworCQkJRFBSSU5USygiY29tZWRpOiBSRUFEIE9PUFMgb24gJWQgb2YgJWRcbiIsIGlpICsgMSwKKwkJCQljb3VudCk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWQgPSBSdGRBZGNGaWZvR2V0KGRldik7CS8qIGdldCAycyBjb21wIHZhbHVlICovCisKKwkJZCA9IGQgPj4gMzsJLyogbG93IDMgYml0cyBhcmUgbWFya2VyIGxpbmVzICovCisJCWlmIChDSEFOX0FSUkFZX1RFU1QoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIHMtPmFzeW5jLT5jdXJfY2hhbikpIHsKKwkJCXNhbXBsZSA9IGQgKyAyMDQ4OwkvKiBjb252ZXJ0IHRvIGNvbWVkaSB1bnNpZ25lZCBkYXRhICovCisJCX0gZWxzZSB7CisJCQlzYW1wbGUgPSBkOworCQl9CisJCWlmICghY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHNhbXBsZSkpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKGRldnByaXYtPmFpQ291bnQgPiAwKQkvKiA8IDAsIG1lYW5zIHJlYWQgZm9yZXZlciAqLworCQkJZGV2cHJpdi0+YWlDb3VudC0tOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAgdW5rbm93biBhbW91dCBvZiBkYXRhIGlzIHdhaXRpbmcgaW4gZmlmby4KKyovCitzdGF0aWMgaW50IGFpX3JlYWRfZHJlZ3MoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJd2hpbGUgKFJ0ZEZpZm9TdGF0dXMoZGV2KSAmIEZTX0FEQ19OT1RfRU1QVFkpIHsJLyogMSAtPiBub3QgZW1wdHkgKi8KKwkJc2FtcGxfdCBzYW1wbGU7CisJCXMxNiBkID0gUnRkQWRjRmlmb0dldChkZXYpOwkvKiBnZXQgMnMgY29tcCB2YWx1ZSAqLworCisJCWlmICgwID09IGRldnByaXYtPmFpQ291bnQpIHsJLyogZG9uZSAqLworCQkJY29udGludWU7CS8qIHJlYWQgcmVzdCAqLworCQl9CisKKwkJZCA9IGQgPj4gMzsJLyogbG93IDMgYml0cyBhcmUgbWFya2VyIGxpbmVzICovCisJCWlmIChDSEFOX0FSUkFZX1RFU1QoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIHMtPmFzeW5jLT5jdXJfY2hhbikpIHsKKwkJCXNhbXBsZSA9IGQgKyAyMDQ4OwkvKiBjb252ZXJ0IHRvIGNvbWVkaSB1bnNpZ25lZCBkYXRhICovCisJCX0gZWxzZSB7CisJCQlzYW1wbGUgPSBkOworCQl9CisJCWlmICghY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHNhbXBsZSkpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKGRldnByaXYtPmFpQ291bnQgPiAwKQkvKiA8IDAsIG1lYW5zIHJlYWQgZm9yZXZlciAqLworCQkJZGV2cHJpdi0+YWlDb3VudC0tOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFVTRV9ETUEKKy8qCisgIFRlcm1pbmF0ZSBhIERNQSB0cmFuc2ZlciBhbmQgd2FpdCBmb3IgZXZlcnl0aGluZyB0byBxdWlldCBkb3duCisqLwordm9pZCBhYm9ydF9kbWEoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CQkJCS8qIERNQSBjaGFubmVsIDAsIDEgKi8KKwl1bnNpZ25lZCBsb25nIGRtYV9jc19hZGRyOwkvKiB0aGUgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgKi8KKwl1aW50OF90IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaWk7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJZG1hX2NzX2FkZHIgPSAodW5zaWduZWQgbG9uZylkZXZwcml2LT5sY2ZnCisJCSsgKChjaGFubmVsID09IDApID8gTENGR19ETUFDU1IwIDogTENGR19ETUFDU1IxKTsKKworCS8vIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZworCS8vY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCAmZGV2LT5zcGlubG9jaywgZmxhZ3MgKTsKKworCS8vIGFib3J0IGRtYSB0cmFuc2ZlciBpZiBuZWNlc3NhcnkKKwlzdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJaWYgKChzdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkgPT0gMCkgewkvKiBub3QgZW5hYmxlZCAoRXJyb3I/KSAqLworCQlEUFJJTlRLKCJydGQ1MjA6IEFib3J0RG1hIG9uIG5vbi1hY3RpdmUgY2hhbm5lbCAlZCAoMHgleClcbiIsCisJCQljaGFubmVsLCBzdGF0dXMpOworCQlnb3RvIGFib3J0RG1hRXhpdDsKKwl9CisKKwkvKiB3YWl0IHRvIG1ha2Ugc3VyZSBkb25lIGJpdCBpcyB6ZXJvIChuZWVkZWQ/KSAqLworCWZvciAoaWkgPSAwOyAoc3RhdHVzICYgUExYX0RNQV9ET05FX0JJVCkgJiYgaWkgPCBSVERfRE1BX1RJTUVPVVQ7IGlpKyspIHsKKwkJV0FJVF9RVUlFVExZOworCQlzdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJfQorCWlmIChzdGF0dXMgJiBQTFhfRE1BX0RPTkVfQklUKSB7CisJCXByaW50aygicnRkNTIwOiBUaW1lb3V0IHdhaXRpbmcgZm9yIGRtYSAlaSBkb25lIGNsZWFyXG4iLAorCQkJY2hhbm5lbCk7CisJCWdvdG8gYWJvcnREbWFFeGl0OworCX0KKworCS8qIGRpc2FibGUgY2hhbm5lbCAocmVxdWlyZWQpICovCisJd3JpdGViKDAsIGRtYV9jc19hZGRyKTsKKwljb21lZGlfdWRlbGF5KDEpOwkvKiBuZWVkZWQ/PyAqLworCS8qIHNldCBhYm9ydCBiaXQgZm9yIGNoYW5uZWwgKi8KKwl3cml0ZWIoUExYX0RNQV9BQk9SVF9CSVQsIGRtYV9jc19hZGRyKTsKKworCS8vIHdhaXQgZm9yIGRtYSBkb25lIGJpdCB0byBiZSBzZXQKKwlzdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJZm9yIChpaSA9IDA7CisJCShzdGF0dXMgJiBQTFhfRE1BX0RPTkVfQklUKSA9PSAwICYmIGlpIDwgUlREX0RNQV9USU1FT1VUOworCQlpaSsrKSB7CisJCXN0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwkJV0FJVF9RVUlFVExZOworCX0KKwlpZiAoKHN0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpID09IDApIHsKKwkJcHJpbnRrKCJydGQ1MjA6IFRpbWVvdXQgd2FpdGluZyBmb3IgZG1hICVpIGRvbmUgc2V0XG4iLAorCQkJY2hhbm5lbCk7CisJfQorCisgICAgICBhYm9ydERtYUV4aXQ6CisJLy9jb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJmRldi0+c3BpbmxvY2ssIGZsYWdzICk7Cit9CisKKy8qCisgIFByb2Nlc3Mgd2hhdCBpcyBpbiB0aGUgRE1BIHRyYW5zZmVyIGJ1ZmZlciBhbmQgcGFzcyB0byBjb21lZGkKKyAgTm90ZTogdGhpcyBpcyBub3QgcmUtZW50cmFudAorKi8KK3N0YXRpYyBpbnQgYWlfcHJvY2Vzc19kbWEoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJaW50IGlpLCBuOworCXMxNiAqZHA7CisKKwlpZiAoZGV2cHJpdi0+YWlDb3VudCA9PSAwKQkvKiB0cmFuc2ZlciBhbHJlYWR5IGNvbXBsZXRlICovCisJCXJldHVybiAwOworCisJZHAgPSBkZXZwcml2LT5kbWEwQnVmZltkZXZwcml2LT5kbWEwT2Zmc2V0XTsKKwlmb3IgKGlpID0gMDsgaWkgPCBkZXZwcml2LT5maWZvTGVuIC8gMjspIHsJLyogY29udmVydCBzYW1wbGVzICovCisJCXNhbXBsX3Qgc2FtcGxlOworCisJCWlmIChDSEFOX0FSUkFZX1RFU1QoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIHMtPmFzeW5jLT5jdXJfY2hhbikpIHsKKwkJCXNhbXBsZSA9ICgqZHAgPj4gMykgKyAyMDQ4OwkvKiBjb252ZXJ0IHRvIGNvbWVkaSB1bnNpZ25lZCBkYXRhICovCisJCX0gZWxzZSB7CisJCQlzYW1wbGUgPSAqZHAgPj4gMzsJLyogbG93IDMgYml0cyBhcmUgbWFya2VyIGxpbmVzICovCisJCX0KKwkJKmRwKysgPSBzYW1wbGU7CS8qIHB1dCBwcm9jZXNzZWQgdmFsdWUgYmFjayAqLworCisJCWlmICgrK3MtPmFzeW5jLT5jdXJfY2hhbiA+PSBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbikKKwkJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisKKwkJKytpaTsJCS8qIG51bWJlciByZWFkeSB0byB0cmFuc2ZlciAqLworCQlpZiAoZGV2cHJpdi0+YWlDb3VudCA+IDApIHsJLyogPCAwLCBtZWFucyByZWFkIGZvcmV2ZXIgKi8KKwkJCWlmICgtLWRldnByaXYtPmFpQ291bnQgPT0gMCkgewkvKiBkb25lICovCisJCQkJLypEUFJJTlRLICgicnRkNTIwOiBGaW5hbCAlZCBzYW1wbGVzXG4iLCBpaSk7ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBub3cgcGFzcyB0aGUgd2hvbGUgYXJyYXkgdG8gdGhlIGNvbWVkaSBidWZmZXIgKi8KKwlkcCA9IGRldnByaXYtPmRtYTBCdWZmW2RldnByaXYtPmRtYTBPZmZzZXRdOworCW4gPSBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKHMtPmFzeW5jLCBpaSAqIHNpemVvZihzMTYpKTsKKwlpZiAobiA8IChpaSAqIHNpemVvZihzMTYpKSkgewkvKiBhbnkgcmVzaWR1YWwgaXMgYW4gZXJyb3IgKi8KKwkJRFBSSU5USygicnRkNTIwOmFpX3Byb2Nlc3NfZG1hIGJ1ZmZlciBvdmVyZmxvdyAlZCBzYW1wbGVzIVxuIiwKKwkJCWlpIC0gKG4gLyBzaXplb2YoczE2KSkpOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJcmV0dXJuIC0xOworCX0KKwljb21lZGlfYnVmX21lbWNweV90byhzLT5hc3luYywgMCwgZHAsIG4pOworCWNvbWVkaV9idWZfd3JpdGVfZnJlZShzLT5hc3luYywgbik7CisKKwkvKiBhbHdheXMgYXQgbGVhc3QgMSBzY2FuIC0tIDEvMiBGSUZPIGlzIGxhcmdlciB0aGFuIG91ciBtYXggc2NhbiBsaXN0ICovCisJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0sgfCBDT01FRElfQ0JfRU9TOworCisJaWYgKCsrZGV2cHJpdi0+ZG1hME9mZnNldCA+PSBETUFfQ0hBSU5fQ09VTlQpIHsJLyogbmV4dCBidWZmZXIgKi8KKwkJZGV2cHJpdi0+ZG1hME9mZnNldCA9IDA7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKworLyoKKyAgSGFuZGxlIGFsbCBydGQ1MjAgaW50ZXJydXB0cy4KKyAgUnVucyBhdG9taWNhbGx5IGFuZCBpcyBuZXZlciByZS1lbnRlcmVkLgorICBUaGlzIGlzIGEgInNsb3cgaGFuZGxlciI7ICBvdGhlciBpbnRlcnJ1cHRzIG1heSBiZSBhY3RpdmUuCisgIFRoZSBkYXRhIGNvbnZlcnNpb24gbWF5IHNvbWVkYXkgaGFwcGVuIGluIGEgImJvdHRvbSBoYWxmIi4KKyovCitzdGF0aWMgaXJxcmV0dXJuX3QgcnRkX2ludGVycnVwdChpbnQgaXJxLAkvKiBpbnRlcnJ1cHQgbnVtYmVyIChpZ25vcmVkKSAqLworCXZvaWQgKmQJCQkvKiBvdXIgZGF0YSAqLworCVBUX1JFR1NfQVJHKQorewkJCQkvKiBjcHUgY29udGV4dCAoaWdub3JlZCkgKi8KKwljb21lZGlfZGV2aWNlICpkZXYgPSBkOwkvKiBtdXN0IGJlIGNhbGxlZCAiZGV2IiBmb3IgZGV2cHJpdiAqLworCXUxNiBzdGF0dXM7CisJdTE2IGZpZm9TdGF0dXM7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CS8qIGFuYWxvZyBpbiBzdWJkZXZpY2UgKi8KKworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZGV2cHJpdi0+aW50Q291bnQrKzsJLyogREVCVUcgc3RhdGlzdGljcyAqLworCisJZmlmb1N0YXR1cyA9IFJ0ZEZpZm9TdGF0dXMoZGV2KTsKKwkvKiBjaGVjayBmb3IgRklGTyBmdWxsLCB0aGlzIGF1dG9tYXRpY2FsbHkgaGFsdHMgdGhlIEFEQyEgKi8KKwlpZiAoIShmaWZvU3RhdHVzICYgRlNfQURDX05PVF9GVUxMKSkgewkvKiAwIC0+IGZ1bGwgKi8KKwkJRFBSSU5USygicnRkNTIwOiBGSUZPIGZ1bGwhIGZpZm9fc3RhdHVzPTB4JXhcbiIsIChmaWZvU3RhdHVzIF4gMHg2NjY2KSAmIDB4Nzc3Nyk7CS8qIHNob3VsZCBiZSBhbGwgMHMgKi8KKwkJZ290byBhYm9ydFRyYW5zZmVyOworCX0KKyNpZmRlZiBVU0VfRE1BCisJaWYgKGRldnByaXYtPmZsYWdzICYgRE1BMF9BQ1RJVkUpIHsJLyogQ2hlY2sgRE1BICovCisJCXUzMiBpc3RhdHVzID0gUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpOworCisJCWlmIChpc3RhdHVzICYgSUNTX0RNQTBfQSkgeworCQkJaWYgKGFpX3Byb2Nlc3NfZG1hKGRldiwgcykgPCAwKSB7CisJCQkJRFBSSU5USygicnRkNTIwOiBjb21lZGkgcmVhZCBidWZmZXIgb3ZlcmZsb3cgKERNQSkgd2l0aCAlbGQgdG8gZ28hXG4iLCBkZXZwcml2LT5haUNvdW50KTsKKwkJCQlSdGREbWEwQ29udHJvbChkZXYsCisJCQkJCShkZXZwcml2LT4KKwkJCQkJCWRtYTBDb250cm9sICYKKwkJCQkJCX5QTFhfRE1BX1NUQVJUX0JJVCkKKwkJCQkJfCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklUKTsKKwkJCQlnb3RvIGFib3J0VHJhbnNmZXI7CisJCQl9CisKKwkJCS8qRFBSSU5USyAoInJ0ZDUyMDogRE1BIHRyYW5zZmVyOiAlbGQgdG8gZ28sIGlzdGF0dXMgJXhcbiIsCisJCQkgICBkZXZwcml2LT5haUNvdW50LCBpc3RhdHVzKTsgKi8KKwkJCVJ0ZERtYTBDb250cm9sKGRldiwKKwkJCQkoZGV2cHJpdi0+ZG1hMENvbnRyb2wgJiB+UExYX0RNQV9TVEFSVF9CSVQpCisJCQkJfCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklUKTsKKwkJCWlmICgwID09IGRldnByaXYtPmFpQ291bnQpIHsJLyogY291bnRlZCBkb3duICovCisJCQkJRFBSSU5USygicnRkNTIwOiBTYW1wbGVzIERvbmUgKERNQSkuXG4iKTsKKwkJCQlnb3RvIHRyYW5zZmVyRG9uZTsKKwkJCX0KKwkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQl9IGVsc2UgeworCQkJLypEUFJJTlRLICgicnRkNTIwOiBObyBETUEgcmVhZHk6IGlzdGF0dXMgJXhcbiIsIGlzdGF0dXMpOyAqLworCQl9CisJfQorCS8qIEZhbGwgdGhyb3VnaCBhbmQgY2hlY2sgZm9yIG90aGVyIGludGVycnVwdCBzb3VyY2VzICovCisjZW5kaWYgLyogVVNFX0RNQSAqLworCisJc3RhdHVzID0gUnRkSW50ZXJydXB0U3RhdHVzKGRldik7CisJLyogaWYgaW50ZXJydXB0IHdhcyBub3QgY2F1c2VkIGJ5IG91ciBib2FyZCwgb3IgaGFuZGxlZCBhYm92ZSAqLworCWlmICgwID09IHN0YXR1cykgeworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHN0YXR1cyAmIElSUU1fQURDX0FCT1VUX0NOVCkgewkvKiBzYW1wbGUgY291bnQgLT4gcmVhZCBGSUZPICovCisJCS8qIHNpbmNlIHRoZSBwcmlvcml0eSBpbnRlcnJ1cHQgY29udHJvbGxlciBtYXkgaGF2ZSBxdWV1ZWQgYSBzYW1wbGUKKwkJICAgY291bnRlciBpbnRlcnJ1cHQsIGV2ZW4gdGhvdWdoIHdlIGhhdmUgYWxyZWFkeSBmaW5pc2hlZCwKKwkJICAgd2UgbXVzdCBoYW5kbGUgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlcmUgaXMgbm8gZGF0YSBoZXJlICovCisJCWlmICghKGZpZm9TdGF0dXMgJiBGU19BRENfSEVNUFRZKSkgewkvKiAwIC0+IDEvMiBmdWxsICovCisJCQkvKkRQUklOVEsoInJ0ZDUyMDogU2FtcGxlIGludCwgcmVhZGluZyAxLzJGSUZPLiAgZmlmb19zdGF0dXMgMHgleFxuIiwKKwkJCSAgIChmaWZvU3RhdHVzIF4gMHg2NjY2KSAmIDB4Nzc3Nyk7ICovCisJCQlpZiAoYWlfcmVhZF9uKGRldiwgcywgZGV2cHJpdi0+Zmlmb0xlbiAvIDIpIDwgMCkgeworCQkJCURQUklOVEsoInJ0ZDUyMDogY29tZWRpIHJlYWQgYnVmZmVyIG92ZXJmbG93ICgxLzJGSUZPKSB3aXRoICVsZCB0byBnbyFcbiIsIGRldnByaXYtPmFpQ291bnQpOworCQkJCWdvdG8gYWJvcnRUcmFuc2ZlcjsKKwkJCX0KKwkJCWlmICgwID09IGRldnByaXYtPmFpQ291bnQpIHsJLyogY291bnRlZCBkb3duICovCisJCQkJRFBSSU5USygicnRkNTIwOiBTYW1wbGVzIERvbmUgKDEvMikuIGZpZm9fc3RhdHVzIHdhcyAweCV4XG4iLCAoZmlmb1N0YXR1cyBeIDB4NjY2NikgJiAweDc3NzcpOwkvKiBzaG91bGQgYmUgYWxsIDBzICovCisJCQkJZ290byB0cmFuc2ZlckRvbmU7CisJCQl9CisJCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJfSBlbHNlIGlmIChkZXZwcml2LT50cmFuc0NvdW50ID4gMCkgewkvKiByZWFkIG9mdGVuICovCisJCQkvKkRQUklOVEsoInJ0ZDUyMDogU2FtcGxlIGludCwgcmVhZGluZyAlZCAgZmlmb19zdGF0dXMgMHgleFxuIiwKKwkJCSAgIGRldnByaXYtPnRyYW5zQ291bnQsIChmaWZvU3RhdHVzIF4gMHg2NjY2KSAmIDB4Nzc3Nyk7ICovCisJCQlpZiAoZmlmb1N0YXR1cyAmIEZTX0FEQ19OT1RfRU1QVFkpIHsJLyogMSAtPiBub3QgZW1wdHkgKi8KKwkJCQlpZiAoYWlfcmVhZF9uKGRldiwgcywgZGV2cHJpdi0+dHJhbnNDb3VudCkgPCAwKSB7CisJCQkJCURQUklOVEsoInJ0ZDUyMDogY29tZWRpIHJlYWQgYnVmZmVyIG92ZXJmbG93IChOKSB3aXRoICVsZCB0byBnbyFcbiIsIGRldnByaXYtPmFpQ291bnQpOworCQkJCQlnb3RvIGFib3J0VHJhbnNmZXI7CisJCQkJfQorCQkJCWlmICgwID09IGRldnByaXYtPmFpQ291bnQpIHsJLyogY291bnRlZCBkb3duICovCisJCQkJCURQUklOVEsoInJ0ZDUyMDogU2FtcGxlcyBEb25lIChOKS4gZmlmb19zdGF0dXMgd2FzIDB4JXhcbiIsIChmaWZvU3RhdHVzIF4gMHg2NjY2KSAmIDB4Nzc3Nyk7CisJCQkJCWdvdG8gdHJhbnNmZXJEb25lOworCQkJCX0KKwkJCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJCX0KKwkJfSBlbHNlIHsJLyogd2FpdCBmb3IgMS8yIEZJRk8gKG9sZCkgKi8KKwkJCURQUklOVEsoInJ0ZDUyMDogU2FtcGxlIGludC4gIFdhaXQgZm9yIDEvMi4gZmlmb19zdGF0dXMgMHgleFxuIiwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsKKwkJfQorCX0gZWxzZSB7CisJCURQUklOVEsoInJ0ZDUyMDogdW5rbm93biBpbnRlcnJ1cHQgc291cmNlIVxuIik7CisJfQorCisJaWYgKDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSkgewkvKiBpbnRlcnJ1cHQgb3ZlcnJ1biAqLworCQlEUFJJTlRLKCJydGQ1MjA6IEludGVycnVwdCBvdmVycnVuIHdpdGggJWxkIHRvIGdvISBvdmVyX3N0YXR1cz0weCV4XG4iLCBkZXZwcml2LT5haUNvdW50LCAweGZmZmYgJiBSdGRJbnRlcnJ1cHRPdmVycnVuU3RhdHVzKGRldikpOworCQlnb3RvIGFib3J0VHJhbnNmZXI7CisJfQorCisJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLworCVJ0ZEludGVycnVwdENsZWFyTWFzayhkZXYsIHN0YXR1cyk7CisJUnRkSW50ZXJydXB0Q2xlYXIoZGV2KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKyAgICAgIGFib3J0VHJhbnNmZXI6CisJUnRkQWRjQ2xlYXJGaWZvKGRldik7CS8qIGNsZWFycyBmdWxsIGZsYWcgKi8KKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwlkZXZwcml2LT5haUNvdW50ID0gMDsJLyogc3RvcCBhbmQgZG9uJ3QgdHJhbnNmZXIgYW55IG1vcmUgKi8KKwkvKiBmYWxsIGludG8gdHJhbnNmZXJEb25lICovCisKKyAgICAgIHRyYW5zZmVyRG9uZToKKwlSdGRQYWNlclN0b3BTb3VyY2UoZGV2LCAwKTsJLyogc3RvcCBvbiBTT0ZUV0FSRSBzdG9wICovCisJUnRkUGFjZXJTdG9wKGRldik7CS8qIFN0b3AgUEFDRVIgKi8KKwlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlIHRyaWdnZXIgb25seSAqLworCVJ0ZEludGVycnVwdE1hc2soZGV2LCAwKTsJLyogbWFzayBvdXQgU0FNUExFICovCisjaWZkZWYgVVNFX0RNQQorCWlmIChkZXZwcml2LT5mbGFncyAmIERNQTBfQUNUSVZFKSB7CisJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwJLyogZGlzYWJsZSBhbnkgbW9yZSBpbnRlcnJ1cHRzICovCisJCQlSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikgJiB+SUNTX0RNQTBfRSk7CisJCWFib3J0X2RtYShkZXYsIDApOworCQlkZXZwcml2LT5mbGFncyAmPSB+RE1BMF9BQ1RJVkU7CisJCS8qIGlmIFVzaW5nIERNQSwgdGhlbiB3ZSBzaG91bGQgaGF2ZSByZWFkIGV2ZXJ5dGhpbmcgYnkgbm93ICovCisJCWlmIChkZXZwcml2LT5haUNvdW50ID4gMCkgeworCQkJRFBSSU5USygicnRkNTIwOiBMb3N0IERNQSBkYXRhISAlbGQgcmVtYWluXG4iLAorCQkJCWRldnByaXYtPmFpQ291bnQpOworCQl9CisJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKworCWlmIChkZXZwcml2LT5haUNvdW50ID4gMCkgewkvKiB0aGVyZSBzaG91bGRuJ3QgYmUgYW55dGhpbmcgbGVmdCAqLworCQlmaWZvU3RhdHVzID0gUnRkRmlmb1N0YXR1cyhkZXYpOworCQlEUFJJTlRLKCJydGQ1MjA6IEZpbmlzaGluZyB1cC4gJWxkIHJlbWFpbiwgZmlmb1N0YXQ9JXhcbiIsIGRldnByaXYtPmFpQ291bnQsIChmaWZvU3RhdHVzIF4gMHg2NjY2KSAmIDB4Nzc3Nyk7CS8qIHNob3VsZCByZWFkIGFsbCAwcyAqLworCQlhaV9yZWFkX2RyZWdzKGRldiwgcyk7CS8qIHJlYWQgYW55dGhpbmcgbGVmdCBpbiBGSUZPICovCisJfQorCisJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwkvKiBzaWduYWwgZW5kIHRvIGNvbWVkaSAqLworCWNvbWVkaV9ldmVudChkZXYsIHMpOworCisJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLworCXN0YXR1cyA9IFJ0ZEludGVycnVwdFN0YXR1cyhkZXYpOworCVJ0ZEludGVycnVwdENsZWFyTWFzayhkZXYsIHN0YXR1cyk7CisJUnRkSW50ZXJydXB0Q2xlYXIoZGV2KTsKKworCWZpZm9TdGF0dXMgPSBSdGRGaWZvU3RhdHVzKGRldik7CS8qIERFQlVHICovCisJRFBSSU5USygicnRkNTIwOiBBY3F1aXNpdGlvbiBjb21wbGV0ZS4gJWxkIGludHMsIGludFN0YXQ9JXgsIG92ZXJTdGF0PSV4XG4iLCBkZXZwcml2LT5pbnRDb3VudCwgc3RhdHVzLCAweGZmZmYgJiBSdGRJbnRlcnJ1cHRPdmVycnVuU3RhdHVzKGRldikpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWYgMAorLyoKKyAgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhdmFpbGFibGUKKyovCitzdGF0aWMgaW50IHJ0ZF9haV9wb2xsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCS8qIFRPRE86IFRoaXMgbmVlZHMgdG8gbWFzayBpbnRlcnJ1cHRzLCByZWFkX2RyZWdzLCBhbmQgdGhlbiByZS1lbmFibGUgKi8KKwkvKiBOb3Qgc3VyZSB3aGF0IHRvIGRvIGlmIERNQSBpcyBhY3RpdmUgKi8KKwlyZXR1cm4gcy0+YXN5bmMtPmJ1Zl93cml0ZV9jb3VudCAtIHMtPmFzeW5jLT5idWZfcmVhZF9jb3VudDsKK30KKyNlbmRpZgorCisvKgorICBjbWR0ZXN0IHRlc3RzIGEgcGFydGljdWxhciBjb21tYW5kIHRvIHNlZSBpZiBpdCBpcyB2YWxpZC4KKyAgVXNpbmcgdGhlIGNtZHRlc3QgaW9jdGwsIGEgdXNlciBjYW4gY3JlYXRlIGEgdmFsaWQgY21kCisgIGFuZCB0aGVuIGhhdmUgaXQgZXhlY3V0ZWQgYnkgdGhlIGNtZCBpb2N0bCAoYXN5bmNyb25vdXNseSkuCisKKyAgY21kdGVzdCByZXR1cm5zIDEsMiwzLDQgb3IgMCwgZGVwZW5kaW5nIG9uIHdoaWNoIHRlc3RzCisgIHRoZSBjb21tYW5kIHBhc3Nlcy4KKyovCisKK3N0YXRpYyBpbnQgcnRkX2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgdG1wOworCisJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKSB7CisJCWVycisrOworCX0KKworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKSB7CisJCWVycisrOworCX0KKworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKSB7CisJCWVycisrOworCX0KKworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJdG1wID0gY21kLT5zdG9wX3NyYzsKKwljbWQtPnN0b3Bfc3JjICY9IFRSSUdfQ09VTlQgfCBUUklHX05PTkU7CisJaWYgKCFjbWQtPnN0b3Bfc3JjIHx8IHRtcCAhPSBjbWQtPnN0b3Bfc3JjKSB7CisJCWVycisrOworCX0KKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUKKwkgICBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKSB7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX1RJTUVSICYmIGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19FWFQpIHsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX05PTkUpIHsKKwkJZXJyKys7CisJfQorCisJaWYgKGVycikgeworCQlyZXR1cm4gMjsKKwl9CisKKwkvKiBzdGVwIDM6IG1ha2Ugc3VyZSBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoY21kLT5zdGFydF9hcmcgIT0gMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJLyogTm90ZTogdGhlc2UgYXJlIHRpbWUgcGVyaW9kcywgbm90IGFjdHVhbCByYXRlcyAqLworCQlpZiAoMSA9PSBjbWQtPmNoYW5saXN0X2xlbikgewkvKiBubyBzY2FubmluZyAqLworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCBSVERfTUFYX1NQRUVEXzEpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gUlREX01BWF9TUEVFRF8xOworCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJVFJJR19ST1VORF9VUCk7CisJCQkJZXJyKys7CisJCQl9CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA+IFJURF9NSU5fU1BFRURfMSkgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBSVERfTUlOX1NQRUVEXzE7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQlUUklHX1JPVU5EX0RPV04pOworCQkJCWVycisrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCBSVERfTUFYX1NQRUVEKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IFJURF9NQVhfU1BFRUQ7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQlUUklHX1JPVU5EX1VQKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnID4gUlREX01JTl9TUEVFRCkgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBSVERfTUlOX1NQRUVEOworCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJVFJJR19ST1VORF9ET1dOKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KKwkJLyogc2hvdWxkIGJlIGxldmVsL2VkZ2UsIGhpL2xvIHNwZWNpZmljYXRpb24gaGVyZSAqLworCQkvKiBzaG91bGQgc3BlY2lmeSBtdWx0aXBsZSBleHRlcm5hbCB0cmlnZ2VycyAqLworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA+IDkpIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSA5OworCQkJZXJyKys7CisJCX0KKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQlpZiAoMSA9PSBjbWQtPmNoYW5saXN0X2xlbikgewkvKiBubyBzY2FubmluZyAqLworCQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCBSVERfTUFYX1NQRUVEXzEpIHsKKwkJCQljbWQtPmNvbnZlcnRfYXJnID0gUlREX01BWF9TUEVFRF8xOworCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJVFJJR19ST1VORF9VUCk7CisJCQkJZXJyKys7CisJCQl9CisJCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA+IFJURF9NSU5fU1BFRURfMSkgeworCQkJCWNtZC0+Y29udmVydF9hcmcgPSBSVERfTUlOX1NQRUVEXzE7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQlUUklHX1JPVU5EX0RPV04pOworCQkJCWVycisrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCBSVERfTUFYX1NQRUVEKSB7CisJCQkJY21kLT5jb252ZXJ0X2FyZyA9IFJURF9NQVhfU1BFRUQ7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQlUUklHX1JPVU5EX1VQKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCWlmIChjbWQtPmNvbnZlcnRfYXJnID4gUlREX01JTl9TUEVFRCkgeworCQkJCWNtZC0+Y29udmVydF9hcmcgPSBSVERfTUlOX1NQRUVEOworCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJVFJJR19ST1VORF9ET1dOKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KKwkJLyogc2VlIGFib3ZlICovCisJCWlmIChjbWQtPmNvbnZlcnRfYXJnID4gOSkgeworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDk7CisJCQllcnIrKzsKKwkJfQorCX0KKworI2lmIDAKKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorI2VuZGlmCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiBUT0RPIGNoZWNrIGZvciByb3VuZGluZyBlcnJvciBkdWUgdG8gY291bnRlciB3cmFwICovCisKKwl9IGVsc2UgeworCQkvKiBUUklHX05PTkUgKi8KKwkJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQkJY21kLT5zdG9wX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpIHsKKwkJcmV0dXJuIDM7CisJfQorCisJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLworCisJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gUlREX01BWF9DSEFOTElTVCkgeworCQljbWQtPmNoYW5saXN0X2xlbiA9IFJURF9NQVhfQ0hBTkxJU1Q7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CisJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCWNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX01BU0spOworCQlpZiAodG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9hcmcpIHsKKwkJCWVycisrOworCQl9CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5jb252ZXJ0X2FyZzsKKwkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTUFTSyk7CisJCWlmICh0bXAgIT0gY21kLT5jb252ZXJ0X2FyZykgeworCQkJZXJyKys7CisJCX0KKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUgorCQkJJiYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcKKwkJCQk8IChjbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmcpKSkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9CisJCQkJY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+c2Nhbl9lbmRfYXJnOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoZXJyKSB7CisJCXJldHVybiA0OworCX0KKworCXJldHVybiAwOworfQorCisvKgorICBFeGVjdXRlIGEgYW5hbG9nIGluIGNvbW1hbmQgd2l0aCBtYW55IHBvc3NpYmxlIHRyaWdnZXJpbmcgb3B0aW9ucy4KKyAgVGhlIGRhdGEgZ2V0IHN0b3JlZCBpbiB0aGUgYXN5bmMgc3RydWN0dXJlIG9mIHRoZSBzdWJkZXZpY2UuCisgIFRoaXMgaXMgdXN1YWxseSBkb25lIGJ5IGFuIGludGVycnVwdCBoYW5kbGVyLgorICBVc2VybGFuZCBnZXRzIHRvIHRoZSBkYXRhIHVzaW5nIHJlYWQgY2FsbHMuCisqLworc3RhdGljIGludCBydGRfYWlfY21kKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCWludCB0aW1lcjsKKworCS8qIHN0b3AgYW55dGhpbmcgY3VycmVudGx5IHJ1bm5pbmcgKi8KKwlSdGRQYWNlclN0b3BTb3VyY2UoZGV2LCAwKTsJLyogc3RvcCBvbiBTT0ZUV0FSRSBzdG9wICovCisJUnRkUGFjZXJTdG9wKGRldik7CS8qIG1ha2Ugc3VyZSBQQUNFUiBpcyBzdG9wcGVkICovCisJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSB0cmlnZ2VyIG9ubHkgKi8KKwlSdGRJbnRlcnJ1cHRNYXNrKGRldiwgMCk7CisjaWZkZWYgVVNFX0RNQQorCWlmIChkZXZwcml2LT5mbGFncyAmIERNQTBfQUNUSVZFKSB7CS8qIGNhbmNlbCBhbnl0aGluZyBydW5uaW5nICovCisJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwJLyogZGlzYWJsZSBhbnkgbW9yZSBpbnRlcnJ1cHRzICovCisJCQlSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikgJiB+SUNTX0RNQTBfRSk7CisJCWFib3J0X2RtYShkZXYsIDApOworCQlkZXZwcml2LT5mbGFncyAmPSB+RE1BMF9BQ1RJVkU7CisJCWlmIChSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikgJiBJQ1NfRE1BMF9BKSB7CS8qY2xlYXIgcGVuZGluZyBpbnQgKi8KKwkJCVJ0ZERtYTBDb250cm9sKGRldiwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCk7CisJCX0KKwl9CisJUnRkRG1hMFJlc2V0KGRldik7CS8qIHJlc2V0IG9uYm9hcmQgc3RhdGUgKi8KKyNlbmRpZiAvKiBVU0VfRE1BICovCisJUnRkQWRjQ2xlYXJGaWZvKGRldik7CS8qIGNsZWFyIGFueSBvbGQgZGF0YSAqLworCVJ0ZEludGVycnVwdE92ZXJydW5DbGVhcihkZXYpOworCWRldnByaXYtPmludENvdW50ID0gMDsKKworCWlmICghZGV2LT5pcnEpIHsJLyogd2UgbmVlZCBpbnRlcnJ1cHRzIGZvciB0aGlzICovCisJCURQUklOVEsoInJ0ZDUyMDogRVJST1IhIE5vIGludGVycnVwdCBhdmFpbGFibGUhXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBzdGFydCBjb25maWd1cmF0aW9uICovCisJLyogbG9hZCBjaGFubmVsIGxpc3QgYW5kIHJlc2V0IENHVCAqLworCXJ0ZF9sb2FkX2NoYW5uZWxnYWluX2xpc3QoZGV2LCBjbWQtPmNoYW5saXN0X2xlbiwgY21kLT5jaGFubGlzdCk7CisKKwkvKiBzZXR1cCB0aGUgY29tbW9uIGNhc2UgYW5kIG92ZXJyaWRlIGlmIG5lZWRlZCAqLworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IDEpIHsKKwkJLypEUFJJTlRLICgicnRkNTIwOiBNdWx0aSBjaGFubmVsIHNldHVwXG4iKTsgKi8KKwkJUnRkUGFjZXJTdGFydFNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSB0cmlnZ2VycyBwYWNlciAqLworCQlSdGRCdXJzdFN0YXJ0U291cmNlKGRldiwgMSk7CS8qIFBBQ0VSIHRyaWdnZXJzIGJ1cnN0ICovCisJCVJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LCAyKTsJLyogQlVSU1QgdHJpZ2dlcnMgQURDICovCisJfSBlbHNlIHsJCS8qIHNpbmdsZSBjaGFubmVsICovCisJCS8qRFBSSU5USyAoInJ0ZDUyMDogc2luZ2xlIGNoYW5uZWwgc2V0dXBcbiIpOyAqLworCQlSdGRQYWNlclN0YXJ0U291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlIHRyaWdnZXJzIHBhY2VyICovCisJCVJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LCAxKTsJLyogUEFDRVIgdHJpZ2dlcnMgQURDICovCisJfQorCVJ0ZEFib3V0Q291bnRlcihkZXYsIGRldnByaXYtPmZpZm9MZW4gLyAyIC0gMSk7CS8qIDEvMiBGSUZPICovCisKKwlpZiAoVFJJR19USU1FUiA9PSBjbWQtPnNjYW5fYmVnaW5fc3JjKSB7CisJCS8qIHNjYW5fYmVnaW5fYXJnIGlzIGluIG5hbm9zZWNvbmRzICovCisJCS8qIGZpbmQgb3V0IGhvdyBtYW55IHNhbXBsZXMgdG8gd2FpdCBiZWZvcmUgdHJhbnNmZXJyaW5nICovCisJCWlmIChjbWQtPmZsYWdzICYgVFJJR19XQUtFX0VPUykgeworCQkJLyogdGhpcyBtYXkgZ2VuZXJhdGUgdW4tc3VzdGFpbmFibGUgaW50ZXJydXB0IHJhdGVzICovCisJCQkvKiB0aGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGRvaW5nIHRoZSByaWdodCB0aGluZyAqLworCQkJZGV2cHJpdi0+dHJhbnNDb3VudCA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQkJZGV2cHJpdi0+ZmxhZ3MgfD0gU0VORF9FT1M7CisJCX0gZWxzZSB7CisJCQkvKiBhcnJhbmdlIHRvIHRyYW5zZmVyIGRhdGEgcGVyaW9kaWNhbGx5ICovCisJCQlkZXZwcml2LT50cmFuc0NvdW50CisJCQkJPQorCQkJCShUUkFOU19UQVJHRVRfUEVSSU9EICogY21kLT5jaGFubGlzdF9sZW4pIC8KKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnOworCQkJaWYgKGRldnByaXYtPnRyYW5zQ291bnQgPCBjbWQtPmNoYW5saXN0X2xlbikgeworCQkJCS8qIHRyYW5mZXIgYWZ0ZXIgZWFjaCBzY2FuIChhbmQgYXZvaWQgMCkgKi8KKwkJCQlkZXZwcml2LT50cmFuc0NvdW50ID0gY21kLT5jaGFubGlzdF9sZW47CisJCQl9IGVsc2UgewkvKiBtYWtlIGEgbXVsdGlwbGUgb2Ygc2NhbiBsZW5ndGggKi8KKwkJCQlkZXZwcml2LT50cmFuc0NvdW50ID0KKwkJCQkJKGRldnByaXYtPnRyYW5zQ291bnQgKworCQkJCQljbWQtPmNoYW5saXN0X2xlbiAtIDEpCisJCQkJCS8gY21kLT5jaGFubGlzdF9sZW47CisJCQkJZGV2cHJpdi0+dHJhbnNDb3VudCAqPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCX0KKwkJCWRldnByaXYtPmZsYWdzIHw9IFNFTkRfRU9TOworCQl9CisJCWlmIChkZXZwcml2LT50cmFuc0NvdW50ID49IChkZXZwcml2LT5maWZvTGVuIC8gMikpIHsKKwkJCS8qIG91dCBvZiBjb3VudGVyIHJhbmdlLCB1c2UgMS8yIGZpZm8gaW5zdGVhZCAqLworCQkJZGV2cHJpdi0+dHJhbnNDb3VudCA9IDA7CisJCQlkZXZwcml2LT5mbGFncyAmPSB+U0VORF9FT1M7CisJCX0gZWxzZSB7CisJCQkvKiBpbnRlcnJ1cHQgZm9yIGVhY2ggdHJhbmZlciAqLworCQkJUnRkQWJvdXRDb3VudGVyKGRldiwgZGV2cHJpdi0+dHJhbnNDb3VudCAtIDEpOworCQl9CisKKwkJRFBSSU5USygicnRkNTIwOiBzY2FuTGVuPSVkIHRyYW5mZXJDb3VudD0lZCBmaWZvTGVuPSVkXG4gIHNjYW5UaW1lKG5zKT0lZCBmbGFncz0weCV4XG4iLCBjbWQtPmNoYW5saXN0X2xlbiwgZGV2cHJpdi0+dHJhbnNDb3VudCwgZGV2cHJpdi0+Zmlmb0xlbiwgY21kLT5zY2FuX2JlZ2luX2FyZywgZGV2cHJpdi0+ZmxhZ3MpOworCX0gZWxzZSB7CQkvKiB1bmtub3duIHRpbWluZywganVzdCB1c2UgMS8yIEZJRk8gKi8KKwkJZGV2cHJpdi0+dHJhbnNDb3VudCA9IDA7CisJCWRldnByaXYtPmZsYWdzICY9IH5TRU5EX0VPUzsKKwl9CisJUnRkUGFjZXJDbG9ja1NvdXJjZShkZXYsIDEpOwkvKiB1c2UgSU5URVJOQUwgOE1oeiBjbG9jayBzb3VyY2UgKi8KKwlSdGRBYm91dFN0b3BFbmFibGUoZGV2LCAxKTsJLyoganVzdCBpbnRlcnJ1cHQsIGRvbnQgc3RvcCAqLworCisJLyogQlVHPz8/IHRoZXNlIGxvb2sgbGlrZSBlbnVtZXJhdGVkIHZhbHVlcywgYnV0IHRoZXkgYXJlIGJpdCBmaWVsZHMgKi8KKworCS8qIEZpcnN0LCBzZXR1cCB3aGVuIHRvIHN0b3AgKi8KKwlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKKwljYXNlIFRSSUdfQ09VTlQ6CS8qIHN0b3AgYWZ0ZXIgTiBzY2FucyAqLworCQlkZXZwcml2LT5haUNvdW50ID0gY21kLT5zdG9wX2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuOworCQlpZiAoKGRldnByaXYtPnRyYW5zQ291bnQgPiAwKQorCQkJJiYgKGRldnByaXYtPnRyYW5zQ291bnQgPiBkZXZwcml2LT5haUNvdW50KSkgeworCQkJZGV2cHJpdi0+dHJhbnNDb3VudCA9IGRldnByaXYtPmFpQ291bnQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRSSUdfTk9ORToJLyogc3RvcCB3aGVuIGNhbmNlbCBpcyBjYWxsZWQgKi8KKwkJZGV2cHJpdi0+YWlDb3VudCA9IC0xOwkvKiByZWFkIGZvcmV2ZXIgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUFJJTlRLKCJydGQ1MjA6IFdhcm5pbmchIGlnbm9yaW5nIHN0b3Bfc3JjIG1vZGUgJWRcbiIsCisJCQljbWQtPnN0b3Bfc3JjKTsKKwl9CisKKwkvKiBTY2FuIHRpbWluZyAqLworCXN3aXRjaCAoY21kLT5zY2FuX2JlZ2luX3NyYykgeworCWNhc2UgVFJJR19USU1FUjoJLyogcGVyaW9kaWMgc2Nhbm5pbmcgKi8KKwkJdGltZXIgPSBydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQlUUklHX1JPVU5EX05FQVJFU1QpOworCQkvKiBzZXQgUEFDRVIgY2xvY2sgKi8KKwkJLypEUFJJTlRLICgicnRkNTIwOiBsb2FkaW5nICVkIGludG8gcGFjZXJcbiIsIHRpbWVyKTsgKi8KKwkJUnRkUGFjZXJDb3VudGVyKGRldiwgdGltZXIpOworCisJCWJyZWFrOworCisJY2FzZSBUUklHX0VYVDoKKwkJUnRkUGFjZXJTdGFydFNvdXJjZShkZXYsIDEpOwkvKiBFWFRFUk5BTHkgdHJpZ2dlciBwYWNlciAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURQUklOVEsoInJ0ZDUyMDogV2FybmluZyEgaWdub3Jpbmcgc2Nhbl9iZWdpbl9zcmMgbW9kZSAlZFxuIiwKKwkJCWNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCX0KKworCS8qIFNhbXBsZSB0aW1pbmcgd2l0aGluIGEgc2NhbiAqLworCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgeworCWNhc2UgVFJJR19USU1FUjoJLyogcGVyaW9kaWMgKi8KKwkJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMSkgewkvKiBvbmx5IG5lZWRlZCBmb3IgbXVsdGktY2hhbm5lbCAqLworCQkJdGltZXIgPSBydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJVFJJR19ST1VORF9ORUFSRVNUKTsKKwkJCS8qIHNldHVwIEJVUlNUIGNsb2NrICovCisJCQkvKkRQUklOVEsgKCJydGQ1MjA6IGxvYWRpbmcgJWQgaW50byBidXJzdFxuIiwgdGltZXIpOyAqLworCQkJUnRkQnVyc3RDb3VudGVyKGRldiwgdGltZXIpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFRSSUdfRVhUOgkJLyogZXh0ZXJuYWwgKi8KKwkJUnRkQnVyc3RTdGFydFNvdXJjZShkZXYsIDIpOwkvKiBFWFRFUk5BTHkgdHJpZ2dlciBidXJzdCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURQUklOVEsoInJ0ZDUyMDogV2FybmluZyEgaWdub3JpbmcgY29udmVydF9zcmMgbW9kZSAlZFxuIiwKKwkJCWNtZC0+Y29udmVydF9zcmMpOworCX0KKwkvKiBlbmQgY29uZmlndXJhdGlvbiAqLworCisJLyogVGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yay4gIFRoZXJlIGlzIG5vIHdheSB0byBjbGVhciBhbiBpbnRlcnJ1cHQKKwkgICB0aGF0IHRoZSBwcmlvcml0eSBjb250cm9sbGVyIGhhcyBxdWV1ZWQhICovCisJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgfjApOwkvKiBjbGVhciBhbnkgZXhpc3RpbmcgZmxhZ3MgKi8KKwlSdGRJbnRlcnJ1cHRDbGVhcihkZXYpOworCisJLyogVE9ETzogYWxsb3cgbXVsdGlwbGUgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlpZiAoZGV2cHJpdi0+dHJhbnNDb3VudCA+IDApIHsJLyogdHJhbnNmZXIgZXZlcnkgTiBzYW1wbGVzICovCisJCVJ0ZEludGVycnVwdE1hc2soZGV2LCBJUlFNX0FEQ19BQk9VVF9DTlQpOworCQlEUFJJTlRLKCJydGQ1MjA6IFRyYW5zZmVycmluZyBldmVyeSAlZFxuIiwgZGV2cHJpdi0+dHJhbnNDb3VudCk7CisJfSBlbHNlIHsJCS8qIDEvMiBGSUZPIHRyYW5zZmVycyAqLworI2lmZGVmIFVTRV9ETUEKKwkJZGV2cHJpdi0+ZmxhZ3MgfD0gRE1BMF9BQ1RJVkU7CisKKwkJLyogcG9pbnQgdG8gZmlyc3QgdHJhbnNmZXIgaW4gcmluZyAqLworCQlkZXZwcml2LT5kbWEwT2Zmc2V0ID0gMDsKKwkJUnRkRG1hME1vZGUoZGV2LCBETUFfTU9ERV9CSVRTKTsKKwkJUnRkRG1hME5leHQoZGV2LAkvKiBwb2ludCB0byBmaXJzdCBibG9jayAqLworCQkJZGV2cHJpdi0+ZG1hMENoYWluW0RNQV9DSEFJTl9DT1VOVCAtIDFdLm5leHQpOworCQlSdGREbWEwU291cmNlKGRldiwgRE1BU19BREZJRk9fSEFMRl9GVUxMKTsJLyogc2V0IERNQSB0cmlnZ2VyIHNvdXJjZSAqLworCisJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwJLyogZW5hYmxlIGludGVycnVwdCAqLworCQkJUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpIHwgSUNTX0RNQTBfRSk7CisJCS8qIE11c3QgYmUgMiBzdGVwcy4gIFNlZSBQTFggYXBwIG5vdGUgYWJvdXQgIlN0YXJ0aW5nIGEgRE1BIHRyYW5zZmVyIiAqLworCQlSdGREbWEwQ29udHJvbChkZXYsIFBMWF9ETUFfRU5fQklUKTsJLyogZW5hYmxlIERNQSAoY2xlYXIgSU5UUj8pICovCisJCVJ0ZERtYTBDb250cm9sKGRldiwgUExYX0RNQV9FTl9CSVQgfCBQTFhfRE1BX1NUQVJUX0JJVCk7CS8qc3RhcnQgRE1BICovCisJCURQUklOVEsoInJ0ZDUyMDogVXNpbmcgRE1BMCB0cmFuc2ZlcnMuIHBseEludCAleCBSdGRJbnQgJXhcbiIsCisJCQlSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldiksIGRldnByaXYtPmludE1hc2spOworI2Vsc2UgLyogVVNFX0RNQSAqLworCQlSdGRJbnRlcnJ1cHRNYXNrKGRldiwgSVJRTV9BRENfQUJPVVRfQ05UKTsKKwkJRFBSSU5USygicnRkNTIwOiBUcmFuc2ZlcnJpbmcgZXZlcnkgMS8yIEZJRk9cbiIpOworI2VuZGlmIC8qIFVTRV9ETUEgKi8KKwl9CisKKwkvKiBCVUc6IHN0YXJ0X3NyYyBpcyBBU1NVTUVEIHRvIGJlIFRSSUdfTk9XICovCisJLyogQlVHPyBpdCBzZWVtcyBsaWtlIHRoaW5ncyBhcmUgcnVubmluZyBiZWZvcmUgdGhlICJzdGFydCIgKi8KKwlSdGRQYWNlclN0YXJ0KGRldik7CS8qIFN0YXJ0IFBBQ0VSICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgIFN0b3AgYSBydW5uaW5nIGRhdGEgYXF1aXNpdGlvbi4KKyovCitzdGF0aWMgaW50IHJ0ZF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJdTE2IHN0YXR1czsKKworCVJ0ZFBhY2VyU3RvcFNvdXJjZShkZXYsIDApOwkvKiBzdG9wIG9uIFNPRlRXQVJFIHN0b3AgKi8KKwlSdGRQYWNlclN0b3AoZGV2KTsJLyogU3RvcCBQQUNFUiAqLworCVJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgdHJpZ2dlciBvbmx5ICovCisJUnRkSW50ZXJydXB0TWFzayhkZXYsIDApOworCWRldnByaXYtPmFpQ291bnQgPSAwOwkvKiBzdG9wIGFuZCBkb24ndCB0cmFuc2ZlciBhbnkgbW9yZSAqLworI2lmZGVmIFVTRV9ETUEKKwlpZiAoZGV2cHJpdi0+ZmxhZ3MgJiBETUEwX0FDVElWRSkgeworCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsCS8qIGRpc2FibGUgYW55IG1vcmUgaW50ZXJydXB0cyAqLworCQkJUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpICYgfklDU19ETUEwX0UpOworCQlhYm9ydF9kbWEoZGV2LCAwKTsKKwkJZGV2cHJpdi0+ZmxhZ3MgJj0gfkRNQTBfQUNUSVZFOworCX0KKyNlbmRpZiAvKiBVU0VfRE1BICovCisJc3RhdHVzID0gUnRkSW50ZXJydXB0U3RhdHVzKGRldik7CisJRFBSSU5USygicnRkNTIwOiBBY3F1aXNpdGlvbiBjYW5jZWxlZC4gJWxkIGludHMsIGludFN0YXQ9JXgsIG92ZXJTdGF0PSV4XG4iLCBkZXZwcml2LT5pbnRDb3VudCwgc3RhdHVzLCAweGZmZmYgJiBSdGRJbnRlcnJ1cHRPdmVycnVuU3RhdHVzKGRldikpOworCXJldHVybiAwOworfQorCisvKgorICBHaXZlbiBhIGRlc2lyZWQgcGVyaW9kIGFuZCB0aGUgY2xvY2sgcGVyaW9kIChib3RoIGluIG5zKSwKKyAgcmV0dXJuIHRoZSBwcm9wZXIgY291bnRlciB2YWx1ZSAoZGl2aWRlci0xKS4KKyAgU2V0cyB0aGUgb3JpZ2luYWwgcGVyaW9kIHRvIGJlIHRoZSB0cnVlIHZhbHVlLgorICBOb3RlOiB5b3UgaGF2ZSB0byBjaGVjayBpZiB0aGUgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGNvdW50ZXIgcmFuZ2UhCisqLworc3RhdGljIGludCBydGRfbnNfdG9fdGltZXJfYmFzZSh1bnNpZ25lZCBpbnQgKm5hbm9zZWMsCS8qIGRlc2lyZWQgcGVyaW9kIChpbiBucykgKi8KKwlpbnQgcm91bmRfbW9kZSwgaW50IGJhc2UpCit7CQkJCS8qIGNsb2NrIHBlcmlvZCAoaW4gbnMpICovCisJaW50IGRpdmlkZXI7CisKKwlzd2l0Y2ggKHJvdW5kX21vZGUpIHsKKwljYXNlIFRSSUdfUk9VTkRfTkVBUkVTVDoKKwlkZWZhdWx0OgorCQlkaXZpZGVyID0gKCpuYW5vc2VjICsgYmFzZSAvIDIpIC8gYmFzZTsKKwkJYnJlYWs7CisJY2FzZSBUUklHX1JPVU5EX0RPV046CisJCWRpdmlkZXIgPSAoKm5hbm9zZWMpIC8gYmFzZTsKKwkJYnJlYWs7CisJY2FzZSBUUklHX1JPVU5EX1VQOgorCQlkaXZpZGVyID0gKCpuYW5vc2VjICsgYmFzZSAtIDEpIC8gYmFzZTsKKwkJYnJlYWs7CisJfQorCWlmIChkaXZpZGVyIDwgMikKKwkJZGl2aWRlciA9IDI7CS8qIG1pbiBpcyBkaXZpZGUgYnkgMiAqLworCisJLyogTm90ZTogd2UgZG9uJ3QgY2hlY2sgZm9yIG1heCwgYmVjYXVzZSBkaWZmZXJlbnQgdGltZXJzCisJICAgaGF2ZSBkaWZmZXJlbnQgcmFuZ2VzICovCisKKwkqbmFub3NlYyA9IGJhc2UgKiBkaXZpZGVyOworCXJldHVybiBkaXZpZGVyIC0gMTsJLyogY291bnRkb3duIGlzIGRpdmlzb3IrMSAqLworfQorCisvKgorICBHaXZlbiBhIGRlc2lyZWQgcGVyaW9kIChpbiBucyksCisgIHJldHVybiB0aGUgcHJvcGVyIGNvdW50ZXIgdmFsdWUgKGRpdmlkZXItMSkgZm9yIHRoZSBpbnRlcm5hbCBjbG9jay4KKyAgU2V0cyB0aGUgb3JpZ2luYWwgcGVyaW9kIHRvIGJlIHRoZSB0cnVlIHZhbHVlLgorKi8KK3N0YXRpYyBpbnQgcnRkX25zX3RvX3RpbWVyKHVuc2lnbmVkIGludCAqbnMsIGludCByb3VuZF9tb2RlKQoreworCXJldHVybiBydGRfbnNfdG9fdGltZXJfYmFzZShucywgcm91bmRfbW9kZSwgUlREX0NMT0NLX0JBU0UpOworfQorCisvKgorICBPdXRwdXQgb25lIChvciBtb3JlKSBhbmFsb2cgdmFsdWVzIHRvIGEgc2luZ2xlIHBvcnQgYXMgZmFzdCBhcyBwb3NzaWJsZS4KKyovCitzdGF0aWMgaW50IHJ0ZF9hb193aW5zbihjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgb3V0cHV0IHJhbmdlICh0YWJsZSBpbmRleCBtYXRjaGVzIHRoZSByYW5nZSB2YWx1ZXMpICovCisJUnRkRGFjUmFuZ2UoZGV2LCBjaGFuLCByYW5nZSk7CisKKwkvKiBXcml0aW5nIGEgbGlzdCBvZiB2YWx1ZXMgdG8gYW4gQU8gY2hhbm5lbCBpcyBwcm9iYWJseSBub3QKKwkgKiB2ZXJ5IHVzZWZ1bCwgYnV0IHRoYXQncyBob3cgdGhlIGludGVyZmFjZSBpcyBkZWZpbmVkLiAqLworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyArK2kpIHsKKwkJaW50IHZhbCA9IGRhdGFbaV0gPDwgMzsKKwkJaW50IHN0YXQgPSAwOwkvKiBpbml0aWFsaXplIHRvIGF2b2lkIGJvZ3VzIHdhcm5pbmcgKi8KKwkJaW50IGlpOworCisJCS8qIFZFUklGWTogY29tZWRpIHJhbmdlIGFuZCBvZmZzZXQgY29udmVyc2lvbnMgKi8KKworCQlpZiAoKHJhbmdlID4gMSkJLyogYmlwb2xhciAqLworCQkJJiYoZGF0YVtpXSA8IDIwNDgpKSB7CisJCQkvKiBvZmZzZXQgYW5kIHNpZ24gZXh0ZW5kICovCisJCQl2YWwgPSAoKChpbnQpZGF0YVtpXSkgLSAyMDQ4KSA8PCAzOworCQl9IGVsc2UgewkvKiB1bmlwb2xvciAqLworCQkJdmFsID0gZGF0YVtpXSA8PCAzOworCQl9CisKKwkJRFBSSU5USygiY29tZWRpOiBydGQ1MjAgREFDIGNoYW49JWQgcmFuZ2U9JWQgd3JpdGluZyAlZCBhcyAweCV4XG4iLCBjaGFuLCByYW5nZSwgZGF0YVtpXSwgdmFsKTsKKworCQkvKiBhIHR5cGljYWwgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgKi8KKwkJUnRkRGFjRmlmb1B1dChkZXYsIGNoYW4sIHZhbCk7CS8qIHB1dCB0aGUgdmFsdWUgaW4gKi8KKwkJUnRkRGFjVXBkYXRlKGRldiwgY2hhbik7CS8qIHRyaWdnZXIgdGhlIGNvbnZlcnNpb24gKi8KKworCQlkZXZwcml2LT5hb1ZhbHVlW2NoYW5dID0gZGF0YVtpXTsJLyogc2F2ZSBmb3IgcmVhZCBiYWNrICovCisKKwkJZm9yIChpaSA9IDA7IGlpIDwgUlREX0RBQ19USU1FT1VUOyArK2lpKSB7CisJCQlzdGF0ID0gUnRkRmlmb1N0YXR1cyhkZXYpOworCQkJLyogMSAtPiBub3QgZW1wdHkgKi8KKwkJCWlmIChzdGF0ICYgKCgwID09IGNoYW4pID8gRlNfREFDMV9OT1RfRU1QVFkgOgorCQkJCQlGU19EQUMyX05PVF9FTVBUWSkpCisJCQkJYnJlYWs7CisJCQlXQUlUX1FVSUVUTFk7CisJCX0KKwkJaWYgKGlpID49IFJURF9EQUNfVElNRU9VVCkgeworCQkJRFBSSU5USygicnRkNTIwOiBFcnJvcjogREFDIG5ldmVyIGZpbmlzaGVkISBGaWZvU3RhdHVzPTB4JXhcbiIsIHN0YXQgXiAweDY2NjYpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHJlYWQvd3JpdHRlbiAqLworCXJldHVybiBpOworfQorCisvKiBBTyBzdWJkZXZpY2VzIHNob3VsZCBoYXZlIGEgcmVhZCBpbnNuIGFzIHdlbGwgYXMgYSB3cml0ZSBpbnNuLgorICogVXN1YWxseSB0aGlzIG1lYW5zIGNvcHlpbmcgYSB2YWx1ZSBzdG9yZWQgaW4gZGV2cHJpdi4gKi8KK3N0YXRpYyBpbnQgcnRkX2FvX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBpOworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWRhdGFbaV0gPSBkZXZwcml2LT5hb1ZhbHVlW2NoYW5dOworCX0KKworCXJldHVybiBpOworfQorCisvKgorICAgV3JpdGUgYSBtYXNrZWQgc2V0IG9mIGJpdHMgYW5kIHRoZSByZWFkIGJhY2sgdGhlIHBvcnQuCisgICBXZSB0cmFjayB3aGF0IHRoZSBiaXRzIHNob3VsZCBiZSAoaS5lLiB3ZSBkb24ndCByZWFkIHRoZSBwb3J0IGZpcnN0KS4KKworICAgRElPIGRldmljZXMgYXJlIHNsaWdodGx5IHNwZWNpYWwuICBBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0bworICogaW1wbGVtZW50IHRoZSBpbnNuX3JlYWQvaW5zbl93cml0ZSBpbnRlcmZhY2UsIGl0IGlzIG11Y2ggbW9yZQorICogdXNlZnVsIHRvIGFwcGxpY2F0aW9ucyBpZiB5b3UgaW1wbGVtZW50IHRoZSBpbnNuX2JpdHMgaW50ZXJmYWNlLgorICogVGhpcyBhbGxvd3MgcGFja2VkIHJlYWRpbmcvd3JpdGluZyBvZiB0aGUgRElPIGNoYW5uZWxzLiAgVGhlCisgKiBjb21lZGkgY29yZSBjYW4gY29udmVydCBiZXR3ZWVuIGluc25fYml0cyBhbmQgaW5zbl9yZWFkL3dyaXRlCisgKi8KK3N0YXRpYyBpbnQgcnRkX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaWYgKGluc24tPm4gIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUaGUgaW5zbiBkYXRhIGlzIGEgbWFzayBpbiBkYXRhWzBdIGFuZCB0aGUgbmV3IGRhdGEKKwkgKiBpbiBkYXRhWzFdLCBlYWNoIGNoYW5uZWwgY29vcmVzcG9uZGluZyB0byBhIGJpdC4gKi8KKwlpZiAoZGF0YVswXSkgeworCQlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKKwkJcy0+c3RhdGUgfD0gZGF0YVswXSAmIGRhdGFbMV07CisKKwkJLyogV3JpdGUgb3V0IHRoZSBuZXcgZGlnaXRhbCBvdXRwdXQgbGluZXMgKi8KKwkJUnRkRGlvMFdyaXRlKGRldiwgcy0+c3RhdGUpOworCX0KKwkvKiBvbiByZXR1cm4sIGRhdGFbMV0gY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBkaWdpdGFsCisJICogaW5wdXQgbGluZXMuICovCisJZGF0YVsxXSA9IFJ0ZERpbzBSZWFkKGRldik7CisKKwkvKkRQUklOVEsoInJ0ZDUyMDpwb3J0XzAgd3JvdGU6IDB4JXggcmVhZDogMHgleFxuIiwgcy0+c3RhdGUsIGRhdGFbMV0pOyAqLworCisJcmV0dXJuIDI7Cit9CisKKy8qCisgIENvbmZpZ3VyZSBvbmUgYml0IG9uIGEgSU8gcG9ydCBhcyBJbnB1dCBvciBPdXRwdXQgKGhlbmNlIHRoZSBuYW1lIDotKS4KKyovCitzdGF0aWMgaW50IHJ0ZF9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCS8qIFRoZSBpbnB1dCBvciBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiBlYWNoIGRpZ2l0YWwgbGluZSBpcworCSAqIGNvbmZpZ3VyZWQgYnkgYSBzcGVjaWFsIGluc25fY29uZmlnIGluc3RydWN0aW9uLiAgY2hhbnNwZWMKKwkgKiBjb250YWlucyB0aGUgY2hhbm5lbCB0byBiZSBjaGFuZ2VkLCBhbmQgZGF0YVswXSBjb250YWlucyB0aGUKKwkgKiB2YWx1ZSBDT01FRElfSU5QVVQgb3IgQ09NRURJX09VVFBVVC4gKi8KKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX0RJT19PVVRQVVQ6CisJCXMtPmlvX2JpdHMgfD0gMSA8PCBjaGFuOwkvKiAxIG1lYW5zIE91dCAqLworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0RJT19JTlBVVDoKKwkJcy0+aW9fYml0cyAmPSB+KDEgPDwgY2hhbik7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX1FVRVJZOgorCQlkYXRhWzFdID0KKwkJCShzLT4KKwkJCWlvX2JpdHMgJiAoMSA8PCBjaGFuKSkgPyBDT01FRElfT1VUUFVUIDogQ09NRURJX0lOUFVUOworCQlyZXR1cm4gaW5zbi0+bjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJRFBSSU5USygicnRkNTIwOiBwb3J0XzBfZGlyZWN0aW9uPTB4JXggKDEgbWVhbnMgb3V0KVxuIiwgcy0+aW9fYml0cyk7CisJLyogVE9ETyBzdXBwb3J0IGRpZ2l0YWwgbWF0Y2ggaW50ZXJydXB0cyBhbmQgc3Ryb2JlcyAqLworCVJ0ZERpb1N0YXR1c1dyaXRlKGRldiwgMHgwMSk7CS8qIG1ha2UgRGlvMEN0cmwgcG9pbnQgdG8gZGlyZWN0aW9uICovCisJUnRkRGlvMEN0cmxXcml0ZShkZXYsIHMtPmlvX2JpdHMpOwkvKiBzZXQgZGlyZWN0aW9uIDEgbWVhbnMgT3V0ICovCisJUnRkRGlvU3RhdHVzV3JpdGUoZGV2LCAwKTsJLyogbWFrZSBEaW8wQ3RybCBjbGVhciBpbnRlcnJ1cHRzICovCisKKwkvKiBwb3J0MSBjYW4gb25seSBiZSBhbGwgaW5wdXQgb3IgYWxsIG91dHB1dCAqLworCisJLyogdGhlcmUgYXJlIGFsc28gMiB1c2VyIGlucHV0IGxpbmVzIGFuZCAyIHVzZXIgb3V0cHV0IGxpbmVzICovCisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEEgY29udmVuaWVudCBtYWNybyB0aGF0IGRlZmluZXMgaW5pdF9tb2R1bGUoKSBhbmQgY2xlYW51cF9tb2R1bGUoKSwKKyAqIGFzIG5lY2Vzc2FyeS4KKyAqLworQ09NRURJX1BDSV9JTklUQ0xFQU5VUChydGQ1MjBEcml2ZXIsIHJ0ZDUyMF9wY2lfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjUwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmgKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvcnRkNTIwLmgKKyAgICBDb21lZGkgZHJpdmVyIGRlZmluZXMgZm9yIFJlYWwgVGltZSBEZXZpY2VzIChSVEQpIFBDSTQ1MjAvRE03NTIwCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorICAgIENyZWF0ZWQgYnkgRGFuIENocmlzdGlhbiwgTkFTQSBBbWVzIFJlc2VhcmNoIENlbnRlci4KKyAgICBTZWUgYm9hcmQgbm90ZXMgaW4gcnRkNTIwLmMKKyovCisKKy8qCisgIExBUzAgUnVudGltZSBBcmVhCisgIExvY2FsIEFkZHJlc3MgU3BhY2UgMCBPZmZzZXQJCVJlYWQgRnVuY3Rpb24JV3JpdGUgRnVuY3Rpb24KKyovCisjZGVmaW5lIExBUzBfU1BBUkVfMDAgICAgMHgwMDAwCS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorI2RlZmluZSBMQVMwX1NQQVJFXzA0ICAgIDB4MDAwNAkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyNkZWZpbmUgTEFTMF9VU0VSX0lPICAgICAweDAwMDgJLy8gUmVhZCBVc2VyIElucHV0cyAgICAgICAgICAgICAgICBXcml0ZSBVc2VyIE91dHB1dHMKKyNkZWZpbmUgTEFTMF9TUEFSRV8wQyAgICAweDAwMEMJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisjZGVmaW5lIExBUzBfQURDICAgICAgICAgMHgwMDEwCS8vIFJlYWQgRklGTyBTdGF0dXMgICAgICAgICAgICAgICAgU29mdHdhcmUgQS9EIFN0YXJ0CisjZGVmaW5lIExBUzBfREFDMSAgICAgICAgMHgwMDE0CS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUgRC9BMSBVcGRhdGUKKyNkZWZpbmUgTEFTMF9EQUMyICAgICAgICAweDAwMTgJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2Z0d2FyZSBEL0EyIFVwZGF0ZQorI2RlZmluZSBMQVMwX1NQQVJFXzFDICAgIDB4MDAxQwkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyNkZWZpbmUgTEFTMF9TUEFSRV8yMCAgICAweDAwMjAJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisjZGVmaW5lIExBUzBfREFDICAgICAgICAgMHgwMDI0CS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUgU2ltdWx0YW5lb3VzIEQvQTEgYW5kIEQvQTIgVXBkYXRlCisjZGVmaW5lIExBUzBfUEFDRVIgICAgICAgMHgwMDI4CS8vIFNvZnR3YXJlIFBhY2VyIFN0YXJ0ICAgICAgICAgICAgU29mdHdhcmUgUGFjZXIgU3RvcAorI2RlZmluZSBMQVMwX1RJTUVSICAgICAgIDB4MDAyQwkvLyBSZWFkIFRpbWVyIENvdW50ZXJzIFN0YXR1cyAgICAgIEhESU4gU29mdHdhcmUgVHJpZ2dlcgorI2RlZmluZSBMQVMwX0lUICAgICAgICAgIDB4MDAzMAkvLyBSZWFkIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgIFdyaXRlIEludGVycnVwdCBFbmFibGUgTWFzayBSZWdpc3RlcgorI2RlZmluZSBMQVMwX0NMRUFSICAgICAgIDB4MDAzNAkvLyBDbGVhciBJVHMgc2V0IGJ5IENsZWFyIE1hc2sgICAgIFNldCBJbnRlcnJ1cHQgQ2xlYXIgTWFzaworI2RlZmluZSBMQVMwX09WRVJSVU4gICAgIDB4MDAzOAkvLyBSZWFkIHBlbmRpbmcgaW50ZXJydXB0cyAgICAgICAgIENsZWFyIE92ZXJydW4gUmVnaXN0ZXIKKyNkZWZpbmUgTEFTMF9TUEFSRV8zQyAgICAweDAwM0MJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisKKy8qCisgIExBUzAgUnVudGltZSBBcmVhIFRpbWVyL0NvdW50ZXIsRGlnLklPCisgIE5hbWUJCQlMb2NhbCBBZGRyZXNzCQkJRnVuY3Rpb24KKyovCisjZGVmaW5lIExBUzBfUENMSyAgICAgICAgMHgwMDQwCS8vIFBhY2VyIENsb2NrIHZhbHVlICgyNGJpdCkgICAgICAgICAgICAgUGFjZXIgQ2xvY2sgbG9hZCAoMjRiaXQpCisjZGVmaW5lIExBUzBfQkNMSyAgICAgICAgMHgwMDQ0CS8vIEJ1cnN0IENsb2NrIHZhbHVlICgxMGJpdCkgICAgICAgICAgICAgQnVyc3QgQ2xvY2sgbG9hZCAoMTBiaXQpCisjZGVmaW5lIExBUzBfQURDX1NDTlQgICAgMHgwMDQ4CS8vIEEvRCBTYW1wbGUgY291bnRlciB2YWx1ZSAoMTBiaXQpICAgICAgQS9EIFNhbXBsZSBjb3VudGVyIGxvYWQgKDEwYml0KQorI2RlZmluZSBMQVMwX0RBQzFfVUNOVCAgIDB4MDA0QwkvLyBEL0ExIFVwZGF0ZSBjb3VudGVyIHZhbHVlICgxMCBiaXQpICAgIEQvQTEgVXBkYXRlIGNvdW50ZXIgbG9hZCAoMTBiaXQpCisjZGVmaW5lIExBUzBfREFDMl9VQ05UICAgMHgwMDUwCS8vIEQvQTIgVXBkYXRlIGNvdW50ZXIgdmFsdWUgKDEwIGJpdCkgICAgRC9BMiBVcGRhdGUgY291bnRlciBsb2FkICgxMGJpdCkKKyNkZWZpbmUgTEFTMF9EQ05UICAgICAgICAweDAwNTQJLy8gRGVsYXkgY291bnRlciB2YWx1ZSAoMTYgYml0KSAgICAgICAgICBEZWxheSBjb3VudGVyIGxvYWQgKDE2Yml0KQorI2RlZmluZSBMQVMwX0FDTlQgICAgICAgIDB4MDA1OAkvLyBBYm91dCBjb3VudGVyIHZhbHVlICgxNiBiaXQpICAgICAgICAgIEFib3V0IGNvdW50ZXIgbG9hZCAoMTZiaXQpCisjZGVmaW5lIExBUzBfREFDX0NMSyAgICAgMHgwMDVDCS8vIERBQyBjbG9jayB2YWx1ZSAoMTZiaXQpICAgICAgICAgICAgICAgREFDIGNsb2NrIGxvYWQgKDE2Yml0KQorI2RlZmluZSBMQVMwX1VUQzAgICAgICAgIDB4MDA2MAkvLyA4MjU0IFRDIENvdW50ZXIgMCBVc2VyIFRDIDAgdmFsdWUgICAgIExvYWQgY291bnQgaW4gVEMgQ291bnRlciAwCisjZGVmaW5lIExBUzBfVVRDMSAgICAgICAgMHgwMDY0CS8vIDgyNTQgVEMgQ291bnRlciAxIFVzZXIgVEMgMSB2YWx1ZSAgICAgTG9hZCBjb3VudCBpbiBUQyBDb3VudGVyIDEKKyNkZWZpbmUgTEFTMF9VVEMyICAgICAgICAweDAwNjgJLy8gODI1NCBUQyBDb3VudGVyIDIgVXNlciBUQyAyIHZhbHVlICAgICBMb2FkIGNvdW50IGluIFRDIENvdW50ZXIgMgorI2RlZmluZSBMQVMwX1VUQ19DVFJMICAgIDB4MDA2QwkvLyA4MjU0IFRDIENvbnRyb2wgV29yZCAgICAgICAgICAgICAgICAgIFByb2dyYW0gY291bnRlciBtb2RlIGZvciBUQworI2RlZmluZSBMQVMwX0RJTzAgICAgICAgIDB4MDA3MAkvLyBEaWdpdGFsIEkvTyBQb3J0IDAgUmVhZCBQb3J0ICAgICAgICAgIERpZ2l0YWwgSS9PIFBvcnQgMCBXcml0ZSBQb3J0CisjZGVmaW5lIExBUzBfRElPMSAgICAgICAgMHgwMDc0CS8vIERpZ2l0YWwgSS9PIFBvcnQgMSBSZWFkIFBvcnQgICAgICAgICAgRGlnaXRhbCBJL08gUG9ydCAxIFdyaXRlIFBvcnQKKyNkZWZpbmUgTEFTMF9ESU8wX0NUUkwgICAweDAwNzgJLy8gQ2xlYXIgZGlnaXRhbCBJUlEgc3RhdHVzIGZsYWcvcmVhZCAgICBDbGVhciBkaWdpdGFsIGNoaXAvcHJvZ3JhbSBQb3J0IDAKKyNkZWZpbmUgTEFTMF9ESU9fU1RBVFVTICAweDAwN0MJLy8gUmVhZCBEaWdpdGFsIEkvTyBTdGF0dXMgd29yZCAgICAgICAgICBQcm9ncmFtIGRpZ2l0YWwgY29udHJvbCByZWdpc3RlciAmCisKKy8qCisgIExBUzAgU2V0dXAgQXJlYQorICBOYW1lCQkJTG9jYWwgQWRkcmVzcwkJCUZ1bmN0aW9uCisqLworI2RlZmluZSBMQVMwX0JPQVJEX1JFU0VUICAgICAgICAweDAxMDAJLy8gQm9hcmQgcmVzZXQKKyNkZWZpbmUgTEFTMF9ETUEwX1NSQyAgICAgICAgICAgMHgwMTA0CS8vIERNQSAwIFNvdXJjZXMgc2VsZWN0CisjZGVmaW5lIExBUzBfRE1BMV9TUkMgICAgICAgICAgIDB4MDEwOAkvLyBETUEgMSBTb3VyY2VzIHNlbGVjdAorI2RlZmluZSBMQVMwX0FEQ19DT05WRVJTSU9OICAgICAweDAxMEMJLy8gQS9EIENvbnZlcnNpb24gU2lnbmFsIHNlbGVjdAorI2RlZmluZSBMQVMwX0JVUlNUX1NUQVJUICAgICAgICAweDAxMTAJLy8gQnVyc3QgQ2xvY2sgU3RhcnQgVHJpZ2dlciBzZWxlY3QKKyNkZWZpbmUgTEFTMF9QQUNFUl9TVEFSVCAgICAgICAgMHgwMTE0CS8vIFBhY2VyIENsb2NrIFN0YXJ0IFRyaWdnZXIgc2VsZWN0CisjZGVmaW5lIExBUzBfUEFDRVJfU1RPUCAgICAgICAgIDB4MDExOAkvLyBQYWNlciBDbG9jayBTdG9wIFRyaWdnZXIgc2VsZWN0CisjZGVmaW5lIExBUzBfQUNOVF9TVE9QX0VOQUJMRSAgIDB4MDExQwkvLyBBYm91dCBDb3VudGVyIFN0b3AgRW5hYmxlCisjZGVmaW5lIExBUzBfUEFDRVJfUkVQRUFUICAgICAgIDB4MDEyMAkvLyBQYWNlciBTdGFydCBUcmlnZ2VyIE1vZGUgc2VsZWN0CisjZGVmaW5lIExBUzBfRElOX1NUQVJUICAgICAgICAgIDB4MDEyNAkvLyBIaWdoIFNwZWVkIERpZ2l0YWwgSW5wdXQgU2FtcGxpbmcgU2lnbmFsIHNlbGVjdAorI2RlZmluZSBMQVMwX0RJTl9GSUZPX0NMRUFSICAgICAweDAxMjgJLy8gRGlnaXRhbCBJbnB1dCBGSUZPIENsZWFyCisjZGVmaW5lIExBUzBfQURDX0ZJRk9fQ0xFQVIgICAgIDB4MDEyQwkvLyBBL0QgRklGTyBDbGVhcgorI2RlZmluZSBMQVMwX0NHVF9XUklURSAgICAgICAgICAweDAxMzAJLy8gQ2hhbm5lbCBHYWluIFRhYmxlIFdyaXRlCisjZGVmaW5lIExBUzBfQ0dMX1dSSVRFICAgICAgICAgIDB4MDEzNAkvLyBDaGFubmVsIEdhaW4gTGF0Y2ggV3JpdGUKKyNkZWZpbmUgTEFTMF9DR19EQVRBICAgICAgICAgICAgMHgwMTM4CS8vIERpZ2l0YWwgVGFibGUgV3JpdGUKKyNkZWZpbmUgTEFTMF9DR1RfRU5BQkxFCQkweDAxM0MJLy8gQ2hhbm5lbCBHYWluIFRhYmxlIEVuYWJsZQorI2RlZmluZSBMQVMwX0NHX0VOQUJMRSAgICAgICAgICAweDAxNDAJLy8gRGlnaXRhbCBUYWJsZSBFbmFibGUKKyNkZWZpbmUgTEFTMF9DR1RfUEFVU0UgICAgICAgICAgMHgwMTQ0CS8vIFRhYmxlIFBhdXNlIEVuYWJsZQorI2RlZmluZSBMQVMwX0NHVF9SRVNFVCAgICAgICAgICAweDAxNDgJLy8gUmVzZXQgQ2hhbm5lbCBHYWluIFRhYmxlCisjZGVmaW5lIExBUzBfQ0dUX0NMRUFSICAgICAgICAgIDB4MDE0QwkvLyBDbGVhciBDaGFubmVsIEdhaW4gVGFibGUKKyNkZWZpbmUgTEFTMF9EQUMxX0NUUkwgICAgICAgICAgMHgwMTUwCS8vIEQvQTEgb3V0cHV0IHR5cGUvcmFuZ2UKKyNkZWZpbmUgTEFTMF9EQUMxX1NSQyAgICAgICAgICAgMHgwMTU0CS8vIEQvQTEgdXBkYXRlIHNvdXJjZQorI2RlZmluZSBMQVMwX0RBQzFfQ1lDTEUgICAgICAgICAweDAxNTgJLy8gRC9BMSBjeWNsZSBtb2RlCisjZGVmaW5lIExBUzBfREFDMV9SRVNFVCAgICAgICAgIDB4MDE1QwkvLyBEL0ExIEZJRk8gcmVzZXQKKyNkZWZpbmUgTEFTMF9EQUMxX0ZJRk9fQ0xFQVIgICAgMHgwMTYwCS8vIEQvQTEgRklGTyBjbGVhcgorI2RlZmluZSBMQVMwX0RBQzJfQ1RSTCAgICAgICAgICAweDAxNjQJLy8gRC9BMiBvdXRwdXQgdHlwZS9yYW5nZQorI2RlZmluZSBMQVMwX0RBQzJfU1JDICAgICAgICAgICAweDAxNjgJLy8gRC9BMiB1cGRhdGUgc291cmNlCisjZGVmaW5lIExBUzBfREFDMl9DWUNMRSAgICAgICAgIDB4MDE2QwkvLyBEL0EyIGN5Y2xlIG1vZGUKKyNkZWZpbmUgTEFTMF9EQUMyX1JFU0VUICAgICAgICAgMHgwMTcwCS8vIEQvQTIgRklGTyByZXNldAorI2RlZmluZSBMQVMwX0RBQzJfRklGT19DTEVBUiAgICAweDAxNzQJLy8gRC9BMiBGSUZPIGNsZWFyCisjZGVmaW5lIExBUzBfQURDX1NDTlRfU1JDICAgICAgIDB4MDE3OAkvLyBBL0QgU2FtcGxlIENvdW50ZXIgU291cmNlIHNlbGVjdAorI2RlZmluZSBMQVMwX1BBQ0VSX1NFTEVDVCAgICAgICAweDAxODAJLy8gUGFjZXIgQ2xvY2sgc2VsZWN0CisjZGVmaW5lIExBUzBfU0JVUzBfU1JDICAgICAgICAgIDB4MDE4NAkvLyBTeW5jQnVzIDAgU291cmNlIHNlbGVjdAorI2RlZmluZSBMQVMwX1NCVVMwX0VOQUJMRSAgICAgICAweDAxODgJLy8gU3luY0J1cyAwIGVuYWJsZQorI2RlZmluZSBMQVMwX1NCVVMxX1NSQyAgICAgICAgICAweDAxOEMJLy8gU3luY0J1cyAxIFNvdXJjZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9TQlVTMV9FTkFCTEUgICAgICAgMHgwMTkwCS8vIFN5bmNCdXMgMSBlbmFibGUKKyNkZWZpbmUgTEFTMF9TQlVTMl9TUkMgICAgICAgICAgMHgwMTk4CS8vIFN5bmNCdXMgMiBTb3VyY2Ugc2VsZWN0CisjZGVmaW5lIExBUzBfU0JVUzJfRU5BQkxFICAgICAgIDB4MDE5QwkvLyBTeW5jQnVzIDIgZW5hYmxlCisjZGVmaW5lIExBUzBfRVRSR19QT0xBUklUWSAgICAgIDB4MDFBNAkvLyBFeHRlcm5hbCBUcmlnZ2VyIHBvbGFyaXR5IHNlbGVjdAorI2RlZmluZSBMQVMwX0VJTlRfUE9MQVJJVFkgICAgICAweDAxQTgJLy8gRXh0ZXJuYWwgSW50ZXJydXB0IHBvbGFyaXR5IHNlbGVjdAorI2RlZmluZSBMQVMwX1VUQzBfQ0xPQ0sgICAgICAgICAweDAxQUMJLy8gVVRDMCBDbG9jayBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VVEMwX0dBVEUgICAgICAgICAgMHgwMUIwCS8vIFVUQzAgR2F0ZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VVEMxX0NMT0NLICAgICAgICAgMHgwMUI0CS8vIFVUQzEgQ2xvY2sgc2VsZWN0CisjZGVmaW5lIExBUzBfVVRDMV9HQVRFICAgICAgICAgIDB4MDFCOAkvLyBVVEMxIEdhdGUgc2VsZWN0CisjZGVmaW5lIExBUzBfVVRDMl9DTE9DSyAgICAgICAgIDB4MDFCQwkvLyBVVEMyIENsb2NrIHNlbGVjdAorI2RlZmluZSBMQVMwX1VUQzJfR0FURSAgICAgICAgICAweDAxQzAJLy8gVVRDMiBHYXRlIHNlbGVjdAorI2RlZmluZSBMQVMwX1VPVVQwX1NFTEVDVCAgICAgICAweDAxQzQJLy8gVXNlciBPdXRwdXQgMCBzb3VyY2Ugc2VsZWN0CisjZGVmaW5lIExBUzBfVU9VVDFfU0VMRUNUICAgICAgIDB4MDFDOAkvLyBVc2VyIE91dHB1dCAxIHNvdXJjZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9ETUEwX1JFU0VUICAgICAgICAgMHgwMUNDCS8vIERNQTAgUmVxdWVzdCBzdGF0ZSBtYWNoaW5lIHJlc2V0CisjZGVmaW5lIExBUzBfRE1BMV9SRVNFVCAgICAgICAgIDB4MDFEMAkvLyBETUExIFJlcXVlc3Qgc3RhdGUgbWFjaGluZSByZXNldAorCisvKgorICBMQVMxCisgIE5hbWUJCQlMb2NhbCBBZGRyZXNzCQkJRnVuY3Rpb24KKyovCisjZGVmaW5lIExBUzFfQURDX0ZJRk8gICAgICAgICAgICAweDAwMDAJLy8gUmVhZCBBL0QgRklGTyAoMTZiaXQpIC0KKyNkZWZpbmUgTEFTMV9IRElPX0ZJRk8gICAgICAgICAgIDB4MDAwNAkvLyBSZWFkIEhpZ2ggU3BlZWQgRGlnaXRhbCBJbnB1dCBGSUZPICgxNmJpdCkgLQorI2RlZmluZSBMQVMxX0RBQzFfRklGTyAgICAgICAgICAgMHgwMDA4CS8vIC0gV3JpdGUgRC9BMSBGSUZPICgxNmJpdCkKKyNkZWZpbmUgTEFTMV9EQUMyX0ZJRk8gICAgICAgICAgIDB4MDAwQwkvLyAtIFdyaXRlIEQvQTIgRklGTyAoMTZiaXQpCisKKy8qCisgIExDRkc6IFBMWCA5MDgwIGxvY2FsIGNvbmZpZyAmIHJ1bnRpbWUgcmVnaXN0ZXJzCisgIE5hbWUJCQlMb2NhbCBBZGRyZXNzCQkJRnVuY3Rpb24KKyovCisjZGVmaW5lIExDRkdfSVRDU1IgICAgICAgICAgICAgIDB4MDA2OAkvLyBJTlRDU1IsIEludGVycnVwdCBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQU1PREUwICAgICAgICAgICAweDAwODAJLy8gRE1BIENoYW5uZWwgMCBNb2RlIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BUEFEUjAgICAgICAgICAgIDB4MDA4NAkvLyBETUEgQ2hhbm5lbCAwIFBDSSBBZGRyZXNzIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BTEFEUjAgICAgICAgICAgIDB4MDA4OAkvLyBETUEgQ2hhbm5lbCAwIExvY2FsIEFkZHJlc3MgUmVnCisjZGVmaW5lIExDRkdfRE1BU0laMCAgICAgICAgICAgIDB4MDA4QwkvLyBETUEgQ2hhbm5lbCAwIFRyYW5zZmVyIFNpemUgKEJ5dGVzKSBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQURQUjAgICAgICAgICAgICAweDAwOTAJLy8gRE1BIENoYW5uZWwgMCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFNT0RFMSAgICAgICAgICAgMHgwMDk0CS8vIERNQSBDaGFubmVsIDEgTW9kZSBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQVBBRFIxICAgICAgICAgICAweDAwOTgJLy8gRE1BIENoYW5uZWwgMSBQQ0kgQWRkcmVzcyBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQUxBRFIxICAgICAgICAgICAweDAwOUMJLy8gRE1BIENoYW5uZWwgMSBMb2NhbCBBZGRyZXNzIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BU0laMSAgICAgICAgICAgIDB4MDBBMAkvLyBETUEgQ2hhbm5lbCAxIFRyYW5zZmVyIFNpemUgKEJ5dGVzKSBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQURQUjEgICAgICAgICAgICAweDAwQTQJLy8gRE1BIENoYW5uZWwgMSBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFDU1IwICAgICAgICAgICAgMHgwMEE4CS8vIERNQSBDaGFubmVsIDAgQ29tbWFuZC9TdGF0dXMgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFDU1IxICAgICAgICAgICAgMHgwMEE5CS8vIERNQSBDaGFubmVsIDAgQ29tbWFuZC9TdGF0dXMgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFBUkIgICAgICAgICAgICAgMHgwMEFDCS8vIERNQSBBcmJpdHJhdGlvbiBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQVRIUiAgICAgICAgICAgICAweDAwQjAJLy8gRE1BIFRocmVzaG9sZCBSZWdpc3RlcgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVzaXN0ZXIgYml0IGRlZmluaXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLy8gRklGTyBTdGF0dXMgV29yZCBCaXRzIChSdGRGaWZvU3RhdHVzKQorI2RlZmluZSBGU19EQUMxX05PVF9FTVBUWSAgICAweDAwMDEJLy8gRDAgIC0gREFDMSBGSUZPIG5vdCBlbXB0eQorI2RlZmluZSBGU19EQUMxX0hFTVBUWSAgIDB4MDAwMgkvLyBEMSAgLSBEQUMxIEZJRk8gaGFsZiBlbXB0eQorI2RlZmluZSBGU19EQUMxX05PVF9GVUxMICAgICAweDAwMDQJLy8gRDIgIC0gREFDMSBGSUZPIG5vdCBmdWxsCisjZGVmaW5lIEZTX0RBQzJfTk9UX0VNUFRZICAgIDB4MDAxMAkvLyBENCAgLSBEQUMyIEZJRk8gbm90IGVtcHR5CisjZGVmaW5lIEZTX0RBQzJfSEVNUFRZICAgMHgwMDIwCS8vIEQ1ICAtIERBQzIgRklGTyBoYWxmIGVtcHR5CisjZGVmaW5lIEZTX0RBQzJfTk9UX0ZVTEwgICAgIDB4MDA0MAkvLyBENiAgLSBEQUMyIEZJRk8gbm90IGZ1bGwKKyNkZWZpbmUgRlNfQURDX05PVF9FTVBUWSAgICAgMHgwMTAwCS8vIEQ4ICAtIEFEQyBGSUZPIG5vdCBlbXB0eQorI2RlZmluZSBGU19BRENfSEVNUFRZICAgIDB4MDIwMAkvLyBEOSAgLSBBREMgRklGTyBoYWxmIGVtcHR5CisjZGVmaW5lIEZTX0FEQ19OT1RfRlVMTCAgICAgIDB4MDQwMAkvLyBEMTAgLSBBREMgRklGTyBub3QgZnVsbAorI2RlZmluZSBGU19ESU5fTk9UX0VNUFRZICAgICAweDEwMDAJLy8gRDEyIC0gRElOIEZJRk8gbm90IGVtcHR5CisjZGVmaW5lIEZTX0RJTl9IRU1QVFkgICAgMHgyMDAwCS8vIEQxMyAtIERJTiBGSUZPIGhhbGYgZW1wdHkKKyNkZWZpbmUgRlNfRElOX05PVF9GVUxMICAgICAgMHg0MDAwCS8vIEQxNCAtIERJTiBGSUZPIG5vdCBmdWxsCisKKy8vIFRpbWVyIFN0YXR1cyBXb3JkIEJpdHMgKEdldFRpbWVyU3RhdHVzKQorI2RlZmluZSBUU19QQ0xLX0dBVEUgICAweDAwMDEKKy8vIEQwIC0gUGFjZXIgQ2xvY2sgR2F0ZSBbMCAtIGdhdGVkLCAxIC0gZW5hYmxlZF0KKyNkZWZpbmUgVFNfQkNMS19HQVRFICAgMHgwMDAyCisvLyBEMSAtIEJ1cnN0IENsb2NrIEdhdGUgWzAgLSBkaXNhYmxlZCwgMSAtIHJ1bm5pbmddCisjZGVmaW5lIFRTX0RDTlRfR0FURSAgIDB4MDAwNAorLy8gRDIgLSBQYWNlciBDbG9jayBEZWxheWVkIFN0YXJ0IFRyaWdnZXIgWzAgLSBkZWxheSBvdmVyLCAxIC0gZGVsYXkgaW4KKy8vIHByb2dyZXNzXQorI2RlZmluZSBUU19BQ05UX0dBVEUgICAweDAwMDgKKy8vIEQzIC0gUGFjZXIgQ2xvY2sgQWJvdXQgVHJpZ2dlciBbMCAtIGNvbXBsZXRlZCwgMSAtIGluIHByb2dyZXNzXQorI2RlZmluZSBUU19QQ0xLX1JVTiAgICAweDAwMTAKKy8vIEQ0IC0gUGFjZXIgQ2xvY2sgU2h1dGRvd24gRmxhZyBbMCAtIFBhY2VyIENsb2NrIGNhbm5vdCBiZSBzdGFydAorLy8gdHJpZ2dlcmVkIG9ubHkgYnkgU29mdHdhcmUgUGFjZXIgU3RhcnQgQ29tbWFuZCwgMSAtIFBhY2VyIENsb2NrIGNhbgorLy8gYmUgc3RhcnQgdHJpZ2dlcmVkXQorCisvLyBFeHRlcm5hbCBUcmlnZ2VyIHBvbGFyaXR5IHNlbGVjdAorLy8gRXh0ZXJuYWwgSW50ZXJydXB0IHBvbGFyaXR5IHNlbGVjdAorI2RlZmluZSBQT0xfUE9TSVRJVkUgICAgICAgICAweDAJLy8gcG9zaXRpdmUgZWRnZQorI2RlZmluZSBQT0xfTkVHQVRJVkUgICAgICAgICAweDEJLy8gbmVnYXRpdmUgZWRnZQorCisvLyBVc2VyIE91dHB1dCBTaWduYWwgc2VsZWN0IChTZXRVb3V0MFNvdXJjZSwgU2V0VW91dDFTb3VyY2UpCisjZGVmaW5lIFVPVVRfQURDICAgICAgICAgICAgICAgIDB4MAkvLyBBL0QgQ29udmVyc2lvbiBTaWduYWwKKyNkZWZpbmUgVU9VVF9EQUMxICAgICAgICAgICAgICAgMHgxCS8vIEQvQTEgVXBkYXRlCisjZGVmaW5lIFVPVVRfREFDMiAgICAgICAgICAgICAgIDB4MgkvLyBEL0EyIFVwZGF0ZQorI2RlZmluZSBVT1VUX1NPRlRXQVJFICAgICAgICAgICAweDMJLy8gU29mdHdhcmUgUHJvZ3JhbW1hYmxlCisKKy8vIFBhY2VyIGNsb2NrIHNlbGVjdCAoU2V0UGFjZXJTb3VyY2UpCisjZGVmaW5lIFBDTEtfSU5URVJOQUwgICAgICAgICAgIDEJLy8gSW50ZXJuYWwgUGFjZXIgQ2xvY2sKKyNkZWZpbmUgUENMS19FWFRFUk5BTCAgICAgICAgICAgMAkvLyBFeHRlcm5hbCBQYWNlciBDbG9jaworCisvLyBBL0QgU2FtcGxlIENvdW50ZXIgU291cmNlcyAoU2V0QWRjbnRTb3VyY2UsIFNldHVwU2FtcGxlQ291bnRlcikKKyNkZWZpbmUgQURDX1NDTlRfQ0dUX1JFU0VUICAgICAgICAgMHgwCS8vIG5lZWRzIHJlc3RhcnQgd2l0aCBTdGFydFBhY2VyCisjZGVmaW5lIEFEQ19TQ05UX0ZJRk9fV1JJVEUgICAgICAgIDB4MQorCisvLyBBL0QgQ29udmVyc2lvbiBTaWduYWwgU2VsZWN0IChmb3IgU2V0Q29udmVyc2lvblNlbGVjdCkKKyNkZWZpbmUgQURDX1NUQVJUX1NPRlRXQVJFICAgICAgICAgMHgwCS8vIFNvZnR3YXJlIEEvRCBTdGFydAorI2RlZmluZSBBRENfU1RBUlRfUENMSyAgICAgICAgICAgICAweDEJLy8gUGFjZXIgQ2xvY2sgKEV4dC4gSW50LiBzZWUgRnVuYy41MDkpCisjZGVmaW5lIEFEQ19TVEFSVF9CQ0xLICAgICAgICAgICAgIDB4MgkvLyBCdXJzdCBDbG9jaworI2RlZmluZSBBRENfU1RBUlRfRElHSVRBTF9JVCAgICAgICAweDMJLy8gRGlnaXRhbCBJbnRlcnJ1cHQKKyNkZWZpbmUgQURDX1NUQVJUX0RBQzFfTUFSS0VSMSAgICAgMHg0CS8vIEQvQSAxIERhdGEgTWFya2VyIDEKKyNkZWZpbmUgQURDX1NUQVJUX0RBQzJfTUFSS0VSMSAgICAgMHg1CS8vIEQvQSAyIERhdGEgTWFya2VyIDEKKyNkZWZpbmUgQURDX1NUQVJUX1NCVVMwICAgICAgICAgICAgMHg2CS8vIFN5bmNCdXMgMAorI2RlZmluZSBBRENfU1RBUlRfU0JVUzEgICAgICAgICAgICAweDcJLy8gU3luY0J1cyAxCisjZGVmaW5lIEFEQ19TVEFSVF9TQlVTMiAgICAgICAgICAgIDB4OAkvLyBTeW5jQnVzIDIKKworLy8gQnVyc3QgQ2xvY2sgc3RhcnQgdHJpZ2dlciBzZWxlY3QgKFNldEJ1cnN0U3RhcnQpCisjZGVmaW5lIEJDTEtfU1RBUlRfU09GVFdBUkUgICAgICAgIDB4MAkvLyBTb2Z0d2FyZSBBL0QgU3RhcnQgKFN0YXJ0QnVyc3QpCisjZGVmaW5lIEJDTEtfU1RBUlRfUENMSyAgICAgICAgICAgIDB4MQkvLyBQYWNlciBDbG9jaworI2RlZmluZSBCQ0xLX1NUQVJUX0VUUklHICAgICAgICAgICAweDIJLy8gRXh0ZXJuYWwgVHJpZ2dlcgorI2RlZmluZSBCQ0xLX1NUQVJUX0RJR0lUQUxfSVQgICAgICAweDMJLy8gRGlnaXRhbCBJbnRlcnJ1cHQKKyNkZWZpbmUgQkNMS19TVEFSVF9TQlVTMCAgICAgICAgICAgMHg0CS8vIFN5bmNCdXMgMAorI2RlZmluZSBCQ0xLX1NUQVJUX1NCVVMxICAgICAgICAgICAweDUJLy8gU3luY0J1cyAxCisjZGVmaW5lIEJDTEtfU1RBUlRfU0JVUzIgICAgICAgICAgIDB4NgkvLyBTeW5jQnVzIDIKKworLy8gUGFjZXIgQ2xvY2sgc3RhcnQgdHJpZ2dlciBzZWxlY3QgKFNldFBhY2VyU3RhcnQpCisjZGVmaW5lIFBDTEtfU1RBUlRfU09GVFdBUkUgICAgICAgIDB4MAkvLyBTb2Z0d2FyZSBQYWNlciBTdGFydCAoU3RhcnRQYWNlcikKKyNkZWZpbmUgUENMS19TVEFSVF9FVFJJRyAgICAgICAgICAgMHgxCS8vIEV4dGVybmFsIHRyaWdnZXIKKyNkZWZpbmUgUENMS19TVEFSVF9ESUdJVEFMX0lUICAgICAgMHgyCS8vIERpZ2l0YWwgaW50ZXJydXB0CisjZGVmaW5lIFBDTEtfU1RBUlRfVVRDMiAgICAgICAgICAgIDB4MwkvLyBVc2VyIFRDIDIgb3V0CisjZGVmaW5lIFBDTEtfU1RBUlRfU0JVUzAgICAgICAgICAgIDB4NAkvLyBTeW5jQnVzIDAKKyNkZWZpbmUgUENMS19TVEFSVF9TQlVTMSAgICAgICAgICAgMHg1CS8vIFN5bmNCdXMgMQorI2RlZmluZSBQQ0xLX1NUQVJUX1NCVVMyICAgICAgICAgICAweDYJLy8gU3luY0J1cyAyCisjZGVmaW5lIFBDTEtfU1RBUlRfRF9TT0ZUV0FSRSAgICAgIDB4OAkvLyBEZWxheWVkIFNvZnR3YXJlIFBhY2VyIFN0YXJ0CisjZGVmaW5lIFBDTEtfU1RBUlRfRF9FVFJJRyAgICAgICAgIDB4OQkvLyBEZWxheWVkIGV4dGVybmFsIHRyaWdnZXIKKyNkZWZpbmUgUENMS19TVEFSVF9EX0RJR0lUQUxfSVQgICAgMHhBCS8vIERlbGF5ZWQgZGlnaXRhbCBpbnRlcnJ1cHQKKyNkZWZpbmUgUENMS19TVEFSVF9EX1VUQzIgICAgICAgICAgMHhCCS8vIERlbGF5ZWQgVXNlciBUQyAyIG91dAorI2RlZmluZSBQQ0xLX1NUQVJUX0RfU0JVUzAgICAgICAgICAweEMJLy8gRGVsYXllZCBTeW5jQnVzIDAKKyNkZWZpbmUgUENMS19TVEFSVF9EX1NCVVMxICAgICAgICAgMHhECS8vIERlbGF5ZWQgU3luY0J1cyAxCisjZGVmaW5lIFBDTEtfU1RBUlRfRF9TQlVTMiAgICAgICAgIDB4RQkvLyBEZWxheWVkIFN5bmNCdXMgMgorI2RlZmluZSBQQ0xLX1NUQVJUX0VUUklHX0dBVEVEICAgICAweEYJLy8gRXh0ZXJuYWwgVHJpZ2dlciBHYXRlZCBjb250cm9sbGVkIG1vZGUKKworLy8gUGFjZXIgQ2xvY2sgU3RvcCBUcmlnZ2VyIHNlbGVjdCAoU2V0UGFjZXJTdG9wKQorI2RlZmluZSBQQ0xLX1NUT1BfU09GVFdBUkUgICAgICAgICAweDAJLy8gU29mdHdhcmUgUGFjZXIgU3RvcCAoU3RvcFBhY2VyKQorI2RlZmluZSBQQ0xLX1NUT1BfRVRSSUcgICAgICAgICAgICAweDEJLy8gRXh0ZXJuYWwgVHJpZ2dlcgorI2RlZmluZSBQQ0xLX1NUT1BfRElHSVRBTF9JVCAgICAgICAweDIJLy8gRGlnaXRhbCBJbnRlcnJ1cHQKKyNkZWZpbmUgUENMS19TVE9QX0FDTlQgICAgICAgICAgICAgMHgzCS8vIEFib3V0IENvdW50ZXIKKyNkZWZpbmUgUENMS19TVE9QX1VUQzIgICAgICAgICAgICAgMHg0CS8vIFVzZXIgVEMyIG91dAorI2RlZmluZSBQQ0xLX1NUT1BfU0JVUzAgICAgICAgICAgICAweDUJLy8gU3luY0J1cyAwCisjZGVmaW5lIFBDTEtfU1RPUF9TQlVTMSAgICAgICAgICAgIDB4NgkvLyBTeW5jQnVzIDEKKyNkZWZpbmUgUENMS19TVE9QX1NCVVMyICAgICAgICAgICAgMHg3CS8vIFN5bmNCdXMgMgorI2RlZmluZSBQQ0xLX1NUT1BfQV9TT0ZUV0FSRSAgICAgICAweDgJLy8gQWJvdXQgU29mdHdhcmUgUGFjZXIgU3RvcAorI2RlZmluZSBQQ0xLX1NUT1BfQV9FVFJJRyAgICAgICAgICAweDkJLy8gQWJvdXQgRXh0ZXJuYWwgVHJpZ2dlcgorI2RlZmluZSBQQ0xLX1NUT1BfQV9ESUdJVEFMX0lUICAgICAweEEJLy8gQWJvdXQgRGlnaXRhbCBJbnRlcnJ1cHQKKyNkZWZpbmUgUENMS19TVE9QX0FfVVRDMiAgICAgICAgICAgMHhDCS8vIEFib3V0IFVzZXIgVEMyIG91dAorI2RlZmluZSBQQ0xLX1NUT1BfQV9TQlVTMCAgICAgICAgICAweEQJLy8gQWJvdXQgU3luY0J1cyAwCisjZGVmaW5lIFBDTEtfU1RPUF9BX1NCVVMxICAgICAgICAgIDB4RQkvLyBBYm91dCBTeW5jQnVzIDEKKyNkZWZpbmUgUENMS19TVE9QX0FfU0JVUzIgICAgICAgICAgMHhGCS8vIEFib3V0IFN5bmNCdXMgMgorCisvLyBBYm91dCBDb3VudGVyIFN0b3AgRW5hYmxlCisjZGVmaW5lIEFDTlRfU1RPUCAgICAgICAgICAgICAgICAgIDB4MAkvLyBzdG9wIGVuYWJsZQorI2RlZmluZSBBQ05UX05PX1NUT1AgICAgICAgICAgICAgICAweDEJLy8gc3RvcCBkaXNhYmxlZAorCisvLyBEQUMgdXBkYXRlIHNvdXJjZSAoU2V0REFDMVN0YXJ0ICYgU2V0REFDMlN0YXJ0KQorI2RlZmluZSBEQUNfU1RBUlRfU09GVFdBUkUgICAgICAgICAweDAJLy8gU29mdHdhcmUgVXBkYXRlCisjZGVmaW5lIERBQ19TVEFSVF9DR1QgICAgICAgICAgICAgIDB4MQkvLyBDR1QgY29udHJvbGxlZCBVcGRhdGUKKyNkZWZpbmUgREFDX1NUQVJUX0RBQ19DTEsgICAgICAgICAgMHgyCS8vIEQvQSBDbG9jaworI2RlZmluZSBEQUNfU1RBUlRfRVBDTEsgICAgICAgICAgICAweDMJLy8gRXh0ZXJuYWwgUGFjZXIgQ2xvY2sKKyNkZWZpbmUgREFDX1NUQVJUX1NCVVMwICAgICAgICAgICAgMHg0CS8vIFN5bmNCdXMgMAorI2RlZmluZSBEQUNfU1RBUlRfU0JVUzEgICAgICAgICAgICAweDUJLy8gU3luY0J1cyAxCisjZGVmaW5lIERBQ19TVEFSVF9TQlVTMiAgICAgICAgICAgIDB4NgkvLyBTeW5jQnVzIDIKKworLy8gREFDIEN5Y2xlIE1vZGUgKFNldERBQzFDeWNsZSwgU2V0REFDMkN5Y2xlLCBTZXR1cERBQykKKyNkZWZpbmUgREFDX0NZQ0xFX1NJTkdMRSAgICAgICAgICAgMHgwCS8vIG5vdCBjeWNsZQorI2RlZmluZSBEQUNfQ1lDTEVfTVVMVEkgICAgICAgICAgICAweDEJLy8gY3ljbGUKKworLy8gODI1NCBPcGVyYXRpb24gTW9kZXMgKFNldDgyNTRNb2RlLCBTZXR1cFRpbWVyQ291bnRlcikKKyNkZWZpbmUgTTgyNTRfRVZFTlRfQ09VTlRFUiAgICAgICAgMAkvLyBFdmVudCBDb3VudGVyCisjZGVmaW5lIE04MjU0X0hXX09ORV9TSE9UICAgICAgICAgIDEJLy8gSGFyZHdhcmUtUmV0cmlnZ2VyYWJsZSBPbmUtU2hvdAorI2RlZmluZSBNODI1NF9SQVRFX0dFTkVSQVRPUiAgICAgICAyCS8vIFJhdGUgR2VuZXJhdG9yCisjZGVmaW5lIE04MjU0X1NRVUFSRV9XQVZFICAgICAgICAgIDMJLy8gU3F1YXJlIFdhdmUgTW9kZQorI2RlZmluZSBNODI1NF9TV19TVFJPQkUgICAgICAgICAgICA0CS8vIFNvZnR3YXJlIFRyaWdnZXJlZCBTdHJvYmUKKyNkZWZpbmUgTTgyNTRfSFdfU1RST0JFICAgICAgICAgICAgNQkvLyBIYXJkd2FyZSBUcmlnZ2VyZWQgU3Ryb2JlIChSZXRyaWdnZXJhYmxlKQorCisvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMCBDbG9jayBTZWxlY3QgKFNldFV0YzBDbG9jaykKKyNkZWZpbmUgQ1VUQzBfOE1IWiAgICAgICAgICAgICAgICAgMHgwCS8vIDhNSHoKKyNkZWZpbmUgQ1VUQzBfRVhUX1RDX0NMT0NLMSAgICAgICAgMHgxCS8vIEV4dC4gVEMgQ2xvY2sgMQorI2RlZmluZSBDVVRDMF9FWFRfVENfQ0xPQ0syICAgICAgICAweDIJLy8gRXh0LiBUQyBDbG9jayAyCisjZGVmaW5lIENVVEMwX0VYVF9QQ0xLICAgICAgICAgICAgIDB4MwkvLyBFeHQuIFBhY2VyIENsb2NrCisKKy8vIFVzZXIgVGltZXIvQ291bnRlciAxIENsb2NrIFNlbGVjdCAoU2V0VXRjMUNsb2NrKQorI2RlZmluZSBDVVRDMV84TUhaICAgICAgICAgICAgICAgICAweDAJLy8gOE1IegorI2RlZmluZSBDVVRDMV9FWFRfVENfQ0xPQ0sxICAgICAgICAweDEJLy8gRXh0LiBUQyBDbG9jayAxCisjZGVmaW5lIENVVEMxX0VYVF9UQ19DTE9DSzIgICAgICAgIDB4MgkvLyBFeHQuIFRDIENsb2NrIDIKKyNkZWZpbmUgQ1VUQzFfRVhUX1BDTEsgICAgICAgICAgICAgMHgzCS8vIEV4dC4gUGFjZXIgQ2xvY2sKKyNkZWZpbmUgQ1VUQzFfVVRDMF9PVVQgICAgICAgICAgICAgMHg0CS8vIFVzZXIgVGltZXIvQ291bnRlciAwIG91dAorI2RlZmluZSBDVVRDMV9ESU5fU0lHTkFMICAgICAgICAgICAweDUJLy8gSGlnaC1TcGVlZCBEaWdpdGFsIElucHV0ICAgU2FtcGxpbmcgc2lnbmFsCisKKy8vIFVzZXIgVGltZXIvQ291bnRlciAyIENsb2NrIFNlbGVjdCAoU2V0VXRjMkNsb2NrKQorI2RlZmluZSBDVVRDMl84TUhaICAgICAgICAgICAgICAgICAweDAJLy8gOE1IegorI2RlZmluZSBDVVRDMl9FWFRfVENfQ0xPQ0sxICAgICAgICAweDEJLy8gRXh0LiBUQyBDbG9jayAxCisjZGVmaW5lIENVVEMyX0VYVF9UQ19DTE9DSzIgICAgICAgIDB4MgkvLyBFeHQuIFRDIENsb2NrIDIKKyNkZWZpbmUgQ1VUQzJfRVhUX1BDTEsgICAgICAgICAgICAgMHgzCS8vIEV4dC4gUGFjZXIgQ2xvY2sKKyNkZWZpbmUgQ1VUQzJfVVRDMV9PVVQgICAgICAgICAgICAgMHg0CS8vIFVzZXIgVGltZXIvQ291bnRlciAxIG91dAorCisvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMCBHYXRlIFNlbGVjdCAoU2V0VXRjMEdhdGUpCisjZGVmaW5lIEdVVEMwX05PVF9HQVRFRCAgICAgICAgICAgIDB4MAkvLyBOb3QgZ2F0ZWQKKyNkZWZpbmUgR1VUQzBfR0FURUQgICAgICAgICAgICAgICAgMHgxCS8vIEdhdGVkCisjZGVmaW5lIEdVVEMwX0VYVF9UQ19HQVRFMSAgICAgICAgIDB4MgkvLyBFeHQuIFRDIEdhdGUgMQorI2RlZmluZSBHVVRDMF9FWFRfVENfR0FURTIgICAgICAgICAweDMJLy8gRXh0LiBUQyBHYXRlIDIKKworLy8gVXNlciBUaW1lci9Db3VudGVyIDEgR2F0ZSBTZWxlY3QgKFNldFV0YzFHYXRlKQorI2RlZmluZSBHVVRDMV9OT1RfR0FURUQgICAgICAgICAgICAweDAJLy8gTm90IGdhdGVkCisjZGVmaW5lIEdVVEMxX0dBVEVEICAgICAgICAgICAgICAgIDB4MQkvLyBHYXRlZAorI2RlZmluZSBHVVRDMV9FWFRfVENfR0FURTEgICAgICAgICAweDIJLy8gRXh0LiBUQyBHYXRlIDEKKyNkZWZpbmUgR1VUQzFfRVhUX1RDX0dBVEUyICAgICAgICAgMHgzCS8vIEV4dC4gVEMgR2F0ZSAyCisjZGVmaW5lIEdVVEMxX1VUQzBfT1VUICAgICAgICAgICAgIDB4NAkvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMCBvdXQKKworLy8gVXNlciBUaW1lci9Db3VudGVyIDIgR2F0ZSBTZWxlY3QgKFNldFV0YzJHYXRlKQorI2RlZmluZSBHVVRDMl9OT1RfR0FURUQgICAgICAgICAgICAweDAJLy8gTm90IGdhdGVkCisjZGVmaW5lIEdVVEMyX0dBVEVEICAgICAgICAgICAgICAgIDB4MQkvLyBHYXRlZAorI2RlZmluZSBHVVRDMl9FWFRfVENfR0FURTEgICAgICAgICAweDIJLy8gRXh0LiBUQyBHYXRlIDEKKyNkZWZpbmUgR1VUQzJfRVhUX1RDX0dBVEUyICAgICAgICAgMHgzCS8vIEV4dC4gVEMgR2F0ZSAyCisjZGVmaW5lIEdVVEMyX1VUQzFfT1VUICAgICAgICAgICAgIDB4NAkvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMSBvdXQKKworLy8gSW50ZXJydXB0IFNvdXJjZSBNYXNrcyAoU2V0SVRNYXNrLCBDbGVhcklUTWFzaywgR2V0SVRTdGF0dXMpCisjZGVmaW5lIElSUU1fQURDX0ZJRk9fV1JJVEUgICAgICAgIDB4MDAwMQkvLyBBREMgRklGTyBXcml0ZQorI2RlZmluZSBJUlFNX0NHVF9SRVNFVCAgICAgICAgICAgICAweDAwMDIJLy8gUmVzZXQgQ0dUCisjZGVmaW5lIElSUU1fQ0dUX1BBVVNFICAgICAgICAgICAgIDB4MDAwOAkvLyBQYXVzZSBDR1QKKyNkZWZpbmUgSVJRTV9BRENfQUJPVVRfQ05UICAgICAgICAgMHgwMDEwCS8vIEFib3V0IENvdW50ZXIgb3V0CisjZGVmaW5lIElSUU1fQURDX0RFTEFZX0NOVCAgICAgICAgIDB4MDAyMAkvLyBEZWxheSBDb3VudGVyIG91dAorI2RlZmluZSBJUlFNX0FEQ19TQU1QTEVfQ05UCSAgIDB4MDA0MAkvLyBBREMgU2FtcGxlIENvdW50ZXIKKyNkZWZpbmUgSVJRTV9EQUMxX1VDTlQgICAgICAgICAgICAgMHgwMDgwCS8vIERBQzEgVXBkYXRlIENvdW50ZXIKKyNkZWZpbmUgSVJRTV9EQUMyX1VDTlQgICAgICAgICAgICAgMHgwMTAwCS8vIERBQzIgVXBkYXRlIENvdW50ZXIKKyNkZWZpbmUgSVJRTV9VVEMxICAgICAgICAgICAgICAgICAgMHgwMjAwCS8vIFVzZXIgVEMxIG91dAorI2RlZmluZSBJUlFNX1VUQzFfSU5WICAgICAgICAgICAgICAweDA0MDAJLy8gVXNlciBUQzEgb3V0LCBpbnZlcnRlZAorI2RlZmluZSBJUlFNX1VUQzIgICAgICAgICAgICAgICAgICAweDA4MDAJLy8gVXNlciBUQzIgb3V0CisjZGVmaW5lIElSUU1fRElHSVRBTF9JVCAgICAgICAgICAgIDB4MTAwMAkvLyBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBJUlFNX0VYVEVSTkFMX0lUICAgICAgICAgICAweDIwMDAJLy8gRXh0ZXJuYWwgSW50ZXJydXB0CisjZGVmaW5lIElSUU1fRVRSSUdfUklTSU5HICAgICAgICAgIDB4NDAwMAkvLyBFeHRlcm5hbCBUcmlnZ2VyIHJpc2luZy1lZGdlCisjZGVmaW5lIElSUU1fRVRSSUdfRkFMTElORyAgICAgICAgIDB4ODAwMAkvLyBFeHRlcm5hbCBUcmlnZ2VyIGZhbGxpbmctZWRnZQorCisvLyBETUEgUmVxdWVzdCBTb3VyY2VzIChMQVMwKQorI2RlZmluZSBETUFTX0RJU0FCTEVEICAgICAgICAgICAgICAweDAJLy8gRE1BIERpc2FibGVkCisjZGVmaW5lIERNQVNfQURDX1NDTlQgICAgICAgICAgICAgIDB4MQkvLyBBREMgU2FtcGxlIENvdW50ZXIKKyNkZWZpbmUgRE1BU19EQUMxX1VDTlQgICAgICAgICAgICAgMHgyCS8vIEQvQTEgVXBkYXRlIENvdW50ZXIKKyNkZWZpbmUgRE1BU19EQUMyX1VDTlQgICAgICAgICAgICAgMHgzCS8vIEQvQTIgVXBkYXRlIENvdW50ZXIKKyNkZWZpbmUgRE1BU19VVEMxICAgICAgICAgICAgICAgICAgMHg0CS8vIFVzZXIgVEMxIG91dAorI2RlZmluZSBETUFTX0FERklGT19IQUxGX0ZVTEwgICAgICAweDgJLy8gQS9EIEZJRk8gaGFsZiBmdWxsCisjZGVmaW5lIERNQVNfREFDMV9GSUZPX0hBTEZfRU1QVFkgIDB4OQkvLyBEL0ExIEZJRk8gaGFsZiBlbXB0eQorI2RlZmluZSBETUFTX0RBQzJfRklGT19IQUxGX0VNUFRZICAweEEJLy8gRC9BMiBGSUZPIGhhbGYgZW1wdHkKKworLy8gRE1BIExvY2FsIEFkZHJlc3NlcyAgICgweDQwMDAwMDAwK0xBUzEgb2Zmc2V0KQorI2RlZmluZSBETUFMQUREUl9BREMgICAgICAgMHg0MDAwMDAwMAkvLyBBL0QgRklGTworI2RlZmluZSBETUFMQUREUl9IRElOICAgICAgMHg0MDAwMDAwNAkvLyBIaWdoIFNwZWVkIERpZ2l0YWwgSW5wdXQgRklGTworI2RlZmluZSBETUFMQUREUl9EQUMxICAgICAgMHg0MDAwMDAwOAkvLyBEL0ExIEZJRk8KKyNkZWZpbmUgRE1BTEFERFJfREFDMiAgICAgIDB4NDAwMDAwMEMJLy8gRC9BMiBGSUZPCisKKy8vIFBvcnQgMCBjb21wYXJlIG1vZGVzIChTZXRESU8wQ29tcGFyZU1vZGUpCisjZGVmaW5lIERJT19NT0RFX0VWRU5UICAgICAwCS8vIEV2ZW50IE1vZGUKKyNkZWZpbmUgRElPX01PREVfTUFUQ0ggICAgIDEJLy8gTWF0Y2ggTW9kZQorCisvLyBEaWdpdGFsIFRhYmxlIEVuYWJsZSAoUG9ydCAxIGRpc2FibGUpCisjZGVmaW5lIERUQkxfRElTQUJMRSAgICAgICAwCS8vIEVuYWJsZSBEaWdpdGFsIFRhYmxlCisjZGVmaW5lIERUQkxfRU5BQkxFICAgICAgICAxCS8vIERpc2FibGUgRGlnaXRhbCBUYWJsZQorCisvLyBTYW1wbGluZyBTaWduYWwgZm9yIEhpZ2ggU3BlZWQgRGlnaXRhbCBJbnB1dCAoU2V0SGRpblN0YXJ0KQorI2RlZmluZSBIRElOX1NPRlRXQVJFICAgICAgMHgwCS8vIFNvZnR3YXJlIFRyaWdnZXIKKyNkZWZpbmUgSERJTl9BREMgICAgICAgICAgIDB4MQkvLyBBL0QgQ29udmVyc2lvbiBTaWduYWwKKyNkZWZpbmUgSERJTl9VVEMwICAgICAgICAgIDB4MgkvLyBVc2VyIFRDIG91dCAwCisjZGVmaW5lIEhESU5fVVRDMSAgICAgICAgICAweDMJLy8gVXNlciBUQyBvdXQgMQorI2RlZmluZSBIRElOX1VUQzIgICAgICAgICAgMHg0CS8vIFVzZXIgVEMgb3V0IDIKKyNkZWZpbmUgSERJTl9FUENMSyAgICAgICAgIDB4NQkvLyBFeHRlcm5hbCBQYWNlciBDbG9jaworI2RlZmluZSBIRElOX0VUUkcgICAgICAgICAgMHg2CS8vIEV4dGVybmFsIFRyaWdnZXIKKworLy8gQ2hhbm5lbCBHYWluIFRhYmxlIC8gQ2hhbm5lbCBHYWluIExhdGNoCisjZGVmaW5lIENTQ19MQVRDSCAgICAgICAgICAwCS8vIENoYW5uZWwgR2FpbiBMYXRjaCBtb2RlCisjZGVmaW5lIENTQ19DR1QgICAgICAgICAgICAxCS8vIENoYW5uZWwgR2FpbiBUYWJsZSBtb2RlCisKKy8vIENoYW5uZWwgR2FpbiBUYWJsZSBQYXVzZSBFbmFibGUKKyNkZWZpbmUgQ0dUX1BBVVNFX0RJU0FCTEUgIDAJLy8gQ2hhbm5lbCBHYWluIFRhYmxlIFBhdXNlIERpc2FibGUKKyNkZWZpbmUgQ0dUX1BBVVNFX0VOQUJMRSAgIDEJLy8gQ2hhbm5lbCBHYWluIFRhYmxlIFBhdXNlIEVuYWJsZQorCisvLyBEQUMgb3V0cHV0IHR5cGUvcmFuZ2UgKHA2MykKKyNkZWZpbmUgQU9VVF9VTklQNSAgICAgICAgIDAJLy8gMC4uKzUgVm9sdAorI2RlZmluZSBBT1VUX1VOSVAxMCAgICAgICAgMQkvLyAwLi4rMTAgVm9sdAorI2RlZmluZSBBT1VUX0JJUDUgICAgICAgICAgMgkvLyAtNS4uKzUgVm9sdAorI2RlZmluZSBBT1VUX0JJUDEwICAgICAgICAgMwkvLyAtMTAuLisxMCBWb2x0CisKKy8vIEdoYW5uZWwgR2FpbiBUYWJsZSBmaWVsZCBkZWZpbml0aW9ucyAocDYxKQorLy8gR2FpbgorI2RlZmluZSBHQUlOMSAgICAgICAgICAgICAgMAorI2RlZmluZSBHQUlOMiAgICAgICAgICAgICAgMQorI2RlZmluZSBHQUlONCAgICAgICAgICAgICAgMgorI2RlZmluZSBHQUlOOCAgICAgICAgICAgICAgMworI2RlZmluZSBHQUlOMTYgICAgICAgICAgICAgNAorI2RlZmluZSBHQUlOMzIgICAgICAgICAgICAgNQorI2RlZmluZSBHQUlONjQgICAgICAgICAgICAgNgorI2RlZmluZSBHQUlOMTI4ICAgICAgICAgICAgNworCisvLyBJbnB1dCByYW5nZS9wb2xhcml0eQorI2RlZmluZSBBSU5fQklQNSAgICAgICAgICAgMAkvLyAtNS4uKzUgVm9sdAorI2RlZmluZSBBSU5fQklQMTAgICAgICAgICAgMQkvLyAtMTAuLisxMCBWb2x0CisjZGVmaW5lIEFJTl9VTklQMTAgICAgICAgICAyCS8vIDAuLisxMCBWb2x0CisKKy8vIG5vbiByZWZlcmVuY2VkIHNpbmdsZSBlbmRlZCBzZWxlY3QgYml0CisjZGVmaW5lIE5SU0VfQUdORCAgICAgICAgICAwCS8vIEFHTkQgcmVmZXJlbmNlZCBTRSBpbnB1dAorI2RlZmluZSBOUlNFX0FJTlMgICAgICAgICAgMQkvLyBBSU4gU0VOU0UgcmVmZXJlbmNlZCBTRSBpbnB1dAorCisvLyBzaW5nbGUgZW5kZWQgdnMgZGlmZmVyZW50aWFsCisjZGVmaW5lIEdORF9TRQkJMAkvLyBTaW5nbGUtRW5kZWQKKyNkZWZpbmUgR05EX0RJRkYJMQkvLyBEaWZmZXJlbnRpYWwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWVlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCkBAIC0wLDAgKzEsMzI1NCBAQAorLyoKKyAgY29tZWRpL2RyaXZlcnMvczYyNi5jCisgIFNlbnNvcmF5IHM2MjYgQ29tZWRpIGRyaXZlcgorCisgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgIEJhc2VkIG9uIFNlbnNvcmF5IE1vZGVsIDYyNiBMaW51eCBkcml2ZXIgVmVyc2lvbiAwLjIKKyAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2Vuc29yYXkgQ28uLCBJbmMuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisvKgorRHJpdmVyOiBzNjI2CitEZXNjcmlwdGlvbjogU2Vuc29yYXkgNjI2IGRyaXZlcgorRGV2aWNlczogW1NlbnNvcmF5XSA2MjYgKHM2MjYpCitBdXRob3JzOiBHaWFubHVjYSBQYWxsaSA8Z3BhbGxpQGRlaXMudW5pYm8uaXQ+LAorVXBkYXRlZDogRnJpLCAxNSBGZWIgMjAwOCAxMDoyODo0MiArMDAwMAorU3RhdHVzOiBleHBlcmltZW50YWwKKworQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICBbMF0gLSBQQ0kgYnVzIG9mIGRldmljZSAob3B0aW9uYWwpCisgIFsxXSAtIFBDSSBzbG90IG9mIGRldmljZSAob3B0aW9uYWwpCisgIElmIGJ1cy9zbG90IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaXJzdCBzdXBwb3J0ZWQKKyAgUENJIGRldmljZSBmb3VuZCB3aWxsIGJlIHVzZWQuCisKK0lOU05fQ09ORklHIGluc3RydWN0aW9uczoKKyAgYW5hbG9nIGlucHV0OgorICAgbm9uZQorCisgIGFuYWxvZyBvdXRwdXQ6CisgICBub25lCisKKyAgZGlnaXRhbCBjaGFubmVsOgorICAgczYyNiBoYXMgMyBkaW8gc3ViZGV2aWNlcyAoMiwzIGFuZCA0KSBlYWNoIHdpdGggMTYgaS9vIGNoYW5uZWxzCisgICBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zOgorICAgSU5TTl9DT05GSUdfRElPX1FVRVJZCisgICBDT01FRElfSU5QVVQKKyAgIENPTUVESV9PVVRQVVQKKworICBlbmNvZGVyOgorICAgRXZlcnkgY2hhbm5lbCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIHJlYWRpbmcuCisKKyAgIEV4YW1wbGUgY29kZQorCisgICBpbnNuLmluc249SU5TTl9DT05GSUc7ICAgLy9jb25maWd1cmF0aW9uIGluc3RydWN0aW9uCisgICBpbnNuLm49MTsgICAgICAgICAgICAgICAgLy9udW1iZXIgb2Ygb3BlcmF0aW9uIChtdXN0IGJlIDEpCisgICBpbnNuLmRhdGE9JmluaXRpYWx2YWx1ZTsgLy9pbml0aWFsIHZhbHVlIGxvYWRlZCBpbnRvIGVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1cmluZyBjb25maWd1cmF0aW9uCisgICBpbnNuLnN1YmRldj01OyAgICAgICAgICAgLy9lbmNvZGVyIHN1YmRldmljZQorICAgaW5zbi5jaGFuc3BlYz1DUl9QQUNLKGVuY29kZXJfY2hhbm5lbCwwLEFSRUZfT1RIRVIpOyAvL2VuY29kZXJfY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIGNvbmZpZ3VyZQorCisgICBjb21lZGlfZG9faW5zbihjZiwmaW5zbik7IC8vZXhlY3V0aW5nIGNvbmZpZ3VyYXRpb24KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCisKKyNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICJzNjI2LmgiCisKK01PRFVMRV9BVVRIT1IoIkdpYW5sdWNhIFBhbGxpIDxncGFsbGlAZGVpcy51bmliby5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Vuc29yYXkgNjI2IENvbWVkaSBkcml2ZXIgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3R5cGVkZWYgc3RydWN0IHM2MjZfYm9hcmRfc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBhaV9jaGFuczsKKwlpbnQgYWlfYml0czsKKwlpbnQgYW9fY2hhbnM7CisJaW50IGFvX2JpdHM7CisJaW50IGRpb19jaGFuczsKKwlpbnQgZGlvX2JhbmtzOworCWludCBlbmNfY2hhbnM7Cit9IHM2MjZfYm9hcmQ7CisKK3N0YXRpYyBjb25zdCBzNjI2X2JvYXJkIHM2MjZfYm9hcmRzW10gPSB7CisJeworCSAgICAgIG5hbWU6CSJzNjI2IiwKKwkgICAgICBhaV9jaGFuczpTNjI2X0FEQ19DSEFOTkVMUywKKwkgICAgICBhaV9iaXRzOgkxNCwKKwkgICAgICBhb19jaGFuczpTNjI2X0RBQ19DSEFOTkVMUywKKwkgICAgICBhb19iaXRzOgkxMywKKwkgICAgICBkaW9fY2hhbnM6UzYyNl9ESU9fQ0hBTk5FTFMsCisJICAgICAgZGlvX2JhbmtzOlM2MjZfRElPX0JBTktTLAorCSAgICAgIGVuY19jaGFuczpTNjI2X0VOQ09ERVJfQ0hBTk5FTFMsCisJCX0KK307CisKKyNkZWZpbmUgdGhpc2JvYXJkICgoY29uc3QgczYyNl9ib2FyZCAqKWRldi0+Ym9hcmRfcHRyKQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1M2MjYgMHgxMTMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzYyNiAweDcxNDYKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHM2MjZfcGNpX3RhYmxlKSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9TNjI2LCBQQ0lfREVWSUNFX0lEX1M2MjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCTB9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHM2MjZfcGNpX3RhYmxlKTsKKworc3RhdGljIGludCBzNjI2X2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpOworc3RhdGljIGludCBzNjI2X2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KTsKKworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX3M2MjYgPSB7CisgICAgICBkcml2ZXJfbmFtZToiczYyNiIsCisgICAgICBtb2R1bGU6VEhJU19NT0RVTEUsCisgICAgICBhdHRhY2g6czYyNl9hdHRhY2gsCisgICAgICBkZXRhY2g6czYyNl9kZXRhY2gsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdm9pZCAqYmFzZV9hZGRyOworCWludCBnb3RfcmVnaW9uczsKKwlzaG9ydCBhbGxvY2F0ZWRCdWY7CisJdWludDhfdCBhaV9jbWRfcnVubmluZzsJLy8gYWlfY21kIGlzIHJ1bm5pbmcKKwl1aW50OF90IGFpX2NvbnRpbm91czsJLy8gY29udGlub3VzIGFxdWlzaXRpb24KKwlpbnQgYWlfc2FtcGxlX2NvdW50OwkvLyBudW1iZXIgb2Ygc2FtcGxlcyB0byBhcXVpcmUKKwl1bnNpZ25lZCBpbnQgYWlfc2FtcGxlX3RpbWVyOwkvLyB0aW1lIGJldHdlZW4gc2FtcGxlcyBpbgorCS8vIHVuaXRzIG9mIHRoZSB0aW1lcgorCWludCBhaV9jb252ZXJ0X2NvdW50OwkvLyBjb252ZXJzaW9uIGNvdW50ZXIKKwl1bnNpZ25lZCBpbnQgYWlfY29udmVydF90aW1lcjsJLy8gdGltZSBiZXR3ZWVuIGNvbnZlcnNpb24gaW4KKwkvLyB1bml0cyBvZiB0aGUgdGltZXIKKwl1aW50MTZfdCBDb3VudGVySW50RW5hYnM7CS8vQ291bnRlciBpbnRlcnJ1cHQgZW5hYmxlCisJLy9tYXNrIGZvciBNSVNDMiByZWdpc3Rlci4KKwl1aW50OF90IEFkY0l0ZW1zOwkvL051bWJlciBvZiBpdGVtcyBpbiBBREMgcG9sbAorCS8vbGlzdC4KKwlETUFCVUYgUlBTQnVmOwkJLy9ETUEgYnVmZmVyIHVzZWQgdG8gaG9sZCBBREMKKwkvLyhSUFMxKSBwcm9ncmFtLgorCURNQUJVRiBBTkFCdWY7CQkvL0RNQSBidWZmZXIgdXNlZCB0byByZWNlaXZlCisJLy9BREMgZGF0YSBhbmQgaG9sZCBEQUMgZGF0YS4KKwl1aW50MzJfdCAqcERhY1dCdWY7CS8vUG9pbnRlciB0byBsb2dpY2FsIGFkcnMgb2YKKwkvL0RNQSBidWZmZXIgdXNlZCB0byBob2xkIERBQworCS8vZGF0YS4KKwl1aW50MTZfdCBEYWNwb2w7CS8vSW1hZ2Ugb2YgREFDIHBvbGFyaXR5CisJLy9yZWdpc3Rlci4KKwl1aW50OF90IFRyaW1TZXRwb2ludFsxMl07CS8vSW1hZ2VzIG9mIFRyaW1EQUMgc2V0cG9pbnRzLgorCS8vcmVnaXN0ZXJzLgorCXVpbnQxNl90IENoYXJnZUVuYWJsZWQ7CS8vSW1hZ2Ugb2YgTUlTQzIgQmF0dGVyeQorCS8vQ2hhcmdlIEVuYWJsZWQgKDAgb3IKKwkvL1dSTUlTQzJfQ0hBUkdFX0VOQUJMRSkuCisJdWludDE2X3QgV0RJbnRlcnZhbDsJLy9JbWFnZSBvZiBNSVNDMiB3YXRjaGRvZworCS8vaW50ZXJ2YWwgY29udHJvbCBiaXRzLgorCXVpbnQzMl90IEkyQ0FkcnM7CS8vSTJDIGRldmljZSBhZGRyZXNzIGZvcgorCS8vb25ib2FyZCBFRVBST00gKGJvYXJkIHJldgorCS8vZGVwZW5kZW50KS4KKwkvLyAgc2hvcnQgICAgICAgICBJMkNhcmRzOworCWxzYW1wbF90IGFvX3JlYWRiYWNrW1M2MjZfREFDX0NIQU5ORUxTXTsKK30gczYyNl9wcml2YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgUkRESW47CisJdWludDE2X3QgV1JET3V0OworCXVpbnQxNl90IFJERWRnU2VsOworCXVpbnQxNl90IFdSRWRnU2VsOworCXVpbnQxNl90IFJEQ2FwU2VsOworCXVpbnQxNl90IFdSQ2FwU2VsOworCXVpbnQxNl90IFJEQ2FwRmxnOworCXVpbnQxNl90IFJESW50U2VsOworCXVpbnQxNl90IFdSSW50U2VsOworfSBkaW9fcHJpdmF0ZTsKKworc3RhdGljIGRpb19wcml2YXRlIGRpb19wcml2YXRlX0EgPSB7CisgICAgICBSRERJbjpMUF9SRERJTkEsCisgICAgICBXUkRPdXQ6TFBfV1JET1VUQSwKKyAgICAgIFJERWRnU2VsOkxQX1JERURHU0VMQSwKKyAgICAgIFdSRWRnU2VsOkxQX1dSRURHU0VMQSwKKyAgICAgIFJEQ2FwU2VsOkxQX1JEQ0FQU0VMQSwKKyAgICAgIFdSQ2FwU2VsOkxQX1dSQ0FQU0VMQSwKKyAgICAgIFJEQ2FwRmxnOkxQX1JEQ0FQRkxHQSwKKyAgICAgIFJESW50U2VsOkxQX1JESU5UU0VMQSwKKyAgICAgIFdSSW50U2VsOkxQX1dSSU5UU0VMQSwKK307CisKK3N0YXRpYyBkaW9fcHJpdmF0ZSBkaW9fcHJpdmF0ZV9CID0geworICAgICAgUkRESW46TFBfUkRESU5CLAorICAgICAgV1JET3V0OkxQX1dSRE9VVEIsCisgICAgICBSREVkZ1NlbDpMUF9SREVER1NFTEIsCisgICAgICBXUkVkZ1NlbDpMUF9XUkVER1NFTEIsCisgICAgICBSRENhcFNlbDpMUF9SRENBUFNFTEIsCisgICAgICBXUkNhcFNlbDpMUF9XUkNBUFNFTEIsCisgICAgICBSRENhcEZsZzpMUF9SRENBUEZMR0IsCisgICAgICBSREludFNlbDpMUF9SRElOVFNFTEIsCisgICAgICBXUkludFNlbDpMUF9XUklOVFNFTEIsCit9OworCitzdGF0aWMgZGlvX3ByaXZhdGUgZGlvX3ByaXZhdGVfQyA9IHsKKyAgICAgIFJEREluOkxQX1JERElOQywKKyAgICAgIFdSRE91dDpMUF9XUkRPVVRDLAorICAgICAgUkRFZGdTZWw6TFBfUkRFREdTRUxDLAorICAgICAgV1JFZGdTZWw6TFBfV1JFREdTRUxDLAorICAgICAgUkRDYXBTZWw6TFBfUkRDQVBTRUxDLAorICAgICAgV1JDYXBTZWw6TFBfV1JDQVBTRUxDLAorICAgICAgUkRDYXBGbGc6TFBfUkRDQVBGTEdDLAorICAgICAgUkRJbnRTZWw6TFBfUkRJTlRTRUxDLAorICAgICAgV1JJbnRTZWw6TFBfV1JJTlRTRUxDLAorfTsKKworLyogdG8gZ3JvdXAgZGlvIGRldmljZXMgKDQ4IGJpdHMgbWFzayBhbmQgZGF0YSBhcmUgbm90IGFsbG93ZWQgPz8/KQorc3RhdGljIGRpb19wcml2YXRlICpkaW9fcHJpdmF0ZV93b3JkW109eworICAmZGlvX3ByaXZhdGVfQSwKKyAgJmRpb19wcml2YXRlX0IsCisgICZkaW9fcHJpdmF0ZV9DLAorfTsKKyovCisKKyNkZWZpbmUgZGV2cHJpdiAoKHM2MjZfcHJpdmF0ZSAqKWRldi0+cHJpdmF0ZSkKKyNkZWZpbmUgZGlvcHJpdiAoKGRpb19wcml2YXRlICopcy0+cHJpdmF0ZSkKKworQ09NRURJX1BDSV9JTklUQ0xFQU5VUF9OT01PRFVMRShkcml2ZXJfczYyNiwgczYyNl9wY2lfdGFibGUpOworCisvL2lvY3RsIHJvdXRpbmVzCitzdGF0aWMgaW50IHM2MjZfYWlfaW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworLyogc3RhdGljIGludCBzNjI2X2FpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKmRldixjb21lZGlfc3ViZGV2aWNlICpzLGNvbWVkaV9pbnNuICppbnNuLGxzYW1wbF90ICpkYXRhKTsgKi8KK3N0YXRpYyBpbnQgczYyNl9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2FpX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcyk7CitzdGF0aWMgaW50IHM2MjZfYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kKTsKK3N0YXRpYyBpbnQgczYyNl9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworc3RhdGljIGludCBzNjI2X2FvX3dpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9hb19yaW5zbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9kaW9fc2V0X2lycShjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgY2hhbik7CitzdGF0aWMgaW50IHM2MjZfZGlvX3Jlc2V0X2lycShjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgZ3J1b3AsCisJdW5zaWduZWQgaW50IG1hc2spOworc3RhdGljIGludCBzNjI2X2Rpb19jbGVhcl9pcnEoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IHM2MjZfZW5jX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9lbmNfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9lbmNfaW5zbl93cml0ZShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfbnNfdG9fdGltZXIoaW50ICpuYW5vc2VjLCBpbnQgcm91bmRfbW9kZSk7CitzdGF0aWMgaW50IHM2MjZfYWlfbG9hZF9wb2xsbGlzdCh1aW50OF90ICogcHBsLCBjb21lZGlfY21kICogY21kKTsKK3N0YXRpYyBpbnQgczYyNl9haV9pbnR0cmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGludCB0cmlnbnVtKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzNjI2X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmQgUFRfUkVHU19BUkcpOworc3RhdGljIGxzYW1wbF90IHM2MjZfYWlfcmVnX3RvX3VpbnQoaW50IGRhdGEpOworLyogc3RhdGljIGxzYW1wbF90IHM2MjZfdWludF90b19yZWcoY29tZWRpX3N1YmRldmljZSAqcywgaW50IGRhdGEpOyAqLworCisvL2VuZCBpb2N0bCByb3V0aW5lcworCisvL2ludGVybmFsIHJvdXRpbmVzCitzdGF0aWMgdm9pZCBzNjI2X2Rpb19pbml0KGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIHZvaWQgUmVzZXRBREMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCAqIHBwbCk7CitzdGF0aWMgdm9pZCBMb2FkVHJpbURBQ3MoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgdm9pZCBXcml0ZVRyaW1EQUMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCBMb2dpY2FsQ2hhbiwKKwl1aW50OF90IERhY0RhdGEpOworc3RhdGljIHVpbnQ4X3QgSTJDcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCB1aW50OF90IGFkZHIpOworc3RhdGljIHVpbnQzMl90IEkyQ2hhbmRzaGFrZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MzJfdCB2YWwpOworc3RhdGljIHZvaWQgU2V0REFDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGNoYW4sIHNob3J0IGRhY2RhdGEpOworc3RhdGljIHZvaWQgU2VuZERBQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MzJfdCB2YWwpOworc3RhdGljIHZvaWQgV3JpdGVNSVNDMihjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBOZXdJbWFnZSk7CitzdGF0aWMgdm9pZCBERUJJdHJhbnNmZXIoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgdWludDE2X3QgREVCSXJlYWQoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgYWRkcik7CitzdGF0aWMgdm9pZCBERUJJd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgYWRkciwgdWludDE2X3Qgd2RhdGEpOworc3RhdGljIHZvaWQgREVCSXJlcGxhY2UoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgYWRkciwgdWludDE2X3QgbWFzaywKKwl1aW50MTZfdCB3ZGF0YSk7CitzdGF0aWMgdm9pZCBDbG9zZURNQUIoY29tZWRpX2RldmljZSAqIGRldiwgRE1BQlVGICogcGRtYSwgc2l6ZV90IGJzaXplKTsKKworLy8gQ09VTlRFUiBPQkpFQ1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgeworCS8vIFBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IGRpZmZlciBmb3IgQSBhbmQgQiBjb3VudGVyczoKKwl1aW50MTZfdCgqR2V0RW5hYmxlKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqKTsJLy9SZXR1cm4gY2xvY2sgZW5hYmxlLgorCXVpbnQxNl90KCpHZXRJbnRTcmMpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICopOwkvL1JldHVybiBpbnRlcnJ1cHQgc291cmNlLgorCXVpbnQxNl90KCpHZXRMb2FkVHJpZykgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vUmV0dXJuIHByZWxvYWQgdHJpZ2dlciBzb3VyY2UuCisJdWludDE2X3QoKkdldE1vZGUpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICopOwkvL1JldHVybiBzdGFuZGFyZGl6ZWQgb3BlcmF0aW5nIG1vZGUuCisJdm9pZCAoKlB1bHNlSW5kZXgpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICopOwkvL0dlbmVyYXRlIHNvZnQgaW5kZXggc3Ryb2JlLgorCXZvaWQgKCpTZXRFbmFibGUpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICosIHVpbnQxNl90IGVuYWIpOwkvL1Byb2dyYW0gY2xvY2sgZW5hYmxlLgorCXZvaWQgKCpTZXRJbnRTcmMpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICosIHVpbnQxNl90IEludFNvdXJjZSk7CS8vUHJvZ3JhbSBpbnRlcnJ1cHQgc291cmNlLgorCXZvaWQgKCpTZXRMb2FkVHJpZykgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKiwgdWludDE2X3QgVHJpZyk7CS8vUHJvZ3JhbSBwcmVsb2FkIHRyaWdnZXIgc291cmNlLgorCXZvaWQgKCpTZXRNb2RlKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqLCB1aW50MTZfdCBTZXR1cCwgdWludDE2X3QgRGlzYWJsZUludFNyYyk7CS8vUHJvZ3JhbSBzdGFuZGFyZGl6ZWQgb3BlcmF0aW5nIG1vZGUuCisJdm9pZCAoKlJlc2V0Q2FwRmxhZ3MpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICopOwkvL1Jlc2V0IGV2ZW50IGNhcHR1cmUgZmxhZ3MuCisKKwl1aW50MTZfdCBNeUNSQTsJCS8vICAgQWRkcmVzcyBvZiBDUkEgcmVnaXN0ZXIuCisJdWludDE2X3QgTXlDUkI7CQkvLyAgIEFkZHJlc3Mgb2YgQ1JCIHJlZ2lzdGVyLgorCXVpbnQxNl90IE15TGF0Y2hMc3c7CS8vICAgQWRkcmVzcyBvZiBMYXRjaCBsZWFzdC1zaWduaWZpY2FudC13b3JkCisJLy8gICByZWdpc3Rlci4KKwl1aW50MTZfdCBNeUV2ZW50Qml0c1s0XTsJLy8gICBCaXQgdHJhbnNsYXRpb25zIGZvciBJbnRTcmMgLS0+UkRNSVNDMi4KK30gZW5jX3ByaXZhdGU7CQkJLy9jb3VudGVyIG9iamVjdAorCisjZGVmaW5lIGVuY3ByaXYgKChlbmNfcHJpdmF0ZSAqKShkZXYtPnN1YmRldmljZXMrNSktPnByaXZhdGUpCisKKy8vY291bnRlcnMgcm91dGluZXMKK3N0YXRpYyB2b2lkIHM2MjZfdGltZXJfbG9hZChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIGludCB0aWNrKTsKK3N0YXRpYyB1aW50MzJfdCBSZWFkTGF0Y2goY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFJlc2V0Q2FwRmxhZ3NfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgUmVzZXRDYXBGbGFnc19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdWludDE2X3QgR2V0TW9kZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdWludDE2X3QgR2V0TW9kZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBTZXRNb2RlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBTZXR1cCwKKwl1aW50MTZfdCBEaXNhYmxlSW50U3JjKTsKK3N0YXRpYyB2b2lkIFNldE1vZGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFNldHVwLAorCXVpbnQxNl90IERpc2FibGVJbnRTcmMpOworc3RhdGljIHZvaWQgU2V0RW5hYmxlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBlbmFiKTsKK3N0YXRpYyB2b2lkIFNldEVuYWJsZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgZW5hYik7CitzdGF0aWMgdWludDE2X3QgR2V0RW5hYmxlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRFbmFibGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgU2V0TGF0Y2hTb3VyY2UoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLAorCXVpbnQxNl90IHZhbHVlKTsKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRMYXRjaFNvdXJjZShjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICk7ICovCitzdGF0aWMgdm9pZCBTZXRMb2FkVHJpZ19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgVHJpZyk7CitzdGF0aWMgdm9pZCBTZXRMb2FkVHJpZ19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgVHJpZyk7CitzdGF0aWMgdWludDE2X3QgR2V0TG9hZFRyaWdfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHVpbnQxNl90IEdldExvYWRUcmlnX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFNldEludFNyY19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywKKwl1aW50MTZfdCBJbnRTb3VyY2UpOworc3RhdGljIHZvaWQgU2V0SW50U3JjX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLAorCXVpbnQxNl90IEludFNvdXJjZSk7CitzdGF0aWMgdWludDE2X3QgR2V0SW50U3JjX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRJbnRTcmNfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworLyogc3RhdGljIHZvaWQgU2V0Q2xrTXVsdChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApIDsgKi8KKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRDbGtNdWx0KGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSA7ICovCisvKiBzdGF0aWMgdm9pZCBTZXRJbmRleFBvbChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApOyAqLworLyogc3RhdGljIHVpbnQxNl90IEdldENsa1BvbChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICkgOyAqLworLyogc3RhdGljIHZvaWQgU2V0SW5kZXhTcmMoIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKTsgICovCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrU3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmsgKTsgICovCisvKiBzdGF0aWMgdm9pZCBTZXRJbmRleFNyYyggY29tZWRpX2RldmljZSAqZGV2LGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApOyAgKi8KKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRJbmRleFNyYyggY29tZWRpX2RldmljZSAqZGV2LGVuY19wcml2YXRlICprICk7ICAqLworc3RhdGljIHZvaWQgUHVsc2VJbmRleF9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBQdWxzZUluZGV4X0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFByZWxvYWQoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MzJfdCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBDb3VudGVyc0luaXQoY29tZWRpX2RldmljZSAqIGRldik7CisvL2VuZCBpbnRlcm5hbCByb3V0aW5lcworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb3VudGVyIG9iamVjdHMgY29uc3RydWN0b3IuCisKKy8vIENvdW50ZXIgb3ZlcmZsb3cvaW5kZXggZXZlbnQgZmxhZyBtYXNrcyBmb3IgUkRNSVNDMi4KKyNkZWZpbmUgSU5EWE1BU0soQykJCSggMSA8PCAoICggKEMpID4gMiApID8gKCAoQykgKiAyIC0gMSApIDogKCAoQykgKiAyICsgIDQgKSApICkKKyNkZWZpbmUgT1ZFUk1BU0soQykJCSggMSA8PCAoICggKEMpID4gMiApID8gKCAoQykgKiAyICsgNSApIDogKCAoQykgKiAyICsgMTAgKSApICkKKyNkZWZpbmUgRVZCSVRTKEMpCQl7IDAsIE9WRVJNQVNLKEMpLCBJTkRYTUFTSyhDKSwgT1ZFUk1BU0soQykgfCBJTkRYTUFTSyhDKSB9CisKKy8vIFRyYW5zbGF0aW9uIHRhYmxlIHRvIG1hcCBJbnRTcmMgaW50byBlcXVpdmFsZW50IFJETUlTQzIgZXZlbnQgZmxhZworLy8gYml0cy4KKy8vc3RhdGljIGNvbnN0IHVpbnQxNl90IEV2ZW50Qml0c1tdWzRdID0geyBFVkJJVFMoMCksIEVWQklUUygxKSwgRVZCSVRTKDIpLCBFVkJJVFMoMyksIEVWQklUUyg0KSwgRVZCSVRTKDUpIH07CisKKy8qIGVuY19wcml2YXRlOyAqLworc3RhdGljIGVuY19wcml2YXRlIGVuY19wcml2YXRlX2RhdGFbXSA9IHsKKwl7CisJICAgICAgR2V0RW5hYmxlOkdldEVuYWJsZV9BLAorCSAgICAgIEdldEludFNyYzpHZXRJbnRTcmNfQSwKKwkgICAgICBHZXRMb2FkVHJpZzpHZXRMb2FkVHJpZ19BLAorCSAgICAgIEdldE1vZGU6CUdldE1vZGVfQSwKKwkgICAgICBQdWxzZUluZGV4OlB1bHNlSW5kZXhfQSwKKwkgICAgICBTZXRFbmFibGU6U2V0RW5hYmxlX0EsCisJICAgICAgU2V0SW50U3JjOlNldEludFNyY19BLAorCSAgICAgIFNldExvYWRUcmlnOlNldExvYWRUcmlnX0EsCisJICAgICAgU2V0TW9kZToJU2V0TW9kZV9BLAorCSAgICAgIFJlc2V0Q2FwRmxhZ3M6UmVzZXRDYXBGbGFnc19BLAorCSAgICAgIE15Q1JBOglMUF9DUjBBLAorCSAgICAgIE15Q1JCOglMUF9DUjBCLAorCSAgICAgIE15TGF0Y2hMc3c6TFBfQ05UUjBBTFNXLAorCSAgICAgIE15RXZlbnRCaXRzOkVWQklUUygwKSwKKwkJfSwKKwl7CisJICAgICAgR2V0RW5hYmxlOkdldEVuYWJsZV9BLAorCSAgICAgIEdldEludFNyYzpHZXRJbnRTcmNfQSwKKwkgICAgICBHZXRMb2FkVHJpZzpHZXRMb2FkVHJpZ19BLAorCSAgICAgIEdldE1vZGU6CUdldE1vZGVfQSwKKwkgICAgICBQdWxzZUluZGV4OlB1bHNlSW5kZXhfQSwKKwkgICAgICBTZXRFbmFibGU6U2V0RW5hYmxlX0EsCisJICAgICAgU2V0SW50U3JjOlNldEludFNyY19BLAorCSAgICAgIFNldExvYWRUcmlnOlNldExvYWRUcmlnX0EsCisJICAgICAgU2V0TW9kZToJU2V0TW9kZV9BLAorCSAgICAgIFJlc2V0Q2FwRmxhZ3M6UmVzZXRDYXBGbGFnc19BLAorCSAgICAgIE15Q1JBOglMUF9DUjFBLAorCSAgICAgIE15Q1JCOglMUF9DUjFCLAorCSAgICAgIE15TGF0Y2hMc3c6TFBfQ05UUjFBTFNXLAorCSAgICAgIE15RXZlbnRCaXRzOkVWQklUUygxKSwKKwkJfSwKKwl7CisJICAgICAgR2V0RW5hYmxlOkdldEVuYWJsZV9BLAorCSAgICAgIEdldEludFNyYzpHZXRJbnRTcmNfQSwKKwkgICAgICBHZXRMb2FkVHJpZzpHZXRMb2FkVHJpZ19BLAorCSAgICAgIEdldE1vZGU6CUdldE1vZGVfQSwKKwkgICAgICBQdWxzZUluZGV4OlB1bHNlSW5kZXhfQSwKKwkgICAgICBTZXRFbmFibGU6U2V0RW5hYmxlX0EsCisJICAgICAgU2V0SW50U3JjOlNldEludFNyY19BLAorCSAgICAgIFNldExvYWRUcmlnOlNldExvYWRUcmlnX0EsCisJICAgICAgU2V0TW9kZToJU2V0TW9kZV9BLAorCSAgICAgIFJlc2V0Q2FwRmxhZ3M6UmVzZXRDYXBGbGFnc19BLAorCSAgICAgIE15Q1JBOglMUF9DUjJBLAorCSAgICAgIE15Q1JCOglMUF9DUjJCLAorCSAgICAgIE15TGF0Y2hMc3c6TFBfQ05UUjJBTFNXLAorCSAgICAgIE15RXZlbnRCaXRzOkVWQklUUygyKSwKKwkJfSwKKwl7CisJICAgICAgR2V0RW5hYmxlOkdldEVuYWJsZV9CLAorCSAgICAgIEdldEludFNyYzpHZXRJbnRTcmNfQiwKKwkgICAgICBHZXRMb2FkVHJpZzpHZXRMb2FkVHJpZ19CLAorCSAgICAgIEdldE1vZGU6CUdldE1vZGVfQiwKKwkgICAgICBQdWxzZUluZGV4OlB1bHNlSW5kZXhfQiwKKwkgICAgICBTZXRFbmFibGU6U2V0RW5hYmxlX0IsCisJICAgICAgU2V0SW50U3JjOlNldEludFNyY19CLAorCSAgICAgIFNldExvYWRUcmlnOlNldExvYWRUcmlnX0IsCisJICAgICAgU2V0TW9kZToJU2V0TW9kZV9CLAorCSAgICAgIFJlc2V0Q2FwRmxhZ3M6UmVzZXRDYXBGbGFnc19CLAorCSAgICAgIE15Q1JBOglMUF9DUjBBLAorCSAgICAgIE15Q1JCOglMUF9DUjBCLAorCSAgICAgIE15TGF0Y2hMc3c6TFBfQ05UUjBCTFNXLAorCSAgICAgIE15RXZlbnRCaXRzOkVWQklUUygzKSwKKwkJfSwKKwl7CisJICAgICAgR2V0RW5hYmxlOkdldEVuYWJsZV9CLAorCSAgICAgIEdldEludFNyYzpHZXRJbnRTcmNfQiwKKwkgICAgICBHZXRMb2FkVHJpZzpHZXRMb2FkVHJpZ19CLAorCSAgICAgIEdldE1vZGU6CUdldE1vZGVfQiwKKwkgICAgICBQdWxzZUluZGV4OlB1bHNlSW5kZXhfQiwKKwkgICAgICBTZXRFbmFibGU6U2V0RW5hYmxlX0IsCisJICAgICAgU2V0SW50U3JjOlNldEludFNyY19CLAorCSAgICAgIFNldExvYWRUcmlnOlNldExvYWRUcmlnX0IsCisJICAgICAgU2V0TW9kZToJU2V0TW9kZV9CLAorCSAgICAgIFJlc2V0Q2FwRmxhZ3M6UmVzZXRDYXBGbGFnc19CLAorCSAgICAgIE15Q1JBOglMUF9DUjFBLAorCSAgICAgIE15Q1JCOglMUF9DUjFCLAorCSAgICAgIE15TGF0Y2hMc3c6TFBfQ05UUjFCTFNXLAorCSAgICAgIE15RXZlbnRCaXRzOkVWQklUUyg0KSwKKwkJfSwKKwl7CisJICAgICAgR2V0RW5hYmxlOkdldEVuYWJsZV9CLAorCSAgICAgIEdldEludFNyYzpHZXRJbnRTcmNfQiwKKwkgICAgICBHZXRMb2FkVHJpZzpHZXRMb2FkVHJpZ19CLAorCSAgICAgIEdldE1vZGU6CUdldE1vZGVfQiwKKwkgICAgICBQdWxzZUluZGV4OlB1bHNlSW5kZXhfQiwKKwkgICAgICBTZXRFbmFibGU6U2V0RW5hYmxlX0IsCisJICAgICAgU2V0SW50U3JjOlNldEludFNyY19CLAorCSAgICAgIFNldExvYWRUcmlnOlNldExvYWRUcmlnX0IsCisJICAgICAgU2V0TW9kZToJU2V0TW9kZV9CLAorCSAgICAgIFJlc2V0Q2FwRmxhZ3M6UmVzZXRDYXBGbGFnc19CLAorCSAgICAgIE15Q1JBOglMUF9DUjJBLAorCSAgICAgIE15Q1JCOglMUF9DUjJCLAorCSAgICAgIE15TGF0Y2hMc3c6TFBfQ05UUjJCTFNXLAorCSAgICAgIE15RXZlbnRCaXRzOkVWQklUUyg1KSwKKwkJfSwKK307CisKKy8vIGVuYWIvZGlzYWJsZSBhIGZ1bmN0aW9uIG9yIHRlc3Qgc3RhdHVzIGJpdChzKSB0aGF0IGFyZSBhY2Nlc3NlZAorLy8gdGhyb3VnaCBNYWluIENvbnRyb2wgUmVnaXN0ZXJzIDEgb3IgMi4KKyNkZWZpbmUgTUNfRU5BQkxFKCBSRUdBRFJTLCBDVFJMV09SRCApCXdyaXRlbCggICggKHVpbnQzMl90KSggQ1RSTFdPUkQgKSA8PCAxNiApIHwgKHVpbnQzMl90KSggQ1RSTFdPUkQgKSxkZXZwcml2LT5iYXNlX2FkZHIrKCBSRUdBRFJTICkgKQorCisjZGVmaW5lIE1DX0RJU0FCTEUoIFJFR0FEUlMsIENUUkxXT1JEICkJd3JpdGVsKCAgKHVpbnQzMl90KSggQ1RSTFdPUkQgKSA8PCAxNiAsIGRldnByaXYtPmJhc2VfYWRkcisoIFJFR0FEUlMgKSApCisKKyNkZWZpbmUgTUNfVEVTVCggUkVHQURSUywgQ1RSTFdPUkQgKQkoICggcmVhZGwoZGV2cHJpdi0+YmFzZV9hZGRyKyggUkVHQURSUyApKSAmIENUUkxXT1JEICkgIT0gMCApCisKKy8qICNkZWZpbmUgV1I3MTQ2KFJFR0FSRFMsQ1RSTFdPUkQpCisgICAgd3JpdGVsKENUUkxXT1JELCh1aW50MzJfdCkoZGV2cHJpdi0+YmFzZV9hZGRyKyhSRUdBUkRTKSkpICovCisjZGVmaW5lIFdSNzE0NihSRUdBUkRTLENUUkxXT1JEKSB3cml0ZWwoQ1RSTFdPUkQsZGV2cHJpdi0+YmFzZV9hZGRyKyhSRUdBUkRTKSkKKworLyogI2RlZmluZSBSUjcxNDYoUkVHQVJEUykKKyAgICByZWFkbCgodWludDMyX3QpKGRldnByaXYtPmJhc2VfYWRkcisoUkVHQVJEUykpKSAqLworI2RlZmluZSBSUjcxNDYoUkVHQVJEUykJCXJlYWRsKGRldnByaXYtPmJhc2VfYWRkcisoUkVHQVJEUykpCisKKyNkZWZpbmUgQlVHRklYX1NUUkVHKFJFR0FEUlMpICAgKCBSRUdBRFJTIC0gNCApCisKKy8vIFdyaXRlIGEgdGltZSBzbG90IGNvbnRyb2wgcmVjb3JkIHRvIFRTTDIuCisjZGVmaW5lIFZFQ1RQT1JUKCBWRUNUTlVNICkJCShQX1RTTDIgKyAoIChWRUNUTlVNKSA8PCAyICkpCisjZGVmaW5lIFNFVFZFQ1QoIFZFQ1ROVU0sIFZFQ1RWQUwgKQlXUjcxNDYoVkVDVFBPUlQoIFZFQ1ROVU0gKSwgKFZFQ1RWQUwpKQorCisvLyBDb2RlIG1hY3JvcyB1c2VkIGZvciBjb25zdHJ1Y3RpbmcgSTJDIGNvbW1hbmQgYnl0ZXMuCisjZGVmaW5lIEkyQ19CMihBVFRSLFZBTCkJKCAoIChBVFRSKSA8PCA2ICkgfCAoIChWQUwpIDw8IDI0ICkgKQorI2RlZmluZSBJMkNfQjEoQVRUUixWQUwpCSggKCAoQVRUUikgPDwgNCApIHwgKCAoVkFMKSA8PCAxNiApICkKKyNkZWZpbmUgSTJDX0IwKEFUVFIsVkFMKQkoICggKEFUVFIpIDw8IDIgKSB8ICggKFZBTCkgPDwgIDggKSApCisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHM2MjZfcmFuZ2VfdGFibGUgPSB7IDIsIHsKKwkJCVJBTkdFKC01LCA1KSwKKwkJCVJBTkdFKC0xMCwgMTApLAorCX0KK307CisKK3N0YXRpYyBpbnQgczYyNl9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KQoreworLyogICB1aW50OF90CVBvbGxMaXN0OyAqLworLyogICB1aW50MTZfdAlBZGNEYXRhOyAqLworLyogICB1aW50MTZfdAlTdGFydFZhbDsgKi8KKy8qICAgdWludDE2X3QJaW5kZXg7ICovCisvKiAgIHVuc2lnbmVkIGludCBkYXRhWzE2XTsgKi8KKwlpbnQgcmVzdWx0OworCWludCBpOworCWludCByZXQ7CisJcmVzb3VyY2Vfc2l6ZV90IHJlc291cmNlU3RhcnQ7CisJZG1hX2FkZHJfdCBhcHBkbWE7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHM2MjZfcHJpdmF0ZSkpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1M2MjYsIFBDSV9ERVZJQ0VfSURfUzYyNiwKKwkJCU5VTEwpOyBwZGV2ICE9IE5VTEw7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1M2MjYsCisJCQlQQ0lfREVWSUNFX0lEX1M2MjYsIHBkZXYpKSB7CisJCWlmIChpdC0+b3B0aW9uc1swXSB8fCBpdC0+b3B0aW9uc1sxXSkgeworCQkJaWYgKHBkZXYtPmJ1cy0+bnVtYmVyID09IGl0LT5vcHRpb25zWzBdICYmCisJCQkJUENJX1NMT1QocGRldi0+ZGV2Zm4pID09IGl0LT5vcHRpb25zWzFdKSB7CisJCQkJLyogbWF0Y2hlcyByZXF1ZXN0ZWQgYnVzL3Nsb3QgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIG5vIGJ1cy9zbG90IHNwZWNpZmllZCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJZGV2cHJpdi0+cGRldiA9IHBkZXY7CisKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCXByaW50aygiczYyNl9hdHRhY2g6IEJvYXJkIG5vdCBwcmVzZW50ISEhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKChyZXN1bHQgPSBjb21lZGlfcGNpX2VuYWJsZShwZGV2LCAiczYyNiIpKSA8IDApIHsKKwkJcHJpbnRrKCJzNjI2X2F0dGFjaDogY29tZWRpX3BjaV9lbmFibGUgZmFpbHNcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGV2cHJpdi0+Z290X3JlZ2lvbnMgPSAxOworCisJcmVzb3VyY2VTdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwcml2LT5wZGV2LCAwKTsKKworCWRldnByaXYtPmJhc2VfYWRkciA9IGlvcmVtYXAocmVzb3VyY2VTdGFydCwgU0laRU9GX0FERFJFU1NfU1BBQ0UpOworCWlmIChkZXZwcml2LT5iYXNlX2FkZHIgPT0gTlVMTCkgeworCQlwcmludGsoInM2MjZfYXR0YWNoOiBJT1JFTUFQIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChkZXZwcml2LT5iYXNlX2FkZHIpIHsKKwkJLy9kaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHQKKwkJd3JpdGVsKDAsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCQkvL3NvZnQgcmVzZXQKKwkJd3JpdGVsKE1DMV9TT0ZUX1JFU0VULCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX01DMSk7CisKKwkJLy9ETUEgRklYTUUgRE1BLy8KKwkJREVCVUcoInM2MjZfYXR0YWNoOiBETUEgQUxMT0NBVElPTlxuIik7CisKKwkJLy9hZGMgYnVmZmVyIGFsbG9jYXRpb24KKwkJZGV2cHJpdi0+YWxsb2NhdGVkQnVmID0gMDsKKworCQlpZiAoKGRldnByaXYtPkFOQUJ1Zi5Mb2dpY2FsQmFzZSA9CisJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGRldiwgRE1BQlVGX1NJWkUsCisJCQkJCSZhcHBkbWEpKSA9PSBOVUxMKSB7CisJCQlwcmludGsoInM2MjZfYXR0YWNoOiBETUEgTWVtb3J5IG1hcHBpbmcgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlkZXZwcml2LT5BTkFCdWYuUGh5c2ljYWxCYXNlID0gYXBwZG1hOworCisJCURFQlVHKCJzNjI2X2F0dGFjaDogQWxsb2NETUFCIEFEQyBMb2dpY2FsPSVwLCBic2l6ZT0lZCwgUGh5c2ljYWw9MHgleFxuIiwgZGV2cHJpdi0+QU5BQnVmLkxvZ2ljYWxCYXNlLCBETUFCVUZfU0laRSwgKHVpbnQzMl90KSBkZXZwcml2LT5BTkFCdWYuUGh5c2ljYWxCYXNlKTsKKworCQlkZXZwcml2LT5hbGxvY2F0ZWRCdWYrKzsKKworCQlpZiAoKGRldnByaXYtPlJQU0J1Zi5Mb2dpY2FsQmFzZSA9CisJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGRldiwgRE1BQlVGX1NJWkUsCisJCQkJCSZhcHBkbWEpKSA9PSBOVUxMKSB7CisJCQlwcmludGsoInM2MjZfYXR0YWNoOiBETUEgTWVtb3J5IG1hcHBpbmcgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlkZXZwcml2LT5SUFNCdWYuUGh5c2ljYWxCYXNlID0gYXBwZG1hOworCisJCURFQlVHKCJzNjI2X2F0dGFjaDogQWxsb2NETUFCIFJQUyBMb2dpY2FsPSVwLCBic2l6ZT0lZCwgUGh5c2ljYWw9MHgleFxuIiwgZGV2cHJpdi0+UlBTQnVmLkxvZ2ljYWxCYXNlLCBETUFCVUZfU0laRSwgKHVpbnQzMl90KSBkZXZwcml2LT5SUFNCdWYuUGh5c2ljYWxCYXNlKTsKKworCQlkZXZwcml2LT5hbGxvY2F0ZWRCdWYrKzsKKworCX0KKworCWRldi0+Ym9hcmRfcHRyID0gczYyNl9ib2FyZHM7CisJZGV2LT5ib2FyZF9uYW1lID0gdGhpc2JvYXJkLT5uYW1lOworCisJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCA2KSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5pb2Jhc2UgPSAodW5zaWduZWQgbG9uZylkZXZwcml2LT5iYXNlX2FkZHI7CisJZGV2LT5pcnEgPSBkZXZwcml2LT5wZGV2LT5pcnE7CisKKwkvL3NldCB1cCBpbnRlcnJ1cHQgaGFuZGxlcgorCWlmIChkZXYtPmlycSA9PSAwKSB7CisJCXByaW50aygiIHVua25vd24gaXJxIChiYWQpXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoKHJldCA9IGNvbWVkaV9yZXF1ZXN0X2lycShkZXYtPmlycSwgczYyNl9pcnFfaGFuZGxlciwKKwkJCQkJSVJRRl9TSEFSRUQsICJzNjI2IiwgZGV2KSkgPCAwKSB7CisJCQlwcmludGsoIiBpcnEgbm90IGF2YWlsYWJsZVxuIik7CisJCQlkZXYtPmlycSA9IDA7CisJCX0KKwl9CisKKwlERUJVRygiczYyNl9hdHRhY2g6IC0tIGl0IG9wdHMgICVkLCVkIC0tIFxuIiwKKwkJaXQtPm9wdGlvbnNbMF0sIGl0LT5vcHRpb25zWzFdKTsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCS8qIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgKi8KKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkvKiB3ZSBzdXBwb3J0IHNpbmdsZS1lbmRlZCAoZ3JvdW5kKSBhbmQgZGlmZmVyZW50aWFsICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9ESUZGIHwgU0RGX0NNRF9SRUFEOworCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YWlfY2hhbnM7CisJcy0+bWF4ZGF0YSA9ICgweGZmZmYgPj4gMik7CisJcy0+cmFuZ2VfdGFibGUgPSAmczYyNl9yYW5nZV90YWJsZTsKKwlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzYm9hcmQtPmFpX2NoYW5zOwkvKiBUaGlzIGlzIHRoZSBtYXhpbXVtIGNoYW5saXN0CisJCQkJCQkgICBsZW5ndGggdGhhdCB0aGUgYm9hcmQgY2FuCisJCQkJCQkgICBoYW5kbGUgKi8KKwlzLT5pbnNuX2NvbmZpZyA9IHM2MjZfYWlfaW5zbl9jb25maWc7CisJcy0+aW5zbl9yZWFkID0gczYyNl9haV9pbnNuX3JlYWQ7CisJcy0+ZG9fY21kID0gczYyNl9haV9jbWQ7CisJcy0+ZG9fY21kdGVzdCA9IHM2MjZfYWlfY21kdGVzdDsKKwlzLT5jYW5jZWwgPSBzNjI2X2FpX2NhbmNlbDsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAxOworCS8qIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFvX2NoYW5zOworCXMtPm1heGRhdGEgPSAoMHgzZmZmKTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7CisJcy0+aW5zbl93cml0ZSA9IHM2MjZfYW9fd2luc247CisJcy0+aW5zbl9yZWFkID0gczYyNl9hb19yaW5zbjsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAyOworCS8qIGRpZ2l0YWwgSS9PIHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IFM2MjZfRElPX0NIQU5ORUxTOworCXMtPm1heGRhdGEgPSAxOworCXMtPmlvX2JpdHMgPSAweGZmZmY7CisJcy0+cHJpdmF0ZSA9ICZkaW9fcHJpdmF0ZV9BOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9jb25maWcgPSBzNjI2X2Rpb19pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX2JpdHMgPSBzNjI2X2Rpb19pbnNuX2JpdHM7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMzsKKwkvKiBkaWdpdGFsIEkvTyBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSAxNjsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5pb19iaXRzID0gMHhmZmZmOworCXMtPnByaXZhdGUgPSAmZGlvX3ByaXZhdGVfQjsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fY29uZmlnID0gczYyNl9kaW9faW5zbl9jb25maWc7CisJcy0+aW5zbl9iaXRzID0gczYyNl9kaW9faW5zbl9iaXRzOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDQ7CisJLyogZGlnaXRhbCBJL08gc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuID0gMTY7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+aW9fYml0cyA9IDB4ZmZmZjsKKwlzLT5wcml2YXRlID0gJmRpb19wcml2YXRlX0M7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2NvbmZpZyA9IHM2MjZfZGlvX2luc25fY29uZmlnOworCXMtPmluc25fYml0cyA9IHM2MjZfZGlvX2luc25fYml0czsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyA1OworCS8qIGVuY29kZXIgKGNvdW50ZXIpIHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRSB8IFNERl9MU0FNUEw7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5lbmNfY2hhbnM7CisJcy0+cHJpdmF0ZSA9IGVuY19wcml2YXRlX2RhdGE7CisJcy0+aW5zbl9jb25maWcgPSBzNjI2X2VuY19pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX3JlYWQgPSBzNjI2X2VuY19pbnNuX3JlYWQ7CisJcy0+aW5zbl93cml0ZSA9IHM2MjZfZW5jX2luc25fd3JpdGU7CisJcy0+bWF4ZGF0YSA9IDB4ZmZmZmZmOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3Vua25vd247CisKKwkvL3N0b3AgYWlfY29tbWFuZAorCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCWlmIChkZXZwcml2LT5iYXNlX2FkZHIgJiYgKGRldnByaXYtPmFsbG9jYXRlZEJ1ZiA9PSAyKSkgeworCQlkbWFfYWRkcl90IHBQaHlzQnVmOworCQl1aW50MTZfdCBjaGFuOworCisJCS8vIGVuYWIgREVCSSBhbmQgYXVkaW8gcGlucywgZW5hYmxlIEkyQyBpbnRlcmZhY2UuCisJCU1DX0VOQUJMRShQX01DMSwgTUMxX0RFQkkgfCBNQzFfQVVESU8gfCBNQzFfSTJDKTsKKwkJLy8gQ29uZmlndXJlIERFQkkgb3BlcmF0aW5nIG1vZGUuCisJCVdSNzE0NihQX0RFQklDRkcsIERFQklfQ0ZHX1NMQVZFMTYJLy8gTG9jYWwgYnVzIGlzIDE2CisJCQkvLyBiaXRzIHdpZGUuCisJCQl8IChERUJJX1RPVVQgPDwgREVCSV9DRkdfVE9VVF9CSVQpCS8vIERlY2xhcmUgREVCSQorCQkJLy8gdHJhbnNmZXIgdGltZW91dAorCQkJLy8gaW50ZXJ2YWwuCisJCQl8IERFQklfU1dBUAkvLyBTZXQgdXAgYnl0ZSBsYW5lCisJCQkvLyBzdGVlcmluZy4KKwkJCXwgREVCSV9DRkdfSU5URUwpOwkvLyBJbnRlbC1jb21wYXRpYmxlCisJCS8vIGxvY2FsIGJ1cyAoREVCSQorCQkvLyBuZXZlciB0aW1lcyBvdXQpLgorCQlERUJVRygiczYyNl9hdHRhY2g6ICVkIGRlYmkgaW5pdCAtLSAlZFxuIiwKKwkJCURFQklfQ0ZHX1NMQVZFMTYgfCAoREVCSV9UT1VUIDw8IERFQklfQ0ZHX1RPVVRfQklUKSB8CisJCQlERUJJX1NXQVAgfCBERUJJX0NGR19JTlRFTCwKKwkJCURFQklfQ0ZHX0lOVEVMIHwgREVCSV9DRkdfVE9RIHwgREVCSV9DRkdfSU5DUSB8CisJCQlERUJJX0NGR18xNlEpOworCisJCS8vREVCSSBJTklUIFM2MjYgV1I3MTQ2KCBQX0RFQklDRkcsIERFQklfQ0ZHX0lOVEVMIHwgREVCSV9DRkdfVE9RCisJCS8vfCBERUJJX0NGR19JTkNRfCBERUJJX0NGR18xNlEpOyAvL2VuZAorCisJCS8vIFBhZ2luZyBpcyBkaXNhYmxlZC4KKwkJV1I3MTQ2KFBfREVCSVBBR0UsIERFQklfUEFHRV9ESVNBQkxFKTsJLy8gRGlzYWJsZSBNTVUgcGFnaW5nLgorCisJCS8vIEluaXQgR1BJTyBzbyB0aGF0IEFEQyBTdGFydCogaXMgbmVnYXRlZC4KKwkJV1I3MTQ2KFBfR1BJTywgR1BJT19CQVNFIHwgR1BJTzFfSEkpOworCisJCS8vSXNCb2FyZFJldkEgaXMgYSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvYXJkIGlzCisJCS8vUmV2QS4KKworCQkvLyBWRVJTSU9OIDIuMDEgQ0hBTkdFOiBSRVYgQSAmIEIgQk9BUkRTIE5PVyBTVVBQT1JURUQgQlkgRFlOQU1JQworCQkvLyBFRVBST00gQUREUkVTUyBTRUxFQ1RJT04uICBJbml0aWFsaXplIHRoZSBJMkMgaW50ZXJmYWNlLCB3aGljaAorCQkvLyBpcyB1c2VkIHRvIGFjY2VzcyB0aGUgb25ib2FyZCBzZXJpYWwgRUVQUk9NLiAgVGhlIEVFUFJPTSdzIEkyQworCQkvLyBEZXZpY2VBZGRyZXNzIGlzIGhhcmR3aXJlZCB0byBhIHZhbHVlIHRoYXQgaXMgZGVwZW5kZW50IG9uIHRoZQorCQkvLyA2MjYgYm9hcmQgcmV2aXNpb24uICBPbiBhbGwgYm9hcmQgcmV2aXNpb25zLCB0aGUgRUVQUk9NIHN0b3JlcworCQkvLyBUcmltREFDIGNhbGlicmF0aW9uIGNvbnN0YW50cyBmb3IgYW5hbG9nIEkvTy4gIE9uIFJldkIgYW5kCisJCS8vIGhpZ2hlciBib2FyZHMsIHRoZSBEZXZpY2VBZGRyZXNzIGlzIGhhcmR3aXJlZCB0byAwIHRvIGVuYWJsZQorCQkvLyB0aGUgRUVQUk9NIHRvIGFsc28gc3RvcmUgdGhlIFBDSSBTdWJWZW5kb3JJRCBhbmQgU3ViRGV2aWNlSUQ7CisJCS8vIHRoaXMgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhlIFNBQTcxNDYgZXhwZWN0cyBhCisJCS8vIGNvbmZpZ3VyYXRpb24gRUVQUk9NIHRvIHJlc2lkZS4gIE9uIFJldkEgYm9hcmRzLCB0aGUgRUVQUk9NCisJCS8vIGRldmljZSBhZGRyZXNzLCB3aGljaCBpcyBoYXJkd2lyZWQgdG8gNCwgcHJldmVudHMgdGhlIFNBQTcxNDYKKwkJLy8gZnJvbSByZXRyaWV2aW5nIFBDSSBzdWItSURzLCBzbyB0aGUgU0FBNzE0NiB1c2VzIGl0cyBidWlsdC1pbgorCQkvLyBkZWZhdWx0IHZhbHVlcywgaW5zdGVhZC4KKworCQkvLyAgICBkZXZwcml2LT5JMkNhcmRzPSBJc0JvYXJkUmV2QSA/IDB4QTggOiAweEEwOyAvLyBTZXQgSTJDIEVFUFJPTQorCQkvLyBEZXZpY2VUeXBlICgweEEwKQorCQkvLyBhbmQgRGV2aWNlQWRkcmVzczw8MS4KKworCQlkZXZwcml2LT5JMkNBZHJzID0gMHhBMDsJLy8gSTJDIGRldmljZSBhZGRyZXNzIGZvciBvbmJvYXJkCisJCS8vIGVlcHJvbShyZXZiKQorCisJCS8vIElzc3VlIGFuIEkyQyBBQk9SVCBjb21tYW5kIHRvIGhhbHQgYW55IEkyQyBvcGVyYXRpb24gaW4KKwkJLy9wcm9ncmVzcyBhbmQgcmVzZXQgQlVTWSBmbGFnLgorCQlXUjcxNDYoUF9JMkNTVEFULCBJMkNfQ0xLU0VMIHwgSTJDX0FCT1JUKTsJLy8gV3JpdGUgSTJDIGNvbnRyb2w6CisJCS8vIGFib3J0IGFueSBJMkMKKwkJLy8gYWN0aXZpdHkuCisJCU1DX0VOQUJMRShQX01DMiwgTUMyX1VQTERfSUlDKTsJLy8gSW52b2tlIGNvbW1hbmQKKwkJLy8gdXBsb2FkCisJCXdoaWxlICgoUlI3MTQ2KFBfTUMyKSAmIE1DMl9VUExEX0lJQykgPT0gMCkgOwkvLyBhbmQgd2FpdCBmb3IKKwkJLy8gdXBsb2FkIHRvCisJCS8vIGNvbXBsZXRlLgorCisJCS8vIFBlciBTQUE3MTQ2IGRhdGEgc2hlZXQsIHdyaXRlIHRvIFNUQVRVUyByZWcgdHdpY2UgdG8gcmVzZXQgYWxsCisJCS8vIEkyQyBlcnJvciBmbGFncy4KKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJV1I3MTQ2KFBfSTJDU1RBVCwgSTJDX0NMS1NFTCk7CS8vIFdyaXRlIEkyQyBjb250cm9sOiByZXNldAorCQkJLy8gZXJyb3IgZmxhZ3MuCisJCQlNQ19FTkFCTEUoUF9NQzIsIE1DMl9VUExEX0lJQyk7CS8vIEludm9rZSBjb21tYW5kIHVwbG9hZAorCQkJd2hpbGUgKCFNQ19URVNUKFBfTUMyLCBNQzJfVVBMRF9JSUMpKSA7CS8vICAgYW5kIHdhaXQgZm9yCisJCQkvLyAgIHVwbG9hZCB0bworCQkJLy8gICBjb21wbGV0ZS4KKwkJfQorCisJCS8vIEluaXQgYXVkaW8gaW50ZXJmYWNlIGZ1bmN0aW9uYWwgYXR0cmlidXRlczogc2V0IERBQy9BREMgc2VyaWFsCisJCS8vIGNsb2NrIHJhdGVzLCBpbnZlcnQgREFDIHNlcmlhbCBjbG9jayBzbyB0aGF0IERBQyBkYXRhIHNldHVwCisJCS8vIHRpbWVzIGFyZSBzYXRpc2ZpZWQsIGVuYWJsZSBEQUMgc2VyaWFsIGNsb2NrIG91dC4KKwkJV1I3MTQ2KFBfQUNPTjIsIEFDT04yX0lOSVQpOworCisJCS8vIFNldCB1cCBUU0wxIHNsb3QgbGlzdCwgd2hpY2ggaXMgdXNlZCB0byBjb250cm9sIHRoZQorCQkvLyBhY2N1bXVsYXRpb24gb2YgQURDIGRhdGE6IFJTRDEgPSBzaGlmdCBkYXRhIGluIG9uIFNEMS4gIFNJQl9BMQorCQkvLyA9IHN0b3JlIGRhdGEgdWludDhfdCBhdCBuZXh0IGF2YWlsYWJsZSBsb2NhdGlvbiBpbiBGQiBCVUZGRVIxCisJCS8vIHJlZ2lzdGVyLgorCQlXUjcxNDYoUF9UU0wxLCBSU0QxIHwgU0lCX0ExKTsJLy8gRmV0Y2ggQURDIGhpZ2ggZGF0YQorCQkvLyB1aW50OF90LgorCQlXUjcxNDYoUF9UU0wxICsgNCwgUlNEMSB8IFNJQl9BMSB8IEVPUyk7CS8vIEZldGNoIEFEQyBsb3cgZGF0YQorCQkvLyB1aW50OF90OyBlbmQgb2YKKwkJLy8gVFNMMS4KKworCQkvLyBlbmFiIFRTTDEgc2xvdCBsaXN0IHNvIHRoYXQgaXQgZXhlY3V0ZXMgYWxsIHRoZSB0aW1lLgorCQlXUjcxNDYoUF9BQ09OMSwgQUNPTjFfQURDU1RBUlQpOworCisJCS8vIEluaXRpYWxpemUgUlBTIHJlZ2lzdGVycyB1c2VkIGZvciBBREMuCisKKwkJLy9QaHlzaWNhbCBzdGFydCBvZiBSUFMgcHJvZ3JhbS4KKwkJV1I3MTQ2KFBfUlBTQUREUjEsICh1aW50MzJfdCkgZGV2cHJpdi0+UlBTQnVmLlBoeXNpY2FsQmFzZSk7CisKKwkJV1I3MTQ2KFBfUlBTUEFHRTEsIDApOwkvLyBSUFMgcHJvZ3JhbSBwZXJmb3JtcyBubworCQkvLyBleHBsaWNpdCBtZW0gd3JpdGVzLgorCQlXUjcxNDYoUF9SUFMxX1RPVVQsIDApOwkvLyBEaXNhYmxlIFJQUyB0aW1lb3V0cy4KKworCQkvLyBTQUE3MTQ2IEJVRyBXT1JLQVJPVU5ELiAgSW5pdGlhbGl6ZSBTQUE3MTQ2IEFEQyBpbnRlcmZhY2UgdG8gYQorCQkvLyBrbm93biBzdGF0ZSBieSBpbnZva2luZyBBRENzIHVudGlsIEZCIEJVRkZFUiAxIHJlZ2lzdGVyIHNob3dzCisJCS8vIHRoYXQgaXQgaXMgY29ycmVjdGx5IHJlY2VpdmluZyBBREMgZGF0YS4gIFRoaXMgaXMgbmVjZXNzYXJ5CisJCS8vIGJlY2F1c2UgdGhlIFNBQTcxNDYgQURDIGludGVyZmFjZSBkb2VzIG5vdCBzdGFydCB1cCBpbiBhCisJCS8vIGRlZmluZWQgc3RhdGUgYWZ0ZXIgYSBQQ0kgcmVzZXQuCisKKy8qICAgICBQb2xsTGlzdCA9IEVPUEw7CQkJLy8gQ3JlYXRlIGEgc2ltcGxlIHBvbGxpbmcgKi8KKy8qIAkJCQkJLy8gbGlzdCBmb3IgYW5hbG9nIGlucHV0ICovCisvKiAJCQkJCS8vIGNoYW5uZWwgMC4gKi8KKy8qICAgICBSZXNldEFEQyggZGV2LCAmUG9sbExpc3QgKTsgKi8KKworLyogICAgIHM2MjZfYWlfcmluc24oZGV2LGRldi0+c3ViZGV2aWNlcyxOVUxMLGRhdGEpOyAvLyggJkFkY0RhdGEgKTsgLy8gKi8KKy8qIAkJCQkJCSAgLy9HZXQgaW5pdGlhbCBBREMgKi8KKy8qIAkJCQkJCSAgLy92YWx1ZS4gKi8KKworLyogICAgIFN0YXJ0VmFsID0gZGF0YVswXTsgKi8KKworLyogICAgIC8vIFZFUlNJT04gMi4wMSBDSEFOR0U6IFRJTUVPVVQgQURERUQgVE8gUFJFVkVOVCBIQU5HRUQgRVhFQ1VUSU9OLiAqLworLyogICAgIC8vIEludm9rZSBBRENzIHVudGlsIHRoZSBuZXcgQURDIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgaW5pdGlhbCAqLworLyogICAgIC8vIHZhbHVlIG9yIGEgdGltZW91dCBvY2N1cnMuICBUaGUgdGltZW91dCBwcm90ZWN0cyBhZ2FpbnN0IHRoZSAqLworLyogICAgIC8vIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGRyaXZlciBpcyByZXN0YXJ0aW5nIGFuZCB0aGUgQURDIGRhdGEgaXMgYSAqLworLyogICAgIC8vIGZpeGVkIHZhbHVlIHJlc3VsdGluZyBmcm9tIHRoZSBhcHBsaWVkIEFEQyBhbmFsb2cgaW5wdXQgYmVpbmcgKi8KKy8qICAgICAvLyB1bnVzdWFsbHkgcXVpZXQgb3IgYXQgdGhlIHJhaWwuICovCisKKy8qICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgNTAwOyBpbmRleCsrICkgKi8KKy8qICAgICAgIHsgKi8KKy8qIAlzNjI2X2FpX3JpbnNuKGRldixkZXYtPnN1YmRldmljZXMsTlVMTCxkYXRhKTsgKi8KKy8qIAlBZGNEYXRhID0gZGF0YVswXTsJLy9SZWFkQURDKCAgJkFkY0RhdGEgKTsgKi8KKy8qIAlpZiAoIEFkY0RhdGEgIT0gU3RhcnRWYWwgKSAqLworLyogCSAgYnJlYWs7ICovCisvKiAgICAgICB9ICovCisKKwkJLy8gZW5kIGluaXRBREMKKworCQkvLyBpbml0IHRoZSBEQUMgaW50ZXJmYWNlCisKKwkJLy8gSW5pdCBBdWRpbzIncyBvdXRwdXQgRE1BQyBhdHRyaWJ1dGVzOiBidXJzdCBsZW5ndGggPSAxIERXT1JELAorCQkvLyB0aHJlc2hvbGQgPSAxIERXT1JELgorCQlXUjcxNDYoUF9QQ0lfQlRfQSwgMCk7CisKKwkJLy8gSW5pdCBBdWRpbzIncyBvdXRwdXQgRE1BIHBoeXNpY2FsIGFkZHJlc3Nlcy4gIFRoZSBwcm90ZWN0aW9uCisJCS8vIGFkZHJlc3MgaXMgc2V0IHRvIDEgRFdPUkQgcGFzdCB0aGUgYmFzZSBhZGRyZXNzIHNvIHRoYXQgYQorCQkvLyBzaW5nbGUgRFdPUkQgd2lsbCBiZSB0cmFuc2ZlcnJlZCBlYWNoIHRpbWUgYSBETUEgdHJhbnNmZXIgaXMKKwkJLy8gZW5hYmxlZC4KKworCQlwUGh5c0J1ZiA9CisJCQlkZXZwcml2LT5BTkFCdWYuUGh5c2ljYWxCYXNlICsKKwkJCShEQUNfV0RNQUJVRl9PUyAqIHNpemVvZih1aW50MzJfdCkpOworCisJCVdSNzE0NihQX0JBU0VBMl9PVVQsICh1aW50MzJfdCkgcFBoeXNCdWYpOwkvLyBCdWZmZXIgYmFzZSBhZHJzLgorCQlXUjcxNDYoUF9QUk9UQTJfT1VULCAodWludDMyX3QpIChwUGh5c0J1ZiArIHNpemVvZih1aW50MzJfdCkpKTsJLy8gUHJvdGVjdGlvbiBhZGRyZXNzLgorCisJCS8vIENhY2hlIEF1ZGlvMidzIG91dHB1dCBETUEgYnVmZmVyIGxvZ2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMKKwkJLy8gd2hlcmUgREFDIGRhdGEgaXMgYnVmZmVyZWQgZm9yIEEyIG91dHB1dCBETUEgdHJhbnNmZXJzLgorCQlkZXZwcml2LT5wRGFjV0J1ZiA9CisJCQkodWludDMyX3QgKikgZGV2cHJpdi0+QU5BQnVmLkxvZ2ljYWxCYXNlICsKKwkJCURBQ19XRE1BQlVGX09TOworCisJCS8vIEF1ZGlvMidzIG91dHB1dCBjaGFubmVscyBkb2VzIG5vdCB1c2UgcGFnaW5nLiAgVGhlIHByb3RlY3Rpb24KKwkJLy8gdmlvbGF0aW9uIGhhbmRsaW5nIGJpdCBpcyBzZXQgc28gdGhhdCB0aGUgRE1BQyB3aWxsCisJCS8vIGF1dG9tYXRpY2FsbHkgaGFsdCBhbmQgaXRzIFBDSSBhZGRyZXNzIHBvaW50ZXIgd2lsbCBiZSByZXNldAorCQkvLyB3aGVuIHRoZSBwcm90ZWN0aW9uIGFkZHJlc3MgaXMgcmVhY2hlZC4KKwkJV1I3MTQ2KFBfUEFHRUEyX09VVCwgOCk7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aW1lIHNsb3QgbGlzdCAyIChUU0wyKSwgd2hpY2ggaXMgdXNlZCB0byBjb250cm9sCisJCS8vIHRoZSBjbG9jayBnZW5lcmF0aW9uIGZvciBhbmQgc2VyaWFsaXphdGlvbiBvZiBkYXRhIHRvIGJlIHNlbnQKKwkJLy8gdG8gdGhlIERBQyBkZXZpY2VzLiAgU2xvdCAwIGlzIGEgTk9QIHRoYXQgaXMgdXNlZCB0byB0cmFwIFRTTAorCQkvLyBleGVjdXRpb247IHRoaXMgcGVybWl0cyBvdGhlciBzbG90cyB0byBiZSBzYWZlbHkgbW9kaWZpZWQKKwkJLy8gd2l0aG91dCBmaXJzdCB0dXJuaW5nIG9mZiB0aGUgVFNMIHNlcXVlbmNlciAod2hpY2ggaXMKKwkJLy8gYXBwYXJlbnRseSBpbXBvc3NpYmxlIHRvIGRvKS4gIEFsc28sIFNEMyAod2hpY2ggaXMgZHJpdmVuIGJ5IGEKKwkJLy8gcHVsbC11cCByZXNpc3RvcikgaXMgc2hpZnRlZCBpbiBhbmQgc3RvcmVkIHRvIHRoZSBNU0Igb2YKKwkJLy8gRkJfQlVGRkVSMiB0byBiZSB1c2VkIGFzIGV2aWRlbmNlIHRoYXQgdGhlIHNsb3Qgc2VxdWVuY2UgaGFzCisJCS8vIG5vdCB5ZXQgZmluaXNoZWQgZXhlY3V0aW5nLgorCQlTRVRWRUNUKDAsIFhTRDIgfCBSU0QzIHwgU0lCX0EyIHwgRU9TKTsJLy8gU2xvdCAwOiBUcmFwIFRTTAorCQkvLyBleGVjdXRpb24sIHNoaWZ0IDB4RkYKKwkJLy8gaW50byBGQl9CVUZGRVIyLgorCisJCS8vIEluaXRpYWxpemUgc2xvdCAxLCB3aGljaCBpcyBjb25zdGFudC4gIFNsb3QgMSBjYXVzZXMgYSBEV09SRCB0bworCQkvLyBiZSB0cmFuc2ZlcnJlZCBmcm9tIGF1ZGlvIGNoYW5uZWwgMidzIG91dHB1dCBGSUZPIHRvIHRoZSBGSUZPJ3MKKwkJLy8gb3V0cHV0IGJ1ZmZlciBzbyB0aGF0IGl0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBzZW50IHRvIHRoZSBEQUMKKwkJLy8gZHVyaW5nIHN1YnNlcXVlbnQgc2xvdHMuICBBbGwgcmVtYWluaW5nIHNsb3RzIGFyZSBkeW5hbWljYWxseQorCQkvLyBwb3B1bGF0ZWQgYXMgcmVxdWlyZWQgYnkgdGhlIHRhcmdldCBEQUMgZGV2aWNlLgorCQlTRVRWRUNUKDEsIExGX0EyKTsJLy8gU2xvdCAxOiBGZXRjaCBEV09SRCBmcm9tIEF1ZGlvMidzCisJCS8vIG91dHB1dCBGSUZPLgorCisJCS8vIFN0YXJ0IERBQydzIGF1ZGlvIGludGVyZmFjZSAoVFNMMikgcnVubmluZy4KKwkJV1I3MTQ2KFBfQUNPTjEsIEFDT04xX0RBQ1NUQVJUKTsKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCS8vIGVuZCBpbml0IERBQyBpbnRlcmZhY2UKKworCQkvLyBJbml0IFRyaW0gREFDcyB0byBjYWxpYnJhdGVkIHZhbHVlcy4gIERvIGl0IHR3aWNlIGJlY2F1c2UgdGhlCisJCS8vIFNBQTcxNDYgYXVkaW8gY2hhbm5lbCBkb2VzIG5vdCBhbHdheXMgcmVzZXQgcHJvcGVybHkgYW5kCisJCS8vIHNvbWV0aW1lcyBjYXVzZXMgdGhlIGZpcnN0IGZldyBUcmltREFDIHdyaXRlcyB0byBtYWxmdW5jdGlvbi4KKworCQlMb2FkVHJpbURBQ3MoZGV2KTsKKwkJTG9hZFRyaW1EQUNzKGRldik7CS8vIEluc3VyYW5jZS4KKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gTWFudWFsbHkgaW5pdCBhbGwgZ2F0ZSBhcnJheSBoYXJkd2FyZSBpbiBjYXNlIHRoaXMgaXMgYSBzb2Z0CisJCS8vIHJlc2V0ICh3ZSBoYXZlIG5vIHdheSBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIHRoaXMgaXMgYSB3YXJtIG9yCisJCS8vIGNvbGQgc3RhcnQpLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZ2F0ZSBhcnJheSB3aWxsCisJCS8vIHJlc2V0IG9ubHkgaW4gcmVzcG9uc2UgdG8gYSBQQ0kgaGFyZCByZXNldDsgdGhlcmUgaXMgbm8gc29mdAorCQkvLyByZXNldCBmdW5jdGlvbi4KKworCQkvLyBJbml0IGFsbCBEQUMgb3V0cHV0cyB0byAwViBhbmQgaW5pdCBhbGwgREFDIHNldHBvaW50IGFuZAorCQkvLyBwb2xhcml0eSBpbWFnZXMuCisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBTNjI2X0RBQ19DSEFOTkVMUzsgY2hhbisrKQorCQkJU2V0REFDKGRldiwgY2hhbiwgMCk7CisKKwkJLy8gSW5pdCBpbWFnZSBvZiBXUk1JU0MyIEJhdHRlcnkgQ2hhcmdlciBFbmFibGVkIGNvbnRyb2wgYml0LgorCQkvLyBUaGlzIGltYWdlIGlzIHVzZWQgd2hlbiB0aGUgc3RhdGUgb2YgdGhlIGNoYXJnZXIgY29udHJvbCBiaXQsCisJCS8vIHdoaWNoIGhhcyBubyBkaXJlY3QgaGFyZHdhcmUgcmVhZGJhY2sgbWVjaGFuaXNtLCBpcyBxdWVyaWVkLgorCQlkZXZwcml2LT5DaGFyZ2VFbmFibGVkID0gMDsKKworCQkvLyBJbml0IGltYWdlIG9mIHdhdGNoZG9nIHRpbWVyIGludGVydmFsIGluIFdSTUlTQzIuICBUaGlzIGltYWdlCisJCS8vIG1haW50YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgYml0cyBvZiBNSVNDMiBhcmUKKwkJLy8gY29udGludW91c2x5IHJlc2V0IHRvIHplcm8gYXMgbG9uZyBhcyB0aGUgV0QgdGltZXIgaXMgZGlzYWJsZWQuCisJCWRldnByaXYtPldESW50ZXJ2YWwgPSAwOworCisJCS8vIEluaXQgQ291bnRlciBJbnRlcnJ1cHQgZW5hYiBtYXNrIGZvciBSRE1JU0MyLiAgVGhpcyBtYXNrIGlzCisJCS8vIGFwcGxpZWQgYWdhaW5zdCBNSVNDMiB3aGVuIHRlc3RpbmcgdG8gZGV0ZXJtaW5lIHdoaWNoIHRpbWVyCisJCS8vIGV2ZW50cyBhcmUgcmVxdWVzdGluZyBpbnRlcnJ1cHQgc2VydmljZS4KKwkJZGV2cHJpdi0+Q291bnRlckludEVuYWJzID0gMDsKKworCQkvLyBJbml0IGNvdW50ZXJzLgorCQlDb3VudGVyc0luaXQoZGV2KTsKKworCQkvLyBXaXRob3V0IG1vZGlmeWluZyB0aGUgc3RhdGUgb2YgdGhlIEJhdHRlcnkgQmFja3VwIGVuYWIsIGRpc2FibGUKKwkJLy8gdGhlIHdhdGNoZG9nIHRpbWVyLCBzZXQgRElPIGNoYW5uZWxzIDAtNSB0byBvcGVyYXRlIGluIHRoZQorCQkvLyBzdGFuZGFyZCBESU8gKHZzLiBjb3VudGVyIG92ZXJmbG93KSBtb2RlLCBkaXNhYmxlIHRoZSBiYXR0ZXJ5CisJCS8vIGNoYXJnZXIsIGFuZCByZXNldCB0aGUgd2F0Y2hkb2cgaW50ZXJ2YWwgc2VsZWN0b3IgdG8gemVyby4KKwkJV3JpdGVNSVNDMihkZXYsICh1aW50MTZfdCkgKERFQklyZWFkKGRldiwKKwkJCQkJTFBfUkRNSVNDMikgJiBNSVNDMl9CQVRUX0VOQUJMRSkpOworCisJCS8vIEluaXRpYWxpemUgdGhlIGRpZ2l0YWwgSS9PIHN1YnN5c3RlbS4KKwkJczYyNl9kaW9faW5pdChkZXYpOworCisJCS8vZW5hYmxlIGludGVycnVwdCB0ZXN0CisJCS8vIHdyaXRlbChJUlFfR1BJTzMgfCBJUlFfUlBTMSxkZXZwcml2LT5iYXNlX2FkZHIrUF9JRVIpOworCX0KKworCURFQlVHKCJzNjI2X2F0dGFjaDogY29tZWRpJWQgczYyNiBhdHRhY2hlZCAlMDR4XG4iLCBkZXYtPm1pbm9yLAorCQkodWludDMyX3QpIGRldnByaXYtPmJhc2VfYWRkcik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGxzYW1wbF90IHM2MjZfYWlfcmVnX3RvX3VpbnQoaW50IGRhdGEpCit7CisJbHNhbXBsX3QgdGVtcGRhdGE7CisKKwl0ZW1wZGF0YSA9IChkYXRhID4+IDE4KTsKKwlpZiAodGVtcGRhdGEgJiAweDIwMDApCisJCXRlbXBkYXRhICY9IDB4MWZmZjsKKwllbHNlCisJCXRlbXBkYXRhICs9ICgxIDw8IDEzKTsKKworCXJldHVybiB0ZW1wZGF0YTsKK30KKworLyogc3RhdGljIGxzYW1wbF90IHM2MjZfdWludF90b19yZWcoY29tZWRpX3N1YmRldmljZSAqcywgaW50IGRhdGEpeyAqLworLyogICByZXR1cm4gMDsgKi8KKy8qIH0gKi8KKworc3RhdGljIGlycXJldHVybl90IHM2MjZfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZCBQVF9SRUdTX0FSRykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2NtZCAqY21kOworCWVuY19wcml2YXRlICprOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50MzJfdCAqcmVhZGFkZHI7CisJdWludDMyX3QgaXJxdHlwZSwgaXJxc3RhdHVzOworCWludCBpID0gMDsKKwlzYW1wbF90IHRlbXBkYXRhOworCXVpbnQ4X3QgZ3JvdXA7CisJdWludDE2X3QgaXJxYml0OworCisJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCByZXF1ZXN0IHJlY2lldmVkISEhXG4iKTsKKworCWlmIChkZXYtPmF0dGFjaGVkID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKKwkvLyBsb2NrIHRvIGF2b2lkIHJhY2Ugd2l0aCBjb21lZGlfcG9sbAorCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJLy9zYXZlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgc3RhdGUKKwlpcnFzdGF0dXMgPSByZWFkbChkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwkvL3JlYWQgaW50ZXJydXB0IHR5cGUKKwlpcnF0eXBlID0gcmVhZGwoZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JU1IpOworCisJLy9kaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHQKKwl3cml0ZWwoMCwgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JRVIpOworCisJLy9jbGVhciBpbnRlcnJ1cHQKKwl3cml0ZWwoaXJxdHlwZSwgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JU1IpOworCisJLy9kbyBzb21ldGhpbmdzCisJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCB0eXBlICVkXG4iLCBpcnF0eXBlKTsKKworCXN3aXRjaCAoaXJxdHlwZSkgeworCWNhc2UgSVJRX1JQUzE6CQkvLyBlbmRfb2Zfc2NhbiBvY2N1cnMKKworCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogUlBTMSBpcnEgZGV0ZWN0ZWRcbiIpOworCisJCS8vIG1hbmFnZSBhaSBzdWJkZXZpY2UKKwkJcyA9IGRldi0+c3ViZGV2aWNlczsKKwkJY21kID0gJihzLT5hc3luYy0+Y21kKTsKKworCQkvLyBJbml0IHB0ciB0byBETUEgYnVmZmVyIHRoYXQgaG9sZHMgbmV3IEFEQyBkYXRhLiAgV2Ugc2tpcCB0aGUKKwkJLy8gZmlyc3QgdWludDE2X3QgaW4gdGhlIGJ1ZmZlciBiZWNhdXNlIGl0IGNvbnRhaW5zIGp1bmsgZGF0YSBmcm9tCisJCS8vIHRoZSBmaW5hbCBBREMgb2YgdGhlIHByZXZpb3VzIHBvbGwgbGlzdCBzY2FuLgorCQlyZWFkYWRkciA9IChpbnQzMl90ICopIGRldnByaXYtPkFOQUJ1Zi5Mb2dpY2FsQmFzZSArIDE7CisKKwkJLy8gZ2V0IHRoZSBkYXRhIGFuZCBoYW5kIGl0IG92ZXIgdG8gY29tZWRpCisJCWZvciAoaSA9IDA7IGkgPCAocy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4pOyBpKyspIHsKKwkJCS8vIENvbnZlcnQgQURDIGRhdGEgdG8gMTYtYml0IGludGVnZXIgdmFsdWVzIGFuZCBjb3B5IHRvIGFwcGxpY2F0aW9uCisJCQkvLyBidWZmZXIuCisJCQl0ZW1wZGF0YSA9IHM2MjZfYWlfcmVnX3RvX3VpbnQoKGludCkqcmVhZGFkZHIpOworCQkJcmVhZGFkZHIrKzsKKworCQkJLy9wdXQgZGF0YSBpbnRvIHJlYWQgYnVmZmVyCisJCQkvLyBjb21lZGlfYnVmX3B1dChzLT5hc3luYywgdGVtcGRhdGEpOworCQkJaWYgKGNmY193cml0ZV90b19idWZmZXIocywgdGVtcGRhdGEpID09IDApCisJCQkJcHJpbnRrKCJzNjI2X2lycV9oYW5kbGVyOiBjZmNfd3JpdGVfdG9fYnVmZmVyIGVycm9yIVxuIik7CisKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBhaSBjaGFubmVsICVkIGFjcXVpcmVkOiAlZFxuIiwKKwkJCQlpLCB0ZW1wZGF0YSk7CisJCX0KKworCQkvL2VuZCBvZiBzY2FuIG9jY3VycworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT1M7CisKKwkJaWYgKCEoZGV2cHJpdi0+YWlfY29udGlub3VzKSkKKwkJCWRldnByaXYtPmFpX3NhbXBsZV9jb3VudC0tOworCQlpZiAoZGV2cHJpdi0+YWlfc2FtcGxlX2NvdW50IDw9IDApIHsKKwkJCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCQkJLy8gU3RvcCBSUFMgcHJvZ3JhbS4KKwkJCU1DX0RJU0FCTEUoUF9NQzEsIE1DMV9FUlBTMSk7CisKKwkJCS8vc2VuZCBlbmQgb2YgYWNxdWlzaXRpb24KKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKworCQkJLy9kaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHQKKwkJCWlycXN0YXR1cyA9IDA7CisJCX0KKworCQlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgJiYgY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCkgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGVuYWJsZSBpbnRlcnJ1cHQgb24gZGlvIGNoYW5uZWwgJWRcbiIsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCisJCQlzNjI2X2Rpb19zZXRfaXJxKGRldiwgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFeHRlcm5hbCB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisJCX0KKwkJLy8gdGVsbCBjb21lZGkgdGhhdCBkYXRhIGlzIHRoZXJlCisJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBldmVudHMgJWRcbiIsIHMtPmFzeW5jLT5ldmVudHMpOworCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfR1BJTzM6CS8vY2hlY2sgZGlvIGFuZCBjb250ZXIgaW50ZXJydXB0CisKKwkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEdQSU8zIGlycSBkZXRlY3RlZFxuIik7CisKKwkJLy8gbWFuYWdlIGFpIHN1YmRldmljZQorCQlzID0gZGV2LT5zdWJkZXZpY2VzOworCQljbWQgPSAmKHMtPmFzeW5jLT5jbWQpOworCisJCS8vczYyNl9kaW9fY2xlYXJfaXJxKGRldik7CisKKwkJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgUzYyNl9ESU9fQkFOS1M7IGdyb3VwKyspIHsKKwkJCWlycWJpdCA9IDA7CisJCQkvL3JlYWQgaW50ZXJydXB0IHR5cGUKKwkJCWlycWJpdCA9IERFQklyZWFkKGRldiwKKwkJCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQkJCWdyb3VwKS0+cHJpdmF0ZSktPlJEQ2FwRmxnKTsKKworCQkJLy9jaGVjayBpZiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGZyb20gZGlvIGNoYW5uZWxzCisJCQlpZiAoaXJxYml0KSB7CisJCQkJczYyNl9kaW9fcmVzZXRfaXJxKGRldiwgZ3JvdXAsIGlycWJpdCk7CisJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGNoZWNrIGludGVycnVwdCBvbiBkaW8gZ3JvdXAgJWQgJWRcbiIsIGdyb3VwLCBpKTsKKwkJCQlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJCQkJLy9jaGVjayBpZiBpbnRlcnJ1cHQgaXMgYW4gYWkgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlcgorCQkJCQlpZiAoKGlycWJpdCA+PiAoY21kLT5zdGFydF9hcmcgLQorCQkJCQkJCQkoMTYgKiBncm91cCkpKQorCQkJCQkJPT0gMQorCQkJCQkJJiYgY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpIHsKKwkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFZGdlIGNhcHR1cmUgaW50ZXJydXB0IHJlY2lldmVkIGZyb20gY2hhbm5lbCAlZFxuIiwgY21kLT5zdGFydF9hcmcpOworCisJCQkJCQkvLyBTdGFydCBleGVjdXRpbmcgdGhlIFJQUyBwcm9ncmFtLgorCQkJCQkJTUNfRU5BQkxFKFBfTUMxLCBNQzFfRVJQUzEpOworCisJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogYXF1aXNpdGlvbiBzdGFydCB0cmlnZ2VyZWQhISFcbiIpOworCisJCQkJCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PQorCQkJCQkJCVRSSUdfRVhUKSB7CisJCQkJCQkJREVCVUcoInM2MjZfYWlfY21kOiBlbmFibGUgaW50ZXJydXB0IG9uIGRpbyBjaGFubmVsICVkXG4iLCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKworCQkJCQkJCXM2MjZfZGlvX3NldF9pcnEoZGV2LAorCQkJCQkJCQljbWQtPgorCQkJCQkJCQlzY2FuX2JlZ2luX2FyZyk7CisKKwkJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogRXh0ZXJuYWwgc2NhbiB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKChpcnFiaXQgPj4gKGNtZC0+c2Nhbl9iZWdpbl9hcmcgLQorCQkJCQkJCQkoMTYgKiBncm91cCkpKQorCQkJCQkJPT0gMQorCQkJCQkJJiYgY21kLT5zY2FuX2JlZ2luX3NyYyA9PQorCQkJCQkJVFJJR19FWFQpIHsKKwkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFZGdlIGNhcHR1cmUgaW50ZXJydXB0IHJlY2lldmVkIGZyb20gY2hhbm5lbCAlZFxuIiwgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisKKwkJCQkJCS8vIFRyaWdnZXIgQURDIHNjYW4gbG9vcCBzdGFydCBieSBzZXR0aW5nIFJQUyBTaWduYWwgMC4KKwkJCQkJCU1DX0VOQUJMRShQX01DMiwgTUMyX0FEQ19SUFMpOworCisJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogc2NhbiB0cmlnZ2VyZWQhISEgJWRcbiIsIGRldnByaXYtPmFpX3NhbXBsZV9jb3VudCk7CisJCQkJCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PQorCQkJCQkJCVRSSUdfRVhUKSB7CisKKwkJCQkJCQlERUJVRygiczYyNl9haV9jbWQ6IGVuYWJsZSBpbnRlcnJ1cHQgb24gZGlvIGNoYW5uZWwgJWQgZ3JvdXAgJWRcbiIsIGNtZC0+Y29udmVydF9hcmcgLSAoMTYgKiBncm91cCksIGdyb3VwKTsKKworCQkJCQkJCWRldnByaXYtPgorCQkJCQkJCQlhaV9jb252ZXJ0X2NvdW50CisJCQkJCQkJCT0KKwkJCQkJCQkJY21kLT4KKwkJCQkJCQkJY2hhbmxpc3RfbGVuOworCisJCQkJCQkJczYyNl9kaW9fc2V0X2lycShkZXYsCisJCQkJCQkJCWNtZC0+CisJCQkJCQkJCWNvbnZlcnRfYXJnKTsKKworCQkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFeHRlcm5hbCBjb252ZXJ0IHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0KKwkJCQkJCQlUUklHX1RJTUVSKSB7CisJCQkJCQkJayA9ICZlbmNwcml2WzVdOworCQkJCQkJCWRldnByaXYtPgorCQkJCQkJCQlhaV9jb252ZXJ0X2NvdW50CisJCQkJCQkJCT0KKwkJCQkJCQkJY21kLT4KKwkJCQkJCQkJY2hhbmxpc3RfbGVuOworCQkJCQkJCWstPlNldEVuYWJsZShkZXYsIGssCisJCQkJCQkJCUNMS0VOQUJfQUxXQVlTKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoKGlycWJpdCA+PiAoY21kLT5jb252ZXJ0X2FyZyAtCisJCQkJCQkJCSgxNiAqIGdyb3VwKSkpCisJCQkJCQk9PSAxCisJCQkJCQkmJiBjbWQtPmNvbnZlcnRfc3JjID09CisJCQkJCQlUUklHX0VYVCkgeworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEVkZ2UgY2FwdHVyZSBpbnRlcnJ1cHQgcmVjaWV2ZWQgZnJvbSBjaGFubmVsICVkXG4iLCBjbWQtPmNvbnZlcnRfYXJnKTsKKworCQkJCQkJLy8gVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0IGJ5IHNldHRpbmcgUlBTIFNpZ25hbCAwLgorCQkJCQkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfQURDX1JQUyk7CisKKwkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBhZGMgY29udmVydCB0cmlnZ2VyZWQhISFcbiIpOworCisJCQkJCQlkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50LS07CisKKwkJCQkJCWlmIChkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50ID4KKwkJCQkJCQkwKSB7CisKKwkJCQkJCQlERUJVRygiczYyNl9haV9jbWQ6IGVuYWJsZSBpbnRlcnJ1cHQgb24gZGlvIGNoYW5uZWwgJWQgZ3JvdXAgJWRcbiIsIGNtZC0+Y29udmVydF9hcmcgLSAoMTYgKiBncm91cCksIGdyb3VwKTsKKworCQkJCQkJCXM2MjZfZGlvX3NldF9pcnEoZGV2LAorCQkJCQkJCQljbWQtPgorCQkJCQkJCQljb252ZXJ0X2FyZyk7CisKKwkJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogRXh0ZXJuYWwgdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy9yZWFkIGludGVycnVwdCB0eXBlCisJCWlycWJpdCA9IERFQklyZWFkKGRldiwgTFBfUkRNSVNDMik7CisKKwkJLy9jaGVjayBpbnRlcnJ1cHQgb24gY291bnRlcnMKKwkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGNoZWNrIGNvdW50ZXJzIGludGVycnVwdCAlZFxuIiwKKwkJCWlycWJpdCk7CisKKwkJaWYgKGlycWJpdCAmIElSUV9DT0lOVDFBKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IG9uIGNvdW50ZXIgMUEgb3ZlcmZsb3dcbiIpOworCQkJayA9ICZlbmNwcml2WzBdOworCisJCQkvL2NsZWFyIGludGVycnVwdCBjYXB0dXJlIGZsYWcKKwkJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKwkJfQorCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UMkEpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAyQSBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbMV07CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCQl9CisJCWlmIChpcnFiaXQgJiBJUlFfQ09JTlQzQSkgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCBvbiBjb3VudGVyIDNBIG92ZXJmbG93XG4iKTsKKwkJCWsgPSAmZW5jcHJpdlsyXTsKKworCQkJLy9jbGVhciBpbnRlcnJ1cHQgY2FwdHVyZSBmbGFnCisJCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisJCX0KKwkJaWYgKGlycWJpdCAmIElSUV9DT0lOVDFCKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IG9uIGNvdW50ZXIgMUIgb3ZlcmZsb3dcbiIpOworCQkJayA9ICZlbmNwcml2WzNdOworCisJCQkvL2NsZWFyIGludGVycnVwdCBjYXB0dXJlIGZsYWcKKwkJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKwkJfQorCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UMkIpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAyQiBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbNF07CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCisJCQlpZiAoZGV2cHJpdi0+YWlfY29udmVydF9jb3VudCA+IDApIHsKKwkJCQlkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50LS07CisJCQkJaWYgKGRldnByaXYtPmFpX2NvbnZlcnRfY291bnQgPT0gMCkKKwkJCQkJay0+U2V0RW5hYmxlKGRldiwgaywgQ0xLRU5BQl9JTkRFWCk7CisKKwkJCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBjb252ZXIgdGltZXIgdHJpZ2dlciEhISAlZFxuIiwgZGV2cHJpdi0+YWlfY29udmVydF9jb3VudCk7CisKKwkJCQkJLy8gVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0IGJ5IHNldHRpbmcgUlBTIFNpZ25hbCAwLgorCQkJCQlNQ19FTkFCTEUoUF9NQzIsIE1DMl9BRENfUlBTKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGlycWJpdCAmIElSUV9DT0lOVDNCKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IG9uIGNvdW50ZXIgM0Igb3ZlcmZsb3dcbiIpOworCQkJayA9ICZlbmNwcml2WzVdOworCisJCQkvL2NsZWFyIGludGVycnVwdCBjYXB0dXJlIGZsYWcKKwkJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBzY2FuIHRpbWVyIHRyaWdnZXIhISFcbiIpOworCisJCQkJLy8gVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0IGJ5IHNldHRpbmcgUlBTIFNpZ25hbCAwLgorCQkJCU1DX0VOQUJMRShQX01DMiwgTUMyX0FEQ19SUFMpOworCQkJfQorCisJCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGNvbnZlcnQgdGltZXIgdHJpZ2dlciBpcyBzZXRcbiIpOworCQkJCWsgPSAmZW5jcHJpdls0XTsKKwkJCQlkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50ID0gY21kLT5jaGFubGlzdF9sZW47CisJCQkJay0+U2V0RW5hYmxlKGRldiwgaywgQ0xLRU5BQl9BTFdBWVMpOworCQkJfQorCQl9CisJfQorCisJLy9lbmFibGUgaW50ZXJydXB0CisJd3JpdGVsKGlycXN0YXR1cywgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JRVIpOworCisJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGV4aXQgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS5cbiIpOworCisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpZiAoZGV2cHJpdikgeworCQkvL3N0b3AgYWlfY29tbWFuZAorCQlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CisKKwkJaWYgKGRldnByaXYtPmJhc2VfYWRkcikgeworCQkJLy9pbnRlcnJ1cHQgbWFzaworCQkJV1I3MTQ2KFBfSUVSLCAwKTsJLy8gRGlzYWJsZSBtYXN0ZXIgaW50ZXJydXB0LgorCQkJV1I3MTQ2KFBfSVNSLCBJUlFfR1BJTzMgfCBJUlFfUlBTMSk7CS8vIENsZWFyIGJvYXJkJ3MgSVJRIHN0YXR1cyBmbGFnLgorCisJCQkvLyBEaXNhYmxlIHRoZSB3YXRjaGRvZyB0aW1lciBhbmQgYmF0dGVyeSBjaGFyZ2VyLgorCQkJV3JpdGVNSVNDMihkZXYsIDApOworCisJCQkvLyBDbG9zZSBhbGwgaW50ZXJmYWNlcyBvbiA3MTQ2IGRldmljZS4KKwkJCVdSNzE0NihQX01DMSwgTUMxX1NIVVRET1dOKTsKKwkJCVdSNzE0NihQX0FDT04xLCBBQ09OMV9CQVNFKTsKKworCQkJQ2xvc2VETUFCKGRldiwgJmRldnByaXYtPlJQU0J1ZiwgRE1BQlVGX1NJWkUpOworCQkJQ2xvc2VETUFCKGRldiwgJmRldnByaXYtPkFOQUJ1ZiwgRE1BQlVGX1NJWkUpOworCQl9CisKKwkJaWYgKGRldi0+aXJxKSB7CisJCQljb21lZGlfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCX0KKworCQlpZiAoZGV2cHJpdi0+YmFzZV9hZGRyKSB7CisJCQlpb3VubWFwKGRldnByaXYtPmJhc2VfYWRkcik7CisJCX0KKworCQlpZiAoZGV2cHJpdi0+cGRldikgeworCQkJaWYgKGRldnByaXYtPmdvdF9yZWdpb25zKSB7CisJCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBkZXYpOworCQkJfQorCQkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGRldik7CisJCX0KKwl9CisKKwlERUJVRygiczYyNl9kZXRhY2g6IFM2MjYgZGV0YWNoZWQhXG4iKTsKKworCXJldHVybiAwOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbnMgYnVpbGQgdGhlIFJQUyBwcm9ncmFtIGZvciBoYXJkd2FyZSBkcml2ZW4gYWNxdWlzdGlvbgorICovCit2b2lkIFJlc2V0QURDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQ4X3QgKiBwcGwpCit7CisJcmVnaXN0ZXIgdWludDMyX3QgKnBSUFM7CisJdWludDMyX3QgSm1wQWRyczsKKwl1aW50MTZfdCBpOworCXVpbnQxNl90IG47CisJdWludDMyX3QgTG9jYWxQUEw7CisJY29tZWRpX2NtZCAqY21kID0gJihkZXYtPnN1YmRldmljZXMtPmFzeW5jLT5jbWQpOworCisJLy8gU3RvcCBSUFMgcHJvZ3JhbSBpbiBjYXNlIGl0IGlzIGN1cnJlbnRseSBydW5uaW5nLgorCU1DX0RJU0FCTEUoUF9NQzEsIE1DMV9FUlBTMSk7CisKKwkvLyBTZXQgc3RhcnRpbmcgbG9naWNhbCBhZGRyZXNzIHRvIHdyaXRlIFJQUyBjb21tYW5kcy4KKwlwUlBTID0gKHVpbnQzMl90ICopIGRldnByaXYtPlJQU0J1Zi5Mb2dpY2FsQmFzZTsKKworCS8vIEluaXRpYWxpemUgUlBTIGluc3RydWN0aW9uIHBvaW50ZXIuCisJV1I3MTQ2KFBfUlBTQUREUjEsICh1aW50MzJfdCkgZGV2cHJpdi0+UlBTQnVmLlBoeXNpY2FsQmFzZSk7CisKKwkvLyBDb25zdHJ1Y3QgUlBTIHByb2dyYW0gaW4gUlBTQnVmIERNQSBidWZmZXIKKworCWlmIChjbWQgIT0gTlVMTCAmJiBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XKSB7CisJCURFQlVHKCJSZXNldEFEQzogc2Nhbl9iZWdpbiBwYXVzZSBpbnNlcnRlZFxuIik7CisJCS8vIFdhaXQgZm9yIFN0YXJ0IHRyaWdnZXIuCisJCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfU0lHQURDOworCQkqcFJQUysrID0gUlBTX0NMUlNJR05BTCB8IFJQU19TSUdBREM7CisJfQorCS8vIFNBQTcxNDYgQlVHIFdPUktBUk9VTkQgRG8gYSBkdW1teSBERUJJIFdyaXRlLiAgVGhpcyBpcyBuZWNlc3NhcnkKKwkvLyBiZWNhdXNlIHRoZSBmaXJzdCBSUFMgREVCSSBXcml0ZSBmb2xsb3dpbmcgYSBub24tUlBTIERFQkkgd3JpdGUKKwkvLyBzZWVtcyB0byBhbHdheXMgZmFpbC4gIElmIHdlIGRvbid0IGRvIHRoaXMgZHVtbXkgd3JpdGUsIHRoZSBBREMKKwkvLyBnYWluIG1pZ2h0IG5vdCBiZSBzZXQgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciB0aGUgZmlyc3Qgc2xvdCBpbgorCS8vIHRoZSBwb2xsIGxpc3Q7IHRoZSBBREMgZ2FpbiB3b3VsZCBpbnN0ZWFkIHJlbWFpbiB1bmNoYW5nZWQgZnJvbQorCS8vIHRoZSBwcmV2aW91c2x5IHByb2dyYW1tZWQgdmFsdWUuCisJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0RFQklDTUQgPj4gMik7CS8vIFdyaXRlIERFQkkgV3JpdGUgY29tbWFuZAorCS8vIGFuZCBhZGRyZXNzIHRvIHNoYWRvdyBSQU0uCisJKnBSUFMrKyA9IERFQklfQ01EX1dSV09SRCB8IExQX0dTRUw7CisJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0RFQklBRCA+PiAyKTsJLy8gV3JpdGUgREVCSSBpbW1lZGlhdGUgZGF0YQorCS8vIHRvIHNoYWRvdyBSQU06CisJKnBSUFMrKyA9IEdTRUxfQklQT0xBUjVWOwkvLyBhcmJpdHJhcnkgaW1tZWRpYXRlIGRhdGEKKwkvLyB2YWx1ZS4KKwkqcFJQUysrID0gUlBTX0NMUlNJR05BTCB8IFJQU19ERUJJOwkvLyBSZXNldCAic2hhZG93IFJBTQorCS8vIHVwbG9hZGVkIiBmbGFnLgorCSpwUlBTKysgPSBSUFNfVVBMT0FEIHwgUlBTX0RFQkk7CS8vIEludm9rZSBzaGFkb3cgUkFNIHVwbG9hZC4KKwkqcFJQUysrID0gUlBTX1BBVVNFIHwgUlBTX0RFQkk7CS8vIFdhaXQgZm9yIHNoYWRvdyB1cGxvYWQgdG8gZmluaXNoLgorCisJLy8gRGlnaXRpemUgYWxsIHNsb3RzIGluIHRoZSBwb2xsIGxpc3QuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYQorCS8vIGZvciBsb29wIHRvIGxpbWl0IHRoZSBzbG90IGNvdW50IHRvIDE2IGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uCisJLy8gZm9yZ290IHRvIHNldCB0aGUgRU9QTCBmbGFnIGluIHRoZSBmaW5hbCBzbG90LgorCWZvciAoZGV2cHJpdi0+QWRjSXRlbXMgPSAwOyBkZXZwcml2LT5BZGNJdGVtcyA8IDE2OyBkZXZwcml2LT5BZGNJdGVtcysrKSB7CisJCS8vIENvbnZlcnQgYXBwbGljYXRpb24ncyBwb2xsIGxpc3QgaXRlbSB0byBwcml2YXRlIGJvYXJkIGNsYXNzCisJCS8vIGZvcm1hdC4gIEVhY2ggYXBwIHBvbGwgbGlzdCBpdGVtIGlzIGFuIHVpbnQ4X3Qgd2l0aCBmb3JtCisJCS8vIChFT1BMLHgseCxSQU5HRSxDSEFOPDM6MD4pLCB3aGVyZSBSQU5HRSBjb2RlIGluZGljYXRlcyAwID0KKwkJLy8gKy0xMFYsIDEgPSArLTVWLCBhbmQgRU9QTCA9IEVuZCBvZiBQb2xsIExpc3QgbWFya2VyLgorCQlMb2NhbFBQTCA9CisJCQkoKnBwbCA8PCA4KSB8ICgqcHBsICYgMHgxMCA/IEdTRUxfQklQT0xBUjVWIDoKKwkJCUdTRUxfQklQT0xBUjEwVik7CisKKwkJLy8gU3dpdGNoIEFEQyBhbmFsb2cgZ2Fpbi4KKwkJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0RFQklDTUQgPj4gMik7CS8vIFdyaXRlIERFQkkgY29tbWFuZAorCQkvLyBhbmQgYWRkcmVzcyB0bworCQkvLyBzaGFkb3cgUkFNLgorCQkqcFJQUysrID0gREVCSV9DTURfV1JXT1JEIHwgTFBfR1NFTDsKKwkJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0RFQklBRCA+PiAyKTsJLy8gV3JpdGUgREVCSQorCQkvLyBpbW1lZGlhdGUgZGF0YSB0bworCQkvLyBzaGFkb3cgUkFNLgorCQkqcFJQUysrID0gTG9jYWxQUEw7CisJCSpwUlBTKysgPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX0RFQkk7CS8vIFJlc2V0ICJzaGFkb3cgUkFNIHVwbG9hZGVkIgorCQkvLyBmbGFnLgorCQkqcFJQUysrID0gUlBTX1VQTE9BRCB8IFJQU19ERUJJOwkvLyBJbnZva2Ugc2hhZG93IFJBTSB1cGxvYWQuCisJCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfREVCSTsJLy8gV2FpdCBmb3Igc2hhZG93IHVwbG9hZCB0bworCQkvLyBmaW5pc2guCisKKwkJLy8gU2VsZWN0IEFEQyBhbmFsb2cgaW5wdXQgY2hhbm5lbC4KKwkJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0RFQklDTUQgPj4gMik7CS8vIFdyaXRlIERFQkkgY29tbWFuZAorCQkvLyBhbmQgYWRkcmVzcyB0bworCQkvLyBzaGFkb3cgUkFNLgorCQkqcFJQUysrID0gREVCSV9DTURfV1JXT1JEIHwgTFBfSVNFTDsKKwkJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0RFQklBRCA+PiAyKTsJLy8gV3JpdGUgREVCSQorCQkvLyBpbW1lZGlhdGUgZGF0YSB0bworCQkvLyBzaGFkb3cgUkFNLgorCQkqcFJQUysrID0gTG9jYWxQUEw7CisJCSpwUlBTKysgPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX0RFQkk7CS8vIFJlc2V0ICJzaGFkb3cgUkFNIHVwbG9hZGVkIgorCQkvLyBmbGFnLgorCQkqcFJQUysrID0gUlBTX1VQTE9BRCB8IFJQU19ERUJJOwkvLyBJbnZva2Ugc2hhZG93IFJBTSB1cGxvYWQuCisJCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfREVCSTsJLy8gV2FpdCBmb3Igc2hhZG93IHVwbG9hZCB0bworCQkvLyBmaW5pc2guCisKKwkJLy8gRGVsYXkgYXQgbGVhc3QgMTAgbWljcm9zZWNvbmRzIGZvciBhbmFsb2cgaW5wdXQgc2V0dGxpbmcuCisJCS8vIEluc3RlYWQgb2YgcGFkZGluZyB3aXRoIE5PUHMsIHdlIHVzZSBSUFNfSlVNUCBpbnN0cnVjdGlvbnMKKwkJLy8gaGVyZTsgdGhpcyBhbGxvd3MgdXMgdG8gcHJvZHVjZSBhIGxvbmdlciBkZWxheSB0aGFuIGlzCisJCS8vIHBvc3NpYmxlIHdpdGggTk9QcyBiZWNhdXNlIGVhY2ggUlBTX0pVTVAgZmx1c2hlcyB0aGUgUlBTJworCQkvLyBpbnN0cnVjdGlvbiBwcmVmZXRjaCBwaXBlbGluZS4KKwkJSm1wQWRycyA9CisJCQkodWludDMyX3QpIGRldnByaXYtPlJQU0J1Zi5QaHlzaWNhbEJhc2UgKworCQkJKHVpbnQzMl90KSAoKHVuc2lnbmVkIGxvbmcpcFJQUyAtCisJCQkodW5zaWduZWQgbG9uZylkZXZwcml2LT5SUFNCdWYuTG9naWNhbEJhc2UpOworCQlmb3IgKGkgPSAwOyBpIDwgKDEwICogUlBTQ0xLX1BFUl9VUyAvIDIpOyBpKyspIHsKKwkJCUptcEFkcnMgKz0gODsJLy8gUmVwZWF0IHRvIGltcGxlbWVudCB0aW1lIGRlbGF5OgorCQkJKnBSUFMrKyA9IFJQU19KVU1QOwkvLyBKdW1wIHRvIG5leHQgUlBTIGluc3RydWN0aW9uLgorCQkJKnBSUFMrKyA9IEptcEFkcnM7CisJCX0KKworCQlpZiAoY21kICE9IE5VTEwgJiYgY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX05PVykgeworCQkJREVCVUcoIlJlc2V0QURDOiBjb252ZXJ0IHBhdXNlIGluc2VydGVkXG4iKTsKKwkJCS8vIFdhaXQgZm9yIFN0YXJ0IHRyaWdnZXIuCisJCQkqcFJQUysrID0gUlBTX1BBVVNFIHwgUlBTX1NJR0FEQzsKKwkJCSpwUlBTKysgPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX1NJR0FEQzsKKwkJfQorCQkvLyBTdGFydCBBREMgYnkgcHVsc2luZyBHUElPMS4KKwkJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0dQSU8gPj4gMik7CS8vIEJlZ2luIEFEQyBTdGFydCBwdWxzZS4KKwkJKnBSUFMrKyA9IEdQSU9fQkFTRSB8IEdQSU8xX0xPOworCQkqcFJQUysrID0gUlBTX05PUDsKKwkJLy8gVkVSU0lPTiAyLjAzIENIQU5HRTogU1RSRVRDSCBPVVQgQURDIFNUQVJUIFBVTFNFLgorCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfR1BJTyA+PiAyKTsJLy8gRW5kIEFEQyBTdGFydCBwdWxzZS4KKwkJKnBSUFMrKyA9IEdQSU9fQkFTRSB8IEdQSU8xX0hJOworCisJCS8vIFdhaXQgZm9yIEFEQyB0byBjb21wbGV0ZSAoR1BJTzIgaXMgYXNzZXJ0ZWQgaGlnaCB3aGVuIEFEQyBub3QKKwkJLy8gYnVzeSkgYW5kIGZvciBkYXRhIGZyb20gcHJldmlvdXMgY29udmVyc2lvbiB0byBzaGlmdCBpbnRvIEZCCisJCS8vIEJVRkZFUiAxIHJlZ2lzdGVyLgorCQkqcFJQUysrID0gUlBTX1BBVVNFIHwgUlBTX0dQSU8yOwkvLyBXYWl0IGZvciBBREMgZG9uZS4KKworCQkvLyBUcmFuc2ZlciBBREMgZGF0YSBmcm9tIEZCIEJVRkZFUiAxIHJlZ2lzdGVyIHRvIERNQSBidWZmZXIuCisJCSpwUlBTKysgPSBSUFNfU1RSRUcgfCAoQlVHRklYX1NUUkVHKFBfRkJfQlVGRkVSMSkgPj4gMik7CisJCSpwUlBTKysgPQorCQkJKHVpbnQzMl90KSBkZXZwcml2LT5BTkFCdWYuUGh5c2ljYWxCYXNlICsKKwkJCShkZXZwcml2LT5BZGNJdGVtcyA8PCAyKTsKKworCQkvLyBJZiB0aGlzIHNsb3QncyBFbmRPZlBvbGxMaXN0IGZsYWcgaXMgc2V0LCBhbGwgY2hhbm5lbHMgaGF2ZQorCQkvLyBub3cgYmVlbiBwcm9jZXNzZWQuCisJCWlmICgqcHBsKysgJiBFT1BMKSB7CisJCQlkZXZwcml2LT5BZGNJdGVtcysrOwkvLyBBZGp1c3QgcG9sbCBsaXN0IGl0ZW0gY291bnQuCisJCQlicmVhazsJLy8gRXhpdCBwb2xsIGxpc3QgcHJvY2Vzc2luZyBsb29wLgorCQl9CisJfQorCURFQlVHKCJSZXNldEFEQzogQURDIGl0ZW1zICVkIFxuIiwgZGV2cHJpdi0+QWRjSXRlbXMpOworCisJLy8gVkVSU0lPTiAyLjAxIENIQU5HRTogREVMQVkgQ0hBTkdFRCBGUk9NIDI1ME5TIHRvIDJVUy4gIEFsbG93IHRoZQorCS8vIEFEQyB0byBzdGFiaWxpemUgZm9yIDIgbWljcm9zZWNvbmRzIGJlZm9yZSBzdGFydGluZyB0aGUgZmluYWwKKwkvLyAoZHVtbXkpIGNvbnZlcnNpb24uICBUaGlzIGRlbGF5IGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBzdWZmaWNpZW50CisJLy8gdGltZSBiZXR3ZWVuIGxhc3QgY29udmVyc2lvbiBmaW5pc2hlZCBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBkdW1teQorCS8vIGNvbnZlcnNpb24uICBXaXRob3V0IHRoaXMgZGVsYXksIHRoZSBsYXN0IGNvbnZlcnNpb24ncyBkYXRhIHZhbHVlCisJLy8gaXMgc29tZXRpbWVzIHNldCB0byB0aGUgcHJldmlvdXMgY29udmVyc2lvbidzIGRhdGEgdmFsdWUuCisJZm9yIChuID0gMDsgbiA8ICgyICogUlBTQ0xLX1BFUl9VUyk7IG4rKykKKwkJKnBSUFMrKyA9IFJQU19OT1A7CisKKwkvLyBTdGFydCBhIGR1bW15IGNvbnZlcnNpb24gdG8gY2F1c2UgdGhlIGRhdGEgZnJvbSB0aGUgbGFzdAorCS8vIGNvbnZlcnNpb24gb2YgaW50ZXJlc3QgdG8gYmUgc2hpZnRlZCBpbi4KKwkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfR1BJTyA+PiAyKTsJLy8gQmVnaW4gQURDIFN0YXJ0IHB1bHNlLgorCSpwUlBTKysgPSBHUElPX0JBU0UgfCBHUElPMV9MTzsKKwkqcFJQUysrID0gUlBTX05PUDsKKwkvLyBWRVJTSU9OIDIuMDMgQ0hBTkdFOiBTVFJFVENIIE9VVCBBREMgU1RBUlQgUFVMU0UuCisJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0dQSU8gPj4gMik7CS8vIEVuZCBBREMgU3RhcnQgcHVsc2UuCisJKnBSUFMrKyA9IEdQSU9fQkFTRSB8IEdQSU8xX0hJOworCisJLy8gV2FpdCBmb3IgdGhlIGRhdGEgZnJvbSB0aGUgbGFzdCBjb252ZXJzaW9uIG9mIGludGVyZXN0IHRvIGFycml2ZQorCS8vIGluIEZCIEJVRkZFUiAxIHJlZ2lzdGVyLgorCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfR1BJTzI7CS8vIFdhaXQgZm9yIEFEQyBkb25lLgorCisJLy8gVHJhbnNmZXIgZmluYWwgQURDIGRhdGEgZnJvbSBGQiBCVUZGRVIgMSByZWdpc3RlciB0byBETUEgYnVmZmVyLgorCSpwUlBTKysgPSBSUFNfU1RSRUcgfCAoQlVHRklYX1NUUkVHKFBfRkJfQlVGRkVSMSkgPj4gMik7CS8vCisJKnBSUFMrKyA9CisJCSh1aW50MzJfdCkgZGV2cHJpdi0+QU5BQnVmLlBoeXNpY2FsQmFzZSArCisJCShkZXZwcml2LT5BZGNJdGVtcyA8PCAyKTsKKworCS8vIEluZGljYXRlIEFEQyBzY2FuIGxvb3AgaXMgZmluaXNoZWQuCisJLy8gKnBSUFMrKz0gUlBTX0NMUlNJR05BTCB8IFJQU19TSUdBREMgOyAgLy8gU2lnbmFsIFJlYWRBREMoKSB0aGF0IHNjYW4gaXMgZG9uZS4KKworCS8vaW52b2tlIGludGVycnVwdAorCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZyA9PSAxKSB7CisJCURFQlVHKCJSZXNldEFEQzogaW5zZXJ0IGlycSBpbiBBREMgUlBTIHRhc2tcbiIpOworCQkqcFJQUysrID0gUlBTX0lSUTsKKwl9CisJLy8gUmVzdGFydCBSUFMgcHJvZ3JhbSBhdCBpdHMgYmVnaW5uaW5nLgorCSpwUlBTKysgPSBSUFNfSlVNUDsJLy8gQnJhbmNoIHRvIHN0YXJ0IG9mIFJQUyBwcm9ncmFtLgorCSpwUlBTKysgPSAodWludDMyX3QpIGRldnByaXYtPlJQU0J1Zi5QaHlzaWNhbEJhc2U7CisKKwkvLyBFbmQgb2YgUlBTIHByb2dyYW0gYnVpbGQKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30KKworLyogVE8gQ09NUExFVEUsIElGIE5FQ0VTU0FSWSAqLworc3RhdGljIGludCBzNjI2X2FpX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIHN0YXRpYyBpbnQgczYyNl9haV9yaW5zbihjb21lZGlfZGV2aWNlICpkZXYsY29tZWRpX3N1YmRldmljZSAqcyxjb21lZGlfaW5zbiAqaW5zbixsc2FtcGxfdCAqZGF0YSkgKi8KKy8qIHsgKi8KKy8qICAgcmVnaXN0ZXIgdWludDhfdAlpOyAqLworLyogICByZWdpc3RlciBpbnQzMl90CSpyZWFkYWRkcjsgKi8KKworLyogICBERUJVRygiYXM2MjZfYWlfcmluc246IGFpX3JpbnNuIGVudGVyIFxuIik7ICAqLworCisvKiAgIC8vIFRyaWdnZXIgQURDIHNjYW4gbG9vcCBzdGFydCBieSBzZXR0aW5nIFJQUyBTaWduYWwgMC4gKi8KKy8qICAgTUNfRU5BQkxFKCBQX01DMiwgTUMyX0FEQ19SUFMgKTsgKi8KKworLyogICAvLyBXYWl0IHVudGlsIEFEQyBzY2FuIGxvb3AgaXMgZmluaXNoZWQgKFJQUyBTaWduYWwgMCByZXNldCkuICovCisvKiAgIHdoaWxlICggTUNfVEVTVCggUF9NQzIsIE1DMl9BRENfUlBTICkgKTsgKi8KKworLyogICAvLyBJbml0IHB0ciB0byBETUEgYnVmZmVyIHRoYXQgaG9sZHMgbmV3IEFEQyBkYXRhLiAgV2Ugc2tpcCB0aGUgKi8KKy8qICAgLy8gZmlyc3QgdWludDE2X3QgaW4gdGhlIGJ1ZmZlciBiZWNhdXNlIGl0IGNvbnRhaW5zIGp1bmsgZGF0YSBmcm9tICovCisvKiAgIC8vIHRoZSBmaW5hbCBBREMgb2YgdGhlIHByZXZpb3VzIHBvbGwgbGlzdCBzY2FuLiAqLworLyogICByZWFkYWRkciA9ICh1aW50MzJfdCAqKWRldnByaXYtPkFOQUJ1Zi5Mb2dpY2FsQmFzZSArIDE7ICovCisKKy8qICAgLy8gQ29udmVydCBBREMgZGF0YSB0byAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgYW5kIGNvcHkgdG8gYXBwbGljYXRpb24gKi8KKy8qICAgLy8gYnVmZmVyLgkgKi8KKy8qICAgZm9yICggaSA9IDA7IGkgPCBkZXZwcml2LT5BZGNJdGVtczsgaSsrICkgeyAqLworLyogICAgICpkYXRhID0gczYyNl9haV9yZWdfdG9fdWludCggKnJlYWRhZGRyKysgKTsgKi8KKy8qICAgICBERUJVRygiczYyNl9haV9yaW5zbjogZGF0YSAlZCBcbiIsKmRhdGEpOyAqLworLyogICAgIGRhdGErKzsgKi8KKy8qICAgfSAqLworCisvKiAgIERFQlVHKCJzNjI2X2FpX3JpbnNuOiBhaV9yaW5zbiBlc2NhcGUgXG4iKTsgKi8KKy8qICAgcmV0dXJuIGk7ICovCisvKiB9ICovCisKK3N0YXRpYyBpbnQgczYyNl9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJdWludDE2X3QgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVpbnQxNl90IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCXVpbnQxNl90IEFkY1NwZWMgPSAwOworCXVpbnQzMl90IEdwaW9JbWFnZTsKKwlpbnQgbjsKKworLyogICAvL2ludGVycnVwdCBjYWxsIHRlc3QgICovCisvKiAgIHdyaXRlbChJUlFfR1BJTzMsZGV2cHJpdi0+YmFzZV9hZGRyK1BfUFNSKTsgLy9Xcml0aW5nIGEgbG9naWNhbCAxICovCisvKiAJCQkJCSAgICAgLy9pbnRvIGFueSBvZiB0aGUgUlBTX1BTUiAqLworLyogCQkJCQkgICAgIC8vYml0cyBjYXVzZXMgdGhlICovCisvKiAJCQkJCSAgICAgLy9jb3JyZXNwb25kaW5nIGludGVycnVwdCAqLworLyogCQkJCQkgICAgIC8vdG8gYmUgZ2VuZXJhdGVkIGlmICovCisvKiAJCQkJCSAgICAgLy9lbmFibGVkICovCisKKwlERUJVRygiczYyNl9haV9pbnNuX3JlYWQ6IGVudGVyaW5nXG4iKTsKKworCS8vIENvbnZlcnQgYXBwbGljYXRpb24ncyBBREMgc3BlY2lmaWNhdGlvbiBpbnRvIGZvcm0KKwkvLyBhcHByb3ByaWF0ZSBmb3IgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcuCisJaWYgKHJhbmdlID09IDApCisJCUFkY1NwZWMgPSAoY2hhbiA8PCA4KSB8IChHU0VMX0JJUE9MQVI1Vik7CisJZWxzZQorCQlBZGNTcGVjID0gKGNoYW4gPDwgOCkgfCAoR1NFTF9CSVBPTEFSMTBWKTsKKworCS8vIFN3aXRjaCBBREMgYW5hbG9nIGdhaW4uCisJREVCSXdyaXRlKGRldiwgTFBfR1NFTCwgQWRjU3BlYyk7CS8vIFNldCBnYWluLgorCisJLy8gU2VsZWN0IEFEQyBhbmFsb2cgaW5wdXQgY2hhbm5lbC4KKwlERUJJd3JpdGUoZGV2LCBMUF9JU0VMLCBBZGNTcGVjKTsJLy8gU2VsZWN0IGNoYW5uZWwuCisKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisKKwkJLy8gRGVsYXkgMTAgbWljcm9zZWNvbmRzIGZvciBhbmFsb2cgaW5wdXQgc2V0dGxpbmcuCisJCWNvbWVkaV91ZGVsYXkoMTApOworCisJCS8vIFN0YXJ0IEFEQyBieSBwdWxzaW5nIEdQSU8xIGxvdy4KKwkJR3Bpb0ltYWdlID0gUlI3MTQ2KFBfR1BJTyk7CisJCS8vIEFzc2VydCBBREMgU3RhcnQgY29tbWFuZAorCQlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCQkvLyAgIGFuZCBzdHJldGNoIGl0IG91dC4KKwkJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlICYgfkdQSU8xX0hJKTsKKwkJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlICYgfkdQSU8xX0hJKTsKKwkJLy8gTmVnYXRlIEFEQyBTdGFydCBjb21tYW5kLgorCQlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgfCBHUElPMV9ISSk7CisKKwkJLy8gV2FpdCBmb3IgQURDIHRvIGNvbXBsZXRlIChHUElPMiBpcyBhc3NlcnRlZCBoaWdoIHdoZW4KKwkJLy8gQURDIG5vdCBidXN5KSBhbmQgZm9yIGRhdGEgZnJvbSBwcmV2aW91cyBjb252ZXJzaW9uIHRvCisJCS8vIHNoaWZ0IGludG8gRkIgQlVGRkVSIDEgcmVnaXN0ZXIuCisKKwkJLy8gV2FpdCBmb3IgQURDIGRvbmUuCisJCXdoaWxlICghKFJSNzE0NihQX1BTUikgJiBQU1JfR1BJTzIpKSA7CisKKwkJLy8gRmV0Y2ggQURDIGRhdGEuCisJCWlmIChuICE9IDApCisJCQlkYXRhW24gLSAxXSA9IHM2MjZfYWlfcmVnX3RvX3VpbnQoUlI3MTQ2KFBfRkJfQlVGRkVSMSkpOworCisJCS8vIEFsbG93IHRoZSBBREMgdG8gc3RhYmlsaXplIGZvciA0IG1pY3Jvc2Vjb25kcyBiZWZvcmUKKwkJLy8gc3RhcnRpbmcgdGhlIG5leHQgKGZpbmFsKSBjb252ZXJzaW9uLiAgVGhpcyBkZWxheSBpcworCQkvLyBuZWNlc3NhcnkgdG8gYWxsb3cgc3VmZmljaWVudCB0aW1lIGJldHdlZW4gbGFzdAorCQkvLyBjb252ZXJzaW9uIGZpbmlzaGVkIGFuZCB0aGUgc3RhcnQgb2YgdGhlIG5leHQKKwkJLy8gY29udmVyc2lvbi4gIFdpdGhvdXQgdGhpcyBkZWxheSwgdGhlIGxhc3QgY29udmVyc2lvbidzCisJCS8vIGRhdGEgdmFsdWUgaXMgc29tZXRpbWVzIHNldCB0byB0aGUgcHJldmlvdXMKKwkJLy8gY29udmVyc2lvbidzIGRhdGEgdmFsdWUuCisJCWNvbWVkaV91ZGVsYXkoNCk7CisJfQorCisJLy8gU3RhcnQgYSBkdW1teSBjb252ZXJzaW9uIHRvIGNhdXNlIHRoZSBkYXRhIGZyb20gdGhlCisJLy8gcHJldmlvdXMgY29udmVyc2lvbiB0byBiZSBzaGlmdGVkIGluLgorCUdwaW9JbWFnZSA9IFJSNzE0NihQX0dQSU8pOworCisJLy9Bc3NlcnQgQURDIFN0YXJ0IGNvbW1hbmQKKwlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCS8vICAgYW5kIHN0cmV0Y2ggaXQgb3V0LgorCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSAmIH5HUElPMV9ISSk7CisJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlICYgfkdQSU8xX0hJKTsKKwkvLyBOZWdhdGUgQURDIFN0YXJ0IGNvbW1hbmQuCisJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlIHwgR1BJTzFfSEkpOworCisJLy8gV2FpdCBmb3IgdGhlIGRhdGEgdG8gYXJyaXZlIGluIEZCIEJVRkZFUiAxIHJlZ2lzdGVyLgorCisJLy8gV2FpdCBmb3IgQURDIGRvbmUuCisJd2hpbGUgKCEoUlI3MTQ2KFBfUFNSKSAmIFBTUl9HUElPMikpIDsKKworCS8vIEZldGNoIEFEQyBkYXRhIGZyb20gYXVkaW8gaW50ZXJmYWNlJ3MgaW5wdXQgc2hpZnQKKwkvLyByZWdpc3Rlci4KKworCS8vIEZldGNoIEFEQyBkYXRhLgorCWlmIChuICE9IDApCisJCWRhdGFbbiAtIDFdID0gczYyNl9haV9yZWdfdG9fdWludChSUjcxNDYoUF9GQl9CVUZGRVIxKSk7CisKKwlERUJVRygiczYyNl9haV9pbnNuX3JlYWQ6IHNhbXBsZXMgJWQsIGRhdGEgJWRcbiIsIG4sIGRhdGFbbiAtIDFdKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHM2MjZfYWlfbG9hZF9wb2xsbGlzdCh1aW50OF90ICogcHBsLCBjb21lZGlfY21kICogY21kKQoreworCisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgY21kLT5jaGFubGlzdF9sZW47IG4rKykgeworCQlpZiAoQ1JfUkFOR0UoKGNtZC0+Y2hhbmxpc3QpW25dKSA9PSAwKQorCQkJcHBsW25dID0gKENSX0NIQU4oKGNtZC0+Y2hhbmxpc3QpW25dKSkgfCAoUkFOR0VfNVYpOworCQllbHNlCisJCQlwcGxbbl0gPSAoQ1JfQ0hBTigoY21kLT5jaGFubGlzdClbbl0pKSB8IChSQU5HRV8xMFYpOworCX0KKwlwcGxbbiAtIDFdIHw9IEVPUEw7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBzNjI2X2FpX2ludHRyaWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50IHRyaWdudW0pCit7CisJaWYgKHRyaWdudW0gIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlERUJVRygiczYyNl9haV9pbnR0cmlnOiB0cmlnZ2VyIGFkYyBzdGFydC4uLiIpOworCisJLy8gU3RhcnQgZXhlY3V0aW5nIHRoZSBSUFMgcHJvZ3JhbS4KKwlNQ19FTkFCTEUoUF9NQzEsIE1DMV9FUlBTMSk7CisKKwlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisKKwlERUJVRygiIGRvbmVcbiIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qICBUTyBDT01QTEVURSAgKi8KK3N0YXRpYyBpbnQgczYyNl9haV9jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisKKwl1aW50OF90IHBwbFsxNl07CisJY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJZW5jX3ByaXZhdGUgKms7CisJaW50IHRpY2s7CisKKwlERUJVRygiczYyNl9haV9jbWQ6IGVudGVyaW5nIGNvbW1hbmQgZnVuY3Rpb25cbiIpOworCisJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nKSB7CisJCXByaW50aygiczYyNl9haV9jbWQ6IEFub3RoZXIgYWlfY21kIGlzIHJ1bm5pbmcgJWRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLy9kaXNhYmxlIGludGVycnVwdAorCXdyaXRlbCgwLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwkvL2NsZWFyIGludGVycnVwdCByZXF1ZXN0CisJd3JpdGVsKElSUV9SUFMxIHwgSVJRX0dQSU8zLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lTUik7CisKKwkvL2NsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdAorCXM2MjZfZGlvX2NsZWFyX2lycShkZXYpOworCS8vICBzNjI2X2VuY19jbGVhcl9pcnEoZGV2KTsKKworCS8vcmVzZXQgYWlfY21kX3J1bm5pbmcgZmxhZworCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCS8vIHRlc3QgaWYgY21kIGlzIHZhbGlkCisJaWYgKGNtZCA9PSBOVUxMKSB7CisJCURFQlVHKCJzNjI2X2FpX2NtZDogTlVMTCBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJREVCVUcoInM2MjZfYWlfY21kOiBjb21tYW5kIHJlY2lldmVkISEhXG4iKTsKKwl9CisKKwlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQljb21lZGlfZXJyb3IoZGV2LAorCQkJInM2MjZfYWlfY21kOiBjYW5ub3QgcnVuIGNvbW1hbmQgd2l0aG91dCBhbiBpcnEiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJczYyNl9haV9sb2FkX3BvbGxsaXN0KHBwbCwgY21kKTsKKwlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDE7CisJZGV2cHJpdi0+YWlfY29udmVydF9jb3VudCA9IDA7CisKKwlzd2l0Y2ggKGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKKwljYXNlIFRSSUdfRk9MTE9XOgorCQlicmVhazsKKwljYXNlIFRSSUdfVElNRVI6CisJCS8vIHNldCBhIGNvbnRlciB0byBnZW5lcmF0ZSBhZGMgdHJpZ2dlciBhdCBzY2FuX2JlZ2luX2FyZyBpbnRlcnZhbAorCQlrID0gJmVuY3ByaXZbNV07CisJCXRpY2sgPSBzNjI2X25zX3RvX3RpbWVyKChpbnQgKikmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCWNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX01BU0spOworCisJCS8vbG9hZCB0aW1lciB2YWx1ZSBhbmQgZW5hYmxlIGludGVycnVwdAorCQlzNjI2X3RpbWVyX2xvYWQoZGV2LCBrLCB0aWNrKTsKKwkJay0+U2V0RW5hYmxlKGRldiwgaywgQ0xLRU5BQl9BTFdBWVMpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogc2NhbiB0cmlnZ2VyIHRpbWVyIGlzIHNldCB3aXRoIHZhbHVlICVkXG4iLAorCQkJdGljayk7CisKKwkJYnJlYWs7CisJY2FzZSBUUklHX0VYVDoKKwkJLy8gc2V0IHRoZSBkaWdpdGFsIGxpbmUgYW5kIGludGVycnVwdCBmb3Igc2NhbiB0cmlnZ2VyCisJCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0VYVCkKKwkJCXM2MjZfZGlvX3NldF9pcnEoZGV2LCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKworCQlERUJVRygiczYyNl9haV9jbWQ6IEV4dGVybmFsIHNjYW4gdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgeworCWNhc2UgVFJJR19OT1c6CisJCWJyZWFrOworCWNhc2UgVFJJR19USU1FUjoKKwkJLy8gc2V0IGEgY29udGVyIHRvIGdlbmVyYXRlIGFkYyB0cmlnZ2VyIGF0IGNvbnZlcnRfYXJnIGludGVydmFsCisJCWsgPSAmZW5jcHJpdls0XTsKKwkJdGljayA9IHM2MjZfbnNfdG9fdGltZXIoKGludCAqKSZjbWQtPmNvbnZlcnRfYXJnLAorCQkJY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTUFTSyk7CisKKwkJLy9sb2FkIHRpbWVyIHZhbHVlIGFuZCBlbmFibGUgaW50ZXJydXB0CisJCXM2MjZfdGltZXJfbG9hZChkZXYsIGssIHRpY2spOworCQlrLT5TZXRFbmFibGUoZGV2LCBrLCBDTEtFTkFCX0lOREVYKTsKKworCQlERUJVRygiczYyNl9haV9jbWQ6IGNvbnZlcnQgdHJpZ2dlciB0aW1lciBpcyBzZXQgd2l0aCB2YWx1ZSAlZFxuIiwgdGljayk7CisJCWJyZWFrOworCWNhc2UgVFJJR19FWFQ6CisJCS8vIHNldCB0aGUgZGlnaXRhbCBsaW5lIGFuZCBpbnRlcnJ1cHQgZm9yIGNvbnZlcnQgdHJpZ2dlcgorCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVAorCQkJJiYgY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpCisJCQlzNjI2X2Rpb19zZXRfaXJxKGRldiwgY21kLT5jb252ZXJ0X2FyZyk7CisKKwkJREVCVUcoInM2MjZfYWlfY21kOiBFeHRlcm5hbCBjb252ZXJ0IHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKKwljYXNlIFRSSUdfQ09VTlQ6CisJCS8vIGRhdGEgYXJyaXZlcyBhcyBvbmUgcGFja2V0CisJCWRldnByaXYtPmFpX3NhbXBsZV9jb3VudCA9IGNtZC0+c3RvcF9hcmc7CisJCWRldnByaXYtPmFpX2NvbnRpbm91cyA9IDA7CisJCWJyZWFrOworCWNhc2UgVFJJR19OT05FOgorCQkvLyBjb250aW5vdXMgYXF1aXNpdGlvbgorCQlkZXZwcml2LT5haV9jb250aW5vdXMgPSAxOworCQlkZXZwcml2LT5haV9zYW1wbGVfY291bnQgPSAwOworCQlicmVhazsKKwl9CisKKwlSZXNldEFEQyhkZXYsIHBwbCk7CisKKwlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CisJY2FzZSBUUklHX05PVzoKKwkJLy8gVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0IGJ5IHNldHRpbmcgUlBTIFNpZ25hbCAwLgorCQkvLyBNQ19FTkFCTEUoIFBfTUMyLCBNQzJfQURDX1JQUyApOworCisJCS8vIFN0YXJ0IGV4ZWN1dGluZyB0aGUgUlBTIHByb2dyYW0uCisJCU1DX0VOQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCQlERUJVRygiczYyNl9haV9jbWQ6IEFEQyB0cmlnZ2VyZWRcbiIpOworCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgVFJJR19FWFQ6CisJCS8vY29uZmlndXJlIERJTyBjaGFubmVsIGZvciBhY3F1aXNpdGlvbiB0cmlnZ2VyCisJCXM2MjZfZGlvX3NldF9pcnEoZGV2LCBjbWQtPnN0YXJ0X2FyZyk7CisKKwkJREVCVUcoInM2MjZfYWlfY21kOiBFeHRlcm5hbCBzdGFydCB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisKKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFRSSUdfSU5UOgorCQlzLT5hc3luYy0+aW50dHJpZyA9IHM2MjZfYWlfaW50dHJpZzsKKwkJYnJlYWs7CisJfQorCisJLy9lbmFibGUgaW50ZXJydXB0CisJd3JpdGVsKElSUV9HUElPMyB8IElSUV9SUFMxLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwlERUJVRygiczYyNl9haV9jbWQ6IGNvbW1hbmQgZnVuY3Rpb24gdGVybWluYXRlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNjI2X2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgdG1wOworCisJLyogY21kdGVzdCB0ZXN0cyBhIHBhcnRpY3VsYXIgY29tbWFuZCB0byBzZWUgaWYgaXQgaXMgdmFsaWQuICBVc2luZworCSAqIHRoZSBjbWR0ZXN0IGlvY3RsLCBhIHVzZXIgY2FuIGNyZWF0ZSBhIHZhbGlkIGNtZCBhbmQgdGhlbiBoYXZlIGl0CisJICogZXhlY3V0ZXMgYnkgdGhlIGNtZCBpb2N0bC4KKwkgKgorCSAqIGNtZHRlc3QgcmV0dXJucyAxLDIsMyw0IG9yIDAsIGRlcGVuZGluZyBvbiB3aGljaCB0ZXN0cyB0aGUKKwkgKiBjb21tYW5kIHBhc3Nlcy4gKi8KKworCS8qIHN0ZXAgMTogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCisKKwl0bXAgPSBjbWQtPnN0YXJ0X3NyYzsKKwljbWQtPnN0YXJ0X3NyYyAmPSBUUklHX05PVyB8IFRSSUdfSU5UIHwgVFJJR19FWFQ7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVCB8IFRSSUdfRk9MTE9XOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRVhUIHwgVFJJR19OT1c7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zdG9wX3NyYzsKKwljbWQtPnN0b3Bfc3JjICY9IFRSSUdfQ09VTlQgfCBUUklHX05PTkU7CisJaWYgKCFjbWQtPnN0b3Bfc3JjIHx8IHRtcCAhPSBjbWQtPnN0b3Bfc3JjKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5CisJICAgY29tcGF0aWJsZSAqLworCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQKKwkJJiYgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVykKKwkJZXJyKys7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19USU1FUiAmJgorCQljbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfRVhUICYmIGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19OT1cpCisJCWVycisrOworCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX05PTkUpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDI7CisKKwkvKiBzdGVwIDM6IG1ha2Ugc3VyZSBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19FWFQgJiYgY21kLT5zdGFydF9hcmcgIT0gMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPnN0YXJ0X2FyZyA8IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5zdGFydF9hcmcgPiAzOSkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDM5OworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPnNjYW5fYmVnaW5fYXJnIDwgMCkgeworCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5zY2FuX2JlZ2luX2FyZyA+IDM5KSB7CisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAzOTsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5jb252ZXJ0X2FyZyA8IDApIHsKKwkJY21kLT5jb252ZXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUICYmIGNtZC0+Y29udmVydF9hcmcgPiAzOSkgeworCQljbWQtPmNvbnZlcnRfYXJnID0gMzk7CisJCWVycisrOworCX0KKyNkZWZpbmUgTUFYX1NQRUVECTIwMDAwMAkvKiBpbiBuYW5vc2Vjb25kcyAqLworI2RlZmluZSBNSU5fU1BFRUQJMjAwMDAwMDAwMAkvKiBpbiBuYW5vc2Vjb25kcyAqLworCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IE1BWF9TUEVFRCkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IE1BWF9TUEVFRDsKKwkJCWVycisrOworCQl9CisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnID4gTUlOX1NQRUVEKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gTUlOX1NQRUVEOworCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgeworCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCisJCS8qIHNob3VsZCBiZSBsZXZlbC9lZGdlLCBoaS9sbyBzcGVjaWZpY2F0aW9uIGhlcmUgKi8KKwkJLyogc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgZXh0ZXJuYWwgdHJpZ2dlcnMgKi8KKy8qICAgICBpZihjbWQtPnNjYW5fYmVnaW5fYXJnPjkpeyAqLworLyogICAgICAgY21kLT5zY2FuX2JlZ2luX2FyZz05OyAqLworLyogICAgICAgZXJyKys7ICovCisvKiAgICAgfSAqLworCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgTUFYX1NQRUVEKSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gTUFYX1NQRUVEOworCQkJZXJyKys7CisJCX0KKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgPiBNSU5fU1BFRUQpIHsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSBNSU5fU1BFRUQ7CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KKwkJLyogc2VlIGFib3ZlICovCisvKiAgICAgaWYoY21kLT5jb252ZXJ0X2FyZz45KXsgKi8KKy8qICAgICAgIGNtZC0+Y29udmVydF9hcmc9OTsgKi8KKy8qICAgICAgIGVycisrOyAqLworLyogICAgIH0gKi8KKwl9CisKKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJaWYgKGNtZC0+c3RvcF9hcmcgPiAweDAwZmZmZmZmKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMHgwMGZmZmZmZjsKKwkJCWVycisrOworCQl9CisJfSBlbHNlIHsKKwkJLyogVFJJR19OT05FICovCisJCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKKwkJczYyNl9uc190b190aW1lcigoaW50ICopJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQljbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKKwkJaWYgKHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fYXJnKQorCQkJZXJyKys7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5jb252ZXJ0X2FyZzsKKwkJczYyNl9uc190b190aW1lcigoaW50ICopJmNtZC0+Y29udmVydF9hcmcsCisJCQljbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKKwkJaWYgKHRtcCAhPSBjbWQtPmNvbnZlcnRfYXJnKQorCQkJZXJyKys7CisJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPAorCQkJY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+c2Nhbl9lbmRfYXJnKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0KKwkJCQljbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmc7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpCisJCXJldHVybiA0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJLy8gU3RvcCBSUFMgcHJvZ3JhbSBpbiBjYXNlIGl0IGlzIGN1cnJlbnRseSBydW5uaW5nLgorCU1DX0RJU0FCTEUoUF9NQzEsIE1DMV9FUlBTMSk7CisKKwkvL2Rpc2FibGUgbWFzdGVyIGludGVycnVwdAorCXdyaXRlbCgwLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlcXVpcmUgYSBwYXJ0aWN1bGFyIGZvcm0sIHRoaXMgaXMganVzdCB3aGF0CisgKiBoYXBwZW5zIHRvIGJlIHVzZWQgaW4gc29tZSBvZiB0aGUgZHJpdmVycy4gIEl0IHNob3VsZCBjb252ZXJ0IG5zCisgKiBuYW5vc2Vjb25kcyB0byBhIGNvdW50ZXIgdmFsdWUgc3VpdGFibGUgZm9yIHByb2dyYW1taW5nIHRoZSBkZXZpY2UuCisgKiBBbHNvLCBpdCBzaG91bGQgYWRqdXN0IG5zIHNvIHRoYXQgaXQgY29vcmVzcG9uZHMgdG8gdGhlIGFjdHVhbCB0aW1lCisgKiB0aGF0IHRoZSBkZXZpY2Ugd2lsbCB1c2UuICovCitzdGF0aWMgaW50IHM2MjZfbnNfdG9fdGltZXIoaW50ICpuYW5vc2VjLCBpbnQgcm91bmRfbW9kZSkKK3sKKwlpbnQgZGl2aWRlciwgYmFzZTsKKworCWJhc2UgPSA1MDA7CQkvLzJNSHogaW50ZXJuYWwgY2xvY2sKKworCXN3aXRjaCAocm91bmRfbW9kZSkgeworCWNhc2UgVFJJR19ST1VORF9ORUFSRVNUOgorCWRlZmF1bHQ6CisJCWRpdmlkZXIgPSAoKm5hbm9zZWMgKyBiYXNlIC8gMikgLyBiYXNlOworCQlicmVhazsKKwljYXNlIFRSSUdfUk9VTkRfRE9XTjoKKwkJZGl2aWRlciA9ICgqbmFub3NlYykgLyBiYXNlOworCQlicmVhazsKKwljYXNlIFRSSUdfUk9VTkRfVVA6CisJCWRpdmlkZXIgPSAoKm5hbm9zZWMgKyBiYXNlIC0gMSkgLyBiYXNlOworCQlicmVhazsKKwl9CisKKwkqbmFub3NlYyA9IGJhc2UgKiBkaXZpZGVyOworCXJldHVybiBkaXZpZGVyIC0gMTsKK30KKworc3RhdGljIGludCBzNjI2X2FvX3dpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJaW50IGk7CisJdWludDE2X3QgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludDE2X3QgZGFjZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGFjZGF0YSA9IChpbnQxNl90KSBkYXRhW2ldOworCQlkZXZwcml2LT5hb19yZWFkYmFja1tDUl9DSEFOKGluc24tPmNoYW5zcGVjKV0gPSBkYXRhW2ldOworCQlkYWNkYXRhIC09ICgweDFmZmYpOworCisJCVNldERBQyhkZXYsIGNoYW4sIGRhY2RhdGEpOworCX0KKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHM2MjZfYW9fcmluc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CisJfQorCisJcmV0dXJuIGk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vICBESUdJVEFMIEkvTyBGVU5DVElPTlMgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFsbCBESU8gZnVuY3Rpb25zIGFkZHJlc3MgYSBncm91cCBvZiBESU8gY2hhbm5lbHMgYnkgbWVhbnMgb2YKKy8vICJncm91cCIgYXJndW1lbnQuICBncm91cCBtYXkgYmUgMCwgMSBvciAyLCB3aGljaCBjb3JyZXNwb25kIHRvIERJTworLy8gcG9ydHMgQSwgQiBhbmQgQywgcmVzcGVjdGl2ZWx5LgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIHM2MjZfZGlvX2luaXQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwl1aW50MTZfdCBncm91cDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJLy8gUHJlcGFyZSB0byB0cmVhdCB3cml0ZXMgdG8gV1JDYXBTZWwgYXMgY2FwdHVyZSBkaXNhYmxlcy4KKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfTk9FRENBUCk7CisKKwkvLyBGb3IgZWFjaCBncm91cCBvZiBzaXh0ZWVuIGNoYW5uZWxzIC4uLgorCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IFM2MjZfRElPX0JBTktTOyBncm91cCsrKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyAyICsgZ3JvdXA7CisJCURFQkl3cml0ZShkZXYsIGRpb3ByaXYtPldSSW50U2VsLCAwKTsJLy8gRGlzYWJsZSBhbGwgaW50ZXJydXB0cy4KKwkJREVCSXdyaXRlKGRldiwgZGlvcHJpdi0+V1JDYXBTZWwsIDB4RkZGRik7CS8vIERpc2FibGUgYWxsIGV2ZW50CisJCS8vIGNhcHR1cmVzLgorCQlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkVkZ1NlbCwgMCk7CS8vIEluaXQgYWxsIERJT3MgdG8KKwkJLy8gZGVmYXVsdCBlZGdlCisJCS8vIHBvbGFyaXR5LgorCQlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkRPdXQsIDApOwkvLyBQcm9ncmFtIGFsbCBvdXRwdXRzCisJCS8vIHRvIGluYWN0aXZlIHN0YXRlLgorCX0KKwlERUJVRygiczYyNl9kaW9faW5pdDogRElPIGluaXRpYWxpemVkIFxuIik7Cit9CisKKy8qIERJTyBkZXZpY2VzIGFyZSBzbGlnaHRseSBzcGVjaWFsLiAgQWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8KKyAqIGltcGxlbWVudCB0aGUgaW5zbl9yZWFkL2luc25fd3JpdGUgaW50ZXJmYWNlLCBpdCBpcyBtdWNoIG1vcmUKKyAqIHVzZWZ1bCB0byBhcHBsaWNhdGlvbnMgaWYgeW91IGltcGxlbWVudCB0aGUgaW5zbl9iaXRzIGludGVyZmFjZS4KKyAqIFRoaXMgYWxsb3dzIHBhY2tlZCByZWFkaW5nL3dyaXRpbmcgb2YgdGhlIERJTyBjaGFubmVscy4gIFRoZSBjb21lZGkKKyAqIGNvcmUgY2FuIGNvbnZlcnQgYmV0d2VlbiBpbnNuX2JpdHMgYW5kIGluc25fcmVhZC93cml0ZSAqLworCitzdGF0aWMgaW50IHM2MjZfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCS8qIExlbmd0aCBvZiBkYXRhIG11c3QgYmUgMiAobWFzayBhbmQgbmV3IGRhdGEsIHNlZSBiZWxvdykgKi8KKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoaW5zbi0+biAhPSAyKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHM2MjY6IHM2MjZfZGlvX2luc25fYml0cygpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aFxuIiwgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogVGhlIGluc24gZGF0YSBjb25zaXN0cyBvZiBhIG1hc2sgaW4gZGF0YVswXSBhbmQgdGhlIG5ldyBkYXRhIGluCisJICogZGF0YVsxXS4gVGhlIG1hc2sgZGVmaW5lcyB3aGljaCBiaXRzIHdlIGFyZSBjb25jZXJuaW5nIGFib3V0LgorCSAqIFRoZSBuZXcgZGF0YSBtdXN0IGJlIGFuZGVkIHdpdGggdGhlIG1hc2suICBFYWNoIGNoYW5uZWwKKwkgKiBjb3JyZXNwb25kcyB0byBhIGJpdC4KKwkgKi8KKwlpZiAoZGF0YVswXSkgeworCQkvKiBDaGVjayBpZiByZXF1ZXN0ZWQgcG9ydHMgYXJlIGNvbmZpZ3VyZWQgZm9yIG91dHB1dCAqLworCQlpZiAoKHMtPmlvX2JpdHMgJiBkYXRhWzBdKSAhPSBkYXRhWzBdKQorCQkJcmV0dXJuIC1FSU87CisKKwkJcy0+c3RhdGUgJj0gfmRhdGFbMF07CisJCXMtPnN0YXRlIHw9IGRhdGFbMF0gJiBkYXRhWzFdOworCisJCS8qIFdyaXRlIG91dCB0aGUgbmV3IGRpZ2l0YWwgb3V0cHV0IGxpbmVzICovCisKKwkJREVCSXdyaXRlKGRldiwgZGlvcHJpdi0+V1JET3V0LCBzLT5zdGF0ZSk7CisJfQorCWRhdGFbMV0gPSBERUJJcmVhZChkZXYsIGRpb3ByaXYtPlJEREluKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IHM2MjZfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJCWRhdGFbMV0gPQorCQkJKHMtPmlvX2JpdHMgJiAoMSA8PCBDUl9DSEFOKGluc24tPgorCQkJCQljaGFuc3BlYykpKSA/IENPTUVESV9PVVRQVVQgOgorCQkJQ09NRURJX0lOUFVUOworCQlyZXR1cm4gaW5zbi0+bjsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfSU5QVVQ6CisJCXMtPmlvX2JpdHMgJj0gfigxIDw8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfT1VUUFVUOgorCQlzLT5pb19iaXRzIHw9IDEgPDwgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJREVCSXdyaXRlKGRldiwgZGlvcHJpdi0+V1JET3V0LCBzLT5pb19iaXRzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHM2MjZfZGlvX3NldF9pcnEoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGNoYW4pCit7CisJdW5zaWduZWQgaW50IGdyb3VwOworCXVuc2lnbmVkIGludCBiaXRtYXNrOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwkvL3NlbGVjdCBkaW8gYmFuaworCWdyb3VwID0gY2hhbiAvIDE2OworCWJpdG1hc2sgPSAxIDw8IChjaGFuIC0gKDE2ICogZ3JvdXApKTsKKwlERUJVRygiczYyNl9kaW9fc2V0X2lycTogZW5hYmxlIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZCBncm91cCAlZFxuIiwKKwkJY2hhbiAtICgxNiAqIGdyb3VwKSwgZ3JvdXApOworCisJLy9zZXQgY2hhbm5lbCB0byBjYXB0dXJlIHBvc2l0aXZlIGVkZ2UKKwlzdGF0dXMgPSBERUJJcmVhZChkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPlJERWRnU2VsKTsKKwlERUJJd3JpdGUoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5XUkVkZ1NlbCwgYml0bWFzayB8IHN0YXR1cyk7CisKKwkvL2VuYWJsZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgY2hhbm5lbAorCXN0YXR1cyA9IERFQklyZWFkKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+UkRJbnRTZWwpOworCURFQkl3cml0ZShkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPldSSW50U2VsLCBiaXRtYXNrIHwgc3RhdHVzKTsKKworCS8vZW5hYmxlIGVkZ2UgY2FwdHVyZSB3cml0ZSBjb21tYW5kCisJREVCSXdyaXRlKGRldiwgTFBfTUlTQzEsIE1JU0MxX0VEQ0FQKTsKKworCS8vZW5hYmxlIGVkZ2UgY2FwdHVyZSBvbiBzZWxlY3RlZCBjaGFubmVsCisJc3RhdHVzID0gREVCSXJlYWQoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5SRENhcFNlbCk7CisJREVCSXdyaXRlKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+V1JDYXBTZWwsIGJpdG1hc2sgfCBzdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9kaW9fcmVzZXRfaXJxKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBncm91cCwKKwl1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlERUJVRygiczYyNl9kaW9fcmVzZXRfaXJxOiBkaXNhYmxlICBpbnRlcnJ1cHQgb24gZGlvIGNoYW5uZWwgJWQgZ3JvdXAgJWRcbiIsIG1hc2ssIGdyb3VwKTsKKworCS8vZGlzYWJsZSBlZGdlIGNhcHR1cmUgd3JpdGUgY29tbWFuZAorCURFQkl3cml0ZShkZXYsIExQX01JU0MxLCBNSVNDMV9OT0VEQ0FQKTsKKworCS8vZW5hYmxlIGVkZ2UgY2FwdHVyZSBvbiBzZWxlY3RlZCBjaGFubmVsCisJREVCSXdyaXRlKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+V1JDYXBTZWwsIG1hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9kaW9fY2xlYXJfaXJxKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdW5zaWduZWQgaW50IGdyb3VwOworCisJLy9kaXNhYmxlIGVkZ2UgY2FwdHVyZSB3cml0ZSBjb21tYW5kCisJREVCSXdyaXRlKGRldiwgTFBfTUlTQzEsIE1JU0MxX05PRURDQVApOworCisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgUzYyNl9ESU9fQkFOS1M7IGdyb3VwKyspIHsKKwkJLy9jbGVhciBwZW5kaW5nIGV2ZW50cyBhbmQgaW50ZXJydXB0CisJCURFQkl3cml0ZShkZXYsCisJCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQkJZ3JvdXApLT5wcml2YXRlKS0+V1JDYXBTZWwsIDB4ZmZmZik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE5vdyB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciAoZGF0YVswXSkKKyAgIGFuZCBzZXQgdGhlIHN1YmRldmljZS4gVG8gY29tcGxldGUgd2l0aCB0cmlnZ2VyIGFuZCBpbnRlcnJ1cHQKKyAgIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbnQgczYyNl9lbmNfaW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJdWludDE2X3QgU2V0dXAgPSAoTE9BRFNSQ19JTkRYIDw8IEJGX0xPQURTUkMpIHwJLy8gUHJlbG9hZCB1cG9uCisJCS8vIGluZGV4LgorCQkoSU5EWFNSQ19TT0ZUIDw8IEJGX0lORFhTUkMpIHwJLy8gRGlzYWJsZSBoYXJkd2FyZSBpbmRleC4KKwkJKENMS1NSQ19DT1VOVEVSIDw8IEJGX0NMS1NSQykgfAkvLyBPcGVyYXRpbmcgbW9kZSBpcyBDb3VudGVyLgorCQkoQ0xLUE9MX1BPUyA8PCBCRl9DTEtQT0wpIHwJLy8gQWN0aXZlIGhpZ2ggY2xvY2suCisJCS8vKCBDTlRESVJfVVAgPDwgQkZfQ0xLUE9MICkgfCAgICAgIC8vIENvdW50IGRpcmVjdGlvbiBpcyBEb3duLgorCQkoQ0xLTVVMVF8xWCA8PCBCRl9DTEtNVUxUKSB8CS8vIENsb2NrIG11bHRpcGxpZXIgaXMgMXguCisJCShDTEtFTkFCX0lOREVYIDw8IEJGX0NMS0VOQUIpOworCS8qICAgdWludDE2X3QgRGlzYWJsZUludFNyYz1UUlVFOyAqLworCS8vIHVpbnQzMl90IFByZWxvYWR2YWx1ZTsgICAgICAgICAgICAgIC8vQ291bnRlciBpbml0aWFsIHZhbHVlCisJdWludDE2X3QgdmFsdWVTcmNsYXRjaCA9IExBVENIU1JDX0FCX1JFQUQ7CisJdWludDE2X3QgZW5hYiA9IENMS0VOQUJfQUxXQVlTOworCWVuY19wcml2YXRlICprID0gJmVuY3ByaXZbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldOworCisJREVCVUcoInM2MjZfZW5jX2luc25fY29uZmlnOiBlbmNvZGVyIGNvbmZpZ1xuIik7CisKKwkvLyAgKGRhdGE9PU5VTEwpID8gKFByZWxvYWR2YWx1ZT0wKSA6IChQcmVsb2FkdmFsdWU9ZGF0YVswXSk7CisKKwlrLT5TZXRNb2RlKGRldiwgaywgU2V0dXAsIFRSVUUpOworCVByZWxvYWQoZGV2LCBrLCAqKGluc24tPmRhdGEpKTsKKwlrLT5QdWxzZUluZGV4KGRldiwgayk7CisJU2V0TGF0Y2hTb3VyY2UoZGV2LCBrLCB2YWx1ZVNyY2xhdGNoKTsKKwlrLT5TZXRFbmFibGUoZGV2LCBrLCAodWludDE2X3QpIChlbmFiICE9IDApKTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHM2MjZfZW5jX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCWludCBuOworCWVuY19wcml2YXRlICprID0gJmVuY3ByaXZbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldOworCisJREVCVUcoInM2MjZfZW5jX2luc25fcmVhZDogZW5jb2RlciByZWFkIGNoYW5uZWwgJWQgXG4iLAorCQlDUl9DSEFOKGluc24tPmNoYW5zcGVjKSk7CisKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKQorCQlkYXRhW25dID0gUmVhZExhdGNoKGRldiwgayk7CisKKwlERUJVRygiczYyNl9lbmNfaW5zbl9yZWFkOiBlbmNvZGVyIHNhbXBsZSAlZFxuIiwgZGF0YVtuXSk7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJZW5jX3ByaXZhdGUgKmsgPSAmZW5jcHJpdltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CisKKwlERUJVRygiczYyNl9lbmNfaW5zbl93cml0ZTogZW5jb2RlciB3cml0ZSBjaGFubmVsICVkIFxuIiwKKwkJQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYykpOworCisJLy8gU2V0IHRoZSBwcmVsb2FkIHJlZ2lzdGVyCisJUHJlbG9hZChkZXYsIGssIGRhdGFbMF0pOworCisJLy8gU29mdHdhcmUgaW5kZXggcHVsc2UgZm9yY2VzIHRoZSBwcmVsb2FkIHJlZ2lzdGVyIHRvIGxvYWQKKwkvLyBpbnRvIHRoZSBjb3VudGVyCisJay0+U2V0TG9hZFRyaWcoZGV2LCBrLCAwKTsKKwlrLT5QdWxzZUluZGV4KGRldiwgayk7CisJay0+U2V0TG9hZFRyaWcoZGV2LCBrLCAyKTsKKworCURFQlVHKCJzNjI2X2VuY19pbnNuX3dyaXRlOiBFbmQgZW5jb2RlciB3cml0ZVxuIik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgczYyNl90aW1lcl9sb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgaW50IHRpY2spCit7CisJdWludDE2X3QgU2V0dXAgPSAoTE9BRFNSQ19JTkRYIDw8IEJGX0xPQURTUkMpIHwJLy8gUHJlbG9hZCB1cG9uCisJCS8vIGluZGV4LgorCQkoSU5EWFNSQ19TT0ZUIDw8IEJGX0lORFhTUkMpIHwJLy8gRGlzYWJsZSBoYXJkd2FyZSBpbmRleC4KKwkJKENMS1NSQ19USU1FUiA8PCBCRl9DTEtTUkMpIHwJLy8gT3BlcmF0aW5nIG1vZGUgaXMgVGltZXIuCisJCShDTEtQT0xfUE9TIDw8IEJGX0NMS1BPTCkgfAkvLyBBY3RpdmUgaGlnaCBjbG9jay4KKwkJKENOVERJUl9ET1dOIDw8IEJGX0NMS1BPTCkgfAkvLyBDb3VudCBkaXJlY3Rpb24gaXMgRG93bi4KKwkJKENMS01VTFRfMVggPDwgQkZfQ0xLTVVMVCkgfAkvLyBDbG9jayBtdWx0aXBsaWVyIGlzIDF4LgorCQkoQ0xLRU5BQl9JTkRFWCA8PCBCRl9DTEtFTkFCKTsKKwl1aW50MTZfdCB2YWx1ZVNyY2xhdGNoID0gTEFUQ0hTUkNfQV9JTkRYQTsKKwkvLyAgdWludDE2X3QgZW5hYj1DTEtFTkFCX0FMV0FZUzsKKworCWstPlNldE1vZGUoZGV2LCBrLCBTZXR1cCwgRkFMU0UpOworCisJLy8gU2V0IHRoZSBwcmVsb2FkIHJlZ2lzdGVyCisJUHJlbG9hZChkZXYsIGssIHRpY2spOworCisJLy8gU29mdHdhcmUgaW5kZXggcHVsc2UgZm9yY2VzIHRoZSBwcmVsb2FkIHJlZ2lzdGVyIHRvIGxvYWQKKwkvLyBpbnRvIHRoZSBjb3VudGVyCisJay0+U2V0TG9hZFRyaWcoZGV2LCBrLCAwKTsKKwlrLT5QdWxzZUluZGV4KGRldiwgayk7CisKKwkvL3NldCByZWxvYWQgb24gY291bnRlciBvdmVyZmxvdworCWstPlNldExvYWRUcmlnKGRldiwgaywgMSk7CisKKwkvL3NldCBpbnRlcnJ1cHQgb24gb3ZlcmZsb3cKKwlrLT5TZXRJbnRTcmMoZGV2LCBrLCBJTlRTUkNfT1ZFUik7CisKKwlTZXRMYXRjaFNvdXJjZShkZXYsIGssIHZhbHVlU3JjbGF0Y2gpOworCS8vICBrLT5TZXRFbmFibGUoZGV2LGssKHVpbnQxNl90KShlbmFiICE9IDApKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgREFDIEZVTkNUSU9OUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFNsb3QgMCBiYXNlIHNldHRpbmdzLgorI2RlZmluZSBWRUNUMAkoIFhTRDIgfCBSU0QzIHwgU0lCX0EyICkJLy8gU2xvdCAwIGFsd2F5cyBzaGlmdHMgaW4KKwkJCQkJIC8vIDB4RkYgYW5kIHN0b3JlIGl0IHRvCisJCQkJCSAvLyBGQl9CVUZGRVIyLgorCisvLyBUcmltRGFjIExvZ2ljYWxDaGFuLXRvLVBoeXNpY2FsQ2hhbiBtYXBwaW5nIHRhYmxlLgorc3RhdGljIHVpbnQ4X3QgdHJpbWNoYW5bXSA9IHsgMTAsIDksIDgsIDMsIDIsIDcsIDYsIDEsIDAsIDUsIDQgfTsKKworLy8gVHJpbURhYyBMb2dpY2FsQ2hhbi10by1FZXByb21BZHJzIG1hcHBpbmcgdGFibGUuCitzdGF0aWMgdWludDhfdCB0cmltYWRyc1tdID0KKwl7IDB4NDAsIDB4NDEsIDB4NDIsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMgfTsKKworc3RhdGljIHZvaWQgTG9hZFRyaW1EQUNzKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJcmVnaXN0ZXIgdWludDhfdCBpOworCisJLy8gQ29weSBUcmltRGFjIHNldHBvaW50IHZhbHVlcyBmcm9tIEVFUFJPTSB0byBUcmltRGFjcy4KKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZih0cmltY2hhbikgLyBzaXplb2YodHJpbWNoYW5bMF0pKTsgaSsrKQorCQlXcml0ZVRyaW1EQUMoZGV2LCBpLCBJMkNyZWFkKGRldiwgdHJpbWFkcnNbaV0pKTsKK30KKworc3RhdGljIHZvaWQgV3JpdGVUcmltREFDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQ4X3QgTG9naWNhbENoYW4sCisJdWludDhfdCBEYWNEYXRhKQoreworCXVpbnQzMl90IGNoYW47CisKKwkvLyBTYXZlIHRoZSBuZXcgc2V0cG9pbnQgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVhZCBpdCBiYWNrIGxhdGVyLgorCWRldnByaXYtPlRyaW1TZXRwb2ludFtMb2dpY2FsQ2hhbl0gPSAodWludDhfdCkgRGFjRGF0YTsKKworCS8vIE1hcCBsb2dpY2FsIGNoYW5uZWwgbnVtYmVyIHRvIHBoeXNpY2FsIGNoYW5uZWwgbnVtYmVyLgorCWNoYW4gPSAodWludDMyX3QpIHRyaW1jaGFuW0xvZ2ljYWxDaGFuXTsKKworCS8vIFNldCB1cCBUU0wyIHJlY29yZHMgZm9yIFRyaW1EYWMgd3JpdGUgb3BlcmF0aW9uLiAgQWxsIHNsb3RzIHNoaWZ0CisJLy8gMHhGRiBpbiBmcm9tIHB1bGxlZC11cCBTRDMgc28gdGhhdCB0aGUgZW5kIG9mIHRoZSBzbG90IHNlcXVlbmNlCisJLy8gY2FuIGJlIGRldGVjdGVkLgorCVNFVFZFQ1QoMiwgWFNEMiB8IFhGSUZPXzEgfCBXUzMpOwkvLyBTbG90IDI6IFNlbmQgaGlnaCB1aW50OF90CisJLy8gdG8gdGFyZ2V0IFRyaW1EYWMuCisJU0VUVkVDVCgzLCBYU0QyIHwgWEZJRk9fMCB8IFdTMyk7CS8vIFNsb3QgMzogU2VuZCBsb3cgdWludDhfdCB0bworCS8vIHRhcmdldCBUcmltRGFjLgorCVNFVFZFQ1QoNCwgWFNEMiB8IFhGSUZPXzMgfCBXUzEpOwkvLyBTbG90IDQ6IFNlbmQgTk9QIGhpZ2gKKwkvLyB1aW50OF90IHRvIERBQzAgdG8ga2VlcAorCS8vIGNsb2NrIHJ1bm5pbmcuCisJU0VUVkVDVCg1LCBYU0QyIHwgWEZJRk9fMiB8IFdTMSB8IEVPUyk7CS8vIFNsb3QgNTogU2VuZCBOT1AgbG93CisJLy8gdWludDhfdCB0byBEQUMwLgorCisJLy8gQ29uc3RydWN0IGFuZCB0cmFuc21pdCB0YXJnZXQgREFDJ3Mgc2VyaWFsIHBhY2tldDogKCAwMDAwIEFBQUEKKwkvLyApLCggRERERCBEREREICksKCAweDAwICksKCAweDAwICkgd2hlcmUgQTwzOjA+IGlzIHRoZSBEQUMKKwkvLyBjaGFubmVsJ3MgYWRkcmVzcywgYW5kIEQ8NzowPiBpcyB0aGUgREFDIHNldHBvaW50LiAgQXBwZW5kIGEgV09SRAorCS8vIHZhbHVlICh0aGF0IHdyaXRlcyBhIGNoYW5uZWwgMCBOT1AgY29tbWFuZCB0byBhIG5vbi1leGlzdGVudCBtYWluCisJLy8gREFDIGNoYW5uZWwpIHRoYXQgc2VydmVzIHRvIGtlZXAgdGhlIGNsb2NrIHJ1bm5pbmcgYWZ0ZXIgdGhlCisJLy8gcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8gdGhlIHRhcmdldCBEQUMuCisKKwlTZW5kREFDKGRldiwgKCh1aW50MzJfdCkgY2hhbiA8PCA4KQkvLyBBZGRyZXNzIHRoZSBEQUMgY2hhbm5lbAorCQkvLyB3aXRoaW4gdGhlIHRyaW1kYWMgZGV2aWNlLgorCQl8ICh1aW50MzJfdCkgRGFjRGF0YSk7CS8vIEluY2x1ZGUgREFDIHNldHBvaW50IGRhdGEuCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8gIEVFUFJPTSBBQ0NFU1MgRlVOQ1RJT05TICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVhZCB1aW50OF90IGZyb20gRUVQUk9NLgorCitzdGF0aWMgdWludDhfdCBJMkNyZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQ4X3QgYWRkcikKK3sKKwl1aW50OF90IHJ0bnZhbDsKKworCS8vIFNlbmQgRUVQUk9NIHRhcmdldCBhZGRyZXNzLgorCWlmIChJMkNoYW5kc2hha2UoZGV2LCBJMkNfQjIoSTJDX0FUVFJTVEFSVCwgSTJDVykJLy8gQnl0ZTIgPSBJMkMKKwkJCS8vIGNvbW1hbmQ6CisJCQkvLyB3cml0ZSB0bworCQkJLy8gSTJDIEVFUFJPTQorCQkJLy8gZGV2aWNlLgorCQkJfCBJMkNfQjEoSTJDX0FUVFJTVE9QLCBhZGRyKQkvLyBCeXRlMSA9IEVFUFJPTQorCQkJLy8gaW50ZXJuYWwgdGFyZ2V0CisJCQkvLyBhZGRyZXNzLgorCQkJfCBJMkNfQjAoSTJDX0FUVFJOT1AsIDApKSkJLy8gQnl0ZTAgPSBOb3QKKwkJLy8gc2VudC4KKwl7CisJCS8vIEFib3J0IGZ1bmN0aW9uIGFuZCBkZWNsYXJlIGVycm9yIGlmIGhhbmRzaGFrZSBmYWlsZWQuCisJCURFQlVHKCJJMkNyZWFkOiBlcnJvciBoYW5kc2hha2UgSTJDcmVhZCAgYVxuIik7CisJCXJldHVybiAwOworCX0KKwkvLyBFeGVjdXRlIEVFUFJPTSByZWFkLgorCWlmIChJMkNoYW5kc2hha2UoZGV2LCBJMkNfQjIoSTJDX0FUVFJTVEFSVCwgSTJDUikJLy8gQnl0ZTIgPSBJMkMKKwkJCS8vIGNvbW1hbmQ6IHJlYWQKKwkJCS8vIGZyb20gSTJDIEVFUFJPTQorCQkJLy8gZGV2aWNlLgorCQkJfCBJMkNfQjEoSTJDX0FUVFJTVE9QLCAwKQkvLyBCeXRlMSByZWNlaXZlcworCQkJLy8gdWludDhfdCBmcm9tCisJCQkvLyBFRVBST00uCisJCQl8IEkyQ19CMChJMkNfQVRUUk5PUCwgMCkpKQkvLyBCeXRlMCA9IE5vdAorCQkvLyBzZW50LgorCXsKKwkJLy8gQWJvcnQgZnVuY3Rpb24gYW5kIGRlY2xhcmUgZXJyb3IgaWYgaGFuZHNoYWtlIGZhaWxlZC4KKwkJREVCVUcoIkkyQ3JlYWQ6IGVycm9yIGhhbmRzaGFrZSBJMkNyZWFkIGJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJLy8gUmV0dXJuIGNvcHkgb2YgRUVQUk9NIHZhbHVlLgorCXJ0bnZhbCA9ICh1aW50OF90KSAoUlI3MTQ2KFBfSTJDQ1RSTCkgPj4gMTYpOworCXJldHVybiBydG52YWw7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBJMkNoYW5kc2hha2UoY29tZWRpX2RldmljZSAqIGRldiwgdWludDMyX3QgdmFsKQoreworCS8vIFdyaXRlIEkyQyBjb21tYW5kIHRvIEkyQyBUcmFuc2ZlciBDb250cm9sIHNoYWRvdyByZWdpc3Rlci4KKwlXUjcxNDYoUF9JMkNDVFJMLCB2YWwpOworCisJLy8gVXBsb2FkIEkyQyBzaGFkb3cgcmVnaXN0ZXJzIGludG8gd29ya2luZyByZWdpc3RlcnMgYW5kIHdhaXQgZm9yCisJLy8gdXBsb2FkIGNvbmZpcm1hdGlvbi4KKworCU1DX0VOQUJMRShQX01DMiwgTUMyX1VQTERfSUlDKTsKKwl3aGlsZSAoIU1DX1RFU1QoUF9NQzIsIE1DMl9VUExEX0lJQykpIDsKKworCS8vIFdhaXQgdW50aWwgSTJDIGJ1cyB0cmFuc2ZlciBpcyBmaW5pc2hlZCBvciBhbiBlcnJvciBvY2N1cnMuCisJd2hpbGUgKChSUjcxNDYoUF9JMkNDVFJMKSAmIChJMkNfQlVTWSB8IEkyQ19FUlIpKSA9PSBJMkNfQlVTWSkgOworCisJLy8gUmV0dXJuIG5vbi16ZXJvIGlmIEkyQyBlcnJvciBvY2N1cmVkLgorCXJldHVybiBSUjcxNDYoUF9JMkNDVFJMKSAmIEkyQ19FUlI7CisKK30KKworLy8gUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb246IFdyaXRlIHNldHBvaW50IHRvIGFuIGFwcGxpY2F0aW9uIERBQyBjaGFubmVsLgorCitzdGF0aWMgdm9pZCBTZXREQUMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgY2hhbiwgc2hvcnQgZGFjZGF0YSkKK3sKKwlyZWdpc3RlciB1aW50MTZfdCBzaWdubWFzazsKKwlyZWdpc3RlciB1aW50MzJfdCBXU0ltYWdlOworCisJLy8gQWRqdXN0IERBQyBkYXRhIHBvbGFyaXR5IGFuZCBzZXQgdXAgUG9sYXJpdHkgQ29udHJvbCBSZWdpc3RlcgorCS8vIGltYWdlLgorCXNpZ25tYXNrID0gMSA8PCBjaGFuOworCWlmIChkYWNkYXRhIDwgMCkgeworCQlkYWNkYXRhID0gLWRhY2RhdGE7CisJCWRldnByaXYtPkRhY3BvbCB8PSBzaWdubWFzazsKKwl9IGVsc2UKKwkJZGV2cHJpdi0+RGFjcG9sICY9IH5zaWdubWFzazsKKworCS8vIExpbWl0IERBQyBzZXRwb2ludCB2YWx1ZSB0byB2YWxpZCByYW5nZS4KKwlpZiAoKHVpbnQxNl90KSBkYWNkYXRhID4gMHgxRkZGKQorCQlkYWNkYXRhID0gMHgxRkZGOworCisJLy8gU2V0IHVwIFRTTDIgcmVjb3JkcyAoYWthICJ2ZWN0b3JzIikgZm9yIERBQyB1cGRhdGUuICBWZWN0b3JzIFYyCisJLy8gYW5kIFYzIHRyYW5zbWl0IHRoZSBzZXRwb2ludCB0byB0aGUgdGFyZ2V0IERBQy4gIFY0IGFuZCBWNSBzZW5kCisJLy8gZGF0YSB0byBhIG5vbi1leGlzdGVudCBUcmltRGFjIGNoYW5uZWwganVzdCB0byBrZWVwIHRoZSBjbG9jaworCS8vIHJ1bm5pbmcgYWZ0ZXIgc2VuZGluZyBkYXRhIHRvIHRoZSB0YXJnZXQgREFDLiAgVGhpcyBpcyBuZWNlc3NhcnkKKwkvLyB0byBlbGltaW5hdGUgdGhlIGNsb2NrIGdsaXRjaCB0aGF0IHdvdWxkIG90aGVyd2lzZSBvY2N1ciBhdCB0aGUKKwkvLyBlbmQgb2YgdGhlIHRhcmdldCBEQUMncyBzZXJpYWwgZGF0YSBzdHJlYW0uICBXaGVuIHRoZSBzZXF1ZW5jZQorCS8vIHJlc3RhcnRzIGF0IFYwIChhZnRlciBleGVjdXRpbmcgVjUpLCB0aGUgZ2F0ZSBhcnJheSBhdXRvbWF0aWNhbGx5CisJLy8gZGlzYWJsZXMgZ2F0aW5nIGZvciB0aGUgREFDIGNsb2NrIGFuZCBhbGwgREFDIGNoaXAgc2VsZWN0cy4KKwlXU0ltYWdlID0gKGNoYW4gJiAyKSA/IFdTMSA6IFdTMjsJLy8gQ2hvb3NlIERBQyBjaGlwIHNlbGVjdCB0bworCS8vIGJlIGFzc2VydGVkLgorCVNFVFZFQ1QoMiwgWFNEMiB8IFhGSUZPXzEgfCBXU0ltYWdlKTsJLy8gU2xvdCAyOiBUcmFuc21pdCBoaWdoCisJLy8gZGF0YSBieXRlIHRvIHRhcmdldCBEQUMuCisJU0VUVkVDVCgzLCBYU0QyIHwgWEZJRk9fMCB8IFdTSW1hZ2UpOwkvLyBTbG90IDM6IFRyYW5zbWl0IGxvdyBkYXRhCisJLy8gYnl0ZSB0byB0YXJnZXQgREFDLgorCVNFVFZFQ1QoNCwgWFNEMiB8IFhGSUZPXzMgfCBXUzMpOwkvLyBTbG90IDQ6IFRyYW5zbWl0IHRvCisJLy8gbm9uLWV4aXN0ZW50IFRyaW1EYWMKKwkvLyBjaGFubmVsIHRvIGtlZXAgY2xvY2sKKwlTRVRWRUNUKDUsIFhTRDIgfCBYRklGT18yIHwgV1MzIHwgRU9TKTsJLy8gU2xvdCA1OiBydW5uaW5nIGFmdGVyCisJLy8gd3JpdGluZyB0YXJnZXQgREFDJ3MKKwkvLyBsb3cgZGF0YSBieXRlLgorCisJLy8gQ29uc3RydWN0IGFuZCB0cmFuc21pdCB0YXJnZXQgREFDJ3Mgc2VyaWFsIHBhY2tldDogKCBBMTBEIEREREQKKwkvLyApLCggRERERCBEREREICksKCAweDBGICksKCAweDAwICkgd2hlcmUgQSBpcyBjaGFuPDA+LCBhbmQgRDwxMjowPgorCS8vIGlzIHRoZSBEQUMgc2V0cG9pbnQuICBBcHBlbmQgYSBXT1JEIHZhbHVlICh0aGF0IHdyaXRlcyB0byBhCisJLy8gbm9uLWV4aXN0ZW50IFRyaW1EYWMgY2hhbm5lbCkgdGhhdCBzZXJ2ZXMgdG8ga2VlcCB0aGUgY2xvY2sKKwkvLyBydW5uaW5nIGFmdGVyIHRoZSBwYWNrZXQgaGFzIGJlZW4gc2VudCB0byB0aGUgdGFyZ2V0IERBQy4KKwlTZW5kREFDKGRldiwgMHgwRjAwMDAwMAkvL0NvbnRpbnVlIGNsb2NrIGFmdGVyIHRhcmdldCBEQUMKKwkJLy9kYXRhICh3cml0ZSB0byBub24tZXhpc3RlbnQKKwkJLy90cmltZGFjKS4KKwkJfCAweDAwMDA0MDAwCS8vIEFkZHJlc3MgdGhlIHR3byBtYWluIGR1YWwtREFDCisJCS8vIGRldmljZXMgKFRTTCdzIGNoaXAgc2VsZWN0IGVuYWJsZXMKKwkJLy8gdGFyZ2V0IGRldmljZSkuCisJCXwgKCh1aW50MzJfdCkgKGNoYW4gJiAxKSA8PCAxNSkJLy8gQWRkcmVzcyB0aGUgREFDCisJCS8vIGNoYW5uZWwgd2l0aGluIHRoZQorCQkvLyBkZXZpY2UuCisJCXwgKHVpbnQzMl90KSBkYWNkYXRhKTsJLy8gSW5jbHVkZSBEQUMgc2V0cG9pbnQgZGF0YS4KKworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb246IFRyYW5zbWl0IHNlcmlhbCBkYXRhIHRvIERBQyB2aWEgQXVkaW8KKy8vIGNoYW5uZWwgMi4gIEFzc3VtZXM6ICgxKSBUU0wyIHNsb3QgcmVjb3JkcyBpbml0aWFsaXplZCwgYW5kICgyKQorLy8gRGFjcG9sIGNvbnRhaW5zIHZhbGlkIHRhcmdldCBpbWFnZS4KKworc3RhdGljIHZvaWQgU2VuZERBQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MzJfdCB2YWwpCit7CisKKwkvLyBTVEFSVCBUSEUgU0VSSUFMIENMT0NLIFJVTk5JTkcgLS0tLS0tLS0tLS0tLQorCisJLy8gQXNzZXJ0IERBQyBwb2xhcml0eSBjb250cm9sIGFuZCBlbmFibGUgZ2F0aW5nIG9mIERBQyBzZXJpYWwgY2xvY2sKKwkvLyBhbmQgYXVkaW8gYml0IHN0cmVhbSBzaWduYWxzLiAgQXQgdGhpcyBwb2ludCBpbiB0aW1lIHdlIG11c3QgYmUKKwkvLyBhc3N1cmVkIG9mIGJlaW5nIGluIHRpbWUgc2xvdCAwLiAgSWYgd2UgYXJlIG5vdCBpbiBzbG90IDAsIHRoZQorCS8vIHNlcmlhbCBjbG9jayBhbmQgYXVkaW8gc3RyZWFtIHNpZ25hbHMgd2lsbCBiZSBkaXNhYmxlZDsgdGhpcyBpcworCS8vIGJlY2F1c2UgdGhlIGZvbGxvd2luZyBERUJJd3JpdGUgc3RhdGVtZW50ICh3aGljaCBlbmFibGVzIHNpZ25hbHMKKwkvLyB0byBiZSBwYXNzZWQgdGhyb3VnaCB0aGUgZ2F0ZSBhcnJheSkgd291bGQgZXhlY3V0ZSBiZWZvcmUgdGhlCisJLy8gdHJhaWxpbmcgZWRnZSBvZiBXUzEvV1MzICh3aGljaCB0dXJucyBvZmYgdGhlIHNpZ25hbHMpLCB0aHVzCisJLy8gY2F1c2luZyB0aGUgc2lnbmFscyB0byBiZSBpbmFjdGl2ZSBkdXJpbmcgdGhlIERBQyB3cml0ZS4KKwlERUJJd3JpdGUoZGV2LCBMUF9EQUNQT0wsIGRldnByaXYtPkRhY3BvbCk7CisKKwkvLyBUUkFOU0ZFUiBPVVRQVVQgRFdPUkQgVkFMVUUgSU5UTyBBMidTIE9VVFBVVCBGSUZPIC0tLS0tLS0tLS0tLS0tLS0KKworCS8vIENvcHkgREFDIHNldHBvaW50IHZhbHVlIHRvIERBQydzIG91dHB1dCBETUEgYnVmZmVyLgorCisJLy9XUjcxNDYoICh1aW50MzJfdClkZXZwcml2LT5wRGFjV0J1ZiwgdmFsICk7CisJKmRldnByaXYtPnBEYWNXQnVmID0gdmFsOworCisJLy8gZW5hYiB0aGUgb3V0cHV0IERNQSB0cmFuc2Zlci4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgRE1BQyB0byBjb3B5CisJLy8gdGhlIERBQydzIGRhdGEgdmFsdWUgdG8gQTIncyBvdXRwdXQgRklGTy4gIFRoZSBETUEgdHJhbnNmZXIgd2lsbAorCS8vIHRoZW4gaW1tZWRpYXRlbHkgdGVybWluYXRlIGJlY2F1c2UgdGhlIHByb3RlY3Rpb24gYWRkcmVzcyBpcworCS8vIHJlYWNoZWQgdXBvbiB0cmFuc2ZlciBvZiB0aGUgZmlyc3QgRFdPUkQgdmFsdWUuCisJTUNfRU5BQkxFKFBfTUMxLCBNQzFfQTJPVVQpOworCisJLy8gV2hpbGUgdGhlIERNQSB0cmFuc2ZlciBpcyBleGVjdXRpbmcgLi4uCisKKwkvLyBSZXNldCBBdWRpbzIgb3V0cHV0IEZJRk8ncyB1bmRlcmZsb3cgZmxhZyAoYWxvbmcgd2l0aCBhbnkgb3RoZXIKKwkvLyBGSUZPIHVuZGVyZmxvdy9vdmVyZmxvdyBmbGFncykuICBXaGVuIHNldCwgdGhpcyBmbGFnIHdpbGwKKwkvLyBpbmRpY2F0ZSB0aGF0IHdlIGhhdmUgZW1lcmdlZCBmcm9tIHNsb3QgMC4KKwlXUjcxNDYoUF9JU1IsIElTUl9BRk9VKTsKKworCS8vIFdhaXQgZm9yIHRoZSBETUEgdHJhbnNmZXIgdG8gZmluaXNoIHNvIHRoYXQgdGhlcmUgd2lsbCBiZSBkYXRhCisJLy8gYXZhaWxhYmxlIGluIHRoZSBGSUZPIHdoZW4gdGltZSBzbG90IDEgdHJpZXMgdG8gdHJhbnNmZXIgYSBEV09SRAorCS8vIGZyb20gdGhlIEZJRk8gdG8gdGhlIG91dHB1dCBidWZmZXIgcmVnaXN0ZXIuICBXZSB0ZXN0IGZvciBETUEKKwkvLyBEb25lIGJ5IHBvbGxpbmcgdGhlIERNQUMgZW5hYmxlIGZsYWc7IHRoaXMgZmxhZyBpcyBhdXRvbWF0aWNhbGx5CisJLy8gY2xlYXJlZCB3aGVuIHRoZSB0cmFuc2ZlciBoYXMgZmluaXNoZWQuCisJd2hpbGUgKChSUjcxNDYoUF9NQzEpICYgTUMxX0EyT1VUKSAhPSAwKSA7CisKKwkvLyBTVEFSVCBUSEUgT1VUUFVUIFNUUkVBTSBUTyBUSEUgVEFSR0VUIERBQyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gRklGTyBkYXRhIGlzIG5vdyBhdmFpbGFibGUsIHNvIHdlIGVuYWJsZSBleGVjdXRpb24gb2YgdGltZSBzbG90cworCS8vIDEgYW5kIGhpZ2hlciBieSBjbGVhcmluZyB0aGUgRU9TIGZsYWcgaW4gc2xvdCAwLiAgTm90ZSB0aGF0IFNEMworCS8vIHdpbGwgYmUgc2hpZnRlZCBpbiBhbmQgc3RvcmVkIGluIEZCX0JVRkZFUjIgZm9yIGVuZC1vZi1zbG90LWxpc3QKKwkvLyBkZXRlY3Rpb24uCisJU0VUVkVDVCgwLCBYU0QyIHwgUlNEMyB8IFNJQl9BMik7CisKKwkvLyBXYWl0IGZvciBzbG90IDEgdG8gZXhlY3V0ZSB0byBlbnN1cmUgdGhhdCB0aGUgUGFja2V0IHdpbGwgYmUKKwkvLyB0cmFuc21pdHRlZC4gIFRoaXMgaXMgZGV0ZWN0ZWQgYnkgcG9sbGluZyB0aGUgQXVkaW8yIG91dHB1dCBGSUZPCisJLy8gdW5kZXJmbG93IGZsYWcsIHdoaWNoIHdpbGwgYmUgc2V0IHdoZW4gc2xvdCAxIGV4ZWN1dGlvbiBoYXMKKwkvLyBmaW5pc2hlZCB0cmFuc2ZlcnJpbmcgdGhlIERBQydzIGRhdGEgRFdPUkQgZnJvbSB0aGUgb3V0cHV0IEZJRk8KKwkvLyB0byB0aGUgb3V0cHV0IGJ1ZmZlciByZWdpc3Rlci4KKwl3aGlsZSAoKFJSNzE0NihQX1NTUikgJiBTU1JfQUYyX09VVCkgPT0gMCkgOworCisJLy8gU2V0IHVwIHRvIHRyYXAgZXhlY3V0aW9uIGF0IHNsb3QgMCB3aGVuIHRoZSBUU0wgc2VxdWVuY2VyIGN5Y2xlcworCS8vIGJhY2sgdG8gc2xvdCAwIGFmdGVyIGV4ZWN1dGluZyB0aGUgRU9TIGluIHNsb3QgNS4gIEFsc28sCisJLy8gc2ltdWx0YW5lb3VzbHkgc2hpZnQgb3V0IGFuZCBpbiB0aGUgMHgwMCB0aGF0IGlzIEFMV0FZUyB0aGUgdmFsdWUKKwkvLyBzdG9yZWQgaW4gdGhlIGxhc3QgYnl0ZSB0byBiZSBzaGlmdGVkIG91dCBvZiB0aGUgRklGTydzIERXT1JECisJLy8gYnVmZmVyIHJlZ2lzdGVyLgorCVNFVFZFQ1QoMCwgWFNEMiB8IFhGSUZPXzIgfCBSU0QyIHwgU0lCX0EyIHwgRU9TKTsKKworCS8vIFdBSVQgRk9SIFRIRSBUUkFOU0FDVElPTiBUTyBGSU5JU0ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8vIFdhaXQgZm9yIHRoZSBUU0wgdG8gZmluaXNoIGV4ZWN1dGluZyBhbGwgdGltZSBzbG90cyBiZWZvcmUKKwkvLyBleGl0aW5nIHRoaXMgZnVuY3Rpb24uICBXZSBtdXN0IGRvIHRoaXMgc28gdGhhdCB0aGUgbmV4dCBEQUMKKwkvLyB3cml0ZSBkb2Vzbid0IHN0YXJ0LCB0aGVyZWJ5IGVuYWJsaW5nIGNsb2NrL2NoaXAgc2VsZWN0IHNpZ25hbHM6CisJLy8gMS4gQmVmb3JlIHRoZSBUU0wgc2VxdWVuY2UgY3ljbGVzIGJhY2sgdG8gc2xvdCAwLCB3aGljaCBkaXNhYmxlcworCS8vIHRoZSBjbG9jay9jcyBzaWduYWwgZ2F0aW5nIGFuZCB0cmFwcyBzbG90IC8vIGxpc3QgZXhlY3V0aW9uLiAgSWYKKwkvLyB3ZSBoYXZlIG5vdCB5ZXQgZmluaXNoZWQgc2xvdCA1IHRoZW4gdGhlIGNsb2NrL2NzIHNpZ25hbHMgYXJlCisJLy8gc3RpbGwgZ2F0ZWQgYW5kIHdlIGhhdmUgLy8gbm90IGZpbmlzaGVkIHRyYW5zbWl0dGluZyB0aGUgc3RyZWFtLgorCS8vIDIuIFdoaWxlIHNsb3RzIDItNSBhcmUgZXhlY3V0aW5nIGR1ZSB0byBhIGxhdGUgc2xvdCAwIHRyYXAuICBJbgorCS8vIHRoaXMgY2FzZSwgdGhlIHNsb3Qgc2VxdWVuY2UgaXMgY3VycmVudGx5IC8vIHJlcGVhdGluZywgYnV0IHdpdGgKKwkvLyBjbG9jay9jcyBzaWduYWxzIGRpc2FibGVkLiAgV2UgbXVzdCB3YWl0IGZvciBzbG90IDAgdG8gdHJhcAorCS8vIGV4ZWN1dGlvbiBiZWZvcmUgc2V0dGluZyAvLyB1cCB0aGUgbmV4dCBEQUMgc2V0cG9pbnQgRE1BIHRyYW5zZmVyCisJLy8gYW5kIGVuYWJsaW5nIHRoZSBjbG9jay9jcyBzaWduYWxzLiAgVG8gZGV0ZWN0IHRoZSBlbmQgb2Ygc2xvdCA1LAorCS8vIHdlIHRlc3QgZm9yIHRoZSBGQl9CVUZGRVIyIE1TQiBjb250ZW50cyB0byBiZSBlcXVhbCB0byAweEZGLiAgSWYKKwkvLyB0aGUgVFNMIGhhcyBub3QgeWV0IGZpbmlzaGVkIGV4ZWN1dGluZyBzbG90IDUgLi4uCisJaWYgKChSUjcxNDYoUF9GQl9CVUZGRVIyKSAmIDB4RkYwMDAwMDApICE9IDApIHsKKwkJLy8gVGhlIHRyYXAgd2FzIHNldCBvbiB0aW1lIGFuZCB3ZSBhcmUgc3RpbGwgZXhlY3V0aW5nIHNvbWV3aGVyZQorCQkvLyBpbiBzbG90cyAyLTUsIHNvIHdlIG5vdyB3YWl0IGZvciBzbG90IDAgdG8gZXhlY3V0ZSBhbmQgdHJhcAorCQkvLyBUU0wgZXhlY3V0aW9uLiAgVGhpcyBpcyBkZXRlY3RlZCB3aGVuIEZCX0JVRkZFUjIgTVNCIGNoYW5nZXMKKwkJLy8gZnJvbSAweEZGIHRvIDB4MDAsIHdoaWNoIHNsb3QgMCBjYXVzZXMgdG8gaGFwcGVuIGJ5IHNoaWZ0aW5nCisJCS8vIG91dC9pbiBvbiBTRDIgdGhlIDB4MDAgdGhhdCBpcyBhbHdheXMgcmVmZXJlbmNlZCBieSBzbG90IDUuCisJCXdoaWxlICgoUlI3MTQ2KFBfRkJfQlVGRkVSMikgJiAweEZGMDAwMDAwKSAhPSAwKSA7CisJfQorCS8vIEVpdGhlciAoMSkgd2Ugd2VyZSB0b28gbGF0ZSBzZXR0aW5nIHRoZSBzbG90IDAgdHJhcDsgdGhlIFRTTAorCS8vIHNlcXVlbmNlciByZXN0YXJ0ZWQgc2xvdCAwIGJlZm9yZSB3ZSBjb3VsZCBzZXQgdGhlIEVPUyB0cmFwIGZsYWcsCisJLy8gb3IgKDIpIHdlIHdlcmUgbm90IGxhdGUgYW5kIGV4ZWN1dGlvbiBpcyBub3cgdHJhcHBlZCBhdCBzbG90IDAuCisJLy8gSW4gZWl0aGVyIGNhc2UsIHdlIG11c3Qgbm93IGNoYW5nZSBzbG90IDAgc28gdGhhdCBpdCB3aWxsIHN0b3JlCisJLy8gdmFsdWUgMHhGRiAoaW5zdGVhZCBvZiAweDAwKSB0byBGQl9CVUZGRVIyIG5leHQgdGltZSBpdCBleGVjdXRlcy4KKwkvLyBJbiBvcmRlciB0byBkbyB0aGlzLCB3ZSByZXByb2dyYW0gc2xvdCAwIHNvIHRoYXQgaXQgd2lsbCBzaGlmdCBpbgorCS8vIFNEMywgd2hpY2ggaXMgZHJpdmVuIG9ubHkgYnkgYSBwdWxsLXVwIHJlc2lzdG9yLgorCVNFVFZFQ1QoMCwgUlNEMyB8IFNJQl9BMiB8IEVPUyk7CisKKwkvLyBXYWl0IGZvciBzbG90IDAgdG8gZXhlY3V0ZSwgYXQgd2hpY2ggdGltZSB0aGUgVFNMIGlzIHNldHVwIGZvcgorCS8vIHRoZSBuZXh0IERBQyB3cml0ZS4gIFRoaXMgaXMgZGV0ZWN0ZWQgd2hlbiBGQl9CVUZGRVIyIE1TQiBjaGFuZ2VzCisJLy8gZnJvbSAweDAwIHRvIDB4RkYuCisJd2hpbGUgKChSUjcxNDYoUF9GQl9CVUZGRVIyKSAmIDB4RkYwMDAwMDApID09IDApIDsKK30KKworc3RhdGljIHZvaWQgV3JpdGVNSVNDMihjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBOZXdJbWFnZSkKK3sKKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfV0VOQUJMRSk7CS8vIGVuYWIgd3JpdGVzIHRvCisJLy8gTUlTQzIgcmVnaXN0ZXIuCisJREVCSXdyaXRlKGRldiwgTFBfV1JNSVNDMiwgTmV3SW1hZ2UpOwkvLyBXcml0ZSBuZXcgaW1hZ2UgdG8gTUlTQzIuCisJREVCSXdyaXRlKGRldiwgTFBfTUlTQzEsIE1JU0MxX1dESVNBQkxFKTsJLy8gRGlzYWJsZSB3cml0ZXMgdG8gTUlTQzIuCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW5pdGlhbGl6ZSB0aGUgREVCSSBpbnRlcmZhY2UgZm9yIGFsbCB0cmFuc2ZlcnMuCisKK3N0YXRpYyB1aW50MTZfdCBERUJJcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyKQoreworCXVpbnQxNl90IHJldHZhbDsKKworCS8vIFNldCB1cCBERUJJIGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWUgaW4gc2hhZG93IFJBTS4KKwlXUjcxNDYoUF9ERUJJQ01ELCBERUJJX0NNRF9SRFdPUkQgfCBhZGRyKTsKKworCS8vIEV4ZWN1dGUgdGhlIERFQkkgdHJhbnNmZXIuCisJREVCSXRyYW5zZmVyKGRldik7CisKKwkvLyBGZXRjaCB0YXJnZXQgcmVnaXN0ZXIgdmFsdWUuCisJcmV0dmFsID0gKHVpbnQxNl90KSBSUjcxNDYoUF9ERUJJQUQpOworCisJLy8gUmV0dXJuIHJlZ2lzdGVyIHZhbHVlLgorCXJldHVybiByZXR2YWw7Cit9CisKKy8vIEV4ZWN1dGUgYSBERUJJIHRyYW5zZmVyLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhCisvLyBjcml0aWNhbCBzZWN0aW9uLgorc3RhdGljIHZvaWQgREVCSXRyYW5zZmVyKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJLy8gSW5pdGlhdGUgdXBsb2FkIG9mIHNoYWRvdyBSQU0gdG8gREVCSSBjb250cm9sIHJlZ2lzdGVyLgorCU1DX0VOQUJMRShQX01DMiwgTUMyX1VQTERfREVCSSk7CisKKwkvLyBXYWl0IGZvciBjb21wbGV0aW9uIG9mIHVwbG9hZCBmcm9tIHNoYWRvdyBSQU0gdG8gREVCSSBjb250cm9sCisJLy8gcmVnaXN0ZXIuCisJd2hpbGUgKCFNQ19URVNUKFBfTUMyLCBNQzJfVVBMRF9ERUJJKSkgOworCisJLy8gV2FpdCB1bnRpbCBERUJJIHRyYW5zZmVyIGlzIGRvbmUuCisJd2hpbGUgKFJSNzE0NihQX1BTUikgJiBQU1JfREVCSV9TKSA7Cit9CisKKy8vIFdyaXRlIGEgdmFsdWUgdG8gYSBnYXRlIGFycmF5IHJlZ2lzdGVyLgorc3RhdGljIHZvaWQgREVCSXdyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGFkZHIsIHVpbnQxNl90IHdkYXRhKQoreworCisJLy8gU2V0IHVwIERFQkkgY29udHJvbCByZWdpc3RlciB2YWx1ZSBpbiBzaGFkb3cgUkFNLgorCVdSNzE0NihQX0RFQklDTUQsIERFQklfQ01EX1dSV09SRCB8IGFkZHIpOworCVdSNzE0NihQX0RFQklBRCwgd2RhdGEpOworCisJLy8gRXhlY3V0ZSB0aGUgREVCSSB0cmFuc2Zlci4KKwlERUJJdHJhbnNmZXIoZGV2KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBiaXRzIGluIGEgZ2F0ZSBhcnJheSByZWdpc3Rlci4gIEltcG9ydHM6IG1hc2sKKy8vIHNwZWNpZmllcyBiaXRzIHRoYXQgYXJlIHRvIGJlIHByZXNlcnZlZCwgd2RhdGEgaXMgbmV3IHZhbHVlIHRvIGJlCisvLyBvcidkIHdpdGggdGhlIG1hc2tlZCBvcmlnaW5hbC4KK3N0YXRpYyB2b2lkIERFQklyZXBsYWNlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGFkZHIsIHVpbnQxNl90IG1hc2ssCisJdWludDE2X3Qgd2RhdGEpCit7CisKKwkvLyBDb3B5IHRhcmdldCBnYXRlIGFycmF5IHJlZ2lzdGVyIGludG8gUF9ERUJJQUQgcmVnaXN0ZXIuCisJV1I3MTQ2KFBfREVCSUNNRCwgREVCSV9DTURfUkRXT1JEIHwgYWRkcik7CS8vIFNldCB1cCBERUJJIGNvbnRyb2wKKwkvLyByZWcgdmFsdWUgaW4gc2hhZG93CisJLy8gUkFNLgorCURFQkl0cmFuc2ZlcihkZXYpOwkvLyBFeGVjdXRlIHRoZSBERUJJCisJLy8gUmVhZCB0cmFuc2Zlci4KKworCS8vIFdyaXRlIGJhY2sgdGhlIG1vZGlmaWVkIGltYWdlLgorCVdSNzE0NihQX0RFQklDTUQsIERFQklfQ01EX1dSV09SRCB8IGFkZHIpOwkvLyBTZXQgdXAgREVCSSBjb250cm9sCisJLy8gcmVnIHZhbHVlIGluIHNoYWRvdworCS8vIFJBTS4KKworCVdSNzE0NihQX0RFQklBRCwgd2RhdGEgfCAoKHVpbnQxNl90KSBSUjcxNDYoUF9ERUJJQUQpICYgbWFzaykpOwkvLyBNb2RpZnkgdGhlIHJlZ2lzdGVyIGltYWdlLgorCURFQkl0cmFuc2ZlcihkZXYpOwkvLyBFeGVjdXRlIHRoZSBERUJJIFdyaXRlIHRyYW5zZmVyLgorfQorCitzdGF0aWMgdm9pZCBDbG9zZURNQUIoY29tZWRpX2RldmljZSAqIGRldiwgRE1BQlVGICogcGRtYSwgc2l6ZV90IGJzaXplKQoreworCXZvaWQgKnZicHRyOworCWRtYV9hZGRyX3QgdnBwdHI7CisKKwlERUJVRygiQ2xvc2VETUFCOiBFbnRlcmluZyBTNjI2RFJWX0Nsb3NlRE1BQigpOlxuIik7CisJaWYgKHBkbWEgPT0gTlVMTCkKKwkJcmV0dXJuOworCS8vZmluZCB0aGUgbWF0Y2hpbmcgYWxsb2NhdGlvbiBmcm9tIHRoZSBib2FyZCBzdHJ1Y3QKKworCXZicHRyID0gcGRtYS0+TG9naWNhbEJhc2U7CisJdnBwdHIgPSBwZG1hLT5QaHlzaWNhbEJhc2U7CisJaWYgKHZicHRyKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGRldiwgYnNpemUsIHZicHRyLCB2cHB0cik7CisJCXBkbWEtPkxvZ2ljYWxCYXNlID0gMDsKKwkJcGRtYS0+UGh5c2ljYWxCYXNlID0gMDsKKworCQlERUJVRygiQ2xvc2VETUFCKCk6IExvZ2ljYWw9JXAsIGJzaXplPSVkLCBQaHlzaWNhbD0weCV4XG4iLAorCQkJdmJwdHIsIGJzaXplLCAodWludDMyX3QpIHZwcHRyKTsKKwl9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8gIENPVU5URVIgRlVOQ1RJT05TICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFsbCBjb3VudGVyIGZ1bmN0aW9ucyBhZGRyZXNzIGEgc3BlY2lmaWMgY291bnRlciBieSBtZWFucyBvZiB0aGUKKy8vICJDb3VudGVyIiBhcmd1bWVudCwgd2hpY2ggaXMgYSBsb2dpY2FsIGNvdW50ZXIgbnVtYmVyLiAgVGhlIENvdW50ZXIKKy8vIGFyZ3VtZW50IG1heSBoYXZlIGFueSBvZiB0aGUgZm9sbG93aW5nIGxlZ2FsIHZhbHVlczogMD0wQSwgMT0xQSwKKy8vIDI9MkEsIDM9MEIsIDQ9MUIsIDU9MkIuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gYm90aCBBIGFuZCBCCisvLyBjb3VudGVyczoKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLyBQUklWQVRFIENPVU5URVIgRlVOQ1RJT05TICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVhZCBhIGNvdW50ZXIncyBvdXRwdXQgbGF0Y2guCisKK3N0YXRpYyB1aW50MzJfdCBSZWFkTGF0Y2goY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJlZ2lzdGVyIHVpbnQzMl90IHZhbHVlOworCS8vREVCVUcgRklYTUUgREVCVUcoIlJlYWRMYXRjaDogUmVhZCBMYXRjaCBlbnRlclxuIik7CisKKwkvLyBMYXRjaCBjb3VudHMgYW5kIGZldGNoIExTVyBvZiBsYXRjaGVkIGNvdW50cyB2YWx1ZS4KKwl2YWx1ZSA9ICh1aW50MzJfdCkgREVCSXJlYWQoZGV2LCBrLT5NeUxhdGNoTHN3KTsKKworCS8vIEZldGNoIE1TVyBvZiBsYXRjaGVkIGNvdW50cyBhbmQgY29tYmluZSB3aXRoIExTVy4KKwl2YWx1ZSB8PSAoKHVpbnQzMl90KSBERUJJcmVhZChkZXYsIGstPk15TGF0Y2hMc3cgKyAyKSA8PCAxNik7CisKKwkvLyBERUJVRyBGSVhNRSBERUJVRygiUmVhZExhdGNoOiBSZWFkIExhdGNoIGV4aXRcbiIpOworCisJLy8gUmV0dXJuIGxhdGNoZWQgY291bnRzLgorCXJldHVybiB2YWx1ZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVzZXQgYSBjb3VudGVyJ3MgaW5kZXggYW5kIG92ZXJmbG93IGV2ZW50IGNhcHR1cmUgZmxhZ3MuCisKK3N0YXRpYyB2b2lkIFJlc2V0Q2FwRmxhZ3NfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwgKHVpbnQxNl90KSAofkNSQk1TS19JTlRDVFJMKSwKKwkJQ1JCTVNLX0lOVFJFU0VUQ01EIHwgQ1JCTVNLX0lOVFJFU0VUX0EpOworfQorCitzdGF0aWMgdm9pZCBSZXNldENhcEZsYWdzX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsICh1aW50MTZfdCkgKH5DUkJNU0tfSU5UQ1RSTCksCisJCUNSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9CKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmV0dXJuIGNvdW50ZXIgc2V0dXAgaW4gYSBmb3JtYXQgKENPVU5URVJfU0VUVVApIHRoYXQgaXMgY29uc2lzdGVudAorLy8gZm9yIGJvdGggQSBhbmQgQiBjb3VudGVycy4KKworc3RhdGljIHVpbnQxNl90IEdldE1vZGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JhOworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYjsKKwlyZWdpc3RlciB1aW50MTZfdCBzZXR1cDsKKworCS8vIEZldGNoIENSQSBhbmQgQ1JCIHJlZ2lzdGVyIGltYWdlcy4KKwljcmEgPSBERUJJcmVhZChkZXYsIGstPk15Q1JBKTsKKwljcmIgPSBERUJJcmVhZChkZXYsIGstPk15Q1JCKTsKKworCS8vIFBvcHVsYXRlIHRoZSBzdGFuZGFyZGl6ZWQgY291bnRlciBzZXR1cCBiaXQgZmllbGRzLiAgTm90ZToKKwkvLyBJbmRleFNyYyBpcyByZXN0cmljdGVkIHRvIEVOQ19YIG9yIEluZHhQb2wuCisJc2V0dXAgPSAoKGNyYSAmIFNURE1TS19MT0FEU1JDKQkvLyBMb2FkU3JjICA9IExvYWRTcmNBLgorCQl8ICgoY3JiIDw8IChTVERCSVRfTEFUQ0hTUkMgLSBDUkJCSVRfTEFUQ0hTUkMpKSAmIFNURE1TS19MQVRDSFNSQykJLy8gTGF0Y2hTcmMgPSBMYXRjaFNyY0EuCisJCXwgKChjcmEgPDwgKFNUREJJVF9JTlRTUkMgLSBDUkFCSVRfSU5UU1JDX0EpKSAmIFNURE1TS19JTlRTUkMpCS8vIEludFNyYyAgID0gSW50U3JjQS4KKwkJfCAoKGNyYSA8PCAoU1REQklUX0lORFhTUkMgLSAoQ1JBQklUX0lORFhTUkNfQSArIDEpKSkgJiBTVERNU0tfSU5EWFNSQykJLy8gSW5keFNyYyAgPSBJbmR4U3JjQTwxPi4KKwkJfCAoKGNyYSA+PiAoQ1JBQklUX0lORFhQT0xfQSAtIFNUREJJVF9JTkRYUE9MKSkgJiBTVERNU0tfSU5EWFBPTCkJLy8gSW5keFBvbCAgPSBJbmR4UG9sQS4KKwkJfCAoKGNyYiA+PiAoQ1JCQklUX0NMS0VOQUJfQSAtIFNUREJJVF9DTEtFTkFCKSkgJiBTVERNU0tfQ0xLRU5BQikpOwkvLyBDbGtFbmFiICA9IENsa0VuYWJBLgorCisJLy8gQWRqdXN0IG1vZGUtZGVwZW5kZW50IHBhcmFtZXRlcnMuCisJaWYgKGNyYSAmICgyIDw8IENSQUJJVF9DTEtTUkNfQSkpCS8vIElmIFRpbWVyIG1vZGUgKENsa1NyY0E8MT4gPT0gMSk6CisJCXNldHVwIHw9ICgoQ0xLU1JDX1RJTUVSIDw8IFNUREJJVF9DTEtTUkMpCS8vICAgSW5kaWNhdGUgVGltZXIgbW9kZS4KKwkJCXwgKChjcmEgPDwgKFNUREJJVF9DTEtQT0wgLSBDUkFCSVRfQ0xLU1JDX0EpKSAmIFNURE1TS19DTEtQT0wpCS8vICAgU2V0IENsa1BvbCB0byBpbmRpY2F0ZSBjb3VudCBkaXJlY3Rpb24gKENsa1NyY0E8MD4pLgorCQkJfCAoTVVMVF9YMSA8PCBTVERCSVRfQ0xLTVVMVCkpOwkvLyAgIENsa011bHQgbXVzdCBiZSAxeCBpbiBUaW1lciBtb2RlLgorCisJZWxzZQkJCS8vIElmIENvdW50ZXIgbW9kZSAoQ2xrU3JjQTwxPiA9PSAwKToKKwkJc2V0dXAgfD0gKChDTEtTUkNfQ09VTlRFUiA8PCBTVERCSVRfQ0xLU1JDKQkvLyAgIEluZGljYXRlIENvdW50ZXIgbW9kZS4KKwkJCXwgKChjcmEgPj4gKENSQUJJVF9DTEtQT0xfQSAtIFNUREJJVF9DTEtQT0wpKSAmIFNURE1TS19DTEtQT0wpCS8vICAgUGFzcyB0aHJvdWdoIENsa1BvbC4KKwkJCXwgKCgoY3JhICYgQ1JBTVNLX0NMS01VTFRfQSkgPT0gKE1VTFRfWDAgPDwgQ1JBQklUX0NMS01VTFRfQSkpID8JLy8gICBGb3JjZSBDbGtNdWx0IHRvIDF4IGlmIG5vdCBsZWdhbCwgZWxzZSBwYXNzIHRocm91Z2guCisJCQkJKE1VTFRfWDEgPDwgU1REQklUX0NMS01VTFQpIDoKKwkJCQkoKGNyYSA+PiAoQ1JBQklUX0NMS01VTFRfQSAtCisJCQkJCQkJU1REQklUX0NMS01VTFQpKSAmCisJCQkJCVNURE1TS19DTEtNVUxUKSkpOworCisJLy8gUmV0dXJuIGFkanVzdGVkIGNvdW50ZXIgc2V0dXAuCisJcmV0dXJuIHNldHVwOworfQorCitzdGF0aWMgdWludDE2X3QgR2V0TW9kZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZWdpc3RlciB1aW50MTZfdCBjcmE7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JiOworCXJlZ2lzdGVyIHVpbnQxNl90IHNldHVwOworCisJLy8gRmV0Y2ggQ1JBIGFuZCBDUkIgcmVnaXN0ZXIgaW1hZ2VzLgorCWNyYSA9IERFQklyZWFkKGRldiwgay0+TXlDUkEpOworCWNyYiA9IERFQklyZWFkKGRldiwgay0+TXlDUkIpOworCisJLy8gUG9wdWxhdGUgdGhlIHN0YW5kYXJkaXplZCBjb3VudGVyIHNldHVwIGJpdCBmaWVsZHMuICBOb3RlOgorCS8vIEluZGV4U3JjIGlzIHJlc3RyaWN0ZWQgdG8gRU5DX1ggb3IgSW5keFBvbC4KKwlzZXR1cCA9ICgoKGNyYiA8PCAoU1REQklUX0lOVFNSQyAtIENSQkJJVF9JTlRTUkNfQikpICYgU1RETVNLX0lOVFNSQykJLy8gSW50U3JjICAgPSBJbnRTcmNCLgorCQl8ICgoY3JiIDw8IChTVERCSVRfTEFUQ0hTUkMgLSBDUkJCSVRfTEFUQ0hTUkMpKSAmIFNURE1TS19MQVRDSFNSQykJLy8gTGF0Y2hTcmMgPSBMYXRjaFNyY0IuCisJCXwgKChjcmIgPDwgKFNUREJJVF9MT0FEU1JDIC0gQ1JCQklUX0xPQURTUkNfQikpICYgU1RETVNLX0xPQURTUkMpCS8vIExvYWRTcmMgID0gTG9hZFNyY0IuCisJCXwgKChjcmIgPDwgKFNUREJJVF9JTkRYUE9MIC0gQ1JCQklUX0lORFhQT0xfQikpICYgU1RETVNLX0lORFhQT0wpCS8vIEluZHhQb2wgID0gSW5keFBvbEIuCisJCXwgKChjcmIgPj4gKENSQkJJVF9DTEtFTkFCX0IgLSBTVERCSVRfQ0xLRU5BQikpICYgU1RETVNLX0NMS0VOQUIpCS8vIENsa0VuYWIgID0gQ2xrRW5hYkIuCisJCXwgKChjcmEgPj4gKChDUkFCSVRfSU5EWFNSQ19CICsgMSkgLSBTVERCSVRfSU5EWFNSQykpICYgU1RETVNLX0lORFhTUkMpKTsJLy8gSW5keFNyYyAgPSBJbmR4U3JjQjwxPi4KKworCS8vIEFkanVzdCBtb2RlLWRlcGVuZGVudCBwYXJhbWV0ZXJzLgorCWlmICgoY3JiICYgQ1JCTVNLX0NMS01VTFRfQikgPT0gKE1VTFRfWDAgPDwgQ1JCQklUX0NMS01VTFRfQikpCS8vIElmIEV4dGVuZGVyIG1vZGUgKENsa011bHRCID09IE1VTFRfWDApOgorCQlzZXR1cCB8PSAoKENMS1NSQ19FWFRFTkRFUiA8PCBTVERCSVRfQ0xLU1JDKQkvLyAgIEluZGljYXRlIEV4dGVuZGVyIG1vZGUuCisJCQl8IChNVUxUX1gxIDw8IFNUREJJVF9DTEtNVUxUKQkvLyAgIEluZGljYXRlIG11bHRpcGxpZXIgaXMgMXguCisJCQl8ICgoY3JhID4+IChDUkFCSVRfQ0xLU1JDX0IgLSBTVERCSVRfQ0xLUE9MKSkgJiBTVERNU0tfQ0xLUE9MKSk7CS8vICAgU2V0IENsa1BvbCBlcXVhbCB0byBUaW1lciBjb3VudCBkaXJlY3Rpb24gKENsa1NyY0I8MD4pLgorCisJZWxzZSBpZiAoY3JhICYgKDIgPDwgQ1JBQklUX0NMS1NSQ19CKSkJLy8gSWYgVGltZXIgbW9kZSAoQ2xrU3JjQjwxPiA9PSAxKToKKwkJc2V0dXAgfD0gKChDTEtTUkNfVElNRVIgPDwgU1REQklUX0NMS1NSQykJLy8gICBJbmRpY2F0ZSBUaW1lciBtb2RlLgorCQkJfCAoTVVMVF9YMSA8PCBTVERCSVRfQ0xLTVVMVCkJLy8gICBJbmRpY2F0ZSBtdWx0aXBsaWVyIGlzIDF4LgorCQkJfCAoKGNyYSA+PiAoQ1JBQklUX0NMS1NSQ19CIC0gU1REQklUX0NMS1BPTCkpICYgU1RETVNLX0NMS1BPTCkpOwkvLyAgIFNldCBDbGtQb2wgZXF1YWwgdG8gVGltZXIgY291bnQgZGlyZWN0aW9uIChDbGtTcmNCPDA+KS4KKworCWVsc2UJCQkvLyBJZiBDb3VudGVyIG1vZGUgKENsa1NyY0I8MT4gPT0gMCk6CisJCXNldHVwIHw9ICgoQ0xLU1JDX0NPVU5URVIgPDwgU1REQklUX0NMS1NSQykJLy8gICBJbmRpY2F0ZSBUaW1lciBtb2RlLgorCQkJfCAoKGNyYiA+PiAoQ1JCQklUX0NMS01VTFRfQiAtIFNUREJJVF9DTEtNVUxUKSkgJiBTVERNU0tfQ0xLTVVMVCkJLy8gICBDbG9jayBtdWx0aXBsaWVyIGlzIHBhc3NlZCB0aHJvdWdoLgorCQkJfCAoKGNyYiA8PCAoU1REQklUX0NMS1BPTCAtIENSQkJJVF9DTEtQT0xfQikpICYgU1RETVNLX0NMS1BPTCkpOwkvLyAgIENsb2NrIHBvbGFyaXR5IGlzIHBhc3NlZCB0aHJvdWdoLgorCisJLy8gUmV0dXJuIGFkanVzdGVkIGNvdW50ZXIgc2V0dXAuCisJcmV0dXJuIHNldHVwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldCB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzcGVjaWZpZWQgY291bnRlci4gIFRoZSBzZXR1cAorLy8gcGFyYW1ldGVyIGlzIHRyZWF0ZWQgYXMgYSBDT1VOVEVSX1NFVFVQIGRhdGEgdHlwZS4gIFRoZSBmb2xsb3dpbmcKKy8vIHBhcmFtZXRlcnMgYXJlIHByb2dyYW1tYWJsZSAoYWxsIG90aGVyIHBhcm1zIGFyZSBpZ25vcmVkKTogQ2xrTXVsdCwKKy8vIENsa1BvbCwgQ2xrRW5hYiwgSW5kZXhTcmMsIEluZGV4UG9sLCBMb2FkU3JjLgorCitzdGF0aWMgdm9pZCBTZXRNb2RlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBTZXR1cCwKKwl1aW50MTZfdCBEaXNhYmxlSW50U3JjKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYTsKKwlyZWdpc3RlciB1aW50MTZfdCBjcmI7CisJcmVnaXN0ZXIgdWludDE2X3Qgc2V0dXAgPSBTZXR1cDsJLy8gQ2FjaGUgdGhlIFN0YW5kYXJkIFNldHVwLgorCisJLy8gSW5pdGlhbGl6ZSBDUkEgYW5kIENSQiBpbWFnZXMuCisJY3JhID0gKChzZXR1cCAmIENSQU1TS19MT0FEU1JDX0EpCS8vIFByZWxvYWQgdHJpZ2dlciBpcyBwYXNzZWQgdGhyb3VnaC4KKwkJfCAoKHNldHVwICYgU1RETVNLX0lORFhTUkMpID4+IChTVERCSVRfSU5EWFNSQyAtIChDUkFCSVRfSU5EWFNSQ19BICsgMSkpKSk7CS8vIEluZGV4U3JjIGlzIHJlc3RyaWN0ZWQgdG8gRU5DX1ggb3IgSW5keFBvbC4KKworCWNyYiA9IChDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQQkvLyBSZXNldCBhbnkgcGVuZGluZyBDb3VudGVyQSBldmVudCBjYXB0dXJlcy4KKwkJfCAoKHNldHVwICYgU1RETVNLX0NMS0VOQUIpIDw8IChDUkJCSVRfQ0xLRU5BQl9BIC0gU1REQklUX0NMS0VOQUIpKSk7CS8vIENsb2NrIGVuYWJsZSBpcyBwYXNzZWQgdGhyb3VnaC4KKworCS8vIEZvcmNlIEludFNyYyB0byBEaXNhYmxlZCBpZiBEaXNhYmxlSW50U3JjIGlzIGFzc2VydGVkLgorCWlmICghRGlzYWJsZUludFNyYykKKwkJY3JhIHw9ICgoc2V0dXAgJiBTVERNU0tfSU5UU1JDKSA+PiAoU1REQklUX0lOVFNSQyAtCisJCQkJQ1JBQklUX0lOVFNSQ19BKSk7CisKKwkvLyBQb3B1bGF0ZSBhbGwgbW9kZS1kZXBlbmRlbnQgYXR0cmlidXRlcyBvZiBDUkEgJiBDUkIgaW1hZ2VzLgorCXN3aXRjaCAoKHNldHVwICYgU1RETVNLX0NMS1NSQykgPj4gU1REQklUX0NMS1NSQykgeworCWNhc2UgQ0xLU1JDX0VYVEVOREVSOgkvLyBFeHRlbmRlciBNb2RlOiBGb3JjZSB0byBUaW1lciBtb2RlCisJCS8vIChFeHRlbmRlciB2YWxpZCBvbmx5IGZvciBCIGNvdW50ZXJzKS4KKworCWNhc2UgQ0xLU1JDX1RJTUVSOgkvLyBUaW1lciBNb2RlOgorCQljcmEgfD0gKCgyIDw8IENSQUJJVF9DTEtTUkNfQSkJLy8gICBDbGtTcmNBPDE+IHNlbGVjdHMgc3lzdGVtIGNsb2NrCisJCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLUE9MKSA+PiAoU1REQklUX0NMS1BPTCAtIENSQUJJVF9DTEtTUkNfQSkpCS8vICAgICB3aXRoIGNvdW50IGRpcmVjdGlvbiAoQ2xrU3JjQTwwPikgb2J0YWluZWQgZnJvbSBDbGtQb2wuCisJCQl8ICgxIDw8IENSQUJJVF9DTEtQT0xfQSkJLy8gICBDbGtQb2xBIGJlaGF2ZXMgYXMgYWx3YXlzLW9uIGNsb2NrIGVuYWJsZS4KKwkJCXwgKE1VTFRfWDEgPDwgQ1JBQklUX0NMS01VTFRfQSkpOwkvLyAgIENsa011bHQgbXVzdCBiZSAxeC4KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLy8gQ291bnRlciBNb2RlOgorCQljcmEgfD0gKENMS1NSQ19DT1VOVEVSCS8vICAgU2VsZWN0IEVOQ19DIGFuZCBFTkNfRCBhcyBjbG9jay9kaXJlY3Rpb24gaW5wdXRzLgorCQkJfCAoKHNldHVwICYgU1RETVNLX0NMS1BPTCkgPDwgKENSQUJJVF9DTEtQT0xfQSAtIFNUREJJVF9DTEtQT0wpKQkvLyAgIENsb2NrIHBvbGFyaXR5IGlzIHBhc3NlZCB0aHJvdWdoLgorCQkJfCAoKChzZXR1cCAmIFNURE1TS19DTEtNVUxUKSA9PSAoTVVMVF9YMCA8PCBTVERCSVRfQ0xLTVVMVCkpID8JLy8gICBGb3JjZSBtdWx0aXBsaWVyIHRvIHgxIGlmIG5vdCBsZWdhbCwgb3RoZXJ3aXNlIHBhc3MgdGhyb3VnaC4KKwkJCQkoTVVMVF9YMSA8PCBDUkFCSVRfQ0xLTVVMVF9BKSA6CisJCQkJKChzZXR1cCAmIFNURE1TS19DTEtNVUxUKSA8PCAoQ1JBQklUX0NMS01VTFRfQSAtCisJCQkJCQlTVERCSVRfQ0xLTVVMVCkpKSk7CisJfQorCisJLy8gRm9yY2UgcG9zaXRpdmUgaW5kZXggcG9sYXJpdHkgaWYgSW5keFNyYyBpcyBzb2Z0d2FyZS1kcml2ZW4gb25seSwKKwkvLyBvdGhlcndpc2UgcGFzcyBpdCB0aHJvdWdoLgorCWlmICh+c2V0dXAgJiBTVERNU0tfSU5EWFNSQykKKwkJY3JhIHw9ICgoc2V0dXAgJiBTVERNU0tfSU5EWFBPTCkgPDwgKENSQUJJVF9JTkRYUE9MX0EgLQorCQkJCVNUREJJVF9JTkRYUE9MKSk7CisKKwkvLyBJZiBJbnRTcmMgaGFzIGJlZW4gZm9yY2VkIHRvIERpc2FibGVkLCB1cGRhdGUgdGhlIE1JU0MyIGludGVycnVwdAorCS8vIGVuYWJsZSBtYXNrIHRvIGluZGljYXRlIHRoZSBjb3VudGVyIGludGVycnVwdCBpcyBkaXNhYmxlZC4KKwlpZiAoRGlzYWJsZUludFNyYykKKwkJZGV2cHJpdi0+Q291bnRlckludEVuYWJzICY9IH5rLT5NeUV2ZW50Qml0c1szXTsKKworCS8vIFdoaWxlIHJldGFpbmluZyBDb3VudGVyQiBhbmQgTGF0Y2hTcmMgY29uZmlndXJhdGlvbnMsIHByb2dyYW0gdGhlCisJLy8gbmV3IGNvdW50ZXIgb3BlcmF0aW5nIG1vZGUuCisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQSwgQ1JBTVNLX0lORFhTUkNfQiB8IENSQU1TS19DTEtTUkNfQiwgY3JhKTsKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLAorCQkodWludDE2X3QpICh+KENSQk1TS19JTlRDVFJMIHwgQ1JCTVNLX0NMS0VOQUJfQSkpLCBjcmIpOworfQorCitzdGF0aWMgdm9pZCBTZXRNb2RlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBTZXR1cCwKKwl1aW50MTZfdCBEaXNhYmxlSW50U3JjKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYTsKKwlyZWdpc3RlciB1aW50MTZfdCBjcmI7CisJcmVnaXN0ZXIgdWludDE2X3Qgc2V0dXAgPSBTZXR1cDsJLy8gQ2FjaGUgdGhlIFN0YW5kYXJkIFNldHVwLgorCisJLy8gSW5pdGlhbGl6ZSBDUkEgYW5kIENSQiBpbWFnZXMuCisJY3JhID0gKChzZXR1cCAmIFNURE1TS19JTkRYU1JDKSA8PCAoKENSQUJJVF9JTkRYU1JDX0IgKyAxKSAtIFNUREJJVF9JTkRYU1JDKSk7CS8vIEluZGV4U3JjIGZpZWxkIGlzIHJlc3RyaWN0ZWQgdG8gRU5DX1ggb3IgSW5keFBvbC4KKworCWNyYiA9IChDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQgkvLyBSZXNldCBldmVudCBjYXB0dXJlcyBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLRU5BQikgPDwgKENSQkJJVF9DTEtFTkFCX0IgLSBTVERCSVRfQ0xLRU5BQikpCS8vIENsb2NrIGVuYWJsZSBpcyBwYXNzZWQgdGhyb3VnaC4KKwkJfCAoKHNldHVwICYgU1RETVNLX0xPQURTUkMpID4+IChTVERCSVRfTE9BRFNSQyAtIENSQkJJVF9MT0FEU1JDX0IpKSk7CS8vIFByZWxvYWQgdHJpZ2dlciBzb3VyY2UgaXMgcGFzc2VkIHRocm91Z2guCisKKwkvLyBGb3JjZSBJbnRTcmMgdG8gRGlzYWJsZWQgaWYgRGlzYWJsZUludFNyYyBpcyBhc3NlcnRlZC4KKwlpZiAoIURpc2FibGVJbnRTcmMpCisJCWNyYiB8PSAoKHNldHVwICYgU1RETVNLX0lOVFNSQykgPj4gKFNUREJJVF9JTlRTUkMgLQorCQkJCUNSQkJJVF9JTlRTUkNfQikpOworCisJLy8gUG9wdWxhdGUgYWxsIG1vZGUtZGVwZW5kZW50IGF0dHJpYnV0ZXMgb2YgQ1JBICYgQ1JCIGltYWdlcy4KKwlzd2l0Y2ggKChzZXR1cCAmIFNURE1TS19DTEtTUkMpID4+IFNUREJJVF9DTEtTUkMpIHsKKwljYXNlIENMS1NSQ19USU1FUjoJLy8gVGltZXIgTW9kZToKKwkJY3JhIHw9ICgoMiA8PCBDUkFCSVRfQ0xLU1JDX0IpCS8vICAgQ2xrU3JjQjwxPiBzZWxlY3RzIHN5c3RlbSBjbG9jaworCQkJfCAoKHNldHVwICYgU1RETVNLX0NMS1BPTCkgPDwgKENSQUJJVF9DTEtTUkNfQiAtIFNUREJJVF9DTEtQT0wpKSk7CS8vICAgICB3aXRoIGRpcmVjdGlvbiAoQ2xrU3JjQjwwPikgb2J0YWluZWQgZnJvbSBDbGtQb2wuCisJCWNyYiB8PSAoKDEgPDwgQ1JCQklUX0NMS1BPTF9CKQkvLyAgIENsa1BvbEIgYmVoYXZlcyBhcyBhbHdheXMtb24gY2xvY2sgZW5hYmxlLgorCQkJfCAoTVVMVF9YMSA8PCBDUkJCSVRfQ0xLTVVMVF9CKSk7CS8vICAgQ2xrTXVsdEIgbXVzdCBiZSAxeC4KKwkJYnJlYWs7CisKKwljYXNlIENMS1NSQ19FWFRFTkRFUjoJLy8gRXh0ZW5kZXIgTW9kZToKKwkJY3JhIHw9ICgoMiA8PCBDUkFCSVRfQ0xLU1JDX0IpCS8vICAgQ2xrU3JjQiBzb3VyY2UgaXMgT3ZlcmZsb3dBIChzYW1lIGFzICJ0aW1lciIpCisJCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLUE9MKSA8PCAoQ1JBQklUX0NMS1NSQ19CIC0gU1REQklUX0NMS1BPTCkpKTsJLy8gICAgIHdpdGggZGlyZWN0aW9uIG9idGFpbmVkIGZyb20gQ2xrUG9sLgorCQljcmIgfD0gKCgxIDw8IENSQkJJVF9DTEtQT0xfQikJLy8gICBDbGtQb2xCIGNvbnRyb2xzIEluZGV4QiAtLSBhbHdheXMgc2V0IHRvIGFjdGl2ZS4KKwkJCXwgKE1VTFRfWDAgPDwgQ1JCQklUX0NMS01VTFRfQikpOwkvLyAgIENsa011bHRCIHNlbGVjdHMgT3ZlcmZsb3dBIGFzIHRoZSBjbG9jayBzb3VyY2UuCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIENvdW50ZXIgTW9kZToKKwkJY3JhIHw9IChDTEtTUkNfQ09VTlRFUiA8PCBDUkFCSVRfQ0xLU1JDX0IpOwkvLyAgIFNlbGVjdCBFTkNfQyBhbmQgRU5DX0QgYXMgY2xvY2svZGlyZWN0aW9uIGlucHV0cy4KKwkJY3JiIHw9ICgoKHNldHVwICYgU1RETVNLX0NMS1BPTCkgPj4gKFNUREJJVF9DTEtQT0wgLSBDUkJCSVRfQ0xLUE9MX0IpKQkvLyAgIENsa1BvbCBpcyBwYXNzZWQgdGhyb3VnaC4KKwkJCXwgKCgoc2V0dXAgJiBTVERNU0tfQ0xLTVVMVCkgPT0gKE1VTFRfWDAgPDwgU1REQklUX0NMS01VTFQpKSA/CS8vICAgRm9yY2UgQ2xrTXVsdCB0byB4MSBpZiBub3QgbGVnYWwsIG90aGVyd2lzZSBwYXNzIHRocm91Z2guCisJCQkJKE1VTFRfWDEgPDwgQ1JCQklUX0NMS01VTFRfQikgOgorCQkJCSgoc2V0dXAgJiBTVERNU0tfQ0xLTVVMVCkgPDwgKENSQkJJVF9DTEtNVUxUX0IgLQorCQkJCQkJU1REQklUX0NMS01VTFQpKSkpOworCX0KKworCS8vIEZvcmNlIHBvc2l0aXZlIGluZGV4IHBvbGFyaXR5IGlmIEluZHhTcmMgaXMgc29mdHdhcmUtZHJpdmVuIG9ubHksCisJLy8gb3RoZXJ3aXNlIHBhc3MgaXQgdGhyb3VnaC4KKwlpZiAofnNldHVwICYgU1RETVNLX0lORFhTUkMpCisJCWNyYiB8PSAoKHNldHVwICYgU1RETVNLX0lORFhQT0wpID4+IChTVERCSVRfSU5EWFBPTCAtCisJCQkJQ1JCQklUX0lORFhQT0xfQikpOworCisJLy8gSWYgSW50U3JjIGhhcyBiZWVuIGZvcmNlZCB0byBEaXNhYmxlZCwgdXBkYXRlIHRoZSBNSVNDMiBpbnRlcnJ1cHQKKwkvLyBlbmFibGUgbWFzayB0byBpbmRpY2F0ZSB0aGUgY291bnRlciBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQuCisJaWYgKERpc2FibGVJbnRTcmMpCisJCWRldnByaXYtPkNvdW50ZXJJbnRFbmFicyAmPSB+ay0+TXlFdmVudEJpdHNbM107CisKKwkvLyBXaGlsZSByZXRhaW5pbmcgQ291bnRlckEgYW5kIExhdGNoU3JjIGNvbmZpZ3VyYXRpb25zLCBwcm9ncmFtIHRoZQorCS8vIG5ldyBjb3VudGVyIG9wZXJhdGluZyBtb2RlLgorCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkEsCisJCSh1aW50MTZfdCkgKH4oQ1JBTVNLX0lORFhTUkNfQiB8IENSQU1TS19DTEtTUkNfQikpLCBjcmEpOworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsIENSQk1TS19DTEtFTkFCX0EgfCBDUkJNU0tfTEFUQ0hTUkMsIGNyYik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmV0dXJuL3NldCBhIGNvdW50ZXIncyBlbmFibGUuICBlbmFiOiAwPWFsd2F5cyBlbmFibGVkLCAxPWVuYWJsZWQgYnkgaW5kZXguCisKK3N0YXRpYyB2b2lkIFNldEVuYWJsZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgZW5hYikKK3sKKwlERUJVRygiU2V0RW5hYmxlX0E6IFNldEVuYWJsZV9BIGVudGVyIDM1NDFcbiIpOworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKH4oQ1JCTVNLX0lOVENUUkwgfCBDUkJNU0tfQ0xLRU5BQl9BKSksCisJCSh1aW50MTZfdCkgKGVuYWIgPDwgQ1JCQklUX0NMS0VOQUJfQSkpOworfQorCitzdGF0aWMgdm9pZCBTZXRFbmFibGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IGVuYWIpCit7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAofihDUkJNU0tfSU5UQ1RSTCB8IENSQk1TS19DTEtFTkFCX0IpKSwKKwkJKHVpbnQxNl90KSAoZW5hYiA8PCBDUkJCSVRfQ0xLRU5BQl9CKSk7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRFbmFibGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmV0dXJuIChERUJJcmVhZChkZXYsIGstPk15Q1JCKSA+PiBDUkJCSVRfQ0xLRU5BQl9BKSAmIDE7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRFbmFibGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmV0dXJuIChERUJJcmVhZChkZXYsIGstPk15Q1JCKSA+PiBDUkJCSVRfQ0xLRU5BQl9CKSAmIDE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmV0dXJuL3NldCBhIGNvdW50ZXIgcGFpcidzIGxhdGNoIHRyaWdnZXIgc291cmNlLiAgMDogT24gcmVhZAorLy8gYWNjZXNzLCAxOiBBIGluZGV4IGxhdGNoZXMgQSwgMjogQiBpbmRleCBsYXRjaGVzIEIsIDM6IEEgb3ZlcmZsb3cKKy8vIGxhdGNoZXMgQi4KKworc3RhdGljIHZvaWQgU2V0TGF0Y2hTb3VyY2UoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCB2YWx1ZSkKK3sKKwlERUJVRygiU2V0TGF0Y2hTb3VyY2U6IFNldExhdGNoU291cmNlIGVudGVyIDM1NTAgXG4iKTsKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLAorCQkodWludDE2X3QpICh+KENSQk1TS19JTlRDVFJMIHwgQ1JCTVNLX0xBVENIU1JDKSksCisJCSh1aW50MTZfdCkgKHZhbHVlIDw8IENSQkJJVF9MQVRDSFNSQykpOworCisJREVCVUcoIlNldExhdGNoU291cmNlOiBTZXRMYXRjaFNvdXJjZSBleGl0IFxuIik7Cit9CisKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRMYXRjaFNvdXJjZShjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICkgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggREVCSXJlYWQoIGRldiwgay0+TXlDUkIpID4+IENSQkJJVF9MQVRDSFNSQyApICYgMzsgKi8KKy8qIH0gKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmV0dXJuL3NldCB0aGUgZXZlbnQgdGhhdCB3aWxsIHRyaWdnZXIgdHJhbnNmZXIgb2YgdGhlIHByZWxvYWQKKy8vIHJlZ2lzdGVyIGludG8gdGhlIGNvdW50ZXIuICAwPVRoaXNDbnRyX0luZGV4LCAxPVRoaXNDbnRyX092ZXJmbG93LAorLy8gMj1PdmVyZmxvd0EgKEIgY291bnRlcnMgb25seSksIDM9ZGlzYWJsZWQuCisKK3N0YXRpYyB2b2lkIFNldExvYWRUcmlnX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBUcmlnKQoreworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkEsICh1aW50MTZfdCkgKH5DUkFNU0tfTE9BRFNSQ19BKSwKKwkJKHVpbnQxNl90KSAoVHJpZyA8PCBDUkFCSVRfTE9BRFNSQ19BKSk7Cit9CisKK3N0YXRpYyB2b2lkIFNldExvYWRUcmlnX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBUcmlnKQoreworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKH4oQ1JCTVNLX0xPQURTUkNfQiB8IENSQk1TS19JTlRDVFJMKSksCisJCSh1aW50MTZfdCkgKFRyaWcgPDwgQ1JCQklUX0xPQURTUkNfQikpOworfQorCitzdGF0aWMgdWludDE2X3QgR2V0TG9hZFRyaWdfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmV0dXJuIChERUJJcmVhZChkZXYsIGstPk15Q1JBKSA+PiBDUkFCSVRfTE9BRFNSQ19BKSAmIDM7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRMb2FkVHJpZ19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkIpID4+IENSQkJJVF9MT0FEU1JDX0IpICYgMzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJldHVybi9zZXQgY291bnRlciBpbnRlcnJ1cHQgc291cmNlIGFuZCBjbGVhciBhbnkgY2FwdHVyZWQKKy8vIGluZGV4L292ZXJmbG93IGV2ZW50cy4gIEludFNvdXJjZTogMD1EaXNhYmxlZCwgMT1PdmVyZmxvd09ubHksCisvLyAyPUluZGV4T25seSwgMz1JbmRleEFuZE92ZXJmbG93LgorCitzdGF0aWMgdm9pZCBTZXRJbnRTcmNfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssCisJdWludDE2X3QgSW50U291cmNlKQoreworCS8vIFJlc2V0IGFueSBwZW5kaW5nIGNvdW50ZXIgb3ZlcmZsb3cgb3IgaW5kZXggY2FwdHVyZXMuCisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwgKHVpbnQxNl90KSAofkNSQk1TS19JTlRDVFJMKSwKKwkJQ1JCTVNLX0lOVFJFU0VUQ01EIHwgQ1JCTVNLX0lOVFJFU0VUX0EpOworCisJLy8gUHJvZ3JhbSBjb3VudGVyIGludGVycnVwdCBzb3VyY2UuCisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQSwgfkNSQU1TS19JTlRTUkNfQSwKKwkJKHVpbnQxNl90KSAoSW50U291cmNlIDw8IENSQUJJVF9JTlRTUkNfQSkpOworCisJLy8gVXBkYXRlIE1JU0MyIGludGVycnVwdCBlbmFibGUgbWFzay4KKwlkZXZwcml2LT5Db3VudGVySW50RW5hYnMgPQorCQkoZGV2cHJpdi0+Q291bnRlckludEVuYWJzICYgfmstPk15RXZlbnRCaXRzWzNdKSB8IGstPgorCQlNeUV2ZW50Qml0c1tJbnRTb3VyY2VdOworfQorCitzdGF0aWMgdm9pZCBTZXRJbnRTcmNfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssCisJdWludDE2X3QgSW50U291cmNlKQoreworCXVpbnQxNl90IGNyYjsKKworCS8vIENhY2hlIHdyaXRlYWJsZSBDUkIgcmVnaXN0ZXIgaW1hZ2UuCisJY3JiID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQikgJiB+Q1JCTVNLX0lOVENUUkw7CisKKwkvLyBSZXNldCBhbnkgcGVuZGluZyBjb3VudGVyIG92ZXJmbG93IG9yIGluZGV4IGNhcHR1cmVzLgorCURFQkl3cml0ZShkZXYsIGstPk15Q1JCLAorCQkodWludDE2X3QpIChjcmIgfCBDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQikpOworCisJLy8gUHJvZ3JhbSBjb3VudGVyIGludGVycnVwdCBzb3VyY2UuCisJREVCSXdyaXRlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKChjcmIgJiB+Q1JCTVNLX0lOVFNSQ19CKSB8IChJbnRTb3VyY2UgPDwKKwkJCQlDUkJCSVRfSU5UU1JDX0IpKSk7CisKKwkvLyBVcGRhdGUgTUlTQzIgaW50ZXJydXB0IGVuYWJsZSBtYXNrLgorCWRldnByaXYtPkNvdW50ZXJJbnRFbmFicyA9CisJCShkZXZwcml2LT5Db3VudGVySW50RW5hYnMgJiB+ay0+TXlFdmVudEJpdHNbM10pIHwgay0+CisJCU15RXZlbnRCaXRzW0ludFNvdXJjZV07Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRJbnRTcmNfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmV0dXJuIChERUJJcmVhZChkZXYsIGstPk15Q1JBKSA+PiBDUkFCSVRfSU5UU1JDX0EpICYgMzsKK30KKworc3RhdGljIHVpbnQxNl90IEdldEludFNyY19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkIpID4+IENSQkJJVF9JTlRTUkNfQikgJiAzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4vc2V0IHRoZSBjbG9jayBtdWx0aXBsaWVyLgorCisvKiBzdGF0aWMgdm9pZCBTZXRDbGtNdWx0KGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICkgICovCisvKiB7ICovCisvKiAgIGstPlNldE1vZGUoZGV2LCBrLCAodWludDE2X3QpKCAoIGstPkdldE1vZGUoZGV2LCBrICkgJiB+U1RETVNLX0NMS01VTFQgKSB8ICggdmFsdWUgPDwgU1REQklUX0NMS01VTFQgKSApLCBGQUxTRSApOyAqLworLyogfSAqLworCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrTXVsdChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICkgICovCisvKiB7ICovCisvKiAgIHJldHVybiAoIGstPkdldE1vZGUoZGV2LCBrICkgPj4gU1REQklUX0NMS01VTFQgKSAmIDM7ICovCisvKiB9ICovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisvKiAvLyBSZXR1cm4vc2V0IHRoZSBjbG9jayBwb2xhcml0eS4gKi8KKworLyogc3RhdGljIHZvaWQgU2V0Q2xrUG9sKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICkgICovCisvKiB7ICovCisvKiAgIGstPlNldE1vZGUoZGV2LCBrLCAodWludDE2X3QpKCAoIGstPkdldE1vZGUoZGV2LCBrICkgJiB+U1RETVNLX0NMS1BPTCApIHwgKCB2YWx1ZSA8PCBTVERCSVRfQ0xLUE9MICkgKSwgRkFMU0UgKTsgKi8KKy8qIH0gKi8KKworLyogc3RhdGljIHVpbnQxNl90IEdldENsa1BvbChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICkgICovCisvKiB7ICovCisvKiAgIHJldHVybiAoIGstPkdldE1vZGUoZGV2LCBrICkgPj4gU1REQklUX0NMS1BPTCApICYgMTsgKi8KKy8qIH0gKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vIFJldHVybi9zZXQgdGhlIGNsb2NrIHNvdXJjZS4gKi8KKworLyogc3RhdGljIHZvaWQgU2V0Q2xrU3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICkgICovCisvKiB7ICovCisvKiAgIGstPlNldE1vZGUoZGV2LCBrLCAodWludDE2X3QpKCAoIGstPkdldE1vZGUoZGV2LCBrICkgJiB+U1RETVNLX0NMS1NSQyApIHwgKCB2YWx1ZSA8PCBTVERCSVRfQ0xLU1JDICkgKSwgRkFMU0UgKTsgKi8KKy8qIH0gKi8KKworLyogc3RhdGljIHVpbnQxNl90IEdldENsa1NyYyggY29tZWRpX2RldmljZSAqZGV2LGVuY19wcml2YXRlICprICkgICovCisvKiB7ICovCisvKiAgIHJldHVybiAoIGstPkdldE1vZGUoZGV2LCBrICkgPj4gU1REQklUX0NMS1NSQyApICYgMzsgKi8KKy8qIH0gKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisvKiAvLyBSZXR1cm4vc2V0IHRoZSBpbmRleCBwb2xhcml0eS4gKi8KKworLyogc3RhdGljIHZvaWQgU2V0SW5kZXhQb2woY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSAgKi8KKy8qIHsgKi8KKy8qICAgay0+U2V0TW9kZShkZXYsIGssICh1aW50MTZfdCkoICggay0+R2V0TW9kZShkZXYsIGsgKSAmIH5TVERNU0tfSU5EWFBPTCApIHwgKCAodmFsdWUgIT0gMCkgPDwgU1REQklUX0lORFhQT0wgKSApLCBGQUxTRSApOyAqLworLyogfSAqLworCisvKiBzdGF0aWMgdWludDE2X3QgR2V0SW5kZXhQb2woY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApICAqLworLyogeyAqLworLyogICByZXR1cm4gKCBrLT5HZXRNb2RlKGRldiwgayApID4+IFNUREJJVF9JTkRYUE9MICkgJiAxOyAqLworLyogfSAqLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vIFJldHVybi9zZXQgdGhlIGluZGV4IHNvdXJjZS4gKi8KKworLyogc3RhdGljIHZvaWQgU2V0SW5kZXhTcmMoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSAgKi8KKy8qIHsgKi8KKy8qICAgREVCVUcoIlNldEluZGV4U3JjOiBzZXQgaW5kZXggc3JjIGVudGVyIDM3MDBcbiIpOyAqLworLyogICBrLT5TZXRNb2RlKGRldiwgaywgKHVpbnQxNl90KSggKCBrLT5HZXRNb2RlKGRldiwgayApICYgflNURE1TS19JTkRYU1JDICkgfCAoICh2YWx1ZSAhPSAwKSA8PCBTVERCSVRfSU5EWFNSQyApICksIEZBTFNFICk7ICovCisvKiB9ICovCisKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRJbmRleFNyYyhjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICkgICovCisvKiB7ICovCisvKiAgIHJldHVybiAoIGstPkdldE1vZGUoZGV2LCBrICkgPj4gU1REQklUX0lORFhTUkMgKSAmIDE7ICovCisvKiB9ICovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdlbmVyYXRlIGFuIGluZGV4IHB1bHNlLgorCitzdGF0aWMgdm9pZCBQdWxzZUluZGV4X0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYTsKKworCURFQlVHKCJQdWxzZUluZGV4X0E6IHB1bHNlIGluZGV4IGVudGVyXG4iKTsKKworCWNyYSA9IERFQklyZWFkKGRldiwgay0+TXlDUkEpOwkvLyBQdWxzZSBpbmRleC4KKwlERUJJd3JpdGUoZGV2LCBrLT5NeUNSQSwgKHVpbnQxNl90KSAoY3JhIF4gQ1JBTVNLX0lORFhQT0xfQSkpOworCURFQlVHKCJQdWxzZUluZGV4X0E6IHB1bHNlIGluZGV4IHN0ZXAxXG4iKTsKKwlERUJJd3JpdGUoZGV2LCBrLT5NeUNSQSwgY3JhKTsKK30KKworc3RhdGljIHZvaWQgUHVsc2VJbmRleF9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZWdpc3RlciB1aW50MTZfdCBjcmI7CisKKwljcmIgPSBERUJJcmVhZChkZXYsIGstPk15Q1JCKSAmIH5DUkJNU0tfSU5UQ1RSTDsJLy8gUHVsc2UgaW5kZXguCisJREVCSXdyaXRlKGRldiwgay0+TXlDUkIsICh1aW50MTZfdCkgKGNyYiBeIENSQk1TS19JTkRYUE9MX0IpKTsKKwlERUJJd3JpdGUoZGV2LCBrLT5NeUNSQiwgY3JiKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBXcml0ZSB2YWx1ZSBpbnRvIGNvdW50ZXIgcHJlbG9hZCByZWdpc3Rlci4KKworc3RhdGljIHZvaWQgUHJlbG9hZChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQzMl90IHZhbHVlKQoreworCURFQlVHKCJQcmVsb2FkOiBwcmVsb2FkIGVudGVyXG4iKTsKKwlERUJJd3JpdGUoZGV2LCAodWludDE2X3QpIChrLT5NeUxhdGNoTHN3KSwgKHVpbnQxNl90KSB2YWx1ZSk7CS8vIFdyaXRlIHZhbHVlIHRvIHByZWxvYWQgcmVnaXN0ZXIuCisJREVCVUcoIlByZWxvYWQ6IHByZWxvYWQgc3RlcCAxXG4iKTsKKwlERUJJd3JpdGUoZGV2LCAodWludDE2X3QpIChrLT5NeUxhdGNoTHN3ICsgMiksCisJCSh1aW50MTZfdCkgKHZhbHVlID4+IDE2KSk7Cit9CisKK3N0YXRpYyB2b2lkIENvdW50ZXJzSW5pdChjb21lZGlfZGV2aWNlICogZGV2KQoreworCWludCBjaGFuOworCWVuY19wcml2YXRlICprOworCXVpbnQxNl90IFNldHVwID0gKExPQURTUkNfSU5EWCA8PCBCRl9MT0FEU1JDKSB8CS8vIFByZWxvYWQgdXBvbgorCQkvLyBpbmRleC4KKwkJKElORFhTUkNfU09GVCA8PCBCRl9JTkRYU1JDKSB8CS8vIERpc2FibGUgaGFyZHdhcmUgaW5kZXguCisJCShDTEtTUkNfQ09VTlRFUiA8PCBCRl9DTEtTUkMpIHwJLy8gT3BlcmF0aW5nIG1vZGUgaXMgY291bnRlci4KKwkJKENMS1BPTF9QT1MgPDwgQkZfQ0xLUE9MKSB8CS8vIEFjdGl2ZSBoaWdoIGNsb2NrLgorCQkoQ05URElSX1VQIDw8IEJGX0NMS1BPTCkgfAkvLyBDb3VudCBkaXJlY3Rpb24gaXMgdXAuCisJCShDTEtNVUxUXzFYIDw8IEJGX0NMS01VTFQpIHwJLy8gQ2xvY2sgbXVsdGlwbGllciBpcyAxeC4KKwkJKENMS0VOQUJfSU5ERVggPDwgQkZfQ0xLRU5BQik7CS8vIEVuYWJsZWQgYnkgaW5kZXgKKworCS8vIERpc2FibGUgYWxsIGNvdW50ZXIgaW50ZXJydXB0cyBhbmQgY2xlYXIgYW55IGNhcHR1cmVkIGNvdW50ZXIgZXZlbnRzLgorCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBTNjI2X0VOQ09ERVJfQ0hBTk5FTFM7IGNoYW4rKykgeworCQlrID0gJmVuY3ByaXZbY2hhbl07CisJCWstPlNldE1vZGUoZGV2LCBrLCBTZXR1cCwgVFJVRSk7CisJCWstPlNldEludFNyYyhkZXYsIGssIDApOworCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisJCWstPlNldEVuYWJsZShkZXYsIGssIENMS0VOQUJfQUxXQVlTKTsKKwl9CisJREVCVUcoIkNvdW50ZXJzSW5pdDogY291bnRlcnMgaW5pdGlhbGl6ZWQgXG4iKTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkOGIxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmgKQEAgLTAsMCArMSw4MDIgQEAKKy8qCisgIGNvbWVkaS9kcml2ZXJzL3M2MjYuaAorICBTZW5zb3JheSBzNjI2IENvbWVkaSBkcml2ZXIsIGhlYWRlciBmaWxlCisKKyAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgQmFzZWQgb24gU2Vuc29yYXkgTW9kZWwgNjI2IExpbnV4IGRyaXZlciBWZXJzaW9uIDAuMgorICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTZW5zb3JheSBDby4sIEluYy4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKy8qCisgIERyaXZlcjogczYyNi5vIChzNjI2LmtvKQorICBEZXNjcmlwdGlvbjogU2Vuc29yYXkgNjI2IGRyaXZlcgorICBEZXZpY2VzOiBTZW5zb3JheSBzNjI2CisgIEF1dGhvcnM6IEdpYW5sdWNhIFBhbGxpIDxncGFsbGlAZGVpcy51bmliby5pdD4sCisgIFVwZGF0ZWQ6IFRodSwgMTIgSnVsIDIwMDUKKyAgU3RhdHVzOiBleHBlcmltZW50YWwKKworICBDb25maWd1cmF0aW9uIE9wdGlvbnM6CisgIGFuYWxvZyBpbnB1dDoKKyAgIG5vbmUKKworICBhbmFsb2cgb3V0cHV0OgorICAgbm9uZQorCisgIGRpZ2l0YWwgY2hhbm5lbDoKKyAgIHM2MjYgaGFzIDMgZGlvIHN1YmRldmljZXMgKDIsMyBhbmQgNCkgZWFjaCB3aXRoIDE2IGkvbyBjaGFubmVscworICAgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAgIElOU05fQ09ORklHX0RJT19RVUVSWQorICAgQ09NRURJX0lOUFVUCisgICBDT01FRElfT1VUUFVUCisKKyAgZW5jb2RlcjoKKyAgIEV2ZXJ5IGNoYW5uZWwgbXVzdCBiZSBjb25maWd1cmVkIGJlZm9yZSByZWFkaW5nLgorCisgICBFeGFtcGxlIGNvZGUKKworICAgaW5zbi5pbnNuPUlOU05fQ09ORklHOyAgIC8vY29uZmlndXJhdGlvbiBpbnN0cnVjdGlvbgorICAgaW5zbi5uPTE7ICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIG9wZXJhdGlvbiAobXVzdCBiZSAxKQorICAgaW5zbi5kYXRhPSZpbml0aWFsdmFsdWU7IC8vaW5pdGlhbCB2YWx1ZSBsb2FkZWQgaW50byBlbmNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdXJpbmcgY29uZmlndXJhdGlvbgorICAgaW5zbi5zdWJkZXY9NTsgICAgICAgICAgIC8vZW5jb2RlciBzdWJkZXZpY2UKKyAgIGluc24uY2hhbnNwZWM9Q1JfUEFDSyhlbmNvZGVyX2NoYW5uZWwsMCxBUkVGX09USEVSKTsgLy9lbmNvZGVyX2NoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90byBjb25maWd1cmUKKworICAgY29tZWRpX2RvX2luc24oY2YsJmluc24pOyAvL2V4ZWN1dGluZyBjb25maWd1cmF0aW9uCisqLworCisjaWZkZWYgX0RFQlVHXworI2RlZmluZSBERUJVRyguLi4pOyAgICAgICAgcnRfcHJpbnRrKF9fVkFfQVJHU19fKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHKC4uLikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVFJVRSkKKyNkZWZpbmUgVFJVRSAgICAoMSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRkFMU0UpCisjZGVmaW5lIEZBTFNFICAgKDApCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEVYVEVSTikKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgorI2Vsc2UKKyNkZWZpbmUgRVhURVJOIGV4dGVybgorI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKElOTElORSkKKyNkZWZpbmUgSU5MSU5FIHN0YXRpYyBfX2lubGluZQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjaW5jbHVkZTxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgUzYyNl9TSVpFIDB4MDIwMAorI2RlZmluZSBTSVpFT0ZfQUREUkVTU19TUEFDRQkJMHgwMjAwCisjZGVmaW5lIERNQUJVRl9TSVpFCQkJNDA5NgkvLyA0ayBwYWdlcworCisjZGVmaW5lIFM2MjZfQURDX0NIQU5ORUxTICAgICAgIDE2CisjZGVmaW5lIFM2MjZfREFDX0NIQU5ORUxTICAgICAgIDQKKyNkZWZpbmUgUzYyNl9FTkNPREVSX0NIQU5ORUxTICAgNgorI2RlZmluZSBTNjI2X0RJT19DSEFOTkVMUyAgICAgICA0OAorI2RlZmluZSBTNjI2X0RJT19CQU5LUwkJMwkvLyBOdW1iZXIgb2YgRElPIGdyb3Vwcy4KKyNkZWZpbmUgUzYyNl9ESU9fRVhUQ0hBTlMJNDAJLy8gTnVtYmVyIG9mCisJCQkJCS8vIGV4dGVuZGVkLWNhcGFiaWxpdHkKKwkJCQkJLy8gRElPIGNoYW5uZWxzLgorCisjZGVmaW5lIE5VTV9UUklNREFDUwkxMgkvLyBOdW1iZXIgb2YgdmFsaWQgVHJpbURBQyBjaGFubmVscy4KKworLy8gUENJIGJ1cyBpbnRlcmZhY2UgdHlwZXMuCisjZGVmaW5lIElOVEVMCQkJCTEJLy8gSW50ZWwgYnVzIHR5cGUuCisjZGVmaW5lIE1PVE9ST0xBCQkJMgkvLyBNb3Rvcm9sYSBidXMgdHlwZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIFBMQVRGT1JNCQlJTlRFTAkvLyAqKiogU0VMRUNUIFBMQVRGT1JNIFRZUEUgKioqCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgUkFOR0VfNVYgICAgICAgICAgICAgICAgMHgxMAkvLyArLy01ViByYW5nZQorI2RlZmluZSBSQU5HRV8xMFYgICAgICAgICAgICAgICAweDAwCS8vICsvLTEwViByYW5nZQorCisjZGVmaW5lIEVPUEwJCQkweDgwCS8vIEVuZCBvZiBBREMgcG9sbCBsaXN0IG1hcmtlci4KKyNkZWZpbmUgR1NFTF9CSVBPTEFSNVYJCTB4MDBGMAkvLyBMUF9HU0VMIHNldHRpbmcgZm9yIDVWIGJpcG9sYXIgcmFuZ2UuCisjZGVmaW5lIEdTRUxfQklQT0xBUjEwVgkJMHgwMEEwCS8vIExQX0dTRUwgc2V0dGluZyBmb3IgMTBWIGJpcG9sYXIgcmFuZ2UuCisKKy8vIEVycm9yIGNvZGVzIHRoYXQgbXVzdCBiZSB2aXNpYmxlIHRvIHRoaXMgYmFzZSBjbGFzcy4KKyNkZWZpbmUgRVJSX0lMTEVHQUxfUEFSTQkweDAwMDEwMDAwCS8vIElsbGVnYWwgZnVuY3Rpb24gcGFyYW1ldGVyIHZhbHVlIHdhcyBzcGVjaWZpZWQuCisjZGVmaW5lIEVSUl9JMkMJCQkweDAwMDIwMDAwCS8vIEkyQyBlcnJvci4KKyNkZWZpbmUgRVJSX0NPVU5URVJTRVRVUAkweDAwMjAwMDAwCS8vIElsbGVnYWwgc2V0dXAgc3BlY2lmaWVkIGZvciBjb3VudGVyIGNoYW5uZWwuCisjZGVmaW5lIEVSUl9ERUJJX1RJTUVPVVQJMHgwMDQwMDAwMAkvLyBERUJJIHRyYW5zZmVyIHRpbWVkIG91dC4KKworLy8gT3JnYW5pemF0aW9uIChwaHlzaWNhbCBvcmRlcikgYW5kIHNpemUgKGluIERXT1JEcykgb2YgbG9naWNhbCBETUEgYnVmZmVycyBjb250YWluZWQgYnkgQU5BX0RNQUJVRi4KKyNkZWZpbmUgQURDX0RNQUJVRl9EV09SRFMJNDAJLy8gQURDIERNQSBidWZmZXIgbXVzdCBob2xkIDE2IHNhbXBsZXMsIHBsdXMgcHJlL3Bvc3QgZ2FyYmFnZSBzYW1wbGVzLgorI2RlZmluZSBEQUNfV0RNQUJVRl9EV09SRFMJMQkvLyBEQUMgb3V0cHV0IERNQSBidWZmZXIgaG9sZHMgYSBzaW5nbGUgc2FtcGxlLgorCisvLyBBbGwgcmVtYWluaW5nIHNwYWNlIGluIDRLQiBETUEgYnVmZmVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIFJQUzEgcHJvZ3JhbS4KKworLy8gQWRkcmVzcyBvZmZzZXRzLCBpbiBEV09SRFMsIGZyb20gYmFzZSBvZiBETUEgYnVmZmVyLgorI2RlZmluZSBEQUNfV0RNQUJVRl9PUwkJQURDX0RNQUJVRl9EV09SRFMKKworLy8gSW50ZXJydXB0IGVuYWIgYml0IGluIElTUiBhbmQgSUVSLgorI2RlZmluZSBJUlFfR1BJTzMJCTB4MDAwMDAwNDAJLy8gSVJRIGVuYWJsZSBmb3IgR1BJTzMuCisjZGVmaW5lIElSUV9SUFMxICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgSVNSX0FGT1UJCTB4MDAwMDA4MDAJLy8gQXVkaW8gZmlmbworCQkJCQkJLy8gdW5kZXIvb3ZlcmZsb3cKKwkJCQkJCS8vIGRldGVjdGVkLgorI2RlZmluZSBJUlFfQ09JTlQxQSAgICAgICAgICAgICAweDA0MDAJLy8gY29udGVyIDFBIG92ZXJmbG93CisJCQkJCQkvLyBpbnRlcnJ1cHQgbWFzaworI2RlZmluZSBJUlFfQ09JTlQxQiAgICAgICAgICAgICAweDA4MDAJLy8gY29udGVyIDFCIG92ZXJmbG93CisJCQkJCQkvLyBpbnRlcnJ1cHQgbWFzaworI2RlZmluZSBJUlFfQ09JTlQyQSAgICAgICAgICAgICAweDEwMDAJLy8gY29udGVyIDJBIG92ZXJmbG93CisJCQkJCQkvLyBpbnRlcnJ1cHQgbWFzaworI2RlZmluZSBJUlFfQ09JTlQyQiAgICAgICAgICAgICAweDIwMDAJLy8gY29udGVyIDJCIG92ZXJmbG93CisJCQkJCQkvLyBpbnRlcnJ1cHQgbWFzaworI2RlZmluZSBJUlFfQ09JTlQzQSAgICAgICAgICAgICAweDQwMDAJLy8gY29udGVyIDNBIG92ZXJmbG93CisJCQkJCQkvLyBpbnRlcnJ1cHQgbWFzaworI2RlZmluZSBJUlFfQ09JTlQzQiAgICAgICAgICAgICAweDgwMDAJLy8gY29udGVyIDNCIG92ZXJmbG93CisJCQkJCQkvLyBpbnRlcnJ1cHQgbWFzaworCisvLyBSUFMgY29tbWFuZCBjb2Rlcy4KKyNkZWZpbmUgUlBTX0NMUlNJR05BTAkJMHgwMDAwMDAwMAkvLyBDTEVBUiBTSUdOQUwKKyNkZWZpbmUgUlBTX1NFVFNJR05BTAkJMHgxMDAwMDAwMAkvLyBTRVQgU0lHTkFMCisjZGVmaW5lIFJQU19OT1AJCQkweDAwMDAwMDAwCS8vIE5PUAorI2RlZmluZSBSUFNfUEFVU0UJCTB4MjAwMDAwMDAJLy8gUEFVU0UKKyNkZWZpbmUgUlBTX1VQTE9BRAkJMHg0MDAwMDAwMAkvLyBVUExPQUQKKyNkZWZpbmUgUlBTX0pVTVAJCTB4ODAwMDAwMDAJLy8gSlVNUAorI2RlZmluZSBSUFNfTERSRUcJCTB4OTAwMDAxMDAJLy8gTERSRUcgKDEgdWludDMyX3Qgb25seSkKKyNkZWZpbmUgUlBTX1NUUkVHCQkweEEwMDAwMTAwCS8vIFNUUkVHICgxIHVpbnQzMl90IG9ubHkpCisjZGVmaW5lIFJQU19TVE9QCQkweDUwMDAwMDAwCS8vIFNUT1AKKyNkZWZpbmUgUlBTX0lSUSAgICAgICAgICAgICAgICAgMHg2MDAwMDAwMAkvLyBJUlEKKworI2RlZmluZSBSUFNfTE9HSUNBTF9PUgkJMHgwODAwMDAwMAkvLyBMb2dpY2FsIE9SIGNvbmRpdGlvbmFscy4KKyNkZWZpbmUgUlBTX0lOVkVSVAkJMHgwNDAwMDAwMAkvLyBUZXN0IGZvciBuZWdhdGVkIHNlbWFwaG9yZXMuCisjZGVmaW5lIFJQU19ERUJJCQkweDAwMDAwMDAyCS8vIERFQkkgZG9uZQorCisjZGVmaW5lIFJQU19TSUcwCQkweDAwMjAwMDAwCS8vIFJQUyBzZW1hcGhvcmUgMCAodXNlZCBieSBBREMpLgorI2RlZmluZSBSUFNfU0lHMQkJMHgwMDQwMDAwMAkvLyBSUFMgc2VtYXBob3JlIDEgKHVzZWQgYnkgREFDKS4KKyNkZWZpbmUgUlBTX1NJRzIJCTB4MDA4MDAwMDAJLy8gUlBTIHNlbWFwaG9yZSAyIChub3QgdXNlZCkuCisjZGVmaW5lIFJQU19HUElPMgkJMHgwMDA4MDAwMAkvLyBSUFMgR1BJTzIKKyNkZWZpbmUgUlBTX0dQSU8zCQkweDAwMTAwMDAwCS8vIFJQUyBHUElPMworCisjZGVmaW5lIFJQU19TSUdBREMJCVJQU19TSUcwCS8vIFRyaWdnZXIvc3RhdHVzIGZvciBBREMncyBSUFMgcHJvZ3JhbS4KKyNkZWZpbmUgUlBTX1NJR0RBQwkJUlBTX1NJRzEJLy8gVHJpZ2dlci9zdGF0dXMgZm9yIERBQydzIFJQUyBwcm9ncmFtLgorCisvLyBSUFMgY2xvY2sgcGFyYW1ldGVycy4KKyNkZWZpbmUgUlBTQ0xLX1NDQUxBUgkJOAkvLyBUaGlzIGlzIGFwcGFyZW50IHJhdGlvIG9mIFBDSS9SUFMgY2xrcyAodW5kb2N1bWVudGVkISEpLgorI2RlZmluZSBSUFNDTEtfUEVSX1VTCQkoIDMzIC8gUlBTQ0xLX1NDQUxBUiApCS8vIE51bWJlciBvZiBSUFMgY2xvY2tzIGluIG9uZSBtaWNyb3NlY29uZC4KKworLy8gRXZlbnQgY291bnRlciBzb3VyY2UgYWRkcmVzc2VzLgorI2RlZmluZSBTQkFfUlBTX0EwCQkweDI3CS8vIFRpbWUgb2YgUlBTMCBidXN5LCBpbiBQQ0kgY2xvY2tzLgorCisvLyBHUElPIGNvbnN0YW50cy4KKyNkZWZpbmUgR1BJT19CQVNFCQkweDEwMDA0MDAwCS8vIEdQSU8gMCwyLDMgPSBpbnB1dHMsIEdQSU8zID0gSVJROyBHUElPMSA9IG91dC4KKyNkZWZpbmUgR1BJTzFfTE8JCTB4MDAwMDAwMDAJLy8gR1BJTzEgc2V0IHRvIExPVy4KKyNkZWZpbmUgR1BJTzFfSEkJCTB4MDAwMDEwMDAJLy8gR1BJTzEgc2V0IHRvIEhJR0guCisKKy8vIFByaW1hcnkgU3RhdHVzIFJlZ2lzdGVyIChQU1IpIGNvbnN0YW50cy4KKyNkZWZpbmUgUFNSX0RFQklfRQkJMHgwMDA0MDAwMAkvLyBERUJJIGV2ZW50IGZsYWcuCisjZGVmaW5lIFBTUl9ERUJJX1MJCTB4MDAwODAwMDAJLy8gREVCSSBzdGF0dXMgZmxhZy4KKyNkZWZpbmUgUFNSX0EyX0lOCQkweDAwMDA4MDAwCS8vIEF1ZGlvIG91dHB1dCBETUEyIHByb3RlY3Rpb24gYWRkcmVzcyByZWFjaGVkLgorI2RlZmluZSBQU1JfQUZPVQkJMHgwMDAwMDgwMAkvLyBBdWRpbyBGSUZPIHVuZGVyL292ZXJmbG93IGRldGVjdGVkLgorI2RlZmluZSBQU1JfR1BJTzIJCTB4MDAwMDAwMjAJLy8gR1BJTzIgaW5wdXQgcGluOiAwPUFkY0J1c3ksIDE9QWRjSWRsZS4KKyNkZWZpbmUgUFNSX0VDMFMJCTB4MDAwMDAwMDEJLy8gRXZlbnQgY291bnRlciAwIHRocmVzaG9sZCByZWFjaGVkLgorCisvLyBTZWNvbmRhcnkgU3RhdHVzIFJlZ2lzdGVyIChTU1IpIGNvbnN0YW50cy4KKyNkZWZpbmUgU1NSX0FGMl9PVVQJCTB4MDAwMDAyMDAJLy8gQXVkaW8gMiBvdXRwdXQgRklGTyB1bmRlci9vdmVyZmxvdyBkZXRlY3RlZC4KKworLy8gTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgMSAoTUMxKSBjb25zdGFudHMuCisjZGVmaW5lIE1DMV9TT0ZUX1JFU0VUCQkweDgwMDAwMDAwCS8vIEludm9rZSA3MTQ2IHNvZnQgcmVzZXQuCisjZGVmaW5lIE1DMV9TSFVURE9XTgkJMHgzRkZGMDAwMAkvLyBTaHV0IGRvd24gYWxsIE1DMS1jb250cm9sbGVkIGVuYWJsZXMuCisKKyNkZWZpbmUgTUMxX0VSUFMxCQkweDIwMDAJLy8gZW5hYi9kaXNhYmxlIFJQUyB0YXNrIDEuCisjZGVmaW5lIE1DMV9FUlBTMAkJMHgxMDAwCS8vIGVuYWIvZGlzYWJsZSBSUFMgdGFzayAwLgorI2RlZmluZSBNQzFfREVCSQkJMHgwODAwCS8vIGVuYWIvZGlzYWJsZSBERUJJIHBpbnMuCisjZGVmaW5lIE1DMV9BVURJTwkJMHgwMjAwCS8vIGVuYWIvZGlzYWJsZSBhdWRpbyBwb3J0IHBpbnMuCisjZGVmaW5lIE1DMV9JMkMJCQkweDAxMDAJLy8gZW5hYi9kaXNhYmxlIEkyQyBpbnRlcmZhY2UuCisjZGVmaW5lIE1DMV9BMk9VVAkJMHgwMDA4CS8vIGVuYWIvZGlzYWJsZSB0cmFuc2ZlciBvbiBBMiBvdXQuCisjZGVmaW5lIE1DMV9BMklOCQkweDAwMDQJLy8gZW5hYi9kaXNhYmxlIHRyYW5zZmVyIG9uIEEyIGluLgorI2RlZmluZSBNQzFfQTFJTgkJMHgwMDAxCS8vIGVuYWIvZGlzYWJsZSB0cmFuc2ZlciBvbiBBMSBpbi4KKworLy8gTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgMiAoTUMyKSBjb25zdGFudHMuCisjZGVmaW5lIE1DMl9VUExEX0RFQklxCQkweDAwMDIwMDAyCS8vIFVwbG9hZCBERUJJIHJlZ2lzdGVycy4KKyNkZWZpbmUgTUMyX1VQTERfSUlDcQkJMHgwMDAxMDAwMQkvLyBVcGxvYWQgSTJDIHJlZ2lzdGVycy4KKyNkZWZpbmUgTUMyX1JQU1NJRzJfT05xCQkweDIwMDAyMDAwCS8vIEFzc2VydCBSUFNfU0lHMi4KKyNkZWZpbmUgTUMyX1JQU1NJRzFfT05xCQkweDEwMDAxMDAwCS8vIEFzc2VydCBSUFNfU0lHMS4KKyNkZWZpbmUgTUMyX1JQU1NJRzBfT05xCQkweDA4MDAwODAwCS8vIEFzc2VydCBSUFNfU0lHMC4KKyNkZWZpbmUgTUMyX1VQTERfREVCSV9NQVNLcQkweDAwMDAwMDAyCS8vIFVwbG9hZCBERUJJIG1hc2suCisjZGVmaW5lIE1DMl9VUExEX0lJQ19NQVNLcQkweDAwMDAwMDAxCS8vIFVwbG9hZCBJMkMgbWFzay4KKyNkZWZpbmUgTUMyX1JQU1NJRzJfTUFTS3EJMHgwMDAwMjAwMAkvLyBSUFNfU0lHMiBiaXQgbWFzay4KKyNkZWZpbmUgTUMyX1JQU1NJRzFfTUFTS3EJMHgwMDAwMTAwMAkvLyBSUFNfU0lHMSBiaXQgbWFzay4KKyNkZWZpbmUgTUMyX1JQU1NJRzBfTUFTS3EJMHgwMDAwMDgwMAkvLyBSUFNfU0lHMCBiaXQgbWFzay4KKworI2RlZmluZSBNQzJfREVMQVlUUklHXzRVU3EJTUMyX1JQU1NJRzFfT04KKyNkZWZpbmUgTUMyX0RFTEFZQlVTWV80VVNxCU1DMl9SUFNTSUcxX01BU0sKKworI2RlZmluZQlNQzJfREVMQVlUUklHXzZVU3EJTUMyX1JQU1NJRzJfT04KKyNkZWZpbmUgTUMyX0RFTEFZQlVTWV82VVNxCU1DMl9SUFNTSUcyX01BU0sKKworI2RlZmluZSBNQzJfVVBMRF9ERUJJCQkweDAwMDIJLy8gVXBsb2FkIERFQkkuCisjZGVmaW5lIE1DMl9VUExEX0lJQwkJMHgwMDAxCS8vIFVwbG9hZCBJMkMuCisjZGVmaW5lIE1DMl9SUFNTSUcyCQkweDIwMDAJLy8gUlBTIHNpZ25hbCAyIChub3QgdXNlZCkuCisjZGVmaW5lIE1DMl9SUFNTSUcxCQkweDEwMDAJLy8gUlBTIHNpZ25hbCAxIChEQUMgUlBTIGJ1c3kpLgorI2RlZmluZSBNQzJfUlBTU0lHMAkJMHgwODAwCS8vIFJQUyBzaWduYWwgMCAoQURDIFJQUyBidXN5KS4KKworI2RlZmluZSBNQzJfQURDX1JQUwkJTUMyX1JQU1NJRzAJLy8gQURDIFJQUyBidXN5LgorI2RlZmluZSBNQzJfREFDX1JQUwkJTUMyX1JQU1NJRzEJLy8gREFDIFJQUyBidXN5LgorCisvLy8vLy8vLy8vLy8vLy8vLy8vb2xkaWVzLy8vLy8vLy8vLy8KKyNkZWZpbmUgTUMyX1VQTERfREVCSVEJCTB4MDAwMjAwMDIJLy8gVXBsb2FkIERFQkkgcmVnaXN0ZXJzLgorI2RlZmluZSBNQzJfVVBMRF9JSUNRCQkweDAwMDEwMDAxCS8vIFVwbG9hZCBJMkMgcmVnaXN0ZXJzLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBQQ0kgQlVTIChTQUE3MTQ2KSBSRUdJU1RFUiBBRERSRVNTIE9GRlNFVFMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIFBfUENJX0JUX0EJCTB4MDA0QwkvLyBBdWRpbyBETUEKKwkJCQkJCS8vIGJ1cnN0L3RocmVzaG9sZAorCQkJCQkJLy8gY29udHJvbC4KKyNkZWZpbmUgUF9ERUJJQ0ZHICAgICAgICAgICAgICAgMHgwMDdDCS8vIERFQkkgY29uZmlndXJhdGlvbi4KKyNkZWZpbmUgUF9ERUJJQ01EICAgICAgICAgICAgICAgMHgwMDgwCS8vIERFQkkgY29tbWFuZC4KKyNkZWZpbmUgUF9ERUJJUEFHRSAgICAgICAgICAgICAgMHgwMDg0CS8vIERFQkkgcGFnZS4KKyNkZWZpbmUgUF9ERUJJQUQgICAgICAgICAgICAgICAgMHgwMDg4CS8vIERFQkkgdGFyZ2V0IGFkZHJlc3MuCisjZGVmaW5lIFBfSTJDQ1RSTCAgICAgICAgICAgICAgIDB4MDA4QwkvLyBJMkMgY29udHJvbC4KKyNkZWZpbmUgUF9JMkNTVEFUICAgICAgICAgICAgICAgMHgwMDkwCS8vIEkyQyBzdGF0dXMuCisjZGVmaW5lIFBfQkFTRUEyX0lOCQkweDAwQUMJLy8gQXVkaW8gaW5wdXQgMiBiYXNlCisJCQkJCQkvLyBwaHlzaWNhbCBETUFidWYKKwkJCQkJCS8vIGFkZHJlc3MuCisjZGVmaW5lIFBfUFJPVEEyX0lOCQkweDAwQjAJLy8gQXVkaW8gaW5wdXQgMgorCQkJCQkJLy8gcGh5c2ljYWwgRE1BYnVmCisJCQkJCQkvLyBwcm90ZWN0aW9uIGFkZHJlc3MuCisjZGVmaW5lIFBfUEFHRUEyX0lOCQkweDAwQjQJLy8gQXVkaW8gaW5wdXQgMgorCQkJCQkJLy8gcGFnaW5nIGF0dHJpYnV0ZXMuCisjZGVmaW5lIFBfQkFTRUEyX09VVAkJMHgwMEI4CS8vIEF1ZGlvIG91dHB1dCAyIGJhc2UKKwkJCQkJCS8vIHBoeXNpY2FsIERNQWJ1ZgorCQkJCQkJLy8gYWRkcmVzcy4KKyNkZWZpbmUgUF9QUk9UQTJfT1VUCQkweDAwQkMJLy8gQXVkaW8gb3V0cHV0IDIKKwkJCQkJCS8vIHBoeXNpY2FsIERNQWJ1ZgorCQkJCQkJLy8gcHJvdGVjdGlvbiBhZGRyZXNzLgorI2RlZmluZSBQX1BBR0VBMl9PVVQJCTB4MDBDMAkvLyBBdWRpbyBvdXRwdXQgMgorCQkJCQkJLy8gcGFnaW5nIGF0dHJpYnV0ZXMuCisjZGVmaW5lIFBfUlBTUEFHRTAgICAgICAgICAgICAgIDB4MDBDNAkvLyBSUFMwIHBhZ2UuCisjZGVmaW5lIFBfUlBTUEFHRTEgICAgICAgICAgICAgIDB4MDBDOAkvLyBSUFMxIHBhZ2UuCisjZGVmaW5lIFBfUlBTMF9UT1VUCQkweDAwRDQJLy8gUlBTMCB0aW1lLW91dC4KKyNkZWZpbmUgUF9SUFMxX1RPVVQJCTB4MDBEOAkvLyBSUFMxIHRpbWUtb3V0LgorI2RlZmluZSBQX0lFUiAgICAgICAgICAgICAgICAgICAweDAwREMJLy8gSW50ZXJydXB0IGVuYWJsZS4KKyNkZWZpbmUgUF9HUElPICAgICAgICAgICAgICAgICAgMHgwMEUwCS8vIEdlbmVyYWwtcHVycG9zZSBJL08uCisjZGVmaW5lIFBfRUMxU1NSCQkweDAwRTQJLy8gRXZlbnQgY291bnRlciBzZXQgMQorCQkJCQkJLy8gc291cmNlIHNlbGVjdC4KKyNkZWZpbmUgUF9FQ1QxUgkJCTB4MDBFQwkvLyBFdmVudCBjb3VudGVyCisJCQkJCQkvLyB0aHJlc2hvbGQgc2V0IDEuCisjZGVmaW5lIFBfQUNPTjEgICAgICAgICAgICAgICAgIDB4MDBGNAkvLyBBdWRpbyBjb250cm9sIDEuCisjZGVmaW5lIFBfQUNPTjIgICAgICAgICAgICAgICAgIDB4MDBGOAkvLyBBdWRpbyBjb250cm9sIDIuCisjZGVmaW5lIFBfTUMxICAgICAgICAgICAgICAgICAgIDB4MDBGQwkvLyBNYXN0ZXIgY29udHJvbCAxLgorI2RlZmluZSBQX01DMiAgICAgICAgICAgICAgICAgICAweDAxMDAJLy8gTWFzdGVyIGNvbnRyb2wgMi4KKyNkZWZpbmUgUF9SUFNBRERSMCAgICAgICAgICAgICAgMHgwMTA0CS8vIFJQUzAgaW5zdHJ1Y3Rpb24gcG9pbnRlci4KKyNkZWZpbmUgUF9SUFNBRERSMSAgICAgICAgICAgICAgMHgwMTA4CS8vIFJQUzEgaW5zdHJ1Y3Rpb24gcG9pbnRlci4KKyNkZWZpbmUgUF9JU1IgICAgICAgICAgICAgICAgICAgMHgwMTBDCS8vIEludGVycnVwdCBzdGF0dXMuCisjZGVmaW5lIFBfUFNSICAgICAgICAgICAgICAgICAgIDB4MDExMAkvLyBQcmltYXJ5IHN0YXR1cy4KKyNkZWZpbmUgUF9TU1IgICAgICAgICAgICAgICAgICAgMHgwMTE0CS8vIFNlY29uZGFyeSBzdGF0dXMuCisjZGVmaW5lIFBfRUMxUgkJCTB4MDExOAkvLyBFdmVudCBjb3VudGVyIHNldCAxLgorI2RlZmluZSBQX0FEUDQJCQkweDAxMzgJLy8gTG9naWNhbCBhdWRpbyBETUEKKwkJCQkJCS8vIHBvaW50ZXIgb2YgYXVkaW8KKwkJCQkJCS8vIGlucHV0IEZJRk8gQTJfSU4uCisjZGVmaW5lIFBfRkJfQlVGRkVSMSAgICAgICAgICAgIDB4MDE0NAkvLyBBdWRpbyBmZWVkYmFjayBidWZmZXIgMS4KKyNkZWZpbmUgUF9GQl9CVUZGRVIyICAgICAgICAgICAgMHgwMTQ4CS8vIEF1ZGlvIGZlZWRiYWNrIGJ1ZmZlciAyLgorI2RlZmluZSBQX1RTTDEgICAgICAgICAgICAgICAgICAweDAxODAJLy8gQXVkaW8gdGltZSBzbG90IGxpc3QgMS4KKyNkZWZpbmUgUF9UU0wyICAgICAgICAgICAgICAgICAgMHgwMUMwCS8vIEF1ZGlvIHRpbWUgc2xvdCBsaXN0IDIuCisKKy8vIExPQ0FMIEJVUyAoR0FURSBBUlJBWSkgUkVHSVNURVIgQUREUkVTUyBPRkZTRVRTIC8vLy8vLy8vLy8vLy8vLy8vCisvLyBBbmFsb2cgSS9PIHJlZ2lzdGVyczoKKyNkZWZpbmUgTFBfREFDUE9MCQkweDAwODIJLy8gIFdyaXRlIERBQyBwb2xhcml0eS4KKyNkZWZpbmUgTFBfR1NFTAkJCTB4MDA4NAkvLyAgV3JpdGUgQURDIGdhaW4uCisjZGVmaW5lIExQX0lTRUwJCQkweDAwODYJLy8gIFdyaXRlIEFEQyBjaGFubmVsIHNlbGVjdC4KKy8vIERpZ2l0YWwgSS9PICh3cml0ZSBvbmx5KToKKyNkZWZpbmUgTFBfV1JJTlRTRUxBCQkweDAwNDIJLy8gIFdyaXRlIEEgaW50ZXJydXB0IGVuYWJsZS4KKyNkZWZpbmUgTFBfV1JFREdTRUxBCQkweDAwNDQJLy8gIFdyaXRlIEEgZWRnZSBzZWxlY3Rpb24uCisjZGVmaW5lIExQX1dSQ0FQU0VMQQkJMHgwMDQ2CS8vICBXcml0ZSBBIGNhcHR1cmUgZW5hYmxlLgorI2RlZmluZSBMUF9XUkRPVVRBCQkweDAwNDgJLy8gIFdyaXRlIEEgZGlnaXRhbCBvdXRwdXQuCisjZGVmaW5lIExQX1dSSU5UU0VMQgkJMHgwMDUyCS8vICBXcml0ZSBCIGludGVycnVwdCBlbmFibGUuCisjZGVmaW5lIExQX1dSRURHU0VMQgkJMHgwMDU0CS8vICBXcml0ZSBCIGVkZ2Ugc2VsZWN0aW9uLgorI2RlZmluZSBMUF9XUkNBUFNFTEIJCTB4MDA1NgkvLyAgV3JpdGUgQiBjYXB0dXJlIGVuYWJsZS4KKyNkZWZpbmUgTFBfV1JET1VUQgkJMHgwMDU4CS8vICBXcml0ZSBCIGRpZ2l0YWwgb3V0cHV0LgorI2RlZmluZSBMUF9XUklOVFNFTEMJCTB4MDA2MgkvLyAgV3JpdGUgQyBpbnRlcnJ1cHQgZW5hYmxlLgorI2RlZmluZSBMUF9XUkVER1NFTEMJCTB4MDA2NAkvLyAgV3JpdGUgQyBlZGdlIHNlbGVjdGlvbi4KKyNkZWZpbmUgTFBfV1JDQVBTRUxDCQkweDAwNjYJLy8gIFdyaXRlIEMgY2FwdHVyZSBlbmFibGUuCisjZGVmaW5lIExQX1dSRE9VVEMJCTB4MDA2OAkvLyAgV3JpdGUgQyBkaWdpdGFsIG91dHB1dC4KKworLy8gRGlnaXRhbCBJL08gKHJlYWQgb25seSk6CisjZGVmaW5lIExQX1JERElOQQkJMHgwMDQwCS8vICBSZWFkIGRpZ2l0YWwgaW5wdXQuCisjZGVmaW5lIExQX1JEQ0FQRkxHQQkJMHgwMDQ4CS8vICBSZWFkIGVkZ2VzIGNhcHR1cmVkLgorI2RlZmluZSBMUF9SRElOVFNFTEEJCTB4MDA0QQkvLyAgUmVhZCBpbnRlcnJ1cHQKKwkJCQkJCS8vICBlbmFibGUgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JERURHU0VMQQkJMHgwMDRDCS8vICBSZWFkIGVkZ2UKKwkJCQkJCS8vICBzZWxlY3Rpb24KKwkJCQkJCS8vICByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRDQVBTRUxBCQkweDAwNEUJLy8gIFJlYWQgY2FwdHVyZQorCQkJCQkJLy8gIGVuYWJsZSByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRESU5CCQkweDAwNTAJLy8gIFJlYWQgZGlnaXRhbCBpbnB1dC4KKyNkZWZpbmUgTFBfUkRDQVBGTEdCCQkweDAwNTgJLy8gIFJlYWQgZWRnZXMgY2FwdHVyZWQuCisjZGVmaW5lIExQX1JESU5UU0VMQgkJMHgwMDVBCS8vICBSZWFkIGludGVycnVwdAorCQkJCQkJLy8gIGVuYWJsZSByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRFREdTRUxCCQkweDAwNUMJLy8gIFJlYWQgZWRnZQorCQkJCQkJLy8gIHNlbGVjdGlvbgorCQkJCQkJLy8gIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SRENBUFNFTEIJCTB4MDA1RQkvLyAgUmVhZCBjYXB0dXJlCisJCQkJCQkvLyAgZW5hYmxlIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SRERJTkMJCTB4MDA2MAkvLyAgUmVhZCBkaWdpdGFsIGlucHV0LgorI2RlZmluZSBMUF9SRENBUEZMR0MJCTB4MDA2OAkvLyAgUmVhZCBlZGdlcyBjYXB0dXJlZC4KKyNkZWZpbmUgTFBfUkRJTlRTRUxDCQkweDAwNkEJLy8gIFJlYWQgaW50ZXJydXB0CisJCQkJCQkvLyAgZW5hYmxlIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SREVER1NFTEMJCTB4MDA2QwkvLyAgUmVhZCBlZGdlCisJCQkJCQkvLyAgc2VsZWN0aW9uCisJCQkJCQkvLyAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JEQ0FQU0VMQwkJMHgwMDZFCS8vICBSZWFkIGNhcHR1cmUKKwkJCQkJCS8vICBlbmFibGUgcmVnaXN0ZXIuCisvLyBDb3VudGVyIFJlZ2lzdGVycyAocmVhZC93cml0ZSk6CisjZGVmaW5lIExQX0NSMEEJCQkweDAwMDAJLy8gIDBBIHNldHVwIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9DUjBCCQkJMHgwMDAyCS8vICAwQiBzZXR1cCByZWdpc3Rlci4KKyNkZWZpbmUgTFBfQ1IxQQkJCTB4MDAwNAkvLyAgMUEgc2V0dXAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX0NSMUIJCQkweDAwMDYJLy8gIDFCIHNldHVwIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9DUjJBCQkJMHgwMDA4CS8vICAyQSBzZXR1cCByZWdpc3Rlci4KKyNkZWZpbmUgTFBfQ1IyQgkJCTB4MDAwQQkvLyAgMkIgc2V0dXAgcmVnaXN0ZXIuCisvLyBDb3VudGVyIFByZUxvYWQgKHdyaXRlKSBhbmQgTGF0Y2ggKHJlYWQpIFJlZ2lzdGVyczoKKyNkZWZpbmUJTFBfQ05UUjBBTFNXCQkweDAwMEMJLy8gIDBBIGxzdy4KKyNkZWZpbmUJTFBfQ05UUjBBTVNXCQkweDAwMEUJLy8gIDBBIG1zdy4KKyNkZWZpbmUJTFBfQ05UUjBCTFNXCQkweDAwMTAJLy8gIDBCIGxzdy4KKyNkZWZpbmUJTFBfQ05UUjBCTVNXCQkweDAwMTIJLy8gIDBCIG1zdy4KKyNkZWZpbmUJTFBfQ05UUjFBTFNXCQkweDAwMTQJLy8gIDFBIGxzdy4KKyNkZWZpbmUJTFBfQ05UUjFBTVNXCQkweDAwMTYJLy8gIDFBIG1zdy4KKyNkZWZpbmUJTFBfQ05UUjFCTFNXCQkweDAwMTgJLy8gIDFCIGxzdy4KKyNkZWZpbmUJTFBfQ05UUjFCTVNXCQkweDAwMUEJLy8gIDFCIG1zdy4KKyNkZWZpbmUJTFBfQ05UUjJBTFNXCQkweDAwMUMJLy8gIDJBIGxzdy4KKyNkZWZpbmUJTFBfQ05UUjJBTVNXCQkweDAwMUUJLy8gIDJBIG1zdy4KKyNkZWZpbmUJTFBfQ05UUjJCTFNXCQkweDAwMjAJLy8gIDJCIGxzdy4KKyNkZWZpbmUJTFBfQ05UUjJCTVNXCQkweDAwMjIJLy8gIDJCIG1zdy4KKy8vIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXJzIChyZWFkL3dyaXRlKToKKyNkZWZpbmUgTFBfTUlTQzEJCTB4MDA4OAkvLyAgUmVhZC93cml0ZSBNaXNjMS4KKyNkZWZpbmUgTFBfV1JNSVNDMgkJMHgwMDkwCS8vICBXcml0ZSBNaXNjMi4KKyNkZWZpbmUgTFBfUkRNSVNDMgkJMHgwMDgyCS8vICBSZWFkIE1pc2MyLgorCisvLyBCaXQgbWFza3MgZm9yIE1JU0MxIHJlZ2lzdGVyIHRoYXQgYXJlIHRoZSBzYW1lIGZvciByZWFkcyBhbmQgd3JpdGVzLgorI2RlZmluZSBNSVNDMV9XRU5BQkxFCQkweDgwMDAJLy8gZW5hYiB3cml0ZXMgdG8KKwkJCQkJCS8vIE1JU0MyIChleGNlcHQgQ2xlYXIKKwkJCQkJCS8vIFdhdGNoZG9nIGJpdCkuCisjZGVmaW5lIE1JU0MxX1dESVNBQkxFCQkweDAwMDAJLy8gRGlzYWJsZSB3cml0ZXMgdG8gTUlTQzIuCisjZGVmaW5lIE1JU0MxX0VEQ0FQCQkweDEwMDAJLy8gZW5hYiBlZGdlIGNhcHR1cmUKKwkJCQkJCS8vIG9uIERJTyBjaGFucworCQkJCQkJLy8gc3BlY2lmaWVkIGJ5CisJCQkJCQkvLyBMUF9XUkNBUFNFTHguCisjZGVmaW5lIE1JU0MxX05PRURDQVAJCTB4MDAwMAkvLyBEaXNhYmxlIGVkZ2UKKwkJCQkJCS8vIGNhcHR1cmUgb24KKwkJCQkJCS8vIHNwZWNpZmllZCBESU8KKwkJCQkJCS8vIGNoYW5zLgorCisvLyBCaXQgbWFza3MgZm9yIE1JU0MxIHJlZ2lzdGVyIHJlYWRzLgorI2RlZmluZSBSRE1JU0MxX1dEVElNRU9VVAkweDQwMDAJLy8gV2F0Y2hkb2cgdGltZXIgdGltZWQgb3V0LgorCisvLyBCaXQgbWFza3MgZm9yIE1JU0MyIHJlZ2lzdGVyIHdyaXRlcy4KKyNkZWZpbmUgV1JNSVNDMl9XRENMRUFSCQkweDgwMDAJLy8gUmVzZXQgd2F0Y2hkb2cKKwkJCQkJCS8vIHRpbWVyIHRvIHplcm8uCisjZGVmaW5lIFdSTUlTQzJfQ0hBUkdFX0VOQUJMRQkweDQwMDAJLy8gZW5hYiBiYXR0ZXJ5CisJCQkJCQkvLyB0cmlja2xlIGNoYXJnaW5nLgorCisvLyBCaXQgbWFza3MgZm9yIE1JU0MyIHJlZ2lzdGVyIHRoYXQgYXJlIHRoZSBzYW1lIGZvciByZWFkcyBhbmQgd3JpdGVzLgorI2RlZmluZSBNSVNDMl9CQVRUX0VOQUJMRQkweDAwMDgJLy8gQmFja3VwIGJhdHRlcnkgZW5hYmxlLgorI2RlZmluZSBNSVNDMl9XREVOQUJMRQkJMHgwMDA0CS8vIFdhdGNoZG9nIHRpbWVyIGVuYWJsZS4KKyNkZWZpbmUgTUlTQzJfV0RQRVJJT0RfTUFTSwkweDAwMDMJLy8gV2F0Y2hkb2cgaW50ZXJ2YWwKKwkJCQkJCS8vIHNlbGVjdCBtYXNrLgorCisvLyBCaXQgbWFza3MgZm9yIEFDT04xIHJlZ2lzdGVyLgorI2RlZmluZSBBMl9SVU4JCQkweDQwMDAwMDAwCS8vIFJ1biBBMiBiYXNlZCBvbiBUU0wyLgorI2RlZmluZSBBMV9SVU4JCQkweDIwMDAwMDAwCS8vIFJ1biBBMSBiYXNlZCBvbiBUU0wxLgorI2RlZmluZSBBMV9TV0FQCQkJMHgwMDIwMDAwMAkvLyBVc2UgYmlnLWVuZGlhbiBmb3IgQTEuCisjZGVmaW5lIEEyX1NXQVAJCQkweDAwMTAwMDAwCS8vIFVzZSBiaWctZW5kaWFuIGZvciBBMi4KKyNkZWZpbmUgV1NfTU9ERVMJCTB4MDAwMTk5OTkJLy8gV1MwID0gVFNMMSB0cmlnZ2VyCisJCQkJCQkvLyBpbnB1dCwgV1MxLVdTNCA9CisJCQkJCQkvLyBDUyogb3V0cHV0cy4KKworI2lmIFBMQVRGT1JNID09IElOVEVMCQkvLyBCYXNlIEFDT04xIGNvbmZpZzoKKwkJCQkJCS8vIGFsd2F5cyBydW4gQTEgYmFzZWQKKwkJCQkJCS8vIG9uIFRTTDEuCisjZGVmaW5lIEFDT04xX0JBU0UJCSggV1NfTU9ERVMgfCBBMV9SVU4gKQorI2VsaWYgUExBVEZPUk0gPT0gTU9UT1JPTEEKKyNkZWZpbmUgQUNPTjFfQkFTRQkJKCBXU19NT0RFUyB8IEExX1JVTiB8IEExX1NXQVAgfCBBMl9TV0FQICkKKyNlbmRpZgorCisjZGVmaW5lIEFDT04xX0FEQ1NUQVJUCQlBQ09OMV9CQVNFCS8vIFN0YXJ0IEFEQzogcnVuIEExCisJCQkJCQkvLyBiYXNlZCBvbiBUU0wxLgorI2RlZmluZSBBQ09OMV9EQUNTVEFSVAkJKCBBQ09OMV9CQVNFIHwgQTJfUlVOICkJLy8gU3RhcnQKKwkJCQkJCQkvLyB0cmFuc21pdCB0bworCQkJCQkJCS8vIERBQzogcnVuIEEyCisJCQkJCQkJLy8gYmFzZWQgb24KKwkJCQkJCQkvLyBUU0wyLgorI2RlZmluZSBBQ09OMV9EQUNTVE9QCQlBQ09OMV9CQVNFCS8vIEhhbHQgQTIuCisKKy8vIEJpdCBtYXNrcyBmb3IgQUNPTjIgcmVnaXN0ZXIuCisjZGVmaW5lIEExX0NMS1NSQ19CQ0xLMQkJMHgwMDAwMDAwMAkvLyBBMSBiaXQgcmF0ZSA9IEJDTEsxIChBREMpLgorI2RlZmluZSBBMl9DTEtTUkNfWDEJCTB4MDA4MDAwMDAJLy8gQTIgYml0IHJhdGUgPSBBQ0xLLzEgKERBQ3MpLgorI2RlZmluZSBBMl9DTEtTUkNfWDIJCTB4MDBDMDAwMDAJLy8gQTIgYml0IHJhdGUgPSBBQ0xLLzIgKERBQ3MpLgorI2RlZmluZSBBMl9DTEtTUkNfWDQJCTB4MDE0MDAwMDAJLy8gQTIgYml0IHJhdGUgPSBBQ0xLLzQgKERBQ3MpLgorI2RlZmluZSBJTlZFUlRfQkNMSzIJCTB4MDAxMDAwMDAJLy8gSW52ZXJ0IEJDTEsyIChEQUNzKS4KKyNkZWZpbmUgQkNMSzJfT0UJCTB4MDAwNDAwMDAJLy8gZW5hYiBCQ0xLMiAoREFDcykuCisjZGVmaW5lIEFDT04yX1hPUk1BU0sJCTB4MDAwQzAwMDAJLy8gWE9SIG1hc2sgZm9yIEFDT04yCisJCQkJCQkvLyBhY3RpdmUtbG93IGJpdHMuCisKKyNkZWZpbmUgQUNPTjJfSU5JVAkJKCBBQ09OMl9YT1JNQVNLIF4gKCBBMV9DTEtTUkNfQkNMSzEgfCBBMl9DTEtTUkNfWDIgfCBJTlZFUlRfQkNMSzIgfCBCQ0xLMl9PRSApICkKKworLy8gQml0IG1hc2tzIGZvciB0aW1lc2xvdCByZWNvcmRzLgorI2RlZmluZSBXUzEJCSAgICAgCTB4NDAwMDAwMDAJLy8gV1Mgb3V0cHV0IHRvIGFzc2VydC4KKyNkZWZpbmUgV1MyCQkgICAgIAkweDIwMDAwMDAwCisjZGVmaW5lIFdTMwkJICAgICAJMHgxMDAwMDAwMAorI2RlZmluZSBXUzQJCSAgICAgCTB4MDgwMDAwMDAKKyNkZWZpbmUgUlNEMQkJCTB4MDEwMDAwMDAJLy8gU2hpZnQgQTEgZGF0YSBpbiBvbiBTRDEuCisjZGVmaW5lIFNEV19BMQkJCTB4MDA4MDAwMDAJLy8gU3RvcmUgcmN2J2QgY2hhciBhdAorCQkJCQkJLy8gbmV4dCBjaGFyIHNsb3Qgb2YKKwkJCQkJCS8vIERXT1JEMSBidWZmZXIuCisjZGVmaW5lIFNJQl9BMQkJCTB4MDA0MDAwMDAJLy8gU3RvcmUgcmN2J2QgY2hhciBhdAorCQkJCQkJLy8gbmV4dCBjaGFyIHNsb3Qgb2YKKwkJCQkJCS8vIEZCMSBidWZmZXIuCisjZGVmaW5lIFNGX0ExCQkJMHgwMDIwMDAwMAkvLyBXcml0ZSB1bnNpZ25lZCBsb25nCisJCQkJCQkvLyBidWZmZXIgdG8gaW5wdXQKKwkJCQkJCS8vIEZJRk8uCisKKy8vU2VsZWN0IHBhcmFsbGVsLXRvLXNlcmlhbCBjb252ZXJ0ZXIncyBkYXRhIHNvdXJjZToKKyNkZWZpbmUgWEZJRk9fMAkJCTB4MDAwMDAwMDAJLy8gICBEYXRhIGZpZm8gYnl0ZSAwLgorI2RlZmluZSBYRklGT18xCQkJMHgwMDAwMDAxMAkvLyAgIERhdGEgZmlmbyBieXRlIDEuCisjZGVmaW5lIFhGSUZPXzIJCQkweDAwMDAwMDIwCS8vICAgRGF0YSBmaWZvIGJ5dGUgMi4KKyNkZWZpbmUgWEZJRk9fMwkJCTB4MDAwMDAwMzAJLy8gICBEYXRhIGZpZm8gYnl0ZSAzLgorI2RlZmluZSBYRkIwCQkJMHgwMDAwMDA0MAkvLyAgIEZCX0JVRkZFUiBieXRlIDAuCisjZGVmaW5lIFhGQjEJCQkweDAwMDAwMDUwCS8vICAgRkJfQlVGRkVSIGJ5dGUgMS4KKyNkZWZpbmUgWEZCMgkJCTB4MDAwMDAwNjAJLy8gICBGQl9CVUZGRVIgYnl0ZSAyLgorI2RlZmluZSBYRkIzCQkJMHgwMDAwMDA3MAkvLyAgIEZCX0JVRkZFUiBieXRlIDMuCisjZGVmaW5lIFNJQl9BMgkJCTB4MDAwMDAyMDAJLy8gU3RvcmUgbmV4dCBkd29yZAorCQkJCQkJLy8gZnJvbSBBMidzIGlucHV0CisJCQkJCQkvLyBzaGlmdGVyIHRvIEZCMgorCQkJCQkJLy8gYnVmZmVyLgorI2RlZmluZSBTRl9BMgkJCTB4MDAwMDAxMDAJLy8gU3RvcmUgbmV4dCBkd29yZAorCQkJCQkJLy8gZnJvbSBBMidzIGlucHV0CisJCQkJCQkvLyBzaGlmdGVyIHRvIGl0cworCQkJCQkJLy8gaW5wdXQgZmlmby4KKyNkZWZpbmUgTEZfQTIJCQkweDAwMDAwMDgwCS8vIExvYWQgbmV4dCBkd29yZAorCQkJCQkJLy8gZnJvbSBBMidzIG91dHB1dAorCQkJCQkJLy8gZmlmbyBpbnRvIGl0cworCQkJCQkJLy8gb3V0cHV0IGR3b3JkCisJCQkJCQkvLyBidWZmZXIuCisjZGVmaW5lIFhTRDIJCQkweDAwMDAwMDA4CS8vIFNoaWZ0IGRhdGEgb3V0IG9uIFNEMi4KKyNkZWZpbmUgUlNEMwkJCTB4MDAwMDE4MDAJLy8gU2hpZnQgZGF0YSBpbiBvbiBTRDMuCisjZGVmaW5lIFJTRDIJCQkweDAwMDAxMDAwCS8vIFNoaWZ0IGRhdGEgaW4gb24gU0QyLgorI2RlZmluZSBMT1dfQTIJCQkweDAwMDAwMDAyCS8vIERyaXZlIGxhc3QgU0QgbG93CisJCQkJCQkvLyBmb3IgNyBjbGtzLCB0aGVuCisJCQkJCQkvLyB0cmktc3RhdGUuCisjZGVmaW5lIEVPUwkJICAgICAJMHgwMDAwMDAwMQkvLyBFbmQgb2Ygc3VwZXJmcmFtZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBJMkMgY29uZmlndXJhdGlvbiBjb25zdGFudHMuCisjZGVmaW5lIEkyQ19DTEtTRUwJCTB4MDQwMAkvLyBJMkMgYml0IHJhdGUgPQorCQkJCQkJLy8gUENJY2xrLzQ4MCA9IDY4Ljc1CisJCQkJCQkvLyBLSHouCisjZGVmaW5lIEkyQ19CSVRSQVRFCQk2OC43NQkvLyBJMkMgYnVzIGRhdGEgYml0CisJCQkJCQkvLyByYXRlIChkZXRlcm1pbmVkIGJ5CisJCQkJCQkvLyBJMkNfQ0xLU0VMKSBpbiBLSHouCisjZGVmaW5lIEkyQ19XUlRJTUUJCTE1LjAJLy8gV29yc3QgY2FzZSB0aW1lLGluCisJCQkJCQkvLyBtc2VjLCBmb3IgRUVQUk9NCisJCQkJCQkvLyBpbnRlcm5hbCB3cml0ZSBvcC4KKworLy8gSTJDIG1hbmlmZXN0IGNvbnN0YW50cy4KKworLy8gTWF4IHJldHJpZXMgdG8gd2FpdCBmb3IgRUVQUk9NIHdyaXRlLgorI2RlZmluZSBJMkNfUkVUUklFUwkJKCBJMkNfV1JUSU1FICogSTJDX0JJVFJBVEUgLyA5LjAgKQorI2RlZmluZSBJMkNfRVJSCQkJMHgwMDAyCS8vIEkyQyBjb250cm9sL3N0YXR1cworCQkJCQkJLy8gZmxhZyBFUlJPUi4KKyNkZWZpbmUgSTJDX0JVU1kJCTB4MDAwMQkvLyBJMkMgY29udHJvbC9zdGF0dXMKKwkJCQkJCS8vIGZsYWcgQlVTWS4KKyNkZWZpbmUgSTJDX0FCT1JUCQkweDAwODAJLy8gSTJDIHN0YXR1cyBmbGFnIEFCT1JULgorI2RlZmluZSBJMkNfQVRUUlNUQVJUCQkweDMJLy8gSTJDIGF0dHJpYnV0ZSBTVEFSVC4KKyNkZWZpbmUgSTJDX0FUVFJDT05UCQkweDIJLy8gSTJDIGF0dHJpYnV0ZSBDT05ULgorI2RlZmluZSBJMkNfQVRUUlNUT1AJCTB4MQkvLyBJMkMgYXR0cmlidXRlIFNUT1AuCisjZGVmaW5lIEkyQ19BVFRSTk9QCQkweDAJLy8gSTJDIGF0dHJpYnV0ZSBOT1AuCisKKy8vIEkyQyByZWFkIGNvbW1hbmQgIHwgRUVQUk9NIGFkZHJlc3MuCisjZGVmaW5lIEkyQ1IJCQkoIGRldnByaXYtPkkyQ0FkcnMgfCAxICkKKworLy8gSTJDIHdyaXRlIGNvbW1hbmQgfCBFRVBST00gYWRkcmVzcy4KKyNkZWZpbmUgSTJDVwkJCSggZGV2cHJpdi0+STJDQWRycyApCisKKy8vIENvZGUgbWFjcm9zIHVzZWQgZm9yIGNvbnN0cnVjdGluZyBJMkMgY29tbWFuZCBieXRlcy4KKyNkZWZpbmUgSTJDX0IyKEFUVFIsVkFMKQkoICggKEFUVFIpIDw8IDYgKSB8ICggKFZBTCkgPDwgMjQgKSApCisjZGVmaW5lIEkyQ19CMShBVFRSLFZBTCkJKCAoIChBVFRSKSA8PCA0ICkgfCAoIChWQUwpIDw8IDE2ICkgKQorI2RlZmluZSBJMkNfQjAoQVRUUixWQUwpCSggKCAoQVRUUikgPDwgMiApIHwgKCAoVkFMKSA8PCAgOCApICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vb2xkZXN0CisjZGVmaW5lIFBfREVCSUNGR3EgICAgICAgICAgICAgIDB4MDA3QwkvLyBERUJJIGNvbmZpZ3VyYXRpb24uCisjZGVmaW5lIFBfREVCSUNNRHEgICAgICAgICAgICAgIDB4MDA4MAkvLyBERUJJIGNvbW1hbmQuCisjZGVmaW5lIFBfREVCSVBBR0VxICAgICAgICAgICAgIDB4MDA4NAkvLyBERUJJIHBhZ2UuCisjZGVmaW5lIFBfREVCSUFEcSAgICAgICAgICAgICAgIDB4MDA4OAkvLyBERUJJIHRhcmdldCBhZGRyZXNzLgorCisjZGVmaW5lIERFQklfQ0ZHX1RPUQkJMHgwM0MwMDAwMAkvLyB0aW1lb3V0ICgxNSBQQ0kgY3ljbGVzKQorI2RlZmluZSBERUJJX0NGR19GQVNUUQkJMHgxMDAwMDAwMAkvLyBmYXN0IG1vZGUgZW5hYmxlCisjZGVmaW5lIERFQklfQ0ZHXzE2UQkJMHgwMDA4MDAwMAkvLyAxNi1iaXQgYWNjZXNzIGVuYWJsZQorI2RlZmluZSBERUJJX0NGR19JTkNRCQkweDAwMDQwMDAwCS8vIGVuYWJsZSBhZGRyZXNzIGluY3JlbWVudAorI2RlZmluZSBERUJJX0NGR19USU1FUk9GRlEJMHgwMDAxMDAwMAkvLyBkaXNhYmxlIHRpbWVyCisjZGVmaW5lIERFQklfQ01EX1JEUQkJMHgwMDA1MDAwMAkvLyByZWFkIGltbWVkaWF0ZSAyIGJ5dGVzCisjZGVmaW5lIERFQklfQ01EX1dSUQkJMHgwMDA0MDAwMAkvLyB3cml0ZSBpbW1lZGlhdGUgMiBieXRlcworI2RlZmluZSBERUJJX1BBR0VfRElTQUJMRVEJMHgwMDAwMDAwMAkvLyBwYWdpbmcgZGlzYWJsZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBERUJJIGNvbW1hbmQgY29uc3RhbnRzLgorI2RlZmluZSBERUJJX0NNRF9TSVpFMTYJCSggMiA8PCAxNyApCS8vIFRyYW5zZmVyIHNpemUgaXMKKwkJCQkJCS8vIGFsd2F5cyAyIGJ5dGVzLgorI2RlZmluZSBERUJJX0NNRF9SRUFECQkweDAwMDEwMDAwCS8vIFJlYWQgb3BlcmF0aW9uLgorI2RlZmluZSBERUJJX0NNRF9XUklURQkJMHgwMDAwMDAwMAkvLyBXcml0ZSBvcGVyYXRpb24uCisKKy8vIFJlYWQgaW1tZWRpYXRlIDIgYnl0ZXMuCisjZGVmaW5lIERFQklfQ01EX1JEV09SRAkJKCBERUJJX0NNRF9SRUFEICB8IERFQklfQ01EX1NJWkUxNiApCisKKy8vIFdyaXRlIGltbWVkaWF0ZSAyIGJ5dGVzLgorI2RlZmluZSBERUJJX0NNRF9XUldPUkQJCSggREVCSV9DTURfV1JJVEUgfCBERUJJX0NNRF9TSVpFMTYgKQorCisvLyBERUJJIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzLgorI2RlZmluZSBERUJJX0NGR19YSVJRX0VOCTB4ODAwMDAwMDAJLy8gZW5hYiBleHRlcm5hbAorCQkJCQkJLy8gaW50ZXJydXB0IG9uIEdQSU8zLgorI2RlZmluZSBERUJJX0NGR19YUkVTVU1FCTB4NDAwMDAwMDAJLy8gUmVzdW1lIGJsb2NrCisJCQkJCQkvLyB0cmFuc2ZlciB3aGVuIFhJUlEKKwkJCQkJCS8vIGRlYXNzZXJ0ZWQuCisjZGVmaW5lIERFQklfQ0ZHX0ZBU1QJCTB4MTAwMDAwMDAJLy8gRmFzdCBtb2RlIGVuYWJsZS4KKworLy8gNC1iaXQgZmllbGQgdGhhdCBzcGVjaWZpZXMgREVCSSB0aW1lb3V0IHZhbHVlIGluIFBDSSBjbG9jayBjeWNsZXM6CisjZGVmaW5lIERFQklfQ0ZHX1RPVVRfQklUCTIyCS8vICAgRmluaXNoIERFQkkgY3ljbGUgYWZ0ZXIKKwkJCQkJLy8gICB0aGlzIG1hbnkgY2xvY2tzLgorCisvLyAyLWJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyBFbmRpYW4gYnl0ZSBsYW5lIHN0ZWVyaW5nOgorI2RlZmluZSBERUJJX0NGR19TV0FQX05PTkUJMHgwMDAwMDAwMAkvLyAgIFN0cmFpZ2h0IC0gZG9uJ3QKKwkJCQkJCS8vICAgc3dhcCBhbnkgYnl0ZXMKKwkJCQkJCS8vICAgKEludGVsKS4KKyNkZWZpbmUgREVCSV9DRkdfU1dBUF8yCQkweDAwMTAwMDAwCS8vICAgMi1ieXRlIHN3YXAgKE1vdG9yb2xhKS4KKyNkZWZpbmUgREVCSV9DRkdfU1dBUF80CQkweDAwMjAwMDAwCS8vICAgNC1ieXRlIHN3YXAuCisjZGVmaW5lIERFQklfQ0ZHXzE2CQkweDAwMDgwMDAwCS8vIFNsYXZlIGlzIGFibGUgdG8KKwkJCQkJCS8vIHNlcnZlIDE2LWJpdAorCQkJCQkJLy8gY3ljbGVzLgorCisjZGVmaW5lIERFQklfQ0ZHX1NMQVZFMTYJMHgwMDA4MDAwMAkvLyBTbGF2ZSBpcyBhYmxlIHRvCisJCQkJCQkvLyBzZXJ2ZSAxNi1iaXQKKwkJCQkJCS8vIGN5Y2xlcy4KKyNkZWZpbmUgREVCSV9DRkdfSU5DCQkweDAwMDQwMDAwCS8vIGVuYWIgYWRkcmVzcworCQkJCQkJLy8gaW5jcmVtZW50IGZvciBibG9jaworCQkJCQkJLy8gdHJhbnNmZXJzLgorI2RlZmluZSBERUJJX0NGR19JTlRFTAkJMHgwMDAyMDAwMAkvLyBJbnRlbCBzdHlsZSBsb2NhbCBidXMuCisjZGVmaW5lIERFQklfQ0ZHX1RJTUVST0ZGCTB4MDAwMTAwMDAJLy8gRGlzYWJsZSB0aW1lci4KKworI2lmIFBMQVRGT1JNID09IElOVEVMCisKKyNkZWZpbmUgREVCSV9UT1VUCQk3CS8vIFdhaXQgNyBQQ0kgY2xvY2tzCisJCQkJCQkvLyAoMjEyIG5zKSBiZWZvcmUKKwkJCQkJCS8vIHBvbGxpbmcgUkRZLgorCisvLyBJbnRlbCBieXRlIGxhbmUgc3RlZXJpbmcgKHBhc3MgdGhyb3VnaCBhbGwgYnl0ZSBsYW5lcykuCisjZGVmaW5lIERFQklfU1dBUAkJREVCSV9DRkdfU1dBUF9OT05FCisKKyNlbGlmIFBMQVRGT1JNID09IE1PVE9ST0xBCisKKyNkZWZpbmUgREVCSV9UT1VUCQkxNQkvLyBXYWl0IDE1IFBDSSBjbG9ja3MgKDQ1NCBucykKKwkJCQkJLy8gbWF4aW11bSBiZWZvcmUgdGltaW5nIG91dC4KKyNkZWZpbmUgREVCSV9TV0FQCQlERUJJX0NGR19TV0FQXzIJLy8gTW90b3JvbGEgYnl0ZSBsYW5lIHN0ZWVyaW5nLgorCisjZW5kaWYKKworLy8gREVCSSBwYWdlIHRhYmxlIGNvbnN0YW50cy4KKyNkZWZpbmUgREVCSV9QQUdFX0RJU0FCTEUJMHgwMDAwMDAwMAkvLyBQYWdpbmcgZGlzYWJsZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vL0VYVFJBIEZST00gT1RIRVIgU0FOU09SQVkgICogLmgvLy8vLy8vLworCisvLyBMb2FkU3JjIHZhbHVlczoKKyNkZWZpbmUgTE9BRFNSQ19JTkRYCQkwCS8vIFByZWxvYWQgY29yZSBpbiByZXNwb25zZSB0bworCQkJCQkvLyBJbmRleC4KKyNkZWZpbmUgTE9BRFNSQ19PVkVSCQkxCS8vIFByZWxvYWQgY29yZSBpbiByZXNwb25zZSB0bworCQkJCQkvLyBPdmVyZmxvdy4KKyNkZWZpbmUgTE9BRFNSQ0JfT1ZFUkEJCTIJLy8gUHJlbG9hZCBCIGNvcmUgaW4gcmVzcG9uc2UKKwkJCQkJLy8gdG8gQSBPdmVyZmxvdy4KKyNkZWZpbmUgTE9BRFNSQ19OT05FCQkzCS8vIE5ldmVyIHByZWxvYWQgY29yZS4KKworLy8gSW50U3JjIHZhbHVlczoKKyNkZWZpbmUgSU5UU1JDX05PTkUgCQkwCS8vIEludGVycnVwdHMgZGlzYWJsZWQuCisjZGVmaW5lIElOVFNSQ19PVkVSIAkJMQkvLyBJbnRlcnJ1cHQgb24gT3ZlcmZsb3cuCisjZGVmaW5lIElOVFNSQ19JTkRYIAkJMgkvLyBJbnRlcnJ1cHQgb24gSW5kZXguCisjZGVmaW5lIElOVFNSQ19CT1RIIAkJMwkvLyBJbnRlcnJ1cHQgb24gSW5kZXggb3IgT3ZlcmZsb3cuCisKKy8vIExhdGNoU3JjIHZhbHVlczoKKyNkZWZpbmUgTEFUQ0hTUkNfQUJfUkVBRAkwCS8vIExhdGNoIG9uIHJlYWQuCisjZGVmaW5lIExBVENIU1JDX0FfSU5EWEEJMQkvLyBMYXRjaCBBIG9uIEEgSW5kZXguCisjZGVmaW5lIExBVENIU1JDX0JfSU5EWEIJMgkvLyBMYXRjaCBCIG9uIEIgSW5kZXguCisjZGVmaW5lIExBVENIU1JDX0JfT1ZFUkEJMwkvLyBMYXRjaCBCIG9uIEEgT3ZlcmZsb3cuCisKKy8vIEluZHhTcmMgdmFsdWVzOgorI2RlZmluZSBJTkRYU1JDX0hBUkQJCTAJLy8gSGFyZHdhcmUgb3Igc29mdHdhcmUgaW5kZXguCisjZGVmaW5lIElORFhTUkNfU09GVAkJMQkvLyBTb2Z0d2FyZSBpbmRleCBvbmx5LgorCisvLyBJbmR4UG9sIHZhbHVlczoKKyNkZWZpbmUgSU5EWFBPTF9QT1MgCQkwCS8vIEluZGV4IGlucHV0IGlzIGFjdGl2ZSBoaWdoLgorI2RlZmluZSBJTkRYUE9MX05FRyAJCTEJLy8gSW5kZXggaW5wdXQgaXMgYWN0aXZlIGxvdy4KKworLy8gQ2xrU3JjIHZhbHVlczoKKyNkZWZpbmUgQ0xLU1JDX0NPVU5URVIJCTAJLy8gQ291bnRlciBtb2RlLgorI2RlZmluZSBDTEtTUkNfVElNRVIJCTIJLy8gVGltZXIgbW9kZS4KKyNkZWZpbmUgQ0xLU1JDX0VYVEVOREVSCQkzCS8vIEV4dGVuZGVyIG1vZGUuCisKKy8vIENsa1BvbCB2YWx1ZXM6CisjZGVmaW5lIENMS1BPTF9QT1MJCTAJLy8gQ291bnRlci9FeHRlbmRlciBjbG9jayBpcworCQkJCQkvLyBhY3RpdmUgaGlnaC4KKyNkZWZpbmUgQ0xLUE9MX05FRwkJMQkvLyBDb3VudGVyL0V4dGVuZGVyIGNsb2NrIGlzCisJCQkJCS8vIGFjdGl2ZSBsb3cuCisjZGVmaW5lIENOVERJUl9VUAkJMAkvLyBUaW1lciBjb3VudHMgdXAuCisjZGVmaW5lIENOVERJUl9ET1dOIAkJMQkvLyBUaW1lciBjb3VudHMgZG93bi4KKworLy8gQ2xrRW5hYiB2YWx1ZXM6CisjZGVmaW5lIENMS0VOQUJfQUxXQVlTCQkwCS8vIENsb2NrIGFsd2F5cyBlbmFibGVkLgorI2RlZmluZSBDTEtFTkFCX0lOREVYCQkxCS8vIENsb2NrIGlzIGVuYWJsZWQgYnkgaW5kZXguCisKKy8vIENsa011bHQgdmFsdWVzOgorI2RlZmluZSBDTEtNVUxUXzRYIAkJMAkvLyA0eCBjbG9jayBtdWx0aXBsaWVyLgorI2RlZmluZSBDTEtNVUxUXzJYIAkJMQkvLyAyeCBjbG9jayBtdWx0aXBsaWVyLgorI2RlZmluZSBDTEtNVUxUXzFYIAkJMgkvLyAxeCBjbG9jayBtdWx0aXBsaWVyLgorCisvLyBCaXQgRmllbGQgcG9zaXRpb25zIGluIENPVU5URVJfU0VUVVAgc3RydWN0dXJlOgorI2RlZmluZSBCRl9MT0FEU1JDCQk5CS8vIFByZWxvYWQgdHJpZ2dlci4KKyNkZWZpbmUgQkZfSU5EWFNSQwkJNwkvLyBJbmRleCBzb3VyY2UuCisjZGVmaW5lIEJGX0lORFhQT0wJCTYJLy8gSW5kZXggcG9sYXJpdHkuCisjZGVmaW5lIEJGX0NMS1NSQwkJNAkvLyBDbG9jayBzb3VyY2UuCisjZGVmaW5lIEJGX0NMS1BPTAkJMwkvLyBDbG9jayBwb2xhcml0eS9jb3VudCBkaXJlY3Rpb24uCisjZGVmaW5lIEJGX0NMS01VTFQJCTEJLy8gQ2xvY2sgbXVsdGlwbGllci4KKyNkZWZpbmUgQkZfQ0xLRU5BQgkJMAkvLyBDbG9jayBlbmFibGUuCisKKy8vIEVudW1lcmF0ZWQgY291bnRlciBvcGVyYXRpbmcgbW9kZXMgc3BlY2lmaWVkIGJ5IENsa1NyYyBiaXQgZmllbGQgaW4KKy8vIGEgQ09VTlRFUl9TRVRVUC4KKworI2RlZmluZSBDTEtTUkNfQ09VTlRFUgkJMAkvLyBDb3VudGVyOiBFTkNfQyBjbG9jaywgRU5DX0QKKwkJCQkJLy8gZGlyZWN0aW9uLgorI2RlZmluZSBDTEtTUkNfVElNRVIJCTIJLy8gVGltZXI6IFNZU19DIGNsb2NrLAorCQkJCQkvLyBkaXJlY3Rpb24gc3BlY2lmaWVkIGJ5CisJCQkJCS8vIENsa1BvbC4KKyNkZWZpbmUgQ0xLU1JDX0VYVEVOREVSCQkzCS8vIEV4dGVuZGVyOiBPVlJfQSBjbG9jaywKKwkJCQkJLy8gRU5DX0QgZGlyZWN0aW9uLgorCisvLyBFbnVtZXJhdGVkIGNvdW50ZXIgY2xvY2sgbXVsdGlwbGllcnMuCisKKyNkZWZpbmUgTVVMVF9YMAkJCTB4MDAwMwkvLyBTdXBwb3J0cyBubyBtdWx0aXBsaWVyczsKKwkJCQkJLy8gZml4ZWQgcGh5c2ljYWwgbXVsdGlwbGllciA9CisJCQkJCS8vIDMuCisjZGVmaW5lIE1VTFRfWDEJCQkweDAwMDIJLy8gU3VwcG9ydHMgbXVsdGlwbGllciB4MTsKKwkJCQkJLy8gZml4ZWQgcGh5c2ljYWwgbXVsdGlwbGllciA9CisJCQkJCS8vIDIuCisjZGVmaW5lIE1VTFRfWDIJCQkweDAwMDEJLy8gU3VwcG9ydHMgbXVsdGlwbGllcnMgeDEsCisJCQkJCS8vIHgyOyBwaHlzaWNhbCBtdWx0aXBsaWVycyA9CisJCQkJCS8vIDEgb3IgMi4KKyNkZWZpbmUgTVVMVF9YNAkJCTB4MDAwMAkvLyBTdXBwb3J0cyBtdWx0aXBsaWVycyB4MSwKKwkJCQkJLy8geDIsIHg0OyBwaHlzaWNhbAorCQkJCQkvLyBtdWx0aXBsaWVycyA9IDAsIDEgb3IgMi4KKworLy8gU2FuaXR5LWNoZWNrIGxpbWl0cyBmb3IgcGFyYW1ldGVycy4KKworI2RlZmluZSBOVU1fQ09VTlRFUlMJCTYJLy8gTWF4aW11bSB2YWxpZCBjb3VudGVyCisJCQkJCS8vIGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIuCisjZGVmaW5lIE5VTV9JTlRTT1VSQ0VTCQk0CisjZGVmaW5lIE5VTV9MQVRDSFNPVVJDRVMJNAorI2RlZmluZSBOVU1fQ0xLTVVMVFMJCTQKKyNkZWZpbmUgTlVNX0NMS1NPVVJDRVMJCTQKKyNkZWZpbmUgTlVNX0NMS1BPTFMJCTIKKyNkZWZpbmUgTlVNX0lOREVYUE9MUwkJMgorI2RlZmluZSBOVU1fSU5ERVhTT1VSQ0VTCTIKKyNkZWZpbmUgTlVNX0xPQURUUklHUwkJNAorCisvLyBCaXQgZmllbGQgcG9zaXRpb25zIGluIENSQSBhbmQgQ1JCIGNvdW50ZXIgY29udHJvbCByZWdpc3RlcnMuCisKKy8vIEJpdCBmaWVsZCBwb3NpdGlvbnMgaW4gQ1JBOgorI2RlZmluZSBDUkFCSVRfSU5EWFNSQ19CCTE0CS8vICAgQiBpbmRleCBzb3VyY2UuCisjZGVmaW5lIENSQUJJVF9DTEtTUkNfQgkJMTIJLy8gICBCIGNsb2NrIHNvdXJjZS4KKyNkZWZpbmUgQ1JBQklUX0lORFhQT0xfQQkxMQkvLyAgIEEgaW5kZXggcG9sYXJpdHkuCisjZGVmaW5lIENSQUJJVF9MT0FEU1JDX0EJIDkJLy8gICBBIHByZWxvYWQgdHJpZ2dlci4KKyNkZWZpbmUgQ1JBQklUX0NMS01VTFRfQQkgNwkvLyAgIEEgY2xvY2sgbXVsdGlwbGllci4KKyNkZWZpbmUgQ1JBQklUX0lOVFNSQ19BCQkgNQkvLyAgIEEgaW50ZXJydXB0IHNvdXJjZS4KKyNkZWZpbmUgQ1JBQklUX0NMS1BPTF9BCQkgNAkvLyAgIEEgY2xvY2sgcG9sYXJpdHkuCisjZGVmaW5lIENSQUJJVF9JTkRYU1JDX0EJIDIJLy8gICBBIGluZGV4IHNvdXJjZS4KKyNkZWZpbmUgQ1JBQklUX0NMS1NSQ19BCQkgMAkvLyAgIEEgY2xvY2sgc291cmNlLgorCisvLyBCaXQgZmllbGQgcG9zaXRpb25zIGluIENSQjoKKyNkZWZpbmUgQ1JCQklUX0lOVFJFU0VUQ01ECTE1CS8vICAgSW50ZXJydXB0IHJlc2V0IGNvbW1hbmQuCisjZGVmaW5lIENSQkJJVF9JTlRSRVNFVF9CCTE0CS8vICAgQiBpbnRlcnJ1cHQgcmVzZXQgZW5hYmxlLgorI2RlZmluZSBDUkJCSVRfSU5UUkVTRVRfQQkxMwkvLyAgIEEgaW50ZXJydXB0IHJlc2V0IGVuYWJsZS4KKyNkZWZpbmUgQ1JCQklUX0NMS0VOQUJfQQkxMgkvLyAgIEEgY2xvY2sgZW5hYmxlLgorI2RlZmluZSBDUkJCSVRfSU5UU1JDX0IJCTEwCS8vICAgQiBpbnRlcnJ1cHQgc291cmNlLgorI2RlZmluZSBDUkJCSVRfTEFUQ0hTUkMJCSA4CS8vICAgQS9CIGxhdGNoIHNvdXJjZS4KKyNkZWZpbmUgQ1JCQklUX0xPQURTUkNfQgkgNgkvLyAgIEIgcHJlbG9hZCB0cmlnZ2VyLgorI2RlZmluZSBDUkJCSVRfQ0xLTVVMVF9CCSAzCS8vICAgQiBjbG9jayBtdWx0aXBsaWVyLgorI2RlZmluZSBDUkJCSVRfQ0xLRU5BQl9CCSAyCS8vICAgQiBjbG9jayBlbmFibGUuCisjZGVmaW5lIENSQkJJVF9JTkRYUE9MX0IJIDEJLy8gICBCIGluZGV4IHBvbGFyaXR5LgorI2RlZmluZSBDUkJCSVRfQ0xLUE9MX0IJCSAwCS8vICAgQiBjbG9jayBwb2xhcml0eS4KKworLy8gQml0IGZpZWxkIG1hc2tzIGZvciBDUkEgYW5kIENSQi4KKworI2RlZmluZSBDUkFNU0tfSU5EWFNSQ19CCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfSU5EWFNSQ19CKSApCisjZGVmaW5lIENSQU1TS19DTEtTUkNfQgkJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9DTEtTUkNfQikgKQorI2RlZmluZSBDUkFNU0tfSU5EWFBPTF9BCSggKHVpbnQxNl90KSggMSA8PCBDUkFCSVRfSU5EWFBPTF9BKSApCisjZGVmaW5lIENSQU1TS19MT0FEU1JDX0EJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9MT0FEU1JDX0EpICkKKyNkZWZpbmUgQ1JBTVNLX0NMS01VTFRfQQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0NMS01VTFRfQSkgKQorI2RlZmluZSBDUkFNU0tfSU5UU1JDX0EJCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfSU5UU1JDX0EpICkKKyNkZWZpbmUgQ1JBTVNLX0NMS1BPTF9BCQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0NMS1BPTF9BKSApCisjZGVmaW5lIENSQU1TS19JTkRYU1JDX0EJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9JTkRYU1JDX0EpICkKKyNkZWZpbmUgQ1JBTVNLX0NMS1NSQ19BCQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0NMS1NSQ19BKSApCisKKyNkZWZpbmUgQ1JCTVNLX0lOVFJFU0VUQ01ECSggKHVpbnQxNl90KSggMSA8PCBDUkJCSVRfSU5UUkVTRVRDTUQpICkKKyNkZWZpbmUgQ1JCTVNLX0lOVFJFU0VUX0IJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9JTlRSRVNFVF9CKSApCisjZGVmaW5lIENSQk1TS19JTlRSRVNFVF9BCSggKHVpbnQxNl90KSggMSA8PCBDUkJCSVRfSU5UUkVTRVRfQSkgKQorI2RlZmluZSBDUkJNU0tfQ0xLRU5BQl9BCSggKHVpbnQxNl90KSggMSA8PCBDUkJCSVRfQ0xLRU5BQl9BKSApCisjZGVmaW5lIENSQk1TS19JTlRTUkNfQgkJKCAodWludDE2X3QpKCAzIDw8IENSQkJJVF9JTlRTUkNfQikgKQorI2RlZmluZSBDUkJNU0tfTEFUQ0hTUkMJCSggKHVpbnQxNl90KSggMyA8PCBDUkJCSVRfTEFUQ0hTUkMpICkKKyNkZWZpbmUgQ1JCTVNLX0xPQURTUkNfQgkoICh1aW50MTZfdCkoIDMgPDwgQ1JCQklUX0xPQURTUkNfQikgKQorI2RlZmluZSBDUkJNU0tfQ0xLTVVMVF9CCSggKHVpbnQxNl90KSggMyA8PCBDUkJCSVRfQ0xLTVVMVF9CKSApCisjZGVmaW5lIENSQk1TS19DTEtFTkFCX0IJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9DTEtFTkFCX0IpICkKKyNkZWZpbmUgQ1JCTVNLX0lORFhQT0xfQgkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0lORFhQT0xfQikgKQorI2RlZmluZSBDUkJNU0tfQ0xLUE9MX0IJCSggKHVpbnQxNl90KSggMSA8PCBDUkJCSVRfQ0xLUE9MX0IpICkKKworI2RlZmluZSBDUkJNU0tfSU5UQ1RSTAkJKCBDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQSB8IENSQk1TS19JTlRSRVNFVF9CICkJLy8gSW50ZXJydXB0IHJlc2V0IGNvbnRyb2wgYml0cy4KKworLy8gQml0IGZpZWxkIHBvc2l0aW9ucyBmb3Igc3RhbmRhcmRpemVkIFNFVFVQIHN0cnVjdHVyZS4KKworI2RlZmluZSBTVERCSVRfSU5UU1JDCQkxMworI2RlZmluZSBTVERCSVRfTEFUQ0hTUkMJCTExCisjZGVmaW5lIFNUREJJVF9MT0FEU1JDCQkgOQorI2RlZmluZSBTVERCSVRfSU5EWFNSQwkJIDcKKyNkZWZpbmUgU1REQklUX0lORFhQT0wJCSA2CisjZGVmaW5lIFNUREJJVF9DTEtTUkMJCSA0CisjZGVmaW5lIFNUREJJVF9DTEtQT0wJCSAzCisjZGVmaW5lIFNUREJJVF9DTEtNVUxUCQkgMQorI2RlZmluZSBTVERCSVRfQ0xLRU5BQgkJIDAKKworLy8gQml0IGZpZWxkIG1hc2tzIGZvciBzdGFuZGFyZGl6ZWQgU0VUVVAgc3RydWN0dXJlLgorCisjZGVmaW5lIFNURE1TS19JTlRTUkMJCSggKHVpbnQxNl90KSggMyA8PCBTVERCSVRfSU5UU1JDICAgKSApCisjZGVmaW5lIFNURE1TS19MQVRDSFNSQwkJKCAodWludDE2X3QpKCAzIDw8IFNUREJJVF9MQVRDSFNSQyApICkKKyNkZWZpbmUgU1RETVNLX0xPQURTUkMJCSggKHVpbnQxNl90KSggMyA8PCBTVERCSVRfTE9BRFNSQyAgKSApCisjZGVmaW5lIFNURE1TS19JTkRYU1JDCQkoICh1aW50MTZfdCkoIDEgPDwgU1REQklUX0lORFhTUkMgICkgKQorI2RlZmluZSBTVERNU0tfSU5EWFBPTAkJKCAodWludDE2X3QpKCAxIDw8IFNUREJJVF9JTkRYUE9MICApICkKKyNkZWZpbmUgU1RETVNLX0NMS1NSQwkJKCAodWludDE2X3QpKCAzIDw8IFNUREJJVF9DTEtTUkMgICApICkKKyNkZWZpbmUgU1RETVNLX0NMS1BPTAkJKCAodWludDE2X3QpKCAxIDw8IFNUREJJVF9DTEtQT0wgICApICkKKyNkZWZpbmUgU1RETVNLX0NMS01VTFQJCSggKHVpbnQxNl90KSggMyA8PCBTVERCSVRfQ0xLTVVMVCAgKSApCisjZGVmaW5lIFNURE1TS19DTEtFTkFCCQkoICh1aW50MTZfdCkoIDEgPDwgU1REQklUX0NMS0VOQUIgICkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qIHR5cGVkZWYgc3RydWN0IGluZGV4Q291bnRlciAqLworLyogeyAqLworLyogICB1bnNpZ25lZCBpbnQgYW87ICovCisvKiAgIHVuc2lnbmVkIGludCBhaTsgKi8KKy8qICAgdW5zaWduZWQgaW50IGRpZ291dDsgKi8KKy8qICAgdW5zaWduZWQgaW50IGRpZ2luOyAqLworLyogICB1bnNpZ25lZCBpbnQgZW5jOyAqLworLyogfUNhbGxDb3VudGVyOyAqLworCit0eXBlZGVmIHN0cnVjdCBidWZmZXJETUEgeworCWRtYV9hZGRyX3QgUGh5c2ljYWxCYXNlOworCXZvaWQgKkxvZ2ljYWxCYXNlOworCXVpbnQzMl90IERNQUhhbmRsZTsKK30gRE1BQlVGOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTM4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKQEAgLTAsMCArMSwyOTMyIEBACisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi4xIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJCZXJuZCBQb3JyLCBCZXJuZFBvcnJAZjJzLmNvbSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlN0aXJsaW5nL0lUTCBVU0ItRFVYIC0tIEJlcm5kLlBvcnJAZjJzLmNvbSIKKy8qCisgICBjb21lZGkvZHJpdmVycy91c2JkdXguYworICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgQmVybmQgUG9yciwgQmVybmQuUG9yckBmMnMuY29tCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqLworLyoKK0RyaXZlcjogdXNiZHV4CitEZXNjcmlwdGlvbjogVW5pdmVyc2l0eSBvZiBTdGlybGluZyBVU0IgREFRICYgSU5DSVRFIFRlY2hub2xvZ3kgTGltaXRlZAorRGV2aWNlczogW0lUTF0gVVNCLURVWCAodXNiZHV4Lm8pCitBdXRob3I6IEJlcm5kIFBvcnIgPEJlcm5kUG9yckBmMnMuY29tPgorVXBkYXRlZDogMjUgTm92IDIwMDcKK1N0YXR1czogVGVzdGluZworQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICBZb3UgaGF2ZSB0byB1cGxvYWQgZmlybXdhcmUgd2l0aCB0aGUgLWkgb3B0aW9uLiBUaGUKKyAgZmlybXdhcmUgaXMgdXN1YWxseSBpbnN0YWxsZWQgdW5kZXIgL3Vzci9zaGFyZS91c2Igb3IKKyAgL3Vzci9sb2NhbC9zaGFyZS91c2Igb3IgL2xpYi9maXJtd2FyZS4KKworQ29ubmVjdGlvbiBzY2hlbWUgZm9yIHRoZSBjb3VudGVyIGF0IHRoZSBkaWdpdGFsIHBvcnQ6CisgIDA9L0NMSzAsIDE9VVAvRE9XTjAsIDI9UkVTRVQwLCA0PS9DTEsxLCA1PVVQL0RPV04xLCA2PVJFU0VUMS4KKyAgVGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGNvdW50ZXIgaXMgYXBwcm94aW1hdGVseSA1MDBIei4KKworUGxlYXNlIG5vdGUgdGhhdCB1bmRlciBVU0IyLjAgdGhlIGxlbmd0aCBvZiB0aGUgY2hhbm5lbCBsaXN0IGRldGVybWluZXMKK3RoZSBtYXggc2FtcGxpbmcgcmF0ZS4gSWYgeW91IHNhbXBsZSBvbmx5IG9uZSBjaGFubmVsIHlvdSBnZXQgOGtIegorc2FtcGxpbmcgcmF0ZS4gSWYgeW91IHNhbXBsZSB0d28gY2hhbm5lbHMgeW91IGdldCA0a0h6IGFuZCBzbyBvbi4KKyovCisvKgorICogSSBtdXN0IGdpdmUgY3JlZGl0IGhlcmUgdG8gQ2hyaXMgQmF1Z2hlciB3aG8KKyAqIHdyb3RlIHRoZSBkcml2ZXIgZm9yIEFULU1JTy0xNmQuIEkgdXNlZCBzb21lIHBhcnRzIG9mIHRoaXMKKyAqIGRyaXZlci4gSSBhbHNvIG11c3QgZ2l2ZSBjcmVkaXRzIHRvIERhdmlkIEJyb3duZWxsCisgKiB3aG8gc3VwcG9ydGVkIG1lIHdpdGggdGhlIFVTQiBkZXZlbG9wbWVudC4KKyAqCisgKiBCZXJuZCBQb3JyCisgKgorICoKKyAqIFJldmlzaW9uIGhpc3Rvcnk6CisgKiAwLjk0OiBEL0Egb3V0cHV0IHNob3VsZCB3b3JrIG5vdyB3aXRoIGFueSBjaGFubmVsIGxpc3QgY29tYmluYXRpb25zCisgKiAwLjk1OiAub3duZXIgY29tbWVudGVkIG91dCBmb3Iga2VybmVsIHZlcnMgYmVsb3cgMi40LjE5CisgKiAgICAgICBzYW5pdHkgY2hlY2tzIGluIGFpL2FvX2NtZAorICogMC45NjogdHJ5aW5nIHRvIGdldCBpdCB3b3JraW5nIHdpdGggMi42LCBtb3ZlZCBhbGwgbWVtb3J5IGFsbG9jIHRvIGNvbWVkaSdzCisgKiAgICAgICBhdHRhY2ggZmluYWwgVVNCIElEcworICogICAgICAgbW92ZWQgbWVtb3J5IGFsbG9jYXRpb24gY29tcGxldGVseSB0byB0aGUgY29ycmVzcG9uZGluZyBjb21lZGkKKyAqICAgICAgIGZ1bmN0aW9ucyBmaXJtd2FyZSB1cGxvYWQgaXMgYnkgZnhsb2FkIGFuZCBubyBsb25nZXIgYnkgY29tZWRpIChkdWUgdG8KKyAqICAgICAgIGVudW1lcmF0aW9uKQorICogMC45NzogVVNCIElEcyByZWNlaXZlZCwgYWRqdXN0ZWQgdGFibGUKKyAqIDAuOTg6IFNNUCwgbG9ja2luZywgbWVtcm95IGFsbG9jOiBtb3ZlZCBhbGwgdXNiIG1lbW9yeSBhbGxvYworICogICAgICAgdG8gdGhlIHVzYiBzdWJzeXN0ZW0gYW5kIG1vdmVkIGFsbCBjb21lZGkgcmVsYXRlZCBtZW1vcnkKKyAqICAgICAgIGFsbG9jIHRvIGNvbWVkaS4KKyAqICAgICAgIHwga2VybmVsIHwgcmVnaXN0cmF0aW9uIHwgdXNiZHV4LXVzYiB8IHVzYmR1eC1jb21lZGkgfCBjb21lZGkgfAorICogMC45OTogVVNCIDIuMDogY2hhbmdlZCBwcm90b2NvbCB0byBpc29jaHJvbm91cyB0cmFuc2ZlcgorICogICAgICAgICAgICAgICAgSVJRIHRyYW5zZmVyIGlzIHRvbyBidWdneSBhbmQgdG9vIHJpc2t5IGluIDIuMAorICogICAgICAgICAgICAgICAgZm9yIHRoZSBoaWdoIHNwZWVkIElTTyB0cmFuc2ZlciBpcyBub3cgYSB3b3JraW5nIHZlcnNpb24KKyAqICAgICAgICAgICAgICAgIGF2YWlsYWJsZQorICogMC45OWI6IEluY3JlYXNlZCB0aGUgaXNvIHRyYW5zZmVyIGJ1ZmZlciBmb3IgaGlnaCBzcC50byAxMCBidWZmZXJzLiBTb21lIFZJQQorICogICAgICAgIGNoaXBzZXRzIG1pc3Mgb3V0IElSUXMuIERlZXBlciBidWZmZXJpbmcgaXMgbmVlZGVkLgorICogMS4wMDogZnVsbCBVU0IgMi4wIHN1cHBvcnQgZm9yIHRoZSBBL0QgY29udmVydGVyLiBOb3c6IG1heCA4a0h6IHNhbXBsaW5nCisgKiAgICAgICByYXRlLgorICogICAgICAgRmlybXdhcmUgdmVycyAxLjAwIGlzIG5lZWRlZCBmb3IgdGhpcy4KKyAqICAgICAgIFR3byAxNiBiaXQgdXAvZG93bi9yZXNldCBjb3VudGVyIHdpdGggYSBzYW1wbGluZyByYXRlIG9mIDFrSHoKKyAqICAgICAgIEFuZCBsb2FkcyBvZiBjbGVhbmluZyB1cCwgaW4gcGFydGljdWxhciBzdHJlYW1saW5pbmcgdGhlCisgKiAgICAgICBidWxrIHRyYW5zZmVycy4KKyAqIDEuMTogIG1vdmVkIEVQNCB0cmFuc2ZlcnMgdG8gRVAxIHRvIG1ha2Ugc3BhY2UgZm9yIGEgUFdNIG91dHB1dCBvbiBFUDQKKyAqIDEuMjogIGFkZGVkIFBXTSBzdXBvcnQgdmlhIEVQNAorICogMi4wOiAgUFdNIHNlZW1zIHRvIGJlIHN0YWJsZSBhbmQgaXMgbm90IGludGVyZmVyaW5nIHdpdGggdGhlIG90aGVyIGZ1bmN0aW9ucworICogMi4xOiAgY2hhbmdlZCBQV00gQVBJCisgKgorICovCisKKy8qIGdlbmVyYXRlcyBsb2FkcyBvZiBkZWJ1ZyBpbmZvICovCisvKiAjZGVmaW5lIE5PSVNZX0RVWF9ERUJVR0JVRyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNkZWZpbmUgQk9BUkROQU1FICJ1c2JkdXgiCisKKy8qIHRpbWVvdXQgZm9yIHRoZSBVU0ItdHJhbnNmZXIgKi8KKyNkZWZpbmUgRVpUSU1FT1VUIDMwCisKKy8qIGNvbnN0YW50cyBmb3IgImZpcm13YXJlIiB1cGxvYWQgYW5kIGRvd25sb2FkICovCisjZGVmaW5lIFVTQkRVWFNVQl9GSVJNV0FSRSAweEEwCisjZGVmaW5lIFZFTkRPUl9ESVJfSU4gIDB4QzAKKyNkZWZpbmUgVkVORE9SX0RJUl9PVVQgMHg0MAorCisvKiBpbnRlcm5hbCBhZHJlc3NlcyBvZiB0aGUgODA1MSBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgVVNCRFVYU1VCX0NQVUNTIDB4RTYwMAorCisvKgorICogdGhlIG1pbm9yIGRldmljZSBudW1iZXIsIG1ham9yIGlzIDE4MCBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgYW5kIHRvCisgKiB1cGxvYWQgc3BlY2lhbCBmaXJtd2FyZSAocHJvZ3JhbW1pbmcgdGhlIGVlcHJvbSBldGMpIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlCisgKiB3aXRoIHRoZSBjb21lZGkgZnJhbXdvcmsKKyAqLworI2RlZmluZSBVU0JEVVhTVUJfTUlOT1IgMzIKKworLyogbWF4IGxlbmdodGggb2YgdGhlIHRyYW5zZmVyLWJ1ZmZlciBmb3Igc29mdHdhcmUgdXBsb2FkICovCisjZGVmaW5lIFRCX0xFTiAweDIwMDAKKworLyogSW5wdXQgZW5kcG9pbnQgbnVtYmVyOiBJU08vSVJRICovCisjZGVmaW5lIElTT0lORVAgICAgICAgICAgIDYKKworLyogT3V0cHV0IGVuZHBvaW50IG51bWJlcjogSVNPL0lSUSAqLworI2RlZmluZSBJU09PVVRFUCAgICAgICAgICAyCisKKy8qIFRoaXMgRVAgc2VuZHMgRFVYIGNvbW1hbmRzIHRvIFVTQkRVWCAqLworI2RlZmluZSBDT01NQU5EX09VVF9FUCAgICAgMQorCisvKiBUaGlzIEVQIHJlY2VpdmVzIHRoZSBEVVggY29tbWFuZHMgZnJvbSBVU0JEVVggKi8KKyNkZWZpbmUgQ09NTUFORF9JTl9FUCAgICAgICAgOAorCisvKiBPdXRwdXQgZW5kcG9pbnQgZm9yIFBXTSAqLworI2RlZmluZSBQV01fRVAgICAgICAgICA0CisKKy8qIDMwMEh6IG1heCBmcmVxdSB1bmRlciBQV00gKi8KKyNkZWZpbmUgTUlOX1BXTV9QRVJJT0QgICgobG9uZykoMUU5LzMwMCkpCisKKy8qIERlZmF1bHQgUFdNIGZyZXF1ZW5jeSAqLworI2RlZmluZSBQV01fREVGQVVMVF9QRVJJT0QgKChsb25nKSgxRTkvMTAwKSkKKworLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCisjZGVmaW5lIE5VTUNIQU5ORUxTICAgICAgIDgKKworLyogU2l6ZSBvZiBvbmUgQS9EIHZhbHVlICovCisjZGVmaW5lIFNJWkVBRElOICAgICAgICAgICgoc2l6ZW9mKGludDE2X3QpKSkKKworLyoKKyAqIFNpemUgb2YgdGhlIGlucHV0LWJ1ZmZlciBJTiBCWVRFUworICogQWx3YXlzIG11bHRpcGxlIG9mIDggZm9yIDggbWljcm9mcmFtZXMgd2hpY2ggaXMgbmVlZGVkIGluIHRoZSBoaWdoc3BlZWQgbW9kZQorICovCisjZGVmaW5lIFNJWkVJTkJVRiAgICAgICAgICgoOCpTSVpFQURJTikpCisKKy8qIDE2IGJ5dGVzLiAqLworI2RlZmluZSBTSVpFSU5TTkJVRiAgICAgICAxNgorCisvKiBOdW1iZXIgb2YgREEgY2hhbm5lbHMgKi8KKyNkZWZpbmUgTlVNT1VUQ0hBTk5FTFMgICAgOAorCisvKiBzaXplIG9mIG9uZSB2YWx1ZSBmb3IgdGhlIEQvQSBjb252ZXJ0ZXI6IGNoYW5uZWwgYW5kIHZhbHVlICovCisjZGVmaW5lIFNJWkVEQU9VVCAgICAgICAgICAoKHNpemVvZihpbnQ4X3QpK3NpemVvZihpbnQxNl90KSkpCisKKy8qCisgKiBTaXplIG9mIHRoZSBvdXRwdXQtYnVmZmVyIGluIGJ5dGVzCisgKiBBY3R1YWxseSBvbmx5IHRoZSBmaXJzdCA0IHRyaXBsZXRzIGFyZSB1c2VkIGJ1dCBmb3IgdGhlCisgKiBoaWdoIHNwZWVkIG1vZGUgd2UgbmVlZCB0byBwYWQgaXQgdG8gOCAobWljcm9mcmFtZXMpLgorICovCisjZGVmaW5lIFNJWkVPVVRCVUYgICAgICAgICAoKDgqU0laRURBT1VUKSkKKworLyoKKyAqIFNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgdGhlIGR1eCBjb21tYW5kczoganVzdCBub3cgbWF4IHNpemUgaXMgZGV0ZXJtaW5lZAorICogYnkgdGhlIGFuYWxvZ3VlIG91dCArIGNvbW1hbmQgYnl0ZSArIHBhbmljIGJ5dGVzLi4uCisgKi8KKyNkZWZpbmUgU0laRU9GRFVYQlVGRkVSICAgICgoOCpTSVpFREFPVVQrMikpCisKKy8qIE51bWJlciBvZiBpbi1VUkJzIHdoaWNoIHJlY2VpdmUgdGhlIGRhdGE6IG1pbj0yICovCisjZGVmaW5lIE5VTU9GSU5CVUZGRVJTRlVMTCAgICAgNQorCisvKiBOdW1iZXIgb2Ygb3V0LVVSQnMgd2hpY2ggc2VuZCB0aGUgZGF0YTogbWluPTIgKi8KKyNkZWZpbmUgTlVNT0ZPVVRCVUZGRVJTRlVMTCAgICA1CisKKy8qIE51bWJlciBvZiBpbi1VUkJzIHdoaWNoIHJlY2VpdmUgdGhlIGRhdGE6IG1pbj01ICovCisvKiBtdXN0IGhhdmUgbW9yZSBidWZmZXJzIGR1ZSB0byBidWdneSBVU0IgY3RyICovCisjZGVmaW5lIE5VTU9GSU5CVUZGRVJTSElHSCAgICAgMTAKKworLyogTnVtYmVyIG9mIG91dC1VUkJzIHdoaWNoIHNlbmQgdGhlIGRhdGE6IG1pbj01ICovCisvKiBtdXN0IGhhdmUgbW9yZSBidWZmZXJzIGR1ZSB0byBidWdneSBVU0IgY3RyICovCisjZGVmaW5lIE5VTU9GT1VUQlVGRkVSU0hJR0ggICAgMTAKKworLyogVG90YWwgbnVtYmVyIG9mIHVzYmR1eCBkZXZpY2VzICovCisjZGVmaW5lIE5VTVVTQkRVWCAgICAgICAgICAgICAxNgorCisvKiBBbmFsb2d1ZSBpbiBzdWJkZXZpY2UgKi8KKyNkZWZpbmUgU1VCREVWX0FEICAgICAgICAgICAgIDAKKworLyogQW5hbG9ndWUgb3V0IHN1YmRldmljZSAqLworI2RlZmluZSBTVUJERVZfREEgICAgICAgICAgICAgMQorCisvKiBEaWdpdGFsIEkvTyAqLworI2RlZmluZSBTVUJERVZfRElPICAgICAgICAgICAgMgorCisvKiBjb3VudGVyICovCisjZGVmaW5lIFNVQkRFVl9DT1VOVEVSICAgICAgICAzCisKKy8qIHRpbWVyIGFrYSBwd20gb3V0cHV0ICovCisjZGVmaW5lIFNVQkRFVl9QV00gICAgICAgICAgICA0CisKKy8qIG51bWJlciBvZiByZXRyaWVzIHRvIGdldCB0aGUgcmlnaHQgZHV4IGNvbW1hbmQgKi8KKyNkZWZpbmUgUkVUUklFUyAxMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb21lZGkgY29uc3RhbnRzICovCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91c2JkdXhfYWlfcmFuZ2UgPSB7IDQsIHsKKwkJCUJJUF9SQU5HRSg0LjA5NiksCisJCQlCSVBfUkFOR0UoNC4wOTYgLyAyKSwKKwkJCVVOSV9SQU5HRSg0LjA5NiksCisJCQlVTklfUkFOR0UoNC4wOTYgLyAyKQorCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VzYmR1eF9hb19yYW5nZSA9IHsgMiwgeworCQkJQklQX1JBTkdFKDQuMDk2KSwKKwkJCVVOSV9SQU5HRSg0LjA5NiksCisJfQorfTsKKworLyoKKyAqIHByaXZhdGUgc3RydWN0dXJlIG9mIG9uZSBzdWJkZXZpY2UKKyAqLworCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdoaWNoIGhvbGRzIGFsbCB0aGUgZGF0YSBvZgorICogdGhpcyBkcml2ZXIgb25lIHN1YiBkZXZpY2UganVzdCBub3c6IEEvRAorICovCitzdHJ1Y3QgdXNiZHV4c3ViIHsKKwkvKiBhdHRhY2hlZD8gKi8KKwlpbnQgYXR0YWNoZWQ7CisJLyogaXMgaXQgYXNzb2NpYXRlZCB3aXRoIGEgc3ViZGV2aWNlPyAqLworCWludCBwcm9iZWQ7CisJLyogcG9pbnRlciB0byB0aGUgdXNiLWRldmljZSAqLworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJLyogYWN0dWFsIG51bWJlciBvZiBpbi1idWZmZXJzICovCisJaW50IG51bU9mSW5CdWZmZXJzOworCS8qIGFjdHVhbCBudW1iZXIgb2Ygb3V0LWJ1ZmZlcnMgKi8KKwlpbnQgbnVtT2ZPdXRCdWZmZXJzOworCS8qIElTTy10cmFuc2ZlciBoYW5kbGluZzogYnVmZmVycyAqLworCXN0cnVjdCB1cmIgKip1cmJJbjsKKwlzdHJ1Y3QgdXJiICoqdXJiT3V0OworCS8qIHB3bS10cmFuc2ZlciBoYW5kbGluZyAqLworCXN0cnVjdCB1cmIgKnVyYlB3bTsKKwkvKiBQV00gcGVyaW9kICovCisJbHNhbXBsX3QgcHdtUGVyaW9kOworCS8qIFBXTSBpbnRlcm5hbCBkZWxheSBmb3IgdGhlIEdQSUYgaW4gdGhlIEZYMiAqLworCWludDhfdCBwd21EZWxheTsKKwkvKiBzaXplIG9mIHRoZSBQV00gYnVmZmVyIHdoaWNoIGhvbGRzIHRoZSBiaXQgcGF0dGVybiAqLworCWludCBzaXplUHdtQnVmOworCS8qIGlucHV0IGJ1ZmZlciBmb3IgdGhlIElTTy10cmFuc2ZlciAqLworCWludDE2X3QgKmluQnVmZmVyOworCS8qIGlucHV0IGJ1ZmZlciBmb3Igc2luZ2xlIGluc24gKi8KKwlpbnQxNl90ICppbnNuQnVmZmVyOworCS8qIG91dHB1dCBidWZmZXIgZm9yIHNpbmdsZSBEQSBvdXRwdXRzICovCisJaW50MTZfdCAqb3V0QnVmZmVyOworCS8qIGludGVyZmFjZSBudW1iZXIgKi8KKwlpbnQgaWZudW07CisJLyogaW50ZXJmYWNlIHN0cnVjdHVyZSBpbiAyLjYgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCS8qIGNvbWVkaSBkZXZpY2UgZm9yIHRoZSBpbnRlcnJ1cHQgY29udGV4dCAqLworCWNvbWVkaV9kZXZpY2UgKmNvbWVkaWRldjsKKwkvKiBpcyBpdCBVU0JfU1BFRURfSElHSCBvciBub3Q/ICovCisJc2hvcnQgaW50IGhpZ2hfc3BlZWQ7CisJLyogYXN5bmNocm9ub3VzIGNvbW1hbmQgaXMgcnVubmluZyAqLworCXNob3J0IGludCBhaV9jbWRfcnVubmluZzsKKwlzaG9ydCBpbnQgYW9fY21kX3J1bm5pbmc7CisJLyogcHdtIGlzIHJ1bm5pbmcgKi8KKwlzaG9ydCBpbnQgcHdtX2NtZF9ydW5uaW5nOworCS8qIGNvbnRpbm91cyBhcXVpc2l0aW9uICovCisJc2hvcnQgaW50IGFpX2NvbnRpbm91czsKKwlzaG9ydCBpbnQgYW9fY29udGlub3VzOworCS8qIG51bWJlciBvZiBzYW1wbGVzIHRvIGFxdWlyZSAqLworCWludCBhaV9zYW1wbGVfY291bnQ7CisJaW50IGFvX3NhbXBsZV9jb3VudDsKKwkvKiB0aW1lIGJldHdlZW4gc2FtcGxlcyBpbiB1bml0cyBvZiB0aGUgdGltZXIgKi8KKwl1bnNpZ25lZCBpbnQgYWlfdGltZXI7CisJdW5zaWduZWQgaW50IGFvX3RpbWVyOworCS8qIGNvdW50ZXIgYmV0d2VlbiBhcXVpc2l0aW9ucyAqLworCXVuc2lnbmVkIGludCBhaV9jb3VudGVyOworCXVuc2lnbmVkIGludCBhb19jb3VudGVyOworCS8qIGludGVydmFsIGluIGZyYW1lcy91ZnJhbWVzICovCisJdW5zaWduZWQgaW50IGFpX2ludGVydmFsOworCS8qIEQvQSBjb21tYW5kcyAqLworCWludDhfdCAqZGFjX2NvbW1hbmRzOworCS8qIGNvbW1hbmRzICovCisJaW50OF90ICpkdXhfY29tbWFuZHM7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07Cit9OworCisvKgorICogVGhlIHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgdXNiLWRhdGEgb2YgdGhlIGRyaXZlciBpcyBhbHNvIHRoZSBwcml2YXRlIGRhdGEKKyAqIGZvciB0aGUgY29tZWRpLWRldmljZS4gIFRoaXMgaGFzIHRvIGJlIGdsb2JhbCBhcyB0aGUgdXNiIHN1YnN5c3RlbSBuZWVkcworICogZ2xvYmFsIHZhcmlhYmxlcy4gVGhlIG90aGVyIHJlYXNvbiBpcyB0aGF0IHRoaXMgc3RydWN0dXJlIG11c3QgYmUgdGhlcmUKKyAqIF9iZWZvcmVfIGFueSBjb21lZGkgY29tbWFuZCBpcyBpc3N1ZWQuIFRoZSB1c2Igc3Vic3lzdGVtIG11c3QgYmUgaW5pdGlhbGlzZWQKKyAqIGJlZm9yZSBjb21lZGkgY2FuIGFjY2VzcyBpdC4KKyAqLworc3RhdGljIHN0cnVjdCB1c2JkdXhzdWIgdXNiZHV4c3ViW05VTVVTQkRVWF07CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKHN0YXJ0X3N0b3Bfc2VtKTsKKworLyoKKyAqIFN0b3BzIHRoZSBkYXRhIGFjcXVpc2lvbgorICogSXQgc2hvdWxkIGJlIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYW55IGNvbnRleHQKKyAqLworc3RhdGljIGludCB1c2JkdXhzdWJfdW5saW5rX0luVVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wKQoreworCWludCBpID0gMDsKKwlpbnQgZXJyID0gMDsKKworCWlmICh1c2JkdXhzdWJfdG1wICYmIHVzYmR1eHN1Yl90bXAtPnVyYkluKSB7CisJCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJfdG1wLT5udW1PZkluQnVmZmVyczsgaSsrKSB7CisJCQlpZiAodXNiZHV4c3ViX3RtcC0+dXJiSW5baV0pIHsKKwkJCQkvKiBXZSB3YWl0IGhlcmUgdW50aWwgYWxsIHRyYW5zZmVycyBoYXZlIGJlZW4KKwkJCQkgKiBjYW5jZWxsZWQuICovCisJCQkJdXNiX2tpbGxfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldKTsKKwkJCX0KKwkJCWRldl9kYmcoJnVzYmR1eHN1Yl90bXAtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGk6IHVzYmR1eDogdW5saW5rZWQgSW5VUkIgJWQsIGVycj0lZFxuIiwKKwkJCQlpLCBlcnIpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgc3RvcCBhIHJ1bm5pbmcgYWNxdWlzaXRpb24gb3BlcmF0aW9uCisgKiBJcyBjYWxsZWQgZnJvbSB3aXRoaW4gdGhpcyBkcml2ZXIgZnJvbSBib3RoIHRoZQorICogaW50ZXJydXB0IGNvbnRleHQgYW5kIGZyb20gY29tZWRpCisgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2FpX3N0b3Aoc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIsIGludCBkb191bmxpbmspCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGk/OiB1c2JkdXhfYWlfc3RvcDogdGhpc191c2JkdXhzdWI9TlVMTCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpOiB1c2JkdXhfYWlfc3RvcFxuIik7CisKKwlpZiAoZG9fdW5saW5rKSB7CisJCS8qIHN0b3AgYXF1aXN0aW9uICovCisJCXJldCA9IHVzYmR1eHN1Yl91bmxpbmtfSW5VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwl9CisKKwl0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgd2lsbCBjYW5jZWwgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbi4KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IGNvbWVkaSBidXQgbmV2ZXIgZnJvbSBpbnNpZGUgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCB1c2JkdXhfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YjsKKwlpbnQgcmVzID0gMDsKKworCS8qIGZvcmNlIHVubGluayBvZiBhbGwgdXJicyAqLworCXRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpOiB1c2JkdXhfYWlfY2FuY2VsXG4iKTsKKworCS8qIHByZXZlbnQgb3RoZXIgQ1BVcyBmcm9tIHN1Ym1pdHRpbmcgbmV3IGNvbW1hbmRzIGp1c3Qgbm93ICovCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogdW5saW5rIG9ubHkgaWYgdGhlIHVyYiByZWFsbHkgaGFzIGJlZW4gc3VibWl0dGVkICovCisJcmVzID0gdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyk7CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKKy8qIGFuYWxvZ3VlIElOIC0gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIHZvaWQgdXNiZHV4c3ViX2FpX0lzb2NJcnEoc3RydWN0IHVyYiAqdXJiKQoreworCWludCBpLCBlcnIsIG47CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWI7CisJY29tZWRpX2RldmljZSAqdGhpc19jb21lZGlkZXY7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCS8qIHRoZSBjb250ZXh0IHZhcmlhYmxlIHBvaW50cyB0byB0aGUgc3ViZGV2aWNlICovCisJdGhpc19jb21lZGlkZXYgPSB1cmItPmNvbnRleHQ7CisJLyogdGhlIHByaXZhdGUgc3RydWN0dXJlIG9mIHRoZSBzdWJkZXZpY2UgaXMgc3RydWN0IHVzYmR1eHN1YiAqLworCXRoaXNfdXNiZHV4c3ViID0gdGhpc19jb21lZGlkZXYtPnByaXZhdGU7CisJLyogc3ViZGV2aWNlIHdoaWNoIGlzIHRoZSBBRCBjb252ZXJ0ZXIgKi8KKwlzID0gdGhpc19jb21lZGlkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfQUQ7CisKKwkvKiBmaXJzdCB3ZSB0ZXN0IGlmIHNvbWV0aGluZyB1bnVzdWFsIGhhcyBqdXN0IGhhcHBlbmVkICovCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogY29weSB0aGUgcmVzdWx0IGluIHRoZSB0cmFuc2ZlciBidWZmZXIgKi8KKwkJbWVtY3B5KHRoaXNfdXNiZHV4c3ViLT5pbkJ1ZmZlciwKKwkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCBTSVpFSU5CVUYpOworCQlicmVhazsKKwljYXNlIC1FSUxTRVE6CisJCS8qIGVycm9yIGluIHRoZSBJU09jaHJvbm91cyBkYXRhICovCisJCS8qIHdlIGRvbid0IGNvcHkgdGhlIGRhdGEgaW50byB0aGUgdHJhbnNmZXIgYnVmZmVyICovCisJCS8qIGFuZCByZWN5Y2xlIHRoZSBsYXN0IGRhdGEgYnl0ZSAqLworCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LAorCQkJImNvbWVkaSVkOiB1c2JkdXg6IENSQyBlcnJvciBpbiBJU08gSU4gc3RyZWFtLlxuIiwKKwkJCXRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYtPm1pbm9yKTsKKworCQlicmVhazsKKworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FQ09OTkFCT1JURUQ6CisJCS8qIGhhcHBlbnMgYWZ0ZXIgYW4gdW5saW5rIGNvbW1hbmQgKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQkJLyogd2UgYXJlIHN0aWxsIHJ1bm5pbmcgYSBjb21tYW5kICovCisJCQkvKiB0ZWxsIHRoaXMgY29tZWRpICovCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCS8qIHN0b3AgdGhlIHRyYW5zZmVyIHcvbyB1bmxpbmsgKi8KKwkJCXVzYmR1eF9haV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQkvKiBhIHJlYWwgZXJyb3Igb24gdGhlIGJ1cyAqLworCQkvKiBwYXNzIGVycm9yIHRvIGNvbWVkaSBpZiB3ZSBhcmUgcmVhbGx5IHJ1bm5pbmcgYSBjb21tYW5kICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJIk5vbi16ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQgaW4gYWkgaW50ciAiCisJCQkJImNvbnRleHQ6ICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCS8qIGRvbid0IGRvIGFuIHVubGluayBoZXJlICovCisJCQl1c2JkdXhfYWlfc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogYXQgdGhpcyBwb2ludCB3ZSBhcmUgcmVhc29uYWJseSBzdXJlIHRoYXQgbm90aGluZyBkb2RneSBoYXMgaGFwcGVuZWQKKwkgKiBhcmUgd2UgcnVubmluZyBhIGNvbW1hbmQ/CisJICovCisJaWYgKHVubGlrZWx5KCghKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykpKSkgeworCQkvKgorCQkgKiBub3QgcnVubmluZyBhIGNvbW1hbmQsIGRvIG5vdCBjb250aW51ZSBleGVjdXRpb24gaWYgbm8KKwkJICogYXN5bmNocm9ub3VzIGNvbW1hbmQgaXMgcnVubmluZyBpbiBwYXJ0aWN1bGFyIG5vdCByZXN1Ym1pdAorCQkgKi8KKwkJcmV0dXJuOworCX0KKworCXVyYi0+ZGV2ID0gdGhpc191c2JkdXhzdWItPnVzYmRldjsKKworCS8qIHJlc3VibWl0IHRoZSB1cmIgKi8KKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJImNvbWVkaV86IHVyYiByZXN1Ym1pdCBmYWlsZWQgaW4gaW50LWNvbnRleHQhIGVycj0lZFxuIiwKKwkJCWVycik7CisJCWlmIChlcnIgPT0gLUVMMk5TWU5DKQorCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkiYnVnZ3kgVVNCIGhvc3QgY29udHJvbGxlciBvciBidWcgaW4gSVJRICIKKwkJCQkiaGFuZGxlciFcbiIpOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCS8qIGRvbid0IGRvIGFuIHVubGluayBoZXJlICovCisJCXVzYmR1eF9haV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJcmV0dXJuOworCX0KKworCXRoaXNfdXNiZHV4c3ViLT5haV9jb3VudGVyLS07CisJaWYgKGxpa2VseSh0aGlzX3VzYmR1eHN1Yi0+YWlfY291bnRlciA+IDApKQorCQlyZXR1cm47CisKKwkvKiB0aW1lciB6ZXJvLCB0cmFuc2ZlciBtZWFzdXJlbWVudHMgdG8gY29tZWRpICovCisJdGhpc191c2JkdXhzdWItPmFpX2NvdW50ZXIgPSB0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXI7CisKKwkvKiB0ZXN0LCBpZiB3ZSB0cmFuc21pdCBvbmx5IGEgZml4ZWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+YWlfY29udGlub3VzKSkgeworCQkvKiBub3QgY29udGlub3VzLCBmaXhlZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfc2FtcGxlX2NvdW50LS07CisJCS8qIGFsbCBzYW1wbGVzIHJlY2VpdmVkPyAqLworCQlpZiAodGhpc191c2JkdXhzdWItPmFpX3NhbXBsZV9jb3VudCA8IDApIHsKKwkJCS8qIHByZXZlbnQgYSByZXN1Ym1pdCBuZXh0IHRpbWUgKi8KKwkJCXVzYmR1eF9haV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJCS8qIHNheSBjb21lZGkgdGhhdCB0aGUgYWNxdWlzdGlvbiBpcyBvdmVyICovCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLyogZ2V0IHRoZSBkYXRhIGZyb20gdGhlIFVTQiBidXMgYW5kIGhhbmQgaXQgb3ZlciB0byBjb21lZGkgKi8KKwluID0gcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW47CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkvKiB0cmFuc2ZlciBkYXRhICovCisJCWlmIChDUl9SQU5HRShzLT5hc3luYy0+Y21kLmNoYW5saXN0W2ldKSA8PSAxKSB7CisJCQljb21lZGlfYnVmX3B1dAorCQkJCShzLT5hc3luYywKKwkJCQlsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+CisJCQkJCWluQnVmZmVyW2ldKSBeIDB4ODAwKTsKKwkJfSBlbHNlIHsKKwkJCWNvbWVkaV9idWZfcHV0CisJCQkJKHMtPmFzeW5jLAorCQkJCWxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT5pbkJ1ZmZlcltpXSkpOworCQl9CisJfQorCS8qIHRlbGwgY29tZWRpIHRoYXQgZGF0YSBpcyB0aGVyZSAqLworCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfdW5saW5rX091dFVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViX3RtcCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IGVyciA9IDA7CisKKwlpZiAodXNiZHV4c3ViX3RtcCAmJiB1c2JkdXhzdWJfdG1wLT51cmJPdXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yl90bXAtPm51bU9mT3V0QnVmZmVyczsgaSsrKSB7CisJCQlpZiAodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldKQorCQkJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0pOworCisJCQlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpOiB1c2JkdXg6IHVubGlua2VkIE91dFVSQiAlZDogcmVzPSVkXG4iLAorCQkJCWksIGVycik7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyB3aWxsIGNhbmNlbCBhIHJ1bm5pbmcgYWNxdWlzaXRpb24gb3BlcmF0aW9uCisgKiBpbiBhbnkgY29udGV4dC4KKyAqLworc3RhdGljIGludCB1c2JkdXhfYW9fc3RvcChzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiwgaW50IGRvX3VubGluaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaTogdXNiZHV4X2FvX2NhbmNlbFxuIik7CisKKwlpZiAoZG9fdW5saW5rKQorCQlyZXQgPSB1c2JkdXhzdWJfdW5saW5rX091dFVSQnModGhpc191c2JkdXhzdWIpOworCisJdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGZvcmNlIHVubGluaywgaXMgY2FsbGVkIGJ5IGNvbWVkaSAqLworc3RhdGljIGludCB1c2JkdXhfYW9fY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmVzID0gMDsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogcHJldmVudCBvdGhlciBDUFVzIGZyb20gc3VibWl0dGluZyBhIGNvbW1hbmQganVzdCBub3cgKi8KKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiB1bmxpbmsgb25seSBpZiBpdCBpcyByZWFsbHkgcnVubmluZyAqLworCXJlcyA9IHVzYmR1eF9hb19zdG9wKHRoaXNfdXNiZHV4c3ViLCB0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpOworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB1c2JkdXhzdWJfYW9fSXNvY0lycShzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGksIHJldDsKKwlpbnQ4X3QgKmRhdGFwOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViOworCWNvbWVkaV9kZXZpY2UgKnRoaXNfY29tZWRpZGV2OworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwkvKiB0aGUgY29udGV4dCB2YXJpYWJsZSBwb2ludHMgdG8gdGhlIHN1YmRldmljZSAqLworCXRoaXNfY29tZWRpZGV2ID0gdXJiLT5jb250ZXh0OworCS8qIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBvZiB0aGUgc3ViZGV2aWNlIGlzIHN0cnVjdCB1c2JkdXhzdWIgKi8KKwl0aGlzX3VzYmR1eHN1YiA9IHRoaXNfY29tZWRpZGV2LT5wcml2YXRlOworCisJcyA9IHRoaXNfY29tZWRpZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0RBOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FQ09OTkFCT1JURUQ6CisJCS8qIGFmdGVyIGFuIHVubGluayBjb21tYW5kLCB1bnBsdWcsIC4uLiBldGMgKi8KKwkJLyogbm8gdW5saW5rIG5lZWRlZCBoZXJlLiBBbHJlYWR5IHNodXR0aW5nIGRvd24uICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpIHsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCXVzYmR1eF9hb19zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQkvKiBhIHJlYWwgZXJyb3IgKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkiY29tZWRpXzogTm9uLXplcm8gdXJiIHN0YXR1cyByZWNlaXZlZCBpbiBhbyAiCisJCQkJImludHIgY29udGV4dDogJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJLyogd2UgZG8gYW4gdW5saW5rIGlmIHdlIGFyZSBpbiB0aGUgaGlnaCBzcGVlZCBtb2RlICovCisJCQl1c2JkdXhfYW9fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIGFyZSB3ZSBhY3R1YWxseSBydW5uaW5nPyAqLworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykpCisJCXJldHVybjsKKworCS8qIG5vcm1hbCBvcGVyYXRpb246IGV4ZWN1dGluZyBhIGNvbW1hbmQgaW4gdGhpcyBzdWJkZXZpY2UgKi8KKwl0aGlzX3VzYmR1eHN1Yi0+YW9fY291bnRlci0tOworCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fY291bnRlciA8PSAwKSB7CisJCS8qIHRpbWVyIHplcm8gKi8KKwkJdGhpc191c2JkdXhzdWItPmFvX2NvdW50ZXIgPSB0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXI7CisKKwkJLyogaGFuZGxlIG5vbiBjb250aW5vdXMgYXF1aXNpdGlvbiAqLworCQlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+YW9fY29udGlub3VzKSkgeworCQkJLyogZml4ZWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKwkJCXRoaXNfdXNiZHV4c3ViLT5hb19zYW1wbGVfY291bnQtLTsKKwkJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fc2FtcGxlX2NvdW50IDwgMCkgeworCQkJCS8qIGFsbCBzYW1wbGVzIHRyYW5zbWl0dGVkICovCisJCQkJdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkJLyogbm8gcmVzdWJtaXQgb2YgdGhlIHVyYiAqLworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkvKiB0cmFuc21pdCBkYXRhIHRvIHRoZSBVU0IgYnVzICovCisJCSgodWludDhfdCAqKSAodXJiLT50cmFuc2Zlcl9idWZmZXIpKVswXSA9CisJCQlzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsKKwkJZm9yIChpID0gMDsgaSA8IHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJCXNhbXBsX3QgdGVtcDsKKwkJCWlmIChpID49IE5VTU9VVENIQU5ORUxTKQorCQkJCWJyZWFrOworCisJCQkvKiBwb2ludGVyIHRvIHRoZSBEQSAqLworCQkJZGF0YXAgPQorCQkJICAgICAgICgmKCgoaW50OF90ICopdXJiLT50cmFuc2Zlcl9idWZmZXIpW2kgKiAzICsgMV0pKTsKKwkJCS8qIGdldCB0aGUgZGF0YSBmcm9tIGNvbWVkaSAqLworCQkJcmV0ID0gY29tZWRpX2J1Zl9nZXQocy0+YXN5bmMsICZ0ZW1wKTsKKwkJCWRhdGFwWzBdID0gdGVtcDsKKwkJCWRhdGFwWzFdID0gdGVtcCA+PiA4OworCQkJZGF0YXBbMl0gPSB0aGlzX3VzYmR1eHN1Yi0+ZGFjX2NvbW1hbmRzW2ldOworCQkJLyogcHJpbnRrKCJkYXRhWzBdPSV4LCBkYXRhWzFdPSV4LCBkYXRhWzJdPSV4XG4iLCAqLworCQkJLyogZGF0YXBbMF0sZGF0YXBbMV0sZGF0YXBbMl0pOyAqLworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCQkiY29tZWRpOiBidWZmZXIgdW5kZXJmbG93XG4iKTsKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CisJCQl9CisJCQkvKiB0cmFuc21pdCBkYXRhIHRvIGNvbWVkaSAqLworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCX0KKwl9CisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gU0laRU9VVEJVRjsKKwl1cmItPmRldiA9IHRoaXNfdXNiZHV4c3ViLT51c2JkZXY7CisJdXJiLT5zdGF0dXMgPSAwOworCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpIHsKKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSB7CisJCQkvKiB1ZnJhbWVzICovCisJCQl1cmItPmludGVydmFsID0gODsKKwkJfSBlbHNlIHsKKwkJCS8qIGZyYW1lcyAqLworCQkJdXJiLT5pbnRlcnZhbCA9IDE7CisJCX0KKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IDE7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSBTSVpFT1VUQlVGOworCQl1cmItPmlzb19mcmFtZV9kZXNjWzBdLnN0YXR1cyA9IDA7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCSJjb21lZGlfOiBhbyB1cmIgcmVzdWJtIGZhaWxlZCBpbiBpbnQtY29udC4gIgorCQkJCSJyZXQ9JWQiLCByZXQpOworCQkJaWYgKHJldCA9PSBFTDJOU1lOQykKKwkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCQkiYnVnZ3kgVVNCIGhvc3QgY29udHJvbGxlciBvciBidWcgaW4gIgorCQkJCQkiSVJRIGhhbmRsaW5nIVxuIik7CisKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJLyogZG9uJ3QgZG8gYW4gdW5saW5rIGhlcmUgKi8KKwkJCXVzYmR1eF9hb19zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfc3RhcnQoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViKQoreworCWludCBlcnJjb2RlID0gMDsKKwl1aW50OF90IGxvY2FsX3RyYW5zZmVyX2J1ZmZlclsxNl07CisKKwlpZiAodXNiZHV4c3ViLT5wcm9iZWQpIHsKKwkJLyogN2Y5MiB0byB6ZXJvICovCisJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSA9IDA7CisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4c3ViLT51c2JkZXYsCisJCQkvKiBjcmVhdGUgYSBwaXBlIGZvciBhIGNvbnRyb2wgdHJhbnNmZXIgKi8KKwkJCXVzYl9zbmRjdHJscGlwZSh1c2JkdXhzdWItPnVzYmRldiwgMCksCisJCQkvKiBiUmVxdWVzdCwgIkZpcm13YXJlIiAqLworCQkJVVNCRFVYU1VCX0ZJUk1XQVJFLAorCQkJLyogYm1SZXF1ZXN0VHlwZSAqLworCQkJVkVORE9SX0RJUl9PVVQsCisJCQkvKiBWYWx1ZSAqLworCQkJVVNCRFVYU1VCX0NQVUNTLAorCQkJLyogSW5kZXggKi8KKwkJCTB4MDAwMCwKKwkJCS8qIGFkZHJlc3Mgb2YgdGhlIHRyYW5zZmVyIGJ1ZmZlciAqLworCQkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCQkJLyogTGVuZ3RoICovCisJCQkxLAorCQkJLyogVGltZW91dCAqLworCQkJRVpUSU1FT1VUKTsKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiBjb250cm9sIG1zZyBmYWlsZWQgKHN0YXJ0KVxuIik7CisJCQlyZXR1cm4gZXJyY29kZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfc3RvcChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIpCit7CisJaW50IGVycmNvZGUgPSAwOworCisJdWludDhfdCBsb2NhbF90cmFuc2Zlcl9idWZmZXJbMTZdOworCWlmICh1c2JkdXhzdWItPnByb2JlZCkgeworCQkvKiA3ZjkyIHRvIG9uZSAqLworCQlsb2NhbF90cmFuc2Zlcl9idWZmZXJbMF0gPSAxOworCQllcnJjb2RlID0gdXNiX2NvbnRyb2xfbXNnKHVzYmR1eHN1Yi0+dXNiZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eHN1Yi0+dXNiZGV2LCAwKSwKKwkJCS8qIGJSZXF1ZXN0LCAiRmlybXdhcmUiICovCisJCQlVU0JEVVhTVUJfRklSTVdBUkUsCisJCQkvKiBibVJlcXVlc3RUeXBlICovCisJCQlWRU5ET1JfRElSX09VVCwKKwkJCS8qIFZhbHVlICovCisJCQlVU0JEVVhTVUJfQ1BVQ1MsCisJCQkvKiBJbmRleCAqLworCQkJMHgwMDAwLCBsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvKiBMZW5ndGggKi8KKwkJCTEsCisJCQkvKiBUaW1lb3V0ICovCisJCQlFWlRJTUVPVVQpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RvcClcbiIpOworCQkJcmV0dXJuIGVycmNvZGU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3VwbG9hZChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIsCisJCQkgICAgdWludDhfdCAqbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCQkJICAgIHVuc2lnbmVkIGludCBzdGFydEFkZHIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IGVycmNvZGU7CisKKwlpZiAodXNiZHV4c3ViLT5wcm9iZWQpIHsKKwkJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogdXNiZHV4OiB1cGxvYWRpbmcgJWQgYnl0ZXMiCisJCQkiIHRvIGFkZHIgJWQsIGZpcnN0IGJ5dGU9JWQuXG4iLAorCQkJdXNiZHV4c3ViLT5jb21lZGlkZXYtPm1pbm9yLCBsZW4sCisJCQlzdGFydEFkZHIsIGxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSk7CisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4c3ViLT51c2JkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUodXNiZHV4c3ViLT51c2JkZXYsIDApLAorCQkJLyogYnJlcXVlc3QsIGZpcm13YXJlICovCisJCQlVU0JEVVhTVUJfRklSTVdBUkUsCisJCQkvKiBibVJlcXVlc3RUeXBlICovCisJCQlWRU5ET1JfRElSX09VVCwKKwkJCS8qIHZhbHVlICovCisJCQlzdGFydEFkZHIsCisJCQkvKiBpbmRleCAqLworCQkJMHgwMDAwLAorCQkJLyogb3VyIGxvY2FsIHNhZmUgYnVmZmVyICovCisJCQlsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvKiBsZW5ndGggKi8KKwkJCWxlbiwKKwkJCS8qIHRpbWVvdXQgKi8KKwkJCUVaVElNRU9VVCk7CisJCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogcmVzdWx0PSVkXG4iLCBlcnJjb2RlKTsKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiB1cGxvYWQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfSBlbHNlIHsKKwkJLyogbm8gZGV2aWNlIG9uIHRoZSBidXMgZm9yIHRoaXMgaW5kZXggKi8KKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpcm13YXJlVXBsb2FkKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YiwgdWludDhfdCAqZmlybXdhcmVCaW5hcnksCisJCQkgIGludCBzaXplRmlybXdhcmUpCit7CisJaW50IHJldDsKKworCWlmICghZmlybXdhcmVCaW5hcnkpCisJCXJldHVybiAwOworCisJcmV0ID0gdXNiZHV4c3ViX3N0b3AodXNiZHV4c3ViKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IGNhbiBub3Qgc3RvcCBmaXJtd2FyZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHVzYmR1eHN1Yl91cGxvYWQodXNiZHV4c3ViLCBmaXJtd2FyZUJpbmFyeSwgMCwgc2l6ZUZpcm13YXJlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IGZpcm13YXJlIHVwbG9hZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSB1c2JkdXhzdWJfc3RhcnQodXNiZHV4c3ViKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IGNhbiBub3Qgc3RhcnQgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfc3VibWl0X0luVVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIpCit7CisJaW50IGksIGVyckZsYWc7CisKKwlpZiAoIXVzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBTdWJtaXQgYWxsIFVSQnMgYW5kIHN0YXJ0IHRoZSB0cmFuc2ZlciBvbiB0aGUgYnVzICovCisJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yi0+bnVtT2ZJbkJ1ZmZlcnM7IGkrKykgeworCQkvKiBpbiBjYXNlIG9mIGEgcmVzdWJtaXNzaW9uIGFmdGVyIGFuIHVubGluay4uLiAqLworCQl1c2JkdXhzdWItPnVyYkluW2ldLT5pbnRlcnZhbCA9IHVzYmR1eHN1Yi0+YWlfaW50ZXJ2YWw7CisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPmNvbnRleHQgPSB1c2JkdXhzdWItPmNvbWVkaWRldjsKKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+ZGV2ID0gdXNiZHV4c3ViLT51c2JkZXY7CisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPnN0YXR1cyA9IDA7CisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBzdWJtaXR0aW5nIGluLXVyYlslZF06ICVwLCVwIGludHY9JWRcbiIsCisJCQl1c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIGksCisJCQkodXNiZHV4c3ViLT51cmJJbltpXS0+Y29udGV4dCksCisJCQkodXNiZHV4c3ViLT51cmJJbltpXS0+ZGV2KSwKKwkJCSh1c2JkdXhzdWItPnVyYkluW2ldLT5pbnRlcnZhbCkpOworCQllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIodXNiZHV4c3ViLT51cmJJbltpXSwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnJGbGFnKSB7CisJCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiBhaTogdXNiX3N1Ym1pdF91cmIoJWQpIGVycm9yICVkXG4iLAorCQkJCWksIGVyckZsYWcpOworCQkJcmV0dXJuIGVyckZsYWc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3N1Ym1pdF9PdXRVUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgaSwgZXJyRmxhZzsKKworCWlmICghdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWItPm51bU9mT3V0QnVmZmVyczsgaSsrKSB7CisJCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogc3VibWl0dGluZyBvdXQtdXJiWyVkXVxuIiwgaSk7CisJCS8qIGluIGNhc2Ugb2YgYSByZXN1Ym1pc3Npb24gYWZ0ZXIgYW4gdW5saW5rLi4uICovCisJCXVzYmR1eHN1Yi0+dXJiT3V0W2ldLT5jb250ZXh0ID0gdXNiZHV4c3ViLT5jb21lZGlkZXY7CisJCXVzYmR1eHN1Yi0+dXJiT3V0W2ldLT5kZXYgPSB1c2JkdXhzdWItPnVzYmRldjsKKwkJdXNiZHV4c3ViLT51cmJPdXRbaV0tPnN0YXR1cyA9IDA7CisJCXVzYmR1eHN1Yi0+dXJiT3V0W2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHVzYmR1eHN1Yi0+dXJiT3V0W2ldLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVyckZsYWcpIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IGFvOiB1c2Jfc3VibWl0X3VyYiglZCkgZXJyb3IgJWRcbiIsCisJCQkJaSwgZXJyRmxhZyk7CisJCQlyZXR1cm4gZXJyRmxhZzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhfYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGNvbWVkaV9jbWQgKmNtZCkKK3sKKwlpbnQgZXJyID0gMCwgdG1wLCBpOworCXVuc2lnbmVkIGludCB0bXBUaW1lcjsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiB1c2JkdXhfYWlfY21kdGVzdFxuIiwgZGV2LT5taW5vcik7CisKKwkvKiBtYWtlIHN1cmUgdHJpZ2dlcnMgYXJlIHZhbGlkICovCisJLyogT25seSBpbW1lZGlhdGUgdHJpZ2dlcnMgYXJlIGFsbG93ZWQgKi8KKwl0bXAgPSBjbWQtPnN0YXJ0X3NyYzsKKwljbWQtPnN0YXJ0X3NyYyAmPSBUUklHX05PVyB8IFRSSUdfSU5UOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKQorCQllcnIrKzsKKworCS8qIHRyaWdnZXIgc2hvdWxkIGhhcHBlbiB0aW1lZCAqLworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJLyogc3RhcnQgYSBuZXcgX3NjYW5fIHdpdGggYSB0aW1lciAqLworCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUjsKKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpCisJCWVycisrOworCisJLyogc2Nhbm5pbmcgaXMgY29udGlub3VzICovCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfTk9XOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKKwkJZXJyKys7CisKKwkvKiBpc3N1ZSBhIHRyaWdnZXIgd2hlbiBzY2FuIGlzIGZpbmlzaGVkIGFuZCBzdGFydCBhIG5ldyBzY2FuICovCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykKKwkJZXJyKys7CisKKwkvKiB0cmlnZ2VyIGF0IHRoZSBlbmQgb2YgY291bnQgZXZlbnRzIG9yIG5vdCwgc3RvcCBjb25kaXRpb24gb3Igbm90ICovCisJdG1wID0gY21kLT5zdG9wX3NyYzsKKwljbWQtPnN0b3Bfc3JjICY9IFRSSUdfQ09VTlQgfCBUUklHX05PTkU7CisJaWYgKCFjbWQtPnN0b3Bfc3JjIHx8IHRtcCAhPSBjbWQtPnN0b3Bfc3JjKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZQorCSAqIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlCisJICovCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIpCisJCWVycisrOworCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX05PTkUpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDI7CisKKwkvKiBzdGVwIDM6IG1ha2Ugc3VyZSBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSBjb21wYXRpYmxlICovCisJaWYgKGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykgeworCQkvKiBpbnRlcm5hbCB0cmlnZ2VyICovCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IDApIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgeworCQkJLyoKKwkJCSAqIEluIGhpZ2ggc3BlZWQgbW9kZSBtaWNyb2ZyYW1lcyBhcmUgcG9zc2libGUuCisJCQkgKiBIb3dldmVyLCBkdXJpbmcgb25lIG1pY3JvZnJhbWUgd2UgY2FuIHJvdWdobHkKKwkJCSAqIHNhbXBsZSBvbmUgY2hhbm5lbC4gVGh1cywgdGhlIG1vcmUgY2hhbm5lbHMKKwkJCSAqIGFyZSBpbiB0aGUgY2hhbm5lbCBsaXN0IHRoZSBtb3JlIHRpbWUgd2UgbmVlZC4KKwkJCSAqLworCQkJaSA9IDE7CisJCQkvKiBmaW5kIGEgcG93ZXIgb2YgMiBmb3IgdGhlIG51bWJlciBvZiBjaGFubmVscyAqLworCQkJd2hpbGUgKGkgPCAoY21kLT5jaGFubGlzdF9sZW4pKQorCQkJCWkgPSBpICogMjsKKworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAoMTAwMDAwMCAvIDggKiBpKSkgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAxMDAwMDAwIC8gOCAqIGk7CisJCQkJZXJyKys7CisJCQl9CisJCQkvKiBub3cgY2FsYyB0aGUgcmVhbCBzYW1wbGluZyByYXRlIHdpdGggYWxsIHRoZQorCQkJICogcm91bmRpbmcgZXJyb3JzICovCisJCQl0bXBUaW1lciA9CisJCQkJKCh1bnNpZ25lZCBpbnQpKGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMjUwMDApKSAqCisJCQkJMTI1MDAwOworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgIT0gdG1wVGltZXIpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gdG1wVGltZXI7CisJCQkJZXJyKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBmdWxsIHNwZWVkICovCisJCQkvKiAxa0h6IHNjYW5zIGV2ZXJ5IFVTQiBmcmFtZSAqLworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAxMDAwMDAwKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDEwMDAwMDA7CisJCQkJZXJyKys7CisJCQl9CisJCQkvKgorCQkJICogY2FsYyB0aGUgcmVhbCBzYW1wbGluZyByYXRlIHdpdGggdGhlIHJvdW5kaW5nIGVycm9ycworCQkJICovCisJCQl0bXBUaW1lciA9ICgodW5zaWduZWQgaW50KShjbWQtPnNjYW5fYmVnaW5fYXJnIC8KKwkJCQkJMTAwMDAwMCkpICogMTAwMDAwMDsKKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IHRtcFRpbWVyKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IHRtcFRpbWVyOworCQkJCWVycisrOworCQkJfQorCQl9CisJfQorCS8qIHRoZSBzYW1lIGFyZ3VtZW50ICovCisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gY21kLT5jaGFubGlzdF9sZW47CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogYW55IGNvdW50IGlzIGFsbG93ZWQgKi8KKwl9IGVsc2UgeworCQkvKiBUUklHX05PTkUgKi8KKwkJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQkJY21kLT5zdG9wX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjcmVhdGVzIHRoZSBBREMgY29tbWFuZCBmb3IgdGhlIE1BWDEyNzEKKyAqIHJhbmdlIGlzIHRoZSByYW5nZSB2YWx1ZSBmcm9tIGNvbWVkaQorICovCitzdGF0aWMgaW50OF90IGNyZWF0ZV9hZGNfY29tbWFuZCh1bnNpZ25lZCBpbnQgY2hhbiwgaW50IHJhbmdlKQoreworCWludDhfdCBwID0gKHJhbmdlIDw9IDEpOworCWludDhfdCByID0gKChyYW5nZSAlIDIpID09IDApOworCXJldHVybiAoY2hhbiA8PCA0KSB8ICgocCA9PSAxKSA8PCAyKSB8ICgociA9PSAxKSA8PCAzKTsKK30KKworLyogYnVsayB0cmFuc2ZlcnMgdG8gdXNiZHV4ICovCisKKyNkZWZpbmUgU0VOREFEQ09NTUFORFMgICAgICAgICAgICAwCisjZGVmaW5lIFNFTkREQUNPTU1BTkRTICAgICAgICAgICAgMQorI2RlZmluZSBTRU5ERElPQ09ORklHQ09NTUFORCAgICAgIDIKKyNkZWZpbmUgU0VORERJT0JJVFNDT01NQU5EICAgICAgICAzCisjZGVmaW5lIFNFTkRTSU5HTEVBRCAgICAgICAgICAgICAgNAorI2RlZmluZSBSRUFEQ09VTlRFUkNPTU1BTkQgICAgICAgIDUKKyNkZWZpbmUgV1JJVEVDT1VOVEVSQ09NTUFORCAgICAgICA2CisjZGVmaW5lIFNFTkRQV01PTiAgICAgICAgICAgICAgICAgNworI2RlZmluZSBTRU5EUFdNT0ZGICAgICAgICAgICAgICAgIDgKKworc3RhdGljIGludCBzZW5kX2R1eF9jb21tYW5kcyhzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiwgaW50IGNtZF90eXBlKQoreworCWludCByZXN1bHQsIG5zZW50OworCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1swXSA9IGNtZF90eXBlOworI2lmZGVmIE5PSVNZX0RVWF9ERUJVR0JVRworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGklZDogdXNiZHV4OiBkdXhfY29tbWFuZHM6ICIsCisJCXRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYtPm1pbm9yKTsKKwlmb3IgKHJlc3VsdCA9IDA7IHJlc3VsdCA8IFNJWkVPRkRVWEJVRkZFUjsgcmVzdWx0KyspCisJCXByaW50aygiICUwMngiLCB0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzW3Jlc3VsdF0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCXJlc3VsdCA9IHVzYl9idWxrX21zZyh0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2LAorCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKHRoaXNfdXNiZHV4c3ViLT51c2JkZXYsCisJCQkJCSAgICAgIENPTU1BTkRfT1VUX0VQKSwKKwkJCSAgICAgIHRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHMsIFNJWkVPRkRVWEJVRkZFUiwKKwkJCSAgICAgICZuc2VudCwgMTApOworCWlmIChyZXN1bHQgPCAwKQorCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogIgorCQkJImNvdWxkIG5vdCB0cmFuc21pdCBkdXhfY29tbWFuZCB0byB0aGUgdXNiLWRldmljZSwgIgorCQkJImVycj0lZFxuIiwgdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfZHV4X2NvbW1hbmRzKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgY29tbWFuZCkKK3sKKwlpbnQgcmVzdWx0ID0gKC1FRkFVTFQpOworCWludCBucmVjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJFVFJJRVM7IGkrKykgeworCQlyZXN1bHQgPSB1c2JfYnVsa19tc2codGhpc191c2JkdXhzdWItPnVzYmRldiwKKwkJCQkgICAgICB1c2JfcmN2YnVsa3BpcGUodGhpc191c2JkdXhzdWItPnVzYmRldiwKKwkJCQkJCSAgICAgIENPTU1BTkRfSU5fRVApLAorCQkJCSAgICAgIHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyLCBTSVpFSU5TTkJVRiwKKwkJCQkgICAgICAmbnJlYywgMSk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogIgorCQkJCSJpbnNuOiBVU0IgZXJyb3IgJWQgd2hpbGUgcmVjZWl2aW5nIERVWCBjb21tYW5kIgorCQkJCSJcbiIsIHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYtPm1pbm9yLCByZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAobGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbMF0pID09IGNvbW1hbmQpCisJCQlyZXR1cm4gcmVzdWx0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgcmVhY2hlZCBpZiB0aGUgZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQgYSBjb3VwbGUgb2YKKwkgKiB0aW1lcyAqLworCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiBpbnNuOiAiCisJCSJ3cm9uZyBkYXRhIHJldHVybmVkIGZyb20gZmlybXdhcmU6IHdhbnQgY21kICVkLCBnb3QgY21kICVkLlxuIiwKKwkJdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIGNvbW1hbmQsCisJCWxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyWzBdKSk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FpX2ludHRyaWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdHJpZ251bSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9pbnR0cmlnXG4iLCBkZXYtPm1pbm9yKTsKKworCWlmICh0cmlnbnVtICE9IDApIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiB1c2JkdXhfYWlfaW50dHJpZzogaW52YWxpZCB0cmlnbnVtXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykpIHsKKwkJdGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4c3ViX3N1Ym1pdF9JblVSQnModGhpc191c2JkdXhzdWIpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGklZDogdXNiZHV4X2FpX2ludHRyaWc6ICIKKwkJCQkidXJiU3VibWl0OiBlcnI9JWRcbiIsIGRldi0+bWlub3IsIHJldCk7CisJCQl0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAwOworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhaV9pbnR0cmlnIGJ1dCBhY3F1IGlzIGFscmVhZHkgcnVubmluZ1xuIiwKKwkJCWRldi0+bWlub3IpOworCX0KKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FpX2NtZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJdW5zaWduZWQgaW50IGNoYW4sIHJhbmdlOworCWludCBpLCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IHJlc3VsdDsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9jbWRcbiIsIGRldi0+bWlub3IpOworCisJLyogYmxvY2sgb3RoZXIgQ1BVcyBmcm9tIHN0YXJ0aW5nIGFuIGFpX2NtZCAqLworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogIgorCQkJImFpX2NtZCBub3QgcG9zc2libGUuIEFub3RoZXIgYWlfY21kIGlzIHJ1bm5pbmcuXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogc2V0IGN1cnJlbnQgY2hhbm5lbCBvZiB0aGUgcnVubmluZyBhcXVpc2l0aW9uIHRvIHplcm8gKi8KKwlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgKytpKSB7CisJCWNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOworCQlyYW5nZSA9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pOworCQlpZiAoaSA+PSBOVU1DSEFOTkVMUykgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGklZDogY2hhbm5lbCBsaXN0IHRvbyBsb25nXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJYnJlYWs7CisJCX0KKwkJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1tpICsgMl0gPQorCQkJY3JlYXRlX2FkY19jb21tYW5kKGNoYW4sIHJhbmdlKTsKKwl9CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGkgJWQ6IHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlIHVzYiBkZXZpY2U6IHNpemU9JXVcbiIsCisJCWRldi0+bWlub3IsIE5VTUNIQU5ORUxTKTsKKworCXJlc3VsdCA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EQURDT01NQU5EUyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlmICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgeworCQkvKgorCQkgKiBldmVyeSBjaGFubmVsIGdldHMgYSB0aW1lIHdpbmRvdyBvZiAxMjV1cy4gVGh1cywgaWYgd2UKKwkJICogc2FtcGxlIGFsbCA4IGNoYW5uZWxzIHdlIG5lZWQgMW1zLiBJZiB3ZSBzYW1wbGUgb25seSBvbmUKKwkJICogY2hhbm5lbCB3ZSBuZWVkIG9ubHkgMTI1dXMKKwkJICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9pbnRlcnZhbCA9IDE7CisJCS8qIGZpbmQgYSBwb3dlciBvZiAyIGZvciB0aGUgaW50ZXJ2YWwgKi8KKwkJd2hpbGUgKCh0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwpIDwgKGNtZC0+Y2hhbmxpc3RfbGVuKSkgeworCQkJdGhpc191c2JkdXhzdWItPmFpX2ludGVydmFsID0KKwkJCQkodGhpc191c2JkdXhzdWItPmFpX2ludGVydmFsKSAqIDI7CisJCX0KKwkJdGhpc191c2JkdXhzdWItPmFpX3RpbWVyID0gY21kLT5zY2FuX2JlZ2luX2FyZyAvICgxMjUwMDAgKgorCQkJKHRoaXNfdXNiZHV4c3ViLT5haV9pbnRlcnZhbCkpOworCX0gZWxzZSB7CisJCS8qIGludGVydmFsIGFsd2F5cyAxbXMgKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX2ludGVydmFsID0gMTsKKwkJdGhpc191c2JkdXhzdWItPmFpX3RpbWVyID0gY21kLT5zY2FuX2JlZ2luX2FyZyAvIDEwMDAwMDA7CisJfQorCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIgPCAxKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiBhaV9jbWQ6ICIKKwkJCSJ0aW1lcj0lZCwgc2Nhbl9iZWdpbl9hcmc9JWQuICIKKwkJCSJOb3QgcHJvcGVybHkgdGVzdGVkIGJ5IGNtZHRlc3Q/XG4iLCBkZXYtPm1pbm9yLAorCQkJdGhpc191c2JkdXhzdWItPmFpX3RpbWVyLCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdGhpc191c2JkdXhzdWItPmFpX2NvdW50ZXIgPSB0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXI7CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCS8qIGRhdGEgYXJyaXZlcyBhcyBvbmUgcGFja2V0ICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9zYW1wbGVfY291bnQgPSBjbWQtPnN0b3BfYXJnOworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfY29udGlub3VzID0gMDsKKwl9IGVsc2UgeworCQkvKiBjb250aW5vdXMgYXF1aXNpdGlvbiAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfY29udGlub3VzID0gMTsKKwkJdGhpc191c2JkdXhzdWItPmFpX3NhbXBsZV9jb3VudCA9IDA7CisJfQorCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKSB7CisJCS8qIGVuYWJsZSB0aGlzIGFjcXVpc2l0aW9uIG9wZXJhdGlvbiAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAxOworCQlyZXQgPSB1c2JkdXhzdWJfc3VibWl0X0luVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQl0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAwOworCQkJLyogZml4bWU6IHVubGluayBoZXJlPz8gKi8KKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIFRSSUdfSU5UICovCisJCS8qIGRvbid0IGVuYWJsZSB0aGUgYWNxdWlzaW9uIG9wZXJhdGlvbiAqLworCQkvKiB3YWl0IGZvciBhbiBpbnRlcm5hbCBzaWduYWwgKi8KKwkJcy0+YXN5bmMtPmludHRyaWcgPSB1c2JkdXhfYWlfaW50dHJpZzsKKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiAwOworfQorCisvKiBNb2RlIDAgaXMgdXNlZCB0byBnZXQgYSBzaW5nbGUgY29udmVyc2lvbiBvbiBkZW1hbmQgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBpOworCWxzYW1wbF90IG9uZSA9IDA7CisJaW50IGNoYW4sIHJhbmdlOworCWludCBlcnI7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiBhaV9pbnNuX3JlYWQsIGluc24tPm49JWQsIGluc24tPnN1YmRldj0lZFxuIiwKKwkJZGV2LT5taW5vciwgaW5zbi0+biwgaW5zbi0+c3ViZGV2KTsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhaV9pbnNuX3JlYWQgbm90IHBvc3NpYmxlLiAiCisJCQkiQXN5bmMgQ29tbWFuZCBpcyBydW5uaW5nLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2FtcGxlIG9uZSBjaGFubmVsICovCisJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCS8qIHNldCBjb21tYW5kIGZvciB0aGUgZmlyc3QgY2hhbm5lbCAqLworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSBjcmVhdGVfYWRjX2NvbW1hbmQoY2hhbiwgcmFuZ2UpOworCisJLyogYWRjIGNvbW1hbmRzICovCisJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRTSU5HTEVBRCk7CisJaWYgKGVyciA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZXJyID0gcmVjZWl2ZV9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRTSU5HTEVBRCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlvbmUgPSBsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlclsxXSk7CisJCWlmIChDUl9SQU5HRShpbnNuLT5jaGFuc3BlYykgPD0gMSkKKwkJCW9uZSA9IG9uZSBeIDB4ODAwOworCisJCWRhdGFbaV0gPSBvbmU7CisJfQorCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gaTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFuYWxvZyBvdXQgKi8KKworc3RhdGljIGludCB1c2JkdXhfYW9faW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGk7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IHRoaXNfdXNiZHV4c3ViLT5vdXRCdWZmZXJbY2hhbl07CisKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCWNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgaSwgZXJyOworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiBhb19pbnNuX3dyaXRlXG4iLCBkZXYtPm1pbm9yKTsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhb19pbnNuX3dyaXRlOiAiCisJCQkiRVJST1I6IGFzeW5jaHJvbm91cyBhb19jbWQgaXMgcnVubmluZ1xuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFvX2luc25fd3JpdGU6IGRhdGFbY2hhbj0lZCxpPSVkXT0lZFxuIiwKKwkJCWRldi0+bWlub3IsIGNoYW4sIGksIGRhdGFbaV0pOworCisJCS8qIG51bWJlciBvZiBjaGFubmVsczogMSAqLworCQl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gMTsKKwkJLyogb25lIDE2IGJpdCB2YWx1ZSAqLworCQkqKChpbnQxNl90ICopICh0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzICsgMikpID0KKwkJCWNwdV90b19sZTE2KGRhdGFbaV0pOworCQl0aGlzX3VzYmR1eHN1Yi0+b3V0QnVmZmVyW2NoYW5dID0gZGF0YVtpXTsKKwkJLyogY2hhbm5lbCBudW1iZXIgKi8KKwkJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1s0XSA9IChjaGFuIDw8IDYpOworCQllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORERBQ09NTUFORFMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCB1c2JkdXhfYW9faW50dHJpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHVuc2lnbmVkIGludCB0cmlnbnVtKQoreworCWludCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh0cmlnbnVtICE9IDApIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiB1c2JkdXhfYW9faW50dHJpZzogaW52YWxpZCB0cmlnbnVtXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpKSB7CisJCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfT3V0VVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiB1c2JkdXhfYW9faW50dHJpZzogc3VibWl0VVJCOiAiCisJCQkJImVycj0lZFxuIiwgZGV2LT5taW5vciwgcmV0KTsKKwkJCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDA7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFvX2ludHRyaWcgYnV0IGFjcXUgaXMgYWxyZWFkeSBydW5uaW5nLlxuIiwKKwkJCWRldi0+bWlub3IpOworCX0KKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2NtZHRlc3QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBjb21lZGlfY21kICpjbWQpCit7CisJaW50IGVyciA9IDAsIHRtcDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYmR1eF9hb19jbWR0ZXN0XG4iLCBkZXYtPm1pbm9yKTsKKworCS8qIG1ha2Ugc3VyZSB0cmlnZ2VycyBhcmUgdmFsaWQgKi8KKwkvKiBPbmx5IGltbWVkaWF0ZSB0cmlnZ2VycyBhcmUgYWxsb3dlZCAqLworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19JTlQ7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJLyogdHJpZ2dlciBzaG91bGQgaGFwcGVuIHRpbWVkICovCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwkvKiBqdXN0IG5vdyB3ZSBzY2FuIGFsc28gaW4gdGhlIGhpZ2ggc3BlZWQgbW9kZSBldmVyeSBmcmFtZSAqLworCS8qIHRoaXMgaXMgZHVlIHRvIGVoY2kgZHJpdmVyIGxpbWl0YXRpb25zICovCisJaWYgKDApIHsJCS8qICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgKi8KKwkJLyogc3RhcnQgaW1taWRpYXRlbHkgYSBuZXcgc2NhbiAqLworCQkvKiB0aGUgc2FtcGxpbmcgcmF0ZSBpcyBzZXQgYnkgdGhlIGNvdmVyc2lvbiByYXRlICovCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19GT0xMT1c7CisJfSBlbHNlIHsKKwkJLyogc3RhcnQgYSBuZXcgc2NhbiAob3V0cHV0IGF0IG9uY2UpIHdpdGggYSB0aW1lciAqLworCQljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfVElNRVI7CisJfQorCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwkvKiBzY2FubmluZyBpcyBjb250aW5vdXMgKi8KKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCS8qIHdlIGFsd2F5cyBvdXRwdXQgYXQgMWtIeiBqdXN0IG5vdyBhbGwgY2hhbm5lbHMgYXQgb25jZSAqLworCWlmICgwKSB7CQkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCisJCS8qCisJCSAqIGluIHVzYi0yLjAgb25seSBvbmUgY29udmVyc2lvbiBpdCB0cmFubWl0dGVkIGJ1dCB3aXRoIDhrSHovbgorCQkgKi8KKwkJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX1RJTUVSOworCX0gZWxzZSB7CisJCS8qIGFsbCBjb252ZXJzaW9uIGV2ZW50cyBoYXBwZW4gc2ltdWx0YW5lb3VzbHkgd2l0aCBhIHJhdGUgb2YKKwkJICogMWtIei9uICovCisJCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19OT1c7CisJfQorCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKKwkJZXJyKys7CisKKwkvKiBpc3N1ZSBhIHRyaWdnZXIgd2hlbiBzY2FuIGlzIGZpbmlzaGVkIGFuZCBzdGFydCBhIG5ldyBzY2FuICovCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykKKwkJZXJyKys7CisKKwkvKiB0cmlnZ2VyIGF0IHRoZSBlbmQgb2YgY291bnQgZXZlbnRzIG9yIG5vdCwgc3RvcCBjb25kaXRpb24gb3Igbm90ICovCisJdG1wID0gY21kLT5zdG9wX3NyYzsKKwljbWQtPnN0b3Bfc3JjICY9IFRSSUdfQ09VTlQgfCBUUklHX05PTkU7CisJaWYgKCFjbWQtPnN0b3Bfc3JjIHx8IHRtcCAhPSBjbWQtPnN0b3Bfc3JjKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZQorCSAqIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlCisJICovCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIpCisJCWVycisrOworCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX05PTkUpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDI7CisKKwkvKiBzdGVwIDM6IG1ha2Ugc3VyZSBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoY21kLT5zdGFydF9hcmcgIT0gMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKSB7CisJCS8qIGludGVybmFsIHRyaWdnZXIgKi8KKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgIT0gMCkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJLyogdGltZXIgKi8KKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAxMDAwMDAwKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMTAwMDAwMDsKKwkJCWVycisrOworCQl9CisJfQorCS8qIG5vdCB1c2VkIG5vdywgaXMgZm9yIGxhdGVyIHVzZSAqLworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCAxMjUwMDApIHsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAxMjUwMDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCS8qIHRoZSBzYW1lIGFyZ3VtZW50ICovCisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gY21kLT5jaGFubGlzdF9sZW47CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogYW55IGNvdW50IGlzIGFsbG93ZWQgKi8KKwl9IGVsc2UgeworCQkvKiBUUklHX05PTkUgKi8KKwkJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQkJY21kLT5zdG9wX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiBlcnI9JWQsICIKKwkJInNjYW5fYmVnaW5fc3JjPSVkLCBzY2FuX2JlZ2luX2FyZz0lZCwgY29udmVydF9zcmM9JWQsICIKKwkJImNvbnZlcnRfYXJnPSVkXG4iLCBkZXYtPm1pbm9yLCBlcnIsIGNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcsIGNtZC0+Y29udmVydF9zcmMsIGNtZC0+Y29udmVydF9hcmcpOworCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhfYW9fY21kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgY2hhbiwgZ2FpbjsKKwlpbnQgaSwgcmV0OworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogJXNcbiIsIGRldi0+bWlub3IsIF9fZnVuY19fKTsKKworCS8qIHNldCBjdXJyZW50IGNoYW5uZWwgb2YgdGhlIHJ1bm5pbmcgYXF1aXNpdGlvbiB0byB6ZXJvICovCisJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47ICsraSkgeworCQljaGFuID0gQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKTsKKwkJZ2FpbiA9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pOworCQlpZiAoaSA+PSBOVU1PVVRDSEFOTkVMUykgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGklZDogJXM6IGNoYW5uZWwgbGlzdCB0b28gbG9uZ1xuIiwKKwkJCQlkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCQl0aGlzX3VzYmR1eHN1Yi0+ZGFjX2NvbW1hbmRzW2ldID0gKGNoYW4gPDwgNik7CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogZGFjIGNvbW1hbmQgZm9yIGNoICVkIGlzICV4XG4iLAorCQkJZGV2LT5taW5vciwgaSwgdGhpc191c2JkdXhzdWItPmRhY19jb21tYW5kc1tpXSk7CisJfQorCisJLyogd2UgY291bnQgaW4gc3RlcHMgb2YgMW1zICgxMjV1cykgKi8KKwkvKiAxMjV1cyBtb2RlIG5vdCB1c2VkIHlldCAqLworCWlmICgwKSB7CQkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCisJCS8qIDEyNXVzICovCisJCS8qIHRpbWluZyBvZiB0aGUgY29udmVyc2lvbiBpdHNlbGY6IGV2ZXJ5IDEyNSB1cyAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIgPSBjbWQtPmNvbnZlcnRfYXJnIC8gMTI1MDAwOworCX0gZWxzZSB7CisJCS8qIDFtcyAqLworCQkvKiB0aW1pbmcgb2YgdGhlIHNjYW46IHdlIGdldCBhbGwgY2hhbm5lbHMgYXQgb25jZSAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwMDsKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBzY2FuX2JlZ2luX3NyYz0lZCwgc2Nhbl9iZWdpbl9hcmc9JWQsICIKKwkJCSJjb252ZXJ0X3NyYz0lZCwgY29udmVydF9hcmc9JWRcbiIsIGRldi0+bWlub3IsCisJCQljbWQtPnNjYW5fYmVnaW5fc3JjLCBjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJY21kLT5jb252ZXJ0X3NyYywgY21kLT5jb252ZXJ0X2FyZyk7CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYW9fdGltZXI9JWQgKG1zKVxuIiwKKwkJCWRldi0+bWlub3IsIHRoaXNfdXNiZHV4c3ViLT5hb190aW1lcik7CisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIgPCAxKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiB1c2JkdXg6IGFvX3RpbWVyPSVkLCAiCisJCQkJInNjYW5fYmVnaW5fYXJnPSVkLiAiCisJCQkJIk5vdCBwcm9wZXJseSB0ZXN0ZWQgYnkgY21kdGVzdD9cbiIsCisJCQkJZGV2LT5taW5vciwgdGhpc191c2JkdXhzdWItPmFvX3RpbWVyLAorCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJdGhpc191c2JkdXhzdWItPmFvX2NvdW50ZXIgPSB0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXI7CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCS8qIG5vdCBjb250aW5vdXMgKi8KKwkJLyogY291bnRlciAqLworCQkvKiBoaWdoIHNwZWVkIGFsc28gc2NhbnMgZXZlcnl0aGluZyBhdCBvbmNlICovCisJCWlmICgwKSB7CS8qICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgKi8KKwkJCXRoaXNfdXNiZHV4c3ViLT5hb19zYW1wbGVfY291bnQgPQorCQkJCShjbWQtPnN0b3BfYXJnKSAqIChjbWQtPnNjYW5fZW5kX2FyZyk7CisJCX0gZWxzZSB7CisJCQkvKiB0aGVyZSdzIG5vIHNjYW4gYXMgdGhlIHNjYW4gaGFzIGJlZW4gKi8KKwkJCS8qIHBlcmYgaW5zaWRlIHRoZSBGWDIgKi8KKwkJCS8qIGRhdGEgYXJyaXZlcyBhcyBvbmUgcGFja2V0ICovCisJCQl0aGlzX3VzYmR1eHN1Yi0+YW9fc2FtcGxlX2NvdW50ID0gY21kLT5zdG9wX2FyZzsKKwkJfQorCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY29udGlub3VzID0gMDsKKwl9IGVsc2UgeworCQkvKiBjb250aW5vdXMgYXF1aXNpdGlvbiAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY29udGlub3VzID0gMTsKKwkJdGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudCA9IDA7CisJfQorCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKSB7CisJCS8qIGVuYWJsZSB0aGlzIGFjcXVpc2l0aW9uIG9wZXJhdGlvbiAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcgPSAxOworCQlyZXQgPSB1c2JkdXhzdWJfc3VibWl0X091dFVSQnModGhpc191c2JkdXhzdWIpOworCQlpZiAocmV0IDwgMCkgeworCQkJdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nID0gMDsKKwkJCS8qIGZpeG1lOiB1bmxpbmsgaGVyZT8/ICovCisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBUUklHX0lOVCAqLworCQkvKiBzdWJtaXQgdGhlIHVyYnMgbGF0ZXIgKi8KKwkJLyogd2FpdCBmb3IgYW4gaW50ZXJuYWwgc2lnbmFsICovCisJCXMtPmFzeW5jLT5pbnR0cmlnID0gdXNiZHV4X2FvX2ludHRyaWc7CisJfQorCisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwkvKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKKwkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCisJICogY29udGFpbnMgdGhlIGNoYW5uZWwgdG8gYmUgY2hhbmdlZCwgYW5kIGRhdGFbMF0gY29udGFpbnMgdGhlCisJICogdmFsdWUgQ09NRURJX0lOUFVUIG9yIENPTUVESV9PVVRQVVQuICovCisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX0RJT19PVVRQVVQ6CisJCXMtPmlvX2JpdHMgfD0gMSA8PCBjaGFuOwkvKiAxIG1lYW5zIE91dCAqLworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0RJT19JTlBVVDoKKwkJcy0+aW9fYml0cyAmPSB+KDEgPDwgY2hhbik7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX1FVRVJZOgorCQlkYXRhWzFdID0KKwkJCShzLT4KKwkJCWlvX2JpdHMgJiAoMSA8PCBjaGFuKSkgPyBDT01FRElfT1VUUFVUIDogQ09NRURJX0lOUFVUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCS8qIHdlIGRvbid0IHRlbGwgdGhlIGZpcm13YXJlIGhlcmUgYXMgaXQgd291bGQgdGFrZSA4IGZyYW1lcyAqLworCS8qIHRvIHN1Ym1pdCB0aGUgaW5mb3JtYXRpb24uIFdlIGRvIGl0IGluIHRoZSBpbnNuX2JpdHMuICovCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCWNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCBlcnI7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCisJaWYgKGluc24tPm4gIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogVGhlIGluc24gZGF0YSBpcyBhIG1hc2sgaW4gZGF0YVswXSBhbmQgdGhlIG5ldyBkYXRhCisJICogaW4gZGF0YVsxXSwgZWFjaCBjaGFubmVsIGNvb3Jlc3BvbmRpbmcgdG8gYSBiaXQuICovCisJcy0+c3RhdGUgJj0gfmRhdGFbMF07CisJcy0+c3RhdGUgfD0gZGF0YVswXSAmIGRhdGFbMV07CisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9IHMtPmlvX2JpdHM7CisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1syXSA9IHMtPnN0YXRlOworCisJLyogVGhpcyBjb21tYW5kIGFsc28gdGVsbHMgdGhlIGZpcm13YXJlIHRvIHJldHVybiAqLworCS8qIHRoZSBkaWdpdGFsIGlucHV0IGxpbmVzICovCisJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRESU9CSVRTQ09NTUFORCk7CisJaWYgKGVyciA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSByZWNlaXZlX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORERJT0JJVFNDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZGF0YVsxXSA9IGxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyWzFdKTsKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDI7Cit9CisKKy8qIHJlYWRzIHRoZSA0IGNvdW50ZXJzLCBvbmx5IHR3byBhcmUgdXNlZCBqdXN0IG5vdyAqLworc3RhdGljIGludCB1c2JkdXhfY291bnRlcl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IGNoYW4gPSBpbnNuLT5jaGFuc3BlYzsKKwlpbnQgZXJyOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFJFQURDT1VOVEVSQ09NTUFORCk7CisJaWYgKGVyciA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHJlY2VpdmVfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBSRUFEQ09VTlRFUkNPTU1BTkQpOworCWlmIChlcnIgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlkYXRhWzBdID0gbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbY2hhbiArIDFdKTsKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2NvdW50ZXJfd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCWNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgZXJyOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9IGluc24tPmNoYW5zcGVjOworCSooKGludDE2X3QgKikgKHRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHMgKyAyKSkgPSBjcHVfdG9fbGUxNigqZGF0YSk7CisKKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgV1JJVEVDT1VOVEVSQ09NTUFORCk7CisJaWYgKGVyciA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9jb3VudGVyX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwkvKiBub3RoaW5nIHRvIGRvIHNvIGZhciAqLworCXJldHVybiAyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQV00gKi8KKworc3RhdGljIGludCB1c2JkdXhzdWJfdW5saW5rX1B3bVVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViX3RtcCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmICh1c2JkdXhzdWJfdG1wICYmIHVzYmR1eHN1Yl90bXAtPnVyYlB3bSkgeworCQlpZiAodXNiZHV4c3ViX3RtcC0+dXJiUHdtKQorCQkJdXNiX2tpbGxfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYlB3bSk7CisJCWRldl9kYmcoJnVzYmR1eHN1Yl90bXAtPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaTogdW5saW5rZWQgUHdtVVJCOiByZXM9JWRcbiIsIGVycik7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgY2FuY2VscyBhIHJ1bm5pbmcgYWNxdWlzaXRpb24gb3BlcmF0aW9uCisgKiBpbiBhbnkgY29udGV4dC4KKyAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX3N0b3Aoc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIsIGludCBkb191bmxpbmspCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaTogJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoZG9fdW5saW5rKQorCQlyZXQgPSB1c2JkdXhzdWJfdW5saW5rX1B3bVVSQnModGhpc191c2JkdXhzdWIpOworCisKKwl0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGZvcmNlIHVubGluayAtIGlzIGNhbGxlZCBieSBjb21lZGkgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCByZXMgPSAwOworCisJLyogdW5saW5rIG9ubHkgaWYgaXQgaXMgcmVhbGx5IHJ1bm5pbmcgKi8KKwlyZXMgPSB1c2JkdXhfcHdtX3N0b3AodGhpc191c2JkdXhzdWIsIHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpICVkOiBzZW5kaW5nIHB3bSBvZmYgY29tbWFuZCB0byB0aGUgdXNiIGRldmljZS5cbiIsCisJCWRldi0+bWlub3IpOworCXJlcyA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EUFdNT0ZGKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmR1eHN1Yl9wd21faXJxKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViOworCWNvbWVkaV9kZXZpY2UgKnRoaXNfY29tZWRpZGV2OworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwkvKiBwcmludGsoS0VSTl9ERUJVRyAiUFdNOiBJUlFcbiIpOyAqLworCisJLyogdGhlIGNvbnRleHQgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBzdWJkZXZpY2UgKi8KKwl0aGlzX2NvbWVkaWRldiA9IHVyYi0+Y29udGV4dDsKKwkvKiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgb2YgdGhlIHN1YmRldmljZSBpcyBzdHJ1Y3QgdXNiZHV4c3ViICovCisJdGhpc191c2JkdXhzdWIgPSB0aGlzX2NvbWVkaWRldi0+cHJpdmF0ZTsKKworCXMgPSB0aGlzX2NvbWVkaWRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9EQTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJY2FzZSAtRUNPTk5BQk9SVEVEOgorCQkvKgorCQkgKiBhZnRlciBhbiB1bmxpbmsgY29tbWFuZCwgdW5wbHVnLCAuLi4gZXRjCisJCSAqIG5vIHVubGluayBuZWVkZWQgaGVyZS4gQWxyZWFkeSBzaHV0dGluZyBkb3duLgorCQkgKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpCisJCQl1c2JkdXhfcHdtX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCS8qIGEgcmVhbCBlcnJvciAqLworCQlpZiAodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiBOb24temVybyB1cmIgc3RhdHVzIHJlY2VpdmVkIGluICIKKwkJCQkicHdtIGludHIgY29udGV4dDogJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJCXVzYmR1eF9wd21fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIGFyZSB3ZSBhY3R1YWxseSBydW5uaW5nPyAqLworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpKQorCQlyZXR1cm47CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB0aGlzX3VzYmR1eHN1Yi0+c2l6ZVB3bUJ1ZjsKKwl1cmItPmRldiA9IHRoaXNfdXNiZHV4c3ViLT51c2JkZXY7CisJdXJiLT5zdGF0dXMgPSAwOworCWlmICh0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKSB7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IHB3bSB1cmIgcmVzdWJtIGZhaWxlZCBpbiBpbnQtY29udC4gIgorCQkJCSJyZXQ9JWQiLCByZXQpOworCQkJaWYgKHJldCA9PSBFTDJOU1lOQykKKwkJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJCSJidWdneSBVU0IgaG9zdCBjb250cm9sbGVyIG9yIGJ1ZyBpbiAiCisJCQkJCSJJUlEgaGFuZGxpbmchXG4iKTsKKworCQkJLyogZG9uJ3QgZG8gYW4gdW5saW5rIGhlcmUgKi8KKwkJCXVzYmR1eF9wd21fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3N1Ym1pdF9Qd21VUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgZXJyRmxhZzsKKworCWlmICghdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGlfOiBzdWJtaXR0aW5nIHB3bS11cmJcbiIpOworCisJLyogaW4gY2FzZSBvZiBhIHJlc3VibWlzc2lvbiBhZnRlciBhbiB1bmxpbmsuLi4gKi8KKwl1c2JfZmlsbF9idWxrX3VyYih1c2JkdXhzdWItPnVyYlB3bSwKKwkJdXNiZHV4c3ViLT51c2JkZXYsCisJCXVzYl9zbmRidWxrcGlwZSh1c2JkdXhzdWItPnVzYmRldiwgUFdNX0VQKSwKKwkJdXNiZHV4c3ViLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlciwKKwkJdXNiZHV4c3ViLT5zaXplUHdtQnVmLCB1c2JkdXhzdWJfcHdtX2lycSwgdXNiZHV4c3ViLT5jb21lZGlkZXYpOworCisJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHVzYmR1eHN1Yi0+dXJiUHdtLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyRmxhZykgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IHVzYmR1eDogcHdtOiB1c2Jfc3VibWl0X3VyYiBlcnJvciAlZFxuIiwKKwkJCWVyckZsYWcpOworCQlyZXR1cm4gZXJyRmxhZzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9wZXJpb2QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBsc2FtcGxfdCBwZXJpb2QpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IGZ4MmRlbGF5ID0gMjU1OworCisJaWYgKHBlcmlvZCA8IE1JTl9QV01fUEVSSU9EKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogaWxsZWdhbCBwZXJpb2Qgc2V0dGluZyBmb3IgcHdtLlxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgeworCQlmeDJkZWxheSA9IHBlcmlvZCAvICgoaW50KSg2KjUxMiooMS4wLzAuMDMzKSkpIC0gNjsKKwkJaWYgKGZ4MmRlbGF5ID4gMjU1KSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiBwZXJpb2QgJWQgZm9yIHB3bSBpcyB0b28gbG93LlxuIiwKKwkJCSAgICAgICBkZXYtPm1pbm9yLCBwZXJpb2QpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisJdGhpc191c2JkdXhzdWItPnB3bURlbGF5ID0gZngyZGVsYXk7CisJdGhpc191c2JkdXhzdWItPnB3bVBlcmlvZCA9IHBlcmlvZDsKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICIlczogZnJlcXU9JWQsIHBlcmlvZD0lZFxuIiwKKwkJX19mdW5jX18sIHBlcmlvZCwgZngyZGVsYXkpOworCXJldHVybiAwOworfQorCisvKiBpcyBjYWxsZWQgZnJvbSBpbnNuIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBkbyBhbGwgdGhlIHNhbml0eSBjaGVja3MgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9zdGFydChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAlc1xuIiwKKwkJZGV2LT5taW5vciwgX19mdW5jX18pOworCisJaWYgKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpIHsKKwkJLyogYWxyZWFkeSBydW5uaW5nICovCisJCXJldHVybiAwOworCX0KKworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSAoKGludDhfdCkgdGhpc191c2JkdXhzdWItPnB3bURlbGF5KTsKKwlyZXQgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFBXTU9OKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGluaXRhbGlzZSB0aGUgYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8IHRoaXNfdXNiZHV4c3ViLT5zaXplUHdtQnVmOyBpKyspCisJCSgoY2hhciAqKSh0aGlzX3VzYmR1eHN1Yi0+dXJiUHdtLT50cmFuc2Zlcl9idWZmZXIpKVtpXSA9IDA7CisKKwl0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nID0gMTsKKwlyZXQgPSB1c2JkdXhzdWJfc3VibWl0X1B3bVVSQnModGhpc191c2JkdXhzdWIpOworCWlmIChyZXQgPCAwKSB7CisJCXRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcgPSAwOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogZ2VuZXJhdGVzIHRoZSBiaXQgcGF0dGVybiBmb3IgUFdNIHdpdGggdGhlIG9wdGlvbmFsIHNpZ24gYml0ICovCitzdGF0aWMgaW50IHVzYmR1eF9wd21fcGF0dGVybihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBpbnQgY2hhbm5lbCwgbHNhbXBsX3QgdmFsdWUsIGxzYW1wbF90IHNpZ24pCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IGksIHN6YnVmOworCWNoYXIgKnBCdWY7CisJY2hhciBwd21fbWFzazsKKwljaGFyIHNnbl9tYXNrOworCWNoYXIgYzsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogdGhpcyBpcyB0aGUgRElPIGJpdCB3aGljaCBjYXJyaWVzIHRoZSBQV00gZGF0YSAqLworCXB3bV9tYXNrID0gKDEgPDwgY2hhbm5lbCk7CisJLyogdGhpcyBpcyB0aGUgRElPIGJpdCB3aGljaCBjYXJyaWVzIHRoZSBvcHRpb25hbCBkaXJlY3Rpb24gYml0ICovCisJc2duX21hc2sgPSAoMTYgPDwgY2hhbm5lbCk7CisJLyogdGhpcyBpcyB0aGUgYnVmZmVyIHdoaWNoIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHdpdGggYml0ICovCisJLyogcGF0dGVybiBmb3Igb25lIHBlcmlvZCAqLworCXN6YnVmID0gdGhpc191c2JkdXhzdWItPnNpemVQd21CdWY7CisJcEJ1ZiA9IChjaGFyICopKHRoaXNfdXNiZHV4c3ViLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlcik7CisJZm9yIChpID0gMDsgaSA8IHN6YnVmOyBpKyspIHsKKwkJYyA9ICpwQnVmOworCQkvKiByZXNldCBiaXRzICovCisJCWMgPSBjICYgKH5wd21fbWFzayk7CisJCS8qIHNldCB0aGUgYml0IGFzIGxvbmcgYXMgdGhlIGluZGV4IGlzIGxvd2VyIHRoYW4gdGhlIHZhbHVlICovCisJCWlmIChpIDwgdmFsdWUpCisJCQljID0gYyB8IHB3bV9tYXNrOworCQkvKiBzZXQgdGhlIG9wdGlvbmFsIHNpZ24gYml0IGZvciBhIHJlbGF5ICovCisJCWlmICghc2lnbikgeworCQkJLyogcG9zaXRpdmUgdmFsdWUgKi8KKwkJCWMgPSBjICYgKH5zZ25fbWFzayk7CisJCX0gZWxzZSB7CisJCQkvKiBuZWdhdGl2ZSB2YWx1ZSAqLworCQkJYyA9IGMgfCBzZ25fbWFzazsKKwkJfQorCQkqKHBCdWYrKykgPSBjOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JkdXhfcHdtX3dyaXRlKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgoaW5zbi0+bikgIT0gMSkgeworCQkvKgorCQkgKiBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIHZhbHVlIGhlcmUgYmVjYXVzZQorCQkgKiBpdCB3b3VsZCBqdXN0IG92ZXJ3cml0ZSB0aGUgUFdNIGJ1ZmZlciBhIGNvdXBsZSBvZiB0aW1lcworCQkgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiB0aGUgc2lnbiBpcyBzZXQgdmlhIGEgc3BlY2lhbCBJTlNOIG9ubHksIHRoaXMgZ2l2ZXMgdXMgOCBiaXRzIGZvcgorCSAqIG5vcm1hbCBvcGVyYXRpb24KKwkgKiByZWxheSBzaWduIDAgYnkgZGVmYXVsdAorCSAqLworCXJldHVybiB1c2JkdXhfcHdtX3BhdHRlcm4oZGV2LCBzLCBDUl9DSEFOKGluc24tPmNoYW5zcGVjKSwKKwkJCQkgIGRhdGFbMF0sIDApOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9wd21fcmVhZChjb21lZGlfZGV2aWNlICp4MSwgY29tZWRpX3N1YmRldmljZSAqeDIsCisJCQkgICBjb21lZGlfaW5zbiAqeDMsIGxzYW1wbF90ICp4NCkKK3sKKwkvKiBub3QgbmVlZGVkICovCisJcmV0dXJuIC1FSU5WQUw7Cit9OworCisvKiBzd2l0Y2hlcyBvbi9vZmYgUFdNICovCitzdGF0aWMgaW50IHVzYmR1eF9wd21fY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfQVJNOgorCQkvKiBzd2l0Y2ggaXQgb24gKi8KKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiAlczogcHdtIG9uXG4iLCBkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisJCS8qCisJCSAqIGlmIG5vdCB6ZXJvIHRoZSBQV00gaXMgbGltaXRlZCB0byBhIGNlcnRhaW4gdGltZSB3aGljaCBpcworCQkgKiBub3Qgc3VwcG9ydGVkIGhlcmUKKwkJICovCisJCWlmIChkYXRhWzFdICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHVzYmR1eF9wd21fc3RhcnQoZGV2LCBzKTsKKwljYXNlIElOU05fQ09ORklHX0RJU0FSTToKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiAlczogcHdtIG9mZlxuIiwgZGV2LT5taW5vciwgX19mdW5jX18pOworCQlyZXR1cm4gdXNiZHV4X3B3bV9jYW5jZWwoZGV2LCBzKTsKKwljYXNlIElOU05fQ09ORklHX0dFVF9QV01fU1RBVFVTOgorCQkvKgorCQkgKiB0byBjaGVjayBpZiB0aGUgVVNCIHRyYW5zbWlzc2lvbiBoYXMgZmFpbGVkIG9yIGluIGNhc2UgUFdNCisJCSAqIHdhcyBsaW1pdGVkIHRvIG4gY3ljbGVzIHRvIGNoZWNrIGlmIGl0IGhhcyB0ZXJtaW5hdGVkCisJCSAqLworCQlkYXRhWzFdID0gdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZzsKKwkJcmV0dXJuIDA7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fU0VUX1BFUklPRDoKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiAlczogc2V0dGluZyBwZXJpb2RcbiIsIGRldi0+bWlub3IsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHVzYmR1eF9wd21fcGVyaW9kKGRldiwgcywgZGF0YVsxXSk7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fR0VUX1BFUklPRDoKKwkJZGF0YVsxXSA9IHRoaXNfdXNiZHV4c3ViLT5wd21QZXJpb2Q7CisJCXJldHVybiAwOworCWNhc2UgSU5TTl9DT05GSUdfUFdNX1NFVF9IX0JSSURHRToKKwkJLyogdmFsdWUgaW4gdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBzaWduIGluIHRoZSBzZWNvbmQgZm9yIGEKKwkJICAgcmVsYXkgKi8KKwkJcmV0dXJuIHVzYmR1eF9wd21fcGF0dGVybihkZXYsIHMsCisJCQkJCSAgLyogdGhlIGNoYW5uZWwgbnVtYmVyICovCisJCQkJCSAgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyksCisJCQkJCSAgLyogYWN0dWFsIFBXTSBkYXRhICovCisJCQkJCSAgZGF0YVsxXSwKKwkJCQkJICAvKiBqdXN0IGEgc2lnbiAqLworCQkJCQkgIChkYXRhWzJdICE9IDApKTsKKwljYXNlIElOU05fQ09ORklHX1BXTV9HRVRfSF9CUklER0U6CisJCS8qIHZhbHVlcyBhcmUgbm90IGtlcHQgaW4gdGhpcyBkcml2ZXIsIG5vdGhpbmcgdG8gcmV0dXJuIGhlcmUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiBlbmQgb2YgUFdNICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHRpZHlfdXAoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViX3RtcCkKK3sKKwlpbnQgaTsKKworCWlmICghdXNiZHV4c3ViX3RtcCkKKwkJcmV0dXJuOworCWRldl9kYmcoJnVzYmR1eHN1Yl90bXAtPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpXzogdGlkaW5nIHVwXG4iKTsKKworCS8qIHNob3dzIHRoZSB1c2Igc3Vic3lzdGVtIHRoYXQgdGhlIGRyaXZlciBpcyBkb3duICovCisJaWYgKHVzYmR1eHN1Yl90bXAtPmludGVyZmFjZSkKKwkJdXNiX3NldF9pbnRmZGF0YSh1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UsIE5VTEwpOworCisJdXNiZHV4c3ViX3RtcC0+cHJvYmVkID0gMDsKKworCWlmICh1c2JkdXhzdWJfdG1wLT51cmJJbikgeworCQlpZiAodXNiZHV4c3ViX3RtcC0+YWlfY21kX3J1bm5pbmcpIHsKKwkJCXVzYmR1eHN1Yl90bXAtPmFpX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVzYmR1eHN1Yl91bmxpbmtfSW5VUkJzKHVzYmR1eHN1Yl90bXApOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJfdG1wLT5udW1PZkluQnVmZmVyczsgaSsrKSB7CisJCQlrZnJlZSh1c2JkdXhzdWJfdG1wLT51cmJJbltpXS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYmR1eHN1Yl90bXAtPnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCQkJdXNiX2tpbGxfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldKTsKKwkJCXVzYl9mcmVlX3VyYih1c2JkdXhzdWJfdG1wLT51cmJJbltpXSk7CisJCQl1c2JkdXhzdWJfdG1wLT51cmJJbltpXSA9IE5VTEw7CisJCX0KKwkJa2ZyZWUodXNiZHV4c3ViX3RtcC0+dXJiSW4pOworCQl1c2JkdXhzdWJfdG1wLT51cmJJbiA9IE5VTEw7CisJfQorCWlmICh1c2JkdXhzdWJfdG1wLT51cmJPdXQpIHsKKwkJaWYgKHVzYmR1eHN1Yl90bXAtPmFvX2NtZF9ydW5uaW5nKSB7CisJCQl1c2JkdXhzdWJfdG1wLT5hb19jbWRfcnVubmluZyA9IDA7CisJCQl1c2JkdXhzdWJfdW5saW5rX091dFVSQnModXNiZHV4c3ViX3RtcCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yl90bXAtPm51bU9mT3V0QnVmZmVyczsgaSsrKSB7CisJCQlpZiAodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldLT50cmFuc2Zlcl9idWZmZXIpIHsKKwkJCQlrZnJlZSh1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0tPgorCQkJCQl0cmFuc2Zlcl9idWZmZXIpOworCQkJCXVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCQkJTlVMTDsKKwkJCX0KKwkJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0pIHsKKwkJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldKTsKKwkJCQl1c2JfZnJlZV91cmIodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldKTsKKwkJCQl1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0gPSBOVUxMOworCQkJfQorCQl9CisJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYk91dCk7CisJCXVzYmR1eHN1Yl90bXAtPnVyYk91dCA9IE5VTEw7CisJfQorCWlmICh1c2JkdXhzdWJfdG1wLT51cmJQd20pIHsKKwkJaWYgKHVzYmR1eHN1Yl90bXAtPnB3bV9jbWRfcnVubmluZykgeworCQkJdXNiZHV4c3ViX3RtcC0+cHdtX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVzYmR1eHN1Yl91bmxpbmtfUHdtVVJCcyh1c2JkdXhzdWJfdG1wKTsKKwkJfQorCQlrZnJlZSh1c2JkdXhzdWJfdG1wLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYmR1eHN1Yl90bXAtPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJdXNiX2tpbGxfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYlB3bSk7CisJCXVzYl9mcmVlX3VyYih1c2JkdXhzdWJfdG1wLT51cmJQd20pOworCQl1c2JkdXhzdWJfdG1wLT51cmJQd20gPSBOVUxMOworCX0KKwlrZnJlZSh1c2JkdXhzdWJfdG1wLT5pbkJ1ZmZlcik7CisJdXNiZHV4c3ViX3RtcC0+aW5CdWZmZXIgPSBOVUxMOworCWtmcmVlKHVzYmR1eHN1Yl90bXAtPmluc25CdWZmZXIpOworCXVzYmR1eHN1Yl90bXAtPmluc25CdWZmZXIgPSBOVUxMOworCWtmcmVlKHVzYmR1eHN1Yl90bXAtPmluQnVmZmVyKTsKKwl1c2JkdXhzdWJfdG1wLT5pbkJ1ZmZlciA9IE5VTEw7CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+ZGFjX2NvbW1hbmRzKTsKKwl1c2JkdXhzdWJfdG1wLT5kYWNfY29tbWFuZHMgPSBOVUxMOworCWtmcmVlKHVzYmR1eHN1Yl90bXAtPmR1eF9jb21tYW5kcyk7CisJdXNiZHV4c3ViX3RtcC0+ZHV4X2NvbW1hbmRzID0gTlVMTDsKKwl1c2JkdXhzdWJfdG1wLT5haV9jbWRfcnVubmluZyA9IDA7CisJdXNiZHV4c3ViX3RtcC0+YW9fY21kX3J1bm5pbmcgPSAwOworCXVzYmR1eHN1Yl90bXAtPnB3bV9jbWRfcnVubmluZyA9IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBoZXgydW5zaWduZWQoY2hhciAqaCkKK3sKKwl1bnNpZ25lZCBoaSwgbG87CisKKwlpZiAoaFswXSA+ICc5JykKKwkJaGkgPSBoWzBdIC0gJ0EnICsgMHgwYTsKKwllbHNlCisJCWhpID0gaFswXSAtICcwJzsKKworCWlmIChoWzFdID4gJzknKQorCQlsbyA9IGhbMV0gLSAnQScgKyAweDBhOworCWVsc2UKKwkJbG8gPSBoWzFdIC0gJzAnOworCisJcmV0dXJuIGhpICogMHgxMCArIGxvOworfQorCisvKiBmb3IgRlgyICovCisjZGVmaW5lIEZJUk1XQVJFX01BWF9MRU4gMHgyMDAwCisKKy8qIHRha2VuIGZyb20gRGF2aWQgQnJvd25lbGwncyBmeGxvYWQgYW5kIGFkanVzdGVkIGZvciB0aGlzIGRyaXZlciAqLworc3RhdGljIGludCByZWFkX2Zpcm13YXJlKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yiwgdm9pZCAqZmlybXdhcmVQdHIsCisJCQkgbG9uZyBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2OworCWludCBpID0gMDsKKwl1bnNpZ25lZCBjaGFyICpmcCA9IChjaGFyICopZmlybXdhcmVQdHI7CisJdW5zaWduZWQgY2hhciAqZmlybXdhcmVCaW5hcnkgPSBOVUxMOworCWludCByZXMgPSAwOworCWludCBtYXhBZGRyID0gMDsKKworCWZpcm13YXJlQmluYXJ5ID0ga3phbGxvYyhGSVJNV0FSRV9NQVhfTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpcm13YXJlQmluYXJ5KSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogbWVtIGFsbG9jIGZvciBmaXJtd2FyZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWNoYXIgYnVmWzI1Nl0sICpjcDsKKwkJY2hhciB0eXBlOworCQlpbnQgbGVuOworCQlpbnQgaWR4LCBvZmY7CisJCWludCBqID0gMDsKKworCQkvKiBnZXQgb25lIGxpbmUgKi8KKwkJd2hpbGUgKChpIDwgc2l6ZSkgJiYgKGZwW2ldICE9IDEzKSAmJiAoZnBbaV0gIT0gMTApKSB7CisJCQlidWZbal0gPSBmcFtpXTsKKwkJCWkrKzsKKwkJCWorKzsKKwkJCWlmIChqID49IHNpemVvZihidWYpKSB7CisJCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiBib2d1cyBmaXJtd2FyZSBmaWxlIVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCS8qIGdldCByaWQgb2YgTEYvQ1IvLi4uICovCisJCXdoaWxlICgoaSA8IHNpemUpICYmICgoZnBbaV0gPT0gMTMpIHx8IChmcFtpXSA9PSAxMCkKKwkJCQl8fCAoZnBbaV0gPT0gMCkpKSB7CisJCQlpKys7CisJCX0KKworCQlidWZbal0gPSAwOworCQkvKiBkZXZfZGJnKGRldiwgImNvbWVkaV86IGJ1Zj0lc1xuIiwgYnVmKTsgKi8KKworCQkvKgorCQkgKiBFWFRFTlNJT046CisJCSAqICIjIGNvbW1lbnQtdGlsbC1lbmQtb2YtbGluZSIsIGZvciBjb3B5cmlnaHRzIGV0YworCQkgKi8KKwkJaWYgKGJ1ZlswXSA9PSAnIycpCisJCQljb250aW51ZTsKKworCQlpZiAoYnVmWzBdICE9ICc6JykgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1cGxvYWQ6IG5vdCBhbiBpaGV4IHJlY29yZDogJXMiLAorCQkJCWJ1Zik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIFJlYWQgdGhlIGxlbmd0aCBmaWVsZCAodXAgdG8gMTYgYnl0ZXMpICovCisJCWxlbiA9IGhleDJ1bnNpZ25lZChidWYgKyAxKTsKKworCQkvKiBSZWFkIHRoZSB0YXJnZXQgb2Zmc2V0ICovCisJCW9mZiA9IChoZXgydW5zaWduZWQoYnVmICsgMykgKiAweDAxMDApICsgaGV4MnVuc2lnbmVkKGJ1ZiArIDUpOworCisJCWlmICgob2ZmICsgbGVuKSA+IG1heEFkZHIpCisJCQltYXhBZGRyID0gb2ZmICsgbGVuOworCisKKwkJaWYgKG1heEFkZHIgPj0gRklSTVdBUkVfTUFYX0xFTikgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiBmaXJtd2FyZSB1cGxvYWQgZ29lcyAiCisJCQkJImJleW9uZCBGWDIgUkFNIGJvdW5kYXJpZXMuXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCS8qIGRldl9kYmcoZGV2LCAiY29tZWRpXzogb2ZmPSV4LCBsZW49JXg6XG4iLCBvZmYsIGxlbik7ICovCisKKwkJLyogUmVhZCB0aGUgcmVjb3JkIHR5cGUgKi8KKwkJdHlwZSA9IGhleDJ1bnNpZ25lZChidWYgKyA3KTsKKworCQkvKiBJZiB0aGlzIGlzIGFuIEVPRiByZWNvcmQsIHRoZW4gbWFrZSBpdCBzby4gKi8KKwkJaWYgKHR5cGUgPT0gMSkKKwkJCWJyZWFrOworCisKKwkJaWYgKHR5cGUgIT0gMCkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1bnN1cHBvcnRlZCByZWNvcmQgdHlwZTogJXVcbiIsCisJCQkJdHlwZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWZvciAoaWR4ID0gMCwgY3AgPSBidWYgKyA5OyBpZHggPCBsZW47IGlkeCArPSAxLCBjcCArPSAyKSB7CisJCQlmaXJtd2FyZUJpbmFyeVtpZHggKyBvZmZdID0gaGV4MnVuc2lnbmVkKGNwKTsKKwkJCS8qcHJpbnRrKCIlMDJ4ICIsZmlybXdhcmVCaW5hcnlbaWR4K29mZl0pOyAqLworCQl9CisJCS8qcHJpbnRrKCJcbiIpOyAqLworCisJCWlmIChpID49IHNpemUpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdW5leHBlY3RlZCBlbmQgb2YgaGV4IGZpbGVcbiIpOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlyZXMgPSBmaXJtd2FyZVVwbG9hZCh1c2JkdXhzdWIsIGZpcm13YXJlQmluYXJ5LCBtYXhBZGRyICsgMSk7CisJa2ZyZWUoZmlybXdhcmVCaW5hcnkpOworCXJldHVybiByZXM7Cit9CisKKy8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHVyYnMgYW5kIGluaXRpYWxpc2UgdGhlbSAqLworc3RhdGljIGludCB1c2JkdXhzdWJfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVpbnRlcmYsCisJCQkgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHVpbnRlcmYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1aW50ZXJmLT5kZXY7CisJaW50IGk7CisJaW50IGluZGV4OworCisJZGV2X2RiZyhkZXYsICJjb21lZGlfOiB1c2JkdXhfOiAiCisJCSJmaW5kaW5nIGEgZnJlZSBzdHJ1Y3R1cmUgZm9yIHRoZSB1c2ItZGV2aWNlXG4iKTsKKworCWRvd24oJnN0YXJ0X3N0b3Bfc2VtKTsKKwkvKiBsb29rIGZvciBhIGZyZWUgcGxhY2UgaW4gdGhlIHVzYmR1eCBhcnJheSAqLworCWluZGV4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IE5VTVVTQkRVWDsgaSsrKSB7CisJCWlmICghKHVzYmR1eHN1YltpXS5wcm9iZWQpKSB7CisJCQlpbmRleCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG5vIG1vcmUgc3BhY2UgKi8KKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJZGV2X2VycihkZXYsICJUb28gbWFueSB1c2JkdXgtZGV2aWNlcyBjb25uZWN0ZWQuXG4iKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTUZJTEU7CisJfQorCWRldl9kYmcoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCSJ1c2JkdXhzdWJbJWRdIGlzIHJlYWR5IHRvIGNvbm5lY3QgdG8gY29tZWRpLlxuIiwgaW5kZXgpOworCisJaW5pdF9NVVRFWCgmKHVzYmR1eHN1YltpbmRleF0uc2VtKSk7CisJLyogc2F2ZSBhIHBvaW50ZXIgdG8gdGhlIHVzYiBkZXZpY2UgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLnVzYmRldiA9IHVkZXY7CisKKwkvKiAyLjY6IHNhdmUgdGhlIGludGVyZmFjZSBpdHNlbGYgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmludGVyZmFjZSA9IHVpbnRlcmY7CisJLyogZ2V0IHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZyb20gdGhlIGludGVyZmFjZSAqLworCXVzYmR1eHN1YltpbmRleF0uaWZudW0gPSB1aW50ZXJmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJLyogaGFuZCB0aGUgcHJpdmF0ZSBkYXRhIG92ZXIgdG8gdGhlIHVzYiBzdWJzeXN0ZW0gKi8KKwkvKiB3aWxsIGJlIG5lZWRlZCBmb3IgZGlzY29ubmVjdCAqLworCXVzYl9zZXRfaW50ZmRhdGEodWludGVyZiwgJih1c2JkdXhzdWJbaW5kZXhdKSk7CisKKwlkZXZfZGJnKGRldiwgImNvbWVkaV86IHVzYmR1eDogaWZudW09JWRcbiIsIHVzYmR1eHN1YltpbmRleF0uaWZudW0pOworCisJLyogdGVzdCBpZiBpdCBpcyBoaWdoIHNwZWVkIChVU0IgMi4wKSAqLworCXVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCA9CisJCSh1c2JkdXhzdWJbaW5kZXhdLnVzYmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpOworCisJLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgY29tbWFuZHMgb2YgdGhlIERBIGNvbnZlcnRlciAqLworCXVzYmR1eHN1YltpbmRleF0uZGFjX2NvbW1hbmRzID0ga3phbGxvYyhOVU1PVVRDSEFOTkVMUywgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2JkdXhzdWJbaW5kZXhdLmRhY19jb21tYW5kcykgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkJImVycm9yIGFsbG9jIHNwYWNlIGZvciBkYWMgY29tbWFuZHNcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgY29tbWFuZHMgZ29pbmcgdG8gdGhlIHVzYiBkZXZpY2UgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmR1eF9jb21tYW5kcyA9IGt6YWxsb2MoU0laRU9GRFVYQlVGRkVSLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYmR1eHN1YltpbmRleF0uZHV4X2NvbW1hbmRzKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCQkiZXJyb3IgYWxsb2Mgc3BhY2UgZm9yIGRhYyBjb21tYW5kc1xuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBjcmVhdGUgc3BhY2UgZm9yIHRoZSBpbiBidWZmZXIgYW5kIHNldCBpdCB0byB6ZXJvICovCisJdXNiZHV4c3ViW2luZGV4XS5pbkJ1ZmZlciA9IGt6YWxsb2MoU0laRUlOQlVGLCBHRlBfS0VSTkVMKTsKKwlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLmluQnVmZmVyKSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkJImNvdWxkIG5vdCBhbGxvYyBzcGFjZSBmb3IgaW5CdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogY3JlYXRlIHNwYWNlIG9mIHRoZSBpbnN0cnVjdGlvbiBidWZmZXIgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmluc25CdWZmZXIgPSBremFsbG9jKFNJWkVJTlNOQlVGLCBHRlBfS0VSTkVMKTsKKwlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLmluc25CdWZmZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCQkiY291bGQgbm90IGFsbG9jIHNwYWNlIGZvciBpbnNuQnVmZmVyXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIG91dGJ1ZmZlciAqLworCXVzYmR1eHN1YltpbmRleF0ub3V0QnVmZmVyID0ga3phbGxvYyhTSVpFT1VUQlVGLCBHRlBfS0VSTkVMKTsKKwlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLm91dEJ1ZmZlcikpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJCSJjb3VsZCBub3QgYWxsb2Mgc3BhY2UgZm9yIG91dEJ1ZmZlclxuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBzZXR0aW5nIHRvIGFsdGVybmF0ZSBzZXR0aW5nIDM6IGVuYWJsaW5nIGlzbyBlcCBhbmQgYnVsayBlcC4gKi8KKwlpID0gdXNiX3NldF9pbnRlcmZhY2UodXNiZHV4c3ViW2luZGV4XS51c2JkZXYsCisJCQkgICAgICB1c2JkdXhzdWJbaW5kZXhdLmlmbnVtLCAzKTsKKwlpZiAoaSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXglZDogIgorCQkJImNvdWxkIG5vdCBzZXQgYWx0ZXJuYXRlIHNldHRpbmcgMyBpbiBoaWdoIHNwZWVkLlxuIiwKKwkJCWluZGV4KTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh1c2JkdXhzdWJbaW5kZXhdLmhpZ2hfc3BlZWQpCisJCXVzYmR1eHN1YltpbmRleF0ubnVtT2ZJbkJ1ZmZlcnMgPSBOVU1PRklOQlVGRkVSU0hJR0g7CisJZWxzZQorCQl1c2JkdXhzdWJbaW5kZXhdLm51bU9mSW5CdWZmZXJzID0gTlVNT0ZJTkJVRkZFUlNGVUxMOworCisJdXNiZHV4c3ViW2luZGV4XS51cmJJbiA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiB1c2JkdXhzdWJbaW5kZXhdLm51bU9mSW5CdWZmZXJzLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLnVyYkluKSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogQ291bGQgbm90IGFsbG9jLiB1cmJJbiBhcnJheVxuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViW2luZGV4XS5udW1PZkluQnVmZmVyczsgaSsrKSB7CisJCS8qIG9uZSBmcmFtZTogMW1zICovCisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0gPSB1c2JfYWxsb2NfdXJiKDEsIEdGUF9LRVJORUwpOworCQlpZiAodXNiZHV4c3ViW2luZGV4XS51cmJJbltpXSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkJIkNvdWxkIG5vdCBhbGxvYy4gdXJiKCVkKVxuIiwgaW5kZXgsIGkpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5kZXYgPSB1c2JkdXhzdWJbaW5kZXhdLnVzYmRldjsKKwkJLyogd2lsbCBiZSBmaWxsZWQgbGF0ZXIgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGNvbWVkaS1kZXZpY2UgKi8KKwkJLyogYW5kIE9OTFkgdGhlbiB0aGUgdXJiIHNob3VsZCBiZSBzdWJtaXR0ZWQgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+Y29udGV4dCA9IE5VTEw7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPnBpcGUgPQorCQkJdXNiX3Jjdmlzb2NwaXBlKHVzYmR1eHN1YltpbmRleF0udXNiZGV2LCBJU09JTkVQKTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlciA9CisJCQlremFsbG9jKFNJWkVJTkJVRiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlcikpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiY291bGQgbm90IGFsbG9jLiB0cmFuc2IuXG4iLCBpbmRleCk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPmNvbXBsZXRlID0gdXNiZHV4c3ViX2FpX0lzb2NJcnE7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPm51bWJlcl9vZl9wYWNrZXRzID0gMTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFNJWkVJTkJVRjsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+aXNvX2ZyYW1lX2Rlc2NbMF0ubGVuZ3RoID0gU0laRUlOQlVGOworCX0KKworCS8qIG91dCAqLworCWlmICh1c2JkdXhzdWJbaW5kZXhdLmhpZ2hfc3BlZWQpCisJCXVzYmR1eHN1YltpbmRleF0ubnVtT2ZPdXRCdWZmZXJzID0gTlVNT0ZPVVRCVUZGRVJTSElHSDsKKwllbHNlCisJCXVzYmR1eHN1YltpbmRleF0ubnVtT2ZPdXRCdWZmZXJzID0gTlVNT0ZPVVRCVUZGRVJTRlVMTDsKKworCXVzYmR1eHN1YltpbmRleF0udXJiT3V0ID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHVyYiAqKSAqIHVzYmR1eHN1YltpbmRleF0ubnVtT2ZPdXRCdWZmZXJzLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLnVyYk91dCkpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJCSJDb3VsZCBub3QgYWxsb2MuIHVyYk91dCBhcnJheVxuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViW2luZGV4XS5udW1PZk91dEJ1ZmZlcnM7IGkrKykgeworCQkvKiBvbmUgZnJhbWU6IDFtcyAqLworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXSA9IHVzYl9hbGxvY191cmIoMSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkJIkNvdWxkIG5vdCBhbGxvYy4gdXJiKCVkKVxuIiwgaW5kZXgsIGkpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+ZGV2ID0gdXNiZHV4c3ViW2luZGV4XS51c2JkZXY7CisJCS8qIHdpbGwgYmUgZmlsbGVkIGxhdGVyIHdpdGggYSBwb2ludGVyIHRvIHRoZSBjb21lZGktZGV2aWNlICovCisJCS8qIGFuZCBPTkxZIHRoZW4gdGhlIHVyYiBzaG91bGQgYmUgc3VibWl0dGVkICovCisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5jb250ZXh0ID0gTlVMTDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPnBpcGUgPQorCQkJdXNiX3NuZGlzb2NwaXBlKHVzYmR1eHN1YltpbmRleF0udXNiZGV2LCBJU09PVVRFUCk7CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlciA9CisJCQlremFsbG9jKFNJWkVPVVRCVUYsIEdGUF9LRVJORUwpOworCQlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyKSkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXglZDogIgorCQkJCSJjb3VsZCBub3QgYWxsb2MuIHRyYW5zYi5cbiIsIGluZGV4KTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmNvbXBsZXRlID0gdXNiZHV4c3ViX2FvX0lzb2NJcnE7CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5udW1iZXJfb2ZfcGFja2V0cyA9IDE7CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gU0laRU9VVEJVRjsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmlzb19mcmFtZV9kZXNjWzBdLm9mZnNldCA9IDA7CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPQorCQkJU0laRU9VVEJVRjsKKwkJaWYgKHVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCkgeworCQkJLyogdWZyYW1lcyAqLworCQkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmludGVydmFsID0gODsKKwkJfSBlbHNlIHsKKwkJCS8qIGZyYW1lcyAqLworCQkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmludGVydmFsID0gMTsKKwkJfQorCX0KKworCS8qIHB3bSAqLworCWlmICh1c2JkdXhzdWJbaW5kZXhdLmhpZ2hfc3BlZWQpIHsKKwkJLyogbWF4IGJ1bGsgZXAgc2l6ZSBpbiBoaWdoIHNwZWVkICovCisJCXVzYmR1eHN1YltpbmRleF0uc2l6ZVB3bUJ1ZiA9IDUxMjsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJQd20gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQlpZiAodXNiZHV4c3ViW2luZGV4XS51cmJQd20gPT0gTlVMTCkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXglZDogIgorCQkJCSJDb3VsZCBub3QgYWxsb2MuIHB3bSB1cmJcbiIsIGluZGV4KTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJQd20tPnRyYW5zZmVyX2J1ZmZlciA9CisJCQlremFsbG9jKHVzYmR1eHN1YltpbmRleF0uc2l6ZVB3bUJ1ZiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiUHdtLT50cmFuc2Zlcl9idWZmZXIpKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkJImNvdWxkIG5vdCBhbGxvYy4gdHJhbnNiLiBmb3IgcHdtXG4iLCBpbmRleCk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlIHsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJQd20gPSBOVUxMOworCQl1c2JkdXhzdWJbaW5kZXhdLnNpemVQd21CdWYgPSAwOworCX0KKworCXVzYmR1eHN1YltpbmRleF0uYWlfY21kX3J1bm5pbmcgPSAwOworCXVzYmR1eHN1YltpbmRleF0uYW9fY21kX3J1bm5pbmcgPSAwOworCXVzYmR1eHN1YltpbmRleF0ucHdtX2NtZF9ydW5uaW5nID0gMDsKKworCS8qIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZnVuY3Rpb24gKi8KKwl1c2JkdXhzdWJbaW5kZXhdLnByb2JlZCA9IDE7CisJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwlkZXZfaW5mbyhkZXYsICJjb21lZGlfOiB1c2JkdXglZCAiCisJCSAiaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluaXRpYWxpc2VkLlxuIiwgaW5kZXgpOworCS8qIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNiZHV4c3ViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViX3RtcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCisJaWYgKCF1c2JkdXhzdWJfdG1wKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJjb21lZGlfOiBkaXNjb25uZWN0IGNhbGxlZCB3aXRoIG51bGwgcG9pbnRlci5cbiIpOworCQlyZXR1cm47CisJfQorCWlmICh1c2JkdXhzdWJfdG1wLT51c2JkZXYgIT0gdWRldikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkiY29tZWRpXzogQlVHISBjYWxsZWQgd2l0aCB3cm9uZyBwdHIhISFcbiIpOworCQlyZXR1cm47CisJfQorCWRvd24oJnN0YXJ0X3N0b3Bfc2VtKTsKKwlkb3duKCZ1c2JkdXhzdWJfdG1wLT5zZW0pOworCXRpZHlfdXAodXNiZHV4c3ViX3RtcCk7CisJdXAoJnVzYmR1eHN1Yl90bXAtPnNlbSk7CisJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwlkZXZfZGJnKCZpbnRmLT5kZXYsICJjb21lZGlfOiBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgdXNiXG4iKTsKK30KKworLyogaXMgY2FsbGVkIHdoZW4gY29tZWRpLWNvbmZpZyBpcyBjYWxsZWQgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWludCByZXQ7CisJaW50IGluZGV4OworCWludCBpOworCXN0cnVjdCB1c2JkdXhzdWIgKnVkZXY7CisKKwljb21lZGlfc3ViZGV2aWNlICpzID0gTlVMTDsKKwlkZXYtPnByaXZhdGUgPSBOVUxMOworCisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCS8qIGZpbmQgYSB2YWxpZCBkZXZpY2Ugd2hpY2ggaGFzIGJlZW4gZGV0ZWN0ZWQgYnkgdGhlIHByb2JlIGZ1bmN0aW9uIG9mCisJICogdGhlIHVzYiAqLworCWluZGV4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IE5VTVVTQkRVWDsgaSsrKSB7CisJCWlmICgodXNiZHV4c3ViW2ldLnByb2JlZCkgJiYgKCF1c2JkdXhzdWJbaV0uYXR0YWNoZWQpKSB7CisJCQlpbmRleCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpbmRleCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogdXNiZHV4OiBlcnJvcjogYXR0YWNoIGZhaWxlZCwgbm8gIgorCQkgICAgICAgInVzYmR1eCBkZXZzIGNvbm5lY3RlZCB0byB0aGUgdXNiIGJ1cy5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl1ZGV2ID0gJnVzYmR1eHN1YltpbmRleF07CisJZG93bigmdWRldi0+c2VtKTsKKwkvKiBwb2ludGVyIGJhY2sgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29tZWRpIGRldmljZSAqLworCXVkZXYtPmNvbWVkaWRldiA9IGRldjsKKworCS8qIHRyeWluZyB0byB1cGxvYWQgdGhlIGZpcm13YXJlIGludG8gdGhlIGNoaXAgKi8KKwlpZiAoY29tZWRpX2F1eF9kYXRhKGl0LT5vcHRpb25zLCAwKSAmJgorCQlpdC0+b3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdKSB7CisJCXJlYWRfZmlybXdhcmUodWRldiwgY29tZWRpX2F1eF9kYXRhKGl0LT5vcHRpb25zLCAwKSwKKwkJCSAgICAgIGl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF0pOworCX0KKworCWRldi0+Ym9hcmRfbmFtZSA9IEJPQVJETkFNRTsKKworCS8qIHNldCBudW1iZXIgb2Ygc3ViZGV2aWNlcyAqLworCWlmICh1ZGV2LT5oaWdoX3NwZWVkKSB7CisJCS8qIHdpdGggcHdtICovCisJCWRldi0+bl9zdWJkZXZpY2VzID0gNTsKKwl9IGVsc2UgeworCQkvKiB3aXRob3V0IHB3bSAqLworCQlkZXYtPm5fc3ViZGV2aWNlcyA9IDQ7CisJfQorCisJLyogYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdWJkZXZpY2VzICovCisJcmV0ID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIGRldi0+bl9zdWJkZXZpY2VzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogZXJyb3IgYWxsb2Mgc3BhY2UgZm9yIHN1YmRldlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2luZm8oJnVkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYi1kZXZpY2UgJWQgaXMgYXR0YWNoZWQgdG8gY29tZWRpLlxuIiwKKwkJZGV2LT5taW5vciwgaW5kZXgpOworCS8qIHByaXZhdGUgc3RydWN0dXJlIGlzIGFsc28gc2ltcGx5IHRoZSB1c2Itc3RydWN0dXJlICovCisJZGV2LT5wcml2YXRlID0gdWRldjsKKworCS8qIHRoZSBmaXJzdCBzdWJkZXZpY2UgaXMgdGhlIEEvRCBjb252ZXJ0ZXIgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0FEOworCS8qIHRoZSBVUkJzIGdldCB0aGUgY29tZWRpIHN1YmRldmljZSAqLworCS8qIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciByZWFkaW5nICovCisJLyogdGhpcyBpcyB0aGUgc3ViZGV2aWNlIHdoaWNoIHJlYWRzIGRhdGEgKi8KKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkvKiB0aGUgc3ViZGV2aWNlIHJlY2VpdmVzIGFzIHByaXZhdGUgc3RydWN0dXJlIHRoZSAqLworCS8qIHVzYi1zdHJ1Y3R1cmUgKi8KKwlzLT5wcml2YXRlID0gTlVMTDsKKwkvKiBhbmFsb2cgaW5wdXQgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJLyogcmVhZGFibGUgYW5kIHJlZiBpcyB0byBncm91bmQgKi8KKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NNRF9SRUFEOworCS8qIDggY2hhbm5lbHMgKi8KKwlzLT5uX2NoYW4gPSA4OworCS8qIGxlbmd0aCBvZiB0aGUgY2hhbm5lbGxpc3QgKi8KKwlzLT5sZW5fY2hhbmxpc3QgPSA4OworCS8qIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXMtPmluc25fcmVhZCA9IHVzYmR1eF9haV9pbnNuX3JlYWQ7CisJcy0+ZG9fY21kdGVzdCA9IHVzYmR1eF9haV9jbWR0ZXN0OworCXMtPmRvX2NtZCA9IHVzYmR1eF9haV9jbWQ7CisJcy0+Y2FuY2VsID0gdXNiZHV4X2FpX2NhbmNlbDsKKwkvKiBtYXggdmFsdWUgZnJvbSB0aGUgQS9EIGNvbnZlcnRlciAoMTJiaXQpICovCisJcy0+bWF4ZGF0YSA9IDB4ZmZmOworCS8qIHJhbmdlIHRhYmxlIHRvIGNvbnZlcnQgdG8gcGh5c2ljYWwgdW5pdHMgKi8KKwlzLT5yYW5nZV90YWJsZSA9ICgmcmFuZ2VfdXNiZHV4X2FpX3JhbmdlKTsKKworCS8qIGFuYWxvZyBvdXQgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0RBOworCS8qIGFuYWxvZyBvdXQgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJLyogYmFja3dhcmQgcG9pbnRlciAqLworCWRldi0+d3JpdGVfc3ViZGV2ID0gczsKKwkvKiB0aGUgc3ViZGV2aWNlIHJlY2VpdmVzIGFzIHByaXZhdGUgc3RydWN0dXJlIHRoZSAqLworCS8qIHVzYi1zdHJ1Y3R1cmUgKi8KKwlzLT5wcml2YXRlID0gTlVMTDsKKwkvKiBhcmUgd3JpdGFibGUgKi8KKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NNRF9XUklURTsKKwkvKiA0IGNoYW5uZWxzICovCisJcy0+bl9jaGFuID0gNDsKKwkvKiBsZW5ndGggb2YgdGhlIGNoYW5uZWxsaXN0ICovCisJcy0+bGVuX2NoYW5saXN0ID0gNDsKKwkvKiAxMiBiaXQgcmVzb2x1dGlvbiAqLworCXMtPm1heGRhdGEgPSAweDBmZmY7CisJLyogYmlwb2xhciByYW5nZSAqLworCXMtPnJhbmdlX3RhYmxlID0gKCZyYW5nZV91c2JkdXhfYW9fcmFuZ2UpOworCS8qIGNhbGxiYWNrICovCisJcy0+ZG9fY21kdGVzdCA9IHVzYmR1eF9hb19jbWR0ZXN0OworCXMtPmRvX2NtZCA9IHVzYmR1eF9hb19jbWQ7CisJcy0+Y2FuY2VsID0gdXNiZHV4X2FvX2NhbmNlbDsKKwlzLT5pbnNuX3JlYWQgPSB1c2JkdXhfYW9faW5zbl9yZWFkOworCXMtPmluc25fd3JpdGUgPSB1c2JkdXhfYW9faW5zbl93cml0ZTsKKworCS8qIGRpZ2l0YWwgSS9PICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9ESU87CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuID0gODsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICgmcmFuZ2VfZGlnaXRhbCk7CisJcy0+aW5zbl9iaXRzID0gdXNiZHV4X2Rpb19pbnNuX2JpdHM7CisJcy0+aW5zbl9jb25maWcgPSB1c2JkdXhfZGlvX2luc25fY29uZmlnOworCS8qIHdlIGRvbid0IHVzZSBpdCAqLworCXMtPnByaXZhdGUgPSBOVUxMOworCisJLyogY291bnRlciAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfQ09VTlRFUjsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuID0gNDsKKwlzLT5tYXhkYXRhID0gMHhGRkZGOworCXMtPmluc25fcmVhZCA9IHVzYmR1eF9jb3VudGVyX3JlYWQ7CisJcy0+aW5zbl93cml0ZSA9IHVzYmR1eF9jb3VudGVyX3dyaXRlOworCXMtPmluc25fY29uZmlnID0gdXNiZHV4X2NvdW50ZXJfY29uZmlnOworCisJaWYgKHVkZXYtPmhpZ2hfc3BlZWQpIHsKKwkJLyogdGltZXIgLyBwd20gKi8KKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9QV007CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9QV007CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9QV01fSEJSSURHRTsKKwkJcy0+bl9jaGFuID0gODsKKwkJLyogdGhpcyBkZWZpbmVzIHRoZSBtYXggZHV0eSBjeWNsZSByZXNvbHV0aW9uICovCisJCXMtPm1heGRhdGEgPSB1ZGV2LT5zaXplUHdtQnVmOworCQlzLT5pbnNuX3dyaXRlID0gdXNiZHV4X3B3bV93cml0ZTsKKwkJcy0+aW5zbl9yZWFkID0gdXNiZHV4X3B3bV9yZWFkOworCQlzLT5pbnNuX2NvbmZpZyA9IHVzYmR1eF9wd21fY29uZmlnOworCQl1c2JkdXhfcHdtX3BlcmlvZChkZXYsIHMsIFBXTV9ERUZBVUxUX1BFUklPRCk7CisJfQorCS8qIGZpbmFsbHkgZGVjaWRlIHRoYXQgaXQncyBhdHRhY2hlZCAqLworCXVkZXYtPmF0dGFjaGVkID0gMTsKKworCXVwKCZ1ZGV2LT5zZW0pOworCisJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKworCWRldl9pbmZvKCZ1ZGV2LT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiBhdHRhY2hlZCB0byB1c2JkdXguXG4iLAorCQkgZGV2LT5taW5vcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpPzogdXNiZHV4OiBkZXRhY2ggd2l0aG91dCBkZXYgdmFyaWFibGUuLi5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl1c2JkdXhzdWJfdG1wID0gZGV2LT5wcml2YXRlOworCWlmICghdXNiZHV4c3ViX3RtcCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGk/OiB1c2JkdXg6IGRldGFjaCB3aXRob3V0IHB0ciB0byB1c2JkdXhzdWJbXVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRldl9kYmcoJnVzYmR1eHN1Yl90bXAtPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGRldGFjaCB1c2IgZGV2aWNlXG4iLAorCQlkZXYtPm1pbm9yKTsKKworCWRvd24oJnVzYmR1eHN1Yl90bXAtPnNlbSk7CisJLyogRG9uJ3QgYWxsb3cgZGV0YWNoIHRvIGZyZWUgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisJLyogSXQncyBvbmUgZW50cnkgb2Ygb2YgdXNiZHV4c3ViW10gKi8KKwlkZXYtPnByaXZhdGUgPSBOVUxMOworCXVzYmR1eHN1Yl90bXAtPmF0dGFjaGVkID0gMDsKKwl1c2JkdXhzdWJfdG1wLT5jb21lZGlkZXYgPSBOVUxMOworCWRldl9kYmcoJnVzYmR1eHN1Yl90bXAtPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IGRldGFjaDogc3VjY2Vzc2Z1bGx5IHJlbW92ZWRcbiIsIGRldi0+bWlub3IpOworCXVwKCZ1c2JkdXhzdWJfdG1wLT5zZW0pOworCXJldHVybiAwOworfQorCisvKiBtYWluIGRyaXZlciBzdHJ1Y3QgKi8KK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl91c2JkdXggPSB7CisgICAgICAuZHJpdmVyX25hbWUgPQkidXNiZHV4IiwKKyAgICAgIC5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisgICAgICAuYXR0YWNoID0JCXVzYmR1eF9hdHRhY2gsCisgICAgICAuZGV0YWNoID0JCXVzYmR1eF9kZXRhY2gsCit9OworCitzdGF0aWMgdm9pZCBpbml0X3VzYl9kZXZpY2VzKHZvaWQpCit7CisJaW50IGluZGV4OworCisJLyogYWxsIGRldmljZXMgZW50cmllcyBhcmUgaW52YWxpZCB0byBiZWdpbiB3aXRoICovCisJLyogdGhleSB3aWxsIGJlY29tZSB2YWxpZCBieSB0aGUgcHJvYmUgZnVuY3Rpb24gKi8KKwkvKiBhbmQgdGhlbiBmaW5hbGx5IGJ5IHRoZSBhdHRhY2gtZnVuY3Rpb24gKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1VU0JEVVg7IGluZGV4KyspIHsKKwkJbWVtc2V0KCYodXNiZHV4c3ViW2luZGV4XSksIDB4MDAsIHNpemVvZih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCWluaXRfTVVURVgoJih1c2JkdXhzdWJbaW5kZXhdLnNlbSkpOworCX0KK30KKworLyogVGFibGUgd2l0aCB0aGUgVVNCLWRldmljZXM6IGp1c3Qgbm93IG9ubHkgdGVzdGluZyBJRHMgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JkdXhzdWJfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRSgweDEzZDgsIDB4MDAwMSkgfSwKKwl7VVNCX0RFVklDRSgweDEzZDgsIDB4MDAwMikgfSwKKwl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiZHV4c3ViX3RhYmxlKTsKKworLyogVGhlIHVzYmR1eHN1Yi1kcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JkdXhzdWJfZHJpdmVyID0geworICAgICAgLm5hbWUgPQkJQk9BUkROQU1FLAorICAgICAgLnByb2JlID0JCXVzYmR1eHN1Yl9wcm9iZSwKKyAgICAgIC5kaXNjb25uZWN0ID0JdXNiZHV4c3ViX2Rpc2Nvbm5lY3QsCisgICAgICAuaWRfdGFibGUgPQl1c2JkdXhzdWJfdGFibGUsCit9OworCisvKiBDYW4ndCB1c2UgdGhlIG5pY2UgbWFjcm8gYXMgSSBoYXZlIGFsc28gdG8gaW5pdGlhbGlzZSB0aGUgVVNCICovCisvKiBzdWJzeXN0ZW06ICovCisvKiByZWdpc3RlcmluZyB0aGUgdXNiLXN5c3RlbSBfYW5kXyB0aGUgY29tZWRpLWRyaXZlciAqLworc3RhdGljIGludCBpbml0X3VzYmR1eCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIgorCSAgICAgICBEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MgIlxuIik7CisJaW5pdF91c2JfZGV2aWNlcygpOworCXVzYl9yZWdpc3RlcigmdXNiZHV4c3ViX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3VzYmR1eCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGRlcmVnaXN0ZXJpbmcgdGhlIGNvbWVkaSBkcml2ZXIgYW5kIHRoZSB1c2Itc3Vic3lzdGVtICovCitzdGF0aWMgdm9pZCBleGl0X3VzYmR1eCh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3VzYmR1eCk7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYmR1eHN1Yl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X3VzYmR1eCk7Cittb2R1bGVfZXhpdChleGl0X3VzYmR1eCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwMGZmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKQEAgLTAsMCArMSwxNzc4IEBACisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC45OWEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkJlcm5kIFBvcnIsIEJlcm5kUG9yckBmMnMuY29tIgorI2RlZmluZSBEUklWRVJfREVTQyAiVVNCLURVWGZhc3QsIEJlcm5kUG9yckBmMnMuY29tIgorLyoKKyAgIGNvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYworICAgQ29weXJpZ2h0IChDKSAyMDA0IEJlcm5kIFBvcnIsIEJlcm5kLlBvcnJAZjJzLmNvbQorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKK0RyaXZlcjogdXNiZHV4ZmFzdAorRGVzY3JpcHRpb246IElUTCBVU0ItRFVYZmFzdAorRGV2aWNlczogW0lUTF0gVVNCLURVWCAodXNiZHV4ZmFzdC5vKQorQXV0aG9yOiBCZXJuZCBQb3JyIDxCZXJuZFBvcnJAZjJzLmNvbT4KK1VwZGF0ZWQ6IDA0IERlYyAyMDA2CitTdGF0dXM6IHRlc3RpbmcKKyovCisKKy8qCisgKiBJIG11c3QgZ2l2ZSBjcmVkaXQgaGVyZSB0byBDaHJpcyBCYXVnaGVyIHdobworICogd3JvdGUgdGhlIGRyaXZlciBmb3IgQVQtTUlPLTE2ZC4gSSB1c2VkIHNvbWUgcGFydHMgb2YgdGhpcworICogZHJpdmVyLiBJIGFsc28gbXVzdCBnaXZlIGNyZWRpdHMgdG8gRGF2aWQgQnJvd25lbGwKKyAqIHdobyBzdXBwb3J0ZWQgbWUgd2l0aCB0aGUgVVNCIGRldmVsb3BtZW50LgorICoKKyAqIEJlcm5kIFBvcnIKKyAqCisgKgorICogUmV2aXNpb24gaGlzdG9yeToKKyAqIDAuOTogRHJvcHBpbmcgdGhlIGZpcnN0IGRhdGEgcGFja2V0IHdoaWNoIHNlZW1zIHRvIGJlIGZyb20gdGhlIGxhc3QgdHJhbnNmZXIuCisgKiAgICAgIEJ1ZmZlciBvdmVyZmxvd3MgaW4gdGhlIEZYMiBhcmUgaGFuZGVkIG92ZXIgdG8gY29tZWRpLgorICogMC45MjogRHJvcHBpbmcgbm93IDQgcGFja2V0cy4gVGhlIHF1YWQgYnVmZmVyIGhhcyB0byBiZSBlbXB0aWVkLgorICogICAgICAgQWRkZWQgaW5zbiBjb21tYW5kIGJhc2ljYWxseSBmb3IgdGVzdGluZy4gU2FtcGxlIHJhdGUgaXMgMU1Iei8xNmNoPTYyLjVrSHoKKyAqIDAuOTk6IElhbiBBYmJvdHQgcG9pbnRlZCBvdXQgYSBidWcgd2hpY2ggaGFzIGJlZW4gY29ycmVjdGVkLiBUaGFua3MhCisgKiAwLjk5YTogYWRkZWQgZXh0ZXJuYWwgdHJpZ2dlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisvLyAodW4pY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHRvIGhhdmUgZGVidWcgaW5mby4KKy8vI2RlZmluZSBDT05GSUdfQ09NRURJX0RFQlVHCisjdW5kZWYgIENPTkZJR19DT01FRElfREVCVUcKKworI2RlZmluZSBCT0FSRE5BTUUgInVzYmR1eGZhc3QiCisKKy8vIHRpbWVvdXQgZm9yIHRoZSBVU0ItdHJhbnNmZXIKKyNkZWZpbmUgRVpUSU1FT1VUIDMwCisKKy8vIGNvbnN0YW50cyBmb3IgImZpcm13YXJlIiB1cGxvYWQgYW5kIGRvd25sb2FkCisjZGVmaW5lIFVTQkRVWEZBU1RTVUJfRklSTVdBUkUgMHhBMAorI2RlZmluZSBWRU5ET1JfRElSX0lOICAweEMwCisjZGVmaW5lIFZFTkRPUl9ESVJfT1VUIDB4NDAKKworLy8gaW50ZXJuYWwgYWRyZXNzZXMgb2YgdGhlIDgwNTEgcHJvY2Vzc29yCisjZGVmaW5lIFVTQkRVWEZBU1RTVUJfQ1BVQ1MgMHhFNjAwCisKKy8vIG1heCBsZW5naHRoIG9mIHRoZSB0cmFuc2Zlci1idWZmZXIgZm9yIHNvZnR3YXJlIHVwbG9hZAorI2RlZmluZSBUQl9MRU4gMHgyMDAwCisKKy8vIElucHV0IGVuZHBvaW50IG51bWJlcgorI2RlZmluZSBCVUxLSU5FUCAgICAgICAgICAgNgorCisvLyBFbmRwb2ludCBmb3IgdGhlIEEvRCBjaGFubmVsbGlzdDogYnVsayBPVVQKKyNkZWZpbmUgQ0hBTk5FTExJU1RFUCAgICAgNAorCisvLyBOdW1iZXIgb2YgY2hhbm5lbHMKKyNkZWZpbmUgTlVNQ0hBTk5FTFMgICAgICAgMzIKKworLy8gc2l6ZSBvZiB0aGUgd2F2ZWZvcm0gZGVzY3JpcHRvcgorI2RlZmluZSBXQVZFU0laRSAgICAgICAgICAweDIwCisKKy8vIFNpemUgb2Ygb25lIEEvRCB2YWx1ZQorI2RlZmluZSBTSVpFQURJTiAgICAgICAgICAoKHNpemVvZihpbnQxNl90KSkpCisKKy8vIFNpemUgb2YgdGhlIGlucHV0LWJ1ZmZlciBJTiBCWVRFUworI2RlZmluZSBTSVpFSU5CVUYgICAgICAgICA1MTIKKworLy8gMTYgYnl0ZXMuCisjZGVmaW5lIFNJWkVJTlNOQlVGICAgICAgIDUxMgorCisvLyBTaXplIG9mIHRoZSBidWZmZXIgZm9yIHRoZSBkdXggY29tbWFuZHMKKyNkZWZpbmUgU0laRU9GRFVYQlVGRkVSICAgIDI1NgkvLyBieXRlcworCisvLyBOdW1iZXIgb2YgaW4tVVJCcyB3aGljaCByZWNlaXZlIHRoZSBkYXRhOiBtaW49NQorI2RlZmluZSBOVU1PRklOQlVGRkVSU0hJR0ggICAgIDEwCisKKy8vIFRvdGFsIG51bWJlciBvZiB1c2JkdXhmYXN0IGRldmljZXMKKyNkZWZpbmUgTlVNVVNCRFVYRkFTVCAgICAgICAgICAgICAxNgorCisvLyBOdW1iZXIgb2Ygc3ViZGV2aWNlcworI2RlZmluZSBOX1NVQkRFVklDRVMgICAgICAgICAgMQorCisvLyBBbmFsb2d1ZSBpbiBzdWJkZXZpY2UKKyNkZWZpbmUgU1VCREVWX0FEICAgICAgICAgICAgIDAKKworLy8gbWluIGRlbGF5IHN0ZXBzIGZvciBtb3JlIHRoYW4gb25lIGNoYW5uZWwKKy8vIGJhc2ljYWxseSB3aGVuIHRoZSBtdXggZ2l2ZXMgdXAuIDstKQorI2RlZmluZSBNSU5fU0FNUExJTkdfUEVSSU9EIDkJLy8gc3RlcHMgYXQgMzBNSHogaW4gdGhlIEZYMgorCisvLyBNYXggbnVtYmVyIG9mIDEvMzBNSHogZGVsYXkgc3RlcHM6CisjZGVmaW5lIE1BWF9TQU1QTElOR19QRVJJT0QgNTAwCisKKy8vIE51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzIHRvIGlnbm9yZSBiZWZvcmUgd2Ugc3RhcnQgaGFuZGluZyBkYXRhIG92ZXIgdG8gY29tZWRpLgorLy8gSXQncyBxdWFkIGJ1ZmZlcmluZyBhbmQgd2UgaGF2ZSB0byBpZ25vcmUgNCBwYWNrZXRzLgorI2RlZmluZSBQQUNLRVRTX1RPX0lHTk9SRSA0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gY29tZWRpIGNvbnN0YW50cworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdXNiZHV4ZmFzdF9haV9yYW5nZSA9IHsgMiwgeworCQkJQklQX1JBTkdFKDAuNzUpLAorCQkJQklQX1JBTkdFKDAuNSksCisJfQorfTsKKworLyoKKyAqIHByaXZhdGUgc3RydWN0dXJlIG9mIG9uZSBzdWJkZXZpY2UKKyAqLworCisvLyBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggaG9sZHMgYWxsIHRoZSBkYXRhIG9mIHRoaXMgZHJpdmVyCisvLyBvbmUgc3ViIGRldmljZSBqdXN0IG5vdzogQS9ECit0eXBlZGVmIHN0cnVjdCB7CisJLy8gYXR0YWNoZWQ/CisJaW50IGF0dGFjaGVkOworCS8vIGlzIGl0IGFzc29jaWF0ZWQgd2l0aCBhIHN1YmRldmljZT8KKwlpbnQgcHJvYmVkOworCS8vIHBvaW50ZXIgdG8gdGhlIHVzYi1kZXZpY2UKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCS8vIEJVTEstdHJhbnNmZXIgaGFuZGxpbmc6IHVyYgorCXN0cnVjdCB1cmIgKnVyYkluOworCWludDhfdCAqdHJhbnNmZXJfYnVmZmVyOworCS8vIGlucHV0IGJ1ZmZlciBmb3Igc2luZ2xlIGluc24KKwlpbnQxNl90ICppbnNuQnVmZmVyOworCS8vIGludGVyZmFjZSBudW1iZXIKKwlpbnQgaWZudW07CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorCS8vIGludGVyZmFjZSBzdHJ1Y3R1cmUgaW4gMi42CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKyNlbmRpZgorCS8vIGNvbWVkaSBkZXZpY2UgZm9yIHRoZSBpbnRlcnJ1cHQgY29udGV4dAorCWNvbWVkaV9kZXZpY2UgKmNvbWVkaWRldjsKKwkvLyBhc3luY2hyb25vdXMgY29tbWFuZCBpcyBydW5uaW5nCisJc2hvcnQgaW50IGFpX2NtZF9ydW5uaW5nOworCS8vIGNvbnRpbm91cyBhcXVpc2l0aW9uCisJc2hvcnQgaW50IGFpX2NvbnRpbm91czsKKwkvLyBudW1iZXIgb2Ygc2FtcGxlcyB0byBhcXVpcmUKKwlsb25nIGludCBhaV9zYW1wbGVfY291bnQ7CisJLy8gY29tbWFuZHMKKwl1aW50OF90ICpkdXhfY29tbWFuZHM7CisJLy8gY291bnRlciB3aGljaCBpZ25vcmVzIHRoZSBmaXJzdCBidWZmZXJzCisJaW50IGlnbm9yZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKK30gdXNiZHV4ZmFzdHN1Yl90OworCisvLyBUaGUgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSB1c2ItZGF0YSBvZiB0aGUgZHJpdmVyCisvLyBpcyBhbHNvIHRoZSBwcml2YXRlIGRhdGEgZm9yIHRoZSBjb21lZGktZGV2aWNlLgorLy8gVGhpcyBoYXMgdG8gYmUgZ2xvYmFsIGFzIHRoZSB1c2Igc3Vic3lzdGVtIG5lZWRzCisvLyBnbG9iYWwgdmFyaWFibGVzLiBUaGUgb3RoZXIgcmVhc29uIGlzIHRoYXQgdGhpcworLy8gc3RydWN0dXJlIG11c3QgYmUgdGhlcmUgX2JlZm9yZV8gYW55IGNvbWVkaQorLy8gY29tbWFuZCBpcyBpc3N1ZWQuIFRoZSB1c2Igc3Vic3lzdGVtIG11c3QgYmUKKy8vIGluaXRpYWxpc2VkIGJlZm9yZSBjb21lZGkgY2FuIGFjY2VzcyBpdC4KK3N0YXRpYyB1c2JkdXhmYXN0c3ViX3QgdXNiZHV4ZmFzdHN1YltOVU1VU0JEVVhGQVNUXTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoc3RhcnRfc3RvcF9zZW0pOworCisvLyBidWxrIHRyYW5zZmVycyB0byB1c2JkdXhmYXN0CisKKyNkZWZpbmUgU0VOREFEQ09NTUFORFMgICAgICAgICAgICAwCisjZGVmaW5lIFNFTkRJTklURVA2ICAgICAgICAgICAgICAgMQorCitzdGF0aWMgaW50IHNlbmRfZHV4X2NvbW1hbmRzKHVzYmR1eGZhc3RzdWJfdCAqIHRoaXNfdXNiZHV4ZmFzdHN1YiwgaW50IGNtZF90eXBlKQoreworCWludCByZXN1bHQsIG5zZW50OworCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzWzBdID0gY21kX3R5cGU7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCWludCBpOworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGR1eF9jb21tYW5kczogIiwKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0laRU9GRFVYQlVGRkVSOyBpKyspIHsKKwkJcHJpbnRrKCIgJTAyeCIsIHRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJcmVzdWx0ID0gdXNiX2J1bGtfbXNnKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJCQkgICAgICBDSEFOTkVMTElTVEVQKSwKKwkJCSAgICAgIHRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzLCBTSVpFT0ZEVVhCVUZGRVIsCisJCQkgICAgICAmbnNlbnQsIDEwMDAwKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcmludGsoImNvbWVkaSVkOiBjb3VsZCBub3QgdHJhbnNtaXQgZHV4X2NvbW1hbmRzIHRvIHRoZSB1c2ItZGV2aWNlLCBlcnI9JWRcbiIsIHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgcmVzdWx0KTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLy8gU3RvcHMgdGhlIGRhdGEgYWNxdWlzaW9uCisvLyBJdCBzaG91bGQgYmUgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgY29udGV4dAorc3RhdGljIGludCB1c2JkdXhmYXN0c3ViX3VubGlua19JblVSQnModXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1Yl90bXApCit7CisJaW50IGogPSAwOworCWludCBlcnIgPSAwOworCisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wICYmIHVzYmR1eGZhc3RzdWJfdG1wLT51cmJJbikgeworCQl1c2JkdXhmYXN0c3ViX3RtcC0+YWlfY21kX3J1bm5pbmcgPSAwOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw4KQorCQlqID0gdXNiX3VubGlua191cmIodXNiZHV4ZmFzdHN1Yl90bXAtPnVyYkluKTsKKwkJaWYgKGogPCAwKSB7CisJCQllcnIgPSBqOworCQl9CisjZWxzZQorCQkvLyB3YWl0cyB1bnRpbCBhIHJ1bm5pbmcgdHJhbnNmZXIgaXMgb3ZlcgorCQl1c2Jfa2lsbF91cmIodXNiZHV4ZmFzdHN1Yl90bXAtPnVyYkluKTsKKwkJaiA9IDA7CisjZW5kaWYKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpOiB1c2JkdXhmYXN0OiB1bmxpbmtlZCBJblVSQjogcmVzPSVkXG4iLCBqKTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgd2lsbCBzdG9wIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24gKi8KKy8vIElzIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGlzIGRyaXZlciBmcm9tIGJvdGggdGhlCisvLyBpbnRlcnJ1cHQgY29udGV4dCBhbmQgZnJvbSBjb21lZGkKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9zdG9wKHVzYmR1eGZhc3RzdWJfdCAqIHRoaXNfdXNiZHV4ZmFzdHN1YiwKKwlpbnQgZG9fdW5saW5rKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWIpIHsKKwkJcHJpbnRrKCJjb21lZGk/OiB1c2JkdXhmYXN0X2FpX3N0b3A6IHRoaXNfdXNiZHV4ZmFzdHN1Yj1OVUxMIVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGk6IHVzYmR1eGZhc3RfYWlfc3RvcFxuIik7CisjZW5kaWYKKworCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJaWYgKGRvX3VubGluaykgeworCQkvLyBzdG9wIGFxdWlzdGlvbgorCQlyZXQgPSB1c2JkdXhmYXN0c3ViX3VubGlua19JblVSQnModGhpc191c2JkdXhmYXN0c3ViKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvLyBUaGlzIHdpbGwgY2FuY2VsIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24uCisvLyBUaGlzIGlzIGNhbGxlZCBieSBjb21lZGkgYnV0IG5ldmVyIGZyb20gaW5zaWRlIHRoZQorLy8gZHJpdmVyLgorc3RhdGljIGludCB1c2JkdXhmYXN0X2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwl1c2JkdXhmYXN0c3ViX3QgKnRoaXNfdXNiZHV4ZmFzdHN1YjsKKwlpbnQgcmVzID0gMDsKKworCS8vIGZvcmNlIHVubGluayBvZiBhbGwgdXJicworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaTogdXNiZHV4ZmFzdF9haV9jYW5jZWxcbiIpOworI2VuZGlmCisJdGhpc191c2JkdXhmYXN0c3ViID0gZGV2LT5wcml2YXRlOworCWlmICghdGhpc191c2JkdXhmYXN0c3ViKSB7CisJCXByaW50aygiY29tZWRpOiB1c2JkdXhmYXN0X2FpX2NhbmNlbDogdGhpc191c2JkdXhmYXN0c3ViPU5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZG93bigmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLy8gdW5saW5rCisJcmVzID0gdXNiZHV4ZmFzdF9haV9zdG9wKHRoaXNfdXNiZHV4ZmFzdHN1YiwgMSk7CisJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKworCXJldHVybiByZXM7Cit9CisKKy8vIGFuYWxvZ3VlIElOCisvLyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCitzdGF0aWMgdm9pZCB1c2JkdXhmYXN0c3ViX2FpX0lycShzdHJ1Y3QgdXJiICp1cmIpCisjZWxzZQorc3RhdGljIHZvaWQgdXNiZHV4ZmFzdHN1Yl9haV9JcnEoc3RydWN0IHVyYiAqdXJiIFBUX1JFR1NfQVJHKQorI2VuZGlmCit7CisJaW50IG4sIGVycjsKKwl1c2JkdXhmYXN0c3ViX3QgKnRoaXNfdXNiZHV4ZmFzdHN1YjsKKwljb21lZGlfZGV2aWNlICp0aGlzX2NvbWVkaWRldjsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCXVpbnQxNl90ICpwOworCisJLy8gc2FuaXR5IGNoZWNrcworCS8vIGlzIHRoZSB1cmIgdGhlcmU/CisJaWYgKCF1cmIpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0XzogYW8gaW50LWhhbmRsZXIgY2FsbGVkIHdpdGggdXJiPU5VTEwhXG4iKTsKKwkJcmV0dXJuOworCX0KKwkvLyB0aGUgY29udGV4dCB2YXJpYWJsZSBwb2ludHMgdG8gdGhlIHN1YmRldmljZQorCXRoaXNfY29tZWRpZGV2ID0gdXJiLT5jb250ZXh0OworCWlmICghdGhpc19jb21lZGlkZXYpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0XzogdXJiIGNvbnRleHQgaXMgYSBOVUxMIHBvaW50ZXIhXG4iKTsKKwkJcmV0dXJuOworCX0KKwkvLyB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgb2YgdGhlIHN1YmRldmljZSBpcyB1c2JkdXhmYXN0c3ViX3QKKwl0aGlzX3VzYmR1eGZhc3RzdWIgPSB0aGlzX2NvbWVkaWRldi0+cHJpdmF0ZTsKKwlpZiAoIXRoaXNfdXNiZHV4ZmFzdHN1YikgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3RfOiBwcml2YXRlIG9mIGNvbWVkaSBzdWJkZXYgaXMgYSBOVUxMIHBvaW50ZXIhXG4iKTsKKwkJcmV0dXJuOworCX0KKwkvLyBhcmUgd2UgcnVubmluZyBhIGNvbW1hbmQ/CisJaWYgKHVubGlrZWx5KCEodGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZykpKSB7CisJCS8vIG5vdCBydW5uaW5nIGEgY29tbWFuZAorCQkvLyBkbyBub3QgY29udGludWUgZXhlY3V0aW9uIGlmIG5vIGFzeW5jaHJvbm91cyBjb21tYW5kIGlzIHJ1bm5pbmcKKwkJLy8gaW4gcGFydGljdWxhciBub3QgcmVzdWJtaXQKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseSghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+YXR0YWNoZWQpKSkgeworCQkvLyBubyBjb21lZGkgZGV2aWNlIHRoZXJlCisJCXJldHVybjsKKwl9CisJLy8gc3ViZGV2aWNlIHdoaWNoIGlzIHRoZSBBRCBjb252ZXJ0ZXIKKwlzID0gdGhpc19jb21lZGlkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfQUQ7CisKKwkvLyBmaXJzdCB3ZSB0ZXN0IGlmIHNvbWV0aGluZyB1bnVzdWFsIGhhcyBqdXN0IGhhcHBlbmVkCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisKKwkJLy8gaGFwcGVucyBhZnRlciBhbiB1bmxpbmsgY29tbWFuZCBvciB3aGVuIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCBvdXQKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJY2FzZSAtRUNPTk5BQk9SVEVEOgorCQkvLyB0ZWxsIHRoaXMgY29tZWRpCisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldiwgcyk7CisJCS8vIHN0b3AgdGhlIHRyYW5zZmVyIHcvbyB1bmxpbmsKKwkJdXNiZHV4ZmFzdF9haV9zdG9wKHRoaXNfdXNiZHV4ZmFzdHN1YiwgMCk7CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IG5vbi16ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQgaW4gYWkgaW50ciBjb250ZXh0OiAlZFxuIiwgdGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yLCB1cmItPnN0YXR1cyk7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldiwgcyk7CisJCXVzYmR1eGZhc3RfYWlfc3RvcCh0aGlzX3VzYmR1eGZhc3RzdWIsIDApOworCQlyZXR1cm47CisJfQorCisJcCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWlmICghdGhpc191c2JkdXhmYXN0c3ViLT5pZ25vcmUpIHsKKwkJaWYgKCEodGhpc191c2JkdXhmYXN0c3ViLT5haV9jb250aW5vdXMpKSB7CisJCQkvLyBub3QgY29udGlub3VzLCBmaXhlZCBudW1iZXIgb2Ygc2FtcGxlcworCQkJbiA9IHVyYi0+YWN0dWFsX2xlbmd0aCAvIHNpemVvZih1aW50MTZfdCk7CisJCQlpZiAodW5saWtlbHkodGhpc191c2JkdXhmYXN0c3ViLT5haV9zYW1wbGVfY291bnQgPCBuKSkgeworCQkJCS8vIHdlIGhhdmUgc2VuZCBvbmx5IGEgZnJhY3Rpb24gb2YgdGhlIGJ5dGVzIHJlY2VpdmVkCisJCQkJY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLAorCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9zYW1wbGVfY291bnQgKgorCQkJCQlzaXplb2YodWludDE2X3QpKTsKKwkJCQl1c2JkdXhmYXN0X2FpX3N0b3AodGhpc191c2JkdXhmYXN0c3ViLCAwKTsKKwkJCQkvLyBzYXkgY29tZWRpIHRoYXQgdGhlIGFjcXVpc3Rpb24gaXMgb3ZlcgorCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYsIHMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfc2FtcGxlX2NvdW50IC09IG47CisJCX0KKwkJLy8gd3JpdGUgdGhlIGZ1bGwgYnVmZmVyIHRvIGNvbWVkaQorCQljZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsCisJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworCQkvLyB0ZWxsIGNvbWVkaSB0aGF0IGRhdGEgaXMgdGhlcmUKKwkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LCBzKTsKKworCX0gZWxzZSB7CisJCS8vIGlnbm9yZSB0aGlzIHBhY2tldAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmlnbm9yZS0tOworCX0KKworCS8vIGNvbW1hbmQgaXMgc3RpbGwgcnVubmluZworCS8vIHJlc3VibWl0IHVyYiBmb3IgQlVMSyB0cmFuc2ZlcgorCXVyYi0+ZGV2ID0gdGhpc191c2JkdXhmYXN0c3ViLT51c2JkZXY7CisJdXJiLT5zdGF0dXMgPSAwOworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogdXJiIHJlc3VibSBmYWlsZWQ6ICVkIiwKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgZXJyKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJdXNiZHV4ZmFzdF9haV9zdG9wKHRoaXNfdXNiZHV4ZmFzdHN1YiwgMCk7CisJfQorfQorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RzdWJfc3RhcnQodXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1YikKK3sKKwlpbnQgZXJyY29kZSA9IDA7CisJdW5zaWduZWQgY2hhciBsb2NhbF90cmFuc2Zlcl9idWZmZXJbMTZdOworCisJaWYgKHVzYmR1eGZhc3RzdWItPnByb2JlZCkgeworCQkvLyA3ZjkyIHRvIHplcm8KKwkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzBdID0gMDsKKwkJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkvLyBjcmVhdGUgYSBwaXBlIGZvciBhIGNvbnRyb2wgdHJhbnNmZXIKKwkJCXVzYl9zbmRjdHJscGlwZSh1c2JkdXhmYXN0c3ViLT51c2JkZXYsIDApLAorCQkJLy8gYlJlcXVlc3QsICJGaXJtd2FyZSIKKwkJCVVTQkRVWEZBU1RTVUJfRklSTVdBUkUsCisJCQkvLyBibVJlcXVlc3RUeXBlCisJCQlWRU5ET1JfRElSX09VVCwKKwkJCS8vIFZhbHVlCisJCQlVU0JEVVhGQVNUU1VCX0NQVUNTLAorCQkJLy8gSW5kZXgKKwkJCTB4MDAwMCwKKwkJCS8vIGFkZHJlc3Mgb2YgdGhlIHRyYW5zZmVyIGJ1ZmZlcgorCQkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCQkJLy8gTGVuZ3RoCisJCQkxLAorCQkJLy8gVGltZW91dAorCQkJRVpUSU1FT1VUKTsKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3RfOiBjb250cm9sIG1zZyBmYWlsZWQgKHN0YXJ0KVxuIik7CisJCQlyZXR1cm4gZXJyY29kZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhmYXN0c3ViX3N0b3AodXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1YikKK3sKKwlpbnQgZXJyY29kZSA9IDA7CisKKwl1bnNpZ25lZCBjaGFyIGxvY2FsX3RyYW5zZmVyX2J1ZmZlclsxNl07CisJaWYgKHVzYmR1eGZhc3RzdWItPnByb2JlZCkgeworCQkvLyA3ZjkyIHRvIG9uZQorCQlsb2NhbF90cmFuc2Zlcl9idWZmZXJbMF0gPSAxOworCQllcnJjb2RlID0gdXNiX2NvbnRyb2xfbXNnKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1c2JkdXhmYXN0c3ViLT51c2JkZXYsIDApLAorCQkJLy8gYlJlcXVlc3QsICJGaXJtd2FyZSIKKwkJCVVTQkRVWEZBU1RTVUJfRklSTVdBUkUsCisJCQkvLyBibVJlcXVlc3RUeXBlCisJCQlWRU5ET1JfRElSX09VVCwKKwkJCS8vIFZhbHVlCisJCQlVU0JEVVhGQVNUU1VCX0NQVUNTLAorCQkJLy8gSW5kZXgKKwkJCTB4MDAwMCwgbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCQkJLy8gTGVuZ3RoCisJCQkxLAorCQkJLy8gVGltZW91dAorCQkJRVpUSU1FT1VUKTsKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RvcClcbiIpOworCQkJcmV0dXJuIGVycmNvZGU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdHN1Yl91cGxvYWQodXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1YiwKKwl1bnNpZ25lZCBjaGFyICpsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJdW5zaWduZWQgaW50IHN0YXJ0QWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgZXJyY29kZTsKKworCWlmICh1c2JkdXhmYXN0c3ViLT5wcm9iZWQpIHsKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IHVwbG9hZGluZyAlZCBieXRlcyIsCisJCQl1c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yLCBsZW4pOworCQlwcmludGsoIiB0byBhZGRyICVkLCBmaXJzdCBieXRlPSVkLlxuIiwKKwkJCXN0YXJ0QWRkciwgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzBdKTsKKyNlbmRpZgorCQllcnJjb2RlID0gdXNiX2NvbnRyb2xfbXNnKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1c2JkdXhmYXN0c3ViLT51c2JkZXYsIDApLAorCQkJLy8gYnJlcXVlc3QsIGZpcm13YXJlCisJCQlVU0JEVVhGQVNUU1VCX0ZJUk1XQVJFLAorCQkJLy8gYm1SZXF1ZXN0VHlwZQorCQkJVkVORE9SX0RJUl9PVVQsCisJCQkvLyB2YWx1ZQorCQkJc3RhcnRBZGRyLAorCQkJLy8gaW5kZXgKKwkJCTB4MDAwMCwKKwkJCS8vIG91ciBsb2NhbCBzYWZlIGJ1ZmZlcgorCQkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCQkJLy8gbGVuZ3RoCisJCQlsZW4sCisJCQkvLyB0aW1lb3V0CisJCQlFWlRJTUVPVVQpOworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiByZXN1bHQ9JWRcbiIsIGVycmNvZGUpOworI2VuZGlmCisJCWlmIChlcnJjb2RlIDwgMCkgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiB1cHBsb2FkIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gZXJyY29kZTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIG5vIGRldmljZSBvbiB0aGUgYnVzIGZvciB0aGlzIGluZGV4CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGZpcm13YXJlVXBsb2FkKHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWIsCisJdW5zaWduZWQgY2hhciAqZmlybXdhcmVCaW5hcnksIGludCBzaXplRmlybXdhcmUpCit7CisJaW50IHJldDsKKworCWlmICghZmlybXdhcmVCaW5hcnkpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldCA9IHVzYmR1eGZhc3RzdWJfc3RvcCh1c2JkdXhmYXN0c3ViKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGNhbiBub3Qgc3RvcCBmaXJtd2FyZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHVzYmR1eGZhc3RzdWJfdXBsb2FkKHVzYmR1eGZhc3RzdWIsCisJCWZpcm13YXJlQmluYXJ5LCAwLCBzaXplRmlybXdhcmUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogZmlybXdhcmUgdXBsb2FkIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHVzYmR1eGZhc3RzdWJfc3RhcnQodXNiZHV4ZmFzdHN1Yik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBjYW4gbm90IHN0YXJ0IGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkdXhmYXN0c3ViX3N1Ym1pdF9JblVSQnModXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1YikKK3sKKwlpbnQgZXJyRmxhZzsKKworCWlmICghdXNiZHV4ZmFzdHN1YikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJdXNiX2ZpbGxfYnVsa191cmIodXNiZHV4ZmFzdHN1Yi0+dXJiSW4sCisJCXVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJdXNiX3JjdmJ1bGtwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwgQlVMS0lORVApLAorCQl1c2JkdXhmYXN0c3ViLT50cmFuc2Zlcl9idWZmZXIsCisJCVNJWkVJTkJVRiwgdXNiZHV4ZmFzdHN1Yl9haV9JcnEsIHVzYmR1eGZhc3RzdWItPmNvbWVkaWRldik7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogc3VibWl0dGluZyBpbi11cmI6ICV4LCV4XG4iLAorCQl1c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yLAorCQkoaW50KSh1c2JkdXhmYXN0c3ViLT51cmJJbi0+Y29udGV4dCksCisJCShpbnQpKHVzYmR1eGZhc3RzdWItPnVyYkluLT5kZXYpKTsKKyNlbmRpZgorCWVyckZsYWcgPSB1c2Jfc3VibWl0X3VyYih1c2JkdXhmYXN0c3ViLT51cmJJbiwgR0ZQX0FUT01JQyk7CisJaWYgKGVyckZsYWcpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBhaTogdXNiX3N1Ym1pdF91cmIgZXJyb3IgJWRcbiIsCisJCQllcnJGbGFnKTsKKwkJcmV0dXJuIGVyckZsYWc7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKQoreworCWludCBlcnIgPSAwLCBzdG9wX21hc2sgPSAwOworCWxvbmcgaW50IHN0ZXBzLCB0bXAgPSAwOworCWludCBtaW5TYW1wbFBlcjsKKwl1c2JkdXhmYXN0c3ViX3QgKnRoaXNfdXNiZHV4ZmFzdHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPnByb2JlZCkpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0X2FpX2NtZHRlc3RcbiIsIGRldi0+bWlub3IpOworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGNvbnZlcnRfYXJnPSV1IHNjYW5fYmVnaW5fYXJnPSV1XG4iLAorCQlkZXYtPm1pbm9yLCBjbWQtPmNvbnZlcnRfYXJnLCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKyNlbmRpZgorCS8qIHN0ZXAgMTogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCisKKwl0bXAgPSBjbWQtPnN0YXJ0X3NyYzsKKwljbWQtPnN0YXJ0X3NyYyAmPSBUUklHX05PVyB8IFRSSUdfRVhUIHwgVFJJR19JTlQ7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0ZPTExPVyB8IFRSSUdfRVhUOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRVhUOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJc3RvcF9tYXNrID0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwljbWQtPnN0b3Bfc3JjICY9IHN0b3BfbWFzazsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLworCisJaWYgKGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfTk9XICYmCisJCWNtZC0+c3RhcnRfc3JjICE9IFRSSUdfRVhUICYmIGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfSU5UKQorCQllcnIrKzsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkKKwkJZXJyKys7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19USU1FUiAmJiBjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfRVhUKQorCQllcnIrKzsKKwlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX0NPVU5UICYmCisJCWNtZC0+c3RvcF9zcmMgIT0gVFJJR19FWFQgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX05PTkUpCisJCWVycisrOworCisJLy8gY2FuJ3QgaGF2ZSBleHRlcm5hbCBzdG9wIGFuZCBzdGFydCB0cmlnZ2VycyBhdCBvbmNlCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmIGNtZC0+c3RvcF9zcmMgPT0gVFJJR19FWFQpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDI7CisKKwkvKiBzdGVwIDM6IG1ha2Ugc3VyZSBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cgJiYgY21kLT5zdGFydF9hcmcgIT0gMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmICghY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPT0gMSkgeworCQltaW5TYW1wbFBlciA9IDE7CisJfSBlbHNlIHsKKwkJbWluU2FtcGxQZXIgPSBNSU5fU0FNUExJTkdfUEVSSU9EOworCX0KKworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJc3RlcHMgPSBjbWQtPmNvbnZlcnRfYXJnICogMzA7CisJCWlmIChzdGVwcyA8IChtaW5TYW1wbFBlciAqIDEwMDApKSB7CisJCQlzdGVwcyA9IG1pblNhbXBsUGVyICogMTAwMDsKKwkJfQorCQlpZiAoc3RlcHMgPiAoTUFYX1NBTVBMSU5HX1BFUklPRCAqIDEwMDApKSB7CisJCQlzdGVwcyA9IE1BWF9TQU1QTElOR19QRVJJT0QgKiAxMDAwOworCQl9CisJCS8vIGNhbGMgYXJnIGFnYWluCisJCXRtcCA9IHN0ZXBzIC8gMzA7CisJCWlmIChjbWQtPmNvbnZlcnRfYXJnICE9IHRtcCkgeworCQkJY21kLT5jb252ZXJ0X2FyZyA9IHRtcDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIrKzsKKwl9CisJLy8gc3RvcCBzb3VyY2UKKwlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKKwljYXNlIFRSSUdfQ09VTlQ6CisJCWlmICghY21kLT5zdG9wX2FyZykgeworCQkJY21kLT5zdG9wX2FyZyA9IDE7CisJCQllcnIrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSSUdfTk9ORToKKwkJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQkJY21kLT5zdG9wX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCQlicmVhazsKKwkJLy8gVFJJR19FWFQgZG9lc24ndCBjYXJlIHNpbmNlIGl0IGRvZXNuJ3QgdHJpZ2dlciBvZmYgYSBudW1iZXJlZCBjaGFubmVsCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfYWlfaW50dHJpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCB1bnNpZ25lZCBpbnQgdHJpZ251bSkKK3sKKwlpbnQgcmV0OworCXVzYmR1eGZhc3RzdWJfdCAqdGhpc191c2JkdXhmYXN0c3ViID0gZGV2LT5wcml2YXRlOworCWlmICghdGhpc191c2JkdXhmYXN0c3ViKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkb3duKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhmYXN0c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdF9haV9pbnR0cmlnXG4iLCBkZXYtPm1pbm9yKTsKKyNlbmRpZgorCisJaWYgKHRyaWdudW0gIT0gMCkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0X2FpX2ludHRyaWc6IGludmFsaWQgdHJpZ251bVxuIiwKKwkJCWRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCEodGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZykpIHsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eGZhc3RzdWJfc3VibWl0X0luVVJCcyh0aGlzX3VzYmR1eGZhc3RzdWIpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdF9haV9pbnR0cmlnOiB1cmJTdWJtaXQ6IGVycj0lZFxuIiwgZGV2LT5taW5vciwgcmV0KTsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAwOworCQkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFpX2ludHRyaWcgYnV0IGFjcXUgaXMgYWxyZWFkeSBydW5uaW5nXG4iLAorCQkJZGV2LT5taW5vcik7CisJfQorCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJcmV0dXJuIDE7Cit9CisKKy8vIG9mZnNldHMgZm9yIHRoZSBHUElGIGJ5dGVzCisvLyB0aGUgZmlyc3QgYnl0ZSBpcyB0aGUgY29tbWFuZCBieXRlCisjZGVmaW5lIExFTkJBU0UgMSsweDAwCisjZGVmaW5lIE9QQkFTRSAgMSsweDA4CisjZGVmaW5lIE9VVEJBU0UgMSsweDEwCisjZGVmaW5lIExPR0JBU0UgMSsweDE4CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJdW5zaWduZWQgaW50IGNoYW4sIGdhaW4sIHJuZ21hc2sgPSAweGZmOworCWludCBpLCBqLCByZXQ7CisJdXNiZHV4ZmFzdHN1Yl90ICp0aGlzX3VzYmR1eGZhc3RzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IHJlc3VsdDsKKwlsb25nIHN0ZXBzLCBzdGVwc190bXA7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdF9haV9jbWRcbiIsIGRldi0+bWlub3IpOworI2VuZGlmCisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRvd24oJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFpX2NtZCBub3QgcG9zc2libGUuIEFub3RoZXIgYWlfY21kIGlzIHJ1bm5pbmcuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLy8gc2V0IGN1cnJlbnQgY2hhbm5lbCBvZiB0aGUgcnVubmluZyBhcXVpc2l0aW9uIHRvIHplcm8KKwlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCisJLy8gaWdub3JlIHRoZSBmaXJzdCBidWZmZXJzIGZyb20gdGhlIGRldmljZSBpZiB0aGVyZSBpcyBhbiBlcnJvciBjb25kaXRpb24KKwl0aGlzX3VzYmR1eGZhc3RzdWItPmlnbm9yZSA9IFBBQ0tFVFNfVE9fSUdOT1JFOworCisJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMCkgeworCQlnYWluID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSk7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgKytpKSB7CisJCQljaGFuID0gQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKTsKKwkJCWlmIChjaGFuICE9IGkpIHsKKwkJCQlwcmludGsoImNvbWVkaSVkOiBjbWQgaXMgYWNjZXB0aW5nIG9ubHkgY29uc2VjdXRpdmUgY2hhbm5lbHMuXG4iLCBkZXYtPm1pbm9yKTsKKwkJCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKChnYWluICE9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pKQorCQkJCSYmIChjbWQtPmNoYW5saXN0X2xlbiA+IDMpKSB7CisJCQkJcHJpbnRrKCJjb21lZGklZDogdGhlIGdhaW4gbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsIGNoYW5uZWxzLlxuIiwgZGV2LT5taW5vcik7CisJCQkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChpID49IE5VTUNIQU5ORUxTKSB7CisJCQkJcHJpbnRrKCJjb21lZGklZDogY2hhbm5lbCBsaXN0IHRvbyBsb25nXG4iLAorCQkJCQlkZXYtPm1pbm9yKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlzdGVwcyA9IDA7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBzY2FuX2JlZ2luX3NyYz09VFJJR19USU1FUiBub3QgdmFsaWQuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJc3RlcHMgPSAoY21kLT5jb252ZXJ0X2FyZyAqIDMwKSAvIDEwMDA7CisJfQorCWlmICgoc3RlcHMgPCBNSU5fU0FNUExJTkdfUEVSSU9EKSAmJiAoY21kLT5jaGFubGlzdF9sZW4gIT0gMSkpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogYWlfY21kOiBzdGVwcz0lbGQsIHNjYW5fYmVnaW5fYXJnPSVkLiBOb3QgcHJvcGVybHkgdGVzdGVkIGJ5IGNtZHRlc3Q/XG4iLCBkZXYtPm1pbm9yLCBzdGVwcywgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoc3RlcHMgPiBNQVhfU0FNUExJTkdfUEVSSU9EKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGFpX2NtZDogc2FtcGxpbmcgcmF0ZSB0b28gbG93LlxuIiwKKwkJCWRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgJiYgKGNtZC0+Y2hhbmxpc3RfbGVuICE9IDEpCisJCSYmIChjbWQtPmNoYW5saXN0X2xlbiAhPSAxNikpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogYWlfY21kOiBUUklHX0VYVCBvbmx5IHdpdGggMSBvciAxNiBjaGFubmVscyBwb3NzaWJsZS5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IHN0ZXBzPSVsZCwgY29udmVydF9hcmc9JXUsIGFpX3RpbWVyPSV1XG4iLAorCQlkZXYtPm1pbm9yLAorCQlzdGVwcywgY21kLT5jb252ZXJ0X2FyZywgdGhpc191c2JkdXhmYXN0c3ViLT5haV90aW1lcik7CisjZW5kaWYKKworCXN3aXRjaCAoY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJLy8gb25lIGNoYW5uZWwKKwljYXNlIDE6CisJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKSA+IDApCisJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCWVsc2UKKwkJCXJuZ21hc2sgPSAweGZmOworCisJCS8vIGZvciBleHRlcm5hbCB0cmlnZ2VyOiBsb29waW5nIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIFJEWTAgcGluCisJCS8vIGJlY29tZXMgemVybworCQlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpIHsJLy8gd2UgbG9vcCBoZXJlIHVudGlsIHJlYWR5IGhhcyBiZWVuIHNldAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDBdID0gMHgwMTsJLy8gYnJhbmNoIGJhY2sgdG8gc3RhdGUgMAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMF0gPSAweDAxOwkvLyBkZWNlaXNpb24gc3RhdGUgdy9vIGRhdGEKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAwXSA9CisJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAweDAwOwkvLyBSRFkwID0gMAorCQl9IGVsc2UgewkvLyB3ZSBqdXN0IHByb2NlZWQgdG8gc3RhdGUgMQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDBdID0gMTsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDBdID0gMDsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAwXSA9CisJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAwOworCQl9CisKKwkJaWYgKHN0ZXBzIDwgTUlOX1NBTVBMSU5HX1BFUklPRCkgeworCQkJLy8gZm9yIGZhc3Qgc2luZ2xlIGNoYW5uZWwgYXF1IHdpdGhvdXQgbXV4CisJCQlpZiAoc3RlcHMgPD0gMSkgeworCQkJCS8vIHdlIGp1c3Qgc3RheSBoZXJlIGF0IHN0YXRlIDEgYW5kIHJleGVjdXRlIHRoZSBzYW1lIHN0YXRlCisJCQkJLy8gdGhpcyBnaXZlcyB1cyAzME1IeiBzYW1wbGluZyByYXRlCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDFdID0gMHg4OTsJLy8gYnJhbmNoIGJhY2sgdG8gc3RhdGUgMQorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDFdID0gMHgwMzsJLy8gZGVjZWlzaW9uIHN0YXRlIHdpdGggZGF0YQorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAxXSA9CisJCQkJCTB4RkYgJiBybmdtYXNrOworCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDB4RkY7CS8vIGRvZXNuJ3QgbWF0dGVyCisJCQl9IGVsc2UgeworCQkJCS8vIHdlIGxvb3AgdGhyb3VnaCB0d28gc3RhdGVzOiBkYXRhIGFuZCBkZWxheTogbWF4IHJhdGUgaXMgMTVNaHoKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPQorCQkJCQlzdGVwcyAtIDE7CisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMV0gPSAweDAyOwkvLyBkYXRhCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0KKwkJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDFdID0gMDsJLy8gZG9lc24ndCBtYXR0ZXIKKworCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAyXSA9IDB4MDk7CS8vIGJyYW5jaCBiYWNrIHRvIHN0YXRlIDEKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAyXSA9IDB4MDE7CS8vIGRlY2Vpc2lvbiBzdGF0ZSB3L28gZGF0YQorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAyXSA9CisJCQkJCTB4RkYgJiBybmdtYXNrOworCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAyXSA9IDB4RkY7CS8vIGRvZXNuJ3QgbWF0dGVyCisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyB3ZSBsb29wIHRocm91Z2ggMyBzdGF0ZXM6IDJ4IGRlbGF5IGFuZCAxeCBkYXRhLiBUaGlzIGdpdmVzIGEgbWluCisJCQkvLyBzYW1wbGluZyByYXRlIG9mIDYwa0h6LgorCisJCQkvLyB3ZSBoYXZlIDEgc3RhdGUgd2l0aCBkdXJhdGlvbiAxCisJCQlzdGVwcyA9IHN0ZXBzIC0gMTsKKworCQkJLy8gZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPQorCQkJCXN0ZXBzIC8gMjsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDFdID0gMDsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAxXSA9CisJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMV0gPSAwOworCisJCQkvLyBhbmQgdGhlIHNlY29uZCBwYXJ0CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMl0gPQorCQkJCXN0ZXBzIC0gc3RlcHMgLyAyOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMl0gPSAwOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDJdID0KKwkJCQkweEZGICYgcm5nbWFzazsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAyXSA9IDA7CisKKwkJCS8vIGdldCB0aGUgZGF0YSBhbmQgYnJhbmNoIGJhY2sKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAzXSA9IDB4MDk7CS8vIGJyYW5jaCBiYWNrIHRvIHN0YXRlIDEKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDNdID0gMHgwMzsJLy8gZGVjZWlzaW9uIHN0YXRlIHcgZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDNdID0KKwkJCQkweEZGICYgcm5nbWFzazsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAzXSA9IDB4RkY7CS8vIGRvZXNuJ3QgbWF0dGVyCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCS8vIHR3byBjaGFubmVscworCQkvLyBjb21taXQgZGF0YSB0byB0aGUgRklGTworCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSkgPiAwKQorCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQllbHNlCisJCQlybmdtYXNrID0gMHhmZjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDBdID0gMTsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMF0gPSAweDAyOwkvLyBkYXRhCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAwXSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAwOworCisJCS8vIHdlIGhhdmUgMSBzdGF0ZSB3aXRoIGR1cmF0aW9uIDE6IHN0YXRlIDAKKwkJc3RlcHNfdG1wID0gc3RlcHMgLSAxOworCisJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0WzFdKSA+IDApCisJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCWVsc2UKKwkJCXJuZ21hc2sgPSAweGZmOworCQkvLyBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDFdID0gc3RlcHNfdG1wIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMV0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMV0gPSAweEZFICYgcm5nbWFzazsJLy9jb3VudAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMV0gPSAwOworCisJCS8vIGFuZCB0aGUgc2Vjb25kIHBhcnQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDJdID0KKwkJCXN0ZXBzX3RtcCAtIHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDJdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDJdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAyXSA9IDA7CisKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDNdID0gMTsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgM10gPSAweDAyOwkvLyBkYXRhCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAzXSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgM10gPSAwOworCisJCS8vIHdlIGhhdmUgMiBzdGF0ZXMgd2l0aCBkdXJhdGlvbiAxOiBzdGVwIDYgYW5kIHRoZSBJRExFIHN0YXRlCisJCXN0ZXBzX3RtcCA9IHN0ZXBzIC0gMjsKKworCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSkgPiAwKQorCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQllbHNlCisJCQlybmdtYXNrID0gMHhmZjsKKwkJLy8gZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA0XSA9IHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDRdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDRdID0gKDB4RkYgLSAweDAyKSAmIHJuZ21hc2s7CS8vcmVzZXQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDRdID0gMDsKKworCQkvLyBhbmQgdGhlIHNlY29uZCBwYXJ0CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA1XSA9CisJCQlzdGVwc190bXAgLSBzdGVwc190bXAgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA1XSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA1XSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNV0gPSAwOworCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA2XSA9IDE7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDZdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDZdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA2XSA9IDA7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQkvLyB0aHJlZSBjaGFubmVscworCQlmb3IgKGogPSAwOyBqIDwgMTsgaisrKSB7CisJCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtqXSkgPiAwKQorCQkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJCWVsc2UKKwkJCQlybmdtYXNrID0gMHhmZjsKKwkJCS8vIGNvbW1pdCBkYXRhIHRvIHRoZSBGSUZPIGFuZCBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyBqICogMl0gPQorCQkJCXN0ZXBzIC8gMjsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIGogKiAyXSA9IDB4MDI7CS8vIGRhdGEKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyBqICogMl0gPSAweEZGICYgcm5nbWFzazsJLy8gbm8gY2hhbmdlCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgaiAqIDJdID0gMDsKKworCQkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaiArIDFdKSA+IDApCisJCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQkJZWxzZQorCQkJCXJuZ21hc2sgPSAweGZmOworCQkJLy8gZG8gdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBkZWxheQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIGogKiAyICsgMV0gPQorCQkJCXN0ZXBzIC0gc3RlcHMgLyAyOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgaiAqIDIgKyAxXSA9IDA7CS8vIG5vIGRhdGEKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyBqICogMiArIDFdID0gMHhGRSAmIHJuZ21hc2s7CS8vY291bnQKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyBqICogMiArIDFdID0KKwkJCQkwOworCQl9CisKKwkJLy8gMiBzdGVwcyB3aXRoIGR1cmF0aW9uIDE6IHRoZSBpZGVsZSBzdGVwIGFuZCBzdGVwIDY6CisJCXN0ZXBzX3RtcCA9IHN0ZXBzIC0gMjsKKwkJLy8gY29tbWl0IGRhdGEgdG8gdGhlIEZJRk8gYW5kIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNF0gPSBzdGVwc190bXAgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA0XSA9IDB4MDI7CS8vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDRdID0gMHhGRiAmIHJuZ21hc2s7CS8vIG5vIGNoYW5nZQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNF0gPSAwOworCisJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKSA+IDApCisJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCWVsc2UKKwkJCXJuZ21hc2sgPSAweGZmOworCQkvLyBkbyB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGRlbGF5CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA1XSA9CisJCQlzdGVwc190bXAgLSBzdGVwc190bXAgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA1XSA9IDA7CS8vIG5vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDVdID0gKDB4RkYgLSAweDAyKSAmIHJuZ21hc2s7CS8vIHJlc2V0CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA1XSA9IDA7CisKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDZdID0gMTsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNl0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNl0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDZdID0gMDsKKworCWNhc2UgMTY6CisJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKSA+IDApCisJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCWVsc2UKKwkJCXJuZ21hc2sgPSAweGZmOworCQlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpIHsJLy8gd2UgbG9vcCBoZXJlIHVudGlsIHJlYWR5IGhhcyBiZWVuIHNldAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDBdID0gMHgwMTsJLy8gYnJhbmNoIGJhY2sgdG8gc3RhdGUgMAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMF0gPSAweDAxOwkvLyBkZWNlaXNpb24gc3RhdGUgdy9vIGRhdGEKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAwXSA9ICgweEZGIC0gMHgwMikgJiBybmdtYXNrOwkvLyByZXNldAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDBdID0gMHgwMDsJLy8gUkRZMCA9IDAKKwkJfSBlbHNlIHsJLy8gd2UganVzdCBwcm9jZWVkIHRvIHN0YXRlIDEKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAwXSA9IDI1NTsJLy8gMzB1cyByZXNldCBwdWxzZQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMF0gPSAwOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0gKDB4RkYgLSAweDAyKSAmIHJuZ21hc2s7CS8vIHJlc2V0CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAwOworCQl9CisKKwkJLy8gY29tbWl0IGRhdGEgdG8gdGhlIEZJRk8KKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDFdID0gMTsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMV0gPSAweDAyOwkvLyBkYXRhCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAxXSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMV0gPSAwOworCisJCS8vIHdlIGhhdmUgMiBzdGF0ZXMgd2l0aCBkdXJhdGlvbiAxCisJCXN0ZXBzID0gc3RlcHMgLSAyOworCisJCS8vIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMl0gPSBzdGVwcyAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDJdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDJdID0gMHhGRSAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAyXSA9IDA7CisKKwkJLy8gYW5kIHRoZSBzZWNvbmQgcGFydAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgM10gPQorCQkJc3RlcHMgLSBzdGVwcyAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDNdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDNdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAzXSA9IDA7CisKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDRdID0gMHgwOTsJLy8gYnJhbmNoIGJhY2sgdG8gc3RhdGUgMQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA0XSA9IDB4MDE7CS8vIGRlY2Vpc2lvbiBzdGF0ZSB3L28gZGF0YQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNF0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDRdID0gMHhGRjsJLy8gZG9lc24ndCBtYXR0ZXIKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiY29tZWRpICVkOiB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBjaGFubmVsc1xuIiwKKwkJCWRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGkgJWQ6IHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlIHVzYiBkZXZpY2VcbiIsIGRldi0+bWlub3IpOworI2VuZGlmCisJLy8gMCBtZWFucyB0aGF0IHRoZSBBRCBjb21tYW5kcyBhcmUgc2VudAorCXJlc3VsdCA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4ZmFzdHN1YiwgU0VOREFEQ09NTUFORFMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFkYyBjb21tYW5kIGNvdWxkIG5vdCBiZSBzdWJtaXR0ZWQuIEFib3J0aW5nLi4uXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3NhbXBsZV9jb3VudCA9CisJCQkoY21kLT5zdG9wX2FyZykgKiAoY21kLT5zY2FuX2VuZF9hcmcpOworCQlpZiAodXNiZHV4ZmFzdHN1Yi0+YWlfc2FtcGxlX2NvdW50IDwgMSkgeworCQkJcHJpbnRrKCJjb21lZGklZDogKGNtZC0+c3RvcF9hcmcpKihjbWQtPnNjYW5fZW5kX2FyZyk8MSwgYWJvcnRpbmcuXG4iLCBkZXYtPm1pbm9yKTsKKwkJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NvbnRpbm91cyA9IDA7CisJfSBlbHNlIHsKKwkJLy8gY29udGlub3VzIGFxdWlzaXRpb24KKwkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jb250aW5vdXMgPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3NhbXBsZV9jb3VudCA9IDA7CisJfQorCisJaWYgKChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykgfHwgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSkgeworCQkvLyBlbmFibGUgdGhpcyBhY3F1aXNpdGlvbiBvcGVyYXRpb24KKwkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eGZhc3RzdWJfc3VibWl0X0luVVJCcyh0aGlzX3VzYmR1eGZhc3RzdWIpOworCQlpZiAocmV0IDwgMCkgeworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQkvLyBmaXhtZTogdW5saW5rIGhlcmU/PworCQkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIFRSSUdfSU5UICovCisJCS8vIGRvbid0IGVuYWJsZSB0aGUgYWNxdWlzaW9uIG9wZXJhdGlvbgorCQkvLyB3YWl0IGZvciBhbiBpbnRlcm5hbCBzaWduYWwKKwkJcy0+YXN5bmMtPmludHRyaWcgPSB1c2JkdXhmYXN0X2FpX2ludHRyaWc7CisJfQorCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTW9kZSAwIGlzIHVzZWQgdG8gZ2V0IGEgc2luZ2xlIGNvbnZlcnNpb24gb24gZGVtYW5kICovCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBpLCBqLCBuLCBhY3R1YWxfbGVuZ3RoOworCWludCBjaGFuLCByYW5nZSwgcm5nbWFzazsKKwlpbnQgZXJyOworCXVzYmR1eGZhc3RzdWJfdCAqdXNiZHV4ZmFzdHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdXNiZHV4ZmFzdHN1YikgeworCQlwcmludGsoImNvbWVkaSVkOiBhaV9pbnNuX3JlYWQ6IG5vIHVzYiBkZXYuXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiBhaV9pbnNuX3JlYWQsIGluc24tPm49JWQsIGluc24tPnN1YmRldj0lZFxuIiwKKwkJZGV2LT5taW5vciwgaW5zbi0+biwgaW5zbi0+c3ViZGV2KTsKKyNlbmRpZgorCWRvd24oJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJaWYgKCEodXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh1c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZykgeworCQlwcmludGsoImNvbWVkaSVkOiBhaV9pbnNuX3JlYWQgbm90IHBvc3NpYmxlLiBBc3luYyBDb21tYW5kIGlzIHJ1bm5pbmcuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8vIHNhbXBsZSBvbmUgY2hhbm5lbAorCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlyYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwkvLyBzZXQgY29tbWFuZCBmb3IgdGhlIGZpcnN0IGNoYW5uZWwKKworCWlmIChyYW5nZSA+IDApCisJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwllbHNlCisJCXJuZ21hc2sgPSAweGZmOworCS8vIGNvbW1pdCBkYXRhIHRvIHRoZSBGSUZPCisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAwXSA9IDE7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDBdID0gMHgwMjsJLy8gZGF0YQorCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMF0gPSAweEZGICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDBdID0gMDsKKworCS8vIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPSAxMjsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMV0gPSAwOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMV0gPSAweEZFICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDFdID0gMDsKKworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMl0gPSAxOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAyXSA9IDA7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAyXSA9IDB4RkUgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMl0gPSAwOworCisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAzXSA9IDE7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDNdID0gMDsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDNdID0gMHhGRSAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAzXSA9IDA7CisKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDRdID0gMTsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNF0gPSAwOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNF0gPSAweEZFICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDRdID0gMDsKKworCS8vIHNlY29uZCBwYXJ0CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA1XSA9IDEyOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA1XSA9IDA7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA1XSA9IDB4RkYgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNV0gPSAwOworCisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA2XSA9IDE7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDZdID0gMDsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDZdID0gMHhGRiAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDA7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGkgJWQ6IHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlIHVzYiBkZXZpY2VcbiIsIGRldi0+bWlub3IpOworI2VuZGlmCisJLy8gMCBtZWFucyB0aGF0IHRoZSBBRCBjb21tYW5kcyBhcmUgc2VudAorCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHVzYmR1eGZhc3RzdWIsIFNFTkRBRENPTU1BTkRTKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoImNvbWVkaSVkOiBhZGMgY29tbWFuZCBjb3VsZCBub3QgYmUgc3VibWl0dGVkLiBBYm9ydGluZy4uLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogc3VibWl0dGluZyBpbi11cmI6ICV4LCV4XG4iLAorCQl1c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yLAorCQkoaW50KSh1c2JkdXhmYXN0c3ViLT51cmJJbi0+Y29udGV4dCksCisJCShpbnQpKHVzYmR1eGZhc3RzdWItPnVyYkluLT5kZXYpKTsKKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBQQUNLRVRTX1RPX0lHTk9SRTsgaSsrKSB7CisJCWVyciA9IHVzYl9idWxrX21zZyh1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkJICAgdXNiX3JjdmJ1bGtwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCQkJCSAgIEJVTEtJTkVQKSwKKwkJCQkgICB1c2JkdXhmYXN0c3ViLT50cmFuc2Zlcl9idWZmZXIsIFNJWkVJTkJVRiwKKwkJCQkgICAmYWN0dWFsX2xlbmd0aCwgMTAwMDApOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKCJjb21lZGklZDogaW5zbiB0aW1lb3V0LiBObyBkYXRhLlxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwkvLyBkYXRhIHBvaW50cworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOykgeworCQllcnIgPSB1c2JfYnVsa19tc2codXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJCSAgIHVzYl9yY3ZidWxrcGlwZSh1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkJCQkgICBCVUxLSU5FUCksCisJCQkJICAgdXNiZHV4ZmFzdHN1Yi0+dHJhbnNmZXJfYnVmZmVyLCBTSVpFSU5CVUYsCisJCQkJICAgJmFjdHVhbF9sZW5ndGgsIDEwMDAwKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50aygiY29tZWRpJWQ6IGluc24gZGF0YSBlcnJvcjogJWRcbiIsCisJCQkJZGV2LT5taW5vciwgZXJyKTsKKwkJCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQluID0gYWN0dWFsX2xlbmd0aCAvIHNpemVvZih1aW50MTZfdCk7CisJCWlmICgobiAlIDE2KSAhPSAwKSB7CisJCQlwcmludGsoImNvbWVkaSVkOiBpbnNuIGRhdGEgcGFja2V0IGNvcnJ1cHRlZC5cbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQl1cCgmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWZvciAoaiA9IGNoYW47IChqIDwgbikgJiYgKGkgPCBpbnNuLT5uKTsgaiA9IGogKyAxNikgeworCQkJZGF0YVtpXSA9CisJCQkJKCh1aW50MTZfdCAqKSAodXNiZHV4ZmFzdHN1Yi0+CisJCQkJCXRyYW5zZmVyX2J1ZmZlcikpW2pdOworCQkJaSsrOworCQl9CisJfQorCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCXJldHVybiBpOworfQorCitzdGF0aWMgdW5zaWduZWQgaGV4MnVuc2lnbmVkKGNoYXIgKmgpCit7CisJdW5zaWduZWQgaGksIGxvOworCWlmIChoWzBdID4gJzknKSB7CisJCWhpID0gaFswXSAtICdBJyArIDB4MGE7CisJfSBlbHNlIHsKKwkJaGkgPSBoWzBdIC0gJzAnOworCX0KKwlpZiAoaFsxXSA+ICc5JykgeworCQlsbyA9IGhbMV0gLSAnQScgKyAweDBhOworCX0gZWxzZSB7CisJCWxvID0gaFsxXSAtICcwJzsKKwl9CisJcmV0dXJuIGhpICogMHgxMCArIGxvOworfQorCisvLyBmb3IgRlgyCisjZGVmaW5lIEZJUk1XQVJFX01BWF9MRU4gMHgyMDAwCisKKy8vIHRha2VuIGZyb20gRGF2aWQgQnJvd25lbGwncyBmeGxvYWQgYW5kIGFkanVzdGVkIGZvciB0aGlzIGRyaXZlcgorc3RhdGljIGludCByZWFkX2Zpcm13YXJlKHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWIsIHZvaWQgKmZpcm13YXJlUHRyLAorCWxvbmcgc2l6ZSkKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgY2hhciAqZnAgPSAoY2hhciAqKWZpcm13YXJlUHRyOworCXVuc2lnbmVkIGNoYXIgKmZpcm13YXJlQmluYXJ5ID0gTlVMTDsKKwlpbnQgcmVzID0gMDsKKwlpbnQgbWF4QWRkciA9IDA7CisKKwlmaXJtd2FyZUJpbmFyeSA9IGttYWxsb2MoRklSTVdBUkVfTUFYX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaXJtd2FyZUJpbmFyeSkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IG1lbSBhbGxvYyBmb3IgZmlybXdhcmUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yICg7OykgeworCQljaGFyIGJ1ZlsyNTZdLCAqY3A7CisJCWNoYXIgdHlwZTsKKwkJaW50IGxlbjsKKwkJaW50IGlkeCwgb2ZmOworCQlpbnQgaiA9IDA7CisKKwkJLy8gZ2V0IG9uZSBsaW5lCisJCXdoaWxlICgoaSA8IHNpemUpICYmIChmcFtpXSAhPSAxMykgJiYgKGZwW2ldICE9IDEwKSkgeworCQkJYnVmW2pdID0gZnBbaV07CisJCQlpKys7CisJCQlqKys7CisJCQlpZiAoaiA+PSBzaXplb2YoYnVmKSkgeworCQkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogYm9ndXMgZmlybXdhcmUgZmlsZSFcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQkvLyBnZXQgcmlkIG9mIExGL0NSLy4uLgorCQl3aGlsZSAoKGkgPCBzaXplKSAmJiAoKGZwW2ldID09IDEzKSB8fCAoZnBbaV0gPT0gMTApCisJCQkJfHwgKGZwW2ldID09IDApKSkgeworCQkJaSsrOworCQl9CisKKwkJYnVmW2pdID0gMDsKKwkJLy9wcmludGsoImNvbWVkaV86IGJ1Zj0lc1xuIixidWYpOworCisJCS8qIEVYVEVOU0lPTjogIiMgY29tbWVudC10aWxsLWVuZC1vZi1saW5lIiwgZm9yIGNvcHlyaWdodHMgZXRjICovCisJCWlmIChidWZbMF0gPT0gJyMnKQorCQkJY29udGludWU7CisKKwkJaWYgKGJ1ZlswXSAhPSAnOicpIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogdXBsb2FkOiBub3QgYW4gaWhleCByZWNvcmQ6ICVzIiwgYnVmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJLyogUmVhZCB0aGUgbGVuZ3RoIGZpZWxkICh1cCB0byAxNiBieXRlcykgKi8KKwkJbGVuID0gaGV4MnVuc2lnbmVkKGJ1ZiArIDEpOworCisJCS8qIFJlYWQgdGhlIHRhcmdldCBvZmZzZXQgKi8KKwkJb2ZmID0gKGhleDJ1bnNpZ25lZChidWYgKyAzKSAqIDB4MDEwMCkgKyBoZXgydW5zaWduZWQoYnVmICsgNSk7CisKKwkJaWYgKChvZmYgKyBsZW4pID4gbWF4QWRkcikgeworCQkJbWF4QWRkciA9IG9mZiArIGxlbjsKKwkJfQorCisJCWlmIChtYXhBZGRyID49IEZJUk1XQVJFX01BWF9MRU4pIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogZmlybXdhcmUgdXBsb2FkIGdvZXMgYmV5b25kIEZYMiBSQU0gYm91bmRhcmllcy4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCS8vcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBvZmY9JXgsIGxlbj0leDoiLG9mZixsZW4pOworCisJCS8qIFJlYWQgdGhlIHJlY29yZCB0eXBlICovCisJCXR5cGUgPSBoZXgydW5zaWduZWQoYnVmICsgNyk7CisKKwkJLyogSWYgdGhpcyBpcyBhbiBFT0YgcmVjb3JkLCB0aGVuIG1ha2UgaXQgc28uICovCisJCWlmICh0eXBlID09IDEpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHR5cGUgIT0gMCkgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiB1bnN1cHBvcnRlZCByZWNvcmQgdHlwZTogJXVcbiIsIHR5cGUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlmb3IgKGlkeCA9IDAsIGNwID0gYnVmICsgOTsgaWR4IDwgbGVuOyBpZHggKz0gMSwgY3AgKz0gMikgeworCQkJZmlybXdhcmVCaW5hcnlbaWR4ICsgb2ZmXSA9IGhleDJ1bnNpZ25lZChjcCk7CisJCQkvL3ByaW50aygiJTAyeCAiLGZpcm13YXJlQmluYXJ5W2lkeCtvZmZdKTsKKwkJfQorCQkvL3ByaW50aygiXG4iKTsKKworCQlpZiAoaSA+PSBzaXplKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHVuZXhwZWN0ZWQgZW5kIG9mIGhleCBmaWxlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwl9CisJcmVzID0gZmlybXdhcmVVcGxvYWQodXNiZHV4ZmFzdHN1YiwgZmlybXdhcmVCaW5hcnksIG1heEFkZHIgKyAxKTsKKwlrZnJlZShmaXJtd2FyZUJpbmFyeSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgdGlkeV91cCh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViX3RtcCkKK3sKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiB0aWRpbmcgdXBcbiIpOworI2VuZGlmCisJaWYgKCF1c2JkdXhmYXN0c3ViX3RtcCkgeworCQlyZXR1cm47CisJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwkvLyBzaG93cyB0aGUgdXNiIHN1YnN5c3RlbSB0aGF0IHRoZSBkcml2ZXIgaXMgZG93bgorCWlmICh1c2JkdXhmYXN0c3ViX3RtcC0+aW50ZXJmYWNlKSB7CisJCXVzYl9zZXRfaW50ZmRhdGEodXNiZHV4ZmFzdHN1Yl90bXAtPmludGVyZmFjZSwgTlVMTCk7CisJfQorI2VuZGlmCisKKwl1c2JkdXhmYXN0c3ViX3RtcC0+cHJvYmVkID0gMDsKKworCWlmICh1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDgpCisJCS8vIHdhaXRzIHVudGlsIGEgcnVubmluZyB0cmFuc2ZlciBpcyBvdmVyCisJCS8vIHRodXMsIHVuZGVyIDIuNCBob3RwbHVnZ2luZyB3aGlsZSBhIGNvbW1hbmQKKwkJLy8gaXMgcnVubmluZyBpcyBub3Qgc2FmZQorCQl1c2Jfa2lsbF91cmIodXNiZHV4ZmFzdHN1Yl90bXAtPnVyYkluKTsKKyNlbmRpZgorCQlpZiAodXNiZHV4ZmFzdHN1Yl90bXAtPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJa2ZyZWUodXNiZHV4ZmFzdHN1Yl90bXAtPnRyYW5zZmVyX2J1ZmZlcik7CisJCQl1c2JkdXhmYXN0c3ViX3RtcC0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJfQorCQl1c2JfZnJlZV91cmIodXNiZHV4ZmFzdHN1Yl90bXAtPnVyYkluKTsKKwkJdXNiZHV4ZmFzdHN1Yl90bXAtPnVyYkluID0gTlVMTDsKKwl9CisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT5pbnNuQnVmZmVyKSB7CisJCWtmcmVlKHVzYmR1eGZhc3RzdWJfdG1wLT5pbnNuQnVmZmVyKTsKKwkJdXNiZHV4ZmFzdHN1Yl90bXAtPmluc25CdWZmZXIgPSBOVUxMOworCX0KKwlpZiAodXNiZHV4ZmFzdHN1Yl90bXAtPmR1eF9jb21tYW5kcykgeworCQlrZnJlZSh1c2JkdXhmYXN0c3ViX3RtcC0+ZHV4X2NvbW1hbmRzKTsKKwkJdXNiZHV4ZmFzdHN1Yl90bXAtPmR1eF9jb21tYW5kcyA9IE5VTEw7CisJfQorCXVzYmR1eGZhc3RzdWJfdG1wLT5haV9jbWRfcnVubmluZyA9IDA7Cit9CisKKy8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHVyYnMgYW5kIGluaXRpYWxpc2UgdGhlbQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorc3RhdGljIHZvaWQgKnVzYmR1eGZhc3RzdWJfcHJvYmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJdW5zaWduZWQgaW50IGludGVyZm51bSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworI2Vsc2UKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdHN1Yl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWludGVyZiwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHVpbnRlcmYpOworI2VuZGlmCisJaW50IGk7CisJaW50IGluZGV4OworCisJaWYgKHVkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9ISUdIKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdF86IFRoaXMgZHJpdmVyIG5lZWRzIFVTQiAyLjAgdG8gb3BlcmF0ZS4gQWJvcnRpbmcuLi5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdF86IGZpbmRpbmcgYSBmcmVlIHN0cnVjdHVyZSBmb3IgdGhlIHVzYi1kZXZpY2VcbiIpOworI2VuZGlmCisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCS8vIGxvb2sgZm9yIGEgZnJlZSBwbGFjZSBpbiB0aGUgdXNiZHV4ZmFzdCBhcnJheQorCWluZGV4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IE5VTVVTQkRVWEZBU1Q7IGkrKykgeworCQlpZiAoISh1c2JkdXhmYXN0c3ViW2ldLnByb2JlZCkpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gbm8gbW9yZSBzcGFjZQorCWlmIChpbmRleCA9PSAtMSkgeworCQlwcmludGsoIlRvbyBtYW55IHVzYmR1eGZhc3QtZGV2aWNlcyBjb25uZWN0ZWQuXG4iKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTUZJTEU7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHVzYmR1eGZhc3RzdWJbJWRdIGlzIHJlYWR5IHRvIGNvbm5lY3QgdG8gY29tZWRpLlxuIiwgaW5kZXgpOworI2VuZGlmCisKKwlpbml0X01VVEVYKCYodXNiZHV4ZmFzdHN1YltpbmRleF0uc2VtKSk7CisJLy8gc2F2ZSBhIHBvaW50ZXIgdG8gdGhlIHVzYiBkZXZpY2UKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS51c2JkZXYgPSB1ZGV2OworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJLy8gc2F2ZSB0aGUgaW50ZXJmYWNlIG51bWJlcgorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmlmbnVtID0gaW50ZXJmbnVtOworI2Vsc2UKKwkvLyAyLjY6IHNhdmUgdGhlIGludGVyZmFjZSBpdHNlbGYKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5pbnRlcmZhY2UgPSB1aW50ZXJmOworCS8vIGdldCB0aGUgaW50ZXJmYWNlIG51bWJlciBmcm9tIHRoZSBpbnRlcmZhY2UKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5pZm51bSA9IHVpbnRlcmYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwkvLyBoYW5kIHRoZSBwcml2YXRlIGRhdGEgb3ZlciB0byB0aGUgdXNiIHN1YnN5c3RlbQorCS8vIHdpbGwgYmUgbmVlZGVkIGZvciBkaXNjb25uZWN0CisJdXNiX3NldF9pbnRmZGF0YSh1aW50ZXJmLCAmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGlmbnVtPSVkXG4iLCB1c2JkdXhmYXN0c3ViW2luZGV4XS5pZm51bSk7CisjZW5kaWYKKwkvLyBjcmVhdGUgc3BhY2UgZm9yIHRoZSBjb21tYW5kcyBnb2luZyB0byB0aGUgdXNiIGRldmljZQorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmR1eF9jb21tYW5kcyA9IGttYWxsb2MoU0laRU9GRFVYQlVGRkVSLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYmR1eGZhc3RzdWJbaW5kZXhdLmR1eF9jb21tYW5kcykgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGVycm9yIGFsbG9jIHNwYWNlIGZvciBkYWMgY29tbWFuZHNcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8vIGNyZWF0ZSBzcGFjZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gYnVmZmVyCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uaW5zbkJ1ZmZlciA9IGttYWxsb2MoU0laRUlOU05CVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eGZhc3RzdWJbaW5kZXhdLmluc25CdWZmZXIpKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogY291bGQgbm90IGFsbG9jIHNwYWNlIGZvciBpbnNuQnVmZmVyXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvLyBzZXR0aW5nIHRvIGFsdGVybmF0ZSBzZXR0aW5nIDE6IGVuYWJsaW5nIGJ1bGsgZXAKKwlpID0gdXNiX3NldF9pbnRlcmZhY2UodXNiZHV4ZmFzdHN1YltpbmRleF0udXNiZGV2LAorCQl1c2JkdXhmYXN0c3ViW2luZGV4XS5pZm51bSwgMSk7CisJaWYgKGkgPCAwKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdCVkOiBjb3VsZCBub3Qgc3dpdGNoIHRvIGFsdGVybmF0ZSBzZXR0aW5nIDEuXG4iLCBpbmRleCk7CisJCXRpZHlfdXAoJih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdXNiZHV4ZmFzdHN1YltpbmRleF0udXJiSW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICh1c2JkdXhmYXN0c3ViW2luZGV4XS51cmJJbiA9PSBOVUxMKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdCVkOiBDb3VsZCBub3QgYWxsb2MuIHVyYlxuIiwgaW5kZXgpOworCQl0aWR5X3VwKCYodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoU0laRUlOQlVGLCBHRlBfS0VSTkVMKTsKKwlpZiAoISh1c2JkdXhmYXN0c3ViW2luZGV4XS50cmFuc2Zlcl9idWZmZXIpKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdCVkOiBjb3VsZCBub3QgYWxsb2MuIHRyYW5zYi5cbiIsCisJCQlpbmRleCk7CisJCXRpZHlfdXAoJih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy8gd2UndmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSBmdW5jdGlvbgorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLnByb2JlZCA9IDE7CisJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3QlZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQuXG4iLAorCQlpbmRleCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJcmV0dXJuICh2b2lkICopKCZ1c2JkdXhmYXN0c3ViW2luZGV4XSk7CisjZWxzZQorCS8vIHN1Y2Nlc3MKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCitzdGF0aWMgdm9pZCB1c2JkdXhmYXN0c3ViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHZvaWQgKnB0cikKK3sKKwl1c2JkdXhmYXN0c3ViX3QgKnVzYmR1eGZhc3RzdWJfdG1wID0gKHVzYmR1eGZhc3RzdWJfdCAqKSBwdHI7CisjZWxzZQorc3RhdGljIHZvaWQgdXNiZHV4ZmFzdHN1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXVzYmR1eGZhc3RzdWJfdCAqdXNiZHV4ZmFzdHN1Yl90bXAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKyNlbmRpZgorCWlmICghdXNiZHV4ZmFzdHN1Yl90bXApIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBkaXNjb25uZWN0IGNhbGxlZCB3aXRoIG51bGwgcG9pbnRlci5cbiIpOworCQlyZXR1cm47CisJfQorCWlmICh1c2JkdXhmYXN0c3ViX3RtcC0+dXNiZGV2ICE9IHVkZXYpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBCVUchIGNhbGxlZCB3aXRoIHdyb25nIHB0ciEhIVxuIik7CisJCXJldHVybjsKKwl9CisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCWRvd24oJnVzYmR1eGZhc3RzdWJfdG1wLT5zZW0pOworCXRpZHlfdXAodXNiZHV4ZmFzdHN1Yl90bXApOworCXVwKCZ1c2JkdXhmYXN0c3ViX3RtcC0+c2VtKTsKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSB1c2JcbiIpOworI2VuZGlmCit9CisKKy8vIGlzIGNhbGxlZCB3aGVuIGNvbWVkaS1jb25maWcgaXMgY2FsbGVkCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKwlpbnQgcmV0OworCWludCBpbmRleDsKKwlpbnQgaTsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gTlVMTDsKKwlkZXYtPnByaXZhdGUgPSBOVUxMOworCisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCS8vIGZpbmQgYSB2YWxpZCBkZXZpY2Ugd2hpY2ggaGFzIGJlZW4gZGV0ZWN0ZWQgYnkgdGhlIHByb2JlIGZ1bmN0aW9uIG9mIHRoZSB1c2IKKwlpbmRleCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBOVU1VU0JEVVhGQVNUOyBpKyspIHsKKwkJaWYgKCh1c2JkdXhmYXN0c3ViW2ldLnByb2JlZCkgJiYgKCF1c2JkdXhmYXN0c3ViW2ldLmF0dGFjaGVkKSkgeworCQkJaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGVycm9yOiBhdHRhY2ggZmFpbGVkLCBubyB1c2JkdXhmYXN0IGRldnMgY29ubmVjdGVkIHRvIHRoZSB1c2IgYnVzLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRvd24oJih1c2JkdXhmYXN0c3ViW2luZGV4XS5zZW0pKTsKKwkvLyBwb2ludGVyIGJhY2sgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29tZWRpIGRldmljZQorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmNvbWVkaWRldiA9IGRldjsKKworCS8vIHRyeWluZyB0byB1cGxvYWQgdGhlIGZpcm13YXJlIGludG8gdGhlIGNoaXAKKwlpZiAoY29tZWRpX2F1eF9kYXRhKGl0LT5vcHRpb25zLCAwKSAmJgorCQlpdC0+b3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdKSB7CisJCXJlYWRfZmlybXdhcmUodXNiZHV4ZmFzdHN1YiwKKwkJCWNvbWVkaV9hdXhfZGF0YShpdC0+b3B0aW9ucywgMCksCisJCQlpdC0+b3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdKTsKKwl9CisKKwlkZXYtPmJvYXJkX25hbWUgPSBCT0FSRE5BTUU7CisKKwkvKiBzZXQgbnVtYmVyIG9mIHN1YmRldmljZXMgKi8KKwlkZXYtPm5fc3ViZGV2aWNlcyA9IE5fU1VCREVWSUNFUzsKKworCS8vIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc3ViZGV2aWNlcworCWlmICgocmV0ID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIE5fU1VCREVWSUNFUykpIDwgMCkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBlcnJvciBhbGxvYyBzcGFjZSBmb3Igc3ViZGV2XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogdXNiLWRldmljZSAlZCBpcyBhdHRhY2hlZCB0byBjb21lZGkuXG4iLAorCQlkZXYtPm1pbm9yLCBpbmRleCk7CisJLy8gcHJpdmF0ZSBzdHJ1Y3R1cmUgaXMgYWxzbyBzaW1wbHkgdGhlIHVzYi1zdHJ1Y3R1cmUKKwlkZXYtPnByaXZhdGUgPSB1c2JkdXhmYXN0c3ViICsgaW5kZXg7CisJLy8gdGhlIGZpcnN0IHN1YmRldmljZSBpcyB0aGUgQS9EIGNvbnZlcnRlcgorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfQUQ7CisJLy8gdGhlIFVSQnMgZ2V0IHRoZSBjb21lZGkgc3ViZGV2aWNlCisJLy8gd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcKKwkvLyB0aGlzIGlzIHRoZSBzdWJkZXZpY2Ugd2hpY2ggcmVhZHMgZGF0YQorCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCS8vIHRoZSBzdWJkZXZpY2UgcmVjZWl2ZXMgYXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgdGhlCisJLy8gdXNiLXN0cnVjdHVyZQorCXMtPnByaXZhdGUgPSBOVUxMOworCS8vIGFuYWxvZyBpbnB1dAorCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwkvLyByZWFkYWJsZSBhbmQgcmVmIGlzIHRvIGdyb3VuZAorCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ01EX1JFQUQ7CisJLy8gMTYgY2hhbm5lbHMKKwlzLT5uX2NoYW4gPSAxNjsKKwkvLyBsZW5ndGggb2YgdGhlIGNoYW5uZWxsaXN0CisJcy0+bGVuX2NoYW5saXN0ID0gMTY7CisJLy8gY2FsbGJhY2sgZnVuY3Rpb25zCisJcy0+aW5zbl9yZWFkID0gdXNiZHV4ZmFzdF9haV9pbnNuX3JlYWQ7CisJcy0+ZG9fY21kdGVzdCA9IHVzYmR1eGZhc3RfYWlfY21kdGVzdDsKKwlzLT5kb19jbWQgPSB1c2JkdXhmYXN0X2FpX2NtZDsKKwlzLT5jYW5jZWwgPSB1c2JkdXhmYXN0X2FpX2NhbmNlbDsKKwkvLyBtYXggdmFsdWUgZnJvbSB0aGUgQS9EIGNvbnZlcnRlciAoMTJiaXQrMSBiaXQgZm9yIG92ZXJmbG93KQorCXMtPm1heGRhdGEgPSAweDEwMDA7CisJLy8gcmFuZ2UgdGFibGUgdG8gY29udmVydCB0byBwaHlzaWNhbCB1bml0cworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3VzYmR1eGZhc3RfYWlfcmFuZ2U7CisKKwkvLyBmaW5hbGx5IGRlY2lkZSB0aGF0IGl0J3MgYXR0YWNoZWQKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5hdHRhY2hlZCA9IDE7CisKKwl1cCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnNlbSkpOworCisJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKworCXByaW50aygiY29tZWRpJWQ6IHN1Y2Nlc3NmdWxseSBhdHRhY2hlZCB0byB1c2JkdXhmYXN0LlxuIiwgZGV2LT5taW5vcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhmYXN0X2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXVzYmR1eGZhc3RzdWJfdCAqdXNiZHV4ZmFzdHN1Yl90bXA7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogZGV0YWNoIHVzYiBkZXZpY2VcbiIsIGRldi0+bWlub3IpOworI2VuZGlmCisKKwlpZiAoIWRldikgeworCQlwcmludGsoImNvbWVkaT86IHVzYmR1eGZhc3Q6IGRldGFjaCB3aXRob3V0IGRldiB2YXJpYWJsZS4uLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXVzYmR1eGZhc3RzdWJfdG1wID0gZGV2LT5wcml2YXRlOworCWlmICghdXNiZHV4ZmFzdHN1Yl90bXApIHsKKwkJcHJpbnRrKCJjb21lZGk/OiB1c2JkdXhmYXN0OiBkZXRhY2ggd2l0aG91dCBwdHIgdG8gdXNiZHV4ZmFzdHN1YltdXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZG93bigmdXNiZHV4ZmFzdHN1Yl90bXAtPnNlbSk7CisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCS8vIERvbid0IGFsbG93IGRldGFjaCB0byBmcmVlIHRoZSBwcml2YXRlIHN0cnVjdHVyZQorCS8vIEl0J3Mgb25lIGVudHJ5IG9mIG9mIHVzYmR1eGZhc3RzdWJbXQorCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisJdXNiZHV4ZmFzdHN1Yl90bXAtPmF0dGFjaGVkID0gMDsKKwl1c2JkdXhmYXN0c3ViX3RtcC0+Y29tZWRpZGV2ID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogZGV0YWNoOiBzdWNjZXNzZnVsbHkgcmVtb3ZlZFxuIiwKKwkJZGV2LT5taW5vcik7CisjZW5kaWYKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCXVwKCZ1c2JkdXhmYXN0c3ViX3RtcC0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogbWFpbiBkcml2ZXIgc3RydWN0ICovCitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfdXNiZHV4ZmFzdCA9IHsKKyAgICAgIGRyaXZlcl9uYW1lOiJ1c2JkdXhmYXN0IiwKKyAgICAgIG1vZHVsZTpUSElTX01PRFVMRSwKKyAgICAgIGF0dGFjaDp1c2JkdXhmYXN0X2F0dGFjaCwKKyAgICAgIGRldGFjaDp1c2JkdXhmYXN0X2RldGFjaCwKK307CisKK3N0YXRpYyB2b2lkIGluaXRfdXNiX2RldmljZXModm9pZCkKK3sKKwlpbnQgaW5kZXg7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogc2V0dGluZyBhbGwgcG9zc2libGUgZGV2cyB0byBpbnZhbGlkXG4iKTsKKyNlbmRpZgorCS8vIGFsbCBkZXZpY2VzIGVudHJpZXMgYXJlIGludmFsaWQgdG8gYmVnaW4gd2l0aAorCS8vIHRoZXkgd2lsbCBiZWNvbWUgdmFsaWQgYnkgdGhlIHByb2JlIGZ1bmN0aW9uCisJLy8gYW5kIHRoZW4gZmluYWxseSBieSB0aGUgYXR0YWNoLWZ1bmN0aW9uCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNVVNCRFVYRkFTVDsgaW5kZXgrKykgeworCQltZW1zZXQoJih1c2JkdXhmYXN0c3ViW2luZGV4XSksIDB4MDAsCisJCQlzaXplb2YodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKwkJaW5pdF9NVVRFWCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnNlbSkpOworCX0KK30KKworLy8gVGFibGUgd2l0aCB0aGUgVVNCLWRldmljZXM6IGp1c3Qgbm93IG9ubHkgdGVzdGluZyBJRHMKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JkdXhmYXN0c3ViX3RhYmxlW10gPSB7CisJLy8gICAgICAgIHsgVVNCX0RFVklDRSgweDRiNCwgMHg4NjEzKSwgLy90ZXN0aW5nCisJLy8gICAgICAgIH0sCisJe1VTQl9ERVZJQ0UoMHgxM2Q4LCAweDAwMTApCS8vcmVhbCBJRAorCQl9LAorCXtVU0JfREVWSUNFKDB4MTNkOCwgMHgwMDExKQkvL3JlYWwgSUQKKwkJfSwKKwl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiZHV4ZmFzdHN1Yl90YWJsZSk7CisKKy8vIFRoZSB1c2JkdXhmYXN0c3ViLWRyaXZlcgorc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYmR1eGZhc3RzdWJfZHJpdmVyID0geworI2lmZGVmIENPTUVESV9IQVZFX1VTQl9EUklWRVJfT1dORVIKKyAgICAgIG93bmVyOlRISVNfTU9EVUxFLAorI2VuZGlmCisgICAgICBuYW1lOkJPQVJETkFNRSwKKyAgICAgIHByb2JlOnVzYmR1eGZhc3RzdWJfcHJvYmUsCisgICAgICBkaXNjb25uZWN0OnVzYmR1eGZhc3RzdWJfZGlzY29ubmVjdCwKKyAgICAgIGlkX3RhYmxlOnVzYmR1eGZhc3RzdWJfdGFibGUsCit9OworCisvLyBDYW4ndCB1c2UgdGhlIG5pY2UgbWFjcm8gYXMgSSBoYXZlIGFsc28gdG8gaW5pdGlhbGlzZSB0aGUgVVNCCisvLyBzdWJzeXN0ZW06CisvLyByZWdpc3RlcmluZyB0aGUgdXNiLXN5c3RlbSBfYW5kXyB0aGUgY29tZWRpLWRyaXZlcgorc3RhdGljIGludCBpbml0X3VzYmR1eGZhc3Qodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIKKwkgICAgICAgRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDICJcbiIpOworCWluaXRfdXNiX2RldmljZXMoKTsKKwl1c2JfcmVnaXN0ZXIoJnVzYmR1eGZhc3RzdWJfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfdXNiZHV4ZmFzdCk7CisJcmV0dXJuIDA7Cit9CisKKy8vIGRlcmVnaXN0ZXJpbmcgdGhlIGNvbWVkaSBkcml2ZXIgYW5kIHRoZSB1c2Itc3Vic3lzdGVtCitzdGF0aWMgdm9pZCBleGl0X3VzYmR1eGZhc3Qodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl91c2JkdXhmYXN0KTsKKwl1c2JfZGVyZWdpc3RlcigmdXNiZHV4ZmFzdHN1Yl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X3VzYmR1eGZhc3QpOworbW9kdWxlX2V4aXQoZXhpdF91c2JkdXhmYXN0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2ludGVycnVwdC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9pbnRlcnJ1cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM4ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9pbnRlcnJ1cHQuaApAQCAtMCwwICsxLDYwIEBACisvKgorICAgIGxpbnV4L2ludGVycnVwdC5oIGNvbXBhdGliaWxpdHkgaGVhZGVyCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQ09NUEFUX0xJTlVYX0lOVEVSUlVQVF9IXworI2RlZmluZSBfX0NPTVBBVF9MSU5VWF9JTlRFUlJVUFRfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaWZuZGVmIElSUV9OT05FCit0eXBlZGVmIHZvaWQgaXJxcmV0dXJuX3Q7CisjZGVmaW5lIElSUV9OT05FCisjZGVmaW5lIElSUV9IQU5ETEVECisjZGVmaW5lIElSUV9SRVRWQUwoeCkgKHZvaWQpKHgpCisjZW5kaWYKKworI2lmbmRlZiBJUlFGX0RJU0FCTEVECisjZGVmaW5lIElSUUZfRElTQUJMRUQgICAgICAgICAgIFNBX0lOVEVSUlVQVAorI2RlZmluZSBJUlFGX1NBTVBMRV9SQU5ET00gICAgICBTQV9TQU1QTEVfUkFORE9NCisjZGVmaW5lIElSUUZfU0hBUkVEICAgICAgICAgICAgIFNBX1NISVJRCisjZGVmaW5lIElSUUZfUFJPQkVfU0hBUkVEICAgICAgIFNBX1BST0JFSVJRCisjZGVmaW5lIElSUUZfUEVSQ1BVICAgICAgICAgICAgIFNBX1BFUkNQVQorI2lmZGVmIFNBX1RSSUdHRVJfTUFTSworI2RlZmluZSBJUlFGX1RSSUdHRVJfTk9ORSAgICAgICAwCisjZGVmaW5lIElSUUZfVFJJR0dFUl9MT1cgICAgICAgIFNBX1RSSUdHRVJfTE9XCisjZGVmaW5lIElSUUZfVFJJR0dFUl9ISUdIICAgICAgIFNBX1RSSUdHRVJfSElHSAorI2RlZmluZSBJUlFGX1RSSUdHRVJfRkFMTElORyAgICBTQV9UUklHR0VSX0ZBTExJTkcKKyNkZWZpbmUgSVJRRl9UUklHR0VSX1JJU0lORyAgICAgU0FfVFJJR0dFUl9SSVNJTkcKKyNkZWZpbmUgSVJRRl9UUklHR0VSX01BU0sgICAgICAgU0FfVFJJR0dFUl9NQVNLCisjZWxzZQorI2RlZmluZSBJUlFGX1RSSUdHRVJfTk9ORSAgICAgICAwCisjZGVmaW5lIElSUUZfVFJJR0dFUl9MT1cgICAgICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0hJR0ggICAgICAgMAorI2RlZmluZSBJUlFGX1RSSUdHRVJfRkFMTElORyAgICAwCisjZGVmaW5lIElSUUZfVFJJR0dFUl9SSVNJTkcgICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX01BU0sgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBQVF9SRUdTX0FSRworI2RlZmluZSBQVF9SRUdTX0NBTEwKKyNkZWZpbmUgUFRfUkVHU19OVUxMCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmY2M5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACitvYmotJChDT05GSUdfQ09NRURJKQkrPSBrY29tZWRpbGliLm8KKwora2NvbWVkaWxpYi1vYmpzIDo9CQkJCVwKKwkJCWRhdGEubwkJCVwKKwkJCWtzeW1zLm8JCQlcCisJCQlkaW8ubwkJCVwKKwkJCWtjb21lZGlsaWJfbWFpbi5vCVwKKwkJCWdldC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFlYzIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2RhdGEuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICAgIGtjb21lZGlsaWIvZGF0YS5jCisgICAgaW1wbGVtZW50cyBjb21lZGlfZGF0YV8qKCkgZnVuY3Rpb25zCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlICIuLi9jb21lZGkuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlsaWIuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIJLyogZm9yIGNvbWVkaV91ZGVsYXkoKSAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKK2ludCBjb21lZGlfZGF0YV93cml0ZShjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZiwgbHNhbXBsX3QgZGF0YSkKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fV1JJVEU7CisJaW5zbi5uID0gMTsKKwlpbnNuLmRhdGEgPSAmZGF0YTsKKwlpbnNuLnN1YmRldiA9IHN1YmRldjsKKwlpbnNuLmNoYW5zcGVjID0gQ1JfUEFDSyhjaGFuLCByYW5nZSwgYXJlZik7CisKKwlyZXR1cm4gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7Cit9CisKK2ludCBjb21lZGlfZGF0YV9yZWFkKGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJY29tZWRpX2luc24gaW5zbjsKKworCW1lbXNldCgmaW5zbiwgMCwgc2l6ZW9mKGluc24pKTsKKwlpbnNuLmluc24gPSBJTlNOX1JFQUQ7CisJaW5zbi5uID0gMTsKKwlpbnNuLmRhdGEgPSBkYXRhOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIHJhbmdlLCBhcmVmKTsKKworCXJldHVybiBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKK30KKworaW50IGNvbWVkaV9kYXRhX3JlYWRfaGludChjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgY2hhbiwgdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZikKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCWxzYW1wbF90IGR1bW15X2RhdGE7CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9SRUFEOworCWluc24ubiA9IDA7CisJaW5zbi5kYXRhID0gJmR1bW15X2RhdGE7CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisJaW5zbi5jaGFuc3BlYyA9IENSX1BBQ0soY2hhbiwgcmFuZ2UsIGFyZWYpOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2RhdGFfcmVhZF9kZWxheWVkKGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LAorCXVuc2lnbmVkIGludCBjaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLAorCWxzYW1wbF90ICogZGF0YSwgdW5zaWduZWQgaW50IG5hbm9fc2VjKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZGF0YV9yZWFkX2hpbnQoZGV2LCBzdWJkZXYsIGNoYW4sIHJhbmdlLCBhcmVmKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWNvbWVkaV91ZGVsYXkoKG5hbm9fc2VjICsgOTk5KSAvIDEwMDApOworCisJcmV0dXJuIGNvbWVkaV9kYXRhX3JlYWQoZGV2LCBzdWJkZXYsIGNoYW4sIHJhbmdlLCBhcmVmLCBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY0ODhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2Rpby5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgICAga2NvbWVkaWxpYi9kaW8uYworICAgIGltcGxlbWVudHMgY29tZWRpX2Rpb18qKCkgZnVuY3Rpb25zCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlICIuLi9jb21lZGkuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlsaWIuaCIKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitpbnQgY29tZWRpX2Rpb19jb25maWcoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCBpbykKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fQ09ORklHOworCWluc24ubiA9IDE7CisJaW5zbi5kYXRhID0gJmlvOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIDAsIDApOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2Rpb19yZWFkKGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgKnZhbCkKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fUkVBRDsKKwlpbnNuLm4gPSAxOworCWluc24uZGF0YSA9IHZhbDsKKwlpbnNuLnN1YmRldiA9IHN1YmRldjsKKwlpbnNuLmNoYW5zcGVjID0gQ1JfUEFDSyhjaGFuLCAwLCAwKTsKKworCXJldHVybiBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKK30KKworaW50IGNvbWVkaV9kaW9fd3JpdGUoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCB2YWwpCit7CisJY29tZWRpX2luc24gaW5zbjsKKworCW1lbXNldCgmaW5zbiwgMCwgc2l6ZW9mKGluc24pKTsKKwlpbnNuLmluc24gPSBJTlNOX1dSSVRFOworCWluc24ubiA9IDE7CisJaW5zbi5kYXRhID0gJnZhbDsKKwlpbnNuLnN1YmRldiA9IHN1YmRldjsKKwlpbnNuLmNoYW5zcGVjID0gQ1JfUEFDSyhjaGFuLCAwLCAwKTsKKworCXJldHVybiBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKK30KKworaW50IGNvbWVkaV9kaW9fYml0ZmllbGQoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBtYXNrLAorCXVuc2lnbmVkIGludCAqYml0cykKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCWxzYW1wbF90IGRhdGFbMl07CisJaW50IHJldDsKKworCW1lbXNldCgmaW5zbiwgMCwgc2l6ZW9mKGluc24pKTsKKwlpbnNuLmluc24gPSBJTlNOX0JJVFM7CisJaW5zbi5uID0gMjsKKwlpbnNuLmRhdGEgPSBkYXRhOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCisJZGF0YVswXSA9IG1hc2s7CisJZGF0YVsxXSA9ICpiaXRzOworCisJcmV0ID0gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7CisKKwkqYml0cyA9IGRhdGFbMV07CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2dldC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2dldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMDRhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZ2V0LmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgICAga2NvbWVkaWxpYi9nZXQuYworICAgIGEgY29tZWRsaWIgaW50ZXJmYWNlIGZvciBrZXJuZWwgbW9kdWxlcworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKyNpbmNsdWRlICIuLi9jb21lZGkuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlsaWIuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworaW50IGNvbWVkaV9nZXRfbl9zdWJkZXZpY2VzKGNvbWVkaV90ICogZCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCisJcmV0dXJuIGRldi0+bl9zdWJkZXZpY2VzOworfQorCitpbnQgY29tZWRpX2dldF92ZXJzaW9uX2NvZGUoY29tZWRpX3QgKiBkKQoreworCXJldHVybiBDT01FRElfVkVSU0lPTl9DT0RFOworfQorCitjb25zdCBjaGFyICpjb21lZGlfZ2V0X2RyaXZlcl9uYW1lKGNvbWVkaV90ICogZCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCisJcmV0dXJuIGRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZTsKK30KKworY29uc3QgY2hhciAqY29tZWRpX2dldF9ib2FyZF9uYW1lKGNvbWVkaV90ICogZCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCisJcmV0dXJuIGRldi0+Ym9hcmRfbmFtZTsKK30KKworaW50IGNvbWVkaV9nZXRfc3ViZGV2aWNlX3R5cGUoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCXJldHVybiBzLT50eXBlOworfQorCit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfZmxhZ3MoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCXJldHVybiBzLT5zdWJkZXZfZmxhZ3M7Cit9CisKK2ludCBjb21lZGlfZmluZF9zdWJkZXZpY2VfYnlfdHlwZShjb21lZGlfdCAqIGQsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgc3ViZCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCisJaWYgKHN1YmQgPiBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmb3IgKDsgc3ViZCA8IGRldi0+bl9zdWJkZXZpY2VzOyBzdWJkKyspIHsKKwkJaWYgKGRldi0+c3ViZGV2aWNlc1tzdWJkXS50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gc3ViZDsKKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgY29tZWRpX2dldF9uX2NoYW5uZWxzKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlyZXR1cm4gcy0+bl9jaGFuOworfQorCitpbnQgY29tZWRpX2dldF9sZW5fY2hhbmxpc3QoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCXJldHVybiBzLT5sZW5fY2hhbmxpc3Q7Cit9CisKK2xzYW1wbF90IGNvbWVkaV9nZXRfbWF4ZGF0YShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGNoYW4pCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJaWYgKHMtPm1heGRhdGFfbGlzdCkKKwkJcmV0dXJuIHMtPm1heGRhdGFfbGlzdFtjaGFuXTsKKworCXJldHVybiBzLT5tYXhkYXRhOworfQorCisjaWZkZWYgS0NPTUVESUxJQl9ERVBSRUNBVEVECitpbnQgY29tZWRpX2dldF9yYW5nZXR5cGUoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBjaGFuKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwlpbnQgcmV0OworCisJaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QpIHsKKwkJcmV0ID0gcy0+cmFuZ2VfdGFibGVfbGlzdFtjaGFuXS0+bGVuZ3RoOworCX0gZWxzZSB7CisJCXJldCA9IHMtPnJhbmdlX3RhYmxlLT5sZW5ndGg7CisJfQorCisJcmV0ID0gcmV0IHwgKGRldi0+bWlub3IgPDwgMjgpIHwgKHN1YmRldmljZSA8PCAyNCkgfCAoY2hhbiA8PCAxNik7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK2ludCBjb21lZGlfZ2V0X25fcmFuZ2VzKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQgaW50IGNoYW4pCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWludCByZXQ7CisKKwlpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlyZXQgPSBzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dLT5sZW5ndGg7CisJfSBlbHNlIHsKKwkJcmV0ID0gcy0+cmFuZ2VfdGFibGUtPmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQUxQSEEgKG5vbi1wb3J0YWJsZSkKKyovCitpbnQgY29tZWRpX2dldF9rcmFuZ2UoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIGNvbWVkaV9rcmFuZ2UgKiBrcmFuZ2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKmxyOworCisJaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QpIHsKKwkJbHIgPSBzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dOworCX0gZWxzZSB7CisJCWxyID0gcy0+cmFuZ2VfdGFibGU7CisJfQorCWlmIChyYW5nZSA+PSBsci0+bGVuZ3RoKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZW1jcHkoa3JhbmdlLCBsci0+cmFuZ2UgKyByYW5nZSwgc2l6ZW9mKGNvbWVkaV9rcmFuZ2UpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQUxQSEEgKG1heSBiZSByZW5hbWVkKQorKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X2J1Zl9oZWFkX3Bvcyhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworfQorCitpbnQgY29tZWRpX2dldF9idWZmZXJfY29udGVudHMoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCXVuc2lnbmVkIGludCBudW1fYnl0ZXM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLTE7CisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJbnVtX2J5dGVzID0gY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKHMtPmFzeW5jKTsKKwlyZXR1cm4gbnVtX2J5dGVzOworfQorCisvKgorICogQUxQSEEKKyovCitpbnQgY29tZWRpX3NldF91c2VyX2ludF9jb3VudChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGJ1Zl91c2VyX2NvdW50KQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCWludCBudW1fYnl0ZXM7CisKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwludW1fYnl0ZXMgPSBidWZfdXNlcl9jb3VudCAtIGFzeW5jLT5idWZfcmVhZF9jb3VudDsKKwlpZiAobnVtX2J5dGVzIDwgMCkKKwkJcmV0dXJuIC0xOworCWNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgbnVtX2J5dGVzKTsKKwljb21lZGlfYnVmX3JlYWRfZnJlZShhc3luYywgbnVtX2J5dGVzKTsKKworCXJldHVybiAwOworfQorCitpbnQgY29tZWRpX21hcmtfYnVmZmVyX3JlYWQoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLTE7CisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOworCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBudW1fYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfbWFya19idWZmZXJfd3JpdHRlbihjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwlpbnQgYnl0ZXNfd3JpdHRlbjsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtMTsKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJYnl0ZXNfd3JpdHRlbiA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CisJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBieXRlc193cml0dGVuKTsKKwlpZiAoYnl0ZXNfd3JpdHRlbiAhPSBudW1fYnl0ZXMpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWVkaV9nZXRfYnVmZmVyX3NpemUoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2KQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldjsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJaWYgKHN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC0xOworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIGFzeW5jLT5wcmVhbGxvY19idWZzejsKK30KKworaW50IGNvbWVkaV9nZXRfYnVmZmVyX29mZnNldChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLTE7CisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYXN5bmMtPmJ1Zl9yZWFkX3B0cjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTBmYmRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICAgIGtjb21lZGlsaWIva2NvbWVkaWxpYi5jCisgICAgYSBjb21lZGxpYiBpbnRlcmZhY2UgZm9yIGtlcm5lbCBtb2R1bGVzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGtlcm5lbCBsaWJyYXJ5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2NvbWVkaV90ICpjb21lZGlfb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm87CisJY29tZWRpX2RldmljZSAqZGV2OworCXVuc2lnbmVkIGludCBtaW5vcjsKKworCWlmIChzdHJuY21wKGZpbGVuYW1lLCAiL2Rldi9jb21lZGkiLCAxMSkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwltaW5vciA9IHNpbXBsZV9zdHJ0b3VsKGZpbGVuYW1lICsgMTEsIE5VTEwsIDApOworCisJaWYgKG1pbm9yID49IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKQorCQlyZXR1cm4gTlVMTDsKKworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWlmKGRldl9maWxlX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCisJaWYoZGV2ID09IE5VTEwgfHwgIWRldi0+YXR0YWNoZWQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRyaXZlci0+bW9kdWxlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gKGNvbWVkaV90ICopIGRldjsKK30KKworY29tZWRpX3QgKmNvbWVkaV9vcGVuX29sZCh1bnNpZ25lZCBpbnQgbWlub3IpCit7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvOworCWNvbWVkaV9kZXZpY2UgKmRldjsKKworCWlmIChtaW5vciA+PSBDT01FRElfTlVNX01JTk9SUykKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZfZmlsZV9pbmZvID0gY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwlpZihkZXZfZmlsZV9pbmZvID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCWlmKGRldiA9PSBOVUxMIHx8ICFkZXYtPmF0dGFjaGVkKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAoY29tZWRpX3QgKikgZGV2OworfQorCitpbnQgY29tZWRpX2Nsb3NlKGNvbWVkaV90ICogZCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCisJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+bW9kdWxlKTsKKworCXJldHVybiAwOworfQorCitpbnQgY29tZWRpX2xvZ2xldmVsKGludCBuZXdsZXZlbCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb21lZGlfcGVycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJcnRfcHJpbnRrKCIlczogdW5rbm93biBlcnJvclxuIiwgbWVzc2FnZSk7Cit9CisKK2NoYXIgKmNvbWVkaV9zdHJlcnJvcihpbnQgZXJyKQoreworCXJldHVybiAidW5rbm93biBlcnJvciI7Cit9CisKK2ludCBjb21lZGlfZmlsZW5vKGNvbWVkaV90ICogZCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCisJLyogcmV0dXJuIHNvbWV0aGluZyByYW5kb20gKi8KKwlyZXR1cm4gZGV2LT5taW5vcjsKK30KKworaW50IGNvbWVkaV9jb21tYW5kKGNvbWVkaV90ICogZCwgY29tZWRpX2NtZCAqIGNtZCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwl1bnNpZ25lZCBydW5mbGFnczsKKworCWlmIChjbWQtPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgY21kLT5zdWJkZXY7CisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKQorCQlyZXR1cm4gLUVJTzsKKworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHMtPmJ1c3kpCisJCXJldHVybiAtRUJVU1k7CisJcy0+YnVzeSA9IGQ7CisKKwlpZiAoYXN5bmMtPmNiX21hc2sgJiBDT01FRElfQ0JfRU9TKQorCQljbWQtPmZsYWdzIHw9IFRSSUdfV0FLRV9FT1M7CisKKwlhc3luYy0+Y21kID0gKmNtZDsKKworCXJ1bmZsYWdzID0gU1JGX1JVTk5JTkc7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJaWYgKGNvbWVkaV9zd2l0Y2hfdG9fcnQoZGV2KSA9PSAwKQorCQlydW5mbGFncyB8PSBTUkZfUlQ7CisjZW5kaWYKKwljb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCB+MCwgcnVuZmxhZ3MpOworCisJY29tZWRpX3Jlc2V0X2FzeW5jX2J1Zihhc3luYyk7CisKKwlyZXR1cm4gcy0+ZG9fY21kKGRldiwgcyk7Cit9CisKK2ludCBjb21lZGlfY29tbWFuZF90ZXN0KGNvbWVkaV90ICogZCwgY29tZWRpX2NtZCAqIGNtZCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoY21kLT5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRU5PREVWOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGNtZC0+c3ViZGV2OworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAocy0+YXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcy0+ZG9fY21kdGVzdChkZXYsIHMsIGNtZCk7Cit9CisKKy8qCisgKglDT01FRElfSU5TTgorICoJcGVyZm9ybSBhbiBpbnN0cnVjdGlvbgorICovCitpbnQgY29tZWRpX2RvX2luc24oY29tZWRpX3QgKiBkLCBjb21lZGlfaW5zbiAqIGluc24pCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQgPSAwOworCisJaWYgKGluc24tPmluc24gJiBJTlNOX01BU0tfU1BFQ0lBTCkgeworCQlzd2l0Y2ggKGluc24tPmluc24pIHsKKwkJY2FzZSBJTlNOX0dUT0Q6CisJCQl7CisJCQkJc3RydWN0IHRpbWV2YWwgdHY7CisKKwkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCQlpbnNuLT5kYXRhWzBdID0gdHYudHZfc2VjOworCQkJCWluc24tPmRhdGFbMV0gPSB0di50dl91c2VjOworCQkJCXJldCA9IDI7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBJTlNOX1dBSVQ6CisJCQkvKiBYWFggaXNuJ3QgdGhlIHZhbHVlIHN1cHBvc2VkIHRvIGJlIG5hbm9zZWNzPyAqLworCQkJaWYgKGluc24tPm4gIT0gMSB8fCBpbnNuLT5kYXRhWzBdID49IDEwMCkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb21lZGlfdWRlbGF5KGluc24tPmRhdGFbMF0pOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fSU5UVFJJRzoKKwkJCWlmIChpbnNuLT5uICE9IDEpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGluc24tPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQkJCXJ0X3ByaW50aygiJWQgbm90IHVzYWJsZSBzdWJkZXZpY2VcbiIsCisJCQkJCWluc24tPnN1YmRldik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpbnNuLT5zdWJkZXY7CisJCQlpZiAoIXMtPmFzeW5jKSB7CisJCQkJcnRfcHJpbnRrKCJubyBhc3luY1xuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghcy0+YXN5bmMtPmludHRyaWcpIHsKKwkJCQlydF9wcmludGsoIm5vIGludHRyaWdcbiIpOworCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBzLT5hc3luYy0+aW50dHJpZyhkZXYsIHMsIGluc24tPmRhdGFbMF0pOworCQkJaWYgKHJldCA+PSAwKQorCQkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQkvKiBhIHN1YmRldmljZSBpbnN0cnVjdGlvbiAqLworCQlpZiAoaW5zbi0+c3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaW5zbi0+c3ViZGV2OworCisJCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgeworCQkJcnRfcHJpbnRrKCIlZCBub3QgdXNlYWJsZSBzdWJkZXZpY2VcbiIsIGluc24tPnN1YmRldik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIFhYWCBjaGVjayBsb2NrICovCisKKwkJaWYgKChyZXQgPSBjaGVja19jaGFubGlzdChzLCAxLCAmaW5zbi0+Y2hhbnNwZWMpKSA8IDApIHsKKwkJCXJ0X3ByaW50aygiYmFkIGNoYW5zcGVjXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKHMtPmJ1c3kpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcy0+YnVzeSA9IGQ7CisKKwkJc3dpdGNoIChpbnNuLT5pbnNuKSB7CisJCWNhc2UgSU5TTl9SRUFEOgorCQkJcmV0ID0gcy0+aW5zbl9yZWFkKGRldiwgcywgaW5zbiwgaW5zbi0+ZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX1dSSVRFOgorCQkJcmV0ID0gcy0+aW5zbl93cml0ZShkZXYsIHMsIGluc24sIGluc24tPmRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9CSVRTOgorCQkJcmV0ID0gcy0+aW5zbl9iaXRzKGRldiwgcywgaW5zbiwgaW5zbi0+ZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX0NPTkZJRzoKKwkJCS8qIFhYWCBzaG91bGQgY2hlY2sgaW5zdHJ1Y3Rpb24gbGVuZ3RoICovCisJCQlyZXQgPSBzLT5pbnNuX2NvbmZpZyhkZXYsIHMsIGluc24sIGluc24tPmRhdGEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlzLT5idXN5ID0gTlVMTDsKKwl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisjaWYgMAorCS8qIFhYWCBkbyB3ZSB3YW50IHRoaXM/IC0tIGFiYm90dGkgI2lmJ2VkIGl0IG91dCBmb3Igbm93LiAqLworCWlmIChyZXQgIT0gaW5zbi0+bikgeworCQlydF9wcmludGsoIkJVRzogcmVzdWx0IG9mIGluc24gIT0gaW5zbi5uXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisjZW5kaWYKKyAgICAgIGVycm9yOgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKwlDT01FRElfTE9DSworCWxvY2sgc3ViZGV2aWNlCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub25lCisKKwl3cml0ZXM6CisJCW5vbmUKKworCW5lY2Vzc2FyeSBsb2NraW5nOgorCS0gaW9jdGwvcnQgbG9jayAgKHRoaXMgdHlwZSkKKwktIGxvY2sgd2hpbGUgc3ViZGV2aWNlIGJ1c3kKKwktIGxvY2sgd2hpbGUgc3ViZGV2aWNlIGJlaW5nIHByb2dyYW1tZWQKKworKi8KK2ludCBjb21lZGlfbG9jayhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCWlmIChzLT5idXN5KSB7CisJCXJldCA9IC1FQlVTWTsKKwl9IGVsc2UgeworCQlpZiAocy0+bG9jaykgeworCQkJcmV0ID0gLUVCVVNZOworCQl9IGVsc2UgeworCQkJcy0+bG9jayA9IGQ7CisJCX0KKwl9CisKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9VTkxPQ0sKKwl1bmxvY2sgc3ViZGV2aWNlCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub25lCisKKwl3cml0ZXM6CisJCW5vbmUKKworKi8KK2ludCBjb21lZGlfdW5sb2NrKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCWludCByZXQ7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJYXN5bmMgPSBzLT5hc3luYzsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CisKKwlpZiAocy0+YnVzeSkgeworCQlyZXQgPSAtRUJVU1k7CisJfSBlbHNlIGlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gKHZvaWQgKilkKSB7CisJCXJldCA9IC1FQUNDRVM7CisJfSBlbHNlIHsKKwkJcy0+bG9jayA9IE5VTEw7CisKKwkJaWYgKGFzeW5jKSB7CisJCQlhc3luYy0+Y2JfbWFzayA9IDA7CisJCQlhc3luYy0+Y2JfZnVuYyA9IE5VTEw7CisJCQlhc3luYy0+Y2JfYXJnID0gTlVMTDsKKwkJfQorCisJCXJldCA9IDA7CisJfQorCisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKwlDT01FRElfQ0FOQ0VMCisJY2FuY2VsIGFjcXVpc2l0aW9uIGlvY3RsCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub3RoaW5nCisKKwl3cml0ZXM6CisJCW5vdGhpbmcKKworKi8KK2ludCBjb21lZGlfY2FuY2VsKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSBkKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworI2lmIDAKKwlpZiAoIXMtPmJ1c3kpCisJCXJldHVybiAwOworCisJaWYgKHMtPmJ1c3kgIT0gZCkKKwkJcmV0dXJuIC1FQlVTWTsKKyNlbmRpZgorCisJaWYgKCFzLT5jYW5jZWwgfHwgIXMtPmFzeW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgocmV0ID0gcy0+Y2FuY2VsKGRldiwgcykpKQorCQlyZXR1cm4gcmV0OworCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVAorCWlmIChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIFNSRl9SVCkgeworCQljb21lZGlfc3dpdGNoX3RvX25vbl9ydChkZXYpOworCX0KKyNlbmRpZgorCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIFNSRl9SVU5OSU5HIHwgU1JGX1JULCAwKTsKKwlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJcy0+YnVzeSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgIHJlZ2lzdHJhdGlvbiBvZiBjYWxsYmFjayBmdW5jdGlvbnMKKyAqLworaW50IGNvbWVkaV9yZWdpc3Rlcl9jYWxsYmFjayhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IG1hc2ssIGludCAoKmNiKSAodW5zaWduZWQgaW50LCB2b2lkICopLCB2b2lkICphcmcpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQgfHwgIWFzeW5jKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIGFyZSB3ZSBsb2NrZWQ/IChpb2N0bCBsb2NrKSAqLworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZCkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwkvKiBhcmUgd2UgYnVzeT8gKi8KKwlpZiAocy0+YnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghbWFzaykgeworCQlhc3luYy0+Y2JfbWFzayA9IDA7CisJCWFzeW5jLT5jYl9mdW5jID0gTlVMTDsKKwkJYXN5bmMtPmNiX2FyZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJYXN5bmMtPmNiX21hc2sgPSBtYXNrOworCQlhc3luYy0+Y2JfZnVuYyA9IGNiOworCQlhc3luYy0+Y2JfYXJnID0gYXJnOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgY29tZWRpX3BvbGwoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEIHx8ICFhc3luYykKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBhcmUgd2UgbG9ja2VkPyAoaW9jdGwgbG9jaykgKi8KKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGQpCisJCXJldHVybiAtRUFDQ0VTOworCisJLyogYXJlIHdlIHJ1bm5pbmc/IFhYWCB3cm9uZz8gKi8KKwlpZiAoIXMtPmJ1c3kpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHMtPnBvbGwoZGV2LCBzKTsKK30KKworLyogV0FSTklORzogbm90IHBvcnRhYmxlICovCitpbnQgY29tZWRpX21hcChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHZvaWQgKnB0cikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJaWYgKCFzLT5hc3luYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocHRyKSB7CisJCSooKHZvaWQgKiopcHRyKSA9IHMtPmFzeW5jLT5wcmVhbGxvY19idWY7CisJfQorCisJLyogWFhYIG5vIHJlZmVyZW5jZSBjb3VudGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIFdBUk5JTkc6IG5vdCBwb3J0YWJsZSAqLworaW50IGNvbWVkaV91bm1hcChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCWlmICghcy0+YXN5bmMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogWFhYIG5vIHJlZmVyZW5jZSBjb3VudGluZyAqLworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva3N5bXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YjQ1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva3N5bXMuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAgICBjb21lZGkva2NvbWVkaWxpYi9rc3ltcy5jCisgICAgYSBjb21lZGxpYiBpbnRlcmZhY2UgZm9yIGtlcm5lbCBtb2R1bGVzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBFWFBPUlRfU1lNVEFCCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vY29tZWRpLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpbGliLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gMHgwMjAyMDAKKworLyogZnVuY3Rpb25zIHNwZWNpZmljIHRvIGtjb21lZGlsaWIgKi8KKworRVhQT1JUX1NZTUJPTChjb21lZGlfcmVnaXN0ZXJfY2FsbGJhY2spOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2tyYW5nZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfYnVmX2hlYWRfcG9zKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3NldF91c2VyX2ludF9jb3VudCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9tYXApOworRVhQT1JUX1NZTUJPTChjb21lZGlfdW5tYXApOworCisvKiBUaGlzIGxpc3QgY29tZXMgZnJvbSB1c2VyLXNwYWNlIGNvbWVkaWxpYiwgdG8gc2hvdyB3aGljaAorICogZnVuY3Rpb25zIGFyZSBub3QgcG9ydGVkIHlldC4gKi8KKworRVhQT1JUX1NZTUJPTChjb21lZGlfb3Blbik7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9jbG9zZSk7CisKKy8qIGxvZ2dpbmcgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2xvZ2xldmVsKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3BlcnJvcik7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9zdHJlcnJvcik7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2Vycm5vKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2ZpbGVubyk7CisKKy8qIGRldmljZSBxdWVyaWVzICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfbl9zdWJkZXZpY2VzKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF92ZXJzaW9uX2NvZGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2RyaXZlcl9uYW1lKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9ib2FyZF9uYW1lKTsKKworLyogc3ViZGV2aWNlIHF1ZXJpZXMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9zdWJkZXZpY2VfdHlwZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9maW5kX3N1YmRldmljZV9ieV90eXBlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9zdWJkZXZpY2VfZmxhZ3MpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X25fY2hhbm5lbHMpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9yYW5nZV9pc19jaGFuX3NwZWNpZmljKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfbWF4ZGF0YV9pc19jaGFuX3NwZWNpZmljKTsKKworLyogY2hhbm5lbCBxdWVyaWVzICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfbWF4ZGF0YSk7CisjaWZkZWYgS0NPTUVESUxJQl9ERVBSRUNBVEVECitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfcmFuZ2V0eXBlKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X25fcmFuZ2VzKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZmluZF9yYW5nZSk7CisKKy8qIGJ1ZmZlciBxdWVyaWVzICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfYnVmZmVyX3NpemUpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfbWF4X2J1ZmZlcl9zaXplKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfc2V0X2J1ZmZlcl9zaXplKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9idWZmZXJfY29udGVudHMpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2J1ZmZlcl9vZmZzZXQpOworCisvKiBsb3ctbGV2ZWwgc3R1ZmYgKi8KKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfdHJpZ2dlcik7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2RvX2luc25saXN0KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RvX2luc24pOworRVhQT1JUX1NZTUJPTChjb21lZGlfbG9jayk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV91bmxvY2spOworCisvKiBwaHlzaWNhbCB1bml0cyAqLworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV90b19waHlzKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZnJvbV9waHlzKTsKKworLyogc3luY2hyb25vdXMgc3R1ZmYgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2RhdGFfcmVhZCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kYXRhX3JlYWRfaGludCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kYXRhX3JlYWRfZGVsYXllZCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kYXRhX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2Rpb19jb25maWcpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGlvX3JlYWQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGlvX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2Rpb19iaXRmaWVsZCk7CisKKy8qIHNsb3dseSB2YXJ5aW5nIHN0dWZmICovCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3N2X2luaXQpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9zdl91cGRhdGUpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9zdl9tZWFzdXJlKTsKKworLyogY29tbWFuZHMgKi8KKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2NtZF9zcmNfbWFzayk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9jbWRfZ2VuZXJpY190aW1lZCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9jYW5jZWwpOworRVhQT1JUX1NZTUJPTChjb21lZGlfY29tbWFuZCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9jb21tYW5kX3Rlc3QpOworRVhQT1JUX1NZTUJPTChjb21lZGlfcG9sbCk7CisKKy8qIGJ1ZmZlciBjb25maWd1cmF0aW9uICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9tYXJrX2J1ZmZlcl9yZWFkKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX21hcmtfYnVmZmVyX3dyaXR0ZW4pOworCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9yYW5nZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfbGVuX2NoYW5saXN0KTsKKworLyogZGVwcmVjYXRlZCAqLworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfdGltZXIpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV90aW1lZF8xY2hhbik7CisKKy8qIGFscGhhICovCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3NldF9nbG9iYWxfb29yX2JlaGF2aW9yKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3BjaV9pZHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcGNpX2lkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWJhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3BjaV9pZHMuaApAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQ09NUEFUX0xJTlVYX1BDSV9JRFNfSAorI2RlZmluZSBfX0NPTVBBVF9MSU5VWF9QQ0lfSURTX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FNQ0MKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTUNDCTB4MTBlOAorI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9DQk9BUkRTCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0JPQVJEUwkweDEzMDcKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfUVVBTkNPTQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1FVQU5DT00JMHg4MDA4CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FVQU5DT01fR1BJQgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FVQU5DT01fR1BJQgkweDMzMDIKKyNlbmRpZgorCisjZW5kaWYgLy8gX19DT01QQVRfTElOVVhfUENJX0lEU19ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmI3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3Byb2MuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAgICBtb2R1bGUvcHJvYy5jCisgICAgL3Byb2MgaW50ZXJmYWNlIGZvciBjb21lZGkKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworLyoKKwlUaGlzIGlzIHNvbWUgc2VyaW91cyBibG9hdHdhcmUuCisKKwlUYWtlbiBmcm9tIERhdmUgQS4ncyBQQ0wtNzExIGRyaXZlciwgJ2N1eiBJIHRob3VnaHQgaXQKKwl3YXMgY29vbC4KKyovCisKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisvLyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworaW50IGNvbWVkaV9yZWFkX3Byb2NtZW0oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwKKwlpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CisKK2V4dGVybiBjb21lZGlfZHJpdmVyICpjb21lZGlfZHJpdmVyczsKKworaW50IGNvbWVkaV9yZWFkX3Byb2NtZW0oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwKKwlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgZGV2aWNlc19xID0gMDsKKwlpbnQgbCA9IDA7CisJY29tZWRpX2RyaXZlciAqZHJpdjsKKworCWwgKz0gc3ByaW50ZihidWYgKyBsLAorCQkiY29tZWRpIHZlcnNpb24gIiBDT01FRElfUkVMRUFTRSAiXG4iCisJCSJmb3JtYXQgc3RyaW5nOiAlc1xuIiwKKwkJIlwiJTJkOiAlLTIwcyAlLTIwcyAlNGRcIixpLGRyaXZlcl9uYW1lLGJvYXJkX25hbWUsbl9zdWJkZXZpY2VzIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9CT0FSRF9NSU5PUlM7IGkrKykgeworCQlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8oaSk7CisJCWNvbWVkaV9kZXZpY2UgKmRldjsKKworCQlpZihkZXZfZmlsZV9pbmZvID09IE5VTEwpIGNvbnRpbnVlOworCQlkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwkJaWYgKGRldi0+YXR0YWNoZWQpIHsKKwkJCWRldmljZXNfcSA9IDE7CisJCQlsICs9IHNwcmludGYoYnVmICsgbCwgIiUyZDogJS0yMHMgJS0yMHMgJTRkXG4iLAorCQkJCWksCisJCQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLAorCQkJCWRldi0+Ym9hcmRfbmFtZSwgZGV2LT5uX3N1YmRldmljZXMpOworCQl9CisJfQorCWlmICghZGV2aWNlc19xKSB7CisJCWwgKz0gc3ByaW50ZihidWYgKyBsLCAibm8gZGV2aWNlc1xuIik7CisJfQorCisJZm9yIChkcml2ID0gY29tZWRpX2RyaXZlcnM7IGRyaXY7IGRyaXYgPSBkcml2LT5uZXh0KSB7CisJCWwgKz0gc3ByaW50ZihidWYgKyBsLCAiJXM6XG4iLCBkcml2LT5kcml2ZXJfbmFtZSk7CisJCWZvciAoaSA9IDA7IGkgPCBkcml2LT5udW1fbmFtZXM7IGkrKykgeworCQkJbCArPSBzcHJpbnRmKGJ1ZiArIGwsICIgJXNcbiIsCisJCQkJKihjaGFyICoqKSgoY2hhciAqKWRyaXYtPmJvYXJkX25hbWUgKworCQkJCQlpICogZHJpdi0+b2Zmc2V0KSk7CisJCX0KKwkJaWYgKCFkcml2LT5udW1fbmFtZXMpIHsKKwkJCWwgKz0gc3ByaW50ZihidWYgKyBsLCAiICVzXG4iLCBkcml2LT5kcml2ZXJfbmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gbDsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCit2b2lkIGNvbWVkaV9wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmNvbWVkaV9wcm9jOworCisJY29tZWRpX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeSgiY29tZWRpIiwgU19JRlJFRyB8IFNfSVJVR08sIDApOworCWlmIChjb21lZGlfcHJvYykKKwkJY29tZWRpX3Byb2MtPnJlYWRfcHJvYyA9IGNvbWVkaV9yZWFkX3Byb2NtZW07Cit9CisKK3ZvaWQgY29tZWRpX3Byb2NfY2xlYW51cCh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJjb21lZGkiLCAwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9yYW5nZS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9yYW5nZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZGMzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgICAgbW9kdWxlL3JhbmdlLmMKKyAgICBjb21lZGkgcm91dGluZXMgZm9yIHZvbHRhZ2UgcmFuZ2VzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgImNvbWVkaWRldi5oIgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK2NvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjEwID0geyAxLCB7QklQX1JBTkdFKDEwKX0gfTsKK2NvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjUgPSB7IDEsIHtCSVBfUkFOR0UoNSl9IH07Citjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIyXzUgPSB7IDEsIHtCSVBfUkFOR0UoMi41KX0gfTsKK2NvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdW5pcG9sYXIxMCA9IHsgMSwge1VOSV9SQU5HRSgxMCl9IH07Citjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VuaXBvbGFyNSA9IHsgMSwge1VOSV9SQU5HRSg1KX0gfTsKK2NvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdW5rbm93biA9IHsgMSwge3swLCAxMDAwMDAwLCBVTklUX25vbmV9fSB9OworCisvKgorICAgCUNPTUVESV9SQU5HRUlORk8KKwlyYW5nZSBpbmZvcm1hdGlvbiBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIHJhbmdlaW5mbyBzdHJ1Y3R1cmUKKworCXJlYWRzOgorCQlyYW5nZSBpbmZvIHN0cnVjdHVyZQorCisJd3JpdGVzOgorCQluIGNvbWVkaV9rcmFuZ2Ugc3RydWN0dXJlcyB0byByYW5nZWluZm8tPnJhbmdlX3B0cgorKi8KK2ludCBkb19yYW5nZWluZm9faW9jdGwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3JhbmdlaW5mbyAqIGFyZykKK3sKKwljb21lZGlfcmFuZ2VpbmZvIGl0OworCWludCBzdWJkLCBjaGFuOworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKmxyOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJml0LCBhcmcsIHNpemVvZihjb21lZGlfcmFuZ2VpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXN1YmQgPSAoaXQucmFuZ2VfdHlwZSA+PiAyNCkgJiAweGY7CisJY2hhbiA9IChpdC5yYW5nZV90eXBlID4+IDE2KSAmIDB4ZmY7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzdWJkID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZDsKKwlpZiAocy0+cmFuZ2VfdGFibGUpIHsKKwkJbHIgPSBzLT5yYW5nZV90YWJsZTsKKwl9IGVsc2UgaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QpIHsKKwkJaWYgKGNoYW4gPj0gcy0+bl9jaGFuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWxyID0gcy0+cmFuZ2VfdGFibGVfbGlzdFtjaGFuXTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoUkFOR0VfTEVOR1RIKGl0LnJhbmdlX3R5cGUpICE9IGxyLT5sZW5ndGgpIHsKKwkJRFBSSU5USygid3JvbmcgbGVuZ3RoICVkIHNob3VsZCBiZSAlZCAoMHglMDh4KVxuIiwKKwkJCVJBTkdFX0xFTkdUSChpdC5yYW5nZV90eXBlKSwgbHItPmxlbmd0aCwgaXQucmFuZ2VfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoaXQucmFuZ2VfcHRyLCBsci0+cmFuZ2UsCisJCQlzaXplb2YoY29tZWRpX2tyYW5nZSkgKiBsci0+bGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmVmX2ludmFsaWQoY29tZWRpX3N1YmRldmljZSAqIHMsIHVuc2lnbmVkIGludCBjaGFuc3BlYykKK3sKKwl1bnNpZ25lZCBpbnQgYXJlZjsKKworCS8vIGRpc2FibGUgcmVwb3J0aW5nIGludmFsaWQgYXJlZnMuLi4gbWF5YmUgc29tZWRheQorCXJldHVybiAwOworCisJYXJlZiA9IENSX0FSRUYoY2hhbnNwZWMpOworCXN3aXRjaCAoYXJlZikgeworCWNhc2UgQVJFRl9ESUZGOgorCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0RJRkYpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBBUkVGX0NPTU1PTjoKKwkJaWYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DT01NT04pCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBBUkVGX0dST1VORDoKKwkJaWYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9HUk9VTkQpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBBUkVGX09USEVSOgorCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX09USEVSKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlEUFJJTlRLKCJzdWJkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhcmVmICVpIiwgYXJlZik7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBlYWNoIGVsZW1lbnQgaW4gYSBjaGFubmVsL2dhaW4gbGlzdCB0byBtYWtlCisgICBtYWtlIHN1cmUgaXQgaXMgdmFsaWQuCisqLworaW50IGNoZWNrX2NoYW5saXN0KGNvbWVkaV9zdWJkZXZpY2UgKiBzLCBpbnQgbiwgdW5zaWduZWQgaW50ICpjaGFubGlzdCkKK3sKKwlpbnQgaTsKKwlpbnQgY2hhbjsKKworCWlmIChzLT5yYW5nZV90YWJsZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJaWYgKENSX0NIQU4oY2hhbmxpc3RbaV0pID49IHMtPm5fY2hhbiB8fAorCQkJCUNSX1JBTkdFKGNoYW5saXN0W2ldKSA+PSBzLT5yYW5nZV90YWJsZS0+bGVuZ3RoCisJCQkJfHwgYXJlZl9pbnZhbGlkKHMsIGNoYW5saXN0W2ldKSkgeworCQkJCXJ0X3ByaW50aworCQkJCQkoImJhZCBjaGFubGlzdFslZF09MHglMDh4IG5fY2hhbj0lZCByYW5nZSBsZW5ndGg9JWRcbiIsCisJCQkJCWksIGNoYW5saXN0W2ldLCBzLT5uX2NoYW4sCisJCQkJCXMtPnJhbmdlX3RhYmxlLT5sZW5ndGgpOworI2lmIDAKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJCXByaW50aygiWyVkXT0weCUwOHhcbiIsIGksIGNoYW5saXN0W2ldKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwl9IGVsc2UgaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QpIHsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJY2hhbiA9IENSX0NIQU4oY2hhbmxpc3RbaV0pOworCQkJaWYgKGNoYW4gPj0gcy0+bl9jaGFuIHx8CisJCQkJQ1JfUkFOR0UoY2hhbmxpc3RbaV0pID49CisJCQkJcy0+cmFuZ2VfdGFibGVfbGlzdFtjaGFuXS0+bGVuZ3RoCisJCQkJfHwgYXJlZl9pbnZhbGlkKHMsIGNoYW5saXN0W2ldKSkgeworCQkJCXJ0X3ByaW50aygiYmFkIGNoYW5saXN0WyVkXT0weCUwOHhcbiIsIGksCisJCQkJCWNoYW5saXN0W2ldKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJ0X3ByaW50aygiY29tZWRpOiAoYnVnKSBubyByYW5nZSB0eXBlIGxpc3QhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NWI4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0LmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgICAgY29tZWRpL3J0LmMKKyAgICBjb21lZGkga2VybmVsIG1vZHVsZQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyN1bmRlZiBERUJVRworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSA8bGludXgvY29tZWRpZGV2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAicnRfcGVuZF90cS5oIgorCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisjaW5jbHVkZSA8cnRhaS5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0ZVU0lPTgorI2luY2x1ZGUgPG51Y2xldXMvYXNtL2hhbC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUTAorI2luY2x1ZGUgPHJ0bF9jb3JlLmg+CisjaW5jbHVkZSA8cnRsX3N5bmMuaD4KKyNlbmRpZgorCitzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgeworCWludCBydDsKKwlpbnQgaXJxOworCSBpcnFyZXR1cm5fdCgqaGFuZGxlcikgKGludCBpcnEsIHZvaWQgKmRldl9pZCBQVF9SRUdTX0FSRyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb25zdCBjaGFyICpkZXZpY2U7CisJY29tZWRpX2RldmljZSAqZGV2X2lkOworfTsKKworc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KTsKK3N0YXRpYyBpbnQgY29tZWRpX3J0X3JlbGVhc2VfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpOworCitzdGF0aWMgc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICpjb21lZGlfaXJxc1tOUl9JUlFTXTsKKworaW50IGNvbWVkaV9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpcnEsIGlycXJldHVybl90KCpoYW5kbGVyKSAoaW50LAorCQl2b2lkICpQVF9SRUdTX0FSRyksIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldmljZSwKKwljb21lZGlfZGV2aWNlICogZGV2X2lkKQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisJaW50IHJldDsKKwkvKiBudWxsIHNoYXJlZCBpbnRlcnJ1cHQgZmxhZywgc2luY2UgcnQgaW50ZXJydXB0IGhhbmRsZXJzIGRvIG5vdAorCSAqIHN1cHBvcnQgaXQsIGFuZCB0aGlzIHZlcnNpb24gb2YgY29tZWRpX3JlcXVlc3RfaXJxKCkgaXMgb25seQorCSAqIGNhbGxlZCBmb3Iga2VybmVscyB3aXRoIHJ0IHN1cHBvcnQgKi8KKwl1bnNpZ25lZCBsb25nIHVuc2hhcmVkX2ZsYWdzID0gZmxhZ3MgJiB+SVJRRl9TSEFSRUQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGhhbmRsZXIsIHVuc2hhcmVkX2ZsYWdzLCBkZXZpY2UsIGRldl9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJLy8gd2UgZmFpbGVkLCBzbyBmYWxsIGJhY2sgb24gYWxsb3dpbmcgc2hhcmVkIGludGVycnVwdCAod2hpY2ggd2Ugd29uJ3QgZXZlciBtYWtlIFJUKQorCQlpZiAoZmxhZ3MgJiBJUlFGX1NIQVJFRCkgeworCQkJcnRfcHJpbnRrCisJCQkJKCJjb21lZGk6IGNhbm5vdCBnZXQgdW5zaGFyZWQgaW50ZXJydXB0LCB3aWxsIG5vdCB1c2UgUlQgaW50ZXJydXB0cy5cbiIpOworCQkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVyLCBmbGFncywgZGV2aWNlLCBkZXZfaWQpOworCQl9CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJaXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpdCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWl0LT5oYW5kbGVyID0gaGFuZGxlcjsKKwkJaXQtPmlycSA9IGlycTsKKwkJaXQtPmRldl9pZCA9IGRldl9pZDsKKwkJaXQtPmRldmljZSA9IGRldmljZTsKKwkJaXQtPmZsYWdzID0gdW5zaGFyZWRfZmxhZ3M7CisJCWNvbWVkaV9pcnFzW2lycV0gPSBpdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tZWRpX2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNvbWVkaV9kZXZpY2UgKiBkZXZfaWQpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdDsKKworCWZyZWVfaXJxKGlycSwgZGV2X2lkKTsKKworCWl0ID0gY29tZWRpX2lycXNbaXJxXTsKKwlpZiAoaXQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGl0LT5ydCkgeworCQlwcmludGsoInJlYWwtdGltZSBJUlEgYWxsb2NhdGVkIGF0IGJvYXJkIHJlbW92YWwgKGlnbm9yZSlcbiIpOworCQljb21lZGlfcnRfcmVsZWFzZV9pcnEoaXQpOworCX0KKworCWtmcmVlKGl0KTsKKwljb21lZGlfaXJxc1tpcnFdID0gTlVMTDsKK30KKworaW50IGNvbWVkaV9zd2l0Y2hfdG9fcnQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpdCA9IGNvbWVkaV9pcnFzW2Rldi0+aXJxXTsKKwkvKiBkcml2ZXJzIG1pZ2h0IG5vdCBiZSB1c2luZyBhbiBpbnRlcnJ1cHQgZm9yIGNvbW1hbmRzLAorCSAgIG9yIHdlIG1pZ2h0IG5vdCBoYXZlIGJlZW4gYWJsZSB0byBnZXQgYW4gdW5zaGFyZWQgaXJxICovCisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKCFkZXYtPnJ0KQorCQljb21lZGlfcnRfZ2V0X2lycShpdCk7CisKKwlkZXYtPnJ0Kys7CisJaXQtPnJ0ID0gMTsKKworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb21lZGlfc3dpdGNoX3RvX25vbl9ydChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWl0ID0gY29tZWRpX2lycXNbZGV2LT5pcnFdOworCWlmIChpdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWRldi0+cnQtLTsKKwlpZiAoIWRldi0+cnQpCisJCWNvbWVkaV9ydF9yZWxlYXNlX2lycShpdCk7CisKKwlpdC0+cnQgPSAwOworCisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCB3YWtlX3VwX2ludF9oYW5kbGVyKGludCBhcmcxLCB2b2lkICphcmcyKQoreworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgod2FpdF9xdWV1ZV9oZWFkX3QgKikgYXJnMik7Cit9CisKK3ZvaWQgY29tZWRpX3J0X3BlbmRfd2FrZXVwKHdhaXRfcXVldWVfaGVhZF90ICogcSkKK3sKKwlydF9wZW5kX2NhbGwod2FrZV91cF9pbnRfaGFuZGxlciwgMCwgcSk7Cit9CisKKy8qIFJUQUkgc2VjdGlvbiAqLworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorCisjaWZuZGVmIEhBVkVfUlRfUkVRVUVTVF9JUlFfV0lUSF9BUkcKKyNkZWZpbmUgREVDTEFSRV9WT0lEX0lSUShpcnEpIFwKK3N0YXRpYyB2b2lkIGhhbmRsZV92b2lkX2lycV8gIyMgaXJxICh2b2lkKXsgaGFuZGxlX3ZvaWRfaXJxKGlycSk7fQorCitzdGF0aWMgdm9pZCBoYW5kbGVfdm9pZF9pcnEoaW50IGlycSkKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0OworCisJaXQgPSBjb21lZGlfaXJxc1tpcnFdOworCWlmIChpdCA9PSBOVUxMKSB7CisJCXJ0X3ByaW50aygiY29tZWRpOiBudWxsIGlycSBzdHJ1Y3Q/XG4iKTsKKwkJcmV0dXJuOworCX0KKwlpdC0+aGFuZGxlcihpcnEsIGl0LT5kZXZfaWQgUFRfUkVHU19OVUxMKTsKKwlydF9lbmFibGVfaXJxKGlycSk7CS8vbmVlZGVkIGJ5IHJ0YWktYWRlb3MsIHNlZW1zIGxpa2UgaXQgc2hvdWxkbid0IGh1cnQgZWFybGllciB2ZXJzaW9ucworfQorCitERUNMQVJFX1ZPSURfSVJRKDApOworREVDTEFSRV9WT0lEX0lSUSgxKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMik7CitERUNMQVJFX1ZPSURfSVJRKDMpOworREVDTEFSRV9WT0lEX0lSUSg0KTsKK0RFQ0xBUkVfVk9JRF9JUlEoNSk7CitERUNMQVJFX1ZPSURfSVJRKDYpOworREVDTEFSRV9WT0lEX0lSUSg3KTsKK0RFQ0xBUkVfVk9JRF9JUlEoOCk7CitERUNMQVJFX1ZPSURfSVJRKDkpOworREVDTEFSRV9WT0lEX0lSUSgxMCk7CitERUNMQVJFX1ZPSURfSVJRKDExKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTIpOworREVDTEFSRV9WT0lEX0lSUSgxMyk7CitERUNMQVJFX1ZPSURfSVJRKDE0KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTUpOworREVDTEFSRV9WT0lEX0lSUSgxNik7CitERUNMQVJFX1ZPSURfSVJRKDE3KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTgpOworREVDTEFSRV9WT0lEX0lSUSgxOSk7CitERUNMQVJFX1ZPSURfSVJRKDIwKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMjEpOworREVDTEFSRV9WT0lEX0lSUSgyMik7CitERUNMQVJFX1ZPSURfSVJRKDIzKTsKKwordHlwZWRlZiB2b2lkICgqVl9GUF9WKSAodm9pZCk7CitzdGF0aWMgVl9GUF9WIGhhbmRsZV92b2lkX2lycV9wdHJzW10gPSB7CisJaGFuZGxlX3ZvaWRfaXJxXzAsCisJaGFuZGxlX3ZvaWRfaXJxXzEsCisJaGFuZGxlX3ZvaWRfaXJxXzIsCisJaGFuZGxlX3ZvaWRfaXJxXzMsCisJaGFuZGxlX3ZvaWRfaXJxXzQsCisJaGFuZGxlX3ZvaWRfaXJxXzUsCisJaGFuZGxlX3ZvaWRfaXJxXzYsCisJaGFuZGxlX3ZvaWRfaXJxXzcsCisJaGFuZGxlX3ZvaWRfaXJxXzgsCisJaGFuZGxlX3ZvaWRfaXJxXzksCisJaGFuZGxlX3ZvaWRfaXJxXzEwLAorCWhhbmRsZV92b2lkX2lycV8xMSwKKwloYW5kbGVfdm9pZF9pcnFfMTIsCisJaGFuZGxlX3ZvaWRfaXJxXzEzLAorCWhhbmRsZV92b2lkX2lycV8xNCwKKwloYW5kbGVfdm9pZF9pcnFfMTUsCisJaGFuZGxlX3ZvaWRfaXJxXzE2LAorCWhhbmRsZV92b2lkX2lycV8xNywKKwloYW5kbGVfdm9pZF9pcnFfMTgsCisJaGFuZGxlX3ZvaWRfaXJxXzE5LAorCWhhbmRsZV92b2lkX2lycV8yMCwKKwloYW5kbGVfdm9pZF9pcnFfMjEsCisJaGFuZGxlX3ZvaWRfaXJxXzIyLAorCWhhbmRsZV92b2lkX2lycV8yMywKK307CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X2dldF9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlydF9yZXF1ZXN0X2dsb2JhbF9pcnEoaXQtPmlycSwgaGFuZGxlX3ZvaWRfaXJxX3B0cnNbaXQtPmlycV0pOworCXJ0X3N0YXJ0dXBfaXJxKGl0LT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X3JlbGVhc2VfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJcnRfc2h1dGRvd25faXJxKGl0LT5pcnEpOworCXJ0X2ZyZWVfZ2xvYmFsX2lycShpdC0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X2dldF9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcnRfcmVxdWVzdF9nbG9iYWxfaXJxX2FyZyhpdC0+aXJxLCBpdC0+aGFuZGxlciwgaXQtPmZsYWdzLAorCQlpdC0+ZGV2aWNlLCBpdC0+ZGV2X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlydF9wcmludGsoInJ0X3JlcXVlc3RfZ2xvYmFsX2lycV9hcmcoKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcnRfc3RhcnR1cF9pcnEoaXQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlydF9zaHV0ZG93bl9pcnEoaXQtPmlycSk7CisJcnRfZnJlZV9nbG9iYWxfaXJxKGl0LT5pcnEpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3ZvaWQgY29tZWRpX3J0X2luaXQodm9pZCkKK3sKKwlydF9tb3VudF9ydGFpKCk7CisJcnRfcGVuZF90cV9pbml0KCk7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2NsZWFudXAodm9pZCkKK3sKKwlydF91bW91bnRfcnRhaSgpOworCXJ0X3BlbmRfdHFfY2xlYW51cCgpOworfQorCisjZW5kaWYKKworLyogRnVzaW9uIHNlY3Rpb24gKi8KKyNpZmRlZiBDT05GSUdfQ09NRURJX0ZVU0lPTgorCitzdGF0aWMgdm9pZCBmdXNpb25faGFuZGxlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpjb29raWUpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCA9IGNvb2tpZTsKKworCWl0LT5oYW5kbGVyKGlycSwgaXQtPmRldl9pZCBQVF9SRUdTX05VTEwpOworCXJ0aGFsX2lycV9lbmFibGUoaXJxKTsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0aGFsX2lycV9yZXF1ZXN0KGl0LT5pcnEsIGZ1c2lvbl9oYW5kbGVfaXJxLCBpdCk7CisJcnRoYWxfaXJxX2VuYWJsZShpdC0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlydGhhbF9pcnFfZGlzYWJsZShpdC0+aXJxKTsKKwlydGhhbF9pcnFfcmVsZWFzZShpdC0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb21lZGlfcnRfaW5pdCh2b2lkKQoreworCXJ0X3BlbmRfdHFfaW5pdCgpOworfQorCit2b2lkIGNvbWVkaV9ydF9jbGVhbnVwKHZvaWQpCit7CisJcnRfcGVuZF90cV9jbGVhbnVwKCk7Cit9CisKKyNlbmRpZiAvKkNPTkZJR19DT01FRElfRlVTSU9OICovCisKKy8qIFJUTGludXggc2VjdGlvbiAqLworI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFuZGxlX3J0bF9pcnEodW5zaWduZWQgaW50IGlycSBQVF9SRUdTX0FSRykKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0OworCisJaXQgPSBjb21lZGlfaXJxc1tpcnFdOworCWlmIChpdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpdC0+aGFuZGxlcihpcnEsIGl0LT5kZXZfaWQgUFRfUkVHU19OVUxMKTsKKwlydGxfaGFyZF9lbmFibGVfaXJxKGlycSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X2dldF9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlydGxfcmVxdWVzdF9nbG9iYWxfaXJxKGl0LT5pcnEsIGhhbmRsZV9ydGxfaXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlydGxfZnJlZV9nbG9iYWxfaXJxKGl0LT5pcnEpOworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9ydF9pbml0KHZvaWQpCit7CisJcnRfcGVuZF90cV9pbml0KCk7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2NsZWFudXAodm9pZCkKK3sKKwlydF9wZW5kX3RxX2NsZWFudXAoKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1BJUlEKK3N0YXRpYyBpbnQgY29tZWRpX3J0X2dldF9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlpbnQgcmV0OworCisJZnJlZV9pcnEoaXQtPmlycSwgaXQtPmRldl9pZCk7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPmlycSwgaXQtPmhhbmRsZXIsIGl0LT5mbGFncyB8IFNBX1BSSU9SSVRZLAorCQlpdC0+ZGV2aWNlLCBpdC0+ZGV2X2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X3JlbGVhc2VfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJaW50IHJldDsKKworCWZyZWVfaXJxKGl0LT5pcnEsIGl0LT5kZXZfaWQpOworCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5pcnEsIGl0LT5oYW5kbGVyLCBpdC0+ZmxhZ3MsCisJCWl0LT5kZXZpY2UsIGl0LT5kZXZfaWQpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjb21lZGlfcnRfaW5pdCh2b2lkKQoreworCS8vcnRfcGVuZF90cV9pbml0KCk7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2NsZWFudXAodm9pZCkKK3sKKwkvL3J0X3BlbmRfdHFfY2xlYW51cCgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0X3BlbmRfdHEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NWYwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0X3BlbmRfdHEuYwpAQCAtMCwwICsxLDExMyBAQAorI2RlZmluZSBfX05PX1ZFUlNJT05fXworLyogcnRfcGVuZF90cS5jICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgImNvbWVkaWRldi5oIgkvLyBmb3IgcnQgc3BpbmxvY2tzCisjaW5jbHVkZSAicnRfcGVuZF90cS5oIgorI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorI2luY2x1ZGUgPHJ0YWkuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisjaW5jbHVkZSA8bnVjbGV1cy9hc20vaGFsLmg+CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUTAorI2luY2x1ZGUgPHJ0bF9jb3JlLmg+CisjZW5kaWYKKworI2lmZGVmIHN0YW5kYWxvbmUKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNkZWZpbmUgcnRfcGVuZF90cV9pbml0IGluaXRfbW9kdWxlCisjZGVmaW5lIHJ0X3BlbmRfdHFfY2xlYW51cCBjbGVhbnVwX21vZHVsZQorI2VuZGlmCisKK3ZvbGF0aWxlIHN0YXRpYyBzdHJ1Y3QgcnRfcGVuZF90cSBydF9wZW5kX3RxW1JUX1BFTkRfVFFfU0laRV07Cit2b2xhdGlsZSBzdGF0aWMgc3RydWN0IHJ0X3BlbmRfdHEgKnZvbGF0aWxlIHJ0X3BlbmRfaGVhZCA9IHJ0X3BlbmRfdHEsCisJKnZvbGF0aWxlIHJ0X3BlbmRfdGFpbCA9IHJ0X3BlbmRfdHE7CitpbnQgcnRfcGVuZF90cV9pcnEgPSAwOworc3BpbmxvY2tfdCBydF9wZW5kX3RxX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKKy8vIFdBUk5JTkc6IGZvbGxvd2luZyBjb2RlIG5vdCBjaGVja2VkIGFnYWluc3QgcmFjZSBjb25kaXRpb25zIHlldC4KKyNkZWZpbmUgSU5DX0NJUkNVTEFSX1BUUihwdHIsYmVnaW4sc2l6ZSkgZG8ge2lmKCsrKHB0cik+PShiZWdpbikrKHNpemUpKSAocHRyKT0oYmVnaW4pOyB9IHdoaWxlKDApCisjZGVmaW5lIERFQ19DSVJDVUxBUl9QVFIocHRyLGJlZ2luLHNpemUpIGRvIHtpZigtLShwdHIpPChiZWdpbikpIChwdHIpPShiZWdpbikrKHNpemUpLTE7IH0gd2hpbGUoMCkKKworaW50IHJ0X3BlbmRfY2FsbCh2b2lkICgqZnVuYykgKGludCBhcmcxLCB2b2lkICphcmcyKSwgaW50IGFyZzEsIHZvaWQgKmFyZzIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChmdW5jID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChydF9wZW5kX3RxX2lycSA8PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnJ0X3BlbmRfdHFfbG9jaywgZmxhZ3MpOworCUlOQ19DSVJDVUxBUl9QVFIocnRfcGVuZF9oZWFkLCBydF9wZW5kX3RxLCBSVF9QRU5EX1RRX1NJWkUpOworCWlmIChydF9wZW5kX2hlYWQgPT0gcnRfcGVuZF90YWlsKSB7CisJCS8vIG92ZXJmbG93LCB3ZSBqdXN0IHJlZnVzZSB0byB0YWtlIHRoaXMgcmVxdWVzdAorCQlERUNfQ0lSQ1VMQVJfUFRSKHJ0X3BlbmRfaGVhZCwgcnRfcGVuZF90cSwgUlRfUEVORF9UUV9TSVpFKTsKKwkJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0X3BlbmRfdHFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcnRfcGVuZF9oZWFkLT5mdW5jID0gZnVuYzsKKwlydF9wZW5kX2hlYWQtPmFyZzEgPSBhcmcxOworCXJ0X3BlbmRfaGVhZC0+YXJnMiA9IGFyZzI7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0X3BlbmRfdHFfbG9jaywgZmxhZ3MpOworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorCXJ0X3BlbmRfbGludXhfc3JxKHJ0X3BlbmRfdHFfaXJxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisJcnRoYWxfYXBjX3NjaGVkdWxlKHJ0X3BlbmRfdHFfaXJxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisJcnRsX2dsb2JhbF9wZW5kX2lycShydF9wZW5kX3RxX2lycSk7CisKKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCit2b2lkIHJ0X3BlbmRfaXJxX2hhbmRsZXIodm9pZCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPTUVESV9GVVNJT04pCit2b2lkIHJ0X3BlbmRfaXJxX2hhbmRsZXIodm9pZCAqY29va2llKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTCkKK3ZvaWQgcnRfcGVuZF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYgUFRfUkVHU19BUkcpCisjZW5kaWYKK3sKKwl3aGlsZSAocnRfcGVuZF9oZWFkICE9IHJ0X3BlbmRfdGFpbCkgeworCQlJTkNfQ0lSQ1VMQVJfUFRSKHJ0X3BlbmRfdGFpbCwgcnRfcGVuZF90cSwgUlRfUEVORF9UUV9TSVpFKTsKKwkJcnRfcGVuZF90YWlsLT5mdW5jKHJ0X3BlbmRfdGFpbC0+YXJnMSwgcnRfcGVuZF90YWlsLT5hcmcyKTsKKwl9Cit9CisKK2ludCBydF9wZW5kX3RxX2luaXQodm9pZCkKK3sKKwlydF9wZW5kX2hlYWQgPSBydF9wZW5kX3RhaWwgPSBydF9wZW5kX3RxOworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorCXJ0X3BlbmRfdHFfaXJxID0gcnRfcmVxdWVzdF9zcnEoMCwgcnRfcGVuZF9pcnFfaGFuZGxlciwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX0ZVU0lPTgorCXJ0X3BlbmRfdHFfaXJxID0KKwkJcnRoYWxfYXBjX2FsbG9jKCJjb21lZGkgQVBDIiwgcnRfcGVuZF9pcnFfaGFuZGxlciwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUTAorCXJ0X3BlbmRfdHFfaXJxID0gcnRsX2dldF9zb2Z0X2lycShydF9wZW5kX2lycV9oYW5kbGVyLCAicnRfcGVuZF9pcnEiKTsKKyNlbmRpZgorCWlmIChydF9wZW5kX3RxX2lycSA+IDApCisJCXByaW50aygicnRfcGVuZF90cTogUlQgYm90dG9tIGhhbGYgc2NoZWR1bGVyIGluaXRpYWxpemVkIE9LXG4iKTsKKwllbHNlCisJCXByaW50aygicnRfcGVuZF90cTogcnRsX2dldF9zb2Z0X2lycSBmYWlsZWRcbiIpOworCXJldHVybiAwOworfQorCit2b2lkIHJ0X3BlbmRfdHFfY2xlYW51cCh2b2lkKQoreworCXByaW50aygicnRfcGVuZF90cTogdW5sb2FkaW5nXG4iKTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKwlydF9mcmVlX3NycShydF9wZW5kX3RxX2lycSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX0ZVU0lPTgorCXJ0aGFsX2FwY19mcmVlKHJ0X3BlbmRfdHFfaXJxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisJZnJlZV9pcnEocnRfcGVuZF90cV9pcnEsIE5VTEwpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0X3BlbmRfdHEuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWQ3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0X3BlbmRfdHEuaApAQCAtMCwwICsxLDEwIEBACisjZGVmaW5lIFJUX1BFTkRfVFFfU0laRSAxNgorc3RydWN0IHJ0X3BlbmRfdHEgeworCXZvaWQgKCpmdW5jKSAoaW50IGFyZzEsIHZvaWQgKmFyZzIpOworCWludCBhcmcxOworCXZvaWQgKmFyZzI7Cit9OworZXh0ZXJuIGludCBydF9wZW5kX2NhbGwodm9pZCAoKmZ1bmMpIChpbnQgYXJnMSwgdm9pZCAqYXJnMiksIGludCBhcmcxLAorCXZvaWQgKmFyZzIpOworZXh0ZXJuIGludCBydF9wZW5kX3RxX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBydF9wZW5kX3RxX2NsZWFudXAodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3dyYXBwZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvd3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZmM2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3dyYXBwZXIuaApAQCAtMCwwICsxLDI1IEBACisvKgorICAgIGxpbnV4L3dyYXBwZXIuaCBjb21wYXRpYmlsaXR5IGhlYWRlcgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0NPTVBBVF9MSU5VWF9XUkFQUEVSX0hfCisjZGVmaW5lIF9fQ09NUEFUX0xJTlVYX1dSQVBQRVJfSF8KKworI2RlZmluZSBtZW1fbWFwX3Jlc2VydmUocCkgICAgICBzZXRfYml0KFBHX3Jlc2VydmVkLCAmKChwKS0+ZmxhZ3MpKQorI2RlZmluZSBtZW1fbWFwX3VucmVzZXJ2ZShwKSAgICBjbGVhcl9iaXQoUEdfcmVzZXJ2ZWQsICYoKHApLT5mbGFncykpCisKKyNlbmRpZiAvKiBfX0NPTVBBVF9MSU5VWF9XUkFQUEVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vVE9ETwppbmRleCAxY2EwOWFmLi5mNmQ4NTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8KQEAgLTEsNyArMSw1IEBACiBUT0RPOgogCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcwotCS0gTGluZGVudAotCS0gdHlwZWRlZiByZW1vdmFscwogCS0gaGFuZGxlIGJpdF9vcGVyYXRpb25zLmggKG1lcmdlIGluIG9yIG1ha2UgcGFydCBvZiBjb21tb24gY29kZT8pCiAJLSByZW1vdmUgcHJvYyBpbnRlcmZhY2UsIG9ubHkgdXNlIGVjaG8uaCBpbnRlcmZhY2UgKHByb2MgaW50ZXJmYWNlIGlzCiAJICByYWN5IGFuZCBub3QgY29ycmVjdC4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9lY2hvLmggYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9lY2hvLmgKaW5kZXggOWZiOTU0My4uMzRmYjgxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uaApAQCAtMTQ5LDggKzE0OSw4IEBACiAJaW50IExiZ24sIExiZ25fYWNjLCBMYmduX3VwcGVyLCBMYmduX3VwcGVyX2FjYzsKIAogCS8qIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgZmlsdGVyIHN0YXRlcyAqLwotCWZpcjE2X3N0YXRlX3QgZmlyX3N0YXRlOwotCWZpcjE2X3N0YXRlX3QgZmlyX3N0YXRlX2JnOworCXN0cnVjdCBmaXIxNl9zdGF0ZV90IGZpcl9zdGF0ZTsKKwlzdHJ1Y3QgZmlyMTZfc3RhdGVfdCBmaXJfc3RhdGVfYmc7CiAJaW50MTZfdCAqZmlyX3RhcHMxNlsyXTsKIAogCS8qIERDIGJsb2NraW5nIGZpbHRlciBzdGF0ZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2Zpci5oIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vZmlyLmgKaW5kZXggNTY0NWNiMS4uZDM1ZjE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vZmlyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vZmlyLmgKQEAgLTcyLDM3ICs3MiwzNyBAQAogICAgIDE2IGJpdCBpbnRlZ2VyIEZJUiBkZXNjcmlwdG9yLiBUaGlzIGRlZmluZXMgdGhlIHdvcmtpbmcgc3RhdGUgZm9yIGEgc2luZ2xlCiAgICAgaW5zdGFuY2Ugb2YgYW4gRklSIGZpbHRlciB1c2luZyAxNiBiaXQgaW50ZWdlciBjb2VmZmljaWVudHMuCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGZpcjE2X3N0YXRlX3QgewogCWludCB0YXBzOwogCWludCBjdXJyX3BvczsKIAljb25zdCBpbnQxNl90ICpjb2VmZnM7CiAJaW50MTZfdCAqaGlzdG9yeTsKLX0gZmlyMTZfc3RhdGVfdDsKK307CiAKIC8qIQogICAgIDMyIGJpdCBpbnRlZ2VyIEZJUiBkZXNjcmlwdG9yLiBUaGlzIGRlZmluZXMgdGhlIHdvcmtpbmcgc3RhdGUgZm9yIGEgc2luZ2xlCiAgICAgaW5zdGFuY2Ugb2YgYW4gRklSIGZpbHRlciB1c2luZyAzMiBiaXQgaW50ZWdlciBjb2VmZmljaWVudHMsIGFuZCBmaWx0ZXJpbmcKICAgICAxNiBiaXQgaW50ZWdlciBkYXRhLgogKi8KLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCBmaXIzMl9zdGF0ZV90IHsKIAlpbnQgdGFwczsKIAlpbnQgY3Vycl9wb3M7CiAJY29uc3QgaW50MzJfdCAqY29lZmZzOwogCWludDE2X3QgKmhpc3Rvcnk7Ci19IGZpcjMyX3N0YXRlX3Q7Cit9OwogCiAvKiEKICAgICBGbG9hdGluZyBwb2ludCBGSVIgZGVzY3JpcHRvci4gVGhpcyBkZWZpbmVzIHRoZSB3b3JraW5nIHN0YXRlIGZvciBhIHNpbmdsZQogICAgIGluc3RhbmNlIG9mIGFuIEZJUiBmaWx0ZXIgdXNpbmcgZmxvYXRpbmcgcG9pbnQgY29lZmZpY2llbnRzIGFuZCBkYXRhLgogKi8KLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCBmaXJfZmxvYXRfc3RhdGVfdCB7CiAJaW50IHRhcHM7CiAJaW50IGN1cnJfcG9zOwogCWNvbnN0IGZsb2F0ICpjb2VmZnM7CiAJZmxvYXQgKmhpc3Rvcnk7Ci19IGZpcl9mbG9hdF9zdGF0ZV90OworfTsKIAotc3RhdGljIF9faW5saW5lX18gY29uc3QgaW50MTZfdCAqZmlyMTZfY3JlYXRlKGZpcjE2X3N0YXRlX3QgKiBmaXIsCitzdGF0aWMgX19pbmxpbmVfXyBjb25zdCBpbnQxNl90ICpmaXIxNl9jcmVhdGUoc3RydWN0IGZpcjE2X3N0YXRlX3QgKmZpciwKIAkJCQkJICAgICAgY29uc3QgaW50MTZfdCAqIGNvZWZmcywgaW50IHRhcHMpCiB7CiAJZmlyLT50YXBzID0gdGFwczsKQEAgLTExNiw3ICsxMTYsNyBAQAogCXJldHVybiBmaXItPmhpc3Rvcnk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMTZfZmx1c2goZmlyMTZfc3RhdGVfdCAqIGZpcikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMTZfZmx1c2goc3RydWN0IGZpcjE2X3N0YXRlX3QgKmZpcikKIHsKICNpZiBkZWZpbmVkKFVTRV9NTVgpICB8fCAgZGVmaW5lZChVU0VfU1NFMikgfHwgZGVmaW5lZChfX2JmaW5fXykKIAltZW1zZXQoZmlyLT5oaXN0b3J5LCAwLCAyICogZmlyLT50YXBzICogc2l6ZW9mKGludDE2X3QpKTsKQEAgLTEyNSw3ICsxMjUsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMTZfZnJlZShmaXIxNl9zdGF0ZV90ICogZmlyKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIxNl9mcmVlKHN0cnVjdCBmaXIxNl9zdGF0ZV90ICpmaXIpCiB7CiAJa2ZyZWUoZmlyLT5oaXN0b3J5KTsKIH0KQEAgLTE1NywxOSArMTU3LDE5IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIF9faW5saW5lX18gaW50MTZfdCBmaXIxNihmaXIxNl9zdGF0ZV90ICogZmlyLCBpbnQxNl90IHNhbXBsZSkKK3N0YXRpYyBfX2lubGluZV9fIGludDE2X3QgZmlyMTYoc3RydWN0IGZpcjE2X3N0YXRlX3QgKmZpciwgaW50MTZfdCBzYW1wbGUpCiB7CiAJaW50MzJfdCB5OwogI2lmIGRlZmluZWQoVVNFX01NWCkKIAlpbnQgaTsKLQltbXhfdCAqbW14X2NvZWZmczsKLQltbXhfdCAqbW14X2hpc3Q7CisJdW5pb24gbW14X3QgKm1teF9jb2VmZnM7CisJdW5pb24gbW14X3QgKm1teF9oaXN0OwogCiAJZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3NdID0gc2FtcGxlOwogCWZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zICsgZmlyLT50YXBzXSA9IHNhbXBsZTsKIAotCW1teF9jb2VmZnMgPSAobW14X3QgKikgZmlyLT5jb2VmZnM7Ci0JbW14X2hpc3QgPSAobW14X3QgKikgJiBmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3Bvc107CisJbW14X2NvZWZmcyA9ICh1bmlvbiBtbXhfdCAqKWZpci0+Y29lZmZzOworCW1teF9oaXN0ID0gKHVuaW9uIG1teF90ICopJmZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zXTsKIAlpID0gZmlyLT50YXBzOwogCXB4b3JfcjJyKG1tNCwgbW00KTsKIAkvKiA4IHNhbXBsZXMgcGVyIGl0ZXJhdGlvbiwgc28gdGhlIGZpbHRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBsb25nLiAqLwpAQCAtMTkzLDE0ICsxOTMsMTQgQEAKIAllbW1zKCk7CiAjZWxpZiBkZWZpbmVkKFVTRV9TU0UyKQogCWludCBpOwotCXhtbV90ICp4bW1fY29lZmZzOwotCXhtbV90ICp4bW1faGlzdDsKKwl1bmlvbiB4bW1fdCAqeG1tX2NvZWZmczsKKwl1bmlvbiB4bW1fdCAqeG1tX2hpc3Q7CiAKIAlmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3Bvc10gPSBzYW1wbGU7CiAJZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3MgKyBmaXItPnRhcHNdID0gc2FtcGxlOwogCi0JeG1tX2NvZWZmcyA9ICh4bW1fdCAqKSBmaXItPmNvZWZmczsKLQl4bW1faGlzdCA9ICh4bW1fdCAqKSAmIGZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zXTsKKwl4bW1fY29lZmZzID0gKHVuaW9uIHhtbV90ICopZmlyLT5jb2VmZnM7CisJeG1tX2hpc3QgPSAodW5pb24geG1tX3QgKikmZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3NdOwogCWkgPSBmaXItPnRhcHM7CiAJcHhvcl9yMnIoeG1tNCwgeG1tNCk7CiAJLyogMTYgc2FtcGxlcyBwZXIgaXRlcmF0aW9uLCBzbyB0aGUgZmlsdGVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBsb25nLiAqLwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJcmV0dXJuIChpbnQxNl90KSAoeSA+PiAxNSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGNvbnN0IGludDE2X3QgKmZpcjMyX2NyZWF0ZShmaXIzMl9zdGF0ZV90ICogZmlyLAorc3RhdGljIF9faW5saW5lX18gY29uc3QgaW50MTZfdCAqZmlyMzJfY3JlYXRlKHN0cnVjdCBmaXIzMl9zdGF0ZV90ICpmaXIsCiAJCQkJCSAgICAgIGNvbnN0IGludDMyX3QgKiBjb2VmZnMsIGludCB0YXBzKQogewogCWZpci0+dGFwcyA9IHRhcHM7CkBAIC0yNjAsMTcgKzI2MCwxNyBAQAogCXJldHVybiBmaXItPmhpc3Rvcnk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMzJfZmx1c2goZmlyMzJfc3RhdGVfdCAqIGZpcikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMzJfZmx1c2goc3RydWN0IGZpcjMyX3N0YXRlX3QgKmZpcikKIHsKIAltZW1zZXQoZmlyLT5oaXN0b3J5LCAwLCBmaXItPnRhcHMgKiBzaXplb2YoaW50MTZfdCkpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjMyX2ZyZWUoZmlyMzJfc3RhdGVfdCAqIGZpcikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMzJfZnJlZShzdHJ1Y3QgZmlyMzJfc3RhdGVfdCAqZmlyKQogewogCWtmcmVlKGZpci0+aGlzdG9yeSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludDE2X3QgZmlyMzIoZmlyMzJfc3RhdGVfdCAqIGZpciwgaW50MTZfdCBzYW1wbGUpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQxNl90IGZpcjMyKHN0cnVjdCBmaXIzMl9zdGF0ZV90ICpmaXIsIGludDE2X3Qgc2FtcGxlKQogewogCWludCBpOwogCWludDMyX3QgeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL21teC5oIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vbW14LmgKaW5kZXggMzU0MTJlZi4uNDRlNWNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vbW14LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vbW14LmgKQEAgLTI3LDcgKzI3LDcgQEAKICAqIHZhbHVlcyBieSBVTEwsIGxlc3QgdGhleSBiZSB0cnVuY2F0ZWQgYnkgdGhlIGNvbXBpbGVyKQogICovCiAKLXR5cGVkZWYgdW5pb24gewordW5pb24gbW14X3QgewogCWxvbmcgbG9uZyBxOwkJLyogUXVhZHdvcmQgKDY0LWJpdCkgdmFsdWUgKi8KIAl1bnNpZ25lZCBsb25nIGxvbmcgdXE7CS8qIFVuc2lnbmVkIFF1YWR3b3JkICovCiAJaW50IGRbMl07CQkvKiAyIERvdWJsZXdvcmQgKDMyLWJpdCkgdmFsdWVzICovCkBAIC0zNywxMiArMzcsMTIgQEAKIAljaGFyIGJbOF07CQkvKiA4IEJ5dGUgKDgtYml0KSB2YWx1ZXMgKi8KIAl1bnNpZ25lZCBjaGFyIHViWzhdOwkvKiA4IFVuc2lnbmVkIEJ5dGUgKi8KIAlmbG9hdCBzWzJdOwkJLyogU2luZ2xlLXByZWNpc2lvbiAoMzItYml0KSB2YWx1ZSAqLwotfSBtbXhfdDsJCQkvKiBPbiBhbiA4LWJ5dGUgKDY0LWJpdCkgYm91bmRhcnkgKi8KK307CQkJCS8qIE9uIGFuIDgtYnl0ZSAoNjQtYml0KSBib3VuZGFyeSAqLwogCiAvKiBTU0UgcmVnaXN0ZXJzICovCi10eXBlZGVmIHVuaW9uIHsKK3VuaW9uIHhtbV90IHsKIAljaGFyIGJbMTZdOwotfSB4bW1fdDsKK307CiAKICNkZWZpbmUgICAgICAgICBtbXhfaTJyKG9wLGltbSxyZWcpIFwKICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0JlbmNobWFyay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9CZW5jaG1hcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmRlZTNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9CZW5jaG1hcmsuaApAQCAtMCwwICsxLDQzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGhlYWRlciBmaWxlIGZvciBiZW5jaG1hcmtpbmcKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBCZW5jaG1hcmsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOC8xNiBkLmsuOiAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQkVOQ0hNQVJLX0hfCisjZGVmaW5lIF9CRU5DSE1BUktfSF8KKworI2luY2x1ZGUgImdsb2JhbC5oIgorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX05PX09TXykgJiYgKERFVl9TWVNURU0gPT0gX0RFVl9HTlVfQ0Y1NDhYXykKKyNpbmNsdWRlICJjb21tb24uaCIKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCisvLyAgICAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpZmRlZiBDT05GSUdfQ09MREZJUkUKKyNpbmNsdWRlIDxhc20vY29sZGZpcmUuaD4KKyNpbmNsdWRlIDxhc20vbTU0ODVncGlvLmg+CisKKyNkZWZpbmUgQkVOQ0hNQVJLX1NFVCh4KSAgICBNQ0ZfR1BJT19QT0RSX1BDSUJHIHw9ICgxIDw8ICh4KSkJLy8gKHgrMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1JFU0VUKHgpICBNQ0ZfR1BJT19QT0RSX1BDSUJHICY9IH4oMSA8PCAoeCkpCS8vICh4KzEpCisjZGVmaW5lIEJFTkNITUFSS19UT0dHTEUoeCkgTUNGX0dQSU9fUE9EUl9QQ0lCUiBePSAoMSA8PCAoeCAtIDUpKQorI2Vsc2UKKyN1bmRlZiBCRU5DSE1BUktfTU9EVUxFUworI2RlZmluZSBCRU5DSE1BUktfTU9EVUxFUyAgICAgICAgICAgMHgwMDAwMDAwMAorI2VuZGlmCisKKyNlbHNlCisgICAgLy8gZGlzYWJsZSBCZW5jaG1hcmtpbmcKKyN1bmRlZiBCRU5DSE1BUktfTU9EVUxFUworI2RlZmluZSBCRU5DSE1BUktfTU9EVUxFUyAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBCRU5DSE1BUktfTU9EVUxFUworI2RlZmluZSBCRU5DSE1BUktfTU9EVUxFUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZW5kaWYKKworI2RlZmluZSBCRU5DSE1BUktfTU9EXzAxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA0ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA3ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEzICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE2ICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOCAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE5ICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMSAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIyICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjMgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNCAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI1ICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjYgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNyAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI4ICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjkgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMCAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMxICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzIgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDEpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDFfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAxX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAxX1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDFfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDFfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wMikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDJfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDJfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMl9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzAzKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wM19SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wM19UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDQpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDRfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA0X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA0X1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDRfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDRfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wNSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDVfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDVfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNV9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzA2KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNl9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2X1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDcpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDdfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA3X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDdfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDdfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wOCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDhfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDhfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOF9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzA5KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOV9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5X1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTApCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTBfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEwX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzExKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzExX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTFfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTFfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xMikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTJfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEyX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEyX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTMpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTNfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEzX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xM19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xM19SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzE0KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE0X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTRfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTRfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xNSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTVfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE1X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE1X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTYpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTZfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE2X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNl9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzE3KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE3X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xN19SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTdfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTdfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xOCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMThfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE4X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE4X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTkpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTlfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE5X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzIwKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIwX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjBfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjBfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjFfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIxX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIxX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjIpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjJfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIyX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMl9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzIzKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIzX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yM19SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjNfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjNfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yNCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjRfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI0X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI0X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjUpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjVfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI1X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzI2KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI2X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjZfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjZfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yNykKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yN19TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjdfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI3X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI3X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjhfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI4X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzI5KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI5X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjlfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjlfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8zMCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzBfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMwX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMwX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMzEpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzFfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMxX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzMyKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMyX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzJfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzJfUkVTRVQoeCkKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyBfQkVOQ0hNQVJLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkZTlkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRGVidWcuaApAQCAtMCwwICsxLDczNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIERlYnVnIGludGVyZmFjZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IERlYnVnLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIC4uLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9ERUJVR19IXworI2RlZmluZSBfREVCVUdfSF8KKworI2luY2x1ZGUgImdsb2JhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoZXNlIGRlZmluaXRpb25zIGFyZSBpbXBvcnRhbnQgZm9yIGxldmVsLWRlYnVnIHRyYWNlcy4KKy8vIEEgbWFjcm8gREVCVUdfR0xCX0xWTCgpIGRlZmluZXMgdGhlIGN1cnJlbnQgZGVidWctbGV2ZWwgdXNpbmcgZm9sbG93aW5nIGJpcy4KKy8vIElmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpcyBzZXQgdGhlbiB0cmFjZSBtZXNzYWdlIHdpbGwgYmUgcHJpbnRlZCBvdXQKKy8vIChvbmx5IGlmIE5ERUJVRyBpcyBub3QgZGVmaW5lZCkuIFRoZSB1cHBlciBkZWJ1Zy1sZXZlbHMgYXJlIHJlc2VydmVkIGZvcgorLy8gdGhlIGRlYnVnLWxldmVscyBBTFdBWVMsIEVSUk9SIGFuZCBBU1NFUlQuCisjZGVmaW5lIERFQlVHX0xWTF8wMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBERUJVR19MVkxfMDIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgREVCVUdfTFZMXzAzICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERFQlVHX0xWTF8wNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBERUJVR19MVkxfMDUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgREVCVUdfTFZMXzA2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIERFQlVHX0xWTF8wNyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBERUJVR19MVkxfMDggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgREVCVUdfTFZMXzA5ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIERFQlVHX0xWTF8xMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBERUJVR19MVkxfMTEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgREVCVUdfTFZMXzEyICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIERFQlVHX0xWTF8xMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBERUJVR19MVkxfMTQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzE1ICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIERFQlVHX0xWTF8xNiAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBERUJVR19MVkxfMTcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzE4ICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8xOSAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBERUJVR19MVkxfMjAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzIxICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yMiAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjMgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzI0ICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yNSAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjYgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzI3ICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yOCAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjkgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVCAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUiAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgbWFjcm9zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGhpcyBtYWNybyBkZWZpbmVzIGEgdmVyc2lvbiBzdHJpbmcKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGhpcyBtYWNybyBkZWZpbmVzIGEgYnVpbGQgaW5mbyBzdHJpbmcgKGUuZy4gZm9yIHVzaW5nIGluIHByaW50ZigpKQorI2RlZmluZSBERUJVR19NQUtFX0JVSUxEX0lORk8ocHJlZml4LHByb2R1Y3QscHJvZGlkLGRlc2NyLHZlcnN0cixhdXRob3IpICJcbiIgXAorICAgIHByZWZpeCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iIFwKKyAgICBwcmVmaXggIlByb2plY3Q6ICAgIiBwcm9kdWN0ICIsICIgcHJvZGlkICAgICAgICAgICAgICAgICAgIlxuIiBcCisgICAgcHJlZml4ICJEZXNjcmlwdC46ICIgZGVzY3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgXAorICAgIHByZWZpeCAiQXV0aG9yOiAgICAiIGF1dGhvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iIFwKKyAgICBwcmVmaXggIkRhdGU6ICAgICAgIiBfX0RBVEVfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiBcCisgICAgcHJlZml4ICJWZXJzaW9uOiAgICIgdmVyc3RyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgXAorICAgIHByZWZpeCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBkZWZhdWx0IGRlYnVnLWxldmVsIGlzOiBFUlJPUiBhbmQgQUxXQVlTLgorLy8gWW91IGNhbiBkZWZpbmUgYW4gb3RoZXIgZGVidWctbGV2ZWwgaW4gcHJvamVjdCBzZXR0aW5ncy4KKyNpZm5kZWYgREVGX0RFQlVHX0xWTAorI2RlZmluZSBERUZfREVCVUdfTFZMICAgICAgICAgICAgICAgICAgIChERUJVR19MVkxfQUxXQVlTIHwgREVCVUdfTFZMX0VSUk9SKQorI2VuZGlmCisjaWZuZGVmIERFQlVHX0dMQl9MVkwKKyNkZWZpbmUgREVCVUdfR0xCX0xWTCgpICAgICAgICAgICAgICAgICAoREVGX0RFQlVHX0xWTCkKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChERVZfU1lTVEVNID09IF9ERVZfV0lOMzJfKSAmJiBkZWZpbmVkIChUUkFDRV9NU0cpCisKKyAgICAvLyBGb3IgV0lOMzIgdGhlIG1hY3JvIERFQlVHX1RSQUNFMCBjYW4gYmUgZGVmaW5lZCBhcyBmdW5jdGlvbiBjYWxsIFRyYWNlTHZsKCkKKyAgICAvLyBvciBhcyBtYWNybyBUUkFDRSgpLgorICAgIC8vCisgICAgLy8gSGVyZSB0aGUgcGFyYW1ldGVyICdsdmwnIGNhbiBiZSB1c2VkIHdpdGggbW9yZSB0aGFuIG9uZQorICAgIC8vIGRlYnVnLWxldmVsICh1c2luZyBPUikuCisgICAgLy8KKyAgICAvLyBFeGFtcGxlOiBERUJVR19UUkFDRTEoREVCVUdfTFZMXzMwIHwgREVCVUdfTFZMXzAyLCAiSGVsbG8gJWQiLCBiQ291bnQpOworCisjZGVmaW5lIERFQlVHX1RSQUNFMChsdmwsc3RyKSAgICAgICAgICAgICAgIFRyYWNlTHZsKChsdmwpLHN0cikKKyNkZWZpbmUgREVCVUdfVFJBQ0UxKGx2bCxzdHIscDEpICAgICAgICAgICAgVHJhY2VMdmwoKGx2bCksc3RyLHAxKQorI2RlZmluZSBERUJVR19UUkFDRTIobHZsLHN0cixwMSxwMikgICAgICAgICBUcmFjZUx2bCgobHZsKSxzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX1RSQUNFMyhsdmwsc3RyLHAxLHAyLHAzKSAgICAgIFRyYWNlTHZsKChsdmwpLHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfVFJBQ0U0KGx2bCxzdHIscDEscDIscDMscDQpICAgVHJhY2VMdmwoKGx2bCksc3RyLHAxLHAyLHAzLHA0KQorI2RlZmluZSBERUJVR19HTEJfTFZMKCkgICAgICAgICAgICAgICAgICAgICBkd0RlYnVnTGV2ZWxfZworCisjZWxzZQorCisgICAgLy8gQXQgbWljcm9jb250cm9sbGVycyB3ZSBkbyByZWR1Y2UgdGhlIG1lbW9yeSB1c2FnZSBieSBkZWxldGluZyBERUJVR19UUkFDRS1saW5lcworICAgIC8vIChjb21waWxlciBkb2VzIGRlbGV0ZSB0aGUgbGluZXMpLgorICAgIC8vCisgICAgLy8gSGVyZSB0aGUgcGFyYW1ldGVyICdsdmwnIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBvbmUgZGVidWctbGV2ZWwuCisgICAgLy8KKyAgICAvLyBFeGFtcGxlOiBERUJVR19UUkFDRTEoREVCVUdfTFZMX0VSUk9SLCAiZXJyb3IgY29kZSAlZCIsIGR3UmV0KTsKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfQUxXQVlTKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMX0VSUk9SKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF9BU1NFUlQpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjkpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzI4KQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yNykKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjYpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzI1KQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yNCkKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjMpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzIyKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjApCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzE5KQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xOCkKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTcpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzE2KQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xNSkKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTQpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzEzKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xMikKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTEpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzEwKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wOSkKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDgpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzA3KQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wNikKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDUpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzA0KQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wMykKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDIpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzAxKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjZGVmaW5lIERFQlVHX1RSQUNFMChsdmwsc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2bCMjX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX1RSQUNFMShsdmwsc3RyLHAxKSAgICAgICAgICAgICAgICAgICAgICAgIGx2bCMjX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX1RSQUNFMihsdmwsc3RyLHAxLHAyKSAgICAgICAgICAgICAgICAgICAgIGx2bCMjX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX1RSQUNFMyhsdmwsc3RyLHAxLHAyLHAzKSAgICAgICAgICAgICAgICAgIGx2bCMjX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX1RSQUNFNChsdmwsc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgICAgICAgIGx2bCMjX1RSQUNFNChzdHIscDEscDIscDMscDQpCisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIG1hY3JvIERFQlVHX0RVTVBfREFUQSgpIGNhbiBiZSB1c2VkIHdpdGggdGhlIHNhbWUgZGVidWctbGV2ZWxzIHRvIGR1bXAKKy8vIG91dCBkYXRhIGJ5dGVzLiBGdW5jdGlvbiBEdW1wRGF0YSgpIGhhcyB0byBiZSBpbmNsdWRlZC4KKy8vIE5PVEU6IERVTVBfREFUQSBoYXMgdG8gYmUgZGVmaW5lZCBpbiBwcm9qZWN0IHNldHRpbmdzLgorI2lmICghZGVmaW5lZCAoTkRFQlVHKSAmJiBkZWZpbmVkIChEVU1QX0RBVEEpKSB8fCAoREVWX1NZU1RFTSA9PSBfREVWX1dJTjMyXykKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisJdm9pZCBEdW1wRGF0YShjaGFyICpzelN0cl9wLCBCWVRFIE1FTSAqIHBiRGF0YV9wLCBXT1JEIHdTaXplX3ApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30JCQkJLy8gdm9uIGV4dGVybiAiQyIKKyNlbmRpZgorI2RlZmluZSBERUJVR19EVU1QX0RBVEEobHZsLHN0cixwdHIsc2l6KSAgICBpZiAoKERFQlVHX0dMQl9MVkwoKSAmIChsdmwpKT09KGx2bCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1wRGF0YSAoc3RyLCAoQllURSBNRU0qKSAocHRyKSwgKFdPUkQpIChzaXopKTsKKyNlbHNlCisKKyNkZWZpbmUgREVCVUdfRFVNUF9EQVRBKGx2bCxzdHIscHRyLHNpeikKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgbWFjcm8gREVCVUdfQVNTRVJUKCkgY2FuIGJlIHVzZWQgdG8gcHJpbnQgb3V0IGFuIGVycm9yIHN0cmluZyBpZiB0aGUKKy8vIHBhcmFtZXRlcmVkIGV4cHJlc2lvbiBkb2VzIG5vdCByZXN1bHQgVFJVRS4KKy8vIE5PVEU6IElmIERFQlVHX0tFRVBfQVNTRVJUIGlzIGRlZmluZWQsIHRoZW4gREVCVUdfQVNTRVJULWxpbmUgd2lsbCBub3QgYmUKKy8vICAgICAgIGRlbGV0ZWQgZnJvbSBjb21waWxlciAoaW4gcmVsZWFzZSB2ZXJzaW9uIHRvbykuCisjaWYgIWRlZmluZWQgKE5ERUJVRykgfHwgZGVmaW5lZCAoREVCVUdfS0VFUF9BU1NFUlQpCisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX1dJTjMyXykKKworCS8vIEZvciBXSU4zMiBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIGFmdGVyIGNsb3NpbmcgbWVzc2FnZSBib3guCisKKyNkZWZpbmUgREVCVUdfQVNTRVJUMChleHByLHN0cikgICAgICAgICBpZiAoIShleHByICkgJiYgKChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfQVNTRVJUKSE9MCkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3ggKE5VTEwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgIiBfX0xJTkVfXyAiIGZpbGUgIiBfX0ZJTEVfXyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAgICAtPiAiIHN0ciAiXG4iKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXRQcm9jZXNzICgtMSk7IH0KKworI2RlZmluZSBERUJVR19BU1NFUlQxKGV4cHIsc3RyLHAxKSAgICAgIGlmICghKGV4cHIgKSAmJiAoKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF9BU1NFUlQpIT0wKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUJveCAoTlVMTCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAiIF9fTElORV9fICIgZmlsZSAiIF9fRklMRV9fIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuICAgIC0+ICIgc3RyICJcbiIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpdFByb2Nlc3MgKC0xKTsgfQorCisjZWxzZQorCisJLy8gRm9yIG1pY3JvY29udHJvbGxlcnMgcHJvY2VzcyB3aWxsIGJlIHN0b3BwZWQgdXNpbmcgZW5kbGVzcyBsb29wLgorCisjZGVmaW5lIERFQlVHX0FTU0VSVDAoZXhwcixzdHIpICAgICAgICAgaWYgKCEoZXhwciApKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFMyAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAnJXMnXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAtPiAnJXMnXG4iLCBfX0xJTkVfXywgX19GSUxFX18sIHN0cik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSk7IH0KKworI2RlZmluZSBERUJVR19BU1NFUlQxKGV4cHIsc3RyLHAxKSAgICAgIGlmICghKGV4cHIgKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTQgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZpbGUgJyVzJ1xuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgLT4gJyVzJ1xuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgLT4gMHglMDhsWFxuIiwgX19MSU5FX18sIF9fRklMRV9fLCBzdHIsIChEV09SRCkgcDEpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpOyB9CisKKyNlbmRpZgorCisjZWxzZQorCisjZGVmaW5lIERFQlVHX0FTU0VSVDAoZXhwcixzdHIpCisjZGVmaW5lIERFQlVHX0FTU0VSVDEoZXhwcixzdHIscDEpCisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIG1hY3JvIERFQlVHX09OTFkoKSBpbXBsZW1lbnRzIGNvZGUsIGlmIE5ERUJVRyBpcyBub3QgZGVmaW5lZC4KKyNpZiAhZGVmaW5lZCAoREVCVUdfT05MWSkKKyNpZiAhZGVmaW5lZCAoTkRFQlVHKQorCisjZGVmaW5lIERFQlVHX09OTFkoZXhwcikgICAgZXhwcgorCisjZWxzZQorCisjZGVmaW5lIERFQlVHX09OTFkoZXhwcikKKworI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8vIF9ERUJVR19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2ODEzOS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2ODEzOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWI0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnY4MTM5LmMKQEAgLTAsMCArMSwxMjUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgRXRoZXJuZXQgZHJpdmVyIGZvciBSZWFsdGVrIFJUTDgxMzkgY2hpcHMKKyAgICAgICAgICAgICAgICBleGNlcHQgdGhlIFJUTDgxMzlDKywgYmVjYXVzZSBpdCBoYXMgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICBUeCBkZXNjcmlwdG9yIGhhbmRsaW5nLgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVkcnY4MTM5LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjEwICQgICREYXRlOiAyMDA4LzExLzIxIDA5OjAwOjM4ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIERldiBDKysgYW5kIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDgvMDIvMDUgZC5rLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAiZWRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gQnVmZmVyIGhhbmRsaW5nOgorLy8gQWxsIGJ1ZmZlcnMgYXJlIGNyZWF0ZWQgc3RhdGljYWxseSAoaS5lLiBhdCBjb21waWxlIHRpbWUgcmVzcC4gYXQKKy8vIGluaXRpYWxpc2F0aW9uIHZpYSBrbWFsbG9jKCkgKSBhbmQgbm90IGR5bmFtaWNhbGx5IG9uIHJlcXVlc3QgKGkuZS4gdmlhCisvLyBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcigpLgorLy8gRWRydkFsbG9jVHhNc2dCdWZmZXIoKSBzZWFyY2hlcyBmb3IgYW4gdW51c2VkIGJ1ZmZlciB3aGljaCBpcyBsYXJnZSBlbm91Z2guCisvLyBFZHJ2SW5pdCgpIG1heSBhbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgd2l0aCBzaXplcyBsZXNzIHRoYW4gbWF4aW11bSBmcmFtZQorLy8gc2l6ZSAoaS5lLiAxNTE0IGJ5dGVzKSwgZS5nLiBmb3IgU29DLCBTb0EsIFN0YXR1c1Jlc3BvbnNlLCBJZGVudFJlc3BvbnNlLAorLy8gTk1UIHJlcXVlc3RzIC8gY29tbWFuZHMuIFRoZSBsZXNzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhlIGxlc3MgdGhlCisvLyBudW1iZXIgb2YgdGhlIGJ1ZmZlci4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRURSVl9NQVhfVFhfQlVGRkVSUworI2RlZmluZSBFRFJWX01BWF9UWF9CVUZGRVJTICAgICAyMAorI2VuZGlmCisKKyNkZWZpbmUgRURSVl9NQVhfRlJBTUVfU0laRSAgICAgMHg2MDAKKworI2RlZmluZSBFRFJWX1JYX0JVRkZFUl9TSVpFICAgICAweDg2MTAJLy8gMzIga0IgKyAxNiBCeXRlICsgMSw1IGtCIChXUkFQIGlzIGVuYWJsZWQpCisjZGVmaW5lIEVEUlZfUlhfQlVGRkVSX0xFTkdUSCAgIChFRFJWX1JYX0JVRkZFUl9TSVpFICYgMHhGODAwKQkvLyBidWZmZXIgc2l6ZSBjdXQgZG93biB0byAyIGtCIGFsaWdubWVudAorCisjZGVmaW5lIEVEUlZfVFhfQlVGRkVSX1NJWkUgICAgIChFRFJWX01BWF9UWF9CVUZGRVJTICogRURSVl9NQVhfRlJBTUVfU0laRSkJLy8gbiAqIChNVFUgKyAxNCArIDQpCisKKyNkZWZpbmUgRFJWX05BTUUgICAgICAgICAgICAgICAgImVwbCIKKworI2RlZmluZSBFRFJWX1JFR1dfSU5UX01BU0sgICAgICAweDNDCS8vIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHV19JTlRfU1RBVFVTICAgIDB4M0UJLy8gaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1JPSyAgICAgICAweDAwMDEJLy8gUmVjZWl2ZSBPSyBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9SRVIgICAgICAgMHgwMDAyCS8vIFJlY2VpdmUgZXJyb3IgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfVE9LICAgICAgIDB4MDAwNAkvLyBUcmFuc21pdCBPSyBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9URVIgICAgICAgMHgwMDA4CS8vIFRyYW5zbWl0IGVycm9yIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1JYT1ZXICAgICAweDAwMTAJLy8gUnggYnVmZmVyIG92ZXJmbG93IGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1BVTiAgICAgICAweDAwMjAJLy8gUGFja2V0IHVuZGVycnVuLyBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9GT1ZXICAgICAgMHgwMDQwCS8vIFJ4IEZJRk8gb3ZlcmZsb3cgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfTEVOQ0hHICAgIDB4MjAwMAkvLyBDYWJsZSBsZW5ndGggY2hhbmdlIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RJTUVPVVQgICAweDQwMDAJLy8gVGltZSBvdXQgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfU0VSUiAgICAgIDB4ODAwMAkvLyBTeXN0ZW0gZXJyb3IgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfTUFTS19ERUYgIChFRFJWX1JFR1dfSU5UX1JPSyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUkVSIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9UT0sgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1RFUiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUlhPVlcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX0ZPVlcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1BVTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfVElNRU9VVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfU0VSUikJLy8gZGVmYXVsdCBpbnRlcnJ1cHQgbWFzaworCisjZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EICAgICAgIDB4MzcJLy8gY29tbWFuZCByZWdpc3RlcgorI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORF9SU1QgICAweDEwCisjZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX1JFICAgIDB4MDgKKyNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkRfVEUgICAgMHgwNAorI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORF9CVUZFICAweDAxCisKKyNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDYgICAgICAgMHg1MAkvLyA5M0M0NiBjb21tYW5kIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHQl9DTUQ5MzQ2X0xPQ0sgIDB4MDAJLy8gbG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworI2RlZmluZSBFRFJWX1JFR0JfQ01EOTM0Nl9VTkxPQ0sgMHhDMAkvLyB1bmxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKKworI2RlZmluZSBFRFJWX1JFR0RXX1JDUiAgICAgICAgICAweDQ0CS8vIFJ4IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfTk9fRlRIICAgMHgwMDAwRTAwMAkvLyBubyByZWNlaXZlIEZJRk8gdGhyZXNob2xkCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIDB4MDAwMDEwMDAJLy8gMzIga0IgcmVjZWl2ZSBidWZmZXIKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfTVhETUFVTkwgMHgwMDAwMDcwMAkvLyB1bmxpbWl0ZWQgbWF4aW11bSBETUEgYnVyc3Qgc2l6ZQorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9OT1dSQVAgICAweDAwMDAwMDgwCS8vIGRvIG5vdCB3cmFwIGZyYW1lIGF0IGVuZCBvZiBidWZmZXIKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUVSICAgICAgMHgwMDAwMDAyMAkvLyBhY2NlcHQgZXJyb3IgZnJhbWVzIChDUkMsIGFsaWdubWVudCwgY29sbGlkZWQpCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FSICAgICAgIDB4MDAwMDAwMTAJLy8gYWNjZXB0IHJ1bnQKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUIgICAgICAgMHgwMDAwMDAwOAkvLyBhY2NlcHQgYnJvYWRjYXN0IGZyYW1lcworI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BTSAgICAgICAweDAwMDAwMDA0CS8vIGFjY2VwdCBtdWx0aWNhc3QgZnJhbWVzCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FQTSAgICAgIDB4MDAwMDAwMDIJLy8gYWNjZXB0IHBoeXNpY2FsIG1hdGNoIGZyYW1lcworI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BQVAgICAgICAweDAwMDAwMDAxCS8vIGFjY2VwdCBhbGwgZnJhbWVzCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0RFRiAgICAgIChFRFJWX1JFR0RXX1JDUl9OT19GVEggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9SQkxFTjMySyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX01YRE1BVU5MIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfTk9XUkFQIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfQUIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9BTSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX0FQTSkJLy8gZGVmYXVsdCB2YWx1ZQorCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSICAgICAgICAgIDB4NDAJLy8gVHggY29uZmlndXJhdGlvbiByZWdpc3RlcgorI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfTUFTSyAweDdDQzAwMDAwCS8vIG1hc2sgZm9yIGhhcmR3YXJlIHZlcnNpb24KKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfVkVSX0MgICAgMHg3NDAwMDAwMAkvLyBSVEw4MTM5QworI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfRCAgICAweDc0NDAwMDAwCS8vIFJUTDgxMzlECisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX0lGRzk2ICAgIDB4MDMwMDAwMDAJLy8gZGVmYXVsdCBpbnRlcmZyYW1lIGdhcCAoOTYwIG5zKQorI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9DUkMgICAgICAweDAwMDEwMDAwCS8vIGRpc2FibGUgYXBwZW5kaW5nIG9mIENSQyBieSB0aGUgY29udHJvbGxlcgorI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9NWERNQVVOTCAweDAwMDAwNzAwCS8vIG1heGltdW0gRE1BIGJ1cnN0IHNpemUgb2YgMjA0OCBiCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX1RYUkVUUlkgIDB4MDAwMDAwMDAJLy8gMTYgcmV0cmllcworI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9ERUYgICAgICAoRURSVl9SRUdEV19UQ1JfSUZHOTYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1RDUl9NWERNQVVOTCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfVENSX1RYUkVUUlkpCisKKyNkZWZpbmUgRURSVl9SRUdXX01VTElOVCAgICAgICAgMHg1QwkvLyBtdWx0aXBsZSBpbnRlcnJ1cHQgc2VsZWN0IHJlZ2lzdGVyCisKKyNkZWZpbmUgRURSVl9SRUdEV19NUEMgICAgICAgICAgMHg0QwkvLyBtaXNzZWQgcGFja2V0IGNvdW50ZXIgcmVnaXN0ZXIKKworI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQwICAgICAgICAweDIwCS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAwCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDEgICAgICAgIDB4MjQJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDEKKyNkZWZpbmUgRURSVl9SRUdEV19UU0FEMiAgICAgICAgMHgyOAkvLyBUcmFuc21pdCBzdGFydCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgMgorI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQzICAgICAgICAweDJDCS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAzCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEMCAgICAgICAgIDB4MTAJLy8gVHJhbnNtaXQgc3RhdHVzIG9mIGRlc2NyaXB0b3IgMAorI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9DUlMgICAgICAweDgwMDAwMDAwCS8vIENhcnJpZXIgc2Vuc2UgbG9zdAorI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UQUJUICAgICAweDQwMDAwMDAwCS8vIFRyYW5zbWl0IEFib3J0CisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX09XQyAgICAgIDB4MjAwMDAwMDAJLy8gT3V0IG9mIHdpbmRvdyBjb2xsaXNpb24KKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfVFhUSF9ERUYgMHgwMDAyMDAwMAkvLyBUcmFuc21pdCBGSUZPIHRocmVzaG9sZCBvZiA2NCBieXRlcworI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UT0sgICAgICAweDAwMDA4MDAwCS8vIFRyYW5zbWl0IE9LCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RVTiAgICAgIDB4MDAwMDQwMDAJLy8gVHJhbnNtaXQgRklGTyB1bmRlcnJ1bgorI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9PV04gICAgICAweDAwMDAyMDAwCS8vIE93bmVyCisKKyNkZWZpbmUgRURSVl9SRUdEV19SQlNUQVJUICAgICAgMHgzMAkvLyBSZWNlaXZlIGJ1ZmZlciBzdGFydCBhZGRyZXNzCisKKyNkZWZpbmUgRURSVl9SRUdXX0NBUFIgICAgICAgICAgMHgzOAkvLyBDdXJyZW50IGFkZHJlc3Mgb2YgcGFja2V0IHJlYWQKKworI2RlZmluZSBFRFJWX1JFR0RXX0lEUjAgICAgICAgICAweDAwCS8vIElEIHJlZ2lzdGVyIDAKKyNkZWZpbmUgRURSVl9SRUdEV19JRFI0ICAgICAgICAgMHgwNAkvLyBJRCByZWdpc3RlciA0CisKKyNkZWZpbmUgRURSVl9SRUdEV19NQVIwICAgICAgICAgMHgwOAkvLyBNdWx0aWNhc3QgYWRkcmVzcyByZWdpc3RlciAwCisjZGVmaW5lIEVEUlZfUkVHRFdfTUFSNCAgICAgICAgIDB4MEMJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXIgNAorCisvLyBkZWZpbmVzIGZvciB0aGUgc3RhdHVzIHdvcmQgaW4gdGhlIHJlY2VpdmUgYnVmZmVyCisjZGVmaW5lIEVEUlZfUlhTVEFUX01BUiAgICAgICAgIDB4ODAwMAkvLyBNdWx0aWNhc3QgYWRkcmVzcyByZWNlaXZlZAorI2RlZmluZSBFRFJWX1JYU1RBVF9QQU0gICAgICAgICAweDQwMDAJLy8gUGh5c2ljYWwgYWRkcmVzcyBtYXRjaGVkCisjZGVmaW5lIEVEUlZfUlhTVEFUX0JBUiAgICAgICAgIDB4MjAwMAkvLyBCcm9hZGNhc3QgYWRkcmVzcyByZWNlaXZlZAorI2RlZmluZSBFRFJWX1JYU1RBVF9JU0UgICAgICAgICAweDAwMjAJLy8gSW52YWxpZCBzeW1ib2wgZXJyb3IKKyNkZWZpbmUgRURSVl9SWFNUQVRfUlVOVCAgICAgICAgMHgwMDEwCS8vIFJ1bnQgcGFja2V0IHJlY2VpdmVkCisjZGVmaW5lIEVEUlZfUlhTVEFUX0xPTkcgICAgICAgIDB4MDAwOAkvLyBMb25nIHBhY2tldAorI2RlZmluZSBFRFJWX1JYU1RBVF9DUkMgICAgICAgICAweDAwMDQJLy8gQ1JDIGVycm9yCisjZGVmaW5lIEVEUlZfUlhTVEFUX0ZBRSAgICAgICAgIDB4MDAwMgkvLyBGcmFtZSBhbGlnbm1lbnQgZXJyb3IKKyNkZWZpbmUgRURSVl9SWFNUQVRfUk9LICAgICAgICAgMHgwMDAxCS8vIFJlY2VpdmUgT0sKKworI2RlZmluZSBFRFJWX1JFR0RXX1dSSVRFKGR3UmVnLCBkd1ZhbCkgIHdyaXRlbChkd1ZhbCwgRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCisjZGVmaW5lIEVEUlZfUkVHV19XUklURShkd1JlZywgd1ZhbCkgICAgd3JpdGV3KHdWYWwsIEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorI2RlZmluZSBFRFJWX1JFR0JfV1JJVEUoZHdSZWcsIGJWYWwpICAgIHdyaXRlYihiVmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKKyNkZWZpbmUgRURSVl9SRUdEV19SRUFEKGR3UmVnKSAgICAgICAgICByZWFkbChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKKyNkZWZpbmUgRURSVl9SRUdXX1JFQUQoZHdSZWcpICAgICAgICAgICByZWFkdyhFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKKyNkZWZpbmUgRURSVl9SRUdCX1JFQUQoZHdSZWcpICAgICAgICAgICByZWFkYihFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQorI2VuZGlmCisKKyNkZWZpbmUgRURSVl9DT1VOVF9TRU5EICAgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgyKQorI2RlZmluZSBFRFJWX0NPVU5UX1RJTUVPVVQgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDMpCisjZGVmaW5lIEVEUlZfQ09VTlRfUENJX0VSUiAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNCkKKyNkZWZpbmUgRURSVl9DT1VOVF9UWCAgICAgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg1KQorI2RlZmluZSBFRFJWX0NPVU5UX1JYICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDYpCisjZGVmaW5lIEVEUlZfQ09VTlRfTEFURUNPTExJU0lPTiAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTApCisjZGVmaW5lIEVEUlZfQ09VTlRfVFhfQ09MX1JMICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTEpCisjZGVmaW5lIEVEUlZfQ09VTlRfVFhfRlVOICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTIpCisjZGVmaW5lIEVEUlZfQ09VTlRfVFhfRVJSICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTMpCisjZGVmaW5lIEVEUlZfQ09VTlRfUlhfQ1JDICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTQpCisjZGVmaW5lIEVEUlZfQ09VTlRfUlhfRVJSICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTUpCisjZGVmaW5lIEVEUlZfQ09VTlRfUlhfRk9WVyAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTYpCisjZGVmaW5lIEVEUlZfQ09VTlRfUlhfUFVOICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTcpCisjZGVmaW5lIEVEUlZfQ09VTlRfUlhfRkFFICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTgpCisjZGVmaW5lIEVEUlZfQ09VTlRfUlhfT1ZXICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTkpCisKKyNkZWZpbmUgRURSVl9UUkFDRV9DQVBSKHgpICAgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDA2MDAwMDAwKQorI2RlZmluZSBFRFJWX1RSQUNFX1JYX0NSQyh4KSAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MEUwMDAwMDApCisjZGVmaW5lIEVEUlZfVFJBQ0VfUlhfRVJSKHgpICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgwRjAwMDAwMCkKKyNkZWZpbmUgRURSVl9UUkFDRV9SWF9QVU4oeCkgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDExMDAwMDAwKQorI2RlZmluZSBFRFJWX1RSQUNFKHgpICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGMDAwMCkgfCAweDAwMDBGRUMwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCT09MICAgICAgICAgICAgbV9mVXNlZDsKKyAgICB1bnNpZ25lZCBpbnQgICAgbV91aVNpemU7CisgICAgTUNEX2J1ZkRlc2NGZWMgKm1fcEJ1ZkRlc2NyOworCit9IHRFZHJ2VHhCdWZmZXJJbnRlcm47CisqLworCisvLyBQcml2YXRlIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBwY2lfZGV2ICptX3BQY2lEZXY7CS8vIHBvaW50ZXIgdG8gUENJIGRldmljZSBzdHJ1Y3R1cmUKKwl2b2lkICptX3BJb0FkZHI7CS8vIHBvaW50ZXIgdG8gcmVnaXN0ZXIgc3BhY2Ugb2YgRXRoZXJuZXQgY29udHJvbGxlcgorCUJZVEUgKm1fcGJSeEJ1ZjsJLy8gcG9pbnRlciB0byBSeCBidWZmZXIKKwlkbWFfYWRkcl90IG1fcFJ4QnVmRG1hOworCUJZVEUgKm1fcGJUeEJ1ZjsJLy8gcG9pbnRlciB0byBUeCBidWZmZXIKKwlkbWFfYWRkcl90IG1fcFR4QnVmRG1hOworCUJPT0wgbV9hZlR4QnVmVXNlZFtFRFJWX01BWF9UWF9CVUZGRVJTXTsKKwl1bnNpZ25lZCBpbnQgbV91aUN1clR4RGVzYzsKKworCXRFZHJ2SW5pdFBhcmFtIG1fSW5pdFBhcmFtOworCXRFZHJ2VHhCdWZmZXIgKm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyOworCit9IHRFZHJ2SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVkcnZJbml0T25lKHN0cnVjdCBwY2lfZGV2ICpwUGNpRGV2LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBJZCk7CisKK3N0YXRpYyB2b2lkIEVkcnZSZW1vdmVPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYnVmZmVycyBhbmQgYnVmZmVyIGRlc2NyaXB0b3JzIGFuZCBwb2ludGVycworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYUVkcnZQY2lUYmxbXSA9IHsKKwl7MHgxMGVjLCAweDgxMzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhRWRydlBjaVRibCk7CisKK3N0YXRpYyB0RWRydkluc3RhbmNlIEVkcnZJbnN0YW5jZV9sOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgRWRydkRyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IGFFZHJ2UGNpVGJsLAorCS5wcm9iZSA9IEVkcnZJbml0T25lLAorCS5yZW1vdmUgPSBFZHJ2UmVtb3ZlT25lLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8ZWRydj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEJZVEUgRWRydkNhbGNIYXNoKEJZVEUgKiBwYk1BQ19wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydkluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZm9yIGluaXQgb2YgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVkcnZJbml0UGFyYW1fcCAgICA9IHBvaW50ZXIgdG8gc3RydWN0IGluY2x1ZGluZyB0aGUgaW5pdC1wYXJhbWV0ZXJzCisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgICAgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBrRXBsTm9SZXNvdXJjZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZJbml0KHRFZHJ2SW5pdFBhcmFtICogcEVkcnZJbml0UGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlpbnQgaVJlc3VsdDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2xlYXIgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRWRydkluc3RhbmNlX2wsIDAsIHNpemVvZihFZHJ2SW5zdGFuY2VfbCkpOworCisJLy8gc2F2ZSB0aGUgaW5pdCBkYXRhCisJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0gPSAqcEVkcnZJbml0UGFyYW1fcDsKKworCS8vIHJlZ2lzdGVyIFBDSSBkcml2ZXIKKwlpUmVzdWx0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmRWRydkRyaXZlcik7CisJaWYgKGlSZXN1bHQgIT0gMCkgeworCQlwcmludGsoIiVzIHBjaV9yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkIHdpdGggJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIGlSZXN1bHQpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgPT0gTlVMTCkgeworCQlwcmludGsoIiVzIG1fcFBjaURldj1OVUxMXG4iLCBfX0ZVTkNUSU9OX18pOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZWFkIE1BQyBhZGRyZXNzIGZyb20gY29udHJvbGxlcgorCXByaW50aygiJXMgbG9jYWwgTUFDID0gIiwgX19GVU5DVElPTl9fKTsKKwlmb3IgKGlSZXN1bHQgPSAwOyBpUmVzdWx0IDwgNjsgaVJlc3VsdCsrKSB7CisJCXBFZHJ2SW5pdFBhcmFtX3AtPm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0gPQorCQkgICAgRURSVl9SRUdCX1JFQUQoKEVEUlZfUkVHRFdfSURSMCArIGlSZXN1bHQpKTsKKwkJcHJpbnRrKCIlMDJYICIsCisJCSAgICAgICAodW5zaWduZWQgaW50KXBFZHJ2SW5pdFBhcmFtX3AtPm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0pOworCX0KKwlwcmludGsoIlxuIik7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2U2h1dGRvd24KKy8vCisvLyBEZXNjcmlwdGlvbjogU2h1dGRvd24gdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydlNodXRkb3duKHZvaWQpCit7CisKKwkvLyB1bnJlZ2lzdGVyIFBDSSBkcml2ZXIKKwlwcmludGsoIiVzIGNhbGxpbmcgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZFZHJ2RHJpdmVyKTsKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5CisvLworLy8gRGVzY3JpcHRpb246IFNldCBhIG11bHRpY2FzdCBlbnRyeSBpbnRvIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisvLworLy8gUGFyYW1ldGVyczogIHBiTWFjQWRkcl9wICAgICA9IHBvaW50ZXIgdG8gbXVsdGljYXN0IGVudHJ5IHRvIHNldAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeShCWVRFICogcGJNYWNBZGRyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlEV09SRCBkd0RhdGE7CisJQllURSBiSGFzaDsKKworCWJIYXNoID0gRWRydkNhbGNIYXNoKHBiTWFjQWRkcl9wKTsKKy8qCisgICAgZHdEYXRhID0gZXRoZXJfY3JjKDYsIHBiTWFjQWRkcl9wKTsKKworICAgIHByaW50aygiRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5KCclMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCcpIGhhc2ggPSAldSAvICV1ICBldGhlcl9jcmMgPSAweCUwOGxYXG4iLAorICAgICAgICAoV09SRCkgcGJNYWNBZGRyX3BbMF0sIChXT1JEKSBwYk1hY0FkZHJfcFsxXSwgKFdPUkQpIHBiTWFjQWRkcl9wWzJdLAorICAgICAgICAoV09SRCkgcGJNYWNBZGRyX3BbM10sIChXT1JEKSBwYk1hY0FkZHJfcFs0XSwgKFdPUkQpIHBiTWFjQWRkcl9wWzVdLAorICAgICAgICAoV09SRCkgYkhhc2gsIChXT1JEKSAoZHdEYXRhID4+IDI2KSwgZHdEYXRhKTsKKyovCisJaWYgKGJIYXNoID4gMzEpIHsKKwkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSNCk7CisJCWR3RGF0YSB8PSAxIDw8IChiSGFzaCAtIDMyKTsKKwkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjQsIGR3RGF0YSk7CisJfSBlbHNlIHsKKwkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CisJCWR3RGF0YSB8PSAxIDw8IGJIYXNoOworCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSMCwgZHdEYXRhKTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeQorLy8KKy8vIERlc2NyaXB0aW9uOiBSZXNldCBhIG11bHRpY2FzdCBlbnRyeSBpbiB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwYk1hY0FkZHJfcCAgICAgPSBwb2ludGVyIHRvIG11bHRpY2FzdCBlbnRyeSB0byByZXNldAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KEJZVEUgKiBwYk1hY0FkZHJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCURXT1JEIGR3RGF0YTsKKwlCWVRFIGJIYXNoOworCisJYkhhc2ggPSBFZHJ2Q2FsY0hhc2gocGJNYWNBZGRyX3ApOworCisJaWYgKGJIYXNoID4gMzEpIHsKKwkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSNCk7CisJCWR3RGF0YSAmPSB+KDEgPDwgKGJIYXNoIC0gMzIpKTsKKwkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjQsIGR3RGF0YSk7CisJfSBlbHNlIHsKKwkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CisJCWR3RGF0YSAmPSB+KDEgPDwgYkhhc2gpOworCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSMCwgZHdEYXRhKTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcgorLy8KKy8vIERlc2NyaXB0aW9uOiBSZWdpc3RlciBhIFR4LUJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQnVmZmVyX3AgICA9IHBvaW50ZXIgdG8gQnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5CisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydkFsbG9jVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCURXT1JEIGk7CisKKwlpZiAocEJ1ZmZlcl9wLT5tX3VpTWF4QnVmZmVyTGVuID4gRURSVl9NQVhfRlJBTUVfU0laRSkgeworCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNlYXJjaCBhIGZyZWUgVHggYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgc2l6ZQorCWZvciAoaSA9IDA7IGkgPCBFRFJWX01BWF9UWF9CVUZGRVJTOyBpKyspIHsKKwkJaWYgKEVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbaV0gPT0gRkFMU0UpIHsKKwkJCS8vIGZyZWUgY2hhbm5lbCBmb3VuZAorCQkJRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFtpXSA9IFRSVUU7CisJCQlwQnVmZmVyX3AtPm1fdWlCdWZmZXJOdW1iZXIgPSBpOworCQkJcEJ1ZmZlcl9wLT5tX3BiQnVmZmVyID0KKwkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgKworCQkJICAgIChpICogRURSVl9NQVhfRlJBTUVfU0laRSk7CisJCQlwQnVmZmVyX3AtPm1fdWlNYXhCdWZmZXJMZW4gPSBFRFJWX01BWF9GUkFNRV9TSVpFOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPj0gRURSVl9NQVhfVFhfQlVGRkVSUykgeworCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlJlbGVhc2VUeE1zZ0J1ZmZlcgorLy8KKy8vIERlc2NyaXB0aW9uOiBSZWdpc3RlciBhIFR4LUJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQnVmZmVyX3AgICA9IHBvaW50ZXIgdG8gQnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydlJlbGVhc2VUeE1zZ0J1ZmZlcih0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQoreworCXVuc2lnbmVkIGludCB1aUJ1ZmZlck51bWJlcjsKKworCXVpQnVmZmVyTnVtYmVyID0gcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyOworCisJaWYgKHVpQnVmZmVyTnVtYmVyIDwgRURSVl9NQVhfVFhfQlVGRkVSUykgeworCQlFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW3VpQnVmZmVyTnVtYmVyXSA9IEZBTFNFOworCX0KKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2U2VuZFR4TXNnCisvLworLy8gRGVzY3JpcHRpb246IGltbWVkaWF0ZWx5IHN0YXJ0cyB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEJ1ZmZlcl9wICAgPSBidWZmZXIgZGVzY3JpcHRvciB0byB0cmFuc21pdAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydlNlbmRUeE1zZyh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpQnVmZmVyTnVtYmVyOworCURXT1JEIGR3VGVtcDsKKworCXVpQnVmZmVyTnVtYmVyID0gcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyOworCisJaWYgKCh1aUJ1ZmZlck51bWJlciA+PSBFRFJWX01BWF9UWF9CVUZGRVJTKQorCSAgICB8fCAoRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFt1aUJ1ZmZlck51bWJlcl0gPT0gRkFMU0UpKSB7CisJCVJldCA9IGtFcGxFZHJ2QnVmTm90RXhpc3Rpbmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgIT0gTlVMTCkgewkvLyB0cmFuc21pc3Npb24gaXMgYWxyZWFkeSBhY3RpdmUKKwkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisJCWR3VGVtcCA9CisJCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNEMCArCisJCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqCisJCQkJICAgICAgc2l6ZW9mKERXT1JEKSkpKTsKKwkJcHJpbnRrKCIlcyBJbnZPcCBUU0QldSA9IDB4JTA4bFgiLCBfX0ZVTkNUSU9OX18sCisJCSAgICAgICBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXApOworCQlwcmludGsoIiAgQ21kID0gMHglMDJYXG4iLAorCQkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2F2ZSBwb2ludGVyIHRvIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIFR4SGFuZGxlcgorCUVkcnZJbnN0YW5jZV9sLm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyID0gcEJ1ZmZlcl9wOworCisJRURSVl9DT1VOVF9TRU5EOworCisJLy8gcGFkIHdpdGggemVyb3MgaWYgbmVjZXNzYXJ5LCBiZWNhdXNlIGNvbnRyb2xsZXIgZG9lcyBub3QgZG8gaXQKKwlpZiAocEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPCBNSU5fRVRIX1NJWkUpIHsKKwkJRVBMX01FTVNFVChwQnVmZmVyX3AtPm1fcGJCdWZmZXIgKyBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbiwgMCwKKwkJCSAgIE1JTl9FVEhfU0laRSAtIHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuKTsKKwkJcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPSBNSU5fRVRIX1NJWkU7CisJfQorCS8vIHNldCBETUEgYWRkcmVzcyBvZiBidWZmZXIKKwlFRFJWX1JFR0RXX1dSSVRFKChFRFJWX1JFR0RXX1RTQUQwICsKKwkJCSAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YoRFdPUkQpKSksCisJCQkgKEVkcnZJbnN0YW5jZV9sLm1fcFR4QnVmRG1hICsKKwkJCSAgKHVpQnVmZmVyTnVtYmVyICogRURSVl9NQVhfRlJBTUVfU0laRSkpKTsKKwlkd1RlbXAgPQorCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNBRDAgKworCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSk7CisvLyAgICBwcmludGsoIiVzIFRTQUQldSA9IDB4JTA4bFgiLCBfX0ZVTkNUSU9OX18sIEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MsIGR3VGVtcCk7CisKKwkvLyBzdGFydCB0cmFuc21pc3Npb24KKwlFRFJWX1JFR0RXX1dSSVRFKChFRFJWX1JFR0RXX1RTRDAgKworCQkJICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSwKKwkJCSAoRURSVl9SRUdEV19UU0RfVFhUSF9ERUYgfCBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbikpOworCWR3VGVtcCA9CisJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0QwICsKKwkJCSAgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YoRFdPUkQpKSkpOworLy8gICAgcHJpbnRrKCIgVFNEJXUgPSAweCUwOGxYIC8gMHglMDhsWFxuIiwgRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYywgZHdUZW1wLCAoRFdPUkQpKEVEUlZfUkVHRFdfVFNEX1RYVEhfREVGIHwgcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4pKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisjaWYgMAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlR4TXNnUmVhZHkKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIGNvcHlpbmcgdGhlIGJ1ZmZlciB0byB0aGUgZXRoZXJuZXQgY29udHJvbGxlcidzIEZJRk8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGJCdWZmZXJfcCAtIGJ1ZmZlcmRlc2NyaXB0b3IgdG8gdHJhbnNtaXQKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlIC0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2VHhNc2dSZWFkeSh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpQnVmZmVyTnVtYmVyOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZUeE1zZ1N0YXJ0CisvLworLy8gRGVzY3JpcHRpb246IHN0YXJ0cyB0cmFuc21pc3Npb24gb2YgdGhlIGV0aGVybmV0IGNvbnRyb2xsZXIncyBGSUZPCisvLworLy8gUGFyYW1ldGVyczogIHBiQnVmZmVyX3AgLSBidWZmZXJkZXNjcmlwdG9yIHRvIHRyYW5zbWl0CisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAtIGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydlR4TXNnU3RhcnQodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2UmVpbml0UngKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVpbml0aWFsaXplIHRoZSBSeCBwcm9jZXNzLCBiZWNhdXNlIG9mIGVycm9yCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdm9pZAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBFZHJ2UmVpbml0Ungodm9pZCkKK3sKKwlCWVRFIGJDbWQ7CisKKwkvLyBzaW1wbHkgc3dpdGNoIG9mZiBhbmQgb24gdGhlIHJlY2VpdmVyCisJLy8gdGhpcyB3aWxsIHJlc2V0IHRoZSBDQVBSIHJlZ2lzdGVyCisJYkNtZCA9IEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKTsKKwlFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIChiQ21kICYgfkVEUlZfUkVHQl9DT01NQU5EX1JFKSk7CisJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELCBiQ21kKTsKKworCS8vIHNldCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfUkNSLCBFRFJWX1JFR0RXX1JDUl9ERUYpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgRWRydkludGVycnVwdEhhbmRsZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogIGludGVycnVwdCBoYW5kbGVyCisvLworLy8gUGFyYW1ldGVyczogICB2b2lkCisvLworLy8gUmV0dXJuczogICAgICB2b2lkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCit2b2lkIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKHZvaWQpCit7Cit9CisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTkpCitzdGF0aWMgaW50IFRndEV0aElzcihpbnQgbklycU51bV9wLCB2b2lkICpwcERldkluc3REYXRhX3ApCisjZWxzZQorc3RhdGljIGludCBUZ3RFdGhJc3IoaW50IG5JcnFOdW1fcCwgdm9pZCAqcHBEZXZJbnN0RGF0YV9wLAorCQkgICAgIHN0cnVjdCBwdF9yZWdzICpwdFJlZ3NfcCkKKyNlbmRpZgoreworLy8gICAgRWRydkludGVycnVwdEhhbmRsZXIoKTsKKwl0RWRydlJ4QnVmZmVyIFJ4QnVmZmVyOworCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlcjsKKwlXT1JEIHdTdGF0dXM7CisJRFdPUkQgZHdUeFN0YXR1czsKKwlEV09SRCBkd1J4U3RhdHVzOworCVdPUkQgd0N1clJ4OworCUJZVEUgKnBiUnhCdWY7CisJdW5zaWduZWQgaW50IHVpTGVuZ3RoOworCWludCBpSGFuZGxlZCA9IElSUV9IQU5ETEVEOworCisvLyAgICBwcmludGsoIqQiKTsKKworCS8vIHJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMKKwl3U3RhdHVzID0gRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0lOVF9TVEFUVVMpOworCisJLy8gYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdHMKKwlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9TVEFUVVMsIHdTdGF0dXMpOworCisJaWYgKHdTdGF0dXMgPT0gMCkgeworCQlpSGFuZGxlZCA9IElSUV9OT05FOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHByb2Nlc3MgdGFza3MKKwlpZiAoKHdTdGF0dXMgJiAoRURSVl9SRUdXX0lOVF9URVIgfCBFRFJWX1JFR1dfSU5UX1RPSykpICE9IDApIHsJLy8gdHJhbnNtaXQgaW50ZXJydXB0CisKKwkJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiA9PSBOVUxMKSB7CisJCQlwcmludGsoIiVzIFR4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyByZWFkIHRyYW5zbWl0IHN0YXR1cworCQlkd1R4U3RhdHVzID0KKwkJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0QwICsKKwkJCQkgICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICoKKwkJCQkgICAgICBzaXplb2YoRFdPUkQpKSkpOworCQlpZiAoKGR3VHhTdGF0dXMgJiAoRURSVl9SRUdEV19UU0RfVE9LIHwgRURSVl9SRUdEV19UU0RfVEFCVCB8IEVEUlZfUkVHRFdfVFNEX1RVTikpICE9IDApIHsJLy8gdHJhbnNtaXQgZmluaXNoZWQKKwkJCUVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgPQorCQkJICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICsgMSkgJiAweDAzOworCQkJcFR4QnVmZmVyID0gRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXI7CisJCQlFZHJ2SW5zdGFuY2VfbC5tX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlciA9IE5VTEw7CisKKwkJCWlmICgoZHdUeFN0YXR1cyAmIEVEUlZfUkVHRFdfVFNEX1RPSykgIT0gMCkgeworCQkJCUVEUlZfQ09VTlRfVFg7CisJCQl9IGVsc2UgaWYgKChkd1R4U3RhdHVzICYgRURSVl9SRUdEV19UU0RfVFVOKSAhPSAwKSB7CisJCQkJRURSVl9DT1VOVF9UWF9GVU47CisJCQl9IGVsc2UgewkvLyBhc3N1bWUgRURSVl9SRUdEV19UU0RfVEFCVAorCQkJCUVEUlZfQ09VTlRfVFhfQ09MX1JMOworCQkJfQorCisvLyAgICAgICAgICAgIHByaW50aygiVCIpOworCQkJaWYgKHBUeEJ1ZmZlciAhPSBOVUxMKSB7CisJCQkJLy8gY2FsbCBUeCBoYW5kbGVyIG9mIERhdGEgbGluayBsYXllcgorCQkJCUVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLgorCQkJCSAgICBtX3BmblR4SGFuZGxlcihwVHhCdWZmZXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJRURSVl9DT1VOVF9UWF9FUlI7CisJCX0KKwl9CisKKwlpZiAoKHdTdGF0dXMgJiAoRURSVl9SRUdXX0lOVF9SRVIgfCBFRFJWX1JFR1dfSU5UX0ZPVlcgfCBFRFJWX1JFR1dfSU5UX1JYT1ZXIHwgRURSVl9SRUdXX0lOVF9QVU4pKSAhPSAwKSB7CS8vIHJlY2VpdmUgZXJyb3IgaW50ZXJydXB0CisKKwkJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9GT1ZXKSAhPSAwKSB7CisJCQlFRFJWX0NPVU5UX1JYX0ZPVlc7CisJCX0gZWxzZSBpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1JYT1ZXKSAhPSAwKSB7CisJCQlFRFJWX0NPVU5UX1JYX09WVzsKKwkJfSBlbHNlIGlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUFVOKSAhPSAwKSB7CS8vIFBhY2tldCB1bmRlcnJ1bgorCQkJRURSVl9UUkFDRV9SWF9QVU4od1N0YXR1cyk7CisJCQlFRFJWX0NPVU5UX1JYX1BVTjsKKwkJfSBlbHNlIHsJLyppZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1JFUikgIT0gMCkgKi8KKworCQkJRURSVl9UUkFDRV9SWF9FUlIod1N0YXR1cyk7CisJCQlFRFJWX0NPVU5UX1JYX0VSUjsKKwkJfQorCisJCS8vIHJlaW5pdGlhbGl6ZSBSeCBwcm9jZXNzCisJCUVkcnZSZWluaXRSeCgpOworCX0KKworCWlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUk9LKSAhPSAwKSB7CS8vIHJlY2VpdmUgaW50ZXJydXB0CisKKwkJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9PSBOVUxMKSB7CisJCQlwcmludGsoIiVzIFJ4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyByZWFkIGN1cnJlbnQgb2Zmc2V0IGluIHJlY2VpdmUgYnVmZmVyCisJCXdDdXJSeCA9CisJCSAgICAoRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0NBUFIpICsKKwkJICAgICAweDEwKSAlIEVEUlZfUlhfQlVGRkVSX0xFTkdUSDsKKworCQl3aGlsZSAoKEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSAmIEVEUlZfUkVHQl9DT01NQU5EX0JVRkUpID09IDApIHsJLy8gZnJhbWUgYXZhaWxhYmxlCisKKwkJCS8vIGNhbGN1bGF0ZSBwb2ludGVyIHRvIGN1cnJlbnQgZnJhbWUgaW4gcmVjZWl2ZSBidWZmZXIKKwkJCXBiUnhCdWYgPSBFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgKyB3Q3VyUng7CisKKwkJCS8vIHJlYWQgcmVjZWl2ZSBzdGF0dXMgRFdPUkQKKwkJCWR3UnhTdGF0dXMgPSBsZTMyX3RvX2NwdSgqKChEV09SRCAqKSBwYlJ4QnVmKSk7CisKKwkJCS8vIGNhbGN1bGF0ZSBsZW5ndGggb2YgcmVjZWl2ZWQgZnJhbWUKKwkJCXVpTGVuZ3RoID0gZHdSeFN0YXR1cyA+PiAxNjsKKworCQkJaWYgKHVpTGVuZ3RoID09IDB4RkZGMCkgewkvLyBmcmFtZSBpcyB1bmZpbmlzaGVkIChtYXliZSBlYXJseSBSeCBpbnRlcnJ1cHQgaXMgYWN0aXZlKQorCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoKGR3UnhTdGF0dXMgJiBFRFJWX1JYU1RBVF9ST0spID09IDApIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSByZWNlaXZpbmcgdGhpcyBmcmFtZQorCQkJCS8vIGlnbm9yZSBpdAorCQkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX0ZBRSkgIT0gMCkgeworCQkJCQlFRFJWX0NPVU5UX1JYX0ZBRTsKKwkJCQl9IGVsc2UgaWYgKChkd1J4U3RhdHVzICYgRURSVl9SWFNUQVRfQ1JDKSAhPSAwKSB7CisJCQkJCUVEUlZfVFJBQ0VfUlhfQ1JDKGR3UnhTdGF0dXMpOworCQkJCQlFRFJWX0NPVU5UX1JYX0NSQzsKKwkJCQl9IGVsc2UgeworCQkJCQlFRFJWX1RSQUNFX1JYX0VSUihkd1J4U3RhdHVzKTsKKwkJCQkJRURSVl9DT1VOVF9SWF9FUlI7CisJCQkJfQorCisJCQkJLy8gcmVpbml0aWFsaXplIFJ4IHByb2Nlc3MKKwkJCQlFZHJ2UmVpbml0UngoKTsKKworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsJLy8gZnJhbWUgaXMgT0sKKwkJCQlSeEJ1ZmZlci5tX0J1ZmZlckluRnJhbWUgPQorCQkJCSAgICBrRWRydkJ1ZmZlckxhc3RJbkZyYW1lOworCQkJCVJ4QnVmZmVyLm1fdWlSeE1zZ0xlbiA9IHVpTGVuZ3RoIC0gRVRIX0NSQ19TSVpFOworCQkJCVJ4QnVmZmVyLm1fcGJCdWZmZXIgPQorCQkJCSAgICBwYlJ4QnVmICsgc2l6ZW9mKGR3UnhTdGF0dXMpOworCisvLyAgICAgICAgICAgICAgICBwcmludGsoIlIiKTsKKwkJCQlFRFJWX0NPVU5UX1JYOworCisJCQkJLy8gY2FsbCBSeCBoYW5kbGVyIG9mIERhdGEgbGluayBsYXllcgorCQkJCUVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLgorCQkJCSAgICBtX3BmblJ4SGFuZGxlcigmUnhCdWZmZXIpOworCQkJfQorCisJCQkvLyBjYWx1bGF0ZSBuZXcgb2Zmc2V0IChEV09SRCBhbGlnbmVkKQorCQkJd0N1clJ4ID0KKwkJCSAgICAoV09SRCkgKCh3Q3VyUnggKyB1aUxlbmd0aCArIHNpemVvZihkd1J4U3RhdHVzKSArCisJCQkJICAgICAzKSAmIH4weDMpOworCQkJRURSVl9UUkFDRV9DQVBSKHdDdXJSeCAtIDB4MTApOworCQkJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19DQVBSLCB3Q3VyUnggLSAweDEwKTsKKworCQkJLy8gcmVyZWFkIGN1cnJlbnQgb2Zmc2V0IGluIHJlY2VpdmUgYnVmZmVyCisJCQl3Q3VyUnggPQorCQkJICAgIChFRFJWX1JFR1dfUkVBRChFRFJWX1JFR1dfQ0FQUikgKworCQkJICAgICAweDEwKSAlIEVEUlZfUlhfQlVGRkVSX0xFTkdUSDsKKworCQl9CisJfQorCisJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9TRVJSKSAhPSAwKSB7CS8vIFBDSSBlcnJvcgorCQlFRFJWX0NPVU5UX1BDSV9FUlI7CisJfQorCisJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9USU1FT1VUKSAhPSAwKSB7CS8vIFRpbWVvdXQKKwkJRURSVl9DT1VOVF9USU1FT1VUOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gaUhhbmRsZWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZJbml0T25lCisvLworLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIG9uZSBQQ0kgZGV2aWNlCisvLworLy8gUGFyYW1ldGVyczogIHBQY2lEZXYgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNvcnJlc3BvbmRpbmcgUENJIGRldmljZSBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgICBwSWQgICAgICAgICAgICAgICAgID0gUENJIGRldmljZSBJRAorLy8KKy8vIFJldHVybnM6ICAgICAoaW50KSAgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRWRydkluaXRPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwSWQpCit7CisJaW50IGlSZXN1bHQgPSAwOworCURXT1JEIGR3VGVtcDsKKworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gTlVMTCkgewkvLyBFZHJ2IGlzIGFscmVhZHkgY29ubmVjdGVkIHRvIGEgUENJIGRldmljZQorCQlwcmludGsoIiVzIGRldmljZSAlcyBkaXNjYXJkZWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIHBjaV9uYW1lKHBQY2lEZXYpKTsKKwkJaVJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocFBjaURldi0+cmV2aXNpb24gPj0gMHgyMCkgeworCQlwcmludGsKKwkJICAgICgiJXMgZGV2aWNlICVzIGlzIGFuIGVuaGFuY2VkIDgxMzlDKyB2ZXJzaW9uLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUocFBjaURldikpOworCQlpUmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBFeGl0OworCX0KKworCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IHBQY2lEZXY7CisKKwkvLyBlbmFibGUgZGV2aWNlCisJcHJpbnRrKCIlcyBlbmFibGUgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworCWlSZXN1bHQgPSBwY2lfZW5hYmxlX2RldmljZShwUGNpRGV2KTsKKwlpZiAoaVJlc3VsdCAhPSAwKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBjaV9yZXNvdXJjZV9mbGFncyhwUGNpRGV2LCAxKSAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKSB7CisJCWlSZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIEV4aXQ7CisJfQorCisJcHJpbnRrKCIlcyByZXF1ZXN0IHJlZ2lvbnNcbiIsIF9fRlVOQ1RJT05fXyk7CisJaVJlc3VsdCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocFBjaURldiwgRFJWX05BTUUpOworCWlmIChpUmVzdWx0ICE9IDApIHsKKwkJZ290byBFeGl0OworCX0KKworCXByaW50aygiJXMgaW9yZW1hcFxuIiwgX19GVU5DVElPTl9fKTsKKwlFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgPQorCSAgICBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwUGNpRGV2LCAxKSwKKwkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocFBjaURldiwgMSkpOworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgPT0gTlVMTCkgewkvLyByZW1hcCBvZiBjb250cm9sbGVyJ3MgcmVnaXN0ZXIgc3BhY2UgZmFpbGVkCisJCWlSZXN1bHQgPSAtRUlPOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGVuYWJsZSBQQ0kgYnVzbWFzdGVyCisJcHJpbnRrKCIlcyBlbmFibGUgYnVzbWFzdGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCXBjaV9zZXRfbWFzdGVyKHBQY2lEZXYpOworCisJLy8gcmVzZXQgY29udHJvbGxlcgorCXByaW50aygiJXMgcmVzZXQgY29udHJvbGxlclxuIiwgX19GVU5DVElPTl9fKTsKKwlFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIEVEUlZfUkVHQl9DT01NQU5EX1JTVCk7CisKKwkvLyB3YWl0IHVudGlsIHJlc2V0IGhhcyBmaW5pc2hlZAorCWZvciAoaVJlc3VsdCA9IDUwMDsgaVJlc3VsdCA+IDA7IGlSZXN1bHQtLSkgeworCQlpZiAoKEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSAmIEVEUlZfUkVHQl9DT01NQU5EX1JTVCkKKwkJICAgID09IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJc2NoZWR1bGVfdGltZW91dCgxMCk7CisJfQorCisJLy8gY2hlY2sgaGFyZHdhcmUgdmVyc2lvbiwgaS5lLiBjaGlwIElECisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVENSKTsKKwlpZiAoKChkd1RlbXAgJiBFRFJWX1JFR0RXX1RDUl9WRVJfTUFTSykgIT0gRURSVl9SRUdEV19UQ1JfVkVSX0MpCisJICAgICYmICgoZHdUZW1wICYgRURSVl9SRUdEV19UQ1JfVkVSX01BU0spICE9IEVEUlZfUkVHRFdfVENSX1ZFUl9EKSkgewkvLyB1bnN1cHBvcnRlZCBjaGlwCisJCXByaW50aygiJXMgVW5zdXBwb3J0ZWQgY2hpcCEgVENSID0gMHglMDhsWFxuIiwgX19GVU5DVElPTl9fLAorCQkgICAgICAgZHdUZW1wKTsKKwkJaVJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzCisJcHJpbnRrKCIlcyBkaXNhYmxlIGludGVycnVwdHNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfTUFTSywgMCk7CisJLy8gYWNrbm93bGVkZ2UgYWxsIHBlbmRpbmcgaW50ZXJydXB0cworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX1NUQVRVUywKKwkJCUVEUlZfUkVHV19SRUFEKEVEUlZfUkVHV19JTlRfU1RBVFVTKSk7CisKKwkvLyBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyCisJcHJpbnRrKCIlcyBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCWlSZXN1bHQgPQorCSAgICByZXF1ZXN0X2lycShwUGNpRGV2LT5pcnEsIFRndEV0aElzciwgSVJRRl9TSEFSRUQsCisJCQlEUlZfTkFNRSAvKnBQY2lEZXYtPmRldi5uYW1lICovICwgcFBjaURldik7CisJaWYgKGlSZXN1bHQgIT0gMCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisvKgorICAgIC8vIHVubG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICAgIHByaW50aygiJXMgdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIEVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ01EOTM0NiwgRURSVl9SRUdCX0NNRDkzNDZfVU5MT0NLKTsKKworICAgIC8vIGNoZWNrIGlmIHVzZXIgc3BlY2lmaWVkIGEgTUFDIGFkZHJlc3MKKyAgICBwcmludGsoIiVzIGNoZWNrIHNwZWNpZmllZCBNQUMgYWRkcmVzc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICBmb3IgKGlSZXN1bHQgPSAwOyBpUmVzdWx0IDwgNjsgaVJlc3VsdCsrKQorICAgIHsKKyAgICAgICAgaWYgKEVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCIlcyBzZXQgbG9jYWwgTUFDIGFkZHJlc3NcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAvLyB3cml0ZSB0aGlzIE1BQyBhZGRyZXNzIHRvIGNvbnRyb2xsZXIKKyAgICAgICAgICAgIEVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19JRFIwLAorICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKERXT1JEKikmRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkclswXSkpKTsKKyAgICAgICAgICAgIGR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX0lEUjApOworCisgICAgICAgICAgICBFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfSURSNCwKKyAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdSgqKChEV09SRCopJkVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLm1fYWJNeU1hY0FkZHJbNF0pKSk7CisgICAgICAgICAgICBkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19JRFI0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlSZXN1bHQgPSAwOworCisgICAgLy8gbG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICAgIEVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ01EOTM0NiwgRURSVl9SRUdCX0NNRDkzNDZfTE9DSyk7CisqLworCisJLy8gYWxsb2NhdGUgYnVmZmVycworCXByaW50aygiJXMgYWxsb2NhdGUgYnVmZmVyc1xuIiwgX19GVU5DVElPTl9fKTsKKwlFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChwUGNpRGV2LCBFRFJWX1RYX0JVRkZFUl9TSVpFLAorCQkJCSAmRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEpOworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPT0gTlVMTCkgeworCQlpUmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBFeGl0OworCX0KKworCUVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9CisJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfUlhfQlVGRkVSX1NJWkUsCisJCQkJICZFZHJ2SW5zdGFuY2VfbC5tX3BSeEJ1ZkRtYSk7CisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9PSBOVUxMKSB7CisJCWlSZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlc2V0IHBvaW50ZXJzIGZvciBUeCBidWZmZXJzCisJcHJpbnRrKCIlcyByZXNldCBwb2ludGVycyBmbyBUeCBidWZmZXJzXG4iLCBfX0ZVTkNUSU9OX18pOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMCwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDApOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMSwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDEpOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMiwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDIpOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMywgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDMpOworCisJcHJpbnRrKCIgICAgQ29tbWFuZCA9IDB4JTAyWFxuIiwKKwkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CisKKwkvLyBzZXQgcG9pbnRlciBmb3IgcmVjZWl2ZSBidWZmZXIgaW4gY29udHJvbGxlcgorCXByaW50aygiJXMgc2V0IHBvaW50ZXIgdG8gUnggYnVmZmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQlNUQVJULCBFZHJ2SW5zdGFuY2VfbC5tX3BSeEJ1ZkRtYSk7CisKKwkvLyBlbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyCisJcHJpbnRrKCIlcyBlbmFibGUgVHggYW5kIFJ4IiwgX19GVU5DVElPTl9fKTsKKwlFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsCisJCQkoRURSVl9SRUdCX0NPTU1BTkRfUkUgfCBFRFJWX1JFR0JfQ09NTUFORF9URSkpOworCXByaW50aygiICBDb21tYW5kID0gMHglMDJYXG4iLAorCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKKworCS8vIGNsZWFyIG1pc3NlZCBwYWNrZXQgY291bnRlciB0byBlbmFibGUgUngvVHggcHJvY2VzcworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NUEMsIDApOworCisJLy8gc2V0IHRyYW5zbWl0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwlwcmludGsoIiVzIHNldCBUeCBjb25mIHJlZ2lzdGVyIiwgX19GVU5DVElPTl9fKTsKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfVENSLCBFRFJWX1JFR0RXX1RDUl9ERUYpOworCXByaW50aygiID0gMHglMDhYXG4iLCBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UQ1IpKTsKKworCS8vIHNldCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwlwcmludGsoIiVzIHNldCBSeCBjb25mIHJlZ2lzdGVyIiwgX19GVU5DVElPTl9fKTsKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfUkNSLCBFRFJWX1JFR0RXX1JDUl9ERUYpOworCXByaW50aygiID0gMHglMDhYXG4iLCBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19SQ1IpKTsKKworCS8vIHJlc2V0IG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmaWx0ZXIKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSMCwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjQsIDApOworCWR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjQpOworCisvKgorICAgIC8vIGVuYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIKKyAgICBwcmludGsoIiVzIGVuYWJsZSBUeCBhbmQgUngiLCBfX0ZVTkNUSU9OX18pOworICAgIEVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgKEVEUlZfUkVHQl9DT01NQU5EX1JFIHwgRURSVl9SRUdCX0NPTU1BTkRfVEUpKTsKKyAgICBwcmludGsoIiAgQ29tbWFuZCA9IDB4JTAyWFxuIiwgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CisqLworCS8vIGRpc2FibGUgZWFybHkgaW50ZXJydXB0cworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfTVVMSU5ULCAwKTsKKworCS8vIGVuYWJsZSBpbnRlcnJ1cHRzCisJcHJpbnRrKCIlcyBlbmFibGUgaW50ZXJydXB0c1xuIiwgX19GVU5DVElPTl9fKTsKKwlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCBFRFJWX1JFR1dfSU5UX01BU0tfREVGKTsKKworICAgICAgRXhpdDoKKwlwcmludGsoIiVzIGZpbmlzaGVkIHdpdGggJWRcbiIsIF9fRlVOQ1RJT05fXywgaVJlc3VsdCk7CisJcmV0dXJuIGlSZXN1bHQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZSZW1vdmVPbmUKKy8vCisvLyBEZXNjcmlwdGlvbjogc2h1dHMgZG93biBvbmUgUENJIGRldmljZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwUGNpRGV2ICAgICAgICAgICAgID0gcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIFBDSSBkZXZpY2Ugc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgICh2b2lkKQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEVkcnZSZW1vdmVPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYpCit7CisKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ICE9IHBQY2lEZXYpIHsJLy8gdHJ5aW5nIHRvIHJlbW92ZSB1bmtub3duIGRldmljZQorCQlCVUdfT04oRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ICE9IHBQY2lEZXYpOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGRpc2FibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyCisJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELCAwKTsKKworCS8vIGRpc2FibGUgaW50ZXJydXB0cworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX01BU0ssIDApOworCisJLy8gcmVtb3ZlIGludGVycnVwdCBoYW5kbGVyCisJZnJlZV9pcnEocFBjaURldi0+aXJxLCBwUGNpRGV2KTsKKworCS8vIGZyZWUgYnVmZmVycworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgIT0gTlVMTCkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfVFhfQlVGRkVSX1NJWkUsCisJCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiwKKwkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEpOworCQlFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPSBOVUxMOworCX0KKworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgIT0gTlVMTCkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfUlhfQlVGRkVSX1NJWkUsCisJCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiwKKwkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wUnhCdWZEbWEpOworCQlFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPSBOVUxMOworCX0KKwkvLyB1bm1hcCBjb250cm9sbGVyJ3MgcmVnaXN0ZXIgc3BhY2UKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICE9IE5VTEwpIHsKKwkJaW91bm1hcChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIpOworCX0KKwkvLyBkaXNhYmxlIHRoZSBQQ0kgZGV2aWNlCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBQY2lEZXYpOworCisJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9ucworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocFBjaURldik7CisKKwlFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgPSBOVUxMOworCisgICAgICBFeGl0OjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydkNhbGNIYXNoCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGVudHJ5IGZvciB0aGUgaGFzaC10YWJsZSBmcm9tIE1BQworLy8gICAgICAgICAgICAgIGFkZHJlc3MKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGJNQUNfcCAtIHBvaW50ZXIgdG8gTUFDIGFkZHJlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgaGFzaCB2YWx1ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEhBU0hfQklUUyAgICAgICAgICAgICAgNgkvLyB1c2VkIGJpdHMgaW4gaGFzaAorI2RlZmluZSBDUkMzMl9QT0xZICAgIDB4MDRDMTFEQjYJLy8KKy8vI2RlZmluZSBDUkMzMl9QT0xZICAgIDB4RURCODgzMjAgIC8vCisvLyBHKHgpID0geDMyICsgeDI2ICsgeDIzICsgeDIyICsgeDE2ICsgeDEyICsgeDExICsgeDEwICsgeDggKyB4NyArIHg1ICsgeDQgKyB4MiArIHggKyAxCisKK3N0YXRpYyBCWVRFIEVkcnZDYWxjSGFzaChCWVRFICogcGJNQUNfcCkKK3sKKwlEV09SRCBkd0J5dGVDb3VudGVyOworCURXT1JEIGR3Qml0Q291bnRlcjsKKwlEV09SRCBkd0RhdGE7CisJRFdPUkQgZHdDcmM7CisJRFdPUkQgZHdDYXJyeTsKKwlCWVRFICpwYkRhdGE7CisJQllURSBiSGFzaDsKKworCXBiRGF0YSA9IHBiTUFDX3A7CisKKwkvLyBjYWxjdWxhdGUgY3JjMzIgdmFsdWUgb2YgbWFjIGFkZHJlc3MKKwlkd0NyYyA9IDB4RkZGRkZGRkY7CisKKwlmb3IgKGR3Qnl0ZUNvdW50ZXIgPSAwOyBkd0J5dGVDb3VudGVyIDwgNjsgZHdCeXRlQ291bnRlcisrKSB7CisJCWR3RGF0YSA9ICpwYkRhdGE7CisJCXBiRGF0YSsrOworCQlmb3IgKGR3Qml0Q291bnRlciA9IDA7IGR3Qml0Q291bnRlciA8IDg7CisJCSAgICAgZHdCaXRDb3VudGVyKyssIGR3RGF0YSA+Pj0gMSkgeworCQkJZHdDYXJyeSA9ICgoKGR3Q3JjID4+IDMxKSBeIGR3RGF0YSkgJiAxKTsKKwkJCWR3Q3JjID0gZHdDcmMgPDwgMTsKKwkJCWlmIChkd0NhcnJ5ICE9IDApIHsKKwkJCQlkd0NyYyA9IChkd0NyYyBeIENSQzMyX1BPTFkpIHwgZHdDYXJyeTsKKwkJCX0KKwkJfQorCX0KKworLy8gICAgcHJpbnRrKCJNeUNSQyA9IDB4JTA4bFhcbiIsIGR3Q3JjKTsKKwkvLyBvbmx5IHVwcGVyIDYgYml0cyAoSEFTSF9CSVRTKSBhcmUgdXNlZAorCS8vIHdoaWNoIHBvaW50IHRvIHNwZWNpZmljIGJpdCBpbiB0aGUgaGFzaCByZWdpc3RlcnMKKwliSGFzaCA9IChCWVRFKSAoKGR3Q3JjID4+ICgzMiAtIEhBU0hfQklUUykpICYgMHgzZik7CisKKwlyZXR1cm4gYkhhc2g7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZGZWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjUyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZGZWMuaApAQCAtMCwwICsxLDExNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGludGVyZmFjZSBmb3IgZXRoZXJuZXRkcml2ZXIKKyAgICAgICAgICAgICAgICAiZmFzdCBldGhlcm5ldCBjb250cm9sbGVyIiAoRkVDKQorICAgICAgICAgICAgICAgIGZyZWVzY2FsZSBjb2xkZmlyZSBNQ0Y1Mjh4IGFuZCBjb21wYXRpYmxlIEZFQworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVkcnZGZWMuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBEZXYgQysrIGFuZCBHTlUtQ29tcGlsZXIgZm9yIG02OGsKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA1LzA4LzAxIG0uYi46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRURSVkZFQ19IXworI2RlZmluZSBfRURSVkZFQ19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRvIHRoaXMgaW4gY29uZmlnIGhlYWRlcgorI2RlZmluZSBUQVJHRVRfSEFSRFdBUkUgVEdUSFdfU1BMQ19DRjU0CisKKy8vIGJhc2UgYWRkcmVzc2VzCisjaWYgKChUQVJHRVRfSEFSRFdBUkUgJiBUR1RfQ1BVX01BU0tfKSA9PSBUR1RfQ1BVXzUyODIpCisKKyNlbGlmICgoVEFSR0VUX0hBUkRXQVJFICYgVEdUX0NQVV9NQVNLXykgPT0gVEdUX0NQVV81NDg1KQorCisjZWxzZQorCisjZXJyb3IgJ0VSUk9SOiBUYXJnZXQgd2FzIG5ldmVyIGltcGxlbWVudGVkIScKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGZvcm1hdAordHlwZWRlZiBzdHJ1Y3QgeworCVdPUkQgbV93U3RhdHVzOwkJLy8gY29udHJvbCAvIHN0YXR1cyAgLS0tICB1c2VkIGJ5IGVkcnYsIGRvIG5vdCBjaGFuZ2UgaW4gYXBwbGljYXRpb24KKwlXT1JEIG1fd0xlbmd0aDsJCS8vIHRyYW5zZmVyIGxlbmd0aAorCUJZVEUgKm1fcGJEYXRhOwkJLy8gYnVmZmVyIGFkZHJlc3MKK30gdEJ1ZmZlckRlc2NyOworCisjaWYgKChUQVJHRVRfSEFSRFdBUkUgJiBUR1RfQ1BVX01BU0tfKSA9PSBUR1RfQ1BVXzUyODIpCisKKyNlbGlmICgoVEFSR0VUX0hBUkRXQVJFICYgVEdUX0NQVV9NQVNLXykgPT0gVEdUX0NQVV81NDg1KQorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FRFJWX0ZFQ19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2RmVjNTI4Mi5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2RmVjNTI4Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmJiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZGZWM1MjgyLmgKQEAgLTAsMCArMSwzNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbnRlcmZhY2UgZm9yIGV0aGVybmV0ZHJpdmVyCisgICAgICAgICAgICAgICAgImZhc3QgZXRoZXJuZXQgY29udHJvbGxlciIgKEZFQykKKyAgICAgICAgICAgICAgICBmcmVlc2NhbGUgY29sZGZpcmUgTUNGNTI4eCBhbmQgY29tcGF0aWJsZSBGRUMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFZHJ2RmVjNTI4Mi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIERldiBDKysgYW5kIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMDgvMDEgbS5iLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FRFJWRkVDX0hfCisjZGVmaW5lIF9FRFJWRkVDX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYmFzZSBhZGRyZXNzZXMKKyNkZWZpbmUgRkVDMF9BRERSIDB4MDAwMAorI2RlZmluZSBGRUMxX0FERFIgMHgwMDAwCS8vdGJkCisKKy8vIGNvbnRyb2wgLyBzdGF0dXMgcmVnaXN0ZXJzCisjZGVmaW5lIEZFQ19FSVIgICAgICAgICAgICAgICAgIDB4MTAwNAkvLyBpbnRlcnJ1cHQgZXZlbnQgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX0VJTVIgICAgICAgICAgICAgICAgMHgxMDA4CS8vIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19SREFSICAgICAgICAgICAgICAgIDB4MTAxMAkvLyByZWNlaXZlIGRlc2NyaXB0b3IgYWN0aXZlIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19UREFSICAgICAgICAgICAgICAgIDB4MTAxNAkvLyB0cmFuc21pdCBkZXNjcmlwdG9yIGFjdGl2ZSByZWdpc3RlcgorI2RlZmluZSBGRUNfRUNSICAgICAgICAgICAgICAgICAweDEwMjQJLy8gZXRoZXJuZXQgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBGRUNfTU1GUiAgICAgICAgICAgICAgICAweDEwNDAJLy8gTUlJIGRhdGEgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX01TQ1IgICAgICAgICAgICAgICAgMHgxMDQ0CS8vIE1JSSBzcGVlZCByZWdpc3RlcgorI2RlZmluZSBGRUNfTUlCQyAgICAgICAgICAgICAgICAweDEwNjQJLy8gTUlCIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19SQ1IgICAgICAgICAgICAgICAgIDB4MTA4NAkvLyByZWNlaXZlIGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1RDUiAgICAgICAgICAgICAgICAgMHgxMEM0CS8vIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1BBTFIgICAgICAgICAgICAgICAgMHgxMEU0CS8vIHBoeXNpY2FsIGFkZHJlc3MgbG93IHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19QQVVSICAgICAgICAgICAgICAgIDB4MTBFOAkvLyBwaHlzaWNhbCBhZGRyZXNzIGhpZ2ggKyB0eXBlIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19PUEQgICAgICAgICAgICAgICAgIDB4MTBFQwkvLyBvcGNvZGUgKyBwYXVzZSByZWdpc3RlcgorI2RlZmluZSBGRUNfSUFVUiAgICAgICAgICAgICAgICAweDExMTgJLy8gdXBwZXIgMzIgYml0IG9mIGluZGl2aWR1YWwgaGFzaCB0YWJsZQorI2RlZmluZSBGRUNfSUFMUiAgICAgICAgICAgICAgICAweDExMUMJLy8gbG93ZXIgMzIgYml0IG9mIGluZGl2aWR1YWwgaGFzaCB0YWJsZQorI2RlZmluZSBGRUNfR0FVUiAgICAgICAgICAgICAgICAweDExMjAJLy8gdXBwZXIgMzIgYml0IG9mIGdyb3VwIGhhc2ggdGFibGUKKyNkZWZpbmUgRkVDX0dBTFIgICAgICAgICAgICAgICAgMHgxMTI0CS8vIGxvd2VyIDMyIGJpdCBvZiBncm91cCBoYXNoIHRhYmxlCisjZGVmaW5lIEZFQ19URldSICAgICAgICAgICAgICAgIDB4MTE0NAkvLyB0cmFuc21pdCBGSUZPIHdhdGVybWFyaworI2RlZmluZSBGRUNfRlJCUiAgICAgICAgICAgICAgICAweDExNEMJLy8gRklGTyByZWNlaXZlIGJvdW5kIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19GUlNSICAgICAgICAgICAgICAgIDB4MTE1MAkvLyBGSUZPIHJlY2VpdmUgRklGTyBzdGFydCByZWdpc3RlcgorI2RlZmluZSBGRUNfRVJEU1IgICAgICAgICAgICAgICAweDExODAJLy8gcG9pbnRlciB0byByZWNlaXZlIGRlc2NyaXB0b3IgcmluZworI2RlZmluZSBGRUNfRVREU1IgICAgICAgICAgICAgICAweDExODQJLy8gcG9pbnRlciB0byB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcKKyNkZWZpbmUgRkVDX0VNUkJSICAgICAgICAgICAgICAgMHgxMTg4CS8vIG1heGltdW0gcmVjZWl2ZSBidWZmZXIgc2l6ZQorCisvLyBtaWIgYmxvY2sgY291bnRlcnMgbWVtb3J5IG1hcAorI2RlZmluZSBGRUNfUk1PTl9UX0RST1AgICAgICAgICAweDEyMDAJLy8gY291bnQgb2YgZnJhbWVzIG5vdCBjb3VudGVkIGNvcnJlY3RseQorI2RlZmluZSBGRUNfUk1PTl9UX1BBQ0tFVFMgICAgICAweDEyMDQJLy8gUk1PTiB0eCBwYWNrZXQgY291bnQKKyNkZWZpbmUgRkVDX1JNT05fVF9CQ19QS1QgICAgICAgMHgxMjA4CS8vIFJNT04gdHggYnJvYWRjYXN0IHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9NQ19QS1QgICAgICAgMHgxMjBDCS8vIFJNT04gdHggbXVsdGljYXN0IHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9DUkNfQUxJR04gICAgMHgxMjEwCS8vIFJNT04gdHggcGFja2V0cyB3IENSQy9hbGlnbiBlcnJvcgorI2RlZmluZSBGRUNfUk1PTl9UX1VOREVSU0laRSAgICAweDEyMTQJLy8gUk1PTiB0eCBwYWNrZXRzIDwgNjQgYnl0ZXMsIGdvb2QgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1RfT1ZFUlNJWkUgICAgIDB4MTIxOAkvLyBSTU9OIHR4IHBhY2tldHMgPiBNQVhfRkwgYnl0ZXMsIGdvb2QgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1RfRlJBRyAgICAgICAgIDB4MTIxQwkvLyBSTU9OIHR4IHBhY2tldHMgPCA2NCBieXRlcywgYmFkIENSQworI2RlZmluZSBGRUNfUk1PTl9UX0pBQiAgICAgICAgICAweDEyMjAJLy8gUk1PTiB0eCBwYWNrZXRzID4gTUFYX0ZMIGJ5dGVzLCBiYWQgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1RfQ09MICAgICAgICAgIDB4MTIyNAkvLyBSTU9OIHR4IGNvbGxpc2lvbiBjb3VudAorI2RlZmluZSBGRUNfUk1PTl9UX1A2NCAgICAgICAgICAweDEyMjgJLy8gUk1PTiB0eCAgICAgICAgICAgNjQgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfUDY1VE8xMjcgICAgIDB4MTIyQwkvLyBSTU9OIHR4ICAgNjUgdG8gIDEyNyBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9QMTI4VE8yNTUgICAgMHgxMjMwCS8vIFJNT04gdHggIDEyOCB0byAgMjU1IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX1AyNTZUTzUxMSAgICAweDEyMzQJLy8gUk1PTiB0eCAgMjU2IHRvICA1MTEgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfUDUxMlRPMTAyMyAgIDB4MTIzOAkvLyBSTU9OIHR4ICA1MTIgdG8gMTAyMyBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9QMTAyNFRPMjA0NyAgMHgxMjNDCS8vIFJNT04gdHggMTAyNCB0byAyMDQ3IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX1BfR1RFMjA0OCAgICAweDEyNDAJLy8gUk1PTiB0eCB3ID4gMjA0OCBieXRlcworI2RlZmluZSBGRUNfUk1PTl9UX09DVEVUUyAgICAgICAweDEyNDQJLy8gUk1PTiB0eCBvY3RldHMKKyNkZWZpbmUgRkVDX0lFRUVfVF9EUk9QICAgICAgICAgMHgxMjQ4CS8vIGNvdW50IG9mIGZyYW1lcyBub3QgY291bnRlZCBjb3JyZWN0bHkKKyNkZWZpbmUgRkVDX0lFRUVfVF9GUkFNRV9PSyAgICAgMHgxMjRDCS8vIGZyYW1lcyB0cmFuc21pdHRlZCBPSworI2RlZmluZSBGRUNfSUVFRV9UXzFDT0wgICAgICAgICAweDEyNTAJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGggc2luZ2xlIGNvbGxpc2lvbgorI2RlZmluZSBGRUNfSUVFRV9UX01DT0wgICAgICAgICAweDEyNTQJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGggbXVsdGlwbGUgY29sbGlzaW9ucworI2RlZmluZSBGRUNfSUVFRV9UX0RFRiAgICAgICAgICAweDEyNTgJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIGFmdGVyIGRlZmVycmFsIGRlbGF5CisjZGVmaW5lIEZFQ19JRUVFX1RfTENPTCAgICAgICAgIDB4MTI1QwkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCBsYXRlIGNvbGxpc2lvbnMKKyNkZWZpbmUgRkVDX0lFRUVfVF9FWENPTCAgICAgICAgMHgxMjYwCS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIGV4Y2Vzc2l2ZSBjb2xsaXNpb25zCisjZGVmaW5lIEZFQ19JRUVFX1RfTUFDRVJSICAgICAgIDB4MTI2NAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCB0eC1GSUZPIHVuZGVycnVuCisjZGVmaW5lIEZFQ19JRUVFX1RfQ1NFUlIgICAgICAgIDB4MTI2OAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCBjYXJyaWVyIHNlbnNlIGVycm9yCisjZGVmaW5lIEZFQ19JRUVFX1RfU1FFICAgICAgICAgIDB4MTI2QwkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCBTUUUgZXJyb3IKKyNkZWZpbmUgRkVDX0lFRUVfVF9GRFhGQyAgICAgICAgMHgxMjcwCS8vIGZsb3cgY29udHJvbCBwYXVzZSBmcmFtZXMgdHJhbnNtaXR0ZWQKKyNkZWZpbmUgRkVDX0lFRUVfVF9PQ1RFVFNfT0sgICAgMHgxMjc0CS8vIG9jdGV0IGNvdW50IGZvciBmcmFtZXMgdHJhbnNtaXR0ZWQgdy9vIGVycm9yCisjZGVmaW5lIEZFQ19STU9OX1JfUEFDS0VUUyAgICAgIDB4MTI4NAkvLyBSTU9OIHJ4IHBhY2tldCBjb3VudAorI2RlZmluZSBGRUNfUk1PTl9SX0JDX1BLVCAgICAgICAweDEyODgJLy8gUk1PTiByeCBicm9hZGNhc3QgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX01DX1BLVCAgICAgICAweDEyOEMJLy8gUk1PTiByeCBtdWx0aWNhc3QgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX0NSQ19BTElHTiAgICAweDEyOTAJLy8gUk1PTiByeCBwYWNrZXRzIHcgQ1JDL2FsaWduIGVycm9yCisjZGVmaW5lIEZFQ19STU9OX1JfVU5ERVJTSVpFICAgIDB4MTI5NAkvLyBSTU9OIHJ4IHBhY2tldHMgPCA2NCBieXRlcywgZ29vZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fUl9PVkVSU0laRSAgICAgMHgxMjk4CS8vIFJNT04gcnggcGFja2V0cyA+IE1BWF9GTCBieXRlcywgZ29vZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fUl9GUkFHICAgICAgICAgMHgxMjlDCS8vIFJNT04gcnggcGFja2V0cyA8IDY0IGJ5dGVzLCBiYWQgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1JfSkFCICAgICAgICAgIDB4MTJBMAkvLyBSTU9OIHJ4IHBhY2tldHMgPiBNQVhfRkwgYnl0ZXMsIGJhZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fUl9SRVNWRF8wICAgICAgMHgxMkE0CS8vCisjZGVmaW5lIEZFQ19STU9OX1JfUDY0ICAgICAgICAgIDB4MTJBOAkvLyBSTU9OIHJ4ICAgICAgICAgICA2NCBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9QNjVUMDEyNyAgICAgMHgxMkFDCS8vIFJNT04gcnggICA2NSB0byAgMTI3IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX1AxMjhUTzI1NSAgICAweDEyQjAJLy8gUk1PTiByeCAgMTI4IHRvICAyNTUgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfUDI1NlRPNTExICAgIDB4MTJCNAkvLyBSTU9OIHJ4ICAyNTYgdG8gIDUxMSBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9QNTEyVE8xMDIzICAgMHgxMkI4CS8vIFJNT04gcnggIDUxMiB0byAxMDIzIGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX1AxMDI0VE8yMDQ3ICAweDEyQkMJLy8gUk1PTiByeCAxMDI0IHRvIDIwNDcgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfR1RFMjA0OCAgICAgIDB4MTJDMAkvLyBSTU9OIHJ4IHcgPiAyMDQ4IGJ5dGVzCisjZGVmaW5lIEZFQ19STU9OX1JfT0NURVRTICAgICAgIDB4MTJDNAkvLyBSTU9OIHJ4IG9jdGV0cworI2RlZmluZSBGRUNfSUVFRV9SX0RST1AgICAgICAgICAweDEyQzgJLy8gY291bnQgb2YgZnJhbWVzIG5vdCBjb3VudGVkIGNvcnJlY3RseQorI2RlZmluZSBGRUNfSUVFRV9SX0ZSQU1FX09LICAgICAweDEyQ0MJLy8gZnJhbWVzIHJlY2VpdmVkIE9LCisjZGVmaW5lIEZFQ19JRUVFX1JfQ1JDICAgICAgICAgIDB4MTJEMAkvLyBmcmFtZXMgcmVjZWl2ZWQgd2l0aCBDUkMgZXJyb3IKKyNkZWZpbmUgRkVDX0lFRUVfUl9BTElHTiAgICAgICAgMHgxMkQ0CS8vIGZyYW1lcyByZWNlaXZlZCB3aXRoIGFsaWdubWVudCBlcnJvcgorI2RlZmluZSBGRUNfSUVFRV9SX01BQ0VSUiAgICAgICAweDEyRDgJLy8gcmVjZWl2ZSBGSUZPIG92ZXJmbG93IGNvdW50CisjZGVmaW5lIEZFQ19JRUVFX1JfRkRYRkMgICAgICAgIDB4MTJEQwkvLyBmbG93IGNvbnRyb2wgcGF1c2UgZnJhbWVzIHJlY2VpdmVkCisjZGVmaW5lIEZFQ19JRUVFX1JfT0NURVRTX09LICAgIDB4MTJFMAkvLyBvY3RldCBjb3VudCBmb3IgZnJhbWVzIHJjdmQgdy9vIGVycm9yCisKKy8vIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zCisjZGVmaW5lIEZFQ19FSVJfVU4gICAgICAgICAgICAgICgweDAwMDgwMDAwKQorI2RlZmluZSBGRUNfRUlSX1JMICAgICAgICAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9MQyAgICAgICAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfRUJFUlIgICAgICAgICAgICgweDAwNDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX01JSSAgICAgICAgICAgICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9SWEIgICAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfUlhGICAgICAgICAgICAgICgweDAyMDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX1RYQiAgICAgICAgICAgICAoMHgwNDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9UWEYgICAgICAgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfR1JBICAgICAgICAgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX0JBQlQgICAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9CQUJSICAgICAgICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfSEJFUlIgICAgICAgICAgICgweDgwMDAwMDAwKQorCisjZGVmaW5lIEZFQ19FSU1SX1VOICAgICAgICAgICAgICgweDAwMDgwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9STCAgICAgICAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfTEMgICAgICAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX0VCRVJSICAgICAgICAgICgweDAwNDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9NSUkgICAgICAgICAgICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfUlhCICAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX1JYRiAgICAgICAgICAgICgweDAyMDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9UWEIgICAgICAgICAgICAoMHgwNDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfVFhGICAgICAgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX0dSQSAgICAgICAgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9CQUJUICAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfQkFCUiAgICAgICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX0hCRVJSICAgICAgICAgICgweDgwMDAwMDAwKQorCisjZGVmaW5lIEZFQ19SREFSX1JfREVTX0FDVElWRSAgICgweDAxMDAwMDAwKQorCisjZGVmaW5lIEZFQ19UREFSX1hfREVTX0FDVElWRSAgICgweDAxMDAwMDAwKQorCisjZGVmaW5lIEZFQ19FQ1JfUkVTRVQgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBGRUNfRUNSX0VUSEVSX0VOICAgICAgICAoMHgwMDAwMDAwMikKKworI2RlZmluZSBGRUNfTU1GUl9EQVRBKHgpICAgICAgICAoKCh4KSAmIDB4RkZGRikpCisjZGVmaW5lIEZFQ19NTUZSX1RBICAgICAgICAgICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBGRUNfTU1GUl9SQSh4KSAgICAgICAgICAoKCh4KSAmIDB4MUYpIDw8IDE4KQorI2RlZmluZSBGRUNfTU1GUl9QQSh4KSAgICAgICAgICAoKCh4KSAmIDB4MUYpIDw8IDIzKQorI2RlZmluZSBGRUNfTU1GUl9PUF9XUiAgICAgICAgICAoMHgxMDAwMDAwMCkKKyNkZWZpbmUgRkVDX01NRlJfT1BfUkQgICAgICAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIEZFQ19NTUZSX1NUICAgICAgICAgICAgICgweDQwMDAwMDAwKQorCisjZGVmaW5lIEZFQ19NU0NSX01JSV9TUEVFRCh4KSAgICgoKHgpICYgMHgxRikgPDwgMSkKKyNkZWZpbmUgRkVDX01TQ1JfRElTX1BSRUFNQkxFICAgKDB4MDAwMDAwMDgpCisKKyNkZWZpbmUgRkVDX01JQkNfTUlCX0lETEUgICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIEZFQ19NSUJDX01JQl9ESVNBQkxFICAgICgweDgwMDAwMDAwKQorCisjZGVmaW5lIEZFQ19SQ1JfTE9PUCAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBGRUNfUkNSX0RSVCAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgRkVDX1JDUl9NSUlfTU9ERSAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIEZFQ19SQ1JfUFJPTSAgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBGRUNfUkNSX0JDX1JFSiAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgRkVDX1JDUl9GQ0UgICAgICAgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIEZFQ19SQ1JfTUFYX0ZMKHgpICAgICAgICgoKHgpICYgMHgwN0ZGKSA8PCAxNikKKworI2RlZmluZSBGRUNfVENSX0dUUyAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgRkVDX1RDUl9IQkMgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIEZFQ19UQ1JfRkRFTiAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBGRUNfVENSX1RGQ19QQVVTRSAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgRkVDX1RDUl9SRkNfUEFVU0UgICAgICAgKDB4MDAwMDAwMTApCisKKyNkZWZpbmUgRkVDX1BBTFJfQllURTMoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgMCkKKyNkZWZpbmUgRkVDX1BBTFJfQllURTIoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgOCkKKyNkZWZpbmUgRkVDX1BBTFJfQllURTEoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAxNikKKyNkZWZpbmUgRkVDX1BBTFJfQllURTAoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAyNCkKKworLy8jZGVmaW5lIEZFQ19QQVVSX1RZUEUoeCkgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAgMCkKKyNkZWZpbmUgRkVDX1BBVVJfQllURTUoeCkgICAgICAgKCgoeCkgJiAgIDB4RkYpIDw8IDE2KQorI2RlZmluZSBGRUNfUEFVUl9CWVRFNCh4KSAgICAgICAoKCh4KSAmICAgMHhGRikgPDwgMjQpCisKKyNkZWZpbmUgRkVDX09QRF9QQVVTRV9EVVIoeCkgICAgKCgoeCkgJiAweEZGRkYpKQorLy8jZGVmaW5lIEZFQ19PUERfT1BDT0RFKHgpICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAxNikKKworLy9tLmIuCisjZGVmaW5lIEZFQ19JQVVSX0JZVEU3KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDApCisjZGVmaW5lIEZFQ19JQVVSX0JZVEU2KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDgpCisjZGVmaW5lIEZFQ19JQVVSX0JZVEU1KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMTYpCisjZGVmaW5lIEZFQ19JQVVSX0JZVEU0KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMjQpCisKKyNkZWZpbmUgRkVDX0lBTFJfQllURTMoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgMCkKKyNkZWZpbmUgRkVDX0lBTFJfQllURTIoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgOCkKKyNkZWZpbmUgRkVDX0lBTFJfQllURTEoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAxNikKKyNkZWZpbmUgRkVDX0lBTFJfQllURTAoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAyNCkKKworI2RlZmluZSBGRUNfR0FVUl9CWVRFNyh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICAwKQorI2RlZmluZSBGRUNfR0FVUl9CWVRFNih4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICA4KQorI2RlZmluZSBGRUNfR0FVUl9CWVRFNSh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDE2KQorI2RlZmluZSBGRUNfR0FVUl9CWVRFNCh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDI0KQorCisjZGVmaW5lIEZFQ19HQUxSX0JZVEUzKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDApCisjZGVmaW5lIEZFQ19HQUxSX0JZVEUyKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDgpCisjZGVmaW5lIEZFQ19HQUxSX0JZVEUxKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMTYpCisjZGVmaW5lIEZFQ19HQUxSX0JZVEUwKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMjQpCisvLyBeXl5eCisKKyNkZWZpbmUgRkVDX1RGV1JfWF9XTVJLXzY0ICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIEZFQ19URldSX1hfV01SS18xMjggICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBGRUNfVEZXUl9YX1dNUktfMTkyICAgICAoMHgwMDAwMDAwMykKKworLy9tLmIuCisjZGVmaW5lIEZFQ19GUkJSX1JfQk9VTkQoeCkgICAgICgoKHgpICYgMHhGRikgPDwgMikKKworLy9tLmIuCisjZGVmaW5lIEZFQ19GUlNSX1JfRlNUQVJUKHgpICAgICgoKHgpICYgMHhGRikgPDwgMikKKworLy9tLmIuCisjZGVmaW5lIEZFQ19FUkRTUl9SX0RFU19TVEFSVCh4KSAgKCgoeCkgJiAweDNGRkZGRkZGKSA8PCAyKQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0VUU0RSX1hfREVTX1NUQVJUKHgpICAoKCh4KSAmIDB4M0ZGRkZGRkYpIDw8IDIpCisKKyNkZWZpbmUgRkVDX0VNUkJSX1JfQlVGX1NJWkUoeCkgKCgoeCkgJiAweDdGKSA8PCAgNCkKKworI2RlZmluZSBGRUNfUnhCRF9UUiAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgRkVDX1J4QkRfT1YgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEZFQ19SeEJEX0NSICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBGRUNfUnhCRF9OTyAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRkVDX1J4QkRfTEcgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEZFQ19SeEJEX01DICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBGRUNfUnhCRF9CQyAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgRkVDX1J4QkRfTSAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEZFQ19SeEJEX0wgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBGRUNfUnhCRF9SMDIgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRkVDX1J4QkRfVyAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEZFQ19SeEJEX1IwMSAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGRUNfUnhCRF9JTlVTRSAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgRkVDX1J4QkRfRSAgICAgICAgICAgICAgMHg4MDAwCisKKy8vbS5iLgorLy8jZGVmaW5lIEZFQ19UeEJEX0NTTCAgICAgICAgICAgIDB4MDAwMQorLy8jZGVmaW5lIEZFQ19UeEJEX1VOICAgICAgICAgICAgIDB4MDAwMgorLy8jZGVmaW5lIEZFQ19UeEJEX1JMICAgICAgICAgICAgIDB4MDA0MAorLy8jZGVmaW5lIEZFQ19UeEJEX0xDICAgICAgICAgICAgIDB4MDA4MAorLy8jZGVmaW5lIEZFQ19UeEJEX0hCICAgICAgICAgICAgIDB4MDEwMAorLy8jZGVmaW5lIEZFQ19UeEJEX0RFRiAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBGRUNfVHhCRF9BQkMgICAgICAgICAgICAweDAyMDAKKy8vIF5eXl4KKyNkZWZpbmUgRkVDX1R4QkRfVEMgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEZFQ19UeEJEX0wgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBGRUNfVHhCRF9UTzIgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRkVDX1R4QkRfVyAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEZFQ19UeEJEX1RPMSAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGRUNfVHhCRF9JTlVTRSAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgRkVDX1R4QkRfUiAgICAgICAgICAgICAgMHg4MDAwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGZvcm1hdAordHlwZWRlZiBzdHJ1Y3QgeworCVdPUkQgbV93U3RhdHVzOwkJLy8gY29udHJvbCAvIHN0YXR1cyAgLS0tICB1c2VkIGJ5IGVkcnYsIGRvIG5vdCBjaGFuZ2UgaW4gYXBwbGljYXRpb24KKwlXT1JEIG1fd0xlbmd0aDsJCS8vIHRyYW5zZmVyIGxlbmd0aAorCUJZVEUgKm1fcGJEYXRhOwkJLy8gYnVmZmVyIGFkZHJlc3MKK30gdEJ1ZmZlckRlc2NyOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChOT19PRl9JTlNUQU5DRVMgPiAxKQorI2RlZmluZSBFQ0lfV1JJVEVfRFdfUkVHKG9mZix2YWwpICAgICAgICgqKERXT1JEICopKHZvaWQgKikoJl9fSVBTQkFSW29mZl0pID0gdmFsKQorI2RlZmluZSBFQ0lfUkVBRF9EV19SRUcob2ZmKSAgICAgICAgICAgICgqKERXT1JEICopKHZvaWQgKikoJl9fSVBTQkFSW29mZl0pKQorI2Vsc2UKKyNpZiAoRURSVl9VU0VEX0VUSF9DVFJMID09IDApCisjZGVmaW5lIEVDSV9XUklURV9EV19SRUcob2ZmLHZhbCkgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbRkVDMF9BRERSK29mZl0pID0gdmFsKQorI2RlZmluZSBFQ0lfUkVBRF9EV19SRUcob2ZmKSAgICAgICAgICAgICgqKERXT1JEICopKHZvaWQgKikoJl9fSVBTQkFSW0ZFQzBfQUREUitvZmZdKSkKKyNlbHNlCisjZGVmaW5lIEVDSV9XUklURV9EV19SRUcob2ZmLHZhbCkgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbRkVDMV9BRERSK29mZl0pID0gdmFsKQorI2RlZmluZSBFQ0lfUkVBRF9EV19SRUcob2ZmKSAgICAgICAgICAgICgqKERXT1JEICopKHZvaWQgKikoJl9fSVBTQkFSW0ZFQzFfQUREUitvZmZdKSkKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FRFJWX0ZFQ19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2U2ltLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZTaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTMwMGUzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydlNpbS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbnRlcmZhY2UgZm9yIGV0aGVybmV0IGRyaXZlciBzaW11bGF0aW9uCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydlNpbS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIERldiBDKysgYW5kIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTUgZC5rLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FRFJWU0lNX0hfCisjZGVmaW5lIF9FRFJWU0lNX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEVkcnZSeEludGVycnVwdEhhbmRsZXIoQllURSBiQnVmZmVySW5GcmFtZV9wLCBCWVRFICogcGJFdGhlcm5ldERhdGFfcCwKKwkJCSAgICBXT1JEIHdEYXRhTGVuX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRURSVlNJTV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2MGY3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBBUEkgbGF5ZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0FQSV9IXworI2RlZmluZSBfRVBMX0FQSV9IXworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAiRXBsU2RvLmgiCisjaW5jbHVkZSAiRXBsT2JkLmgiCisjaW5jbHVkZSAiRXBsTGVkLmgiCisjaW5jbHVkZSAiRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJdEVwbE5tdFN0YXRlIG1fTm10U3RhdGU7CisJdEVwbE5tdE5vZGVFdmVudCBtX05vZGVFdmVudDsKKwlXT1JEIG1fd0Vycm9yQ29kZTsJLy8gRVBMIGVycm9yIGNvZGUgaWYgbV9Ob2RlRXZlbnQgPT0ga0VwbE5tdE5vZGVFdmVudEVycm9yCisJQk9PTCBtX2ZNYW5kYXRvcnk7CisKK30gdEVwbEFwaUV2ZW50Tm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxObXRTdGF0ZSBtX05tdFN0YXRlOwkvLyBsb2NhbCBOTVQgc3RhdGUKKwl0RXBsTm10Qm9vdEV2ZW50IG1fQm9vdEV2ZW50OworCVdPUkQgbV93RXJyb3JDb2RlOwkvLyBFUEwgZXJyb3IgY29kZSBpZiBtX0Jvb3RFdmVudCA9PSBrRXBsTm10Qm9vdEV2ZW50RXJyb3IKKworfSB0RXBsQXBpRXZlbnRCb290OworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbExlZFR5cGUgbV9MZWRUeXBlOwkvLyB0eXBlIG9mIHRoZSBMRUQgKGUuZy4gU3RhdHVzIG9yIEVycm9yKQorCUJPT0wgbV9mT247CQkvLyBzdGF0ZSBvZiB0aGUgTEVEIChlLmcuIG9uIG9yIG9mZikKKworfSB0RXBsQXBpRXZlbnRMZWQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbEFwaUV2ZW50Tm10U3RhdGVDaGFuZ2UgPSAweDEwLAkvLyBtX05tdFN0YXRlQ2hhbmdlCisvLyAgICBrRXBsQXBpRXZlbnRSZXF1ZXN0Tm10ICAgICA9IDB4MTEsICAgIC8vIG1fYk5tdENtZAorCWtFcGxBcGlFdmVudENyaXRpY2FsRXJyb3IgPSAweDEyLAkvLyBtX0ludGVybmFsRXJyb3IsIFN0YWNrIGhhbHRlZAorCWtFcGxBcGlFdmVudFdhcm5pbmcgPSAweDEzLAkvLyBtX0ludGVybmFsRXJyb3IsIFN0YWNrIHJ1bm5pbmcKKwlrRXBsQXBpRXZlbnROb2RlID0gMHgyMCwJLy8gbV9Ob2RlCisJa0VwbEFwaUV2ZW50Qm9vdCA9IDB4MjEsCS8vIG1fQm9vdAorCWtFcGxBcGlFdmVudFNkbyA9IDB4NjIsCS8vIG1fU2RvCisJa0VwbEFwaUV2ZW50T2JkQWNjZXNzID0gMHg2OSwJLy8gbV9PYmRDYlBhcmFtCisJa0VwbEFwaUV2ZW50TGVkID0gMHg3MCwJLy8gbV9MZWQKKworfSB0RXBsQXBpRXZlbnRUeXBlOworCit0eXBlZGVmIHVuaW9uIHsKKwl0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZSBtX05tdFN0YXRlQ2hhbmdlOworCXRFcGxFdmVudEVycm9yIG1fSW50ZXJuYWxFcnJvcjsKKwl0RXBsU2RvQ29tRmluaXNoZWQgbV9TZG87CisJdEVwbE9iZENiUGFyYW0gbV9PYmRDYlBhcmFtOworCXRFcGxBcGlFdmVudE5vZGUgbV9Ob2RlOworCXRFcGxBcGlFdmVudEJvb3QgbV9Cb290OworCXRFcGxBcGlFdmVudExlZCBtX0xlZDsKKworfSB0RXBsQXBpRXZlbnRBcmc7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgUk9NICogdEVwbEFwaUNiRXZlbnQpICh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCQkJCSB0RXBsQXBpRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCwJLy8gSU46IGV2ZW50IGFyZ3VtZW50ICh1bmlvbikKKwkJCQkJCSB2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpU2l6ZU9mU3RydWN0OworCUJPT0wgbV9mQXN5bmNPbmx5OwkvLyBkbyBub3QgbmVlZCB0byByZWdpc3RlciBQUmVzCisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CS8vIGxvY2FsIG5vZGUgSUQKKwlCWVRFIG1fYWJNYWNBZGRyZXNzWzZdOwkvLyBsb2NhbCBNQUMgYWRkcmVzcworCisJLy8gMHgxRjgyOiBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCURXT1JEIG1fZHdGZWF0dXJlRmxhZ3M7CisJLy8gQ3ljbGUgTGVuZ3RoICgweDEwMDY6IE5NVF9DeWNsZUxlbl9VMzIpIGluIFt1c10KKwlEV09SRCBtX2R3Q3ljbGVMZW47CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwkvLyAweDFGOTg6IE5NVF9DeWNsZVRpbWluZ19SRUMKKwkvLyAweDFGOTguMTogSXNvY2hyVHhNYXhQYXlsb2FkX1UxNgorCXVuc2lnbmVkIGludCBtX3VpSXNvY2hyVHhNYXhQYXlsb2FkOwkvLyBjb25zdAorCS8vIDB4MUY5OC4yOiBJc29jaHJSeE1heFBheWxvYWRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlJc29jaHJSeE1heFBheWxvYWQ7CS8vIGNvbnN0CisJLy8gMHgxRjk4LjM6IFBSZXNNYXhMYXRlbmN5X1UzMgorCURXT1JEIG1fZHdQcmVzTWF4TGF0ZW5jeTsJLy8gY29uc3QgaW4gW25zXSwgb25seSByZXF1aXJlZCBmb3IgSWRlbnRSZXMKKwkvLyAweDFGOTguNDogUFJlcUFjdFBheWxvYWRMaW1pdF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aVByZXFBY3RQYXlsb2FkTGltaXQ7CS8vIHJlcXVpcmVkIGZvciBpbml0aWFsaXNhdGlvbiAoKzI4IGJ5dGVzKQorCS8vIDB4MUY5OC41OiBQUmVzQWN0UGF5bG9hZExpbWl0X1UxNgorCXVuc2lnbmVkIGludCBtX3VpUHJlc0FjdFBheWxvYWRMaW1pdDsJLy8gcmVxdWlyZWQgZm9yIGluaXRpYWxpc2F0aW9uIG9mIFByZXMgZnJhbWUgKCsyOCBieXRlcykKKwkvLyAweDFGOTguNjogQVNuZE1heExhdGVuY3lfVTMyCisJRFdPUkQgbV9kd0FzbmRNYXhMYXRlbmN5OwkvLyBjb25zdCBpbiBbbnNdLCBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCS8vIDB4MUY5OC43OiBNdWx0aXBsQ3ljbGVDbnRfVTgKKwl1bnNpZ25lZCBpbnQgbV91aU11bHRpcGxDeWNsZUNudDsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCS8vIDB4MUY5OC44OiBBc3luY01UVV9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aUFzeW5jTXR1OwkvLyByZXF1aXJlZCB0byBzZXQgdXAgbWF4IGZyYW1lIHNpemUKKwkvLyAweDFGOTguOTogUHJlc2NhbGVyX1UxNgorCXVuc2lnbmVkIGludCBtX3VpUHJlc2NhbGVyOwkvLyByZXF1aXJlZCBmb3Igc3luYworCS8vICQkJCBNdWx0aXBsZXhlZCBTbG90CisKKwkvLyAweDFDMTQ6IERMTF9Mb3NzT2ZGcmFtZVRvbGVyYW5jZV9VMzIgaW4gW25zXQorCURXT1JEIG1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZTsKKworCS8vIDB4MUY4QTogTk1UX01OQ3ljbGVUaW1pbmdfUkVDCisJLy8gMHgxRjhBLjE6IFdhaXRTb0NQUmVxX1UzMiBpbiBbbnNdCisJRFdPUkQgbV9kd1dhaXRTb2NQcmVxOworCisJLy8gMHgxRjhBLjI6IEFzeW5jU2xvdFRpbWVvdXRfVTMyIGluIFtuc10KKwlEV09SRCBtX2R3QXN5bmNTbG90VGltZW91dDsKKworCURXT1JEIG1fZHdEZXZpY2VUeXBlOwkvLyBOTVRfRGV2aWNlVHlwZV9VMzIKKwlEV09SRCBtX2R3VmVuZG9ySWQ7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuVmVuZG9ySWRfVTMyCisJRFdPUkQgbV9kd1Byb2R1Y3RDb2RlOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlByb2R1Y3RDb2RlX1UzMgorCURXT1JEIG1fZHdSZXZpc2lvbk51bWJlcjsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5SZXZpc2lvbk5vX1UzMgorCURXT1JEIG1fZHdTZXJpYWxOdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuU2VyaWFsTm9fVTMyCisJUVdPUkQgbV9xd1ZlbmRvclNwZWNpZmljRXh0MTsKKwlEV09SRCBtX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mRGF0ZV9VMzIKKwlEV09SRCBtX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mVGltZV9VMzIKKwlEV09SRCBtX2R3QXBwbGljYXRpb25Td0RhdGU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd0RhdGVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgZGF0ZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fZHdBcHBsaWNhdGlvblN3VGltZTsJLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3VGltZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciB0aW1lIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJRFdPUkQgbV9kd0lwQWRkcmVzczsKKwlEV09SRCBtX2R3U3VibmV0TWFzazsKKwlEV09SRCBtX2R3RGVmYXVsdEdhdGV3YXk7CisJQllURSBtX3NIb3N0bmFtZVszMl07CisJQllURSBtX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzQ4XTsKKworCWNoYXIgKm1fcHN6RGV2TmFtZTsJLy8gTk1UX01hbnVmYWN0RGV2TmFtZV9WUyAoMHgxMDA4LzAgbG9jYWwgT0QpCisJY2hhciAqbV9wc3pId1ZlcnNpb247CS8vIE5NVF9NYW51ZmFjdEh3VmVyc19WUyAgKDB4MTAwOS8wIGxvY2FsIE9EKQorCWNoYXIgKm1fcHN6U3dWZXJzaW9uOwkvLyBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgICgweDEwMEEvMCBsb2NhbCBPRCkKKworCXRFcGxBcGlDYkV2ZW50IG1fcGZuQ2JFdmVudDsKKwl2b2lkICptX3BFdmVudFVzZXJBcmc7CisJdEVwbFN5bmNDYiBtX3BmbkNiU3luYzsKKworfSB0RXBsQXBpSW5pdFBhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCAqbV9wSW1hZ2U7CisJdW5zaWduZWQgaW50IG1fdWlTaXplOworCit9IHRFcGxBcGlQcm9jZXNzSW1hZ2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlJbml0aWFsaXplKHRFcGxBcGlJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlTaHV0ZG93bih2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUmVhZE9iamVjdCh0RXBsU2RvQ29tQ29uSGRsICogcFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkgICB2b2lkICpwRHN0RGF0YV9sZV9wLAorCQkJCSAgIHVuc2lnbmVkIGludCAqcHVpU2l6ZV9wLAorCQkJCSAgIHRFcGxTZG9UeXBlIFNkb1R5cGVfcCwgdm9pZCAqcFVzZXJBcmdfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVdyaXRlT2JqZWN0KHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSAgICB2b2lkICpwU3JjRGF0YV9sZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTaXplX3AsCisJCQkJICAgIHRFcGxTZG9UeXBlIFNkb1R5cGVfcCwgdm9pZCAqcFVzZXJBcmdfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUZyZWVTZG9DaGFubmVsKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlSZWFkTG9jYWxPYmplY3QodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlTaXplX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCQkgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJIHVuc2lnbmVkIGludCB1aVNpemVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiT2JkQWNjZXNzKHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpTGlua09iamVjdCh1bnNpZ25lZCBpbnQgdWlPYmpJbmRleF9wLAorCQkJCSAgIHZvaWQgKnBWYXJfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVZhckVudHJpZXNfcCwKKwkJCQkgICB0RXBsT2JkU2l6ZSAqIHBFbnRyeVNpemVfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlGaXJzdFN1YmluZGV4X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlFeGVjTm10Q29tbWFuZCh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3Modm9pZCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlNblRyaWdnZXJTdGF0ZUNoYW5nZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICB0RXBsTm10Tm9kZUNvbW1hbmQgTm9kZUNvbW1hbmRfcCk7CisjZW5kaWYKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpR2V0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJIHRFcGxJZGVudFJlc3BvbnNlICoqCisJCQkJCSBwcElkZW50UmVzcG9uc2VfcCk7CisKKy8vIGZ1bmN0aW9ucyBmb3IgcHJvY2VzcyBpbWFnZSB3aWxsIGJlIGltcGxlbWVudGVkIGluIHNlcGFyYXRlIGZpbGUKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZVNldHVwKHZvaWQpOwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbih0RXBsQXBpUHJvY2Vzc0ltYWdlICogcFBJX3ApOwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQodEVwbEFwaVByb2Nlc3NJbWFnZSAqIHBQSV9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9BUElfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQW1pLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTA0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFtaS5oCkBAIC0wLDAgKzEsMzYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgRGVmaW5pdGlvbnMgZm9yIEFic3RyYWN0IE1lbW9yeSBJbnRlcmZhY2UKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxBbWkuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBHQ0MKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAgMDYuMDMuMjAwMCAgLXJzCisgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbgorCisgICAxNi4wOS4yMDAyICAtYXMKKyAgICAgICAgICAgICAgIFRvIHNhdmUgY29kZSBzcGFjZSB0aGUgZnVuY3Rpb25zIEFtaVNldEJ5dGUgYW5kIEFtaUdldEJ5dGUKKyAgICAgICAgICAgICAgIGFyZSByZXBsYWNlZCBieSBtYWNyb3MuIEZvciB0YXJnZXRzIHdoaWNoIGFzc2lnbiBCWVRFIGJ5CisgICAgICAgICAgICAgICBhbiAxNkJpdCB0eXBlLCB0aGUgZGVmaW5pdGlvbiBvZiBtYWNyb3MgbXVzdCBjaGFuZ2VkIHRvCisgICAgICAgICAgICAgICBmdW5jdGlvbnMuCisKKyAgIDIzLjAyLjIwMDUgIHIuZC46CisgICAgICAgICAgICAgICBGdW5jdGlvbnMgaW5jbHVkZWQgZm9yIGV4dGVuZGVkIGRhdGEgdHlwZXMgc3VjaCBhcyBVTlNJR05FRDI0LAorICAgICAgICAgICAgICAgVU5TSUdORUQ0MCwgLi4uCisKKyAgIDEzLjA2LjIwMDYgIGQuay46CisgICAgICAgICAgICAgICBFeHRlbmRlZCB0aGUgaW50ZXJmYWNlIGZvciBFUEwgd2l0aCB0aGUgZGlmZmVyZW50IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgZm9yIGxpdHRsZSBlbmRpYW4gYW5kIGJpZyBlbmRpYW4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMQU1JX0hfCisjZGVmaW5lIF9FUExBTUlfSF8KKworI2lmICgoREVWX1NZU1RFTSAmIF9ERVZfNjRCSVRfU1VQUE9SVF8pID09IDApCisvLyAgICAjaWZkZWYgVVNFX1ZBUjY0CisjZXJyb3IgJ0VSUk9SOiBkZXZlbG9wbWVudCBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCA2NCBiaXQgb3BlcmF0aW9ucyEnCisvLyAgICAjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFByb3RvdHlwZW4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisjaWYgZGVmaW5lZChJTkxJTkVfRlVOQ1RJT05fREVGKQorI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisjZGVmaW5lIElOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2RlZmluZSBFUExfQU1JX0lOTElORUQKKyNpbmNsdWRlICIuLi9FcGxTdGFjay9hbWl4ODYuYyIKKyNlbmRpZgorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKQorI2lmIGRlZmluZWQoX19tNjhrX18pCQkvLyBpdCBpcyBhbiBiaWcgZW5kaWFuIG1hY2hpbmUKKyNpZiBkZWZpbmVkKElOTElORV9GVU5DVElPTl9ERUYpCisjdW5kZWYgIElOTElORV9GVU5DVElPTgorI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYKKyNkZWZpbmUgSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisjZGVmaW5lIEVQTF9BTUlfSU5MSU5FRAorI2luY2x1ZGUgIi4uL0VwbFN0YWNrL2FtaWJlLmMiCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gd3JpdGUgZnVuY3Rpb25zCisvLworLy8gVG8gc2F2ZSBjb2RlIHNwYWNlIHRoZSBmdW5jdGlvbiBBbWlTZXRCeXRlIGlzIHJlcGxhY2VkIGJ5CisvLyBhbiBtYWNyby4KKy8vIHZvaWQgICBQVUJMSUMgIEFtaVNldEJ5dGUgICh2b2lkIEZBUiogcEFkZHJfcCwgQllURSBiQnl0ZVZhbF9wKTsKKworI2RlZmluZSBBbWlTZXRCeXRlVG9CZShwQWRkcl9wLCBiQnl0ZVZhbF9wKSAgeyooQllURSBGQVIqKShwQWRkcl9wKSA9IChiQnl0ZVZhbF9wKTt9CisjZGVmaW5lIEFtaVNldEJ5dGVUb0xlKHBBZGRyX3AsIGJCeXRlVmFsX3ApICB7KihCWVRFIEZBUiopKHBBZGRyX3ApID0gKGJCeXRlVmFsX3ApO30KKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCXZvaWQgUFVCTElDIEFtaVNldFdvcmRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgV09SRCB3V29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBEV09SRCBkd0R3b3JkVmFsX3ApOworCXZvaWQgUFVCTElDIEFtaVNldFdvcmRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgV09SRCB3V29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBEV09SRCBkd0R3b3JkVmFsX3ApOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gcmVhZCBmdW5jdGlvbnMKKy8vCisvLyBUbyBzYXZlIGNvZGUgc3BhY2UgdGhlIGZ1bmN0aW9uIEFtaUdldEJ5dGUgaXMgcmVwbGFjZWQgYnkKKy8vIGFuIG1hY3JvLgorLy8gQllURSAgIFBVQkxJQyAgQW1pR2V0Qnl0ZSAgKHZvaWQgRkFSKiBwQWRkcl9wKTsKKworI2RlZmluZSBBbWlHZXRCeXRlRnJvbUJlKHBBZGRyX3ApICAoKihCWVRFIEZBUiopKHBBZGRyX3ApKQorI2RlZmluZSBBbWlHZXRCeXRlRnJvbUxlKHBBZGRyX3ApICAoKihCWVRFIEZBUiopKHBBZGRyX3ApKQorCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKwlXT1JEIFBVQkxJQyBBbWlHZXRXb3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJRFdPUkQgUFVCTElDIEFtaUdldER3b3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJV09SRCBQVUJMSUMgQW1pR2V0V29yZEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCURXT1JEIFBVQkxJQyBBbWlHZXREd29yZEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXREd29yZDI0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDI0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIGR3RHdvcmRWYWxfcCAgICA9IHZhbHVlIHRvIHNldAorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaVNldER3b3JkMjRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgRFdPUkQgZHdEd29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIERXT1JEIGR3RHdvcmRWYWxfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldER3b3JkMjQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDI0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBEV09SRCAgICAgICAgICAgPSByZWFkIHZhbHVlCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCURXT1JEIFBVQkxJQyBBbWlHZXREd29yZDI0RnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJRFdPUkQgUFVCTElDIEFtaUdldER3b3JkMjRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKworLy8jaWZkZWYgVVNFX1ZBUjY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDAoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDAgYml0IHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQwVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0MFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQwKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA0MCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDBGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0MEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQ4KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQ4IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0OFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDhUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0OCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDggYml0IHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQ4RnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDhGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ1NigpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA1NiBiaXQgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNTZUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNTYoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDU2IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDU2RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNjQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDY0VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ2NFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDY0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA2NCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ2NEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDY0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFRpbWVPZkRheSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaVNldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJICAgIHRUaW1lT2ZEYXkgRkFSICogcFRpbWVPZkRheV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0VGltZU9mRGF5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaUdldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJICAgIHRUaW1lT2ZEYXkgRkFSICogcFRpbWVPZkRheV9wKTsKKworI2VuZGlmCisKKyN1bmRlZiAgSU5MSU5FX0VOQUJMRUQJCS8vIGRpc2FibGUgYWN0dWFsIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI2RlZmluZSBFUExfQU1JX0lOQ0xVREVECisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYJCQkJLy8gaWZuZGVmIF9FUExBTUlfSF8KKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpR2VuZXJpYy5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlHZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxOWUzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpR2VuZXJpYy5jCkBAIC0wLDAgKzEsMjA2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBnZW5lcmljIEVQTCBBUEkgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQXBpR2VuZXJpYy5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4yMSAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA5LzA1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEVycm9ySGFuZGxlcmsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE5tdGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsT2Jkay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxUaW1lcmsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisjaW5jbHVkZSAidXNlci9FcGxMZWR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXRDbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdE1udS5oIgorI2luY2x1ZGUgInVzZXIvRXBsU2RvQ29tdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsSWRlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxTdGF0dXN1LmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuaCIKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgPT0gMCkKKyNlcnJvciAiRVBMIEFQSSBsYXllciBuZWVkcyBFUEwgbW9kdWxlIE9CREshIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbEFwaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxBcGlJbml0UGFyYW0gbV9Jbml0UGFyYW07CisKK30gdEVwbEFwaUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxBcGlJbnN0YW5jZSBFcGxBcGlJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTk1UIHN0YXRlIGNoYW5nZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTm10U3RhdGVDaGFuZ2UodEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwkJCQkJCU5tdFN0YXRlQ2hhbmdlX3ApOworCisvLyB1cGRhdGUgRExMIGNvbmZpZ3VyYXRpb24gZnJvbSBPRAorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVVwZGF0ZURsbENvbmZpZyhCT09MIGZVcGRhdGVJZGVudGl0eV9wKTsKKworLy8gdXBkYXRlIE9EIGZyb20gaW5pdCBwYXJhbQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVVwZGF0ZU9iZCh2b2lkKTsKKworLy8gcHJvY2VzcyBldmVudHMgZnJvbSB1c2VyIGV2ZW50IHF1ZXVlCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFcGxFdmVudF9wKTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisvLyBjYWxsYmFjayBmdW5jdGlvbiBvZiBTRE8gbW9kdWxlCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpQ2JTZG9Db24odEVwbFNkb0NvbUZpbmlzaGVkICogcFNkb0NvbUZpbmlzaGVkX3ApOworI2VuZGlmCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisvLyBjYWxsYmFjayBmdW5jdGlvbnMgb2YgTm10TW51IG1vZHVsZQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTm9kZUV2ZW50KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICB0RXBsTm10Tm9kZUV2ZW50IE5vZGVFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3AsCisJCQkJCSAgIEJPT0wgZk1hbmRhdG9yeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiQm9vdEV2ZW50KHRFcGxObXRCb290RXZlbnQgQm9vdEV2ZW50X3AsCisJCQkJCSAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCQkgICBXT1JEIHdFcnJvckNvZGVfcCk7CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisvLyBjYWxsYmFjayBmdW5jdGlvbiBvZiBMZWR1IG1vZHVsZQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTGVkU3RhdGVDaGFuZ2UodEVwbExlZFR5cGUgTGVkVHlwZV9wLAorCQkJCQkJQk9PTCBmT25fcCk7CisjZW5kaWYKKworLy8gT0QgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKGltcGxlbWVudGVkIGluIE9iamRpY3QuYykKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEluaXRSYW0odEVwbE9iZEluaXRQYXJhbSBNRU0gKiBwSW5pdFBhcmFtX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpSW5pdGlhbGl6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRVBMIHN0YWNrLgorLy8gICAgICAgICAgICAgIEFmdGVyIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gdGhlIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQKKy8vICAgICAgICAgICAgICB0aGUgTk1UIHN0YXRlIG1hY2hpbmUgdmlhCisvLyAgICAgICAgICAgICAgRXBsQXBpRXhlY05tdENvbW1hbmQoa0VwbE5tdEV2ZW50U3dSZXNldCkKKy8vICAgICAgICAgICAgICBhbmQgdGhlcmVieSB0aGUgd2hvbGUgRVBMIHN0YWNrIDotKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwSW5pdFBhcmFtX3AgICAgICAgICAgICA9IGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUluaXRpYWxpemUodEVwbEFwaUluaXRQYXJhbSAqIHBJbml0UGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRJbml0UGFyYW0gT2JkSW5pdFBhcmFtOworCXRFcGxEbGxrSW5pdFBhcmFtIERsbGtJbml0UGFyYW07CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxBcGlJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsQXBpSW5zdGFuY2VfZykpOworCisJRVBMX01FTUNQWSgmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbSwgcEluaXRQYXJhbV9wLAorCQkgICBtaW4oc2l6ZW9mKHRFcGxBcGlJbml0UGFyYW0pLAorCQkgICAgICAgcEluaXRQYXJhbV9wLT5tX3VpU2l6ZU9mU3RydWN0KSk7CisKKwkvLyBjaGVjayBldmVudCBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50ID09IE5VTEwpIHsJLy8gYXBwbGljYXRpb24gbXVzdCBhbHdheXMgaGF2ZSBhbiBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorCQlSZXQgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworCQlnb3RvIEV4aXQ7CisJfQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwkvLyBpbml0IE9ECisvLyBGSVhNRQorLy8gICAgUmV0ID0gRXBsT2JkSW5pdFJhbSgmT2JkSW5pdFBhcmFtKTsKKy8vICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisvLyAgICB7CisvLyAgICAgICAgZ290byBFeGl0OworLy8gICAgfQorCisJLy8gaW5pdGlhbGl6ZSBFcGxPYmQgbW9kdWxlCisJUmV0ID0gRXBsT2JkSW5pdCgmT2JkSW5pdFBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBFUExfTk9fRklGTworCVNoYkVycm9yID0gU2hiSW5pdCgpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsRXZlbnRrIG1vZHVsZQorCVJldCA9IEVwbEV2ZW50a0luaXQoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiU3luYyk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXRpYWxpemUgRXBsRXZlbnR1IG1vZHVsZQorCVJldCA9IEVwbEV2ZW50dUluaXQoRXBsQXBpUHJvY2Vzc0V2ZW50KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdCBFcGxUaW1lcmsgbW9kdWxlCisJUmV0ID0gRXBsVGltZXJrSW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbE5tdGsgbW9kdWxlIGJlZm9yZSBETEwKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJUmV0ID0gRXBsTm10a0luaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsRGxsayBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJRVBMX01FTUNQWShEbGxrSW5pdFBhcmFtLm1fYmVfYWJTcmNNYWMsCisJCSAgIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9hYk1hY0FkZHJlc3MsIDYpOworCVJldCA9IEVwbERsbGtBZGRJbnN0YW5jZSgmRGxsa0luaXRQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXRpYWxpemUgRXBsRXJyb3JIYW5kbGVyayBtb2R1bGUKKwlSZXQgPSBFcGxFcnJvckhhbmRsZXJrSW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbERsbGtDYWwgbW9kdWxlCisJUmV0ID0gRXBsRGxsa0NhbEFkZEluc3RhbmNlKCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0aWFsaXplIEVwbERsbHVDYWwgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCVJldCA9IEVwbERsbHVDYWxBZGRJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxQZG9rIG1vZHVsZQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJUmV0ID0gRXBsUGRva0FkZEluc3RhbmNlKCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsUGRva0NhbEFkZEluc3RhbmNlKCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0aWFsaXplIEVwbE5tdENudSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKwlSZXQgPSBFcGxObXRDbnVBZGRJbnN0YW5jZShFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlOb2RlSWQpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxObXR1IG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwlSZXQgPSBFcGxObXR1SW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZWdpc3RlciBOTVQgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwlSZXQgPSBFcGxObXR1UmVnaXN0ZXJTdGF0ZUNoYW5nZUNiKEVwbEFwaUNiTm10U3RhdGVDaGFuZ2UpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gaW5pdGlhbGl6ZSBFcGxObXRNbnUgbW9kdWxlCisJUmV0ID0gRXBsTm10TW51SW5pdChFcGxBcGlDYk5vZGVFdmVudCwgRXBsQXBpQ2JCb290RXZlbnQpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbElkZW50dSBtb2R1bGUKKwlSZXQgPSBFcGxJZGVudHVJbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXRpYWxpemUgRXBsU3RhdHVzdSBtb2R1bGUKKwlSZXQgPSBFcGxTdGF0dXN1SW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxMZWR1IG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKwlSZXQgPSBFcGxMZWR1SW5pdChFcGxBcGlDYkxlZFN0YXRlQ2hhbmdlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXQgU0RPIG1vZHVsZQorI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKSB8fCBcCisgICAgICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApKQorCS8vIGluaXQgc2RvIGNvbW1hbmQgbGF5ZXIKKwlSZXQgPSBFcGxTZG9Db21Jbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyB0aGUgYXBwbGljYXRpb24gbXVzdCBzdGFydCBOTVQgc3RhdGUgbWFjaGluZQorCS8vIHZpYSBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd1Jlc2V0KQorCS8vIGFuZCB0aGVyZWJ5IHRoZSB3aG9sZSBFUEwgc3RhY2sKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlTaHV0ZG93bigpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpU2h1dGRvd24odm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gJCQkIGQuay46IGNoZWNrIGlmIE5NVCBzdGF0ZSBpcyBOTVRfR1NfT0ZGCisKKwkvLyAkJCQgZC5rLjogbWF5YmUgZGVsZXRlIGV2ZW50IHF1ZXVlcyBhdCBmaXJzdCwgYnV0IHRoaXMgaW1wbGllcyB0aGF0CisJLy8gICAgICAgICAgIG5vIG90aGVyIG1vZHVsZSBtdXN0IG5vdCB1c2UgdGhlIGV2ZW50IHF1ZXVlcyBmb3IgY29tbXVuaWNhdGlvbgorCS8vICAgICAgICAgICBkdXJpbmcgc2h1dGRvd24uCisKKwkvLyBkZWxldGUgaW5zdGFuY2UgZm9yIGFsbCBtb2R1bGVzCisKKwkvLyBkZWluaXRpYWxpemUgRXBsU2RvQ29tIG1vZHVsZQorI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKSB8fCBcCisgICAgICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApKQorCVJldCA9IEVwbFNkb0NvbURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxTZG9Db21EZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbExlZHUgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0xFRFUpKSAhPSAwKQorCVJldCA9IEVwbExlZHVEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsTGVkdURlbEluc3RhbmNlKCk6ICAgIDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIGRlaW5pdGlhbGl6ZSBFcGxObXRNbnUgbW9kdWxlCisJUmV0ID0gRXBsTm10TW51RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbE5tdE1udURlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworCisJLy8gZGVpbml0aWFsaXplIEVwbElkZW50dSBtb2R1bGUKKwlSZXQgPSBFcGxJZGVudHVEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsSWRlbnR1RGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgRXBsU3RhdHVzdSBtb2R1bGUKKwlSZXQgPSBFcGxTdGF0dXN1RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbFN0YXR1c3VEZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbE5tdENudSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKwlSZXQgPSBFcGxObXRDbnVEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsTm10Q251RGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxObXR1IG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwlSZXQgPSBFcGxObXR1RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbE5tdHVEZWxJbnN0YW5jZSgpOiAgICAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsRGxsdUNhbCBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbERlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxEbGx1Q2FsRGVsSW5zdGFuY2UoKTogMHglWFxuIiwgUmV0KTsKKworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsRXZlbnR1IG1vZHVsZQorCVJldCA9IEVwbEV2ZW50dURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxFdmVudHVEZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxObXRrIG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwlSZXQgPSBFcGxObXRrRGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbE5tdGtEZWxJbnN0YW5jZSgpOiAgICAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsRGxsayBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJUmV0ID0gRXBsRGxsa0RlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxEbGxrRGVsSW5zdGFuY2UoKTogICAgMHglWFxuIiwgUmV0KTsKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxEbGxrQ2FsIG1vZHVsZQorCVJldCA9IEVwbERsbGtDYWxEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsRGxsa0NhbERlbEluc3RhbmNlKCk6IDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxFdmVudGsgbW9kdWxlCisJUmV0ID0gRXBsRXZlbnRrRGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworCisJLy8gZGVpbml0aWFsaXplIEVwbFRpbWVyayBtb2R1bGUKKwlSZXQgPSBFcGxUaW1lcmtEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsVGltZXJrRGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwlTaGJFeGl0KCk7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbEFwaUV4ZWNObXRDb21tYW5kKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZXhlY3V0ZXMgYSBOTVQgY29tbWFuZCwgaS5lLiBwb3N0IHRoZSBOTVQgY29tbWFuZC9ldmVudCB0byB0aGUKKy8vICAgICAgICAgICAgICBOTVRrIG1vZHVsZS4gTk1UIGNvbW1hbmRzIHdoaWNoIGFyZSBub3QgYXBwcm9wcmlhdGUgaW4gdGhlIGN1cnJlbnQKKy8vICAgICAgICAgICAgICBOTVQgc3RhdGUgYXJlIHNpbGVudGx5IGlnbm9yZWQuIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUKKy8vICAgICAgICAgICAgICBOTVQgc3RhdGUgbWF5IGNoYW5nZSB1bnRpbCB0aGUgTk1UIGNvbW1hbmQgaXMgYWN0dWFsbHkgZXhlY3V0ZWQuCisvLworLy8gUGFyYW1ldGVyczogIE5tdEV2ZW50X3AgICAgICAgICAgICAgID0gTk1UIGNvbW1hbmQvZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpRXhlY05tdENvbW1hbmQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwlSZXQgPSBFcGxObXR1Tm10RXZlbnQoTm10RXZlbnRfcCk7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbEFwaUxpbmtPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBtYXBzIGFycmF5IG9mIGFwcGxpY2F0aW9uIHZhcmlhYmxlcyBvbnRvIHNwZWNpZmllZCBvYmplY3QgaW4gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlPYmpJbmRleF9wICAgICAgICAgICAgPSBGdW5jdGlvbiBtYXBzIHZhcmlhYmxlcyBmb3IgdGhpcyBvYmplY3QgaW5kZXgKKy8vICAgICAgICAgICAgICBwVmFyX3AgICAgICAgICAgICAgICAgICA9IFBvaW50ZXIgdG8gZGF0YSBtZW1vcnkgYXJlYSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKKy8vICAgICAgICAgICAgICBwdWlWYXJFbnRyaWVzX3AgICAgICAgICA9IElOOiBwb2ludGVyIHRvIG51bWJlciBvZiBlbnRyaWVzIHRvIG1hcAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBwb2ludGVyIHRvIG51bWJlciBvZiBhY3R1YWxseSB1c2VkIGVudHJpZXMKKy8vICAgICAgICAgICAgICBwRW50cnlTaXplX3AgICAgICAgICAgICA9IElOOiBwb2ludGVyIHRvIHNpemUgb2Ygb25lIGVudHJ5OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNpemUgaXMgemVybywgdGhlIGFjdHVhbCBzaXplIHdpbGwgYmUgcmVhZCBmcm9tIE9ECisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHBvaW50ZXIgdG8gZW50aXJlIHNpemUgb2YgYWxsIGVudHJpZXMgbWFwcGVkCisvLyAgICAgICAgICAgICAgdWlGaXJzdFN1YmluZGV4X3AgICAgICAgPSBUaGlzIGlzIHRoZSBmaXJzdCBzdWJpbmRleCB0byBiZSBtYXBwZWQuCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUxpbmtPYmplY3QodW5zaWduZWQgaW50IHVpT2JqSW5kZXhfcCwKKwkJCQkgICB2b2lkICpwVmFyX3AsCisJCQkJICAgdW5zaWduZWQgaW50ICpwdWlWYXJFbnRyaWVzX3AsCisJCQkJICAgdEVwbE9iZFNpemUgKiBwRW50cnlTaXplX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpRmlyc3RTdWJpbmRleF9wKQoreworCUJZVEUgYlZhckVudHJpZXM7CisJQllURSBiSW5kZXhFbnRyaWVzOworCUJZVEUgTUVNICpwYkRhdGE7CisJdW5zaWduZWQgaW50IHVpU3ViaW5kZXg7CisJdEVwbFZhclBhcmFtIFZhclBhcmFtOworCXRFcGxPYmRTaXplIEVudHJ5U2l6ZTsKKwl0RXBsT2JkU2l6ZSBVc2VkU2l6ZTsKKworCXRFcGxLZXJuZWwgUmV0Q29kZSA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKChwVmFyX3AgPT0gTlVMTCkKKwkgICAgfHwgKHB1aVZhckVudHJpZXNfcCA9PSBOVUxMKQorCSAgICB8fCAoKnB1aVZhckVudHJpZXNfcCA9PSAwKQorCSAgICB8fCAocEVudHJ5U2l6ZV9wID09IE5VTEwpKSB7CisJCVJldENvZGUgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworCQlnb3RvIEV4aXQ7CisJfQorCisJcGJEYXRhID0gKEJZVEUgTUVNICopIHBWYXJfcDsKKwliVmFyRW50cmllcyA9IChCWVRFKSAqIHB1aVZhckVudHJpZXNfcDsKKwlVc2VkU2l6ZSA9IDA7CisKKwkvLyBpbml0IFZhclBhcmFtIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCisJVmFyUGFyYW0ubV91aUluZGV4ID0gdWlPYmpJbmRleF9wOworCVZhclBhcmFtLm1fVmFsaWRGbGFnID0ga1ZhclZhbGlkQWxsOworCisJaWYgKHVpRmlyc3RTdWJpbmRleF9wICE9IDApIHsJLy8gY2hlY2sgaWYgb2JqZWN0IGV4aXN0cyBieSByZWFkaW5nIHN1YmluZGV4IDB4MDAsCisJCS8vIGJlY2F1c2UgdXNlciB3YW50cyB0byBsaW5rIGEgdmFyaWFibGUgdG8gYSBzdWJpbmRleCB1bmVxdWFsIDB4MDAKKwkJLy8gcmVhZCBudW1iZXIgb2YgZW50cmllcworCQlFbnRyeVNpemUgPSAodEVwbE9iZFNpemUpIHNpemVvZihiSW5kZXhFbnRyaWVzKTsKKwkJUmV0Q29kZSA9IEVwbE9iZFJlYWRFbnRyeSh1aU9iakluZGV4X3AsCisJCQkJCSAgMHgwMCwKKwkJCQkJICAodm9pZCBHRU5FUklDICopJmJJbmRleEVudHJpZXMsCisJCQkJCSAgJkVudHJ5U2l6ZSk7CisKKwkJaWYgKChSZXRDb2RlICE9IGtFcGxTdWNjZXNzZnVsKSB8fCAoYkluZGV4RW50cmllcyA9PSAweDAwKSkgeworCQkJLy8gT2JqZWN0IGRvZXNuJ3QgZXhpc3Qgb3IgaW52YWxpZCBlbnRyeSBudW1iZXIKKwkJCVJldENvZGUgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0gZWxzZSB7CQkvLyB1c2VyIHdhbnRzIHRvIGxpbmsgYSB2YXJpYWJsZSB0byBzdWJpbmRleCAweDAwCisJCS8vIHRoYXQncyBPSworCQliSW5kZXhFbnRyaWVzID0gMDsKKwl9CisKKwkvLyBDb3JyZWN0IG51bWJlciBvZiBlbnRyaWVzIGlmIG51bWJlciByZWFkIGZyb20gT0QgaXMgZ3JlYXRlcgorCS8vIHRoYW4gdGhlIHNwZWNpZmllZCBudW1iZXIuCisJLy8gVGhpcyBpcyBkb25lLCBzbyB0aGF0IHdlIGRvIG5vdCBzZXQgbW9yZSBlbnRyaWVzIHRoYW4gc3ViaW5kZXhlcyB0aGUKKwkvLyBvYmplY3QgYWN0dWFsbHkgaGFzLgorCWlmICgoYkluZGV4RW50cmllcyA+IChiVmFyRW50cmllcyArIHVpRmlyc3RTdWJpbmRleF9wIC0gMSkpICYmCisJICAgIChiVmFyRW50cmllcyAhPSAweDAwKSkgeworCQliSW5kZXhFbnRyaWVzID0gKEJZVEUpIChiVmFyRW50cmllcyArIHVpRmlyc3RTdWJpbmRleF9wIC0gMSk7CisJfQorCS8vIG1hcCBlbnRyaWVzCisJZm9yICh1aVN1YmluZGV4ID0gdWlGaXJzdFN1YmluZGV4X3A7IHVpU3ViaW5kZXggPD0gYkluZGV4RW50cmllczsKKwkgICAgIHVpU3ViaW5kZXgrKykgeworCQkvLyBpZiBwYXNzZWQgZW50cnkgc2l6ZSBpcyAwLCB0aGVuIGdldCBzaXplIGZyb20gT0QKKwkJaWYgKCpwRW50cnlTaXplX3AgPT0gMHgwMCkgeworCQkJLy8gcmVhZCBlbnRyeSBzaXplCisJCQlFbnRyeVNpemUgPSBFcGxPYmRHZXREYXRhU2l6ZSh1aU9iakluZGV4X3AsIHVpU3ViaW5kZXgpOworCisJCQlpZiAoRW50cnlTaXplID09IDB4MDApIHsKKwkJCQkvLyBpbnZhbGlkIGVudHJ5IHNpemUgKG1heWJlIG9iamVjdCBkb2Vzbid0IGV4aXN0IG9yIGVudHJ5IG9mIHR5cGUgRE9NQUlOIGlzIGVtcHR5KQorCQkJCVJldENvZGUgPSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gdXNlIHBhc3NlZCBlbnRyeSBzaXplCisJCQlFbnRyeVNpemUgPSAqcEVudHJ5U2l6ZV9wOworCQl9CisKKwkJVmFyUGFyYW0ubV91aVN1YmluZGV4ID0gdWlTdWJpbmRleDsKKworCQkvLyBzZXQgcG9pbnRlciB0byB1c2VyIHZhcgorCQlWYXJQYXJhbS5tX1NpemUgPSBFbnRyeVNpemU7CisJCVZhclBhcmFtLm1fcERhdGEgPSBwYkRhdGE7CisKKwkJVXNlZFNpemUgKz0gRW50cnlTaXplOworCQlwYkRhdGEgKz0gRW50cnlTaXplOworCisJCVJldENvZGUgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwkJaWYgKFJldENvZGUgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gc2V0IG51bWJlciBvZiBtYXBwZWQgZW50cmllcyBhbmQgZW50cnkgc2l6ZQorCSpwdWlWYXJFbnRyaWVzX3AgPSAoKGJJbmRleEVudHJpZXMgLSB1aUZpcnN0U3ViaW5kZXhfcCkgKyAxKTsKKwkqcEVudHJ5U2l6ZV9wID0gVXNlZFNpemU7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFJldENvZGUpOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUmVhZE9iamVjdCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIHRoZSBzcGVjaWZpZWQgZW50cnkgZnJvbSB0aGUgT0Qgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIElmIHRoaXMgbm9kZSBpcyBhIHJlbW90ZSBub2RlLCBpdCBwZXJmb3JtcyBhIFNETyB0cmFuc2Zlciwgd2hpY2gKKy8vICAgICAgICAgICAgICBtZWFucyB0aGlzIGZ1bmN0aW9uIHJldHVybnMga0VwbEFwaVRhc2tEZWZlcnJlZCBhbmQgdGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgaXMgaW5mb3JtZWQgdmlhIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSB0YXNrIGlzIGNvbXBsZXRlZC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbkhkbF9wICAgICAgICAgPSBJTk9VVDogcG9pbnRlciB0byBTRE8gY29ubmVjdGlvbiBoYW5kbGUgKG1heSBiZSBOVUxMIGluIGNhc2Ugb2YgbG9jYWwgT0QgYWNjZXNzKQorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQgKDAgPSBpdHNlbGYpCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBJTjogaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgICAgICAgICAgPSBJTjogc3ViLWluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHBEc3REYXRhX2xlX3AgICAgICAgICAgID0gT1VUOiBwb2ludGVyIHRvIGRhdGEgaW4gbGl0dGxlIGVuZGlhbgorLy8gICAgICAgICAgICAgIHB1aVNpemVfcCAgICAgICAgICAgICAgID0gSU5PVVQ6IHBvaW50ZXIgdG8gc2l6ZSBvZiBkYXRhCisvLyAgICAgICAgICAgICAgU2RvVHlwZV9wICAgICAgICAgICAgICAgPSBJTjogdHlwZSBvZiBTRE8gdHJhbnNmZXIKKy8vICAgICAgICAgICAgICBwVXNlckFyZ19wICAgICAgICAgICAgICA9IElOOiB1c2VyLWRlZmluYWJsZSBhcmd1bWVudCBwb2ludGVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVJlYWRPYmplY3QodEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJICAgdm9pZCAqcERzdERhdGFfbGVfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVNpemVfcCwKKwkJCQkgICB0RXBsU2RvVHlwZSBTZG9UeXBlX3AsIHZvaWQgKnBVc2VyQXJnX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmICgodWlJbmRleF9wID09IDApIHx8IChwRHN0RGF0YV9sZV9wID09IE5VTEwpIHx8IChwdWlTaXplX3AgPT0gTlVMTCkKKwkgICAgfHwgKCpwdWlTaXplX3AgPT0gMCkpIHsKKwkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1aU5vZGVJZF9wID09IDAgfHwgdWlOb2RlSWRfcCA9PSBFcGxPYmRHZXROb2RlSWQoKSkgewkvLyBsb2NhbCBPRCBhY2Nlc3MgY2FuIGJlIHBlcmZvcm1lZAorCQl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJCU9iZFNpemUgPSAodEVwbE9iZFNpemUpICogcHVpU2l6ZV9wOworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5VG9MZSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgcERzdERhdGFfbGVfcCwKKwkJCQkJJk9iZFNpemUpOworCQkqcHVpU2l6ZV9wID0gKHVuc2lnbmVkIGludClPYmRTaXplOworCX0gZWxzZSB7CQkvLyBwZXJmb3JtIFNETyB0cmFuc2ZlcgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJCXRFcGxTZG9Db21UcmFuc1BhcmFtQnlJbmRleCBUcmFuc1BhcmFtQnlJbmRleDsKKy8vICAgIHRFcGxTZG9Db21Db25IZGwgICAgICAgICAgICBTZG9Db21Db25IZGw7CisKKwkJLy8gY2hlY2sgaWYgYXBwbGljYXRpb24gcHJvdmlkZXMgc3BhY2UgZm9yIGhhbmRsZQorCQlpZiAocFNkb0NvbUNvbkhkbF9wID09IE5VTEwpIHsKKwkJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisvLyAgICAgICAgICAgIHBTZG9Db21Db25IZGxfcCA9ICZTZG9Db21Db25IZGw7CisJCX0KKwkJLy8gaW5pdCBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb24KKwkJUmV0ID0gRXBsU2RvQ29tRGVmaW5lQ29uKHBTZG9Db21Db25IZGxfcCwgdWlOb2RlSWRfcCwJLy8gdGFyZ2V0IG5vZGUgaWQKKwkJCQkJIFNkb1R5cGVfcCk7CS8vIFNETyB0eXBlCisJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTZG9Db21IYW5kbGVFeGlzdHMpKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9wRGF0YSA9IHBEc3REYXRhX2xlX3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlUmVhZDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9TZG9Db21Db25IZGwgPSAqcFNkb0NvbUNvbkhkbF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpRGF0YVNpemUgPSAqcHVpU2l6ZV9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fdWlTdWJpbmRleCA9IHVpU3ViaW5kZXhfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9wZm5TZG9GaW5pc2hlZENiID0gRXBsQXBpQ2JTZG9Db247CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fcFVzZXJBcmcgPSBwVXNlckFyZ19wOworCisJCVJldCA9IEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgoJlRyYW5zUGFyYW1CeUluZGV4KTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCVJldCA9IGtFcGxBcGlUYXNrRGVmZXJyZWQ7CisKKyNlbHNlCisJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisjZW5kaWYKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlXcml0ZU9iamVjdCgpCisvLworLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIGVudHJ5IHRvIHRoZSBPRCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLyAgICAgICAgICAgICAgSWYgdGhpcyBub2RlIGlzIGEgcmVtb3RlIG5vZGUsIGl0IHBlcmZvcm1zIGEgU0RPIHRyYW5zZmVyLCB3aGljaAorLy8gICAgICAgICAgICAgIG1lYW5zIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBrRXBsQXBpVGFza0RlZmVycmVkIGFuZCB0aGUgYXBwbGljYXRpb24KKy8vICAgICAgICAgICAgICBpcyBpbmZvcm1lZCB2aWEgdGhlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIHRhc2sgaXMgY29tcGxldGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29tQ29uSGRsX3AgICAgICAgICA9IElOT1VUOiBwb2ludGVyIHRvIFNETyBjb25uZWN0aW9uIGhhbmRsZSAobWF5IGJlIE5VTEwgaW4gY2FzZSBvZiBsb2NhbCBPRCBhY2Nlc3MpCisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBJTjogbm9kZSBJRCAoMCA9IGl0c2VsZikKKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgICAgICAgICA9IElOOiBpbmRleCBvZiBvYmplY3QgaW4gT0QKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgICAgICAgICAgICA9IElOOiBzdWItaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfbGVfcCAgICAgICAgICAgPSBJTjogcG9pbnRlciB0byBkYXRhIGluIGxpdHRsZSBlbmRpYW4KKy8vICAgICAgICAgICAgICB1aVNpemVfcCAgICAgICAgICAgICAgICA9IElOOiBzaXplIG9mIGRhdGEgaW4gYnl0ZXMKKy8vICAgICAgICAgICAgICBTZG9UeXBlX3AgICAgICAgICAgICAgICA9IElOOiB0eXBlIG9mIFNETyB0cmFuc2ZlcgorLy8gICAgICAgICAgICAgIHBVc2VyQXJnX3AgICAgICAgICAgICAgID0gSU46IHVzZXItZGVmaW5hYmxlIGFyZ3VtZW50IHBvaW50ZXIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpV3JpdGVPYmplY3QodEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJICAgIHZvaWQgKnBTcmNEYXRhX2xlX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aVNpemVfcCwKKwkJCQkgICAgdEVwbFNkb1R5cGUgU2RvVHlwZV9wLCB2b2lkICpwVXNlckFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoKHVpSW5kZXhfcCA9PSAwKSB8fCAocFNyY0RhdGFfbGVfcCA9PSBOVUxMKSB8fCAodWlTaXplX3AgPT0gMCkpIHsKKwkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1aU5vZGVJZF9wID09IDAgfHwgdWlOb2RlSWRfcCA9PSBFcGxPYmRHZXROb2RlSWQoKSkgewkvLyBsb2NhbCBPRCBhY2Nlc3MgY2FuIGJlIHBlcmZvcm1lZAorCisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlKHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLAorCQkJCQkgICBwU3JjRGF0YV9sZV9wLCB1aVNpemVfcCk7CisJfSBlbHNlIHsJCS8vIHBlcmZvcm0gU0RPIHRyYW5zZmVyCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkJdEVwbFNkb0NvbVRyYW5zUGFyYW1CeUluZGV4IFRyYW5zUGFyYW1CeUluZGV4OworLy8gICAgdEVwbFNkb0NvbUNvbkhkbCAgICAgICAgICAgIFNkb0NvbUNvbkhkbDsKKworCQkvLyBjaGVjayBpZiBhcHBsaWNhdGlvbiBwcm92aWRlcyBzcGFjZSBmb3IgaGFuZGxlCisJCWlmIChwU2RvQ29tQ29uSGRsX3AgPT0gTlVMTCkgeworCQkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJCWdvdG8gRXhpdDsKKy8vICAgICAgICAgICAgcFNkb0NvbUNvbkhkbF9wID0gJlNkb0NvbUNvbkhkbDsKKwkJfQorCQkvLyBkLmsuOiBIb3cgdG8gcmVjeWNsZSBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb24/CisJCS8vICAgICAgIFRyeSB0byByZWRlZmluZSBpdCwgd2hpY2ggd2lsbCByZXR1cm4ga0VwbFNkb0NvbUhhbmRsZUV4aXN0cworCQkvLyAgICAgICBhbmQgdGhlIGV4aXN0aW5nIGNvbW1hbmQgbGF5ZXIgaGFuZGxlLgorCQkvLyAgICAgICBJZiB0aGUgcmV0dXJuZWQgaGFuZGxlIGlzIGJ1c3ksIEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgoKQorCQkvLyAgICAgICB3aWxsIHJldHVybiB3aXRoIGVycm9yLgorCQkvLyAkJCQgZC5rLjogQ29sbGlzaW9ucyBtYXkgb2NjdXIgd2l0aCBDb25maWd1cmF0aW9uIE1hbmFnZXIsIGlmIGJvdGggdGhlIGFwcGxpY2F0aW9uIGFuZAorCQkvLyAgICAgICAgICAgQ29uZmlndXJhdGlvbiBNYW5hZ2VyLCBhcmUgdHJ5aW5nIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHZlcnkgc2FtZSBub2RlLgorCQkvLyAgICAgcG9zc2libGUgc29sdXRpb246IGRpc2FsbG93IGNvbW11bmljYXRpb24gYnkgYXBwbGljYXRpb24gaWYgQ29uZmlndXJhdGlvbiBNYW5hZ2VyIGlzIGJ1c3kKKworCQkvLyBpbml0IGNvbW1hbmQgbGF5ZXIgY29ubmVjdGlvbgorCQlSZXQgPSBFcGxTZG9Db21EZWZpbmVDb24ocFNkb0NvbUNvbkhkbF9wLCB1aU5vZGVJZF9wLAkvLyB0YXJnZXQgbm9kZSBpZAorCQkJCQkgU2RvVHlwZV9wKTsJLy8gU0RPIHR5cGUKKwkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNkb0NvbUhhbmRsZUV4aXN0cykpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlUcmFuc1BhcmFtQnlJbmRleC5tX3BEYXRhID0gcFNyY0RhdGFfbGVfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9TZG9BY2Nlc3NUeXBlID0ga0VwbFNkb0FjY2Vzc1R5cGVXcml0ZTsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9TZG9Db21Db25IZGwgPSAqcFNkb0NvbUNvbkhkbF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpRGF0YVNpemUgPSB1aVNpemVfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aUluZGV4ID0gdWlJbmRleF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpU3ViaW5kZXggPSB1aVN1YmluZGV4X3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fcGZuU2RvRmluaXNoZWRDYiA9IEVwbEFwaUNiU2RvQ29uOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3BVc2VyQXJnID0gcFVzZXJBcmdfcDsKKworCQlSZXQgPSBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KCZUcmFuc1BhcmFtQnlJbmRleCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlSZXQgPSBrRXBsQXBpVGFza0RlZmVycmVkOworCisjZWxzZQorCQlSZXQgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworI2VuZGlmCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpRnJlZVNkb0NoYW5uZWwoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmcmVlcyB0aGUgc3BlY2lmaWVkIFNETyBjaGFubmVsLgorLy8gICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBjYWxsIHRvIEVwbEFwaVJlYWRPYmplY3QoKS9FcGxBcGlXcml0ZU9iamVjdCgpCisvLyAgICAgICAgICAgICAgd2hpY2ggcmV0dXJucyBrRXBsQXBpVGFza0RlZmVycmVkIGFuZCB0aGUgYXBwbGljYXRpb24KKy8vICAgICAgICAgICAgICBpcyBpbmZvcm1lZCB2aWEgdGhlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIHRhc2sgaXMgY29tcGxldGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21Db25IZGxfcCAgICAgICAgICA9IElOOiBTRE8gY29ubmVjdGlvbiBoYW5kbGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlGcmVlU2RvQ2hhbm5lbCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCisJLy8gaW5pdCBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb24KKwlSZXQgPSBFcGxTZG9Db21VbmRlZmluZUNvbihTZG9Db21Db25IZGxfcCk7CisKKyNlbHNlCisJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlSZWFkTG9jYWxPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyB0aGUgc3BlY2lmaWVkIGVudHJ5IGZyb20gdGhlIGxvY2FsIE9ELgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgICAgICAgICA9IElOOiBpbmRleCBvZiBvYmplY3QgaW4gT0QKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgICAgICAgICAgICA9IElOOiBzdWItaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgICAgICAgICAgPSBPVVQ6IHBvaW50ZXIgdG8gZGF0YSBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCisvLyAgICAgICAgICAgICAgcHVpU2l6ZV9wICAgICAgICAgICAgICAgPSBJTk9VVDogcG9pbnRlciB0byBzaXplIG9mIGRhdGEKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlSZWFkTG9jYWxPYmplY3QodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJT2JkU2l6ZSA9ICh0RXBsT2JkU2l6ZSkgKiBwdWlTaXplX3A7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLCBwRHN0RGF0YV9wLCAmT2JkU2l6ZSk7CisJKnB1aVNpemVfcCA9ICh1bnNpZ25lZCBpbnQpT2JkU2l6ZTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgpCisvLworLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIGVudHJ5IHRvIHRoZSBsb2NhbCBPRC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBJTjogaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgICAgICAgICAgPSBJTjogc3ViLWluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICAgICAgICAgID0gSU46IHBvaW50ZXIgdG8gZGF0YSBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCisvLyAgICAgICAgICAgICAgdWlTaXplX3AgICAgICAgICAgICAgICAgPSBJTjogc2l6ZSBvZiBkYXRhIGluIGJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCVJldCA9CisJICAgIEVwbE9iZFdyaXRlRW50cnkodWlJbmRleF9wLCB1aVN1YmluZGV4X3AsIHBTcmNEYXRhX3AsCisJCQkgICAgICh0RXBsT2JkU2l6ZSkgdWlTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpTW5UcmlnZ2VyU3RhdGVDaGFuZ2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiB0cmlnZ2VycyB0aGUgc3BlY2lmaWVkIG5vZGUgY29tbWFuZCBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIHRoZSBub2RlIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZAorLy8gICAgICAgICAgICAgIE5vZGVDb21tYW5kX3AgICAgICAgICAgID0gbm9kZSBjb21tYW5kCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpTW5UcmlnZ2VyU3RhdGVDaGFuZ2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbE5tdE5vZGVDb21tYW5kIE5vZGVDb21tYW5kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCVJldCA9IEVwbE5tdE1udVRyaWdnZXJTdGF0ZUNoYW5nZSh1aU5vZGVJZF9wLCBOb2RlQ29tbWFuZF9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKyNlbmRpZiAvLyAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiT2JkQWNjZXNzCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBPRCBhY2Nlc3NlcworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUGFyYW1fcCAgICAgICAgICAgICAgICA9IE9CRCBwYXJhbWV0ZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiT2JkQWNjZXNzKHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiAoRVBMX0FQSV9PQkRfRk9SV0FSRF9FVkVOVCAhPSBGQUxTRSkKKwl0RXBsQXBpRXZlbnRBcmcgRXZlbnRBcmc7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwkvLyBtdXN0IGJlIGRpc2FibGVkIGZvciBFcGxBcGlMaW51eEtlcm5lbC5jLCBiZWNhdXNlIG9mIHJlZW50cmFuY3kgcHJvYmxlbQorCS8vIGZvciBsb2NhbCBPRCBhY2Nlc3MuIFRoaXMgaXMgbm90IHNvIGJhZCBhcyB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uIGluCisJLy8gYXBwbGljYXRpb24gZG9lcyBub3QgdXNlIE9EIGNhbGxiYWNrcyBhdCB0aGUgbW9tZW50LgorCUV2ZW50QXJnLm1fT2JkQ2JQYXJhbSA9ICpwUGFyYW1fcDsKKwlSZXQgPSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnRPYmRBY2Nlc3MsCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKyNlbmRpZgorCisJc3dpdGNoIChwUGFyYW1fcC0+bV91aUluZGV4KSB7CisJCS8vY2FzZSAweDEwMDY6ICAgIC8vIE5NVF9DeWNsZUxlbl9VMzIgKHZhbGlkIG9uIHJlc2V0KQorCWNhc2UgMHgxQzE0OgkJLy8gRExMX0xvc3NPZkZyYW1lVG9sZXJhbmNlX1UzMgorCQkvL2Nhc2UgMHgxRjk4OiAgICAvLyBOTVRfQ3ljbGVUaW1pbmdfUkVDICh2YWxpZCBvbiByZXNldCkKKwkJeworCQkJaWYgKHBQYXJhbV9wLT5tX09iZEV2ZW50ID09IGtFcGxPYmRFdlBvc3RXcml0ZSkgeworCQkJCS8vIHVwZGF0ZSBETEwgY29uZmlndXJhdGlvbgorCQkJCVJldCA9IEVwbEFwaVVwZGF0ZURsbENvbmZpZyhGQUxTRSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSAweDEwMjA6CQkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZklkX1UzMiAhPSAwCisJCXsKKwkJCWlmICgocFBhcmFtX3AtPm1fT2JkRXZlbnQgPT0ga0VwbE9iZEV2UG9zdFdyaXRlKQorCQkJICAgICYmIChwUGFyYW1fcC0+bV91aVN1YkluZGV4ID09IDMpCisJCQkgICAgJiYgKCooKERXT1JEICopIHBQYXJhbV9wLT5tX3BBcmcpICE9IDApKSB7CisJCQkJRFdPUkQgZHdWZXJpZnlDb25mSW52YWxpZCA9IDA7CisJCQkJLy8gc2V0IENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5WZXJpZnlDb25mSW52YWxpZF9VMzIgdG8gMAorCQkJCVJldCA9CisJCQkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDIwLCA0LAorCQkJCQkJICAgICAmZHdWZXJpZnlDb25mSW52YWxpZCwgNCk7CisJCQkJLy8gaWdub3JlIGFueSBlcnJvciBiZWNhdXNlIHRoaXMgb2JqZWt0IGlzIG9wdGlvbmFsCisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSAweDFGOUU6CQkvLyBOTVRfUmVzZXRDbWRfVTgKKwkJeworCQkJaWYgKHBQYXJhbV9wLT5tX09iZEV2ZW50ID09IGtFcGxPYmRFdlByZVdyaXRlKSB7CisJCQkJQllURSBiTm10Q29tbWFuZDsKKworCQkJCWJObXRDb21tYW5kID0gKigoQllURSAqKSBwUGFyYW1fcC0+bV9wQXJnKTsKKwkJCQkvLyBjaGVjayB2YWx1ZSByYW5nZQorCQkJCXN3aXRjaCAoKHRFcGxObXRDb21tYW5kKSBiTm10Q29tbWFuZCkgeworCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwkJCQljYXNlIGtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb246CisJCQkJY2FzZSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uOgorCQkJCWNhc2Uga0VwbE5tdENtZFN3UmVzZXQ6CisJCQkJY2FzZSBrRXBsTm10Q21kSW52YWxpZFNlcnZpY2U6CisJCQkJCS8vIHZhbGlkIGNvbW1hbmQgaWRlbnRpZmllciBzcGVjaWZpZWQKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9CisJCQkJCSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfRVhDRUVERUQ7CisJCQkJCVJldCA9IGtFcGxPYmRBY2Nlc3NWaW9sYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocFBhcmFtX3AtPm1fT2JkRXZlbnQgPT0ga0VwbE9iZEV2UG9zdFdyaXRlKSB7CisJCQkJQllURSBiTm10Q29tbWFuZDsKKworCQkJCWJObXRDb21tYW5kID0gKigoQllURSAqKSBwUGFyYW1fcC0+bV9wQXJnKTsKKwkJCQkvLyBjaGVjayB2YWx1ZSByYW5nZQorCQkJCXN3aXRjaCAoKHRFcGxObXRDb21tYW5kKSBiTm10Q29tbWFuZCkgeworCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRSZXNldE5vZGUpOworI2VuZGlmCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uOgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudFJlc2V0Q29tKTsKKyNlbmRpZgorCQkJCQlicmVhazsKKworCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRSZXNldENvbmZpZyk7CisjZW5kaWYKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGtFcGxObXRDbWRTd1Jlc2V0OgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudFN3UmVzZXQpOworI2VuZGlmCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBrRXBsTm10Q21kSW52YWxpZFNlcnZpY2U6CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkJCQkgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX0VYQ0VFREVEOworCQkJCQlSZXQgPSBrRXBsT2JkQWNjZXNzVmlvbGF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisvL0V4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVByb2Nlc3NFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gZXZlbnQgcXVldWUgYW5kIGZvcndhcmRzIHRoZXNlIHRvCisvLyAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVwbEV2ZW50X3AgPSAgIHBvaW50ZXIgdG8gZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFcGxFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxFdmVudEVycm9yICpwRXZlbnRFcnJvcjsKKwl0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJvY2VzcyBldmVudAorCXN3aXRjaCAocEVwbEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJCS8vIGVycm9yIGV2ZW50CisJY2FzZSBrRXBsRXZlbnRUeXBlRXJyb3I6CisJCXsKKwkJCXBFdmVudEVycm9yID0gKHRFcGxFdmVudEVycm9yICopIHBFcGxFdmVudF9wLT5tX3BBcmc7CisJCQlzd2l0Y2ggKHBFdmVudEVycm9yLT5tX0V2ZW50U291cmNlKSB7CisJCQkJLy8gdHJlYXQgdGhlIGVycm9ycyBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcyBhcyBjcml0aWNhbAorCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VFdmVudGs6CisJCQljYXNlIGtFcGxFdmVudFNvdXJjZUV2ZW50dToKKwkJCWNhc2Uga0VwbEV2ZW50U291cmNlRGxsazoKKwkJCQl7CisJCQkJCUV2ZW50VHlwZSA9IGtFcGxBcGlFdmVudENyaXRpY2FsRXJyb3I7CisJCQkJCS8vIGhhbHQgdGhlIHN0YWNrIGJ5IGVudGVyaW5nIE5NVCBzdGF0ZSBPZmYKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aGUgb3RoZXIgZXJyb3JzIGFyZSBqdXN0IHdhcm5pbmdzCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJRXZlbnRUeXBlID0ga0VwbEFwaUV2ZW50V2FybmluZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwkJCVJldCA9CisJCQkgICAgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiRXZlbnQoRXZlbnRUeXBlLAorCQkJCQkJCQkgICAgICAodEVwbEFwaUV2ZW50QXJnCisJCQkJCQkJCSAgICAgICAqKQorCQkJCQkJCQkgICAgICBwRXZlbnRFcnJvciwKKwkJCQkJCQkJICAgICAgRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgICAgbV9Jbml0UGFyYW0uCisJCQkJCQkJCSAgICAgIG1fcEV2ZW50VXNlckFyZyk7CisJCQkvLyBkaXNjYXJkIGVycm9yIGZyb20gY2FsbGJhY2sgZnVuY3Rpb24sIGJlY2F1c2UgdGhpcyBjb3VsZCBnZW5lcmF0ZSBhbiBlbmRsZXNzIGxvb3AKKwkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBhdCBwcmVzZW50LCB0aGVyZSBhcmUgbm8gb3RoZXIgZXZlbnRzIGZvciB0aGlzIG1vZHVsZQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiTm10U3RhdGVDaGFuZ2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIE5NVCBzdGF0ZSBjaGFuZ2VzCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlQ2hhbmdlX3AgICAgICAgID0gTk1UIHN0YXRlIGNoYW5nZSBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTm10U3RhdGVDaGFuZ2UodEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwkJCQkJCU5tdFN0YXRlQ2hhbmdlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlCWVRFIGJObXRTdGF0ZTsKKwl0RXBsQXBpRXZlbnRBcmcgRXZlbnRBcmc7CisKKwkvLyBzYXZlIE5NVCBzdGF0ZSBpbiBPRAorCWJObXRTdGF0ZSA9IChCWVRFKSBObXRTdGF0ZUNoYW5nZV9wLm1fTmV3Tm10U3RhdGU7CisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOEMsIDAsICZiTm10U3RhdGUsIDEpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBkbyB3b3JrIHdoaWNoIG11c3QgYmUgZG9uZSBpbiB0aGF0IHN0YXRlCisJc3dpdGNoIChObXRTdGF0ZUNoYW5nZV9wLm1fTmV3Tm10U3RhdGUpIHsKKwkJLy8gRVBMIHN0YWNrIGlzIG5vdCBydW5uaW5nCisJY2FzZSBrRXBsTm10R3NPZmY6CisJCWJyZWFrOworCisJCS8vIGZpcnN0IGluaXQgb2YgdGhlIGhhcmR3YXJlCisJY2FzZSBrRXBsTm10R3NJbml0aWFsaXNpbmc6CisjaWYgMAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkJLy8gY29uZmlndXJlIFNETyB2aWEgVURQIChpLmUuIGJpbmQgaXQgdG8gdGhlIEVQTCBldGhlcm5ldCBpbnRlcmZhY2UpCisJCVJldCA9CisJCSAgICBFcGxTZG9VZHB1Q29uZmlnKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0lwQWRkcmVzcywKKwkJCQkgICAgIEVQTF9DX1NET19FUExfUE9SVCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorI2VuZGlmCisjZW5kaWYKKworCQlicmVhazsKKworCQkvLyBpbml0IG9mIHRoZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgcHJvZmlsZSBhcmVhIGFuZCB0aGUKKwkJLy8gc3RhbmRhcmRpc2VkIGRldmljZSBwcm9maWxlIGFyZWEKKwljYXNlIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb246CisJCXsKKwkJCS8vIHJlc2V0IGFwcGxpY2F0aW9uIHBhcnQgb2YgT0QKKwkJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydChrRXBsT2JkUGFydEFwcCwKKwkJCQkJCSBrRXBsT2JkRGlyTG9hZCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgb2YgdGhlIGNvbW11bmljYXRpb24gcHJvZmlsZSBhcmVhCisJY2FzZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb246CisJCXsKKwkJCS8vIHJlc2V0IGNvbW11bmljYXRpb24gcGFydCBvZiBPRAorCQkJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0KGtFcGxPYmRQYXJ0R2VuLAorCQkJCQkJIGtFcGxPYmREaXJMb2FkKTsKKworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vICQkJCBkLmsuOiB1cGRhdGUgT0Qgb25seSBpZiBPRCB3YXMgbm90IGxvYWRlZCBmcm9tIG5vbi12b2xhdGlsZSBtZW1vcnkKKwkJCVJldCA9IEVwbEFwaVVwZGF0ZU9iZCgpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBidWlsZCB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGluZm9zIGZyb20gT0QKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwkJeworCisJCQlSZXQgPSBFcGxBcGlVcGRhdGVEbGxDb25maWcoVFJVRSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gQ04gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisJCS8vIG5vZGUgbGlzdGUgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwljYXNlIGtFcGxObXRDc05vdEFjdGl2ZToKKwkJeworCQkJLy8gaW5kaWNhdGUgY29tcGxldGlvbiBvZiByZXNldCBpbiBOTVRfUmVzZXRDbWRfVTgKKwkJCWJObXRTdGF0ZSA9IChCWVRFKSBrRXBsTm10Q21kSW52YWxpZFNlcnZpY2U7CisJCQlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5RSwgMCwgJmJObXRTdGF0ZSwgMSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2VzcyBvbmx5IGFzeW5jIGZyYW1lcworCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2VzcyBpc29jaHJvbnVzIGFuZCBhc3luY2hyb251cyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHNob3VsZCBiZSBjb25maWd1cmVkIHVuZCBhcHBsaWNhdGlvbiBpcyByZWFkeQorCWNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9ybWFsIHdvcmsgc3RhdGUKKwljYXNlIGtFcGxObXRDc09wZXJhdGlvbmFsOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgc3RvcHBlZCBieSBNTgorCQkvLyAtPiBvbmx5IHByb2Nlc3MgYXN5bmNocm9udXMgZnJhbWVzCisJY2FzZSBrRXBsTm10Q3NTdG9wcGVkOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vIEVQTCBjeWNsZQorCQkvLyAtPiBub3JtYWwgZXRoZXJuZXQgY29tbXVuaWNhdGlvbgorCWNhc2Uga0VwbE5tdENzQmFzaWNFdGhlcm5ldDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE1OIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworCQkvLyBub2RlIGxpc3RlbnMgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwljYXNlIGtFcGxObXRNc05vdEFjdGl2ZToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBvbmx5IGFzeW5jIGZyYW1lcworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2Vzc2VzIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZnJhbWVzCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJY2FzZSBrRXBsTm10TXNPcGVyYXRpb25hbDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBubyBFUEwgY3ljbGUKKwkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwljYXNlIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlUUkFDRTAKKwkJCSAgICAoIkVwbEFwaUNiTm10U3RhdGVDaGFuZ2UoKTogdW5oYW5kbGVkIE5NVCBzdGF0ZVxuIik7CisJCX0KKwl9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0xFRFUpKSAhPSAwKQorCS8vIGZvcndhcmQgZXZlbnQgdG8gTGVkIG1vZHVsZQorCVJldCA9IEVwbExlZHVDYk5tdFN0YXRlQ2hhbmdlKE5tdFN0YXRlQ2hhbmdlX3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gZm9yd2FyZCBldmVudCB0byBObXRNbiBtb2R1bGUKKwlSZXQgPSBFcGxObXRNbnVDYk5tdFN0YXRlQ2hhbmdlKE5tdFN0YXRlQ2hhbmdlX3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJRXZlbnRBcmcubV9ObXRTdGF0ZUNoYW5nZSA9IE5tdFN0YXRlQ2hhbmdlX3A7CisJUmV0ID0KKwkgICAgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkgICAgbV9wZm5DYkV2ZW50KGtFcGxBcGlFdmVudE5tdFN0YXRlQ2hhbmdlLCAmRXZlbnRBcmcsCisJCQkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BFdmVudFVzZXJBcmcpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVVwZGF0ZURsbENvbmZpZworLy8KKy8vIERlc2NyaXB0aW9uOiB1cGRhdGUgY29uZmlndXJhdGlvbiBvZiBETEwKKy8vCisvLyBQYXJhbWV0ZXJzOiAgZlVwZGF0ZUlkZW50aXR5X3AgICAgICAgPSBUUlVFLCBpZiBpZGVudGl0eSBtdXN0IGJlIHVwZGF0ZWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlVcGRhdGVEbGxDb25maWcoQk9PTCBmVXBkYXRlSWRlbnRpdHlfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxDb25maWdQYXJhbSBEbGxDb25maWdQYXJhbTsKKwl0RXBsRGxsSWRlbnRQYXJhbSBEbGxJZGVudFBhcmFtOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJV09SRCB3VGVtcDsKKwlCWVRFIGJUZW1wOworCisJLy8gY29uZmlndXJlIERsbAorCUVQTF9NRU1TRVQoJkRsbENvbmZpZ1BhcmFtLCAwLCBzaXplb2YoRGxsQ29uZmlnUGFyYW0pKTsKKwlEbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkID0gRXBsT2JkR2V0Tm9kZUlkKCk7CisKKwkvLyBDeWNsZSBMZW5ndGggKDB4MTAwNjogTk1UX0N5Y2xlTGVuX1UzMikgaW4gW3VzXQorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMDYsIDAsICZEbGxDb25maWdQYXJhbS5tX2R3Q3ljbGVMZW4sICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMHgxRjgyOiBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGODIsIDAsICZEbGxDb25maWdQYXJhbS5tX2R3RmVhdHVyZUZsYWdzLAorCQkJICAgICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZC5rLiBUaGVyZSBpcyBubyBkZXBlbmRhbmNlIGJldHdlZW4gRmVhdHVyZUZsYWdzIGFuZCBhc3luYy1vbmx5IENOCisJRGxsQ29uZmlnUGFyYW0ubV9mQXN5bmNPbmx5ID0gRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2ZBc3luY09ubHk7CisKKwkvLyAweDFDMTQ6IERMTF9Mb3NzT2ZGcmFtZVRvbGVyYW5jZV9VMzIgaW4gW25zXQorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFDMTQsIDAsICZEbGxDb25maWdQYXJhbS5tX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UsCisJCQkgICAgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAweDFGOTg6IE5NVF9DeWNsZVRpbWluZ19SRUMKKwkvLyAweDFGOTguMTogSXNvY2hyVHhNYXhQYXlsb2FkX1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDEsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpSXNvY2hyVHhNYXhQYXlsb2FkID0gd1RlbXA7CisKKwkvLyAweDFGOTguMjogSXNvY2hyUnhNYXhQYXlsb2FkX1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDIsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpSXNvY2hyUnhNYXhQYXlsb2FkID0gd1RlbXA7CisKKwkvLyAweDFGOTguMzogUFJlc01heExhdGVuY3lfVTMyCisJT2JkU2l6ZSA9IDQ7CisJUmV0ID0KKwkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MUY5OCwgMywgJkRsbENvbmZpZ1BhcmFtLm1fZHdQcmVzTWF4TGF0ZW5jeSwKKwkJCSAgICAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIDB4MUY5OC40OiBQUmVxQWN0UGF5bG9hZExpbWl0X1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDQsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpUHJlcUFjdFBheWxvYWRMaW1pdCA9IHdUZW1wOworCisJLy8gMHgxRjk4LjU6IFBSZXNBY3RQYXlsb2FkTGltaXRfVTE2CisJT2JkU2l6ZSA9IDI7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KDB4MUY5OCwgNSwgJndUZW1wLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCURsbENvbmZpZ1BhcmFtLm1fdWlQcmVzQWN0UGF5bG9hZExpbWl0ID0gd1RlbXA7CisKKwkvLyAweDFGOTguNjogQVNuZE1heExhdGVuY3lfVTMyCisJT2JkU2l6ZSA9IDQ7CisJUmV0ID0KKwkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MUY5OCwgNiwgJkRsbENvbmZpZ1BhcmFtLm1fZHdBc25kTWF4TGF0ZW5jeSwKKwkJCSAgICAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIDB4MUY5OC43OiBNdWx0aXBsQ3ljbGVDbnRfVTgKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCA3LCAmYlRlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aU11bHRpcGxDeWNsZUNudCA9IGJUZW1wOworCisJLy8gMHgxRjk4Ljg6IEFzeW5jTVRVX1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDgsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpQXN5bmNNdHUgPSB3VGVtcDsKKworCS8vICQkJCBQcmVzY2FsZXIKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIDB4MUY4QS4xOiBXYWl0U29DUFJlcV9VMzIgaW4gW25zXQorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGOEEsIDEsICZEbGxDb25maWdQYXJhbS5tX2R3V2FpdFNvY1ByZXEsCisJCQkgICAgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAweDFGOEEuMjogQXN5bmNTbG90VGltZW91dF9VMzIgaW4gW25zXSAob3B0aW9uYWwpCisJT2JkU2l6ZSA9IDQ7CisJUmV0ID0KKwkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MUY4QSwgMiwgJkRsbENvbmZpZ1BhcmFtLm1fZHdBc3luY1Nsb3RUaW1lb3V0LAorCQkJICAgICZPYmRTaXplKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKyNlbmRpZgorCisJRGxsQ29uZmlnUGFyYW0ubV91aVNpemVPZlN0cnVjdCA9IHNpemVvZihEbGxDb25maWdQYXJhbSk7CisJUmV0ID0gRXBsRGxsa0NvbmZpZygmRGxsQ29uZmlnUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChmVXBkYXRlSWRlbnRpdHlfcCAhPSBGQUxTRSkgeworCQkvLyBjb25maWd1cmUgSWRlbnRpdHkKKwkJRVBMX01FTVNFVCgmRGxsSWRlbnRQYXJhbSwgMCwgc2l6ZW9mKERsbElkZW50UGFyYW0pKTsKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDAwLCAwLCAmRGxsSWRlbnRQYXJhbS5tX2R3RGV2aWNlVHlwZSwKKwkJCQkgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMTgsIDEsICZEbGxJZGVudFBhcmFtLm1fZHdWZW5kb3JJZCwKKwkJCQkgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDE4LCAyLCAmRGxsSWRlbnRQYXJhbS5tX2R3UHJvZHVjdENvZGUsCisJCQkJICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MTAxOCwgMywKKwkJCQkgICAgJkRsbElkZW50UGFyYW0ubV9kd1JldmlzaW9uTnVtYmVyLAorCQkJCSAgICAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMTgsIDQsICZEbGxJZGVudFBhcmFtLm1fZHdTZXJpYWxOdW1iZXIsCisJCQkJICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJRGxsSWRlbnRQYXJhbS5tX2R3SXBBZGRyZXNzID0KKwkJICAgIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0lwQWRkcmVzczsKKwkJRGxsSWRlbnRQYXJhbS5tX2R3U3VibmV0TWFzayA9CisJCSAgICBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdTdWJuZXRNYXNrOworCQlFUExfTUVNQ1BZKERsbElkZW50UGFyYW0ubV9zSG9zdG5hbWUsCisJCQkgICBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fc0hvc3RuYW1lLAorCQkJICAgc2l6ZW9mKERsbElkZW50UGFyYW0ubV9zSG9zdG5hbWUpKTsKKworCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMjAsIDEsCisJCQkJICAgICZEbGxJZGVudFBhcmFtLm1fZHdWZXJpZnlDb25maWd1cmF0aW9uRGF0ZSwKKwkJCQkgICAgJk9iZFNpemUpOworCQkvLyBpZ25vcmUgYW55IGVycm9yLCBiZWNhdXNlIHRoaXMgb2JqZWN0IGlzIG9wdGlvbmFsCisKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDIwLCAyLAorCQkJCSAgICAmRGxsSWRlbnRQYXJhbS5tX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWUsCisJCQkJICAgICZPYmRTaXplKTsKKwkJLy8gaWdub3JlIGFueSBlcnJvciwgYmVjYXVzZSB0aGlzIG9iamVjdCBpcyBvcHRpb25hbAorCisJCS8vICQkJCBkLmsuOiBmaWxsIHJlc3Qgb2YgaWRlbnQgc3RydWN0dXJlCisKKwkJRGxsSWRlbnRQYXJhbS5tX3VpU2l6ZU9mU3RydWN0ID0gc2l6ZW9mKERsbElkZW50UGFyYW0pOworCQlSZXQgPSBFcGxEbGxrU2V0SWRlbnRpdHkoJkRsbElkZW50UGFyYW0pOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpVXBkYXRlT2JkCisvLworLy8gRGVzY3JpcHRpb246IHVwZGF0ZSBPRCBmcm9tIGluaXQgcGFyYW0KKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpVXBkYXRlT2JkKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlXT1JEIHdUZW1wOworCUJZVEUgYlRlbXA7CisKKwkvLyBzZXQgbm9kZSBpZCBpbiBPRAorCVJldCA9IEVwbE9iZFNldE5vZGVJZChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlOb2RlSWQsCS8vIG5vZGUgaWQKKwkJCSAgICAgIGtFcGxPYmROb2RlSWRIYXJkd2FyZSk7CS8vIHNldCBieSBoYXJkd2FyZQorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdDeWNsZUxlbiAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMDYsIDAsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3Q3ljbGVMZW4sCisJCQkJICAgICA0KTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxQzE0LCAwLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJCQkJICAgICBtX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UsIDQpOworCQkvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkgICB7CisJCSAgIGdvdG8gRXhpdDsKKwkJICAgfSAqLworCX0KKwkvLyBkLmsuIFRoZXJlIGlzIG5vIGRlcGVuZGFuY2UgYmV0d2VlbiBGZWF0dXJlRmxhZ3MgYW5kIGFzeW5jLW9ubHkgQ04uCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0ZlYXR1cmVGbGFncyAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGODIsIDAsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdGZWF0dXJlRmxhZ3MsIDQpOworCQkvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisJCSAgIHsKKwkJICAgZ290byBFeGl0OworCQkgICB9ICovCisJfQorCisJd1RlbXAgPSAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpSXNvY2hyVHhNYXhQYXlsb2FkOworCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCAxLCAmd1RlbXAsIDIpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCisJd1RlbXAgPSAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpSXNvY2hyUnhNYXhQYXlsb2FkOworCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCAyLCAmd1RlbXAsIDIpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCisJUmV0ID0KKwkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDMsCisJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdQcmVzTWF4TGF0ZW5jeSwKKwkJCSAgICAgNCk7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpUHJlcUFjdFBheWxvYWRMaW1pdCA8PQorCSAgICBFUExfQ19ETExfSVNPQ0hSX01BWF9QQVlMKSB7CisJCXdUZW1wID0KKwkJICAgIChXT1JEKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlQcmVxQWN0UGF5bG9hZExpbWl0OworCQlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgNCwgJndUZW1wLCAyKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdCA8PQorCSAgICBFUExfQ19ETExfSVNPQ0hSX01BWF9QQVlMKSB7CisJCXdUZW1wID0KKwkJICAgIChXT1JEKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlQcmVzQWN0UGF5bG9hZExpbWl0OworCQlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgNSwgJndUZW1wLCAyKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKwl9CisKKwlSZXQgPQorCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgNiwKKwkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0FzbmRNYXhMYXRlbmN5LAorCQkJICAgICA0KTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQgPD0gMHhGRikgeworCQliVGVtcCA9IChCWVRFKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQ7CisJCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCA3LCAmYlRlbXAsIDEpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlBc3luY010dSA8PQorCSAgICBFUExfQ19ETExfTUFYX0FTWU5DX01UVSkgeworCQl3VGVtcCA9IChXT1JEKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlBc3luY010dTsKKwkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDgsICZ3VGVtcCwgMik7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aVByZXNjYWxlciA8PSAxMDAwKSB7CisJCXdUZW1wID0gKFdPUkQpIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aVByZXNjYWxlcjsKKwkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDksICZ3VGVtcCwgMik7CisJCS8vIGlnbm9yZSByZXR1cm4gY29kZQorCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl9CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1dhaXRTb2NQcmVxICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MUY4QSwgMSwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd1dhaXRTb2NQcmVxLCA0KTsKKwkJLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJICAgeworCQkgICBnb3RvIEV4aXQ7CisJCSAgIH0gKi8KKwl9CisKKwlpZiAoKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0FzeW5jU2xvdFRpbWVvdXQgIT0gMCkKKwkgICAgJiYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0FzeW5jU2xvdFRpbWVvdXQgIT0gLTEpKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MUY4QSwgMiwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd0FzeW5jU2xvdFRpbWVvdXQsIDQpOworCQkvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkgICB7CisJCSAgIGdvdG8gRXhpdDsKKwkJICAgfSAqLworCX0KKyNlbmRpZgorCisJLy8gY29uZmlndXJlIElkZW50aXR5CisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0RldmljZVR5cGUgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDAwLCAwLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJCQkJICAgICBtX2R3RGV2aWNlVHlwZSwgNCk7CisvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdWZW5kb3JJZCAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMTgsIDEsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3VmVuZG9ySWQsCisJCQkJICAgICA0KTsKKy8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1Byb2R1Y3RDb2RlICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAxOCwgMiwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd1Byb2R1Y3RDb2RlLCA0KTsKKy8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1JldmlzaW9uTnVtYmVyICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAxOCwgMywKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd1JldmlzaW9uTnVtYmVyLCA0KTsKKy8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1NlcmlhbE51bWJlciAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMTgsIDQsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdTZXJpYWxOdW1iZXIsIDQpOworLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BzekRldk5hbWUgIT0gTlVMTCkgeworCQkvLyB3cml0ZSBEZXZpY2UgTmFtZSAoMHgxMDA4KQorCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMDgsIDAsCisJCQkJICAgICAodm9pZCBHRU5FUklDICopRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fSW5pdFBhcmFtLm1fcHN6RGV2TmFtZSwKKwkJCQkgICAgICh0RXBsT2JkU2l6ZSkgc3RybGVuKEVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJICBtX0luaXRQYXJhbS4KKwkJCQkJCQkgIG1fcHN6RGV2TmFtZSkpOworLyogICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wc3pId1ZlcnNpb24gIT0gTlVMTCkgeworCQkvLyB3cml0ZSBIYXJkd2FyZSB2ZXJzaW9uICgweDEwMDkpCisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAwOSwgMCwKKwkJCQkgICAgICh2b2lkIEdFTkVSSUMgKilFcGxBcGlJbnN0YW5jZV9nLgorCQkJCSAgICAgbV9Jbml0UGFyYW0ubV9wc3pId1ZlcnNpb24sCisJCQkJICAgICAodEVwbE9iZFNpemUpIHN0cmxlbihFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCSAgbV9Jbml0UGFyYW0uCisJCQkJCQkJICBtX3Bzekh3VmVyc2lvbikpOworLyogICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wc3pTd1ZlcnNpb24gIT0gTlVMTCkgeworCQkvLyB3cml0ZSBTb2Z0d2FyZSB2ZXJzaW9uICgweDEwMEEpCisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAwQSwgMCwKKwkJCQkgICAgICh2b2lkIEdFTkVSSUMgKilFcGxBcGlJbnN0YW5jZV9nLgorCQkJCSAgICAgbV9Jbml0UGFyYW0ubV9wc3pTd1ZlcnNpb24sCisJCQkJICAgICAodEVwbE9iZFNpemUpIHN0cmxlbihFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCSAgbV9Jbml0UGFyYW0uCisJCQkJCQkJICBtX3BzelN3VmVyc2lvbikpOworLyogICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiU2RvQ29uCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBTRE8gdHJhbnNmZXJzCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db21GaW5pc2hlZF9wICAgICAgID0gU0RPIHBhcmFtZXRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpQ2JTZG9Db24odEVwbFNkb0NvbUZpbmlzaGVkICogcFNkb0NvbUZpbmlzaGVkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwlFdmVudEFyZy5tX1NkbyA9ICpwU2RvQ29tRmluaXNoZWRfcDsKKwlSZXQgPSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnRTZG8sCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKworCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlDYk5vZGVFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3Igbm9kZSBldmVudHMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElEIG9mIHRoZSBDTgorLy8gICAgICAgICAgICAgIE5vZGVFdmVudF9wICAgICAgICAgICAgID0gZXZlbnQgZnJvbSB0aGUgc3BlY2lmaWVkIENOCisvLyAgICAgICAgICAgICAgTm10U3RhdGVfcCAgICAgICAgICAgICAgPSBjdXJyZW50IE5NVCBzdGF0ZSBvZiB0aGUgQ04KKy8vICAgICAgICAgICAgICB3RXJyb3JDb2RlX3AgICAgICAgICAgICA9IEVQTCBlcnJvciBjb2RlIGlmIE5vZGVFdmVudF9wPT1rRXBsTm10Tm9kZUV2ZW50RXJyb3IKKy8vICAgICAgICAgICAgICBmTWFuZGF0b3J5X3AgICAgICAgICAgICA9IGZsYWcgaWYgQ04gaXMgbWFuZGF0b3J5CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpQ2JOb2RlRXZlbnQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgIHRFcGxObXROb2RlRXZlbnQgTm9kZUV2ZW50X3AsCisJCQkJCSAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCQkgICBXT1JEIHdFcnJvckNvZGVfcCwgQk9PTCBmTWFuZGF0b3J5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwlFdmVudEFyZy5tX05vZGUubV91aU5vZGVJZCA9IHVpTm9kZUlkX3A7CisJRXZlbnRBcmcubV9Ob2RlLm1fTm9kZUV2ZW50ID0gTm9kZUV2ZW50X3A7CisJRXZlbnRBcmcubV9Ob2RlLm1fTm10U3RhdGUgPSBObXRTdGF0ZV9wOworCUV2ZW50QXJnLm1fTm9kZS5tX3dFcnJvckNvZGUgPSB3RXJyb3JDb2RlX3A7CisJRXZlbnRBcmcubV9Ob2RlLm1fZk1hbmRhdG9yeSA9IGZNYW5kYXRvcnlfcDsKKworCVJldCA9IEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50KGtFcGxBcGlFdmVudE5vZGUsCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpQ2JCb290RXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGJvb3QgZXZlbnRzCisvLworLy8gUGFyYW1ldGVyczogIEJvb3RFdmVudF9wICAgICAgICAgICAgID0gZXZlbnQgZnJvbSB0aGUgYm9vdC11cCBwcm9jZXNzCisvLyAgICAgICAgICAgICAgTm10U3RhdGVfcCAgICAgICAgICAgICAgPSBjdXJyZW50IGxvY2FsIE5NVCBzdGF0ZQorLy8gICAgICAgICAgICAgIHdFcnJvckNvZGVfcCAgICAgICAgICAgID0gRVBMIGVycm9yIGNvZGUgaWYgQm9vdEV2ZW50X3A9PWtFcGxObXRCb290RXZlbnRFcnJvcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiQm9vdEV2ZW50KHRFcGxObXRCb290RXZlbnQgQm9vdEV2ZW50X3AsCisJCQkJCSAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCQkgICBXT1JEIHdFcnJvckNvZGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsQXBpRXZlbnRBcmcgRXZlbnRBcmc7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNhbGwgdXNlciBjYWxsYmFjaworCUV2ZW50QXJnLm1fQm9vdC5tX0Jvb3RFdmVudCA9IEJvb3RFdmVudF9wOworCUV2ZW50QXJnLm1fQm9vdC5tX05tdFN0YXRlID0gTm10U3RhdGVfcDsKKwlFdmVudEFyZy5tX0Jvb3QubV93RXJyb3JDb2RlID0gd0Vycm9yQ29kZV9wOworCisJUmV0ID0gRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiRXZlbnQoa0VwbEFwaUV2ZW50Qm9vdCwKKwkJCQkJCQkmRXZlbnRBcmcsCisJCQkJCQkJRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQltX0luaXRQYXJhbS4KKwkJCQkJCQltX3BFdmVudFVzZXJBcmcpOworCisJcmV0dXJuIFJldDsKKworfQorCisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpQ2JMZWRTdGF0ZUNoYW5nZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgTEVEIGNoYW5nZSBldmVudHMuCisvLworLy8gUGFyYW1ldGVyczogIExlZFR5cGVfcCAgICAgICA9IHR5cGUgb2YgTEVECisvLyAgICAgICAgICAgICAgZk9uX3AgICAgICAgICAgID0gc3RhdGUgb2YgTEVECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYkxlZFN0YXRlQ2hhbmdlKHRFcGxMZWRUeXBlIExlZFR5cGVfcCwKKwkJCQkJCUJPT0wgZk9uX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwlFdmVudEFyZy5tX0xlZC5tX0xlZFR5cGUgPSBMZWRUeXBlX3A7CisJRXZlbnRBcmcubV9MZWQubV9mT24gPSBmT25fcDsKKworCVJldCA9IEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50KGtFcGxBcGlFdmVudExlZCwKKwkJCQkJCQkmRXZlbnRBcmcsCisJCQkJCQkJRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQltX0luaXRQYXJhbS4KKwkJCQkJCQltX3BFdmVudFVzZXJBcmcpOworCisJcmV0dXJuIFJldDsKKworfQorCisjZW5kaWYKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjZDEyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpTGludXguaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRVBMIEFQSSBsYXllciBmb3IgTGludXggKGtlcm5lbCBhbmQgdXNlciBzcGFjZSkKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxBcGlMaW51eC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA4LzI1IDEyOjE3OjQxICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMC8xMSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9BUElfTElOVVhfSF8KKyNkZWZpbmUgX0VQTF9BUElfTElOVVhfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMTElOX0RFVl9OQU1FICAgICAiZXBsIgkvLyB1c2VkIGZvciAiL2RldiIgYW5kICIvcHJvYyIgZW50cnkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb21tYW5kcyBmb3IgPGlvY3RsPgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExMSU5fQ01EX0lOSVRJQUxJWkUgICAgICAgICAgICAgICAwCS8vIHVsQXJnX3AgfiB0RXBsQXBpSW5pdFBhcmFtKgorI2RlZmluZSBFUExMSU5fQ01EX1BJX0lOICAgICAgICAgICAgICAgICAgICAxCS8vIHVsQXJnX3AgfiB0RXBsQXBpUHJvY2Vzc0ltYWdlKgorI2RlZmluZSBFUExMSU5fQ01EX1BJX09VVCAgICAgICAgICAgICAgICAgICAyCS8vIHVsQXJnX3AgfiB0RXBsQXBpUHJvY2Vzc0ltYWdlKgorI2RlZmluZSBFUExMSU5fQ01EX1dSSVRFX09CSkVDVCAgICAgICAgICAgICAzCS8vIHVsQXJnX3AgfiB0RXBsTGluU2RvT2JqZWN0KgorI2RlZmluZSBFUExMSU5fQ01EX1JFQURfT0JKRUNUICAgICAgICAgICAgICA0CS8vIHVsQXJnX3AgfiB0RXBsTGluU2RvT2JqZWN0KgorI2RlZmluZSBFUExMSU5fQ01EX1dSSVRFX0xPQ0FMX09CSkVDVCAgICAgICA1CS8vIHVsQXJnX3AgfiB0RXBsTGluTG9jYWxPYmplY3QqCisjZGVmaW5lIEVQTExJTl9DTURfUkVBRF9MT0NBTF9PQkpFQ1QgICAgICAgIDYJLy8gdWxBcmdfcCB+IHRFcGxMaW5Mb2NhbE9iamVjdCoKKyNkZWZpbmUgRVBMTElOX0NNRF9GUkVFX1NET19DSEFOTkVMICAgICAgICAgNwkvLyB1bEFyZ19wIH4gdEVwbFNkb0NvbUNvbkhkbAorI2RlZmluZSBFUExMSU5fQ01EX05NVF9DT01NQU5EICAgICAgICAgICAgICA4CS8vIHVsQXJnX3AgfiB0RXBsTm10RXZlbnQKKyNkZWZpbmUgRVBMTElOX0NNRF9HRVRfRVZFTlQgICAgICAgICAgICAgICAgOQkvLyB1bEFyZ19wIH4gdEVwbExpbkV2ZW50KgorI2RlZmluZSBFUExMSU5fQ01EX01OX1RSSUdHRVJfU1RBVEVfQ0hBTkdFIDEwCS8vIHVsQXJnX3AgfiB0RXBsTGluTm9kZUNtZE9iamVjdCoKKyNkZWZpbmUgRVBMTElOX0NNRF9QSV9TRVRVUCAgICAgICAgICAgICAgICAxMQkvLyB1bEFyZ19wIH4gMAorI2RlZmluZSBFUExMSU5fQ01EX1NIVVRET1dOICAgICAgICAgICAgICAgIDEyCS8vIHVsQXJnX3AgfiAwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlFdmVudEFyZ1NpemU7CisJdEVwbEFwaUV2ZW50QXJnICptX3BFdmVudEFyZzsKKwl0RXBsQXBpRXZlbnRUeXBlICptX3BFdmVudFR5cGU7CisJdEVwbEtlcm5lbCBtX1JldENiRXZlbnQ7CisKK30gdEVwbExpbkV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbUNvbkhkbCBtX1Nkb0NvbUNvbkhkbDsKKwlCT09MIG1fZlZhbGlkU2RvQ29tQ29uSGRsOworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJpbmRleDsKKwl2b2lkICptX2xlX3BEYXRhOworCXVuc2lnbmVkIGludCBtX3VpU2l6ZTsKKwl0RXBsU2RvVHlwZSBtX1Nkb1R5cGU7CisJdm9pZCAqbV9wVXNlckFyZzsKKworfSB0RXBsTGluU2RvT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgbV91aVN1YmluZGV4OworCXZvaWQgKm1fcERhdGE7CisJdW5zaWduZWQgaW50IG1fdWlTaXplOworCit9IHRFcGxMaW5Mb2NhbE9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXRFcGxObXROb2RlQ29tbWFuZCBtX05vZGVDb21tYW5kOworCit9IHRFcGxMaW5Ob2RlQ21kT2JqZWN0OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9BUElfTElOVVhfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpTGludXhLZXJuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpTGludXhLZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWNhMDYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlMaW51eEtlcm5lbC5jCkBAIC0wLDAgKzEsMTI2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIExpbnV4IGtlcm5lbCBtb2R1bGUgYXMgd3JhcHBlciBvZiBFUEwgQVBJIGxheWVyLAorICAgICAgICAgICAgICAgIGkuZS4gY291bnRlcnBhcnQgdG8gYSBMaW51eCBhcHBsaWNhdGlvbgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEFwaUxpbnV4S2VybmVsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMTEvMjEgMDk6MDA6MzggJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMC8xMSBkLmsuOiAgSW5pdGlhbCBWZXJzaW9uCisgIDIwMDgvMDQvMTAgbS51LjogIENoYW5nZWQgdG8gbmV3IGNoYXIgZHJpdmVyIGluaXQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8ga2VybmVsIG1vZHVsIGFuZCBkcml2ZXIKKworLy8jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvLyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8jaW5jbHVkZSA8bGludXgvaW5pdC5oPgorLy8jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworLy8gc2NoZWR1bGluZworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKy8vIG1lbW9yeSBhY2Nlc3MKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2lmZGVmIENPTkZJR19ERVZGU19GUworI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkVwbC5oIgorI2luY2x1ZGUgIkVwbEFwaUxpbnV4LmgiCisvLyNpbmNsdWRlICJrZXJuZWwvRXBsUGRva0NhbC5oIgorI2luY2x1ZGUgInByb2NfZnMuaCIKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAvLyByZW1vdmUgKCJtYWtlIGludmlzaWJsZSIpIG9ic29sZXRlIHN5bWJvbHMgZm9yIGtlcm5lbCB2ZXJzaW9ucyAyLjYKKyAgICAvLyBhbmQgaGlnaGVyCisjZGVmaW5lIE1PRF9JTkNfVVNFX0NPVU5UCisjZGVmaW5lIE1PRF9ERUNfVVNFX0NPVU5UCisjZGVmaW5lIEVYUE9SVF9OT19TWU1CT0xTCisjZWxzZQorI2Vycm9yICJUaGlzIGRyaXZlciBuZWVkcyBhIDIuNi54IGtlcm5lbCBvciBoaWdoZXIiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gTWV0YWluZm9ybWF0aW9uCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjaWZkZWYgTU9EVUxFX0FVVEhPUgorTU9EVUxFX0FVVEhPUigiRGFuaWVsLktydWVnZXJAU1lTVEVDLWVsZWN0cm9uaWMuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVQTCBBUEkgZHJpdmVyIik7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25maWd1cmF0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTExJTl9EUlZfTkFNRSAgICAgInN5c3RlY19lcGwiCS8vIHVzZWQgZm9yIDxyZWdpc3Rlcl9jaHJkZXY+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uc3RhbnQgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNlbmRpZgorCisjZGVmaW5lIEVWRU5UX1NUQVRFX0lOSVQgICAgICAgIDAKKyNkZWZpbmUgRVZFTlRfU1RBVEVfSU9DVEwgICAgICAgMQkvLyBpb2N0bCBlbnRlcmVkIGFuZCByZWFkeSB0byByZWNlaXZlIEVQTCBldmVudAorI2RlZmluZSBFVkVOVF9TVEFURV9SRUFEWSAgICAgICAyCS8vIEVQTCBldmVudCBjYW4gYmUgZm9yd2FyZGVkIHRvIHVzZXIgYXBwbGljYXRpb24KKyNkZWZpbmUgRVZFTlRfU1RBVEVfVEVSTSAgICAgICAgMwkvLyB0ZXJtaW5hdGUgcHJvY2Vzc2luZworCisjZGVmaW5lIEVQTF9TVEFURV9OT1RPUEVOICAgICAgIDAKKyNkZWZpbmUgRVBMX1NUQVRFX05PVElOSVQgICAgICAgMQorI2RlZmluZSBFUExfU1RBVEVfUlVOTklORyAgICAgICAyCisjZGVmaW5lIEVQTF9TVEFURV9TSFVURE9XTiAgICAgIDMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHbG9iYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgQ09ORklHX0RFVkZTX0ZTCisKKyAgICAvLyBkcml2ZXIgbWFqb3IgbnVtYmVyCitzdGF0aWMgaW50IG5EcnZNYWpvck51bWJlcl9nOworCisjZWxzZQorCisgICAgLy8gZGV2aWNlIG51bWJlciAobWFqb3IgYW5kIG1pbm9yKQorc3RhdGljIGRldl90IG5EZXZOdW1fZzsKK3N0YXRpYyBzdHJ1Y3QgY2RldiAqcEVwbF9jZGV2X2c7CisKKyNlbmRpZgorCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50IHVpRXBsU3RhdGVfZyA9IEVQTF9TVEFURV9OT1RPUEVOOworCitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBTZW1hcGhvcmVDYkV2ZW50X2c7CS8vIHNlbWFwaG9yZSBmb3IgRXBsTGluQ2JFdmVudAorc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IFdhaXRRdWV1ZUNiRXZlbnRfZzsJLy8gd2FpdCBxdWV1ZSBFcGxMaW5DYkV2ZW50CitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlUHJvY2Vzc19nOwkvLyB3YWl0IHF1ZXVlIGZvciBFcGxBcGlQcm9jZXNzICh1c2VyIHByb2Nlc3MpCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlUmVsZWFzZV9nOwkvLyB3YWl0IHF1ZXVlIGZvciBFcGxMaW5SZWxlYXNlCitzdGF0aWMgYXRvbWljX3QgQXRvbWljRXZlbnRTdGF0ZV9nID0gQVRPTUlDX0lOSVQoRVZFTlRfU1RBVEVfSU5JVCk7CitzdGF0aWMgdEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfZzsJLy8gZXZlbnQgdHlwZSAoZW51bSkKK3N0YXRpYyB0RXBsQXBpRXZlbnRBcmcgKnBFdmVudEFyZ19nOwkvLyBldmVudCBhcmd1bWVudCAodW5pb24pCitzdGF0aWMgdEVwbEtlcm5lbCBSZXRDYkV2ZW50X2c7CS8vIHJldHVybiBjb2RlIGZyb20gZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBXYWl0UXVldWVDYlN5bmNfZzsJLy8gd2FpdCBxdWV1ZSBFcGxMaW5DYlN5bmMKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBXYWl0UXVldWVQSV9Jbl9nOwkvLyB3YWl0IHF1ZXVlIGZvciBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZUluICh1c2VyIHByb2Nlc3MpCitzdGF0aWMgYXRvbWljX3QgQXRvbWljU3luY1N0YXRlX2cgPSBBVE9NSUNfSU5JVChFVkVOVF9TVEFURV9JTklUKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKm1fcFVzZXJBcmc7CisJdm9pZCAqbV9wRGF0YTsKKworfSB0RXBsTGluU2RvQnVmSGVhZGVyOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzIG9mIGludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGluQ2JFdmVudCh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCQl0RXBsQXBpRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCwJLy8gSU46IGV2ZW50IGFyZ3VtZW50ICh1bmlvbikKKwkJCQl2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGluQ2JTeW5jKHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBFcGxMaW5Jbml0KHZvaWQpOworc3RhdGljIHZvaWQgX19leGl0IEVwbExpbkV4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgRXBsTGluT3BlbihzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsIHN0cnVjdCBmaWxlICpwSW5zdGFuY2VfcCk7CitzdGF0aWMgaW50IEVwbExpblJlbGVhc2Uoc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLCBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3ApOworc3RhdGljIHNzaXplX3QgRXBsTGluUmVhZChzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsIGNoYXIgKnBEc3RCdWZmX3AsCisJCQkgIHNpemVfdCBCdWZmU2l6ZV9wLCBsb2ZmX3QgKiBwRmlsZU9mZnNfcCk7CitzdGF0aWMgc3NpemVfdCBFcGxMaW5Xcml0ZShzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsIGNvbnN0IGNoYXIgKnBTcmNCdWZmX3AsCisJCQkgICBzaXplX3QgQnVmZlNpemVfcCwgbG9mZl90ICogcEZpbGVPZmZzX3ApOworc3RhdGljIGludCBFcGxMaW5Jb2N0bChzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsIHN0cnVjdCBmaWxlICpwSW5zdGFuY2VfcCwKKwkJICAgICAgIHVuc2lnbmVkIGludCB1aUlvY3RsQ21kX3AsIHVuc2lnbmVkIGxvbmcgdWxBcmdfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgS2VybmVsIE1vZHVsZSBzcGVjaWZpYyBEYXRhIFN0cnVjdHVyZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VYUE9SVF9OT19TWU1CT0xTOworCittb2R1bGVfaW5pdChFcGxMaW5Jbml0KTsKK21vZHVsZV9leGl0KEVwbExpbkV4aXQpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBFcGxMaW5GaWxlT3BzX2cgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBFcGxMaW5PcGVuLAorCS5yZWxlYXNlID0gRXBsTGluUmVsZWFzZSwKKwkucmVhZCA9IEVwbExpblJlYWQsCisJLndyaXRlID0gRXBsTGluV3JpdGUsCisJLmlvY3RsID0gRXBsTGluSW9jdGwsCisKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEluaXRhaWxpemUgRHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIC0+IGluc21vZCBkcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgX19pbml0IEVwbExpbkluaXQodm9pZCkKK3sKKworCXRFcGxLZXJuZWwgRXBsUmV0OworCWludCBpRXJyOworCWludCBpUmV0OworI2lmZGVmIENPTkZJR19ERVZGU19GUworCWludCBuTWlub3JOdW1iZXI7CisjZW5kaWYKKworCVRSQUNFMCgiRVBMOiArIEVwbExpbkluaXQuLi5cbiIpOworCVRSQUNFMigiRVBMOiAgIERyaXZlciBidWlsZDogJXMgLyAlc1xuIiwgX19EQVRFX18sIF9fVElNRV9fKTsKKworCWlSZXQgPSAwOworCisJLy8gaW5pdGlhbGl6ZSBnbG9iYWwgdmFyaWFibGVzCisJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9JTklUKTsKKwlzZW1hX2luaXQoJlNlbWFwaG9yZUNiRXZlbnRfZywgMSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVQcm9jZXNzX2cpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZVJlbGVhc2VfZyk7CisKKyNpZmRlZiBDT05GSUdfREVWRlNfRlMKKworCS8vIHJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgaGFuZGxlcgorCVRSQUNFMigiRVBMOiAgIEluc3RhbGxpbmcgRHJpdmVyICclcycsIFZlcnNpb24gJXMuLi5cbiIsCisJICAgICAgIEVQTExJTl9EUlZfTkFNRSwgRVBMX1BST0RVQ1RfVkVSU0lPTik7CisJVFJBQ0UwKCJFUEw6ICAgKHVzaW5nIGR5bmFtaWMgbWFqb3IgbnVtYmVyIGFzc2lnbm1lbnQpXG4iKTsKKwluRHJ2TWFqb3JOdW1iZXJfZyA9CisJICAgIHJlZ2lzdGVyX2NocmRldigwLCBFUExMSU5fRFJWX05BTUUsICZFcGxMaW5GaWxlT3BzX2cpOworCWlmIChuRHJ2TWFqb3JOdW1iZXJfZyAhPSAwKSB7CisJCVRSQUNFMgorCQkgICAgKCJFUEw6ICAgRHJpdmVyICclcycgaW5zdGFsbGVkIHN1Y2Nlc3NmdWwsIGFzc2lnbmVkIE1ham9yTnVtYmVyPSVkXG4iLAorCQkgICAgIEVQTExJTl9EUlZfTkFNRSwgbkRydk1ham9yTnVtYmVyX2cpOworCX0gZWxzZSB7CisJCVRSQUNFMQorCQkgICAgKCJFUEw6ICAgRVJST1I6IERyaXZlciAnJXMnIGlzIHVuYWJsZSB0byBnZXQgYSBmcmVlIE1ham9yTnVtYmVyIVxuIiwKKwkJICAgICBFUExMSU5fRFJWX05BTUUpOworCQlpUmV0ID0gLUVJTzsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNyZWF0ZSBkZXZpY2Ugbm9kZSBpbiBERVZGUworCW5NaW5vck51bWJlciA9IDA7CisJVFJBQ0UxKCJFUEw6ICAgQ3JlYXRpbmcgZGV2aWNlIG5vZGUgJy9kZXYvJXMnLi4uXG4iLCBFUExMSU5fREVWX05BTUUpOworCWlFcnIgPQorCSAgICBkZXZmc19ta19jZGV2KE1LREVWKG5EcnZNYWpvck51bWJlcl9nLCBuTWlub3JOdW1iZXIpLAorCQkJICBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sIEVQTExJTl9ERVZfTkFNRSk7CisJaWYgKGlFcnIgPT0gMCkgeworCQlUUkFDRTEoIkVQTDogICBEZXZpY2Ugbm9kZSAnL2Rldi8lcycgY3JlYXRlZCBzdWNjZXNzZnVsLlxuIiwKKwkJICAgICAgIEVQTExJTl9ERVZfTkFNRSk7CisJfSBlbHNlIHsKKwkJVFJBQ0UxKCJFUEw6ICAgRVJST1I6IHVuYWJsZSB0byBjcmVhdGUgZGV2aWNlIG5vZGUgJy9kZXYvJXMnXG4iLAorCQkgICAgICAgRVBMTElOX0RFVl9OQU1FKTsKKwkJaVJldCA9IC1FSU87CisJCWdvdG8gRXhpdDsKKwl9CisKKyNlbHNlCisKKwkvLyByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGhhbmRsZXIKKwkvLyBvbmx5IG9uZSBNaW5vciByZXF1aXJlZAorCVRSQUNFMigiRVBMOiAgIEluc3RhbGxpbmcgRHJpdmVyICclcycsIFZlcnNpb24gJXMuLi5cbiIsCisJICAgICAgIEVQTExJTl9EUlZfTkFNRSwgRVBMX1BST0RVQ1RfVkVSU0lPTik7CisJaVJldCA9IGFsbG9jX2NocmRldl9yZWdpb24oJm5EZXZOdW1fZywgMCwgMSwgRVBMTElOX0RSVl9OQU1FKTsKKwlpZiAoaVJldCA9PSAwKSB7CisJCVRSQUNFMgorCQkgICAgKCJFUEw6ICAgRHJpdmVyICclcycgaW5zdGFsbGVkIHN1Y2Nlc3NmdWwsIGFzc2lnbmVkIE1ham9yTnVtYmVyPSVkXG4iLAorCQkgICAgIEVQTExJTl9EUlZfTkFNRSwgTUFKT1IobkRldk51bV9nKSk7CisJfSBlbHNlIHsKKwkJVFJBQ0UxCisJCSAgICAoIkVQTDogICBFUlJPUjogRHJpdmVyICclcycgaXMgdW5hYmxlIHRvIGdldCBhIGZyZWUgTWFqb3JOdW1iZXIhXG4iLAorCQkgICAgIEVQTExJTl9EUlZfTkFNRSk7CisJCWlSZXQgPSAtRUlPOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gcmVnaXN0ZXIgY2RldiBzdHJ1Y3R1cmUKKwlwRXBsX2NkZXZfZyA9IGNkZXZfYWxsb2MoKTsKKwlwRXBsX2NkZXZfZy0+b3BzID0gJkVwbExpbkZpbGVPcHNfZzsKKwlwRXBsX2NkZXZfZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlpRXJyID0gY2Rldl9hZGQocEVwbF9jZGV2X2csIG5EZXZOdW1fZywgMSk7CisJaWYgKGlFcnIpIHsKKwkJVFJBQ0UyKCJFUEw6ICAgRVJST1IgJWQ6IERyaXZlciAnJXMnIGNvdWxkIG5vdCBiZSBhZGRlZCFcbiIsCisJCSAgICAgICBpRXJyLCBFUExMSU5fRFJWX05BTUUpOworCQlpUmV0ID0gLUVJTzsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gY3JlYXRlIGRldmljZSBub2RlIGluIFBST0NGUworCUVwbFJldCA9IEVwbExpblByb2NJbml0KCk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCisJVFJBQ0UxKCJFUEw6IC0gRXBsTGluSW5pdCAoaVJldD0lZClcbiIsIGlSZXQpOworCXJldHVybiAoaVJldCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZW1vdmUgRHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIC0+IHJtbW9kIGRyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgX19leGl0IEVwbExpbkV4aXQodm9pZCkKK3sKKworCXRFcGxLZXJuZWwgRXBsUmV0OworCisJLy8gZGVsZXRlIGluc3RhbmNlIGZvciBhbGwgbW9kdWxlcworLy8gICAgRXBsUmV0ID0gRXBsQXBpU2h1dGRvd24oKTsKKy8vICAgIHByaW50aygiRXBsQXBpU2h1dGRvd24oKTogIDB4JVhcbiIsIEVwbFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgcHJvYyBmcworCUVwbFJldCA9IEVwbExpblByb2NGcmVlKCk7CisJcHJpbnRrKCJFcGxMaW5Qcm9jRnJlZSgpOiAgICAgICAgMHglWFxuIiwgRXBsUmV0KTsKKworCVRSQUNFMCgiRVBMOiArIEVwbExpbkV4aXQuLi5cbiIpOworCisjaWZkZWYgQ09ORklHX0RFVkZTX0ZTCisKKwkvLyByZW1vdmUgZGV2aWNlIG5vZGUgZnJvbSBERVZGUworCWRldmZzX3JlbW92ZShFUExMSU5fREVWX05BTUUpOworCVRSQUNFMSgiRVBMOiAgIERldmljZSBub2RlICcvZGV2LyVzJyByZW1vdmVkLlxuIiwgRVBMTElOX0RFVl9OQU1FKTsKKworCS8vIHVucmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZSBoYW5kbGVyCisJdW5yZWdpc3Rlcl9jaHJkZXYobkRydk1ham9yTnVtYmVyX2csIEVQTExJTl9EUlZfTkFNRSk7CisKKyNlbHNlCisKKwkvLyByZW1vdmUgY2RldiBzdHJ1Y3R1cmUKKwljZGV2X2RlbChwRXBsX2NkZXZfZyk7CisKKwkvLyB1bnJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgaGFuZGxlcgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihuRGV2TnVtX2csIDEpOworCisjZW5kaWYKKworCVRSQUNFMSgiRVBMOiAgIERyaXZlciAnJXMnIHJlbW92ZWQuXG4iLCBFUExMSU5fRFJWX05BTUUpOworCisJVFJBQ0UwKCJFUEw6IC0gRXBsTGluRXhpdFxuIik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBPcGVuIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBvcGVuKCIvZGV2L2RyaXZlciIsIE9fUkRXUikuLi4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXBsTGluT3BlbihzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdG8gb3BlbgorCQkgICAgICBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3ApCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQoreworCisJaW50IGlSZXQ7CisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5PcGVuLi4uXG4iKTsKKworCU1PRF9JTkNfVVNFX0NPVU5UOworCisJaWYgKHVpRXBsU3RhdGVfZyAhPSBFUExfU1RBVEVfTk9UT1BFTikgewkvLyBzdGFjayBhbHJlYWR5IGluaXRpYWxpemVkCisJCWlSZXQgPSAtRUFMUkVBRFk7CisJfSBlbHNlIHsKKwkJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9JTklUKTsKKwkJc2VtYV9pbml0KCZTZW1hcGhvcmVDYkV2ZW50X2csIDEpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVQcm9jZXNzX2cpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVSZWxlYXNlX2cpOworCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfSU5JVCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZUNiU3luY19nKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlUElfSW5fZyk7CisKKwkJdWlFcGxTdGF0ZV9nID0gRVBMX1NUQVRFX05PVElOSVQ7CisJCWlSZXQgPSAwOworCX0KKworCVRSQUNFMSgiRVBMOiAtIEVwbExpbk9wZW4gKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ2xvc2UgRHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIC0+IGNsb3NlKGRldmljZSkuLi4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXBsTGluUmVsZWFzZShzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdG8gb3BlbgorCQkJIHN0cnVjdCBmaWxlICpwSW5zdGFuY2VfcCkJLy8gaW5mb3JtYXRpb24gYWJvdXQgZHJpdmVyIGluc3RhbmNlCit7CisKKwl0RXBsS2VybmVsIEVwbFJldCA9IGtFcGxTdWNjZXNzZnVsOworCWludCBpUmV0OworCisJVFJBQ0UwKCJFUEw6ICsgRXBsTGluUmVsZWFzZS4uLlxuIik7CisKKwlpZiAodWlFcGxTdGF0ZV9nICE9IEVQTF9TVEFURV9OT1RJTklUKSB7CisJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJYXRvbWljX3NldCgmQXRvbWljU3luY1N0YXRlX2csIEVWRU5UX1NUQVRFX1RFUk0pOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiU3luY19nKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVQSV9Jbl9nKTsKKworCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZAorCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX1RFUk0pOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisKKwkJaWYgKHVpRXBsU3RhdGVfZyA9PSBFUExfU1RBVEVfUlVOTklORykgewkvLyBwb3N0IE5tdEV2ZW50U3dpdGNoT2ZmCisJCQlFcGxSZXQgPSBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd2l0Y2hPZmYpOworCisJCX0KKworCQlpZiAoRXBsUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlUUkFDRTAoIkVQTDogICB3YWl0aW5nIGZvciBOTVRfR1NfT0ZGXG4iKTsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVSZWxlYXNlX2csCisJCQkJCQkgKHVpRXBsU3RhdGVfZyA9PQorCQkJCQkJICBFUExfU1RBVEVfU0hVVERPV04pKTsKKwkJfSBlbHNlIHsJLy8gcG9zdCBObXRFdmVudFN3aXRjaE9mZiBmYWlsZWQKKwkJCVRSQUNFMCgiRVBMOiAgIGV2ZW50IHBvc3QgZmFpbGVkXG4iKTsKKwkJfQorCisJCS8vICQkJCBkLmsuOiBXaGF0IGlmIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbD8KKworCQlUUkFDRTAoIkVQTDogICBjYWxsIEVwbEFwaVNodXRkb3duKClcbiIpOworCQkvLyBFUEwgc3RhY2sgY2FuIGJlIHNhZmVseSBzaHV0IGRvd24KKwkJLy8gZGVsZXRlIGluc3RhbmNlIGZvciBhbGwgRVBMIG1vZHVsZXMKKwkJRXBsUmV0ID0gRXBsQXBpU2h1dGRvd24oKTsKKwkJcHJpbnRrKCJFcGxBcGlTaHV0ZG93bigpOiAgMHglWFxuIiwgRXBsUmV0KTsKKwl9CisKKwl1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfTk9UT1BFTjsKKwlpUmV0ID0gMDsKKworCU1PRF9ERUNfVVNFX0NPVU5UOworCisJVFJBQ0UxKCJFUEw6IC0gRXBsTGluUmVsZWFzZSAoaVJldD0lZClcbiIsIGlSZXQpOworCXJldHVybiAoaVJldCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWFkIERhdGEgZnJvbSBEcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgLT4gcmVhZCguLi4pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3NpemVfdCBFcGxMaW5SZWFkKHN0cnVjdCBmaWxlICpwSW5zdGFuY2VfcCwJLy8gaW5mb3JtYXRpb24gYWJvdXQgZHJpdmVyIGluc3RhbmNlCisJCQkgIGNoYXIgKnBEc3RCdWZmX3AsCS8vIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIGZpbGwgd2l0aCBkYXRhCisJCQkgIHNpemVfdCBCdWZmU2l6ZV9wLAkvLyBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorCQkJICBsb2ZmX3QgKiBwRmlsZU9mZnNfcCkJLy8gb2Zmc2V0IGluIHRoZSBmaWxlCit7CisKKwlpbnQgaVJldDsKKworCVRSQUNFMCgiRVBMOiArIEVwbExpblJlYWQuLi5cbiIpOworCisJVFJBQ0UwKCJFUEw6ICAgU29ycnksIHRoaXMgb3BlcmF0aW9uIGlzbid0IHN1cHBvcnRlZC5cbiIpOworCWlSZXQgPSAtRUlOVkFMOworCisJVFJBQ0UxKCJFUEw6IC0gRXBsTGluUmVhZCAoaVJldD0lZClcbiIsIGlSZXQpOworCXJldHVybiAoaVJldCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXcml0ZSBEYXRhIHRvIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiB3cml0ZSguLi4pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3NpemVfdCBFcGxMaW5Xcml0ZShzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQorCQkJICAgY29uc3QgY2hhciAqcFNyY0J1ZmZfcCwJLy8gYWRkcmVzcyBvZiBidWZmZXIgdG8gZ2V0IGRhdGEgZnJvbQorCQkJICAgc2l6ZV90IEJ1ZmZTaXplX3AsCS8vIGxlbmd0aCBvZiB0aGUgYnVmZmVyCisJCQkgICBsb2ZmX3QgKiBwRmlsZU9mZnNfcCkJLy8gb2Zmc2V0IGluIHRoZSBmaWxlCit7CisKKwlpbnQgaVJldDsKKworCVRSQUNFMCgiRVBMOiArIEVwbExpbldyaXRlLi4uXG4iKTsKKworCVRSQUNFMCgiRVBMOiAgIFNvcnJ5LCB0aGlzIG9wZXJhdGlvbiBpc24ndCBzdXBwb3J0ZWQuXG4iKTsKKwlpUmV0ID0gLUVJTlZBTDsKKworCVRSQUNFMSgiRVBMOiAtIEVwbExpbldyaXRlIChpUmV0PSVkKVxuIiwgaVJldCk7CisJcmV0dXJuIChpUmV0KTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdlbmVyaWMgQWNjZXNzIHRvIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBpb2N0bCguLi4pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpbklvY3RsKHN0cnVjdCBpbm9kZSAqcERldmljZUZpbGVfcCwJLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSB0byBvcGVuCisJCSAgICAgICBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQorCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW9jdGxDbWRfcCwJLy8gSW9jdGwgY29tbWFuZCB0byBleGVjdXRlCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsQXJnX3ApCS8vIElvY3RsIGNvbW1hbmQgc3BlY2lmaWMgYXJndW1lbnQvcGFyYW1ldGVyCit7CisKKwl0RXBsS2VybmVsIEVwbFJldDsKKwlpbnQgaUVycjsKKwlpbnQgaVJldDsKKworLy8gICAgVFJBQ0UxKCJFUEw6ICsgRXBsTGluSW9jdGwgKHVpSW9jdGxDbWRfcD0lZCkuLi5cbiIsIHVpSW9jdGxDbWRfcCk7CisKKwlpUmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAodWlJb2N0bENtZF9wKSB7CisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfSU5JVElBTElaRToKKwkJeworCQkJdEVwbEFwaUluaXRQYXJhbSBFcGxBcGlJbml0UGFyYW07CisKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfZnJvbV91c2VyKCZFcGxBcGlJbml0UGFyYW0sCisJCQkJCSAgIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKEVwbEFwaUluaXRQYXJhbSkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJRXBsQXBpSW5pdFBhcmFtLm1fcGZuQ2JFdmVudCA9IEVwbExpbkNiRXZlbnQ7CisJCQlFcGxBcGlJbml0UGFyYW0ubV9wZm5DYlN5bmMgPSBFcGxMaW5DYlN5bmM7CisKKwkJCUVwbFJldCA9IEVwbEFwaUluaXRpYWxpemUoJkVwbEFwaUluaXRQYXJhbSk7CisKKwkJCXVpRXBsU3RhdGVfZyA9IEVQTF9TVEFURV9SVU5OSU5HOworCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfU0hVVERPV046CisJCXsJCS8vIHNodXRkb3duIHRoZSB0aHJlYWRzCisKKwkJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9URVJNKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JTeW5jX2cpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVQSV9Jbl9nKTsKKworCQkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQKKwkJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisKKwkJCWlmICh1aUVwbFN0YXRlX2cgPT0gRVBMX1NUQVRFX1JVTk5JTkcpIHsJLy8gcG9zdCBObXRFdmVudFN3aXRjaE9mZgorCQkJCUVwbFJldCA9CisJCQkJICAgIEVwbEFwaUV4ZWNObXRDb21tYW5kKGtFcGxObXRFdmVudFN3aXRjaE9mZik7CisKKwkJCX0KKworCQkJaVJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfUkVBRF9MT0NBTF9PQkpFQ1Q6CisJCXsKKwkJCXRFcGxMaW5Mb2NhbE9iamVjdCBMb2NhbE9iamVjdDsKKwkJCXZvaWQgKnBEYXRhOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmTG9jYWxPYmplY3QsIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKExvY2FsT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKExvY2FsT2JqZWN0Lm1fcERhdGEgPT0gTlVMTCkKKwkJCSAgICB8fCAoTG9jYWxPYmplY3QubV91aVNpemUgPT0gMCkpIHsKKwkJCQlpUmV0ID0gKGludClrRXBsQXBpSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJcERhdGEgPSB2bWFsbG9jKExvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChwRGF0YSA9PSBOVUxMKSB7CS8vIG5vIG1lbW9yeSBhdmFpbGFibGUKKwkJCQlpUmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpUmVhZExvY2FsT2JqZWN0KExvY2FsT2JqZWN0Lm1fdWlJbmRleCwKKwkJCQkJCSAgTG9jYWxPYmplY3QubV91aVN1YmluZGV4LAorCQkJCQkJICBwRGF0YSwgJkxvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKworCQkJaWYgKEVwbFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWlFcnIgPQorCQkJCSAgICBjb3B5X3RvX3VzZXIoTG9jYWxPYmplY3QubV9wRGF0YSwgcERhdGEsCisJCQkJCQkgTG9jYWxPYmplY3QubV91aVNpemUpOworCisJCQkJdmZyZWUocERhdGEpOworCisJCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCQlpUmV0ID0gLUVJTzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyByZXR1cm4gYWN0dWFsIHNpemUgKExvY2FsT2JqZWN0Lm1fdWlTaXplKQorCQkJCWlFcnIgPSBwdXRfdXNlcihMb2NhbE9iamVjdC5tX3VpU2l6ZSwKKwkJCQkJCSh1bnNpZ25lZCBpbnQgKikodWxBcmdfcCArCisJCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkJICZMb2NhbE9iamVjdC4KKwkJCQkJCQkJIG1fdWlTaXplIC0KKwkJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCQkgJkxvY2FsT2JqZWN0KSk7CisJCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCQlpUmV0ID0gLUVJTzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQl2ZnJlZShwRGF0YSk7CisJCQl9CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgRVBMTElOX0NNRF9XUklURV9MT0NBTF9PQkpFQ1Q6CisJCXsKKwkJCXRFcGxMaW5Mb2NhbE9iamVjdCBMb2NhbE9iamVjdDsKKwkJCXZvaWQgKnBEYXRhOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmTG9jYWxPYmplY3QsIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKExvY2FsT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKExvY2FsT2JqZWN0Lm1fcERhdGEgPT0gTlVMTCkKKwkJCSAgICB8fCAoTG9jYWxPYmplY3QubV91aVNpemUgPT0gMCkpIHsKKwkJCQlpUmV0ID0gKGludClrRXBsQXBpSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJcERhdGEgPSB2bWFsbG9jKExvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChwRGF0YSA9PSBOVUxMKSB7CS8vIG5vIG1lbW9yeSBhdmFpbGFibGUKKwkJCQlpUmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcihwRGF0YSwgTG9jYWxPYmplY3QubV9wRGF0YSwKKwkJCQkJICAgTG9jYWxPYmplY3QubV91aVNpemUpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJRXBsUmV0ID0KKwkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KExvY2FsT2JqZWN0Lm1fdWlJbmRleCwKKwkJCQkJCSAgIExvY2FsT2JqZWN0Lm1fdWlTdWJpbmRleCwKKwkJCQkJCSAgIHBEYXRhLCBMb2NhbE9iamVjdC5tX3VpU2l6ZSk7CisKKwkJCXZmcmVlKHBEYXRhKTsKKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgRVBMTElOX0NNRF9SRUFEX09CSkVDVDoKKwkJeworCQkJdEVwbExpblNkb09iamVjdCBTZG9PYmplY3Q7CisJCQl2b2lkICpwRGF0YTsKKwkJCXRFcGxMaW5TZG9CdWZIZWFkZXIgKnBCdWZIZWFkZXI7CisJCQl0RXBsU2RvQ29tQ29uSGRsICpwU2RvQ29tQ29uSGRsOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmU2RvT2JqZWN0LCAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihTZG9PYmplY3QpKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmICgoU2RvT2JqZWN0Lm1fbGVfcERhdGEgPT0gTlVMTCkKKwkJCSAgICB8fCAoU2RvT2JqZWN0Lm1fdWlTaXplID09IDApKSB7CisJCQkJaVJldCA9IChpbnQpa0VwbEFwaUludmFsaWRQYXJhbTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCXBCdWZIZWFkZXIgPQorCQkJICAgICh0RXBsTGluU2RvQnVmSGVhZGVyICopCisJCQkgICAgdm1hbGxvYyhzaXplb2YodEVwbExpblNkb0J1ZkhlYWRlcikgKworCQkJCSAgICBTZG9PYmplY3QubV91aVNpemUpOworCQkJaWYgKHBCdWZIZWFkZXIgPT0gTlVMTCkgewkvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisJCQkJaVJldCA9IC1FTk9NRU07CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gaW5pdGlhdGUgdGVtcG9yYXJ5IGJ1ZmZlcgorCQkJcEJ1ZkhlYWRlci0+bV9wVXNlckFyZyA9IFNkb09iamVjdC5tX3BVc2VyQXJnOwkvLyBvcmlnaW5hbCB1c2VyIGFyZ3VtZW50IHBvaW50ZXIKKwkJCXBCdWZIZWFkZXItPm1fcERhdGEgPSBTZG9PYmplY3QubV9sZV9wRGF0YTsJLy8gb3JpZ2luYWwgZGF0YSBwb2ludGVyIGZyb20gYXBwCisJCQlwRGF0YSA9IHBCdWZIZWFkZXIgKyBzaXplb2YodEVwbExpblNkb0J1ZkhlYWRlcik7CisKKwkJCWlmIChTZG9PYmplY3QubV9mVmFsaWRTZG9Db21Db25IZGwgIT0gRkFMU0UpIHsKKwkJCQlwU2RvQ29tQ29uSGRsID0gJlNkb09iamVjdC5tX1Nkb0NvbUNvbkhkbDsKKwkJCX0gZWxzZSB7CisJCQkJcFNkb0NvbUNvbkhkbCA9IE5VTEw7CisJCQl9CisKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpUmVhZE9iamVjdChwU2RvQ29tQ29uSGRsLAorCQkJCQkgICAgIFNkb09iamVjdC5tX3VpTm9kZUlkLAorCQkJCQkgICAgIFNkb09iamVjdC5tX3VpSW5kZXgsCisJCQkJCSAgICAgU2RvT2JqZWN0Lm1fdWlTdWJpbmRleCwgcERhdGEsCisJCQkJCSAgICAgJlNkb09iamVjdC5tX3VpU2l6ZSwKKwkJCQkJICAgICBTZG9PYmplY3QubV9TZG9UeXBlLCBwQnVmSGVhZGVyKTsKKworCQkJLy8gcmV0dXJuIGFjdHVhbCBTRE8gaGFuZGxlIChTZG9PYmplY3QubV9TZG9Db21Db25IZGwpCisJCQlpRXJyID0gcHV0X3VzZXIoU2RvT2JqZWN0Lm1fU2RvQ29tQ29uSGRsLAorCQkJCQkodW5zaWduZWQgaW50ICopKHVsQXJnX3AgKworCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgJlNkb09iamVjdC4KKwkJCQkJCQkgbV9TZG9Db21Db25IZGwgLQorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgJlNkb09iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKEVwbFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWlFcnIgPQorCQkJCSAgICBjb3B5X3RvX3VzZXIoU2RvT2JqZWN0Lm1fbGVfcERhdGEsIHBEYXRhLAorCQkJCQkJIFNkb09iamVjdC5tX3VpU2l6ZSk7CisKKwkJCQl2ZnJlZShwQnVmSGVhZGVyKTsKKworCQkJCWlmIChpRXJyICE9IDApIHsKKwkJCQkJaVJldCA9IC1FSU87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gcmV0dXJuIGFjdHVhbCBzaXplIChTZG9PYmplY3QubV91aVNpemUpCisJCQkJaUVyciA9IHB1dF91c2VyKFNkb09iamVjdC5tX3VpU2l6ZSwKKwkJCQkJCSh1bnNpZ25lZCBpbnQgKikodWxBcmdfcCArCisJCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkJICZTZG9PYmplY3QuCisJCQkJCQkJCSBtX3VpU2l6ZSAtCisJCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkJICZTZG9PYmplY3QpKTsKKwkJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJCWlSZXQgPSAtRUlPOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxSZXQgIT0ga0VwbEFwaVRhc2tEZWZlcnJlZCkgewkvLyBlcnJvciBvY3VycmVkCisJCQkJdmZyZWUocEJ1ZkhlYWRlcik7CisJCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCQlpUmV0ID0gLUVJTzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0KKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgRVBMTElOX0NNRF9XUklURV9PQkpFQ1Q6CisJCXsKKwkJCXRFcGxMaW5TZG9PYmplY3QgU2RvT2JqZWN0OworCQkJdm9pZCAqcERhdGE7CisJCQl0RXBsTGluU2RvQnVmSGVhZGVyICpwQnVmSGVhZGVyOworCQkJdEVwbFNkb0NvbUNvbkhkbCAqcFNkb0NvbUNvbkhkbDsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJlNkb09iamVjdCwgKGNvbnN0IHZvaWQgKil1bEFyZ19wLAorCQkJCQkgICBzaXplb2YoU2RvT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKFNkb09iamVjdC5tX2xlX3BEYXRhID09IE5VTEwpCisJCQkgICAgfHwgKFNkb09iamVjdC5tX3VpU2l6ZSA9PSAwKSkgeworCQkJCWlSZXQgPSAoaW50KWtFcGxBcGlJbnZhbGlkUGFyYW07CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlwQnVmSGVhZGVyID0KKwkJCSAgICAodEVwbExpblNkb0J1ZkhlYWRlciAqKQorCQkJICAgIHZtYWxsb2Moc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpICsKKwkJCQkgICAgU2RvT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChwQnVmSGVhZGVyID09IE5VTEwpIHsJLy8gbm8gbWVtb3J5IGF2YWlsYWJsZQorCQkJCWlSZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGluaXRpYXRlIHRlbXBvcmFyeSBidWZmZXIKKwkJCXBCdWZIZWFkZXItPm1fcFVzZXJBcmcgPSBTZG9PYmplY3QubV9wVXNlckFyZzsJLy8gb3JpZ2luYWwgdXNlciBhcmd1bWVudCBwb2ludGVyCisJCQlwQnVmSGVhZGVyLT5tX3BEYXRhID0gU2RvT2JqZWN0Lm1fbGVfcERhdGE7CS8vIG9yaWdpbmFsIGRhdGEgcG9pbnRlciBmcm9tIGFwcAorCQkJcERhdGEgPSBwQnVmSGVhZGVyICsgc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcihwRGF0YSwgU2RvT2JqZWN0Lm1fbGVfcERhdGEsCisJCQkJCSAgIFNkb09iamVjdC5tX3VpU2l6ZSk7CisKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmIChTZG9PYmplY3QubV9mVmFsaWRTZG9Db21Db25IZGwgIT0gRkFMU0UpIHsKKwkJCQlwU2RvQ29tQ29uSGRsID0gJlNkb09iamVjdC5tX1Nkb0NvbUNvbkhkbDsKKwkJCX0gZWxzZSB7CisJCQkJcFNkb0NvbUNvbkhkbCA9IE5VTEw7CisJCQl9CisKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpV3JpdGVPYmplY3QocFNkb0NvbUNvbkhkbCwKKwkJCQkJICAgICAgU2RvT2JqZWN0Lm1fdWlOb2RlSWQsCisJCQkJCSAgICAgIFNkb09iamVjdC5tX3VpSW5kZXgsCisJCQkJCSAgICAgIFNkb09iamVjdC5tX3VpU3ViaW5kZXgsIHBEYXRhLAorCQkJCQkgICAgICBTZG9PYmplY3QubV91aVNpemUsCisJCQkJCSAgICAgIFNkb09iamVjdC5tX1Nkb1R5cGUsIHBCdWZIZWFkZXIpOworCisJCQkvLyByZXR1cm4gYWN0dWFsIFNETyBoYW5kbGUgKFNkb09iamVjdC5tX1Nkb0NvbUNvbkhkbCkKKwkJCWlFcnIgPSBwdXRfdXNlcihTZG9PYmplY3QubV9TZG9Db21Db25IZGwsCisJCQkJCSh1bnNpZ25lZCBpbnQgKikodWxBcmdfcCArCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAmU2RvT2JqZWN0LgorCQkJCQkJCSBtX1Nkb0NvbUNvbkhkbCAtCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAmU2RvT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoRXBsUmV0ICE9IGtFcGxBcGlUYXNrRGVmZXJyZWQpIHsJLy8gc3VjY2VlZGVkIG9yIGVycm9yIG9jdXJyZWQsIGJ1dCB0YXNrIG5vdCBkZWZlcnJlZAorCQkJCXZmcmVlKHBCdWZIZWFkZXIpOworCQkJfQorCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfRlJFRV9TRE9fQ0hBTk5FTDoKKwkJeworCQkJLy8gZm9yd2FyZCBTRE8gaGFuZGxlIHRvIEVQTCBzdGFjaworCQkJRXBsUmV0ID0KKwkJCSAgICBFcGxBcGlGcmVlU2RvQ2hhbm5lbCgodEVwbFNkb0NvbUNvbkhkbCkgdWxBcmdfcCk7CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfTU5fVFJJR0dFUl9TVEFURV9DSEFOR0U6CisJCXsKKwkJCXRFcGxMaW5Ob2RlQ21kT2JqZWN0IE5vZGVDbWRPYmplY3Q7CisKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfZnJvbV91c2VyKCZOb2RlQ21kT2JqZWN0LAorCQkJCQkgICAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihOb2RlQ21kT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaU1uVHJpZ2dlclN0YXRlQ2hhbmdlKE5vZGVDbWRPYmplY3QubV91aU5vZGVJZCwKKwkJCQkJCSAgICAgICBOb2RlQ21kT2JqZWN0LgorCQkJCQkJICAgICAgIG1fTm9kZUNvbW1hbmQpOworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfR0VUX0VWRU5UOgorCQl7CisJCQl0RXBsTGluRXZlbnQgRXZlbnQ7CisKKwkJCS8vIHNhdmUgZXZlbnQgc3RydWN0dXJlCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmRXZlbnQsIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKEV2ZW50KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gc2F2ZSByZXR1cm4gY29kZSBmcm9tIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwkJCVJldENiRXZlbnRfZyA9IEV2ZW50Lm1fUmV0Q2JFdmVudDsKKworCQkJaWYgKFJldENiRXZlbnRfZyA9PSBrRXBsU2h1dGRvd24pIHsKKwkJCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZCwgYnV0IHNpZ25hbCB0ZXJtaW5hdGlvbgorCQkJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywKKwkJCQkJICAgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCQkJCS8vIGV4aXQgd2l0aCBlcnJvciAtPiBFcGxBcGlQcm9jZXNzKCkgd2lsbCBsZWF2ZSB0aGUgaW5maW5pdGUgbG9vcAorCQkJCWlSZXQgPSAxOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIHBhc3MgY29udHJvbCB0byBldmVudCBxdWV1ZSBrZXJuZWwgdGhyZWFkCisJCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX0lPQ1RMKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKworCQkJLy8gZmFsbCBhc2xlZXAgaXRzZWxmIGluIG93biB3YWl0IHF1ZXVlCisJCQlpRXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKFdhaXRRdWV1ZVByb2Nlc3NfZywKKwkJCQkJCQkoYXRvbWljX3JlYWQKKwkJCQkJCQkgKCZBdG9taWNFdmVudFN0YXRlX2cpCisJCQkJCQkJID09IEVWRU5UX1NUQVRFX1JFQURZKQorCQkJCQkJCXx8CisJCQkJCQkJKGF0b21pY19yZWFkCisJCQkJCQkJICgmQXRvbWljRXZlbnRTdGF0ZV9nKQorCQkJCQkJCSA9PSBFVkVOVF9TVEFURV9URVJNKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CS8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbAorCQkJCS8vIHBhc3MgY29udHJvbCB0byBldmVudCBxdWV1ZSBrZXJuZWwgdGhyZWFkLCBidXQgc2lnbmFsIHRlcm1pbmF0aW9uCisJCQkJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLAorCQkJCQkgICBFVkVOVF9TVEFURV9URVJNKTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisJCQkJLy8gZXhpdCB3aXRoIHRoaXMgZXJyb3IgLT4gRXBsQXBpUHJvY2VzcygpIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gaUVycjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09IEVWRU5UX1NUQVRFX1RFUk0pIHsJLy8gdGVybWluYXRpb24gaW4gcHJvZ3Jlc3MKKwkJCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZCwgYnV0IHNpZ25hbCB0ZXJtaW5hdGlvbgorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKwkJCQkvLyBleGl0IHdpdGggdGhpcyBlcnJvciAtPiBFcGxBcGlQcm9jZXNzKCkgd2lsbCBsZWF2ZSB0aGUgaW5maW5pdGUgbG9vcAorCQkJCWlSZXQgPSAxOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGNvcHkgZXZlbnQgdG8gdXNlciBzcGFjZQorCQkJaUVyciA9CisJCQkgICAgY29weV90b191c2VyKEV2ZW50Lm1fcEV2ZW50VHlwZSwgJkV2ZW50VHlwZV9nLAorCQkJCQkgc2l6ZW9mKEV2ZW50VHlwZV9nKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CS8vIG5vdCBhbGwgZGF0YSBjb3VsZCBiZSBjb3BpZWQKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyAkJCQgZC5rLiBwZXJmb3JtIFNETyBldmVudCBwcm9jZXNzaW5nCisJCQlpZiAoRXZlbnRUeXBlX2cgPT0ga0VwbEFwaUV2ZW50U2RvKSB7CisJCQkJdm9pZCAqcERhdGE7CisJCQkJdEVwbExpblNkb0J1ZkhlYWRlciAqcEJ1ZkhlYWRlcjsKKworCQkJCXBCdWZIZWFkZXIgPQorCQkJCSAgICAodEVwbExpblNkb0J1ZkhlYWRlciAqKSBwRXZlbnRBcmdfZy0+bV9TZG8uCisJCQkJICAgIG1fcFVzZXJBcmc7CisJCQkJcERhdGEgPQorCQkJCSAgICBwQnVmSGVhZGVyICsgc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpOworCisJCQkJaWYgKHBFdmVudEFyZ19nLT5tX1Nkby5tX1Nkb0FjY2Vzc1R5cGUgPT0KKwkJCQkgICAga0VwbFNkb0FjY2Vzc1R5cGVSZWFkKSB7CisJCQkJCS8vIGNvcHkgcmVhZCBkYXRhIHRvIHVzZXIgc3BhY2UKKwkJCQkJaUVyciA9CisJCQkJCSAgICBjb3B5X3RvX3VzZXIocEJ1ZkhlYWRlci0+bV9wRGF0YSwKKwkJCQkJCQkgcERhdGEsCisJCQkJCQkJIHBFdmVudEFyZ19nLT5tX1Nkby4KKwkJCQkJCQkgbV91aVRyYW5zZmVycmVkQnl0ZSk7CisJCQkJCWlmIChpRXJyICE9IDApIHsJLy8gbm90IGFsbCBkYXRhIGNvdWxkIGJlIGNvcGllZAorCQkJCQkJaVJldCA9IC1FSU87CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJcEV2ZW50QXJnX2ctPm1fU2RvLm1fcFVzZXJBcmcgPQorCQkJCSAgICBwQnVmSGVhZGVyLT5tX3BVc2VyQXJnOworCQkJCXZmcmVlKHBCdWZIZWFkZXIpOworCQkJfQorCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X3RvX3VzZXIoRXZlbnQubV9wRXZlbnRBcmcsIHBFdmVudEFyZ19nLAorCQkJCQkgbWluKHNpemVvZih0RXBsQXBpRXZlbnRBcmcpLAorCQkJCQkgICAgIEV2ZW50Lm1fdWlFdmVudEFyZ1NpemUpKTsKKwkJCWlmIChpRXJyICE9IDApIHsJLy8gbm90IGFsbCBkYXRhIGNvdWxkIGJlIGNvcGllZAorCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIHJldHVybiB0byBFcGxBcGlQcm9jZXNzKCksIHdoaWNoIHdpbGwgY2FsbCB0aGUgYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorCQkJaVJldCA9IDA7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgRVBMTElOX0NNRF9QSV9TRVRVUDoKKwkJeworCQkJRXBsUmV0ID0gRXBsQXBpUHJvY2Vzc0ltYWdlU2V0dXAoKTsKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX1BJX0lOOgorCQl7CisJCQl0RXBsQXBpUHJvY2Vzc0ltYWdlIFByb2Nlc3NJbWFnZUluOworCisJCQkvLyBzYXZlIHByb2Nlc3MgaW1hZ2Ugc3RydWN0dXJlCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmUHJvY2Vzc0ltYWdlSW4sCisJCQkJCSAgIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKFByb2Nlc3NJbWFnZUluKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQKKwkJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9JT0NUTCk7CisKKwkJCS8vIGZhbGwgYXNsZWVwIGl0c2VsZiBpbiBvd24gd2FpdCBxdWV1ZQorCQkJaUVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVQSV9Jbl9nLAorCQkJCQkJCShhdG9taWNfcmVhZAorCQkJCQkJCSAoJkF0b21pY1N5bmNTdGF0ZV9nKSA9PQorCQkJCQkJCSBFVkVOVF9TVEFURV9SRUFEWSkKKwkJCQkJCQl8fAorCQkJCQkJCShhdG9taWNfcmVhZAorCQkJCQkJCSAoJkF0b21pY1N5bmNTdGF0ZV9nKSA9PQorCQkJCQkJCSBFVkVOVF9TVEFURV9URVJNKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CS8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbAorCQkJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywKKwkJCQkJICAgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYlN5bmNfZyk7CisJCQkJLy8gZXhpdCB3aXRoIHRoaXMgZXJyb3IgLT4gYXBwbGljYXRpb24gd2lsbCBsZWF2ZSB0aGUgaW5maW5pdGUgbG9vcAorCQkJCWlSZXQgPSBpRXJyOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJkF0b21pY1N5bmNTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9URVJNKSB7CS8vIHRlcm1pbmF0aW9uIGluIHByb2dyZXNzCisJCQkJLy8gcGFzcyBjb250cm9sIHRvIHN5bmMga2VybmVsIHRocmVhZCwgYnV0IHNpZ25hbCB0ZXJtaW5hdGlvbgorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JTeW5jX2cpOworCQkJCS8vIGV4aXQgd2l0aCB0aGlzIGVycm9yIC0+IGFwcGxpY2F0aW9uIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gMTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBleGNoYW5nZSBwcm9jZXNzIGltYWdlCisJCQlFcGxSZXQgPSBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZUluKCZQcm9jZXNzSW1hZ2VJbik7CisKKwkJCS8vIHJldHVybiB0byBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZUluKCkKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX1BJX09VVDoKKwkJeworCQkJdEVwbEFwaVByb2Nlc3NJbWFnZSBQcm9jZXNzSW1hZ2VPdXQ7CisKKwkJCS8vIHNhdmUgcHJvY2VzcyBpbWFnZSBzdHJ1Y3R1cmUKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfZnJvbV91c2VyKCZQcm9jZXNzSW1hZ2VPdXQsCisJCQkJCSAgIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKFByb2Nlc3NJbWFnZU91dCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKGF0b21pY19yZWFkKCZBdG9taWNTeW5jU3RhdGVfZykgIT0KKwkJCSAgICBFVkVOVF9TVEFURV9SRUFEWSkgeworCQkJCWlSZXQgPSAoaW50KWtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGV4Y2hhbmdlIHByb2Nlc3MgaW1hZ2UKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQoJlByb2Nlc3NJbWFnZU91dCk7CisKKwkJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQKKwkJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9URVJNKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JTeW5jX2cpOworCisJCQkvLyByZXR1cm4gdG8gRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VvdXQoKQorCQkJaVJldCA9IChpbnQpRXBsUmV0OworCisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfTk1UX0NPTU1BTkQ6CisJCXsKKwkJCS8vIGZvcndhcmQgTk1UIGNvbW1hbmQgdG8gRVBMIHN0YWNrCisJCQlFcGxSZXQgPSBFcGxBcGlFeGVjTm10Q29tbWFuZCgodEVwbE5tdEV2ZW50KSB1bEFyZ19wKTsKKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKworLy8gICAgVFJBQ0UxKCJFUEw6IC0gRXBsTGluSW9jdGwgKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMaW5DYkV2ZW50KHRFcGxBcGlFdmVudFR5cGUgRXZlbnRUeXBlX3AsCS8vIElOOiBldmVudCB0eXBlIChlbnVtKQorCQkJCXRFcGxBcGlFdmVudEFyZyAqIHBFdmVudEFyZ19wLAkvLyBJTjogZXZlbnQgYXJndW1lbnQgKHVuaW9uKQorCQkJCXZvaWQgR0VORVJJQyAqIHBVc2VyQXJnX3ApCit7CisJdEVwbEtlcm5lbCBFcGxSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlpbnQgaUVycjsKKworCS8vIGJsb2NrIGFueSBmdXJ0aGVyIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgaS5lLiBlbnRlciBjcml0aWNhbCBzZWN0aW9uCisJaUVyciA9IGRvd25faW50ZXJydXB0aWJsZSgmU2VtYXBob3JlQ2JFdmVudF9nKTsKKwlpZiAoaUVyciAhPSAwKSB7CS8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbAorCQlFcGxSZXQgPSBrRXBsU2h1dGRvd247CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gd2FpdCBmb3IgRXBsQXBpUHJvY2VzcygpIHRvIGNhbGwgaW9jdGwKKwkvLyBub3JtYWxseSBpdCBzaG91bGQgYmUgd2FpdGluZyBhbHJlYWR5IGZvciB1cyB0byBwYXNzIGEgbmV3IGV2ZW50CisJaUVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVDYkV2ZW50X2csCisJCQkJCShhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PQorCQkJCQkgRVZFTlRfU1RBVEVfSU9DVEwpCisJCQkJCXx8IChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PQorCQkJCQkgICAgRVZFTlRfU1RBVEVfVEVSTSkpOworCWlmICgoaUVyciAhPSAwKSB8fCAoYXRvbWljX3JlYWQoJkF0b21pY0V2ZW50U3RhdGVfZykgPT0gRVZFTlRfU1RBVEVfVEVSTSkpIHsJLy8gd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsCisJCUVwbFJldCA9IGtFcGxTaHV0ZG93bjsKKwkJZ290byBMZWF2ZUNyaXRpY2FsU2VjdGlvbjsKKwl9CisJLy8gc2F2ZSBldmVudCBpbmZvcm1hdGlvbiBmb3IgaW9jdGwKKwlFdmVudFR5cGVfZyA9IEV2ZW50VHlwZV9wOworCXBFdmVudEFyZ19nID0gcEV2ZW50QXJnX3A7CisKKwkvLyBwYXNzIGNvbnRyb2wgdG8gYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbiwgaS5lLiBFcGxBcGlQcm9jZXNzKCkKKwlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX1JFQURZKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZVByb2Nlc3NfZyk7CisKKwkvLyBub3csIHRoZSBhcHBsaWNhdGlvbidzIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgZXZlbnQKKworCS8vIHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbiwgaS5lLiBFcGxBcGlQcm9jZXNzKCkgY2FsbHMgaW9jdGwgYWdhaW4KKwlpRXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKFdhaXRRdWV1ZUNiRXZlbnRfZywKKwkJCQkJKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09CisJCQkJCSBFVkVOVF9TVEFURV9JT0NUTCkKKwkJCQkJfHwgKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09CisJCQkJCSAgICBFVkVOVF9TVEFURV9URVJNKSk7CisJaWYgKChpRXJyICE9IDApIHx8IChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9URVJNKSkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwKKwkJRXBsUmV0ID0ga0VwbFNodXRkb3duOworCQlnb3RvIExlYXZlQ3JpdGljYWxTZWN0aW9uOworCX0KKwkvLyByZWFkIHJldHVybiBjb2RlIGZyb20gYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorCUVwbFJldCA9IFJldENiRXZlbnRfZzsKKworICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb246CisJdXAoJlNlbWFwaG9yZUNiRXZlbnRfZyk7CisKKyAgICAgIEV4aXQ6CisJLy8gY2hlY2sgaWYgTk1UX0dTX09GRiBpcyByZWFjaGVkCisJaWYgKEV2ZW50VHlwZV9wID09IGtFcGxBcGlFdmVudE5tdFN0YXRlQ2hhbmdlKSB7CisJCWlmIChwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlID09IGtFcGxObXRHc09mZikgewkvLyBOTVQgc3RhdGUgbWFjaGluZSB3YXMgc2h1dCBkb3duCisJCQlUUkFDRTAoIkVQTDogICBFcGxMaW5DYkV2ZW50KE5NVF9HU19PRkYpXG4iKTsKKwkJCXVpRXBsU3RhdGVfZyA9IEVQTF9TVEFURV9TSFVURE9XTjsKKwkJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQl3YWtlX3VwKCZXYWl0UXVldWVSZWxlYXNlX2cpOworCQl9IGVsc2UgewkvLyBOTVQgc3RhdGUgbWFjaGluZSBpcyBydW5uaW5nCisJCQl1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfUlVOTklORzsKKwkJfQorCX0KKworCXJldHVybiBFcGxSZXQ7Cit9CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExpbkNiU3luYyh2b2lkKQoreworCXRFcGxLZXJuZWwgRXBsUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJaW50IGlFcnI7CisKKwkvLyBjaGVjayBpZiB1c2VyIHByb2Nlc3Mgd2FpdHMgZm9yIHN5bmMKKwlpZiAoYXRvbWljX3JlYWQoJkF0b21pY1N5bmNTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9JT0NUTCkgeworCQkvLyBwYXNzIGNvbnRyb2wgdG8gYXBwbGljYXRpb24sIGkuZS4gRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbigpCisJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9SRUFEWSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlUElfSW5fZyk7CisKKwkJLy8gbm93LCB0aGUgYXBwbGljYXRpb24gcHJvY2Vzc2VzIHRoZSBzeW5jIGV2ZW50CisKKwkJLy8gd2FpdCBmb3IgY2FsbCBvZiBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZU91dCgpCisJCWlFcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlQ2JTeW5jX2csCisJCQkJCQkoYXRvbWljX3JlYWQoJkF0b21pY1N5bmNTdGF0ZV9nKQorCQkJCQkJID09IEVWRU5UX1NUQVRFX0lPQ1RMKQorCQkJCQkJfHwKKwkJCQkJCShhdG9taWNfcmVhZCgmQXRvbWljU3luY1N0YXRlX2cpCisJCQkJCQkgPT0gRVZFTlRfU1RBVEVfVEVSTSkpOworCQlpZiAoKGlFcnIgIT0gMCkgfHwgKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09IEVWRU5UX1NUQVRFX0lPQ1RMKSkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3IgYXBwbGljYXRpb24gY2FsbGVkIHdyb25nIGZ1bmN0aW9uCisJCQlFcGxSZXQgPSBrRXBsU2h1dGRvd247CisJCX0KKwl9IGVsc2UgewkJLy8gYXBwbGljYXRpb24gaXMgY3VycmVudGx5IG5vdCB3YWl0aW5nIGZvciBzeW5jCisJCS8vIGNvbnRpbnVlIHdpdGhvdXQgaW50ZXJydXB0aW9uCisJCS8vIFRQRE8gYXJlIHNldCB2YWxpZCBieSBjYWxsZXIgKGkuZS4gRXBsRXZlbnRrUHJvY2VzcygpKQorCX0KKworCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEpOworCisJcmV0dXJuIEVwbFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaVByb2Nlc3NJbWFnZS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlQcm9jZXNzSW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjJmZGYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlQcm9jZXNzSW1hZ2UuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBFUEwgQVBJIG1vZHVsZSAocHJvY2VzcyBpbWFnZSkKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxBcGlQcm9jZXNzSW1hZ2UuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwOC8xMS8xMyAxNzoxMzowOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzEwLzEwIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbC5oIgorLy8jaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbEFwaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICgoRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwKSB8fCAoRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUID4gMCkpCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwCisJQllURSBtX2FiUHJvY2Vzc0ltYWdlSW5wdXRbRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU5dOworI2VuZGlmCisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUID4gMAorCUJZVEUgbV9hYlByb2Nlc3NJbWFnZU91dHB1dFtFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVRdOworI2VuZGlmCisKK30gdEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZSBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUHJvY2Vzc0ltYWdlU2V0dXAoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIHVwIHN0YXRpYyBwcm9jZXNzIGltYWdlCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0ltYWdlU2V0dXAodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmICgoRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwKSB8fCAoRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUID4gMCkpCisJdW5zaWduZWQgaW50IHVpVmFyRW50cmllczsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworI2VuZGlmCisKKyNpZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiA+IDAKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTjsKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTjsKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMSwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gMjsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMTAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJT2JkU2l6ZSA9IDI7CisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDExLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZUlucHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSA0OworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOIC8gT2JkU2l6ZTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAyMCwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gNDsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMjEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworI2VuZGlmCisKKyNpZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgPiAwCisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUOworCU9iZFNpemUgPSAxOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDMwLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQ7CisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMzEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSAyOworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwNDAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSAyOworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwNDEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSA0OworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwNTAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSA0OworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwNTEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbigpCisvLworLy8gRGVzY3JpcHRpb246IHJlcGxhY2VzIHBhc3NlZCBpbnB1dCBwcm9jZXNzIGltYWdlIHdpdGggdGhlIG9uZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBJX3AgICAgICAgICAgICAgICAgICAgPSBpbnB1dCBwcm9jZXNzIGltYWdlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlSW4odEVwbEFwaVByb2Nlc3NJbWFnZSAqIHBQSV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiA+IDAKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJY29weV90b191c2VyKHBQSV9wLT5tX3BJbWFnZSwKKwkJICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLm1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwKKwkJICAgICBtaW4ocFBJX3AtPm1fdWlTaXplLAorCQkJIHNpemVvZihFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJCW1fYWJQcm9jZXNzSW1hZ2VJbnB1dCkpKTsKKyNlbHNlCisJRVBMX01FTUNQWShwUElfcC0+bV9wSW1hZ2UsCisJCSAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cubV9hYlByb2Nlc3NJbWFnZUlucHV0LAorCQkgICBtaW4ocFBJX3AtPm1fdWlTaXplLAorCQkgICAgICAgc2l6ZW9mKEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQpKSk7CisjZW5kaWYKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjb3BpZXMgcGFzc2VkIG91dHB1dCBwcm9jZXNzIGltYWdlIHRvIEVQTCBzdGFjay4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBJX3AgICAgICAgICAgICAgICAgICAgPSBvdXRwdXQgcHJvY2VzcyBpbWFnZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZU91dCh0RXBsQXBpUHJvY2Vzc0ltYWdlICogcFBJX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCA+IDAKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJY29weV9mcm9tX3VzZXIoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy5tX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LAorCQkgICAgICAgcFBJX3AtPm1fcEltYWdlLAorCQkgICAgICAgbWluKHBQSV9wLT5tX3VpU2l6ZSwKKwkJCSAgIHNpemVvZihFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJCSAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCkpKTsKKyNlbHNlCisJRVBMX01FTUNQWShFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLm1fYWJQcm9jZXNzSW1hZ2VPdXRwdXQsCisJCSAgIHBQSV9wLT5tX3BJbWFnZSwKKwkJICAgbWluKHBQSV9wLT5tX3VpU2l6ZSwKKwkJICAgICAgIHNpemVvZihFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCkpKTsKKyNlbmRpZgorI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbENmZy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxDZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU5NThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxDZmcuaApAQCAtMCwwICsxLDE5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGNvbmZpZ3VyYXRpb24gZmlsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbENmZy5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICAuLi4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA2ICAgIGsudC46IFN0YXJ0IG9mIEltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTENGR19IXworI2RlZmluZSBfRVBMQ0ZHX0hfCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGdlbmVyaWMgZGVmaW5lcyB3aGljaCBmb3Igd2hvbGUgRVBMIFN0YWNrCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEVQTF9VU0VfREVMRVRFSU5TVF9GVU5DIFRSVUUKKworLy8gbmVlZGVkIHRvIHN1cHBvcnQgZGF0YXR5cGVzIG92ZXIgMzIgYml0IGJ5IGdsb2JhbC5oCisjZGVmaW5lIFVTRV9WQVI2NAorCisvLyBFUExfTUFYX0lOU1RBTkNFUyBzcGVjaWZpZXMgY291bnQgb2YgaW5zdGFuY2VzIG9mIGFsbCBFUEwgbW9kdWxlcy4KKy8vIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgYWxsCisvLyBmdW5jdGlvbnMgaXMgdGhlIGluc3RhbmNlIG51bWJlci4KKyNkZWZpbmUgRVBMX01BWF9JTlNUQU5DRVMgICAgICAgICAgICAgICAxCisKKy8vIFRoaXMgZGVmaW5lcyB0aGUgdGFyZ2V0IGhhcmR3YXJlLiBIZXJlIGlzIGVuY29kZWQgd2ljaCBDUFUgYW5kIHdpY2ggZXh0ZXJuYWwKKy8vIHBlcmlwaGVyYWxzIGFyZSBjb25uZWN0ZWQuIEZvciBwb3NzaWJsZSB2YWx1ZXMgcmVmZXJlIHRvIHRhcmdldC5oLiBJZgorLy8gbmVjZXNzYXJ5IHZhbHVlIGlzIG5vdCBhdmFpbGFibGUgRVBMIHN0YWNrIGhhcyB0bworLy8gYmUgYWRhcHRlZCBhbmQgdGVzdGVkLgorI2RlZmluZSBUQVJHRVRfSEFSRFdBUkUgICAgICAgICAgICAgICAgIFRHVEhXX1BDX1dSQVBQCisKKy8vIHVzZSBubyBGSUZPcywgbWFrZSBkaXJlY3QgY2FsbHMKKy8vI2RlZmluZSBFUExfTk9fRklGTworCisvLyB1c2Ugbm8gSVBDIGJldHdlZW4gdXNlci0gYW5kIGtlcm5lbHNwYWNlIG1vZHVsZXMsIG1ha2UgZGlyZWN0IGNhbGxzCisjZGVmaW5lIEVQTF9OT19VU0VSX0tFUk5FTAorCisjaWZuZGVmIEJFTkNITUFSS19NT0RVTEVTCisjZGVmaW5lIEJFTkNITUFSS19NT0RVTEVTICAgICAgIDAJLy8weEVFODAwMDQyTAorI2VuZGlmCisKKy8vIERlZmF1bHQgZGVmdWcgbGV2ZWw6CisvLyBPbmx5IGRlYnVnIHRyYWNlcyBvZiB0aGVzZSBtb2R1bGVzIHdpbGwgYmUgY29tcGlsZWQgd2hpY2ggZmxhZ3MgYXJlIHNldCBpbiBkZWZpbmUgREVGX0RFQlVHX0xWTC4KKyNpZm5kZWYgREVGX0RFQlVHX0xWTAorI2RlZmluZSBERUZfREVCVUdfTFZMICAgICAgICAgICAweEVDMDAwMDAwTAorI2VuZGlmCisvLyAgIEVQTF9EQkdMVkxfT0JEICAgICAgICAgPSAgIDB4MDAwMDAwMDRMCisvLyAqIEVQTF9EQkdMVkxfQVNTRVJUICAgICAgPSAgIDB4MjAwMDAwMDBMCisvLyAqIEVQTF9EQkdMVkxfRVJST1IgICAgICAgPSAgIDB4NDAwMDAwMDBMCisvLyAqIEVQTF9EQkdMVkxfQUxXQVlTICAgICAgPSAgIDB4ODAwMDAwMDBMCisKKy8vIEVQTF9NT0RVTEVfSU5URUdSQVRJT04gZGVmaW5lcyBhbGwgbW9kdWxlcyB3aGljaCBhcmUgaW5jbHVkZWQgaW4KKy8vIEVQTCBhcHBsaWNhdGlvbi4gUGxlYXNlIGFkZCBvciBkZWxldGUgbW9kdWxlcyBmb3IgeW91ciBhcHBsaWNhdGlvbi4KKyNkZWZpbmUgRVBMX01PRFVMRV9JTlRFR1JBVElPTiBFUExfTU9EVUxFX09CREsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9QRE9LIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfTk1UX01OIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfU0RPUyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX1NET0MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9TRE9fQVNORCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX1NET19VRFAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9OTVRfQ04gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9OTVRVIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfTk1USyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX0RMTEsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9ETExVIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfVkVUSAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX09CRFUKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRVBMIGV0aGVybmV0IGRyaXZlciAoRWRydikgc3BlY2lmaWMgZGVmaW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBzd2l0Y2ggdGhpcyBkZWZpbmUgdG8gVFJVRSBpZiBFZHJ2IHN1cHBvcnRzIGZhc3QgdHggZnJhbWVzCisjZGVmaW5lIEVEUlZfRkFTVF9UWEZSQU1FUyAgICAgICAgICAgICAgRkFMU0UKKy8vI2RlZmluZSBFRFJWX0ZBU1RfVFhGUkFNRVMgICAgICAgICAgICAgIFRSVUUKKworLy8gc3dpdGNoIHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgRWRydiBzdXBwb3J0cyBlYXJseSByZWNlaXZlIGludGVycnVwdHMKKyNkZWZpbmUgRURSVl9FQVJMWV9SWF9JTlQgICAgICAgICAgICAgICBGQUxTRQorLy8jZGVmaW5lIEVEUlZfRUFSTFlfUlhfSU5UICAgICAgICAgICAgICAgVFJVRQorCisvLyBlbmFibGVzIHNldHRpbmcgb2Ygc2V2ZXJhbCBwb3J0IHBpbnMgZm9yIGJlbmNobWFya2luZyBwdXJwb3NlcworI2RlZmluZSBFRFJWX0JFTkNITUFSSyAgICAgICAgICAgICAgICAgIEZBTFNFCisvLyNkZWZpbmUgRURSVl9CRU5DSE1BUksgICAgICAgICAgICAgICAgICBUUlVFIC8vIE1DRl9HUElPX1BPRFJfUENJQlIKKworLy8gQ2FsbCBUeCBoYW5kbGVyIChpLmUuIEVwbERsbENiRnJhbWVUcmFuc21pdHRlZCgpKSBhbHJlYWR5IGlmIERNQSBoYXMgZmluaXNoZWQsCisvLyBvdGhlcndpc2UgY2FsbCB0aGUgVHggaGFuZGxlciBpZiBmcmFtZSB3YXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgb3ZlciBldGhlcm5ldC4KKyNkZWZpbmUgRURSVl9ETUFfVFhfSEFORExFUiAgICAgICAgICAgICBGQUxTRQorLy8jZGVmaW5lIEVEUlZfRE1BX1RYX0hBTkRMRVIgICAgICAgICAgICAgVFJVRQorCisvLyBudW1iZXIgb2YgdXNlZCBldGhlcm5ldCBjb250cm9sbGVyCisvLyNkZWZpbmUgRURSVl9VU0VEX0VUSF9DVFJMICAgICAgICAgICAgICAxCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERhdGEgTGluayBMYXllciAoRExMKSBzcGVjaWZpYyBkZWZpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHN3aXRjaCB0aGlzIGRlZmluZSB0byBUUlVFIGlmIEVkcnYgc3VwcG9ydHMgZmFzdCB0eCBmcmFtZXMKKy8vIGFuZCBETEwgc2hhbGwgcGFzcyBQUmVzIGFzIHJlYWR5IHRvIEVkcnYgYWZ0ZXIgU29DCisjZGVmaW5lIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgICAgRkFMU0UKKy8vI2RlZmluZSBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICAgIFRSVUUKKworLy8gc3dpdGNoIHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgRWRydiBzdXBwb3J0cyBmYXN0IHR4IGZyYW1lcworLy8gYW5kIERMTCBzaGFsbCBwYXNzIFBSZXMgYXMgcmVhZHkgdG8gRWRydiBhZnRlciBTb0EKKyNkZWZpbmUgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAgICBGQUxTRQorLy8jZGVmaW5lIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgICAgVFJVRQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBPQkQgc3BlY2lmaWMgZGVmaW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBzd2l0Y2ggdGhpcyBkZWZpbmUgdG8gVFJVRSBpZiBFcGwgc2hvdWxkIGNvbXBhcmUgb2JqZWN0IHJhbmdlCisvLyBhdXRvbWF0aWNseQorI2RlZmluZSBFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAgICAgICAgICBGQUxTRQorLy8jZGVmaW5lIEVQTF9PQkRfQ0hFQ0tfT0JKRUNUX1JBTkdFICAgICAgICAgIFRSVUUKKworLy8gc2V0IHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgdGhlcmUgYXJlIHN0cmluZ3Mgb3IgZG9tYWlucyBpbiBPRCwgd2hpY2gKKy8vIG1heSBiZSBjaGFuZ2VkIGluIG9iamVjdCBzaXplIGFuZC9vciBvYmplY3QgZGF0YSBwb2ludGVyIGJ5IGl0cyBvYmplY3QKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIChjYWxsZWQgZXZlbnQga09iZEV2V3JTdHJpbmdEb21haW4pCisvLyNkZWZpbmUgRVBMX09CRF9VU0VfU1RSSU5HX0RPTUFJTl9JTl9SQU0gICAgRkFMU0UKKyNkZWZpbmUgRVBMX09CRF9VU0VfU1RSSU5HX0RPTUFJTl9JTl9SQU0gICAgVFJVRQorCisjZGVmaW5lIEVQTF9PQkRfVVNFX1ZBUklBQkxFX1NVQklOREVYX1RBQiBUUlVFCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRpbWVyIG1vZHVsZSBzcGVjaWZpYyBkZWZpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIGlmIFRSVUUgaXQgdXNlcyB0aGUgVGltZXIgbW9kdWxlIGltcGxlbWVudGF0aW9uIG9mIEVQTCB1c2VyIGFsc28gaW4gRVBMIGtlcm5lbAorI2RlZmluZSBFUExfVElNRVJfVVNFX1VTRVIgICAgICAgICAgICAgIFRSVUUKKworLy8gaWYgVFJVRSB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZSB3aWxsIGJlIHVzZWQKKyNkZWZpbmUgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICAgICAgICAgICAgICBUUlVFCisvLyNkZWZpbmUgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICAgICAgICAgICAgICBGQUxTRQorCisjZW5kaWYgLy9fRVBMQ0ZHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERlZi5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGM4MTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEZWYuaApAQCAtMCwwICsxLDM1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRVBMIGRlZmF1bHQgY29uc3RhbnRzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGVmLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjE1ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfREVGX0hfCisjZGVmaW5lIF9FUExfREVGX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9DX0FEUl9CUk9BRENBU1QgICAgICAgICAweEZGCS8vIEVQTCBicm9hZGNhc3QgYWRkcmVzcworI2RlZmluZSBFUExfQ19BRFJfRElBR19ERUZfTk9ERV9JRCAgMHhGRAkvLyBFUEwgZGVmYXVsdCBhZGRyZXNzIG9mIGRpZ25vc3RpYyBkZXZpY2UKKyNkZWZpbmUgRVBMX0NfQURSX0RVTU1ZX05PREVfSUQgICAgIDB4RkMJLy8gRVBMIGR1bW15IG5vZGUgYWRkcmVzcworI2RlZmluZSBFUExfQ19BRFJfSU5WQUxJRCAgICAgICAgICAgMHgwMAkvLyBpbnZhbGlkIEVQTCBhZGRyZXNzCisjZGVmaW5lIEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCAgICAweEYwCS8vIEVQTCBkZWZhdWx0IGFkZHJlc3Mgb2YgTU4KKyNkZWZpbmUgRVBMX0NfQURSX1JUMV9ERUZfTk9ERV9JRCAgIDB4RkUJLy8gRVBMIGRlZmF1bHQgYWRkcmVzcyBvZiByb3V0ZXIgdHlwZSAxCisjZGVmaW5lIEVQTF9DX0RMTF9BU05EX1BSSU9fTk1UUlFTVCA3CS8vIGluY3JlYXNlZCBBU25kIHJlcXVlc3QgcHJpb3JpdHkgdG8gYmUgdXNlZCBieSBOTVQgUmVxdWVzdHMKKyNkZWZpbmUgRVBMX0NfRExMX0FTTkRfUFJJT19TVEQgICAgIDAJLy8gc3RhbmRhcmQgQVNuZCByZXF1ZXN0IHByaW9yaXR5CisjZGVmaW5lIEVQTF9DX0RMTF9FVEhFUlRZUEVfRVBMICAgICAweDg4QUIKKyNkZWZpbmUgRVBMX0NfRExMX0lTT0NIUl9NQVhfUEFZTCAgIDE0OTAJLy8gQnl0ZTogbWF4aW11bSBzaXplIG9mIFBSZXEgYW5kIFBSZXMgcGF5bG9hZCBkYXRhLCByZXF1aXJlcyBDX0lQX01BWF9NVFUKKyNkZWZpbmUgRVBMX0NfRExMX01BWF9BU1lOQ19NVFUgICAgIDE1MDAJLy8gQnl0ZTogbWF4aW11bSBhc3luY2hyb25vdXMgcGF5bG9hZCBpbiBieXRlcworI2RlZmluZSBFUExfQ19ETExfTUFYX1BBWUxfT0ZGU0VUICAgMTQ5OQkvLyBCeXRlOiBtYXhpbXVtIG9mZnNldCBvZiBFdGhlcm5ldCBmcmFtZSBwYXlsb2FkLCByZXF1aXJlcyBDX0lQX01BWF9NVFUKKyNkZWZpbmUgRVBMX0NfRExMX01BWF9SUyAgICAgICAgICAgIDcKKyNkZWZpbmUgRVBMX0NfRExMX01JTl9BU1lOQ19NVFUgICAgIDI4MgkvLyBCeXRlOiBtaW5pbXVtIGFzeW5jaHJvbm91cyBwYXlsb2FkIGluIGJ5dGVzLgorI2RlZmluZSBFUExfQ19ETExfTUlOX1BBWUxfT0ZGU0VUICAgNDUJLy8gQnl0ZTogbWluaW11bSBvZmZzZXQgb2YgRXRoZXJuZXQgZnJhbWUgcGF5bG9hZAorI2RlZmluZSBFUExfQ19ETExfTVVMVElDQVNUX0FTTkQgICAgMHgwMTExMUUwMDAwMDRMTAkvLyBFUEwgQVNuZCBtdWx0aWNhc3QgTUFDIGFkZHJlc3MsIGNhbm9uaWNhbCBmb3JtCisjZGVmaW5lIEVQTF9DX0RMTF9NVUxUSUNBU1RfUFJFUyAgICAweDAxMTExRTAwMDAwMkxMCS8vIEVQTCBQUmVzIG11bHRpY2FzdCBNQUMgYWRkcmVzcywgY2Fub25pY2FsIGZvcm0KKyNkZWZpbmUgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0EgICAgIDB4MDExMTFFMDAwMDAzTEwJLy8gRVBMIFNvQSBtdWx0aWNhc3QgTUFDIGFkZHJlc3MsIGNhbm9uaWNhbCBmb3JtCisjZGVmaW5lIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09DICAgICAweDAxMTExRTAwMDAwMUxMCS8vIEVQTCBTb2MgbXVsdGljYXN0IE1BQyBhZGRyZXNzLCBjYW5vbmljYWwgZm9ybQorI2RlZmluZSBFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUyAxMAkvLyBudW1iZXIgb2YgdW5hc3NpZ25pbmcgU29BIGZyYW1lcyBhdCBzdGFydCBvZiBOTVRfTVNfUFJFX09QRVJBVElPTkFMXzEKKyNkZWZpbmUgRVBMX0NfRExMX1RfQklUVElNRSAgICAgICAgIDEwCS8vIG5zOiBUcmFuc21pc3Npb24gdGltZSBwZXIgYml0IG9uIDEwMCBNYml0L3MgbmV0d29yaworI2RlZmluZSBFUExfQ19ETExfVF9FUExfUERPX0hFQURFUiAgMTAJLy8gQnl0ZTogc2l6ZSBvZiBQUmVxIGFuZCBQUmVzIEVQTCBQRE8gbWVzc2FnZSBoZWFkZXIKKyNkZWZpbmUgRVBMX0NfRExMX1RfRVRIMl9XUkFQUEVSICAgIDE4CS8vIEJ5dGU6IHNpemUgb2YgRXRoZXJuZXQgdHlwZSBJSSB3cmFwcGVyIGNvbnNpc3Rpbmcgb2YgaGVhZGVyIGFuZCBjaGVja3N1bQorI2RlZmluZSBFUExfQ19ETExfVF9JRkcgICAgICAgICAgICAgNjQwCS8vIG5zOiBFdGhlcm5ldCBJbnRlcmZyYW1lIEdhcAorI2RlZmluZSBFUExfQ19ETExfVF9NSU5fRlJBTUUgICAgICAgNTEyMAkvLyBuczogU2l6ZSBvZiBtaW5pbXVtIEV0aGVybmV0IGZyYW1lICh3aXRob3V0IHByZWFtYmxlKQorI2RlZmluZSBFUExfQ19ETExfVF9QUkVBTUJMRSAgICAgICAgOTYwCS8vIG5zOiBTaXplIG9mIEV0aGVybmV0IGZyYW1lIHByZWFtYmxlCisKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfU09DICAgICAgIDM2CS8vIG1pbmltdW0gc2l6ZSBvZiBTb0Mgd2l0aG91dCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfUFJFUSAgICAgIDYwCS8vIG1pbmltdW0gc2l6ZSBvZiBQUmVjIHdpdGhvdXQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX1BSRVMgICAgICA2MAkvLyBtaW5pbXVtIHNpemUgb2YgUFJlcyB3aXRob3V0IENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9TT0EgICAgICAgMjQJLy8gbWluaW11bSBzaXplIG9mIFNvQSB3aXRob3V0IHBhZGRpbmcgYW5kIENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9JREVOVFJFUyAgMTc2CS8vIG1pbmltdW0gc2l6ZSBvZiBJZGVudFJlc3BvbnNlIHdpdGhvdXQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX1NUQVRVU1JFUyA3MgkvLyBtaW5pbXVtIHNpemUgb2YgU3RhdHVzUmVzcG9uc2Ugd2l0aG91dCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfTk1UQ01EICAgIDIwCS8vIG1pbmltdW0gc2l6ZSBvZiBObXRDb21tYW5kIHdpdGhvdXQgQ29tbWFuZERhdGEsIHBhZGRpbmcgYW5kIENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9OTVRDTURFWFQgNTIJLy8gbWluaW11bSBzaXplIG9mIE5tdENvbW1hbmQgd2l0aG91dCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfTk1UUkVRICAgIDIwCS8vIG1pbmltdW0gc2l6ZSBvZiBObXRSZXF1ZXN0IHdpdGhvdXQgQ29tbWFuZERhdGEsIHBhZGRpbmcgYW5kIENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9OTVRSRVFFWFQgNTIJLy8gbWluaW11bSBzaXplIG9mIE5tdFJlcXVlc3Qgd2l0aG91dCBwYWRkaW5nIGFuZCBDUkMKKworI2RlZmluZSBFUExfQ19FUlJfTU9OSVRPUl9ERUxBWSAgICAgMTAJLy8gRXJyb3IgbW9uaXRvcmluZyBzdGFydCBkZWxheSAobm90IHVzZWQgaW4gRFMgMS4wLjApCisjZGVmaW5lIEVQTF9DX0lQX0FEUl9JTlZBTElEICAgICAgICAweDAwMDAwMDAwTAkvLyBpbnZhbGlkIElQIGFkZHJlc3MgKDAuMC4wLjApIHVzZWQgdG8gaW5kaWNhdGUgbm8gY2hhbmdlCisjZGVmaW5lIEVQTF9DX0lQX0lOVkFMSURfTVRVICAgICAgICAwCS8vIEJ5dGU6IGludmFsaWQgTVRVIHNpemUgdXNlZCB0byBpbmRpY2F0ZSBubyBjaGFuZ2UKKyNkZWZpbmUgRVBMX0NfSVBfTUFYX01UVSAgICAgICAgICAgIDE1MTgJLy8gQnl0ZTogbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBJUCBzdGFjayB3aGljaCBtdXN0IGJlIHByb2Nlc3NlZC4KKyNkZWZpbmUgRVBMX0NfSVBfTUlOX01UVSAgICAgICAgICAgIDMwMAkvLyBCeXRlOiBtaW5pbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIElQIHN0YWNrIHdoaWNoIG11c3QgYmUgcHJvY2Vzc2VkLgorI2RlZmluZSBFUExfQ19OTVRfU1RBVEVfVE9MRVJBTkNFICAgNQkvLyBDeWNsZXM6IG1heGltdW0gcmVhY3Rpb24gdGltZSB0byBOTVQgc3RhdGUgY29tbWFuZHMKKyNkZWZpbmUgRVBMX0NfTk1UX1NUQVRSRVFfQ1lDTEUgICAgIDUJLy8gc2VjOiBTdGF0dXNSZXF1ZXN0IGN5Y2xlIHRpbWUgdG8gYmUgYXBwbGllZCB0byBBc3luY09ubHkgQ05zCisjZGVmaW5lIEVQTF9DX1NET19FUExfUE9SVCAgICAgICAgICAzODE5CisKKyNkZWZpbmUgRVBMX0NfRExMX01BWF9BU05EX1NFUlZJQ0VfSURTICA1CS8vIHNlZSB0RXBsRGxsQXNuZFNlcnZpY2VJZCBpbiBFcGxEbGwuaAorCisvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBFUExfRF9QRE9fR3JhbnVsYXJpdHlfVTgKKyNkZWZpbmUgRVBMX0RfUERPX0dyYW51bGFyaXR5X1U4ICAgIDgJLy8gbWluaW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgbWFwcGVkIGluIGJpdHMgVU5TSUdORUQ4IE8gTyAxIDEKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9OTVRfTUFYX05PREVfSUQKKyNkZWZpbmUgRVBMX05NVF9NQVhfTk9ERV9JRCAgICAgICAgIDI1NAkvLyBtYXhpbXVtIG5vZGUtSUQKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9EX05NVF9NYXhDTk51bWJlcl9VOAorI2RlZmluZSBFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTggICAgMjM5CS8vIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCByZWd1bGFyIENOcyBpbiB0aGUgTm9kZSBJRCByYW5nZSAxIC4uIDIzOSBVTlNJR05FRDggTyBPIDIzOSAyMzkKKyNlbmRpZgorCisvLyBkZWZpbmVzIGZvciBFUEwgQVBJIGxheWVyIHN0YXRpYyBwcm9jZXNzIGltYWdlCisjaWZuZGVmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOCisjZGVmaW5lIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOICAgMAorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUCisjZGVmaW5lIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAgMAorI2VuZGlmCisKKy8vIGNvbmZpZ3VyZSB3aGV0aGVyIE9EIGFjY2VzcyBldmVudHMgc2hhbGwgYmUgZm9yd2FyZGVkCisvLyB0byB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorLy8gQmVjYXVzZSBvZiByZWVudHJhbmN5IGZvciBsb2NhbCBPRCBhY2Nlc3NlcywgdGhpcyBoYXMgdG8gYmUgZGlzYWJsZWQKKy8vIHdoZW4gYXBwbGljYXRpb24gcmVzaWRlcyBpbiBvdGhlciBhZGRyZXNzIHNwYWNlIGFzIHRoZSBzdGFjayAoZS5nLiBpZgorLy8gRXBsQXBpTGludXhVc2VyLmMgYW5kIEVwbEFwaUxpbnV4S2VybmVsLmMgYXJlIHVzZWQpCisjaWZuZGVmIEVQTF9BUElfT0JEX0ZPUldBUkRfRVZFTlQKKyNkZWZpbmUgRVBMX0FQSV9PQkRfRk9SV0FSRF9FVkVOVCAgICAgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX01BWF9TVFJJTkdfU0laRQorI2RlZmluZSBFUExfT0JEX01BWF9TVFJJTkdfU0laRSAgICAgICAgMzIJLy8gaXMgdXNlZCBmb3Igb2JqZWN0cyAweDEwMDgvMHgxMDA5LzB4MTAwQQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRQorI2RlZmluZSBFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICAgICAgIEZBTFNFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRQorI2RlZmluZSBFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAgICAgIFRSVUUKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNCisjZGVmaW5lIEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNICAgIFRSVUUKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9PQkRfVVNFX1ZBUklBQkxFX1NVQklOREVYX1RBQgorI2RlZmluZSBFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX1VTRV9LRVJORUwKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSA9PSAwKQorI2RlZmluZSBFUExfT0JEX1VTRV9LRVJORUwgICAgICAgICAgICAgICAgICBUUlVFCisjZWxzZQorI2RlZmluZSBFUExfT0JEX1VTRV9LRVJORUwgICAgICAgICAgICAgICAgICBGQUxTRQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX0lOQ0xVREVfQTAwMF9UT19ERVZJQ0VfUEFSVAorI2RlZmluZSBFUExfT0JEX0lOQ0xVREVfQTAwMF9UT19ERVZJQ0VfUEFSVCBGQUxTRQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX1ZFVEhfTkFNRQorI2RlZmluZSBFUExfVkVUSF9OQU1FICAgICAgICJlcGwiCS8vIG5hbWUgb2YgbmV0IGRldmljZSBpbiBMaW51eAorI2VuZGlmCisKKy8qCisjZGVmaW5lIEVQTF9EX0NGR19Db25maWdNYW5hZ2VyX0JPT0wgLy8gQWJpbGl0eSBvZiBhIE1OIG5vZGUgdG8gcGVyZm9ybSBDb25maWd1cmF0aW9uIE1hbmFnZXIgZnVuY3Rpb25zIEJPT0xFQU4gTyAtIE4gLQorI2RlZmluZSBFUExfRF9DRk1fVmVyaWZ5Q29uZl9CT09MICAgLy8gU3VwcG9ydCBvZiBvYmplY3RzIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQywgQ0ZNX0V4cENvbmZEYXRlTGlzdF9BVTMyLCBDRk1fRXhwQ29uZlRpbWVMaXN0X0FVMzIgQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX0NGTV9WZXJpZnlDb25mSWRfQk9PTCAvLyBTdXBwb3J0IG9mIG9iamVjdHMgQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZJZF9VMzIgYW5kIENGTV9FeHBDb25mSWRMaXN0X0FVMzIgQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX0RMTF9DTkZlYXR1cmVJc29jaHJfQk9PTCAvLyBDTpJzIGFiaWxpdHkgdG8gcGVyZm9ybSBpc29jaHJvbm91cyBmdW5jdGlvbnMgQk9PTEVBTiAtIE8gLSBZCisjZGVmaW5lIEVQTF9EX0RMTF9DTkZlYXR1cmVNdWx0aXBsZXhfQk9PTCAvLyBub2RlknMgYWJpbGl0eSB0byBwZXJmb3JtIGNvbnRyb2wgb2YgbXVsdGlwbGV4ZWQgaXNvY2hyb25vdXMgY29tbXVuaWNhdGlvbiBCT09MRUFOIC0gTyAtIE4KKyNkZWZpbmUgRVBMX0RfRExMX0ZlYXR1cmVDTl9CT09MIC8vIG5vZGWScyBhYmlsaXR5IHRvIHBlcmZvcm0gQ04gZnVuY3Rpb25zIEJPT0xFQU4gTyBPIFkgWQorI2RlZmluZSBFUExfRF9ETExfRmVhdHVyZU1OX0JPT0wgLy8gbm9kZZJzIGFiaWxpdHkgdG8gcGVyZm9ybSBNTiBmdW5jdGlvbnMgQk9PTEVBTiBNIE8gLSBOCisjZGVmaW5lIEVQTF9EX0RMTF9NTkZlYXR1cmVNdWx0aXBsZXhfQk9PTCAvLyBNTpJzIGFiaWxpdHkgdG8gcGVyZm9ybSBjb250cm9sIG9mIG11bHRpcGxleGVkIGlzb2Nocm9ub3VzIGNvbW11bmljYXRpb24gQk9PTEVBTiBPIC0gWSAtCisjZGVmaW5lIEVQTF9EX0RMTF9NTkZlYXR1cmVQUmVzVHhfQk9PTCAvLyBNTpJzIGFiaWxpdHkgdG8gdHJhbnNtaXQgUFJlcyBCT09MRUFOIE8gLSBZIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0FTbmRSeE1heFBheWxvYWRfVTE2IC8vIHNpemUgb2YgQVNuZCBmcmFtZSByZWNlaXZlIGJ1ZmZlciBVTlNJR05FRDE2IE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0FTbmRUeE1heFBheWxvYWRfVTE2IC8vIHNpemUgb2YgQVNuZCBmcmFtZSB0cmFuc21pdCBidWZmZXIgVU5TSUdORUQxNiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9DTkFTbmQyU29DX1UzMiAvLyBtaW5pbXVtIGRlbGF5IGJldHdlZW4gZW5kIG9mIHJlY2VwdGlvbiBvZiBBU25kIGFuZCBzdGFydCBvZiByZWNlcHRpb24gb2YgU29DIFVOU0lHTkVEMzIgLSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfQ05BU25kTWF4TGF0ZW5jeV9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgU29BIHJlY2VwdGlvbiBhbmQgc3RhcnQgb2YgQVNuZCB0cmFuc21pc3Npb24gVU5TSUdORUQzMiAtIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9DTlBSZXNNYXhMYXRlbmN5X1UzMiAvLyBkZWxheSBiZXR3ZWVuIGVuZCBvZiBQUmVxIHJlY2VwdGlvbiBhbmQgc3RhcnQgb2YgUFJlcyB0cmFuc21pc3Npb24gVU5TSUdORUQzMiAtIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9DTlNvQzJQUmVxX1UzMiAvLyBDTiBTb0MgaGFuZGxpbmcgbWF4aW11bSB0aW1lLCBhIHN1YnNlcXVlbnQgUFJlcSB3b26SdCBiZSBoYW5kbGVkIGJlZm9yZSBTb0MgaGFuZGxpbmcgd2FzIGZpbmlzaGVkIFVOU0lHTkVEMzIgLSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfRGV2aWNlVHlwZV9VMzIgLy8gRGV2aWNlIFR5cGUgSUQgVU5TSUdORUQzMiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9FUExWZXJzX1U4IEVQTCAvLyBWZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoZSBkZXZpY2UgVU5TSUdORUQ4IE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0V4dFN0YXRlQ21kX0JPT0wgLy8gYWJpdGlsdHkgdG8gc3VwcG9ydCBFeHRlbmRlZCBOTVQgU3RhdGUgQ29tbWFuZHMgQk9PTEVBTiBPIE8gWSBZCisjZGVmaW5lIEVQTF9EX05NVF9JbmZvU3ZjX0JPT0wgLy8gYWJpbGl0eSB0byBzdXBwb3J0IE5NVCBJbmZvIFNlcnZpY2VzIEJPT0xFQU4gTyAtIFkgLQorI2RlZmluZSBFUExfRF9OTVRfSW50ZXJmYWNlQWRkcl9YaF9PU1RSIC8vIFBoeXNpY2FsIEFkZHJlc3Mgb2YgSW50ZXJmYWNlIE5vLiBYaCBPQ1RFVF9TVFJJTkcgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfSW50ZXJmYWNlRGVzY3JfWGhfVlNUUiAvLyBEZXNjcmlwdGlvbiB0ZXh0IG9mIEludGVyZmFjZSBOby4gWGggVklTSUJMRV9TVFJJTkdNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9JbnRlcmZhY2VNdHVfWGhfVTMyIC8vIE1UVSBvZiBJbnRlcmZhY2UgTm8uIFhoIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfSW50ZXJmYWNlVHlwZV9YaF9VOCAvLyBUeXBlIG9mIEludGVyZmFjZSBOby4gWGggVU5TSUdORUQ4IE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0lzb2NoclJ4TWF4UGF5bG9hZF9VMTYgLy8gc2l6ZSBvZiBpc29jaHJvbm91cyBmcmFtZSByZWNlaXZlIGJ1ZmZlciBVTlNJR05FRDE2IE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0lzb2NoclR4TWF4UGF5bG9hZF9VMTYgLy8gc2l6ZSBvZiBpc29jaHJvbm91cyBmcmFtZSB0cmFuc21pdCBidWZmZXIgVU5TSUdORUQxNiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NYW51ZmFjdERldk5hbWVfVlMgLy8gTWFudWZhY3R1cmVyIERldmljZSBOYW1lIFZJU0lCTEVfU1RSSU5HIE8gTyAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01hbnVmYWN0SHdWZXJzX1ZTIC8vIE1hbnVmYWN0dXJlciBIVyB2ZXJzaW9uIFZJU0lCTEVfU1RSSU5HIE8gTyAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01hbnVmYWN0U3dWZXJzX1ZTIC8vIE1hbnVmYWN0dXJlciBTVyB2ZXJzaW9uIFZJU0lCTEVfU1RSSU5HIE8gTyAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01heENOTm9kZUlEX1U4IC8vIG1heGltdW0gTm9kZSBJRCBhdmFpbGFibGUgZm9yIHJlZ3VsYXIgQ05zIHRoZSBlbnRyeSBwcm92aWRlcyBhbiB1cHBlciBsaW1pdCB0byB0aGUgTm9kZUlEIGF2YWlsYWJsZSBmb3IgY3Jvc3MgdHJhZmZpYyBQRE8gcmVjZXB0aW9uIGZyb20gYSByZWd1bGFyIENOIFVOU0lHTkVEOCBPIE8gMjM5IDIzOQorI2RlZmluZSBFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTggLy8gbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIHJlZ3VsYXIgQ05zIGluIHRoZSBOb2RlIElEIHJhbmdlIDEgLi4gMjM5IFVOU0lHTkVEOCBPIE8gMjM5IDIzOQorI2RlZmluZSBFUExfRF9OTVRfTWF4SGVhcnRiZWF0c19VOCAvLyBudW1iZXIgb2YgZ3VhcmQgY2hhbm5lbHMgVU5TSUdORUQ4IE8gTyAyNTQgMjU0CisjZGVmaW5lIEVQTF9EX05NVF9NTkFTbmQyU29DX1UzMiAvLyBtaW5pbXVtIGRlbGF5IGJldHdlZW4gZW5kIG9mIHJlY2VwdGlvbiBvZiBBU25kIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgU29DIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTU5NdWx0aXBsQ3ljTWF4X1U4IC8vIG1heGltdW0gbnVtYmVyIG9mIEVQTCBjeWNsZXMgcGVyIG11bHRpcGxleGVkIGN5Y2xlIFVOU0lHTkVEOCBPIC0gMCAtCisjZGVmaW5lIEVQTF9EX05NVF9NTlBSZXMyUFJlcV9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgUFJlcyByZWNlcHRpb24gYW5kIHN0YXJ0IG9mIFBSZXEgdHJhbnNtaXNzaW9uIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTU5QUmVzMlBSZXNfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIHJlY2VwdGlvbiBvZiBQUmVzIGZyb20gQ05uIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgUFJlcyBieSBNTiBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OUFJlc1J4MlNvQV9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgcmVjZXB0aW9uIG9mIFBSZXMgZnJvbSBDTm4gYW5kIHN0YXJ0IG9mIHRyYW5zbWlzc2lvbiBvZiBTb0EgYnkgTU4gVU5TSUdORUQzMiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NTlBSZXNUeDJTb0FfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIFBSZXMgdHJhbnNtaXNzaW9uIGJ5IE1OIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgU29BIGJ5IE1OIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTU5Tb0EyQVNuZFR4X1UzMiAvLyBkZWxheSBiZXR3ZWVuIGVuZCBvZiB0cmFuc21pc3Npb24gb2YgU29BIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgQVNuZCBieSBNTiBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OU29DMlBSZXFfVTMyIC8vIE1OIG1pbmltdW0gZGVsYXkgYmV0d2VlbiBlbmQgb2YgU29DIHRyYW5zbWlzc2lvbiBhbmQgc3RhcnQgb2YgUFJlcSB0cmFuc21pc3Npb24gVU5TSUdORUQzMiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9OTVRTdmNWaWFVRFBJUF9CT09MIC8vIEFiaWxpdHkgb2YgYSBub2RlIHRvIHBlcmZvcm0gTk1UIHNlcnZpY2VzIHZpYSBVRFAvSVAgQk9PTEVBTiBPIC0gWSAtCisjZGVmaW5lIEVQTF9EX05NVF9Ob2RlSURCeUhXX0JPT0wgLy8gQWJpbGl0eSBvZiBhIG5vZGUgdG8gc3VwcG9ydCBOb2RlSUQgc2V0dXAgYnkgSFcgQk9PTEVBTiBPIE8gWSBZCisjZGVmaW5lIEVQTF9EX05NVF9Ob2RlSURCeVNXX0JPT0wgLy8gQWJpbGl0eSBvZiBhIG5vZGUgdG8gc3VwcG9ydCBOb2RlSUQgc2V0dXAgYnkgU1cgQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX05NVF9Qcm9kdWN0Q29kZV9VMzIgLy8gSWRlbnRpdHkgT2JqZWN0IFByb2R1Y3QgQ29kZSBVTlNJR05FRDMyIE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX1JldmlzaW9uTm9fVTMyIC8vIElkZW50aXR5IE9iamVjdCBSZXZpc2lvbiBOdW1iZXIgVU5TSUdORUQzMiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9TZXJpYWxOb19VMzIgLy8gSWRlbnRpdHkgT2JqZWN0IFNlcmlhbCBOdW1iZXIgVU5TSUdORUQzMiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9TaW1wbGVCb290X0JPT0wgLy8gQWJpbGl0eSBvZiBhIE1OIG5vZGUgdG8gcGVyZm9ybSBTaW1wbGUgQm9vdCBQcm9jZXNzLCBpZiBub3Qgc2V0IEluZGl2dWFsIEJvb3QgUHJvY2VzcyBzaGFsbCBiZSBwcm92aWNlZCBCT09MRUFOIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX1ZlbmRvcklEX1UzMiAvLyBJZGVudGl0eSBPYmplY3QgVmVuZG9yIElEIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OV0xfRm9yd2FyZF9CT09MIC8vIEFiaWxpdHkgb2Ygbm9kZSB0byBmb3J3YXJkIGRhdGFncmFtcyBCT09MRUFOIE8gTyBOIE4KKyNkZWZpbmUgRVBMX0RfTldMX0lQU3VwcG9ydF9CT09MIC8vIEFiaWxpdHkgb2YgdGhlIG5vZGUgY3VtbXVuaWNhdGUgdmlhIElQIEJPT0xFQU4gLSAtIFkgWQorI2RlZmluZSBFUExfRF9QRE9fRHluYW1pY01hcHBpbmdfQk9PTCAvLyBBYmlsaXR5IG9mIGEgbm9kZSB0byBwZXJmb3JtIGR5bmFtaWMgUERPIG1hcHBpbmcgQk9PTEVBTiBPIE8gWSBZCisjZGVmaW5lIEVQTF9EX1BET19NYXhEZXNjck1lbV9VMzIgLy8gbWF4aW11bSBjdW11bGF0aXZlIG1lbW9yeSBjb25zdW1wdGlvbiBvZiBUUERPIGFuZCBSUERPIGRlc2NyaWJpbmcgb2JqZWN0cyBpbiBieXRlIFVOU0lHTkVEMzIgTyBPIE1BWF9VMzIgTUFYX1UzMgorI2RlZmluZSBFUExfRF9QRE9fUlBET0NoYW5uZWxzX1U4IC8vIG51bWJlciBvZiBzdXBwb3J0ZWQgUlBETyBjaGFubmVscyBVTlNJR05FRDggTyBPIDI1NiAyNTYKKyNkZWZpbmUgRVBMX0RfUERPX1JQRE9NYXhNZW1fVTMyIC8vIE1heGltdW0gbWVtb3J5IGF2YWlsYWJsZSBmb3IgUlBETyBkYXRhIHBlciBFUEwgY3ljbGUgaW4gYnl0ZSBVTlNJR05FRDMyIE8gTyBNQVhfVTMyIE1BWF9VMzIKKyNkZWZpbmUgRVBMX0RfUERPX1JQRE9PYmplY3RzX1U4IC8vIE51bWJlciBvZiBzdXBwb3J0ZWQgbWFwcGVkIG9iamVjdHMgcGVyIFJQRE8gY2hhbm5lbCBVTlNJR05FRDggTyBPIDI1NCAyNTQKKyNkZWZpbmUgRVBMX0RfUERPX1RQRE9DaGFubmVsc19VOCAvLyBudW1iZXIgb2Ygc3VwcG9ydGVkIFRQRE8gY2hhbm5lbHMgVU5TSUdORUQ4IE8gLSAyNTYgLQorI2RlZmluZSBFUExfRF9QRE9fVFBET01heE1lbV9VMzIgLy8gTWF4aW11bSBtZW1vcnkgYXZhaWxhYmxlIGZvciBUUERPIGRhdGEgcGVyIEVQTCBjeWNsZSBpbiBieXRlIFVOU0lHTkVEMzIgTyBPIE1BWF9VMzIgTUFYX1UzMgorI2RlZmluZSBFUExfRF9QRE9fVFBET09iamVjdHNfVTggLy8gTnVtYmVyIG9mIHN1cHBvcnRlZCBtYXBwZWQgb2JqZWN0cyBwZXIgVFBETyBjaGFubmVsIFVOU0lHTkVEOCBPIE8gMjU0IDI1NAorI2RlZmluZSBFUExfRF9TRE9fVmlhQVNuZF9CT09MIC8vIEFiaWxpdHkgb2YgYSBDTiB0byBwZXJmb3JtIFNETyB0cmFuc2ZlciBieSBFUEwgQVNuZCBCT09MRUFOIC0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfU0RPX1ZpYVBET19CT09MIC8vIEFiaWxpdHkgb2YgYSBub2RlIHRvIHBlcmZvcm0gU0RPIHRyYW5zZmVyIGJ5IFBETyBCT09MRUFOIE8gTyBOIE4KKyNkZWZpbmUgRVBMX0RfU0RPX1ZpYVVEUElQX0JPT0wgLy8gQWJpbGl0eSBvZiBhIENOIHRvIHBlcmZvcm0gU0RPIHRyYW5zZmVyIGJ5IFVEUC9JUCBCT09MRUFOIC0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfU1lOX09wdGltaXplZFN5bmNfQk9PTCAvLyBBYmlsaXR5IG9mIG5vZGUgdG8gcGVyZm9ybSBvcHRpbWl6ZWQgc3luY2hyb25pc2F0aW9uIEJPT0xFQU4gTyBPIE4gTgorKi8KKworLy8gRW1lcmdlbmN5IGVycm9yIGNvZGVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEVQTF9FX05PX0VSUk9SICAgICAgICAgICAgICAgICAgMHgwMDAwCisvLyAweEZ4eHggbWFudWZhY3R1cmVyIHNwZWNpZmljIGVycm9yIGNvZGVzCisjZGVmaW5lIEVQTF9FX05NVF9OT19JREVOVF9SRVMgICAgICAgICAgMHhGMDAxCisjZGVmaW5lIEVQTF9FX05NVF9OT19TVEFUVVNfUkVTICAgICAgICAgMHhGMDAyCisKKy8vIDB4ODE2eCBIVyBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfRExMX0JBRF9QSFlTX01PREUgICAgICAgICAweDgxNjEKKyNkZWZpbmUgRVBMX0VfRExMX0NPTExJU0lPTiAgICAgICAgICAgICAweDgxNjIKKyNkZWZpbmUgRVBMX0VfRExMX0NPTExJU0lPTl9USCAgICAgICAgICAweDgxNjMKKyNkZWZpbmUgRVBMX0VfRExMX0NSQ19USCAgICAgICAgICAgICAgICAweDgxNjQKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfT0ZfTElOSyAgICAgICAgICAweDgxNjUKKyNkZWZpbmUgRVBMX0VfRExMX01BQ19CVUZGRVIgICAgICAgICAgICAweDgxNjYKKy8vIDB4ODJ4eCBQcm90b2NvbCBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfRExMX0FERFJFU1NfQ09ORkxJQ1QgICAgICAweDgyMDEKKyNkZWZpbmUgRVBMX0VfRExMX01VTFRJUExFX01OICAgICAgICAgICAweDgyMDIKKy8vIDB4ODIxeCBGcmFtZSBzaXplIGVycm9ycworI2RlZmluZSBFUExfRV9QRE9fU0hPUlRfUlggICAgICAgICAgICAgIDB4ODIxMAorI2RlZmluZSBFUExfRV9QRE9fTUFQX1ZFUlMgICAgICAgICAgICAgIDB4ODIxMQorI2RlZmluZSBFUExfRV9OTVRfQVNORF9NVFVfRElGICAgICAgICAgIDB4ODIxMgorI2RlZmluZSBFUExfRV9OTVRfQVNORF9NVFVfTElNICAgICAgICAgIDB4ODIxMworI2RlZmluZSBFUExfRV9OTVRfQVNORF9UWF9MSU0gICAgICAgICAgIDB4ODIxNAorLy8gMHg4MjN4IFRpbWluZyBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfTk1UX0NZQ0xFX0xFTiAgICAgICAgICAgICAweDgyMzEKKyNkZWZpbmUgRVBMX0VfRExMX0NZQ0xFX0VYQ0VFRCAgICAgICAgICAweDgyMzIKKyNkZWZpbmUgRVBMX0VfRExMX0NZQ0xFX0VYQ0VFRF9USCAgICAgICAweDgyMzMKKyNkZWZpbmUgRVBMX0VfTk1UX0lETEVfTElNICAgICAgICAgICAgICAweDgyMzQKKyNkZWZpbmUgRVBMX0VfRExMX0pJVFRFUl9USCAgICAgICAgICAgICAweDgyMzUKKyNkZWZpbmUgRVBMX0VfRExMX0xBVEVfUFJFU19USCAgICAgICAgICAweDgyMzYKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVFfQ04gICAgICAgICAgICAgICAweDgyMzcKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVFfTElNICAgICAgICAgICAgICAweDgyMzgKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVNfQ04gICAgICAgICAgICAgICAweDgyMzkKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVNfUlhfTElNICAgICAgICAgICAweDgyM0EKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVNfVFhfTElNICAgICAgICAgICAweDgyM0IKKy8vIDB4ODI0eCBGcmFtZSBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfRExMX0lOVkFMSURfRk9STUFUICAgICAgICAweDgyNDEKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfUFJFUV9USCAgICAgICAgICAweDgyNDIKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfUFJFU19USCAgICAgICAgICAweDgyNDMKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfU09BX1RIICAgICAgICAgICAweDgyNDQKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfU09DX1RIICAgICAgICAgICAweDgyNDUKKy8vIDB4ODR4eCBCb290VXAgRXJyb3JzCisjZGVmaW5lIEVQTF9FX05NVF9CQTEgICAgICAgICAgICAgICAgICAgMHg4NDEwCS8vIG90aGVyIE1OIGluIE1zTm90QWN0aXZlIGFjdGl2ZQorI2RlZmluZSBFUExfRV9OTVRfQkExX05PX01OX1NVUFBPUlQgICAgIDB4ODQxMQkvLyBNTiBpcyBub3Qgc3VwcG9ydGVkCisjZGVmaW5lIEVQTF9FX05NVF9CUE8xICAgICAgICAgICAgICAgICAgMHg4NDIwCS8vIG1hbmRhdG9yeSBDTiB3YXMgbm90IGZvdW5kIG9yIGZhaWxlZCBpbiBCb290U3RlcDEKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfR0VUX0lERU5UICAgICAgICAweDg0MjEJLy8gSWRlbnRSZXMgd2FzIG5vdCByZWNlaXZlZAorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9ERVZJQ0VfVFlQRSAgICAgIDB4ODQyMgkvLyB3cm9uZyBkZXZpY2UgdHlwZQorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9WRU5ET1JfSUQgICAgICAgIDB4ODQyMwkvLyB3cm9uZyB2ZW5kb3IgSUQKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfUFJPRFVDVF9DT0RFICAgICAweDg0MjQJLy8gd3JvbmcgcHJvZHVjdCBjb2RlCisjZGVmaW5lIEVQTF9FX05NVF9CUE8xX1JFVklTSU9OX05PICAgICAgMHg4NDI1CS8vIHdyb25nIHJldmlzaW9uIG51bWJlcgorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9TRVJJQUxfTk8gICAgICAgIDB4ODQyNgkvLyB3cm9uZyBzZXJpYWwgbnVtYmVyCisjZGVmaW5lIEVQTF9FX05NVF9CUE8xX0NGX1ZFUklGWSAgICAgICAgMHg4NDI4CS8vIHZlcmlmaWNhdGlvbiBvZiBjb25maWd1cmF0aW9uIGZhaWxlZAorI2RlZmluZSBFUExfRV9OTVRfQlBPMiAgICAgICAgICAgICAgICAgIDB4ODQzMAkvLyBtYW5kYXRvcnkgQ04gZmFpbGVkIGluIEJvb3RTdGVwMgorI2RlZmluZSBFUExfRV9OTVRfQlJPICAgICAgICAgICAgICAgICAgIDB4ODQ0MAkvLyBDaGVja0NvbW11bmljYXRpb24gZmFpbGVkIGZvciBtYW5kYXRvcnkgQ04KKyNkZWZpbmUgRVBMX0VfTk1UX1dST05HX1NUQVRFICAgICAgICAgICAweDg0ODAJLy8gbWFuZGF0b3J5IENOIGhhcyB3cm9uZyBOTVQgc3RhdGUKKworLy8gRGVmaW5lcyBmb3Igb2JqZWN0IDB4MUY4MCBOTVRfU3RhcnRVcF9VMzIKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBFUExfTk1UU1RfU1RBUlRBTExOT0RFUyAgICAgICAgIDB4MDAwMDAwMDJMCS8vIEJpdCAxCisjZGVmaW5lIEVQTF9OTVRTVF9OT19BVVRPU1RBUlQgICAgICAgICAgMHgwMDAwMDAwNEwJLy8gQml0IDIKKyNkZWZpbmUgRVBMX05NVFNUX05PX1NUQVJUTk9ERSAgICAgICAgICAweDAwMDAwMDA4TAkvLyBCaXQgMworI2RlZmluZSBFUExfTk1UU1RfUkVTRVRBTExfTUFORF9DTiAgICAgIDB4MDAwMDAwMTBMCS8vIEJpdCA0CisjZGVmaW5lIEVQTF9OTVRTVF9TVE9QQUxMX01BTkRfQ04gICAgICAgMHgwMDAwMDA0MEwJLy8gQml0IDYKKyNkZWZpbmUgRVBMX05NVFNUX05PX0FVVE9QUkVPUDIgICAgICAgICAweDAwMDAwMDgwTAkvLyBCaXQgNworI2RlZmluZSBFUExfTk1UU1RfTk9fQVVUT1JFQURZVE9PUCAgICAgIDB4MDAwMDAxMDBMCS8vIEJpdCA4CisjZGVmaW5lIEVQTF9OTVRTVF9FWFRfQ05JREVOVENIRUNLICAgICAgMHgwMDAwMDIwMEwJLy8gQml0IDkKKyNkZWZpbmUgRVBMX05NVFNUX1NXVkVSU0lPTkNIRUNLICAgICAgICAweDAwMDAwNDAwTAkvLyBCaXQgMTAKKyNkZWZpbmUgRVBMX05NVFNUX0NPTkZDSEVDSyAgICAgICAgICAgICAweDAwMDAwODAwTAkvLyBCaXQgMTEKKyNkZWZpbmUgRVBMX05NVFNUX05PX1JFVFVSTl9QUkVPUDEgICAgICAweDAwMDAxMDAwTAkvLyBCaXQgMTIKKyNkZWZpbmUgRVBMX05NVFNUX0JBU0lDRVRIRVJORVQgICAgICAgICAweDAwMDAyMDAwTAkvLyBCaXQgMTMKKworLy8gRGVmaW5lcyBmb3Igb2JqZWN0IDB4MUY4MSBOTVRfTm9kZUFzc2lnbm1lbnRfQVUzMgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMgICAgICAweDAwMDAwMDAxTAkvLyBCaXQgMAorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9OT0RFX0lTX0NOICAgICAgIDB4MDAwMDAwMDJMCS8vIEJpdCAxCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1NUQVJUX0NOICAgICAgICAgMHgwMDAwMDAwNEwJLy8gQml0IDIKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOICAgICAweDAwMDAwMDA4TAkvLyBCaXQgMworI2RlZmluZSBFUExfTk9ERUFTU0lHTl9LRUVQQUxJVkUgICAgICAgIDB4MDAwMDAwMTBMCS8vY3VycmVudGx5IG5vdCB1c2VkIGluIEVQTCBWMiBzdGFuZGFyZAorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9TV1ZFUlNJT05DSEVDSyAgIDB4MDAwMDAwMjBMCS8vIEJpdCA1CisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1NXVVBEQVRFICAgICAgICAgMHgwMDAwMDA0MEwJLy8gQml0IDYKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREUgICAweDAwMDAwMTAwTAkvLyBCaXQgOAorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9NVUxUSVBMRVhFRF9DTiAgIDB4MDAwMDAyMDBMCS8vIEJpdCA5CisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1JUMSAgICAgICAgICAgICAgMHgwMDAwMDQwMEwJLy8gQml0IDEwCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1JUMiAgICAgICAgICAgICAgMHgwMDAwMDgwMEwJLy8gQml0IDExCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX01OX1BSRVMgICAgICAgICAgMHgwMDAwMTAwMEwJLy8gQml0IDEyCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1ZBTElEICAgICAgICAgICAgMHg4MDAwMDAwMEwJLy8gQml0IDMxCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ERUZfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjU3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbC5oCkBAIC0wLDAgKzEsMjA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBETEwgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExfSF8KKyNkZWZpbmUgX0VQTF9ETExfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbEZyYW1lLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9ETExfTUFYX0FTTkRfU0VSVklDRV9JRAorI2RlZmluZSBFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSUQgKEVQTF9DX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEUyArIDEpCS8vIGxhc3QgaXMga0VwbERsbEFzbmRTZG8gPT0gNQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxBc25kTm90RGVmaW5lZCA9IDB4MDAsCisJa0VwbERsbEFzbmRJZGVudFJlc3BvbnNlID0gMHgwMSwKKwlrRXBsRGxsQXNuZFN0YXR1c1Jlc3BvbnNlID0gMHgwMiwKKwlrRXBsRGxsQXNuZE5tdFJlcXVlc3QgPSAweDAzLAorCWtFcGxEbGxBc25kTm10Q29tbWFuZCA9IDB4MDQsCisJa0VwbERsbEFzbmRTZG8gPSAweDA1Cit9IHRFcGxEbGxBc25kU2VydmljZUlkOworCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxBc25kRmlsdGVyTm9uZSA9IDB4MDAsCisJa0VwbERsbEFzbmRGaWx0ZXJMb2NhbCA9IDB4MDEsCS8vIHJlY2VpdmUgb25seSBBU25kIGZyYW1lcyB3aXRoIGxvY2FsIG9yIGJyb2FkY2FzdCBub2RlIElECisJa0VwbERsbEFzbmRGaWx0ZXJBbnkgPSAweDAyLAkvLyByZWNlaXZlIGFueSBBU25kIGZyYW1lCit9IHRFcGxEbGxBc25kRmlsdGVyOworCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxSZXFTZXJ2aWNlTm8gPSAweDAwLAorCWtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQgPSAweDAxLAorCWtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzID0gMHgwMiwKKwlrRXBsRGxsUmVxU2VydmljZU5tdFJlcXVlc3QgPSAweDAzLAorCWtFcGxEbGxSZXFTZXJ2aWNlVW5zcGVjaWZpZWQgPSAweEZGLAorCit9IHRFcGxEbGxSZXFTZXJ2aWNlSWQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbERsbEFzeW5jUmVxUHJpb05tdCA9IDB4MDcsCS8vIFBSSU9fTk1UX1JFUVVFU1QKKwlrRXBsRGxsQXN5bmNSZXFQcmlvNiA9IDB4MDYsCisJa0VwbERsbEFzeW5jUmVxUHJpbzUgPSAweDA1LAorCWtFcGxEbGxBc3luY1JlcVByaW80ID0gMHgwNCwKKwlrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYyA9IDB4MDMsCS8vIFBSSU9fR0VORVJJQ19SRVFVRVNUCisJa0VwbERsbEFzeW5jUmVxUHJpbzIgPSAweDAyLAkvLyB0aWxsIFdTUCAwLjEuMzogUFJJT19BQk9WRV9HRU5FUklDCisJa0VwbERsbEFzeW5jUmVxUHJpbzEgPSAweDAxLAkvLyB0aWxsIFdTUCAwLjEuMzogUFJJT19CRUxPV19HRU5FUklDCisJa0VwbERsbEFzeW5jUmVxUHJpbzAgPSAweDAwLAkvLyB0aWxsIFdTUCAwLjEuMzogUFJJT19HRU5FUklDX1JFUVVFU1QKKworfSB0RXBsRGxsQXN5bmNSZXFQcmlvcml0eTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpRnJhbWVTaXplOworCXRFcGxGcmFtZSAqbV9wRnJhbWU7CisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOworCit9IHRFcGxGcmFtZUluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aVNpemVPZlN0cnVjdDsKKwlCT09MIG1fZkFzeW5jT25seTsJLy8gZG8gbm90IG5lZWQgdG8gcmVnaXN0ZXIgUFJlcy1GcmFtZQorCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOwkvLyBsb2NhbCBub2RlIElECisKKwkvLyAweDFGODI6IE5NVF9GZWF0dXJlRmxhZ3NfVTMyCisJRFdPUkQgbV9kd0ZlYXR1cmVGbGFnczsKKwkvLyBDeWNsZSBMZW5ndGggKDB4MTAwNjogTk1UX0N5Y2xlTGVuX1UzMikgaW4gW3VzXQorCURXT1JEIG1fZHdDeWNsZUxlbjsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCS8vIDB4MUY5ODogTk1UX0N5Y2xlVGltaW5nX1JFQworCS8vIDB4MUY5OC4xOiBJc29jaHJUeE1heFBheWxvYWRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlJc29jaHJUeE1heFBheWxvYWQ7CS8vIGNvbnN0CisJLy8gMHgxRjk4LjI6IElzb2NoclJ4TWF4UGF5bG9hZF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aUlzb2NoclJ4TWF4UGF5bG9hZDsJLy8gY29uc3QKKwkvLyAweDFGOTguMzogUFJlc01heExhdGVuY3lfVTMyCisJRFdPUkQgbV9kd1ByZXNNYXhMYXRlbmN5OwkvLyBjb25zdCBpbiBbbnNdLCBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCS8vIDB4MUY5OC40OiBQUmVxQWN0UGF5bG9hZExpbWl0X1UxNgorCXVuc2lnbmVkIGludCBtX3VpUHJlcUFjdFBheWxvYWRMaW1pdDsJLy8gcmVxdWlyZWQgZm9yIGluaXRpYWxpc2F0aW9uICgrMjQgYnl0ZXMpCisJLy8gMHgxRjk4LjU6IFBSZXNBY3RQYXlsb2FkTGltaXRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlQcmVzQWN0UGF5bG9hZExpbWl0OwkvLyByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24gb2YgUHJlcyBmcmFtZSAoKzI0IGJ5dGVzKQorCS8vIDB4MUY5OC42OiBBU25kTWF4TGF0ZW5jeV9VMzIKKwlEV09SRCBtX2R3QXNuZE1heExhdGVuY3k7CS8vIGNvbnN0IGluIFtuc10sIG9ubHkgcmVxdWlyZWQgZm9yIElkZW50UmVzCisJLy8gMHgxRjk4Ljc6IE11bHRpcGxDeWNsZUNudF9VOAorCXVuc2lnbmVkIGludCBtX3VpTXVsdGlwbEN5Y2xlQ250OwkvLyByZXF1aXJlZCBmb3IgZXJyb3IgZGV0ZWN0aW9uCisJLy8gMHgxRjk4Ljg6IEFzeW5jTVRVX1UxNgorCXVuc2lnbmVkIGludCBtX3VpQXN5bmNNdHU7CS8vIHJlcXVpcmVkIHRvIHNldCB1cCBtYXggZnJhbWUgc2l6ZQorCS8vICQkJCAweDFGOTguOTogUHJlc2NhbGVyX1UxNgorCS8vICQkJCBNdWx0aXBsZXhlZCBTbG90CisKKwkvLyAweDFDMTQ6IERMTF9Mb3NzT2ZGcmFtZVRvbGVyYW5jZV9VMzIgaW4gW25zXQorCURXT1JEIG1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZTsKKworCS8vIDB4MUY4QTogTk1UX01OQ3ljbGVUaW1pbmdfUkVDCisJLy8gMHgxRjhBLjE6IFdhaXRTb0NQUmVxX1UzMiBpbiBbbnNdCisJRFdPUkQgbV9kd1dhaXRTb2NQcmVxOworCisJLy8gMHgxRjhBLjI6IEFzeW5jU2xvdFRpbWVvdXRfVTMyIGluIFtuc10KKwlEV09SRCBtX2R3QXN5bmNTbG90VGltZW91dDsKKworfSB0RXBsRGxsQ29uZmlnUGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aVNpemVPZlN0cnVjdDsKKwlEV09SRCBtX2R3RGV2aWNlVHlwZTsJLy8gTk1UX0RldmljZVR5cGVfVTMyCisJRFdPUkQgbV9kd1ZlbmRvcklkOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlZlbmRvcklkX1UzMgorCURXT1JEIG1fZHdQcm9kdWN0Q29kZTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5Qcm9kdWN0Q29kZV9VMzIKKwlEV09SRCBtX2R3UmV2aXNpb25OdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUmV2aXNpb25Ob19VMzIKKwlEV09SRCBtX2R3U2VyaWFsTnVtYmVyOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlNlcmlhbE5vX1UzMgorCVFXT1JEIG1fcXdWZW5kb3JTcGVjaWZpY0V4dDE7CisJRFdPUkQgbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlOwkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZkRhdGVfVTMyCisJRFdPUkQgbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lOwkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZlRpbWVfVTMyCisJRFdPUkQgbV9kd0FwcGxpY2F0aW9uU3dEYXRlOwkvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dEYXRlX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIGRhdGUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwlEV09SRCBtX2R3QXBwbGljYXRpb25Td1RpbWU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd1RpbWVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgdGltZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fZHdJcEFkZHJlc3M7CisJRFdPUkQgbV9kd1N1Ym5ldE1hc2s7CisJRFdPUkQgbV9kd0RlZmF1bHRHYXRld2F5OworCUJZVEUgbV9zSG9zdG5hbWVbMzJdOworCUJZVEUgbV9hYlZlbmRvclNwZWNpZmljRXh0Mls0OF07CisKK30gdEVwbERsbElkZW50UGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwlXT1JEIG1fd1ByZXFQYXlsb2FkTGltaXQ7CS8vIG9iamVjdCAweDFGOEI6IE5NVF9NTlBSZXFQYXlsb2FkTGltaXRMaXN0X0FVMTYKKwlXT1JEIG1fd1ByZXNQYXlsb2FkTGltaXQ7CS8vIG9iamVjdCAweDFGOEQ6IE5NVF9QUmVzUGF5bG9hZExpbWl0TGlzdF9BVTE2CisJRFdPUkQgbV9kd1ByZXNUaW1lb3V0OwkvLyBvYmplY3QgMHgxRjkyOiBOTVRfTU5DTlBSZXNUaW1lb3V0X0FVMzIKKworfSB0RXBsRGxsTm9kZUluZm87CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0NjAwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsQ2FsLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIERMTCBDb21tdW5pY2F0aW9uIEFic3RyYWN0aW9uIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbENhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjAgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMQ0FMX0hfCisjZGVmaW5lIF9FUExfRExMQ0FMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfSURfUlgKKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfSURfUlggICAgIkVwbFNibERsbENhbFJ4IgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9SWAorI2RlZmluZSBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1JYICAzMjc2NworI2VuZGlmCisqLworI2lmbmRlZiBFUExfRExMQ0FMX0JVRkZFUl9JRF9UWF9OTVQKKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfTk1UICAgICAiRXBsU2JsRGxsQ2FsVHhObXQiCisjZW5kaWYKKworI2lmbmRlZiBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX05NVAorI2RlZmluZSBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX05NVCAgIDMyNzY3CisjZW5kaWYKKworI2lmbmRlZiBFUExfRExMQ0FMX0JVRkZFUl9JRF9UWF9HRU4KKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfR0VOICAgICAiRXBsU2JsRGxsQ2FsVHhHZW4iCisjZW5kaWYKKworI2lmbmRlZiBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX0dFTgorI2RlZmluZSBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX0dFTiAgIDMyNzY3CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRGxsQXNuZFNlcnZpY2VJZCBtX1NlcnZpY2VJZDsKKwl0RXBsRGxsQXNuZEZpbHRlciBtX0ZpbHRlcjsKKworfSB0RXBsRGxsQ2FsQXNuZFNlcnZpY2VJZEZpbHRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxEbGxSZXFTZXJ2aWNlSWQgbV9TZXJ2aWNlOworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCUJZVEUgbV9iU29hRmxhZzE7CisKK30gdEVwbERsbENhbElzc3VlUmVxdWVzdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRExMS0NBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTIyNjQxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsay5jCkBAIC0wLDAgKzEsNDA1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBrZXJuZWwgRExMIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbGsuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMjEgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAiZWRydi5oIgorI2luY2x1ZGUgIkJlbmNobWFyay5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRvay5oIgorI2VuZGlmCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaCIKKyNlbmRpZgorCisvLyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJIaWdoUmVzay5oIgorLy8jZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgPT0gMCkKKyNlcnJvciAiRVBMIG1vZHVsZSBETExLIG5lZWRzIEVQTCBtb2R1bGUgTk1USyEiCisjZW5kaWYKKworI2lmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFKSAmJiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAhPSBGQUxTRSkKKyNlcnJvciAiRVBMIG1vZHVsZSBETExLOiBzZWxlY3Qgb25seSBvbmUgb2YgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSBhbmQgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQy4iCisjZW5kaWYKKworI2lmICgoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpKSBcCisgICAgJiYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSA9PSAwKQorI2Vycm9yICJFUEwgbW9kdWxlIERMTEs6IGN1cnJlbnRseSwgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSXyogaXMgbm90IHN1cHBvcnRlZCBpZiBFUExfTU9EVUxFX05NVF9NTiBpcyBlbmFibGVkLiIKKyNlbmRpZgorCisjaWYgKEVEUlZfRkFTVF9UWEZSQU1FUyA9PSBGQUxTRSkgJiYgXAorICAgICgoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpKQorI2Vycm9yICJFUEwgbW9kdWxlIERMTEs6IEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl8qIGlzIGVuYWJsZWQsIGJ1dCBub3QgRURSVl9GQVNUX1RYRlJBTUVTLiIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQorI2VuZGlmCisjZGVmaW5lIEVQTF9ETExLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKEV2ZW50X3AsIHVpTm9kZUlkX3AsIHdFcnJvckNvZGVfcCkgXAorICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoa0VwbEV2ZW50U2lua0RsbGsgPDwgMjgpIHwgKEV2ZW50X3AgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodWlOb2RlSWRfcCA8PCAxNikgfCB3RXJyb3JDb2RlX3ApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsRGxsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZGVmaW5lcyBmb3IgaW5kZXhlcyBvZiB0RXBsRGxsSW5zdGFuY2UubV9wVHhGcmFtZUluZm8KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFUyAgIDAJLy8gSWRlbnRSZXNwb25zZSBvbiBDTiAvIE1OCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTICAxCS8vIFN0YXR1c1Jlc3BvbnNlIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVEgICAgIDIJLy8gTk1UIFJlcXVlc3QgZnJvbSBGSUZPIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwgICAgIDMJLy8gbm9uLUVQTCBmcmFtZSBmcm9tIEZJRk8gb24gQ04gLyBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX1BSRVMgICAgICAgNAkvLyBQUmVzIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9TT0MgICAgICAgIDUJLy8gU29DIG9uIE1OCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfU09BICAgICAgICA2CS8vIFNvQSBvbiBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX1BSRVEgICAgICAgNwkvLyBQUmVxIG9uIE1OCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfQ09VTlQgICAgICAoNyArIEVQTF9EX05NVF9NYXhDTk51bWJlcl9VOCArIDIpCS8vIG9uIE1OOiA3ICsgTWF4UFJlcSBvZiByZWd1bGFyIENOcyArIDEgRGlhZyArIDEgUm91dGVyCisjZWxzZQorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX0NPVU5UICAgICAgNQkvLyBvbiBDTjogNQorI2VuZGlmCisKKyNkZWZpbmUgRVBMX0RMTEtfQlVGTEVOX0VNUFRZICAgICAgIDAJLy8gYnVmZmVyIGlzIGVtcHR5CisjZGVmaW5lIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HICAgICAxCS8vIGp1c3QgdGhlIGJ1ZmZlciBpcyBiZWluZyBmaWxsZWQKKyNkZWZpbmUgRVBMX0RMTEtfQlVGTEVOX01JTiAgICAgICAgIDYwCS8vIG1pbmltdW0gZXRoZXJuZXQgZnJhbWUgbGVuZ3RoCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsR3NJbml0ID0gMHgwMCwJLy8gTU4vQ046IGluaXRpYWxpc2F0aW9uICg8IFByZU9wMikKKwlrRXBsRGxsQ3NXYWl0UHJlcSA9IDB4MDEsCS8vIENOOiB3YWl0IGZvciBQUmVxIGZyYW1lCisJa0VwbERsbENzV2FpdFNvYyA9IDB4MDIsCS8vIENOOiB3YWl0IGZvciBTb0MgZnJhbWUKKwlrRXBsRGxsQ3NXYWl0U29hID0gMHgwMywJLy8gQ046IHdhaXQgZm9yIFNvQSBmcmFtZQorCWtFcGxEbGxNc05vbkN5Y2xpYyA9IDB4MDQsCS8vIE1OOiByZWR1Y2VkIEVQTCBjeWNsZSAoUHJlT3AxKQorCWtFcGxEbGxNc1dhaXRTb2NUcmlnID0gMHgwNSwJLy8gTU46IHdhaXQgZm9yIFNvQyB0cmlnZ2VyIChjeWNsZSB0aW1lcikKKwlrRXBsRGxsTXNXYWl0UHJlcVRyaWcgPSAweDA2LAkvLyBNTjogd2FpdCBmb3IgKGZpcnN0KSBQUmVxIHRyaWdnZXIgKFdhaXRTb0NQUmVxX1UzMikKKwlrRXBsRGxsTXNXYWl0UHJlcyA9IDB4MDcsCS8vIE1OOiB3YWl0IGZvciBQUmVzIGZyYW1lIGZyb20gQ04KKwlrRXBsRGxsTXNXYWl0U29hVHJpZyA9IDB4MDgsCS8vIE1OOiB3YWl0IGZvciBTb0EgdHJpZ2dlciAoUFJlcyB0cmFuc21pdHRlZCkKKwlrRXBsRGxsTXNXYWl0QXNuZFRyaWcgPSAweDA5LAkvLyBNTjogd2FpdCBmb3IgQVNuZCB0cmlnZ2VyIChTb0EgdHJhbnNtaXR0ZWQpCisJa0VwbERsbE1zV2FpdEFzbmQgPSAweDBBLAkvLyBNTjogd2FpdCBmb3IgQVNuZCBmcmFtZSBpZiBTb0EgY29udGFpbmVkIGludml0YXRpb24KKworfSB0RXBsRGxsU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFIG1fYmVfYWJTcmNNYWNbNl07CisJdEVkcnZUeEJ1ZmZlciAqbV9wVHhCdWZmZXI7CS8vIEJ1ZmZlcnMgZm9yIFR4LUZyYW1lcworCXVuc2lnbmVkIGludCBtX3VpTWF4VHhGcmFtZXM7CisJQllURSBtX2JGbGFnMTsJCS8vIEZsYWcgMSB3aXRoIEVOLCBFQyBmb3IgUFJlcywgU3RhdHVzUmVzCisJQllURSBtX2JNbkZsYWcxOwkvLyBGbGFnIDEgd2l0aCBFQSwgRVIgZnJvbSBQUmVxLCBTb0Egb2YgTU4KKwlCWVRFIG1fYkZsYWcyOwkJLy8gRmxhZyAyIHdpdGggUFIgYW5kIFJTIGZvciBQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzCisJdEVwbERsbENvbmZpZ1BhcmFtIG1fRGxsQ29uZmlnUGFyYW07CisJdEVwbERsbElkZW50UGFyYW0gbV9EbGxJZGVudFBhcmFtOworCXRFcGxEbGxTdGF0ZSBtX0RsbFN0YXRlOworCXRFcGxEbGxrQ2JBc3luYyBtX3BmbkNiQXN5bmM7CisJdEVwbERsbEFzbmRGaWx0ZXIgbV9hQXNuZEZpbHRlcltFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSURdOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCXRFcGxEbGxrTm9kZUluZm8gKm1fcEZpcnN0Tm9kZUluZm87CisJdEVwbERsbGtOb2RlSW5mbyAqbV9wQ3VyTm9kZUluZm87CisJdEVwbERsbGtOb2RlSW5mbyBtX2FOb2RlSW5mb1tFUExfTk1UX01BWF9OT0RFX0lEXTsKKwl0RXBsRGxsUmVxU2VydmljZUlkIG1fTGFzdFJlcVNlcnZpY2VJZDsKKwl1bnNpZ25lZCBpbnQgbV91aUxhc3RUYXJnZXROb2RlSWQ7CisjZW5kaWYKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsQ3ljbGU7CS8vIHVzZWQgZm9yIEVQTCBjeWNsZSBtb25pdG9yaW5nIG9uIENOIGFuZCBnZW5lcmF0aW9uIG9uIE1OCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsUmVzcG9uc2U7CS8vIHVzZWQgZm9yIENOIHJlc3BvbnNlIG1vbml0b3JpbmcKKyNlbmRpZgkJCQkvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKyNlbmRpZgorCisJdW5zaWduZWQgaW50IG1fdWlDeWNsZUNvdW50OwkvLyBjeWNsZSBjb3VudGVyIChuZWVkZWQgZm9yIG11bHRpcGxleGVkIGN5Y2xlIHN1cHBvcnQpCisJdW5zaWduZWQgbG9uZyBsb25nIG1fdWxsRnJhbWVUaW1lb3V0OwkvLyBmcmFtZSB0aW1lb3V0IChjeWNsZSBsZW5ndGggKyBsb3NzIG9mIGZyYW1lIHRvbGVyYW5jZSkKKworfSB0RXBsRGxsa0luc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBzaGFsbCBiZSB1c2VkCisvLyBkZWZpbmUgc3RydWN0dXJlcyBzdGF0aWNhbGx5CitzdGF0aWMgdEVwbERsbGtJbnN0YW5jZSBFcGxEbGxrSW5zdGFuY2VfZzsKKworc3RhdGljIHRFZHJ2VHhCdWZmZXIgYUVwbERsbGtUeEJ1ZmZlcl9sW0VQTF9ETExLX1RYRlJBTUVfQ09VTlRdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY2hhbmdlIERMTCBzdGF0ZSBvbiBldmVudAorc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0NoYW5nZVN0YXRlKHRFcGxObXRFdmVudCBObXRFdmVudF9wLAorCQkJCSAgICAgdEVwbE5tdFN0YXRlIE5tdFN0YXRlX3ApOworCisvLyBjYWxsZWQgZnJvbSBFZHJ2SW50ZXJydXB0SGFuZGxlcigpCitzdGF0aWMgdm9pZCBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkKHRFZHJ2UnhCdWZmZXIgKiBwUnhCdWZmZXJfcCk7CisKKy8vIGNhbGxlZCBmcm9tIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKCkKK3N0YXRpYyB2b2lkIEVwbERsbGtDYkZyYW1lVHJhbnNtaXR0ZWQodEVkcnZUeEJ1ZmZlciAqIHBUeEJ1ZmZlcl9wKTsKKworLy8gY2hlY2sgZnJhbWUgYW5kIHNldCBtaXNzaW5nIGluZm9ybWF0aW9uCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQ2hlY2tGcmFtZSh0RXBsRnJhbWUgKiBwRnJhbWVfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpRnJhbWVTaXplX3ApOworCisvLyBjYWxsZWQgYnkgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZSB0byBtb25pdG9yIEVQTCBjeWNsZSBhcyBDTgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbERsbGtDYkNuVGltZXIodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCk7CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKy8vIE1OOiByZXR1cm5zIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKK3N0YXRpYyB0RXBsRGxsa05vZGVJbmZvICpFcGxEbGxrR2V0Tm9kZUluZm8odW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCisvLyB0cmFuc21pdCBTb0EKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtNblNlbmRTb2EodEVwbE5tdFN0YXRlIE5tdFN0YXRlX3AsCisJCQkJICAgdEVwbERsbFN0YXRlICogcERsbFN0YXRlUHJvcG9zZWRfcCwKKwkJCQkgICBCT09MIGZFbmFibGVJbnZpdGF0aW9uX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrTW5TZW5kU29jKHZvaWQpOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrTW5TZW5kUHJlcSh0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkgICAgdEVwbERsbFN0YXRlICogcERsbFN0YXRlUHJvcG9zZWRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQodEVwbERsbFJlcVNlcnZpY2VJZAorCQkJCQkgICAgICAgUmVxU2VydmljZUlkX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyQ3ljbGUodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UodEVwbFRpbWVyRXZlbnRBcmcgKgorCQkJCQkJICBwRXZlbnRBcmdfcCk7CisKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0FkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkIGFuZCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgICAgICAgICAgPSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzIGxpa2UgTUFDIGFkZHJlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0FkZEluc3RhbmNlKHRFcGxEbGxrSW5pdFBhcmFtICogcEluaXRQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVkcnZJbml0UGFyYW0gRWRydkluaXRQYXJhbTsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbERsbGtJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsRGxsa0luc3RhbmNlX2cpKTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCVJldCA9IEVwbFRpbWVySGlnaFJlc2tJbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGluaXRpYWxpemluZyBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlCisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGlmIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYXZhaWxhYmxlCisJLy8gYWxsb2NhdGUgaW5zdGFuY2Ugc3RydWN0dXJlCisJLy8gYWxsb2NhdGUgVFBETyBhbmQgUlBETyB0YWJsZSB3aXRoIGRlZmF1bHQgc2l6ZQorCisJLy8gaW5pdGlhbGl6ZSBhbmQgbGluayBwb2ludGVycyBpbiBpbnN0YW5jZSBzdHJ1Y3R1cmUgdG8gZnJhbWUgdGFibGVzCisJRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXIgPSBhRXBsRGxsa1R4QnVmZmVyX2w7CisJRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzID0KKwkgICAgc2l6ZW9mKGFFcGxEbGxrVHhCdWZmZXJfbCkgLyBzaXplb2YodEVkcnZUeEJ1ZmZlcik7CisKKwkvLyBpbml0aWFsaXplIHN0YXRlCisJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxHc0luaXQ7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gc2V0IHVwIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgdGFiZW50cmllcyhFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJICAgICB1aUluZGV4KyspIHsKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlJbmRleF0ubV91aU5vZGVJZCA9IHVpSW5kZXggKyAxOworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS5tX3dQcmVzUGF5bG9hZExpbWl0ID0KKwkJICAgIDB4RkZGRjsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRWRydgorCUVQTF9NRU1DUFkoRWRydkluaXRQYXJhbS5tX2FiTXlNYWNBZGRyLCBwSW5pdFBhcmFtX3AtPm1fYmVfYWJTcmNNYWMsIDYpOworCUVkcnZJbml0UGFyYW0ubV9wZm5SeEhhbmRsZXIgPSBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkOworCUVkcnZJbml0UGFyYW0ubV9wZm5UeEhhbmRsZXIgPSBFcGxEbGxrQ2JGcmFtZVRyYW5zbWl0dGVkOworCVJldCA9IEVkcnZJbml0KCZFZHJ2SW5pdFBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgaW5pdGlhbGl6aW5nIGV0aGVybmV0IGRyaXZlcgorCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNvcHkgbG9jYWwgTUFDIGFkZHJlc3MgZnJvbSBFdGhlcm5ldCBkcml2ZXIgYmFjayB0byBsb2NhbCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwkvLyBiZWNhdXNlIEV0aGVybmV0IGRyaXZlciBtYXkgaGF2ZSByZWFkIGl0IGZyb20gY29udHJvbGxlciBFRVBST00KKwlFUExfTUVNQ1BZKEVwbERsbGtJbnN0YW5jZV9nLm1fYmVfYWJTcmNNYWMsIEVkcnZJbml0UGFyYW0ubV9hYk15TWFjQWRkciwKKwkJICAgNik7CisJRVBMX01FTUNQWShwSW5pdFBhcmFtX3AtPm1fYmVfYWJTcmNNYWMsIEVkcnZJbml0UGFyYW0ubV9hYk15TWFjQWRkciwgNik7CisKKwkvLyBpbml0aWFsaXplIFR4QnVmZmVyIGFycmF5CisJZm9yICh1aUluZGV4ID0gMDsgdWlJbmRleCA8IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lczsKKwkgICAgIHVpSW5kZXgrKykgeworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUluZGV4XS5tX3BiQnVmZmVyID0gTlVMTDsKKwl9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorCVJldCA9IFZFdGhBZGRJbnN0YW5jZShwSW5pdFBhcmFtX3ApOworI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0RlbEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyBhbiBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBzdGF0ZQorCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsR3NJbml0OworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJUmV0ID0gRXBsVGltZXJIaWdoUmVza0RlbEluc3RhbmNlKCk7CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisJUmV0ID0gVkV0aERlbEluc3RhbmNlKCk7CisjZW5kaWYKKworCVJldCA9IEVkcnZTaHV0ZG93bigpOworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lCisvLworLy8gRGVzY3JpcHRpb246IGNyZWF0ZXMgdGhlIGJ1ZmZlciBmb3IgYSBUeCBmcmFtZSBhbmQgcmVnaXN0ZXJzIGl0IHRvIHRoZQorLy8gICAgICAgICAgICAgIGV0aGVybmV0IGRyaXZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwdWlIYW5kbGVfcCAgICAgICAgICAgICA9IE9VVDogaGFuZGxlIHRvIGZyYW1lIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHBwRnJhbWVfcCAgICAgICAgICAgICAgID0gT1VUOiBwb2ludGVyIHRvIHBvaW50ZXIgb2YgRVBMIGZyYW1lCisvLyAgICAgICAgICAgICAgcHVpRnJhbWVTaXplX3AgICAgICAgICAgPSBJTi9PVVQ6IHBvaW50ZXIgdG8gc2l6ZSBvZiBmcmFtZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgc2l6ZSBpcyBhbHdheXMgZXF1YWwgb3IgbGFyZ2VyIHRoYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBzaXplLCBpZiB0aGF0IGlzIG5vdCBwb3NzaWJsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZAorLy8gICAgICAgICAgICAgIE1zZ1R5cGVfcCAgICAgICAgICAgICAgID0gRVBMIG1lc3NhZ2UgdHlwZQorLy8gICAgICAgICAgICAgIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gU2VydmljZSBJRCBpbiBjYXNlIG9mIEFTbmQgZnJhbWUsIG90aGVyd2lzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VwbERsbEFzbmROb3REZWZpbmVkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDcmVhdGVUeEZyYW1lKHVuc2lnbmVkIGludCAqcHVpSGFuZGxlX3AsCisJCQkJdEVwbEZyYW1lICoqIHBwRnJhbWVfcCwKKwkJCQl1bnNpZ25lZCBpbnQgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCXRFcGxNc2dUeXBlIE1zZ1R5cGVfcCwKKwkJCQl0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZSAqcFR4RnJhbWU7CisJdW5zaWduZWQgaW50IHVpSGFuZGxlID0gRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzOworCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlciA9IE5VTEw7CisKKwlpZiAoTXNnVHlwZV9wID09IGtFcGxNc2dUeXBlQXNuZCkgeworCQkvLyBzZWFyY2ggZm9yIGZpeGVkIFR4IGJ1ZmZlcnMKKwkJaWYgKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSkgeworCQkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX0lERU5UUkVTOworCQl9IGVsc2UgaWYgKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UpIHsKKwkJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVM7CisJCX0gZWxzZSBpZiAoKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kTm10UmVxdWVzdCkKKwkJCSAgIHx8IChTZXJ2aWNlSWRfcCA9PSBrRXBsRGxsQXNuZE5tdENvbW1hbmQpKSB7CisJCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfTk1UUkVROworCQl9CisKKwkJaWYgKHVpSGFuZGxlID49IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lcykgewkvLyBsb29rIGZvciBmcmVlIGVudHJ5CisJCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfUFJFUTsKKwkJCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUhhbmRsZV07CisJCQlmb3IgKDsgdWlIYW5kbGUgPCBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTWF4VHhGcmFtZXM7CisJCQkgICAgIHVpSGFuZGxlKyssIHBUeEJ1ZmZlcisrKSB7CisJCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciA9PSBOVUxMKSB7CS8vIGZyZWUgZW50cnkgZm91bmQKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChNc2dUeXBlX3AgPT0ga0VwbE1zZ1R5cGVOb25FcGwpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX05PTkVQTDsKKwl9IGVsc2UgaWYgKE1zZ1R5cGVfcCA9PSBrRXBsTXNnVHlwZVByZXMpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX1BSRVM7CisJfSBlbHNlIGlmIChNc2dUeXBlX3AgPT0ga0VwbE1zZ1R5cGVTb2MpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX1NPQzsKKwl9IGVsc2UgaWYgKE1zZ1R5cGVfcCA9PSBrRXBsTXNnVHlwZVNvYSkgeworCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfU09BOworCX0gZWxzZSB7CQkvLyBsb29rIGZvciBmcmVlIGVudHJ5CisJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9QUkVROworCQlwVHhCdWZmZXIgPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVdOworCQlmb3IgKDsgdWlIYW5kbGUgPCBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTWF4VHhGcmFtZXM7CisJCSAgICAgdWlIYW5kbGUrKywgcFR4QnVmZmVyKyspIHsKKwkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgPT0gTlVMTCkgewkvLyBmcmVlIGVudHJ5IGZvdW5kCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CisJCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gdGVzdCBpZiByZXF1ZXN0ZWQgZW50cnkgaXMgZnJlZQorCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUhhbmRsZV07CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIGVudHJ5IGlzIG5vdCBmcmVlCisJCVJldCA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0dXAgVHggYnVmZmVyCisJcFR4QnVmZmVyLT5tX0VwbE1zZ1R5cGUgPSBNc2dUeXBlX3A7CisJcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuID0gKnB1aUZyYW1lU2l6ZV9wOworCisJUmV0ID0gRWRydkFsbG9jVHhNc2dCdWZmZXIocFR4QnVmZmVyKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJZ290byBFeGl0OworCX0KKwkvLyBiZWNhdXNlIGJ1ZmZlciBzaXplIG1heSBiZSBsYXJnZXIgdGhhbiByZXF1ZXN0ZWQKKwkvLyBtZW1vcml6ZSByZWFsIGxlbmd0aCBvZiBmcmFtZQorCXBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID0gKnB1aUZyYW1lU2l6ZV9wOworCisJLy8gZmlsbCB3aG9sZSBmcmFtZSB3aXRoIDAKKwlFUExfTUVNU0VUKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciwgMCwgcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuKTsKKworCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwlpZiAoTXNnVHlwZV9wICE9IGtFcGxNc2dUeXBlTm9uRXBsKSB7CS8vIGZpbGwgb3V0IEZyYW1lIG9ubHkgaWYgaXQgaXMgYW4gRVBMIGZyYW1lCisJCS8vIGV0aGVydHlwZQorCQlBbWlTZXRXb3JkVG9CZSgmcFR4RnJhbWUtPm1fYmVfd0V0aGVyVHlwZSwKKwkJCSAgICAgICBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCk7CisJCS8vIHNvdXJjZSBub2RlIElECisJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9sZV9iU3JjTm9kZUlkLAorCQkJICAgICAgIChCWVRFKSBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJICAgICAgIG1fdWlOb2RlSWQpOworCQkvLyBzb3VyY2UgTUFDIGFkZHJlc3MKKwkJRVBMX01FTUNQWSgmcFR4RnJhbWUtPm1fYmVfYWJTcmNNYWNbMF0sCisJCQkgICAmRXBsRGxsa0luc3RhbmNlX2cubV9iZV9hYlNyY01hY1swXSwgNik7CisJCXN3aXRjaCAoTXNnVHlwZV9wKSB7CisJCWNhc2Uga0VwbE1zZ1R5cGVBc25kOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX0FTTkQpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJc3dpdGNoIChTZXJ2aWNlSWRfcCkgeworCQkJY2FzZSBrRXBsRGxsQXNuZElkZW50UmVzcG9uc2U6CisJCQljYXNlIGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2U6CisJCQkJewkvLyBJZGVudFJlc3BvbnNlcyBhbmQgU3RhdHVzUmVzcG9uc2VzIGFyZSBCcm9hZGNhc3QKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX2JEc3ROb2RlSWQsCisJCQkJCQkgICAgICAgKEJZVEUpCisJCQkJCQkgICAgICAgRVBMX0NfQURSX0JST0FEQ0FTVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIEFTbmQgU2VydmljZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fbGVfYlNlcnZpY2VJZCwKKwkJCQkgICAgICAgU2VydmljZUlkX3ApOworCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsTXNnVHlwZVNvYzoKKwkJCS8vIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmcFR4RnJhbWUtPm1fYmVfYWJEc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0MpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFUExfQ19BRFJfQlJPQURDQVNUKTsKKwkJCS8vIHJlc2V0IEZsYWdzCisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29jLm1fbGVfYkZsYWcxLCAoQllURSkgMCk7CisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29jLm1fbGVfYkZsYWcyLCAoQllURSkgMCk7CisJCQlicmVhazsKKworCQljYXNlIGtFcGxNc2dUeXBlU29hOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQkvLyBkZXN0aW5hdGlvbiBub2RlIElECisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fbGVfYkRzdE5vZGVJZCwKKwkJCQkgICAgICAgKEJZVEUpIEVQTF9DX0FEUl9CUk9BRENBU1QpOworCQkJLy8gcmVzZXQgRmxhZ3MKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EubV9sZV9iRmxhZzEsIChCWVRFKSAwKTsKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EubV9sZV9iRmxhZzIsIChCWVRFKSAwKTsKKwkJCS8vIEVQTCBwcm9maWxlIHZlcnNpb24KKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLm1fbGVfYkVwbFZlcnNpb24sCisJCQkJICAgICAgIChCWVRFKSBFUExfU1BFQ19WRVJTSU9OKTsKKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbE1zZ1R5cGVQcmVzOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1BSRVMpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFUExfQ19BRFJfQlJPQURDQVNUKTsKKwkJCS8vIHJlc2V0IEZsYWdzCisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JGbGFnMSwgKEJZVEUpIDApOworCQkJLy9BbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iRmxhZzIsIChCWVRFKSAwKTsKKwkJCS8vIFBETyBzaXplCisJCQkvL0FtaVNldFdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplLCAwKTsKKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbE1zZ1R5cGVQcmVxOgorCQkJLy8gcmVzZXQgRmxhZ3MKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfYkZsYWcxLCAoQllURSkgMCk7CisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcS5tX2xlX2JGbGFnMiwgKEJZVEUpIDApOworCQkJLy8gUERPIHNpemUKKwkJCS8vQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfd1NpemUsIDApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCS8vIEVQTCBtZXNzYWdlIHR5cGUKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSwgKEJZVEUpIE1zZ1R5cGVfcCk7CisJfQorCisJKnBwRnJhbWVfcCA9IHBUeEZyYW1lOworCSpwdWlGcmFtZVNpemVfcCA9IHBUeEJ1ZmZlci0+bV91aU1heEJ1ZmZlckxlbjsKKwkqcHVpSGFuZGxlX3AgPSB1aUhhbmRsZTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrRGVsZXRlVHhGcmFtZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIHRoZSBidWZmZXIgZm9yIGEgVHggZnJhbWUgYW5kIGZyZWVzIGl0IGluIHRoZQorLy8gICAgICAgICAgICAgIGV0aGVybmV0IGRyaXZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUhhbmRsZV9wICAgICAgICAgICAgICA9IElOOiBoYW5kbGUgdG8gZnJhbWUgYnVmZmVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZWxldGVUeEZyYW1lKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKworCWlmICh1aUhhbmRsZV9wID49IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lcykgewkvLyBoYW5kbGUgaXMgbm90IHZhbGlkCisJCVJldCA9IGtFcGxEbGxJbGxlZ2FsSGRsOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFR4QnVmZmVyID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlX3BdOworCisJLy8gbWFyayBidWZmZXIgYXMgZnJlZSBzbyB0aGF0IGZyYW1lIHdpbGwgbm90IGJlIHNlbmQgaW4gZnV0dXJlIGFueW1vcmUKKwkvLyAkJCQgZC5rLiBXaGF0J3MgdXAgd2l0aCBydW5uaW5nIHRyYW5zbWlzc2lvbnM/CisJcFR4QnVmZmVyLT5tX3VpVHhNc2dMZW4gPSBFUExfRExMS19CVUZMRU5fRU1QVFk7CisJcFR4QnVmZmVyLT5tX3BiQnVmZmVyID0gTlVMTDsKKworCS8vIGRlbGV0ZSBUeCBidWZmZXIKKwlSZXQgPSBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyKHBUeEJ1ZmZlcik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlbGVhc2luZyBUeCBmcmFtZQorCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IHByb2Nlc3MgdGhlIHBhc3NlZCBldmVudAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCAgICAgICAgICAgICAgICA9IGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZSAqcFR4RnJhbWU7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemU7CisJQllURSBhYk11bHRpY2FzdE1hY1s2XTsKKwl0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBBc3luY1JlcVByaW9yaXR5OworCXVuc2lnbmVkIGludCB1aUZyYW1lQ291bnQ7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisjZW5kaWYKKworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa0NyZWF0ZToKKwkJeworCQkJLy8gJCQkIHJlc2V0IGV0aGVybmV0IGRyaXZlcgorCisJCQlObXRTdGF0ZSA9ICooKHRFcGxObXRTdGF0ZSAqKSBwRXZlbnRfcC0+bV9wQXJnKTsKKworCQkJLy8gaW5pdGlhbGl6ZSBmbGFncyBmb3IgUFJlcyBhbmQgU3RhdHVzUmVzCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JGbGFnMSA9IEVQTF9GUkFNRV9GTEFHMV9FQzsKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYk1uRmxhZzEgPSAwOworCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJLy8gaW5pdGlhbGl6ZSBsaW5rZWQgbm9kZSBsaXN0CisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BGaXJzdE5vZGVJbmZvID0gTlVMTDsKKyNlbmRpZgorCisJCQkvLyByZWdpc3RlciBUeEZyYW1lcyBpbiBFZHJ2CisKKwkJCS8vIElkZW50UmVzcG9uc2UKKwkJCXVpRnJhbWVTaXplID0gRVBMX0NfRExMX01JTlNJWkVfSURFTlRSRVM7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBFUEwgcHJvZmlsZSB2ZXJzaW9uCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UubV9sZV9iRXBsUHJvZmlsZVZlcnNpb24sCisJCQkJICAgICAgIChCWVRFKSBFUExfU1BFQ19WRVJTSU9OKTsKKwkJCS8vIEZlYXR1cmVGbGFncworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3RmVhdHVyZUZsYWdzLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQltX2R3RmVhdHVyZUZsYWdzKTsKKwkJCS8vIE1UVQorCQkJQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfd010dSwKKwkJCQkgICAgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX0RsbENvbmZpZ1BhcmFtLm1fdWlBc3luY010dSk7CisJCQkvLyBQb2xsSW5TaXplCisJCQlBbWlTZXRXb3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UubV9sZV93UG9sbEluU2l6ZSwKKwkJCQkgICAgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX0RsbENvbmZpZ1BhcmFtLgorCQkJCSAgICAgICBtX3VpUHJlcUFjdFBheWxvYWRMaW1pdCk7CisJCQkvLyBQb2xsT3V0U2l6ZQorCQkJQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfd1BvbGxPdXRTaXplLAorCQkJCSAgICAgICAoV09SRCkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgICAgIG1fdWlQcmVzQWN0UGF5bG9hZExpbWl0KTsKKwkJCS8vIFJlc3BvbnNlVGltZSAvIFByZXNNYXhMYXRlbmN5CisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdSZXNwb25zZVRpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCW1fZHdQcmVzTWF4TGF0ZW5jeSk7CisJCQkvLyBEZXZpY2VUeXBlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdEZXZpY2VUeXBlLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdEZXZpY2VUeXBlKTsKKwkJCS8vIFZlbmRvcklkCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdWZW5kb3JJZCwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3VmVuZG9ySWQpOworCQkJLy8gUHJvZHVjdENvZGUKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UubV9sZV9kd1Byb2R1Y3RDb2RlLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdQcm9kdWN0Q29kZSk7CisJCQkvLyBSZXZpc2lvbk51bWJlcgorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3UmV2aXNpb25OdW1iZXIsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1JldmlzaW9uTnVtYmVyKTsKKwkJCS8vIFNlcmlhbE51bWJlcgorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3U2VyaWFsTnVtYmVyLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdTZXJpYWxOdW1iZXIpOworCQkJLy8gVmVuZG9yU3BlY2lmaWNFeHQxCisJCQlBbWlTZXRRd29yZDY0VG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQkgIG1fSWRlbnRSZXNwb25zZS4KKwkJCQkJICBtX2xlX3F3VmVuZG9yU3BlY2lmaWNFeHQxLAorCQkJCQkgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJICBtX3F3VmVuZG9yU3BlY2lmaWNFeHQxKTsKKwkJCS8vIFZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlKTsKKwkJCS8vIFZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lKTsKKwkJCS8vIEFwcGxpY2F0aW9uU3dEYXRlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3QXBwbGljYXRpb25Td0RhdGUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0FwcGxpY2F0aW9uU3dEYXRlKTsKKwkJCS8vIEFwcGxpY2F0aW9uU3dUaW1lCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3QXBwbGljYXRpb25Td1RpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0FwcGxpY2F0aW9uU3dUaW1lKTsKKwkJCS8vIElQQWRkcmVzcworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3SXBBZGRyZXNzLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdJcEFkZHJlc3MpOworCQkJLy8gU3VibmV0TWFzaworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3U3VibmV0TWFzaywKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3U3VibmV0TWFzayk7CisJCQkvLyBEZWZhdWx0R2F0ZXdheQorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3RGVmYXVsdEdhdGV3YXksCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0RlZmF1bHRHYXRld2F5KTsKKwkJCS8vIEhvc3ROYW1lCisJCQlFUExfTUVNQ1BZKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfc0hvc3RuYW1lWzBdLAorCQkJCSAgICZFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJICAgbV9zSG9zdG5hbWVbMF0sCisJCQkJICAgc2l6ZW9mKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJICBtX3NIb3N0bmFtZSkpOworCQkJLy8gVmVuZG9yU3BlY2lmaWNFeHQyCisJCQlFUExfTUVNQ1BZKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfYWJWZW5kb3JTcGVjaWZpY0V4dDJbMF0sCisJCQkJICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkgICBtX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzBdLAorCQkJCSAgIHNpemVvZihFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCSAgbV9hYlZlbmRvclNwZWNpZmljRXh0MikpOworCisJCQkvLyBTdGF0dXNSZXNwb25zZQorCQkJdWlGcmFtZVNpemUgPSBFUExfQ19ETExfTUlOU0laRV9TVEFUVVNSRVM7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gUFJlcyAkJCQgbWF5YmUgbW92ZSB0aGlzIHRvIFBETyBtb2R1bGUKKwkJCWlmICgoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX2ZBc3luY09ubHkgPT0KKwkJCSAgICAgRkFMU0UpCisJCQkgICAgJiYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aVByZXNBY3RQYXlsb2FkTGltaXQgPj0gMzYpKSB7CS8vIGl0IGlzIG5vdCBjb25maWd1cmVkIGFzIGFzeW5jLW9ubHkgQ04sCisJCQkJLy8gc28gdGFrZSBwYXJ0IGluIGlzb2Nocm9ub3VzIHBoYXNlIGFuZCByZWdpc3RlciBQUmVzIGZyYW1lCisJCQkJdWlGcmFtZVNpemUgPQorCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCSAgICBtX3VpUHJlc0FjdFBheWxvYWRMaW1pdCArIDI0OworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJCSAmdWlGcmFtZVNpemUsCisJCQkJCQkJIGtFcGxNc2dUeXBlUHJlcywKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQkJCS8vIGluaXRpYWxseSBlbmNvZGUgVFBETyAtPiBpbmZvcm0gUERPIG1vZHVsZQorCQkJCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBUeEZyYW1lOworCQkJCUZyYW1lSW5mby5tX3VpRnJhbWVTaXplID0gdWlGcmFtZVNpemU7CisJCQkJUmV0ID0gRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisjZW5kaWYKKwkJCQkvLyByZXNldCBjeWNsZSBjb3VudGVyCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPSAwOworCQkJfSBlbHNlIHsJLy8gaXQgaXMgYW4gYXN5bmMtb25seSBDTgorCQkJCS8vIGZvb2wgRXBsRGxsa0NoYW5nZVN0YXRlKCkgdG8gdGhpbmsgdGhhdCBQUmVzIHdhcyBub3QgZXhwZWN0ZWQKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCA9IDE7CisJCQl9CisKKwkJCS8vIE5NVCByZXF1ZXN0CisJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0lQX01BWF9NVFU7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kTm10UmVxdWVzdCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBtYXJrIFR4IGJ1ZmZlciBhcyBlbXB0eQorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVdLm1fdWlUeE1zZ0xlbiA9CisJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCQkvLyBub24tRVBMIGZyYW1lCisJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0lQX01BWF9NVFU7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCSBrRXBsTXNnVHlwZU5vbkVwbCwKKwkJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZW1wdHkKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlXS5tX3VpVHhNc2dMZW4gPQorCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWTsKKworCQkJLy8gcmVnaXN0ZXIgbXVsdGljYXN0IE1BQ3MgaW4gZXRoZXJuZXQgZHJpdmVyCisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0MpOworCQkJUmV0ID0gRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfUFJFUyk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfQVNORCk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBsb2NhbCBub2RlIGlzIE1OCisJCQkJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwkJCQkvLyBTb0MKKwkJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0RMTF9NSU5TSVpFX1NPQzsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ3JlYXRlVHhGcmFtZSgmdWlIYW5kbGUsICZwVHhGcmFtZSwKKwkJCQkJCQkgJnVpRnJhbWVTaXplLAorCQkJCQkJCSBrRXBsTXNnVHlwZVNvYywKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBTb0EKKwkJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0RMTF9NSU5TSVpFX1NPQTsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ3JlYXRlVHhGcmFtZSgmdWlIYW5kbGUsICZwVHhGcmFtZSwKKwkJCQkJCQkgJnVpRnJhbWVTaXplLAorCQkJCQkJCSBrRXBsTXNnVHlwZVNvYSwKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJCWZvciAodWlJbmRleCA9IDA7CisJCQkJICAgICB1aUluZGV4IDwKKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pOworCQkJCSAgICAgdWlJbmRleCsrKSB7CisvLyAgICAgICAgICAgICAgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlJbmRleF0ubV91aU5vZGVJZCA9IHVpSW5kZXggKyAxOworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJICAgIG1fd1ByZXNQYXlsb2FkTGltaXQgPQorCQkJCQkgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9EbGxDb25maWdQYXJhbS4KKwkJCQkJICAgIG1fdWlJc29jaHJSeE1heFBheWxvYWQ7CisJCQkJfQorCisJCQkJLy8gY2FsY3VsYXRlIGN5Y2xlIGxlbmd0aAorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0ID0gMTAwMExMCisJCQkJICAgICoKKwkJCQkgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICBtX0RsbENvbmZpZ1BhcmFtLm1fZHdDeWNsZUxlbik7CisJCQl9CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwkJCVJldCA9IEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKCk7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRGVzdHJveToKKwkJeworCQkJLy8gZGVzdHJveSBhbGwgZGF0YSBzdHJ1Y3R1cmVzCisKKwkJCU5tdFN0YXRlID0gKigodEVwbE5tdFN0YXRlICopIHBFdmVudF9wLT5tX3BBcmcpOworCisJCQkvLyBkZWxldGUgVHggZnJhbWVzCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX0lERU5UUkVTKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFUyk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9QUkVTKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX05NVFJFUSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBsb2NhbCBub2RlIHdhcyBNTgorCQkJCXVuc2lnbmVkIGludCB1aUluZGV4OworCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9TT0MpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX1NPQSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJCWZvciAodWlJbmRleCA9IDA7CisJCQkJICAgICB1aUluZGV4IDwKKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pOworCQkJCSAgICAgdWlJbmRleCsrKSB7CisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYU5vZGVJbmZvW3VpSW5kZXhdLgorCQkJCQkgICAgbV9wUHJlcVR4QnVmZmVyICE9IE5VTEwpIHsKKwkJCQkJCXVpSGFuZGxlID0KKwkJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJCSAgICBtX3BQcmVxVHhCdWZmZXIgLQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyOworCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9hTm9kZUluZm9bdWlJbmRleF0uCisJCQkJCQkgICAgbV9wUHJlcVR4QnVmZmVyID0gTlVMTDsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0RlbGV0ZVR4RnJhbWUKKwkJCQkJCSAgICAodWlIYW5kbGUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJICAgIG1fd1ByZXNQYXlsb2FkTGltaXQgPSAweEZGRkY7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisJCQkvLyBkZXJlZ2lzdGVyIG11bHRpY2FzdCBNQUNzIGluIGV0aGVybmV0IGRyaXZlcgorCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09DKTsKKwkJCVJldCA9IEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQlSZXQgPSBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeShhYk11bHRpY2FzdE1hYyk7CisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9QUkVTKTsKKwkJCVJldCA9IEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX0FTTkQpOworCQkJUmV0ID0gRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCisJCQkvLyBkZWxldGUgdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCVJldCA9CisJCQkgICAgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQltX1RpbWVySGRsQ3ljbGUpOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRmlsbFR4OgorCQl7CisJCQkvLyBmaWxsIFR4QnVmZmVyIG9mIHNwZWNpZmllZCBwcmlvcml0eSB3aXRoIG5ldyBmcmFtZSBpZiBlbXB0eQorCisJCQlwVHhGcmFtZSA9IE5VTEw7CisJCQlBc3luY1JlcVByaW9yaXR5ID0KKwkJCSAgICAqKCh0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSAqKSBwRXZlbnRfcC0+bV9wQXJnKTsKKwkJCXN3aXRjaCAoQXN5bmNSZXFQcmlvcml0eSkgeworCQkJY2FzZSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OgkvLyBOTVQgcmVxdWVzdCBwcmlvcml0eQorCQkJCXsKKwkJCQkJcFR4QnVmZmVyID0KKwkJCQkJICAgICZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdOworCQkJCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gTm10UmVxdWVzdCBkb2VzIGV4aXN0CisJCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBlbXB0eSBhbmQgbm90IGJlaW5nIGZpbGxlZAorCQkJCQkJaWYgKHBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID09CisJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CisJCQkJCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZmlsbGluZyBpcyBpbiBwcm9jZXNzCisJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkgICAgbV91aVR4TXNnTGVuID0KKwkJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkc7CisJCQkJCQkJLy8gc2V0IG1heCBidWZmZXIgc2l6ZSBhcyBpbnB1dCBwYXJhbWV0ZXIKKwkJCQkJCQl1aUZyYW1lU2l6ZSA9CisJCQkJCQkJICAgIHBUeEJ1ZmZlci0+CisJCQkJCQkJICAgIG1fdWlNYXhCdWZmZXJMZW47CisJCQkJCQkJLy8gY29weSBmcmFtZSBmcm9tIHNoYXJlZCBsb29wIGJ1ZmZlciB0byBUeCBidWZmZXIKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lCisJCQkJCQkJICAgIChwVHhCdWZmZXItPgorCQkJCQkJCSAgICAgbV9wYkJ1ZmZlciwKKwkJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkgICAgIEFzeW5jUmVxUHJpb3JpdHkpOworCQkJCQkJCWlmIChSZXQgPT0KKwkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQkJcFR4RnJhbWUgPQorCQkJCQkJCQkgICAgKHRFcGxGcmFtZQorCQkJCQkJCQkgICAgICopCisJCQkJCQkJCSAgICBwVHhCdWZmZXItPgorCQkJCQkJCQkgICAgbV9wYkJ1ZmZlcjsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbERsbGtDaGVja0ZyYW1lCisJCQkJCQkJCSAgICAocFR4RnJhbWUsCisJCQkJCQkJCSAgICAgdWlGcmFtZVNpemUpOworCisJCQkJCQkJCS8vIHNldCBidWZmZXIgdmFsaWQKKwkJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbgorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgdWlGcmFtZVNpemU7CisJCQkJCQkJfSBlbHNlIGlmIChSZXQgPT0ga0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eSkgewkvLyBlbXB0eSBUeCBidWZmZXIgaXMgbm90IGEgcmVhbCBwcm9ibGVtCisJCQkJCQkJCS8vIHNvIGp1c3QgaWdub3JlIGl0CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZW1wdHkKKwkJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbgorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJCQl7CisJCQkJCXBUeEJ1ZmZlciA9CisJCQkJCSAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX3BUeEJ1ZmZlcgorCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXTsKKwkJCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgZW1wdHkgYW5kIG5vdCBiZWluZyBmaWxsZWQKKwkJCQkJCWlmIChwVHhCdWZmZXItPm1fdWlUeE1zZ0xlbiA9PQorCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgeworCQkJCQkJCS8vIG1hcmsgVHggYnVmZmVyIGFzIGZpbGxpbmcgaXMgaW4gcHJvY2VzcworCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbiA9CisJCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HOworCQkJCQkJCS8vIHNldCBtYXggYnVmZmVyIHNpemUgYXMgaW5wdXQgcGFyYW1ldGVyCisJCQkJCQkJdWlGcmFtZVNpemUgPQorCQkJCQkJCSAgICBwVHhCdWZmZXItPgorCQkJCQkJCSAgICBtX3VpTWF4QnVmZmVyTGVuOworCQkJCQkJCS8vIGNvcHkgZnJhbWUgZnJvbSBzaGFyZWQgbG9vcCBidWZmZXIgdG8gVHggYnVmZmVyCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0VHhGcmFtZQorCQkJCQkJCSAgICAocFR4QnVmZmVyLT4KKwkJCQkJCQkgICAgIG1fcGJCdWZmZXIsCisJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJICAgICBBc3luY1JlcVByaW9yaXR5KTsKKwkJCQkJCQlpZiAoUmV0ID09CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCQkJICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJICAgICAqKQorCQkJCQkJCQkgICAgcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxEbGxrQ2hlY2tGcmFtZQorCQkJCQkJCQkgICAgKHBUeEZyYW1lLAorCQkJCQkJCQkgICAgIHVpRnJhbWVTaXplKTsKKworCQkJCQkJCQkvLyBzZXQgYnVmZmVyIHZhbGlkCisJCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJCSAgICBtX3VpVHhNc2dMZW4KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIHVpRnJhbWVTaXplOworCQkJCQkJCX0gZWxzZSBpZiAoUmV0ID09IGtFcGxEbGxBc3luY1R4QnVmZmVyRW1wdHkpIHsJLy8gZW1wdHkgVHggYnVmZmVyIGlzIG5vdCBhIHJlYWwgcHJvYmxlbQorCQkJCQkJCQkvLyBzbyBqdXN0IGlnbm9yZSBpdAorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQkJCS8vIG1hcmsgVHggYnVmZmVyIGFzIGVtcHR5CisJCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJCSAgICBtX3VpVHhNc2dMZW4KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQpIHx8IChObXRTdGF0ZSA9PSBrRXBsTm10TXNCYXNpY0V0aGVybmV0KSkgewkvLyBzZW5kIGZyYW1lIGltbWVkaWF0ZWx5CisJCQkJaWYgKHBUeEZyYW1lICE9IE5VTEwpIHsJLy8gZnJhbWUgaXMgcHJlc2VudAorCQkJCQkvLyBwYWRkaW5nIGlzIGRvbmUgYnkgRWRydiBvciBldGhlcm5ldCBjb250cm9sbGVyCisJCQkJCVJldCA9IEVkcnZTZW5kVHhNc2cocFR4QnVmZmVyKTsKKwkJCQl9IGVsc2UgewkvLyBubyBmcmFtZSBtb3ZlZCB0byBUeEJ1ZmZlcgorCQkJCQkvLyBjaGVjayBpZiBUeEJ1ZmZlcnMgY29udGFpbiB1bnNlbnQgZnJhbWVzCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuID4gRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CS8vIE5NVCByZXF1ZXN0IFR4IGJ1ZmZlciBjb250YWlucyBhIGZyYW1lCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdKTsKKwkJCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV91aVR4TXNnTGVuID4gRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CS8vIG5vbi1FUEwgVHggYnVmZmVyIGNvbnRhaW5zIGEgZnJhbWUKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX05PTkVQTF0pOworCQkJCQl9CisJCQkJCWlmIChSZXQgPT0ga0VwbEludmFsaWRPcGVyYXRpb24pIHsJLy8gaWdub3JlIGVycm9yIGlmIGNhdXNlZCBieSBhbHJlYWR5IGFjdGl2ZSB0cmFuc21pc3Npb24KKwkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQl9CisJCQkJfQorCQkJCS8vIHJlc2V0IFBSZXMgZmxhZyAyCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvLyB1cGRhdGUgRmxhZyAyIChQUiwgUlMpCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0VHhDb3VudCgmQXN5bmNSZXFQcmlvcml0eSwKKwkJCQkJCQkgICAgICAmdWlGcmFtZUNvdW50KTsKKwkJCQlpZiAoQXN5bmNSZXFQcmlvcml0eSA9PSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10KSB7CS8vIG5vbi1lbXB0eSBGSUZPIHdpdGggaGlnaHRlc3QgcHJpb3JpdHkgaXMgZm9yIE5NVCByZXF1ZXN0cworCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA+IEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgewkvLyBOTVQgcmVxdWVzdCBUeCBidWZmZXIgY29udGFpbnMgYSBmcmFtZQorCQkJCQkJLy8gYWRkIG9uZSBtb3JlIGZyYW1lCisJCQkJCQl1aUZyYW1lQ291bnQrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8vIG5vbi1lbXB0eSBGSUZPIHdpdGggaGlnaGVzdCBwcmlvcml0eSBpcyBmb3IgZ2VuZXJpYyBmcmFtZXMKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS5tX3VpVHhNc2dMZW4gPiBFUExfRExMS19CVUZMRU5fRU1QVFkpIHsJLy8gTk1UIHJlcXVlc3QgVHggYnVmZmVyIGNvbnRhaW5zIGEgZnJhbWUKKwkJCQkJCS8vIHVzZSBOTVQgcmVxdWVzdCBGSUZPLCBiZWNhdXNlIG9mIGhpZ2hlciBwcmlvcml0eQorCQkJCQkJdWlGcmFtZUNvdW50ID0gMTsKKwkJCQkJCUFzeW5jUmVxUHJpb3JpdHkgPQorCQkJCQkJICAgIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ7CisJCQkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdLm1fdWlUeE1zZ0xlbiA+IEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgewkvLyBub24tRVBMIFR4IGJ1ZmZlciBjb250YWlucyBhIGZyYW1lCisJCQkJCQkvLyB1c2UgTk1UIHJlcXVlc3QgRklGTywgYmVjYXVzZSBvZiBoaWdoZXIgcHJpb3JpdHkKKwkJCQkJCS8vIGFkZCBvbmUgbW9yZSBmcmFtZQorCQkJCQkJdWlGcmFtZUNvdW50Kys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAodWlGcmFtZUNvdW50ID4gNykgewkvLyBsaW1pdCBmcmFtZSByZXF1ZXN0IHRvIHNlbmQgY291bnRlciB0byA3CisJCQkJCXVpRnJhbWVDb3VudCA9IDc7CisJCQkJfQorCQkJCWlmICh1aUZyYW1lQ291bnQgPiAwKSB7CisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYkZsYWcyID0KKwkJCQkJICAgIChCWVRFKSAoKChBc3luY1JlcVByaW9yaXR5IDw8CisJCQkJCQkgICAgICBFUExfRlJBTUVfRkxBRzJfUFJfU0hJRlQpCisJCQkJCQkgICAgICYgRVBMX0ZSQU1FX0ZMQUcyX1BSKQorCQkJCQkJICAgIHwgKHVpRnJhbWVDb3VudCAmCisJCQkJCQkgICAgICAgRVBMX0ZSQU1FX0ZMQUcyX1JTKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrU3RhcnRSZWR1Y2VkQ3ljbGU6CisJCXsKKwkJCS8vIHN0YXJ0IHRoZSByZWR1Y2VkIGN5Y2xlIGJ5IHByb2dyYW1taW5nIHRoZSBjeWNsZSB0aW1lcgorCQkJLy8gaXQgaXMgaXNzdWVkIGJ5IE5NVCBNTiBtb2R1bGUsIHdoZW4gUHJlT3AxIGlzIGVudGVyZWQKKworCQkJLy8gY2xlYXIgdGhlIGFzeW5jaHJvbm91cyBxdWV1ZXMKKwkJCVJldCA9IEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKCk7CisKKwkJCS8vIHJlc2V0IGN5Y2xlIGNvdW50ZXIgKGV2ZXJ5dGltZSBhIFNvQSBpcyB0cmlnZ2VyZCBpbiBQcmVPcDEgdGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQKKwkJCS8vIGFuZCB3aGVuIGl0IHJlYWNoZXMgRVBMX0NfRExMX1BSRU9QMV9TVEFSVF9DWUNMRVMgdGhlIFNvQSBtYXkgY29udGFpbiBpbnZpdGF0aW9ucykKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ID0gMDsKKworCQkJLy8gcmVtb3ZlIGFueSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQl3aGlsZSAoRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbyAhPSBOVUxMKSB7CisJCQkJRXBsRGxsa0RlbGV0ZU5vZGUoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fcEZpcnN0Tm9kZUluZm8tPm1fdWlOb2RlSWQpOworCQkJfQorCisJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8gTm9uQ3ljbGljLAorCQkJLy8gaGVuY2UgRXBsRGxsa0NoYW5nZVN0YXRlKCkgd2lsbCBub3QgaWdub3JlIHRoZSBuZXh0IGNhbGwKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsTXNOb25DeWNsaWM7CisKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IDApIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcworCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSwKKwkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgICBtX2R3QXN5bmNTbG90VGltZW91dCwKKwkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsIEZBTFNFKTsKKwkJCX0KKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa1ByZXNSZWFkeToKKwkJeworCQkJLy8gcG9zdCBQUmVzIHRvIHRyYW5zbWl0IEZJRk8KKworCQkJTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKworCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQpIHsKKwkJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU10ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFBSZXMgZG9lcyBleGlzdAorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXS4KKwkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCS8vIHVwZGF0ZSBmcmFtZSAoTk1UIHN0YXRlLCBSRCwgUlMsIFBSLCBNUywgRU4gZmxhZ3MpCisJCQkJCWlmIChObXRTdGF0ZSA8IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBOTVQgc3RhdGUgaXMgbm90IFByZU9wMiwgUmVhZHlUb09wIG9yIE9wCisJCQkJCQkvLyBmYWtlIE5NVCBzdGF0ZSBQcmVPcDIsIGJlY2F1c2UgUFJlcyB3aWxsIGJlIHNlbnQgb25seSBpbiBQcmVPcDIgb3IgZ3JlYXRlcgorCQkJCQkJTm10U3RhdGUgPQorCQkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJfQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgewkvLyBtYXJrIFBETyBhcyBpbnZhbGlkIGluIE5NVCBzdGF0ZSBPcAorCQkJCQkJLy8gJCQkIHJlc2V0IG9ubHkgUkQgZmxhZzsgc2V0IG90aGVyIGZsYWdzIGFwcHJvcHJpYXRlbHkKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX1ByZXMuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQkJfQorCQkJCQkvLyAkJCQgbWFrZSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgUHJlcywgU3RhdHVzUmVzCisJCQkJCS8vIG1hcmsgUFJlcyBmcmFtZSBhcyByZWFkeSBmb3IgdHJhbnNtaXNzaW9uCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2VHhNc2dSZWFkeSgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgbV9wVHhCdWZmZXIKKwkJCQkJCQkgICBbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJZGVmYXVsdDoKKwkJeworCQkJQVNTRVJUTVNHKEZBTFNFLAorCQkJCSAgIkVwbERsbGtQcm9jZXNzKCk6IHVuaGFuZGxlZCBldmVudCB0eXBlIVxuIik7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NvbmZpZworLy8KKy8vIERlc2NyaXB0aW9uOiBjb25maWd1cmUgcGFyYW1ldGVycyBvZiBETEwKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcERsbENvbmZpZ1BhcmFtX3AgICAgICAgPSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NvbmZpZyh0RXBsRGxsQ29uZmlnUGFyYW0gKiBwRGxsQ29uZmlnUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisvLyBkLmsuIGNoZWNrIG9mIE5NVCBzdGF0ZSBkaXNhYmxlZCwgYmVjYXVzZSBDeWNsZUxlbiBpcyBwcm9ncmFtbWVkIGF0IHJ1biB0aW1lIGJ5IE1OIHdpdGhvdXQgcmVzZXQgb2YgQ04KKy8qdEVwbE5tdFN0YXRlICAgIE5tdFN0YXRlOworCisgICAgTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKworICAgIGlmIChObXRTdGF0ZSA+IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikKKyAgICB7ICAgLy8gb25seSBhbGxvd2VkIGluIHN0YXRlIERMTF9HU19JTklUCisgICAgICAgIFJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorKi8KKwlFUExfTUVNQ1BZKCZFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLCBwRGxsQ29uZmlnUGFyYW1fcCwKKwkJICAgKHBEbGxDb25maWdQYXJhbV9wLT5tX3VpU2l6ZU9mU3RydWN0IDwKKwkJICAgIHNpemVvZih0RXBsRGxsQ29uZmlnUGFyYW0pID8gcERsbENvbmZpZ1BhcmFtX3AtPgorCQkgICAgbV91aVNpemVPZlN0cnVjdCA6IHNpemVvZih0RXBsRGxsQ29uZmlnUGFyYW0pKSk7CisKKwlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV9kd0N5Y2xlTGVuICE9IDApCisJICAgICYmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLm1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZSAhPSAwKSkgewkvLyBtb25pdG9yIEVQTCBjeWNsZSwgY2FsY3VsYXRlIGZyYW1lIHRpbWVvdXQKKwkJRXBsRGxsa0luc3RhbmNlX2cubV91bGxGcmFtZVRpbWVvdXQgPSAoMTAwMExMCisJCQkJCQkgICAgICAgKgorCQkJCQkJICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCUVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCW1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCQkJbV9kd0N5Y2xlTGVuKSkKKwkJICAgICsKKwkJICAgICgodW5zaWduZWQgbG9uZyBsb25nKUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCSAgICAgbV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlKTsKKwl9IGVsc2UgeworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCA9IDBMTDsKKwl9CisKKwlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX2ZBc3luY09ubHkgIT0gRkFMU0UpIHsJLy8gaXQgaXMgY29uZmlndXJlZCBhcyBhc3luYy1vbmx5IENOCisJCS8vIGRpc2FibGUgbXVsdGlwbGV4ZWQgY3ljbGUsIHRoYXQgbV91aUN5Y2xlQ291bnQgd2lsbCBub3QgYmUgaW5jcmVtZW50ZWQgc3B1cmlvdXNseSBvbiBTb0MKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID0gMDsKKwl9CisvL0V4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1NldElkZW50aXR5CisvLworLy8gRGVzY3JpcHRpb246IGNvbmZpZ3VyZSBpZGVudGl0eSBvZiBsb2NhbCBub2RlIGZvciBJZGVudFJlc3BvbnNlCisvLworLy8gUGFyYW1ldGVyczogIHBEbGxJZGVudFBhcmFtX3AgICAgICAgID0gaWRlbnRpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa1NldElkZW50aXR5KHRFcGxEbGxJZGVudFBhcmFtICogcERsbElkZW50UGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRVBMX01FTUNQWSgmRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLCBwRGxsSWRlbnRQYXJhbV9wLAorCQkgICAocERsbElkZW50UGFyYW1fcC0+bV91aVNpemVPZlN0cnVjdCA8CisJCSAgICBzaXplb2YodEVwbERsbElkZW50UGFyYW0pID8gcERsbElkZW50UGFyYW1fcC0+CisJCSAgICBtX3VpU2l6ZU9mU3RydWN0IDogc2l6ZW9mKHRFcGxEbGxJZGVudFBhcmFtKSkpOworCisJLy8gJCQkIGlmIElkZW50UmVzcG9uc2UgZnJhbWUgZXhpc3RzIHVwZGF0ZSBpdAorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1JlZ0FzeW5jSGFuZGxlcgorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlcnMgaGFuZGxlciBmb3Igbm9uLUVQTCBmcmFtZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuRGxsa0NiQXN5bmNfcCAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtSZWdBc3luY0hhbmRsZXIodEVwbERsbGtDYkFzeW5jIHBmbkRsbGtDYkFzeW5jX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BmbkNiQXN5bmMgPT0gTlVMTCkgewkvLyBubyBoYW5kbGVyIHJlZ2lzdGVyZWQgeWV0CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyA9IHBmbkRsbGtDYkFzeW5jX3A7CisJfSBlbHNlIHsJCS8vIGhhbmRsZXIgYWxyZWFkeSByZWdpc3RlcmVkCisJCVJldCA9IGtFcGxEbGxDYkFzeW5jUmVnaXN0ZXJlZDsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrRGVyZWdBc3luY0hhbmRsZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVyZWdpc3RlcnMgaGFuZGxlciBmb3Igbm9uLUVQTCBmcmFtZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuRGxsa0NiQXN5bmNfcCAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZXJlZ0FzeW5jSGFuZGxlcih0RXBsRGxsa0NiQXN5bmMgcGZuRGxsa0NiQXN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyA9PSBwZm5EbGxrQ2JBc3luY19wKSB7CS8vIHNhbWUgaGFuZGxlciBpcyByZWdpc3RlcmVkCisJCS8vIGRlcmVnaXN0ZXIgaXQKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9wZm5DYkFzeW5jID0gTlVMTDsKKwl9IGVsc2UgewkJLy8gd3JvbmcgaGFuZGxlciBvciBubyBoYW5kbGVyIHJlZ2lzdGVyZWQKKwkJUmV0ID0ga0VwbERsbENiQXN5bmNSZWdpc3RlcmVkOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyB0aGUgc3BlY2lmaWVkIG5vZGUgSUQgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkCisvLyAgICAgICAgICAgICAgQXNuZFNlcnZpY2VJZC4gSXQgcmVnaXN0ZXJzIENfRExMX01VTFRJQ0FTVF9BU05EIGluIGV0aGVybmV0CisvLyAgICAgICAgICAgICAgZHJpdmVyIGlmIGFueSBBc25kU2VydmljZUlkIGlzIG9wZW4uCisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gQVNuZCBTZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgRmlsdGVyX3AgICAgICAgICAgICAgICAgPSBub2RlIElEIGZpbHRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrU2V0QXNuZFNlcnZpY2VJZEZpbHRlcih0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkJIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoU2VydmljZUlkX3AgPCB0YWJlbnRyaWVzKEVwbERsbGtJbnN0YW5jZV9nLm1fYUFzbmRGaWx0ZXIpKSB7CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fYUFzbmRGaWx0ZXJbU2VydmljZUlkX3BdID0gRmlsdGVyX3A7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1NldEZsYWcxT2ZOb2RlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBGbGFnMSAoZm9yIFBSZXEgYW5kIFNvQSkgb2YgdGhlIHNwZWNpZmllZCBub2RlIElELgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBiU29hRmxhZzFfcCAgICAgICAgICAgICA9IGZsYWcxCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtTZXRGbGFnMU9mTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBOb2RlSW5mbzsKKworCXBOb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZF9wKTsKKwlpZiAocE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc3RvcmUgZmxhZzEgaW4gaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorCXBOb2RlSW5mby0+bV9iU29hRmxhZzEgPSBiU29hRmxhZzFfcDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrR2V0Rmlyc3ROb2RlSW5mbygpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgZmlyc3QgaW5mbyBzdHJ1Y3R1cmUgb2YgZmlyc3Qgbm9kZSBpbiBpc29jaHJvbm91cyBwaGFzZS4KKy8vICAgICAgICAgICAgICBJdCBpcyBvbmx5IHVzZWZ1bCBmb3IgRXJyb3JIYW5kbGVyayBtb2R1bGUuCisvLworLy8gUGFyYW1ldGVyczogIHBwTm9kZUluZm9fcCAgICAgICAgICAgID0gcG9pbnRlciB0byBwb2ludGVyIG9mIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0dldEZpcnN0Tm9kZUluZm8odEVwbERsbGtOb2RlSW5mbyAqKiBwcE5vZGVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCSpwcE5vZGVJbmZvX3AgPSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BGaXJzdE5vZGVJbmZvOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0FkZE5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGRzIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHBOb2RlSW5mb19wICAgICAgICAgICAgID0gcG9pbnRlciBvZiBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbERsbGtOb2RlSW5mbyAqcEludE5vZGVJbmZvOworCXRFcGxEbGxrTm9kZUluZm8gKipwcEludE5vZGVJbmZvOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemU7CisKKwlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8ocE5vZGVJbmZvX3AtPm1fdWlOb2RlSWQpOworCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJZ290byBFeGl0OworCX0KKworCUVQTF9ETExLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZSwKKwkJCQkgICAgICBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCwgMCk7CisKKwkvLyBjb3B5IG5vZGUgY29uZmlndXJhdGlvbgorCXBJbnROb2RlSW5mby0+bV9kd1ByZXNUaW1lb3V0ID0gcE5vZGVJbmZvX3AtPm1fZHdQcmVzVGltZW91dDsKKwlwSW50Tm9kZUluZm8tPm1fd1ByZXNQYXlsb2FkTGltaXQgPSBwTm9kZUluZm9fcC0+bV93UHJlc1BheWxvYWRMaW1pdDsKKworCS8vICQkJCBkLmsuOiBhY3R1YWxseSBhZGQgbm9kZSBvbmx5IGlmIE1OLiBPbiBDTiBpdCBpcyBzdWZmaWNpZW50IHRvIHVwZGF0ZSB0aGUgbm9kZSBjb25maWd1cmF0aW9uCisJaWYgKHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkID09IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyB3ZSBzaGFsbCBzZW5kIFBSZXMgb3Vyc2VsZgorCQkvLyBpbnNlcnQgb3VyIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorCQlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJCXdoaWxlICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkKKwkJICAgICAgICYmICgoKnBwSW50Tm9kZUluZm8pLT5tX3BOZXh0Tm9kZUluZm8gIT0gTlVMTCkpIHsKKwkJCXBwSW50Tm9kZUluZm8gPSAmKCpwcEludE5vZGVJbmZvKS0+bV9wTmV4dE5vZGVJbmZvOworCQl9CisJCWlmICgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKSB7CisJCQlpZiAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCA9PSBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCkgewkvLyBub2RlIHdhcyBhbHJlYWR5IGFkZGVkIHRvIGxpc3QKKwkJCQkvLyAkJCQgZC5rLiBtYXliZSB0aGlzIHNob3VsZCBiZSBhbiBlcnJvcgorCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSB7CS8vIGFkZCBvdXIgbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0CisJCQkJcHBJbnROb2RlSW5mbyA9CisJCQkJICAgICYoKnBwSW50Tm9kZUluZm8pLT5tX3BOZXh0Tm9kZUluZm87CisJCQl9CisJCX0KKwkJLy8gc2V0ICJQUmVxIi1UeEJ1ZmZlciB0byBQUmVzLVR4QnVmZmVyCisJCXBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyID0KKwkJICAgICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdOworCX0gZWxzZSB7CQkvLyBub3JtYWwgQ04gc2hhbGwgYmUgYWRkZWQgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJLy8gaW5zZXJ0IG5vZGUgaW50byBsaXN0IGluIGFzY2VuZGluZyBvcmRlcgorCQlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJCXdoaWxlICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkKKwkJICAgICAgICYmICgoKnBwSW50Tm9kZUluZm8pLT5tX3VpTm9kZUlkIDwKKwkJCSAgIHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkKQorCQkgICAgICAgJiYgKCgqcHBJbnROb2RlSW5mbyktPm1fdWlOb2RlSWQgIT0KKwkJCSAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkpIHsKKwkJCXBwSW50Tm9kZUluZm8gPSAmKCpwcEludE5vZGVJbmZvKS0+bV9wTmV4dE5vZGVJbmZvOworCQl9CisJCWlmICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkgJiYgKCgqcHBJbnROb2RlSW5mbyktPm1fdWlOb2RlSWQgPT0gcE5vZGVJbmZvX3AtPm1fdWlOb2RlSWQpKSB7CS8vIG5vZGUgd2FzIGFscmVhZHkgYWRkZWQgdG8gbGlzdAorCQkJLy8gJCQkIGQuay4gbWF5YmUgdGhpcyBzaG91bGQgYmUgYW4gZXJyb3IKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIGluaXRpYWxpemUgZWxlbWVudHMgb2YgaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorCXBJbnROb2RlSW5mby0+bV9iU29hRmxhZzEgPSAwOworCXBJbnROb2RlSW5mby0+bV9mU29mdERlbGV0ZSA9IEZBTFNFOworCXBJbnROb2RlSW5mby0+bV9ObXRTdGF0ZSA9IGtFcGxObXRDc05vdEFjdGl2ZTsKKwlpZiAocEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgPT0gTlVMTCkgewkvLyBjcmVhdGUgVHhCdWZmZXIgZW50cnkKKwkJdWlGcmFtZVNpemUgPSBwTm9kZUluZm9fcC0+bV93UHJlcVBheWxvYWRMaW1pdCArIDI0OworCQlSZXQgPQorCQkgICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUoJnVpSGFuZGxlLCAmcEZyYW1lLCAmdWlGcmFtZVNpemUsCisJCQkJCSBrRXBsTXNnVHlwZVByZXEsCisJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgPQorCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlXTsKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9sZV9iRHN0Tm9kZUlkLAorCQkJICAgICAgIChCWVRFKSBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCk7CisKKwkJLy8gc2V0IHVwIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJCUVQTF9NRU1DUFkocEZyYW1lLT5tX2JlX2FiRHN0TWFjLCBwSW50Tm9kZUluZm8tPm1fYmVfYWJNYWNBZGRyLAorCQkJICAgNik7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQl7CisJCQl0RXBsRnJhbWVJbmZvIEZyYW1lSW5mbzsKKworCQkJLy8gaW5pdGlhbGx5IGVuY29kZSBUUERPIC0+IGluZm9ybSBQRE8gbW9kdWxlCisJCQlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHVpRnJhbWVTaXplOworCQkJUmV0ID0gRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisJCX0KKyNlbmRpZgorCX0KKwlwSW50Tm9kZUluZm8tPm1fdWxEbGxFcnJvckV2ZW50cyA9IDBMOworCS8vIGFkZCBub2RlIHRvIGxpc3QKKwlwSW50Tm9kZUluZm8tPm1fcE5leHROb2RlSW5mbyA9ICpwcEludE5vZGVJbmZvOworCSpwcEludE5vZGVJbmZvID0gcEludE5vZGVJbmZvOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtEZWxldGVOb2RlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrRGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKwl0RXBsRGxsa05vZGVJbmZvICoqcHBJbnROb2RlSW5mbzsKKwl1bnNpZ25lZCBpbnQgdWlIYW5kbGU7CisKKwlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8odWlOb2RlSWRfcCk7CisJaWYgKHBJbnROb2RlSW5mbyA9PSBOVUxMKSB7CS8vIG5vIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgYXZhaWxhYmxlCisJCVJldCA9IGtFcGxEbGxOb05vZGVJbmZvOworCQlnb3RvIEV4aXQ7CisJfQorCisJRVBMX0RMTEtfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbEV2ZW50VHlwZURsbGtEZWxOb2RlLCB1aU5vZGVJZF9wLCAwKTsKKworCS8vIHNlYXJjaCBub2RlIGluIHdob2xlIGxpc3QKKwlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJd2hpbGUgKCgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKQorCSAgICAgICAmJiAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCAhPSB1aU5vZGVJZF9wKSkgeworCQlwcEludE5vZGVJbmZvID0gJigqcHBJbnROb2RlSW5mbyktPm1fcE5leHROb2RlSW5mbzsKKwl9CisJaWYgKCgqcHBJbnROb2RlSW5mbyA9PSBOVUxMKSB8fCAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCAhPSB1aU5vZGVJZF9wKSkgewkvLyBub2RlIHdhcyBub3QgZm91bmQgaW4gbGlzdAorCQkvLyAkJCQgZC5rLiBtYXliZSB0aGlzIHNob3VsZCBiZSBhbiBlcnJvcgorCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlbW92ZSBub2RlIGZyb20gbGlzdAorCSpwcEludE5vZGVJbmZvID0gcEludE5vZGVJbmZvLT5tX3BOZXh0Tm9kZUluZm87CisKKwlpZiAoKHBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyICE9IE5VTEwpCisJICAgICYmIChwSW50Tm9kZUluZm8tPm1fcFByZXFUeEJ1ZmZlciAhPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSkpIHsJLy8gZGVsZXRlIFR4QnVmZmVyIGVudHJ5CisJCXVpSGFuZGxlID0KKwkJICAgIHBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyIC0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyOworCQlwSW50Tm9kZUluZm8tPm1fcFByZXFUeEJ1ZmZlciA9IE5VTEw7CisJCVJldCA9IEVwbERsbGtEZWxldGVUeEZyYW1lKHVpSGFuZGxlKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrU29mdERlbGV0ZU5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbm9kZSBub3QgaW1tZWRpYXRlbHkgZnJvbSB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLyAgICAgICAgICAgICAgSW5zdGVhZCB0aGUgd2lsbCBiZSByZW1vdmVkIGFmdGVyIGVycm9yIChsYXRlL2xvc3MgUFJlcykgd2l0aG91dAorLy8gICAgICAgICAgICAgIGNoYXJnaW5nIHRoZSBlcnJvci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtTb2Z0RGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKworCXBJbnROb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZF9wKTsKKwlpZiAocEludE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCWdvdG8gRXhpdDsKKwl9CisKKwlFUExfRExMS19EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlLAorCQkJCSAgICAgIHVpTm9kZUlkX3AsIDApOworCisJcEludE5vZGVJbmZvLT5tX2ZTb2Z0RGVsZXRlID0gVFJVRTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2hhbmdlU3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hhbmdlIERMTCBzdGF0ZSBvbiBldmVudCBhbmQgZGlhZ25vc2Ugc29tZSBjb21tdW5pY2F0aW9uIGVycm9ycworLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRFdmVudF9wICAgICAgICAgICAgICA9IERMTCBldmVudCAod3JhcHBlZCBpbiBOTVQgZXZlbnQpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQ2hhbmdlU3RhdGUodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3AsCisJCQkJICAgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsRXJyb3JIYW5kbGVya0V2ZW50IERsbEV2ZW50OworCisJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzID0gMDsKKwlEbGxFdmVudC5tX3VpTm9kZUlkID0gMDsKKwlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGVfcDsKKworCXN3aXRjaCAoTm10U3RhdGVfcCkgeworCWNhc2Uga0VwbE5tdEdzT2ZmOgorCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjoKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCS8vIGVudGVyIERMTF9HU19JTklUCisJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsR3NJbml0OworCQlicmVhazsKKworCWNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQkvLyByZWR1Y2VkIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJaWYgKE5tdEV2ZW50X3AgPT0ga0VwbE5tdEV2ZW50RGxsQ2VTb2MpIHsJLy8gU29DIHJlY2VpdmVkCisJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9QUkVRCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFByZXE7CisJCX0gZWxzZSB7CisJCQkvLyBlbnRlciBETExfR1NfSU5JVAorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxHc0luaXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjoKKwljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCWNhc2Uga0VwbE5tdENzT3BlcmF0aW9uYWw6CisJCS8vIGZ1bGwgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCisJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQljYXNlIGtFcGxEbGxDc1dhaXRQcmVxOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQkJLy8gRExMX0NUMgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX1JFQ1ZEX1BSRVE7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRTb2E7CisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1Q4CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCWlmIChObXRTdGF0ZV9wID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBpZ25vcmUgZnJhbWUgdGltZW91dCBpbiBQcmVPcDIsCisJCQkJCS8vIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBjeWNsZSBsZW4KKwkJCQkJLy8gbWF5IGJlIHdyb25nLgorCQkJCQkvLyAyMDA4LzEwLzE1IGQuay4gSWYgaXQgd291bGQgbm90IGJlIGlnbm9yZWQsCisJCQkJCS8vIHdlIHdvdWxkIGdvIGN5Y2xpY2FsbHkgdG8gUHJlT3AxIGFuZCBvbiBuZXh0CisJCQkJCS8vIFNvQyBiYWNrIHRvIFByZU9wMi4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09DIGFuZCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BIHwKKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQkvLyBjaGVjayBpZiBtdWx0aXBsZXhlZCBhbmQgUFJlcSBzaG91bGQgaGF2ZSBiZWVuIHJlY2VpdmVkIGluIHRoaXMgY3ljbGUKKwkJCQkvLyBhbmQgaWYgPj0gTk1UX0NTX1JFQURZX1RPX09QRVJBVEUKKwkJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ID09IDApCisJCQkJICAgICYmIChObXRTdGF0ZV9wID49IGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlKSkgewkvLyByZXBvcnQgRExMX0NFVl9MT1NTX09GX1BSRVEKKwkJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1BSRVE7CisJCQkJfQorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUNworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbENzV2FpdFNvYzoKKwkJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQkJCS8vIERMTF9DVDEKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJLy8gc3RhcnQgb2YgY3ljbGUgYW5kIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfUFJFUQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPQorCQkJCSAgICBrRXBsRGxsQ3NXYWl0UHJlcTsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXM6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCWlmIChObXRTdGF0ZV9wID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBpZ25vcmUgZnJhbWUgdGltZW91dCBpbiBQcmVPcDIsCisJCQkJCS8vIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBjeWNsZSBsZW4KKwkJCQkJLy8gbWF5IGJlIHdyb25nLgorCQkJCQkvLyAyMDA4LzEwLzE1IGQuay4gSWYgaXQgd291bGQgbm90IGJlIGlnbm9yZWQsCisJCQkJCS8vIHdlIHdvdWxkIGdvIGN5Y2xpY2FsbHkgdG8gUHJlT3AxIGFuZCBvbiBuZXh0CisJCQkJCS8vIFNvQyBiYWNrIHRvIFByZU9wMi4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIGZhbGwgdGhyb3VnaAorCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlcToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0U29hOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCS8vIERMTF9DVDMKKwkJCQlpZiAoTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpIHsJLy8gaWdub3JlIGZyYW1lIHRpbWVvdXQgaW4gUHJlT3AyLAorCQkJCQkvLyBiZWNhdXNlIHRoZSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgY3ljbGUgbGVuCisJCQkJCS8vIG1heSBiZSB3cm9uZy4KKwkJCQkJLy8gMjAwOC8xMC8xNSBkLmsuIElmIGl0IHdvdWxkIG5vdCBiZSBpZ25vcmVkLAorCQkJCQkvLyB3ZSB3b3VsZCBnbyBjeWNsaWNhbGx5IHRvIFByZU9wMSBhbmQgb24gbmV4dAorCQkJCQkvLyBTb0MgYmFjayB0byBQcmVPcDIuCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBmYWxsIHRocm91Z2gKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MgYW5kIERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0EgfAorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQzsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDkKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0E7CisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9QUkVRCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJICAgIGtFcGxEbGxDc1dhaXRQcmVxOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUMTAKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbEdzSW5pdDoKKwkJCS8vIGVudGVyIERMTF9DU19XQUlUX1BSRVEKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0UHJlcTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJLy8gZnVsbCBFUEwgY3ljbGUgaXMgYWN0aXZlLCBidXQgd2l0aG91dCBQUmVxL1BSZXMKKworCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0UHJlcToKKwkJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQkJCS8vIERMTF9DVDIKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUOAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQyBhbmQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQSB8CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCS8vIE5NVF9DU19TVE9QUEVEIGFjdGl2ZQorCQkJCS8vIGl0IGlzIE9rIGlmIG5vIFBSZXEgd2FzIHJlY2VpdmVkCisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDcKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlQXNuZDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQTsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXM6CisJCQlkZWZhdWx0OgorCQkJCS8vIHJlbWFpbiBpbiB0aGlzIHN0YXRlCisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIGtFcGxEbGxDc1dhaXRTb2M6CisJCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJCQkvLyBETExfQ1QxCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJCS8vIHN0YXJ0IG9mIGN5Y2xlIGFuZCBpc29jaHJvbm91cyBwaGFzZQorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUNAorLy8gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQ6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0U29hOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQkJLy8gRExMX0NUMworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQyBhbmQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQSB8CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUOQorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQTsKKwkJCQkvLyByZW1haW4gaW4gRExMX0NTX1dBSVRfU09BCisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1QxMAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0E7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJCS8vIE5NVF9DU19TVE9QUEVEIGFjdGl2ZSBhbmQgd2UgZG8gbm90IGV4cGVjdCBhbnkgUFJlcQorCQkJCS8vIHNvIGp1c3QgaWdub3JlIGl0CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbEdzSW5pdDoKKwkJZGVmYXVsdDoKKwkJCS8vIGVudGVyIERMTF9DU19XQUlUX1BSRVEKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQlicmVhazsKKworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQkvLyByZWR1Y2VkIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgIT0ga0VwbERsbE1zTm9uQ3ljbGljKSB7CS8vIHN0b3AgY3ljbGUgdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCVJldCA9CisJCQkgICAgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQltX1RpbWVySGRsQ3ljbGUpOworI2VuZGlmCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbE1zTm9uQ3ljbGljOworCisJCQkvLyBzdG9wIGZ1cnRoZXIgcHJvY2Vzc2luZywKKwkJCS8vIGJlY2F1c2UgaXQgd2lsbCBiZSByZXN0YXJ0ZWQgYnkgTk1UIE1OIG1vZHVsZQorCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvY1RyaWc6CisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJewkvLyBiZWNhdXNlIG9mIHJlZHVjZWQgRVBMIGN5Y2xlIFNvQSBzaGFsbCBiZSB0cmlnZ2VyZWQsIG5vdCBTb0MKKwkJCQl0RXBsRGxsU3RhdGUgRHVtbXlEbGxTdGF0ZTsKKworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQKKwkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKworCQkJCS8vIGdvIGFoZWFkIGFuZCBzZW5kIFNvQQorCQkJCVJldCA9IEVwbERsbGtNblNlbmRTb2EoTm10U3RhdGVfcCwKKwkJCQkJCSAgICAgICAmRHVtbXlEbGxTdGF0ZSwKKwkJCQkJCSAgICAgICAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJbV91aUN5Y2xlQ291bnQgPj0KKwkJCQkJCQlFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUykpOworCQkJCS8vIGluY3JlbWVudCBjeWNsZSBjb3VudGVyIHRvIGRldGVjdCBpZiBFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUyBlbXB0eSBjeWNsZXMgYXJlIGVsYXBzZWQKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCsrOworCisJCQkJLy8gcmVwcm9ncmFtIHRpbWVyCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IDApIHsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zCisJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSwKKwkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0LAorCQkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsIEZBTFNFKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMjoKKwljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCS8vIGZ1bGwgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvY1RyaWc6CisJCQl7CisJCQkJLy8gdXBkYXRlIGN5Y2xlIGNvdW50ZXIKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID4gMCkgewkvLyBtdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPQorCQkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgbV91aU11bHRpcGxDeWNsZUNudDsKKwkJCQkJLy8gJCQkIGNoZWNrIG11bHRpcGxleGVkIGN5Y2xlIHJlc3RhcnQKKwkJCQkJLy8gICAgIC0+IHRvZ2dsZSBNQyBmbGFnCisJCQkJCS8vICAgICAtPiBjaGFuZ2Ugbm9kZSBsaW5rZWQgbGlzdAorCQkJCX0gZWxzZSB7CS8vIG5vbi1tdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJLy8gc3RhcnQgd2l0aCBmaXJzdCBub2RlIGluIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID0gTlVMTDsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJCQljYXNlIGtFcGxEbGxNc05vbkN5Y2xpYzoKKwkJCQkJewkvLyBzdGFydCBjb250aW51b3VzIGN5Y2xlIHRpbWVyCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9UaW1lckhkbEN5Y2xlLAorCQkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91bGxGcmFtZVRpbWVvdXQsCisJCQkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsCisJCQkJCQkgICAgIFRSVUUpOworI2VuZGlmCisJCQkJCQkvLyBjb250aW51ZSB3aXRoIHNlbmRpbmcgU29DCisJCQkJCX0KKworCQkJCWNhc2Uga0VwbERsbE1zV2FpdEFzbmQ6CisJCQkJY2FzZSBrRXBsRGxsTXNXYWl0U29jVHJpZzoKKwkJCQkJewkvLyBpZiBtX0xhc3RSZXFTZXJ2aWNlSWQgaXMgc3RpbGwgdmFsaWQsCisJCQkJCQkvLyBTb0Egd2FzIG5vdCBjb3JyZWN0bHkgYW5zd2VyZWQKKwkJCQkJCS8vIGFuZCB1c2VyIHBhcnQgaGFzIHRvIGJlIGluZm9ybWVkCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQKKwkJCQkJCSAgICAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkJCSAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKworCQkJCQkJLy8gc2VuZCBTb0MKKwkJCQkJCVJldCA9IEVwbERsbGtNblNlbmRTb2MoKTsKKworCQkJCQkJLy8gbmV3IERMTCBzdGF0ZQorCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJCQkgICAga0VwbERsbE1zV2FpdFByZXFUcmlnOworCisJCQkJCQkvLyBzdGFydCBXYWl0U29DUFJlcSBUaW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fVGltZXJIZGxSZXNwb25zZSwKKwkJCQkJCSAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCQkgICAgIG1fZHdXYWl0U29jUHJlcSwKKwkJCQkJCSAgICAgRXBsRGxsa0NiTW5UaW1lclJlc3BvbnNlLAorCQkJCQkJICAgICAwTCwgRkFMU0UpOworI2VuZGlmCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUgLyBjeWNsZSB0aW1lIGV4Y2VlZGVkCisJCQkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkJCSAgICBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEOworCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJCQkgICAga0VwbERsbE1zV2FpdFNvY1RyaWc7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsTWVQcmVzVGltZW91dDoKKwkJCXsKKworCQkJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQkJCWNhc2Uga0VwbERsbE1zV2FpdFByZXM6CisJCQkJCXsJLy8gUFJlcyBub3QgcmVjZWl2ZWQKKworCQkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvLT5tX2ZTb2Z0RGVsZXRlID09IEZBTFNFKSB7CS8vIG5vcm1hbCBpc29jaHJvbm91cyBDTgorCQkJCQkJCURsbEV2ZW50LgorCQkJCQkJCSAgICBtX3VsRGxsRXJyb3JFdmVudHMKKwkJCQkJCQkgICAgfD0KKwkJCQkJCQkgICAgRVBMX0RMTF9FUlJfTU5fQ05fTE9TU19QUkVTOworCQkJCQkJCURsbEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV9wQ3VyTm9kZUluZm8tPgorCQkJCQkJCSAgICBtX3VpTm9kZUlkOworCQkJCQkJfSBlbHNlIHsJLy8gQ04gc2hhbGwgYmUgZGVsZXRlZCBzb2Z0bHkKKwkJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkJICAgIGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCQkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCQkgICAga0VwbEV2ZW50VHlwZURsbGtTb2Z0RGVsTm9kZTsKKwkJCQkJCQkvLyAkJCQgZC5rLiBzZXQgRXZlbnQubV9OZXRUaW1lIHRvIGN1cnJlbnQgdGltZQorCQkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCQkgICAgc2l6ZW9mKHVuc2lnbmVkCisJCQkJCQkJCSAgIGludCk7CisJCQkJCQkJRXZlbnQubV9wQXJnID0KKwkJCQkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX3BDdXJOb2RlSW5mby0+CisJCQkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsRXZlbnRrUG9zdAorCQkJCQkJCSAgICAoJkV2ZW50KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gY29udGludWUgd2l0aCBzZW5kaW5nIG5leHQgUFJlcQorCQkJCQl9CisKKwkJCQljYXNlIGtFcGxEbGxNc1dhaXRQcmVxVHJpZzoKKwkJCQkJeworCQkJCQkJLy8gc2VuZCBuZXh0IFBSZXEKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa01uU2VuZFByZXEKKwkJCQkJCSAgICAoTm10U3RhdGVfcCwKKwkJCQkJCSAgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX0RsbFN0YXRlKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJCXsJLy8gd3JvbmcgRExMIHN0YXRlCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJeworCisJCQkJc3dpdGNoIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlKSB7CisJCQkJY2FzZSBrRXBsRGxsTXNXYWl0UHJlczoKKwkJCQkJewkvLyBQUmVzIHJlY2VpdmVkCisJCQkJCQkvLyBzZW5kIG5leHQgUFJlcQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxEbGxrTW5TZW5kUHJlcQorCQkJCQkJICAgIChObXRTdGF0ZV9wLAorCQkJCQkJICAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fRGxsU3RhdGUpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvYVRyaWc6CisJCQl7CisKKwkJCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJCQljYXNlIGtFcGxEbGxNc1dhaXRTb2FUcmlnOgorCQkJCQl7CS8vIE1OIFBSZXMgc2VudAorCQkJCQkJLy8gc2VuZCBTb0EKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa01uU2VuZFNvYShObXRTdGF0ZV9wLAorCQkJCQkJCQkgICAgICZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgICBtX0RsbFN0YXRlLAorCQkJCQkJCQkgICAgIFRSVUUpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQl7CS8vIEFTbmQgaGFzIGJlZW4gcmVjZWl2ZWQsIGJ1dCBpdCBtYXkgYmUgbm90IHRoZSByZXF1ZXN0ZWQgb25lCisvKgorICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgaWYgU29BIHdhcyBjb3JyZWN0bHkgYW5zd2VyZWQKKyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQpOworKi8KKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9PQorCQkJCSAgICBrRXBsRGxsTXNXYWl0QXNuZCkgeworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0KKwkJCQkJICAgIGtFcGxEbGxNc1dhaXRTb2NUcmlnOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzICE9IDApIHsJLy8gZXJyb3IgZXZlbnQgc2V0IC0+IHBvc3QgaXQgdG8gZXJyb3IgaGFuZGxlcgorCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtFcnJrOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxFcnJvcjsKKwkJLy8gJCQkIGQuay4gc2V0IEV2ZW50Lm1fTmV0VGltZSB0byBjdXJyZW50IHRpbWUKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoRGxsRXZlbnQpOworCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGZyb20gRWRydkludGVycnVwdEhhbmRsZXIoKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwUnhCdWZmZXJfcCAgICAgICAgICAgICA9IHJlY2VpdmUgYnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRXBsRGxsa0NiRnJhbWVSZWNlaXZlZCh0RWRydlJ4QnVmZmVyICogcFJ4QnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisJdEVwbE5tdEV2ZW50IE5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm9FdmVudDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEZyYW1lICpwVHhGcmFtZTsKKwl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXIgPSBOVUxMOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisJdEVwbERsbFJlcVNlcnZpY2VJZCBSZXFTZXJ2aWNlSWQ7CisJdW5zaWduZWQgaW50IHVpQXNuZFNlcnZpY2VJZDsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJQllURSBiRmxhZzE7CisKKwlCRU5DSE1BUktfTU9EXzAyX1NFVCgzKTsKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwUnhCdWZmZXJfcC0+bV9wYkJ1ZmZlcjsKKworI2lmIEVEUlZfRUFSTFlfUlhfSU5UICE9IEZBTFNFCisJc3dpdGNoIChwUnhCdWZmZXJfcC0+bV9CdWZmZXJJbkZyYW1lKSB7CisJY2FzZSBrRWRydkJ1ZmZlckZpcnN0SW5GcmFtZToKKwkJeworCQkJTXNnVHlwZSA9CisJCQkgICAgKHRFcGxNc2dUeXBlKSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPgorCQkJCQkJCSAgIG1fbGVfYk1lc3NhZ2VUeXBlKTsKKwkJCWlmIChNc2dUeXBlID09IGtFcGxNc2dUeXBlUHJlcSkgeworCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID09IGtFcGxEbGxDc1dhaXRQcmVxKSB7CS8vIFBSZXEgZXhwZWN0ZWQgYW5kIGFjdHVhbGx5IHJlY2VpdmVkCisJCQkJCS8vIGQuay46IFRoZSBjb25kaXRpb24gYWJvdmUgaXMgc3VmZmljZW50LCBiZWNhdXNlIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJCQkJLy8gICAgICAgYW5kIG5vIG5vbi1FUEwgZnJhbWUgc2hhbGwgYmUgcmVjZWl2ZWQgaW4gaXNvY2hyb25vdXMgcGhhc2UuCisJCQkJCS8vIHN0YXJ0IHRyYW5zbWlzc2lvbiBQUmVzCisJCQkJCS8vICQkJCBXaGF0IGlmIFR4IGJ1ZmZlciBpcyBpbnZhbGlkPworCQkJCQlwVHhCdWZmZXIgPQorCQkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXTsKKyNpZiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpCisJCQkJCVJldCA9IEVkcnZUeE1zZ1N0YXJ0KHBUeEJ1ZmZlcik7CisjZWxzZQorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUsIFJELCBSUywgUFIsIE1TLCBFTiBmbGFncykKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQlpZiAoTm10U3RhdGUgIT0ga0VwbE5tdENzT3BlcmF0aW9uYWwpIHsJLy8gbWFyayBQRE8gYXMgaW52YWxpZCBpbiBOTVQgc3RhdGUgT3AKKwkJCQkJCS8vICQkJCByZXNldCBvbmx5IFJEIGZsYWc7IHNldCBvdGhlciBmbGFncyBhcHByb3ByaWF0ZWx5CisJCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPgorCQkJCQkJCSAgICAgICBtX0RhdGEubV9QcmVzLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwgMCk7CisJCQkJCX0KKwkJCQkJLy8gJCQkIG1ha2UgZnVuY3Rpb24gdGhhdCB1cGRhdGVzIFByZXMsIFN0YXR1c1JlcworCQkJCQkvLyBzZW5kIFBSZXMgZnJhbWUKKwkJCQkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworI2VuZGlmCisJCQkJfQorCQkJfQorCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFZHJ2QnVmZmVyTWlkZGxlSW5GcmFtZToKKwkJeworCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFZHJ2QnVmZmVyTGFzdEluRnJhbWU6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisKKwlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBwUnhCdWZmZXJfcC0+bV91aVJ4TXNnTGVuOworCUZyYW1lSW5mby5tX05ldFRpbWUubV9kd05hbm9TZWMgPSBwUnhCdWZmZXJfcC0+bV9OZXRUaW1lLm1fZHdOYW5vU2VjOworCUZyYW1lSW5mby5tX05ldFRpbWUubV9kd1NlYyA9IHBSeEJ1ZmZlcl9wLT5tX05ldFRpbWUubV9kd1NlYzsKKworCWlmIChBbWlHZXRXb3JkRnJvbUJlKCZwRnJhbWUtPm1fYmVfd0V0aGVyVHlwZSkgIT0gRVBMX0NfRExMX0VUSEVSVFlQRV9FUEwpIHsJLy8gbm9uLUVQTCBmcmFtZQorCQkvL1RSQUNFMigiRXBsRGxsa0NiRnJhbWVSZWNlaXZlZDogcGZuQ2JBc3luYz0weCVwIFNyY01BQz0weCVsbHhcbiIsIEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYywgQW1pR2V0UXdvcmQ0OEZyb21CZShwRnJhbWUtPm1fYmVfYWJTcmNNYWMpKTsKKwkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyAhPSBOVUxMKSB7CS8vIGhhbmRsZXIgZm9yIGFzeW5jIGZyYW1lcyBpcyByZWdpc3RlcmVkCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BmbkNiQXN5bmMoJkZyYW1lSW5mbyk7CisJCX0KKworCQlnb3RvIEV4aXQ7CisJfQorCisJTXNnVHlwZSA9ICh0RXBsTXNnVHlwZSkgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSk7CisJc3dpdGNoIChNc2dUeXBlKSB7CisJY2FzZSBrRXBsTXNnVHlwZVByZXE6CisJCXsKKwkJCS8vIFBSZXEgZnJhbWUKKwkJCS8vIGQuay46ICh3ZSBhc3N1bWUgdGhhdCB0aGlzIFBSZXEgZnJhbWUgaXMgaW50ZW5kZWQgZm9yIHVzIGFuZCBkb24ndCBjaGVjayBEc3ROb2RlSWQpCisJCQlpZiAoQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQpICE9IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyB0aGlzIFBSZXEgaXMgbm90IGludGVuZGVkIGZvciB1cworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOworCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdE1zTm90QWN0aXZlKSB7CS8vIE1OIGlzIGFjdGl2ZSAtPiB3cm9uZyBtc2cgdHlwZQorCQkJCWJyZWFrOworCQkJfQorI2lmIEVEUlZfRUFSTFlfUlhfSU5UID09IEZBTFNFCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKSB7CS8vIHJlc3BvbmQgdG8gYW5kIHByb2Nlc3MgUFJlcSBmcmFtZXMgb25seSBpbiBQcmVPcDIsIFJlYWR5VG9PcCBhbmQgT3AKKwkJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQkJcFR4QnVmZmVyID0KKwkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdOworCQkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBQUmVzIGRvZXMgZXhpc3QKKyNpZiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpCisJCQkJCUVkcnZUeE1zZ1N0YXJ0KHBUeEJ1ZmZlcik7CisjZWxzZQorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUsIFJELCBSUywgUFIsIE1TLCBFTiBmbGFncykKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQliRmxhZzEgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgICBtX1ByZXEuCisJCQkJCQkJICAgICBtX2xlX2JGbGFnMSk7CisJCQkJCS8vIHNhdmUgRUEgZmxhZworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JNbkZsYWcxID0KKwkJCQkJICAgIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX2JNbkZsYWcxICYgfkVQTF9GUkFNRV9GTEFHMV9FQSkKKwkJCQkJICAgIHwgKGJGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMV9FQSk7CisJCQkJCS8vIHByZXNlcnZlIE1TIGZsYWcKKwkJCQkJYkZsYWcxICY9IEVQTF9GUkFNRV9GTEFHMV9NUzsKKwkJCQkJLy8gYWRkIEVOIGZsYWcgZnJvbSBFcnJvciBzaWduYWxpbmcgbW9kdWxlCisJCQkJCWJGbGFnMSB8PQorCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2JGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMV9FTjsKKwkJCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc09wZXJhdGlvbmFsKSB7CS8vIG1hcmsgUERPIGFzIGludmFsaWQgaW4gTk1UIHN0YXRlIE9wCisJCQkJCQkvLyByZXNldCBvbmx5IFJEIGZsYWcKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX1ByZXMuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLAorCQkJCQkJCSAgICAgICBiRmxhZzEpOworCQkJCQl9IGVsc2UgewkvLyBsZWF2ZSBSRCBmbGFnIHVudG91Y2hlZAorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fUHJlcy4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsCisJCQkJCQkJICAgICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJCSgmcFR4RnJhbWUtPgorCQkJCQkJCQkgbV9EYXRhLm1fUHJlcy4KKwkJCQkJCQkJIG1fbGVfYkZsYWcxKSAmCisJCQkJCQkJCUVQTF9GUkFNRV9GTEFHMV9SRCkKKwkJCQkJCQkgICAgICAgfCBiRmxhZzEpOworCQkJCQl9CisJCQkJCS8vICQkJCB1cGRhdGUgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSXyogY29kZQorCQkJCQkvLyBzZW5kIFBSZXMgZnJhbWUKKwkJCQkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKyNlbmRpZgorCQkJCX0KKyNlbmRpZgorCQkJCS8vIGluZm9ybSBQRE8gbW9kdWxlCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdENzUmVhZHlUb09wZXJhdGUpIHsJLy8gaW5mb3JtIFBETyBtb2R1bGUgb25seSBpbiBSZWFkeVRvT3AgYW5kIE9wCisJCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgeworCQkJCQkJLy8gcmVzZXQgUkQgZmxhZyBhbmQgYWxsIG90aGVyIGZsYWdzLCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIsIGJlY2F1c2UgdGhleSB3ZXJlIHByb2Nlc3NlZCBhYm92ZQorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLgorCQkJCQkJCSAgICAgICBtX1ByZXEuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQkJfQorCQkJCQkvLyBjb21wYXJlcyByZWFsIGZyYW1lIHNpemUgYW5kIFBETyBzaXplCisJCQkJCWlmICgodW5zaWduZWQKKwkJCQkJICAgICBpbnQpKEFtaUdldFdvcmRGcm9tTGUoJnBGcmFtZS0+CisJCQkJCQkJCSAgIG1fRGF0YS4KKwkJCQkJCQkJICAgbV9QcmVxLgorCQkJCQkJCQkgICBtX2xlX3dTaXplKSArCisJCQkJCQkgIDI0KQorCQkJCQkgICAgPiBGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSkgewkvLyBmb3JtYXQgZXJyb3IKKwkJCQkJCXRFcGxFcnJvckhhbmRsZXJrRXZlbnQgRGxsRXZlbnQ7CisKKwkJCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyA9CisJCQkJCQkgICAgRVBMX0RMTF9FUlJfSU5WQUxJRF9GT1JNQVQ7CisJCQkJCQlEbGxFdmVudC5tX3VpTm9kZUlkID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPgorCQkJCQkJCQkgICAgIG1fbGVfYlNyY05vZGVJZCk7CisJCQkJCQlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGU7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua0Vycms7CisJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkgICAga0VwbEV2ZW50VHlwZURsbEVycm9yOworCQkJCQkJRXZlbnQubV9OZXRUaW1lID0KKwkJCQkJCSAgICBGcmFtZUluZm8ubV9OZXRUaW1lOworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihEbGxFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvLyBmb3J3YXJkIFBSZXEgZnJhbWUgYXMgUlBETyB0byBQRE8gbW9kdWxlCisJCQkJCVJldCA9IEVwbFBkb2tDYlBkb1JlY2VpdmVkKCZGcmFtZUluZm8pOworCisJCQkJfQorI2lmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICE9IEZBTFNFKQorCQkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBQUmVzIGRvZXMgZXhpc3QKKwkJCQkJLy8gaW5mb3JtIFBETyBtb2R1bGUgYWJvdXQgUFJlcyBhZnRlciBQUmVxCisJCQkJCUZyYW1lSW5mby5tX3BGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPQorCQkJCQkgICAgcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisJCQkJfQorI2VuZGlmCisjZW5kaWYKKworI2lmIEVEUlZfRUFSTFlfUlhfSU5UID09IEZBTFNFCisJCQkJLy8gJCQkIGluZm9ybSBlbWVyZ2VuY3kgcHJvdG9jb2wgaGFuZGxpbmcgKGVycm9yIHNpZ25hbGluZyBtb2R1bGUpIGFib3V0IGZsYWdzCisJCQl9CisjZW5kaWYKKworCQkJLy8gcmVzZXQgY3ljbGUgY291bnRlcgorCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPSAwOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTXNnVHlwZVByZXM6CisJCXsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisJCQl0RXBsSGVhcnRiZWF0RXZlbnQgSGVhcnRiZWF0RXZlbnQ7CisjZW5kaWYKKworCQkJLy8gUFJlcyBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVByZXM7CisKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJiAoTm10U3RhdGUgPD0ga0VwbE5tdENzT3BlcmF0aW9uYWwpKSB7CS8vIHByb2Nlc3MgUFJlcyBmcmFtZXMgb25seSBpbiBQcmVPcDIsIFJlYWR5VG9PcCBhbmQgT3Agb2YgQ04KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8odWlOb2RlSWQpOworCQkJCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQkJCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9PSBrRXBsRGxsTXNXYWl0UHJlcykgewkvLyBvciBwcm9jZXNzIFBSZXMgZnJhbWVzIGluIE1zV2FpdFByZXMKKworCQkJCXBJbnROb2RlSW5mbyA9IEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvOworCQkJCWlmICgocEludE5vZGVJbmZvID09IE5VTEwpIHx8IChwSW50Tm9kZUluZm8tPm1fdWlOb2RlSWQgIT0gdWlOb2RlSWQpKSB7CS8vIGlnbm9yZSBQUmVzLCBiZWNhdXNlIGl0IGlzIGZyb20gd3JvbmcgQ04KKwkJCQkJLy8gJCQkIG1heWJlIHBvc3QgZXZlbnQgdG8gTm10TW4gbW9kdWxlCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gZm9yd2FyZCBGbGFnMiB0byBhc3luY2hyb25vdXMgc2NoZWR1bGVyCisJCQkJYkZsYWcxID0KKwkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICAgICBtX1BheWxvYWQubV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgbV9sZV9iRmxhZzIpOworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDYWxBc3luY1NldFBlbmRpbmdSZXF1ZXN0cyh1aU5vZGVJZCwKKwkJCQkJCQkJICAgICAgKCh0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSkgKChiRmxhZzEgJiBFUExfRlJBTUVfRkxBRzJfUFIpID4+IEVQTF9GUkFNRV9GTEFHMl9QUl9TSElGVCkpLCAoYkZsYWcxICYgRVBMX0ZSQU1FX0ZMQUcyX1JTKSk7CisKKyNlbmRpZgorCQkJfSBlbHNlIHsJLy8gaWdub3JlIFBSZXMsIGJlY2F1c2UgaXQgd2FzIHJlY2VpdmVkIGluIHdyb25nIE5NVCBzdGF0ZQorCQkJCS8vIGJ1dCBleGVjdXRlIEVwbERsbGtDaGFuZ2VTdGF0ZSgpIGFuZCBwb3N0IGV2ZW50IHRvIE5NVCBtb2R1bGUKKwkJCQlicmVhazsKKwkJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCXsJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQkJSGVhcnRiZWF0RXZlbnQubV93RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisJCQkJSGVhcnRiZWF0RXZlbnQubV9ObXRTdGF0ZSA9CisJCQkJICAgICh0RXBsTm10U3RhdGUpIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgIG1fbGVfYk5tdFN0YXR1cykgfAorCQkJCQkJICAgIEVQTF9OTVRfVFlQRV9DUyk7CisJCQkJaWYgKHBJbnROb2RlSW5mby0+bV9ObXRTdGF0ZSAhPSBIZWFydGJlYXRFdmVudC5tX05tdFN0YXRlKSB7CS8vIE5NVCBzdGF0ZSBvZiBDTiBoYXMgY2hhbmdlZCAtPiBwb3N0IGV2ZW50IHRvIE5tdE1udSBtb2R1bGUKKwkJCQkJaWYgKHBJbnROb2RlSW5mby0+bV9mU29mdERlbGV0ZSA9PSBGQUxTRSkgewkvLyBub3JtYWwgaXNvY2hyb25vdXMgQ04KKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJICAgIHVpTm9kZUlkOworCQkJCQkJRXZlbnQubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtObXRNbnU7CisJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkgICAga0VwbEV2ZW50VHlwZUhlYXJ0YmVhdDsKKwkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCSAgICBzaXplb2YoSGVhcnRiZWF0RXZlbnQpOworCQkJCQkJRXZlbnQubV9wQXJnID0gJkhlYXJ0YmVhdEV2ZW50OworCQkJCQl9IGVsc2UgewkvLyBDTiBzaGFsbCBiZSBkZWxldGVkIHNvZnRseQorCQkJCQkJRXZlbnQubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCQkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkJICAgIGtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGU7CisJCQkJCQlFdmVudC5tX3VpU2l6ZSA9CisJCQkJCQkgICAgc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPQorCQkJCQkJICAgICZwSW50Tm9kZUluZm8tPm1fdWlOb2RlSWQ7CisJCQkJCX0KKwkJCQkJRXZlbnQubV9OZXRUaW1lID0gRnJhbWVJbmZvLm1fTmV0VGltZTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisJCQkJCS8vIHNhdmUgY3VycmVudCBOTVQgc3RhdGUgb2YgQ04gaW4gaW50ZXJuYWwgbm9kZSBzdHJ1Y3R1cmUKKwkJCQkJcEludE5vZGVJbmZvLT5tX05tdFN0YXRlID0KKwkJCQkJICAgIEhlYXJ0YmVhdEV2ZW50Lm1fTm10U3RhdGU7CisJCQkJfQorCQkJfQorI2VuZGlmCisKKwkJCS8vIGluZm9ybSBQRE8gbW9kdWxlCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCWlmICgoTm10U3RhdGUgIT0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKQorCQkJICAgICYmIChObXRTdGF0ZSAhPSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpKSB7CS8vIGluZm9ybSBQRE8gbW9kdWxlIG9ubHkgaW4gUmVhZHlUb09wIGFuZCBPcAorCQkJCS8vIGNvbXBhcmUgcmVhbCBmcmFtZSBzaXplIGFuZCBQRE8gc2l6ZT8KKwkJCQlpZiAoKCh1bnNpZ25lZAorCQkJCSAgICAgIGludCkoQW1pR2V0V29yZEZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgIG1fUHJlcy5tX2xlX3dTaXplKSArCisJCQkJCSAgIDI0KQorCQkJCSAgICAgPiBGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSkKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkJICAgIHx8CisJCQkJICAgIChBbWlHZXRXb3JkRnJvbUxlCisJCQkJICAgICAoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplKSA+CisJCQkJICAgICBwSW50Tm9kZUluZm8tPm1fd1ByZXNQYXlsb2FkTGltaXQpCisjZW5kaWYKKwkJCQkgICAgKSB7CS8vIGZvcm1hdCBlcnJvcgorCQkJCQl0RXBsRXJyb3JIYW5kbGVya0V2ZW50IERsbEV2ZW50OworCisJCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyA9CisJCQkJCSAgICBFUExfRExMX0VSUl9JTlZBTElEX0ZPUk1BVDsKKwkJCQkJRGxsRXZlbnQubV91aU5vZGVJZCA9IHVpTm9kZUlkOworCQkJCQlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGU7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0Vycms7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVEbGxFcnJvcjsKKwkJCQkJRXZlbnQubV9OZXRUaW1lID0gRnJhbWVJbmZvLm1fTmV0VGltZTsKKwkJCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoRGxsRXZlbnQpOworCQkJCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICgoTm10U3RhdGUgIT0ga0VwbE5tdENzT3BlcmF0aW9uYWwpCisJCQkJICAgICYmIChObXRTdGF0ZSAhPSBrRXBsTm10TXNPcGVyYXRpb25hbCkpIHsKKwkJCQkJLy8gcmVzZXQgUkQgZmxhZyBhbmQgYWxsIG90aGVyIGZsYWdzLCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIsIGJlY2F1c2UgdGhleSB3ZXJlIHByb2Nlc3NlZCBhYm92ZQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQl9CisJCQkJUmV0ID0gRXBsUGRva0NiUGRvUmVjZWl2ZWQoJkZyYW1lSW5mbyk7CisJCQl9CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVTb2M6CisJCXsKKwkJCS8vIFNvQyBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVNvYzsKKworCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBhY3RpdmUgLT4gd3JvbmcgbXNnIHR5cGUKKwkJCQlicmVhazsKKwkJCX0KKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICE9IEZBTFNFCisJCQkvLyBwb3N0IFBSZXMgdG8gdHJhbnNtaXQgRklGTyBvZiB0aGUgZXRoZXJuZXQgY29udHJvbGxlciwgYnV0IGRvbid0IHN0YXJ0CisJCQkvLyB0cmFuc21pc3Npb24gb3ZlciBidXMKKwkJCXBUeEJ1ZmZlciA9CisJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJICAgIG1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU107CisJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gUFJlcyBkb2VzIGV4aXN0CisJCQkJcFR4RnJhbWUgPSAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkvLyB1cGRhdGUgZnJhbWUgKE5NVCBzdGF0ZSwgUkQsIFJTLCBQUiwgTVMsIEVOIGZsYWdzKQorCQkJCWlmIChObXRTdGF0ZSA8IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBOTVQgc3RhdGUgaXMgbm90IFByZU9wMiwgUmVhZHlUb09wIG9yIE9wCisJCQkJCS8vIGZha2UgTk1UIHN0YXRlIFByZU9wMiwgYmVjYXVzZSBQUmVzIHdpbGwgYmUgc2VudCBvbmx5IGluIFByZU9wMiBvciBncmVhdGVyCisJCQkJCU5tdFN0YXRlID0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOworCQkJCX0KKwkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJICAgICAgIG1fbGVfYkZsYWcyLAorCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIpOworCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgewkvLyBtYXJrIFBETyBhcyBpbnZhbGlkIGluIE5NVCBzdGF0ZSBPcAorCQkJCQkvLyAkJCQgcmVzZXQgb25seSBSRCBmbGFnOyBzZXQgb3RoZXIgZmxhZ3MgYXBwcm9wcmlhdGVseQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsIDApOworCQkJCX0KKwkJCQkvLyAkJCQgbWFrZSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgUHJlcywgU3RhdHVzUmVzCisJCQkJLy8gbWFyayBQUmVzIGZyYW1lIGFzIHJlYWR5IGZvciB0cmFuc21pc3Npb24KKwkJCQlSZXQgPSBFZHJ2VHhNc2dSZWFkeShwVHhCdWZmZXIpOworCQkJfQorI2VuZGlmCisKKwkJCWlmIChObXRTdGF0ZSA+PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpIHsJLy8gU29DIGZyYW1lcyBvbmx5IGluIFByZU9wMiwgUmVhZHlUb09wIGFuZCBPcAorCQkJCS8vIHRyaWdnZXIgc3luY2hyb25vdXMgdGFzaworCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1N5bmM7CisJCQkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlU3luYzsKKwkJCQlFdmVudC5tX3VpU2l6ZSA9IDA7CisJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisJCQkJLy8gdXBkYXRlIGN5Y2xlIGNvdW50ZXIKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID4gMCkgewkvLyBtdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPQorCQkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgbV91aU11bHRpcGxDeWNsZUNudDsKKwkJCQl9CisJCQl9CisJCQkvLyByZXByb2dyYW0gdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCAhPSAwKSB7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnMKKwkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUsCisJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCwKKwkJCQkgICAgIEVwbERsbGtDYkNuVGltZXIsIDBMLCBGQUxTRSk7CisJCQl9CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVTb2E6CisJCXsKKwkJCS8vIFNvQSBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVNvYTsKKworCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBhY3RpdmUgLT4gd3JvbmcgbXNnIHR5cGUKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFR4RnJhbWUgPSBOVUxMOworCisJCQlpZiAoKE5tdFN0YXRlICYgRVBMX05NVF9TVVBFUlNUQVRFX01BU0spICE9IEVQTF9OTVRfQ1NfRVBMTU9ERSkgewkvLyBkbyBub3QgcmVzcG9uZCwgaWYgTk1UIHN0YXRlIGlzIDwgUHJlT3AxIChpLmUuIG5vdCBFUExfTU9ERSkKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIGNoZWNrIFRhcmdldE5vZGVJZAorCQkJdWlOb2RlSWQgPQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCQkgICAgIG1fbGVfYlJlcVNlcnZpY2VUYXJnZXQpOworCQkJaWYgKHVpTm9kZUlkID09IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyBsb2NhbCBub2RlIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdAorCisJCQkJLy8gY2hlY2sgU2VydmljZUlkCisJCQkJUmVxU2VydmljZUlkID0KKwkJCQkgICAgKHRFcGxEbGxSZXFTZXJ2aWNlSWQpCisJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCQkJICAgICBtX2xlX2JSZXFTZXJ2aWNlSWQpOworCQkJCWlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VTdGF0dXMpIHsJLy8gU3RhdHVzUmVxdWVzdAorCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBTdGF0dXNSZXMgZG9lcyBleGlzdAorCisJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkgICAgKHRFcGxGcmFtZSAqKQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXS4KKwkJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkJLy8gdXBkYXRlIFN0YXR1c1JlcyBmcmFtZSAoTk1UIHN0YXRlLCBFTiwgRUMsIFJTLCBQUiBmbGFncykKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICAgIG1fYkZsYWcxKTsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkJICAgICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCQkvLyBzZW5kIFN0YXR1c1JlcworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoOCk7CisKKwkJCQkJCS8vIHVwZGF0ZSBlcnJvciBzaWduYWxpbmcKKwkJCQkJCWJGbGFnMSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT4KKwkJCQkJCQkJICAgICBtX0RhdGEuCisJCQkJCQkJCSAgICAgbV9Tb2EuCisJCQkJCQkJCSAgICAgbV9sZV9iRmxhZzEpOworCQkJCQkJaWYgKCgoYkZsYWcxIF4gRXBsRGxsa0luc3RhbmNlX2cubV9iTW5GbGFnMSkgJiBFUExfRlJBTUVfRkxBRzFfRVIpICE9IDApIHsJLy8gZXhjZXB0aW9uIHJlc2V0IGZsYWcgd2FzIGNoYW5nZWQgYnkgTU4KKwkJCQkJCQkvLyBhc3N1bWUgc2FtZSBzdGF0ZSBmb3IgRUMgaW4gbmV4dCBjeWNsZSAoY2xlYXIgYWxsIG90aGVyIGJpdHMpCisJCQkJCQkJaWYgKChiRmxhZzEgJgorCQkJCQkJCSAgICAgRVBMX0ZSQU1FX0ZMQUcxX0VSKQorCQkJCQkJCSAgICAhPSAwKSB7CisJCQkJCQkJCS8vIHNldCBFQyBhbmQgcmVzZXQgcmVzdAorCQkJCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgIG1fYkZsYWcxID0KKwkJCQkJCQkJICAgIEVQTF9GUkFNRV9GTEFHMV9FQzsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyByZXNldCBjb21wbGV0ZSBmbGFnIDEgKGluY2x1ZGluZyBFQyBhbmQgRU4pCisJCQkJCQkJCUVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9iRmxhZzEgPQorCQkJCQkJCQkgICAgMDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBzYXZlIGZsYWcgMSBmcm9tIE1OIGZvciBTdGF0dXMgcmVxdWVzdCByZXNwb25zZSBjeWNsZQorCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iTW5GbGFnMSA9CisJCQkJCQkgICAgYkZsYWcxOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VJZGVudCkgewkvLyBJZGVudFJlcXVlc3QKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfSURFTlRSRVNdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBJZGVudFJlcyBkb2VzIGV4aXN0CisJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkgICAgKHRFcGxGcmFtZSAqKQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfSURFTlRSRVNdLgorCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQkvLyB1cGRhdGUgSWRlbnRSZXMgZnJhbWUgKE5NVCBzdGF0ZSwgUlMsIFBSIGZsYWdzKQorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UuCisJCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlKTsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICAgIG1fYkZsYWcyKTsKKwkJCQkJCS8vIHNlbmQgSWRlbnRSZXMKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX0lERU5UUkVTXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZU5tdFJlcXVlc3QpIHsJLy8gTm10UmVxdWVzdAorCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBObXRSZXF1ZXN0IGRvZXMgZXhpc3QKKwkJCQkJCS8vIGNoZWNrIGlmIGZyYW1lIGlzIG5vdCBlbXB0eSBhbmQgbm90IGJlaW5nIGZpbGxlZAorCQkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS4KKwkJCQkJCSAgICBtX3VpVHhNc2dMZW4gPgorCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HKSB7CisJCQkJCQkJLyppZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA8IEVQTF9ETExLX0JVRkxFTl9NSU4pCisJCQkJCQkJICAgeyAgIC8vIHBhZCBmcmFtZQorCQkJCQkJCSAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS5tX3VpVHhNc2dMZW4gPSBFUExfRExMS19CVUZMRU5fTUlOOworCQkJCQkJCSAgIH0gKi8KKwkJCQkJCQkvLyBtZW1vcml6ZSB0cmFuc21pc3Npb24KKwkJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkJICAgICh0RXBsRnJhbWUgKikgMTsKKwkJCQkJCQkvLyBzZW5kIE5tdFJlcXVlc3QKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXSk7CisJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCX0KKworCQkJCX0gZWxzZSBpZiAoUmVxU2VydmljZUlkID09IGtFcGxEbGxSZXFTZXJ2aWNlVW5zcGVjaWZpZWQpIHsJLy8gdW5zcGVjaWZpZWQgaW52aXRlCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgbm90IGVtcHR5IGFuZCBub3QgYmVpbmcgZmlsbGVkCisJCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdLgorCQkJCQkJICAgIG1fdWlUeE1zZ0xlbiA+CisJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcpIHsKKwkJCQkJCQkvKmlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuIDwgRVBMX0RMTEtfQlVGTEVOX01JTikKKwkJCQkJCQkgICB7ICAgLy8gcGFkIGZyYW1lCisJCQkJCQkJICAgRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA9IEVQTF9ETExLX0JVRkxFTl9NSU47CisJCQkJCQkJICAgfSAqLworCQkJCQkJCS8vIG1lbW9yaXplIHRyYW5zbWlzc2lvbgorCQkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCQkgICAgKHRFcGxGcmFtZSAqKSAxOworCQkJCQkJCS8vIHNlbmQgbm9uLUVQTCBmcmFtZQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdKTsKKwkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfSBlbHNlIGlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VObykgewkvLyBubyBhc3luYyBzZXJ2aWNlIHJlcXVlc3RlZCAtPiBkbyBub3RoaW5nCisJCQkJfQorCQkJfQorI2lmIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgIT0gRkFMU0UKKwkJCWlmIChwVHhGcmFtZSA9PSBOVUxMKSB7CS8vIHNpZ25hbCBwcm9jZXNzIGZ1bmN0aW9uIHJlYWRpbmVzcyBvZiBQUmVzIGZyYW1lCisJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrUHJlc1JlYWR5OworCQkJCUV2ZW50Lm1fdWlTaXplID0gMDsKKwkJCQlFdmVudC5tX3BBcmcgPSBOVUxMOworCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCX0KKyNlbmRpZgorCisJCQkvLyBpbmZvcm0gUERPIG1vZHVsZQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisvLyAgICAgICAgICAgIFJldCA9IEVwbFBkb2tDYlNvYSgmRnJhbWVJbmZvKTsKKyNlbmRpZgorCisJCQkvLyAkJCQgcHV0IFNyY05vZGVJZCwgTk1UIHN0YXRlIGFuZCBOZXRUaW1lIGFzIEhlYXJ0YmVhdEV2ZW50IGludG8gZXZlbnRxdWV1ZQorCisJCQkvLyAkJCQgaW5mb3JtIGVtZXJnZW5jeSBwcm90b2NvbCBoYW5kbGluZyBhYm91dCBmbGFncworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVBc25kOgorCQl7CisJCQkvLyBBU25kIGZyYW1lCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudERsbENlQXNuZDsKKworCQkJLy8gQVNuZCBzZXJ2aWNlIHJlZ2lzdGVyZWQ/CisJCQl1aUFzbmRTZXJ2aWNlSWQgPQorCQkJICAgICh1bnNpZ25lZCBpbnQpQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgbV9Bc25kLgorCQkJCQkJCSAgIG1fbGVfYlNlcnZpY2VJZCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPj0ga0VwbERsbE1zTm9uQ3ljbGljKQorCQkJICAgICYmCisJCQkgICAgKCgoKHRFcGxEbGxBc25kU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpID09CisJCQkgICAgICBrRXBsRGxsQXNuZFN0YXR1c1Jlc3BvbnNlKQorCQkJICAgICB8fCAoKCh0RXBsRGxsQXNuZFNlcnZpY2VJZCkgdWlBc25kU2VydmljZUlkKSA9PSBrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UpKSkgewkvLyBTdGF0dXNSZXMgb3IgSWRlbnRSZXMgcmVjZWl2ZWQKKwkJCQl1aU5vZGVJZCA9CisJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKwkJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PQorCQkJCSAgICAgKCh0RXBsRGxsUmVxU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpKQorCQkJCSAgICAmJiAodWlOb2RlSWQgPT0gRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQpKSB7CS8vIG1hcmsgcmVxdWVzdCBhcyByZXNwb25kZWQKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID0KKwkJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlTm87CisJCQkJfQorCQkJCWlmICgoKHRFcGxEbGxBc25kU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpID09IGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSkgewkvLyBtZW1vcml6ZSBNQUMgYWRkcmVzcyBvZiBDTiBmb3IgUFJlcQorCQkJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisKKwkJCQkJcEludE5vZGVJbmZvID0KKwkJCQkJICAgIEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZCk7CisJCQkJCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQkJCQkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCQkJCX0gZWxzZSB7CisJCQkJCQlFUExfTUVNQ1BZKHBJbnROb2RlSW5mby0+CisJCQkJCQkJICAgbV9iZV9hYk1hY0FkZHIsCisJCQkJCQkJICAgcEZyYW1lLT4KKwkJCQkJCQkgICBtX2JlX2FiU3JjTWFjLCA2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBmb3J3YXJkIEZsYWcyIHRvIGFzeW5jaHJvbm91cyBzY2hlZHVsZXIKKwkJCQliRmxhZzEgPQorCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgIG1fUGF5bG9hZC5tX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJICAgICBtX2xlX2JGbGFnMik7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKHVpTm9kZUlkLAorCQkJCQkJCQkgICAgICAoKHRFcGxEbGxBc3luY1JlcVByaW9yaXR5KSAoKGJGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMl9QUikgPj4gRVBMX0ZSQU1FX0ZMQUcyX1BSX1NISUZUKSksIChiRmxhZzEgJiBFUExfRlJBTUVfRkxBRzJfUlMpKTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAodWlBc25kU2VydmljZUlkIDwgRVBMX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEKSB7CS8vIEFTbmQgc2VydmljZSBJRCBpcyB2YWxpZAorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX2FBc25kRmlsdGVyW3VpQXNuZFNlcnZpY2VJZF0gPT0ga0VwbERsbEFzbmRGaWx0ZXJBbnkpIHsJLy8gQVNuZCBzZXJ2aWNlIElEIGlzIHJlZ2lzdGVyZWQKKwkJCQkJLy8gZm9yd2FyZCBmcmFtZSB2aWEgYXN5bmMgcmVjZWl2ZSBGSUZPIHRvIHVzZXJzcGFjZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZAorCQkJCQkgICAgKCZGcmFtZUluZm8pOworCQkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9hQXNuZEZpbHRlclt1aUFzbmRTZXJ2aWNlSWRdID09IGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpIHsJLy8gQVNuZCBzZXJ2aWNlIElEIGlzIHJlZ2lzdGVyZWQsIGJ1dCBvbmx5IGxvY2FsIG5vZGUgSUQgb3IgYnJvYWRjYXN0cworCQkJCQkvLyBzaGFsbCBiZSBmb3J3YXJkZWQKKwkJCQkJdWlOb2RlSWQgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkRzdE5vZGVJZCk7CisJCQkJCWlmICgodWlOb2RlSWQgPT0KKwkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgIG1fdWlOb2RlSWQpCisJCQkJCSAgICB8fCAodWlOb2RlSWQgPT0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsJLy8gQVNuZCBmcmFtZSBpcyBpbnRlbmRlZCBmb3IgdXMKKwkJCQkJCS8vIGZvcndhcmQgZnJhbWUgdmlhIGFzeW5jIHJlY2VpdmUgRklGTyB0byB1c2Vyc3BhY2UKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZAorCQkJCQkJICAgICgmRnJhbWVJbmZvKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChObXRFdmVudCAhPSBrRXBsTm10RXZlbnROb0V2ZW50KSB7CS8vIGV2ZW50IGZvciBETEwgYW5kIE5NVCBzdGF0ZSBtYWNoaW5lIGdlbmVyYXRlZAorCQlSZXQgPSBFcGxEbGxrQ2hhbmdlU3RhdGUoTm10RXZlbnQsIE5tdFN0YXRlKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJaWYgKChObXRFdmVudCAhPSBrRXBsTm10RXZlbnREbGxDZUFzbmQpCisJCSAgICAmJiAoKE5tdFN0YXRlIDw9IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSkgfHwgKE5tdEV2ZW50ICE9IGtFcGxObXRFdmVudERsbENlUHJlcykpKSB7CS8vIE5NVCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpbnRlcmVzdGVkIGluIEFTbmQgZnJhbWVzIGFuZCBQUmVzIGZyYW1lcyB3aGVuIG5vdCBDc05vdEFjdGl2ZSBvciBDc1ByZU9wMQorCQkJLy8gaW5mb3JtIE5NVCBtb2R1bGUKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudDsKKwkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0gRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSB8IChObXRFdmVudCA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKwlCRU5DSE1BUktfTU9EXzAyX1JFU0VUKDMpOworCXJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiRnJhbWVUcmFuc21pdHRlZCgpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBmcm9tIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKCkuCisvLyAgICAgICAgICAgICAgSXQgc2lnbmFscworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUnhCdWZmZXJfcCAgICAgICAgICAgICA9IHJlY2VpdmUgYnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRXBsRGxsa0NiRnJhbWVUcmFuc21pdHRlZCh0RWRydlR4QnVmZmVyICogcFR4QnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHk7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICYmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DID09IEZBTFNFKQorCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwVHhCdWZmZXJfcCAtIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyKSA9PSBFUExfRExMS19UWEZSQU1FX05NVFJFUSkgewkvLyBmcmFtZSBmcm9tIE5NVCByZXF1ZXN0IEZJRk8gc2VudAorCQkvLyBtYXJrIFR4LWJ1ZmZlciBhcyBlbXB0eQorCQlwVHhCdWZmZXJfcC0+bV91aVR4TXNnTGVuID0gRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCS8vIHBvc3QgZXZlbnQgdG8gRExMCisJCVByaW9yaXR5ID0ga0VwbERsbEFzeW5jUmVxUHJpb05tdDsKKwkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKwkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCUV2ZW50Lm1fcEFyZyA9ICZQcmlvcml0eTsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHkpOworCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJfSBlbHNlIGlmICgocFR4QnVmZmVyX3AgLSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcikgPT0gRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwpIHsJLy8gZnJhbWUgZnJvbSBnZW5lcmljIHByaW9yaXR5IEZJRk8gc2VudAorCQkvLyBtYXJrIFR4LWJ1ZmZlciBhcyBlbXB0eQorCQlwVHhCdWZmZXJfcC0+bV91aVR4TXNnTGVuID0gRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCS8vIHBvc3QgZXZlbnQgdG8gRExMCisJCVByaW9yaXR5ID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKEV2ZW50Lm1fTmV0VGltZSkpOworCQlFdmVudC5tX3BBcmcgPSAmUHJpb3JpdHk7CisJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFByaW9yaXR5KTsKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCX0KKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICYmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DID09IEZBTFNFKSkgXAorICAgIHx8ICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwllbHNlIGlmICgocFR4QnVmZmVyX3AtPm1fRXBsTXNnVHlwZSA9PSBrRXBsTXNnVHlwZVByZXEpCisJCSB8fCAocFR4QnVmZmVyX3AtPm1fRXBsTXNnVHlwZSA9PSBrRXBsTXNnVHlwZVByZXMpKSB7CS8vIFBSZXMgcmVzcC4gUFJlcSBmcmFtZSBzZW50CisKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICAgICAgICAgJiYgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgPT0gRkFMU0UpKQorCQl7CisJCQkvLyBpbmZvcm0gUERPIG1vZHVsZQorCQkJRnJhbWVJbmZvLm1fcEZyYW1lID0KKwkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlcl9wLT5tX3BiQnVmZmVyOworCQkJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBwVHhCdWZmZXJfcC0+bV91aU1heEJ1ZmZlckxlbjsKKwkJCVJldCA9IEVwbFBkb2tDYlBkb1RyYW5zbWl0dGVkKCZGcmFtZUluZm8pOworCQl9CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJeworCQkJLy8gaWYgb3duIFByZXMgb24gTU4sIHRyaWdnZXIgU29BCisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJiAocFR4QnVmZmVyX3AgPT0KKwkJCQkmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSkpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ2hhbmdlU3RhdGUoa0VwbE5tdEV2ZW50RGxsTWVTb2FUcmlnLAorCQkJCQkJICAgICAgIE5tdFN0YXRlKTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJCWdvdG8gRXhpdDsKKyNlbmRpZgorCX0KKyNlbmRpZgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwllbHNlIGlmIChwVHhCdWZmZXJfcC0+bV9FcGxNc2dUeXBlID09IGtFcGxNc2dUeXBlU29hKSB7CS8vIFNvQSBmcmFtZSBzZW50CisJCXRFcGxObXRFdmVudCBObXRFdmVudCA9IGtFcGxObXRFdmVudERsbE1lU29hU2VudDsKKworCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW52aXRlZAorCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPT0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgeworCQkJdEVwbEZyYW1lICpwVHhGcmFtZTsKKworCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZVN0YXR1cykgewkvLyBTdGF0dXNSZXF1ZXN0CisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXS5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gU3RhdHVzUmVzIGRvZXMgZXhpc3QKKworCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFU10uCisJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkvLyB1cGRhdGUgU3RhdHVzUmVzIGZyYW1lIChOTVQgc3RhdGUsIEVOLCBFQywgUlMsIFBSIGZsYWdzKQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJICAgICAgIG1fU3RhdHVzUmVzcG9uc2UuCisJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCS8vIHNlbmQgU3RhdHVzUmVzCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2U2VuZFR4TXNnKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fcFR4QnVmZmVyCisJCQkJCQkJICBbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDgpOworCisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VJZGVudCkgewkvLyBJZGVudFJlcXVlc3QKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIElkZW50UmVzIGRvZXMgZXhpc3QKKwkJCQkJcFR4RnJhbWUgPQorCQkJCQkgICAgKHRFcGxGcmFtZSAqKSBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10uCisJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkvLyB1cGRhdGUgSWRlbnRSZXMgZnJhbWUgKE5NVCBzdGF0ZSwgUlMsIFBSIGZsYWdzKQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJICAgICAgIG1fSWRlbnRSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlKTsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQkvLyBzZW5kIElkZW50UmVzCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2U2VuZFR4TXNnKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fcFR4QnVmZmVyCisJCQkJCQkJICBbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10pOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0KSB7CS8vIE5tdFJlcXVlc3QKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBObXRSZXF1ZXN0IGRvZXMgZXhpc3QKKwkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgbm90IGVtcHR5IGFuZCBub3QgYmVpbmcgZmlsbGVkCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLgorCQkJCQkgICAgbV91aVR4TXNnTGVuID4KKwkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HKSB7CisJCQkJCQkvLyBjaGVjayBpZiB0aGlzIGZyYW1lIGlzIGEgTk1UIGNvbW1hbmQsCisJCQkJCQkvLyB0aGVuIGZvcndhcmQgdGhpcyBmcmFtZSBiYWNrIHRvIE5tdE1udSBtb2R1bGUsCisJCQkJCQkvLyBiZWNhdXNlIGl0IG5lZWRzIHRoZSB0aW1lLCB3aGVuIHRoaXMgZnJhbWUgaXMKKwkJCQkJCS8vIGFjdHVhbGx5IHNlbnQsIHRvIHN0YXJ0IHRoZSB0aW1lciBmb3IgbW9uaXRvcmluZworCQkJCQkJLy8gdGhlIE5NVCBzdGF0ZSBjaGFuZ2UuCisKKwkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCSAgICAodEVwbEZyYW1lICopCisJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLgorCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQlpZiAoKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAgKCZwVHhGcmFtZS0+CisJCQkJCQkgICAgICBtX2xlX2JNZXNzYWdlVHlwZSkKKwkJCQkJCSAgICAgPT0gKEJZVEUpIGtFcGxNc2dUeXBlQXNuZCkKKwkJCQkJCSAgICAmJgorCQkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgICgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICBtX2xlX2JTZXJ2aWNlSWQpCisJCQkJCQkgICAgID09IChCWVRFKSBrRXBsRGxsQXNuZE5tdENvbW1hbmQpKSB7CS8vIHBvc3QgZXZlbnQgZGlyZWN0bHkgdG8gTm10TW51IG1vZHVsZQorCQkJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0KKwkJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRNbnVObXRDbWRTZW50OworCQkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0uCisJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbjsKKwkJCQkJCQlFdmVudC5tX3BBcmcgPSBwVHhGcmFtZTsKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxFdmVudGtQb3N0CisJCQkJCQkJICAgICgmRXZlbnQpOworCisJCQkJCQl9CisJCQkJCQkvLyBzZW5kIE5tdFJlcXVlc3QKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0pOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkKSB7CS8vIHVuc3BlY2lmaWVkIGludml0ZQorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBub3QgZW1wdHkgYW5kIG5vdCBiZWluZyBmaWxsZWQKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05PTkVQTF0uCisJCQkJCSAgICBtX3VpVHhNc2dMZW4gPgorCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcpIHsKKwkJCQkJCS8vIHNlbmQgbm9uLUVQTCBmcmFtZQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvLyBBU25kIGZyYW1lIHdhcyBzZW50LCByZW1vdmUgdGhlIHJlcXVlc3QKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9CisJCQkgICAga0VwbERsbFJlcVNlcnZpY2VObzsKKwkJfQorCQkvLyBmb3J3YXJkIGV2ZW50IHRvIEVycm9ySGFuZGxlciBhbmQgUERPIG1vZHVsZQorCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOworCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJZWxzZSB7CQkJLy8gZC5rLjogV2h5IHRoYXQgZWxzZT8gb24gQ04gaXQgaXMgZW50ZXJlZCBvbiBJZGVudFJlcyBhbmQgU3RhdHVzUmVzCisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBzaWduYWwgcHJvY2VzcyBmdW5jdGlvbiByZWFkaW5lc3Mgb2YgUFJlcyBmcmFtZQorCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1ByZXNSZWFkeTsKKwlFdmVudC5tX3VpU2l6ZSA9IDA7CisJRXZlbnQubV9wQXJnID0gTlVMTDsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKyNlbmRpZgorCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSB8IChwVHhCdWZmZXJfcC0+CisJCQkJCQkgICAgbV9FcGxNc2dUeXBlIDw8IDE2KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NoZWNrRnJhbWUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVjayBmcmFtZSBhbmQgc2V0IG1pc3NpbmcgaW5mb3JtYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lX3AgICAgICAgICAgICAgICAgPSBldGhlcm5ldCBmcmFtZQorLy8gICAgICAgICAgICAgIHVpRnJhbWVTaXplX3AgICAgICAgICAgID0gc2l6ZSBvZiBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0NoZWNrRnJhbWUodEVwbEZyYW1lICogcEZyYW1lX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aUZyYW1lU2l6ZV9wKQoreworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisJV09SRCB3RXRoZXJUeXBlOworCisJLy8gY2hlY2sgZnJhbWUKKwlpZiAocEZyYW1lX3AgIT0gTlVMTCkgeworCQkvLyBjaGVjayBTcmNNQUMKKwkJaWYgKEFtaUdldFF3b3JkNDhGcm9tQmUocEZyYW1lX3AtPm1fYmVfYWJTcmNNYWMpID09IDApIHsKKwkJCS8vIHNvdXJjZSBNQUMgYWRkcmVzcworCQkJRVBMX01FTUNQWSgmcEZyYW1lX3AtPm1fYmVfYWJTcmNNYWNbMF0sCisJCQkJICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fYmVfYWJTcmNNYWNbMF0sIDYpOworCQl9CisJCS8vIGNoZWNrIGV0aGVydHlwZQorCQl3RXRoZXJUeXBlID0gQW1pR2V0V29yZEZyb21CZSgmcEZyYW1lX3AtPm1fYmVfd0V0aGVyVHlwZSk7CisJCWlmICh3RXRoZXJUeXBlID09IDApIHsKKwkJCS8vIGFzc3VtZSBFUEwgZnJhbWUKKwkJCXdFdGhlclR5cGUgPSBFUExfQ19ETExfRVRIRVJUWVBFX0VQTDsKKwkJCUFtaVNldFdvcmRUb0JlKCZwRnJhbWVfcC0+bV9iZV93RXRoZXJUeXBlLCB3RXRoZXJUeXBlKTsKKwkJfQorCisJCWlmICh3RXRoZXJUeXBlID09IEVQTF9DX0RMTF9FVEhFUlRZUEVfRVBMKSB7CisJCQkvLyBzb3VyY2Ugbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZV9wLT5tX2xlX2JTcmNOb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkgICAgICAgbV9EbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkKTsKKworCQkJLy8gY2hlY2sgbWVzc2FnZSB0eXBlCisJCQlNc2dUeXBlID0KKwkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWVfcC0+bV9sZV9iTWVzc2FnZVR5cGUpOworCQkJaWYgKE1zZ1R5cGUgPT0gMCkgeworCQkJCU1zZ1R5cGUgPSBrRXBsTXNnVHlwZUFzbmQ7CisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwKKwkJCQkJICAgICAgIChCWVRFKSBNc2dUeXBlKTsKKwkJCX0KKworCQkJaWYgKE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVBc25kKSB7CisJCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCQlBbWlTZXRRd29yZDQ4VG9CZSgmcEZyYW1lX3AtPm1fYmVfYWJEc3RNYWNbMF0sCisJCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfQVNORCk7CisJCQl9CisKKwkJfQorCX0KKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiQ25UaW1lcigpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBieSB0aW1lciBtb2R1bGUuIEl0IG1vbml0b3JzIHRoZSBFUEwgY3ljbGUgd2hlbiBpdCBpcyBhIENOLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRBcmdfcCAgICAgICAgICAgICA9IHRpbWVyIGV2ZW50IGFyZ3VtZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsRGxsa0NiQ25UaW1lcih0RXBsVGltZXJFdmVudEFyZyAqIHBFdmVudEFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJaWYgKHBFdmVudEFyZ19wLT5tX1RpbWVySGRsICE9IEVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSkgewkvLyB6b21iaWUgY2FsbGJhY2sKKwkJLy8ganVzdCBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisKKwlpZiAoTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxEbGxrQ2hhbmdlU3RhdGUoa0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQsIE5tdFN0YXRlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMjAwOC8xMC8xNSBkLmsuIHJlcHJvZ3JhbW1pbmcgb2YgdGltZXIgbm90IG5lY2Vzc2FyeSwKKwkvLyBiZWNhdXNlIGl0IHdpbGwgYmUgcHJvZ3JhbW1lZCwgd2hlbiBTb0MgaXMgcmVjZWl2ZWQuCisvKgorICAgIC8vIHJlcHJvZ3JhbSB0aW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorICAgIGlmICgoTm10U3RhdGUgPiBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEpCisgICAgICAgICYmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCAhPSAwKSkKKyAgICB7CisgICAgICAgIFJldCA9IEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zKCZFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUsIEVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0LCBFcGxEbGxrQ2JDblRpbWVyLCAwTCwgRkFMU0UpOworICAgIH0KKyNlbmRpZgorKi8KKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkgICAgbV9EbGxTdGF0ZSB8IChrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dCA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiTW5UaW1lckN5Y2xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGJ5IHRpbWVyIG1vZHVsZS4gSXQgdHJpZ2dlcnMgdGhlIFNvQyB3aGVuIGl0IGlzIGEgTU4uCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudEFyZ19wICAgICAgICAgICAgID0gdGltZXIgZXZlbnQgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyQ3ljbGUodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCWlmIChwRXZlbnRBcmdfcC0+bV9UaW1lckhkbCAhPSBFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUpIHsJLy8gem9tYmllIGNhbGxiYWNrCisJCS8vIGp1c3QgZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsRGxsa0NoYW5nZVN0YXRlKGtFcGxObXRFdmVudERsbE1lU29jVHJpZywgTm10U3RhdGUpOworCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCSAgICBtX0RsbFN0YXRlIHwgKGtFcGxObXRFdmVudERsbE1lU29jVHJpZyA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYk1uVGltZXJSZXNwb25zZSgpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBieSB0aW1lciBtb2R1bGUuIEl0IG1vbml0b3JzIHRoZSBQUmVzIHRpbWVvdXQuCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudEFyZ19wICAgICAgICAgICAgID0gdGltZXIgZXZlbnQgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UodEVwbFRpbWVyRXZlbnRBcmcgKgorCQkJCQkJICBwRXZlbnRBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCWlmIChwRXZlbnRBcmdfcC0+bV9UaW1lckhkbCAhPSBFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsUmVzcG9uc2UpIHsJLy8gem9tYmllIGNhbGxiYWNrCisJCS8vIGp1c3QgZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsRGxsa0NoYW5nZVN0YXRlKGtFcGxObXRFdmVudERsbE1lUHJlc1RpbWVvdXQsIE5tdFN0YXRlKTsKKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkgICAgbV9EbGxTdGF0ZSB8IChrRXBsTm10RXZlbnREbGxNZVByZXNUaW1lb3V0IDw8IDgpOworCisJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZURsbGssCisJCQkJCSBSZXQsIHNpemVvZihkd0FyZyksICZkd0FyZyk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0dldE5vZGVJbmZvKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBub2RlIGluZm8gc3RydWN0dXJlIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxEbGxrTm9kZUluZm8qICAgICAgID0gcG9pbnRlciB0byBpbnRlcm5hbCBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsRGxsa05vZGVJbmZvICpFcGxEbGxrR2V0Tm9kZUluZm8odW5zaWduZWQgaW50IHVpTm9kZUlkX3ApCit7CisJLy8gJCQkIGQuay46IHVzZSBoYXNoIGFsZ29yaXRobSB0byByZXRyaWV2ZSB0aGUgYXBwcm9wcmlhdGUgbm9kZSBpbmZvIHN0cnVjdHVyZQorCS8vICAgICAgICAgICBpZiBzaXplIG9mIGFycmF5IGlzIGxlc3MgdGhhbiAyNTQuCisJdWlOb2RlSWRfcC0tOwkJLy8gbm9kZSBJRCBzdGFydHMgYXQgMSBidXQgYXJyYXkgYXQgMAorCWlmICh1aU5vZGVJZF9wID49IHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pKSB7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCXJldHVybiAmRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlOb2RlSWRfcF07CisJfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kU29hKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXQgdXBkYXRlcyBhbmQgdHJhbnNtaXRzIHRoZSBTb0EuCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlX3AgICAgICAgICAgICAgID0gY3VycmVudCBOTVQgc3RhdGUKKy8vICAgICAgICAgICAgICBwRGxsU3RhdGVQcm9wb3NlZF9wICAgICA9IHByb3Bvc2VkIERMTCBzdGF0ZQorLy8gICAgICAgICAgICAgIGZFbmFibGVJbnZpdGF0aW9uX3AgICAgID0gZW5hYmxlIGludml0YXRpb24gZm9yIGFzeW5jaHJvbm91cyBwaGFzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBiZSBkaXNhYmxlZCBmb3IgRVBMX0NfRExMX1BSRU9QMV9TVEFSVF9DWUNMRVMgU29BcworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa01uU2VuZFNvYSh0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkgICB0RXBsRGxsU3RhdGUgKiBwRGxsU3RhdGVQcm9wb3NlZF9wLAorCQkJCSAgIEJPT0wgZkVuYWJsZUludml0YXRpb25fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlciA9IE5VTEw7CisJdEVwbEZyYW1lICpwVHhGcmFtZTsKKwl0RXBsRGxsa05vZGVJbmZvICpwTm9kZUluZm87CisKKwkqcERsbFN0YXRlUHJvcG9zZWRfcCA9IGtFcGxEbGxNc05vbkN5Y2xpYzsKKworCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1NPQV07CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFNvQSBkb2VzIGV4aXN0CisJCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwkJaWYgKGZFbmFibGVJbnZpdGF0aW9uX3AgIT0gRkFMU0UpIHsJLy8gZmV0Y2ggdGFyZ2V0IG9mIGFzeW5jaHJvbm91cyBwaGFzZQorCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fYkZsYWcyID09IDApIHsJLy8gb3duIHF1ZXVlcyBhcmUgZW1wdHkKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPQorCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZU5vOworCQkJfSBlbHNlIGlmICgoKHRFcGxEbGxBc3luY1JlcVByaW9yaXR5KSAoRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPj4gRVBMX0ZSQU1FX0ZMQUcyX1BSX1NISUZUKSkgPT0ga0VwbERsbEFzeW5jUmVxUHJpb05tdCkgewkvLyBmcmFtZXMgaW4gb3duIE5NVCByZXF1ZXN0IHF1ZXVlIGF2YWlsYWJsZQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9CisJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlTm10UmVxdWVzdDsKKwkJCX0gZWxzZSB7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID0KKwkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VVbnNwZWNpZmllZDsKKwkJCX0KKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJIG1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkJCQkgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3VpTGFzdFRhcmdldE5vZGVJZCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCAhPSBrRXBsRGxsUmVxU2VydmljZU5vKSB7CS8vIGFzeW5jaHJvbm91cyBwaGFzZSB3aWxsIGJlIGFzc2lnbmVkIHRvIG9uZSBub2RlCisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlMYXN0VGFyZ2V0Tm9kZUlkID09IEVQTF9DX0FEUl9JTlZBTElEKSB7CS8vIGV4Y2hhbmdlIGludmFsaWQgbm9kZSBJRCB3aXRoIGxvY2FsIG5vZGUgSUQKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPQorCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS4KKwkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCS8vIGQuay4gRExMIHN0YXRlIFdhaXRBc25kVHJpZyBpcyBub3QgaGVscGZ1bDsKKwkJCQkJLy8gICAgICBzbyBqdXN0IHN0ZXAgb3ZlciB0byBXYWl0U29jVHJpZywKKwkJCQkJLy8gICAgICBiZWNhdXNlIG93biBBU25kIGlzIHNlbnQgYXV0b21hdGljYWxseSBpbiBDYkZyYW1lVHJhbnNtaXR0ZWQoKSBhZnRlciBTb0EuCisJCQkJCS8vKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPSBrRXBsRGxsTXNXYWl0QXNuZFRyaWc7CisJCQkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0KKwkJCQkJICAgIGtFcGxEbGxNc1dhaXRTb2NUcmlnOworCQkJCX0gZWxzZSB7CS8vIGFzc2lnbm1lbnQgdG8gQ04KKwkJCQkJKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPQorCQkJCQkgICAga0VwbERsbE1zV2FpdEFzbmQ7CisJCQkJfQorCisJCQkJcE5vZGVJbmZvID0KKwkJCQkgICAgRXBsRGxsa0dldE5vZGVJbmZvKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKwkJCQlpZiAocE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJCQkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gdXBkYXRlIGZyYW1lIChFQSwgRVIgZmxhZ3MpCisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EuCisJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJICAgICAgIHBOb2RlSW5mby0+CisJCQkJCSAgICAgICBtX2JTb2FGbGFnMSAmIChFUExfRlJBTUVfRkxBRzFfRUEKKwkJCQkJCQkgICAgICB8CisJCQkJCQkJICAgICAgRVBMX0ZSQU1FX0ZMQUcxX0VSKSk7CisJCQl9IGVsc2UgewkvLyBubyBhc3NpZ25tZW50IG9mIGFzeW5jaHJvbm91cyBwaGFzZQorCQkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFNvY1RyaWc7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPQorCQkJCSAgICBFUExfQ19BRFJfSU5WQUxJRDsKKwkJCX0KKworCQkJLy8gdXBkYXRlIGZyYW1lICh0YXJnZXQpCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZUlkLAorCQkJCSAgICAgICAoQllURSkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fTGFzdFJlcVNlcnZpY2VJZCk7CisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZVRhcmdldCwKKwkJCQkgICAgICAgKEJZVEUpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX3VpTGFzdFRhcmdldE5vZGVJZCk7CisKKwkJfSBlbHNlIHsJLy8gaW52aXRlIG5vYm9keQorCQkJLy8gdXBkYXRlIGZyYW1lICh0YXJnZXQpCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZUlkLCAoQllURSkgMCk7CisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZVRhcmdldCwgKEJZVEUpIDApOworCQl9CisKKwkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUpCisJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLm1fbGVfYk5tdFN0YXR1cywKKwkJCSAgICAgICAoQllURSkgTm10U3RhdGVfcCk7CisKKwkJLy8gc2VuZCBTb0EgZnJhbWUKKwkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kU29jKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXQgdXBkYXRlcyBhbmQgdHJhbnNtaXRzIHRoZSBTb0EuCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa01uU2VuZFNvYyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKwl0RXBsRnJhbWUgKnBUeEZyYW1lOworCXRFcGxFdmVudCBFdmVudDsKKworCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1NPQ107CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFNvQyBkb2VzIGV4aXN0CisJCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwkJLy8gJCQkIHVwZGF0ZSBOZXRUaW1lCisKKwkJLy8gc2VuZCBTb0MgZnJhbWUKKwkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gdHJpZ2dlciBzeW5jaHJvbm91cyB0YXNrCisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1N5bmM7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVN5bmM7CisJCUV2ZW50Lm1fdWlTaXplID0gMDsKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kUHJlcSgpCisvLworLy8gRGVzY3JpcHRpb246IGl0IHVwZGF0ZXMgYW5kIHRyYW5zbWl0cyB0aGUgUFJlcSBmb3IgdGhlIG5leHQgaXNvY2hyb25vdXMgQ04KKy8vICAgICAgICAgICAgICBvciBvd24gUFJlcyBpZiBlbmFibGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRTdGF0ZV9wICAgICAgICAgICAgICA9IGN1cnJlbnQgTk1UIHN0YXRlCisvLyAgICAgICAgICAgICAgcERsbFN0YXRlUHJvcG9zZWRfcCAgICAgPSBwcm9wb3NlZCBETEwgc3RhdGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtNblNlbmRQcmVxKHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCSAgICB0RXBsRGxsU3RhdGUgKiBwRGxsU3RhdGVQcm9wb3NlZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKwl0RXBsRnJhbWUgKnBUeEZyYW1lOworCUJZVEUgYkZsYWcxID0gMDsKKworCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BDdXJOb2RlSW5mbyA9PSBOVUxMKSB7CS8vIHN0YXJ0IHdpdGggZmlyc3QgaXNvY2hyb25vdXMgQ04KKwkJRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8gPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbzsKKwl9IGVsc2UgewkJLy8gaXRlcmF0ZSB0byBuZXh0IGlzb2Nocm9ub3VzIENOCisJCUVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvLT5tX3BOZXh0Tm9kZUluZm87CisJfQorCisJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID09IE5VTEwpIHsJLy8gbGFzdCBpc29jaHJvbm91cyBDTiByZWFjaGVkCisJCVJldCA9IEVwbERsbGtNblNlbmRTb2EoTm10U3RhdGVfcCwgcERsbFN0YXRlUHJvcG9zZWRfcCwgVFJVRSk7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlwVHhCdWZmZXIgPSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BDdXJOb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyOworCQliRmxhZzEgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8tPgorCQkgICAgbV9iU29hRmxhZzEgJiBFUExfRlJBTUVfRkxBRzFfRUE7CisJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFByZXM7CisKKwkJLy8gc3RhcnQgUFJlcyBUaW1lcgorCQkvLyAkJCQgZC5rLjogbWF5YmUgbW92ZSB0aGlzIGNhbGwgdG8gQ2JGcmFtZVRyYW5zbWl0dGVkKCksIGJlY2F1c2UgdGhlIHRpbWUgc2hvdWxkIHJ1biBmcm9tIHRoZXJlCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCVJldCA9CisJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcygmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fVGltZXJIZGxSZXNwb25zZSwKKwkJCQkJCSAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fcEN1ck5vZGVJbmZvLT4KKwkJCQkJCSAgbV9kd1ByZXNUaW1lb3V0LAorCQkJCQkJICBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UsIDBMLAorCQkJCQkJICBGQUxTRSk7CisjZW5kaWYKKwl9CisKKwlpZiAocFR4QnVmZmVyID09IE5VTEwpIHsJLy8gUFJlcSBkb2VzIG5vdCBleGlzdAorCQlSZXQgPSBrRXBsRGxsVHhCdWZOb3RSZWFkeTsKKwkJZ290byBFeGl0OworCX0KKworCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwlpZiAocFR4RnJhbWUgIT0gTlVMTCkgewkvLyBQUmVxIGRvZXMgZXhpc3QKKwkJaWYgKE5tdFN0YXRlX3AgPT0ga0VwbE5tdE1zT3BlcmF0aW9uYWwpIHsJLy8gbGVhdmUgUkQgZmxhZyB1bnRvdWNoZWQKKwkJCWJGbGFnMSB8PQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLgorCQkJCQkgICAgIG1fbGVfYkZsYWcxKSAmIEVQTF9GUkFNRV9GTEFHMV9SRDsKKwkJfQorCisJCWlmIChwVHhCdWZmZXIgPT0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU10pIHsJLy8gUFJlcyBvZiBNTiB3aWxsIGJlIHNlbnQKKwkJCS8vIHVwZGF0ZSBOTVQgc3RhdGUKKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JObXRTdGF0dXMsCisJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZV9wKTsKKwkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFNvYVRyaWc7CisJCX0KKwkJLy8gJCQkIGQuay4gc2V0IEVQTF9GUkFNRV9GTEFHMV9NUyBpZiBuZWNlc3NhcnkKKwkJLy8gdXBkYXRlIGZyYW1lIChGbGFnMSkKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfYkZsYWcxLCBiRmxhZzEpOworCisJCS8vIGNhbGN1bGF0ZSBmcmFtZSBzaXplIGZyb20gcGF5bG9hZCBzaXplCisJCXBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfd1NpemUpICsgMjQ7CisKKwkJLy8gc2VuZCBQUmVxIGZyYW1lCisJCVJldCA9IEVkcnZTZW5kVHhNc2cocFR4QnVmZmVyKTsKKwl9IGVsc2UgeworCQlSZXQgPSBrRXBsRGxsVHhGcmFtZUludmFsaWQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBwYXNzZXMgZW1wdHkgQVNuZCBmcmFtZSB0byByZWNlaXZlIEZJRk8uCisvLyAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjYWxsZWQgb25seSBmb3IgZnJhbWVzIHdpdGggcmVnaXN0ZXJlZCBBc25kU2VydmljZUlkcworLy8gICAgICAgICAgICAgIChvbmx5IGtFcGxEbGxBc25kRmlsdGVyQW55KS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZCh0RXBsRGxsUmVxU2VydmljZUlkCisJCQkJCSAgICAgICBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJQllURSBhYkJ1ZmZlclsxOF07CisJdEVwbEZyYW1lICpwRnJhbWUgPSAodEVwbEZyYW1lICopIGFiQnVmZmVyOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCisJLy8gY2hlY2sgaWYgcHJldmlvdXMgU29BIGludml0YXRpb24gd2FzIG5vdCBhbnN3ZXJlZAorCXN3aXRjaCAoUmVxU2VydmljZUlkX3ApIHsKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQ6CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZVN0YXR1czoKKwkJLy8gQVNuZCBzZXJ2aWNlIHJlZ2lzdGVyZWQ/CisJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX2FBc25kRmlsdGVyW1JlcVNlcnZpY2VJZF9wXSA9PSBrRXBsRGxsQXNuZEZpbHRlckFueSkgewkvLyBBU25kIHNlcnZpY2UgSUQgaXMgcmVnaXN0ZXJlZAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkLAorCQkJCSAgICAgICAoQllURSkgdWlOb2RlSWRfcCk7CisJCQkvLyBFUEwgTXNnVHlwZSBBU25kCisJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSwKKwkJCQkgICAgICAgKEJZVEUpIGtFcGxNc2dUeXBlQXNuZCk7CisJCQkvLyBBU25kIFNlcnZpY2UgSUQKKwkJCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkJCSAgICAgICAoQllURSkgUmVxU2VydmljZUlkX3ApOworCQkJLy8gY3JlYXRlIGZyYW1lIGluZm8gc3RydWN0dXJlCisJCQlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IDE4OwkvLyBlbXB0eSBub24gZXhpc3RpbmcgQVNuZCBmcmFtZQorCQkJLy8gZm9yd2FyZCBmcmFtZSB2aWEgYXN5bmMgcmVjZWl2ZSBGSUZPIHRvIHVzZXJzcGFjZQorCQkJUmV0ID0gRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZCgmRnJhbWVJbmZvKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvLyBubyBpbnZpdGF0aW9uIGlzc3VlZCBvciBpdCB3YXMgc3VjY2Vzc2Z1bGx5IGFuc3dlcmVkIG9yIGl0IGlzIHVuaW50ZXJlc3RpbmcKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrQ2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbGtDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkwODNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrQ2FsLmMKQEAgLTAsMCArMSwxMjYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGtlcm5lbCBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxrQ2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorCisjaW5jbHVkZSAiRXBsRGxsQ2FsLmgiCisjaWZuZGVmIEVQTF9OT19GSUZPCisjaW5jbHVkZSAiU2hhcmVkQnVmZi5oIgorI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxEbGxrQ2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9ETExLQ0FMX01BWF9RVUVVRVMgIDUJLy8gQ25HZW5SZXEsIENuTm10UmVxLCB7TW5HZW5SZXEsIE1uTm10UmVxfSwgTW5JZGVudFJlcSwgTW5TdGF0dXNSZXEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisjaWZuZGVmIEVQTF9OT19GSUZPCisvLyAgICB0U2hiSW5zdGFuY2UgICAgbV9TaGJJbnN0YW5jZVJ4OyAgICAgIC8vIEZJRk8gZm9yIFJ4IEFTbmQgZnJhbWVzCisJdFNoYkluc3RhbmNlIG1fU2hiSW5zdGFuY2VUeE5tdDsJLy8gRklGTyBmb3IgVHggZnJhbWVzIHdpdGggTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwl0U2hiSW5zdGFuY2UgbV9TaGJJbnN0YW5jZVR4R2VuOwkvLyBGSUZPIGZvciBUeCBmcmFtZXMgd2l0aCBnZW5lcmljIHByaW9yaXR5CisjZWxzZQorCXVuc2lnbmVkIGludCBtX3VpRnJhbWVTaXplTm10OworCUJZVEUgbV9hYkZyYW1lTm10WzE1MDBdOworCXVuc2lnbmVkIGludCBtX3VpRnJhbWVTaXplR2VuOworCUJZVEUgbV9hYkZyYW1lR2VuWzE1MDBdOworI2VuZGlmCisKKwl0RXBsRGxsa0NhbFN0YXRpc3RpY3MgbV9TdGF0aXN0aWNzOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIElkZW50UmVxdWVzdCBxdWV1ZSB3aXRoIENOIG5vZGUgSURzCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVJZGVudFJlcVtFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTggKyAxXTsJLy8gMSBlbnRyeSBpcyByZXNlcnZlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZ1bGwgYW5kIGVtcHR5CisJdW5zaWduZWQgaW50IG1fdWlXcml0ZUlkZW50UmVxOworCXVuc2lnbmVkIGludCBtX3VpUmVhZElkZW50UmVxOworCisJLy8gU3RhdHVzUmVxdWVzdCBxdWV1ZSB3aXRoIENOIG5vZGUgSURzCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVTdGF0dXNSZXFbRVBMX0RfTk1UX01heENOTnVtYmVyX1U4ICsgMV07CS8vIDEgZW50cnkgaXMgcmVzZXJ2ZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmdWxsIGFuZCBlbXB0eQorCXVuc2lnbmVkIGludCBtX3VpV3JpdGVTdGF0dXNSZXE7CisJdW5zaWduZWQgaW50IG1fdWlSZWFkU3RhdHVzUmVxOworCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVDblJlcXVlc3RzWzI1NCAqIDJdOworCS8vIGZpcnN0IDI1NCBlbnRyaWVzIHJlcHJlc2VudCB0aGUgZ2VuZXJpYyByZXF1ZXN0cyBvZiB0aGUgY29ycmVzcG9uZGluZyBub2RlCisJLy8gc2Vjb25kIDI1NCBlbnRyaWVzIHJlcHJlc2VudCB0aGUgTk1UIHJlcXVlc3RzIG9mIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUKKwl1bnNpZ25lZCBpbnQgbV91aU5leHRRdWV1ZUNuUmVxdWVzdDsKKwl1bnNpZ25lZCBpbnQgbV91aU5leHRSZXF1ZXN0UXVldWU7CisjZW5kaWYKKworfSB0RXBsRGxsa0NhbEluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBzaGFsbCBiZSB1c2VkCisvLyBkZWZpbmUgc3RydWN0dXJlcyBzdGF0aWNhbGx5CitzdGF0aWMgdEVwbERsbGtDYWxJbnN0YW5jZSBFcGxEbGxrQ2FsSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIERMTCBDQUwgbW9kdWxlCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisKKy8qICAgIFNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIgKEVQTF9ETExDQUxfQlVGRkVSX1NJWkVfUlgsIEVQTF9ETExDQUxfQlVGRkVSX0lEX1JYLAorICAgICAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVJ4LCAmZlNoYk5ld0NyZWF0ZWQpOworICAgIC8vIHJldHVybnMga1NoYk9rLCBrU2hiT3Blbk1pc21hdGNoLCBrU2hiT3V0T2ZNZW0gb3Iga1NoYkludmFsaWRBcmcKKworICAgIGlmIChTaGJFcnJvciAhPSBrU2hiT2spCisgICAgeworICAgICAgICBSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKyAgICB9CisqLworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9OTVQsCisJCQkgICAgICBFUExfRExMQ0FMX0JVRkZFUl9JRF9UWF9OTVQsCisJCQkgICAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LAorCQkJICAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwkvLyByZXR1cm5zIGtTaGJPaywga1NoYk9wZW5NaXNtYXRjaCwga1NoYk91dE9mTWVtIG9yIGtTaGJJbnZhbGlkQXJnCisKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKworLyogICAgU2hiRXJyb3IgPSBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YSAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LCBFcGxEbGxrQ2FsVHhObXRTaWduYWxIYW5kbGVyLCBrU2hiUHJpb3JpdHlOb3JtYWwpOworICAgIC8vIHJldHVybnMga1NoYk9rLCBrU2hiQWxyZWFkeVNpZ25hbGluZyBvciBrU2hiSW52YWxpZEFyZworCisgICAgaWYgKFNoYkVycm9yICE9IGtTaGJPaykKKyAgICB7CisgICAgICAgIFJldCA9IGtFcGxOb1Jlc291cmNlOworICAgIH0KKyovCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX0dFTiwKKwkJCSAgICAgIEVQTF9ETExDQUxfQlVGRkVSX0lEX1RYX0dFTiwKKwkJCSAgICAgICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sCisJCQkgICAgICAmZlNoYk5ld0NyZWF0ZWQpOworCS8vIHJldHVybnMga1NoYk9rLCBrU2hiT3Blbk1pc21hdGNoLCBrU2hiT3V0T2ZNZW0gb3Iga1NoYkludmFsaWRBcmcKKworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfQorCisvKiAgICBTaGJFcnJvciA9IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sIEVwbERsbGtDYWxUeEdlblNpZ25hbEhhbmRsZXIsIGtTaGJQcmlvcml0eU5vcm1hbCk7CisgICAgLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJBbHJlYWR5U2lnbmFsaW5nIG9yIGtTaGJJbnZhbGlkQXJnCisKKyAgICBpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgIHsKKyAgICAgICAgUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisgICAgfQorKi8KKyNlbHNlCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbiA9IDA7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgaW5zdGFuY2Ugb2YgRExMIENBTCBtb2R1bGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCisvKiAgICBTaGJFcnJvciA9IFNoYkNpclJlbGVhc2VCdWZmZXIgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VSeCk7CisgICAgaWYgKFNoYkVycm9yICE9IGtTaGJPaykKKyAgICB7CisgICAgICAgIFJldCA9IGtFcGxOb1Jlc291cmNlOworICAgIH0KKyAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlUnggPSBOVUxMOworKi8KKwlTaGJFcnJvciA9IFNoYkNpclJlbGVhc2VCdWZmZXIoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10KTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQgPSBOVUxMOworCisJU2hiRXJyb3IgPSBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbik7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwl9CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuID0gTlVMTDsKKworI2Vsc2UKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbFByb2Nlc3MKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2VzcyB0aGUgcGFzc2VkIGNvbmZpZ3VyYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgICAgICAgICAgICAgICAgPSBldmVudCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrU2VydkZpbHRlcjoKKwkJeworCQkJdEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXIgKnBTZXJ2RmlsdGVyOworCisJCQlwU2VydkZpbHRlciA9CisJCQkgICAgKHRFcGxEbGxDYWxBc25kU2VydmljZUlkRmlsdGVyICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKHBTZXJ2RmlsdGVyLT4KKwkJCQkJCQkgIG1fU2VydmljZUlkLAorCQkJCQkJCSAgcFNlcnZGaWx0ZXItPgorCQkJCQkJCSAgbV9GaWx0ZXIpOworCQkJYnJlYWs7CisJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrSXNzdWVSZXE6CisJCXsKKwkJCXRFcGxEbGxDYWxJc3N1ZVJlcXVlc3QgKnBJc3N1ZVJlcTsKKworCQkJcElzc3VlUmVxID0gKHRFcGxEbGxDYWxJc3N1ZVJlcXVlc3QgKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NhbElzc3VlUmVxdWVzdChwSXNzdWVSZXEtPm1fU2VydmljZSwKKwkJCQkJCSAgIHBJc3N1ZVJlcS0+bV91aU5vZGVJZCwKKwkJCQkJCSAgIHBJc3N1ZVJlcS0+bV9iU29hRmxhZzEpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtBZGROb2RlOgorCQl7CisJCQl0RXBsRGxsTm9kZUluZm8gKnBOb2RlSW5mbzsKKworCQkJcE5vZGVJbmZvID0gKHRFcGxEbGxOb2RlSW5mbyAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQkJUmV0ID0gRXBsRGxsa0FkZE5vZGUocE5vZGVJbmZvKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRGVsTm9kZToKKwkJeworCQkJdW5zaWduZWQgaW50ICpwdWlOb2RlSWQ7CisKKwkJCXB1aU5vZGVJZCA9ICh1bnNpZ25lZCBpbnQgKilwRXZlbnRfcC0+bV9wQXJnOworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZU5vZGUoKnB1aU5vZGVJZCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlOgorCQl7CisJCQl1bnNpZ25lZCBpbnQgKnB1aU5vZGVJZDsKKworCQkJcHVpTm9kZUlkID0gKHVuc2lnbmVkIGludCAqKXBFdmVudF9wLT5tX3BBcmc7CisJCQlSZXQgPSBFcGxEbGxrU29mdERlbGV0ZU5vZGUoKnB1aU5vZGVJZCk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrSWRlbnRpdHk6CisJCXsKKwkJCXRFcGxEbGxJZGVudFBhcmFtICpwSWRlbnRQYXJhbTsKKworCQkJcElkZW50UGFyYW0gPSAodEVwbERsbElkZW50UGFyYW0gKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCWlmIChwSWRlbnRQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA+IHBFdmVudF9wLT5tX3VpU2l6ZSkgeworCQkJCXBJZGVudFBhcmFtLT5tX3VpU2l6ZU9mU3RydWN0ID0KKwkJCQkgICAgcEV2ZW50X3AtPm1fdWlTaXplOworCQkJfQorCQkJUmV0ID0gRXBsRGxsa1NldElkZW50aXR5KHBJZGVudFBhcmFtKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrQ29uZmlnOgorCQl7CisJCQl0RXBsRGxsQ29uZmlnUGFyYW0gKnBDb25maWdQYXJhbTsKKworCQkJcENvbmZpZ1BhcmFtID0gKHRFcGxEbGxDb25maWdQYXJhbSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQkJaWYgKHBDb25maWdQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA+IHBFdmVudF9wLT5tX3VpU2l6ZSkgeworCQkJCXBDb25maWdQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA9CisJCQkJICAgIHBFdmVudF9wLT5tX3VpU2l6ZTsKKwkJCX0KKwkJCVJldCA9IEVwbERsbGtDb25maWcocENvbmZpZ1BhcmFtKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKy8vRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBjb3VudCBvZiBUeCBmcmFtZXMgb2YgRklGTyB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KHRFcGxEbGxBc3luY1JlcVByaW9yaXR5ICogcFByaW9yaXR5X3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnB1aUNvdW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgbG9uZyB1bEZyYW1lQ291bnQ7CisKKwkvLyBnZXQgZnJhbWUgY291bnQgb2YgVHggRklGTyB3aXRoIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsCisJCQkJICAgICZ1bEZyYW1lQ291bnQpOworCS8vIHJldHVybnMga1NoYk9rLCBrU2hiSW52YWxpZEFyZworCisJLy8gZXJyb3IgaGFuZGxpbmcKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRnJhbWVDb3VudCA+CisJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10KSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10ID0KKwkJICAgIHVsRnJhbWVDb3VudDsKKwl9CisKKwlpZiAodWxGcmFtZUNvdW50ICE9IDApIHsJLy8gTk1UIHJlcXVlc3RzIGFyZSBpbiBxdWV1ZQorCQkqcFByaW9yaXR5X3AgPSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OworCQkqcHVpQ291bnRfcCA9ICh1bnNpZ25lZCBpbnQpdWxGcmFtZUNvdW50OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBmcmFtZSBjb3VudCBvZiBUeCBGSUZPIHdpdGggZ2VuZXJpYyBwcmlvcml0eQorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCSAgICAmdWxGcmFtZUNvdW50KTsKKwkvLyByZXR1cm5zIGtTaGJPaywga1NoYkludmFsaWRBcmcKKworCS8vIGVycm9yIGhhbmRsaW5nCisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bEZyYW1lQ291bnQgPgorCSAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFR4RnJhbWVDb3VudEdlbikgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFR4RnJhbWVDb3VudEdlbiA9CisJCSAgICB1bEZyYW1lQ291bnQ7CisJfQorCisJKnBQcmlvcml0eV9wID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJKnB1aUNvdW50X3AgPSAodW5zaWduZWQgaW50KXVsRnJhbWVDb3VudDsKKworICAgICAgRXhpdDoKKyNlbHNlCisJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPiAwKSB7CisJCSpwUHJpb3JpdHlfcCA9IGtFcGxEbGxBc3luY1JlcVByaW9ObXQ7CisJCSpwdWlDb3VudF9wID0gMTsKKwl9IGVsc2UgaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPiAwKSB7CisJCSpwUHJpb3JpdHlfcCA9IGtFcGxEbGxBc3luY1JlcVByaW9HZW5lcmljOworCQkqcHVpQ291bnRfcCA9IDE7CisJfSBlbHNlIHsKKwkJKnBQcmlvcml0eV9wID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCSpwdWlDb3VudF9wID0gMDsKKwl9CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0dldFR4RnJhbWUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIFR4IGZyYW1lcyBmcm9tIEZJRk8gd2l0aCBzcGVjaWZpZWQgcHJpb3JpdHkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lX3AgICAgICAgICAgICAgICAgPSBJTjogcG9pbnRlciB0byBidWZmZXIKKy8vICAgICAgICAgICAgICBwdWlGcmFtZVNpemVfcCAgICAgICAgICA9IElOOiBtYXggc2l6ZSBvZiBidWZmZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogYWN0dWFsIHNpemUgb2YgZnJhbWUKKy8vICAgICAgICAgICAgICBQcmlvcml0eV9wICAgICAgICAgICAgICA9IElOOiBwcmlvcml0eQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lKHZvaWQgKnBGcmFtZV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpwdWlGcmFtZVNpemVfcCwKKwkJCQkgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgbG9uZyB1bEZyYW1lU2l6ZTsKKworCXN3aXRjaCAoUHJpb3JpdHlfcCkgeworCWNhc2Uga0VwbERsbEFzeW5jUmVxUHJpb05tdDoJLy8gTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiQ2lyUmVhZERhdGFCbG9jayhFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsCisJCQkJCShCWVRFICopIHBGcmFtZV9wLCAqcHVpRnJhbWVTaXplX3AsCisJCQkJCSZ1bEZyYW1lU2l6ZSk7CisJCS8vIHJldHVybnMga1NoYk9rLCBrU2hiRGF0YVRydW5jYXRlZCwga1NoYkludmFsaWRBcmcsIGtTaGJOb1JlYWRhYmxlRGF0YQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpclJlYWREYXRhQmxvY2soRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCQkoQllURSAqKSBwRnJhbWVfcCwgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCQkmdWxGcmFtZVNpemUpOworCQkvLyByZXR1cm5zIGtTaGJPaywga1NoYkRhdGFUcnVuY2F0ZWQsIGtTaGJJbnZhbGlkQXJnLCBrU2hiTm9SZWFkYWJsZURhdGEKKwkJYnJlYWs7CisKKwl9CisKKwkvLyBlcnJvciBoYW5kbGluZworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJaWYgKFNoYkVycm9yID09IGtTaGJOb1JlYWRhYmxlRGF0YSkgeworCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eTsKKwkJfSBlbHNlIHsJLy8gb3RoZXIgZXJyb3IKKwkJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQl9CisJCWdvdG8gRXhpdDsKKwl9CisKKwkqcHVpRnJhbWVTaXplX3AgPSAodW5zaWduZWQgaW50KXVsRnJhbWVTaXplOworCisgICAgICBFeGl0OgorI2Vsc2UKKwlzd2l0Y2ggKFByaW9yaXR5X3ApIHsKKwljYXNlIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ6CS8vIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJCSpwdWlGcmFtZVNpemVfcCA9CisJCSAgICBtaW4oKnB1aUZyYW1lU2l6ZV9wLCBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10KTsKKwkJRVBMX01FTUNQWShwRnJhbWVfcCwgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lTm10LAorCQkJICAgKnB1aUZyYW1lU2l6ZV9wKTsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJKnB1aUZyYW1lU2l6ZV9wID0KKwkJICAgIG1pbigqcHVpRnJhbWVTaXplX3AsIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4pOworCQlFUExfTUVNQ1BZKHBGcmFtZV9wLCBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2FiRnJhbWVHZW4sCisJCQkgICAqcHVpRnJhbWVTaXplX3ApOworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID0gMDsKKwkJYnJlYWs7CisJfQorCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0ZyYW1lUmVjZWl2ZWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBwYXNzZXMgQVNuZCBmcmFtZSB0byByZWNlaXZlIEZJRk8uCisvLyAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjYWxsZWQgb25seSBmb3IgZnJhbWVzIHdpdGggcmVnaXN0ZXJlZCBBc25kU2VydmljZUlkcy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNGcmFtZVJlY2VpdmVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGx1Q2FsOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUFzbmRSeDsKKwlFdmVudC5tX3BBcmcgPSBwRnJhbWVJbmZvX3AtPm1fcEZyYW1lOworCUV2ZW50Lm1fdWlTaXplID0gcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplOworCS8vIHBhc3MgTmV0VGltZSBvZiBmcmFtZSB0byB1c2Vyc3BhY2UKKwlFdmVudC5tX05ldFRpbWUgPSBwRnJhbWVJbmZvX3AtPm1fTmV0VGltZTsKKworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyUnhGcmFtZUNvdW50Kys7CisJfSBlbHNlIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhSeEZyYW1lQ291bnQrKzsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQXN5bmNTZW5kKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcHV0cyB0aGUgZ2l2ZW4gZnJhbWUgaW50byB0aGUgdHJhbnNtaXQgRklGTyB3aXRoIHRoZSBzcGVjaWZpZWQKKy8vICAgICAgICAgICAgICBwcmlvcml0eS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lSW5mb19wICAgICAgICAgICAgPSBmcmFtZSBpbmZvIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIFByaW9yaXR5X3AgICAgICAgICAgICAgID0gcHJpb3JpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJc3dpdGNoIChQcmlvcml0eV9wKSB7CisJY2FzZSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OgkvLyBOTVQgcmVxdWVzdCBwcmlvcml0eQorCQlTaGJFcnJvciA9CisJCSAgICBTaGJDaXJXcml0ZURhdGFCbG9jayhFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJIG1fU2hiSW5zdGFuY2VUeE5tdCwKKwkJCQkJIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJCSBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCQkvLyByZXR1cm5zIGtTaGJPaywga1NoYkV4Y2VlZERhdGFTaXplTGltaXQsIGtTaGJCdWZmZXJGdWxsLCBrU2hiSW52YWxpZEFyZworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpcldyaXRlRGF0YUJsb2NrKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgbV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCQkgcEZyYW1lSW5mb19wLT5tX3BGcmFtZSwKKwkJCQkJIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSk7CisJCS8vIHJldHVybnMga1NoYk9rLCBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdCwga1NoYkJ1ZmZlckZ1bGwsIGtTaGJJbnZhbGlkQXJnCisJCWJyZWFrOworCisJfQorCisJLy8gZXJyb3IgaGFuZGxpbmcKKwlzd2l0Y2ggKFNoYkVycm9yKSB7CisJY2FzZSBrU2hiT2s6CisJCWJyZWFrOworCisJY2FzZSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDoKKwkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQlicmVhazsKKworCWNhc2Uga1NoYkJ1ZmZlckZ1bGw6CisJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJYnJlYWs7CisKKwljYXNlIGtTaGJJbnZhbGlkQXJnOgorCWRlZmF1bHQ6CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlicmVhazsKKwl9CisKKyNlbHNlCisKKwlzd2l0Y2ggKFByaW9yaXR5X3ApIHsKKwljYXNlIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ6CS8vIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID09IDApIHsKKwkJCUVQTF9NRU1DUFkoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lTm10LAorCQkJCSAgIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPQorCQkJICAgIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID09IDApIHsKKwkJCUVQTF9NRU1DUFkoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lR2VuLAorCQkJCSAgIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPQorCQkJICAgIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKwl9CisKKyNlbmRpZgorCisJLy8gcG9zdCBldmVudCB0byBETEwKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJRXZlbnQubV9wQXJnID0gJlByaW9yaXR5X3A7CisJRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHlfcCk7CisJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisjaWZkZWYgRVBMX05PX0ZJRk8KKyAgICAgIEV4aXQ6CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2xlYXJzIHRoZSB0cmFuc21pdCBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpclJlc2V0QnVmZmVyKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCwgMTAwMCwKKwkJCSAgICAgIE5VTEwpOworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVzZXRCdWZmZXIoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLCAxMDAwLAorCQkJICAgICAgTlVMTCk7CisKKyNlbHNlCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbiA9IDA7CisjZW5kaWYKKworLy8gICAgRVBMX01FTVNFVCgmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLCAwLCBzaXplb2YgKHRFcGxEbGxrQ2FsU3RhdGlzdGljcykpOworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2xlYXJzIHRoZSB0cmFuc21pdCBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNDbGVhclF1ZXVlcyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjbGVhciBNTiBhc3luY2hyb25vdXMgcXVldWVzCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRRdWV1ZUNuUmVxdWVzdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRSZXF1ZXN0UXVldWUgPSAwOworCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkSWRlbnRSZXEgPSAwOworCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZFN0YXR1c1JlcSA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxID0gMDsKKworCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEdldFN0YXRpc3RpY3MoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIHN0YXRpc3RpY3Mgb2YgdGhlIGFzeW5jaHJvbm91cyBxdWV1ZXMuCisvLworLy8gUGFyYW1ldGVyczogIHBwU3RhdGlzdGljcyAgICAgICAgICAgID0gc3RhdGlzdGljcyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEdldFN0YXRpc3RpY3ModEVwbERsbGtDYWxTdGF0aXN0aWNzICoqIHBwU3RhdGlzdGljcykKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LAorCQkJCSAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLgorCQkJCSAgICBtX3VsQ3VyVHhGcmFtZUNvdW50Tm10KTsKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpckdldFJlYWRCbG9ja0NvdW50KEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbiwKKwkJCQkgICAgJkVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy4KKwkJCQkgICAgbV91bEN1clR4RnJhbWVDb3VudEdlbik7CisvLyAgICBTaGJFcnJvciA9IFNoYkNpckdldFJlYWRCbG9ja0NvdW50IChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlUngsICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clJ4RnJhbWVDb3VudCk7CisKKyNlbHNlCisJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPiAwKSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyVHhGcmFtZUNvdW50Tm10ID0gMTsKKwl9IGVsc2UgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clR4RnJhbWVDb3VudE5tdCA9IDA7CisJfQorCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID4gMCkgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clR4RnJhbWVDb3VudEdlbiA9IDE7CisJfSBlbHNlIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxDdXJUeEZyYW1lQ291bnRHZW4gPSAwOworCX0KKyNlbmRpZgorCisJKnBwU3RhdGlzdGljcyA9ICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3M7CisJcmV0dXJuIFJldDsKK30KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbElzc3VlUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IGlzc3VlcyBhIFN0YXR1c1JlcXVlc3Qgb3IgYSBJZGVudFJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlX3AgICAgICAgICAgICAgICA9IHJlcXVlc3Qgc2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIGJTb2FGbGFnMV9wICAgICAgICAgICAgID0gZmxhZzEgZm9yIHRoaXMgbm9kZSAodHJhbnNtaXQgaW4gU29BIGFuZCBQUmVxKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgMHhGRiB0aGlzIGZsYWcgaXMgaWdub3JlZC4KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbElzc3VlUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkIFNlcnZpY2VfcCwKKwkJCQkgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLCBCWVRFIGJTb2FGbGFnMV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoYlNvYUZsYWcxX3AgIT0gMHhGRikgeworCQlSZXQgPSBFcGxEbGxrU2V0RmxhZzFPZk5vZGUodWlOb2RlSWRfcCwgYlNvYUZsYWcxX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisJLy8gYWRkIG5vZGUgdG8gYXBwcm9wcmlhdGUgcmVxdWVzdCBxdWV1ZQorCXN3aXRjaCAoU2VydmljZV9wKSB7CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZUlkZW50OgorCQl7CisJCQlpZiAoKChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSArCisJCQkgICAgICAxKSAlCisJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCW1fYXVpUXVldWVJZGVudFJlcSkpCisJCQkgICAgPT0gRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRJZGVudFJlcSkgewkvLyBxdWV1ZSBpcyBmdWxsCisJCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJICAgIG1fYXVpUXVldWVJZGVudFJlcVtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJICAgICAgIG1fdWlXcml0ZUlkZW50UmVxXSA9IHVpTm9kZUlkX3A7CisJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSA9CisJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxICsKKwkJCSAgICAgMSkgJQorCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUlkZW50UmVxKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzOgorCQl7CisJCQlpZiAoKChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVTdGF0dXNSZXEgKworCQkJICAgICAgMSkgJQorCQkJICAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQltX2F1aVF1ZXVlU3RhdHVzUmVxKSkKKwkJCSAgICA9PSBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZFN0YXR1c1JlcSkgewkvLyBxdWV1ZSBpcyBmdWxsCisJCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJICAgIG1fYXVpUXVldWVTdGF0dXNSZXFbRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQltX3VpV3JpdGVTdGF0dXNSZXFdID0KKwkJCSAgICB1aU5vZGVJZF9wOworCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxID0KKwkJCSAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxICsKKwkJCSAgICAgMSkgJQorCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICAgIG1fYXVpUXVldWVTdGF0dXNSZXEpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgbmV4dCByZXF1ZXN0IGZvciBTb0EuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTGsgbW9kdWxlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVxU2VydmljZUlkX3AgICAgICAgICA9IHBvaW50ZXIgdG8gcmVxdWVzdCBzZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTjogYXZhaWxhYmxlIHJlcXVlc3QgZm9yIE1OIE5NVCBvciBnZW5lcmljIHJlcXVlc3QgcXVldWUgKEZsYWcyLlBSKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGtFcGxEbGxSZXFTZXJ2aWNlTm8gaWYgcXVldWVzIGFyZSBlbXB0eQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBuZXh0IHJlcXVlc3QKKy8vICAgICAgICAgICAgICBwdWlOb2RlSWRfcCAgICAgICAgICAgICA9IE9VVDogcG9pbnRlciB0byBub2RlIElEIG9mIG5leHQgcmVxdWVzdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVQTF9DX0FEUl9JTlZBTElELCBpZiByZXF1ZXN0IGlzIHNlbGYgYWRkcmVzc2VkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFNvYVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCAqIHBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUNvdW50OworCisvLyAgICAqcFJlcVNlcnZpY2VJZF9wID0ga0VwbERsbFJlcVNlcnZpY2VObzsKKworCWZvciAodWlDb3VudCA9IEVQTF9ETExLQ0FMX01BWF9RVUVVRVM7IHVpQ291bnQgPiAwOyB1aUNvdW50LS0pIHsKKwkJc3dpdGNoIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSkgeworCQljYXNlIDA6CisJCQl7CS8vIENuR2VuUmVxCisJCQkJZm9yICg7CisJCQkJICAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fdWlOZXh0UXVldWVDblJlcXVlc3QgPAorCQkJCSAgICAgKHRhYmVudHJpZXMKKwkJCQkgICAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICAgIG1fYXVpUXVldWVDblJlcXVlc3RzKSAvIDIpOworCQkJCSAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0KyspIHsKKwkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzW0VwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3RdID4gMCkgewkvLyBub24gZW1wdHkgcXVldWUgZm91bmQKKwkJCQkJCS8vIHJlbW92ZSBvbmUgcmVxdWVzdCBmcm9tIHF1ZXVlCisJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cworCQkJCQkJICAgIFtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdF0tLTsKKwkJCQkJCSpwdWlOb2RlSWRfcCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCArIDE7CisJCQkJCQkqcFJlcVNlcnZpY2VJZF9wID0KKwkJCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkOworCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCsrOworCQkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPj0gKHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHMpIC8gMikpIHsJLy8gbGFzdCBub2RlIHJlYWNoZWQKKwkJCQkJCQkvLyBjb250aW51ZSB3aXRoIENuTm10UmVxIHF1ZXVlIGF0IG5leHQgU29BCisJCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fdWlOZXh0UmVxdWVzdFF1ZXVlCisJCQkJCQkJICAgID0gMTsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBhbGwgQ25HZW5SZXEgcXVldWVzIGFyZSBlbXB0eSAtPiBjb250aW51ZSB3aXRoIENuTm10UmVxIHF1ZXVlCisJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRSZXF1ZXN0UXVldWUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgMToKKwkJCXsJLy8gQ25ObXRSZXEKKwkJCQlmb3IgKDsKKwkJCQkgICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCA8CisJCQkJICAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJbV9hdWlRdWV1ZUNuUmVxdWVzdHMpOworCQkJCSAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0KyspIHsKKwkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzW0VwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3RdID4gMCkgewkvLyBub24gZW1wdHkgcXVldWUgZm91bmQKKwkJCQkJCS8vIHJlbW92ZSBvbmUgcmVxdWVzdCBmcm9tIHF1ZXVlCisJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cworCQkJCQkJICAgIFtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdF0tLTsKKwkJCQkJCSpwdWlOb2RlSWRfcCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCArIDEgLQorCQkJCQkJICAgICh0YWJlbnRyaWVzCisJCQkJCQkgICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgIG1fYXVpUXVldWVDblJlcXVlc3RzKSAvCisJCQkJCQkgICAgIDIpOworCQkJCQkJKnBSZXFTZXJ2aWNlSWRfcCA9CisJCQkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0OworCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCsrOworCQkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPiB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzKSkgewkvLyBsYXN0IG5vZGUgcmVhY2hlZAorCQkJCQkJCS8vIHJlc3RhcnQgQ25HZW5SZXEgcXVldWUKKwkJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdAorCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJLy8gY29udGludWUgd2l0aCBNbkdlblJlcSBxdWV1ZSBhdCBuZXh0IFNvQQorCQkJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX3VpTmV4dFJlcXVlc3RRdWV1ZQorCQkJCQkJCSAgICA9IDI7CisJCQkJCQl9CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gcmVzdGFydCBDbkdlblJlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPSAwOworCQkJCS8vIGFsbCBDbk5tdFJlcSBxdWV1ZXMgYXJlIGVtcHR5IC0+IGNvbnRpbnVlIHdpdGggTW5HZW5SZXEgcXVldWUKKwkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSAyOgorCQkJewkvLyBNbk5tdFJlcSBhbmQgTW5HZW5SZXEKKwkJCQkvLyBuZXh0IHF1ZXVlIHdpbGwgYmUgTW5JZGVudFJlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlID0gMzsKKwkJCQlpZiAoKnBSZXFTZXJ2aWNlSWRfcCAhPSBrRXBsRGxsUmVxU2VydmljZU5vKSB7CisJCQkJCSpwdWlOb2RlSWRfcCA9IEVQTF9DX0FEUl9JTlZBTElEOwkvLyBETExrIG11c3QgZXhjaGFuZ2UgdGhpcyB3aXRoIHRoZSBhY3R1YWwgbm9kZSBJRAorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgMzoKKwkJCXsJLy8gTW5JZGVudFJlcQorCQkJCS8vIG5leHQgcXVldWUgd2lsbCBiZSBNblN0YXR1c1JlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlID0gNDsKKwkJCQlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRJZGVudFJlcSAhPSBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSkgewkvLyBxdWV1ZSBpcyBub3QgZW1wdHkKKwkJCQkJKnB1aU5vZGVJZF9wID0KKwkJCQkJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9hdWlRdWV1ZUlkZW50UmVxCisJCQkJCSAgICBbRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSAgICAgbV91aVJlYWRJZGVudFJlcV07CisJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkSWRlbnRSZXEgPQorCQkJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkSWRlbnRSZXEgKworCQkJCQkgICAgIDEpICUKKwkJCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9hdWlRdWV1ZUlkZW50UmVxKTsKKwkJCQkJKnBSZXFTZXJ2aWNlSWRfcCA9CisJCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZUlkZW50OworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgNDoKKwkJCXsJLy8gTW5TdGF0dXNSZXEKKwkJCQkvLyBuZXh0IHF1ZXVlIHdpbGwgYmUgQ25HZW5SZXEgcXVldWUKKwkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSA9IDA7CisJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkU3RhdHVzUmVxICE9IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZVN0YXR1c1JlcSkgewkvLyBxdWV1ZSBpcyBub3QgZW1wdHkKKwkJCQkJKnB1aU5vZGVJZF9wID0KKwkJCQkJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9hdWlRdWV1ZVN0YXR1c1JlcQorCQkJCQkgICAgW0VwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkU3RhdHVzUmVxXTsKKwkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRTdGF0dXNSZXEgPQorCQkJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkU3RhdHVzUmVxICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fYXVpUXVldWVTdGF0dXNSZXEpOworCQkJCQkqcFJlcVNlcnZpY2VJZF9wID0KKwkJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyB0aGUgcGVuZGluZyBhc3luY2hyb25vdXMgZnJhbWUgcmVxdWVzdHMgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIFRoaXMgd2lsbCBhZGQgdGhlIG5vZGUgdG8gdGhlIGFzeW5jaHJvbm91cyByZXF1ZXN0IHNjaGVkdWxlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgQXN5bmNSZXFQcmlvX3AgICAgICAgICAgPSBhc3luY2hyb25vdXMgcmVxdWVzdCBwcmlvcml0eQorLy8gICAgICAgICAgICAgIHVpQ291bnRfcCAgICAgICAgICAgICAgID0gY291bnQgb2YgYXN5bmNocm9ub3VzIGZyYW1lcworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNTZXRQZW5kaW5nUmVxdWVzdHModW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkKKwkJCQkJICAgICBBc3luY1JlcVByaW9fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlDb3VudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBhZGQgbm9kZSB0byBhcHByb3ByaWF0ZSByZXF1ZXN0IHF1ZXVlCisJc3dpdGNoIChBc3luY1JlcVByaW9fcCkgeworCWNhc2Uga0VwbERsbEFzeW5jUmVxUHJpb05tdDoKKwkJeworCQkJdWlOb2RlSWRfcC0tOworCQkJaWYgKHVpTm9kZUlkX3AgPj0KKwkJCSAgICAodGFiZW50cmllcworCQkJICAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHMpIC8gMikpIHsKKwkJCQlSZXQgPSBrRXBsRGxsSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCXVpTm9kZUlkX3AgKz0KKwkJCSAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cykgLyAyOworCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHNbdWlOb2RlSWRfcF0gPQorCQkJICAgIHVpQ291bnRfcDsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQl1aU5vZGVJZF9wLS07CisJCQlpZiAodWlOb2RlSWRfcCA+PQorCQkJICAgICh0YWJlbnRyaWVzCisJCQkgICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2F1aVF1ZXVlQ25SZXF1ZXN0cykgLyAyKSkgeworCQkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHNbdWlOb2RlSWRfcF0gPQorCQkJICAgIHVpQ291bnRfcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENhbGxiYWNrIGhhbmRsZXIgZm9yIG5ldyBkYXRhIHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfTk9fRklGTworLypzdGF0aWMgdm9pZCAgRXBsRGxsa0NhbFR4Tm10U2lnbmFsSGFuZGxlciAoCisgICAgdFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7Cit0RXBsS2VybmVsICAgICAgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cit0RXBsRXZlbnQgICAgICAgRXZlbnQ7Cit0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eTsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KK3RTaGJFcnJvciAgIFNoYkVycm9yOwordW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKworICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCwgJnVsQmxvY2tDb3VudCk7CisgICAgaWYgKHVsQmxvY2tDb3VudCA+IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10KQorICAgIHsKKyAgICAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRObXQgPSB1bEJsb2NrQ291bnQ7CisgICAgfQorCisjZW5kaWYKKworICAgIC8vIHBvc3QgZXZlbnQgdG8gRExMCisgICAgUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OworICAgIEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisgICAgRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKyAgICBFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKyAgICBFdmVudC5tX3BBcmcgPSAmUHJpb3JpdHk7CisgICAgRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHkpOworICAgIFJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworfQorCitzdGF0aWMgdm9pZCAgRXBsRGxsa0NhbFR4R2VuU2lnbmFsSGFuZGxlciAoCisgICAgdFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7Cit0RXBsS2VybmVsICAgICAgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cit0RXBsRXZlbnQgICAgICAgRXZlbnQ7Cit0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eTsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KK3RTaGJFcnJvciAgIFNoYkVycm9yOwordW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKworICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbiwgJnVsQmxvY2tDb3VudCk7CisgICAgaWYgKHVsQmxvY2tDb3VudCA+IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50R2VuKQorICAgIHsKKyAgICAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRHZW4gPSB1bEJsb2NrQ291bnQ7CisgICAgfQorCisjZW5kaWYKKworICAgIC8vIHBvc3QgZXZlbnQgdG8gRExMCisgICAgUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYzsKKyAgICBFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworICAgIEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisgICAgRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisgICAgRXZlbnQubV9wQXJnID0gJlByaW9yaXR5OworICAgIEV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFByaW9yaXR5KTsKKyAgICBSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKK30KKyovCisjZW5kaWYKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGx1Q2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbHVDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjRhMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGx1Q2FsLmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRExMIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlIGluIEVQTCB1c2VyIHBhcnQKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGx1Q2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgorCisjaW5jbHVkZSAiRXBsRGxsQ2FsLmgiCisKKy8vIGluY2x1ZGUgb25seSBpZiBkaXJlY3QgY2FsbCBiZXR3ZWVuIHVzZXItIGFuZCBrZXJuZWxzcGFjZSBpcyBlbmFibGVkCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsRGxsdUNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbERsbHVDYkFzbmQgbV9hcGZuRGxsdUNiQXNuZFtFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSURdOworCit9IHRFcGxEbGx1Q2FsSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHNoYWxsIGJlIHVzZWQKKy8vIGRlZmluZSBzdHJ1Y3R1cmVzIHN0YXRpY2FsbHkKK3N0YXRpYyB0RXBsRGxsdUNhbEluc3RhbmNlIEVwbERsbHVDYWxJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIodEVwbERsbEFzbmRTZXJ2aWNlSWQKKwkJCQkJCSAgIFNlcnZpY2VJZF9wLAorCQkJCQkJICAgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbEFkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkIGFuZCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBETEwgQ0FMIG1vZHVsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbERsbHVDYWxJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsRGxsdUNhbEluc3RhbmNlX2cpKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRExMIENBTCBtb2R1bGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxEbGx1Q2FsSW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbERsbHVDYWxJbnN0YW5jZV9nKSk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGx1Q2FsUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzIHRoZSBwYXNzZWQgYXN5bmNoIGZyYW1lCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICAgICAgICAgID0gZXZlbnQgY29udGFpbmluZyBmcmFtZSB0byBiZSBwcm9jZXNzZWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTXNnVHlwZSBNc2dUeXBlOworCXVuc2lnbmVkIGludCB1aUFzbmRTZXJ2aWNlSWQ7CisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisKKwlpZiAocEV2ZW50X3AtPm1fRXZlbnRUeXBlID09IGtFcGxFdmVudFR5cGVBc25kUngpIHsKKwkJRnJhbWVJbmZvLm1fcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHBFdmVudF9wLT5tX3VpU2l6ZTsKKwkJLy8gZXh0cmFjdCBOZXRUaW1lCisJCUZyYW1lSW5mby5tX05ldFRpbWUgPSBwRXZlbnRfcC0+bV9OZXRUaW1lOworCisJCU1zZ1R5cGUgPQorCQkgICAgKHRFcGxNc2dUeXBlKSBBbWlHZXRCeXRlRnJvbUxlKCZGcmFtZUluZm8ubV9wRnJhbWUtPgorCQkJCQkJICAgbV9sZV9iTWVzc2FnZVR5cGUpOworCQlpZiAoTXNnVHlwZSAhPSBrRXBsTXNnVHlwZUFzbmQpIHsKKwkJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQkJZ290byBFeGl0OworCQl9CisKKwkJdWlBc25kU2VydmljZUlkID0KKwkJICAgICh1bnNpZ25lZCBpbnQpQW1pR2V0Qnl0ZUZyb21MZSgmRnJhbWVJbmZvLm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkgICBtX0FzbmQubV9sZV9iU2VydmljZUlkKTsKKwkJaWYgKHVpQXNuZFNlcnZpY2VJZCA8IEVQTF9ETExfTUFYX0FTTkRfU0VSVklDRV9JRCkgewkvLyBBU25kIHNlcnZpY2UgSUQgaXMgdmFsaWQKKwkJCWlmIChFcGxEbGx1Q2FsSW5zdGFuY2VfZy5tX2FwZm5EbGx1Q2JBc25kW3VpQXNuZFNlcnZpY2VJZF0gIT0gTlVMTCkgewkvLyBoYW5kbGVyIHdhcyByZWdpc3RlcmVkCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsdUNhbEluc3RhbmNlX2cuCisJCQkJICAgIG1fYXBmbkRsbHVDYkFzbmRbdWlBc25kU2VydmljZUlkXQorCQkJCSAgICAoJkZyYW1lSW5mbyk7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZAorLy8gICAgICAgICAgICAgIEFzbmRTZXJ2aWNlSWQgd2l0aCB0aGUgc3BlY2lmaWVkIG5vZGUgSUQgZmlsdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlSWRfcCAgICAgICAgICAgICA9IEFTbmQgU2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHBmbkRsbHVDYkFzbmRfcCAgICAgICAgID0gY2FsbGJhY2sgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICBGaWx0ZXJfcCAgICAgICAgICAgICAgICA9IG5vZGUgSUQgZmlsdGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxSZWdBc25kU2VydmljZSh0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkgICAgdEVwbERsbHVDYkFzbmQgcGZuRGxsdUNiQXNuZF9wLAorCQkJCSAgICB0RXBsRGxsQXNuZEZpbHRlciBGaWx0ZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKFNlcnZpY2VJZF9wIDwgdGFiZW50cmllcyhFcGxEbGx1Q2FsSW5zdGFuY2VfZy5tX2FwZm5EbGx1Q2JBc25kKSkgeworCQkvLyBtZW1vcml6ZSBmdW5jdGlvbiBwb2ludGVyCisJCUVwbERsbHVDYWxJbnN0YW5jZV9nLm1fYXBmbkRsbHVDYkFzbmRbU2VydmljZUlkX3BdID0KKwkJICAgIHBmbkRsbHVDYkFzbmRfcDsKKworCQlpZiAocGZuRGxsdUNiQXNuZF9wID09IE5VTEwpIHsJLy8gY2xvc2UgZmlsdGVyCisJCQlGaWx0ZXJfcCA9IGtFcGxEbGxBc25kRmlsdGVyTm9uZTsKKwkJfQorCQkvLyBzZXQgZmlsdGVyIGluIERMTCBtb2R1bGUgaW4ga2VybmVsIHBhcnQKKwkJUmV0ID0gRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIoU2VydmljZUlkX3AsIEZpbHRlcl9wKTsKKworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxBc3luY1NlbmQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kcyB0aGUgZnJhbWUgd2l0aCB0aGUgc3BlY2lmaWVkIHByaW9yaXR5LgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IGZyYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3VpRnJhbWVTaXplIGRvZXMgbm90IGluY2x1ZGUgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKQorLy8gICAgICAgICAgICAgIFByaW9yaXR5X3AgICAgICAgICAgICAgID0gcHJpb3JpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwlwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUgKz0gMTQ7CS8vIGFkZCBzaXplIG9mIGV0aGVybmV0IGhlYWRlcgorCVJldCA9IEVwbERsbGtDYWxBc3luY1NlbmQocEZyYW1lSW5mb19wLCBQcmlvcml0eV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbElzc3VlUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IGlzc3VlcyBhIFN0YXR1c1JlcXVlc3Qgb3IgYSBJZGVudFJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlX3AgICAgICAgICAgICAgICA9IHJlcXVlc3Qgc2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIGJTb2FGbGFnMV9wICAgICAgICAgICAgID0gZmxhZzEgZm9yIHRoaXMgbm9kZSAodHJhbnNtaXQgaW4gU29BIGFuZCBQUmVxKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgMHhGRiB0aGlzIGZsYWcgaXMgaWdub3JlZC4KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbElzc3VlUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkIFNlcnZpY2VfcCwKKwkJCQkgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLCBCWVRFIGJTb2FGbGFnMV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBhZGQgbm9kZSB0byBhcHByb3ByaWF0ZSByZXF1ZXN0IHF1ZXVlCisJc3dpdGNoIChTZXJ2aWNlX3ApIHsKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQ6CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZVN0YXR1czoKKwkJeworCQkJdEVwbEV2ZW50IEV2ZW50OworCQkJdEVwbERsbENhbElzc3VlUmVxdWVzdCBJc3N1ZVJlcTsKKworCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtJc3N1ZVJlcTsKKwkJCUlzc3VlUmVxLm1fU2VydmljZSA9IFNlcnZpY2VfcDsKKwkJCUlzc3VlUmVxLm1fdWlOb2RlSWQgPSB1aU5vZGVJZF9wOworCQkJSXNzdWVSZXEubV9iU29hRmxhZzEgPSBiU29hRmxhZzFfcDsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZJc3N1ZVJlcTsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKElzc3VlUmVxKTsKKworCQkJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbEFkZE5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGRzIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHBOb2RlSW5mb19wICAgICAgICAgICAgID0gcG9pbnRlciBvZiBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZTsKKwlFdmVudC5tX3BBcmcgPSBwTm9kZUluZm9fcDsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZih0RXBsRGxsTm9kZUluZm8pOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbERlbGV0ZU5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbm9kZSBmcm9tIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxEZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRGVsTm9kZTsKKwlFdmVudC5tX3BBcmcgPSAmdWlOb2RlSWRfcDsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZih1aU5vZGVJZF9wKTsKKworCVJldCA9IEVwbEV2ZW50dVBvc3QoJkV2ZW50KTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBub2RlIHNvZnRseSBmcm9tIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGtDYWw7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlOworCUV2ZW50Lm1fcEFyZyA9ICZ1aU5vZGVJZF9wOworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKHVpTm9kZUlkX3ApOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxTZXRBc25kU2VydmljZUlkRmlsdGVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZm9yd2FyZHMgY2FsbCB0byBFcGxEbGxrU2V0QXNuZFNlcnZpY2VJZEZpbHRlcigpIGluIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gQVNuZCBTZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgRmlsdGVyX3AgICAgICAgICAgICAgICAgPSBub2RlIElEIGZpbHRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIodEVwbERsbEFzbmRTZXJ2aWNlSWQKKwkJCQkJCSAgIFNlcnZpY2VJZF9wLAorCQkJCQkJICAgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXIgU2VydkZpbHRlcjsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGtDYWw7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1NlcnZGaWx0ZXI7CisJU2VydkZpbHRlci5tX1NlcnZpY2VJZCA9IFNlcnZpY2VJZF9wOworCVNlcnZGaWx0ZXIubV9GaWx0ZXIgPSBGaWx0ZXJfcDsKKwlFdmVudC5tX3BBcmcgPSAmU2VydkZpbHRlcjsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihTZXJ2RmlsdGVyKTsKKworCVJldCA9IEVwbEV2ZW50dVBvc3QoJkV2ZW50KTsKKworCXJldHVybiBSZXQ7Cit9CisKKyNlbmRpZiAvLyAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyRGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEVyckRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZWUxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEVyckRlZi5oCkBAIC0wLDAgKzEsMjk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgZGVmaW5pdGlvbnMgZm9yIGFsbCBFUEwtZnVuY3Rpb24gcmV0dXJuIGNvZGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXJyRGVmLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMDYvMjMgMTQ6NTY6MzMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIGFsbAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMTIvMDUgLWFzOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9FUlJPUkRFRl9IXworI2RlZmluZSBfRVBMX0VSUk9SREVGX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXR1cm4gY29kZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJLy8gYXJlYSBmb3IgZ2VuZXJpYyBlcnJvcnMgMHgwMDAwIC0gMHgwMDBGCisJa0VwbFN1Y2Nlc3NmdWwgPSAweDAwMDAsCS8vIG5vIGVycm9yL3N1Y2Nlc3NmdWwgcnVuCisJa0VwbElsbGVnYWxJbnN0YW5jZSA9IDB4MDAwMSwJLy8gdGhlIGNhbGxlZCBJbnN0YW56IGRvZXMgbm90IGV4aXN0CisJa0VwbEludmFsaWRJbnN0YW5jZVBhcmFtID0gMHgwMDAyLAkvLworCWtFcGxOb0ZyZWVJbnN0YW5jZSA9IDB4MDAwMywJLy8gWHh4QWRkSW5zdGFuY2Ugd2FzIGNhbGxlZCBidXQgbm8gZnJlZSBpbnN0YW5jZSBpcyBhdmFpbGFibGUKKwlrRXBsV3JvbmdTaWduYXR1cmUgPSAweDAwMDQsCS8vIHdyb25nIHNpZ25hdHVyZSB3aGlsZSB3cml0aW5nIHRvIG9iamVjdCAweDEwMTAgb3IgMHgxMDExCisJa0VwbEludmFsaWRPcGVyYXRpb24gPSAweDAwMDUsCS8vIG9wZXJhdGlvbiBub3QgYWxsb3dlZCBpbiB0aGlzIHNpdHVhdGlvbgorCWtFcGxJbnZhbGlkTm9kZUlkID0gMHgwMDA3LAkvLyBpbnZhbGlkIE5vZGVJZCB3YXMgc3BlY2lmaWVkCisJa0VwbE5vUmVzb3VyY2UgPSAweDAwMDgsCS8vIHJlc291cmNlIGNvdWxkIG5vdCBiZSBjcmVhdGVkIChXaW5kb3dzLCBQeFJPUywgLi4uKQorCWtFcGxTaHV0ZG93biA9IDB4MDAwOSwJLy8gc3RhY2sgaXMgc2h1dHRpbmcgZG93bgorCWtFcGxSZWplY3QgPSAweDAwMEEsCS8vIHJlamVjdCB0aGUgc3Vic2VxdWVudCBjb21tYW5kCisKKwkvLyBhcmVhIGZvciBFRFJWIG1vZHVsZSAweDAwMTAgLSAweDAwMUYKKy8vICAgIGtFcGxFZHJ2Tm9GcmFtZSAgICAgICAgICAgICA9IDB4MDAxMCwgICAgICAgLy8gbm8gQ0FOIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkCisvLyAgICBrRXBsRWRydk1zZ0hpZ2ggICAgICAgICAgICAgPSAweDAwMTEsICAgICAgIC8vIENBTiBtZXNzYWdlIHdpdGggaGlnaCBwcmlvcml0eSB3YXMgcmVjZWl2ZWQKKy8vICAgIGtFcGxFZHJ2TXNnTG93ICAgICAgICAgICAgICA9IDB4MDAxMiwgICAgICAgLy8gQ0FOIG1lc3NhZ2Ugd2l0aCBsb3cgcHJpb3JpdHkgd2FzIHJlY2VpdmVkCisJa0VwbEVkcnZJbml0RXJyb3IgPSAweDAwMTMsCS8vIGluaXRpYWxpc2F0aW9uIGVycm9yCisJa0VwbEVkcnZOb0ZyZWVCdWZFbnRyeSA9IDB4MDAxNCwJLy8gbm8gZnJlZSBlbnRyeSBpbiBpbnRlcm5hbCBidWZmZXIgdGFibGUgZm9yIFR4IGZyYW1lcworCWtFcGxFZHJ2QnVmTm90RXhpc3RpbmcgPSAweDAwMTUsCS8vIHNwZWNpZmllZCBUeCBidWZmZXIgZG9lcyBub3QgZXhpc3QKKy8vICAgIGtFcGxFZHJ2Tm9GcmVlQ2hhbm5lbCAgICAgICA9IDB4MDAxNCwgICAgICAgLy8gQ0FOIGNvbnRyb2xsZXIgaGFzIG5vdCBhIGZyZWUgY2hhbm5lbAorLy8gICAga0VwbEVkcnZUeEJ1ZmZIaWdoT3ZlcnJ1biAgID0gMHgwMDE1LCAgICAgICAvLyBidWZmZXIgZm9yIGhpZ2ggcHJpb3JpdHkgQ0FOIHRyYW5zbWl0IG1lc3NhZ2VzIGhhcyBvdmVycnVuCisvLyAgICBrRXBsRWRydlR4QnVmZkxvd092ZXJydW4gICAgPSAweDAwMTYsICAgICAgIC8vIGJ1ZmZlciBmb3IgbG93IHByaW9yaXR5IENBTiB0cmFuc21pdCBtZXNzYWdlcyBoYXMgb3ZlcnJ1bgorLy8gICAga0VwbEVkcnZJbGxlZ2FsQmRpICAgICAgICAgID0gMHgwMDE3LCAgICAgICAvLyB1bnN1cHBvcnRlZCBiYXVkcmF0ZSB3aXRoaW4gYmF1ZHJhdGUgdGFibGUKKy8vICAgIGtFcGxFZHJ2QnVzeSAgICAgICAgICAgICAgICA9IDB4MDAxOCwgICAgICAgLy8gcmVtb3RlIGZyYW1lIGNhbiBub3QgYmUgdXBkYXRlZCBiZWNhdXNlIG5vIGJ1cyBjb250YWN0IG9yIENBTgorCS8vIHRyYW5zbWlzc2lvbiBpcyBhY3RpdgorLy8gICAga0VwbEVkcnZJbnZhbGlkRHJpdmVyVHlwZSAgID0gMHgwMDE5LCAgICAgICAvLyAoUEM6IFdpbmRvd3Mgb3IgTGludXgpIGludmFsaWQgZHJpdmVyIHR5cGUKKy8vICAgIGtFcGxFZHJ2RHJpdmVyTm90Rm91bmQgICAgICA9IDB4MDAxQSwgICAgICAgLy8gKFBDOiBXaW5kb3dzIG9yIExpbnV4KSBkcml2ZXIgKERMTCkgY291bGQgbm90IGJlIGZvdW5kCisvLyAgICBrRXBsRWRydkludmFsaWRCYXNlQWRkcmVzcyAgPSAweDAwMUIsICAgICAgIC8vIChQQzogV2luZG93cyBvciBMaW51eCkgZHJpdmVyIGNvdWxkIG5vdCBmb3VuZCB0aGUgQ0FOIGNvbnRyb2xsZXIKKy8vICAgIGtFcGxFZHJ2SW52YWxpZFBhcmFtICAgICAgICA9IDB4MDAxQywgICAgICAgLy8gaW52YWxpZCBwYXJhbSBpbiBmdW5jdGlvbiBjYWxsCisKKwkvLyBhcmVhIGZvciBDT0IgbW9kdWxlIDB4MDAyMCAtIDB4MDAyRgorLyogICAga0VwbENvYk5vRnJlZUVudHJ5ICAgICAgICAgID0gMHgwMDIwLCAgICAgICAvLyBubyBmcmVlIGVudHJ5IGluIFJYLSBvciBUWC1DT0IgdGFibGUKKyAgICBrRXBsQ29iQWxyZWFkeUV4aXN0ICAgICAgICAgPSAweDAwMjEsICAgICAgIC8vIENPQi1JRCBhbHJlYWR5IGV4aXN0cyBpbiBSWC0gcmVzcC4gVFgtQ09CIHRhYmxlCisgICAgKi8KKwlrRXBsRGxsSWxsZWdhbEhkbCA9IDB4MDAyMiwJLy8gaWxsZWdhbCBoYW5kbGUgZm9yIGEgVHhGcmFtZSB3YXMgcGFzc2VkCisJa0VwbERsbENiQXN5bmNSZWdpc3RlcmVkID0gMHgwMDIzLAkvLyBoYW5kbGVyIGZvciBub24tRVBMIGZyYW1lcyB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGJlZm9yZQorLy8gICAga0VwbERsbEFzeW5jUnhCdWZmZXJGdWxsICAgID0gMHgwMDI0LCAgICAgICAvLyByZWNlaXZlIGJ1ZmZlciBmb3IgYXN5bmNocm9ub3VzIGZyYW1lcyBpcyBmdWxsCisJa0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eSA9IDB4MDAyNSwJLy8gdHJhbnNtaXQgYnVmZmVyIGZvciBhc3luY2hyb25vdXMgZnJhbWVzIGlzIGVtcHR5CisJa0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsID0gMHgwMDI2LAkvLyB0cmFuc21pdCBidWZmZXIgZm9yIGFzeW5jaHJvbm91cyBmcmFtZXMgaXMgZnVsbAorCWtFcGxEbGxOb05vZGVJbmZvID0gMHgwMDI3LAkvLyBNTjogdG9vIGxlc3Mgc3BhY2UgaW4gdGhlIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKwlrRXBsRGxsSW52YWxpZFBhcmFtID0gMHgwMDI4LAkvLyBpbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGZ1bmN0aW9uCisJa0VwbERsbFR4QnVmTm90UmVhZHkgPSAweDAwMkUsCS8vIFR4QnVmZmVyIChlLmcuIGZvciBQUmVxKSBpcyBub3QgcmVhZHkgeWV0CisJa0VwbERsbFR4RnJhbWVJbnZhbGlkID0gMHgwMDJGLAkvLyBUeEZyYW1lIChlLmcuIGZvciBQUmVxKSBpcyBpbnZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisvKiAgICBrRXBsQ29iSWxsZWdhbENhbklkICAgICAgICAgPSAweDAwMjMsICAgICAgIC8vIENPQi1JRCBpcyBub3QgYWxsb3dlZCAobGlrZSAweDAwMCBpcyByZXNlcnZlZCBmb3IgTk1ULCAuLi4pCisgICAga0VwbENvYkludmFsaWRDYW5JZCAgICAgICAgID0gMHgwMDI0LCAgICAgICAvLyBDT0ItSUQgaXMgc3dpdGNoZWQgb2ZmCisgICAga0VwbENvYkNkcnZTdGF0ZVNldCAgICAgICAgID0gMHgwMDI1LCAgICAgICAvLyBhdCBsZWFzdCBvbmUgYml0IG9mIENBTiBkcml2ZXIgc3RhdGUgaXMgc2V0CisgICAga0VwbENvYk5vRnJlZUVudHJ5SGlnaEJ1ZiAgID0gMHgwMDI2LCAgICAgICAvLyBubyBmcmVlIGVudHJ5IGluIGhpZ2ggcHJpb3RpdHkgUlgtIG9yIFRYLUNPQiB0YWJsZQorICAgIGtFcGxDb2JPd25JZCAgICAgICAgICAgICAgICA9IDB4MDAyNywgICAgICAgLy8gQ09CLUlEIGFscmVhZHkgZXhpc3RzIGluIG93biBtb2R1bGUgd2hpY2ggY2FsbHMgQ29iRGVmaW5lKCkgb3IgQ29iQ2hlY2soKQorKi8KKwkvLyBhcmVhIGZvciBPQkQgbW9kdWxlIDB4MDAzMCAtIDB4MDAzRgorCWtFcGxPYmRJbGxlZ2FsUGFydCA9IDB4MDAzMCwJLy8gdW5rbm93biBPRCBwYXJ0CisJa0VwbE9iZEluZGV4Tm90RXhpc3QgPSAweDAwMzEsCS8vIG9iamVjdCBpbmRleCBkb2VzIG5vdCBleGlzdCBpbiBPRAorCWtFcGxPYmRTdWJpbmRleE5vdEV4aXN0ID0gMHgwMDMyLAkvLyBzdWJpbmRleCBkb2VzIG5vdCBleGlzdCBpbiBvYmplY3QgaW5kZXgKKwlrRXBsT2JkUmVhZFZpb2xhdGlvbiA9IDB4MDAzMywJLy8gcmVhZCBhY2Nlc3MgdG8gYSB3cml0ZS1vbmx5IG9iamVjdAorCWtFcGxPYmRXcml0ZVZpb2xhdGlvbiA9IDB4MDAzNCwJLy8gd3JpdGUgYWNjZXNzIHRvIGEgcmVhZC1vbmx5IG9iamVjdAorCWtFcGxPYmRBY2Nlc3NWaW9sYXRpb24gPSAweDAwMzUsCS8vIGFjY2VzcyBub3QgYWxsb3dlZAorCWtFcGxPYmRVbmtub3duT2JqZWN0VHlwZSA9IDB4MDAzNiwJLy8gb2JqZWN0IHR5cGUgbm90IGRlZmluZWQva25vd24KKwlrRXBsT2JkVmFyRW50cnlOb3RFeGlzdCA9IDB4MDAzNywJLy8gb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gVmFyRW50cnkgc3RydWN0dXJlCisJa0VwbE9iZFZhbHVlVG9vTG93ID0gMHgwMDM4LAkvLyB2YWx1ZSB0byB3cml0ZSB0byBhbiBvYmplY3QgaXMgdG9vIGxvdworCWtFcGxPYmRWYWx1ZVRvb0hpZ2ggPSAweDAwMzksCS8vIHZhbHVlIHRvIHdyaXRlIHRvIGFuIG9iamVjdCBpcyB0b28gaGlnaAorCWtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yID0gMHgwMDNBLAkvLyB2YWx1ZSB0byB3cml0ZSBpcyB0byBsb25nIG9yIHRvIHNob3J0CisvLyAgICBrRXBsT2JkSWxsZWdhbEZsb2F0ICAgICAgICAgPSAweDAwM0IsICAgICAgIC8vIGlsbGVnYWwgZmxvYXQgdmFyaWFibGUKKy8vICAgIGtFcGxPYmRXcm9uZ09kQnVpbGRlcktleSAgICA9IDB4MDAzRiwgICAgICAgLy8gT0Qgd2FzIGdlbmVyYXRlZCB3aXRoIGRlbW8gdmVyc2lvbiBvZiB0b29sIE9EQnVpbGRlcgorCisJLy8gYXJlYSBmb3IgTk1UIG1vZHVsZSAweDAwNDAgLSAweDAwNEYKKwlrRXBsTm10VW5rbm93bkNvbW1hbmQgPSAweDAwNDAsCS8vIHVua25vd24gTk1UIGNvbW1hbmQKKwlrRXBsTm10SW52YWxpZEZyYW1lUG9pbnRlciA9IDB4MDA0MSwJLy8gcG9pbnRlciB0byB0aGUgZnJhbWUgaXMgbm90IHZhbGlkCisJa0VwbE5tdEludmFsaWRFdmVudCA9IDB4MDA0MiwJLy8gaW52YWxpZCBldmVudCBzZW5kIHRvIE5NVC1tb2R1bAorCWtFcGxObXRJbnZhbGlkU3RhdGUgPSAweDAwNDMsCS8vIHVua25vd24gc3RhdGUgaW4gTk1ULVN0YXRlLU1hc2NoaW5lCisJa0VwbE5tdEludmFsaWRQYXJhbSA9IDB4MDA0NCwJLy8gaW52YWxpZCBwYXJhbWV0ZXJzIHNwZWNpZmllZAorCisJLy8gYXJlYSBmb3IgU0RPL1VEUCBtb2R1bGUgMHgwMDUwIC0gMHgwMDVGCisJa0VwbFNkb1VkcE1pc3NDYiA9IDB4MDA1MCwJLy8gbWlzc2luZyBjYWxsYmFjay1mdW5jdGlvbiBwb2ludGVyIGR1cmluZyBpbnRpIG9mCisJLy8gbW9kdWxlCisJa0VwbFNkb1VkcE5vU29ja2V0ID0gMHgwMDUxLAkvLyBlcnJvciBkdXJpbmcgaW5pdCBvZiBzb2NrZXQKKwlrRXBsU2RvVWRwU29ja2V0RXJyb3IgPSAweDAwNTIsCS8vIGVycm9yIGR1cmluZyB1c2FnZSBvZiBzb2NrZXQKKwlrRXBsU2RvVWRwVGhyZWFkRXJyb3IgPSAweDAwNTMsCS8vIGVycm9yIGR1cmluZyBzdGFydCBvZiBsaXN0ZW4gdGhyZWFkCisJa0VwbFNkb1VkcE5vRnJlZUhhbmRsZSA9IDB4MDA1NCwJLy8gbm8gZnJlZSBjb25uZWN0aW9uIGhhbmRsZSBmb3IgVWRwCisJa0VwbFNkb1VkcFNlbmRFcnJvciA9IDB4MDA1NSwJLy8gRXJyb3IgZHVyaW5nIHNlbmQgb2YgZnJhbWUKKwlrRXBsU2RvVWRwSW52YWxpZEhkbCA9IDB4MDA1NiwJLy8gdGhlIGNvbm5lY3Rpb24gaGFuZGxlIGlzIGludmFsaWQKKworCS8vIGFyZWEgZm9yIFNETyBTZXF1ZW5jZSBsYXllciBtb2R1bGUgMHgwMDYwIC0gMHgwMDZGCisJa0VwbFNkb1NlcU1pc3NDYiA9IDB4MDA2MCwJLy8gbm8gY2FsbGJhY2stZnVuY3Rpb24gYXNzaWduCisJa0VwbFNkb1NlcU5vRnJlZUhhbmRsZSA9IDB4MDA2MSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvU2VxSW52YWxpZEhkbCA9IDB4MDA2MiwJLy8gaW52YWxpZCBoYW5kbGUgaW4gU0RPIHNlcXVlbmNlIGxheWVyCisJa0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdCA9IDB4MDA2MywJLy8gdW5zdXBwb3J0ZWQgUHJvdG9jb2wgc2VsZWN0ZWQKKwlrRXBsU2RvU2VxTm9GcmVlSGlzdG9yeSA9IDB4MDA2NCwJLy8gbm8gZnJlZSBlbnRyeSBpbiBoaXN0b3J5CisJa0VwbFNkb1NlcUZyYW1lU2l6ZUVycm9yID0gMHgwMDY1LAkvLyB0aGUgc2l6ZSBvZiB0aGUgZnJhbWVzIGlzIG5vdCBjb3JyZWN0CisJa0VwbFNkb1NlcVJlcXVlc3RBY2tOZWVkZWQgPSAweDAwNjYsCS8vIGluZGVpY2F0ZXMgdGhhdCB0aGUgaGlzdG9yeSBidWZmZXIgaXMgZnVsbAorCS8vIGFuZCBhIGFjayByZXF1ZXN0IGlzIG5lZWRlZAorCWtFcGxTZG9TZXFJbnZhbGlkRnJhbWUgPSAweDAwNjcsCS8vIGZyYW1lIG5vdCB2YWxpZAorCWtFcGxTZG9TZXFDb25uZWN0aW9uQnVzeSA9IDB4MDA2OCwJLy8gY29ubmVjdGlvbiBpcyBidXN5IC0+IHJldHJ5IGxhdGVyCisJa0VwbFNkb1NlcUludmFsaWRFdmVudCA9IDB4MDA2OSwJLy8gaW52YWxpZCBldmVudCByZWNlaXZlZAorCisJLy8gYXJlYSBmb3IgU0RPIENvbW1hbmQgTGF5ZXIgTW9kdWxlIDB4MDA3MCAtIDB4MDA3RgorCWtFcGxTZG9Db21VbnN1cHBvcnRlZFByb3QgPSAweDAwNzAsCS8vIHVuc3VwcG9ydGVkIFByb3RvY29sIHNlbGVjdGVkCisJa0VwbFNkb0NvbU5vRnJlZUhhbmRsZSA9IDB4MDA3MSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvQ29tSW52YWxpZFNlcnZpY2VUeXBlID0gMHgwMDcyLAkvLyBpbnZhbGlkIFNETyBzZXJ2aWNlIHR5cGUgc3BlY2lmaWVkCisJa0VwbFNkb0NvbUludmFsaWRIYW5kbGUgPSAweDAwNzMsCS8vIGhhbmRsZSBpbnZhbGlkCisJa0VwbFNkb0NvbUludmFsaWRTZW5kVHlwZSA9IDB4MDA3NCwJLy8gdGhlIHN0YXRlZCB0byBvZiBmcmFtZSB0byBzZW5kIGlzCisJLy8gbm90IHBvc3NpYmxlCisJa0VwbFNkb0NvbU5vdFJlc3BvbnNpYmxlID0gMHgwMDc1LAkvLyBpbnRlcm5hbCBlcnJvcjogY29tbWFuZCBsYXllciBoYW5kbGUgaXMKKwkvLyBub3QgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQgZnJvbSBzZXF1ZW5jZSBsYXllcgorCWtFcGxTZG9Db21IYW5kbGVFeGlzdHMgPSAweDAwNzYsCS8vIGhhbmRsZSB0byBzYW1lIG5vZGUgYWxyZWFkeSBleGlzdHMKKwlrRXBsU2RvQ29tSGFuZGxlQnVzeSA9IDB4MDA3NywJLy8gdHJhbnNmZXIgdmlhIHRoaXMgaGFuZGxlIGlzIGFscmVhZHkgcnVubmluZworCWtFcGxTZG9Db21JbnZhbGlkUGFyYW0gPSAweDAwNzgsCS8vIGludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQgdG8gZnVuY3Rpb24KKworCS8vIGFyZWEgZm9yIEVQTCBFdmVudC1Nb2R1bCAweDAwODAgLSAweDAwOEYKKwlrRXBsRXZlbnRVbmtub3duU2luayA9IDB4MDA4MCwJLy8gdW5rbm93biBzaW5rIGZvciBldmVudAorCWtFcGxFdmVudFBvc3RFcnJvciA9IDB4MDA4MSwJLy8gZXJyb3IgZHVyaW5nIHBvc3Qgb2YgZXZlbnQKKworCS8vIGFyZWEgZm9yIEVQTCBUaW1lciBNb2R1bCAweDAwOTAgLSAweDAwOUYKKwlrRXBsVGltZXJJbnZhbGlkSGFuZGxlID0gMHgwMDkwLAkvLyBpbnZhbGlkIGhhbmRsZSBmb3IgdGltZXIKKwlrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZCA9IDB4MDA5MSwJLy8gbm8gdGltZXIgd2FzIGNyZWF0ZWQgY2F1c2VkIGJ5CisJLy8gYW4gZXJyb3IKKworCS8vIGFyZWEgZm9yIEVQTCBTRE8vQXNuZCBNb2R1bGUgMHgwMEEwIC0gMHgwQUYKKwlrRXBsU2RvQXNuZEludmFsaWROb2RlSWQgPSAweDAwQTAsCS8vMCBub2RlIGlkIGlzIGludmFsaWQKKwlrRXBsU2RvQXNuZE5vRnJlZUhhbmRsZSA9IDB4MDBBMSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvQXNuZEludmFsaWRIYW5kbGUgPSAweDAwQTIsCS8vIGhhbmRsZSBmb3IgY29ubmVjdGlvbiBpcyBpbnZhbGlkCisKKwkvLyBhcmVhIGZvciBQRE8gbW9kdWxlIDB4MDBCMCAtIDB4MDBCRgorCWtFcGxQZG9Ob3RFeGlzdCA9IDB4MDBCMCwJLy8gc2VsZWN0ZWQgUERPIGRvZXMgbm90IGV4aXN0CisJa0VwbFBkb0xlbmd0aEV4Y2VlZGVkID0gMHgwMEIxLAkvLyBsZW5ndGggb2YgUERPIG1hcHBpbmcgZXhjZWVkZXMgNjQgYmlzCisJa0VwbFBkb0dyYW51bGFyaXR5TWlzbWF0Y2ggPSAweDAwQjIsCS8vIGNvbmZpZ3VyZWQgUERPIGdyYW51bGFyaXR5IGlzIG5vdCBlcXVhbCB0byBzdXBwb3J0ZWQgZ3JhbnVsYXJpdHkKKwlrRXBsUGRvSW5pdEVycm9yID0gMHgwMEIzLAkvLyBlcnJvciBkdXJpbmcgaW5pdGlhbGlzYXRpb24gb2YgUERPIG1vZHVsZQorCWtFcGxQZG9FcnJvclBkb0VuY29kZSA9IDB4MDBCNCwJLy8gZXJyb3IgZHVyaW5nIGVuY29kaW5nIGEgUERPCisJa0VwbFBkb0Vycm9yUGRvRGVjb2RlID0gMHgwMEI1LAkvLyBlcnJvciBkdXJpbmcgZGVjb2RpbmcgYSBQRE8KKwlrRXBsUGRvRXJyb3JTZW5kID0gMHgwMEI2LAkvLyBlcnJvciBkdXJpbmcgc2VuZGluZyBhIFBETworCWtFcGxQZG9FcnJvclN5bmNXaW4gPSAweDAwQjcsCS8vIHRoZSBTWU5DIHdpbmRvdyBydW5zIG91dCBkdXJpbmcgc2VuZGluZyBTWU5DLVBET3MKKwlrRXBsUGRvRXJyb3JNYXBwID0gMHgwMEI4LAkvLyBpbnZhbGlkIFBETyBtYXBwaW5nCisJa0VwbFBkb1Zhck5vdEZvdW5kID0gMHgwMEI5LAkvLyB2YXJpYWJsZSB3YXMgbm90IGZvdW5kIGluIGZ1bmN0aW9uIFBkb1NpZ25hbFZhcigpCisJa0VwbFBkb0Vycm9yRW1jeVBkb0xlbiA9IDB4MDBCQSwJLy8gdGhlIGxlbmd0aCBvZiBhIHJlY2VpdmVkIFBETyBpcyB1bmVxdWFsIHRvIHRoZSBleHBlY3RlZCB2YWx1ZQorCWtFcGxQZG9Xcml0ZUNvbnN0T2JqZWN0ID0gMHgwMEJCLAkvLyBjb25zdGFudCBvYmplY3QgY2FuIG5vdCBiZSB3cml0dGVuCisJLy8gKG9ubHkgVHhUeXBlLCBJbmhpYml0LSwgRXZlbnQgVGltZSBmb3IgQ0FOb3BlbiBLaXQpCisKKwkvLyBhcmVhIGZvciBMU1Mgc2xhdmUgbW9kdWxlCisvKiAgICBrRXBsTHNzc1Jlc2V0Tm9kZSAgICAgICAgICAgPSAweDAwODAsICAgICAgIC8vIE5NVCBjb21tYW5kICJyZXNldCBub2RlIiBoYXMgdG8gYmUgcHJvY2Vzc2VkIGFmdGVyIExTUyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgb2YgTm9kZUlkCisgICAga0VwbExzc3NJbnZhbGlkTm9kZUlkICAgICAgID0gMHgwMDgxLCAgICAgICAvLyBubyB2YWxpZCBOb2RlSWQgaXMgY29uZmlndXJlZCAtPiB3YWl0IHVudGlsIGl0IGlzIGNvbmZpZ3VyZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTFNTIHNlcnZpY2UgYmVmb3JlIGNhbGxpbmcgQ2NtQ29ubmVjdFRvTmV0KCkKKyovCisJLy8gYXJlYSBmb3IgZW1lcmdlbmN5IGNvbnN1bWVyIG1vZHVsZSAweDAwOTAgLSAweDAwOUYKKy8qICAgIGtFcGxFbWNjTm9GcmVlUHJvZHVjZXJFbnRyeSA9IDB4MDA5MCwgICAgICAgLy8gbm8gZnJlZSBlbnRyeSB0byBhZGQgYSBFbWVyZ2VuY3kgUHJvZHVjZXIKKyAgICBrRXBsRW1jY05vZGVJZE5vdEV4aXN0ICAgICAgPSAweDAwOTEsICAgICAgIC8vIHNlbGVjdGVkIE5vZGVJZCB3YXMgbmV2ZXIgYWRkZWQKKyAgICBrRXBsRW1jY05vZGVJZEludmFsaWQgICAgICAgPSAweDAwOTIsICAgICAgIC8vIHNlbGVjdGVkIE5vZGVJZCBpcyBvdXRzaWRlIG9mIHJhbmdlICgweDAxIHVudGlsIDB4N0YpCisgICAga0VwbEVtY2NOb2RlSWRFeGlzdCAgICAgICAgID0gMHgwMDkzLCAgICAgICAvLyBzZWxlY3RlZCBOb2RlSWQgYWxyZWFkeSBleGlzdAorKi8KKwkvLyBhcmVhIGZvciBkeW5hbWljIE9EIDB4MDBBMCAtIDB4MDBBRgorLyogICAga0VwbER5bk5vTWVtb3J5ICAgICAgICAgICAgID0gMHgwMEEwLCAgICAgICAvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisgICAga0VwbER5bkludmFsaWRDb25maWcgICAgICAgID0gMHgwMEExLCAgICAgICAvLyBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gc2VnbWVudCBjb250YWluZXIKKyovCisJLy8gYXJlYSBmb3IgaGVydGJlYXQgY29uc3VtZXIgbW9kdWxlIDB4MDBCMCAtIDB4MDBCRgorLyogICAga0VwbEhiY0VudHJ5Tm90RXhpc3QgICAgICAgID0gMHgwMEIwLCAgICAgICAvLyBIZWFydGJlYXQgUHJvZHVjZXIgbm9kZSBub3QgY29uZmlndXJlZAorICAgIGtFcGxIYmNFbnRyeUFscmVhZHlFeGlzdCAgICA9IDB4MDBCMSwgICAgICAgLy8gTm9kZUlkIHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gaGVhcnRiZWF0IGNvbnN1bWVyIHRhYmxlIChvYmplY3QgMHgxMDE2KQorKi8KKwkvLyBDb25maWd1cmF0aW9uIG1hbmFnZXIgbW9kdWxlIDB4MDBDMCAtIDB4MDBDRgorCWtFcGxDZmdNYUNvbmZpZ0Vycm9yID0gMHgwMEMwLAkvLyBlcnJvciBpbiBjb25maWd1cmF0aW9uIG1hbmFnZXIKKwlrRXBsQ2ZnTWFTZG9jVGltZU91dEVycm9yID0gMHgwMEMxLAkvLyBlcnJvciBpbiBjb25maWd1cmF0aW9uIG1hbmFnZXIsIFNkbyB0aW1lb3V0CisJa0VwbENmZ01hSW52YWxpZERjZiA9IDB4MDBDMiwJLy8gY29uZmlncmF0aW9uIGZpbGUgbm90IHZhbGlkCisJa0VwbENmZ01hVW5zdXBwb3J0ZWREY2YgPSAweDAwQzMsCS8vIHVuc3VwcG9ydGVkIERjZiBmb3JtYXQKKwlrRXBsQ2ZnTWFDb25maWdXaXRoRXJyb3JzID0gMHgwMEM0LAkvLyBjb25maWd1cmF0aW9uIGZpbmlzaGVkIHdpdGggZXJyb3JzCisJa0VwbENmZ01hTm9GcmVlQ29uZmlnID0gMHgwMEM1LAkvLyBubyBmcmVlIGNvbmZpZ3VyYXRpb24gZW50cnkKKwlrRXBsQ2ZnTWFOb0NvbmZpZ0RhdGEgPSAweDAwQzYsCS8vIG5vIGNvbmZpZ3VyYXRpb24gZGF0YSBwcmVzZW50CisJa0VwbENmZ01hVW5zdXBwRGF0YXR5cGVEY2YgPSAweDAwQzcsCS8vIHVuc3VwcG9ydGVkIGRhdGF0eXBlIGZvdW5kIGluIGRjZgorCS8vIC0+IHRoaXMgZW50cnkgd2FzIG5vdCBjb25maWd1cmVkCisKKwkvLyBhcmVhIGZvciBMU1MgbWFzdGVyIG1vZHVsZSAweDAwRDAgLSAweDAwREYKKy8qICAgIGtFcGxMc3NtSWxsZWdhbE1vZGUgICAgICAgICA9IDB4MDBEMCwgICAgICAgLy8gaWxsZWdhbCBMU1MgbW9kZSAob3BlcmF0aW9uIC8gY29uZmlndXJhdGlvbikKKyAgICBrRXBsTHNzbUlsbGVnYWxTdGF0ZSAgICAgICAgPSAweDAwRDEsICAgICAgIC8vIGZ1bmN0aW9uIHdhcyBjYWxsZWQgaW4gaWxsZWdhbCBzdGF0ZSBvZiBMU1MgbWFzdGVyCisgICAga0VwbExzc21CdXN5ICAgICAgICAgICAgICAgID0gMHgwMEQyLCAgICAgICAvLyBMU1MgcHJvY2VzcyBpcyBidXN5IHdpdGggYW4gcHJldmlvdXMgc2VydmljZQorICAgIGtFcGxMc3NtSWxsZWdhbENtZCAgICAgICAgICA9IDB4MDBEMywgICAgICAgLy8gaWxsZWdhbCBjb21tYW5kIGNvZGUgd2FzIHNldCBmb3IgZnVuY3Rpb24gTHNzbUlucXVpcmVJZGVudGl0eSgpCisgICAga0VwbExzc21UaW1lb3V0ICAgICAgICAgICAgID0gMHgwMEQ0LCAgICAgICAvLyBMU1Mgc2xhdmUgZGlkIG5vdCBhbnN3ZXIgYSBMU1Mgc2VydmljZQorICAgIGtFcGxMc3NtRXJyb3JJbkNvbmZpcm0gICAgICA9IDB4MDBENSwgICAgICAgLy8gTFNTIHNsYXZlIHJlcGxpZWQgYW4gZXJyb3IgY29kZSBmb3IgYSBMU1Mgc2VydmljZQorKi8KKwkvLyBhcmVhIGZvciBDQ00gbW9kdWxlcyAweDAwRTAgLSAweEVGCisvKiAgICBrRXBsQ2NtU3RvcmVVbnZhbGlkU3RhdGUgICAgPSAweDAwRTAsICAgICAgIC8vIG1lbW9yeSBkZXZpY2Ugbm90IGF2YWlsYWJsZSBkdWUgZGV2aWNlIHN0YXRlCisgICAga0VwbENjbVN0b3JlSHdFcnJvciAgICAgICAgID0gMHgwMEUxLCAgICAgICAvLyBodyBlcnJvciBkdWUgZGV2aWNlIGFjY2VzcworKi8KKwkvLyBhcmVhIGZvciBTUkRPIG1vZHVsZSAweDAxMDAgLSAweDAxMUYKKy8qICAgIGtFcGxTcmRvTm90RXhpc3QgICAgICAgICAgICA9IDB4MDEwMCwgICAgICAgLy8gc2VsZWN0ZWQgU1JETyBkb2VzIG5vdCBleGlzdAorICAgIGtFcGxTcmRvR3JhbnVsYXJpdHlNaXNtYXRjaCA9IDB4MDEwMSwgICAgICAgLy8gY29uZmlndXJlZCBTUkRPIGdyYW51bGFyaXR5IGlzIG5vdCBlcXVhbCB0byBzdXBwb3J0ZWQgZ3JhbnVsYXJpdHkKKyAgICBrRXBsU3Jkb0NmZ1RpbWluZ0Vycm9yICAgICAgPSAweDAxMDIsICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gaXMgbm90IG9rIChUaW1pbmcpCisgICAga0VwbFNyZG9DZmdJZEVycm9yICAgICAgICAgID0gMHgwMTAzLCAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIG5vdCBvayAoQ29iSWRzKQorICAgIGtFcGxTcmRvQ2ZnQ3JjRXJyb3IgICAgICAgICA9IDB4MDEwNCwgICAgICAgLy8gY29uZmlndXJhdGlvbiBpcyBub3Qgb2sgKENSQykKKyAgICBrRXBsU3Jkb05tdEVycm9yICAgICAgICAgICAgPSAweDAxMDUsICAgICAgIC8vIGFuIGFjdGlvbiB3YXMgdHJpZWQgaW4gYSB3cm9uZyBOTVQgc3RhdGUKKyAgICBrRXBsU3Jkb0ludmFsaWRDZmcgICAgICAgICAgPSAweDAxMDYsICAgICAgIC8vIGFuIGFjdGlvbiB3YXMgdHJpZWQgd2l0aCBhbiBpbnZhbGQgU1JETyBjb25maWd1cmF0aW9uCisgICAga0VwbFNyZG9JbnZhbGlkICAgICAgICAgICAgID0gMHgwMTA3LCAgICAgICAvLyBhbiBhY3Rpb24gd2FzIHRyaWVkIHdpdGggYW4gaW52YWxkIFNSRE8KKyAgICBrRXBsU3Jkb1J4VHhDb25mbGljdCAgICAgICAgPSAweDAxMDgsICAgICAgIC8vIGFuIHRyYW5zbWlzc2lvbiB3YXMgdHJpZWQgd2l0aCBhbiByZWNlaXZlIFNSRE8gKG9yIHRoZSBvdGhlciB3YXkpCisgICAga0VwbFNyZG9JbGxlZ2FsQ2FuSWQgICAgICAgID0gMHgwMTA5LCAgICAgICAvLyB0aGUgQ2FuSWQgaXMgaW52YWxpZAorICAgIGtFcGxTcmRvQ2FuSWRBbHJlYWR5SW5Vc2UgICA9IDB4MDEwQSwgICAgICAgLy8gdGhlIENhbklkIGlzIGFscmVhZHkgaW4gdXNlCisgICAga0VwbFNyZG9Ob3RJbk9yZGVyICAgICAgICAgID0gMHgwMTBCLCAgICAgICAvLyB0aGUgdHdvIG1lc3NhZ2VzIG9mIGEgU1JETyBhcmUgbm90IGluIG9yZGVyCisgICAga0VwbFNyZG9TY3RUaW1lb3V0ICAgICAgICAgID0gMHgwMTBDLCAgICAgICAvLyB0aW1lb3V0IG9mIFNDVAorICAgIGtFcGxTcmRvU3J2dFRpbWVvdXQgICAgICAgICA9IDB4MDEwRCwgICAgICAgLy8gdGltZW91dCBvZiBTUlZUCisgICAga0VwbFNyZG9DYW5JZE5vdFZhbGlkICAgICAgID0gMHgwMTBFLCAgICAgICAvLyBvbmUgb2YgcmVjZWl2ZWQgQ0FOLUlEcyBhcmUgbm90IGVxdWFsIHRvIGNvbmZpZ3VyZWQgb25lCisgICAga0VwbFNyZG9EbGNOb3RWYWxpZCAgICAgICAgID0gMHgwMTBGLCAgICAgICAvLyBvbmUgb2YgcmVjZWl2ZWQgQ0FOLURMQyBhcmUgbm90IGVxdWFsIHRvIGNvbmZpZ3VyZWQgb25lCisgICAga0VwbFNyZG9FcnJvck1hcHAgICAgICAgICAgID0gMHgwMTEwLCAgICAgICAvLyB3cm9uZyB2YWx1ZXMgaW4gbWFwcGluZyBmb3VuZAorICAgIGtFcGxTcmRvRGF0YUVycm9yICAgICAgICAgICA9IDB4MDExMSwgICAgICAgLy8gZGF0YSBvZiBDQU4gbWVzc2FnZXMgYXJlIG5vdCBpbnZlcnMKKyAgICBrRXBsU3Jkb0xlbmd0aEV4Y2VlZGVkICAgICAgPSAweDAxMTIsICAgICAgIC8vIGxlbmd0aCBvZiBTUkRPIG1hcHBpbmcgZXhjZWVkZXMgNjQgYml0IHBlciBDQU4tbWVzc2FnZQorICAgIGtFcGxTcmRvTm90SGFuZGxlZEluQXBwICAgICA9IDB4MDExMywgICAgICAgLy8gdGhlIFNSRE8gZXJyb3Igd2FzIG5vdCBoYW5kbGVkIGluIEFwcFNyZG9FcnJvcigpCisgICAga0VwbFNyZG9PdmVycnVuICAgICAgICAgICAgID0gMHgwMTE0ICAgICAgICAvLyBhIFJ4U1JETyB3YXMgcmVjZWl2ZWQgYnV0IHRoZSBwZXZpb3VzIG9uZSB3YXMgbm90IGVsc2UgcHJvY2Vzc2VkCisqLworCisJa0VwbEFwaVRhc2tEZWZlcnJlZCA9IDB4MDE0MCwJLy8gRVBMIHBlcmZvcm1zIHRhc2sgaW4gYmFja2dyb3VuZCBhbmQgaW5mb3JtcyB0aGUgYXBwbGljYXRpb24gKG9yIHZpY2UtdmVyc2EpLCB3aGVuIGl0IGlzIGZpbmlzaGVkCisJa0VwbEFwaUludmFsaWRQYXJhbSA9IDB4MDE0MiwJLy8gcGFzc2VkIGludmFsaWQgcGFyYW1ldGVycyB0byBhIGZ1bmN0aW9uIChlLmcuIGludmFsaWQgbm9kZSBpZCkKKworCS8vIGFyZWEgdW50aWxsIDB4MDdGRiBpcyByZXNlcnZlZAorCS8vIGFyZWEgZm9yIHVzZXIgYXBwbGljYXRpb24gZnJvbSAweDA4MDAgdG8gMHg3RkZGCisKK30gdEVwbEtlcm5lbDsKKworI2VuZGlmCisvL0VPRgorCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyb3JIYW5kbGVyay5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFcnJvckhhbmRsZXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyb3JIYW5kbGVyay5jCkBAIC0wLDAgKzEsODEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGVycm9yIGhhbmRsZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXJyb3JIYW5kbGVyay5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMDIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCisjaW5jbHVkZSAiRXBsTm10LmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCS8vIGZ1bmN0aW9uIHByb3RvdHlwcyBvZiB0aGUgRXBsT0JELU1vZHVsCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGsuaCIKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgPT0gMCkKKyNlcnJvciAiRVBMIEVycm9ySGFuZGxlciBtb2R1bGUgbmVlZHMgRVBMIG1vZHVsZSBPQkRLISIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQgbV9kd0N1bXVsYXRpdmVDbnQ7CS8vIHN1YmluZGV4IDEKKwlEV09SRCBtX2R3VGhyZXNob2xkQ250OwkvLyBzdWJpbmRleCAyCisJRFdPUkQgbV9kd1RocmVzaG9sZDsJLy8gc3ViaW5kZXggMworCit9IHRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIgbV9Dbkxvc3NTb2M7CS8vIG9iamVjdCAweDFDMEIKKwl0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlciBtX0NuTG9zc1ByZXE7CS8vIG9iamVjdCAweDFDMEQKKwl0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlciBtX0NuQ3JjRXJyOwkvLyBvYmplY3QgMHgxQzBGCisJdW5zaWduZWQgbG9uZyBtX3VsRGxsRXJyb3JFdmVudHM7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJdEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIgbV9NbkNyY0VycjsJLy8gb2JqZWN0IDB4MUMwMAorCXRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyIG1fTW5DeWNUaW1lRXhjZWVkOwkvLyBvYmplY3QgMHgxQzAyCisJRFdPUkQgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnRbMjU0XTsJLy8gb2JqZWN0IDB4MUMwNworCURXT1JEIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250WzI1NF07CS8vIG9iamVjdCAweDFDMDgKKwlEV09SRCBtX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZFsyNTRdOwkvLyBvYmplY3QgMHgxQzA5CisJQk9PTCBtX2FmTW5Dbkxvc3NQcmVzRXZlbnRbMjU0XTsKKyNlbmRpZgorCit9IHRFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsRXJyb3JIYW5kbGVya0luc3RhbmNlIEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIodEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIKKwkJCQkJCSAgICogcEVycm9yQ291bnRlcl9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KERXT1JEICogcGR3VmFsdWVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aVZhbHVlQ291bnRfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1LZXJuZWxzcGFjZS1FcnJvci1IYW5kbGVyPiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcnJvckhhbmRsZXJrSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsRXJyb3JIYW5kbGVya0FkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGQgb25lIG1vcmUgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya0FkZEluc3RhbmNlKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IG9ubHkgZXZlbnQgdmFyaWFibGUsCisJLy8gYWxsIG90aGVyIGluc3RhbmNlIG1lbWJlcnMgYXJlIHJlc2V0IGJ5IE9EIG9yIG1heSBrZWVwIHRoZWlyIGN1cnJlbnQgdmFsdWUKKwkvLyBkLmsuOiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGN1bXVsYXRpdmUgY291bnRlcnMsIHdoaWNoIHNoYWxsIG5vdCBiZSByZXNldAorCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyA9IDA7CisKKwkvLyBsaW5rIGNvdW50ZXJzIHRvIE9ECisJLy8gJCQkIGQuay4gaWYgT0QgcmVzaWRlcyBpbiB1c2Vyc3BhY2UsIGZldGNoIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwKKwkvLyAgICAgICAgICB3aGljaCBzaGFsbCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyB0aGUgaW5zdGFuY2UgKG5lZWRzIHRvIGJlIGRlY2xhcmVkIGdsb2JhbGx5KS4KKwkvLyAgICAgICAgICBPdGhlciBpZGVhOiBlcnJvciBjb3VudGVyIHNoYWxsIGJlbG9uZyB0byB0aGUgcHJvY2VzcyBpbWFnZQorCS8vICAgICAgICAgIChyZXNldCBvZiBjb3VudGVycyBieSBTRE8gd3JpdGUgYXJlIGEgbGl0dGxlIGJpdCB0cmlja3kpLgorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fQ25Mb3NzU29jLCAweDFDMEIpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKCZFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX0NuTG9zc1ByZXEsIDB4MUMwRCk7CisJLy8gaWdub3JlIHJldHVybiBjb2RlLCBiZWNhdXNlIG9iamVjdCAweDFDMEQgaXMgY29uZGl0aW9uYWwKKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKCZFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX0NuQ3JjRXJyLCAweDFDMEYpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fTW5DcmNFcnIsIDB4MUMwMCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fTW5DeWNUaW1lRXhjZWVkLCAweDFDMDIpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rQXJyYXkoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJICAgICAgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnQsCisJCQkJICAgICAgdGFiZW50cmllcyhFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudCksCisJCQkJICAgICAgMHgxQzA3KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPQorCSAgICBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCSAgICAgIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250LAorCQkJCSAgICAgIHRhYmVudHJpZXMoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnQpLAorCQkJCSAgICAgIDB4MUMwOCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtBcnJheShFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkgICAgICBtX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZCwKKwkJCQkgICAgICB0YWJlbnRyaWVzKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJIG1fYWR3TW5Dbkxvc3NQcmVzVGhyZXNob2xkKSwKKwkJCQkgICAgICAweDFDMDkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXJyb3JIYW5kbGVya0RlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZSBpbnN0YW5jZSBhbiBmcmVlIHRoZSBidWZmZXJzdHJ1Y3R1cmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya0RlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcnJvckhhbmRsZXJrUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzZXMgZXJyb3IgZXZlbnRzIGZyb20gRExMCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyIGZyb20gYnVmZmVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgbG9uZyB1bERsbEVycm9yRXZlbnRzOworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIG1fRXZlbnRUeXBlCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxFcnJvcjoKKwkJeworCQkJdEVwbEVycm9ySGFuZGxlcmtFdmVudCAqcEVyckhhbmRsZXJFdmVudCA9CisJCQkgICAgKHRFcGxFcnJvckhhbmRsZXJrRXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZzsKKworCQkJdWxEbGxFcnJvckV2ZW50cyA9IHBFcnJIYW5kbGVyRXZlbnQtPm1fdWxEbGxFcnJvckV2ZW50czsKKworCQkJLy8gY2hlY2sgdGhlIHNldmVyYWwgZXJyb3IgZXZlbnRzCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzU29jLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9DTl9MT1NTX1NPQykgIT0gMCkpIHsJLy8gbG9zcyBvZiBTb0MgZXZlbnQgb2NjdXJlZAorCQkJCS8vIGluY3JlbWVudCBjdW11bGF0aXZlIGNvdW50ZXIgYnkgMQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzU29jLgorCQkJCSAgICBtX2R3Q3VtdWxhdGl2ZUNudCsrOworCQkJCS8vIGluY3JlbWVudCB0aHJlc2hvbGQgY291bnRlciBieSA4CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NTb2MuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NTb2MubV9kd1RocmVzaG9sZENudCA+PSBFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1NvYy5tX2R3VGhyZXNob2xkKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0xPU1NfU09DX1RICisKKwkJCQkJLy8gcG9zdCBldmVudCB0byBOTVQgc3RhdGUgbWFjaGluZQorCQkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCQkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQkJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQl9CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCQkJfQorCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCSAgICAgbV9kd1RocmVzaG9sZCA+IDApCisJCQkgICAgJiYgKCh1bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfQ05fTE9TU19QUkVRKSAhPSAwKSkgewkvLyBsb3NzIG9mIFBSZXEgZXZlbnQgb2NjdXJlZAorCQkJCS8vIGluY3JlbWVudCBjdW11bGF0aXZlIGNvdW50ZXIgYnkgMQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCQkgICAgbV9kd1RocmVzaG9sZENudCArPSA4OworCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEubV9kd1RocmVzaG9sZENudCA+PSBFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9MT1NTX1BSRVFfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEuCisJCQkgICAgIG1fZHdUaHJlc2hvbGRDbnQgPiAwKQorCQkJICAgICYmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0NOX1JFQ1ZEX1BSRVEpICE9IDApKSB7CS8vIFBSZXEgY29ycmVjdGx5IHJlY2VpdmVkCisJCQkJLy8gZGVjcmVtZW50IHRocmVzaG9sZCBjb3VudGVyIGJ5IDEKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQtLTsKKwkJCX0KKworCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuQ3JjRXJyLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9DTl9DUkMpICE9IDApKSB7CS8vIENSQyBlcnJvciBldmVudCBvY2N1cmVkCisJCQkJLy8gaW5jcmVtZW50IGN1bXVsYXRpdmUgY291bnRlciBieSAxCisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9DbkNyY0Vyci4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25DcmNFcnIuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9DbkNyY0Vyci5tX2R3VGhyZXNob2xkQ250ID49IEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25DcmNFcnIubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DUkNfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fQ1JDOworCQkJfQorCisJCQlpZiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9JTlZBTElEX0ZPUk1BVCkgIT0gMCkgewkvLyBpbnZhbGlkIGZvcm1hdCBlcnJvciBvY2N1cmVkIChvbmx5IGRpcmVjdCByZWFjdGlvbikKKwkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9JTlZBTElEX0ZPUk1BVAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQlpZiAocEVyckhhbmRsZXJFdmVudC0+bV9ObXRTdGF0ZSA+PSBrRXBsTm10TXNOb3RBY3RpdmUpIHsJLy8gTU4gaXMgYWN0aXZlCisJCQkJCWlmIChwRXJySGFuZGxlckV2ZW50LT5tX3VpTm9kZUlkICE9IDApIHsKKwkJCQkJCXRFcGxIZWFydGJlYXRFdmVudAorCQkJCQkJICAgIEhlYXJ0YmVhdEV2ZW50OworCisJCQkJCQkvLyByZW1vdmUgbm9kZSBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbERsbGtEZWxldGVOb2RlCisJCQkJCQkgICAgKHBFcnJIYW5kbGVyRXZlbnQtPgorCQkJCQkJICAgICBtX3VpTm9kZUlkKTsKKworCQkJCQkJLy8gaW5mb3JtIE5tdE1udSBtb2R1bGUgYWJvdXQgc3RhdGUgY2hhbmdlLCB3aGljaCBzaGFsbCBzZW5kIE5NVCBjb21tYW5kIFJlc2V0Tm9kZSB0byB0aGlzIENOCisJCQkJCQlIZWFydGJlYXRFdmVudC5tX3VpTm9kZUlkID0KKwkJCQkJCSAgICBwRXJySGFuZGxlckV2ZW50LT4KKwkJCQkJCSAgICBtX3VpTm9kZUlkOworCQkJCQkJSGVhcnRiZWF0RXZlbnQubV9ObXRTdGF0ZSA9CisJCQkJCQkgICAga0VwbE5tdENzTm90QWN0aXZlOworCQkJCQkJSGVhcnRiZWF0RXZlbnQubV93RXJyb3JDb2RlID0KKwkJCQkJCSAgICBFUExfRV9ETExfSU5WQUxJRF9GT1JNQVQ7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCSAgICBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihIZWFydGJlYXRFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmSGVhcnRiZWF0RXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCX0KKwkJCQkJLy8gJCQkIGFuZCBlbHNlIHNob3VsZCBsZWFkIHRvIEludGVybkNvbUVycm9yCisJCQkJfSBlbHNlCisjZW5kaWYKKwkJCQl7CS8vIENOIGlzIGFjdGl2ZQorCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCQkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQkJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQl9CisJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3JjRXJyLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DUkMpICE9IDApKSB7CS8vIENSQyBlcnJvciBldmVudCBvY2N1cmVkCisJCQkJLy8gaW5jcmVtZW50IGN1bXVsYXRpdmUgY291bnRlciBieSAxCisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkNyY0Vyci4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DcmNFcnIuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkNyY0Vyci5tX2R3VGhyZXNob2xkQ250ID49IEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DcmNFcnIubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DUkNfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfTU5fQ1JDOworCQkJfQorCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEKSAhPSAwKSkgewkvLyBjeWNsZSB0aW1lIGV4Y2VlZGVkIGV2ZW50IG9jY3VyZWQKKwkJCQkvLyBpbmNyZW1lbnQgY3VtdWxhdGl2ZSBjb3VudGVyIGJ5IDEKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3ljVGltZUV4Y2VlZC4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLgorCQkJCSAgICBtX2R3VGhyZXNob2xkQ250ICs9IDg7CisJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLm1fZHdUaHJlc2hvbGRDbnQgPj0gRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkN5Y1RpbWVFeGNlZWQubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DWUNMRV9FWENFRURfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQkvLyAkJCQgZC5rLjogZWxzZSBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0NZQ0xFX0VYQ0VFRAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEOworCQkJfQorCisJCQlpZiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DTl9MT1NTX1BSRVMpICE9IDApIHsJLy8gQ04gbG9zcyBQUmVzIGV2ZW50IG9jY3VyZWQKKwkJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKwkJCQl1aU5vZGVJZCA9IHBFcnJIYW5kbGVyRXZlbnQtPm1fdWlOb2RlSWQgLSAxOworCQkJCWlmICgodWlOb2RlSWQgPAorCQkJCSAgICAgdGFiZW50cmllcyhFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCW1fYWR3TW5Dbkxvc3NQcmVzQ3VtQ250KSkKKwkJCQkgICAgJiYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQltX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZFt1aU5vZGVJZF0gPgorCQkJCQkwKSkgeworCQkJCQkvLyBpbmNyZW1lbnQgY3VtdWxhdGl2ZSBjb3VudGVyIGJ5IDEKKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudFt1aU5vZGVJZF0rKzsKKwkJCQkJLy8gaW5jcmVtZW50IHRocmVzaG9sZCBjb3VudGVyIGJ5IDgKKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2Fkd01uQ25Mb3NzUHJlc1RockNudFt1aU5vZGVJZF0gKz0KKwkJCQkJICAgIDg7CisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250W3VpTm9kZUlkXQorCQkJCQkgICAgPj0gRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9hZHdNbkNuTG9zc1ByZXNUaHJlc2hvbGRbdWlOb2RlSWRdKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCQl0RXBsSGVhcnRiZWF0RXZlbnQKKwkJCQkJCSAgICBIZWFydGJlYXRFdmVudDsKKworCQkJCQkJLy8gJCQkIGQuay46IGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkgRV9ETExfTE9TU19QUkVTX1RICisKKwkJCQkJCS8vIHJlbW92ZSBub2RlIGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0RlbGV0ZU5vZGUKKwkJCQkJCSAgICAocEVyckhhbmRsZXJFdmVudC0+CisJCQkJCQkgICAgIG1fdWlOb2RlSWQpOworCisJCQkJCQkvLyBpbmZvcm0gTm10TW51IG1vZHVsZSBhYm91dCBzdGF0ZSBjaGFuZ2UsIHdoaWNoIHNoYWxsIHNlbmQgTk1UIGNvbW1hbmQgUmVzZXROb2RlIHRvIHRoaXMgQ04KKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJICAgIHBFcnJIYW5kbGVyRXZlbnQtPgorCQkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCQlIZWFydGJlYXRFdmVudC5tX05tdFN0YXRlID0KKwkJCQkJCSAgICBrRXBsTm10Q3NOb3RBY3RpdmU7CisJCQkJCQlIZWFydGJlYXRFdmVudC5tX3dFcnJvckNvZGUgPQorCQkJCQkJICAgIEVQTF9FX0RMTF9MT1NTX1BSRVNfVEg7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCSAgICBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihIZWFydGJlYXRFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmSGVhcnRiZWF0RXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCX0KKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2FmTW5Dbkxvc3NQcmVzRXZlbnRbdWlOb2RlSWRdID0KKwkJCQkJICAgIFRSVUU7CisJCQkJfQorCQkJfQorI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTk1UIGV2ZW50CisJY2FzZSBrRXBsRXZlbnRUeXBlTm10RXZlbnQ6CisJCXsKKwkJCWlmICgoKih0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZykgPT0ga0VwbE5tdEV2ZW50RGxsQ2VTb2EpIHsJLy8gU29BIGV2ZW50IG9mIENOIC0+IGRlY3JlbWVudCB0aHJlc2hvbGQgY291bnRlcnMKKworCQkJCWlmICgoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0MpID09IDApIHsJLy8gZGVjcmVtZW50IGxvc3Mgb2YgU29DIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fQ25Mb3NzU29jLm1fZHdUaHJlc2hvbGRDbnQgPiAwKSB7CisJCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX0NuTG9zc1NvYy4KKwkJCQkJCSAgICBtX2R3VGhyZXNob2xkQ250LS07CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0NOX0NSQykgPT0gMCkgewkvLyBkZWNyZW1lbnQgQ1JDIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fQ25DcmNFcnIubV9kd1RocmVzaG9sZENudCA+IDApIHsKKwkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fQ25DcmNFcnIuCisJCQkJCQkgICAgbV9kd1RocmVzaG9sZENudC0tOworCQkJCQl9CisJCQkJfQorCQkJfQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCWVsc2UgaWYgKCgqKHRFcGxObXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnKSA9PSBrRXBsTm10RXZlbnREbGxNZVNvYVNlbnQpIHsJLy8gU29BIGV2ZW50IG9mIE1OIC0+IGRlY3JlbWVudCB0aHJlc2hvbGQgY291bnRlcnMKKwkJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisJCQkJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCisJCQkJUmV0ID0gRXBsRGxsa0dldEZpcnN0Tm9kZUluZm8oJnBJbnROb2RlSW5mbyk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgbGlzdAorCQkJCXdoaWxlIChwSW50Tm9kZUluZm8gIT0gTlVMTCkgeworCQkJCQl1aU5vZGVJZCA9IHBJbnROb2RlSW5mby0+bV91aU5vZGVJZCAtIDE7CisJCQkJCWlmICh1aU5vZGVJZCA8CisJCQkJCSAgICB0YWJlbnRyaWVzCisJCQkJCSAgICAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICAgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnQpKSB7CisJCQkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9hZk1uQ25Mb3NzUHJlc0V2ZW50CisJCQkJCQkgICAgW3VpTm9kZUlkXSA9PSBGQUxTRSkgeworCQkJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX2Fkd01uQ25Mb3NzUHJlc1RockNudFt1aU5vZGVJZF0gPiAwKSB7CisJCQkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnQKKwkJCQkJCQkJICAgIFt1aU5vZGVJZF0tLTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX2FmTW5Dbkxvc3NQcmVzRXZlbnQKKwkJCQkJCQkgICAgW3VpTm9kZUlkXSA9IEZBTFNFOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXBJbnROb2RlSW5mbyA9CisJCQkJCSAgICBwSW50Tm9kZUluZm8tPm1fcE5leHROb2RlSW5mbzsKKwkJCQl9CisKKwkJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX01OX0NSQykgPT0gMCkgewkvLyBkZWNyZW1lbnQgQ1JDIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fTW5DcmNFcnIubV9kd1RocmVzaG9sZENudCA+IDApIHsKKwkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fTW5DcmNFcnIuCisJCQkJCQkgICAgbV9kd1RocmVzaG9sZENudC0tOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEKSA9PSAwKSB7CS8vIGRlY3JlbWVudCBjeWNsZSBleGNlZWQgdGhyZXNob2xkIGNvdW50ZXIsIGJlY2F1c2UgaXQgZGlkbid0IG9jY3VyIGxhc3QgY3ljbGUKKwkJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9NbkN5Y1RpbWVFeGNlZWQubV9kd1RocmVzaG9sZENudCA+CisJCQkJCSAgICAwKSB7CisJCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX01uQ3ljVGltZUV4Y2VlZC4KKwkJCQkJCSAgICBtX2R3VGhyZXNob2xkQ250LS07CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQkJLy8gcmVzZXQgZXJyb3IgZXZlbnRzCisJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgPSAwTDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyB1bmtub3duIHR5cGUKKwlkZWZhdWx0OgorCQl7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50VHlwZSkKKworCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyCisvLworLy8gRGVzY3JpcHRpb246IGxpbmsgc3BlY2lmaWVkIGVycm9yIGNvdW50ZXIgc3RydWN0dXJlIHRvIE9EIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBFcnJvckNvdW50ZXJfcCAgICAgICAgID0gcG9pbnRlciB0byBlcnJvciBjb3VudGVyIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gT0QgaW5kZXgKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKHRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyCisJCQkJCQkgICAqIHBFcnJvckNvdW50ZXJfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVmFyUGFyYW0gVmFyUGFyYW07CisKKwlWYXJQYXJhbS5tX3BEYXRhID0gJnBFcnJvckNvdW50ZXJfcC0+bV9kd0N1bXVsYXRpdmVDbnQ7CisJVmFyUGFyYW0ubV9TaXplID0gc2l6ZW9mKERXT1JEKTsKKwlWYXJQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJVmFyUGFyYW0ubV91aVN1YmluZGV4ID0gMHgwMTsKKwlWYXJQYXJhbS5tX1ZhbGlkRmxhZyA9IGtWYXJWYWxpZEFsbDsKKwlSZXQgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlWYXJQYXJhbS5tX3BEYXRhID0gJnBFcnJvckNvdW50ZXJfcC0+bV9kd1RocmVzaG9sZENudDsKKwlWYXJQYXJhbS5tX1NpemUgPSBzaXplb2YoRFdPUkQpOworCVZhclBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlWYXJQYXJhbS5tX3VpU3ViaW5kZXggPSAweDAyOworCVZhclBhcmFtLm1fVmFsaWRGbGFnID0ga1ZhclZhbGlkQWxsOworCVJldCA9IEVwbE9iZERlZmluZVZhcigmVmFyUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVZhclBhcmFtLm1fcERhdGEgPSAmcEVycm9yQ291bnRlcl9wLT5tX2R3VGhyZXNob2xkOworCVZhclBhcmFtLm1fU2l6ZSA9IHNpemVvZihEV09SRCk7CisJVmFyUGFyYW0ubV91aUluZGV4ID0gdWlJbmRleF9wOworCVZhclBhcmFtLm1fdWlTdWJpbmRleCA9IDB4MDM7CisJVmFyUGFyYW0ubV9WYWxpZEZsYWcgPSBrVmFyVmFsaWRBbGw7CisJUmV0ID0gRXBsT2JkRGVmaW5lVmFyKCZWYXJQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyCisvLworLy8gRGVzY3JpcHRpb246IGxpbmsgc3BlY2lmaWVkIGVycm9yIGNvdW50ZXIgc3RydWN0dXJlIHRvIE9EIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBFcnJvckNvdW50ZXJfcCAgICAgICAgID0gcG9pbnRlciB0byBlcnJvciBjb3VudGVyIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gT0QgaW5kZXgKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KERXT1JEICogcGR3VmFsdWVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aVZhbHVlQ291bnRfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVmFyUGFyYW0gVmFyUGFyYW07CisJdEVwbE9iZFNpemUgRW50cnlTaXplOworCUJZVEUgYkluZGV4RW50cmllczsKKworCUVudHJ5U2l6ZSA9ICh0RXBsT2JkU2l6ZSkgc2l6ZW9mKGJJbmRleEVudHJpZXMpOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSh1aUluZGV4X3AsCisJCQkgICAgICAweDAwLCAodm9pZCBHRU5FUklDICopJmJJbmRleEVudHJpZXMsICZFbnRyeVNpemUpOworCisJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHx8IChiSW5kZXhFbnRyaWVzID09IDB4MDApKSB7CisJCS8vIE9iamVjdCBkb2Vzbid0IGV4aXN0IG9yIGludmFsaWQgZW50cnkgbnVtYmVyCisJCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKGJJbmRleEVudHJpZXMgPCB1aVZhbHVlQ291bnRfcCkgeworCQl1aVZhbHVlQ291bnRfcCA9IGJJbmRleEVudHJpZXM7CisJfQorCisJVmFyUGFyYW0ubV9TaXplID0gc2l6ZW9mKERXT1JEKTsKKwlWYXJQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJVmFyUGFyYW0ubV9WYWxpZEZsYWcgPSBrVmFyVmFsaWRBbGw7CisKKwlmb3IgKFZhclBhcmFtLm1fdWlTdWJpbmRleCA9IDB4MDE7CisJICAgICBWYXJQYXJhbS5tX3VpU3ViaW5kZXggPD0gdWlWYWx1ZUNvdW50X3A7IFZhclBhcmFtLm1fdWlTdWJpbmRleCsrKSB7CisJCVZhclBhcmFtLm1fcERhdGEgPSBwZHdWYWx1ZV9wOworCQlSZXQgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCXBkd1ZhbHVlX3ArKzsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEV2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEV2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkYzFiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnQuaApAQCAtMCwwICsxLDI3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgZXZlbnQgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnQuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VWRU5UX0hfCisjZGVmaW5lIF9FUExfRVZFTlRfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbE5tdC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gbmFtZSBhbmQgc2l6ZSBvZiBldmVudCBxdWV1ZXMKKyNkZWZpbmUgRVBMX0VWRU5UX05BTUVfU0hCX0tFUk5FTF9UT19VU0VSICAgIlNoYktlcm5lbFRvVXNlciIKKyNpZm5kZWYgRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSCisjZGVmaW5lIEVQTF9FVkVOVF9TSVpFX1NIQl9LRVJORUxfVE9fVVNFUiAgIDMyNzY4CS8vIDMyIGtCeXRlCisjZW5kaWYKKworI2RlZmluZSBFUExfRVZFTlRfTkFNRV9TSEJfVVNFUl9UT19LRVJORUwgICAiU2hiVXNlclRvS2VybmVsIgorI2lmbmRlZiBFUExfRVZFTlRfU0laRV9TSEJfVVNFUl9UT19LRVJORUwKKyNkZWZpbmUgRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMICAgMzI3NjgJLy8gMzIga0J5dGUKKyNlbmRpZgorCisvLyBtYXggc2l6ZSBvZiBldmVudCBhcmd1bWVudAorI2lmbmRlZiBFUExfTUFYX0VWRU5UX0FSR19TSVpFCisjZGVmaW5lIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkUgICAgICAyNTYJLy8gYmVjYXVzZSBvZiBQRE8KKyNlbmRpZgorCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0NSQyAgICAgICAgICAgMHgwMDAwMDAwMUwJLy8gb2JqZWN0IDB4MUMwMAorI2RlZmluZSBFUExfRExMX0VSUl9NTl9DT0xMSVNJT04gICAgIDB4MDAwMDAwMDJMCS8vIG9iamVjdCAweDFDMDEKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTU5fQ1lDVElNRUVYQ0VFRCAweDAwMDAwMDA0TAkvLyBvYmplY3QgMHgxQzAyCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0xPU1NfTElOSyAgICAgMHgwMDAwMDAwOEwJLy8gb2JqZWN0IDB4MUMwMworI2RlZmluZSBFUExfRExMX0VSUl9NTl9DTl9MQVRFX1BSRVMgIDB4MDAwMDAwMTBMCS8vIG9iamVjdHMgMHgxQzA0LTB4MUMwNgorI2RlZmluZSBFUExfRExMX0VSUl9NTl9DTl9MT1NTX1BSRVMgIDB4MDAwMDAwODBMCS8vIG9iamVjdHMgMHgxQzA3LTB4MUMwOQorI2RlZmluZSBFUExfRExMX0VSUl9DTl9DT0xMSVNJT04gICAgIDB4MDAwMDA0MDBMCS8vIG9iamVjdCAweDFDMEEKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0MgICAgICAweDAwMDAwODAwTAkvLyBvYmplY3QgMHgxQzBCCisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BICAgICAgMHgwMDAwMTAwMEwJLy8gb2JqZWN0IDB4MUMwQworI2RlZmluZSBFUExfRExMX0VSUl9DTl9MT1NTX1BSRVEgICAgIDB4MDAwMDIwMDBMCS8vIG9iamVjdCAweDFDMEQKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fUkVDVkRfUFJFUSAgICAweDAwMDA0MDAwTAkvLyBkZWNyZW1lbnQgb2JqZWN0IDB4MUMwRC8yCisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX1NPQ19KSVRURVIgICAgMHgwMDAwODAwMEwJLy8gb2JqZWN0IDB4MUMwRQorI2RlZmluZSBFUExfRExMX0VSUl9DTl9DUkMgICAgICAgICAgIDB4MDAwMTAwMDBMCS8vIG9iamVjdCAweDFDMEYKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fTE9TU19MSU5LICAgICAweDAwMDIwMDAwTAkvLyBvYmplY3QgMHgxQzEwCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0xPU1NfU1RBVFJFUyAgMHgwMDA0MDAwMEwJLy8gb2JqZWN0cyAweDFDMTUtMHgxQzE3IChzaG91bGQgYmUgb3BlcmF0ZWQgYnkgTm10TW51IG1vZHVsZSkKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQkFEX1BIWVNfTU9ERSAgICAweDAwMDgwMDAwTAkvLyBubyBvYmplY3QKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTUFDX0JVRkZFUiAgICAgICAweDAwMTAwMDAwTAkvLyBubyBvYmplY3QgKE5NVF9HVDYpCisjZGVmaW5lIEVQTF9ETExfRVJSX0lOVkFMSURfRk9STUFUICAgMHgwMDIwMDAwMEwJLy8gbm8gb2JqZWN0IChOTVRfR1Q2KQorI2RlZmluZSBFUExfRExMX0VSUl9BRERSRVNTX0NPTkZMSUNUIDB4MDA0MDAwMDBMCS8vIG5vIG9iamVjdCAocmVtb3ZlIENOIGZyb20gY29uZmlndXJhdGlvbikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEV2ZW50VHlwZSBkZXRlcm1pbmVzIHRoZSBhcmd1bWVudCBvZiB0aGUgZXZlbnQKK3R5cGVkZWYgZW51bSB7CisJa0VwbEV2ZW50VHlwZU5tdEV2ZW50ID0gMHgwMSwJLy8gTk1UIGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbE5tdEV2ZW50CisJa0VwbEV2ZW50VHlwZVBkb1J4ID0gMHgwMiwJLy8gUERPIGZyYW1lIHJlY2VpdmVkIGV2ZW50IChQUmVzL1BSZXEpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lCisJa0VwbEV2ZW50VHlwZVBkb1R4ID0gMHgwMywJLy8gUERPIGZyYW1lIHRyYW5zbWl0dGVkIGV2ZW50IChQUmVzL1BSZXEpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lSW5mbworCWtFcGxFdmVudFR5cGVQZG9Tb2EgPSAweDA0LAkvLyBTb0EgZnJhbWUgcmVjZWl2ZWQgZXZlbnQgKGlzb2Nocm9ub3VzIHBoYXNlIGNvbXBsZXRlZCkKKwkvLyBhcmcgaXMgcG9pbnRlciB0byBub3RoaW5nCisJa0VwbEV2ZW50VHlwZVN5bmMgPSAweDA1LAkvLyBTeW5jIGV2ZW50IChlLmcuIFNvQyBvciBhbnRpY2lwYXRlZCBTb0MpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gbm90aGluZworCWtFcGxFdmVudFR5cGVUaW1lciA9IDB4MDYsCS8vIFRpbWVyIGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbFRpbWVyRXZlbnRBcmcKKwlrRXBsRXZlbnRUeXBlSGVhcnRiZWF0ID0gMHgwNywJLy8gSGVhcnRiZWF0IGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEhlYXJ0YmVhdEV2ZW50CisJa0VwbEV2ZW50VHlwZURsbGtDcmVhdGUgPSAweDA4LAkvLyBETEwga2VybmVsIGNyZWF0ZSBldmVudAorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRoZSBuZXcgdEVwbE5tdFN0YXRlCisJa0VwbEV2ZW50VHlwZURsbGtEZXN0cm95ID0gMHgwOSwJLy8gRExMIGtlcm5lbCBkZXN0cm95IGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdGhlIG9sZCB0RXBsTm10U3RhdGUKKwlrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeCA9IDB4MEEsCS8vIERMTCBrZXJuZWwgZmlsbCBUeEJ1ZmZlciBldmVudAorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5CisJa0VwbEV2ZW50VHlwZURsbGtQcmVzUmVhZHkgPSAweDBCLAkvLyBETEwga2VybmVsIFBSZXMgcmVhZHkgZXZlbnQKKwkvLyBhcmcgaXMgcG9pbnRlciB0byBub3RoaW5nCisJa0VwbEV2ZW50VHlwZUVycm9yID0gMHgwQywJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxFdmVudEVycm9yCisJa0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlID0gMHgwRCwJLy8gaW5kaWNhdGUgY2hhbmdlIG9mIE5NVC1TdGF0ZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJa0VwbEV2ZW50VHlwZURsbEVycm9yID0gMHgwRSwJLy8gRExMIGVycm9yIGV2ZW50IGZvciBFcnJvciBoYW5kbGVyCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEVycm9ySGFuZGxlcmtFdmVudAorCWtFcGxFdmVudFR5cGVBc25kUnggPSAweDBGLAkvLyByZWNlaXZlZCBBU25kIGZyYW1lIGZvciBETEwgdXNlciBtb2R1bGUKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRnJhbWUKKwlrRXBsRXZlbnRUeXBlRGxsa1NlcnZGaWx0ZXIgPSAweDEwLAkvLyBjb25maWd1cmUgU2VydmljZUlkRmlsdGVyCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENhbFNlcnZpY2VJZEZpbHRlcgorCWtFcGxFdmVudFR5cGVEbGxrSWRlbnRpdHkgPSAweDExLAkvLyBjb25maWd1cmUgSWRlbnRpdHkKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRGxsSWRlbnRQYXJhbQorCWtFcGxFdmVudFR5cGVEbGxrQ29uZmlnID0gMHgxMiwJLy8gY29uZmlndXJlIENvbmZpZ1BhcmFtCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENvbmZpZ1BhcmFtCisJa0VwbEV2ZW50VHlwZURsbGtJc3N1ZVJlcSA9IDB4MTMsCS8vIGlzc3VlIElkZW50L1N0YXR1cyByZXF1ZXN0CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENhbElzc3VlUmVxdWVzdAorCWtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZSA9IDB4MTQsCS8vIGFkZCBub2RlIHRvIGlzb2Nocm9ub3VzIHBoYXNlCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbE5vZGVJbmZvCisJa0VwbEV2ZW50VHlwZURsbGtEZWxOb2RlID0gMHgxNSwJLy8gcmVtb3ZlIG5vZGUgZnJvbSBpc29jaHJvbm91cyBwaGFzZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHVuc2lnbmVkIGludAorCWtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGUgPSAweDE2LAkvLyByZW1vdmUgbm9kZSBzb2Z0bHkgZnJvbSBpc29jaHJvbm91cyBwaGFzZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHVuc2lnbmVkIGludAorCWtFcGxFdmVudFR5cGVEbGxrU3RhcnRSZWR1Y2VkQ3ljbGUgPSAweDE3LAkvLyBzdGFydCByZWR1Y2VkIEVQTCBjeWNsZSBvbiBNTgorCS8vIGFyZyBpcyBwb2ludGVyIHRvIG5vdGhpbmcKKwlrRXBsRXZlbnRUeXBlTm10TW51Tm10Q21kU2VudCA9IDB4MTgsCS8vIE5NVCBjb21tYW5kIHdhcyBhY3R1YWxseSBzZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lCisKK30gdEVwbEV2ZW50VHlwZTsKKworLy8gRXZlbnRTaW5rIGRldGVybWluZXMgdGhlIGNvbnN1bWVyIG9mIHRoZSBldmVudAordHlwZWRlZiBlbnVtIHsKKwlrRXBsRXZlbnRTaW5rU3luYyA9IDB4MDAsCS8vIFN5bmMgZXZlbnQgZm9yIGFwcGxpY2F0aW9uIG9yIGtlcm5lbCBFUEwgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdGsgPSAweDAxLAkvLyBldmVudHMgZm9yIE5tdGsgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbGsgPSAweDAyLAkvLyBldmVudHMgZm9yIERsbGsgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbHVDYWwgPSAweDAzLAkvLyBldmVudHMgZm9yIERsbHVDYWwgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbGtDYWwgPSAweDA0LAkvLyBldmVudHMgZm9yIERsbGtDYWwgbW9kdWxlCisJa0VwbEV2ZW50U2lua1Bkb2sgPSAweDA1LAkvLyBldmVudHMgZm9yIFBkb2sgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdHUgPSAweDA2LAkvLyBldmVudHMgZm9yIE5tdHUgbW9kdWxlCisJa0VwbEV2ZW50U2lua0VycmsgPSAweDA3LAkvLyBldmVudHMgZm9yIEVycm9yIGhhbmRsZXIgbW9kdWxlCisJa0VwbEV2ZW50U2lua0VycnUgPSAweDA4LAkvLyBldmVudHMgZm9yIEVycm9yIHNpZ25hbGluZyBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rU2RvQXN5U2VxID0gMHgwOSwJLy8gZXZlbnRzIGZvciBhc3luY3Jvbm91cyBTRE8gU2VxdWVuY2UgTGF5ZXIgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdE1udSA9IDB4MEEsCS8vIGV2ZW50cyBmb3IgTm10TW51IG1vZHVsZQorCWtFcGxFdmVudFNpbmtMZWR1ID0gMHgwQiwJLy8gZXZlbnRzIGZvciBMZWR1IG1vZHVsZQorCWtFcGxFdmVudFNpbmtBcGkgPSAweDBGLAkvLyBldmVudHMgZm9yIEFQSSBtb2R1bGUKKworfSB0RXBsRXZlbnRTaW5rOworCisvLyBFdmVudFNvdXJjZSBkZXRlcm1pbmVzIHRoZSBzb3VyY2Ugb2YgYW4gZXJyb3JldmVudAordHlwZWRlZiBlbnVtIHsKKwkvLyBrZXJuZWxzcGFjZSBtb2R1bGVzCisJa0VwbEV2ZW50U291cmNlRGxsayA9IDB4MDEsCS8vIERsbGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlTm10ayA9IDB4MDIsCS8vIE5tdGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlT2JkayA9IDB4MDMsCS8vIE9iZGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlUGRvayA9IDB4MDQsCS8vIFBkb2sgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlVGltZXJrID0gMHgwNSwJLy8gVGltZXJrIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZUV2ZW50ayA9IDB4MDYsCS8vIEV2ZW50ayBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VTeW5jQ2IgPSAweDA3LAkvLyBzeW5jLUNiCisJa0VwbEV2ZW50U291cmNlRXJyayA9IDB4MDgsCS8vIEVycm9yIGhhbmRsZXIgbW9kdWxlCisKKwkvLyB1c2Vyc3BhY2UgbW9kdWxlcworCWtFcGxFdmVudFNvdXJjZURsbHUgPSAweDEwLAkvLyBEbGx1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZU5tdHUgPSAweDExLAkvLyBObXR1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZU5tdENudSA9IDB4MTIsCS8vIE5tdENudSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VObXRNbnUgPSAweDEzLAkvLyBObXRNbnUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlT2JkdSA9IDB4MTQsCS8vIE9iZHUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlU2RvVWRwID0gMHgxNSwJLy8gU2RvL1VkcCBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VTZG9Bc25kID0gMHgxNiwJLy8gU2RvL0FzbmQgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlU2RvQXN5U2VxID0gMHgxNywJLy8gU2RvIGFzeW5jaHJvbnVzIFNlcXVlbmNlIExheWVyIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZVNkb0NvbSA9IDB4MTgsCS8vIFNkbyBjb21tYW5kIGxheWVyIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZVRpbWVydSA9IDB4MTksCS8vIFRpbWVydSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VDZmdNYXUgPSAweDFBLAkvLyBDZmdNYXUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlRXZlbnR1ID0gMHgxQiwJLy8gRXZlbnR1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZUVwbEFwaSA9IDB4MUMsCS8vIEFwaSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VMZWR1ID0gMHgxRCwJLy8gTGVkdSBtb2R1bGUKKworfSB0RXBsRXZlbnRTb3VyY2U7CisKKy8vIHN0cnVjdHVyZSBvZiBFUEwgZXZlbnQgKGVsZW1lbnQgb3JkZXIgbXVzdCBub3QgYmUgY2hhbmdlZCEpCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEV2ZW50VHlwZSBtX0V2ZW50VHlwZSAvKjoyOCAqLyA7CS8vIGV2ZW50IHR5cGUKKwl0RXBsRXZlbnRTaW5rIG1fRXZlbnRTaW5rIC8qOjQgKi8gOwkvLyBldmVudCBzaW5rCisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOwkvLyB0aW1lc3RhbXAKKwl1bnNpZ25lZCBpbnQgbV91aVNpemU7CS8vIHNpemUgb2YgYXJndW1lbnQKKwl2b2lkICptX3BBcmc7CQkvLyBhcmd1bWVudCBvZiBldmVudAorCit9IHRFcGxFdmVudDsKKworLy8gc2hvcnQgc3RydWN0dXJlIG9mIEVQTCBldmVudCB3aXRob3V0IGFyZ3VtZW50IGFuZCBpdHMgc2l6ZSAoZWxlbWVudCBvcmRlciBtdXN0IG5vdCBiZSBjaGFuZ2VkISkKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRXZlbnRUeXBlIG1fRXZlbnRUeXBlIC8qOjI4ICovIDsJLy8gZXZlbnQgdHlwZQorCXRFcGxFdmVudFNpbmsgbV9FdmVudFNpbmsgLyo6NCAqLyA7CS8vIGV2ZW50IHNpbmsKKwl0RXBsTmV0VGltZSBtX05ldFRpbWU7CS8vIHRpbWVzdGFtcAorCit9IHRFcGxFdmVudFNob3J0OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgbV91aVN1YkluZGV4OworCit9IHRFcGxFdmVudE9iZEVycm9yOworCisvLyBzdHJ1Y3R1cmUgZm9yIGtFcGxFdmVudFR5cGVFcnJvcgordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxFdmVudFNvdXJjZSBtX0V2ZW50U291cmNlOwkvLyBtb2R1bGUgd2hpY2ggcG9zdGVkIHRoaXMgZXJyb3IgZXZlbnQKKwl0RXBsS2VybmVsIG1fRXBsRXJyb3I7CS8vIEVQTCBlcnJvciB3aGljaCBvY2N1cmVkCisJdW5pb24geworCQlCWVRFIG1fYkFyZzsKKwkJRFdPUkQgbV9kd0FyZzsKKwkJdEVwbEV2ZW50U291cmNlIG1fRXZlbnRTb3VyY2U7CS8vIGZyb20gRXZlbnRrL3UgbW9kdWxlIChvcmlnaW5hdGluZyBlcnJvciBzb3VyY2UpCisJCXRFcGxFdmVudE9iZEVycm9yIG1fT2JkRXJyb3I7CS8vIGZyb20gT2JkIG1vZHVsZQorLy8gICAgICAgIHRFcGxFcnJIaXN0b3J5RW50cnkgICAgIG1fSGlzdG9yeUVudHJ5OyAvLyBmcm9tIE5tdGsvdSBtb2R1bGUKKworCX0gbV9Bcmc7CisKK30gdEVwbEV2ZW50RXJyb3I7CisKKy8vIHN0cnVjdHVyZSBmb3Iga0VwbEV2ZW50VHlwZURsbEVycm9yCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX3VsRGxsRXJyb3JFdmVudHM7CS8vIEVQTF9ETExfRVJSXyoKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwl0RXBsTm10U3RhdGUgbV9ObXRTdGF0ZTsKKworfSB0RXBsRXJyb3JIYW5kbGVya0V2ZW50OworCisvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBnZXQgaW5mb3JtZWQgYWJvdXQgc3luYyBldmVudAordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxTeW5jQ2IpICh2b2lkKTsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGdlbmVyaWMgZXZlbnRzCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFByb2Nlc3NFdmVudENiKSAodEVwbEV2ZW50ICogcEVwbEV2ZW50X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnRrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2OGE2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnRrLmMKQEAgLTAsMCArMSw4NTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsLUtlcm5lbHNwYWNlLUV2ZW50LU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnRrLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKyNlbmRpZgorCisjaWZkZWYgRVBMX05PX0ZJRk8KKyNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgorI2Vsc2UKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiSW5zdGFuY2UgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2U7CisJdFNoYkluc3RhbmNlIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlOworI2Vsc2UKKworI2VuZGlmCisJdEVwbFN5bmNDYiBtX3BmbkNiU3luYzsKKwl1bnNpZ25lZCBpbnQgbV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudDsKKworfSB0RXBsRXZlbnRrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEV2ZW50a0luc3RhbmNlIEVwbEV2ZW50a0luc3RhbmNlX2c7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGluY29taW5nIGV2ZW50cworI2lmbmRlZiBFUExfTk9fRklGTworc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwtS2VybmVsc3BhY2UtRXZlbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZmlyc3QgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuQ2JTeW5jX3AgPSBjYWxsYmFjay1mdW5jdGlvbiBmb3Igc3luYyBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a0luaXQodEVwbFN5bmNDYiBwZm5DYlN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbEV2ZW50a0FkZEluc3RhbmNlKHBmbkNiU3luY19wKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrQWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gYWRkcyBvbmUgbW9yZSBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5DYlN5bmNfcCA9IGNhbGxiYWNrLWZ1bmN0aW9uIGZvciBzeW5jIGV2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrQWRkSW5zdGFuY2UodEVwbFN5bmNDYiBwZm5DYlN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgaW50IGZTaGJOZXdDcmVhdGVkOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGluaXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3VpVXNlclRvS2VybmVsRnVsbENvdW50ID0gMDsKKworCS8vIHNhdmUgY2ItZnVuY3Rpb24KKwlFcGxFdmVudGtJbnN0YW5jZV9nLm1fcGZuQ2JTeW5jID0gcGZuQ2JTeW5jX3A7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkvLyBpbml0IHNoYXJlZCBsb29wIGJ1ZmZlcgorCS8vIGtlcm5lbCAtPiB1c2VyCisJU2hiRXJyb3IgPSBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRVZFTlRfU0laRV9TSEJfS0VSTkVMX1RPX1VTRVIsCisJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfS0VSTkVMX1RPX1VTRVIsCisJCQkJICAgICAmRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihLMlUpIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyB1c2VyIC0+IGtlcm5lbAorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgJkVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnRrQWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVnaXN0ZXIgZXZlbnRoYW5kbGVyCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAorCQkJCQkgIEVwbEV2ZW50a1J4U2lnbmFsSGFuZGxlckNiLAorCQkJCQkgIGtzaGJQcmlvcml0eUhpZ2gpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0FkZEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a0RlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZXMgaW5zdGFuY2UgYW5kIGZyZWVzIHRoZSBidWZmZXJzCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmbmRlZiBFUExfTk9fRklGTworCS8vIHNldCBldmVudGhhbmRsZXIgdG8gTlVMTAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwgTlVMTCwKKwkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwkvLyBmcmVlIGJ1ZmZlciBVc2VyIC0+IEtlcm5lbAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0gZWxzZSB7CisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UgPSBOVUxMOworCX0KKworCS8vIGZyZWUgYnVmZmVyICBLZXJuZWwgLT4gVXNlcgorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKEsyVSkgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0gZWxzZSB7CisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UgPSBOVUxMOworCX0KKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IEtlcm5lbHRocmVhZCB0aGF0IGRpc3BhdGNoZXMgZXZlbnRzIGluIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1cmUgZnJvbSBidWZmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxFdmVudFNvdXJjZSBFdmVudFNvdXJjZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZXJyb3IgaGFuZGxpbmcgaWYgZXZlbnQgcXVldWUgaXMgZnVsbAorCWlmIChFcGxFdmVudGtJbnN0YW5jZV9nLm1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQgPiAwKSB7CS8vIFVzZXJUb0tlcm5lbCBldmVudCBxdWV1ZSBoYXMgcnVuIG91dCBvZiBzcGFjZSAtPiBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwkJdEVwbEV2ZW50IEV2ZW50OworCQl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisjZW5kaWYKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwkJLy8gZGlyZWN0bHkgY2FsbCBOTVRrIHByb2Nlc3MgZnVuY3Rpb24sIGJlY2F1c2UgZXZlbnQgcXVldWUgaXMgZnVsbAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjsKKwkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJRXZlbnQubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwkJRXZlbnQubV9OZXRUaW1lLm1fZHdTZWMgPSAwOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCVJldCA9IEVwbE5tdGtQcm9jZXNzKCZFdmVudCk7CisjZW5kaWYKKworCQkvLyBOTVQgc3RhdGUgbWFjaGluZSBjaGFuZ2VkIHRvIHJlc2V0IChpLmUuIE5NVF9HU19SRVNFVF9DT01NVU5JQ0FUSU9OKQorCQkvLyBub3csIGl0IGlzIHNhZmUgdG8gcmVzZXQgdGhlIGNvdW50ZXIgYW5kIGVtcHR5IHRoZSBldmVudCBxdWV1ZQorI2lmbmRlZiBFUExfTk9fRklGTworCQlTaGJFcnJvciA9CisJCSAgICBTaGJDaXJSZXNldEJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCSAgICAgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLCAxMDAwLCBOVUxMKTsKKyNlbmRpZgorCisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudCA9IDA7CisJCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIyKTsKKworCQkvLyBhbHNvIGRpc2NhcmQgdGhlIGN1cnJlbnQgZXZlbnQgKGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHdlIGxvc2UgYW5vdGhlciBldmVudCkKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBtX0V2ZW50U2luaworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CisJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKKwkJeworCQkJaWYgKEVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMgIT0gTlVMTCkgeworCQkJCVJldCA9IEVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMoKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQkJLy8gbWFyayBUUERPcyBhcyB2YWxpZAorCQkJCQlSZXQgPSBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZChUUlVFKTsKKyNlbmRpZgorCQkJCX0gZWxzZSBpZiAoKFJldCAhPSBrRXBsUmVqZWN0KQorCQkJCQkgICAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VTeW5jQ2I7CisKKwkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKKwkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKKwkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTk1ULUtlcm5lbC1Nb2R1bAorCWNhc2Uga0VwbEV2ZW50U2lua05tdGs6CisJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJCQlSZXQgPSBFcGxObXRrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXRrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCWlmICgocEV2ZW50X3AtPm1fRXZlbnRUeXBlID09IGtFcGxFdmVudFR5cGVObXRFdmVudCkKKwkJCSAgICAmJgorCQkJICAgICgoKigodEVwbE5tdEV2ZW50ICopIHBFdmVudF9wLT5tX3BBcmcpID09CisJCQkgICAgICBrRXBsTm10RXZlbnREbGxDZVNvYSkKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkgICAgIHx8ICgqKCh0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZykgPT0KKwkJCQkga0VwbE5tdEV2ZW50RGxsTWVTb2FTZW50KQorI2VuZGlmCisJCQkgICAgKSkgewkvLyBmb3J3YXJkIFNvQSBldmVudCB0byBlcnJvciBoYW5kbGVyCisJCQkJUmV0ID0gRXBsRXJyb3JIYW5kbGVya1Byb2Nlc3MocEV2ZW50X3ApOworCQkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkJCSAgICAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJrOworCisJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQkJRXBsRXZlbnRrUG9zdEVycm9yCisJCQkJCSAgICAoa0VwbEV2ZW50U291cmNlRXZlbnRrLCBSZXQsCisJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKKwkJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQkvLyBmb3J3YXJkIFNvQSBldmVudCB0byBQRE8gbW9kdWxlCisJCQkJcEV2ZW50X3AtPm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVBkb1NvYTsKKwkJCQlSZXQgPSBFcGxQZG9rUHJvY2VzcyhwRXZlbnRfcCk7CisJCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisJCQkJICAgICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgeworCQkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVBkb2s7CisKKwkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKKwkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKKwkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOworCQkJCX0KKyNlbmRpZgorCisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy8gZXZlbnRzIGZvciBEbGxrIG1vZHVsZQorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGs6CisJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJCQlSZXQgPSBFcGxEbGxrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VEbGxrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQkvLyBldmVudHMgZm9yIERsbGtDYWwgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbERsbGtDYWxQcm9jZXNzKHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZURsbGs7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vCisJY2FzZSBrRXBsRXZlbnRTaW5rUGRvazoKKwkJeworCQkJLy8gUERPLU1vZHVsZQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJCQlSZXQgPSBFcGxQZG9rUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VQZG9rOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQkvLyBldmVudHMgZm9yIEVycm9yIGhhbmRsZXIgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rRXJyazoKKwkJeworCQkJLy8gb25seSBjYWxsIGVycm9yIGhhbmRsZXIgaWYgRExMIGlzIHByZXNlbnQKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJCQlSZXQgPSBFcGxFcnJvckhhbmRsZXJrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQkvLyB1bmtub3duIHNpbmsKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrUG9zdAorLy8KKy8vIERlc2NyaXB0aW9uOiBwb3N0IGV2ZW50cyBmcm9tIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1cmUgZnJvbSBidWZmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0KHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiQ2lyQ2h1bmsgU2hiQ2lyQ2h1bms7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXVuc2lnbmVkIGludCBmQnVmZmVyQ29tcGxldGVkOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHRoZSBldmVudCBtdXN0IGJlIHBvc3RlZCBieSB1c2luZyB0aGUgYWJCdWZmZXIKKwkvLyBpdCBpcyBuZWVkZSBiZWNhdXNlIHRoZSBBcmd1bWVudCBtdXN0IGJ5IGNvcGllZAorCS8vIHRvIHRoZSBidWZmZXIgdG9vIGFuZCBub3Qgb25seSB0aGUgcG9pbnRlcgorCisjaWZuZGVmIEVQTF9OT19GSUZPCisJLy8gMjAwNi8wOC8wMyBkLmsuOiBFdmVudCBhbmQgYXJndW1lbnQgYXJlIHBvc3RlZCBhcyBzZXBhcmF0ZSBjaHVua3MgdG8gdGhlIGV2ZW50IHF1ZXVlLgorCXVsRGF0YVNpemUgPQorCSAgICBzaXplb2YodEVwbEV2ZW50KSArCisJICAgICgocEV2ZW50X3AtPm1fcEFyZyAhPSBOVUxMKSA/IHBFdmVudF9wLT5tX3VpU2l6ZSA6IDApOworI2VuZGlmCisKKwkvLyBkZWNpZGUgaW4gd2hpY2ggYnVmZmVyIHRoZSBldmVudCBoYXZlIHRvIHdyaXRlCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFNpbmspIHsKKwkJLy8ga2VybmVsc3BhY2UgbW9kdWxlcworCWNhc2Uga0VwbEV2ZW50U2lua1N5bmM6CisJY2FzZSBrRXBsRXZlbnRTaW5rTm10azoKKwljYXNlIGtFcGxFdmVudFNpbmtEbGxrOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGtDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rUGRvazoKKwljYXNlIGtFcGxFdmVudFNpbmtFcnJrOgorCQl7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJCQkvLyBwb3N0IG1lc3NhZ2UKKwkJCUJFTkNITUFSS19NT0RfMjdfU0VUKDIpOworCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCXN3aXRjaCAoU2hiRXJyb3IpIHsKKwkJCWNhc2Uga1NoYk9rOgorCQkJCWJyZWFrOworCisJCQljYXNlIGtTaGJCdWZmZXJGdWxsOgorCQkJCXsKKwkJCQkJRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQrKzsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJCSAgICAoIkVwbEV2ZW50a1Bvc3QoKTogU2hiQ2lyQWxsb2NEYXRhQmxvY2soVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhVMkspIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJQkVOQ0hNQVJLX01PRF8yN19SRVNFVCgyKTsKKworI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKKwljYXNlIGtFcGxFdmVudFNpbmtObXR1OgorCWNhc2Uga0VwbEV2ZW50U2lua05tdE1udToKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKKwkJeworI2lmbmRlZiBFUExfTk9fRklGTworCQkJLy8gcG9zdCBtZXNzYWdlCisvLyAgICAgICAgICAgIEJFTkNITUFSS19NT0RfMjdfU0VUKDMpOyAgICAvLyA3NCC1cyB1bnRpbCByZXNldAorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKEsyVSkgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhLMlUpIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoSzJVKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorLy8gICAgICAgICAgICBCRU5DSE1BUktfTU9EXzI3X1JFU0VUKDMpOyAgLy8gODIgtXMgdW50aWwgU2hiQ2lyR2V0UmVhZERhdGFTaXplKCkgaW4gRXBsRXZlbnR1CisKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudHVQcm9jZXNzKHBFdmVudF9wKTsKKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbEV2ZW50VW5rbm93blNpbms7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50U2luaykKKworI2lmbmRlZiBFUExfTk9fRklGTworICAgICAgRXhpdDoKKyNlbmRpZgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a1Bvc3RFcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOiBwb3N0IGVycm9yIGV2ZW50IGZyb20ga2VybmVsIHBhcnQgdG8gQVBJIGxheWVyCisvLworLy8gUGFyYW1ldGVyczogIEV2ZW50U291cmNlX3AgICA9IHNvdXJjZS1tb2R1bGUgb2YgdGhlIGVycm9yIGV2ZW50CisvLyAgICAgICAgICAgICAgRXBsRXJyb3JfcCAgICAgID0gY29kZSBvZiBvY2N1cmVkIGVycm9yCisvLyAgICAgICAgICAgICAgQXJnU2l6ZV9wICAgICAgID0gc2l6ZSBvZiB0aGUgYXJndW1lbnQKKy8vICAgICAgICAgICAgICBwQXJnX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICAgICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiQnVmZmVyW0VQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCXRFcGxFdmVudEVycm9yICpwRXZlbnRFcnJvciA9ICh0RXBsRXZlbnRFcnJvciAqKSBhYkJ1ZmZlcjsKKwl0RXBsRXZlbnQgRXBsRXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNyZWF0ZSBhcmd1bWVudAorCXBFdmVudEVycm9yLT5tX0V2ZW50U291cmNlID0gRXZlbnRTb3VyY2VfcDsKKwlwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CisJRVBMX01FTUNQWSgmcEV2ZW50RXJyb3ItPm1fQXJnLCBwQXJnX3AsIHVpQXJnU2l6ZV9wKTsKKworCS8vIGNyZWF0ZSBldmVudAorCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUVycm9yOworCUVwbEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0FwaTsKKwlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKKwlFcGxFdmVudC5tX3VpU2l6ZSA9CisJICAgIChzaXplb2YoRXZlbnRTb3VyY2VfcCkgKyBzaXplb2YoRXBsRXJyb3JfcCkgKyB1aUFyZ1NpemVfcCk7CisJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOworCisJLy8gcG9zdCBlcnJvcmV2ZW50CisJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXBsRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a1J4U2lnbmFsSGFuZGxlckNiKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZW50cyBmcm9tIHVzZXIgYW5kIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBTaGJSeEluc3RhbmNlX3AgICAgPSBJbnN0YW5jZS1wb2ludGVyIG9mIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHVsRGF0YVNpemVfcCAgICAgICAgPSBzaXplIG9mIGRhdGEKKy8vCisvLyBSZXR1cm5zOiB2b2lkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfTk9fRklGTworc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKQoreworCXRFcGxFdmVudCAqcEVwbEV2ZW50OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKy8vdW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKy8vdW5zaWduZWQgbG9uZyAgIHVsRGF0YVNpemU7CisJQllURSBhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCkgKyBFUExfTUFYX0VWRU5UX0FSR19TSVpFXTsKKwkvLyBkLmsuOiBhYkRhdGFCdWZmZXIgY29udGFpbnMgdGhlIGNvbXBsZXRlIHRFcGxFdmVudCBzdHJ1Y3R1cmUKKwkvLyAgICAgICBhbmQgYmVoaW5kIHRoaXMgdGhlIGFyZ3VtZW50CisKKwlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgyMCk7CisKKwlCRU5DSE1BUktfTU9EXzI3X1JFU0VUKDApOworCS8vIGNvcHkgZGF0YSBmcm9tIGV2ZW50IHF1ZXVlCisJU2hiRXJyb3IgPSBTaGJDaXJSZWFkRGF0YUJsb2NrKHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgICZhYkRhdGFCdWZmZXJbMF0sCisJCQkJICAgICAgIHNpemVvZihhYkRhdGFCdWZmZXIpLCAmdWxEYXRhU2l6ZV9wKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCS8vIGVycm9yIGdvdG8gZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlc29sdmUgdGhlIHBvaW50ZXIgdG8gdGhlIGV2ZW50IHN0cnVjdHVyZQorCXBFcGxFdmVudCA9ICh0RXBsRXZlbnQgKikgYWJEYXRhQnVmZmVyOworCS8vIHNldCBEYXRhc2l6ZQorCXBFcGxFdmVudC0+bV91aVNpemUgPSAodWxEYXRhU2l6ZV9wIC0gc2l6ZW9mKHRFcGxFdmVudCkpOworCWlmIChwRXBsRXZlbnQtPm1fdWlTaXplID4gMCkgeworCQkvLyBzZXQgcG9pbnRlciB0byBhcmd1bWVudAorCQlwRXBsRXZlbnQtPm1fcEFyZyA9ICZhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCldOworCX0gZWxzZSB7CisJCS8vc2V0IHBvaW50ZXIgdG8gTlVMTAorCQlwRXBsRXZlbnQtPm1fcEFyZyA9IE5VTEw7CisJfQorCisJQkVOQ0hNQVJLX01PRF8yN19TRVQoMCk7CisJLy8gY2FsbCBwcm9jZXNzZnVuY3Rpb24KKwlFcGxFdmVudGtQcm9jZXNzKHBFcGxFdmVudCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1ZjlhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnR1LmMKQEAgLTAsMCArMSw4MTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsLVVzZXJzcGFjZS1FdmVudC1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEV2ZW50dS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjAgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsRXZlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0FzeVNlcXUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbExlZHUuaCIKKyNpbmNsdWRlICJCZW5jaG1hcmsuaCIKKworI2lmZGVmIEVQTF9OT19GSUZPCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2Vsc2UKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiSW5zdGFuY2UgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2U7CisJdFNoYkluc3RhbmNlIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlOworI2VuZGlmCisJdEVwbFByb2Nlc3NFdmVudENiIG1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2I7CisKK30gdEVwbEV2ZW50dUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyNpZm5kZWYgRVBMX05PX0ZJRk8KK3N0YXRpYyB0RXBsRXZlbnR1SW5zdGFuY2UgRXBsRXZlbnR1SW5zdGFuY2VfZzsKKy8vI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9OT19GSUZPCisvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgaW5jb21taW5nIGV2ZW50cworc3RhdGljIHZvaWQgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwtVXNlci1FdmVudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBmbkFwaVByb2Nlc3NFdmVudENiX3AgID0gZnVuY3Rpb24gcG9pbnRlciBmb3IgQVBJIGV2ZW50IGNhbGxiYWNrCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1SW5pdCh0RXBsUHJvY2Vzc0V2ZW50Q2IgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbEV2ZW50dUFkZEluc3RhbmNlKHBmbkFwaVByb2Nlc3NFdmVudENiX3ApOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGQgb25lIG1vcmUgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wICA9IGZ1bmN0aW9uIHBvaW50ZXIgZm9yIEFQSSBldmVudCBjYWxsYmFjaworLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dUFkZEluc3RhbmNlKHRFcGxQcm9jZXNzRXZlbnRDYgorCQkJCSAgICAgICBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gaW5pdCBpbnN0YW5jZSB2YXJpYWJsZXMKKwlFcGxFdmVudHVJbnN0YW5jZV9nLm1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IgPSBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wOworCisjaWZuZGVmIEVQTF9OT19GSUZPCisJLy8gaW5pdCBzaGFyZWQgbG9vcCBidWZmZXIKKwkvLyBrZXJuZWwgLT4gdXNlcgorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX0tFUk5FTF9UT19VU0VSLAorCQkJCSAgICAgJkVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyB1c2VyIC0+IGtlcm5lbAorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgJkVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVnaXN0ZXIgZXZlbnRoYW5kbGVyCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkgIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiLAorCQkJCQkgIGtTaGJQcmlvcml0eU5vcm1hbCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlIGluc3RhbmNlIGFuIGZyZWUgdGhlIGJ1ZmZlcnN0cnVjdHVyZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmbmRlZiBFUExfTk9fRklGTworCS8vIHNldCBldmVudGhhbmRsZXIgdG8gTlVMTAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkJICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwgTlVMTCwKKwkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50dURlbEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEsyVSkgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwkvLyBmcmVlIGJ1ZmZlciBVc2VyIC0+IEtlcm5lbAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlKTsKKwlpZiAoKFNoYkVycm9yICE9IGtTaGJPaykgJiYgKFNoYkVycm9yICE9IGtTaGJNZW1Vc2VkQnlPdGhlclByb2NzKSkgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogU2hiQ2lyUmVsZWFzZUJ1ZmZlcihVMkspIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwl9IGVsc2UgeworCQlFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlID0gTlVMTDsKKwl9CisKKwkvLyBmcmVlIGJ1ZmZlciAgS2VybmVsIC0+IFVzZXIKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpclJlbGVhc2VCdWZmZXIoRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSk7CisJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spICYmIChTaGJFcnJvciAhPSBrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jcykpIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50dURlbEluc3RhbmNlKCk6IFNoYkNpclJlbGVhc2VCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfSBlbHNlIHsKKwkJRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSA9IE5VTEw7CisJfQorCisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBLZXJuZWx0aHJlYWQgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiBrZXJuZWxzcGFjZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1ciBmcm9tIGJ1ZmZlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBtX0V2ZW50U2luaworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CisJCS8vIE5NVC1Vc2VyLU1vZHVsZQorCWNhc2Uga0VwbEV2ZW50U2lua05tdHU6CisJCXsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQkJUmV0ID0gRXBsTm10dVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXR1OworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkvLyBOTVQtTU4tVXNlci1Nb2R1bGUKKwljYXNlIGtFcGxFdmVudFNpbmtObXRNbnU6CisJCXsKKwkJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXRNbnU7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisjaWYgKCgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApICAgXAorICAgICB8fCAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKSkKKwkJLy8gZXZlbnRzIGZvciBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJCXsKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VTZG9Bc3lTZXE7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCS8vIExFRCB1c2VyIHBhcnQgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rTGVkdToKKwkJeworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisJCQlSZXQgPSBFcGxMZWR1UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZUxlZHU7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vIGV2ZW50IGZvciBFUEwgYXBpCisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCQl7CisJCQlpZiAoRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BmbkFwaVByb2Nlc3NFdmVudENiICE9IE5VTEwpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkFwaVByb2Nlc3NFdmVudENiKHBFdmVudF9wKTsKKwkJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkgICAgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRXBsQXBpOworCisJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQkJRXBsRXZlbnR1UG9zdEVycm9yCisJCQkJCSAgICAoa0VwbEV2ZW50U291cmNlRXZlbnR1LCBSZXQsCisJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQl9CisKKwljYXNlIGtFcGxFdmVudFNpbmtEbGx1Q2FsOgorCQl7CisJCQlSZXQgPSBFcGxEbGx1Q2FsUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VEbGx1OworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCX0KKworCWNhc2Uga0VwbEV2ZW50U2lua0VycnU6CisJCXsKKwkJCS8qCisJCQkgICBSZXQgPSBFcGxFcnJ1UHJvY2VzcyhwRXZlbnRfcCk7CisJCQkgICBpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKQorCQkJICAgeworCQkJICAgRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJ1OworCisJCQkgICAvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkgICBFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAorCQkJICAgUmV0LAorCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKKwkJCSAgICZFdmVudFNvdXJjZSk7CisJCQkgICB9CisJCQkgKi8KKwkJCWJyZWFrOworCisJCX0KKworCQkvLyB1bmtub3duIHNpbmsKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVQb3N0CisvLworLy8gRGVzY3JpcHRpb246IHBvc3QgZXZlbnRzIGZyb20gdXNlcnNwYWNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyIGZyb20gYnVmZmVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UG9zdCh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdFNoYkNpckNodW5rIFNoYkNpckNodW5rOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBpbnQgZkJ1ZmZlckNvbXBsZXRlZDsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkvLyAyMDA2LzA4LzAzIGQuay46IEV2ZW50IGFuZCBhcmd1bWVudCBhcmUgcG9zdGVkIGFzIHNlcGFyYXRlIGNodW5rcyB0byB0aGUgZXZlbnQgcXVldWUuCisJdWxEYXRhU2l6ZSA9CisJICAgIHNpemVvZih0RXBsRXZlbnQpICsKKwkgICAgKChwRXZlbnRfcC0+bV9wQXJnICE9IE5VTEwpID8gcEV2ZW50X3AtPm1fdWlTaXplIDogMCk7CisjZW5kaWYKKworCS8vIGRlY2lkZSBpbiB3aGljaCBidWZmZXIgdGhlIGV2ZW50IGhhdmUgdG8gd3JpdGUKKwlzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgeworCQkvLyBrZXJuZWxzcGFjZSBtb2R1bGVzCisJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKKwljYXNlIGtFcGxFdmVudFNpbmtObXRrOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGs6CisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKKwljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgorCWNhc2Uga0VwbEV2ZW50U2lua0Vycms6CisJCXsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkJCS8vIHBvc3QgbWVzc2FnZQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKFUySykgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhVMkspIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKKwljYXNlIGtFcGxFdmVudFNpbmtObXRNbnU6CisJY2FzZSBrRXBsRXZlbnRTaW5rTm10dToKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKKwljYXNlIGtFcGxFdmVudFNpbmtMZWR1OgorCQl7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJCQkvLyBwb3N0IG1lc3NhZ2UKKwkJCVNoYkVycm9yID0KKwkJCSAgICBTaGJDaXJBbGxvY0RhdGFCbG9jayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkJICZTaGJDaXJDaHVuaywgdWxEYXRhU2l6ZSk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJBbGxvY0RhdGFCbG9jayhLMlUpIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCVNoYkVycm9yID0KKwkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkJICZTaGJDaXJDaHVuaywgcEV2ZW50X3AsCisJCQkJCQkgc2l6ZW9mKHRFcGxFdmVudCksCisJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOworCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoSzJVKSAtPiAweCVYXG4iLAorCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlpZiAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkgeworCQkJCVNoYkVycm9yID0KKwkJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkJICZTaGJDaXJDaHVuaywKKwkJCQkJCQkgcEV2ZW50X3AtPm1fcEFyZywKKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJIHBFdmVudF9wLT5tX3VpU2l6ZSwKKwkJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOworCQkJCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKQorCQkJCSAgICB8fCAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkpIHsKKwkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsyKEsyVSkgLT4gMHglWFxuIiwKKwkJCQkJICAgICBTaGJFcnJvcik7CisJCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0KKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudHVQcm9jZXNzKHBFdmVudF9wKTsKKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbEV2ZW50VW5rbm93blNpbms7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50U2luaykKKworI2lmbmRlZiBFUExfTk9fRklGTworICAgICAgRXhpdDoKKyNlbmRpZgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UG9zdEVycm9yCisvLworLy8gRGVzY3JpcHRpb246IHBvc3QgZXJyb3JldmVudCBmcm9tIHVzZXJzcGFjZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEV2ZW50U291cmNlX3AgICA9IHNvdXJjZS1tb2R1bGUgb2YgdGhlIGVycm9yZXZlbnQKKy8vICAgICAgICAgICAgICBFcGxFcnJvcl9wICAgICA9IGNvZGUgb2Ygb2NjdXJlZCBlcnJvcgorLy8gICAgICAgICAgICAgIHVpQXJnU2l6ZV9wICAgICA9IHNpemUgb2YgdGhlIGFyZ3VtZW50CisvLyAgICAgICAgICAgICAgcEFyZ19wICAgICAgICAgID0gcG9pbnRlciB0byB0aGUgYXJndW1lbnQKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiQnVmZmVyW0VQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCXRFcGxFdmVudEVycm9yICpwRXZlbnRFcnJvciA9ICh0RXBsRXZlbnRFcnJvciAqKSBhYkJ1ZmZlcjsKKwl0RXBsRXZlbnQgRXBsRXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNyZWF0ZSBhcmd1bWVudAorCXBFdmVudEVycm9yLT5tX0V2ZW50U291cmNlID0gRXZlbnRTb3VyY2VfcDsKKwlwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CisJRVBMX01FTUNQWSgmcEV2ZW50RXJyb3ItPm1fQXJnLCBwQXJnX3AsIHVpQXJnU2l6ZV9wKTsKKworCS8vIGNyZWF0ZSBldmVudAorCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUVycm9yOworCUVwbEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0FwaTsKKwlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKKwlFcGxFdmVudC5tX3VpU2l6ZSA9CisJICAgIChzaXplb2YoRXZlbnRTb3VyY2VfcCkgKyBzaXplb2YoRXBsRXJyb3JfcCkgKyB1aUFyZ1NpemVfcCk7CisJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOworCisJLy8gcG9zdCBlcnJvcmV2ZW50CisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXBsRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZXRzIGZyb20ga2VybmVsc3BhY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2hiUnhJbnN0YW5jZV9wICAgID0gSW5zdGFuY2UtcG9pbnRlciBmb3IgYnVmZmVyCisvLyAgICAgICAgICAgICAgdWxEYXRhU2l6ZV9wICAgICAgICA9IHNpemUgb2YgZGF0YQorLy8KKy8vCisvLyBSZXR1cm5zOiB2b2lkCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIEVQTF9OT19GSUZPCitzdGF0aWMgdm9pZCBFcGxFdmVudHVSeFNpZ25hbEhhbmRsZXJDYih0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7CisJdEVwbEV2ZW50ICpwRXBsRXZlbnQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworLy91bnNpZ25lZCBsb25nICAgdWxCbG9ja0NvdW50OworLy91bnNpZ25lZCBsb25nICAgdWxEYXRhU2l6ZTsKKwlCWVRFIGFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KSArIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCS8vIGQuay46IGFiRGF0YUJ1ZmZlciBjb250YWlucyB0aGUgY29tcGxldGUgdEVwbEV2ZW50IHN0cnVjdHVyZQorCS8vICAgICAgIGFuZCBiZWhpbmQgdGhpcyB0aGUgYXJndW1lbnQKKworCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIxKTsKKworLy8gZC5rLiBub3QgbmVlZGVkIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBkb25lIGluIFNoYXJlZEJ1ZmYKKy8qICAgIGRvCisgICAgeworICAgICAgICBCRU5DSE1BUktfTU9EXzI4X1NFVCgxKTsgICAgLy8gNCC1cyB1bnRpbCByZXNldAorICAgICAgICAvLyBnZXQgbWVzc2FnZXNpemUKKyAgICAgICAgU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkRGF0YVNpemUgKHBTaGJSeEluc3RhbmNlX3AsICZ1bERhdGFTaXplKTsKKyAgICAgICAgaWYoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBlcnJvciBnb3RvIGV4aXQKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIEJFTkNITUFSS19NT0RfMjhfUkVTRVQoMSk7ICAvLyAxNCC1cyB1bnRpbCBzZXQKKyovCisJLy8gY29weSBkYXRhIGZyb20gZXZlbnQgcXVldWUKKwlTaGJFcnJvciA9IFNoYkNpclJlYWREYXRhQmxvY2socFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgJmFiRGF0YUJ1ZmZlclswXSwKKwkJCQkgICAgICAgc2l6ZW9mKGFiRGF0YUJ1ZmZlciksICZ1bERhdGFTaXplX3ApOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJLy8gZXJyb3IgZ290byBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVzb2x2ZSB0aGUgcG9pbnRlciB0byB0aGUgZXZlbnQgc3RydWN0dXJlCisJcEVwbEV2ZW50ID0gKHRFcGxFdmVudCAqKSBhYkRhdGFCdWZmZXI7CisJLy8gc2V0IERhdGFzaXplCisJcEVwbEV2ZW50LT5tX3VpU2l6ZSA9ICh1bERhdGFTaXplX3AgLSBzaXplb2YodEVwbEV2ZW50KSk7CisJaWYgKHBFcGxFdmVudC0+bV91aVNpemUgPiAwKSB7CisJCS8vIHNldCBwb2ludGVyIHRvIGFyZ3VtZW50CisJCXBFcGxFdmVudC0+bV9wQXJnID0gJmFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KV07CisJfSBlbHNlIHsKKwkJLy9zZXQgcG9pbnRlciB0byBOVUxMCisJCXBFcGxFdmVudC0+bV9wQXJnID0gTlVMTDsKKwl9CisKKwlCRU5DSE1BUktfTU9EXzI4X1NFVCgxKTsKKwkvLyBjYWxsIHByb2Nlc3NmdW5jdGlvbgorCUVwbEV2ZW50dVByb2Nlc3MocEVwbEV2ZW50KTsKKworCUJFTkNITUFSS19NT0RfMjhfUkVTRVQoMSk7CisJLy8gcmVhZCBudW1iZXIgb2YgbGVmdCBtZXNzYWdlcyB0byBwcm9jZXNzCisvLyBkLmsuIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gU2hhcmVkQnVmZgorLyogICAgICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKHBTaGJSeEluc3RhbmNlX3AsICZ1bEJsb2NrQ291bnQpOworICAgICAgICBpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBlcnJvciBnb3RvIGV4aXQKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHVsQmxvY2tDb3VudCA+IDApOworKi8KKyAgICAgIEV4aXQ6CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxGcmFtZS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxGcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2Y4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEZyYW1lLmgKQEAgLTAsMCArMSwzNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBmcmFtZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxGcmFtZS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA2LzIzIDE0OjU2OjMzICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRlJBTUVfSF8KKyNkZWZpbmUgX0VQTF9GUkFNRV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZGVmaW5lcyBmb3IgRXBsRnJhbWUubV93RmxhZworI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfUkQgICAgICAgICAgMHgwMQkvLyByZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQUmVxLCBQUmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfRVIgICAgICAgICAgMHgwMgkvLyBleGNlcHRpb24gcmVzZXQgKGVycm9yIHNpZ25hbGxpbmcpICAgICAgIChTb0EpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9FQSAgICAgICAgICAweDA0CS8vIGV4Y2VwdGlvbiBhY2tub3dsZWRnZSAoZXJyb3Igc2lnbmFsbGluZykgKFBSZXEsIFNvQSkKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX0VDICAgICAgICAgIDB4MDgJLy8gZXhjZXB0aW9uIGNsZWFyIChlcnJvciBzaWduYWxsaW5nKSAgICAgICAoU3RhdHVzUmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfRU4gICAgICAgICAgMHgxMAkvLyBleGNlcHRpb24gbmV3IChlcnJvciBzaWduYWxsaW5nKSAgICAgICAgIChQUmVzLCBTdGF0dXNSZXMpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9NUyAgICAgICAgICAweDIwCS8vIG11bHRpcGxleGVkIHNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgKFBSZXEpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9QUyAgICAgICAgICAweDQwCS8vIHByZXNjYWxlZCBzbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNvQykKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX01DICAgICAgICAgIDB4ODAJLy8gbXVsdGlwbGV4ZWQgY3ljbGUgY29tcGxldGVkICAgICAgICAgICAgICAoU29DKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUlMgICAgICAgICAgMHgwNwkvLyBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyB0byBzZW5kICAgICAgIChQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUFIgICAgICAgICAgMHgzOAkvLyBwcmlvcml0eSBvZiByZXF1ZXN0ZWQgYXN5bmNoLiBmcmFtZSAgICAgIChQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUFJfU0hJRlQgICAgMwkvLyBzaGlmdCBvZiBwcmlvcml0eSBvZiByZXF1ZXN0ZWQgYXN5bmNoLiBmcmFtZQorCisvLyBlcnJvciBoaXN0b3J5L3N0YXR1cyBlbnRyeSB0eXBlcworI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9TVEFUVVMgICAgICAgIDB4ODAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9ISVNUT1JZICAgICAgIDB4MDAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9FTUNZICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX0FDVElWRSAgIDB4MTAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX0NMRUFSRUQgIDB4MjAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX09DQ1VSUkVEIDB4MzAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX01BU0sgICAgIDB4MzAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX1ZFTkRPUiAgIDB4MDAwMQorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX0VQTCAgICAgIDB4MDAwMgorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX01BU0sgICAgIDB4MEZGRgorCisvLyBkZWZpbmVzIGZvciBFUEwgdmVyc2lvbiAvIFBETyB2ZXJzaW9uCisjZGVmaW5lIEVQTF9WRVJTSU9OX1NVQiAgICAgICAgICAgICAweDBGCS8vIHN1YiB2ZXJzaW9uCisjZGVmaW5lIEVQTF9WRVJTSU9OX01BSU4gICAgICAgICAgICAweEYwCS8vIG1haW4gdmVyc2lvbgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gJCQkIGQuay46IG1vdmUgdGhpcyBkZWZpbml0aW9uIHRvIGdsb2JhbC5oCisvLyBieXRlLWFsaWduIHN0cnVjdHVyZXMKKyNpZmRlZiBfTVNDX1ZFUgorIyAgICBwcmFnbWEgcGFjayggcHVzaCwgcGFja2luZyApCisjICAgIHByYWdtYSBwYWNrKCAxICkKKyMgICAgZGVmaW5lIFBBQ0tfU1RSVUNUCisjZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCisjICAgIGRlZmluZSBQQUNLX1NUUlVDVCAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2Vsc2UKKyMgICAgZXJyb3IgeW91IG11c3QgYnl0ZS1hbGlnbiB0aGVzZSBzdHJ1Y3R1cmVzIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbXBpbGVyIGRpcmVjdGl2ZXMKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE3CisJQllURSBtX2xlX2JSZXMxOwkvLyByZXNlcnZlZAorCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iRmxhZzE7CS8vIEZsYWdzOiBNQywgUFMKKwkvLyBPZmZzZXQgMTkKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogcmVzCisJLy8gT2Zmc2V0IDIwCisJdEVwbE5ldFRpbWUgbV9sZV9OZXRUaW1lOwkvLyBzdXBwb3J0ZWQgaWYgRF9OTVRfTmV0VGltZUlzUmVhbFRpbWVfQk9PTCBpcyBzZXQKKwkvLyBPZmZzZXQgMjgKKwlRV09SRCBtX2xlX1JlbGF0aXZlVGltZTsJLy8gaW4gdXMgKHN1cHBvcnRlZCBpZiBEX05NVF9SZWxhdGl2ZVRpbWVfQk9PTCBpcyBzZXQpCisKK30gUEFDS19TVFJVQ1QgdEVwbFNvY0ZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE3CisJQllURSBtX2xlX2JSZXMxOwkvLyByZXNlcnZlZAorCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iRmxhZzE7CS8vIEZsYWdzOiBNUywgRUEsIFJECisJLy8gT2Zmc2V0IDE5CisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IHJlcworCS8vIE9mZnNldCAyMAorCUJZVEUgbV9sZV9iUGRvVmVyc2lvbjsKKwkvLyBPZmZzZXQgMjEKKwlCWVRFIG1fbGVfYlJlczI7CS8vIHJlc2VydmVkCisJLy8gT2Zmc2V0IDIyCisJV09SRCBtX2xlX3dTaXplOworCS8vIE9mZnNldCAyNAorCUJZVEUgbV9sZV9hYlBheWxvYWRbMjU2IC8qRF9OTVRfSXNvY2hyUnhNYXhQYXlsb2FkX1UxNiAqLyBdOworCit9IFBBQ0tfU1RSVUNUIHRFcGxQcmVxRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTcKKwlCWVRFIG1fbGVfYk5tdFN0YXR1czsJLy8gTk1UIHN0YXRlCisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JGbGFnMTsJLy8gRmxhZ3M6IE1TLCBFTiwgUkQKKwkvLyBPZmZzZXQgMTkKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogUFIsIFJTCisJLy8gT2Zmc2V0IDIwCisJQllURSBtX2xlX2JQZG9WZXJzaW9uOworCS8vIE9mZnNldCAyMQorCUJZVEUgbV9sZV9iUmVzMjsJLy8gcmVzZXJ2ZWQKKwkvLyBPZmZzZXQgMjIKKwlXT1JEIG1fbGVfd1NpemU7CisJLy8gT2Zmc2V0IDI0CisJQllURSBtX2xlX2FiUGF5bG9hZFsyNTYJLypEX05NVF9Jc29jaHJSeE1heFBheWxvYWRfVTE2CisJCQkJICAgLyBEX05NVF9Jc29jaHJUeE1heFBheWxvYWRfVTE2ICovIF07CisKK30gUEFDS19TVFJVQ1QgdEVwbFByZXNGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxNworCUJZVEUgbV9sZV9iTm10U3RhdHVzOwkvLyBOTVQgc3RhdGUKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYkZsYWcxOwkvLyBGbGFnczogRUEsIEVSCisJLy8gT2Zmc2V0IDE5CisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IHJlcworCS8vIE9mZnNldCAyMAorCUJZVEUgbV9sZV9iUmVxU2VydmljZUlkOworCS8vIE9mZnNldCAyMQorCUJZVEUgbV9sZV9iUmVxU2VydmljZVRhcmdldDsKKwkvLyBPZmZzZXQgMjIKKwlCWVRFIG1fbGVfYkVwbFZlcnNpb247CisKK30gUEFDS19TVFJVQ1QgdEVwbFNvYUZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisJV09SRCBtX3dFbnRyeVR5cGU7CisJV09SRCBtX3dFcnJvckNvZGU7CisJdEVwbE5ldFRpbWUgbV9UaW1lU3RhbXA7CisJQllURSBtX2FiQWRkSW5mb1s4XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsRXJySGlzdG9yeUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JGbGFnMTsJLy8gRmxhZ3M6IEVOLCBFQworCUJZVEUgbV9sZV9iRmxhZzI7CS8vIEZsYWdzOiBQUiwgUlMKKwlCWVRFIG1fbGVfYk5tdFN0YXR1czsJLy8gTk1UIHN0YXRlCisJQllURSBtX2xlX2JSZXMxWzNdOworCVFXT1JEIG1fbGVfcXdTdGF0aWNFcnJvcjsJLy8gc3RhdGljIGVycm9yIGJpdCBmaWVsZAorCXRFcGxFcnJIaXN0b3J5RW50cnkgbV9sZV9hRXJySGlzdG9yeUVudHJ5WzE0XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsU3RhdHVzUmVzcG9uc2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYkZsYWcxOwkvLyBGbGFnczogcmVzCisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IFBSLCBSUworCUJZVEUgbV9sZV9iTm10U3RhdHVzOwkvLyBOTVQgc3RhdGUKKwlCWVRFIG1fbGVfYklkZW50UmVzcEZsYWdzOwkvLyBGbGFnczogRlcKKwlCWVRFIG1fbGVfYkVwbFByb2ZpbGVWZXJzaW9uOworCUJZVEUgbV9sZV9iUmVzMTsKKwlEV09SRCBtX2xlX2R3RmVhdHVyZUZsYWdzOwkvLyBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCVdPUkQgbV9sZV93TXR1OwkJLy8gTk1UX0N5Y2xlVGltaW5nX1JFQy5Bc3luY01UVV9VMTY6IENfSVBfTUlOX01UVSAtIENfSVBfTUFYX01UVQorCVdPUkQgbV9sZV93UG9sbEluU2l6ZTsJLy8gTk1UX0N5Y2xlVGltaW5nX1JFQy5QUmVxQWN0UGF5bG9hZF9VMTYKKwlXT1JEIG1fbGVfd1BvbGxPdXRTaXplOwkvLyBOTVRfQ3ljbGVUaW1pbmdfUkVDLlBSZXNBY3RQYXlsb2FkX1UxNgorCURXT1JEIG1fbGVfZHdSZXNwb25zZVRpbWU7CS8vIE5NVF9DeWNsZVRpbWluZ19SRUMuUFJlc01heExhdGVuY3lfVTMyCisJV09SRCBtX2xlX3dSZXMyOworCURXT1JEIG1fbGVfZHdEZXZpY2VUeXBlOwkvLyBOTVRfRGV2aWNlVHlwZV9VMzIKKwlEV09SRCBtX2xlX2R3VmVuZG9ySWQ7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuVmVuZG9ySWRfVTMyCisJRFdPUkQgbV9sZV9kd1Byb2R1Y3RDb2RlOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlByb2R1Y3RDb2RlX1UzMgorCURXT1JEIG1fbGVfZHdSZXZpc2lvbk51bWJlcjsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5SZXZpc2lvbk5vX1UzMgorCURXT1JEIG1fbGVfZHdTZXJpYWxOdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuU2VyaWFsTm9fVTMyCisJUVdPUkQgbV9sZV9xd1ZlbmRvclNwZWNpZmljRXh0MTsKKwlEV09SRCBtX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mRGF0ZV9VMzIKKwlEV09SRCBtX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mVGltZV9VMzIKKwlEV09SRCBtX2xlX2R3QXBwbGljYXRpb25Td0RhdGU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd0RhdGVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgZGF0ZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fbGVfZHdBcHBsaWNhdGlvblN3VGltZTsJLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3VGltZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciB0aW1lIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJRFdPUkQgbV9sZV9kd0lwQWRkcmVzczsKKwlEV09SRCBtX2xlX2R3U3VibmV0TWFzazsKKwlEV09SRCBtX2xlX2R3RGVmYXVsdEdhdGV3YXk7CisJQllURSBtX2xlX3NIb3N0bmFtZVszMl07CisJQllURSBtX2xlX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzQ4XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsSWRlbnRSZXNwb25zZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iTm10Q29tbWFuZElkOworCUJZVEUgbV9sZV9iUmVzMTsKKwlCWVRFIG1fbGVfYWJObXRDb21tYW5kRGF0YVszMl07CisKK30gUEFDS19TVFJVQ1QgdEVwbE5tdENvbW1hbmRTZXJ2aWNlOworCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2xlX2JSZXNlcnZlZDsKKwlCWVRFIG1fbGVfYlRyYW5zYWN0aW9uSWQ7CisJQllURSBtX2xlX2JGbGFnczsKKwlCWVRFIG1fbGVfYkNvbW1hbmRJZDsKKwlXT1JEIG1fbGVfd1NlZ21lbnRTaXplOworCVdPUkQgbV9sZV93UmVzZXJ2ZWQ7CisJQllURSBtX2xlX2FiQ29tbWFuZERhdGFbOF07CS8vIGp1c3QgcmVzZXJ2ZSBhIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIGFzIGEgcGxhY2Vob2xkZXIKKworfSBQQUNLX1NUUlVDVCB0RXBsQXN5U2RvQ29tOworCisvLyBhc3luY2hyb25vdXMgU0RPIFNlcXVlbmNlIEhlYWRlcgordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9sZV9iUmVjU2VxTnVtQ29uOworCUJZVEUgbV9sZV9iU2VuZFNlcU51bUNvbjsKKwlCWVRFIG1fbGVfYWJSZXNlcnZlZFsyXTsKKwl0RXBsQXN5U2RvQ29tIG1fbGVfYWJTZG9TZXFQYXlsb2FkOworCit9IFBBQ0tfU1RSVUNUIHRFcGxBc3lTZG9TZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYk5tdENvbW1hbmRJZDsKKwlCWVRFIG1fbGVfYlRhcmdldE5vZGVJZDsKKwlCWVRFIG1fbGVfYWJObXRDb21tYW5kRGF0YVszMl07CisKK30gUEFDS19TVFJVQ1QgdEVwbE5tdFJlcXVlc3RTZXJ2aWNlOworCit0eXBlZGVmIHVuaW9uIHsKKwkvLyBPZmZzZXQgMTgKKwl0RXBsU3RhdHVzUmVzcG9uc2UgbV9TdGF0dXNSZXNwb25zZTsKKwl0RXBsSWRlbnRSZXNwb25zZSBtX0lkZW50UmVzcG9uc2U7CisJdEVwbE5tdENvbW1hbmRTZXJ2aWNlIG1fTm10Q29tbWFuZFNlcnZpY2U7CisJdEVwbE5tdFJlcXVlc3RTZXJ2aWNlIG1fTm10UmVxdWVzdFNlcnZpY2U7CisJdEVwbEFzeVNkb1NlcSBtX1Nkb1NlcXVlbmNlRnJhbWU7CisJQllURSBtX2xlX2FiUGF5bG9hZFsyNTYJLypEX05NVF9BU25kVHhNYXhQYXlsb2FkX1UxNgorCQkJCSAgIC8gRF9OTVRfQVNuZFJ4TWF4UGF5bG9hZF9VMTYgKi8gXTsKKworfSB0RXBsQXNuZFBheWxvYWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTcKKwlCWVRFIG1fbGVfYlNlcnZpY2VJZDsKKwkvLyBPZmZzZXQgMTgKKwl0RXBsQXNuZFBheWxvYWQgbV9QYXlsb2FkOworCit9IFBBQ0tfU1RSVUNUIHRFcGxBc25kRnJhbWU7CisKK3R5cGVkZWYgdW5pb24geworCS8vIE9mZnNldCAxNworCXRFcGxTb2NGcmFtZSBtX1NvYzsKKwl0RXBsUHJlcUZyYW1lIG1fUHJlcTsKKwl0RXBsUHJlc0ZyYW1lIG1fUHJlczsKKwl0RXBsU29hRnJhbWUgbV9Tb2E7CisJdEVwbEFzbmRGcmFtZSBtX0FzbmQ7CisKK30gdEVwbEZyYW1lRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAwCisJQllURSBtX2JlX2FiRHN0TWFjWzZdOwkvLyBNQUMgYWRkcmVzcyBvZiB0aGUgYWRkcmVzc2VkIG5vZGVzCisJLy8gT2Zmc2V0IDYKKwlCWVRFIG1fYmVfYWJTcmNNYWNbNl07CS8vIE1BQyBhZGRyZXNzIG9mIHRoZSB0cmFuc21pdHRpbmcgbm9kZQorCS8vIE9mZnNldCAxMgorCVdPUkQgbV9iZV93RXRoZXJUeXBlOwkvLyBFdGhlcm5ldCBtZXNzYWdlIHR5cGUgKGJpZyBlbmRpYW4pCisJLy8gT2Zmc2V0IDE0CisJQllURSBtX2xlX2JNZXNzYWdlVHlwZTsJLy8gRVBMIG1lc3NhZ2UgdHlwZQorCS8vIE9mZnNldCAxNQorCUJZVEUgbV9sZV9iRHN0Tm9kZUlkOwkvLyBFUEwgbm9kZSBJRCBvZiB0aGUgYWRkcmVzc2VkIG5vZGVzCisJLy8gT2Zmc2V0IDE2CisJQllURSBtX2xlX2JTcmNOb2RlSWQ7CS8vIEVQTCBub2RlIElEIG9mIHRoZSB0cmFuc21pdHRpbmcgbm9kZQorCS8vIE9mZnNldCAxNworCXRFcGxGcmFtZURhdGEgbV9EYXRhOworCit9IFBBQ0tfU1RSVUNUIHRFcGxGcmFtZTsKKworLy8gdW4tYnl0ZS1hbGlnbiBzdHJ1Y3R1cmVzCisjaWZkZWYgX01TQ19WRVIKKyMgICAgcHJhZ21hIHBhY2soIHBvcCwgcGFja2luZyApCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsTXNnVHlwZU5vbkVwbCA9IDB4MDAsCisJa0VwbE1zZ1R5cGVTb2MgPSAweDAxLAorCWtFcGxNc2dUeXBlUHJlcSA9IDB4MDMsCisJa0VwbE1zZ1R5cGVQcmVzID0gMHgwNCwKKwlrRXBsTXNnVHlwZVNvYSA9IDB4MDUsCisJa0VwbE1zZ1R5cGVBc25kID0gMHgwNiwKKworfSB0RXBsTXNnVHlwZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRlJBTUVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSWRlbnR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbElkZW50dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTllZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbElkZW50dS5jCkBAIC0wLDAgKzEsNDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIElkZW50dS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxJZGVudHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzExLzE1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbElkZW50dS5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8eHh4eHg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsSWRlbnRSZXNwb25zZSAqbV9hcElkZW50UmVzcG9uc2VbMjU0XTsJLy8gdGhlIElkZW50UmVzcG9uc2UgYXJlIG1hbmFnZWQgZHluYW1pY2FsbHkKKwl0RXBsSWRlbnR1Q2JSZXNwb25zZSBtX2FwZm5DYlJlc3BvbnNlWzI1NF07CisKK30gdEVwbElkZW50dUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxJZGVudHVJbnN0YW5jZSBFcGxJZGVudHVJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUNiSWRlbnRSZXNwb25zZSh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsSWRlbnR1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxJZGVudHVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsSWRlbnR1SW5zdGFuY2VfZykpOworCisJLy8gcmVnaXN0ZXIgSWRlbnRSZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UsCisJCQkJICAgICBFcGxJZGVudHVDYklkZW50UmVzcG9uc2UsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlckFueSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlcmVnaXN0ZXIgSWRlbnRSZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UsIE5VTEwsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworCisJUmV0ID0gRXBsSWRlbnR1UmVzZXQoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1UmVzZXQKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVzZXRzIHRoaXMgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1UmVzZXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCWludCBpSW5kZXg7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWZvciAoaUluZGV4ID0gMDsKKwkgICAgIGlJbmRleCA8IHRhYmVudHJpZXMoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZSk7CisJICAgICBpSW5kZXgrKykgeworCQlpZiAoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZVtpSW5kZXhdICE9IE5VTEwpIHsJLy8gZnJlZSBtZW1vcnkKKwkJCUVQTF9GUkVFKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2VbaUluZGV4XSk7CisJCX0KKwl9CisKKwlFUExfTUVNU0VUKCZFcGxJZGVudHVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsSWRlbnR1SW5zdGFuY2VfZykpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVHZXRJZGVudFJlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIElkZW50UmVzcG9uc2UgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwcElkZW50UmVzcG9uc2VfcCAgICAgICAgICAgPSBPVVQ6IHBvaW50ZXIgdG8gcG9pbnRlciBvZiBJZGVudFJlc3BvbnNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzIE5VTEwsIGlmIG5vIElkZW50UmVzcG9uc2UgYXZhaWxhYmxlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUdldElkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICB0RXBsSWRlbnRSZXNwb25zZSAqKgorCQkJCQkgICAgcHBJZGVudFJlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlY3JlbWVudCBub2RlIElELCBiZWNhdXNlIGFycmF5IGlzIHplcm8gYmFzZWQKKwl1aU5vZGVJZF9wLS07CisJaWYgKHVpTm9kZUlkX3AgPCB0YWJlbnRyaWVzKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2UpKSB7CisJCSpwcElkZW50UmVzcG9uc2VfcCA9CisJCSAgICBFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlW3VpTm9kZUlkX3BdOworCX0gZWxzZSB7CQkvLyBpbnZhbGlkIG5vZGUgSUQgc3BlY2lmaWVkCisJCSpwcElkZW50UmVzcG9uc2VfcCA9IE5VTEw7CisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1UmVxdWVzdElkZW50UmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgSWRlbnRSZXNwb25zZSBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICAgICAgPSBJTjogbm9kZSBJRAorLy8gICAgICAgICAgICAgIHBmbkNiUmVzcG9uc2VfcCAgICAgICAgICAgICA9IElOOiBmdW5jdGlvbiBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBjYWxsZWQgaWYgSWRlbnRSZXNwb25zZSBpcyByZWNlaXZlZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCXRFcGxJZGVudHVDYlJlc3BvbnNlCisJCQkJCQlwZm5DYlJlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlY3JlbWVudCBub2RlIElELCBiZWNhdXNlIGFycmF5IGlzIHplcm8gYmFzZWQKKwl1aU5vZGVJZF9wLS07CisJaWYgKHVpTm9kZUlkX3AgPCB0YWJlbnRyaWVzKEVwbElkZW50dUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZSkpIHsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJaWYgKEVwbElkZW50dUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aU5vZGVJZF9wXSAhPSBOVUxMKSB7CS8vIHJlcXVlc3QgYWxyZWFkeSBpc3N1ZWQgKG1heWJlIGJ5IHNvbWVvbmUgZWxzZSkKKwkJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQl9IGVsc2UgeworCQkJRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpTm9kZUlkX3BdID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlX3A7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbHVDYWxJc3N1ZVJlcXVlc3Qoa0VwbERsbFJlcVNlcnZpY2VJZGVudCwKKwkJCQkJCSAgICh1aU5vZGVJZF9wICsgMSksIDB4RkYpOworCQl9CisjZWxzZQorCQlSZXQgPSBrRXBsSW52YWxpZE9wZXJhdGlvbjsKKyNlbmRpZgorCX0gZWxzZSB7CQkvLyBpbnZhbGlkIG5vZGUgSUQgc3BlY2lmaWVkCisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1R2V0UnVubmluZ1JlcXVlc3RzCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgYSBiaXQgZmllbGQgd2l0aCB0aGUgcnVubmluZyByZXF1ZXN0cyBmb3Igbm9kZS1JRCAxLTMyCisvLyAgICAgICAgICAgICAganVzdCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgRFdPUkQgUFVCTElDIEVwbElkZW50dUdldFJ1bm5pbmdSZXF1ZXN0cyh2b2lkKQoreworCURXT1JEIGR3UmVxcyA9IDA7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgMzI7IHVpSW5kZXgrKykgeworCQlpZiAoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpSW5kZXhdICE9IE5VTEwpIHsKKwkJCWR3UmVxcyB8PSAoMSA8PCB1aUluZGV4KTsKKwkJfQorCX0KKworCXJldHVybiBkd1JlcXM7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVDYklkZW50UmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIElkZW50UmVzcG9uc2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IEZyYW1lIHdpdGggdGhlIElkZW50UmVzcG9uc2UKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1Q2JJZGVudFJlc3BvbnNlKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbElkZW50dUNiUmVzcG9uc2UgcGZuQ2JSZXNwb25zZTsKKworCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKworCXVpSW5kZXggPSB1aU5vZGVJZCAtIDE7CisKKwlpZiAodWlJbmRleCA8IHRhYmVudHJpZXMoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlKSkgeworCQkvLyBtZW1vcml6ZSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisJCXBmbkNiUmVzcG9uc2UgPSBFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF07CisJCS8vIHJlc2V0IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgc28gdGhhdCBjYWxsZXIgbWF5IGlzc3VlIG5leHQgcmVxdWVzdCBpbW1lZGlhdGVseQorCQlFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF0gPSBOVUxMOworCisJCWlmIChwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUgPCBFUExfQ19ETExfTUlOU0laRV9JREVOVFJFUykgewkvLyBJZGVudFJlc3BvbnNlIG5vdCByZWNlaXZlZCBvciBpdCBoYXMgaW52YWxpZCBzaXplCisJCQlpZiAocGZuQ2JSZXNwb25zZSA9PSBOVUxMKSB7CS8vIHJlc3BvbnNlIHdhcyBub3QgcmVxdWVzdGVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJUmV0ID0gcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwgTlVMTCk7CisJCX0gZWxzZSB7CS8vIElkZW50UmVzcG9uc2UgcmVjZWl2ZWQKKwkJCWlmIChFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlW3VpSW5kZXhdID09IE5VTEwpIHsJLy8gbWVtb3J5IGZvciBJZGVudFJlc3BvbnNlIG11c3QgYmUgYWxsb2NhdGVkCisJCQkJRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZVt1aUluZGV4XSA9CisJCQkJICAgIEVQTF9NQUxMT0Moc2l6ZW9mKHRFcGxJZGVudFJlc3BvbnNlKSk7CisJCQkJaWYgKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2VbdWlJbmRleF0gPT0gTlVMTCkgewkvLyBtYWxsb2MgZmFpbGVkCisJCQkJCWlmIChwZm5DYlJlc3BvbnNlID09IE5VTEwpIHsJLy8gcmVzcG9uc2Ugd2FzIG5vdCByZXF1ZXN0ZWQKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlSZXQgPQorCQkJCQkgICAgcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwKKwkJCQkJCQkgICZwRnJhbWVJbmZvX3AtPgorCQkJCQkJCSAgbV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgIG1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQkJICBtX0lkZW50UmVzcG9uc2UpOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJLy8gY29weSBJZGVudFJlc3BvbnNlIHRvIGluc3RhbmNlIHN0cnVjdHVyZQorCQkJRVBMX01FTUNQWShFcGxJZGVudHVJbnN0YW5jZV9nLgorCQkJCSAgIG1fYXBJZGVudFJlc3BvbnNlW3VpSW5kZXhdLAorCQkJCSAgICZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCSAgIG1fUGF5bG9hZC5tX0lkZW50UmVzcG9uc2UsCisJCQkJICAgc2l6ZW9mKHRFcGxJZGVudFJlc3BvbnNlKSk7CisJCQlpZiAocGZuQ2JSZXNwb25zZSA9PSBOVUxMKSB7CS8vIHJlc3BvbnNlIHdhcyBub3QgcmVxdWVzdGVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJUmV0ID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlKHVpTm9kZUlkLAorCQkJCQkgIEVwbElkZW50dUluc3RhbmNlX2cuCisJCQkJCSAgbV9hcElkZW50UmVzcG9uc2VbdWlJbmRleF0pOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmOTNkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSW5jLmgKQEAgLTAsMCArMSwzODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBiYXNpYyBpbmNsdWRlIGZpbGUgZm9yIGludGVybmFsIEVQTCBzdGFjayBtb2R1bGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsSW5jLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9JTkNfSF8KKyNkZWZpbmUgX0VQTF9JTkNfSF8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gaW5jbHVkZSBmaWxlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCisjaWZkZWYgVU5ERVJfUlRTUworCS8vIFJUWCBoZWFkZXIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2luY2x1ZGUgPHJ0YXBpLmg+CisKKyNlbGlmIF9fQk9STEFORENfXworCS8vIGJvcmxhbmQgQyBoZWFkZXIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorCisjZWxpZiBXSU5DRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2Vsc2UKKwkvLyBNU1ZDIG5lZWRzIHRvIGluY2x1ZGUgd2luZG93cy5oIGF0IGZpcnN0CisJLy8gdGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyIG5lY2Vzc2FyeSBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igd2FpdGFibGUgdGltZXJzCisjZGVmaW5lIF9XSU4zMl9XSU5ET1dTIDB4MDQwMQorI2RlZmluZSBfV0lOMzJfV0lOTlQgICAweDA0MDAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmCisKKyNlbmRpZgorCisvLyBkZWZpbmVzIGZvciBtb2R1bGUgaW50ZWdyYXRpb24KKy8vIHBvc3NpYmxlIG90aGVyIGluY2x1ZGUgZmlsZSBuZWVkZWQKKy8vIFRoZXNlIGNvbnN0YW50cyBkZWZpbmVzIG1vZHVsZXMgd2hpY2ggY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBFcGwgYXBwbGljYXRpb24uCisvLyBVc2UgdGhpcyBjb25zdGFudHMgZm9yIGRlZmluZSBFUExfTU9EVUxFX0lOVEVHUkFUSU9OIGluIGZpbGUgRXBsQ2ZnLmguCisjZGVmaW5lIEVQTF9NT0RVTEVfT0JESyAgICAgICAgMHgwMDAwMDAwMUwJLy8gT0JEIGtlcm5lbCBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1BET0sgICAgICAgIDB4MDAwMDAwMDJMCS8vIFBETyBrZXJuZWwgcGFydCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9OTVRfTU4gICAgICAweDAwMDAwMDA0TAkvLyBOTVQgTU4gbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfU0RPUyAgICAgICAgMHgwMDAwMDAwOEwJLy8gU0RPIFNlcnZlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9TRE9DICAgICAgICAweDAwMDAwMDEwTAkvLyBTRE8gQ2xpZW50IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1NET19BU05EICAgIDB4MDAwMDAwMjBMCS8vIFNETyBvdmVyIEFzbmQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfU0RPX1VEUCAgICAgMHgwMDAwMDA0MEwJLy8gU0RPIG92ZXIgVURQIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1NET19QRE8gICAgIDB4MDAwMDAwODBMCS8vIFNETyBpbiBQRE8gbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfTk1UX0NOICAgICAgMHgwMDAwMDEwMEwJLy8gTk1UIENOIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX05NVFUgICAgICAgIDB4MDAwMDAyMDBMCS8vIE5NVCB1c2VyIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfTk1USyAgICAgICAgMHgwMDAwMDQwMEwJLy8gTk1UIGtlcm5lbCBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX0RMTEsgICAgICAgIDB4MDAwMDA4MDBMCS8vIERMTCBrZXJuZWwgcGFydCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9ETExVICAgICAgICAweDAwMDAxMDAwTAkvLyBETEwgdXNlciBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX09CRFUgICAgICAgIDB4MDAwMDIwMDBMCS8vIE9CRCB1c2VyIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfQ0ZHTUEgICAgICAgMHgwMDAwNDAwMEwJLy8gQ29uZmlndWFydGlvYW4gTWFuYWdlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9WRVRIICAgICAgICAweDAwMDA4MDAwTAkvLyB2aXJ0dWFsIGV0aGVybmV0IGRyaXZlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9QRE9VICAgICAgICAweDAwMDEwMDAwTAkvLyBQRE8gdXNlciBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX0xFRFUgICAgICAgIDB4MDAwMjAwMDBMCS8vIExFRCB1c2VyIHBhcnQgbW9kdWxlCisKKyNpbmNsdWRlICJFcGxDZmcuaCIJCS8vIEVQTCBjb25maWd1cmF0aW9uIGZpbGUgKGNvbmZpZ3VyYXRpb24gZnJvbSBhcHBsaWNhdGlvbikKKworI2luY2x1ZGUgImdsb2JhbC5oIgkJLy8gZ2xvYmFsIGRlZmluaXRpb25zCisKKyNpbmNsdWRlICJFcGxEZWYuaCIJCS8vIEVQTCBjb25maWd1cmF0aW9uIGZpbGUgKGRlZmF1bHQgY29uZmlndXJhdGlvbikKKyNpbmNsdWRlICJFcGxJbnN0RGVmLmgiCQkvLyBkZWZpbmVzIG1hY3JvcyBmb3IgaW5zdGFuY2UgdHlwZXMgYW5kIHRhYmxlCisjaW5jbHVkZSAiRGVidWcuaCIJCS8vIGRlYnVnIGRlZmluaXRpb25zCisKKyNpbmNsdWRlICJFcGxFcnJEZWYuaCIJCS8vIEVQTCBlcnJvciBjb2RlcyBmb3IgQVBJIGZ1bnRpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJRUVFIDE1ODggY29uZm9ybWFudCBuZXQgdGltZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRCBtX2R3U2VjOworCURXT1JEIG1fZHdOYW5vU2VjOworCit9IHRFcGxOZXRUaW1lOworCisjaW5jbHVkZSAiRXBsVGFyZ2V0LmgiCQkvLyB0YXJnZXQgc3BlY2lmaWMgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucworCisjaW5jbHVkZSAiRXBsQW1pLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1hY3JvcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9TUEVDX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgIDB4MjAJLy8gRVRIRVJORVQgUG93ZXJsaW5rIFYuIDIuMAorI2RlZmluZSBFUExfU1RBQ0tfVkVSU0lPTih2ZXIscmV2LHJlbCkgICAgICAoKCgoRFdPUkQpKHZlcikpICYgMHhGRil8KCgoKERXT1JEKShyZXYpKSYweEZGKTw8OCl8KCgoRFdPUkQpKHJlbCkpPDwxNikpCisjZGVmaW5lIEVQTF9PQkoxMDE4X1ZFUlNJT04odmVyLHJldixyZWwpICAgICgoKChEV09SRCkodmVyKSk8PDE2KSB8KCgoRFdPUkQpKHJldikpJjB4RkZGRikpCisjZGVmaW5lIEVQTF9TVFJJTkdfVkVSU0lPTih2ZXIscmV2LHJlbCkgICAgICJWIiAjdmVyICIuIiAjcmV2ICIgciIgI3JlbAorCisjaW5jbHVkZSAiRXBsVmVyc2lvbi5oIgorCisvLyBkZWZpbmVzIGZvciBFUEwgRmVhdHVyZUZsYWdzCisjZGVmaW5lIEVQTF9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19VRFAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19BU05EICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19QRE8gICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9JTkZPICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9FWFQgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1BET19EWU4gICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9VRFAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEVQTF9GRUFUVVJFX0NGR01BICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX0RMTF9NVUxUSVBMRVggICAweDAwMDAwMjAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05PREVJRF9TVyAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9CQVNJQ0VUSCAgICAweDAwMDAwODAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1JUMSAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1JUMiAgICAgICAgICAgICAweDAwMDAyMDAwCisKKy8vIGdlbmVyYXRlIEVQTCBOTVRfRmVhdHVyZUZsYWdzX1UzMgorI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfSVNPQ0hSCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAoRVBMX0ZFQVRVUkVfSVNPQ0hSKQorI2Vsc2UKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9TRE9fQVNORAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX0FTTkQgICAgICAgIChFUExfRkVBVFVSRV9TRE9fQVNORCkKKyNlbHNlCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fQVNORCAgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfU0RPX1VEUAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fVURQICAgICAgICAgKEVQTF9GRUFUVVJFX1NET19VRFApCisjZWxzZQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX1VEUCAgICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RFRl9GRUFUVVJFX1NET19QRE8KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19QRE8pKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX1BETyAgICAgICAgIChFUExfRkVBVFVSRV9TRE9fUERPKQorI2Vsc2UKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1NET19QRE8gICAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1BET19EWU4gICAgICAgICAoRVBMX0ZFQVRVUkVfUERPX0RZTikKKyNlbHNlCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOICAgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfQ0ZHTUEKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0NGR01BKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0NGR01BICAgICAgICAgICAoRVBMX0ZFQVRVUkVfQ0ZHTUEpCisjZWxzZQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfQ0ZHTUEgICAgICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0ZMQUdTICAgICAgICAgICAgICAgICAgIChFUExfREVGX0ZFQVRVUkVfSVNPQ0hSIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX1NET19BU05EIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX1NET19VRFAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfREVGX0ZFQVRVUkVfU0RPX1BETyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX0NGR01BKQorCisjaWZuZGVmIHRhYmVudHJpZXMKKyNkZWZpbmUgdGFiZW50cmllcyhhKSAgIChzaXplb2YoYSkvc2l6ZW9mKCooYSkpKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZpbml0aW9ucyBmb3IgRExMIGV4cG9ydAorI2lmICgoREVWX1NZU1RFTSA9PSBfREVWX1dJTjMyXykgfHwgKERFVl9TWVNURU0gPT0gX0RFVl9XSU5fQ0VfKSkgJiYgZGVmaW5lZCAoQ09QX0xJQikKKworI2RlZmluZSBFUExETExFWFBPUlQgICAgX19kZWNsc3BlYyAoZGxsZXhwb3J0KQorCisjZWxzZQorCisjZGVmaW5lIEVQTERMTEVYUE9SVAorCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbW9uIGRlYnVnIG1hY3JvcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZm9yIHVzaW5nIG1hY3JvIERFQlVHX1RSQUNFeCgpCisvLworLy8gRXhhbXBsZToKKy8vICAgICAgREVCVUdfVFJBQ0UxIChFUExfREJHTFZMX09CRCwgIlZhbHVlIGlzICVkXG4iICwgd09iamVjdEluZGV4KTsKKy8vCisvLyBUaGlzIG1lc3NhZ2Ugb25seSB3aWxsIGJlIHByaW50ZWQgaWY6CisvLyAgICAgIC0gTkRFQlVHIGlzIG5vdCBkZWZpbmVkICAgICBBTkQgISEhCisvLyAgICAgIC0gZmxhZyAweDAwMDAwMDA0TCBpcyBzZXQgaW4gREVGX0RFQlVHX0xWTCAoY2FuIGJlIGRlZmluZWQgaW4gY29wY2ZnLmgpCisvLworLy8gZGVmYXVsdCBsZXZlbCBpcyBkZWZpbmVkIGluIGNvcGRlZi5oCisKKy8vIGRlYnVnLWxldmVsIGFuZCBUUkFDRS1tYWNyb3MgICAgICAgICAvLyBzdGFuZGFyZC1sZXZlbCAgIC8vIGZsYWdzIGZvciBERUZfREVCVUdfTFZMCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSViAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzAxCS8vIDB4MDAwMDAwMDFMCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSVl9UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzAxX1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VEUlZfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8wMV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FRFJWX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMDFfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSVl9UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzAxX1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VEUlZfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8wMV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0RMTCAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8wMgkvLyAweDAwMDAwMDAyTAorI2RlZmluZSBFUExfREJHTFZMX0RMTF9UUkFDRTAgICAgICAgICAgIERFQlVHX0xWTF8wMl9UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9ETExfVFJBQ0UxICAgICAgICAgICBERUJVR19MVkxfMDJfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfRExMX1RSQUNFMiAgICAgICAgICAgREVCVUdfTFZMXzAyX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX0RMTF9UUkFDRTMgICAgICAgICAgIERFQlVHX0xWTF8wMl9UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9ETExfVFJBQ0U0ICAgICAgICAgICBERUJVR19MVkxfMDJfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkQgICAgICAgICAgICAgICAgICBERUJVR19MVkxfMDMJLy8gMHgwMDAwMDAwNEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkRfVFJBQ0UwICAgICAgICAgICBERUJVR19MVkxfMDNfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfT0JEX1RSQUNFMSAgICAgICAgICAgREVCVUdfTFZMXzAzX1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX09CRF9UUkFDRTIgICAgICAgICAgIERFQlVHX0xWTF8wM19UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkRfVFJBQ0UzICAgICAgICAgICBERUJVR19MVkxfMDNfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfT0JEX1RSQUNFNCAgICAgICAgICAgREVCVUdfTFZMXzAzX1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1USyAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzA0CS8vIDB4MDAwMDAwMDhMCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1US19UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzA0X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX05NVEtfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8wNF9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRLX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMDRfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1US19UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzA0X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX05NVEtfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8wNF9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX05NVENOICAgICAgICAgICAgICAgIERFQlVHX0xWTF8wNQkvLyAweDAwMDAwMDEwTAorI2RlZmluZSBFUExfREJHTFZMX05NVENOX1RSQUNFMCAgICAgICAgIERFQlVHX0xWTF8wNV9UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRDTl9UUkFDRTEgICAgICAgICBERUJVR19MVkxfMDVfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UQ05fVFJBQ0UyICAgICAgICAgREVCVUdfTFZMXzA1X1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX05NVENOX1RSQUNFMyAgICAgICAgIERFQlVHX0xWTF8wNV9UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRDTl9UUkFDRTQgICAgICAgICBERUJVR19MVkxfMDVfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVICAgICAgICAgICAgICAgICBERUJVR19MVkxfMDYJLy8gMHgwMDAwMDAyMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVX1RSQUNFMCAgICAgICAgICBERUJVR19MVkxfMDZfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UVV9UUkFDRTEgICAgICAgICAgREVCVUdfTFZMXzA2X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX05NVFVfVFJBQ0UyICAgICAgICAgIERFQlVHX0xWTF8wNl9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVX1RSQUNFMyAgICAgICAgICBERUJVR19MVkxfMDZfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UVV9UUkFDRTQgICAgICAgICAgREVCVUdfTFZMXzA2X1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU4gICAgICAgICAgICAgICAgREVCVUdfTFZMXzA3CS8vIDB4MDAwMDAwNDBMCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UwICAgICAgICAgREVCVUdfTFZMXzA3X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX05NVE1OX1RSQUNFMSAgICAgICAgIERFQlVHX0xWTF8wN19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRNTl9UUkFDRTIgICAgICAgICBERUJVR19MVkxfMDdfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UzICAgICAgICAgREVCVUdfTFZMXzA3X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX05NVE1OX1RSQUNFNCAgICAgICAgIERFQlVHX0xWTF8wN19UUkFDRTQKKworLy8uLi4KKworI2RlZmluZSBFUExfREJHTFZMX1NETyAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNQkvLyAweDAxMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPX1RSQUNFMCAgICAgICAgICAgREVCVUdfTFZMXzI1X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1NET19UUkFDRTEgICAgICAgICAgIERFQlVHX0xWTF8yNV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9TRE9fVFJBQ0UyICAgICAgICAgICBERUJVR19MVkxfMjVfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPX1RSQUNFMyAgICAgICAgICAgREVCVUdfTFZMXzI1X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1NET19UUkFDRTQgICAgICAgICAgIERFQlVHX0xWTF8yNV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX1ZFVEggICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNgkvLyAweDAyMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSF9UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzI2X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1ZFVEhfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8yNl9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9WRVRIX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMjZfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSF9UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzI2X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1ZFVEhfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8yNl9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0VWRU5USyAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNwkvLyAweDA0MDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMCAgICAgICAgREVCVUdfTFZMXzI3X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VWRU5US19UUkFDRTEgICAgICAgIERFQlVHX0xWTF8yN19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UyICAgICAgICBERUJVR19MVkxfMjdfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMyAgICAgICAgREVCVUdfTFZMXzI3X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VWRU5US19UUkFDRTQgICAgICAgIERFQlVHX0xWTF8yN19UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVSAgICAgICAgICAgICAgIERFQlVHX0xWTF8yOAkvLyAweDA4MDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVX1RSQUNFMCAgICAgICAgREVCVUdfTFZMXzI4X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVV9UUkFDRTEgICAgICAgIERFQlVHX0xWTF8yOF9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVFVfVFJBQ0UyICAgICAgICBERUJVR19MVkxfMjhfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVX1RSQUNFMyAgICAgICAgREVCVUdfTFZMXzI4X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVV9UUkFDRTQgICAgICAgIERFQlVHX0xWTF8yOF9UUkFDRTQKKworLy8gU2hhcmVkQnVmZgorI2RlZmluZSBFUExfREJHTFZMX1NIQiAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yOQkvLyAweDEwMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCX1RSQUNFMCAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1NIQl9UUkFDRTEgICAgICAgICAgIERFQlVHX0xWTF8yOV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9TSEJfVFJBQ0UyICAgICAgICAgICBERUJVR19MVkxfMjlfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCX1RSQUNFMyAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1NIQl9UUkFDRTQgICAgICAgICAgIERFQlVHX0xWTF8yOV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVCAgICAgICAgICAgICAgIERFQlVHX0xWTF9BU1NFUlQJLy8gMHgyMDAwMDAwMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9BU1NFUlRfVFJBQ0UwICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVF9UUkFDRTEgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfQVNTRVJUX1RSQUNFMiAgICAgICAgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9BU1NFUlRfVFJBQ0UzICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVF9UUkFDRTQgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUiAgICAgICAgICAgICAgICBERUJVR19MVkxfRVJST1IJLy8gMHg0MDAwMDAwMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUl9UUkFDRTAgICAgICAgICBERUJVR19MVkxfRVJST1JfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVJST1JfVFJBQ0UxICAgICAgICAgREVCVUdfTFZMX0VSUk9SX1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX0VSUk9SX1RSQUNFMiAgICAgICAgIERFQlVHX0xWTF9FUlJPUl9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUl9UUkFDRTMgICAgICAgICBERUJVR19MVkxfRVJST1JfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfRVJST1JfVFJBQ0U0ICAgICAgICAgREVCVUdfTFZMX0VSUk9SX1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTICAgICAgICAgICAgICAgREVCVUdfTFZMX0FMV0FZUwkvLyAweDgwMDAwMDAwTAorI2RlZmluZSBFUExfREJHTFZMX0FMV0FZU19UUkFDRTAgICAgICAgIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTX1RSQUNFMSAgICAgICAgREVCVUdfTFZMX0FMV0FZU19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9BTFdBWVNfVFJBQ0UyICAgICAgICBERUJVR19MVkxfQUxXQVlTX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX0FMV0FZU19UUkFDRTMgICAgICAgIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTX1RSQUNFNCAgICAgICAgREVCVUdfTFZMX0FMV0FZU19UUkFDRTQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0lOQ19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbnN0RGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEluc3REZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWVmYmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbnN0RGVmLmgKQEAgLTAsMCArMSwzNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZWZpbml0aW9ucyBmb3IgZ2VuZXJhdGluZyBpbnN0YW5jZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxJbnN0RGVmLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIC4uLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIHIuZC46IGZpcnN0IGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTElOU1RERUZfSF8KKyNkZWZpbmUgX0VQTElOU1RERUZfSF8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdHlwZXMgYW5kIG1hY3JvcyBmb3IgZ2VuZXJhdGluZyBpbnN0YW5jZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordHlwZWRlZiBlbnVtIHsKKwlrU3RhdGVVbnVzZWQgPSAwLAorCWtTdGF0ZURlbGV0ZWQgPSAxLAorCWtTdGF0ZVVzZWQgPSAweEZGCit9IHRJbnN0U3RhdGU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdm9pZCBNRU0gKnRFcGxQdHJJbnN0YW5jZTsKK3R5cGVkZWYgQllURSB0RXBsSW5zdGFuY2VIZGw7CisKKy8vIGRlZmluZSBjb25zdCBmb3IgaWxsZWdhbGUgdmFsdWVzCisjZGVmaW5lIENDTV9JTExJTlNUQU5DRSAgICAgIE5VTEwKKyNkZWZpbmUgQ0NNX0lMTElOU1RBTkNFX0hETCAgMHhGRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaWYgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSB0aGVuIHVzZSB0aGlzIG1hY3JvcworI2lmIChFUExfTUFYX0lOU1RBTkNFUyA+IDEpCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gbWFjcm8gZGVmaW5pdGlvbiBmb3IgaW5zdGFuY2UgdGFibGUgZGVmaW5pdGlvbgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG1lbW9yeSBhdHRyaWJ1dGVzIGZvciBpbnN0YW5jZSB0YWJsZQorI2RlZmluZSBJTlNUX05FQVIJCS8vIGZhc3RlciBhY2Nlc3MgdG8gdmFyaWFibGVzCisjZGVmaW5lIElOU1RfRkFSCQkvLyB2YXJpYWJsZXMgd2ljaCBoYXZlIHRvIGxvY2F0ZWQgaW4geGRhdGEKKyNkZWZpbmUgU1RBVElDCQkJLy8gcHJldmVudCB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIHdpdGggc2FtZSBuYW1lCisKKyNkZWZpbmUgSU5TVEFOQ0VfVFlQRV9CRUdJTiAgICAgdHlwZWRlZiBzdHJ1Y3QgeworI2RlZmluZSBJTlNUQU5DRV9UWVBFX0VORCAgICAgICB9IHRFcGxJbnN0YW5jZUluZm87CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gbWFjcm8gZGVmaW5pdGlvbiBmb3IgQVBJIGludGVyZmFjZQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIGRlY2xhcmF0aW9uOgorCisgICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiB3aXRoaW4gZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZSBvZiBBUEkgZnVuY3Rpb25zCisjZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX0hETCAgICAgICAgICAgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgSW5zdGFuY2VIYW5kbGUKKyNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXyAgICAgICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUhkbCBJbnN0YW5jZUhhbmRsZSwKKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gb2YgcG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgd2l0aGluIGZ1bmN0aW9uIGhlYWRlciBvciBwcm90b3R5cGUgb2YgQVBJIGZ1bmN0aW9ucworI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgdEVwbEluc3RhbmNlSGRsIE1FTSogcEluc3RhbmNlSGFuZGxlCisjZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IRExfICAgICAgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgTUVNKiBwSW5zdGFuY2VIYW5kbGUsCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIGluc3RhbmNlIGFzIGxva2FjbCB2YXJpYWJsZSB3aXRoaW4gZnVuY3Rpb25zCisjZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTCAgICAgICAgICAgICB0Q2NtSW5zdGFuY2VJbmZvIE1FTSogcEluc3RhbmNlOworI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMX0xPQ0FMICAgICAgICAgdEVwbEluc3RhbmNlSGRsICBNRU0qIHBJbnN0YW5jZUhhbmRsZTsKKworICAgIC8vIHJlZmVyZW5jZToKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIGluc3RhbmNlIGhhbmRsZSBmb3IgZnVuY3Rpb24gcGFyYW1ldGVycworI2RlZmluZSBDQ01fSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFuY2VIYW5kbGUKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX0hETF8gICAgICAgICAgICAgICAgICAgICAgIEluc3RhbmNlSGFuZGxlLAorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgaW5zdGFuY2UgcGFyYW1ldGVyIGZvciBmdW5jdGlvbiBwYXJhbWV0ZXJzCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTShwYXIpICAgICAgICAgICAgICAgICBwYXIKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX1BBUkFNXyhwYXIpICAgICAgICAgICAgICAgIHBhciwKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIGluc3RhbmNlIHBhcmFtZXRlciBmb3Igd3JpdGluZyBvciByZWFkaW5nIHZhbHVlcworI2RlZmluZSBDQ01fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHRFcGxQdHJJbnN0YW5jZSlwSW5zdGFuY2UpKQorCisgICAgLy8gcHJvY2Vzc2luZzoKKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBpbnN0YW5jZSBoYW5kbGUKKyNkZWZpbmUgQ0NNX0NIRUNLX0lOU1RBTkNFX0hETCgpICAgICAgICAgICAgICAgIGlmIChJbnN0YW5jZUhhbmRsZSA+PSBFUExfTUFYX0lOU1RBTkNFUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIChrRXBsSWxsZWdhbEluc3RhbmNlKTt9CisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUKKyNkZWZpbmUgQ0NNX0NIRUNLX1BUUl9JTlNUQU5DRV9IREwoKSAgICAgICAgICAgIGlmIChwSW5zdGFuY2VIYW5kbGUgPT0gTlVMTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIChrRXBsSW52YWxpZEluc3RhbmNlUGFyYW0pO30KKworICAgIC8vIFRoaXMgbWFjcm8gcmV0dXJuZWQgdGhlIGhhbmRsZSBhbmQgcG9pbnRlciB0byBuZXh0IGZyZWUgaW5zdGFuY2UuCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9BTkRfSERMKCkgICAgICAgICBwSW5zdGFuY2UgPSBDY21HZXRGcmVlSW5zdGFuY2VBbmRIYW5kbGUgKHBJbnN0YW5jZUhhbmRsZSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQgKCpwSW5zdGFuY2VIYW5kbGUgIT0gQ0NNX0lMTElOU1RBTkNFX0hETCk7CisKKyNkZWZpbmUgQ0NNX0NIRUNLX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UgPT0gQ0NNX0lMTElOU1RBTkNFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gKGtFcGxOb0ZyZWVJbnN0YW5jZSk7fQorCisjZGVmaW5lIENDTV9HRVRfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UgPSBDY21HZXRJbnN0YW5jZVB0ciAoSW5zdGFuY2VIYW5kbGUpOworI2RlZmluZSBDQ01fR0VUX0ZSRUVfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgcEluc3RhbmNlID0gR2V0RnJlZUluc3RhbmNlICgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUIChwSW5zdGFuY2UgIT0gQ0NNX0lMTElOU1RBTkNFKTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBtYWNybyBkZWZpbml0aW9uIGZvciBzdGFjayBpbnRlcmZhY2UKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyLCBwcm90b3R5cGUgb3IgbG9jYWwgdmFyIGxpc3QKKyAgICAvLyBEZWNsYXJhdGlvbiBvZiBwb2ludGVycyB3aXRoaW4gZnVuY3Rpb24gcGFyYW1hdGVyIGxpc3QgbXVzdCBkZWZpbmVkIGFzIHZvaWQgTUVNKgorICAgIC8vIHBvaW50ZXIuCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIgICAgICAgICAgICAgICAgICAgdm9pZCBNRU0qIHBJbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgIHZvaWQgTUVNKiBwSW5zdGFuY2UsCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwgICAgICAgICAgICAgdEVwbFB0ckluc3RhbmNlICBwSW5zdGFuY2U7CisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlCisgICAgLy8gVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciBwYXJhbWV0ZXIgcGFzc2luZyB0byBjYWxsZWQgZnVuY3Rpb24uCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUFRSICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLAorI2RlZmluZSBFUExfTUNPX0FERFJfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UsCisKKyAgICAvLyBtYWNybyBmb3IgYWNjZXNzIG9mIHN0cnVjdCBtZW1iZXJzIG9mIG9uZSBpbnN0YW5jZQorICAgIC8vIEFuIGFjY2VzcyB0byBhIG1lbWJlciBvZiBpbnN0YW5jZSB0YWJsZSBtdXN0IGJlIGNhc3RlZCBieSB0aGUgbG9jYWwKKyAgICAvLyBkZWZpbmVkIHR5cGUgb2YgaW5zdGFuY2UgdGFibGUuCisjZGVmaW5lIEVQTF9NQ09fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKCoodEVwbFB0ckluc3RhbmNlKXBJbnN0YW5jZSkKKyNkZWZpbmUgRVBMX01DT19HTEJfVkFSKHZhcikgICAgICAgICAgICAgICAgICAgICAgICAoKCh0RXBsUHRySW5zdGFuY2UpcEluc3RhbmNlKS0+dmFyKQorCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UKKyNkZWZpbmUgRVBMX01DT19HRVRfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UgPSAodEVwbFB0ckluc3RhbmNlKSBHZXRJbnN0YW5jZVB0ciAoSW5zdGFuY2VIYW5kbGUpOworI2RlZmluZSBFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgIHBJbnN0YW5jZSA9ICh0RXBsUHRySW5zdGFuY2UpIEdldEZyZWVJbnN0YW5jZSAoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCAocEluc3RhbmNlICE9IENDTV9JTExJTlNUQU5DRSk7CisKKyAgICAvLyBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBwYXNzZWQgcG9pbnRlciB0byBhbiBwdWJsaWMgZnVuY3Rpb24KKyNkZWZpbmUgRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpICAgICAgICAgICAgICBBU1NFUlQgKHBJbnN0YW5jZSAhPSBOVUxMKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCAoKCh0RXBsUHRySW5zdGFuY2UpcEluc3RhbmNlKS0+bV9JbnN0U3RhdGUgPT0ga1N0YXRlVXNlZCk7CisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgIHZvaWQgTUVNKiAgTUVNKiBwSW5zdGFuY2VQdHIKKyNkZWZpbmUgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfICAgICAgICAgICAgICB2b2lkIE1FTSogIE1FTSogcEluc3RhbmNlUHRyLAorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgcG9pbnRlciB0byBpbnN0YW5jZSBwb2ludGVyCisgICAgLy8gVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciBwYXJhbWV0ZXIgcGFzc2luZyB0byBjYWxsZWQgZnVuY3Rpb24uCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHRyCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8gICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHRyLAorCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0NIRUNLX1BUUl9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgIEFTU0VSVCAocEluc3RhbmNlUHRyICE9IE5VTEwpOworI2RlZmluZSBFUExfTUNPX1NFVF9QVFJfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICgqcEluc3RhbmNlUHRyID0gcEluc3RhbmNlKTsKKworI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNKGEpICAgICAgICAgICAgICAgICAgIChhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyhhKSAgICAgICAgICAgICAgICAgIChhKSwKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkgICAgICAgICAgICAgICBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyAoRVBMX01DT19HTEJfVkFSIChtX2JJbnN0SW5kZXgpKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWCgpICAgICAgICAgICAgICAgIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU0gKEVQTF9NQ09fR0xCX1ZBUiAobV9iSW5zdEluZGV4KSkKKyNkZWZpbmUgRVBMX01DT19XUklURV9JTlNUQU5DRV9TVEFURShhKSAgICAgICAgICAgICBFUExfTUNPX0dMQl9WQVIgKG1fSW5zdFN0YXRlKSA9IGE7CisKKyAgICAvLyB0aGlzIG1hY3JvIGRlbGV0ZXMgYWxsIGluc3RhbmNlIGVudHJpZXMgYXMgdW51c2VkCisjZGVmaW5lIEVQTF9NQ09fREVMRVRFX0lOU1RBTkNFX1RBQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRFcGxJbnN0YW5jZUluZm8gTUVNKiAgIHBJbnN0YW5jZSAgICAgICA9ICZhRXBsSW5zdGFuY2VUYWJsZV9nWzBdOyBcCisgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIEluc3ROdW1iZXIgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIGkgICAgICAgICAgICAgICA9IEVQTF9NQVhfSU5TVEFOQ0VTOyAgICAgICBcCisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UtPm1fSW5zdFN0YXRlID0gKEJZVEUpIGtTdGF0ZVVudXNlZDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UtPm1fYkluc3RJbmRleCA9IChCWVRFKSBJbnN0TnVtYmVyOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UrKzsgSW5zdE51bWJlcisrOyBpLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUgKGkgIT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgLy8gZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgd2hpY2ggaGFzIHRvIGJlIGRlZmluZWQgaW4gZWFjaCBtb2R1bGUgb2YgQ0FOb3BlbiBzdGFjaworI2RlZmluZSBFUExfTUNPX0RFRklORV9JTlNUQU5DRV9GQ1QoKSBcCisgICAgICAgIHN0YXRpYyB0RXBsUHRySW5zdGFuY2UgR2V0SW5zdGFuY2VQdHIgKHRFcGxJbnN0YW5jZUhkbCBJbnN0SGFuZGxlX3ApOyAgXAorICAgICAgICBzdGF0aWMgdEVwbFB0ckluc3RhbmNlIEdldEZyZWVJbnN0YW5jZSAodm9pZCk7CisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9GQ1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgdEVwbFB0ckluc3RhbmNlIEdldEluc3RhbmNlUHRyICh0RXBsSW5zdGFuY2VIZGwgSW5zdEhhbmRsZV9wKSB7IFwKKyAgICAgICAgICAgIHJldHVybiAmYUVwbEluc3RhbmNlVGFibGVfZ1tJbnN0SGFuZGxlX3BdOyB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyB0RXBsUHRySW5zdGFuY2UgR2V0RnJlZUluc3RhbmNlICh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdEVwbEluc3RhbmNlSW5mbyBNRU0qICAgcEluc3RhbmNlICAgPSAmYUVwbEluc3RhbmNlVGFibGVfZ1swXTsgICAgIFwKKyAgICAgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIGkgICAgICAgICAgID0gRVBMX01BWF9JTlNUQU5DRVM7ICAgICAgICAgICBcCisgICAgICAgICAgICBkbyB7IGlmIChwSW5zdGFuY2UtPm1fSW5zdFN0YXRlICE9IGtTdGF0ZVVzZWQpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRFcGxQdHJJbnN0YW5jZSkgcEluc3RhbmNlOyB9ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UrKzsgaS0tOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoaSAhPSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIENDTV9JTExJTlNUQU5DRTsgfQorCisgICAgLy8gdGhpcyBtYWNybyBkZWZpbmVzIHRoZSBpbnN0YW5jZSB0YWJsZS4gRWFjaCBlbnRyeSBpcyByZXNlcnZlZCBmb3IgYW4gaW5zdGFuY2Ugb2YgQ0FOb3Blbi4KKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1ZBUigpIFwKKyAgICAgICAgc3RhdGljIHRFcGxJbnN0YW5jZUluZm8gTUVNIGFFcGxJbnN0YW5jZVRhYmxlX2cgW0VQTF9NQVhfSU5TVEFOQ0VTXTsKKworICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyBtZW1iZXIgdmFyaWFibGVzIGluIGluc3RhbmNlIHRhYmxlIHdoaWNoIGFyZSBuZWVkZWQgaW4KKyAgICAvLyBhbGwgbW9kdWxlcyBvZiBFcGwgc3RhY2sKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX01FTUJFUigpIFwKKyAgICAgICAgU1RBVElDICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fSW5zdFN0YXRlOyBcCisgICAgICAgIFNUQVRJQyAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JJbnN0SW5kZXg7CisKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkgICAgICAgICAgIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fIChFUExfTUNPX0dMQl9WQVIgKG1fYkluc3RJbmRleCkpCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYKCkgICAgICAgICAgICBFUExfTUNPX0lOU1RBTkNFX1BBUkFNIChFUExfTUNPX0dMQl9WQVIgKG1fYkluc3RJbmRleCkpCisKKyNlbHNlIC8vIG9ubHkgb25lIGluc3RhbmNlIGlzIHVzZWQKKworICAgIC8vIE1lbW9yeSBhdHRyaWJ1dGVzIGZvciBpbnN0YW5jZSB0YWJsZS4KKyNkZWZpbmUgSU5TVF9ORUFSICAgTkVBUgkvLyBmYXN0ZXIgYWNjZXNzIHRvIHZhcmlhYmxlcworI2RlZmluZSBJTlNUX0ZBUiAgICBNRU0JCS8vIHZhcmlhYmxlcyB3aWNoIGhhdmUgdG8gbG9jYXRlZCBpbiB4ZGF0YQorI2RlZmluZSBTVEFUSUMgICAgICBzdGF0aWMJLy8gcHJldmVudCB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIHdpdGggc2FtZSBuYW1lCisKKyNkZWZpbmUgSU5TVEFOQ0VfVFlQRV9CRUdJTgorI2RlZmluZSBJTlNUQU5DRV9UWVBFX0VORAorCisvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uLCBpbml0aWFsaXppbmcgYW5kIG1lbWJlciBhY2Nlc3MgZm9yIGluc3RhbmNlIGhhbmRsZQorLy8gVGhpcyBjbGFzcyBvZiBtYWNyb3MgYXJlIHVzZWQgYnkgQVBJIGZ1bmN0aW9uIHRvIGluZm9ybSBDQ00tbW9kdWwgd2hpY2gKKy8vIGluc3RhbmNlIGlzIHRvIGJlIHVzZWQuCisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBpbnN0YW5jZSBoYW5kbGUKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIENBTm9wZW4gQVBJIGZ1bmN0aW9uLgorI2RlZmluZSBDQ01fSU5TVEFOQ0VfSERMCisjZGVmaW5lIENDTV9JTlNUQU5DRV9IRExfCisKKyNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfUFRSX0xPQ0FMCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZQorI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9IREwgICAgICAgICAgICAgICAgICAgdm9pZAorI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9IRExfCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgaW5zdGFuY2UgaGFuZGxlCisjZGVmaW5lIENDTV9DSEVDS19JTlNUQU5DRV9IREwoKQorCisgICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZQorI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgdm9pZAorI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMXworCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlCisjZGVmaW5lIENDTV9DSEVDS19QVFJfSU5TVEFOQ0VfSERMKCkKKworICAgIC8vIFRoaXMgbWFjcm8gcmV0dXJuZWQgdGhlIGhhbmRsZSBhbmQgcG9pbnRlciB0byBuZXh0IGZyZWUgaW5zdGFuY2UuCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9BTkRfSERMKCkKKworI2RlZmluZSBDQ01fQ0hFQ0tfSU5TVEFOQ0VfUFRSKCkKKworI2RlZmluZSBDQ01fR0VUX0lOU1RBTkNFX1BUUigpCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKQorCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTShwYXIpCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTV8ocGFyKQorCisjZGVmaW5lIENDTV9JTlNUX0VOVFJZICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2NtSW5zdGFuY2VUYWJsZV9nWzBdCisKKy8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24sIGluaXRpYWxpemluZyBhbmQgbWVtYmVyIGFjY2VzcyBmb3IgaW5zdGFuY2UgcG9pbnRlcgorLy8gVGhpcyBjbGFzcyBvZiBtYWNyb3MgYXJlIHVzZWQgYnkgQ0FOb3BlbiBpbnRlcm5hbCBmdW5jdGlvbiB0byBwb2ludCB0byBvbmUgaW5zdGFuY2UuCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyLCBwcm90b3R5cGUgb3IgbG9jYWwgdmFyIGxpc3QKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICB2b2lkCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFIKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFJfCisjZGVmaW5lIEVQTF9NQ09fQUREUl9JTlNUQU5DRV9QVFJfCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0dFVF9JTlNUQU5DRV9QVFIoKQorI2RlZmluZSBFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpCisKKyAgICAvLyBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBwYXNzZWQgcG9pbnRlciB0byBhbiBwdWJsaWMgZnVuY3Rpb24KKyNkZWZpbmUgRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgIHZvaWQKKyNkZWZpbmUgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KKyNkZWZpbmUgRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIKKyNkZWZpbmUgRVBMX01DT19DSEVDS19QVFJfSU5TVEFOQ0VfUFRSKCkKKyNkZWZpbmUgRVBMX01DT19TRVRfUFRSX0lOU1RBTkNFX1BUUigpCisKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTShhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyhhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWF8oKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWCgpCisKKyAgICAvLyBtYWNybyBmb3IgYWNjZXNzIG9mIHN0cnVjdCBtZW1iZXJzIG9mIG9uZSBpbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0lOU1RfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgIGFFcGxJbnN0YW5jZVRhYmxlX2dbMF0KKyNkZWZpbmUgRVBMX01DT19HTEJfVkFSKHZhcikgICAgICAgICAgICAgICAgICAgICAgICAodmFyKQorI2RlZmluZSBFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGEpCisKKyAgICAvLyB0aGlzIG1hY3JvIGRlbGV0ZXMgYWxsIGluc3RhbmNlIGVudHJpZXMgYXMgdW51c2VkCisjZGVmaW5lIEVQTF9NQ09fREVMRVRFX0lOU1RBTkNFX1RBQkxFKCkKKworICAgIC8vIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zIHdoaWNoIGhhcyB0byBiZSBkZWZpbmVkIGluIGVhY2ggbW9kdWxlIG9mIENBTm9wZW4gc3RhY2sKKyNkZWZpbmUgRVBMX01DT19ERUZJTkVfSU5TVEFOQ0VfRkNUKCkKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpCisKKyAgICAvLyB0aGlzIG1hY3JvIGRlZmluZXMgdGhlIGluc3RhbmNlIHRhYmxlLiBFYWNoIGVudHJ5IGlzIHJlc2VydmVkIGZvciBhbiBpbnN0YW5jZSBvZiBDQU5vcGVuLgorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfVkFSKCkKKworICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyBtZW1iZXIgdmFyaWFibGVzIGluIGluc3RhbmNlIHRhYmxlIHdoaWNoIGFyZSBuZWVkZWQgaW4KKyAgICAvLyBhbGwgbW9kdWxlcyBvZiBDQU5vcGVuIHN0YWNrCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKQorCisjZW5kaWYKKworLyoKKyNpZiAoQ0RSVl9NQVhfSU5TVEFOQ0VTID4gMSkKKworICAgICNkZWZpbmUgQ0RSVl9SRUVOVFJBTlQgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRU5UUkFOVAorCisjZWxzZQorCisgICAgI2RlZmluZSBDRFJWX1JFRU5UUkFOVAorCisjZW5kaWYKKyovCisKKyNlbmRpZiAvLyBfRVBMSU5TVERFRl9IXworCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTGVkLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbExlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjlhZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxMZWQuaApAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBzdGF0dXMgYW5kIGVycm9yIExFRAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbExlZC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDgvMTEvMTcgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMTEVEX0hfCisjZGVmaW5lIF9FUExMRURfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0geworCWtFcGxMZWRUeXBlU3RhdHVzID0gMHgwMCwKKwlrRXBsTGVkVHlwZUVycm9yID0gMHgwMSwKKworfSB0RXBsTGVkVHlwZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExMRURfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTFlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgZ2xvYmFsIGluY2x1ZGUgZmlsZSBmb3IgRVBMLU5NVC1Nb2R1bGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExOTVRfSF8KKyNkZWZpbmUgX0VQTE5NVF9IXworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZpbmUgc3VwZXItc3RhdGVzIGFuZCBtYXNrcyB0byBpZGVudGlmeSBhIHN1cGVyLXN0YXRlCisjZGVmaW5lIEVQTF9OTVRfR1NfUE9XRVJFRCAgICAgICAgICAweDAwMDgJLy8gc3VwZXIgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9HU19JTklUSUFMSVNBVElPTiAgIDB4MDAwOQkvLyBzdXBlciBzdGF0ZQorI2RlZmluZSBFUExfTk1UX0dTX0NPTU1VTklDQVRJTkcgICAgMHgwMDBDCS8vIHN1cGVyIHN0YXRlCisjZGVmaW5lIEVQTF9OTVRfQ1NfRVBMTU9ERSAgICAgICAgICAweDAwMEQJLy8gc3VwZXIgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9NU19FUExNT0RFICAgICAgICAgIDB4MDAwRAkvLyBzdXBlciBzdGF0ZQorCisjZGVmaW5lIEVQTF9OTVRfU1VQRVJTVEFURV9NQVNLICAgICAweDAwMEYJLy8gbWFzayB0byBzZWxlY3Qgc3RhdGUKKworI2RlZmluZSBFUExfTk1UX1RZUEVfVU5ERUZJTkVEICAgICAgMHgwMDAwCS8vIHR5cGUgb2YgTk1UIHN0YXRlIGlzIHN0aWxsIHVuZGVmaW5lZAorI2RlZmluZSBFUExfTk1UX1RZUEVfQ1MgICAgICAgICAgICAgMHgwMTAwCS8vIENTIHR5cGUgb2YgTk1UIHN0YXRlCisjZGVmaW5lIEVQTF9OTVRfVFlQRV9NUyAgICAgICAgICAgICAweDAyMDAJLy8gTVMgdHlwZSBvZiBOTVQgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9UWVBFX01BU0sgICAgICAgICAgIDB4MDMwMAkvLyBtYXNrIHRvIHNlbGVjdCB0eXBlIG9mIE5NVCBzdGF0ZSAoaS5lLiBDUyBvciBNUykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHRoZSBsb3dlciBCeXRlIG9mIHRoZSBOTVQtU3RhdGUgaXMgZW5jb2RlZAorLy8gbGlrZSB0aGUgdmFsdWVzIGluIHRoZSBFUEwtU3RhbmRhcmQKKy8vIHRoZSBoaWdoZXIgYnl0ZSBpcyB1c2VkIHRvIGVuY29kZSBNTgorLy8gKEJpdCAxIG9mIHRoZSBoaWdoZXIgYnl0ZSA9IDEpIG9yIENOIChCaXQgMCBvZiB0aGUKKy8vIGhpZ2hlciBieXRlICA9IDEpCisvLyB0aGUgc3VwZXItc3RhdGVzIGFyZSBub3QgbWVudGlvbmVkIGluIHRoaXMKKy8vIGVudW0gYmVjYXVzZSB0aGV5IGFyZSBubyByZWFsIHN0YXRlcworLy8gLS0+IHRoZXJlIGFyZSBtYXNrcyBkZWZpbmVkIHRvIGluZGVudGlmeSB0aGUKKy8vIHN1cGVyLXN0YXRlcworCit0eXBlZGVmIGVudW0geworCWtFcGxObXRHc09mZiA9IDB4MDAwMCwKKwlrRXBsTm10R3NJbml0aWFsaXNpbmcgPSAweDAwMTksCisJa0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbiA9IDB4MDAyOSwKKwlrRXBsTm10R3NSZXNldENvbW11bmljYXRpb24gPSAweDAwMzksCisJa0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uID0gMHgwMDc5LAorCWtFcGxObXRDc05vdEFjdGl2ZSA9IDB4MDExQywKKwlrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEgPSAweDAxMUQsCisJa0VwbE5tdENzU3RvcHBlZCA9IDB4MDE0RCwKKwlrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIgPSAweDAxNUQsCisJa0VwbE5tdENzUmVhZHlUb09wZXJhdGUgPSAweDAxNkQsCisJa0VwbE5tdENzT3BlcmF0aW9uYWwgPSAweDAxRkQsCisJa0VwbE5tdENzQmFzaWNFdGhlcm5ldCA9IDB4MDExRSwKKwlrRXBsTm10TXNOb3RBY3RpdmUgPSAweDAyMUMsCisJa0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxID0gMHgwMjFELAorCWtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMiA9IDB4MDI1RCwKKwlrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZSA9IDB4MDI2RCwKKwlrRXBsTm10TXNPcGVyYXRpb25hbCA9IDB4MDJGRCwKKwlrRXBsTm10TXNCYXNpY0V0aGVybmV0ID0gMHgwMjFFCit9IHRFcGxObXRTdGF0ZTsKKworLy8gTk1ULWV2ZW50cwordHlwZWRlZiBlbnVtIHsKKwkvLyBFdmVudHMgZnJvbSBETEwKKwkvLyBFdmVudHMgZGVmaW5lZCBieSBFUEwgVjIgc3BlY2lmaWNhdGlvbgorCWtFcGxObXRFdmVudE5vRXZlbnQgPSAweDAwLAorLy8gICAga0VwbE5tdEV2ZW50RGxsTWVQcmVzICAgICAgICAgICA9ICAgMHgwMSwKKwlrRXBsTm10RXZlbnREbGxNZVByZXNUaW1lb3V0ID0gMHgwMiwKKy8vICAgIGtFcGxObXRFdmVudERsbE1lQXNuZCAgICAgICAgICAgPSAgIDB4MDMsCisvLyAgICBrRXBsTm10RXZlbnREbGxNZUFzbmRUaW1lb3V0ICAgID0gICAweDA0LAorCWtFcGxObXRFdmVudERsbE1lU29hU2VudCA9IDB4MDQsCisJa0VwbE5tdEV2ZW50RGxsTWVTb2NUcmlnID0gMHgwNSwKKwlrRXBsTm10RXZlbnREbGxNZVNvYVRyaWcgPSAweDA2LAorCWtFcGxObXRFdmVudERsbENlU29jID0gMHgwNywKKwlrRXBsTm10RXZlbnREbGxDZVByZXEgPSAweDA4LAorCWtFcGxObXRFdmVudERsbENlUHJlcyA9IDB4MDksCisJa0VwbE5tdEV2ZW50RGxsQ2VTb2EgPSAweDBBLAorCWtFcGxObXRFdmVudERsbENlQXNuZCA9IDB4MEIsCisJa0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQgPSAweDBDLAorCisJLy8gRXZlbnRzIHRyaWdnZXJlZCBieSBOTVQtQ29tbWFuZHMKKwlrRXBsTm10RXZlbnRTd1Jlc2V0ID0gMHgxMCwJLy8gTk1UX0dUMSwgTk1UX0dUMiwgTk1UX0dUOAorCWtFcGxObXRFdmVudFJlc2V0Tm9kZSA9IDB4MTEsCisJa0VwbE5tdEV2ZW50UmVzZXRDb20gPSAweDEyLAorCWtFcGxObXRFdmVudFJlc2V0Q29uZmlnID0gMHgxMywKKwlrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMiA9IDB4MTQsCisJa0VwbE5tdEV2ZW50RW5hYmxlUmVhZHlUb09wZXJhdGUgPSAweDE1LAorCWtFcGxObXRFdmVudFN0YXJ0Tm9kZSA9IDB4MTYsCS8vIE5NVF9DVDcKKwlrRXBsTm10RXZlbnRTdG9wTm9kZSA9IDB4MTcsCisKKwkvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IGhpZ2hlciBsYXllcgorCWtFcGxObXRFdmVudEVudGVyUmVzZXRBcHAgPSAweDIwLAorCWtFcGxObXRFdmVudEVudGVyUmVzZXRDb20gPSAweDIxLAorCWtFcGxObXRFdmVudEludGVybkNvbUVycm9yID0gMHgyMiwJLy8gTk1UX0dUNiwgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiBlcnJvciAtPiBlbnRlciBSZXNldENvbW11bmljYXRpb24KKwlrRXBsTm10RXZlbnRFbnRlclJlc2V0Q29uZmlnID0gMHgyMywKKwlrRXBsTm10RXZlbnRFbnRlckNzTm90QWN0aXZlID0gMHgyNCwKKwlrRXBsTm10RXZlbnRFbnRlck1zTm90QWN0aXZlID0gMHgyNSwKKwlrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQgPSAweDI2LAkvLyBOTVRfQ1QzOyB0aW1lciB0cmlnZ2VyZWQgc3RhdGUgY2hhbmdlIChOb3RBY3RpdmUgLT4gQmFzaWNFdGgpCisJa0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMSA9IDB4MjcsCS8vIGVudGVyIFByZU9wMSBvbiBNTiAoTm90QWN0aXZlIC0+IE1zUHJlT3AxKQorCWtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3IgPSAweDI4LAkvLyBOTVRfQ1QxMSwgTk1UX01UNjsgZXJyb3IgZHVyaW5nIGN5Y2xlIC0+IGVudGVyIFByZU9wMQorCWtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDIgPSAweDI5LAkvLyBlbnRlciBQcmVPcDIgb24gTU4gKE1zUHJlT3AxIC0+IE1zUHJlT3AyIGlmIGtFcGxObXRFdmVudEFsbE1hbmRhdG9yeUNOSWRlbnQpCisJa0VwbE5tdEV2ZW50QWxsTWFuZGF0b3J5Q05JZGVudCA9IDB4MkEsCS8vIGVudGVyIFByZU9wMiBvbiBNTiBpZiBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AyCisJa0VwbE5tdEV2ZW50RW50ZXJSZWFkeVRvT3BlcmF0ZSA9IDB4MkIsCS8vIGFwcGxpY2F0aW9uIHJlYWR5IGZvciB0aGUgc3RhdGUgUmVhZHlUb09wCisJa0VwbE5tdEV2ZW50RW50ZXJNc09wZXJhdGlvbmFsID0gMHgyQywJLy8gZW50ZXIgT3BlcmF0aW9uYWwgb24gTU4KKwlrRXBsTm10RXZlbnRTd2l0Y2hPZmYgPSAweDJELAkvLyBlbnRlciBzdGF0ZSBPZmYKKwlrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yID0gMHgyRSwJLy8gZW50ZXIgc3RhdGUgT2ZmIGJlY2F1c2Ugb2YgY3JpdGljYWwgZXJyb3IKKworfSB0RXBsTm10RXZlbnQ7CisKKy8vIHR5cGUgZm9yIGFyZ3VtZW50IG9mIGV2ZW50IGtFcGxFdmVudFR5cGVObXRTdGF0ZUNoYW5nZQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxObXRTdGF0ZSBtX05ld05tdFN0YXRlOworCXRFcGxObXRFdmVudCBtX05tdEV2ZW50OworCit9IHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlOworCisvLyBzdHJ1Y3R1cmUgZm9yIGtFcGxFdmVudFR5cGVIZWFydGJlYXQKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gTm9kZUlkCisJdEVwbE5tdFN0YXRlIG1fTm10U3RhdGU7CS8vIE5NVCBzdGF0ZSAocmVtZW1iZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiBNTiAvIENOKQorCVdPUkQgbV93RXJyb3JDb2RlOwkvLyBFUEwgZXJyb3IgY29kZSBpbiBjYXNlIG9mIE5NVCBzdGF0ZSBOb3RBY3RpdmUKKworfSB0RXBsSGVhcnRiZWF0RXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE5vZGVFdmVudEZvdW5kID0gMHgwMCwKKwlrRXBsTm10Tm9kZUV2ZW50VXBkYXRlU3cgPSAweDAxLAkvLyBhcHBsaWNhdGlvbiBzaGFsbCB1cGRhdGUgc29mdHdhcmUgb24gQ04KKwlrRXBsTm10Tm9kZUV2ZW50Q2hlY2tDb25mID0gMHgwMiwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgc2hhbGwgY2hlY2sgYW5kIHVwZGF0ZSBjb25maWd1cmF0aW9uIG9uIENOCisJa0VwbE5tdE5vZGVFdmVudFVwZGF0ZUNvbmYgPSAweDAzLAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBzaGFsbCB1cGRhdGUgY29uZmlndXJhdGlvbiBvbiBDTiAoY2hlY2sgd2FzIGRvbmUgYnkgTm10TW4gbW9kdWxlKQorCWtFcGxObXROb2RlRXZlbnRWZXJpZnlDb25mID0gMHgwNCwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgc2hhbGwgdmVyaWZ5IGNvbmZpZ3VyYXRpb24gb2YgQ04KKwlrRXBsTm10Tm9kZUV2ZW50UmVhZHlUb1N0YXJ0ID0gMHgwNSwJLy8gaXNzdWVkIGlmIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgc2V0CisJLy8gYXBwbGljYXRpb24gbXVzdCBjYWxsIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKGtFcGxObXRDbWRTdGFydE5vZGUpIG1hbnVhbGx5CisJa0VwbE5tdE5vZGVFdmVudE5tdFN0YXRlID0gMHgwNiwKKwlrRXBsTm10Tm9kZUV2ZW50RXJyb3IgPSAweDA3LAkvLyBOTVQgZXJyb3Igb2YgQ04KKworfSB0RXBsTm10Tm9kZUV2ZW50OworCit0eXBlZGVmIGVudW0geworCWtFcGxObXROb2RlQ29tbWFuZEJvb3QgPSAweDAxLAkvLyBpZiBFUExfTk9ERUFTU0lHTl9TVEFSVF9DTiBub3Qgc2V0IGl0IG11c3QgYmUgaXNzdWVkIGFmdGVyIGtFcGxObXROb2RlRXZlbnRGb3VuZAorCWtFcGxObXROb2RlQ29tbWFuZFN3T2sgPSAweDAyLAkvLyBhcHBsaWNhdGlvbiB1cGRhdGVkIHNvZnR3YXJlIG9uIENOIHN1Y2Nlc3NmdWxseQorCWtFcGxObXROb2RlQ29tbWFuZFN3VXBkYXRlZCA9IDB4MDMsCS8vIGFwcGxpY2F0aW9uIHVwZGF0ZWQgc29mdHdhcmUgb24gQ04gc3VjY2Vzc2Z1bGx5CisJa0VwbE5tdE5vZGVDb21tYW5kQ29uZk9rID0gMHgwNCwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgaGFzIHVwZGF0ZWQgY29uZmlndXJhdGlvbiBvbiBDTiBzdWNjZXNzZnVsbHkKKwlrRXBsTm10Tm9kZUNvbW1hbmRDb25mUmVzZXQgPSAweDA1LAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBoYXMgdXBkYXRlZCBjb25maWd1cmF0aW9uIG9uIENOIHN1Y2Nlc3NmdWxseQorCS8vIGFuZCBDTiBuZWVkcyBSZXNldENvbmYgc28gdGhhdCB0aGUgY29uZmlndXJhdGlvbiBnZXRzIGFjdGl2ZWQKKwlrRXBsTm10Tm9kZUNvbW1hbmRDb25mRXJyID0gMHgwNiwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgZmFpbGVkIG9uIHVwZGF0aW5nIGNvbmZpZ3VyYXRpb24gb24gQ04KKwlrRXBsTm10Tm9kZUNvbW1hbmRTdGFydCA9IDB4MDcsCS8vIGlmIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgc2V0IGl0IG11c3QgYmUgaXNzdWVkIGFmdGVyIGtFcGxObXROb2RlRXZlbnRSZWFkeVRvU3RhcnQKKworfSB0RXBsTm10Tm9kZUNvbW1hbmQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdEJvb3RFdmVudEJvb3RTdGVwMUZpbmlzaCA9IDB4MDAsCS8vIFByZU9wMiBpcyBwb3NzaWJsZQorCWtFcGxObXRCb290RXZlbnRCb290U3RlcDJGaW5pc2ggPSAweDAxLAkvLyBSZWFkeVRvT3AgaXMgcG9zc2libGUKKwlrRXBsTm10Qm9vdEV2ZW50Q2hlY2tDb21GaW5pc2ggPSAweDAyLAkvLyBPcGVyYXRpb25hbCBpcyBwb3NzaWJsZQorCWtFcGxObXRCb290RXZlbnRPcGVyYXRpb25hbCA9IDB4MDMsCS8vIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBPcGVyYXRpb25hbAorCWtFcGxObXRCb290RXZlbnRFcnJvciA9IDB4MDQsCS8vIGJvb3QgcHJvY2VzcyBoYWx0ZWQgYmVjYXVzZSBvZiBhbiBlcnJvcgorCit9IHRFcGxObXRCb290RXZlbnQ7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdENudS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRDbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmY0NmRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRDbnUuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBOTVQtQ04tVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdENudS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10Q251LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXRFcGxObXR1Q2hlY2tFdmVudENhbGxiYWNrIG1fcGZuQ2hlY2tFdmVudENiOworCit9IHRFcGxObXRDbnVJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxObXRDbnVJbnN0YW5jZSBFcGxObXRDbnVJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxObXRDb21tYW5kIEVwbE5tdENudUdldE5tdENvbW1hbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKK3N0YXRpYyBCT09MIEVwbE5tdENudU5vZGVJZExpc3QoQllURSAqIHBiTm10Q29tbWFuZERhdGVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVDb21tYW5kQ2IodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVJbml0KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsTm10Q251QWRkSW5zdGFuY2UodWlOb2RlSWRfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IHRoZSBhZGQgbmV3IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVBZGRJbnN0YW5jZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsTm10Q251SW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbE5tdENudUluc3RhbmNlX2cpKTsKKworCS8vIHNhdmUgbm9kZWlkCisJRXBsTm10Q251SW5zdGFuY2VfZy5tX3VpTm9kZUlkID0gdWlOb2RlSWRfcDsKKworCS8vIHJlZ2lzdGVyIGNhbGxiYWNrLWZ1bmN0aW9uIGZvciBOTVQtY29tbWFuZHMKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10Q29tbWFuZCwKKwkJCQkgICAgICAgRXBsTm10Q251Q29tbWFuZENiLAorCQkJCSAgICAgICBrRXBsRGxsQXNuZEZpbHRlckxvY2FsKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWx0ZSBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwkvLyBkZXJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gRExMCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10Q29tbWFuZCwKKwkJCQkgICAgICAgTlVMTCwga0VwbERsbEFzbmRGaWx0ZXJOb25lKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10Q251U2VuZE5tdFJlcXVlc3QKKy8vCisvLyBEZXNjcmlwdGlvbjogU2VuZCBhbiBOTVQtUmVxdWVzdCB0byB0aGUgTU4KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8gICAgICAgICAgICAgICAgICBObXRDb21tYW5kX3AgPSByZXF1ZXN0ZWQgTk1ULUNvbW1hbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251U2VuZE5tdFJlcXVlc3QodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICAgICAgdEVwbE5tdENvbW1hbmQKKwkJCQkJCSAgICAgICBObXRDb21tYW5kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEZyYW1lSW5mbyBObXRSZXF1ZXN0RnJhbWVJbmZvOworCXRFcGxGcmFtZSBObXRSZXF1ZXN0RnJhbWU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGJ1aWxkIGZyYW1lCisJRVBMX01FTVNFVCgmTm10UmVxdWVzdEZyYW1lLm1fYmVfYWJEc3RNYWNbMF0sIDB4MDAsIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9iZV9hYkRzdE1hYykpOwkvLyBzZXQgYnkgRExMCisJRVBMX01FTVNFVCgmTm10UmVxdWVzdEZyYW1lLm1fYmVfYWJTcmNNYWNbMF0sIDB4MDAsIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9iZV9hYlNyY01hYykpOwkvLyBzZXQgYnkgRExMCisJQW1pU2V0V29yZFRvQmUoJk5tdFJlcXVlc3RGcmFtZS5tX2JlX3dFdGhlclR5cGUsCisJCSAgICAgICBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX2xlX2JEc3ROb2RlSWQsIChCWVRFKSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQpOwkvLyBub2RlIGlkIG9mIHRoZSBNTgorCUFtaVNldEJ5dGVUb0xlKCZObXRSZXF1ZXN0RnJhbWUubV9sZV9iTWVzc2FnZVR5cGUsCisJCSAgICAgICAoQllURSkga0VwbE1zZ1R5cGVBc25kKTsKKwlBbWlTZXRCeXRlVG9MZSgmTm10UmVxdWVzdEZyYW1lLm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkgICAgICAgKEJZVEUpIGtFcGxEbGxBc25kTm10UmVxdWVzdCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJICAgICAgIG1fTm10UmVxdWVzdFNlcnZpY2UubV9sZV9iTm10Q29tbWFuZElkLAorCQkgICAgICAgKEJZVEUpIE5tdENvbW1hbmRfcCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdFJlcXVlc3RTZXJ2aWNlLm1fbGVfYlRhcmdldE5vZGVJZCwgKEJZVEUpIHVpTm9kZUlkX3ApOwkvLyB0YXJnZXQgZm9yIHRoZSBubXQgY29tbWFuZAorCUVQTF9NRU1TRVQoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdFJlcXVlc3RTZXJ2aWNlLgorCQkgICBtX2xlX2FiTm10Q29tbWFuZERhdGFbMF0sIDB4MDAsCisJCSAgIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkgIG1fTm10UmVxdWVzdFNlcnZpY2UubV9sZV9hYk5tdENvbW1hbmREYXRhKSk7CisKKwkvLyBidWlsZCBpbmZvLXN0cnVjdHVyZQorCU5tdFJlcXVlc3RGcmFtZUluZm8ubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3U2VjID0gMDsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fcEZyYW1lID0gJk5tdFJlcXVlc3RGcmFtZTsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBFUExfQ19ETExfTUlOU0laRV9OTVRSRVE7CS8vIHNpemVvZihObXRSZXF1ZXN0RnJhbWUpOworCisJLy8gc2VuZCBOTVQtUmVxdWVzdAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsQXN5bmNTZW5kKCZObXRSZXF1ZXN0RnJhbWVJbmZvLAkvLyBwb2ludGVyIHRvIGZyYW1laW5mbworCQkJCSAga0VwbERsbEFzeW5jUmVxUHJpb05tdCk7CS8vIHByaW9yaXR5CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdENudVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYgorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlciBDYWxsYmFjay1mdW5jdGlvbiBnbyBnZXQgaW5mb3JtZWQgYWJvdXQgYQorLy8gICAgICAgICAgICAgIE5NVC1DaGFuZ2UtU3RhdGUtRXZlbnQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3AgPSBmdW5jdGlvbnBvaW50ZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsTm10Q251UmVnaXN0ZXJDaGVja0V2ZW50Q2IodEVwbE5tdHVDaGVja0V2ZW50Q2FsbGJhY2sKKwkJCSAgICAgIHBmbkVwbE5tdENoZWNrRXZlbnRDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBzYXZlIGNhbGxiYWNrLWZ1bmN0aW9uIGluIG1vZHVsIGdsb2JhbCB2YXIKKwlFcGxObXRDbnVJbnN0YW5jZV9nLm1fcGZuQ2hlY2tFdmVudENiID0gcGZuRXBsTm10Q2hlY2tFdmVudENiX3A7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVDb21tYW5kQ2IKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIE5NVC1Db21tYW5kcworLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwRnJhbWVJbmZvX3AgPSBGcmFtZSB3aXRoIHRoZSBOTVQtQ29tbWFuZG8KKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251Q29tbWFuZENiKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCUJPT0wgZk5vZGVJZEluTGlzdDsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQgPSBrRXBsTm10RXZlbnROb0V2ZW50OworCisJaWYgKHBGcmFtZUluZm9fcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxObXRJbnZhbGlkRnJhbWVQb2ludGVyOworCQlnb3RvIEV4aXQ7CisJfQorCisJTm10Q29tbWFuZCA9IEVwbE5tdENudUdldE5tdENvbW1hbmQocEZyYW1lSW5mb19wKTsKKworCS8vIGNoZWNrIE5NVC1Db21tYW5kCisJc3dpdGNoIChObXRDb21tYW5kKSB7CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gcGxhaW4gTk1UIHN0YXRlIGNvbW1hbmRzCisJY2FzZSBrRXBsTm10Q21kU3RhcnROb2RlOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRTdGFydE5vZGUKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3RhcnROb2RlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFN0b3BOb2RlOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRTdG9wTm9kZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTdG9wTm9kZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRFbnRlclByZU9wZXJhdGlvbmFsMjoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDIKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDI7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCXsJCS8vIHNlbmQgTk1ULUV2ZW50IHRvIHN0YXRlIG1hc2NoaW5lIGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50UmVzZXROb2RlCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Tm9kZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb246CisJCXsJCS8vIHNlbmQgTk1ULUV2ZW50IHRvIHN0YXRlIG1hc2NoaW5lIGtFcGxObXRFdmVudFJlc2V0Q29tCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Q29tOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50UmVzZXRDb25maWcKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50UmVzZXRDb25maWc7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kU3dSZXNldDoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50U3dSZXNldAorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTd1Jlc2V0OworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBleHRlbmRlZCBOTVQgc3RhdGUgY29tbWFuZHMKKworCWNhc2Uga0VwbE5tdENtZFN0YXJ0Tm9kZUV4OgorCQl7CisJCQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJgorCQkJCQkJKHBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCSBtX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJIG1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQkgbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKSk7CisJCQlpZiAoZk5vZGVJZEluTGlzdCAhPSBGQUxTRSkgewkvLyBvd24gbm9kZWlkIGluIGxpc3QKKwkJCQkvLyBzZW5kIGV2ZW50IHRvIHByb2Nlc3MgY29tbWFuZAorCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3RhcnROb2RlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFN0b3BOb2RlRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN0b3BOb2RlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVudGVyUHJlT3BlcmF0aW9uYWwyOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZUV4OgorCQl7CQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCW1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQltX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJCQkJbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKTsKKwkJCWlmIChmTm9kZUlkSW5MaXN0ICE9IEZBTFNFKSB7CS8vIG93biBub2RlaWQgaW4gbGlzdAorCQkJCS8vIHNlbmQgZXZlbnQgdG8gcHJvY2VzcyBjb21tYW5kCisJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRSZXNldE5vZGU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Q29tOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbkV4OgorCQl7CQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCW1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQltX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJCQkJbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKTsKKwkJCWlmIChmTm9kZUlkSW5MaXN0ICE9IEZBTFNFKSB7CS8vIG93biBub2RlaWQgaW4gbGlzdAorCQkJCS8vIHNlbmQgZXZlbnQgdG8gcHJvY2VzcyBjb21tYW5kCisJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRTd1Jlc2V0RXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN3UmVzZXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE5NVCBtYW5hZ2luZyBjb21tYW5kcworCisJCS8vIFRPRE86IGFkZCBmdW5jdGlvbnMgdG8gcHJvY2VzcyBtYW5hZ2luZyBjb21tYW5kIChvcHRpb25hbCkKKworCWNhc2Uga0VwbE5tdENtZE5ldEhvc3ROYW1lU2V0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kRmx1c2hBcnBFbnRyeToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBOTVQgaW5mbyBzZXJ2aWNlcworCisJCS8vIFRPRE86IGZvcndhcmQgZXZlbnQgd2l0aCBpbmZvcyB0byB0aGUgYXBwbGljYXRpb24gKG9wdGlvbmFsKQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaENvbmZpZ3VyZWRDTjoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFB1Ymxpc2hBY3RpdmVDTjoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFB1Ymxpc2hQcmVPcGVyYXRpb25hbDE6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFJlYWR5VG9PcGVyYXRlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaE9wZXJhdGlvbmFsOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFN0b3BwZWQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoRW1lcmdlbmN5TmV3OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFRpbWU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBlcnJvciBmcm9tIE1OCisJCS8vIC0+IHJlcXVlc3RlZCBjb21tYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTU4KKwljYXNlIGtFcGxObXRDbWRJbnZhbGlkU2VydmljZToKKwkJeworCisJCQkvLyBUT0RPOiBlcnJvcmV2ZW50IHRvIGFwcGxpY2F0aW9uCisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGRlZmF1bHQKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsTm10VW5rbm93bkNvbW1hbmQ7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKE5tdENvbW1hbmQpCisKKwlpZiAoTm10RXZlbnQgIT0ga0VwbE5tdEV2ZW50Tm9FdmVudCkgeworCQlpZiAoRXBsTm10Q251SW5zdGFuY2VfZy5tX3BmbkNoZWNrRXZlbnRDYiAhPSBOVUxMKSB7CisJCQlSZXQgPSBFcGxObXRDbnVJbnN0YW5jZV9nLm1fcGZuQ2hlY2tFdmVudENiKE5tdEV2ZW50KTsKKwkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQl9CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQlSZXQgPSBFcGxObXR1Tm10RXZlbnQoTm10RXZlbnQpOworI2VuZGlmCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10Q251R2V0Tm10Q29tbWFuZCgpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIE5NVC1Db21tYW5kIGZyb20gdGhlIGZyYW1lCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBGcmFtZUluZm9fcCA9IHBvaW50ZXIgdG8gdGhlIEZyYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIE5NVC1Db21tYW5kCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbE5tdENvbW1hbmQgPSBOTVQtQ29tbWFuZAorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxObXRDb21tYW5kIEVwbE5tdENudUdldE5tdENvbW1hbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCXRFcGxObXRDb21tYW5kU2VydmljZSAqcE5tdENvbW1hbmRTZXJ2aWNlOworCisJcE5tdENvbW1hbmRTZXJ2aWNlID0KKwkgICAgJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCSAgICBtX05tdENvbW1hbmRTZXJ2aWNlOworCisJTm10Q29tbWFuZCA9CisJICAgICh0RXBsTm10Q29tbWFuZCkgQW1pR2V0Qnl0ZUZyb21MZSgmcE5tdENvbW1hbmRTZXJ2aWNlLT4KKwkJCQkJICAgICAgbV9sZV9iTm10Q29tbWFuZElkKTsKKworCXJldHVybiBObXRDb21tYW5kOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVOb2RlSWRMaXN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2sgaWYgdGhlIG93biBub2RlaWQgaXMgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcGJObXRDb21tYW5kRGF0ZV9wID0gcG9pbnRlciB0byB0aGUgZGF0YSBvZiB0aGUgTk1UIENvbW1hbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICBCT09MID0gVFJVRSBpZiBub2RlaWQgaXMgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIGlmIG5vZGVpZCBub3Qgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBCT09MIEVwbE5tdENudU5vZGVJZExpc3QoQllURSAqIHBiTm10Q29tbWFuZERhdGVfcCkKK3sKKwlCT09MIGZOb2RlSWRJbkxpc3Q7CisJdW5zaWduZWQgaW50IHVpQnl0ZU9mZnNldDsKKwlCWVRFIGJCaXRPZmZzZXQ7CisJQllURSBiTm9kZUxpc3RCeXRlOworCisJLy8gZ2V0IGJ5dGUtb2Zmc2V0IG9mIHRoZSBvd24gbm9kZWlkIGluIE5vZGVJZExpc3QKKwkvLyBkZXZpZGUgdGhvdWdoIDgKKwl1aUJ5dGVPZmZzZXQgPSAodW5zaWduZWQgaW50KShFcGxObXRDbnVJbnN0YW5jZV9nLm1fdWlOb2RlSWQgPj4gMyk7CisJLy8gZ2V0IGJpdG9mZnNldAorCWJCaXRPZmZzZXQgPSAoQllURSkgRXBsTm10Q251SW5zdGFuY2VfZy5tX3VpTm9kZUlkICUgODsKKworCWJOb2RlTGlzdEJ5dGUgPSBBbWlHZXRCeXRlRnJvbUxlKCZwYk5tdENvbW1hbmREYXRlX3BbdWlCeXRlT2Zmc2V0XSk7CisJaWYgKChiTm9kZUxpc3RCeXRlICYgYkJpdE9mZnNldCkgPT0gMCkgeworCQlmTm9kZUlkSW5MaXN0ID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJZk5vZGVJZEluTGlzdCA9IFRSVUU7CisJfQorCisJcmV0dXJuIGZOb2RlSWRJbkxpc3Q7Cit9CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRNbnUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10TW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMGI2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10TW51LmMKQEAgLTAsMCArMSwyODM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIE5NVC1NTi1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXRNbnUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTggJCAgJERhdGU6IDIwMDgvMTEvMTkgMDk6NTI6MjQgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorI2luY2x1ZGUgInVzZXIvRXBsSWRlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxTdGF0dXN1LmgiCisjaW5jbHVkZSAidXNlci9FcGxPYmR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSA9PSAwKSAmJiAoRVBMX09CRF9VU0VfS0VSTkVMID09IEZBTFNFKQorI2Vycm9yICJFUEwgTm10TW51IG1vZHVsZSBuZWVkcyBFUEwgbW9kdWxlIE9CRFUgb3IgT0JESyEiCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCisjZW5kaWYKKyNkZWZpbmUgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShFdmVudF9wLCB1aU5vZGVJZF9wLCB3RXJyb3JDb2RlX3ApIFwKKyAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKGtFcGxFdmVudFNpbmtObXRNbnUgPDwgMjgpIHwgKEV2ZW50X3AgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodWlOb2RlSWRfcCA8PCAxNikgfCB3RXJyb3JDb2RlX3ApCisKKy8vIGRlZmluZXMgZm9yIGZsYWdzIGluIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST04gICAgICAgMHgwMDAxCS8vIENOIGlzIGJlaW5nIGFjY2Vzc2VkIGlzb2Nocm9ub3VzbHkKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQgICAgMHgwMDAyCS8vIENOIHdhcyBub3Qgc2Nhbm5lZCBvbmNlIC0+IGRlY3JlbWVudCBTaWduYWxDb3VudGVyIGFuZCByZXNldCBmbGFnCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0hBTFRFRCAgICAgICAgIDB4MDAwNAkvLyBib290IHByb2Nlc3MgZm9yIHRoaXMgQ04gaXMgaGFsdGVkCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05NVF9DTURfSVNTVUVEIDB4MDAwOAkvLyBOTVQgY29tbWFuZCB3YXMganVzdCBpc3N1ZWQsIHdyb25nIE5NVCBzdGF0ZXMgd2lsbCBiZSB0b2xlcmF0ZWQKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSAgMHgwMzAwCS8vIGNvdW50ZXIgZm9yIFN0YXR1c1JlcXVlc3QgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUiAgIDB4MEMwMAkvLyBjb3VudGVyIGZvciBsb25nZXIgdGltZW91dHMgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19TVEFUUkVRICAgIDB4MDEwMAkvLyBpbmNyZW1lbnQgZm9yIFN0YXR1c1JlcXVlc3QgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19MT05HRVIgICAgIDB4MDQwMAkvLyBpbmNyZW1lbnQgZm9yIGxvbmdlciB0aW1lb3V0cyB0aW1lciBoYW5kbGUKKwkJICAgIC8vIFRoZXNlIGNvdW50ZXJzIHdpbGwgYmUgaW5jcmVtZW50ZWQgYXQgZXZlcnkgdGltZXIgc3RhcnQKKwkJICAgIC8vIGFuZCBjb3BpZWQgdG8gdGltZXJhcmcuIFdoZW4gdGhlIHRpbWVyIGV2ZW50IG9jY3VyZXMKKwkJICAgIC8vIGJvdGggd2lsbCBiZSBjb21wYXJlZCBhbmQgaWYgdW5lcXVhbCB0aGUgdGltZXIgZXZlbnQKKwkJICAgIC8vIHdpbGwgYmUgZGlzY2FyZGVkLCBiZWNhdXNlIGl0IGlzIGFuIG9sZCBvbmUuCisKKy8vIGRlZmluZXMgZm9yIHRpbWVyIGFyZ3VtZW50cyB0byBkcmF3IGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzZXJ2ZXJhbCBldmVudHMKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19OT0RFX01BU0sgICAweDAwMDAwMEZGTAkvLyBtYXNrIHRoYXQgY29udGFpbnMgdGhlIG5vZGUtSUQKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19JREVOVFJFUSAgICAweDAwMDEwMDAwTAkvLyB0aW1lciBldmVudCBpcyBmb3IgSWRlbnRSZXF1ZXN0CisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSAgICAgMHgwMDAyMDAwMEwJLy8gdGltZXIgZXZlbnQgaXMgZm9yIFN0YXR1c1JlcXVlc3QKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19MT05HRVIgICAgICAweDAwMDQwMDAwTAkvLyB0aW1lciBldmVudCBpcyBmb3IgbG9uZ2VyIHRpbWVvdXRzCisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVEVfTU9OICAgMHgwMDA4MDAwMEwJLy8gdGltZXIgZXZlbnQgZm9yIFN0YXR1c1JlcXVlc3QgdG8gbW9uaXRvciBleGVjdXRpb24gb2YgTk1UIHN0YXRlIGNoYW5nZXMKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUiAgICAweDAwMDAwMzAwTAkvLyBjb3VudGVyIGZvciBTdGF0dXNSZXF1ZXN0CisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfTE8gICAgMHgwMDAwMEMwMEwJLy8gY291bnRlciBmb3IgbG9uZ2VyIHRpbWVvdXRzCisJCSAgICAvLyBUaGUgY291bnRlcnMgbXVzdCBoYXZlIHRoZSBzYW1lIHBvc2l0aW9uIGFzIGluIHRoZSBub2RlIGZsYWdzIGFib3ZlLgorCisjZGVmaW5lIEVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX1NUQVRSRVEocE5vZGVJbmZvX3AsIHVpTm9kZUlkX3AsIFRpbWVyQXJnX3ApIFwKKyAgICBwTm9kZUluZm9fcC0+bV93RmxhZ3MgPSBcCisgICAgICAgICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICsgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX1NUQVRSRVEpIFwKKyAgICAgICAgICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgXAorICAgICAgICB8IChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX1NUQVRSRVEgfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworI2RlZmluZSBFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19JREVOVFJFUShwTm9kZUluZm9fcCwgdWlOb2RlSWRfcCwgVGltZXJBcmdfcCkgXAorICAgIHBOb2RlSW5mb19wLT5tX3dGbGFncyA9IFwKKyAgICAgICAgKChwTm9kZUluZm9fcC0+bV93RmxhZ3MgKyBFUExfTk1UTU5VX05PREVfRkxBR19JTkNfU1RBVFJFUSkgXAorICAgICAgICAgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSBcCisgICAgICAgIHwgKHBOb2RlSW5mb19wLT5tX3dGbGFncyAmIH5FUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKTsgXAorICAgIFRpbWVyQXJnX3AubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfSURFTlRSRVEgfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworI2RlZmluZSBFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19MT05HRVIocE5vZGVJbmZvX3AsIHVpTm9kZUlkX3AsIFRpbWVyQXJnX3ApIFwKKyAgICBwTm9kZUluZm9fcC0+bV93RmxhZ3MgPSBcCisgICAgICAgICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICsgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX0xPTkdFUikgXAorICAgICAgICAgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpIFwKKyAgICAgICAgfCAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUik7IFwKKyAgICBUaW1lckFyZ19wLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0xPTkdFUiB8IHVpTm9kZUlkX3AgfCBcCisgICAgICAgIChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpOyBcCisgICAgVGltZXJBcmdfcC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRNbnU7CisKKyNkZWZpbmUgRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfU1RBVEVfTU9OKHBOb2RlSW5mb19wLCB1aU5vZGVJZF9wLCBUaW1lckFyZ19wKSBcCisgICAgcE5vZGVJbmZvX3AtPm1fd0ZsYWdzID0gXAorICAgICAgICAoKHBOb2RlSW5mb19wLT5tX3dGbGFncyArIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19TVEFUUkVRKSBcCisgICAgICAgICAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpIFwKKyAgICAgICAgfCAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpOyBcCisgICAgVGltZXJBcmdfcC5tX3VsQXJnID0gRVBMX05NVE1OVV9USU1FUkFSR19TVEFURV9NT04gfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworLy8gZGVmaW5lcyBmb3IgZ2xvYmFsIGZsYWdzCisjZGVmaW5lIEVQTF9OTVRNTlVfRkxBR19IQUxURUQgICAgICAgICAgMHgwMDAxCS8vIGJvb3QgcHJvY2VzcyBpcyBoYWx0ZWQKKyNkZWZpbmUgRVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRCAgICAweDAwMDIJLy8gYXBwbGljYXRpb24gd2FzIGluZm9ybWVkIGFib3V0IHBvc3NpYmxlIE5NVCBzdGF0ZSBjaGFuZ2UKKworLy8gcmV0dXJuIHBvaW50ZXIgdG8gbm9kZSBpbmZvIHN0cnVjdHVyZSBmb3Igc3BlY2lmaWVkIG5vZGUgSUQKKy8vIGQuay4gbWF5IGJlIHJlcGxhY2VkIGJ5IHNwZWNpYWwgKGhhc2gpIGZ1bmN0aW9uIGlmIG5vZGUgSUQgYXJyYXkgaXMgc21hbGxlciB0aGFuIDI1NAorI2RlZmluZSBFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aU5vZGVJZF9wKSAoJkVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm9bdWlOb2RlSWRfcCAtIDFdKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE1udUludE5vZGVFdmVudE5vSWRlbnRSZXNwb25zZSA9IDB4MDAsCisJa0VwbE5tdE1udUludE5vZGVFdmVudElkZW50UmVzcG9uc2UgPSAweDAxLAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290ID0gMHgwMiwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50RXhlY1Jlc2V0ID0gMHgwMywKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50Q29uZmlndXJlZCA9IDB4MDQsCisJa0VwbE5tdE1udUludE5vZGVFdmVudE5vU3RhdHVzUmVzcG9uc2UgPSAweDA1LAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRTdGF0dXNSZXNwb25zZSA9IDB4MDYsCisJa0VwbE5tdE1udUludE5vZGVFdmVudEhlYXJ0YmVhdCA9IDB4MDcsCisJa0VwbE5tdE1udUludE5vZGVFdmVudE5tdENtZFNlbnQgPSAweDA4LAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lcklkZW50UmVxID0gMHgwOSwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0UmVxID0gMHgwQSwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0ZU1vbiA9IDB4MEIsCisJa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyTG9uZ2VyID0gMHgwQywKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50RXJyb3IgPSAweDBELAorCit9IHRFcGxObXRNbnVJbnROb2RlRXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd24gPSAweDAwLAorCWtFcGxObXRNbnVOb2RlU3RhdGVJZGVudGlmaWVkID0gMHgwMSwKKwlrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mID0gMHgwMiwJLy8gQ04gcmVzZXQgYWZ0ZXIgY29uZmlndXJhdGlvbiB1cGRhdGUKKwlrRXBsTm10TW51Tm9kZVN0YXRlQ29uZmlndXJlZCA9IDB4MDMsCS8vIEJvb3RTdGVwMSBjb21wbGV0ZWQKKwlrRXBsTm10TW51Tm9kZVN0YXRlUmVhZHlUb09wID0gMHgwNCwJLy8gQm9vdFN0ZXAyIGNvbXBsZXRlZAorCWtFcGxObXRNbnVOb2RlU3RhdGVDb21DaGVja2VkID0gMHgwNSwJLy8gQ29tbXVuaWNhdGlvbiBjaGVja2VkIHN1Y2Nlc3NmdWxseQorCWtFcGxObXRNbnVOb2RlU3RhdGVPcGVyYXRpb25hbCA9IDB4MDYsCS8vIENOIGlzIGluIE5NVCBzdGF0ZSBPUEVSQVRJT05BTAorCit9IHRFcGxObXRNbnVOb2RlU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJIZGwgbV9UaW1lckhkbFN0YXRSZXE7CS8vIHRpbWVyIHRvIGRlbGF5IFN0YXR1c1JlcXVlc3RzIGFuZCBJZGVudFJlcXVlc3RzCisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGxMb25nZXI7CS8vIDJuZCB0aW1lciBmb3IgTk1UIGNvbW1hbmQgRW5hYmxlUmVhZHlUb09wIGFuZCBDaGVja0NvbW11bmljYXRpb24KKwl0RXBsTm10TW51Tm9kZVN0YXRlIG1fTm9kZVN0YXRlOwkvLyBpbnRlcm5hbCBub2RlIHN0YXRlIChraW5kIG9mIHN1YiBzdGF0ZSBvZiBOTVQgc3RhdGUpCisJRFdPUkQgbV9kd05vZGVDZmc7CS8vIHN1YmluZGV4IGZyb20gMHgxRjgxCisJV09SRCBtX3dGbGFnczsJCS8vIGZsYWdzOiBDTiBpcyBiZWluZyBhY2Nlc3NlZCBpc29jaHJvbm91c2x5CisKK30gdEVwbE5tdE1udU5vZGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE5tdE1udU5vZGVJbmZvIG1fYU5vZGVJbmZvW0VQTF9OTVRfTUFYX05PREVfSURdOworCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsTm10U3RhdGU7CS8vIHRpbWVvdXQgZm9yIHN0YXkgaW4gTk1UIHN0YXRlCisJdW5zaWduZWQgaW50IG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50OworCXVuc2lnbmVkIGludCBtX3VpU2lnbmFsU2xhdmVDb3VudDsKKwl1bnNpZ25lZCBsb25nIG1fdWxTdGF0dXNSZXF1ZXN0RGVsYXk7CS8vIGluIFttc10gKG9iamVjdCAweDEwMDYgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRSkKKwl1bnNpZ25lZCBsb25nIG1fdWxUaW1lb3V0UmVhZHlUb09wOwkvLyBpbiBbbXNdIChvYmplY3QgMHgxRjg5LzUpCisJdW5zaWduZWQgbG9uZyBtX3VsVGltZW91dENoZWNrQ29tOwkvLyBpbiBbbXNdIChvYmplY3QgMHgxMDA2ICogTXVsdGlwbGV4ZWRDeWNsZUNvdW50KQorCVdPUkQgbV93RmxhZ3M7CQkvLyBnbG9iYWwgZmxhZ3MKKwlEV09SRCBtX2R3Tm10U3RhcnR1cDsJLy8gb2JqZWN0IDB4MUY4MCBOTVRfU3RhcnRVcF9VMzIKKwl0RXBsTm10TW51Q2JOb2RlRXZlbnQgbV9wZm5DYk5vZGVFdmVudDsKKwl0RXBsTm10TW51Q2JCb290RXZlbnQgbV9wZm5DYkJvb3RFdmVudDsKKworfSB0RXBsTm10TW51SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE5tdE1udUluc3RhbmNlIEVwbE5tdE1udUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JObXRSZXF1ZXN0KHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JJZGVudFJlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICB0RXBsSWRlbnRSZXNwb25zZSAqCisJCQkJCQkgIHBJZGVudFJlc3BvbnNlX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JTdGF0dXNSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgIHRFcGxTdGF0dXNSZXNwb25zZSAqCisJCQkJCQkgICBwU3RhdHVzUmVzcG9uc2VfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCwKKwkJCQkJIHRFcGxObXRTdGF0ZSBOb2RlTm10U3RhdGVfcCwKKwkJCQkJIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkgdEVwbE5tdFN0YXRlIExvY2FsTm10U3RhdGVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVN0YXJ0Qm9vdFN0ZXAxKHZvaWQpOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydEJvb3RTdGVwMih2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRDaGVja0NvbSh2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJIHRFcGxObXRNbnVOb2RlSW5mbyAqIHBOb2RlSW5mb19wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUNoZWNrQ29tKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQl0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVN0YXJ0Tm9kZXModm9pZCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbE5tdFN0YXRlIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJV09SRCB3RXJyb3JDb2RlX3AsCisJCQkJCQl0RXBsTm10TW51SW50Tm9kZUV2ZW50CisJCQkJCQlOb2RlRXZlbnRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVJlc2V0KHZvaWQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbE5tdE1udUluaXQodEVwbE5tdE1udUNiTm9kZUV2ZW50IHBmbkNiTm9kZUV2ZW50X3AsCisJCQkgdEVwbE5tdE1udUNiQm9vdEV2ZW50IHBmbkNiQm9vdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxObXRNbnVBZGRJbnN0YW5jZShwZm5DYk5vZGVFdmVudF9wLCBwZm5DYkJvb3RFdmVudF9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbE5tdE1udUFkZEluc3RhbmNlKHRFcGxObXRNbnVDYk5vZGVFdmVudCBwZm5DYk5vZGVFdmVudF9wLAorCQkJCXRFcGxObXRNbnVDYkJvb3RFdmVudCBwZm5DYkJvb3RFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxObXRNbnVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsTm10TW51SW5zdGFuY2VfZykpOworCisJaWYgKChwZm5DYk5vZGVFdmVudF9wID09IE5VTEwpIHx8IChwZm5DYkJvb3RFdmVudF9wID09IE5VTEwpKSB7CisJCVJldCA9IGtFcGxObXRJbnZhbGlkUGFyYW07CisJCWdvdG8gRXhpdDsKKwl9CisJRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50ID0gcGZuQ2JOb2RlRXZlbnRfcDsKKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fcGZuQ2JCb290RXZlbnQgPSBwZm5DYkJvb3RFdmVudF9wOworCisJLy8gaW5pdGlhbGl6ZSBTdGF0dXNSZXF1ZXN0IGRlbGF5CisJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsU3RhdHVzUmVxdWVzdERlbGF5ID0gNTAwMEw7CisKKwkvLyByZWdpc3RlciBObXRNblJlc3BvbnNlIGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0KKwkgICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10UmVxdWVzdCwKKwkJCQkgICAgIEVwbE5tdE1udUNiTm10UmVxdWVzdCwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxObXRNbnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlcmVnaXN0ZXIgTm10TW5SZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZE5tdFJlcXVlc3QsIE5VTEwsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworCisJUmV0ID0gRXBsTm10TW51UmVzZXQoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeAorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kcyB0aGUgc3BlY2lmaWVkIE5NVCBjb21tYW5kIHRvIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElEIHRvIHdoaWNoIHRoZSBOTVQgY29tbWFuZCB3aWxsIGJlIHNlbnQKKy8vICAgICAgICAgICAgICBObXRDb21tYW5kX3AgICAgICAgICAgICA9IE5NVCBjb21tYW5kCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgIHRFcGxObXRDb21tYW5kIE5tdENvbW1hbmRfcCwKKwkJCQkgICAgIHZvaWQgKnBObXRDb21tYW5kRGF0YV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCUJZVEUgYWJCdWZmZXJbRVBMX0NfRExMX01JTlNJWkVfTk1UQ01ERVhUXTsKKwl0RXBsRnJhbWUgKnBGcmFtZSA9ICh0RXBsRnJhbWUgKikgYWJCdWZmZXI7CisJQk9PTCBmU29mdERlbGV0ZU5vZGUgPSBGQUxTRTsKKworCWlmICgodWlOb2RlSWRfcCA9PSAwKSB8fCAodWlOb2RlSWRfcCA+IEVQTF9DX0FEUl9CUk9BRENBU1QpKSB7CS8vIGludmFsaWQgbm9kZSBJRCBzcGVjaWZpZWQKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBObXRDb21tYW5kRGF0YV9wICE9IE5VTEwpCisJICAgICYmICh1aURhdGFTaXplX3AgPgorCQkoRVBMX0NfRExMX01JTlNJWkVfTk1UQ01ERVhUIC0gRVBMX0NfRExMX01JTlNJWkVfTk1UQ01EKSkpIHsKKwkJUmV0ID0ga0VwbE5tdEludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKwkvLyAkJCQgZC5rLiBtYXkgYmUgY2hlY2sgaW4gZnV0dXJlIHZlcnNpb25zIGlmIHRoZSBjYWxsZXIgd2FudHMgdG8gcGVyZm9ybSBwcm9oaWJpdGVkIHN0YXRlIHRyYW5zaXRpb25zCisJLy8gICAgIHRoZSBDTiBzaG91bGQgbm90IHBlcmZvcm0gdGhlc2UgdHJhbnNpdGlvbnMsIGJ1dCB0aGUgZXhwZWN0ZWQgTk1UIHN0YXRlIHdpbGwgYmUgY2hhbmdlZCBhbmQgbmV2ZXIgZnVsbGZpbGxlZC4KKworCS8vIGJ1aWxkIGZyYW1lCisJRVBMX01FTVNFVChwRnJhbWUsIDB4MDAsIHNpemVvZihhYkJ1ZmZlcikpOworCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fbGVfYkRzdE5vZGVJZCwgKEJZVEUpIHVpTm9kZUlkX3ApOworCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkgICAgICAgKEJZVEUpIGtFcGxEbGxBc25kTm10Q29tbWFuZCk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9ObXRDb21tYW5kU2VydmljZS4KKwkJICAgICAgIG1fbGVfYk5tdENvbW1hbmRJZCwgKEJZVEUpIE5tdENvbW1hbmRfcCk7CisJaWYgKChwTm10Q29tbWFuZERhdGFfcCAhPSBOVUxMKSAmJiAodWlEYXRhU2l6ZV9wID4gMCkpIHsJLy8gY29weSBjb21tYW5kIGRhdGEgdG8gZnJhbWUKKwkJRVBMX01FTUNQWSgmcEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJICAgbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdLCBwTm10Q29tbWFuZERhdGFfcCwKKwkJCSAgIHVpRGF0YVNpemVfcCk7CisJfQorCS8vIGJ1aWxkIGluZm8gc3RydWN0dXJlCisJRnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3TmFub1NlYyA9IDA7CisJRnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3U2VjID0gMDsKKwlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBzaXplb2YoYWJCdWZmZXIpOworCisJLy8gc2VuZCBOTVQtUmVxdWVzdAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsQXN5bmNTZW5kKCZGcmFtZUluZm8sCS8vIHBvaW50ZXIgdG8gZnJhbWVpbmZvCisJCQkJICBrRXBsRGxsQXN5bmNSZXFQcmlvTm10KTsJLy8gcHJpb3JpdHkKKyNlbmRpZgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UyKCJOTVRDbWQoJTAyWC0+JTAyWClcbiIsIE5tdENvbW1hbmRfcCwKKwkJCQl1aU5vZGVJZF9wKTsKKworCXN3aXRjaCAoTm10Q29tbWFuZF9wKSB7CisJY2FzZSBrRXBsTm10Q21kU3RhcnROb2RlOgorCWNhc2Uga0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyOgorCWNhc2Uga0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlOgorCQl7CisJCQkvLyBub3RoaW5nIGxlZnQgdG8gZG8sCisJCQkvLyBiZWNhdXNlIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgZG9uZQorCQkJLy8gd2hlbiB0aGUgTk1UIGNvbW1hbmQgaXMgYWN0dWFsbHkgc2VudAorCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFcGxObXRDbWRTdG9wTm9kZToKKwkJeworCQkJZlNvZnREZWxldGVOb2RlID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRSZXNldE5vZGU6CisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uOgorCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwljYXNlIGtFcGxObXRDbWRTd1Jlc2V0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJZ290byBFeGl0OworCX0KKworCS8vIHJlbW92ZSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlOworCS8vIFRoaXMgbXVzdCBiZSBkb25lIGhlcmUgYW5kIG5vdCB3aGVuIE5NVCBjb21tYW5kIGlzIGFjdHVhbGx5IHNlbnQKKwkvLyBiZWNhdXNlIGl0IHdpbGwgYmUgdG9vIGxhdGUgYW5kIG1heSBjYXVzZSB1bndhbnRlZCBlcnJvcnMKKwlpZiAodWlOb2RlSWRfcCAhPSBFUExfQ19BRFJfQlJPQURDQVNUKSB7CisJCWlmIChmU29mdERlbGV0ZU5vZGUgPT0gRkFMU0UpIHsJLy8gcmVtb3ZlIENOIGltbWVkaWF0ZWx5IGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCVJldCA9IEVwbERsbHVDYWxEZWxldGVOb2RlKHVpTm9kZUlkX3ApOworCQl9IGVsc2UgewkvLyByZW1vdmUgQ04gZnJvbSBpc29jaHJvbm91cyBwaGFzZSBzb2Z0bHkKKwkJCVJldCA9IEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSh1aU5vZGVJZF9wKTsKKwkJfQorCX0gZWxzZSB7CQkvLyBkbyBpdCBmb3IgYWxsIGFjdGl2ZSBDTnMKKwkJZm9yICh1aU5vZGVJZF9wID0gMTsKKwkJICAgICB1aU5vZGVJZF9wIDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJCSAgICAgdWlOb2RlSWRfcCsrKSB7CisJCQlpZiAoKEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkX3ApLT4KKwkJCSAgICAgbV9kd05vZGVDZmcgJiAoRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiB8CisJCQkJCSAgICBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUykpICE9IDApIHsKKwkJCQlpZiAoZlNvZnREZWxldGVOb2RlID09IEZBTFNFKSB7CS8vIHJlbW92ZSBDTiBpbW1lZGlhdGVseSBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCVJldCA9IEVwbERsbHVDYWxEZWxldGVOb2RlKHVpTm9kZUlkX3ApOworCQkJCX0gZWxzZSB7CS8vIHJlbW92ZSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlIHNvZnRseQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsRGxsdUNhbFNvZnREZWxldGVOb2RlCisJCQkJCSAgICAodWlOb2RlSWRfcCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kCisvLworLy8gRGVzY3JpcHRpb246IHNlbmRzIHRoZSBzcGVjaWZpZWQgTk1UIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgdG8gd2hpY2ggdGhlIE5NVCBjb21tYW5kIHdpbGwgYmUgc2VudAorLy8gICAgICAgICAgICAgIE5tdENvbW1hbmRfcCAgICAgICAgICAgID0gTk1UIGNvbW1hbmQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCVJldCA9IEVwbE5tdE1udVNlbmRObXRDb21tYW5kRXgodWlOb2RlSWRfcCwgTm10Q29tbWFuZF9wLCBOVUxMLCAwKTsKKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVRyaWdnZXJTdGF0ZUNoYW5nZQorLy8KKy8vIERlc2NyaXB0aW9uOiB0cmlnZ2VycyB0aGUgc3BlY2lmaWVkIG5vZGUgY29tbWFuZCBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIHRoZSBub2RlIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZAorLy8gICAgICAgICAgICAgIE5vZGVDb21tYW5kX3AgICAgICAgICAgID0gbm9kZSBjb21tYW5kCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTm10TW51VHJpZ2dlclN0YXRlQ2hhbmdlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgICB0RXBsTm10Tm9kZUNvbW1hbmQgTm9kZUNvbW1hbmRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRNbnVJbnROb2RlRXZlbnQgTm9kZUV2ZW50OworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiTm10U3RhdGU7CisJV09SRCB3RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisKKwlpZiAoKHVpTm9kZUlkX3AgPT0gMCkgfHwgKHVpTm9kZUlkX3AgPj0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlzd2l0Y2ggKE5vZGVDb21tYW5kX3ApIHsKKwljYXNlIGtFcGxObXROb2RlQ29tbWFuZEJvb3Q6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290OworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE5vZGVDb21tYW5kQ29uZk9rOgorCQl7CisJCQlOb2RlRXZlbnQgPSBrRXBsTm10TW51SW50Tm9kZUV2ZW50Q29uZmlndXJlZDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXROb2RlQ29tbWFuZENvbmZFcnI6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRFcnJvcjsKKwkJCXdFcnJvckNvZGUgPSBFUExfRV9OTVRfQlBPMV9DRl9WRVJJRlk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Tm9kZUNvbW1hbmRDb25mUmVzZXQ6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRFeGVjUmVzZXQ7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJewkJLy8gaW52YWxpZCBub2RlIGNvbW1hbmQKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIGZldGNoIGN1cnJlbnQgTk1UIHN0YXRlCisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZF9wLAorCQkJCQkgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICB3RXJyb3JDb2RlLCBOb2RlRXZlbnQpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiTm10U3RhdGVDaGFuZ2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIE5NVCBzdGF0ZSBjaGFuZ2VzCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlQ2hhbmdlX3AgICAgICAgID0gTk1UIHN0YXRlIGNoYW5nZSBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZSh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZQorCQkJCQkgICAgTm10U3RhdGVDaGFuZ2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZG8gd29yayB3aGljaCBtdXN0IGJlIGRvbmUgaW4gdGhhdCBzdGF0ZQorCXN3aXRjaCAoTm10U3RhdGVDaGFuZ2VfcC5tX05ld05tdFN0YXRlKSB7CisJCS8vIEVQTCBzdGFjayBpcyBub3QgcnVubmluZworLyogICAgICAgIGNhc2Uga0VwbE5tdEdzT2ZmOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKyAgICAgICAgY2FzZSBrRXBsTm10R3NJbml0aWFsaXNpbmc6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBpbml0IG9mIHRoZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgcHJvZmlsZSBhcmVhIGFuZCB0aGUKKyAgICAgICAgLy8gc3RhbmRhcmRpc2VkIGRldmljZSBwcm9maWxlIGFyZWEKKyAgICAgICAgY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXQgb2YgdGhlIGNvbW11bmljYXRpb24gcHJvZmlsZSBhcmVhCisgICAgICAgIGNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorKi8KKwkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCXsKKwkJCURXT1JEIGR3VGltZW91dDsKKwkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwkJCS8vIHJlYWQgb2JqZWN0IDB4MUY4MCBOTVRfU3RhcnRVcF9VMzIKKwkJCU9iZFNpemUgPSA0OworCQkJUmV0ID0KKwkJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4MCwgMCwKKwkJCQkJICAgICAmRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX2R3Tm10U3RhcnR1cCwgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gY29tcHV0ZSBTdGF0dXNSZXFEZWxheSA9IG9iamVjdCAweDEwMDYgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRQorCQkJT2JkU2l6ZSA9IHNpemVvZihkd1RpbWVvdXQpOworCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDEwMDYsIDAsICZkd1RpbWVvdXQsICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkd1RpbWVvdXQgIT0gMEwpIHsKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxTdGF0dXNSZXF1ZXN0RGVsYXkgPQorCQkJCSAgICBkd1RpbWVvdXQgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRSAvIDEwMDBMOworCQkJCWlmIChFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5ID09IDBMKSB7CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFN0YXR1c1JlcXVlc3REZWxheSA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJCS8vICQkJCBmZXRjaCBhbmQgdXNlIE11bHRpcGxleGVkQ3ljbGVDb3VudCBmcm9tIE9ECisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dENoZWNrQ29tID0KKwkJCQkgICAgZHdUaW1lb3V0ICogRVBMX0NfTk1UX1NUQVRSRVFfQ1lDTEUgLyAxMDAwTDsKKwkJCQlpZiAoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dENoZWNrQ29tID09CisJCQkJICAgIDBMKSB7CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRDaGVja0NvbSA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJfQorCQkJLy8gZmV0Y2ggUmVhZHlUb09wIFRpbWVvdXQgZnJvbSBPRAorCQkJT2JkU2l6ZSA9IHNpemVvZihkd1RpbWVvdXQpOworCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGODksIDUsICZkd1RpbWVvdXQsICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkd1RpbWVvdXQgIT0gMEwpIHsKKwkJCQkvLyBjb252ZXJ0IFt1c10gdG8gW21zXQorCQkJCWR3VGltZW91dCAvPSAxMDAwTDsKKwkJCQlpZiAoZHdUaW1lb3V0ID09IDBMKSB7CisJCQkJCWR3VGltZW91dCA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRSZWFkeVRvT3AgPQorCQkJCSAgICBkd1RpbWVvdXQ7CisJCQl9IGVsc2UgeworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRSZWFkeVRvT3AgPSAwTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisvKgorICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENOIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworICAgICAgICAvLyBub2RlIGxpc3RlIGZvciBFUEwtRnJhbWVzIGFuZCBjaGVjayB0aW1lb3V0CisgICAgICAgIGNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vZGUgcHJvY2VzcyBvbmx5IGFzeW5jIGZyYW1lcworICAgICAgICBjYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBub2RlIHByb2Nlc3MgaXNvY2hyb251cyBhbmQgYXN5bmNocm9udXMgZnJhbWVzCisgICAgICAgIGNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vZGUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdW5kIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisgICAgICAgIGNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm9ybWFsIHdvcmsgc3RhdGUKKyAgICAgICAgY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBub2RlIHN0b3BwZWQgYnkgTU4KKyAgICAgICAgLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbnVzIGZyYW1lcworICAgICAgICBjYXNlIGtFcGxObXRDc1N0b3BwZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gRVBMIGN5Y2xlCisgICAgICAgIC8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisgICAgICAgIGNhc2Uga0VwbE5tdENzQmFzaWNFdGhlcm5ldDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyovCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gTU4gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisJCS8vIG5vZGUgbGlzdGVucyBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2Vzc2VzIG9ubHkgYXN5bmMgZnJhbWVzCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCXsKKwkJCURXT1JEIGR3VGltZW91dDsKKwkJCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKwkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQl0RXBsRXZlbnQgRXZlbnQ7CisKKwkJCS8vIGNsZWFyIGdsb2JhbCBmbGFncywgZS5nLiByZWVuYWJsZSBib290IHByb2Nlc3MKKwkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgPSAwOworCisJCQkvLyByZXNldCBJZGVudFJlc3BvbnNlcyBhbmQgcnVubmluZyBJZGVudFJlcXVlc3RzIGFuZCBTdGF0dXNSZXF1ZXN0cworCQkJUmV0ID0gRXBsSWRlbnR1UmVzZXQoKTsKKwkJCVJldCA9IEVwbFN0YXR1c3VSZXNldCgpOworCisJCQkvLyByZXNldCB0aW1lcnMKKwkJCVJldCA9IEVwbE5tdE1udVJlc2V0KCk7CisKKwkJCS8vIDIwMDgvMTEvMTggZC5rLiByZXNldCBpbnRlcm5hbCBub2RlIGluZm8gaXMgbm90IG5lY2Vzc2FyeSwKKwkJCS8vICAgICAgICAgICAgICAgICBiZWNhdXNlIHRpbWVyIGZsYWdzIGFyZSBpbXBvcnRhbnQgYW5kIG90aGVyCisJCQkvLyAgICAgICAgICAgICAgICAgdGhpbmdzIGFyZSByZXNldCBieSBFcGxObXRNbnVTdGFydEJvb3RTdGVwMSgpLgorLyoKKyAgICAgICAgICAgIEVQTF9NRU1TRVQoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKSk7CisqLworCisJCQkvLyBpbmZvcm0gRExMIGFib3V0IE5NVCBzdGF0ZSBjaGFuZ2UsCisJCQkvLyBzbyB0aGF0IGl0IGNhbiBjbGVhciB0aGUgYXN5bmNob25vdXMgcXVldWVzIGFuZCBzdGFydCB0aGUgcmVkdWNlZCBjeWNsZQorCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtTdGFydFJlZHVjZWRDeWNsZTsKKwkJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwKKwkJCQkgICBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCQlFdmVudC5tX3BBcmcgPSBOVUxMOworCQkJRXZlbnQubV91aVNpemUgPSAwOworCQkJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gcmVzZXQgYWxsIG5vZGVzCisJCQkvLyBkLmsuOiBza2lwIHRoaXMgc3RlcCBpZiB3YXMganVzdCBkb25lIGJlZm9yZSwgZS5nLiBiZWNhdXNlIG9mIGEgUmVzZXROb2RlIGNvbW1hbmQgZnJvbSBhIGRpYWdub3N0aWMgbm9kZQorCQkJaWYgKE5tdFN0YXRlQ2hhbmdlX3AubV9ObXRFdmVudCA9PQorCQkJICAgIGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDEpIHsKKwkJCQlCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSg5KTsKKworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoMCwKKwkJCQkJCQkJRVBMX0NfQURSX0JST0FEQ0FTVCwKKwkJCQkJCQkJa0VwbE5tdENtZFJlc2V0Tm9kZSk7CisKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZChFUExfQ19BRFJfQlJPQURDQVNULAorCQkJCQkJCSAgICBrRXBsTm10Q21kUmVzZXROb2RlKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIHN0YXJ0IG5ldHdvcmsgc2NhbgorCQkJUmV0ID0gRXBsTm10TW51U3RhcnRCb290U3RlcDEoKTsKKworCQkJLy8gc3RhcnQgdGltZXIgZm9yIDB4MUY4OS8yIE1OVGltZW91dFByZU9wMV9VMzIKKwkJCU9iZFNpemUgPSBzaXplb2YoZHdUaW1lb3V0KTsKKwkJCVJldCA9IEVwbE9iZHVSZWFkRW50cnkoMHgxRjg5LCAyLCAmZHdUaW1lb3V0LCAmT2JkU2l6ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZHdUaW1lb3V0ICE9IDBMKSB7CisJCQkJZHdUaW1lb3V0IC89IDEwMDBMOworCQkJCWlmIChkd1RpbWVvdXQgPT0gMEwpIHsKKwkJCQkJZHdUaW1lb3V0ID0gMUw7CS8vIGF0IGxlYXN0IDEgbXMKKwkJCQl9CisJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworCQkJCVRpbWVyQXJnLm1fdWxBcmcgPSAwOworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJkVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkJICAgbV9UaW1lckhkbE5tdFN0YXRlLAorCQkJCQkJCSAgIGR3VGltZW91dCwgVGltZXJBcmcpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQkvLyBhZGQgaWRlbnRpZmllZCBDTnMgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJCS8vIHNlbmQgRW5hYmxlUmVhZHlUb09wIHRvIGFsbCBpZGVudGlmaWVkIENOcworCQkJUmV0ID0gRXBsTm10TW51U3RhcnRCb290U3RlcDIoKTsKKworCQkJLy8gd2FpdCBmb3IgTk1UIHN0YXRlIGNoYW5nZSBvZiBDTnMKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQkvLyBjaGVjayBpZiBQUmVzIG9mIENOcyBhcmUgT0sKKwkJCS8vIGQuay4gdGhhdCBtZWFucyB3YWl0IEN5Y2xlTGVuZ3RoICogTXVsdGlwbGV4Q3ljbGVDb3VudCAoaS5lLiBzdGFydCB0aW1lcikKKwkJCS8vICAgICAgYmVjYXVzZSBEbGxrIGNoZWNrcyBQUmVzIG9mIENOcyBhdXRvbWF0aWNhbGx5IGluIFJlYWR5VG9PcAorCQkJUmV0ID0gRXBsTm10TW51U3RhcnRDaGVja0NvbSgpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCXsKKwkJCS8vIHNlbmQgU3RhcnROb2RlIHRvIENOcworCQkJLy8gd2FpdCBmb3IgTk1UIHN0YXRlIGNoYW5nZSBvZiBDTnMKKwkJCVJldCA9IEVwbE5tdE1udVN0YXJ0Tm9kZXMoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm8gRVBMIGN5Y2xlCisJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworLy8gICAgICAgICAgICBUUkFDRTAoIkVwbE5tdE1udUNiTm10U3RhdGVDaGFuZ2UoKTogdW5oYW5kbGVkIE5NVCBzdGF0ZVxuIik7CisJCX0KKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVDYkNoZWNrRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIE5NVCBldmVudHMgYmVmb3JlIHRoZXkgYXJlIGFjdHVhbGx5IGV4ZWN1dGVkLgorLy8gICAgICAgICAgICAgIFRoZSBFUEwgQVBJIGxheWVyIG11c3QgZm9yd2FyZCBOTVQgZXZlbnRzIGZyb20gTm10Q251IG1vZHVsZS4KKy8vICAgICAgICAgICAgICBUaGlzIG1vZHVsZSB3aWxsIHJlamVjdCBzb21lIE5NVCBjb21tYW5kcyB3aGlsZSBNTi4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgTm10RXZlbnRfcCAgICAgICAgICAgICAgPSBvdXRzdGFuZGluZyBOTVQgZXZlbnQgZm9yIGFwcHJvdmFsCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gICAgICAgICAgICAgICAgICAgICAga0VwbFJlamVjdCAgICAgID0gcmVqZWN0IHRoZSBOTVQgZXZlbnQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYkNoZWNrRXZlbnQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVQcm9jZXNzRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIGV2ZW50IHF1ZXVlCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICA9IHBvaW50ZXIgdG8gZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJvY2VzcyBldmVudAorCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJCS8vIHRpbWVyIGV2ZW50CisJY2FzZSBrRXBsRXZlbnRUeXBlVGltZXI6CisJCXsKKwkJCXRFcGxUaW1lckV2ZW50QXJnICpwVGltZXJFdmVudEFyZyA9CisJCQkgICAgKHRFcGxUaW1lckV2ZW50QXJnICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKwkJCXVpTm9kZUlkID0KKwkJCSAgICAodW5zaWduZWQgaW50KShwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgIG1fdWxBcmcgJgorCQkJCQkgICBFUExfTk1UTU5VX1RJTUVSQVJHX05PREVfTUFTSyk7CisJCQlpZiAodWlOb2RlSWQgIT0gMCkgeworCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJQllURSBiTm10U3RhdGU7CisJCQkJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwkJCQlwTm9kZUluZm8gPSBFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aU5vZGVJZCk7CisKKwkJCQlPYmRTaXplID0gMTsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RSwgdWlOb2RlSWQsCisJCQkJCQkgICAgICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICgocFRpbWVyRXZlbnRBcmctPgorCQkJCSAgICAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfSURFTlRSRVEpICE9CisJCQkJICAgIDBMKSB7CisJCQkJCWlmICgocE5vZGVJbmZvLT4KKwkJCQkJICAgICBtX3dGbGFncyAmCisJCQkJCSAgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkKKwkJCQkJICAgICE9IChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpKSB7CS8vIHRoaXMgaXMgYW4gb2xkIChhbHJlYWR5IGRlbGV0ZWQgb3IgbW9kaWZpZWQpIHRpbWVyCisJCQkJCQkvLyBidXQgbm90IHRoZSBjdXJyZW50IHRpbWVyCisJCQkJCQkvLyBzbyBkaXNjYXJkIGl0CisJCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lcklkZW50UmVxLAorCQkJCQkJICAgICB1aU5vZGVJZCwKKwkJCQkJCSAgICAgKChwTm9kZUluZm8tPgorCQkJCQkJICAgICAgIG1fTm9kZVN0YXRlIDw8IDgpCisJCQkJCQkgICAgICB8IDB4RkYpKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKy8qCisgICAgICAgICAgICAgICAgICAgIEVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKwkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJICAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXEpOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSkKKwkJCQkJICE9IDBMKSB7CisJCQkJCWlmICgocE5vZGVJbmZvLT4KKwkJCQkJICAgICBtX3dGbGFncyAmCisJCQkJCSAgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkKKwkJCQkJICAgICE9IChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpKSB7CS8vIHRoaXMgaXMgYW4gb2xkIChhbHJlYWR5IGRlbGV0ZWQgb3IgbW9kaWZpZWQpIHRpbWVyCisJCQkJCQkvLyBidXQgbm90IHRoZSBjdXJyZW50IHRpbWVyCisJCQkJCQkvLyBzbyBkaXNjYXJkIGl0CisJCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEsCisJCQkJCQkgICAgIHVpTm9kZUlkLAorCQkJCQkJICAgICAoKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICAgbV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJCSAgICAgIHwgMHhGRikpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorLyoKKyAgICAgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0UmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpTm9kZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDB4ODAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSA+PiA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX1NSKSA+PiA4KSkpOworKi8KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50CisJCQkJCSAgICAodWlOb2RlSWQsCisJCQkJCSAgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkgICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkgICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEpOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmCisJCQkJCSAgRVBMX05NVE1OVV9USU1FUkFSR19TVEFURV9NT04pICE9CisJCQkJCSAwTCkgeworCQkJCQlpZiAoKHBOb2RlSW5mby0+CisJCQkJCSAgICAgbV93RmxhZ3MgJgorCQkJCQkgICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpCisJCQkJCSAgICAhPSAocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX1NSKSkgewkvLyB0aGlzIGlzIGFuIG9sZCAoYWxyZWFkeSBkZWxldGVkIG9yIG1vZGlmaWVkKSB0aW1lcgorCQkJCQkJLy8gYnV0IG5vdCB0aGUgY3VycmVudCB0aW1lcgorCQkJCQkJLy8gc28gZGlzY2FyZCBpdAorCQkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkJICAgIChrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0ZU1vbiwKKwkJCQkJCSAgICAgdWlOb2RlSWQsCisJCQkJCQkgICAgICgocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgICBtX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkJICAgICAgfCAweEZGKSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisvKgorICAgICAgICAgICAgICAgICAgICBFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKwkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJICAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyU3RhdGVNb24pOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfTE9OR0VSKQorCQkJCQkgIT0gMEwpIHsKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fd0ZsYWdzICYKKwkJCQkJICAgICBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpCisJCQkJCSAgICAhPSAocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX0xPKSkgewkvLyB0aGlzIGlzIGFuIG9sZCAoYWxyZWFkeSBkZWxldGVkIG9yIG1vZGlmaWVkKSB0aW1lcgorCQkJCQkJLy8gYnV0IG5vdCB0aGUgY3VycmVudCB0aW1lcgorCQkJCQkJLy8gc28gZGlzY2FyZCBpdAorCQkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkJICAgIChrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIsCisJCQkJCQkgICAgIHVpTm9kZUlkLAorCQkJCQkJICAgICAoKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICAgbV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJCSAgICAgIHwgMHhGRikpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorLyoKKyAgICAgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUikgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9MTykgPj4gOCkpKTsKKyovCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorCQkJCQkgICAgKHVpTm9kZUlkLAorCQkJCQkgICAgICh0RXBsTm10U3RhdGUpIChiTm10U3RhdGUgfAorCQkJCQkJCSAgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJICAgICBFUExfRV9OT19FUlJPUiwKKwkJCQkJICAgICBrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIpOworCQkJCX0KKworCQkJfSBlbHNlIHsJLy8gZ2xvYmFsIHRpbWVyIGV2ZW50CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OgorCQl7CisJCQl0RXBsSGVhcnRiZWF0RXZlbnQgKnBIZWFydGJlYXRFdmVudCA9CisJCQkgICAgKHRFcGxIZWFydGJlYXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnOworCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHBIZWFydGJlYXRFdmVudC0+CisJCQkJCQkJICBtX3VpTm9kZUlkLAorCQkJCQkJCSAgcEhlYXJ0YmVhdEV2ZW50LT4KKwkJCQkJCQkgIG1fTm10U3RhdGUsCisJCQkJCQkJICBwSGVhcnRiZWF0RXZlbnQtPgorCQkJCQkJCSAgbV93RXJyb3JDb2RlLAorCQkJCQkJCSAga0VwbE5tdE1udUludE5vZGVFdmVudEhlYXJ0YmVhdCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlTm10TW51Tm10Q21kU2VudDoKKwkJeworCQkJdEVwbEZyYW1lICpwRnJhbWUgPSAodEVwbEZyYW1lICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJCQl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCQkJQllURSBiTm10U3RhdGU7CisKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQpOworCQkJTm10Q29tbWFuZCA9CisJCQkgICAgKHRFcGxObXRDb21tYW5kKSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICAgICBtX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJCSAgICAgIG1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQkJICAgICAgbV9sZV9iTm10Q29tbWFuZElkKTsKKworCQkJc3dpdGNoIChObXRDb21tYW5kKSB7CisJCQljYXNlIGtFcGxObXRDbWRTdGFydE5vZGU6CisJCQkJYk5tdFN0YXRlID0KKwkJCQkgICAgKEJZVEUpIChrRXBsTm10Q3NPcGVyYXRpb25hbCAmIDB4RkYpOworCQkJCWJyZWFrOworCisJCQljYXNlIGtFcGxObXRDbWRTdG9wTm9kZToKKwkJCQliTm10U3RhdGUgPSAoQllURSkgKGtFcGxObXRDc1N0b3BwZWQgJiAweEZGKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10Q21kRW50ZXJQcmVPcGVyYXRpb25hbDI6CisJCQkJYk5tdFN0YXRlID0KKwkJCQkgICAgKEJZVEUpIChrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIgJiAweEZGKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCQkJLy8gZC5rLiBkbyBub3QgY2hhbmdlIGV4cGVjdGVkIG5vZGUgc3RhdGUsIGJlY2F1c2Ugb2YgRFMgMS4wLjAgNy4zLjEuMi4xIFBsYWluIE5NVCBTdGF0ZSBDb21tYW5kCisJCQkJLy8gICAgICBhbmQgYmVjYXVzZSBub2RlIG1heSBub3QgY2hhbmdlIE5NVCBzdGF0ZSB3aXRoaW4gRVBMX0NfTk1UX1NUQVRFX1RPTEVSQU5DRQorCQkJCWJObXRTdGF0ZSA9CisJCQkJICAgIChCWVRFKSAoa0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyICYgMHhGRik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29tbXVuaWNhdGlvbjoKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwkJCWNhc2Uga0VwbE5tdENtZFN3UmVzZXQ6CisJCQkJYk5tdFN0YXRlID0gKEJZVEUpIChrRXBsTm10Q3NOb3RBY3RpdmUgJiAweEZGKTsKKwkJCQkvLyBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCgpIHNldHMgaW50ZXJuYWwgbm9kZSBzdGF0ZSB0byBrRXBsTm10TW51Tm9kZVN0YXRlVW5rbm93bgorCQkJCS8vIGFmdGVyIG5leHQgdW5yZXNwb25kZWQgSWRlbnRSZXF1ZXN0L1N0YXR1c1JlcXVlc3QKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCS8vIHByb2Nlc3MgYXMgaW50ZXJuYWwgZXZlbnQgd2hpY2ggdXBkYXRlIGV4cGVjdGVkIE5NVCBzdGF0ZSBpbiBPRAorCQkJaWYgKHVpTm9kZUlkICE9IEVQTF9DX0FEUl9CUk9BRENBU1QpIHsKKwkJCQlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZCwKKwkJCQkJCQkJICAgICh0RXBsTm10U3RhdGUpCisJCQkJCQkJCSAgICAoYk5tdFN0YXRlIHwKKwkJCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkJCQkgICAgMCwKKwkJCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRObXRDbWRTZW50KTsKKworCQkJfSBlbHNlIHsJLy8gcHJvY2VzcyBpbnRlcm5hbCBldmVudCBmb3IgYWxsIGFjdGl2ZSBub2RlcyAoZXhjZXB0IG15c2VsZikKKworCQkJCWZvciAodWlOb2RlSWQgPSAxOworCQkJCSAgICAgdWlOb2RlSWQgPD0KKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCW1fYU5vZGVJbmZvKTsgdWlOb2RlSWQrKykgeworCQkJCQlpZiAoKEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkKS0+CisJCQkJCSAgICAgbV9kd05vZGVDZmcgJgorCQkJCQkgICAgIChFUExfTk9ERUFTU0lHTl9OT0RFX0lTX0NOIHwKKwkJCQkJICAgICAgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpKSAhPQorCQkJCQkgICAgMCkgeworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorCQkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJCSAgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJCSAgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJCSAgICAgMCwKKwkJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudE5tdENtZFNlbnQpOworCisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbE5tdEludmFsaWRFdmVudDsKKwkJfQorCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUdldFJ1bm5pbmdUaW1lclN0YXRSZXEKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBhIGJpdCBmaWVsZCB3aXRoIHJ1bm5pbmcgU3RhdFJlcSB0aW1lcnMKKy8vICAgICAgICAgICAgICBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUdldERpYWdub3N0aWNJbmZvKHVuc2lnbmVkIGludAorCQkJCQkgICAgICpwdWlNYW5kYXRvcnlTbGF2ZUNvdW50X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50CisJCQkJCSAgICAgKnB1aVNpZ25hbFNsYXZlQ291bnRfcCwKKwkJCQkJICAgICBXT1JEICogcHdGbGFnc19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoKHB1aU1hbmRhdG9yeVNsYXZlQ291bnRfcCA9PSBOVUxMKQorCSAgICB8fCAocHVpU2lnbmFsU2xhdmVDb3VudF9wID09IE5VTEwpCisJICAgIHx8IChwd0ZsYWdzX3AgPT0gTlVMTCkpIHsKKwkJUmV0ID0ga0VwbE5tdEludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCSpwdWlNYW5kYXRvcnlTbGF2ZUNvdW50X3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50OworCSpwdWlTaWduYWxTbGF2ZUNvdW50X3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50OworCSpwd0ZsYWdzX3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUdldFJ1bm5pbmdUaW1lclN0YXRSZXEKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBhIGJpdCBmaWVsZCB3aXRoIHJ1bm5pbmcgU3RhdFJlcSB0aW1lcnMKKy8vICAgICAgICAgICAgICBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorRFdPUkQgRXBsTm10TW51R2V0UnVubmluZ1RpbWVyU3RhdFJlcSh2b2lkKQorewordEVwbEtlcm5lbCAgICAgIFJldCA9IGtFcGxTdWNjZXNzZnVsOwordW5zaWduZWQgaW50ICAgIHVpSW5kZXg7Cit0RXBsTm10TW51Tm9kZUluZm8qIHBOb2RlSW5mbzsKKworICAgIHBOb2RlSW5mbyA9IEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm87CisgICAgZm9yICh1aUluZGV4ID0gMTsgdWlJbmRleCA8PSB0YWJlbnRyaWVzKEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm8pOyB1aUluZGV4KyssIHBOb2RlSW5mbysrKQorICAgIHsKKyAgICAgICAgaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPT0ga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlc2V0IGZsYWcgInNjYW5uZWQgb25jZSIKKyAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX1NDQU5ORUQ7CisKKyAgICAgICAgICAgIFJldCA9IEVwbE5tdE1udU5vZGVCb290U3RlcDIodWlJbmRleCwgcE5vZGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworICAgICAgICAgICAgLy8gc2lnbmFsIHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgU3RhdHVzUmVxdWVzdCB3YXMgc2VudCBvbmNlIHRvIGEgQ04KKyAgICAgICAgICAgIC8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBSZWFkeVRvT3AKKyAgICAgICAgfQorICAgIH0KKworRXhpdDoKKyAgICByZXR1cm4gUmV0OworfQorKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiTm10UmVxdWVzdAorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgTm10UmVxdWVzdAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IEZyYW1lIHdpdGggdGhlIE5tdFJlcXVlc3QKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYk5tdFJlcXVlc3QodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gJCQkIHBlcmZvcm0gTk1UUmVxdWVzdAorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgSWRlbnRSZXNwb25zZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIElkZW50UmVwb25zZSB3YXMgcmVjZWl2ZWQKKy8vICAgICAgICAgICAgICBwSWRlbnRSZXNwb25zZV9wICAgICAgICA9IHBvaW50ZXIgdG8gSWRlbnRSZXNwb25zZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCBpZiBub2RlIGRpZCBub3QgYW5zd2VyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgIHRFcGxJZGVudFJlc3BvbnNlICoKKwkJCQkJCSAgcElkZW50UmVzcG9uc2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKHBJZGVudFJlc3BvbnNlX3AgPT0gTlVMTCkgewkvLyBub2RlIGRpZCBub3QgYW5zd2VyCisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsIGtFcGxObXRDc05vdEFjdGl2ZSwgRVBMX0VfTk1UX05PX0lERU5UX1JFUywJLy8gd2FzIEVQTF9FX05PX0VSUk9SCisJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudE5vSWRlbnRSZXNwb25zZSk7CisJfSBlbHNlIHsJCS8vIG5vZGUgYW5zd2VyZWQgSWRlbnRSZXF1ZXN0CisJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCURXT1JEIGR3RGV2VHlwZTsKKwkJV09SRCB3RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisJCXRFcGxObXRTdGF0ZSBObXRTdGF0ZSA9CisJCSAgICAodEVwbE5tdFN0YXRlKSAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCSAgICAoJnBJZGVudFJlc3BvbnNlX3AtPgorCQkJCSAgICAgbV9sZV9iTm10U3RhdHVzKSB8IEVQTF9OTVRfVFlQRV9DUyk7CisKKwkJLy8gY2hlY2sgSWRlbnRSZXNwb25zZSAkJCQgbW92ZSB0byBQcm9jZXNzSW50ZXJuLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhbHNvIGlmIENOCisKKwkJLy8gY2hlY2sgRGV2aWNlVHlwZSAoMHgxRjg0KQorCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZHVSZWFkRW50cnkoMHgxRjg0LCB1aU5vZGVJZF9wLCAmZHdEZXZUeXBlLCAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlpZiAoZHdEZXZUeXBlICE9IDBMKSB7CS8vIGFjdHVhbGx5IGNvbXBhcmUgaXQgd2l0aCBEZXZpY2VUeXBlIGZyb20gSWRlbnRSZXNwb25zZQorCQkJaWYgKEFtaUdldER3b3JkRnJvbUxlKCZwSWRlbnRSZXNwb25zZV9wLT5tX2xlX2R3RGV2aWNlVHlwZSkgIT0gZHdEZXZUeXBlKSB7CS8vIHdyb25nIERldmljZVR5cGUKKwkJCQlObXRTdGF0ZSA9IGtFcGxObXRDc05vdEFjdGl2ZTsKKwkJCQl3RXJyb3JDb2RlID0gRVBMX0VfTk1UX0JQTzFfREVWSUNFX1RZUEU7CisJCQl9CisJCX0KKworCQlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZF9wLAorCQkJCQkJICAgIE5tdFN0YXRlLAorCQkJCQkJICAgIHdFcnJvckNvZGUsCisJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudElkZW50UmVzcG9uc2UpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmt0aW9uIGZvciBTdGF0dXNSZXNwb25zZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIElkZW50UmVwb25zZSB3YXMgcmVjZWl2ZWQKKy8vICAgICAgICAgICAgICBwSWRlbnRSZXNwb25zZV9wICAgICAgICA9IHBvaW50ZXIgdG8gSWRlbnRSZXNwb25zZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCBpZiBub2RlIGRpZCBub3QgYW5zd2VyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbFN0YXR1c1Jlc3BvbnNlICoKKwkJCQkJCSAgIHBTdGF0dXNSZXNwb25zZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAocFN0YXR1c1Jlc3BvbnNlX3AgPT0gTlVMTCkgewkvLyBub2RlIGRpZCBub3QgYW5zd2VyCisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsIGtFcGxObXRDc05vdEFjdGl2ZSwgRVBMX0VfTk1UX05PX1NUQVRVU19SRVMsCS8vIHdhcyBFUExfRV9OT19FUlJPUgorCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnROb1N0YXR1c1Jlc3BvbnNlKTsKKwl9IGVsc2UgewkJLy8gbm9kZSBhbnN3ZXJlZCBTdGF0dXNSZXF1ZXN0CisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgKHRFcGxObXRTdGF0ZSkKKwkJCQkJCSAgICAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICAoJnBTdGF0dXNSZXNwb25zZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYk5tdFN0YXR1cykgfAorCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkJICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRTdGF0dXNSZXNwb25zZSk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U3RhcnRCb290U3RlcDEKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIEJvb3RTdGVwMQorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRCb290U3RlcDEodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aVN1YkluZGV4OworCXVuc2lnbmVkIGludCB1aUxvY2FsTm9kZUlkOworCURXT1JEIGR3Tm9kZUNmZzsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJLy8gJCQkIGQuay46IHNhdmUgY3VycmVudCB0aW1lIGZvciAweDFGODkvMiBNTlRpbWVvdXRQcmVPcDFfVTMyCisKKwkvLyBzdGFydCBuZXR3b3JrIHNjYW4KKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID0gMDsKKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkvLyBjaGVjayAweDFGODEKKwl1aUxvY2FsTm9kZUlkID0gRXBsT2JkdUdldE5vZGVJZCgpOworCWZvciAodWlTdWJJbmRleCA9IDE7IHVpU3ViSW5kZXggPD0gMjU0OyB1aVN1YkluZGV4KyspIHsKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4MSwgdWlTdWJJbmRleCwgJmR3Tm9kZUNmZywgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJaWYgKHVpU3ViSW5kZXggIT0gdWlMb2NhbE5vZGVJZCkgeworCQkJLy8gcmVzZXQgZmxhZ3MgIm5vdCBzY2FubmVkIiBhbmQgImlzb2Nocm9ub3VzIgorCQkJRVBMX05NVE1OVV9HRVRfTk9ERUlORk8odWlTdWJJbmRleCktPm1fd0ZsYWdzICY9CisJCQkgICAgfihFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTiB8CisJCQkgICAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCk7CisKKwkJCWlmICh1aVN1YkluZGV4ID09IEVQTF9DX0FEUl9ESUFHX0RFRl9OT0RFX0lEKSB7CS8vIGRpYWdub3N0aWMgbm9kZSBtdXN0IGJlIHNjYW5uZWQgYnkgTU4gaW4gYW55IGNhc2UKKwkJCQlkd05vZGVDZmcgfD0KKwkJCQkgICAgKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfAorCQkJCSAgICAgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpOworCQkJCS8vIGFuZCBpdCBtdXN0IGJlIGlzb2Nocm9ub3VzbHkgYWNjZXNzZWQKKwkJCQlkd05vZGVDZmcgJj0gfkVQTF9OT0RFQVNTSUdOX0FTWU5DT05MWV9OT0RFOworCQkJfQorCQkJLy8gc2F2ZSBub2RlIGNvbmZpZyBpbiBsb2NhbCBub2RlIGluZm8gc3RydWN0dXJlCisJCQlFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aVN1YkluZGV4KS0+bV9kd05vZGVDZmcgPQorCQkJICAgIGR3Tm9kZUNmZzsKKwkJCUVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpU3ViSW5kZXgpLT5tX05vZGVTdGF0ZSA9CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisKKwkJCWlmICgoZHdOb2RlQ2ZnICYgKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfCBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUykpICE9IDApIHsJLy8gbm9kZSBpcyBjb25maWd1cmVkIGFzIENOCisJCQkJLy8gaWRlbnRpZnkgdGhlIG5vZGUKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1aVN1YkluZGV4LAorCQkJCQkJCQkgIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHNldCBmbGFnICJub3Qgc2Nhbm5lZCIKKwkJCQlFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aVN1YkluZGV4KS0+bV93RmxhZ3MgfD0KKwkJCQkgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworCQkJCS8vIHNpZ25hbCBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIElkZW50UmVxdWVzdCB3YXMgc2VudCBvbmNlIHRvIGEgQ04KKworCQkJCWlmICgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04KKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiB3YXMgY29uZmlndXJlZCBzdWNjZXNzZnVsbHkKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CS8vIHN1YmluZGV4IG9mIE1OCisJCQlpZiAoKGR3Tm9kZUNmZyAmIChFUExfTk9ERUFTU0lHTl9NTl9QUkVTIHwgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpKSAhPSAwKSB7CS8vIE1OIHNoYWxsIHNlbmQgUFJlcworCQkJCXRFcGxEbGxOb2RlSW5mbyBEbGxOb2RlSW5mbzsKKworCQkJCUVQTF9NRU1TRVQoJkRsbE5vZGVJbmZvLCAwLAorCQkJCQkgICBzaXplb2YoRGxsTm9kZUluZm8pKTsKKwkJCQlEbGxOb2RlSW5mby5tX3VpTm9kZUlkID0gdWlMb2NhbE5vZGVJZDsKKworCQkJCVJldCA9IEVwbERsbHVDYWxBZGROb2RlKCZEbGxOb2RlSW5mbyk7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U3RhcnRCb290U3RlcDIKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIEJvb3RTdGVwMi4KKy8vICAgICAgICAgICAgICBUaGF0IG1lYW5zIGFkZCBub2RlcyB0byBpc29jaHJvbm91cyBwaGFzZSBhbmQgc2VuZAorLy8gICAgICAgICAgICAgIE5NVCBFbmFibGVSZWFkeVRvT3AuCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydEJvb3RTdGVwMih2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIGFkZCBub2RlcyB0byBpc29jaHJvbm91cyBwaGFzZSBhbmQgc2VuZCBOTVQgRW5hYmxlUmVhZHlUb09wCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPSAwOworCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkJLy8gcmVzZXQgZmxhZyB0aGF0IGFwcGxpY2F0aW9uIHdhcyBpbmZvcm1lZCBhYm91dCBwb3NzaWJsZSBzdGF0ZSBjaGFuZ2UKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKworCQlwTm9kZUluZm8gPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvOworCQlmb3IgKHVpSW5kZXggPSAxOworCQkgICAgIHVpSW5kZXggPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkJICAgICB1aUluZGV4KyssIHBOb2RlSW5mbysrKSB7CisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9PQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVDb25maWd1cmVkKSB7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1aUluZGV4LCBwTm9kZUluZm8pOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBzZXQgZmxhZyAibm90IHNjYW5uZWQiCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQrKzsKKwkJCQkvLyBzaWduYWwgc2xhdmUgY291bnRlciBzaGFsbCBiZSBkZWNyZW1lbnRlZCBpZiBTdGF0dXNSZXF1ZXN0IHdhcyBzZW50IG9uY2UgdG8gYSBDTgorCisJCQkJaWYgKChwTm9kZUluZm8tPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04KKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJfQorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBSZWFkeVRvT3AKKwkJCX0KKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyCisvLworLy8gRGVzY3JpcHRpb246IHN0YXJ0cyBCb290U3RlcDIgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoZSBDTiBpcyBhZGRlZCB0byBpc29jaHJvbm91cyBwaGFzZSBpZiBub3QKKy8vICAgICAgICAgICAgICBhc3luYy1vbmx5IGFuZCBpdCBnZXRzIHRoZSBOTVQgY29tbWFuZCBFbmFibGVSZWFkeVRvT3AuCisvLyAgICAgICAgICAgICAgVGhlIENOIG11c3QgYmUgaW4gbm9kZSBzdGF0ZSBDb25maWd1cmVkLCB3aGVuIGl0IGVudGVycworLy8gICAgICAgICAgICAgIEJvb3RTdGVwMi4gV2hlbiBCb290U3RlcDIgZmluaXNoZXMsIHRoZSBDTiBpcyBpbiBub2RlIHN0YXRlCisvLyAgICAgICAgICAgICAgUmVhZHlUb09wLgorLy8gICAgICAgICAgICAgIElmIFRpbWVvdXRSZWFkeVRvT3AgaW4gb2JqZWN0IDB4MUY4OS81IGlzIGNvbmZpZ3VyZWQsCisvLyAgICAgICAgICAgICAgVGltZXJIZGxMb25nZXIgd2lsbCBiZSBzdGFydGVkIHdpdGggdGhpcyB0aW1lb3V0LgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwTm9kZUluZm9fcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgdEVwbE5tdE1udU5vZGVJbmZvICogcE5vZGVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRGxsTm9kZUluZm8gRGxsTm9kZUluZm87CisJRFdPUkQgZHdOb2RlQ2ZnOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJZHdOb2RlQ2ZnID0gcE5vZGVJbmZvX3AtPm1fZHdOb2RlQ2ZnOworCWlmICgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREUpID09IDApIHsJLy8gYWRkIG5vZGUgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJRGxsTm9kZUluZm8ubV91aU5vZGVJZCA9IHVpTm9kZUlkX3A7CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGOTIsIHVpTm9kZUlkX3AsCisJCQkJICAgICAmRGxsTm9kZUluZm8ubV9kd1ByZXNUaW1lb3V0LCAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCU9iZFNpemUgPSAyOworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGOEIsIHVpTm9kZUlkX3AsCisJCQkJICAgICAmRGxsTm9kZUluZm8ubV93UHJlcVBheWxvYWRMaW1pdCwKKwkJCQkgICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJT2JkU2l6ZSA9IDI7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RCwgdWlOb2RlSWRfcCwKKwkJCQkgICAgICZEbGxOb2RlSW5mby5tX3dQcmVzUGF5bG9hZExpbWl0LAorCQkJCSAgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlwTm9kZUluZm9fcC0+bV93RmxhZ3MgfD0gRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST047CisKKwkJUmV0ID0gRXBsRGxsdUNhbEFkZE5vZGUoJkRsbE5vZGVJbmZvKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwl9CisKKwlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsCisJCQkJCXVpTm9kZUlkX3AsCisJCQkJCWtFcGxObXRDbWRFbmFibGVSZWFkeVRvT3BlcmF0ZSk7CisKKwlSZXQgPQorCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aU5vZGVJZF9wLCBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxUaW1lb3V0UmVhZHlUb09wICE9IDBMKSB7CS8vIHN0YXJ0IHRpbWVyCisJCS8vIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMgdGhlIENOIG11c3QgYmUgUmVhZHlUb09wCisJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0xPTkdFUihwTm9kZUluZm9fcCwgdWlOb2RlSWRfcCwKKwkJCQkJCSAgICAgVGltZXJBcmcpOworLy8gICAgICAgIFRpbWVyQXJnLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKy8vICAgICAgICBUaW1lckFyZy5tX3VsQXJnID0gRVBMX05NVE1OVV9USU1FUkFSR19MT05HRVIgfCB1aU5vZGVJZF9wOworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcygmcE5vZGVJbmZvX3AtPm1fVGltZXJIZGxMb25nZXIsCisJCQkJCSAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgIG1fdWxUaW1lb3V0UmVhZHlUb09wLCBUaW1lckFyZyk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVN0YXJ0Q2hlY2tDb20KKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIENoZWNrQ29tbXVuaWNhdGlvbgorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRDaGVja0NvbSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIHdhaXQgc29tZSB0aW1lIGFuZCBjaGVjayB0aGF0IG5vIGNvbW11bmljYXRpb24gZXJyb3Igb2NjdXJzCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPSAwOworCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkJLy8gcmVzZXQgZmxhZyB0aGF0IGFwcGxpY2F0aW9uIHdhcyBpbmZvcm1lZCBhYm91dCBwb3NzaWJsZSBzdGF0ZSBjaGFuZ2UKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKworCQlwTm9kZUluZm8gPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvOworCQlmb3IgKHVpSW5kZXggPSAxOworCQkgICAgIHVpSW5kZXggPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkJICAgICB1aUluZGV4KyssIHBOb2RlSW5mbysrKSB7CisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9PQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZWFkeVRvT3ApIHsKKwkJCQlSZXQgPSBFcGxObXRNbnVOb2RlQ2hlY2tDb20odWlJbmRleCwgcE5vZGVJbmZvKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsJLy8gdGltZXIgd2FzIHN0YXJ0ZWQKKwkJCQkJLy8gd2FpdCB1bnRpbCBpdCBleHBpcmVzCisJCQkJCWlmICgocE5vZGVJbmZvLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOCisJCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHNldCBmbGFnICJub3Qgc2Nhbm5lZCIKKwkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzIHw9CisJCQkJICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworCQkJCS8vIHNpZ25hbCBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIHRpbWVvdXQgZWxhcHNlZCBhbmQgcmVnYXJkbGVzcyBvZiBhbiBlcnJvcgorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIHRpbWVvdXQgZWxhcHNlZCBhbmQgbm8gZXJyb3Igb2NjdXJlZAorCQkJfQorCQl9CisJfQorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51Tm9kZUNoZWNrQ29tCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrcyBjb21tdW5pY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vICAgICAgICAgICAgICBUaGF0IG1lYW5zIHdhaXQgc29tZSB0aW1lIGFuZCBpZiBubyBlcnJvciBvY2N1cmVkIGV2ZXJ5dGhpbmcKKy8vICAgICAgICAgICAgICBpcyBPSy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgcE5vZGVJbmZvX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUNoZWNrQ29tKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQl0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCURXT1JEIGR3Tm9kZUNmZzsKKwl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwlkd05vZGVDZmcgPSBwTm9kZUluZm9fcC0+bV9kd05vZGVDZmc7CisJaWYgKCgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREUpID09IDApCisJICAgICYmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxUaW1lb3V0Q2hlY2tDb20gIT0gMEwpKSB7CS8vIENOIGlzIG5vdCBhc3luYy1vbmx5IGFuZCB0aW1lb3V0IGZvciBDaGVja0NvbSB3YXMgc2V0CisKKwkJLy8gY2hlY2sgY29tbXVuaWNhdGlvbiwKKwkJLy8gdGhhdCBtZWFucyB3YWl0IHNvbWUgdGltZSBhbmQgaWYgbm8gZXJyb3Igb2NjdXJlZCBldmVyeXRoaW5nIGlzIE9LOworCisJCS8vIHN0YXJ0IHRpbWVyICh3aGVuIHRoZSB0aW1lciBleHBpcmVzIHRoZSBDTiBtdXN0IGJlIHN0aWxsIFJlYWR5VG9PcCkKKwkJRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfTE9OR0VSKHBOb2RlSW5mb19wLCB1aU5vZGVJZF9wLAorCQkJCQkJICAgICBUaW1lckFyZyk7CisvLyAgICAgICAgVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworLy8gICAgICAgIFRpbWVyQXJnLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0xPTkdFUiB8IHVpTm9kZUlkX3A7CisJCVJldCA9CisJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKCZwTm9kZUluZm9fcC0+bV9UaW1lckhkbExvbmdlciwKKwkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgbV91bFRpbWVvdXRDaGVja0NvbSwgVGltZXJBcmcpOworCisJCS8vIHVwZGF0ZSBtYW5kYXRvcnkgc2xhdmUgY291bnRlciwgYmVjYXVzZSB0aW1lciB3YXMgc3RhcnRlZAorCQlpZiAoUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlSZXQgPSBrRXBsUmVqZWN0OworCQl9CisJfSBlbHNlIHsJCS8vIHRpbWVyIHdhcyBub3Qgc3RhcnRlZAorCQkvLyBhc3N1bWUgZXZlcnl0aGluZyBpcyBPSworCQlwTm9kZUluZm9fcC0+bV9Ob2RlU3RhdGUgPSBrRXBsTm10TW51Tm9kZVN0YXRlQ29tQ2hlY2tlZDsKKwl9CisKKy8vRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVTdGFydE5vZGVzCisvLworLy8gRGVzY3JpcHRpb246IHJlYWxseSBzdGFydHMgYWxsIG5vZGVzIHdoaWNoIGFyZSBSZWFkeVRvT3AgYW5kIENoZWNrQ29tIGRpZCBub3QgZmFpbAorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnROb2Rlcyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIHNlbmQgTk1UIGNvbW1hbmQgU3RhcnQgTm9kZQorCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID0gMDsKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9IDA7CisJCS8vIHJlc2V0IGZsYWcgdGhhdCBhcHBsaWNhdGlvbiB3YXMgaW5mb3JtZWQgYWJvdXQgcG9zc2libGUgc3RhdGUgY2hhbmdlCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisKKwkJcE5vZGVJbmZvID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbzsKKwkJZm9yICh1aUluZGV4ID0gMTsKKwkJICAgICB1aUluZGV4IDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJCSAgICAgdWlJbmRleCsrLCBwTm9kZUluZm8rKykgeworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPT0KKwkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlQ29tQ2hlY2tlZCkgeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fZHdObXRTdGFydHVwICYgRVBMX05NVFNUX1NUQVJUQUxMTk9ERVMpCisJCQkJICAgID09IDApIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLAorCQkJCQkJCQkJdWlJbmRleCwKKwkJCQkJCQkJCWtFcGxObXRDbWRTdGFydE5vZGUpOworCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aUluZGV4LAorCQkJCQkJCQkgICAga0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICgocE5vZGVJbmZvLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3VpTWFuZGF0b3J5U2xhdmVDb3VudCsrOworCQkJCX0KKwkJCQkvLyBzZXQgZmxhZyAibm90IHNjYW5uZWQiCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQrKzsKKwkJCQkvLyBzaWduYWwgc2xhdmUgY291bnRlciBzaGFsbCBiZSBkZWNyZW1lbnRlZCBpZiBTdGF0dXNSZXF1ZXN0IHdhcyBzZW50IG9uY2UgdG8gYSBDTgorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBPUEVSQVRJT05BTAorCQkJfQorCQl9CisKKwkJLy8gJCQkIGluZm9ybSBhcHBsaWNhdGlvbiBpZiBFUExfTk1UU1RfTk9fU1RBUlROT0RFIGlzIHNldAorCisJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJICAgICBtX2R3Tm10U3RhcnR1cCAmIEVQTF9OTVRTVF9TVEFSVEFMTE5PREVTKSAhPSAwKSB7CisJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsIEVQTF9DX0FEUl9CUk9BRENBU1QsCisJCQkJCQkJa0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisKKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmQoRVBMX0NfQURSX0JST0FEQ0FTVCwKKwkJCQkJCSAgICBrRXBsTm10Q21kU3RhcnROb2RlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGludGVybmFsIG5vZGUgZXZlbnRzCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIE5vZGVObXRTdGF0ZV9wICAgICAgICAgID0gTk1UIHN0YXRlIG9mIENOCisvLyAgICAgICAgICAgICAgTm9kZUV2ZW50X3AgICAgICAgICAgICAgPSBvY2N1cmVkIGV2ZW50cworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQl0RXBsTm10U3RhdGUgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQlXT1JEIHdFcnJvckNvZGVfcCwKKwkJCQkJCXRFcGxObXRNbnVJbnROb2RlRXZlbnQKKwkJCQkJCU5vZGVFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCXRFcGxObXRNbnVOb2RlSW5mbyAqcE5vZGVJbmZvOworCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKworCXBOb2RlSW5mbyA9IEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkX3ApOworCU5tdFN0YXRlID0gRXBsTm10dUdldE5tdFN0YXRlKCk7CisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBub3QgYWN0aXZlCisJCWdvdG8gRXhpdDsKKwl9CisKKwlzd2l0Y2ggKE5vZGVFdmVudF9wKSB7CisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50SWRlbnRSZXNwb25zZToKKwkJeworCQkJQllURSBiTm10U3RhdGU7CisKKwkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlKTsKKworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgIT0KKwkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mKSB7CisJCQkJcE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9CisJCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVJZGVudGlmaWVkOworCQkJfQorCQkJLy8gcmVzZXQgZmxhZ3MgSVNPQ0hST04gYW5kIE5NVF9DTURfSVNTVUVECisJCQlwTm9kZUluZm8tPm1fd0ZsYWdzICY9IH4oRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST04KKwkJCQkJCSB8CisJCQkJCQkgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQpOworCisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworCQkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJfQorCQkJLy8gdXBkYXRlIG9iamVjdCAweDFGOEYgTk1UX01OTm9kZUV4cFN0YXRlX0FVOCB0byBQcmVPcDEgKGV2ZW4gaWYgbG9jYWwgc3RhdGUgPj0gUHJlT3AyKQorCQkJYk5tdFN0YXRlID0gKEJZVEUpIChrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEgJiAweEZGKTsKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkdVdyaXRlRW50cnkoMHgxRjhGLCB1aU5vZGVJZF9wLCAmYk5tdFN0YXRlLAorCQkJCQkgICAgICAxKTsKKworCQkJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwgcE5vZGVJbmZvLAorCQkJCQkJICAgTm9kZU5tdFN0YXRlX3AsIHdFcnJvckNvZGVfcCwKKwkJCQkJCSAgIE5tdFN0YXRlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsKKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gcmVxdWVzdCBTdGF0dXNSZXNwb25zZSBpbW1lZGlhdGVseSwKKwkJCS8vIGJlY2F1c2Ugd2Ugd2FudCBhIGZhc3QgYm9vdC11cCBvZiBDTnMKKwkJCVJldCA9CisJCQkgICAgRXBsU3RhdHVzdVJlcXVlc3RTdGF0dXNSZXNwb25zZSh1aU5vZGVJZF9wLAorCQkJCQkJCSAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKE5vZGVFdmVudF9wLAorCQkJCQkJCQl1aU5vZGVJZF9wLAorCQkJCQkJCQlSZXQpOworCisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGUgb25seSBzaXR1YXRpb24gd2hlbiB0aGlzIHNob3VsZCBoYXBwZW4gaXMsIHdoZW4KKwkJCQkJLy8gU3RhdHVzUmVzcG9uc2Ugd2FzIGFscmVhZHkgcmVxdWVzdGVkIGZyb20gd2l0aGluCisJCQkJCS8vIHRoZSBTdGF0UmVxIHRpbWVyIGV2ZW50LgorCQkJCQkvLyBzbyBpZ25vcmUgdGhpcyBlcnJvci4KKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsKKwkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXROb2RlRXZlbnRGb3VuZCwKKwkJCQkJCSAgICAgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQkgICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkJICAgICAocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJCSAgICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCSAgICAgIT0gMCk7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CS8vIGludGVycnVwdCBib290IHByb2Nlc3Mgb24gdXNlciByZXF1ZXN0CisJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJICAgIChOb2RlRXZlbnRfcCwgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJICAgICAgfCBSZXQpKTsKKworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkgICAgKE5vZGVFdmVudF9wLCB1aU5vZGVJZF9wLAorCQkJCQkgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkgICAgICB8IFJldCkpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIGNvbnRpbnVlIEJvb3RTdGVwMQorCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290OgorCQl7CisKKwkJCS8vICQkJCBjaGVjayBpZGVudGlmaWNhdGlvbiAodmVuZG9yIElELCBwcm9kdWN0IGNvZGUsIHJldmlzaW9uIG5vLCBzZXJpYWwgbm8pCisKKwkJCWlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlID09CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZUlkZW50aWZpZWQpIHsKKwkJCQkvLyAkJCQgY2hlY2sgc29mdHdhcmUKKworCQkJCS8vIGNoZWNrL3N0YXJ0IGNvbmZpZ3VyYXRpb24KKwkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXROb2RlRXZlbnRDaGVja0NvbmYsCisJCQkJCQkgICAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJICAgICBFUExfRV9OT19FUlJPUiwKKwkJCQkJCSAgICAgKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkgICAgICBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pCisJCQkJCQkgICAgICE9IDApOworCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgewkvLyBpbnRlcnJ1cHQgYm9vdCBwcm9jZXNzIG9uIHVzZXIgcmVxdWVzdAorCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCSAgICAoa0VwbE5tdE1udUludE5vZGVFdmVudEJvb3QsCisJCQkJCSAgICAgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJICAgICAgfCBSZXQpKTsKKworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290LAorCQkJCQkgICAgIHVpTm9kZUlkX3AsCisJCQkJCSAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisJCQkJCSAgICAgIHwgUmV0KSk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIGlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlICE9IGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsJLy8gd3JvbmcgQ04gc3RhdGUKKwkJCQkvLyBpZ25vcmUgZXZlbnQKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vICQkJCBkLmsuOiBjdXJyZW50bHkgd2UgYXNzdW1lIGNvbmZpZ3VyYXRpb24gaXMgT0sKKworCQkJLy8gY29udGludWUgQm9vdFN0ZXAxCisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudENvbmZpZ3VyZWQ6CisJCXsKKwkJCWlmICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgICBrRXBsTm10TW51Tm9kZVN0YXRlSWRlbnRpZmllZCkKKwkJCSAgICAmJiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPSBrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mKSkgewkvLyB3cm9uZyBDTiBzdGF0ZQorCQkJCS8vIGlnbm9yZSBldmVudAorCQkJCWJyZWFrOworCQkJfQorCisJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQ7CisKKwkJCWlmIChObXRTdGF0ZSA9PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDEpIHsKKwkJCQlpZiAoKHBOb2RlSW5mby0+bV9kd05vZGVDZmcgJiBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9IDApIHsJLy8gZGVjcmVtZW50IG1hbmRhdG9yeSBDTiBjb3VudGVyCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3VpTWFuZGF0b3J5U2xhdmVDb3VudC0tOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gcHV0IG9wdGlvbmFsIG5vZGUgdG8gbmV4dCBzdGVwIChCb290U3RlcDIpCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1aU5vZGVJZF9wLAorCQkJCQkJCSAgIHBOb2RlSW5mbyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9JZGVudFJlc3BvbnNlOgorCQl7CisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworCQkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJfQorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsKKwkJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlID0KKwkJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisJCQl9CisJCQkvLyAkJCQgZC5rLiBjaGVjayBzdGFydCB0aW1lIGZvciAweDFGODkvMiBNTlRpbWVvdXRQcmVPcDFfVTMyCisJCQkvLyAkJCQgZC5rLiBjaGVjayBpbmRpdmlkdWFsIHRpbWVvdXQgMHgxRjg5LzYgTU5JZGVudGlmaWNhdGlvblRpbWVvdXRfVTMyCisJCQkvLyBpZiBtYW5kYXRvcnkgbm9kZSBhbmQgdGltZW91dCBlbGFwc2VkIC0+IGhhbHQgYm9vdCBwcm9jZWR1cmUKKwkJCS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGFnYWluIChpZiA+PSBQcmVPcDIsIGFmdGVyIGRlbGF5KQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikgewkvLyBzdGFydCB0aW1lcgorCQkJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0lERU5UUkVRCisJCQkJICAgIChwTm9kZUluZm8sIHVpTm9kZUlkX3AsIFRpbWVyQXJnKTsKKy8vICAgICAgICAgICAgICAgIFRpbWVyQXJnLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKy8vICAgICAgICAgICAgICAgIFRpbWVyQXJnLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0lERU5UUkVRIHwgdWlOb2RlSWRfcDsKKy8qCisgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9JZGVudFJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoVGltZXJBcmcubV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBOb2RlSW5mby0+CisJCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCQkgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5LAorCQkJCQkJCSAgIFRpbWVyQXJnKTsKKwkJCX0gZWxzZSB7CS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGltbWVkaWF0ZWx5CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsSWRlbnR1UmVxdWVzdElkZW50UmVzcG9uc2UodWlOb2RlSWRfcCwKKwkJCQkJCQkJICBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFN0YXR1c1Jlc3BvbnNlOgorCQl7CisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50IGlmIGNoZWNrZWQgb25jZSBmb3IgUmVhZHlUb09wLCBDaGVja0NvbSwgT3BlcmF0aW9uYWwKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyAmPQorCQkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQl9CisJCQkvLyBjaGVjayBOTVQgc3RhdGUgb2YgQ04KKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51Q2hlY2tObXRTdGF0ZSh1aU5vZGVJZF9wLCBwTm9kZUluZm8sCisJCQkJCQkgICBOb2RlTm10U3RhdGVfcCwgd0Vycm9yQ29kZV9wLAorCQkJCQkJICAgTm10U3RhdGUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChObXRTdGF0ZSA9PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDEpIHsKKwkJCQkvLyByZXF1ZXN0IG5leHQgU3RhdHVzUmVzcG9uc2UgaW1tZWRpYXRlbHkKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJCSAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJICAgIChOb2RlRXZlbnRfcCwgdWlOb2RlSWRfcCwgUmV0KTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTikgPT0gMCkgewkvLyBzdGFydCB0aW1lcgorCQkJCS8vIG5vdCBpc29jaHJvbm91c2x5IGFjY2Vzc2VkIENOIChlLmcuIGFzeW5jLW9ubHkgb3Igc3RvcHBlZCBDTikKKwkJCQlFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19TVEFUUkVRKHBOb2RlSW5mbywKKwkJCQkJCQkJICAgICAgdWlOb2RlSWRfcCwKKwkJCQkJCQkJICAgICAgVGltZXJBcmcpOworLy8gICAgICAgICAgICAgICAgVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworLy8gICAgICAgICAgICAgICAgVGltZXJBcmcubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSB8IHVpTm9kZUlkX3A7CisvKgorICAgICAgICAgICAgICAgIEVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbE5tdE1udUludE5vZGVFdmVudFN0YXR1c1Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoVGltZXJBcmcubV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBOb2RlSW5mby0+CisJCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCQkgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5LAorCQkJCQkJCSAgIFRpbWVyQXJnKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudE5vU3RhdHVzUmVzcG9uc2U6CisJCXsKKwkJCS8vIGZ1bmN0aW9uIENoZWNrTm10U3RhdGUgc2V0cyBub2RlIHN0YXRlIHRvIHVua25vd24gaWYgbmVjZXNzYXJ5CisvKgorICAgICAgICAgICAgaWYgKChObXRTdGF0ZSA+PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpCisgICAgICAgICAgICAgICAgJiYgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisgICAgICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworICAgICAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworICAgICAgICAgICAgfQorKi8KKwkJCS8vIGNoZWNrIE5NVCBzdGF0ZSBvZiBDTgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVDaGVja05tdFN0YXRlKHVpTm9kZUlkX3AsIHBOb2RlSW5mbywKKwkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLCB3RXJyb3JDb2RlX3AsCisJCQkJCQkgICBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudEVycm9yOgorCQl7CQkvLyBjdXJyZW50bHkgb25seSBpc3N1ZWQgb24ga0VwbE5tdE5vZGVDb21tYW5kQ29uZkVycgorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPSBrRXBsTm10TW51Tm9kZVN0YXRlSWRlbnRpZmllZCkgewkvLyB3cm9uZyBDTiBzdGF0ZQorCQkJCS8vIGlnbm9yZSBldmVudAorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwgcE5vZGVJbmZvLAorCQkJCQkJICAga0VwbE5tdENzTm90QWN0aXZlLAorCQkJCQkJICAgd0Vycm9yQ29kZV9wLCBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudEV4ZWNSZXNldDoKKwkJeworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgIT0ga0VwbE5tdE1udU5vZGVTdGF0ZUlkZW50aWZpZWQpIHsJLy8gd3JvbmcgQ04gc3RhdGUKKwkJCQkvLyBpZ25vcmUgZXZlbnQKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9IGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmY7CisKKwkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCQkoKChOb2RlTm10U3RhdGVfcCAmCisJCQkJCQkJICAgMHhGRikgPDwgOCkKKwkJCQkJCQkgfAorCQkJCQkJCSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uKSk7CisKKwkJCS8vIHNlbmQgTk1UIHJlc2V0IGNvbmZpZ3VyYXRpb24gdG8gQ04gZm9yIGFjdGl2YXRpb24gb2YgY29uZmlndXJhdGlvbgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aU5vZGVJZF9wLAorCQkJCQkJICAgIGtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb24pOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50SGVhcnRiZWF0OgorCQl7CisvKgorICAgICAgICAgICAgaWYgKChObXRTdGF0ZSA+PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpCisgICAgICAgICAgICAgICAgJiYgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisgICAgICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworICAgICAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworICAgICAgICAgICAgfQorKi8KKwkJCS8vIGNoZWNrIE5NVCBzdGF0ZSBvZiBDTgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVDaGVja05tdFN0YXRlKHVpTm9kZUlkX3AsIHBOb2RlSW5mbywKKwkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLCB3RXJyb3JDb2RlX3AsCisJCQkJCQkgICBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXE6CisJCXsKKwkJCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UxCisJCQkgICAgKCJUaW1lclN0YXRSZXEtPklkZW50UmVxKCUwMlgpXG4iLCB1aU5vZGVJZF9wKTsKKwkJCS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGFnYWluCisJCQlSZXQgPQorCQkJICAgIEVwbElkZW50dVJlcXVlc3RJZGVudFJlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJICBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJCXVpTm9kZUlkX3AsCisJCQkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCQkJIHwgUmV0KSk7CisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGlzIGNhbiBoYXBwZW4gYmVjYXVzZSBvZiBhIGJ1ZyBpbiBFcGxUaW1lcnVMaW51eEtlcm5lbC5jCisJCQkJCS8vIHNvIGlnbm9yZSB0aGlzIGVycm9yLgorCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRlTW9uOgorCQl7CisJCQkvLyByZXNldCBOTVQgc3RhdGUgY2hhbmdlIGZsYWcKKwkJCS8vIGJlY2F1c2UgZnJvbSBub3cgb24gdGhlIENOIG11c3QgaGF2ZSB0aGUgY29ycmVjdCBOTVQgc3RhdGUKKwkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQ7CisKKwkJCS8vIGNvbnRpbnVlIHdpdGggbm9ybWFsIFN0YXRSZXEgcHJvY2Vzc2luZworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXE6CisJCXsKKwkJCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UxKCJUaW1lclN0YXRSZXEtPlN0YXRSZXEoJTAyWClcbiIsCisJCQkJCQl1aU5vZGVJZF9wKTsKKwkJCS8vIHJlcXVlc3QgbmV4dCBTdGF0dXNSZXNwb25zZQorCQkJUmV0ID0KKwkJCSAgICBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJICAgIEVwbE5tdE1udUNiU3RhdHVzUmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJCXVpTm9kZUlkX3AsCisJCQkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCQkJIHwgUmV0KSk7CisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGUgb25seSBzaXR1YXRpb24gd2hlbiB0aGlzIHNob3VsZCBoYXBwZW4gaXMsIHdoZW4KKwkJCQkJLy8gU3RhdHVzUmVzcG9uc2Ugd2FzIGFscmVhZHkgcmVxdWVzdGVkIHdoaWxlIHByb2Nlc3NpbmcKKwkJCQkJLy8gZXZlbnQgSWRlbnRSZXNwb25zZS4KKwkJCQkJLy8gc28gaWdub3JlIHRoaXMgZXJyb3IuCisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyTG9uZ2VyOgorCQl7CisJCQlzd2l0Y2ggKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUpIHsKKwkJCWNhc2Uga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQ6CisJCQkJewkvLyBub2RlIHNob3VsZCBiZSBSZWFkeVRvT3AgYnV0IGl0IGlzIG5vdAorCisJCQkJCS8vIGNoZWNrIE5NVCBzdGF0ZSB3aGljaCBzaGFsbCBiZSBpbnRlbnRpb25hbGx5IHdyb25nLCBzbyB0aGF0IEVSUk9SX1RSRUFUTUVOVCB3aWxsIGJlIHN0YXJ0ZWQKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwKKwkJCQkJCQkJICAgcE5vZGVJbmZvLAorCQkJCQkJCQkgICBrRXBsTm10Q3NOb3RBY3RpdmUsCisJCQkJCQkJCSAgIEVQTF9FX05NVF9CUE8yLAorCQkJCQkJCQkgICBObXRTdGF0ZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdE1udU5vZGVTdGF0ZVJlYWR5VG9PcDoKKwkJCQl7CS8vIENoZWNrQ29tIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQorCisJCQkJCXBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPQorCQkJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZUNvbUNoZWNrZWQ7CisKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fd0ZsYWdzICYKKwkJCQkJICAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCkKKwkJCQkJICAgICE9IDApIHsKKwkJCQkJCS8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisJCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzICY9CisJCQkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJCQl9CisKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJICAgICBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9CisJCQkJCSAgICAwKSB7CisJCQkJCQkvLyBkZWNyZW1lbnQgbWFuZGF0b3J5IHNsYXZlIGNvdW50ZXIKKwkJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU1hbmRhdG9yeVNsYXZlQ291bnQtLTsKKwkJCQkJfQorCQkJCQlpZiAoTm10U3RhdGUgIT0ga0VwbE5tdE1zUmVhZHlUb09wZXJhdGUpIHsKKwkJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJCSAgICAoTm9kZUV2ZW50X3AsIHVpTm9kZUlkX3AsCisJCQkJCQkgICAgICgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikKKwkJCQkJCSAgICAgICA8PCA4KQorCQkJCQkJICAgICAgfCBrRXBsTm10Q21kU3RhcnROb2RlKSk7CisKKwkJCQkJCS8vIHN0YXJ0IG9wdGlvbmFsIENOCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kCisJCQkJCQkgICAgKHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXRDbWRTdGFydE5vZGUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRObXRDbWRTZW50OgorCQl7CisJCQlCWVRFIGJObXRTdGF0ZTsKKworCQkJLy8gdXBkYXRlIGV4cGVjdGVkIE5NVCBzdGF0ZSB3aXRoIHRoZSBvbmUgdGhhdCByZXN1bHRzCisJCQkvLyBmcm9tIHRoZSBzZW50IE5NVCBjb21tYW5kCisJCQliTm10U3RhdGUgPSAoQllURSkgKE5vZGVObXRTdGF0ZV9wICYgMHhGRik7CisKKwkJCS8vIHdyaXRlIG9iamVjdCAweDFGOEYgTk1UX01OTm9kZUV4cFN0YXRlX0FVOAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsCisJCQkJCSAgICAgIDEpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKE5vZGVObXRTdGF0ZV9wID09IGtFcGxObXRDc05vdEFjdGl2ZSkgewkvLyByZXN0YXJ0IHByb2Nlc3Npbmcgd2l0aCBJZGVudFJlcXVlc3QKKwkJCQlFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19JREVOVFJFUQorCQkJCSAgICAocE5vZGVJbmZvLCB1aU5vZGVJZF9wLCBUaW1lckFyZyk7CisJCQl9IGVsc2UgewkvLyBtb25pdG9yIE5NVCBzdGF0ZSBjaGFuZ2Ugd2l0aCBTdGF0dXNSZXF1ZXN0IGFmdGVyCisJCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgZGVsYXk7CisJCQkJLy8gdW50aWwgdGhlbiB3cm9uZyBOTVQgc3RhdGVzIHdpbGwgYmUgaWdub3JlZAorCQkJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX1NUQVRFX01PTgorCQkJCSAgICAocE5vZGVJbmZvLCB1aU5vZGVJZF9wLCBUaW1lckFyZyk7CisKKwkJCQkvLyBzZXQgTk1UIHN0YXRlIGNoYW5nZSBmbGFnCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OTVRfQ01EX0lTU1VFRDsKKwkJCX0KKworCQkJUmV0ID0KKwkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKCZwTm9kZUluZm8tPgorCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgbV91bFN0YXR1c1JlcXVlc3REZWxheSwKKwkJCQkJCSAgIFRpbWVyQXJnKTsKKworCQkJLy8gZmluaXNoIHByb2Nlc3NpbmcsIGJlY2F1c2UgTm10U3RhdGVfcCBpcyB0aGUgZXhwZWN0ZWQgYW5kIG5vdCB0aGUgY3VycmVudCBzdGF0ZQorCQkJZ290byBFeGl0OworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIGNoZWNrIGlmIG5ldHdvcmsgaXMgcmVhZHkgdG8gY2hhbmdlIGxvY2FsIE5NVCBzdGF0ZSBhbmQgdGhpcyB3YXMgbm90IGRvbmUgYmVmb3JlCisJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzICYgKEVQTF9OTVRNTlVfRkxBR19IQUxURUQgfCBFUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEKSkgPT0gMCkgewkvLyBib290IHByb2Nlc3MgaXMgbm90IGhhbHRlZAorCQlzd2l0Y2ggKE5tdFN0YXRlKSB7CisJCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQkJeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9PQorCQkJCSAgICAgMCkKKwkJCQkgICAgJiYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPT0gMCkpIHsJLy8gYWxsIG9wdGlvbmFsIENOcyBzY2FubmVkIG9uY2UgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGNvbmZpZ3VyZWQgc3VjY2Vzc2Z1bGx5CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgfD0KKwkJCQkJICAgIEVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisJCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcGZuQ2JCb290RXZlbnQKKwkJCQkJICAgIChrRXBsTm10Qm9vdEV2ZW50Qm9vdFN0ZXAxRmluaXNoLAorCQkJCQkgICAgIE5tdFN0YXRlLCBFUExfRV9OT19FUlJPUik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCS8vIHdhaXQgZm9yIGFwcGxpY2F0aW9uCisJCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvLyBlbnRlciBQcmVPcDIKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudEFsbE1hbmRhdG9yeUNOSWRlbnQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMjoKKwkJCXsKKwkJCQlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQgPT0KKwkJCQkgICAgIDApCisJCQkJICAgICYmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID09IDApKSB7CS8vIGFsbCBvcHRpb25hbCBDTnMgY2hlY2tlZCBvbmNlIGZvciBSZWFkeVRvT3AgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBSZWFkeVRvT3AKKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyB8PQorCQkJCQkgICAgRVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKwkJCQkJLy8gaW5mb3JtIGFwcGxpY2F0aW9uCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wZm5DYkJvb3RFdmVudAorCQkJCQkgICAgKGtFcGxObXRCb290RXZlbnRCb290U3RlcDJGaW5pc2gsCisJCQkJCSAgICAgTm10U3RhdGUsIEVQTF9FX05PX0VSUk9SKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJLy8gd2FpdCBmb3IgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGVudGVyIFJlYWR5VG9PcAorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJSZWFkeVRvT3BlcmF0ZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdE1zUmVhZHlUb09wZXJhdGU6CisJCQl7CisJCQkJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID09CisJCQkJICAgICAwKQorCQkJCSAgICAmJiAoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpTWFuZGF0b3J5U2xhdmVDb3VudCA9PSAwKSkgewkvLyBhbGwgQ05zIGNoZWNrZWQgZm9yIGVycm9ybGVzcyBjb21tdW5pY2F0aW9uCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgfD0KKwkJCQkJICAgIEVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisJCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcGZuQ2JCb290RXZlbnQKKwkJCQkJICAgIChrRXBsTm10Qm9vdEV2ZW50Q2hlY2tDb21GaW5pc2gsCisJCQkJCSAgICAgTm10U3RhdGUsIEVQTF9FX05PX0VSUk9SKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJLy8gd2FpdCBmb3IgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGVudGVyIE9wZXJhdGlvbmFsCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlck1zT3BlcmF0aW9uYWwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxObXRNc09wZXJhdGlvbmFsOgorCQkJeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9PQorCQkJCSAgICAgMCkKKwkJCQkgICAgJiYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPT0gMCkpIHsJLy8gYWxsIG9wdGlvbmFsIENOcyBzY2FubmVkIG9uY2UgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBPUEVSQVRJT05BTAorCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzIHw9CisJCQkJCSAgICBFUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEOworCQkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3BmbkNiQm9vdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEJvb3RFdmVudE9wZXJhdGlvbmFsLAorCQkJCQkgICAgIE5tdFN0YXRlLCBFUExfRV9OT19FUlJPUik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCS8vIGlnbm9yZSBlcnJvciBjb2RlCisJCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIHRoZSBOTVQgc3RhdGUsIGkuZS4gZXZhbHVhdGVzIGl0IHdpdGggb2JqZWN0IDB4MUY4RgorLy8gICAgICAgICAgICAgIE5NVF9NTk5vZGVFeHBTdGF0ZV9BVTggYW5kIHVwZGF0ZXMgb2JqZWN0IDB4MUY4RQorLy8gICAgICAgICAgICAgIE5NVF9NTk5vZGVDdXJyU3RhdGVfQVU4LgorLy8gICAgICAgICAgICAgIEl0IG1hbmlwdWxhdGVzIG1fTm9kZVN0YXRlIGluIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIE5vZGVObXRTdGF0ZV9wICAgICAgICAgID0gTk1UIHN0YXRlIG9mIENOCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gICAgICAgICAgICAgICAgICBrRXBsUmVqZWN0ICAgICAgICAgID0gQ04gd2FzIGluIHdyb25nIHN0YXRlIGFuZCBoYXMgYmVlbiByZXNldAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCwKKwkJCQkJIHRFcGxObXRTdGF0ZSBOb2RlTm10U3RhdGVfcCwKKwkJCQkJIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkgdEVwbE5tdFN0YXRlIExvY2FsTm10U3RhdGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiTm10U3RhdGU7CisJQllURSBiTm10U3RhdGVQcmV2OworCXRFcGxObXRTdGF0ZSBFeHBObXRTdGF0ZTsKKworCU9iZFNpemUgPSAxOworCS8vIHJlYWQgb2JqZWN0IDB4MUY4RiBOTVRfTU5Ob2RlRXhwU3RhdGVfQVU4CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY29tcHV0ZSBleHBlY3RlZCBOTVQgc3RhdGUKKwlFeHBObXRTdGF0ZSA9ICh0RXBsTm10U3RhdGUpIChiTm10U3RhdGUgfCBFUExfTk1UX1RZUEVfQ1MpOworCS8vIGNvbXB1dGUgQllURSBvZiBjdXJyZW50IE5NVCBzdGF0ZQorCWJObXRTdGF0ZSA9ICgoQllURSkgTm9kZU5tdFN0YXRlX3AgJiAweEZGKTsKKworCWlmIChFeHBObXRTdGF0ZSA9PSBrRXBsTm10Q3NOb3RBY3RpdmUpIHsJLy8gaWdub3JlIHRoZSBjdXJyZW50IHN0YXRlLCBiZWNhdXNlIHRoZSBDTiBzaGFsbCBiZSBub3QgYWN0aXZlCisJCVJldCA9IGtFcGxSZWplY3Q7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgaWYgKChFeHBObXRTdGF0ZSA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpCisJCSAgICYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NSZWFkeVRvT3BlcmF0ZSkpIHsJLy8gQ04gc3dpdGNoZWQgdG8gUmVhZHlUb09wCisJCS8vIGRlbGV0ZSB0aW1lciBmb3IgdGltZW91dCBoYW5kbGluZworCQlSZXQgPSBFcGxUaW1lcnVEZWxldGVUaW1lcigmcE5vZGVJbmZvX3AtPm1fVGltZXJIZGxMb25nZXIpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZVJlYWR5VG9PcDsKKworCQkvLyB1cGRhdGUgb2JqZWN0IDB4MUY4RiBOTVRfTU5Ob2RlRXhwU3RhdGVfQVU4IHRvIFJlYWR5VG9PcAorCQlSZXQgPSBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsIDEpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlpZiAoKHBOb2RlSW5mb19wLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOIC0+IGRlY3JlbWVudCBjb3VudGVyCisJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50LS07CisJCX0KKwkJaWYgKExvY2FsTm10U3RhdGVfcCA+PSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZSkgewkvLyBzdGFydCBwcm9jZWR1cmUgQ2hlY2tDb21tdW5pY2F0aW9uIGZvciB0aGlzIG5vZGUKKwkJCVJldCA9IEVwbE5tdE1udU5vZGVDaGVja0NvbSh1aU5vZGVJZF9wLCBwTm9kZUluZm9fcCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKExvY2FsTm10U3RhdGVfcCA9PSBrRXBsTm10TXNPcGVyYXRpb25hbCkKKwkJCSAgICAmJiAocE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID09CisJCQkJa0VwbE5tdE1udU5vZGVTdGF0ZUNvbUNoZWNrZWQpKSB7CisJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLCB1aU5vZGVJZF9wLAorCQkJCQkJCQkoKChOb2RlTm10U3RhdGVfcCAmIDB4RkYpIDw8IDgpCisJCQkJCQkJCSB8CisJCQkJCQkJCSBrRXBsTm10Q21kU3RhcnROb2RlKSk7CisKKwkJCQkvLyBpbW1lZGlhdGVseSBzdGFydCBvcHRpb25hbCBDTiwgYmVjYXVzZSBjb21tdW5pY2F0aW9uIGlzIGFsd2F5cyBPSyAoZS5nLiBhc3luYy1vbmx5IENOKQorCQkJCVJldCA9CisJCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKHVpTm9kZUlkX3AsCisJCQkJCQkJICAgIGtFcGxObXRDbWRTdGFydE5vZGUpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0KKwkJfQorCisJfSBlbHNlIGlmICgoRXhwTm10U3RhdGUgPT0ga0VwbE5tdENzUmVhZHlUb09wZXJhdGUpCisJCSAgICYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NPcGVyYXRpb25hbCkpIHsJLy8gQ04gc3dpdGNoZWQgdG8gT1BFUkFUSU9OQUwKKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZU9wZXJhdGlvbmFsOworCisJCWlmICgocE5vZGVJbmZvX3AtPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04gLT4gZGVjcmVtZW50IGNvdW50ZXIKKwkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQtLTsKKwkJfQorCisJfSBlbHNlIGlmICgoRXhwTm10U3RhdGUgIT0gTm9kZU5tdFN0YXRlX3ApCisJCSAgICYmICEoKEV4cE5tdFN0YXRlID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpKSkgewkvLyBDTiBpcyBub3QgaW4gZXhwZWN0ZWQgTk1UIHN0YXRlICh3aXRob3V0IHRoZSBleGNlcHRpb25zIGFib3ZlKQorCQlXT1JEIHdiZUVycm9yQ29kZTsKKworCQlpZiAoKHBOb2RlSW5mb19wLT4KKwkJICAgICBtX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEKSAhPSAwKSB7CisJCQkvLyBkZWNyZW1lbnQgb25seSBzaWduYWwgc2xhdmUgY291bnQgaWYgY2hlY2tlZCBvbmNlCisJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQlwTm9kZUluZm9fcC0+bV93RmxhZ3MgJj0KKwkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCX0KKworCQlpZiAocE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID09IGtFcGxObXRNbnVOb2RlU3RhdGVVbmtub3duKSB7CS8vIENOIGlzIGFscmVhZHkgaW4gc3RhdGUgdW5rbm93biwgd2hpY2ggbWVhbnMgdGhhdCBpdCBnb3QKKwkJCS8vIE5NVCByZXNldCBjb21tYW5kIGVhcmxpZXIKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyAtPiBDTiBpcyBpbiB3cm9uZyBOTVQgc3RhdGUKKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisKKwkJaWYgKHdFcnJvckNvZGVfcCA9PSAwKSB7CS8vIGFzc3VtZSB3cm9uZyBOTVQgc3RhdGUgZXJyb3IKKwkJCWlmICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQpICE9IDApIHsJLy8gTk1UIGNvbW1hbmQgaGFzIGJlZW4ganVzdCBpc3N1ZWQ7CisJCQkJLy8gaWdub3JlIHdyb25nIE5NVCBzdGF0ZSB1bnRpbCB0aW1lciBleHBpcmVzOworCQkJCS8vIG90aGVyIGVycm9ycyBsaWtlIExPU1NfUFJFU19USCBhcmUgc3RpbGwgcHJvY2Vzc2VkCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQl3RXJyb3JDb2RlX3AgPSBFUExfRV9OTVRfV1JPTkdfU1RBVEU7CisJCX0KKworCQlCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSg5KTsKKworCQkvLyAkJCQgc3RhcnQgRVJST1JfVFJFQVRNRU5UIGFuZCBpbmZvcm0gYXBwbGljYXRpb24KKwkJUmV0ID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkJICAga0VwbE5tdE5vZGVFdmVudEVycm9yLAorCQkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJCSAgIHdFcnJvckNvZGVfcCwKKwkJCQkJCQkgICAocE5vZGVJbmZvX3AtPgorCQkJCQkJCSAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkJICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCQkgICAhPSAwKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLAorCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCSB8IGtFcGxObXRDbWRSZXNldE5vZGUpKTsKKworCQkvLyByZXNldCBDTgorCQkvLyBzdG9yZSBlcnJvciBjb2RlIGluIE5NVCBjb21tYW5kIGRhdGEgZm9yIGRpYWdub3N0aWMgcHVycG9zZQorCQlBbWlTZXRXb3JkVG9MZSgmd2JlRXJyb3JDb2RlLCB3RXJyb3JDb2RlX3ApOworCQlSZXQgPQorCQkgICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeCh1aU5vZGVJZF9wLCBrRXBsTm10Q21kUmVzZXROb2RlLAorCQkJCQkgICAgICAmd2JlRXJyb3JDb2RlLAorCQkJCQkgICAgICBzaXplb2Yod2JlRXJyb3JDb2RlKSk7CisJCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCVJldCA9IGtFcGxSZWplY3Q7CisJCX0KKworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGlmIE5NVF9NTk5vZGVDdXJyU3RhdGVfQVU4IGhhcyB0byBiZSBjaGFuZ2VkCisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGVQcmV2LCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCWlmIChiTm10U3RhdGUgIT0gYk5tdFN0YXRlUHJldikgeworCQkvLyB1cGRhdGUgb2JqZWN0IDB4MUY4RSBOTVRfTU5Ob2RlQ3VyclN0YXRlX0FVOAorCQlSZXQgPSBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsIDEpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJUmV0ID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkJICAga0VwbE5tdE5vZGVFdmVudE5tdFN0YXRlLAorCQkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJCSAgIHdFcnJvckNvZGVfcCwKKwkJCQkJCQkgICAocE5vZGVJbmZvX3AtPgorCQkJCQkJCSAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkJICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCQkgICAhPSAwKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVJlc2V0CisvLworLy8gRGVzY3JpcHRpb246IHJlc2V0IGludGVybmFsIHN0cnVjdHVyZXMsIGUuZy4gdGltZXJzCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51UmVzZXQodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlpbnQgaUluZGV4OworCisJUmV0ID0gRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVwbE5tdE1udUluc3RhbmNlX2cubV9UaW1lckhkbE5tdFN0YXRlKTsKKworCWZvciAoaUluZGV4ID0gMTsgaUluZGV4IDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJICAgICBpSW5kZXgrKykgeworCQkvLyBkZWxldGUgdGltZXIgaGFuZGxlcworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVQTF9OTVRNTlVfR0VUX05PREVJTkZPKGlJbmRleCktPgorCQkJCQkgbV9UaW1lckhkbFN0YXRSZXEpOworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVQTF9OTVRNTlVfR0VUX05PREVJTkZPKGlJbmRleCktPgorCQkJCQkgbV9UaW1lckhkbExvbmdlcik7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmQwZTE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10ay5jCkBAIC0wLDAgKzEsMTg0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBOTVQtS2VybmVsc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10ay5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwOC8xMS8xMyAxNzoxMzowOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsTm10ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxUaW1lcmsuaCIKKworI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCS8vIGZvciBFcGxEbGxrUHJvY2VzcygpCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQorI2VuZGlmCisjZGVmaW5lIEVQTF9OTVRLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKE5tdEV2ZW50X3AsIE9sZE5tdFN0YXRlX3AsIE5ld05tdFN0YXRlX3ApIFwKKyAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKGtFcGxFdmVudFNpbmtObXRrIDw8IDI4KSB8IChObXRFdmVudF9wIDw8IDE2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChPbGRObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChOZXdObXRTdGF0ZV9wICYgMHhGRikpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnVjdCBmb3IgaW5zdGFuY2UgdGFibGUKK0lOU1RBTkNFX1RZUEVfQkVHSU4gRVBMX01DT19ERUNMX0lOU1RBTkNFX01FTUJFUigpCisKK1NUQVRJQyB2b2xhdGlsZSB0RXBsTm10U3RhdGUgSU5TVF9GQVIgbV9ObXRTdGF0ZTsKK1NUQVRJQyB2b2xhdGlsZSBCT09MIElOU1RfRkFSIG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlOworU1RBVElDIHZvbGF0aWxlIEJPT0wgSU5TVF9GQVIgbV9mQXBwUmVhZHlUb09wZXJhdGU7CitTVEFUSUMgdm9sYXRpbGUgQk9PTCBJTlNUX0ZBUiBtX2ZUaW1lck1zUHJlT3AyOworU1RBVElDIHZvbGF0aWxlIEJPT0wgSU5TVF9GQVIgbV9mQWxsTWFuZGF0b3J5Q05JZGVudDsKK1NUQVRJQyB2b2xhdGlsZSBCT09MIElOU1RfRkFSIG1fZkZyb3plbjsKKworSU5TVEFOQ0VfVFlQRV9FTkQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIG1hY3JvIHJlcGxhY2UgdGhlIHVuc3BlY2lmaWMgcG9pbnRlciB0byBhbiBpbnN0YW5jZSB0aHJvdWdoCisvLyB0aGUgbW9kdWwgc3BlY2lmaWMgdHlwZSBmb3IgdGhlIGxvY2FsIGluc3RhbmNlIHRhYmxlLiBUaGlzIG1hY3JvCisvLyBtdXN0IGRlZmluZWQgaW4gZWFjaCBtb2R1bC4KKy8vI2RlZmluZSB0RXBsUHRySW5zdGFuY2UgICAgICAgICAgICAgdEVwbEluc3RhbmNlSW5mbyBNRU0qCitFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfVkFSKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMX01DT19ERUZJTkVfSU5TVEFOQ0VfRkNUKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8Tk1UX0tlcm5lbC1Nb2R1bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjogVGhpcyBtb2R1bGUgcmVhbGl6ZSB0aGUgTk1ULVN0YXRlLU1hY2hpbmUgb2YgdGhlIEVQTC1TdGFjaworLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsTm10a0luaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdGlhbGl6ZXMgdGhlIGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIgPSBJbnN0YW5jZSBwb2ludGVyCisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCA9IE5vZGUgSWQgb2YgdGhlIGxva2FsIG5vZGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrSW5pdChFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUikKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE5tdGtBZGRJbnN0YW5jZShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFIpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbE5tdGtBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGRzIGEgbmV3IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIgPSBJbnN0YW5jZSBwb2ludGVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10a0FkZEluc3RhbmNlKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKQoreworCUVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwgdEVwbEtlcm5lbCBSZXQ7CisvL3RFcGxFdmVudCAgICAgICAgICAgICAgIEV2ZW50OworLy90RXBsRXZlbnRObXRTdGF0ZUNoYW5nZSBObXRTdGF0ZUNoYW5nZTsKKworCS8vIGNoZWNrIGlmIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlciB2YWxpZAorCS8vIGdldCBmcmVlIGluc3RhbmNlIGFuZCBzZXQgdGhlIGdsb2JhbGUgaW5zdGFuY2UgcG9pbnRlcgorCS8vIHNldCBhbHNvIHRoZSBpbnN0YW5jZSBhZGRyIHRvIHBhcmFtZXRlcmxpc3QKKwlFUExfTUNPX0NIRUNLX1BUUl9JTlNUQU5DRV9QVFIoKTsKKwlFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpOworCUVQTF9NQ09fU0VUX1BUUl9JTlNUQU5DRV9QVFIoKTsKKworCS8vIHNpZ24gaW5zdGFuY2UgYXMgdXNlZAorCUVQTF9NQ09fV1JJVEVfSU5TVEFOQ0VfU1RBVEUoa1N0YXRlVXNlZCk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGluaXRpYWxpemUgaW50ZXJuIHZhaWFibGVzCisJLy8gMjAwNi8wNy8zMSBkLmsuOiBzZXQgTk1ULVN0YXRlIHRvIGtFcGxObXRHc09mZgorCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9IGtFcGxObXRHc09mZjsKKwkvLyBzZXQgTk1ULVN0YXRlIHRvIGtFcGxObXRHc0luaXRpYWxpc2luZworCS8vRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0ga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCisJLy8gc2V0IGZsYWdzIHRvIEZBTFNFCisJRVBMX01DT19HTEJfVkFSKG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlKSA9IEZBTFNFOworCUVQTF9NQ09fR0xCX1ZBUihtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPSBGQUxTRTsKKwlFUExfTUNPX0dMQl9WQVIobV9mVGltZXJNc1ByZU9wMikgPSBGQUxTRTsKKwlFUExfTUNPX0dMQl9WQVIobV9mQWxsTWFuZGF0b3J5Q05JZGVudCkgPSBGQUxTRTsKKwlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IEZBTFNFOworCisvLyAgICBFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkgPSAwOworCisJLy8gaW5mb3JtIGhpZ2hlciBsYXllciBhYm91dCBzdGF0ZSBjaGFuZ2UKKwkvLyAyMDA2LzA3LzMxIGQuay46IFRoZSBFUEwgQVBJIGxheWVyL2FwcGxpY2F0aW9uIGhhcyB0byBzdGFydCBOTVQgc3RhdGUKKwkvLyAgICAgICAgICAgICAgICAgIG1hY2hpbmUgdmlhIE5tdEV2ZW50U3dSZXNldCBhZnRlciBpbml0aWFsaXNhdGlvbiBvZgorCS8vICAgICAgICAgICAgICAgICAgYWxsIG1vZHVsZXMgaGFzIGJlZW4gY29tcGxldGVkLiBETEwgaGFzIHRvIGJlIGluaXRpYWxpc2VkCisJLy8gICAgICAgICAgICAgICAgICBhZnRlciBOTVRrIGJlY2F1c2UgTk1UIHN0YXRlIHNoYWxsIG5vdCBiZSB1bmluaXRpYWxpc2VkCisJLy8gICAgICAgICAgICAgICAgICBhdCB0aGF0IHRpbWUuCisvKiAgICBObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlID0gRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpOworICAgIE5tdFN0YXRlQ2hhbmdlLm1fTm10RXZlbnQgPSBrRXBsTm10RXZlbnROb0V2ZW50OworICAgIEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdHU7CisgICAgRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlTm10U3RhdGVDaGFuZ2U7CisgICAgRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisgICAgRXZlbnQubV9wQXJnID0gJk5tdFN0YXRlQ2hhbmdlOworICAgIEV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdFN0YXRlQ2hhbmdlKTsKKyAgICBSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisqLworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxObXRrRGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIgPSBJbnN0YW5jZSBwb2ludGVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKEVQTF9VU0VfREVMRVRFSU5TVF9GVU5DICE9IEZBTFNFKQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdGtEZWxJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUikKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJLy8gc2V0IE5NVC1TdGF0ZSB0byBrRXBsTm10R3NPZmYKKwlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10R3NPZmY7CisKKwkvLyBzaWduIGluc3RhbmNlIGFzIHVudXNlZAorCUVQTF9NQ09fV1JJVEVfSU5TVEFOQ0VfU1RBVEUoa1N0YXRlVW51c2VkKTsKKworCS8vIGRlbGV0ZSB0aW1lcgorLy8gICAgUmV0ID0gRXBsVGltZXJrRGVsZXRlVGltZXIoJkVQTF9NQ09fR0xCX1ZBUihtX1RpbWVySGRsKSk7CisKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmIC8vIChFUExfVVNFX0RFTEVURUlOU1RfRlVOQyAhPSBGQUxTRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbE5tdGtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IG1haW4gcHJvY2VzcyBmdW5jdGlvbgorLy8gICAgICAgICAgICAgIC0+IHByb2Nlc3MgTk1ULVN0YXRlLU1hc2NoaW5lIHVuZCByZWFkIE5NVC1FdmVudHMgZnJvbSBRdWV1ZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXyA9IEluc3RhbmNlIHBvaW50ZXIKKy8vICAgICAgICAgICAgICBwRXZlbnRfcCAgICA9ICAgRXBsLUV2ZW50IHdpdGggTk1ULWV2ZW50IHRvIHByb2Nlc3MKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrUHJvY2VzcyhFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgdEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE5tdFN0YXRlIE9sZE5tdFN0YXRlOworCXRFcGxObXRFdmVudCBObXRFdmVudDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UgTm10U3RhdGVDaGFuZ2U7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVObXRFdmVudDoKKwkJeworCQkJTm10RXZlbnQgPSAqKCh0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZyk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlVGltZXI6CisJCXsKKwkJCU5tdEV2ZW50ID0KKwkJCSAgICAodEVwbE5tdEV2ZW50KSAoKHRFcGxUaW1lckV2ZW50QXJnICopIHBFdmVudF9wLT4KKwkJCQkJICAgIG1fcEFyZyktPm1fdWxBcmc7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxObXRJbnZhbGlkRXZlbnQ7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKwkvLyBzYXZlIE5NVC1TdGF0ZQorCS8vIG5lZWRlZCBmb3IgbGF0ZXIgY29tcGFyaXNvbiB0bworCS8vIGluZm9ybSBoZ2hlciBsYXllciBhYm91dCBzdGF0ZSBjaGFuZ2UKKwlPbGRObXRTdGF0ZSA9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKTsKKworCS8vIE5NVC1TdGF0ZS1NYXNjaGluZQorCXN3aXRjaCAoRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpKSB7CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gZ2VuZXJhbCBwYXJ0IG9mIHRoZSBzdGF0ZW1hc2NoaW5lCisKKwkJLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKwljYXNlIGtFcGxObXRHc09mZjoKKwkJeworCQkJLy8gbGVhdmUgdGhpcyBzdGF0ZSBvbmx5IGlmIGhpZ2hlciBsYXllciBzYXlzIHNvCisJCQlpZiAoTm10RXZlbnQgPT0ga0VwbE5tdEV2ZW50U3dSZXNldCkgewkvLyBuZXcgc3RhdGUga0VwbE5tdEdzSW5pdGlhbGlzaW5nCisJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBmaXJzdCBpbml0IG9mIHRoZSBoYXJkd2FyZQorCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorCQl7CisJCQkvLyBsZWF2ZSB0aGlzIHN0YXRlIG9ubHkgaWYgaGlnaGVyIGxheWVyIHNheXMgc28KKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gMjAwNi8wNy8zMSBkLmsuOiByZWFjdCBhbHNvIG9uIE5NVCByZXNldCBjb21tYW5kcyBpbiBSZXNldEFwcCBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBuZXcgc3RhdGUga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclJlc2V0QXBwOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gaW5pdCBvZiB0aGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIHByb2ZpbGUgYXJlYSBhbmQgdGhlCisJCS8vIHN0YW5kYXJkaXNlZCBkZXZpY2UgcHJvZmlsZSBhcmVhCisJY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyAyMDA2LzA3LzMxIGQuay46IHJlYWN0IGFsc28gb24gTk1UIHJlc2V0IGNvbW1hbmRzIGluIFJlc2V0QXBwIHN0YXRlCisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGxlYXZlIHRoaXMgc3RhdGUgb25seSBpZiBoaWdoZXIgbGF5ZXIKKwkJCQkvLyBzYXkgc28KKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJSZXNldENvbToKKwkJCQl7CisJCQkJCS8vIG5ldyBzdGF0ZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb24KKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBpbml0IG9mIHRoZSBjb21tdW5pY2F0aW9uIHByb2ZpbGUgYXJlYQorCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyAyMDA2LzA3LzMxIGQuay46IHJlYWN0IGFsc28gb24gTk1UIHJlc2V0IGNvbW1hbmRzIGluIFJlc2V0Q29tbSBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGxlYXZlIHRoaXMgc3RhdGUgb25seSBpZiBoaWdoZXIgbGF5ZXIKKwkJCQkvLyBzYXkgc28KKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCS8vIG5ldyBzdGF0ZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb24KKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBidWlsZCB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGluZm9zIGZyb20gT0QKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwkJeworCQkJLy8gcmVzZXQgZmxhZ3MKKwkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkgPSBGQUxTRTsKKwkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPSBGQUxTRTsKKwkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID0gRkFMU0U7CisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIDIwMDYvMDcvMzEgZC5rLjogcmVhY3QgYWxzbyBvbiBOTVQgcmVzZXQgY29tbWFuZHMgaW4gUmVzZXRDb25mIHN0YXRlCisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gbGVhdmUgdGhpcyBzdGF0ZSBvbmx5IGlmIGhpZ2hlciBsYXllciBzYXlzIHNvCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyQ3NOb3RBY3RpdmU6CisJCQkJewkvLyBOb2RlIHNob3VsZCBiZSBDTgorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzTm90QWN0aXZlOworCQkJCQlicmVhazsKKworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlck1zTm90QWN0aXZlOgorCQkJCXsJLy8gTm9kZSBzaG91bGQgYmUgQ04KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgPT0gMCkKKwkJCQkJLy8gbm8gTU4gZnVuY3Rpb25hbGl0eQorCQkJCQkvLyBUT0RPOiAtY3JlYXRlIGVycm9yIEVfTk1UX0JBMV9OT19NTl9TVVBQT1JUCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID0gVFJVRTsKKyNlbHNlCisKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRNc05vdEFjdGl2ZTsKKyNlbmRpZgorCQkJCQlicmVhazsKKworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBDTiBwYXJ0IG9mIHRoZSBzdGF0ZW1hc2NoaW5lCisKKwkJLy8gbm9kZSBsaXN0ZSBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCWNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorCQl7CisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIDIwMDYvMDcvMzEgZC5rLjogcmVhY3QgYWxzbyBvbiBOTVQgcmVzZXQgY29tbWFuZHMgaW4gTm90QWN0aXZlIHN0YXRlCisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisvLyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsVGltZXJrRGVsZXRlVGltZXIoJkVQTF9NQ09fR0xCX1ZBUihtX1RpbWVySGRsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKy8vICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxUaW1lcmtEZWxldGVUaW1lcigmRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworLy8gICAgICAgICAgICAgICAgICAgIFJldCA9IEVwbFRpbWVya0RlbGV0ZVRpbWVyKCZFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldCBDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKy8vICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxUaW1lcmtEZWxldGVUaW1lcigmRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gc2VlIGlmIFNvQSBvciBTb0MgcmVjZWl2ZWQKKwkJCQkvLyBrLnQuIDIwLjA3LjIwMDY6IG9ubHkgU29BIGZvcmNlcyBjaGFuZ2Ugb2Ygc3RhdGUKKwkJCQkvLyBzZWUgRVBMIFYyIERTIDEuMC4wIHAuMjY3CisJCQkJLy8gY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBuZXcgc3RhdGUgUFJFX09QRVJBVElPTkFMMQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworLy8gICAgICAgICAgICAgICAgICAgIFJldCA9IEVwbFRpbWVya0RlbGV0ZVRpbWVyKCZFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gdGltZW91dCBmb3IgU29BIGFuZCBTb2MKKwkJCWNhc2Uga0VwbE5tdEV2ZW50VGltZXJCYXNpY0V0aGVybmV0OgorCQkJCXsKKwkJCQkJLy8gbmV3IHN0YXRlIEJBU0lDX0VUSEVSTkVUCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NCYXNpY0V0aGVybmV0OworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKwkJeworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0IENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTdG9wTm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRTdG9wTm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NTdG9wcGVkOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjaGVjayBpZiBTb0MgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0IENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTdG9wTm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRTdG9wTm9kZToKKwkJCQl7CisJCQkJCS8vIHJlc2V0IGZsYWdzCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkKKwkJCQkJICAgID0gRkFMU0U7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkgICAgRkFMU0U7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NTdG9wcGVkOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQkvLyByZXNldCBmbGFncworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpCisJCQkJCSAgICA9IEZBTFNFOworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJICAgIEZBTFNFOworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjaGVjayBpZiBhcHBsaWNhdGlvbiBpcyByZWFkeSB0byBvcGVyYXRlCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyUmVhZHlUb09wZXJhdGU6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiBjb21tYW5kIE5NVEVuYWJsZVJlYWR5VG9PcGVyYXRlIGZyb20gTU4gd2FzIHJlY2VpdmVkCisJCQkJCWlmIChFUExfTUNPX0dMQl9WQVIobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID09IFRSVUUpIHsJLy8gcmVzZXQgZmxhZ3MKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkJICAgIEZBTFNFOworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCQkgICAgRkFMU0U7CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdENzUmVhZHlUb09wZXJhdGU7CisJCQkJCX0gZWxzZSB7CS8vIHNldCBGbGFnCisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mQXBwUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kbyBFbmFibGVSZWFkeVRvT3BlcmF0ZQorCQkJY2FzZSBrRXBsTm10RXZlbnRFbmFibGVSZWFkeVRvT3BlcmF0ZToKKwkJCQl7CisJCQkJCS8vIGNoZWNrIGlmIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisJCQkJCWlmIChFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID09IFRSVUUpIHsJLy8gcmVzZXQgZmxhZ3MKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkJICAgIEZBTFNFOworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCQkgICAgRkFMU0U7CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdENzUmVhZHlUb09wZXJhdGU7CisJCQkJCX0gZWxzZSB7CS8vIHNldCBGbGFnCisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHNob3VsZCBiZSBjb25maWd1cmVkIHVuZCBhcHBsaWNhdGlvbiBpcyByZWFkeQorCWNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3RvcE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3RvcE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzU3RvcHBlZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3RhcnROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFN0YXJ0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NPcGVyYXRpb25hbDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJeworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN0b3BOb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFN0b3BOb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1N0b3BwZWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIEVudGVyUHJlT3BlcmF0aW9uYWwyCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyUHJlT3BlcmF0aW9uYWwyOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgc3RvcHBlZCBieSBNTgorCQkvLyAtPiBvbmx5IHByb2Nlc3MgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBFbnRlclByZU9wZXJhdGlvbmFsMgorCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBubyBlcGwgY3ljbGUKKwkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJCS8vIGQuay46IGhvdyBkb2VzIHRoaXMgZXJyb3Igb2NjdXI/IG9uIENSQyBlcnJvcnMKKy8qICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorKi8KKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlcToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQl7CS8vIEVwbC1GcmFtZSBvbiBuZXQgLT4gc3RvcCBhbnkgY29tbXVuaWNhdGlvbgorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE1OIHBhcnQgb2YgdGhlIHN0YXRlbWFzY2hpbmUKKworCQkvLyBNTiBsaXN0ZW4gdG8gbmV0d29yaworCQkvLyAtPiBpZiBubyBFUEwgdHJhZmZpYyBnbyB0byBuZXh0IHN0YXRlCisJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgPT0gMCkKKwkJCS8vIG5vIE1OIGZ1bmN0aW9uYWxpdHkKKwkJCS8vIFRPRE86IC1jcmVhdGUgZXJyb3IgRV9OTVRfQkExX05PX01OX1NVUFBPUlQKKwkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID0gVFJVRTsKKyNlbHNlCisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dCBldmVudAorCQkJY2FzZSBrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQ6CisJCQkJeworCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSKG1fZkZyb3plbikgPT0gRkFMU0UpIHsJLy8gbmV3IHN0YXRlIEJhc2ljRXRoZXJuZXQKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdE1zQmFzaWNFdGhlcm5ldDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0IGV2ZW50CisJCQljYXNlIGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDE6CisJCQkJeworCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSKG1fZkZyb3plbikgPT0gRkFMU0UpIHsJLy8gbmV3IHN0YXRlIFByZU9wMQorCQkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJCSAgICBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE7CisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mVGltZXJNc1ByZU9wMikgPSBGQUxTRTsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZBbGxNYW5kYXRvcnlDTklkZW50KSA9CisJCQkJCQkgICAgRkFMU0U7CisKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworI2VuZGlmIC8vICgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSA9PSAwKQorCisJCQlicmVhazsKKwkJfQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkvLyBNTiBwcm9jZXNzIHJlZHVjZXMgZXBsIGN5Y2xlCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCQkvLyBkLmsuIE1TUHJlT3AxLT5DU1ByZU9wMTogbm9uc2Vuc2UgLT4ga2VlcCBzdGF0ZQorCQkJCS8qCisJCQkJICAgY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCSAgIHsKKwkJCQkgICBFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisJCQkJICAgYnJlYWs7CisJCQkJICAgfQorCQkJCSAqLworCisJCQljYXNlIGtFcGxObXRFdmVudEFsbE1hbmRhdG9yeUNOSWRlbnQ6CisJCQkJewkvLyBhbGwgbWFuZGF0b3J5IENOIGlkZW50aWZpZWQKKwkJCQkJaWYgKEVQTF9NQ09fR0xCX1ZBUihtX2ZUaW1lck1zUHJlT3AyKSAhPQorCQkJCQkgICAgRkFMU0UpIHsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOworCQkJCQl9IGVsc2UgeworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkFsbE1hbmRhdG9yeUNOSWRlbnQpID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AyOgorCQkJCXsJLy8gcmVzaWRlbmNlIHRpbWUgZm9yIFByZU9wMSBpcyBlbGFwc2VkCisJCQkJCWlmIChFUExfTUNPX0dMQl9WQVIKKwkJCQkJICAgIChtX2ZBbGxNYW5kYXRvcnlDTklkZW50KSAhPSBGQUxTRSkgeworCQkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJCSAgICBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mVGltZXJNc1ByZU9wMikgPSBUUlVFOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBNTiBwcm9jZXNzIGZ1bGwgZXBsIGN5Y2xlCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclJlYWR5VG9PcGVyYXRlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBhbGwgbWFkYXRvcnkgbm9kZXMgcmVhZHkgdG8gb3BlcmF0ZQorCQkvLyAtPiBNTiBwcm9jZXNzIGZ1bGwgZXBsIGN5Y2xlCisJY2FzZSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZToKKwkJeworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJNc09wZXJhdGlvbmFsOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRNc09wZXJhdGlvbmFsOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgZXBsY3ljbGUgcHJvY2Vzc2luZworCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyAgbm9ybWFsIGV0aGVybmV0IHRyYWZmaWMKKwljYXNlIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBFUEwgZnJhbWVzIHJlY2VpdmVkCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQl7CS8vIG90aGVyIE1OIGluIG5ldHdvcmsKKwkJCQkJLy8gJCQkIGQuay46IGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJCS8vIGQuay4gQkUtPlByZU9wMSBvbiBjeWNsZSBlcnJvcj8gTm8KKy8qICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorKi8KKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwlkZWZhdWx0OgorCQl7CisJCQkvL0RFQlVHX0VQTF9EQkdMVkxfTk1US19UUkFDRTAoRVBMX0RCR0xWTF9OTVQgLCJFcnJvciBpbiBFcGxObXRQcm9jZXNzOiBVbmtub3duIE5NVC1TdGF0ZSIpOworCQkJLy9FUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJUmV0ID0ga0VwbE5tdEludmFsaWRTdGF0ZTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkvLyBpbmZvcm0gaGlnaGVyIGxheWVyIGFib3V0IFN0YXRlLUNoYW5nZSBpZiBuZWVkZWQKKwlpZiAoT2xkTm10U3RhdGUgIT0gRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpKSB7CisJCUVQTF9OTVRLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKE5tdEV2ZW50LCBPbGRObXRTdGF0ZSwKKwkJCQkJICAgICAgRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpKTsKKworCQkvLyBkLmsuOiBtZW1vcml6ZSBOTVQgc3RhdGUgYmVmb3JlIHBvc3RpbmcgYW55IGV2ZW50cworCQlObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlID0gRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpOworCisJCS8vIGluZm9ybSBETEwKKwkJaWYgKChPbGRObXRTdGF0ZSA+IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikKKwkJICAgICYmIChFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPD0KKwkJCWtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikpIHsKKwkJCS8vIHNlbmQgRExMIERFSU5JVAorCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtEZXN0cm95OworCQkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLAorCQkJCSAgIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZPbGRObXRTdGF0ZTsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE9sZE5tdFN0YXRlKTsKKwkJCS8vIGQuay46IGRpcmVjdGx5IGNhbGwgRExMayBwcm9jZXNzIGZ1bmN0aW9uLCBiZWNhdXNlCisJCQkvLyAgICAgICAxLiBleGVjdXRpb24gb2YgcHJvY2VzcyBmdW5jdGlvbiBpcyBzdGlsbCBzeW5jaG9uaXplZCBhbmQgc2VyaWFsaXplZCwKKwkJCS8vICAgICAgIDIuIGl0IGlzIHRoZSBzYW1lIGFzIHdpdGhvdXQgZXZlbnQgcXVldWVzIChpLmUuIHdlbGwgdGVzdGVkKSwKKwkJCS8vICAgICAgIDMuIERMTGsgd2lsbCBnZXQgdGhvc2UgbmVjZXNzYXJ5IGV2ZW50cyBldmVuIGlmIGV2ZW50IHF1ZXVlIGlzIGZ1bGwsCisJCQkvLyAgICAgICA0LiBldmVudCBxdWV1ZSBpcyB2ZXJ5IGluZWZmaWNpZW50CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCQkJUmV0ID0gRXBsRGxsa1Byb2Nlc3MoJkV2ZW50KTsKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisjZW5kaWYKKwkJfSBlbHNlIGlmICgoT2xkTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKQorCQkJICAgJiYgKEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA+CisJCQkgICAgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSkgeworCQkJLy8gc2VuZCBETEwgSU5JVAorCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtDcmVhdGU7CisJCQlFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsCisJCQkJICAgc2l6ZW9mKEV2ZW50Lm1fTmV0VGltZSkpOworCQkJRXZlbnQubV9wQXJnID0gJk5tdFN0YXRlQ2hhbmdlLm1fTmV3Tm10U3RhdGU7CisJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlKTsKKwkJCS8vIGQuay46IGRpcmVjdGx5IGNhbGwgRExMayBwcm9jZXNzIGZ1bmN0aW9uLCBiZWNhdXNlCisJCQkvLyAgICAgICAxLiBleGVjdXRpb24gb2YgcHJvY2VzcyBmdW5jdGlvbiBpcyBzdGlsbCBzeW5jaG9uaXplZCBhbmQgc2VyaWFsaXplZCwKKwkJCS8vICAgICAgIDIuIGl0IGlzIHRoZSBzYW1lIGFzIHdpdGhvdXQgZXZlbnQgcXVldWVzIChpLmUuIHdlbGwgdGVzdGVkKSwKKwkJCS8vICAgICAgIDMuIERMTGsgd2lsbCBnZXQgdGhvc2UgbmVjZXNzYXJ5IGV2ZW50cyBldmVuIGlmIGV2ZW50IHF1ZXVlIGlzIGZ1bGwKKwkJCS8vICAgICAgIDQuIGV2ZW50IHF1ZXVlIGlzIHZlcnkgaW5lZmZpY2llbnQKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJCQlSZXQgPSBFcGxEbGxrUHJvY2VzcygmRXZlbnQpOworI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKyNlbmRpZgorCQl9IGVsc2UKKwkJICAgIGlmICgoRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID09IGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQpCisJCQl8fCAoRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID09CisJCQkgICAga0VwbE5tdE1zQmFzaWNFdGhlcm5ldCkpIHsKKwkJCXRFcGxEbGxBc3luY1JlcVByaW9yaXR5IEFzeW5jUmVxUHJpb3JpdHk7CisKKwkJCS8vIHNlbmQgRExMIEZpbGwgQXN5bmMgVHggQnVmZmVyLCBiZWNhdXNlIHN0YXRlIEJhc2ljRXRoZXJuZXQgd2FzIGVudGVyZWQKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRmlsbFR4OworCQkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLAorCQkJCSAgIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJCUFzeW5jUmVxUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYzsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZBc3luY1JlcVByaW9yaXR5OworCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoQXN5bmNSZXFQcmlvcml0eSk7CisJCQkvLyBkLmsuOiBkaXJlY3RseSBjYWxsIERMTGsgcHJvY2VzcyBmdW5jdGlvbiwgYmVjYXVzZQorCQkJLy8gICAgICAgMS4gZXhlY3V0aW9uIG9mIHByb2Nlc3MgZnVuY3Rpb24gaXMgc3RpbGwgc3luY2hvbml6ZWQgYW5kIHNlcmlhbGl6ZWQsCisJCQkvLyAgICAgICAyLiBpdCBpcyB0aGUgc2FtZSBhcyB3aXRob3V0IGV2ZW50IHF1ZXVlcyAoaS5lLiB3ZWxsIHRlc3RlZCksCisJCQkvLyAgICAgICAzLiBETExrIHdpbGwgZ2V0IHRob3NlIG5lY2Vzc2FyeSBldmVudHMgZXZlbiBpZiBldmVudCBxdWV1ZSBpcyBmdWxsCisJCQkvLyAgICAgICA0LiBldmVudCBxdWV1ZSBpcyB2ZXJ5IGluZWZmaWNpZW50CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCQkJUmV0ID0gRXBsRGxsa1Byb2Nlc3MoJkV2ZW50KTsKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisjZW5kaWYKKwkJfQorCQkvLyBpbmZvcm0gaGlnaGVyIGxheWVyIGFib3V0IHN0YXRlIGNoYW5nZQorCQlObXRTdGF0ZUNoYW5nZS5tX05tdEV2ZW50ID0gTm10RXZlbnQ7CisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdHU7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlOworCQlFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJRXZlbnQubV9wQXJnID0gJk5tdFN0YXRlQ2hhbmdlOworCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRTdGF0ZUNoYW5nZSk7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJRVBMX0RCR0xWTF9OTVRLX1RSQUNFMgorCQkgICAgKCJFcGxObXRrUHJvY2VzcyhOTVQtRXZlbnQgPSAweCUwNFgpOiBOZXcgTk1ULVN0YXRlID0gMHglMDNYXG4iLAorCQkgICAgIE5tdEV2ZW50LCBObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlKTsKKworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdGtHZXRObXRTdGF0ZQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm4gdGhlIGFjdHVlbGwgTk1ULVN0YXRlIGFuZCB0aGUgYml0cworLy8gICAgICAgICAgICAgIHRvIGZvciBNTi0gb3IgQ04tbW9kZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXyA9IEluc3RhbmNlcG9pbnRlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbE5tdFN0YXRlID0gTk1ULVN0YXRlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE5tdFN0YXRlIFBVQkxJQworRXBsTm10a0dldE5tdFN0YXRlKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKQoreworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworCU5tdFN0YXRlID0gRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpOworCisJcmV0dXJuIE5tdFN0YXRlOworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGtDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10a0NhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDcxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGtDYWwuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyIG9mIHRoZQorICAgICAgICAgICAgICAgIE5NVC1LZXJuZWwtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10a0NhbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNiAtay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrQ2FsLmgiCisKKy8vIFRPRE86IGluaXQgZnVuY3Rpb24gbmVlZGVkIHRvIHByZXBhcmUgRXBsTm10a0dldE5tdFN0YXRlIGZvcgorLy8gICAgICAgaW8tY29udHJvbGwtY2FsbCBmcm9tIEVwbE5tdHVDYWwtTW9kdWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10dS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlMTZhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10dS5jCkBAIC0wLDAgKzEsNzA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIE5NVC1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10dS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzEwIDE3OjE3OjQyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10dS5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsVGltZXJ1LmgiCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsTm10dVN0YXRlQ2hhbmdlQ2FsbGJhY2sgbV9wZm5ObXRDaGFuZ2VDYjsKKwl0RXBsVGltZXJIZGwgbV9UaW1lckhkbDsKKworfSB0RXBsTm10dUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE5tdHVJbnN0YW5jZSBFcGxObXR1SW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXR1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVJbml0KCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE5tdHVBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCUVwbE5tdHVJbnN0YW5jZV9nLm1fcGZuTm10Q2hhbmdlQ2IgPSBOVUxMOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXR1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFcGxObXR1SW5zdGFuY2VfZy5tX3Bmbk5tdENoYW5nZUNiID0gTlVMTDsKKworCS8vIGRlbGV0ZSB0aW1lcgorCVJldCA9IEVwbFRpbWVydURlbGV0ZVRpbWVyKCZFcGxObXR1SW5zdGFuY2VfZy5tX1RpbWVySGRsKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dU5tdEV2ZW50CisvLworLy8gRGVzY3JpcHRpb246IHNlbmRzIHRoZSBOTVQtRXZlbnQgdG8gdGhlIE5NVC1TdGF0ZS1NYXNjaGluZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIE5tdEV2ZW50X3AgID0gTk1ULUV2ZW50IHRvIHNlbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dU5tdEV2ZW50KHRFcGxObXRFdmVudCBObXRFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxFdmVudCBFdmVudDsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJRXZlbnQubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwlFdmVudC5tX05ldFRpbWUubV9kd1NlYyA9IDA7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlTm10RXZlbnQ7CisJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50X3A7CisJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnRfcCk7CisKKwlSZXQgPSBFcGxFdmVudHVQb3N0KCZFdmVudCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXR1R2V0Tm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgYWN0dWVsbCBOTVQtU3RhdGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsTm10U3RhdGUgID0gTk1ULVN0YXRlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE5tdFN0YXRlIFBVQkxJQyBFcGxObXR1R2V0Tm10U3RhdGUoKQoreworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworCS8vICQkJCBjYWxsIGZ1bmN0aW9uIG9mIGNvbW11bmljYXRpb24gYWJzdHJhY3Rpb24gbGF5ZXIKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKyNlbHNlCisJTm10U3RhdGUgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gTm10U3RhdGU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVQcm9jZXNzRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIGV2ZW50IHF1ZXVlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVwbEV2ZW50X3AgPSAgIHBvaW50ZXIgdG8gZXZlbnQKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJvY2VzcyBldmVudAorCXN3aXRjaCAocEVwbEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJCS8vIHN0YXRlIGNoYW5nZSBvZiBOTVQtTW9kdWxlCisJY2FzZSBrRXBsRXZlbnRUeXBlTm10U3RhdGVDaGFuZ2U6CisJCXsKKwkJCXRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlICpwTm10U3RhdGVDaGFuZ2U7CisKKwkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJUmV0ID0KKwkJCSAgICBFcGxUaW1lcnVEZWxldGVUaW1lcigmRXBsTm10dUluc3RhbmNlX2cubV9UaW1lckhkbCk7CisKKwkJCXBObXRTdGF0ZUNoYW5nZSA9CisJCQkgICAgKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlICopIHBFcGxFdmVudF9wLT5tX3BBcmc7CisKKwkJCS8vIGNhbGwgY2ItZnVuY3Rpb25zIHRvIGluZm9ybSBoaWdoZXIgbGF5ZXIKKwkJCWlmIChFcGxObXR1SW5zdGFuY2VfZy5tX3Bmbk5tdENoYW5nZUNiICE9IE5VTEwpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXR1SW5zdGFuY2VfZy4KKwkJCQkgICAgbV9wZm5ObXRDaGFuZ2VDYigqcE5tdFN0YXRlQ2hhbmdlKTsKKwkJCX0KKworCQkJaWYgKFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBldmVyeXRoaW5nIGlzIE9LLCBzbyBzd2l0Y2ggdG8gbmV4dCBzdGF0ZSBpZiBuZWNlc3NhcnkKKwkJCQlzd2l0Y2ggKHBObXRTdGF0ZUNoYW5nZS0+bV9OZXdObXRTdGF0ZSkgeworCQkJCQkvLyBFUEwgc3RhY2sgaXMgbm90IHJ1bm5pbmcKKwkJCQljYXNlIGtFcGxObXRHc09mZjoKKwkJCQkJYnJlYWs7CisKKwkJCQkJLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKwkJCQljYXNlIGtFcGxObXRHc0luaXRpYWxpc2luZzoKKwkJCQkJeworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJSZXNldEFwcCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIGluaXQgb2YgdGhlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBwcm9maWxlIGFyZWEgYW5kIHRoZQorCQkJCQkvLyBzdGFuZGFyZGlzZWQgZGV2aWNlIHByb2ZpbGUgYXJlYQorCQkJCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwkJCQkJeworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJSZXNldENvbSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIGluaXQgb2YgdGhlIGNvbW11bmljYXRpb24gcHJvZmlsZSBhcmVhCisJCQkJY2FzZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb246CisJCQkJCXsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyUmVzZXRDb25maWcpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBidWlsZCB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGluZm9zIGZyb20gT0QKKwkJCQljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwkJCQkJeworCQkJCQkJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCisJCQkJCQkvLyBnZXQgbm9kZSBJRCBmcm9tIE9ECisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkgfHwgKEVQTF9PQkRfVVNFX0tFUk5FTCAhPSBGQUxTRSkKKwkJCQkJCXVpTm9kZUlkID0KKwkJCQkJCSAgICBFcGxPYmR1R2V0Tm9kZUlkCisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUik7CisjZWxzZQorCQkJCQkJdWlOb2RlSWQgPSAwOworI2VuZGlmCisJCQkJCQkvL2NoZWNrIG5vZGUgSUQgaWYgbm90IHNob3VsZCBiZSBtYXN0ZXIgb3Igc2xhdmUKKwkJCQkJCWlmICh1aU5vZGVJZCA9PSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQpIHsJLy8gbm9kZSBzaGFsbCBiZSBNTgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyTXNOb3RBY3RpdmUpOworI2Vsc2UKKwkJCQkJCQlUUkFDRTAKKwkJCQkJCQkgICAgKCJFcGxObXR1UHJvY2VzcygpOiBubyBNTiBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkXG4iKTsKKyNlbmRpZgorCQkJCQkJfSBlbHNlIHsJLy8gbm9kZSBzaGFsbCBiZSBDTgorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJDc05vdEFjdGl2ZSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gQ04gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisJCQkJCS8vIG5vZGUgbGlzdGVucyBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCQkJCWNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorCQkJCQl7CisJCQkJCQlEV09SRCBkd0J1ZmZlcjsKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJCQl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwkJCQkJCS8vIGNyZWF0ZSB0aW1lciB0byBzd2l0Y2ggYXV0b21hdGljYWxseSB0byBCYXNpY0V0aGVybmV0IGlmIG5vIE1OIGF2YWlsYWJsZSBpbiBuZXR3b3JrCisKKwkJCQkJCS8vIHJlYWQgTk1UX0NOQmFzaWNFdGhlcm5ldFRpbWVyb3V0X1UzMiBmcm9tIE9ECisJCQkJCQlPYmRTaXplID0gc2l6ZW9mKGR3QnVmZmVyKTsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSB8fCAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5CisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgMHgxRjk5LCAweDAwLCAmZHdCdWZmZXIsCisJCQkJCQkgICAgICZPYmRTaXplKTsKKyNlbHNlCisJCQkJCQlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKyNlbmRpZgorCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKGR3QnVmZmVyICE9IDApIHsJLy8gQmFzaWNFdGhlcm5ldCBpcyBlbmFibGVkCisJCQkJCQkJLy8gY29udmVydCB1cyBpbnRvIG1zCisJCQkJCQkJZHdCdWZmZXIgPQorCQkJCQkJCSAgICBkd0J1ZmZlciAvIDEwMDA7CisJCQkJCQkJaWYgKGR3QnVmZmVyID09IDApIHsJLy8gdGltZXIgd2FzIGJlbG93IG9uZSBtcworCQkJCQkJCQkvLyBzZXQgb25lIG1zCisJCQkJCQkJCWR3QnVmZmVyID0gMTsKKwkJCQkJCQl9CisJCQkJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPQorCQkJCQkJCSAgICBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJCQlUaW1lckFyZy5tX3VsQXJnID0KKwkJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICAgIGtFcGxObXRFdmVudFRpbWVyQmFzaWNFdGhlcm5ldDsKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisJCQkJCQkJICAgICgmRXBsTm10dUluc3RhbmNlX2cuCisJCQkJCQkJICAgICBtX1RpbWVySGRsLAorCQkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICAgICBkd0J1ZmZlciwKKwkJCQkJCQkgICAgIFRpbWVyQXJnKTsKKwkJCQkJCQkvLyBwb3RlbnRpYWwgZXJyb3IgaXMgZm9yd2FyZGVkIHRvIGV2ZW50IHF1ZXVlIHdoaWNoIGdlbmVyYXRlcyBlcnJvciBldmVudAorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHByb2Nlc3NlcyBvbmx5IGFzeW5jIGZyYW1lcworCQkJCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgcHJvY2Vzc2VzIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZnJhbWVzCisJCQkJY2FzZSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI6CisJCQkJCXsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyUmVhZHlUb09wZXJhdGUpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHNob3VsZCBiZSBjb25maWd1cmVkIHVuZCBhcHBsaWNhdGlvbiBpcyByZWFkeQorCQkJCWNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9ybWFsIHdvcmsgc3RhdGUKKwkJCQljYXNlIGtFcGxObXRDc09wZXJhdGlvbmFsOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgc3RvcHBlZCBieSBNTgorCQkJCQkvLyAtPiBvbmx5IHByb2Nlc3MgYXN5bmNocm9ub3VzIGZyYW1lcworCQkJCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBubyBFUEwgY3ljbGUKKwkJCQkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwkJCQljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyBNTiBwYXJ0IG9mIHRoZSBzdGF0ZSBtYWNoaW5lCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkJCS8vIG5vZGUgbGlzdGVucyBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCQkJCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQkJCQl7CisJCQkJCQlEV09SRCBkd0J1ZmZlcjsKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJCQl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwkJCQkJCS8vIGNyZWF0ZSB0aW1lciB0byBzd2l0Y2ggYXV0b21hdGljYWxseSB0byBCYXNpY0V0aGVybmV0L1ByZU9wMSBpZiBubyBvdGhlciBNTiBhY3RpdmUgaW4gbmV0d29yaworCisJCQkJCQkvLyBjaGVjayBOTVRfU3RhcnRVcF9VMzIuQml0MTMKKwkJCQkJCS8vIHJlYWQgTk1UX1N0YXJ0VXBfVTMyIGZyb20gT0QKKwkJCQkJCU9iZFNpemUgPSBzaXplb2YoZHdCdWZmZXIpOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApIHx8IChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE9iZHVSZWFkRW50cnkKKwkJCQkJCSAgICAoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAweDFGODAsIDB4MDAsICZkd0J1ZmZlciwKKwkJCQkJCSAgICAgJk9iZFNpemUpOworI2Vsc2UKKwkJCQkJCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworI2VuZGlmCisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoZHdCdWZmZXIgJiBFUExfTk1UU1RfQkFTSUNFVEhFUk5FVCkgPT0gMCkgewkvLyBOTVRfU3RhcnRVcF9VMzIuQml0MTMgPT0gMAorCQkJCQkJCS8vIG5ldyBzdGF0ZSBQcmVPcGVyYXRpb25hbDEKKwkJCQkJCQlUaW1lckFyZy5tX3VsQXJnID0KKwkJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICAgIGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDE7CisJCQkJCQl9IGVsc2UgewkvLyBOTVRfU3RhcnRVcF9VMzIuQml0MTMgPT0gMQorCQkJCQkJCS8vIG5ldyBzdGF0ZSBCYXNpY0V0aGVybmV0CisJCQkJCQkJVGltZXJBcmcubV91bEFyZyA9CisJCQkJCQkJICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICBrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQ7CisJCQkJCQl9CisKKwkJCQkJCS8vIHJlYWQgTk1UX0Jvb3RUaW1lX1JFQy5NTldhaXROb3RBY3RfVTMyIGZyb20gT0QKKwkJCQkJCU9iZFNpemUgPSBzaXplb2YoZHdCdWZmZXIpOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApIHx8IChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE9iZHVSZWFkRW50cnkKKwkJCQkJCSAgICAoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAweDFGODksIDB4MDEsICZkd0J1ZmZlciwKKwkJCQkJCSAgICAgJk9iZFNpemUpOworI2Vsc2UKKwkJCQkJCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworI2VuZGlmCisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvLyBjb252ZXJ0IHVzIGludG8gbXMKKwkJCQkJCWR3QnVmZmVyID0gZHdCdWZmZXIgLyAxMDAwOworCQkJCQkJaWYgKGR3QnVmZmVyID09IDApIHsJLy8gdGltZXIgd2FzIGJlbG93IG9uZSBtcworCQkJCQkJCS8vIHNldCBvbmUgbXMKKwkJCQkJCQlkd0J1ZmZlciA9IDE7CisJCQkJCQl9CisJCQkJCQlUaW1lckFyZy5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMKKwkJCQkJCSAgICAoJkVwbE5tdHVJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX1RpbWVySGRsLAorCQkJCQkJICAgICAodW5zaWduZWQgbG9uZylkd0J1ZmZlciwKKwkJCQkJCSAgICAgVGltZXJBcmcpOworCQkJCQkJLy8gcG90ZW50aWFsIGVycm9yIGlzIGZvcndhcmRlZCB0byBldmVudCBxdWV1ZSB3aGljaCBnZW5lcmF0ZXMgZXJyb3IgZXZlbnQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwkJCQljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMToKKwkJCQkJeworCQkJCQkJRFdPUkQgZHdCdWZmZXIgPSAwOworCQkJCQkJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwkJCQkJCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKworCQkJCQkJLy8gY3JlYXRlIHRpbWVyIHRvIHN3aXRjaCBhdXRvbWF0aWNhbGx5IHRvIFByZU9wMiBpZiBNTiBpZGVudGlmaWVkIGFsbCBtYW5kYXRvcnkgQ05zCisKKwkJCQkJCS8vIHJlYWQgTk1UX0Jvb3RUaW1lX1JFQy5NTldhaXRQcmVPcDFfVTMyIGZyb20gT0QKKwkJCQkJCU9iZFNpemUgPSBzaXplb2YoZHdCdWZmZXIpOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApIHx8IChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE9iZHVSZWFkRW50cnkKKwkJCQkJCSAgICAoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAweDFGODksIDB4MDMsICZkd0J1ZmZlciwKKwkJCQkJCSAgICAgJk9iZFNpemUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCS8vIGlnbm9yZSBlcnJvciwgYmVjYXVzZSB0aGlzIHRpbWVvdXQgaXMgb3B0aW9uYWwKKwkJCQkJCQlkd0J1ZmZlciA9IDA7CisJCQkJCQl9CisjZW5kaWYKKwkJCQkJCWlmIChkd0J1ZmZlciA9PSAwKSB7CS8vIGRlbGF5IGlzIGRlYWN0aXZhdGVkCisJCQkJCQkJLy8gaW1tZWRpYXRlbHkgcG9zdCB0aW1lciBldmVudAorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkJCSAgICAoa0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvLyBjb252ZXJ0IHVzIGludG8gbXMKKwkJCQkJCWR3QnVmZmVyID0gZHdCdWZmZXIgLyAxMDAwOworCQkJCQkJaWYgKGR3QnVmZmVyID09IDApIHsJLy8gdGltZXIgd2FzIGJlbG93IG9uZSBtcworCQkJCQkJCS8vIHNldCBvbmUgbXMKKwkJCQkJCQlkd0J1ZmZlciA9IDE7CisJCQkJCQl9CisJCQkJCQlUaW1lckFyZy5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCQlUaW1lckFyZy5tX3VsQXJnID0KKwkJCQkJCSAgICAodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgICBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AyOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisJCQkJCQkgICAgKCZFcGxObXR1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9UaW1lckhkbCwKKwkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpZHdCdWZmZXIsCisJCQkJCQkgICAgIFRpbWVyQXJnKTsKKwkJCQkJCS8vIHBvdGVudGlhbCBlcnJvciBpcyBmb3J3YXJkZWQgdG8gZXZlbnQgcXVldWUgd2hpY2ggZ2VuZXJhdGVzIGVycm9yIGV2ZW50CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgcHJvY2Vzc2VzIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZnJhbWVzCisJCQkJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwkJCQljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJCQkJY2FzZSBrRXBsTm10TXNPcGVyYXRpb25hbDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBubyBFUEwgY3ljbGUKKwkJCQkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwkJCQljYXNlIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJVFJBQ0UxCisJCQkJCQkgICAgKCJFcGxObXR1UHJvY2VzcygpOiB1bmhhbmRsZWQgTk1UIHN0YXRlIDB4JVhcbiIsCisJCQkJCQkgICAgIHBObXRTdGF0ZUNoYW5nZS0+CisJCQkJCQkgICAgIG1fTmV3Tm10U3RhdGUpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChSZXQgPT0ga0VwbFJlamVjdCkgewkvLyBhcHBsaWNhdGlvbiB3YW50cyB0byBjaGFuZ2UgTk1UIHN0YXRlIGl0c2VsZgorCQkJCS8vIGl0J3MgT0sKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCX0KKworCQkJRVBMX0RCR0xWTF9OTVRVX1RSQUNFMAorCQkJICAgICgiRXBsTm10dVByb2Nlc3NFdmVudCgpOiBOTVQtU3RhdGUtTWFzY2hpbmUgYW5ub3VuY2UgY2hhbmdlIG9mIE5NVCBTdGF0ZVxuIik7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbE5tdEludmFsaWRFdmVudDsKKwkJfQorCisJfQorCisvL0V4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYgorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlciBDYWxsYmFjay1mdW5jdGlvbiBnbyBnZXQgaW5mb3JtZWQgYWJvdXQgYQorLy8gICAgICAgICAgICAgIE5NVC1DaGFuZ2UtU3RhdGUtRXZlbnQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3AgPSBmdW5jdGlvbnBvaW50ZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE5tdHVSZWdpc3RlclN0YXRlQ2hhbmdlQ2IodEVwbE5tdHVTdGF0ZUNoYW5nZUNhbGxiYWNrCisJCQkgICAgIHBmbkVwbE5tdFN0YXRlQ2hhbmdlQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gc2F2ZSBjYWxsYmFjay1mdW5jdGlvbiBpbiBtb2R1bCBnbG9iYWwgdmFyCisJRXBsTm10dUluc3RhbmNlX2cubV9wZm5ObXRDaGFuZ2VDYiA9IHBmbkVwbE5tdFN0YXRlQ2hhbmdlQ2JfcDsKKworCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHVDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10dUNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjllZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHVDYWwuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyIG9mIHRoZQorICAgICAgICAgICAgICAgIE5NVC1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10dUNhbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNiAtay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsTm10dUNhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdGtDYWxHZXRObXRTdGF0ZQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm4gY3VycmVudCBOTVQtU3RhdGUKKy8vICAgICAgICAgICAgICAtPiBlbmNhcHN1bGF0ZSBhY2Nlc3MgdG8ga2VybmVsc3BhY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsTm10U3RhdGUgPSBjdXJyZW50IE5NVC1TdGF0ZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMgRXBsTm10a0NhbEdldE5tdFN0YXRlKCkKK3sKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisJLy8gZm9yIHRlc3QgZGlyZWt0IGNhbGwgZm9yIEVwbE5tdGtHZXRObXRTdGF0ZSgpCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisjZWxzZQorCU5tdFN0YXRlID0gMDsKKyNlbmRpZgorCXJldHVybiBObXRTdGF0ZTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYmIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5jCkBAIC0wLDAgKzEsMzI2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBhcGkgZnVuY3Rpb24gb2YgRXBsT0JELU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBNaWNyb3NvZnQgVkM3CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wMiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisJCSAgICAgLT5iYXNlZCBvbiBDQU5vcGVuIE9CRC1Nb2R1bAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIJLy8gZnVuY3Rpb24gcHJvdG90eXBzIG9mIHRoZSBFcGxPQkQtTW9kdWwKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGZsb2F0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MKKyNkZWZpbmUgX1NISUZURURfRVhQT05FTlRfTUFTS19TUCAgIDB4ZmYKKyNkZWZpbmUgX0JJQVNfU1AgICAgICAgICAgICAgICAgICAgIDEyNgorI2RlZmluZSBUX1NQICAgICAgICAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgRVhQT05FTlRfREVOT1JNX1NQICAgICAgICAgICgtX0JJQVNfU1ApCisjZGVmaW5lIEJBU0VfVE9fVEhFX1RfU1AgICAgICAgICAgICAoKGZsb2F0KSA4Mzg4NjA4LjApCisjZGVmaW5lIEdFVF9FWFBPTkVOVF9TUCh4KSAgICAgICAgICAoKCgoeCkgPj4gVF9TUCkgJiBfU0hJRlRFRF9FWFBPTkVOVF9NQVNLX1NQKSAtIF9CSUFTX1NQKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHN0cnVjdCBmb3IgaW5zdGFuY2UgdGFibGUKK0lOU1RBTkNFX1RZUEVfQkVHSU4gRVBMX01DT19ERUNMX0lOU1RBTkNFX01FTUJFUigpCisKK1NUQVRJQyB0RXBsT2JkSW5pdFBhcmFtIElOU1RfRkFSIG1fT2JkSW5pdFBhcmFtOworU1RBVElDIHRFcGxPYmRTdG9yZUxvYWRPYmpDYWxsYmFjayBJTlNUX05FQVIgbV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrOworCitJTlNUQU5DRV9UWVBFX0VORAorLy8gZGVjb21wb3NpdGlvbiBvZiBmbG9hdAordHlwZWRlZiB1bmlvbiB7CisJdEVwbE9iZFJlYWwzMiBtX2ZsUmVhbFBhcnQ7CisJaW50IG1fbkludGVnZXJQYXJ0OworCit9IHRFcGxPYmRSZWFsUGFydHM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgbWFjcm8gcmVwbGFjZSB0aGUgdW5zcGVjaWZpYyBwb2ludGVyIHRvIGFuIGluc3RhbmNlIHRocm91Z2gKKy8vIHRoZSBtb2R1bCBzcGVjaWZpYyB0eXBlIGZvciB0aGUgbG9jYWwgaW5zdGFuY2UgdGFibGUuIFRoaXMgbWFjcm8KKy8vIG11c3QgZGVmaW5lZCBpbiBlYWNoIG1vZHVsLgorLy8jZGVmaW5lIHRFcGxQdHJJbnN0YW5jZSAgICAgICAgICAgICB0RXBsSW5zdGFuY2VJbmZvIE1FTSoKKworRVBMX01DT19ERUNMX0lOU1RBTkNFX1ZBUigpCisKK0JZVEUgTUVNIGFiRXBsT2JkVHJhc2hPYmplY3RfZ1s4XTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTF9NQ09fREVGSU5FX0lOU1RBTkNFX0ZDVCgpCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICB0RXBsT2JkQ2FsbGJhY2sgZnBDYWxsYmFja19wLAorCQkJCQkgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wKTsKKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldERhdGFTaXplSW50ZXJuKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKTsKKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldFN0ckxlbih2b2lkICpwT2JqRGF0YV9wLAorCQkJCSAgIHRFcGxPYmRTaXplIE9iakxlbl9wLCB0RXBsT2JkVHlwZSBPYmpUeXBlX3ApOworCisjaWYgKEVQTF9PQkRfQ0hFQ0tfT0JKRUNUX1JBTkdFICE9IEZBTFNFKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkQ2hlY2tPYmplY3RSYW5nZSh0RXBsT2JkU3ViRW50cnlQdHIgcFN1YmluZGV4RW50cnlfcCwKKwkJCQkJIHZvaWQgKnBEYXRhX3ApOworI2VuZGlmCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldFZhckVudHJ5KHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wLAorCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqIHBwVmFyRW50cnlfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCwKKwkJCQkgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBPYmRTdWJFbnRyeV9wKTsKKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldE9iamVjdFNpemUodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRJbmRleEludGVybih0RXBsT2JkSW5pdFBhcmFtIE1FTSAqIHBJbml0UGFyYW1fcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICAgICAgdEVwbE9iZEVudHJ5UHRyICogcHBPYmRFbnRyeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4odEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeV9wLAorCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBPYmRTdWJFbnRyeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgIHRFcGxPYmRQYXJ0IEN1cnJlbnRPZFBhcnRfcCwKKwkJCQkJICAgdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnR5X3AsCisJCQkJCSAgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApOworCitzdGF0aWMgdm9pZCAqRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cih0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkluZGV4RW50cnlfcCk7CitzdGF0aWMgdm9pZCBNRU0gKkVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApOworCisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENhbGxTdG9yZUNhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgdEVwbE9iZENiU3RvcmVQYXJhbSBNRU0gKgorCQkJCQkgIHBDYlN0b3JlUGFyYW1fcCk7CisKKyNlbmRpZiAvLyAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKKworc3RhdGljIHZvaWQgRXBsT2JkQ29weU9iamVjdERhdGEodm9pZCBNRU0gKiBwRHN0RGF0YV9wLAorCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCSB0RXBsT2JkU2l6ZSBPYmpTaXplX3AsIHRFcGxPYmRUeXBlIE9ialR5cGVfcCk7CisKK3ZvaWQgKkVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRJc051bWVyaWNhbEludGVybih0RXBsT2JkU3ViRW50cnlQdHIgcE9iZFN1YkVudHJ5X3AsCisJCQkJCSAgQk9PTCAqIHBmRW50cnlOdW1lcmljYWxfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5UHJlKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCSAgICAgdm9pZCAqKnBwRHN0RGF0YV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplIFNpemVfcCwKKwkJCQkJICAgICB0RXBsT2JkRW50cnlQdHIgKiBwcE9iZEVudHJ5X3AsCisJCQkJCSAgICAgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBTdWJFbnRyeV9wLAorCQkJCQkgICAgIHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBDYlBhcmFtX3AsCisJCQkJCSAgICAgdEVwbE9iZFNpemUgKiBwT2JkU2l6ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlQb3N0KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgIHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnlfcCwKKwkJCQkJICAgICAgdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeV9wLAorCQkJCQkgICAgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wLAorCQkJCQkgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkgICAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkSW5pdCgpCisvLworLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwSW5pdFBhcmFtX3AgICAgPSBpbml0IHBhcmFtZXRlcgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJbml0KEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkgIHRFcGxPYmRJbml0UGFyYW0gTUVNICogcEluaXRQYXJhbV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJRVBMX01DT19ERUxFVEVfSU5TVEFOQ0VfVEFCTEUoKTsKKworCWlmIChwSW5pdFBhcmFtX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbE9iZEFkZEluc3RhbmNlKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8gcEluaXRQYXJhbV9wKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEFkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkcyBhIG5ldyBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwSW5pdFBhcmFtX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRBZGRJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB0RXBsT2JkSW5pdFBhcmFtIE1FTSAqCisJCQkJCQkgcEluaXRQYXJhbV9wKQoreworCisJRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTCB0RXBsS2VybmVsIFJldDsKKworCS8vIGNoZWNrIGlmIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlciB2YWxpZAorCS8vIGdldCBmcmVlIGluc3RhbmNlIGFuZCBzZXQgdGhlIGdsb2JhbGUgaW5zdGFuY2UgcG9pbnRlcgorCS8vIHNldCBhbHNvIHRoZSBpbnN0YW5jZSBhZGRyIHRvIHBhcmFtZXRlcmxpc3QKKwlFUExfTUNPX0NIRUNLX1BUUl9JTlNUQU5DRV9QVFIoKTsKKwlFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpOworCUVQTF9NQ09fU0VUX1BUUl9JTlNUQU5DRV9QVFIoKTsKKworCS8vIHNhdmUgaW5pdCBwYXJhbWV0ZXJzCisJRVBMX01FTUNQWSgmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwgcEluaXRQYXJhbV9wLAorCQkgICBzaXplb2YodEVwbE9iZEluaXRQYXJhbSkpOworCisJLy8gY2xlYXIgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGNvbW1hbmQgTE9BRCBhbmQgU1RPUkUKKwlFUExfTUNPX0dMQl9WQVIobV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrKSA9IE5VTEw7CisKKwkvLyBzaWduIGluc3RhbmNlIGFzIHVzZWQKKwlFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGtTdGF0ZVVzZWQpOworCisJLy8gaW5pdGlhbGl6ZSBvYmplY3QgZGljdGlvbmFyeQorCS8vIHNvIGFsbCBhbGwgVmFyRW50cmllcyB3aWxsIGJlIGluaXRpYWxpemVkIHRvIHRyYXNoIG9iamVjdCBhbmQgZGVmYXVsdCB2YWx1ZXMgd2lsbCBiZSBzZXQgdG8gY3VycmVudCBkYXRhCisJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSBrRXBsT2JkUGFydEFsbCwga0VwbE9iZERpckluaXQpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmREZWxldGVJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChFUExfVVNFX0RFTEVURUlOU1RfRlVOQyAhPSBGQUxTRSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmREZWxldGVJbnN0YW5jZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSKQoreworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJLy8gc2lnbiBpbnN0YW5jZSBhcyB1bnVzZWQKKwlFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGtTdGF0ZVVudXNlZCk7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKyNlbmRpZiAvLyAoRVBMX1VTRV9ERUxFVEVJTlNUX0ZVTkMgIT0gRkFMU0UpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFdyaXRlRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB3cml0ZXMgZGF0YSB0byBhbiBPQkQgZW50cnkuIFN0cmluZ3MKKy8vICAgICAgICAgICAgICBhcmUgc3RvcmVkIHdpdGggYWRkZWQgJ1wwJyBjaGFyYWN0ZXIuCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9ICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgIFNpemVfcCAgICAgICAgICA9ICAgU2l6ZSBvZiB0aGUgZGF0YSBpbiBCeXRlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCXZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQl0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdEVwbE9iZENiUGFyYW0gTUVNIENiUGFyYW07CisJdm9pZCBNRU0gKnBEc3REYXRhOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5UHJlKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgdWlJbmRleF9wLAorCQkJCSAgdWlTdWJJbmRleF9wLAorCQkJCSAgcFNyY0RhdGFfcCwKKwkJCQkgICZwRHN0RGF0YSwKKwkJCQkgIFNpemVfcCwKKwkJCQkgICZwT2JkRW50cnksICZwU3ViRW50cnksICZDYlBhcmFtLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeVBvc3QoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgcE9iZEVudHJ5LAorCQkJCSAgIHBTdWJFbnRyeSwKKwkJCQkgICAmQ2JQYXJhbSwgcFNyY0RhdGFfcCwgcERzdERhdGEsIE9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkUmVhZEVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIHJlYWRzIGFuIG9iamVjdCBlbnRyeS4gVGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgY2FuIGFsd2F5cyByZWFkIHRoZSBkYXRhIGV2ZW4gaWYgYXR0cmliIGtFcGxPYmRBY2NSZWFkCisvLyAgICAgICAgICAgICAgaXMgbm90IHNldC4gVGhlIGF0dHJpYiBpcyBvbmx5IGNoZWNrZWQgdXAgZm9yIFNETyB0cmFuc2Zlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlYWRFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkgICAgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkVudHJ5OworCXRFcGxPYmRDYlBhcmFtIE1FTSBDYlBhcmFtOworCXZvaWQgKnBTcmNEYXRhOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUFTU0VSVChwRHN0RGF0YV9wICE9IE5VTEwpOworCUFTU0VSVChwU2l6ZV9wICE9IE5VTEwpOworCisJLy8gZ2V0IGFkZHJlc3Mgb2YgaW5kZXggYW5kIHN1YmluZGV4IGVudHJ5CisJUmV0ID0gRXBsT2JkR2V0RW50cnkoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkgICAgIHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCAmcE9iZEVudHJ5LCAmcFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKwlwU3JjRGF0YSA9IEVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4ocFN1YkVudHJ5KTsKKworCS8vIGNoZWNrIHNvdXJjZSBwb2ludGVyCisJaWYgKHBTcmNEYXRhID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbE9iZFJlYWRWaW9sYXRpb247CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBhZGRyZXNzIG9mIHNvdXJjZSBkYXRhIHRvIHN0cnVjdHVyZSBvZiBjYWxsYmFjayBwYXJhbWV0ZXJzCisJLy8gc28gY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGlzIGRhdGEgYmVmb3JlIHJlYWRpbmcKKwlDYlBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlDYlBhcmFtLm1fdWlTdWJJbmRleCA9IHVpU3ViSW5kZXhfcDsKKwlDYlBhcmFtLm1fcEFyZyA9IHBTcmNEYXRhOworCUNiUGFyYW0ubV9PYmRFdmVudCA9IGtFcGxPYmRFdlByZVJlYWQ7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywgJkNiUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgc2l6ZSBvZiBkYXRhIGFuZCBjaGVjayBpZiBhcHBsaWNhdGlvbiBoYXMgcmVzZXJ2ZWQgZW5vdWdoIG1lbW9yeQorCU9iZFNpemUgPSBFcGxPYmRHZXREYXRhU2l6ZUludGVybihwU3ViRW50cnkpOworCS8vIGNoZWNrIGlmIG9mZnNldCBnaXZlbiBhbmQgY2FsYyBjb3JyZWN0IG51bWJlciBvZiBieXRlcyB0byByZWFkCisJaWYgKCpwU2l6ZV9wIDwgT2JkU2l6ZSkgeworCQlSZXQgPSBrRXBsT2JkVmFsdWVMZW5ndGhFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZWFkIHZhbHVlIGZyb20gb2JqZWN0CisJRVBMX01FTUNQWShwRHN0RGF0YV9wLCBwU3JjRGF0YSwgT2JkU2l6ZSk7CisJKnBTaXplX3AgPSBPYmRTaXplOworCisJLy8gd3JpdGUgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBkYXRhIHRvIHN0cnVjdHVyZSBvZiBjYWxsYmFjayBwYXJhbWV0ZXJzCisJLy8gc28gY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGlzIGRhdGEgYWZ0ZXIgcmVhZGluZworCUNiUGFyYW0ubV9wQXJnID0gcERzdERhdGFfcDsKKwlDYlBhcmFtLm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQb3N0UmVhZDsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeS0+bV9mcENhbGxiYWNrLCAmQ2JQYXJhbSk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEFjY2Vzc09kUGFydCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlc3RvcmVzIGRlZmF1bHQgdmFsdWVzIG9mIG9uZSBwYXJ0IG9mIE9ECisvLworLy8gUGFyYW1ldGVyczogIE9iZFBhcnRfcAorLy8gICAgICAgICAgICAgIERpcmVjdGlvbl9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkQWNjZXNzT2RQYXJ0KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgIHRFcGxPYmRQYXJ0IE9iZFBhcnRfcCwKKwkJCQkJCSAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJQk9PTCBmUGFydEZvdW50OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vICBwYXJ0IGFsd2F5cyBoYXMgdG8gYmUgdW5lcXVhbCB0byBOVUxMCisJcE9iZEVudHJ5ID0gRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtLm1fcFBhcnQpOworCUFTU0VSVE1TRyhwT2JkRW50cnkgIT0gTlVMTCwKKwkJICAiRXBsT2JkQWNjZXNzT2RQYXJ0KCk6IG5vICBPRCBwYXJ0IGlzIGRlZmluZWQhXG4iKTsKKworCS8vIGlmIE9iZFBhcnRfcCBpcyBub3QgdmFsaWQgZlBhcnRGb3VuZCBrZWVwcyBGQUxTRSBhbmQgZnVuY3Rpb24gcmV0dXJucyBrRXBsT2JkSWxsZWdhbFBhcnQKKwlmUGFydEZvdW50ID0gRkFMU0U7CisKKwkvLyBhY2Nlc3MgdG8gIHBhcnQKKwlpZiAoKE9iZFBhcnRfcCAmIGtFcGxPYmRQYXJ0R2VuKSAhPSAwKSB7CisJCWZQYXJ0Rm91bnQgPSBUUlVFOworCisJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIGtFcGxPYmRQYXJ0R2VuLCBwT2JkRW50cnksCisJCQkJCSAgICAgICBEaXJlY3Rpb25fcCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKwkvLyBhY2Nlc3MgdG8gbWFudWZhY3R1cmVyIHBhcnQKKwlwT2JkRW50cnkgPSBFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0ubV9wTWFudWZhY3R1cmVyUGFydCk7CisKKwlpZiAoKChPYmRQYXJ0X3AgJiBrRXBsT2JkUGFydE1hbikgIT0gMCkgJiYgKHBPYmRFbnRyeSAhPSBOVUxMKSkgeworCQlmUGFydEZvdW50ID0gVFJVRTsKKworCQlSZXQgPSBFcGxPYmRBY2Nlc3NPZFBhcnRJbnRlcm4oRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICBrRXBsT2JkUGFydE1hbiwgcE9iZEVudHJ5LAorCQkJCQkgICAgICAgRGlyZWN0aW9uX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisJLy8gYWNjZXNzIHRvIGRldmljZSBwYXJ0CisJcE9iZEVudHJ5ID0gRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtLm1fcERldmljZVBhcnQpOworCisJaWYgKCgoT2JkUGFydF9wICYga0VwbE9iZFBhcnREZXYpICE9IDApICYmIChwT2JkRW50cnkgIT0gTlVMTCkpIHsKKwkJZlBhcnRGb3VudCA9IFRSVUU7CisKKwkJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAga0VwbE9iZFBhcnREZXYsIHBPYmRFbnRyeSwKKwkJCQkJICAgICAgIERpcmVjdGlvbl9wKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCXsKKwkJLy8gYWNjZXNzIHRvIHVzZXIgcGFydAorCQlwT2JkRW50cnkgPSBFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0ubV9wVXNlclBhcnQpOworCisJCWlmICgoKE9iZFBhcnRfcCAmIGtFcGxPYmRQYXJ0VXNyKSAhPSAwKSAmJiAocE9iZEVudHJ5ICE9IE5VTEwpKSB7CisJCQlmUGFydEZvdW50ID0gVFJVRTsKKworCQkJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAgIGtFcGxPYmRQYXJ0VXNyLAorCQkJCQkJICAgICAgIHBPYmRFbnRyeSwgRGlyZWN0aW9uX3ApOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLy8gbm8gYWNjZXNzIHRvIGFuIE9EIHBhcnQgd2FzIGRvbmU/IGlsbGVnYWwgT0QgcGFydCB3YXMgc3BlY2lmaWVkIQorCWlmIChmUGFydEZvdW50ID09IEZBTFNFKSB7CisJCVJldCA9IGtFcGxPYmRJbGxlZ2FsUGFydDsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZERlZmluZVZhcigpCisvLworLy8gRGVzY3JpcHRpb246IGRlZmluZXMgYSB2YXJpYWJsZSBpbiBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXBsVmFyUGFyYW1fcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZERlZmluZVZhcihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdEVwbFZhclBhcmFtIE1FTSAqIHBWYXJQYXJhbV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFZhckVudHJ5IE1FTSAqcFZhckVudHJ5OworCXRFcGxWYXJQYXJhbVZhbGlkIFZhclZhbGlkOworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeTsKKworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJQVNTRVJUKHBWYXJQYXJhbV9wICE9IE5VTEwpOwkvLyBpcyBub3QgYWxsb3dlZCB0byBiZSBOVUxMCisKKwkvLyBnZXQgYWRkcmVzcyBvZiBzdWJpbmRleCBlbnRyeQorCVJldCA9IEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJICAgICBwVmFyUGFyYW1fcC0+bV91aUluZGV4LAorCQkJICAgICBwVmFyUGFyYW1fcC0+bV91aVN1YmluZGV4LCBOVUxMLCAmcFN1YmluZGV4RW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgdmFyIGVudHJ5CisJUmV0ID0gRXBsT2JkR2V0VmFyRW50cnkocFN1YmluZGV4RW50cnksICZwVmFyRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVZhclZhbGlkID0gcFZhclBhcmFtX3AtPm1fVmFsaWRGbGFnOworCisJLy8gY29weSBvbmx5IHRoaXMgdmFsdWVzLCB3aGljaCB2YWxpZCBmbGFnIGlzIHNldAorCWlmICgoVmFyVmFsaWQgJiBrVmFyVmFsaWRTaXplKSAhPSAwKSB7CisJCWlmIChwU3ViaW5kZXhFbnRyeS0+bV9UeXBlICE9IGtFcGxPYmRUeXBEb21haW4pIHsKKwkJCXRFcGxPYmRTaXplIERhdGFTaXplOworCisJCQkvLyBjaGVjayBwYXNzZWQgc2l6ZSBwYXJhbWV0ZXIKKwkJCURhdGFTaXplID0gRXBsT2JkR2V0T2JqZWN0U2l6ZShwU3ViaW5kZXhFbnRyeSk7CisJCQlpZiAoRGF0YVNpemUgIT0gcFZhclBhcmFtX3AtPm1fU2l6ZSkgewkvLyBzaXplIG9mIHZhcmlhYmxlIGRvZXMgbm90IG1hdGNoCisJCQkJUmV0ID0ga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQl9IGVsc2UgewkvLyBzaXplIGNhbiBiZSBzZXQgb25seSBmb3Igb2JqZWN0cyBvZiB0eXBlIERPTUFJTgorCQkJcFZhckVudHJ5LT5tX1NpemUgPSBwVmFyUGFyYW1fcC0+bV9TaXplOworCQl9CisJfQorCisJaWYgKChWYXJWYWxpZCAmIGtWYXJWYWxpZERhdGEpICE9IDApIHsKKwkJcFZhckVudHJ5LT5tX3BEYXRhID0gcFZhclBhcmFtX3AtPm1fcERhdGE7CisJfQorLyoKKyAgICAjaWYgKEVQTF9QRE9fVVNFX1NUQVRJQ19NQVBQSU5HID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgaWYgKChWYXJWYWxpZCAmIGtWYXJWYWxpZENhbGxiYWNrKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgIHBWYXJFbnRyeS0+bV9mcENhbGxiYWNrID0gcFZhclBhcmFtX3AtPm1fZnBDYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoVmFyVmFsaWQgJiBrVmFyVmFsaWRBcmcpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgcFZhckVudHJ5LT5tX3BBcmcgPSBwVmFyUGFyYW1fcC0+bV9wQXJnOworICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorKi8KKwkvLyBSZXQgaXMgYWxyZWFkeSBzZXQgdG8ga0VwbFN1Y2Nlc3NmdWwgZnJvbSBPYmRHZXRWYXJJbnRlcm4oKQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3REYXRhUHRyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogSXQgcmV0dXJuZXMgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyLiBCdXQgaWYgb2JqZWN0IGlzIGFuCisvLyAgICAgICAgICAgICAgY29uc3RhbnQgb2JqZWN0IGl0IHJldHVybmVzIHRoZSBkZWZhdWx0IHBvaW50ZXIuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICA9ICAgSW5kZXggb2YgdGhlIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wID0gICBTdWJpbmRleCBvZiB0aGUgZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZCAqICAgID0gcG9pbnRlciB0byBvYmplY3QgZGF0YQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB2b2lkICpQVUJMSUMgRXBsT2JkR2V0T2JqZWN0RGF0YVB0cihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl2b2lkICpwRGF0YTsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwT2JkU3ViRW50cnk7CisKKwkvLyBnZXQgcG9pbnRlciB0byBpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRJbmRleEludGVybigmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwKKwkJCQkgICB1aUluZGV4X3AsICZwT2JkRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJcERhdGEgPSBOVUxMOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIHN1YmluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHBPYmRFbnRyeSwgdWlTdWJJbmRleF9wLCAmcE9iZFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCXBEYXRhID0gTlVMTDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgRGF0YXBvaW50ZXIKKwlwRGF0YSA9IEVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4ocE9iZFN1YkVudHJ5KTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gcERhdGE7CisKK30KKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRSZWdpc3RlclVzZXJPZCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgdXNlciBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVXNlck9kX3AgICA9cG9pbnRlciB0byB1c2VyIE9EZAorLy8KKy8vIFJldHVybjogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlZ2lzdGVyVXNlck9kKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgdEVwbE9iZEVudHJ5UHRyIHBVc2VyT2RfcCkKK3sKKworCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbS5tX3BVc2VyUGFydCkgPSBwVXNlck9kX3A7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEluaXRWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVmFyRW50cnkgZGVwZW5kZW5lZCBvbiBvYmplY3QgdHlwZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVmFyRW50cnlfcCA9IHBvaW50ZXIgdG8gdmFyIGVudHJ5IHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIFR5cGVfcCAgICAgID0gb2JqZWN0IHR5cGUKKy8vICAgICAgICAgICAgICBPYmRTaXplX3AgICA9IHNpemUgb2Ygb2JqZWN0IGRhdGEKKy8vCisvLyBSZXR1cm5zOiAgICAgbm9uZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmRJbml0VmFyRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKiBwVmFyRW50cnlfcCwKKwkJCQkJICAgIHRFcGxPYmRUeXBlIFR5cGVfcCwKKwkJCQkJICAgIHRFcGxPYmRTaXplIE9iZFNpemVfcCkKK3sKKy8qCisgICAgI2lmIChFUExfUERPX1VTRV9TVEFUSUNfTUFQUElORyA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIC8vIHJlc2V0IHBvaW50ZXIgdG8gVkFSIGNhbGxiYWNrIGFuZCBhcmd1bWVudAorICAgICAgICBwVmFyRW50cnlfcC0+bV9mcENhbGxiYWNrICA9IE5VTEw7CisgICAgICAgIHBWYXJFbnRyeV9wLT5tX3BBcmcgPSBOVUxMOworICAgIH0KKyAgICAjZW5kaWYKKyovCisKKy8vIDEwLWRlYy0yMDA0IHIuZC46IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgdXNlZCBmb3Igc3RyaW5ncworCWlmICgoVHlwZV9wID09IGtFcGxPYmRUeXBEb21haW4pKQorLy8gICAgICAgICAoYlR5cGVfcCA9PSBrRXBsT2JkVHlwVlN0cmluZykgLyogfHwKKy8vICAgICAgICAgKGJUeXBlX3AgPT0ga0VwbE9iZFR5cE9TdHJpbmcpIHx8CisvLyAgICAgICAgIChiVHlwZV9wID09IGtFcGxPYmRUeXBVU3RyaW5nKSAgICAqLyApCisJeworCQkvLyB2YXJpYWJsZXMgd2hpY2ggYXJlIGRlZmluZWQgYXMgRE9NQUlOIG9yIFZTVFJJTkcgc2hvdWxkIG5vdCBwb2ludCB0bworCQkvLyB0cmFzaCBvYmplY3QsIGJlY2F1c2UgdGhpcyB0cmFzaCBvYmplY3QgY29udGFpbnMgb25seSA4IGJ5dGVzLiBET01BSU5TIG9yCisJCS8vIFNUUklOR1MgY2FuIGJlIGxvbmdlci4KKwkJcFZhckVudHJ5X3AtPm1fcERhdGEgPSBOVUxMOworCQlwVmFyRW50cnlfcC0+bV9TaXplID0gMDsKKwl9IGVsc2UgeworCQkvLyBzZXQgYWRkcmVzcyB0byB2YXJpYWJsZSBkYXRhIHRvIHRyYXNoIG9iamVjdAorCQkvLyBUaGlzIHByZXZlbnRzIGFuIGFjY2VzcyB2aW9sYXRpb24gaWYgdXNlciBmb3JnZXRzIHRvIGNhbGwgRXBsT2JkRGVmaW5lVmFyKCkKKwkJLy8gZm9yIHRoaXMgdmFyaWFibGUgYnV0IG1hcHBlcyBpdCBpbiBhIFBETy4KKwkJcFZhckVudHJ5X3AtPm1fcERhdGEgPSAmYWJFcGxPYmRUcmFzaE9iamVjdF9nWzBdOworCQlwVmFyRW50cnlfcC0+bV9TaXplID0gT2JkU2l6ZV9wOworCX0KKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXREYXRhU2l6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVmFyRW50cnkgZGVwZW5kZW5lZCBvbiBvYmplY3QgdHlwZQorLy8KKy8vICAgICAgICAgICAgICBnZXRzIHRoZSBkYXRhIHNpemUgb2YgYW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgZm9yIHN0cmluZyBvYmplY3RzIGl0IHJldHVybmVzIHRoZSBzdHJpbmcgbGVuZ3RoCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfID0gSW5zdGFuY2Vwb2ludGVyCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgPSAgIEluZGV4CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wPSAgIFN1YmluZGV4CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxPYmRTaXplCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkR2V0RGF0YVNpemUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeTsKKworCS8vIGdldCBwb2ludGVyIHRvIGluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldEluZGV4SW50ZXJuKCZFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0pLAorCQkJCSAgIHVpSW5kZXhfcCwgJnBPYmRFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlPYmRTaXplID0gMDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBzdWJpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRTdWJpbmRleEludGVybihwT2JkRW50cnksIHVpU3ViSW5kZXhfcCwgJnBPYmRTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlPYmRTaXplID0gMDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgc2l6ZQorCU9iZFNpemUgPSBFcGxPYmRHZXREYXRhU2l6ZUludGVybihwT2JkU3ViRW50cnkpOworICAgICAgRXhpdDoKKwlyZXR1cm4gT2JkU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0Tm9kZUlkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gcmV0dXJucyBub2RlaWQgZnJvbSBlbnRyeSAweDFGOTMKKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIgPSBJbnN0YW5jZXBvaW50ZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdW5zaWduZWQgaW50ID0gTm9kZSBJZAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdW5zaWduZWQgaW50IFBVQkxJQyBFcGxPYmRHZXROb2RlSWQoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUikKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCUJZVEUgYk5vZGVJZDsKKworCWJOb2RlSWQgPSAwOworCU9iZFNpemUgPSBzaXplb2YoYk5vZGVJZCk7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgIEVQTF9PQkRfTk9ERV9JRF9JTkRFWCwKKwkJCSAgICAgIEVQTF9PQkRfTk9ERV9JRF9TVUJJTkRFWCwgJmJOb2RlSWQsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWJOb2RlSWQgPSBFUExfQ19BRFJfSU5WQUxJRDsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gKHVuc2lnbmVkIGludCliTm9kZUlkOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFNldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHNldHMgbm9kZWlkIGluIGVudHJ5IDB4MUY5MworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZXBvaW50ZXIKKy8vICAgICAgICAgICAgICB1aU5vZGVJZF9wICA9ICAgTm9kZSBJZCB0byBzZXQKKy8vICAgICAgICAgICAgICBOb2RlSWRUeXBlX3A9ICAgVHlwZSBvbiB3aGljaCB3YXkgdGhlIE5vZGUgSWQgd2FzIHNldAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsID0gRXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRTZXROb2RlSWQoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAgIHRFcGxPYmROb2RlSWRUeXBlIE5vZGVJZFR5cGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCUJZVEUgZkh3Qm9vbDsKKwlCWVRFIGJOb2RlSWQ7CisKKwkvLyBjaGVjayBOb2RlIElkCisJaWYgKHVpTm9kZUlkX3AgPT0gRVBMX0NfQURSX0lOVkFMSUQpIHsKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJYk5vZGVJZCA9IChCWVRFKSB1aU5vZGVJZF9wOworCU9iZFNpemUgPSBzaXplb2YoQllURSk7CisJLy8gd3JpdGUgTm9kZUlkIHRvIE9EIGVudHJ5CisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkgICAgICAgRVBMX09CRF9OT0RFX0lEX0lOREVYLAorCQkJICAgICAgIEVQTF9PQkRfTk9ERV9JRF9TVUJJTkRFWCwgJmJOb2RlSWQsIE9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzZXQgSFdCT09MLUZsYWcgaW4gU3ViaW5kZXggRVBMX09CRF9OT0RFX0lEX0hXQk9PTF9TVUJJTkRFWAorCXN3aXRjaCAoTm9kZUlkVHlwZV9wKSB7CisJCS8vIHR5cGUgdW5rbm93bgorCWNhc2Uga0VwbE9iZE5vZGVJZFVua25vd246CisJCXsKKwkJCWZId0Jvb2wgPSBPQkRfRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsT2JkTm9kZUlkU29mdHdhcmU6CisJCXsKKwkJCWZId0Jvb2wgPSBPQkRfRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsT2JkTm9kZUlkSGFyZHdhcmU6CisJCXsKKwkJCWZId0Jvb2wgPSBPQkRfVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlmSHdCb29sID0gT0JEX0ZBTFNFOworCQl9CisKKwl9CQkJLy8gZW5kIG9mIHN3aXRjaCAoTm9kZUlkVHlwZV9wKQorCisJLy8gd3JpdGUgZmxhZworCU9iZFNpemUgPSBzaXplb2YoZkh3Qm9vbCk7CisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFIKKwkJCSAgICAgICBFUExfT0JEX05PREVfSURfSU5ERVgsCisJCQkgICAgICAgRVBMX09CRF9OT0RFX0lEX0hXQk9PTF9TVUJJTkRFWCwKKwkJCSAgICAgICAmZkh3Qm9vbCwgT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZElzTnVtZXJpY2FsKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hlY2tzIGlmIGEgZW50cnkgaXMgbnVtZXJpY2FsIG9yIG5vdAorLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZXBvaW50ZXIKKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgICAgID0gSW5kZXgKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgICAgID0gU3ViaW5kZXgKKy8vICAgICAgICAgICAgICBwZkVudHJ5TnVtZXJpY2FsX3AgID0gcG9pbnRlciB0byBCT09MIGZvciByZXR1cm52YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gVFJVRSBpZiBlbnRyeSBhIG51bWVyaWNhbCB2YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gRkFMU0UgaWYgZW50cnkgbm90IGEgbnVtZXJpY2FsIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgPSBFcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZElzTnVtZXJpY2FsKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJIEJPT0wgKiBwZkVudHJ5TnVtZXJpY2FsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcE9iZFN1YkVudHJ5OworCisJLy8gZ2V0IHBvaW50ZXIgdG8gaW5kZXggc3RydWN0dXJlCisJUmV0ID0gRXBsT2JkR2V0SW5kZXhJbnRlcm4oJkVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbSksCisJCQkJICAgdWlJbmRleF9wLCAmcE9iZEVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gc3ViaW5kZXggc3RydWN0dXJlCisJUmV0ID0gRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4ocE9iZEVudHJ5LCB1aVN1YkluZGV4X3AsICZwT2JkU3ViRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbE9iZElzTnVtZXJpY2FsSW50ZXJuKHBPYmRTdWJFbnRyeSwgcGZFbnRyeU51bWVyaWNhbF9wKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFJlYWRFbnRyeVRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gcmVhZHMgYW4gb2JqZWN0IGVudHJ5IGZyb20gdGhlIGJ5dGVvZGVyCisvLyAgICAgICAgICAgICAgb2YgdGhlIHN5c3RlbSB0byB0aGUgbGl0dGxlIGVuZGlhbiBieXRlb3JkZXIgZm9yIG51bWVyaWNhbCB2YWx1ZXMuCisvLyAgICAgICAgICAgICAgRm9yIG90aGVyIHR5cGVzIGEgbm9ybWFsIHJlYWQgd2lsbCBiZSBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZnVsbCBmb3IKKy8vICAgICAgICAgICAgICB0aGUgUERPIGFuZCBTRE8gbW9kdWxlLiBUaGUgYXBwbGljYXRpb24KKy8vICAgICAgICAgICAgICBjYW4gYWx3YXlzIHJlYWQgdGhlIGRhdGEgZXZlbiBpZiBhdHRyaWIga0VwbE9iZEFjY1JlYWQKKy8vICAgICAgICAgICAgICBpcyBub3Qgc2V0LiBUaGUgYXR0cmliIGlzIG9ubHkgY2hlY2tlZCB1cCBmb3IgU0RPIHRyYW5zZmVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9IEluZGV4IG9mIHRoZSBPRCBlbnRyeSB0byByZWFkCisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gU3ViaW5kZXggdG8gcmVhZAorLy8gICAgICAgICAgICAgIHBEc3REYXRhX3AgICAgICA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBmb3IgZGF0YQorLy8gICAgICAgICAgICAgIE9mZnNldF9wICAgICAgICA9IG9mZnNldCBpbiBkYXRhIGZvciByZWFkIGFjY2VzcworLy8gICAgICAgICAgICAgIHBTaXplX3AgICAgICAgICA9IElOOiBTaXplIG9mIHRoZSBidWZmZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IG51bWJlciBvZiByZWFkZWQgQnl0ZXMKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkUmVhZEVudHJ5VG9MZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeTsKKwl0RXBsT2JkQ2JQYXJhbSBNRU0gQ2JQYXJhbTsKKwl2b2lkICpwU3JjRGF0YTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlBU1NFUlQocERzdERhdGFfcCAhPSBOVUxMKTsKKwlBU1NFUlQocFNpemVfcCAhPSBOVUxMKTsKKworCS8vIGdldCBhZGRyZXNzIG9mIGluZGV4IGFuZCBzdWJpbmRleCBlbnRyeQorCVJldCA9IEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJICAgICB1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgJnBPYmRFbnRyeSwgJnBTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIG9iamVjdCBkYXRhCisJcFNyY0RhdGEgPSBFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHBTdWJFbnRyeSk7CisKKwkvLyBjaGVjayBzb3VyY2UgcG9pbnRlcgorCWlmIChwU3JjRGF0YSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxPYmRSZWFkVmlvbGF0aW9uOworCQlnb3RvIEV4aXQ7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gYWRkcmVzcyBvZiBzb3VyY2UgZGF0YSB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgdGhpcyBkYXRhIGJlZm9yZSByZWFkaW5nCisJQ2JQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJQ2JQYXJhbS5tX3VpU3ViSW5kZXggPSB1aVN1YkluZGV4X3A7CisJQ2JQYXJhbS5tX3BBcmcgPSBwU3JjRGF0YTsKKwlDYlBhcmFtLm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQcmVSZWFkOworCVJldCA9IEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssICZDYlBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHNpemUgb2YgZGF0YSBhbmQgY2hlY2sgaWYgYXBwbGljYXRpb24gaGFzIHJlc2VydmVkIGVub3VnaCBtZW1vcnkKKwlPYmRTaXplID0gRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4ocFN1YkVudHJ5KTsKKwkvLyBjaGVjayBpZiBvZmZzZXQgZ2l2ZW4gYW5kIGNhbGMgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorCWlmICgqcFNpemVfcCA8IE9iZFNpemUpIHsKKwkJUmV0ID0ga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgaWYgbnVtZXJpY2FsIHR5cGUKKwlzd2l0Y2ggKHBTdWJFbnRyeS0+bV9UeXBlKSB7CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gdHlwZXMgd2l0aG91dCBhbWkKKwljYXNlIGtFcGxPYmRUeXBWU3RyaW5nOgorCWNhc2Uga0VwbE9iZFR5cE9TdHJpbmc6CisJY2FzZSBrRXBsT2JkVHlwRG9tYWluOgorCWRlZmF1bHQ6CisJCXsKKwkJCS8vIHJlYWQgdmFsdWUgZnJvbSBvYmplY3QKKwkJCUVQTF9NRU1DUFkocERzdERhdGFfcCwgcFNyY0RhdGEsIE9iZFNpemUpOworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIG51bWVyaWNhbCB0eXBlIHdoaWNoIG5lZWRzIGFtaS13cml0ZQorCQkvLyA4IGJpdCBvciBzbWFsbGVyIHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEJvb2w6CisJY2FzZSBrRXBsT2JkVHlwSW50ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50ODoKKwkJeworCQkJQW1pU2V0Qnl0ZVRvTGUocERzdERhdGFfcCwgKigoQllURSAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAxNiBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50MTY6CisJY2FzZSBrRXBsT2JkVHlwVUludDE2OgorCQl7CisJCQlBbWlTZXRXb3JkVG9MZShwRHN0RGF0YV9wLCAqKChXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDI0IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQyNDoKKwljYXNlIGtFcGxPYmRUeXBVSW50MjQ6CisJCXsKKwkJCUFtaVNldER3b3JkMjRUb0xlKHBEc3REYXRhX3AsICooKERXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDMyIGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQzMjoKKwljYXNlIGtFcGxPYmRUeXBVSW50MzI6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDMyOgorCQl7CisJCQlBbWlTZXREd29yZFRvTGUocERzdERhdGFfcCwgKigoRFdPUkQgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNDAgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDQwOgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0MDoKKwkJeworCQkJQW1pU2V0UXdvcmQ0MFRvTGUocERzdERhdGFfcCwgKigoUVdPUkQgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNDggYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDQ4OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0ODoKKwkJeworCQkJQW1pU2V0UXdvcmQ0OFRvTGUocERzdERhdGFfcCwgKigoUVdPUkQgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNTYgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDU2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ1NjoKKwkJeworCQkJQW1pU2V0UXdvcmQ1NlRvTGUocERzdERhdGFfcCwgKigoUVdPUkQgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNjQgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDY0OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBSZWFsNjQ6CisJCXsKKwkJCUFtaVNldFF3b3JkNjRUb0xlKHBEc3REYXRhX3AsICooKFFXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIHRpbWUgb2YgZGF5CisJY2FzZSBrRXBsT2JkVHlwVGltZU9mRGF5OgorCWNhc2Uga0VwbE9iZFR5cFRpbWVEaWZmOgorCQl7CisJCQlBbWlTZXRUaW1lT2ZEYXkocERzdERhdGFfcCwgKCh0VGltZU9mRGF5ICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocFN1YkVudHJ5LT5tX1R5cGUpCisKKwkqcFNpemVfcCA9IE9iZFNpemU7CisKKwkvLyB3cml0ZSBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIGRhdGEgdG8gc3RydWN0dXJlIG9mIGNhbGxiYWNrIHBhcmFtZXRlcnMKKwkvLyBzbyBjYWxsYmFjayBmdW5jdGlvbiBjYW4gY2hhbmdlIHRoaXMgZGF0YSBhZnRlciByZWFkaW5nCisJQ2JQYXJhbS5tX3BBcmcgPSBwRHN0RGF0YV9wOworCUNiUGFyYW0ubV9PYmRFdmVudCA9IGtFcGxPYmRFdlBvc3RSZWFkOworCVJldCA9IEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssICZDYlBhcmFtKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkV3JpdGVFbnRyeUZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGFuIE9CRCBlbnRyeSBmcm9tIGEgc291cmNlIHdpdGgKKy8vICAgICAgICAgICAgICBsaXR0bGUgZW5kaWFuIGJ5dGVvcmRlciB0byB0aGUgb2Qgd2l0aCBzeXN0ZW0gc3BlY3VpZmljCisvLyAgICAgICAgICAgICAgYnl0ZW9yZGVyLiBOb3QgbnVtZXJpY2FsIHZhbHVlcyB3aWxsIG9ubHkgYnkgY29waWVkLiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSAgICAgIHRFcGxPYmRTaXplIFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdEVwbE9iZENiUGFyYW0gTUVNIENiUGFyYW07CisJdm9pZCBNRU0gKnBEc3REYXRhOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJUVdPUkQgcXdCdWZmZXI7CisJdm9pZCAqcEJ1ZmZlciA9ICZxd0J1ZmZlcjsKKworCVJldCA9IEVwbE9iZFdyaXRlRW50cnlQcmUoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICB1aUluZGV4X3AsCisJCQkJICB1aVN1YkluZGV4X3AsCisJCQkJICBwU3JjRGF0YV9wLAorCQkJCSAgJnBEc3REYXRhLAorCQkJCSAgU2l6ZV9wLAorCQkJCSAgJnBPYmRFbnRyeSwgJnBTdWJFbnRyeSwgJkNiUGFyYW0sICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjaGVjayBpZiBudW1lcmljYWwgdHlwZQorCXN3aXRjaCAocFN1YkVudHJ5LT5tX1R5cGUpIHsKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyB0eXBlcyB3aXRob3V0IGFtaQorCWRlZmF1bHQ6CisJCXsJCS8vIGRvIG5vdGhpbmcsIGkuZS4gdXNlIHRoZSBnaXZlbiBzb3VyY2UgcG9pbnRlcgorCQkJcEJ1ZmZlciA9IHBTcmNEYXRhX3A7CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gbnVtZXJpY2FsIHR5cGUgd2hpY2ggbmVlZHMgYW1pLXdyaXRlCisJCS8vIDggYml0IG9yIHNtYWxsZXIgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwQm9vbDoKKwljYXNlIGtFcGxPYmRUeXBJbnQ4OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ4OgorCQl7CisJCQkqKChCWVRFICopIHBCdWZmZXIpID0gQW1pR2V0Qnl0ZUZyb21MZShwU3JjRGF0YV9wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gMTYgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDE2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQxNjoKKwkJeworCQkJKigoV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldFdvcmRGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDI0IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQyNDoKKwljYXNlIGtFcGxPYmRUeXBVSW50MjQ6CisJCXsKKwkJCSooKERXT1JEICopIHBCdWZmZXIpID0gQW1pR2V0RHdvcmQyNEZyb21MZShwU3JjRGF0YV9wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gMzIgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDMyOgorCWNhc2Uga0VwbE9iZFR5cFVJbnQzMjoKKwljYXNlIGtFcGxPYmRUeXBSZWFsMzI6CisJCXsKKwkJCSooKERXT1JEICopIHBCdWZmZXIpID0gQW1pR2V0RHdvcmRGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDQwIGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDA6CisJCXsKKwkJCSooKFFXT1JEICopIHBCdWZmZXIpID0gQW1pR2V0UXdvcmQ0MEZyb21MZShwU3JjRGF0YV9wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNDggYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDQ4OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0ODoKKwkJeworCQkJKigoUVdPUkQgKikgcEJ1ZmZlcikgPSBBbWlHZXRRd29yZDQ4RnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyA1NiBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50NTY6CisJY2FzZSBrRXBsT2JkVHlwVUludDU2OgorCQl7CisJCQkqKChRV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldFF3b3JkNTZGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDY0IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NjQ6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDY0OgorCQl7CisJCQkqKChRV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldFF3b3JkNjRGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIHRpbWUgb2YgZGF5CisJY2FzZSBrRXBsT2JkVHlwVGltZU9mRGF5OgorCWNhc2Uga0VwbE9iZFR5cFRpbWVEaWZmOgorCQl7CisJCQlBbWlHZXRUaW1lT2ZEYXkocEJ1ZmZlciwgKCh0VGltZU9mRGF5ICopIHBTcmNEYXRhX3ApKTsKKwkJCWJyZWFrOworCQl9CisKKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwU3ViRW50cnktPm1fVHlwZSkKKworCVJldCA9IEVwbE9iZFdyaXRlRW50cnlQb3N0KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgIHBPYmRFbnRyeSwKKwkJCQkgICBwU3ViRW50cnksCisJCQkJICAgJkNiUGFyYW0sIHBCdWZmZXIsIHBEc3REYXRhLCBPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldEFjY2Vzc1R5cGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiByZXR1cm5zIGFjY2Vzc3R5cGUgb2YgdGhlIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBBY2Nlc3NUeXBfcCAgICA9ICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgYWNjZXNzdHlwZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICA9ICAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkR2V0QWNjZXNzVHlwZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB0RXBsT2JkQWNjZXNzICogcEFjY2Vzc1R5cF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeTsKKworCS8vIGdldCBwb2ludGVyIHRvIGluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldEluZGV4SW50ZXJuKCZFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0pLAorCQkJCSAgIHVpSW5kZXhfcCwgJnBPYmRFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIHN1YmluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHBPYmRFbnRyeSwgdWlTdWJJbmRleF9wLCAmcE9iZFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IGFjY2Vzc1R5cGUKKwkqcEFjY2Vzc1R5cF9wID0gcE9iZFN1YkVudHJ5LT5tX0FjY2VzczsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRTZWFyY2hWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgdmFyaWFibGUgZnJvbSBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIGluZGV4IG9mIHRoZSB2YXIgZW50cnkgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgID0gICBzdWJpbmRleCBvZiB2YXIgZW50cnkgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgcHBWYXJFbnRyeV9wICAgID0gICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSB2YXJlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkU2VhcmNoVmFyRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkgICAgICAgdEVwbE9iZFZhckVudHJ5IE1FTSAqKiBwcFZhckVudHJ5X3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YmluZGV4RW50cnk7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vIGdldCBhZGRyZXNzIG9mIHN1YmluZGV4IGVudHJ5CisJUmV0ID0gRXBsT2JkR2V0RW50cnkoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkgICAgIHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLCBOVUxMLCAmcFN1YmluZGV4RW50cnkpOworCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJLy8gZ2V0IHZhciBlbnRyeQorCQlSZXQgPSBFcGxPYmRHZXRWYXJFbnRyeShwU3ViaW5kZXhFbnRyeSwgcHBWYXJFbnRyeV9wKTsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCitFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfRkNUKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZENhbGxPYmplY3RDYWxsYmFjaygpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIGFuIG9iamVjdCBvciBvZiBhIHZhcmlhYmxlCisvLworLy8gUGFyYW1ldGVyczogIGZwQ2FsbGJhY2tfcAorLy8gICAgICAgICAgICAgIHBDYlBhcmFtX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgdEVwbE9iZENhbGxiYWNrIGZwQ2FsbGJhY2tfcCwKKwkJCQkJICAgdEVwbE9iZENiUGFyYW0gTUVNICogcENiUGFyYW1fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRDYWxsYmFjayBNRU0gZnBDYWxsYmFjazsKKworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJQVNTRVJUKHBDYlBhcmFtX3AgIT0gTlVMTCk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGFkZHJlc3Mgb2YgY2FsbGJhY2sgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgaXQKKwlpZiAoZnBDYWxsYmFja19wICE9IE5VTEwpIHsKKwkJLy8gS0VJTCBDNTEgVjYuMDEgaGFzIGEgYnVnLgorCQkvLyBUaGVyZWZvcmUgdGhlIHBhcmFtZXRlciBmcENhbGxiYWNrX3AgaGFzIHRvIGJlIGNvcGllZCBpbiBsb2NhbCB2YXJpYWJsZSBmcENhbGxiYWNrLgorCQlmcENhbGxiYWNrID0gZnBDYWxsYmFja19wOworCisJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoaXMgb2JqZWN0CisJCVJldCA9IGZwQ2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkKKwkJCQkgcENiUGFyYW1fcCk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIHRoZSBkYXRhIHNpemUgb2YgYW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgZm9yIHN0cmluZyBvYmplY3RzIGl0IHJldHVybmVzIHRoZSBzdHJpbmcgbGVuZ3RoCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJJbmRleEVudHJ5X3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbE9iZFNpemUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE9iZFNpemUgRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApCit7CisKKwl0RXBsT2JkU2l6ZSBEYXRhU2l6ZTsKKwl2b2lkIE1FTSAqcERhdGE7CisKKwkvLyBJZiBPRCBlbnRyeSBpcyBkZWZpbmVkIGJ5IG1hY3JvIEVQTF9PQkRfU1VCSU5ERVhfUk9NX1ZTVFJJTkcKKwkvLyB0aGVuIHRoZSBjdXJyZW50IHBvaW50ZXIgaXMgYWx3YXlzIE5VTEwuIFRoZSBmdW5jdGlvbgorCS8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiBkZWZhdWx0IHN0cmluZy4KKwlEYXRhU2l6ZSA9IEVwbE9iZEdldE9iamVjdFNpemUocFN1YkluZGV4RW50cnlfcCk7CisKKwlpZiAocFN1YkluZGV4RW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCS8vIFRoZSBwb2ludGVyIHRvIGN1cnJlbnQgdmFsdWUgY2FuIGJlIHJlY2VpdmVkIGZyb20gRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cigpCisJCXBEYXRhID0KKwkJICAgICgodm9pZCBNRU0gKilFcGxPYmRHZXRPYmplY3RDdXJyZW50UHRyKHBTdWJJbmRleEVudHJ5X3ApKTsKKwkJaWYgKHBEYXRhICE9IE5VTEwpIHsKKwkJCURhdGFTaXplID0KKwkJCSAgICBFcGxPYmRHZXRTdHJMZW4oKHZvaWQgKilwRGF0YSwgRGF0YVNpemUsCisJCQkJCSAgICBwU3ViSW5kZXhFbnRyeV9wLT5tX1R5cGUpOworCQl9CisKKwl9CisKKwlyZXR1cm4gRGF0YVNpemU7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0U3RyTGVuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBzdHJpbmcuIFRoZSAnXDAnCisvLyAgICAgICAgICAgICAgY2hhcmFjdGVyIGlzIGluY2x1ZGVkISEKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcE9iakRhdGFfcCAgICAgICAgICA9IHBvaW50ZXIgdG8gc3RyaW5nCisvLyAgICAgICAgICAgICAgT2JqTGVuX3AgICAgICAgICAgICA9IG1heC4gbGVuZ3RoIG9mIG9iamVjdHIgZW50cnkKKy8vICAgICAgICAgICAgICBiT2JqVHlwZV9wICAgICAgICAgID0gb2JqZWN0IHR5cGUgKFZTVFJJTkcsIC4uLikKKy8vCisvLyBSZXR1cm5zOiAgICAgc3RyaW5nIGxlbmd0aCArIDEKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE9iZFNpemUgRXBsT2JkR2V0U3RyTGVuKHZvaWQgKnBPYmpEYXRhX3AsCisJCQkJICAgdEVwbE9iZFNpemUgT2JqTGVuX3AsIHRFcGxPYmRUeXBlIE9ialR5cGVfcCkKK3sKKworCXRFcGxPYmRTaXplIFN0ckxlbiA9IDA7CisJQllURSAqcGJTdHJpbmc7CisKKwlpZiAocE9iakRhdGFfcCA9PSBOVUxMKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gVmlzaWJsZSBTdHJpbmc6IGRhdGEgZm9ybWF0IGJ5dGUKKwlpZiAoT2JqVHlwZV9wID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCXBiU3RyaW5nID0gcE9iakRhdGFfcDsKKworCQlmb3IgKFN0ckxlbiA9IDA7IFN0ckxlbiA8IE9iakxlbl9wOyBTdHJMZW4rKykgeworCQkJaWYgKCpwYlN0cmluZyA9PSAnXDAnKSB7CisJCQkJU3RyTGVuKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBiU3RyaW5nKys7CisJCX0KKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gb3RoZXIgc3RyaW5nIHR5cGVzIC4uLgorCisgICAgICBFeGl0OgorCXJldHVybiAoU3RyTGVuKTsKKworfQorCisjaWYgKEVQTF9PQkRfQ0hFQ0tfT0JKRUNUX1JBTkdFICE9IEZBTFNFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRDaGVja09iamVjdFJhbmdlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gY2hlY2sgdmFsdWUgcmFuZ2Ugb2Ygb2JqZWN0IGRhdGEKKy8vCisvLyBOT1RJQ0U6IFRoZSBwb2ludGVyIG9mIGRhdGEgKHBEYXRhX3ApIG11c3QgcG9pbnQgb3V0IHRvIGFuIGV2ZW4gYWRkcmVzcywKKy8vICAgICAgICAgaWYgT2JqVHlwZSBpcyB1bmVxdWFsIHRvIGtFcGxPYmRUeXBJbnQ4IG9yIGtFcGxPYmRUeXBVSW50OCEgQnV0IGl0IGlzCisvLyAgICAgICAgIGFsd2F5cyByZWFsaWNlZCBiZWNhdXNlIHBvaW50ZXIgbV9wRGVmYXVsdCBwb2ludHMgYWx3YXlzIHRvIGFuCisvLyAgICAgICAgIGFycmF5IG9mIHRoZSBTUEVDSUZJRUQgdHlwZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFN1YmluZGV4RW50cnlfcAorLy8gICAgICAgICAgICAgIHBEYXRhX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENoZWNrT2JqZWN0UmFuZ2UodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3AsCisJCQkJCSB2b2lkICpwRGF0YV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdm9pZCAqcFJhbmdlRGF0YTsKKworCUFTU0VSVE1TRyhwU3ViaW5kZXhFbnRyeV9wICE9IE5VTEwsCisJCSAgIkVwbE9iZENoZWNrT2JqZWN0UmFuZ2UoKTogbm8gYWRkcmVzcyB0byBzdWJpbmRleCBzdHJ1Y3QhXG4iKTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgaWYgZGF0YSByYW5nZSBoYXMgdG8gYmUgY2hlY2tlZAorCWlmICgocFN1YmluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjUmFuZ2UpID09IDApIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgYWRkcmVzcyBvZiBkZWZhdWx0IGRhdGEKKwlwUmFuZ2VEYXRhID0gcFN1YmluZGV4RW50cnlfcC0+bV9wRGVmYXVsdDsKKworCS8vIGp1bXAgdG8gY2FsbGVkIG9iamVjdCB0eXBlCisJc3dpdGNoICgodEVwbE9iZFR5cGUpIHBTdWJpbmRleEVudHJ5X3AtPm1fVHlwZSkgeworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlIGtFcGxPYmRUeXBCb29sIHdpbGwgbm90IGJlIGNoZWNrZWQgYmVjYXVzZSB0aGVyZSBhcmUgb25seQorCQkvLyB0d28gcG9zc2libGUgdmFsdWVzIDAgb3IgMS4KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlcyB3aGljaCBoYXMgdG8gYmUgY2hlY2sgdXAgYmVjYXVzZSBudW1lcmljYWwgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50ODoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZEludGVnZXI4ICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHRFcGxPYmRJbnRlZ2VyOCAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkSW50ZWdlcjggKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZEludGVnZXI4ICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBoaWdoCisJCWlmICgqKCh0RXBsT2JkSW50ZWdlcjggKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZEludGVnZXI4ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGtFcGxPYmRUeXBVSW50ODoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFVuc2lnbmVkOCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkVW5zaWduZWQ4ICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRVbnNpZ25lZDggKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFVuc2lnbmVkOCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkOCAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQ4ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGtFcGxPYmRUeXBJbnQxNjoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZEludGVnZXIxNiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkSW50ZWdlcjE2ICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRJbnRlZ2VyMTYgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZEludGVnZXIxNiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZEludGVnZXIxNiAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkSW50ZWdlcjE2ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGtFcGxPYmRUeXBVSW50MTY6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRVbnNpZ25lZDE2ICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHRFcGxPYmRVbnNpZ25lZDE2ICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRVbnNpZ25lZDE2ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRVbnNpZ25lZDE2ICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBoaWdoCisJCWlmICgqKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwSW50MzI6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZEludGVnZXIzMiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkSW50ZWdlcjMyICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRJbnRlZ2VyMzIgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZEludGVnZXIzMiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwVUludDMyOgorCisJCS8vIHN3aXRjaCB0byBsb3dlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkVW5zaWduZWQzMiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkVW5zaWduZWQzMiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQzMiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkVW5zaWduZWQzMiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkMzIgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFVuc2lnbmVkMzIgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCWNhc2Uga0VwbE9iZFR5cFJlYWwzMjoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFJlYWwzMiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkUmVhbDMyICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRSZWFsMzIgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFJlYWwzMiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFJlYWwzMiAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkUmVhbDMyICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBJbnQ0ODoKKwljYXNlIGtFcGxPYmRUeXBJbnQ1NjoKKwljYXNlIGtFcGxPYmRUeXBJbnQ2NDoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgoc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigoc2lnbmVkIFFXT1JEICopcERhdGFfcCkgPCAqKChzaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKChzaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigoc2lnbmVkIFFXT1JEICopcERhdGFfcCkgPiAqKChzaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwVUludDQwOgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50NTY6CisJY2FzZSBrRXBsT2JkVHlwVUludDY0OgorCisJCS8vIHN3aXRjaCB0byBsb3dlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh1bnNpZ25lZCBRV09SRCAqKXBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHVuc2lnbmVkIFFXT1JEICopcERhdGFfcCkgPAorCQkgICAgKigodW5zaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh1bnNpZ25lZCBRV09SRCAqKXBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBoaWdoCisJCWlmICgqKCh1bnNpZ25lZCBRV09SRCAqKXBEYXRhX3ApID4KKwkJICAgICooKHVuc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFJlYWw2NDoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFJlYWw2NCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkUmVhbDY0ICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRSZWFsNjQgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFJlYWw2NCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFJlYWw2NCAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkUmVhbDY0ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBUaW1lT2ZEYXk6CisJY2FzZSBrRXBsT2JkVHlwVGltZURpZmY6CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE9iZFR5cGVzIGtFcGxPYmRUeXBYU3RyaW5nIGFuZCBrRXBsT2JkVHlwRG9tYWluIGNhbiBub3QgYmUgY2hlY2t0IGJlY2F1c2UKKwkJLy8gdGhleSBoYXZlIG5vIG51bWVyaWNhbCB2YWx1ZS4KKwlkZWZhdWx0OgorCisJCVJldCA9IGtFcGxPYmRVbmtub3duT2JqZWN0VHlwZTsKKwkJYnJlYWs7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmIC8vIChFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAhPSBGQUxTRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkV3JpdGVFbnRyeVByZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHByZXBhcmVzIHdyaXRlIG9mIGRhdGEgdG8gYW4gT0JEIGVudHJ5LiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeVByZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgICAgIHZvaWQgKipwcERzdERhdGFfcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSBTaXplX3AsCisJCQkJCSAgICAgdEVwbE9iZEVudHJ5UHRyICogcHBPYmRFbnRyeV9wLAorCQkJCQkgICAgIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwU3ViRW50cnlfcCwKKwkJCQkJICAgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplICogcE9iZFNpemVfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeTsKKwl0RXBsT2JkQWNjZXNzIEFjY2VzczsKKwl2b2lkIE1FTSAqcERzdERhdGE7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCT09MIGZFbnRyeU51bWVyaWNhbDsKKworI2lmIChFUExfT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTSAhPSBGQUxTRSkKKwl0RXBsT2JkVlN0cmluZ0RvbWFpbiBNRU0gTWVtVlN0cmluZ0RvbWFpbjsKKwl2b2lkIE1FTSAqcEN1cnJEYXRhOworI2VuZGlmCisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUFTU0VSVChwU3JjRGF0YV9wICE9IE5VTEwpOwkvLyBzaG91bGQgbmV2ZXIgYmUgTlVMTAorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZXQgYWRkcmVzcyBvZiBpbmRleCBhbmQgc3ViaW5kZXggZW50cnkKKwlSZXQgPSBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgdWlJbmRleF9wLCB1aVN1YkluZGV4X3AsICZwT2JkRW50cnksICZwU3ViRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBvYmplY3QgZGF0YQorCXBEc3REYXRhID0gKHZvaWQgTUVNICopRXBsT2JkR2V0T2JqZWN0RGF0YVB0ckludGVybihwU3ViRW50cnkpOworCisJQWNjZXNzID0gKHRFcGxPYmRBY2Nlc3MpIHBTdWJFbnRyeS0+bV9BY2Nlc3M7CisKKwkvLyBjaGVjayBhY2Nlc3MgZm9yIHdyaXRlCisJLy8gYWNjZXNzIHZpb2xhdGlvbiBpZiBhZHJlc3MgdG8gY3VycmVudCB2YWx1ZSBpcyBOVUxMCisJaWYgKCgoQWNjZXNzICYga0VwbE9iZEFjY0NvbnN0KSAhPSAwKSB8fCAocERzdERhdGEgPT0gTlVMTCkpIHsKKwkJUmV0ID0ga0VwbE9iZEFjY2Vzc1Zpb2xhdGlvbjsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGdldCBzaXplIG9mIG9iamVjdAorCS8vIC1hcyBPYmRTaXplID0gT2JkR2V0T2JqZWN0U2l6ZSAocFN1YkVudHJ5KTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gVG8gdXNlIHRoZSBzYW1lIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBPYmRXcml0ZUVudHJ5IGFzIHdlbGwgYXMgZm9yCisJLy8gYW4gU0RPIGRvd25sb2FkIGNhbGwgYXQgZmlyc3QgKGtFcGxPYmRFdlByZS4uLikgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisJLy8gd2l0aCB0aGUgYXJndW1lbnQgcG9pbnRlciB0byBvYmplY3Qgc2l6ZS4KKwlwQ2JQYXJhbV9wLT5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJcENiUGFyYW1fcC0+bV91aVN1YkluZGV4ID0gdWlTdWJJbmRleF9wOworCisJLy8gQmVjYXVzZSBvYmplY3Qgc2l6ZSBhbmQgb2JqZWN0IHBvaW50ZXIgYXJlCisJLy8gYWRhcHRlZCBieSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLCByZS1yZWFkCisJLy8gdGhpcyB2YWx1ZXMuCisJT2JkU2l6ZSA9IEVwbE9iZEdldE9iamVjdFNpemUocFN1YkVudHJ5KTsKKwlwRHN0RGF0YSA9ICh2b2lkIE1FTSAqKUVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4ocFN1YkVudHJ5KTsKKworCS8vIDA5LWRlYy0yMDA0IHIuZC46CisJLy8gICAgICBGdW5jdGlvbiBFcGxPYmRXcml0ZUVudHJ5KCkgY2FsbHMgbmV3IGV2ZW50IGtFcGxPYmRFdldyU3RyaW5nRG9tYWluCisJLy8gICAgICBmb3IgU3RyaW5nIG9yIERvbWFpbiB3aGljaCBsZXRzIGNhbGxlZCBtb2R1bGUgZGlyZWN0bHkgY2hhbmdlCisJLy8gICAgICB0aGUgZGF0YSBwb2ludGVyIG9yIHNpemUuIFRoaXMgcHJldmVudHMgYSByZWN1cnNpdmUgY2FsbCB0bworCS8vICAgICAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlmIGl0IGNhbGxzIEVwbE9iZEdldEVudHJ5KCkuCisjaWYgKEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNICE9IEZBTFNFKQorCWlmICgocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHx8CisJICAgIChwU3ViRW50cnktPm1fVHlwZSA9PSBrRXBsT2JkVHlwRG9tYWluKSB8fAorCSAgICAocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cE9TdHJpbmcpKSB7CisJCWlmIChwU3ViRW50cnktPm1fVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQkJLy8gcmVzZXJ2ZSBvbmUgYnl0ZSBmb3IgMC10ZXJtaW5hdGlvbgorCQkJLy8gLWFzIE9iZFNpemUgLT0gMTsKKwkJCVNpemVfcCArPSAxOworCQl9CisJCS8vIGZpbGwgb3V0IG5ldyBhcmctc3RydWN0CisJCU1lbVZTdHJpbmdEb21haW4ubV9Eb3dubG9hZFNpemUgPSBTaXplX3A7CisJCU1lbVZTdHJpbmdEb21haW4ubV9PYmpTaXplID0gT2JkU2l6ZTsKKwkJTWVtVlN0cmluZ0RvbWFpbi5tX3BEYXRhID0gcERzdERhdGE7CisKKwkJcENiUGFyYW1fcC0+bV9PYmRFdmVudCA9IGtFcGxPYmRFdldyU3RyaW5nRG9tYWluOworCQlwQ2JQYXJhbV9wLT5tX3BBcmcgPSAmTWVtVlN0cmluZ0RvbWFpbjsKKwkJLy8gIGNhbGwgdXNlciBjYWxsYmFjaworCQlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywKKwkJCQkJICAgICAgIHBDYlBhcmFtX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gd3JpdGUgYmFjayBuZXcgc2V0dGluZ3MKKwkJcEN1cnJEYXRhID0gcFN1YkVudHJ5LT5tX3BDdXJyZW50OworCQlpZiAoKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKQorCQkgICAgfHwgKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBPU3RyaW5nKSkgeworCQkJKCh0RXBsT2JkVlN0cmluZyBNRU0gKikgcEN1cnJEYXRhKS0+bV9TaXplID0KKwkJCSAgICBNZW1WU3RyaW5nRG9tYWluLm1fT2JqU2l6ZTsKKwkJCSgodEVwbE9iZFZTdHJpbmcgTUVNICopIHBDdXJyRGF0YSktPm1fcFN0cmluZyA9CisJCQkgICAgTWVtVlN0cmluZ0RvbWFpbi5tX3BEYXRhOworCQl9IGVsc2UJCS8vIGlmIChwU2Rvc1RhYmxlRW50cnlfcC0+bV9iT2JqVHlwZSA9PSBrRXBsT2JkVHlwRG9tYWluKQorCQl7CisJCQkoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcEN1cnJEYXRhKS0+bV9TaXplID0KKwkJCSAgICBNZW1WU3RyaW5nRG9tYWluLm1fT2JqU2l6ZTsKKwkJCSgodEVwbE9iZFZhckVudHJ5IE1FTSAqKSBwQ3VyckRhdGEpLT5tX3BEYXRhID0KKwkJCSAgICAodm9pZCBNRU0gKilNZW1WU3RyaW5nRG9tYWluLm1fcERhdGE7CisJCX0KKworCQkvLyBCZWNhdXNlIG9iamVjdCBzaXplIGFuZCBvYmplY3QgcG9pbnRlciBhcmUKKwkJLy8gYWRhcHRlZCBieSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLCByZS1yZWFkCisJCS8vIHRoaXMgdmFsdWVzLgorCQlPYmRTaXplID0gTWVtVlN0cmluZ0RvbWFpbi5tX09ialNpemU7CisJCXBEc3REYXRhID0gKHZvaWQgTUVNICopTWVtVlN0cmluZ0RvbWFpbi5tX3BEYXRhOworCX0KKyNlbmRpZiAvLyNpZiAoT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTSAhPSBGQUxTRSkKKworCS8vIDA3LWRlYy0yMDA0IHIuZC46IHNpemUgZnJvbSBhcHBsaWNhdGlvbiBpcyBuZWVkZWQgYmVjYXVzZSBjYWxsYmFjayBmdW5jdGlvbiBjYW4gY2hhbmdlIHRoZSBvYmplY3Qgc2l6ZQorCS8vIC1hcyAxNi4xMS4wNCBDYlBhcmFtLm1fcEFyZyAgICAgPSAmT2JkU2l6ZTsKKwkvLyAwOS1kZWMtMjAwNCByLmQuOiBDYlBhcmFtLm1fcEFyZyAgICAgPSAmU2l6ZV9wOworCXBDYlBhcmFtX3AtPm1fcEFyZyA9ICZPYmRTaXplOworCXBDYlBhcmFtX3AtPm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZJbml0V3JpdGU7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywgcENiUGFyYW1fcCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKFNpemVfcCA+IE9iZFNpemUpIHsKKwkJUmV0ID0ga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJaWYgKCgoY2hhciBNRU0gKilwU3JjRGF0YV9wKVtTaXplX3AgLSAxXSA9PSAnXDAnKSB7CS8vIGxhc3QgYnl0ZSBvZiBzb3VyY2Ugc3RyaW5nIGNvbnRhaW5zIG51bGwgY2hhcmFjdGVyCisKKwkJCS8vIHJlc2VydmUgb25lIGJ5dGUgaW4gZGVzdGluYXRpb24gZm9yIDAtdGVybWluYXRpb24KKwkJCVNpemVfcCAtPSAxOworCQl9IGVsc2UgaWYgKFNpemVfcCA+PSBPYmRTaXplKSB7CS8vIHNvdXJjZSBzdHJpbmcgaXMgbm90IDAtdGVybWluYXRlZAorCQkJLy8gYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyB0b28gc2hvcnQKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJUmV0ID0gRXBsT2JkSXNOdW1lcmljYWxJbnRlcm4ocFN1YkVudHJ5LCAmZkVudHJ5TnVtZXJpY2FsKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKGZFbnRyeU51bWVyaWNhbCAhPSBGQUxTRSkKKwkgICAgJiYgKFNpemVfcCAhPSBPYmRTaXplKSkgeworCQkvLyB0eXBlIGlzIG51bWVyaWNhbCwgdGhlcmVmb3Igc2l6ZSBoYXMgdG8gZml0LCBidXQgaXQgZG9lcyBub3QuCisJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHVzZSBnaXZlbiBzaXplLCBiZWNhdXNlIG5vbi1udW1lcmljYWwgb2JqZWN0cyBjYW4gYmUgd3JpdHRlbiB3aXRoIHNob3J0ZXIgdmFsdWVzCisJT2JkU2l6ZSA9IFNpemVfcDsKKworCS8vIHNldCBvdXRwdXQgcGFyYW1ldGVycworCSpwT2JkU2l6ZV9wID0gT2JkU2l6ZTsKKwkqcHBPYmRFbnRyeV9wID0gcE9iZEVudHJ5OworCSpwcFN1YkVudHJ5X3AgPSBwU3ViRW50cnk7CisJKnBwRHN0RGF0YV9wID0gcERzdERhdGE7CisKKwkvLyBhbGwgY2hlY2tzIGFyZSBkb25lCisJLy8gdGhlIGNhbGxlciBtYXkgbm93IGNvbnZlcnQgdGhlIG51bWVyaWFsIHNvdXJjZSB2YWx1ZSB0byBwbGF0Zm9ybSBieXRlIG9yZGVyIGluIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRXcml0ZUVudHJ5UG9zdCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGZpbmlzaGVzIHdyaXRlIG9mIGRhdGEgdG8gYW4gT0JEIGVudHJ5LiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeVBvc3QoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeV9wLAorCQkJCQkgICAgICB0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkVudHJ5X3AsCisJCQkJCSAgICAgIHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBDYlBhcmFtX3AsCisJCQkJCSAgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCSAgICAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCSAgICAgIHRFcGxPYmRTaXplIE9iZFNpemVfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCisJLy8gY2FsbGVyIGNvbnZlcnRlZCB0aGUgc291cmNlIHZhbHVlIHRvIHBsYXRmb3JtIGJ5dGUgb3JkZXIKKwkvLyBub3cgdGhlIHJhbmdlIG9mIHRoZSB2YWx1ZSBtYXkgYmUgY2hlY2tlZAorCisjaWYgKEVQTF9PQkRfQ0hFQ0tfT0JKRUNUX1JBTkdFICE9IEZBTFNFKQorCXsKKwkJLy8gY2hlY2sgZGF0YSByYW5nZQorCQlSZXQgPSBFcGxPYmRDaGVja09iamVjdFJhbmdlKHBTdWJFbnRyeV9wLCBwU3JjRGF0YV9wKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorI2VuZGlmCisKKwkvLyBub3cgY2FsbCB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlCisJLy8gd3JpdGUgYWRkcmVzcyBvZiBzb3VyY2UgZGF0YSB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGVjayB0aGlzIGRhdGEKKwlwQ2JQYXJhbV9wLT5tX3BBcmcgPSBwU3JjRGF0YV9wOworCXBDYlBhcmFtX3AtPm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQcmVXcml0ZTsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeV9wLT5tX2ZwQ2FsbGJhY2ssIHBDYlBhcmFtX3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjb3B5IG9iamVjdCBkYXRhIHRvIE9CRAorCUVQTF9NRU1DUFkocERzdERhdGFfcCwgcFNyY0RhdGFfcCwgT2JkU2l6ZV9wKTsKKworCS8vIHRlcm1pbmF0ZSBzdHJpbmcgd2l0aCAwCisJaWYgKHBTdWJFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJKChjaGFyIE1FTSAqKXBEc3REYXRhX3ApW09iZFNpemVfcF0gPSAnXDAnOworCX0KKwkvLyB3cml0ZSBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIHRvIHN0cnVjdHVyZSBvZiBjYWxsYmFjayBwYXJhbWV0ZXJzCisJLy8gc28gY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSBkYXRhIHN1YnNlcXVlbnRseQorCXBDYlBhcmFtX3AtPm1fcEFyZyA9IHBEc3REYXRhX3A7CisJcENiUGFyYW1fcC0+bV9PYmRFdmVudCA9IGtFcGxPYmRFdlBvc3RXcml0ZTsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeV9wLT5tX2ZwQ2FsbGJhY2ssIHBDYlBhcmFtX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3RTaXplKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gZ2V0IHNpemUgb2Ygb2JqZWN0CisvLyAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgYW4gb2JqZWN0IHR5cGUgYW4gZml4ZWQgZGF0YSB0eXBlIChCWVRFLCBXT1JELCAuLi4pCisvLyAgICAgICAgICAgICAgb3Igbm9uIGZpeGVkIG9iamVjdCAoc3RyaW5nLCBkb21haW4pLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gZGVjaWRlCisvLyAgICAgICAgICAgICAgaWYgZG93bmxvYWQgZGF0YSBhcmUgc3RvcmVkIHRlbXBvcmFyeSBvciBub3QuIEZvciBvYmplY3RzIHdpdGggZml4ZWQgZGF0YSBsZW5ndGgKKy8vICAgICAgICAgICAgICBhbmQgdHlwZXMgYSB2YWx1ZSByYW5nZSBjaGVja2luZyBjYW4gcHJvY2Vzcy4KKy8vICAgICAgICAgICAgICBGb3Igc3RyaW5ncyB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgd2hvbGUgb2JqZWN0IHNpemUgbm90IHRoZQorLy8gICAgICAgICAgICAgIGxlbmd0aCBvZiBzdHJpbmcuCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJJbmRleEVudHJ5X3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbE9iZFNpemUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE9iZFNpemUgRXBsT2JkR2V0T2JqZWN0U2l6ZSh0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkluZGV4RW50cnlfcCkKK3sKKworCXRFcGxPYmRTaXplIERhdGFTaXplID0gMDsKKwl2b2lkICpwRGF0YTsKKworCXN3aXRjaCAocFN1YkluZGV4RW50cnlfcC0+bV9UeXBlKSB7CisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwQm9vbDoKKworCQlEYXRhU2l6ZSA9IDE7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE9iZFR5cGVzIHdoaWNoIGhhcyB0byBiZSBjaGVjayBiZWNhdXNlIG51bWVyaWNhbCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ4OgorCQlEYXRhU2l6ZSA9IHNpemVvZih0RXBsT2JkSW50ZWdlcjgpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFVJbnQ4OgorCQlEYXRhU2l6ZSA9IHNpemVvZih0RXBsT2JkVW5zaWduZWQ4KTsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQxNjoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZEludGVnZXIxNik7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwVUludDE2OgorCQlEYXRhU2l6ZSA9IHNpemVvZih0RXBsT2JkVW5zaWduZWQxNik7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50MzI6CisJCURhdGFTaXplID0gc2l6ZW9mKHRFcGxPYmRJbnRlZ2VyMzIpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFVJbnQzMjoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZFVuc2lnbmVkMzIpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFJlYWwzMjoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZFJlYWwzMik7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE9iZFR5cGVzIHdoaWNoIGhhcyB0byBiZSBub3QgY2hlY2tlZCBiZWNhdXNlIG5vdCBOVU0gdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwRG9tYWluOgorCisJCXBEYXRhID0gKHZvaWQgKilwU3ViSW5kZXhFbnRyeV9wLT5tX3BDdXJyZW50OworCQlpZiAoKHZvaWQgTUVNICopcERhdGEgIT0gKHZvaWQgTUVNICopTlVMTCkgeworCQkJRGF0YVNpemUgPSAoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcERhdGEpLT5tX1NpemU7CisJCX0KKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBWU3RyaW5nOgorCQkvL2Nhc2Uga0VwbE9iZFR5cFVTdHJpbmc6CisKKwkJLy8gSWYgT0QgZW50cnkgaXMgZGVmaW5lZCBieSBtYWNybyBFUExfT0JEX1NVQklOREVYX1JPTV9WU1RSSU5HCisJCS8vIHRoZW4gdGhlIGN1cnJlbnQgcG9pbnRlciBpcyBhbHdheXMgTlVMTC4gVGhlIGZ1bmN0aW9uCisJCS8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiBkZWZhdWx0IHN0cmluZy4KKwkJcERhdGEgPSAodm9pZCAqKXBTdWJJbmRleEVudHJ5X3AtPm1fcEN1cnJlbnQ7CisJCWlmICgodm9pZCBNRU0gKilwRGF0YSAhPSAodm9pZCBNRU0gKilOVUxMKSB7CisJCQkvLyBUaGUgbWF4LiBzaXplIG9mIHN0cmluZ3MgZGVmaW5lZCBieSBTVFJJTkctTWFjcm8gaXMgc3RvcmVkIGluCisJCQkvLyB0RXBsT2JkVlN0cmluZyBvZiBjdXJyZW50IHZhbHVlLgorCQkJLy8gKHR5cGVzIHRFcGxPYmRWU3RyaW5nLCB0RXBsT2JkT1N0cmluZyBhbmQgdEVwbE9iZFVTdHJpbmcgaGFzIHRoZSBzYW1lIG1lbWJlcnMpCisJCQlEYXRhU2l6ZSA9ICgodEVwbE9iZFZTdHJpbmcgTUVNICopIHBEYXRhKS0+bV9TaXplOworCQl9IGVsc2UgeworCQkJLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgbm90IGRlY2xlYXJlZC4gVGhlIHN0cmluZworCQkJLy8gaXMgbG9jYXRlZCBpbiBST00sIHRoZXJlZm9yIHVzZSBkZWZhdWx0IHBvaW50ZXIuCisJCQlwRGF0YSA9ICh2b2lkICopcFN1YkluZGV4RW50cnlfcC0+bV9wRGVmYXVsdDsKKwkJCWlmICgoQ09OU1Qgdm9pZCBST00gKilwRGF0YSAhPSAoQ09OU1Qgdm9pZCBST00gKilOVUxMKSB7CisJCQkJLy8gVGhlIG1heC4gc2l6ZSBvZiBzdHJpbmdzIGRlZmluZWQgYnkgU1RSSU5HLU1hY3JvIGlzIHN0b3JlZCBpbgorCQkJCS8vIHRFcGxPYmRWU3RyaW5nIG9mIGRlZmF1bHQgdmFsdWUuCisJCQkJRGF0YVNpemUgPQorCQkJCSAgICAoKENPTlNUIHRFcGxPYmRWU3RyaW5nIFJPTSAqKSBwRGF0YSktPgorCQkJCSAgICBtX1NpemU7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cE9TdHJpbmc6CisKKwkJcERhdGEgPSAodm9pZCAqKXBTdWJJbmRleEVudHJ5X3AtPm1fcEN1cnJlbnQ7CisJCWlmICgodm9pZCBNRU0gKilwRGF0YSAhPSAodm9pZCBNRU0gKilOVUxMKSB7CisJCQkvLyBUaGUgbWF4LiBzaXplIG9mIHN0cmluZ3MgZGVmaW5lZCBieSBTVFJJTkctTWFjcm8gaXMgc3RvcmVkIGluCisJCQkvLyB0RXBsT2JkVlN0cmluZyBvZiBjdXJyZW50IHZhbHVlLgorCQkJLy8gKHR5cGVzIHRFcGxPYmRWU3RyaW5nLCB0RXBsT2JkT1N0cmluZyBhbmQgdEVwbE9iZFVTdHJpbmcgaGFzIHRoZSBzYW1lIG1lbWJlcnMpCisJCQlEYXRhU2l6ZSA9ICgodEVwbE9iZE9TdHJpbmcgTUVNICopIHBEYXRhKS0+bV9TaXplOworCQl9IGVsc2UgeworCQkJLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgbm90IGRlY2xlYXJlZC4gVGhlIHN0cmluZworCQkJLy8gaXMgbG9jYXRlZCBpbiBST00sIHRoZXJlZm9yIHVzZSBkZWZhdWx0IHBvaW50ZXIuCisJCQlwRGF0YSA9ICh2b2lkICopcFN1YkluZGV4RW50cnlfcC0+bV9wRGVmYXVsdDsKKwkJCWlmICgoQ09OU1Qgdm9pZCBST00gKilwRGF0YSAhPSAoQ09OU1Qgdm9pZCBST00gKilOVUxMKSB7CisJCQkJLy8gVGhlIG1heC4gc2l6ZSBvZiBzdHJpbmdzIGRlZmluZWQgYnkgU1RSSU5HLU1hY3JvIGlzIHN0b3JlZCBpbgorCQkJCS8vIHRFcGxPYmRWU3RyaW5nIG9mIGRlZmF1bHQgdmFsdWUuCisJCQkJRGF0YVNpemUgPQorCQkJCSAgICAoKENPTlNUIHRFcGxPYmRPU3RyaW5nIFJPTSAqKSBwRGF0YSktPgorCQkJCSAgICBtX1NpemU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQyNDoKKwljYXNlIGtFcGxPYmRUeXBVSW50MjQ6CisKKwkJRGF0YVNpemUgPSAzOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEludDQwOgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0MDoKKworCQlEYXRhU2l6ZSA9IDU7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50NDg6CisJY2FzZSBrRXBsT2JkVHlwVUludDQ4OgorCisJCURhdGFTaXplID0gNjsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQ1NjoKKwljYXNlIGtFcGxPYmRUeXBVSW50NTY6CisKKwkJRGF0YVNpemUgPSA3OworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEludDY0OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBSZWFsNjQ6CisKKwkJRGF0YVNpemUgPSA4OworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFRpbWVPZkRheToKKwljYXNlIGtFcGxPYmRUeXBUaW1lRGlmZjoKKworCQlEYXRhU2l6ZSA9IDY7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIERhdGFTaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3REZWZhdWx0UHRyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gZ2V0IHRoZSBkZWZhdWx0IHBvaW50ZXIgKHR5cGUgc3BlY2lmaWMpCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJJbmRleEVudHJ5X3AgICAgPSBwb2ludGVyIHRvIHN1YmluZGV4IHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAodm9pZCAqKSAgID0gcG9pbnRlciB0byBkZWZhdWx0IHZhbHVlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKkVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApCit7CisKKwl2b2lkICpwRGVmYXVsdDsKKwl0RXBsT2JkVHlwZSBUeXBlOworCisJQVNTRVJUTVNHKHBTdWJJbmRleEVudHJ5X3AgIT0gTlVMTCwKKwkJICAiRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cigpOiBwb2ludGVyIHRvIFN1YkVudHJ5IG5vdCB2YWxpZCFcbiIpOworCisJLy8gZ2V0IGFkZHJlc3MgdG8gZGVmYXVsdCBkYXRhIGZyb20gZGVmYXVsdCBwb2ludGVyCisJcERlZmF1bHQgPSBwU3ViSW5kZXhFbnRyeV9wLT5tX3BEZWZhdWx0OworCWlmIChwRGVmYXVsdCAhPSBOVUxMKSB7CisJCS8vIHRoZXJlIGFyZSBzb21lIHNwZWNpYWwgdHlwZXMsIHdob3NlIGRlZmF1bHQgcG9pbnRlciBhbHdheXMgaXMgTlVMTCBvciBoYXMgdG8gZ2V0IGZyb20gb3RoZXIgc3RydWN0dXJlCisJCS8vIGdldCB0eXBlIGZyb20gc3ViaW5kZXggc3RydWN0dXJlCisJCVR5cGUgPSBwU3ViSW5kZXhFbnRyeV9wLT5tX1R5cGU7CisKKwkJLy8gY2hlY2sgaWYgb2JqZWN0IHR5cGUgaXMgYSBzdHJpbmcgdmFsdWUKKwkJaWYgKChUeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKQkvKiB8fAorCQkJCQkJICAgKFR5cGUgPT0ga0VwbE9iZFR5cFVTdHJpbmcpICovICkgeworCisJCQkvLyBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HCisJCQkvLyAgICB0RXBsT2JkU2l6ZSAgICAgICAgIG1fU2l6ZTsgICAgICAgLS0+IHNpemUgb2YgZGVmYXVsdCBzdHJpbmcKKwkJCS8vICAgIGNoYXIgKiAgICBtX3BEZWZTdHJpbmc7IC0tPiBwb2ludGVyIHRvICBkZWZhdWx0IHN0cmluZworCQkJLy8gICAgY2hhciAqICAgIG1fcFN0cmluZzsgICAgLS0+IHBvaW50ZXIgdG8gc3RyaW5nIGluIFJBTQorCQkJLy8KKwkJCXBEZWZhdWx0ID0KKwkJCSAgICAodm9pZCAqKSgodEVwbE9iZFZTdHJpbmcgKikgcERlZmF1bHQpLT5tX3BTdHJpbmc7CisJCX0gZWxzZSBpZiAoVHlwZSA9PSBrRXBsT2JkVHlwT1N0cmluZykgeworCQkJcERlZmF1bHQgPQorCQkJICAgICh2b2lkICopKCh0RXBsT2JkT1N0cmluZyAqKSBwRGVmYXVsdCktPm1fcFN0cmluZzsKKwkJfQorCX0KKworCXJldHVybiBwRGVmYXVsdDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgYSB2YXJpYWJsZSBlbnRyeSBvZiBhbiBvYmplY3QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFN1YmluZGV4RW50cnlfcAorLy8gICAgICAgICAgICAgIHBwVmFyRW50cnlfcAorLy8KKy8vIFJldHVybjogICAgICB0Q29wS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0VmFyRW50cnkodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3AsCisJCQkJICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKiogcHBWYXJFbnRyeV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsT2JkVmFyRW50cnlOb3RFeGlzdDsKKworCUFTU0VSVChwcFZhckVudHJ5X3AgIT0gTlVMTCk7CS8vIGlzIG5vdCBhbGxvd2VkIHRvIGJlIE5VTEwKKwlBU1NFUlQocFN1YmluZGV4RW50cnlfcCAhPSBOVUxMKTsKKworCS8vIGNoZWNrIFZBUi1GbGFnIC0gb25seSB0aGlzIG9iamVjdCBwb2ludHMgdG8gdmFyaWFibGVzCisJaWYgKChwU3ViaW5kZXhFbnRyeV9wLT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NWYXIpICE9IDApIHsKKwkJLy8gY2hlY2sgaWYgb2JqZWN0IGlzIGFuIGFycmF5CisJCWlmICgocFN1YmluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjQXJyYXkpICE9IDApIHsKKwkJCSpwcFZhckVudHJ5X3AgPQorCQkJICAgICYoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcFN1YmluZGV4RW50cnlfcC0+CisJCQkgICAgICBtX3BDdXJyZW50KVtwU3ViaW5kZXhFbnRyeV9wLT5tX3VpU3ViSW5kZXggLSAxXTsKKwkJfSBlbHNlIHsKKwkJCSpwcFZhckVudHJ5X3AgPQorCQkJICAgICh0RXBsT2JkVmFyRW50cnkgTUVNICopIHBTdWJpbmRleEVudHJ5X3AtPgorCQkJICAgIG1fcEN1cnJlbnQ7CisJCX0KKworCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldEVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZ2V0cyBhIGluZGV4IGVudHJ5IGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBudW1iZXIKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgICAgPSAgIFN1YmluZGV4IG51bWJlcgorLy8gICAgICAgICAgICAgIHBwT2JkRW50cnlfcCAgICA9ICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgZW50cnkKKy8vICAgICAgICAgICAgICBwcE9iZFN1YkVudHJ5X3AgPSAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIHN1YmVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCwKKwkJCQkgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBPYmRTdWJFbnRyeV9wKQoreworCisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkQ2JQYXJhbSBNRU0gQ2JQYXJhbTsKKwl0RXBsS2VybmVsIFJldDsKKworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZXQgYWRkcmVzcyBvZiBlbnRyeSBvZiBpbmRleAorCVJldCA9CisJICAgIEVwbE9iZEdldEluZGV4SW50ZXJuKCZFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0pLCB1aUluZGV4X3AsCisJCQkJICZwT2JkRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGdldCBhZGRyZXNzIG9mIGVudHJ5IG9mIHN1YmluZGV4CisJUmV0ID0gRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4ocE9iZEVudHJ5LCB1aVN1YmluZGV4X3AsIHBwT2JkU3ViRW50cnlfcCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY2FsbCBjYWxsYmFjayBmdW5jdGlvbiB0byBpbmZvcm0gdXNlci9zdGFjayB0aGF0IGFuIG9iamVjdCB3aWxsIGJlIHNlYXJjaGVkCisJLy8gaWYgdGhlIGNhbGxlZCBtb2R1bGUgcmV0dXJuZXMgYW4gZXJyb3IgdGhlbiB3ZSBhYm9ydCB0aGUgc2VhcmNoaW5nIHdpdGgga0VwbE9iZEluZGV4Tm90RXhpc3QKKwlDYlBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlDYlBhcmFtLm1fdWlTdWJJbmRleCA9IHVpU3ViaW5kZXhfcDsKKwlDYlBhcmFtLm1fcEFyZyA9IE5VTEw7CisJQ2JQYXJhbS5tX09iZEV2ZW50ID0ga0VwbE9iZEV2Q2hlY2tFeGlzdDsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeS0+bV9mcENhbGxiYWNrLCAmQ2JQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGl0IGlzIGFsbG93ZWQgdG8gc2V0IHBwT2JkRW50cnlfcCB0byBOVUxMCisJLy8gaWYgc28sIG5vIGFkZHJlc3Mgd2lsbCBiZSB3cml0dGVuIHRvIGNhbGxpbmcgZnVuY3Rpb24KKwlpZiAocHBPYmRFbnRyeV9wICE9IE5VTEwpIHsKKwkJKnBwT2JkRW50cnlfcCA9IHBPYmRFbnRyeTsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBnZXQgQ3VycmVudCBwb2ludGVyICh0eXBlIHNwZWNpZmljKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU3ViSW5kZXhFbnRyeV9wCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQgTUVNKgorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIE1FTSAqRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cih0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkluZGV4RW50cnlfcCkKK3sKKworCXZvaWQgTUVNICpwRGF0YTsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheUluZGV4OworCXRFcGxPYmRTaXplIFNpemU7CisKKwlwRGF0YSA9IHBTdWJJbmRleEVudHJ5X3AtPm1fcEN1cnJlbnQ7CisKKwkvLyBjaGVjayBpZiBjb25zdGFudCBvYmplY3QKKwlpZiAocERhdGEgIT0gTlVMTCkgeworCQkvLyBjaGVjayBpZiBvYmplY3QgaXMgYW4gYXJyYXkKKwkJaWYgKChwU3ViSW5kZXhFbnRyeV9wLT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NBcnJheSkgIT0gMCkgeworCQkJLy8gY2FsY3VsYXRlIGNvcnJlY3QgZGF0YSBwb2ludGVyCisJCQl1aUFycmF5SW5kZXggPSBwU3ViSW5kZXhFbnRyeV9wLT5tX3VpU3ViSW5kZXggLSAxOworCQkJaWYgKChwU3ViSW5kZXhFbnRyeV9wLT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NWYXIpICE9IDApIHsKKwkJCQlTaXplID0gc2l6ZW9mKHRFcGxPYmRWYXJFbnRyeSk7CisJCQl9IGVsc2UgeworCQkJCVNpemUgPSBFcGxPYmRHZXRPYmplY3RTaXplKHBTdWJJbmRleEVudHJ5X3ApOworCQkJfQorCQkJcERhdGEgPSAoKEJZVEUgTUVNICopIHBEYXRhKSArIChTaXplICogdWlBcnJheUluZGV4KTsKKwkJfQorCQkvLyBjaGVjayBpZiBWYXJFbnRyeQorCQlpZiAoKHBTdWJJbmRleEVudHJ5X3AtPm1fQWNjZXNzICYga0VwbE9iZEFjY1ZhcikgIT0gMCkgeworCQkJLy8gVGhlIGRhdGEgcG9pbnRlciBpcyBzdG9yZWQgaW4gVmFyRW50cnktPnBEYXRhCisJCQlwRGF0YSA9ICgodEVwbE9iZFZhckVudHJ5IE1FTSAqKSBwRGF0YSktPm1fcERhdGE7CisJCX0KKwkJLy8gdGhlIGRlZmF1bHQgcG9pbnRlciBpcyBzdG9yZWQgZm9yIHN0cmluZ3MgaW4gdEVwbE9iZFZTdHJpbmcKKwkJZWxzZSBpZiAoKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykJLyogfHwKKwkJCQkJCQkJCQkgICAocFN1YkluZGV4RW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBVU3RyaW5nKSAgICAqLworCQkJICkgeworCQkJcERhdGEgPQorCQkJICAgICh2b2lkIE1FTSAqKSgodEVwbE9iZFZTdHJpbmcgTUVNICopIHBEYXRhKS0+CisJCQkgICAgbV9wU3RyaW5nOworCQl9IGVsc2UgaWYgKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwT1N0cmluZykgeworCQkJcERhdGEgPQorCQkJICAgICh2b2lkIE1FTSAqKSgodEVwbE9iZE9TdHJpbmcgTUVNICopIHBEYXRhKS0+CisJCQkgICAgbV9wU3RyaW5nOworCQl9CisJfQorCisJcmV0dXJuIHBEYXRhOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldEluZGV4SW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZ2V0cyBhIGluZGV4IGVudHJ5IGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wCisvLyAgICAgICAgICAgICAgcHBPYmRFbnRyeV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRJbmRleEludGVybih0RXBsT2JkSW5pdFBhcmFtIE1FTSAqIHBJbml0UGFyYW1fcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICAgICAgdEVwbE9iZEVudHJ5UHRyICogcHBPYmRFbnRyeV9wKQoreworCisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisJdW5zaWduZWQgaW50IG5Mb29wOworCisJLy8gaWYgdXNlciBPRCBpcyB1c2VkIHRoZW4gb2JqZWt0cyBhbHNvIGhhcyB0byBiZSBzZWFyY2hlZCBpbiB1c2VyIE9ECisJLy8gdGhlcmUgaXMgbGVzcyBjb2RlIG5lZWQgaWYgd2UgZG8gdGhpcyBpbiBhIGxvb3AKKwluTG9vcCA9IDI7CisKKyNlbmRpZgorCisJQVNTRVJUTVNHKHBwT2JkRW50cnlfcCAhPSBOVUxMLAorCQkgICJFcGxPYmRHZXRJbmRleEludGVybigpOiBwb2ludGVyIHRvIGluZGV4IGVudHJ5IGlzIE5VTEwhXG4iKTsKKworCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworCisJLy8gZ2V0IHN0YXJ0IGFkZHJlc3Mgb2YgT0QgcGFydAorCS8vIHN0YXJ0IGFkZHJlc3MgZGVwZW5kcyBvbiBvYmplY3QgaW5kZXggYmVjYXVzZQorCS8vIG9iamVjdCBkaWN0aW9uYXJ5IGlzIGRpdmlkZWQgaW4gMyBwYXJ0cworCWlmICgodWlJbmRleF9wID49IDB4MTAwMCkgJiYgKHVpSW5kZXhfcCA8IDB4MjAwMCkpIHsKKwkJcE9iZEVudHJ5ID0gcEluaXRQYXJhbV9wLT5tX3BQYXJ0OworCX0gZWxzZSBpZiAoKHVpSW5kZXhfcCA+PSAweDIwMDApICYmICh1aUluZGV4X3AgPCAweDYwMDApKSB7CisJCXBPYmRFbnRyeSA9IHBJbml0UGFyYW1fcC0+bV9wTWFudWZhY3R1cmVyUGFydDsKKwl9CisJLy8gaW5kZXggcmFuZ2UgMHhBMDAwIHRvIDB4RkZGRiBpcyByZXNlcnZlZCBmb3IgRFNQLTQwNQorCS8vIERTLTMwMSBkZWZpbmVzIHRoYXQgcmFuZ2UgMHg2MDAwIHRvIDB4OUZGRiAoISEhKSBpcyBzdG9yZWQgaWYgInN0b3JlIiB3YXMgd3JpdHRlbiB0byAweDEwMTAvMy4KKwkvLyBUaGVyZWZvcmUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIE9CRF9JTkNMVURFX0EwMDBfVE9fREVWSUNFX1BBUlQgPSBGQUxTRS4KKwkvLyBCdXQgYSBDQU5vcGVuIEFwcGxpY2F0aW9uIHdoaWNoIGRvZXMgbm90IGltcGxlbWVudCBkeW5hbWljIE9EIG9yIHVzZXItT0QgYnV0IHdhbnRzIHRvIHVzZSBzdGF0aWMgb2JqZXRzIDB4QTAwMC4uLgorCS8vIHNob3VsZCBzZXQgT0JEX0lOQ0xVREVfQTAwMF9UT19ERVZJQ0VfUEFSVCB0byBUUlVFLgorCisjaWYgKEVQTF9PQkRfSU5DTFVERV9BMDAwX1RPX0RFVklDRV9QQVJUID09IEZBTFNFKQorCWVsc2UgaWYgKCh1aUluZGV4X3AgPj0gMHg2MDAwKSAmJiAodWlJbmRleF9wIDwgMHg5RkZGKSkKKyNlbHNlCisJZWxzZSBpZiAoKHVpSW5kZXhfcCA+PSAweDYwMDApICYmICh1aUluZGV4X3AgPCAweEZGRkYpKQorI2VuZGlmCisJeworCQlwT2JkRW50cnkgPSBwSW5pdFBhcmFtX3AtPm1fcERldmljZVBhcnQ7CisJfQorCisjaWYgKGRlZmluZWQgKEVQTF9PQkRfVVNFUl9PRCkgJiYgKEVQTF9PQkRfVVNFUl9PRCAhPSBGQUxTRSkpCisKKwkvLyBpZiBpbmRleCBkb2VzIG5vdCBtYXRjaCBpbiBzdGF0aWMgT0QgdGhlbiBpbmRleCBvbmx5IGhhcyB0byBiZSBzZWFyY2hlZCBpbiB1c2VyIE9ECisJZWxzZSB7CisJCS8vIGJlZ2luIGZyb20gZmlyc3QgZW50cnkgb2YgdXNlciBPRCBwYXJ0CisJCXBPYmRFbnRyeSA9IHBJbml0UGFyYW1fcC0+bV9wVXNlclBhcnQ7CisKKwkJLy8gbm8gdXNlciBPRCBpcyBhdmFpbGFibGUKKwkJaWYgKHBPYmRFbnRyeSA9PSBOVUxMKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gbG9vcCBtdXN0IG9ubHkgcnVuIG9uY2UKKwkJbkxvb3AgPSAxOworCX0KKworCWRvIHsKKworI2Vsc2UKKworCS8vIG5vIHVzZXIgT0QgaXMgYXZhaWxhYmxlCisJLy8gc28gb3RoZXIgb2JqZWN0IGNhbiBiZSBmb3VuZCBpbiBPRAorCWVsc2UgeworCQlSZXQgPSBrRXBsT2JkSWxsZWdhbFBhcnQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKyNlbmRpZgorCisJLy8gbm90ZToKKwkvLyBUaGUgZW5kIG9mIEluZGV4IHRhYmxlIGlzIG1hcmtlZCB3aXRoIG1fdWlJbmRleCA9IDB4RkZGRi4KKwkvLyBJZiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggd0luZGV4X3AgPSAweEZGRkYsIGVudHJ5CisJLy8gc2hvdWxkIG5vdCBiZSBmb3VuZC4gVGhlcmVmb3IgaXQgaXMgaW1wb3J0YW50IHRvIHVzZQorCS8vIHdoaWxle30gaW5zdGVhZCBvZiBkb3t9d2hpbGUgISEhCisKKwkvLyBnZXQgZmlyc3QgaW5kZXggb2YgaW5kZXggdGFibGUKKwl1aUluZGV4ID0gcE9iZEVudHJ5LT5tX3VpSW5kZXg7CisKKwkvLyBzZWFyY2ggSW5kZXggaW4gT0QgcGFydAorCXdoaWxlICh1aUluZGV4ICE9IEVQTF9PQkRfVEFCTEVfSU5ERVhfRU5EKSB7CisJCS8vIGdvIHRvIHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiBpZiBpbmRleCBpcyBmb3VuZAorCQlpZiAodWlJbmRleF9wID09IHVpSW5kZXgpIHsKKwkJCS8vIHdyaXRlIGFkZHJlc3Mgb2YgT0QgZW50cnkgdG8gY2FsbGluZyBmdW5jdGlvbgorCQkJKnBwT2JkRW50cnlfcCA9IHBPYmRFbnRyeTsKKwkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIG9iamVjdHMgYXJlIHNvcnRlZCBpbiBPRAorCQkvLyBpZiB0aGUgY3VycmVudCBpbmRleCBpbiBPRCBpcyBncmVhdGVyIHRoYW4gdGhlIGluZGV4IHdoaWNoIGlzIHRvIHNlYXJjaCB0aGVuIGJyZWFrIGxvb3AKKwkJLy8gaW4gdGhpcyBjYXNlIHVzZXIgT0QgaGFzIHRvIGJlIHNlYXJjaCB0b28KKwkJaWYgKHVpSW5kZXhfcCA8IHVpSW5kZXgpIHsKKwkJCWJyZWFrOworCQl9CisJCS8vIG5leHQgZW50cnkgaW4gaW5kZXggdGFibGUKKwkJcE9iZEVudHJ5Kys7CisKKwkJLy8gZ2V0IG5leHQgaW5kZXggb2YgaW5kZXggdGFibGUKKwkJdWlJbmRleCA9IHBPYmRFbnRyeS0+bV91aUluZGV4OworCX0KKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisJLy8gYmVnaW4gZnJvbSBmaXJzdCBlbnRyeSBvZiB1c2VyIE9EIHBhcnQKKwlwT2JkRW50cnkgPSBwSW5pdFBhcmFtX3AtPm1fcFVzZXJQYXJ0OworCisJLy8gbm8gdXNlciBPRCBpcyBhdmFpbGFibGUKKwlpZiAocE9iZEVudHJ5ID09IE5VTEwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzd2l0Y2ggbmV4dCBsb29wIGZvciB1c2VyIE9ECisJbkxvb3AtLTsKKworfQorCit3aGlsZSAobkxvb3AgPiAwKSA7CisKKyNlbmRpZgorCisgICAgLy8gaW4gdGhpcyBsaW5lIEluZGV4IHdhcyBub3QgZm91bmQKKworRXhpdDoKKworcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRTdWJpbmRleEludGVybigpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgYSBzdWJpbmRleCBlbnRyeSBmcm9tIGEgaW5kZXggZW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcE9iZEVudHJ5X3AKKy8vICAgICAgICAgICAgICBiU3ViSW5kZXhfcAorLy8gICAgICAgICAgICAgIHBwT2JkU3ViRW50cnlfcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4odEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeV9wLAorCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBPYmRTdWJFbnRyeV9wKQoreworCisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeTsKKwl1bnNpZ25lZCBpbnQgblN1YkluZGV4Q291bnQ7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlBU1NFUlRNU0cocE9iZEVudHJ5X3AgIT0gTlVMTCwKKwkJICAiRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4oKTogcG9pbnRlciB0byBpbmRleCBpcyBOVUxMIVxuIik7CisJQVNTRVJUTVNHKHBwT2JkU3ViRW50cnlfcCAhPSBOVUxMLAorCQkgICJFcGxPYmRHZXRTdWJpbmRleEludGVybigpOiBwb2ludGVyIHRvIHN1YmluZGV4IGlzIE5VTEwhXG4iKTsKKworCVJldCA9IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0OworCisJLy8gZ2V0IHN0YXJ0IGFkZHJlc3Mgb2Ygc3ViaW5kZXggdGFibGUgYW5kIGNvdW50IG9mIHN1YmluZGljZXMKKwlwU3ViRW50cnkgPSBwT2JkRW50cnlfcC0+bV9wU3ViSW5kZXg7CisJblN1YkluZGV4Q291bnQgPSBwT2JkRW50cnlfcC0+bV91aUNvdW50OworCUFTU0VSVE1TRygocFN1YkVudHJ5ICE9IE5VTEwpICYmIChuU3ViSW5kZXhDb3VudCA+IDApLCAiT2JkR2V0U3ViaW5kZXhJbnRlcm4oKTogaW52YWxpZCBzdWJpbmRleCB0YWJsZSB3aXRoaW4gaW5kZXggdGFibGUhXG4iKTsJLy8gc2hvdWxkIG5ldmVyIGJlIE5VTEwKKworCS8vIHNlYXJjaCBzdWJpbmRleCBpbiBzdWJpbmRleCB0YWJsZQorCXdoaWxlIChuU3ViSW5kZXhDb3VudCA+IDApIHsKKwkJLy8gY2hlY2sgaWYgYXJyYXkgaXMgZm91bmQKKwkJaWYgKChwU3ViRW50cnktPm1fQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSAhPSAwKSB7CisJCQkvLyBjaGVjayBpZiBzdWJpbmRleCBpcyBpbiByYW5nZQorCQkJaWYgKHVpU3ViSW5kZXhfcCA8IHBPYmRFbnRyeV9wLT5tX3VpQ291bnQpIHsKKwkJCQkvLyB1cGRhdGUgc3ViaW5kZXggbnVtYmVyIChzdWJpbmRleCBlbnRyeSBvZiBhbiBhcnJheSBpcyBhbHdheXMgaW4gUkFNICEhISkKKwkJCQlwU3ViRW50cnktPm1fdWlTdWJJbmRleCA9IHVpU3ViSW5kZXhfcDsKKwkJCQkqcHBPYmRTdWJFbnRyeV9wID0gcFN1YkVudHJ5OworCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJfQorCQkvLyBnbyB0byB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gaWYgc3ViaW5kZXggaXMgZm91bmQKKwkJZWxzZSBpZiAodWlTdWJJbmRleF9wID09IHBTdWJFbnRyeS0+bV91aVN1YkluZGV4KSB7CisJCQkqcHBPYmRTdWJFbnRyeV9wID0gcFN1YkVudHJ5OworCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gb2JqZWN0cyBhcmUgc29ydGVkIGluIE9ECisJCS8vIGlmIHRoZSBjdXJyZW50IHN1YmluZGV4IGluIE9EIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3ViaW5kZXggd2hpY2ggaXMgdG8gc2VhcmNoIHRoZW4gYnJlYWsgbG9vcAorCQkvLyBpbiB0aGlzIGNhc2UgdXNlciBPRCBoYXMgdG8gYmUgc2VhcmNoIHRvbworCQlpZiAodWlTdWJJbmRleF9wIDwgcFN1YkVudHJ5LT5tX3VpU3ViSW5kZXgpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJcFN1YkVudHJ5Kys7CisJCW5TdWJJbmRleENvdW50LS07CisJfQorCisJLy8gaW4gdGhpcyBsaW5lIFN1YkluZGV4IHdhcyBub3QgZm91bnQKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkU2V0U3RvcmVMb2FkT2JqQ2FsbGJhY2soKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBzZXQgYWRkcmVzcyB0byBjYWxsYmFja2Z1bmN0aW9uIGZvciBjb21tYW5kIFN0b3JlIGFuZCBMb2FkCisvLworLy8gUGFyYW1ldGVyczogIGZwQ2FsbGJhY2tfcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsT2JkU2V0U3RvcmVMb2FkT2JqQ2FsbGJhY2soRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgIHRFcGxPYmRTdG9yZUxvYWRPYmpDYWxsYmFjayBmcENhbGxiYWNrX3ApCit7CisKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwkvLyBzZXQgbmV3IGFkZHJlc3Mgb2YgY2FsbGJhY2sgZnVuY3Rpb24KKwlFUExfTUNPX0dMQl9WQVIobV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrKSA9IGZwQ2FsbGJhY2tfcDsKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKKworfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRBY2Nlc3NPZFBhcnRJbnRlcm4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBydW5zIHRocm91Z2ggT0QgYW5kIGV4ZWN1dGVzIGEgam9iCisvLworLy8gUGFyYW1ldGVyczogIEN1cnJlbnRPZFBhcnRfcAorLy8gICAgICAgICAgICAgIHBPYmRFbnR5X3AKKy8vICAgICAgICAgICAgICBEaXJlY3Rpb25fcCAgICAgPSB3aGF0IGlzIHRvIGRvIChsb2FkIHZhbHVlcyBmcm9tIGZsYXNoIG9yIEVFUFJPTSwgc3RvcmUsIC4uLikKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICB0RXBsT2JkUGFydCBDdXJyZW50T2RQYXJ0X3AsCisJCQkJCSAgIHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50eV9wLAorCQkJCQkgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKQoreworCisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleDsKKwl1bnNpZ25lZCBpbnQgblN1YkluZGV4Q291bnQ7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3M7CisJdm9pZCBNRU0gKnBEc3REYXRhOworCXZvaWQgKnBEZWZhdWx0OworCXRFcGxPYmRTaXplIE9ialNpemU7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZENiU3RvcmVQYXJhbSBNRU0gQ2JTdG9yZTsKKwl0RXBsT2JkVmFyRW50cnkgTUVNICpwVmFyRW50cnk7CisKKwlBU1NFUlQocE9iZEVudHlfcCAhPSBOVUxMKTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJlcGFyZSBzdHJ1Y3R1cmUgZm9yIFNUT1JFIFJFU1RPUkUgY2FsbGJhY2sgZnVuY3Rpb24KKwlDYlN0b3JlLm1fYkN1cnJlbnRPZFBhcnQgPSAoQllURSkgQ3VycmVudE9kUGFydF9wOworCUNiU3RvcmUubV9wRGF0YSA9IE5VTEw7CisJQ2JTdG9yZS5tX09ialNpemUgPSAwOworCisJLy8gY29tbWFuZCBvZiBmaXJzdCBhY3Rpb24gZGVwZW5kcyBvbiBkaXJlY3Rpb24gdG8gYWNjZXNzCisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisJaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJMb2FkKSB7CisJCUNiU3RvcmUubV9iQ29tbWFuZCA9IChCWVRFKSBrRXBsT2JkQ29tbU9wZW5SZWFkOworCisJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHByZXZpb3VzIGNvbW1hbmQKKwkJUmV0ID0gRXBsT2JkQ2FsbFN0b3JlQ2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfICYgQ2JTdG9yZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyBzZXQgY29tbWFuZCBmb3IgaW5kZXggYW5kIHN1YmluZGV4IGxvb3AKKwkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tUmVhZE9iajsKKwl9IGVsc2UgaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJTdG9yZSkgeworCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1PcGVuV3JpdGU7CisKKwkJLy8gY2FsbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgcHJldmlvdXMgY29tbWFuZAorCQlSZXQgPSBFcGxPYmRDYWxsU3RvcmVDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8gJiBDYlN0b3JlKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCS8vIHNldCBjb21tYW5kIGZvciBpbmRleCBhbmQgc3ViaW5kZXggbG9vcAorCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1Xcml0ZU9iajsKKwl9CisjZW5kaWYgLy8gKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisKKwkvLyB3ZSBzaG91bGQgbm90IHJlc3RvcmUgdGhlIE9EIHZhbHVlcyBoZXJlCisJLy8gdGhlIG5leHQgTk1UIGNvbW1hbmQgIlJlc2V0IE5vZGUiIG9yICJSZXNldCBDb21tdW5pY2F0aW9uIiByZXNldHMgdGhlIE9EIGRhdGEKKwlpZiAoRGlyZWN0aW9uX3AgIT0ga0VwbE9iZERpclJlc3RvcmUpIHsKKwkJLy8gd2FsayB0aHJvdWdoIE9EIHBhcnQgdGlsbCBlbmQgaXMgZm91bmQKKwkJd2hpbGUgKHBPYmRFbnR5X3AtPm1fdWlJbmRleCAhPSBFUExfT0JEX1RBQkxFX0lOREVYX0VORCkgeworCQkJLy8gZ2V0IGFkZHJlc3MgdG8gc3ViaW5kZXggdGFibGUgYW5kIGNvdW50IG9mIHN1YmluZGljZXMKKwkJCXBTdWJJbmRleCA9IHBPYmRFbnR5X3AtPm1fcFN1YkluZGV4OworCQkJblN1YkluZGV4Q291bnQgPSBwT2JkRW50eV9wLT5tX3VpQ291bnQ7CisJCQlBU1NFUlQoKHBTdWJJbmRleCAhPSBOVUxMKSAmJiAoblN1YkluZGV4Q291bnQgPiAwKSk7CS8vIHNob3VsZCBuZXZlciBiZSBOVUxMCisKKwkJCS8vIHdhbGsgdGhyb3VnaCBzdWJpbmRleCB0YWJsZSB0aWxsIGFsbCBzdWJpbmljZXMgd2VyZSByZXN0b3JlZAorCQkJd2hpbGUgKG5TdWJJbmRleENvdW50ICE9IDApIHsKKwkJCQlBY2Nlc3MgPSAodEVwbE9iZEFjY2VzcykgcFN1YkluZGV4LT5tX0FjY2VzczsKKworCQkJCS8vIGdldCBwb2ludGVyIHRvIGN1cnJlbnQgYW5kIGRlZmF1bHQgZGF0YQorCQkJCXBEZWZhdWx0ID0gRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cihwU3ViSW5kZXgpOworCQkJCXBEc3REYXRhID0gRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cihwU3ViSW5kZXgpOworCisJCQkJLy8gTk9URSAoZm9yIGtFcGxPYmRUeXBWU3RyaW5nKToKKwkJCQkvLyAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5lcyB0aGUgbWF4LiBudW1iZXIgb2YgYnl0ZXMgZm9yIGEKKwkJCQkvLyAgICAgIGN1cnJlbnQgc3RyaW5nLgorCQkJCS8vICAgICAgci5kLjogRm9yIHN0aW5ncyB0aGUgZGVmYXVsdC1zaXplIHdpbGwgYmUgcmVhZCBpbiBvdGhlciBsaW5lcyBmb2xsb3dpbmcgKGtFcGxPYmREaXJJbml0KS4KKwkJCQlPYmpTaXplID0gRXBsT2JkR2V0T2JqZWN0U2l6ZShwU3ViSW5kZXgpOworCisJCQkJLy8gc3dpdGNoIGRpcmVjdGlvbiBvZiBPRCBhY2Nlc3MKKwkJCQlzd2l0Y2ggKERpcmVjdGlvbl9wKSB7CisJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCS8vIFZhckVudHJ5IHN0cnVjdHVyZXMgaGFzIHRvIGJlIGluaXRpYWxpemVkCisJCQkJY2FzZSBrRXBsT2JkRGlySW5pdDoKKworCQkJCQkvLyBJZiBWQVItRmxhZyBpcyBzZXQsIG1fcEN1cnJlbnQgbWVhbnMgbm90IGFkZHJlc3Mgb2YgZGF0YQorCQkJCQkvLyBidXQgYWRkcmVzcyBvZiB0RXBsT2JkVmFyRW50cnkuIEFkZHJlc3Mgb2YgZGF0YSBoYXMgdG8gYmUgZ2V0IGZyb20KKwkJCQkJLy8gdGhpcyBzdHJ1Y3R1cmUuCisJCQkJCWlmICgoQWNjZXNzICYga0VwbE9iZEFjY1ZhcikgIT0gMCkgeworCQkJCQkJRXBsT2JkR2V0VmFyRW50cnkocFN1YkluZGV4LAorCQkJCQkJCQkgICZwVmFyRW50cnkpOworCQkJCQkJRXBsT2JkSW5pdFZhckVudHJ5KHBWYXJFbnRyeSwKKwkJCQkJCQkJICAgcFN1YkluZGV4LT4KKwkJCQkJCQkJICAgbV9UeXBlLAorCQkJCQkJCQkgICBPYmpTaXplKTsKKy8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChBY2Nlc3MgJiBrRXBsT2JkQWNjQXJyYXkpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcGxPYmRJbml0VmFyRW50cnkgKHBTdWJJbmRleC0+bV9wQ3VycmVudCwgcFN1YkluZGV4LT5tX1R5cGUsIE9ialNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcGxPYmRJbml0VmFyRW50cnkgKCh0RXBsT2JkVmFyRW50cnkgTUVNKikgKCgoQllURSBNRU0qKSBwU3ViSW5kZXgtPm1fcEN1cnJlbnQpICsgKHNpemVvZiAodEVwbE9iZFZhckVudHJ5KSAqIHBTdWJJbmRleC0+bV91aVN1YkluZGV4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3ViSW5kZXgtPm1fVHlwZSwgT2JqU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorKi8KKwkJCQkJCS8vIGF0IHRoaXMgdGltZSBubyBhcHBsaWNhdGlvbiB2YXJpYWJsZSBpcyBkZWZpbmVkICEhIQorCQkJCQkJLy8gdGhlcmVmb3JlIGRhdGEgY2FuIG5vdCBiZSBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfSBlbHNlIGlmIChwU3ViSW5kZXgtPm1fVHlwZSA9PQorCQkJCQkJICAga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJCQkJCS8vIElmIHBvaW50ZXIgbV9wQ3VycmVudCBpcyBub3QgZXF1YWwgdG8gTlVMTCB0aGVuIHRoZQorCQkJCQkJLy8gc3RyaW5nIHdhcyBkZWZpbmVkIHdpdGggRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORy4gVGhlIGN1cnJlbnQKKwkJCQkJCS8vIHBvaW50ZXIgcG9pbnRzIHRvIHN0cnVjdCB0RXBsT2JkVlN0cmluZyBsb2NhdGVkIGluIE1FTS4KKwkJCQkJCS8vIFRoZSBlbGVtZW50IHNpemUgaW5jbHVkZXMgdGhlIG1heC4gbnVtYmVyIG9mCisJCQkJCQkvLyBieXRlcy4gVGhlIGVsZW1lbnQgbV9wU3RyaW5nIGluY2x1ZGVzIHRoZSBwb2ludGVyCisJCQkJCQkvLyB0byBzdHJpbmcgaW4gTUVNLiBUaGUgbWVtb3J5IGxvY2F0aW9uIG9mIGRlZmF1bHQgc3RyaW5nCisJCQkJCQkvLyBtdXN0IGJlIGNvcGllZCB0byBtZW1vcnkgbG9jYXRpb24gb2YgY3VycmVudCBzdHJpbmcuCisKKwkJCQkJCXBEc3REYXRhID0KKwkJCQkJCSAgICBwU3ViSW5kZXgtPm1fcEN1cnJlbnQ7CisJCQkJCQlpZiAocERzdERhdGEgIT0gTlVMTCkgeworCQkJCQkJCS8vIDA4LWRlYy0yMDA0OiBjb2RlIG9wdGltaXphdGlvbiAhISEKKwkJCQkJCQkvLyAgICAgICAgICAgICAgZW50cmllcyAoKHRFcGxPYmRWU3RyaW5nRGVmIFJPTSopIHBTdWJJbmRleC0+bV9wRGVmYXVsdCktPm1fcFN0cmluZworCQkJCQkJCS8vICAgICAgICAgICAgICBhbmQgKCh0RXBsT2JkVlN0cmluZ0RlZiBST00qKSBwU3ViSW5kZXgtPm1fcERlZmF1bHQpLT5tX1NpemUgd2VyZSByZWFkCisJCQkJCQkJLy8gICAgICAgICAgICAgIHR3aWNlLiB0aGF0cyBub3QgbmVjZXNzYXJ5IQorCisJCQkJCQkJLy8gRm9yIGNvcHlpbmcgZGF0YSB3ZSBoYXZlIHRvIHNldCB0aGUgZGVzdGluYXRpb24gcG9pbnRlciB0byB0aGUgcmVhbCBSQU0gc3RyaW5nLiBUaGlzCisJCQkJCQkJLy8gcG9pbnRlciB0byBSQU0gc3RyaW5nIGlzIGxvY2F0ZWQgaW4gZGVmYXVsdCBzdHJpbmcgaW5mbyBzdHJ1Y3R1cmUuICh0cmFuc2xhdGVkIHIuZC4pCisJCQkJCQkJcERzdERhdGEgPQorCQkJCQkJCSAgICAodm9pZCBNRU0KKwkJCQkJCQkgICAgICopKCh0RXBsT2JkVlN0cmluZ0RlZiBST00gKikgcFN1YkluZGV4LT5tX3BEZWZhdWx0KS0+bV9wU3RyaW5nOworCQkJCQkJCU9ialNpemUgPQorCQkJCQkJCSAgICAoKHRFcGxPYmRWU3RyaW5nRGVmCisJCQkJCQkJICAgICAgUk9NICopIHBTdWJJbmRleC0+CisJCQkJCQkJICAgICBtX3BEZWZhdWx0KS0+CisJCQkJCQkJICAgIG1fU2l6ZTsKKworCQkJCQkJCSgodEVwbE9iZFZTdHJpbmcgTUVNICopCisJCQkJCQkJIHBTdWJJbmRleC0+CisJCQkJCQkJIG1fcEN1cnJlbnQpLT4KKwkJCQkgICAgIG1fcFN0cmluZyA9IHBEc3REYXRhOworCQkJCQkJCSgodEVwbE9iZFZTdHJpbmcgTUVNICopCisJCQkJCQkJIHBTdWJJbmRleC0+CisJCQkJCQkJIG1fcEN1cnJlbnQpLT5tX1NpemUgPQorCQkJCSAgICAgT2JqU2l6ZTsKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgaWYgKHBTdWJJbmRleC0+bV9UeXBlID09CisJCQkJCQkgICBrRXBsT2JkVHlwT1N0cmluZykgeworCQkJCQkJcERzdERhdGEgPQorCQkJCQkJICAgIHBTdWJJbmRleC0+bV9wQ3VycmVudDsKKwkJCQkJCWlmIChwRHN0RGF0YSAhPSBOVUxMKSB7CisJCQkJCQkJLy8gMDgtZGVjLTIwMDQ6IGNvZGUgb3B0aW1pemF0aW9uICEhIQorCQkJCQkJCS8vICAgICAgICAgICAgICBlbnRyaWVzICgodEVwbE9iZE9TdHJpbmdEZWYgUk9NKikgcFN1YkluZGV4LT5tX3BEZWZhdWx0KS0+bV9wU3RyaW5nCisJCQkJCQkJLy8gICAgICAgICAgICAgIGFuZCAoKHRFcGxPYmRPU3RyaW5nRGVmIFJPTSopIHBTdWJJbmRleC0+bV9wRGVmYXVsdCktPm1fU2l6ZSB3ZXJlIHJlYWQKKwkJCQkJCQkvLyAgICAgICAgICAgICAgdHdpY2UuIHRoYXRzIG5vdCBuZWNlc3NhcnkhCisKKwkJCQkJCQkvLyBGb3IgY29weWluZyBkYXRhIHdlIGhhdmUgdG8gc2V0IHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyIHRvIHRoZSByZWFsIFJBTSBzdHJpbmcuIFRoaXMKKwkJCQkJCQkvLyBwb2ludGVyIHRvIFJBTSBzdHJpbmcgaXMgbG9jYXRlZCBpbiBkZWZhdWx0IHN0cmluZyBpbmZvIHN0cnVjdHVyZS4gKHRyYW5zbGF0ZWQgci5kLikKKwkJCQkJCQlwRHN0RGF0YSA9CisJCQkJCQkJICAgICh2b2lkIE1FTQorCQkJCQkJCSAgICAgKikoKHRFcGxPYmRPU3RyaW5nRGVmIFJPTSAqKSBwU3ViSW5kZXgtPm1fcERlZmF1bHQpLT5tX3BTdHJpbmc7CisJCQkJCQkJT2JqU2l6ZSA9CisJCQkJCQkJICAgICgodEVwbE9iZE9TdHJpbmdEZWYKKwkJCQkJCQkgICAgICBST00gKikgcFN1YkluZGV4LT4KKwkJCQkJCQkgICAgIG1fcERlZmF1bHQpLT4KKwkJCQkJCQkgICAgbV9TaXplOworCisJCQkJCQkJKCh0RXBsT2JkT1N0cmluZyBNRU0gKikKKwkJCQkJCQkgcFN1YkluZGV4LT4KKwkJCQkJCQkgbV9wQ3VycmVudCktPgorCQkJCSAgICAgbV9wU3RyaW5nID0gcERzdERhdGE7CisJCQkJCQkJKCh0RXBsT2JkT1N0cmluZyBNRU0gKikKKwkJCQkJCQkgcFN1YkluZGV4LT4KKwkJCQkJCQkgbV9wQ3VycmVudCktPm1fU2l6ZSA9CisJCQkJICAgICBPYmpTaXplOworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCQkvLyBubyBicmVhayAhISBiZWNhdXNlIGNvcHkgb2YgZGF0YSBoYXMgdG8gZG9uZSB0b28uCisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gYWxsIG9iamVjdHMgaGFzIHRvIGJlIHJlc3RvcmVkIHdpdGggZGVmYXVsdCB2YWx1ZXMKKwkJCQljYXNlIGtFcGxPYmREaXJSZXN0b3JlOgorCisJCQkJCS8vIDA5LWRlYy0yMDA0IHIuZC46IG9wdGltaXphdGlvbiEgdGhlIHNhbWUgY29kZSBmb3Iga0VwbE9iZERpclJlc3RvcmUgYW5kIGtFcGxPYmREaXJMb2FkCisJCQkJCS8vICAgICAgICAgICAgICAgICAgIGlzIHJlcGxhY2VkIHRvIGZ1bmN0aW9uIE9iZENvcHlPYmplY3REYXRhKCkgd2l0aCBhIG5ldyBwYXJhbWV0ZXIuCisKKwkJCQkJLy8gcmVzdG9yZSBvYmplY3QgZGF0YSBmb3IgaW5pdCBwaGFzZQorCQkJCQlFcGxPYmRDb3B5T2JqZWN0RGF0YShwRHN0RGF0YSwgcERlZmF1bHQsCisJCQkJCQkJICAgICBPYmpTaXplLAorCQkJCQkJCSAgICAgcFN1YkluZGV4LT5tX1R5cGUpOworCQkJCQlicmVhazsKKworCQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyBvYmplY3RzIHdpdGggYXR0cmlidXRlIGtFcGxPYmRBY2NTdG9yZSBoYXMgdG8gYmUgbG9hZCBmcm9tIEVFUFJPTSBvciBmcm9tIGEgZmlsZQorCQkJCWNhc2Uga0VwbE9iZERpckxvYWQ6CisKKwkJCQkJLy8gcmVzdG9yZSBvYmplY3QgZGF0YSBmb3IgaW5pdCBwaGFzZQorCQkJCQlFcGxPYmRDb3B5T2JqZWN0RGF0YShwRHN0RGF0YSwgcERlZmF1bHQsCisJCQkJCQkJICAgICBPYmpTaXplLAorCQkJCQkJCSAgICAgcFN1YkluZGV4LT5tX1R5cGUpOworCisJCQkJCS8vIG5vIGJyZWFrICEhIGJlY2F1c2UgY2FsbGJhY2sgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCB0b28uCisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gb2JqZWN0cyB3aXRoIGF0dHJpYnV0ZSBrRXBsT2JkQWNjU3RvcmUgaGFzIHRvIGJlIHN0b3JlZCBpbiBFRVBST00gb3IgaW4gYSBmaWxlCisJCQkJY2FzZSBrRXBsT2JkRGlyU3RvcmU6CisKKwkJCQkJLy8gd2hlbiBhdHRyaWJ1dGUga0VwbE9iZEFjY1N0b3JlIGlzIHNldCwgdGhlbiBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uCisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisJCQkJCWlmICgoQWNjZXNzICYga0VwbE9iZEFjY1N0b3JlKSAhPSAwKSB7CisJCQkJCQkvLyBmaWxsIG91dCBkYXRhIHBvaW50ZXIgYW5kIHNpemUgb2YgZGF0YQorCQkJCQkJQ2JTdG9yZS5tX3BEYXRhID0gcERzdERhdGE7CisJCQkJCQlDYlN0b3JlLm1fT2JqU2l6ZSA9IE9ialNpemU7CisKKwkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHJlYWQgb3Igd3JpdGUgb2JqZWN0CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIE9iZENhbGxTdG9yZUNhbGxiYWNrCisJCQkJCQkgICAgKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXyAmCisJCQkJCQkgICAgIENiU3RvcmUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCQkJCQlicmVhazsKKworCQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyBpZiBPRCBCdWlsZGVyIGtleSBoYXMgdG8gYmUgY2hlY2tlZCBubyBhY2Nlc3MgdG8gc3ViaW5kZXggYW5kIGRhdGEgc2hvdWxkIGJlIG1hZGUKKwkJCQljYXNlIGtFcGxPYmREaXJPQktDaGVjazoKKworCQkJCQkvLyBubyBicmVhayAhISBiZWNhdXNlIHdlIHdhbnQgdG8gYnJlYWsgdGhlIHNlY29uZCBsb29wIHRvby4KKworCQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyB1bmtub3duIERpcmVjdGlvbgorCQkJCWRlZmF1bHQ6CisKKwkJCQkJLy8gc28gd2UgY2FuIGJyZWFrIHRoZSBzZWNvbmQgbG9vcCBlYXJsZXIKKwkJCQkJblN1YkluZGV4Q291bnQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQluU3ViSW5kZXhDb3VudC0tOworCisJCQkJLy8gbmV4dCBzdWJpbmRleCBlbnRyeQorCQkJCWlmICgoQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSA9PSAwKSB7CisJCQkJCXBTdWJJbmRleCsrOworCQkJCQlpZiAoKG5TdWJJbmRleENvdW50ID4gMCkKKwkJCQkJICAgICYmCisJCQkJCSAgICAoKHBTdWJJbmRleC0+CisJCQkJCSAgICAgIG1fQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSAhPQorCQkJCQkgICAgIDApKSB7CisJCQkJCQkvLyBuZXh0IHN1YmluZGV4IHBvaW50cyB0byBhbiBhcnJheQorCQkJCQkJLy8gcmVzZXQgc3ViaW5kZXggbnVtYmVyCisJCQkJCQlwU3ViSW5kZXgtPm1fdWlTdWJJbmRleCA9IDE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoblN1YkluZGV4Q291bnQgPiAwKSB7CisJCQkJCQkvLyBuZXh0IHN1YmluZGV4IHBvaW50cyB0byBhbiBhcnJheQorCQkJCQkJLy8gaW5jcmVtZW50IHN1YmluZGV4IG51bWJlcgorCQkJCQkJcFN1YkluZGV4LT5tX3VpU3ViSW5kZXgrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gbmV4dCBpbmRleCBlbnRyeQorCQkJcE9iZEVudHlfcCsrOworCQl9CisJfQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY29tbWFuZCBvZiBsYXN0IGFjdGlvbiBkZXBlbmRzIG9uIGRpcmVjdGlvbiB0byBhY2Nlc3MKKwlpZiAoRGlyZWN0aW9uX3AgPT0ga0VwbE9iZERpck9CS0NoZWNrKSB7CisKKwkJZ290byBFeGl0OworCX0KKyNpZiAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKKwllbHNlIHsKKwkJaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJMb2FkKSB7CisJCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1DbG9zZVJlYWQ7CisJCX0gZWxzZSBpZiAoRGlyZWN0aW9uX3AgPT0ga0VwbE9iZERpclN0b3JlKSB7CisJCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1DbG9zZVdyaXRlOworCQl9IGVsc2UgaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJSZXN0b3JlKSB7CisJCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1DbGVhcjsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGxhc3QgY29tbWFuZAorCQlSZXQgPSBFcGxPYmRDYWxsU3RvcmVDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8gJiBDYlN0b3JlKTsKKwl9CisjZW5kaWYgLy8gKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisKKy8vICAgIGdvdG8gRXhpdDsKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbE9iZENvcHlPYmplY3REYXRhKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIHBvaW50ZXJzIHRvIG9iamVjdCBkYXRhIGFuZCBjb3B5IHRoZW0gZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcERzdERhdGFfcCAgICAgICAgICAgICAgPSBkZXN0aW5hdGlvbiBwb2ludGVyCisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgICAgICAgICAgPSBzb3VyY2UgcG9pbnRlcgorLy8gICAgICAgICAgICAgIE9ialNpemVfcCAgICAgICAgICAgICAgID0gc2l6ZSBvZiBvYmplY3QKKy8vICAgICAgICAgICAgICBPYmpUeXBlX3AgICAgICAgICAgICAgICA9CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBFcGxPYmRDb3B5T2JqZWN0RGF0YSh2b2lkIE1FTSAqIHBEc3REYXRhX3AsCisJCQkJIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJIHRFcGxPYmRTaXplIE9ialNpemVfcCwgdEVwbE9iZFR5cGUgT2JqVHlwZV9wKQoreworCisJdEVwbE9iZFNpemUgU3RyU2l6ZSA9IDA7CisKKwkvLyBpdCBpcyBhbGxvd2VkIHRvIHNldCBkZWZhdWx0IGFuZCBjdXJyZW50IGFkZHJlc3MgdG8gTlVMTCAobm90aGluZyB0byBjb3B5KQorCWlmIChwRHN0RGF0YV9wICE9IE5VTEwpIHsKKworCQlpZiAoT2JqVHlwZV9wID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCQkvLyBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgcmVhbGx5IG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHN0cmluZy4gVGhlCisJCQkvLyBvYmplY3QgZW50cnkgc2l6ZSBjYW4gYmUgYmlnZ2VyIGFzIHN0cmluZyBzaXplIG9mIGRlZmF1bHQgc3RyaW5nLgorCQkJLy8gVGhlICdcMCctdGVybWluYXRpb24gaXMgaW5jbHVkZWQuIEEgc3RyaW5nIHdpdGggbm8gY2hhcmFjdGVycyBoYXMgYQorCQkJLy8gc2l6ZSBvZiAxLgorCQkJU3RyU2l6ZSA9CisJCQkgICAgRXBsT2JkR2V0U3RyTGVuKCh2b2lkICopcFNyY0RhdGFfcCwgT2JqU2l6ZV9wLAorCQkJCQkgICAga0VwbE9iZFR5cFZTdHJpbmcpOworCisJCQkvLyBJZiB0aGUgc3RyaW5nIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGVudHJ5IHNpemUgaW4gT0QgdGhlbiBvbmx5IGNvcHkKKwkJCS8vIGVudHJ5IHNpemUgLSAxIGFuZCBhbHdheXMgc2V0IHRoZSAnXDAnLXRlcm1pbmF0aW9uLgorCQkJaWYgKFN0clNpemUgPj0gT2JqU2l6ZV9wKSB7CisJCQkJU3RyU2l6ZSA9IE9ialNpemVfcCAtIDE7CisJCQl9CisJCX0KKworCQlpZiAocFNyY0RhdGFfcCAhPSBOVUxMKSB7CisJCQkvLyBjb3B5IGRhdGEKKwkJCUVQTF9NRU1DUFkocERzdERhdGFfcCwgcFNyY0RhdGFfcCwgT2JqU2l6ZV9wKTsKKworCQkJaWYgKE9ialR5cGVfcCA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQkJCSgoY2hhciBNRU0gKilwRHN0RGF0YV9wKVtTdHJTaXplXSA9ICdcMCc7CisJCQl9CisJCX0KKwl9CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkSXNOdW1lcmljYWxJbnRlcm4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjaGVja3MgaWYgYSBlbnRyeSBpcyBudW1lcmljYWwgb3Igbm90CisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyA9IEluc3RhbmNlcG9pbnRlcgorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgPSBJbmRleAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICAgICAgPSBTdWJpbmRleAorLy8gICAgICAgICAgICAgIHBmRW50cnlOdW1lcmljYWxfcCAgPSBwb2ludGVyIHRvIEJPT0wgZm9yIHJldHVybnZhbHVlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBUUlVFIGlmIGVudHJ5IGEgbnVtZXJpY2FsIHZhbHVlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBGQUxTRSBpZiBlbnRyeSBub3QgYSBudW1lcmljYWwgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCA9IEVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRJc051bWVyaWNhbEludGVybih0RXBsT2JkU3ViRW50cnlQdHIgcE9iZFN1YkVudHJ5X3AsCisJCQkJCSAgQk9PTCAqIHBmRW50cnlOdW1lcmljYWxfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IFR5cGUKKwlpZiAoKHBPYmRTdWJFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpCisJICAgIHx8IChwT2JkU3ViRW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBPU3RyaW5nKQorCSAgICB8fCAocE9iZFN1YkVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwRG9tYWluKSkgewkvLyBub3QgbnVtZXJpY2FsIHR5cGVzCisJCSpwZkVudHJ5TnVtZXJpY2FsX3AgPSBGQUxTRTsKKwl9IGVsc2UgewkJLy8gbnVtZXJpY2FsIHR5cGVzCisJCSpwZkVudHJ5TnVtZXJpY2FsX3AgPSBUUlVFOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gdG8gY2xhc3NpZnkgb2JqZWN0IHR5cGUgKGZpeGVkL25vbiBmaXhlZCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbE9iZENhbGxTdG9yZUNhbGxiYWNrKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIGFkZHJlc3MgdG8gY2FsbGJhY2sgZnVuY3Rpb24gYW5kIGNhbGxlcyBpdCB3aGVuIHVuZXF1YWwKKy8vICAgICAgICAgICAgICB0byBOVUxMCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfID0gKGluc3RhbmNlIHBvaW50ZXIpCisvLyAgICAgICAgICAgICAgcENiU3RvcmVQYXJhbV9wICAgICAgICA9IGFkZHJlc3MgdG8gY2FsbGJhY2sgcGFyYW1ldGVycworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkQ2FsbFN0b3JlQ2FsbGJhY2soRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICB0RXBsT2JkQ2JTdG9yZVBhcmFtIE1FTSAqCisJCQkJCSAgcENiU3RvcmVQYXJhbV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCUFTU0VSVChwQ2JTdG9yZVBhcmFtX3AgIT0gTlVMTCk7CisKKwkvLyBjaGVjayBpZiBmdW5jdGlvbiBwb2ludGVyIGlzIE5VTEwgLSBpZiBzbywgbm8gY2FsbGJhY2sgc2hvdWxkIGJlIGNhbGxlZAorCWlmIChFUExfTUNPX0dMQl9WQVIobV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrKSAhPSBOVUxMKSB7CisJCVJldCA9CisJCSAgICBFUExfTUNPX0dMQl9WQVIobV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrKQorCQkgICAgKEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYXygpCisJCSAgICAgcENiU3RvcmVQYXJhbV9wKTsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYgLy8gKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZ2V0cyB0aGUgZGF0YSBwb2ludGVyIG9mIGFuIG9iamVjdC4KKy8vICAgICAgICAgICAgICBJdCByZXR1cm5lcyB0aGUgY3VycmVudCBkYXRhIHBvaW50ZXIuIEJ1dCBpZiBvYmplY3QgaXMgYW4KKy8vICAgICAgICAgICAgICBjb25zdGFudCBvYmplY3QgaXQgcmV0dXJuZXMgdGhlIGRlZmF1bHQgcG9pbnRlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFN1YmluZGV4RW50cnlfcCA9IHBvaW50ZXIgdG8gc3ViaW5kZXggZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZCAqICAgID0gcG9pbnRlciB0byBvYmplY3QgZGF0YQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgKkVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3ApCit7CisKKwl2b2lkICpwRGF0YTsKKwl0RXBsT2JkQWNjZXNzIEFjY2VzczsKKworCUFTU0VSVE1TRyhwU3ViaW5kZXhFbnRyeV9wICE9IE5VTEwsCisJCSAgIkVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4oKTogcG9pbnRlciB0byBTdWJFbnRyeSBub3QgdmFsaWQhXG4iKTsKKworCS8vIHRoZXJlIGFyZSBhcmUgc29tZSBvYmplY3RzIHdob3NlIGRhdGEgcG9pbnRlciBoYXMgdG8gZ2V0IGZyb20gb3RoZXIgc3RydWN0dXJlCisJLy8gZ2V0IGFjY2VzcyB0eXBlIGZvciB0aGlzIG9iamVjdAorCUFjY2VzcyA9IHBTdWJpbmRleEVudHJ5X3AtPm1fQWNjZXNzOworCisJLy8gSWYgb2JqZWN0IGhhcyBhY2Nlc3MgdHlwZSA9IGNvbnN0LAorCS8vIGZvciBkYXRhIG9ubHkgZXhpc3RzIGRlZmF1bHQgdmFsdWVzLgorCWlmICgoQWNjZXNzICYga0VwbE9iZEFjY0NvbnN0KSAhPSAwKSB7CisJCS8vIFRoZSBwb2ludGVyIHRvIGRlZnVhbHQgdmFsdWUgY2FuIGJlIHJlY2VpdmVkIGZyb20gT2JkR2V0T2JqZWN0RGVmYXVsdFB0cigpCisJCXBEYXRhID0gKCh2b2lkICopRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cihwU3ViaW5kZXhFbnRyeV9wKSk7CisJfSBlbHNlIHsKKwkJLy8gVGhlIHBvaW50ZXIgdG8gY3VycmVudCB2YWx1ZSBjYW4gYmUgcmVjZWl2ZWQgZnJvbSBPYmRHZXRPYmplY3RDdXJyZW50UHRyKCkKKwkJcERhdGEgPSAoKHZvaWQgKilFcGxPYmRHZXRPYmplY3RDdXJyZW50UHRyKHBTdWJpbmRleEVudHJ5X3ApKTsKKwl9CisKKwlyZXR1cm4gcERhdGE7CisKK30KKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjYzExZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkLmgKQEAgLTAsMCArMSw0NjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGFwaSBmdW5jdGlvbiBvZiBFcGxPQkQtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZDNworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDIgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisKKyNpZm5kZWYgX0VQTE9CRF9IXworI2RlZmluZSBfRVBMT0JEX0hfCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGRlZmluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBFUExfT0JEX1RBQkxFX0lOREVYX0VORCAgICAgMHhGRkZGCisKKy8vIGZvciB0aGUgdXNhZ2Ugb2YgQk9PTEVBTiBpbiBPRAorI2RlZmluZSBPQkRfVFJVRSAgICAweDAxCisjZGVmaW5lIE9CRF9GQUxTRSAgIDB4MDAKKworLy8gZGVmYXVsdCBPRCBpbmRleCBmb3IgTm9kZSBpZAorI2RlZmluZSBFUExfT0JEX05PREVfSURfSU5ERVggICAgICAgICAgICAgICAweDFGOTMKKy8vIGRlZmF1bHQgc3ViaW5kZXggZm9yIE5vZGVJZCBpbiBPRAorI2RlZmluZSBFUExfT0JEX05PREVfSURfU1VCSU5ERVggICAgICAgICAgICAweDAxCisvLyBkZWZhdWx0IHN1YmluZGV4IGZvciBOb2RlSURCeUhXX0JPT0wKKyNkZWZpbmUgRVBMX09CRF9OT0RFX0lEX0hXQk9PTF9TVUJJTkRFWCAgICAgMHgwMgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBlbnVtcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBkaXJlY3Rpb25zIGZvciBhY2Nlc3MgdG8gb2JqZWN0IGRpY3Rpb25hcnkKK3R5cGVkZWYgZW51bSB7CisJa0VwbE9iZERpckluaXQgPSAweDAwLAkvLyBpbml0aWFsaXNpbmcgYWZ0ZXIgcG93ZXIgb24KKwlrRXBsT2JkRGlyU3RvcmUgPSAweDAxLAkvLyBzdG9yZSBhbGwgb2JqZWN0IHZhbHVlcyB0byBub24gdm9sYXRpbGUgbWVtb3J5CisJa0VwbE9iZERpckxvYWQgPSAweDAyLAkvLyBsb2FkIGFsbCBvYmplY3QgdmFsdWVzIGZyb20gbm9uIHZvbGF0aWxlIG1lbW9yeQorCWtFcGxPYmREaXJSZXN0b3JlID0gMHgwMywJLy8gZGVsZXRlcyBub24gdm9sYXRpbGUgbWVtb3J5IChyZXN0b3JlKQorCWtFcGxPYmREaXJPQktDaGVjayA9IDB4RkYJLy8gcmVzZXJ2ZWQKK30gdEVwbE9iZERpcjsKKworLy8gY29tbWFuZHMgZm9yIHN0b3JlCit0eXBlZGVmIGVudW0geworCWtFcGxPYmRDb21tTm90aGluZyA9IDB4MDAsCisJa0VwbE9iZENvbW1PcGVuV3JpdGUgPSAweDAxLAorCWtFcGxPYmRDb21tV3JpdGVPYmogPSAweDAyLAorCWtFcGxPYmRDb21tQ2xvc2VXcml0ZSA9IDB4MDMsCisJa0VwbE9iZENvbW1PcGVuUmVhZCA9IDB4MDQsCisJa0VwbE9iZENvbW1SZWFkT2JqID0gMHgwNSwKKwlrRXBsT2JkQ29tbUNsb3NlUmVhZCA9IDB4MDYsCisJa0VwbE9iZENvbW1DbGVhciA9IDB4MDcsCisJa0VwbE9iZENvbW1Vbmtub3duID0gMHhGRgorfSB0RXBsT2JkQ29tbWFuZDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZXZlbnRzIG9mIG9iamVjdCBjYWxsYmFjayBmdW5jdGlvbgordHlwZWRlZiBlbnVtIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQXJnIHBvaW50cyB0bworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJa0VwbE9iZEV2Q2hlY2tFeGlzdCA9IDB4MDYsCS8vIGNoZWNraW5nIGlmIG9iamVjdCBkb2VzIGV4aXN0IChyZWFkaW5nIGFuZCB3cml0aW5nKSAgICBOVUxMCisJa0VwbE9iZEV2UHJlUmVhZCA9IDB4MDAsCS8vIGJlZm9yZSByZWFkaW5nIGFuIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZGF0YSBidWZmZXIgaW4gT0QKKwlrRXBsT2JkRXZQb3N0UmVhZCA9IDB4MDEsCS8vIGFmdGVyIHJlYWRpbmcgYW4gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlciBmcm9tIGNhbGxlcgorCWtFcGxPYmRFdldyU3RyaW5nRG9tYWluID0gMHgwNywJLy8gZXZlbnQgZm9yIGNoYW5naW5nIHN0cmluZy9kb21haW4gZGF0YSBwb2ludGVyIG9yIHNpemUgIHN0cnVjdCB0RXBsT2JkVlN0cmluZ0RvbWFpbiBpbiBSQU0KKwlrRXBsT2JkRXZJbml0V3JpdGUgPSAweDA0LAkvLyBpbml0aWFsaXplcyB3cml0aW5nIGFuIG9iamVjdCAoY2hlY2tpbmcgb2JqZWN0IHNpemUpICAgc2l6ZSBvZiBvYmplY3QgaW4gT0QgKHRFcGxPYmRTaXplKQorCWtFcGxPYmRFdlByZVdyaXRlID0gMHgwMiwJLy8gYmVmb3JlIHdyaXRpbmcgYW4gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBkYXRhIGJ1ZmZlciBmcm9tIGNhbGxlcgorCWtFcGxPYmRFdlBvc3RXcml0ZSA9IDB4MDMsCS8vIGFmdGVyIHdyaXRpbmcgYW4gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlciBpbiBPRAorLy8gICAga0VwbE9iZEV2QWJvcnRTZG8gICAgICAgICAgICAgID0gMHgwNSAgICAgLy8gYWZ0ZXIgYW4gYWJvcnQgb2YgYW4gU0RPIHRyYW5zZmVyCisKK30gdEVwbE9iZEV2ZW50OworCisvLyBwYXJ0IG9mIE9EIChiaXQgb3JpZW50ZWQpCit0eXBlZGVmIHVuc2lnbmVkIGludCB0RXBsT2JkUGFydDsKKworI2RlZmluZSBrRXBsT2JkUGFydE5vICAgICAgICAgIDB4MDAJLy8gbm90aGluZworI2RlZmluZSBrRXBsT2JkUGFydEdlbiAgICAgICAgIDB4MDEJLy8gIHBhcnQgICAgICAoMHgxMDAwIC0gMHgxRkZGKQorI2RlZmluZSBrRXBsT2JkUGFydE1hbiAgICAgICAgIDB4MDIJLy8gbWFudWZhY3R1cmVyIHBhcnQgKDB4MjAwMCAtIDB4NUZGRikKKyNkZWZpbmUga0VwbE9iZFBhcnREZXYgICAgICAgICAweDA0CS8vIGRldmljZSBwYXJ0ICAgICAgICgweDYwMDAgLSAweDlGRkYpCisjZGVmaW5lIGtFcGxPYmRQYXJ0VXNyICAgICAgICAgMHgwOAkvLyBkeW5hbWljIHBhcnQgZS5nLiBmb3IgSUNFNjExMzEtMworCisvLyBjb21iaW5hdGlvbnMKKyNkZWZpbmUga0VwbE9iZFBhcnRBcHAgICAgICAgICAoICAgICAgICAgICAgICBrRXBsT2JkUGFydE1hbiB8IGtFcGxPYmRQYXJ0RGV2IHwga0VwbE9iZFBhcnRVc3IpCS8vIG1hbnVmYWN0dXJlciBhbmQgZGV2aWNlIHBhcnQgKDB4MjAwMCAtIDB4OUZGRikgYW5kIHVzZXIgT0QKKyNkZWZpbmUga0VwbE9iZFBhcnRBbGwgICAgICAgICAoa0VwbE9iZFBhcnRHZW4gfCBrRXBsT2JkUGFydE1hbiB8IGtFcGxPYmRQYXJ0RGV2IHwga0VwbE9iZFBhcnRVc3IpCS8vIHdob2xlIE9ECisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGFjY2VzcyB0eXBlcyBmb3Igb2JqZWN0cworLy8gbXVzdCBiZSBhIGRpZmluZSBiZWNhdXNlIGJpdC1mbGFncwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdEVwbE9iZEFjY2VzczsKKworI2RlZmluZSBrRXBsT2JkQWNjUmVhZCAgICAgICAgIDB4MDEJLy8gb2JqZWN0IGNhbiBiZSByZWFkCisjZGVmaW5lIGtFcGxPYmRBY2NXcml0ZSAgICAgICAgMHgwMgkvLyBvYmplY3QgY2FuIGJlIHdyaXR0ZW4KKyNkZWZpbmUga0VwbE9iZEFjY0NvbnN0ICAgICAgICAweDA0CS8vIG9iamVjdCBjb250YWlucyBhIGNvbnN0YW50IHZhbHVlCisjZGVmaW5lIGtFcGxPYmRBY2NQZG8gICAgICAgICAgMHgwOAkvLyBvYmplY3QgY2FuIGJlIG1hcHBlZCBpbiBhIFBETworI2RlZmluZSBrRXBsT2JkQWNjQXJyYXkgICAgICAgIDB4MTAJLy8gb2JqZWN0IGNvbnRhaW5zIGFuIGFycmF5IG9mIG51bWVyaWNhbCB2YWx1ZXMKKyNkZWZpbmUga0VwbE9iZEFjY1JhbmdlICAgICAgICAweDIwCS8vIG9iamVjdCBjb250YWlucyBsb3dlciBhbmQgdXBwZXIgbGltaXQKKyNkZWZpbmUga0VwbE9iZEFjY1ZhciAgICAgICAgICAweDQwCS8vIG9iamVjdCBkYXRhIGlzIHBsYWNlZCBpbiBhcHBsaWNhdGlvbgorI2RlZmluZSBrRXBsT2JkQWNjU3RvcmUgICAgICAgIDB4ODAJLy8gb2JqZWN0IGRhdGEgY2FuIGJlIHN0b3JlZCB0byBub24gdm9sYXRpbGUgbWVtb3J5CisKKy8vIGNvbWJpbmF0aW9ucyAobm90IGFsbCBjb21iaW5hdGlvbnMgYXJlIHJlcXVpcmVkKQorI2RlZmluZSBrRXBsT2JkQWNjUiAgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVyAgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjUlcgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjQ1IgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NDb25zdCB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjR1IgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjR1cgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjR1JXICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVlIgICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVlcgICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjVlJXICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVlBSICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVlBXICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjVlBSVyAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVkdSICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVkdXICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjVkdSVyAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVkdQUiAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVkdQVyAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjVkdQUlcgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1IgICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1cgICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1JXICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU0NSICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NDb25zdCB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU0dSICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU0dXICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU0dSVyAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZSICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZXICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZSVyAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZQUiAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZQVyAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZQUlcgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUiAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHVyAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUlcgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUFIgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUFcgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUFJXICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorCit0eXBlZGVmIHVuc2lnbmVkIGludCB0RXBsT2JkU2l6ZTsJLy8gRm9yIGFsbCBvYmplY3RzIGFzIG9iamVjdHMgc2l6ZSBhcmUgdXNlZCBhbiB1bnNpZ25lZCBpbnQuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzIGZvciBkYXRhIHR5cGVzIGRlZmluZWQgaW4gRFMzMDEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdHlwZXMgb2Ygb2JqZWN0cyBpbiBvYmplY3QgZGljdGlvbmFyeQorLy8gRFMtMzAxIGRlZmluZXMgdGhlc2UgdHlwZXMgYXMgV09SRAordHlwZWRlZiBlbnVtIHsKKy8vIHR5cGVzIHdoaWNoIGFyZSBhbHdheXMgc3VwcG9ydGVkCisJa0VwbE9iZFR5cEJvb2wgPSAweDAwMDEsCisKKwlrRXBsT2JkVHlwSW50OCA9IDB4MDAwMiwKKwlrRXBsT2JkVHlwSW50MTYgPSAweDAwMDMsCisJa0VwbE9iZFR5cEludDMyID0gMHgwMDA0LAorCWtFcGxPYmRUeXBVSW50OCA9IDB4MDAwNSwKKwlrRXBsT2JkVHlwVUludDE2ID0gMHgwMDA2LAorCWtFcGxPYmRUeXBVSW50MzIgPSAweDAwMDcsCisJa0VwbE9iZFR5cFJlYWwzMiA9IDB4MDAwOCwKKwlrRXBsT2JkVHlwVlN0cmluZyA9IDB4MDAwOSwKKwlrRXBsT2JkVHlwT1N0cmluZyA9IDB4MDAwQSwKKwlrRXBsT2JkVHlwRG9tYWluID0gMHgwMDBGLAorCisJa0VwbE9iZFR5cEludDI0ID0gMHgwMDEwLAorCWtFcGxPYmRUeXBVSW50MjQgPSAweDAwMTYsCisKKwlrRXBsT2JkVHlwUmVhbDY0ID0gMHgwMDExLAorCWtFcGxPYmRUeXBJbnQ0MCA9IDB4MDAxMiwKKwlrRXBsT2JkVHlwSW50NDggPSAweDAwMTMsCisJa0VwbE9iZFR5cEludDU2ID0gMHgwMDE0LAorCWtFcGxPYmRUeXBJbnQ2NCA9IDB4MDAxNSwKKwlrRXBsT2JkVHlwVUludDQwID0gMHgwMDE4LAorCWtFcGxPYmRUeXBVSW50NDggPSAweDAwMTksCisJa0VwbE9iZFR5cFVJbnQ1NiA9IDB4MDAxQSwKKwlrRXBsT2JkVHlwVUludDY0ID0gMHgwMDFCLAorCWtFcGxPYmRUeXBUaW1lT2ZEYXkgPSAweDAwMEMsCisJa0VwbE9iZFR5cFRpbWVEaWZmID0gMHgwMDBECit9IHRFcGxPYmRUeXBlOworLy8gb3RoZXIgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzIGZvciBkYXRhIHR5cGVzIGRlZmluZWQgaW4gRFMzMDEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRFcGxPYmRCb29sZWFuOwkvLyAwMDAxCit0eXBlZGVmIHNpZ25lZCBjaGFyIHRFcGxPYmRJbnRlZ2VyODsJLy8gMDAwMgordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IHRFcGxPYmRJbnRlZ2VyMTY7CS8vIDAwMDMKK3R5cGVkZWYgc2lnbmVkIGxvbmcgdEVwbE9iZEludGVnZXIzMjsJLy8gMDAwNAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRFcGxPYmRVbnNpZ25lZDg7CS8vIDAwMDUKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHRFcGxPYmRVbnNpZ25lZDE2OwkvLyAwMDA2Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdEVwbE9iZFVuc2lnbmVkMzI7CS8vIDAwMDcKK3R5cGVkZWYgZmxvYXQgdEVwbE9iZFJlYWwzMjsJLy8gMDAwOAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRFcGxPYmREb21haW47CS8vIDAwMEYKK3R5cGVkZWYgc2lnbmVkIGxvbmcgdEVwbE9iZEludGVnZXIyNDsJLy8gMDAxMAordHlwZWRlZiB1bnNpZ25lZCBsb25nIHRFcGxPYmRVbnNpZ25lZDI0OwkvLyAwMDE2CisKK3R5cGVkZWYgc2lnbmVkIFFXT1JEIHRFcGxPYmRJbnRlZ2VyNDA7CS8vIDAwMTIKK3R5cGVkZWYgc2lnbmVkIFFXT1JEIHRFcGxPYmRJbnRlZ2VyNDg7CS8vIDAwMTMKK3R5cGVkZWYgc2lnbmVkIFFXT1JEIHRFcGxPYmRJbnRlZ2VyNTY7CS8vIDAwMTQKK3R5cGVkZWYgc2lnbmVkIFFXT1JEIHRFcGxPYmRJbnRlZ2VyNjQ7CS8vIDAwMTUKKwordHlwZWRlZiB1bnNpZ25lZCBRV09SRCB0RXBsT2JkVW5zaWduZWQ0MDsJLy8gMDAxOAordHlwZWRlZiB1bnNpZ25lZCBRV09SRCB0RXBsT2JkVW5zaWduZWQ0ODsJLy8gMDAxOQordHlwZWRlZiB1bnNpZ25lZCBRV09SRCB0RXBsT2JkVW5zaWduZWQ1NjsJLy8gMDAxQQordHlwZWRlZiB1bnNpZ25lZCBRV09SRCB0RXBsT2JkVW5zaWduZWQ2NDsJLy8gMDAxQgorCit0eXBlZGVmIGRvdWJsZSB0RXBsT2JkUmVhbDY0OwkvLyAwMDExCisKK3R5cGVkZWYgdFRpbWVPZkRheSB0RXBsT2JkVGltZU9mRGF5OwkvLyAwMDBDCit0eXBlZGVmIHRUaW1lT2ZEYXkgdEVwbE9iZFRpbWVEaWZmZXJlbmNlOwkvLyAwMDBECisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnVjdHVyIGZvciBkZWZpbmluZyBhIHZhcmlhYmxlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIGVudW0geworCWtWYXJWYWxpZFNpemUgPSAweDAxLAorCWtWYXJWYWxpZERhdGEgPSAweDAyLAorLy8gICAga1ZhclZhbGlkQ2FsbGJhY2sgICAgICAgPSAweDA0LAorLy8gICAga1ZhclZhbGlkQXJnICAgICAgICAgICAgPSAweDA4LAorCisJa1ZhclZhbGlkQWxsID0gMHgwMwkvLyBjdXJyZW50bHkgb25seSBzaXplIGFuZCBkYXRhIGFyZSBpbXBsZW1lbnRlZCBhbmQgdXNlZAorfSB0RXBsVmFyUGFyYW1WYWxpZDsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyBST00gKiB0RXBsVmFyQ2FsbGJhY2spIChDQ01fREVDTF9JTlNUQU5DRV9IRExfCisJCQkJCQkgIHZvaWQgKnBQYXJhbV9wKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxWYXJQYXJhbVZhbGlkIG1fVmFsaWRGbGFnOworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJpbmRleDsKKwl0RXBsT2JkU2l6ZSBtX1NpemU7CisJdm9pZCBNRU0gKm1fcERhdGE7CisvLyAgICB0RXBsVmFyQ2FsbGJhY2sgICAgIG1fZnBDYWxsYmFjazsKKy8vICAgIHZvaWQgKiAgICAgICBtX3BBcmc7CisKK30gdEVwbFZhclBhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCBNRU0gKm1fcERhdGE7CisJdEVwbE9iZFNpemUgbV9TaXplOworLyoKKyAgICAjaWYgKEVQTF9QRE9fVVNFX1NUQVRJQ19NQVBQSU5HID09IEZBTFNFKQorICAgICAgICB0RXBsVmFyQ2FsbGJhY2sgICAgbV9mcENhbGxiYWNrOworICAgICAgICB2b2lkICogICBtX3BBcmc7CisgICAgI2VuZGlmCisqLworfSB0RXBsT2JkVmFyRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkU2l6ZSBtX1NpemU7CisJQllURSAqbV9wU3RyaW5nOworCit9IHRFcGxPYmRPU3RyaW5nOwkJLy8gMDAwQworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZFNpemUgbV9TaXplOworCWNoYXIgKm1fcFN0cmluZzsKK30gdEVwbE9iZFZTdHJpbmc7CQkvLyAwMDBECisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkU2l6ZSBtX1NpemU7CisJY2hhciAqbV9wRGVmU3RyaW5nOwkvLyAkJCQgZC5rLiBpdCBpcyB1bnVzZWQsIHNvIHdlIGNvdWxkIGRlbGV0ZSBpdAorCWNoYXIgKm1fcFN0cmluZzsKKworfSB0RXBsT2JkVlN0cmluZ0RlZjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRTaXplIG1fU2l6ZTsKKwlCWVRFICptX3BEZWZTdHJpbmc7CS8vICQkJCBkLmsuIGl0IGlzIHVudXNlZCwgc28gd2UgY291bGQgZGVsZXRlIGl0CisJQllURSAqbV9wU3RyaW5nOworCit9IHRFcGxPYmRPU3RyaW5nRGVmOworCisvL3IuZC4gcGFyYW1ldGVyIHN0cnVjdCBmb3IgY2hhbmdpbmcgb2JqZWN0IHNpemUgYW5kL29yIHBvaW50ZXIgdG8gZGF0YSBvZiBTdHJpbmdzIG9yIERvbWFpbnMKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkU2l6ZSBtX0Rvd25sb2FkU2l6ZTsJLy8gZG93bmxvYWQgc2l6ZSBmcm9tIFNETyBvciBBUFAKKwl0RXBsT2JkU2l6ZSBtX09ialNpemU7CS8vIGN1cnJlbnQgb2JqZWN0IHNpemUgZnJvbSBPRCAtIHNob3VsZCBiZSBjaGFuZ2VkIGZyb20gY2FsbGJhY2sgZnVuY3Rpb24KKwl2b2lkICptX3BEYXRhOwkJLy8gY3VycmVudCBvYmplY3QgcHRyICBmcm9tIE9EIC0gc2hvdWxkIGJlIGNoYW5nZWQgZnJvbSBjYWxsYmFjayBmdW5jdGlvbgorCit9IHRFcGxPYmRWU3RyaW5nRG9tYWluOwkJLy8gMDAwRAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyB0eXBlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc3ViaW5kZXhzdHJ1Y3QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ2hhbmdlIG5vdCB0aGUgb3JkZXIgZm9yIHRoaXMgc3RydWN0ISEhCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlTdWJJbmRleDsKKwl0RXBsT2JkVHlwZSBtX1R5cGU7CisJdEVwbE9iZEFjY2VzcyBtX0FjY2VzczsKKwl2b2lkICptX3BEZWZhdWx0OworCXZvaWQgTUVNICptX3BDdXJyZW50OwkvLyBwb2ludHMgYWx3YXlzIHRvIFJBTQorCit9IHRFcGxPYmRTdWJFbnRyeTsKKworLy8gci5kLjogaGFzIGFsd2F5cyB0byBiZSAgYmVjYXVzZSBuZXcgT0JELU1hY3JvcyBmb3IgYXJyYXlzCit0eXBlZGVmIHRFcGxPYmRTdWJFbnRyeSAqdEVwbE9iZFN1YkVudHJ5UHRyOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3Igb2JqZGljdGlvbmFyeSBtb2R1bAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBwYXJhbWV0ZXJzIGZvciBjYWxsYmFjayBmdW5jdGlvbgordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRFdmVudCBtX09iZEV2ZW50OworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJJbmRleDsKKwl2b2lkICptX3BBcmc7CisJRFdPUkQgbV9kd0Fib3J0Q29kZTsKKworfSB0RXBsT2JkQ2JQYXJhbTsKKworLy8gZGVmaW5lIHR5cGUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uOiBwUGFyYW1fcCBwb2ludHMgdG8gdEVwbE9iZENiUGFyYW0KK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgUk9NICogdEVwbE9iZENhbGxiYWNrKSAoQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXworCQkJCQkJICB0RXBsT2JkQ2JQYXJhbSBNRU0gKgorCQkJCQkJICBwUGFyYW1fcCk7CisKKy8vIGRvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIGZvciB0aGlzIHN0cnVjdCEhIQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlJbmRleDsKKwl0RXBsT2JkU3ViRW50cnlQdHIgbV9wU3ViSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlDb3VudDsKKwl0RXBsT2JkQ2FsbGJhY2sgbV9mcENhbGxiYWNrOwkvLyBmdW5jdGlvbiBpcyBjYWxsZWQgYmFjayBpZiBvYmplY3QgYWNjZXNzCisKK30gdEVwbE9iZEVudHJ5OworCisvLyBhbGx3YXlzICBwb2ludGVyCit0eXBlZGVmIHRFcGxPYmRFbnRyeSAqdEVwbE9iZEVudHJ5UHRyOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ1Y3R1ciB0byBpbml0aWFsaXplIE9CRCBtb2R1bGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRFbnRyeVB0ciBtX3BQYXJ0OworCXRFcGxPYmRFbnRyeVB0ciBtX3BNYW51ZmFjdHVyZXJQYXJ0OworCXRFcGxPYmRFbnRyeVB0ciBtX3BEZXZpY2VQYXJ0OworCisjaWYgKGRlZmluZWQgKEVQTF9PQkRfVVNFUl9PRCkgJiYgKEVQTF9PQkRfVVNFUl9PRCAhPSBGQUxTRSkpCisKKwl0RXBsT2JkRW50cnlQdHIgbV9wVXNlclBhcnQ7CisKKyNlbmRpZgorCit9IHRFcGxPYmRJbml0UGFyYW07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnVjdHVyIGZvciBwYXJhbWV0ZXJzIG9mIFNUT1JFIFJFU1RPUkUgY29tbWFuZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZENvbW1hbmQgbV9iQ29tbWFuZDsKKwl0RXBsT2JkUGFydCBtX2JDdXJyZW50T2RQYXJ0OworCXZvaWQgTUVNICptX3BEYXRhOworCXRFcGxPYmRTaXplIG1fT2JqU2l6ZTsKKworfSB0RXBsT2JkQ2JTdG9yZVBhcmFtOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDIFJPTSAqIHRJbml0VGFiRW50cnlDYWxsYmFjaykgKHZvaWQgTUVNICogcFRhYkVudHJ5X3AsCisJCQkJCQkJdW5zaWduZWQgaW50CisJCQkJCQkJdWlPYmpJbmRleF9wKTsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyBST00gKgorCQkgICB0RXBsT2JkU3RvcmVMb2FkT2JqQ2FsbGJhY2spIChDQ01fREVDTF9JTlNUQU5DRV9IRExfCisJCQkJCQkgdEVwbE9iZENiU3RvcmVQYXJhbSBNRU0gKgorCQkJCQkJIHBDYlN0b3JlUGFyYW1fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRoaXMgc3R1Y3R1cmUgaXMgdXNlZCBmb3IgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gT2JkSW5pdE1vZHVsZVRhYigpCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlMb3dlck9iakluZGV4OwkvLyBsb3dlciBsaW1pdCBvZiBPYmpJbmRleAorCXVuc2lnbmVkIGludCBtX3VpVXBwZXJPYmpJbmRleDsJLy8gdXBwZXIgbGltaXQgb2YgT2JqSW5kZXgKKwl0SW5pdFRhYkVudHJ5Q2FsbGJhY2sgbV9mcEluaXRUYWJFbnRyeTsJLy8gd2lsbCBiZSBjYWxsZWQgaWYgT2JqSW5kZXggd2FzIGZvdW5kCisJdm9pZCBNRU0gKm1fcFRhYkJhc2U7CS8vIGJhc2UgYWRkcmVzcyBvZiB0YWJsZQorCXVuc2lnbmVkIGludCBtX3VpRW50cnlTaXplOwkvLyBzaXplIG9mIHRhYmxlIGVudHJ5ICAgICAgLy8gMjUtZmViLTIwMDUgci5kLjogZXhwYW5zaW9uIGZyb20gQllURSB0byBXT1JEIG5lY2Vzc2FyeSBmb3IgUERPIGJpdCBtYXBwaW5nCisJdW5zaWduZWQgaW50IG1fdWlNYXhFbnRyaWVzOwkvLyBtYXguIHRhYmVsIGVudHJpZXMKKworfSB0RXBsT2JkTW9kdWxUYWJQYXJhbTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZW51bSBmb3IgZnVuY3Rpb24gRXBsT2JkU2V0Tm9kZUlkCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgZW51bSB7CisJa0VwbE9iZE5vZGVJZFVua25vd24gPSAweDAwLAkvLyB1bmtub3duIGhvdyB0aGUgbm9kZSBpZCB3YXMgc2V0CisJa0VwbE9iZE5vZGVJZFNvZnR3YXJlID0gMHgwMSwJLy8gbm9kZSBpZCBzZXQgYnkgc29mdHdhcmUKKwlrRXBsT2JkTm9kZUlkSGFyZHdhcmUgPSAweDAyCS8vIG5vZGUgaWQgc2V0IGJ5IGhhcmR3YXJlCit9IHRFcGxPYmROb2RlSWRUeXBlOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBnbG9iYWwgdmFyaWFibGVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHB1YmxpYyBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE9CRF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmRNYWNyby5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmRNYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjJhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZE1hY3JvLmgKQEAgLTAsMCArMSwzNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIG1hY3JvcyBvZiBFcGxPQkQtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkTWFjcm8uaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA1IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgIC0+IGJhc2VkIG9uIENBTm9wZW4gT2JkTWFjcm8uaAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIGRlZmluZWQgKEVQTF9PQkRfREVGSU5FX01BQ1JPKQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgZGVmaW5lZCAoRVBMX09CRF9DUkVBVEVfUk9NX0RBVEEpCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9ST01fREFUQSIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICBEV09SRCAgZHdPYmRfT0JLX2cgPSAweDAwMDA7CisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9ERVZJQ0UoKQorI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICAgICBzdGF0aWMgIHRFcGxPYmRVbnNpZ25lZDggICAgeERlZiMjaW5kIyNfMHgwMF9nID0gKGNudCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXzB4MDFfZyA9IChkZWYpOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICBzdGF0aWMgIHRFcGxPYmRVbnNpZ25lZDggICAgeERlZiMjaW5kIyNfMHgwMF9nID0gKGNudCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXzB4MDFfZyA9IChkZWYpOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkgICBzdGF0aWMgIHRFcGxPYmRVbnNpZ25lZDggICAgeERlZiMjaW5kIyNfMHgwMF9nID0gKGNudCk7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgICAgICBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXyMjc3ViIyNfZyAgICAgICAgPSB2YWw7CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkgICAgIHN0YXRpYyAgZHR5cCAgeERlZiMjaW5kIyNfIyNzdWIjI19nWzNdICAgICA9IHt2YWwsbG93LGhpZ2h9OworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplLHZhbCkgICAgICAgICAgICAgICAgIHN0YXRpYyBjaGFyICBNRU0gc3pDdXIjI2luZCMjXyMjc3ViIyNfZ1tzaXplKzFdOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkVlN0cmluZ0RlZiAgeERlZiMjaW5kIyNfIyNzdWIjI19nID0ge3NpemUsIHZhbCwgc3pDdXIjI2luZCMjXyMjc3ViIyNfZ307CisKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUpICAgICAgICAgICAgICAgICAgICAgc3RhdGljICBCWVRFICBNRU0gYkN1ciMjaW5kIyNfIyNzdWIjI19nW3NpemVdOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkT1N0cmluZ0RlZiAgeERlZiMjaW5kIyNfIyNzdWIjI19nID0ge3NpemUsICgoQllURSopIiIpLCBiQ3VyIyNpbmQjI18jI3N1YiMjX2d9OworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkgICAgICAgICAgICAgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18jI3N1YiMjX2cgICAgICAgID0gdmFsOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKSBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXyMjc3ViIyNfZ1szXSAgICAgPSB7dmFsLGxvdyxoaWdofTsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9SQU1fREFUQSkKKworLy8gICAgICAgICNwcmFnbWEgbWVzc2FnZSAoIkVQTF9PQkRfQ1JFQVRFX1JBTV9EQVRBIikKKworI2RlZmluZSBFUExfT0JEX0JFR0lOKCkKKyNkZWZpbmUgRVBMX09CRF9FTkQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpCisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0oaW5kLGNudCxjYWxsKQorI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgICAgIHN0YXRpYyBkdHlwICAgICAgICAgTUVNIGF4Q3VyIyNpbmQjI19nW2NudF07CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgIHN0YXRpYyB0RXBsT2JkVmFyRW50cnkgTUVNIGFWYXJFbnRyeSMjaW5kIyNfZ1tjbnRdOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBhVmFyRW50cnkjI2luZCMjX2dbY250XTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkgICAgICAgICAgICAgICAgIHN0YXRpYyBkdHlwICAgICAgICAgTUVNIHhDdXIjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKSAgICAgc3RhdGljIGR0eXAgICAgICAgICBNRU0geEN1ciMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSx2YWwpICAgICAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZFZTdHJpbmcgIE1FTSB4Q3VyIyNpbmQjI18jI3N1YiMjX2c7CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKSAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB0RXBsT2JkT1N0cmluZyAgTUVNIHhDdXIjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKSAgICAgICAgICAgICAgc3RhdGljIGR0eXAgICAgICAgICBNRU0geEN1ciMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKSAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKSBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKSAgICAgICAgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9TVUJJTkRFWF9UQUIpCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9TVUJJTkRFWF9UQUIiKQorCisjZGVmaW5lIEVQTF9PQkRfQkVHSU4oKQorI2RlZmluZSBFUExfT0JEX0VORCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQygpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfUEFSVCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZFN1YkVudHJ5IE1FTSBhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbY250XT0geworI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUExfT0JEX0VORF9TVUJJTkRFWCgpfTsKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX0FSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpICAgICAgICAgc3RhdGljIHRFcGxPYmRTdWJFbnRyeSBNRU0gYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nW109IHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBrRXBsT2JkVHlwVUludDgsIGtFcGxPYmRBY2NDUiwgICAgICAgICAgJnhEZWYjI2luZCMjXzB4MDBfZywgICBOVUxMfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCB0eXAsICAgICAgICAgIChhY2MpfGtFcGxPYmRBY2NBcnJheSwgJnhEZWYjI2luZCMjXzB4MDFfZywgICAmYXhDdXIjI2luZCMjX2dbMF19LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBMX09CRF9FTkRfU1VCSU5ERVgoKX07CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgIHN0YXRpYyB0RXBsT2JkU3ViRW50cnkgTUVNIGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1tdPSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwga0VwbE9iZFR5cFVJbnQ4LCBrRXBsT2JkQWNjQ1IsICAgICAgICAgICAgICAgICAgICAgJnhEZWYjI2luZCMjXzB4MDBfZywgICBOVUxMfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCB0eXAsICAgICAgICAgIChhY2MpfGtFcGxPYmRBY2NBcnJheXxrRXBsT2JkQWNjVmFyLCAmeERlZiMjaW5kIyNfMHgwMV9nLCAgICZhVmFyRW50cnkjI2luZCMjX2dbMF19LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBMX09CRF9FTkRfU1VCSU5ERVgoKX07CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWV9OT0lOSVQoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lKSAgIHN0YXRpYyB0RXBsT2JkU3ViRW50cnkgTUVNIGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1tdPSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwga0VwbE9iZFR5cFVJbnQ4LCBrRXBsT2JkQWNjQ1IsICAgICAgICAgICAgICAgICAgICAgJnhEZWYjI2luZCMjXzB4MDBfZywgICBOVUxMfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCB0eXAsICAgICAgICAgIChhY2MpfGtFcGxPYmRBY2NBcnJheXxrRXBsT2JkQWNjVmFyLCBOVUxMLCAgICAgICAgICAgICAgICAgICZhVmFyRW50cnkjI2luZCMjX2dbMF19LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBMX09CRF9FTkRfU1VCSU5ERVgoKX07CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgICAgICB7c3ViLHR5cCwgICAgICAgICAgICAoYWNjKSwgICAgICAgICAgICAgICAgICAgICAgICAmeERlZiMjaW5kIyNfIyNzdWIjI19nLCAgICZ4Q3VyIyNpbmQjI18jI3N1YiMjX2d9LAorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpICAgICB7c3ViLHR5cCwgICAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjUmFuZ2UsICAgICAgICAgICAmeERlZiMjaW5kIyNfIyNzdWIjI19nWzBdLCZ4Q3VyIyNpbmQjI18jI3N1YiMjX2d9LAorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpICAgICAgICAgICAgICB7c3ViLHR5cCwgICAgICAgICAgICAoYWNjKSwgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICZ4Q3VyIyNpbmQjI18jI3N1YiMjX2d9LAorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSx2YWwpICAgICAgICAgICAgICAgICB7c3ViLGtFcGxPYmRUeXBWU3RyaW5nLChhY2MpLyp8a0VwbE9iZEFjY1ZhciovLCAgICAgICAgICZ4RGVmIyNpbmQjI18jI3N1YiMjX2csICAgJnhDdXIjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKSAgICAgICAgICAgICAgICAgICAgIHtzdWIsa0VwbE9iZFR5cE9TdHJpbmcsKGFjYykvKnxrRXBsT2JkQWNjVmFyKi8sICAgICAgICAgJnhEZWYjI2luZCMjXyMjc3ViIyNfZywgICAmeEN1ciMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1YixrRXBsT2JkVHlwRG9tYWluLCAoYWNjKXxrRXBsT2JkQWNjVmFyLCAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICZWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkgICAgICAgICAgICAge3N1Yix0eXAsICAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjVmFyLCAgICAgICAgICAgICAmeERlZiMjaW5kIyNfIyNzdWIjI19nLCAgICZWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkge3N1Yix0eXAsICAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjVmFyfGtFcGxPYmRBY2NSYW5nZSwmeERlZiMjaW5kIyNfIyNzdWIjI19nWzBdLCZWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkgICAgICAgICAge3N1Yix0eXAsICAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjVmFyLCAgICAgICAgICAgICBOVUxMLCAgICAmVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZ30sCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIGRlZmluZWQgKEVQTF9PQkRfQ1JFQVRFX0lOREVYX1RBQikKKworLy8gICAgICAgICNwcmFnbWEgbWVzc2FnZSAoIkVQTF9PQkRfQ1JFQVRFX0lOREVYX1RBQiIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgIHRFcGxPYmRFbnRyeSAgYU9iZFRhYl9nW10gICAgICA9IHsKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkRW50cnkgIGFPYmRUYWJNYW51ZmFjdHVyZXJfZ1tdID0geworI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgIHRFcGxPYmRFbnRyeSAgYU9iZFRhYkRldmljZV9nW10gICAgICAgPSB7CisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtFUExfT0JEX1RBQkxFX0lOREVYX0VORCwodEVwbE9iZFN1YkVudHJ5UHRyKSZkd09iZF9PQktfZywwLE5VTEx9fTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbmQsKHRFcGxPYmRTdWJFbnRyeVB0cikmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLGNudCwodEVwbE9iZENhbGxiYWNrKWNhbGx9LAorI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgICAgIHtpbmQsKHRFcGxPYmRTdWJFbnRyeVB0cikmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLChjbnQpKzEsKHRFcGxPYmRDYWxsYmFjayljYWxsfSwKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpICAgICAge2luZCwodEVwbE9iZFN1YkVudHJ5UHRyKSZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sKGNudCkrMSwodEVwbE9iZENhbGxiYWNrKWNhbGx9LAorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkgICB7aW5kLCh0RXBsT2JkU3ViRW50cnlQdHIpJmFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1swXSwoY250KSsxLCh0RXBsT2JkQ2FsbGJhY2spY2FsbH0sCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKworCSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIGRlZmluZWQgKEVQTF9PQkRfQ1JFQVRFX0lOSVRfRlVOQ1RJT04pCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9JTklUX0ZVTkNUSU9OIikKKworI2RlZmluZSBFUExfT0JEX0JFR0lOKCkKKyNkZWZpbmUgRVBMX09CRF9FTkQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW0tPm1fcFBhcnQgICAgICA9ICh0RXBsT2JkRW50cnlQdHIpICZhT2JkVGFiX2dbMF07CisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW0tPm1fcE1hbnVmYWN0dXJlclBhcnQgPSAodEVwbE9iZEVudHJ5UHRyKSAmYU9iZFRhYk1hbnVmYWN0dXJlcl9nWzBdOworI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtLT5tX3BEZXZpY2VQYXJ0ICAgICAgID0gKHRFcGxPYmRFbnRyeVB0cikgJmFPYmRUYWJEZXZpY2VfZ1swXTsKKyNkZWZpbmUgRVBMX09CRF9FTkRfUEFSVCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpCisjZGVmaW5lIEVQTF9PQkRfRU5EX0lOREVYKGluZCkKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX0FSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX0RPTUFJTihpbmQsc3ViLGFjYyxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9JTklUX1NVQklOREVYKQorCisvLyAgICAgICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9DUkVBVEVfSU5JVF9TVUJJTkRFWCIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9ERVZJQ0UoKQorI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkJLy9DQ01fU1VCSU5ERVhfUkFNX09OTFkgKEVQTF9NRU1DUFkgKCZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sJmFPYmRTdWJFbnRyeSMjaW5kIyNSb21fZ1swXSxzaXplb2YoYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nKSkpOworI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQkvL0VQTF9NRU1DUFkgKCZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sJmFPYmRTdWJFbnRyeSMjaW5kIyNSb21fZ1swXSxzaXplb2YoYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nKSk7CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQkvL0VQTF9NRU1DUFkgKCZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sJmFPYmRTdWJFbnRyeSMjaW5kIyNSb21fZ1swXSxzaXplb2YoYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nKSk7CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWV9OT0lOSVQoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lKQkvL0VQTF9NRU1DUFkgKCZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sJmFPYmRTdWJFbnRyeSMjaW5kIyNSb21fZ1swXSxzaXplb2YoYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nKSk7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2Vsc2UKKworLy8gICAgICAgICNwcmFnbWEgbWVzc2FnZSAoIkVMU0UgT0YgREVGSU5FIikKKworI2RlZmluZSBFUExfT0JEX0JFR0lOKCkKKyNkZWZpbmUgRVBMX09CRF9FTkQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpCisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0oaW5kLGNudCxjYWxsKQorI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemVzLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisKKyNlbmRpZgorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX1VOREVGSU5FX01BQ1JPKQorCisvLyAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX1VOREVGSU5FX01BQ1JPIikKKworI3VuZGVmIEVQTF9PQkRfQkVHSU4KKyN1bmRlZiBFUExfT0JEX0VORAorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQworI3VuZGVmIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIKKyN1bmRlZiBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFCisjdW5kZWYgRVBMX09CRF9FTkRfUEFSVAorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBFUExfT0JEX0JFR0lOX0lOREVYX1JBTQorI3VuZGVmIEVQTF9PQkRfRU5EX0lOREVYCisjdW5kZWYgRVBMX09CRF9SQU1fSU5ERVhfUkFNX0FSUkFZCisjdW5kZWYgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZCisjdW5kZWYgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVAorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORworI3VuZGVmIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4KKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRworI3VuZGVmIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUCisKKyNlbHNlCisKKyNlcnJvciAibm90aGluZyBkZWZpbmVkIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2Jka0NhbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmRrQ2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5YWY4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2Jka0NhbC5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGNvbW11bmljYXRpb24gYWJzdHJhY3Rpb24gbGF5ZXIKKyAgICAgICAgICAgICAgICBmb3IgdGhlIEVwbC1PYmQtS2VybmVsc3BhY2UtTW9kdWwKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmRrQ2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgS0VJTCB1VmlzaW9uIDIKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsT2Jka0NhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMThkMTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1LmMKQEAgLTAsMCArMSw1MTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsLU9iZC1Vc2Vyc3BhY2UtbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdUNhbC5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdVdyaXRlRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB3cml0ZXMgZGF0YSB0byBhbiBPQkQgZW50cnkuIFN0cmluZ3MKKy8vICAgICAgICAgICAgICBhcmUgc3RvcmVkIHdpdGggYWRkZWQgJ1wwJyBjaGFyYWN0ZXIuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVXcml0ZUVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJIHRFcGxPYmRTaXplIFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxXcml0ZUVudHJ5KHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwU3JjRGF0YV9wLCBTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdVJlYWRFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IFRoZSBmdW5jdGlvbiByZWFkcyBhbiBvYmplY3QgZW50cnkuIFRoZSBhcHBsaWNhdGlvbgorLy8gICAgICAgICAgICAgIGNhbiBhbHdheXMgcmVhZCB0aGUgZGF0YSBldmVuIGlmIGF0dHJpYiBrRXBsT2JkQWNjUmVhZAorLy8gICAgICAgICAgICAgIGlzIG5vdCBzZXQuIFRoZSBhdHRyaWIgaXMgb25seSBjaGVja2VkIHVwIGZvciBTRE8gdHJhbnNmZXIuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9IEluZGV4IG9vZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVhZEVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCXRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxSZWFkRW50cnkodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBEc3REYXRhX3AsIHBTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkQWNjZXNzT2RQYXJ0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVzdG9yZXMgZGVmYXVsdCB2YWx1ZXMgb2Ygb25lIHBhcnQgb2YgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgT2JkUGFydF9wICAgICAgID0gb2QtcGFydCB0byByZXNldAorLy8gICAgICAgICAgICAgIERpcmVjdGlvbl9wICAgICA9IGRpcmVjdG9yeSBmbGFnIGZvcgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUFjY2Vzc09kUGFydCh0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsT2JkdUNhbEFjY2Vzc09kUGFydChPYmRQYXJ0X3AsIERpcmVjdGlvbl9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVEZWZpbmVWYXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWZpbmVzIGEgdmFyaWFibGUgaW4gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVwbFZhclBhcmFtX3AgPSB2YXJlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICA9ICAgZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1RGVmaW5lVmFyKHRFcGxWYXJQYXJhbSBNRU0gKiBwVmFyUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxEZWZpbmVWYXIocFZhclBhcmFtX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUdldE9iamVjdERhdGFQdHIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBJdCByZXR1cm5lcyB0aGUgY3VycmVudCBkYXRhIHBvaW50ZXIuIEJ1dCBpZiBvYmplY3QgaXMgYW4KKy8vICAgICAgICAgICAgICBjb25zdGFudCBvYmplY3QgaXQgcmV0dXJuZXMgdGhlIGRlZmF1bHQgcG9pbnRlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgID0gICBJbmRleCBvZiB0aGUgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgPSAgIFN1YmluZGV4IG9mIHRoZSBlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB2b2lkICogICAgPSBwb2ludGVyIHRvIG9iamVjdCBkYXRhCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkICpQVUJMSUMgRXBsT2JkdUdldE9iamVjdERhdGFQdHIodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl2b2lkICpwRGF0YTsKKworCXBEYXRhID0gRXBsT2JkdUNhbEdldE9iamVjdERhdGFQdHIodWlJbmRleF9wLCB1aVN1YkluZGV4X3ApOworCisJcmV0dXJuIHBEYXRhOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1UmVnaXN0ZXJVc2VyT2QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHVzZXIgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFVzZXJPZF9wICAgPXBvaW50ZXIgdG8gdXNlciBPRGQKKy8vCisvLyBSZXR1cm46ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVnaXN0ZXJVc2VyT2QodEVwbE9iZEVudHJ5UHRyIHBVc2VyT2RfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxSZWdpc3RlclVzZXJPZChwVXNlck9kX3ApOworCisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1SW5pdFZhckVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBWYXJFbnRyeSBkZXBlbmRlbmVkIG9uIG9iamVjdCB0eXBlCisvLworLy8gUGFyYW1ldGVyczogIHBWYXJFbnRyeV9wID0gcG9pbnRlciB0byB2YXIgZW50cnkgc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgYlR5cGVfcCAgICAgPSBvYmplY3QgdHlwZQorLy8gICAgICAgICAgICAgIE9iZFNpemVfcCAgID0gc2l6ZSBvZiBvYmplY3QgZGF0YQorLy8KKy8vIFJldHVybnM6ICAgICBub25lCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmR1SW5pdFZhckVudHJ5KHRFcGxPYmRWYXJFbnRyeSBNRU0gKiBwVmFyRW50cnlfcCwKKwkJCQkJICAgICBCWVRFIGJUeXBlX3AsCisJCQkJCSAgICAgdEVwbE9iZFNpemUgT2JkU2l6ZV9wKQoreworCUVwbE9iZHVDYWxJbml0VmFyRW50cnkocFZhckVudHJ5X3AsIGJUeXBlX3AsIE9iZFNpemVfcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVHZXREYXRhU2l6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVmFyRW50cnkgZGVwZW5kZW5lZCBvbiBvYmplY3QgdHlwZQorLy8KKy8vICAgICAgICAgICAgICBnZXRzIHRoZSBkYXRhIHNpemUgb2YgYW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgZm9yIHN0cmluZyBvYmplY3RzIGl0IHJldHVybmVzIHRoZSBzdHJpbmcgbGVuZ3RoCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgID0gICBJbmRleAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcD0gICBTdWJpbmRleAorLy8KKy8vIFJldHVybjogICAgICB0RXBsT2JkU2l6ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZHVHZXREYXRhU2l6ZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl0RXBsT2JkU2l6ZSBTaXplOworCisJU2l6ZSA9IEVwbE9iZHVDYWxHZXREYXRhU2l6ZSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCk7CisKKwlyZXR1cm4gU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUdldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHJldHVybnMgbm9kZWlkIGZyb20gZW50cnkgMHgxRjkzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8gUmV0dXJuOiAgICAgIHVuc2lnbmVkIGludCA9IE5vZGUgSWQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHVuc2lnbmVkIGludCBQVUJMSUMgRXBsT2JkdUdldE5vZGVJZCgpCit7CisJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCisJdWlOb2RlSWQgPSBFcGxPYmR1Q2FsR2V0Tm9kZUlkKCk7CisKKwlyZXR1cm4gdWlOb2RlSWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVTZXROb2RlSWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBzZXRzIG5vZGVpZCBpbiBlbnRyeSAweDFGOTMKKy8vCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgID0gICBOb2RlIElkIHRvIHNldAorLy8gICAgICAgICAgICAgIE5vZGVJZFR5cGVfcD0gICBUeXBlIG9uIHdoaWNoIHdheSB0aGUgTm9kZSBJZCB3YXMgc2V0CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgPSBFcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVTZXROb2RlSWQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQl0RXBsT2JkTm9kZUlkVHlwZSBOb2RlSWRUeXBlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsU2V0Tm9kZUlkKHVpTm9kZUlkX3AsIE5vZGVJZFR5cGVfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1R2V0QWNjZXNzVHlwZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHJldHVybnMgYWNjZXNzdHlwZSBvZiB0aGUgZW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBBY2Nlc3NUeXBfcCAgICA9ICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgYWNjZXNzdHlwCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUdldEFjY2Vzc1R5cGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHRFcGxPYmRBY2Nlc3MgKgorCQkJCQkJICAgIHBBY2Nlc3NUeXBfcCkKK3sKKwl0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGU7CisKKwlBY2Nlc3NUeXBlID0KKwkgICAgRXBsT2JkdUNhbEdldEFjY2Vzc1R5cGUodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBBY2Nlc3NUeXBfcCk7CisKKwlyZXR1cm4gQWNjZXNzVHlwZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkUmVhZHVFbnRyeVRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gcmVhZHMgYW4gb2JqZWN0IGVudHJ5IGZyb20gdGhlIGJ5dGVvZGVyCisvLyAgICAgICAgICAgICAgb2YgdGhlIHN5c3RlbSB0byB0aGUgbGl0dGxlIGVuZGlhbiBieXRlb3JkZXIgZm9yIG51bWVyaWMgdmFsdWVzLgorLy8gICAgICAgICAgICAgIEZvciBvdGhlciB0eXBlcyBhIG5vcm1hbCByZWFkIHdpbGwgYmUgcHJvY2Vzc2VkLiBUaGlzIGlzIHVzZWZ1bGwgZm9yCisvLyAgICAgICAgICAgICAgdGhlIFBETyBhbmQgU0RPIG1vZHVsZS4gVGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgY2FuIGFsd2F5cyByZWFkIHRoZSBkYXRhIGV2ZW4gaWYgYXR0cmliIGtFcGxPYmRBY2NSZWFkCisvLyAgICAgICAgICAgICAgaXMgbm90IHNldC4gVGhlIGF0dHJpYiBpcyBvbmx5IGNoZWNrZWQgdXAgZm9yIFNETyB0cmFuc2Zlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVSZWFkRW50cnlUb0xlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9CisJICAgIEVwbE9iZHVDYWxSZWFkRW50cnlUb0xlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwRHN0RGF0YV9wLAorCQkJCSAgICBwU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gd3JpdGVzIGRhdGEgdG8gYW4gT0JEIGVudHJ5IGZyb20gYSBzb3VyY2Ugd2l0aAorLy8gICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4gYnl0ZW9yZGVyIHRvIHRoZSBvZCB3aXRoIHN5c3RlbSBzcGVjdWlmaWMKKy8vICAgICAgICAgICAgICBieXRlb3JkZXIuIE5vdCBudW1lcmljIHZhbHVlcyB3aWxsIG9ubHkgYnkgY29waWVkLiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgICAgdEVwbE9iZFNpemUgU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0KKwkgICAgRXBsT2JkdUNhbFdyaXRlRW50cnlGcm9tTGUodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBTcmNEYXRhX3AsCisJCQkJICAgICAgIFNpemVfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1U2VhcmNoVmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIHZhcmlhYmxlIGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBpbmRleCBvZiB0aGUgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICA9ICAgc3ViaW5kZXggb2YgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHBwVmFyRW50cnlfcCAgICA9ICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCQkgICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKioKKwkJCQkJCSAgICAgcHBWYXJFbnRyeV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsT2JkdUNhbFNlYXJjaFZhckVudHJ5KHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLCBwcFZhckVudHJ5X3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZHVDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkdUNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjNkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZHVDYWwuYwpAQCAtMCwwICsxLDU1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisgICAgICAgICAgICAgICAgZm9yIHRoZSBFcGwtT2JkLVVzZXJzcGFjZS1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZHVDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAidXNlci9FcGxPYmR1Q2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApICYmIChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbFdyaXRlRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkV3JpdGVFbnRyeQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsV3JpdGVFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSAgICB0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgcFNyY0RhdGFfcCwgU2l6ZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxSZWFkRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkUmVhZEVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9IEluZGV4IG9vZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVhZEVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBEc3REYXRhX3AsIHBTaXplX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEFjY2Vzc09kUGFydCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRBY2Nlc3NPZFBhcnQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgT2JkUGFydF9wICAgICAgID0gb2QtcGFydCB0byByZXNldAorLy8gICAgICAgICAgICAgIERpcmVjdGlvbl9wICAgICA9IGRpcmVjdG9yeSBmbGFnIGZvcgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbEFjY2Vzc09kUGFydCh0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgICAgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydChPYmRQYXJ0X3AsIERpcmVjdGlvbl9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxEZWZpbmVWYXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkRGVmaW5lVmFyCisvLworLy8gUGFyYW1ldGVyczogIHBFcGxWYXJQYXJhbV9wID0gdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbERlZmluZVZhcih0RXBsVmFyUGFyYW0gTUVNICoKKwkJCQkJCSAgIHBWYXJQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZERlZmluZVZhcihwVmFyUGFyYW1fcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsR2V0T2JqZWN0RGF0YVB0cigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRHZXRPYmplY3REYXRhUHRyCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICA9ICAgSW5kZXggb2YgdGhlIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wID0gICBTdWJpbmRleCBvZiB0aGUgZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZCAqICAgID0gcG9pbnRlciB0byBvYmplY3QgZGF0YQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZHVDYWxHZXRPYmplY3REYXRhUHRyKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdm9pZCAqcERhdGE7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJcERhdGEgPSBFcGxPYmRHZXRPYmplY3REYXRhUHRyKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wKTsKKyNlbHNlCisJcERhdGEgPSBOVUxMOworI2VuZGlmCisKKwlyZXR1cm4gcERhdGE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxSZWdpc3RlclVzZXJPZCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRSZWdpc3RlclVzZXJPZAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVXNlck9kX3AgICA9IHBvaW50ZXIgdG8gdXNlciBPRAorLy8KKy8vIFJldHVybjogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWdpc3RlclVzZXJPZCh0RXBsT2JkRW50cnlQdHIKKwkJCQkJCQlwVXNlck9kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0gRXBsT2JkUmVnaXN0ZXJVc2VyT2QocFVzZXJPZF9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEluaXRWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRJbml0VmFyRW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFZhckVudHJ5X3AgPSBwb2ludGVyIHRvIHZhciBlbnRyeSBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgICBiVHlwZV9wICAgICA9IG9iamVjdCB0eXBlCisvLyAgICAgICAgICAgICAgT2JkU2l6ZV9wICAgPSBzaXplIG9mIG9iamVjdCBkYXRhCisvLworLy8gUmV0dXJuczogICAgIG5vbmUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgUFVCTElDIEVwbE9iZHVDYWxJbml0VmFyRW50cnkodEVwbE9iZFZhckVudHJ5IE1FTSAqCisJCQkJCQlwVmFyRW50cnlfcCwgQllURSBiVHlwZV9wLAorCQkJCQkJdEVwbE9iZFNpemUgT2JkU2l6ZV9wKQoreworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlFcGxPYmRJbml0VmFyRW50cnkocFZhckVudHJ5X3AsIGJUeXBlX3AsIE9iZFNpemVfcCk7CisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEdldERhdGFTaXplKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZEdldERhdGFTaXplCisvLworLy8gICAgICAgICAgICAgIGdldHMgdGhlIGRhdGEgc2l6ZSBvZiBhbiBvYmplY3QKKy8vICAgICAgICAgICAgICBmb3Igc3RyaW5nIG9iamVjdHMgaXQgcmV0dXJuZXMgdGhlIHN0cmluZyBsZW5ndGgKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgPSAgIEluZGV4CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wPSAgIFN1YmluZGV4CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxPYmRTaXplCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkdUNhbEdldERhdGFTaXplKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKQoreworCXRFcGxPYmRTaXplIFNpemU7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJU2l6ZSA9IEVwbE9iZEdldERhdGFTaXplKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wKTsKKyNlbHNlCisJU2l6ZSA9IDA7CisjZW5kaWYKKworCXJldHVybiBTaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsR2V0Tm9kZUlkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZEdldE5vZGVJZAorLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybjogICAgICB1bnNpZ25lZCBpbnQgPSBOb2RlIElkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB1bnNpZ25lZCBpbnQgUFVCTElDIEVwbE9iZHVDYWxHZXROb2RlSWQoKQoreworCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwl1aU5vZGVJZCA9IEVwbE9iZEdldE5vZGVJZCgpOworI2Vsc2UKKwl1aU5vZGVJZCA9IDA7CisjZW5kaWYKKworCXJldHVybiB1aU5vZGVJZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbFNldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRTZXROb2RlSWQKKy8vCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgID0gICBOb2RlIElkIHRvIHNldAorLy8gICAgICAgICAgICAgIE5vZGVJZFR5cGVfcD0gICBUeXBlIG9uIHdoaWNoIHdheSB0aGUgTm9kZSBJZCB3YXMgc2V0CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgPSBFcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxTZXROb2RlSWQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICB0RXBsT2JkTm9kZUlkVHlwZQorCQkJCQkJICAgTm9kZUlkVHlwZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZFNldE5vZGVJZCh1aU5vZGVJZF9wLCBOb2RlSWRUeXBlX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEdldEFjY2Vzc1R5cGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkR2V0QWNjZXNzVHlwZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcEFjY2Vzc1R5cF9wICAgID0gICBwb2ludGVyIHRvIGJ1ZmZlciB0byBzdG9yZSBhY2Nlc3N0eXBlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbEdldEFjY2Vzc1R5cGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJCSAgICAgICB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgICAgdEVwbE9iZEFjY2VzcyAqCisJCQkJCQkgICAgICAgcEFjY2Vzc1R5cF9wKQoreworCXRFcGxPYmRBY2Nlc3MgQWNjZXNUeXBlOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCUFjY2VzVHlwZSA9IEVwbE9iZEdldEFjY2Vzc1R5cGUodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBBY2Nlc3NUeXBfcCk7CisjZWxzZQorCUFjY2VzVHlwZSA9IDA7CisjZW5kaWYKKworCXJldHVybiBBY2Nlc1R5cGU7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbFJlYWRFbnRyeVRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkUmVhZEVudHJ5VG9MZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWFkRW50cnlUb0xlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICAgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZFJlYWRFbnRyeVRvTGUodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBEc3REYXRhX3AsIHBTaXplX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbFdyaXRlRW50cnlGcm9tTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkV3JpdGVFbnRyeUZyb21MZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsV3JpdGVFbnRyeUZyb21MZSh1bnNpZ25lZCBpbnQKKwkJCQkJCQkgIHVpSW5kZXhfcCwKKwkJCQkJCQkgIHVuc2lnbmVkIGludAorCQkJCQkJCSAgdWlTdWJJbmRleF9wLAorCQkJCQkJCSAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCQkgIHRFcGxPYmRTaXplIFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPQorCSAgICBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwU3JjRGF0YV9wLCBTaXplX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxTZWFyY2hWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgdmFyaWFibGUgZnJvbSBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIGluZGV4IG9mIHRoZSB2YXIgZW50cnkgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgID0gICBzdWJpbmRleCBvZiB2YXIgZW50cnkgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgcHBWYXJFbnRyeV9wICAgID0gICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSB2YXJlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsT2JkdUNhbFNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCSB0RXBsT2JkVmFyRW50cnkgTUVNICoqIHBwVmFyRW50cnlfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRTZWFyY2hWYXJFbnRyeSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgcHBWYXJFbnRyeV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmpEZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JqRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxMzEyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JqRGVmLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZWZpbmVzIG9iamRpY3QgZGljdGlvbmFyeQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iakRlZi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDYgICAgay50LjogICB0YWtlIE9iakRlZi5oIGZyb20gQ0FOb3BlbiBhbmQgbW9kaWZ5IGZvciBFUEwKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMT0JKREVGX0hfCisjZGVmaW5lIF9FUExPQkpERUZfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNlY3VyaXR5IGNoZWNrcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1hY3JvcyB0byBoZWxwIGJ1aWxkaW5nIE9ECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIpICYmIChFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIgIT0gRkFMU0UpKQorCisjZGVmaW5lIENDTV9TVUJJTkRFWF9SQU1fT05MWShhKSAgICBhOworI2RlZmluZSBDQ01fU1VCSU5ERVhfUkFNX09ORU9GKGEsYikgYQorCisjZWxzZQorCisjZGVmaW5lIENDTV9TVUJJTkRFWF9SQU1fT05MWShhKQorI2RlZmluZSBDQ01fU1VCSU5ERVhfUkFNX09ORU9GKGEsYikgYgorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRvIHByZXZlbnQgdW51c2VkIG1lbW9yeSBpbiBzdWJpbmRleCB0YWJsZXMgd2UgbmVlZCB0aGlzIG1hY3JvLgorLy8gQnV0IG5vdCBhbGwgY29tcGlsZXJzIHN1cHBvcnQgdG8gcHJlc2V0IHRoZSBsYXN0IHN0cnVjdCB2YWx1ZSBmb2xsb3dlZCBieSBhIGNvbW1hLgorLy8gQ29tcGlsZXJzIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgYSBjb21tYSBhZnRlciBsYXN0IHN0cnVjdCB2YWx1ZSBoYXMgdG8gcGxhY2UgaW4gYSBkdW1teSBzdWJpbmRleC4KKyNpZiAoKERFVl9TWVNURU0gJiBfREVWX0NPTU1BX0VYVF8pICE9IDApCisKKyNkZWZpbmUgRVBMX09CRF9FTkRfU1VCSU5ERVgoKQorI2RlZmluZSBFUExfT0JEX01BWF9BUlJBWV9TVUJFTlRSSUVTICAgIDIKKworI2Vsc2UKKworI2RlZmluZSBFUExfT0JEX0VORF9TVUJJTkRFWCgpICAgICAgICAgIHswLDAsMCxOVUxMLE5VTEx9CisjZGVmaW5lIEVQTF9PQkRfTUFYX0FSUkFZX1NVQkVOVFJJRVMgICAgMworCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjcmVhdGlvbiBvZiBkYXRhIGluIFJPTSBtZW1vcnkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfUk9NX0RBVEEKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisjdW5kZWYgRVBMX09CRF9DUkVBVEVfUk9NX0RBVEEKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3JlYXRpb24gb2YgZGF0YSBpbiBSQU0gbWVtb3J5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfUkFNX0RBVEEKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisjdW5kZWYgRVBMX09CRF9DUkVBVEVfUkFNX0RBVEEKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3JlYXRpb24gb2Ygc3ViaW5kZXggdGFibGVzIGluIFJPTSBhbmQgUkFNCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfU1VCSU5ERVhfVEFCCisjaW5jbHVkZSAib2JqZGljdC5oIgorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX1NVQklOREVYX1RBQgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjcmVhdGlvbiBvZiBpbmRleCB0YWJsZXMgZm9yIGdlbmVyaWMsIG1hbnVmYWN0dXJlciBhbmQgZGV2aWNlIHBhcnQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfT0JEX0NSRUFURV9JTkRFWF9UQUIKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisjdW5kZWYgRVBMX09CRF9DUkVBVEVfSU5ERVhfVEFCCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVQTF9PQkRfSU5JVF9SQU1fTkFNRSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgb2JqZWN0IGRpY3Rpb25hcnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgID0gcG9pbnRlciB0byBpbml0IHBhcmFtIHN0cnVjdCBvZiBFcGwKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVQTF9PQkRfSU5JVF9SQU1fTkFNRSh0RXBsT2JkSW5pdFBhcmFtIE1FTSAqCisJCQkJCQkgICAgIHBJbml0UGFyYW1fcCkKK3sKKworCXRFcGxPYmRJbml0UGFyYW0gTUVNICpwSW5pdFBhcmFtID0gcEluaXRQYXJhbV9wOworCisJLy8gY2hlY2sgaWYgcG9pbnRlciB0byBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIHZhbGlkCisJLy8gaWYgbm90IHRoZW4gb25seSBjb3B5IHN1YmluZGV4IHRhYmxlcyBiZWxvdworCWlmIChwSW5pdFBhcmFtICE9IE5VTEwpIHsKKwkJLy8gYXQgZmlyc3QgZGVsZXRlIGFsbCBwYXJhbWV0ZXJzIChhbGwgcG9pbnRlcnMgd2lsbCBiZSBzZXQgenUgTlVMTCkKKwkJRVBMX01FTVNFVChwSW5pdFBhcmFtLCAwLCBzaXplb2YodEVwbE9iZEluaXRQYXJhbSkpOworCisjZGVmaW5lIEVQTF9PQkRfQ1JFQVRFX0lOSVRfRlVOQ1RJT04KKwkJeworCQkJLy8gaW5zZXJ0cyBjb2RlIHRvIGluaXQgcG9pbnRlciB0byBpbmRleCB0YWJsZXMKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisJCX0KKyN1bmRlZiBFUExfT0JEX0NSRUFURV9JTklUX0ZVTkNUSU9OCisKKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKwkJeworCQkJLy8gdG8gYmVnaW4gbm8gdXNlciBPRCBpcyBkZWZpbmVkCisJCQlwSW5pdFBhcmFtX3AtPm1fcFVzZXJQYXJ0ID0gTlVMTDsKKwkJfQorI2VuZGlmCisJfQorI2RlZmluZSBFUExfT0JEX0NSRUFURV9JTklUX1NVQklOREVYCisJeworCQkvLyBpbnNlcnRzIGNvZGUgdG8gY29weSBzdWJpbmRleCB0YWJsZXMKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisJfQorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX0lOSVRfU1VCSU5ERVgKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKKworfQorCisjZW5kaWYgLy8gX0VQTE9CSkRFRl9IXworCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRvLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmFjODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkby5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBQRE8gbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsUGRvLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9QRE9fSF8KKyNkZWZpbmUgX0VQTF9QRE9fSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaW52YWxpZCBQRE8tTm9kZUlkCisjZGVmaW5lIEVQTF9QRE9fSU5WQUxJRF9OT0RFX0lEICAgICAweEZGCisvLyBOb2RlSWQgZm9yIFBSZXEgUlBETworI2RlZmluZSBFUExfUERPX1BSRVFfTk9ERV9JRCAgICAgICAgMHgwMAorLy8gTm9kZUlkIGZvciBQUmVzIFRQRE8KKyNkZWZpbmUgRVBMX1BET19QUkVTX05PREVfSUQgICAgICAgIDB4MDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICptX3BWYXI7CisJV09SRCBtX3dPZmZzZXQ7CQkvLyBpbiBCaXRzCisJV09SRCBtX3dTaXplOwkJLy8gaW4gQml0cworCUJPT0wgbV9mTnVtZXJpYzsJLy8gbnVtZXJpYyB2YWx1ZSAtPiB1c2UgQU1JIGZ1bmN0aW9ucworCit9IHRFcGxQZG9NYXBwaW5nOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlTaXplT2ZTdHJ1Y3Q7CisJdW5zaWduZWQgaW50IG1fdWlQZG9JZDsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwkvLyAweEZGPWludmFsaWQsIFJQRE86IDB4MDA9UFJlcSwgbG9jYWxOb2RlSWQ9UFJlcywgcmVtb3RlTm9kZUlkPVBSZXMKKwkvLyAgICAgICAgICAgICAgIFRQRE86IDB4MDA9UFJlcywgTU46IENuTm9kZUlkPVBSZXEKKworCUJPT0wgbV9mVHhSeDsKKwlCWVRFIG1fYk1hcHBpbmdWZXJzaW9uOworCXVuc2lnbmVkIGludCBtX3VpTWF4TWFwcGluZ0VudHJpZXM7CS8vIG1heGltdW0gbnVtYmVyIG9mIG1hcHBpbmcgZW50cmllcywgaS5lLiBzaXplIG9mIG1fYVBkb01hcHBpbmcKKwl0RXBsUGRvTWFwcGluZyBtX2FQZG9NYXBwaW5nWzFdOworCit9IHRFcGxQZG9QYXJhbTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfUERPX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb2suYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRvay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTk5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb2suYwpAQCAtMCwwICsxLDY5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBrZXJuZWwgUERPIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkb2suYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisjaW5jbHVkZSAicGxjY29yZS5oIgorI2RlZmluZSBQRE9fTEVEIDB4MDgKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpID09IDApCisKKyNlcnJvciAnRVJST1I6IE1pc3NpbmcgRExMay1Nb2R1bCEnCisKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgPT0gMCkKKworI2Vycm9yICdFUlJPUjogTWlzc2luZyBPQkRrLU1vZHVsIScKKworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfUERPS19PQkRfSURYX1JYX0NPTU1fUEFSQU0gIDB4MTQwMAorI2RlZmluZSBFUExfUERPS19PQkRfSURYX1JYX01BUFBfUEFSQU0gIDB4MTYwMAorI2RlZmluZSBFUExfUERPS19PQkRfSURYX1RYX0NPTU1fUEFSQU0gIDB4MTgwMAorI2RlZmluZSBFUExfUERPS19PQkRfSURYX1RYX01BUFBfUEFSQU0gIDB4MUEwMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbFBkb2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0FkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkIGFuZCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQWRkSW5zdGFuY2Uodm9pZCkKK3sKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0RlbEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyBhbiBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rRGVsSW5zdGFuY2Uodm9pZCkKK3sKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0NiUGRvUmVjZWl2ZWQKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgRExMIGlmIFBSZXMgb3IgUFJlcSBmcmFtZSB3YXMKKy8vICAgICAgICAgICAgICByZWNlaXZlZC4gSXQgcG9zdHMgdGhlIGZyYW1lIHRvIHRoZSBldmVudCBxdWV1ZS4KKy8vICAgICAgICAgICAgICBJdCBpcyBjYWxsZWQgaW4gc3RhdGVzIE5NVF9DU19SRUFEWV9UT19PUEVSQVRFIGFuZCBOTVRfQ1NfT1BFUkFUSU9OQUwuCisvLyAgICAgICAgICAgICAgVGhlIHBhc3NlZCBQRE8gbmVlZHMgbm90IHRvIGJlIHZhbGlkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NiUGRvUmVjZWl2ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisJLy8gcmVzZXQgTEVECisvLyAgICBNQ0ZfR1BJT19QT0RSX1BDSUJHICY9IH5QRE9fTEVEOyAgLy8gTGV2ZWwKKyNlbmRpZgorCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rUGRvazsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVQZG9SeDsKKwkvLyBsaW1pdCBjb3BpZWQgZGF0YSB0byBzaXplIG9mIFBETyAoYmVjYXVzZSBmcm9tIHNvbWUgQ05zIHRoZSBmcmFtZSBpcyBsYXJnZXIgdGhhbiBuZWNlc3NhcnkpCisJRXZlbnQubV91aVNpemUgPSBBbWlHZXRXb3JkRnJvbUxlKCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfd1NpemUpICsgMjQ7CS8vIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKwlFdmVudC5tX3BBcmcgPSBwRnJhbWVJbmZvX3AtPm1fcEZyYW1lOworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisJLy8gc2V0IExFRAorLy8gICAgTUNGX0dQSU9fUE9EUl9QQ0lCRyB8PSBQRE9fTEVEOyAgLy8gTGV2ZWwKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgRExMIGlmIFBSZXMgb3IgUFJlcSBmcmFtZSB3YXMKKy8vICAgICAgICAgICAgICBzZW50LiBJdCBwb3N0cyB0aGUgcG9pbnRlciB0byB0aGUgZnJhbWUgdG8gdGhlIGV2ZW50IHF1ZXVlLgorLy8gICAgICAgICAgICAgIEl0IGlzIGNhbGxlZCBpbiBOTVRfQ1NfUFJFX09QRVJBVElPTkFMXzIsCisvLyAgICAgICAgICAgICAgTk1UX0NTX1JFQURZX1RPX09QRVJBVEUgYW5kIE5NVF9DU19PUEVSQVRJT05BTC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lSW5mb19wICAgICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYlBkb1RyYW5zbWl0dGVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorCS8vIHJlc2V0IExFRAorCU1DRl9HUElPX1BPRFJfUENJQkcgJj0gflBET19MRUQ7CS8vIExldmVsCisjZW5kaWYKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1Bkb2s7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlUGRvVHg7CisJRXZlbnQubV91aVNpemUgPSBzaXplb2YodEVwbEZyYW1lSW5mbyk7CisJRXZlbnQubV9wQXJnID0gcEZyYW1lSW5mb19wOworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisJLy8gc2V0IExFRAorCU1DRl9HUElPX1BPRFJfUENJQkcgfD0gUERPX0xFRDsJLy8gTGV2ZWwKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0NiU29hCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTCBpZiBTb0EgZnJhbWUgd2FzCisvLyAgICAgICAgICAgICAgcmVjZWl2ZWQgcmVzcC4gc2VudC4gSXQgcG9zdHMgdGhpcyBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuCisvLworLy8gUGFyYW1ldGVyczogIHBGcmFtZUluZm9fcCAgICAgICAgICAgID0gcG9pbnRlciB0byBmcmFtZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2JTb2EodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1Bkb2s7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlUGRvU29hOworCUV2ZW50Lm1fdWlTaXplID0gMDsKKwlFdmVudC5tX3BBcmcgPSBOVUxMOworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGFsbCByZWNlaXZlZCBhbmQgdHJhbnNtaXR0ZWQgUERPcy4KKy8vICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IGFueSBvdGhlciB0YXNrCisvLyAgICAgICAgICAgICAgZXhjZXB0IElTUnMgKGxpa2UgdGhlIGV0aGVybmV0IGRyaXZlciBJU1IsIHdoaWNoIG1heSBjYWxsCisvLyAgICAgICAgICAgICAgRXBsUGRva0NiRnJhbWVSZWNlaXZlZCgpIG9yIEVwbFBkb2tDYkZyYW1lVHJhbnNtaXR0ZWQoKSkuCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICAgICAgICAgID0gcG9pbnRlciB0byBldmVudCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlXT1JEIHdQZG9TaXplOworCVdPUkQgd0JpdE9mZnNldDsKKwlXT1JEIHdCaXRTaXplOworCVdPUkQgd1ZhclNpemU7CisJUVdPUkQgcXdPYmplY3RNYXBwaW5nOworCUJZVEUgYk1hcHBTdWJpbmRleDsKKwlCWVRFIGJPYmRTdWJpbmRleDsKKwlXT1JEIHdPYmRNYXBwSW5kZXg7CisJV09SRCB3T2JkQ29tbUluZGV4OworCVdPUkQgd1Bkb0lkOworCUJZVEUgYk9iZERhdGE7CisJQllURSBiT2JqZWN0Q291bnQ7CisJQllURSBiRnJhbWVEYXRhOworCUJPT0wgZlZhbGlkOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEZyYW1lSW5mbyAqcEZyYW1lSW5mbzsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdEVwbE1zZ1R5cGUgTXNnVHlwZTsKKworCS8vIDB4RkY9aW52YWxpZCwgUlBETzogMHgwMD1QUmVxLCBsb2NhbE5vZGVJZD1QUmVzLCByZW1vdGVOb2RlSWQ9UFJlcworCS8vICAgICAgICAgICAgICAgVFBETzogMHgwMD1QUmVzLCBNTjogQ25Ob2RlSWQ9UFJlcQorCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVQZG9SeDoJLy8gUlBETyByZWNlaXZlZAorCQlwRnJhbWUgPSAodEVwbEZyYW1lICopIHBFdmVudF9wLT5tX3BBcmc7CisKKwkJLy8gY2hlY2sgaWYgcmVjZWl2ZWQgUlBETyBpcyB2YWxpZAorCQliRnJhbWVEYXRhID0KKwkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JGbGFnMSk7CisJCWlmICgoYkZyYW1lRGF0YSAmIEVQTF9GUkFNRV9GTEFHMV9SRCkgPT0gMCkgewkvLyBSUERPIGludmFsaWQKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyByZXRyaWV2ZSBFUEwgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYk1lc3NhZ2VUeXBlKTsKKwkJaWYgKE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVQcmVxKSB7CS8vIFJQRE8gaXMgUFJlcSBmcmFtZQorCQkJdWlOb2RlSWQgPSBFUExfUERPX1BSRVFfTk9ERV9JRDsJLy8gMHgwMAorCQl9IGVsc2UgewkvLyBSUERPIGlzIFBSZXMgZnJhbWUKKwkJCS8vIHJldHJpZXZlIG5vZGUgSUQKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCQl9CisKKwkJLy8gc2VhcmNoIGZvciBhcHByb3ByaWF0ZSB2YWxpZCBSUERPIGluIE9ECisJCXdPYmRNYXBwSW5kZXggPSBFUExfUERPS19PQkRfSURYX1JYX01BUFBfUEFSQU07CisJCWZvciAod09iZENvbW1JbmRleCA9IEVQTF9QRE9LX09CRF9JRFhfUlhfQ09NTV9QQVJBTTsKKwkJICAgICB3T2JkQ29tbUluZGV4IDwgKEVQTF9QRE9LX09CRF9JRFhfUlhfQ09NTV9QQVJBTSArIDB4MDBGRik7CisJCSAgICAgd09iZENvbW1JbmRleCsrLCB3T2JkTWFwcEluZGV4KyspIHsKKwkJCU9iZFNpemUgPSAxOworCQkJLy8gcmVhZCBub2RlIElEIGZyb20gT0QKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRDb21tSW5kZXgsIDB4MDEsICZiT2JkRGF0YSwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmICgoUmV0ID09IGtFcGxPYmRJbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkSWxsZWdhbFBhcnQpKSB7CS8vIFBETyBkb2VzIG5vdCBleGlzdDsgbGFzdCBQRE8gcmVhY2hlZAorCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCQkJaWYgKGJPYmREYXRhICE9IHVpTm9kZUlkKSB7CS8vIG5vZGUgSUQgZG9lcyBub3QgZXF1YWwgLSB3cm9uZyBQRE8sIHRyeSBuZXh0IFBETyBpbiBPRAorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJT2JkU2l6ZSA9IDE7CisJCQkvLyByZWFkIG51bWJlciBvZiBtYXBwZWQgb2JqZWN0cyBmcm9tIE9EOyB0aGlzIGluZGljYXRlcyBpZiB0aGUgUERPIGlzIHZhbGlkCisJCQlSZXQgPQorCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkTWFwcEluZGV4LCAweDAwLCAmYk9iamVjdENvdW50LAorCQkJCQkgICAgJk9iZFNpemUpOworCQkJaWYgKChSZXQgPT0ga0VwbE9iZEluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRJbGxlZ2FsUGFydCkpIHsJLy8gUERPIGRvZXMgbm90IGV4aXN0OyBsYXN0IFBETyByZWFjaGVkCisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJZ290byBFeGl0OworCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGVudHJ5IHJlYWQgc3VjY2Vzc2Z1bGx5CisJCQlpZiAoYk9iamVjdENvdW50ID09IDApIHsJLy8gUERPIGluIE9EIG5vdCB2YWxpZCwgdHJ5IG5leHQgUERPIGluIE9ECisJCQkJY29udGludWU7CisJCQl9CisKKwkJCU9iZFNpemUgPSAxOworCQkJLy8gY2hlY2sgUERPIG1hcHBpbmcgdmVyc2lvbgorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZENvbW1JbmRleCwgMHgwMiwgJmJPYmREYXRhLAorCQkJCQkgICAgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwkJCS8vIHJldHJpZXZlIFBETyB2ZXJzaW9uIGZyb20gZnJhbWUKKwkJCWJGcmFtZURhdGEgPQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJICAgICBtX2xlX2JQZG9WZXJzaW9uKTsKKwkJCWlmICgoYk9iZERhdGEgJiBFUExfVkVSU0lPTl9NQUlOKSAhPSAoYkZyYW1lRGF0YSAmIEVQTF9WRVJTSU9OX01BSU4pKSB7CS8vIFBETyB2ZXJzaW9ucyBkbyBub3QgbWF0Y2gKKwkJCQkvLyAkJCQgcmFpc2UgUERPIGVycm9yCisJCQkJLy8gdGVybWlhdGUgcHJvY2Vzc2luZyBvZiB0aGlzIFJQRE8KKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyB2YWxpZCBSUERPIGZvdW5kCisKKwkJCS8vIHJldHJpZXZlIFBETyBzaXplCisJCQl3UGRvU2l6ZSA9CisJCQkgICAgQW1pR2V0V29yZEZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfd1NpemUpOworCisJCQkvLyBwcm9jZXNzIG1hcHBpbmcKKwkJCWZvciAoYk1hcHBTdWJpbmRleCA9IDE7IGJNYXBwU3ViaW5kZXggPD0gYk9iamVjdENvdW50OworCQkJICAgICBiTWFwcFN1YmluZGV4KyspIHsKKwkJCQlPYmRTaXplID0gODsJLy8gUVdPUkQKKwkJCQkvLyByZWFkIG9iamVjdCBtYXBwaW5nIGZyb20gT0QKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZE1hcHBJbmRleCwKKwkJCQkJCSAgICBiTWFwcFN1YmluZGV4LAorCQkJCQkJICAgICZxd09iamVjdE1hcHBpbmcsICZPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBjaGVjayBpZiBvYmplY3QgbWFwcGluZyBlbnRyeSBpcyB2YWxpZCwgaS5lLiB1bmVxdWFsIHplcm8sIGJlY2F1c2UgImVtcHR5IiBlbnRyaWVzIGFyZSBhbGxvd2VkCisJCQkJaWYgKHF3T2JqZWN0TWFwcGluZyA9PSAwKSB7CS8vIGludmFsaWQgZW50cnksIGNvbnRpbnVlIHdpdGggbmV4dCBlbnRyeQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLy8gZGVjb2RlIG9iamVjdCBtYXBwaW5nCisJCQkJd09iZENvbW1JbmRleCA9CisJCQkJICAgIChXT1JEKSAocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgIDB4MDAwMDAwMDAwMDAwRkZGRkxMKTsKKwkJCQliT2JkU3ViaW5kZXggPQorCQkJCSAgICAoQllURSkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4MDAwMDAwMDAwMEZGMDAwMExMKSA+PiAxNik7CisJCQkJd0JpdE9mZnNldCA9CisJCQkJICAgIChXT1JEKSAoKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAgMHgwMDAwRkZGRjAwMDAwMDAwTEwpID4+IDMyKTsKKwkJCQl3Qml0U2l6ZSA9CisJCQkJICAgIChXT1JEKSAoKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAgMHhGRkZGMDAwMDAwMDAwMDAwTEwpID4+IDQ4KTsKKworCQkJCS8vIGNoZWNrIGlmIG9iamVjdCBleGNlZWRzIFBETyBzaXplCisJCQkJaWYgKCgod0JpdE9mZnNldCArIHdCaXRTaXplKSA+PiAzKSA+IHdQZG9TaXplKSB7CS8vIHdyb25nIG9iamVjdCBtYXBwaW5nOyBQRE8gc2l6ZSBpcyB0b28gbG93CisJCQkJCS8vICQkJCByYWlzZSBQRE8gZXJyb3IKKwkJCQkJLy8gdGVybWluYXRlIHByb2Nlc3Npbmcgb2YgdGhpcyBSUERPCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gY29weSBvYmplY3QgZnJvbSBSUERPIHRvIHByb2Nlc3MvT0QgdmFyaWFibGUKKwkJCQlPYmRTaXplID0gd0JpdFNpemUgPj4gMzsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlKHdPYmRDb21tSW5kZXgsCisJCQkJCQkJICAgYk9iZFN1YmluZGV4LAorCQkJCQkJCSAgICZwRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICBtX1ByZXMuCisJCQkJCQkJICAgbV9sZV9hYlBheWxvYWRbKHdCaXRPZmZzZXQgPj4gMyldLCBPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJfQorCisJCQkvLyBwcm9jZXNzaW5nIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQorCQkJZ290byBFeGl0OworCQl9CisJCWJyZWFrOworCisJY2FzZSBrRXBsRXZlbnRUeXBlUGRvVHg6CS8vIFRQRE8gdHJhbnNtaXR0ZWQKKwkJcEZyYW1lSW5mbyA9ICh0RXBsRnJhbWVJbmZvICopIHBFdmVudF9wLT5tX3BBcmc7CisJCXBGcmFtZSA9IHBGcmFtZUluZm8tPm1fcEZyYW1lOworCisJCS8vIHNldCBUUERPIGludmFsaWQsIHNvIHRoYXQgb25seSBmdWxseSBwcm9jZXNzZWQgVFBET3MgYXJlIHNlbnQgYXMgdmFsaWQKKwkJYkZyYW1lRGF0YSA9CisJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iRmxhZzEpOworCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfYkZsYWcxLAorCQkJICAgICAgIChiRnJhbWVEYXRhICYgfkVQTF9GUkFNRV9GTEFHMV9SRCkpOworCisJCS8vIHJldHJpZXZlIEVQTCBtZXNzYWdlIHR5cGUKKwkJTXNnVHlwZSA9IEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iTWVzc2FnZVR5cGUpOworCQlpZiAoTXNnVHlwZSA9PSBrRXBsTXNnVHlwZVByZXMpIHsJLy8gVFBETyBpcyBQUmVzIGZyYW1lCisJCQl1aU5vZGVJZCA9IEVQTF9QRE9fUFJFU19OT0RFX0lEOwkvLyAweDAwCisJCX0gZWxzZSB7CS8vIFRQRE8gaXMgUFJlcSBmcmFtZQorCQkJLy8gcmV0cmlldmUgbm9kZSBJRAorCQkJdWlOb2RlSWQgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYkRzdE5vZGVJZCk7CisJCX0KKworCQkvLyBzZWFyY2ggZm9yIGFwcHJvcHJpYXRlIHZhbGlkIFRQRE8gaW4gT0QKKwkJd09iZE1hcHBJbmRleCA9IEVQTF9QRE9LX09CRF9JRFhfVFhfTUFQUF9QQVJBTTsKKwkJd09iZENvbW1JbmRleCA9IEVQTF9QRE9LX09CRF9JRFhfVFhfQ09NTV9QQVJBTTsKKwkJZm9yICh3UGRvSWQgPSAwOzsgd1Bkb0lkKyssIHdPYmRDb21tSW5kZXgrKywgd09iZE1hcHBJbmRleCsrKSB7CisJCQlPYmRTaXplID0gMTsKKwkJCS8vIHJlYWQgbm9kZSBJRCBmcm9tIE9ECisJCQlSZXQgPQorCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkQ29tbUluZGV4LCAweDAxLCAmYk9iZERhdGEsCisJCQkJCSAgICAmT2JkU2l6ZSk7CisJCQlpZiAoKFJldCA9PSBrRXBsT2JkSW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZElsbGVnYWxQYXJ0KSkgewkvLyBQRE8gZG9lcyBub3QgZXhpc3Q7IGxhc3QgUERPIHJlYWNoZWQKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwkJCWlmIChiT2JkRGF0YSAhPSB1aU5vZGVJZCkgewkvLyBub2RlIElEIGRvZXMgbm90IGVxdWFsIC0gd3JvbmcgUERPLCB0cnkgbmV4dCBQRE8gaW4gT0QKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCU9iZFNpemUgPSAxOworCQkJLy8gcmVhZCBudW1iZXIgb2YgbWFwcGVkIG9iamVjdHMgZnJvbSBPRDsgdGhpcyBpbmRpY2F0ZXMgaWYgdGhlIFBETyBpcyB2YWxpZAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZE1hcHBJbmRleCwgMHgwMCwgJmJPYmplY3RDb3VudCwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmICgoUmV0ID09IGtFcGxPYmRJbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkSWxsZWdhbFBhcnQpKSB7CS8vIFBETyBkb2VzIG5vdCBleGlzdDsgbGFzdCBQRE8gcmVhY2hlZAorCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCQkJaWYgKGJPYmplY3RDb3VudCA9PSAwKSB7CS8vIFBETyBpbiBPRCBub3QgdmFsaWQsIHRyeSBuZXh0IFBETyBpbiBPRAorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gdmFsaWQgVFBETyBmb3VuZAorCisJCQlPYmRTaXplID0gMTsKKwkJCS8vIGdldCBQRE8gbWFwcGluZyB2ZXJzaW9uIGZyb20gT0QKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRDb21tSW5kZXgsIDB4MDIsICZiT2JkRGF0YSwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGVudHJ5IHJlYWQgc3VjY2Vzc2Z1bGx5CisJCQkvLyBzZXQgUERPIHZlcnNpb24gaW4gZnJhbWUKKwkJCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iUGRvVmVyc2lvbiwKKwkJCQkgICAgICAgYk9iZERhdGEpOworCisJCQkvLyBjYWxjdWxhdGUgUERPIHNpemUKKwkJCXdQZG9TaXplID0gMDsKKworCQkJLy8gcHJvY2VzcyBtYXBwaW5nCisJCQlmb3IgKGJNYXBwU3ViaW5kZXggPSAxOyBiTWFwcFN1YmluZGV4IDw9IGJPYmplY3RDb3VudDsKKwkJCSAgICAgYk1hcHBTdWJpbmRleCsrKSB7CisJCQkJT2JkU2l6ZSA9IDg7CS8vIFFXT1JECisJCQkJLy8gcmVhZCBvYmplY3QgbWFwcGluZyBmcm9tIE9ECisJCQkJUmV0ID0KKwkJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRNYXBwSW5kZXgsCisJCQkJCQkgICAgYk1hcHBTdWJpbmRleCwKKwkJCQkJCSAgICAmcXdPYmplY3RNYXBwaW5nLCAmT2JkU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gY2hlY2sgaWYgb2JqZWN0IG1hcHBpbmcgZW50cnkgaXMgdmFsaWQsIGkuZS4gdW5lcXVhbCB6ZXJvLCBiZWNhdXNlICJlbXB0eSIgZW50cmllcyBhcmUgYWxsb3dlZAorCQkJCWlmIChxd09iamVjdE1hcHBpbmcgPT0gMCkgewkvLyBpbnZhbGlkIGVudHJ5LCBjb250aW51ZSB3aXRoIG5leHQgZW50cnkKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vIGRlY29kZSBvYmplY3QgbWFwcGluZworCQkJCXdPYmRDb21tSW5kZXggPQorCQkJCSAgICAoV09SRCkgKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAweDAwMDAwMDAwMDAwMEZGRkZMTCk7CisJCQkJYk9iZFN1YmluZGV4ID0KKwkJCQkgICAgKEJZVEUpICgocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgICAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPj4gMTYpOworCQkJCXdCaXRPZmZzZXQgPQorCQkJCSAgICAoV09SRCkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4MDAwMEZGRkYwMDAwMDAwMExMKSA+PiAzMik7CisJCQkJd0JpdFNpemUgPQorCQkJCSAgICAoV09SRCkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4RkZGRjAwMDAwMDAwMDAwMExMKSA+PiA0OCk7CisKKwkJCQkvLyBjYWxjdWxhdGUgbWF4IFBETyBzaXplCisJCQkJT2JkU2l6ZSA9IHdCaXRTaXplID4+IDM7CisJCQkJd1ZhclNpemUgPSAod0JpdE9mZnNldCA+PiAzKSArIChXT1JEKSBPYmRTaXplOworCQkJCWlmICgodW5zaWduZWQgaW50KSh3VmFyU2l6ZSArIDI0KSA+IHBGcmFtZUluZm8tPm1fdWlGcmFtZVNpemUpIHsJLy8gVFBETyBpcyB0b28gc2hvcnQKKwkJCQkJLy8gJCQkIHJhaXNlIFBETyBlcnJvciwgc2V0IFJldAorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWlmICh3VmFyU2l6ZSA+IHdQZG9TaXplKSB7CS8vIG1lbW9yaXplIG5ldyBQRE8gc2l6ZQorCQkJCQl3UGRvU2l6ZSA9IHdWYXJTaXplOworCQkJCX0KKwkJCQkvLyBjb3B5IG9iamVjdCBmcm9tIHByb2Nlc3MvT0QgdmFyaWFibGUgdG8gVFBETworCQkJCVJldCA9CisJCQkJICAgIEVwbE9iZFJlYWRFbnRyeVRvTGUod09iZENvbW1JbmRleCwKKwkJCQkJCQliT2JkU3ViaW5kZXgsCisJCQkJCQkJJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCQltX2xlX2FiUGF5bG9hZFsod0JpdE9mZnNldCA+PiAzKV0sICZPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJfQorCisJCQkvLyBzZXQgUERPIHNpemUgaW4gZnJhbWUKKwkJCUFtaVNldFdvcmRUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV93U2l6ZSwKKwkJCQkgICAgICAgd1Bkb1NpemUpOworCisJCQlSZXQgPSBFcGxQZG9rQ2FsQXJlVHBkb3NWYWxpZCgmZlZhbGlkKTsKKwkJCWlmIChmVmFsaWQgIT0gRkFMU0UpIHsKKwkJCQkvLyBzZXQgVFBETyB2YWxpZAorCQkJCWJGcmFtZURhdGEgPQorCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgIG1fbGVfYkZsYWcxKTsKKwkJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsCisJCQkJCSAgICAgICAoYkZyYW1lRGF0YSB8CisJCQkJCQlFUExfRlJBTUVfRkxBRzFfUkQpKTsKKwkJCX0KKwkJCS8vIHByb2Nlc3NpbmcgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5CisKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbEV2ZW50VHlwZVBkb1NvYToJLy8gU29BIHJlY2VpdmVkCisKKwkJLy8gaW52YWxpZGF0ZSBUUERPcworCQlSZXQgPSBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZChGQUxTRSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJeworCQkJQVNTRVJUTVNHKEZBTFNFLAorCQkJCSAgIkVwbFBkb2tQcm9jZXNzKCk6IHVuaGFuZGxlZCBldmVudCB0eXBlIVxuIik7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rQ2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb2tDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDRjNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rQ2FsLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3Iga2VybmVsIFBETyBDb21tdW5pY2F0aW9uIEFic3RyYWN0aW9uIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkb2tDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI3IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxQZG9rQ2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MIG1fZlRwZG9zVmFsaWQ7CisKK30gdEVwbFBkb2tDYWxJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsUGRva0NhbEluc3RhbmNlIEVwbFBkb2tDYWxJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYWxBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbEFkZEluc3RhbmNlKHZvaWQpCit7CisKKwlFUExfTUVNU0VUKCZFcGxQZG9rQ2FsSW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbFBkb2tDYWxJbnN0YW5jZV9nKSk7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYWxEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbERlbEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYWxTZXRUcGRvc1ZhbGlkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB2YWxpZGl0eSBmbGFnIGZvciBUUERPcyB0byB0aGUKKy8vICAgICAgICAgICAgICBzcGVjaWZpZWQgdmFsdWUuCisvLworLy8gUGFyYW1ldGVyczogIGZWYWxpZF9wICAgICAgICAgICAgICAgID0gdmFsaWRpdHkgZmxhZworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZChCT09MIGZWYWxpZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFcGxQZG9rQ2FsSW5zdGFuY2VfZy5tX2ZUcGRvc1ZhbGlkID0gZlZhbGlkX3A7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rQ2FsQXJlVHBkb3NWYWxpZCgpCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsaWRpdHkgZmxhZyBmb3IgVFBET3MuCisvLworLy8gUGFyYW1ldGVyczogIHBmVmFsaWRfcCAgICAgICAgICAgICAgID0gT1VUOiB2YWxpZGl0eSBmbGFnCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYWxBcmVUcGRvc1ZhbGlkKEJPT0wgKiBwZlZhbGlkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCSpwZlZhbGlkX3AgPSBFcGxQZG9rQ2FsSW5zdGFuY2VfZy5tX2ZUcGRvc1ZhbGlkOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb3UuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRvdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YjEwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb3UuYwpAQCAtMCwwICsxLDU2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciB1c2VyIFBETyBtb2R1bGUKKyAgICAgICAgICAgICAgICBDdXJyZW50bHksIHRoaXMgbW9kdWxlIGp1c3QgaW1wbGVtZW50cyBhIE9EIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgdG8gY2hlY2sgaWYgdGhlIFBETyBjb25maWd1cmF0aW9uIGlzIHZhbGlkLgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkb3UuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorLy8jaW5jbHVkZSAidXNlci9FcGxQZG91Q2FsLmgiCisjaW5jbHVkZSAidXNlci9FcGxPYmR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxQZG91LmgiCisjaW5jbHVkZSAiRXBsU2RvQWMuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPVSkpICE9IDApCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSA9PSAwKSAmJiAoRVBMX09CRF9VU0VfS0VSTkVMID09IEZBTFNFKQorI2Vycm9yICJFUEwgUERPdSBtb2R1bGUgbmVlZHMgRVBMIG1vZHVsZSBPQkRVIG9yIE9CREshIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfUlhfQ09NTV9QQVJBTSAgMHgxNDAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfUlhfTUFQUF9QQVJBTSAgMHgxNjAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfVFhfQ09NTV9QQVJBTSAgMHgxODAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfVFhfTUFQUF9QQVJBTSAgMHgxQTAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfTUFQUF9QQVJBTSAgICAgMHgwMjAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfTUFTSyAgICAgICAgICAgMHhGRjAwCisjZGVmaW5lIEVQTF9QRE9VX1BET19JRF9NQVNLICAgICAgICAgICAgMHgwMEZGCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsUGRvdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFBkb3VDaGVja1Bkb1ZhbGlkaXR5KHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wLAorCQkJCQkgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApOworCitzdGF0aWMgdm9pZCBFcGxQZG91RGVjb2RlT2JqZWN0TWFwcGluZyhRV09SRCBxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlJbmRleF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aVN1YkluZGV4X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpQml0T2Zmc2V0X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpQml0U2l6ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsUGRvdUNoZWNrT2JqZWN0TWFwcGluZyhRV09SRCBxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkJICAgIHRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZV9wLAorCQkJCQkgICAgRFdPUkQgKiBwZHdBYm9ydENvZGVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCAqcHVpUGRvU2l6ZV9wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRvdUFkZEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRvdURlbEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VDYk9iZEFjY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgT0QgYWNjZXNzZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBhcmFtX3AgICAgICAgICAgICAgICAgPSBPQkQgcGFyYW1ldGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxQZG91Q2JPYmRBY2Nlc3ModEVwbE9iZENiUGFyYW0gTUVNICogcFBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlQZG9JZDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleFR5cGU7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGJPYmplY3RDb3VudDsKKwlRV09SRCBxd09iamVjdE1hcHBpbmc7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3NUeXBlOworCUJZVEUgYk1hcHBTdWJpbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlDdXJQZG9TaXplOworCVdPUkQgd01heFBkb1NpemU7CisJdW5zaWduZWQgaW50IHVpU3ViSW5kZXg7CisKKwkvLyBmZXRjaCBQRE8gSUQKKwl1aVBkb0lkID0gcFBhcmFtX3AtPm1fdWlJbmRleCAmIEVQTF9QRE9VX1BET19JRF9NQVNLOworCisJLy8gZmV0Y2ggb2JqZWN0IGluZGV4IHR5cGUKKwl1aUluZGV4VHlwZSA9IHBQYXJhbV9wLT5tX3VpSW5kZXggJiBFUExfUERPVV9PQkRfSURYX01BU0s7CisKKwlpZiAocFBhcmFtX3AtPm1fT2JkRXZlbnQgIT0ga0VwbE9iZEV2UHJlV3JpdGUpIHsJLy8gcmVhZCBhY2Nlc3NlcywgcG9zdCB3cml0ZSBldmVudHMgZXRjLiBhcmUgT0sKKwkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPSAwOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGluZGV4IHR5cGUKKwlzd2l0Y2ggKHVpSW5kZXhUeXBlKSB7CisJY2FzZSBFUExfUERPVV9PQkRfSURYX1JYX0NPTU1fUEFSQU06CisJCS8vIFJQRE8gY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXIgYWNjZXNzZWQKKwljYXNlIEVQTF9QRE9VX09CRF9JRFhfVFhfQ09NTV9QQVJBTToKKwkJewkJLy8gVFBETyBjb21tdW5pY2F0aW9uIHBhcmFtZXRlciBhY2Nlc3NlZAorCQkJUmV0ID0gRXBsUGRvdUNoZWNrUGRvVmFsaWRpdHkocFBhcmFtX3AsCisJCQkJCQkgICAgICAoRVBMX1BET1VfT0JEX0lEWF9NQVBQX1BBUkFNCisJCQkJCQkgICAgICAgfCBwUGFyYW1fcC0+bV91aUluZGV4KSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIFBETyBpcyB2YWxpZCBvciBkb2VzIG5vdCBleGlzdAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIEVQTF9QRE9VX09CRF9JRFhfUlhfTUFQUF9QQVJBTToKKwkJewkJLy8gUlBETyBtYXBwaW5nIHBhcmFtZXRlciBhY2Nlc3NlZAorCisJCQlBY2Nlc3NUeXBlID0ga0VwbE9iZEFjY1dyaXRlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgRVBMX1BET1VfT0JEX0lEWF9UWF9NQVBQX1BBUkFNOgorCQl7CQkvLyBUUERPIG1hcHBpbmcgcGFyYW1ldGVyIGFjY2Vzc2VkCisKKwkJCUFjY2Vzc1R5cGUgPSBrRXBsT2JkQWNjUmVhZDsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CQkvLyB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIG9ubHkgZm9yCisJCQkvLyBQRE8gbWFwcGluZyBhbmQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzCisJCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gUlBETyBhbmQgVFBETyBtYXBwaW5nIHBhcmFtZXRlciBhY2Nlc3NlZAorCisJaWYgKHBQYXJhbV9wLT5tX3VpU3ViSW5kZXggPT0gMCkgewkvLyBvYmplY3QgbWFwcGluZyBjb3VudCBhY2Nlc3NlZAorCisJCS8vIFBETyBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisJCWJPYmplY3RDb3VudCA9ICooKEJZVEUgKikgcFBhcmFtX3AtPm1fcEFyZyk7CisKKwkJaWYgKGJPYmplY3RDb3VudCA9PSAwKSB7CS8vIFBETyBzaGFsbCBiZSBkaXNhYmxlZAorCisJCQkvLyB0aGF0IGlzIGFsd2F5cyBwb3NzaWJsZQorCQkJZ290byBFeGl0OworCQl9CisJCS8vIFBETyBzaGFsbCBiZSBlbmFibGVkCisJCS8vIGl0IHNob3VsZCBoYXZlIGJlZW4gZGlzYWJsZWQgZm9yIHRoaXMgb3BlcmF0aW9uCisJCVJldCA9IEVwbFBkb3VDaGVja1Bkb1ZhbGlkaXR5KHBQYXJhbV9wLCBwUGFyYW1fcC0+bV91aUluZGV4KTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBQRE8gaXMgdmFsaWQgb3IgZG9lcyBub3QgZXhpc3QKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCWlmIChBY2Nlc3NUeXBlID09IGtFcGxPYmRBY2NXcml0ZSkgeworCQkJdWlTdWJJbmRleCA9IDB4MDQ7CS8vIFBSZXFBY3RQYXlsb2FkTGltaXRfVTE2CisJCX0gZWxzZSB7CisJCQl1aVN1YkluZGV4ID0gMHgwNTsJLy8gUFJlc0FjdFBheWxvYWRMaW1pdF9VMTYKKwkJfQorCisJCS8vIGZldGNoIG1heGltdW0gUERPIHNpemUgZnJvbSBPYmplY3QgMUY5OGg6IE5NVF9DeWNsZVRpbWluZ19SRUMKKwkJT2JkU2l6ZSA9IHNpemVvZih3TWF4UGRvU2l6ZSk7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY5OCwgdWlTdWJJbmRleCwgJndNYXhQZG9TaXplLAorCQkJCSAgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gY2hlY2sgYWxsIG9iamVjdG1hcHBpbmdzCisJCWZvciAoYk1hcHBTdWJpbmRleCA9IDE7IGJNYXBwU3ViaW5kZXggPD0gYk9iamVjdENvdW50OworCQkgICAgIGJNYXBwU3ViaW5kZXgrKykgeworCQkJLy8gcmVhZCBvYmplY3QgbWFwcGluZyBmcm9tIE9ECisJCQlPYmRTaXplID0gc2l6ZW9mKHF3T2JqZWN0TWFwcGluZyk7CS8vIFFXT1JECisJCQlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KHBQYXJhbV9wLT5tX3VpSW5kZXgsCisJCQkJCSAgICAgICBiTWFwcFN1YmluZGV4LCAmcXdPYmplY3RNYXBwaW5nLAorCQkJCQkgICAgICAgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBjaGVjayBvYmplY3QgbWFwcGluZworCQkJUmV0ID0gRXBsUGRvdUNoZWNrT2JqZWN0TWFwcGluZyhxd09iamVjdE1hcHBpbmcsCisJCQkJCQkJQWNjZXNzVHlwZSwKKwkJCQkJCQkmcFBhcmFtX3AtPgorCQkJCQkJCW1fZHdBYm9ydENvZGUsCisJCQkJCQkJJnVpQ3VyUGRvU2l6ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGlsbGVnYWwgb2JqZWN0IG1hcHBpbmcKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmICh1aUN1clBkb1NpemUgPiB3TWF4UGRvU2l6ZSkgewkvLyBtYXBwaW5nIGV4Y2VlZHMgb2JqZWN0IHNpemUKKwkJCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJCVJldCA9IGtFcGxQZG9WYXJOb3RGb3VuZDsKKwkJCX0KKworCQl9CisKKwl9IGVsc2UgewkJLy8gT2JqZWN0TWFwcGluZworCQlSZXQgPSBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eShwUGFyYW1fcCwgcFBhcmFtX3AtPm1fdWlJbmRleCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gUERPIGlzIHZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gY2hlY2sgZXhpc3RlbmNlIG9mIG9iamVjdCBhbmQgdmFsaWRpdHkgb2Ygb2JqZWN0IGxlbmd0aAorCisJCXF3T2JqZWN0TWFwcGluZyA9ICooKFFXT1JEICopIHBQYXJhbV9wLT5tX3BBcmcpOworCisJCVJldCA9IEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcocXdPYmplY3RNYXBwaW5nLAorCQkJCQkJQWNjZXNzVHlwZSwKKwkJCQkJCSZwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSwKKwkJCQkJCSZ1aUN1clBkb1NpemUpOworCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVjayBpZiBQRE8gaXMgdmFsaWQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBhcmFtX3AgICAgICAgICAgICAgICAgPSBPQkQgcGFyYW1ldGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eSh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGJPYmplY3RDb3VudDsKKworCU9iZFNpemUgPSAxOworCS8vIHJlYWQgbnVtYmVyIG9mIG1hcHBlZCBvYmplY3RzIGZyb20gT0Q7IHRoaXMgaW5kaWNhdGVzIGlmIHRoZSBQRE8gaXMgdmFsaWQKKwlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KHVpSW5kZXhfcCwgMHgwMCwgJmJPYmplY3RDb3VudCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9CisJCSAgICBFUExfU0RPQUNfR0VOX0lOVEVSTkFMX0lOQ09NUEFUSUJJTElUWTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCWlmIChiT2JqZWN0Q291bnQgIT0gMCkgewkvLyBQRE8gaW4gT0QgaXMgc3RpbGwgdmFsaWQKKwkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfR0VOX1BBUkFNX0lOQ09NUEFUSUJJTElUWTsKKwkJUmV0ID0ga0VwbFBkb05vdEV4aXN0OworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VEZWNvZGVPYmplY3RNYXBwaW5nCisvLworLy8gRGVzY3JpcHRpb246IGRlY29kZXMgdGhlIGdpdmVuIG9iamVjdCBtYXBwaW5nIGVudHJ5IGludG8gaW5kZXgsIHN1YmluZGV4LAorLy8gICAgICAgICAgICAgIGJpdCBvZmZzZXQgYW5kIGJpdCBzaXplLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBxd09iamVjdE1hcHBpbmdfcCAgICAgICA9IG9iamVjdCBtYXBwaW5nIGVudHJ5CisvLyAgICAgICAgICAgICAgcHVpSW5kZXhfcCAgICAgICAgICAgICAgPSBbT1VUXSBwb2ludGVyIHRvIG9iamVjdCBpbmRleAorLy8gICAgICAgICAgICAgIHB1aVN1YkluZGV4X3AgICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBzdWJpbmRleAorLy8gICAgICAgICAgICAgIHB1aUJpdE9mZnNldF9wICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBiaXQgb2Zmc2V0CisvLyAgICAgICAgICAgICAgcHVpQml0U2l6ZV9wICAgICAgICAgICAgPSBbT1VUXSBwb2ludGVyIHRvIGJpdCBzaXplCisvLworLy8gUmV0dXJuczogICAgICh2b2lkKQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEVwbFBkb3VEZWNvZGVPYmplY3RNYXBwaW5nKFFXT1JEIHF3T2JqZWN0TWFwcGluZ19wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aUluZGV4X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpU3ViSW5kZXhfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlCaXRPZmZzZXRfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlCaXRTaXplX3ApCit7CisJKnB1aUluZGV4X3AgPSAodW5zaWduZWQgaW50KQorCSAgICAocXdPYmplY3RNYXBwaW5nX3AgJiAweDAwMDAwMDAwMDAwMEZGRkZMTCk7CisKKwkqcHVpU3ViSW5kZXhfcCA9ICh1bnNpZ25lZCBpbnQpCisJICAgICgocXdPYmplY3RNYXBwaW5nX3AgJiAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPj4gMTYpOworCisJKnB1aUJpdE9mZnNldF9wID0gKHVuc2lnbmVkIGludCkKKwkgICAgKChxd09iamVjdE1hcHBpbmdfcCAmIDB4MDAwMEZGRkYwMDAwMDAwMExMKSA+PiAzMik7CisKKwkqcHVpQml0U2l6ZV9wID0gKHVuc2lnbmVkIGludCkKKwkgICAgKChxd09iamVjdE1hcHBpbmdfcCAmIDB4RkZGRjAwMDAwMDAwMDAwMExMKSA+PiA0OCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRvdUNoZWNrT2JqZWN0TWFwcGluZworLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVja3MgdGhlIGdpdmVuIG9iamVjdCBtYXBwaW5nIGVudHJ5LgorLy8KKy8vIFBhcmFtZXRlcnM6ICBxd09iamVjdE1hcHBpbmdfcCAgICAgICA9IG9iamVjdCBtYXBwaW5nIGVudHJ5CisvLyAgICAgICAgICAgICAgQWNjZXNzVHlwZV9wICAgICAgICAgICAgPSBhY2Nlc3MgdHlwZSB0byBtYXBwZWQgb2JqZWN0OgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgPSBSUERPIGFuZCByZWFkID0gVFBETworLy8gICAgICAgICAgICAgIHB1aVBkb1NpemVfcCAgICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBjb3ZlcmVkIFBETyBzaXplCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ICsgc2l6ZSkgaW4gYnl0ZTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaWYgbWFwcGluZyBmYWlsZWQKKy8vICAgICAgICAgICAgICBwZHdBYm9ydENvZGVfcCAgICAgICAgICA9IFtPVVRdIHBvaW50ZXIgdG8gU0RPIGFib3J0IGNvZGU7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG1hcHBpbmcgaXMgcG9zc2libGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsUGRvdUNoZWNrT2JqZWN0TWFwcGluZyhRV09SRCBxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkJICAgIHRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZV9wLAorCQkJCQkgICAgRFdPUkQgKiBwZHdBYm9ydENvZGVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCAqcHVpUGRvU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlTdWJJbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlCaXRPZmZzZXQ7CisJdW5zaWduZWQgaW50IHVpQml0U2l6ZTsKKwl0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGU7CisJQk9PTCBmTnVtZXJpY2FsOworCisJaWYgKHF3T2JqZWN0TWFwcGluZ19wID09IDApIHsJLy8gZGlzY2FyZCB6ZXJvIHZhbHVlCisJCSpwdWlQZG9TaXplX3AgPSAwOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGRlY29kZSBvYmplY3QgbWFwcGluZworCUVwbFBkb3VEZWNvZGVPYmplY3RNYXBwaW5nKHF3T2JqZWN0TWFwcGluZ19wLAorCQkJCSAgICZ1aUluZGV4LAorCQkJCSAgICZ1aVN1YkluZGV4LCAmdWlCaXRPZmZzZXQsICZ1aUJpdFNpemUpOworCisJaWYgKCh1aUJpdE9mZnNldCAmIDB4NykgIT0gMHgwKSB7CS8vIGJpdCBtYXBwaW5nIGlzIG5vdCBzdXBwb3J0ZWQKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCVJldCA9IGtFcGxQZG9HcmFudWxhcml0eU1pc21hdGNoOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKCh1aUJpdFNpemUgJiAweDcpICE9IDB4MCkgewkvLyBiaXQgbWFwcGluZyBpcyBub3Qgc3VwcG9ydGVkCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQlSZXQgPSBrRXBsUGRvR3JhbnVsYXJpdHlNaXNtYXRjaDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBhY2Nlc3MgdHlwZQorCVJldCA9IEVwbE9iZHVHZXRBY2Nlc3NUeXBlKHVpSW5kZXgsIHVpU3ViSW5kZXgsICZBY2Nlc3NUeXBlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX09CSkVDVF9OT1RfRVhJU1Q7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKEFjY2Vzc1R5cGUgJiBrRXBsT2JkQWNjUGRvKSA9PSAwKSB7CS8vIG9iamVjdCBpcyBub3QgbWFwcGFibGUKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX09CSkVDVF9OT1RfTUFQUEFCTEU7CisJCVJldCA9IGtFcGxQZG9WYXJOb3RGb3VuZDsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgoQWNjZXNzVHlwZSAmIEFjY2Vzc1R5cGVfcCkgPT0gMCkgewkvLyBvYmplY3QgaXMgbm90IHdyaXRlYWJsZSAoUlBETykgb3IgcmVhZGFibGUgKFRQRE8pIHJlc3BlY3RpdmVseQorCQkqcGR3QWJvcnRDb2RlX3AgPSBFUExfU0RPQUNfT0JKRUNUX05PVF9NQVBQQUJMRTsKKwkJUmV0ID0ga0VwbFBkb1Zhck5vdEZvdW5kOworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IEVwbE9iZHVHZXREYXRhU2l6ZSh1aUluZGV4LCB1aVN1YkluZGV4KTsKKwlpZiAoT2JkU2l6ZSA8ICh1aUJpdFNpemUgPj4gMykpIHsJLy8gb2JqZWN0IGRvZXMgbm90IGV4aXN0IG9yIGhhcyBzbWFsbGVyIHNpemUKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCVJldCA9IGtFcGxQZG9WYXJOb3RGb3VuZDsKKwl9CisKKwlSZXQgPSBFcGxPYmR1SXNOdW1lcmljYWwodWlJbmRleCwgdWlTdWJJbmRleCwgJmZOdW1lcmljYWwpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZW50cnkgZG9lc24ndCBleGlzdAorCQkqcGR3QWJvcnRDb2RlX3AgPSBFUExfU0RPQUNfT0JKRUNUX05PVF9FWElTVDsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgoZk51bWVyaWNhbCAhPSBGQUxTRSkKKwkgICAgJiYgKCh1aUJpdFNpemUgPj4gMykgIT0gT2JkU2l6ZSkpIHsKKwkJLy8gb2JqZWN0IGlzIG51bWVyaWNhbCwKKwkJLy8gdGhlcmVmb3Igc2l6ZSBoYXMgdG8gZml0LCBidXQgaXQgZG9lcyBub3QuCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQlSZXQgPSBrRXBsUGRvVmFyTm90Rm91bmQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2FsdWNhbGVkIG5lZWRlZCBQRE8gc2l6ZQorCSpwdWlQZG9TaXplX3AgPSAodWlCaXRPZmZzZXQgPj4gMykgKyAodWlCaXRTaXplID4+IDMpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyNlbmRpZiAvLyAjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9VKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkby5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2IzZjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG8uaApAQCAtMCwwICsxLDI0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgYXBpIGZ1bmN0aW9uIG9mIHRoZSBzZG8gbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJFcGxGcmFtZS5oIgorI2luY2x1ZGUgIkVwbFNkb0FjLmgiCisKKyNpZm5kZWYgX0VQTFNET19IXworI2RlZmluZSBfRVBMU0RPX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIGRlZmluZXMKKyNpZm5kZWYgRVBMX1NET19NQVhfUEFZTE9BRAorI2RlZmluZSBFUExfU0RPX01BWF9QQVlMT0FEICAgICAyNTYKKyNlbmRpZgorCisvLyBoYW5kbGUgYmV0d2VlbiBQcm90b2NvbCBBYnN0cmFjdGlvbiBMYXllciBhbmQgYXN5bmNocm9ub3VzIFNETyBTZXF1ZW5jZSBMYXllcgorI2RlZmluZSBFUExfU0RPX1VEUF9IQU5ETEUgICAgICAweDgwMDAKKyNkZWZpbmUgRVBMX1NET19BU05EX0hBTkRMRSAgICAgMHg0MDAwCisjZGVmaW5lIEVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLIDB4QzAwMAorI2RlZmluZSBFUExfU0RPX0FTWV9JTlZBTElEX0hETCAweDNGRkYKKworLy8gaGFuZGxlIGJldHdlZW4gIFNETyBTZXF1ZW5jZSBMYXllciBhbmQgc2RvIGNvbW1hbmQgbGF5ZXIKKyNkZWZpbmUgRVBMX1NET19BU1lfSEFORExFICAgICAgMHg4MDAwCisjZGVmaW5lIEVQTF9TRE9fUERPX0hBTkRMRSAgICAgIDB4NDAwMAorI2RlZmluZSBFUExfU0RPX1NFUV9IQU5ETEVfTUFTSyAweEMwMDAKKyNkZWZpbmUgRVBMX1NET19TRVFfSU5WQUxJRF9IREwgMHgzRkZGCisKKyNkZWZpbmUgRVBMX0FTTkRfSEVBREVSX1NJWkUgICAgICAgIDQKKy8vI2RlZmluZSBFUExfU0VRX0hFQURFUl9TSVpFICAgICAgICAgNAorI2RlZmluZSBFUExfRVRIRVJORVRfSEVBREVSX1NJWkUgICAgMTQKKworI2RlZmluZSBFUExfU0VRX05VTV9NQVNLICAgICAgICAgICAgMHhGQworCisvLyBzaXplIGZvciBzZW5kIGJ1ZmZlciBhbmQgaGlzdG9yeQorI2RlZmluZSBFUExfTUFYX1NET19GUkFNRV9TSVpFICAgICAgRVBMX0NfSVBfTUlOX01UVQorLy8gc2l6ZSBmb3IgcmVjZWl2ZSBmcmFtZQorLy8gLT4gbmVlZGVkIGJlY2F1c2UgU05ELUtpdCBzZW5kcyB1cCB0byAxNTE4IEJ5dGUKKy8vICAgIHdpdGhvdXQgU2RvLUNvbW1hbmQ6IE1heGltdW0gU2VnbWVudCBTaXplCisjZGVmaW5lIEVQTF9NQVhfU0RPX1JFQ19GUkFNRV9TSVpFICBFUExfQ19JUF9NQVhfTVRVCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaGFuZGxlIGJldHdlZW4gUHJvdG9jb2wgQWJzdHJhY3Rpb24gTGF5ZXIgYW5kIGFzeW5jaHJvbnV1cyBTRE8gU2VxdWVuY2UgTGF5ZXIKK3R5cGVkZWYgdW5zaWduZWQgaW50IHRFcGxTZG9Db25IZGw7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIFByb3RvY29sIEFic3RyYWN0aW9uIExheWVyIHRvIGNhbGwKKy8vIGFzeW5jaHJvbnV1cyBTRE8gU2VxdWVuY2UgTGF5ZXIKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsU2VxdUxheWVyUmVjZWl2ZUNiKSAodEVwbFNkb0NvbkhkbCBDb25IZGxfcCwKKwkJCQkJCSAgICAgdEVwbEFzeVNkb1NlcSAqCisJCQkJCQkgICAgIHBTZG9TZXFEYXRhX3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApOworCisvLyBoYW5kbGUgYmV0d2VlbiBhc3luY2hyb251dXMgU0RPIFNlcXVlbmNlIExheWVyIGFuZCBTRE8gQ29tbWFuZCBsYXllcgordHlwZWRlZiB1bnNpZ25lZCBpbnQgdEVwbFNkb1NlcUNvbkhkbDsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBmb3IgYXN5bmNocm9udXVzIFNETyBTZXF1ZW5jZSBMYXllciB0byBjYWxsCisvLyBTRE8gQ29tbWFuZCBsYXllciBmb3IgcmVjZWl2ZWQgZGF0YQordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqCisJCSAgIHRFcGxTZG9Db21SZWNlaXZlQ2IpICh0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCQkgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCwKKwkJCQkJIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApOworCisvLyBzdGF0dXMgb2YgY29ubmVjdGlvbgordHlwZWRlZiBlbnVtIHsKKwlrQXN5U2RvQ29uU3RhdGVDb25uZWN0ZWQgPSAweDAwLAorCWtBc3lTZG9Db25TdGF0ZUluaXRFcnJvciA9IDB4MDEsCisJa0FzeVNkb0NvblN0YXRlQ29uQ2xvc2VkID0gMHgwMiwKKwlrQXN5U2RvQ29uU3RhdGVBY2tSZWNlaXZlZCA9IDB4MDMsCisJa0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQgPSAweDA0LAorCWtBc3lTZG9Db25TdGF0ZVRpbWVvdXQgPSAweDA1Cit9IHRFcGxBc3lTZG9Db25TdGF0ZTsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBmb3IgYXN5bmNocm9udXVzIFNETyBTZXF1ZW5jZSBMYXllciB0byBjYWxsCisvLyBTRE8gQ29tbWFuZCBsYXllciBmb3IgY29ubmVjdGlvbiBzdGF0dXMKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsU2RvQ29tQ29uQ2IpICh0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCQkgICAgICB0RXBsQXN5U2RvQ29uU3RhdGUKKwkJCQkJICAgICAgQXN5U2RvQ29uU3RhdGVfcCk7CisKKy8vIGhhbmRsZSBiZXR3ZWVuICBTRE8gQ29tbWFuZCBsYXllciBhbmQgYXBwbGljYXRpb24KK3R5cGVkZWYgdW5zaWduZWQgaW50IHRFcGxTZG9Db21Db25IZGw7CisKKy8vIHN0YXR1cyBvZiBjb25uZWN0aW9uCit0eXBlZGVmIGVudW0geworCWtFcGxTZG9Db21UcmFuc2Zlck5vdEFjdGl2ZSA9IDB4MDAsCisJa0VwbFNkb0NvbVRyYW5zZmVyUnVubmluZyA9IDB4MDEsCisJa0VwbFNkb0NvbVRyYW5zZmVyVHhBYm9ydGVkID0gMHgwMiwKKwlrRXBsU2RvQ29tVHJhbnNmZXJSeEFib3J0ZWQgPSAweDAzLAorCWtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkID0gMHgwNCwKKwlrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQgPSAweDA1Cit9IHRFcGxTZG9Db21Db25TdGF0ZTsKKworLy8gU0RPIFNlcnZpY2VzIGFuZCBDb21tYW5kLUlkcyBmcm9tIERTIDEuMC4wIHAuMTUyCit0eXBlZGVmIGVudW0geworCWtFcGxTZG9TZXJ2aWNlTklMID0gMHgwMCwKKwlrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleCA9IDB4MDEsCisJa0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleCA9IDB4MDIKKwkgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICAvLyB0aGUgZm9sbG93aW5nIHNlcnZpY2VzIGFyZSBvcHRpb25hbCBhbmQKKwkgICAgLy8gbm90IHN1cHBvcnRlZCBub3cKKy8qCisgICAga0VwbFNkb1NlcnZpY2VXcml0ZUFsbEJ5SW5kZXggICA9IDB4MDMsCisgICAga0VwbFNkb1NlcnZpY2VSZWFkQWxsQnlJbmRleCAgICA9IDB4MDQsCisgICAga0VwbFNkb1NlcnZpY2VXcml0ZUJ5TmFtZSAgICAgICA9IDB4MDUsCisgICAga0VwbFNkb1NlcnZpY2VSZWFkQnlOYW1lICAgICAgICA9IDB4MDYsCisKKyAgICBrRXBsU2RvU2VydmljZUZpbGVXcml0ZSAgICAgICAgID0gMHgyMCwKKyAgICBrRXBsU2RvU2VydmljZUZpbGVSZWFkICAgICAgICAgID0gMHgyMSwKKworICAgIGtFcGxTZG9TZXJ2aWNlV3JpdGVNdWx0aUJ5SW5kZXggPSAweDMxLAorICAgIGtFcGxTZG9TZXJ2aWNlUmVhZE11bHRpQnlJbmRleCAgPSAweDMyLAorCisgICAga0VwbFNkb1NlcnZpY2VNYXhTZWdTaXplICAgICAgICA9IDB4NzAKKworICAgIC8vIDB4ODAgLSAweEZGIG1hbnVmYWN0dXJlciBzcGVjaWZpYworCisgKi8KK30gdEVwbFNkb1NlcnZpY2VUeXBlOworCisvLyBkZXNjcmliZXMgaWYgcmVhZCBvciB3cml0ZSBhY2Nlc3MKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb0FjY2Vzc1R5cGVSZWFkID0gMHgwMCwKKwlrRXBsU2RvQWNjZXNzVHlwZVdyaXRlID0gMHgwMQorfSB0RXBsU2RvQWNjZXNzVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvVHlwZUF1dG8gPSAweDAwLAorCWtFcGxTZG9UeXBlVWRwID0gMHgwMSwKKwlrRXBsU2RvVHlwZUFzbmQgPSAweDAyLAorCWtFcGxTZG9UeXBlUGRvID0gMHgwMworfSB0RXBsU2RvVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvVHJhbnNBdXRvID0gMHgwMCwKKwlrRXBsU2RvVHJhbnNFeHBlZGl0ZWQgPSAweDAxLAorCWtFcGxTZG9UcmFuc1NlZ21lbnRlZCA9IDB4MDIKK30gdEVwbFNkb1RyYW5zVHlwZTsKKworLy8gc3RydWN0dXJlIHRvIGluZm9ybSBhcHBsaWNhdGlvbiBhYm91dCBmaW5pc2ggb2YgU0RPIHRyYW5zZmVyCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbUNvbkhkbCBtX1Nkb0NvbUNvbkhkbDsKKwl0RXBsU2RvQ29tQ29uU3RhdGUgbV9TZG9Db21Db25TdGF0ZTsKKwlEV09SRCBtX2R3QWJvcnRDb2RlOworCXRFcGxTZG9BY2Nlc3NUeXBlIG1fU2RvQWNjZXNzVHlwZTsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gTm9kZUlkIG9mIHRoZSB0YXJnZXQKKwl1bnNpZ25lZCBpbnQgbV91aVRhcmdldEluZGV4OwkvLyBpbmRleCB3aGljaCB3YXMgYWNjZXNzZWQKKwl1bnNpZ25lZCBpbnQgbV91aVRhcmdldFN1YkluZGV4OwkvLyBzdWJpbmRleCB3aGljaCB3YXMgYWNjZXNzZWQKKwl1bnNpZ25lZCBpbnQgbV91aVRyYW5zZmVycmVkQnl0ZTsJLy8gbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkCisJdm9pZCAqbV9wVXNlckFyZzsJLy8gdXNlciBkZWZpbmFibGUgYXJndW1lbnQgcG9pbnRlcgorCit9IHRFcGxTZG9Db21GaW5pc2hlZDsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciB0byBpbmZvcm0gYXBwbGljYXRpb24gYWJvdXQgY29ubmVjdGlvbgordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxTZG9GaW5pc2hlZENiKSAodEVwbFNkb0NvbUZpbmlzaGVkICoKKwkJCQkJCXBTZG9Db21GaW5pc2hlZF9wKTsKKworLy8gc3RydWN0dXJlIHRvIGluaXQgU0RPIHRyYW5zZmVyIHRvIFJlYWQgb3IgV3JpdGUgYnkgSW5kZXgKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsU2RvQ29tQ29uSGRsIG1fU2RvQ29tQ29uSGRsOworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJpbmRleDsKKwl2b2lkICptX3BEYXRhOworCXVuc2lnbmVkIGludCBtX3VpRGF0YVNpemU7CisJdW5zaWduZWQgaW50IG1fdWlUaW1lb3V0OwkvLyBub3QgdXNlZCBpbiB0aGlzIHZlcnNpb24KKwl0RXBsU2RvQWNjZXNzVHlwZSBtX1Nkb0FjY2Vzc1R5cGU7CisJdEVwbFNkb0ZpbmlzaGVkQ2IgbV9wZm5TZG9GaW5pc2hlZENiOworCXZvaWQgKm1fcFVzZXJBcmc7CS8vIHVzZXIgZGVmaW5hYmxlIGFyZ3VtZW50IHBvaW50ZXIKKworfSB0RXBsU2RvQ29tVHJhbnNQYXJhbUJ5SW5kZXg7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FjLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwZmIzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQWMuaApAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGRlZmluaXRpb25zIGZvciBTRE8gQWJvcnQgY29kZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9BYy5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICAuLi4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzMwIGsudC46IGZpcnN0IGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTFNET0FDX0hfCisjZGVmaW5lIF9FUExTRE9BQ19IXworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTRE8gYWJvcnQgY29kZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSAgICBFUExfU0RPQUNfVElNRV9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTA0MDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1VOS05PV05fQ09NTUFORF9TUEVDSUZJRVIgICAgICAgICAgIDB4MDUwNDAwMDFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19JTlZBTElEX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgICAweDA1MDQwMDAyTAorI2RlZmluZSAgICBFUExfU0RPQUNfSU5WQUxJRF9TRVFVRU5DRV9OVU1CRVIgICAgICAgICAgICAgMHgwNTA0MDAwM0wKKyNkZWZpbmUgICAgRVBMX1NET0FDX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgIDB4MDUwNDAwMDVMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19VTlNVUFBPUlRFRF9BQ0NFU1MgICAgICAgICAgICAgICAgICAweDA2MDEwMDAwTAorI2RlZmluZSAgICBFUExfU0RPQUNfUkVBRF9UT19XUklURV9PTkxZX09CSiAgICAgICAgICAgICAgMHgwNjAxMDAwMUwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1dSSVRFX1RPX1JFQURfT05MWV9PQkogICAgICAgICAgICAgIDB4MDYwMTAwMDJMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19PQkpFQ1RfTk9UX0VYSVNUICAgICAgICAgICAgICAgICAgICAweDA2MDIwMDAwTAorI2RlZmluZSAgICBFUExfU0RPQUNfT0JKRUNUX05PVF9NQVBQQUJMRSAgICAgICAgICAgICAgICAgMHgwNjA0MDA0MUwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1BET19MRU5HVEhfRVhDRUVERUQgICAgICAgICAgICAgICAgIDB4MDYwNDAwNDJMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19HRU5fUEFSQU1fSU5DT01QQVRJQklMSVRZICAgICAgICAgICAweDA2MDQwMDQzTAorI2RlZmluZSAgICBFUExfU0RPQUNfSU5WQUxJRF9IRUFSVEJFQVRfREVDICAgICAgICAgICAgICAgMHgwNjA0MDA0NEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0dFTl9JTlRFUk5BTF9JTkNPTVBBVElCSUxJVFkgICAgICAgIDB4MDYwNDAwNDdMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19BQ0NFU1NfRkFJTEVEX0RVRV9IV19FUlJPUiAgICAgICAgICAweDA2MDYwMDAwTAorI2RlZmluZSAgICBFUExfU0RPQUNfREFUQV9UWVBFX0xFTkdUSF9OT1RfTUFUQ0ggICAgICAgICAgMHgwNjA3MDAxMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfVE9PX0hJR0ggICAgICAgICAgIDB4MDYwNzAwMTJMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19EQVRBX1RZUEVfTEVOR1RIX1RPT19MT1cgICAgICAgICAgICAweDA2MDcwMDEzTAorI2RlZmluZSAgICBFUExfU0RPQUNfU1VCX0lOREVYX05PVF9FWElTVCAgICAgICAgICAgICAgICAgMHgwNjA5MDAxMUwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX0VYQ0VFREVEICAgICAgICAgICAgICAgIDB4MDYwOTAwMzBMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19WQUxVRV9SQU5HRV9UT09fSElHSCAgICAgICAgICAgICAgICAweDA2MDkwMDMxTAorI2RlZmluZSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfVE9PX0xPVyAgICAgICAgICAgICAgICAgMHgwNjA5MDAzMkwKKyNkZWZpbmUgICAgRVBMX1NET0FDX01BWF9WQUxVRV9MRVNTX01JTl9WQUxVRSAgICAgICAgICAgIDB4MDYwOTAwMzZMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwTAorI2RlZmluZSAgICBFUExfU0RPQUNfREFUQV9OT1RfVFJBTlNGX09SX1NUT1JFRCAgICAgICAgICAgMHgwODAwMDAyMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0RBVEFfTk9UX1RSQU5TRl9EVUVfTE9DQUxfQ09OVFJPTCAgIDB4MDgwMDAwMjFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19EQVRBX05PVF9UUkFOU0ZfRFVFX0RFVklDRV9TVEFURSAgICAweDA4MDAwMDIyTAorI2RlZmluZSAgICBFUExfU0RPQUNfT0JKRUNUX0RJQ1RJT05BUllfTk9UX0VYSVNUICAgICAgICAgMHgwODAwMDAyM0wKKyNkZWZpbmUgICAgRVBMX1NET0FDX0NPTkZJR19EQVRBX0VNUFRZICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMjRMCisKKyNlbmRpZiAvLyBfRVBMU0RPQUNfSF8KKworLy8gRGllIGxldHp0ZSBaZWlsZSBtdd8gdW5iZWRpbmd0IGVpbmUgbGVlcmUgWmVpbGUgc2Vpbiwgd2VpbCBtYW5jaGUgQ29tcGlsZXIKKy8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FzbmR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FzbmR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhMDBjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQXNuZHUuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBTRE8vQXNuZC1Qcm90b2NvbGFic3RyYWN0aW9ubGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQXNuZHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA3IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0FzbmR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQKKyNkZWZpbmUgRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EIDUKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGluc3RhbmNlIHRhYmxlCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fYXVpU2RvQXNuZENvbm5lY3Rpb25bRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EXTsKKwl0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIG1fZnBTZG9Bc3lTZXFDYjsKKworfSB0RXBsU2RvQXNuZEluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFNkb0FzbmRJbnN0YW5jZSBTZG9Bc25kSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1Q2IodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVQTCBTRE8tQXNuZCBQcm90b2NvbGFic3RyYWN0aW9uIGxheWVyPiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IEVQTCBTRE8tQXNuZCBQcm90b2NvbGFic3RyYWN0aW9uIGxheWVyCisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFJlY2VpdmVDYl9wICAgID0gICBmdW5jdGlvbnBvaW50ZXIgdG8gU2RvLVNlcXVlbmNlIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay1mdW5jdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1SW5pdCh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxTZG9Bc25kdUFkZEluc3RhbmNlKGZwUmVjZWl2ZUNiX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGFkZGl0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBSZWNlaXZlQ2JfcCAgICA9ICAgZnVuY3Rpb25wb2ludGVyIHRvIFNkby1TZXF1ZW5jZSBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stZnVuY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUFkZEluc3RhbmNlKHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gaW5pdCBjb250cm9sIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJlNkb0FzbmRJbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoU2RvQXNuZEluc3RhbmNlX2cpKTsKKworCS8vIHNhdmUgcG9pbnRlciB0byBjYWxsYmFjay1mdW5jdGlvbgorCWlmIChmcFJlY2VpdmVDYl9wICE9IE5VTEwpIHsKKwkJU2RvQXNuZEluc3RhbmNlX2cubV9mcFNkb0FzeVNlcUNiID0gZnBSZWNlaXZlQ2JfcDsKKwl9IGVsc2UgeworCQlSZXQgPSBrRXBsU2RvVWRwTWlzc0NiOworCX0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRTZG8sCisJCQkJICAgICAgIEVwbFNkb0FzbmR1Q2IsIGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLyAgICAgICAgICAgICAgZGVsIHNvY2tldCBhbmQgZGVsIExpc3Rlbi1UaHJlYWQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwkvLyBkZXJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gRExMCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kU2RvLAorCQkJCSAgICAgICBOVUxMLCBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdUluaXRDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBhIG5ldyBjb25uZWN0CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbkhhbmRsZV9wID0gcG9pbnRlciBmb3IgdGhlIG5ldyBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVpVGFyZ2V0Tm9kZUlkX3AgPSBOb2RlSWQgb2YgdGhlIHRhcmdldCBub2RlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVJbml0Q29uKHRFcGxTZG9Db25IZGwgKiBwU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlQ29uOworCXVuc2lnbmVkIGludCAqcHVpQ29ubmVjdGlvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKCh1aVRhcmdldE5vZGVJZF9wID09IEVQTF9DX0FEUl9JTlZBTElEKQorCSAgICB8fCAodWlUYXJnZXROb2RlSWRfcCA+PSBFUExfQ19BRFJfQlJPQURDQVNUKSkgeworCQlSZXQgPSBrRXBsU2RvQXNuZEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IGZyZWUgZW50cnkgaW4gY29udHJvbCBzdHJ1Y3R1cmUKKwl1aUNvdW50ID0gMDsKKwl1aUZyZWVDb24gPSBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQ7CisJcHVpQ29ubmVjdGlvbiA9ICZTZG9Bc25kSW5zdGFuY2VfZy5tX2F1aVNkb0FzbmRDb25uZWN0aW9uWzBdOworCXdoaWxlICh1aUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCWlmICgqcHVpQ29ubmVjdGlvbiA9PSB1aVRhcmdldE5vZGVJZF9wKSB7CS8vIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGFyZ2V0IG5vZGUgZm91bmQKKwkJCS8vIHNhdmUgaGFuZGxlIGZvciBoaWdoZXIgbGF5ZXIKKwkJCSpwU2RvQ29uSGFuZGxlX3AgPSAodWlDb3VudCB8IEVQTF9TRE9fQVNORF9IQU5ETEUpOworCisJCQlnb3RvIEV4aXQ7CisJCX0gZWxzZSBpZiAoKnB1aUNvbm5lY3Rpb24gPT0gMCkgewkvLyBmcmVlIGVudHJ5LT4gc2F2ZSB0YXJnZXQgbm9kZUlkCisJCQl1aUZyZWVDb24gPSB1aUNvdW50OworCQl9CisJCXVpQ291bnQrKzsKKwkJcHVpQ29ubmVjdGlvbisrOworCX0KKworCWlmICh1aUZyZWVDb24gPT0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCS8vIG5vIGZyZWUgY29ubmVjdGlvbgorCQlSZXQgPSBrRXBsU2RvQXNuZE5vRnJlZUhhbmRsZTsKKwl9IGVsc2UgeworCQlwdWlDb25uZWN0aW9uID0KKwkJICAgICZTZG9Bc25kSW5zdGFuY2VfZy5tX2F1aVNkb0FzbmRDb25uZWN0aW9uW3VpRnJlZUNvbl07CisJCSpwdWlDb25uZWN0aW9uID0gdWlUYXJnZXROb2RlSWRfcDsKKwkJLy8gc2F2ZSBoYW5kbGUgZm9yIGhpZ2hlciBsYXllcgorCQkqcFNkb0NvbkhhbmRsZV9wID0gKHVpRnJlZUNvbiB8IEVQTF9TRE9fQVNORF9IQU5ETEUpOworCisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVTZW5kRGF0YQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kIGRhdGEgdXNpbmcgZXhpc2l0aW5nIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9IHBvaW50ZXIgdG8gZGF0YQorLy8gICAgICAgICAgICAgIGR3RGF0YVNpemVfcCAgICA9IG51bWJlciBvZiBkYXRhYnl0ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBhc25kLWhlYWRlciEhIQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVTZW5kRGF0YSh0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICAgIHRFcGxGcmFtZSAqIHBTcmNEYXRhX3AsCisJCQkJICAgICAgRFdPUkQgZHdEYXRhU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUFycmF5OworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwl1aUFycmF5ID0gKFNkb0NvbkhhbmRsZV9wICYgfkVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKTsKKworCWlmICh1aUFycmF5ID4gRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCVJldCA9IGtFcGxTZG9Bc25kSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBmaWxsb3V0IEFzbmQgaGVhZGVyCisJLy8gb3duIG5vZGUgaWQgbm90IG5lZWRlZCAtPiBmaWxsZWQgYnkgRExMCisKKwkvLyBzZXQgbWVzc2FnZSB0eXBlCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLCAoQllURSkga0VwbE1zZ1R5cGVBc25kKTsJLy8gQVNuZCA9PSAweDA2CisJLy8gdGFyZ2V0IG5vZGUgaWQKKwlBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iRHN0Tm9kZUlkLAorCQkgICAgICAgKEJZVEUpIFNkb0FzbmRJbnN0YW5jZV9nLgorCQkgICAgICAgbV9hdWlTZG9Bc25kQ29ubmVjdGlvblt1aUFycmF5XSk7CisJLy8gc2V0IHNvdXJjZS1ub2RlaWQgKGZpbGxlZCBieSBETEwgMCkKKwlBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iU3JjTm9kZUlkLCAweDAwKTsKKworCS8vIGNhbGMgc2l6ZQorCWR3RGF0YVNpemVfcCArPSBFUExfQVNORF9IRUFERVJfU0laRTsKKworCS8vIHNlbmQgZnVuY3Rpb24gb2YgRExMCisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBkd0RhdGFTaXplX3A7CisJRnJhbWVJbmZvLm1fcEZyYW1lID0gcFNyY0RhdGFfcDsKKwlFUExfTUVNU0VUKCZGcmFtZUluZm8ubV9OZXRUaW1lLCAweDAwLCBzaXplb2YodEVwbE5ldFRpbWUpKTsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbEFzeW5jU2VuZCgmRnJhbWVJbmZvLCBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYyk7CisjZW5kaWYKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzbmR1RGVsQ29uCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBjb25uZWN0aW9uIGZyb20gaW50ZXJuIHN0cnVjdHVyZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbkhhbmRsZV9wICA9IGNvbm5lY3Rpb24gaGFuZGxlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdURlbENvbih0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUFycmF5OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwl1aUFycmF5ID0gKFNkb0NvbkhhbmRsZV9wICYgfkVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKTsKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAodWlBcnJheSA+IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCkgeworCQlSZXQgPSBrRXBsU2RvQXNuZEludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IHRhcmdldCBub2RlSWQgdG8gMAorCVNkb0FzbmRJbnN0YW5jZV9nLm1fYXVpU2RvQXNuZENvbm5lY3Rpb25bdWlBcnJheV0gPSAwOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdUNiCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBTRE8gQVNuZCBmcmFtZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEZyYW1lSW5mb19wID0gRnJhbWUgd2l0aCBTRE8gcGF5bG9hZAorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1Q2IodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUNvdW50OworCXVuc2lnbmVkIGludCAqcHVpQ29ubmVjdGlvbjsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdW5zaWduZWQgaW50IHVpRnJlZUVudHJ5ID0gMHhGRkZGOworCXRFcGxTZG9Db25IZGwgU2RvQ29uSGRsOworCXRFcGxGcmFtZSAqcEZyYW1lOworCisJcEZyYW1lID0gcEZyYW1lSW5mb19wLT5tX3BGcmFtZTsKKworCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCisJLy8gc2VhcmNoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gY29udHJvbCBzdHJ1Y3R1cmUKKwl1aUNvdW50ID0gMDsKKwlwdWlDb25uZWN0aW9uID0gJlNkb0FzbmRJbnN0YW5jZV9nLm1fYXVpU2RvQXNuZENvbm5lY3Rpb25bMF07CisJd2hpbGUgKHVpQ291bnQgPCBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQpIHsKKwkJaWYgKHVpTm9kZUlkID09ICpwdWlDb25uZWN0aW9uKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoKnB1aUNvbm5lY3Rpb24gPT0gMCkKKwkJCSAgICYmICh1aUZyZWVFbnRyeSA9PSAweEZGRkYpKSB7CS8vIGZyZWUgZW50cnkKKwkJCXVpRnJlZUVudHJ5ID0gdWlDb3VudDsKKwkJfQorCQl1aUNvdW50Kys7CisJCXB1aUNvbm5lY3Rpb24rKzsKKwl9CisKKwlpZiAodWlDb3VudCA9PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQpIHsKKwkJaWYgKHVpRnJlZUVudHJ5ICE9IDB4RkZGRikgeworCQkJcHVpQ29ubmVjdGlvbiA9CisJCQkgICAgJlNkb0FzbmRJbnN0YW5jZV9nLgorCQkJICAgIG1fYXVpU2RvQXNuZENvbm5lY3Rpb25bdWlGcmVlRW50cnldOworCQkJKnB1aUNvbm5lY3Rpb24gPSB1aU5vZGVJZDsKKwkJCXVpQ291bnQgPSB1aUZyZWVFbnRyeTsKKwkJfSBlbHNlIHsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAorCQkJICAgICgiRXBsU2RvQXNuZHVDYigpOiBubyBmcmVlIGhhbmRsZVxuIik7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisvLyAgICBpZiAodWlOb2RlSWQgPT0gKnB1aUNvbm5lY3Rpb24pCisJewkJCS8vIGVudHJ5IGZvdW5kIG9yIGNyZWF0ZWQKKwkJU2RvQ29uSGRsID0gKHVpQ291bnQgfCBFUExfU0RPX0FTTkRfSEFORExFKTsKKworCQlTZG9Bc25kSW5zdGFuY2VfZy5tX2ZwU2RvQXN5U2VxQ2IoU2RvQ29uSGRsLAorCQkJCQkJICAmcEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICBtX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLAorCQkJCQkJICAocEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplIC0KKwkJCQkJCSAgIDE4KSk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FzeVNlcXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTFjNmJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMKQEAgLTAsMCArMSwyNTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGFzeWNocm9ub3VzIFNETyBTZXF1ZW5jZSBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9Bc3lTZXF1LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjEwICQgICREYXRlOiAyMDA4LzExLzEzIDE3OjEzOjA5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsU2RvQXN5U2VxdS5oIgorCisjaWYgKCgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpID09IDApICYmXAorICAgICAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgPT0gMCkgICApCisKKyNlcnJvciAnRVJST1I6IEF0IGxlYXN0IFVEUCBvciBBc25kIG1vZHVsZSBuZWVkZWQhJworCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9TRE9fSElTVE9SWV9TSVpFICAgICAgICA1CisKKyNpZm5kZWYgRVBMX01BWF9TRE9fU0VRX0NPTgorI2RlZmluZSBFUExfTUFYX1NET19TRVFfQ09OICAgICAgICAgMTAKKyNlbmRpZgorCisjZGVmaW5lIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUICAgICA1MDAwCS8vIGluIFttc10gPT4gNSBzZWMKKworI2RlZmluZSBFUExfU0VRX1JFVFJZX0NPVU5UICAgICAgICAgNQkvLyA9PiBtYXguIFRpbWVvdXQgMzAgc2VjCisKKyNkZWZpbmUgRVBMX1NFUV9OVU1fVEhSRVNIT0xEICAgICAgIDEwMAkvLyB0aHJlc2hvbGQgd2hpY2ggZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIG9sZCBhbmQgbmV3IHNlcXVlbmNlIG51bWJlcnMKKworLy8gZGVmaW5lIGZyYW1lIHdpdGggc2l6ZSBvZiBBc25kLUhlYWRlci0sIFNETyBTZXF1ZW56ZSBIZWFkZXIgc2l6ZSwgU0RPIENvbW1hbmQgaGVhZGVyCisvLyBhbmQgRXRoZXJuZXQtSGVhZGVyIHNpemUKKyNkZWZpbmUgRVBMX1NFUV9GUkFNRV9TSVpFICAgICAgICAgIDI0CisvLyBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhlIGFzeW5jaHJvbnVzIFNETyBTZXF1ZW5jZSBsYXllcgorI2RlZmluZSBFUExfU0VRX0hFQURFUl9TSVpFICAgICAgICAgNAorCisvLyBidWZmZXJzaXplIGZvciBvbmUgZnJhbWUgaW4gaGlzdG9yeQorI2RlZmluZSBFUExfU0VRX0hJU1RST1lfRlJBTUVfU0laRSAgRVBMX01BWF9TRE9fRlJBTUVfU0laRQorCisvLyBtYXNrIHRvIGdldCBzY29uIGFuZCByY29uCisjZGVmaW5lIEVQTF9BU1lfU0RPX0NPTl9NQVNLICAgICAgICAweDAzCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZXZlbnRzIGZvciBwcm9jZXNzZnVuY3Rpb24KK3R5cGVkZWYgZW51bSB7CisJa0FzeVNkb1NlcUV2ZW50Tm9FdmVudCA9IDB4MDAsCS8vIG5vIEV2ZW50CisJa0FzeVNkb1NlcUV2ZW50SW5pdENvbiA9IDB4MDEsCS8vIGluaXQgY29ubmVjdGlvbgorCWtBc3lTZG9TZXFFdmVudEZyYW1lUmVjID0gMHgwMiwJLy8gZnJhbWUgcmVjZWl2ZWQKKwlrQXN5U2RvU2VxRXZlbnRGcmFtZVNlbmQgPSAweDAzLAkvLyBmcmFtZSB0byBzZW5kCisJa0FzeVNkb1NlcUV2ZW50VGltZW91dCA9IDB4MDQsCS8vIFRpbWVvdXQgZm9yIGNvbm5lY3Rpb24KKwlrQXN5U2RvU2VxRXZlbnRDbG9zZUNvbiA9IDB4MDUJLy8gaGlnaGVyIGxheWVyIGNsb3NlIGNvbm5lY3Rpb24KK30gdEVwbEFzeVNkb1NlcUV2ZW50OworCisvLyBzdHJ1Y3R1cmUgZm9yIEhpc3RvcnktQnVmZmVyCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2JGcmVlRW50cmllczsKKwlCWVRFIG1fYldyaXRlOwkJLy8gaW5kZXggb2YgdGhlIG5leHQgZnJlZSBidWZmZXIgZW50cnkKKwlCWVRFIG1fYkFjazsJCS8vIGluZGV4IG9mIHRoZSBuZXh0IG1lc3NhZ2Ugd2hpY2ggc2hvdWxkIGJlY29tZSBhY2tub3dsZWRnZWQKKwlCWVRFIG1fYlJlYWQ7CQkvLyBpbmRleCBiZXR3ZWVuIG1fYkFjayBhbmQgbV9iV3JpdGUgdG8gdGhlIG5leHQgbWVzc2FnZSBmb3IgcmV0cmFuc21pc3Npb24KKwlCWVRFIG1fYWFiSGlzdG9yeUZyYW1lW0VQTF9TRE9fSElTVE9SWV9TSVpFXQorCSAgICBbRVBMX1NFUV9ISVNUUk9ZX0ZSQU1FX1NJWkVdOworCXVuc2lnbmVkIGludCBtX2F1aUZyYW1lU2l6ZVtFUExfU0RPX0hJU1RPUllfU0laRV07CisKK30gdEVwbEFzeVNkb0Nvbkhpc3Rvcnk7CisKKy8vIHN0YXRlIG9mIHRoZSBzdGF0ZW1hc2NoaW5lCit0eXBlZGVmIGVudW0geworCWtFcGxBc3lTZG9TdGF0ZUlkbGUgPSAweDAwLAorCWtFcGxBc3lTZG9TdGF0ZUluaXQxID0gMHgwMSwKKwlrRXBsQXN5U2RvU3RhdGVJbml0MiA9IDB4MDIsCisJa0VwbEFzeVNkb1N0YXRlSW5pdDMgPSAweDAzLAorCWtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZCA9IDB4MDQsCisJa0VwbEFzeVNkb1N0YXRlV2FpdEFjayA9IDB4MDUKK30gdEVwbEFzeVNkb1N0YXRlOworCisvLyBjb25uZWN0aW9uIGNvbnRyb2wgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbkhkbCBtX0NvbkhhbmRsZTsKKwl0RXBsQXN5U2RvU3RhdGUgbV9TZG9TdGF0ZTsKKwlCWVRFIG1fYlJlY1NlcU51bTsJLy8gbmFtZSBmcm9tIHZpZXcgb2YgdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorCUJZVEUgbV9iU2VuZFNlcU51bTsJLy8gbmFtZSBmcm9tIHZpZXcgb2YgdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorCXRFcGxBc3lTZG9Db25IaXN0b3J5IG1fU2RvQ29uSGlzdG9yeTsKKwl0RXBsVGltZXJIZGwgbV9FcGxUaW1lckhkbDsKKwl1bnNpZ25lZCBpbnQgbV91aVJldHJ5Q291bnQ7CS8vIHJldHJ5IGNvdW50ZXIKKwl1bnNpZ25lZCBpbnQgbV91aVVzZUNvdW50OwkvLyBvbmUgc2VxdWVuY2UgbGF5ZXIgY29ubmVjdGlvbiBtYXkgYmUgdXNlZCBieQorCS8vIG11bHRpcGxlIGNvbW1hbmQgbGF5ZXIgY29ubmVjdGlvbnMKKworfSB0RXBsQXN5U2RvU2VxQ29uOworCisvLyBpbnN0YW5jZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsQXN5U2RvU2VxQ29uIG1fQXN5U2RvQ29ubmVjdGlvbltFUExfTUFYX1NET19TRVFfQ09OXTsKKwl0RXBsU2RvQ29tUmVjZWl2ZUNiIG1fZnBTZG9Db21SZWNlaXZlQ2I7CisJdEVwbFNkb0NvbUNvbkNiIG1fZnBTZG9Db21Db25DYjsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCUxQQ1JJVElDQUxfU0VDVElPTiBtX3BDcml0aWNhbFNlY3Rpb247CisJQ1JJVElDQUxfU0VDVElPTiBtX0NyaXRpY2FsU2VjdGlvbjsKKworCUxQQ1JJVElDQUxfU0VDVElPTiBtX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlOworCUNSSVRJQ0FMX1NFQ1RJT04gbV9Dcml0aWNhbFNlY3Rpb25SZWNlaXZlOworI2VuZGlmCisKK30gdEVwbEFzeVNkb1NlcXVJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxBc3lTZG9TZXF1SW5zdGFuY2UgQXN5U2RvU2VxdUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFQcm9jZXNzKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJICAgICAgdEVwbEZyYW1lICogcERhdGFfcCwKKwkJCQkgICAgICB0RXBsQXN5U2RvU2VxICogcFJlY0ZyYW1lX3AsCisJCQkJICAgICAgdEVwbEFzeVNkb1NlcUV2ZW50IEV2ZW50X3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCQkgdEVwbEZyYW1lICogcERhdGFfcCwKKwkJCQkJIEJPT0wgZkZyYW1lSW5IaXN0b3J5KTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCQkgICAgIHRFcGxGcmFtZSAqIHBFcGxGcmFtZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5UmVjZWl2ZUNiKHRFcGxTZG9Db25IZGwgQ29uSGRsX3AsCisJCQkJICAgICB0RXBsQXN5U2RvU2VxICogcFNkb1NlcURhdGFfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lJbml0SGlzdG9yeSh2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5QWRkRnJhbWVUb0hpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICB0RXBsRnJhbWUgKiBwRnJhbWVfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTaXplX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lBY2tGcmFtZVRvSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICAgIEJZVEUgYlJlY1NlcU51bWJlcl9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgIHRFcGxGcmFtZSAqKiBwcEZyYW1lX3AsCisJCQkJCSAgIHVuc2lnbmVkIGludCAqcHVpU2l6ZV9wLAorCQkJCQkgICBCT09MIGZJbml0UmVhZCk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgRXBsU2RvQXN5R2V0RnJlZUVudHJpZXNGcm9tSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICoKKwkJCQkJCSAgICAgICBwQXN5U2RvU2VxQ29uX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFTZXRUaW1lcih0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZW91dCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVQTCBhc3ljaHJvbnVzIFNETyBTZXF1ZW5jZSBsYXllcj4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IHRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIgZm9yCisvLyAgICAgICAgICAgICAgdGhlIEVQTCBTRE8gc2VydmljZQorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgZnBTZG9Db21DYl9wICAgID0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5mb3JtIENvbW1hbmQgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCBuZXcgZnJhbWVzCisvLyAgICAgICAgICAgICAgZnBTZG9Db21Db25DYl9wID0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5mb3JtIGNvbW1hbmQgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCBjb25uZWN0aW9uIHN0YXRlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFJbml0KHRFcGxTZG9Db21SZWNlaXZlQ2IgZnBTZG9Db21DYl9wLAorCQkJCSAgIHRFcGxTZG9Db21Db25DYiBmcFNkb0NvbUNvbkNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxTZG9Bc3lTZXFBZGRJbnN0YW5jZShmcFNkb0NvbUNiX3AsIGZwU2RvQ29tQ29uQ2JfcCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgZm9sbG93aW5nIGluc3RhbmNlcworLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIGZwU2RvQ29tQ2JfcCAgICA9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZm9ybSBDb21tYW5kIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgbmV3IGZyYW1lcworLy8gICAgICAgICAgICAgIGZwU2RvQ29tQ29uQ2JfcCA9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZm9ybSBjb21tYW5kIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgY29ubmVjdGlvbiBzdGF0ZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFBZGRJbnN0YW5jZSh0RXBsU2RvQ29tUmVjZWl2ZUNiIGZwU2RvQ29tQ2JfcCwKKwkJCQkJICB0RXBsU2RvQ29tQ29uQ2IgZnBTZG9Db21Db25DYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBmdW5jdGlvbnBvaW50ZXIKKwlpZiAoZnBTZG9Db21DYl9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcU1pc3NDYjsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fZnBTZG9Db21SZWNlaXZlQ2IgPSBmcFNkb0NvbUNiX3A7CisJfQorCisJLy8gY2hlY2sgZnVuY3Rpb25wb2ludGVyCisJaWYgKGZwU2RvQ29tQ29uQ2JfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxTZG9TZXFNaXNzQ2I7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX2ZwU2RvQ29tQ29uQ2IgPSBmcFNkb0NvbUNvbkNiX3A7CisJfQorCisJLy8gc2V0IGNvbnRyb2xsc3RydWN0dXJlIHRvIDAKKwlFUExfTUVNU0VUKCZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bMF0sIDB4MDAsCisJCSAgIHNpemVvZihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb24pKTsKKworCS8vIGluaXQgSGlzdG9yeQorCVJldCA9IEVwbFNkb0FzeUluaXRIaXN0b3J5KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGNyZWF0ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uID0KKwkgICAgJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQ3JpdGljYWxTZWN0aW9uOworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCS8vIGluaXQgY3JpdGljYWwgc2VjdGlvbiBmb3IgcmVjZWl2ZSBjYiBmdW5jdGlvbgorCUFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvblJlY2VpdmUgPQorCSAgICAmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Dcml0aWNhbFNlY3Rpb25SZWNlaXZlOworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJICBtX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlKTsKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCS8vIGluaXQgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9VZHB1QWRkSW5zdGFuY2UoRXBsU2RvQXN5UmVjZWl2ZUNiKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJLy8gaW5pdCBsb3dlciBsYXllcgorCVJldCA9IEVwbFNkb0FzbmR1QWRkSW5zdGFuY2UoRXBsU2RvQXN5UmVjZWl2ZUNiKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQ291bnQ7CisJdEVwbEFzeVNkb1NlcUNvbiAqcEFzeVNkb1NlcUNvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZGVsZXRlIHRpbWVyIG9mIG9wZW4gY29ubmVjdGlvbnMKKwl1aUNvdW50ID0gMDsKKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblswXTsKKwl3aGlsZSAodWlDb3VudCA8IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJaWYgKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlICE9IDApIHsKKwkJCUVwbFRpbWVydURlbGV0ZVRpbWVyKCZwQXN5U2RvU2VxQ29uLT5tX0VwbFRpbWVySGRsKTsKKwkJfQorCQl1aUNvdW50Kys7CisJCXBBc3lTZG9TZXFDb24rKzsKKwl9CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBkZWxldGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCURlbGV0ZUNyaXRpY2FsU2VjdGlvbihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisKKwkvLyBzZXQgaW5zdGFuY2UtdGFibGUgdG8gMAorCUVQTF9NRU1TRVQoJkFzeVNkb1NlcXVJbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoQXN5U2RvU2VxdUluc3RhbmNlX2cpKTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkvLyBkZWxldGUgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9VZHB1RGVsSW5zdGFuY2UoKTsKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwkvLyBkZWxldGUgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9Bc25kdURlbEluc3RhbmNlKCk7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcUluaXRDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnQgaW5pdGlhbGl6YXRpb24gb2YgYSBzZXF1ZW5jZSBsYXllciBjb25uZWN0aW9uLgorLy8gICAgICAgICAgICAgIEl0IHRyaWVzIHRvIHJldXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHNhbWUgbm9kZS4KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9TZXFDb25IZGxfcCA9IHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIGZvciB0aGUgY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICB1aU5vZGVJZF9wICAgICAgPSBOb2RlIElkIG9mIHRoZSB0YXJnZXQKKy8vICAgICAgICAgICAgICBTZG9UeXBlICAgICAgICAgID0gVHlwZSBvZiB0aGUgU0RPIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcUluaXRDb24odEVwbFNkb1NlcUNvbkhkbCAqIHBTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgICB0RXBsU2RvVHlwZSBTZG9UeXBlKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50OworCXVuc2lnbmVkIGludCB1aUZyZWVDb247CisJdEVwbFNkb0NvbkhkbCBDb25IYW5kbGU7CisJdEVwbEFzeVNkb1NlcUNvbiAqcEFzeVNkb1NlcUNvbjsKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIFNkb1R5cGUKKwkvLyBjYWxsIGluaXQgZnVuY3Rpb24gb2YgdGhlIHByb3Rjb2wgYWJzdHJhY3Rpb24gbGF5ZXIKKwkvLyB3aGljaCB0cmllcyB0byBmaW5kIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHNhbWUgbm9kZQorCXN3aXRjaCAoU2RvVHlwZSkgeworCQkvLyBTRE8gb3ZlciBVRFAKKwljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQkJUmV0ID0gRXBsU2RvVWRwdUluaXRDb24oJkNvbkhhbmRsZSwgdWlOb2RlSWRfcCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorI2Vsc2UKKwkJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gU0RPIG92ZXIgQXNuZAorCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwkJCVJldCA9IEVwbFNkb0FzbmR1SW5pdENvbigmQ29uSGFuZGxlLCB1aU5vZGVJZF9wKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisjZWxzZQorCQkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQkvLyB1bnN1cHBvcnRlZCBwcm90b2NvbHMKKwkJLy8gLT4gYXV0byBzaG91bGQgYmUgcmVwbGFjZWQgYnkgY29tbWFuZCBsYXllcgorCWNhc2Uga0VwbFNkb1R5cGVBdXRvOgorCWNhc2Uga0VwbFNkb1R5cGVQZG86CisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2goU2RvVHlwZSkKKworCS8vIGZpbmQgZXhpc3RpbmcgY29ubmVjdGlvbiB0byB0aGUgc2FtZSBub2RlIG9yIGZpbmQgZW1wdHkgZW50cnkgZm9yIGNvbm5lY3Rpb24KKwl1aUNvdW50ID0gMDsKKwl1aUZyZWVDb24gPSBFUExfTUFYX1NET19TRVFfQ09OOworCXBBc3lTZG9TZXFDb24gPSAmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uWzBdOworCisJd2hpbGUgKHVpQ291bnQgPCBFUExfTUFYX1NET19TRVFfQ09OKSB7CisJCWlmIChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSA9PSBDb25IYW5kbGUpIHsJLy8gZXhpc3RpbmcgY29ubmVjdGlvbiBmb3VuZAorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID09IDApIHsKKwkJCXVpRnJlZUNvbiA9IHVpQ291bnQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwQXN5U2RvU2VxQ29uKys7CisJfQorCisJaWYgKHVpQ291bnQgPT0gRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQlpZiAodWlGcmVlQ29uID09IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsJLy8gbm8gZnJlZSBlbnRyeSBmb3VuZAorCQkJc3dpdGNoIChTZG9UeXBlKSB7CisJCQkJLy8gU0RPIG92ZXIgVURQCisJCQljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQkJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJCQkJCVJldCA9IEVwbFNkb1VkcHVEZWxDb24oQ29uSGFuZGxlKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisjZW5kaWYKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gU0RPIG92ZXIgQXNuZAorCQkJY2FzZSBrRXBsU2RvVHlwZUFzbmQ6CisJCQkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCQkJCVJldCA9IEVwbFNkb0FzbmR1RGVsQ29uKENvbkhhbmRsZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHVuc3VwcG9ydGVkIHByb3RvY29scworCQkJCS8vIC0+IGF1dG8gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGNvbW1hbmQgbGF5ZXIKKwkJCWNhc2Uga0VwbFNkb1R5cGVBdXRvOgorCQkJY2FzZSBrRXBsU2RvVHlwZVBkbzoKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlSZXQgPSBrRXBsU2RvU2VxVW5zdXBwb3J0ZWRQcm90OworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goU2RvVHlwZSkKKworCQkJUmV0ID0ga0VwbFNkb1NlcU5vRnJlZUhhbmRsZTsKKwkJCWdvdG8gRXhpdDsKKwkJfSBlbHNlIHsJLy8gZnJlZSBlbnRyeSBmb3VuZAorCQkJcEFzeVNkb1NlcUNvbiA9CisJCQkgICAgJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUZyZWVDb25dOworCQkJcEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgPSBDb25IYW5kbGU7CisJCQl1aUNvdW50ID0gdWlGcmVlQ29uOworCQl9CisJfQorCS8vIHNldCBoYW5kbGUKKwkqcFNkb1NlcUNvbkhkbF9wID0gKHVpQ291bnQgfCBFUExfU0RPX0FTWV9IQU5ETEUpOworCisJLy8gaW5jcmVtZW50IHVzZSBjb3VudGVyCisJcEFzeVNkb1NlcUNvbi0+bV91aVVzZUNvdW50Kys7CisKKwkvLyBjYWxsIGludGVybiBwcm9jZXNzIGZ1bmN0aW9uCisJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUNvdW50LAorCQkJCSAgMCwgTlVMTCwgTlVMTCwga0FzeVNkb1NlcUV2ZW50SW5pdENvbik7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKy8vCisvLyBEZXNjcmlwdGlvbjogc2VuZCBzYXRhIHVuc2luZyBhIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvU2VxQ29uSGRsX3AgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgICA9IFNpemUgb2YgRnJhbWUgdG8gc2VuZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2lodG91dCBTRE8gc2VxdWVuY2UgbGF5ZXIgaGVhZGVyLCBBc25kIGhlYWRlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGV0aGVybmV0bmV0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT4gU0RPIFNlcXVlbmNlIGxheWVyIHBheWxvYWQKKy8vICAgICAgICAgICAgICBTZG9UeXBlICAgICAgICAgID0gVHlwZSBvZiB0aGUgU0RPIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcVNlbmREYXRhKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJICAgICAgIHRFcGxGcmFtZSAqIHBhYkRhdGFfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlIYW5kbGU7CisKKwl1aUhhbmRsZSA9IChTZG9TZXFDb25IZGxfcCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSyk7CisKKwkvLyBjaGVjayBpZiBjb25uZWN0aW9uIHJlYWR5CisJaWYgKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUhhbmRsZV0ubV9TZG9TdGF0ZSA9PQorCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlKSB7CisJCS8vIG5vIGNvbm5lY3Rpb24gd2l0aCB0aGlzIGhhbmRsZQorCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEhkbDsKKwkJZ290byBFeGl0OworCX0gZWxzZSBpZiAoQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uW3VpSGFuZGxlXS4KKwkJICAgbV9TZG9TdGF0ZSAhPSBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUNvbm5lY3Rpb25CdXN5OworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUhhbmRsZSwKKwkJCQkgIHVpRGF0YVNpemVfcCwKKwkJCQkgIHBhYkRhdGFfcCwgTlVMTCwga0FzeVNkb1NlcUV2ZW50RnJhbWVTZW5kKTsKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxUHJvY2Vzc0V2ZW50CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHByb2Nlc3NlcyBleHRlcm4gZXZlbnRzCisvLyAgICAgICAgICAgICAgLT4gbGF0ZXIgbmVlZGVkIGZvciB0aW1lb3V0IGNvbnRyb2xsIHdpdGggdGltZXItbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFRpbWVyRXZlbnRBcmcgKnBUaW1lckV2ZW50QXJnOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisJdEVwbFRpbWVySGRsIEVwbFRpbWVySGRsOworCXVuc2lnbmVkIGludCB1aUNvdW50OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHBFdmVudF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRFdmVudDsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwRXZlbnRfcC0+bV9FdmVudFR5cGUgIT0ga0VwbEV2ZW50VHlwZVRpbWVyKSB7CisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkRXZlbnQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHRpbWVyaGRsCisJcFRpbWVyRXZlbnRBcmcgPSAodEVwbFRpbWVyRXZlbnRBcmcgKikgcEV2ZW50X3AtPm1fcEFyZzsKKwlFcGxUaW1lckhkbCA9IHBUaW1lckV2ZW50QXJnLT5tX1RpbWVySGRsOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gaW50ZXJuIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKwlpZiAocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgPT0gMCkgeworCQlnb3RvIEV4aXQ7CisJfQorCXBBc3lTZG9TZXFDb24gPSAodEVwbEFzeVNkb1NlcUNvbiAqKSBwVGltZXJFdmVudEFyZy0+bV91bEFyZzsKKworCS8vIGNoZWNrIGlmIHRpbWUgaXMgY3VycmVudAorCWlmIChFcGxUaW1lckhkbCAhPSBwQXN5U2RvU2VxQ29uLT5tX0VwbFRpbWVySGRsKSB7CisJCS8vIGRlbGV0ZSB0aW1lcgorCQlFcGxUaW1lcnVEZWxldGVUaW1lcigmRXBsVGltZXJIZGwpOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGRlbGV0ZSB0aW1lcgorCUVwbFRpbWVydURlbGV0ZVRpbWVyKCZwQXN5U2RvU2VxQ29uLT5tX0VwbFRpbWVySGRsKTsKKworCS8vIGdldCBpbmRleG51bWJlciBvZiBjb250cm9sIHN0cnVjdHVyZQorCXVpQ291bnQgPSAwOworCXdoaWxlICgoJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUNvdW50XSkgIT0KKwkgICAgICAgcEFzeVNkb1NlcUNvbikgeworCQl1aUNvdW50Kys7CisJCWlmICh1aUNvdW50ID4gRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gcHJvY2VzcyBldmVudCBhbmQgY2FsbCBwcm9jZXNzZnVuY3Rpb24gaWYgbmVlZGVkCisJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUNvdW50LAorCQkJCSAgMCwgTlVMTCwgTlVMTCwga0FzeVNkb1NlcUV2ZW50VGltZW91dCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFEZWxDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsIGFuZCBjbG9zZSBvbmUgY29ubmVjdGlvbgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb1NlcUNvbkhkbF9wID0gaGFuZGxlIG9mIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcURlbENvbih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSGFuZGxlOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisKKwl1aUhhbmRsZSA9IChTZG9TZXFDb25IZGxfcCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSyk7CisKKwkvLyBjaGVjayBpZiBoYW5kbGUgaW52YWxpZAorCWlmICh1aUhhbmRsZSA+PSBFUExfTUFYX1NET19TRVFfQ09OKSB7CisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkSGRsOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIGNvbm5lY3Rpb24KKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUhhbmRsZV07CisKKwkvLyBkZWNyZW1lbnQgdXNlIGNvdW50ZXIKKwlwQXN5U2RvU2VxQ29uLT5tX3VpVXNlQ291bnQtLTsKKworCWlmIChwQXN5U2RvU2VxQ29uLT5tX3VpVXNlQ291bnQgPT0gMCkgeworCQkvLyBwcm9jZXNzIGNsb3NlIGluIHByb2Nlc3NmdW5jdGlvbgorCQlSZXQgPSBFcGxTZG9Bc3lTZXFQcm9jZXNzKHVpSGFuZGxlLAorCQkJCQkgIDAsCisJCQkJCSAgTlVMTCwgTlVMTCwga0FzeVNkb1NlcUV2ZW50Q2xvc2VDb24pOworCisJCS8vY2hlY2sgcHJvdG9jb2wKKwkJaWYgKChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSAmIEVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKSA9PQorCQkgICAgRVBMX1NET19VRFBfSEFORExFKSB7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQkJLy8gY2FsbCBjbG9zZSBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCQkJRXBsU2RvVWRwdURlbENvbihwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSk7CisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJCX0gZWxzZSB7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwkJCS8vIGNhbGwgY2xvc2UgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwkJCUVwbFNkb0FzbmR1RGVsQ29uKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlKTsKKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCX0KKworCQkvLyBkZWxldGUgdGltZXIKKwkJRXBsVGltZXJ1RGVsZXRlVGltZXIoJnBBc3lTZG9TZXFDb24tPm1fRXBsVGltZXJIZGwpOworCisJCS8vIGNsZWFuIGNvbnRyb2xsc3RydWN0dXJlCisJCUVQTF9NRU1TRVQocEFzeVNkb1NlcUNvbiwgMHgwMCwgc2l6ZW9mKHRFcGxBc3lTZG9TZXFDb24pKTsKKwkJcEFzeVNkb1NlcUNvbi0+bV9TZG9Db25IaXN0b3J5Lm1fYkZyZWVFbnRyaWVzID0KKwkJICAgIEVQTF9TRE9fSElTVE9SWV9TSVpFOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcGxTZG9Bc3lTZXFQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IGludGVybiBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIKKy8vICAgICAgICAgICAgICBzdGF0ZSBtYXNjaGluZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHVpSGFuZGxlX3AgICAgICA9IGluZGV4IG9mIHRoZSBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgICA9IHNpemUgb2YgZGF0YSBmcmFtZSB0byBwcm9jZXNzIChjYW4gYmUgMCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgc2l6ZSBvZiBzZXF1ZW5jZSBoZWFkZXIgYW5kIEFzbmQgaGVhZGVyISEhCisvLworLy8gICAgICAgICAgICAgIHBEYXRhX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgdG8gc2VuZCAoY2FuIGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgcFJlY0ZyYW1lX3AgICAgID0gcG9pbnRlciB0byByZWNlaXZlZCBmcmFtZSAoY2FuIGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgRXZlbnRfcCAgICAgICAgID0gRXZlbnQgdG8gcHJvY2VzcworLy8KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVNlcVByb2Nlc3ModW5zaWduZWQgaW50IHVpSGFuZGxlX3AsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkgICAgICB0RXBsRnJhbWUgKiBwRGF0YV9wLAorCQkJCSAgICAgIHRFcGxBc3lTZG9TZXEgKiBwUmVjRnJhbWVfcCwKKwkJCQkgICAgICB0RXBsQXN5U2RvU2VxRXZlbnQgRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemU7CisJdEVwbEZyYW1lICpwRXBsRnJhbWU7CisJdEVwbEFzeVNkb1NlcUNvbiAqcEFzeVNkb1NlcUNvbjsKKwl0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlRW50cmllczsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgaGFuZGxlIGZvciBoaW5nZXIgbGF5ZXIKKwlTZG9TZXFDb25IZGwgPSB1aUhhbmRsZV9wIHwgRVBMX1NET19BU1lfSEFORExFOworCisJLy8gY2hlY2sgaWYgaGFuZGxlIGludmFsaWQKKwlpZiAoKFNkb1NlcUNvbkhkbCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSykgPT0KKwkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREwpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRIZGw7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29ubmVjdGlvbgorCXBBc3lTZG9TZXFDb24gPSAmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uW3VpSGFuZGxlX3BdOworCisJLy8gY2hlY2sgc2l6ZQorCWlmICgocERhdGFfcCA9PSBOVUxMKSAmJiAocFJlY0ZyYW1lX3AgPT0gTlVMTCkgJiYgKHVpRGF0YVNpemVfcCAhPSAwKSkgeworCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEZyYW1lOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIHN0YXRlCisJc3dpdGNoIChwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlKSB7CisJCS8vIGlkbGUgc3RhdGUKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUlkbGU6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50CisJCQlzd2l0Y2ggKEV2ZW50X3ApIHsKKwkJCQkvLyBuZXcgY29ubmVjdGlvbgorCQkJCS8vIC0+IHNlbmQgaW5pdCBmcmFtZSBhbmQgY2hhbmdlIHRvCisJCQkJLy8ga0VwbEFzeVNkb1N0YXRlSW5pdDEKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50SW5pdENvbjoKKwkJCQl7CisJCQkJCS8vIHNldCBzZW5kaW5nIHNjb24gdG8gMQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPSAweDAxOworCQkJCQkvLyBzZXQgc2V0IHNlbmQgcmNvbiB0byAwCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPSAweDAwOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsIEZBTFNFKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUluaXQxOworCisJCQkJCS8vIHNldCB0aW1lcgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBpbml0IGNvbiBmcm9tIGV4dGVybgorCQkJCS8vIGNoZWNrIHJjb24gYW5kIHNjb24KKwkJCQkvLyAtPiBzZW5kIGFuc3dlcgorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYzoKKwkJCQl7CisvKgorICAgICAgICAgICAgICAgICAgICBQUklOVEYzKCIlcyBzY29uPSV1IHJjb249JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWNGcmFtZV9wLT5tX2xlX2JSZWNTZXFOdW1Db24pOworKi8KKwkJCQkJLy8gY2hlY2sgaWYgc2NvbiA9PSAxIGFuZCByY29uID09IDAKKwkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMCkKKwkJCQkJICAgICYmCisJCQkJCSAgICAoKHBSZWNGcmFtZV9wLT4KKwkJCQkJICAgICAgbV9sZV9iU2VuZFNlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAxKSkgeworCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkvLyBjcmVhdGUgYW5zd2VyIGFuZCBzZW5kIGFuc3dlcgorCQkJCQkJLy8gc2V0IHJjb24gdG8gMSAoaW4gc2VuZCBkaXJlY3Rpb24gb3duIHNjb24pCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUluaXQyCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJbml0MjsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3IgLT4gY2xvc2UKKwkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgIT0KKwkJCQkJCSAgICAgMHgwMCkKKwkJCQkJCSAgICB8fCAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9IDB4MDApKSB7CS8vIGQuay4gb25seSBhbnN3ZXIgd2l0aCBjbG9zZSBtZXNzYWdlIGlmIHRoZSBtZXNzYWdlIHNlbnQgd2FzIG5vdCBhIGNsb3NlIG1lc3NhZ2UKKwkJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLAorCQkJCQkJCSAgICAgTlVMTCwgRkFMU0UpOworCQkJCQkJfQorCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKEV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgY29ubmVjdGlvbiBzdGVwIDEKKwkJLy8gd2FpdCBmb3IgZnJhbWUgd2l0aCBzY29uID0gMQorCQkvLyBhbmQgcmNvbiA9IDEKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUluaXQxOgorCQl7CisvLyAgICAgICAgICAgIFBSSU5URjAoIkVwbFNkb0FzeVNlcXU6IFN0YXRlSW5pdDFcbiIpOworCisJCQkvLyBjaGVjayBldmVudAorCQkJc3dpdGNoIChFdmVudF9wKSB7CisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBzY29uID09IDEgYW5kIHJjb24gPT0gMQorCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAxKQorCQkJCQkgICAgJiYgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAxKSkgewkvLyBjcmVhdGUgYW5zd2VyIG93biBzY29uID0gMgorCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSsrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlSW5pdDMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUluaXQzOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgaWYgc2NvbiA9PSAxIGFuZCByY29uID09IDAsIGkuZS4gb3RoZXIgc2lkZSB3YW50cyBtZSB0byBiZSBzZXJ2ZXIKKwkJCQkJZWxzZSBpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09CisJCQkJCQkgIDB4MDApCisJCQkJCQkgJiYKKwkJCQkJCSAoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgIG1fbGVfYlNlbmRTZXFOdW1Db24gJgorCQkJCQkJICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09CisJCQkJCQkgIDB4MDEpKSB7CisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCS8vIGNyZWF0ZSBhbnN3ZXIgYW5kIHNlbmQgYW5zd2VyCisJCQkJCQkvLyBzZXQgcmNvbiB0byAxIChpbiBzZW5kIGRpcmVjdGlvbiBvd24gc2NvbikKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSsrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlSW5pdDIKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUluaXQyOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCQkJCQl9IGVsc2UgewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgIT0KKwkJCQkJCSAgICAgMHgwMCkKKwkJCQkJCSAgICB8fCAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9IDB4MDApKSB7CS8vIGQuay4gb25seSBhbnN3ZXIgd2l0aCBjbG9zZSBtZXNzYWdlIGlmIHRoZSBtZXNzYWdlIHNlbnQgd2FzIG5vdCBhIGNsb3NlIG1lc3NhZ2UKKwkJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsCisJCQkJCQkJICAgICBOVUxMLCBGQUxTRSk7CisJCQkJCQl9CisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRUaW1lb3V0OgorCQkJCXsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCisJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4ocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChFdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBpbml0IGNvbm5lY3Rpb24gc3RlcCAyCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVJbml0MjoKKwkJeworLy8gICAgICAgICAgICBQUklOVEYwKCJFcGxTZG9Bc3lTZXF1OiBTdGF0ZUluaXQyXG4iKTsKKworCQkJLy8gY2hlY2sgZXZlbnQKKwkJCXN3aXRjaCAoRXZlbnRfcCkgeworCQkJCS8vIGZyYW1lIHJlY2VpdmVkCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgc2NvbiA9PSAyIGFuZCByY29uID09IDEKKwkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMSkKKwkJCQkJICAgICYmICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMikpIHsJLy8gY3JlYXRlIGFuc3dlciBvd24gcmNvbiA9IDIKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZAorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUNvbm5lY3RlZCk7CisKKwkJCQkJfQorCQkJCQkvLyBjaGVjayBzY29uID09IDEgYW5kIHJjb24gPT0gMSwgaS5lLiBvdGhlciBzaWRlIHdhbnRzIG1lIHRvIGluaXRpYXRlIHRoZSBjb25uZWN0aW9uCisJCQkJCWVsc2UgaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PQorCQkJCQkJICAweDAxKQorCQkJCQkJICYmCisJCQkJCQkgKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICBtX2xlX2JTZW5kU2VxTnVtQ29uICYKKwkJCQkJCSAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PQorCQkJCQkJICAweDAxKSkgeworCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkvLyBjcmVhdGUgYW5zd2VyIGFuZCBzZW5kIGFuc3dlcgorCQkJCQkJLy8gc2V0IHJjb24gdG8gMSAoaW4gc2VuZCBkaXJlY3Rpb24gb3duIHNjb24pCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVJbml0MworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSW5pdDM7CisKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyCisJCQkJCQkgICAgKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9CisJCQkJCQkgICAgIDB4MDApCisJCQkJCQkgICAgfHwgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPSAweDAwKSkgewkvLyBkLmsuIG9ubHkgYW5zd2VyIHdpdGggY2xvc2UgbWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBzZW50IHdhcyBub3QgYSBjbG9zZSBtZXNzYWdlCisJCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwKKwkJCQkJCQkgICAgIE5VTEwsIEZBTFNFKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0CisJCQljYXNlIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQ6CisJCQkJewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4ocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCisJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fZnBTZG9Db21Db25DYihTZG9TZXFDb25IZGwsCisJCQkJCQkJICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKEV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgY29ubmVjdGlvbiBzdGVwIDMKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUluaXQzOgorCQl7CisJCQkvLyBjaGVjayBldmVudAorCQkJc3dpdGNoIChFdmVudF9wKSB7CisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBzY29uID09IDIgYW5kIHJjb24gPT0gMgorCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAyKQorCQkJCQkgICAgJiYKKwkJCQkJICAgICgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uICYKKwkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDIpKSB7CisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQ29ubmVjdGVkKTsKKworCQkJCQl9CisJCQkJCS8vIGNoZWNrIHNjb24gPT0gMiBhbmQgcmNvbiA9PSAxCisJCQkJCWVsc2UgaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PQorCQkJCQkJICAweDAxKQorCQkJCQkJICYmICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMikpIHsJLy8gY3JlYXRlIGFuc3dlciBvd24gcmNvbiA9IDIKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZAorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUNvbm5lY3RlZCk7CisKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyCisJCQkJCQkgICAgKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9CisJCQkJCQkgICAgIDB4MDApCisJCQkJCQkgICAgfHwgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPSAweDAwKSkgewkvLyBkLmsuIG9ubHkgYW5zd2VyIHdpdGggY2xvc2UgbWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBzZW50IHdhcyBub3QgYSBjbG9zZSBtZXNzYWdlCisJCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwKKwkJCQkJCQkgICAgIE5VTEwsIEZBTFNFKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0CisJCQljYXNlIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQ6CisJCQkJewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4ocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCisJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fZnBTZG9Db21Db25DYihTZG9TZXFDb25IZGwsCisJCQkJCQkJICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKEV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnQKKwkJCXN3aXRjaCAoRXZlbnRfcCkgeworCisJCQkJLy8gZnJhbWUgdG8gc2VuZAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVNlbmQ6CisJCQkJeworCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisJCQkJCS8vIGNoZWNrIGlmIGRhdGEgZnJhbWUgb3IgYWNrCisJCQkJCWlmIChwRGF0YV9wID09IE5VTEwpIHsJLy8gc2VuZCBhY2sKKwkJCQkJCS8vIGluYyBzY29uCisJCQkJCQkvL3BBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSArPSA0OworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CS8vIHNlbmQgZGF0YWZyYW1lCisJCQkJCQkvLyBpbmNyZW1lbnQgc2VuZCBzZXF1ZW5jZSBudW1iZXIKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSArPQorCQkJCQkJICAgIDQ7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgdWlEYXRhU2l6ZV9wLCBwRGF0YV9wLAorCQkJCQkJICAgICBUUlVFKTsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFNkb1NlcVJlcXVlc3RBY2tOZWVkZWQpIHsJLy8gcmVxdWVzdCBhY2sKKwkJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8gd2FpdCBhY2sKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9TZG9TdGF0ZSA9CisJCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZVdhaXRBY2s7CisJCQkJCQkJLy8gc2V0IFJldCB0byBrRXBsU3VjY2Vzc2Z1bCwgYmVjYXVzZSBubyBlcnJvcgorCQkJCQkJCS8vIGZvciBoaWdoZXIgbGF5ZXIKKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCQkJCQkJfSBlbHNlIGlmIChSZXQgIT0KKwkJCQkJCQkgICBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0JLy8gZW5kIG9mIGNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVTZW5kCisKKwkJCQkvLyBmcmFtZSByZWNlaXZlZAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYzoKKwkJCQl7CisJCQkJCUJZVEUgYlNlbmRTZXFOdW1Db24gPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcihwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCQkJCQkvLyBjaGVjayBzY29uCisJCQkJCXN3aXRjaCAoYlNlbmRTZXFOdW1Db24gJgorCQkJCQkJRVBMX0FTWV9TRE9fQ09OX01BU0spIHsKKwkJCQkJCS8vIGNsb3NlIGZyb20gb3RoZXIgbm9kZQorCQkJCQljYXNlIDA6CisJCQkJCWNhc2UgMToKKwkJCQkJCXsKKwkJCQkJCQkvLyByZXR1cm4gdG8gaWRsZQorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX1Nkb1N0YXRlID0KKwkJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCQlFcGxUaW1lcnVEZWxldGVUaW1lcgorCQkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQ29uQ2xvc2VkKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQkvLyBSZXF1ZXN0IEFjayBvciBFcnJvciBBY2sKKwkJCQkJCS8vIHBvc3NpYmxlIGNvbnRhaW4gZGF0YQorCQkJCQljYXNlIDM6CisJCQkJCQkvLyBub3JtYWwgZnJhbWUKKwkJCQkJY2FzZSAyOgorCQkJCQkJeworCQkJCQkJCWlmICgoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKQorCQkJCQkJCSAgICAgJgorCQkJCQkJCSAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spCisJCQkJCQkJICAgID09IDMpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVEYwKCJFcGxTZG9Bc3lTZXF1OiBlcnJvciByZXNwb25zZSByZWNlaXZlZFxuIik7CisKKwkJCQkJCQkJLy8gZXJyb3IgcmVzcG9uc2UgKHJldHJhbnNtaXNzaW9uIHJlcXVlc3QpCisJCQkJCQkJCS8vIHJlc2VuZCBmcmFtZXMgZnJvbSBoaXN0b3J5CisKKwkJCQkJCQkJLy8gcmVhZCBmcmFtZSBmcm9tIGhpc3RvcnkKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSAgICAgJnBFcGxGcmFtZSwKKwkJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJCSAgICAgVFJVRSk7CisJCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQl7CisJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCX0KKworCQkJCQkJCQl3aGlsZSAoKHBFcGxGcmFtZSAhPSBOVUxMKQorCQkJCQkJCQkgICAgICAgJiYKKwkJCQkJCQkJICAgICAgICh1aUZyYW1lU2l6ZQorCQkJCQkJCQkJIT0gMCkpIHsKKwkJCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQkJCVJldCA9CisJCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIKKwkJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJCSAgICAgdWlGcmFtZVNpemUsCisJCQkJCQkJCQkgICAgIHBFcGxGcmFtZSk7CisJCQkJCQkJCQlpZiAoUmV0CisJCQkJCQkJCQkgICAgIT0KKwkJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCQl9CisJCQkJCQkJCQkvLyByZWFkIG5leHQgZnJhbWUgZnJvbSBoaXN0b3J5CisJCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkJICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorCQkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkJICAgICAmcEVwbEZyYW1lLAorCQkJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCQkJCWlmIChSZXQKKwkJCQkJCQkJCSAgICAhPQorCQkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQkvLyBlbmQgb2Ygd2hpbGUoKHBhYkZyYW1lICE9IE5VTEwpCisJCQkJCQkJfQkvLyBlbmQgb2YgaWYgKGVycm9yIHJlc3BvbnNlKQorCisJCQkJCQkJaWYgKCgocEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSArIDQpICYgRVBMX1NFUV9OVU1fTUFTSykgPT0gKGJTZW5kU2VxTnVtQ29uICYgRVBMX1NFUV9OVU1fTUFTSykpIHsJLy8gbmV4dCBmcmFtZSBvZiBzZXF1ZW5jZSByZWNlaXZlZAorCQkJCQkJCQkvLyBzYXZlIHNlbmQgc2VxdWVuY2UgbnVtYmVyICh3aXRob3V0IGFjayByZXF1ZXN0KQorCQkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIGJTZW5kU2VxTnVtQ29uCisJCQkJCQkJCSAgICAmIH4weDAxOworCisJCQkJCQkJCS8vIGNoZWNrIGlmIGFjayBvciBkYXRhLWZyYW1lCisJCQkJCQkJCS8vaWdub3JlIGFjayAtPiBhbHJlYWR5IHByb2Nlc3NlZAorCQkJCQkJCQlpZiAodWlEYXRhU2l6ZV9wCisJCQkJCQkJCSAgICA+CisJCQkJCQkJCSAgICBFUExfU0VRX0hFQURFUl9TSVpFKQorCQkJCQkJCQl7CisJCQkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkJCSAgICBtX2ZwU2RvQ29tUmVjZWl2ZUNiCisJCQkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkJCSAgICAgKCh0RXBsQXN5U2RvQ29tICopICYgcFJlY0ZyYW1lX3AtPm1fbGVfYWJTZG9TZXFQYXlsb2FkKSwgKHVpRGF0YVNpemVfcCAtIEVQTF9TRVFfSEVBREVSX1NJWkUpKTsKKwkJCQkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQpOworCisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUFja1JlY2VpdmVkKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAoKChiU2VuZFNlcU51bUNvbiAtIHBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gLSA0KSAmIEVQTF9TRVFfTlVNX01BU0spIDwgRVBMX1NFUV9OVU1fVEhSRVNIT0xEKSB7CS8vIGZyYW1lIG9mIHNlcXVlbmNlIHdhcyBsb3N0LAorCQkJCQkJCQkvLyBiZWNhdXNlIGRpZmZlcmVuY2Ugb2YgcmVjZWl2ZWQgYW5kIG9sZCB2YWx1ZQorCQkJCQkJCQkvLyBpcyBsZXNzIHRoZW4gaGFsdmUgb2YgdGhlIHZhbHVlcyByYW5nZS4KKworCQkJCQkJCQkvLyBzZW5kIGVycm9yIGZyYW1lIHdpdGggb3duIHJjb24gPSAzCisJCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCQkgICAgbV9iU2VuZFNlcU51bQorCQkJCQkJCQkgICAgfD0gMHgwMzsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgICAgIDAsIE5VTEwsCisJCQkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJCQkvLyByZXN0b3JlIHNlbmQgc2VxdWVuY2UgbnVtYmVyCisJCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCQkgICAgbV9iU2VuZFNlcU51bQorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24tPgorCQkJCQkJCQkgICAgIG1fYlNlbmRTZXFOdW0KKwkJCQkJCQkJICAgICAmCisJCQkJCQkJCSAgICAgRVBMX1NFUV9OVU1fTUFTSykKKwkJCQkJCQkJICAgIHwgMHgwMjsKKwkJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJfQorCQkJCQkJCQkvLyBicmVhayBoZXJlLCBiZWNhdXNlIGEgcmVxdWVzdGVkIGFja25vd2xlZGdlCisJCQkJCQkJCS8vIHdhcyBzZW50IGltcGxpY2l0bHkgYWJvdmUKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCS8vIGVsc2UsIGlnbm9yZSByZXBlYXRlZCBmcmFtZQorCisJCQkJCQkJaWYgKChiU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAzKSB7CS8vIGFjayByZXF1ZXN0IHJlY2VpdmVkCisKKwkJCQkJCQkJLy8gY3JlYXRlIGFjayB3aXRoIG93biBzY29uID0gMgorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSAgICAgMCwgTlVMTCwKKwkJCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQl7CisJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQl9CS8vIHN3aXRjaChwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICYgRVBMX0FTWV9TRE9fQ09OX01BU0spCisJCQkJCWJyZWFrOworCQkJCX0JLy8gZW5kIG9mIGNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisKKwkJCQkvL2Nsb3NlIGV2ZW50IGZyb20gaGlnaGVyIGxheWVyCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudENsb3NlQ29uOgorCQkJCXsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJICAgICAgIDAsIE5VTEwsIEZBTFNFKTsKKworCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYiBpcyBub3QgbmVjZXNzYXJ5LCBiZWNhdXNlIHRoZSBldmVudCBjYW1lIGZyb20gdGhlcmUKKy8vICAgICAgICAgICAgICAgICAgICBBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX2ZwU2RvQ29tQ29uQ2IoU2RvU2VxQ29uSGRsLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0CisJCQljYXNlIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQ6CisJCQkJeworCisJCQkJCXVpRnJlZUVudHJpZXMgPQorCQkJCQkgICAgRXBsU2RvQXN5R2V0RnJlZUVudHJpZXNGcm9tSGlzdG9yeQorCQkJCQkgICAgKHBBc3lTZG9TZXFDb24pOworCQkJCQlpZiAoKHVpRnJlZUVudHJpZXMgPAorCQkJCQkgICAgIEVQTF9TRE9fSElTVE9SWV9TSVpFKQorCQkJCQkgICAgJiYgKHBBc3lTZG9TZXFDb24tPm1fdWlSZXRyeUNvdW50IDwgRVBMX1NFUV9SRVRSWV9DT1VOVCkpIHsJLy8gdW5hY2tub3dsZWdkZWQgZnJhbWVzIGluIGhpc3RvcnkKKwkJCQkJCS8vIGFuZCByZXRyeSBjb3VudGVyIG5vdCBleGNlZWRlZAorCisJCQkJCQkvLyByZXNlbmQgZGF0YSB3aXRoIGFja25vd2xlZGdlIHJlcXVlc3QKKworCQkJCQkJLy8gaW5jcmVtZW50IHJldHJ5IGNvdW50ZXIKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fdWlSZXRyeUNvdW50Kys7CisKKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCQkJCS8vIHJlYWQgZmlyc3QgZnJhbWUgZnJvbSBoaXN0b3J5CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAmcEVwbEZyYW1lLAorCQkJCQkJICAgICAmdWlGcmFtZVNpemUsIFRSVUUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChwRXBsRnJhbWUgIT0gTlVMTCkKKwkJCQkJCSAgICAmJiAodWlGcmFtZVNpemUgIT0gMCkpIHsKKworCQkJCQkJCS8vIHNldCBhY2sgcmVxdWVzdCBpbiBzY29uCisJCQkJCQkJQW1pU2V0Qnl0ZVRvTGUKKwkJCQkJCQkgICAgKCZwRXBsRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICAgIG1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQkJICAgICBtX1Nkb1NlcXVlbmNlRnJhbWUuCisJCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uLAorCQkJCQkJCSAgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAgKCZwRXBsRnJhbWUtPgorCQkJCQkJCSAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgIG1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJCQkJCQkgICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKQorCQkJCQkJCSAgICAgfCAweDAzKTsKKworCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kTG93ZXJMYXllcgorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgIHVpRnJhbWVTaXplLAorCQkJCQkJCSAgICAgcEVwbEZyYW1lKTsKKwkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHRpbWVvdXQsIGJlY2F1c2Ugb2Ygbm8gdHJhZmZpYyAtPiBDbG9zZQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZVRpbWVvdXQpOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goRXZlbnRfcCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gd2FpdCBmb3IgQWNrbm93bGVkZ2UgKGhpc3RvcnkgYnVmZmVyIGZ1bGwpCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVXYWl0QWNrOgorCQl7CisJCQlQUklOVEYwKCJFcGxTZG9Bc3lTZXF1OiBTdGF0ZVdhaXRBY2tcbiIpOworCisJCQkvLyBzZXQgdGltZXIKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVNldFRpbWVyKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCS8vVE9ETzogcmV0cnkgb2YgYWNrbm93bGVkZ2UKKwkJCWlmIChFdmVudF9wID09IGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjKSB7CisJCQkJLy8gY2hlY2sgcmNvbgorCQkJCXN3aXRjaCAocFJlY0ZyYW1lX3AtPgorCQkJCQltX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQlFUExfQVNZX1NET19DT05fTUFTSykgeworCQkJCQkvLyBjbG9zZS1mcm9tZSBvdGhlciBub2RlCisJCQkJY2FzZSAwOgorCQkJCQl7CisJCQkJCQkvLyByZXR1cm4gdG8gaWRsZQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQ29uQ2xvc2VkKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub3JtYWwgZnJhbWUKKwkJCQljYXNlIDI6CisJCQkJCXsKKwkJCQkJCS8vIHNob3VsZCBiZSBhY2sKKwkJCQkJCS8vIC0+IGNoYW5nZSB0byBzdGF0ZSBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDsKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQWNrUmVjZWl2ZWQpOworCQkJCQkJLy8gc2VuZCBkYXRhIHRvIGhpZ2hlciBsYXllciBpZiBuZWVkZWQKKwkJCQkJCWlmICh1aURhdGFTaXplX3AgPgorCQkJCQkJICAgIEVQTF9TRVFfSEVBREVSX1NJWkUpIHsKKwkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV9mcFNkb0NvbVJlY2VpdmVDYgorCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICAgKCh0RXBsQXN5U2RvQ29tICopCisJCQkJCQkJICAgICAgJiBwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICAgbV9sZV9hYlNkb1NlcVBheWxvYWQpLAorCQkJCQkJCSAgICAgKHVpRGF0YVNpemVfcCAtCisJCQkJCQkJICAgICAgRVBMX1NFUV9IRUFERVJfU0laRSkpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBSZXF1ZXN0IEFjayBvciBFcnJvciBBY2sKKwkJCQljYXNlIDM6CisJCQkJCXsKKwkJCQkJCS8vIC0+IGNoYW5nZSB0byBzdGF0ZSBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDsKKworCQkJCQkJaWYgKHBSZWNGcmFtZV9wLT5tX2xlX2JSZWNTZXFOdW1Db24gPT0gcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtKSB7CS8vIGFjayByZXF1ZXN0CisJCQkJCQkJLy8gLT4gc2VuZCBhY2sKKwkJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJCQkvLyBjcmVhdGUgYW5zd2VyIG93biByY29uID0gMgorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0tLTsKKworCQkJCQkJCS8vIGNoZWNrIGlmIGFjayBvciBkYXRhLWZyYW1lCisJCQkJCQkJaWYgKHVpRGF0YVNpemVfcCA+CisJCQkJCQkJICAgIEVQTF9TRVFfSEVBREVSX1NJWkUpCisJCQkJCQkJeworCQkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgIG1fZnBTZG9Db21SZWNlaXZlQ2IKKwkJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJCSAgICAgKCh0RXBsQXN5U2RvQ29tICopICYgcFJlY0ZyYW1lX3AtPm1fbGVfYWJTZG9TZXFQYXlsb2FkKSwgKHVpRGF0YVNpemVfcCAtIEVQTF9TRVFfSEVBREVSX1NJWkUpKTsKKwkJCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUZyYW1lU2VuZGVkKTsKKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJICAgICAwLCBOVUxMLAorCQkJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBlcnJvciBhY2sKKwkJCQkJCQkvLyByZXNlbmQgZnJhbWVzIGZyb20gaGlzdG9yeQorCisJCQkJCQkJLy8gcmVhZCBmcmFtZSBmcm9tIGhpc3RvcnkKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkKKwkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJICAgICAmcEVwbEZyYW1lLAorCQkJCQkJCSAgICAgJnVpRnJhbWVTaXplLAorCQkJCQkJCSAgICAgVFJVRSk7CisJCQkJCQkJd2hpbGUgKChwRXBsRnJhbWUgIT0KKwkJCQkJCQkJTlVMTCkKKwkJCQkJCQkgICAgICAgJiYgKHVpRnJhbWVTaXplCisJCQkJCQkJCSAgICE9IDApKSB7CisJCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyCisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJICAgICB1aUZyYW1lU2l6ZSwKKwkJCQkJCQkJICAgICBwRXBsRnJhbWUpOworCQkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJeworCQkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCQl9CisJCQkJCQkJCS8vIHJlYWQgbmV4dCBmcmFtZQorCisJCQkJCQkJCS8vIHJlYWQgZnJhbWUgZnJvbSBoaXN0b3J5CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkKKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgICAgICZwRXBsRnJhbWUsCisJCQkJCQkJCSAgICAgJnVpRnJhbWVTaXplLAorCQkJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCQl9CS8vIGVuZCBvZiB3aGlsZSgocGFiRnJhbWUgIT0gTlVMTCkKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKHBSZWNGcmFtZV9wLT5tX2xlX2JSZWNTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykKKworCQkJfSBlbHNlIGlmIChFdmVudF9wID09IGtBc3lTZG9TZXFFdmVudFRpbWVvdXQpIHsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0ga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSAmPSBFUExfU0VRX05VTV9NQVNLOworCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCisJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJICAgIG1fZnBTZG9Db21Db25DYihTZG9TZXFDb25IZGwsCisJCQkJCQkgICAga0FzeVNkb0NvblN0YXRlVGltZW91dCk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdW5rbm93biBzdGF0ZQorCWRlZmF1bHQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAorCQkJICAgICgiRXJyb3I6IFVua25vd24gU3RhdGUgaW4gRXBsU2RvQXN5U2VxUHJvY2Vzc1xuIik7CisKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUpCisKKyAgICAgIEV4aXQ6CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJTGVhdmVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorLy8KKy8vIERlc2NyaXB0aW9uOiBpbnRlcm4gZnVuY3Rpb24gdG8gY3JlYXRlIGFuZCBzZW5kIGEgZnJhbWUKKy8vICAgICAgICAgICAgICAtPiBpZiB1aURhdGFTaXplX3AgPT0gMCBjcmVhdGUgYSBmcmFtZSB3aXRoIGluZm9zIGZyb20KKy8vICAgICAgICAgICAgICAgICBwQXN5U2RvU2VxQ29uX3AKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoZSBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgdWlEYXRhU2l6ZV9wICAgID0gc2l6ZSBvZiBkYXRhIGZyYW1lIHRvIHByb2Nlc3MgKGNhbiBiZSAwKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBzaXplIG9mIHNlcXVlbmNlIGhlYWRlciBhbmQgQXNuZCBoZWFkZXIhISEKKy8vICAgICAgICAgICAgICBwRGF0YV9wICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIHRvIHByb2Nlc3MgKGNhbiBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIGZGcmFtZUluSGlzdG9yeSA9IGlmIFRSVUUgZnJhbWUgaXMgc2F2ZWQgdG8gaGlzdG9yeSBlbHNlIG5vdAorLy8KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4odEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJCSB0RXBsRnJhbWUgKiBwRGF0YV9wLAorCQkJCQkgQk9PTCBmRnJhbWVJbkhpc3RvcnlfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiRnJhbWVbRVBMX1NFUV9GUkFNRV9TSVpFXTsKKwl0RXBsRnJhbWUgKnBFcGxGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlRW50cmllczsKKworCWlmIChwRGF0YV9wID09IE5VTEwpIHsJLy8gc2V0IHBvaW50ZXIgdG8gb3duIGZyYW1lCisJCUVQTF9NRU1TRVQoJmFiRnJhbWVbMF0sIDB4MDAsIHNpemVvZihhYkZyYW1lKSk7CisJCXBFcGxGcmFtZSA9ICh0RXBsRnJhbWUgKikgJiBhYkZyYW1lWzBdOworCX0gZWxzZSB7CQkvLyBzZXQgcG9pbnRlciB0byBmcmFtZSBmcm9tIGNhbGxpbmcgZnVuY3Rpb24KKwkJcEVwbEZyYW1lID0gcERhdGFfcDsKKwl9CisKKwlpZiAoZkZyYW1lSW5IaXN0b3J5X3AgIT0gRkFMU0UpIHsKKwkJLy8gY2hlY2sgaWYgb25seSBvbmUgZnJlZSBlbnRyeSBpbiBoaXN0b3J5IGJ1ZmZlcgorCQl1aUZyZWVFbnRyaWVzID0KKwkJICAgIEVwbFNkb0FzeUdldEZyZWVFbnRyaWVzRnJvbUhpc3RvcnkocEFzeVNkb1NlcUNvbl9wKTsKKwkJaWYgKHVpRnJlZUVudHJpZXMgPT0gMSkgewkvLyByZXF1ZXN0IGFuIGFja25vd2xlZGdlIGluIGRhdGFmcmFtZQorCQkJLy8gb3duIHNjb24gPSAzCisJCQlwQXN5U2RvU2VxQ29uX3AtPm1fYlJlY1NlcU51bSB8PSAweDAzOworCQl9CisJfQorCS8vIGZpbGxpbiBoZWFkZXIgaW5mb3JtYXRpb25zCisJLy8gc2V0IHNlcnZpY2UgaWQgc2RvCisJQW1pU2V0Qnl0ZVRvTGUoJnBFcGxGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX2xlX2JTZXJ2aWNlSWQsIDB4MDUpOworCUFtaVNldEJ5dGVUb0xlKCZwRXBsRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJICAgICAgIG1fbGVfYWJSZXNlcnZlZCwgMHgwMCk7CisJLy8gc2V0IHJlY2VpdmUgc2VxdWVuY2UgbnVtYmVyIGFuZCByY29uCisJQW1pU2V0Qnl0ZVRvTGUoJnBFcGxGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCQkgICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uLCBwQXN5U2RvU2VxQ29uX3AtPm1fYlNlbmRTZXFOdW0pOworCS8vIHNldCBzZW5kIHNlcXVlbmNlIG51bWJlciBhbmQgc2NvbgorCUFtaVNldEJ5dGVUb0xlKCZwRXBsRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJICAgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24sIHBBc3lTZG9TZXFDb25fcC0+bV9iUmVjU2VxTnVtKTsKKworCS8vIGFkZCBzaXplCisJdWlEYXRhU2l6ZV9wICs9IEVQTF9TRVFfSEVBREVSX1NJWkU7CisKKwkvLyBmb3J3YXJkIGZyYW1lIHRvIGFwcHJvcHJpYXRlIGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIocEFzeVNkb1NlcUNvbl9wLCB1aURhdGFTaXplX3AsIHBFcGxGcmFtZSk7CS8vIHBvaW50ZXIgdG8gZnJhbWUKKworCS8vIGNoZWNrIGlmIGFsbCBhbGxyaWdodAorCWlmICgoUmV0ID09IGtFcGxTdWNjZXNzZnVsKQorCSAgICAmJiAoZkZyYW1lSW5IaXN0b3J5X3AgIT0gRkFMU0UpKSB7CisJCS8vIHNldCBvd24gc2NvbiB0byAyIGlmIG5lZWRlZAorCQlpZiAoKHBBc3lTZG9TZXFDb25fcC0+bV9iUmVjU2VxTnVtICYgMHgwMykgPT0gMHgwMykgeworCQkJcEFzeVNkb1NlcUNvbl9wLT5tX2JSZWNTZXFOdW0tLTsKKwkJfQorCQkvLyBzYXZlIGZyYW1lIHRvIGhpc3RvcnkKKwkJUmV0ID0gRXBsU2RvQXN5QWRkRnJhbWVUb0hpc3RvcnkocEFzeVNkb1NlcUNvbl9wLAorCQkJCQkJIHBFcGxGcmFtZSwgdWlEYXRhU2l6ZV9wKTsKKwkJaWYgKFJldCA9PSBrRXBsU2RvU2VxTm9GcmVlSGlzdG9yeSkgewkvLyByZXF1ZXN0IEFjayBuZWVkZWQKKwkJCVJldCA9IGtFcGxTZG9TZXFSZXF1ZXN0QWNrTmVlZGVkOworCQl9CisKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFTZW5kTG93ZXJMYXllcgorLy8KKy8vIERlc2NyaXB0aW9uOiBpbnRlcm4gZnVuY3Rpb24gdG8gc2VuZCBhIHByZXZpb3VzbHkgY3JlYXRlZCBmcmFtZSB0byBsb3dlciBsYXllcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoZSBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgdWlEYXRhU2l6ZV9wICAgID0gc2l6ZSBvZiBkYXRhIGZyYW1lIHRvIHByb2Nlc3MgKGNhbiBiZSAwKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBzaXplIG9mIEFzbmQgaGVhZGVyISEhCisvLyAgICAgICAgICAgICAgcERhdGFfcCAgICAgICAgID0gcG9pbnRlciB0byBmcmFtZSB0byBwcm9jZXNzIChjYW4gYmUgTlVMTCkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCQkgICAgIHRFcGxGcmFtZSAqIHBFcGxGcmFtZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJLy8gY2FsbCBzZW5kLWZ1bmN0aW9uCisJLy8gY2hlY2sgaGFuZGxlIGZvciBVRFAgb3IgQXNuZAorCWlmICgocEFzeVNkb1NlcUNvbl9wLT5tX0NvbkhhbmRsZSAmIEVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKSA9PSBFUExfU0RPX1VEUF9IQU5ETEUpIHsJLy8gc2VuZCBvdmVyIFVEUAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkJUmV0ID0gRXBsU2RvVWRwdVNlbmREYXRhKHBBc3lTZG9TZXFDb25fcC0+bV9Db25IYW5kbGUsIHBFcGxGcmFtZV9wLAkvLyBwb2ludGVyIHRvIGZyYW1lCisJCQkJCSB1aURhdGFTaXplX3ApOworI2Vsc2UKKwkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKyNlbmRpZgorCisJfSBlbHNlIGlmICgocEFzeVNkb1NlcUNvbl9wLT5tX0NvbkhhbmRsZSAmIEVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKSA9PSBFUExfU0RPX0FTTkRfSEFORExFKSB7CS8vIEFTTkQKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCQlSZXQgPSBFcGxTZG9Bc25kdVNlbmREYXRhKHBBc3lTZG9TZXFDb25fcC0+bV9Db25IYW5kbGUsIHBFcGxGcmFtZV9wLAkvLyBwb2ludGVyIHRvIGZyYW1lCisJCQkJCSAgdWlEYXRhU2l6ZV9wKTsKKyNlbHNlCisJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisjZW5kaWYKKwl9IGVsc2UgewkJLy8gZXJyb3IKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRIZGw7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeVJlY2VpdmVDYgorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgY2FsbGJhY2stZnVuY3Rpb24gZm9yIHJlY2VpdmVkIGZyYW1lcyBmcm9tIGxvd2VyIGxheWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIENvbkhkbF9wICAgICAgICA9IGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwU2RvU2VxRGF0YV9wICAgPSBwb2ludGVyIHRvIGZyYW1lCisvLyAgICAgICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgICA9IHNpemUgb2YgZnJhbWUKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lSZWNlaXZlQ2IodEVwbFNkb0NvbkhkbCBDb25IZGxfcCwKKwkJCQkgICAgIHRFcGxBc3lTZG9TZXEgKiBwU2RvU2VxRGF0YV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudCA9IDA7CisJdW5zaWduZWQgaW50IHVpRnJlZUVudHJ5ID0gRVBMX01BWF9TRE9fU0VRX0NPTjsKKwl0RXBsQXN5U2RvU2VxQ29uICpwQXN5U2RvU2VxQ29uOworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24KKwlFbnRlckNyaXRpY2FsU2VjdGlvbihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlKTsKKyNlbmRpZgorCisJRVBMX0RCR0xWTF9TRE9fVFJBQ0UyKCJIYW5kbGU6IDB4JXggLCBGaXJzdCBEYXRhYnl0ZSAweCV4XG4iLCBDb25IZGxfcCwKKwkJCSAgICAgICgoQllURSAqKSBwU2RvU2VxRGF0YV9wKVswXSk7CisKKwkvLyBzZWFyY2ggY29udHJvbGwgc3RydWN0dXJlIGZvciB0aGlzIGNvbm5lY3Rpb24KKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUNvdW50XTsKKwl3aGlsZSAodWlDb3VudCA8IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJaWYgKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID09IENvbkhkbF9wKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgPT0gMCkKKwkJCSAgICYmICh1aUZyZWVFbnRyeSA9PSBFUExfTUFYX1NET19TRVFfQ09OKSkgeworCQkJLy8gZnJlZSBlbnRyeQorCQkJdWlGcmVlRW50cnkgPSB1aUNvdW50OworCQl9CisJCXVpQ291bnQrKzsKKwkJcEFzeVNkb1NlcUNvbisrOworCX0KKworCWlmICh1aUNvdW50ID09IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsJLy8gbmV3IGNvbm5lY3Rpb24KKwkJaWYgKHVpRnJlZUVudHJ5ID09IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJCVJldCA9IGtFcGxTZG9TZXFOb0ZyZWVIYW5kbGU7CisJCQlnb3RvIEV4aXQ7CisJCX0gZWxzZSB7CisJCQlwQXN5U2RvU2VxQ29uID0KKwkJCSAgICAmQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkgICAgbV9Bc3lTZG9Db25uZWN0aW9uW3VpRnJlZUVudHJ5XTsKKwkJCS8vIHNhdmUgaGFuZGxlIGZyb20gbG93ZXIgbGF5ZXIKKwkJCXBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID0gQ29uSGRsX3A7CisJCQkvLyBpbmNyZW1lbnQgdXNlIGNvdW50ZXIKKwkJCXBBc3lTZG9TZXFDb24tPm1fdWlVc2VDb3VudCsrOworCQkJdWlDb3VudCA9IHVpRnJlZUVudHJ5OworCQl9CisJfQorCS8vIGNhbGwgaGlzdG9yeSBhY2sgZnVuY3Rpb24KKwlSZXQgPSBFcGxTZG9Bc3lBY2tGcmFtZVRvSGlzdG9yeShwQXN5U2RvU2VxQ29uLAorCQkJCQkgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJICAoJnBTZG9TZXFEYXRhX3AtPgorCQkJCQkgICBtX2xlX2JSZWNTZXFOdW1Db24pICYKKwkJCQkJICBFUExfU0VRX05VTV9NQVNLKSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24KKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlKTsKKyNlbmRpZgorCisJLy8gY2FsbCBwcm9jZXNzIGZ1bmN0aW9uIHdpdGggcG9pbnRlciBvZiBmcmFtZSBhbmQgZXZlbnQga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWMKKwlSZXQgPSBFcGxTZG9Bc3lTZXFQcm9jZXNzKHVpQ291bnQsCisJCQkJICB1aURhdGFTaXplX3AsCisJCQkJICBOVUxMLCBwU2RvU2VxRGF0YV9wLCBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYyk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeUluaXRIaXN0b3J5CisvLworLy8gRGVzY3JpcHRpb246ICAgICBpbnRpIGZ1bmN0aW9uIGZvciBoaXN0b3J5IGJ1ZmZlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lJbml0SGlzdG9yeSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJLy8gaW5pdCBtX2JGcmVlRW50cmllcyBpbiBoaXN0b3J5LWJ1ZmZlcgorCWZvciAodWlDb3VudCA9IDA7IHVpQ291bnQgPCBFUExfTUFYX1NET19TRVFfQ09OOyB1aUNvdW50KyspIHsKKwkJQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uW3VpQ291bnRdLgorCQkgICAgbV9TZG9Db25IaXN0b3J5Lm1fYkZyZWVFbnRyaWVzID0gRVBMX1NET19ISVNUT1JZX1NJWkU7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeUFkZEZyYW1lVG9IaXN0b3J5CisvLworLy8gRGVzY3JpcHRpb246ICAgICBmdW5jdGlvbiB0byBhZGQgYSBmcmFtZSB0byB0aGUgaGlzdG9yeSBidWZmZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGlzIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgcEZyYW1lX3AgICAgICAgID0gcG9pbnRlciB0byBmcmFtZQorLy8gICAgICAgICAgICAgICAgICB1aVNpemVfcCAgICAgICAgPSBzaXplIG9mIHRoZSBmcmFtZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBzaXplIG9mIHRoZSBldGhlcm5ldCBoZWFkZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgYXNuZCBoZWFkZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeUFkZEZyYW1lVG9IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgICAgdEVwbEZyYW1lICogcEZyYW1lX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBc3lTZG9Db25IaXN0b3J5ICpwSGlzdG9yeTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gYWRkIGZyYW1lIHRvIGhpc3RvcnkgYnVmZmVyCisKKwkvLyBjaGVjayBzaXplCisJLy8gJCQkIGQuay4gRVBMX1NFUV9ISVNUT1JZX0ZSQU1FX1NJWkUgaW5jbHVkZXMgdGhlIGhlYWRlciBzaXplLCBidXQgdWlTaXplX3AgZG9lcyBub3QhISEKKwlpZiAodWlTaXplX3AgPiBFUExfU0VRX0hJU1RST1lfRlJBTUVfU0laRSkgeworCQlSZXQgPSBrRXBsU2RvU2VxRnJhbWVTaXplRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2F2ZSBwb2ludGVyIHRvIGhpc3RvcnkKKwlwSGlzdG9yeSA9ICZwQXN5U2RvU2VxQ29uX3AtPm1fU2RvQ29uSGlzdG9yeTsKKworCS8vIGNoZWNrIGlmIGEgZnJlZSBlbnRyeSBpcyBhdmFpbGFibGUKKwlpZiAocEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzID4gMCkgewkvLyB3cml0ZSBtZXNzYWdlIGluIGZyZWUgZW50cnkKKwkJRVBMX01FTUNQWSgmCisJCQkgICAoKHRFcGxGcmFtZSAqKSBwSGlzdG9yeS0+CisJCQkgICAgbV9hYWJIaXN0b3J5RnJhbWVbcEhpc3RvcnktPm1fYldyaXRlXSktPgorCQkJICAgbV9sZV9iTWVzc2FnZVR5cGUsICZwRnJhbWVfcC0+bV9sZV9iTWVzc2FnZVR5cGUsCisJCQkgICB1aVNpemVfcCArIEVQTF9BU05EX0hFQURFUl9TSVpFKTsKKwkJLy8gc3RvcmUgc2l6ZQorCQlwSGlzdG9yeS0+bV9hdWlGcmFtZVNpemVbcEhpc3RvcnktPm1fYldyaXRlXSA9IHVpU2l6ZV9wOworCisJCS8vIGRlY3JlbWVuZCBudW1iZXIgb2YgZnJlZSBidWZmZXJlbnRyaWVzCisJCXBIaXN0b3J5LT5tX2JGcmVlRW50cmllcy0tOworCisJCS8vIGluY3JlbWVudCB3cml0ZWluZGV4CisJCXBIaXN0b3J5LT5tX2JXcml0ZSsrOworCisJCS8vIGNoZWNrIGlmIHdyaXRlLWluZGV4IHJ1biBvdmVyIGFycmF5LWJvYXJkZXIKKwkJaWYgKHBIaXN0b3J5LT5tX2JXcml0ZSA9PSBFUExfU0RPX0hJU1RPUllfU0laRSkgeworCQkJcEhpc3RvcnktPm1fYldyaXRlID0gMDsKKwkJfQorCisJfSBlbHNlIHsJCS8vIG5vIGZyZWUgZW50cnkKKwkJUmV0ID0ga0VwbFNkb1NlcU5vRnJlZUhpc3Rvcnk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lBY2tGcmFtZVRvSGlzdG9yeQorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgZnVuY3Rpb24gdG8gZGVsZXRlIGFja25vd2xlZGdlZCBmcmFtZXMgZnJvbiBoaXN0b3J5IGJ1ZmZlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoaXMgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBiUmVjU2VxTnVtYmVyX3AgPSByZWNlaXZlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lBY2tGcmFtZVRvSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICAgIEJZVEUgYlJlY1NlcU51bWJlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBc3lTZG9Db25IaXN0b3J5ICpwSGlzdG9yeTsKKwlCWVRFIGJBY2tJbmRleDsKKwlCWVRFIGJDdXJyZW50U2VxTnVtOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgcG9pbnRlciB0byBoaXN0b3J5IGJ1ZmZlcgorCXBIaXN0b3J5ID0gJnBBc3lTZG9TZXFDb25fcC0+bV9TZG9Db25IaXN0b3J5OworCisJLy8gcmVsZWFzZSBhbGwgYWNrbm93bGVkZ2VkIGZyYW1lcyBmcm9tIGhpc3RvcnkgYnVmZmVyCisKKwkvLyBjaGVjayBpZiB0aGVyZSBhcmUgZW50cmllcyBpbiBoaXN0b3J5CisJaWYgKHBIaXN0b3J5LT5tX2JGcmVlRW50cmllcyA8IEVQTF9TRE9fSElTVE9SWV9TSVpFKSB7CisJCWJBY2tJbmRleCA9IHBIaXN0b3J5LT5tX2JBY2s7CisJCWRvIHsKKwkJCWJDdXJyZW50U2VxTnVtID0KKwkJCSAgICAoKCh0RXBsRnJhbWUgKikgcEhpc3RvcnktPgorCQkJICAgICAgbV9hYWJIaXN0b3J5RnJhbWVbYkFja0luZGV4XSktPm1fRGF0YS5tX0FzbmQuCisJCQkgICAgIG1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfU0VRX05VTV9NQVNLKTsKKwkJCWlmICgoKGJSZWNTZXFOdW1iZXJfcCAtCisJCQkgICAgICBiQ3VycmVudFNlcU51bSkgJiBFUExfU0VRX05VTV9NQVNLKQorCQkJICAgIDwgRVBMX1NFUV9OVU1fVEhSRVNIT0xEKSB7CisJCQkJcEhpc3RvcnktPm1fYXVpRnJhbWVTaXplW2JBY2tJbmRleF0gPSAwOworCQkJCWJBY2tJbmRleCsrOworCQkJCXBIaXN0b3J5LT5tX2JGcmVlRW50cmllcysrOworCQkJCWlmIChiQWNrSW5kZXggPT0gRVBMX1NET19ISVNUT1JZX1NJWkUpIHsJLy8gcmVhZCBpbmRleCBydW4gb3ZlciBhcnJheS1ib2FyZGVyCisJCQkJCWJBY2tJbmRleCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsJLy8gbm90aGluZyB0byBkbyBhbnltb3JlLAorCQkJCS8vIGJlY2F1c2UgYW55IGZ1cnRoZXIgZnJhbWUgaW4gaGlzdG9yeSBoYXMgbGFyZ2VyIHNlcXVlbmNlCisJCQkJLy8gbnVtYmVyIHRoYW4gdGhlIGFja25vd2xlZGdlCisJCQkJZ290byBFeGl0OworCQkJfQorCQl9CisJCXdoaWxlICgoKChiUmVjU2VxTnVtYmVyX3AgLSAxIC0KKwkJCSAgYkN1cnJlbnRTZXFOdW0pICYgRVBMX1NFUV9OVU1fTUFTSykKKwkJCTwgRVBMX1NFUV9OVU1fVEhSRVNIT0xEKQorCQkgICAgICAgJiYgKHBIaXN0b3J5LT5tX2JXcml0ZSAhPSBiQWNrSW5kZXgpKTsKKworCQkvLyBzdG9yZSBsb2NhbCByZWFkLWluZGV4IHRvIGdsb2JhbCB2YXIKKwkJcEhpc3RvcnktPm1fYkFjayA9IGJBY2tJbmRleDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgZnVuY3Rpb24gdG8gb25lIGZyYW1lIGZyb20gaGlzdG9yeQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoaXMgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwcEZyYW1lX3AgICAgICAgPSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiB0aGUgc3RvcmVkIGZyYW1lCisvLyAgICAgICAgICAgICAgICAgIHB1aVNpemVfcCAgICAgICA9IE9VVDogc2l6ZSBvZiB0aGUgZnJhbWUKKy8vICAgICAgICAgICAgICAgICAgZkluaXRSZWFkICAgICAgID0gYm9vbCB3aGljaCBpbmRpY2F0ZSBhIHN0YXJ0IG9mIHJldHJhbnNtaXNzaW9uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gcmV0dXJuIGxhc3Qgbm90IGFja25vd2xlZGdlZCBtZXNzYWdlIGlmIFRSVUUKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgdEVwbEZyYW1lICoqIHBwRnJhbWVfcCwKKwkJCQkJICAgdW5zaWduZWQgaW50ICpwdWlTaXplX3AsCisJCQkJCSAgIEJPT0wgZkluaXRSZWFkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFzeVNkb0Nvbkhpc3RvcnkgKnBIaXN0b3J5OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZWFkIG9uZSBtZXNzYWdlIGZyb20gSGlzdG9yeQorCisJLy8gZ2V0IHBvaW50ZXIgdG8gaGlzdG9yeSBidWZmZXIKKwlwSGlzdG9yeSA9ICZwQXN5U2RvU2VxQ29uX3AtPm1fU2RvQ29uSGlzdG9yeTsKKworCS8vIGNoZWNrIGlmIGluaXQKKwlpZiAoZkluaXRSZWFkX3AgIT0gRkFMU0UpIHsJLy8gaW5pdGlhbGl6ZSByZWFkIGluZGV4IHRvIHRoZSBpbmRleCB3aGljaCBzaGFsbCBiZSBhY2tub3dsZWRnZWQgbmV4dAorCQlwSGlzdG9yeS0+bV9iUmVhZCA9IHBIaXN0b3J5LT5tX2JBY2s7CisJfQorCS8vIGNoZWNrIGlmIGVudHJpZXMgYXJlIGF2YWlsYWJsZSBmb3IgcmVhZGluZworCWlmICgocEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzIDwgRVBMX1NET19ISVNUT1JZX1NJWkUpCisJICAgICYmIChwSGlzdG9yeS0+bV9iV3JpdGUgIT0gcEhpc3RvcnktPm1fYlJlYWQpKSB7CisvLyAgICAgICAgUFJJTlRGNCgiRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5KCk6IGluaXQgPSAlZCwgcmVhZCA9ICV1LCB3cml0ZSA9ICV1LCBhY2sgPSAldSIsIChpbnQpIGZJbml0UmVhZF9wLCAoV09SRClwSGlzdG9yeS0+bV9iUmVhZCwgKFdPUkQpcEhpc3RvcnktPm1fYldyaXRlLCAoV09SRClwSGlzdG9yeS0+bV9iQWNrKTsKKy8vICAgICAgICBQUklOVEYyKCIsIGZyZWUgZW50cmllcyA9ICV1LCBuZXh0IGZyYW1lIHNpemUgPSAldVxuIiwgKFdPUkQpcEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzLCBwSGlzdG9yeS0+bV9hdWlGcmFtZVNpemVbcEhpc3RvcnktPm1fYlJlYWRdKTsKKworCQkvLyByZXR1cm4gcG9pbnRlciB0byBzdG9yZWQgZnJhbWUKKwkJKnBwRnJhbWVfcCA9CisJCSAgICAodEVwbEZyYW1lICopIHBIaXN0b3J5LT5tX2FhYkhpc3RvcnlGcmFtZVtwSGlzdG9yeS0+CisJCQkJCQkJICAgICAgbV9iUmVhZF07CisKKwkJLy8gc2F2ZSBzaXplCisJCSpwdWlTaXplX3AgPSBwSGlzdG9yeS0+bV9hdWlGcmFtZVNpemVbcEhpc3RvcnktPm1fYlJlYWRdOworCisJCXBIaXN0b3J5LT5tX2JSZWFkKys7CisJCWlmIChwSGlzdG9yeS0+bV9iUmVhZCA9PSBFUExfU0RPX0hJU1RPUllfU0laRSkgeworCQkJcEhpc3RvcnktPm1fYlJlYWQgPSAwOworCQl9CisKKwl9IGVsc2UgeworLy8gICAgICAgIFBSSU5URjMoIkVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeSgpOiByZWFkID0gJXUsIGFjayA9ICV1LCBmcmVlIGVudHJpZXMgPSAldSwgbm8gZnJhbWVcbiIsIChXT1JEKXBIaXN0b3J5LT5tX2JSZWFkLCAoV09SRClwSGlzdG9yeS0+bV9iQWNrLCAoV09SRClwSGlzdG9yeS0+bV9iRnJlZUVudHJpZXMpOworCisJCS8vIG5vIG1vcmUgZnJhbWVzIHRvIHNlbmQKKwkJLy8gcmV0dXJuIG51bGwgcG9pbnRlcgorCQkqcHBGcmFtZV9wID0gTlVMTDsKKworCQkqcHVpU2l6ZV9wID0gMDsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lHZXRGcmVlRW50cmllc0Zyb21IaXN0b3J5CisvLworLy8gRGVzY3JpcHRpb246ICAgICBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJlZSBoaXN0cm95IGVudHJpZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGlzIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB1bnNpZ25lZCBpbnQgICAgPSBudW1iZXIgb2YgZnJlZSBlbnRyaWVzCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdW5zaWduZWQgaW50IEVwbFNkb0FzeUdldEZyZWVFbnRyaWVzRnJvbUhpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqCisJCQkJCQkgICAgICAgcEFzeVNkb1NlcUNvbl9wKQoreworCXVuc2lnbmVkIGludCB1aUZyZWVFbnRyaWVzOworCisJdWlGcmVlRW50cmllcyA9CisJICAgICh1bnNpZ25lZCBpbnQpcEFzeVNkb1NlcUNvbl9wLT5tX1Nkb0Nvbkhpc3RvcnkubV9iRnJlZUVudHJpZXM7CisKKwlyZXR1cm4gdWlGcmVlRW50cmllczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisvLworLy8gRGVzY3JpcHRpb246ICAgICBmdW5jdGlvbiBzZXRzIG9yIG1vZGlmeSB0aW1lciBpbiB0aW1lcm1vc3VsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoaXMgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICB1bFRpbWVvdXQgICAgICAgPSB0aW1lb3V0IGluIG1zCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdW5zaWduZWQgaW50ICAgID0gbnVtYmVyIG9mIGZyZWUgZW50cmllcworLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2V0VGltZXIodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVvdXQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rU2RvQXN5U2VxOworCVRpbWVyQXJnLm1fdWxBcmcgPSAodW5zaWduZWQgbG9uZylwQXN5U2RvU2VxQ29uX3A7CisKKwlpZiAocEFzeVNkb1NlcUNvbl9wLT5tX0VwbFRpbWVySGRsID09IDApIHsJLy8gY3JlYXRlIG5ldyB0aW1lcgorCQlSZXQgPSBFcGxUaW1lcnVTZXRUaW1lck1zKCZwQXN5U2RvU2VxQ29uX3AtPm1fRXBsVGltZXJIZGwsCisJCQkJCSAgdWxUaW1lb3V0LCBUaW1lckFyZyk7CisJfSBlbHNlIHsJCS8vIG1vZGlmeSBleGlzaXRpbmcgdGltZXIKKwkJUmV0ID0gRXBsVGltZXJ1TW9kaWZ5VGltZXJNcygmcEFzeVNkb1NlcUNvbl9wLT5tX0VwbFRpbWVySGRsLAorCQkJCQkgICAgIHVsVGltZW91dCwgVGltZXJBcmcpOworCisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0NvbXUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQ29tdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGViMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0NvbXUuYwpAQCAtMCwwICsxLDMzNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgU0RPIENvbW1hbmQgTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQ29tdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0NvbXUuaCIKKworI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSA9PSAwKSAmJlwKKyAgICAgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgPT0gMCkgICApCisKKyNlcnJvciAnRVJST1I6IEF0IGxlYXN0IFNETyBTZXJ2ZXIgb3IgU0RPIENsaWVudCBzaG91bGQgYmUgYWN0aXZhdGUhJworCisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgPT0gMCkgJiYgKEVQTF9PQkRfVVNFX0tFUk5FTCA9PSBGQUxTRSkKKworI2Vycm9yICdFUlJPUjogU0RPIFNlcnZlciBuZWVkcyBPQkR1IG1vZHVsZSEnCisKKyNlbmRpZgorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRVBMX01BWF9TRE9fQ09NX0NPTgorI2RlZmluZSBFUExfTUFYX1NET19DT01fQ09OICAgICAgICAgNQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaW50ZXJuIGV2ZW50cwordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3QgPSAweDAwLAkvLyBmaXJzdCBmcmFtZSB0byBzZW5kCisJa0VwbFNkb0NvbUNvbkV2ZW50UmVjID0gMHgwMSwJLy8gZnJhbWUgcmVjZWl2ZWQKKwlrRXBsU2RvQ29tQ29uRXZlbnRDb25Fc3RhYmxpc2hlZCA9IDB4MDIsCS8vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKwlrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQgPSAweDAzLAkvLyBjb25uZWN0aW9uIGNsb3NlZAorCWtFcGxTZG9Db21Db25FdmVudEFja1JlY2VpdmVkID0gMHgwNCwJLy8gYWNrbm93bGVkZ2UgcmVjZWl2ZWQgYnkgbG93ZXIgbGF5ZXIKKwkvLyAtPiBjb250aW51ZSBzZW5kaW5nCisJa0VwbFNkb0NvbUNvbkV2ZW50RnJhbWVTZW5kZWQgPSAweDA1LAkvLyBsb3dlciBoYXMgc2VuZCBhIGZyYW1lCisJa0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yID0gMHgwNiwJLy8gZXJyb3IgZHVyaW5naW5pdGlhbGlzaWF0aW9uCisJLy8gb2YgdGhlIGNvbm5lY3Rpb24KKwlrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0ID0gMHgwNwkvLyB0aW1lb3V0IGluIGxvd2VyIGxheWVyCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCSAgICAsCisKKwlrRXBsU2RvQ29tQ29uRXZlbnRJbml0Q29uID0gMHgwOCwJLy8gaW5pdCBjb25uZWN0aW9uIChvbmx5IGNsaWVudCkKKwlrRXBsU2RvQ29tQ29uRXZlbnRBYm9ydCA9IDB4MDkJLy8gYWJvcnQgc2RvIHRyYW5zZmVyIChvbmx5IGNsaWVudCkKKyNlbmRpZgorfSB0RXBsU2RvQ29tQ29uRXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb0NvbVNlbmRUeXBlUmVxID0gMHgwMCwJLy8gc2VuZCBhIHJlcXVlc3QKKwlrRXBsU2RvQ29tU2VuZFR5cGVBY2tSZXMgPSAweDAxLAkvLyBzZW5kIGEgcmVzb25zZSB3aXRob3V0IGRhdGEKKwlrRXBsU2RvQ29tU2VuZFR5cGVSZXMgPSAweDAyLAkvLyBzZW5kIHJlc3BvbnNlIHdpdGggZGF0YQorCWtFcGxTZG9Db21TZW5kVHlwZUFib3J0ID0gMHgwMwkvLyBzZW5kIGFib3J0Cit9IHRFcGxTZG9Db21TZW5kVHlwZTsKKworLy8gc3RhdGUgb2YgdGhlIHN0YXRlIG1hc2NoaW5lCit0eXBlZGVmIGVudW0geworCS8vIEdlbmVyYWwgU3RhdGUKKwlrRXBsU2RvQ29tU3RhdGVJZGxlID0gMHgwMCwJLy8gaWRsZSBzdGF0ZQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorCS8vIFNlcnZlciBTdGF0ZXMKKwlrRXBsU2RvQ29tU3RhdGVTZXJ2ZXJTZWdtVHJhbnMgPSAweDAxLAkvLyBzZW5kIGZvbGxvd2luZyBmcmFtZXMKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCS8vIENsaWVudCBTdGF0ZXMKKwlrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdCA9IDB4MTAsCS8vIHdhaXQgZm9yIGluaXQgY29ubmVjdGlvbgorCS8vIG9uIGxvd2VyIGxheWVyCisJa0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkID0gMHgxMSwJLy8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorCWtFcGxTZG9Db21TdGF0ZUNsaWVudFNlZ21UcmFucyA9IDB4MTIJLy8gc2VuZCBmb2xsb3dpbmcgZnJhbWVzCisjZW5kaWYKK30gdEVwbFNkb0NvbVN0YXRlOworCisvLyBjb250cm9sIHN0cnVjdHVyZSBmb3IgdHJhbnNhY3Rpb24KK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsU2RvU2VxQ29uSGRsIG1fU2RvU2VxQ29uSGRsOwkvLyBpZiAhPSAwIC0+IGVudHJ5IHVzZWQKKwl0RXBsU2RvQ29tU3RhdGUgbV9TZG9Db21TdGF0ZTsKKwlCWVRFIG1fYlRyYW5zYWN0aW9uSWQ7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CS8vIE5vZGVJZCBvZiB0aGUgdGFyZ2V0CisJLy8gLT4gbmVlZGVkIHRvIHJlaW5pdCBjb25uZWN0aW9uCisJLy8gICAgYWZ0ZXIgdGltZW91dAorCXRFcGxTZG9UcmFuc1R5cGUgbV9TZG9UcmFuc1R5cGU7CS8vIEF1dG8sIEV4cGVkaXRlZCwgU2VnbWVudGVkCisJdEVwbFNkb1NlcnZpY2VUeXBlIG1fU2RvU2VydmljZVR5cGU7CS8vIFdyaXRlQnlJbmRleCwgUmVhZEJ5SW5kZXgKKwl0RXBsU2RvVHlwZSBtX1Nkb1Byb3RUeXBlOwkvLyBwcm90b2NvbCBsYXllcjogQXV0bywgVWRwLCBBc25kLCBQZG8KKwlCWVRFICptX3BEYXRhOwkJLy8gcG9pbnRlciB0byBkYXRhCisJdW5zaWduZWQgaW50IG1fdWlUcmFuc1NpemU7CS8vIG51bWJlciBvZiBieXRlcworCS8vIHRvIHRyYW5zZmVyCisJdW5zaWduZWQgaW50IG1fdWlUcmFuc2ZlcnJlZEJ5dGU7CS8vIG51bWJlciBvZiBieXRlcworCS8vIGFscmVhZHkgdHJhbnNmZXJyZWQKKwl0RXBsU2RvRmluaXNoZWRDYiBtX3BmblRyYW5zZmVyRmluaXNoZWQ7CS8vIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZQorCS8vIGFwcGxpY2F0aW9uCisJLy8gLT4gY2FsbGVkIGluIHRoZSBlbmQgb2YKKwkvLyAgICB0aGUgU0RPIHRyYW5zZmVyCisJdm9pZCAqbV9wVXNlckFyZzsJLy8gdXNlciBkZWZpbmFibGUgYXJndW1lbnQgcG9pbnRlcgorCisJRFdPUkQgbV9kd0xhc3RBYm9ydENvZGU7CS8vIHNhdmUgdGhlIGxhc3QgYWJvcnQgY29kZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkvLyBvbmx5IGZvciBjbGllbnQKKwl1bnNpZ25lZCBpbnQgbV91aVRhcmdldEluZGV4OwkvLyBpbmRleCB0byBhY2Nlc3MKKwl1bnNpZ25lZCBpbnQgbV91aVRhcmdldFN1YkluZGV4OwkvLyBzdWJpb25kZXggdG8gYWNjZXNzCisKKwkvLyBmb3IgZnV0dXJlIHVzZQorCXVuc2lnbmVkIGludCBtX3VpVGltZW91dDsJLy8gdGltZW91dCBmb3IgdGhpcyBjb25uZWN0aW9uCisKKyNlbmRpZgorCit9IHRFcGxTZG9Db21Db247CisKKy8vIGluc3RhbmNlIHRhYmxlCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbUNvbiBtX1Nkb0NvbUNvbltFUExfTUFYX1NET19DT01fQ09OXTsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCUxQQ1JJVElDQUxfU0VDVElPTiBtX3BDcml0aWNhbFNlY3Rpb247CisJQ1JJVElDQUxfU0VDVElPTiBtX0NyaXRpY2FsU2VjdGlvbjsKKyNlbmRpZgorCit9IHRFcGxTZG9Db21JbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsU2RvQ29tSW5zdGFuY2UgU2RvQ29tSW5zdGFuY2VfZzsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tUmVjZWl2ZUNiKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUNvbkNiKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJIHRFcGxBc3lTZG9Db25TdGF0ZSBBc3lTZG9Db25TdGF0ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VhcmNoQ29uSW50ZXJuKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJCSAgIHRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudF9wLAorCQkJCQkgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tUHJvY2Vzc0ludGVybih0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbl9wLAorCQkJCQkgdEVwbFNkb0NvbUNvbkV2ZW50IFNkb0NvbUNvbkV2ZW50X3AsCisJCQkJCSB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbl9wLAorCQkJCQkgICAgdEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJICAgIHRFcGxTZG9Db21Db25TdGF0ZQorCQkJCQkgICAgU2RvQ29tQ29uU3RhdGVfcCk7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZXJ2ZXJJbml0UmVhZEJ5SW5kZXgodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJCSB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJIHRFcGxTZG9Db21TZW5kVHlwZSBTZW5kVHlwZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVySW5pdFdyaXRlQnlJbmRleCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRTZW5kKHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJICAgICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkgICBEV09SRCBkd0Fib3J0Q29kZV9wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxTRE8gQ29tbWFuZCBMYXllcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBTRE8gQ29tbWFuZCBsYXllciBNb2R1bAorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBJbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU2RvQ29tQWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tQWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogSW5pdCBhZGRpdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tQWRkSW5zdGFuY2Uodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gaW5pdCBjb250cm9sbCBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZTZG9Db21JbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoU2RvQ29tSW5zdGFuY2VfZykpOworCisJLy8gaW5pdCBpbnN0YW5jZSBvZiBsb3dlciBsYXllcgorCVJldCA9IEVwbFNkb0FzeVNlcUFkZEluc3RhbmNlKEVwbFNkb0NvbVJlY2VpdmVDYiwgRXBsU2RvQ29tQ29uQ2IpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBjcmVhdGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCVNkb0NvbUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uID0KKwkgICAgJlNkb0NvbUluc3RhbmNlX2cubV9Dcml0aWNhbFNlY3Rpb247CisJSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihTZG9Db21JbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21EZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21EZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBkZWxldGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCURlbGV0ZUNyaXRpY2FsU2VjdGlvbihTZG9Db21JbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworCVJldCA9IEVwbFNkb0FzeVNlcURlbEluc3RhbmNlKCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbURlZmluZUNvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWZpbmVzIGEgU0RPIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBub2RlCisvLyAgICAgICAgICAgICAgLT4gaW5pdCBsb3dlciBsYXllciBhbmQgcmV0dXJucyBhIGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24uCisvLyAgICAgICAgICAgICAgVHdvIGNsaWVudCBjb25uZWN0aW9ucyB0byB0aGUgc2FtZSBub2RlIHZpYSB0aGUgc2FtZSBwcm90b2NvbAorLy8gICAgICAgICAgICAgIGFyZSBub3QgYWxsb3dlZC4gSWYgdGhpcyBmdW5jdGlvbiBkZXRlY3RzIHN1Y2ggYSBzaXR1YXRpb24KKy8vICAgICAgICAgICAgICBpdCB3aWxsIHJldHVybiBrRXBsU2RvQ29tSGFuZGxlRXhpc3RzIGFuZCB0aGUgaGFuZGxlIG9mCisvLyAgICAgICAgICAgICAgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gaW4gcFNkb0NvbUNvbkhkbF9wLgorLy8gICAgICAgICAgICAgIFVzaW5nIG9mIGV4aXN0aW5nIHNlcnZlciBjb25uZWN0aW9ucyBpcyBwb3NzaWJsZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbkhkbF9wICAgICA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiB0aGUgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWlUYXJnZXROb2RlSWRfcCAgICA9IE5vZGVJZCBvZiB0aGUgdGFyZ2V0bm9kZQorLy8gICAgICAgICAgICAgIFByb3RUeXBlX3AgICAgICAgICAgPSB0eXBlIG9mIHByb3RvY29sIHRvIHVzZSBmb3IgY29ubmVjdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21EZWZpbmVDb24odEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aVRhcmdldE5vZGVJZF9wLAorCQkJCSAgICAgdEVwbFNkb1R5cGUgUHJvdFR5cGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlSGRsOworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisKKwkvLyBjaGVjayBQYXJhbWV0ZXIKKwlBU1NFUlQocFNkb0NvbUNvbkhkbF9wICE9IE5VTEwpOworCisJLy8gY2hlY2sgTm9kZUlkCisJaWYgKCh1aVRhcmdldE5vZGVJZF9wID09IEVQTF9DX0FEUl9JTlZBTElEKQorCSAgICB8fCAodWlUYXJnZXROb2RlSWRfcCA+PSBFUExfQ19BRFJfQlJPQURDQVNUKSkgeworCQlSZXQgPSBrRXBsSW52YWxpZE5vZGVJZDsKKworCX0KKwkvLyBzZWFyY2ggZnJlZSBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvblswXTsKKwl1aUNvdW50ID0gMDsKKwl1aUZyZWVIZGwgPSBFUExfTUFYX1NET19DT01fQ09OOworCXdoaWxlICh1aUNvdW50IDwgRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkgewkvLyBmcmVlIGVudHJ5CisJCQl1aUZyZWVIZGwgPSB1aUNvdW50OworCQl9IGVsc2UgaWYgKChwU2RvQ29tQ29uLT5tX3VpTm9kZUlkID09IHVpVGFyZ2V0Tm9kZUlkX3ApCisJCQkgICAmJiAocFNkb0NvbUNvbi0+bV9TZG9Qcm90VHlwZSA9PSBQcm90VHlwZV9wKSkgewkvLyBleGlzdGluZyBjbGllbnQgY29ubmVjdGlvbiB3aXRoIHNhbWUgbm9kZSBJRCBhbmQgc2FtZSBwcm90b2NvbCB0eXBlCisJCQkqcFNkb0NvbUNvbkhkbF9wID0gdWlDb3VudDsKKwkJCVJldCA9IGtFcGxTZG9Db21IYW5kbGVFeGlzdHM7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwU2RvQ29tQ29uKys7CisJfQorCisJaWYgKHVpRnJlZUhkbCA9PSBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCVJldCA9IGtFcGxTZG9Db21Ob0ZyZWVIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bdWlGcmVlSGRsXTsKKwkvLyBzYXZlIGhhbmRsZSBmb3IgYXBwbGljYXRpb24KKwkqcFNkb0NvbUNvbkhkbF9wID0gdWlGcmVlSGRsOworCS8vIHNhdmUgcGFyYW1ldGVycworCXBTZG9Db21Db24tPm1fU2RvUHJvdFR5cGUgPSBQcm90VHlwZV9wOworCXBTZG9Db21Db24tPm1fdWlOb2RlSWQgPSB1aVRhcmdldE5vZGVJZF9wOworCisJLy8gc2V0IFRyYW5zYWN0aW9uIElkCisJcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCA9IDA7CisKKwkvLyBjaGVjayBwcm90b2NvbAorCXN3aXRjaCAoUHJvdFR5cGVfcCkgeworCQkvLyB1ZHAKKwljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQl7CisJCQkvLyBjYWxsIGNvbm5lY3Rpb24gaW50IGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFJbml0Q29uKCZwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgcFNkb0NvbUNvbi0+bV91aU5vZGVJZCwKKwkJCQkJCSAga0VwbFNkb1R5cGVVZHApOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQXNlbmQKKwljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwkJeworCQkJLy8gY2FsbCBjb25uZWN0aW9uIGludCBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCQkJUmV0ID0gRXBsU2RvQXN5U2VxSW5pdENvbigmcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwsCisJCQkJCQkgIHBTZG9Db21Db24tPm1fdWlOb2RlSWQsCisJCQkJCQkgIGtFcGxTZG9UeXBlQXNuZCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBQZG8gLT4gbm90IHN1cHBvcnRlZAorCWNhc2Uga0VwbFNkb1R5cGVQZG86CisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKG1fUHJvdFR5cGVfcCkKKworCS8vIGNhbGwgcHJvY2VzcyBmdW5jdGlvbgorCVJldCA9IEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4odWlGcmVlSGRsLAorCQkJCSAgICAga0VwbFNkb0NvbUNvbkV2ZW50SW5pdENvbiwgTlVMTCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlJbmRleAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0IFNETyBUcmFuc2ZlciBmb3IgYSBkZWZpbmVkIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21UcmFuc1BhcmFtX3AgICAgPSBTdHJ1Y3R1cmUgd2l0aCBwYXJhbWV0ZXJzIGZvciBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgodEVwbFNkb0NvbVRyYW5zUGFyYW1CeUluZGV4ICoKKwkJCQkJICAgICAgIHBTZG9Db21UcmFuc1BhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmICgocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aVN1YmluZGV4ID49IDB4RkYpCisJICAgIHx8IChwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpSW5kZXggPT0gMCkKKwkgICAgfHwgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlJbmRleCA+IDB4RkZGRikKKwkgICAgfHwgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fcERhdGEgPT0gTlVMTCkKKwkgICAgfHwgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlEYXRhU2l6ZSA9PSAwKSkgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZFBhcmFtOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fU2RvQ29tQ29uSGRsID49IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorCXBTZG9Db21Db24gPQorCSAgICAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX1Nkb0NvbUNvbkhkbF07CisKKwkvLyBjaGVjayBpZiBoYW5kbGUgb2sKKwlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBpZiBjb21tYW5kIGxheWVyIGlzIGlkbGUKKwlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKyBwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplKSA+IDApIHsJLy8gaGFuZGxlIGlzIG5vdCBpZGxlCisJCVJldCA9IGtFcGxTZG9Db21IYW5kbGVCdXN5OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNhdmUgcGFyYW1ldGVyCisJLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVuZCBvZiB0cmFuc2ZlcgorCXBTZG9Db21Db24tPm1fcGZuVHJhbnNmZXJGaW5pc2hlZCA9CisJICAgIHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fcGZuU2RvRmluaXNoZWRDYjsKKwlwU2RvQ29tQ29uLT5tX3BVc2VyQXJnID0gcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9wVXNlckFyZzsKKworCS8vIHNldCB0eXBlIG9mIFNETyBjb21tYW5kCisJaWYgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fU2RvQWNjZXNzVHlwZSA9PSBrRXBsU2RvQWNjZXNzVHlwZVJlYWQpIHsKKwkJcFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSA9IGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXg7CisJfSBlbHNlIHsKKwkJcFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSA9IGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OworCisJfQorCS8vIHNhdmUgcG9pbnRlciB0byBkYXRhCisJcFNkb0NvbUNvbi0+bV9wRGF0YSA9IHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fcERhdGE7CisJLy8gbWF4aW1hbCBieXRlcyB0byB0cmFuc2ZlcgorCXBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPSBwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpRGF0YVNpemU7CisJLy8gYnl0ZXMgYWxyZWFkeSB0cmFuc2ZlcmVkCisJcFNkb0NvbUNvbi0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IDA7CisKKwkvLyByZXNldCBwYXJ0cyBvZiBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0gMDsKKwlwU2RvQ29tQ29uLT5tX1Nkb1RyYW5zVHlwZSA9IGtFcGxTZG9UcmFuc0F1dG87CisJLy8gc2F2ZSB0aW1lb3V0CisJLy9wU2RvQ29tQ29uLT5tX3VpVGltZW91dCA9IFNkb0NvbVRyYW5zUGFyYW1fcC5tX3VpVGltZW91dDsKKworCS8vIHNhdmUgaW5kZXggYW5kIHN1YmluZGV4CisJcFNkb0NvbUNvbi0+bV91aVRhcmdldEluZGV4ID0gcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aUluZGV4OworCXBTZG9Db21Db24tPm1fdWlUYXJnZXRTdWJJbmRleCA9IHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlTdWJpbmRleDsKKworCS8vIGNhbGwgcHJvY2VzcyBmdW5jdGlvbgorCVJldCA9IEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4ocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9TZG9Db21Db25IZGwsIGtFcGxTZG9Db21Db25FdmVudFNlbmRGaXJzdCwJLy8gZXZlbnQgdG8gc3RhcnQgdHJhbnNmZXIKKwkJCQkgICAgIE5VTEwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21VbmRlZmluZUNvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB1bmRlZmluZSBhIFNETyBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29tQ29uSGRsX3AgICAgPSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbVVuZGVmaW5lQ29uKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKFNkb0NvbUNvbkhkbF9wID49IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bU2RvQ29tQ29uSGRsX3BdOworCisJLy8gJCQkIGQuay4gYWJvcnQgYSBydW5uaW5nIHRyYW5zZmVyIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXF1ZW5jZSBsYXllcgorCisJaWYgKCgocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spICE9CisJICAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETCkKKwkgICAgJiYgKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsICE9IDApKSB7CisJCS8vIGNsb3NlIGNvbm5lY3Rpb24gaW4gbG93ZXIgbGF5ZXIKKwkJc3dpdGNoIChwU2RvQ29tQ29uLT5tX1Nkb1Byb3RUeXBlKSB7CisJCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQkJeworCQkJCVJldCA9CisJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsU2RvVHlwZVBkbzoKKwkJY2FzZSBrRXBsU2RvVHlwZUF1dG86CisJCWRlZmF1bHQ6CisJCQl7CisJCQkJUmV0ID0ga0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJfQkJLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uLT5tX1Nkb1Byb3RUeXBlKQorCX0KKworCS8vIGNsZWFuIGNvbnRyb2xsIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQocFNkb0NvbUNvbiwgMHgwMCwgc2l6ZW9mKHRFcGxTZG9Db21Db24pKTsKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tR2V0U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gcmV0dXJucyB0aGUgc3RhdGUgZm8gdGhlIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21Db25IZGxfcCAgICA9IGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICBwU2RvQ29tRmluaXNoZWRfcCA9IHBvaW50ZXIgdG8gc3RydWN0dXIgZm9yIHNkbyBzdGF0ZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21HZXRTdGF0ZSh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICB0RXBsU2RvQ29tRmluaXNoZWQgKiBwU2RvQ29tRmluaXNoZWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoU2RvQ29tQ29uSGRsX3AgPj0gRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltTZG9Db21Db25IZGxfcF07CisKKwkvLyBjaGVjayBpZiBoYW5kbGUgb2sKKwlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCXBTZG9Db21GaW5pc2hlZF9wLT5tX3BVc2VyQXJnID0gcFNkb0NvbUNvbi0+bV9wVXNlckFyZzsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV91aU5vZGVJZCA9IHBTZG9Db21Db24tPm1fdWlOb2RlSWQ7CisJcFNkb0NvbUZpbmlzaGVkX3AtPm1fdWlUYXJnZXRJbmRleCA9IHBTZG9Db21Db24tPm1fdWlUYXJnZXRJbmRleDsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV91aVRhcmdldFN1YkluZGV4ID0gcFNkb0NvbUNvbi0+bV91aVRhcmdldFN1YkluZGV4OworCXBTZG9Db21GaW5pc2hlZF9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0KKwkgICAgcFNkb0NvbUNvbi0+bV91aVRyYW5zZmVycmVkQnl0ZTsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV9kd0Fib3J0Q29kZSA9IHBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlOworCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0NvbUNvbkhkbCA9IFNkb0NvbUNvbkhkbF9wOworCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlID09IGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4KSB7CisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0FjY2Vzc1R5cGUgPSBrRXBsU2RvQWNjZXNzVHlwZVdyaXRlOworCX0gZWxzZSB7CisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0FjY2Vzc1R5cGUgPSBrRXBsU2RvQWNjZXNzVHlwZVJlYWQ7CisJfQorCisJaWYgKHBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlICE9IDApIHsJLy8gc2RvIGFib3J0CisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0NvbUNvblN0YXRlID0KKwkJICAgIGtFcGxTZG9Db21UcmFuc2ZlclJ4QWJvcnRlZDsKKworCQkvLyBkZWxldGUgYWJvcnQgY29kZQorCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9IDA7CisKKwl9IGVsc2UgaWYgKChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSykgPT0gRVBMX1NET19TRVFfSU5WQUxJRF9IREwpIHsJLy8gY2hlY2sgc3RhdGUKKwkJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQ29tQ29uU3RhdGUgPQorCQkgICAga0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0OworCX0gZWxzZSBpZiAocFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9PSBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdCkgeworCQkvLyBmaW5pc2hlZAorCQlwU2RvQ29tRmluaXNoZWRfcC0+bV9TZG9Db21Db25TdGF0ZSA9CisJCSAgICBrRXBsU2RvQ29tVHJhbnNmZXJOb3RBY3RpdmU7CisJfSBlbHNlIGlmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApIHsJLy8gZmluaXNoZWQKKwkJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQ29tQ29uU3RhdGUgPQorCQkgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tU2RvQWJvcnQKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gYWJvcnQgYSBzZG8gdHJhbnNmZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21Db25IZGxfcCAgICA9IGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICBkd0Fib3J0Q29kZV9wICAgICA9IGFib3J0IGNvZGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tU2RvQWJvcnQodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgRFdPUkQgZHdBYm9ydENvZGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCisJaWYgKFNkb0NvbUNvbkhkbF9wID49IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltTZG9Db21Db25IZGxfcF07CisKKwkvLyBjaGVjayBpZiBoYW5kbGUgb2sKKwlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzYXZlIHBvaW50ZXIgdG8gYWJvcnQgY29kZQorCXBTZG9Db21Db24tPm1fcERhdGEgPSAoQllURSAqKSAmIGR3QWJvcnRDb2RlX3A7CisKKwlSZXQgPSBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuKFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICAga0VwbFNkb0NvbUNvbkV2ZW50QWJvcnQsCisJCQkJICAgICAodEVwbEFzeVNkb0NvbSAqKSBOVUxMKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tUmVjZWl2ZUNiCisvLworLy8gRGVzY3JpcHRpb246ICAgICBjYWxsYmFjayBmdW5jdGlvbiBmb3IgU0RPIFNlcXVlbmNlIExheWVyCisvLyAgICAgICAgICAgICAgICAgIC0+IGluZGljYXRlcyBuZXcgZGF0YQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBTZG9TZXFDb25IZGxfcCA9IEhhbmRsZSBmb3IgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICA9IHBvaW50ZXIgdG8gZGF0YQorLy8gICAgICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICA9IHNpemUgb2YgZGF0YSAoJCQkIG5vdCB1c2VkIHlldCwgYnV0IGl0IHNob3VsZCkKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbVJlY2VpdmVDYih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwkvLyBzZWFyY2ggY29ubmVjdGlvbiBpbnRlcm5hbGx5CisJUmV0ID0gRXBsU2RvQ29tU2VhcmNoQ29uSW50ZXJuKFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgICBrRXBsU2RvQ29tQ29uRXZlbnRSZWMsIHBBc3lTZG9Db21fcCk7CisKKwlFUExfREJHTFZMX1NET19UUkFDRTMKKwkgICAgKCJFcGxTZG9Db21SZWNlaXZlQ2IgU2RvU2VxQ29uSGRsOiAweCVYLCBGaXJzdCBCeXRlIG9mIHBBc3lTZG9Db21fcDogMHglMDJYLCB1aURhdGFTaXplX3A6IDB4JTA0WFxuIiwKKwkgICAgIFNkb1NlcUNvbkhkbF9wLCAoV09SRCkgcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbMF0sCisJICAgICB1aURhdGFTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbUNvbkNiCisvLworLy8gRGVzY3JpcHRpb246ICAgICBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYnkgU0RPIFNlcXVlbmNlIExheWVyIHRvIGluZm9ybQorLy8gICAgICAgICAgICAgICAgICBjb21tYW5kIGxheWVyIGFib3V0IHN0YXRlIGNoYW5nZSBvZiBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIFNkb1NlcUNvbkhkbF9wICAgICAgPSBIYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgQXN5U2RvQ29uU3RhdGVfcCAgICA9IEV2ZW50IG9mIHRoZSBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUNvbkNiKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJIHRFcGxBc3lTZG9Db25TdGF0ZSBBc3lTZG9Db25TdGF0ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudCA9IGtFcGxTZG9Db21Db25FdmVudFNlbmRGaXJzdDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgc3RhdGUKKwlzd2l0Y2ggKEFzeVNkb0NvblN0YXRlX3ApIHsKKwljYXNlIGtBc3lTZG9Db25TdGF0ZUNvbm5lY3RlZDoKKwkJeworCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJDb25uZWN0aW9uIGVzdGFibGlzaGVkXG4iKTsKKwkJCVNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50Q29uRXN0YWJsaXNoZWQ7CisJCQkvLyBzdGFydCB0cmFuc21pc3Npb24gaWYgbmVlZGVkCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3I6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiRXJyb3IgZHVyaW5nIGluaXRpYWxpc2F0aW9uXG4iKTsKKwkJCVNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yOworCQkJLy8gaW5mb3JtIGFwcCBhYm91dCBlcnJvciBhbmQgY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrQXN5U2RvQ29uU3RhdGVDb25DbG9zZWQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiQ29ubmVjdGlvbiBjbG9zZWRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ7CisJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtBc3lTZG9Db25TdGF0ZUFja1JlY2VpdmVkOgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAoIkFja25vd2xhZ2UgcmVjZWl2ZWRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRBY2tSZWNlaXZlZDsKKwkJCS8vIGNvbnRpbnVlIHRyYW5zbWlzc2lvbgorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiT25lIEZyYW1lIHNlbnRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRGcmFtZVNlbmRlZDsKKwkJCS8vIHRvIGNvbnRpbnVlIHRyYW5zbWlzc2lvbgorCQkJYnJlYWs7CisKKwkJfQorCisJY2FzZSBrQXN5U2RvQ29uU3RhdGVUaW1lb3V0OgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAoIlRpbWVvdXRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0OworCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQlicmVhazsKKworCQl9CisJfQkJCS8vIGVuZCBvZiBzd2l0Y2goQXN5U2RvQ29uU3RhdGVfcCkKKworCVJldCA9IEVwbFNkb0NvbVNlYXJjaENvbkludGVybihTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgICAgU2RvQ29tQ29uRXZlbnQsICh0RXBsQXN5U2RvQ29tICopIE5VTEwpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbVNlYXJjaENvbkludGVybgorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgc2VhcmNoIGEgU2RvIFNlcXVlbmNlIExheWVyIGNvbm5lY3Rpb24gaGFuZGxlIGluIHRoZQorLy8gICAgICAgICAgICAgICAgICBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGUgQ29tbWFuZCBMYXllcgorLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgU2RvU2VxQ29uSGRsX3AgICAgID0gSGFuZGxlIHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgICAgICBTZG9Db21Db25FdmVudF9wID0gZXZlbnQgdG8gcHJvY2VzcworLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICAgID0gcG9pbnRlciB0byByZWNlaXZlZCBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbAorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VhcmNoQ29uSW50ZXJuKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJCSAgIHRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudF9wLAorCQkJCQkgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisJdEVwbFNkb0NvbUNvbkhkbCBIZGxDb3VudDsKKwl0RXBsU2RvQ29tQ29uSGRsIEhkbEZyZWU7CisKKwlSZXQgPSBrRXBsU2RvQ29tTm90UmVzcG9uc2libGU7CisKKwkvLyBnZXQgcG9pbnRlciB0byBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvblswXTsKKwlIZGxDb3VudCA9IDA7CisJSGRsRnJlZSA9IDB4RkZGRjsKKwl3aGlsZSAoSGRsQ291bnQgPCBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9PSBTZG9TZXFDb25IZGxfcCkgewkvLyBtYXRjaGluZyBjb21tYW5kIGxheWVyIGhhbmRsZSBmb3VuZAorCQkJUmV0ID0gRXBsU2RvQ29tUHJvY2Vzc0ludGVybihIZGxDb3VudCwKKwkJCQkJCSAgICAgU2RvQ29tQ29uRXZlbnRfcCwKKwkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKwkJfSBlbHNlIGlmICgocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkKKwkJCSAgICYmIChIZGxGcmVlID09IDB4RkZGRikpIHsKKwkJCUhkbEZyZWUgPSBIZGxDb3VudDsKKwkJfQorCisJCXBTZG9Db21Db24rKzsKKwkJSGRsQ291bnQrKzsKKwl9CisKKwlpZiAoUmV0ID09IGtFcGxTZG9Db21Ob3RSZXNwb25zaWJsZSkgewkvLyBubyByZXNwb25zaWJsZSBjb21tYW5kIGxheWVyIGhhbmRsZSBmb3VuZAorCQlpZiAoSGRsRnJlZSA9PSAweEZGRkYpIHsJLy8gbm8gZnJlZSBoYW5kbGUKKwkJCS8vIGRlbGV0ZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5CisJCQkvLyAyMDA4LzA0LzE0IG0udS4vZC5rLiBUaGlzIGNvbm5lY3Rpb24gYWN0dWFsbHkgZG9lcyBub3QgZXhpc3QuCisJCQkvLyAgICAgICAgICAgICAgICAgICAgICBwU2RvQ29tQ29uIGlzIGludmFsaWQuCisJCQkvLyBSZXQgPSBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwpOworCQkJUmV0ID0ga0VwbFNkb0NvbU5vRnJlZUhhbmRsZTsKKwkJfSBlbHNlIHsJLy8gY3JlYXRlIG5ldyBoYW5kbGUKKwkJCUhkbENvdW50ID0gSGRsRnJlZTsKKwkJCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltIZGxDb3VudF07CisJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9IFNkb1NlcUNvbkhkbF9wOworCQkJUmV0ID0gRXBsU2RvQ29tUHJvY2Vzc0ludGVybihIZGxDb3VudCwKKwkJCQkJCSAgICAgU2RvQ29tQ29uRXZlbnRfcCwKKwkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKwkJfQorCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4KKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIHNlYXJjaCBhIFNkbyBTZXF1ZW5jZSBMYXllciBjb25uZWN0aW9uIGhhbmRsZSBpbiB0aGUKKy8vICAgICAgICAgICAgICAgICAgY29udHJvbCBzdHJ1Y3RlciBvZiB0aGUgQ29tbWFuZCBMYXllcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBTZG9Db21Db25fcCAgICAgPSBpbmRleCBvZiBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIFNkb0NvbUNvbkV2ZW50X3AgPSBldmVudCB0byBwcm9jZXNzCisvLyAgICAgICAgICAgICAgICAgIHBBc3lTZG9Db21fcCAgICAgPSBwb2ludGVyIHRvIHJlY2VpdmVkIGZyYW1lCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4odEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJIHRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudF9wLAorCQkJCQkgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCUJZVEUgYkZsYWc7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisJRFdPUkQgZHdBYm9ydENvZGU7CisJdW5zaWduZWQgaW50IHVpU2l6ZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlFbnRlckNyaXRpY2FsU2VjdGlvbihTZG9Db21JbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwCisJICAgICgiXG5cdEVudGVyQ2l0aWNhbFNlY3Rpb24gRXBsU2RvQ29tUHJvY2Vzc0ludGVyblxuXG4iKTsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltTZG9Db21Db25fcF07CisKKwkvLyBwcm9jZXNzIHN0YXRlIG1hc2NoaW5lCisJc3dpdGNoIChwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlKSB7CisJCS8vIGlkbGUgc3RhdGUKKwljYXNlIGtFcGxTZG9Db21TdGF0ZUlkbGU6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChTZG9Db21Db25FdmVudF9wKSB7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCQkJCS8vIGluaXQgY29uIGZvciBjbGllbnQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50SW5pdENvbjoKKwkJCQl7CisKKwkJCQkJLy8gY2FsbCBvZiB0aGUgaW5pdCBmdW5jdGlvbiBhbHJlYWR5CisJCQkJCS8vIHByb2Nlc3NlZCBpbiBFcGxTZG9Db21EZWZpbmVDb24oKQorCQkJCQkvLyBvbmx5IGNoYW5nZSBzdGF0ZSB0byBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdAorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKworCQkJCS8vIGludCBjb24gZm9yIHNlcnZlcgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRSZWM6CisJCQkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKwkJCQkJLy8gY2hlY2sgaWYgaW5pdCBvZiBhbiB0cmFuc2ZlciBhbmQgbm8gU0RPIGFib3J0CisJCQkJCWlmICgocEFzeVNkb0NvbV9wLT5tX2xlX2JGbGFncyAmIDB4ODApID09IDApIHsJLy8gU0RPIHJlcXVlc3QKKwkJCQkJCWlmICgocEFzeVNkb0NvbV9wLT5tX2xlX2JGbGFncyAmIDB4NDApID09IDApIHsJLy8gbm8gU0RPIGFib3J0CisJCQkJCQkJLy8gc2F2ZSB0YW5zYWN0aW9uIGlkCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fYlRyYW5zYWN0aW9uSWQgPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlRyYW5zYWN0aW9uSWQpOworCQkJCQkJCS8vIGNoZWNrIGNvbW1hbmQKKwkJCQkJCQlzd2l0Y2ggKHBBc3lTZG9Db21fcC0+CisJCQkJCQkJCW1fbGVfYkNvbW1hbmRJZCkKKwkJCQkJCQl7CisJCQkJCQkJY2FzZSBrRXBsU2RvU2VydmljZU5JTDoKKwkJCQkJCQkJewkvLyBzaW1wbHkgYWNrbm93bGVnZGUgTklMIGNvbW1hbmQgb24gc2VxdWVuY2UgbGF5ZXIKKworCQkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCQkgICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJCSAgICAgICopCisJCQkJCQkJCQkgICAgIE5VTEwpOworCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCisJCQkJCQkJY2FzZSBrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4OgorCQkJCQkJCQl7CS8vIHJlYWQgYnkgaW5kZXgKKworCQkJCQkJCQkJLy8gc2VhcmNoIGVudHJ5IGFuIHN0YXJ0IHRyYW5zZmVyCisJCQkJCQkJCQlFcGxTZG9Db21TZXJ2ZXJJbml0UmVhZEJ5SW5kZXgKKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKwkJCQkJCQkJCS8vIGNoZWNrIG5leHQgc3RhdGUKKwkJCQkJCQkJCWlmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApIHsJLy8gcmVhZHkgLT4gc3RheSBpZGxlCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVJZGxlOworCQkJCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICAwOworCQkJCQkJCQkJfSBlbHNlIHsJLy8gc2VnbWVudGVkIHRyYW5zZmVyCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVTZXJ2ZXJTZWdtVHJhbnM7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisKKwkJCQkJCQljYXNlIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OgorCQkJCQkJCQl7CisKKwkJCQkJCQkJCS8vIHNlYXJjaCBlbnRyeSBhbiBzdGFydCB3cml0ZQorCQkJCQkJCQkJRXBsU2RvQ29tU2VydmVySW5pdFdyaXRlQnlJbmRleAorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkJICAgICBwQXN5U2RvQ29tX3ApOworCQkJCQkJCQkJLy8gY2hlY2sgbmV4dCBzdGF0ZQorCQkJCQkJCQkJaWYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkgewkvLyBhbHJlYWR5IC0+IHN0YXkgaWRsZQorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlSWRsZTsKKwkJCQkJCQkJCQkvLyByZXNldCBhYm9ydCBjb2RlCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAgMDsKKwkJCQkJCQkJCX0gZWxzZSB7CS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlU2VydmVyU2VnbVRyYW5zOworCQkJCQkJCQkJfQorCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gIHVuc3VwcG9ydGVkIGNvbW1hbmQKKwkJCQkJCQkJCS8vICAgICAgIC0+IGFib3J0IHNlbmRlbgorCQkJCQkJCQkJZHdBYm9ydENvZGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgRVBMX1NET0FDX1VOS05PV05fQ09NTUFORF9TUEVDSUZJRVI7CisJCQkJCQkJCQkvLyBzZW5kIGFib3J0CisJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCSAgICBtX3BEYXRhCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIChCWVRFCisJCQkJCQkJCQkgICAgICopCisJCQkJCQkJCQkgICAgJgorCQkJCQkJCQkJICAgIGR3QWJvcnRDb2RlOworCQkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJCSAgICBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4KKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCisJCQkJCQkJCX0KKworCQkJCQkJCX0JLy8gZW5kIG9mIHN3aXRjaChwQXN5U2RvQ29tX3AtPm1fbGVfYkNvbW1hbmRJZCkKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLy8gdGhpcyBjb21tYW5kIGxheWVyIGhhbmRsZSBpcyBub3QgcmVzcG9uc2libGUKKwkJCQkJCS8vICh3cm9uZyBkaXJlY3Rpb24gb3Igd3JvbmcgdHJhbnNhY3Rpb24gSUQpCisJCQkJCQlSZXQgPSBrRXBsU2RvQ29tTm90UmVzcG9uc2libGU7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjb25uZWN0aW9uIGNsb3NlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDoKKwkJCQl7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJLy8gY2xlYW4gY29udHJvbCBzdHJ1Y3R1cmUKKwkJCQkJRVBMX01FTVNFVChwU2RvQ29tQ29uLCAweDAwLAorCQkJCQkJICAgc2l6ZW9mKHRFcGxTZG9Db21Db24pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKFNkb0NvbUNvbkV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gU0RPIFNlcnZlciBwYXJ0CisJCS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCWNhc2Uga0VwbFNkb0NvbVN0YXRlU2VydmVyU2VnbVRyYW5zOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoU2RvQ29tQ29uRXZlbnRfcCkgeworCQkJCS8vIHNlbmQgbmV4dCBmcmFtZQorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRBY2tSZWNlaXZlZDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50RnJhbWVTZW5kZWQ6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiBpdCBpcyBhIHJlYWQKKwkJCQkJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgPT0KKwkJCQkJICAgIGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXgpIHsKKwkJCQkJCS8vIHNlbmQgbmV4dCBmcmFtZQorCQkJCQkJRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuCisJCQkJCQkgICAgKHBTZG9Db21Db24sIDAsIDAsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZVJlcyk7CisJCQkJCQkvLyBpZiBhbGwgc2VuZCAtPiBiYWNrIHRvIGlkbGUKKwkJCQkJCWlmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApIHsJLy8gYmFjayB0byBpZGxlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUgPQorCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVJZGxlOworCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJCSAgICAwOworCQkJCQkJfQorCisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gcHJvY2VzcyBuZXh0IGZyYW1lCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFJlYzoKKwkJCQl7CisJCQkJCS8vIGNoZWNrIGlmIHRoZSBmcmFtZSBpcyBhIFNETyByZXNwb25zZSBhbmQgaGFzIHRoZSByaWdodCB0cmFuc2FjdGlvbiBJRAorCQkJCQliRmxhZyA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQlpZiAoKChiRmxhZyAmIDB4ODApICE9IDApCisJCQkJCSAgICAmJgorCQkJCQkgICAgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJICAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCSAgICAgIG1fbGVfYlRyYW5zYWN0aW9uSWQpID09CisJCQkJCSAgICAgcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCkpIHsKKwkJCQkJCS8vIGNoZWNrIGlmIGl0IGlzIGEgYWJvcnQKKwkJCQkJCWlmICgoYkZsYWcgJiAweDQwKSAhPSAwKSB7CS8vIFNETyBhYm9ydAorCQkJCQkJCS8vIGNsZWFyIGNvbnRyb2wgc3RydWN0dXJlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPSAwOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZSA9CisJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUlkbGU7CisJCQkJCQkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkJICAgIDA7CisJCQkJCQkJLy8gZC5rLjogZG8gbm90IGV4ZWN1dGUgYW55dGhpbmcgZnVydGhlciBvbiB0aGlzIGNvbW1hbmQKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCS8vIGNoZWNrIGlmIGl0IGlzIGEgd3JpdGUKKwkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCSAgICBtX1Nkb1NlcnZpY2VUeXBlID09CisJCQkJCQkgICAga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXgpCisJCQkJCQl7CisJCQkJCQkJLy8gd3JpdGUgZGF0YSB0byBPRAorCQkJCQkJCXVpU2l6ZSA9CisJCQkJCQkJICAgIEFtaUdldFdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUpOworCQkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUgPT0KKwkJCQkJCQkgICAgMCkgeworCQkJCQkJCQlFUExfTUVNQ1BZCisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgICAmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJICAgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkJICAgICBbMF0sCisJCQkJCQkJCSAgICAgdWlTaXplKTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gdXBkYXRlIGNvdW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICArPSB1aVNpemU7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgLT0KKwkJCQkJCQkgICAgdWlTaXplOworCisJCQkJCQkJLy8gdXBkYXRlIHBvaW50ZXIKKwkJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID09CisJCQkJCQkJICAgIDApIHsKKwkJCQkJCQkJKCAvKihCWVRFKikgKi8KKwkJCQkJCQkJIHBTZG9Db21Db24tPgorCQkJCQkJCQkgbV9wRGF0YSkgKz0KKwkJCQkJCSAgICAgIHVpU2l6ZTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gY2hlY2sgZW5kIG9mIHRyYW5zZmVyCisJCQkJCQkJaWYgKChwQXN5U2RvQ29tX3AtPm1fbGVfYkZsYWdzICYgMHgzMCkgPT0gMHgzMCkgewkvLyB0cmFuc2ZlciByZWFkeQorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUKKwkJCQkJCQkJICAgID0gMDsKKworCQkJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkgICAgPT0gMCkgeworCQkJCQkJCQkJLy8gc2VuZCByZXNwb25zZQorCQkJCQkJCQkJLy8gc2VuZCBuZXh0IGZyYW1lCisJCQkJCQkJCQlFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4KKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlUmVzKTsKKwkJCQkJCQkJCS8vIGlmIGFsbCBzZW5kIC0+IGJhY2sgdG8gaWRsZQorCQkJCQkJCQkJaWYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkgewkvLyBiYWNrIHRvIGlkbGUKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUlkbGU7CisJCQkJCQkJCQkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIDA7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSB7CS8vIHNlbmQgZGFib3J0IGNvZGUKKwkJCQkJCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJICAgIG1fcERhdGEKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgKEJZVEUKKwkJCQkJCQkJCSAgICAgKikKKwkJCQkJCQkJCSAgICAmCisJCQkJCQkJCQkgICAgcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGU7CisJCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkJICAgIEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybgorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisKKwkJCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCQkgICAgPSAwOworCisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBzZW5kIGFja25vd2xlZGdlIHdpdGhvdXQgYW55IENvbW1hbmQgbGF5ZXIgZGF0YQorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkgICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJICAgICAgKikgTlVMTCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgewkvLyB0aGlzIGNvbW1hbmQgbGF5ZXIgaGFuZGxlIGlzIG5vdCByZXNwb25zaWJsZQorCQkJCQkJLy8gKHdyb25nIGRpcmVjdGlvbiBvciB3cm9uZyB0cmFuc2FjdGlvbiBJRCkKKwkJCQkJCVJldCA9IGtFcGxTZG9Db21Ob3RSZXNwb25zaWJsZTsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjb25uZWN0aW9uIGNsb3NlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDoKKwkJCQl7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJLy8gY2xlYW4gY29udHJvbCBzdHJ1Y3R1cmUKKwkJCQkJRVBMX01FTVNFVChwU2RvQ29tQ29uLCAweDAwLAorCQkJCQkJICAgc2l6ZW9mKHRFcGxTZG9Db21Db24pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKFNkb0NvbUNvbkV2ZW50X3ApCisKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gZW5kaWYgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIFNETyBDbGllbnQgcGFydAorCQkvLyB3YWl0IGZvciBmaW5pc2ggb2YgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb24KKwljYXNlIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OgorCQl7CisKKwkJCS8vIGlmIGNvbm5lY3Rpb24gaGFuZGxlIGlzIGludmFsaWQgcmVpbml0IGNvbm5lY3Rpb24KKwkJCS8vIGQuay46IHRoaXMgd2lsbCBiZSBkb25lIG9ubHkgb24gbmV3IGV2ZW50cyAoaS5lLiBJbml0VHJhbnNmZXIpCisJCQlpZiAoKHBTZG9Db21Db24tPgorCQkJICAgICBtX1Nkb1NlcUNvbkhkbCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSykgPT0KKwkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETCkgeworCQkJCS8vIGNoZWNrIGtpbmQgb2YgY29ubmVjdGlvbiB0byByZWluaXQKKwkJCQkvLyBjaGVjayBwcm90b2NvbAorCQkJCXN3aXRjaCAocFNkb0NvbUNvbi0+bV9TZG9Qcm90VHlwZSkgeworCQkJCQkvLyB1ZHAKKwkJCQljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQkJCQl7CisJCQkJCQkvLyBjYWxsIGNvbm5lY3Rpb24gaW50IGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcUluaXRDb24KKwkJCQkJCSAgICAoJnBTZG9Db21Db24tPgorCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAgcFNkb0NvbUNvbi0+bV91aU5vZGVJZCwKKwkJCQkJCSAgICAga0VwbFNkb1R5cGVVZHApOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gQXNlbmQgLT4gbm90IHN1cHBvcnRlZAorCQkJCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQkJCQl7CisJCQkJCQkvLyBjYWxsIGNvbm5lY3Rpb24gaW50IGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcUluaXRDb24KKwkJCQkJCSAgICAoJnBTZG9Db21Db24tPgorCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAgcFNkb0NvbUNvbi0+bV91aU5vZGVJZCwKKwkJCQkJCSAgICAga0VwbFNkb1R5cGVBc25kKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIFBkbyAtPiBub3Qgc3VwcG9ydGVkCisJCQkJY2FzZSBrRXBsU2RvVHlwZVBkbzoKKwkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQlSZXQgPSBrRXBsU2RvQ29tVW5zdXBwb3J0ZWRQcm90OworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKG1fUHJvdFR5cGVfcCkKKwkJCQkvLyBkLmsuOiByZXNldCB0cmFuc2FjdGlvbiBJRCwgYmVjYXVzZSBuZXcgc2VxdWVuY2UgbGF5ZXIgY29ubmVjdGlvbiB3YXMgaW5pdGlhbGl6ZWQKKwkJCQkvLyAkJCQgZC5rLiBpcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/CisJCQkJLy9wU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkID0gMDsKKwkJCX0KKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChTZG9Db21Db25FdmVudF9wKSB7CisJCQkJLy8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25Fc3RhYmxpc2hlZDoKKwkJCQl7CisJCQkJCS8vc2VuZCBmaXJzdCBmcmFtZSBpZiBuZWVkZWQKKwkJCQkJaWYgKChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID4gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uLT5tX3VpVGFyZ2V0SW5kZXggIT0gMCkpIHsJLy8gc3RhcnQgU0RPIHRyYW5zZmVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0NvbUNsaWVudFNlbmQKKwkJCQkJCSAgICAocFNkb0NvbUNvbik7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hlY2sgaWYgc2VnZW10ZWQgdHJhbnNmZXIKKwkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCSAgICBtX1Nkb1RyYW5zVHlwZSA9PQorCQkJCQkJICAgIGtFcGxTZG9UcmFuc1NlZ21lbnRlZCkgeworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlID0KKwkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50U2VnbVRyYW5zOworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBnb3RvIHN0YXRlIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZAorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3Q6CisJCQkJeworCQkJCQkvLyBpbmZvcyBmb3IgdHJhbnNmZXIgYWxyZWFkeSBzYXZlZCBieSBmdW5jdGlvbiBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEluaXRFcnJvcjoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dDoKKwkJCQl7CisJCQkJCS8vIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJCXBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsIHw9CisJCQkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETDsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBmdW5jdGlvbgorCQkJCQlpZiAoU2RvQ29tQ29uRXZlbnRfcCA9PQorCQkJCQkgICAga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dCkgeworCQkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJICAgIEVQTF9TRE9BQ19USU1FX09VVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCSAgICAwOworCQkJCQl9CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0KTsKKwkJCQkJLy8gZC5rLjogZG8gbm90IGNsZWFuIGNvbnRyb2wgc3RydWN0dXJlCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2YgIHN3aXRjaChTZG9Db21Db25FdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBjb25uZWN0ZWQKKwljYXNlIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKFNkb0NvbUNvbkV2ZW50X3ApIHsKKwkJCQkvLyBzZW5kIGEgZnJhbWUKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50U2VuZEZpcnN0OgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRBY2tSZWNlaXZlZDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50RnJhbWVTZW5kZWQ6CisJCQkJeworCQkJCQlSZXQgPSBFcGxTZG9Db21DbGllbnRTZW5kKHBTZG9Db21Db24pOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgaWYgcmVhZCB0cmFuc2ZlciBmaW5pc2hlZAorCQkJCQlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uLT4KKwkJCQkJCW1fdWlUcmFuc2ZlcnJlZEJ5dGUgIT0gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlID09CisJCQkJCQlrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4KSkgeworCQkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCQlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkgICAgMDsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpOworCisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgaWYgc2VnZW10ZWQgdHJhbnNmZXIKKwkJCQkJaWYgKHBTZG9Db21Db24tPm1fU2RvVHJhbnNUeXBlID09CisJCQkJCSAgICBrRXBsU2RvVHJhbnNTZWdtZW50ZWQpIHsKKwkJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFNlZ21UcmFuczsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBmcmFtZSByZWNlaXZlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiB0aGUgZnJhbWUgaXMgYSBTRE8gcmVzcG9uc2UgYW5kIGhhcyB0aGUgcmlnaHQgdHJhbnNhY3Rpb24gSUQKKwkJCQkJYkZsYWcgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJaWYgKCgoYkZsYWcgJiAweDgwKSAhPSAwKQorCQkJCQkgICAgJiYKKwkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCSAgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkgICAgICBtX2xlX2JUcmFuc2FjdGlvbklkKSA9PQorCQkJCQkgICAgIHBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQpKSB7CisJCQkJCQkvLyBjaGVjayBpZiBhYm9ydCBvciBub3QKKwkJCQkJCWlmICgoYkZsYWcgJiAweDQwKSAhPSAwKSB7CisJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwgMCwKKwkJCQkJCQkgICAgICh0RXBsRnJhbWUgKikKKwkJCQkJCQkgICAgIE5VTEwpOworCQkJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkJLy8gc2F2ZSBhYm9ydCBjb2RlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCQkgICAgQW1pR2V0RHdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgICBbMF0pOworCQkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJSeEFib3J0ZWQpOworCisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfSBlbHNlIHsJLy8gbm9ybWFsIGZyYW1lIHJlY2VpdmVkCisJCQkJCQkJLy8gY2hlY2sgZnJhbWUKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUKKwkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKworCQkJCQkJCS8vIGNoZWNrIGlmIHRyYW5zZmVyIHJlYWR5CisJCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplID09CisJCQkJCQkJICAgIDApIHsKKwkJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJICAgICAodEVwbEZyYW1lCisJCQkJCQkJCSAgICAgICopIE5VTEwpOworCQkJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkgICAgPSAwOworCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpOworCisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLy8gdGhpcyBjb21tYW5kIGxheWVyIGhhbmRsZSBpcyBub3QgcmVzcG9uc2libGUKKwkJCQkJCS8vICh3cm9uZyBkaXJlY3Rpb24gb3Igd3JvbmcgdHJhbnNhY3Rpb24gSUQpCisJCQkJCQlSZXQgPSBrRXBsU2RvQ29tTm90UmVzcG9uc2libGU7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY29ubmVjdGlvbiBjbG9zZWQgZXZlbnQgZ28gYmFjayB0byBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ6CisJCQkJewkvLyBjb25uZWN0aW9uIGNsb3NlZCBieSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKwkJCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJLy8gc2V0IGhhbmRsZSB0byBpbnZhbGlkIGFuZCBlbnRlciBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdAorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCB8PQorCQkJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREw7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPSAwOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2Zlckxvd2VyTGF5ZXJBYm9ydCk7CisKKwkJCQkJZ290byBFeGl0OworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGFib3J0IHRvIHNlbmQgZnJvbSBoaWdoZXIgbGF5ZXIKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50QWJvcnQ6CisJCQkJeworCQkJCQlFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQocFNkb0NvbUNvbiwKKwkJCQkJCQkJICooKERXT1JEICopCisJCQkJCQkJCSAgIHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhKSk7CisKKwkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCXBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCSAgICAqKChEV09SRCAqKSBwU2RvQ29tQ29uLT5tX3BEYXRhKTsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJUeEFib3J0ZWQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQkJeworCQkJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCB8PQorCQkJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREw7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJICAgIEVQTF9TRE9BQ19USU1FX09VVDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQpOworCisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goU2RvQ29tQ29uRXZlbnRfcCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBwcm9jZXNzIHNlZ21lbnRlZCB0cmFuc2ZlcgorCWNhc2Uga0VwbFNkb0NvbVN0YXRlQ2xpZW50U2VnbVRyYW5zOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoU2RvQ29tQ29uRXZlbnRfcCkgeworCQkJCS8vIHNuZWQgYSBmcmFtZQorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3Q6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEFja1JlY2VpdmVkOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRGcmFtZVNlbmRlZDoKKwkJCQl7CisJCQkJCVJldCA9IEVwbFNkb0NvbUNsaWVudFNlbmQocFNkb0NvbUNvbik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQkvLyBjaGVjayBpZiByZWFkIHRyYW5zZmVyIGZpbmlzaGVkCisJCQkJCWlmICgocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9PSAwKQorCQkJCQkgICAgJiYgKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgPT0KKwkJCQkJCWtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXgpKSB7CisJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCXBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkOworCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJICAgIDA7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKTsKKworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50UmVjOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgaWYgdGhlIGZyYW1lIGlzIGEgcmVzcG9uc2UKKwkJCQkJYkZsYWcgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJaWYgKCgoYkZsYWcgJiAweDgwKSAhPSAwKQorCQkJCQkgICAgJiYKKwkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCSAgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkgICAgICBtX2xlX2JUcmFuc2FjdGlvbklkKSA9PQorCQkJCQkgICAgIHBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQpKSB7CisJCQkJCQkvLyBjaGVjayBpZiBhYm9ydCBvciBub3QKKwkJCQkJCWlmICgoYkZsYWcgJiAweDQwKSAhPSAwKSB7CisJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwgMCwKKwkJCQkJCQkgICAgICh0RXBsRnJhbWUgKikKKwkJCQkJCQkgICAgIE5VTEwpOworCQkJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUgPQorCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQ7CisJCQkJCQkJLy8gc2F2ZSBhYm9ydCBjb2RlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCQkgICAgQW1pR2V0RHdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgICBbMF0pOworCQkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJSeEFib3J0ZWQpOworCisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfSBlbHNlIHsJLy8gbm9ybWFsIGZyYW1lIHJlY2VpdmVkCisJCQkJCQkJLy8gY2hlY2sgZnJhbWUKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUKKwkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKworCQkJCQkJCS8vIGNoZWNrIGlmIHRyYW5zZmVyIHJlYWR5CisJCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplID09CisJCQkJCQkJICAgIDApIHsKKwkJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJICAgICAodEVwbEZyYW1lCisJCQkJCQkJCSAgICAgICopIE5VTEwpOworCQkJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDsKKwkJCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkJCSAgICAoU2RvQ29tQ29uX3AsCisJCQkJCQkJCSAgICAgcFNkb0NvbUNvbiwKKwkJCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCk7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjb25uZWN0aW9uIGNsb3NlZCBldmVudCBnbyBiYWNrIHRvIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDoKKwkJCQl7CS8vIGNvbm5lY3Rpb24gY2xvc2VkIGJ5IGNvbW11bmljYXRpb24gcGFydG5lcgorCQkJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQkvLyBzZXQgaGFuZGxlIHRvIGludmFsaWQgYW5kIGVudGVyIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0CisJCQkJCXBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsIHw9CisJCQkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETDsKKwkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQ7CisJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPSAwOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBhYm9ydCB0byBzZW5kIGZyb20gaGlnaGVyIGxheWVyCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEFib3J0OgorCQkJCXsKKwkJCQkJRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0KHBTZG9Db21Db24sCisJCQkJCQkJCSAqKChEV09SRCAqKQorCQkJCQkJCQkgICBwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgbV9wRGF0YSkpOworCisJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCSAgICAqKChEV09SRCAqKSBwU2RvQ29tQ29uLT5tX3BEYXRhKTsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJUeEFib3J0ZWQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQkJeworCQkJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCB8PQorCQkJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREw7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJICAgIEVQTF9TRE9BQ19USU1FX09VVDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQpOworCisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goU2RvQ29tQ29uRXZlbnRfcCkKKworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBlbmRvIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisKKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlKQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorICAgICAgRXhpdDoKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAorCSAgICAoIlxuXHRMZWF2ZUNyaXRpY2FsU2VjdGlvbiBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuXG5cbiIpOworCUxlYXZlQ3JpdGljYWxTZWN0aW9uKFNkb0NvbUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21TZXJ2ZXJJbml0UmVhZEJ5SW5kZXgKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgZnVuY3Rpb24gc3RhcnQgdGhlIHByb2Nlc3Npbmcgb2YgYW4gcmVhZCBieSBpbmRleCBjb21tYW5kCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBTZG9Db21Db25fcCAgICAgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgcEFzeVNkb0NvbV9wICAgICA9IHBvaW50ZXIgdG8gcmVjZWl2ZWQgZnJhbWUKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlcnZlckluaXRSZWFkQnlJbmRleCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdW5zaWduZWQgaW50IHVpU3ViaW5kZXg7CisJdEVwbE9iZFNpemUgRW50cnlTaXplOworCXRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZTsKKwlEV09SRCBkd0Fib3J0Q29kZTsKKworCWR3QWJvcnRDb2RlID0gMDsKKworCS8vIGEgaW5pdCBvZiBhIHJlYWQgY291bGQgbm90IGJlIGEgc2VnbWVudGVkIHRyYW5zZmVyCisJLy8gLT4gbm8gdmFyaWFibGUgcGFydCBvZiBoZWFkZXIKKworCS8vIGdldCBpbmRleCBhbmQgc3ViaW5kZXgKKwl1aUluZGV4ID0gQW1pR2V0V29yZEZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbMF0pOworCXVpU3ViaW5kZXggPSBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVsyXSk7CisKKwkvLyBjaGVjayBhY2Nlc3N0eXBlIG9mIGVudHJ5CisJLy8gZXhpc3RlbnMgb2YgZW50cnkKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmR1R2V0QWNjZXNzVHlwZSh1aUluZGV4LCB1aVN1YmluZGV4LCAmQWNjZXNzVHlwZSk7CisvKiNlbHNlCisgICAgUmV0ID0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3Q7CisgICAgQWNjZXNzVHlwZSA9IDA7CisjZW5kaWYqLworCWlmIChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpIHsJLy8gc3ViZW50cnkgZG9lc24ndCBleGlzdAorCQlkd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19TVUJfSU5ERVhfTk9UX0VYSVNUOworCQkvLyBzZW5kIGFib3J0CisJCXBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFICopICYgZHdBYm9ydENvZGU7CisJCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCQkgICAgIHVpSW5kZXgsCisJCQkJCQkgICAgIHVpU3ViaW5kZXgsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsKKwkJZ290byBFeGl0OworCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfT0JKRUNUX05PVF9FWElTVDsKKwkJLy8gc2VuZCBhYm9ydAorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSAqKSAmIGR3QWJvcnRDb2RlOworCQlSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJCQkJICAgICB1aUluZGV4LAorCQkJCQkJICAgICB1aVN1YmluZGV4LAorCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY29tcGFyZSBhY2Nlc3N0eXBlIG11c3QgYmUgcmVhZCBvciBjb25zdAorCWlmICgoKEFjY2Vzc1R5cGUgJiBrRXBsT2JkQWNjUmVhZCkgPT0gMCkKKwkgICAgJiYgKChBY2Nlc3NUeXBlICYga0VwbE9iZEFjY0NvbnN0KSA9PSAwKSkgeworCisJCWlmICgoQWNjZXNzVHlwZSAmIGtFcGxPYmRBY2NXcml0ZSkgIT0gMCkgeworCQkJLy8gZW50cnkgcmVhZCBhIHdyaXRlIG9ubHkgb2JqZWN0CisJCQlkd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19SRUFEX1RPX1dSSVRFX09OTFlfT0JKOworCQl9IGVsc2UgeworCQkJZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfVU5TVVBQT1JURURfQUNDRVNTOworCQl9CisJCS8vIHNlbmQgYWJvcnQKKwkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUgKikgJiBkd0Fib3J0Q29kZTsKKwkJUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCQkJCSAgICAgdWlJbmRleCwKKwkJCQkJCSAgICAgdWlTdWJpbmRleCwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNhdmUgc2VydmljZQorCXBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSA9IGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXg7CisKKwkvLyBnZXQgc2l6ZSBvZiBvYmplY3QgdG8gc2VlIGlvZiBzZWdtZW50ZWQgb3IgZXhwZWRpdGVkIHRyYW5zZmVyCisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJRW50cnlTaXplID0gRXBsT2JkdUdldERhdGFTaXplKHVpSW5kZXgsIHVpU3ViaW5kZXgpOworLyojZWxzZQorICAgIEVudHJ5U2l6ZSA9IDA7CisjZW5kaWYqLworCWlmIChFbnRyeVNpemUgPiBFUExfU0RPX01BWF9QQVlMT0FEKSB7CS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQlwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID0ga0VwbFNkb1RyYW5zU2VnbWVudGVkOworCQkvLyBnZXQgcG9pbnRlciB0byBvYmplY3QtZW50cnkgZGF0YQorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPQorCQkgICAgRXBsT2JkdUdldE9iamVjdERhdGFQdHIodWlJbmRleCwgdWlTdWJpbmRleCk7CisvLyNlbmRpZgorCX0gZWxzZSB7CQkvLyBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9IGtFcGxTZG9UcmFuc0V4cGVkaXRlZDsKKwl9CisKKwlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSBFbnRyeVNpemU7CisJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gMDsKKworCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCSAgICAgdWlJbmRleCwKKwkJCQkJICAgICB1aVN1YmluZGV4LCBrRXBsU2RvQ29tU2VuZFR5cGVSZXMpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJLy8gZXJyb3IgLT4gYWJvcnQKKwkJZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJLy8gc2VuZCBhYm9ydAorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSAqKSAmIGR3QWJvcnRDb2RlOworCQlSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJCQkJICAgICB1aUluZGV4LAorCQkJCQkJICAgICB1aVN1YmluZGV4LAorCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKCk7CisvLworLy8gRGVzY3JpcHRpb246ICAgIGZ1bmN0aW9uIGNyZWF0cyBhbmQgc2VuZCBhIGZyYW1lIGZvciBzZXJ2ZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgID0gaW5kZXggdG8gc2VuZCBpZiBleHBlZGl0ZWQgdHJhbnNmZXIgZWxzZSAwCisvLyAgICAgICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICAgPSBzdWJpbmRleCB0byBzZW5kIGlmIGV4cGVkaXRlZCB0cmFuc2ZlciBlbHNlIDAKKy8vICAgICAgICAgICAgICAgICAgU2VuZFR5cGVfcCAgICAgICA9IHRvIG9mIGZyYW1lIHRvIHNlbmQKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybih0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSB0RXBsU2RvQ29tU2VuZFR5cGUgU2VuZFR5cGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiRnJhbWVbRVBMX01BWF9TRE9fRlJBTUVfU0laRV07CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEFzeVNkb0NvbSAqcENvbW1hbmRGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlTaXplT2ZGcmFtZTsKKwlCWVRFIGJGbGFnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlwRnJhbWUgPSAodEVwbEZyYW1lICopICYgYWJGcmFtZVswXTsKKworCUVQTF9NRU1TRVQoJmFiRnJhbWVbMF0sIDB4MDAsIHNpemVvZihhYkZyYW1lKSk7CisKKwkvLyBidWlsZCBnZW5lcmljIHBhcnQgb2YgZnJhbWUKKwkvLyBnZXQgcG9pbnRlciB0byBjb21tYW5kIGxheWVycGFydCBvZiBmcmFtZQorCXBDb21tYW5kRnJhbWUgPQorCSAgICAmcEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJICAgIG1fbGVfYWJTZG9TZXFQYXlsb2FkOworCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JDb21tYW5kSWQsCisJCSAgICAgICBwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpOworCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JUcmFuc2FjdGlvbklkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX2JUcmFuc2FjdGlvbklkKTsKKworCS8vIHNldCBzaXplIHRvIGhlYWRlciBzaXplCisJdWlTaXplT2ZGcmFtZSA9IDg7CisKKwkvLyBjaGVjayBTZW5kVHlwZQorCXN3aXRjaCAoU2VuZFR5cGVfcCkgeworCQkvLyByZXF1ZXN0ZnJhbWUgdG8gc2VuZAorCWNhc2Uga0VwbFNkb0NvbVNlbmRUeXBlUmVxOgorCQl7CisJCQkvLyBub3RoaW5nIHRvIGRvIGZvciBzZXJ2ZXIKKwkJCS8vLT4gZXJyb3IKKwkJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkU2VuZFR5cGU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIHJlc3BvbnNlIHdpdGhvdXQgZGF0YSB0byBzZW5kCisJY2FzZSBrRXBsU2RvQ29tU2VuZFR5cGVBY2tSZXM6CisJCXsKKwkJCS8vIHNldCByZXNwb25zZSBmbGFnCisJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iRmxhZ3MsIDB4ODApOworCisJCQkvLyBzZW5kIGZyYW1lCisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgdWlTaXplT2ZGcmFtZSwgcEZyYW1lKTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyByZXNwb25zZnJhbWUgdG8gc2VuZAorCWNhc2Uga0VwbFNkb0NvbVNlbmRUeXBlUmVzOgorCQl7CisJCQkvLyBzZXQgcmVzcG9uc2UgZmxhZworCQkJYkZsYWcgPSBBbWlHZXRCeXRlRnJvbUxlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JGbGFncyk7CisJCQliRmxhZyB8PSAweDgwOworCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzLCBiRmxhZyk7CisKKwkJCS8vIGNoZWNrIHR5cGUgb2YgcmVzb25zZQorCQkJaWYgKHBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPT0ga0VwbFNkb1RyYW5zRXhwZWRpdGVkKSB7CS8vIEV4cGVkaXRlZCB0cmFuc2ZlcgorCQkJCS8vIGNvcHkgZGF0YSBpbiBmcmFtZQorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCQkJCVJldCA9IEVwbE9iZHVSZWFkRW50cnlUb0xlKHVpSW5kZXhfcCwKKwkJCQkJCQkgICB1aVN1YkluZGV4X3AsCisJCQkJCQkJICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCSAgIFswXSwKKwkJCQkJCQkgICAodEVwbE9iZFNpemUgKikgJgorCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgbV91aVRyYW5zU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorLy8jZW5kaWYKKworCQkJCS8vIHNldCBzaXplIG9mIGZyYW1lCisJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCSAgICAgICAoV09SRCkgcFNkb0NvbUNvbl9wLT4KKwkJCQkJICAgICAgIG1fdWlUcmFuc1NpemUpOworCisJCQkJLy8gY29ycmVjdCBieXRlLWNvdW50ZXIKKwkJCQl1aVNpemVPZkZyYW1lICs9IHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKz0KKwkJCQkgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplOworCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisKKwkJCQkvLyBzZW5kIGZyYW1lCisJCQkJdWlTaXplT2ZGcmFtZSArPSBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJIHVpU2l6ZU9mRnJhbWUsIHBGcmFtZSk7CisJCQl9IGVsc2UgaWYgKHBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPT0ga0VwbFNkb1RyYW5zU2VnbWVudGVkKSB7CS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQkJCS8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5pdCwgc2VnbWVudCBhbmQgY29tcGxldGUKKwkJCQlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID09IDApIHsJLy8gaW5pdAorCQkJCQkvLyBzZXQgaW5pdCBmbGFnCisJCQkJCWJGbGFnID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQliRmxhZyB8PSAweDEwOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV9iRmxhZ3MsIGJGbGFnKTsKKwkJCQkJLy8gaW5pdCB2YXJpYWJsZSBoZWFkZXIKKwkJCQkJQW1pU2V0RHdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQltX2xlX2FiQ29tbWFuZERhdGFbMF0sCisJCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQltX3VpVHJhbnNTaXplKTsKKwkJCQkJLy8gY29weSBkYXRhIGluIGZyYW1lCisJCQkJCUVQTF9NRU1DUFkoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhWzRdLAorCQkJCQkJICAgcFNkb0NvbUNvbl9wLT5tX3BEYXRhLAorCQkJCQkJICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA0KSk7CisKKwkJCQkJLy8gY29ycmVjdCBieXRlLWNvdW50ZXIKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplIC09CisJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDQpOworCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKz0KKwkJCQkJICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gNCk7CisJCQkJCS8vIG1vdmUgZGF0YSBwb2ludGVyCisJCQkJCXBTZG9Db21Db25fcC0+bV9wRGF0YSArPQorCQkJCQkgICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA0KTsKKworCQkJCQkvLyBzZXQgc2VnbWVudCBzaXplCisJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCSAgICAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtCisJCQkJCQkJNCkpOworCisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJdWlTaXplT2ZGcmFtZSArPSBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgdWlTaXplT2ZGcmFtZSwKKwkJCQkJCQkJIHBGcmFtZSk7CisKKwkJCQl9IGVsc2UKKwkJCQkgICAgaWYgKChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPiAwKQorCQkJCQkmJiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID4gRVBMX1NET19NQVhfUEFZTE9BRCkpIHsJLy8gc2VnbWVudAorCQkJCQkvLyBzZXQgc2VnbWVudCBmbGFnCisJCQkJCWJGbGFnID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQliRmxhZyB8PSAweDIwOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV9iRmxhZ3MsIGJGbGFnKTsKKworCQkJCQkvLyBjb3B5IGRhdGEgaW4gZnJhbWUKKwkJCQkJRVBMX01FTUNQWSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGFbMF0sCisJCQkJCQkgICBwU2RvQ29tQ29uX3AtPm1fcERhdGEsCisJCQkJCQkgICBFUExfU0RPX01BWF9QQVlMT0FEKTsKKworCQkJCQkvLyBjb3JyZWN0IGJ5dGUtY291bnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgLT0KKwkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSArPQorCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJLy8gbW92ZSBkYXRhIHBvaW50ZXIKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhICs9CisJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCisJCQkJCS8vIHNldCBzZWdtZW50IHNpemUKKwkJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJICAgICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQpOworCisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJdWlTaXplT2ZGcmFtZSArPSBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgdWlTaXplT2ZGcmFtZSwKKwkJCQkJCQkJIHBGcmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPT0gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uX3AtPgorCQkJCQkJbV9TZG9TZXJ2aWNlVHlwZSAhPQorCQkJCQkJa0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXgpKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJLy8gY29tcGxldGUKKwkJCQkJLy8gc2V0IHNlZ21lbnQgY29tcGxldGUgZmxhZworCQkJCQliRmxhZyA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJYkZsYWcgfD0gMHgzMDsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWdzLCBiRmxhZyk7CisKKwkJCQkJLy8gY29weSBkYXRhIGluIGZyYW1lCisJCQkJCUVQTF9NRU1DUFkoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhWzBdLAorCQkJCQkJICAgcFNkb0NvbUNvbl9wLT5tX3BEYXRhLAorCQkJCQkJICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplKTsKKworCQkJCQkvLyBjb3JyZWN0IGJ5dGUtY291bnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKz0KKwkJCQkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKworCQkJCQkvLyBtb3ZlIGRhdGEgcG9pbnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgKz0KKwkJCQkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKworCQkJCQkvLyBzZXQgc2VnbWVudCBzaXplCisJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCSAgICAgICAoV09SRCkgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICAgICBtX3VpVHJhbnNTaXplKTsKKworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCXVpU2l6ZU9mRnJhbWUgKz0KKwkJCQkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+CisJCQkJCQkJCSBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJIHVpU2l6ZU9mRnJhbWUsCisJCQkJCQkJCSBwRnJhbWUpOworCQkJCX0KKworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJLy8gYWJvcnQgdG8gc2VuZAorCWNhc2Uga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQ6CisJCXsKKwkJCS8vIHNldCByZXNwb25zZSBhbmQgYWJvcnQgZmxhZworCQkJYkZsYWcgPSBBbWlHZXRCeXRlRnJvbUxlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JGbGFncyk7CisJCQliRmxhZyB8PSAweEMwOworCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzLCBiRmxhZyk7CisKKwkJCS8vIGNvcHkgYWJvcnRjb2RlIHRvIGZyYW1lCisJCQlBbWlTZXREd29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYWJDb21tYW5kRGF0YVswXSwKKwkJCQkJKigoRFdPUkQgKikgcFNkb0NvbUNvbl9wLT5tX3BEYXRhKSk7CisKKwkJCS8vIHNldCBzaXplIG9mIHNlZ21lbnQKKwkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkgICAgICAgc2l6ZW9mKERXT1JEKSk7CisKKwkJCS8vIHVwZGF0ZSBjb3VudGVyCisJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSBzaXplb2YoRFdPUkQpOworCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKworCQkJLy8gY2FsYyBmcmFtZXNpemUKKwkJCXVpU2l6ZU9mRnJhbWUgKz0gc2l6ZW9mKERXT1JEKTsKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+bV9TZG9TZXFDb25IZGwsCisJCQkJCQkgICB1aVNpemVPZkZyYW1lLCBwRnJhbWUpOworCQkJYnJlYWs7CisJCX0KKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChTZW5kVHlwZV9wKQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21TZXJ2ZXJJbml0V3JpdGVCeUluZGV4CisvLworLy8gRGVzY3JpcHRpb246ICAgIGZ1bmN0aW9uIHN0YXJ0IHRoZSBwcm9jZXNzaW5nIG9mIGFuIHdyaXRlIGJ5IGluZGV4IGNvbW1hbmQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICAgID0gcG9pbnRlciB0byByZWNlaXZlZCBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVySW5pdFdyaXRlQnlJbmRleCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdW5zaWduZWQgaW50IHVpU3ViaW5kZXg7CisJdW5zaWduZWQgaW50IHVpQnl0ZXNUb1RyYW5zZmVyOworCXRFcGxPYmRTaXplIEVudHJ5U2l6ZTsKKwl0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGU7CisJRFdPUkQgZHdBYm9ydENvZGU7CisJQllURSAqcGJTcmNEYXRhOworCisJZHdBYm9ydENvZGUgPSAwOworCisJLy8gYSBpbml0IG9mIGEgd3JpdGUKKwkvLyAtPiB2YXJpYWJsZSBwYXJ0IG9mIGhlYWRlciBwb3NzaWJsZQorCisJLy8gY2hlY2sgaWYgZXhwZWRpdGVkIG9yIHNlZ21lbnRlZCB0cmFuc2ZlcgorCWlmICgocEFzeVNkb0NvbV9wLT5tX2xlX2JGbGFncyAmIDB4MzApID09IDB4MTApIHsJLy8gaW5pdGlhdGUgc2VnbWVudGVkIHRyYW5zZmVyCisJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPSBrRXBsU2RvVHJhbnNTZWdtZW50ZWQ7CisJCS8vIGdldCBpbmRleCBhbmQgc3ViaW5kZXgKKwkJdWlJbmRleCA9CisJCSAgICBBbWlHZXRXb3JkRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVs0XSk7CisJCXVpU3ViaW5kZXggPQorCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbNl0pOworCQkvLyBnZXQgc291cmNlLXBvaW50ZXIgZm9yIGNvcHkKKwkJcGJTcmNEYXRhID0gJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzhdOworCQkvLyBzYXZlIHNpemUKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0KKwkJICAgIEFtaUdldER3b3JkRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVswXSk7CisKKwl9IGVsc2UgaWYgKChwQXN5U2RvQ29tX3AtPm1fbGVfYkZsYWdzICYgMHgzMCkgPT0gMHgwMCkgewkvLyBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9IGtFcGxTZG9UcmFuc0V4cGVkaXRlZDsKKwkJLy8gZ2V0IGluZGV4IGFuZCBzdWJpbmRleAorCQl1aUluZGV4ID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzBdKTsKKwkJdWlTdWJpbmRleCA9CisJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVsyXSk7CisJCS8vIGdldCBzb3VyY2UtcG9pbnRlciBmb3IgY29weQorCQlwYlNyY0RhdGEgPSAmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbNF07CisJCS8vIHNhdmUgc2l6ZQorCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPQorCQkgICAgQW1pR2V0V29yZEZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX3dTZWdtZW50U2l6ZSk7CisJCS8vIHN1YnRyYWN0IGhlYWRlcgorCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgLT0gNDsKKworCX0gZWxzZSB7CisJCS8vIGp1c3QgaWdub3JlIGFueSBvdGhlciB0cmFuc2ZlciB0eXBlCisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjaGVjayBhY2Nlc3N0eXBlIG9mIGVudHJ5CisJLy8gZXhpc3RlbnMgb2YgZW50cnkKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmR1R2V0QWNjZXNzVHlwZSh1aUluZGV4LCB1aVN1YmluZGV4LCAmQWNjZXNzVHlwZSk7CisvKiNlbHNlCisgICAgUmV0ID0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3Q7CisgICAgQWNjZXNzVHlwZSA9IDA7CisjZW5kaWYqLworCWlmIChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpIHsJLy8gc3ViZW50cnkgZG9lc24ndCBleGlzdAorCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0gRVBMX1NET0FDX1NVQl9JTkRFWF9OT1RfRVhJU1Q7CisJCS8vIHNlbmQgYWJvcnQKKwkJLy8gZC5rLiBUaGlzIGlzIHdyb25nOiBrLnQuIG5vdCBuZWVkZWQgc2VuZCBhYm9ydCBvbiBlbmQgb2Ygd3JpdGUKKwkJLypwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSopcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZTsKKwkJICAgUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJICAgdWlJbmRleCwKKwkJICAgdWlTdWJpbmRleCwKKwkJICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOyAqLworCQlnb3RvIEFib3J0OworCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9IEVQTF9TRE9BQ19PQkpFQ1RfTk9UX0VYSVNUOworCQkvLyBzZW5kIGFib3J0CisJCS8vIGQuay4gVGhpcyBpcyB3cm9uZzogay50LiBub3QgbmVlZGVkIHNlbmQgYWJvcnQgb24gZW5kIG9mIHdyaXRlCisJCS8qCisJCSAgIHBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFKikmZHdBYm9ydENvZGU7CisJCSAgIFJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCSAgIHVpSW5kZXgsCisJCSAgIHVpU3ViaW5kZXgsCisJCSAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsgKi8KKwkJZ290byBBYm9ydDsKKwl9CisJLy8gY29tcGFyZSBhY2Nlc3N0eXBlIG11c3QgYmUgcmVhZAorCWlmICgoQWNjZXNzVHlwZSAmIGtFcGxPYmRBY2NXcml0ZSkgPT0gMCkgeworCisJCWlmICgoQWNjZXNzVHlwZSAmIGtFcGxPYmRBY2NSZWFkKSAhPSAwKSB7CisJCQkvLyBlbnRyeSB3cml0ZSBhIHJlYWQgb25seSBvYmplY3QKKwkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJICAgIEVQTF9TRE9BQ19XUklURV9UT19SRUFEX09OTFlfT0JKOworCQl9IGVsc2UgeworCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkgICAgRVBMX1NET0FDX1VOU1VQUE9SVEVEX0FDQ0VTUzsKKwkJfQorCQkvLyBzZW5kIGFib3J0CisJCS8vIGQuay4gVGhpcyBpcyB3cm9uZzogay50LiBub3QgbmVlZGVkIHNlbmQgYWJvcnQgb24gZW5kIG9mIHdyaXRlCisJCS8qcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUqKSZkd0Fib3J0Q29kZTsKKwkJICAgUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJICAgdWlJbmRleCwKKwkJICAgdWlTdWJpbmRleCwKKwkJICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOyAqLworCQlnb3RvIEFib3J0OworCX0KKwkvLyBzYXZlIHNlcnZpY2UKKwlwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUgPSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleDsKKworCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IDA7CisKKwkvLyB3cml0ZSBkYXRhIHRvIE9ECisJaWYgKHBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPT0ga0VwbFNkb1RyYW5zRXhwZWRpdGVkKSB7CS8vIGV4cGVkaXRlZCB0cmFuc2ZlcgorCQkvLyBzaXplIGNoZWNraW5nIGlzIGRvbmUgYnkgRXBsT2JkdVdyaXRlRW50cnlGcm9tTGUoKQorCisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJCVJldCA9IEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKHVpSW5kZXgsCisJCQkJCSAgICAgIHVpU3ViaW5kZXgsCisJCQkJCSAgICAgIHBiU3JjRGF0YSwKKwkJCQkJICAgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplKTsKKwkJc3dpdGNoIChSZXQpIHsKKwkJY2FzZSBrRXBsU3VjY2Vzc2Z1bDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxPYmRBY2Nlc3NWaW9sYXRpb246CisJCQl7CisJCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19VTlNVUFBPUlRFRF9BQ0NFU1M7CisJCQkJLy8gc2VuZCBhYm9ydAorCQkJCWdvdG8gQWJvcnQ7CisJCQl9CisKKwkJY2FzZSBrRXBsT2JkVmFsdWVMZW5ndGhFcnJvcjoKKwkJCXsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfTk9UX01BVENIOworCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQlnb3RvIEFib3J0OworCQkJfQorCisJCWNhc2Uga0VwbE9iZFZhbHVlVG9vSGlnaDoKKwkJCXsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX1RPT19ISUdIOworCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQlnb3RvIEFib3J0OworCQkJfQorCisJCWNhc2Uga0VwbE9iZFZhbHVlVG9vTG93OgorCQkJeworCQkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfVE9PX0xPVzsKKwkJCQkvLyBzZW5kIGFib3J0CisJCQkJZ290byBBYm9ydDsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCQkvLyBzZW5kIGFib3J0CisJCQkJZ290byBBYm9ydDsKKwkJCX0KKwkJfQorLy8jZW5kaWYKKwkJLy8gc2VuZCBjb21tYW5kIGFja25vd2xlZGdlCisJCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCQkgICAgIDAsCisJCQkJCQkgICAgIDAsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFja1Jlcyk7CisKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCS8vIGdldCBzaXplIG9mIHRoZSBvYmplY3QgdG8gY2hlY2sgaWYgaXQgZml0cworCQkvLyBiZWNhdXNlIHdlIGRpcmVjdGx5IHdyaXRlIHRvIHRoZSBkZXN0aW5hdGlvbiBtZW1vcnkKKwkJLy8gZC5rLiBubyBvbmUgY2FsbHMgdGhlIHVzZXIgT0QgY2FsbGJhY2sgZnVuY3Rpb24KKworCQkvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJCUVudHJ5U2l6ZSA9IEVwbE9iZHVHZXREYXRhU2l6ZSh1aUluZGV4LCB1aVN1YmluZGV4KTsKKwkJLyojZWxzZQorCQkgICBFbnRyeVNpemUgPSAwOworCQkgICAjZW5kaWYgKi8KKwkJaWYgKEVudHJ5U2l6ZSA8IHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSkgewkvLyBwYXJhbWV0ZXIgdG9vIGJpZworCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfVE9PX0hJR0g7CisJCQkvLyBzZW5kIGFib3J0CisJCQkvLyBkLmsuIFRoaXMgaXMgd3Jvbmc6IGsudC4gbm90IG5lZWRlZCBzZW5kIGFib3J0IG9uIGVuZCBvZiB3cml0ZQorCQkJLypwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSopJmR3QWJvcnRDb2RlOworCQkJICAgUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCSAgIHVpSW5kZXgsCisJCQkgICB1aVN1YmluZGV4LAorCQkJICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOyAqLworCQkJZ290byBBYm9ydDsKKwkJfQorCisJCXVpQnl0ZXNUb1RyYW5zZmVyID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV93U2VnbWVudFNpemUpOworCQkvLyBlbGVtaW5hdGUgaGVhZGVyIChDb21tYW5kIGhlYWRlciAoOCkgKyB2YXJpYWJsZSBwYXJ0ICg0KSArIENvbW1hbmQgaGVhZGVyICg0KSkKKwkJdWlCeXRlc1RvVHJhbnNmZXIgLT0gMTY7CisJCS8vIGdldCBwb2ludGVyIHRvIG9iamVjdCBlbnRyeQorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSBFcGxPYmR1R2V0T2JqZWN0RGF0YVB0cih1aUluZGV4LAorCQkJCQkJCQl1aVN1YmluZGV4KTsKKy8vI2VuZGlmCisJCWlmIChwU2RvQ29tQ29uX3AtPm1fcERhdGEgPT0gTlVMTCkgeworCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkgICAgRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkvLyBzZW5kIGFib3J0CisJCQkvLyBkLmsuIFRoaXMgaXMgd3Jvbmc6IGsudC4gbm90IG5lZWRlZCBzZW5kIGFib3J0IG9uIGVuZCBvZiB3cml0ZQorLyogICAgICAgICAgICBwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSopJnBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGU7CisgICAgICAgICAgICBSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlTdWJpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7Ki8KKwkJCWdvdG8gQWJvcnQ7CisJCX0KKwkJLy8gY29weSBkYXRhCisJCUVQTF9NRU1DUFkocFNkb0NvbUNvbl9wLT5tX3BEYXRhLCBwYlNyY0RhdGEsIHVpQnl0ZXNUb1RyYW5zZmVyKTsKKworCQkvLyB1cGRhdGUgaW50ZXJuYWwgY291bnRlcgorCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSB1aUJ5dGVzVG9UcmFuc2ZlcjsKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplIC09IHVpQnl0ZXNUb1RyYW5zZmVyOworCisJCS8vIHVwZGF0ZSB0YXJnZXQgcG9pbnRlcgorCQkoIC8qKEJZVEUqKSAqLyBwU2RvQ29tQ29uX3AtPm1fcERhdGEpICs9IHVpQnl0ZXNUb1RyYW5zZmVyOworCisJCS8vIHNlbmQgYWNrbm93bGVkZ2Ugd2l0aG91dCBhbnkgQ29tbWFuZCBsYXllciBkYXRhCisJCVJldCA9IEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+bV9TZG9TZXFDb25IZGwsCisJCQkJCSAgIDAsICh0RXBsRnJhbWUgKikgTlVMTCk7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEFib3J0OgorCWlmIChwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlICE9IDApIHsKKwkJLy8gc2VuZCBhYm9ydAorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPQorCQkgICAgKEJZVEUgKikgJiBwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlOworCQlSZXQgPQorCQkgICAgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwgdWlJbmRleCwKKwkJCQkJCSAgIHVpU3ViaW5kZXgsCisJCQkJCQkgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisKKwkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0gMDsKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21DbGllbnRTZW5kCisvLworLy8gRGVzY3JpcHRpb246ICAgIGZ1bmN0aW9uIHN0YXJ0cyBhbiBzZG8gdHJhbnNmZXIgYW4gc2VuZCBhbGwgZnVydGhlciBmcmFtZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tQ2xpZW50U2VuZCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUJZVEUgYWJGcmFtZVtFUExfTUFYX1NET19GUkFNRV9TSVpFXTsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKwl0RXBsQXN5U2RvQ29tICpwQ29tbWFuZEZyYW1lOworCXVuc2lnbmVkIGludCB1aVNpemVPZkZyYW1lOworCUJZVEUgYkZsYWdzOworCUJZVEUgKnBiUGF5bG9hZDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSAmIGFiRnJhbWVbMF07CisKKwlFUExfTUVNU0VUKCZhYkZyYW1lWzBdLCAweDAwLCBzaXplb2YoYWJGcmFtZSkpOworCisJLy8gYnVpbGQgZ2VuZXJpYyBwYXJ0IG9mIGZyYW1lCisJLy8gZ2V0IHBvaW50ZXIgdG8gY29tbWFuZCBsYXllcnBhcnQgb2YgZnJhbWUKKwlwQ29tbWFuZEZyYW1lID0KKwkgICAgJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCSAgICBtX2xlX2FiU2RvU2VxUGF5bG9hZDsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iQ29tbWFuZElkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKTsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iVHJhbnNhY3Rpb25JZCwKKwkJICAgICAgIHBTZG9Db21Db25fcC0+bV9iVHJhbnNhY3Rpb25JZCk7CisKKwkvLyBzZXQgc2l6ZSBjb25zdGFudCBwYXJ0IG9mIGhlYWRlcgorCXVpU2l6ZU9mRnJhbWUgPSA4OworCisJLy8gY2hlY2sgaWYgZmlyc3QgZnJhbWUgdG8gc2VuZCAtPiBjb21tYW5kIGhlYWRlciBuZWVkZWQKKwlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID4gMCkgeworCQlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID09IDApIHsJLy8gc3RhcnQgU0RPIHRyYW5zZmVyCisJCQkvLyBjaGVjayBpZiBzZWdtZW50ZWQgb3IgZXhwZWRpdGVkIHRyYW5zZmVyCisJCQkvLyBvbmx5IGZvciB3cml0ZSBjb21tYW5kcworCQkJc3dpdGNoIChwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpIHsKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleDoKKwkJCQl7CS8vIGZpcnN0IGZyYW1lIG9mIHJlYWQgYWNjZXNzIGFsd2F5cyBleHBlZGl0ZWQKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9CisJCQkJCSAgICBrRXBsU2RvVHJhbnNFeHBlZGl0ZWQ7CisJCQkJCXBiUGF5bG9hZCA9CisJCQkJCSAgICAmcENvbW1hbmRGcmFtZS0+CisJCQkJCSAgICBtX2xlX2FiQ29tbWFuZERhdGFbMF07CisJCQkJCS8vIGZpbGwgcmVzdCBvZiBoZWFkZXIKKwkJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLCA0KTsKKworCQkJCQkvLyBjcmVhdGUgY29tbWFuZCBoZWFkZXIKKwkJCQkJQW1pU2V0V29yZFRvTGUocGJQYXlsb2FkLAorCQkJCQkJICAgICAgIChXT1JEKSBwU2RvQ29tQ29uX3AtPgorCQkJCQkJICAgICAgIG1fdWlUYXJnZXRJbmRleCk7CisJCQkJCXBiUGF5bG9hZCArPSAyOworCQkJCQlBbWlTZXRCeXRlVG9MZShwYlBheWxvYWQsCisJCQkJCQkgICAgICAgKEJZVEUpIHBTZG9Db21Db25fcC0+CisJCQkJCQkgICAgICAgbV91aVRhcmdldFN1YkluZGV4KTsKKwkJCQkJLy8gY2FsYyBzaXplCisJCQkJCXVpU2l6ZU9mRnJhbWUgKz0gNDsKKworCQkJCQkvLyBzZXQgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlIHRvIG9uZQorCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXg6CisJCQkJeworCQkJCQlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID4gRVBMX1NET19NQVhfUEFZTE9BRCkgewkvLyBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJCQkJCS8vIC0+IHZhcmlhYmxlIHBhcnQgb2YgaGVhZGVyIG5lZWRlZAorCQkJCQkJLy8gc2F2ZSB0aGF0IHRyYW5zZmVyIGlzIHNlZ21lbnRlZAorCQkJCQkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9CisJCQkJCQkgICAga0VwbFNkb1RyYW5zU2VnbWVudGVkOworCQkJCQkJLy8gZmlsbCB2YXJpYWJsZSBwYXJ0IG9mIGhlYWRlcgorCQkJCQkJQW1pU2V0RHdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkJbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCVswXSwKKwkJCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJbV91aVRyYW5zU2l6ZSk7CisJCQkJCQkvLyBzZXQgcG9pbnRlciB0byByZWFsIHBheWxvYWQKKwkJCQkJCXBiUGF5bG9hZCA9CisJCQkJCQkgICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgIG1fbGVfYWJDb21tYW5kRGF0YVs0XTsKKwkJCQkJCS8vIGZpbGwgcmVzdCBvZiBoZWFkZXIKKwkJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCQkJICAgICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQpOworCQkJCQkJYkZsYWdzID0gMHgxMDsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZ3MsCisJCQkJCQkJICAgICAgIGJGbGFncyk7CisJCQkJCQkvLyBjcmVhdGUgY29tbWFuZCBoZWFkZXIKKwkJCQkJCUFtaVNldFdvcmRUb0xlKHBiUGF5bG9hZCwKKwkJCQkJCQkgICAgICAgKFdPUkQpCisJCQkJCQkJICAgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgICAgIG1fdWlUYXJnZXRJbmRleCk7CisJCQkJCQlwYlBheWxvYWQgKz0gMjsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKHBiUGF5bG9hZCwKKwkJCQkJCQkgICAgICAgKEJZVEUpCisJCQkJCQkJICAgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgICAgIG1fdWlUYXJnZXRTdWJJbmRleCk7CisJCQkJCQkvLyBvbiBieXRlIGZvciByZXNlcnZlZAorCQkJCQkJcGJQYXlsb2FkICs9IDI7CisJCQkJCQkvLyBjYWxjIHNpemUKKwkJCQkJCXVpU2l6ZU9mRnJhbWUgKz0KKwkJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCisJCQkJCQkvLyBjb3B5IHBheWxvYWQKKwkJCQkJCUVQTF9NRU1DUFkocGJQYXlsb2FkLAorCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkgICAoRVBMX1NET19NQVhfUEFZTE9BRAorCQkJCQkJCSAgICAtIDgpKTsKKwkJCQkJCXBTZG9Db21Db25fcC0+bV9wRGF0YSArPQorCQkJCQkJICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gOCk7CisJCQkJCQkvLyBjb3JyZWN0IGludGVybiBjb3VudGVyCisJCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgLT0KKwkJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDgpOworCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlID0KKwkJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDgpOworCisJCQkJCX0gZWxzZSB7CS8vIGV4cGVkaXRlZCB0cmFuZHNmZXIKKwkJCQkJCS8vIHNhdmUgdGhhdCB0cmFuc2ZlciBpcyBleHBlZGl0ZWQKKwkJCQkJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPQorCQkJCQkJICAgIGtFcGxTZG9UcmFuc0V4cGVkaXRlZDsKKwkJCQkJCXBiUGF5bG9hZCA9CisJCQkJCQkgICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgIG1fbGVfYWJDb21tYW5kRGF0YVswXTsKKworCQkJCQkJLy8gY3JlYXRlIGNvbW1hbmQgaGVhZGVyCisJCQkJCQlBbWlTZXRXb3JkVG9MZShwYlBheWxvYWQsCisJCQkJCQkJICAgICAgIChXT1JEKQorCQkJCQkJCSAgICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICAgICBtX3VpVGFyZ2V0SW5kZXgpOworCQkJCQkJcGJQYXlsb2FkICs9IDI7CisJCQkJCQlBbWlTZXRCeXRlVG9MZShwYlBheWxvYWQsCisJCQkJCQkJICAgICAgIChCWVRFKQorCQkJCQkJCSAgICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICAgICBtX3VpVGFyZ2V0U3ViSW5kZXgpOworCQkJCQkJLy8gKyAyIC0+IG9uZSBieXRlIGZvciBzdWJpbmRleCBhbmQgb25lIGJ5dGUgcmVzZXJ2ZWQKKwkJCQkJCXBiUGF5bG9hZCArPSAyOworCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQlFUExfTUVNQ1BZKHBiUGF5bG9hZCwKKwkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICBtX3VpVHJhbnNTaXplKTsKKwkJCQkJCS8vIGNhbGMgc2l6ZQorCQkJCQkJdWlTaXplT2ZGcmFtZSArPQorCQkJCQkJICAgICg0ICsKKwkJCQkJCSAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICAgbV91aVRyYW5zU2l6ZSk7CisJCQkJCQkvLyBmaWxsIHJlc3Qgb2YgaGVhZGVyCisJCQkJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJCSAgICAgICAoV09SRCkgKDQgKworCQkJCQkJCQkgICAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJICAgICAgIG1fdWlUcmFuc1NpemUpKTsKKworCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlID0KKwkJCQkJCSAgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisJCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvU2VydmljZU5JTDoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gaW52YWxpZCBzZXJ2aWNlIHJlcXVlc3RlZAorCQkJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkU2VydmljZVR5cGU7CisJCQkJZ290byBFeGl0OworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSkKKwkJfSBlbHNlCQkvLyAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID4gMCkKKwkJewkJLy8gY29udGludWUgU0RPIHRyYW5zZmVyCisJCQlzd2l0Y2ggKHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSkgeworCQkJCS8vIGZvciBleHBlZGl0ZWQgcmVhZCBpcyBub3RoaW5nIHRvIGRvCisJCQkJLy8gLT4gc2VydmVyIHNlbmRzIGRhdGEKKworCQkJY2FzZSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleDoKKwkJCQl7CS8vIHNlbmQgbmV4dCBmcmFtZQorCQkJCQlpZiAocFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9PQorCQkJCQkgICAga0VwbFNkb1RyYW5zU2VnbWVudGVkKSB7CisJCQkJCQlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID4gRVBMX1NET19NQVhfUEFZTE9BRCkgewkvLyBuZXh0IHNlZ21lbnQKKwkJCQkJCQlwYlBheWxvYWQgPQorCQkJCQkJCSAgICAmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCSAgICBbMF07CisJCQkJCQkJLy8gZmlsbCByZXN0IG9mIGhlYWRlcgorCQkJCQkJCUFtaVNldFdvcmRUb0xlCisJCQkJCQkJICAgICgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCQkgICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQpOworCQkJCQkJCWJGbGFncyA9IDB4MjA7CisJCQkJCQkJQW1pU2V0Qnl0ZVRvTGUKKwkJCQkJCQkgICAgKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzLAorCQkJCQkJCSAgICAgYkZsYWdzKTsKKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBiUGF5bG9hZCwKKwkJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgRVBMX1NET19NQVhfUEFZTE9BRCk7CisJCQkJCQkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhICs9CisJCQkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCQkJLy8gY29ycmVjdCBpbnRlcm4gY291bnRlcgorCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgLT0KKwkJCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgID0KKwkJCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJCQkvLyBjYWxjIHNpemUKKwkJCQkJCQl1aVNpemVPZkZyYW1lICs9CisJCQkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisKKwkJCQkJCX0gZWxzZSB7CS8vIGVuZCBvZiB0cmFuc2ZlcgorCQkJCQkJCXBiUGF5bG9hZCA9CisJCQkJCQkJICAgICZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgIFswXTsKKwkJCQkJCQkvLyBmaWxsIHJlc3Qgb2YgaGVhZGVyCisJCQkJCQkJQW1pU2V0V29yZFRvTGUKKwkJCQkJCQkgICAgKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJCSAgICAgKFdPUkQpCisJCQkJCQkJICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICAgbV91aVRyYW5zU2l6ZSk7CisJCQkJCQkJYkZsYWdzID0gMHgzMDsKKwkJCQkJCQlBbWlTZXRCeXRlVG9MZQorCQkJCQkJCSAgICAoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MsCisJCQkJCQkJICAgICBiRmxhZ3MpOworCQkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJCUVQTF9NRU1DUFkocGJQYXlsb2FkLAorCQkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgICBtX3VpVHJhbnNTaXplKTsKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgKz0KKwkJCQkJCQkgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZTsKKwkJCQkJCQkvLyBjYWxjIHNpemUKKwkJCQkJCQl1aVNpemVPZkZyYW1lICs9CisJCQkJCQkJICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemU7CisJCQkJCQkJLy8gY29ycmVjdCBpbnRlcm4gY291bnRlcgorCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPSAwOworCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgPQorCQkJCQkJCSAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplOworCisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKQorCQl9CisJfSBlbHNlIHsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNhbGwgc2VuZCBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCXN3aXRjaCAocFNkb0NvbUNvbl9wLT5tX1Nkb1Byb3RUeXBlKSB7CisJY2FzZSBrRXBsU2RvVHlwZUFzbmQ6CisJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJeworCQkJUmV0ID0gRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgIHVpU2l6ZU9mRnJhbWUsIHBGcmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdDsKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db25fcC0+bV9TZG9Qcm90VHlwZSkKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgZnVuY3Rpb24gcHJvY2VzcyBhIHJlY2VpdmVkIGZyYW1lCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIFNkb0NvbUNvbl9wICAgICAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICAgID0gcG9pbnRlciB0byBmcmFtZSB0byBwcm9jZXNzCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJICAgICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGJCdWZmZXI7CisJdW5zaWduZWQgaW50IHVpQnVmZmVyOworCXVuc2lnbmVkIGludCB1aURhdGFTaXplOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXI7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bU2RvQ29tQ29uX3BdOworCisJLy8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gSWQgZml0CisJYkJ1ZmZlciA9IEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9iVHJhbnNhY3Rpb25JZCk7CisJaWYgKHBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQgIT0gYkJ1ZmZlcikgeworCQkvLyBpbmNvcnJlY3QgdHJhbnNhY3Rpb24gaWQKKworCQkvLyBpZiBydW5uaW5nIHRyYW5zZmVyCisJCWlmICgocFNkb0NvbUNvbi0+bV91aVRyYW5zZmVycmVkQnl0ZSAhPSAwKQorCQkgICAgJiYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgIT0gMCkpIHsKKwkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkvLyAtPiBzZW5kIGFib3J0CisJCQlFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQocFNkb0NvbUNvbiwKKwkJCQkJCSBwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSk7CisJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQlSZXQgPQorCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCQkgICAgICBrRXBsU2RvQ29tVHJhbnNmZXJUeEFib3J0ZWQpOworCQl9CisKKwl9IGVsc2UgewkJLy8gY2hlY2sgaWYgY29ycmVjdCBjb21tYW5kCisJCWJCdWZmZXIgPSBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYkNvbW1hbmRJZCk7CisJCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlICE9IGJCdWZmZXIpIHsKKwkJCS8vIGluY29ycmVjdCBjb21tYW5kCisJCQkvLyBpZiBydW5uaW5nIHRyYW5zZmVyCisJCQlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgIT0gMCkKKwkJCSAgICAmJiAocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSAhPSAwKSkgeworCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkJLy8gLT4gc2VuZCBhYm9ydAorCQkJCUVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydChwU2RvQ29tQ29uLAorCQkJCQkJCSBwU2RvQ29tQ29uLT4KKwkJCQkJCQkgbV9kd0xhc3RBYm9ydENvZGUpOworCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKFNkb0NvbUNvbl9wLAorCQkJCQkJCSAgICAgIHBTZG9Db21Db24sCisJCQkJCQkJICAgICAga0VwbFNkb0NvbVRyYW5zZmVyVHhBYm9ydGVkKTsKKwkJCX0KKworCQl9IGVsc2UgewkvLyBzd2l0Y2ggb24gY29tbWFuZAorCQkJc3dpdGNoIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlKSB7CisJCQljYXNlIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OgorCQkJCXsJLy8gY2hlY2sgaWYgY29uZmlybWF0aW9uIGZyb20gc2VydmVyCisJCQkJCS8vIG5vdGhpbmcgbW9yZSB0byBkbworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleDoKKwkJCQl7CS8vIGNoZWNrIGlmIGl0IGlzIGFuIHNlZ21lbnRlZCBvciBhbiBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJCQkJYkJ1ZmZlciA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQkvLyBtYXNrIHVuaW50ZXJlc3N0aW5nIGJpdHMKKwkJCQkJYkJ1ZmZlciAmPSAweDMwOworCQkJCQlzd2l0Y2ggKGJCdWZmZXIpIHsKKwkJCQkJCS8vIGV4cGVkaXRlZCB0cmFuc2ZlcgorCQkJCQljYXNlIDB4MDA6CisJCQkJCQl7CisJCQkJCQkJLy8gY2hlY2sgc2l6ZSBvZiBidWZmZXIKKwkJCQkJCQl1aUJ1ZmZlciA9CisJCQkJCQkJICAgIEFtaUdldFdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUpOworCQkJCQkJCWlmICh1aUJ1ZmZlciA+IHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUpIHsJLy8gYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBpcyB0byBzbWFsbAorCQkJCQkJCQkvLyBjb3B5IG9ubHkgYSBwYXJ0CisJCQkJCQkJCXVpRGF0YVNpemUgPQorCQkJCQkJCQkgICAgcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplOworCQkJCQkJCX0gZWxzZSB7CS8vIGJ1ZmZlciBmaXRzCisJCQkJCQkJCXVpRGF0YVNpemUgPQorCQkJCQkJCQkgICAgdWlCdWZmZXI7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQkJRVBMX01FTUNQWShwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCQkgICBbMF0sCisJCQkJCQkJCSAgIHVpRGF0YVNpemUpOworCisJCQkJCQkJLy8gY29ycmVjdCBjb3VudGVyCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPSAwOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgID0gdWlEYXRhU2l6ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLy8gc3RhcnQgb2YgYSBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJCQkJY2FzZSAweDEwOgorCQkJCQkJewkvLyBnZXQgdG90YWwgc2l6ZSBvZiB0cmFuc2ZlcgorCQkJCQkJCXVsQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0RHdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgICBbMF0pOworCQkJCQkJCWlmICh1bEJ1ZmZlciA8PSBwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplKSB7CS8vIGJ1ZmZlciBmaXQKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAodW5zaWduZWQKKwkJCQkJCQkJICAgICBpbnQpCisJCQkJCQkJCSAgICB1bEJ1ZmZlcjsKKwkJCQkJCQl9IGVsc2UgewkvLyBidWZmZXIgdG8gc21hbGwKKwkJCQkJCQkJLy8gc2VuZCBhYm9ydAorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICBFUExfU0RPQUNfREFUQV9UWVBFX0xFTkdUSF9UT09fSElHSDsKKwkJCQkJCQkJLy8gLT4gc2VuZCBhYm9ydAorCQkJCQkJCQlFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQKKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkgICAgIHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fZHdMYXN0QWJvcnRDb2RlKTsKKwkJCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyUnhBYm9ydGVkKTsKKwkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCX0KKworCQkJCQkJCS8vIGdldCBzZWdtZW50IHNpemUKKwkJCQkJCQkvLyBjaGVjayBzaXplIG9mIGJ1ZmZlcgorCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0V29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSk7CisJCQkJCQkJLy8gc3VidHJhY3Qgc2l6ZSBvZiB2YWlhYmxlIGhlYWRlciBmcm9tIGRhdGFzaXplCisJCQkJCQkJdWlCdWZmZXIgLT0gNDsKKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICAmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCSAgIFs0XSwKKwkJCQkJCQkJICAgdWlCdWZmZXIpOworCisJCQkJCQkJLy8gY29ycmVjdCBjb3VudGVyIGFuIHBvaW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uLT5tX3BEYXRhICs9CisJCQkJCQkJICAgIHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgICs9IHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplIC09CisJCQkJCQkJICAgIHVpQnVmZmVyOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIHNlZ21lbnQKKwkJCQkJY2FzZSAweDIwOgorCQkJCQkJeworCQkJCQkJCS8vIGdldCBzZWdtZW50IHNpemUKKwkJCQkJCQkvLyBjaGVjayBzaXplIG9mIGJ1ZmZlcgorCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0V29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSk7CisJCQkJCQkJLy8gY2hlY2sgaWYgZGF0YSB0byBjb3B5IGZpdCB0byBidWZmZXIKKwkJCQkJCQlpZiAodWlCdWZmZXIgPj0gcFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSkgewkvLyB0byBtdWNoIGRhdGEKKwkJCQkJCQkJdWlCdWZmZXIgPQorCQkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fdWlUcmFuc1NpemUKKwkJCQkJCQkJICAgICAtIDEpOworCQkJCQkJCX0KKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICAmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCSAgIFswXSwKKwkJCQkJCQkJICAgdWlCdWZmZXIpOworCisJCQkJCQkJLy8gY29ycmVjdCBjb3VudGVyIGFuIHBvaW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uLT5tX3BEYXRhICs9CisJCQkJCQkJICAgIHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgICs9IHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplIC09CisJCQkJCQkJICAgIHVpQnVmZmVyOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQkvLyBsYXN0IHNlZ21lbnQKKwkJCQkJY2FzZSAweDMwOgorCQkJCQkJeworCQkJCQkJCS8vIGdldCBzZWdtZW50IHNpemUKKwkJCQkJCQkvLyBjaGVjayBzaXplIG9mIGJ1ZmZlcgorCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0V29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSk7CisJCQkJCQkJLy8gY2hlY2sgaWYgZGF0YSB0byBjb3B5IGZpdCB0byBidWZmZXIKKwkJCQkJCQlpZiAodWlCdWZmZXIgPiBwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplKSB7CS8vIHRvIG11Y2ggZGF0YQorCQkJCQkJCQl1aUJ1ZmZlciA9CisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV91aVRyYW5zU2l6ZQorCQkJCQkJCQkgICAgIC0gMSk7CisJCQkJCQkJfQorCQkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJCUVQTF9NRU1DUFkocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJCSAgICZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkJICAgWzBdLAorCQkJCQkJCQkgICB1aUJ1ZmZlcik7CisKKwkJCQkJCQkvLyBjb3JyZWN0IGNvdW50ZXIgYW4gcG9pbnRlcgorCQkJCQkJCXBTZG9Db21Db24tPm1fcERhdGEgKz0KKwkJCQkJCQkgICAgdWlCdWZmZXI7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgKz0gdWlCdWZmZXI7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPSAwOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0JLy8gZW5kIG9mIHN3aXRjaChiQnVmZmVyICYgMHgzMCkKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VOSUw6CisJCQlkZWZhdWx0OgorCQkJCS8vIGludmFsaWQgc2VydmljZSByZXF1ZXN0ZWQKKwkJCQkvLyAkJCQgZC5rLiBXaGF0IHNob3VsZCB3ZSBkbz8KKwkJCQlicmVhazsKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlKQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHNlbmQgYSBhYm9ydCBtZXNzYWdlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIGR3QWJvcnRDb2RlX3AgICAgPSBTZG8gYWJvcnQgY29kZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJICAgRFdPUkQgZHdBYm9ydENvZGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiRnJhbWVbRVBMX01BWF9TRE9fRlJBTUVfU0laRV07CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEFzeVNkb0NvbSAqcENvbW1hbmRGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlTaXplT2ZGcmFtZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSAmIGFiRnJhbWVbMF07CisKKwlFUExfTUVNU0VUKCZhYkZyYW1lWzBdLCAweDAwLCBzaXplb2YoYWJGcmFtZSkpOworCisJLy8gYnVpbGQgZ2VuZXJpYyBwYXJ0IG9mIGZyYW1lCisJLy8gZ2V0IHBvaW50ZXIgdG8gY29tbWFuZCBsYXllcnBhcnQgb2YgZnJhbWUKKwlwQ29tbWFuZEZyYW1lID0KKwkgICAgJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCSAgICBtX2xlX2FiU2RvU2VxUGF5bG9hZDsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iQ29tbWFuZElkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKTsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iVHJhbnNhY3Rpb25JZCwKKwkJICAgICAgIHBTZG9Db21Db25fcC0+bV9iVHJhbnNhY3Rpb25JZCk7CisKKwl1aVNpemVPZkZyYW1lID0gODsKKworCS8vIHNldCByZXNwb25zZSBhbmQgYWJvcnQgZmxhZworCXBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzIHw9IDB4NDA7CisKKwkvLyBjb3B5IGFib3J0Y29kZSB0byBmcmFtZQorCUFtaVNldER3b3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9hYkNvbW1hbmREYXRhWzBdLCBkd0Fib3J0Q29kZV9wKTsKKworCS8vIHNldCBzaXplIG9mIHNlZ21lbnQKKwlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV93U2VnbWVudFNpemUsIHNpemVvZihEV09SRCkpOworCisJLy8gdXBkYXRlIGNvdW50ZXIKKwlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSBzaXplb2YoRFdPUkQpOworCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisKKwkvLyBjYWxjIGZyYW1lc2l6ZQorCXVpU2l6ZU9mRnJhbWUgKz0gc2l6ZW9mKERXT1JEKTsKKworCS8vIHNhdmUgYWJvcnQgY29kZQorCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPSBkd0Fib3J0Q29kZV9wOworCisJLy8gY2FsbCBzZW5kIGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJc3dpdGNoIChwU2RvQ29tQ29uX3AtPm1fU2RvUHJvdFR5cGUpIHsKKwljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQl7CisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgdWlTaXplT2ZGcmFtZSwgcEZyYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsU2RvQ29tVW5zdXBwb3J0ZWRQcm90OworCQl9CisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbl9wLT5tX1Nkb1Byb3RUeXBlKQorCisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIGFwcGxpY2F0aW9uIGlmIGF2YWlsYWJsZQorLy8gICAgICAgICAgICAgIGFuZCBjbGVhcnMgZW50cnkgaW4gY29udHJvbCBzdHJ1Y3R1cmUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIFNkb0NvbUNvblN0YXRlX3AgPSBzdGF0ZSBvZiBTRE8gdHJhbnNmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uX3AsCisJCQkJCSAgICB0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkgICAgdEVwbFNkb0NvbUNvblN0YXRlIFNkb0NvbUNvblN0YXRlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChwU2RvQ29tQ29uX3AtPm1fcGZuVHJhbnNmZXJGaW5pc2hlZCAhPSBOVUxMKSB7CisJCXRFcGxTZG9GaW5pc2hlZENiIHBmblRyYW5zZmVyRmluaXNoZWQ7CisJCXRFcGxTZG9Db21GaW5pc2hlZCBTZG9Db21GaW5pc2hlZDsKKworCQlTZG9Db21GaW5pc2hlZC5tX3BVc2VyQXJnID0gcFNkb0NvbUNvbl9wLT5tX3BVc2VyQXJnOworCQlTZG9Db21GaW5pc2hlZC5tX3VpTm9kZUlkID0gcFNkb0NvbUNvbl9wLT5tX3VpTm9kZUlkOworCQlTZG9Db21GaW5pc2hlZC5tX3VpVGFyZ2V0SW5kZXggPSBwU2RvQ29tQ29uX3AtPm1fdWlUYXJnZXRJbmRleDsKKwkJU2RvQ29tRmluaXNoZWQubV91aVRhcmdldFN1YkluZGV4ID0KKwkJICAgIHBTZG9Db21Db25fcC0+bV91aVRhcmdldFN1YkluZGV4OworCQlTZG9Db21GaW5pc2hlZC5tX3VpVHJhbnNmZXJyZWRCeXRlID0KKwkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZTsKKwkJU2RvQ29tRmluaXNoZWQubV9kd0Fib3J0Q29kZSA9IHBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGU7CisJCVNkb0NvbUZpbmlzaGVkLm1fU2RvQ29tQ29uSGRsID0gU2RvQ29tQ29uX3A7CisJCVNkb0NvbUZpbmlzaGVkLm1fU2RvQ29tQ29uU3RhdGUgPSBTZG9Db21Db25TdGF0ZV9wOworCQlpZiAocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlID09CisJCSAgICBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleCkgeworCQkJU2RvQ29tRmluaXNoZWQubV9TZG9BY2Nlc3NUeXBlID0ga0VwbFNkb0FjY2Vzc1R5cGVXcml0ZTsKKwkJfSBlbHNlIHsKKwkJCVNkb0NvbUZpbmlzaGVkLm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlUmVhZDsKKwkJfQorCisJCS8vIHJlc2V0IHRyYW5zZmVyIHN0YXRlIHNvIHRoaXMgaGFuZGxlIGlzIG5vdCBidXN5IGFueW1vcmUKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gMDsKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKworCQlwZm5UcmFuc2ZlckZpbmlzaGVkID0gcFNkb0NvbUNvbl9wLT5tX3BmblRyYW5zZmVyRmluaXNoZWQ7CisJCS8vIGRlbGV0ZSBmdW5jdGlvbiBwb2ludGVyIHRvIGluZm9ybSBhcHBsaWNhdGlvbiBvbmx5IG9uY2UgZm9yIGVhY2ggdHJhbnNmZXIKKwkJcFNkb0NvbUNvbl9wLT5tX3BmblRyYW5zZmVyRmluaXNoZWQgPSBOVUxMOworCisJCS8vIGNhbGwgYXBwbGljYXRpb24ncyBjYWxsYmFjayBmdW5jdGlvbgorCQlwZm5UcmFuc2ZlckZpbmlzaGVkKCZTZG9Db21GaW5pc2hlZCk7CisKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvVWRwdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9VZHB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1MjIzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvVWRwdS5jCkBAIC0wLDAgKzEsNzkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIFNETy9VRFAtUHJvdG9jb2xhYnN0cmFjdGlvbmxheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb1VkcHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb1VkcHUuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisjaW5jbHVkZSAiU29ja2V0TGludXhLZXJuZWwuaCIKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUAorI2RlZmluZSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCAgNQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV91bElwQWRkcjsJLy8gaW4gbmV0d29yayBieXRlIG9yZGVyCisJdW5zaWduZWQgaW50IG1fdWlQb3J0OwkvLyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKworfSB0RXBsU2RvVWRwQ29uOworCisvLyBpbnN0YW5jZSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9VZHBDb24gbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUF07CisJdEVwbFNlcXVMYXllclJlY2VpdmVDYiBtX2ZwU2RvQXN5U2VxQ2I7CisJU09DS0VUIG1fVWRwU29ja2V0OworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwlIQU5ETEUgbV9UaHJlYWRIYW5kbGU7CisJTFBDUklUSUNBTF9TRUNUSU9OIG1fcENyaXRpY2FsU2VjdGlvbjsKKwlDUklUSUNBTF9TRUNUSU9OIG1fQ3JpdGljYWxTZWN0aW9uOworCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJc3RydWN0IGNvbXBsZXRpb24gbV9Db21wbGV0aW9uVWRwVGhyZWFkOworCWludCBtX1RocmVhZEhhbmRsZTsKKwlpbnQgbV9pVGVybWluYXRlVGhyZWFkOworI2VuZGlmCisKK30gdEVwbFNkb1VkcEluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFNkb1VkcEluc3RhbmNlIFNkb1VkcEluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKK3N0YXRpYyBEV09SRCBQVUJMSUMgRXBsU2RvVWRwVGhyZWFkKExQVk9JRCBscFBhcmFtZXRlcik7CisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKK3N0YXRpYyBpbnQgRXBsU2RvVWRwVGhyZWFkKHZvaWQgKnBBcmdfcCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8RVBMLVNETy1VRFAtTGF5ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjogUHJvdG9jb2xhYnN0cmFjdGlvbiBsYXllciBmb3IgVURQCisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVjZWl2ZUNiX3AgICAgPSAgIGZ1bmN0aW9ucG9pbnRlciB0byBTZG8tU2VxdWVuY2UgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLWZ1bmN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUluaXQodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU2RvVWRwdUFkZEluc3RhbmNlKGZwUmVjZWl2ZUNiX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgYWRkaXRpb25hbCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLyAgICAgICAgICAgICAg7m5pdCBzb2NrZXQgYW5kIHN0YXJ0IExpc3Rlbi1UaHJlYWQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVjZWl2ZUNiX3AgICAgPSAgIGZ1bmN0aW9ucG9pbnRlciB0byBTZG8tU2VxdWVuY2UgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLWZ1bmN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUFkZEluc3RhbmNlKHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJaW50IGlFcnJvcjsKKwlXU0FEQVRBIFdzYTsKKworI2VuZGlmCisKKwkvLyBzZXQgaW5zdGFuY2UgdmFyaWFibGVzIHRvIDAKKwlFUExfTUVNU0VUKCZTZG9VZHBJbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoU2RvVWRwSW5zdGFuY2VfZykpOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBzYXZlIHBvaW50ZXIgdG8gY2FsbGJhY2stZnVuY3Rpb24KKwlpZiAoZnBSZWNlaXZlQ2JfcCAhPSBOVUxMKSB7CisJCVNkb1VkcEluc3RhbmNlX2cubV9mcFNkb0FzeVNlcUNiID0gZnBSZWNlaXZlQ2JfcDsKKwl9IGVsc2UgeworCQlSZXQgPSBrRXBsU2RvVWRwTWlzc0NiOworCQlnb3RvIEV4aXQ7CisJfQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkvLyBzdGFydCB3aW5zb2NrMiBmb3Igd2luMzIKKwkvLyB3aW5kb3dzIHNwZWNpZmljIHN0YXJ0IG9mIHNvY2tldAorCWlFcnJvciA9IFdTQVN0YXJ0dXAoTUFLRVdPUkQoMiwgMCksICZXc2EpOworCWlmIChpRXJyb3IgIT0gMCkgeworCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY3JlYXRlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIGFjY2Nlc3Mgb2YgaW5zdG5hY2UgdmFyaWFibGVzCisJU2RvVWRwSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24gPQorCSAgICAmU2RvVWRwSW5zdGFuY2VfZy5tX0NyaXRpY2FsU2VjdGlvbjsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCWluaXRfY29tcGxldGlvbigmU2RvVWRwSW5zdGFuY2VfZy5tX0NvbXBsZXRpb25VZHBUaHJlYWQpOworCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMDsKKyNlbmRpZgorCisJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9IDA7CisJU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCA9IElOVkFMSURfU09DS0VUOworCisJUmV0ID0gRXBsU2RvVWRwdUNvbmZpZyhJTkFERFJfQU5ZLCAwKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vICAgICAgICAgICAgICBkZWwgc29ja2V0IGFuZCBkZWwgTGlzdGVuLVRocmVhZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwlCT09MIGZUZXJtRXJyb3I7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgIT0gMCkgewkvLyBsaXN0ZW4gdGhyZWFkIHdhcyBzdGFydGVkCisJCS8vIGNsb3NlIHRocmVhZAorI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCWZUZXJtRXJyb3IgPQorCQkgICAgVGVybWluYXRlVGhyZWFkKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDApOworCQlpZiAoZlRlcm1FcnJvciA9PSBGQUxTRSkgeworCQkJUmV0ID0ga0VwbFNkb1VkcFRocmVhZEVycm9yOworCQkJZ290byBFeGl0OworCQl9CisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMTsKKwkJLyoga2lsbF9wcm9jKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIFNJR1RFUk0sIDEgKTsgKi8KKwkJc2VuZF9zaWcoU0lHVEVSTSwgU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgMSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKKyNlbmRpZgorCisJCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPSAwOworCX0KKworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ICE9IElOVkFMSURfU09DS0VUKSB7CisJCS8vIGNsb3NlIHNvY2tldAorCQljbG9zZXNvY2tldChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0KTsKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCA9IElOVkFMSURfU09DS0VUOworCX0KKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIGRlbGV0ZSBjcml0aWNhbCBzZWN0aW9uCisJRGVsZXRlQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkvLyBmb3Igd2luIDMyCisJV1NBQ2xlYW51cCgpOworI2VuZGlmCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorICAgICAgRXhpdDoKKyNlbmRpZgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVDb25maWcKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVjb25maWd1cmF0ZSBzb2NrZXQgd2l0aCBuZXcgSVAtQWRkcmVzcworLy8gICAgICAgICAgICAgIC0+IG5lZWRlZCBmb3IgTk1UIFJlc2V0Q29uZmlndXJhdGlvbgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1bElwQWRkcl9wICAgICAgPSBJcEFkZHJlc3MgaW4gcGxhdGZvcm0gYnl0ZSBvcmRlcgorLy8gICAgICAgICAgICAgIHVpUG9ydF9wICAgICAgICA9IHBvcnQgbnVtYmVyIGluIHBsYXRmb3JtIGJ5dGUgb3JkZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1Q29uZmlnKHVuc2lnbmVkIGxvbmcgdWxJcEFkZHJfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlQb3J0X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJc3RydWN0IHNvY2thZGRyX2luIEFkZHI7CisJaW50IGlFcnJvcjsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJQk9PTCBmVGVybUVycm9yOworCXVuc2lnbmVkIGxvbmcgdWxUaHJlYWRJZDsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAodWlQb3J0X3AgPT0gMCkgewkvLyBzZXQgVURQIHBvcnQgdG8gZGVmYXVsdCBwb3J0IG51bWJlcgorCQl1aVBvcnRfcCA9IEVQTF9DX1NET19FUExfUE9SVDsKKwl9IGVsc2UgaWYgKHVpUG9ydF9wID4gNjU1MzUpIHsKKwkJUmV0ID0ga0VwbFNkb1VkcFNvY2tldEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgIT0gMCkgewkvLyBsaXN0ZW4gdGhyZWFkIHdhcyBzdGFydGVkCisKKwkJLy8gY2xvc2Ugb2xkIHRocmVhZAorI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCWZUZXJtRXJyb3IgPQorCQkgICAgVGVybWluYXRlVGhyZWFkKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDApOworCQlpZiAoZlRlcm1FcnJvciA9PSBGQUxTRSkgeworCQkJUmV0ID0ga0VwbFNkb1VkcFRocmVhZEVycm9yOworCQkJZ290byBFeGl0OworCQl9CisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMTsKKwkJLyoga2lsbF9wcm9jKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIFNJR1RFUk0sIDEgKTsgKi8KKwkJc2VuZF9zaWcoU0lHVEVSTSwgU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgMSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX2lUZXJtaW5hdGVUaHJlYWQgPSAwOworI2VuZGlmCisKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9IDA7CisJfQorCisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgIT0gSU5WQUxJRF9TT0NLRVQpIHsKKwkJLy8gY2xvc2Ugc29ja2V0CisJCWlFcnJvciA9IGNsb3Nlc29ja2V0KFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQpOworCQlTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CisJCWlmIChpRXJyb3IgIT0gMCkgeworCQkJUmV0ID0ga0VwbFNkb1VkcFNvY2tldEVycm9yOworCQkJZ290byBFeGl0OworCQl9CisJfQorCS8vIGNyZWF0ZSBTb2NrZXQKKwlTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCA9PSBJTlZBTElEX1NPQ0tFVCkgeworCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CisJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiRXBsU2RvVWRwdUNvbmZpZzogc29ja2V0KCkgZmFpbGVkXG4iKTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBiaW5kIHNvY2tldAorCUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJQWRkci5zaW5fcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCl1aVBvcnRfcCk7CisJQWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCh1bElwQWRkcl9wKTsKKwlpRXJyb3IgPQorCSAgICBiaW5kKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmQWRkciwKKwkJIHNpemVvZihBZGRyKSk7CisJaWYgKGlFcnJvciA8IDApIHsKKwkJLy9pRXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKwkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UxCisJCSAgICAoIkVwbFNkb1VkcHVDb25maWc6IGJpbmQoKSBmaW5pc2hlZCB3aXRoICVpXG4iLCBpRXJyb3IpOworCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY3JlYXRlIExpc3Rlbi1UaHJlYWQKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIGZvciB3aW4zMgorCisJLy8gY3JlYXRlIHRocmVhZAorCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPSBDcmVhdGVUaHJlYWQoTlVMTCwKKwkJCQkJCSAgICAgICAwLAorCQkJCQkJICAgICAgIEVwbFNkb1VkcFRocmVhZCwKKwkJCQkJCSAgICAgICAmU2RvVWRwSW5zdGFuY2VfZywKKwkJCQkJCSAgICAgICAwLCAmdWxUaHJlYWRJZCk7CisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsU2RvVWRwVGhyZWFkRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisKKwlTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0KKwkgICAga2VybmVsX3RocmVhZChFcGxTZG9VZHBUaHJlYWQsICZTZG9VZHBJbnN0YW5jZV9nLCBDTE9ORV9LRVJORUwpOworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID09IDApIHsKKwkJUmV0ID0ga0VwbFNkb1VkcFRocmVhZEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1SW5pdENvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGEgbmV3IGNvbm5lY3QKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29uSGFuZGxlX3AgPSBwb2ludGVyIGZvciB0aGUgbmV3IGNvbm5lY3Rpb24gaGFuZGxlCisvLyAgICAgICAgICAgICAgdWlUYXJnZXROb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgdGFyZ2V0IG5vZGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1SW5pdENvbih0RXBsU2RvQ29uSGRsICogcFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlQ29uOworCXRFcGxTZG9VZHBDb24gKnBTZG9VZHBDb247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGdldCBmcmVlIGVudHJ5IGluIGNvbnRyb2wgc3RydWN0dXJlCisJdWlDb3VudCA9IDA7CisJdWlGcmVlQ29uID0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFA7CisJcFNkb1VkcENvbiA9ICZTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bMF07CisJd2hpbGUgKHVpQ291bnQgPCBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQlpZiAoKHBTZG9VZHBDb24tPm1fdWxJcEFkZHIgJiBodG9ubCgweEZGKSkgPT0gaHRvbmwodWlUYXJnZXROb2RlSWRfcCkpIHsJLy8gZXhpc3RpbmcgY29ubmVjdGlvbiB0byB0YXJnZXQgbm9kZSBmb3VuZAorCQkJLy8gc2V0IGhhbmRsZQorCQkJKnBTZG9Db25IYW5kbGVfcCA9ICh1aUNvdW50IHwgRVBMX1NET19VRFBfSEFORExFKTsKKworCQkJZ290byBFeGl0OworCQl9IGVsc2UgaWYgKChwU2RvVWRwQ29uLT5tX3VsSXBBZGRyID09IDApCisJCQkgICAmJiAocFNkb1VkcENvbi0+bV91aVBvcnQgPT0gMCkpIHsKKwkJCXVpRnJlZUNvbiA9IHVpQ291bnQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwU2RvVWRwQ29uKys7CisJfQorCisJaWYgKHVpRnJlZUNvbiA9PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQkvLyBlcnJvciBubyBmcmVlIGhhbmRsZQorCQlSZXQgPSBrRXBsU2RvVWRwTm9GcmVlSGFuZGxlOworCX0gZWxzZSB7CisJCXBTZG9VZHBDb24gPQorCQkgICAgJlNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUZyZWVDb25dOworCQkvLyBzYXZlIGluZm9zIGZvciBjb25uZWN0aW9uCisJCXBTZG9VZHBDb24tPm1fdWlQb3J0ID0gaHRvbnMoRVBMX0NfU0RPX0VQTF9QT1JUKTsKKwkJcFNkb1VkcENvbi0+bV91bElwQWRkciA9IGh0b25sKDB4QzBBODY0MDAgfCB1aVRhcmdldE5vZGVJZF9wKTsJLy8gMTkyLjE2OC4xMDAudWlUYXJnZXROb2RlSWRfcAorCisJCS8vIHNldCBoYW5kbGUKKwkJKnBTZG9Db25IYW5kbGVfcCA9ICh1aUZyZWVDb24gfCBFUExfU0RPX1VEUF9IQU5ETEUpOworCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdVNlbmREYXRhCisvLworLy8gRGVzY3JpcHRpb246IHNlbmQgZGF0YSB1c2luZyBleGlzaXRpbmcgY29ubmVjdGlvbgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbkhhbmRsZV9wICA9IGNvbm5lY3Rpb24gaGFuZGxlCisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gcG9pbnRlciB0byBkYXRhCisvLyAgICAgICAgICAgICAgZHdEYXRhU2l6ZV9wICAgID0gbnVtYmVyIG9mIGRhdGFieXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3aXRob3V0IGFzZW5kLWhlYWRlciEhIQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdVNlbmREYXRhKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICB0RXBsRnJhbWUgKiBwU3JjRGF0YV9wLCBEV09SRCBkd0RhdGFTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJaW50IGlFcnJvcjsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gQWRkcjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CisJaWYgKHVpQXJyYXkgPj0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKKwkJUmV0ID0ga0VwbFNkb1VkcEludmFsaWRIZGw7CisJCWdvdG8gRXhpdDsKKwl9CisJLy9zZXQgbWVzc2FnZSB0eXBlCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLCAweDA2KTsJLy8gU0RPCisJLy8gdGFyZ2V0IG5vZGUgaWQgKGZvciBVZHAgPSAwKQorCUFtaVNldEJ5dGVUb0xlKCZwU3JjRGF0YV9wLT5tX2xlX2JEc3ROb2RlSWQsIDB4MDApOworCS8vIHNldCBzb3VyY2Utbm9kZWlkIChmb3IgVWRwID0gMCkKKwlBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iU3JjTm9kZUlkLCAweDAwKTsKKworCS8vIGNhbGMgc2l6ZQorCWR3RGF0YVNpemVfcCArPSBFUExfQVNORF9IRUFERVJfU0laRTsKKworCS8vIGNhbGwgc2VuZHRvCisJQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisKKwlBZGRyLnNpbl9wb3J0ID0KKwkgICAgKHVuc2lnbmVkIHNob3J0KVNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS4KKwkgICAgbV91aVBvcnQ7CisJQWRkci5zaW5fYWRkci5zX2FkZHIgPQorCSAgICBTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlBcnJheV0ubV91bElwQWRkcjsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUxlYXZlQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisJaUVycm9yID0gc2VuZHRvKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQsCS8vIHNvY2tldGhhbmRsZQorCQkJKGNvbnN0IGNoYXIgKikmcFNyY0RhdGFfcC0+bV9sZV9iTWVzc2FnZVR5cGUsCS8vIGRhdGEgdG8gc2VuZAorCQkJZHdEYXRhU2l6ZV9wLAkvLyBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZAorCQkJMCwJLy8gZmxhZ3MKKwkJCShzdHJ1Y3Qgc29ja2FkZHIgKikmQWRkciwJLy8gdGFyZ2V0CisJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CS8vIHNpemVvZiB0YXJnZXRhZHJlc3MKKwlpZiAoaUVycm9yIDwgMCkgeworCQlFUExfREJHTFZMX1NET19UUkFDRTEKKwkJICAgICgiRXBsU2RvVWRwdVNlbmREYXRhOiBzZW5kdG8oKSBmaW5pc2hlZCB3aXRoICVpXG4iLCBpRXJyb3IpOworCQlSZXQgPSBrRXBsU2RvVWRwU2VuZEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdURlbENvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgY29ubmVjdGlvbiBmcm9tIGludGVybiBzdHJ1Y3R1cmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdURlbENvbih0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUFycmF5OworCisJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CisKKwlpZiAodWlBcnJheSA+PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQlSZXQgPSBrRXBsU2RvVWRwSW52YWxpZEhkbDsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCX0KKworCS8vIGRlbGV0ZSBjb25uZWN0aW9uCisJU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpQXJyYXldLm1fdWxJcEFkZHIgPSAwOworCVNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS5tX3VpUG9ydCA9IDA7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9VZHBUaHJlYWQKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIHRocmVhZCBjaGVjayBzb2NrZXQgZm9yIG5ldyBkYXRhCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIGxwUGFyYW1ldGVyID0gcG9pbnRlciB0byBwYXJhbWV0ZXIgdHlwZSB0RXBsU2RvVWRwVGhyZWFkUGFyYQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIERXT1JEICAgPSAgIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCitzdGF0aWMgRFdPUkQgUFVCTElDIEVwbFNkb1VkcFRocmVhZChMUFZPSUQgbHBQYXJhbWV0ZXIpCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCitzdGF0aWMgaW50IEVwbFNkb1VkcFRocmVhZCh2b2lkICpwQXJnX3ApCisjZW5kaWYKK3sKKworCXRFcGxTZG9VZHBJbnN0YW5jZSAqcEluc3RhbmNlOworCXN0cnVjdCBzb2NrYWRkcl9pbiBSZW1vdGVBZGRyOworCWludCBpRXJyb3I7CisJaW50IGlDb3VudDsKKwlpbnQgaUZyZWVFbnRyeTsKKwlCWVRFIGFiQnVmZmVyW0VQTF9NQVhfU0RPX1JFQ19GUkFNRV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgdWlTaXplOworCXRFcGxTZG9Db25IZGwgU2RvQ29uSGRsOworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwlwSW5zdGFuY2UgPSAodEVwbFNkb1VkcEluc3RhbmNlICopIGxwUGFyYW1ldGVyOworCisJZm9yICg7OykKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwlwSW5zdGFuY2UgPSAodEVwbFNkb1VkcEluc3RhbmNlICopIHBBcmdfcDsKKwlkYWVtb25pemUoIkVwbFNkb1VkcFRocmVhZCIpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKworCWZvciAoOyBwSW5zdGFuY2UtPm1faVRlcm1pbmF0ZVRocmVhZCA9PSAwOykKKyNlbmRpZgorCisJeworCQkvLyB3YWl0IGZvciBkYXRhCisJCXVpU2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOworCQlpRXJyb3IgPSByZWN2ZnJvbShwSW5zdGFuY2UtPm1fVWRwU29ja2V0LAkvLyBTb2NrZXQKKwkJCQkgIChjaGFyICopJmFiQnVmZmVyWzBdLAkvLyBidWZmZXIgZm9yIGRhdGEKKwkJCQkgIHNpemVvZihhYkJ1ZmZlciksCS8vIHNpemUgb2YgdGhlIGJ1ZmZlcgorCQkJCSAgMCwJLy8gZmxhZ3MKKwkJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmUmVtb3RlQWRkciwKKwkJCQkgIChpbnQgKikmdWlTaXplKTsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJCWlmIChpRXJyb3IgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWlmIChpRXJyb3IgPiAwKSB7CisJCQkvLyBnZXQgaGFuZGxlIGZvciBoaWdoZXIgbGF5ZXIKKwkJCWlDb3VudCA9IDA7CisJCQlpRnJlZUVudHJ5ID0gMHhGRkZGOworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCQkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCQkJRW50ZXJDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisJCQl3aGlsZSAoaUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKKwkJCQkvLyBjaGVjayBpZiB0aGlzIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBrbm93bgorCQkJCWlmICgocEluc3RhbmNlLT5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lDb3VudF0uCisJCQkJICAgICBtX3VsSXBBZGRyID09IFJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKQorCQkJCSAgICAmJiAocEluc3RhbmNlLT4KKwkJCQkJbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgorCQkJCQltX3VpUG9ydCA9PSBSZW1vdGVBZGRyLnNpbl9wb3J0KSkgeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoKHBJbnN0YW5jZS0+bV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgorCQkJCSAgICAgbV91bElwQWRkciA9PSAwKQorCQkJCSAgICAmJiAocEluc3RhbmNlLT4KKwkJCQkJbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgorCQkJCQltX3VpUG9ydCA9PSAwKQorCQkJCSAgICAmJiAoaUZyZWVFbnRyeSA9PSAweEZGRkYpKQorCQkJCXsKKwkJCQkJaUZyZWVFbnRyeSA9IGlDb3VudDsKKwkJCQl9CisKKwkJCQlpQ291bnQrKzsKKwkJCX0KKworCQkJaWYgKGlDb3VudCA9PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQkJCS8vIGNvbm5lY3Rpb24gdW5rbm93bgorCQkJCS8vIHNlZSBpZiB0aGVyZSBpcyBhIGZyZWUgaGFuZGxlCisJCQkJaWYgKGlGcmVlRW50cnkgIT0gMHhGRkZGKSB7CisJCQkJCS8vIHNhdmUgYWRyZXNzIGluZm9zCisJCQkJCXBJbnN0YW5jZS0+CisJCQkJCSAgICBtX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lGcmVlRW50cnldLgorCQkJCQkgICAgbV91bElwQWRkciA9CisJCQkJCSAgICBSZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwkJCQkJcEluc3RhbmNlLT4KKwkJCQkJICAgIG1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUZyZWVFbnRyeV0uCisJCQkJCSAgICBtX3VpUG9ydCA9IFJlbW90ZUFkZHIuc2luX3BvcnQ7CisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkJCQkJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCQkJCQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgbV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCQkJCQkvLyBjYWxsIGNhbGxiYWNrCisJCQkJCVNkb0NvbkhkbCA9IGlGcmVlRW50cnk7CisJCQkJCVNkb0NvbkhkbCB8PSBFUExfU0RPX1VEUF9IQU5ETEU7CisJCQkJCS8vIG9mZnNldCA0IC0+IHN0YXJ0IG9mIFNETyBTZXF1ZW5jZSBoZWFkZXIKKwkJCQkJcEluc3RhbmNlLT5tX2ZwU2RvQXN5U2VxQ2IoU2RvQ29uSGRsLAorCQkJCQkJCQkgICAodEVwbEFzeVNkb1NlcQorCQkJCQkJCQkgICAgKikgJgorCQkJCQkJCQkgICBhYkJ1ZmZlcls0XSwKKwkJCQkJCQkJICAgKGlFcnJvciAtCisJCQkJCQkJCSAgICA0KSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwCisJCQkJCSAgICAoIkVycm9yIGluIEVwbFNkb1VkcFRocmVhZCgpIG5vIGZyZWUgaGFuZGxlXG4iKTsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCQkJCQkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJCQkJCUxlYXZlQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cuCisJCQkJCQkJICAgICBtX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCS8vIGtub3duIGNvbm5lY3Rpb24KKwkJCQkvLyBjYWxsIGNhbGxiYWNrIHdpdGggY29ycmVjdCBoYW5kbGUKKwkJCQlTZG9Db25IZGwgPSBpQ291bnQ7CisJCQkJU2RvQ29uSGRsIHw9IEVQTF9TRE9fVURQX0hBTkRMRTsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCQkJCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwkJCQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisJCQkJLy8gb2Zmc2V0IDQgLT4gc3RhcnQgb2YgU0RPIFNlcXVlbmNlIGhlYWRlcgorCQkJCXBJbnN0YW5jZS0+bV9mcFNkb0FzeVNlcUNiKFNkb0NvbkhkbCwKKwkJCQkJCQkgICAodEVwbEFzeVNkb1NlcSAqKSAmCisJCQkJCQkJICAgYWJCdWZmZXJbNF0sCisJCQkJCQkJICAgKGlFcnJvciAtIDQpKTsKKwkJCX0KKwkJfQkJLy8gZW5kIG9mICBpZihpRXJyb3IhPVNPQ0tFVF9FUlJPUikKKwl9CQkJLy8gZW5kIG9mIGZvcig7OykKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwljb21wbGV0ZV9hbmRfZXhpdCgmU2RvVWRwSW5zdGFuY2VfZy5tX0NvbXBsZXRpb25VZHBUaHJlYWQsIDApOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU3RhdHVzdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTdGF0dXN1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5ZjkxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU3RhdHVzdS5jCkBAIC0wLDAgKzEsMzgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIFN0YXR1c3UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU3RhdHVzdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTEvMTUgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsU3RhdHVzdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8eHh4eHg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsU3RhdHVzdUNiUmVzcG9uc2UgbV9hcGZuQ2JSZXNwb25zZVsyNTRdOworCit9IHRFcGxTdGF0dXN1SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFN0YXR1c3VJbnN0YW5jZSBFcGxTdGF0dXN1SW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1Q2JTdGF0dXNSZXNwb25zZSh0RXBsRnJhbWVJbmZvICoKKwkJCQkJCSAgICBwRnJhbWVJbmZvX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU3RhdHVzdUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VJbml0KCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFN0YXR1c3VBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU3RhdHVzdUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdUFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsU3RhdHVzdUluc3RhbmNlX2csIDAsIHNpemVvZihFcGxTdGF0dXN1SW5zdGFuY2VfZykpOworCisJLy8gcmVnaXN0ZXIgU3RhdHVzUmVzcG9uc2UgY2FsbGJhY2sgZnVuY3Rpb24KKwlSZXQgPQorCSAgICBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZSwKKwkJCQkgICAgIEVwbFN0YXR1c3VDYlN0YXR1c1Jlc3BvbnNlLAorCQkJCSAgICAga0VwbERsbEFzbmRGaWx0ZXJBbnkpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTdGF0dXN1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlcmVnaXN0ZXIgU3RhdHVzUmVzcG9uc2UgY2FsbGJhY2sgZnVuY3Rpb24KKwlSZXQgPQorCSAgICBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZSwgTlVMTCwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyTm9uZSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFN0YXR1c3VSZXNldAorLy8KKy8vIERlc2NyaXB0aW9uOiByZXNldHMgdGhpcyBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1UmVzZXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxTdGF0dXN1SW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbFN0YXR1c3VJbnN0YW5jZV9nKSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFN0YXR1c3VSZXF1ZXN0U3RhdHVzUmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgU3RhdHVzUmVzcG9uc2UgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwZm5DYlJlc3BvbnNlX3AgICAgICAgICAgICAgPSBJTjogZnVuY3Rpb24gcG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGlmIFN0YXR1c1Jlc3BvbnNlIGlzIHJlY2VpdmVkCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VSZXF1ZXN0U3RhdHVzUmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgIHRFcGxTdGF0dXN1Q2JSZXNwb25zZQorCQkJCQkJICBwZm5DYlJlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlY3JlbWVudCBub2RlIElELCBiZWNhdXNlIGFycmF5IGlzIHplcm8gYmFzZWQKKwl1aU5vZGVJZF9wLS07CisJaWYgKHVpTm9kZUlkX3AgPCB0YWJlbnRyaWVzKEVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2UpKSB7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCWlmIChFcGxTdGF0dXN1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpTm9kZUlkX3BdICE9IE5VTEwpIHsJLy8gcmVxdWVzdCBhbHJlYWR5IGlzc3VlZCAobWF5YmUgYnkgc29tZW9uZSBlbHNlKQorCQkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisJCX0gZWxzZSB7CisJCQlFcGxTdGF0dXN1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpTm9kZUlkX3BdID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlX3A7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbHVDYWxJc3N1ZVJlcXVlc3Qoa0VwbERsbFJlcVNlcnZpY2VTdGF0dXMsCisJCQkJCQkgICAodWlOb2RlSWRfcCArIDEpLCAweEZGKTsKKwkJfQorI2Vsc2UKKwkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisjZW5kaWYKKwl9IGVsc2UgewkJLy8gaW52YWxpZCBub2RlIElEIHNwZWNpZmllZAorCQlSZXQgPSBrRXBsSW52YWxpZE5vZGVJZDsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTdGF0dXN1Q2JTdGF0dXNSZXNwb25zZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgU3RhdHVzUmVzcG9uc2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IEZyYW1lIHdpdGggdGhlIFN0YXR1c1Jlc3BvbnNlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1Q2JTdGF0dXNSZXNwb25zZSh0RXBsRnJhbWVJbmZvICoKKwkJCQkJCSAgICBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbFN0YXR1c3VDYlJlc3BvbnNlIHBmbkNiUmVzcG9uc2U7CisKKwl1aU5vZGVJZCA9IEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fbGVfYlNyY05vZGVJZCk7CisKKwl1aUluZGV4ID0gdWlOb2RlSWQgLSAxOworCisJaWYgKHVpSW5kZXggPCB0YWJlbnRyaWVzKEVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2UpKSB7CisJCS8vIG1lbW9yaXplIHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKwkJcGZuQ2JSZXNwb25zZSA9IEVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF07CisJCWlmIChwZm5DYlJlc3BvbnNlID09IE5VTEwpIHsJLy8gcmVzcG9uc2Ugd2FzIG5vdCByZXF1ZXN0ZWQKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyByZXNldCBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIHNvIHRoYXQgY2FsbGVyIG1heSBpc3N1ZSBuZXh0IHJlcXVlc3QKKwkJRXBsU3RhdHVzdUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aUluZGV4XSA9IE5VTEw7CisKKwkJaWYgKHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSA8IEVQTF9DX0RMTF9NSU5TSVpFX1NUQVRVU1JFUykgewkvLyBTdGF0dXNSZXNwb25zZSBub3QgcmVjZWl2ZWQgb3IgaXQgaGFzIGludmFsaWQgc2l6ZQorCQkJUmV0ID0gcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwgTlVMTCk7CisJCX0gZWxzZSB7CS8vIFN0YXR1c1Jlc3BvbnNlIHJlY2VpdmVkCisJCQlSZXQgPQorCQkJICAgIHBmbkNiUmVzcG9uc2UodWlOb2RlSWQsCisJCQkJCSAgJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJICBtX0FzbmQubV9QYXlsb2FkLm1fU3RhdHVzUmVzcG9uc2UpOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUYXJnZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiNjZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGFyZ2V0LmgKQEAgLTAsMCArMSwyMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIHRhcmdldCBhcGkgZnVuY3Rpb24KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUYXJnZXQuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA1LzEyLzA1IC1hczogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExUQVJHRVRfSF8KKyNkZWZpbmUgX0VQTFRBUkdFVF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1hY3JvcyBmb3IgbWVtb3J5IGFjY2VzcyAoZGVwZW5kcyBvbiB0YXJnZXQgc3lzdGVtKQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBOT1RFOgorLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWQgdG8gY29tYmluZSBzdGFuZGFyZCBsaWJyYXJ5IGRlZmluaXRpb25zLiBTb21lCisvLyBhcHBsaWNhdGlvbnMgbmVlZHMgdG8gdXNlIG9uZSBjb21tb24gbGlicmFyeSBmdW5jdGlvbiAoZS5nLiBtZW1jcHkoKSkuIFNvCisvLyB5b3UgY2FuIHNldCAob3IgY2hhbmdlKSBpdCBoZXJlLgorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKworI2RlZmluZSBfV0lOMzJfV0lORE9XUyAweDA0MDEKKyNkZWZpbmUgX1dJTjMyX1dJTk5UICAgMHgwNDAwCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisgICAgLy8yOS4xMS4yMDA0IGYuai4gc29uc3QgaXN0IG1lbWNweSB1bmQgbWVtc2V0IHVuYmVrYW5udAorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEVQTF9NRU1DUFkoZHN0LHNyYyxzaXopICAgICBtZW1jcHkoKHZvaWQqKShkc3QpLChjb25zdCB2b2lkKikoc3JjKSwoc2l6ZV90KShzaXopKTsKKyNkZWZpbmUgRVBMX01FTVNFVChkc3QsdmFsLHNpeikgICAgIG1lbXNldCgodm9pZCopKGRzdCksKGludCkodmFsKSwoc2l6ZV90KShzaXopKTsKKworICAgIC8vIGYuai46IGRpZSBGdW5rdGlvbmVuIGb8ciA8TWVtQWxsb2M+IHVuZCA8TWVtRnJlZT4gc2luZCBpbiBXaW5NZW0uYyBkZWZpbmllcnQKKyAgICAvL2RlZmluaXRpb24gZGVyIFByb3RvdHlwZW4KK3ZvaWQgRkFSICpNZW1BbGxvYyhEV09SRCBkd01lbVNpemVfcCk7Cit2b2lkIE1lbUZyZWUodm9pZCBGQVIgKiBwTWVtX3ApOworCisjZGVmaW5lIEVQTF9NQUxMT0Moc2l6KSAgICAgICAgICAgICBtYWxsb2MoKHNpemVfdCkoc2l6KSkKKyNkZWZpbmUgRVBMX0ZSRUUocHRyKSAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwdHIpCisKKyNpZm5kZWYgUFJJTlRGMAordm9pZCB0cmFjZShjb25zdCBjaGFyICpmbXQsIC4uLik7CisjZGVmaW5lIFBSSU5URiAgICAgICAgICAgICAgICAgICAgICBUUkFDRQorI2RlZmluZSBQUklOVEYwKGFyZykgICAgICAgICAgICAgICAgVFJBQ0UwKGFyZykKKyNkZWZpbmUgUFJJTlRGMShhcmcscDEpICAgICAgICAgICAgIFRSQUNFMShhcmcscDEpCisjZGVmaW5lIFBSSU5URjIoYXJnLHAxLHAyKSAgICAgICAgICBUUkFDRTIoYXJnLHAxLHAyKQorI2RlZmluZSBQUklOVEYzKGFyZyxwMSxwMixwMykgICAgICAgVFJBQ0UzKGFyZyxwMSxwMixwMykKKyNkZWZpbmUgUFJJTlRGNChhcmcscDEscDIscDMscDQpICAgIFRSQUNFNChhcmcscDEscDIscDMscDQpCisJLy8jZGVmaW5lIFBSSU5URiAgICAgICAgICAgICAgICAgICAgICBwcmludGYKKwkvLyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFBSSU5URihhcmcpCisJLy8jZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBQUklOVEYoYXJnLHAxKQorCS8vI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgUFJJTlRGKGFyZyxwMSxwMikKKwkvLyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFBSSU5URihhcmcscDEscDIscDMpCisJLy8jZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBQUklOVEYoYXJnLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZmRlZiBBU1NFUlRNU0cKKyN1bmRlZiBBU1NFUlRNU0cKKyNlbmRpZgorCisjZGVmaW5lIEFTU0VSVE1TRyhleHByLHN0cmluZykgIGlmICghKGV4cHIpKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm94IChOVUxMLCBzdHJpbmcsICJBc3NlcnRpb24gZmFpbGVkIiwgTUJfT0sgfCBNQl9JQ09ORVJST1IpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAoLTEpO30KKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX05PX09TXykKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyAgICAvLzI5LjExLjIwMDQgZi5qLiBzb25zdCBpc3QgbWVtY3B5IHVuZCBtZW1zZXQgdW5iZWthbm50CisvLyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgRVBMX01FTUNQWShkc3Qsc3JjLHNpeikgICAgIG1lbWNweSgodm9pZCopKGRzdCksKGNvbnN0IHZvaWQqKShzcmMpLChzaXplX3QpKHNpeikpOworI2RlZmluZSBFUExfTUVNU0VUKGRzdCx2YWwsc2l6KSAgICAgbWVtc2V0KCh2b2lkKikoZHN0KSwoaW50KSh2YWwpLChzaXplX3QpKHNpeikpOworCisjZGVmaW5lIEVQTF9NQUxMT0Moc2l6KSAgICAgICAgICAgICBtYWxsb2MoKHNpemVfdCkoc2l6KSkKKyNkZWZpbmUgRVBMX0ZSRUUocHRyKSAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwdHIpCisKKyNpZm5kZWYgUFJJTlRGMAorI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UKKyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFRSQUNFMChhcmcpCisjZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBUUkFDRTEoYXJnLHAxKQorI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgVFJBQ0UyKGFyZyxwMSxwMikKKyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFRSQUNFMyhhcmcscDEscDIscDMpCisjZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBUUkFDRTQoYXJnLHAxLHAyLHAzLHA0KQorCS8vI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmCisJLy8jZGVmaW5lIFBSSU5URjAoYXJnKSAgICAgICAgICAgICAgICBQUklOVEYoYXJnKQorCS8vI2RlZmluZSBQUklOVEYxKGFyZyxwMSkgICAgICAgICAgICAgUFJJTlRGKGFyZyxwMSkKKwkvLyNkZWZpbmUgUFJJTlRGMihhcmcscDEscDIpICAgICAgICAgIFBSSU5URihhcmcscDEscDIpCisJLy8jZGVmaW5lIFBSSU5URjMoYXJnLHAxLHAyLHAzKSAgICAgICBQUklOVEYoYXJnLHAxLHAyLHAzKQorCS8vI2RlZmluZSBQUklOVEY0KGFyZyxwMSxwMixwMyxwNCkgICAgUFJJTlRGKGFyZyxwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKQorCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2Vsc2UKKy8vICAgICAgICAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjZW5kaWYKKworICAgIC8vMjkuMTEuMjAwNCBmLmouIHNvbnN0IGlzdCBtZW1jcHkgdW5kIG1lbXNldCB1bmJla2FubnQKKy8vICAgICNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBFUExfTUVNQ1BZKGRzdCxzcmMsc2l6KSAgICAgbWVtY3B5KCh2b2lkKikoZHN0KSwoY29uc3Qgdm9pZCopKHNyYyksKHNpemVfdCkoc2l6KSk7CisjZGVmaW5lIEVQTF9NRU1TRVQoZHN0LHZhbCxzaXopICAgICBtZW1zZXQoKHZvaWQqKShkc3QpLChpbnQpKHZhbCksKHNpemVfdCkoc2l6KSk7CisKKyNpZm5kZWYgX19LRVJORUxfXworI2RlZmluZSBFUExfTUFMTE9DKHNpeikgICAgICAgICAgICAgbWFsbG9jKChzaXplX3QpKHNpeikpCisjZGVmaW5lIEVQTF9GUkVFKHB0cikgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopcHRyKQorI2Vsc2UKKyNkZWZpbmUgRVBMX01BTExPQyhzaXopICAgICAgICAgICAgIGttYWxsb2MoKHNpemVfdCkoc2l6KSwgR0ZQX0tFUk5FTCkKKyNkZWZpbmUgRVBMX0ZSRUUocHRyKSAgICAgICAgICAgICAgIGtmcmVlKCh2b2lkICopcHRyKQorI2VuZGlmCisKKyNpZm5kZWYgUFJJTlRGMAorI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UKKyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFRSQUNFMChhcmcpCisjZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBUUkFDRTEoYXJnLHAxKQorI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgVFJBQ0UyKGFyZyxwMSxwMikKKyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFRSQUNFMyhhcmcscDEscDIscDMpCisjZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBUUkFDRTQoYXJnLHAxLHAyLHAzLHA0KQorCS8vI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmCisJLy8jZGVmaW5lIFBSSU5URjAoYXJnKSAgICAgICAgICAgICAgICBQUklOVEYoYXJnKQorCS8vI2RlZmluZSBQUklOVEYxKGFyZyxwMSkgICAgICAgICAgICAgUFJJTlRGKGFyZyxwMSkKKwkvLyNkZWZpbmUgUFJJTlRGMihhcmcscDEscDIpICAgICAgICAgIFBSSU5URihhcmcscDEscDIpCisJLy8jZGVmaW5lIFBSSU5URjMoYXJnLHAxLHAyLHAzKSAgICAgICBQUklOVEYoYXJnLHAxLHAyLHAzKQorCS8vI2RlZmluZSBQUklOVEY0KGFyZyxwMSxwMixwMyxwNCkgICAgUFJJTlRGKGFyZyxwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjZW5kaWYKKworI2RlZmluZSBFUExfVEdUX0lOVE1BU0tfRVRIICAgICAweDAwMDEJLy8gZXRoZXJuZXQgaW50ZXJydXB0CisjZGVmaW5lIEVQTF9UR1RfSU5UTUFTS19ETUEgICAgIDB4MDAwMgkvLyBETUEgaW50ZXJydXB0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY3VycmVudGx5IG5vIFRpbWVyIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIGJ5IEVQTCBzdGFjaworLy8gc28gdGhleSBhcmUgbm90IGltcGxlbWVudGVkIHlldAorLy92b2lkICBQVUJMSUMgVGd0VGltZXJJbml0KHZvaWQpOworLy9EV09SRCBQVUJMSUMgVGd0R2V0VGlja0NvdW50KHZvaWQpOworLy92b2lkIFBVQkxJQyBUZ3RHZXROZXRUaW1lKHRFcGxOZXRUaW1lICogcE5ldFRpbWVfcCk7CisKKy8vIGZ1bmN0aW9ucyBmb3IgZXRoZXJuZXQgZHJpdmVyCit0RXBsS2VybmVsIFBVQkxJQyBUZ3RJbml0RXRoSXNyKHZvaWQpOwordm9pZCBQVUJMSUMgVGd0RnJlZUV0aElzcih2b2lkKTsKK3ZvaWQgUFVCTElDIFRndEVuYWJsZUdsb2JhbEludGVycnVwdChCWVRFIGZFbmFibGVfcCk7Cit2b2lkIFBVQkxJQyBUZ3RFbmFibGVFdGhJbnRlcnJ1cHQwKEJZVEUgZkVuYWJsZV9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aUludGVycnVwdE1hc2tfcCk7Cit2b2lkIFBVQkxJQyBUZ3RFbmFibGVFdGhJbnRlcnJ1cHQxKEJZVEUgZkVuYWJsZV9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aUludGVycnVwdE1hc2tfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExUQVJHRVRfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWNiZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lci5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFcGwgVGltZXItTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXIuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJFcGxFdmVudC5oIgorCisjaWZuZGVmIF9FUExUSU1FUl9IXworI2RlZmluZSBfRVBMVElNRVJfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyB0eXBlIGZvciB0aW1lciBoYW5kbGUKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB0RXBsVGltZXJIZGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRXZlbnRTaW5rIG1fRXZlbnRTaW5rOworCXVuc2lnbmVkIGxvbmcgbV91bEFyZzsJLy8gZC5rLjogY29udmVydGVkIHRvIHVuc2lnbmVkIGxvbmcgYmVjYXVzZQorCS8vIGl0IGlzIG5ldmVyIGFjY2Vzc2VkIGFzIGEgcG9pbnRlciBieSB0aGUKKwkvLyB0aW1lciBtb2R1bGUgYW5kIHRoZSBkYXRhIHRoZQorCS8vIHBvaW50ZXIgcG9pbnRzIHRvIGlzIG5vdCBzYXZlZCBpbiBhbnkgd2F5LgorCS8vIEl0IGlzIGp1c3QgYSB2YWx1ZS4gVGhlIHVzZXIgaXMgcmVzcG9uc2libGUKKwkvLyB0byBzdG9yZSB0aGUgZGF0YSBzdGF0aWNhbGx5IGFuZCBjb252ZXJ0CisJLy8gdGhlIHBvaW50ZXIgYmV0d2VlbiBhZGRyZXNzIHNwYWNlcy4KKworfSB0RXBsVGltZXJBcmc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJIZGwgbV9UaW1lckhkbDsKKwl1bnNpZ25lZCBsb25nIG1fdWxBcmc7CS8vIGQuay46IGNvbnZlcnRlZCB0byB1bnNpZ25lZCBsb25nIGJlY2F1c2UKKwkvLyBpdCBpcyBuZXZlciBhY2Nlc3NlZCBhcyBhIHBvaW50ZXIgYnkgdGhlCisJLy8gdGltZXIgbW9kdWxlIGFuZCB0aGUgZGF0YSB0aGUKKwkvLyBwb2ludGVyIHBvaW50cyB0byBpcyBub3Qgc2F2ZWQgaW4gYW55IHdheS4KKwkvLyBJdCBpcyBqdXN0IGEgdmFsdWUuCisKK30gdEVwbFRpbWVyRXZlbnRBcmc7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsVGltZXJrQ2FsbGJhY2spICh0RXBsVGltZXJFdmVudEFyZyAqCisJCQkJCQkgcEV2ZW50QXJnX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFRJTUVSX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydUxpbnV4S2VybmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydUxpbnV4S2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4MjBkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1TGludXhLZXJuZWwuYwpAQCAtMCwwICsxLDQ0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBFUEwgVXNlciBUaW1lcm1vZHVsZSBmb3IgTGludXgga2VybmVsIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVydUxpbnV4S2VybmVsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgS0VJTCB1VmlzaW9uIDIKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA5LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHRpbWVyX2xpc3QgbV9UaW1lcjsKKwl0RXBsVGltZXJBcmcgVGltZXJBcmd1bWVudDsKKworfSB0RXBsVGltZXJ1RGF0YTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBQVUJMSUMgRXBsVGltZXJ1Q2JNcyh1bnNpZ25lZCBsb25nIHVsUGFyYW1ldGVyX3ApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBMaW51eCBLZXJuZWw+ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBMaW51eCBLZXJuZWwKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gaW5pdHMgZmlyc3QgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsVGltZXJ1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXRzIGFkZGl0aW9uYWwgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlcyBpbnN0YW5jZQorLy8gICAgICAgICAgICAgIC0+IHVuZGVyIExpbnV4IG5vdGhpbmcgdG8gZG8KKy8vICAgICAgICAgICAgICAtPiBubyBpbnN0YW5jZSB0YWJsZSBuZWVkZWQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1U2V0VGltZXJNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjcmVhdGVzIGEgdGltZXIgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVGltZXJ1RGF0YSAqcERhdGE7CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwRGF0YSA9ICh0RXBsVGltZXJ1RGF0YSAqKSBFUExfTUFMTE9DKHNpemVvZih0RXBsVGltZXJ1RGF0YSkpOworCWlmIChwRGF0YSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisJaW5pdF90aW1lcigmcERhdGEtPm1fVGltZXIpOworCXBEYXRhLT5tX1RpbWVyLmZ1bmN0aW9uID0gRXBsVGltZXJ1Q2JNczsKKwlwRGF0YS0+bV9UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcERhdGE7CisJcERhdGEtPm1fVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB1bFRpbWVfcCAqIEhaIC8gMTAwMDsKKworCUVQTF9NRU1DUFkoJnBEYXRhLT5UaW1lckFyZ3VtZW50LCAmQXJndW1lbnRfcCwgc2l6ZW9mKHRFcGxUaW1lckFyZykpOworCisJYWRkX3RpbWVyKCZwRGF0YS0+bV9UaW1lcik7CisKKwkqcFRpbWVySGRsX3AgPSAodEVwbFRpbWVySGRsKSBwRGF0YTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNoYW5nZXMgYSB0aW1lciBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsVGltZV9wICAgID0gdGltZSBmb3IgdGltZXIgaW4gbXMKKy8vICAgICAgICAgICAgICBBcmd1bWVudF9wICA9IGFyZ3VtZW50IGZvciB0aW1lcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydU1vZGlmeVRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCQkgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVGltZXJ1RGF0YSAqcERhdGE7CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgaGFuZGxlIGl0c2VsZiwgaS5lLiB3YXMgdGhlIGhhbmRsZSBpbml0aWFsaXplZCBiZWZvcmUKKwlpZiAoKnBUaW1lckhkbF9wID09IDApIHsKKwkJUmV0ID0gRXBsVGltZXJ1U2V0VGltZXJNcyhwVGltZXJIZGxfcCwgdWxUaW1lX3AsIEFyZ3VtZW50X3ApOworCQlnb3RvIEV4aXQ7CisJfQorCXBEYXRhID0gKHRFcGxUaW1lcnVEYXRhICopICogcFRpbWVySGRsX3A7CisJaWYgKCh0RXBsVGltZXJ1RGF0YSAqKSBwRGF0YS0+bV9UaW1lci5kYXRhICE9IHBEYXRhKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwltb2RfdGltZXIoJnBEYXRhLT5tX1RpbWVyLCAoamlmZmllcyArIHVsVGltZV9wICogSFogLyAxMDAwKSk7CisKKwkvLyBjb3B5IHRoZSBUaW1lckFyZyBhZnRlciB0aGUgdGltZXIgaXMgcmVzdGFydGVkLAorCS8vIHNvIHRoYXQgYSB0aW1lciBvY2N1cmVkIGltbWVkaWF0ZWx5IGJlZm9yZSBtb2RfdGltZXIKKwkvLyB3b24ndCB1c2UgdGhlIG5ldyBUaW1lckFyZyBhbmQKKwkvLyB0aGVyZWZvcmUgdGhlIG9sZCB0aW1lciBjYW5ub3QgYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSBuZXcgb25lLgorCS8vIEJ1dCBpZiB0aGUgbmV3IHRpbWVyIGlzIHRvbyBmYXN0LCBpdCBtYXkgZ2V0IGxvc3QuCisJRVBMX01FTUNQWSgmcERhdGEtPlRpbWVyQXJndW1lbnQsICZBcmd1bWVudF9wLCBzaXplb2YodEVwbFRpbWVyQXJnKSk7CisKKwkvLyBjaGVjayBpZiB0aW1lciBpcyByZWFsbHkgcnVubmluZworCWlmICh0aW1lcl9wZW5kaW5nKCZwRGF0YS0+bV9UaW1lcikgPT0gMCkgewkvLyB0aW1lciBpcyBub3QgcnVubmluZworCQkvLyByZXRyeSBzdGFydGluZyBpdAorCQlhZGRfdGltZXIoJnBEYXRhLT5tX1RpbWVyKTsKKwl9CisJLy8gc2V0IGhhbmRsZSB0byBwb2ludGVyIG9mIHRFcGxUaW1lcnVEYXRhCisvLyAgICAqcFRpbWVySGRsX3AgPSAodEVwbFRpbWVySGRsKSBwRGF0YTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxldGVUaW1lcgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWxldGVzIGEgdGltZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbFRpbWVydURhdGEgKnBEYXRhOworCisJLy8gY2hlY2sgcG9pbnRlciB0byBoYW5kbGUKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGhhbmRsZSBpdHNlbGYsIGkuZS4gd2FzIHRoZSBoYW5kbGUgaW5pdGlhbGl6ZWQgYmVmb3JlCisJaWYgKCpwVGltZXJIZGxfcCA9PSAwKSB7CisJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQlnb3RvIEV4aXQ7CisJfQorCXBEYXRhID0gKHRFcGxUaW1lcnVEYXRhICopICogcFRpbWVySGRsX3A7CisJaWYgKCh0RXBsVGltZXJ1RGF0YSAqKSBwRGF0YS0+bV9UaW1lci5kYXRhICE9IHBEYXRhKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKy8qICAgIGlmIChkZWxfdGltZXIoJnBEYXRhLT5tX1RpbWVyKSA9PSAxKQorICAgIHsKKyAgICAgICAga2ZyZWUocERhdGEpOworICAgIH0KKyovCisJLy8gdHJ5IHRvIGRlbGV0ZSB0aGUgdGltZXIKKwlkZWxfdGltZXIoJnBEYXRhLT5tX1RpbWVyKTsKKwkvLyBmcmVlIG1lbW9yeSBpbiBhbnkgY2FzZQorCWtmcmVlKHBEYXRhKTsKKworCS8vIHVuaW5pdGlhbGl6ZSBoYW5kbGUKKwkqcFRpbWVySGRsX3AgPSAwOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1SXNUaW1lckFjdGl2ZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVja3MgaWYgdGhlIHRpbWVyIHJlZmVyZW5jZWQgYnkgdGhlIGhhbmRsZSBpcyBjdXJyZW50bHkKKy8vICAgICAgICAgICAgICBhY3RpdmUuCisvLworLy8gUGFyYW1ldGVyczogIFRpbWVySGRsX3AgID0gaGFuZGxlIG9mIHRoZSB0aW1lciB0byBjaGVjaworLy8KKy8vIFJldHVybnM6ICAgICBCT09MICAgICAgICA9IFRSVUUsIGlmIGFjdGl2ZTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCT09MIFBVQkxJQyBFcGxUaW1lcnVJc1RpbWVyQWN0aXZlKHRFcGxUaW1lckhkbCBUaW1lckhkbF9wKQoreworCUJPT0wgZkFjdGl2ZSA9IEZBTFNFOworCXRFcGxUaW1lcnVEYXRhICpwRGF0YTsKKworCS8vIGNoZWNrIGhhbmRsZSBpdHNlbGYsIGkuZS4gd2FzIHRoZSBoYW5kbGUgaW5pdGlhbGl6ZWQgYmVmb3JlCisJaWYgKFRpbWVySGRsX3AgPT0gMCkgewkvLyB0aW1lciB3YXMgbm90IGNyZWF0ZWQgeWV0LCBzbyBpdCBpcyBub3QgYWN0aXZlCisJCWdvdG8gRXhpdDsKKwl9CisJcERhdGEgPSAodEVwbFRpbWVydURhdGEgKikgVGltZXJIZGxfcDsKKwlpZiAoKHRFcGxUaW1lcnVEYXRhICopIHBEYXRhLT5tX1RpbWVyLmRhdGEgIT0gcERhdGEpIHsJLy8gaW52YWxpZCB0aW1lcgorCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGlmIHRpbWVyIGlzIHJ1bm5pbmcKKwlpZiAodGltZXJfcGVuZGluZygmcERhdGEtPm1fVGltZXIpID09IDApIHsJLy8gdGltZXIgaXMgbm90IHJ1bm5pbmcKKwkJZ290byBFeGl0OworCX0KKworCWZBY3RpdmUgPSBUUlVFOworCisgICAgICBFeGl0OgorCXJldHVybiBmQWN0aXZlOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1Q2JNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBwcm9jZXNzIHRpbWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbHBQYXJhbWV0ZXIgPSBwb2ludGVyIHRvIHN0cnVjdHVyIG9mIHR5cGUgdEVwbFRpbWVydURhdGEKKy8vCisvLworLy8gUmV0dXJuczogICAgIChub25lKQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgUFVCTElDIEVwbFRpbWVydUNiTXModW5zaWduZWQgbG9uZyB1bFBhcmFtZXRlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbFRpbWVydURhdGEgKnBEYXRhOworCXRFcGxFdmVudCBFcGxFdmVudDsKKwl0RXBsVGltZXJFdmVudEFyZyBUaW1lckV2ZW50QXJnOworCisJcERhdGEgPSAodEVwbFRpbWVydURhdGEgKikgdWxQYXJhbWV0ZXJfcDsKKworCS8vIGNhbGwgZXZlbnQgZnVuY3Rpb24KKwlUaW1lckV2ZW50QXJnLm1fVGltZXJIZGwgPSAodEVwbFRpbWVySGRsKSBwRGF0YTsKKwlUaW1lckV2ZW50QXJnLm1fdWxBcmcgPSBwRGF0YS0+VGltZXJBcmd1bWVudC5tX3VsQXJnOworCisJRXBsRXZlbnQubV9FdmVudFNpbmsgPSBwRGF0YS0+VGltZXJBcmd1bWVudC5tX0V2ZW50U2luazsKKwlFcGxFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVUaW1lcjsKKwlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZih0RXBsTmV0VGltZSkpOworCUVwbEV2ZW50Lm1fcEFyZyA9ICZUaW1lckV2ZW50QXJnOworCUVwbEV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFRpbWVyRXZlbnRBcmcpOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXBsRXZlbnQpOworCisJLy8gZC5rLiBkbyBub3QgZnJlZSBtZW1vcnksIHVzZXIgaGFzIHRvIGNhbGwgRXBsVGltZXJ1RGVsZXRlVGltZXIoKQorCS8va2ZyZWUocERhdGEpOworCit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVOdWxsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydU51bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGNlNDAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVOdWxsLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBOVUxMLUltcGxlbWVudGF0aW9uCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXJ1TnVsbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxUaW1lcnUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgTlVMTC1JbXBsZW1lbnRhdGlvbj4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgTlVMTC1JbXBsZW1lbnRhdGlvbgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0IGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsVGltZXJ1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXQgYWRkaXRpb25hbCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbHRlIGluc3RhbmNlCisvLyAgICAgICAgICAgICAgLT4gdW5kZXIgV2luMzIgbm90aGluZyB0byBkbworLy8gICAgICAgICAgICAgIC0+IG5vIGluc3RuYWNlIHRhYmxlIG5lZWRlZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydVNldFRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY3JlYXRlIGEgdGltZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0byB0aGUgcG9pbnRlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hhbmdlIGEgdGltZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0byB0aGUgcG9pbnRlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkJIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxldGVUaW1lcgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWx0ZSBhIHRpbWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCBoYW5kbGUgaW52YWxpZGUKKwkqcFRpbWVySGRsX3AgPSAwOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVXaW4zMi5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVXaW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjdiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydVdpbjMyLmMKQEAgLTAsMCArMSw1MTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBmb3IgV2luMzIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lcnVXaW4zMi5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMDYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsVGltZXJ1LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJndW1lbnQ7CisJSEFORExFIERlbHRlSGFuZGxlOworCXVuc2lnbmVkIGxvbmcgdWxUaW1lb3V0OworCit9IHRFcGxUaW1lcnVUaHJlYWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlMUENSSVRJQ0FMX1NFQ1RJT04gbV9wQ3JpdGljYWxTZWN0aW9uOworCUNSSVRJQ0FMX1NFQ1RJT04gbV9Dcml0aWNhbFNlY3Rpb247Cit9IHRFcGxUaW1lcnVJbnN0YW5jZTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbFRpbWVydUluc3RhbmNlIEVwbFRpbWVydUluc3RhbmNlX2c7CitzdGF0aWMgdEVwbFRpbWVydVRocmVhZCBUaHJlYWREYXRhX2w7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RXT1JEIFBVQkxJQyBFcGxTZG9UaW1lcnVUaHJlYWRtcyhMUFZPSUQgbHBQYXJhbWV0ZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBXaW4zMj4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBXaW4zMgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0IGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsVGltZXJ1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXQgYWRkaXRpb25hbCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNyZWF0ZSBjcml0aWNhbCBzZWN0aW9uCisJRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24gPQorCSAgICAmRXBsVGltZXJ1SW5zdGFuY2VfZy5tX0NyaXRpY2FsU2VjdGlvbjsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKEVwbFRpbWVydUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbHRlIGluc3RhbmNlCisvLyAgICAgICAgICAgICAgLT4gdW5kZXIgV2luMzIgbm90aGluZyB0byBkbworLy8gICAgICAgICAgICAgIC0+IG5vIGluc3RuYWNlIHRhYmxlIG5lZWRlZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydVNldFRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY3JlYXRlIGEgdGltZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0byB0aGUgcG9pbnRlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJSEFORExFIERlbGV0ZUhhbmRsZTsKKwlIQU5ETEUgVGhyZWFkSGFuZGxlOworCURXT1JEIFRocmVhZElkOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBoYW5kbGUKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisJLy8gZmlyc3QgY3JlYXRlIGV2ZW50IHRvIGRlbGV0ZSB0aW1lcgorCURlbGV0ZUhhbmRsZSA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisJaWYgKERlbGV0ZUhhbmRsZSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCBoYW5kbGUgZm9yIGNhbGxlcgorCSpwVGltZXJIZGxfcCA9ICh0RXBsVGltZXJIZGwpIERlbGV0ZUhhbmRsZTsKKworCS8vIGZpbGwgZGF0YSBmb3IgdGhyZWFkCisJVGhyZWFkRGF0YV9sLkRlbHRlSGFuZGxlID0gRGVsZXRlSGFuZGxlOworCUVQTF9NRU1DUFkoJlRocmVhZERhdGFfbC5UaW1lckFyZ3VtZW50LCAmQXJndW1lbnRfcCwKKwkJICAgc2l6ZW9mKHRFcGxUaW1lckFyZykpOworCVRocmVhZERhdGFfbC51bFRpbWVvdXQgPSB1bFRpbWVfcDsKKworCS8vIGNyZWF0ZSB0aHJlYWQgdG8gY3JlYXRlIHdhaXRhYmxlIHRpbWVyIGFuZCB3YWl0IGZvciB0aW1lcgorCVRocmVhZEhhbmRsZSA9IENyZWF0ZVRocmVhZChOVUxMLAorCQkJCSAgICAwLAorCQkJCSAgICBFcGxTZG9UaW1lcnVUaHJlYWRtcywKKwkJCQkgICAgJlRocmVhZERhdGFfbCwgMCwgJlRocmVhZElkKTsKKwlpZiAoVGhyZWFkSGFuZGxlID09IE5VTEwpIHsKKwkJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbgorCQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkJLy8gZGVsdGUgaGFuZGxlCisJCUNsb3NlSGFuZGxlKERlbGV0ZUhhbmRsZSk7CisKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hhbmdlIGEgdGltZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0byB0aGUgcG9pbnRlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkJIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUhBTkRMRSBEZWxldGVIYW5kbGU7CisJSEFORExFIFRocmVhZEhhbmRsZTsKKwlEV09SRCBUaHJlYWRJZDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCURlbGV0ZUhhbmRsZSA9IChIQU5ETEUpICgqcFRpbWVySGRsX3ApOworCisJLy8gc2V0IGV2ZW50IHRvIGVuZCB0aW1lciB0YXNrIGZvciB0aGlzIHRpbWVyCisJU2V0RXZlbnQoRGVsZXRlSGFuZGxlKTsKKworCS8vIGNyZWF0ZSBuZXcgdGltZXIKKwkvLyBmaXJzdCBjcmVhdGUgZXZlbnQgdG8gZGVsZXRlIHRpbWVyCisJRGVsZXRlSGFuZGxlID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKwlpZiAoRGVsZXRlSGFuZGxlID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IGhhbmRsZSBmb3IgY2FsbGVyCisJKnBUaW1lckhkbF9wID0gKHRFcGxUaW1lckhkbCkgRGVsZXRlSGFuZGxlOworCisJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24KKwlFbnRlckNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkvLyBmaWxsIGRhdGEgZm9yIHRocmVhZAorCVRocmVhZERhdGFfbC5EZWx0ZUhhbmRsZSA9IERlbGV0ZUhhbmRsZTsKKwlFUExfTUVNQ1BZKCZUaHJlYWREYXRhX2wuVGltZXJBcmd1bWVudCwgJkFyZ3VtZW50X3AsCisJCSAgIHNpemVvZih0RXBsVGltZXJBcmcpKTsKKwlUaHJlYWREYXRhX2wudWxUaW1lb3V0ID0gdWxUaW1lX3A7CisKKwkvLyBjcmVhdGUgdGhyZWFkIHRvIGNyZWF0ZSB3YWl0YWJsZSB0aW1lciBhbmQgd2FpdCBmb3IgdGltZXIKKwlUaHJlYWRIYW5kbGUgPSBDcmVhdGVUaHJlYWQoTlVMTCwKKwkJCQkgICAgMCwKKwkJCQkgICAgRXBsU2RvVGltZXJ1VGhyZWFkbXMsCisJCQkJICAgICZUaHJlYWREYXRhX2wsIDAsICZUaHJlYWRJZCk7CisJaWYgKFRocmVhZEhhbmRsZSA9PSBOVUxMKSB7CisJCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24KKwkJTGVhdmVDcml0aWNhbFNlY3Rpb24oRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisJCS8vIGRlbHRlIGhhbmRsZQorCisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxldGVUaW1lcgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWx0ZSBhIHRpbWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUhBTkRMRSBEZWxldGVIYW5kbGU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlEZWxldGVIYW5kbGUgPSAoSEFORExFKSAoKnBUaW1lckhkbF9wKTsKKworCS8vIHNldCBldmVudCB0byBlbmQgdGltZXIgdGFzayBmb3IgdGhpcyB0aW1lcgorCVNldEV2ZW50KERlbGV0ZUhhbmRsZSk7CisKKwkvLyBzZXQgaGFuZGxlIGludmFsaWRlCisJKnBUaW1lckhkbF9wID0gMDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9UaW1lcnVUaHJlYWRtcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBwcm9jZXNzIHRpbWVyIGFzIHRocmVhZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIGxwUGFyYW1ldGVyID0gcG9pbnRlciB0byBzdHJ1Y3R1ciBvZiB0eXBlIHRFcGxUaW1lcnVUaHJlYWQKKy8vCisvLworLy8gUmV0dXJuczogICAgIERXT1JEID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEV09SRCBQVUJMSUMgRXBsU2RvVGltZXJ1VGhyZWFkbXMoTFBWT0lEIGxwUGFyYW1ldGVyKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxUaW1lcnVUaHJlYWQgKnBUaHJlYWREYXRhOworCUhBTkRMRSBhSGFuZGxlc1syXTsKKwlCT09MIGZSZXR1cm47CisJTEFSR0VfSU5URUdFUiBUaW1lb3V0VGltZTsKKwl1bnNpZ25lZCBsb25nIHVsRXZlbnQ7CisJdEVwbEV2ZW50IEVwbEV2ZW50OworCXRFcGxUaW1lcnVUaHJlYWQgVGhyZWFkRGF0YTsKKwl0RXBsVGltZXJFdmVudEFyZyBUaW1lckV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgcG9pbnRlciB0byBkYXRhCisJcFRocmVhZERhdGEgPSAodEVwbFRpbWVydVRocmVhZCAqKSBscFBhcmFtZXRlcjsKKwkvLyBjb3B5IHRocmVhZCBkYXRhCisJRVBMX01FTUNQWSgmVGhyZWFkRGF0YSwgcFRocmVhZERhdGEsIHNpemVvZihUaHJlYWREYXRhKSk7CisJcFRocmVhZERhdGEgPSAmVGhyZWFkRGF0YTsKKworCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24KKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkvLyBjcmVhdGUgd2FpdGFibGUgdGltZXIKKwlhSGFuZGxlc1sxXSA9IENyZWF0ZVdhaXRhYmxlVGltZXIoTlVMTCwgRkFMU0UsIE5VTEwpOworCWlmIChhSGFuZGxlc1sxXSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCB0aW1lcgorCS8vIHNldCB0aW1lb3V0IGludGVydmFsIC0+IG5lZWRlZCB0byBiZSBuZWdhdGl2CisJLy8gLT4gYmVjYXVzZSByZWxhdGl2ZSB0aW1lb3V0CisJLy8gLT4gbXVsdGlwbHkgYnkgMTAwMDAgZm9yIDEwMCBucyB0aW1lYmFzZSBvZiBmdW5jdGlvbgorCVRpbWVvdXRUaW1lLlF1YWRQYXJ0ID0gKCgobG9uZyBsb25nKXBUaHJlYWREYXRhLT51bFRpbWVvdXQpICogLTEwMDAwKTsKKwlmUmV0dXJuID0gU2V0V2FpdGFibGVUaW1lcihhSGFuZGxlc1sxXSwKKwkJCQkgICAmVGltZW91dFRpbWUsIDAsIE5VTEwsIE5VTEwsIEZBTFNFKTsKKwlpZiAoZlJldHVybiA9PSAwKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNhdmUgZGVsdGUgZXZlbnQgaGFuZGxlIGluIGhhbmRsZSBhcnJheQorCWFIYW5kbGVzWzBdID0gcFRocmVhZERhdGEtPkRlbHRlSGFuZGxlOworCisJLy8gd2FpdCBmb3Igb25lIG9mIHRoZSBldmVudHMKKwl1bEV2ZW50ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cygyLCAmYUhhbmRsZXNbMF0sIEZBTFNFLCBJTkZJTklURSk7CisJaWYgKHVsRXZlbnQgPT0gV0FJVF9PQkpFQ1RfMCkgewkvLyBkZWx0ZSBldmVudAorCisJCS8vIGNsb3NlIGhhbmRlbHMKKwkJQ2xvc2VIYW5kbGUoYUhhbmRsZXNbMV0pOworCQkvLyB0ZXJtaW5hdGUgdGhyZWFkCisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgaWYgKHVsRXZlbnQgPT0gKFdBSVRfT0JKRUNUXzAgKyAxKSkgewkvLyB0aW1lciBldmVudAorCQkvLyBjYWxsIGV2ZW50IGZ1bmN0aW9uCisJCVRpbWVyRXZlbnRBcmcubV9UaW1lckhkbCA9CisJCSAgICAodEVwbFRpbWVySGRsKSBwVGhyZWFkRGF0YS0+RGVsdGVIYW5kbGU7CisJCVRpbWVyRXZlbnRBcmcubV91bEFyZyA9IHBUaHJlYWREYXRhLT5UaW1lckFyZ3VtZW50Lm1fdWxBcmc7CisKKwkJRXBsRXZlbnQubV9FdmVudFNpbmsgPSBwVGhyZWFkRGF0YS0+VGltZXJBcmd1bWVudC5tX0V2ZW50U2luazsKKwkJRXBsRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlVGltZXI7CisJCUVQTF9NRU1TRVQoJkVwbEV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKHRFcGxOZXRUaW1lKSk7CisJCUVwbEV2ZW50Lm1fcEFyZyA9ICZUaW1lckV2ZW50QXJnOworCQlFcGxFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihUaW1lckV2ZW50QXJnKTsKKworCQlSZXQgPSBFcGxFdmVudHVQb3N0KCZFcGxFdmVudCk7CisKKwkJLy8gY2xvc2UgaGFuZGVscworCQlDbG9zZUhhbmRsZShhSGFuZGxlc1sxXSk7CisJCS8vIHRlcm1pbmF0ZSB0aHJlYWQKKwkJZ290byBFeGl0OworCisJfSBlbHNlIHsJCS8vIGVycm9yCisJCXVsRXZlbnQgPSBHZXRMYXN0RXJyb3IoKTsKKwkJVFJBQ0UxKCJFcnJvciBpbiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIEVycm9yY29kZTogMHgleFxuIiwKKwkJICAgICAgIHVsRXZlbnQpOworCQkvLyB0ZXJtaW5hdGUgdGhyZWFkCisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTcwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFZlcnNpb24uaApAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIEVQTCB2ZXJzaW9uIGZvciB0aGUgc3RhY2ssIGFzIHN0cmluZworICAgICAgICAgICAgICAgIGFuZCBmb3Igb2JqZWN0IDB4MTAxOCB3aXRoaW4gb2JqZWN0IGRpY3Rpb25hcnkuCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVmVyc2lvbi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBhbGwKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX1ZFUlNJT05fSF8KKyNkZWZpbmUgX0VQTF9WRVJTSU9OX0hfCisKKy8vIE5PVEU6CisvLyBBbGwgdmVyc2lvbiBtYWNyb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIHNhbWUgdmVyc2lvbiBudW1iZXIuIEJ1dCBkbyBub3QgdXNlCisvLyBkZWZpbmVzIGluc3RlYWQgb2YgdGhlIG51bWJlcnMuIEJlY2F1c2UgdGhlIG1hY3JvIEVQTF9TVFJJTkdfVkVSU0lPTigpIGNhbiBub3QKKy8vIGNvbnZlcnQgYSBkZWZpbmUgdG8gYSBzdHJpbmcuCisvLworLy8gRm9ybWF0OiBtYWoubWluLmJ1aWxkCisvLyAgICAgICAgIG1haiAgICAgICAgICAgID0gbWFqb3IgdmVyc2lvbgorLy8gICAgICAgICAgICAgbWluICAgICAgICA9IG1pbm9yIHZlcnNpb24gKHdpbGwgYmUgc2V0IHRvIDAgaWYgbWFqb3IgdmVyc2lvbiB3aWxsIGJlIGluY3JlbWVudGVkKQorLy8gICAgICAgICAgICAgICAgIGJ1aWxkICA9IGN1cnJlbnQgYnVpbGQgKHdpbGwgYmUgc2V0IHRvIDAgaWYgbWlub3IgdmVyc2lvbiB3aWxsIGJlIGluY3JlbWVudGVkKQorLy8KKyNkZWZpbmUgREVGSU5FRF9TVEFDS19WRVJTSU9OICAgICAgIEVQTF9TVEFDS19WRVJTSU9OICAgKDEsIDMsIDApCisjZGVmaW5lIERFRklORURfT0JKMTAxOF9WRVJTSU9OICAgICBFUExfT0JKMTAxOF9WRVJTSU9OICgxLCAzLCAwKQorI2RlZmluZSBERUZJTkVEX1NUUklOR19WRVJTSU9OICAgICAgRVBMX1NUUklOR19WRVJTSU9OICAoMSwgMywgMCkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX1BST0RVQ1RfTkFNRSAgICAgICAgICAgICJFUEwgVjIiCisjZGVmaW5lIEVQTF9QUk9EVUNUX1ZFUlNJT04gICAgICAgICBERUZJTkVEX1NUUklOR19WRVJTSU9OCisjZGVmaW5lIEVQTF9QUk9EVUNUX01BTlVGQUNUVVJFUiAgICAiU1lTIFRFQyBlbGVjdHJvbmljIEdtYkgiCisKKyNkZWZpbmUgRVBMX1BST0RVQ1RfS0VZICAgICAgICAgIlNPLTEwODMiCisjZGVmaW5lIEVQTF9QUk9EVUNUX0RFU0NSSVBUSU9OICJvcGVuUE9XRVJMSU5LIFByb3RvY29sIFN0YWNrIFNvdXJjZSIKKworI2VuZGlmIC8vIF9FUExfVkVSU0lPTl9IXworCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjkzOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIEVQTAorCXRyaXN0YXRlICJvcGVuUE9XRVJMSU5LIHByb3RvY29sIHN0YWNrIgorCWRlcGVuZHMgb24gTkVUICYmIEhJR0hfUkVTX1RJTUVSUyAmJiBYODYKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIG9wZW5QT1dFUkxJTksgbmV0d29yayBwcm90b2NvbCBzdGFjay4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzgyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDEgQEAKK29iai0kKENPTkZJR19FUEwpCSs9IGVwbC5vCisKK2VwbC1vYmpzIDo9IAlcCisJRXBsQXBpR2VuZXJpYy5vCQlcCisJRXBsQXBpTGludXhLZXJuZWwubwlcCisJRXBsQXBpUHJvY2Vzc0ltYWdlLm8JXAorCUVwbERsbGsubwkJXAorCUVwbERsbGtDYWwubwkJXAorCUVwbERsbHVDYWwubwkJXAorCUVwbEVycm9ySGFuZGxlcmsubwlcCisJRXBsRXZlbnRrLm8JCVwKKwlFcGxFdmVudHUubwkJXAorCUVwbElkZW50dS5vCQlcCisJRXBsTm10Q251Lm8JCVwKKwlFcGxObXRrLm8JCVwKKwlFcGxObXRrQ2FsLm8JCVwKKwlFcGxObXRNbnUubwkJXAorCUVwbE5tdHUubwkJXAorCUVwbE5tdHVDYWwubwkJXAorCUVwbE9iZC5vCQlcCisJRXBsT2Jka0NhbC5vCQlcCisJRXBsT2JkdS5vCQlcCisJRXBsT2JkdUNhbC5vCQlcCisJRXBsUGRvay5vCQlcCisJRXBsUGRva0NhbC5vCQlcCisJRXBsUGRvdS5vCQlcCisJRXBsU2RvQXNuZHUubwkJXAorCUVwbFNkb0FzeVNlcXUubwkJXAorCUVwbFNkb0NvbXUubwkJXAorCUVwbFNkb1VkcHUubwkJXAorCUVwbFN0YXR1c3UubwkJXAorCUVwbFRpbWVydUxpbnV4S2VybmVsLm8JXAorCWFtaXg4Ni5vCQlcCisJU2hhcmVkQnVmZi5vCQlcCisJU2hiSXBjLUxpbnV4S2VybmVsLm8JXAorCVRpbWVySGlnaFJlc2tYODYubwlcCisJVmlydHVhbEV0aGVybmV0TGludXgubwlcCisJU29ja2V0TGludXhLZXJuZWwubwlcCisJcHJvY19mcy5vCQlcCisJZGVtb19tYWluLm8JCVwKKwlFZHJ2ODEzOS5vCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYXJlZEJ1ZmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYjA5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYXJlZEJ1ZmYuYwpAQCAtMCwwICsxLDE3OTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gb2YgcGxhdGZvcm0gaW5kZXBlbmRlbmQgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDYvMjcgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisKKyNpZmRlZiBVTkRFUl9SVFNTCisJLy8gUlRYIGhlYWRlcgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8cnRhcGkuaD4KKworI2VsaWYgX19CT1JMQU5EQ19fCisJLy8gYm9ybGFuZCBDIGhlYWRlcgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisKKyNlbGlmIFdJTkNFCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZWxzZQorCS8vIE1TVkMgbmVlZHMgdG8gaW5jbHVkZSB3aW5kb3dzLmggYXQgZmlyc3QKKwkvLyB0aGUgZm9sbG93aW5nIGRlZmluZXMgYXIgbmVjZXNzYXJ5IGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB3YWl0YWJsZSB0aW1lcnMKKyNkZWZpbmUgX1dJTjMyX1dJTkRPV1MgMHgwNDAxCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAgIDB4MDQwMAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworI2VuZGlmCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjaW5jbHVkZSAiU2hiSXBjLmgiCisKKy8vIGQuay4gTGludXgga2VybmVsIG1vZHVsZXMgbmVlZHMgb3RoZXIgaGVhZGVyIGZpbGVzIGZvciBtZW1jcHkoKQorI2lmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKCFkZWZpbmVkKFNIQVJFREJVRkZfSU5MSU5FRCkpIHx8IGRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uZmlndXJhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25zdGFudCBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBTQkNfTUFHSUNfSUQgICAgMHg1MzQyNDMyMwkvLyBtYWdpYyBJRCAoIlNCQyMiKQorI2RlZmluZSBTQkxfTUFHSUNfSUQgICAgMHg1MzQyNEMyMwkvLyBtYWdpYyBJRCAoIlNCTCMiKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBzdHJ1Y3R1cmUgdG8gYWRtaW5pc3RyYXRlIGNpcmN1bGFyIHNoYXJlZCBidWZmZXIgaGVhZAordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV9TaGJDaXJNYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCQyMiKQorCXVuc2lnbmVkIGxvbmcgbV91bEJ1ZmZlclRvdGFsU2l6ZTsJLy8gb3Zlci1hbGwgc2l6ZSBvZiBjb21wbGV0ZSBidWZmZXIKKwl1bnNpZ25lZCBsb25nIG1fdWxCdWZmZXJEYXRhU2l6ZTsJLy8gc2l6ZSBvZiBjb21wbGV0ZSBkYXRhIGFyZWEKKwl1bnNpZ25lZCBsb25nIG1fdWxXckluZGV4OwkvLyBjdXJyZW50IHdyaXRlIGluZGV4IChzZXQgYmV2b3JlIHdyaXRlKQorCXVuc2lnbmVkIGxvbmcgbV91bFJkSW5kZXg7CS8vIGN1cnJlbnQgcmVhZCBpbmRleCAoc2V0IGFmdGVyIHJlYWQpCisJdW5zaWduZWQgbG9uZyBtX3VsTnVtT2ZXcml0ZUpvYnM7CS8vIG51bWJlciBvZiBjdXJyZW50bHkgKHBhcmFsbGVsIHJ1bm5pbmcpIHdyaXRlIG9wZXJhdGlvbnMKKwl1bnNpZ25lZCBsb25nIG1fdWxEYXRhSW5Vc2U7CS8vIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciBzaXplIChpbmNsLiB1bmNvbXBsZXRlZCB3cml0ZSBvcGVyYXRpb25zKQorCXVuc2lnbmVkIGxvbmcgbV91bERhdGFBcGVuZGVkOwkvLyBidWZmZXIgc2l6ZSBvZiBjb21wbGV0ZSBuZXcgd3JpdHRlbiBidXQgbm90IHlldCByZWFkYWJsZSBkYXRhIChpbiBjYXNlIG9mIG1fdWxOdW1PZldyaXRlSm9icz4xKQorCXVuc2lnbmVkIGxvbmcgbV91bEJsb2Nrc0FwZW5kZWQ7CS8vIG51bWJlciBvZiBjb21wbGV0ZSBuZXcgd3JpdHRlbiBidXQgbm90IHlldCByZWFkYWJsZSBkYXRhIGJsb2NrcyAoaW4gY2FzZSBvZiBtX3VsTnVtT2ZXcml0ZUpvYnM+MSkKKwl1bnNpZ25lZCBsb25nIG1fdWxEYXRhUmVhZGFibGU7CS8vIGJ1ZmZlciBzaXplIHdpdGggcmVhZGFibGUgKGNvbXBsZXRlIHdyaXR0ZW4pIGRhdGEKKwl1bnNpZ25lZCBsb25nIG1fdWxCbG9ja3NSZWFkYWJsZTsJLy8gbnVtYmVyIG9mIHJlYWRhYmxlIChjb21wbGV0ZSB3cml0dGVuKSBkYXRhIGJsb2NrcworCXRTaGJDaXJTaWdIbmRsck5ld0RhdGEgbV9wZm5TaWdIbmRsck5ld0RhdGE7CS8vIGFwcGxpY2F0aW9uIGhhbmRsZXIgdG8gc2lnbmFsIG5ldyBkYXRhCisJdW5zaWduZWQgaW50IG1fZkJ1ZmZlckxvY2tlZDsJLy8gVFJVRSBpZiBidWZmZXIgaXMgbG9ja2VkIChiZWNhdXNlIG9mIHBlbmRpbmcgcmVzZXQgcmVxdWVzdCkKKwl0U2hiQ2lyU2lnSG5kbHJSZXNldCBtX3BmblNpZ0huZGxyUmVzZXQ7CS8vIGFwcGxpY2F0aW9uIGhhbmRsZXIgdG8gc2lnbmFsIGJ1ZmZlciByZXNldCBpcyBkb25lCisJdW5zaWduZWQgY2hhciBtX0RhdGE7CS8vIHN0YXJ0IG9mIGRhdGEgYXJlYSAodGhlIHJlYWwgZGF0YSBzaXplIGlzIHVua25vd24gYXQgdGhpcyB0aW1lKQorCit9IHRTaGJDaXJCdWZmOworCisvLyBzdHJ1Y3R1cmUgdG8gYWRtaW5pc3RyYXRlIGxpbmVhciBzaGFyZWQgYnVmZmVyIGhlYWQKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV9TaGJMaW5NYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCTCMiKQorCXVuc2lnbmVkIGxvbmcgbV91bEJ1ZmZlclRvdGFsU2l6ZTsJLy8gb3Zlci1hbGwgc2l6ZSBvZiBjb21wbGV0ZSBidWZmZXIKKwl1bnNpZ25lZCBsb25nIG1fdWxCdWZmZXJEYXRhU2l6ZTsJLy8gc2l6ZSBvZiBjb21wbGV0ZSBkYXRhIGFyZWEKKwl1bnNpZ25lZCBjaGFyIG1fRGF0YTsJLy8gc3RhcnQgb2YgZGF0YSBhcmVhICh0aGUgcmVhbCBkYXRhIHNpemUgaXMgdW5rbm93biBhdCB0aGlzIHRpbWUpCisKK30gdFNoYkxpbkJ1ZmY7CisKKy8vIHR5cGUgdG8gc2F2ZSBzaXplIG9mIGEgc2luZ2xlIGRhdGEgYmxvY2sgaW5zaWRlIHRoZSBjaXJjdWxhciBzaGFyZWQgYnVmZmVyCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlGdWxsQmxvY2tTaXplOjI4OwkvLyBhIHNpbmdsZSBibG9jayBtdXN0IG5vdCBleGNlZWQgYSBsZW5ndGggb2YgMjU2TUJ5dGUgOi0pCisJdW5zaWduZWQgaW50IG1fdWlBbGlnbkZpbGxCeXRlczo0OworCit9IHRTaGJDaXJCbG9ja1NpemU7CisKKyNkZWZpbmUgU0JDX0JMT0NLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgIDQJLy8gYWxpZ25tZW50IG11c3QgKm5vdCogYmUgbG93ZXIgdGhhbiBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSkhCisjZGVmaW5lIFNCQ19NQVhfQkxPQ0tfU0laRSAgICAgICAgICgoMTw8MjgpLTEpCS8vID0gKDJeMjggLSAxKSA9ICgyNTZNQnl0ZSAtIDEpIC0+IHNob3VsZCBiZSBlbm91Z2h0IGZvciByZWFsIGxpZmUgOi0pCisKKyNkZWZpbmUgU0JMX0JMT0NLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0JMX01BWF9CTE9DS19TSVpFICAgICAgICAgKCgxPDwyOCktMSkJLy8gPSAoMl4yOCAtIDEpID0gKDI1Nk1CeXRlIC0gMSkgLT4gc2hvdWxkIGJlIGVub3VnaHQgZm9yIHJlYWwgbGlmZSA6LSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHbG9iYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzIG9mIGludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkNpckJ1ZmYgKlNoYkNpckdldEJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisKKwlwU2hiQ2lyQnVmZiA9ICh0U2hiQ2lyQnVmZiAqKSBTaGJJcGNHZXRTaE1lbVB0cihwU2hiSW5zdGFuY2VfcCk7CisJQVNTRVJUKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgPT0gU0JDX01BR0lDX0lEKTsKKworCXJldHVybiAocFNoYkNpckJ1ZmYpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gTGluZWFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiTGluQnVmZiAqU2hiTGluR2V0QnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJMaW5CdWZmICpwU2hiTGluQnVmZjsKKworCXBTaGJMaW5CdWZmID0gKHRTaGJMaW5CdWZmICopIFNoYklwY0dldFNoTWVtUHRyKHBTaGJJbnN0YW5jZV9wKTsKKwlBU1NFUlQocFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCA9PSBTQkxfTUFHSUNfSUQpOworCisJcmV0dXJuIChwU2hiTGluQnVmZik7CisKK30KKworLy8gbm90IGlubGluZWQgaW50ZXJuYWwgZnVuY3Rpb25zCitpbnQgU2hiQ2lyU2lnbmFsSGFuZGxlck5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKK3ZvaWQgU2hiQ2lyU2lnbmFsSGFuZGxlclJlc2V0KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBmVGltZU91dF9wKTsKKworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisvLyBub3QgaW5saW5lZCBleHRlcm5hbCBmdW5jdGlvbnMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbml0aWFsaXplIFNoYXJlZCBCdWZmZXIgTW9kdWxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSW5pdCh2b2lkKQoreworCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJU2hiRXJyb3IgPSBTaGJJcGNJbml0KCk7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIERlaW5pdGlhbGl6ZSBTaGFyZWQgQnVmZmVyIE1vZHVsZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkV4aXQodm9pZCkKK3sKKworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVNoYkVycm9yID0gU2hiSXBjRXhpdCgpOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBDIGkgciBjIHUgbCBhIHIgICBTIGggYSByIGUgZCAgIEIgdSBmIGYgZSByICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkNpckFsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCkKK3sKKworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGludCBmU2hiTmV3Q3JlYXRlZDsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZlclRvdGFsU2l6ZTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHVsQnVmZmVyU2l6ZV9wID09IDApIHx8IChwcFNoYkluc3RhbmNlX3AgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJLy8gY2FsY3VsYXRlIGxlbmd0aCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUKKwl1bEJ1ZmZlckRhdGFTaXplID0KKwkgICAgKHVsQnVmZmVyU2l6ZV9wICsKKwkgICAgIChTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSkpICYgfihTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSk7CisJdWxCdWZmZXJUb3RhbFNpemUgPSB1bEJ1ZmZlckRhdGFTaXplICsgc2l6ZW9mKHRTaGJDaXJCdWZmKTsKKworCS8vIGFsbG9jYXRlIGEgbmV3IG9yIG9wZW4gYW4gZXhpc3Rpbmcgc2hhcmVkIGJ1ZmZlcgorCVNoYkVycm9yID0gU2hiSXBjQWxsb2NCdWZmZXIodWxCdWZmZXJUb3RhbFNpemUsIHBzekJ1ZmZlcklEX3AsCisJCQkJICAgICAmcFNoYkluc3RhbmNlLCAmZlNoYk5ld0NyZWF0ZWQpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwU2hiSW5zdGFuY2UgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJPdXRPZk1lbTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGdldCBwb2ludGVyIHRvIHNoYXJlZCBidWZmZXIKKwlwU2hiQ2lyQnVmZiA9ICh0U2hiQ2lyQnVmZiAqKSBTaGJJcGNHZXRTaE1lbVB0cihwU2hiSW5zdGFuY2UpOworCisJLy8gaWYgdGhlIHNoYXJlZCBidWZmZXIgd2FzIG5ldyBjcmVhdGVkLCB0aGFuIHRoaXMgcHJvY2VzcyBoYXMKKwkvLyB0byBpbml0aWFsaXplIGl0LCBvdGhlcndpc2UgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGluIHVzZQorCS8vIGFuZCAqbXVzdCBub3QqIGJlIHJlc2V0ZWQKKwlpZiAoZlNoYk5ld0NyZWF0ZWQpIHsKKyNpZm5kZWYgTkRFQlVHCisJCXsKKwkJCW1lbXNldChwU2hiQ2lyQnVmZiwgMHhDQywgdWxCdWZmZXJUb3RhbFNpemUpOworCQl9CisjZW5kaWYKKworCQlwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEID0gU0JDX01BR0lDX0lEOworCQlwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlclRvdGFsU2l6ZSA9IHVsQnVmZmVyVG90YWxTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplID0gdWxCdWZmZXJEYXRhU2l6ZTsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4ID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icyA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZCA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisJCXBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQgPSBGQUxTRTsKKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJSZXNldCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKworCSpwcFNoYkluc3RhbmNlX3AgPSBwU2hiSW5zdGFuY2U7CisJKnBmU2hiTmV3Q3JlYXRlZF9wID0gZlNoYk5ld0NyZWF0ZWQ7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlbGVhc2UgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkNpclJlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlTaGJFcnJvciA9IFNoYklwY1JlbGVhc2VCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworI2VuZGlmIC8vICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisjaWYgKCFkZWZpbmVkKFNIQVJFREJVRkZfSU5MSU5FRCkpIHx8IGRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVzZXQgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJSZXNldEJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHVsVGltZU91dF9wLAorCQkJCQkgICAgdFNoYkNpclNpZ0huZGxyUmVzZXQKKwkJCQkJICAgIHBmblNpZ25hbEhhbmRsZXJSZXNldF9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGxvbmcgdWxOdW1PZldyaXRlSm9icyA9IDA7CS8vIGQuay4gR0NDIGNvbXBsYWlucyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG90aGVyd2lzZQorCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBzdGFydCByZXNldCBqb2IgYnkgc2V0dGluZyByZXF1ZXN0IHJlcXVlc3QgaW4gYnVmZmVyIGhlYWRlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQlpZiAoIXBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQpIHsKKwkJCXVsTnVtT2ZXcml0ZUpvYnMgPSBwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzOworCisJCQlwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkID0gVFJVRTsKKwkJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyUmVzZXQgPQorCQkJICAgIHBmblNpZ25hbEhhbmRsZXJSZXNldF9wOworCQl9IGVsc2UgeworCQkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVJlc2V0aW5nOworCQl9CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBpZiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gcnVubmluZyB3cml0ZSBvcGVyYXRpb24gdGhlbiByZXNldCBidWZmZXIKKwkvLyBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIHdhaXQgdW50aWwgdGhlIGxhc3Qgd3JpdGUgam9iIGlzIHJlYWR5IGJ5CisJLy8gc3RhcnRpbmcgYSBzaWduYWwgcHJvY2VzcworCWlmICh1bE51bU9mV3JpdGVKb2JzID09IDApIHsKKwkJLy8gdGhlcmUgaXMgY3VycmVudGx5IG5vIHJ1bm5pbmcgd3JpdGUgb3BlcmF0aW9uCisJCS8vIC0+IHJlc2V0IGJ1ZmZlciBpbW1lZGlhdGVseQorCQlTaGJDaXJTaWduYWxIYW5kbGVyUmVzZXQocFNoYkluc3RhbmNlX3AsIEZBTFNFKTsKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJfSBlbHNlIHsKKwkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGF0IGxlYXN0IG9uZSBydW5uaW5nIHdyaXRlIG9wZXJhdGlvbgorCQkvLyAtPiBzdGFydGluZyBzaWduYWwgcHJvY2VzcyB0byB3YWl0IHVudGlsIHRoZSBsYXN0IHdyaXRlIGpvYiBpcyByZWFkeQorCQlTaGJFcnJvciA9CisJCSAgICBTaGJJcGNTdGFydFNpZ25hbGluZ0pvYlJlYWR5KHBTaGJJbnN0YW5jZV9wLCB1bFRpbWVPdXRfcCwKKwkJCQkJCSBTaGJDaXJTaWduYWxIYW5kbGVyUmVzZXQpOworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV3JpdGUgZGF0YSBibG9jayB0byBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpcldyaXRlRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQmxvY2tfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdFNoYkNpckJsb2NrU2l6ZSBTaGJDaXJCbG9ja1NpemU7CisJdW5zaWduZWQgaW50IHVpRnVsbEJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBpbnQgdWlBbGlnbkZpbGxCeXRlczsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl1bnNpZ25lZCBjaGFyICpwU2NyRGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bENodW5rU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsV3JJbmRleCA9IDA7CS8vIGQuay4gR0NDIGNvbXBsYWlucyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG90aGVyd2lzZQorCXVuc2lnbmVkIGludCBmU2lnbmFsTmV3RGF0YTsKKwl1bnNpZ25lZCBpbnQgZlNpZ25hbFJlc2V0OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3IyOworCWludCBmUmVzOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocFNyY0RhdGFCbG9ja19wID09IE5VTEwpIHx8ICh1bERhdGFCbG9ja1NpemVfcCA9PSAwKSkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQmxvY2tTaXplX3AgPiBTQkNfTUFYX0JMT0NLX1NJWkUpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlwU2NyRGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcFNyY0RhdGFCbG9ja19wOworCWZTaWduYWxOZXdEYXRhID0gRkFMU0U7CisJZlNpZ25hbFJlc2V0ID0gRkFMU0U7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjYWxjdWxhdGUgZGF0YSBibG9jayBzaXplIGluIGNpcmN1bGFyIGJ1ZmZlcgorCXVsRGF0YVNpemUgPQorCSAgICAodWxEYXRhQmxvY2tTaXplX3AgKworCSAgICAgKFNCQ19CTE9DS19BTElHTk1FTlQgLSAxKSkgJiB+KFNCQ19CTE9DS19BTElHTk1FTlQgLSAxKTsKKwl1aUZ1bGxCbG9ja1NpemUgPSB1bERhdGFTaXplICsgc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOwkvLyBkYXRhIHNpemUgKyBoZWFkZXIKKwl1aUFsaWduRmlsbEJ5dGVzID0gdWxEYXRhU2l6ZSAtIHVsRGF0YUJsb2NrU2l6ZV9wOworCisJU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplID0gdWlGdWxsQmxvY2tTaXplOworCVNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXMgPSB1aUFsaWduRmlsbEJ5dGVzOworCisJLy8gcmVzZXJ2ZSB0aGUgbmVlZGVkIG1lbW9yeSBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkvLyBhbmQgbWFrZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlciBoZWFkZXIKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgc3VmZmljaWVudCBtZW1vcnkgYXZhaWxhYmxlIHRvIHN0b3JlCisJCS8vIHRoZSBuZXcgZGF0YQorCQlmUmVzID0KKwkJICAgIHVpRnVsbEJsb2NrU2l6ZSA8PQorCQkgICAgKHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLQorCQkgICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlKTsKKwkJaWYgKGZSZXMpIHsKKwkJCS8vIHNldCB3cml0ZSBwb2ludGVyIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCQkJLy8gdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9pbnRlciBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyCisJCQl1bFdySW5kZXggPSBwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXg7CisKKwkJCS8vIHJlc2VydmUgdGhlIG5lZWRlZCBtZW1vcnkgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSArPSB1aUZ1bGxCbG9ja1NpemU7CisKKwkJCS8vIHNldCBuZXcgd3JpdGUgcG9pbnRlciBiZWhpbmQgdGhlIHJlc2VydmVkIG1lbW9yeQorCQkJLy8gZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggKz0gdWlGdWxsQmxvY2tTaXplOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ICU9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCQkJLy8gaW5jcmVtZW50IG51bWJlciBvZiBjdXJyZW50bHkgKHBhcmFsbGVsIHJ1bm5pbmcpCisJCQkvLyB3cml0ZSBvcGVyYXRpb25zCisJCQlwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzKys7CisJCX0KKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCWlmICghZlJlcykgeworCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJGdWxsOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY29weSB0aGUgZGF0YSB0byB0aGUgY2lyY3VsYXIgYnVmZmVyCisJLy8gKHRoZSBjb3B5IHByb2Nlc3MgaXRzZWxmIHdpbGwgYmUgZG9uZSBvdXRzaWRlIG9mIGFueQorCS8vIGNyaXRpY2FsL2xvY2tlZCBzZWN0aW9uKQorCXBTaGJDaXJEYXRhUHRyID0gJnBTaGJDaXJCdWZmLT5tX0RhdGE7CS8vIHB0ciB0byBzdGFydCBvZiBkYXRhIGFyZWEKKworCS8vIHdyaXRlIHJlYWwgc2l6ZSBvZiBjdXJyZW50IGJsb2NrIChpbmNsLiBhbGlnbm1lbnQgZmlsbCBieXRlcykKKwkqKHRTaGJDaXJCbG9ja1NpemUgKikgKHBTaGJDaXJEYXRhUHRyICsgdWxXckluZGV4KSA9IFNoYkNpckJsb2NrU2l6ZTsKKwl1bFdySW5kZXggKz0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCXVsV3JJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJaWYgKHVsV3JJbmRleCArIHVsRGF0YUJsb2NrU2l6ZV9wIDw9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpIHsKKwkJLy8gbGluZWFyIHdyaXRlIG9wZXJhdGlvbgorCQltZW1jcHkocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgsIHBTY3JEYXRhUHRyLAorCQkgICAgICAgdWxEYXRhQmxvY2tTaXplX3ApOworCX0gZWxzZSB7CisJCS8vIHdyYXAtYXJvdW5kIHdyaXRlIG9wZXJhdGlvbgorCQl1bENodW5rU2l6ZSA9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLSB1bFdySW5kZXg7CisJCW1lbWNweShwU2hiQ2lyRGF0YVB0ciArIHVsV3JJbmRleCwgcFNjckRhdGFQdHIsIHVsQ2h1bmtTaXplKTsKKwkJbWVtY3B5KHBTaGJDaXJEYXRhUHRyLCBwU2NyRGF0YVB0ciArIHVsQ2h1bmtTaXplLAorCQkgICAgICAgdWxEYXRhQmxvY2tTaXplX3AgLSB1bENodW5rU2l6ZSk7CisJfQorCisJLy8gYWRqdXN0IGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgY2lyY3VsYXIgYnVmZmVyIHdpdGggcHJvcGVydGllcworCS8vIG9mIHRoZSB3aXJpdHRlbiBkYXRhIGJsb2NrCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQgKz0gdWlGdWxsQmxvY2tTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQrKzsKKworCQkvLyBkZWNyZW1lbnQgbnVtYmVyIG9mIGN1cnJlbnRseSAocGFyYWxsZWwgcnVubmluZykgd3JpdGUgb3BlcmF0aW9ucworCQlpZiAoIS0tcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icykgeworCQkJLy8gaWYgdGhlcmUgaXMgbm8gb3RoZXIgd3JpdGUgcHJvY2VzcyBydW5uaW5nIHRoZW4KKwkJCS8vIHNldCBuZXcgc2l6ZSBvZiByZWFkYWJsZSAoY29tcGxldGUgd3JpdHRlbikgZGF0YSBhbmQKKwkJCS8vIGFkanVzdCBudW1iZXIgb2YgcmVhZGFibGUgYmxvY2tzCisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSArPQorCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQ7CisJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlICs9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkOworCisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCA9IDA7CisKKwkJCWZTaWduYWxOZXdEYXRhID0gVFJVRTsKKwkJCWZTaWduYWxSZXNldCA9IHBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQ7CisJCX0KKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCS8vIHNpZ25hbCBuZXcgZGF0YSBldmVudCB0byBhIHBvdGVudGlhbGx5IHJlYWRpbmcgYXBwbGljYXRpb24KKwlpZiAoZlNpZ25hbE5ld0RhdGEpIHsKKwkJU2hiRXJyb3IyID0gU2hiSXBjU2lnbmFsTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJCWlmIChTaGJFcnJvciA9PSBrU2hiT2spIHsKKwkJCVNoYkVycm9yID0gU2hiRXJyb3IyOworCQl9CisJfQorCS8vIHNpZ25hbCB0aGF0IHRoZSBsYXN0IHdyaXRlIGpvYiBoYXMgYmVlbiBmaW5pc2hlZCB0byBhbGxvdworCS8vIGEgd2FpdGluZyBhcHBsaWNhdGlvbiB0byByZXNldCB0aGUgYnVmZmVyIG5vdworCWlmIChmU2lnbmFsUmVzZXQpIHsKKwkJU2hiRXJyb3IyID0gU2hiSXBjU2lnbmFsSm9iUmVhZHkocFNoYkluc3RhbmNlX3ApOworCQlpZiAoU2hiRXJyb3IgPT0ga1NoYk9rKSB7CisJCQlTaGJFcnJvciA9IFNoYkVycm9yMjsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgYmxvY2sgd2l0aGluIHRoZSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyIGZvciBjaHVuayB3cml0aW5nCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpckFsbG9jRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgIHRTaGJDaXJDaHVuayAqIHBTaGJDaXJDaHVua19wLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCdWZmZXJTaXplX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdFNoYkNpckJsb2NrU2l6ZSBTaGJDaXJCbG9ja1NpemU7CisJdW5zaWduZWQgaW50IHVpRnVsbEJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBpbnQgdWlBbGlnbkZpbGxCeXRlczsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bFdySW5kZXggPSAwOwkvLyBkLmsuIEdDQyBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBvdGhlcndpc2UKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJaW50IGZSZXM7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwU2hiQ2lyQ2h1bmtfcCA9PSBOVUxMKSkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRGF0YUJ1ZmZlclNpemVfcCA9PSAwKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQnVmZmVyU2l6ZV9wID4gU0JDX01BWF9CTE9DS19TSVpFKSB7CisJCVNoYkVycm9yID0ga1NoYkV4Y2VlZERhdGFTaXplTGltaXQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjYWxjdWxhdGUgZGF0YSBibG9jayBzaXplIGluIGNpcmN1bGFyIGJ1ZmZlcgorCXVsRGF0YVNpemUgPQorCSAgICAodWxEYXRhQnVmZmVyU2l6ZV9wICsKKwkgICAgIChTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSkpICYgfihTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSk7CisJdWlGdWxsQmxvY2tTaXplID0gdWxEYXRhU2l6ZSArIHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsJLy8gZGF0YSBzaXplICsgaGVhZGVyCisJdWlBbGlnbkZpbGxCeXRlcyA9IHVsRGF0YVNpemUgLSB1bERhdGFCdWZmZXJTaXplX3A7CisKKwlTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgPSB1aUZ1bGxCbG9ja1NpemU7CisJU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlcyA9IHVpQWxpZ25GaWxsQnl0ZXM7CisKKwkvLyByZXNlcnZlIHRoZSBuZWVkZWQgbWVtb3J5IGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCS8vIGFuZCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyIGhlYWRlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUgdG8gc3RvcmUKKwkJLy8gdGhlIG5ldyBkYXRhCisJCWZSZXMgPQorCQkgICAgKHVpRnVsbEJsb2NrU2l6ZSA8PQorCQkgICAgIChwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0KKwkJICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UpKTsKKwkJaWYgKGZSZXMpIHsKKwkJCS8vIHNldCB3cml0ZSBwb2ludGVyIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCQkJLy8gdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9pbnRlciBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyCisJCQl1bFdySW5kZXggPSBwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXg7CisKKwkJCS8vIHJlc2VydmUgdGhlIG5lZWRlZCBtZW1vcnkgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSArPSB1aUZ1bGxCbG9ja1NpemU7CisKKwkJCS8vIHNldCBuZXcgd3JpdGUgcG9pbnRlciBiZWhpbmQgdGhlIHJlc2VydmVkIG1lbW9yeQorCQkJLy8gZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggKz0gdWlGdWxsQmxvY2tTaXplOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ICU9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCQkJLy8gaW5jcmVtZW50IG51bWJlciBvZiBjdXJyZW50bHkgKHBhcmFsbGVsIHJ1bm5pbmcpCisJCQkvLyB3cml0ZSBvcGVyYXRpb25zCisJCQlwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzKys7CisJCX0KKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCWlmICghZlJlcykgeworCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJGdWxsOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gc2V0dXAgaGVhZGVyIGluZm9ybWF0aW9uIGZvciBhbGxvY2F0ZWQgYnVmZmVyCisJcFNoYkNpckRhdGFQdHIgPSAmcFNoYkNpckJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCisJLy8gd3JpdGUgcmVhbCBzaXplIG9mIGN1cnJlbnQgYmxvY2sgKGluY2wuIGFsaWdubWVudCBmaWxsIGJ5dGVzKQorCSoodFNoYkNpckJsb2NrU2l6ZSAqKSAocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgpID0gU2hiQ2lyQmxvY2tTaXplOworCXVsV3JJbmRleCArPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJdWxXckluZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwkvLyBzZXR1cCBjaHVuayBkZXNjcmlwdG9yCisJcFNoYkNpckNodW5rX3AtPm1fdWlGdWxsQmxvY2tTaXplID0gdWlGdWxsQmxvY2tTaXplOworCXBTaGJDaXJDaHVua19wLT5tX3VsQXZhaWxhYmxlU2l6ZSA9IHVsRGF0YUJ1ZmZlclNpemVfcDsKKwlwU2hiQ2lyQ2h1bmtfcC0+bV91bFdySW5kZXggPSB1bFdySW5kZXg7CisJcFNoYkNpckNodW5rX3AtPm1fZkJ1ZmZlckNvbXBsZXRlZCA9IEZBTFNFOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXcml0ZSBkYXRhIGNodW5rIGludG8gYW4gYWxsb2NhdGVkIGJ1ZmZlciBvZiB0aGUgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJXcml0ZURhdGFDaHVuayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICAgICB0U2hiQ2lyQ2h1bmsgKiBwU2hiQ2lyQ2h1bmtfcCwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQ2h1bmtfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQ2h1bmtTaXplX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJICAgICAgICpwZkJ1ZmZlckNvbXBsZXRlZF9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGNoYXIgKnBTaGJDaXJEYXRhUHRyOworCXVuc2lnbmVkIGNoYXIgKnBTY3JEYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxTdWJDaHVua1NpemU7CisJdW5zaWduZWQgbG9uZyB1bFdySW5kZXg7CisJdW5zaWduZWQgaW50IGZCdWZmZXJDb21wbGV0ZWQ7CisJdW5zaWduZWQgaW50IGZTaWduYWxOZXdEYXRhOworCXVuc2lnbmVkIGludCBmU2lnbmFsUmVzZXQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworCXRTaGJFcnJvciBTaGJFcnJvcjI7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwU2hiQ2lyQ2h1bmtfcCA9PSBOVUxMKQorCSAgICB8fCAocGZCdWZmZXJDb21wbGV0ZWRfcCA9PSBOVUxMKSkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwU3JjRGF0YUNodW5rX3AgPT0gTlVMTCkgfHwgKHVsRGF0YUNodW5rU2l6ZV9wID09IDApKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQorCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwU2hiQ2lyQ2h1bmtfcC0+bV9mQnVmZmVyQ29tcGxldGVkKSB7CisJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckFscmVhZHlDb21wbGV0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQ2h1bmtTaXplX3AgPiBwU2hiQ2lyQ2h1bmtfcC0+bV91bEF2YWlsYWJsZVNpemUpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlwU2NyRGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcFNyY0RhdGFDaHVua19wOworCWZTaWduYWxOZXdEYXRhID0gRkFMU0U7CisJZlNpZ25hbFJlc2V0ID0gRkFMU0U7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwl1bFdySW5kZXggPSBwU2hiQ2lyQ2h1bmtfcC0+bV91bFdySW5kZXg7CisKKwkvLyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKKwkvLyAodGhlIGNvcHkgcHJvY2VzcyBpdHNlbGYgd2lsbCBiZSBkb25lIG91dHNpZGUgb2YgYW55CisJLy8gY3JpdGljYWwvbG9ja2VkIHNlY3Rpb24pCisJcFNoYkNpckRhdGFQdHIgPSAmcFNoYkNpckJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCisJaWYgKHVsV3JJbmRleCArIHVsRGF0YUNodW5rU2l6ZV9wIDw9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpIHsKKwkJLy8gbGluZWFyIHdyaXRlIG9wZXJhdGlvbgorCQltZW1jcHkocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgsIHBTY3JEYXRhUHRyLAorCQkgICAgICAgdWxEYXRhQ2h1bmtTaXplX3ApOworCX0gZWxzZSB7CisJCS8vIHdyYXAtYXJvdW5kIHdyaXRlIG9wZXJhdGlvbgorCQl1bFN1YkNodW5rU2l6ZSA9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLSB1bFdySW5kZXg7CisJCW1lbWNweShwU2hiQ2lyRGF0YVB0ciArIHVsV3JJbmRleCwgcFNjckRhdGFQdHIsIHVsU3ViQ2h1bmtTaXplKTsKKwkJbWVtY3B5KHBTaGJDaXJEYXRhUHRyLCBwU2NyRGF0YVB0ciArIHVsU3ViQ2h1bmtTaXplLAorCQkgICAgICAgdWxEYXRhQ2h1bmtTaXplX3AgLSB1bFN1YkNodW5rU2l6ZSk7CisJfQorCisJLy8gYWRqdXN0IGNodW5rIGRlc2NyaXB0b3IKKwl1bFdySW5kZXggKz0gdWxEYXRhQ2h1bmtTaXplX3A7CisJdWxXckluZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwlwU2hiQ2lyQ2h1bmtfcC0+bV91bEF2YWlsYWJsZVNpemUgLT0gdWxEYXRhQ2h1bmtTaXplX3A7CisJcFNoYkNpckNodW5rX3AtPm1fdWxXckluZGV4ID0gdWxXckluZGV4OworCisJZkJ1ZmZlckNvbXBsZXRlZCA9IChwU2hiQ2lyQ2h1bmtfcC0+bV91bEF2YWlsYWJsZVNpemUgPT0gMCk7CisJcFNoYkNpckNodW5rX3AtPm1fZkJ1ZmZlckNvbXBsZXRlZCA9IGZCdWZmZXJDb21wbGV0ZWQ7CisKKwkvLyBpZiB0aGUgY29tcGxldGUgYWxsb2NhdGVkIGJ1ZmZlciBpcyBmaWxsZWQgd2l0aCBkYXRhIHRoZW4KKwkvLyBhZGp1c3QgaGVhZGVyIGluZm9ybWF0aW9uIGZvciBjaXJjdWxhciBidWZmZXIgd2l0aCBwcm9wZXJ0aWVzCisJLy8gb2YgdGhlIHdpcml0dGVuIGRhdGEgYmxvY2sKKwlpZiAoZkJ1ZmZlckNvbXBsZXRlZCkgeworCQlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCQl7CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkICs9CisJCQkgICAgcFNoYkNpckNodW5rX3AtPm1fdWlGdWxsQmxvY2tTaXplOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkKys7CisKKwkJCS8vIGRlY3JlbWVudCBudW1iZXIgb2YgY3VycmVudGx5IChwYXJhbGxlbCBydW5uaW5nKSB3cml0ZSBvcGVyYXRpb25zCisJCQlpZiAoIS0tcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icykgeworCQkJCS8vIGlmIHRoZXJlIGlzIG5vIG90aGVyIHdyaXRlIHByb2Nlc3MgcnVubmluZyB0aGVuCisJCQkJLy8gc2V0IG5ldyBzaXplIG9mIHJlYWRhYmxlIChjb21wbGV0ZSB3cml0dGVuKSBkYXRhIGFuZAorCQkJCS8vIGFkanVzdCBudW1iZXIgb2YgcmVhZGFibGUgYmxvY2tzCisJCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGUgKz0KKwkJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZDsKKwkJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlICs9CisJCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZDsKKworCQkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQgPSAwOworCQkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCA9IDA7CisKKwkJCQlmU2lnbmFsTmV3RGF0YSA9IFRSVUU7CisJCQkJZlNpZ25hbFJlc2V0ID0gcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZDsKKwkJCX0KKwkJfQorCQlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCX0KKworCS8vIHNpZ25hbCBuZXcgZGF0YSBldmVudCB0byBhIHBvdGVudGlhbGx5IHJlYWRpbmcgYXBwbGljYXRpb24KKwlpZiAoZlNpZ25hbE5ld0RhdGEpIHsKKwkJU2hiRXJyb3IyID0gU2hiSXBjU2lnbmFsTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJCWlmIChTaGJFcnJvciA9PSBrU2hiT2spIHsKKwkJCVNoYkVycm9yID0gU2hiRXJyb3IyOworCQl9CisJfQorCS8vIHNpZ25hbCB0aGF0IHRoZSBsYXN0IHdyaXRlIGpvYiBoYXMgYmVlbiBmaW5pc2hlZCB0byBhbGxvdworCS8vIGEgd2FpdGluZyBhcHBsaWNhdGlvbiB0byByZXNldCB0aGUgYnVmZmVyIG5vdworCWlmIChmU2lnbmFsUmVzZXQpIHsKKwkJU2hiRXJyb3IyID0gU2hiSXBjU2lnbmFsSm9iUmVhZHkocFNoYkluc3RhbmNlX3ApOworCQlpZiAoU2hiRXJyb3IgPT0ga1NoYk9rKSB7CisJCQlTaGJFcnJvciA9IFNoYkVycm9yMjsKKwkJfQorCX0KKworCSpwZkJ1ZmZlckNvbXBsZXRlZF9wID0gZkJ1ZmZlckNvbXBsZXRlZDsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVhZCBkYXRhIGJsb2NrIGZyb20gQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJSZWFkRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgdm9pZCAqcERzdERhdGFCbG9ja19wLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsUmRCdWZmU2l6ZV9wLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpwdWxEYXRhQmxvY2tTaXplX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdFNoYkNpckJsb2NrU2l6ZSBTaGJDaXJCbG9ja1NpemU7CisJdW5zaWduZWQgbG9uZyB1bERhdGFSZWFkYWJsZTsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl1bnNpZ25lZCBjaGFyICpwRHN0RGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemUgPSAwOwkvLyBkLmsuIEdDQyBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBvdGhlcndpc2UKKwl1bnNpZ25lZCBsb25nIHVsQ2h1bmtTaXplOworCXVuc2lnbmVkIGxvbmcgdWxSZEluZGV4OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHB1bERhdGFCbG9ja1NpemVfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlpZiAoKHBEc3REYXRhQmxvY2tfcCA9PSBOVUxMKSB8fCAodWxSZEJ1ZmZTaXplX3AgPT0gMCkpIHsKKwkJLy8gbm90aGluZyB0byBkbyBoZXJlCisJCVNoYkVycm9yID0ga1NoYk9rOworCQlnb3RvIEV4aXQ7CisJfQorCisJU2hiRXJyb3IgPSBrU2hiT2s7CisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXBEc3REYXRhUHRyID0gKHVuc2lnbmVkIGNoYXIgKilwRHN0RGF0YUJsb2NrX3A7CisJdWxEYXRhU2l6ZSA9IDA7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBnZXQgdG90YWwgbnVtYmVyIG9mIHJlYWRhYmxlIGJ5dGVzIGZvciB0aGUgd2hvbGUgY2lyY3VsYXIgYnVmZmVyCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXVsRGF0YVJlYWRhYmxlID0gcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGU7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwkvLyBpZiB0aGVyZSBhcmUgcmVhZGFibGUgZGF0YSBhdmFpbGFibGUsIHRoZW4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdAorCS8vIG9uZSBjb21wbGV0ZSByZWFkYWJsZSBkYXRhIGJsb2NrCisJaWYgKHVsRGF0YVJlYWRhYmxlID4gMCkgeworCQkvLyBnZXQgcG9pbnRlciB0byBzdGFydCBvZiBkYXRhIGFyZWEgYW5kIGN1cnJlbnQgcmVhZCBpbmRleAorCQlwU2hiQ2lyRGF0YVB0ciA9ICZwU2hiQ2lyQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisJCXVsUmRJbmRleCA9IHBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleDsKKworCQkvLyBnZXQgcmVhbCBzaXplIG9mIGN1cnJlbnQgYmxvY2sgKGluY2wuIGFsaWdubWVudCBmaWxsIGJ5dGVzKQorCQlTaGJDaXJCbG9ja1NpemUgPQorCQkgICAgKih0U2hiQ2lyQmxvY2tTaXplICopIChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCk7CisJCXVsUmRJbmRleCArPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJCXVsUmRJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJCS8vIGdldCBzaXplIG9mIHVzZXIgZGF0YSBpbnNpZGUgdGhlIGN1cnJlbnQgYmxvY2sKKwkJdWxEYXRhU2l6ZSA9CisJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgLQorCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlczsKKwkJdWxEYXRhU2l6ZSAtPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJfQorCisJLy8gdWxEYXRhU2l6ZSA9IE1JTih1bERhdGFTaXplLCB1bFJkQnVmZlNpemVfcCk7CisJaWYgKHVsRGF0YVNpemUgPiB1bFJkQnVmZlNpemVfcCkgeworCQl1bERhdGFTaXplID0gdWxSZEJ1ZmZTaXplX3A7CisJCVNoYkVycm9yID0ga1NoYkRhdGFUcnVuY2F0ZWQ7CisJfQorCisJaWYgKHVsRGF0YVNpemUgPT0gMCkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiTm9SZWFkYWJsZURhdGE7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjb3B5IHRoZSBkYXRhIGZyb20gdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCS8vICh0aGUgY29weSBwcm9jZXNzIGl0c2VsZiB3aWxsIGJlIGRvbmUgb3V0c2lkZSBvZiBhbnkKKwkvLyBjcml0aWNhbC9sb2NrZWQgc2VjdGlvbikKKwlpZiAodWxSZEluZGV4ICsgdWxEYXRhU2l6ZSA8PSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKSB7CisJCS8vIGxpbmVhciByZWFkIG9wZXJhdGlvbgorCQltZW1jcHkocERzdERhdGFQdHIsIHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4LCB1bERhdGFTaXplKTsKKwl9IGVsc2UgeworCQkvLyB3cmFwLWFyb3VuZCByZWFkIG9wZXJhdGlvbgorCQl1bENodW5rU2l6ZSA9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLSB1bFJkSW5kZXg7CisJCW1lbWNweShwRHN0RGF0YVB0ciwgcFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgsIHVsQ2h1bmtTaXplKTsKKwkJbWVtY3B5KHBEc3REYXRhUHRyICsgdWxDaHVua1NpemUsIHBTaGJDaXJEYXRhUHRyLAorCQkgICAgICAgdWxEYXRhU2l6ZSAtIHVsQ2h1bmtTaXplKTsKKwl9CisKKyNpZm5kZWYgTkRFQlVHCisJeworCQl0U2hiQ2lyQmxvY2tTaXplIENsclNoYkNpckJsb2NrU2l6ZTsKKworCQlpZiAodWxSZEluZGV4ICsgdWxEYXRhU2l6ZSA8PSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKSB7CisJCQkvLyBsaW5lYXIgYnVmZmVyCisJCQltZW1zZXQocFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgsIDB4REQsIHVsRGF0YVNpemUpOworCQl9IGVsc2UgeworCQkJLy8gd3JhcC1hcm91bmQgcmVhZCBvcGVyYXRpb24KKwkJCXVsQ2h1bmtTaXplID0KKwkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0gdWxSZEluZGV4OworCQkJbWVtc2V0KHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4LCAweERELCB1bENodW5rU2l6ZSk7CisJCQltZW1zZXQocFNoYkNpckRhdGFQdHIsIDB4REQsIHVsRGF0YVNpemUgLSB1bENodW5rU2l6ZSk7CisJCX0KKworCQlDbHJTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgPSAvKih1bnNpZ25lZCBpbnQpICovIC0xOwkvLyAtMSA9IHhGRkZGRkZGCisJCUNsclNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXMgPSAvKih1bnNpZ25lZCBpbnQpICovIC0xOwkvLyAtMSA9IEZ4eHh4eHh4CisJCSoodFNoYkNpckJsb2NrU2l6ZSAqKSAocFNoYkNpckRhdGFQdHIgKworCQkJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXgpID0KKwkJICAgIENsclNoYkNpckJsb2NrU2l6ZTsKKwl9CisjZW5kaWYgLy8gI2lmbmRlZiBOREVCVUcKKworCS8vIHNldCBuZXcgc2l6ZSBvZiByZWFkYWJsZSBkYXRhLCBkYXRhIGluIHVzZSwgbmV3IHJlYWQgaW5kZXgKKwkvLyBhbmQgYWRqdXN0IG51bWJlciBvZiByZWFkYWJsZSBibG9ja3MKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UgLT0gU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSAtPQorCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlLS07CisKKwkJLy8kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQKKwkJaWYgKChwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSA9PSAwKQorCQkgICAgJiYgKHBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlID09IDApKSB7CisJCQlBU1NFUlQocFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSA9PSAwKTsKKworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCA9IDA7CisJCX0gZWxzZQorCQkJLy8kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQKKwkJeworCQkJcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4ICs9CisJCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4ICU9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKwkJfQorCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJKnB1bERhdGFCbG9ja1NpemVfcCA9IHVsRGF0YVNpemU7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBkYXRhIHNpemUgb2YgbmV4dCByZWFkYWJsZSBibG9jayBmcm9tIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyR2V0UmVhZERhdGFTaXplKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcKKwkJCQkJCSpwdWxEYXRhQmxvY2tTaXplX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdW5zaWduZWQgbG9uZyB1bERhdGFSZWFkYWJsZTsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl0U2hiQ2lyQmxvY2tTaXplIFNoYkNpckJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocHVsRGF0YUJsb2NrU2l6ZV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwl1bERhdGFTaXplID0gMDsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGdldCB0b3RhbCBudW1iZXIgb2YgcmVhZGFibGUgYnl0ZXMgZm9yIHRoZSB3aG9sZSBjaXJjdWxhciBidWZmZXIKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJdWxEYXRhUmVhZGFibGUgPSBwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCS8vIGlmIHRoZXJlIGFyZSByZWFkYWJsZSBkYXRhIGF2YWlsYWJsZSwgdGhlbiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0CisJLy8gb25lIGNvbXBsZXRlIHJlYWRhYmxlIGRhdGEgYmxvY2sKKwlpZiAodWxEYXRhUmVhZGFibGUgPiAwKSB7CisJCXBTaGJDaXJEYXRhUHRyID0KKwkJICAgICZwU2hiQ2lyQnVmZi0+bV9EYXRhICsgcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4OworCisJCS8vIGdldCByZWFsIHNpemUgb2YgY3VycmVudCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJCVNoYkNpckJsb2NrU2l6ZSA9ICoodFNoYkNpckJsb2NrU2l6ZSAqKSBwU2hiQ2lyRGF0YVB0cjsKKworCQkvLyBnZXQgc2l6ZSBvZiB1c2VyIGRhdGEgaW5zaWRlIHRoZSBjdXJyZW50IGJsb2NrCisJCXVsRGF0YVNpemUgPQorCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplIC0KKwkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXM7CisJCXVsRGF0YVNpemUgLT0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCX0KKworICAgICAgRXhpdDoKKworCSpwdWxEYXRhQmxvY2tTaXplX3AgPSB1bERhdGFTaXplOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgbnVtYmVyIG9mIHJlYWRhYmxlIGJsb2NrcyBmcm9tIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJICB1bnNpZ25lZCBsb25nCisJCQkJCQkgICpwdWxEYXRhQmxvY2tDb3VudF9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGxvbmcgdWxCbG9ja0NvdW50OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHB1bERhdGFCbG9ja0NvdW50X3AgPT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwl1bEJsb2NrQ291bnQgPSAwOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXVsQmxvY2tDb3VudCA9IHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGU7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwkqcHVsRGF0YUJsb2NrQ291bnRfcCA9IHVsQmxvY2tDb3VudDsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2V0IGFwcGxpY2F0aW9uIGhhbmRsZXIgdG8gc2lnbmFsIG5ldyBkYXRhIGZvciBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLyAgZC5rLjogbmV3IHBhcmFtZXRlciBwcmlvcml0eSBhcyBlbnVtCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKHRTaGJJbnN0YW5jZQorCQkJCQkJCXBTaGJJbnN0YW5jZV9wLAorCQkJCQkJCXRTaGJDaXJTaWdIbmRsck5ld0RhdGEKKwkJCQkJCQlwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCQkJCXRTaGJQcmlvcml0eQorCQkJCQkJCVNoYlByaW9yaXR5X3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wICE9IE5VTEwpIHsKKwkJLy8gc2V0IGEgbmV3IHNpZ25hbCBoYW5kbGVyCisJCWlmIChwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkgeworCQkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3A7CisJCVNoYkVycm9yID0KKwkJICAgIFNoYklwY1N0YXJ0U2lnbmFsaW5nTmV3RGF0YShwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCVNoYkNpclNpZ25hbEhhbmRsZXJOZXdEYXRhLAorCQkJCQkJU2hiUHJpb3JpdHlfcCk7CisJfSBlbHNlIHsKKwkJLy8gcmVtb3ZlIGV4aXN0aW5nIHNpZ25hbCBoYW5kbGVyCisJCVNoYkVycm9yID0gU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEocFNoYkluc3RhbmNlX3ApOworCQlpZiAocFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpIHsKKwkJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YShwU2hiSW5zdGFuY2VfcCwgMCk7CisJCX0KKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gTlVMTDsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisjZW5kaWYKKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIERFQlVHOiBUcmFjZSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIE5ERUJVRwordFNoYkVycm9yIFNoYkNpclRyYWNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwljaGFyIHN6TWFnaWdJRFtzaXplb2YoU0JDX01BR0lDX0lEKSArIDFdOworCXRTaGJDaXJCbG9ja1NpemUgU2hiQ2lyQmxvY2tTaXplOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhUmVhZGFibGU7CisJdW5zaWduZWQgY2hhciAqcFNoYkNpckRhdGFQdHI7CisJdW5zaWduZWQgbG9uZyB1bEJsb2NrSW5kZXg7CisJdW5zaWduZWQgaW50IG5CbG9ja0NvdW50OworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQ2h1bmtTaXplOworCXVuc2lnbmVkIGxvbmcgdWxSZEluZGV4OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVRSQUNFMCgiXG5cbiMjIyMjIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIgIyMjIyNcbiIpOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJVFJBQ0UxKCJcbkVSUk9SOiBpbnZhbGlkIGJ1ZmZlciBhZGRyZXNzICgweCUwOGxYKVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXBTaGJJbnN0YW5jZV9wKTsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCSoodW5zaWduZWQgbG9uZyAqKSZzek1hZ2lnSURbMF0gPSBwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEOworCXN6TWFnaWdJRFtzaXplb2YoU0JDX01BR0lDX0lEKV0gPSAnXDAnOworCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCVRSQUNFMSgiXG5CdWZmZXIgQWRkcmVzczogICAweCUwOGxYXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkNpckJ1ZmYpOworCisJCVRSQUNFMCgiXG5IZWFkZXIgSW5mbzoiKTsKKwkJVFJBQ0UyKCJcbk1hZ2lnSUQ6ICAgICAgICAgICclcycgKCUwOGxYKSIsIHN6TWFnaWdJRCwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQpOworCQlUUkFDRTEoIlxuQnVmZmVyVG90YWxTaXplOiAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyVG90YWxTaXplKTsKKwkJVFJBQ0UxKCJcbkJ1ZmZlckRhdGFTaXplOiAgICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKTsKKwkJVFJBQ0UxKCJcbldySW5kZXg6ICAgICAgICAgICU0bHUiLCBwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXgpOworCQlUUkFDRTEoIlxuUmRJbmRleDogICAgICAgICAgJTRsdSIsIHBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCk7CisJCVRSQUNFMSgiXG5OdW1PZldyaXRlSm9iczogICAlNGx1IiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnMpOworCQlUUkFDRTEoIlxuRGF0YUluVXNlOiAgICAgICAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlKTsKKwkJVFJBQ0UxKCJcbkRhdGFBcGVuZGVkOiAgICAgICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkKTsKKwkJVFJBQ0UxKCJcbkJsb2Nrc0FwZW5kZWQ6ICAgICU0bHUiLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkKTsKKwkJVFJBQ0UxKCJcbkRhdGFSZWFkYWJsZTogICAgICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSk7CisJCVRSQUNFMSgiXG5CbG9ja3NSZWFkYWJsZTogICAlNGx1IiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUpOworCQlUUkFDRTEoIlxuU2lnSG5kbHJOZXdEYXRhOiAgJTA4bFgiLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhKTsKKwkJVFJBQ0UxKCJcbkJ1ZmZlckxvY2tlZDogICAgICVkIiwgcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZCk7CisJCVRSQUNFMSgiXG5TaWdIbmRsclJlc2V0OiAgICAlMDhsWCIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsclJlc2V0KTsKKworCQlTaGJUcmFjZUR1bXAoJnBTaGJDaXJCdWZmLT5tX0RhdGEsCisJCQkgICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUsIDB4MDAwMDAwMDBMLAorCQkJICAgICAiXG5EYXRhIEFyZWE6Iik7CisKKwkJdWxEYXRhUmVhZGFibGUgPSBwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZTsKKwkJbkJsb2NrQ291bnQgPSAxOworCQl1bEJsb2NrSW5kZXggPSBwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXg7CisKKwkJd2hpbGUgKHVsRGF0YVJlYWRhYmxlID4gMCkgeworCQkJVFJBQ0UxKCJcblxuLS0tIEJsb2NrICMldSAtLS0iLCBuQmxvY2tDb3VudCk7CisKKwkJCS8vIGdldCBwb2ludGVyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYSBhbmQgY3VycmVudCByZWFkIGluZGV4CisJCQlwU2hiQ2lyRGF0YVB0ciA9ICZwU2hiQ2lyQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisJCQl1bFJkSW5kZXggPSB1bEJsb2NrSW5kZXg7CisKKwkJCS8vIGdldCByZWFsIHNpemUgb2YgY3VycmVudCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJCQlTaGJDaXJCbG9ja1NpemUgPQorCQkJICAgICoodFNoYkNpckJsb2NrU2l6ZSAqKSAocFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgpOworCQkJdWxSZEluZGV4ICs9IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKwkJCXVsUmRJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJCQkvLyBnZXQgc2l6ZSBvZiB1c2VyIGRhdGEgaW5zaWRlIHRoZSBjdXJyZW50IGJsb2NrCisJCQl1bERhdGFTaXplID0KKwkJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgLQorCQkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXM7CisJCQl1bERhdGFTaXplIC09IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKworCQkJVFJBQ0UxCisJCQkgICAgKCJcbkZ1bGwgRGF0YSBTaXplOiAgICAgICAlNHUgW0J5dGVzXSAoaW5jbC4gaGVhZGVyIGFuZCBhbGlnbm1lbnQgZmlsbCBieXRlcykiLAorCQkJICAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUpOworCQkJVFJBQ0UxKCJcblVzZXIgRGF0YSBTaXplOiAgICAgICAlNGx1IFtCeXRlc10iLAorCQkJICAgICAgIHVsRGF0YVNpemUpOworCQkJVFJBQ0UxKCJcbkFsaWdubWVudCBGaWxsIEJ5dGVzOiAlNHUgW0J5dGVzXSIsCisJCQkgICAgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlcyk7CisKKwkJCWlmICh1bFJkSW5kZXggKyB1bERhdGFTaXplIDw9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSkgeworCQkJCS8vIGxpbmVhciBkYXRhIGJ1ZmZlcgorCQkJCVNoYlRyYWNlRHVtcChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCwKKwkJCQkJICAgICB1bERhdGFTaXplLCAweDAwMDAwMDAwTCwgTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCS8vIHdyYXAtYXJvdW5kIGRhdGEgYnVmZmVyCisJCQkJdWxDaHVua1NpemUgPQorCQkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0gdWxSZEluZGV4OworCQkJCVNoYlRyYWNlRHVtcChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCwKKwkJCQkJICAgICB1bENodW5rU2l6ZSwgMHgwMDAwMDAwMEwsIE5VTEwpOworCQkJCVNoYlRyYWNlRHVtcChwU2hiQ2lyRGF0YVB0ciwKKwkJCQkJICAgICB1bERhdGFTaXplIC0gdWxDaHVua1NpemUsCisJCQkJCSAgICAgdWxDaHVua1NpemUsIE5VTEwpOworCQkJfQorCisJCQluQmxvY2tDb3VudCsrOworCisJCQl1bEJsb2NrSW5kZXggKz0gU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQkJdWxCbG9ja0luZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwkJCXVsRGF0YVJlYWRhYmxlIC09IFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZTsKKwkJfQorCisJCUFTU0VSVChwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlID09IG5CbG9ja0NvdW50IC0gMSk7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgTCBpIG4gZSBhIHIgICBTIGggYSByIGUgZCAgIEIgdSBmIGYgZSByICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiTGluQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKQoreworCisJdFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZTsKKwl0U2hiTGluQnVmZiAqcFNoYkxpbkJ1ZmY7CisJdW5zaWduZWQgaW50IGZTaGJOZXdDcmVhdGVkOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXJEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyVG90YWxTaXplOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgodWxCdWZmZXJTaXplX3AgPT0gMCkgfHwgKHBwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwkvLyBjYWxjdWxhdGUgbGVuZ3RoIG9mIG1lbW9yeSB0byBhbGxvY2F0ZQorCXVsQnVmZmVyRGF0YVNpemUgPQorCSAgICAodWxCdWZmZXJTaXplX3AgKworCSAgICAgKFNCTF9CTE9DS19BTElHTk1FTlQgLSAxKSkgJiB+KFNCTF9CTE9DS19BTElHTk1FTlQgLSAxKTsKKwl1bEJ1ZmZlclRvdGFsU2l6ZSA9IHVsQnVmZmVyRGF0YVNpemUgKyBzaXplb2YodFNoYkxpbkJ1ZmYpOworCisJLy8gYWxsb2NhdGUgYSBuZXcgb3Igb3BlbiBhbiBleGlzdGluZyBzaGFyZWQgYnVmZmVyCisJU2hiRXJyb3IgPSBTaGJJcGNBbGxvY0J1ZmZlcih1bEJ1ZmZlclRvdGFsU2l6ZSwgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICZwU2hiSW5zdGFuY2UsICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBTaGJJbnN0YW5jZSA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gZ2V0IHBvaW50ZXIgdG8gc2hhcmVkIGJ1ZmZlcgorCXBTaGJMaW5CdWZmID0gKHRTaGJMaW5CdWZmICopIFNoYklwY0dldFNoTWVtUHRyKHBTaGJJbnN0YW5jZSk7CisKKwkvLyBpZiB0aGUgc2hhcmVkIGJ1ZmZlciB3YXMgbmV3IGNyZWF0ZWQsIHRoYW4gdGhpcyBwcm9jZXNzIGhhcworCS8vIHRvIGluaXRpYWxpemUgaXQsIG90aGVyd2lzZSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgaW4gdXNlCisJLy8gYW5kICptdXN0IG5vdCogYmUgcmVzZXRlZAorCWlmIChmU2hiTmV3Q3JlYXRlZCkgeworI2lmbmRlZiBOREVCVUcKKwkJeworCQkJbWVtc2V0KHBTaGJMaW5CdWZmLCAweENDLCB1bEJ1ZmZlclRvdGFsU2l6ZSk7CisJCX0KKyNlbmRpZgorCisJCXBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQgPSBTQkxfTUFHSUNfSUQ7CisJCXBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyVG90YWxTaXplID0gdWxCdWZmZXJUb3RhbFNpemU7CisJCXBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgPSB1bEJ1ZmZlckRhdGFTaXplOworCX0gZWxzZSB7CisJCWlmIChwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEICE9IFNCTF9NQUdJQ19JRCkgeworCQkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisKKwkqcHBTaGJJbnN0YW5jZV9wID0gcFNoYkluc3RhbmNlOworCSpwZlNoYk5ld0NyZWF0ZWRfcCA9IGZTaGJOZXdDcmVhdGVkOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiTGluUmVsZWFzZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCVNoYkVycm9yID0gU2hiSXBjUmVsZWFzZUJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisjZW5kaWYgLy8gIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKyNpZiAoIWRlZmluZWQoU0hBUkVEQlVGRl9JTkxJTkVEKSkgfHwgZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXcml0ZSBkYXRhIGJsb2NrIHRvIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkxpbldyaXRlRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEc3RCdWZmZXJPZmZzX3AsCisJCQkJCSAgICAgICBjb25zdCB2b2lkICpwU3JjRGF0YUJsb2NrX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJsb2NrU2l6ZV9wKQoreworCisJdFNoYkxpbkJ1ZmYgKnBTaGJMaW5CdWZmOworCXVuc2lnbmVkIGNoYXIgKnBTaGJMaW5EYXRhUHRyOworCXVuc2lnbmVkIGNoYXIgKnBTY3JEYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXJEYXRhU2l6ZTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwU3JjRGF0YUJsb2NrX3AgPT0gTlVMTCkgfHwgKHVsRGF0YUJsb2NrU2l6ZV9wID09IDApKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQorCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bERhdGFCbG9ja1NpemVfcCA+IFNCTF9NQVhfQkxPQ0tfU0laRSkgeworCQlTaGJFcnJvciA9IGtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0OworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkxpbkJ1ZmYgPSBTaGJMaW5HZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXBTY3JEYXRhUHRyID0gKHVuc2lnbmVkIGNoYXIgKilwU3JjRGF0YUJsb2NrX3A7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCAhPSBTQkxfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjaGVjayBpZiBvZmZlc2V0IGFuZCBzaXplIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIG1hdGNoZXMgd2l0aAorCS8vIHRoZSBzaXplIG9mIHRoZSBzaGFyZWQgYnVmZmVyCisJdWxCdWZmZXJEYXRhU2l6ZSA9IHBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisJaWYgKCh1bERzdEJ1ZmZlck9mZnNfcCA+IHVsQnVmZmVyRGF0YVNpemUpIHx8CisJICAgICh1bERhdGFCbG9ja1NpemVfcCA+IHVsQnVmZmVyRGF0YVNpemUpIHx8CisJICAgICgodWxEc3RCdWZmZXJPZmZzX3AgKyB1bERhdGFCbG9ja1NpemVfcCkgPiB1bEJ1ZmZlckRhdGFTaXplKSkgeworCQlTaGJFcnJvciA9IGtTaGJEYXRhT3V0c2lkZUJ1ZmZlckFyZWE7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBsaW5lYXIgYnVmZmVyCisJLy8gKHRoZSBjb3B5IHByb2Nlc3Mgd2lsbCBiZSBkb25lIGluc2lkZSBvZiBhbnkgY3JpdGljYWwvbG9ja2VkIHNlY3Rpb24pCisJcFNoYkxpbkRhdGFQdHIgPSAmcFNoYkxpbkJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCXBTaGJMaW5EYXRhUHRyICs9IHVsRHN0QnVmZmVyT2Zmc19wOworCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCW1lbWNweShwU2hiTGluRGF0YVB0ciwgcFNjckRhdGFQdHIsIHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVhZCBkYXRhIGJsb2NrIGZyb20gTGluZWFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiTGluUmVhZERhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICAgIHZvaWQgKnBEc3REYXRhQmxvY2tfcCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFNyY0J1ZmZlck9mZnNfcCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCkKK3sKKworCXRTaGJMaW5CdWZmICpwU2hiTGluQnVmZjsKKwl1bnNpZ25lZCBjaGFyICpwU2hiTGluRGF0YVB0cjsKKwl1bnNpZ25lZCBjaGFyICpwRHN0RGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyRGF0YVNpemU7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocERzdERhdGFCbG9ja19wID09IE5VTEwpIHx8ICh1bERhdGFCbG9ja1NpemVfcCA9PSAwKSkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQmxvY2tTaXplX3AgPiBTQkxfTUFYX0JMT0NLX1NJWkUpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJMaW5CdWZmID0gU2hiTGluR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlwRHN0RGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcERzdERhdGFCbG9ja19wOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQgIT0gU0JMX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2hlY2sgaWYgb2ZmZXNldCBhbmQgc2l6ZSBmb3IgdGhlIHJlYWQgb3BlcmF0aW9uIG1hdGNoZXMgd2l0aAorCS8vIHRoZSBzaXplIG9mIHRoZSBzaGFyZWQgYnVmZmVyCisJdWxCdWZmZXJEYXRhU2l6ZSA9IHBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisJaWYgKCh1bFNyY0J1ZmZlck9mZnNfcCA+IHVsQnVmZmVyRGF0YVNpemUpIHx8CisJICAgICh1bERhdGFCbG9ja1NpemVfcCA+IHVsQnVmZmVyRGF0YVNpemUpIHx8CisJICAgICgodWxTcmNCdWZmZXJPZmZzX3AgKyB1bERhdGFCbG9ja1NpemVfcCkgPiB1bEJ1ZmZlckRhdGFTaXplKSkgeworCQlTaGJFcnJvciA9IGtTaGJEYXRhT3V0c2lkZUJ1ZmZlckFyZWE7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBsaW5lYXIgYnVmZmVyCisJLy8gKHRoZSBjb3B5IHByb2Nlc3Mgd2lsbCBiZSBkb25lIGluc2lkZSBvZiBhbnkgY3JpdGljYWwvbG9ja2VkIHNlY3Rpb24pCisJcFNoYkxpbkRhdGFQdHIgPSAmcFNoYkxpbkJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCXBTaGJMaW5EYXRhUHRyICs9IHVsU3JjQnVmZmVyT2Zmc19wOworCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCW1lbWNweShwRHN0RGF0YVB0ciwgcFNoYkxpbkRhdGFQdHIsIHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgREVCVUc6IFRyYWNlIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIE5ERUJVRwordFNoYkVycm9yIFNoYkxpblRyYWNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJMaW5CdWZmICpwU2hiTGluQnVmZjsKKwljaGFyIHN6TWFnaWdJRFtzaXplb2YoU0JMX01BR0lDX0lEKSArIDFdOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVRSQUNFMCgiXG5cbiMjIyMjIExpbmVhciBTaGFyZWQgQnVmZmVyICMjIyMjXG4iKTsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVRSQUNFMSgiXG5FUlJPUjogaW52YWxpZCBidWZmZXIgYWRkcmVzcyAoMHglMDhsWClcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylwU2hiSW5zdGFuY2VfcCk7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiTGluQnVmZiA9IFNoYkxpbkdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCAhPSBTQkxfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkqKHVuc2lnbmVkIGludCAqKSZzek1hZ2lnSURbMF0gPSBwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEOworCXN6TWFnaWdJRFtzaXplb2YoU0JMX01BR0lDX0lEKV0gPSAnXDAnOworCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCVRSQUNFMSgiXG5CdWZmZXIgQWRkcmVzczogICAweCUwOGxYXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkxpbkJ1ZmYpOworCisJCVRSQUNFMCgiXG5IZWFkZXIgSW5mbzoiKTsKKwkJVFJBQ0UyKCJcbk1hZ2lnSUQ6ICAgICAgICAgICclcycgKCUwOFgpIiwgc3pNYWdpZ0lELAorCQkgICAgICAgcFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCk7CisJCVRSQUNFMSgiXG5CdWZmZXJUb3RhbFNpemU6ICAlNGx1IFtCeXRlc10iLAorCQkgICAgICAgcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJUb3RhbFNpemUpOworCQlUUkFDRTEoIlxuQnVmZmVyRGF0YVNpemU6ICAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpOworCisJCVNoYlRyYWNlRHVtcCgmcFNoYkxpbkJ1ZmYtPm1fRGF0YSwKKwkJCSAgICAgcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSwgMHgwMDAwMDAwMEwsCisJCQkgICAgICJcbkRhdGEgQXJlYToiKTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEdW1wIGJ1ZmZlciBjb250ZW50cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBOREVCVUcKK3RTaGJFcnJvciBTaGJUcmFjZUR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqcGFiU3RhcnRBZGRyX3AsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YVNpemVfcCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxBZGRyT2Zmc2V0X3AsIGNvbnN0IGNoYXIgKnBzekluZm9UZXh0X3ApCit7CisKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwYWJCdWZmRGF0YTsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZlNpemU7CisJdW5zaWduZWQgY2hhciBiRGF0YTsKKwlpbnQgblJvdzsKKwlpbnQgbkNvbDsKKworCS8vIGdldCBwb2ludGVyIHRvIGJ1ZmZlciBhbmQgbGVuZ3RoIG9mIGJ1ZmZlcgorCXBhYkJ1ZmZEYXRhID0gcGFiU3RhcnRBZGRyX3A7CisJdWxCdWZmU2l6ZSA9IHVsRGF0YVNpemVfcDsKKworCWlmIChwc3pJbmZvVGV4dF9wICE9IE5VTEwpIHsKKwkJVFJBQ0UwKHBzekluZm9UZXh0X3ApOworCX0KKwkvLyBkdW1wIGJ1ZmZlciBjb250ZW50cworCWZvciAoblJvdyA9IDA7OyBuUm93KyspIHsKKwkJVFJBQ0UxKCJcbiUwOGxYOiAgICIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoblJvdyAqIDB4MTApICsgdWxBZGRyT2Zmc2V0X3ApOworCisJCWZvciAobkNvbCA9IDA7IG5Db2wgPCAxNjsgbkNvbCsrKSB7CisJCQlpZiAoKHVuc2lnbmVkIGxvbmcpbkNvbCA8IHVsQnVmZlNpemUpIHsKKwkJCQlUUkFDRTEoIiUwMlggIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGludCkqKHBhYkJ1ZmZEYXRhICsgbkNvbCkpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRTAoIiAgICIpOworCQkJfQorCQl9CisKKwkJVFJBQ0UwKCIgIik7CisKKwkJZm9yIChuQ29sID0gMDsgbkNvbCA8IDE2OyBuQ29sKyspIHsKKwkJCWJEYXRhID0gKnBhYkJ1ZmZEYXRhKys7CisJCQlpZiAoKHVuc2lnbmVkIGxvbmcpbkNvbCA8IHVsQnVmZlNpemUpIHsKKwkJCQlpZiAoKGJEYXRhID49IDB4MjApICYmIChiRGF0YSA8IDB4N0YpKSB7CisJCQkJCVRSQUNFMSgiJWMiLCBiRGF0YSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJVFJBQ0UwKCIuIik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlUUkFDRTAoIiAiKTsKKwkJCX0KKwkJfQorCisJCWlmICh1bEJ1ZmZTaXplID4gMTYpIHsKKwkJCXVsQnVmZlNpemUgLT0gMTY7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAoa1NoYk9rKTsKKworfQorI2VuZGlmIC8vICNpZm5kZWYgTkRFQlVHCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEhhbmRsZXIgdG8gc2lnbmFsIG5ldyBkYXRhIGV2ZW50IGZvciBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgU2hiQ2lyU2lnbmFsSGFuZGxlck5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQmxvY2tDb3VudDsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBjYWxsIGFwcGxpY2F0aW9uIGhhbmRsZXIKKwlpZiAocFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpIHsKKy8qICAgICAgICBkbworICAgICAgICB7Ki8KKwkJU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkRGF0YVNpemUocFNoYkluc3RhbmNlX3AsICZ1bERhdGFTaXplKTsKKwkJaWYgKCh1bERhdGFTaXplID4gMCkgJiYgKFNoYkVycm9yID09IGtTaGJPaykpIHsKKwkJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YShwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCQkgIHVsRGF0YVNpemUpOworCQl9CisKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQocFNoYkluc3RhbmNlX3AsICZ1bEJsb2NrQ291bnQpOworLyogICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCh1bEJsb2NrQ291bnQgPiAwKSAmJiAoU2hiRXJyb3IgPT0ga1NoYk9rKSk7Ki8KKwl9CisJLy8gUmV0dXJuIFRSVUUgaWYgdGhlcmUgYXJlIHBlbmRpbmcgYmxvY2tzLgorCS8vIEluIHRoYXQgY2FzZSBTaGJJcGMgdHJpZXMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluIGltbWVkaWF0ZWx5IGlmIHRoZXJlCisJLy8gaXMgbm8gb3RoZXIgZmlsbGVkIHNoYXJlZCBidWZmZXIgd2l0aCBoaWdoZXIgcHJpb3JpdHkuCisJcmV0dXJuICgodWxCbG9ja0NvdW50ID4gMCkgJiYgKFNoYkVycm9yID09IGtTaGJPaykpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgSGFuZGxlciB0byByZXNldCBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFNoYkNpclNpZ25hbEhhbmRsZXJSZXNldCh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZlRpbWVPdXRfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCXJldHVybjsKKwl9CisKKwkvLyByZXNldCBidWZmZXIgaGVhZGVyCisJaWYgKCFmVGltZU91dF9wKSB7CisJCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJCXsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXggPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icyA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlID0gMDsKKwkJfQorCQlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisjaWZuZGVmIE5ERUJVRworCQl7CisJCQltZW1zZXQoJnBTaGJDaXJCdWZmLT5tX0RhdGEsIDB4Q0MsCisJCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSk7CisJCX0KKyNlbmRpZgorCX0KKworCS8vIGNhbGwgYXBwbGljYXRpb24gaGFuZGxlcgorCWlmIChwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsclJlc2V0ICE9IE5VTEwpIHsKKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJSZXNldChwU2hiSW5zdGFuY2VfcCwgZlRpbWVPdXRfcCk7CisJfQorCisJLy8gdW5sb2NrIGJ1ZmZlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQlwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkID0gRkFMU0U7CisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyUmVzZXQgPSBOVUxMOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJcmV0dXJuOworCit9CisKKyNlbmRpZgorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGFyZWRCdWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjMWI0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5oCkBAIC0wLDAgKzEsMjA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgUHJvamVjdCBpbmRlcGVuZGVuZCBzaGFyZWQgYnVmZmVyIChsaW5lYXIgKyBjaXJjdWxhcikKKworICBEZXNjcmlwdGlvbjogIERlY2xhcmF0aW9uIG9mIHBsYXRmb3JtIGluZGVwZW5kZW5kIHBhcnQgZm9yIHRoZQorICAgICAgICAgICAgICAgIHNoYXJlZCBidWZmZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAyMDA2LzA2LzI3IC1yczogICBWIDEuMDAgKGluaXRpYWwgdmVyc2lvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0hBUkVEQlVGRl9IXworI2RlZmluZSBfU0hBUkVEQlVGRl9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFR5cGUgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJa1NoYk9rID0gMCwKKwlrU2hiTm9SZWFkYWJsZURhdGEgPSAxLAorCWtTaGJEYXRhVHJ1bmNhdGVkID0gMiwKKwlrU2hiQnVmZmVyRnVsbCA9IDMsCisJa1NoYkRhdGFPdXRzaWRlQnVmZmVyQXJlYSA9IDQsCisJa1NoYkJ1ZmZlckFscmVhZHlDb21wbGV0ZWQgPSA1LAorCWtTaGJNZW1Vc2VkQnlPdGhlclByb2NzID0gNiwKKwlrU2hiT3Blbk1pc21hdGNoID0gNywKKwlrU2hiSW52YWxpZEJ1ZmZlclR5cGUgPSA4LAorCWtTaGJJbnZhbGlkQXJnID0gOSwKKwlrU2hiQnVmZmVySW52YWxpZCA9IDEwLAorCWtTaGJPdXRPZk1lbSA9IDExLAorCWtTaGJBbHJlYWR5UmVzZXRpbmcgPSAxMiwKKwlrU2hiQWxyZWFkeVNpZ25hbGluZyA9IDEzLAorCWtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0ID0gMTQsCisKK30gdFNoYkVycm9yOworCisvLyAyMDA2LzA4LzI0IGQuay46IFByaW9yaXR5IGZvciB0aHJlYWRzIChuZXcgZGF0YSwgam9iIHNpZ25hbGluZykKK3R5cGVkZWYgZW51bSB7CisJa1NoYlByaW9yaXR5TG93ID0gMCwKKwlrU2hiUHJpb3JpdHlOb3JtYWwgPSAxLAorCWtzaGJQcmlvcml0eUhpZ2ggPSAyCit9IHRTaGJQcmlvcml0eTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpRnVsbEJsb2NrU2l6ZTsJLy8gcmVhbCBzaXplIG9mIGFsbG9jYXRlZCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJdW5zaWduZWQgbG9uZyBtX3VsQXZhaWxhYmxlU2l6ZTsJLy8gc3RpbGwgYXZhaWxhYmxlIHNpemUgZm9yIGRhdGEKKwl1bnNpZ25lZCBsb25nIG1fdWxXckluZGV4OwkvLyBjdXJyZW50IHdyaXRlIGluZGV4CisJdW5zaWduZWQgaW50IG1fZkJ1ZmZlckNvbXBsZXRlZDsJLy8gVFJVRSBpZiBhbGxvY2F0ZWQgYmxvY2sgaXMgY29tcGxldGUgZmlsbGVkIHdpdGggZGF0YQorCit9IHRTaGJDaXJDaHVuazsKKwordHlwZWRlZiB2b2lkICp0U2hiSW5zdGFuY2U7CisKK3R5cGVkZWYgdm9pZCAoKnRTaGJDaXJTaWdIbmRsck5ld0RhdGEpICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCXVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApOwordHlwZWRlZiB2b2lkICgqdFNoYkNpclNpZ0huZGxyUmVzZXQpICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZUaW1lT3V0X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyojaWYgZGVmaW5lZChJTkxJTkVfRlVOQ1RJT05fREVGKQorICAgICN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisgICAgI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYKKyAgICAjZGVmaW5lIElOTElORV9FTkFCTEVEICAgICAgVFJVRQorICAgICNkZWZpbmUgU0hBUkVEQlVGRl9JTkxJTkVECisgICAgI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuYyIKKyNlbmRpZgorKi8KKworCXRTaGJFcnJvciBTaGJJbml0KHZvaWQpOworCXRTaGJFcnJvciBTaGJFeGl0KHZvaWQpOworCisvLyBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisJdFNoYkVycm9yIFNoYkNpckFsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCk7CisJdFNoYkVycm9yIFNoYkNpclJlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisJdFNoYkVycm9yIFNoYkNpclJlc2V0QnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVPdXRfcCwKKwkJCQkgICAgdFNoYkNpclNpZ0huZGxyUmVzZXQKKwkJCQkgICAgcGZuU2lnbmFsSGFuZGxlclJlc2V0X3ApOworCXRTaGJFcnJvciBTaGJDaXJXcml0ZURhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQmxvY2tfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCk7CisJdFNoYkVycm9yIFNoYkNpckFsbG9jRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdFNoYkNpckNodW5rICogcFNoYkNpckNodW5rX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQnVmZmVyU2l6ZV9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgICB0U2hiQ2lyQ2h1bmsgKiBwU2hiQ2lyQ2h1bmtfcCwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqcFNyY0RhdGFDaHVua19wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUNodW5rU2l6ZV9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnBmQnVmZmVyQ29tcGxldGVkX3ApOworCXRTaGJFcnJvciBTaGJDaXJSZWFkRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICB2b2lkICpwRHN0RGF0YUJsb2NrX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFJkQnVmZlNpemVfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpwdWxEYXRhQmxvY2tTaXplX3ApOworCXRTaGJFcnJvciBTaGJDaXJHZXRSZWFkRGF0YVNpemUodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQl1bnNpZ25lZCBsb25nICpwdWxEYXRhQmxvY2tTaXplX3ApOworCXRTaGJFcnJvciBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudCh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgdW5zaWduZWQgbG9uZyAqcHVsRGF0YUJsb2NrQ291bnRfcCk7CisJdFNoYkVycm9yIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCXRTaGJDaXJTaWdIbmRsck5ld0RhdGEKKwkJCQkJCXBmblNoYlNpZ25hbEhhbmRsZXJOZXdEYXRhX3AsCisJCQkJCQl0U2hiUHJpb3JpdHkgU2hiUHJpb3JpdHlfcCk7CisKKyNlbmRpZgorCisvLyBMaW5lYXIgU2hhcmVkIEJ1ZmZlcgorCXRTaGJFcnJvciBTaGJMaW5BbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApOworCXRTaGJFcnJvciBTaGJMaW5SZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisKKyNpZiAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworCXRTaGJFcnJvciBTaGJMaW5Xcml0ZURhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEc3RCdWZmZXJPZmZzX3AsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQmxvY2tfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCk7CisJdFNoYkVycm9yIFNoYkxpblJlYWREYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgIHZvaWQgKnBEc3REYXRhQmxvY2tfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsU3JjQnVmZmVyT2Zmc19wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApOworCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKwl0U2hiRXJyb3IgU2hiQ2lyVHJhY2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwl0U2hiRXJyb3IgU2hiTGluVHJhY2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwl0U2hiRXJyb3IgU2hiVHJhY2VEdW1wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhYlN0YXJ0QWRkcl9wLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxBZGRyT2Zmc2V0X3AsCisJCQkgICAgICAgY29uc3QgY2hhciAqcHN6SW5mb1RleHRfcCk7CisjZWxzZQorI2RlZmluZSBTaGJDaXJUcmFjZUJ1ZmZlcihwMCkKKyNkZWZpbmUgU2hiTGluVHJhY2VCdWZmZXIocDApCisjZGVmaW5lIFNoYlRyYWNlRHVtcChwMCwgcDEsIHAyLCBwMykKKyNlbmRpZgorCisjdW5kZWYgIElOTElORV9FTkFCTEVECQkvLyBkaXNhYmxlIGFjdHVhbCBpbmxpbmluZyBvZiBmdW5jdGlvbnMKKyN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisjZGVmaW5lIElOTElORV9GVU5DVElPTgkJLy8gZGVmaW5lIElOTElORV9GVU5DVElPTiB0byBub3RoaW5nCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYJCQkJLy8gI2lmbmRlZiBfU0hBUkVEQlVGRl9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJJcGMtTGludXhLZXJuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLUxpbnV4S2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzY2IzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLUxpbnV4S2VybmVsLmMKQEAgLTAsMCArMSw5NjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorICAgICAgICAgICAgICAgIChJbXBsZW1lbnRhdGlvbiBmb3IgTGludXggS2VybmVsU3BhY2UpCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgMjAwNi8wNi8yOCAtcnM6ICAgViAxLjAwIChpbml0aWFsIHZlcnNpb24pCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjaW5jbHVkZSAiU2hiSXBjLmgiCisjaW5jbHVkZSAiU2hiTGludXhLZXJuZWwuaCIKKyNpbmNsdWRlICJEZWJ1Zy5oIgorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorLy8jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoIWRlZmluZWQoU0hCSVBDX0lOTElORUQpKSB8fCBkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25maWd1cmF0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbnN0YW50IGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1BWF9MRU5fQlVGRkVSX0lEICAgICAgIDI1NgorCisjZGVmaW5lIFRJTUVPVVRfRU5URVJfQVRPTUlDICAgIDEwMDAJLy8gKG1zKSBmb3IgZGViZ2dpbmc6IElORklOSVRFCisjZGVmaW5lIFRJTUVPVVRfVEVSTV9USFJFQUQgICAgIDEwMDAKKyNkZWZpbmUgSU5GSU5JVEUgICAgICAgICAgICAgICAgMzYwMAorCisjZGVmaW5lIFNCSV9NQUdJQ19JRCAgICAgICAgICAgIDB4NTM0MjQ5MkIJLy8gbWFnaWMgSUQgKCJTQkkrIikKKyNkZWZpbmUgU0JIX01BR0lDX0lEICAgICAgICAgICAgMHg1MzQyNDgyQQkvLyBtYWdpYyBJRCAoIlNCSCoiKQorCisjZGVmaW5lIElOVkFMSURfSUQgICAgICAgICAgICAgIC0xCisKKyNkZWZpbmUgVEFCTEVfU0laRSAgICAgICAgICAgICAgMTAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGNvbW1vbiBoZWFkZXIgZm9yIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbiB1c2VkCisvLyBieSBhbGwgcHJvY2Vzc2VzIGF0dGFjaGVkIHRoaXMgc2hhcmVkIG1lbW9yeS4gSXQgaW5jbHVkZXMgY29tbW9uCisvLyBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQgYnVmZmVyIGZyb20gYSBjb3VwbGUgb2YKKy8vIHNlcGFyYXRlZCBwcm9jZXNzZXMgKGUuZy4gdGhlIHJlZmVybmNlIGNvdW50ZXIpLiBUaGlzIHN0cnVjdHVyZSBpcworLy8gbG9jYXRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uIGl0c2VsZiBhbmQgZXhpc3RzCisvLyBjb25zZXF1ZW50bHkgb25seSBvbmUgdGltZXMgcGVyIHNoYXJlZCBtZW1vcnkgaW5zdGFuY2UuCit0eXBlZGVmIHN0cnVjdCB7CisKKwl1bnNpZ25lZCBsb25nIG1fdWxTaE1lbVNpemU7CisJdW5zaWduZWQgbG9uZyBtX3VsUmVmQ291bnQ7CisJaW50IG1faUJ1ZmZlcklkOworLy8gICAgaW50ICAgICAgICAgICAgICAgICBtX2lVc2VyU3BhY2VNZW07ICAgICAgICAgICAvLzAgZm9yIHVzZXJzcGFjZSBtZW0gICAhPTAga2VybmVsc3BhY2UgbWVtCisJc3BpbmxvY2tfdCBtX1NwaW5sb2NrQnVmZkFjY2VzczsKKwlCT09MIG1fZk5ld0RhdGE7CisJQk9PTCBtX2ZKb2JSZWFkeTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBtX1dhaXRRdWV1ZU5ld0RhdGE7CisJd2FpdF9xdWV1ZV9oZWFkX3QgbV9XYWl0UXVldWVKb2JSZWFkeTsKKworI2lmbmRlZiBOREVCVUcKKwl1bnNpZ25lZCBsb25nIG1fdWxPd25lclByb2NJRDsKKyNlbmRpZgorCit9IHRTaGJNZW1IZWFkZXI7CisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIHRoZSAiZXh0ZXJuYWwgZW50cnkgcG9pbnQiIGZyb20gYSBzZXBhcmF0ZSBwcm9jZXNzCisvLyB0byBnZXQgYWNjZXNzIHRvIGEgc2hhcmVkIGJ1ZmZlci4gVGhpcyBzdHJ1Y3R1cmUgaW5jbHVkZXMgYWxsIHBsYXRmb3JtCisvLyByZXNwLiB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gYWRtaW5pc3RyYXRlL21hbmFnZSB0aGUgc2hhcmVkCisvLyBidWZmZXIgZnJvbSBhIHNlcGFyYXRlIHByb2Nlc3MuIEV2ZXJ5IHByb2Nlc3MgYXR0YWNoZWQgdG8gdGhlIHNoYXJlZAorLy8gYnVmZmVyIGhhcyBpdHMgb3duIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBpdHMgaW5kaXZpZHVhbAorLy8gcnVudGltZSBkYXRhIChlLmcuIHRoZSBzY29wZSBvZiBhbiBldmVudCBoYW5kbGUgaXMgbGltaXR0ZWQgdG8gdGhlCisvLyBvd25lciBwcm9jZXNzIG9ubHkpLiBUaGUgc3RydWN0dXJlIG1lbWJlciA8bV9wU2hiTWVtSGVhZGVyPiBwb2ludHMKKy8vIHRvIHRoZSAocHJvY2VzcyBzcGVjaWZpYykgc3RhcnQgYWRkcmVzcyBvZiB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24KKy8vIGl0c2VsZi4KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1fU2JpTWFnaWNJRDsJLy8gbWFnaWMgSUQgKCJTQkkrIikKKy8vICAgIHZvaWQqICAgICAgICAgICAgICAgbV9wU2hhcmVkTWVtOworCWludCBtX3RUaHJlYWROZXdEYXRhSWQ7CisJbG9uZyBtX2xUaHJlYWROZXdEYXRhTmljZTsJLy8gbmljZSB2YWx1ZSBvZiB0aGUgbmV3IGRhdGEgdGhyZWFkCisJaW50IG1fdFRocmVhZEpvYlJlYWR5SWQ7CisJdW5zaWduZWQgbG9uZyBtX3VsRmxhZ3NCdWZmQWNjZXNzOwkvLyBkLmsuIG1vdmVkIGZyb20gdFNoYk1lbUhlYWRlciwgYmVjYXVzZSBlYWNoCisJLy8gcHJvY2VzcyBuZWVkcyB0byBzdG9yZSB0aGUgaW50ZXJydXB0IGZsYWdzIHNlcGFyYXRlbHkKKwl0U2lnSG5kbHJOZXdEYXRhIG1fcGZuU2lnSG5kbHJOZXdEYXRhOworCXVuc2lnbmVkIGxvbmcgbV91bFRpbWVPdXRKb2JSZWFkeTsKKwl0U2lnSG5kbHJKb2JSZWFkeSBtX3BmblNpZ0huZGxySm9iUmVhZHk7CisJdFNoYk1lbUhlYWRlciAqbV9wU2hiTWVtSGVhZGVyOworCWludCBtX2lUaHJlYWRUZXJtRmxhZzsKKwlzdHJ1Y3QgY29tcGxldGlvbiBtX0NvbXBsZXRpb25OZXdEYXRhOworLyoKKyAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICptX3BTZW1CdWZmQWNjZXNzOworICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgKm1fcFNlbU5ld0RhdGE7CisgICAgc3RydWN0IHNlbWFwaG9yZSAgICAqbV9wU2VtU3RvcFNpZ25hbGluZ05ld0RhdGE7CisgICAgc3RydWN0IHNlbWFwaG9yZSAgICAqbV9wU2VtSm9iUmVhZHk7CisqLworI2lmbmRlZiBOREVCVUcKKwl1bnNpZ25lZCBsb25nIG1fdWxUaHJlYWRJRE5ld0RhdGE7CisJdW5zaWduZWQgbG9uZyBtX3VsVGhyZWFkSURKb2JSZWFkeTsKKyNlbmRpZgorfSB0U2hiTWVtSW5zdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzIG9mIGludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy90U2hiTWVtSW5zdCogICAgICAgICAgICBTaGJJcGNHZXRTaGJNZW1JbnN0ICAgICAgICAgKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisvL3RTaGJNZW1IZWFkZXIqICAgICAgICAgIFNoYklwY0dldFNoYk1lbUhlYWRlciAgICAgICAodFNoYk1lbUluc3QqIHBTaGJNZW1JbnN0X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHByb2Nlc3MgbG9jYWwgaW5mb3JtYXRpb24gc3RydWN0dXJlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW5saW5lIHRTaGJNZW1JbnN0ICpTaGJJcGNHZXRTaGJNZW1JbnN0KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKworCXBTaGJNZW1JbnN0ID0gKHRTaGJNZW1JbnN0ICopIHBTaGJJbnN0YW5jZV9wOworCisJcmV0dXJuIChwU2hiTWVtSW5zdCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5IGhlYWRlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGlubGluZSB0U2hiTWVtSGVhZGVyICpTaGJJcGNHZXRTaGJNZW1IZWFkZXIodFNoYk1lbUluc3QgKiBwU2hiTWVtSW5zdF9wKQoreworCisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKworCXBTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSW5zdF9wLT5tX3BTaGJNZW1IZWFkZXI7CisKKwlyZXR1cm4gKHBTaGJNZW1IZWFkZXIpOworCit9CisKKy8vICBHZXQgcG9pbnRlciB0byBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorLy8jZGVmaW5lIFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApICgodFNoYk1lbUluc3QqKXBTaGJJbnN0YW5jZV9wKQorCisvLyAgR2V0IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSBoZWFkZXIKKy8vI2RlZmluZSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3RfcCkgKHBTaGJNZW1JbnN0X3AtPm1fcFNoYk1lbUhlYWRlcikKKworLy8gbm90IGlubGluZWQgaW50ZXJuYWwgZnVuY3Rpb25zCitpbnQgU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSh2b2lkICpwdlRocmVhZFBhcmFtX3ApOworaW50IFNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KHZvaWQgKnB2VGhyZWFkUGFyYW1fcCk7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKK3N0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKworc3RhdGljIHZvaWQgKlNoYklwY0FsbG9jUHJpdmF0ZU1lbSh1bnNpZ25lZCBsb25nIHVsTWVtU2l6ZV9wKTsKK3N0YXRpYyBpbnQgU2hiSXBjRmluZExpc3RFbGVtZW50KGludCBpQnVmZmVySWQsCisJCQkJIHN0cnVjdCBzU2hiTWVtVGFibGUKKwkJCQkgKipwcHNSZXR1cm5NZW1UYWJsZUVsZW1lbnQpOworc3RhdGljIHZvaWQgU2hiSXBjQXBwZW5kTGlzdEVsZW1lbnQoc3RydWN0IHNTaGJNZW1UYWJsZSAqc05ld01lbVRhYmxlRWxlbWVudCk7CitzdGF0aWMgdm9pZCBTaGJJcGNEZWxldGVMaXN0RWxlbWVudChpbnQgaUJ1ZmZlcklkKTsKK3N0YXRpYyB2b2lkIFNoYklwY0NyYzMyR2VuVGFibGUodW5zaWduZWQgbG9uZyBhdWxDcmNUYWJsZVsyNTZdKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFNoYklwY0NyYzMyR2V0Q3JjKGNvbnN0IGNoYXIgKnBjU3RyaW5nLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGF1bENyY1RhYmxlWzI1Nl0pOworCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisvLyBub3QgaW5saW5lZCBleHRlcm5hbCBmdW5jdGlvbnMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbml0aWFsaXplIElQQyBmb3IgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNJbml0KHZvaWQpCit7CisJcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nID0gTlVMTDsKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEZWluaXRpYWxpemUgSVBDIGZvciBTaGFyZWQgQnVmZmVyIE1vZHVsZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY0V4aXQodm9pZCkKK3sKKworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNBbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkgICAgdFNoYkluc3RhbmNlICogcHBTaGJJbnN0YW5jZV9wLAorCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApCit7CisJdFNoYkVycm9yIFNoYkVycm9yOworCWludCBpQnVmZmVySWQgPSAwOworCXVuc2lnbmVkIGxvbmcgdWxDcmMzMiA9IDA7CisJdW5zaWduZWQgaW50IHVpRmlyc3RQcm9jZXNzID0gMDsKKwl1bnNpZ25lZCBsb25nIHVsU2hNZW1TaXplOworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0ID0gTlVMTDsKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXVuc2lnbmVkIGludCBmU2hNZW1OZXdDcmVhdGVkID0gRkFMU0U7CisJdm9pZCAqcFNoYXJlZE1lbSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBhdWxDcmNUYWJsZVsyNTZdOworCXN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50OworCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NCdWZmZXIgXG4iKTsKKwl1bFNoTWVtU2l6ZSA9IHVsQnVmZmVyU2l6ZV9wICsgc2l6ZW9mKHRTaGJNZW1IZWFkZXIpOworCisJLy9jcmVhdGUgQnVmZmVyIElECisJU2hiSXBjQ3JjMzJHZW5UYWJsZShhdWxDcmNUYWJsZSk7CisJdWxDcmMzMiA9IFNoYklwY0NyYzMyR2V0Q3JjKHBzekJ1ZmZlcklEX3AsIGF1bENyY1RhYmxlKTsKKwlpQnVmZmVySWQgPSB1bENyYzMyOworCURFQlVHX0xWTF8yOV9UUkFDRTIKKwkgICAgKCJTaGJJcGNBbGxvY0J1ZmZlciBCdWZmZXJTaXplOiVkIHNpemVvZih0U2hiLi4pOiVkXG4iLAorCSAgICAgdWxCdWZmZXJTaXplX3AsIHNpemVvZih0U2hiTWVtSGVhZGVyKSk7CisJREVCVUdfTFZMXzI5X1RSQUNFMigiU2hiSXBjQWxsb2NCdWZmZXIgQnVmZmVySWQ6JWQgTWVtU2l6ZTolZFxuIiwKKwkJCSAgICBpQnVmZmVySWQsIHVsU2hNZW1TaXplKTsKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICgxKSBvcGVuIGFuIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBzaGFyZWQgbWVtb3J5CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL3Rlc3QgaWYgYnVmZmVyIGFscmVhZHkgZXhpc3RzCisJaWYgKFNoYklwY0ZpbmRMaXN0RWxlbWVudChpQnVmZmVySWQsICZwc01lbVRhYmxlRWxlbWVudCkgPT0gMCkgeworCQkvL0J1ZmZlciBhbHJlYWR5IGV4aXN0cworCQlmU2hNZW1OZXdDcmVhdGVkID0gRkFMU0U7CisJCXBTaGFyZWRNZW0gPSBwc01lbVRhYmxlRWxlbWVudC0+bV9wQnVmZmVyOworCQlERUJVR19MVkxfMjlfVFJBQ0UxCisJCSAgICAoIlNoYklwY0FsbG9jQnVmZmVyIGF0dGFjaCBCdWZmZXIgYXQ6JXAgSWQ6JWRcbiIsCisJCSAgICAgcFNoYXJlZE1lbSk7CisJCXVpRmlyc3RQcm9jZXNzID0gMTsKKwl9IGVsc2UgeworCQkvL2NyZWF0ZSBuZXcgQnVmZmVyCisJCWZTaE1lbU5ld0NyZWF0ZWQgPSBUUlVFOworCQl1aUZpcnN0UHJvY2VzcyA9IDA7CisJCXBTaGFyZWRNZW0gPSBrbWFsbG9jKHVsU2hNZW1TaXplLCBHRlBfS0VSTkVMKTsKKwkJREVCVUdfTFZMXzI5X1RSQUNFMgorCQkgICAgKCJTaGJJcGNBbGxvY0J1ZmZlciBDcmVhdGUgTmV3IEJ1ZmZlciBhdDolcCBJZDolZFxuIiwKKwkJICAgICBwU2hhcmVkTWVtLCBpQnVmZmVySWQpOworCQlpZiAocFNoYXJlZE1lbSA9PSBOVUxMKSB7CisJCQkvL3VuYWJsZSB0byBjcmVhdGUgbWVtCisJCQlTaGJFcnJvciA9IGtTaGJPdXRPZk1lbTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNBbGxvY0J1ZmZlciBjcmVhdGUgc2VtYXNcbiIpOworCQkvLyBhcHBlbmQgRWxlbWVudCB0byBNZW0gVGFibGUKKwkJcHNNZW1UYWJsZUVsZW1lbnQgPQorCQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IHNTaGJNZW1UYWJsZSksIEdGUF9LRVJORUwpOworCQlwc01lbVRhYmxlRWxlbWVudC0+bV9pQnVmZmVySWQgPSBpQnVmZmVySWQ7CisJCXBzTWVtVGFibGVFbGVtZW50LT5tX3BCdWZmZXIgPSBwU2hhcmVkTWVtOworCQlwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQgPSBOVUxMOworCQlTaGJJcGNBcHBlbmRMaXN0RWxlbWVudChwc01lbVRhYmxlRWxlbWVudCk7CisJfQorCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NCdWZmZXIgdXBkYXRlIGhlYWRlclxuIik7CisJLy91cGRhdGUgaGVhZGVyCisJcFNoYk1lbUhlYWRlciA9ICh0U2hiTWVtSGVhZGVyICopIHBTaGFyZWRNZW07CisJREVCVUdfTFZMXzI5X1RSQUNFMQorCSAgICAoIlNoYklwY0FsbG9jQnVmZmVyIDAgcFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZTogJWRcbiIsCisJICAgICBwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplKTsKKwkvLyBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIHByb2Nlc3Mgc3BlY2lmaWMgbWVtcG9vbCB0byBzYXZlCisJLy8gcHJvY2VzcyBsb2NhbCBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQgYnVmZmVyCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NCdWZmZXIgYWxsb2MgcHJpdmF0ZSBtZW1cbiIpOworCXBTaGJNZW1JbnN0ID0KKwkgICAgKHRTaGJNZW1JbnN0ICopIFNoYklwY0FsbG9jUHJpdmF0ZU1lbShzaXplb2YodFNoYk1lbUluc3QpKTsKKwlpZiAocFNoYk1lbUluc3QgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJPdXRPZk1lbTsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZXNldCBjb21wbGV0ZSBoZWFkZXIgdG8gZGVmYXVsdCB2YWx1ZXMKKwkvL3BTaGJNZW1JbnN0LT5tX1NiaU1hZ2ljSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU0JJX01BR0lDX0lEOworLy8gICAgcFNoYk1lbUluc3QtPm1fcFNoYXJlZE1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBTaGFyZWRNZW07CisJcFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCA9IElOVkFMSURfSUQ7CisJcFNoYk1lbUluc3QtPm1fdFRocmVhZEpvYlJlYWR5SWQgPSBJTlZBTElEX0lEOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisJcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHkgPSAwOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBOVUxMOworCXBTaGJNZW1JbnN0LT5tX3BTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSGVhZGVyOworCXBTaGJNZW1JbnN0LT5tX2lUaHJlYWRUZXJtRmxhZyA9IDA7CisKKwkvLyBpbml0aWFsaXplIGNvbXBsZXRpb24gZXRjLgorCWluaXRfY29tcGxldGlvbigmcFNoYk1lbUluc3QtPm1fQ29tcGxldGlvbk5ld0RhdGEpOworCisJU2hiRXJyb3IgPSBrU2hiT2s7CisJaWYgKGZTaE1lbU5ld0NyZWF0ZWQpIHsKKwkJLy8gdGhpcyBwcm9jZXNzIHdhcyB0aGUgZmlyc3Qgd2hvIHdhbnRlZCB0byB1c2UgdGhlIHNoYXJlZCBtZW1vcnksCisJCS8vIHNvIGEgbmV3IHNoYXJlZCBtZW1vcnkgd2FzIGNyZWF0ZWQKKwkJLy8gLT4gc2V0dXAgbmV3IGhlYWRlciBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uCisJCS8vICAgIGl0c2VsZgorCQlwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplID0gdWxTaE1lbVNpemU7CisJCXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCA9IDE7CisJCXBTaGJNZW1IZWFkZXItPm1faUJ1ZmZlcklkID0gaUJ1ZmZlcklkOworCQkvLyBpbml0aWFsaXplIHNwaW5sb2NrCisJCXNwaW5fbG9ja19pbml0KCZwU2hiTWVtSGVhZGVyLT5tX1NwaW5sb2NrQnVmZkFjY2Vzcyk7CisJCS8vIGluaXRpYWxpemUgd2FpdCBxdWV1ZXMKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVOZXdEYXRhKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVKb2JSZWFkeSk7CisJfSBlbHNlIHsKKwkJLy8gYW55IG90aGVyIHByb2Nlc3MgaGFzIGNyZWF0ZWQgdGhlIHNoYXJlZCBtZW1vcnkgYW5kIHRoaXMKKwkJLy8gcHJvY2VzcyBvbmx5IGhhcyB0byBhdHRhY2ggdG8gaXQKKwkJLy8gLT4gY2hlY2sgYW5kIHVwZGF0ZSBleGlzdGluZyBoZWFkZXIgaW5mb3JtYXRpb24gaW5zaWRlIHRoZQorCQkvLyAgICBzaGFyZWQgbWVtb3J5IHJlZ2lvbiBpdHNlbGYKKwkJaWYgKHBTaGJNZW1IZWFkZXItPm1fdWxTaE1lbVNpemUgIT0gdWxTaE1lbVNpemUpIHsKKwkJCVNoYkVycm9yID0ga1NoYk9wZW5NaXNtYXRjaDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlwU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQrKzsKKwl9CisKKyAgICAgIEV4aXQ6CisJcFNoYkluc3RhbmNlID0gKHRTaGJJbnN0YW5jZSAqKSBwU2hiTWVtSW5zdDsKKwkqcGZTaGJOZXdDcmVhdGVkX3AgPSBmU2hNZW1OZXdDcmVhdGVkOworCSpwcFNoYkluc3RhbmNlX3AgPSBwU2hiSW5zdGFuY2U7CisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNSZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdFNoYkVycm9yIFNoYkVycm9yMjsKKworCURFQlVHX0xWTF8yNl9UUkFDRTEoIlNoYklwY1JlbGVhc2VCdWZmZXIoJXApXG4iLCBwU2hiSW5zdGFuY2VfcCk7CisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiT2spOworCX0KKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJLy8gc3RvcCB0aHJlYWRzIGluIGFueSBjYXNlLCBiZWNhdXNlIHRoZXkgYXJlIGJvdW5kIHRvIHRoYXQgc3BlY2lmaWMgaW5zdGFuY2UKKwlTaGJFcnJvcjIgPSBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJLy8gZC5rLjogV2hhdHMgdXAgd2l0aCBKb2JSZWFkeSB0aHJlYWQ/CisJLy8gICAgICAgSnVzdCB3YWtlIGl0IHVwLCBidXQgd2l0aG91dCBzZXR0aW5nIHRoZSBzZW1hcGhvcmUgdmFyaWFibGUKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTaGJNZW1IZWFkZXItPm1fV2FpdFF1ZXVlSm9iUmVhZHkpOworCisJaWYgKCEtLXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCkgeworCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJLy8gZGVsZXRlIG1lbSB0YWJsZSBlbGVtZW50CisJCVNoYklwY0RlbGV0ZUxpc3RFbGVtZW50KHBTaGJNZW1IZWFkZXItPm1faUJ1ZmZlcklkKTsKKwkJLy8gZGVsZXRlIHNoYXJlZCBtZW0KKwkJa2ZyZWUocFNoYk1lbUluc3QtPm1fcFNoYk1lbUhlYWRlcik7CisJfSBlbHNlIHsKKwkJU2hiRXJyb3IgPSBrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jczsKKwl9CisJLy9kZWxldGUgcHJpdmF0IG1lbQorCWtmcmVlKHBTaGJNZW1JbnN0KTsKKwlyZXR1cm4gKFNoYkVycm9yKTsKK30KKworI2VuZGlmIC8vICFkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKworI2lmICghZGVmaW5lZChTSEJJUENfSU5MSU5FRCkpIHx8IGRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEVudGVyIGF0b21pYyBzZWN0aW9uIGZvciBTaGFyZWQgQnVmZmVyIGFjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYkVycm9yIFNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJlbnRlciBhdG9taWNcbiIpOworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisKKwkvLyBsb2NrIGludGVycnVwdHMKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcFNoYk1lbUhlYWRlci0+bV9TcGlubG9ja0J1ZmZBY2Nlc3MsCisJCQkgIHBTaGJNZW1JbnN0LT5tX3VsRmxhZ3NCdWZmQWNjZXNzKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gU2hiRXJyb3I7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMZWF2ZSBhdG9taWMgc2VjdGlvbiBmb3IgU2hhcmVkIEJ1ZmZlciBhY2Nlc3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKwkvLyB1bmxvY2sgaW50ZXJydXB0cworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBTaGJNZW1IZWFkZXItPm1fU3BpbmxvY2tCdWZmQWNjZXNzLAorCQkJICAgICAgIHBTaGJNZW1JbnN0LT5tX3VsRmxhZ3NCdWZmQWNjZXNzKTsKKworICAgICAgRXhpdDoKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJMZWF2ZSBBdG9taWMgXG4iKTsKKwlyZXR1cm4gU2hiRXJyb3I7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGFydCBzaWduYWxpbmcgb2YgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHJlYWRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RhcnRTaWduYWxpbmdOZXdEYXRhKHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICAgcFNoYkluc3RhbmNlX3AsCisJCQkJCQkgICAgICB0U2lnSG5kbHJOZXdEYXRhCisJCQkJCQkgICAgICBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCQkJICAgICAgdFNoYlByaW9yaXR5CisJCQkJCQkgICAgICBTaGJQcmlvcml0eV9wKQoreworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCURFQlVHX0xWTF8yOV9UUkFDRTAoIi0tLS0tLS0+U2hiSXBjU3RhcnRTaWduYWxpbmdOZXdEYXRhXG4iKTsKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAoKHBTaGJNZW1JbnN0LT5tX3RUaHJlYWROZXdEYXRhSWQgIT0gSU5WQUxJRF9JRCkKKwkgICAgfHwgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSAhPSBOVUxMKSkgeworCQlTaGJFcnJvciA9IGtTaGJBbHJlYWR5U2lnbmFsaW5nOworCQlnb3RvIEV4aXQ7CisJfQorCURFQlVHX0xWTF8yNl9UUkFDRTIKKwkgICAgKCJTaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGEoJXApIG1fcGZuU2lnSG5kbHJOZXdEYXRhID0gJXBcbiIsCisJICAgICBwU2hiSW5zdGFuY2VfcCwgcGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcCk7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gcGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcDsKKwlwU2hiTWVtSGVhZGVyLT5tX2ZOZXdEYXRhID0gRkFMU0U7CisJcFNoYk1lbUluc3QtPm1faVRocmVhZFRlcm1GbGFnID0gMDsKKworCXN3aXRjaCAoU2hiUHJpb3JpdHlfcCkgeworCWNhc2Uga1NoYlByaW9yaXR5TG93OgorCQlwU2hiTWVtSW5zdC0+bV9sVGhyZWFkTmV3RGF0YU5pY2UgPSAtMjsKKwkJYnJlYWs7CisKKwljYXNlIGtTaGJQcmlvcml0eU5vcm1hbDoKKwkJcFNoYk1lbUluc3QtPm1fbFRocmVhZE5ld0RhdGFOaWNlID0gLTk7CisJCWJyZWFrOworCisJY2FzZSBrc2hiUHJpb3JpdHlIaWdoOgorCQlwU2hiTWVtSW5zdC0+bV9sVGhyZWFkTmV3RGF0YU5pY2UgPSAtMjA7CisJCWJyZWFrOworCisJfQorCisJLy9jcmVhdGUgdGhyZWFkIGZvciBzaWduYWxsaW5nIG5ldyBkYXRhCisJcFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCA9CisJICAgIGtlcm5lbF90aHJlYWQoU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSwgcFNoYkluc3RhbmNlX3AsCisJCQkgIENMT05FX0tFUk5FTCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFNoYkVycm9yOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RvcCBzaWduYWxpbmcgb2YgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHJlYWRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlCisJCQkJCQkgICAgIHBTaGJJbnN0YW5jZV9wKQoreworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCURFQlVHX0xWTF8yOV9UUkFDRTAoIi0tLS0tLS0+U2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGFcbiIpOworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKwlTaGJFcnJvciA9IGtTaGJPazsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJREVCVUdfTFZMXzI2X1RSQUNFMgorCSAgICAoIlNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKCVwKSBwZm5TaWduSG5kbHJOZXdEYXRhPSVwXG4iLAorCSAgICAgcFNoYkluc3RhbmNlX3AsIHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSk7CisJaWYgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSAhPSBOVUxMKSB7CS8vIHNpZ25hbCBoYW5kbGVyIHdhcyBzZXQgYmVmb3JlCisJCWludCBpRXJyOworCQkvL3NldCB0ZXJtaW5hdGlvbiBmbGFnIGluIG1lbSBoZWFkZXIKKwkJcFNoYk1lbUluc3QtPm1faVRocmVhZFRlcm1GbGFnID0gMTsKKworCQkvLyBjaGVjayBpZiB0aHJlYWQgaXMgc3RpbGwgcnVubmluZyBhdCBhbGwgYnkgc2VuZGluZyB0aGUgbnVsbC1zaWduYWwgdG8gdGhpcyB0aHJlYWQKKwkJLyogaUVyciA9IGtpbGxfcHJvYyhwU2hiTWVtSW5zdC0+bV90VGhyZWFkTmV3RGF0YUlkLCAwLCAxKTsgKi8KKwkJaUVyciA9IHNlbmRfc2lnKDAsIHBTaGJNZW1JbnN0LT5tX3RUaHJlYWROZXdEYXRhSWQsIDEpOworCQlpZiAoaUVyciA9PSAwKSB7CisJCQkvLyB3YWtlIHVwIHRocmVhZCwgYmVjYXVzZSBpdCBpcyBzdGlsbCBydW5uaW5nCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTaGJNZW1IZWFkZXItPgorCQkJCQkgICAgICBtX1dhaXRRdWV1ZU5ld0RhdGEpOworCisJCQkvL3dhaXQgZm9yIHRlcm1pbmF0aW9uIG9mIHRocmVhZAorCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcFNoYk1lbUluc3QtPm1fQ29tcGxldGlvbk5ld0RhdGEpOworCQl9CisKKwkJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gTlVMTDsKKwkJcFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCA9IElOVkFMSURfSUQ7CisJfQorCisJcmV0dXJuIFNoYkVycm9yOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2lnbmFsIG5ldyBkYXRhIChjYWxsZWQgZnJvbSB3cml0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1NpZ25hbE5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisJcFNoYk1lbUhlYWRlciA9CisJICAgIFNoYklwY0dldFNoYk1lbUhlYWRlcihTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKSk7CisJLy9zZXQgc2VtYXBob3JlCisJcFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSA9IFRSVUU7CisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjU2lnbmFsTmV3RGF0YSBzZXQgU2VtIC0+IE5ldyBEYXRhXG4iKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVOZXdEYXRhKTsKKwlyZXR1cm4gKGtTaGJPayk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RhcnQgc2lnbmFsaW5nIGZvciBqb2IgcmVhZHkgKGNhbGxlZCBmcm9tIHdhaXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RhcnRTaWduYWxpbmdKb2JSZWFkeSh0U2hiSW5zdGFuY2UKKwkJCQkJCSAgICAgICBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nCisJCQkJCQkgICAgICAgdWxUaW1lT3V0X3AsCisJCQkJCQkgICAgICAgdFNpZ0huZGxySm9iUmVhZHkKKwkJCQkJCSAgICAgICBwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcCkKK3sKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKworCVNoYkVycm9yID0ga1NoYk9rOworCWlmICgocFNoYk1lbUluc3QtPm1fdFRocmVhZEpvYlJlYWR5SWQgIT0gSU5WQUxJRF9JRCkKKwkgICAgfHwgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgIT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJZ290byBFeGl0OworCX0KKwlwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSA9IHVsVGltZU91dF9wOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcDsKKwlwU2hiTWVtSGVhZGVyLT5tX2ZKb2JSZWFkeSA9IEZBTFNFOworCS8vY3JlYXRlIHRocmVhZCBmb3Igc2lnbmFsbGluZyBuZXcgZGF0YQorCXBTaGJNZW1JbnN0LT5tX3RUaHJlYWRKb2JSZWFkeUlkID0KKwkgICAga2VybmVsX3RocmVhZChTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSwgcFNoYkluc3RhbmNlX3AsCisJCQkgIENMT05FX0tFUk5FTCk7CisgICAgICBFeGl0OgorCXJldHVybiBTaGJFcnJvcjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTaWduYWwgam9iIHJlYWR5IChjYWxsZWQgZnJvbSBleGVjdXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU2lnbmFsSm9iUmVhZHkodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNTaWduYWxKb2JSZWFkeVxuIik7CisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCXBTaGJNZW1IZWFkZXIgPQorCSAgICBTaGJJcGNHZXRTaGJNZW1IZWFkZXIoU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCkpOworCS8vc2V0IHNlbWFwaG9yZQorCXBTaGJNZW1IZWFkZXItPm1fZkpvYlJlYWR5ID0gVFJVRTsKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNTaWduYWxKb2JSZWFkeSBzZXQgU2VtIC0+IEpvYiBSZWFkeSBcbiIpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwU2hiTWVtSGVhZGVyLT5tX1dhaXRRdWV1ZUpvYlJlYWR5KTsKKwlyZXR1cm4gKGtTaGJPayk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gY29tbW9uIHVzZWQgc2hhcmUgbWVtb3J5IGFyZWEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkICpTaGJJcGNHZXRTaE1lbVB0cih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXZvaWQgKnBTaGJTaE1lbVB0cjsKKworCXBTaGJNZW1IZWFkZXIgPQorCSAgICBTaGJJcGNHZXRTaGJNZW1IZWFkZXIoU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCkpOworCWlmIChwU2hiTWVtSGVhZGVyICE9IE5VTEwpIHsKKwkJcFNoYlNoTWVtUHRyID0gKEJZVEUgKikgcFNoYk1lbUhlYWRlciArIHNpemVvZih0U2hiTWVtSGVhZGVyKTsKKwl9IGVsc2UgeworCQlwU2hiU2hNZW1QdHIgPSBOVUxMOworCX0KKworCXJldHVybiAocFNoYlNoTWVtUHRyKTsKKworfQorCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gcHJvY2VzcyBsb2NhbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qdFNoYk1lbUluc3QqICBTaGJJcGNHZXRTaGJNZW1JbnN0ICgKKyAgICB0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKK3RTaGJNZW1JbnN0KiAgcFNoYk1lbUluc3Q7CisKKyAgICBwU2hiTWVtSW5zdCA9ICh0U2hiTWVtSW5zdCopcFNoYkluc3RhbmNlX3A7CisKKyAgICByZXR1cm4gKHBTaGJNZW1JbnN0KTsKKworfQorKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5IGhlYWRlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyp0U2hiTWVtSGVhZGVyKiAgU2hiSXBjR2V0U2hiTWVtSGVhZGVyICgKKyAgICB0U2hiTWVtSW5zdCogcFNoYk1lbUluc3RfcCkKK3sKKwordFNoYk1lbUhlYWRlciogIHBTaGJNZW1IZWFkZXI7CisKKyAgICBwU2hiTWVtSGVhZGVyID0gcFNoYk1lbUluc3RfcC0+bV9wU2hiTWVtSGVhZGVyOworCisgICAgcmV0dXJuIChwU2hiTWVtSGVhZGVyKTsKKworfQorKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIHByb2Nlc3Mgc3BlY2lmaWMgbWVtcG9vbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKlNoYklwY0FsbG9jUHJpdmF0ZU1lbSh1bnNpZ25lZCBsb25nIHVsTWVtU2l6ZV9wKQoreworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl2b2lkICpwTWVtOworCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NQcml2YXRlTWVtIFxuIik7CisJLy9nZXQgcHJpdmF0ZSBtZW0KKwlwTWVtID0ga21hbGxvYyh1bE1lbVNpemVfcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHBNZW0gPT0gTlVMTCkgeworCQkvL3VuYWJsZSB0byBjcmVhdGUgbWVtCisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorICAgICAgRXhpdDoKKwlyZXR1cm4gKHBNZW0pOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhyZWFkIGZvciBuZXcgZGF0YSBzaWduYWxpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKHZvaWQgKnB2VGhyZWFkUGFyYW1fcCkKK3sKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCWludCBpUmV0VmFsID0gLTE7CisJaW50IGZDYWxsQWdhaW47CisKKwlkYWVtb25pemUoIlNoYk5EJXAiLCBwdlRocmVhZFBhcmFtX3ApOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlwU2hiSW5zdGFuY2UgPSAodFNoYk1lbUluc3QgKikgcHZUaHJlYWRQYXJhbV9wOworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2UpOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJREVCVUdfTFZMXzI2X1RSQUNFMSgiU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSglcClcbiIsIHB2VGhyZWFkUGFyYW1fcCk7CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIHBTaGJNZW1JbnN0LT5tX2xUaHJlYWROZXdEYXRhTmljZSk7CisKKy8vICAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMSgiU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSB3YWl0IGZvciBOZXcgRGF0YSBTZW0gJXBcbiIscFNoYk1lbUluc3QtPm1fcFNlbU5ld0RhdGEpOworCWRvIHsKKwkJaVJldFZhbCA9CisJCSAgICB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVOZXdEYXRhLAorCQkJCQkgICAgIChwU2hiTWVtSW5zdC0+bV9pVGhyZWFkVGVybUZsYWcgIT0KKwkJCQkJICAgICAgMCkKKwkJCQkJICAgICB8fCAocFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSAhPQorCQkJCQkJIEZBTFNFKSk7CisKKwkJaWYgKGlSZXRWYWwgIT0gMCkgewkvLyBzaWduYWwgcGVuZGluZworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSAhPSBGQUxTRSkgeworCQkJcFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSA9IEZBTFNFOworCQkJZG8geworCQkJCWZDYWxsQWdhaW4gPQorCQkJCSAgICBwU2hiTWVtSW5zdC0+CisJCQkJICAgIG1fcGZuU2lnSG5kbHJOZXdEYXRhKHBTaGJJbnN0YW5jZSk7CisJCQkJLy8gY2FsbCBzY2hlZHVsZXIsIHdoaWNoIHdpbGwgZXhlY3V0ZSBhbnkgdGFzayB3aXRoIGhpZ2hlciBwcmlvcml0eQorCQkJCXNjaGVkdWxlKCk7CisJCQl9IHdoaWxlIChmQ2FsbEFnYWluICE9IEZBTFNFKTsKKwkJfQorCX0gd2hpbGUgKHBTaGJNZW1JbnN0LT5tX2lUaHJlYWRUZXJtRmxhZyA9PSAwKTsKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhIHRlcm1pbmF0ZWQgXG4iKTsKKwkvL3NldCB0aHJlYWQgY29tcGxldGVkCisJY29tcGxldGVfYW5kX2V4aXQoJnBTaGJNZW1JbnN0LT5tX0NvbXBsZXRpb25OZXdEYXRhLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaHJlYWQgZm9yIG5ldyBkYXRhIEpvYiBSZWFkeSBzaWduYWxpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSh2b2lkICpwdlRocmVhZFBhcmFtX3ApCit7CisJdFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZTsKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwlsb25nIGxUaW1lT3V0OworCWludCBpUmV0VmFsID0gLTE7CisKKwlkYWVtb25pemUoIlNoYkpSJXAiLCBwdlRocmVhZFBhcmFtX3ApOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlwU2hiSW5zdGFuY2UgPSAodFNoYk1lbUluc3QgKikgcHZUaHJlYWRQYXJhbV9wOworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2UpOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJREVCVUdfTFZMXzI5X1RSQUNFMAorCSAgICAoIlNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5IHdhaXQgZm9yIGpvYiByZWFkeSBTZW1cbiIpOworCWlmIChwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSAhPSAwKSB7CisJCWxUaW1lT3V0ID0gKGxvbmcpcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHk7CisJCS8vd2FpdCBmb3Igam9iIHJlYWR5IHNlbWFwaG9yZQorCQlpUmV0VmFsID0KKwkJICAgIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHBTaGJNZW1IZWFkZXItPgorCQkJCQkJICAgICBtX1dhaXRRdWV1ZUpvYlJlYWR5LAorCQkJCQkJICAgICAocFNoYk1lbUhlYWRlci0+CisJCQkJCQkgICAgICBtX2ZKb2JSZWFkeSAhPSBGQUxTRSksCisJCQkJCQkgICAgIGxUaW1lT3V0KTsKKwl9IGVsc2UgeworCQkvL3dhaXQgZm9yIGpvYiByZWFkeSBzZW1hcGhvcmUKKwkJaVJldFZhbCA9CisJCSAgICB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVKb2JSZWFkeSwKKwkJCQkJICAgICAocFNoYk1lbUhlYWRlci0+bV9mSm9iUmVhZHkgIT0KKwkJCQkJICAgICAgRkFMU0UpKTsKKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSAhPSBOVUxMKSB7CisJCS8vY2FsbCBIYW5kbGVyCisJCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkocFNoYkluc3RhbmNlLAorCQkJCQkJICAgIXBTaGJNZW1IZWFkZXItPm1fZkpvYlJlYWR5KTsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLy9CdWlsZCB0aGUgY3JjIHRhYmxlCitzdGF0aWMgdm9pZCBTaGJJcGNDcmMzMkdlblRhYmxlKHVuc2lnbmVkIGxvbmcgYXVsQ3JjVGFibGVbMjU2XSkKK3sKKwl1bnNpZ25lZCBsb25nIHVsQ3JjLCB1bFBvbHk7CisJaW50IGlJbmRleEksIGlJbmRleEo7CisKKwl1bFBvbHkgPSAweEVEQjg4MzIwTDsKKwlmb3IgKGlJbmRleEkgPSAwOyBpSW5kZXhJIDwgMjU2OyBpSW5kZXhJKyspIHsKKwkJdWxDcmMgPSBpSW5kZXhJOworCQlmb3IgKGlJbmRleEogPSA4OyBpSW5kZXhKID4gMDsgaUluZGV4Si0tKSB7CisJCQlpZiAodWxDcmMgJiAxKSB7CisJCQkJdWxDcmMgPSAodWxDcmMgPj4gMSkgXiB1bFBvbHk7CisJCQl9IGVsc2UgeworCQkJCXVsQ3JjID4+PSAxOworCQkJfQorCQl9CisJCWF1bENyY1RhYmxlW2lJbmRleEldID0gdWxDcmM7CisJfQorfQorCisvL0NhbGN1bGF0ZSB0aGUgY3JjIHZhbHVlCitzdGF0aWMgdW5zaWduZWQgbG9uZyBTaGJJcGNDcmMzMkdldENyYyhjb25zdCBjaGFyICpwY1N0cmluZywKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhdWxDcmNUYWJsZVsyNTZdKQoreworCXVuc2lnbmVkIGxvbmcgdWxDcmM7CisJaW50IGlJbmRleDsKKworCXVsQ3JjID0gMHhGRkZGRkZGRjsKKwlmb3IgKGlJbmRleCA9IDA7IGlJbmRleCA8IHN0cmxlbihwY1N0cmluZyk7IGlJbmRleCsrKSB7CisJCXVsQ3JjID0KKwkJICAgICgodWxDcmMgPj4gOCkgJiAweDAwRkZGRkZGKSBeCisJCSAgICBhdWxDcmNUYWJsZVsodWxDcmMgXiBwY1N0cmluZ1tpSW5kZXhdKSAmIDB4RkZdOworCX0KKwlyZXR1cm4gKHVsQ3JjIF4gMHhGRkZGRkZGRik7CisKK30KKworc3RhdGljIHZvaWQgU2hiSXBjQXBwZW5kTGlzdEVsZW1lbnQoc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNOZXdNZW1UYWJsZUVsZW1lbnQpCit7CisJc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNNZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisJcHNOZXdNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50ID0gTlVMTDsKKworCWlmIChwc01lbVRhYmxlRWxlbWVudEZpcnN0X2cgIT0gTlVMTCkgewkvKiBzaW5kIEVsZW1lbnRlIHZvcmhhbmRlbiAqLworCQl3aGlsZSAocHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50ICE9IE5VTEwpIHsJLyogc3VjaGUgZGFzIGxldHp0ZSBFbGVtZW50ICovCisJCQlwc01lbVRhYmxlRWxlbWVudCA9CisJCQkgICAgcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworCQl9CisJCXBzTWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudCA9IHBzTmV3TWVtVGFibGVFbGVtZW50OwkvKiAgSGFlbmdlIGRhcyBFbGVtZW50IGhpbnRlbiBhbiAqLworCX0gZWxzZSB7CQkvKiB3ZW5uIGRpZSBsaXN0ZSBsZWVyIGlzdCwgYmluIGljaCBkYXMgZXJzdGUgRWxlbWVudCAqLworCQlwc01lbVRhYmxlRWxlbWVudEZpcnN0X2cgPSBwc05ld01lbVRhYmxlRWxlbWVudDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgU2hiSXBjRmluZExpc3RFbGVtZW50KGludCBpQnVmZmVySWQsCisJCQkJIHN0cnVjdCBzU2hiTWVtVGFibGUgKipwcHNSZXR1cm5NZW1UYWJsZUVsZW1lbnQpCit7CisJc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNNZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisJd2hpbGUgKHBzTWVtVGFibGVFbGVtZW50ICE9IE5VTEwpIHsKKwkJaWYgKHBzTWVtVGFibGVFbGVtZW50LT5tX2lCdWZmZXJJZCA9PSBpQnVmZmVySWQpIHsKKy8vcHJpbnRrKCJTaGJJcGNGaW5kTGlzdEVsZW1lbnQgQnVmZmVyIGF0OiVwIElkOiVkXG4iLHBzTWVtVGFibGVFbGVtZW50LT5tX3BCdWZmZXIscHNNZW1UYWJsZUVsZW1lbnQtPm1faUJ1ZmZlcklkKTsKKwkJCSpwcHNSZXR1cm5NZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudDsKKy8vcHJpbnRrKCJTaGJJcGNGaW5kTGlzdEVsZW1lbnQgQnVmZmVyIGF0OiVwIElkOiVkXG4iLCgqcHBzUmV0dXJuTWVtVGFibGVFbGVtZW50KS0+bV9wQnVmZmVyLCgqcHBzUmV0dXJuTWVtVGFibGVFbGVtZW50KS0+bV9pQnVmZmVySWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHNNZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQ7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgU2hiSXBjRGVsZXRlTGlzdEVsZW1lbnQoaW50IGlCdWZmZXJJZCkKK3sKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudCA9IHBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudE9sZCA9IHBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKwlpZiAocHNNZW1UYWJsZUVsZW1lbnQgIT0gTlVMTCkgeworCQl3aGlsZSAoKHBzTWVtVGFibGVFbGVtZW50ICE9IE5VTEwpCisJCSAgICAgICAmJiAocHNNZW1UYWJsZUVsZW1lbnQtPm1faUJ1ZmZlcklkICE9IGlCdWZmZXJJZCkpIHsKKwkJCXBzTWVtVGFibGVFbGVtZW50T2xkID0gcHNNZW1UYWJsZUVsZW1lbnQ7CisJCQlwc01lbVRhYmxlRWxlbWVudCA9CisJCQkgICAgcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworCQl9CisJCWlmIChwc01lbVRhYmxlRWxlbWVudCAhPSBOVUxMKSB7CisJCQlpZiAocHNNZW1UYWJsZUVsZW1lbnQgIT0gcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nKSB7CisJCQkJcHNNZW1UYWJsZUVsZW1lbnRPbGQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50ID0KKwkJCQkgICAgcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworCQkJCWtmcmVlKHBzTWVtVGFibGVFbGVtZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJa2ZyZWUocHNNZW1UYWJsZUVsZW1lbnQpOworCQkJCXBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZyA9IE5VTEw7CisJCQl9CisKKwkJfQorCX0KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLVdpbjMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy1XaW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTgxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy1XaW4zMi5jCkBAIC0wLDAgKzEsMTIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIFByb2plY3QgaW5kZXBlbmRlbmQgc2hhcmVkIGJ1ZmZlciAobGluZWFyICsgY2lyY3VsYXIpCisKKyAgRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXJ0IGZvciB0aGUKKyAgICAgICAgICAgICAgICBzaGFyZWQgYnVmZmVyCisgICAgICAgICAgICAgICAgKEltcGxlbWVudGF0aW9uIGZvciBXaW4zMikKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAyMDA2LzA2LzI3IC1yczogICBWIDEuMDAgKGluaXRpYWwgdmVyc2lvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBXSU5WRVIgICAgICAgMHgwNDAwCS8vICNkZWZpbmVzIG5lY2Vzc2FyeSBmb3IgdXNhZ2Ugb2YKKyNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDQwMAkvLyBmdW5jdGlvbiA8U2lnbmFsT2JqZWN0QW5kV2FpdD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdsb2JhbC5oIgorI2luY2x1ZGUgInNoYXJlZGJ1ZmYuaCIKKyNpbmNsdWRlICJzaGJpcGMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICghZGVmaW5lZChTSEJJUENfSU5MSU5FRCkpIHx8IGRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbmZpZ3VyYXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uc3RhbnQgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTUFYX0xFTl9CVUZGRVJfSUQgICAgICAgTUFYX1BBVEgKKworI2RlZmluZSBJRFhfRVZFTlRfTkVXX0RBVEEgICAgICAwCisjZGVmaW5lIElEWF9FVkVOVF9URVJNX1JFUVUgICAgIDEKKyNkZWZpbmUgSURYX0VWRU5UX1RFUk1fUkVTUCAgICAgMgorCisjZGVmaW5lIE5BTUVfTVVURVhfQlVGRl9BQ0NFU1MgICJCdWZmQWNjZXNzIgorI2RlZmluZSBOQU1FX0VWRU5UX05FV19EQVRBICAgICAiTmV3RGF0YSIKKyNkZWZpbmUgTkFNRV9FVkVOVF9URVJNX1JFUVUgICAgIlRlcm1SZXF1IgorI2RlZmluZSBOQU1FX0VWRU5UX1RFUk1fUkVTUCAgICAiVGVybVJlc3AiCisjZGVmaW5lIE5BTUVfRVZFTlRfSk9CX1JFQURZICAgICJKb2JSZWFkeSIKKworI2RlZmluZSBUSU1FT1VUX0VOVEVSX0FUT01JQyAgICAxMDAwCS8vIGZvciBkZWJnZ2luZzogSU5GSU5JVEUKKyNkZWZpbmUgVElNRU9VVF9URVJNX1RIUkVBRCAgICAgMjAwMAorCisjZGVmaW5lIFNCSV9NQUdJQ19JRCAgICAgICAgICAgIDB4NTM0MjQ5MkIJLy8gbWFnaWMgSUQgKCJTQkkrIikKKyNkZWZpbmUgU0JIX01BR0lDX0lEICAgICAgICAgICAgMHg1MzQyNDgyQQkvLyBtYWdpYyBJRCAoIlNCSCoiKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgY29tbW9uIGhlYWRlciBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uIHVzZWQKKy8vIGJ5IGFsbCBwcm9jZXNzZXMgYXR0YWNoZWQgdGhpcyBzaGFyZWQgbWVtb3J5LiBJdCBpbmNsdWRlcyBjb21tb24KKy8vIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZCBidWZmZXIgZnJvbSBhIGNvdXBsZSBvZgorLy8gc2VwYXJhdGVkIHByb2Nlc3NlcyAoZS5nLiB0aGUgcmVmZXJuY2UgY291bnRlcikuIFRoaXMgc3RydWN0dXJlIGlzCisvLyBsb2NhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24gaXRzZWxmIGFuZCBleGlzdHMKKy8vIGNvbnNlcXVlbnRseSBvbmx5IG9uZSB0aW1lcyBwZXIgc2hhcmVkIG1lbW9yeSBpbnN0YW5jZS4KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1fU2JoTWFnaWNJRDsJLy8gbWFnaWMgSUQgKCJTQkgqIikKKwl1bnNpZ25lZCBsb25nIG1fdWxTaE1lbVNpemU7CisJdW5zaWduZWQgbG9uZyBtX3VsUmVmQ291bnQ7CisJY2hhciBtX3N6QnVmZmVySURbTUFYX0xFTl9CVUZGRVJfSURdOworCisjaWZuZGVmIE5ERUJVRworCXVuc2lnbmVkIGxvbmcgbV91bE93bmVyUHJvY0lEOworI2VuZGlmCisKK30gdFNoYk1lbUhlYWRlcjsKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlICJleHRlcm5hbCBlbnRyeSBwb2ludCIgZnJvbSBhIHNlcGFyYXRlIHByb2Nlc3MKKy8vIHRvIGdldCBhY2Nlc3MgdG8gYSBzaGFyZWQgYnVmZmVyLiBUaGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBhbGwgcGxhdGZvcm0KKy8vIHJlc3AuIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQKKy8vIGJ1ZmZlciBmcm9tIGEgc2VwYXJhdGUgcHJvY2Vzcy4gRXZlcnkgcHJvY2VzcyBhdHRhY2hlZCB0byB0aGUgc2hhcmVkCisvLyBidWZmZXIgaGFzIGl0cyBvd24gcnVudGltZSBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSB3aXRoIGl0cyBpbmRpdmlkdWFsCisvLyBydW50aW1lIGRhdGEgKGUuZy4gdGhlIHNjb3BlIG9mIGFuIGV2ZW50IGhhbmRsZSBpcyBsaW1pdHRlZCB0byB0aGUKKy8vIG93bmVyIHByb2Nlc3Mgb25seSkuIFRoZSBzdHJ1Y3R1cmUgbWVtYmVyIDxtX3BTaGJNZW1IZWFkZXI+IHBvaW50cworLy8gdG8gdGhlIChwcm9jZXNzIHNwZWNpZmljKSBzdGFydCBhZGRyZXNzIG9mIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgorLy8gaXRzZWxmLgordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV9TYmlNYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCSSsiKQorCUhBTkRMRSBtX2hTaGFyZWRNZW07CisJSEFORExFIG1faE11dGV4QnVmZkFjY2VzczsKKwlIQU5ETEUgbV9oVGhyZWFkTmV3RGF0YTsJLy8gdGhyYWVkIHRvIHNpZ25hbCB0aGF0IG5ldyBkYXRhIGFyZSBhdmFpbGFibGUKKwlIQU5ETEUgbV9haEV2ZW50TmV3RGF0YVszXTsJLy8gSURYX0VWRU5UX05FV19EQVRBICsgSURYX0VWRU5UX1RFUk1fUkVRVSArIElEX0VWRU5UX1RFUk1fUkVTUAorCXRTaWdIbmRsck5ld0RhdGEgbV9wZm5TaWdIbmRsck5ld0RhdGE7CisJSEFORExFIG1faFRocmVhZEpvYlJlYWR5OwkvLyB0aHJlYWQgdG8gc2lnbmFsIHRoYXQgYSBqb2Ivb3BlcmF0aW9uIGlzIHJlYWR5IG5vdyAoZS5nLiByZXNldCBidWZmZXIpCisJSEFORExFIG1faEV2ZW50Sm9iUmVhZHk7CisJdW5zaWduZWQgbG9uZyBtX3VsVGltZU91dEpvYlJlYWR5OworCXRTaWdIbmRsckpvYlJlYWR5IG1fcGZuU2lnSG5kbHJKb2JSZWFkeTsKKwl0U2hiTWVtSGVhZGVyICptX3BTaGJNZW1IZWFkZXI7CisKKyNpZm5kZWYgTkRFQlVHCisJdW5zaWduZWQgbG9uZyBtX3VsVGhyZWFkSUROZXdEYXRhOworCXVuc2lnbmVkIGxvbmcgbV91bFRocmVhZElESm9iUmVhZHk7CisjZW5kaWYKKworfSB0U2hiTWVtSW5zdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHbG9iYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzIG9mIGludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJNZW1JbnN0ICpTaGJJcGNHZXRTaGJNZW1JbnN0KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKworCXBTaGJNZW1JbnN0ID0gKHRTaGJNZW1JbnN0ICopIHBTaGJJbnN0YW5jZV9wOworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9TYmlNYWdpY0lEID09IFNCSV9NQUdJQ19JRCk7CisKKwlyZXR1cm4gKHBTaGJNZW1JbnN0KTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkgaGVhZGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYk1lbUhlYWRlciAqU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gcFNoYk1lbUluc3QtPm1fcFNoYk1lbUhlYWRlcjsKKwlBU1NFUlQocFNoYk1lbUhlYWRlci0+bV9TYmhNYWdpY0lEID09IFNCSF9NQUdJQ19JRCk7CisKKwlyZXR1cm4gKHBTaGJNZW1IZWFkZXIpOworCit9CisKKy8vIG5vdCBpbmxpbmVkIGludGVybmFsIGZ1bmN0aW9ucworRFdPUkQgV0lOQVBJIFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoTFBWT0lEIHB2VGhyZWFkUGFyYW1fcCk7CitEV09SRCBXSU5BUEkgU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoTFBWT0lEIHB2VGhyZWFkUGFyYW1fcCk7Citjb25zdCBjaGFyICpTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShjb25zdCBjaGFyICpwc3pFdmVudEpvYk5hbWVfcCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgQk9PTCBmR2xvYmFsT2JqZWN0X3ApOworCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKy8vIHRydWUgaW50ZXJuYWwgZnVuY3Rpb25zIChub3QgaW5saW5lZCkKK3N0YXRpYyB2b2lkICpTaGJJcGNBbGxvY1ByaXZhdGVNZW0odW5zaWduZWQgbG9uZyB1bE1lbVNpemVfcCk7CitzdGF0aWMgdm9pZCBTaGJJcGNSZWxlYXNlUHJpdmF0ZU1lbSh2b2lkICpwTWVtX3ApOworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorLy8gbm90IGlubGluZWQgZXh0ZXJuYWwgZnVuY3Rpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgSW5pdGlhbGl6ZSBJUEMgZm9yIFNoYXJlZCBCdWZmZXIgTW9kdWxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjSW5pdCh2b2lkKQoreworCisJcmV0dXJuIChrU2hiT2spOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRGVpbml0aWFsaXplIElQQyBmb3IgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNFeGl0KHZvaWQpCit7CisKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBBbGxvY2F0ZSBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKQoreworCisJSEFORExFIGhTaGFyZWRNZW07CisJTFBWT0lEIHBTaGFyZWRNZW07CisJdW5zaWduZWQgbG9uZyB1bFNoTWVtU2l6ZTsKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXVuc2lnbmVkIGludCBmU2hNZW1OZXdDcmVhdGVkOworCWNvbnN0IGNoYXIgKnBzek9iamVjdE5hbWU7CisJSEFORExFIGhNdXRleEJ1ZmZBY2Nlc3M7CisJSEFORExFIGhFdmVudE5ld0RhdGE7CisJSEFORExFIGhFdmVudEpvYlJlYWR5OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCXVsU2hNZW1TaXplID0gdWxCdWZmZXJTaXplX3AgKyBzaXplb2YodFNoYk1lbUhlYWRlcik7CisJcFNoYXJlZE1lbSA9IE5VTEw7CisJcFNoYkluc3RhbmNlID0gTlVMTDsKKwlmU2hNZW1OZXdDcmVhdGVkID0gRkFMU0U7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICgxKSBvcGVuIGFuIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBzaGFyZWQgbWVtb3J5CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyB0cnkgdG8gb3BlbiBhbiBhbHJlYWR5IGV4aXN0aW5nIHNoYXJlZCBtZW1vcnkKKwkvLyAoY3JlYXRlZCBieSBhbiBhbm90aGVyIHByb2Nlc3MpCisJaFNoYXJlZE1lbSA9IE9wZW5GaWxlTWFwcGluZyhGSUxFX01BUF9BTExfQUNDRVNTLAkvLyBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJJbmhlcml0SGFuZGxlCisJCQkJICAgICBwc3pCdWZmZXJJRF9wKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlpZiAoaFNoYXJlZE1lbSAhPSBOVUxMKSB7CisJCS8vIGEgc2hhcmVkIG1lbW9yeSBhbHJlYWR5IGV4aXN0cworCQlmU2hNZW1OZXdDcmVhdGVkID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJLy8gaXQgc2VhbXMgdGhhdCB0aGlzIHByb2Nlc3MgaXMgdGhlIGZpcnN0IHdobyB3YW50cyB0byB1c2UgdGhlCisJCS8vIHNoYXJlZCBtZW1vcnksIHNvIGl0IGhhcyB0byBjcmVhdGUgYSBuZXcgc2hhcmVkIG1lbW9yeQorCQloU2hhcmVkTWVtID0gQ3JlYXRlRmlsZU1hcHBpbmcoSU5WQUxJRF9IQU5ETEVfVkFMVUUsCS8vIEhBTkRMRSBoRmlsZQorCQkJCQkgICAgICAgTlVMTCwJLy8gTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwQXR0cmlidXRlcworCQkJCQkgICAgICAgUEFHRV9SRUFEV1JJVEUsCS8vIERXT1JEIGZsUHJvdGVjdAorCQkJCQkgICAgICAgMCwJLy8gRFdPUkQgZHdNYXhpbXVtU2l6ZUhpZ2gKKwkJCQkJICAgICAgIHVsU2hNZW1TaXplLAkvLyBEV09SRCBkd01heGltdW1TaXplTG93CisJCQkJCSAgICAgICBwc3pCdWZmZXJJRF9wKTsJLy8gTFBDVFNUUiBscE5hbWUKKworCQlmU2hNZW1OZXdDcmVhdGVkID0gVFJVRTsKKwl9CisKKwlpZiAoaFNoYXJlZE1lbSA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyAoMikgZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBzaGFyZWQgbWVtb3J5CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlwU2hhcmVkTWVtID0gTWFwVmlld09mRmlsZShoU2hhcmVkTWVtLAkvLyBIQU5ETEUgaEZpbGVNYXBwaW5nT2JqZWN0CisJCQkJICAgRklMRV9NQVBfQUxMX0FDQ0VTUywJLy8gRFdPUkQgZHdEZXNpcmVkQWNjZXNzLAorCQkJCSAgIDAsCS8vIERXT1JEIGR3RmlsZU9mZnNldEhpZ2gsCisJCQkJICAgMCwJLy8gRFdPUkQgZHdGaWxlT2Zmc2V0TG93LAorCQkJCSAgIHVsU2hNZW1TaXplKTsJLy8gU0laRV9UIGR3TnVtYmVyT2ZCeXRlc1RvTWFwCisKKwlpZiAocFNoYXJlZE1lbSA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyAoMykgc2V0dXAgb3IgdXBkYXRlIGhlYWRlciBhbmQgbWFuYWdlbWVudCBpbmZvcm1hdGlvbgorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJcFNoYk1lbUhlYWRlciA9ICh0U2hiTWVtSGVhZGVyICopIHBTaGFyZWRNZW07CisKKwkvLyBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIHByb2Nlc3Mgc3BlY2lmaWMgbWVtcG9vbCB0byBzYXZlCisJLy8gcHJvY2VzcyBsb2NhbCBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQgYnVmZmVyCisJcFNoYk1lbUluc3QgPQorCSAgICAodFNoYk1lbUluc3QgKikgU2hiSXBjQWxsb2NQcml2YXRlTWVtKHNpemVvZih0U2hiTWVtSW5zdCkpOworCWlmIChwU2hiTWVtSW5zdCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlc2V0IGNvbXBsZXRlIGhlYWRlciB0byBkZWZhdWx0IHZhbHVlcworCXBTaGJNZW1JbnN0LT5tX1NiaU1hZ2ljSUQgPSBTQklfTUFHSUNfSUQ7CisJcFNoYk1lbUluc3QtPm1faFNoYXJlZE1lbSA9IGhTaGFyZWRNZW07CisJcFNoYk1lbUluc3QtPm1faE11dGV4QnVmZkFjY2VzcyA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCXBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXSA9CisJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFUVVdID0KKwkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBOVUxMOworCXBTaGJNZW1JbnN0LT5tX2hUaHJlYWRKb2JSZWFkeSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCXBTaGJNZW1JbnN0LT5tX2hFdmVudEpvYlJlYWR5ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHkgPSAwOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBOVUxMOworCXBTaGJNZW1JbnN0LT5tX3BTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSGVhZGVyOworCisjaWZuZGVmIE5ERUJVRworCXsKKwkJcFNoYk1lbUluc3QtPm1fdWxUaHJlYWRJRE5ld0RhdGEgPSAwOworCQlwU2hiTWVtSW5zdC0+bV91bFRocmVhZElESm9iUmVhZHkgPSAwOworCX0KKyNlbmRpZgorCisJLy8gY3JlYXRlIG11dGV4IGZvciBidWZmZXIgYWNjZXNzCisJcHN6T2JqZWN0TmFtZSA9CisJICAgIFNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKE5BTUVfTVVURVhfQlVGRl9BQ0NFU1MsIHBzekJ1ZmZlcklEX3AsCisJCQkJICAgICAgIFRSVUUpOworCWhNdXRleEJ1ZmZBY2Nlc3MgPSBDcmVhdGVNdXRleChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBNdXRleEF0dHJpYnV0ZXMKKwkJCQkgICAgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxPd25lcgorCQkJCSAgICAgICBwc3pPYmplY3ROYW1lKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzID0gaE11dGV4QnVmZkFjY2VzczsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faE11dGV4QnVmZkFjY2VzcyAhPSBOVUxMKTsKKworCS8vIFRoZSBFdmVudE5ld0RhdGEgaXMgdXNlZCBmb3Igc2lnbmFsaW5nIG9mIG5ldyBkYXRhIGFmdGVyIGEgd3JpdGUKKwkvLyBvcGVyYXRpb24gKFNldEV2ZW50KSBhcyB3ZWxsIGFzIGZvciB3YWl0aW5nIGZvciBuZXcgZGF0YSBvbiB0aGUKKwkvLyByZWFkZXIgc2lkZSAoV2FpdEZvck11bHRpcGxlT2JqZWN0cykuIEJlY2F1c2UgaXQncyBub3Qga25vd24gaWYKKwkvLyB0aGlzIHByb2Nlc3Mgd2lsbCBiZSByZWFkIG9yIHdyaXRlIGRhdGEsIHRoZSBldmVudCB3aWxsIGJlCisJLy8gYWx3YXlzIGNyZWF0ZWQgaGVyZS4KKwlwc3pPYmplY3ROYW1lID0KKwkgICAgU2hiSXBjR2V0VW5pZm9ybU9iamVjdE5hbWUoTkFNRV9FVkVOVF9ORVdfREFUQSwgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgVFJVRSk7CisJaEV2ZW50TmV3RGF0YSA9IENyZWF0ZUV2ZW50KE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscEV2ZW50QXR0cmlidXRlcworCQkJCSAgICBGQUxTRSwJLy8gQk9PTCBiTWFudWFsUmVzZXQKKwkJCQkgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxTdGF0ZQorCQkJCSAgICBwc3pPYmplY3ROYW1lKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdID0gaEV2ZW50TmV3RGF0YTsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXSAhPSBOVUxMKTsKKworCS8vIFRoZSBFdmVudEpvYlJlYWR5IGlzIHVzZWQgZm9yIHNpZ25hbGluZyB0aGF0IGEgam9iIGlzIGRvbmUgKFNldEV2ZW50KQorCS8vIGFzIHdlbGwgYXMgZm9yIHdhaXRpbmcgZm9yIGZpbmlzaGluZyBvZiBhIGpvYiAoV2FpdEZvck11bHRpcGxlT2JqZWN0cykuCisJLy8gQmVjYXVzZSBpdCdzIG5vdCBrbm93biBpZiB0aGlzIHByb2Nlc3Mgd2lsbCBzaWduYWwgb3Igd2FpdCwgdGhlIGV2ZW50CisJLy8gd2lsbCBiZSBhbHdheXMgY3JlYXRlZCBoZXJlLgorCXBzek9iamVjdE5hbWUgPQorCSAgICBTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShOQU1FX0VWRU5UX0pPQl9SRUFEWSwgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgVFJVRSk7CisJaEV2ZW50Sm9iUmVhZHkgPSBDcmVhdGVFdmVudChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBFdmVudEF0dHJpYnV0ZXMKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJNYW51YWxSZXNldAorCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxTdGF0ZQorCQkJCSAgICAgcHN6T2JqZWN0TmFtZSk7CS8vIExQQ1RTVFIgbHBOYW1lCisJcFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgPSBoRXZlbnRKb2JSZWFkeTsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgIT0gTlVMTCk7CisKKwlpZiAoZlNoTWVtTmV3Q3JlYXRlZCkgeworCQkvLyB0aGlzIHByb2Nlc3Mgd2FzIHRoZSBmaXJzdCB3aG8gd2FudGVkIHRvIHVzZSB0aGUgc2hhcmVkIG1lbW9yeSwKKwkJLy8gc28gYSBuZXcgc2hhcmVkIG1lbW9yeSB3YXMgY3JlYXRlZAorCQkvLyAtPiBzZXR1cCBuZXcgaGVhZGVyIGluZm9ybWF0aW9uIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24KKwkJLy8gICAgaXRzZWxmCisJCXBTaGJNZW1IZWFkZXItPm1fU2JoTWFnaWNJRCA9IFNCSF9NQUdJQ19JRDsKKwkJcFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZSA9IHVsU2hNZW1TaXplOworCQlwU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQgPSAxOworCQlzdHJuY3B5KHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCwgcHN6QnVmZmVySURfcCwKKwkJCXNpemVvZihwU2hiTWVtSGVhZGVyLT5tX3N6QnVmZmVySUQpIC0gMSk7CisKKyNpZm5kZWYgTkRFQlVHCisJCXsKKwkJCXBTaGJNZW1IZWFkZXItPm1fdWxPd25lclByb2NJRCA9IEdldEN1cnJlbnRQcm9jZXNzSWQoKTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJLy8gYW55IG90aGVyIHByb2Nlc3MgaGFzIGNyZWF0ZWQgdGhlIHNoYXJlZCBtZW1vcnkgYW5kIHRoaXMKKwkJLy8gcHJvY2VzcyBoYXMgb25seSBhdHRhY2hlZCB0byBpdAorCQkvLyAtPiBjaGVjayBhbmQgdXBkYXRlIGV4aXN0aW5nIGhlYWRlciBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlCisJCS8vICAgIHNoYXJlZCBtZW1vcnkgcmVnaW9uIGl0c2VsZgorCQlpZiAocFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZSAhPSB1bFNoTWVtU2l6ZSkgeworCQkJU2hiRXJyb3IgPSBrU2hiT3Blbk1pc21hdGNoOworCQkJZ290byBFeGl0OworCQl9CisjaWZuZGVmIE5ERUJVRworCQl7CisJCQlpZiAoc3RybmNtcAorCQkJICAgIChwU2hiTWVtSGVhZGVyLT5tX3N6QnVmZmVySUQsIHBzekJ1ZmZlcklEX3AsCisJCQkgICAgIHNpemVvZihwU2hiTWVtSGVhZGVyLT5tX3N6QnVmZmVySUQpIC0gMSkpIHsKKwkJCQlTaGJFcnJvciA9IGtTaGJPcGVuTWlzbWF0Y2g7CisJCQkJZ290byBFeGl0OworCQkJfQorCQl9CisjZW5kaWYKKworCQlwU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQrKzsKKwl9CisKKwkvLyBzZXQgYWJzdGFyY3QgImhhbmRsZSIgZm9yIHJldHVybmluZyB0byBhcHBsaWNhdGlvbgorCXBTaGJJbnN0YW5jZSA9ICh0U2hiSW5zdGFuY2UgKikgcFNoYk1lbUluc3Q7CisKKyAgICAgIEV4aXQ6CisKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCWlmIChwU2hiTWVtSW5zdCAhPSBOVUxMKSB7CisJCQlTaGJJcGNSZWxlYXNlUHJpdmF0ZU1lbShwU2hiTWVtSW5zdCk7CisJCX0KKwkJaWYgKHBTaGFyZWRNZW0gIT0gTlVMTCkgeworCQkJVW5tYXBWaWV3T2ZGaWxlKHBTaGFyZWRNZW0pOworCQl9CisJCWlmIChoU2hhcmVkTWVtICE9IE5VTEwpIHsKKwkJCUNsb3NlSGFuZGxlKGhTaGFyZWRNZW0pOworCQl9CisJfQorCisJKnBmU2hiTmV3Q3JlYXRlZF9wID0gZlNoTWVtTmV3Q3JlYXRlZDsKKwkqcHBTaGJJbnN0YW5jZV9wID0gcFNoYkluc3RhbmNlOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNSZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCUhBTkRMRSBoRXZlbnROZXdEYXRhOworCUhBTkRMRSBoTXV0ZXhCdWZmQWNjZXNzOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3IyOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiT2spOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiSW5zdGFuY2VfcCk7CisKKwlpZiAoIS0tcFNoYk1lbUhlYWRlci0+bV91bFJlZkNvdW50KSB7CisJCVNoYkVycm9yID0ga1NoYk9rOworCX0gZWxzZSB7CisJCVNoYkVycm9yID0ga1NoYk1lbVVzZWRCeU90aGVyUHJvY3M7CisJfQorCisJU2hiRXJyb3IyID0gU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEocFNoYkluc3RhbmNlX3ApOworCWhFdmVudE5ld0RhdGEgPSBwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdOworCWlmIChoRXZlbnROZXdEYXRhICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUNsb3NlSGFuZGxlKGhFdmVudE5ld0RhdGEpOworCQlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdID0KKwkJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKworCWhNdXRleEJ1ZmZBY2Nlc3MgPSBwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzOworCWlmIChoTXV0ZXhCdWZmQWNjZXNzICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUNsb3NlSGFuZGxlKGhNdXRleEJ1ZmZBY2Nlc3MpOworCQlwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJfQorCisJVW5tYXBWaWV3T2ZGaWxlKHBTaGJNZW1IZWFkZXIpOworCWlmIChwU2hiTWVtSW5zdC0+bV9oU2hhcmVkTWVtICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUNsb3NlSGFuZGxlKHBTaGJNZW1JbnN0LT5tX2hTaGFyZWRNZW0pOworCQlwU2hiTWVtSW5zdC0+bV9oU2hhcmVkTWVtID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJfQorCisJU2hiSXBjUmVsZWFzZVByaXZhdGVNZW0ocFNoYk1lbUluc3QpOworCisJaWYgKFNoYkVycm9yID09IGtTaGJPaykgeworCQlTaGJFcnJvciA9IFNoYkVycm9yMjsKKwl9CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisjZW5kaWYgLy8gIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisjaWYgKCFkZWZpbmVkKFNIQklQQ19JTkxJTkVEKSkgfHwgZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRW50ZXIgYXRvbWljIHNlY3Rpb24gZm9yIFNoYXJlZCBCdWZmZXIgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY0VudGVyQXRvbWljU2VjdGlvbih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJSEFORExFIGhNdXRleEJ1ZmZBY2Nlc3M7CisJRFdPUkQgZHdXYWl0UmVzdWx0OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwloTXV0ZXhCdWZmQWNjZXNzID0gcFNoYk1lbUluc3QtPm1faE11dGV4QnVmZkFjY2VzczsKKwlpZiAoaE11dGV4QnVmZkFjY2VzcyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlkd1dhaXRSZXN1bHQgPQorCQkgICAgV2FpdEZvclNpbmdsZU9iamVjdChoTXV0ZXhCdWZmQWNjZXNzLCBUSU1FT1VUX0VOVEVSX0FUT01JQyk7CisJCXN3aXRjaCAoZHdXYWl0UmVzdWx0KSB7CisJCWNhc2UgV0FJVF9PQkpFQ1RfMCArIDA6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBXQUlUX1RJTUVPVVQ6CisJCQl7CisJCQkJVFJBQ0UwCisJCQkJICAgICgiXG5TaGJJcGNFbnRlckF0b21pY1NlY3Rpb24oKTogV0FJVF9USU1FT1VUIik7CisJCQkJQVNTRVJUKDApOworCQkJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBXQUlUX0FCQU5ET05FRDoKKwkJCXsKKwkJCQlUUkFDRTAKKwkJCQkgICAgKCJcblNoYklwY0VudGVyQXRvbWljU2VjdGlvbigpOiBXQUlUX0FCQU5ET05FRCIpOworCQkJCUFTU0VSVCgwKTsKKwkJCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJJbnZhbGlkOworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgV0FJVF9GQUlMRUQ6CisJCQl7CisJCQkJVFJBQ0UxCisJCQkJICAgICgiXG5TaGJJcGNFbnRlckF0b21pY1NlY3Rpb24oKTogV0FJVF9GQUlMRUQgLT4gTGFzdEVycm9yPSVsZCIsCisJCQkJICAgICBHZXRMYXN0RXJyb3IoKSk7CisJCQkJQVNTRVJUKDApOworCQkJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlUUkFDRTEKKwkJCQkgICAgKCJcblNoYklwY0VudGVyQXRvbWljU2VjdGlvbigpOiB1bmtub3duIGVycm9yIC0+IExhc3RFcnJvcj0lbGQiLAorCQkJCSAgICAgR2V0TGFzdEVycm9yKCkpOworCQkJCUFTU0VSVCgwKTsKKwkJCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJJbnZhbGlkOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJU2hiRXJyb3IgPSBrU2hiQnVmZmVySW52YWxpZDsKKwl9CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExlYXZlIGF0b21pYyBzZWN0aW9uIGZvciBTaGFyZWQgQnVmZmVyIGFjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCUhBTkRMRSBoTXV0ZXhCdWZmQWNjZXNzOworCUJPT0wgZlJlczsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaE11dGV4QnVmZkFjY2VzcyA9IHBTaGJNZW1JbnN0LT5tX2hNdXRleEJ1ZmZBY2Nlc3M7CisJaWYgKGhNdXRleEJ1ZmZBY2Nlc3MgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJZlJlcyA9IFJlbGVhc2VNdXRleChoTXV0ZXhCdWZmQWNjZXNzKTsKKwkJQVNTRVJUKGZSZXMpOworCX0gZWxzZSB7CisJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJfQorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGFydCBzaWduYWxpbmcgb2YgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHJlYWRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RhcnRTaWduYWxpbmdOZXdEYXRhKHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICAgcFNoYkluc3RhbmNlX3AsCisJCQkJCQkgICAgICB0U2lnSG5kbHJOZXdEYXRhCisJCQkJCQkgICAgICBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCQkJICAgICAgdFNoYlByaW9yaXR5CisJCQkJCQkgICAgICBTaGJQcmlvcml0eV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJY29uc3QgY2hhciAqcHN6T2JqZWN0TmFtZTsKKwlIQU5ETEUgaEV2ZW50VGVybVJlcXU7CisJSEFORExFIGhFdmVudFRlcm1SZXNwOworCUhBTkRMRSBoVGhyZWFkTmV3RGF0YTsKKwl1bnNpZ25lZCBsb25nIHVsVGhyZWFkSUROZXdEYXRhOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwlpbnQgaVByaW9yaXR5OworCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKChwU2hiTWVtSW5zdC0+bV9oVGhyZWFkTmV3RGF0YSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgfHwKKwkgICAgKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFUVVdICE9CisJICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkgICAgfHwgKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdICE9CisJCUlOVkFMSURfSEFORExFX1ZBTFVFKQorCSAgICB8fCAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkFscmVhZHlTaWduYWxpbmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wOworCisJLy8gQmVjYXVzZSB0aGUgZXZlbnQgPHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV0+CisJLy8gaXMgdXNlZCBmb3Igc2lnbmFsaW5nIG9mIG5ldyBkYXRhIGFmdGVyIGEgd3JpdGUgb3BlcmF0aW9uIHRvbyAodXNpbmcKKwkvLyBTZXRFdmVudCksIGl0IGlzIGFsd2F5cyBjcmVhdGVkIGhlcmUgKHNlZSA8U2hiSXBjQWxsb2NCdWZmZXI+KS4KKworCXBzek9iamVjdE5hbWUgPQorCSAgICBTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShOQU1FX0VWRU5UX1RFUk1fUkVRVSwKKwkJCQkgICAgICAgcFNoYk1lbUhlYWRlci0+bV9zekJ1ZmZlcklELCBGQUxTRSk7CisJaEV2ZW50VGVybVJlcXUgPSBDcmVhdGVFdmVudChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBFdmVudEF0dHJpYnV0ZXMKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJNYW51YWxSZXNldAorCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxTdGF0ZQorCQkJCSAgICAgcHN6T2JqZWN0TmFtZSk7CS8vIExQQ1RTVFIgbHBOYW1lCisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gPSBoRXZlbnRUZXJtUmVxdTsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gIT0gTlVMTCk7CisKKwlwc3pPYmplY3ROYW1lID0KKwkgICAgU2hiSXBjR2V0VW5pZm9ybU9iamVjdE5hbWUoTkFNRV9FVkVOVF9URVJNX1JFU1AsCisJCQkJICAgICAgIHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCwgRkFMU0UpOworCWhFdmVudFRlcm1SZXNwID0gQ3JlYXRlRXZlbnQoTlVMTCwJLy8gTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwRXZlbnRBdHRyaWJ1dGVzCisJCQkJICAgICBGQUxTRSwJLy8gQk9PTCBiTWFudWFsUmVzZXQKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJJbml0aWFsU3RhdGUKKwkJCQkgICAgIHBzek9iamVjdE5hbWUpOwkvLyBMUENUU1RSIGxwTmFtZQorCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdID0gaEV2ZW50VGVybVJlc3A7CisJQVNTRVJUKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdICE9IE5VTEwpOworCisJaFRocmVhZE5ld0RhdGEgPSBDcmVhdGVUaHJlYWQoTlVMTCwJLy8gTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwVGhyZWFkQXR0cmlidXRlcworCQkJCSAgICAgIDAsCS8vIFNJWkVfVCBkd1N0YWNrU2l6ZQorCQkJCSAgICAgIFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEsCS8vIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgbHBTdGFydEFkZHJlc3MKKwkJCQkgICAgICBwU2hiSW5zdGFuY2VfcCwJLy8gTFBWT0lEIGxwUGFyYW1ldGVyCisJCQkJICAgICAgMCwJLy8gRFdPUkQgZHdDcmVhdGlvbkZsYWdzCisJCQkJICAgICAgJnVsVGhyZWFkSUROZXdEYXRhKTsJLy8gTFBEV09SRCBscFRocmVhZElkCisKKwlzd2l0Y2ggKFNoYlByaW9yaXR5X3ApIHsKKwljYXNlIGtTaGJQcmlvcml0eUxvdzoKKwkJaVByaW9yaXR5ID0gVEhSRUFEX1BSSU9SSVRZX0JFTE9XX05PUk1BTDsKKwkJYnJlYWs7CisKKwljYXNlIGtTaGJQcmlvcml0eU5vcm1hbDoKKwkJaVByaW9yaXR5ID0gVEhSRUFEX1BSSU9SSVRZX05PUk1BTDsKKwkJYnJlYWs7CisKKwljYXNlIGtzaGJQcmlvcml0eUhpZ2g6CisJCWlQcmlvcml0eSA9IFRIUkVBRF9QUklPUklUWV9BQk9WRV9OT1JNQUw7CisJCWJyZWFrOworCisJfQorCisJQVNTRVJUKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhICE9IE5VTEwpOworCisJU2V0VGhyZWFkUHJpb3JpdHkoaFRocmVhZE5ld0RhdGEsIGlQcmlvcml0eSk7CisKKwlwU2hiTWVtSW5zdC0+bV9oVGhyZWFkTmV3RGF0YSA9IGhUaHJlYWROZXdEYXRhOworCisjaWZuZGVmIE5ERUJVRworCXsKKwkJcFNoYk1lbUluc3QtPm1fdWxUaHJlYWRJRE5ld0RhdGEgPSB1bFRocmVhZElETmV3RGF0YTsKKwl9CisjZW5kaWYKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RvcCBzaWduYWxpbmcgb2YgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHJlYWRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlCisJCQkJCQkgICAgIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCUhBTkRMRSBoRXZlbnRUZXJtUmVxdTsKKwlIQU5ETEUgaEV2ZW50VGVybVJlc3A7CisJRFdPUkQgZHdXYWl0UmVzdWx0OworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKworCS8vIHRlcm1pbmF0ZSBuZXcgZGF0YSBzaWduYWxpbmcgdGhyZWFkCisJLy8gKHNldCBldmVudCA8aEV2ZW50VGVybVJlcXU+IHRvIHdha2V1cCB0aGUgdGhyZWFkIGFuZCBkaXNwb3NlIGl0CisJLy8gdG8gZXhpdCwgdGhlbiB3YWl0IGZvciBjb25maXJtYXRpb24gdXNpbmcgZXZlbnQgPGhFdmVudFRlcm1SZXNwPikKKwloRXZlbnRUZXJtUmVxdSA9IHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFUVVdOworCWhFdmVudFRlcm1SZXNwID0gcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF07CisJaWYgKChoRXZlbnRUZXJtUmVxdSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYKKwkgICAgKGhFdmVudFRlcm1SZXNwICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSkgeworCQlUUkFDRTAoIlxuU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEoKTogZW50ZXIgd2FpdCBzdGF0ZSIpOworCQlkd1dhaXRSZXN1bHQgPSBTaWduYWxPYmplY3RBbmRXYWl0KGhFdmVudFRlcm1SZXF1LAkvLyBIQU5ETEUgaE9iamVjdFRvU2lnbmFsCisJCQkJCQkgICBoRXZlbnRUZXJtUmVzcCwJLy8gSEFORExFIGhPYmplY3RUb1dhaXRPbgorCQkJCQkJICAgVElNRU9VVF9URVJNX1RIUkVBRCwJLy8gRFdPUkQgZHdNaWxsaXNlY29uZHMKKwkJCQkJCSAgIEZBTFNFKTsJLy8gQk9PTCBiQWxlcnRhYmxlCisJCVRSQUNFMAorCQkgICAgKCJcblNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKCk6IHdhaXQgc3RhdGUgbGVhdmVkOiAtLS0+ICIpOworCQlzd2l0Y2ggKGR3V2FpdFJlc3VsdCkgeworCQljYXNlIFdBSVRfT0JKRUNUXzAgKyAwOgkvLyBldmVudCAibmV3IGRhdGEgc2lnbmFsaW5nIHRocmVhZCB0ZXJtaW5hdGVkIgorCQkJeworCQkJCVRSQUNFMCgiRXZlbnQgPSBXQUlUX09CSkVDVF8wKzAiKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCVRSQUNFMCgiVW5oYW5kbGVkIEV2ZW50Iik7CisJCQkJQVNTRVJUKDApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUNsb3NlSGFuZGxlKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhKTsKKwkJcFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gIT0KKwkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0pOworCQlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSA9CisJCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gIT0KKwkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0pOworCQlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSA9CisJCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBOVUxMOworCisJcmV0dXJuIChrU2hiT2spOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2lnbmFsIG5ldyBkYXRhIChjYWxsZWQgZnJvbSB3cml0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1NpZ25hbE5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCUhBTkRMRSBoRXZlbnROZXdEYXRhOworCUJPT0wgZlJlczsKKworCS8vIFRSQUNFMCgiXG5TaGJJcGNTaWduYWxOZXdEYXRhKCk6IGVudGVyXG4iKTsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXSAhPQorCSAgICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisJaEV2ZW50TmV3RGF0YSA9IHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV07CisJaWYgKGhFdmVudE5ld0RhdGEgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJZlJlcyA9IFNldEV2ZW50KGhFdmVudE5ld0RhdGEpOworCQkvLyBUUkFDRTEoIlxuU2hiSXBjU2lnbmFsTmV3RGF0YSgpOiBFdmVudE5ld0RhdGEgc2V0IChSZXN1bHQ9JWQpXG4iLCAoaW50KWZSZXMpOworCQlBU1NFUlQoZlJlcyk7CisJfQorCS8vIFRSQUNFMCgiXG5TaGJJcGNTaWduYWxOZXdEYXRhKCk6IGxlYXZlXG4iKTsKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGFydCBzaWduYWxpbmcgZm9yIGpvYiByZWFkeSAoY2FsbGVkIGZyb20gd2FpdGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdGFydFNpZ25hbGluZ0pvYlJlYWR5KHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICAgIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcKKwkJCQkJCSAgICAgICB1bFRpbWVPdXRfcCwKKwkJCQkJCSAgICAgICB0U2lnSG5kbHJKb2JSZWFkeQorCQkJCQkJICAgICAgIHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJSEFORExFIGhUaHJlYWRKb2JSZWFkeTsKKwl1bnNpZ25lZCBsb25nIHVsVGhyZWFkSURKb2JSZWFkeTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKChwU2hiTWVtSW5zdC0+bV9oVGhyZWFkSm9iUmVhZHkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHx8CisJICAgIChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ICE9IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkFscmVhZHlTaWduYWxpbmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSA9IHVsVGltZU91dF9wOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcDsKKworCS8vIEJlY2F1c2UgdGhlIGV2ZW50IDxwU2hiTWVtSW5zdC0+bV9haEV2ZW50Sm9iUmVhZHk+IGlzIHVzZWQgZm9yCisJLy8gc2lnbmFsaW5nIG9mIGEgZmluaXNoZWQgam9iIHRvbyAodXNpbmcgU2V0RXZlbnQpLCBpdCBpcyBhbHdheXMKKwkvLyBjcmVhdGVkIGhlcmUgKHNlZSA8U2hiSXBjQWxsb2NCdWZmZXI+KS4KKworCWhUaHJlYWRKb2JSZWFkeSA9IENyZWF0ZVRocmVhZChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBUaHJlYWRBdHRyaWJ1dGVzCisJCQkJICAgICAgIDAsCS8vIFNJWkVfVCBkd1N0YWNrU2l6ZQorCQkJCSAgICAgICBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSwJLy8gTFBUSFJFQURfU1RBUlRfUk9VVElORSBscFN0YXJ0QWRkcmVzcworCQkJCSAgICAgICBwU2hiSW5zdGFuY2VfcCwJLy8gTFBWT0lEIGxwUGFyYW1ldGVyCisJCQkJICAgICAgIDAsCS8vIERXT1JEIGR3Q3JlYXRpb25GbGFncworCQkJCSAgICAgICAmdWxUaHJlYWRJREpvYlJlYWR5KTsJLy8gTFBEV09SRCBscFRocmVhZElkCisKKwlwU2hiTWVtSW5zdC0+bV9oVGhyZWFkSm9iUmVhZHkgPSBoVGhyZWFkSm9iUmVhZHk7CisJQVNTRVJUKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWRKb2JSZWFkeSAhPSBOVUxMKTsKKworI2lmbmRlZiBOREVCVUcKKwl7CisJCXBTaGJNZW1JbnN0LT5tX3VsVGhyZWFkSURKb2JSZWFkeSA9IHVsVGhyZWFkSURKb2JSZWFkeTsKKwl9CisjZW5kaWYKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2lnbmFsIGpvYiByZWFkeSAoY2FsbGVkIGZyb20gZXhlY3V0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1NpZ25hbEpvYlJlYWR5KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwlIQU5ETEUgaEV2ZW50Sm9iUmVhZHk7CisJQk9PTCBmUmVzOworCisJLy8gVFJBQ0UwKCJcblNoYklwY1NpZ25hbEpvYlJlYWR5KCk6IGVudGVyXG4iKTsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworCWhFdmVudEpvYlJlYWR5ID0gcFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHk7CisJaWYgKGhFdmVudEpvYlJlYWR5ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCWZSZXMgPSBTZXRFdmVudChoRXZlbnRKb2JSZWFkeSk7CisJCS8vIFRSQUNFMSgiXG5TaGJJcGNTaWduYWxKb2JSZWFkeSgpOiBFdmVudEpvYlJlYWR5IHNldCAoUmVzdWx0PSVkKVxuIiwgKGludClmUmVzKTsKKwkJQVNTRVJUKGZSZXMpOworCX0KKwkvLyBUUkFDRTAoIlxuU2hiSXBjU2lnbmFsSm9iUmVhZHkoKTogbGVhdmVcbiIpOworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIGNvbW1vbiB1c2VkIHNoYXJlIG1lbW9yeSBhcmVhCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCAqU2hiSXBjR2V0U2hNZW1QdHIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl2b2lkICpwU2hiU2hNZW1QdHI7CisKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJJbnN0YW5jZV9wKTsKKwlpZiAocFNoYk1lbUhlYWRlciAhPSBOVUxMKSB7CisJCXBTaGJTaE1lbVB0ciA9IChCWVRFICopIHBTaGJNZW1IZWFkZXIgKyBzaXplb2YodFNoYk1lbUhlYWRlcik7CisJfSBlbHNlIHsKKwkJcFNoYlNoTWVtUHRyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gKHBTaGJTaE1lbVB0cik7CisKK30KKworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gcHJvY2VzcyBzcGVjaWZpYyBtZW1wb29sCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCAqU2hiSXBjQWxsb2NQcml2YXRlTWVtKHVuc2lnbmVkIGxvbmcgdWxNZW1TaXplX3ApCit7CisKKwlIR0xPQkFMIGhNZW07CisJdm9pZCAqcE1lbTsKKworCWhNZW0gPSBHbG9iYWxBbGxvYyhHTUVNX0ZJWEVELCB1bE1lbVNpemVfcCArIHNpemVvZihIR0xPQkFMKSk7CisJcE1lbSA9IEdsb2JhbExvY2soaE1lbSk7CisJaWYgKHBNZW0gIT0gTlVMTCkgeworCQkqKEhHTE9CQUwgKikgcE1lbSA9IGhNZW07CisJCShCWVRFICopIHBNZW0gKz0gc2l6ZW9mKEhHTE9CQUwpOworCX0KKworI2lmbmRlZiBOREVCVUcKKwl7CisJCW1lbXNldChwTWVtLCAweGFhLCB1bE1lbVNpemVfcCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gKHBNZW0pOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVsZWFzZSBhIG1lbW9yeSBibG9jayBmcm9tIHByb2Nlc3Mgc3BlY2lmaWMgbWVtcG9vbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgU2hiSXBjUmVsZWFzZVByaXZhdGVNZW0odm9pZCAqcE1lbV9wKQoreworCisJSEdMT0JBTCBoTWVtOworCisJaWYgKHBNZW1fcCA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwkoQllURSAqKSBwTWVtX3AgLT0gc2l6ZW9mKEhHTE9CQUwpOworCWhNZW0gPSAqKEhHTE9CQUwgKikgcE1lbV9wOworCisJR2xvYmFsVW5sb2NrKGhNZW0pOworCUdsb2JhbEZyZWUoaE1lbSk7CisKKwlyZXR1cm47CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDcmVhdGUgdW5pZm9ybSBvYmplY3QgbmFtZSAobmVlZGVkIGZvciBpbnRlci1wcm9jZXNzIGNvbW11bmljYXRpb24pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyICpTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShjb25zdCBjaGFyICpwc3pPYmplY3RKb2JOYW1lX3AsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkJICAgICAgIEJPT0wgZkdsb2JhbE9iamVjdF9wKQoreworCisJc3RhdGljIGNoYXIgc3pPYmplY3ROYW1lW01BWF9QQVRIXTsKKwljaGFyIHN6T2JqZWN0UHJlZml4W01BWF9QQVRIXTsKKworCWlmIChmR2xvYmFsT2JqZWN0X3ApIHsKKwkJc3RybmNweShzek9iamVjdFByZWZpeCwgIkdsb2JhbFxcIiwgc2l6ZW9mKHN6T2JqZWN0UHJlZml4KSk7CisJfSBlbHNlIHsKKwkJX3NucHJpbnRmKHN6T2JqZWN0UHJlZml4LCBzaXplb2Yoc3pPYmplY3RQcmVmaXgpLCAiUElEJTA4bFhfIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpR2V0Q3VycmVudFByb2Nlc3NJZCgpKTsKKwl9CisKKwlfc25wcmludGYoc3pPYmplY3ROYW1lLCBzaXplb2Yoc3pPYmplY3ROYW1lKSwgIiVzJXMjJXMiLAorCQkgIHN6T2JqZWN0UHJlZml4LCBwc3pCdWZmZXJJRF9wLCBwc3pPYmplY3RKb2JOYW1lX3ApOworCisJcmV0dXJuIChzek9iamVjdE5hbWUpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhyZWFkIGZvciBuZXcgZGF0YSBzaWduYWxpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RXT1JEIFdJTkFQSSBTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKExQVk9JRCBwdlRocmVhZFBhcmFtX3ApCit7CisKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwlEV09SRCBkd1dhaXRSZXN1bHQ7CisJQk9PTCBmVGVybVJlcXU7CisJaW50IGZDYWxsQWdhaW47CisKKwlUUkFDRTEKKwkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoKTogU2lnbmFsVGhyZWFkIHN0YXJ0ZWQgKHBTaGJJbnN0YW5jZT0weCUwOGxYKVxuIiwKKwkgICAgIChEV09SRCkgcHZUaHJlYWRQYXJhbV9wKTsKKworCXBTaGJJbnN0YW5jZSA9ICh0U2hiTWVtSW5zdCAqKSBwdlRocmVhZFBhcmFtX3A7CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZSk7CisJZlRlcm1SZXF1ID0gRkFMU0U7CisKKwlkbyB7CisJCUFTU0VSVCgocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbMF0gIT0KKwkJCUlOVkFMSURfSEFORExFX1ZBTFVFKQorCQkgICAgICAgJiYgKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhWzBdICE9IE5VTEwpKTsKKwkJQVNTRVJUKChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVsxXSAhPQorCQkJSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJCSAgICAgICAmJiAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbMV0gIT0gTlVMTCkpOworCisJCVRSQUNFMCgiXG5TaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCk6IGVudGVyIHdhaXQgc3RhdGUiKTsKKwkJZHdXYWl0UmVzdWx0ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cygyLAkvLyBEV09SRCBuQ291bnQKKwkJCQkJCSAgICAgIHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhLAkvLyBjb25zdCBIQU5ETEUqIGxwSGFuZGxlcworCQkJCQkJICAgICAgRkFMU0UsCS8vIEJPT0wgYldhaXRBbGwKKwkJCQkJCSAgICAgIElORklOSVRFKTsJLy8gRFdPUkQgZHdNaWxsaXNlY29uZHMKKwkJVFJBQ0UwCisJCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSgpOiB3YWl0IHN0YXRlIGxlYXZlZDogLS0tPiAiKTsKKwkJc3dpdGNoIChkd1dhaXRSZXN1bHQpIHsKKwkJY2FzZSBXQUlUX09CSkVDVF8wICsgMDoJLy8gZXZlbnQgIm5ldyBkYXRhIgorCQkJeworCQkJCVRSQUNFMCgiRXZlbnQgPSBXQUlUX09CSkVDVF8wKzAiKTsKKwkJCQlpZiAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpIHsKKwkJCQkJVFJBQ0UwCisJCQkJCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSgpOiBjYWxsaW5nIFNpZ25hbEhhbmRsZXJOZXdEYXRhIik7CisJCQkJCWRvIHsKKwkJCQkJCWZDYWxsQWdhaW4gPQorCQkJCQkJICAgIHBTaGJNZW1JbnN0LT4KKwkJCQkJCSAgICBtX3BmblNpZ0huZGxyTmV3RGF0YQorCQkJCQkJICAgIChwU2hiSW5zdGFuY2UpOworCQkJCQkJLy8gZC5rLjogdHJ5IHRvIHJ1biBhbnkgc2hhcmVkIGJ1ZmZlciB3aGljaCBoYXMgaGlnaGVyIHByaW9yaXR5LgorCQkJCQkJLy8gICAgICAgICAgIHVuZGVyIFdpbmRvd3MgdGhpcyBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBXaW5kb3dzIHNjaGVkdWxlcgorCQkJCQkJLy8gICAgICAgICAgIGFscmVhZHkgcHJlZW1wdHMgdGFza3Mgd2l0aCBsb3dlciBwcmlvcml0eS4KKwkJCQkJfSB3aGlsZSAoZkNhbGxBZ2FpbiAhPSBGQUxTRSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgV0FJVF9PQkpFQ1RfMCArIDE6CS8vIGV2ZW50ICJ0ZXJtaW5hdGUiCisJCQl7CisJCQkJVFJBQ0UwKCJFdmVudCA9IFdBSVRfT0JKRUNUXzArMSIpOworCQkJCWZUZXJtUmVxdSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlUUkFDRTAoIlVuaGFuZGxlZCBFdmVudCIpOworCQkJCUFTU0VSVCgwKTsKKwkJCQlmVGVybVJlcXUgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXdoaWxlICghZlRlcm1SZXF1KTsKKworCWlmIChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSAhPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlTZXRFdmVudChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSk7CisJfQorCisJVFJBQ0UxCisJICAgICgiXG5TaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCk6IFNpZ25hbFRocmVhZCB0ZXJtaW5hdGVkIChwU2hiSW5zdGFuY2U9MHglMDhsWClcbiIsCisJICAgICAoRFdPUkQpIHBTaGJJbnN0YW5jZSk7CisKKwlFeGl0VGhyZWFkKDApOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhyZWFkIGZvciBuZXcgZGF0YSBzaWduYWxpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RXT1JEIFdJTkFQSSBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeShMUFZPSUQgcHZUaHJlYWRQYXJhbV9wKQoreworCisJdFNoYkluc3RhbmNlICpwU2hiSW5zdGFuY2U7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCURXT1JEIHVsVGltZU91dDsKKwlEV09SRCBkd1dhaXRSZXN1bHQ7CisJdW5zaWduZWQgaW50IGZUaW1lT3V0OworCisJVFJBQ0UxCisJICAgICgiXG5TaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSgpOiBTaWduYWxUaHJlYWQgc3RhcnRlZCAocFNoYkluc3RhbmNlPTB4JTA4bFgpXG4iLAorCSAgICAgKERXT1JEKSBwdlRocmVhZFBhcmFtX3ApOworCisJcFNoYkluc3RhbmNlID0gKHRTaGJJbnN0YW5jZSAqKSBwdlRocmVhZFBhcmFtX3A7CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZSk7CisJZlRpbWVPdXQgPSBGQUxTRTsKKworCWlmIChwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSAhPSAwKSB7CisJCXVsVGltZU91dCA9IHBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5OworCX0gZWxzZSB7CisJCXVsVGltZU91dCA9IElORklOSVRFOworCX0KKworCUFTU0VSVCgocFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJICAgICAgICYmIChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSAhPSBOVUxMKSk7CisKKwlUUkFDRTAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoKTogZW50ZXIgd2FpdCBzdGF0ZSIpOworCWR3V2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QocFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHksCS8vIEhBTkRMRSBoSGFuZGxlCisJCQkJCSAgIHVsVGltZU91dCk7CS8vIERXT1JEIGR3TWlsbGlzZWNvbmRzCisJVFJBQ0UwKCJcblNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KCk6IHdhaXQgc3RhdGUgbGVhdmVkOiAtLS0+ICIpOworCXN3aXRjaCAoZHdXYWl0UmVzdWx0KSB7CisJY2FzZSBXQUlUX09CSkVDVF8wICsgMDoJLy8gZXZlbnQgIm5ldyBkYXRhIgorCQl7CisJCQlUUkFDRTAoIkV2ZW50ID0gV0FJVF9PQkpFQ1RfMCswIik7CisJCQlmVGltZU91dCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgV0FJVF9USU1FT1VUOgorCQl7CisJCQlUUkFDRTAoIlxuRXZlbnQgPSBXQUlUX1RJTUVPVVQiKTsKKwkJCWZUaW1lT3V0ID0gVFJVRTsKKwkJCS8vIEFTU0VSVCgwKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlUUkFDRTAoIlVuaGFuZGxlZCBFdmVudCIpOworCQkJZlRpbWVPdXQgPSBUUlVFOworCQkJQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSAhPSBOVUxMKSB7CisJCVRSQUNFMAorCQkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KCk6IGNhbGxpbmcgU2lnbmFsSGFuZGxlckpvYlJlYWR5Iik7CisJCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkocFNoYkluc3RhbmNlLCBmVGltZU91dCk7CisJfQorCisJcFNoYk1lbUluc3QtPm1faFRocmVhZEpvYlJlYWR5ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IE5VTEw7CisKKwlUUkFDRTEKKwkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KCk6IFNpZ25hbFRocmVhZCB0ZXJtaW5hdGVkIChwU2hiSW5zdGFuY2U9MHglMDhsWClcbiIsCisJICAgICAoRFdPUkQpIHBTaGJJbnN0YW5jZSk7CisKKwlFeGl0VGhyZWFkKDApOworCit9CisKKyNlbmRpZgorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZDg4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgUHJvamVjdCBpbmRlcGVuZGVuZCBzaGFyZWQgYnVmZmVyIChsaW5lYXIgKyBjaXJjdWxhcikKKworICBEZXNjcmlwdGlvbjogIERlY2xhcmF0aW9uIG9mIHBsYXRmb3JtIHNwZWNpZmljIHBhcnQgZm9yIHRoZQorICAgICAgICAgICAgICAgIHNoYXJlZCBidWZmZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAyMDA2LzA2LzI3IC1yczogICBWIDEuMDAgKGluaXRpYWwgdmVyc2lvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0hCSVBDX0hfCisjZGVmaW5lIF9TSEJJUENfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUeXBlIGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGludCAoKnRTaWdIbmRsck5ld0RhdGEpICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOwordHlwZWRlZiB2b2lkICgqdFNpZ0huZGxySm9iUmVhZHkpICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgdW5zaWduZWQgaW50IGZUaW1lT3V0X3ApOworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKyNpZiBkZWZpbmVkKElOTElORV9GVU5DVElPTl9ERUYpCisjdW5kZWYgIElOTElORV9GVU5DVElPTgorI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYKKyNkZWZpbmUgU0hCSVBDX0lOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2RlZmluZSBTSEJJUENfSU5MSU5FRAorI2luY2x1ZGUgIlNoYklwYy1XaW4zMi5jIgorI2VuZGlmCisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pCisjaWYgZGVmaW5lZChJTkxJTkVfRlVOQ1RJT05fREVGKQorI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisjZGVmaW5lIFNIQklQQ19JTkxJTkVfRU5BQkxFRCAgICAgIFRSVUUKKyNkZWZpbmUgU0hCSVBDX0lOTElORUQKKyNpbmNsdWRlICJTaGJJcGMtTGludXhLZXJuZWwuYyIKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY0luaXQodm9pZCk7Cit0U2hiRXJyb3IgU2hiSXBjRXhpdCh2b2lkKTsKKwordFNoYkVycm9yIFNoYklwY0FsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCk7Cit0U2hiRXJyb3IgU2hiSXBjUmVsZWFzZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCit0U2hiRXJyb3IgU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7Cit0U2hiRXJyb3IgU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisKK3RTaGJFcnJvciBTaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgIHRTaWdIbmRsck5ld0RhdGEKKwkJCQkgICAgICBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCSAgICAgIHRTaGJQcmlvcml0eSBTaGJQcmlvcml0eV9wKTsKK3RTaGJFcnJvciBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOwordFNoYkVycm9yIFNoYklwY1NpZ25hbE5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwordFNoYkVycm9yIFNoYklwY1N0YXJ0U2lnbmFsaW5nSm9iUmVhZHkodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZU91dF9wLAorCQkJCSAgICAgICB0U2lnSG5kbHJKb2JSZWFkeQorCQkJCSAgICAgICBwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcCk7Cit0U2hiRXJyb3IgU2hiSXBjU2lnbmFsSm9iUmVhZHkodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwordm9pZCAqU2hiSXBjR2V0U2hNZW1QdHIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKyNlbmRpZgorCisjdW5kZWYgIFNIQklQQ19JTkxJTkVfRU5BQkxFRAkvLyBkaXNhYmxlIGFjdHVhbCBpbmxpbmluZyBvZiBmdW5jdGlvbnMKKyN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisjZGVmaW5lIElOTElORV9GVU5DVElPTgkJLy8gZGVmaW5lIElOTElORV9GVU5DVElPTiB0byBub3RoaW5nCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9TSEJJUENfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiTGludXhLZXJuZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiTGludXhLZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTI3MDJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJMaW51eEtlcm5lbC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgRGVjbGFyYXRpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDcvMjAgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TSEJMSU5VWEtFUk5FTF9IXworI2RlZmluZSBfU0hCTElOVVhLRVJORUxfSF8KKworc3RydWN0IHNTaGJNZW1UYWJsZSB7CisJaW50IG1faUJ1ZmZlcklkOworCXZvaWQgKm1fcEJ1ZmZlcjsKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICptX3BzTmV4dE1lbVRhYmxlRWxlbWVudDsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisKKyNlbmRpZiAvLyBfU0hCTElOVVhLRVJORUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJiYzRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9Tb2NrZXRMaW51eEtlcm5lbC5jCkBAIC0wLDAgKzEsMTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgV3JhcHBlciBmb3IgQlNEIHNvY2tldCBBUEkgZm9yIExpbnV4IGtlcm5lbAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IFNvY2tldExpbnV4S2VybmVsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOC8yNSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgIlNvY2tldExpbnV4S2VybmVsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEtlcm5lbCBNb2R1bGUgc3BlY2lmaWMgRGF0YSBTdHJ1Y3R1cmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NPQ0tFVCBzb2NrZXQoaW50IGFmLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworCWludCByYzsKKwlTT0NLRVQgc29ja2V0OworCisJcmMgPSBzb2NrX2NyZWF0ZV9rZXJuKGFmLCB0eXBlLCBwcm90b2NvbCwgJnNvY2tldCk7CisJaWYgKHJjIDwgMCkgeworCQlzb2NrZXQgPSBOVUxMOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBzb2NrZXQ7Cit9CisKK2ludCBiaW5kKFNPQ0tFVCBzb2NrZXRfcCwgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKK3sKKwlpbnQgcmM7CisKKwlyYyA9IHNvY2tldF9wLT5vcHMtPmJpbmQoc29ja2V0X3AsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLCBhZGRybGVuKTsKKworCXJldHVybiByYzsKK30KKworaW50IGNsb3Nlc29ja2V0KFNPQ0tFVCBzb2NrZXRfcCkKK3sKKwlzb2NrX3JlbGVhc2Uoc29ja2V0X3ApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByZWN2ZnJvbShTT0NLRVQgc29ja2V0X3AsIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdzLAorCSAgICAgc3RydWN0IHNvY2thZGRyICpmcm9tLCBpbnQgKmZyb21sZW4pCit7CisJaW50IHJjOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdjsKKworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX25hbWUgPSBmcm9tOwkvLyB3aWxsIGJlIHN0cnVjdCBzb2NrX2FkZHIKKwltc2cubXNnX25hbWVsZW4gPSAqZnJvbWxlbjsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKwlpb3YuaW92X2Jhc2UgPSBidWY7CisKKwlyYyA9IGtlcm5lbF9yZWN2bXNnKHNvY2tldF9wLCAmbXNnLCAmaW92LCAxLCBpb3YuaW92X2xlbiwgMCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBzZW5kdG8oU09DS0VUIHNvY2tldF9wLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncywKKwkgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBpbnQgdG9sZW4pCit7CisJaW50IHJjOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdjsKKworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX25hbWUgPSAoc3RydWN0IHNvY2thZGRyICopdG87CS8vIHdpbGwgYmUgc3RydWN0IHNvY2tfYWRkcgorCW1zZy5tc2dfbmFtZWxlbiA9IHRvbGVuOworCW1zZy5tc2dfZmxhZ3MgPSAwOworCWlvdi5pb3ZfbGVuID0gbGVuOworCWlvdi5pb3ZfYmFzZSA9IChjaGFyICopYnVmOworCisJcmMgPSBrZXJuZWxfc2VuZG1zZyhzb2NrZXRfcCwgJm1zZywgJmlvdiwgMSwgbGVuKTsKKworCXJldHVybiByYzsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1NvY2tldExpbnV4S2VybmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NvY2tldExpbnV4S2VybmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxZDYxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuaApAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgQlNEIHNvY2tldCBBUEkgZm9yIExpbnV4IGtlcm5lbAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IFNvY2tldExpbnV4S2VybmVsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgS0VJTCB1VmlzaW9uIDIKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA4LzI1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NPQ0tFVExJTlVYS0VSTkVMX0hfCisjZGVmaW5lIF9TT0NLRVRMSU5VWEtFUk5FTF9IXworCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgSU5WQUxJRF9TT0NLRVQgIDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHNvY2tldCAqU09DS0VUOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IGJpbmQoU09DS0VUIHMsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4pOworCitpbnQgY2xvc2Vzb2NrZXQoU09DS0VUIHMpOworCitpbnQgcmVjdmZyb20oU09DS0VUIHMsIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sCisJICAgICBpbnQgKmZyb21sZW4pOworCitpbnQgc2VuZHRvKFNPQ0tFVCBzLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncywKKwkgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBpbnQgdG9sZW4pOworCitTT0NLRVQgc29ja2V0KGludCBhZiwgaW50IHR5cGUsIGludCBwcm90b2NvbCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9TT0NLRVRMSU5VWEtFUk5FTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9UaW1lckhpZ2hSZXNrWDg2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1RpbWVySGlnaFJlc2tYODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmVlZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9UaW1lckhpZ2hSZXNrWDg2LmMKQEAgLTAsMCArMSw1MjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICB0YXJnZXQgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICAgICBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlIGZvciBYODYgdW5kZXIgTGludXgKKyAgICAgICAgICAgICAgICBUaGUgTGludXgga2VybmVsIGhhcyB0byBiZSBjb21waWxlZCB3aXRoIGhpZ2ggcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgIHRpbWVycyBlbmFibGVkLiBUaGlzIGlzIGRvbmUgYnkgY29uZmlndXJpbmcgdGhlIGtlcm5lbAorICAgICAgICAgICAgICAgIHdpdGggQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBlbmFibGVkLgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IFRpbWVySGlnaFJlc2tYODYuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozODowMSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR05VCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJIaWdoUmVzay5oIgorI2luY2x1ZGUgIkJlbmNobWFyay5oIgorCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFRJTUVSX0NPVU5UICAgICAgICAgICAyCS8qIG1heCAxNSB0aW1lcnMgc2VsZWN0YWJsZSAqLworI2RlZmluZSBUSU1FUl9NSU5fVkFMX1NJTkdMRSAgNTAwMAkvKiBtaW4gNXVzICovCisjZGVmaW5lIFRJTUVSX01JTl9WQUxfQ1lDTEUgICAxMDAwMDAJLyogbWluIDEwMHVzICovCisKKyNkZWZpbmUgUFJPVkVfT1ZFUlJVTgorCisjaWZuZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKyNlcnJvciAiS2VybmVsIHN5bWJvbCBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIHJlcXVpcmVkLiIKKyNlbmRpZgorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCisjZW5kaWYKKyNkZWZpbmUgSFJUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKEV2ZW50X3AsIHVpTm9kZUlkX3AsIHdFcnJvckNvZGVfcCkgXAorICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoMHhFIDw8IDI4KSB8IChFdmVudF9wIDw8IDI0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHVpTm9kZUlkX3AgPDwgMTYpIHwgd0Vycm9yQ29kZV9wKQorCisjZGVmaW5lIFRJTUVSSERMX01BU0sgICAgICAgICAweDBGRkZGRkZGCisjZGVmaW5lIFRJTUVSSERMX1NISUZUICAgICAgICAyOAorI2RlZmluZSBIRExfVE9fSURYKEhkbCkgICAgICAgKChIZGwgPj4gVElNRVJIRExfU0hJRlQpIC0gMSkKKyNkZWZpbmUgSERMX0lOSVQoSWR4KSAgICAgICAgICgoSWR4ICsgMSkgPDwgVElNRVJIRExfU0hJRlQpCisjZGVmaW5lIEhETF9JTkMoSGRsKSAgICAgICAgICAoKChIZGwgKyAxKSAmIFRJTUVSSERMX01BU0spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChIZGwgJiB+VElNRVJIRExfTUFTSykpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJFdmVudEFyZyBtX0V2ZW50QXJnOworCXRFcGxUaW1lcmtDYWxsYmFjayBtX3BmbkNhbGxiYWNrOworCXN0cnVjdCBocnRpbWVyIG1fVGltZXI7CisJQk9PTCBtX2ZDb250aW51b3VzbHk7CisJdW5zaWduZWQgbG9uZyBsb25nIG1fdWxsUGVyaW9kOworCit9IHRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gbV9hVGltZXJJbmZvW1RJTUVSX0NPVU5UXTsKKworfSB0RXBsVGltZXJIaWdoUmVza0luc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2UgRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2w7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlbnVtIGhydGltZXJfcmVzdGFydCBFcGxUaW1lckhpZ2hSZXNrQ2FsbGJhY2soc3RydWN0IGhydGltZXIgKnBUaW1lcl9wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVySGlnaFJlc2tJbml0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdGlhbGl6ZXMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUuCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0luaXQodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFRpbWVySGlnaFJlc2tBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrQWRkSW5zdGFuY2Uodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRVBMX01FTVNFVCgmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wsIDAsCisJCSAgIHNpemVvZihFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbCkpOworCisjaWZuZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlwcmludGsKKwkgICAgKCJFcGxUaW1lckhpZ2hSZXNrOiBLZXJuZWwgc3ltYm9sIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgcmVxdWlyZWQuXG4iKTsKKwlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwlyZXR1cm4gUmV0OworI2VuZGlmCisKKwkvKgorCSAqIEluaXRpYWxpemUgaHJ0aW1lciBzdHJ1Y3R1cmVzIGZvciBhbGwgdXNhYmxlIHRpbWVycy4KKwkgKi8KKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgVElNRVJfQ09VTlQ7IHVpSW5kZXgrKykgeworCQl0RXBsVGltZXJIaWdoUmVza1RpbWVySW5mbyAqcFRpbWVySW5mbzsKKwkJc3RydWN0IGhydGltZXIgKnBUaW1lcjsKKworCQlwVGltZXJJbmZvID0gJkVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZV9sLm1fYVRpbWVySW5mb1t1aUluZGV4XTsKKwkJcFRpbWVyID0gJnBUaW1lckluZm8tPm1fVGltZXI7CisJCWhydGltZXJfaW5pdChwVGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CisKKwkJcFRpbWVyLT5mdW5jdGlvbiA9IEVwbFRpbWVySGlnaFJlc2tDYWxsYmFjazsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrRGVsSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzaHV0cyBkb3duIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tEZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvICpwVGltZXJJbmZvOworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUluZGV4OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgVElNRVJfQ09VTlQ7IHVpSW5kZXgrKykgeworCQlwVGltZXJJbmZvID0gJkVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZV9sLm1fYVRpbWVySW5mb1swXTsKKwkJcFRpbWVySW5mby0+bV9wZm5DYWxsYmFjayA9IE5VTEw7CisJCXBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCA9IDA7CisJCS8qCisJCSAqIEluIHRoaXMgY2FzZSB3ZSBjYW4gbm90IGp1c3QgdHJ5IHRvIGNhbmNlbCB0aGUgdGltZXIuCisJCSAqIFdlIGFjdHVhbGx5IGhhdmUgdG8gd2FpdCB1bnRpbCBpdHMgY2FsbGJhY2sgZnVuY3Rpb24KKwkJICogaGFzIHJldHVybmVkLgorCQkgKi8KKwkJaHJ0aW1lcl9jYW5jZWwoJnBUaW1lckluZm8tPm1fVGltZXIpOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnMoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBtb2RpZmllcyB0aGUgdGltZW91dCBvZiB0aGUgdGltZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGhhbmRsZS4KKy8vICAgICAgICAgICAgICBJZiB0aGUgaGFuZGxlIHRoZSBwb2ludGVyIHBvaW50cyB0byBpcyB6ZXJvLCB0aGUgdGltZXIgbXVzdAorLy8gICAgICAgICAgICAgIGJlIGNyZWF0ZWQgZmlyc3QuCisvLyAgICAgICAgICAgICAgSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHN0b3AgdGhlIG9sZCB0aW1lciwKKy8vICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGFsd2F5cyBhc3N1cmVzIHRoYXQgdGhlIG9sZCB0aW1lciBkb2VzIG5vdAorLy8gICAgICAgICAgICAgIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgaGFuZGxlIGFzIHRoZSBuZXcKKy8vICAgICAgICAgICAgICB0aW1lci4gVGhhdCBtZWFucyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBjaGVjayB0aGUgcGFzc2VkCisvLyAgICAgICAgICAgICAgaGFuZGxlIHdpdGggdGhlIG9uZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLiBJZiB0aGVzZSBhcmUKKy8vICAgICAgICAgICAgICB1bmVxdWFsLCB0aGUgY2FsbCBjYW4gYmUgZGlzY2FyZGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCAgICAgPSBwb2ludGVyIHRvIHRpbWVyIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsbFRpbWVOc19wICAgICA9IHJlbGF0aXZlIHRpbWVvdXQgaW4gW25zXQorLy8gICAgICAgICAgICAgIHBmbkNhbGxiYWNrX3AgICA9IGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgbXV0dWFsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlIHdpdGggdGhlIEVkcnYgY2FsbGJhY2sgZnVuY3Rpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJ4IGFuZCBUeCkuCisvLyAgICAgICAgICAgICAgdWxBcmd1bWVudF9wICAgID0gdXNlci1zcGVjaWZpYyBhcmd1bWVudAorLy8gICAgICAgICAgICAgIGZDb250aW51b3VzbHlfcCA9IGlmIFRSVUUsIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91c2x5OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgaXQgaXMgYSBvbmVzaG90IHRpbWVyLgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyB1bGxUaW1lTnNfcCwKKwkJCQkJCXRFcGxUaW1lcmtDYWxsYmFjaworCQkJCQkJcGZuQ2FsbGJhY2tfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgdWxBcmd1bWVudF9wLAorCQkJCQkJQk9PTCBmQ29udGludW91c2x5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gKnBUaW1lckluZm87CisJa3RpbWVfdCBSZWxUaW1lOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKnBUaW1lckhkbF9wID09IDApIHsJLy8gbm8gdGltZXIgY3JlYXRlZCB5ZXQKKworCQkvLyBzZWFyY2ggZnJlZSB0aW1lciBpbmZvIHN0cnVjdHVyZQorCQlwVGltZXJJbmZvID0gJkVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZV9sLm1fYVRpbWVySW5mb1swXTsKKwkJZm9yICh1aUluZGV4ID0gMDsgdWlJbmRleCA8IFRJTUVSX0NPVU5UOworCQkgICAgIHVpSW5kZXgrKywgcFRpbWVySW5mbysrKSB7CisJCQlpZiAocFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsID09IDApIHsJLy8gZnJlZSBzdHJ1Y3R1cmUgZm91bmQKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodWlJbmRleCA+PSBUSU1FUl9DT1VOVCkgewkvLyBubyBmcmVlIHN0cnVjdHVyZSBmb3VuZAorCQkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgPSBIRExfSU5JVCh1aUluZGV4KTsKKwl9IGVsc2UgeworCQl1aUluZGV4ID0gSERMX1RPX0lEWCgqcFRpbWVySGRsX3ApOworCQlpZiAodWlJbmRleCA+PSBUSU1FUl9DT1VOVCkgewkvLyBpbnZhbGlkIGhhbmRsZQorCQkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvW3VpSW5kZXhdOworCX0KKworCS8qCisJICogaW5jcmVtZW50IHRpbWVyIGhhbmRsZQorCSAqIChpZiB0aW1lciBleHBpcmVzIHJpZ2h0IGFmdGVyIHRoaXMgc3RhdGVtZW50LCB0aGUgdXNlcgorCSAqIHdvdWxkIGRldGVjdCBhbiB1bmtub3duIHRpbWVyIGhhbmRsZSBhbmQgZGlzY2FyZCBpdCkKKwkgKi8KKwlwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgPQorCSAgICBIRExfSU5DKHBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCk7CisJKnBUaW1lckhkbF9wID0gcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsOworCisJLy8gcmVqZWN0IHRvbyBzbWFsbCB0aW1lIHZhbHVlcworCWlmICgoZkNvbnRpbnVvdXNseV9wICYmICh1bGxUaW1lTnNfcCA8IFRJTUVSX01JTl9WQUxfQ1lDTEUpKQorCSAgICB8fCAoIWZDb250aW51b3VzbHlfcCAmJiAodWxsVGltZU5zX3AgPCBUSU1FUl9NSU5fVkFMX1NJTkdMRSkpKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX3VsQXJnID0gdWxBcmd1bWVudF9wOworCXBUaW1lckluZm8tPm1fcGZuQ2FsbGJhY2sgPSBwZm5DYWxsYmFja19wOworCXBUaW1lckluZm8tPm1fZkNvbnRpbnVvdXNseSA9IGZDb250aW51b3VzbHlfcDsKKwlwVGltZXJJbmZvLT5tX3VsbFBlcmlvZCA9IHVsbFRpbWVOc19wOworCisJLyoKKwkgKiBIUlRJTUVSX01PREVfUkVMIGRvZXMgbm90IGluZmx1ZW5jZSBnZW5lcmFsIGhhbmRsaW5nIG9mIHRoaXMgdGltZXIuCisJICogSXQgb25seSBzZXRzIHJlbGF0aXZlIG1vZGUgZm9yIHRoaXMgc3RhcnQgb3BlcmF0aW9uLgorCSAqIC0+IEV4cGlyZSB0aW1lIGlzIGNhbGN1bGF0ZWQgYnk6IE5vdyArIFJlbFRpbWUKKwkgKiBocnRpbWVyX3N0YXJ0IGFsc28gc2tpcHMgcGVuZGluZyB0aW1lciBldmVudHMuCisJICogVGhlIHN0YXRlIEhSVElNRVJfU1RBVEVfQ0FMTEJBQ0sgaXMgaWdub3JlZC4KKwkgKiBXZSBoYXZlIHRvIGNvcGUgd2l0aCB0aGF0IGluIG91ciBjYWxsYmFjayBmdW5jdGlvbi4KKwkgKi8KKwlSZWxUaW1lID0ga3RpbWVfYWRkX25zKGt0aW1lX3NldCgwLCAwKSwgdWxsVGltZU5zX3ApOworCWhydGltZXJfc3RhcnQoJnBUaW1lckluZm8tPm1fVGltZXIsIFJlbFRpbWUsIEhSVElNRVJfTU9ERV9SRUwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyB0aGUgdGltZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGhhbmRsZS4gQWZ0ZXJ3YXJkIHRoZQorLy8gICAgICAgICAgICAgIGhhbmRsZSBpcyBzZXQgdG8gemVyby4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgICAgID0gcG9pbnRlciB0byB0aW1lciBoYW5kbGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gKnBUaW1lckluZm87CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKnBUaW1lckhkbF9wID09IDApIHsJLy8gbm8gdGltZXIgY3JlYXRlZCB5ZXQKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCXVpSW5kZXggPSBIRExfVE9fSURYKCpwVGltZXJIZGxfcCk7CisJCWlmICh1aUluZGV4ID49IFRJTUVSX0NPVU5UKSB7CS8vIGludmFsaWQgaGFuZGxlCisJCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQkJZ290byBFeGl0OworCQl9CisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvW3VpSW5kZXhdOworCQlpZiAocFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsICE9ICpwVGltZXJIZGxfcCkgewkvLyBpbnZhbGlkIGhhbmRsZQorCQkJZ290byBFeGl0OworCQl9CisJfQorCisJKnBUaW1lckhkbF9wID0gMDsKKwlwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgPSAwOworCXBUaW1lckluZm8tPm1fcGZuQ2FsbGJhY2sgPSBOVUxMOworCisJLyoKKwkgKiBUaHJlZSByZXR1cm4gY2FzZXMgb2YgaHJ0aW1lcl90cnlfdG9fY2FuY2VsIGhhdmUgdG8gYmUgdHJhY2tlZDoKKwkgKiAgMSAtIHRpbWVyIGhhcyBiZWVuIHJlbW92ZWQKKwkgKiAgMCAtIHRpbWVyIHdhcyBub3QgYWN0aXZlCisJICogICAgICBXZSBuZWVkIG5vdCBkbyBhbnl0aGluZy4gaHJ0aW1lciB0aW1lcnMganVzdCBjb25zaXN0IG9mCisJICogICAgICBhIGhydGltZXIgc3RydWN0LCB3aGljaCB3ZSBtaWdodCBlbnF1ZXVlIGluIHRoZSBocnRpbWVycworCSAqICAgICAgZXZlbnQgbGlzdCBieSBjYWxsaW5nIGhydGltZXJfc3RhcnQoKS4KKwkgKiAgICAgIElmIGEgdGltZXIgaXMgbm90IGVucXVldWVkLCBpdCBpcyBub3QgcHJlc2VudCBpbiBocnRpbWVycy4KKwkgKiAtMSAtIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHJ1bm5pbmcKKwkgKiAgICAgIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB0aW1lciBpcyBub3QKKwkgKiAgICAgIGNvbnRpbnVvdXNseSByZXN0YXJ0ZWQuIFRoaXMgaGFzIGJlZW4gZG9uZSBieSBjbGVhcmluZworCSAqICAgICAgaXRzIGhhbmRsZS4KKwkgKi8KKwlocnRpbWVyX3RyeV90b19jYW5jZWwoJnBUaW1lckluZm8tPm1fVGltZXIpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJIaWdoUmVza0NhbGxiYWNrKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2sgZnVuY3Rpb24gY29tbW9ubHkgdXNlZCBmb3IgYWxsIHRpbWVycy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVyX3AgPSBwb2ludGVyIHRvIGhydGltZXIKKy8vCisvLyBSZXR1cm46CisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlbnVtIGhydGltZXJfcmVzdGFydCBFcGxUaW1lckhpZ2hSZXNrQ2FsbGJhY2soc3RydWN0IGhydGltZXIgKnBUaW1lcl9wKQoreworCXVuc2lnbmVkIGludCB1aUluZGV4OworCXRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvICpwVGltZXJJbmZvOworCXRFcGxUaW1lckhkbCBPcmdUaW1lckhkbDsKKwllbnVtIGhydGltZXJfcmVzdGFydCBSZXQ7CisKKwlCRU5DSE1BUktfTU9EXzI0X1NFVCg0KTsKKworCVJldCA9IEhSVElNRVJfTk9SRVNUQVJUOworCXBUaW1lckluZm8gPQorCSAgICBjb250YWluZXJfb2YocFRpbWVyX3AsIHRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvLCBtX1RpbWVyKTsKKwl1aUluZGV4ID0gSERMX1RPX0lEWChwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwpOworCWlmICh1aUluZGV4ID49IFRJTUVSX0NPVU5UKSB7CS8vIGludmFsaWQgaGFuZGxlCisJCWdvdG8gRXhpdDsKKwl9CisKKwkvKgorCSAqIFdlIHN0b3JlIHRoZSB0aW1lciBoYW5kbGUgYmVmb3JlIGNhbGxpbmcgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisJICogYXMgdGhlIHRpbWVyIGNhbiBiZSBtb2RpZmllZCBpbnNpZGUgaXQuCisJICovCisJT3JnVGltZXJIZGwgPSBwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGw7CisKKwlpZiAocFRpbWVySW5mby0+bV9wZm5DYWxsYmFjayAhPSBOVUxMKSB7CisJCXBUaW1lckluZm8tPm1fcGZuQ2FsbGJhY2soJnBUaW1lckluZm8tPm1fRXZlbnRBcmcpOworCX0KKworCWlmIChwVGltZXJJbmZvLT5tX2ZDb250aW51b3VzbHkpIHsKKwkJa3RpbWVfdCBJbnRlcnZhbDsKKyNpZmRlZiBQUk9WRV9PVkVSUlVOCisJCWt0aW1lX3QgTm93OworCQl1bnNpZ25lZCBsb25nIE92ZXJydW5zOworI2VuZGlmCisKKwkJaWYgKE9yZ1RpbWVySGRsICE9IHBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCkgeworCQkJLyogbW9kaWZpZWQgdGltZXIgaGFzIGFscmVhZHkgYmVlbiByZXN0YXJ0ZWQgKi8KKwkJCWdvdG8gRXhpdDsKKwkJfQorI2lmZGVmIFBST1ZFX09WRVJSVU4KKwkJTm93ID0ga3RpbWVfZ2V0KCk7CisJCUludGVydmFsID0KKwkJICAgIGt0aW1lX2FkZF9ucyhrdGltZV9zZXQoMCwgMCksIHBUaW1lckluZm8tPm1fdWxsUGVyaW9kKTsKKwkJT3ZlcnJ1bnMgPSBocnRpbWVyX2ZvcndhcmQocFRpbWVyX3AsIE5vdywgSW50ZXJ2YWwpOworCQlpZiAoT3ZlcnJ1bnMgPiAxKSB7CisJCQlwcmludGsKKwkJCSAgICAoIkVwbFRpbWVySGlnaFJlc2s6IENvbnRpbnVvdXMgdGltZXIgKGhhbmRsZSAweCVsWCkgaGFkIHRvIHNraXAgJWx1IGludGVydmFsKHMpIVxuIiwKKwkJCSAgICAgcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsLCBPdmVycnVucyAtIDEpOworCQl9CisjZWxzZQorCQlwVGltZXJfcC0+ZXhwaXJlcyA9IGt0aW1lX2FkZF9ucyhwVGltZXJfcC0+ZXhwaXJlcywKKwkJCQkJCSBwVGltZXJJbmZvLT5tX3VsbFBlcmlvZCk7CisjZW5kaWYKKworCQlSZXQgPSBIUlRJTUVSX1JFU1RBUlQ7CisJfQorCisgICAgICBFeGl0OgorCUJFTkNITUFSS19NT0RfMjRfUkVTRVQoNCk7CisJcmV0dXJuIFJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvVmlydHVhbEV0aGVybmV0TGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvVmlydHVhbEV0aGVybmV0TGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDgzOGRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9WaXJ0dWFsRXRoZXJuZXRMaW51eC5jCkBAIC0wLDAgKzEsMzQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgVmlydHVhbCBFdGhlcm5ldCBEcml2ZXIgZm9yIExpbnV4CisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogVmlydHVhbEV0aGVybmV0TGludXguYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8yMCAxNzowNjo1MSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIC1hcjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisgIDIwMDYvMDkvMTggZC5rLjogIGludGVncmF0aW9uIGludG8gRVBMIERMTGsgbW9kdWxlCisKKyAgVG9EbzoKKworICB2b2lkIG5ldGlmX2NhcnJpZXJfb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworICB2b2lkIG5ldGlmX2NhcnJpZXJfb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4JLyogZm9yIHN0cnVjdCBza19idWZmICovCisKKyNpbmNsdWRlICJrZXJuZWwvVmlydHVhbEV0aGVybmV0LmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfVkVUSF9UWF9USU1FT1VUCisvLyNkZWZpbmUgRVBMX1ZFVEhfVFhfVElNRU9VVCAoMipIWikKKyNkZWZpbmUgRVBMX1ZFVEhfVFhfVElNRU9VVCAwCS8vIGQuay46IHdlIHVzZSBubyB0aW1lb3V0CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnBWRXRoTmV0RGV2aWNlX2cgPSBOVUxMOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBWRXRoT3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKTsKK3N0YXRpYyBpbnQgVkV0aENsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApOworc3RhdGljIGludCBWRXRoWG1pdChzdHJ1Y3Qgc2tfYnVmZiAqcFNrYl9wLCBzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqVkV0aEdldFN0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApOworc3RhdGljIHZvaWQgVkV0aFRpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCk7CitzdGF0aWMgdEVwbEtlcm5lbCBWRXRoUmVjdkZyYW1lKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgVkV0aE9wZW4oc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy9vcGVuIHRoZSBkZXZpY2UKKy8vCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBwU3RhdHMgPSBuZXRkZXZfcHJpdihwTmV0RGV2aWNlX3ApOworCisJLy9zdGFydCB0aGUgaW50ZXJmYWNlIHF1ZXVlIGZvciB0aGUgbmV0d29yayBzdWJzeXN0ZW0KKwluZXRpZl9zdGFydF9xdWV1ZShwTmV0RGV2aWNlX3ApOworCisJLy8gcmVnaXN0ZXIgY2FsbGJhY2sgZnVuY3Rpb24gaW4gRExMCisJUmV0ID0gRXBsRGxsa1JlZ0FzeW5jSGFuZGxlcihWRXRoUmVjdkZyYW1lKTsKKworCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTEKKwkgICAgKCJWRXRoT3BlbjogRXBsRGxsa1JlZ0FzeW5jSGFuZGxlciByZXR1cm5lZCAweCUwMlhcbiIsIFJldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBWRXRoQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMCgiVkV0aENsb3NlXG4iKTsKKworCVJldCA9IEVwbERsbGtEZXJlZ0FzeW5jSGFuZGxlcihWRXRoUmVjdkZyYW1lKTsKKworCS8vc3RvcCB0aGUgaW50ZXJmYWNlIHF1ZXVlIGZvciB0aGUgbmV0d29yayBzdWJzeXN0ZW0KKwluZXRpZl9zdG9wX3F1ZXVlKHBOZXREZXZpY2VfcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgVkV0aFhtaXQoc3RydWN0IHNrX2J1ZmYgKnBTa2JfcCwgc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCisJLy90cmFuc21pdCBmdW5jdGlvbgorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBuZXRkZXZfcHJpdihwTmV0RGV2aWNlX3ApOworCisJLy9zYXZlIHRpbWVzdGVtcAorCXBOZXREZXZpY2VfcC0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJRnJhbWVJbmZvLm1fcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwU2tiX3AtPmRhdGE7CisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBwU2tiX3AtPmxlbjsKKworCS8vY2FsbCBzZW5kIGZrdCBvbiBETEwKKwlSZXQgPSBFcGxEbGxrQ2FsQXN5bmNTZW5kKCZGcmFtZUluZm8sIGtFcGxEbGxBc3luY1JlcVByaW9HZW5lcmljKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTEKKwkJICAgICgiVkV0aFhtaXQ6IEVwbERsbGtDYWxBc3luY1NlbmQgcmV0dXJuZWQgMHglMDJYXG4iLCBSZXQpOworCQluZXRpZl9zdG9wX3F1ZXVlKHBOZXREZXZpY2VfcCk7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwKCJWRXRoWG1pdDogZnJhbWUgcGFzc2VkIHRvIERMTFxuIik7CisJCWRldl9rZnJlZV9za2IocFNrYl9wKTsKKworCQkvL3NldCBzdGF0cyBmb3IgdGhlIGRldmljZQorCQlwU3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJcFN0YXRzLT50eF9ieXRlcyArPSBGcmFtZUluZm8ubV91aUZyYW1lU2l6ZTsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpWRXRoR2V0U3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwKCJWRXRoR2V0U3RhdHNcbiIpOworCisJcmV0dXJuIG5ldGRldl9wcml2KHBOZXREZXZpY2VfcCk7Cit9CisKK3N0YXRpYyB2b2lkIFZFdGhUaW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApCit7CisJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMCgiVkV0aFRpbWVvdXQoXG4iKTsKKworCS8vICQkJCBkLmsuOiBtb3ZlIHRvIGV4dHJhIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgYnkgRExMIHdoZW4gbmV3IHNwYWNlIGlzIGF2YWlsYWJsZSBpbiBUeEZpZm8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwTmV0RGV2aWNlX3ApKSB7CisJCW5ldGlmX3dha2VfcXVldWUocE5ldERldmljZV9wKTsKKwl9Cit9CisKK3N0YXRpYyB0RXBsS2VybmVsIFZFdGhSZWN2RnJhbWUodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlID0gcFZFdGhOZXREZXZpY2VfZzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcFN0YXRzID0gbmV0ZGV2X3ByaXYocE5ldERldmljZSk7CisJc3RydWN0IHNrX2J1ZmYgKnBTa2I7CisKKwlFUExfREJHTFZMX1ZFVEhfVFJBQ0UxKCJWRXRoUmVjdkZyYW1lOiBGcmFtZVNpemU9JXVcbiIsCisJCQkgICAgICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKworCXBTa2IgPSBkZXZfYWxsb2Nfc2tiKHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSArIDIpOworCWlmIChwU2tiID09IE5VTEwpIHsKKwkJcFN0YXRzLT5yeF9kcm9wcGVkKys7CisJCWdvdG8gRXhpdDsKKwl9CisJcFNrYi0+ZGV2ID0gcE5ldERldmljZTsKKworCXNrYl9yZXNlcnZlKHBTa2IsIDIpOworCisJbWVtY3B5KCh2b2lkICopc2tiX3B1dChwU2tiLCBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpLAorCSAgICAgICBwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLCBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCisJcFNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwU2tiLCBwTmV0RGV2aWNlKTsKKwlwU2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCS8vIGNhbGwgbmV0aWZfcnggd2l0aCBza2IKKwluZXRpZl9yeChwU2tiKTsKKworCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTEoIlZFdGhSZWN2RnJhbWU6IFNyY01BQz0weCVsbHhcbiIsCisJCQkgICAgICAgQW1pR2V0UXdvcmQ0OEZyb21CZShwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT4KKwkJCQkJCSAgIG1fYmVfYWJTcmNNYWMpKTsKKworCS8vIHVwZGF0ZSByZWNlaXZlIHN0YXRpc3RpY3MKKwlwU3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlwU3RhdHMtPnJ4X2J5dGVzICs9IHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCit0RXBsS2VybmVsIFBVQkxJQyBWRXRoQWRkSW5zdGFuY2UodEVwbERsbGtJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGFsbG9jYXRlIG5ldCBkZXZpY2Ugc3RydWN0dXJlIHdpdGggcHJpdiBwb2ludGluZyB0byBzdGF0cyBzdHJ1Y3R1cmUKKwlwVkV0aE5ldERldmljZV9nID0KKwkgICAgYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyksIEVQTF9WRVRIX05BTUUsCisJCQkgZXRoZXJfc2V0dXApOworLy8gICAgcFZFdGhOZXREZXZpY2VfZyA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworCWlmIChwVkV0aE5ldERldmljZV9nID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwVkV0aE5ldERldmljZV9nLT5vcGVuID0gVkV0aE9wZW47CisJcFZFdGhOZXREZXZpY2VfZy0+c3RvcCA9IFZFdGhDbG9zZTsKKwlwVkV0aE5ldERldmljZV9nLT5nZXRfc3RhdHMgPSBWRXRoR2V0U3RhdHM7CisJcFZFdGhOZXREZXZpY2VfZy0+aGFyZF9zdGFydF94bWl0ID0gVkV0aFhtaXQ7CisJcFZFdGhOZXREZXZpY2VfZy0+dHhfdGltZW91dCA9IFZFdGhUaW1lb3V0OworCXBWRXRoTmV0RGV2aWNlX2ctPndhdGNoZG9nX3RpbWVvID0gRVBMX1ZFVEhfVFhfVElNRU9VVDsKKwlwVkV0aE5ldERldmljZV9nLT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisKKwkvLyBjb3B5IG93biBNQUMgYWRkcmVzcyB0byBuZXQgZGV2aWNlIHN0cnVjdHVyZQorCW1lbWNweShwVkV0aE5ldERldmljZV9nLT5kZXZfYWRkciwgcEluaXRQYXJhbV9wLT5tX2JlX2FiU3JjTWFjLCA2KTsKKworCS8vcmVnaXN0ZXIgVkV0aCB0byB0aGUgbmV0d29yayBzdWJzeXN0ZW0KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KHBWRXRoTmV0RGV2aWNlX2cpKSB7CisJCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTAKKwkJICAgICgiVkV0aEFkZEluc3RhbmNlOiBDb3VsZCBub3QgcmVnaXN0ZXIgVkV0aC4uLlxuIik7CisJfSBlbHNlIHsKKwkJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMAorCQkgICAgKCJWRXRoQWRkSW5zdGFuY2U6IFJlZ2lzdGVyIFZFdGggc3VjY2Vzc2Z1bGwuLi5cbiIpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCit0RXBsS2VybmVsIFBVQkxJQyBWRXRoRGVsSW5zdGFuY2Uodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKHBWRXRoTmV0RGV2aWNlX2cgIT0gTlVMTCkgeworCQkvL3VucmVnaXN0ZXIgVkV0aCBmcm9tIHRoZSBuZXR3b3JrIHN1YnN5c3RlbQorCQl1bnJlZ2lzdGVyX25ldGRldihwVkV0aE5ldERldmljZV9nKTsKKwkJLy8gZGVzdHJ1Y3RvciB3YXMgc2V0IHRvIGZyZWVfbmV0ZGV2LAorCQkvLyBzbyB3ZSBkbyBub3QgbmVlZCB0byBjYWxsIGZyZWVfbmV0ZGV2IGhlcmUKKwkJcFZFdGhOZXREZXZpY2VfZyA9IE5VTEw7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2FtaXg4Ni5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9hbWl4ODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjc0MjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9hbWl4ODYuYwpAQCAtMCwwICsxLDkwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIEFic3RyYWN0IE1lbW9yeSBJbnRlcmZhY2UgZm9yIHg4NiBjb21wYXRpYmxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogYW1peDg2LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIC4uLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIHIucy46IGZpcnN0IGltcGxlbWV0YXRpb24KKworICAyMDA2LTA2LTEzICBkLmsuOiBkdXBsaWNhdGUgZnVuY3Rpb25zIGZvciBsaXR0bGUgZW5kaWFuIGFuZCBiaWcgZW5kaWFuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vI2luY2x1ZGUgImdsb2JhbC5oIgorLy8jaW5jbHVkZSAiRXBsQW1pLmgiCisjaW5jbHVkZSAiRXBsSW5jLmgiCisKKyNpZiAoIWRlZmluZWQoRVBMX0FNSV9JTkxJTkVEKSkgfHwgZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwlXT1JEIG1fd1dvcmQ7CisKK30gdHdTdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRCBtX2R3RHdvcmQ7CisKK30gdGR3U3RydWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisJUVdPUkQgbV9xd1F3b3JkOworCit9IHRxd1N0cnVjdDsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFhYWFRvQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiB3cml0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgYWJzb2x1dGUgYWRkcmVzcyBpbgorLy8gICAgICAgICAgICAgIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgICAgICAgICAgPSBhYnNvbHV0ZSBhZGRyZXNzCisvLyAgICAgICAgICAgICAgeFhYWFZhbF9wICAgICAgICAgICAgICAgPSB2YWx1ZQorLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLTwgd3JpdGUgQllURSBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKK3ZvaWQgIFBVQkxJQyAgQW1pU2V0Qnl0ZVRvQmUgKHZvaWQgRkFSKiBwQWRkcl9wLCBCWVRFIGJCeXRlVmFsX3ApCit7CisKKyAgICooQllURSBGQVIqKXBBZGRyX3AgPSBiQnl0ZVZhbF9wOworCit9CisqLworCisvLy0tLS0tLS0tLS0tLTwgd3JpdGUgV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0V29yZFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBXT1JEIHdXb3JkVmFsX3ApCit7CisJdHdTdHJ1Y3QgRkFSICpwd1N0cnVjdDsKKwl0d1N0cnVjdCB3VmFsdWU7CisKKwl3VmFsdWUubV93V29yZCA9IChXT1JEKSAoKHdXb3JkVmFsX3AgJiAweDAwRkYpIDw8IDgpOwkvL0xTQiB0byBNU0IKKwl3VmFsdWUubV93V29yZCB8PSAoV09SRCkgKCh3V29yZFZhbF9wICYgMHhGRjAwKSA+PiA4KTsJLy9NU0IgdG8gTFNCCisKKwlwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlwd1N0cnVjdC0+bV93V29yZCA9IHdWYWx1ZS5tX3dXb3JkOworCit9CisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBEV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgRFdPUkQgZHdEd29yZFZhbF9wKQoreworCXRkd1N0cnVjdCBGQVIgKnBkd1N0cnVjdDsKKwl0ZHdTdHJ1Y3QgZHdWYWx1ZTsKKworCWR3VmFsdWUubV9kd0R3b3JkID0gKChkd0R3b3JkVmFsX3AgJiAweDAwMDAwMEZGKSA8PCAyNCk7CS8vTFNCIHRvIE1TQgorCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgoZHdEd29yZFZhbF9wICYgMHgwMDAwRkYwMCkgPDwgOCk7CisJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChkd0R3b3JkVmFsX3AgJiAweDAwRkYwMDAwKSA+PiA4KTsKKwlkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKGR3RHdvcmRWYWxfcCAmIDB4RkYwMDAwMDApID4+IDI0KTsJLy9NU0IgdG8gTFNCCisKKwlwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXBkd1N0cnVjdC0+bV9kd0R3b3JkID0gZHdWYWx1ZS5tX2R3RHdvcmQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0WFhYVG9MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCisvLyAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKKy8vICAgICAgICAgICAgICB4WFhYVmFsX3AgICAgICAgICAgICAgICA9IHZhbHVlCisvLworLy8gUmV0dXJuczogICAgIChub25lKQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBCWVRFIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgordm9pZCAgUFVCTElDICBBbWlTZXRCeXRlVG9MZSAodm9pZCBGQVIqIHBBZGRyX3AsIEJZVEUgYkJ5dGVWYWxfcCkKK3sKKworICAgKihCWVRFIEZBUiopcEFkZHJfcCA9IGJCeXRlVmFsX3A7CisKK30KKyovCisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRXb3JkVG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFdPUkQgd1dvcmRWYWxfcCkKK3sKKwl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OworCisJcHdTdHJ1Y3QgPSAodHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CisJcHdTdHJ1Y3QtPm1fd1dvcmQgPSB3V29yZFZhbF9wOworCit9CisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBEV09SRCBpbiBsaXR0bGUgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgRFdPUkQgZHdEd29yZFZhbF9wKQoreworCXRkd1N0cnVjdCBGQVIgKnBkd1N0cnVjdDsKKworCXBkd1N0cnVjdCA9ICh0ZHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CisJcGR3U3RydWN0LT5tX2R3RHdvcmQgPSBkd0R3b3JkVmFsX3A7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0WFhYRnJvbUJlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCisvLyAgICAgICAgICAgICAgYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgWFhYICAgICAgICAgICAgICAgICAgICAgPSB2YWx1ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tPCByZWFkIEJZVEUgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorQllURSAgUFVCTElDICBBbWlHZXRCeXRlRnJvbUJlICh2b2lkIEZBUiogcEFkZHJfcCkKK3sKKworICAgcmV0dXJuICggKihCWVRFIEZBUiopcEFkZHJfcCApOworCit9CisqLworCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBXT1JEIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gV09SRCBQVUJMSUMgQW1pR2V0V29yZEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisJdHdTdHJ1Y3QgRkFSICpwd1N0cnVjdDsKKwl0d1N0cnVjdCB3VmFsdWU7CisKKwlwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKworCXdWYWx1ZS5tX3dXb3JkID0gKFdPUkQpICgocHdTdHJ1Y3QtPm1fd1dvcmQgJiAweDAwRkYpIDw8IDgpOwkvL0xTQiB0byBNU0IKKwl3VmFsdWUubV93V29yZCB8PSAoV09SRCkgKChwd1N0cnVjdC0+bV93V29yZCAmIDB4RkYwMCkgPj4gOCk7CS8vTVNCIHRvIExTQgorCisJcmV0dXJuICh3VmFsdWUubV93V29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS08IHJlYWQgRFdPUkQgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIERXT1JEIFBVQkxJQyBBbWlHZXREd29yZEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisJdGR3U3RydWN0IEZBUiAqcGR3U3RydWN0OworCXRkd1N0cnVjdCBkd1ZhbHVlOworCisJcGR3U3RydWN0ID0gKHRkd1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKworCWR3VmFsdWUubV9kd0R3b3JkID0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDAwMDAwRkYpIDw8IDI0KTsJLy9MU0IgdG8gTVNCCisJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDAwMEZGMDApIDw8IDgpOworCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgocGR3U3RydWN0LT5tX2R3RHdvcmQgJiAweDAwRkYwMDAwKSA+PiA4KTsKKwlkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHhGRjAwMDAwMCkgPj4gMjQpOwkvL01TQiB0byBMU0IKKworCXJldHVybiAoZHdWYWx1ZS5tX2R3RHdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFhYWEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGUgYWJzb2x1dGUgYWRkcmVzcyBpbgorLy8gICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgICAgICAgICAgPSBhYnNvbHV0ZSBhZGRyZXNzCisvLworLy8gUmV0dXJuczogICAgIFhYWCAgICAgICAgICAgICAgICAgICAgID0gdmFsdWUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBCWVRFIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKK0JZVEUgIFBVQkxJQyAgQW1pR2V0Qnl0ZUZyb21MZSAodm9pZCBGQVIqIHBBZGRyX3ApCit7CisKKyAgIHJldHVybiAoICooQllURSBGQVIqKXBBZGRyX3AgKTsKKworfQorKi8KKworLy8tLS0tLS0tLS0tLS08IHJlYWQgV09SRCBpbiBsaXR0bGUgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFdPUkQgUFVCTElDIEFtaUdldFdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCXR3U3RydWN0IEZBUiAqcHdTdHJ1Y3Q7CisKKwlwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlyZXR1cm4gKHB3U3RydWN0LT5tX3dXb3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBEV09SRCBpbiBsaXR0bGUgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gRFdPUkQgUFVCTElDIEFtaUdldER3b3JkRnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKwl0ZHdTdHJ1Y3QgRkFSICpwZHdTdHJ1Y3Q7CisKKwlwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXJldHVybiAocGR3U3RydWN0LT5tX2R3RHdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldER3b3JkMjRUb0JlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDI0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgZHdEd29yZFZhbF9wICAgID0gdmFsdWUgdG8gc2V0CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIERXT1JEIGR3RHdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVsyXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIGR3RHdvcmRWYWxfcClbMV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzBdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldER3b3JkMjRUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDI0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgZHdEd29yZFZhbF9wICAgID0gdmFsdWUgdG8gc2V0CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIERXT1JEIGR3RHdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVswXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIGR3RHdvcmRWYWxfcClbMV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzJdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldER3b3JkMjRGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDI0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIERXT1JEICAgICAgICAgICA9IHJlYWQgdmFsdWUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmQyNEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0ZHdTdHJ1Y3QgZHdTdHJ1Y3Q7CisKKwlkd1N0cnVjdC5tX2R3RHdvcmQgPSBBbWlHZXREd29yZEZyb21CZShwQWRkcl9wKTsKKwlkd1N0cnVjdC5tX2R3RHdvcmQgPj49IDg7CisKKwlyZXR1cm4gKGR3U3RydWN0Lm1fZHdEd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0RHdvcmQyNEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgMjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgRFdPUkQgICAgICAgICAgID0gcmVhZCB2YWx1ZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIERXT1JEIFBVQkxJQyBBbWlHZXREd29yZDI0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRkd1N0cnVjdCBkd1N0cnVjdDsKKworCWR3U3RydWN0Lm1fZHdEd29yZCA9IEFtaUdldER3b3JkRnJvbUxlKHBBZGRyX3ApOworCWR3U3RydWN0Lm1fZHdEd29yZCAmPSAweDAwRkZGRkZGOworCisJcmV0dXJuIChkd1N0cnVjdC5tX2R3RHdvcmQpOworCit9CisKKy8vI2lmZGVmIFVTRV9WQVI2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDY0VG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA2NCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDY0VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs3XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzVdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNl0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzddID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ2NFRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ2NFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwlRV09SRCBGQVIgKnBxd0RzdDsKKworCXBxd0RzdCA9IChRV09SRCBGQVIgKikgcEFkZHJfcDsKKwkqcHF3RHN0ID0gcXdRd29yZFZhbF9wOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNjRGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDY0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ2NEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVswXSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbN107CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbMV0gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdOworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzJdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVszXSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbNF07CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbNF0gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzNdOworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzVdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVs2XSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbMV07CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbN10gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzBdOworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNjRGcm9tTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDY0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ2NEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgRkFSICpwcXdTdHJ1Y3Q7CisJdHF3U3RydWN0IHF3U3RydWN0OworCisJcHF3U3RydWN0ID0gKHRxd1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBwcXdTdHJ1Y3QtPm1fcXdRd29yZDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQwVG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA0MCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQwVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0MFRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDAgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0MFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwkoKERXT1JEIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoRFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0MEZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDAgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0MEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUJlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCA+Pj0gMjQ7CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0MEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDAgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0MEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwMDAwMEZGRkZGRkZGRkZMTDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQ4VG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA0OCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQ4VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs1XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNF07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzNdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsyXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzBdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDhUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQ4IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDhUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQoreworCisJKChEV09SRCBGQVIgKikgcEFkZHJfcClbMF0gPSAoKERXT1JEIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisJKChXT1JEIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoV09SRCBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNDhGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDQ4IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDhGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCisJdHF3U3RydWN0IHF3U3RydWN0OworCisJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21CZShwQWRkcl9wKTsKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPj49IDE2OworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNDhGcm9tTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDQ4IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDhGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCisJdHF3U3RydWN0IHF3U3RydWN0OworCisJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21MZShwQWRkcl9wKTsKKwlxd1N0cnVjdC5tX3F3UXdvcmQgJj0gMHgwMDAwRkZGRkZGRkZGRkZGTEw7CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ1NlRvQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNTYgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ1NlRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzBdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsxXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzVdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMl0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzNdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs0XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ1NlRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNTYgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ1NlRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwkoKERXT1JEIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoRFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKwkoKFdPUkQgRkFSICopIHBBZGRyX3ApWzJdID0gKChXT1JEIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs2XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzZdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNTZGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDU2IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNTZGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCisJdHF3U3RydWN0IHF3U3RydWN0OworCisJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21CZShwQWRkcl9wKTsKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPj49IDg7CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ1NkZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNTYgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwRkZGRkZGRkZGRkZGRkZMTDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRUaW1lT2ZEYXkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgVElNRV9PRl9EQVkgKENBTm9wZW4pIHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcFRpbWVPZkRheV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgVElNRV9PRl9EQVkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICB0VGltZU9mRGF5IEZBUiAqIHBUaW1lT2ZEYXlfcCkKK3sKKworCUFtaVNldER3b3JkVG9MZSgoKEJZVEUgRkFSICopIHBBZGRyX3ApLAorCQkJcFRpbWVPZkRheV9wLT5tX2R3TXMgJiAweDBGRkZGRkZGKTsKKwlBbWlTZXRXb3JkVG9MZSgoKEJZVEUgRkFSICopIHBBZGRyX3ApICsgNCwgcFRpbWVPZkRheV9wLT5tX3dEYXlzKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRUaW1lT2ZEYXkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIFRJTUVfT0ZfREFZIChDQU5vcGVuKSB2YWx1ZSBmcm9tIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHBUaW1lT2ZEYXlfcCAgICA9IHBvaW50ZXIgdG8gc3RydWN0IFRJTUVfT0ZfREFZCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlHZXRUaW1lT2ZEYXkodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgdFRpbWVPZkRheSBGQVIgKiBwVGltZU9mRGF5X3ApCit7CisKKwlwVGltZU9mRGF5X3AtPm1fZHdNcyA9CisJICAgIEFtaUdldER3b3JkRnJvbUxlKCgoQllURSBGQVIgKikgcEFkZHJfcCkpICYgMHgwRkZGRkZGRjsKKwlwVGltZU9mRGF5X3AtPm1fd0RheXMgPSBBbWlHZXRXb3JkRnJvbUxlKCgoQllURSBGQVIgKikgcEFkZHJfcCkgKyA0KTsKKworfQorCisjZW5kaWYKKworLy8gRU9GCisKKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCisvLyBkYW1pdCBlaW4gUHJvYmxlbSBoYWJlbiwgd2VubiBkYXMgbmljaHQgc28gaXN0ICh6LkIuIEdOVSBvZGVyIEJvcmxhbmQgQysrIEJ1aWxkZXIpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9kZW1vX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvZGVtb19tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzZmEwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvZGVtb19tYWluLmMKQEAgLTAsMCArMSw5NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZW1vYXBwbGljYXRpb24gZm9yIEVQTCBNTiAod2l0aCBTRE8gb3ZlciBVRFApCisgICAgICAgICAgICAgICAgdW5kZXIgTGludXggb24gWDg2IHdpdGggUlRMODEzOSBFdGhlcm5ldCBjb250cm9sbGVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogZGVtb19tYWluLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjEwICQgICREYXRlOiAyMDA4LzExLzE5IDE4OjExOjQzICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEdDQworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDkvMDEgZC5rLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgIkVwbC5oIgorI2luY2x1ZGUgInByb2NfZnMuaCIKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAvLyByZW1vdmUgKCJtYWtlIGludmlzaWJsZSIpIG9ic29sZXRlIHN5bWJvbHMgZm9yIGtlcm5lbCB2ZXJzaW9ucyAyLjYKKyAgICAvLyBhbmQgaGlnaGVyCisjZGVmaW5lIE1PRF9JTkNfVVNFX0NPVU5UCisjZGVmaW5lIE1PRF9ERUNfVVNFX0NPVU5UCisjZGVmaW5lIEVYUE9SVF9OT19TWU1CT0xTCisjZWxzZQorI2Vycm9yICJUaGlzIGRyaXZlciBuZWVkcyBhIDIuNi54IGtlcm5lbCBvciBoaWdoZXIiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gTWV0YWluZm9ybWF0aW9uCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjaWZkZWYgTU9EVUxFX0FVVEhPUgorTU9EVUxFX0FVVEhPUigiRGFuaWVsLktydWVnZXJAU1lTVEVDLWVsZWN0cm9uaWMuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVQTCBNTiBkZW1vIik7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNlbmRpZgorCisjZGVmaW5lIE5PREVJRCAgICAgIDB4RjAJLy89PiBNTgorI2RlZmluZSBDWUNMRV9MRU4gICA1MDAwCS8vIFt1c10KKyNkZWZpbmUgSVBfQUREUiAgICAgMHhjMGE4NjQwMQkvLyAxOTIuMTY4LjEwMC4xCisjZGVmaW5lIFNVQk5FVF9NQVNLIDB4RkZGRkZGMDAJLy8gMjU1LjI1NS4yNTUuMAorI2RlZmluZSBIT1NUTkFNRSAgICAiU1lTIFRFQyBlbGVjdHJvbmljIEVQTCBTdGFjayAgICAiCisjZGVmaW5lIElGX0VUSCAgICAgIEVQTF9WRVRIX05BTUUKKworLy8gTElHSFQgRUZGRUNUCisjZGVmaW5lIERFRkFVTFRfTUFYX0NZQ0xFX0NPVU5UIDIwCS8vIDYgaXMgdmVyeSBmYXN0CisjZGVmaW5lIEFQUF9ERUZBVUxUX01PREUgICAgICAgIDB4MDEKKyNkZWZpbmUgQVBQX0xFRF9DT1VOVCAgICAgICAgICAgNQkvLyBudW1iZXIgb2YgTEVEcyBpbiBvbmUgcm93CisjZGVmaW5lIEFQUF9MRURfTUFTSyAgICAgICAgICAgICgoMSA8PCBBUFBfTEVEX0NPVU5UKSAtIDEpCisjZGVmaW5lIEFQUF9ET1VCTEVfTEVEX01BU0sgICAgICgoMSA8PCAoQVBQX0xFRF9DT1VOVCAqIDIpKSAtIDEpCisjZGVmaW5lIEFQUF9NT0RFX0NPVU5UICAgICAgICAgIDUKKyNkZWZpbmUgQVBQX01PREVfTUFTSyAgICAgICAgICAgKCgxIDw8IEFQUF9NT0RFX0NPVU5UKSAtIDEpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ09OU1QgQllURSBhYk1hY0FkZHJbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitCWVRFIGJWYXJJbjFfbDsKK0JZVEUgYlZhck91dDFfbDsKK0JZVEUgYlZhck91dDFPbGRfbDsKK0JZVEUgYk1vZGVTZWxlY3RfbDsJCS8vIHN0YXRlIG9mIHRoZSBwdXNoYnV0dG9ucyB0byBzZWxlY3QgdGhlIG1vZGUKK0JZVEUgYlNwZWVkU2VsZWN0X2w7CQkvLyBzdGF0ZSBvZiB0aGUgcHVzaGJ1dHRvbnMgdG8gaW5jcmVhc2UvZGVjcmVhc2UgdGhlIHNwZWVkCitCWVRFIGJTcGVlZFNlbGVjdE9sZF9sOwkJLy8gb2xkIHN0YXRlIG9mIHRoZSBwdXNoYnV0dG9ucworRFdPUkQgZHdMZWRzX2w7CQkJLy8gY3VycmVudCBzdGF0ZSBvZiBhbGwgTEVEcworQllURSBiTGVkc1JvdzFfbDsJCS8vIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExFRHMgaW4gcm93IDEKK0JZVEUgYkxlZHNSb3cyX2w7CQkvLyBjdXJyZW50IHN0YXRlIG9mIHRoZSBMRURzIGluIHJvdyAyCitCWVRFIGFiU2VsZWN0X2xbM107CQkvLyBwdXNoYnV0dG9ucyBmcm9tIENOcworCitEV09SRCBkd01vZGVfbDsJCQkvLyBjdXJyZW50IG1vZGUKK2ludCBpQ3VyQ3ljbGVDb3VudF9sOwkJLy8gY3VycmVudCBjeWNsZSBjb3VudAoraW50IGlNYXhDeWNsZUNvdW50X2w7CQkvLyBtYXhpbXVtIGN5Y2xlIGNvdW50IChpLmUuIG51bWJlciBvZiBjeWNsZXMgdW50aWwgbmV4dCBsaWdodCBtb3ZlbWVudCBzdGVwKQoraW50IGlUb2dnbGU7CQkJLy8gaW5kaWNhdGVzIHRoZSBsaWdodCBtb3ZlbWVudCBkaXJlY3Rpb24KKworQllURSBhYkRvbWFpbl9sWzMwMDBdOworCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlU2h1dGRvd25fZzsJLy8gd2FpdCBxdWV1ZSBmb3IgdEVwbE5tdEV2ZW50U3dpdGNoT2ZmCitzdGF0aWMgYXRvbWljX3QgQXRvbWljU2h1dGRvd25fZyA9IEFUT01JQ19JTklUKEZBTFNFKTsKKworc3RhdGljIERXT1JEIGR3X2xlX0N5Y2xlTGVuX2c7CisKK3N0YXRpYyB1aW50IHVpTm9kZUlkX2cgPSBFUExfQ19BRFJfSU5WQUxJRDsKK21vZHVsZV9wYXJhbV9uYW1lZChub2RlaWQsIHVpTm9kZUlkX2csIHVpbnQsIDApOworCitzdGF0aWMgdWludCB1aUN5Y2xlTGVuX2cgPSBDWUNMRV9MRU47Cittb2R1bGVfcGFyYW1fbmFtZWQoY3ljbGVsZW4sIHVpQ3ljbGVMZW5fZywgdWludCwgMCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgeW91ciBvYmplY3QgZGljdGlvbmFyeS4gSXQgaXMgZGVmaW5lZAorLy8gaW4gT0JKRElDVC5DIGJ5IGRlZmluZSBFUExfT0JEX0lOSVRfUkFNX05BTUUuIFVzZSB0aGlzIGZ1bmN0aW9uIG5hbWUgdG8gZGVmaW5lCisvLyB0aGlzIGZ1bmN0aW9uIHByb3RvdHlwZSBoZXJlLiBJZiB5b3Ugd2FudCB0byB1c2UgbW9yZSB0aGFuIG9uZSBFcGwKKy8vIGluc3RhbmNlcyB0aGVuIHRoZSBmdW5jdGlvbiBuYW1lIG9mIGVhY2ggb2JqZWN0IGRpY3Rpb25hcnkgaGFzIHRvIGRpZmZlci4KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkSW5pdFJhbSh0RXBsT2JkSW5pdFBhcmFtIE1FTSAqIHBJbml0UGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEFwcENiRXZlbnQodEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfcCwJLy8gSU46IGV2ZW50IHR5cGUgKGVudW0pCisJCQkgICAgIHRFcGxBcGlFdmVudEFyZyAqIHBFdmVudEFyZ19wLAkvLyBJTjogZXZlbnQgYXJndW1lbnQgKHVuaW9uKQorCQkJICAgICB2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgQXBwQ2JTeW5jKHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBFcGxMaW5Jbml0KHZvaWQpOworc3RhdGljIHZvaWQgX19leGl0IEVwbExpbkV4aXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgS2VybmVsIE1vZHVsZSBzcGVjaWZpYyBEYXRhIFN0cnVjdHVyZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VYUE9SVF9OT19TWU1CT0xTOworCisvL21vZHVsZV9pbml0KEVwbExpbkluaXQpOworLy9tb2R1bGVfZXhpdChFcGxMaW5FeGl0KTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGludCBfX2luaXQgRXBsTGluSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgRXBsUmV0OworCWludCBpUmV0OworCXN0YXRpYyB0RXBsQXBpSW5pdFBhcmFtIEVwbEFwaUluaXRQYXJhbSA9IHsgMCB9OworCWNoYXIgKnNIb3N0bmFtZSA9IEhPU1ROQU1FOworCWNoYXIgKmFyZ3ZbNF0sICplbnZwWzNdOworCWNoYXIgc0J1ZmZlclsxNl07CisJdW5zaWduZWQgaW50IHVpVmFyRW50cmllczsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJYXRvbWljX3NldCgmQXRvbWljU2h1dGRvd25fZywgVFJVRSk7CisKKwkvLyBnZXQgbm9kZSBJRCBmcm9tIGluc21vZCBjb21tYW5kIGxpbmUKKwlFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZCA9IHVpTm9kZUlkX2c7CisKKwlpZiAoRXBsQXBpSW5pdFBhcmFtLm1fdWlOb2RlSWQgPT0gRVBMX0NfQURSX0lOVkFMSUQpIHsJLy8gaW52YWxpZCBub2RlIElEIHNldAorCQkvLyBzZXQgZGVmYXVsdCBub2RlIElECisJCUVwbEFwaUluaXRQYXJhbS5tX3VpTm9kZUlkID0gTk9ERUlEOworCX0KKworCXVpTm9kZUlkX2cgPSBFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZDsKKworCS8vIGNhbGN1bGF0ZSBJUCBhZGRyZXNzCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MgPQorCSAgICAoMHhGRkZGRkYwMCAmIElQX0FERFIpIHwgRXBsQXBpSW5pdFBhcmFtLm1fdWlOb2RlSWQ7CisKKwlFcGxBcGlJbml0UGFyYW0ubV9mQXN5bmNPbmx5ID0gRkFMU0U7CisKKwlFcGxBcGlJbml0UGFyYW0ubV91aVNpemVPZlN0cnVjdCA9IHNpemVvZihFcGxBcGlJbml0UGFyYW0pOworCUVQTF9NRU1DUFkoRXBsQXBpSW5pdFBhcmFtLm1fYWJNYWNBZGRyZXNzLCBhYk1hY0FkZHIsCisJCSAgIHNpemVvZihFcGxBcGlJbml0UGFyYW0ubV9hYk1hY0FkZHJlc3MpKTsKKy8vICAgIEVwbEFwaUluaXRQYXJhbS5tX2FiTWFjQWRkcmVzc1s1XSA9IChCWVRFKSBFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZDsKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0ZlYXR1cmVGbGFncyA9IC0xOworCUVwbEFwaUluaXRQYXJhbS5tX2R3Q3ljbGVMZW4gPSB1aUN5Y2xlTGVuX2c7CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwlFcGxBcGlJbml0UGFyYW0ubV91aUlzb2NoclR4TWF4UGF5bG9hZCA9IDEwMDsJLy8gY29uc3QKKwlFcGxBcGlJbml0UGFyYW0ubV91aUlzb2NoclJ4TWF4UGF5bG9hZCA9IDEwMDsJLy8gY29uc3QKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1ByZXNNYXhMYXRlbmN5ID0gNTAwMDA7CS8vIGNvbnN0OyBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCUVwbEFwaUluaXRQYXJhbS5tX3VpUHJlcUFjdFBheWxvYWRMaW1pdCA9IDM2OwkvLyByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24gKCsyOCBieXRlcykKKwlFcGxBcGlJbml0UGFyYW0ubV91aVByZXNBY3RQYXlsb2FkTGltaXQgPSAzNjsJLy8gcmVxdWlyZWQgZm9yIGluaXRpYWxpc2F0aW9uIG9mIFByZXMgZnJhbWUgKCsyOCBieXRlcykKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0FzbmRNYXhMYXRlbmN5ID0gMTUwMDAwOwkvLyBjb25zdDsgb25seSByZXF1aXJlZCBmb3IgSWRlbnRSZXMKKwlFcGxBcGlJbml0UGFyYW0ubV91aU11bHRpcGxDeWNsZUNudCA9IDA7CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwlFcGxBcGlJbml0UGFyYW0ubV91aUFzeW5jTXR1ID0gMTUwMDsJLy8gcmVxdWlyZWQgdG8gc2V0IHVwIG1heCBmcmFtZSBzaXplCisJRXBsQXBpSW5pdFBhcmFtLm1fdWlQcmVzY2FsZXIgPSAyOwkvLyByZXF1aXJlZCBmb3Igc3luYworCUVwbEFwaUluaXRQYXJhbS5tX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UgPSA1MDAwMDA7CisJRXBsQXBpSW5pdFBhcmFtLm1fZHdBc3luY1Nsb3RUaW1lb3V0ID0gMzAwMDAwMDsKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1dhaXRTb2NQcmVxID0gMTUwMDAwOworCUVwbEFwaUluaXRQYXJhbS5tX2R3RGV2aWNlVHlwZSA9IC0xOwkvLyBOTVRfRGV2aWNlVHlwZV9VMzIKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1ZlbmRvcklkID0gLTE7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuVmVuZG9ySWRfVTMyCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdQcm9kdWN0Q29kZSA9IC0xOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlByb2R1Y3RDb2RlX1UzMgorCUVwbEFwaUluaXRQYXJhbS5tX2R3UmV2aXNpb25OdW1iZXIgPSAtMTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5SZXZpc2lvbk5vX1UzMgorCUVwbEFwaUluaXRQYXJhbS5tX2R3U2VyaWFsTnVtYmVyID0gLTE7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuU2VyaWFsTm9fVTMyCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdTdWJuZXRNYXNrID0gU1VCTkVUX01BU0s7CisJRXBsQXBpSW5pdFBhcmFtLm1fZHdEZWZhdWx0R2F0ZXdheSA9IDA7CisJRVBMX01FTUNQWShFcGxBcGlJbml0UGFyYW0ubV9zSG9zdG5hbWUsIHNIb3N0bmFtZSwKKwkJICAgc2l6ZW9mKEVwbEFwaUluaXRQYXJhbS5tX3NIb3N0bmFtZSkpOworCisJLy8gY3VycmVudGx5IHVuc2V0IHBhcmFtZXRlcnMgbGVmdCBhdCBkZWZhdWx0IHZhbHVlIDAKKwkvL0VwbEFwaUluaXRQYXJhbS5tX3F3VmVuZG9yU3BlY2lmaWNFeHQxOworCS8vRXBsQXBpSW5pdFBhcmFtLm1fZHdWZXJpZnlDb25maWd1cmF0aW9uRGF0ZTsgLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZEYXRlX1UzMgorCS8vRXBsQXBpSW5pdFBhcmFtLm1fZHdWZXJpZnlDb25maWd1cmF0aW9uVGltZTsgLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZUaW1lX1UzMgorCS8vRXBsQXBpSW5pdFBhcmFtLm1fZHdBcHBsaWNhdGlvblN3RGF0ZTsgICAgICAgLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3RGF0ZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciBkYXRlIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJLy9FcGxBcGlJbml0UGFyYW0ubV9kd0FwcGxpY2F0aW9uU3dUaW1lOyAgICAgICAvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dUaW1lX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIHRpbWUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwkvL0VwbEFwaUluaXRQYXJhbS5tX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzQ4XTsKKworCS8vIHNldCBjYWxsYmFjayBmdW5jdGlvbnMKKwlFcGxBcGlJbml0UGFyYW0ubV9wZm5DYkV2ZW50ID0gQXBwQ2JFdmVudDsKKwlFcGxBcGlJbml0UGFyYW0ubV9wZm5DYlN5bmMgPSBBcHBDYlN5bmM7CisKKwlwcmludGsKKwkgICAgKCJcblxuIEhlbGxvLCBJJ20gYSBzaW1wbGUgUE9XRVJMSU5LIG5vZGUgcnVubmluZyBhcyAlcyFcbiAgKGJ1aWxkOiAlcyAvICVzKVxuXG4iLAorCSAgICAgKHVpTm9kZUlkX2cgPT0KKwkgICAgICBFUExfQ19BRFJfTU5fREVGX05PREVfSUQgPyAiTWFuYWdpbmcgTm9kZSIgOiAiQ29udHJvbGxlZCBOb2RlIiksCisJICAgICBfX0RBVEVfXywgX19USU1FX18pOworCisJLy8gaW5pdGlhbGl6ZSB0aGUgTGludXggYSB3YWl0IHF1ZXVlIGZvciBzaHV0ZG93biBvZiB0aGlzIG1vZHVsZQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZVNodXRkb3duX2cpOworCisJLy8gaW5pdGlhbGl6ZSB0aGUgcHJvY2ZzIGRldmljZQorCUVwbFJldCA9IEVwbExpblByb2NJbml0KCk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXRpYWxpemUgUE9XRVJMSU5LIHN0YWNrCisJRXBsUmV0ID0gRXBsQXBpSW5pdGlhbGl6ZSgmRXBsQXBpSW5pdFBhcmFtKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gbGluayBwcm9jZXNzIHZhcmlhYmxlcyB1c2VkIGJ5IENOIHRvIG9iamVjdCBkaWN0aW9uYXJ5CisJT2JkU2l6ZSA9IHNpemVvZihiVmFySW4xX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDYwMDAsICZiVmFySW4xX2wsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLCAweDAxKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlPYmRTaXplID0gc2l6ZW9mKGJWYXJPdXQxX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDYyMDAsICZiVmFyT3V0MV9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMSk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGxpbmsgcHJvY2VzcyB2YXJpYWJsZXMgdXNlZCBieSBNTiB0byBvYmplY3QgZGljdGlvbmFyeQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCU9iZFNpemUgPSBzaXplb2YoYkxlZHNSb3cxX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIwMDAsICZiTGVkc1JvdzFfbCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgIDB4MDEpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYkxlZHNSb3cyX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIwMDAsICZiTGVkc1JvdzJfbCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgIDB4MDIpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYlNwZWVkU2VsZWN0X2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIwMDAsICZiU3BlZWRTZWxlY3RfbCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgIDB4MDMpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYlNwZWVkU2VsZWN0T2xkX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIwMDAsICZiU3BlZWRTZWxlY3RPbGRfbCwgJnVpVmFyRW50cmllcywKKwkJCSAgICAgJk9iZFNpemUsIDB4MDQpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYWJTZWxlY3RfbFswXSk7CisJdWlWYXJFbnRyaWVzID0gc2l6ZW9mKGFiU2VsZWN0X2wpOworCUVwbFJldCA9CisJICAgIEVwbEFwaUxpbmtPYmplY3QoMHgyMjAwLCAmYWJTZWxlY3RfbFswXSwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgIDB4MDEpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gbGluayBhIERPTUFJTiB0byBvYmplY3QgMHg2MTAwLCBidXQgZG8gbm90IGV4aXQsIGlmIGl0IGlzIG1pc3NpbmcKKwlPYmRTaXplID0gc2l6ZW9mKGFiRG9tYWluX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDYxMDAsICZhYkRvbWFpbl9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMCk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlwcmludGsoIkVwbEFwaUxpbmtPYmplY3QoMHg2MTAwKTogcmV0dXJucyAweCVYXG4iLCBFcGxSZXQpOworCX0KKwkvLyByZXNldCBvbGQgcHJvY2VzcyB2YXJpYWJsZXMKKwliVmFyT3V0MU9sZF9sID0gMDsKKwliU3BlZWRTZWxlY3RPbGRfbCA9IDA7CisJZHdNb2RlX2wgPSBBUFBfREVGQVVMVF9NT0RFOworCWlNYXhDeWNsZUNvdW50X2wgPSBERUZBVUxUX01BWF9DWUNMRV9DT1VOVDsKKworCS8vIGNvbmZpZ3VyZSBJUCBhZGRyZXNzIG9mIHZpcnR1YWwgbmV0d29yayBpbnRlcmZhY2UKKwkvLyBmb3IgVENQL0lQIGNvbW11bmljYXRpb24gb3ZlciB0aGUgUE9XRVJMSU5LIG5ldHdvcmsKKwlzcHJpbnRmKHNCdWZmZXIsICIlbHUuJWx1LiVsdS4lbHUiLAorCQkoRXBsQXBpSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MgPj4gMjQpLAorCQkoKEVwbEFwaUluaXRQYXJhbS5tX2R3SXBBZGRyZXNzID4+IDE2KSAmIDB4RkYpLAorCQkoKEVwbEFwaUluaXRQYXJhbS5tX2R3SXBBZGRyZXNzID4+IDgpICYgMHhGRiksCisJCShFcGxBcGlJbml0UGFyYW0ubV9kd0lwQWRkcmVzcyAmIDB4RkYpKTsKKwkvKiBzZXQgdXAgYSBtaW5pbWFsIGVudmlyb25tZW50ICovCisJaVJldCA9IDA7CisJZW52cFtpUmV0KytdID0gIkhPTUU9LyI7CisJZW52cFtpUmV0KytdID0gIlBBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iOworCWVudnBbaVJldF0gPSBOVUxMOworCisJLyogc2V0IHVwIHRoZSBhcmd1bWVudCBsaXN0ICovCisJaVJldCA9IDA7CisJYXJndltpUmV0KytdID0gIi9zYmluL2lmY29uZmlnIjsKKwlhcmd2W2lSZXQrK10gPSBJRl9FVEg7CisJYXJndltpUmV0KytdID0gc0J1ZmZlcjsKKwlhcmd2W2lSZXRdID0gTlVMTDsKKworCS8qIGNhbGwgaWZjb25maWcgdG8gY29uZmlndXJlIHRoZSB2aXJ0dWFsIG5ldHdvcmsgaW50ZXJmYWNlICovCisJaVJldCA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoYXJndlswXSwgYXJndiwgZW52cCwgMSk7CisJcHJpbnRrKCJpZmNvbmZpZyAlcyAlcyByZXR1cm5lZCAlZFxuIiwgYXJndlsxXSwgYXJndlsyXSwgaVJldCk7CisKKwkvLyBzdGFydCB0aGUgTk1UIHN0YXRlIG1hY2hpbmUKKwlFcGxSZXQgPSBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd1Jlc2V0KTsKKwlhdG9taWNfc2V0KCZBdG9taWNTaHV0ZG93bl9nLCBGQUxTRSk7CisKKyAgICAgIEV4aXQ6CisJcHJpbnRrKCJFcGxMaW5Jbml0KCk6IHJldHVybnMgMHglWFxuIiwgRXBsUmV0KTsKKwlyZXR1cm4gRXBsUmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgRXBsTGluRXhpdCh2b2lkKQoreworCXRFcGxLZXJuZWwgRXBsUmV0OworCisJLy8gaGFsdCB0aGUgTk1UIHN0YXRlIG1hY2hpbmUKKwkvLyBzbyB0aGUgcHJvY2Vzc2luZyBvZiBQT1dFUkxJTksgZnJhbWVzIHN0b3BzCisJRXBsUmV0ID0gRXBsQXBpRXhlY05tdENvbW1hbmQoa0VwbE5tdEV2ZW50U3dpdGNoT2ZmKTsKKworCS8vIHdhaXQgdW50aWwgTk1UIHN0YXRlIG1hY2hpbmUgaXMgc2h1dCBkb3duCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKFdhaXRRdWV1ZVNodXRkb3duX2csCisJCQkJIChhdG9taWNfcmVhZCgmQXRvbWljU2h1dGRvd25fZykgPT0gVFJVRSkpOworLyogICAgaWYgKChpRXJyICE9IDApIHx8IChhdG9taWNfcmVhZCgmQXRvbWljU2h1dGRvd25fZykgPT0gRVZFTlRfU1RBVEVfSU9DVEwpKQorICAgIHsgICAvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3IgYXBwbGljYXRpb24gY2FsbGVkIHdyb25nIGZ1bmN0aW9uCisgICAgICAgIEVwbFJldCA9IGtFcGxTaHV0ZG93bjsKKyAgICB9Ki8KKwkvLyBkZWxldGUgaW5zdGFuY2UgZm9yIGFsbCBtb2R1bGVzCisJRXBsUmV0ID0gRXBsQXBpU2h1dGRvd24oKTsKKwlwcmludGsoIkVwbEFwaVNodXRkb3duKCk6ICAweCVYXG4iLCBFcGxSZXQpOworCisJLy8gZGVpbml0aWFsaXplIHByb2MgZnMKKwlFcGxSZXQgPSBFcGxMaW5Qcm9jRnJlZSgpOworCXByaW50aygiRXBsTGluUHJvY0ZyZWUoKTogICAgICAgIDB4JVhcbiIsIEVwbFJldCk7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFwcENiRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGJ5IEVQTCBBUEkgbGF5ZXIgd2l0aGluCisvLyAgICAgICAgICAgICAgdXNlciBwYXJ0IChsb3cgcHJpb3JpdHkpLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFdmVudFR5cGVfcCAgICAgPSBldmVudCB0eXBlCisvLyAgICAgICAgICAgICAgcEV2ZW50QXJnX3AgICAgID0gcG9pbnRlciB0byB1bmlvbiwgd2hpY2ggZGVzY3JpYmVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGV2ZW50IGluIGRldGFpbAorLy8gICAgICAgICAgICAgIHBVc2VyQXJnX3AgICAgICA9IHVzZXIgc3BlY2lmaWMgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXBsU3VjY2Vzc2Z1bCA9IG5vIGVycm9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VwbFJlamVjdCA9IHJlamVjdCBmdXJ0aGVyIHByb2Nlc3NpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPSBwb3N0IGVycm9yIGV2ZW50IHRvIEFQSSBsYXllcgorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEFwcENiRXZlbnQodEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfcCwJLy8gSU46IGV2ZW50IHR5cGUgKGVudW0pCisJCQkgICAgIHRFcGxBcGlFdmVudEFyZyAqIHBFdmVudEFyZ19wLAkvLyBJTjogZXZlbnQgYXJndW1lbnQgKHVuaW9uKQorCQkJICAgICB2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKQoreworCXRFcGxLZXJuZWwgRXBsUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBpZiBOTVRfR1NfT0ZGIGlzIHJlYWNoZWQKKwlzd2l0Y2ggKEV2ZW50VHlwZV9wKSB7CisJY2FzZSBrRXBsQXBpRXZlbnRObXRTdGF0ZUNoYW5nZToKKwkJeworCQkJc3dpdGNoIChwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlKSB7CisJCQljYXNlIGtFcGxObXRHc09mZjoKKwkJCQl7CS8vIE5NVCBzdGF0ZSBtYWNoaW5lIHdhcyBzaHV0IGRvd24sCisJCQkJCS8vIGJlY2F1c2Ugb2YgdXNlciBzaWduYWwgKENUUkwtQykgb3IgY3JpdGljYWwgRVBMIHN0YWNrIGVycm9yCisJCQkJCS8vIC0+IGFsc28gc2h1dCBkb3duIEVwbEFwaVByb2Nlc3MoKSBhbmQgbWFpbigpCisJCQkJCUVwbFJldCA9IGtFcGxTaHV0ZG93bjsKKworCQkJCQlwcmludGsKKwkJCQkJICAgICgiQXBwQ2JFdmVudChrRXBsTm10R3NPZmYpIG9yaWdpbmF0aW5nIGV2ZW50ID0gMHglWFxuIiwKKwkJCQkJICAgICBwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS4KKwkJCQkJICAgICBtX05tdEV2ZW50KTsKKworCQkJCQkvLyB3YWtlIHVwIEVwbExpbkV4aXQoKQorCQkJCQlhdG9taWNfc2V0KCZBdG9taWNTaHV0ZG93bl9nLCBUUlVFKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlCisJCQkJCSAgICAoJldhaXRRdWV1ZVNodXRkb3duX2cpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCQkJCXsKKwkJCQkJRFdPUkQgZHdCdWZmZXI7CisKKwkJCQkJLy8gY29uZmlndXJlIE9EIGZvciBNTiBpbiBzdGF0ZSBSZXNldENvbW0gYWZ0ZXIgcmVzZXRpbmcgdGhlIE9ECisJCQkJCS8vIFRPRE86IHNldHVwIHlvdXIgb3duIG5ldHdvcmsgY29uZmlndXJhdGlvbiBoZXJlCisJCQkJCWR3QnVmZmVyID0gKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfCBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUyk7CS8vIDB4MDAwMDAwMDNMCisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwMSwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDAyLAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDMsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwNCwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDA1LAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDYsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwNywKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDA4LAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MjAsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHhGRSwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDZFLAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCisvLyAgICAgICAgICAgICAgICAgICAgZHdCdWZmZXIgfD0gRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOOyAgICAvLyAweDAwMDAwMDBCTAorLy8gICAgICAgICAgICAgICAgICAgIEVwbFJldCA9IEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDZFLCAmZHdCdWZmZXIsIDQpOworCQkJCQlkd0J1ZmZlciA9IChFUExfTk9ERUFTU0lHTl9NTl9QUkVTIHwgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpOwkvLyAweDAwMDEwMDAxTAorCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4RjAsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisKKwkJCQkJLy8gY29udGludWUKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOgorCQkJCXsKKwkJCQkJdW5zaWduZWQgaW50IHVpU2l6ZTsKKworCQkJCQkvLyBmZXRjaCBvYmplY3QgMHgxMDA2IE5NVF9DeWNsZUxlbl9VMzIgZnJvbSBsb2NhbCBPRCAoaW4gbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyKQorCQkJCQkvLyBmb3IgY29uZmlndXJhdGlvbiBvZiByZW1vdGUgQ04KKwkJCQkJdWlTaXplID0gNDsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVJlYWRPYmplY3QoTlVMTCwgMCwgMHgxMDA2LAorCQkJCQkJCSAgICAgMHgwMCwKKwkJCQkJCQkgICAgICZkd19sZV9DeWNsZUxlbl9nLAorCQkJCQkJCSAgICAgJnVpU2l6ZSwKKwkJCQkJCQkgICAgIGtFcGxTZG9UeXBlQXNuZCwKKwkJCQkJCQkgICAgIE5VTEwpOworCQkJCQlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGxvY2FsIE9EIGFjY2VzcyBmYWlsZWQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGNvbnRpbnVlCisJCQkJfQorCisJCQljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMToKKwkJCQl7CisJCQkJCXByaW50aworCQkJCQkgICAgKCJBcHBDYkV2ZW50KDB4JVgpIG9yaWdpbmF0aW5nIGV2ZW50ID0gMHglWFxuIiwKKwkJCQkJICAgICBwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS4KKwkJCQkJICAgICBtX05ld05tdFN0YXRlLAorCQkJCQkgICAgIHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLgorCQkJCQkgICAgIG1fTm10RXZlbnQpOworCisJCQkJCS8vIGNvbnRpbnVlCisJCQkJfQorCisJCQljYXNlIGtFcGxObXRHc0luaXRpYWxpc2luZzoKKwkJCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwkJCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQkJY2FzZSBrRXBsTm10Q3NOb3RBY3RpdmU6CisJCQljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKy8qCisgICAgICAgICAgICBzd2l0Y2ggKHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLm1fTm10RXZlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKyAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiQXBwQ2JFdmVudCgweCVYKSBvcmlnaW5hdGluZyBldmVudCA9IDB4JVhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50QXJnX3AtPm1fTm10U3RhdGVDaGFuZ2UubV9ObXRFdmVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisqLworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEFwaUV2ZW50Q3JpdGljYWxFcnJvcjoKKwljYXNlIGtFcGxBcGlFdmVudFdhcm5pbmc6CisJCXsJCS8vIGVycm9yIG9yIHdhcm5pbmcgb2NjdXJlZCB3aXRoaW4gdGhlIHN0YWNrIG9yIHRoZSBhcHBsaWNhdGlvbgorCQkJLy8gb24gZXJyb3IgdGhlIEFQSSBsYXllciBzdG9wcyB0aGUgTk1UIHN0YXRlIG1hY2hpbmUKKworCQkJcHJpbnRrCisJCQkgICAgKCJBcHBDYkV2ZW50KEVyci9XYXJuKTogU291cmNlPSUwMlggRXBsRXJyb3I9MHglMDNYIiwKKwkJCSAgICAgcEV2ZW50QXJnX3AtPm1fSW50ZXJuYWxFcnJvci5tX0V2ZW50U291cmNlLAorCQkJICAgICBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLm1fRXBsRXJyb3IpOworCQkJLy8gY2hlY2sgYWRkaXRpb25hbCBhcmd1bWVudAorCQkJc3dpdGNoIChwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLm1fRXZlbnRTb3VyY2UpIHsKKwkJCWNhc2Uga0VwbEV2ZW50U291cmNlRXZlbnRrOgorCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VFdmVudHU6CisJCQkJewkvLyBlcnJvciBvY2N1cmVkIHdpdGhpbiBldmVudCBwcm9jZXNzaW5nCisJCQkJCS8vIGVpdGhlciBpbiBrZXJuZWwgb3IgaW4gdXNlciBwYXJ0CisJCQkJCXByaW50aygiIE9yZ1NvdXJjZT0lMDJYXG4iLAorCQkJCQkgICAgICAgcEV2ZW50QXJnX3AtPm1fSW50ZXJuYWxFcnJvci4KKwkJCQkJICAgICAgIG1fQXJnLm1fRXZlbnRTb3VyY2UpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbEV2ZW50U291cmNlRGxsazoKKwkJCQl7CS8vIGVycm9yIG9jY3VyZWQgd2l0aGluIHRoZSBkYXRhIGxpbmsgbGF5ZXIgKGUuZy4gaW50ZXJydXB0IHByb2Nlc3NpbmcpCisJCQkJCS8vIHRoZSBEV09SRCBhcmd1bWVudCBjb250YWlucyB0aGUgRExMIHN0YXRlIGFuZCB0aGUgTk1UIGV2ZW50CisJCQkJCXByaW50aygiIHZhbD0lbFhcbiIsCisJCQkJCSAgICAgICBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLgorCQkJCQkgICAgICAgbV9BcmcubV9kd0FyZyk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCXByaW50aygiXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEFwaUV2ZW50Tm9kZToKKwkJeworLy8gICAgICAgICAgICBwcmludGsoIkFwcENiRXZlbnQoTm9kZSk6IFNvdXJjZT0lMDJYIEVwbEVycm9yPTB4JTAzWCIsIHBFdmVudEFyZ19wLT5tX0ludGVybmFsRXJyb3IubV9FdmVudFNvdXJjZSwgcEV2ZW50QXJnX3AtPm1fSW50ZXJuYWxFcnJvci5tX0VwbEVycm9yKTsKKwkJCS8vIGNoZWNrIGFkZGl0aW9uYWwgYXJndW1lbnQKKwkJCXN3aXRjaCAocEV2ZW50QXJnX3AtPm1fTm9kZS5tX05vZGVFdmVudCkgeworCQkJY2FzZSBrRXBsTm10Tm9kZUV2ZW50Q2hlY2tDb25mOgorCQkJCXsKKwkJCQkJdEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGw7CisJCQkJCS8vIHVwZGF0ZSBvYmplY3QgMHgxMDA2IG9uIENOCisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZU9iamVjdCgmU2RvQ29tQ29uSGRsLAorCQkJCQkJCSAgICAgIHBFdmVudEFyZ19wLT4KKwkJCQkJCQkgICAgICBtX05vZGUubV91aU5vZGVJZCwKKwkJCQkJCQkgICAgICAweDEwMDYsIDB4MDAsCisJCQkJCQkJICAgICAgJmR3X2xlX0N5Y2xlTGVuX2csCisJCQkJCQkJICAgICAgNCwKKwkJCQkJCQkgICAgICBrRXBsU2RvVHlwZUFzbmQsCisJCQkJCQkJICAgICAgTlVMTCk7CisJCQkJCWlmIChFcGxSZXQgPT0ga0VwbEFwaVRhc2tEZWZlcnJlZCkgewkvLyBTRE8gdHJhbnNmZXIgc3RhcnRlZAorCQkJCQkJRXBsUmV0ID0ga0VwbFJlamVjdDsKKwkJCQkJfSBlbHNlIGlmIChFcGxSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gbG9jYWwgT0QgYWNjZXNzIChzaG91bGQgbm90IG9jY3VyKQorCQkJCQkJcHJpbnRrCisJCQkJCQkgICAgKCJBcHBDYkV2ZW50KE5vZGUpIHdyaXRlIHRvIGxvY2FsIE9EXG4iKTsKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3Igb2NjdXJlZAorCQkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMSk7CisKKwkJCQkJCUVwbFJldCA9CisJCQkJCQkgICAgRXBsQXBpRnJlZVNkb0NoYW5uZWwKKwkJCQkJCSAgICAoU2RvQ29tQ29uSGRsKTsKKwkJCQkJCVNkb0NvbUNvbkhkbCA9IDA7CisKKwkJCQkJCUVwbFJldCA9CisJCQkJCQkgICAgRXBsQXBpV3JpdGVPYmplY3QKKwkJCQkJCSAgICAoJlNkb0NvbUNvbkhkbCwKKwkJCQkJCSAgICAgcEV2ZW50QXJnX3AtPm1fTm9kZS4KKwkJCQkJCSAgICAgbV91aU5vZGVJZCwgMHgxMDA2LCAweDAwLAorCQkJCQkJICAgICAmZHdfbGVfQ3ljbGVMZW5fZywgNCwKKwkJCQkJCSAgICAga0VwbFNkb1R5cGVBc25kLCBOVUxMKTsKKwkJCQkJCWlmIChFcGxSZXQgPT0ga0VwbEFwaVRhc2tEZWZlcnJlZCkgewkvLyBTRE8gdHJhbnNmZXIgc3RhcnRlZAorCQkJCQkJCUVwbFJldCA9IGtFcGxSZWplY3Q7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXByaW50aworCQkJCQkJCSAgICAoIkFwcENiRXZlbnQoTm9kZSk6IEVwbEFwaVdyaXRlT2JqZWN0KCkgcmV0dXJuZWQgMHglMDJYXG4iLAorCQkJCQkJCSAgICAgRXBsUmV0KTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxBcGlFdmVudFNkbzoKKwkJewkJLy8gU0RPIHRyYW5zZmVyIGZpbmlzaGVkCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaUZyZWVTZG9DaGFubmVsKHBFdmVudEFyZ19wLT5tX1Nkby4KKwkJCQkJCSBtX1Nkb0NvbUNvbkhkbCk7CisJCQlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJYnJlYWs7CisJCQl9CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQlpZiAocEV2ZW50QXJnX3AtPm1fU2RvLm1fU2RvQ29tQ29uU3RhdGUgPT0ga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpIHsJLy8gY29udGludWUgYm9vdC11cCBvZiBDTiB3aXRoIE5NVCBjb21tYW5kIFJlc2V0IENvbmZpZ3VyYXRpb24KKwkJCQlFcGxSZXQgPQorCQkJCSAgICBFcGxBcGlNblRyaWdnZXJTdGF0ZUNoYW5nZShwRXZlbnRBcmdfcC0+CisJCQkJCQkJICAgICAgIG1fU2RvLm1fdWlOb2RlSWQsCisJCQkJCQkJICAgICAgIGtFcGxObXROb2RlQ29tbWFuZENvbmZSZXNldCk7CisJCQl9IGVsc2UgewkvLyBpbmRpY2F0ZSBjb25maWd1cmF0aW9uIGVycm9yIENOCisJCQkJRXBsUmV0ID0KKwkJCQkgICAgRXBsQXBpTW5UcmlnZ2VyU3RhdGVDaGFuZ2UocEV2ZW50QXJnX3AtPgorCQkJCQkJCSAgICAgICBtX1Nkby5tX3VpTm9kZUlkLAorCQkJCQkJCSAgICAgICBrRXBsTm10Tm9kZUNvbW1hbmRDb25mRXJyKTsKKwkJCX0KKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIEVwbFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQXBwQ2JTeW5jCisvLworLy8gRGVzY3JpcHRpb246IHN5bmMgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGJ5IGV2ZW50IG1vZHVsZSB3aXRoaW4KKy8vICAgICAgICAgICAgICBrZXJuZWwgcGFydCAoaGlnaCBwcmlvcml0eSkuCisvLyAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBvdXRwdXRzLCByZWFkcyB0aGUgaW5wdXRzIGFuZCBydW5zCisvLyAgICAgICAgICAgICAgdGhlIGNvbnRyb2wgbG9vcC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFcGxTdWNjZXNzZnVsID0gbm8gZXJyb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPSBwb3N0IGVycm9yIGV2ZW50IHRvIEFQSSBsYXllcgorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEFwcENiU3luYyh2b2lkKQoreworCXRFcGxLZXJuZWwgRXBsUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoYlZhck91dDFPbGRfbCAhPSBiVmFyT3V0MV9sKSB7CS8vIG91dHB1dCB2YXJpYWJsZSBoYXMgY2hhbmdlZAorCQliVmFyT3V0MU9sZF9sID0gYlZhck91dDFfbDsKKwkJLy8gc2V0IExFRHMKKworLy8gICAgICAgIHByaW50aygiYlZhckluID0gMHglMDJYIGJWYXJPdXQgPSAweCUwMlhcbiIsIChXT1JEKSBiVmFySW5fbCwgKFdPUkQpIGJWYXJPdXRfbCk7CisJfQorCWlmICh1aU5vZGVJZF9nICE9IEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCkgeworCQliVmFySW4xX2wrKzsKKwl9CisKKwlpZiAodWlOb2RlSWRfZyA9PSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQpIHsJLy8gd2UgYXJlIHRoZSBtYXN0ZXIgYW5kIG11c3QgcnVuIHRoZSBjb250cm9sIGxvb3AKKworCQkvLyBjb2xsZWN0IGlucHV0cyBmcm9tIENOcyBhbmQgb3duIGlucHV0CisJCWJTcGVlZFNlbGVjdF9sID0gKGJWYXJJbjFfbCB8IGFiU2VsZWN0X2xbMF0pICYgMHgwNzsKKworCQliTW9kZVNlbGVjdF9sID0gYWJTZWxlY3RfbFsxXSB8IGFiU2VsZWN0X2xbMl07CisKKwkJaWYgKChiTW9kZVNlbGVjdF9sICYgQVBQX01PREVfTUFTSykgIT0gMCkgeworCQkJZHdNb2RlX2wgPSBiTW9kZVNlbGVjdF9sICYgQVBQX01PREVfTUFTSzsKKwkJfQorCisJCWlDdXJDeWNsZUNvdW50X2wtLTsKKworCQlpZiAoaUN1ckN5Y2xlQ291bnRfbCA8PSAwKSB7CisJCQlpZiAoKGR3TW9kZV9sICYgMHgwMSkgIT0gMCkgewkvLyBmaWxsLXVwCisJCQkJaWYgKGlUb2dnbGUpIHsKKwkJCQkJaWYgKChkd0xlZHNfbCAmIEFQUF9ET1VCTEVfTEVEX01BU0spID09CisJCQkJCSAgICAweDAwKSB7CisJCQkJCQlkd0xlZHNfbCA9IDB4MDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkd0xlZHNfbCA8PD0gMTsKKwkJCQkJCWR3TGVkc19sKys7CisJCQkJCQlpZiAoZHdMZWRzX2wgPj0KKwkJCQkJCSAgICBBUFBfRE9VQkxFX0xFRF9NQVNLKSB7CisJCQkJCQkJaVRvZ2dsZSA9IDA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlkd0xlZHNfbCA8PD0gMTsKKwkJCQkJaWYgKChkd0xlZHNfbCAmIEFQUF9ET1VCTEVfTEVEX01BU0spID09CisJCQkJCSAgICAweDAwKSB7CisJCQkJCQlpVG9nZ2xlID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCQliTGVkc1JvdzFfbCA9CisJCQkJICAgICh1bnNpZ25lZCBjaGFyKShkd0xlZHNfbCAmIEFQUF9MRURfTUFTSyk7CisJCQkJYkxlZHNSb3cyX2wgPQorCQkJCSAgICAodW5zaWduZWQgY2hhcikoKGR3TGVkc19sID4+IEFQUF9MRURfQ09VTlQpCisJCQkJCQkgICAgJiBBUFBfTEVEX01BU0spOworCQkJfQorCisJCQllbHNlIGlmICgoZHdNb2RlX2wgJiAweDAyKSAhPSAwKSB7CS8vIHJ1bm5pbmcgbGlnaHQgZm9yd2FyZAorCQkJCWR3TGVkc19sIDw8PSAxOworCQkJCWlmICgoZHdMZWRzX2wgPiBBUFBfRE9VQkxFX0xFRF9NQVNLKQorCQkJCSAgICB8fCAoZHdMZWRzX2wgPT0gMHgwMDAwMDAwMEwpKSB7CisJCQkJCWR3TGVkc19sID0gMHgwMTsKKwkJCQl9CisJCQkJYkxlZHNSb3cxX2wgPQorCQkJCSAgICAodW5zaWduZWQgY2hhcikoZHdMZWRzX2wgJiBBUFBfTEVEX01BU0spOworCQkJCWJMZWRzUm93Ml9sID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIpKChkd0xlZHNfbCA+PiBBUFBfTEVEX0NPVU5UKQorCQkJCQkJICAgICYgQVBQX0xFRF9NQVNLKTsKKwkJCX0KKworCQkJZWxzZSBpZiAoKGR3TW9kZV9sICYgMHgwNCkgIT0gMCkgewkvLyBydW5uaW5nIGxpZ2h0IGJhY2t3YXJkCisJCQkJZHdMZWRzX2wgPj49IDE7CisJCQkJaWYgKChkd0xlZHNfbCA+IEFQUF9ET1VCTEVfTEVEX01BU0spCisJCQkJICAgIHx8IChkd0xlZHNfbCA9PSAweDAwMDAwMDAwTCkpIHsKKwkJCQkJZHdMZWRzX2wgPSAxIDw8IChBUFBfTEVEX0NPVU5UICogMik7CisJCQkJfQorCQkJCWJMZWRzUm93MV9sID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIpKGR3TGVkc19sICYgQVBQX0xFRF9NQVNLKTsKKwkJCQliTGVkc1JvdzJfbCA9CisJCQkJICAgICh1bnNpZ25lZCBjaGFyKSgoZHdMZWRzX2wgPj4gQVBQX0xFRF9DT1VOVCkKKwkJCQkJCSAgICAmIEFQUF9MRURfTUFTSyk7CisJCQl9CisKKwkJCWVsc2UgaWYgKChkd01vZGVfbCAmIDB4MDgpICE9IDApIHsJLy8gS25pZ2h0cmlkZXIKKwkJCQlpZiAoYkxlZHNSb3cxX2wgPT0gMHgwMCkgeworCQkJCQliTGVkc1JvdzFfbCA9IDB4MDE7CisJCQkJCWlUb2dnbGUgPSAxOworCQkJCX0gZWxzZSBpZiAoaVRvZ2dsZSkgeworCQkJCQliTGVkc1JvdzFfbCA8PD0gMTsKKwkJCQkJaWYgKGJMZWRzUm93MV9sID49CisJCQkJCSAgICAoMSA8PCAoQVBQX0xFRF9DT1VOVCAtIDEpKSkgeworCQkJCQkJaVRvZ2dsZSA9IDA7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQliTGVkc1JvdzFfbCA+Pj0gMTsKKwkJCQkJaWYgKGJMZWRzUm93MV9sIDw9IDB4MDEpIHsKKwkJCQkJCWlUb2dnbGUgPSAxOworCQkJCQl9CisJCQkJfQorCQkJCWJMZWRzUm93Ml9sID0gYkxlZHNSb3cxX2w7CisJCQl9CisKKwkJCWVsc2UgaWYgKChkd01vZGVfbCAmIDB4MTApICE9IDApIHsJLy8gS25pZ2h0cmlkZXIKKwkJCQlpZiAoKGJMZWRzUm93MV9sID09IDB4MDApCisJCQkJICAgIHx8IChiTGVkc1JvdzJfbCA9PSAweDAwKQorCQkJCSAgICB8fCAoKGJMZWRzUm93Ml9sICYgfkFQUF9MRURfTUFTSykgIT0gMCkpIHsKKwkJCQkJYkxlZHNSb3cxX2wgPSAweDAxOworCQkJCQliTGVkc1JvdzJfbCA9CisJCQkJCSAgICAoMSA8PCAoQVBQX0xFRF9DT1VOVCAtIDEpKTsKKwkJCQkJaVRvZ2dsZSA9IDE7CisJCQkJfSBlbHNlIGlmIChpVG9nZ2xlKSB7CisJCQkJCWJMZWRzUm93MV9sIDw8PSAxOworCQkJCQliTGVkc1JvdzJfbCA+Pj0gMTsKKwkJCQkJaWYgKGJMZWRzUm93MV9sID49CisJCQkJCSAgICAoMSA8PCAoQVBQX0xFRF9DT1VOVCAtIDEpKSkgeworCQkJCQkJaVRvZ2dsZSA9IDA7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQliTGVkc1JvdzFfbCA+Pj0gMTsKKwkJCQkJYkxlZHNSb3cyX2wgPDw9IDE7CisJCQkJCWlmIChiTGVkc1JvdzFfbCA8PSAweDAxKSB7CisJCQkJCQlpVG9nZ2xlID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIHNldCBvd24gb3V0cHV0CisJCQliVmFyT3V0MV9sID0gYkxlZHNSb3cxX2w7CisvLyAgICAgICAgICAgIGJWYXJPdXQxX2wgPSAoYkxlZHNSb3cxX2wgJiAweDAzKSB8IChiTGVkc1JvdzJfbCA8PCAyKTsKKworCQkJLy8gcmVzdGFydCBjeWNsZSBjb3VudGVyCisJCQlpQ3VyQ3ljbGVDb3VudF9sID0gaU1heEN5Y2xlQ291bnRfbDsKKwkJfQorCisJCWlmIChiU3BlZWRTZWxlY3RPbGRfbCA9PSAwKSB7CisJCQlpZiAoKGJTcGVlZFNlbGVjdF9sICYgMHgwMSkgIT0gMCkgeworCQkJCWlmIChpTWF4Q3ljbGVDb3VudF9sIDwgMjAwKSB7CisJCQkJCWlNYXhDeWNsZUNvdW50X2wrKzsKKwkJCQl9CisJCQkJYlNwZWVkU2VsZWN0T2xkX2wgPSBiU3BlZWRTZWxlY3RfbDsKKwkJCX0gZWxzZSBpZiAoKGJTcGVlZFNlbGVjdF9sICYgMHgwMikgIT0gMCkgeworCQkJCWlmIChpTWF4Q3ljbGVDb3VudF9sID4gMSkgeworCQkJCQlpTWF4Q3ljbGVDb3VudF9sLS07CisJCQkJfQorCQkJCWJTcGVlZFNlbGVjdE9sZF9sID0gYlNwZWVkU2VsZWN0X2w7CisJCQl9IGVsc2UgaWYgKChiU3BlZWRTZWxlY3RfbCAmIDB4MDQpICE9IDApIHsKKwkJCQlpTWF4Q3ljbGVDb3VudF9sID0gREVGQVVMVF9NQVhfQ1lDTEVfQ09VTlQ7CisJCQkJYlNwZWVkU2VsZWN0T2xkX2wgPSBiU3BlZWRTZWxlY3RfbDsKKwkJCX0KKwkJfSBlbHNlIGlmIChiU3BlZWRTZWxlY3RfbCA9PSAwKSB7CisJCQliU3BlZWRTZWxlY3RPbGRfbCA9IDA7CisJCX0KKwl9CisKKwlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxKTsKKworCXJldHVybiBFcGxSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9lZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2VkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU5ODRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9lZHJ2LmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbnRlcmZhY2UgZm9yIGV0aGVybmV0ZHJpdmVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogZWRydi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIERldiBDKysgYW5kIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMDgvMDEgbS5iLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FRFJWX0hfCisjZGVmaW5lIF9FRFJWX0hfCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJFcGxGcmFtZS5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1BWF9FVEhfREFUQV9TSVpFICAgICAgIDE1MDAKKyNkZWZpbmUgTUlOX0VUSF9EQVRBX1NJWkUgICAgICAgICA0NgorCisjZGVmaW5lIEVUSF9IRFJfT0ZGU0VUIAkgMAkvLyBFdGhlcm5ldCBoZWFkZXIgYXQgdGhlIHRvcCBvZiB0aGUgZnJhbWUKKyNkZWZpbmUgRVRIX0hEUl9TSVpFCTE0CS8vIHNpemUgb2YgRXRoZXJuZXQgaGVhZGVyCisjZGVmaW5lIE1JTl9FVEhfU0laRSAgICAgKE1JTl9FVEhfREFUQV9TSVpFICsgRVRIX0hEUl9TSVpFKQkvLyB3aXRob3V0IENSQworCisjZGVmaW5lIEVUSF9DUkNfU0laRQkgNAkvLyBzaXplIG9mIEV0aGVybmV0IENSQywgaS5lLiBGQ1MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBwb3NpdGlvbiBvZiBhIGJ1ZmZlciBpbiBhbiBldGhlcm5ldC1mcmFtZQordHlwZWRlZiBlbnVtIHsKKwlrRWRydkJ1ZmZlckZpcnN0SW5GcmFtZSA9IDB4MDEsCS8vIGZpcnN0IGRhdGEgYnVmZmVyIGluIGFuIGV0aGVybmV0IGZyYW1lCisJa0VkcnZCdWZmZXJNaWRkbGVJbkZyYW1lID0gMHgwMiwJLy8gYSBtaWRkbGUgZGF0YSBidWZmZXIgaW4gYW4gZXRoZXJuZXQgZnJhbWUKKwlrRWRydkJ1ZmZlckxhc3RJbkZyYW1lID0gMHgwNAkvLyBsYXN0IGRhdGEgYnVmZmVyIGluIGFuIGV0aGVybmV0IGZyYW1lCit9IHRFZHJ2QnVmZmVySW5GcmFtZTsKKworLy8gZm9ybWF0IG9mIGEgdHgtYnVmZmVyCit0eXBlZGVmIHN0cnVjdCBfdEVkcnZUeEJ1ZmZlciB7CisJdEVwbE1zZ1R5cGUgbV9FcGxNc2dUeXBlOwkvLyBJTjogdHlwZSBvZiBFUEwgbWVzc2FnZSwgc2V0IGJ5IGNhbGxpbmcgZnVuY3Rpb24KKwl1bnNpZ25lZCBpbnQgbV91aVR4TXNnTGVuOwkvLyBJTjogbGVuZ3RoIG9mIG1lc3NhZ2UgdG8gYmUgc2VuZCAoc2V0IGZvciBlYWNoIHRyYW5zbWl0IGNhbGwpCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXVuc2lnbmVkIGludCBtX3VpQnVmZmVyTnVtYmVyOwkvLyBPVVQ6IG51bWJlciBvZiB0aGUgYnVmZmVyLCBzZXQgYnkgZXRoZXJuZXRkcml2ZXIKKwlCWVRFICptX3BiQnVmZmVyOwkvLyBPVVQ6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciwgc2V0IGJ5IGV0aGVybmV0ZHJpdmVyCisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOwkvLyBPVVQ6IFRpbWVzdGFtcCBvZiBlbmQgb2YgdHJhbnNtaXNzaW9uLCBzZXQgYnkgZXRoZXJuZXRkcml2ZXIKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJdW5zaWduZWQgaW50IG1fdWlNYXhCdWZmZXJMZW47CS8vIElOL09VVDogbWF4aW11bSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorfSB0RWRydlR4QnVmZmVyOworCisvLyBmb3JtYXQgb2YgYSByeC1idWZmZXIKK3R5cGVkZWYgc3RydWN0IF90RWRydlJ4QnVmZmVyIHsKKwl0RWRydkJ1ZmZlckluRnJhbWUgbV9CdWZmZXJJbkZyYW1lOwkvLyBPVVQgcG9zaXRpb24gb2YgcmVjZWl2ZWQgYnVmZmVyIGluIGFuIGV0aGVybmV0LWZyYW1lCisJdW5zaWduZWQgaW50IG1fdWlSeE1zZ0xlbjsJLy8gT1VUOiBsZW5ndGggb2YgcmVjZWl2ZWQgYnVmZmVyICh3aXRob3V0IENSQykKKwlCWVRFICptX3BiQnVmZmVyOwkvLyBPVVQ6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciwgc2V0IGJ5IGV0aGVybmV0ZHJpdmVyCisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOwkvLyBPVVQ6IFRpbWVzdGFtcCBvZiBlbmQgb2YgcmVjZWlwdGlvbgorCit9IHRFZHJ2UnhCdWZmZXI7CisKKy8vdHlwZWRlZiB2b2lkICgqdEVkcnZSeEhhbmRsZXIpIChCWVRFIGJCdWZmZXJJbkZyYW1lX3AsIHRCdWZmZXJEZXNjciAqIHBiQnVmZmVyX3ApOworLy90eXBlZGVmIHZvaWQgKCp0RWRydlJ4SGFuZGxlcikgKEJZVEUgYkJ1ZmZlckluRnJhbWVfcCwgQllURSAqIHBiRXRoZXJuZXREYXRhX3AsIFdPUkQgd0RhdGFMZW5fcCk7Cit0eXBlZGVmIHZvaWQgKCp0RWRydlJ4SGFuZGxlcikgKHRFZHJ2UnhCdWZmZXIgKiBwUnhCdWZmZXJfcCk7Cit0eXBlZGVmIHZvaWQgKCp0RWRydlR4SGFuZGxlcikgKHRFZHJ2VHhCdWZmZXIgKiBwVHhCdWZmZXJfcCk7CisKKy8vIGZvcm1hdCBvZiBpbml0IHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9hYk15TWFjQWRkcls2XTsJLy8gdGhlIG93biBNQUMgYWRkcmVzcworCisvLyAgICBCWVRFICAgICAgICAgICAgbV9iTm9PZlJ4QnVmZkRlc2NyOyAgICAgLy8gbnVtYmVyIG9mIGVudHJpZXMgaW4gcnggYnVmZmVyZGVzY3JpcHRvciB0YWJsZQorLy8gICAgdEJ1ZmZlckRlc2NyICogIG1fcFJ4QnVmZkRlc2NyVGFibGU7ICAgIC8vIHJ4IGJ1ZmZlcmRlc2NyaXB0b3IgdGFibGUKKy8vICAgIFdPUkQgICAgICAgICAgICBtX3dSeEJ1ZmZlclNpemU7ICAgICAgICAvLyBzaXplIG9mIHRoZSB3aG9sZSByeCBidWZmZXIKKworCXRFZHJ2UnhIYW5kbGVyIG1fcGZuUnhIYW5kbGVyOworCXRFZHJ2VHhIYW5kbGVyIG1fcGZuVHhIYW5kbGVyOworCit9IHRFZHJ2SW5pdFBhcmFtOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFZHJ2SW5pdCh0RWRydkluaXRQYXJhbSAqIHBFZHJ2SW5pdFBhcmFtX3ApOworCit0RXBsS2VybmVsIEVkcnZTaHV0ZG93bih2b2lkKTsKKwordEVwbEtlcm5lbCBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoQllURSAqIHBiTWFjQWRkcl9wKTsKK3RFcGxLZXJuZWwgRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoQllURSAqIHBiTWFjQWRkcl9wKTsKKworLy90RXBsS2VybmVsIEVkcnZEZWZpbmVVbmljYXN0RW50cnkgICAgIChCWVRFICogcGJVQ0VudHJ5X3ApOworLy90RXBsS2VybmVsIEVkcnZVbmRmaW5lVW5pY2FzdEVudHJ5ICAgIChCWVRFICogcGJVQ0VudHJ5X3ApOworCit0RXBsS2VybmVsIEVkcnZBbGxvY1R4TXNnQnVmZmVyKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApOwordEVwbEtlcm5lbCBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApOworCisvL3RFcGxLZXJuZWwgRWRydldyaXRlTXNnICAgICAgICAgICAgICAgKHRCdWZmZXJEZXNjciAqIHBiQnVmZmVyX3ApOwordEVwbEtlcm5lbCBFZHJ2U2VuZFR4TXNnKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApOwordEVwbEtlcm5lbCBFZHJ2VHhNc2dSZWFkeSh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKTsKK3RFcGxLZXJuZWwgRWRydlR4TXNnU3RhcnQodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCk7CisKKy8vdEVwbEtlcm5lbCBFZHJ2UmVhZE1zZyAgICAgICAgICAgICAgICAodm9pZCk7CisKKy8vIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0YXJnZXQgc3BlY2lmaWMgaW50ZXJydXB0IGhhbmRsZXIKK3ZvaWQgRWRydkludGVycnVwdEhhbmRsZXIodm9pZCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FRFJWX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2dsb2JhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9nbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE2NzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9nbG9iYWwuaApAQCAtMCwwICsxLDEzOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBnbG9iYWwgcHJvamVjdCBkZWZpbml0aW9uIGZpbGUKKworICAgIDEyLjA2LjE5OTggICAtcnMKKyAgICAxMS4wMi4yMDAyICAgci5kLiBFcndlaXRlcnVuZ2VuLCBFcmdhZW56dW5nZW4KKyAgICAyMC4wOC4yMDAyICAgU1lTIFRFQyBlbGVjdHJvbmljIC1hcworICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIFNjaGx1ZXNzZWx3b3J0ICdHRU5FUklDJworICAgICAgICAgICAgICAgICBmdWVyIGRhcyBFcnpldWdlbiB2b24gR2VuZXJpYyBQb2ludGVyCisgICAgMjguMDguMjAwMiAgIHIuZC4gZXJ3ZWl0ZXJ0ZXIgU1lTIFRFQyBEZWJ1ZyBDb2RlCisgICAgMTYuMDkuMjAwMiAgIHIuZC4ga29tcGxldHRlIFVlYmVyc2V0enVuZyBpbiBFbmdsaXNjaAorICAgIDExLjA0LjIwMDMgICBmLmouIEVyZ2Flbnp1bmcgZnVlciBNaXRzdWJpc2hpIE5DMzAgQ29tcGlsZXIKKyAgICAxNy4wNi4yMDAzICAgLXJzICBEZWZpbml0aW9uIHZvbiBCYXNpc3R5cGVuIGluIDwjaWZuZGVmIF9XSU5ERUZfPiBnZXNldHp0CisgICAgMTYuMDQuMjAwNCAgIHIuZC4gRXJnYWVuenVuZyBmdWVyIEJvcmxhbmQgQysrIEJ1aWxkZXIKKyAgICAzMC4wOC4yMDA0ICAgLXJzICBUUkFDRTUgZWluZ2Vm/Gd0CisgICAgMjMuMTIuMjAwNSAgIGQuay4gRGVmaW5pdGlvbnMgZm9yIElBUiBjb21waWxlcgorCisgICAgJElkOiBnbG9iYWwuaCx2IDEuNiAyMDA4LzExLzA3IDEzOjU1OjU2IEQuS3J1ZWdlciBFeHAgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9HTE9CQUxfSF8KKyNkZWZpbmUgX0dMT0JBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGVsZW1lbnRzIG9mIGRlZmluZXMgZm9yIGRldmVsb3BtZW50IHN5c3RlbQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdGhlc2UgZGVmaW5lcyBhcmUgbmVjZXNzYXJ5IHRvIGNoZWNrIHNvbWUgb2YgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBkZXZlbG9wbWVudCBzeXN0ZW0KKyNkZWZpbmUgX0RFVl9CSUdFTkRfICAgICAgICAgICAgMHg4MDAwMDAwMEwJLy8gYmlnIGVuZGlhbiAobW90b3JvbGxhIGZvcm1hdCkKKyNkZWZpbmUgX0RFVl9BTElHTk1FTlRfNF8gICAgICAgMHgwMDQwMDAwMEwJLy8gICAgICAgICAgICAgICAgICB0aGUgQ1BVIG5lZWRzIGFsaWdubWVudCBvZiA0IGJ5dGVzCisjZGVmaW5lIF9ERVZfT05MWV9JTlRfTUFJTl8gICAgIDB4MDAwMDQwMDBMCS8vICAgICAgICAgICAgICAgICAgdGhlIGNvbXBpbGVyIG5lZWRzICJpbnQgbWFpbihpbnQpIiBpbnN0ZWFkIG9mICJ2b2lkIG1haW4odm9pZCkiCisjZGVmaW5lIF9ERVZfQ09NTUFfRVhUXyAgICAgICAgIDB4MDAwMDIwMDBMCS8vICAgICAgICAgICAgICAgICAgc3VwcG9ydCBvZiBsYXN0IGNvbW1hIGluIHN0cnVjdCBwcmVkZWZpbml0aW9uCisjZGVmaW5lIF9ERVZfNjRCSVRfU1VQUE9SVF8gICAgIDB4MDAwMDEwMDBMCS8vICAgICAgICAgICAgICAgICAgc3VwcG9ydCBvZiA2NCBiaXQgb3BlcmF0aW9ucworI2RlZmluZSBfREVWX0JJVDY0XyAgICAgICAgICAgICAweDAwMDAwNDAwTAkvLyBjb3VudCBvZiBiaXRzOiAgIDY0IGJpdAorI2RlZmluZSBfREVWX0JJVDMyXyAgICAgICAgICAgICAweDAwMDAwMzAwTAkvLyAgICAgICAgICAgICAgICAgIDMyIGJpdAorI2RlZmluZSBfREVWX0JJVDE2XyAgICAgICAgICAgICAweDAwMDAwMjAwTAkvLyAgICAgICAgICAgICAgICAgIDE2IGJpdAorI2RlZmluZSBfREVWX0JJVDhfICAgICAgICAgICAgICAweDAwMDAwMTAwTAkvLyAgICAgICAgICAgICAgICAgIDggYml0CisjZGVmaW5lIF9ERVZfUlZDVF9BUk1fICAgICAgICAgIDB4MDAwMDAwMUNMCS8vICAgICAgICAgICAgICAgICAgUmVhbFZpZXcgQVJNCisjZGVmaW5lIF9ERVZfUkVORVNBU00zMkMgICAgICAgIDB4MDAwMDAwMUJMCS8vIGNvbXBpbGVyIGZyb206ICAgUmVuZXNhcworI2RlZmluZSBfREVWX0dOVUNfTUlQUzJfICAgICAgICAweDAwMDAwMDFBTAkvLyAgICAgICAgICAgICAgICAgIEdOVSBmb3IgTUlQUzIKKyNkZWZpbmUgX0RFVl9NUExBQl9DMzBfICAgICAgICAgMHgwMDAwMDAxOUwJLy8gICAgICAgICAgICAgICAgICBNUExBQiBDMzAgZm9yIE1pY3JvY2hpcCBkc1BJQzMzRiBzZXJpZXMKKyNkZWZpbmUgX0RFVl9HTlVDX1RDXyAgICAgICAgICAgMHgwMDAwMDAxOEwJLy8gICAgICAgICAgICAgICAgICBHTlUgZm9yIEluZmluZW9uIFRyaUNvcmUKKyNkZWZpbmUgX0RFVl9HTlVDX1g4Nl8gICAgICAgICAgMHgwMDAwMDAxN0wJLy8gICAgICAgICAgICAgICAgICBHTlUgZm9yIEkzODYKKyNkZWZpbmUgX0RFVl9JQVJfQVJNXyAgICAgICAgICAgMHgwMDAwMDAxNkwJLy8gICAgICAgICAgICAgICAgICBBUk0gSUFSIEMvQysrIENvbXBpbGVyCisjZGVmaW5lIF9ERVZfUEFSQURHTV9YODYgICAgICAgIDB4MDAwMDAwMTVMCS8vICAgICAgICAgICAgICAgICAgUGFyYWRpZ20gQy9DKysgZm9yIEJlY2sgMXgzCisjZGVmaW5lIF9ERVZfR05VQ19DRl8gICAgICAgICAgIDB4MDAwMDAwMTRMCS8vICAgICAgICAgICAgICAgICAgR05VIGZvciBDb2xkZmlyZQorI2RlZmluZSBfREVWX0tFSUxfQVJNXyAgICAgICAgICAweDAwMDAwMDEzTAkvLyAgICAgICAgICAgICAgICAgIEtlaWwgQVJNCisjZGVmaW5lIF9ERVZfTVNFVkNfICAgICAgICAgICAgIDB4MDAwMDAwMTJMCS8vICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IGVtYmVkZGVkIFZpc3VhbCBDL0MrKworI2RlZmluZSBfREVWX0hJR0hURUNfR05VQ19YODZfICAweDAwMDAwMDExTAkvLyAgICAgICAgICAgICAgICAgIEhpZ2h0ZWMgZWxmMzg2IGdjYworI2RlZmluZSBfREVWX01TVkNfUlRYXyAgICAgICAgICAweDAwMDAwMDEwTAkvLyAgICAgICAgICAgICAgICAgIFZDNjAwICsgUlRYCisjZGVmaW5lIF9ERVZfTVNWQ19WMV81XyAgICAgICAgIDB4MDAwMDAwMEZMCS8vICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDL0MrKyBWMS41CisjZGVmaW5lIF9ERVZfR05VQ19BUk03XyAgICAgICAgIDB4MDAwMDAwMEVMCS8vICAgICAgICAgICAgICAgICAgR05VIENvbXBpbGVyIGdjYyBmb3IgQVJNNworI2RlZmluZSBfREVWX01FVFJPV0VSS1NfQ1dfICAgICAweDAwMDAwMDBETAkvLyAgICAgICAgICAgICAgICAgIE1ldHJvd2Vya3MgQ29kZSBXYXJyaW9yCisjZGVmaW5lIF9ERVZfTUlUU1VCSVNISU0xNkNfICAgIDB4MDAwMDAwMENMCS8vY29tcGlsZXIgZnJvbTogICAgTWl0c3ViaXNoaQorI2RlZmluZSBfREVWX0dOVUNfQzE2WF8gICAgICAgICAweDAwMDAwMDBCTAkvLyAgICAgICAgICAgICAgICAgIEdOVSBDb21waWxlciBnY2MxNjYgZm9yIEluZmluZW9uIEMxNngKKyNkZWZpbmUgX0RFVl9MSU5VWF9HQ0NfICAgICAgICAgMHgwMDAwMDAwQUwJLy8gICAgICAgICAgICAgICAgICBMaW51eCBHTlUgQ29tcGlsZXIgZ2NjCisjZGVmaW5lIF9ERVZfR05VQ19NUEM1WDUgICAgICAgIDB4MDAwMDAwMDlMCS8vICAgICAgICAgICAgICAgICAgR05VIGZvciBNb3Rvcm9sYSBQUEM1eDUKKyNkZWZpbmUgX0RFVl9UQVNLSU5HTTE2Q18gICAgICAgMHgwMDAwMDAwOEwJLy8gICAgICAgICAgICAgICAgICBUYXNraW5nIGZvciBNaXRzdWJpc2hpIE0xNkMKKyNkZWZpbmUgX0RFVl9GVUpJVFNVXyAgICAgICAgICAgMHgwMDAwMDAwN0wJLy8gICAgICAgICAgICAgICAgICBGdWppdHN1CisjZGVmaW5lIF9ERVZfVEFTS0lORzhfICAgICAgICAgIDB4MDAwMDAwMDZMCS8vICAgICAgICAgICAgICAgICAgVGFza2luZyA4MDUxCisjZGVmaW5lIF9ERVZfVEFTS0lORzE2XyAgICAgICAgIDB4MDAwMDAwMDVMCS8vICAgICAgICAgICAgICAgICAgVGFza2luZyAxNjYKKyNkZWZpbmUgX0RFVl9LRUlMOF8gICAgICAgICAgICAgMHgwMDAwMDAwNEwJLy8gICAgICAgICAgICAgICAgICBLZWlsIEM1MQorI2RlZmluZSBfREVWX0tFSUwxNl8gICAgICAgICAgICAweDAwMDAwMDAzTAkvLyAgICAgICAgICAgICAgICAgIEtlaWwgQzE2NgorI2RlZmluZSBfREVWX0JPUkxBTkRDXyAgICAgICAgICAweDAwMDAwMDAyTAkvLyAgICAgICAgICAgICAgICAgIEJvcmxhbmQgQy9DKysKKyNkZWZpbmUgX0RFVl9NU1ZDMTZfICAgICAgICAgICAgMHgwMDAwMDAwMUwJLy8gICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMvQysrCisjZGVmaW5lIF9ERVZfTVNWQzMyXyAgICAgICAgICAgIDB4MDAwMDAwMDBMCS8vICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDL0MrKworCisvLyB0aGVzZSBkZWZpbmVzIGNhbiBiZSB1c2VkIHRvIG1hc2sgcHJldmlvdXMgZWxlbWVudHMKKyNkZWZpbmUgX0RFVl9NQVNLX0NPTVBJTEVSICAgICAgMHgwMDAwMDBGRkwKKyNkZWZpbmUgX0RFVl9NQVNLX0JJVENPVU5UICAgICAgMHgwMDAwMEYwMEwKKyNkZWZpbmUgX0RFVl9NQVNLX0FERFNVUFBPUlQgICAgMHgwMDAwRjAwMEwKKyNkZWZpbmUgX0RFVl9NQVNLX0FMSUdOTUVOVCAgICAgMHgwMEYwMDAwMEwKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbmVzIGZvciBkZXZlbG9wbWVudCBzeXN0ZW0gKERFVl9TWVNURU0pIGluY2x1ZGluZyBwcmV2aW91cyBlbGVtZW50cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBfREVWX1dJTjE2XyAgICAgICAgICAgICAoX0RFVl9CSVQxNl8gfCBfREVWX01TVkMxNl8gICAgICAgICAgICAgICAgICApCisjZGVmaW5lIF9ERVZfV0lOMzJfICAgICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTVNWQzMyXyAgICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfTVNWQ19ET1NfICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTVNWQ19WMV81XyAgICAgICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9CT1JMQU5EX0RPU18gICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9CT1JMQU5EQ18gICAgICAgICAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9LRUlMX0M1MVhfICAgICAgICAgKF9ERVZfQklUOF8gIHwgX0RFVl9LRUlMOF8gICAgIHwgX0RFVl9CSUdFTkRfIHwgX0RFVl9DT01NQV9FWFRfKQkvLyBhdCBsZWFzdCBDNTEgdmVyc2lvbiA3LjA1IHN1cHBvcnRzIGNvbW1hIGV4dGVuc2lvbgorI2RlZmluZSBfREVWX0tFSUxfQzE2WF8gICAgICAgICAoX0RFVl9CSVQxNl8gfCBfREVWX0tFSUwxNl8gICAgICAgICAgICAgICAgICAgfCBfREVWX0NPTU1BX0VYVF8pCS8vIGF0IGxlYXN0IEMxNjYgdmVyc2lvbiA1LjAzIHN1cHBvcnRzIGNvbW1hIGV4dGVuc2lvbgorI2RlZmluZSBfREVWX1RBU0tJTkdfQzUxWF8gICAgICAoX0RFVl9CSVQ4XyAgfCBfREVWX1RBU0tJTkc4XyAgfCBfREVWX0JJR0VORF8pCisjZGVmaW5lIF9ERVZfVEFTS0lOR19DMTZYXyAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfVEFTS0lORzE2XyAgICAgICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9GVUpJVFNVX0Y1OTBfICAgICAgKF9ERVZfQklUOF8gIHwgX0RFVl9GVUpJVFNVXyAgICAgICAgICAgICAgICAgIHwgX0RFVl9DT01NQV9FWFRfKQkvLyBzb2Z0dW5lIGlzIG5vdCBhYmxlIHRvIHN1cHBvcnQgNjQgYml0IHZhcmlhYmxlcyBRV09SRCAhISEKKy8vZi5qLjI5LjA0LjAzIE0xNkMga2FubiBlZmZla3RpdiBtaXQgQnl0ZXMgdW1nZWhlbgorLy8jZGVmaW5lIF9ERVZfVEFTS0lOR19NMTZDXyAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfVEFTS0lOR00xNkNfICAgICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9UQVNLSU5HX00xNkNfICAgICAgKF9ERVZfQklUOF8gIHwgX0RFVl9UQVNLSU5HTTE2Q18gICAgICAgICAgICAgKQorI2RlZmluZSBfREVWX01JVFNVQklTSElfTTE2Q18gICAoX0RFVl9CSVQ4XyAgfCBfREVWX01JVFNVQklTSElNMTZDXyAgICAgICAgICApCisjZGVmaW5lIF9ERVZfR05VX01QQzVYNV8gICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19NUEM1WDV8IF9ERVZfQklHRU5EXyB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfTElOVVhfICAgICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTElOVVhfR0NDXyAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfR05VX0MxNlhfICAgICAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfR05VQ19DMTZYXyAgICAgICAgICAgICAgICkJLy98IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9NQ1dfTVBDNVg1XyAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NRVRST1dFUktTX0NXXyAgICAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9HTlVfQVJNN18gICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX0FSTTdfICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXyB8IF9ERVZfT05MWV9JTlRfTUFJTl8pCisjZGVmaW5lIF9ERVZfV0lOMzJfUlRYXyAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTVNWQ19SVFhfICAgICAgICAgICAgICAgICkJLy98IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfSElHSFRFQ19YODZfICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfSElHSFRFQ19HTlVDX1g4Nl8gICAgICAgICkJLy98IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfV0lOX0NFXyAgICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTVNFVkNfICAgICAgICAgICAgICAgICAgICkJLy98IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfS0VJTF9DQVJNXyAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfS0VJTF9BUk1fICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfSUFSX0NBUk1fICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfSUFSX0FSTV8gICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfUlZDVF9DQVJNXyAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfUlZDVF9BUk1fICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8gfCBfREVWX09OTFlfSU5UX01BSU5fKQorI2RlZmluZSBfREVWX01DV19NQ0Y1WFhYXyAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX01FVFJPV0VSS1NfQ1dfICAgICAgICAgICApCS8vfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfKQorI2RlZmluZSBfREVWX0dOVV9DRjUyODJfICAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX0dOVUNfQ0ZfICAgfCBfREVWX0JJR0VORF8pCisjZGVmaW5lIF9ERVZfUEFSX0JFQ0sxWDNfICAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfUEFSQURHTV9YODYpCisjZGVmaW5lIF9ERVZfR05VX0NGNTQ4WF8gICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19DRl8gICB8IF9ERVZfQklHRU5EXyB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfR05VX0kzODZfICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19YODZfICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8gfCBfREVWX09OTFlfSU5UX01BSU5fKQorI2RlZmluZSBfREVWX0dOVV9UUklDT1JFXyAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX0dOVUNfVENfICAgICAgICAgICAgICAgICAgfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfIHwgX0RFVl9PTkxZX0lOVF9NQUlOXyB8IF9ERVZfQUxJR05NRU5UXzRfKQorI2RlZmluZSBfREVWX01QTEFCX0RTUElDMzNGXyAgICAoX0RFVl9CSVQxNl8gfCBfREVWX01QTEFCX0MzMF8gICAgICAgICAgICAgICApCS8vfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfR05VX01JUFNFTF8gICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19NSVBTMl8gICAgIHwgX0RFVl9CSUdFTkRfIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXyB8IF9ERVZfT05MWV9JTlRfTUFJTl8pCisKKyNkZWZpbmUgX0RFVl9SRU5FU0FTX00zMkNfICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9SRU5FU0FTTTMyQykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB1c2VmdWxsIG1hY3JvcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBDSEVDS19JRl9PTkxZX0lOVF9NQUlOKCkgICAgKERFVl9TWVNURU0gJiBfREVWX09OTFlfSU5UX01BSU5fKQorI2RlZmluZSBDSEVDS19NRU1PUllfQUxJTk1FTlQoKSAgICAgKERFVl9TWVNURU0gJiBfREVWX01BU0tfQUxJR05NRU5UKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluZXMgZm9yIHRhcmdldCBzeXN0ZW0gKFRBUkdFVF9TWVNURU0pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIF9ET1NfICAgICAgICAgICAgICAoMTYgKyAweDEwMDAwKQorI2RlZmluZSBfV0lOMTZfICAgICAgICAgICAgIDE2CisjZGVmaW5lIF9XSU4zMl8gICAgICAgICAgICAgMzIKKyNkZWZpbmUgX1dJTkNFXyAgICAgICAgICAgICgzMiArIDB4MjAwMDApCisjZGVmaW5lIF9OT19PU18gICAgICAgICAgICAgIDAKKyNkZWZpbmUgX0xJTlVYXyAgICAgICAgICAgICAgMQorI2RlZmluZSBfUFhST1NfICAgICAgICAgICAgICAyCisjZGVmaW5lIF9FQ09TUFJPXyAgICAgICAgICAgIDMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb24gaW5saW5pbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OCQkvLyBlbXB0eSBkZWZpbmUKKyN1bmRlZiAgSU5MSU5FX0VOQUJMRUQJCS8vIGRpc2FibGUgYWN0dWFsIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI3VuZGVmICBJTkxJTkVfRlVOQ1RJT05fREVGCS8vIGRpc2FibGUgaW5saW5pbmcgZm9yIGFsbCBjb21waWxlcnMgcGVyIGRlZmF1bHQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgS2VpbCBDNTEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiAgX19DNTFfXworCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0tFSUxfQzUxWF8KKworI3ByYWdtYSBERUJVRyBPQkpFQ1RFWFRFTkQKKyNwcmFnbWEgV0FSTklOR0xFVkVMKDIpCQkvLyBtYXhpbXVtIHdhcm5pbmcgbGV2ZWwKKworI2RlZmluZSBORUFSICAgICAgICAgICAgaWRhdGEJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIHhkYXRhCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NICAgICAgICAgICAgIGNvZGUJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgICAgICAgICB4ZGF0YQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRSAgICAgICAgICAgbGFyZ2UJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNICAgICAgICAgICAgIHhkYXRhCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UICAgICAgIHJlZW50cmFudAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBHTlUgQ29tcGlsZXIgZm9yIEluZmluZW9uIEMxNngKKy8vICAtIGl0IGhhdmUgdG8gYmUgYmVmb3IgS2VpbCAoaXQgaGFzIF9fQzE2Nl9fIHRvbykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fQzE2Nl9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0dOVV9DMTZYXworCisvLyAgICAjZGVmaW5lIE5FQVIgICAgICAgICAgICBpZGF0YSAgICAgICAvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBORUFSICAgICAgICAgICAgbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorLy8gICAgI2RlZmluZSBGQVIgICAgICAgICAgICAgeGh1Z2UgICAgICAgLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIGh1Z2UJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKy8vICAgICNkZWZpbmUgSFdBQ0MgICAgICAgICAgIHNkYXRhICAgICAgIC8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIEhXQUNDICAgICAgICAgICBodWdlCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisvLyAgICAjZGVmaW5lIEdFTkVSSUMgICAgICAgICB4aHVnZSAgICAgICAvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorI2RlZmluZSBHRU5FUklDICAgICAgICAgaHVnZQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisKKyNkZWZpbmUgQVNTRVJUKHApICBcCisgICAgICAgICAgICBpZiAocCkgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgOyAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUFJJTlRGMCgiQXNzZXJ0IGZhaWxlZDogIiAjcCAiIChmaWxlICVzIGxpbmUgJWQpXG4iLCBfX0ZJTEVfXywgKGludCkgX19MSU5FX18gKTsgXAorICAgICAgICAgICAgICAgIHdoaWxlICgxKTsgXAorICAgICAgICAgICAgfQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKHApCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgS2VpbCBDMTY2CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgIGRlZmluZWQgKF9fQzE2Nl9fKQkvLyAyNC4wMS4yMDA1IHIuZC46IEtlaWwgQVJNNyBuZWVkcyBkaXJlY3RpdmUgJ2RlZmluZWQnCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfS0VJTF9DMTZYXworCisjcHJhZ21hIENPREUKKyNwcmFnbWEgTU9EMTY3CisjcHJhZ21hIE5PSU5JVAorI3ByYWdtYSBERUJVRworI3ByYWdtYSBXQVJOSU5HTEVWRUwoMykJCS8vIG1heGltdW0gd2FybmluZyBsZXZlbAorI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSA0NwkvLyB3YXJuaW5nIDx1bnJlZmVyZW5jZWQgcGFyYW1ldGVyPiA9IE9GRgorI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSAzOAkvLyB3YXJuaW5nIDxlbXB0eSB0cmFuc2xhdGlvbiB1bml0PiA9IE9GRgorLy8gICNwcmFnbWEgV0FSTklORyBESVNBQkxFID0gMTAyICAgICAgIC8vIHdhcm5pbmcgPGRpZmZlcmVudCBjb25zdC92b2xhdGlsZSBxdWFsaWZpZXJzPiA9IE9GRgorI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSAxNzQJLy8gd2FybmluZyA8dW5yZWZlcmVuY2VkICdzdGF0aWMnIGZ1bmN0aW9uPiA9IE9GRgorI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSAxODMJLy8gd2FybmluZyA8ZGVhZCBhc3NpZ25lbWVudCBlbGltaW5hdGVkPiA9IE9GRgorCisjZGVmaW5lIE5FQVIgICAgICAgICAgICBpZGF0YQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgeGh1Z2UJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKy8vICAgICNkZWZpbmUgSFdBQ0MgICAgICAgICAgIHNkYXRhICAgICAgIC8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIEhXQUNDICAgICAgICAgICBodWdlCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMgICAgICAgICB4aHVnZQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgTVBMQUIgQzMwIGZvciBkc1BJQzMzRiBzZXJpZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19DMzBfXykKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NUExBQl9EU1BJQzMzRl8KKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisvLyAgICAjaWZuZGVmIFFXT1JECisvLyAgICAgICAgI2RlZmluZSBRV09SRCBsb25nIGxvbmcKKy8vICAgICNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEtlaWwgQVJNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgIGRlZmluZWQgKF9fQ0FfXykKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9LRUlMX0NBUk1fCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIFJlYWxWaWV3IEFSTSBjb21waWxhdGlvbiB0b29scyAocHJvdmlkZWQgYnkgcmVjZW50IEtlaWwgTWljcm9jb250cm9sbGVyIERldmVsb3BtZW50IEtpdHMpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgIGRlZmluZWQgKF9fQVJNQ0NfVkVSU0lPTikKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9SVkNUX0NBUk1fCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBBU1NFUlQoZXhwcikgICAgaWYgKCEoZXhwcikpIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFMCAoIkFzc2VydGlvbiBmYWlsZWQ6ICIgI2V4cHIgKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTt9CisjZWxzZQorI2RlZmluZSBBU1NFUlQoZXhwcikKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEFSTSBJQVIgQyBDb21waWxlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmICBkZWZpbmVkIChfX0lDQ0FSTV9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0lBUl9DQVJNXworCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgUVdPUkQKKyNkZWZpbmUgUVdPUkQgbG9uZyBsb25nCisjZW5kaWYKKworICAgIC8vIFdvcmthcm91bmQ6CisgICAgLy8gSWYgd2UgdXNlIElBUiBhbmQgd2FudCB0byBkZWJ1ZyBidXQgZG9uJ3Qgd2FudCB0byB1c2UgQy1TcHkgRGVidWdnZXIKKyAgICAvLyBhc3NlcnQoKSBkb2Vzbid0IHdvcmsgaW4gZGVidWcgbW9kZSBiZWNhdXNlIGl0IG5lZWRzIHN1cHBvcnQgZm9yIEZJTEUgZGVzY3JpcHRvcnMKKyAgICAvLyAoX0RMSUJfRklMRV9ERVNDUklQVE9SID09IDEpLgorI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgQVNTRVJUKGV4cHIpICAgIGlmICghKGV4cHIpKSB7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRTAgKCJBc3NlcnRpb24gZmFpbGVkOiAiICNleHByICk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSk7fQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGV4cHIpCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKy8vICAgICAgICAjZGVmaW5lIFRSQUNFICBQUklOVEY0CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgVGFza2luZyA4MDUxCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxpZiBkZWZpbmVkIChfQ0M1MSkKKworI2luY2x1ZGUgPGNjNTEuaD4KKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9UQVNLSU5HX0M1MVhfCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgIF9kYXRhCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUiAgICAgICAgICAgICBfeGRhdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgICAgICAgICAgX3hkYXQJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0gICAgICAgICAgICAgX3hkYXQJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQgICAgICAgX3JlZW50cmFudAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBUYXNraW5nIEMxNjdDUiBhbmQgQzE2NENJCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxpZiBkZWZpbmVkIChfQzE2NikKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9UQVNLSU5HX0MxNlhfCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgIG5lYXIJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIGZhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworICAgIC8vIFN0ZGlvLmggaGFzIHRvIGJlIGFsd2F5IGluY2x1ZGVkIGhlcmUuIElmIHByaW50ZigpIGlzIHVzZWQgc3RkaW8uaCBkZWZpbmVzIE5VTEwKKyAgICAvLyB3aXRob3V0IGNoZWNraW5nIGlmIGl0IGlzIGFscmVhZHkgaW5jbHVkZWQuIFNvIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjb21waWxpbmcuCisgICAgLy8gKHIuZC4pCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEZVSklUU1UgRkZNQy0xNkxYIE1COTA1OTAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2VsaWYgKGRlZmluZWQgKEY1OTApIHx8IGRlZmluZWQgKEY1NDMpIHx8IGRlZmluZWQgKEY1OTgpIHx8IGRlZmluZWQgKEY0OTUpIHx8IGRlZmluZWQgKEYzNTApKQorI2VsaWYgZGVmaW5lZChfX0NPTVBJTEVSX0ZDQzkwN19fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0ZVSklUU1VfRjU5MF8KKworI2RlZmluZSBORUFSICAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAvKiB0byBiZSBkZWZpbmVkICovCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NICAgICAvKiB0byBiZSBkZWZpbmVkICovCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisgICAgLy8gc29mdHVuZSBpcyBub3QgYWJsZSB0byBzdXBwb3J0IDY0IGJpdCB2YXJpYWJsZXMgUVdPUkQgISEhCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIE1pdHN1YmlzaGkgTTE2QyBmYW1pbHkgZm9yIFRBU0tJTkcgQ29tcGlsZXIgQ00xNgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VsaWYgZGVmaW5lZCAoX0NNMTZDKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1RBU0tJTkdfTTE2Q18KKworI2RlZmluZSBORUFSICAgICAgICAgICAgX25lYXIJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXIJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIF9mYXJyb20JLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgICAgICAgICAgX25lYXIJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQyAgICAgICAgIF9mYXIJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisJCQkJCS8vIGRvIHlvdSB1c2UgbWVtb3J5IG1vZGVsIFNNQUxMLCB0aGFuIHlvdSBoYXZlIHRvIHNldCBfZmFyCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisgICAgLy8gU3RkaW8uaCBoYXMgdG8gYmUgYWx3YXkgaW5jbHVkZWQgaGVyZS4gSWYgcHJpbnRmKCkgaXMgdXNlZCBzdGRpby5oIGRlZmluZXMgTlVMTAorICAgIC8vIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgaXMgYWxyZWFkeSBpbmNsdWRlZC4gU28gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbXBpbGluZy4KKyAgICAvLyAoci5kLikKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgTWl0c3ViaXNoaSBNMTZDIGZhbWlseSBmb3IgTWl0c3ViaXNoaSBDb21waWxlciBOQzMwCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbmFtZSBOQzMwLCBhbmRlcmUgRm9ybSB3aWxsIGRlciBDb21waWxlciBuaWNodCAhIQorI2VsaWYgZGVmaW5lZCAoTkMzMCkKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NSVRTVUJJU0hJX00xNkNfCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgIG5lYXIJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIGZhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgICAgICAgICAgbmVhcgkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDICAgICAgICAgZmFyCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBSZW5lc2FzIE0zMkMgZmFtaWx5IGZvciBSZW5lc2FzIENvbXBpbGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoTkMzMDgpCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfUkVORVNBU19NMzJDXworCisjZGVmaW5lIE5FQVIgICAgICAgICAgICAgbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgIGZhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNICAgICAgICAgICAgICBmYXIJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8gICAgI2Vycm9yICgiUkVORVNBUyBvLmsuIikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgQVJNNyBmYW1pbHkgd2l0aCBHTlUgY29tcGlsZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19MSU5VWF9BUk1fQVJDSF9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0dOVV9BUk03XworCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcJCS8vIGkuQS4gZHVyY2ggSGVyciBLdXNjaGVsCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBNb3Rvcm9sYSBQb3dlclBDIGZhbWlseSA1eDUgKDU1NS81NjUpCisvLyAgZGVmaW5pdGlvbnMgTGludXgtUEMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbGlmIGRlZmluZWQgKF9fR05VQ19fKQorCisjaWYgZGVmaW5lZCAoTElOVVgpIHx8IGRlZmluZWQgKGxpbnV4KSB8fCBkZWZpbmVkIChfX2xpbnV4X18pCisjZGVmaW5lIExJTlVYX1NZU1RFTQkJLy8gZGVmaW5lICdMSU5VWF9TWVNURU0nIHVuaWZvcm0gZm9yIGFsbCBMaW51eCBiYXNlZCBzeXN0ZW1zCisJLy8gci5kLjogV2Ugd2lsbCBuZWVkIGFuIG90aGVyIHNvbHV0aW9uIGhlcmUhIFRoZXJlIGFyZSB0d28gc2VjdGlvbnMgaGVyZSB3aGljaCBkbyBjaGVjayB0aGUgcHJlcHJvYy1kZWZpbml0aW9uczoKKwkvLyAgICAgTElOVVggYW5kIF9fbGludXhfXyAuIFRoZSBmaXJzdCBvbmUgd2FzIExpbnV4IGZvciBQQywgdGhlIHNlY29uZCBvbmUgaXMgdGhpcyBzZWN0aW9uIGZvciBlbWJlZGRlZCBMaW51eCAoTUNGNXh4eCkuCisJLy8gICAgIEJ1dCBMaW51eCBmb3IgUEMgZG9lcyBub3QgbmVlZCB0aGUgZGVmaW5pdGlvbnMgZm9yIGVtYmVkZGVkIExpbnV4LgorI2VuZGlmCisKKyAgICAvLyBHTlUgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBpbmxpbmluZworI2RlZmluZSBJTkxJTkVfRlVOQ1RJT05fREVGIGV4dGVybiBpbmxpbmUKKworICAgIC8vIHRvIGFjdHVhbGx5IGVuYWJsZSBpbmxpbmluZyBqdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyB0aHJlZSBsaW5lcworICAgIC8vICN1bmRlZiBJTkxJTkVfRlVOQ1RJT04KKyAgICAvLyAjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRgorICAgIC8vICNkZWZpbmUgSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisKKyNpZmRlZiBQWFJPUworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgICAgIF9QWFJPU18KKyNpZmRlZiBfX2kzODZfXworI3VuZGVmIExJTlVYCQkJLy8gdGhpcyBkZWZpbmUgc2VlbXMgdG8gYmUgc2V0IGZyb20gY29tcGlsZXIKKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfSElHSFRFQ19YODZfCisjZWxpZiBkZWZpbmVkIChfX3RyaWNvcmVfXykKKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfR05VX1RSSUNPUkVfCisjZWxzZSAvLyBNUEM1eDUKKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfR05VX01QQzVYNV8KKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkIChMSU5VWCkgfHwgZGVmaW5lZCAoX19saW51eF9fKQorI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgICAgIF9MSU5VWF8JLy8gTGludXggZGVmaW5pdGlvbgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgIF9ERVZfTElOVVhfCisKKyNlbGlmIGRlZmluZWQgKEdOVV9DRjUyODIpCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgIF9ERVZfR05VX0NGNTI4Ml8KKworI2VsaWYgZGVmaW5lZCAoRUNPU1BST19JMzg2X1BFQUtfUENJKQorI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgICAgIF9FQ09TUFJPXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgIF9ERVZfR05VX0kzODZfCisKKyNlbGlmIGRlZmluZWQgKEdOVV9DRjU0OFgpCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgIF9ERVZfR05VX0NGNTQ4WF8KKyNlbHNlCisjZXJyb3IgJ0VSUk9SOiBERVZfU1lTVEVNIG5vdCBmb3VuZCEnCisjZW5kaWYKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcgaW50CisjZW5kaWYKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9QWFJPU18pCisKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NICAgICAvKiB0byBiZSBkZWZpbmVkICovCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCSAgICAvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKwkvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworCS8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCSAgICAvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkgICAgLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcgaW50CisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisjZW5kaWYKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBHTlVDIGZvciBJMzg2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgfHwgKFRBUkdFVF9TWVNURU0gPT0gX0VDT1NQUk9fKQorCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKwkvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworCS8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjaWZuZGVmIE5FQVIKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIENPTlNUCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNlbmRpZgorCisjZGVmaW5lIExBUkdFCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZWxzZQorI2RlZmluZSBUUkFDRSAgcHJpbnRrCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gR05VIHdpdGhvdXQgT1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTk9fT1NfKQorCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKwkvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworCS8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjaWZuZGVmIE5FQVIKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIENPTlNUCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNlbmRpZgorCisjZGVmaW5lIExBUkdFCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworLy8gICAgICAgICAgICAjaW5jbHVkZSAieHVhcnRkcnYuaCIKKy8vICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgICAgICAvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorLy8gICAgICAgICAgICAjZGVmaW5lIFRSQUNFICBtcHJpbnRmCisvLyAgICAgICAgICAgICNpZm5kZWYgVFJBQ0UKKy8vICAgICAgICAgICAgICAgICNkZWZpbmUgVFJBQ0UgdHJhY2UKKy8vICAgICAgICAgICAgICAgIHZvaWQgdHJhY2UgKGNoYXIgKmZtdCwgLi4uKTsKKy8vICAgICAgICAgICAgI2VuZGlmCisjZW5kaWYKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIE1QQzU2NQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIF9fTVdFUktTX18KKworI2lmZGVmIF9fTUM2OEtfXworCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gPSBfTUNGNTQ4WF8KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfTUNXX01DRjVYWFhfCisKKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gPSBfTVBDNTY1XworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NQ1dfTVBDNVg1XworI2VuZGlmCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEJFQ0sgMXgzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfX1BBUkFESUdNX18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgICAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgICAgIF9ERVZfUEFSX0JFQ0sxWDNfCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkgICAgIC8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKyAgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkgICAgIC8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJICAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNkZWZpbmUgTkVBUiBfX25lYXIJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUiAgX19mYXIJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBQQworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmluaXRpb24gdGFyZ2V0IHN5c3RlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfV0lOMzJfCS8vIFdJTjMyIGRlZmluaXRpb24KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfV0lOMzJfCisjZWxzZQorI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX0RPU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfQk9STEFORF9ET1NfCisjZW5kaWYKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBXSU4zMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDIF9fc3RkY2FsbAorCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIFRSQUNFIHByaW50ZgorI2VuZGlmCisjZW5kaWYKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0RPU18pCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisjZGVmaW5lIE5FQVIgbmVhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICBmYXIJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKKworI2VsaWYgKF9NU0NfVkVSID09IDgwMCkJCS8vIFBDIE1TIFZpc3VhbCBDL0MrKyBmb3IgRE9TIGFwcGxpY2F0aW9ucworCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfRE9TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NU1ZDX0RPU18KKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCSAgICAvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MgbmVhcgkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkgICAgLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkgICAgLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisjZGVmaW5lIE5FQVIgbmVhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICBmYXIJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVmaW5pdGlvbnMgZm9yIFJUWCB1bmRlciBXSU4zMgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIChkZWZpbmVkIChVTkRFUl9SVFNTKSAmJiBkZWZpbmVkIChXSU4zMikpCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5pdGlvbiB0YXJnZXQgc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfV0lOMzJfUlRYXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9XSU4zMl9SVFhfCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkgICAgLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkgICAgLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkgICAgLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDIF9fc3RkY2FsbAorCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2RlZmluZSBUUkFDRSBSdFByaW50ZgorI2VuZGlmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlZmluaXRpb25zIGZvciBXaW5DRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIGRlZmluZWQgKF9XSU4zMl9XQ0UpCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5pdGlvbiB0YXJnZXQgc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgICAgIF9XSU5DRV8KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgICAgICAgICAgX0RFVl9XSU5fQ0VfCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkgICAgLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkgICAgLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkgICAgLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2lmbmRlZiBRV09SRAorICAgICAgLy8jZGVmaW5lIFFXT1JEIGxvbmcgbG9uZyBpbnQgLy8gTVNWQyAuTkVUIGNhbiB1c2UgImxvbmcgbG9uZyBpbnQiIHRvbyAobGlrZSBHTlUpCisjZGVmaW5lIFFXT1JEIF9faW50NjQKKyNlbmRpZgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMgX19jZGVjbAorCisjaWZkZWYgQVNTRVJUTVNHCisjdW5kZWYgQVNTRVJUTVNHCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyNpZm5kZWYgVFJBQ0UKKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisvLyAgICAgICAgICAgIHZvaWQgdHJhY2UgKGNoYXIgKmZtdCwgLi4uKTsKKyNlbmRpZgorI2VuZGlmCisKKyNlbHNlIC8vID09PT4gUEMgTVMgVmlzdWFsIEMvQysrCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5pdGlvbiB0YXJnZXQgc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9XSU4zMl8JLy8gV0lOMzIgZGVmaW5pdGlvbgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9XSU4zMl8KKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfV0lOMTZfCS8vIFdJTjE2IGRlZmluaXRpb24KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfV0lOMTZfCisjZW5kaWYKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBXSU4xNiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4xNl8pCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIgZmFyCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIENPTlNUCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNlbmRpZgorCisjZGVmaW5lIExBUkdFCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQyBfZmFyIF9wYXNjYWwgX2V4cG9ydAorCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2RlZmluZSBUUkFDRSB0cmFjZQorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCXZvaWQgdHJhY2UoY29uc3QgY2hhciAqZm10LCAuLi4pOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gV0lOMzIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKwkvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0by8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisjaWZuZGVmIE5FQVIKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisjZGVmaW5lIExBUkdFCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMgX19zdGRjYWxsCisjaWZuZGVmIFFXT1JECisJICAvLyNkZWZpbmUgUVdPUkQgbG9uZyBsb25nIGludCAvLyBNU1ZDIC5ORVQgY2FuIHVzZSAibG9uZyBsb25nIGludCIgdG9vIChsaWtlIEdOVSkKKyNkZWZpbmUgUVdPUkQgX19pbnQ2NAorI2VuZGlmCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2RlZmluZSBUUkFDRSB0cmFjZQorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCXZvaWQgdHJhY2UoY29uc3QgY2hhciAqZm10LCAuLi4pOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisJLy8gTVMgVmlzdWFsIEMrKyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBpbmxpbmluZworI2RlZmluZSBJTkxJTkVfRlVOQ1RJT05fREVGIF9fZm9yY2VpbmxpbmUKKwkvLyB0byBhY3R1YWxseSBlbmFibGUgaW5saW5pbmcganVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzLy8gI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYvLyAjZGVmaW5lIElOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2VuZGlmCisjZW5kaWYJCQkJLy8gPT09PiBQQworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLyAgZGVmaW5pdGlvbnMgb2YgYmFzaWMgdHlwZXMvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmbmRlZiBfV0lOREVGXwkJLy8gZGVmaW5lZCBpbiBXSU5ERUYuSCwgaW5jbHVkZWQgYnkgPHdpbmRvd3MuaD4KKyAgICAvLyAtLS0gYXJpdGhtZXRpYyB0eXBlcyAtLS0KKyNpZm5kZWYgU0hPUlQKKyNkZWZpbmUgU0hPUlQgc2hvcnQgaW50CisjZW5kaWYKKyNpZm5kZWYgVVNIT1JUCisjZGVmaW5lIFVTSE9SVCB1bnNpZ25lZCBzaG9ydCBpbnQKKyNlbmRpZgorI2lmbmRlZiBJTlQKKyNkZWZpbmUgSU5UIGludAorI2VuZGlmCisjaWZuZGVmIFVJTlQKKyNkZWZpbmUgVUlOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorI2lmbmRlZiBMT05HCisjZGVmaW5lIExPTkcgbG9uZyBpbnQKKyNlbmRpZgorI2lmbmRlZiBVTE9ORworI2RlZmluZSBVTE9ORyB1bnNpZ25lZCBsb25nIGludAorI2VuZGlmCisgICAgLy8gLS0tIGxvZ2ljIHR5cGVzIC0tLQorI2lmbmRlZiBCWVRFCisjZGVmaW5lIEJZVEUgdW5zaWduZWQgY2hhcgorI2VuZGlmCisjaWZuZGVmIFdPUkQKKyNkZWZpbmUgV09SRCB1bnNpZ25lZCBzaG9ydCBpbnQKKyNlbmRpZgorI2lmbmRlZiBEV09SRAorI2RlZmluZSBEV09SRCB1bnNpZ25lZCBsb25nIGludAorI2VuZGlmCisjaWZuZGVmIEJPT0wKKyNkZWZpbmUgQk9PTCB1bnNpZ25lZCBjaGFyCisjZW5kaWYKKyAgICAvLyAtLS0gYWxpYXMgdHlwZXMgLS0tCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgMHhGRgorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDB4MDAKKyNlbmRpZgorI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBfVElNRV9PRl9EQVlfREVGSU5FRF8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGludCBtX2R3TXM7CisJdW5zaWduZWQgc2hvcnQgaW50IG1fd0RheXM7CisKK30gdFRpbWVPZkRheTsKKworI2RlZmluZSBfVElNRV9PRl9EQVlfREVGSU5FRF8KKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRGVmaW5pdGlvbiB2b24gVFJBQ0UKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgTkRFQlVHCisKKyNpZm5kZWYgVFJBQ0UwCisjZGVmaW5lIFRSQUNFMChwMCkgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UocDApCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTEKKyNkZWZpbmUgVFJBQ0UxKHAwLCBwMSkgICAgICAgICAgICAgICAgICBUUkFDRShwMCwgcDEpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTIKKyNkZWZpbmUgVFJBQ0UyKHAwLCBwMSwgcDIpICAgICAgICAgICAgICBUUkFDRShwMCwgcDEsIHAyKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0UzCisjZGVmaW5lIFRSQUNFMyhwMCwgcDEsIHAyLCBwMykgICAgICAgICAgVFJBQ0UocDAsIHAxLCBwMiwgcDMpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTQKKyNkZWZpbmUgVFJBQ0U0KHAwLCBwMSwgcDIsIHAzLCBwNCkgICAgICBUUkFDRShwMCwgcDEsIHAyLCBwMywgcDQpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTUKKyNkZWZpbmUgVFJBQ0U1KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpICBUUkFDRShwMCwgcDEsIHAyLCBwMywgcDQsIHA1KQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0U2CisjZGVmaW5lIFRSQUNFNihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikgIFRSQUNFKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KQorI2VuZGlmCisKKyNlbHNlCisKKyNpZm5kZWYgVFJBQ0UwCisjZGVmaW5lIFRSQUNFMChwMCkKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFMQorI2RlZmluZSBUUkFDRTEocDAsIHAxKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0UyCisjZGVmaW5lIFRSQUNFMihwMCwgcDEsIHAyKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0UzCisjZGVmaW5lIFRSQUNFMyhwMCwgcDEsIHAyLCBwMykKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFNAorI2RlZmluZSBUUkFDRTQocDAsIHAxLCBwMiwgcDMsIHA0KQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0U1CisjZGVmaW5lIFRSQUNFNShwMCwgcDEsIHAyLCBwMywgcDQsIHA1KQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0U2CisjZGVmaW5lIFRSQUNFNihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikKKyNlbmRpZgorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9uIG9mIEFTU0VSVAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBBU1NFUlQKKyNpZiAhZGVmaW5lZCAoX19saW51eF9fKSAmJiAhZGVmaW5lZCAoX19LRVJORUxfXykKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpZm5kZWYgQVNTRVJUCisjZGVmaW5lIEFTU0VSVChwKSAgICBhc3NlcnQocCkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKHApCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFNZUyBURUMgZXh0ZW5zaW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBtYWNybyBkb2Vzbid0IHByaW50IG91dCBDLWZpbGUgYW5kIGxpbmUgbnVtYmVyIG9mIHRoZSBmYWlsZWQgYXNzZXJ0aW9uCisvLyBidXQgYSBzdHJpbmcsIHdoaWNoIGV4YWN0bHkgbmFtZXMgdGhlIG1pc3Rha2UuCisjaWZuZGVmIE5ERUJVRworCisjZGVmaW5lIEFTU0VSVE1TRyhleHByLHN0cmluZykgIGlmICghKGV4cHIpKSB7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5URjAgKCJBc3NlcnRpb24gZmFpbGVkOiAiIHN0cmluZyApO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSk7fQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUTVNHKGV4cHIsc3RyaW5nKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9HTE9CQUxfSF8KKworLy8gUGxlYXNlIGtlZXAgYW4gZW1wdHkgbGluZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODhlODcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRGxsay5oCkBAIC0wLDAgKzEsMTY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBrZXJuZWxzcGFjZSBETEwgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDggZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMS19IXworI2RlZmluZSBfRVBMX0RMTEtfSF8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKCp0RXBsRGxsa0NiQXN5bmMpICh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9iZV9hYlNyY01hY1s2XTsKKworfSB0RXBsRGxsa0luaXRQYXJhbTsKKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorc3RydWN0IF90RWRydlR4QnVmZmVyOworCitzdHJ1Y3QgX3RFcGxEbGxrTm9kZUluZm8geworCXN0cnVjdCBfdEVwbERsbGtOb2RlSW5mbyAqbV9wTmV4dE5vZGVJbmZvOworCXN0cnVjdCBfdEVkcnZUeEJ1ZmZlciAqbV9wUHJlcVR4QnVmZmVyOworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCURXT1JEIG1fZHdQcmVzVGltZW91dDsKKwl1bnNpZ25lZCBsb25nIG1fdWxEbGxFcnJvckV2ZW50czsKKwl0RXBsTm10U3RhdGUgbV9ObXRTdGF0ZTsKKwlXT1JEIG1fd1ByZXNQYXlsb2FkTGltaXQ7CisJQllURSBtX2JlX2FiTWFjQWRkcls2XTsKKwlCWVRFIG1fYlNvYUZsYWcxOworCUJPT0wgbV9mU29mdERlbGV0ZTsJLy8gZGVsZXRlIG5vZGUgYWZ0ZXIgZXJyb3IgYW5kIGlnbm9yZSBlcnJvcgorCit9OworCit0eXBlZGVmIHN0cnVjdCBfdEVwbERsbGtOb2RlSW5mbyB0RXBsRGxsa05vZGVJbmZvOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxEbGxrQWRkSW5zdGFuY2UodEVwbERsbGtJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtEZWxJbnN0YW5jZSh2b2lkKTsKKworLy8gY2FsbGVkIGJlZm9yZSBOTVRfR1NfQ09NTVVOSUNBVElORyB3aWxsIGJlIGVudGVyZWQgdG8gY29uZmlndXJlIGZpeGVkIHBhcmFtZXRlcnMKK3RFcGxLZXJuZWwgRXBsRGxsa0NvbmZpZyh0RXBsRGxsQ29uZmlnUGFyYW0gKiBwRGxsQ29uZmlnUGFyYW1fcCk7CisKKy8vIHNldCBpZGVudGl0eSBvZiBsb2NhbCBub2RlIChtYXkgYmUgYXQgYW55IHRpbWUsIGUuZy4gaW4gY2FzZSBvZiBob3N0bmFtZSBjaGFuZ2UpCit0RXBsS2VybmVsIEVwbERsbGtTZXRJZGVudGl0eSh0RXBsRGxsSWRlbnRQYXJhbSAqIHBEbGxJZGVudFBhcmFtX3ApOworCisvLyBwcm9jZXNzIGludGVybmFsIGV2ZW50cyBhbmQgZG8gd29yayB0aGF0IGNhbm5vdCBiZSBkb25lIGluIGludGVycnVwdC1jb250ZXh0Cit0RXBsS2VybmVsIEVwbERsbGtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworLy8gcmVnaXN0ZXJzIGhhbmRsZXIgZm9yIG5vbi1FUEwgZnJhbWVzCit0RXBsS2VybmVsIEVwbERsbGtSZWdBc3luY0hhbmRsZXIodEVwbERsbGtDYkFzeW5jIHBmbkRsbGtDYkFzeW5jX3ApOworCisvLyBkZXJlZ2lzdGVycyBoYW5kbGVyIGZvciBub24tRVBMIGZyYW1lcwordEVwbEtlcm5lbCBFcGxEbGxrRGVyZWdBc3luY0hhbmRsZXIodEVwbERsbGtDYkFzeW5jIHBmbkRsbGtDYkFzeW5jX3ApOworCisvLyByZWdpc3RlciBDX0RMTF9NVUxUSUNBU1RfQVNORCBpbiBldGhlcm5ldCBkcml2ZXIgaWYgYW55IEFzbmRTZXJ2aWNlSWQgaXMgcmVnaXN0ZXJlZAordEVwbEtlcm5lbCBFcGxEbGxrU2V0QXNuZFNlcnZpY2VJZEZpbHRlcih0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkJIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKTsKKworLy8gY3JlYXRlcyB0aGUgYnVmZmVyIGZvciBhIFR4IGZyYW1lIGFuZCByZWdpc3RlcnMgaXQgdG8gdGhlIGV0aGVybmV0IGRyaXZlcgordEVwbEtlcm5lbCBFcGxEbGxrQ3JlYXRlVHhGcmFtZSh1bnNpZ25lZCBpbnQgKnB1aUhhbmRsZV9wLAorCQkJCXRFcGxGcmFtZSAqKiBwcEZyYW1lX3AsCisJCQkJdW5zaWduZWQgaW50ICpwdWlGcmFtZVNpemVfcCwKKwkJCQl0RXBsTXNnVHlwZSBNc2dUeXBlX3AsCisJCQkJdEVwbERsbEFzbmRTZXJ2aWNlSWQgU2VydmljZUlkX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtEZWxldGVUeEZyYW1lKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wKTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbGtBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrRGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa1NvZnREZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrU2V0RmxhZzFPZk5vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsIEJZVEUgYlNvYUZsYWcxX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtHZXRGaXJzdE5vZGVJbmZvKHRFcGxEbGxrTm9kZUluZm8gKiogcHBOb2RlSW5mb19wKTsKKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxEbGxrQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxEbGxrQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0ZGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGtDYWwuaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsc3BhY2UgRExMIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsa0NhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzExLzEzIDE3OjEzOjA5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTMgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMS0NBTF9IXworI2RlZmluZSBfRVBMX0RMTEtDQUxfSF8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV91bEN1clR4RnJhbWVDb3VudEdlbjsKKwl1bnNpZ25lZCBsb25nIG1fdWxDdXJUeEZyYW1lQ291bnRObXQ7CisJdW5zaWduZWQgbG9uZyBtX3VsQ3VyUnhGcmFtZUNvdW50OworCXVuc2lnbmVkIGxvbmcgbV91bE1heFR4RnJhbWVDb3VudEdlbjsKKwl1bnNpZ25lZCBsb25nIG1fdWxNYXhUeEZyYW1lQ291bnRObXQ7CisJdW5zaWduZWQgbG9uZyBtX3VsTWF4UnhGcmFtZUNvdW50OworCit9IHRFcGxEbGxrQ2FsU3RhdGlzdGljczsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KHRFcGxEbGxBc3luY1JlcVByaW9yaXR5ICogcFByaW9yaXR5X3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnB1aUNvdW50X3ApOwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lKHZvaWQgKnBGcmFtZV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpwdWlGcmFtZVNpemVfcCwKKwkJCQkgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApOworLy8gb25seSBmcmFtZXMgd2l0aCByZWdpc3RlcmVkIEFzbmRTZXJ2aWNlSWRzIGFyZSBwYXNzZWQgdG8gQ0FMCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0ZyYW1lUmVjZWl2ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxHZXRTdGF0aXN0aWNzKHRFcGxEbGxrQ2FsU3RhdGlzdGljcyAqKiBwcFN0YXRpc3RpY3MpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNDbGVhclF1ZXVlcyh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsSXNzdWVSZXF1ZXN0KHRFcGxEbGxSZXFTZXJ2aWNlSWQgU2VydmljZV9wLAorCQkJCSAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsIEJZVEUgYlNvYUZsYWcxX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFNvYVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCAqIHBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlOb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5CisJCQkJCSAgICAgQXN5bmNSZXFQcmlvX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpQ291bnRfcCk7CisKKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRExMS0NBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRXJyb3JIYW5kbGVyay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRXJyb3JIYW5kbGVyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjdlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBlcnJvciBoYW5kbGVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEVycm9ySGFuZGxlcmsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzEwLzAyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VSUk9SSEFORExFUktfSF8KKyNkZWZpbmUgX0VQTF9FUlJPUkhBTkRMRVJLX0hfCisKKyNpbmNsdWRlICIuLi9FcGxFdmVudC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpbml0IGZ1bmN0aW9uCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrSW5pdCh2b2lkKTsKKworLy8gYWRkIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrQWRkSW5zdGFuY2Uodm9pZCk7CisKKy8vIGRlbGV0ZSBpbnN0YW5jZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya0RlbEluc3RhbmNlKHZvaWQpOworCisvLyBwcm9jZXNzZXMgZXJyb3IgZXZlbnRzCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRVJST1JIQU5ETEVSS19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRXZlbnRrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFdmVudGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI1YWFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRXZlbnRrLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBldmVudCBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFdmVudGsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VWRU5US19IXworI2RlZmluZSBfRVBMX0VWRU5US19IXworCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaW5pdCBmdW5jdGlvbgordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrSW5pdCh0RXBsU3luY0NiIGZwU3luY0NiKTsKKworLy8gYWRkIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtBZGRJbnN0YW5jZSh0RXBsU3luY0NiIGZwU3luY0NiKTsKKworLy8gZGVsZXRlIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtEZWxJbnN0YW5jZSh2b2lkKTsKKworLy8gS2VybmVsdGhyZWFkIHRoYXQgZGlzcGF0Y2hlcyBldmVudHMgaW4ga2VybmVsc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBwb3N0IGV2ZW50cyBmcm9tIGtlcm5lbHNwYWNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0KHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworLy8gcG9zdCBlcnJvcmV2ZW50cyBmcm9tIGtlcm5lbHNwYWNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRVZFTlRLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0MDljYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE5tdGsuaApAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgTk1ULUtlcm5lbHNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdGsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTE5NVEtfSF8KKyNkZWZpbmUgX0VQTE5NVEtfSF8KKworI2luY2x1ZGUgIi4uL0VwbE5tdC5oIgorI2luY2x1ZGUgIkVwbEV2ZW50ay5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrSW5pdChFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUik7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsTm10a0FkZEluc3RhbmNlKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXRrRGVsSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10a1Byb2Nlc3MoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgIHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMKK0VwbE5tdGtHZXRObXRTdGF0ZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUik7CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1US19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsTm10a0NhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsTm10a0NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZGVhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrQ2FsLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllciBvZiB0aGUKKyAgICAgICAgICAgICAgICBOTVQtS2VybmVsLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdGtDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTYgLWsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxObXRrLmgiCisKKyNpZm5kZWYgX0VQTE5NVEtDQUxfSF8KKyNkZWZpbmUgX0VQTE5NVEtDQUxfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE5NVEtDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE9iZGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE9iZGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjlmNTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jkay5oCkBAIC0wLDAgKzEsMTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFcGwtT2JkLUtlcm5lbC1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZGsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKworI2lmbmRlZiBfRVBMT0JES19IXworI2RlZmluZSBfRVBMT0JES19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gQllURSBNRU0gYWJFcGxPYmRUcmFzaE9iamVjdF9nWzhdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJbml0KEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkgIHRFcGxPYmRJbml0UGFyYW0gTUVNICogcEluaXRQYXJhbV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkQWRkSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdEVwbE9iZEluaXRQYXJhbSBNRU0gKgorCQkJCQkJIHBJbml0UGFyYW1fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZERlbGV0ZUluc3RhbmNlKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCXZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQl0RXBsT2JkU2l6ZSBTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRSZWFkRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgICAgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJICAgICAgIHRFcGxPYmRTaXplICogcFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxPYmRTZXRTdG9yZUxvYWRPYmpDYWxsYmFjayhFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJICAgICAgdEVwbE9iZFN0b3JlTG9hZE9iakNhbGxiYWNrIGZwQ2FsbGJhY2tfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEFjY2Vzc09kUGFydChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICB0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmREZWZpbmVWYXIoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHRFcGxWYXJQYXJhbSBNRU0gKiBwVmFyUGFyYW1fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgKlBVQkxJQyBFcGxPYmRHZXRPYmplY3REYXRhUHRyKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlZ2lzdGVyVXNlck9kKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgdEVwbE9iZEVudHJ5UHRyIHBVc2VyT2RfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgUFVCTElDIEVwbE9iZEluaXRWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgdEVwbE9iZFZhckVudHJ5IE1FTSAqIHBWYXJFbnRyeV9wLAorCQkJCQkgICAgdEVwbE9iZFR5cGUgVHlwZV9wLAorCQkJCQkgICAgdEVwbE9iZFNpemUgT2JkU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZEdldERhdGFTaXplKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB1bnNpZ25lZCBpbnQgUFVCTElDIEVwbE9iZEdldE5vZGVJZChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkU2V0Tm9kZUlkKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAgIHRFcGxPYmROb2RlSWRUeXBlIE5vZGVJZFR5cGVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZElzTnVtZXJpY2FsKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJIEJPT0wgKiBwZkVudHJ5TnVtZXJpY2FsKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSAgICAgIHRFcGxPYmRTaXplIFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlYWRFbnRyeVRvTGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgIHRFcGxPYmRTaXplICogcFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEdldEFjY2Vzc1R5cGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdEVwbE9iZEFjY2VzcyAqCisJCQkJCQkgICBwQWNjZXNzVHlwX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRTZWFyY2hWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqCisJCQkJCQkgICAgcHBWYXJFbnRyeV9wKTsKKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMT0JES19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jka0NhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jka0NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzNhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxPYmRrQ2FsLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllcgorICAgICAgICAgICAgICAgIGZvciB0aGUgRXBsLU9iZC1LZXJuZWxzcGFjZS1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZGtDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKworI2lmbmRlZiBfRVBMT0JES0NBTF9IXworI2RlZmluZSBfRVBMT0JES0NBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMT0JES0NBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsUGRvay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsUGRvay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjE4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBQRE8gbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsUGRvay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA2LzIzIDE0OjU2OjMzICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfUERPS19IXworI2RlZmluZSBfRVBMX1BET0tfSF8KKworI2luY2x1ZGUgIi4uL0VwbFBkby5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHByb2Nlc3MgZXZlbnRzIGZyb20gcXVldWUgKFBET3MvZnJhbWVzIGFuZCBTb0EgZm9yIHN5bmNocm9uaXphdGlvbikKK3RFcGxLZXJuZWwgRXBsUGRva1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBjb3BpZXMgUlBETyB0byBldmVudCBxdWV1ZSBmb3IgcHJvY2Vzc2luZworLy8gaXMgY2FsbGVkIGJ5IERMTCBpbiBOTVRfQ1NfUkVBRFlfVE9fT1BFUkFURSBhbmQgTk1UX0NTX09QRVJBVElPTkFMCisvLyBQRE8gbmVlZHMgbm90IHRvIGJlIHZhbGlkCit0RXBsS2VybmVsIEVwbFBkb2tDYlBkb1JlY2VpdmVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvLyBwb3N0cyBwb2ludGVyIGFuZCBzaXplIG9mIFRQRE8gdG8gZXZlbnQgcXVldWUKKy8vIGlzIGNhbGxlZCBieSBETEwgaW4gTk1UX0NTX1BSRV9PUEVSQVRJT05BTF8yLAorLy8gICAgIE5NVF9DU19SRUFEWV9UT19PUEVSQVRFIGFuZCBOTVRfQ1NfT1BFUkFUSU9OQUwKK3RFcGxLZXJuZWwgRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vIHBvc3RzIFNvQSBldmVudCB0byBxdWV1ZQordEVwbEtlcm5lbCBFcGxQZG9rQ2JTb2EodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKK3RFcGxLZXJuZWwgRXBsUGRva0FkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbFBkb2tEZWxJbnN0YW5jZSh2b2lkKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9QRE9LX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExODNlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFBkb2tDYWwuaApAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBrZXJuZWwgUERPIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsUGRva0NhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfUERPS0NBTF9IXworI2RlZmluZSBfRVBMX1BET0tDQUxfSF8KKworI2luY2x1ZGUgIi4uL0VwbEluYy5oIgorLy8jaW5jbHVkZSAiRXBsUGRvLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbEFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbFBkb2tDYWxEZWxJbnN0YW5jZSh2b2lkKTsKKworLy8gc2V0cyBmbGFnIGZvciB2YWxpZGl0eSBvZiBUUERPcyBpbiBzaGFyZWQgbWVtb3J5Cit0RXBsS2VybmVsIEVwbFBkb2tDYWxTZXRUcGRvc1ZhbGlkKEJPT0wgZlZhbGlkX3ApOworCisvLyBnZXRzIGZsYWcgZm9yIHZhbGlkaXR5IG9mIFRQRE9zIGZyb20gc2hhcmVkIG1lbW9yeQordEVwbEtlcm5lbCBFcGxQZG9rQ2FsQXJlVHBkb3NWYWxpZChCT09MICogcGZWYWxpZF9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9QRE9LQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxUaW1lckhpZ2hSZXNrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxUaW1lckhpZ2hSZXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkMDQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVySGlnaFJlc2suaApAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRVBMIGhpZ2ggcmVzb2x1dGlvbiBUaW1lcm1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVySGlnaFJlc2suaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA5LzI5IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxUaW1lci5oIgorCisjaWZuZGVmIF9FUExUSU1FUkhJR0hSRVNLX0hfCisjZGVmaW5lIF9FUExUSU1FUkhJR0hSRVNLX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tJbml0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza1NldFRpbWVyTnModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBsb25nIHVsbFRpbWVOc19wLAorCQkJCQkgICAgIHRFcGxUaW1lcmtDYWxsYmFjayBwZm5DYWxsYmFja19wLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdWxBcmd1bWVudF9wLAorCQkJCQkgICAgIEJPT0wgZkNvbnRpbnVvdXNseV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgdWxsVGltZU5zX3AsCisJCQkJCQl0RXBsVGltZXJrQ2FsbGJhY2sKKwkJCQkJCXBmbkNhbGxiYWNrX3AsCisJCQkJCQl1bnNpZ25lZCBsb25nIHVsQXJndW1lbnRfcCwKKwkJCQkJCUJPT0wgZkNvbnRpbnVvdXNseV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFRJTUVSSElHSFJFU0tfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVyay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsVGltZXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2MGU3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxUaW1lcmsuaApAQCAtMCwwICsxLDExOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRVBMIEtlcm5lbC1UaW1lcm1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVyay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMDYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFRpbWVyLmgiCisjaW5jbHVkZSAiLi4vdXNlci9FcGxFdmVudHUuaCIKKworI2lmbmRlZiBfRVBMVElNRVJLX0hfCisjZGVmaW5lIF9FUExUSU1FUktfSF8KKworI2lmIEVQTF9USU1FUl9VU0VfVVNFUiAhPSBGQUxTRQorI2luY2x1ZGUgIi4uL3VzZXIvRXBsVGltZXJ1LmgiCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBFUExfVElNRVJfVVNFX1VTRVIgIT0gRkFMU0UKKyNkZWZpbmUgRXBsVGltZXJrSW5pdCAgICAgICAgICAgRXBsVGltZXJ1SW5pdAorI2RlZmluZSBFcGxUaW1lcmtBZGRJbnN0YW5jZSAgICBFcGxUaW1lcnVBZGRJbnN0YW5jZQorI2RlZmluZSBFcGxUaW1lcmtEZWxJbnN0YW5jZSAgICBFcGxUaW1lcnVEZWxJbnN0YW5jZQorI2RlZmluZSBFcGxUaW1lcmtTZXRUaW1lck1zICAgICBFcGxUaW1lcnVTZXRUaW1lck1zCisjZGVmaW5lIEVwbFRpbWVya01vZGlmeVRpbWVyTXMgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMKKyNkZWZpbmUgRXBsVGltZXJrRGVsZXRlVGltZXIgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgRVBMX1RJTUVSX1VTRV9VU0VSID09IEZBTFNFCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcmtJbml0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcmtBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrRGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVya1NldFRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkgICAgICB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVya01vZGlmeVRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCQkgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcmtEZWxldGVUaW1lcih0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCk7CisjZW5kaWYKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExUSU1FUktfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL1ZpcnR1YWxFdGhlcm5ldC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvVmlydHVhbEV0aGVybmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmZjg3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL1ZpcnR1YWxFdGhlcm5ldC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIHZpcnR1YWwgZXRoZXJuZXQgZHJpdmVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IFZpcnR1YWxFdGhlcm5ldC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOS8xOSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9WRVRIX0hfCisjZGVmaW5lIF9FUExfVkVUSF9IXworCisjaW5jbHVkZSAiRXBsRGxsay5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorCit0RXBsS2VybmVsIFBVQkxJQyBWRXRoQWRkSW5zdGFuY2UodEVwbERsbGtJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBWRXRoRGVsSW5zdGFuY2Uodm9pZCk7CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1ZFVEhfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvcHJvY19mcy5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9wcm9jX2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5MTAzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvcHJvY19mcy5jCkBAIC0wLDAgKzEsNDA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgcHJvYyBmcyBlbnRyeSB3aXRoIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdW5kZXIgTGludXgKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBwcm9jX2ZzLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjEzICQgICREYXRlOiAyMDA4LzExLzA3IDEzOjU1OjU2ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHTlUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzMxIGQuay46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAidXNlci9FcGxObXR1LmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZmRlZiBDT05GSUdfQ09MREZJUkUKKyNpbmNsdWRlIDxhc20vY29sZGZpcmUuaD4KKyNpbmNsdWRlICJmZWMuaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfUFJPQ19ERVZfTkFNRQorI2RlZmluZSBFUExfUFJPQ19ERVZfTkFNRSAgICAiZXBsIgorI2VuZGlmCisKKyNpZm5kZWYgREJHX1RSQUNFX1BPSU5UUworI2RlZmluZSBEQkdfVFJBQ0VfUE9JTlRTICAgIDIzCS8vICMgb2Ygc3VwcG9ydGVkIGRlYnVnIHRyYWNlIHBvaW50cworI2VuZGlmCisKKyNpZm5kZWYgREJHX1RSQUNFX1ZBTFVFUworI2RlZmluZSBEQkdfVFJBQ0VfVkFMVUVTICAgIDI0CS8vICMgb2Ygc3VwcG9ydGVkIGRlYnVnIHRyYWNlIHZhbHVlcyAoc2l6ZSBvZiBjaXJjdWxhciBidWZmZXIpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK2F0b21pY190IGFhdG1EYmdUcmFjZVBvaW50X2xbREJHX1RSQUNFX1BPSU5UU107CitEV09SRCBhZHdEYmdUcmFjZVZhbHVlX2xbREJHX1RSQUNFX1ZBTFVFU107CitEV09SRCBkd0RiZ1RyYWNlVmFsdWVPbGRfbDsKK3Vuc2lnbmVkIGludCB1aURiZ1RyYWNlVmFsdWVQb3NfbDsKK3NwaW5sb2NrX3Qgc3BpbmxvY2tEYmdUcmFjZVZhbHVlX2w7Cit1bnNpZ25lZCBsb25nIHVsRGJUcmFjZVZhbHVlRmxhZ3NfbDsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFcGxMaW5Qcm9jUmVhZChjaGFyICpwY0J1ZmZlcl9wLCBjaGFyICoqcHBjU3RhcnRfcCwgb2ZmX3QgT2Zmc2V0X3AsCisJCQkgIGludCBuQnVmZmVyU2l6ZV9wLCBpbnQgKnBFb2ZfcCwgdm9pZCAqcERhdGFfcCk7CitzdGF0aWMgaW50IEVwbExpblByb2NXcml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKKwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworCitFUExETExFWFBPUlQgRFdPUkQgUFVCTElDIEVwbElkZW50dUdldFJ1bm5pbmdSZXF1ZXN0cyh2b2lkKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKK3RFcGxLZXJuZWwgRXBsTGluUHJvY0luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBQcm9jRGlyRW50cnk7CisJcFByb2NEaXJFbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEVQTF9QUk9DX0RFVl9OQU1FLCBTX0lSVUdPLCBOVUxMKTsKKwlpZiAocFByb2NEaXJFbnRyeSAhPSBOVUxMKSB7CisJCXBQcm9jRGlyRW50cnktPnJlYWRfcHJvYyA9IEVwbExpblByb2NSZWFkOworCQlwUHJvY0RpckVudHJ5LT53cml0ZV9wcm9jID0gRXBsTGluUHJvY1dyaXRlOworCQlwUHJvY0RpckVudHJ5LT5kYXRhID0gTlVMTDsJLy8gZGV2aWNlIG51bWJlciBvciBzb21ldGhpbmcgZWxzZQorCisJfSBlbHNlIHsKKwkJcmV0dXJuIGtFcGxOb1Jlc291cmNlOworCX0KKworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXworCS8vIGluaXRpYWxpemUgc3BpbmxvY2sgYW5kIGNpcmN1bGFyIGJ1ZmZlciBwb3NpdGlvbgorCXNwaW5fbG9ja19pbml0KCZzcGlubG9ja0RiZ1RyYWNlVmFsdWVfbCk7CisJdWlEYmdUcmFjZVZhbHVlUG9zX2wgPSAwOworCWR3RGJnVHJhY2VWYWx1ZU9sZF9sID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCit0RXBsS2VybmVsIEVwbExpblByb2NGcmVlKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoRVBMX1BST0NfREVWX05BTUUsIE5VTEwpOworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFRhcmdldCBzcGVjaWZpYyBldmVudCBzaWduYWxpbmcgKEZFQyBUeC0vUngtSW50ZXJydXB0LCB1c2VkIGJ5IEVkcnYpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCkKK3sKKworCWlmIChiVHJhY2VQb2ludE51bWJlcl9wID49CisJICAgIChzaXplb2YoYWF0bURiZ1RyYWNlUG9pbnRfbCkgLyBzaXplb2YoYWF0bURiZ1RyYWNlUG9pbnRfbFswXSkpKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlhdG9taWNfaW5jKCZhYXRtRGJnVHJhY2VQb2ludF9sW2JUcmFjZVBvaW50TnVtYmVyX3BdKTsKKworICAgICAgRXhpdDoKKworCXJldHVybjsKKworfQorCit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCkKK3sKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9ja0RiZ1RyYWNlVmFsdWVfbCwgdWxEYlRyYWNlVmFsdWVGbGFnc19sKTsKKwlpZiAoZHdEYmdUcmFjZVZhbHVlT2xkX2wgIT0gZHdUcmFjZVZhbHVlX3ApIHsKKwkJYWR3RGJnVHJhY2VWYWx1ZV9sW3VpRGJnVHJhY2VWYWx1ZVBvc19sXSA9IGR3VHJhY2VWYWx1ZV9wOworCQl1aURiZ1RyYWNlVmFsdWVQb3NfbCA9CisJCSAgICAodWlEYmdUcmFjZVZhbHVlUG9zX2wgKyAxKSAlIERCR19UUkFDRV9WQUxVRVM7CisJCWR3RGJnVHJhY2VWYWx1ZU9sZF9sID0gZHdUcmFjZVZhbHVlX3A7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrRGJnVHJhY2VWYWx1ZV9sLCB1bERiVHJhY2VWYWx1ZUZsYWdzX2wpOworCisJcmV0dXJuOworCit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWFkIGZ1bmN0aW9uIGZvciBQUk9DLUZTIHJlYWQgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpblByb2NSZWFkKGNoYXIgKnBjQnVmZmVyX3AsCisJCQkgIGNoYXIgKipwcGNTdGFydF9wLAorCQkJICBvZmZfdCBPZmZzZXRfcCwKKwkJCSAgaW50IG5CdWZmZXJTaXplX3AsIGludCAqcEVvZl9wLCB2b2lkICpwRGF0YV9wKQoreworCisJaW50IG5TaXplOworCWludCBFb2Y7CisJdEVwbERsbGtDYWxTdGF0aXN0aWNzICpwRGxsa0NhbFN0YXRzOworCisJblNpemUgPSAwOworCUVvZiA9IDA7CisKKwkvLyBjb3VudCBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCisJVGd0RGJnU2lnbmFsVHJhY2VQb2ludCgwKTsKKyNlbmRpZgorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZW5lcmF0ZSBzdGF0aWMgaW5mb3JtYXRpb24KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gLS0tLSBEcml2ZXIgaW5mb3JtYXRpb24gLS0tLQorCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJICAiJXMgICAgJXMgICAgKGMpIDIwMDYgJXNcbiIsCisJCQkgIEVQTF9QUk9EVUNUX05BTUUsIEVQTF9QUk9EVUNUX1ZFUlNJT04sCisJCQkgIEVQTF9QUk9EVUNUX01BTlVGQUNUVVJFUik7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGdlbmVyYXRlIHByb2Nlc3MgaW5mb3JtYXRpb24KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gLS0tLSBFUEwgc3RhdGUgLS0tLQorCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJICAiTk1UIHN0YXRlOiAgICAgICAgICAgICAgICAgIDB4JTA0WFxuIiwKKwkJCSAgKFdPUkQpIEVwbE5tdGtHZXRObXRTdGF0ZSgpKTsKKworCUVwbERsbGtDYWxHZXRTdGF0aXN0aWNzKCZwRGxsa0NhbFN0YXRzKTsKKworCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJICAiQ3VyQXN5bmNUeEdlbj0lbHUgQ3VyQXN5bmNUeE5tdD0lbHUgQ3VyQXN5bmNSeD0lbHVcbk1heEFzeW5jVHhHZW49JWx1IE1heEFzeW5jVHhObXQ9JWx1IE1heEFzeW5jUng9JWx1XG4iLAorCQkJICBwRGxsa0NhbFN0YXRzLT5tX3VsQ3VyVHhGcmFtZUNvdW50R2VuLAorCQkJICBwRGxsa0NhbFN0YXRzLT5tX3VsQ3VyVHhGcmFtZUNvdW50Tm10LAorCQkJICBwRGxsa0NhbFN0YXRzLT5tX3VsQ3VyUnhGcmFtZUNvdW50LAorCQkJICBwRGxsa0NhbFN0YXRzLT5tX3VsTWF4VHhGcmFtZUNvdW50R2VuLAorCQkJICBwRGxsa0NhbFN0YXRzLT5tX3VsTWF4VHhGcmFtZUNvdW50Tm10LAorCQkJICBwRGxsa0NhbFN0YXRzLT5tX3VsTWF4UnhGcmFtZUNvdW50KTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkvLyBmZXRjaCBydW5uaW5nIElkZW50UmVxdWVzdHMKKwluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCSAgInJ1bm5pbmcgSWRlbnRSZXF1ZXN0czogICAgICAweCUwOGxYXG4iLAorCQkJICBFcGxJZGVudHVHZXRSdW5uaW5nUmVxdWVzdHMoKSk7CisKKwkvLyBmZXRjaCBzdGF0ZSBvZiBObXRNbnUgbW9kdWxlCisJeworCQl1bnNpZ25lZCBpbnQgdWlNYW5kYXRvcnlTbGF2ZUNvdW50OworCQl1bnNpZ25lZCBpbnQgdWlTaWduYWxTbGF2ZUNvdW50OworCQlXT1JEIHdGbGFnczsKKworCQlFcGxObXRNbnVHZXREaWFnbm9zdGljSW5mbygmdWlNYW5kYXRvcnlTbGF2ZUNvdW50LAorCQkJCQkgICAmdWlTaWduYWxTbGF2ZUNvdW50LCAmd0ZsYWdzKTsKKworCQluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCQkgICJNTiAgTWFuZFNsYXZlQ291bnQ6ICV1ICBTaWdTbGF2ZUNvdW50OiAldSAgRmxhZ3M6IDB4JVhcbiIsCisJCQkJICB1aU1hbmRhdG9yeVNsYXZlQ291bnQsIHVpU2lnbmFsU2xhdmVDb3VudCwKKwkJCQkgIHdGbGFncyk7CisKKwl9CisjZW5kaWYKKworCS8vIC0tLS0gRkVDIHN0YXRlIC0tLS0KKyNpZmRlZiBDT05GSUdfQ09MREZJUkUKKwl7CisJCS8vIFJlY2VpdmUgdGhlIGJhc2UgYWRkcmVzcworCQl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKKyNpZiAoRURSVl9VU0VEX0VUSF9DVFJMID09IDApCisJCS8vIFNldCB0aGUgYmFzZSBhZGRyZXNzIG9mIEZFQzAKKwkJYmFzZV9hZGRyID0gRkVDX0JBU0VfQUREUl9GRUMwOworI2Vsc2UKKwkJLy8gU2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgRkVDMQorCQliYXNlX2FkZHIgPSBGRUNfQkFTRV9BRERSX0ZFQzE7CisjZW5kaWYKKworCQluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCQkgICJGRUNfRUNSID0gMHglMDhYIEZFQ19FSVIgPSAweCUwOFggRkVDX0VJTVIgPSAweCUwOFhcbkZFQ19UQ1IgPSAweCUwOFggRkVDVEZTUiA9IDB4JTA4WCBGRUNSRlNSID0gMHglMDhYXG4iLAorCQkJCSAgRkVDX0VDUihiYXNlX2FkZHIpLCBGRUNfRUlSKGJhc2VfYWRkciksCisJCQkJICBGRUNfRUlNUihiYXNlX2FkZHIpLCBGRUNfVENSKGJhc2VfYWRkciksCisJCQkJICBGRUNfRkVDVEZTUihiYXNlX2FkZHIpLAorCQkJCSAgRkVDX0ZFQ1JGU1IoYmFzZV9hZGRyKSk7CisJfQorI2VuZGlmCisKKwkvLyAtLS0tIERCRzogVHJhY2VQb2ludHMgLS0tLQorI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXworCXsKKwkJaW50IG5OdW07CisKKwkJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAiRGJnVHJhY2VQb2ludHM6XG4iKTsKKwkJZm9yIChuTnVtID0gMDsKKwkJICAgICBuTnVtIDwgKHNpemVvZihhYXRtRGJnVHJhY2VQb2ludF9sKSAvIHNpemVvZihhdG9taWNfdCkpOworCQkgICAgIG5OdW0rKykgeworCQkJblNpemUgKz0KKwkJCSAgICBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCQkgICAgICIgVHJhY2VQb2ludFslMmRdOiAlZFxuIiwgKGludCluTnVtLAorCQkJCSAgICAgYXRvbWljX3JlYWQoJmFhdG1EYmdUcmFjZVBvaW50X2xbbk51bV0pKTsKKwkJfQorCisJCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJCSAgIkRiZ1RyYWNlVmFsdWVzOlxuIik7CisJCWZvciAobk51bSA9IDA7IG5OdW0gPCBEQkdfVFJBQ0VfVkFMVUVTOyBuTnVtKyspIHsKKwkJCWlmIChuTnVtID09IHVpRGJnVHJhY2VWYWx1ZVBvc19sKSB7CS8vIG5leHQgdmFsdWUgd2lsbCBiZSBzdG9yZWQgYXQgdGhhdCBwb3NpdGlvbgorCQkJCW5TaXplICs9CisJCQkJICAgIHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwKKwkJCQkJICAgICBuQnVmZmVyU2l6ZV9wIC0gblNpemUsICIqJTA4bFgiLAorCQkJCQkgICAgIGFkd0RiZ1RyYWNlVmFsdWVfbFtuTnVtXSk7CisJCQl9IGVsc2UgeworCQkJCW5TaXplICs9CisJCQkJICAgIHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwKKwkJCQkJICAgICBuQnVmZmVyU2l6ZV9wIC0gblNpemUsICIgJTA4bFgiLAorCQkJCQkgICAgIGFkd0RiZ1RyYWNlVmFsdWVfbFtuTnVtXSk7CisJCQl9CisJCQlpZiAoKG5OdW0gJiAweDAwMDAwMDA3KSA9PSAweDAwMDAwMDA3KSB7CS8vIDggdmFsdWVzIHByaW50ZWQgLT4gZW5kIG9mIGxpbmUgcmVhY2hlZAorCQkJCW5TaXplICs9CisJCQkJICAgIHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwKKwkJCQkJICAgICBuQnVmZmVyU2l6ZV9wIC0gblNpemUsICJcbiIpOworCQkJfQorCQl9CisJCWlmICgobk51bSAmIDB4MDAwMDAwMDcpICE9IDB4MDAwMDAwMDcpIHsJLy8gbnVtYmVyIG9mIHZhbHVlcyBwcmludGVkIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggLT4gcHJpbnQgbmV3IGxpbmUKKwkJCW5TaXplICs9CisJCQkgICAgc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAgICAiXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCisJRW9mID0gMTsKKwlnb3RvIEV4aXQ7CisKKyAgICAgIEV4aXQ6CisKKwkqcEVvZl9wID0gRW9mOworCisJcmV0dXJuIChuU2l6ZSk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXcml0ZSBmdW5jdGlvbiBmb3IgUFJPQy1GUyB3cml0ZSBhY2Nlc3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXBsTGluUHJvY1dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBhYkJ1ZmZlcltjb3VudCArIDFdOworCWludCBpRXJyOworCWludCBpVmFsID0gMDsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisKKwlpZiAoY291bnQgPiAwKSB7CisJCWlFcnIgPSBjb3B5X2Zyb21fdXNlcihhYkJ1ZmZlciwgYnVmZmVyLCBjb3VudCk7CisJCWlmIChpRXJyICE9IDApIHsKKwkJCXJldHVybiBjb3VudDsKKwkJfQorCQlhYkJ1ZmZlcltjb3VudF0gPSAnXDAnOworCisJCWlFcnIgPSBzc2NhbmYoYWJCdWZmZXIsICIlaSIsICZpVmFsKTsKKwl9CisJaWYgKChpVmFsIDw9IDApIHx8IChpVmFsID4gMHgyRikpIHsKKwkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTd1Jlc2V0OworCX0gZWxzZSB7CisJCU5tdEV2ZW50ID0gKHRFcGxObXRFdmVudCkgaVZhbDsKKwl9CisJLy8gZXhlY3V0ZSBzcGVjaWZpZWQgTk1UIGNvbW1hbmQgb24gd3JpdGUgYWNjZXNzIG9mIC9wcm9jL2VwbAorCUVwbE5tdHVObXRFdmVudChObXRFdmVudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvcHJvY19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ODZmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuaApAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW50ZXJmYWNlIGZvciBwcm9jIGZzIGVudHJ5IHVuZGVyIExpbnV4CisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogcHJvY19mcy5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMzICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHTlUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzMxIGQuay46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMUFJPQ0ZTX0hfCisjZGVmaW5lIF9FUExQUk9DRlNfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTGluUHJvY0luaXQodm9pZCk7Cit0RXBsS2VybmVsIEVwbExpblByb2NGcmVlKHZvaWQpOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMUFJPQ0ZTX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsQ2ZnTWF1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsQ2ZnTWF1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1YTFlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxDZmdNYXUuaApAQCAtMCwwICsxLDI4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRXBsIENvbmZpZ3VyYXRpb24gTWFuYWdlciBNb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxDZmdNYXUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBWQzcKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzE0IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAtPiBiYXNlZCBvbiBDQU5vcGVuIENmZ01hLU1vZHVsIChDQU5vcGVuIHZlcnNpb24gNS4zNCkKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbEluYy5oIgorCisjaWZuZGVmIF9FUExDRkdNQV9IXworI2RlZmluZSBfRVBMQ0ZHTUFfSF8KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfQ0ZHTUEpKSAhPSAwKQorCisjaW5jbHVkZSAiRXBsT2JkdS5oIgorI2luY2x1ZGUgIkVwbFNkb0NvbXUuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvL2RlZmluZSBtYXggbnVtYmVyIG9mIHRpbWVvdXRzIGZvciBjb25maWd1cmF0aW9uIG9mIDEgZGV2aWNlCisjZGVmaW5lIEVQTF9DRkdNQV9NQVhfVElNRU9VVCAgIDMKKworLy9jYWxsYmFja2Z1bmN0aW9uLCBjYWxsZWQgaWYgY29uZmlndXJhdGlvbiBpcyBmaW5pc2hlZAordHlwZWRlZiB2b2lkIChQVUJMSUMgKiB0ZnBFcGxDZmdNYUNiKSAodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgIHRFcGxLZXJuZWwgRXJyb3JzdGF0ZV9wKTsKKworLy9TdGF0ZSBmb3IgY29uZmlndWFydGlvbiBtYW5hZ2VyIFN0YXRlbWFjaGluZQordHlwZWRlZiBlbnVtIHsKKwkvLyBnZW5lcmFsIHN0YXRlcworCWtFcGxDZmdNYUlkbGUgPSAweDAwMDAsCS8vIENvbmZpZ3VyYXRpb25zcHJvY2VzcworCS8vIGlzIGlkbGUKKwlrRXBsQ2ZnTWFXYWl0Rm9yU2RvY0V2ZW50ID0gMHgwMDAxLAkvLyB3YWl0IHVudGlsIHRoZSBsYXN0CisJLy8gU0RPQyBpcyBmaW5pc2NoZWQKKwlrRXBsQ2ZnTWFTa2lwTWFwcGluZ1N1YjAgPSAweDAwMDIsCS8vIHdyaXRlIFN1YjAgb2YgbWFwcGluZworCS8vIHBhcmFtZXRlciB3aXRoIDAKKworCWtFcGxDZmdNYUZpbmlzaGVkID0gMHgwMDA0CS8vIGNvbmZpZ3VhcnRpb24gaXMgZmluaXNoZWQKK30gdEVwbENmZ1N0YXRlOworCit0eXBlZGVmIGVudW0geworCWtFcGxDZmdNYURjZlR5cFN5c3RlY1NlZyA9IDB4MDAsCisJa0VwbENmZ01hRGNmVHlwQ29uRGNmID0gMHgwMSwKKwlrRXBsQ2ZnTWFEY2ZUeXBEY2YgPSAweDAyLAkvLyBub3Qgc3VwcG9ydGVkCisJa0VwbENmZ01hRGNmVHlwWGRjID0gMHgwMwkvLyBub3Qgc3VwcG9ydGVkCit9IHRFcGxDZmdNYURjZlR5cDsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsQ2ZnTWFDb21tb24gPSAwLAkvLyBhbGwgb3RoZXIgaW5kZXgKKwlrRXBsQ2ZnTWFQZG9Db21tID0gMSwJLy8gY29tbXVuaWNhdGlvbiBpbmRleAorCWtFcGxDZmdNYVBkb01hcHAgPSAyLAkvLyBtYXBwaW5nIGluZGV4CisJa0VwbENmZ01hUGRvQ29tbUFmdGVyTWFwcCA9IDMsCS8vIHdyaXRlIFBETyBDb2ItSWQgYWZ0ZXIgbWFwcGluZyBzdWJpbmRleCAwKHNldCBQRE8gdmFsaWQpCisKK30gdEVwbENmZ01hSW5kZXhUeXBlOworCisvL2JpdGNvZGVkIGFuc3dlciBhYm91dCB0aGUgbGFzdCBzZG8gdHJhbnNmZXIgc2F2ZWQgaW4gbV9TZG9jU3RhdGUKKy8vIGFsc28gdXNlZCB0byBzaW5nYWwgc3RhcnQgb2YgdGhlIFN0YXRlIE1hc2NoaW5lCit0eXBlZGVmIGVudW0geworCWtFcGxDZmdNYVNkb2NCdXN5ID0gMHgwMCwJLy8gU0RPQyBhY3RpdgorCWtFcGxDZmdNYVNkb2NSZWFkeSA9IDB4MDEsCS8vIFNET0MgZmluaXNoZWQKKwlrRXBsQ2ZnTWFTZG9jVGltZW91dCA9IDB4MDIsCS8vIFNET0MgVGltZW91dAorCWtFcGxDZmdNYVNkb2NBYm9ydFJlY2VpdmVkID0gMHgwNCwJLy8gU0RPQyBBYm9ydCwgc2VlIEFib3J0Y29kZQorCWtFcGxDZmdNYVNkb2NTdGFydCA9IDB4MDgJLy8gc3RhcnQgU3RhdGUgTXNjaGluZQorfSB0RXBsU2RvY1N0YXRlOworCisvL2ludGVybmFsIHN0cnVjdHVyZSAoaW5zdGFuY2V0YWJsZSBmb3IgbW9kdWwgY29uZmlndXJhdGlvbiBtYW5hZ2VyKQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxDZmdTdGF0ZSBtX0NmZ1N0YXRlOwkvLyBzdGF0ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBzdGF0ZSBtYXNjaGluZQorCXRFcGxTZG9Db21Db25IZGwgbV9TZG9Db21Db25IZGw7CS8vIGhhbmRsZSBmb3Igc2RvIGNvbm5lY3Rpb24KKwlEV09SRCBtX2R3TGFzdEFib3J0Q29kZTsKKwl1bnNpZ25lZCBpbnQgbV91aUxhc3RJbmRleDsJLy8gbGFzdCBpbmRleCBvZiBjb25maWd1cmF0aW9uLCB0byBjb21wYWlyIHdpdGggYWN0dWFsIGluZGV4CisJQllURSAqbV9wYkNvbmNpc2U7CS8vIFB0ciB0byBjb25jaXNlIERDRgorCUJZVEUgKm1fcGJBY3R1YWxJbmRleDsJLy8gUHRyIHRvIGFjdHVhbCBpbmRleCBpbiB0aGUgRENGIHNlZ21lbnQKKwl0ZnBFcGxDZmdNYUNiIG1fcGZuQ2ZnTWFDYjsJLy8gUHRyIHRvIENmZ01hIENhbGxiYWNrLCBpcyBjYWxsIGlmIGNvbmZpZ3VyYXRpb24gZmluaXNoZWQKKwl0RXBsS2VybmVsIG1fRXBsS2VybmVsRXJyb3I7CS8vIGVycm9yY29kZQorCURXT1JEIG1fZHdOdW1WYWx1ZUNvcHk7CS8vIG51bWVyaWMgdmFsdWVzIGFyZSBjb3BpZWQgaW4gdGhpcyB2YXJpYWJsZQorCXVuc2lnbmVkIGludCBtX3VpUGRvTm9kZUlkOwkvLyBidWZmZXIgZm9yIFBETyBub2RlIGlkCisJQllURSBtX2JOck9mTWFwcGVkT2JqZWN0OwkvLyBudW1iZXIgb2YgbWFwcGVkIG9iamVjdHMKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gRXBsIG5vZGUgYWRkcmVzc2UKKwl0RXBsU2RvY1N0YXRlIG1fU2RvY1N0YXRlOwkvLyBiaXRjb2RlZCBzdGF0ZSBvZiB0aGUgU0RPIHRyYW5zZmVyCisJdW5zaWduZWQgaW50IG1fdWlMYXN0U3ViSW5kZXg7CS8vIGxhc3Qgc3ViaW5kZXggb2YgY29uZmlndXJhdGlvbgorCUJPT0wgbV9mT25lVHJhbmZlck9rOwkvLyBhdGxlYXNlZCBvbmUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwKKwlCWVRFIG1fYkV2ZW50RmxhZzsJLy8gZm9yIEV2ZW50c2lnbmFsaW5nIHRvIHRoZSBTdGF0ZSBNYXNjaGluZQorCURXT1JEIG1fZHdDbnRPYmplY3RJbkRjZjsJLy8gbnVtYmVyIG9mIE9iamVjdHMgaW4gRENGCisJdEVwbENmZ01hSW5kZXhUeXBlIG1fU2tpcENmZzsJLy8gVFJVRSBpZiBhIGFkc2l0aW9uYWwgQ29uZmlndXJhdGlvbnByb2Nlc3MKKwkvLyBoYXZlIHRvIGluc2VydCBlLmcuIFBETy1tYXBwaW5nCisJV09SRCBtX3dUaW1lT3V0Q250OwkvLyBUaW1lb3V0IENvdW50ZXIsIGJyZWFrIGNvbmZpZ3VyYXRpb24gaXMKKwkvLyBtX3dUaW1lT3V0Q250ID09IENGR01BX01BWF9USU1FT1VUCisKK30gdEVwbENmZ01hTm9kZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFJbml0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gY3JlYXRlcyBmaXJzdCBpbnN0YW5jZSBvZiBDb25maWd1cmF0aW9uIE1hbmFnZXIKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYUluaXQoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxDZmdNYUFkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gY3JlYXRlcyBhZGRpdGlvbmFsIGluc3RhbmNlIG9mIENvbmZpZ3VyYXRpb24gTWFuYWdlcgorLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hQWRkSW5zdGFuY2UoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxDZmdNYURlbEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZGVsZXRlIGluc3RhbmNlIG9mIENvbmZpZ3VyYXRpb24gTWFuYWdlcgorLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hRGVsSW5zdGFuY2UoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxDZmdNYVN0YXJ0Q29uZmlnKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gc3RhcnRzIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MKKy8vICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiB0aGUgc3RhdGVtYWNoaW5lIGZvciBDZmdNYS0gcHJvY2VzcworLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IE5vZGVJZCBvZiB0aGUgbm9kZSB0byBjb25maWd1cmUKKy8vICAgICAgICAgICAgICBwYkNvbmNpc2VfcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gRENGCisvLyAgICAgICAgICAgICAgZnBDZmdNYUNiX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIChzaG91bGQgbm90IGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgU2l6ZU9mQ29uY2lzZV9wICAgICAgICAgPSBzaXplIG9mIERDRiBpbiBCWVRFIC0+IGZvciBmdXR1cmUgdXNlCisvLyAgICAgICAgICAgICAgRGNmVHlwZV9wICAgICAgICAgICAgICAgPSB0eXBlIG9mIHRoZSBEQ0YKKy8vCisvLyBSZXR1cm5zOiAgICAgdENvcEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFTdGFydENvbmZpZyh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgICBCWVRFICogcGJDb25jaXNlX3AsCisJCQkJICAgICAgdGZwRXBsQ2ZnTWFDYiBmcENmZ01hQ2JfcCwKKwkJCQkgICAgICB0RXBsT2JkU2l6ZSBTaXplT2ZDb25jaXNlX3AsCisJCQkJICAgICAgdEVwbENmZ01hRGNmVHlwIERjZlR5cGVfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgQ2ZnTWFTdGFydENvbmZpZ3VyYXRpb25Ob2RlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gc3RhcnRlZCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzCisvLyAgICAgICAgICAgICAgd2l0aCB0aGUgRENGIGZyb20gYWNjb3JkaW5nIE9ELWVudHJ5IFN1YmluZGV4ID09IGJOb2RlSWRfcAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IE5vZGVJZCBvZiB0aGUgbm9kZSB0byBjb25maWd1cmUKKy8vICAgICAgICAgICAgICBmcENmZ01hQ2JfcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gKHNob3VsZCBub3QgYmUgTlVMTCkKKy8vICAgICAgICAgICAgICBEY2ZUeXBlX3AgICAgICAgICAgICAgICA9IHR5cGUgb2YgdGhlIERDRgorLy8KKy8vIFJldHVybnM6ICAgICB0Q29wS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYVN0YXJ0Q29uZmlnTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICB0ZnBFcGxDZmdNYUNiIGZwQ2ZnTWFDYl9wLAorCQkJCQkgIHRFcGxDZmdNYURjZlR5cCBEY2ZUeXBlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbENmZ01hU3RhcnRDb25maWdOb2RlRGNmKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gc3RhcnRzIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MKKy8vICAgICAgICAgICAgICBhbmQgbGlua3MgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSB0byB0aGUgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBOb2RlSWQgb2YgdGhlIG5vZGUgdG8gY29uZmlndXJlCisvLyAgICAgICAgICAgICAgcGJDb25jaXNlX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIERDRgorLy8gICAgICAgICAgICAgIGZwQ2ZnTWFDYl9wICAgICAgICAgICAgID0gcG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiAoc2hvdWxkIG5vdCBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIFNpemVPZkNvbmNpc2VfcCAgICAgICAgID0gc2l6ZSBvZiBEQ0YgaW4gQllURSAtPiBmb3IgZnV0dXJlIHVzZQorLy8gICAgICAgICAgICAgIERjZlR5cGVfcCAgICAgICAgICAgICAgID0gdHlwZSBvZiB0aGUgRENGCisvLworLy8gUmV0dXJuczogICAgIHRDb3BLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hU3RhcnRDb25maWdOb2RlRGNmKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICAgIEJZVEUgKiBwYkNvbmNpc2VfcCwKKwkJCQkJICAgICB0ZnBFcGxDZmdNYUNiIGZwQ2ZnTWFDYl9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplIFNpemVPZkNvbmNpc2VfcCwKKwkJCQkJICAgICB0RXBsQ2ZnTWFEY2ZUeXAgRGNmVHlwZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxDZmdNYUxpbmtEY2YoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBsaW5rcyB0aGUgY29uZmlndXJhdGlvbiBkYXRhIHRvIHRoZSBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IE5vZGVJZCBvZiB0aGUgbm9kZSB0byBjb25maWd1cmUKKy8vICAgICAgICAgICAgICBwYkNvbmNpc2VfcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gRENGCisvLyAgICAgICAgICAgICAgU2l6ZU9mQ29uY2lzZV9wICAgICAgICA9IHNpemUgb2YgRENGIGluIEJZVEUgLT4gZm9yIGZ1dHVyZSB1c2UKKy8vICAgICAgICAgICAgICBEY2ZUeXBlX3AgICAgICAgICAgICAgICA9IHR5cGUgb2YgdGhlIERDRgorLy8KKy8vIFJldHVybnM6ICAgICB0Q29wS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYUxpbmtEY2YodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICBCWVRFICogcGJDb25jaXNlX3AsCisJCQkJICB0RXBsT2JkU2l6ZSBTaXplT2ZDb25jaXNlX3AsCisJCQkJICB0RXBsQ2ZnTWFEY2ZUeXAgRGNmVHlwZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxDZmdNYUNoZWNrRGNmKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gY2hlY2sgaWYgdGhlcmUgaXMgYWxscmVhZHkgYSBjb25maWd1cmF0aW9uIGZpbGUgbGlua2VkCisvLyAgICAgICAgICAgICAgdG8gdGhlIE9EICh0eXBlIGlzIGdpdmVuIGJ5IERjZlR5cGVfcCkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBOb2RlSWQKKy8vICAgICAgICAgICAgICBEY2ZUeXBlX3AgICAgICAgICAgICAgICA9IHR5cGUgb2YgdGhlIERDRgorLy8KKy8vIFJldHVybnM6ICAgICB0Q29wS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYUNoZWNrRGNmKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgIHRFcGxDZmdNYURjZlR5cCBEY2ZUeXBlX3ApOworCisjZW5kaWYgLy8gI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfQ0ZHTUEpKSAhPSAwKQorCisjZW5kaWYgLy8gX0VQTENGR01BX0hfCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbERsbHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxEbGx1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmOGJiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxEbGx1LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIHVzZXJzcGFjZSBETEwgbW9kdWxlIGZvciBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzIwIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0RMTFVfSF8KKyNkZWZpbmUgX0VQTF9ETExVX0hfCisKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbERsbHVDYkFzbmQpICh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisKK3RFcGxLZXJuZWwgRXBsRGxsdUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbHVEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1UmVnQXNuZFNlcnZpY2UodEVwbERsbEFzbmRTZXJ2aWNlSWQgU2VydmljZUlkX3AsCisJCQkJIHRFcGxEbGx1Q2JBc25kIHBmbkRsbHVDYkFzbmRfcCwKKwkJCQkgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApOworCit0RXBsS2VybmVsIEVwbERsbHVBc3luY1NlbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCwKKwkJCSAgICB0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eV9wKTsKKworLy8gcHJvY2Vzc2VzIGFzeW5jaCBmcmFtZXMKK3RFcGxLZXJuZWwgRXBsRGxsdVByb2Nlc3ModEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxEbGx1Q2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdUNhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGNkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdUNhbC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUgaW4gRVBMIHVzZXIgcGFydAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbHVDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzIwIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0RMTFVDQUxfSF8KKyNkZWZpbmUgX0VQTF9ETExVQ0FMX0hfCisKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKyNpbmNsdWRlICIuLi9FcGxFdmVudC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsRGxsdUNiQXNuZCkgKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbERlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxSZWdBc25kU2VydmljZSh0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkgICAgdEVwbERsbHVDYkFzbmQgcGZuRGxsdUNiQXNuZF9wLAorCQkJCSAgICB0RXBsRGxsQXNuZEZpbHRlciBGaWx0ZXJfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mbywKKwkJCSAgICAgICB0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eV9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsQWRkTm9kZSh0RXBsRGxsTm9kZUluZm8gKiBwTm9kZUluZm9fcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbERlbGV0ZU5vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbElzc3VlUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkIFNlcnZpY2VfcCwKKwkJCQkgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLCBCWVRFIGJTb2FGbGFnMV9wKTsKKworI2VuZGlmCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRExMVUNBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbEV2ZW50dS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbEV2ZW50dS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMmNmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRXZlbnR1LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBldmVudCBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFdmVudHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VWRU5UVV9IXworI2RlZmluZSBfRVBMX0VWRU5UVV9IXworCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGluaXQgZnVuY3Rpb24KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dUluaXQodEVwbFByb2Nlc3NFdmVudENiIHBmbkFwaVByb2Nlc3NFdmVudENiX3ApOworCisvLyBhZGQgaW5zdGFuY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dUFkZEluc3RhbmNlKHRFcGxQcm9jZXNzRXZlbnRDYgorCQkJCSAgICAgICBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKTsKKworLy8gZGVsZXRlIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVEZWxJbnN0YW5jZSh2b2lkKTsKKworLy8gVGFzayB0aGF0IGRpc3BhdGNoZXMgZXZlbnRzIGluIHVzZXJzcGFjZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKy8vIHBvc3QgZXZlbnRzIGZyb20gdXNlcnNwYWNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVQb3N0KHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworLy8gcG9zdCBlcnJvcmV2ZW50cyBmcm9tIHVzZXJzcGFjZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UG9zdEVycm9yKHRFcGxFdmVudFNvdXJjZSBFdmVudFNvdXJjZV9wLAorCQkJCSAgICAgdEVwbEtlcm5lbCBFcGxFcnJvcl9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpQXJnU2l6ZV9wLCB2b2lkICpwQXJnX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0VWRU5UVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbElkZW50dS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbElkZW50dS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzAyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsSWRlbnR1LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIElkZW50dS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxJZGVudHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzExLzE1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKworI2lmbmRlZiBfRVBMSURFTlRVX0hfCisjZGVmaW5lIF9FUExJREVOVFVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbElkZW50dUNiUmVzcG9uc2UpICh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgIHRFcGxJZGVudFJlc3BvbnNlICoKKwkJCQkJCSAgIHBJZGVudFJlc3BvbnNlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1SW5pdCh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1QWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVSZXNldCh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1R2V0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgIHRFcGxJZGVudFJlc3BvbnNlICoqCisJCQkJCSAgICBwcElkZW50UmVzcG9uc2VfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dVJlcXVlc3RJZGVudFJlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbElkZW50dUNiUmVzcG9uc2UKKwkJCQkJCXBmbkNiUmVzcG9uc2VfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExJREVOVFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxMZWR1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTGVkdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTcwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTGVkdS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBzdGF0dXMgYW5kIGVycm9yIExFRCB1c2VyIHBhcnQgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTGVkdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDgvMTEvMTcgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbExlZC5oIgorI2luY2x1ZGUgIi4uL0VwbE5tdC5oIgorI2luY2x1ZGUgIkVwbEV2ZW50dS5oIgorCisjaWZuZGVmIF9FUExMRURVX0hfCisjZGVmaW5lIF9FUExMRURVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxMZWR1U3RhdGVDaGFuZ2VDYWxsYmFjaykgKHRFcGxMZWRUeXBlIExlZFR5cGVfcCwKKwkJCQkJCQkgIEJPT0wgZk9uX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExlZHVJbml0KHRFcGxMZWR1U3RhdGVDaGFuZ2VDYWxsYmFjayBwZm5DYlN0YXRlQ2hhbmdlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMZWR1QWRkSW5zdGFuY2UodEVwbExlZHVTdGF0ZUNoYW5nZUNhbGxiYWNrCisJCQkJICAgICBwZm5DYlN0YXRlQ2hhbmdlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMZWR1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExlZHVDYk5tdFN0YXRlQ2hhbmdlKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCSAgTm10U3RhdGVDaGFuZ2VfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExlZHVQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEVwbEV2ZW50X3ApOworCisjZW5kaWYgLy8gI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExMRURVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10Q251LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10Q251LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwODA1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXRDbnUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgTk1ULUNOLVVzZXJzcGFjZS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXRDbnUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxObXR1LmgiCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisjaW5jbHVkZSAiLi4vRXBsRnJhbWUuaCIKKworI2lmbmRlZiBfRVBMTk1UQ05VX0hfCisjZGVmaW5lIF9FUExOTVRDTlVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfQ04pKSAhPSAwKQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251SW5pdCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVBZGRJbnN0YW5jZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVEZWxJbnN0YW5jZSh2b2lkKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudVNlbmRObXRSZXF1ZXN0KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgICAgIHRFcGxObXRDb21tYW5kCisJCQkJCQkgICAgICAgTm10Q29tbWFuZF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXRDbnVSZWdpc3RlckNoZWNrRXZlbnRDYih0RXBsTm10dUNoZWNrRXZlbnRDYWxsYmFjaworCQkJICAgICAgcGZuRXBsTm10Q2hlY2tFdmVudENiX3ApOworCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfQ04pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UQ05VX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10TW51LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10TW51LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0ZWZlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXRNbnUuaApAQCAtMCwwICsxLDEzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgTk1ULU1OLVVzZXJzcGFjZS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXRNbnUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxObXR1LmgiCisKKyNpZm5kZWYgX0VQTE5NVE1OVV9IXworI2RlZmluZSBfRVBMTk1UTU5VX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxObXRNbnVDYk5vZGVFdmVudCkgKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgIHRFcGxObXROb2RlRXZlbnQKKwkJCQkJCSAgICBOb2RlRXZlbnRfcCwKKwkJCQkJCSAgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJCSAgICBXT1JEIHdFcnJvckNvZGVfcCwKKwkJCQkJCSAgICBCT09MIGZNYW5kYXRvcnlfcCk7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKgorCQkgICB0RXBsTm10TW51Q2JCb290RXZlbnQpICh0RXBsTm10Qm9vdEV2ZW50IEJvb3RFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbE5tdE1udUluaXQodEVwbE5tdE1udUNiTm9kZUV2ZW50IHBmbkNiTm9kZUV2ZW50X3AsCisJCQkgdEVwbE5tdE1udUNiQm9vdEV2ZW50IHBmbkNiQm9vdEV2ZW50X3ApOworCit0RXBsS2VybmVsIEVwbE5tdE1udUFkZEluc3RhbmNlKHRFcGxObXRNbnVDYk5vZGVFdmVudCBwZm5DYk5vZGVFdmVudF9wLAorCQkJCXRFcGxObXRNbnVDYkJvb3RFdmVudCBwZm5DYkJvb3RFdmVudF9wKTsKKwordEVwbEtlcm5lbCBFcGxObXRNbnVEZWxJbnN0YW5jZSh2b2lkKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgRXBsTm10TW51U2VuZE5tdENvbW1hbmQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgdEVwbE5tdENvbW1hbmQgTm10Q29tbWFuZF9wKTsKKwordEVwbEtlcm5lbCBFcGxObXRNbnVUcmlnZ2VyU3RhdGVDaGFuZ2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgIHRFcGxObXROb2RlQ29tbWFuZCBOb2RlQ29tbWFuZF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZSh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZQorCQkJCQkgICAgTm10U3RhdGVDaGFuZ2VfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUNiQ2hlY2tFdmVudCh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUdldERpYWdub3N0aWNJbmZvKHVuc2lnbmVkIGludAorCQkJCQkgICAgICpwdWlNYW5kYXRvcnlTbGF2ZUNvdW50X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50CisJCQkJCSAgICAgKnB1aVNpZ25hbFNsYXZlQ291bnRfcCwKKwkJCQkJICAgICBXT1JEICogcHdGbGFnc19wKTsKKworI2VuZGlmCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRNTlVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXR1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTZjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dS5oCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBOTVQtVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxObXQuaCIKKyNpbmNsdWRlICJFcGxFdmVudHUuaCIKKworI2lmbmRlZiBfRVBMTk1UVV9IXworI2RlZmluZSBfRVBMTk1UVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBubXQgY29tbWFuZHMKK3R5cGVkZWYgZW51bSB7CisJLy8gcmVxdWVzdGFibGUgQVNuZCBTZXJ2aWNlSWRzICAgIDB4MDEuLjB4MUYKKwlrRXBsTm10Q21kSWRlbnRSZXNwb25zZSA9IDB4MDEsCisJa0VwbE5tdENtZFN0YXR1c1Jlc3BvbnNlID0gMHgwMiwKKwkvLyBwbGFpbiBOTVQgc3RhdGUgY29tbWFuZHMgICAgICAgMHgyMC4uMHgzRgorCWtFcGxObXRDbWRTdGFydE5vZGUgPSAweDIxLAorCWtFcGxObXRDbWRTdG9wTm9kZSA9IDB4MjIsCisJa0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyID0gMHgyMywKKwlrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGUgPSAweDI0LAorCWtFcGxObXRDbWRSZXNldE5vZGUgPSAweDI4LAorCWtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb24gPSAweDI5LAorCWtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb24gPSAweDJBLAorCWtFcGxObXRDbWRTd1Jlc2V0ID0gMHgyQiwKKwkvLyBleHRlbmRlZCBOTVQgc3RhdGUgY29tbWFuZHMgICAgMHg0MC4uMHg1RgorCWtFcGxObXRDbWRTdGFydE5vZGVFeCA9IDB4NDEsCisJa0VwbE5tdENtZFN0b3BOb2RlRXggPSAweDQyLAorCWtFcGxObXRDbWRFbnRlclByZU9wZXJhdGlvbmFsMkV4ID0gMHg0MywKKwlrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGVFeCA9IDB4NDQsCisJa0VwbE5tdENtZFJlc2V0Tm9kZUV4ID0gMHg0OCwKKwlrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uRXggPSAweDQ5LAorCWtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb25FeCA9IDB4NEEsCisJa0VwbE5tdENtZFN3UmVzZXRFeCA9IDB4NEIsCisJLy8gTk1UIG1hbmFnaW5nIGNvbW1hbmRzICAgICAgICAgIDB4NjAuLjB4N0YKKwlrRXBsTm10Q21kTmV0SG9zdE5hbWVTZXQgPSAweDYyLAorCWtFcGxObXRDbWRGbHVzaEFycEVudHJ5ID0gMHg2MywKKwkvLyBOTVQgaW5mbyBzZXJ2aWNlcyAgICAgICAgICAgICAgMHg4MC4uMHhCRgorCWtFcGxObXRDbWRQdWJsaXNoQ29uZmlndXJlZENOID0gMHg4MCwKKwlrRXBsTm10Q21kUHVibGlzaEFjdGl2ZUNOID0gMHg5MCwKKwlrRXBsTm10Q21kUHVibGlzaFByZU9wZXJhdGlvbmFsMSA9IDB4OTEsCisJa0VwbE5tdENtZFB1Ymxpc2hQcmVPcGVyYXRpb25hbDIgPSAweDkyLAorCWtFcGxObXRDbWRQdWJsaXNoUmVhZHlUb09wZXJhdGUgPSAweDkzLAorCWtFcGxObXRDbWRQdWJsaXNoT3BlcmF0aW9uYWwgPSAweDk0LAorCWtFcGxObXRDbWRQdWJsaXNoU3RvcHBlZCA9IDB4OTUsCisJa0VwbE5tdENtZFB1Ymxpc2hFbWVyZ2VuY3lOZXcgPSAweEEwLAorCWtFcGxObXRDbWRQdWJsaXNoVGltZSA9IDB4QjAsCisKKwlrRXBsTm10Q21kSW52YWxpZFNlcnZpY2UgPSAweEZGCit9IHRFcGxObXRDb21tYW5kOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICoKKwkJICAgdEVwbE5tdHVTdGF0ZUNoYW5nZUNhbGxiYWNrKSAodEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwkJCQkJCSBObXRTdGF0ZUNoYW5nZV9wKTsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqCisJCSAgIHRFcGxObXR1Q2hlY2tFdmVudENhbGxiYWNrKSAodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVJbml0KHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dUFkZEluc3RhbmNlKHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dURlbEluc3RhbmNlKHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dU5tdEV2ZW50KHRFcGxObXRFdmVudCBObXRFdmVudF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMgRXBsTm10dUdldE5tdFN0YXRlKHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsTm10dVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYih0RXBsTm10dVN0YXRlQ2hhbmdlQ2FsbGJhY2sKKwkJCSAgICAgcGZuRXBsTm10U3RhdGVDaGFuZ2VDYl9wKTsKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dUNhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdHVDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODgxNTgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdHVDYWwuaApAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyIG9mIHRoZQorICAgICAgICAgICAgICAgIE5NVC1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10dUNhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTYgLWsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxObXR1LmgiCisjaW5jbHVkZSAiLi4va2VybmVsL0VwbE5tdGsuaCIKKworI2lmbmRlZiBfRVBMTk1UVUNBTF9IXworI2RlZmluZSBfRVBMTk1UVUNBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMgRXBsTm10a0NhbEdldE5tdFN0YXRlKHZvaWQpOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UVUNBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE9iZHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxZTE3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1LmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbC1PYmQtVXNlcnNwYWNlLW1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKworI2lmbmRlZiBfRVBMT0JEVV9IXworI2RlZmluZSBfRVBMT0JEVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKworI2lmIEVQTF9PQkRfVVNFX0tFUk5FTCAhPSBGQUxTRQorI2Vycm9yICJFUEwgT0JEdSBtb2R1bGUgZW5hYmxlZCwgYnV0IE9CRF9VU0VfS0VSTkVMID09IFRSVUUiCisjZW5kaWYKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVXcml0ZUVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJIHRFcGxPYmRTaXplIFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVSZWFkRW50cnkodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCXVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQl2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUFjY2Vzc09kUGFydCh0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdURlZmluZVZhcih0RXBsVmFyUGFyYW0gTUVNICogcFZhclBhcmFtX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkICpQVUJMSUMgRXBsT2JkdUdldE9iamVjdERhdGFQdHIodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVnaXN0ZXJVc2VyT2QodEVwbE9iZEVudHJ5UHRyIHBVc2VyT2RfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgUFVCTElDIEVwbE9iZHVJbml0VmFyRW50cnkodEVwbE9iZFZhckVudHJ5IE1FTSAqIHBWYXJFbnRyeV9wLAorCQkJCQkgICAgIEJZVEUgYlR5cGVfcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkdUdldERhdGFTaXplKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdW5zaWduZWQgaW50IFBVQkxJQyBFcGxPYmR1R2V0Tm9kZUlkKHZvaWQpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1U2V0Tm9kZUlkKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbE9iZE5vZGVJZFR5cGUgTm9kZUlkVHlwZV9wKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVHZXRBY2Nlc3NUeXBlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICB0RXBsT2JkQWNjZXNzICoKKwkJCQkJCSAgICBwQWNjZXNzVHlwX3ApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVJlYWRFbnRyeVRvTGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgICAgdEVwbE9iZFNpemUgU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCQkgICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKioKKwkJCQkJCSAgICAgcHBWYXJFbnRyeV9wKTsKKworI2VsaWYgRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFCisjaW5jbHVkZSAiLi4va2VybmVsL0VwbE9iZGsuaCIKKworI2RlZmluZSBFcGxPYmR1V3JpdGVFbnRyeSAgICAgICBFcGxPYmRXcml0ZUVudHJ5CisKKyNkZWZpbmUgRXBsT2JkdVJlYWRFbnRyeSAgICAgICAgRXBsT2JkUmVhZEVudHJ5CisKKyNkZWZpbmUgRXBsT2JkdUFjY2Vzc09kUGFydCAgICAgRXBsT2JkQWNjZXNzT2RQYXJ0CisKKyNkZWZpbmUgRXBsT2JkdURlZmluZVZhciAgICAgICAgRXBsT2JkRGVmaW5lVmFyCisKKyNkZWZpbmUgRXBsT2JkdUdldE9iamVjdERhdGFQdHIgRXBsT2JkR2V0T2JqZWN0RGF0YVB0cgorCisjZGVmaW5lIEVwbE9iZHVSZWdpc3RlclVzZXJPZCAgIEVwbE9iZFJlZ2lzdGVyVXNlck9kCisKKyNkZWZpbmUgRXBsT2JkdUluaXRWYXJFbnRyeSAgICAgRXBsT2JkSW5pdFZhckVudHJ5CisKKyNkZWZpbmUgRXBsT2JkdUdldERhdGFTaXplICAgICAgRXBsT2JkR2V0RGF0YVNpemUKKworI2RlZmluZSBFcGxPYmR1R2V0Tm9kZUlkICAgICAgICBFcGxPYmRHZXROb2RlSWQKKworI2RlZmluZSBFcGxPYmR1U2V0Tm9kZUlkICAgICAgICBFcGxPYmRTZXROb2RlSWQKKworI2RlZmluZSBFcGxPYmR1R2V0QWNjZXNzVHlwZSAgICBFcGxPYmRHZXRBY2Nlc3NUeXBlCisKKyNkZWZpbmUgRXBsT2JkdVJlYWRFbnRyeVRvTGUgICAgRXBsT2JkUmVhZEVudHJ5VG9MZQorCisjZGVmaW5lIEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUKKworI2RlZmluZSBFcGxPYmR1U2VhcmNoVmFyRW50cnkgICBFcGxPYmRTZWFyY2hWYXJFbnRyeQorCisjZGVmaW5lIEVwbE9iZHVJc051bWVyaWNhbCAgICAgIEVwbE9iZElzTnVtZXJpY2FsCisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMT0JEVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE9iZHVDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1Q2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4ZTAxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1Q2FsLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGNvbW11bmljYXRpb24gYWJzdHJhY3Rpb24gbGF5ZXIKKyAgICAgICAgICAgICAgICBmb3IgdGhlIEVwbC1PYmQtVXNlcnNwYWNlLU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkdUNhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbE9iZC5oIgorCisjaWZuZGVmIF9FUExPQkRVQ0FMX0hfCisjZGVmaW5lIF9FUExPQkRVQ0FMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFdyaXRlRW50cnkodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgdEVwbE9iZFNpemUgU2l6ZV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFJlYWRFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICB0RXBsT2JkU2l6ZSAqIHBTaXplX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsQWNjZXNzT2RQYXJ0KHRFcGxPYmRQYXJ0IE9iZFBhcnRfcCwKKwkJCQkJCSAgICAgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsRGVmaW5lVmFyKHRFcGxWYXJQYXJhbSBNRU0gKgorCQkJCQkJICAgcFZhclBhcmFtX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkICpQVUJMSUMgRXBsT2JkdUNhbEdldE9iamVjdERhdGFQdHIodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWdpc3RlclVzZXJPZCh0RXBsT2JkRW50cnlQdHIKKwkJCQkJCQlwVXNlck9kX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmR1Q2FsSW5pdFZhckVudHJ5KHRFcGxPYmRWYXJFbnRyeSBNRU0gKgorCQkJCQkJcFZhckVudHJ5X3AsIEJZVEUgYlR5cGVfcCwKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemVfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxPYmRTaXplIFBVQkxJQyBFcGxPYmR1Q2FsR2V0RGF0YVNpemUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgdWlTdWJJbmRleF9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdW5zaWduZWQgaW50IFBVQkxJQyBFcGxPYmR1Q2FsR2V0Tm9kZUlkKHZvaWQpOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsU2V0Tm9kZUlkKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbE9iZE5vZGVJZFR5cGUKKwkJCQkJCSAgIE5vZGVJZFR5cGVfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxHZXRBY2Nlc3NUeXBlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRBY2Nlc3MgKgorCQkJCQkJICAgICAgIHBBY2Nlc3NUeXBfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWFkRW50cnlUb0xlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICAgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFdyaXRlRW50cnlGcm9tTGUodW5zaWduZWQgaW50CisJCQkJCQkJICB1aUluZGV4X3AsCisJCQkJCQkJICB1bnNpZ25lZCBpbnQKKwkJCQkJCQkgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCQkgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkJICB0RXBsT2JkU2l6ZSBTaXplX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsT2JkdUNhbFNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCSB0RXBsT2JkVmFyRW50cnkgTUVNICoqIHBwVmFyRW50cnlfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRVQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsUGRvdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFBkb3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWRlNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFBkb3UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgdXNlcnNwYWNlIFBETyBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG91LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTEvMTkgMTc6MTQ6MzggJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9QRE9VX0hfCisjZGVmaW5lIF9FUExfUERPVV9IXworCisjaW5jbHVkZSAiLi4vRXBsUGRvLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRvdUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbFBkb3VEZWxJbnN0YW5jZSh2b2lkKTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPVSkpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxQZG91Q2JPYmRBY2Nlc3ModEVwbE9iZENiUGFyYW0gTUVNICogcFBhcmFtX3ApOworI2Vsc2UKKyNkZWZpbmUgRXBsUGRvdUNiT2JkQWNjZXNzCQlOVUxMCisjZW5kaWYKKworLy8gcmV0dXJucyBlcnJvciBpZiBiUGRvSWRfcCBpcyBhbHJlYWR5IHZhbGlkCisvKgordEVwbEtlcm5lbCBFcGxQZG91U2V0TWFwcGluZygKKyAgICBCWVRFIGJQZG9JZF9wLCBCT09MIGZUeFJ4X3AsIEJZVEUgYk5vZGVJZCwgQllURSBiTWFwcGluZ1ZlcnNpb24sCisgICAgdEVwbFBkb01hcHBpbmcgKiBwTWFwcGluZ19wLCBCWVRFIGJNYXhFbnRyaWVzX3ApOworCit0RXBsS2VybmVsIEVwbFBkb3VHZXRNYXBwaW5nKAorICAgIEJZVEUgYlBkb0lkX3AsIEJPT0wgZlR4UnhfcCwgQllURSAqIHBiTm9kZUlkLCBCWVRFICogcGJNYXBwaW5nVmVyc2lvbiwKKyAgICB0RXBsUGRvTWFwcGluZyAqIHBNYXBwaW5nX3AsIEJZVEUgKiBwYk1heEVudHJpZXNfcCk7CisqLworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1BET1VfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc25kdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0FzbmR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0OTU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc25kdS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBTRE8vQXNuZC1Qcm90b2NvbGFic3RyYWN0aW9ubGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQXNuZHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA3IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxTZG8uaCIKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKworI2lmbmRlZiBfRVBMU0RPQVNORFVfSF8KKyNkZWZpbmUgX0VQTFNET0FTTkRVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVJbml0KHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1QWRkSW5zdGFuY2UodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVJbml0Q29uKHRFcGxTZG9Db25IZGwgKiBwU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1U2VuZERhdGEodEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgICB0RXBsRnJhbWUgKiBwU3JjRGF0YV9wLAorCQkJCSAgICAgIERXT1JEIGR3RGF0YVNpemVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1RGVsQ29uKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3ApOworCisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPQVNORFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc3lTZXF1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQXN5U2VxdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NThiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQXN5U2VxdS5oCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBhc3ljaHJpb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQXN5U2VxdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFNkby5oIgorI2luY2x1ZGUgIkVwbFNkb1VkcHUuaCIKKyNpbmNsdWRlICJFcGxTZG9Bc25kdS5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisjaW5jbHVkZSAiRXBsVGltZXJ1LmgiCisKKyNpZm5kZWYgX0VQTFNET0FTWVNFUVVfSF8KKyNkZWZpbmUgX0VQTFNET0FTWVNFUVVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcUluaXQodEVwbFNkb0NvbVJlY2VpdmVDYiBmcFNkb0NvbUNiX3AsCisJCQkJICAgdEVwbFNkb0NvbUNvbkNiIGZwU2RvQ29tQ29uQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcUFkZEluc3RhbmNlKHRFcGxTZG9Db21SZWNlaXZlQ2IgZnBTZG9Db21DYl9wLAorCQkJCQkgIHRFcGxTZG9Db21Db25DYiBmcFNkb0NvbUNvbkNiX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxSW5pdENvbih0RXBsU2RvU2VxQ29uSGRsICogcFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgIHRFcGxTZG9UeXBlIFNkb1R5cGUpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFTZW5kRGF0YSh0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCSAgICAgICB0RXBsRnJhbWUgKiBwRGF0YV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxUHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxRGVsQ29uKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPQVNZU0VRVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0NvbXUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Db211LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0NTRjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Db211LmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIFNETyBDb21tYW5kIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb0NvbXUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxTZG8uaCIKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKyNpbmNsdWRlICIuLi9FcGxTZG9BYy5oIgorI2luY2x1ZGUgIkVwbE9iZHUuaCIKKyNpbmNsdWRlICJFcGxTZG9Bc3lTZXF1LmgiCisKKyNpZm5kZWYgX0VQTFNET0NPTVVfSF8KKyNkZWZpbmUgX0VQTFNET0NPTVVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21EZWxJbnN0YW5jZSh2b2lkKTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tRGVmaW5lQ29uKHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCwKKwkJCQkgICAgIHRFcGxTZG9UeXBlIFByb3RUeXBlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KHRFcGxTZG9Db21UcmFuc1BhcmFtQnlJbmRleCAqCisJCQkJCSAgICAgICBwU2RvQ29tVHJhbnNQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tVW5kZWZpbmVDb24odEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUdldFN0YXRlKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIHRFcGxTZG9Db21GaW5pc2hlZCAqIHBTZG9Db21GaW5pc2hlZF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tU2RvQWJvcnQodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgRFdPUkQgZHdBYm9ydENvZGVfcCk7CisKKyNlbmRpZgorCisvLyBmb3IgZnV0dXJlIGV4dGVudGlvbgorLyoKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXRUcmFuc2ZlckFsbEJ5SW5kZXgodEVwbFNkb0NvbVRyYW5zUGFyYW1BbGxCeUluZGV4KiBwU2RvQ29tVHJhbnNQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlOYW1lKHRFcGxTZG9Db21UcmFuc1BhcmFtQnlOYW1lKiBwU2RvQ29tVHJhbnNQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdFRyYW5zZmVyRmlsZSh0RXBsU2RvQ29tVHJhbnNQYXJhbUZpbGUqIHBTZG9Db21UcmFuc1BhcmFtX3ApOworCisqLworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPQ09NVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb1VkcHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9VZHB1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3N2I2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9VZHB1LmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIFNETy9VRFAtUHJvdG9jb2xsYWJzdHJhY3Rpb25sYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9VZHB1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsU2RvLmgiCisKKyNpZm5kZWYgX0VQTFNET1VEUFVfSF8KKyNkZWZpbmUgX0VQTFNET1VEUFVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVJbml0KHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVBZGRJbnN0YW5jZSh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVDb25maWcodW5zaWduZWQgbG9uZyB1bElwQWRkcl9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aVBvcnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVJbml0Q29uKHRFcGxTZG9Db25IZGwgKiBwU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aVRhcmdldE5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdVNlbmREYXRhKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICB0RXBsRnJhbWUgKiBwU3JjRGF0YV9wLAorCQkJCSAgICAgRFdPUkQgZHdEYXRhU2l6ZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdURlbENvbih0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wKTsKKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPVURQVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFN0YXR1c3UuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTdGF0dXN1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxMTkzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTdGF0dXN1LmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIFN0YXR1c3UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU3RhdHVzdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTEvMTUgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorCisjaWZuZGVmIF9FUExTVEFUVVNVX0hfCisjZGVmaW5lIF9FUExTVEFUVVNVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxTdGF0dXN1Q2JSZXNwb25zZSkgKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgIHRFcGxTdGF0dXNSZXNwb25zZSAqCisJCQkJCQkgICAgcFN0YXR1c1Jlc3BvbnNlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdUluaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1UmVzZXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VSZXF1ZXN0U3RhdHVzUmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgIHRFcGxTdGF0dXN1Q2JSZXNwb25zZQorCQkJCQkJICBwZm5DYlJlc3BvbnNlX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU1RBVFVTVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFRpbWVydS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFRpbWVydS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDQ5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsVGltZXJ1LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lcnUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxUaW1lci5oIgorI2luY2x1ZGUgIkVwbEV2ZW50dS5oIgorCisjaWZuZGVmIF9FUExUSU1FUlVfSF8KKyNkZWZpbmUgX0VQTFRJTUVSVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVJbml0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydVNldFRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkgICAgICB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydU1vZGlmeVRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCQkgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxldGVUaW1lcih0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCk7CisKK0JPT0wgUFVCTElDIEVwbFRpbWVydUlzVGltZXJBY3RpdmUodEVwbFRpbWVySGRsIFRpbWVySGRsX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMVElNRVJVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYwppbmRleCBhOTVjMjYwLi4zMGVhYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmMKQEAgLTEzNDUsNyArMTM0NSw2IEBACiB7CiAJUE1QX1RDQiBwTXBUY2I7CiAJc3RydWN0IGxpc3RfaGVhZCAqcEVudHJ5OwotCXN0cnVjdCBza19idWZmICpwUGFja2V0ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGxvY2tmbGFnczsKIAl1aW50MzJfdCBGcmVlQ291bnRlciA9IDA7CiAKQEAgLTEzNTgsOCArMTM1Nyw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBZGFwdGVyLT5TZW5kV2FpdExvY2ssIGxvY2tmbGFncyk7CiAKIAkJcEVudHJ5ID0gcEFkYXB0ZXItPlR4UmluZy5TZW5kV2FpdFF1ZXVlLm5leHQ7Ci0KLQkJcFBhY2tldCA9IE5VTEw7CiAJfQogCiAJcEFkYXB0ZXItPlR4UmluZy5uV2FpdFNlbmQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlYnVnLmgKaW5kZXggZGFiNjA4MC4uOTk0MTA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWJ1Zy5oCkBAIC04MiwxMSArODIsMTEgQEAKICNkZWZpbmUgREJHX0xWTAkzCiAjZW5kaWYgLyogREJHX0xWTCAqLwogCi0jZGVmaW5lIERCR19ERUZBVUxUUwkJKERCR19FUlJPUl9PTiB8IERCR19XQVJOSU5HX09OIHwgREJHX0JSRUFLX09OICkKKyNkZWZpbmUgREJHX0RFRkFVTFRTCQkoREJHX0VSUk9SX09OIHwgREJHX1dBUk5JTkdfT04gfCBEQkdfQlJFQUtfT04pCiAKLSNkZWZpbmUgREJHX0ZMQUdTKEEpCQkoQSktPmRiZ0ZsYWdzCi0jZGVmaW5lIERCR19OQU1FKEEpCQkoQSktPmRiZ05hbWUKLSNkZWZpbmUgREJHX0xFVkVMKEEpCQkoQSktPmRiZ0xldmVsCisjZGVmaW5lIERCR19GTEFHUyhBKQkJKChBKS0+ZGJnRmxhZ3MpCisjZGVmaW5lIERCR19OQU1FKEEpCQkoKEEpLT5kYmdOYW1lKQorI2RlZmluZSBEQkdfTEVWRUwoQSkJCSgoQSktPmRiZ0xldmVsKQogCiAjaWZuZGVmIERCR19QUklOVAogI2RlZmluZSBEQkdfUFJJTlQoUy4uLikJCXByaW50ayhLRVJOX0RFQlVHIFMpCkBAIC0xMDgsNTYgKzEwOCwxMTAgQEAKICNkZWZpbmUgX0RCR19MRUFWRShBKQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JS4qczolc1xuIiwgREJHX05BTUUoQSksCVwKIAkJCQlEQkdfTEVWRUwoQSktLSwgX0xFQVZFX1NUUiwgX19mdW5jX18pCiAKLSNkZWZpbmUgREJHX0VOVEVSKEEpICAgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0VOVEVSKEEpO30KKyNkZWZpbmUgREJHX0VOVEVSKEEpCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pCQkJXAorCQkJX0RCR19FTlRFUihBKTsJCQkJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19MRUFWRShBKSAgICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19MRUFWRShBKTt9CisjZGVmaW5lIERCR19MRUFWRShBKQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKQkJCVwKKwkJCV9EQkdfTEVBVkUoQSk7CQkJCQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfUEFSQU0oQSxOLEYsUy4uLikgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19QQVJBTV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSSU5UKCIgICVzIC0tICJGIlxuIixOLFMpO30KKyNkZWZpbmUgREJHX1BBUkFNKEEsIE4sIEYsIFMuLi4pCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1BBUkFNX09OKQkJCVwKKwkJCURCR19QUklOVCgiICAlcyAtLSAiRiIgIiwgTiwgUyk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfRVJST1IoQSxTLi4uKQlcCi0JaWYgKERCR19GTEFHUyhBKSAmIERCR19FUlJPUl9PTikgewkJCQlcCi0JCURCR19QUklOVCgiJXM6RVJST1I6JXMgIixEQkdfTkFNRShBKSwgX19mdW5jX18pOwlcCi0JCURCR19QUklOVEMoUyk7CQkJCQkJXAotCQlEQkdfVFJBUDsJCQkJCQlcCi0JfQorI2RlZmluZSBEQkdfRVJST1IoQSwgUy4uLikJCQkJCQkgXAorCWRvIHsJCQkJCQkJCSBcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfRVJST1JfT04pIHsJCQkgXAorCQkJREJHX1BSSU5UKCIlczpFUlJPUjolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pO1wKKwkJCURCR19QUklOVEMoUyk7CQkJCQkgXAorCQkJREJHX1RSQVA7CQkJCQkgXAorCQl9CQkJCQkJCSBcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfV0FSTklORyhBLFMuLi4pIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1dBUk5JTkdfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6V0FSTklORzolcyAiLERCR19OQU1FKEEpLF9fZnVuY19fKTtEQkdfUFJJTlRDKFMpO319CisjZGVmaW5lIERCR19XQVJOSU5HKEEsIFMuLi4pCQkJCQkJICAgIFwKKwlkbyB7CQkJCQkJCQkgICAgXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1dBUk5JTkdfT04pIHsJCQkgICAgXAorCQkJREJHX1BSSU5UKCIlczpXQVJOSU5HOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7IFwKKwkJCURCR19QUklOVEMoUyk7CQkJCQkgICAgXAorCQl9CQkJCQkJCSAgICBcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfTk9USUNFKEEsUy4uLikgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX05PVElDRV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpOT1RJQ0U6JXMgIixEQkdfTkFNRShBKSxfX2Z1bmNfXyk7REJHX1BSSU5UQyhTKTt9fQorI2RlZmluZSBEQkdfTk9USUNFKEEsIFMuLi4pCQkJCQkJICAgXAorCWRvIHsJCQkJCQkJCSAgIFwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19OT1RJQ0VfT04pIHsJCQkgICBcCisJCQlEQkdfUFJJTlQoIiVzOk5PVElDRTolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCisJCQlEQkdfUFJJTlRDKFMpOwkJCQkJICAgXAorCQl9CQkJCQkJCSAgIFwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19UUkFDRShBLFMuLi4pICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6VFJBQ0U6JXMgIixEQkdfTkFNRShBKSwgX19mdW5jX18pO0RCR19QUklOVEMoUyk7fX0KKyNkZWZpbmUgREJHX1RSQUNFKEEsIFMuLi4pCQkJCQkJICBcCisJZG8gewkJCQkJCQkJICBcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIHsJCQkgIFwKKwkJCURCR19QUklOVCgiJXM6VFJBQ0U6JXMgIiwgREJHX05BTUUoQSksIF9fZnVuY19fKTsgXAorCQkJREJHX1BSSU5UQyhTKTsJCQkJCSAgXAorCQl9CQkJCQkJCSAgXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1ZFUkJPU0UoQSxTLi4uKSB7aWYgKERCR19GTEFHUyhBKSAmIERCR19WRVJCT1NFX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOlZFUkJPU0U6JXMgIixEQkdfTkFNRShBKSwgX19mdW5jX18pO0RCR19QUklOVEMoUyk7fX0KKyNkZWZpbmUgREJHX1ZFUkJPU0UoQSwgUy4uLikJCQkJCQkgICAgXAorCWRvIHsJCQkJCQkJCSAgICBcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVkVSQk9TRV9PTikgewkJCSAgICBcCisJCQlEQkdfUFJJTlQoIiVzOlZFUkJPU0U6JXMgIiwgREJHX05BTUUoQSksIF9fZnVuY19fKTsgXAorCQkJREJHX1BSSU5UQyhTKTsJCQkJCSAgICBcCisJCX0JCQkJCQkJICAgIFwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19SWChBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQorI2RlZmluZSBEQkdfUlgoQSwgUy4uLikJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikJXAorCQkJREJHX1BSSU5UKFMpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1JYX0VOVEVSKEEpICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0VOVEVSKEEpO30KKyNkZWZpbmUgREJHX1JYX0VOVEVSKEEpCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pCVwKKwkJCV9EQkdfRU5URVIoQSk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfUlhfTEVBVkUoQSkgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfTEVBVkUoQSk7fQorI2RlZmluZSBEQkdfUlhfTEVBVkUoQSkJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikJXAorCQkJX0RCR19MRUFWRShBKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19UWChBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQorI2RlZmluZSBEQkdfVFgoQSwgUy4uLikJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikJXAorCQkJREJHX1BSSU5UKFMpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1RYX0VOVEVSKEEpICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0VOVEVSKEEpO30KKyNkZWZpbmUgREJHX1RYX0VOVEVSKEEpCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pCVwKKwkJCV9EQkdfRU5URVIoQSk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfVFhfTEVBVkUoQSkgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfTEVBVkUoQSk7fQorI2RlZmluZSBEQkdfVFhfTEVBVkUoQSkJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikJXAorCQkJX0RCR19MRUFWRShBKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19BU1NFUlQoQykgICAgICAge2lmICghKEMpKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIkFTU0VSVCglcykgLS0gJXMjJWQgKCVzKVxuIiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0MsX19GSUxFX18sX19MSU5FX18sX19mdW5jX18pOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19UUkFQO319CisjZGVmaW5lIERCR19BU1NFUlQoQykJCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmICghKEMpKSB7CQkJCQlcCisJCQlEQkdfUFJJTlQoIkFTU0VSVCglcykgLS0gJXMjJWQgKCVzKSAiLCAgXAorCQkJICAgICAjQywgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKKwkJCURCR19UUkFQOwkJCQlcCisJCX0JCQkJCQlcCisJfSB3aGlsZSAoMCkKKwogI2RlZmluZSBTVEFUSUMKIAogdHlwZWRlZiBzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIxODUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgVFJBTlpQT1JUCisJdHJpc3RhdGUgIkZyb250aWVyIFRyYW56cG9ydCBhbmQgQWxwaGF0cmFjayBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBGcm9udGllciBUcmFuenBvcnQgYW5kIEFscGhhdHJhY2sgZGV2aWNlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJhYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX1RSQU5aUE9SVCkJCSs9IHRyYW56cG9ydC5vCitvYmotJChDT05GSUdfVFJBTlpQT1JUKQkJKz0gYWxwaGF0cmFjay5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M5ZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1JFQURNRQpAQCAtMCwwICsxLDI4IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgVVNCIFRyYW56cG9ydCBhbmQgQWxwaGF0cmFjayBLZXJuZWwgZHJpdmVycyBmb3IgTGludXguCisKK0F0IHByZXNlbnQgdGhlIHRyYW56cG9ydCBkb2VzIHJlYWRzL3dyaXRlcyBvZiA4IGJ5dGUgY21kcyB0byAvZGV2L3RyYW56cG9ydDAgdG8gY29udHJvbAordGhlIGxpZ2h0cyBhbmQgc2NyZWVuIGFuZCB3aGVlbAorCitBdCBwcmVzZW50IHRoZSBhbHBoYXRyYWNrIGFjY2VwdHMgcmVhZHMvd3JpdGVzIG9mIDEyIGJ5dGUgY21kcyB0byAvZGV2L3RyYW56cG9ydDAgdG8gY29udHJvbAordGhlIGxpZ2h0cyBhbmQgc2NyZWVuIGFuZCBmYWRlci4KKworQm90aCBkcml2ZXJzIGFsc28gaGF2ZSBzb21lIHN5c2ZzIGhvb2tzIHRoYXQgYXJlIG5vbi1mdW5jdGlvbmFsIGF0IHRoZSBtb21lbnQuCisKK1RoZSBBUEkgaXMgY3VycmVudGx5IGNsb3NlbHkgdGllZCB0byB0aGUgYXJkb3VyIHJldmlzaW9uIGFuZCBXSUxMIGNoYW5nZS4KKworQSBzeXNmcyBpbnRlcmZhY2UgaXMgUEVSRkVDVCBmb3Igc2ltcGxlIHVzZXJzcGFjZSBhcHBzIHRvIGRvIGZ1biB0aGluZ3Mgd2l0aCB0aGUKK2xpZ2h0cyBhbmQgc2NyZWVuLiBJdCdzIGZhaXJseSBsb3VzeSBmb3IgaGFuZGxpbmcgaW5wdXQgZXZlbnRzIGFuZCB2ZXJ5IGxvdXN5Citmb3Igd2F0Y2hpbmcgdGhlIHN0YXRlIG9mIHRoZSBzaHV0dGxlIHdoZWVsLgorCitBIGxpbnV4IGlucHV0IGV2ZW50cyBpbnRlcmZhY2UgaXMgZ3JlYXQgZm9yIHRoZSBpbnB1dCBldmVudHMgYW5kIHNodXR0bGUgd2hlZWwuIEl0J3MKK3RoZW9yZXRpY2FsbHkgT0sgb24gTEVEcy4gQSBGYWRlciBjYW4gYmUgbWFwcGVkIHRvIGFuIGFic29sdXRlIG1vdXNlIGRldmljZS4KK0J1dCB0aGVyZSBpcyBubyBMQ0Qgc3VwcG9ydCBhdCBhbGwuCisKK0luIHRoZSBlbmQgdGhpcyBpcyBnb2luZyB0byBiZSBkcml2ZW4gYnkgYSBtaWRpIGxheWVyLCB3aGljaCBoYW5kbGVzIGFsbCB0aG9zZQorY2FzZXMgdmlhIGEgZGVmaW5lZCBBUEksIGJ1dCAtIGFtb25nIG90aGVyIHRoaW5ncyAtIGlzIHNsb3csIGRvZXNuJ3QgZG8KK2Zsb3cgY29udHJvbCwgYW5kIGlzIGEgTE9UIG9mIGV4dHJhIHdvcmsuIEZyYW5rbHksIEknZCBsaWtlIHRvIGtlZXAgdGhlCitjb3JlIGRyaXZlciBzaW1wbGUgYmVjYXVzZSB0aGUgb25seSByZWFsdGltZSB3b3JrIHJlYWxseSByZXF1aXJlZCBpcwordGhlIGJvdHRvbSBoYWxmIGludGVycnVwdCBoYW5kbGVyIGFuZCB0aGUgb3V0cHV0IG92ZXJsYXBwaW5nLgorCitFeHBvc2luZyBzb21lIHNvcnQgb2YgY2xlYW4gYWlvIGFwaSB0byB1c2Vyc3BhY2Ugd291bGQgYmUgcGVyZmVjdC4gV2hhdCB0aGF0CitBUEkgbG9va3MgbGlrZT8gR2FoLiBiZWF0cyBtZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyMGFkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9UT0RPCkBAIC0wLDAgKzEsOSBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW4KKwktIHNwYXJzZSBjbGVhbgorCS0gZml4IHVzZXJzcGFjZSBpbnRlcmZhY2UgdG8gYmUgc2FuZQorCS0gcG9zc2libHkganVzdCBwb3J0IHRvIHVzZXJzcGFjZSB3aXRoIGxpYnVzYgorCS0gcmV2aWV3IGJ5IHRoZSBVU0IgZGV2ZWxvcGVyIGNvbW11bml0eQorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBmb3IgdGhpcyBkcml2ZXIgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK2FuZCBEYXZpZCBUYWh0IDxkQHRla2xpYnJlLmNvbT4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQ3YzVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYwpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqIEZyb250aWVyIERlc2lnbnMgQWxwaGF0cmFjayBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBUYWh0IChtQHRhaHQubmV0KQorICoKKyAqIEJhc2VkIG9uIHRoZSB1c2JsZWQgZHJpdmVyIGFuZCBsZHVzYiBkcml2ZXJzIGJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWljaGFlbCBIdW5kIDxtaHVuZEBsZC1kaWRhY3RpYy5kZT4KKyAqCisgKiBUaGUgbGR1c2IgZHJpdmVyIHdhcywgaW4gdHVybiwgZGVyaXZlZCBmcm9tIExlZ28gVVNCIFRvd2VyIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEdsYW5jZSA8YWR2aWRnc2ZAc291cmNlZm9yZ2UubmV0PgorICoJCSAyMDAxLTIwMDQgSnVlcmdlbiBTdHViZXIgPHN0YXJibHVlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKi8KKworLyoqCisgKiBUaGlzIGRyaXZlciB1c2VzIGEgcmluZyBidWZmZXIgZm9yIHRpbWUgY3JpdGljYWwgcmVhZGluZyBvZgorICogaW50ZXJydXB0IGluIHJlcG9ydHMgYW5kIHByb3ZpZGVzIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMgZm9yCisgKiByYXcgaW50ZXJydXB0IHJlcG9ydHMuCisgKi8KKworLyogTm90ZTogdGhpcyBjdXJyZW50bHkgdXNlcyBhIGR1bWIgcmluZ2J1ZmZlciBmb3IgcmVhZHMgYW5kIHdyaXRlcy4KKyAqIEEgbW9yZSBvcHRpbWFsIGRyaXZlciB3b3VsZCBjYWNoZSBhbmQga2lsbCBvZmYgb3V0c3RhbmRpbmcgdXJicyB0aGF0IGFyZQorICogbm93IGludmFsaWQsIGFuZCBpZ25vcmUgb25lcyB0aGF0IGFscmVhZHkgd2VyZSBpbiB0aGUgcXVldWUgYnV0IHZhbGlkCisgKiBhcyB3ZSBvbmx5IGhhdmUgMzAgY29tbWFuZHMgZm9yIHRoZSBhbHBoYXRyYWNrLiBJbiBwYXJ0aWN1bGFyIHRoaXMgaXMKKyAqIGtleSBmb3IgZ2V0dGluZyBsaWdodHMgdG8gZmxhc2ggaW4gdGltZSBhcyBvdGhlcndpc2UgbWFueSBjb21tYW5kcworICogY2FuIGJlIGJ1ZmZlcmVkIHVwIGJlZm9yZSB0aGUgbGlnaHQgY2hhbmdlIG1ha2VzIGl0IHRvIHRoZSBpbnRlcmZhY2UuCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKKyNpbmNsdWRlICJzdXJmYWNlX3N5c2ZzLmgiCisKKy8qIG1ha2UgdGhpcyB3b3JrIG9uIG9sZGVyIGtlcm5lbCB2ZXJzaW9ucyAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisjaW5jbHVkZSAiZnJvbnRpZXJfY29tcGF0LmgiCisjZW5kaWYgLyogb2xkZXIga2VybmVsIHZlcnNpb25zICovCisKKyNpbmNsdWRlICJhbHBoYXRyYWNrLmgiCisKKyNkZWZpbmUgVkVORE9SX0lECTB4MTY1YgorI2RlZmluZSBQUk9EVUNUX0lECTB4ZmFkMQorCisjaWZkZWYgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUworI2RlZmluZSBVU0JfQUxQSEFUUkFDS19NSU5PUl9CQVNFCTAKKyNlbHNlCisvLyBGSVhNRSAxNzYgLSBpcyBhbm90aGVyIGRyaXZlcidzIG1pbm9yIC0gYXBwbHkgZm9yIHRoYXQKKy8vICNkZWZpbmUgVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRQkxNzcKKyNkZWZpbmUgVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRQkxNzYKKyNlbmRpZgorCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX2FscGhhdHJhY2tfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKFZFTkRPUl9JRCwgUFJPRFVDVF9JRCkgfSwKKwl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX2FscGhhdHJhY2tfdGFibGUpOworTU9EVUxFX1ZFUlNJT04oIjAuNDAiKTsKK01PRFVMRV9BVVRIT1IoIk1pa2UgVGFodCA8bUB0YWh0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWxwaGF0cmFjayBVU0IgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiRnJvbnRpZXIgRGVzaWducyBBbHBoYXRyYWNrIENvbnRyb2wgU3VyZmFjZSIpOworCisvKiBUaGVzZSBhcmVuJ3QgZG9uZSB5ZXQgKi8KKworI2RlZmluZSBTVVBQUkVTU19FWFRSQV9PTkxJTkVfRVZFTlRTIDAKKyNkZWZpbmUgQlVGRkVSRURfV1JJVEVTIDAKKyNkZWZpbmUgU1VQUFJFU1NfRVhUUkFfT0ZGTElORV9FVkVOVFMgMAorI2RlZmluZSBDT01QUkVTU19GQURFUl9FVkVOVFMgMAorCisjZGVmaW5lIEJVRkZFUkVEX1JFQURTIDEKKyNkZWZpbmUgUklOR19CVUZGRVJfU0laRSA1MTIKKyNkZWZpbmUgV1JJVEVfQlVGRkVSX1NJWkUgMzQKKyNkZWZpbmUgQUxQSEFUUkFDS19VU0JfVElNRU9VVCAxMAorI2RlZmluZSBPVVRQVVRfQ01EX1NJWkUgOAorI2RlZmluZSBJTlBVVF9DTURfU0laRSAxMgorCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworCisvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KKyNkZWZpbmUgZGJnX2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIGRldl9pbmZvKGRldiAsIGZvcm1hdCAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgYWxwaGF0cmFja19vY21kX2luZm8oZGV2LCBjbWQsIGZvcm1hdCwgYXJnLi4uKQorCisjZGVmaW5lIGFscGhhdHJhY2tfaWNtZF9pbmZvKGRldiwgY21kLCBmb3JtYXQsIGFyZy4uLikKKworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKKy8qIEFsbCBpbnRlcnJ1cHQgaW4gdHJhbnNmZXJzIGFyZSBjb2xsZWN0ZWQgaW4gYSByaW5nIGJ1ZmZlciB0bworICogYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMgYW5kIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2Ugb2YgdGhlIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IHJpbmdfYnVmZmVyX3NpemUgPSBSSU5HX0JVRkZFUl9TSVpFOworCittb2R1bGVfcGFyYW0ocmluZ19idWZmZXJfc2l6ZSwgaW50LCAgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJpbmdfYnVmZmVyX3NpemUsICJSZWFkIHJpbmcgYnVmZmVyIHNpemUiKTsKKworLyogVGhlIHdyaXRlX2J1ZmZlciBjYW4gb25lIGRheSBjb250YWluIG1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IG91dCB0cmFuc2Zlci4KKyAqLworCitzdGF0aWMgaW50IHdyaXRlX2J1ZmZlcl9zaXplID0gV1JJVEVfQlVGRkVSX1NJWkU7Cittb2R1bGVfcGFyYW0od3JpdGVfYnVmZmVyX3NpemUsIGludCwgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh3cml0ZV9idWZmZXJfc2l6ZSwgIldyaXRlIGJ1ZmZlciBzaXplIik7CisKKy8qCisgKiBJbmNyZWFzZSB0aGUgaW50ZXJ2YWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqIG9yIHNldCB0byAxIHRvIHVzZSB0aGUgc3RhbmRhcmQgaW50ZXJ2YWwgZnJvbSB0aGUgZW5kcG9pbnQgZGVzY3JpcHRvcnMuCisgKi8KKworc3RhdGljIGludCBtaW5faW50ZXJydXB0X2luX2ludGVydmFsID0gQUxQSEFUUkFDS19VU0JfVElNRU9VVDsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgaW4gaW50ZXJ2YWwgaW4gbXMiKTsKKworc3RhdGljIGludCBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA9IEFMUEhBVFJBQ0tfVVNCX1RJTUVPVVQ7Cittb2R1bGVfcGFyYW0obWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgb3V0IGludGVydmFsIGluIG1zIik7CisKKworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZiAqLworCitzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgeworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogbG9ja3MgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSoJaW50ZjsJCS8qIHNhdmUgb2ZmIHRoZSB1c2IgaW50ZXJmYWNlIHBvaW50ZXIgKi8KKwlpbnQJCQlvcGVuX2NvdW50OwkvKiBudW1iZXIgb2YgdGltZXMgdGhpcyBwb3J0IGhhcyBiZWVuIG9wZW5lZCAqLworCisJc3RydWN0IGFscGhhdHJhY2tfaWNtZAkoKnJpbmdfYnVmZmVyKVtSSU5HX0JVRkZFUl9TSVpFXTsgLyoganVzdCBtYWtlIGMgaGFwcHkgKi8KKwlzdHJ1Y3QgYWxwaGF0cmFja19vY21kCSgqd3JpdGVfYnVmZmVyKVtXUklURV9CVUZGRVJfU0laRV07IC8qIGp1c3QgbWFrZSBjIGhhcHB5ICovCisJdW5zaWduZWQgaW50CQlyaW5nX2hlYWQ7CisJdW5zaWduZWQgaW50CQlyaW5nX3RhaWw7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdAlyZWFkX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd3JpdGVfd2FpdDsKKworCXVuc2lnbmVkIGNoYXIqCQlpbnRlcnJ1cHRfaW5fYnVmZmVyOworCXVuc2lnbmVkIGNoYXIqCQlvbGRpX2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9pbl9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJaW50ZXJydXB0X2luX3VyYjsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5faW50ZXJ2YWw7CisJc2l6ZV90CQkJaW50ZXJydXB0X2luX2VuZHBvaW50X3NpemU7CisJaW50CQkJaW50ZXJydXB0X2luX3J1bm5pbmc7CisJaW50CQkJaW50ZXJydXB0X2luX2RvbmU7CisKKwljaGFyKgkJCWludGVycnVwdF9vdXRfYnVmZmVyOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW50ZXJydXB0X291dF9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJaW50ZXJydXB0X291dF91cmI7CisJaW50CQkJaW50ZXJydXB0X291dF9pbnRlcnZhbDsKKwlzaXplX3QJCQlpbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemU7CisJaW50CQkJaW50ZXJydXB0X291dF9idXN5OworCisJYXRvbWljX3Qgd3JpdGVzX3BlbmRpbmc7CisJaW50IGV2ZW50OyAvKiBhbHRlcm5hdGUgaW50ZXJmYWNlIHRvIGV2ZW50cyAqLworCWludCBmYWRlcjsgLyogMTAgYml0cyAqLworCWludCBsaWdodHM7IC8qIDIzIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyIGR1bXBfc3RhdGU7IC8qIDAgaWYgZGlzYWJsZWQgMSBpZiBlbmFibGVkICovCisJdW5zaWduZWQgY2hhciBlbmFibGU7IC8qIDAgaWYgZGlzYWJsZWQgMSBpZiBlbmFibGVkICovCisJdW5zaWduZWQgY2hhciBvZmZsaW5lOyAvKiBpZiB0aGUgZGV2aWNlIGlzIG91dCBvZiByYW5nZSBvciBhc2xlZXAgKi8KKwl1bnNpZ25lZCBjaGFyIHZlcmJvc2U7IC8qIGJlIHZlcmJvc2UgaW4gZXJyb3IgcmVwb3J0aW5nICovCisJdW5zaWduZWQgY2hhciAgbGFzdF9jbWRbT1VUUFVUX0NNRF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyICBzY3JlZW5bMzJdOworfTsKKworLyogcHJldmVudCByYWNlcyBiZXR3ZWVuIG9wZW4oKSBhbmQgZGlzY29ubmVjdCgpICovCitzdGF0aWMgREVGSU5FX01VVEVYKGRpc2Nvbm5lY3RfbXV0ZXgpOworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfYWxwaGF0cmFja19kcml2ZXI7CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfYWJvcnRfdHJhbnNmZXJzCisgKiAgICAgIGFib3J0cyB0cmFuc2ZlcnMgYW5kIGZyZWVzIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyB2b2lkIHVzYl9hbHBoYXRyYWNrX2Fib3J0X3RyYW5zZmVycyhzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldikKK3sKKwkvKiBzaHV0ZG93biB0cmFuc2ZlciAqLworCWlmIChkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nKSB7CisJCWRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgPSAwOworCQlpZiAoZGV2LT5pbnRmKQorCQkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJaWYgKGRldi0+aW50ZikKKwkJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19kZWxldGUKKyAqLworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfZGVsZXRlKHN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2KQoreworCXVzYl9hbHBoYXRyYWNrX2Fib3J0X3RyYW5zZmVycyhkZXYpOworCXVzYl9mcmVlX3VyYihkZXYtPmludGVycnVwdF9pbl91cmIpOworCXVzYl9mcmVlX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKKwlrZnJlZShkZXYtPnJpbmdfYnVmZmVyKTsKKwlrZnJlZShkZXYtPmludGVycnVwdF9pbl9idWZmZXIpOworCWtmcmVlKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIpOworCWtmcmVlKGRldik7IC8vIGZpeG1lIG9sZGlfYnVmZmVyCit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X2luX2NhbGxiYWNrCisgKi8KKworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X2luX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldiA9IHVyYi0+Y29udGV4dDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9yaW5nX2hlYWQ7CisJaW50IHJldHZhbCA9IC0xOworCisJaWYgKHVyYi0+c3RhdHVzKSB7CisJCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikgeworCQkJZ290byBleGl0OworCQl9IGVsc2UgeworCQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IG5vbnplcm8gc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKKwkJCQkgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQlnb3RvIHJlc3VibWl0OyAvKiBtYXliZSB3ZSBjYW4gcmVjb3ZlciAqLworCQl9CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSBJTlBVVF9DTURfU0laRSkgeworCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCisJCQkgIlVyYiBsZW5ndGggd2FzICVkIGJ5dGVzISEgRG8gc29tZXRoaW5nIGludGVsbGlnZW50IFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQkgYWxwaGF0cmFja19vY21kX2luZm8oJmRldi0+aW50Zi0+ZGV2LCYoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWQsIiVzIiwgImJsYSIpOworCQkgaWYobWVtY21wKGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcixkZXYtPm9sZGlfYnVmZmVyLElOUFVUX0NNRF9TSVpFKT09MCkgeworCQkJCQkJZ290byByZXN1Ym1pdDsKKwkJfQorCQltZW1jcHkoZGV2LT5vbGRpX2J1ZmZlcixkZXYtPmludGVycnVwdF9pbl9idWZmZXIsSU5QVVRfQ01EX1NJWkUpOworCisjaWYgU1VQUFJFU1NfRVhUUkFfT0ZGTElORV9FVkVOVFMKKwlpZihkZXYtPm9mZmxpbmUgPT0gMiAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBnb3RvIHJlc3VibWl0OyB9CisJCWlmKGRldi0+b2ZmbGluZSA9PSAxICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDI7IGdvdG8gcmVzdWJtaXQ7IH0KKy8qIEFsd2F5cyBwYXNzIG9uZSBvZmZsaW5lIGV2ZW50IHVwIHRoZSBzdGFjayAqLworCQlpZihkZXYtPm9mZmxpbmUgPiAwICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSAhPSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDA7IH0KKwkJaWYoZGV2LT5vZmZsaW5lID09IDAgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdID09IDB4ZmYpIHsgZGV2LT5vZmZsaW5lID0gMTsgfQorI2VuZGlmCisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fRlVOQ1RJT05fXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CisJCW5leHRfcmluZ19oZWFkID0gKGRldi0+cmluZ19oZWFkKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKworCQlpZiAobmV4dF9yaW5nX2hlYWQgIT0gZGV2LT5yaW5nX3RhaWwpIHsKKwkJCW1lbWNweSgmKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX2hlYWRdKSwKKwkJCQkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlkZXYtPnJpbmdfaGVhZCA9IG5leHRfcmluZ19oZWFkOworCQkJcmV0dmFsID0gMDsKKwkJCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIDAsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCisJCQkJICJSaW5nIGJ1ZmZlciBvdmVyZmxvdywgJWQgYnl0ZXMgZHJvcHBlZFxuIiwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIDAsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0KKwl9CisKK3Jlc3VibWl0OgorCS8qIHJlc3VibWl0IGlmIHdlJ3JlIHN0aWxsIHJ1bm5pbmcgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyAmJiBkZXYtPmludGYpIHsKKwkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+aW50Zi0+ZGV2LAorCQkJCSJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKK2V4aXQ6CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X291dF9jYWxsYmFjaworICovCitzdGF0aWMgdm9pZCB1c2JfYWxwaGF0cmFja19pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldiA9IHVyYi0+Y29udGV4dDsKKworCS8qIHN5bmMvYXN5bmMgdW5saW5rIGZhdWx0cyBhcmVuJ3QgZXJyb3JzICovCisJaWYgKHVyYi0+c3RhdHVzICYmICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAorCQkJICAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkJICAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LAorCQkJICIlcyAtIG5vbnplcm8gd3JpdGUgaW50ZXJydXB0IHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCisJCQkgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJYXRvbWljX2RlYygmZGV2LT53cml0ZXNfcGVuZGluZyk7CisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19vcGVuCisgKi8KK3N0YXRpYyBpbnQgdXNiX2FscGhhdHJhY2tfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwlpbnQgc3VibWlub3I7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCXN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZ1c2JfYWxwaGF0cmFja19kcml2ZXIsIHN1Ym1pbm9yKTsKKworCWlmICghaW50ZXJmYWNlKSB7CisJCWVycigiJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkXG4iLAorCQkgICAgIF9fRlVOQ1RJT05fXywgc3VibWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCisJaWYgKCFkZXYpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCS8qIGxvY2sgdGhpcyBkZXZpY2UgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJLyogYWxsb3cgb3BlbmluZyBvbmx5IG9uY2UgKi8KKwlpZiAoZGV2LT5vcGVuX2NvdW50KSB7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisJZGV2LT5vcGVuX2NvdW50ID0gMTsKKworCS8qIGluaXRpYWxpemUgaW4gZGlyZWN0aW9uICovCisJZGV2LT5yaW5nX2hlYWQgPSAwOworCWRldi0+cmluZ190YWlsID0gMDsKKwl1c2JfZmlsbF9pbnRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwKKwkJCSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSksCisJCQkgdXNiX3JjdmludHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLAorCQkJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLAorCQkJIGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUsCisJCQkgdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X2luX2NhbGxiYWNrLAorCQkJIGRldiwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCk7CisKKwlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMTsKKwlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMDsKKwlkZXYtPmVuYWJsZSA9IDE7CisJZGV2LT5vZmZsaW5lID0gMDsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IHN1Ym1pdCBpbnRlcnJ1cHRfaW5fdXJiICVkXG4iLCByZXR2YWwpOworCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKKwkJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzYXZlIGRldmljZSBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OworCisKK3VubG9ja19leGl0OgorCXVwKCZkZXYtPnNlbSk7CisKK3VubG9ja19kaXNjb25uZWN0X2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfcmVsZWFzZQorICovCitzdGF0aWMgaW50IHVzYl9hbHBoYXRyYWNrX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXY7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5vcGVuX2NvdW50ICE9IDEpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJLyogdGhlIGRldmljZSB3YXMgdW5wbHVnZ2VkIGJlZm9yZSB0aGUgZmlsZSB3YXMgcmVsZWFzZWQgKi8KKwkJdXAoJmRldi0+c2VtKTsKKwkJLyogdW5sb2NrIGhlcmUgYXMgdXNiX2FscGhhdHJhY2tfZGVsZXRlIGZyZWVzIGRldiAqLworCQl1c2JfYWxwaGF0cmFja19kZWxldGUoZGV2KTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCS8qIHdhaXQgdW50aWwgd3JpdGUgdHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+d3JpdGVfd2FpdCwgIWRldi0+aW50ZXJydXB0X291dF9idXN5LCAyICogSFopOworCXVzYl9hbHBoYXRyYWNrX2Fib3J0X3RyYW5zZmVycyhkZXYpOworCWRldi0+b3Blbl9jb3VudCA9IDA7CisKK3VubG9ja19leGl0OgorCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19wb2xsCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNiX2FscGhhdHJhY2tfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+cmVhZF93YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+d3JpdGVfd2FpdCwgd2FpdCk7CisKKwlpZiAoZGV2LT5yaW5nX2hlYWQgIT0gZGV2LT5yaW5nX3RhaWwpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfcmVhZAorICovCitzdGF0aWMgc3NpemVfdCB1c2JfYWxwaGF0cmFja19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsCisJCQkgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXY7CisJaW50IHJldHZhbCA9IDA7CisKKwlpbnQgYyA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgZGF0YSB0byByZWFkICovCisJaWYgKGNvdW50ID09IDApCisJCWdvdG8gZXhpdDsKKworCS8qIGxvY2sgdGhpcyBvYmplY3QgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCisJaWYgKGRldi0+aW50ZiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWVycigiTm8gZGV2aWNlIG9yIGRldmljZSB1bnBsdWdnZWQgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJd2hpbGUgKGRldi0+cmluZ19oZWFkID09IGRldi0+cmluZ190YWlsKSB7CisJCQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCQkJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCQkJCQkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCQkJCX0KKwkJCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDAgOworCQkJCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT5yZWFkX3dhaXQsIGRldi0+aW50ZXJydXB0X2luX2RvbmUpOworCQkJCQlpZiAocmV0dmFsIDwgMCkgeworCQkJCQkJCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJCQkJfQorCX0KKworCWFscGhhdHJhY2tfb2NtZF9pbmZvKCZkZXYtPmludGYtPmRldiwgJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZCwgIiVzIiwgIjogY29weWluZyB0byB1c2Vyc3BhY2UiKTsKKworCSAgIGMgPSAwOworCSAgIHdoaWxlKChjIDwgY291bnQpICYmIChkZXYtPnJpbmdfdGFpbCAhPSBkZXYtPnJpbmdfaGVhZCkpIHsKKwkJCQkJCSBpZiAoY29weV90b191c2VyKCZidWZmZXJbY10sICYoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXSwgSU5QVVRfQ01EX1NJWkUpKSB7CisJCQkJCQkJCQkJIHJldHZhbCA9IC1FRkFVTFQ7CisJCQkJCQkJCQkJIGdvdG8gdW5sb2NrX2V4aXQ7CisJCQkJCQkgfQorCQkJCQkJIGRldi0+cmluZ190YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwkJCQkJCSBjKz1JTlBVVF9DTURfU0laRTsKKwkJCQkJCSBkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX0ZVTkNUSU9OX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOworCSAgIH0KKwkgICByZXR2YWwgPSBjOworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja193cml0ZQorICovCitzdGF0aWMgc3NpemVfdCB1c2JfYWxwaGF0cmFja193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwlzaXplX3QgYnl0ZXNfdG9fd3JpdGU7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgZGF0YSB0byB3cml0ZSAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCS8qIHdhaXQgdW50aWwgcHJldmlvdXMgdHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCX0KKworCS8qIHdyaXRlIHRoZSBkYXRhIGludG8gaW50ZXJydXB0X291dF9idWZmZXIgZnJvbSB1c2Vyc3BhY2UgKi8KKyAgLyogRklYTUUgLSBpZiB5b3Ugd3JpdGUgbW9yZSB0aGFuIDEyIGJ5dGVzIHRoaXMgYnJlYWtzICovCisJYnl0ZXNfdG9fd3JpdGUgPSBtaW4oY291bnQsIHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplKTsKKwlpZiAoYnl0ZXNfdG9fd3JpdGUgPCBjb3VudCkKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7CisKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlemQsIGJ5dGVzX3RvX3dyaXRlID0gJXpkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpIHsKKwkJZXJyKCJFbmRwb2ludCBzaG91bGQgbm90IGJlIGJlIG51bGwhIFxuIik7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2VuZCBvZmYgdGhlIHVyYiAqLworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiwKKwkJCSBpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkgdXNiX3NuZGludHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLAorCQkJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsCisJCQkgYnl0ZXNfdG9fd3JpdGUsCisJCQkgdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X291dF9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsKTsKKwlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDE7CisJYXRvbWljX2luYygmZGV2LT53cml0ZXNfcGVuZGluZyk7CisJd21iKCk7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKKwkJZXJyKCJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X291dF91cmIgJWRcbiIsIHJldHZhbCk7CisJCWF0b21pY19kZWMoJmRldi0+d3JpdGVzX3BlbmRpbmcpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlyZXR2YWwgPSBieXRlc190b193cml0ZTsKKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIGZpbGUgb3BlcmF0aW9ucyBuZWVkZWQgd2hlbiB3ZSByZWdpc3RlciB0aGlzIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX2FscGhhdHJhY2tfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVhZCAgPQl1c2JfYWxwaGF0cmFja19yZWFkLAorCS53cml0ZSA9CXVzYl9hbHBoYXRyYWNrX3dyaXRlLAorCS5vcGVuID0JCXVzYl9hbHBoYXRyYWNrX29wZW4sCisJLnJlbGVhc2UgPQl1c2JfYWxwaGF0cmFja19yZWxlYXNlLAorCS5wb2xsID0JCXVzYl9hbHBoYXRyYWNrX3BvbGwsCit9OworCisvKgorICogdXNiIGNsYXNzIGRyaXZlciBpbmZvIGluIG9yZGVyIHRvIGdldCBhIG1pbm9yIG51bWJlciBmcm9tIHRoZSB1c2IgY29yZSwKKyAqIGFuZCB0byBoYXZlIHRoZSBkZXZpY2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkcml2ZXIgY29yZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciB1c2JfYWxwaGF0cmFja19jbGFzcyA9IHsKKwkubmFtZSA9CQkiYWxwaGF0cmFjayVkIiwKKwkuZm9wcyA9CQkmdXNiX2FscGhhdHJhY2tfZm9wcywKKwkubWlub3JfYmFzZSA9CVVTQl9BTFBIQVRSQUNLX01JTk9SX0JBU0UsCit9OworCisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfcHJvYmUKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0aGF0IGl0IHRoaW5rcworICoJdGhpcyBkcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbi4KKyAqLworc3RhdGljIGludCB1c2JfYWxwaGF0cmFja19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCBpOworCWludCB0cnVlX3NpemU7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGludGlhbGl6ZSBpdCAqLworCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBleGl0OworCX0KKwlpbml0X01VVEVYKCZkZXYtPnNlbSk7CisJZGV2LT5pbnRmID0gaW50ZjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnJlYWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cml0ZV93YWl0KTsKKworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCisJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9IGVuZHBvaW50OworCisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpCisJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPSBlbmRwb2ludDsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IGluIGVuZHBvaW50IG5vdCBmb3VuZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kICh1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKKworCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgPSBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCisJaWYgKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgIT0gNjQpCisJICAgIGRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgc2l6ZSBpcyBub3QgNjQhXG4iKTsKKworCWlmKHJpbmdfYnVmZmVyX3NpemUgPT0gMCkgeyByaW5nX2J1ZmZlcl9zaXplID0gUklOR19CVUZGRVJfU0laRTsgfQorCisJdHJ1ZV9zaXplID0gbWluKHJpbmdfYnVmZmVyX3NpemUsUklOR19CVUZGRVJfU0laRSk7CisKKwkvKiBGSVhNRSAtIHRoZXJlIGFyZSBtb3JlIHVzYl9hbGxvYyByb3V0aW5lcyBmb3IgZG1hIGNvcnJlY3RuZXNzLiBOZWVkZWQ/ICovCisKKy8vCWRldi0+cmluZ19idWZmZXIgPSBrbWFsbG9jKCh0cnVlX3NpemUqc2l6ZW9mKHN0cnVjdCBhbHBoYXRyYWNrX2ljbWQpKSsxMiwgR0ZQX0tFUk5FTCk7CisJZGV2LT5yaW5nX2J1ZmZlciA9IGttYWxsb2MoKHRydWVfc2l6ZSpzaXplb2Yoc3RydWN0IGFscGhhdHJhY2tfaWNtZCkpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT5yaW5nX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnB1dCByaW5nX2J1ZmZlciBvZiBzaXplICVkXG4iLHRydWVfc2l6ZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyID0ga21hbGxvYyhkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPm9sZGlfYnVmZmVyID0ga21hbGxvYyhkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+b2xkaV9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgb2xkIGJ1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUgPSBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPyBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA6CisJCQkJCQkJCQkgdWRldi0+ZGVzY3JpcHRvci5iTWF4UGFja2V0U2l6ZTA7CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUgIT02NCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgc2l6ZSBpcyBub3QgNjQhKVxuIik7CisKKwlpZih3cml0ZV9idWZmZXJfc2l6ZSA9PSAwKSB7IHdyaXRlX2J1ZmZlcl9zaXplID0gV1JJVEVfQlVGRkVSX1NJWkU7IH0KKwl0cnVlX3NpemUgPSBtaW4od3JpdGVfYnVmZmVyX3NpemUsV1JJVEVfQlVGRkVSX1NJWkUpOworCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciA9IGttYWxsb2ModHJ1ZV9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT53cml0ZV9idWZmZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWxwaGF0cmFja19vY21kKSp0cnVlX3NpemUsIEdGUF9LRVJORUwpOworCisJaWYgKCFkZXYtPndyaXRlX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSB3cml0ZV9idWZmZXIgXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPmludGVycnVwdF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF91cmJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWw7CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCkKKwkJZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWw7CisKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkZXYpOworCisJYXRvbWljX3NldCgmZGV2LT53cml0ZXNfcGVuZGluZywwKTsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KGludGYsICZ1c2JfYWxwaGF0cmFja19jbGFzcyk7CisJaWYgKHJldHZhbCkgeworCQkvKiBzb21ldGhpbmcgcHJldmVudGVkIHVzIGZyb20gcmVnaXN0ZXJpbmcgdGhpcyBkcml2ZXIgKi8KKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLlxuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJBbHBoYXRyYWNrIERldmljZSAjJWQgbm93IGF0dGFjaGVkIHRvIG1ham9yICVkIG1pbm9yICVkXG4iLAorCQkoaW50Zi0+bWlub3IgLSBVU0JfQUxQSEFUUkFDS19NSU5PUl9CQVNFKSwgVVNCX01BSk9SLCBpbnRmLT5taW5vcik7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKKworZXJyb3I6CisJdXNiX2FscGhhdHJhY2tfZGVsZXRlKGRldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2Rpc2Nvbm5lY3QKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwlpbnQgbWlub3I7CisKKwltdXRleF9sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKworCWRvd24oJmRldi0+c2VtKTsKKworCW1pbm9yID0gaW50Zi0+bWlub3I7CisKKwkvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCisJdXNiX2RlcmVnaXN0ZXJfZGV2KGludGYsICZ1c2JfYWxwaGF0cmFja19jbGFzcyk7CisKKwkvKiBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvcGVuZWQsIHRoZW4gd2UgY2xlYW4gdXAgcmlnaHQgbm93ICovCisJaWYgKCFkZXYtPm9wZW5fY291bnQpIHsKKwkJdXAoJmRldi0+c2VtKTsKKwkJdXNiX2FscGhhdHJhY2tfZGVsZXRlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2LT5pbnRmID0gTlVMTDsKKwkJdXAoJmRldi0+c2VtKTsKKwl9CisKKwlhdG9taWNfc2V0KCZkZXYtPndyaXRlc19wZW5kaW5nLDApOworCW11dGV4X3VubG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiQWxwaGF0cmFjayBTdXJmYWNlICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLAorCQkgKG1pbm9yIC0gVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRSkpOworfQorCisvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX2FscGhhdHJhY2tfZHJpdmVyID0geworCS5uYW1lID0JCSJhbHBoYXRyYWNrIiwKKwkucHJvYmUgPQl1c2JfYWxwaGF0cmFja19wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9hbHBoYXRyYWNrX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JdXNiX2FscGhhdHJhY2tfdGFibGUsCit9OworCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2luaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgdXNiX2FscGhhdHJhY2tfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2JfYWxwaGF0cmFja19kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZCBmb3IgdGhlICJfX0ZJTEVfXyIgZHJpdmVyLiBFcnJvciBudW1iZXIgJWRcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHVzYl9hbHBoYXRyYWNrX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmdXNiX2FscGhhdHJhY2tfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodXNiX2FscGhhdHJhY2tfaW5pdCk7Cittb2R1bGVfZXhpdCh1c2JfYWxwaGF0cmFja19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjOTBhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmgKQEAgLTAsMCArMSw5MiBAQAorI2RlZmluZSBzaG93X3NldF9iaXQoYSkgc2hvd19zZXRfbWJpdChhbHBoYXRyYWNrLGEpCisjZGVmaW5lIHNob3dfc2V0X2NtZChhKSBzaG93X3NldF9tY21kKGFscGhhdHJhY2ssYSkKKyNkZWZpbmUgc2hvd19zZXRfaW50KGEpIHNob3dfc2V0X21pbnQoYWxwaGF0cmFjayxhKQorI2RlZmluZSBzaG93X3NldF9jaGFyKGEpIHNob3dfc2V0X21jaGFyKGFscGhhdHJhY2ssYSkKKyNkZWZpbmUgc2hvd19zZXRfbGlnaHQoYSkgc2hvd19zZXRfZWJpdChhbHBoYXRyYWNrLExpZ2h0SUQsbGlnaHRzLGEpCisjZGVmaW5lIHNob3dfc2V0X2J1dHRvbihhKSBzaG93X3NldF9lYml0KGFscGhhdHJhY2ssQnV0dG9uSUQsYnV0dG9uLGEpCisKK3N0cnVjdCBhbHBoYXRyYWNrX2ljbWQgeworICAgIHVuc2lnbmVkIGNoYXIgY21kWzEyXTsKK307CisKK3N0cnVjdCBhbHBoYXRyYWNrX29jbWQgeworICAgIHVuc2lnbmVkIGNoYXIgY21kWzhdOworfTsKKworZW51bSBMaWdodElEIHsKKyAgICAgICAgTElHSFRfRVEgPSAwLAorICAgICAgICBMSUdIVF9PVVQsCisgICAgICAgIExJR0hUX0YyLAorICAgICAgICBMSUdIVF9TRU5ELAorICAgICAgICBMSUdIVF9JTiwKKyAgICAgICAgTElHSFRfRjEsCisgICAgICAgIExJR0hUX1BBTiwKKyAgICAgICAgTElHSFRfVU5ERUYxLAorICAgICAgICBMSUdIVF9VTkRFRjIsCisgICAgICAgIExJR0hUX1NISUZULAorICAgICAgICBMSUdIVF9UUkFDS01VVEUsCisgICAgICAgIExJR0hUX1RSQUNLU09MTywKKyAgICAgICAgTElHSFRfVFJBQ0tSRUMsCisgICAgICAgIExJR0hUX1JFQUQsCisgICAgICAgIExJR0hUX1dSSVRFLAorICAgICAgICBMSUdIVF9BTllTT0xPLAorICAgICAgICBMSUdIVF9BVVRPLAorICAgICAgICBMSUdIVF9GNCwKKyAgICAgICAgTElHSFRfUkVDT1JELAorICAgICAgICBMSUdIVF9XSU5ET1csCisgICAgICAgIExJR0hUX1BMVUdJTiwKKyAgICAgICAgTElHSFRfRjMsCisgICAgICAgIExJR0hUX0xPT1AKK307CisKKyNkZWZpbmUgQlVUVE9OTUFTS19CQVRURVJZICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfQkFDS0xJR0hUICAgMHgwMDAwODAwMAorI2RlZmluZSBCVVRUT05NQVNLX0ZBU1RGT1JXQVJEIDB4MDQwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UUkFDS01VVEUgICAweDAwMDQwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfVFJBQ0tTT0xPICAgMHgwMDgwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1RSQUNLTEVGVCAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19SRUNPUkQgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfU0hJRlQgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1BVTkNIICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UUkFDS1JJR0hUICAweDAwMDIwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfUkVXSU5EICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1NUT1AgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19MT09QICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfVFJBQ0tSRUMgICAgMHgwMDAwMTAwMAorI2RlZmluZSBCVVRUT05NQVNLX1BMQVkgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UT1VDSDEgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEJVVFRPTk1BU0tfVE9VQ0gyICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBCVVRUT05NQVNLX1RPVUNIMyAgICAgIDB4MDAwMDAwMjAKKworI2RlZmluZSBCVVRUT05NQVNLX1BSRVNTMSAgICAgIDB4MDAwMDAwMDkKKyNkZWZpbmUgQlVUVE9OTUFTS19QUkVTUzIgICAgICAweDAwMDA4MDEwCisjZGVmaW5lIEJVVFRPTk1BU0tfUFJFU1MzICAgICAgMHgwMDAwMjAyMAorCisvLyBsYXN0IDMgYnl0ZXMgYXJlIHRoZSBzbGlkZXIgcG9zaXRpb24KKy8vIDQwIGlzIHRoZSBhY3R1YWwgc2xpZGVyIG1vdmluZywgdGhlIG1vc3Qgc2lnIGJpdHMsIGFuZCAzIGxzYgorCisjZGVmaW5lIEJVVFRPTk1BU0tfRkxJUCAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19GMSAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX0YyICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfRjMgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19GNCAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1BBTiAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEJVVFRPTk1BU0tfU0VORCAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQlVUVE9OTUFTS19FUSAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1BMVUdJTiAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfQVVUTyAgICAgICAgIDB4MDAwMDAxMDAKKworCisvLyAjZGVmaW5lIEJVVFRPTk1BU0tfRk9PVFNXSVRDSCBGSVhNRQorCisvLyBMb29rdXAuIG5hbWUuIG1pZGkgb3V0LiBtaWRpIGluLgorCitzdHJ1Y3QgYnV0dG9ubWFwX3QgeworCXUzMiBtYXNrOworCXNob3J0IG1pZGlfaW47CisJc2hvcnQgbWlkaV9vdXQ7CisJY2hhciAqbmFtZTsKKy8vICAJdm9pZCAoKmZ1bmN0aW9uKSAoYnV0dG9ubWFwX3QgKik7CisgIAl2b2lkICgqZnVuY3Rpb24pICh2b2lkKTsKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9mcm9udGllcl9jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9mcm9udGllcl9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQ1MGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2Zyb250aWVyX2NvbXBhdC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIFVTQiBkZWZpbmVzIGZvciBvbGRlciBrZXJuZWxzICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKKworLyoqCisgKiB1c2JfZW5kcG9pbnRfZGlyX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgT1VUIGRpcmVjdGlvbgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBPVVQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9kaXJfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworICAgICAgIHJldHVybiAoKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfZGlyX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworICAgICAgIHJldHVybiAoKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTik7Cit9CisKKworLyoqCisgKiB1c2JfZW5kcG9pbnRfeGZlcl9pbnQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGludGVycnVwdCwgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAqIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfeGZlcl9pbnQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisgICAgICAgcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKyAgICAgICAgICAgICAgIFVTQl9FTkRQT0lOVF9YRkVSX0lOVCk7Cit9CisKKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfaW50X2luIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGludGVycnVwdCBJTgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworICAgICAgIHJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfaW50X291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgT1VUCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKyAgICAgICByZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkpOworfQorCisjZW5kaWYgLyogb2xkZXIga2VybmVsIHZlcnNpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvc3VyZmFjZV9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3N1cmZhY2Vfc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTBhNTYyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9zdXJmYWNlX3N5c2ZzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIElmIHlvdSBhcmUgZ29pbmcgdG8gYWJ1c2UgdGhlIHByZXByb2Nlc3Nvciwgd2h5IG5vdCBBQlVTRSB0aGUgcHJlcHJvY2Vzc29yPworICAgSSBzdHVjayB0aGlzIGhlYWRlciBpbiBhIHNlcGFyYXRlIGZpbGUgc28gSSBkb24ndCBoYXZlIHRvIGxvb2sgYXQgaXQgKi8KKworLy8gRklYTUUgTmVlZCBsb2NraW5nIG9yIGF0b21pYyBvcHMKKworI2RlZmluZSBzaG93X3NldF9tYml0KGRuYW1lLHZhbHVlLGJpdCkJCQkJCQkJCQkJCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSAoMSAmJiAodC0+dmFsdWUgJiAoMSA8PCBiaXQpKSk7CQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwlpZih0ZW1wID4gMCkgeyBsb25nIGIgPSAxIDw8IGJpdDsgdC0+dmFsdWUgfD0gYjsgfSBcCisJZWxzZSB7IGxvbmcgYiA9IH4oMSA8PCBiaXQpOyB0LT52YWx1ZSAmPSBiIDsJCQkJIFwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworI2RlZmluZSBzaG93X3NldF9lYml0KGRuYW1lLGVudW1uYW1lLHZhbHVlLGJpdCkJCQkJCQkJCQkJCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI2JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorICBlbnVtIGVudW1uYW1lIGwgPSBiaXQ7IFwKKyAgaW50IHRlbXAgPSB0LT52YWx1ZSAmICgxIDw8IGwpOwkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI2JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKyAgZW51bSBlbnVtbmFtZSBsID0gYml0O1wKKwlsb25nIGIgID0gMSA8PCBsOyBcCisJaWYodGVtcCA+IDApIHsgdC0+dmFsdWUgfD0gYjsgfQlcCisJZWxzZSB7IHQtPnZhbHVlICY9IH5iIDsJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOworCisvLyBGSVhNRSBGT1IgQ09SUkVDVExZIFNFVFRJTkcgSEVYIGZyb20gYSBzdHJpbmcKKyNkZWZpbmUgc2hvd19zZXRfbWNtZChkbmFtZSx2YWx1ZSkJCQkJCQkJCQkJCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisgIGludCBjb3VudCA9IDA7XAorCWludCBpOyBcCisJZm9yIChpID0gMCxpPHNpemVvZihkbmFtZSk7IGkrKykgY291bnQgKz0gc25wcmludGYoYnVmLCAiJTAyeCIsdC0+ZG5hbWVbaV0pOyBcCisgIHJldHVybihjb3VudCk7XAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCXQtPnZhbHVlID0gdGVtcDsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CisKKyNkZWZpbmUgc2hvd19zZXRfbWludChkbmFtZSx2YWx1ZSkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHQtPnZhbHVlKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJdC0+dmFsdWUgPSB0ZW1wOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworI2RlZmluZSBzaG93X3NldF9tY2hhcihkbmFtZSx2YWx1ZSkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjXG4iLCB0LT52YWx1ZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCXQtPnZhbHVlID0gdGVtcDsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1ZmFhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYwpAQCAtMCwwICsxLDEwMDYgQEAKKy8qCisgKiBGcm9udGllciBEZXNpZ25zIFRyYW56cG9ydCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBUYWh0IChtQHRhaHQubmV0KQorICoKKyAqIEJhc2VkIG9uIHRoZSB1c2JsZWQgZHJpdmVyIGFuZCBsZHVzYiBkcml2ZXJzIGJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWljaGFlbCBIdW5kIDxtaHVuZEBsZC1kaWRhY3RpYy5kZT4KKyAqCisgKiBUaGUgbGR1c2IgZHJpdmVyIHdhcywgaW4gdHVybiwgZGVyaXZlZCBmcm9tIExlZ28gVVNCIFRvd2VyIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEdsYW5jZSA8YWR2aWRnc2ZAc291cmNlZm9yZ2UubmV0PgorICoJCSAyMDAxLTIwMDQgSnVlcmdlbiBTdHViZXIgPHN0YXJibHVlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKi8KKworLyoqCisgKiBUaGlzIGRyaXZlciB1c2VzIGEgcmluZyBidWZmZXIgZm9yIHRpbWUgY3JpdGljYWwgcmVhZGluZyBvZgorICogaW50ZXJydXB0IGluIHJlcG9ydHMgYW5kIHByb3ZpZGVzIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMgZm9yCisgKiByYXcgaW50ZXJydXB0IHJlcG9ydHMuCisgKi8KKworLyogTm90ZTogdGhpcyBjdXJyZW50bHkgdXNlcyBhIGR1bWIgcmluZ2J1ZmZlciBmb3IgcmVhZHMgYW5kIHdyaXRlcy4KKyAqIEEgbW9yZSBvcHRpbWFsIGRyaXZlciB3b3VsZCBjYWNoZSBhbmQga2lsbCBvZmYgb3V0c3RhbmRpbmcgdXJicyB0aGF0IGFyZQorICogbm93IGludmFsaWQsIGFuZCBpZ25vcmUgb25lcyB0aGF0IGFscmVhZHkgd2VyZSBpbiB0aGUgcXVldWUgYnV0IHZhbGlkCisgKiBhcyB3ZSBvbmx5IGhhdmUgMTcgY29tbWFuZHMgZm9yIHRoZSB0cmFuenBvcnQuIEluIHBhcnRpY3VsYXIgdGhpcyBpcworICoga2V5IGZvciBnZXR0aW5nIGxpZ2h0cyB0byBmbGFzaCBpbiB0aW1lIGFzIG90aGVyd2lzZSBtYW55IGNvbW1hbmRzCisgKiBjYW4gYmUgYnVmZmVyZWQgdXAgYmVmb3JlIHRoZSBsaWdodCBjaGFuZ2UgbWFrZXMgaXQgdG8gdGhlIGludGVyZmFjZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisjaW5jbHVkZSBmcm9udGllcl9jb21wYXQuaAorI2VuZGlmCisKKy8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2VzICovCisjZGVmaW5lIFZFTkRPUl9JRCAgIDB4MTY1YgorI2RlZmluZSBQUk9EVUNUX0lECTB4ODEwMQorCisjaWZkZWYgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUworI2RlZmluZSBVU0JfVFJBTlpQT1JUX01JTk9SX0JBU0UJMAorI2Vsc2UKKy8vIEZJWE1FIDE3NiAtIGlzIHRoZSBsZHVzYiBkcml2ZXIncyBtaW5vciAtIGFwcGx5IGZvciBhIG1pbm9yIHNvb24KKyNkZWZpbmUgVVNCX1RSQU5aUE9SVF9NSU5PUl9CQVNFCTE3NworI2VuZGlmCisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfdHJhbnpwb3J0X3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShWRU5ET1JfSUQsIFBST0RVQ1RfSUQpIH0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl90cmFuenBvcnRfdGFibGUpOworTU9EVUxFX1ZFUlNJT04oIjAuMzMiKTsKK01PRFVMRV9BVVRIT1IoIk1pa2UgVGFodCA8bUB0YWh0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVHJhbnpwb3J0IFVTQiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJGcm9udGllciBEZXNpZ25zIFRyYW56cG9ydCBDb250cm9sIFN1cmZhY2UiKTsKKworLyogVGhlc2UgdHdvIGFyZW4ndCBkb25lIHlldCAqLworCisjZGVmaW5lIFNVUFBSRVNTX0VYVFJBX09OTElORV9FVkVOVFMgMAorI2RlZmluZSBCVUZGRVJFRF9XUklURVMgMAorCisjZGVmaW5lIFNVUFBSRVNTX0VYVFJBX09GRkxJTkVfRVZFTlRTIDEKKyNkZWZpbmUgQ09NUFJFU1NfV0hFRUxfRVZFTlRTIDEKKyNkZWZpbmUgQlVGRkVSRURfUkVBRFMgMQorI2RlZmluZSBSSU5HX0JVRkZFUl9TSVpFIDEwMDAKKyNkZWZpbmUgV1JJVEVfQlVGRkVSX1NJWkUgMzQKKyNkZWZpbmUgVFJBTlpQT1JUX1VTQl9USU1FT1VUIDEwCisKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7CisKKy8qIFVzZSBvdXIgb3duIGRiZyBtYWNybyAqLworI2RlZmluZSBkYmdfaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgZGV2X2luZm8oZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOworCisvKiBBbGwgaW50ZXJydXB0IGluIHRyYW5zZmVycyBhcmUgY29sbGVjdGVkIGluIGEgcmluZyBidWZmZXIgdG8KKyAqIGF2b2lkIHJhY2luZyBjb25kaXRpb25zIGFuZCBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlIG9mIHRoZSBkcml2ZXIuCisgKi8KKworc3RhdGljIGludCByaW5nX2J1ZmZlcl9zaXplID0gUklOR19CVUZGRVJfU0laRTsKKworbW9kdWxlX3BhcmFtKHJpbmdfYnVmZmVyX3NpemUsIGludCwgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhyaW5nX2J1ZmZlcl9zaXplLCAiUmVhZCByaW5nIGJ1ZmZlciBzaXplIGluIHJlcG9ydHMiKTsKKworLyogVGhlIHdyaXRlX2J1ZmZlciBjYW4gb25lIGRheSBjb250YWluIG1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IG91dCB0cmFuc2Zlci4KKyAqLworc3RhdGljIGludCB3cml0ZV9idWZmZXJfc2l6ZSA9IFdSSVRFX0JVRkZFUl9TSVpFOworbW9kdWxlX3BhcmFtKHdyaXRlX2J1ZmZlcl9zaXplLCBpbnQsICBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Mod3JpdGVfYnVmZmVyX3NpemUsICJXcml0ZSBidWZmZXIgc2l6ZSIpOworCisvKgorICogSW5jcmVhc2UgdGhlIGludGVydmFsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKiBvciBzZXQgdG8gMSB0byB1c2UgdGhlIHN0YW5kYXJkIGludGVydmFsIGZyb20gdGhlIGVuZHBvaW50IGRlc2NyaXB0b3JzLgorICovCisKK3N0YXRpYyBpbnQgbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA9IFRSQU5aUE9SVF9VU0JfVElNRU9VVDsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgaW4gaW50ZXJ2YWwgaW4gbXMiKTsKKworc3RhdGljIGludCBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA9IFRSQU5aUE9SVF9VU0JfVElNRU9VVDsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBvdXQgaW50ZXJ2YWwgaW4gbXMiKTsKKworc3RydWN0IHRyYW56cG9ydF9jbWQgeworICAgIHVuc2lnbmVkIGNoYXIgY21kWzhdOworfTsKKworZW51bSBMaWdodElEIHsKKwlMaWdodFJlY29yZCA9IDAsCisJTGlnaHRUcmFja3JlYywKKwlMaWdodFRyYWNrbXV0ZSwKKwlMaWdodFRyYWNrc29sbywKKwlMaWdodEFueXNvbG8sCisJTGlnaHRMb29wLAorCUxpZ2h0UHVuY2gKKwl9OworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZiAqLworCitzdHJ1Y3QgdXNiX3RyYW56cG9ydCB7CisJc3RydWN0IHNlbWFwaG9yZQlzZW07CQkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlKglpbnRmOwkJLyogc2F2ZSBvZmYgdGhlIHVzYiBpbnRlcmZhY2UgcG9pbnRlciAqLworCisJaW50CQkJb3Blbl9jb3VudDsJLyogbnVtYmVyIG9mIHRpbWVzIHRoaXMgcG9ydCBoYXMgYmVlbiBvcGVuZWQgKi8KKworCXN0cnVjdCB0cmFuenBvcnRfY21kCSgqcmluZ19idWZmZXIpW1JJTkdfQlVGRkVSX1NJWkVdOyAvKiBqdXN0IG1ha2UgYyBoYXBweSAqLworCXVuc2lnbmVkIGludAkJcmluZ19oZWFkOworCXVuc2lnbmVkIGludAkJcmluZ190YWlsOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJcmVhZF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CXdyaXRlX3dhaXQ7CisKKwl1bnNpZ25lZCBjaGFyKgkJaW50ZXJydXB0X2luX2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9pbl9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJaW50ZXJydXB0X2luX3VyYjsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5faW50ZXJ2YWw7CisJc2l6ZV90CWludGVycnVwdF9pbl9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9pbl9ydW5uaW5nOworCWludAkJCWludGVycnVwdF9pbl9kb25lOworCisJY2hhcioJCQlpbnRlcnJ1cHRfb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9vdXRfZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9vdXRfdXJiOworCWludAkJCWludGVycnVwdF9vdXRfaW50ZXJ2YWw7CisJc2l6ZV90CWludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZTsKKwlpbnQJCQlpbnRlcnJ1cHRfb3V0X2J1c3k7CisKKwkvKiBTeXNmcyBhbmQgdHJhbnNsYXRpb24gc3VwcG9ydCAqLworCisJaW50IGV2ZW50OyAvKiBhbHRlcm5hdGUgaW50ZXJmYWNlIHRvIGV2ZW50cyAqLworCWludCB3aGVlbDsgLyogLSBmb3IgbmVnYXRpdmUsIDAgZm9yIG5vbmUsICsgZm9yIHBvc2l0aXZlICovCisJdW5zaWduZWQgY2hhciBkdW1wX3N0YXRlOyAvKiAwIGlmIGRpc2FibGVkIDEgaWYgZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgZW5hYmxlOyAvKiAwIGlmIGRpc2FibGVkIDEgaWYgZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgb2ZmbGluZTsgLyogaWYgdGhlIGRldmljZSBpcyBvdXQgb2YgcmFuZ2Ugb3IgYXNsZWVwICovCisJdW5zaWduZWQgY2hhciBjb21wcmVzc193aGVlbDsgLyogZmxhZyB0byBjb21wcmVzcyB3aGVlbCBldmVudHMgKi8KKwl1bnNpZ25lZCBjaGFyIGxpZ2h0OyAvKiA3IGJpdHMgdXNlZCAqLworCXVuc2lnbmVkIGNoYXIgbGFzdF9jbWRbOF07CisJdW5zaWduZWQgY2hhciBsYXN0X2lucHV0WzhdOworCXVuc2lnbmVkIGNoYXIgc2NyZWVuWzQwXTsgLy8gV2UnbGwgYWxzbyBoYXZlIGNlbGxzCisKK307CisKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLworc3RhdGljIERFRklORV9NVVRFWChkaXNjb25uZWN0X211dGV4KTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYl90cmFuenBvcnRfZHJpdmVyOworCisvKioKKyAqCXVzYl90cmFuenBvcnRfYWJvcnRfdHJhbnNmZXJzCisgKiAgICAgIGFib3J0cyB0cmFuc2ZlcnMgYW5kIGZyZWVzIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyB2b2lkIHVzYl90cmFuenBvcnRfYWJvcnRfdHJhbnNmZXJzKHN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXYpCit7CisJLyogc2h1dGRvd24gdHJhbnNmZXIgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZykgeworCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKKwkJaWYgKGRldi0+aW50ZikKKwkJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9pbl91cmIpOworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpCisJCWlmIChkZXYtPmludGYpCisJCQl1c2Jfa2lsbF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7Cit9CisKKy8vIEZJWE1FIH5saWdodCBub3QgZ29vZCBlbm91Z2ggb3IgY29ycmVjdCAtIG5lZWQgYXRvbWljIHNldF9iaXQKKworI2RlZmluZSBzaG93X3NldF9saWdodCh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl90cmFuenBvcnQgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJXAorCWVudW0gTGlnaHRJRCBsaWdodCA9IHZhbHVlOwkJCQkJXAorCWludCB0ZW1wID0gKDEgJiYgKHQtPmxpZ2h0ICYgKDEgPDwgbGlnaHQpKSk7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wICk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJZW51bSBMaWdodElEIGxpZ2h0ID0gKHRlbXAgPDwgdmFsdWUpICYgKHQtPmxpZ2h0IDw8IHZhbHVlKTsJXAorCXQtPmxpZ2h0ID0gKHQtPmxpZ2h0ICYgfmxpZ2h0KSA7CQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworc2hvd19zZXRfbGlnaHQoTGlnaHRSZWNvcmQpOworc2hvd19zZXRfbGlnaHQoTGlnaHRUcmFja3JlYyk7CitzaG93X3NldF9saWdodChMaWdodFRyYWNrbXV0ZSk7CitzaG93X3NldF9saWdodChMaWdodFRyYWNrc29sbyk7CitzaG93X3NldF9saWdodChMaWdodEFueXNvbG8pOworc2hvd19zZXRfbGlnaHQoTGlnaHRMb29wKTsKK3Nob3dfc2V0X2xpZ2h0KExpZ2h0UHVuY2gpOworCisKKyNkZWZpbmUgc2hvd19zZXRfaW50KHZhbHVlKQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0LT52YWx1ZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJCQkJCQkJCQlcCisJdC0+dmFsdWUgPSB0ZW1wOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworc2hvd19zZXRfaW50KGVuYWJsZSk7CitzaG93X3NldF9pbnQob2ZmbGluZSk7CitzaG93X3NldF9pbnQoY29tcHJlc3Nfd2hlZWwpOworc2hvd19zZXRfaW50KGR1bXBfc3RhdGUpOworc2hvd19zZXRfaW50KHdoZWVsKTsKK3Nob3dfc2V0X2ludChldmVudCk7CisKKyNkZWZpbmUgc2hvd19zZXRfY21kKHZhbHVlKQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0LT52YWx1ZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJCQkJCQkJCQlcCisJdC0+dmFsdWUgPSB0ZW1wOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworCisKKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2RlbGV0ZQorICovCitzdGF0aWMgdm9pZCB1c2JfdHJhbnpwb3J0X2RlbGV0ZShzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2KQoreworCXVzYl90cmFuenBvcnRfYWJvcnRfdHJhbnNmZXJzKGRldik7CisJLyogIFRoaXMgaXMganVzdCB0b28gdHdpc3RlZCB0byBiZSBjb3JyZWN0ICovCisJaWYoZGV2LT5pbnRmICE9IE5VTEwpIHsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRSZWNvcmQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrcmVjKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja211dGUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrc29sbyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0VHJhY2ttdXRlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRBbnlzb2xvKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRMb29wKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRQdW5jaCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX3doZWVsKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfZXZlbnQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9vZmZsaW5lKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfY29tcHJlc3Nfd2hlZWwpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX2R1bXBfc3RhdGUpOworCX0KKworCS8qIGZyZWUgZGF0YSBzdHJ1Y3R1cmVzICovCisJdXNiX2ZyZWVfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJdXNiX2ZyZWVfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOworCWtmcmVlKGRldi0+cmluZ19idWZmZXIpOworCWtmcmVlKGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcik7CisJa2ZyZWUoZGV2KTsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9pbl9jYWxsYmFjaworICovCisKK3N0YXRpYyB2b2lkIHVzYl90cmFuenBvcnRfaW50ZXJydXB0X2luX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2ID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGludCBuZXh0X3JpbmdfaGVhZDsKKwlpbnQgcmV0dmFsID0gLTE7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0gZWxzZSB7CisJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJCSBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCWdvdG8gcmVzdWJtaXQ7IC8qIG1heWJlIHdlIGNhbiByZWNvdmVyICovCisJCX0KKwl9CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IDgpIHsKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAorCQkJICJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudCBcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHJlY2VpdmVkOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCSBfX0ZVTkNUSU9OX18sIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclswXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzJdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclszXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbNF0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzVdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcls2XSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbN10pOworI2lmIFNVUFBSRVNTX0VYVFJBX09GRkxJTkVfRVZFTlRTCisJCWlmKGRldi0+b2ZmbGluZSA9PSAyICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGdvdG8gcmVzdWJtaXQ7IH0KKwkJaWYoZGV2LT5vZmZsaW5lID09IDEgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdID09IDB4ZmYpIHsgZGV2LT5vZmZsaW5lID0gMjsgZ290byByZXN1Ym1pdDsgfQorCisvKiBBbHdheXMgcGFzcyBvbmUgb2ZmbGluZSBldmVudCB1cCB0aGUgc3RhY2sgKi8KKwkJaWYoZGV2LT5vZmZsaW5lID4gMCAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gIT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAwOyB9CisJCWlmKGRldi0+b2ZmbGluZSA9PSAwICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDE7IH0KKworI2VuZGlmCisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fRlVOQ1RJT05fXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CisKKwkJbmV4dF9yaW5nX2hlYWQgPSAoZGV2LT5yaW5nX2hlYWQrMSkgJSByaW5nX2J1ZmZlcl9zaXplOworCisJCWlmIChuZXh0X3JpbmdfaGVhZCAhPSBkZXYtPnJpbmdfdGFpbCkgeworCQkJbWVtY3B5KCYoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfaGVhZF0pLCBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlkZXYtPnJpbmdfaGVhZCA9IG5leHRfcmluZ19oZWFkOworCQkJcmV0dmFsID0gMDsKKwkJCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIDAsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCisJCQkJICJSaW5nIGJ1ZmZlciBvdmVyZmxvdywgJWQgYnl0ZXMgZHJvcHBlZFxuIiwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIDAsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0KKwl9CisKK3Jlc3VibWl0OgorCS8qIHJlc3VibWl0IGlmIHdlJ3JlIHN0aWxsIHJ1bm5pbmcgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyAmJiBkZXYtPmludGYpIHsKKwkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+aW50Zi0+ZGV2LAorCQkJCSJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKK2V4aXQ6CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIHVzYl90cmFuenBvcnRfaW50ZXJydXB0X291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldiA9IHVyYi0+Y29udGV4dDsKKworCS8qIHN5bmMvYXN5bmMgdW5saW5rIGZhdWx0cyBhcmVuJ3QgZXJyb3JzICovCisJaWYgKHVyYi0+c3RhdHVzICYmICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAorCQkJICAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkJICAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LAorCQkJICIlcyAtIG5vbnplcm8gd3JpdGUgaW50ZXJydXB0IHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCisJCQkgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisKKwlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDA7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPndyaXRlX3dhaXQpOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfb3BlbgorICovCitzdGF0aWMgaW50IHVzYl90cmFuenBvcnRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2OworCWludCBzdWJtaW5vcjsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJc3VibWlub3IgPSBpbWlub3IoaW5vZGUpOworCisJbXV0ZXhfbG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlpbnRlcmZhY2UgPSB1c2JfZmluZF9pbnRlcmZhY2UoJnVzYl90cmFuenBvcnRfZHJpdmVyLCBzdWJtaW5vcik7CisKKwlpZiAoIWludGVyZmFjZSkgeworCQllcnIoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZFxuIiwKKwkJICAgICBfX0ZVTkNUSU9OX18sIHN1Ym1pbm9yKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWlmICghZGV2KSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBsb2NrIHRoaXMgZGV2aWNlICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCS8qIGFsbG93IG9wZW5pbmcgb25seSBvbmNlICovCisJaWYgKGRldi0+b3Blbl9jb3VudCkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCWRldi0+b3Blbl9jb3VudCA9IDE7CisKKwkvKiBpbml0aWFsaXplIGluIGRpcmVjdGlvbiAqLworCWRldi0+cmluZ19oZWFkID0gMDsKKwlkZXYtPnJpbmdfdGFpbCA9IDA7CisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsCisJCQkgaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLAorCQkJIHVzYl9yY3ZpbnRwaXBlKGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLAorCQkJIHVzYl90cmFuenBvcnRfaW50ZXJydXB0X2luX2NhbGxiYWNrLAorCQkJIGRldiwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCk7CisKKwlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMTsKKwlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMDsKKwlkZXYtPmVuYWJsZSA9IDE7CisJZGV2LT5vZmZsaW5lID0gMDsKKwlkZXYtPmNvbXByZXNzX3doZWVsID0gMTsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IHN1Ym1pdCBpbnRlcnJ1cHRfaW5fdXJiICVkXG4iLCByZXR2YWwpOworCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKKwkJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzYXZlIGRldmljZSBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OworCisKK3VubG9ja19leGl0OgorCXVwKCZkZXYtPnNlbSk7CisKK3VubG9ja19kaXNjb25uZWN0X2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9yZWxlYXNlCisgKi8KK3N0YXRpYyBpbnQgdXNiX3RyYW56cG9ydF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5vcGVuX2NvdW50ICE9IDEpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJLyogdGhlIGRldmljZSB3YXMgdW5wbHVnZ2VkIGJlZm9yZSB0aGUgZmlsZSB3YXMgcmVsZWFzZWQgKi8KKwkJdXAoJmRldi0+c2VtKTsKKwkJLyogdW5sb2NrIGhlcmUgYXMgdXNiX3RyYW56cG9ydF9kZWxldGUgZnJlZXMgZGV2ICovCisJCXVzYl90cmFuenBvcnRfZGVsZXRlKGRldik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHdyaXRlIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndyaXRlX3dhaXQsICFkZXYtPmludGVycnVwdF9vdXRfYnVzeSwgMiAqIEhaKTsKKwl1c2JfdHJhbnpwb3J0X2Fib3J0X3RyYW5zZmVycyhkZXYpOworCWRldi0+b3Blbl9jb3VudCA9IDA7CisKK3VubG9ja19leGl0OgorCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X3BvbGwKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1c2JfdHJhbnpwb3J0X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldjsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+cmVhZF93YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+d3JpdGVfd2FpdCwgd2FpdCk7CisKKwlpZiAoZGV2LT5yaW5nX2hlYWQgIT0gZGV2LT5yaW5nX3RhaWwpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9yZWFkCisgKi8KK3N0YXRpYyBzc2l6ZV90IHVzYl90cmFuenBvcnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJaW50IHJldHZhbCA9IDA7CisKKyNpZiBCVUZGRVJFRF9SRUFEUworCWludCBjID0gMDsKKyNlbmRpZgorCisjaWYgQ09NUFJFU1NfV0hFRUxfRVZFTlRTCisJc2lnbmVkIGNoYXIgb2xkd2hlZWw7CisJc2lnbmVkIGNoYXIgbmV3d2hlZWw7CisJaW50IGNhbmNvbXByZXNzID0gMTsKKwlpbnQgbmV4dF90YWlsOworI2VuZGlmCisKKy8qIGRvIEkgaGF2ZSBzdWNoIGEgdGhpbmcgYXMgYSBudWxsIGV2ZW50PyAqLworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gcmVhZCAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCXdoaWxlIChkZXYtPnJpbmdfaGVhZCA9PSBkZXYtPnJpbmdfdGFpbCkgeworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwkJLy8gYXRvbWljX2NtcF9leGNoYW5nZSgmZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSwwLDApOworCQlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMCA7IC8qIHRpbnkgcmFjZSAtIEZJWE1FOiBtYWtlIGF0b21pYz8gKi8KKwkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+cmVhZF93YWl0LCBkZXYtPmludGVycnVwdF9pbl9kb25lKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwl9CisKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY29weWluZyB0byB1c2Vyc3BhY2U6ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJIF9fRlVOQ1RJT05fXywgKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzBdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsxXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzNdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs0XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzZdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs3XSk7CisKKyNpZiBCVUZGRVJFRF9SRUFEUworCSAgIGMgPSAwOworCSAgIHdoaWxlKChjIDwgY291bnQpICYmIChkZXYtPnJpbmdfdGFpbCAhPSBkZXYtPnJpbmdfaGVhZCkpIHsKKworLyogVGhpcyBzdGFydGVkIG9mZiBpbiB0aGUgbG93ZXIgbGV2ZWwgc2VydmljZSByb3V0aW5lLCBhbmQgSSBtb3ZlZCBpdCBoZXJlLiBUaGVuIG15IGJyYWluIGRpZWQuIE5vdCBkb25lIHlldC4gKi8KKyNpZiBDT01QUkVTU19XSEVFTF9FVkVOVFMKKwkJbmV4dF90YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwkJaWYoZGV2LT5jb21wcmVzc193aGVlbCkgY2FuY29tcHJlc3MgPSAxOworCQl3aGlsZShkZXYtPnJpbmdfaGVhZCAhPSBuZXh0X3RhaWwgJiYgY2FuY29tcHJlc3MgPT0gMSApIHsKKwkJCW5ld3doZWVsID0gKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFs2XTsKKwkJCW9sZHdoZWVsID0gKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzZdOworCQkJLy8gaWYgYm90aCBhcmUgd2hlZWwgZXZlbnRzLCBhbmQgbm8gYnV0dG9ucyBoYXZlIGNoYW5nZXMgKEZJWE1FLCBkbyBJIGhhdmUgdG8gY2hlY2s/KSwKKwkJCS8vIGFuZCB3ZSBhcmUgdGhlIHNhbWUgc2lnbiwgd2UgY2FuIGNvbXByZXNzICstIDdGCisJCQkvLyBGSVhNRTogc2FuZXIgY2hlY2sgZm9yIG92ZXJmbG93ISAtIG1heCBvZiArLSA3RgorCQkJLy8gRklYTUUgdGhlIG1hdGggaXMgd3JvbmcgZm9yIGdvaW5nIGluIHJldmVyc2UsIGFjdHVhbGx5LCBhcyB0aGUgbWlkaSBzcGVjIGRvZXNuJ3QgYWxsb3cgc2lnbmVkIGNoYXJzCisKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogdHJ5aW5nIHRvIGNvbXByZXNzOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSBfX0ZVTkNUSU9OX18sICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFswXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzJdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFszXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzVdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbN10pOworCisKKwkJCWlmKCgoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0gIT0gMCAmJgorCQkJICAgICgqZGV2LT5yaW5nX2J1ZmZlcilbbmV4dF90YWlsXS5jbWRbNl0gIT0gMCApICYmCisJCQkJKChuZXd3aGVlbCA+IDAgJiYgb2xkd2hlZWwgPiAwKSB8fAorCQkJCShuZXd3aGVlbCA8IDAgJiYgb2xkd2hlZWwgPCAwKSkgJiYKKwkJCQkoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzJdID09ICgqZGV2LT5yaW5nX2J1ZmZlcilbbmV4dF90YWlsXS5jbWRbMl0pICYmCisJCQkJKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFszXSA9PSAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzNdKSAmJgorCQkJCSgoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNF0gPT0gKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFs0XSkgJiYKKwkJCQkoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzVdID09ICgqZGV2LT5yaW5nX2J1ZmZlcilbbmV4dF90YWlsXS5jbWRbNV0pKQorIHsKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogc2hvdWxkIGNvbXByZXNzOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCSBfX0ZVTkNUSU9OX18sICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFswXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzJdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFszXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzVdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbN10pOworCisJCQkJbmV3d2hlZWwgKz0gb2xkd2hlZWw7CisJCQkJaWYob2xkd2hlZWwgPiAwICYmICEobmV3d2hlZWwgPiAwKSkgeworCQkJCQluZXd3aGVlbCA9IDB4N2Y7CisJCQkJCWNhbmNvbXByZXNzID0gMDsKKwkJCQl9CisJCQkJaWYob2xkd2hlZWwgPCAwICYmICEobmV3d2hlZWwgPCAwKSkgeworCQkJCQluZXd3aGVlbCA9IDB4ODA7CisJCQkJCWNhbmNvbXByZXNzID0gMDsKKwkJCQl9CisKKwkJCQkoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzZdID0gbmV3d2hlZWw7CisJCQkJZGV2LT5yaW5nX3RhaWwgPSBuZXh0X3RhaWw7CisJCQkJbmV4dF90YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJY2FuY29tcHJlc3MgPSAwOworCQkJfQorCQl9CisjZW5kaWYgLyogQ09NUFJFU1NfV0hFRUxfRVZFTlRTICovCisKKwkJaWYgKGNvcHlfdG9fdXNlcigmYnVmZmVyW2NdLCAmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0sIDgpKSB7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCisJCWRldi0+cmluZ190YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwkJYys9ODsKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19GVU5DVElPTl9fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKwkgICB9CisJICAgcmV0dmFsID0gYzsKKworI2Vsc2UKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLCA4KSkgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCWRldi0+cmluZ190YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX0ZVTkNUSU9OX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOworCisJcmV0dmFsID0gODsKKyNlbmRpZiAvKiBCVUZGRVJFRF9SRUFEUyAqLworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X3dyaXRlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHVzYl90cmFuenBvcnRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldjsKKwlzaXplX3QgYnl0ZXNfdG9fd3JpdGU7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgZGF0YSB0byB3cml0ZSAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCS8qIHdhaXQgdW50aWwgcHJldmlvdXMgdHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCX0KKworCS8qIHdyaXRlIHRoZSBkYXRhIGludG8gaW50ZXJydXB0X291dF9idWZmZXIgZnJvbSB1c2Vyc3BhY2UgKi8KKwlieXRlc190b193cml0ZSA9IG1pbihjb3VudCwgd3JpdGVfYnVmZmVyX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUpOworCWlmIChieXRlc190b193cml0ZSA8IGNvdW50KQorCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsICJXcml0ZSBidWZmZXIgb3ZlcmZsb3csICV6ZCBieXRlcyBkcm9wcGVkXG4iLGNvdW50LWJ5dGVzX3RvX3dyaXRlKTsKKworCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBjb3VudCA9ICV6ZCwgYnl0ZXNfdG9fd3JpdGUgPSAlemRcbiIsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ5dGVzX3RvX3dyaXRlKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyLCBidWZmZXIsIGJ5dGVzX3RvX3dyaXRlKSkgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkgeworCQllcnIoIkVuZHBvaW50IHNob3VsZCBub3QgYmUgYmUgbnVsbCEgXG4iKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzZW5kIG9mZiB0aGUgdXJiICovCisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoZGV2LT5pbnRmKSwKKwkJCSB1c2Jfc25kaW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwKKwkJCSBieXRlc190b193cml0ZSwKKwkJCSB1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9vdXRfY2FsbGJhY2ssCisJCQkgZGV2LAorCQkJIGRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCk7CisKKwlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDE7CisJd21iKCk7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKKwkJZXJyKCJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X291dF91cmIgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCXJldHZhbCA9IGJ5dGVzX3RvX3dyaXRlOworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogZmlsZSBvcGVyYXRpb25zIG5lZWRlZCB3aGVuIHdlIHJlZ2lzdGVyIHRoaXMgZHJpdmVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JfdHJhbnpwb3J0X2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlYWQgID0JdXNiX3RyYW56cG9ydF9yZWFkLAorCS53cml0ZSA9CXVzYl90cmFuenBvcnRfd3JpdGUsCisJLm9wZW4gPQkJdXNiX3RyYW56cG9ydF9vcGVuLAorCS5yZWxlYXNlID0JdXNiX3RyYW56cG9ydF9yZWxlYXNlLAorCS5wb2xsID0JCXVzYl90cmFuenBvcnRfcG9sbCwKK307CisKKy8qCisgKiB1c2IgY2xhc3MgZHJpdmVyIGluZm8gaW4gb3JkZXIgdG8gZ2V0IGEgbWlub3IgbnVtYmVyIGZyb20gdGhlIHVzYiBjb3JlLAorICogYW5kIHRvIGhhdmUgdGhlIGRldmljZSByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlciBjb3JlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciB1c2JfdHJhbnpwb3J0X2NsYXNzID0geworCS5uYW1lID0JCSJ0cmFuenBvcnQlZCIsCisJLmZvcHMgPQkJJnVzYl90cmFuenBvcnRfZm9wcywKKwkubWlub3JfYmFzZSA9CVVTQl9UUkFOWlBPUlRfTUlOT1JfQkFTRSwKK307CisKKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X3Byb2JlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIGEgbmV3IGRldmljZSBpcyBjb25uZWN0ZWQgdGhhdCBpdCB0aGlua3MKKyAqCXRoaXMgZHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgdXNiX3RyYW56cG9ydF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IGk7CisJaW50IHRydWVfc2l6ZTsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCWluaXRfTVVURVgoJmRldi0+c2VtKTsKKwlkZXYtPmludGYgPSBpbnRmOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+cmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndyaXRlX3dhaXQpOworCisJaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJLyogc2V0IHVwIHRoZSBlbmRwb2ludCBpbmZvcm1hdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgeworCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOworCisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkKKwkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID0gZW5kcG9pbnQ7CisKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkKKwkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9IGVuZHBvaW50OworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9PSBOVUxMKQorCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQgKHVzaW5nIGNvbnRyb2wgZW5kcG9pbnQgaW5zdGVhZClcbiIpOworCisKKwlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplID0gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKworCWlmIChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplICE9IDgpCisJICAgIGRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgc2l6ZSBpcyBub3QgOCFcbiIpOworCisJaWYocmluZ19idWZmZXJfc2l6ZSA9PSAwKSB7IHJpbmdfYnVmZmVyX3NpemUgPSBSSU5HX0JVRkZFUl9TSVpFOyB9CisJdHJ1ZV9zaXplID0gbWluKHJpbmdfYnVmZmVyX3NpemUsUklOR19CVUZGRVJfU0laRSk7CisJLyogRklYTUUgLSB0aGVyZSBhcmUgbW9yZSB1c2JfYWxsb2Mgcm91dGluZXMgZm9yIGRtYSBjb3JyZWN0bmVzcy4gTmVlZGVkPyAqLworCisJZGV2LT5yaW5nX2J1ZmZlciA9IGttYWxsb2MoKHRydWVfc2l6ZSpzaXplb2Yoc3RydWN0IHRyYW56cG9ydF9jbWQpKSs4LCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT5yaW5nX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSByaW5nX2J1ZmZlciBvZiBzaXplICVkXG4iLHRydWVfc2l6ZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciA9IGttYWxsb2MoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplID0gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID8gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgOgorCQkJCQkJCQkJIHVkZXYtPmRlc2NyaXB0b3IuYk1heFBhY2tldFNpemUwOworCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplICE9OCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgc2l6ZSBpcyBub3QgOCEpXG4iKTsKKworCWRldi0+aW50ZXJydXB0X291dF9idWZmZXIgPSBrbWFsbG9jKHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF91cmJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWw7CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCkKKwkJZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWw7CisKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkZXYpOworCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRmLCAmdXNiX3RyYW56cG9ydF9jbGFzcyk7CisJaWYgKHJldHZhbCkgeworCQkvKiBzb21ldGhpbmcgcHJldmVudGVkIHVzIGZyb20gcmVnaXN0ZXJpbmcgdGhpcyBkcml2ZXIgKi8KKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLlxuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRSZWNvcmQpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrcmVjKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja211dGUpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrc29sbykpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0QW55c29sbykpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0TG9vcCkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0UHVuY2gpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl93aGVlbCkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2V2ZW50KSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfZHVtcF9zdGF0ZSkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2NvbXByZXNzX3doZWVsKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfb2ZmbGluZSkpKSBnb3RvIGVycm9yOworCisJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJUcmFuenBvcnQgRGV2aWNlICMlZCBub3cgYXR0YWNoZWQgdG8gbWFqb3IgJWQgbWlub3IgJWRcbiIsCisJCShpbnRmLT5taW5vciAtIFVTQl9UUkFOWlBPUlRfTUlOT1JfQkFTRSksIFVTQl9NQUpPUiwgaW50Zi0+bWlub3IpOworCitleGl0OgorCXJldHVybiByZXR2YWw7CisKK2Vycm9yOgorCXVzYl90cmFuenBvcnRfZGVsZXRlKGRldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfZGlzY29ubmVjdAorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLgorICovCitzdGF0aWMgdm9pZCB1c2JfdHJhbnpwb3J0X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldjsKKwlpbnQgbWlub3I7CisJbXV0ZXhfbG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCWRvd24oJmRldi0+c2VtKTsKKwltaW5vciA9IGludGYtPm1pbm9yOworCS8qIGdpdmUgYmFjayBvdXIgbWlub3IgKi8KKwl1c2JfZGVyZWdpc3Rlcl9kZXYoaW50ZiwgJnVzYl90cmFuenBvcnRfY2xhc3MpOworCisJLyogaWYgdGhlIGRldmljZSBpcyBub3Qgb3BlbmVkLCB0aGVuIHdlIGNsZWFuIHVwIHJpZ2h0IG5vdyAqLworCWlmICghZGV2LT5vcGVuX2NvdW50KSB7CisJCXVwKCZkZXYtPnNlbSk7CisJCXVzYl90cmFuenBvcnRfZGVsZXRlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2LT5pbnRmID0gTlVMTDsKKwkJdXAoJmRldi0+c2VtKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJZGV2X2luZm8oJmludGYtPmRldiwgIlRyYW56cG9ydCBTdXJmYWNlICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLAorCQkgKG1pbm9yIC0gVVNCX1RSQU5aUE9SVF9NSU5PUl9CQVNFKSk7Cit9CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfdHJhbnpwb3J0X2RyaXZlciA9IHsKKwkubmFtZSA9CQkidHJhbnpwb3J0IiwKKwkucHJvYmUgPQl1c2JfdHJhbnpwb3J0X3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNiX3RyYW56cG9ydF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CXVzYl90cmFuenBvcnRfdGFibGUsCit9OworCisvKioKKyAqCXVzYl90cmFuenBvcnRfaW5pdAorICovCitzdGF0aWMgaW50IF9faW5pdCB1c2JfdHJhbnpwb3J0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmdXNiX3RyYW56cG9ydF9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZCBmb3IgdGhlICJfX0ZJTEVfXyIgZHJpdmVyLiBFcnJvciBudW1iZXIgJWRcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfZXhpdAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX3RyYW56cG9ydF9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJnVzYl90cmFuenBvcnRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodXNiX3RyYW56cG9ydF9pbml0KTsKK21vZHVsZV9leGl0KHVzYl90cmFuenBvcnRfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZwppbmRleCA1OTNmZGI3Li5mMmNmN2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9LY29uZmlnCkBAIC0yNSwzICsyNSwxMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ283MDA3LXVzYgogCitjb25maWcgVklERU9fR083MDA3X1VTQl9TMjI1MF9CT0FSRAorCXRyaXN0YXRlICJTZW5zb3JheSAyMjUwLzIyNTEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJREVPX0dPNzAwN19VU0IgJiYgRFZCX1VTQgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIHRoZSBTZW5zb3JheSAyMjUwLzIyNTEgZGV2aWNlCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHMyMjUwLWJvYXJkCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlCmluZGV4IDliOTMxMGMuLmU1MTRiNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZQpAQCAtNSwxNCArNSwyMyBAQAogCiBvYmotJChDT05GSUdfVklERU9fR083MDA3KSArPSBnbzcwMDcubwogb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwN19VU0IpICs9IGdvNzAwNy11c2Iubworb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwN19VU0JfUzIyNTBfQk9BUkQpICs9IHMyMjUwLm8KIAotZ283MDA3LW9ianMgKz0gZ283MDA3LXY0bDIubyBnbzcwMDctZHJpdmVyLm8gZ283MDA3LWkyYy5vIGdvNzAwNy1mdy5vIHNuZC1nbzcwMDcubworZ283MDA3LW9ianMgKz0gZ283MDA3LXY0bDIubyBnbzcwMDctZHJpdmVyLm8gZ283MDA3LWkyYy5vIGdvNzAwNy1mdy5vIFwKKwkJc25kLWdvNzAwNy5vIHdpcy1zYWE3MTEzLm8KIAorczIyNTAtb2JqcyArPSBzMjI1MC1ib2FyZC5vIHMyMjUwLWxvYWRlci5vCiAKLSNpZm5lcSAoJChTQUE3MTM0X0JVSUxEKSwpCi0jb2JqLW0gKz0gc2FhNzEzNC1nbzcwMDcubworIyBVbmNvbXBpbGUgd2hlbiB0aGUgc2FhNzEzNCBwYXRjaGVzIGdldCBpbnRvIHVwc3RyZWFtCisjaWZuZXEgKCQoQ09ORklHX1ZJREVPX1NBQTcxMzQpLCkKKyNvYmotJChDT05GSUdfVklERU9fU0FBNzEzNCkgKz0gc2FhNzEzNC1nbzcwMDcubworI0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNAogI2VuZGlmCiAKK2lmbmVxICgkKENPTkZJR19WSURFT19HTzcwMDdfVVNCX1MyMjUwX0JPQVJEKSwpCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiCitlbmRpZgorCiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL3N0YWdpbmcvc2FhNzEzNAogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwppbmRleCBlNGVhZDk2Li41OGJmYzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwpAQCAtMjE3LDYgKzIxNyw5IEBACiAJY2FzZSBJMkNfRFJJVkVSSURfV0lTX09WNzY0MDoKIAkJbW9kbmFtZSA9ICJ3aXMtb3Y3NjQwIjsKIAkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfUzIyNTA6CisJCW1vZG5hbWUgPSAiczIyNTAtYm9hcmQiOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltb2RuYW1lID0gTlVMTDsKIAkJYnJlYWs7CkBAIC0yMjcsNyArMjMwLDcgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKG1vZG5hbWUgIT0gTlVMTCkKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkJImdvNzAwNzogcHJvYmluZyBmb3IgbW9kdWxlICVzIGZhaWxlZCIsIG1vZG5hbWUpOworCQkJImdvNzAwNzogcHJvYmluZyBmb3IgbW9kdWxlICVzIGZhaWxlZFxuIiwgbW9kbmFtZSk7CiAJZWxzZQogCQlwcmludGsoS0VSTl9JTkZPCiAJCQkiZ283MDA3OiBzZW5zb3IgJXUgc2VlbXMgdG8gYmUgdW5zdXBwb3J0ZWQhXG4iLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1mdy5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZncuYwppbmRleCBhMGUxN2IwLi44NzFlZDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1mdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWZ3LmMKQEAgLTI4NCw3ICsyODQsNyBAQAogCTU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzCiB9OwogCi1zdGF0aWMgaW50IGNvcHlfcGFja2FnZXModTE2ICpkZXN0LCB1MTYgKnNyYywgaW50IHBrZ19jbnQsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgY29weV9wYWNrYWdlcyhfX2xlMTYgKmRlc3QsIHUxNiAqc3JjLCBpbnQgcGtnX2NudCwgaW50IHNwYWNlKQogewogCWludCBpLCBjbnQgPSBwa2dfY250ICogMzI7CiAKQEAgLTI5Miw3ICsyOTIsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY250OyArK2kpCi0JCWRlc3RbaV0gPSBfX2NwdV90b19sZTE2KHNyY1tpXSk7CisJCWRlc3RbaV0gPSBjcHVfdG9fbGUxNnAoc3JjICsgaSk7CiAKIAlyZXR1cm4gY250OwogfQpAQCAtMzcyLDcgKzM3Miw3IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbnQgZ2VuX21qcGVnaGRyX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlKQorc3RhdGljIGludCBnZW5fbWpwZWdoZHJfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UpCiB7CiAJdTggKmJ1ZjsKIAl1MTYgbWVtID0gMHgzZTAwOwpAQCAtNjQzLDcgKzY0Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2VuX21wZWcxaGRyX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sCi0JCQkJCXUxNiAqY29kZSwgaW50IHNwYWNlLCBpbnQgKmZyYW1lbGVuKQorCQkJCQlfX2xlMTYgKmNvZGUsIGludCBzcGFjZSwgaW50ICpmcmFtZWxlbikKIHsKIAl1OCAqYnVmOwogCXUxNiBtZW0gPSAweDNlMDA7CkBAIC04MzEsNyArODMxLDcgQEAKIH0KIAogc3RhdGljIGludCBnZW5fbXBlZzRoZHJfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywKLQkJCQkJdTE2ICpjb2RlLCBpbnQgc3BhY2UsIGludCAqZnJhbWVsZW4pCisJCQkJCV9fbGUxNiAqY29kZSwgaW50IHNwYWNlLCBpbnQgKmZyYW1lbGVuKQogewogCXU4ICpidWY7CiAJdTE2IG1lbSA9IDB4M2UwMDsKQEAgLTkzNiw3ICs5MzYsNyBAQAogfQogCiBzdGF0aWMgaW50IGJyY3RybF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLAotCQkJCQl1MTYgKmNvZGUsIGludCBzcGFjZSwgaW50ICpmcmFtZWxlbikKKwkJCQkJX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UsIGludCAqZnJhbWVsZW4pCiB7CiAJaW50IGNvbnZlcmdlX3NwZWVkID0gMDsKIAlpbnQgbGFtYmRhID0gKGdvLT5mb3JtYXQgPT0gR083MDA3X0ZPUk1BVF9NSlBFRyB8fCBnby0+ZHZkX21vZGUpID8KQEAgLTEwOTEsNyArMTA5MSw3IEBACiAJcmV0dXJuIGNvcHlfcGFja2FnZXMoY29kZSwgcGFjaywgNiwgc3BhY2UpOwogfQogCi1zdGF0aWMgaW50IGNvbmZpZ19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgY29uZmlnX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlKQogewogCWludCBmcHMgPSBnby0+c2Vuc29yX2ZyYW1lcmF0ZSAvIGdvLT5mcHNfc2NhbGUgLyAxMDAwOwogCWludCByb3dzID0gZ28tPmludGVybGFjZV9jb2RpbmcgPyBnby0+aGVpZ2h0IC8gMzIgOiBnby0+aGVpZ2h0IC8gMTY7CkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogCXJldHVybiBjb3B5X3BhY2thZ2VzKGNvZGUsIHBhY2ssIDUsIHNwYWNlKTsKIH0KIAotc3RhdGljIGludCBzZXFoZWFkX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlLAorc3RhdGljIGludCBzZXFoZWFkX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlLAogCWludCAoKnNlcXVlbmNlX2hlYWRlcl9mdW5jKShzdHJ1Y3QgZ283MDA3ICpnbywKIAkJdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgZXh0KSkKIHsKQEAgLTEyOTIsNyArMTI5Miw3IEBACiAJcmV0dXJuIGJpZzsKIH0KIAotc3RhdGljIGludCBhdnN5bmNfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTE2ICpjb2RlLCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGF2c3luY190b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSkKIHsKIAlpbnQgYXJhdGUgPSBnby0+Ym9hcmRfaW5mby0+YXVkaW9fcmF0ZSAqIDEwMDEgKiBnby0+ZnBzX3NjYWxlOwogCWludCByYXRpbyA9IGFyYXRlIC8gZ28tPnNlbnNvcl9mcmFtZXJhdGU7CkBAIC0xMzIzLDcgKzEzMjMsNyBAQAogCXJldHVybiBjb3B5X3BhY2thZ2VzKGNvZGUsIHBhY2ssIDEsIHNwYWNlKTsKIH0KIAotc3RhdGljIGludCBmaW5hbF9wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgZmluYWxfcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UpCiB7CiAJaW50IHJvd3MgPSBnby0+aW50ZXJsYWNlX2NvZGluZyA/IGdvLT5oZWlnaHQgLyAzMiA6IGdvLT5oZWlnaHQgLyAxNjsKIAl1MTYgcGFja1tdID0gewpAQCAtMTM4Niw3ICsxMzg2LDcgQEAKIAlyZXR1cm4gY29weV9wYWNrYWdlcyhjb2RlLCBwYWNrLCAxLCBzcGFjZSk7CiB9CiAKLXN0YXRpYyBpbnQgYXVkaW9fdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTE2ICpjb2RlLCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGF1ZGlvX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlKQogewogCWludCBjbG9ja19jb25maWcgPSAoKGdvLT5ib2FyZF9pbmZvLT5hdWRpb19mbGFncyAmCiAJCQkJR083MDA3X0FVRElPX0kyU19NQVNURVIgPyAxIDogMCkgPDwgMTEpIHwKQEAgLTE0MzYsNyArMTQzNiw3IEBACiAJcmV0dXJuIGNvcHlfcGFja2FnZXMoY29kZSwgcGFjaywgMiwgc3BhY2UpOwogfQogCi1zdGF0aWMgaW50IG1vZGV0X3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlKQorc3RhdGljIGludCBtb2RldF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSkKIHsKIAlpbnQgcmV0LCBtYiwgaSwgYWRkciwgY250ID0gMDsKIAl1MTYgcGFja1szMl07CkBAIC0xNTA1LDcgKzE1MDUsNyBAQAogCXJldHVybiBjbnQ7CiB9CiAKLXN0YXRpYyBpbnQgZG9fc3BlY2lhbChzdHJ1Y3QgZ283MDA3ICpnbywgdTE2IHR5cGUsIHUxNiAqY29kZSwgaW50IHNwYWNlLAorc3RhdGljIGludCBkb19zcGVjaWFsKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgdHlwZSwgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UsCiAJCQlpbnQgKmZyYW1lbGVuKQogewogCXN3aXRjaCAodHlwZSkgewpAQCAtMTU1NSw3ICsxNTU1LDcgQEAKIGludCBnbzcwMDdfY29uc3RydWN0X2Z3X2ltYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1OCAqKmZ3LCBpbnQgKmZ3bGVuKQogewogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7Ci0JdTE2ICpjb2RlLCAqc3JjOworCV9fbGUxNiAqY29kZSwgKnNyYzsKIAlpbnQgZnJhbWVsZW5bOF0gPSB7IH07IC8qIGhvbGRzIHRoZSBsZW5ndGhzIG9mIGVtcHR5IGZyYW1lIHRlbXBsYXRlcyAqLwogCWludCBjb2Rlc3BhY2UgPSA2NCAqIDEwMjQsIGkgPSAwLCBzcmNsZW4sIGNodW5rX2xlbiwgY2h1bmtfZmxhZ3M7CiAJaW50IG1vZGVfZmxhZzsKQEAgLTE1OTAsNyArMTU5MCw3IEBACiAJCWdvdG8gZndfZmFpbGVkOwogCX0KIAltZW1zZXQoY29kZSwgMCwgY29kZXNwYWNlICogMik7Ci0Jc3JjID0gKHUxNiAqKWZ3X2VudHJ5LT5kYXRhOworCXNyYyA9IChfX2xlMTYgKilmd19lbnRyeS0+ZGF0YTsKIAlzcmNsZW4gPSBmd19lbnRyeS0+c2l6ZSAvIDI7CiAJd2hpbGUgKHNyY2xlbiA+PSAyKSB7CiAJCWNodW5rX2ZsYWdzID0gX19sZTE2X3RvX2NwdShzcmNbMF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctcHJpdi5oIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctcHJpdi5oCmluZGV4IDAwNTU0MmQuLjM3MmYxZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1wcml2LmgKQEAgLTQwLDYgKzQwLDcgQEAKICNkZWZpbmUgR083MDA3X0JPQVJESURfTElGRVZJRVdfTFIxOTIJMjEgLyogVFYgV2Fsa2VyIFVsdHJhICovCiAjZGVmaW5lIEdPNzAwN19CT0FSRElEX0VORFVSQQkJMjIKICNkZWZpbmUgR083MDA3X0JPQVJESURfQURMSU5LX01QRzI0CTIzCisjZGVmaW5lIEdPNzAwN19CT0FSRElEX1NFTlNPUkFZXzIyNTAJMjQgLyogU2Vuc29yYXkgMjI1MC8yMjUxICovCiAKIC8qIFZhcmlvdXMgY2hhcmFjdGVyaXN0aWNzIG9mIGVhY2ggYm9hcmQgKi8KICNkZWZpbmUgR083MDA3X0JPQVJEX0hBU19BVURJTwkJKDE8PDApCkBAIC0xMDQsNiArMTA1LDcgQEAKIAlpbnQgKCpzdHJlYW1fc3RhcnQpKHN0cnVjdCBnbzcwMDcgKmdvKTsKIAlpbnQgKCpzdHJlYW1fc3RvcCkoc3RydWN0IGdvNzAwNyAqZ28pOwogCWludCAoKnNlbmRfZmlybXdhcmUpKHN0cnVjdCBnbzcwMDcgKmdvLCB1OCAqZGF0YSwgaW50IGxlbik7CisJaW50ICgqc2VuZF9jb21tYW5kKShzdHJ1Y3QgZ283MDA3ICpnbywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIH07CiAKIC8qIFRoZSB2aWRlbyBidWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgUEFHRV9TSVpFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCmluZGV4IDNmNWVlMzQuLjgzZWVjOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCkBAIC0yMjUsNyArMjI1LDcgQEAKIAkJLmlucHV0cyAJID0gewogCQkJewogCQkJCS52aWRlb19pbnB1dAk9IDEsCi0JCS5hdWRpb19pbnB1dAkgPSBUVkFVRElPX0lOUFVUX0VYVEVSTiwKKwkJCQkuYXVkaW9faW5wdXQJPSBUVkFVRElPX0lOUFVUX0VYVEVSTiwKIAkJCQkubmFtZQkJPSAiQ29tcG9zaXRlIiwKIAkJCX0sCiAJCQl7CkBAIC0zOTgsNiArMzk4LDQxIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZ283MDA3X3VzYl9ib2FyZCBib2FyZF9zZW5zb3JheV8yMjUwID0geworCS5mbGFncwkJPSBHTzcwMDdfVVNCX0VaVVNCIHwgR083MDA3X1VTQl9FWlVTQl9JMkMsCisJLm1haW5faW5mbwk9IHsKKwkJLmZpcm13YXJlCSA9ICJnbzcwMDd0di5iaW4iLAorCQkuYXVkaW9fZmxhZ3MJID0gR083MDA3X0FVRElPX0kyU19NT0RFXzEgfAorCQkJCQlHTzcwMDdfQVVESU9fSTJTX01BU1RFUiB8CisJCQkJCUdPNzAwN19BVURJT19XT1JEXzE2LAorCQkuZmxhZ3MJCSA9IEdPNzAwN19CT0FSRF9IQVNfQVVESU8sCisJCS5hdWRpb19yYXRlCSA9IDQ4MDAwLAorCQkuYXVkaW9fYmNsa19kaXYJID0gOCwKKwkJLmF1ZGlvX21haW5fZGl2CSA9IDIsCisJCS5ocGlfYnVmZmVyX2NhcCAgPSA3LAorCQkuc2Vuc29yX2ZsYWdzCSA9IEdPNzAwN19TRU5TT1JfNjU2IHwKKwkJCQkJR083MDA3X1NFTlNPUl9UViwKKwkJLm51bV9pMmNfZGV2cwkgPSAxLAorCQkuaTJjX2RldnMJID0geworCQkJeworCQkJCS5pZAk9IEkyQ19EUklWRVJJRF9TMjI1MCwKKwkJCQkuYWRkcgk9IDB4MzQsCisJCQl9LAorCQl9LAorCQkubnVtX2lucHV0cwkgPSAyLAorCQkuaW5wdXRzIAkgPSB7CisJCQl7CisJCQkJLnZpZGVvX2lucHV0CT0gMCwKKwkJCQkubmFtZQkJPSAiQ29tcG9zaXRlIiwKKwkJCX0sCisJCQl7CisJCQkJLnZpZGVvX2lucHV0CT0gMSwKKwkJCQkubmFtZQkJPSAiUy1WaWRlbyIsCisJCQl9LAorCQl9LAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZ283MDA3X3VzYl9pZF90YWJsZVtdID0gewogCXsKIAkJLm1hdGNoX2ZsYWdzCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0VfQU5EX1ZFUlNJT04gfApAQCAtNDkxLDYgKzUyNiwxNCBAQAogCQkuYmNkRGV2aWNlX2hpCT0gMHgxLAogCQkuZHJpdmVyX2luZm8JPSAoa2VybmVsX3Vsb25nX3QpR083MDA3X0JPQVJESURfTElGRVZJRVdfTFIxOTIsCiAJfSwKKwl7CisJCS5tYXRjaF9mbGFncwk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFX0FORF9WRVJTSU9OLAorCQkuaWRWZW5kb3IJPSAweDE5NDMsICAvKiBWZW5kb3IgSUQgU2Vuc29yYXkgKi8KKwkJLmlkUHJvZHVjdAk9IDB4MjI1MCwgIC8qIFByb2R1Y3QgSUQgb2YgMjI1MC8yMjUxICovCisJCS5iY2REZXZpY2VfbG8JPSAweDEsCisJCS5iY2REZXZpY2VfaGkJPSAweDEsCisJCS5kcml2ZXJfaW5mbwk9IChrZXJuZWxfdWxvbmdfdClHTzcwMDdfQk9BUkRJRF9TRU5TT1JBWV8yMjUwLAorCX0sCiAJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApAQCAtNjM3LDkgKzY4MCwxMCBAQAogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gKHN0cnVjdCBnbzcwMDcgKil1cmItPmNvbnRleHQ7CiAJdTE2ICpyZWdzID0gKHUxNiAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7Ci0JCWlmICh1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOICYmCisJaWYgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzICE9IC1FU0hVVERPV04gJiYKIAkJCQlnby0+c3RhdHVzICE9IFNUQVRVU19TSFVURE9XTikgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJImdvNzAwNy11c2I6IGVycm9yIGluIHJlYWQgaW50ZXJydXB0OiAlZFxuIiwKQEAgLTY4MCwxNSArNzI0LDE0IEBACiBzdGF0aWMgdm9pZCBnbzcwMDdfdXNiX3JlYWRfdmlkZW9fcGlwZV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSAoc3RydWN0IGdvNzAwNyAqKXVyYi0+Y29udGV4dDsKLQlpbnQgcjsKKwlpbnQgciwgc3RhdHVzID0gdXJiLT4gc3RhdHVzOwogCiAJaWYgKCFnby0+c3RyZWFtaW5nKSB7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ28tPmZyYW1lX3dhaXRxKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IGVycm9yIGluIHZpZGVvIHBpcGU6ICVkXG4iLAotCQkJCXVyYi0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ283MDA3LXVzYjogZXJyb3IgaW4gdmlkZW8gcGlwZTogJWRcbiIsIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKQEAgLTcwNCwxMyArNzQ3LDEyIEBACiBzdGF0aWMgdm9pZCBnbzcwMDdfdXNiX3JlYWRfYXVkaW9fcGlwZV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSAoc3RydWN0IGdvNzAwNyAqKXVyYi0+Y29udGV4dDsKLQlpbnQgcjsKKwlpbnQgciwgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKIAlpZiAoIWdvLT5zdHJlYW1pbmcpCiAJCXJldHVybjsKLQlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IGVycm9yIGluIGF1ZGlvIHBpcGU6ICVkXG4iLAotCQkJCXVyYi0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ283MDA3LXVzYjogZXJyb3IgaW4gYXVkaW8gcGlwZTogJWRcbiIsIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKQEAgLTc1MSw3ICs3OTMsNyBAQAogCXJldHVybiAwOwogCiBhdWRpb19zdWJtaXRfZmFpbGVkOgotCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKIAkJdXNiX2tpbGxfdXJiKHVzYi0+YXVkaW9fdXJic1tpXSk7CiB2aWRlb19zdWJtaXRfZmFpbGVkOgogCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCkBAIC05NjUsMTYgKzEwMDcsMjAgQEAKIAkJbmFtZSA9ICJMaWZldmlldyBUViBXYWxrZXIgVWx0cmEiOwogCQlib2FyZCA9ICZib2FyZF9saWZldmlld19scjE5MjsKIAkJYnJlYWs7CisJY2FzZSBHTzcwMDdfQk9BUkRJRF9TRU5TT1JBWV8yMjUwOgorCQlwcmludGsoS0VSTl9JTkZPICJTZW5zb3JheSAyMjUwIGZvdW5kXG4iKTsKKwkJbmFtZSA9ICJTZW5zb3JheSAyMjUwLzIyNTFcbiI7CisJCWJvYXJkID0gJmJvYXJkX3NlbnNvcmF5XzIyNTA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiZ283MDA3LXVzYjogdW5rbm93biBib2FyZCBJRCAlZCFcbiIsCiAJCQkJKHVuc2lnbmVkIGludClpZC0+ZHJpdmVyX2luZm8pOwogCQlyZXR1cm4gMDsKIAl9CiAKLQl1c2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ283MDA3X3VzYiksIEdGUF9LRVJORUwpOworCXVzYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnbzcwMDdfdXNiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVzYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQodXNiLCAwLCBzaXplb2Yoc3RydWN0IGdvNzAwN191c2IpKTsKIAogCS8qIEFsbG9jYXRlIHRoZSBVUkIgYW5kIGJ1ZmZlciBmb3IgcmVjZWl2aW5nIGluY29taW5nIGludGVycnVwdHMgKi8KIAl1c2ItPmludHJfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKQEAgLTExNzksNiArMTIyNSw3IEBACiB7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXN0cnVjdCBnbzcwMDdfdXNiICp1c2IgPSBnby0+aHBpX2NvbnRleHQ7CisJc3RydWN0IHVyYiAqdnVyYiwgKmF1cmI7CiAJaW50IGk7CiAKIAlnby0+c3RhdHVzID0gU1RBVFVTX1NIVVRET1dOOwpAQCAtMTE4NiwxNSArMTIzMywxOSBAQAogCiAJLyogRnJlZSBVU0ItcmVsYXRlZCBzdHJ1Y3RzICovCiAJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewotCQlpZiAodXNiLT52aWRlb191cmJzW2ldICE9IE5VTEwpIHsKLQkJCWlmICh1c2ItPnZpZGVvX3VyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlciAhPSBOVUxMKQotCQkJCWtmcmVlKHVzYi0+dmlkZW9fdXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJCXVzYl9mcmVlX3VyYih1c2ItPnZpZGVvX3VyYnNbaV0pOworCQl2dXJiID0gdXNiLT52aWRlb191cmJzW2ldOworCQlpZiAodnVyYikgeworCQkJdXNiX2tpbGxfdXJiKHZ1cmIpOworCQkJaWYgKHZ1cmItPnRyYW5zZmVyX2J1ZmZlcikKKwkJCQlrZnJlZSh2dXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiX2ZyZWVfdXJiKHZ1cmIpOwogCQl9Ci0JCWlmICh1c2ItPmF1ZGlvX3VyYnNbaV0gIT0gTlVMTCkgewotCQkJaWYgKHVzYi0+YXVkaW9fdXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyICE9IE5VTEwpCi0JCQkJa2ZyZWUodXNiLT5hdWRpb191cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIpOwotCQkJdXNiX2ZyZWVfdXJiKHVzYi0+YXVkaW9fdXJic1tpXSk7CisJCWF1cmIgPSB1c2ItPmF1ZGlvX3VyYnNbaV07CisJCWlmIChhdXJiKSB7CisJCQl1c2Jfa2lsbF91cmIoYXVyYik7CisJCQlpZiAoYXVyYi0+dHJhbnNmZXJfYnVmZmVyKQorCQkJCWtmcmVlKGF1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCQl1c2JfZnJlZV91cmIoYXVyYik7CiAJCX0KIAl9CiAJa2ZyZWUodXNiLT5pbnRyX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYwppbmRleCA5NGUxMTQxLi40ZjcyMzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy12NGwyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jCkBAIC0zOCw2ICszOCwxNCBAQAogI2luY2x1ZGUgImdvNzAwNy1wcml2LmgiCiAjaW5jbHVkZSAid2lzLWkyYy5oIgogCisvKiBUZW1wb3JhcnkgZGVmaW5lcyB1bnRpbCBhY2NlcHRlZCBpbiB2NGwtZHZiICovCisjaWZuZGVmIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU0KKyNkZWZpbmUJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTSAgIDYgLyogTVBFRyBlbGVtZW50YXJ5IHN0cmVhbSAqLworI2VuZGlmCisjaWZuZGVmIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQKKyNkZWZpbmUJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNCAgIDMKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBkZWFjdGl2YXRlX2J1ZmZlcihzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWYpCiB7CiAJaW50IGk7CkBAIC04MSw3ICs4OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ283MDA3X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGdvNzAwN19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CiAJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoOwpAQCAtOTksNyArMTA3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnbzcwMDdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgZ283MDA3X3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CkBAIC0zMTksNiArMzI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIDAKIHN0YXRpYyBpbnQgY2xpcF90b19tb2RldF9tYXAoc3RydWN0IGdvNzAwNyAqZ28sIGludCByZWdpb24sCiAJCXN0cnVjdCB2NGwyX2NsaXAgKmNsaXBfbGlzdCkKIHsKQEAgLTM3NSw0OTkgKzM4NCw4MDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnbzcwMDdfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgbXBlZ19xdWVyeWN0cmwodTMyIGlkLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0dmFsID0gMDsKKwlzdGF0aWMgY29uc3QgdTMyIHVzZXJfY3RybHNbXSA9IHsKKwkJVjRMMl9DSURfVVNFUl9DTEFTUywKKwkJMAorCX07CisJc3RhdGljIGNvbnN0IHUzMiBtcGVnX2N0cmxzW10gPSB7CisJCVY0TDJfQ0lEX01QRUdfQ0xBU1MsCisJCVY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEUsCisJCVY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcsCisJCVY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNULAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUsCisJCTAKKwl9OworCXN0YXRpYyBjb25zdCB1MzIgKmN0cmxfY2xhc3Nlc1tdID0geworCQl1c2VyX2N0cmxzLAorCQltcGVnX2N0cmxzLAorCQlOVUxMCisJfTsKIAotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfUVVFUllDQVA6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7Ci0KLQkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKLQkJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiZ283MDA3Iik7Ci0JCXN0cm5jcHkoY2FwLT5jYXJkLCBnby0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCQljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCA5LCA4KTsKLQkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKLQkJCQlWNEwyX0NBUF9TVFJFQU1JTkc7IC8qIHwgVjRMMl9DQVBfQVVESU87ICovCi0JCWlmIChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKQotCQkJY2FwLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9DQVBfVFVORVI7CisJLyogVGhlIGN0cmwgbWF5IGFscmVhZHkgY29udGFpbiB0aGUgcXVlcmllZCBpMmMgY29udHJvbHMsCisJICogcXVlcnkgdGhlIG1wZWcgY29udHJvbHMgaWYgdGhlIGV4aXN0aW5nIGN0cmwgaWQgaXMKKwkgKiBncmVhdGVyIHRoYW4gdGhlIG5leHQgbXBlZyBjdHJsIGlkLgorCSAqLworCWlkID0gdjRsMl9jdHJsX25leHQoY3RybF9jbGFzc2VzLCBpZCk7CisJaWYgKGlkID49IGN0cmwtPmlkICYmIGN0cmwtPm5hbWVbMF0pCiAJCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19FTlVNX0ZNVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGluZGV4OwotCQljaGFyICpkZXNjOwotCQl1MzIgcGl4ZWxmb3JtYXQ7CiAKLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3dpdGNoIChmbXQtPmluZGV4KSB7Ci0JCWNhc2UgMDoKLQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX01KUEVHOwotCQkJZGVzYyA9ICJNb3Rpb24tSlBFRyI7CisJbWVtc2V0KGN0cmwsIDAsIHNpemVvZigqY3RybCkpOworCWN0cmwtPmlkID0gaWQ7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOgorCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChjdHJsKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQsCisJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTSwgMSwKKwkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFR19FTEVNKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLAorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNCwgMSwKKwkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MSwKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDksIDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoY3RybCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLAorCQkJCTY0MDAwLAorCQkJCTEwMDAwMDAwLCAxLAorCQkJCTk4MDAwMDApOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBtcGVnX3NfY29udHJvbChzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsLCBzdHJ1Y3QgZ283MDA3ICpnbykKK3sKKwkvKiBwcmV0dHkgc3VyZSB3ZSBjYW4ndCBjaGFuZ2UgYW55IG9mIHRoZXNlIHdoaWxlIHN0cmVhbWluZyAqLworCWlmIChnby0+c3RyZWFtaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJc3dpdGNoIChjdHJsLT52YWx1ZSkgeworCQljYXNlIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQ6CisJCQlnby0+Zm9ybWF0ID0gR083MDA3X0ZPUk1BVF9NUEVHMjsKKwkJCWdvLT5iaXRyYXRlID0gOTgwMDAwMDsKKwkJCWdvLT5nb3Bfc2l6ZSA9IDE1OworCQkJZ28tPnBhbGkgPSAweDQ4OworCQkJZ28tPmNsb3NlZF9nb3AgPSAxOworCQkJZ28tPnJlcGVhdF9zZXFoZWFkID0gMDsKKwkJCWdvLT5zZXFfaGVhZGVyX2VuYWJsZSA9IDE7CisJCQlnby0+Z29wX2hlYWRlcl9lbmFibGUgPSAxOworCQkJZ28tPmR2ZF9tb2RlID0gMTsKIAkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlwaXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NUEVHOwotCQkJZGVzYyA9ICJNUEVHMS9NUEVHMi9NUEVHNCI7CisJCWNhc2UgVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTToKKwkJCS8qIHRvZG86ICovCiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWluZGV4ID0gZm10LT5pbmRleDsKLQkJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKLQkJZm10LT5pbmRleCA9IGluZGV4OwotCQlmbXQtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCWZtdC0+ZmxhZ3MgPSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQ7Ci0JCXN0cm5jcHkoZm10LT5kZXNjcmlwdGlvbiwgZGVzYywgc2l6ZW9mKGZtdC0+ZGVzY3JpcHRpb24pKTsKLQkJZm10LT5waXhlbGZvcm1hdCA9IHBpeGVsZm9ybWF0OwotCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19UUllfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7Ci0KLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKKwkJc3dpdGNoIChjdHJsLT52YWx1ZSkgeworCQljYXNlIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzE6CisJCQlnby0+Zm9ybWF0ID0gR083MDA3X0ZPUk1BVF9NUEVHMTsKKwkJCWdvLT5wYWxpID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzI6CisJCQlnby0+Zm9ybWF0ID0gR083MDA3X0ZPUk1BVF9NUEVHMjsKKwkJCS8qaWYgKG1wZWctPnBhbGkgPj4gMjQgPT0gMikKKwkJCQlnby0+cGFsaSA9IG1wZWctPnBhbGkgJiAweGZmOworCQkJZWxzZSovCisJCQkJZ28tPnBhbGkgPSAweDQ4OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNDoKKwkJCWdvLT5mb3JtYXQgPSBHTzcwMDdfRk9STUFUX01QRUc0OworCQkJLyppZiAobXBlZy0+cGFsaSA+PiAyNCA9PSA0KQorCQkJCWdvLT5wYWxpID0gbXBlZy0+cGFsaSAmIDB4ZmY7CisJCQllbHNlKi8KKwkJCQlnby0+cGFsaSA9IDB4ZjU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gc2V0X2NhcHR1cmVfc2l6ZShnbywgZm10LCAxKTsKLQl9Ci0JY2FzZSBWSURJT0NfR19GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKLQotCQlpZiAoZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJfQorCQlnby0+Z29wX2hlYWRlcl9lbmFibGUgPQorCQkJLyptcGVnLT5mbGFncyAmIEdPNzAwN19NUEVHX09NSVRfR09QX0hFQURFUgorCQkJPyAwIDoqLyAxOworCQkvKmlmIChtcGVnLT5mbGFncyAmIEdPNzAwN19NUEVHX1JFUEVBVF9TRVFIRUFERVIpCisJCQlnby0+cmVwZWF0X3NlcWhlYWQgPSAxOworCQllbHNlKi8KKwkJCWdvLT5yZXBlYXRfc2VxaGVhZCA9IDA7CisJCWdvLT5kdmRfbW9kZSA9IDA7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJCWlmIChnby0+Zm9ybWF0ID09IEdPNzAwN19GT1JNQVRfTUpQRUcpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKLQkJZm10LT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlmbXQtPmZtdC5waXgud2lkdGggPSBnby0+d2lkdGg7Ci0JCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSBnby0+aGVpZ2h0OwotCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBnby0+Zm9ybWF0ID09IEdPNzAwN19GT1JNQVRfTUpQRUcgPwotCQkJVjRMMl9QSVhfRk1UX01KUEVHIDogVjRMMl9QSVhfRk1UX01QRUc7Ci0JCWZtdC0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKLQkJZm10LT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IDA7Ci0JCWZtdC0+Zm10LnBpeC5zaXplaW1hZ2UgPSBHTzcwMDdfQlVGX1NJWkU7Ci0JCWZtdC0+Zm10LnBpeC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsgLyogPz8gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7Ci0KLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXN3aXRjaCAoY3RybC0+dmFsdWUpIHsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MToKKwkJCWdvLT5hc3BlY3RfcmF0aW8gPSBHTzcwMDdfUkFUSU9fMV8xOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDM6CisJCQlnby0+YXNwZWN0X3JhdGlvID0gR083MDA3X1JBVElPXzRfMzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OToKKwkJCWdvLT5hc3BlY3RfcmF0aW8gPSBHTzcwMDdfUkFUSU9fMTZfOTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMjIxeDEwMDoKKwkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoZ28tPnN0cmVhbWluZykKLQkJCXJldHVybiAtRUJVU1k7Ci0JCXJldHVybiBzZXRfY2FwdHVyZV9zaXplKGdvLCBmbXQsIDApOwotCX0KLQljYXNlIFZJRElPQ19HX0ZCVUY6Ci0JY2FzZSBWSURJT0NfU19GQlVGOgorCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKKwkJZ28tPmdvcF9zaXplID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKKwkJaWYgKGN0cmwtPnZhbHVlICE9IDAgJiYgY3RybC0+dmFsdWUgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlnby0+Y2xvc2VkX2dvcCA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKKwkJLyogVXBwZXIgYm91bmQgaXMga2luZCBvZiBhcmJpdHJhcnkgaGVyZSAqLworCQlpZiAoY3RybC0+dmFsdWUgPCA2NDAwMCB8fCBjdHJsLT52YWx1ZSA+IDEwMDAwMDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvLT5iaXRyYXRlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCWNhc2UgVklESU9DX1JFUUJVRlM6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxID0gYXJnOwotCQl1bnNpZ25lZCBpbnQgY291bnQsIGk7CisJfQorCXJldHVybiAwOworfQogCi0JCWlmIChnby0+c3RyZWFtaW5nKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKHJlcS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKLQkJCQlyZXEtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorc3RhdGljIGludCBtcGVnX2dfY29udHJvbChzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsLCBzdHJ1Y3QgZ283MDA3ICpnbykKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgorCQlpZiAoZ28tPmR2ZF9tb2RlKQorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZEOworCQllbHNlCisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU07CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKKwkJc3dpdGNoIChnby0+Zm9ybWF0KSB7CisJCWNhc2UgR083MDA3X0ZPUk1BVF9NUEVHMToKKwkJCWN0cmwtPnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMTsKKwkJCWJyZWFrOworCQljYXNlIEdPNzAwN19GT1JNQVRfTVBFRzI6CisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzI7CisJCQlicmVhazsKKwkJY2FzZSBHTzcwMDdfRk9STUFUX01QRUc0OgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR180OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgorCQlzd2l0Y2ggKGdvLT5hc3BlY3RfcmF0aW8pIHsKKwkJY2FzZSBHTzcwMDdfUkFUSU9fMV8xOgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MTsKKwkJCWJyZWFrOworCQljYXNlIEdPNzAwN19SQVRJT180XzM6CisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzOworCQkJYnJlYWs7CisJCWNhc2UgR083MDA3X1JBVElPXzE2Xzk6CisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOgorCQljdHJsLT52YWx1ZSA9IGdvLT5nb3Bfc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgorCQljdHJsLT52YWx1ZSA9IGdvLT5jbG9zZWRfZ29wOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKKwkJY3RybC0+dmFsdWUgPSBnby0+Yml0cmF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCiAKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCXJldHZhbCA9IC1FQlVTWTsKLQkJZm9yIChpID0gMDsgaSA8IGdvZmgtPmJ1Zl9jb3VudDsgKytpKQotCQkJaWYgKGdvZmgtPmJ1ZnNbaV0ubWFwcGVkID4gMCkKLQkJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlkb3duKCZnby0+aHdfbG9jayk7Ci0JCWlmIChnby0+aW5fdXNlID4gMCAmJiBnb2ZoLT5idWZfY291bnQgPT0gMCkgeworc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJc3RybGNweShjYXAtPmRyaXZlciwgImdvNzAwNyIsIHNpemVvZihjYXAtPmRyaXZlcikpOworCXN0cmxjcHkoY2FwLT5jYXJkLCBnby0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworI2lmIDAKKwlzdHJsY3B5KGNhcC0+YnVzX2luZm8sIGRldl9uYW1lKCZkZXYtPnVkZXYtPmRldiksIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CisjZW5kaWYKKworCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDksIDgpOworCisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCSAgICBWNEwyX0NBUF9TVFJFQU1JTkc7IC8qIHwgVjRMMl9DQVBfQVVESU87ICovCisKKwlpZiAoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikKKwkJY2FwLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9DQVBfVFVORVI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKK3sKKwljaGFyICpkZXNjID0gTlVMTDsKKworCXN3aXRjaCAoZm10LT5pbmRleCkgeworCWNhc2UgMDoKKwkJZm10LT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NSlBFRzsKKwkJZGVzYyA9ICJNb3Rpb24tSlBFRyI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZm10LT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NUEVHOworCQlkZXNjID0gIk1QRUcxL01QRUcyL01QRUc0IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZtdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlmbXQtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOworCisJc3RybmNweShmbXQtPmRlc2NyaXB0aW9uLCBkZXNjLCBzaXplb2YoZm10LT5kZXNjcmlwdGlvbikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWZtdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlmbXQtPmZtdC5waXgud2lkdGggPSBnby0+d2lkdGg7CisJZm10LT5mbXQucGl4LmhlaWdodCA9IGdvLT5oZWlnaHQ7CisJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gKGdvLT5mb3JtYXQgPT0gR083MDA3X0ZPUk1BVF9NSlBFRykgPworCQkJCSAgIFY0TDJfUElYX0ZNVF9NSlBFRyA6IFY0TDJfUElYX0ZNVF9NUEVHOworCWZtdC0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlmbXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gMDsKKwlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0gR083MDA3X0JVRl9TSVpFOworCWZtdC0+Zm10LnBpeC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlyZXR1cm4gc2V0X2NhcHR1cmVfc2l6ZShnbywgZm10LCAxKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChnby0+c3RyZWFtaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIHNldF9jYXB0dXJlX3NpemUoZ28sIGZtdCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCWludCByZXR2YWwgPSAtRUJVU1k7CisJdW5zaWduZWQgaW50IGNvdW50LCBpOworCisJaWYgKGdvLT5zdHJlYW1pbmcpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAocmVxLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAorCQkJcmVxLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ29maC0+YnVmX2NvdW50OyArK2kpCisJCWlmIChnb2ZoLT5idWZzW2ldLm1hcHBlZCA+IDApCisJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCisJZG93bigmZ28tPmh3X2xvY2spOworCWlmIChnby0+aW5fdXNlID4gMCAmJiBnb2ZoLT5idWZfY291bnQgPT0gMCkgeworCQl1cCgmZ28tPmh3X2xvY2spOworCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCX0KKworCWlmIChnb2ZoLT5idWZfY291bnQgPiAwKQorCQlrZnJlZShnb2ZoLT5idWZzKTsKKworCXJldHZhbCA9IC1FTk9NRU07CisJY291bnQgPSByZXEtPmNvdW50OworCWlmIChjb3VudCA+IDApIHsKKwkJaWYgKGNvdW50IDwgMikKKwkJCWNvdW50ID0gMjsKKwkJaWYgKGNvdW50ID4gMzIpCisJCQljb3VudCA9IDMyOworCisJCWdvZmgtPmJ1ZnMgPSBrbWFsbG9jKGNvdW50ICogc2l6ZW9mKHN0cnVjdCBnbzcwMDdfYnVmZmVyKSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCisJCWlmICghZ29maC0+YnVmcykgewogCQkJdXAoJmdvLT5od19sb2NrKTsKIAkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAJCX0KLQkJaWYgKGdvZmgtPmJ1Zl9jb3VudCA+IDApCi0JCQlrZnJlZShnb2ZoLT5idWZzKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJY291bnQgPSByZXEtPmNvdW50OwotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQlpZiAoY291bnQgPCAyKQotCQkJCWNvdW50ID0gMjsKLQkJCWlmIChjb3VudCA+IDMyKQotCQkJCWNvdW50ID0gMzI7Ci0JCQlnb2ZoLT5idWZzID0ga21hbGxvYyhjb3VudCAqCi0JCQkJCQlzaXplb2Yoc3RydWN0IGdvNzAwN19idWZmZXIpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJCWlmIChnb2ZoLT5idWZzID09IE5VTEwpIHsKLQkJCQl1cCgmZ28tPmh3X2xvY2spOwotCQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQl9Ci0JCQltZW1zZXQoZ29maC0+YnVmcywgMCwKLQkJCQkJY291bnQgKiBzaXplb2Yoc3RydWN0IGdvNzAwN19idWZmZXIpKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQkJZ29maC0+YnVmc1tpXS5nbyA9IGdvOwotCQkJCWdvZmgtPmJ1ZnNbaV0uaW5kZXggPSBpOwotCQkJCWdvZmgtPmJ1ZnNbaV0uc3RhdGUgPSBCVUZfU1RBVEVfSURMRTsKLQkJCQlnb2ZoLT5idWZzW2ldLm1hcHBlZCA9IDA7Ci0JCQl9Ci0JCQlnby0+aW5fdXNlID0gMTsKLQkJfSBlbHNlIHsKLQkJCWdvLT5pbl91c2UgPSAwOworCisJCW1lbXNldChnb2ZoLT5idWZzLCAwLCBjb3VudCAqIHNpemVvZihzdHJ1Y3QgZ283MDA3X2J1ZmZlcikpOworCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQlnb2ZoLT5idWZzW2ldLmdvID0gZ287CisJCQlnb2ZoLT5idWZzW2ldLmluZGV4ID0gaTsKKwkJCWdvZmgtPmJ1ZnNbaV0uc3RhdGUgPSBCVUZfU1RBVEVfSURMRTsKKwkJCWdvZmgtPmJ1ZnNbaV0ubWFwcGVkID0gMDsKIAkJfQotCQlnb2ZoLT5idWZfY291bnQgPSBjb3VudDsKLQkJdXAoJmdvLT5od19sb2NrKTsKLQkJdXAoJmdvZmgtPmxvY2spOwotCQltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOwotCQlyZXEtPmNvdW50ID0gY291bnQ7Ci0JCXJlcS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJcmVxLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQlyZXR1cm4gMDsKKworCQlnby0+aW5fdXNlID0gMTsKKwl9IGVsc2UgeworCQlnby0+aW5fdXNlID0gMDsKIAl9Ci0JY2FzZSBWSURJT0NfUVVFUllCVUY6Ci0JewotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGluZGV4OwogCi0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWluZGV4ID0gYnVmLT5pbmRleDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCWlmIChpbmRleCA+PSBnb2ZoLT5idWZfY291bnQpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOwotCQlidWYtPmluZGV4ID0gaW5kZXg7Ci0JCWJ1Zi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJc3dpdGNoIChnb2ZoLT5idWZzW2luZGV4XS5zdGF0ZSkgewotCQljYXNlIEJVRl9TVEFURV9RVUVVRUQ6Ci0JCQlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBCVUZfU1RBVEVfRE9ORToKLQkJCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX0RPTkU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJ1Zi0+ZmxhZ3MgPSAwOwotCQl9Ci0JCWlmIChnb2ZoLT5idWZzW2luZGV4XS5tYXBwZWQpCi0JCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCQlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JCWJ1Zi0+bS5vZmZzZXQgPSBpbmRleCAqIEdPNzAwN19CVUZfU0laRTsKLQkJYnVmLT5sZW5ndGggPSBHTzcwMDdfQlVGX1NJWkU7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKKwlnb2ZoLT5idWZfY291bnQgPSBjb3VudDsKKwl1cCgmZ28tPmh3X2xvY2spOworCXVwKCZnb2ZoLT5sb2NrKTsKIAotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfUUJVRjoKLQl7Ci0JCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOwotCQlzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWY7Ci0JCWludCByZXQ7CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKIAotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAotCQkJCWJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCWlmIChidWYtPmluZGV4IDwgMCB8fCBidWYtPmluZGV4ID49IGdvZmgtPmJ1Zl9jb3VudCkKLQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCWdvYnVmID0gJmdvZmgtPmJ1ZnNbYnVmLT5pbmRleF07Ci0JCWlmIChnb2J1Zi0+bWFwcGVkID09IDApCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCWlmIChnb2J1Zi0+c3RhdGUgIT0gQlVGX1NUQVRFX0lETEUpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQkvKiBvZmZzZXQgd2lsbCBiZSAwIHVudGlsIHdlIHJlYWxseSBzdXBwb3J0IFVTRVJQVFIgc3RyZWFtaW5nICovCi0JCWdvYnVmLT5vZmZzZXQgPSBnb2J1Zi0+dXNlcl9hZGRyICYgflBBR0VfTUFTSzsKLQkJZ29idWYtPmJ5dGVzdXNlZCA9IDA7Ci0JCWdvYnVmLT5mcmFtZV9vZmZzZXQgPSAwOwotCQlnb2J1Zi0+bW9kZXRfYWN0aXZlID0gMDsKLQkJaWYgKGdvYnVmLT5vZmZzZXQgPiAwKQotCQkJZ29idWYtPnBhZ2VfY291bnQgPSBHTzcwMDdfQlVGX1BBR0VTICsgMTsKLQkJZWxzZQotCQkJZ29idWYtPnBhZ2VfY291bnQgPSBHTzcwMDdfQlVGX1BBR0VTOwotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLAotCQkJCWdvYnVmLT51c2VyX2FkZHIgJiBQQUdFX01BU0ssIGdvYnVmLT5wYWdlX2NvdW50LAotCQkJCTEsIDEsIGdvYnVmLT5wYWdlcywgTlVMTCk7Ci0JCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JCWlmIChyZXQgIT0gZ29idWYtPnBhZ2VfY291bnQpIHsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IHJldDsgKytpKQotCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShnb2J1Zi0+cGFnZXNbaV0pOwotCQkJZ29idWYtPnBhZ2VfY291bnQgPSAwOwotCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJfQotCQlnb2J1Zi0+c3RhdGUgPSBCVUZfU1RBVEVfUVVFVUVEOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmdvYnVmLT5zdHJlYW0sICZnby0+c3RyZWFtKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0RRQlVGOgotCXsKLQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYgPSBhcmc7Ci0JCXN0cnVjdCBnbzcwMDdfYnVmZmVyICpnb2J1ZjsKLQkJdTMyIGZyYW1lX3R5cGVfZmxhZzsKLQkJREVGSU5FX1dBSVQod2FpdCk7CisJcmVxLT5jb3VudCA9IGNvdW50OworCXJlcS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlyZXEtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CiAKLQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWlmIChsaXN0X2VtcHR5KCZnby0+c3RyZWFtKSkKLQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCWdvYnVmID0gbGlzdF9lbnRyeShnby0+c3RyZWFtLm5leHQsCi0JCQkJc3RydWN0IGdvNzAwN19idWZmZXIsIHN0cmVhbSk7Ci0JCXJldHZhbCA9IC1FQUdBSU47Ci0JCWlmIChnb2J1Zi0+c3RhdGUgIT0gQlVGX1NUQVRFX0RPTkUgJiYKLQkJCQkhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgewotCQkJZm9yICg7OykgewotCQkJCXByZXBhcmVfdG9fd2FpdCgmZ28tPmZyYW1lX3dhaXRxLCAmd2FpdCwKLQkJCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJaWYgKGdvYnVmLT5zdGF0ZSA9PSBCVUZfU1RBVEVfRE9ORSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXNjaGVkdWxlKCk7Ci0JCQl9Ci0JCQlmaW5pc2hfd2FpdCgmZ28tPmZyYW1lX3dhaXRxLCAmd2FpdCk7Ci0JCX0KLQkJaWYgKGdvYnVmLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRE9ORSkKLQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZnby0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJZGVhY3RpdmF0ZV9idWZmZXIoZ29idWYpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnby0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJZnJhbWVfdHlwZV9mbGFnID0gZ2V0X2ZyYW1lX3R5cGVfZmxhZyhnb2J1ZiwgZ28tPmZvcm1hdCk7Ci0JCWdvYnVmLT5zdGF0ZSA9IEJVRl9TVEFURV9JRExFOwotCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOwotCQlidWYtPmluZGV4ID0gZ29idWYtPmluZGV4OwotCQlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCWJ1Zi0+Ynl0ZXN1c2VkID0gZ29idWYtPmJ5dGVzdXNlZDsKLQkJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEIHwgZnJhbWVfdHlwZV9mbGFnOwotCQlidWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCQlidWYtPnRpbWVzdGFtcCA9IGdvYnVmLT50aW1lc3RhbXA7Ci0JCWJ1Zi0+c2VxdWVuY2UgPSBnb2J1Zi0+c2VxOwotCQlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JCWJ1Zi0+bS5vZmZzZXQgPSBnb2J1Zi0+aW5kZXggKiBHTzcwMDdfQlVGX1NJWkU7Ci0JCWJ1Zi0+bGVuZ3RoID0gR083MDA3X0JVRl9TSVpFOwotCQlidWYtPnJlc2VydmVkID0gZ29idWYtPm1vZGV0X2FjdGl2ZTsKLQkJdXAoJmdvZmgtPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU1RSRUFNT046Ci0JewotCQl1bnNpZ25lZCBpbnQgKnR5cGUgPSBhcmc7CisJcmV0dXJuIDA7CiAKLQkJaWYgKCp0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlkb3duKCZnb2ZoLT5sb2NrKTsKLQkJZG93bigmZ28tPmh3X2xvY2spOwotCQlpZiAoIWdvLT5zdHJlYW1pbmcpIHsKLQkJCWdvLT5zdHJlYW1pbmcgPSAxOwotCQkJZ28tPm5leHRfc2VxID0gMDsKLQkJCWdvLT5hY3RpdmVfYnVmID0gTlVMTDsKLQkJCWlmIChnbzcwMDdfc3RhcnRfZW5jb2RlcihnbykgPCAwKQotCQkJCXJldHZhbCA9IC1FSU87Ci0JCQllbHNlCi0JCQkJcmV0dmFsID0gMDsKLQkJfQotCQl1cCgmZ28tPmh3X2xvY2spOwotCQl1cCgmZ29maC0+bG9jayk7Cit1bmxvY2tfYW5kX3JldHVybjoKKwl1cCgmZ29maC0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCWludCByZXR2YWwgPSAtRUlOVkFMOworCXVuc2lnbmVkIGludCBpbmRleDsKKworCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gcmV0dmFsOwotCX0KLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JewotCQl1bnNpZ25lZCBpbnQgKnR5cGUgPSBhcmc7CiAKLQkJaWYgKCp0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlkb3duKCZnb2ZoLT5sb2NrKTsKLQkJZ283MDA3X3N0cmVhbW9mZihnbyk7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybCA9IGFyZzsKLQkJdTMyIGlkOworCWluZGV4ID0gYnVmLT5pbmRleDsKIAotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJaWQgPSBjdHJsLT5pZDsKLQkJbWVtc2V0KGN0cmwsIDAsIHNpemVvZigqY3RybCkpOwotCQljdHJsLT5pZCA9IGlkOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsIGFyZyk7Ci0JCXJldHVybiBjdHJsLT5uYW1lWzBdID09IDAgPyAtRUlOVkFMIDogMDsKLQl9Ci0JY2FzZSBWSURJT0NfR19DVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsIHF1ZXJ5OworCWRvd24oJmdvZmgtPmxvY2spOworCWlmIChpbmRleCA+PSBnb2ZoLT5idWZfY291bnQpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAKLQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbXNldCgmcXVlcnksIDAsIHNpemVvZihxdWVyeSkpOwotCQlxdWVyeS5pZCA9IGN0cmwtPmlkOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsICZxdWVyeSk7Ci0JCWlmIChxdWVyeS5uYW1lWzBdID09IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19DVFJMLCBhcmcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19DVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsIHF1ZXJ5OworCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CisJYnVmLT5pbmRleCA9IGluZGV4OworCWJ1Zi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJbWVtc2V0KCZxdWVyeSwgMCwgc2l6ZW9mKHF1ZXJ5KSk7Ci0JCXF1ZXJ5LmlkID0gY3RybC0+aWQ7Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1FVRVJZQ1RSTCwgJnF1ZXJ5KTsKLQkJaWYgKHF1ZXJ5Lm5hbWVbMF0gPT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0NUUkwsIGFyZyk7Ci0JCXJldHVybiAwOworCXN3aXRjaCAoZ29maC0+YnVmc1tpbmRleF0uc3RhdGUpIHsKKwljYXNlIEJVRl9TVEFURV9RVUVVRUQ6CisJCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJYnJlYWs7CisJY2FzZSBCVUZfU1RBVEVfRE9ORToKKwkJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnVmLT5mbGFncyA9IDA7CiAJfQotCWNhc2UgVklESU9DX0dfUEFSTToKLQl7Ci0JCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0gPSBhcmc7Ci0JCXN0cnVjdCB2NGwyX2ZyYWN0IHRpbWVwZXJmcmFtZSA9IHsKLQkJCS5udW1lcmF0b3IgPSAxMDAxICogIGdvLT5mcHNfc2NhbGUsCi0JCQkuZGVub21pbmF0b3IgPSBnby0+c2Vuc29yX2ZyYW1lcmF0ZSwKLQkJfTsKIAotCQlpZiAocGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KHBhcm0sIDAsIHNpemVvZigqcGFybSkpOwotCQlwYXJtLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlwYXJtLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSB8PSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7Ci0JCXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUgPSB0aW1lcGVyZnJhbWU7Ci0JCXJldHVybiAwOworCWlmIChnb2ZoLT5idWZzW2luZGV4XS5tYXBwZWQpCisJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7CisJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCWJ1Zi0+bS5vZmZzZXQgPSBpbmRleCAqIEdPNzAwN19CVUZfU0laRTsKKwlidWYtPmxlbmd0aCA9IEdPNzAwN19CVUZfU0laRTsKKwl1cCgmZ29maC0+bG9jayk7CisKKwlyZXR1cm4gMDsKKwordW5sb2NrX2FuZF9yZXR1cm46CisJdXAoJmdvZmgtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKwlpbnQgcmV0OworCisJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwkJCWJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJCXJldHVybiByZXR2YWw7CisKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBnb2ZoLT5idWZfY291bnQpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisKKwlnb2J1ZiA9ICZnb2ZoLT5idWZzW2J1Zi0+aW5kZXhdOworCWlmICghZ29idWYtPm1hcHBlZCkKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKworCXJldHZhbCA9IC1FQlVTWTsKKwlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9JRExFKQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCisJLyogb2Zmc2V0IHdpbGwgYmUgMCB1bnRpbCB3ZSByZWFsbHkgc3VwcG9ydCBVU0VSUFRSIHN0cmVhbWluZyAqLworCWdvYnVmLT5vZmZzZXQgPSBnb2J1Zi0+dXNlcl9hZGRyICYgflBBR0VfTUFTSzsKKwlnb2J1Zi0+Ynl0ZXN1c2VkID0gMDsKKwlnb2J1Zi0+ZnJhbWVfb2Zmc2V0ID0gMDsKKwlnb2J1Zi0+bW9kZXRfYWN0aXZlID0gMDsKKwlpZiAoZ29idWYtPm9mZnNldCA+IDApCisJCWdvYnVmLT5wYWdlX2NvdW50ID0gR083MDA3X0JVRl9QQUdFUyArIDE7CisJZWxzZQorCQlnb2J1Zi0+cGFnZV9jb3VudCA9IEdPNzAwN19CVUZfUEFHRVM7CisKKwlyZXR2YWwgPSAtRU5PTUVNOworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwKKwkJCWdvYnVmLT51c2VyX2FkZHIgJiBQQUdFX01BU0ssIGdvYnVmLT5wYWdlX2NvdW50LAorCQkJMSwgMSwgZ29idWYtPnBhZ2VzLCBOVUxMKTsKKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKHJldCAhPSBnb2J1Zi0+cGFnZV9jb3VudCkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHJldDsgKytpKQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGdvYnVmLT5wYWdlc1tpXSk7CisJCWdvYnVmLT5wYWdlX2NvdW50ID0gMDsKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKIAl9Ci0JY2FzZSBWSURJT0NfU19QQVJNOgotCXsKLQkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSA9IGFyZzsKLQkJdW5zaWduZWQgaW50IG4sIGQ7CiAKLQkJaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChwYXJtLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQluID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUgKgotCQkJcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3I7Ci0JCWQgPSAxMDAxICogcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvcjsKLQkJaWYgKG4gIT0gMCAmJiBkICE9IDAgJiYgbiA+IGQpCi0JCQlnby0+ZnBzX3NjYWxlID0gKG4gKyBkLzIpIC8gZDsKLQkJZWxzZQotCQkJZ28tPmZwc19zY2FsZSA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19FTlVNU1REOgotCXsKLQkJc3RydWN0IHY0bDJfc3RhbmRhcmQgKnN0ZCA9IGFyZzsKKwlnb2J1Zi0+c3RhdGUgPSBCVUZfU1RBVEVfUVVFVUVEOworCXNwaW5fbG9ja19pcnFzYXZlKCZnby0+c3BpbmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZnb2J1Zi0+c3RyZWFtLCAmZ28tPnN0cmVhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7CisJdXAoJmdvZmgtPmxvY2spOwogCi0JCWlmICgoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikgJiYKLQkJCQlnby0+aW5wdXQgPT0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMgLSAxKSB7Ci0JCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCQlWSURJT0NfRU5VTVNURCwgYXJnKTsKLQkJCWlmICghc3RkLT5pZCkgLyogaGFjayB0byBpbmRpY2F0ZSBFSU5WQUwgZnJvbSB0dW5lciAqLwotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9IGVsc2UgaWYgKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKSB7Ci0JCQlzd2l0Y2ggKHN0ZC0+aW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQl2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RkLAotCQkJCQkJVjRMMl9TVERfTlRTQywgIk5UU0MiKTsKKwlyZXR1cm4gMDsKKwordW5sb2NrX2FuZF9yZXR1cm46CisJdXAoJmdvZmgtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWY7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZnJhbWVfdHlwZV9mbGFnOworCURFRklORV9XQUlUKHdhaXQpOworCisJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiByZXR2YWw7CisJaWYgKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJCXJldHVybiByZXR2YWw7CisKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmZ28tPnN0cmVhbSkpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisJZ29idWYgPSBsaXN0X2VudHJ5KGdvLT5zdHJlYW0ubmV4dCwKKwkJCXN0cnVjdCBnbzcwMDdfYnVmZmVyLCBzdHJlYW0pOworCisJcmV0dmFsID0gLUVBR0FJTjsKKwlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9ET05FICYmCisJCQkhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQlmb3IgKDs7KSB7CisJCQlwcmVwYXJlX3RvX3dhaXQoJmdvLT5mcmFtZV93YWl0cSwgJndhaXQsCisJCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoZ29idWYtPnN0YXRlID09IEJVRl9TVEFURV9ET05FKQogCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdChzdGQsCi0JCQkJCQlWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSwKLQkJCQkJCSJQQUwvU0VDQU0iKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc3RkLT5pbmRleCAhPSAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJbWVtc2V0KHN0ZCwgMCwgc2l6ZW9mKCpzdGQpKTsKLQkJCXNucHJpbnRmKHN0ZC0+bmFtZSwgc2l6ZW9mKHN0ZC0+bmFtZSksICIlZHglZCwgJWRmcHMiLAotCQkJCWdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGgsCi0JCQkJZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQsCi0JCQkJZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mcmFtZXJhdGUgLyAxMDAwKTsKLQkJCXN0ZC0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTAwMTsKLQkJCXN0ZC0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPQotCQkJCQlnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZyYW1lcmF0ZTsKKwkJCXNjaGVkdWxlKCk7CiAJCX0KLQkJcmV0dXJuIDA7CisJCWZpbmlzaF93YWl0KCZnby0+ZnJhbWVfd2FpdHEsICZ3YWl0KTsKIAl9Ci0JY2FzZSBWSURJT0NfR19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCWlmIChnb2J1Zi0+c3RhdGUgIT0gQlVGX1NUQVRFX0RPTkUpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAKLQkJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgotCQkJCWdvLT5pbnB1dCA9PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cyAtIDEpIHsKLQkJCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwKLQkJCQkJCVZJRElPQ19HX1NURCwgYXJnKTsKLQkJfSBlbHNlIGlmIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikgewotCQkJaWYgKGdvLT5zdGFuZGFyZCA9PSBHTzcwMDdfU1REX05UU0MpCi0JCQkJKnN0ZCA9IFY0TDJfU1REX05UU0M7Ci0JCQllbHNlCi0JCQkJKnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNOwotCQl9IGVsc2UKLQkJCSpzdGQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCXNwaW5fbG9ja19pcnFzYXZlKCZnby0+c3BpbmxvY2ssIGZsYWdzKTsKKwlkZWFjdGl2YXRlX2J1ZmZlcihnb2J1Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7CisJZnJhbWVfdHlwZV9mbGFnID0gZ2V0X2ZyYW1lX3R5cGVfZmxhZyhnb2J1ZiwgZ28tPmZvcm1hdCk7CisJZ29idWYtPnN0YXRlID0gQlVGX1NUQVRFX0lETEU7CiAKLQkJaWYgKGdvLT5zdHJlYW1pbmcpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikgJiYKLQkJCQkqc3RkICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCpzdGQgPT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpICYmCi0JCQkJZ28tPmlucHV0ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkgewotCQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJCXJldHVybiAtRUlPOwotCQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLAotCQkJCQkJVklESU9DX1NfU1RELCBhcmcpOwotCQkJaWYgKCEqc3RkKSAvKiBoYWNrIHRvIGluZGljYXRlIEVJTlZBTCBmcm9tIHR1bmVyICovCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKCpzdGQgJiBWNEwyX1NURF9OVFNDKSB7Ci0JCQlnby0+c3RhbmRhcmQgPSBHTzcwMDdfU1REX05UU0M7Ci0JCQlnby0+c2Vuc29yX2ZyYW1lcmF0ZSA9IDMwMDAwOwotCQl9IGVsc2UgaWYgKCpzdGQgJiBWNEwyX1NURF9QQUwpIHsKLQkJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfUEFMOwotCQkJZ28tPnNlbnNvcl9mcmFtZXJhdGUgPSAyNTAyNTsKLQkJfSBlbHNlIGlmICgqc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKLQkJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfUEFMOwotCQkJZ28tPnNlbnNvcl9mcmFtZXJhdGUgPSAyNTAyNTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCSAgICBWSURJT0NfU19TVEQsIHN0ZCk7Ci0JCXNldF9jYXB0dXJlX3NpemUoZ28sIE5VTEwsIDApOwotCQlyZXR1cm4gMDsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCWJ1Zi0+aW5kZXggPSBnb2J1Zi0+aW5kZXg7CisJYnVmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWJ1Zi0+Ynl0ZXN1c2VkID0gZ29idWYtPmJ5dGVzdXNlZDsKKwlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQgfCBmcmFtZV90eXBlX2ZsYWc7CisJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlidWYtPnRpbWVzdGFtcCA9IGdvYnVmLT50aW1lc3RhbXA7CisJYnVmLT5zZXF1ZW5jZSA9IGdvYnVmLT5zZXE7CisJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCWJ1Zi0+bS5vZmZzZXQgPSBnb2J1Zi0+aW5kZXggKiBHTzcwMDdfQlVGX1NJWkU7CisJYnVmLT5sZW5ndGggPSBHTzcwMDdfQlVGX1NJWkU7CisJYnVmLT5yZXNlcnZlZCA9IGdvYnVmLT5tb2RldF9hY3RpdmU7CisKKwl1cCgmZ29maC0+bG9jayk7CisJcmV0dXJuIDA7CisKK3VubG9ja19hbmRfcmV0dXJuOgorCXVwKCZnb2ZoLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCWludCByZXR2YWwgPSAwOworCisJaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmdvZmgtPmxvY2spOworCWRvd24oJmdvLT5od19sb2NrKTsKKworCWlmICghZ28tPnN0cmVhbWluZykgeworCQlnby0+c3RyZWFtaW5nID0gMTsKKwkJZ28tPm5leHRfc2VxID0gMDsKKwkJZ28tPmFjdGl2ZV9idWYgPSBOVUxMOworCQlpZiAoZ283MDA3X3N0YXJ0X2VuY29kZXIoZ28pIDwgMCkKKwkJCXJldHZhbCA9IC1FSU87CisJCWVsc2UKKwkJCXJldHZhbCA9IDA7CiAJfQorCXVwKCZnby0+aHdfbG9jayk7CisJdXAoJmdvZmgtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWRvd24oJmdvZmgtPmxvY2spOworCWdvNzAwN19zdHJlYW1vZmYoZ28pOworCXVwKCZnb2ZoLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnF1ZXJ5KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsIHF1ZXJ5KTsKKworCXJldHVybiAoIXF1ZXJ5LT5uYW1lWzBdKSA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJc3RydWN0IHY0bDJfcXVlcnljdHJsIHF1ZXJ5OworCisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCW1lbXNldCgmcXVlcnksIDAsIHNpemVvZihxdWVyeSkpOworCXF1ZXJ5LmlkID0gY3RybC0+aWQ7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfUVVFUllDVFJMLCAmcXVlcnkpOworCWlmIChxdWVyeS5uYW1lWzBdID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfQ1RSTCwgY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKKworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwltZW1zZXQoJnF1ZXJ5LCAwLCBzaXplb2YocXVlcnkpKTsKKwlxdWVyeS5pZCA9IGN0cmwtPmlkOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1FVRVJZQ1RSTCwgJnF1ZXJ5KTsKKwlpZiAocXVlcnkubmFtZVswXSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0NUUkwsIGN0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJc3RydWN0IHY0bDJfZnJhY3QgdGltZXBlcmZyYW1lID0geworCQkubnVtZXJhdG9yID0gMTAwMSAqICBnby0+ZnBzX3NjYWxlLAorCQkuZGVub21pbmF0b3IgPSBnby0+c2Vuc29yX2ZyYW1lcmF0ZSwKKwl9OworCisJaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhcm0tPnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5IHw9IFY0TDJfQ0FQX1RJTUVQRVJGUkFNRTsKKwlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lID0gdGltZXBlcmZyYW1lOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJdW5zaWduZWQgaW50IG4sIGQ7CisKKwlpZiAocGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwYXJtLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUgKgorCQlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvcjsKKwlkID0gMTAwMSAqIHBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7CisJaWYgKG4gIT0gMCAmJiBkICE9IDAgJiYgbiA+IGQpCisJCWdvLT5mcHNfc2NhbGUgPSAobiArIGQvMikgLyBkOworCWVsc2UKKwkJZ28tPmZwc19zY2FsZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogVklESU9DX0VOVU1TVEQgb24gZ283MDA3IHdlcmUgdXNlZCBmb3IgZW51bWJlcmF0aW5nIHRoZSBzdXBwb3J0ZWQgZnBzIGFuZAorICAgaXRzIHJlc29sdXRpb24sIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkIHRvIFRWLgorICAgVGhpcyB3ZXJlIGFuIEFQSSBhYnVzZSwgcHJvYmFibHkgdXNlZCBieSB0aGUgbGFjayBvZiBzcGVjaWZpYyBJT0NUTCdzIHRvCisgICBlbnVtYmVyYXRlIGl0LCBieSB0aGUgdGltZSB0aGUgZHJpdmVyIHdlcmUgd3JpdHRlbi4KKworICAgSG93ZXZlciwgc2luY2Uga2VybmVsIDIuNi4xOSwgdHdvIG5ldyBpb2N0bHMgKFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTCisgICBhbmQgVklESU9DX0VOVU1fRlJBTUVTSVpFUykgd2VyZSBhZGRlZCBmb3IgdGhpcyBwdXJwb3NlLgorCisgICBUaGUgdHdvIGZ1bmN0aW9ucyBiZWxsb3cgaW1wbGVtZW50cyB0aGUgbmV3ZXIgaW9jdGxzCisqLworc3RhdGljIGludCB2aWRpb2NfZW51bV9mcmFtZXNpemVzKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQkJCSAgc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gKmZzaXplKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCS8qIFJldHVybiAtRUlOVkFMLCBpZiBpdCBpcyBhIFRWIGJvYXJkICovCisJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSB8fAorCSAgICAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmc2l6ZS0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZzaXplLT50eXBlID0gVjRMMl9GUk1TSVpFX1RZUEVfRElTQ1JFVEU7CisJZnNpemUtPmRpc2NyZXRlLndpZHRoID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl93aWR0aDsKKwlmc2l6ZS0+ZGlzY3JldGUuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mcmFtZWludGVydmFscyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSAqZml2YWwpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJLyogUmV0dXJuIC1FSU5WQUwsIGlmIGl0IGlzIGEgVFYgYm9hcmQgKi8KKwlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpIHx8CisJICAgIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZpdmFsLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZml2YWwtPnR5cGUgPSBWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURTsKKwlmaXZhbC0+ZGlzY3JldGUubnVtZXJhdG9yID0gMTAwMTsKKwlmaXZhbC0+ZGlzY3JldGUuZGVub21pbmF0b3IgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZyYW1lcmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKnN0ZCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoZ28tPnN0cmVhbWluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKSAmJgorCQkJKnN0ZCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgqc3RkID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgorCQkJZ28tPmlucHV0ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkgeworCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCisJCQlyZXR1cm4gLUVJTzsKKwkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLAorCQkJCQlWSURJT0NfU19TVEQsIHN0ZCk7CisJCWlmICghKnN0ZCkgLyogaGFjayB0byBpbmRpY2F0ZSBFSU5WQUwgZnJvbSB0dW5lciAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCpzdGQgJiBWNEwyX1NURF9OVFNDKSB7CisJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfTlRTQzsKKwkJZ28tPnNlbnNvcl9mcmFtZXJhdGUgPSAzMDAwMDsKKwl9IGVsc2UgaWYgKCpzdGQgJiBWNEwyX1NURF9QQUwpIHsKKwkJZ28tPnN0YW5kYXJkID0gR083MDA3X1NURF9QQUw7CisJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMjUwMjU7CisJfSBlbHNlIGlmICgqc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKKwkJZ28tPnN0YW5kYXJkID0gR083MDA3X1NURF9QQUw7CisJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMjUwMjU7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCisJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwKKwkJCQkJVklESU9DX1NfU1RELCBzdGQpOworCXNldF9jYXB0dXJlX3NpemUoZ28sIE5VTEwsIDApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCiAJY2FzZSBWSURJT0NfUVVFUllTVEQ6CiAJewogCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOwpAQCAtODg0LDIxOSArMTE5NSwyNjkgQEAKIAkJCSpzdGQgPSAwOwogCQlyZXR1cm4gMDsKIAl9Ci0JY2FzZSBWSURJT0NfRU5VTUlOUFVUOgotCXsKLQkJc3RydWN0IHY0bDJfaW5wdXQgKmlucCA9IGFyZzsKLQkJaW50IGluZGV4OworI2VuZGlmCiAKLQkJaWYgKGlucC0+aW5kZXggPj0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaW5kZXggPSBpbnAtPmluZGV4OwotCQltZW1zZXQoaW5wLCAwLCBzaXplb2YoKmlucCkpOwotCQlpbnAtPmluZGV4ID0gaW5kZXg7Ci0JCXN0cm5jcHkoaW5wLT5uYW1lLCBnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2luZGV4XS5uYW1lLAotCQkJCXNpemVvZihpbnAtPm5hbWUpKTsKLQkJLyogSWYgdGhpcyBib2FyZCBoYXMgYSB0dW5lciwgaXQgd2lsbCBiZSB0aGUgbGFzdCBpbnB1dCAqLwotCQlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpICYmCi0JCQkJaW5kZXggPT0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMgLSAxKQotCQkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOwotCQllbHNlCi0JCQlpbnAtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOwotCQlpbnAtPmF1ZGlvc2V0ID0gMDsKLQkJaW5wLT50dW5lciA9IDA7Ci0JCWlmIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikKLQkJCWlucC0+c3RkID0gVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTCB8Ci0JCQkJCQkJVjRMMl9TVERfU0VDQU07Ci0JCWVsc2UKLQkJCWlucC0+c3RkID0gMDsKLQkJcmV0dXJuIDA7CitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppbnApCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKGlucC0+aW5kZXggPj0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybmNweShpbnAtPm5hbWUsIGdvLT5ib2FyZF9pbmZvLT5pbnB1dHNbaW5wLT5pbmRleF0ubmFtZSwKKwkJCXNpemVvZihpbnAtPm5hbWUpKTsKKworCS8qIElmIHRoaXMgYm9hcmQgaGFzIGEgdHVuZXIsIGl0IHdpbGwgYmUgdGhlIGxhc3QgaW5wdXQgKi8KKwlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpICYmCisJCQlpbnAtPmluZGV4ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkKKwkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOworCWVsc2UKKwkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKworCWlucC0+YXVkaW9zZXQgPSAwOworCWlucC0+dHVuZXIgPSAwOworCWlmIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikKKwkJaW5wLT5zdGQgPSBWNEwyX1NURF9OVFNDIHwgVjRMMl9TVERfUEFMIHwKKwkJCQkJCVY0TDJfU1REX1NFQ0FNOworCWVsc2UKKwkJaW5wLT5zdGQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppbnB1dCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwkqaW5wdXQgPSBnby0+aW5wdXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGlucHV0KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChpbnB1dCA+PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGdvLT5zdHJlYW1pbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlnby0+aW5wdXQgPSBpbnB1dDsKKwlpZiAoZ28tPmkyY19hZGFwdGVyX29ubGluZSkgeworCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0lOUFVULAorCQkJJmdvLT5ib2FyZF9pbmZvLT5pbnB1dHNbaW5wdXRdLnZpZGVvX2lucHV0KTsKKwkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19BVURJTywKKwkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2lucHV0XS5hdWRpb19pbnB1dCk7CiAJfQotCWNhc2UgVklESU9DX0dfSU5QVVQ6Ci0JewotCQlpbnQgKmlucHV0ID0gYXJnOwogCi0JCSppbnB1dCA9IGdvLT5pbnB1dDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfSU5QVVQ6Ci0JewotCQlpbnQgKmlucHV0ID0gYXJnOworCXJldHVybiAwOworfQogCi0JCWlmICgqaW5wdXQgPj0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMpCitzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodC0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfVFVORVIsIHQpOworCisJdC0+aW5kZXggPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodC0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAoZ28tPmJvYXJkX2lkKSB7CisJY2FzZSBHTzcwMDdfQk9BUkRJRF9QWF9UVjQwMlVfTkE6CisJY2FzZSBHTzcwMDdfQk9BUkRJRF9QWF9UVjQwMlVfSlA6CisJCS8qIE5vIHNlbGVjdGFibGUgb3B0aW9ucyBjdXJyZW50bHkgKi8KKwkJaWYgKHQtPmF1ZG1vZGUgIT0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTykKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoZ28tPnN0cmVhbWluZykKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWdvLT5pbnB1dCA9ICppbnB1dDsKLQkJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpIHsKLQkJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfSU5QVVQsCi0JCQkJJmdvLT5ib2FyZF9pbmZvLT5pbnB1dHNbKmlucHV0XS52aWRlb19pbnB1dCk7Ci0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0FVRElPLAotCQkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzWyppbnB1dF0uYXVkaW9faW5wdXQpOwotCQl9Ci0JCXJldHVybiAwOworCQlicmVhazsKIAl9Ci0JY2FzZSBWSURJT0NfR19UVU5FUjoKLQl7Ci0JCXN0cnVjdCB2NGwyX3R1bmVyICp0ID0gYXJnOwogCi0JCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICh0LT5pbmRleCAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCXJldHVybiAtRUlPOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX1RVTkVSLCBhcmcpOwotCQl0LT5pbmRleCA9IDA7Ci0JCXJldHVybiAwOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfVFVORVIsIHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX0ZSRVFVRU5DWSwgZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfRlJFUVVFTkNZLCBmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChjcm9wY2FwLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUaGVzZSBzcGVjaWZ5IHRoZSByYXcgaW5wdXQgb2YgdGhlIHNlbnNvciAqLworCXN3aXRjaCAoZ28tPnN0YW5kYXJkKSB7CisJY2FzZSBHTzcwMDdfU1REX05UU0M6CisJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOworCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IDcyMDsKKwkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IDQ4MDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gNzIwOworCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IDQ4MDsKKwkJYnJlYWs7CisJY2FzZSBHTzcwMDdfU1REX1BBTDoKKwkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKKwkJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gNzIwOworCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gNTc2OworCQljcm9wY2FwLT5kZWZyZWN0LnRvcCA9IDA7CisJCWNyb3BjYXAtPmRlZnJlY3QubGVmdCA9IDA7CisJCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSA3MjA7CisJCWNyb3BjYXAtPmRlZnJlY3QuaGVpZ2h0ID0gNTc2OworCQlicmVhazsKKwljYXNlIEdPNzAwN19TVERfT1RIRVI6CisJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOworCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7CisJCWNyb3BjYXAtPmJvdW5kcy5oZWlnaHQgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2hlaWdodDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl93aWR0aDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2hlaWdodDsKKwkJYnJlYWs7CiAJfQotCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKIAotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodC0+aW5kZXggIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJc3dpdGNoIChnby0+Ym9hcmRfaWQpIHsKLQkJY2FzZSBHTzcwMDdfQk9BUkRJRF9QWF9UVjQwMlVfTkE6Ci0JCWNhc2UgR083MDA3X0JPQVJESURfUFhfVFY0MDJVX0pQOgotCQkJLyogTm8gc2VsZWN0YWJsZSBvcHRpb25zIGN1cnJlbnRseSAqLwotCQkJaWYgKHQtPmF1ZG1vZGUgIT0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfVFVORVIsIGFyZyk7Ci0JCXJldHVybiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNyb3AtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisKKwkvKiBUaGVzZSBzcGVjaWZ5IHRoZSByYXcgaW5wdXQgb2YgdGhlIHNlbnNvciAqLworCXN3aXRjaCAoZ28tPnN0YW5kYXJkKSB7CisJY2FzZSBHTzcwMDdfU1REX05UU0M6CisJCWNyb3AtPmMudG9wID0gMDsKKwkJY3JvcC0+Yy5sZWZ0ID0gMDsKKwkJY3JvcC0+Yy53aWR0aCA9IDcyMDsKKwkJY3JvcC0+Yy5oZWlnaHQgPSA0ODA7CisJCWJyZWFrOworCWNhc2UgR083MDA3X1NURF9QQUw6CisJCWNyb3AtPmMudG9wID0gMDsKKwkJY3JvcC0+Yy5sZWZ0ID0gMDsKKwkJY3JvcC0+Yy53aWR0aCA9IDcyMDsKKwkJY3JvcC0+Yy5oZWlnaHQgPSA1NzY7CisJCWJyZWFrOworCWNhc2UgR083MDA3X1NURF9PVEhFUjoKKwkJY3JvcC0+Yy50b3AgPSAwOworCQljcm9wLT5jLmxlZnQgPSAwOworCQljcm9wLT5jLndpZHRoID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl93aWR0aDsKKwkJY3JvcC0+Yy5oZWlnaHQgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2hlaWdodDsKKwkJYnJlYWs7CiAJfQotCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCXsKLQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwogCi0JCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCXJldHVybiAtRUlPOwotCQltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7Ci0JCWYtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19GUkVRVUVOQ1ksIGFyZyk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQl7Ci0JCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCXJldHVybiAtRUlPOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0ZSRVFVRU5DWSwgYXJnKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0NST1BDQVA6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwID0gYXJnOworCXJldHVybiAwOworfQogCi0JCWlmIChjcm9wY2FwLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1zZXQoY3JvcGNhcCwgMCwgc2l6ZW9mKCpjcm9wY2FwKSk7Ci0JCWNyb3BjYXAtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCS8qIFRoZXNlIHNwZWNpZnkgdGhlIHJhdyBpbnB1dCBvZiB0aGUgc2Vuc29yICovCi0JCXN3aXRjaCAoZ28tPnN0YW5kYXJkKSB7Ci0JCWNhc2UgR083MDA3X1NURF9OVFNDOgotCQkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSA3MjA7Ci0JCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gNDgwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSA3MjA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IDQ4MDsKLQkJCWJyZWFrOwotCQljYXNlIEdPNzAwN19TVERfUEFMOgotCQkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSA3MjA7Ci0JCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gNTc2OwotCQkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSA3MjA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IDU3NjsKLQkJCWJyZWFrOwotCQljYXNlIEdPNzAwN19TVERfT1RIRVI6Ci0JCQljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKLQkJCWNyb3BjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKLQkJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7Ci0JCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LnRvcCA9IDA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0OwotCQkJYnJlYWs7Ci0JCX0KKy8qIEZJWE1FOiB2aWRpb2Nfc19jcm9wIGlzIG5vdCByZWFsbHkgaW1wbGVtZW50ZWQhISEKKyAqLworc3RhdGljIGludCB2aWRpb2Nfc19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKQoreworCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0dfQ1JPUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Nyb3AgKmNyb3AgPSBhcmc7CisJcmV0dXJuIDA7Cit9CiAKLQkJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW1lbXNldChjcm9wLCAwLCBzaXplb2YoKmNyb3ApKTsKLQkJY3JvcC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJLyogVGhlc2Ugc3BlY2lmeSB0aGUgcmF3IGlucHV0IG9mIHRoZSBzZW5zb3IgKi8KLQkJc3dpdGNoIChnby0+c3RhbmRhcmQpIHsKLQkJY2FzZSBHTzcwMDdfU1REX05UU0M6Ci0JCQljcm9wLT5jLnRvcCA9IDA7Ci0JCQljcm9wLT5jLmxlZnQgPSAwOwotCQkJY3JvcC0+Yy53aWR0aCA9IDcyMDsKLQkJCWNyb3AtPmMuaGVpZ2h0ID0gNDgwOwotCQkJYnJlYWs7Ci0JCWNhc2UgR083MDA3X1NURF9QQUw6Ci0JCQljcm9wLT5jLnRvcCA9IDA7Ci0JCQljcm9wLT5jLmxlZnQgPSAwOwotCQkJY3JvcC0+Yy53aWR0aCA9IDcyMDsKLQkJCWNyb3AtPmMuaGVpZ2h0ID0gNTc2OwotCQkJYnJlYWs7Ci0JCWNhc2UgR083MDA3X1NURF9PVEhFUjoKLQkJCWNyb3AtPmMudG9wID0gMDsKLQkJCWNyb3AtPmMubGVmdCA9IDA7Ci0JCQljcm9wLT5jLndpZHRoID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl93aWR0aDsKLQkJCWNyb3AtPmMuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7Ci0JCQlicmVhazsKLQkJfQorc3RhdGljIGludCB2aWRpb2NfZ19qcGVnY29tcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnBhcmFtcykKK3sKKwltZW1zZXQocGFyYW1zLCAwLCBzaXplb2YoKnBhcmFtcykpOworCXBhcmFtcy0+cXVhbGl0eSA9IDUwOyAvKiA/PyAqLworCXBhcmFtcy0+anBlZ19tYXJrZXJzID0gVjRMMl9KUEVHX01BUktFUl9ESFQgfAorCQkJCVY0TDJfSlBFR19NQVJLRVJfRFFUOwogCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0NST1A6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wID0gYXJnOworCXJldHVybiAwOworfQogCi0JCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfR19KUEVHQ09NUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcGFyYW1zID0gYXJnOworc3RhdGljIGludCB2aWRpb2Nfc19qcGVnY29tcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnBhcmFtcykKK3sKKwlpZiAocGFyYW1zLT5xdWFsaXR5ICE9IDUwIHx8CisJCQlwYXJhbXMtPmpwZWdfbWFya2VycyAhPSAoVjRMMl9KUEVHX01BUktFUl9ESFQgfAorCQkJCQkJVjRMMl9KUEVHX01BUktFUl9EUVQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQltZW1zZXQocGFyYW1zLCAwLCBzaXplb2YoKnBhcmFtcykpOwotCQlwYXJhbXMtPnF1YWxpdHkgPSA1MDsgLyogPz8gKi8KLQkJcGFyYW1zLT5qcGVnX21hcmtlcnMgPSBWNEwyX0pQRUdfTUFSS0VSX0RIVCB8Ci0JCQkJCVY0TDJfSlBFR19NQVJLRVJfRFFUOworCXJldHVybiAwOworfQogCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0pQRUdDT01QOgotCXsKLQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMgPSBhcmc7CisvKiBGSVhNRToKKwlUaG9zZSBpb2N0bHMgYXJlIHByaXZhdGUsIGFuZCBub3QgbmVlZGVkLCBzaW5jZSBzZXZlcmFsIHN0YW5kYXJkCisJZXh0ZW5kZWQgY29udHJvbHMgYWxyZWFkeSBwcm92aWRlIHN0cmVhbWluZyBjb250cm9sLgorCVNvLCB0aG9zZSBpb2N0bHMgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIHZpZGlvY19nX2V4dF9jdHJscygpCisJYW5kIHZpZGlvY19zX2V4dF9jdHJscygpCisgKi8KIAotCQlpZiAocGFyYW1zLT5xdWFsaXR5ICE9IDUwIHx8Ci0JCQkJcGFyYW1zLT5qcGVnX21hcmtlcnMgIT0gKFY0TDJfSlBFR19NQVJLRVJfREhUIHwKLQkJCQkJCQlWNEwyX0pQRUdfTUFSS0VSX0RRVCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JfQorI2lmIDAKIAkvKiBUZW1wb3JhcnkgaW9jdGxzIGZvciBjb250cm9sbGluZyBjb21wcmVzc2lvbiBjaGFyYWN0ZXJpc3RpY3MgKi8KIAljYXNlIEdPNzAwN0lPQ19TX0JJVFJBVEU6CiAJewpAQCAtMTMxNiwyNyArMTY3Nyw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGNsaXBfdG9fbW9kZXRfbWFwKGdvLCByZWdpb24tPnJlZ2lvbiwgcmVnaW9uLT5jbGlwcyk7CiAJfQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJnbzcwMDc6IHVuc3VwcG9ydGVkIGlvY3RsICVkXG4iLCBjbWQpOwotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLQlyZXR1cm4gMDsKLQotdW5sb2NrX2FuZF9yZXR1cm46Ci0JdXAoJmdvZmgtPmxvY2spOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgZ283MDA3X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoZ29maC0+Z28tPnN0YXR1cyAhPSBTVEFUVVNfT05MSU5FKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGdvNzAwN19kb19pb2N0bCk7Ci19CisjZW5kaWYKIAogc3RhdGljIHNzaXplX3QgZ283MDA3X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAogCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTE0NDEsMjMgKzE3ODIsNTkgQEAKIAkJa2ZyZWUoZ28pOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnbzcwMDdfZm9wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgZ283MDA3X2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQk9IGdvNzAwN19vcGVuLAogCS5yZWxlYXNlCT0gZ283MDA3X3JlbGVhc2UsCi0JLmlvY3RsCQk9IGdvNzAwN19pb2N0bCwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAogCS5yZWFkCQk9IGdvNzAwN19yZWFkLAogCS5tbWFwCQk9IGdvNzAwN19tbWFwLAogCS5wb2xsCQk9IGdvNzAwN19wb2xsLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2aWRlb19pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcCAgICAgICAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgID0gdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwICAgICA9IHZpZGlvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwICAgPSB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcCAgICAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3JlcWJ1ZnMgICAgICAgICAgID0gdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiAgICAgICAgICA9IHZpZGlvY19xdWVyeWJ1ZiwKKwkudmlkaW9jX3FidWYgICAgICAgICAgICAgID0gdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiAgICAgICAgICAgICA9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3Nfc3RkICAgICAgICAgICAgID0gdmlkaW9jX3Nfc3RkLAorCS52aWRpb2NfZW51bV9pbnB1dCAgICAgICAgPSB2aWRpb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQgICAgICAgICAgID0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ICAgICAgICAgICA9IHZpZGlvY19zX2lucHV0LAorCS52aWRpb2NfcXVlcnljdHJsICAgICAgICAgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsICAgICAgICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgICAgICAgPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2Nfc3RyZWFtb24gICAgICAgICAgPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgICAgICAgICA9IHZpZGlvY19zdHJlYW1vZmYsCisJLnZpZGlvY19nX3R1bmVyICAgICAgICAgICA9IHZpZGlvY19nX3R1bmVyLAorCS52aWRpb2Nfc190dW5lciAgICAgICAgICAgPSB2aWRpb2Nfc190dW5lciwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ICAgICAgID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgICAgICAgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19nX3Bhcm0gICAgICAgICAgICA9IHZpZGlvY19nX3Bhcm0sCisJLnZpZGlvY19zX3Bhcm0gICAgICAgICAgICA9IHZpZGlvY19zX3Bhcm0sCisJLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMgICA9IHZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMsCisJLnZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzID0gdmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMsCisJLnZpZGlvY19jcm9wY2FwICAgICAgICAgICA9IHZpZGlvY19jcm9wY2FwLAorCS52aWRpb2NfZ19jcm9wICAgICAgICAgICAgPSB2aWRpb2NfZ19jcm9wLAorCS52aWRpb2Nfc19jcm9wICAgICAgICAgICAgPSB2aWRpb2Nfc19jcm9wLAorCS52aWRpb2NfZ19qcGVnY29tcCAgICAgICAgPSB2aWRpb2NfZ19qcGVnY29tcCwKKwkudmlkaW9jX3NfanBlZ2NvbXAgICAgICAgID0gdmlkaW9jX3NfanBlZ2NvbXAsCit9OworCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBnbzcwMDdfdGVtcGxhdGUgPSB7CiAJLm5hbWUJCT0gImdvNzAwNyIsCiAJLnZmbF90eXBlCT0gVklEX1RZUEVfQ0FQVFVSRSwKIAkuZm9wcwkJPSAmZ283MDA3X2ZvcHMsCiAJLm1pbm9yCQk9IC0xLAogCS5yZWxlYXNlCT0gZ283MDA3X3ZmbF9yZWxlYXNlLAorCS5pb2N0bF9vcHMJPSAmdmlkZW9faW9jdGxfb3BzLAorCS50dm5vcm1zCT0gVjRMMl9TVERfQUxMLAorCS5jdXJyZW50X25vcm0JPSBWNEwyX1NURF9OVFNDLAogfTsKIAogaW50IGdvNzAwN192NGwyX2luaXQoc3RydWN0IGdvNzAwNyAqZ28pCkBAIC0xNDc3LDYgKzE4NTQsOCBAQAogCX0KIAl2aWRlb19zZXRfZHJ2ZGF0YShnby0+dmlkZW9fZGV2LCBnbyk7CiAJKytnby0+cmVmX2NvdW50OworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWdpc3RlcmVkIGRldmljZSB2aWRlbyVkIFt2NGwyXVxuIiwKKwkgICAgICAgZ28tPnZpZGVvX2Rldi0+bmFtZSwgZ28tPnZpZGVvX2Rldi0+bnVtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDcudHh0IGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjc3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy50eHQKQEAgLTAsMCArMSw0ODEgQEAKK1RoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBXSVMgR083MDA3U0IgbXVsdGktZm9ybWF0IHZpZGVvIGVuY29kZXIuCisKK1BldGUgRWJlcmxlaW4gPHBldGVAc2Vuc29yYXkuY29tPgorCitUaGUgZHJpdmVyIHdhcyBvcmlnbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCBhbmQgaXMgY3VycmVudGx5IGhvc3RlZCBhdDoKK2h0dHA6Ly9uaWtvc2FwaS5vcmcvd2lraS9pbmRleC5waHAvV0lTX0dvNzAwN19MaW51eF9kcml2ZXIKK1RoZSBnbzcwMDcgZmlybXdhcmUgY2FuIGJlIGFjcXVpcmVkIGZyb20gdGhlIHBhY2thZ2Ugb24gdGhlIHNpdGUgYWJvdmUuCisKK0kndmUgbW9kaWZpZWQgdGhlIGRyaXZlciB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgVmlkZW80TGludXgyIE1QRUcKK2NvbnRyb2xzLCB3aXRoIGFjY2VwdGFibGUgdmFsdWVzOgorCitWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQKKwkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFR19FTEVNCitWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEKKwkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNAorVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MworCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OQorVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRQlpbnRlZ2VyCitWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUJNjQwMDAgLi4gMTAwMDAwMDAKKworVGhlc2Ugc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbm9uLXN0YW5kYXJkIEdPNzAwNyBpb2N0bHMgZGVzY3JpYmVkCitiZWxvdy4KKworCitUaGUgUkVBRE1FIGZpbGVzIGZyb20gdGhlIG9yaWduYWwgcGFja2FnZSBhcHBlYXIgYmVsb3c6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgV0lTIEdPNzAwN1NCIFB1YmxpYyBMaW51eCBEcml2ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyoqKiBQbGVhc2Ugc2VlIHRoZSBmaWxlIFJFTEVBU0UtTk9URVMgZm9yIGltcG9ydGFudCBsYXN0LW1pbnV0ZSB1cGRhdGVzICoqKgorCisKKyAgMC4gT1ZFUlZJRVcgQU5EIExJQ0VOU0lORy9ESVNDTEFJTUVSCisKKworVGhpcyBkcml2ZXIga2l0IGNvbnRhaW5zIExpbnV4IGRyaXZlcnMgZm9yIHRoZSBXSVMgR083MDA3U0IgbXVsdGktZm9ybWF0Cit2aWRlbyBlbmNvZGVyLiAgT25seSBrZXJuZWwgdmVyc2lvbiAyLjYueCBpcyBzdXBwb3J0ZWQuICBUaGUgdmlkZW8gc3RyZWFtCitpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgVmlkZW80TGludXgyIEFQSSBhbmQgdGhlIGF1ZGlvIHN0cmVhbSBpcyBhdmFpbGFibGUKK3Rocm91Z2ggdGhlIEFMU0EgQVBJIChvciB0aGUgT1NTIGVtdWxhdGlvbiBsYXllciBvZiB0aGUgQUxTQSBzeXN0ZW0pLgorCitUaGUgZmlsZXMgaW4ga2VybmVsLyBhbmQgaG90cGx1Zy8gYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgVmVyc2lvbiAyIGZyb20gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEEgY29weSBvZiB0aGUgbGljZW5zZQoraXMgaW5jbHVkZWQgaW4gdGhlIGZpbGUgQ09QWUlORy4KKworVGhlIGV4YW1wbGUgYXBwbGljYXRpb25zIGluIGFwcHMvIGFuZCBDIGhlYWRlciBmaWxlcyBpbiBpbmNsdWRlLyBhcmUKK2xpY2Vuc2VkIHVuZGVyIGEgcGVybWlzc2l2ZSBsaWNlbnNlIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgZmlsZXMgd2hpY2gKK2FsbG93cyBjb3B5aW5nLCBtb2RpZmljYXRpb24gYW5kIHJlZGlzdHJpYnV0aW9uIGZvciBhbnkgcHVycG9zZSB3aXRob3V0CithdHRyaWJ1dGlvbi4KKworVGhlIGZpcm13YXJlIGZpbGVzIGluY2x1ZGVkIGluIHRoZSBmaXJtd2FyZS8gZGlyZWN0b3J5IG1heSBiZSBmcmVlbHkKK3JlZGlzdHJpYnV0ZWQgb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoaXMgZG9jdW1lbnQ7IGJ1dCBtb2RpZmljYXRpb24sCit0YW1wZXJpbmcgYW5kIHJldmVyc2UgZW5naW5lZXJpbmcgYXJlIHByb2hpYml0ZWQuCisKK01JQ1JPTkFTIFVTQSwgSU5DLiwgTUFLRVMgTk8gV0FSUkFOVElFUyBUTyBBTlkgUEVSU09OIE9SIEVOVElUWSBXSVRICitSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRSBPUiBBTlkgREVSSVZBVElWRVMgVEhFUkVPRiBPUiBBTlkgU0VSVklDRVMgT1IKK0xJQ0VOU0VTIEFORCBESVNDTEFJTVMgQUxMIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTgorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNVUFBPUlQsIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisKKworICAxLiBTWVNURU0gUkVRVUlSRU1FTlRTCisKKworVGhpcyBkcml2ZXIgcmVxdWlyZXMgTGludXgga2VybmVsIDIuNi4gIEtlcm5lbCAyLjQgaXMgbm90IHN1cHBvcnRlZC4gIFVzaW5nCitrZXJuZWwgMi42LjEwIG9yIGxhdGVyIGlzIHJlY29tbWVuZGVkLCBhcyBlYXJsaWVyIGtlcm5lbHMgYXJlIGtub3duIHRvIGhhdmUKK3Vuc3RhYmxlIFVTQiAyLjAgc3VwcG9ydC4KKworQSBmdWxseSBidWlsdCBrZXJuZWwgc291cmNlIHRyZWUgbXVzdCBiZSBhdmFpbGFibGUuICBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlCitsaW5rZWQgZnJvbSAiL2xpYi9tb2R1bGVzLzxLRVJORUwgVkVSU0lPTj4vYnVpbGQiIGZvciBjb252ZW5pZW5jZS4gIElmIHRoaXMKK2xpbmsgZG9lcyBub3QgZXhpc3QsIGFuIGV4dHJhIHBhcmFtZXRlciB3aWxsIG5lZWQgdG8gYmUgcGFzc2VkIHRvIHRoZQorYG1ha2VgIGNvbW1hbmQuCisKK0FsbCB2ZW5kb3ItYnVpbHQga2VybmVscyBzaG91bGQgYWxyZWFkeSBiZSBjb25maWd1cmVkIHByb3Blcmx5LiAgSG93ZXZlciwKK2ZvciBjdXN0b20tYnVpbHQga2VybmVscywgdGhlIGZvbGxvd2luZyBvcHRpb25zIG5lZWQgdG8gYmUgZW5hYmxlZCBpbiB0aGUKK2tlcm5lbCBhcyBidWlsdC1pbiBvciBtb2R1bGVzOgorCisgICAgICAgIENPTkZJR19IT1RQTFVHICAgICAgICAgICAtIFN1cHBvcnQgZm9yIGhvdC1wbHVnZ2FibGUgZGV2aWNlcworICAgICAgICBDT05GSUdfTU9EVUxFUyAgICAgICAgICAgLSBFbmFibGUgbG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyAgICAgICAgQ09ORklHX0tNT0QgICAgICAgICAgICAgIC0gQXV0b21hdGljIGtlcm5lbCBtb2R1bGUgbG9hZGluZworICAgICAgICBDT05GSUdfRldfTE9BREVSICAgICAgICAgLSBIb3RwbHVnIGZpcm13YXJlIGxvYWRpbmcgc3VwcG9ydAorICAgICAgICBDT05GSUdfSTJDICAgICAgICAgICAgICAgLSBJMkMgc3VwcG9ydAorICAgICAgICBDT05GSUdfVklERU9fREVWICAgICAgICAgLSBWaWRlbyBGb3IgTGludXgKKyAgICAgICAgQ09ORklHX1NPVU5EICAgICAgICAgICAgIC0gU291bmQgY2FyZCBzdXBwb3J0CisgICAgICAgIENPTkZJR19TTkQgICAgICAgICAgICAgICAtIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorICAgICAgICBDT05GSUdfVVNCICAgICAgICAgICAgICAgLSBTdXBwb3J0IGZvciBIb3N0LXNpZGUgVVNCCisgICAgICAgIENPTkZJR19VU0JfREVWSUNFRlMgICAgICAtIFVTQiBkZXZpY2UgZmlsZXN5c3RlbQorICAgICAgICBDT05GSUdfVVNCX0VIQ0lfSENEICAgICAgLSBFSENJIEhDRCAoVVNCIDIuMCkgc3VwcG9ydAorCitBZGRpdGlvbmFsbHksIHRvIHVzZSB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiwgdGhlIGZvbGxvd2luZyBvcHRpb25zIG5lZWQgdG8KK2JlIGVuYWJsZWQgaW4gdGhlIEFMU0Egc2VjdGlvbjoKKworICAgICAgICBDT05GSUdfU05EX01JWEVSX09TUyAgICAgLSBPU1MgTWl4ZXIgQVBJCisgICAgICAgIENPTkZJR19TTkRfUENNX09TUyAgICAgICAtIE9TUyBQQ00gKGRpZ2l0YWwgYXVkaW8pIEFQSQorCitUaGUgaG90cGx1ZyBzY3JpcHRzLCBhbG9uZyB3aXRoIHRoZSBmeGxvYWQgdXRpbGl0eSwgbXVzdCBhbHNvIGJlIGluc3RhbGxlZC4KK1RoZXNlIHNjcmlwdHMgY2FuIGJlIG9idGFpbmVkIGZyb20gPGh0dHA6Ly9saW51eC1ob3RwbHVnLnNvdXJjZWZvcmdlLm5ldC8+LgorSG90cGx1Z2dpbmcgaXMgdXNlZCBmb3IgbG9hZGluZyBmaXJtd2FyZSBpbnRvIHRoZSBDeXBydXNzIEVaLVVTQiBjaGlwIHVzaW5nCitmeGxvYWQgYW5kIGZvciBsb2FkaW5nIGZpcm13YXJlIGludG8gdGhlIGRyaXZlciB1c2luZyB0aGUgZmlybXdhcmUgYWdlbnQuCisKKworICAyLiBDT01QSUxJTkcgQU5EIElOU1RBTExJTkcgVEhFIERSSVZFUgorCisKK01vc3QgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gY29tcGlsZSB0aGUgZHJpdmVyIGJ5IHNpbXBseSBydW5uaW5nOgorCisgICAgICAgICQgbWFrZQorCitpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGUgZHJpdmVyIGtpdC4gIEZpcnN0IHRoZSBrZXJuZWwgbW9kdWxlcword2lsbCBiZSBidWlsdCwgZm9sbG93ZWQgYnkgdGhlIGV4YW1wbGUgYXBwbGljYXRpb25zLgorCitJZiB0aGUgYnVpbGQgc3lzdGVtIGlzIHVuYWJsZSB0byBsb2NhdGUgdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBmb3IgdGhlCitjdXJyZW50bHktcnVubmluZyBrZXJuZWwsIG9yIGlmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGJ1aWx0IGZvciBhIGtlcm5lbAorb3RoZXIgdGhhbiB0aGUgY3VycmVudGx5LXJ1bm5pbmcga2VybmVsLCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIG5lZWQKK3RvIGJlIHBhc3NlZCB0byBtYWtlIHRvIHNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBzb3VyY2UgZGlyZWN0b3J5OgorCisgICAgICAgICQgbWFrZSBLRVJORUxTUkM9L3Vzci9zcmMvbGludXgtMi42LjEwLWN1c3RvbTMKKworT25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMsIHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlIGZpbGVzIHNob3VsZCBiZQoraW5zdGFsbGVkIGJ5IHJ1bm5pbmc6CisKKyAgICAgICAgJCBtYWtlIGluc3RhbGwKKworVGhlIGtlcm5lbCBtb2R1bGVzIHdpbGwgYmUgcGxhY2VkIGluICIvbGliL21vZHVsZXMvPEtFUk5FTCBWRVJTSU9OPi9leHRyYSIKK2FuZCB0aGUgZmlybXdhcmUgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGhvdHBsdWcgZmlybXdhcmUKK2RpcmVjdG9yeSwgdXN1YWxseSAvbGliL2Zpcm13YXJlLiAgSW4gYWRkaXRpb24sIFVTQiBtYXBzIGFuZCBzY3JpcHRzIHdpbGwKK2JlIHBsYWNlZCBpbiAvZXRjL2hvdHBsdWcvdXNiIHRvIGVuYWJsZSBmeGxvYWQgdG8gaW5pdGlhbGl6ZSB0aGUgRVotVVNCCitjb250cm9sIGNoaXAgd2hlbiB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KKworCisgIDMuIFBBTC9TRUNBTSBUVU5FUiBDT05GSUdVUkFUSU9OIChUVjQwMlUtRVUgb25seSkKKworCitUaGUgUEFMIG1vZGVsIG9mIHRoZSBQbGV4dG9yIENvbnZlcnRYIFRWNDAyVSBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsCitjb25maWd1cmF0aW9uIHRvIGNvcnJlY3RseSBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFRWIGZyZXF1ZW5jeSBiYW5kIGFuZAorYXVkaW8gc3ViY2hhbm5lbC4KKworVXNlcnMgd2l0aCBhIGRldmljZSBvdGhlciB0aGFuIHRoZSBQbGV4dG9yIENvbnZlcnRYIFRWNDAyVS1FVSBzaG91bGQgc2tpcAordGhpcyBzZWN0aW9uLgorCitUaGUgd2lkZSB2YXJpZXR5IG9mIFBBTCBUViBzeXN0ZW1zIHVzZWQgaW4gRXVyb3BlIHJlcXVpcmVzIHRoYXQgYWRkaXRpb25hbAoraW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2FsIFRWIHN0YW5kYXJkcyBiZSBwYXNzZWQgdG8gdGhlIGRyaXZlciBpbiBvcmRlcgordG8gcHJvcGVybHkgdHVuZSBUViBjaGFubmVscy4gIFRoZSB0d28gbmVjZXNzYXJ5IHBhcmFtZXRlcnMgYXJlIChhKSB0aGUgUEFMCitUViBiYW5kLCBhbmQgKGIpIHRoZSBhdWRpbyBzdWJjaGFubmVsIGZvcm1hdCBpbiB1c2UuCisKK0luIG1hbnkgY2FzZXMsIHRoZSBhcHByb3ByaWF0ZSBUViBiYW5kIHNlbGVjdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGRyaXZlcgorZnJvbSBhcHBsaWNhdGlvbnMuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCB0aGUgYXBwbGljYXRpb24gb25seSBzcGVjaWZpZXMKK3RoYXQgdGhlIGRyaXZlciBzaG91bGQgdXNlIFBBTCBidXQgbm90IHRoZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK2FwcHJvcHJpYXRlIFRWIGJhbmQuICBUbyB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlLCB0aGUgY29ycmVjdCBUViBiYW5kIG1heSBiZQorc3BlY2lmaWVkIGluIHRoZSAiZm9yY2VfYmFuZCIgcGFyYW1ldGVyIHRvIHRoZSB3aXMtc29ueS10dW5lciBtb2R1bGU6CisKKyAgICAgVFYgYmFuZCAgICAgICAgICAgZm9yY2VfYmFuZAorICAgICAtLS0tLS0tICAgICAgICAgICAtLS0tLS0tLS0tCisgICAgIFBBTCBCL0cgICAgICAgICAgICAgICAgQgorICAgICBQQUwgSSAgICAgICAgICAgICAgICAgIEkKKyAgICAgUEFMIEQvSyAgICAgICAgICAgICAgICBECisgICAgIFNFQ0FNIEwgICAgICAgICAgICAgICAgTAorCitJZiB0aGUgImZvcmNlX2JhbmQiIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBkcml2ZXIgd2lsbCBpZ25vcmUgYW55IFRWCitiYW5kIHNwZWNpZmllZCBieSBhcHBsaWNhdGlvbnMgYW5kIHdpbGwgYWx3YXlzIHVzZSB0aGUgYmFuZCBwcm92aWRlZCBpbiB0aGUKK21vZHVsZSBwYXJhbWV0ZXIuCisKK1RoZSBvdGhlciBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGlzIHRoZSBhdWRpbyBzdWJjaGFubmVsIGZvcm1hdC4KK1RoZXJlIGFyZSBzZXZlcmFsIHN0ZXJlbyBhdWRpbyBjYXJyaWVyIHN5c3RlbXMgaW4gdXNlLCBpbmNsdWRpbmcgTklDQU0gYW5kCit0aHJlZSB2YXJpZXRpZXMgb2YgQTIuICBUbyByZWNlaXZlIGF1ZGlvIGJyb2FkY2FzdCBvbiBvbmUgb2YgdGhlc2Ugc3RlcmVvCitjYXJyaWVycywgdGhlICJmb3JjZV9tcHhfbW9kZSIgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkIHRvIHRoZQord2lzLXNvbnktdHVuZXIgbW9kdWxlLgorCisgICAgIFRWIGJhbmQgICAgICAgICAgIEF1ZGlvIHN1YmNhcnJpZXIgICAgICAgZm9yY2VfbXB4X21vZGUKKyAgICAgLS0tLS0tLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0tLS0tLQorICAgICBQQUwgQi9HICAgICAgICAgICAgTW9ubyAoZGVmYXVsdCkgICAgICAgICAgICAgICAxCisgICAgIFBBTCBCL0cgICAgICAgICAgICAgICAgICBBMiAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgUEFMIEIvRyAgICAgICAgICAgICAgICAgTklDQU0gICAgICAgICAgICAgICAgICAgMworICAgICBQQUwgSSAgICAgICAgICAgICAgTW9ubyAoZGVmYXVsdCkgICAgICAgICAgICAgICA0CisgICAgIFBBTCBJICAgICAgICAgICAgICAgICAgIE5JQ0FNICAgICAgICAgICAgICAgICAgIDUKKyAgICAgUEFMIEQvSyAgICAgICAgICAgIE1vbm8gKGRlZmF1bHQpICAgICAgICAgICAgICAgNgorICAgICBQQUwgRC9LICAgICAgICAgICAgICAgICBBMiAoMSkgICAgICAgICAgICAgICAgICA3CisgICAgIFBBTCBEL0sgICAgICAgICAgICAgICAgIEEyICgyKSAgICAgICAgICAgICAgICAgIDgKKyAgICAgUEFMIEQvSyAgICAgICAgICAgICAgICAgQTIgKDMpICAgICAgICAgICAgICAgICAgOQorICAgICBQQUwgRC9LICAgICAgICAgICAgICAgICBOSUNBTSAgICAgICAgICAgICAgICAgIDEwCisgICAgIFNFQ0FNIEwgICAgICAgICAgICBNb25vIChkZWZhdWx0KSAgICAgICAgICAgICAgMTEKKyAgICAgU0VDQU0gTCAgICAgICAgICAgICAgICAgTklDQU0gICAgICAgICAgICAgICAgICAxMgorCitJZiB0aGUgImZvcmNlX21weF9tb2RlIiBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvcnJlY3QgbW9uby1vbmx5Cittb2RlIHdpbGwgYmUgY2hvc2VuIGJhc2VkIG9uIHRoZSBUViBiYW5kLiAgSG93ZXZlciwgdGhlIHR1bmVyIHdpbGwgbm90CityZWNlaXZlIHN0ZXJlbyBhdWRpbyBvciBiaWxpbmd1YWwgYnJvYWRjYXN0cyBjb3JyZWN0bHkuCisKK1RvIHBhc3MgdGhlICJmb3JjZV9iYW5kIiBvciAiZm9yY2VfbXB4X21vZGUiIHBhcmFtZXRlcnMgdG8gdGhlCit3aXMtc29ueS10dW5lciBtb2R1bGUsIHRoZSBmb2xsb3dpbmcgbGluZSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBtb2Rwcm9iZQorY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCB2YXJpZXMgZnJvbSBvbmUgTGludXggZGlzdHJpYnV0aW9uIHRvIGFub3RoZXIuCisKKyAgICAgb3B0aW9ucyB3aXMtc29ueS10dW5lciBmb3JjZV9iYW5kPUIgZm9yY2VfbXB4X21vZGU9MgorCitUaGUgYWJvdmUgZXhhbXBsZSB3b3VsZCBmb3JjZSB0aGUgdHVuZXIgdG8gdGhlIFBBTCBCL0cgVFYgYmFuZCBhbmQgcmVjZWl2ZQorc3RlcmVvIGF1ZGlvIGJyb2FkY2FzdHMgb24gdGhlIEEyIGNhcnJpZXIuCisKK1RvIHZlcmlmeSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbiwKK2V4ZWN1dGU6CisKKyAgICAgICAgJCBtb2Rwcm9iZSAtYyB8IGdyZXAgd2lzLXNvbnktdHVuZXIKKworSWYgdGhlIGNvbmZpZ3VyYXRpb24gbGluZSBhcHBlYXJzLCB0aGVuIG1vZHByb2JlIHdpbGwgcGFzcyB0aGUgcGFyYW1ldGVycworY29ycmVjdGx5IHRoZSBuZXh0IHRpbWUgdGhlIHdpcy1zb255LXR1bmVyIG1vZHVsZSBpcyBsb2FkZWQgaW50byB0aGUKK2tlcm5lbC4KKworCisgIDQuIFRFU1RJTkcgVEhFIERSSVZFUgorCisKK0JlY2F1c2UgZmV3IExpbnV4IGFwcGxpY2F0aW9ucyBhcmUgYWJsZSB0byBjb3JyZWN0bHkgY2FwdHVyZSBmcm9tCitWaWRlbzRMaW51eDIgZGV2aWNlcyB3aXRoIG9ubHkgY29tcHJlc3NlZCBmb3JtYXRzIHN1cHBvcnRlZCwgdGhlIG5ldyBkcml2ZXIKK3Nob3VsZCBiZSB0ZXN0ZWQgd2l0aCB0aGUgImdvcmVjb3JkIiBhcHBsaWNhdGlvbiBpbiB0aGUgYXBwcy8gZGlyZWN0b3J5LgorCitGaXJzdCBjb25uZWN0IGEgdmlkZW8gc291cmNlIHRvIHRoZSBkZXZpY2UsIHN1Y2ggYXMgYSBEVkQgcGxheWVyIG9yIFZDUi4KK1RoaXMgd2lsbCBiZSBjYXB0dXJlZCB0byBhIGZpbGUgZm9yIHRlc3RpbmcgdGhlIGRyaXZlci4gIElmIGFuIGlucHV0IHNvdXJjZQoraXMgdW5hdmFpbGFibGUsIGEgdGVzdCBmaWxlIGNhbiBzdGlsbCBiZSBjYXB0dXJlZCwgYnV0IHRoZSB2aWRlbyB3aWxsIGJlCitibGFjayBhbmQgdGhlIGF1ZGlvIHdpbGwgYmUgc2lsZW50LgorCitUaGlzIGFwcGxpY2F0aW9uIHdpbGwgYXV0by1kZXRlY3QgdGhlIFY0TDIgYW5kIEFMU0EvT1NTIGRldmljZSBuYW1lcyBvZiB0aGUKK2hhcmR3YXJlIGFuZCB3aWxsIHJlY29yZCB2aWRlbyBhbmQgYXVkaW8gdG8gYW4gQVZJIGZpbGUgZm9yIGEgc3BlY2lmaWVkCitudW1iZXIgb2Ygc2Vjb25kcy4gIEZvciBleGFtcGxlOgorCisgICAgICAgICQgYXBwcy9nb3JlY29yZCAtZHVyYXRpb24gNjAgY2FwdHVyZS5hdmkKKworSWYgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdWNjZXNzZnVsbHkgcmVjb3JkIGFuIEFWSSBmaWxlLCB0aGUgZXJyb3IKK21lc3NhZ2VzIHByb2R1Y2VkIGJ5IGdvcmVjb3JkIGFuZCByZWNvcmRlZCBpbiB0aGUgc3lzdGVtIGxvZyAodXN1YWxseSBpbgorL3Zhci9sb2cvbWVzc2FnZXMpIHNob3VsZCBwcm92aWRlIGluZm9ybWF0aW9uIHRvIGhlbHAgcmVzb2x2ZSB0aGUgcHJvYmxlbS4KKworU3VwcGx5aW5nIG5vIHBhcmFtZXRlcnMgdG8gZ29yZWNvcmQgd2lsbCBjYXVzZSBpdCB0byBwcm9iZSB0aGUgYXZhaWxhYmxlCitkZXZpY2VzIGFuZCBleGl0LiAgVXNlIHRoZSAtaGVscCBmbGFnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi4KKworCisgIDUuIFVTSU5HIFRIRSBEUklWRVIKKworCitUaGUgVjRMMiBkZXZpY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRyaXZlciBwcm92aWRlcyBhIHN0YW5kYXJkIGNvbXByZXNzZWQKK2Zvcm1hdCBBUEksIHdpdGhpbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgorCisgICogQXBwbGljYXRpb25zIHRoYXQgb25seSBzdXBwb3J0IHRoZSBvcmlnaW5hbCBWaWRlbzRMaW51eDEgQVBJIHdpbGwgbm90CisgICAgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoaXMgZHJpdmVyIGF0IGFsbC4KKworICAqIE5vIHJhdyB2aWRlbyBtb2RlcyBhcmUgc3VwcG9ydGVkLCBzbyBhcHBsaWNhdGlvbnMgbGlrZSB4YXd0diB0aGF0CisgICAgZXhwZWN0IG9ubHkgdW5jb21wcmVzc2VkIHZpZGVvIHdpbGwgbm90IGZ1bmN0aW9uLgorCisgICogU3VwcG9ydGVkIGNvbXByZXNzaW9uIGZvcm1hdHMgYXJlOiBNb3Rpb24tSlBFRywgTVBFRzEsIE1QRUcyIGFuZCBNUEVHNC4KKworICAqIE1QRUcgdmlkZW8gZm9ybWF0cyBhcmUgZGVsaXZlcmVkIGFzIFZpZGVvIEVsZW1lbnRhcnkgU3RyZWFtcyBvbmx5LgorICAgIFByb2dyYW0gU3RyZWFtIChQUyksIFRyYW5zcG9ydCBTdHJlYW0gKFRTKSBhbmQgUGFja2V0aXplZCBFbGVtZW50YXJ5CisgICAgU3RyZWFtIChQRVMpIGZvcm1hdHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisKKyAgKiBWaWRlbyBwYXJhbWV0ZXJzIHN1Y2ggYXMgZm9ybWF0IGFuZCBpbnB1dCBwb3J0IG1heSBub3QgYmUgY2hhbmdlZCB3aGlsZQorICAgIHRoZSBlbmNvZGVyIGlzIGFjdGl2ZS4KKworICAqIFRoZSBhdWRpbyBjYXB0dXJlIGRldmljZSBvbmx5IGZ1bmN0aW9ucyB3aGVuIHRoZSB2aWRlbyBlbmNvZGVyIGlzCisgICAgYWN0aXZlbHkgY2FwdHVyaW5nIHZpZGVvLiAgQXR0ZW1wdHMgdG8gcmVhZCBmcm9tIHRoZSBhdWRpbyBkZXZpY2Ugd2hlbgorICAgIHRoZSBlbmNvZGVyIGlzIGluYWN0aXZlIHdpbGwgcmVzdWx0IGluIGFuIEkvTyBlcnJvci4KKworICAqIFRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZSBhdWRpbyBkZXZpY2UgaXMgNDhLaHogMi1jaGFubmVsIDE2LWJpdAorICAgIGxpdHRsZS1lbmRpYW4gUENNLCBkZWxpdmVyZWQgdGhyb3VnaCB0aGUgQUxTQSBzeXN0ZW0uICBObyBhdWRpbworICAgIGNvbXByZXNzaW9uIGlzIGltcGxlbWVudGVkIGluIHRoZSBoYXJkd2FyZS4gIEFMU0EgbWF5IGNvbnZlcnQgdG8gb3RoZXIKKyAgICB1bmNvbXByZXNzZWQgZm9ybWF0cyBvbiB0aGUgZmx5LgorCitUaGUgaW5jbHVkZS8gZGlyZWN0b3J5IGNvbnRhaW5zIGEgQyBoZWFkZXIgZmlsZSBkZXNjcmliaW5nIG5vbi1zdGFuZGFyZAorZmVhdHVyZXMgb2YgdGhlIEdPNzAwN1NCIGVuY29kZXIsIHdoaWNoIGFyZSBkZXNjcmliZWQgYmVsb3c6CisKKworICBHTzcwMDdJT0NfU19DT01QX1BBUkFNUywgR083MDA3SU9DX0dfQ09NUF9QQVJBTVMKKworICAgIFRoZXNlIGlvY3RscyBhcmUgdXNlZCB0byBuZWdvdGlhdGUgZ2VuZXJhbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgorCisgICAgVG8gcXVlcnkgdGhlIGN1cnJlbnQgcGFyYW1ldGVycywgY2FsbCB0aGUgR083MDA3SU9DX0dfQ09NUF9QQVJBTVMgaW9jdGwKKyAgICB3aXRoIGEgcG9pbnRlciB0byBhIHN0cnVjdCBnbzcwMDdfY29tcF9wYXJhbXMuICBJZiB0aGUgZHJpdmVyIGlzIG5vdAorICAgIHNldCB0byBNUEVHIGZvcm1hdCwgdGhlIEVJTlZBTCBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuCisKKyAgICBUbyBjaGFuZ2UgdGhlIGN1cnJlbnQgcGFyYW1ldGVycywgaW5pdGlhbGl6ZSBhbGwgZmllbGRzIG9mIGEgc3RydWN0CisgICAgZ283MDA3X2NvbXBfcGFyYW1zIGFuZCBjYWxsIHRoZSBHTzcwMDdfSU9DX1NfQ09NUF9QQVJBTVMgaW9jdGwgd2l0aCBhCisgICAgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZS4gIFRoZSBkcml2ZXIgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQKKyAgICBwYXJhbWV0ZXJzIHdpdGggYW55IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIGNvbmZvcm0gdG8gdGhlIGxpbWl0YXRpb25zIG9mCisgICAgdGhlIGhhcmR3YXJlIG9yIGN1cnJlbnQgY29tcHJlc3Npb24gbW9kZS4gIEFueSBvciBhbGwgZmllbGRzIGNhbiBiZSBzZXQKKyAgICB0byB6ZXJvIHRvIHJlcXVlc3QgYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuICBJZiB0aGUgZHJpdmVyIGlzIG5vdAorICAgIHNldCB0byBNUEVHIGZvcm1hdCwgdGhlIEVJTlZBTCBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuICBXaGVuIEkvTworICAgIGlzIGluIHByb2dyZXNzLCB0aGUgRUJVU1kgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLgorCisgICAgRmllbGRzIGluIHN0cnVjdCBnbzcwMDdfY29tcF9wYXJhbXM6CisKKyAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIGluIGVhY2gKKyAgICAgICAgICBnb3Bfc2l6ZSAgICAgICAgICAgICAgICAgICBHcm91cCBPZiBQaWN0dXJlczsgaS5lLiB0aGUgbWF4aW11bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBmcmFtZXMgbWludXMgb25lIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGtleSBmcmFtZS4KKworICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXF1ZW50aWFsCisgICAgICAgICAgbWF4X2JfZnJhbWVzICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbGx5LXByZWRpY3RlZCBmcmFtZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEItZnJhbWVzIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4pCisKKyAgICAgICAgZW51bSBnbzcwMDdfYXNwZWN0X3JhdGlvICAgICBUaGUgYXNwZWN0IHJhdGlvIHRvIGJlIGVuY29kZWQgaW4gdGhlCisgICAgICAgICAgYXNwZWN0X3JhdGlvICAgICAgICAgICAgICAgbWV0YS1kYXRhIG9mIHRoZSBjb21wcmVzc2VkIGZvcm1hdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENob2ljZXMgYXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fMV8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X0FTUEVDVF9SQVRJT180XzNfTlRTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fNF8zX1BBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fMTZfOV9OVFNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X0FTUEVDVF9SQVRJT18xNl85X1BBTAorCisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgQml0LXdpc2UgT1Igb2YgY29udHJvbCBmbGFncyAoYmVsb3cpCisgICAgICAgICAgZmxhZ3MKKworICAgIEZsYWdzIGluIHN0cnVjdCBnbzcwMDdfY29tcF9wYXJhbXM6CisKKyAgICAgICAgR083MDA3X0NPTVBfQ0xPU0VEX0dPUCAgICAgICBPbmx5IHByb2R1Y2Ugc2VsZi1jb250YWluZWQgR09QcywgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHByb2R1Y2Ugc3RyZWFtcyBhcHByb3ByaWF0ZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gc2Vla2luZy4KKworICAgICAgICBHTzcwMDdfQ09NUF9PTUlUX1NFUV9IRUFERVIgIE9taXQgdGhlIHN0cmVhbSBzZXF1ZW5jZSBoZWFkZXIuCisKKworICBHTzcwMDdJT0NfU19NUEVHX1BBUkFNUywgR083MDA3SU9DX0dfTVBFR19QQVJBTVMKKworICAgIFRoZXNlIGlvY3RscyBhcmUgdXNlZCB0byBuZWdvdGlhdGUgTVBFRy1zcGVjaWZpYyBzdHJlYW0gcGFyYW1ldGVycyB3aGVuCisgICAgdGhlIHBpeGVsZm9ybWF0IGhhcyBiZWVuIHNldCB0byBWNEwyX1BJWF9GTVRfTVBFRy4KKworICAgIFRvIHF1ZXJ5IHRoZSBjdXJyZW50IHBhcmFtZXRlcnMsIGNhbGwgdGhlIEdPNzAwN0lPQ19HX01QRUdfUEFSQU1TIGlvY3RsCisgICAgd2l0aCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZ283MDA3X21wZWdfcGFyYW1zLiAgSWYgdGhlIGRyaXZlciBpcyBub3QKKyAgICBzZXQgdG8gTVBFRyBmb3JtYXQsIHRoZSBFSU5WQUwgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLgorCisgICAgVG8gY2hhbmdlIHRoZSBjdXJyZW50IHBhcmFtZXRlcnMsIGluaXRpYWxpemUgYWxsIGZpZWxkcyBvZiBhIHN0cnVjdAorICAgIGdvNzAwN19tcGVnX3BhcmFtcyBhbmQgY2FsbCB0aGUgR083MDA3X0lPQ19TX01QRUdfUEFSQU1TIGlvY3RsIHdpdGggYQorICAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUuICBUaGUgZHJpdmVyIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgcGFyYW1ldGVycyB3aXRoIGFueSBuZWNlc3NhcnkgY2hhbmdlcyB0byBjb25mb3JtIHRvIHRoZSBsaW1pdGF0aW9ucyBvZgorICAgIHRoZSBoYXJkd2FyZSBvciBzZWxlY3RlZCBNUEVHIG1vZGUuICBBbnkgb3IgYWxsIGZpZWxkcyBjYW4gYmUgc2V0IHRvCisgICAgemVybyB0byByZXF1ZXN0IGEgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlLiAgSWYgdGhlIGRyaXZlciBpcyBub3Qgc2V0CisgICAgdG8gTVBFRyBmb3JtYXQsIHRoZSBFSU5WQUwgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLiAgV2hlbiBJL08gaXMgaW4KKyAgICBwcm9ncmVzcywgdGhlIEVCVVNZIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4KKworICAgIEZpZWxkcyBpbiBzdHJ1Y3QgZ283MDA3X21wZWdfcGFyYW1zOgorCisgICAgICAgIGVudW0gZ283MDA3X21wZWdfdmlkZW9fc3RhbmRhcmQKKyAgICAgICAgICBtcGVnX3ZpZGVvX3N0YW5kYXJkICAgICAgICBUaGUgTVBFRyB2aWRlbyBzdGFuZGFyZCBpbiB3aGljaCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzIHRoZSB2aWRlby4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENob2ljZXMgYXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHX1ZJREVPX01QRUcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUdfVklERU9fTVBFRzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFR19WSURFT19NUEVHNAorCisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgQml0LXdpc2UgT1Igb2YgY29udHJvbCBmbGFncyAoYmVsb3cpCisgICAgICAgICAgZmxhZ3MKKworICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwcm9maWxlIGFuZCBsZXZlbCBpbmRpY2F0aW9uIHRvIGJlCisgICAgICAgICAgcGFsaSAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSBzZXF1ZW5jZSBoZWFkZXIuICBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgb25seSB1c2VkIGFzIGFuIGluZGljYXRvciB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLCBhbmQgZG9lcyBub3QgYWZmZWN0IHRoZSBNUEVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgdXNlZCBpbiB0aGUgdmlkZW8gc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB2YWxpZCBmb3IgTVBFRzEuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9pY2VzIGZvciBNUEVHMiBhcmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUcyX1BST0ZJTEVfTUFJTl9NQUlOCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9pY2VzIGZvciBNUEVHNCBhcmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfU19MMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX1NfTDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9TX0wyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfU19MMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FSVFNfTDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BUlRTX0wyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVJUU19MMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FSVFNfTDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BU19MMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FTX0wxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVNfTDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BU19MMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FTX0w0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVNfTDUKKworICAgIEZsYWdzIGluIHN0cnVjdCBnbzcwMDdfbXBlZ19wYXJhbXM6CisKKyAgICAgICAgR083MDA3X01QRUdfRk9SQ0VfRFZEX01PREUgICBGb3JjZSBhbGwgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlIGNvbnRyb2wgc2V0dGluZ3MgdG8gY29tcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBEVkQgTVBFRzIgc3RyZWFtIHJlcXVpcmVtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG92ZXJyaWRlcyBtb3N0IGNvbXByZXNzaW9uIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUgc2V0dGluZ3MhCisKKyAgICAgICAgR083MDA3X01QRUdfT01JVF9HT1BfSEVBREVSICBPbWl0IHRoZSBHT1AgaGVhZGVyLgorCisgICAgICAgIEdPNzAwN19NUEVHX1JFUEVBVF9TRVFIRUFERVIgUmVwZWF0IHRoZSBNUEVHIHNlcXVlbmNlIGhlYWRlciBhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdGFydCBvZiBlYWNoIEdPUC4KKworCisgIEdPNzAwN0lPQ19TX0JJVFJBVEUsIEdPNzAwN0lPQ19HX0JJVFJBVEUKKworICAgIFRoZXNlIGlvY3RscyBhcmUgdXNlZCB0byBzZXQgYW5kIHF1ZXJ5IHRoZSB0YXJnZXQgYml0cmF0ZSB2YWx1ZSBmb3IgdGhlCisgICAgY29tcHJlc3NlZCB2aWRlbyBzdHJlYW0uICBUaGUgYml0cmF0ZSBtYXkgYmUgc2VsZWN0ZWQgYnkgc3RvcmluZyB0aGUKKyAgICB0YXJnZXQgYml0cyBwZXIgc2Vjb25kIGluIGFuIGludCBhbmQgY2FsbGluZyBHTzcwMDdJT0NfU19CSVRSQVRFIHdpdGggYQorICAgIHBvaW50ZXIgdG8gdGhlIGludC4gIFRoZSBiaXRyYXRlIG1heSBiZSBxdWVyaWVkIGJ5IGNhbGxpbmcKKyAgICBHTzcwMDdJT0NfR19CSVRSQVRFIHdpdGggYSBwb2ludGVyIHRvIGFuIGludCB3aGVyZSB0aGUgY3VycmVudCBiaXRyYXRlCisgICAgd2lsbCBiZSBzdG9yZWQuCisKKyAgICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgcHJpbWFyeSBtZWFucyBvZiBjb250cm9sbGluZyB0aGUgdmlkZW8gcXVhbGl0eQorICAgIGZvciBhbGwgY29tcHJlc3Npb24gbW9kZXMsIGluY2x1ZGluZyBWNEwyX1BJWF9GTVRfTUpQRUcuICBUaGUKKyAgICBWSURJT0NfU19KUEVHQ09NUCBpb2N0bCBpcyBub3Qgc3VwcG9ydGVkLgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICBJbnN0YWxsaW5nIHRoZSBXSVMgUENJIFZveWFnZXIgRHJpdmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFdJUyBQQ0kgVm95YWdlciBkcml2ZXIgcmVxdWlyZXMgc2V2ZXJhbCBwYXRjaGVzIHRvIHRoZSBMaW51eCAyLjYuMTEueAora2VybmVsIHNvdXJjZSB0cmVlIGJlZm9yZSBjb21waWxpbmcgdGhlIGRyaXZlci4gIFRoZXNlIHBhdGNoZXMgdXBkYXRlIHRoZQoraW4ta2VybmVsIFNBQTcxMzQgZHJpdmVyIHRvIHRoZSBuZXdlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbiBhbmQgcGF0Y2ggYnVncworaW4gdGhlIFREQTgyOTAvVERBODI3NSB0dW5lciBkcml2ZXIuCisKK1RoZSBmb2xsb3dpbmcgcGF0Y2hlcyBtdXN0IGJlIGRvd25sb2FkZWQgZnJvbSBHZXJkIEtub3JyJ3Mgd2Vic2l0ZSBhbmQKK2FwcGxpZWQgaW4gdGhlIG9yZGVyIGxpc3RlZDoKKworCWh0dHA6Ly9kbC5ieXRlc2V4Lm9yZy9wYXRjaGVzLzIuNi4xMS0yL2kyYy10dW5lcgorCWh0dHA6Ly9kbC5ieXRlc2V4Lm9yZy9wYXRjaGVzLzIuNi4xMS0yL2kyYy10dW5lcjIKKwlodHRwOi8vZGwuYnl0ZXNleC5vcmcvcGF0Y2hlcy8yLjYuMTEtMi92NGwyLWFwaS1tcGVnCisJaHR0cDovL2RsLmJ5dGVzZXgub3JnL3BhdGNoZXMvMi42LjExLTIvc2FhNzEzNC11cGRhdGUKKworVGhlIGZvbGxvd2luZyBwYXRjaGVzIGFyZSBpbmNsdWRlZCB3aXRoIHRoaXMgU0RLIGFuZCBjYW4gYmUgYXBwbGllZCBpbiBhbnkKK29yZGVyOgorCisJcGF0Y2hlcy8yLjYuMTEvc2FhNzEzNC12b3lhZ2VyLmRpZmYKKwlwYXRjaGVzLzIuNi4xMS90ZGE4Mjc1LW5ld2FkZHIuZGlmZgorCXBhdGNoZXMvMi42LjExL3RkYTgyOTAtbnRzYy5kaWZmCisKK0NoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgQ09ORklHX1ZJREVPX1NBQTcxMzQgb3B0aW9uIGlzIGVuYWJsZWQgaW4gdGhlIGtlcm5lbAorY29uZmlndXJhdGlvbiwgYW5kIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBrZXJuZWwuCisKK0FmdGVyIHJlYm9vdGluZyBpbnRvIHRoZSBuZXcga2VybmVsLCB0aGUgR083MDA3IGRyaXZlciBjYW4gYmUgY29tcGlsZWQgYW5kCitpbnN0YWxsZWQ6CisKKwkkIG1ha2UgU0FBNzEzNF9CVUlMRD15CisJJCBtYWtlIGluc3RhbGwKKwkkIG1vZHByb2JlIHNhYTcxMzQtZ283MDA3CisKK1RoZXJlIHdpbGwgYmUgdHdvIFY0TCB2aWRlbyBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUENJIFZveWFnZXIuICBUaGUKK2ZpcnN0IGRldmljZSAobW9zdCBsaWtlbHkgL2Rldi92aWRlbzApIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgcmF3IHZpZGVvCitjYXB0dXJlIG1vZGUgb2YgdGhlIFNBQTcxMzMgZGV2aWNlIGFuZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgc291cmNlCit2aWRlbyBwYXJhbWV0ZXJzIGFuZCB0dW5lIHRoZSBUViB0dW5lci4gIFRoaXMgZGV2aWNlIGNhbiBiZSB1c2VkIHdpdGggeGF3dHYKK29yIG90aGVyIFY0TCgyKSB2aWRlbyBzb2Z0d2FyZSBhcyBhIHN0YW5kYXJkIHVuY29tcHJlc3NlZCBkZXZpY2UuCisKK1RoZSBzZWNvbmQgZGV2aWNlIChtb3N0IGxpa2VseSAvZGV2L3ZpZGVvMSkgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorY29tcHJlc3Npb24gZnVuY3Rpb25zIG9mIHRoZSBHTzcwMDcuICBJdCBjYW4gYmUgdGVzdGVkIHVzaW5nIHRoZSBnb3JlY29yZAorYXBwbGljYXRpb24gaW4gdGhlIGFwcHMvIGRpcmVjdG9yeSBvZiB0aGlzIFNESzoKKworCSQgYXBwcy9nb3JlY29yZCAtdmRldmljZSAvZGV2L3ZpZGVvMSAtbm9hdWRpbyB0ZXN0LmF2aQorCitDdXJyZW50bHkgdGhlIGZyYW1lIHJlc29sdXRpb24gaXMgZml4ZWQgYXQgNzIweDQ4MCAoTlRTQykgb3IgNzIweDU3NiAoUEFMKSwKK2FuZCB0aGUgdmlkZW8gc3RhbmRhcmQgbXVzdCBiZSBzcGVjaWZpZWQgdG8gYm90aCB0aGUgcmF3IGFuZCB0aGUgY29tcHJlc3NlZAordmlkZW8gZGV2aWNlcyAoeGF3dHYgYW5kIGdvcmVjb3JkLCBmb3IgZXhhbXBsZSkuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JFTEVBU0UgTk9URVMgRk9SIFdJUyBHTzcwMDdTQiBMSU5VWCBEUklWRVIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMYXN0IHVwZGF0ZWQ6IDUgTm92ZW1iZXIgMjAwNQorCisgLSBSZWxlYXNlIDAuOS43IGluY2x1ZGVzIG5ldyBzdXBwb3J0IGZvciB1c2luZyB1ZGV2IHRvIHJ1biBmeGxvYWQuICBUaGUKKyAgIGluc3RhbGwgc2NyaXB0IHNob3VsZCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGV0aGVyIHRoZSBvbGQgaG90cGx1ZworICAgc2NyaXB0cyBvciB0aGUgbmV3IHVkZXYgcnVsZXMgc2hvdWxkIGJlIHVzZWQuICBUbyBmb3JjZSB0aGUgdXNlIG9mCisgICBob3RwbHVnLCBydW4gIm1ha2UgaW5zdGFsbCBVU0VfVURFVj1uIi4gIFRvIGZvcmNlIHRoZSB1c2Ugb2YgdWRldiwgcnVuCisgICAibWFrZSBpbnN0YWxsIFVTRV9VREVWPXkiLgorCisgLSBNb3Rpb24gZGV0ZWN0aW9uIGlzIHN1cHBvcnRlZCBidXQgdW5kb2N1bWVudGVkLiAgVHJ5IHRoZSBgbW9kZXRgIGFwcAorICAgZm9yIGEgZGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIHRoZSBmYWNpbGl0eS4KKworIC0gVXNpbmcgVVNCMi4wIGRldmljZXMgc3VjaCBhcyB0aGUgVFY0MDJVIHdpdGggVVNCMS4xIEhDRHMgb3IgaHVicyBjYW4KKyAgIGNhdXNlIGJ1ZmZlciBvdmVycnVucyBhbmQgZnJhbWUgZHJvcHMsIGV2ZW4gYXQgbG93IGZyYW1lcmF0ZXMsIGR1ZSB0bworICAgaW5jb25zaXN0ZW5jeSBpbiB0aGUgYml0cmF0ZSBjb250cm9sIG1lY2hhbmlzbS4KKworIC0gT24gZGV2aWNlcyB3aXRoIGFuIFNBQTcxMTUsIGluY2x1ZGluZyB0aGUgUGxleHRvciBDb252ZXJ0WCwgdmlkZW8gaGVpZ2h0CisgICB2YWx1ZXMgb2YgOTYsIDEyOCwgMTYwLCAxOTIsIDI1NiwgMzIwLCBhbmQgMzg0IGRvIG5vdCB3b3JrIGluIE5UU0MgbW9kZS4KKyAgIEFsbCB2YWxpZCBoZWlnaHRzIHVwIHRvIDUxMiB3b3JrIGNvcnJlY3RseSBpbiBQQUwgbW9kZS4KKworIC0gVGhlIFdJUyBTdGFyIFRyZWsgYW5kIFBDSSBWb3lhZ2VyIGJvYXJkcyBoYXZlIG5vIHN1cHBvcnQgeWV0IGZvciBhdWRpbworICAgb3IgdGhlIFRWIHR1bmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1ib2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1ib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjg0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWJvYXJkLmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2Vuc29yYXkgQ29tcGFueSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgImdvNzAwNy1wcml2LmgiCisjaW5jbHVkZSAid2lzLWkyYy5oIgorCitleHRlcm4gaW50IHMyMjUwbG9hZGVyX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBzMjI1MGxvYWRlcl9jbGVhbnVwKHZvaWQpOworCisjZGVmaW5lIFRMVjMyMF9BRERSRVNTICAgICAgMHgzNAorI2RlZmluZSBTMjI1MF9WSURERUMgICAgICAgIDB4ODYKKyNkZWZpbmUgVlBYMzIyX0FERFJfQU5BTE9HQ09OVFJPTDEJMHgwMgorI2RlZmluZSBWUFgzMjJfQUREUl9CUklHSFRORVNTMAkJMHgwMTI3CisjZGVmaW5lIFZQWDMyMl9BRERSX0JSSUdIVE5FU1MxCQkweDAxMzEKKyNkZWZpbmUgVlBYMzIyX0FERFJfQ09OVFJBU1QwCQkweDAxMjgKKyNkZWZpbmUgVlBYMzIyX0FERFJfQ09OVFJBU1QxCQkweDAxMzIKKyNkZWZpbmUgVlBYMzIyX0FERFJfSFVFCQkJMHgwMGRjCisjZGVmaW5lIFZQWDMyMl9BRERSX1NBVAkgCSAgICAgICAgMHgwMDMwCisKK3N0cnVjdCBnbzcwMDdfdXNiX2JvYXJkIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc3RydWN0IGdvNzAwN19ib2FyZF9pbmZvIG1haW5faW5mbzsKK307CisKK3N0cnVjdCBnbzcwMDdfdXNiIHsKKwlzdHJ1Y3QgZ283MDA3X3VzYl9ib2FyZCAqYm9hcmQ7CisJc3RydWN0IHNlbWFwaG9yZSBpMmNfbG9jazsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCXN0cnVjdCB1cmIgKnZpZGVvX3VyYnNbOF07CisJc3RydWN0IHVyYiAqYXVkaW9fdXJic1s4XTsKKwlzdHJ1Y3QgdXJiICppbnRyX3VyYjsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF1ZF9yZWdzW10gPSB7CisJMHgxZSwgMHgwMCwKKwkweDAwLCAweDE3LAorCTB4MDIsIDB4MTcsCisJMHgwNCwgMHhmOSwKKwkweDA2LCAweGY5LAorCTB4MDgsIDB4MDIsCisJMHgwYSwgMHgwMCwKKwkweDBjLCAweDAwLAorCTB4MGEsIDB4MDAsCisJMHgwYywgMHgwMCwKKwkweDBlLCAweDAyLAorCTB4MTAsIDB4MDAsCisJMHgxMiwgMHgwMSwKKwkweDAwLCAweDAwLAorfTsKKworCitzdGF0aWMgdW5zaWduZWQgY2hhciB2aWRfcmVnc1tdID0geworCTB4RjIsIDB4MGYsCisJMHhBQSwgMHgwMCwKKwkweEY4LCAweGZmLAorCTB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdTE2IHZpZF9yZWdzX2ZwW10gPSB7CisJMHgwMjgsIDB4MDY3LAorCTB4MTIwLCAweDAxNiwKKwkweDEyMSwgMHhjRjIsCisJMHgxMjIsIDB4MEYyLAorCTB4MTIzLCAweDAwYywKKwkweDEyNCwgMHgyZDAsCisJMHgxMjUsIDB4MmUwLAorCTB4MTI2LCAweDAwNCwKKwkweDEyOCwgMHgxRTAsCisJMHgxMkEsIDB4MDE2LAorCTB4MTJCLCAweDBGMiwKKwkweDEyQywgMHgwRjIsCisJMHgxMkQsIDB4MDBjLAorCTB4MTJFLCAweDJkMCwKKwkweDEyRiwgMHgyZTAsCisJMHgxMzAsIDB4MDA0LAorCTB4MTMyLCAweDFFMCwKKwkweDE0MCwgMHgwNjAsCisJMHgxNTMsIDB4MDBDLAorCTB4MTU0LCAweDIwMCwKKwkweDE1MCwgMHg4MDEsCisJMHgwMDAsIDB4MDAwCit9OworCisvKiBQQUwgc3BlY2lmaWMgdmFsdWVzICovCitzdGF0aWMgdTE2IHZpZF9yZWdzX2ZwX3BhbFtdID0KK3sKKwkweDEyMCwgMHgwMTcsCisJMHgxMjEsIDB4ZDIyLAorCTB4MTIyLCAweDEyMiwKKwkweDEyQSwgMHgwMTcsCisJMHgxMkIsIDB4MTIyLAorCTB4MTJDLCAweDEyMiwKKwkweDE0MCwgMHgwNjAsCisJMHgwMDAsIDB4MDAwLAorfTsKKworc3RydWN0IHMyMjUwIHsKKwlpbnQgc3RkOworCWludCBpbnB1dDsKKwlpbnQgYnJpZ2h0bmVzczsKKwlpbnQgY29udHJhc3Q7CisJaW50IHNhdHVyYXRpb247CisJaW50IGh1ZTsKKwlpbnQgcmVnMTJiX3ZhbDsKKwlpbnQgYXVkaW9faW5wdXQ7Cit9OworCisvKiBmcm9tIGdvNzAwNy11c2IuYyB3aGljaCBpcyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBNaWNyb25hcyBVU0EgSW5jLiovCitzdGF0aWMgaW50IGdvNzAwN191c2JfdmVuZG9yX3JlcXVlc3Qoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiByZXF1ZXN0LAorCXUxNiB2YWx1ZSwgdTE2IGluZGV4LCB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBsZW5ndGgsIGludCBpbikKK3sKKwlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCWludCB0aW1lb3V0ID0gNTAwMDsKKworCWlmIChpbikgeworCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHVzYi0+dXNiZGV2LAorCQkJCXVzYl9yY3ZjdHJscGlwZSh1c2ItPnVzYmRldiwgMCksIHJlcXVlc3QsCisJCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCisJCQkJdmFsdWUsIGluZGV4LCB0cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCwgdGltZW91dCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHVzYl9jb250cm9sX21zZyh1c2ItPnVzYmRldiwKKwkJCQl1c2Jfc25kY3RybHBpcGUodXNiLT51c2JkZXYsIDApLCByZXF1ZXN0LAorCQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkJdmFsdWUsIGluZGV4LCB0cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCwgdGltZW91dCk7CisJfQorfQorLyogZW5kIGZyb20gZ283MDA3LXVzYi5jIHdoaWNoIGlzIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IE1pY3JvbmFzIFVTQSBJbmMuKi8KKworc3RhdGljIGludCB3cml0ZV9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKwlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCWludCByYzsKKwlpbnQgZGV2X2FkZHIgPSBjbGllbnQtPmFkZHI7CisJdTggKmJ1ZjsKKworCWlmIChnbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChnby0+c3RhdHVzID09IFNUQVRVU19TSFVURE9XTikKKwkJcmV0dXJuIC1FQlVTWTsKKworCWJ1ZiA9IGt6YWxsb2MoMTYsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ1c2ItPmkyY19sb2NrKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImkyYyBsb2NrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVFI7CisJfQorCXJjID0gZ283MDA3X3VzYl92ZW5kb3JfcmVxdWVzdChnbywgMHg1NSwgZGV2X2FkZHIsCisJCQkJICAgICAgIChyZWc8PDggfCB2YWx1ZSksCisJCQkJICAgICAgIGJ1ZiwKKwkJCQkgICAgICAgMTYsIDEpOworCisJdXAoJnVzYi0+aTJjX2xvY2spOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdyaXRlX3JlZ19mcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKwlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCXU4ICpidWY7CisJc3RydWN0IHMyMjUwICpkZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChnbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChnby0+c3RhdHVzID09IFNUQVRVU19TSFVURE9XTikKKwkJcmV0dXJuIC1FQlVTWTsKKworCWJ1ZiA9IGt6YWxsb2MoMTYsIEdGUF9LRVJORUwpOworCisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCisKKwltZW1zZXQoYnVmLCAweGNkLCA2KTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnVzYi0+aTJjX2xvY2spICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaTJjIGxvY2sgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5UUjsKKwl9CisJaWYgKGdvNzAwN191c2JfdmVuZG9yX3JlcXVlc3QoZ28sIDB4NTcsIGFkZHIsIHZhbCwgYnVmLCAxNiwgMSkgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVwKCZ1c2ItPmkyY19sb2NrKTsKKwlpZiAoYnVmWzBdID09IDApIHsKKwkJdW5zaWduZWQgaW50IHN1YmFkZHIsIHZhbF9yZWFkOworCisJCXN1YmFkZHIgPSAoYnVmWzRdIDw8IDgpICsgYnVmWzVdOworCQl2YWxfcmVhZCA9IChidWZbMl0gPDwgOCkgKyBidWZbM107CisJCWlmICh2YWxfcmVhZCAhPSB2YWwpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImludmFsaWQgZnAgd3JpdGUgJXggJXhcbiIsCisJCQkgICAgICAgdmFsX3JlYWQsIHZhbCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoc3ViYWRkciAhPSBhZGRyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJpbnZhbGlkIGZwIHdyaXRlIGFkZHIgJXggJXhcbiIsCisJCQkgICAgICAgc3ViYWRkciwgYWRkcik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHNhdmUgbGFzdCAxMmIgdmFsdWUgKi8KKwlpZiAoYWRkciA9PSAweDEyYikKKwkJZGVjLT5yZWcxMmJfdmFsID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcmVncyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCAqcmVncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7ICEoKHJlZ3NbaV0gPT0gMHgwMCkgJiYgKHJlZ3NbaSsxXSA9PSAweDAwKSk7IGkgKz0gMikgeworCQlpZiAod3JpdGVfcmVnKGNsaWVudCwgcmVnc1tpXSwgcmVnc1tpKzFdKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3JlZ3NfZnAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2ICpyZWdzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgISgocmVnc1tpXSA9PSAweDAwKSAmJiAocmVnc1tpKzFdID09IDB4MDApKTsgaSArPSAyKSB7CisJCWlmICh3cml0ZV9yZWdfZnAoY2xpZW50LCByZWdzW2ldLCByZWdzW2krMV0pIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTA6IGZhaWxlZCBmcFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzMjI1MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzMjI1MCAqZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJeworCQlpbnQgdmlkc3lzOworCQlpbnQgKmlucHV0ID0gYXJnOworCisJCXZpZHN5cyA9IChkZWMtPnN0ZCA9PSBWNEwyX1NURF9OVFNDKSA/IDB4MDEgOiAweDAwOworCQlpZiAoKmlucHV0ID09IDApIHsKKwkJCS8qIGNvbXBvc2l0ZSAqLworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMCwgMHgwMjAgfCB2aWRzeXMpOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMSwgMHg2NjIpOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFMtVmlkZW8gKi8KKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIDB4MDQwIHwgdmlkc3lzKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjEsIDB4NjY2KTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJCX0KKwkJZGVjLT5pbnB1dCA9ICppbnB1dDsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwkJdTE2IHZpZHNvdXJjZTsKKworCQl2aWRzb3VyY2UgPSAoZGVjLT5pbnB1dCA9PSAxKSA/IDB4MDQwIDogMHgwMjA7CisJCWRlYy0+c3RkID0gKnN0ZDsKKwkJc3dpdGNoIChkZWMtPnN0ZCkgeworCQljYXNlIFY0TDJfU1REX05UU0M6CisJCQl3cml0ZV9yZWdzX2ZwKGNsaWVudCwgdmlkX3JlZ3NfZnApOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMCwgdmlkc291cmNlIHwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1NURF9QQUw6CisJCQl3cml0ZV9yZWdzX2ZwKGNsaWVudCwgdmlkX3JlZ3NfZnApOworCQkJd3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwX3BhbCk7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCB2aWRzb3VyY2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsID0gYXJnOworCQlzdGF0aWMgY29uc3QgdTMyIHVzZXJfY3RybHNbXSA9IHsKKwkJCVY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJCQlWNEwyX0NJRF9DT05UUkFTVCwKKwkJCVY0TDJfQ0lEX1NBVFVSQVRJT04sCisJCQlWNEwyX0NJRF9IVUUsCisJCQkwCisJCX07CisJCXN0YXRpYyBjb25zdCB1MzIgKmN0cmxfY2xhc3Nlc1tdID0geworCQkJdXNlcl9jdHJscywKKwkJCU5VTEwKKwkJfTsKKworCQljdHJsLT5pZCA9IHY0bDJfY3RybF9uZXh0KGN0cmxfY2xhc3NlcywgY3RybC0+aWQpOworCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCXY0bDJfY3RybF9xdWVyeV9maWxsKGN0cmwsIDAsIDEwMCwgMSwgNTApOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAwLCAxMDAsIDEsIDUwKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAwLCAxMDAsIDEsIDUwKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCXY0bDJfY3RybF9xdWVyeV9maWxsKGN0cmwsIC01MCwgNTAsIDEsIDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljdHJsLT5uYW1lWzBdID0gJ1wwJzsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCQlpbnQgdmFsdWUxOworCisJCXN3aXRjaCAoY3RybC0+aWQpIHsKKwkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTA6IGZ1dHVyZSBzZXR0aW5nXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTA6IGZ1dHVyZSBzZXR0aW5nXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCWlmIChjdHJsLT52YWx1ZSA+IDEyNykKKwkJCQlkZWMtPnNhdHVyYXRpb24gPSAxMjc7CisJCQllbHNlIGlmIChjdHJsLT52YWx1ZSA8IDApCisJCQkJZGVjLT5zYXR1cmF0aW9uID0gMDsKKwkJCWVsc2UKKwkJCQlkZWMtPnNhdHVyYXRpb24gPSBjdHJsLT52YWx1ZTsKKworCQkJdmFsdWUxID0gZGVjLT5zYXR1cmF0aW9uICogNDE0MCAvIDEwMDsKKwkJCWlmICh2YWx1ZTEgPiA0MDk0KQorCQkJCXZhbHVlMSA9IDQwOTQ7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9TQVQsIHZhbHVlMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQlpZiAoY3RybC0+dmFsdWUgPiA1MCkKKwkJCQlkZWMtPmh1ZSA9IDUwOworCQkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPCAtNTApCisJCQkJZGVjLT5odWUgPSAtNTA7CisJCQllbHNlCisJCQkJZGVjLT5odWUgPSBjdHJsLT52YWx1ZTsKKwkJCS8qIGNsYW1wIHRoZSBodWUgcmFuZ2UgKi8KKwkJCXZhbHVlMSA9IGRlYy0+aHVlICogMjgwIC8gNTA7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9IVUUsIHZhbHVlMSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19DVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKKworCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCWN0cmwtPnZhbHVlID0gZGVjLT5icmlnaHRuZXNzOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQljdHJsLT52YWx1ZSA9IGRlYy0+Y29udHJhc3Q7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJY3RybC0+dmFsdWUgPSBkZWMtPnNhdHVyYXRpb247CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQljdHJsLT52YWx1ZSA9IGRlYy0+aHVlOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7CisJCWlmIChmbXQtPmZtdC5waXguaGVpZ2h0IDwgNjQwKSB7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDEyYiwgZGVjLT5yZWcxMmJfdmFsIHwgMHg0MDApOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTJiLCBkZWMtPnJlZzEyYl92YWwgJiB+MHg0MDApOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphdWRpbyA9IGFyZzsKKworCQltZW1zZXQoYXVkaW8sIDAsIHNpemVvZigqYXVkaW8pKTsKKwkJYXVkaW8tPmluZGV4ID0gZGVjLT5hdWRpb19pbnB1dDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJfQorCWNhc2UgVklESU9DX0VOVU1BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphdWRpbyA9IGFyZzsKKworCQlzd2l0Y2ggKGF1ZGlvLT5pbmRleCkgeworCQljYXNlIDA6CisJCQlzdHJjcHkoYXVkaW8tPm5hbWUsICJMaW5lIEluIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc3RyY3B5KGF1ZGlvLT5uYW1lLCAiTWljIik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc3RyY3B5KGF1ZGlvLT5uYW1lLCAiTWljIEJvb3N0Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWF1ZGlvLT5uYW1lWzBdID0gJ1wwJzsKKwkJCXJldHVybiAwOworCQl9CisJCWF1ZGlvLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCQlhdWRpby0+bW9kZSA9IDA7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX0FVRElPOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKmF1ZGlvID0gYXJnOworCisJCWNsaWVudC0+YWRkciA9IFRMVjMyMF9BRERSRVNTOworCQlzd2l0Y2ggKGF1ZGlvLT5pbmRleCkgeworCQljYXNlIDA6CisJCQl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDAyKTsgLyogTGluZSBJbiAqLworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXdyaXRlX3JlZyhjbGllbnQsIDB4MDgsIDB4MDQpOyAvKiBNaWMgKi8KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDA1KTsgLyogTWljIEJvb3N0ICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRlYy0+YXVkaW9faW5wdXQgPSBhdWRpby0+aW5kZXg7CisJCXJldHVybiAwOworCX0KKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiB1bmtub3duIGNvbW1hbmQgMHgleFxuIiwgY21kKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgczIyNTBfZHJpdmVyOworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgczIyNTBfY2xpZW50X3RlbXBsID0geworCS5uYW1lCQk9ICJTZW5zb3JheSAyMjUwIiwKKwkuZHJpdmVyCQk9ICZzMjI1MF9kcml2ZXIsCit9OworCitzdGF0aWMgaW50IHMyMjUwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBzMjI1MCAqZGVjOworCXU4ICpkYXRhOworCXN0cnVjdCBnbzcwMDcgKmdvID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCisJY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2xpZW50ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShjbGllbnQsICZzMjI1MF9jbGllbnRfdGVtcGwsCisJICAgICAgIHNpemVvZihzMjI1MF9jbGllbnRfdGVtcGwpKTsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCisJZGVjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHMyMjUwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRlYyA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRlYy0+c3RkID0gVjRMMl9TVERfTlRTQzsKKwlkZWMtPmJyaWdodG5lc3MgPSA1MDsKKwlkZWMtPmNvbnRyYXN0ID0gNTA7CisJZGVjLT5zYXR1cmF0aW9uID0gNTA7CisJZGVjLT5odWUgPSAwOworCWNsaWVudC0+YWRkciA9IFRMVjMyMF9BRERSRVNTOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRlYyk7CisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiczIyNTA6IGluaXRpYWxpemluZyB2aWRlbyBkZWNvZGVyIG9uICVzXG4iLAorCSAgICAgICBhZGFwdGVyLT5uYW1lKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGF1ZGlvICovCisJY2xpZW50LT5hZGRyID0gVExWMzIwX0FERFJFU1M7CisJaWYgKHdyaXRlX3JlZ3MoY2xpZW50LCBhdWRfcmVncykgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInMyMjUwOiBlcnJvciBpbml0aWFsaXppbmcgYXVkaW9cbiIpOworCQlrZnJlZShjbGllbnQpOworCQlrZnJlZShkZWMpOworCQlyZXR1cm4gMDsKKwl9CisJY2xpZW50LT5hZGRyID0gUzIyNTBfVklEREVDOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRlYyk7CisKKwlpZiAod3JpdGVfcmVncyhjbGllbnQsIHZpZF9yZWdzKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiczIyNTA6IGVycm9yIGluaXRpYWxpemluZyBkZWNvZGVyXG4iKTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh3cml0ZV9yZWdzX2ZwKGNsaWVudCwgdmlkX3JlZ3NfZnApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJzMjI1MDogZXJyb3IgaW5pdGlhbGl6aW5nIGRlY29kZXJcbiIpOworCQlrZnJlZShjbGllbnQpOworCQlrZnJlZShkZWMpOworCQlyZXR1cm4gMDsKKwl9CisJLyogc2V0IGRlZmF1bHQgY2hhbm5lbCAqLworCS8qIGNvbXBvc2l0ZSAqLworCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIDB4MDIwIHwgMSk7CisJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMSwgMHg2NjIpOworCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisKKwkvKiBzZXQgZGVmYXVsdCBhdWRpbyBpbnB1dCAqLworCWRlYy0+YXVkaW9faW5wdXQgPSAwOworCXdyaXRlX3JlZyhjbGllbnQsIDB4MDgsIDB4MDIpOyAvKiBMaW5lIEluICovCisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ1c2ItPmkyY19sb2NrKSA9PSAwKSB7CisJCWRhdGEgPSBremFsbG9jKDE2LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRhdGEgIT0gTlVMTCkgeworCQkJaW50IHJjOworCQkJcmMgPSBnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KGdvLCAweDQxLCAwLCAwLAorCQkJCQkJICAgICAgIGRhdGEsIDE2LCAxKTsKKwkJCWlmIChyYyA+IDApIHsKKwkJCQl1OCBtYXNrOworCQkJCWRhdGFbMF0gPSAwOworCQkJCW1hc2sgPSAxPDw1OworCQkJCWRhdGFbMF0gJj0gfm1hc2s7CisJCQkJZGF0YVsxXSB8PSBtYXNrOworCQkJCWdvNzAwN191c2JfdmVuZG9yX3JlcXVlc3QoZ28sIDB4NDAsIDAsCisJCQkJCQkJICAoZGF0YVsxXTw8OCkKKwkJCQkJCQkgICsgZGF0YVsxXSwKKwkJCQkJCQkgIGRhdGEsIDE2LCAwKTsKKwkJCX0KKwkJCWtmcmVlKGRhdGEpOworCQl9CisJCXVwKCZ1c2ItPmkyY19sb2NrKTsKKwl9CisKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXByaW50aygiczIyNTA6IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczIyNTBfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHMyMjUwICpkZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcjsKKworCXIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlrZnJlZShjbGllbnQpOworCWtmcmVlKGRlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzMjI1MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiU2Vuc29yYXkgMjI1MCBib2FyZCBkcml2ZXIiLAorCX0sCisJLmlkCQk9IEkyQ19EUklWRVJJRF9TMjI1MCwKKwkuZGV0YWNoX2NsaWVudAk9IHMyMjUwX2RldGFjaCwKKwkuY29tbWFuZAk9IHMyMjUwX2NvbW1hbmQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzMjI1MF9pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlyID0gczIyNTBsb2FkZXJfaW5pdCgpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gaTJjX2FkZF9kcml2ZXIoJnMyMjUwX2RyaXZlcik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKwlyZXR1cm4gd2lzX2kyY19hZGRfZHJpdmVyKHMyMjUwX2RyaXZlci5pZCwgczIyNTBfZGV0ZWN0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHMyMjUwX2NsZWFudXAodm9pZCkKK3sKKwl3aXNfaTJjX2RlbF9kcml2ZXIoczIyNTBfZGV0ZWN0KTsKKwlpMmNfZGVsX2RyaXZlcigmczIyNTBfZHJpdmVyKTsKKworCXMyMjUwbG9hZGVyX2NsZWFudXAoKTsKK30KKworbW9kdWxlX2luaXQoczIyNTBfaW5pdCk7Cittb2R1bGVfZXhpdChzMjI1MF9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJvYXJkIGRyaXZlciBmb3IgU2Vuc29yeXJheSAyMjUwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWxvYWRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU0YWNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZW5zb3JheSBDb21wYW55IEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGR2Yi11c2IuaD4KKworI2RlZmluZSBTMjI1MF9MT0FERVJfRklSTVdBUkUJInMyMjUwX2xvYWRlci5mdyIKKyNkZWZpbmUgUzIyNTBfRklSTVdBUkUJCSJzMjI1MC5mdyIKKwordHlwZWRlZiBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbl9zIHsKKyAgICBzdHJ1Y3Qga3JlZiAgICAga3JlZjsKKyAgICBpbnQgbWlub3I7CisgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKK30gZGV2aWNlX2V4dGVuc2lvbl90LCAqcGRldmljZV9leHRlbnNpb25fdDsKKworI2RlZmluZSBVU0JfczIyNTBsb2FkZXJfTUFKT1IgMjQwCisjZGVmaW5lIFVTQl9zMjI1MGxvYWRlcl9NSU5PUl9CQVNFIDAKKyNkZWZpbmUgTUFYX0RFVklDRVMgMjU2CisKK3N0YXRpYyBwZGV2aWNlX2V4dGVuc2lvbl90IHMyMjUwX2Rldl90YWJsZVtNQVhfREVWSUNFU107CitzdGF0aWMgREVDTEFSRV9NVVRFWChzMjI1MF9kZXZfdGFibGVfbXV0ZXgpOworCisjZGVmaW5lIHRvX3MyMjUwbG9hZGVyX2Rldl9jb21tb24oZCkgY29udGFpbmVyX29mKGQsIGRldmljZV9leHRlbnNpb25fdCwga3JlZikKK3N0YXRpYyB2b2lkIHMyMjUwbG9hZGVyX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlwZGV2aWNlX2V4dGVuc2lvbl90IHMgPSB0b19zMjI1MGxvYWRlcl9kZXZfY29tbW9uKGtyZWYpOworCXMyMjUwX2Rldl90YWJsZVtzLT5taW5vcl0gPSBOVUxMOworCWtmcmVlKHMpOworfQorCitzdGF0aWMgaW50IHMyMjUwbG9hZGVyX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJaW50IG1pbm9yLCByZXQ7CisJcGRldmljZV9leHRlbnNpb25fdCBzID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCisJdXNiZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKKwlpZiAoIXVzYmRldikgeworCQlwcmludGsoS0VSTl9FUlIgIkVudGVyIHMyMjUwbG9hZGVyX3Byb2JlIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiRW50ZXIgczIyNTBsb2FkZXJfcHJvYmUgMi42IGtlcm5lbFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAidmVuZG9yIGlkIDB4JXgsIGRldmljZSBpZCAweCV4IGRldm51bTolZFxuIiwKKwkgICB1c2JkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QsCisJICAgdXNiZGV2LT5kZXZudW0pOworCisJaWYgKHVzYmRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGhhbmRsZSBtdWx0aXBsZSBjb25maWdcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRvd24oJnMyMjUwX2Rldl90YWJsZV9tdXRleCk7CisKKwlmb3IgKG1pbm9yID0gMDsgbWlub3IgPCBNQVhfREVWSUNFUzsgbWlub3IrKykgeworCQlpZiAoczIyNTBfZGV2X3RhYmxlW21pbm9yXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCisJaWYgKG1pbm9yIDwgMCB8fCBtaW5vciA+PSBNQVhfREVWSUNFUykgeworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgbWlub3I6ICVkXG4iLCBtaW5vcik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIEFsbG9jYXRlIGRldiBkYXRhIHN0cnVjdHVyZSAqLworCXMgPSBrbWFsbG9jKHNpemVvZihkZXZpY2VfZXh0ZW5zaW9uX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlzMjI1MF9kZXZfdGFibGVbbWlub3JdID0gczsKKworCXByaW50ayhLRVJOX0lORk8gInMyMjUwbG9hZGVyX3Byb2JlOiBEZXZpY2UgJWQgb24gQnVzICVkIE1pbm9yICVkXG4iLAorCQl1c2JkZXYtPmRldm51bSwgdXNiZGV2LT5idXMtPmJ1c251bSwgbWlub3IpOworCisJbWVtc2V0KHMsIDAsIHNpemVvZihkZXZpY2VfZXh0ZW5zaW9uX3QpKTsKKwlzLT51c2JkZXYgPSB1c2JkZXY7CisJcHJpbnRrKEtFUk5fSU5GTyAibG9hZGluZyAyMjUwIGxvYWRlclxuIik7CisKKwlrcmVmX2luaXQoJihzLT5rcmVmKSk7CisKKwl1cCgmczIyNTBfZGV2X3RhYmxlX211dGV4KTsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgUzIyNTBfTE9BREVSX0ZJUk1XQVJFLCAmdXNiZGV2LT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJInMyMjUwOiB1bmFibGUgdG8gbG9hZCBmaXJtd2FyZSBmcm9tIGZpbGUgXCIlc1wiXG4iLAorCQkJUzIyNTBfTE9BREVSX0ZJUk1XQVJFKTsKKwkJZ290byBmYWlsZWQyOworCX0KKwlyZXQgPSB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHVzYmRldiwgZncsIENZUFJFU1NfRlgyKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsb2FkZXIgZG93bmxvYWQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQyOworCX0KKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgUzIyNTBfRklSTVdBUkUsICZ1c2JkZXYtPmRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiczIyNTA6IHVuYWJsZSB0byBsb2FkIGZpcm13YXJlIGZyb20gZmlsZSBcIiVzXCJcbiIsCisJCQlTMjI1MF9GSVJNV0FSRSk7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisJcmV0ID0gdXNiX2N5cHJlc3NfbG9hZF9maXJtd2FyZSh1c2JkZXYsIGZ3LCBDWVBSRVNTX0ZYMik7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKDAgIT0gcmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmlybXdhcmVfczIyNTAgZG93bmxvYWQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQyOworCX0KKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBzKTsKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCXVwKCZzMjI1MF9kZXZfdGFibGVfbXV0ZXgpOworZmFpbGVkMjoKKwlpZiAocykKKwkJa3JlZl9wdXQoJihzLT5rcmVmKSwgczIyNTBsb2FkZXJfZGVsZXRlKTsKKworCXByaW50ayhLRVJOX0VSUiAicHJvYmUgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHMyMjUwbG9hZGVyX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlwZGV2aWNlX2V4dGVuc2lvbl90IHMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTA6IGRpc2Nvbm5lY3RcbiIpOworCWxvY2tfa2VybmVsKCk7CisJcyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJa3JlZl9wdXQoJihzLT5rcmVmKSwgczIyNTBsb2FkZXJfZGVsZXRlKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBzMjI1MGxvYWRlcl9pZHNbXSA9IHsKKwl7VVNCX0RFVklDRSgweDE5NDMsIDB4YTI1MCl9LAorCXt9ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHMyMjUwbG9hZGVyX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzMjI1MGxvYWRlcl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInMyMjUwLWxvYWRlciIsCisJLnByb2JlCQk9IHMyMjUwbG9hZGVyX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gczIyNTBsb2FkZXJfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBzMjI1MGxvYWRlcl9pZHMsCit9OworCitpbnQgczIyNTBsb2FkZXJfaW5pdCh2b2lkKQoreworCWludCByOworCXVuc2lnbmVkIGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ERVZJQ0VTOyBpKyspCisJCXMyMjUwX2Rldl90YWJsZVtpXSA9IE5VTEw7CisKKwlyID0gdXNiX3JlZ2lzdGVyKCZzMjI1MGxvYWRlcl9kcml2ZXIpOworCWlmIChyKSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ayhLRVJOX0lORk8gInMyMjUwbG9hZGVyX2luaXQ6IGRyaXZlciByZWdpc3RlcmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woczIyNTBsb2FkZXJfaW5pdCk7CisKK3ZvaWQgczIyNTBsb2FkZXJfY2xlYW51cCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gInMyMjUwbG9hZGVyX2NsZWFudXBcbiIpOworCXVzYl9kZXJlZ2lzdGVyKCZzMjI1MGxvYWRlcl9kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTChzMjI1MGxvYWRlcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYwppbmRleCBjNGE2ZDhlLi42NjViYmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3NhYTcxMzQtZ283MDA3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zYWE3MTM0LWdvNzAwNy5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlICJzYWE3MTM0LXJlZy5oIgogI2luY2x1ZGUgInNhYTcxMzQuaCIKQEAgLTMxNCw3ICszMTQsMTMgQEAKIHN0YXRpYyBpbnQgc2FhNzEzNF9nbzcwMDdfc3RyZWFtX3N0b3Aoc3RydWN0IGdvNzAwNyAqZ28pCiB7CiAJc3RydWN0IHNhYTcxMzRfZ283MDA3ICpzYWEgPSBnby0+aHBpX2NvbnRleHQ7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBzYWEtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldjsKKworCWlmICghc2FhKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYgPSBzYWEtPmRldjsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBTaHV0IGRvd24gVFMgRklGTyAqLwogCXNhYV9jbGVhcmwoU0FBNzEzNF9NQUlOX0NUUkwsIFNBQTcxMzRfTUFJTl9DVFJMX1RFNSk7CkBAIC0zNzMsNiArMzc5LDQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2FhNzEzNF9nbzcwMDdfc2VuZF9jb21tYW5kKHN0cnVjdCBnbzcwMDcgKmdvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQl2b2lkICphcmcpCit7CisJc3RydWN0IHNhYTcxMzRfZ283MDA3ICpzYWEgPSBnby0+aHBpX2NvbnRleHQ7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBzYWEtPmRldjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfU19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCQlyZXR1cm4gc2FhNzEzNF9zX3N0ZF9pbnRlcm5hbChkZXYsIE5VTEwsIHN0ZCk7CisJfQorCWNhc2UgVklESU9DX0dfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwkJKnN0ZCA9IGRldi0+dHZub3JtLT5pZDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybCA9IGFyZzsKKwkJaWYgKFY0TDJfQ1RSTF9JRDJDTEFTUyhjdHJsLT5pZCkgPT0gVjRMMl9DVFJMX0NMQVNTX1VTRVIpCisJCQlyZXR1cm4gc2FhNzEzNF9xdWVyeWN0cmwoTlVMTCwgTlVMTCwgY3RybCk7CisJfQorCWNhc2UgVklESU9DX0dfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCWlmIChWNEwyX0NUUkxfSUQyQ0xBU1MoY3RybC0+aWQpID09IFY0TDJfQ1RSTF9DTEFTU19VU0VSKQorCQkJcmV0dXJuIHNhYTcxMzRfZ19jdHJsX2ludGVybmFsKGRldiwgTlVMTCwgY3RybCk7CisJfQorCWNhc2UgVklESU9DX1NfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCWlmIChWNEwyX0NUUkxfSUQyQ0xBU1MoY3RybC0+aWQpID09IFY0TDJfQ1RSTF9DTEFTU19VU0VSKQorCQkJcmV0dXJuIHNhYTcxMzRfc19jdHJsX2ludGVybmFsKGRldiwgTlVMTCwgY3RybCk7CisJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKKworfQorCiBzdGF0aWMgc3RydWN0IGdvNzAwN19ocGlfb3BzIHNhYTcxMzRfZ283MDA3X2hwaV9vcHMgPSB7CiAJLmludGVyZmFjZV9yZXNldAk9IHNhYTcxMzRfZ283MDA3X2ludGVyZmFjZV9yZXNldCwKIAkud3JpdGVfaW50ZXJydXB0CT0gc2FhNzEzNF9nbzcwMDdfd3JpdGVfaW50ZXJydXB0LApAQCAtMzgwLDYgKzQyNyw3IEBACiAJLnN0cmVhbV9zdGFydAkJPSBzYWE3MTM0X2dvNzAwN19zdHJlYW1fc3RhcnQsCiAJLnN0cmVhbV9zdG9wCQk9IHNhYTcxMzRfZ283MDA3X3N0cmVhbV9zdG9wLAogCS5zZW5kX2Zpcm13YXJlCQk9IHNhYTcxMzRfZ283MDA3X3NlbmRfZmlybXdhcmUsCisJLnNlbmRfY29tbWFuZAkJPSBzYWE3MTM0X2dvNzAwN19zZW5kX2NvbW1hbmQsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqIEFkZC9yZW1vdmUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLWkyYy5oIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmgKaW5kZXggOTkzZjY1OC4uNDMxZjQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNkZWZpbmUJSTJDX0RSSVZFUklEX1dJU19TQUE3MTEzCTB4ZjBmNAogI2RlZmluZQlJMkNfRFJJVkVSSURfV0lTX09WNzY0MAkJMHhmMGY1CiAjZGVmaW5lCUkyQ19EUklWRVJJRF9XSVNfVFcyODA0CQkweGYwZjYKKyNkZWZpbmUJSTJDX0RSSVZFUklEX1MyMjUwCQkweGYwZjcKICNkZWZpbmUJSTJDX0FMR09fR083MDA3CQkJMHhmMDAwMDAKICNkZWZpbmUJSTJDX0FMR09fR083MDA3X1VTQgkJMHhmMTAwMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc29ueS10dW5lci5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc29ueS10dW5lci5jCmluZGV4IDVhOTFlZTQuLjU4ZmRkYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1zb255LXR1bmVyLmMKQEAgLTYwNCw3ICs2MDQsNyBAQAogCXsKIAkJc3RydWN0IHY0bDJfdHVuZXIgKnR1biA9IGFyZzsKIAotCQltZW1zZXQodCwgMCwgc2l6ZW9mKCp0dW4pKTsKKwkJbWVtc2V0KHR1biwgMCwgc2l6ZW9mKCp0dW4pKTsKIAkJc3RyY3B5KHR1bi0+bmFtZSwgIlRlbGV2aXNpb24iKTsKIAkJdHVuLT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCXR1bi0+cmFuZ2Vsb3cgPSAwVUw7IC8qIGRvZXMgYW55dGhpbmcgdXNlIHRoZXNlPyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lNDAwMC9tZTQwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZTQwMDAvbWU0MDAwLmMKaW5kZXggMDM5NGUyNy4uZTFjNGE4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lNDAwMC9tZTQwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWU0MDAwL21lNDAwMC5jCkBAIC01MzYsMjUgKzUzNiwxOSBAQAogCiBzdGF0aWMgdm9pZCBjbGVhcl9ib2FyZF9pbmZvX2xpc3Qodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpib2FyZF9wOwotCXN0cnVjdCBsaXN0X2hlYWQgKmRhY19wOwotCXN0cnVjdCBtZTQwMDBfaW5mbyAqYm9hcmRfaW5mbzsKLQlzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQgKmFvX2NvbnRleHQ7CisJc3RydWN0IG1lNDAwMF9pbmZvICpib2FyZF9pbmZvLCAqYm9hcmRfaW5mb19zYWZlOworCXN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCAqYW9fY29udGV4dCwgKmFvX2NvbnRleHRfc2FmZTsKIAogCS8qIENsZWFyIGNvbnRleHQgbGlzdHMgKi8KLQlmb3IgKGJvYXJkX3AgPSBtZTQwMDBfYm9hcmRfaW5mb19saXN0Lm5leHQ7Ci0JICAgICBib2FyZF9wICE9ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0OyBib2FyZF9wID0gYm9hcmRfcC0+bmV4dCkgewotCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShib2FyZF9wLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJLyogQ2xlYXIgYW5hbG9nIG91dHB1dCBjb250ZXh0IGxpc3QgKi8KLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QpKSB7Ci0JCQlkYWNfcCA9IGJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdC5uZXh0OwotCQkJYW9fY29udGV4dCA9Ci0JCQkgICAgbGlzdF9lbnRyeShkYWNfcCwgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0LCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFvX2NvbnRleHQsIGFvX2NvbnRleHRfc2FmZSwKKwkJCQkmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0LCBsaXN0KSB7CiAJCQltZTQwMDBfYW9fcmVzZXQoYW9fY29udGV4dCk7CiAJCQlmcmVlX2lycShhb19jb250ZXh0LT5pcnEsIGFvX2NvbnRleHQpOwogCQkJaWYgKGFvX2NvbnRleHQtPmNpcmNfYnVmLmJ1ZikKIAkJCQlrZnJlZShhb19jb250ZXh0LT5jaXJjX2J1Zi5idWYpOwotCQkJbGlzdF9kZWwoZGFjX3ApOworCQkJbGlzdF9kZWwoJmFvX2NvbnRleHQtPmxpc3QpOwogCQkJa2ZyZWUoYW9fY29udGV4dCk7CiAJCX0KIApAQCAtNTc0LDExICs1NjgsMTAgQEAKIAl9CiAKIAkvKiBDbGVhciB0aGUgYm9hcmQgaW5mbyBsaXN0ICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSkgewotCQlib2FyZF9wID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShib2FyZF9wLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShib2FyZF9pbmZvLCBib2FyZF9pbmZvX3NhZmUsCisJCQkmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCwgbGlzdCkgewogCQlwY2lfcmVsZWFzZV9yZWdpb25zKGJvYXJkX2luZm8tPnBjaV9kZXZfcCk7Ci0JCWxpc3RfZGVsKGJvYXJkX3ApOworCQlsaXN0X2RlbCgmYm9hcmRfaW5mby0+bGlzdCk7CiAJCWtmcmVlKGJvYXJkX2luZm8pOwogCX0KIH0KQEAgLTY2MywxNiArNjU2LDE3IEBACiAJfQogCiAJLyogR2V0IHRoZSBpbmRleCBvZiB0aGUgYm9hcmQgaW4gdGhlIGdsb2JhbCBsaXN0ICovCi0JZm9yIChib2FyZF9wID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0LCBpID0gMDsKLQkgICAgIGJvYXJkX3AgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IGJvYXJkX3AgPSBib2FyZF9wLT5uZXh0LCBpKyspIHsKKwlpID0gMDsKKwlsaXN0X2Zvcl9lYWNoKGJvYXJkX3AsICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCWlmIChib2FyZF9wID09ICZib2FyZF9pbmZvLT5saXN0KSB7CiAJCQlib2FyZF9pbmZvLT5ib2FyZF9jb3VudCA9IGk7CiAJCQlicmVhazsKIAkJfQorCQlpKys7CiAJfQogCWlmIChib2FyZF9wID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIk1FNDAwMDppbml0X2JvYXJkX2luZm8oKTpDYW5ub3QgZ2V0IGluZGV4IG9mIGJhb3JkXG4iKTsKKwkJICAgICAgICJNRTQwMDA6aW5pdF9ib2FyZF9pbmZvKCk6Q2Fubm90IGdldCBpbmRleCBvZiBib2FyZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtODYzLDE2ICs4NTcsMTQgQEAKIAogc3RhdGljIHZvaWQgcmVsZWFzZV9hb19jb250ZXh0cyhzdHJ1Y3QgbWU0MDAwX2luZm8gKmJvYXJkX2luZm8pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZGFjX3A7Ci0Jc3RydWN0IG1lNDAwMF9hb19jb250ZXh0ICphb19jb250ZXh0OworCXN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCAqYW9fY29udGV4dCwgKmFvX2NvbnRleHRfc2FmZTsKIAogCS8qIENsZWFyIGFuYWxvZyBvdXRwdXQgY29udGV4dCBsaXN0ICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QpKSB7Ci0JCWRhY19wID0gYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0Lm5leHQ7Ci0JCWFvX2NvbnRleHQgPSBsaXN0X2VudHJ5KGRhY19wLCBzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhb19jb250ZXh0LCBhb19jb250ZXh0X3NhZmUsCisJCQkmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0LCBsaXN0KSB7CiAJCWZyZWVfaXJxKGFvX2NvbnRleHQtPmlycSwgYW9fY29udGV4dCk7CiAJCWtmcmVlKGFvX2NvbnRleHQtPmNpcmNfYnVmLmJ1Zik7Ci0JCWxpc3RfZGVsKGRhY19wKTsKKwkJbGlzdF9kZWwoJmFvX2NvbnRleHQtPmxpc3QpOwogCQlrZnJlZShhb19jb250ZXh0KTsKIAl9CiB9CkBAIC0xMTgwLDcgKzExNzIsNyBAQAogCiAJLyogV2FpdCB1bnRpbCAvSU5JVCBwaW4gaXMgc2V0ICovCiAJdWRlbGF5KDIwKTsKLQlpZiAoIWlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpICYgMHgyMCkgeworCWlmICghKGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpICYgMHgyMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczpDYW4ndCBpbml0IFhpbGlueFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMzAzLDEyICsxMjk1LDEzIEBACiAJCSAgICAgICBkZXYsIG1vZGUpOwogCiAJCS8qIFNlYXJjaCBmb3IgdGhlIGJvYXJkIGNvbnRleHQgKi8KLQkJZm9yIChwdHIgPSBtZTQwMDBfYm9hcmRfaW5mb19saXN0Lm5leHQsIGkgPSAwOwotCQkgICAgIHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgcHRyID0gcHRyLT5uZXh0LCBpKyspIHsKLQkJCWJvYXJkX2luZm8gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKKwkJaSA9IDA7CisJCWxpc3RfZm9yX2VhY2gocHRyLCAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJaWYgKGkgPT0gYm9hcmQpCiAJCQkJYnJlYWs7CisJCQlpKys7CiAJCX0KKwkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOwogCiAJCWlmIChwdHIgPT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtMTMxOCwxNCArMTMxMSwxMyBAQAogCQl9CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgZGFjIGNvbnRleHQgKi8KLQkJZm9yIChwdHIgPSBib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QubmV4dCwgaSA9IDA7Ci0JCSAgICAgcHRyICE9ICZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3Q7Ci0JCSAgICAgcHRyID0gcHRyLT5uZXh0LCBpKyspIHsKLQkJCWFvX2NvbnRleHQgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0LAotCQkJCQkJCQkJbGlzdCk7CisJCWkgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJmJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdCkgewogCQkJaWYgKGkgPT0gZGV2KQogCQkJCWJyZWFrOworCQkJaSsrOwogCQl9CisJCWFvX2NvbnRleHQgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0LCBsaXN0KTsKIAogCQlpZiAocHRyID09ICZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QpIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtMTM4NCwxMiArMTM3NiwxMyBAQAogCQlQREVCVUcoIm1lNDAwMF9vcGVuKCk6YWkgYm9hcmQgPSAlZCBtb2RlID0gJWRcbiIsIGJvYXJkLCBtb2RlKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0LCBpID0gMDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCwgaSsrKSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWkgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKIAkJCWlmIChpID09IGJvYXJkKQogCQkJCWJyZWFrOworCQkJaSsrOwogCQl9CisJCWJvYXJkX2luZm8gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKIAogCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTE0MzgsMTQgKzE0MzEsMTIgQEAKIAkJUERFQlVHKCJtZTQwMDBfb3BlbigpOmJvYXJkID0gJWRcbiIsIGJvYXJkKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCQkgICAgIHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJCWlmIChib2FyZF9pbmZvLT5ib2FyZF9jb3VudCA9PSBib2FyZCkKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChwdHIgPT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKKwkJaWYgKCZib2FyZF9pbmZvLT5saXN0ID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiTUU0MDAwOm1lNDAwMF9vcGVuKCk6Qm9hcmQgJWQgbm90IGluIGRldmljZSBsaXN0XG4iLAogCQkJICAgICAgIGJvYXJkKTsKQEAgLTE0ODMsMTQgKzE0NzQsMTIgQEAKIAkJUERFQlVHKCJtZTQwMDBfb3BlbigpOmJvYXJkID0gJWRcbiIsIGJvYXJkKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCQkgICAgIHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJCWlmIChib2FyZF9pbmZvLT5ib2FyZF9jb3VudCA9PSBib2FyZCkKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChwdHIgPT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKKwkJaWYgKCZib2FyZF9pbmZvLT5saXN0ID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiTUU0MDAwOm1lNDAwMF9vcGVuKCk6Qm9hcmQgJWQgbm90IGluIGRldmljZSBsaXN0XG4iLAogCQkJICAgICAgIGJvYXJkKTsKQEAgLTE1MjYsMTQgKzE1MTUsMTIgQEAKIAkJUERFQlVHKCJtZTQwMDBfb3BlbigpOmJvYXJkID0gJWRcbiIsIGJvYXJkKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCQkgICAgIHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJCWlmIChib2FyZF9pbmZvLT5ib2FyZF9jb3VudCA9PSBib2FyZCkKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChwdHIgPT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKKwkJaWYgKCZib2FyZF9pbmZvLT5saXN0ID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiTUU0MDAwOm1lNDAwMF9vcGVuKCk6Qm9hcmQgJWQgbm90IGluIGRldmljZSBsaXN0XG4iLAogCQkJICAgICAgIGJvYXJkKTsKQEAgLTU5NTUsNyArNTk0Miw2IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtZTQwMDBfbW9kdWxlX2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpib2FyZF9wOwogCXN0cnVjdCBtZTQwMDBfaW5mbyAqYm9hcmRfaW5mbzsKIAogCUNBTExfUERFQlVHKCJjbGVhbnVwX21vZHVsZSgpIGlzIGV4ZWN1dGVkXG4iKTsKQEAgLTU5NzUsOSArNTk2MSw3IEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtZTQwMDBfZHJpdmVyKTsKIAogCS8qIFJlc2V0IHRoZSBib2FyZHMgKi8KLQlmb3IgKGJvYXJkX3AgPSBtZTQwMDBfYm9hcmRfaW5mb19saXN0Lm5leHQ7Ci0JICAgICBib2FyZF9wICE9ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0OyBib2FyZF9wID0gYm9hcmRfcC0+bmV4dCkgewotCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShib2FyZF9wLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJbWU0MDAwX3Jlc2V0X2JvYXJkKGJvYXJkX2luZm8pOwogCX0KIApAQCAtNTk5Miw3ICs1OTc2LDYgQEAKIAlpbnQgbGVuID0gMDsKIAlpbnQgbGltaXQgPSBjb3VudCAtIDEwMDA7CiAJc3RydWN0IG1lNDAwMF9pbmZvICpib2FyZF9pbmZvOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAogCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuTUU0MDAwIERSSVZFUiBWRVJTSU9OICVYLiVYLiVYXG5cbiIsCiAJCSAgICAgICAoTUU0MDAwX0RSSVZFUl9WRVJTSU9OICYgMHhGRjAwMDApID4+IDE2LApAQCAtNjAwMCwxMSArNTk4Myw3IEBACiAJCSAgICAgICAoTUU0MDAwX0RSSVZFUl9WRVJTSU9OICYgMHhGRikpOwogCiAJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCSAgICAgKHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgJiYgKGxlbiA8IGxpbWl0KTsKLQkgICAgIHB0ciA9IHB0ci0+bmV4dCkgewotCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCWxlbiArPQogCQkgICAgc3ByaW50ZihidWYgKyBsZW4sICJCb2FyZCBudW1iZXIgJWQ6XG4iLAogCQkJICAgIGJvYXJkX2luZm8tPmJvYXJkX2NvdW50KTsKQEAgLTYxMTAsNiArNjA4OSw4IEBACiAJCSAgICBzcHJpbnRmKGJ1ZiArIGxlbiwgIkFPIDMgc3RhdHVzIHJlZ2lzdGVyID0gMHglMDhYXG4iLAogCQkJICAgIGlubChib2FyZF9pbmZvLT5tZTQwMDBfcmVnYmFzZSArCiAJCQkJTUU0MDAwX0FPXzAzX1NUQVRVU19SRUcpKTsKKwkJaWYgKGxlbiA+PSBsaW1pdCkKKwkJCWJyZWFrOwogCX0KIAogCSplb2YgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVmODNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL0tjb25maWcKQEAgLTAsMCArMSwxMjcgQEAKKyMKKyMgTWVpbGhhdXMgY29uZmlndXJhdGlvbgorIworCittZW51Y29uZmlnIE1FSUxIQVVTCisJdHJpc3RhdGUgIk1laWxoYXVzIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBNZWlsaGF1cyBjYXJkLCBzYXkgWSAob3IgTSkgaGVyZS4KKworCSAgWW91IG5lZWQgYm90aCB0aGlzIGRyaXZlciwgYW5kIHRoZSBkcml2ZXIgZm9yIHRoZSBwYXJ0aWN1bGFyCisJICBkYXRhIGNvbGxlY3Rpb24gY2FyZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWVtYWluLgorCitpZiBNRUlMSEFVUworCitjb25maWcgTUUwNjAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTYwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTYwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWUwNjAwLgorCitjb25maWcgTUUwOTAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTkwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTkwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWUwOTAwLgorCitjb25maWcgTUUxMDAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTEwMDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS0xMDAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTEwMDAuCisKK2NvbmZpZyBNRTE0MDAKKwl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtMTQwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTE0MDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lMTQwMC4KKworY29uZmlnIE1FMTYwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS0xNjAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtMTYwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWUxNjAwLgorCitjb25maWcgTUU0NjAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTQ2MDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS00NjAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTQ2MDAuCisKK2NvbmZpZyBNRTYwMDAKKwl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtNjAwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTYwMDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lNjAwMC4KKworY29uZmlnIE1FODEwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS04MTAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtODEwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWU4MTAwLgorCitjb25maWcgTUU4MjAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTgyMDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS04MjAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTgyMDAuCisKK2NvbmZpZyBNRURVTU1ZCisJdHJpc3RhdGUgIk1laWxoYXVzIGR1bW15IGRyaXZlciIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgcHJvdmlkZXMgYSBkdW1teSBkcml2ZXIgZm9yIHRoZSBNZWlsaGF1cyBkcml2ZXIgcGFja2FnZQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZWR1bW15LgorCitlbmRpZiAjIE1FSUxIQVVTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiMmMxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDQzIEBACisjCisjIE1ha2VmaWxlIGZvciBNZWlsaGF1cyBsaW51eCBkcml2ZXIgc3lzdGVtCisjCisKK29iai0kKENPTkZJR19NRUlMSEFVUykgKz0gbWVtYWluLm8KK29iai0kKENPTkZJR19NRTE2MDApICs9IG1lMTYwMC5vCitvYmotJChDT05GSUdfTUUxMDAwKSArPSBtZTEwMDAubworb2JqLSQoQ09ORklHX01FMTQwMCkgKz0gbWUxNDAwLm8KK29iai0kKENPTkZJR19NRTQ2MDApICs9IG1lNDYwMC5vCitvYmotJChDT05GSUdfTUU2MDAwKSArPSBtZTYwMDAubworb2JqLSQoQ09ORklHX01FMDYwMCkgKz0gbWUwNjAwLm8KK29iai0kKENPTkZJR19NRTgxMDApICs9IG1lODEwMC5vCitvYmotJChDT05GSUdfTUU4MjAwKSArPSBtZTgyMDAubworb2JqLSQoQ09ORklHX01FMDkwMCkgKz0gbWUwOTAwLm8KK29iai0kKENPTkZJR19NRURVTU1ZKSArPSBtZWR1bW15Lm8KKworCittZTE2MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWUxNjAwX2RldmljZS5vCittZTE2MDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWUxNjAwX2FvLm8KKworbWUxMDAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lMTAwMF9kZXZpY2UubworbWUxMDAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lMTAwMF9kaW8ubworCittZTE0MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWUxNDAwX2RldmljZS5vCittZTE0MDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWU4MjU0Lm8gbWU4MjU1Lm8gbWUxNDAwX2V4dF9pcnEubworCittZTQ2MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWVmaXJtd2FyZS5vIG1lNDYwMF9kZXZpY2UubworbWU0NjAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lNDYwMF9kby5vIG1lNDYwMF9kaS5vIG1lNDYwMF9kaW8ubyBtZTgyNTQubyBtZTQ2MDBfYWkubyBtZTQ2MDBfYW8ubyBtZTQ2MDBfZXh0X2lycS5vCisKK21lNjAwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZWZpcm13YXJlLm8gbWU2MDAwX2RldmljZS5vCittZTYwMDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWU2MDAwX2Rpby5vIG1lNjAwMF9hby5vCisKK21lMDYwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZTA2MDBfZGV2aWNlLm8KK21lMDYwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTA2MDBfcmVsYXkubyBtZTA2MDBfdHRsaS5vIG1lMDYwMF9vcHRvaS5vIG1lMDYwMF9kaW8ubyBtZTA2MDBfZXh0X2lycS5vCisKK21lODEwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZTgxMDBfZGV2aWNlLm8KK21lODEwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTgxMDBfZGkubyBtZTgxMDBfZG8ubyBtZTgyNTQubworCittZTgyMDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWU4MjAwX2RldmljZS5vCittZTgyMDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWU4MjAwX2RpLm8gbWU4MjAwX2RvLm8gbWU4MjAwX2Rpby5vCisKK21lMDkwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZTA5MDBfZGV2aWNlLm8KK21lMDkwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTA5MDBfZG8ubyBtZTA5MDBfZGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWMyNTIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL1RPRE8KQEAgLTAsMCArMSwxMCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKKwktIHNwYXJzZSBpc3N1ZXMKKwktIExpbmRlbnQKKwktIGF1ZGl0IHVzZXJzcGFjZSBpbnRlcmZhY2UKKwktIGhhbmRsZSBmaXJtd2FyZSBwcm9wZXJseQorCS0gcG9zc2libGUgY29tZWRpIG1lcmdlCisKK1BsZWFzZSBzZW5kIGNsZWFudXAgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorYW5kIENDOiBEYXZpZCBLaWxpYW5pIDxtYWlsQGRhdmlka2lsaWFuaS5kZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTBlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5jCkBAIC0wLDAgKzEsMjE1IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS02MzAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwNjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwNjAwX3JlbGF5LmgiCisjaW5jbHVkZSAibWUwNjAwX3R0bGkuaCIKKyNpbmNsdWRlICJtZTA2MDBfb3B0b2kuaCIKKyNpbmNsdWRlICJtZTA2MDBfZGlvLmgiCisjaW5jbHVkZSAibWUwNjAwX2V4dF9pcnEuaCIKKworbWVfZGV2aWNlX3QgKm1lMDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWUwNjAwX2RldmljZV90ICptZTA2MDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTA2MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMDYwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTA2MDBfZGV2aWNlLCAwLCBzaXplb2YobWUwNjAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lMDYwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWUwNjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWUwNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTA2MDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lMDYwMF9kZXZpY2UtPmludGNzcl9sb2NrKTsKKworCS8vIENyZWF0ZSBzdWJkZXZpY2UgaW5zdGFuY2VzLgorCisJZm9yIChpID0gMDsgaSA8IG1lMDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0ub3B0b2lfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwNjAwX29wdG9pX2NvbnN0cnVjdG9yKG1lMDYwMF9kZXZpY2UtPgorCQkJCQkJCQliYXNlLmluZm8ucGNpLgorCQkJCQkJCQlyZWdfYmFzZXNbMl0pOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTA2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUwNjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lMDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0ucmVsYXlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwNjAwX3JlbGF5X2NvbnN0cnVjdG9yKG1lMDYwMF9kZXZpY2UtPgorCQkJCQkJCQliYXNlLmluZm8ucGNpLgorCQkJCQkJCQlyZWdfYmFzZXNbMl0pOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTA2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUwNjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lMDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0udHRsaV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTA2MDBfdHRsaV9jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTA2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTA2MDBfZGlvX2NvbnN0cnVjdG9yKG1lMDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICAgcmVnX2Jhc2VzWzJdLCBpLAorCQkJCQkJCSAgICAgICZtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBkaW9fY3RybF9yZWdfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwNjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWUwNjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5leHRfaXJxX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopCisJCSAgICBtZTA2MDBfZXh0X2lycV9jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCQkgICAgICAgbWUwNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJICAgICAgICZtZTA2MDBfZGV2aWNlLT5pbnRjc3JfbG9jaywgaSwKKwkJCQkJICAgICAgIG1lMDYwMF9kZXZpY2UtPmJhc2UuaXJxKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lMDYwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUwNjAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KG1lMDYwMF9pbml0KTsKKworbW9kdWxlX2V4aXQobWUwNjAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTZ4eCBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBNRS02eHggRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTA2MDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2E4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTYzMCBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX0RFVklDRV9ICisjZGVmaW5lIF9NRTA2MDBfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyBNRS02MzAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgcmVsYXlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgdHRsaV9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBvcHRvaV9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZXh0X2lycV9zdWJkZXZpY2VzOworfSBtZTA2MDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBEZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWUwNjAwX3ZlcnNpb25fdCBtZTA2MDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzAsIDEsIDEsIDEsIDIsIDJ9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUUwNjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lMDYwMF92ZXJzaW9ucykgLyBzaXplb2YobWUwNjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTA2MDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lMDYwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTA2MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lMDYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUUwNjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWUwNjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTYzMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworCXNwaW5sb2NrX3QgaW50Y3NyX2xvY2s7Cit9IG1lMDYwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTYzMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTYzMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTA2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI3NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uYwpAQCAtMCwwICsxLDQxNSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lMDYwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWUwNjAwX2Rpby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDYwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJbW9kZSAmPSB+KDB4MyA8PCAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJb3V0Yihtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRiKDB4MDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4MDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfZGlvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgICBpbnQgcmVmLAorCQkJCSAgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCWludCBzaXplID0KKwkgICAgZmxhZ3MgJiAoTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQklUIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQorCQkgICAgIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRCB8CisJCSAgICAgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQltb2RlICY9CisJCQkJICAgIH4oKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzApIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJCW1vZGUgfD0KKwkJCQkgICAgTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgICBkaW9faWR4ICoKKwkJCQkJCQkJICAgIDIpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJJbnZhbGlkIHBvcnQgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfZGlvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPQorCQkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCQlwb3J0X3JlZykgJiAoMHgwMDAxIDw8IGNoYW5uZWwpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzApIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAoKG1vZGUgPT0KKwkJCSAgICAgKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHgwMEZGOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90IGJ5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzApIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJYnl0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJCQkJaWYgKHZhbHVlKQorCQkJCQlieXRlIHw9IDB4MSA8PCBjaGFubmVsOworCQkJCWVsc2UKKwkJCQkJYnl0ZSAmPSB+KDB4MSA8PCBjaGFubmVsKTsKKworCQkJCW91dGIoYnl0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESU87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfZGlvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fRElSX0JZVEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKm1lMDYwMF9kaW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGlvX2lkeCwKKwkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA2MDBfZGlvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF9kaW9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIGRpZ2l0YWwgaS9vIGluZGV4ICovCisJc3ViZGV2aWNlLT5kaW9faWR4ID0gZGlvX2lkeDsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9ESU9fQ09ORklHX1JFRzsKKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfRElPX1BPUlRfUkVHICsgZGlvX2lkeDsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwNjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwNjAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTA2MDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUwNjAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTA2MDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwNjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwNjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDA3NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS02MzAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9ESU9fSF8KKyNkZWZpbmUgX01FMDYwMF9ESU9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF9kaW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXVuc2lnbmVkIGludCBkaW9faWR4OwkJCS8qKjwgVGhlIGluZGV4IG9mIHRoZSBkaWdpdGFsIGkvbyBvbiB0aGUgZGV2aWNlLiAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFJlZ2lzdGVyIGhvbGRpbmcgdGhlIHBvcnQgc3RhdHVzLiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIHBvcnQgZGlyZWN0aW9uLiAqLworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTA2MDBfZGlvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MzAgZGlnaXRhbCBpbnB1dC9vdXB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZGlvX2lkeCBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0YWwgaS9vIHBvcnQgb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqbWUwNjAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2Rpb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTE2ZWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW9fcmVnLmgKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZGlvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FMDYwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX0RJT19DT05GSUdfUkVHCQkweDAwMDcKKyNkZWZpbmUgTUUwNjAwX0RJT19QT1JUXzBfUkVHCQkweDAwMDgKKyNkZWZpbmUgTUUwNjAwX0RJT19QT1JUXzFfUkVHCQkweDAwMDkKKyNkZWZpbmUgTUUwNjAwX0RJT19QT1JUX1JFRwkJCU1FMDYwMF9ESU9fUE9SVF8wX1JFRworCisjZGVmaW5lIE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMAkweDAwMDEKKyNkZWZpbmUgTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8xCTB4MDAwNAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ5YWIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2V4dF9pcnEuYworICoKKyAqIEBicmllZiBNRS02MzAgZXh0ZXJuYWwgaW50ZXJydXB0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF9leHRfaXJxX3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF9leHRfaXJxLmgiCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDYwMF9leHRfaXJxX2lvX2lycV9zdGFydChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBpcnFfc291cmNlLAorCQkJCSAgICAgICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19JUlFfU1RBUlRfRElPX0JJVCkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGluc3RhbmNlLT5saW50bm8gPiAxKSB7CisJCVBFUlJPUigiV3JvbmcgaWR4PSVkLlxuIiwgaW5zdGFuY2UtPmxpbnRubyk7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSAhPSBNRV9JUlFfU09VUkNFX0RJT19MSU5FKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgc291cmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfU09VUkNFOworCX0KKworCWlmIChpcnFfZWRnZSAhPSBNRV9JUlFfRURHRV9SSVNJTkcpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfRURHRTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+aW50Y3NyKTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW50bm8pIHsKKwljYXNlIDA6CisJCXRtcCB8PQorCQkgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOIHwgUExYX0lOVENTUl9MT0NBTF9JTlQxX1BPTCB8CisJCSAgICBQTFhfSU5UQ1NSX1BDSV9JTlRfRU47CisJCWJyZWFrOworCWNhc2UgMToKKwkJdG1wIHw9CisJCSAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfCBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MIHwKKwkJICAgIFBMWF9JTlRDU1JfUENJX0lOVF9FTjsKKwkJYnJlYWs7CisJfQorCW91dGwodG1wLCBpbnN0YW5jZS0+aW50Y3NyKTsKKwlQREVCVUdfUkVHKCJpbnRjc3Igb3V0bChwbHg6MHglWCk9MHgleFxuIiwgaW5zdGFuY2UtPmludGNzciwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCisJCWlmICh0aW1lX291dCkgeworCQkJdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIHdhaXRfcXVldWUsCisJCQkJCQkJICAgICAoaW5zdGFuY2UtPnJpc2VkICE9CisJCQkJCQkJICAgICAgMCksIHQpOworCisJCQlpZiAodCA9PSAwKSB7CisJCQkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCB0aW1lZCBvdXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQl9IGVsc2UgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+cmlzZWQgIT0gMCkpOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5yaXNlZCA8IDApIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSB1c2VyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKwl9CisKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCBhYm9ydGVkIGJ5IHNpZ25hbC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCSppcnFfY291bnQgPSBpbnN0YW5jZS0+bjsKKwkqdmFsdWUgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9pb19pcnFfc3RvcChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGluc3RhbmNlLT5saW50bm8gPiAxKSB7CisJCVBFUlJPUigiV3JvbmcgaWR4PSVkLlxuIiwgaW5zdGFuY2UtPmxpbnRubyk7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+aW50Y3NyKTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW50bm8pIHsKKwljYXNlIDA6CisJCXRtcCAmPSB+UExYX0lOVENTUl9MT0NBTF9JTlQxX0VOOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCAmPSB+UExYX0lOVENTUl9MT0NBTF9JTlQyX0VOOworCQlicmVhazsKKwl9CisJb3V0bCh0bXAsIGluc3RhbmNlLT5pbnRjc3IpOworCVBERUJVR19SRUcoImludGNzciBvdXRsKHBseDoweCVYKT0weCV4XG4iLCBpbnN0YW5jZS0+aW50Y3NyLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pbnRjc3JfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pbnRjc3JfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5pbnRjc3IpOworCXN3aXRjaCAoaW5zdGFuY2UtPmxpbnRubykgeworCWNhc2UgMDoKKwkJdG1wIHw9IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfCBQTFhfSU5UQ1NSX1BDSV9JTlRfRU47CisJCXRtcCAmPSB+UExYX0lOVENTUl9MT0NBTF9JTlQxX0VOOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCB8PSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOOworCQl0bXAgJj0gflBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTjsKKwkJYnJlYWs7CisJfQorCW91dGwodG1wLCBpbnN0YW5jZS0+aW50Y3NyKTsKKwlQREVCVUdfUkVHKCJpbnRjc3Igb3V0bChwbHg6MHglWCk9MHgleFxuIiwgaW5zdGFuY2UtPmludGNzciwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPm4gPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9leHRfaXJxX3F1ZXJ5X251bWJlcl9jaGFubmVscyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9FWFRfSVJROworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRVhUX0lSUV9FREdFX1JJU0lORzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWUwNjAwX2V4dF9pcnFfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgKHZvaWQgKilpbnN0YW5jZSk7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTA2MDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUwNjAwX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2VuZGlmCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBtYXNrID0gUExYX0lOVENTUl9QQ0lfSU5UX0VOOworCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChpbnN0YW5jZS0+bGludG5vID4gMSkgeworCQlQRVJST1JfQ1JJVElDQUwKKwkJICAgICgiJXMoKTpXcm9uZyBzdWJkZXZpY2UgaW5kZXg9JWQgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WC5cbiIsCisJCSAgICAgX19GVU5DVElPTl9fLCBpbnN0YW5jZS0+bGludG5vLCBpbmwoaW5zdGFuY2UtPmludGNzcikpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+aW50Y3NyKTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW50bm8pIHsKKwljYXNlIDA6CisJCW1hc2sgfD0gUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFIHwgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOOworCQlicmVhazsKKwljYXNlIDE6CisJCW1hc2sgfD0gUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFIHwgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOOworCQlicmVhazsKKwl9CisKKwlpZiAoKHN0YXR1cyAmIG1hc2spID09IG1hc2spIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPm4rKzsKKwkJaW5iKGluc3RhbmNlLT5yZXNldF9yZWcpOworCQlQREVCVUcoIkludGVycnVwdCBkZXRlY3RlZC5cbiIpOworCX0gZWxzZSB7CisJCVBJTkZPCisJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpZHg9MCBwbHg6aXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJcmV0ID0gSVJRX05PTkU7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pbnRjc3JfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCittZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqbWUwNjAwX2V4dF9pcnFfY29uc3RydWN0b3IodWludDMyX3QgcGx4X3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHVpbnQzMl90IG1lMDYwMF9yZWdfYmFzZSwKKwkJCQkJCSAgICAgICBzcGlubG9ja190ICogaW50Y3NyX2xvY2ssCisJCQkJCQkgICAgICAgdW5zaWduZWQgZXh0X2lycV9pZHgsCisJCQkJCQkgICAgICAgaW50IGlycSkKK3sKKwltZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciA2MzBfZXh0X2lycSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+aW50Y3NyX2xvY2sgPSBpbnRjc3JfbG9jazsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwlzdWJkZXZpY2UtPmxpbnRubyA9IGV4dF9pcnFfaWR4OworCisJLyogUmVxdWVzdCBpbnRlcnJ1cHQgbGluZSAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCisJZXJyID0gcmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lMDYwMF9pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJICBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJICBNRTA2MDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVBJTkZPKCJSZWdpc3RlcmVkIGlycT0lZC5cbiIsIHN1YmRldmljZS0+aXJxKTsKKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzICovCisJc3ViZGV2aWNlLT5pbnRjc3IgPSBwbHhfcmVnX2Jhc2UgKyBQTFhfSU5UQ1NSOworCXN1YmRldmljZS0+cmVzZXRfcmVnID0KKwkgICAgbWUwNjAwX3JlZ19iYXNlICsgTUUwNjAwX0lOVF8wX1JFU0VUX1JFRyArIGV4dF9pcnFfaWR4OworCisJLyogSW5pdGlhbGl6ZSB0aGUgc3ViZGV2aWNlIG1ldGhvZHMgKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lMDYwMF9leHRfaXJxX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWUwNjAwX2V4dF9pcnFfaW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lMDYwMF9leHRfaXJxX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwNjAwX2V4dF9pcnFfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwNjAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTA2MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwNjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWUwNjAwX2V4dF9pcnFfZGVzdHJ1Y3RvcjsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+biA9IDA7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWYyMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmgKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZXh0X2lycS5oCisgKgorICogQGJyaWVmIE1FLTYzMCBleHRlcm5hbCBpbnRlcnJ1cHQgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUUwNjAwX0VYVF9JUlFfSF8KKyNkZWZpbmUgX01FMDYwMF9FWFRfSVJRX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXNsb2NrLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MzAgZXh0ZXJuYWwgaW50ZXJydXB0IHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmludGNzcl9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjaW50Y3NyLiAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsJCS8qKjwgUXVldWUgdG8gcHV0IG9uIHRocmVhZHMgd2FpdGluZyBmb3IgYW4gaW50ZXJydXB0LiAqLworCisJaW50IGlycTsJCQkJLyoqPCBUaGUgaXJxIG51bWJlciBhc3NpZ25lZCBieSBQQ0kgQklPUy4gKi8KKwlpbnQgcmlzZWQ7CQkJCS8qKjwgSWYgdHJ1ZSBhbiBpbnRlcnJ1cHQgaGFzIG9jY3VyZWQuICovCisJdW5zaWduZWQgaW50IG47CQkJCS8qKjwgVGhlIG51bWJlciBvZiBpbnRlcnJ1cHQgc2luY2UgdGhlIGRyaXZlciB3YXMgbG9hZGVkLiAqLworCXVuc2lnbmVkIGludCBsaW50bm87CQkJLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBQQ0kgaW50ZXJydXB0LiAqLworCisJdWludDMyX3QgaW50Y3NyOwkJCS8qKjwgVGhlIFBMWCBpbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyLiAqLworCXVpbnQzMl90IHJlc2V0X3JlZzsJCQkvKio8IFRoZSBjb250cm9sIHJlZ2lzdGVyLiAqLworfSBtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjMwIGV4dGVybmFsIGludGVycnVwdCBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcGx4X3JlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIFBMWCBjaGlwIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBtZTA2MDBfcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgTUUtNjMwIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gaXJxIFRoZSBpcnEgYXNzaWduZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMDYwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IHBseF9yZWdfYmFzZSwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBtZTA2MDBfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGludGNzcl9sb2NrLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBleHRfaXJxX2lkeCwKKwkJCQkJCSAgICAgICBpbnQgaXJxKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjE5OGZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxX3JlZy5oCkBAIC0wLDAgKzEsMTggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2V4dF9pcnFfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGV4dGVybmFsIGludGVycnVwdCByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisjaWZuZGVmIF9NRTA2MDBfRVhUX0lSUV9SRUdfSF8KKyNkZWZpbmUgX01FMDYwMF9FWFRfSVJRX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FMDYwMF9JTlRfMF9SRVNFVF9SRUcgICAgIDB4MDAwNQorI2RlZmluZSBNRTA2MDBfSU5UXzFfUkVTRVRfUkVHICAgICAweDAwMDYKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmQ5NzdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaS5jCkBAIC0wLDAgKzEsMjQzIEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9vcHRvaS5jCisgKgorICogQGJyaWVmIE1FLTYzMCBPcHRvaXNvbGF0ZWQgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWUwNjAwX29wdG9pX3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF9vcHRvaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDYwMF9vcHRvaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9vcHRvaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgaW50IGNoYW5uZWwsCisJCQkJCSBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkJIGludCByZWYsCisJCQkJCSBpbnQgdHJpZ19jaGFuLAorCQkJCQkgaW50IHRyaWdfdHlwZSwKKwkJCQkJIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX29wdG9pX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyAhPSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCVBFUlJPUigiSW52YWxpZCBwb3J0IGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX29wdG9pX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX29wdG9pX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9vcHRvaV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9vcHRvaV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWUwNjAwX29wdG9pX3N1YmRldmljZV90ICptZTA2MDBfb3B0b2lfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UpCit7CisJbWUwNjAwX29wdG9pX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX29wdG9pX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUUwNjAwX09QVE9fSU5QVVRfUkVHOworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwNjAwX29wdG9pX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTA2MDBfb3B0b2lfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0KKwkgICAgbWUwNjAwX29wdG9pX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwNjAwX29wdG9pX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwNjAwX29wdG9pX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTA2MDBfb3B0b2lfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTY5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pLmgKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfb3B0b2kuaAorICoKKyAqIEBicmllZiBNRS02MzAgT3B0b2lzb2xhdGVkIGlucHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA2MDBfT1BUT0lfSF8KKyNkZWZpbmUgX01FMDYwMF9PUFRPSV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX29wdG9pX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVpbnQzMl90IHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCit9IG1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjMwIE9wdG9pc29sYXRlZCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QgKm1lMDYwMF9vcHRvaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGJjNDUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaV9yZWcuaApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9vcHRvaV9yZWcuaAorICoKKyAqIEBicmllZiBNRS02MzAgT3B0b2lzb2xhdGVkIGlucHV0IHN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA2MDBfT1BUT0lfUkVHX0hfCisjZGVmaW5lIF9NRTA2MDBfT1BUT0lfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX09QVE9fSU5QVVRfUkVHICAgICAgMHgwMDA0CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2NWM2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXkuYwpAQCAtMCwwICsxLDM1OSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfcmVsYXkuYworICoKKyAqIEBicmllZiBNRS02MzAgcmVsYXkgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWUwNjAwX3JlbGF5X3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF9yZWxheS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCW91dGIoMHgwLCBpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJUERFQlVHX1JFRygicG9ydF8wX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0XzBfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRiKDB4MCwgaW5zdGFuY2UtPnBvcnRfMV9yZWcpOworCVBERUJVR19SRUcoInBvcnRfMV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF8xX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgaW50IGNoYW5uZWwsCisJCQkJCSBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkJIGludCByZWYsCisJCQkJCSBpbnQgdHJpZ19jaGFuLAorCQkJCQkgaW50IHRyaWdfdHlwZSwKKwkJCQkJIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyAhPSBNRV9TSU5HTEVfQ09ORklHX0RJT19PVVRQVVQpIHsKKwkJCQlQRVJST1IoIkludmFsaWQgd29yZCBkaXJlY3Rpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfMF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIGlmICgoY2hhbm5lbCA+PSA4KSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPnBvcnRfMV9yZWcpICYgKDB4MSA8PCAoY2hhbm5lbCAtIDgpKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfMF9yZWcpOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0XzFfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gKHVpbnQzMl90KSBpbmIoaW5zdGFuY2UtPnBvcnRfMV9yZWcpIDw8IDg7CisJCQkqdmFsdWUgfD0gaW5iKGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3JlbGF5X2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgY2hhbm5lbCwKKwkJCQkJaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3Qgc3RhdGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCXN0YXRlID0gaW5iKGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJCXN0YXRlID0KKwkJCSAgICB2YWx1ZSA/IChzdGF0ZSB8ICgweDEgPDwgY2hhbm5lbCkpIDogKHN0YXRlICYKKwkJCQkJCQkJICB+KDB4MSA8PAorCQkJCQkJCQkgICAgY2hhbm5lbCkpOworCQkJb3V0YihzdGF0ZSwgaW5zdGFuY2UtPnBvcnRfMF9yZWcpOworCQl9IGVsc2UgaWYgKChjaGFubmVsID49IDgpICYmIChjaGFubmVsIDwgMTYpKSB7CisJCQlzdGF0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF8xX3JlZyk7CisJCQlzdGF0ZSA9CisJCQkgICAgdmFsdWUgPyAoc3RhdGUgfCAoMHgxIDw8IChjaGFubmVsIC0gOCkpKSA6IChzdGF0ZSAmCisJCQkJCQkJCQl+KDB4MSA8PAorCQkJCQkJCQkJICAoY2hhbm5lbAorCQkJCQkJCQkJICAgLQorCQkJCQkJCQkJICAgOCkpKTsKKwkJCW91dGIoc3RhdGUsIGluc3RhbmNlLT5wb3J0XzFfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfMF9yZWcpOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfMV9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfMF9yZWcpOworCQkJb3V0Yih2YWx1ZSA+PiA4LCBpbnN0YW5jZS0+cG9ydF8xX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gMTY7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3JlbGF5X3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRE87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqbWUwNjAwX3JlbGF5X2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKQoreworCW1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+cG9ydF8wX3JlZyA9IHJlZ19iYXNlICsgTUUwNjAwX1JFTEFJU18wX1JFRzsKKwlzdWJkZXZpY2UtPnBvcnRfMV9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9SRUxBSVNfMV9SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDYwMF9yZWxheV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwNjAwX3JlbGF5X2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9CisJICAgIG1lMDYwMF9yZWxheV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lMDYwMF9yZWxheV9pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTA2MDBfcmVsYXlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTA2MDBfcmVsYXlfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMDYwMF9yZWxheV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlN2RjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXkuaApAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9yZWxheS5oCisgKgorICogQGJyaWVmIE1FLTYzMCByZWxheSBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX1JFTEFZX0hfCisjZGVmaW5lIF9NRTA2MDBfUkVMQVlfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF9yZWxheV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfMF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIHBvcnRfMV9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUwNjAwX3JlbGF5X3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MzAgcmVsYXkgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKm1lMDYwMF9yZWxheV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRkYjJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheV9yZWcuaApAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9yZWxheV9yZWcuaAorICoKKyAqIEBicmllZiBNRS02MzAgcmVsYXkgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9SRUxBWV9SRUdfSF8KKyNkZWZpbmUgX01FMDYwMF9SRUxBWV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTA2MDBfUkVMQUlTXzBfUkVHICAgICAgICAweDAwMDEKKyNkZWZpbmUgTUUwNjAwX1JFTEFJU18xX1JFRyAgICAgICAgMHgwMDAyCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGUxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGkuYwpAQCAtMCwwICsxLDIzOCBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfdHRsaS5jCisgKgorICogQGJyaWVmIE1FLTYzMCBUVEwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWUwNjAwX3R0bGlfcmVnLmgiCisjaW5jbHVkZSAibWUwNjAwX3R0bGkuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfdHRsaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF90dGxpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IGNoYW5uZWwsCisJCQkJCWludCBzaW5nbGVfY29uZmlnLAorCQkJCQlpbnQgcmVmLAorCQkJCQlpbnQgdHJpZ19jaGFuLAorCQkJCQlpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnICE9IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfdHRsaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfdHRsaV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfdHRsaV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCAqbWUwNjAwX3R0bGlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UpCit7CisJbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUUwNjAwX1RUTF9JTlBVVF9SRUc7CisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTA2MDBfdHRsaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwNjAwX3R0bGlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0KKwkgICAgbWUwNjAwX3R0bGlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTA2MDBfdHRsaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDYwMF90dGxpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTA2MDBfdHRsaV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTAzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGkuaApAQCAtMCwwICsxLDU4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF90dGxpLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIFRUTCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX1RUTElfSF8KKyNkZWZpbmUgX01FMDYwMF9UVExJX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfdHRsaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1aW50MzJfdCBwb3J0X3JlZzsJCQkvKio8IFJlZ2lzdGVyIGhvbGRpbmcgdGhlIHBvcnQgc3RhdHVzLiAqLworfSBtZTA2MDBfdHRsaV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjMwIFRUTCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCAqbWUwNjAwX3R0bGlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTg2ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpX3JlZy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX3R0bGlfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIFRUTCBpbnB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX1RUTElfUkVHX0hfCisjZGVmaW5lIF9NRTA2MDBfVFRMSV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTA2MDBfVFRMX0lOUFVUX1JFRyAgICAgICAweDAwMDMKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGQ1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5jCkBAIC0wLDAgKzEsMTgwIEBACisvKioKKyAqIEBmaWxlIG1lMDkwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS05eCBkZXZpY2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMDkwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA5MDBfcmVnLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA5MDBfZG8uaCIKKyNpbmNsdWRlICJtZTA5MDBfZGkuaCIKKworbWVfZGV2aWNlX3QgKm1lMDkwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWUwOTAwX2RldmljZV90ICptZTA5MDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisJaW50IHBvcnRfc2hpZnQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTA5MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwOTAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMDkwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTA5MDBfZGV2aWNlLCAwLCBzaXplb2YobWUwOTAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwOTAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lMDkwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWUwOTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLyogSW5pdGlhbGl6ZSA4MjU1IGNoaXAgdG8gZGVzaXJlZCBtb2RlICovCisJaWYgKG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJICAgIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTQwKSB7CisJCW91dGIoMHg5QiwKKwkJICAgICBtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCSAgICAgTUUwOTAwX0NUUkxfUkVHKTsKKwl9IGVsc2UgaWYgKG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJCSAgIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwKSB7CisJCW91dGIoMHg4OSwKKwkJICAgICBtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCSAgICAgTUUwOTAwX0NUUkxfUkVHKTsKKwkJb3V0YigweDAwLAorCQkgICAgIG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdICsKKwkJICAgICBNRTA5MDBfV1JJVEVfRU5BQkxFX1JFRyk7CisJfSBlbHNlIGlmIChtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PQorCQkgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MCkgeworCQlvdXRiKDB4OEIsCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9DVFJMX1JFRyk7CisJCW91dGIoMHgwMCwKKwkJICAgICBtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCSAgICAgTUUwOTAwX1dSSVRFX0VOQUJMRV9SRUcpOworCX0KKworCXBvcnRfc2hpZnQgPQorCSAgICAobWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkgICAgIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTYwKSA/IDEgOiAwOworCS8vIENyZWF0ZSBzdWJkZXZpY2UgaW5zdGFuY2VzLgorCisJZm9yIChpID0gMDsgaSA8IG1lMDkwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwOTAwX2RpX2NvbnN0cnVjdG9yKG1lMDkwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgIGkgKyBwb3J0X3NoaWZ0KTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwOTAwX2RldmljZSk7CisJCQlrZnJlZShtZTA5MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDkwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTA5MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMDkwMF9kb19jb25zdHJ1Y3RvcihtZTA5MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sIGkpOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTA5MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMDkwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUwOTAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTA5MDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWUwOTAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuLiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUwOTAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuLiIpOworfQorCittb2R1bGVfaW5pdChtZTA5MDBfaW5pdCk7Cittb2R1bGVfZXhpdChtZTA5MDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUgorICAgICgiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4gJiBLcnp5c3p0b2YgR2FudHprZSA8ay5nYW50emtlQG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgTUUtOXggRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtOXggRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTA5MDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTdmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTA5MDAgKE1FLTl4KSBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwOTAwX0RFVklDRV9ICisjZGVmaW5lIF9NRTA5MDBfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyBNRS0wOTAwIChNRS05eCkgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwOTAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgZGlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZG9fc3ViZGV2aWNlczsKK30gbWUwOTAwX3ZlcnNpb25fdDsKKworLyoqCisgKiBAYnJpZWYgRGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lMDkwMF92ZXJzaW9uX3QgbWUwOTAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTQwLCAyLCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NTAsIDAsIDJ9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MCwgMSwgMX0sCisJezB9LAorfTsKKworI2RlZmluZSBNRTA5MDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWUwOTAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTA5MDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lMDkwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWUwOTAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lMDkwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWUwOTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTA5MDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTA5MDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtMDkwMCAoTUUtOXgpIGRldmljZSBjbGFzcyBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDkwMF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3MuICovCit9IG1lMDkwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTl4IGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtMDkwMCAoTUUtOXgpIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lMDkwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Q3Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kaS5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKioKKyAqIEBmaWxlIG1lMDkwMF9kaS5jCisgKgorICogQGJyaWVmIE1FLTl4IGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVwbHhfcmVnLmgiCisjaW5jbHVkZSAibWUwOTAwX3JlZy5oIgorI2luY2x1ZGUgIm1lMDkwMF9kaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDkwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDkwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA5MDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwOTAwX2RpX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA5MDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJKnZhbHVlID0gKH5pbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSkgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSB+aW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kaV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kaV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDkwMF9kaV9zdWJkZXZpY2VfdCAqbWUwOTAwX2RpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgpCit7CisJbWUwOTAwX2RpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwOTAwX2RpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDkwMF9kaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4LiAqLworCXN1YmRldmljZS0+ZGlfaWR4ID0gZGlfaWR4OworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKwlpZiAoZGlfaWR4ID09IDApIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfUE9SVF9BX1JFRzsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9QT1JUX0JfUkVHOworCX0KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwOTAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTA5MDBfZGlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUwOTAwX2RpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwOTAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwOTAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTA5MDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGYxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RpLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZGkuaAorICoKKyAqIEBicmllZiBNRS05eCBkaWdpdGFsIGlucHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA5MDBfRElfSF8KKyNkZWZpbmUgX01FMDkwMF9ESV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwOTAwX2RpX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVuc2lnbmVkIGludCBkaV9pZHg7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lMDkwMF9kaV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtOXggZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTA5MDBfZGlfc3ViZGV2aWNlX3QgKm1lMDkwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTA5MDBfcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRpX2lkeCk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViOWMzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZG8uYwpAQCAtMCwwICsxLDMxNCBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZG8uYworICoKKyAqIEBicmllZiBNRS05eCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTA5MDBfcmVnLmgiCisjaW5jbHVkZSAibWUwOTAwX2RvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWUwOTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lMDkwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA5MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJb3V0YigweEZGLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweGZmKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwOTAwX2RvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWUwOTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19PVVRQVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwOTAwX2RvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA5MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJKnZhbHVlID0gKH5pbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSkgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSB+aW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwOTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIHN0YXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJc3RhdGUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCXN0YXRlID0KKwkJCSAgICAoIXZhbHVlKSA/IChzdGF0ZSB8ICgweDEgPDwgY2hhbm5lbCkpIDogKHN0YXRlICYKKwkJCQkJCQkJICAgICB+KDB4MSA8PAorCQkJCQkJCQkgICAgICAgY2hhbm5lbCkpOworCQkJb3V0YihzdGF0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJb3V0Yih+KHZhbHVlKSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwOTAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwOTAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWUwOTAwX2RvX3N1YmRldmljZV90ICptZTA5MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCkKK3sKKwltZTA5MDBfZG9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA5MDBfZG9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUwOTAwX2RvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRvX2lkeCA9IGRvX2lkeDsKKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzICovCisJaWYgKGRvX2lkeCA9PSAwKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX1BPUlRfQV9SRUc7CisJCXN1YmRldmljZS0+ZW5hYmxlX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX1dSSVRFX0VOQUJMRV9SRUc7CisJCXN1YmRldmljZS0+ZGlzYWJsZV9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9XUklURV9ESVNBQkxFX1JFRzsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9QT1JUX0JfUkVHOworCQlzdWJkZXZpY2UtPmVuYWJsZV9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9XUklURV9FTkFCTEVfUkVHOworCQlzdWJkZXZpY2UtPmRpc2FibGVfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfV1JJVEVfRElTQUJMRV9SRUc7CisJfQorI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTA5MDBfZG9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMDkwMF9kb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTA5MDBfZG9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTA5MDBfZG9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwOTAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwOTAwX2RvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTA5MDBfZG9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZThhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZG8uaAorICoKKyAqIEBicmllZiBNRS05eCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwOTAwX0RPX0hfCisjZGVmaW5lIF9NRTA5MDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDkwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1bnNpZ25lZCBpbnQgZG9faWR4OworCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOworCXVuc2lnbmVkIGxvbmcgZW5hYmxlX3JlZzsKKwl1bnNpZ25lZCBsb25nIGRpc2FibGVfcmVnOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTA5MDBfZG9fc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTl4IGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkb19pZHggVGhlIGluZGV4IG9mIHRoZSBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2Ugb24gdGhpcyBkZXZpY2UuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTA5MDBfZG9fc3ViZGV2aWNlX3QgKm1lMDkwMF9kb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZG9faWR4KTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjE2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX3JlZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTl4IHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDkwMF9SRUdfSF8KKyNkZWZpbmUgX01FMDkwMF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTA5MDBfUE9SVF9BX1JFRyAgICAgICAgICAweDAwCisjZGVmaW5lIE1FMDkwMF9QT1JUX0JfUkVHICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTUUwOTAwX1BPUlRfQ19SRUcgICAgICAgICAgMHgwMgorI2RlZmluZSBNRTA5MDBfQ1RSTF9SRUcgICAgICAgICAgICAweDAzCS8vICggLHcpCisjZGVmaW5lIE1FMDkwMF9XUklURV9FTkFCTEVfUkVHICAgIDB4MDQJLy8gKHIsdykKKyNkZWZpbmUgTUUwOTAwX1dSSVRFX0RJU0FCTEVfUkVHICAgMHgwOAkvLyAocix3KQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0ZTIxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGV2aWNlLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qKgorICogQGZpbGUgbWUxMDAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTEwMDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWUxMDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWUxMDAwX2Rpby5oIgorCitzdGF0aWMgaW50IG1lMTAwMF9jb25maWdfbG9hZChtZV9kZXZpY2VfdCAqIG1lX2RldmljZSwgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJICAgICAgbWVfY2ZnX2RldmljZV9lbnRyeV90ICogY29uZmlnKQoreworCW1lMTAwMF9kZXZpY2VfdCAqbWUxMDAwX2RldmljZTsKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICpkaW87CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwltZTEwMDBfZGV2aWNlID0gKG1lMTAwMF9kZXZpY2VfdCAqKSBtZV9kZXZpY2U7CisKKwlpZiAoY29uZmlnLT5jb3VudCA9PSAyKSB7CisJCWlmIChtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QpCisJCSAgICA9PSAyKSB7CisJCQkvLyBOb3RoaW5nIHRvIGRvLgorCQl9IGVsc2UgeworCQkJLy8gUmVtb3ZlIDIgZXh0cmEgc3ViZGV2aWNlcworCQkJZGlvID0KKwkJCSAgICAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKQorCQkJICAgIG1lX3NsaXN0X2RlbF9zdWJkZXZpY2VfdGFpbCgmbWUxMDAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQlzbGlzdCk7CisJCQlpZiAoZGlvKQorCQkJCWRpby0+YmFzZS4KKwkJCQkgICAgbWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IoKG1lX3N1YmRldmljZV90ICopCisJCQkJCQkJICAgIGRpbyk7CisKKwkJCWRpbyA9CisJCQkgICAgKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikKKwkJCSAgICBtZV9zbGlzdF9kZWxfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJc2xpc3QpOworCQkJaWYgKGRpbykKKwkJCQlkaW8tPmJhc2UuCisJCQkJICAgIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKChtZV9zdWJkZXZpY2VfdCAqKQorCQkJCQkJCSAgICBkaW8pOworCQl9CisJfSBlbHNlIGlmIChjb25maWctPmNvdW50ID09IDQpIHsKKwkJLy9BZGQgMiBzdWJkZXZpY2VzCisJCWlmIChtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QpCisJCSAgICA9PSAyKSB7CisJCQlkaW8gPQorCQkJICAgIG1lMTAwMF9kaW9fY29uc3RydWN0b3IobWUxMDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJCSAgIHJlZ19iYXNlc1syXSwgMiwKKwkJCQkJCSAgICZtZTEwMDBfZGV2aWNlLT5jdHJsX2xvY2spOworCQkJaWYgKCFkaW8pIHsKKwkJCQlQRVJST1IoIkNhbm5vdCBjcmVhdGUgZGlvIHN1YmRldmljZS5cbiIpOworCQkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCX0KKwkJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxMDAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgZGlvKTsKKworCQkJZGlvID0KKwkJCSAgICBtZTEwMDBfZGlvX2NvbnN0cnVjdG9yKG1lMTAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCQkgICByZWdfYmFzZXNbMl0sIDMsCisJCQkJCQkgICAmbWUxMDAwX2RldmljZS0+Y3RybF9sb2NrKTsKKwkJCWlmICghZGlvKSB7CisJCQkJZGlvID0KKwkJCQkgICAgKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikKKwkJCQkgICAgbWVfc2xpc3RfZGVsX3N1YmRldmljZV90YWlsKCZtZTEwMDBfZGV2aWNlLT4KKwkJCQkJCQkJYmFzZS5zbGlzdCk7CisJCQkJaWYgKGRpbykKKwkJCQkJZGlvLT5iYXNlLgorCQkJCQkgICAgbWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IoKG1lX3N1YmRldmljZV90ICopIGRpbyk7CisKKwkJCQlQRVJST1IoIkNhbm5vdCBjcmVhdGUgZGlvIHN1YmRldmljZS5cbiIpOworCQkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCX0KKwkJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxMDAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgZGlvKTsKKwkJfSBlbHNlIHsKKwkJCS8vIE5vdGhpbmcgdG8gZG8uCisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgY29uZmlndXJhdGlvbi5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lX2RldmljZV90ICptZTEwMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICogcGNpX2RldmljZSkKK3sKKwltZTEwMDBfZGV2aWNlX3QgKm1lMTAwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgaW5zdGFuY2UuCisJbWUxMDAwX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMTAwMF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZTEwMDBfZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIE1FLTEwMDAgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTEwMDBfZGV2aWNlLCAwLCBzaXplb2YobWUxMDAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxMDAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lMTAwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lMTAwMF9kZXZpY2UtPmN0cmxfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUxMDAwX2Rpb19jb25zdHJ1Y3RvcihtZTEwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICAmbWUxMDAwX2RldmljZS0+CisJCQkJCQkJICAgICAgY3RybF9sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxMDAwX2RldmljZSk7CisJCQlrZnJlZShtZTEwMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIE92ZXJ3cml0ZSBiYXNlIGNsYXNzIG1ldGhvZHMuCisJbWUxMDAwX2RldmljZS0+YmFzZS5tZV9kZXZpY2VfY29uZmlnX2xvYWQgPSBtZTEwMDBfY29uZmlnX2xvYWQ7CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lMTAwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorc3RhdGljIGludCBfX2luaXQgbWUxMDAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTEwMDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQobWUxMDAwX2luaXQpOworbW9kdWxlX2V4aXQobWUxMDAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1laWxoYXVzIE1FLTEwMDAgRGV2aWNlcyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTEwMDAgRGlnaXRhbCBJL08gRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTEwMDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYmUxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qKgorICogQGZpbGUgbWUxMDAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTEwMDAgZGV2aWNlIGNsYXNzIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTAwMF9IXworI2RlZmluZSBfTUUxMDAwX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTEwMDBfTUFHSUNfTlVNQkVSCTEwMDAKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTEwMDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxMDAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCXNwaW5sb2NrX3QgY3RybF9sb2NrOwkJLyoqPCBHdWFyZHMgdGhlIERJTyBtb2RlIHJlZ2lzdGVyLiAqLworfSBtZTEwMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xMDAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtMTAwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTEwMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzYwNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uYwpAQCAtMCwwICsxLDQzOCBAQAorLyoqCisgKiBAZmlsZSBtZTEwMDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtMTAwMCBESU8gc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWUxMDAwX2Rpb19yZWcuaCIKKyNpbmNsdWRlICJtZTEwMDBfZGlvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKyNkZWZpbmUgTUUxMDAwX0RJT19NQUdJQ19OVU1CRVIJMHgxMDAwCS8qKjwgVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgY2xhc3Mgc3RydWN0dXJlLiAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTEwMDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5kaW9faWR4KTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRsKDB4MDAwMDAwMDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX2lvX3NpbmdsZV9jb25maWcoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWludCBjdHJsOworCWludCBzaXplID0KKwkgICAgZmxhZ3MgJiAoTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQklUIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQorCQkgICAgIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRCB8CisJCSAgICAgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19EV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQljdHJsICY9IH4oMHgxIDw8IGluc3RhbmNlLT5kaW9faWR4KTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19PVVRQVVQpIHsKKwkJCQljdHJsIHw9IDB4MSA8PCBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19pb19zaW5nbGVfcmVhZChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgMzIpKSB7CisJCQkqdmFsdWUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgNCkpIHsKKwkJCSp2YWx1ZSA9CisJCQkgICAgKGlubChpbnN0YW5jZS0+cG9ydF9yZWcpID4+IChjaGFubmVsICogOCkpICYgMHhGRjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgMikpIHsKKwkJCSp2YWx1ZSA9CisJCQkgICAgKGlubChpbnN0YW5jZS0+cG9ydF9yZWcpID4+IChjaGFubmVsICogMTYpKSAmCisJCQkgICAgMHhGRkZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19EV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgZHdvcmQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTAwMF9kaW9faW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBjb25maWc7CisJdWludDMyX3Qgc3RhdGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUiBzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwljb25maWcgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKSAmICgweDEgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDMyKSkgeworCQkJaWYgKGNvbmZpZykgeworCQkJCXN0YXRlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQkJc3RhdGUgPQorCQkJCSAgICB2YWx1ZSA/IChzdGF0ZSB8ICgweDEgPDwgY2hhbm5lbCkpIDogKHN0YXRlCisJCQkJCQkJCQkgICYKKwkJCQkJCQkJCSAgfigweDEKKwkJCQkJCQkJCSAgICA8PAorCQkJCQkJCQkJICAgIGNoYW5uZWwpKTsKKwkJCQlvdXRsKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBpcyBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgNCkpIHsKKwkJCWlmIChjb25maWcpIHsKKwkJCQlzdGF0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCXN0YXRlICY9IH4oMHhGRiA8PCAoY2hhbm5lbCAqIDgpKTsKKwkJCQlzdGF0ZSB8PSAodmFsdWUgJiAweEZGKSA8PCAoY2hhbm5lbCAqIDgpOworCQkJCW91dGwoc3RhdGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN0YXRlKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IGlzIG5vdCBpbiBvdXRwdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgMikpIHsKKwkJCWlmIChjb25maWcpIHsKKwkJCQlzdGF0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCXN0YXRlICY9IH4oMHhGRkZGIDw8IChjaGFubmVsICogMTYpKTsKKwkJCQlzdGF0ZSB8PSAodmFsdWUgJiAweEZGRkYpIDw8IChjaGFubmVsICogMTYpOworCQkJCW91dGwoc3RhdGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN0YXRlKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IGlzIG5vdCBpbiBvdXRwdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fRFdPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChjb25maWcpIHsKKwkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBpcyBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgZHdvcmQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IE1FMTAwMF9ESU9fTlVNQkVSX0NIQU5ORUxTOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKmNhcHMpCit7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCSpjYXBzID0gTUVfQ0FQU19ESU9fRElSX0RXT1JEOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKm1lMTAwMF9kaW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGlvX2lkeCwKKwkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTEwMDBfZGlvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBNRS0xMDAwIERJTyBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCkpOworCisJLyogQ2hlY2sgaWYgY291bnRlciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgKi8KKworCWlmIChkaW9faWR4ID49IE1FMTAwMF9ESU9fTlVNQkVSX1BPUlRTKSB7CisJCVBFUlJPUigiRElPIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIERJTyBpbmRleCAqLworCXN1YmRldmljZS0+ZGlvX2lkeCA9IGRpb19pZHg7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycy4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTAwMF9QT1JUX01PREU7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJICAgIHJlZ19iYXNlICsgTUUxMDAwX1BPUlQgKyAoZGlvX2lkeCAqIE1FMTAwMF9QT1JUX1NURVApOworCisJLyogT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUxMDAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUxMDAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTEwMDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUxMDAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTEwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUxMDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUxMDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjZlOTNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uaApAQCAtMCwwICsxLDcxIEBACisvKioKKyAqIEBmaWxlIG1lMTAwMF9kaW8uaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBNRS0xMDAwIGRpZ2l0YWwgaS9vIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTAwMF9ESU9fSF8KKyNkZWZpbmUgX01FMTAwMF9ESU9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTAwMCBESU8gc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTEwMDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworLy8gICAgICB1aW50MzJfdCBtYWdpYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBtYWdpYyBudW1iZXIgdW5pcXVlIGZvciB0aGlzIHN0cnVjdHVyZS4gKi8KKworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgYW5kICNjdHJsX3JlZ19taXJyb3IgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlpbnQgZGlvX2lkeDsJCQkJCS8qKjwgVGhlIGluZGV4IG9mIHRoZSBESU8gcG9ydCBvbiB0aGUgZGV2aWNlLiAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIHJlYWQgb3Igd3JpdGUgYSB2YWx1ZSBmcm9tIG9yIHRvIHRoZSBwb3J0IHJlc3BlY3RpdmVseS4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBESU8gbW9kZXMuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lMTAwMF9kaW9fc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTEwMDAgRElPIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGRpb19pZHggVGhlIGluZGV4IG9mIHRoZSBESU8gb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTEwMDBfZGlvX3N1YmRldmljZV90ICptZTEwMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNWIzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2Rpb19yZWcuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIEBmaWxlIG1lMTAwMF9kaW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtMTAwMCBkaWdpdGFsIGkvbyByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTEwMDBfRElPX1JFR19IXworIyBkZWZpbmUgX01FMTAwMF9ESU9fUkVHX0hfCisKKyMgaWZkZWYgX19LRVJORUxfXworCisjIGRlZmluZSBNRTEwMDBfRElPX05VTUJFUl9DSEFOTkVMUwkzMgkJCQkvKio8IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIERJTyBwb3J0LiAqLworIyBkZWZpbmUgTUUxMDAwX0RJT19OVU1CRVJfUE9SVFMJNAkJCQkvKio8IFRoZSBudW1iZXIgb2YgcG9ydHMgcGVyIE1FLTEwMDAuICovCisKKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0IEEgYmFzZSByZWdpc3RlciBvZmZzZXQuICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBCIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0LiAqLworLy8gIyBkZWZpbmUgTUUxMDAwX1BPUlRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggICAgICAgICAgICAgICAgICAvKio8IFBvcnQgQyBiYXNlIHJlZ2lzdGVyIG9mZnNldC4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBDICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0IEQgYmFzZSByZWdpc3RlciBvZmZzZXQuICovCisjIGRlZmluZSBNRTEwMDBfUE9SVAkJCQkweDAwMDAJCQkvKio8IEJhc2UgZm9yIHBvcnQncyByZWdpc3Rlci4gKi8KKyMgZGVmaW5lIE1FMTAwMF9QT1JUX1NURVAJCQk0CQkJCS8qKjwgRGlzdGFuY2UgYmV0d2VlbiBwb3J0J3MgcmVnaXN0ZXIuICovCisKKyMgZGVmaW5lIE1FMTAwMF9QT1JUX01PREUJCQkweDAwMTAJCQkvKio8IENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdG8gc3dpdGNoIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX01PREVfT1VUUFVUX0EgICAoMSA8PCAwKSAgICAgICAgICAgICAgICAvKio8IElmIHNldCwgcG9ydCBBIGlzIGluIG91dHB1dCwgb3RoZXJ3aXNlIGluIGlucHV0IG1vZGUuICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFX09VVFBVVF9CICAgKDEgPDwgMSkgICAgICAgICAgICAgICAgLyoqPCBJZiBzZXQsIHBvcnQgQiBpcyBpbiBvdXRwdXQsIG90aGVyd2lzZSBpbiBpbnB1dCBtb2RlLiAqLworLy8gIyBkZWZpbmUgTUUxMDAwX1BPUlRfTU9ERV9PVVRQVVRfQyAgICgxIDw8IDIpICAgICAgICAgICAgICAgIC8qKjwgSWYgc2V0LCBwb3J0IEMgaXMgaW4gb3V0cHV0LCBvdGhlcndpc2UgaW4gaW5wdXQgbW9kZS4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX01PREVfT1VUUFVUX0QgICAoMSA8PCAzKSAgICAgICAgICAgICAgICAvKio8IElmIHNldCwgcG9ydCBEIGlzIGluIG91dHB1dCwgb3RoZXJ3aXNlIGluIGlucHV0IG1vZGUuICovCisKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUUxMDAwX0RJT19SRUdfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWJiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS0xNDAwIGRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogVXNlciBhcHBsaWNhdGlvbiBjb3VsZCBhbHNvIGluY2x1ZGUgdGhlIGtlcm5lbCBoZWFkZXIgZmlsZXMuIEJ1dCB0aGUKKyAqIHJlYWwga2VybmVsIGZ1bmN0aW9ucyBhcmUgcHJvdGVjdGVkIGJ5ICNpZmRlZiBfX0tFUk5FTF9fLgorICovCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIFRoaXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBtb2R1bGUuaCBpcyBpbmNsdWRlZC4gTm90IG5lZWRlZCwgd2hlbgorICogaXQgaXMgYSBidWlsdCBpbiBkcml2ZXIuCisgKi8KKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKKyNpbmNsdWRlICJtZTE0MDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjU0LmgiCisjaW5jbHVkZSAibWU4MjU0X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NS5oIgorI2luY2x1ZGUgIm1lMTQwMF9leHRfaXJxLmgiCisKK21lX2RldmljZV90ICptZTE0MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCWludCBlcnI7CisJbWUxNDAwX2RldmljZV90ICptZTE0MDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCXVuc2lnbmVkIGludCBtZTgyNTVfaWR4OworCXVuc2lnbmVkIGludCBkaW9faWR4OworCXVuc2lnbmVkIGludCBtZTgyNTRfaWR4OworCXVuc2lnbmVkIGludCBjdHJfaWR4OworCXVuc2lnbmVkIGludCBleHRfaXJxX2lkeDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lMTQwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTE0MDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWUxNDAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciAxNDAwYXRlIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUxNDAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMTQwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMTQwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTE0MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBDaGVjayBmb3IgTUUxNDAwIGV4dGVuc2lvbiBkZXZpY2UuIElmIGRldGVjdGVkIHdlIGZha2UgYSBNRS0xNDAwIEQgZGV2aWNlIGlkLiAqLworCWlmIChtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PQorCSAgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQykgeworCQl1aW50OF90IGN0cmw7CisJCWN0cmwgPQorCQkgICAgaW5iKG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdICsKKwkJCU1FMTQwMERfQ0xLX1NSQ18yX1JFRyk7CisJCVBERUJVR19SRUcoInh4eF9yZWcgaW5iKDB4JVgrMHglWCk9MHgleFxuIiwKKwkJCSAgIG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdLAorCQkJICAgTUUxNDAwRF9DTEtfU1JDXzJfUkVHLCBjdHJsKTsKKwkJb3V0YihjdHJsIHwgMHhGMCwKKwkJICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCSAgICAgTUUxNDAwRF9DTEtfU1JDXzJfUkVHKTsKKwkJUERFQlVHX1JFRygieHh4X3JlZyBvdXRiKDB4JVgrMHglWCk9MHgleFxuIiwKKwkJCSAgIG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdLAorCQkJICAgTUUxNDAwRF9DTEtfU1JDXzJfUkVHLCBjdHJsIHwgMHhGMCk7CisJCWN0cmwgPQorCQkgICAgaW5iKG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdICsKKwkJCU1FMTQwMERfQ0xLX1NSQ18yX1JFRyk7CisJCVBERUJVR19SRUcoInh4eF9yZWcgaW5iKDB4JVgrMHglWCk9MHgleFxuIiwKKwkJCSAgIG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdLAorCQkJICAgTUUxNDAwRF9DTEtfU1JDXzJfUkVHLCBjdHJsKTsKKworCQlpZiAoKGN0cmwgJiAweEYwKSA9PSAweEYwKSB7CisJCQlQSU5GTygiTUUxNDAwIEQgZGV0ZWN0ZWQuXG4iKTsKKwkJCW1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID0KKwkJCSAgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgZ2xvYmFsIHN0dWZmIG9mIGRpZ2l0YWwgaS9vIHN1YmRldmljZXMuICovCisJZm9yIChtZTgyNTVfaWR4ID0gMDsgbWU4MjU1X2lkeCA8IE1FMTQwMF9NQVhfODI1NTsgbWU4MjU1X2lkeCsrKSB7CisJCW1lMTQwMF9kZXZpY2UtPmRpb19jdXJyZW50X21vZGVbbWU4MjU1X2lkeF0gPSAwOworCQlzcGluX2xvY2tfaW5pdCgmbWUxNDAwX2RldmljZS0+ZGlvX2N0cmxfcmVnX2xvY2tbbWU4MjU1X2lkeF0pOworCX0KKworCS8qIEluaXRpYWxpemUgZ2xvYmFsIHN0dWZmIG9mIGNvdW50ZXIgc3ViZGV2aWNlcy4gKi8KKwlzcGluX2xvY2tfaW5pdCgmbWUxNDAwX2RldmljZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlmb3IgKG1lODI1NF9pZHggPSAwOyBtZTgyNTRfaWR4IDwgTUUxNDAwX01BWF84MjU0OyBtZTgyNTRfaWR4KyspCisJCXNwaW5fbG9ja19pbml0KCZtZTE0MDBfZGV2aWNlLT5jdHJfY3RybF9yZWdfbG9ja1ttZTgyNTRfaWR4XSk7CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1lMTQwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgZGV2aWNlX2lkKTsKKworCS8qIEdlbmVyYXRlIERJTyBzdWJkZXZpY2UgaW5zdGFuY2VzLiAqLworCWZvciAobWU4MjU1X2lkeCA9IDA7CisJICAgICBtZTgyNTVfaWR4IDwgbWUxNDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaW9fY2hpcHM7CisJICAgICBtZTgyNTVfaWR4KyspIHsKKwkJZm9yIChkaW9faWR4ID0gMDsgZGlvX2lkeCA8IDM7IGRpb19pZHgrKykgeworCQkJc3ViZGV2aWNlID0KKwkJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJCSAgICBtZTgyNTVfY29uc3RydWN0b3IobWUxNDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS4KKwkJCQkJICAgICAgIGRldmljZV9pZCwKKwkJCQkJICAgICAgIG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sIG1lODI1NV9pZHgsCisJCQkJCSAgICAgICBkaW9faWR4LAorCQkJCQkgICAgICAgJm1lMTQwMF9kZXZpY2UtPgorCQkJCQkgICAgICAgZGlvX2N1cnJlbnRfbW9kZVttZTgyNTVfaWR4XSwKKwkJCQkJICAgICAgICZtZTE0MDBfZGV2aWNlLT4KKwkJCQkJICAgICAgIGRpb19jdHJsX3JlZ19sb2NrW21lODI1NV9pZHhdKTsKKworCQkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlKTsKKwkJCQlrZnJlZShtZTE0MDBfZGV2aWNlKTsKKwkJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTE0MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkJICAgIHN1YmRldmljZSk7CisJCX0KKwl9CisKKwkvKiBHZW5lcmF0ZSBjb3VudGVyIHN1YmRldmljZSBpbnN0YW5jZXMuICovCisJZm9yIChtZTgyNTRfaWR4ID0gMDsKKwkgICAgIG1lODI1NF9pZHggPCBtZTE0MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmN0cl9jaGlwczsKKwkgICAgIG1lODI1NF9pZHgrKykgeworCQlmb3IgKGN0cl9pZHggPSAwOyBjdHJfaWR4IDwgMzsgY3RyX2lkeCsrKSB7CisJCQlzdWJkZXZpY2UgPQorCQkJICAgIChtZV9zdWJkZXZpY2VfdCAqKQorCQkJICAgIG1lODI1NF9jb25zdHJ1Y3RvcihtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgZGV2aWNlX2lkLAorCQkJCQkgICAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIHJlZ19iYXNlc1syXSwgbWU4MjU0X2lkeCwKKwkJCQkJICAgICAgIGN0cl9pZHgsCisJCQkJCSAgICAgICAmbWUxNDAwX2RldmljZS0+CisJCQkJCSAgICAgICBjdHJfY3RybF9yZWdfbG9ja1ttZTgyNTRfaWR4XSwKKwkJCQkJICAgICAgICZtZTE0MDBfZGV2aWNlLT4KKwkJCQkJICAgICAgIGNsa19zcmNfcmVnX2xvY2spOworCisJCQlpZiAoIXN1YmRldmljZSkgeworCQkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMTQwMF9kZXZpY2UpOworCQkJCWtmcmVlKG1lMTQwMF9kZXZpY2UpOworCQkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTQwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCQkgICAgc3ViZGV2aWNlKTsKKwkJfQorCX0KKworCS8qIEdlbmVyYXRlIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2VzLiAqLworCWZvciAoZXh0X2lycV9pZHggPSAwOworCSAgICAgZXh0X2lycV9pZHggPCBtZTE0MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmV4dF9pcnFfc3ViZGV2aWNlczsKKwkgICAgIGV4dF9pcnFfaWR4KyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKQorCQkgICAgbWUxNDAwX2V4dF9pcnFfY29uc3RydWN0b3IobWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIGRldmljZV9pZCwKKwkJCQkJICAgICAgIG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMV0sCisJCQkJCSAgICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkgICAgICAgJm1lMTQwMF9kZXZpY2UtPmNsa19zcmNfcmVnX2xvY2ssCisJCQkJCSAgICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmlycSk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMTQwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUxNDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTE0MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lMTQwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTE0MDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lMTQwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdChtZTE0MDBfaW5pdCk7Cittb2R1bGVfZXhpdChtZTE0MDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUgorICAgICgiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4gJiBLcnp5c3p0b2YgR2FudHprZSA8ay5nYW50emtlQG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgTWVpbGhhdXMgTUUtMTR4eCBkZXZpY2VzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtMTR4eCBNSU8gZGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTE0MDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTViMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS0xNDAwIGRldmljZSBmYW1pbHkgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUxNDAwX0RFVklDRV9IXworI2RlZmluZSBfTUUxNDAwX0RFVklDRV9IXworCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSB0byBzdG9yZSBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTE0MDBfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOwkJCQkJLyoqPCBUaGUgUENJIGRldmljZSBpZCBvZiB0aGUgZGV2aWNlLiAqLworCXVuc2lnbmVkIGludCBkaW9fY2hpcHM7CQkJCS8qKjwgVGhlIG51bWJlciBvZiA4MjU1IGNoaXBzIG9uIHRoZSBkZXZpY2UuICovCisJdW5zaWduZWQgaW50IGN0cl9jaGlwczsJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIDgyNTQgY2hpcHMgb24gdGhlIGRldmljZS4gKi8KKwl1bnNpZ25lZCBpbnQgZXh0X2lycV9zdWJkZXZpY2VzOwkvKio8IFRoZSBudW1iZXIgb2YgZXh0ZXJuYWwgaW50ZXJydXB0IGlucHV0cyBvbiB0aGUgZGV2aWNlLiAqLworfSBtZTE0MDBfdmVyc2lvbl90OworCisvKioKKyAgKiBAYnJpZWYgRGVmaW5lcyBmb3IgZWFjaCBNRS0xNDAwIGRldmljZSB2ZXJzaW9uIGl0cyBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTE0MDBfdmVyc2lvbl90IG1lMTQwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMCwgMSwgMCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBLCAxLCAxLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEIsIDIsIDIsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMCwgMSwgMCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVBLCAxLCAxLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUIsIDIsIDIsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQywgMSwgNSwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBELCAyLCAxMCwgMX0sCisJezB9Cit9OworCisjZGVmaW5lIE1FMTQwMF9ERVZJQ0VfVkVSU0lPTlMgKHNpemVvZihtZTE0MDBfdmVyc2lvbnMpIC8gc2l6ZW9mKG1lMTQwMF92ZXJzaW9uX3QpIC0gMSkJLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWUxNDAwX3ZlcnNpb25zLiAqLworCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGVudHJ5IGluICNtZTE0MDBfdmVyc2lvbnMuCisgKgorICogQHBhcmFtIGRldmljZV9pZCBUaGUgUENJIGRldmljZSBpZCBvZiB0aGUgZGV2aWNlIHRvIHF1ZXJ5LgorICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGRldmljZSBpbiAjbWUxNDAwX3ZlcnNpb25zLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZTE0MDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleCh1aW50MTZfdCBkZXZpY2VfaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IE1FMTQwMF9ERVZJQ0VfVkVSU0lPTlM7IGkrKykKKwkJaWYgKG1lMTQwMF92ZXJzaW9uc1tpXS5kZXZpY2VfaWQgPT0gZGV2aWNlX2lkKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKKyNkZWZpbmUgTUUxNDAwX01BWF84MjU0CQkxMAkvKio8IFRoZSBtYXhpbXVtIG51bWJlciBvZiA4MjU0IGNvdW50ZXIgc3ViZGV2aWNlcyBhdmFpbGFibGUgb24gYW55IE1FLTE0MDAgZGV2aWNlLiAqLworI2RlZmluZSBNRTE0MDBfTUFYXzgyNTUJCTIJLyoqPCBUaGUgbWF4aW11bSBudW1iZXIgb2YgODI1NSBkaWdpdGFsIGkvbyBzdWJkZXZpY2VzIGF2YWlsYWJsZSBvbiBhbnkgTUUtMTQwMCBkZXZpY2UuICovCisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xNDAwIGRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNDAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkJCQkJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCXNwaW5sb2NrX3QgY2xrX3NyY19yZWdfbG9jazsJCQkJCQkvKio8IEd1YXJkcyB0aGUgODI1NCBjbG9jayBzb3VyY2UgcmVnaXN0ZXJzLiAqLworCXNwaW5sb2NrX3QgY3RyX2N0cmxfcmVnX2xvY2tbTUUxNDAwX01BWF84MjU0XTsJCS8qKjwgR3VhcmRzIHRoZSA4MjU0IGN0cmwgcmVnaXN0ZXJzLiAqLworCisJaW50IGRpb19jdXJyZW50X21vZGVbTUUxNDAwX01BWF84MjU1XTsJCQkJLyoqPCBTYXZlcyB0aGUgY3VycmVudCBtb2RlIHNldHRpbmcgb2YgYSBzaW5nbGUgODI1NSBESU8gY2hpcC4gKi8KKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrW01FMTQwMF9NQVhfODI1NV07CQkvKio8IEd1YXJkcyB0aGUgODI1NSBjdHJsIHJlZ2lzdGVyIGFuZCAjZGlvX2N1cnJlbnRfbW9kZS4gKi8KK30gbWUxNDAwX2RldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTQwMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTE0MDAgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWUxNDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGMyNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmMKQEAgLTAsMCArMSw1MTcgQEAKKy8qKgorICogQGZpbGUgbWUxNDAwX2V4dF9pcnEuYworICoKKyAqIEBicmllZiBNRS0xNDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1laWRzLmgiCisKKyNpbmNsdWRlICJtZTE0MDBfZXh0X2lycS5oIgorI2luY2x1ZGUgIm1lMTQwMF9leHRfaXJxX3JlZy5oIgorCisvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE1FMTQwMF9FWFRfSVJRX01BR0lDX05VTUJFUgkweDE0MDEJLyoqPCBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuICovCisjZGVmaW5lIE1FMTQwMF9FWFRfSVJRX05VTUJFUl9DSEFOTkVMUyAxCS8qKjwgT25lIGNoYW5uZWwgcGVyIGNvdW50ZXIuICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX2lvX2lycV9zdGFydChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBpcnFfc291cmNlLAorCQkJCSAgICAgICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQ4X3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzICYgfk1FX0lPX0lSUV9TVEFSVF9ESU9fQklUKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmIChpcnFfc291cmNlICE9IE1FX0lSUV9TT1VSQ0VfRElPX0xJTkUpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGlycSBzb3VyY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfRURHRTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBJUlEgb24gUExYCisvLyAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBpbmIoaW5zdGFuY2UtPnBseF9pbnRjc19yZWcpIHwgKFBMWF9MT0NBTF9JTlQxX0VOIHwgUExYX0xPQ0FMX0lOVDFfUE9MIHwgUExYX1BDSV9JTlRfRU4pOworLy8gICAgICAgICAgICAgICAgICAgICAgb3V0Yih0bXAsIGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIFBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoUExYOjB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZywgdG1wKTsKKworCS8vIEVuYWJsZSBJUlEKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBDOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQ6CisJCXRtcCA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl0bXAgfD0gTUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCW91dGIoTUUxNDAwQUJfRVhUX0lSUV9JUlFfRU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBNRTE0MDBBQl9FWFRfSVJRX0lSUV9FTik7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX2lvX2lycV93YWl0KHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50ICppcnFfY291bnQsCisJCQkJICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCWxvbmcgdCA9IDA7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZSBvdXQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJLyogQ29udmVydCB0byB0aWNrcyAqLworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA8PSAwKSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJCWlmICh0aW1lX291dCkgeworCQkJdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIHdhaXRfcXVldWUsCisJCQkJCQkJICAgICAoaW5zdGFuY2UtPnJpc2VkICE9CisJCQkJCQkJICAgICAgMCksIHQpOworCisJCQlpZiAodCA9PSAwKSB7CisJCQkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCB0aW1lZCBvdXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQl9IGVsc2UgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+cmlzZWQgIT0gMCkpOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5yaXNlZCA8IDApIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSB1c2VyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKwl9CisKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCBhYm9ydGVkIGJ5IHNpZ25hbC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCSppcnFfY291bnQgPSBpbnN0YW5jZS0+bjsKKwkqdmFsdWUgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RvcChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpCit7CisJbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQ4X3QgdG1wOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgSVJRIG9uIFBMWAorLy8gICAgICAgICAgICAgICAgICAgICAgdG1wID0gaW5iKGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKSAmICggfihQTFhfTE9DQUxfSU5UMV9FTiB8IFBMWF9MT0NBTF9JTlQxX1BPTCB8IFBMWF9QQ0lfSU5UX0VOKSk7CisvLyAgICAgICAgICAgICAgICAgICAgICBvdXRiKHRtcCwgaW5zdGFuY2UtPnBseF9pbnRjc19yZWcpOworLy8gICAgICAgICAgICAgICAgICAgICAgUERFQlVHX1JFRygiY3RybF9yZWcgb3V0YihQTFg6MHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnLCB0bXApOworCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQl0bXAgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTE0MDBDRF9FWFRfSVJRX0NMS19FTjsKKwkJb3V0Yih0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlvdXRiKDB4MDAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4MDApOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IC0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPQorCSAgICAobWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpbnN0YW5jZS0+biA9IDA7CisJcmV0dXJuIG1lMTQwMF9leHRfaXJxX2lvX2lycV9zdG9wKHN1YmRldmljZSwgZmlsZXAsIDAsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkJaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSBNRTE0MDBfRVhUX0lSUV9OVU1CRVJfQ0hBTk5FTFM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9FWFRfSVJROworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRVhUX0lSUV9FREdFX1JJU0lORzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UKKwkJCQkJCSAgICAqc3ViZGV2aWNlLCBpbnQgY2FwLAorCQkJCQkJICAgIGludCAqYXJncywgaW50IGNvdW50KQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTE0MDBfZXh0X2lycV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTE0MDBfZXh0X2lycV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2VuZGlmCit7CisJbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50OF90IHRtcDsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIGRldl9pZDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKTsKKy8vICAgICAgICAgICAgICBpZiAoISgoc3RhdHVzICYgUExYX0xPQ0FMX0lOVDFfU1RBVEUpICYmIChzdGF0dXMgJiBQTFhfTE9DQUxfSU5UMV9FTikgJiYgKHN0YXR1cyAmIFBMWF9QQ0lfSU5UX0VOKSkpCisJaWYgKChzdGF0dXMgJgorCSAgICAgKFBMWF9MT0NBTF9JTlQxX1NUQVRFIHwgUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfUENJX0lOVF9FTikpICE9CisJICAgIChQTFhfTE9DQUxfSU5UMV9TVEFURSB8IFBMWF9MT0NBTF9JTlQxX0VOIHwgUExYX1BDSV9JTlRfRU4pKSB7CisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQlQSU5GTygiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZS0+bisrOworCWluc3RhbmNlLT5yaXNlZCA9IDE7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJdG1wID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQl0bXAgfD0gTUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlvdXRiKDAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCQlvdXRiKE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgTUUxNDAwQUJfRVhUX0lSUV9JUlFfRU4pOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lMTQwMF9leHRfaXJxX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCS8vIERpc2FibGUgSVJRIG9uIFBMWAorCXRtcCA9CisJICAgIGluYihpbnN0YW5jZS0+CisJCXBseF9pbnRjc19yZWcpICYgKH4oUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfAorCQkJCSAgICBQTFhfUENJX0lOVF9FTikpOworCW91dGIodG1wLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0YihwbHg6MHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnLAorCQkgICB0bXApOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgKHZvaWQgKilpbnN0YW5jZSk7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IGRldmljZV9pZCwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUxNDAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGNsa19zcmNfcmVnX2xvY2ssCisJCQkJCQkgICAgICAgaW50IGlycSkKK3sKKwltZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisJdWludDhfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciAxNDAwX2V4dF9pcnEgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZ19sb2NrID0gY2xrX3NyY19yZWdfbG9jazsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgbWUxNDAwX2V4dF9pcnFfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUUxNDAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgaXJxLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCXN1YmRldmljZS0+cGx4X2ludGNzX3JlZyA9IHBseF9yZWdfYmFzZSArIFBMWF9JTlRDU1JfUkVHOworCXN1YmRldmljZS0+Y3RybF9yZWcgPSBtZTE0MDBfcmVnX2Jhc2UgKyBNRTE0MDBBQl9FWFRfSVJRX0NUUkxfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IG1lMTQwMF9yZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gRW5hYmxlIElSUSBvbiBQTFgKKwl0bXAgPQorCSAgICBpbmIoc3ViZGV2aWNlLT4KKwkJcGx4X2ludGNzX3JlZykgfCAoUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfAorCQkJCSAgUExYX1BDSV9JTlRfRU4pOworCW91dGIodG1wLCBzdWJkZXZpY2UtPnBseF9pbnRjc19yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoUHBseDoweCVsWCk9MHgleFxuIiwgc3ViZGV2aWNlLT5wbHhfaW50Y3NfcmVnLAorCQkgICB0bXApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc3ViZGV2aWNlIG1ldGhvZHMgKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lMTQwMF9leHRfaXJxX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWUxNDAwX2V4dF9pcnFfaW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lMTQwMF9leHRfaXJxX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTE0MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTE0MDBfZXh0X2lycV9kZXN0cnVjdG9yOworCisJc3ViZGV2aWNlLT5yaXNlZCA9IDA7CisJc3ViZGV2aWNlLT5uID0gMDsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnEuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzJhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnEuaApAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxLmgKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBleHRlcm5hbCBpbnRlcnJ1cHQgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUUxNDAwX0VYVF9JUlFfSF8KKyNkZWZpbmUgX01FMTQwMF9FWFRfSVJRX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXNsb2NrLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xNDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTQwMF9leHRfaXJxX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjbGtfc3JjX3JlZ19sb2NrOwkvKio8IExvY2sgcHJvdGVjdGluZyB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4gKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CS8qKjwgUXVldWUgdG8gcHV0IG9uIHRocmVhZHMgd2FpdGluZyBmb3IgYW4gaW50ZXJydXB0LiAqLworCisJdWludDMyX3QgZGV2aWNlX2lkOwkJCQkvKio8IFRoZSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSBob2xkaW5nIHRoZSBzdWJkZXZpY2UuICovCisJaW50IGlycTsJCQkJCQkvKio8IFRoZSBpcnEgbnVtYmVyIGFzc2lnbmVkIGJ5IFBDSSBCSU9TLiAqLworCWludCByaXNlZDsJCQkJCQkvKio8IElmIHRydWUgYW4gaW50ZXJydXB0IGhhcyBvY2N1cmVkLiAqLworCXVuc2lnbmVkIGludCBuOwkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGludGVycnVwdCBzaW5jZSB0aGUgZHJpdmVyIHdhcyBsb2FkZWQuICovCisKKwl1bnNpZ25lZCBsb25nIHBseF9pbnRjc19yZWc7CS8qKjwgVGhlIFBMWCBpbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyLiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBUaGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTE0MDAgZXh0ZXJuYWwgaW50ZXJydXB0IGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBwbHhfcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgUExYIGNoaXAgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIG1lMTQwMF9yZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBNRS0xNDAwIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gaXJxIFRoZSBpcnEgYXNzaWduZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IGRldmljZV9pZCwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUxNDAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGNsa19zcmNfcmVnX2xvY2ssCisJCQkJCQkgICAgICAgaW50IGlycSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnFfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnFfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3NDBmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycV9yZWcuaApAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTE0MDAgZXh0ZXJuYWwgaW50ZXJydXB0IHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTQwMF9FWFRfSVJRX1JFR19IXworIyBkZWZpbmUgX01FMTQwMF9FWFRfSVJRX1JFR19IXworCisjIGlmZGVmIF9fS0VSTkVMX18KKworIyAgZGVmaW5lIFBMWF9JTlRDU1JfUkVHCQkJCTB4NEMJLyoqPCBUaGUgUExYIGludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2Zmc2V0LiAqLworIyAgZGVmaW5lIFBMWF9JQ1JfUkVHCQkJCQkweDUwCS8qKjwgVGhlIFBMWCBpbml0aWFsaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldC4gKi8KKworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQxX0VOCQkJCTB4MDEJLyoqPCBJZiBzZXQgdGhlIGxvY2FsIGludGVycnVwdCAxIGlzIGVuYWJsZWQuICovCisjICBkZWZpbmUgUExYX0xPQ0FMX0lOVDFfUE9MCQkJMHgwMgkvKio8IElmIHNldCB0aGUgbG9jYWwgaW50ZXJydXB0IDEgcG9sYXJpdHkgaXMgaGlnaCBhY3RpdmUuICovCisjICBkZWZpbmUgUExYX0xPQ0FMX0lOVDFfU1RBVEUJCQkweDA0CS8qKjwgSWYgc2V0IHRoZSBsb2NhbCBpbnRlcnJ1cHQgMSBpcyBhY3Rpdi4gKi8KKyMgIGRlZmluZSBQTFhfTE9DQUxfSU5UMl9FTgkJCQkweDA4CS8qKjwgSWYgc2V0IHRoZSBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQyX1BPTAkJCTB4MTAJLyoqPCBJZiBzZXQgdGhlIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IGlzIGhpZ2ggYWN0aXZlLiAqLworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQyX1NUQVRFCQkJMHgyMAkvKio8IElmIHNldCB0aGUgbG9jYWwgaW50ZXJydXB0IDIgaXMgYWN0aXYuICovCisjICBkZWZpbmUgUExYX1BDSV9JTlRfRU4JCQkJMHg0MAkvKio8IElmIHNldCB0aGUgUENJIGludGVycnVwdCBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIFBMWF9TT0ZUX0lOVAkJCQkJMHg4MAkvKio8IElmIHNldCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkLiAqLworCisjICBkZWZpbmUgTUUxNDAwQUJfRVhUX0lSUV9DVFJMX1JFRwkJMHgxMQkvKio8IFRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciBvZmZzZXQuICovCisKKyMgIGRlZmluZSBNRTE0MDBBQl9FWFRfSVJRX0NMS19FTgkJMHgwMQkvKio8IElmIHRoaXMgYml0IGlzIHNldCwgdGhlIGNsb2NrIG91dHB1dCBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOCQkweDAyCS8qKjwgSWYgc2V0IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gQ2xlYXJpbmcgdGhpcyBiaXQgY2xlYXJzIGEgcGVuZGluZyBpbnRlcnJ1cHQuICovCisKKyMgIGRlZmluZSBNRTE0MDBDRF9FWFRfSVJRX0NUUkxfUkVHCQkweDExCS8qKjwgVGhlIGV4dGVybmFsIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyIG9mZnNldC4gKi8KKworIyAgZGVmaW5lIE1FMTQwMENEX0VYVF9JUlFfQ0xLX0VOCQkweDEwCS8qKjwgSWYgc2V0IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gQ2xlYXJpbmcgdGhpcyBiaXQgY2xlYXJzIGEgcGVuZGluZyBpbnRlcnJ1cHQuKi8KKworIyBlbmRpZgkvL19fS0VSTkVMX18KKworI2VuZGlmIC8vX01FMTQwMF9FWFRfSVJRX1JFR19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjY2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvLmMKQEAgLTAsMCArMSwxMDMzIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hby5jCisgKgorICogQGJyaWVmIE1FLTE2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qIEluY2x1ZGVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lMTYwMF9hb19yZWcuaCIKKyNpbmNsdWRlICJtZTE2MDBfYW8uaCIKKworLyogRGVmaW5lcworICovCisKK3N0YXRpYyB2b2lkIG1lMTYwMF9hb19kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywgaW50IHJlZiwgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTE2MDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCAqdmFsdWUsCisJCQkJICAgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCB2YWx1ZSwKKwkJCQkgICAgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqdHlwZSwKKwkJCQkJICBpbnQgKnN1YnR5cGUpOworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwgaW50ICptaW4sIGludCAqbWF4LAorCQkJCQkgICAgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCB1bml0LAorCQkJCQkgaW50ICpjb3VudCk7CitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LCBpbnQgKm1pbiwgaW50ICptYXgsCisJCQkJICAgICAgaW50ICptYXhkYXRhKTsKKworLyogRnVuY3Rpb25zCisgKi8KKworbWUxNjAwX2FvX3N1YmRldmljZV90ICptZTE2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgY3VyciwKKwkJCQkJICAgICBzcGlubG9ja190ICogY29uZmlnX3JlZ3NfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogYW9fc2hhZG93c19sb2NrLAorCQkJCQkgICAgIG1lMTYwMF9hb19zaGFkb3dfdCAqCisJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTE2MDBfd3EpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgYW9faWR4KTsKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLgorCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMTYwMF9hb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SCisJCSAgICAoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUxNjAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzLgorCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCXN1YmRldmljZS0+Y29uZmlnX3JlZ3NfbG9jayA9IGNvbmZpZ19yZWdzX2xvY2s7CisJc3ViZGV2aWNlLT5hb19zaGFkb3dzX2xvY2sgPSBhb19zaGFkb3dzX2xvY2s7CisKKwkvLyBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXguCisJc3ViZGV2aWNlLT5hb19pZHggPSBhb19pZHg7CisKKwkvLyBJbml0aWFsaXplIHJhbmdlIGxpc3RzLgorCXN1YmRldmljZS0+dV9yYW5nZXNfY291bnQgPSAyOworCisJc3ViZGV2aWNlLT51X3Jhbmdlc1swXS5taW4gPSAwOwkvLzBWCisJc3ViZGV2aWNlLT51X3Jhbmdlc1swXS5tYXggPSA5OTk3NTU4OwkvLzEwVgorCisJc3ViZGV2aWNlLT51X3Jhbmdlc1sxXS5taW4gPSAtMTBFNjsJLy8tMTBWCisJc3ViZGV2aWNlLT51X3Jhbmdlc1sxXS5tYXggPSA5OTk1MTE3OwkvLzEwVgorCisJaWYgKGN1cnIpIHsJCS8vIFRoaXMgaXMgdmVyc2lvbiB3aXRoIGN1cnJlbnQgb3V0cHV0cy4KKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc19jb3VudCA9IDI7CisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1swXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzBdLm1heCA9IDE5OTk1MTE3OwkvLzIwbUEKKworCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzFdLm1pbiA9IDRFMzsJLy80bUEKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1sxXS5tYXggPSAxOTk5NTExODsJLy8yMG1BCisJfSBlbHNlIHsJCS8vIFRoaXMgaXMgdmVyc2lvbiB3aXRob3V0IGN1cnJlbnQgb3V0cHV0cy4KKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc19jb3VudCA9IDA7CisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1swXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzBdLm1heCA9IDA7CS8vMG1BCisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1sxXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzFdLm1heCA9IDA7CS8vMG1BCisJfQorCisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlcnMuCisJc3ViZGV2aWNlLT51bmlfYmlfcmVnID0gcmVnX2Jhc2UgKyBNRTE2MDBfVU5JX0JJX1JFRzsKKwlzdWJkZXZpY2UtPmlfcmFuZ2VfcmVnID0gcmVnX2Jhc2UgKyBNRTE2MDBfMDIwXzQyMF9SRUc7CisJc3ViZGV2aWNlLT5zaW1fb3V0cHV0X3JlZyA9IHJlZ19iYXNlICsgTUUxNjAwX1NJTV9PVVRQVVRfUkVHOworCXN1YmRldmljZS0+Y3VycmVudF9vbl9yZWcgPSByZWdfYmFzZSArIE1FMTYwMF9DVVJSRU5UX09OX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gSW5pdGlhbGl6ZSBzaGFkb3cgc3RydWN0dXJlLgorCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzID0gYW9fcmVnc19zaGFkb3dzOworCisJLy8gT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLgorCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lMTYwMF9hb19kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUxNjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTE2MDBfYW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUxNjAwX2FvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUxNjAwX2FvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUxNjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9yYW5nZV9pbmZvOworCisJLy8gSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlLgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvLyBQcmVwYXJlIHdvcmsgcXVldWUuCisJc3ViZGV2aWNlLT5tZTE2MDBfd29ya3F1ZXVlID0gbWUxNjAwX3dxOworCisvKiB3b3JrcXVldWUgQVBJIGNoYW5nZWQgaW4ga2VybmVsIDIuNi4yMCAqLworI2lmICggTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSApCisJSU5JVF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrLAorCQkgICh2b2lkICopc3ViZGV2aWNlKTsKKyNlbHNlCisJSU5JVF9ERUxBWUVEX1dPUksoJnN1YmRldmljZS0+YW9fY29udHJvbF90YXNrLAorCQkJICBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2spOworI2VuZGlmCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworc3RhdGljIHZvaWQgbWUxNjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTE2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCB0bXA7CisKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9DYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOwkvL0NhbmNlbGwgd2FpdGluZyBmb3IgdHJpZ2dlci4KKworCS8vIFJlc2V0IGFsbCBzZXR0aW5ncy4KKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5hb19zaGFkb3dzX2xvY2spOworCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2luc3RhbmNlLT5hb19pZHhdID0gMDsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9IDA7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOwkvL05vdCB3YWl0aW5nIGZvciB0cmlnZ2VyaW5nLgorCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CS8vSW5kaXZpZHVhbCB0cmlnZ2VyaW5nLgorCisJLy8gU2V0IG91dHB1dCB0byBkZWZhdWx0IChzYWZlKSBzdGF0ZS4KKwlzcGluX2xvY2soaW5zdGFuY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXRtcCA9IGludyhpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CS8vIHVuaXBvbGFyCisJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwlQREVCVUdfUkVHKCJ1bmlfYmlfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwl0bXAgPSBpbncoaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsJLy8gVm9sdHMgb25seSEKKwl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJdG1wICY9IDB4MDBGRjsKKwlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCXRtcCA9IGludyhpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOwkvLyAwLi4yMG1BIDw9IElmIGV4aXN0cy4KKwl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0dyh0bXAsIGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CisJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aV9yYW5nZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXR3KDAsIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSAtCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisKKwkvLyBUcmlnZ2VyIG91dHB1dC4KKwlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMDAwKTsKKwlvdXR3KDB4RkZGRiwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhGRkZGKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y29uZmlnX3JlZ3NfbG9jayk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkvLyBTZXQgc3RhdHVzIHRvICdub25lJworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8vU2lnbmFsIHJlc2V0IGlmIHVzZXIgaXMgb24gd2FpdC4KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDE2X3QgdG1wOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkvLyBDaGVja2luZyBwYXJhbWV0ZXJzLgorCWlmIChmbGFncykgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gTXVzdCBiZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBTb2Z0d2FyZSB0cmlnZ2VyIGhhcyBub3QgZWRnZS4gTXVzdCBiZSBNRV9UUklHX0VER0VfTk9ORVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwl9CisKKwlpZiAodHJpZ190eXBlICE9IE1FX1RSSUdfVFlQRV9TVykgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBNdXN0IGJlIE1FX1RSSUdfVFlQRV9TVy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJfQorCisJaWYgKCh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpCisJICAgICYmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSkgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU47CisJfQorCisJaWYgKHJlZiAhPSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHJlZmVyZW5jZS4gQW5hbG9nIG91dHB1dHMgaGF2ZSB0byBoYXZlIGdvdCBSRUZfQU9fR1JPVU5ELlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwl9CisKKwlpZiAoKChzaW5nbGVfY29uZmlnICsgMSkgPgorCSAgICAgKGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkpCisJICAgIHx8IChzaW5nbGVfY29uZmlnIDwgMCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHJhbmdlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKwkvLyBDaGVja2luZyBwYXJhbWV0ZXJzIC0gZG9uZS4gQWxsIGlzIGZpbmUuIERvIGNvbmZpZy4KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CS8vQ2FuY2VsbCB3YWl0aW5nIGZvciB0cmlnZ2VyLgorCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2luc3RhbmNlLT5hb19pZHhdID0gMDsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9IDA7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXN3aXRjaCAoc2luZ2xlX2NvbmZpZykgeworCWNhc2UgMDoJCS8vIDBWIDEwVgorCQl0bXAgPSBpbncoaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsJLy8gVm9sdHMKKwkJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwkJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQkvLyAwVgorCQlvdXR3KDAsCisJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSk7CisJCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT4KKwkJCQkJCQkJIGFvX2lkeF0gLQorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyB1bmlwb2xhcgorCQl0bXAgfD0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CS8vIDAuLjIwbUEgPD0gSWYgZXhpc3RzLgorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKworCWNhc2UgMToJCS8vIC0xMFYgMTBWCisJCXRtcCA9IGludyhpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOwkvLyBWb2x0cworCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOworCQlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCS8vIDBWCisJCW91dHcoMHgwODAwLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwODAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyBiaXBvbGFyCisJCXRtcCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CS8vIDAuLjIwbUEgPD0gSWYgZXhpc3RzLgorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKworCWNhc2UgMjoJCS8vIDBtQSAyMG1BCisJCXRtcCA9IGludyhpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOwkvLyBtQW1wZXJzCisJCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwkJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsJLy8gMC4uMjBtQQorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCS8vIDBtQQorCQlvdXR3KDAsCisJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSk7CisJCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT4KKwkJCQkJCQkJIGFvX2lkeF0gLQorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyB1bmlwb2xhcgorCQl0bXAgfD0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJCWJyZWFrOworCisJY2FzZSAzOgkJLy8gNG1BIDIwbUEKKwkJdG1wID0gaW53KGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyk7CS8vIG1BbXBlcnMKKwkJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOworCQlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCXRtcCA9IGludyhpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOwkvLyA0Li4yMG1BCisJCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsKKwkJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5pX3JhbmdlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQkvLyA0bUEKKwkJb3V0dygwLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT51bmlfYmlfcmVnKTsJLy8gdW5pcG9sYXIKKwkJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CisJCVBERUJVR19SRUcoInVuaV9iaV9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT51bmlfYmlfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKwl9CisKKwkvLyBUcmlnZ2VyIG91dHB1dC4KKwlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMDAwKTsKKwlvdXR3KDB4RkZGRiwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhGRkZGKTsKKworCWlmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsJLy8gSW5kaXZpZHVhbCB0cmlnZ2VyaW5nLgorCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzICY9CisJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJUERFQlVHKCJJbmRpdmlkdWFsIHRyaWdnZXJpbmcuXG4iKTsKKwl9IGVsc2UgaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpIHsJLy8gU3luY2hyb25vdXMgdHJpZ2dlcmluZy4KKwkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zeW5jaHJvbm91cyB8PQorCQkgICAgKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJUERFQlVHKCJTeW5jaHJvbm91cyB0cmlnZ2VyaW5nLlxuIik7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jb25maWdfcmVnc19sb2NrKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKwl1bnNpZ25lZCBsb25nIGogPSAwOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gJWRcbiIsIGZsYWdzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoKCFmbGFncykgJiYgKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmIGluc3RhbmNlLT5hb19pZHgpKSB7CS8vQmxvY2tpbmcgbW9kZS4gV2FpdCBmb3Igc29mdHdhcmUgdHJpZ2dlci4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCQlpZiAoZGVsYXkgPT0gMCkKKwkJCQlkZWxheSA9IDE7CisJCX0KKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gVGhpcyBwcm9jZWR1cmUgaGFzIG93biB0aW1lb3V0LgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoISgoaW5zdGFuY2UtPgorCQkJCQkJICAgICBhb19yZWdzX3NoYWRvd3MpLT4KKwkJCQkJCSAgICB0cmlnZ2VyICYgaW5zdGFuY2UtPgorCQkJCQkJICAgIGFvX2lkeCkpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UgPT0gYW9fc3RhdHVzX25vbmUpIHsJLy8gUmVzZXQgd2FzIGNhbGxlZC4KKwkJCVBERUJVRygiU2luZ2xlIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQlpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisJfQorCisJKnZhbHVlID0gKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPmFvX2lkeF07CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGogPSAwOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMgfAorCSAgICAgIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodmFsdWUgJiB+TUUxNjAwX0FPX01BWF9EQVRBKSB7CisJCVBFUlJPUigiSW52YWxpZCB2YWx1ZSBwcm92aWRlZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fVkFMVUVfT1VUX09GX1JBTkdFOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsJLy9DYW5jZWxsIHdhaXRpbmcgZm9yIHRyaWdnZXIuCisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKwkvL1dyaXRlIHZhbHVlLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSA9CisJICAgICh1aW50MTZfdCkgdmFsdWU7CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vIFRyaWdnZXIgYWxsIG91dHB1dHMgZnJvbSBzeW5jaHJvbm91cyBsaXN0LgorCQlmb3IgKGkgPSAwOyBpIDwgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5jb3VudDsgaSsrKSB7CisJCQlpZiAoKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJiAoMHgxIDw8IGkpKSB8fCAoaSA9PSBpbnN0YW5jZS0+YW9faWR4KSkgewkvLyBTZXQgYWxsIGZyb20gc3luY2hyb25vdXMgbGlzdCB0byBjb3JyZWN0IHN0YXRlLgorCQkJCVBERUJVRworCQkJCSAgICAoIlN5bmNocm9ub3VzIHRyaWdnZXJpbmc6IG91dHB1dCAlZC4gaWR4PSVkXG4iLAorCQkJCSAgICAgaSwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaV0gPQorCQkJCSAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpXTsKKworCQkJCW91dHcoKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaV0sCisJCQkJICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2ldKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaV0gLQorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaV0pOworCisJCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9CisJCQkJICAgIH4oMHgxIDw8IGkpOworCQkJfQorCQl9CisKKwkJLy8gVHJpZ2dlciBvdXRwdXQuCisJCW91dHcoMHgwMDAwLCBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcpOworCQlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJb3V0dygweEZGRkYsIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyk7CisJCVBERUJVR19SRUcoInNpbV9vdXRwdXRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAweEZGRkYpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJfSBlbHNlIHsJCS8vIEluZGl2aWR1YWwgbW9kZS4KKwkJaWYgKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJiAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpKSB7CS8vIFB1dCBvbiBzeW5jaHJvbm91cyBzdGFydCBsaXN0LiBTZXQgb3V0cHV0IGFzIHdhaXRpbmcgZm9yIHRyaWdnZXIuCisJCQlQREVCVUcoIkFkZCB0byBzeW5jaHJvbm91cyBsaXN0LiBpZHg9JWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgfD0KKwkJCSAgICAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfcnVuOworCQkJUERFQlVHKCJTeW5jaHJvbm91cyBsaXN0OiAweCV4LlxuIiwKKwkJCSAgICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzKTsKKwkJfSBlbHNlIHsJLy8gRmlyZWQgdGhpcyBvbmUuCisJCQlQREVCVUcoIlRyaWdnZXJpbmcuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9CisJCQkgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaW5zdGFuY2UtPgorCQkJCQkJCQlhb19pZHhdOworCisJCQlvdXR3KChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+CisJCQkgICAgIHNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSwKKwkJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGFvX2lkeF0pOworCQkJUERFQlVHX1JFRygiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT4KKwkJCQkgICByZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSAtCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+CisJCQkJICAgc2hhZG93W2luc3RhbmNlLT5hb19pZHhdKTsKKworCQkJLy8gU2V0IG91dHB1dCBhcyB0cmlnZ2VyZWQuCisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJj0KKwkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKworCQkJLy8gVHJpZ2dlciBvdXRwdXQuCisJCQlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwkJCVBERUJVR19SRUcoInNpbV9vdXRwdXRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJCW91dHcoMHhGRkZGLCBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcpOworCQkJUERFQlVHX1JFRygic2ltX291dHB1dF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnIC0KKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4RkZGRik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkvL0luaXQgY29udHJvbCB0YXNrCisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSBkZWxheTsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWUxNjAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKworCWlmICgoIWZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpICYmICgoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJiBpbnN0YW5jZS0+YW9faWR4KSkgewkvL0Jsb2NraW5nIG1vZGUuIFdhaXQgZm9yIHNvZnR3YXJlIHRyaWdnZXIuCisJCWlmICh0aW1lX291dCkgeworCQkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCQkJaWYgKGRlbGF5ID09IDApCisJCQkJZGVsYXkgPSAxOworCQl9CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIFRoaXMgcHJvY2VkdXJlIGhhcyBvd24gdGltZW91dC4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKCEoKGluc3RhbmNlLT4KKwkJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzKS0+CisJCQkJCQkgICAgdHJpZ2dlciAmIGluc3RhbmNlLT4KKwkJCQkJCSAgICBhb19pZHgpKSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgOiBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlID09IGFvX3N0YXR1c19ub25lKSB7CisJCQlQREVCVUcoIlNpbmdsZSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCWlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIGopID49IGRlbGF5KSkgeworCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpudW1iZXIgPSAxOwkJLy9FdmVyeSBzdWJkZXZpY2UgaGFzIG9ubHkgMSBjaGFubmVsLgorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICp0eXBlLAorCQkJCQkgIGludCAqc3VidHlwZSkKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJKnR5cGUgPSBNRV9UWVBFX0FPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgaTsKKwlpbnQgciA9IC0xOworCWludCBkaWZmID0gMjFFNjsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisJLy8gTWF4aW11bSByYW5nZXMgYXJlIHNsaWdodGx5IGxlc3MgdGhlbiAxMFYgb3IgMjBtQS4gRm9yIGNvbnZlbmllbnQgd2UgYWNjZXB0ZWQgdGhpcyB2YWx1ZSBhcyB2YWxpZCBvbmUuCisJaWYgKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQ7IGkrKykgeworCQkJaWYgKChpbnN0YW5jZS0+dV9yYW5nZXNbaV0ubWluIDw9ICptaW4pCisJCQkgICAgJiYgKChpbnN0YW5jZS0+dV9yYW5nZXNbaV0ubWF4ICsgNTAwMCkgPj0gKm1heCkpIHsKKwkJCQlpZiAoKGluc3RhbmNlLT51X3Jhbmdlc1tpXS5tYXggLQorCQkJCSAgICAgaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1pbikgLSAoKm1heCAtCisJCQkJCQkJCSAgICptaW4pIDwKKwkJCQkgICAgZGlmZikgeworCQkJCQlyID0gaTsKKwkJCQkJZGlmZiA9CisJCQkJCSAgICAoaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1heCAtCisJCQkJCSAgICAgaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1pbikgLQorCQkJCQkgICAgKCptYXggLSAqbWluKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAociA8IDApIHsKKwkJCVBFUlJPUigiTm8gbWF0Y2hpbmcgcmFuZ2UgZm91bmQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19OT19SQU5HRTsKKwkJfSBlbHNlIHsKKwkJCSptaW4gPSBpbnN0YW5jZS0+dV9yYW5nZXNbcl0ubWluOworCQkJKm1heCA9IGluc3RhbmNlLT51X3Jhbmdlc1tyXS5tYXg7CisJCQkqcmFuZ2UgPSByOworCQl9CisJfSBlbHNlIGlmICh1bml0ID09IE1FX1VOSVRfQU1QRVJFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQ7IGkrKykgeworCQkJaWYgKChpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWluIDw9ICptaW4pCisJCQkgICAgJiYgKGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5tYXggKyA1MDAwID49ICptYXgpKSB7CisJCQkJaWYgKChpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWF4IC0KKwkJCQkgICAgIGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5taW4pIC0gKCptYXggLQorCQkJCQkJCQkgICAqbWluKSA8CisJCQkJICAgIGRpZmYpIHsKKwkJCQkJciA9IGk7CisJCQkJCWRpZmYgPQorCQkJCQkgICAgKGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5tYXggLQorCQkJCQkgICAgIGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5taW4pIC0KKwkJCQkJICAgICgqbWF4IC0gKm1pbik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHIgPCAwKSB7CisJCQlQRVJST1IoIk5vIG1hdGNoaW5nIHJhbmdlIGZvdW5kLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTk9fUkFOR0U7CisJCX0gZWxzZSB7CisJCQkqbWluID0gaW5zdGFuY2UtPmlfcmFuZ2VzW3JdLm1pbjsKKwkJCSptYXggPSBpbnN0YW5jZS0+aV9yYW5nZXNbcl0ubWF4OworCQkJKnJhbmdlID0gciArIGluc3RhbmNlLT51X3Jhbmdlc19jb3VudDsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCBwaHlzaWNhbCB1bml0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9VTklUOworCX0KKwkqbWF4ZGF0YSA9IE1FMTYwMF9BT19NQVhfREFUQTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisJc3dpdGNoICh1bml0KSB7CisJY2FzZSBNRV9VTklUX1ZPTFQ6CisJCSpjb3VudCA9IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudDsKKwkJYnJlYWs7CisJY2FzZSBNRV9VTklUX0FNUEVSRToKKwkJKmNvdW50ID0gaW5zdGFuY2UtPmlfcmFuZ2VzX2NvdW50OworCQlicmVhazsKKwljYXNlIE1FX1VOSVRfQU5ZOgorCQkqY291bnQgPSBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQgKyBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpjb3VudCA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm8obWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICgoKHJhbmdlICsgMSkgPgorCSAgICAgKGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkpCisJICAgIHx8IChyYW5nZSA8IDApKSB7CisJCVBFUlJPUigiSW52YWxpZCByYW5nZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JBTkdFOworCX0KKworCWlmIChyYW5nZSA8IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IGluc3RhbmNlLT51X3Jhbmdlc1tyYW5nZV0ubWluOworCQkqbWF4ID0gaW5zdGFuY2UtPnVfcmFuZ2VzW3JhbmdlXS5tYXg7CisJfSBlbHNlIGlmIChyYW5nZSA8IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkgeworCQkqdW5pdCA9IE1FX1VOSVRfQU1QRVJFOworCQkqbWluID0gaW5zdGFuY2UtPmlfcmFuZ2VzW3JhbmdlIC0gaW5zdGFuY2UtPnVfcmFuZ2VzX2NvdW50XS5taW47CisJCSptYXggPSBpbnN0YW5jZS0+aV9yYW5nZXNbcmFuZ2UgLSBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnRdLm1heDsKKwl9CisJKm1heGRhdGEgPSBNRTE2MDBfQU9fTUFYX0RBVEE7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3N0YXRpYyB2b2lkIG1lMTYwMF9hb193b3JrX2NvbnRyb2xfdGFzayh2b2lkICpzdWJkZXZpY2UpCisjZWxzZQorc3RhdGljIHZvaWQgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKKyNlbmRpZgoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IHJlc2NoZWR1bGUgPSAxOworCWludCBzaWduYWxpbmcgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisjZWxzZQorCWluc3RhbmNlID0KKwkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWUxNjAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOworI2VuZGlmCisKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fRlVOQ1RJT05fXywgamlmZmllcywKKwkgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmIGluc3RhbmNlLT5hb19pZHgpKSB7CS8vIE91dHB1dCB3YXMgdHJpZ2dlcmQuCisJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQlzaWduYWxpbmcgPSAxOworCQlyZXNjaGVkdWxlID0gMDsKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9ydW4pIHsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKwkJfQorCisJfSBlbHNlIGlmICgoaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpICYmICgoamlmZmllcyAtIGluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUpID49IGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSkgewkvLyBUaW1lb3V0CisJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKwkJLy8gUmVzdG9yZSBvbGQgc2V0dGluZ3MuCisJCVBERUJVRygiV3JpdGUgb2xkIHZhbHVlIGJhY2sgdG8gcmVnaXN0ZXIuXG4iKTsKKwkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaW5zdGFuY2UtPmFvX2lkeF0gPQorCQkgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPmFvX2lkeF07CisKKwkJb3V0dygoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSwKKwkJICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT5hb19pZHhdKTsKKwkJUERFQlVHX1JFRygiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPgorCQkJCQkJCQkgYW9faWR4XSAtCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+CisJCQkJCQkJICAgICAgIGFvX2lkeF0pOworCisJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RydCBsaXN0LgorCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJj0KKwkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgeworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCQl9CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5hb19zaGFkb3dzX2xvY2spOworCisJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQlzaWduYWxpbmcgPSAxOworCQlyZXNjaGVkdWxlID0gMDsKKwl9CisKKwlpZiAoc2lnbmFsaW5nKSB7CS8vU2lnbmFsIGl0LgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJfQorCisJaWYgKGluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyAmJiByZXNjaGVkdWxlKSB7CS8vIFJlc2NoZWR1bGUgdGFzaworCQlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lMTYwMF93b3JrcXVldWUsCisJCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCX0gZWxzZSB7CisJCVBJTkZPKCI8JXM+IEVuZGluZyBjb250cm9sIHRhc2suXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmJmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qKgorICogQGZpbGUgbWUxNjAwX2FvLmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgTUUtMTYwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTE2MDBfQU9fSF8KKyNkZWZpbmUgX01FMTYwMF9BT19IXworCisjIGluY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyMgaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGRlZmluZSBNRTE2MDBfTUFYX1JBTkdFUwkyCS8qKjwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByYW5nZXMgaW4gbWUxNjAwX2FvX3N1YmRldmljZV90Ojp1X3JhbmdlcyB1bmQgbWUxNjAwX2FvX3N1YmRldmljZV90OjppX3Jhbmdlcy4gKi8KKworLyoqCisgKiBAYnJpZWYgRGVmaW5lcyBhIGVudHJ5IGluIHRoZSByYW5nZSB0YWJsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNjAwX2FvX3JhbmdlX2VudHJ5IHsKKwlpbnQzMl90IG1pbjsKKwlpbnQzMl90IG1heDsKK30gbWUxNjAwX2FvX3JhbmdlX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lMTYwMF9hb190aW1lb3V0IHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKK30gbWUxNjAwX2FvX3RpbWVvdXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWUxNjAwX2FvX3NoYWRvdyB7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgKnJlZ2lzdHJ5OworCXVpbnQxNl90ICpzaGFkb3c7CisJdWludDE2X3QgKm1pcnJvcjsKKwl1aW50MTZfdCBzeW5jaHJvbm91czsJCQkJCQkJCQkvKio8IFN5bmNocm9uaXphdGlvbiBsaXN0LiAqLworCXVpbnQxNl90IHRyaWdnZXI7CQkJCQkJCQkJCS8qKjwgU3luY2hyb25pemF0aW9uIGZsYWcuICovCit9IG1lMTYwMF9hb19zaGFkb3dfdDsKKwordHlwZWRlZiBlbnVtIE1FMTYwMF9BT19TVEFUVVMgeworCWFvX3N0YXR1c19ub25lID0gMCwKKwlhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQsCisJYW9fc3RhdHVzX3NpbmdsZV9ydW4sCisJYW9fc3RhdHVzX3NpbmdsZV9lbmQsCisJYW9fc3RhdHVzX2xhc3QKK30gTUUxNjAwX0FPX1NUQVRVUzsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTYwMF9hb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkJCQkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlpbnQgYW9faWR4OwkJCQkJCQkJCQkJCS8qKjwgVGhlIGluZGV4IG9mIHRoZSBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBvbiB0aGUgZGV2aWNlLiAqLworCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCQkJCQkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmNvbmZpZ19yZWdzX2xvY2s7CQkJCQkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCWludCB1X3Jhbmdlc19jb3VudDsJCQkJCQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIHZvbHRhZ2UgcmFuZ2VzIGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS4gKi8KKwltZTE2MDBfYW9fcmFuZ2VfZW50cnlfdCB1X3Jhbmdlc1tNRTE2MDBfTUFYX1JBTkdFU107CS8qKjwgQXJyYXkgaG9sZGluZyB0aGUgdm9sdGFnZSByYW5nZXMgb24gdGhpcyBzdWJkZXZpY2UuICovCisJaW50IGlfcmFuZ2VzX2NvdW50OwkJCQkJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgY3VycmVudCByYW5nZXMgYXZhaWxhYmxlIG9uIHRoaXMgc3ViZGV2aWNlLiAqLworCW1lMTYwMF9hb19yYW5nZV9lbnRyeV90IGlfcmFuZ2VzW01FMTYwMF9NQVhfUkFOR0VTXTsJLyoqPCBBcnJheSBob2xkaW5nIHRoZSBjdXJyZW50IHJhbmdlcyBvbiB0aGlzIHN1YmRldmljZS4gKi8KKworCS8qIFJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcgdW5pX2JpX3JlZzsJCQkJCQkJCS8qKjwgUmVnaXN0ZXIgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIHVuaXBvYXIgYW5kIGJpcG9sYXIgb3V0cHV0IG1vZGUuICovCisJdW5zaWduZWQgbG9uZyBpX3JhbmdlX3JlZzsJCQkJCQkJCS8qKjwgUmVnaXN0ZXIgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIHJhbmdlcy4gKi8KKwl1bnNpZ25lZCBsb25nIHNpbV9vdXRwdXRfcmVnOwkJCQkJCQkvKio8IFJlZ2lzdGVyIHVzZWQgaW4gb3JkZXIgdG8gdXBkYXRlIGFsbCBjaGFubmVscyBzaW11bHRhbmVvdXNseS4gKi8KKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfb25fcmVnOwkJCQkJCQkvKio8IFJlZ2lzdGVyIGVuYWJsaW5nIGN1cnJlbnQgb3V0cHV0IG9uIHRoZSBmb3VydGggc3ViZGV2aWNlLiAqLworIyAgIGlmZGVmIFBERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworIyAgIGVuZGlmCisKKwlNRTE2MDBfQU9fU1RBVFVTIHN0YXR1czsKKwltZTE2MDBfYW9fc2hhZG93X3QgKmFvX3JlZ3Nfc2hhZG93czsJCQkJCS8qKjwgQWRkcmVzc2VzIGFuZCBzaGFkb3dzIG9mIG91dHB1dCdzIHJlZ2lzdGVycy4gKi8KKwlzcGlubG9ja190ICphb19zaGFkb3dzX2xvY2s7CQkJCQkJCS8qKjwgUHJvdGVjdHMgdGhlIHNoYWRvdydzIHN0cnVjdC4gKi8KKwlpbnQgbW9kZTsJCQkJCQkJCQkJCQkvKio8IE1vZGUgaW4gd2l0Y2ggb3V0cHV0IHNob3VsZCB3b3Jrcy4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJCQkJCQkvKio8IFdhaXQgcXVldWUgdG8gcHV0IG9uIHRhc2tzIHdhaXRpbmcgZm9yIGRhdGEgdG8gYXJyaXZlLiAqLworCW1lMTYwMF9hb190aW1lb3V0X3QgdGltZW91dDsJCQkJCQkJLyoqPCBUaGUgdGltZW91dCBmb3Igc3RhcnQgaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2RlLiAqLworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTE2MDBfd29ya3F1ZXVlOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYW9fY29udHJvbF90YXNrOworI2Vsc2UKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFvX2NvbnRyb2xfdGFzazsKKyNlbmRpZgorCisJdm9sYXRpbGUgaW50IGFvX2NvbnRyb2xfdGFza19mbGFnOwkJCQkJCS8qKjwgRmxhZyBjb250cm9saW5nIHJlZXhlY3V0aW5nIG9mIGNvbnRyb2wgdGFzayAqLworfSBtZTE2MDBfYW9fc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIHN1YmRldmljZSB0ZW1wbGF0ZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBhb19pZHggVGhlIGluZGV4IG9mIHRoZSBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN1cnJlbnQgRmxhZyBpbmRpY2F0aW5nIHRoYXQgYW5hbG9nIG91dHB1dCB3aXRoICNhb19pZHggb2YgMyBpcyBjYXBhYmxlIG9mIGN1cnJlbnQgb3V0cHV0LgorICogQHBhcmFtIGNvbmZpZ19yZWdzX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgYW5kIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTE2MDBfYW9fc3ViZGV2aWNlX3QgKm1lMTYwMF9hb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBjdXJyLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjb25maWdfcmVnc19sb2NrLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBhb19zaGFkb3dzX2xvY2ssCisJCQkJCSAgICAgbWUxNjAwX2FvX3NoYWRvd190ICoKKwkJCQkJICAgICBhb19yZWdzX3NoYWRvd3MsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWUxNjAwX3dxKTsKKworIyBlbmRpZgkvL19fS0VSTkVMX18KKyNlbmRpZiAvL19NRTE2MDBfQU9fSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTc4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvX3JlZy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qKgorICogQGZpbGUgbWUxNjAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTE2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUxNjAwX0FPX1JFR19IXworI2RlZmluZSBfTUUxNjAwX0FPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzBfUkVHICAgIDB4MDAJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMC4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMV9SRUcgICAgMHgwMgkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAxLiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF8yX1JFRyAgICAweDA0CS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDIuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzNfUkVHICAgIDB4MDYJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMy4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfNF9SRUcgICAgMHgwOAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCA0LiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF81X1JFRyAgICAweDBBCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDUuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzZfUkVHICAgIDB4MEMJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgNi4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfN19SRUcgICAgMHgwRQkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCA3LiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF84X1JFRyAgICAweDEwCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDguICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzlfUkVHICAgIDB4MTIJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgOS4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMTBfUkVHICAgMHgxNAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAxMC4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMTFfUkVHICAgMHgxNgkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAxMS4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMTJfUkVHICAgMHgxOAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAxMi4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMTNfUkVHICAgMHgxQQkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAxMy4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMTRfUkVHICAgMHgxQwkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAxNC4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMTVfUkVHICAgMHgxRQkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAxNS4gKi8KKworLyogRXZlcnkgY2hhbm5lbCBvbmUgYml0OiBiaXBvbGFyID0gMCwgdW5pcG9sYXIgPSAxICovCisjZGVmaW5lIE1FMTYwMF9VTklfQklfUkVHCQkweDIwCS8qKjwgUmVnaXN0ZXIgdG8gc3dpdGNoIGJldHdlZW4gdW5pcG9sYXIgYW5kIGJpcG9sYXIuICovCisKKy8qIEV2ZXJ5IGNoYW5uZWwgb25lIGJpdCAob25seSBsb3dlciA4IEJpdHMpOiAwLi4yMG1BID0gMCwgNC4uMjBtQSA9IDEgKi8KKyNkZWZpbmUgTUUxNjAwXzAyMF80MjBfUkVHCQkweDIyCS8qKjwgUmVnaXN0ZXIgdG8gc3dpdGNoIGJldHdlZW4gdGhlIHR3byBjdXJyZW50IHJhbmdlcy4gKi8KKworLyogSWYgYSBiaXQgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBEQUMgKDQgcG9ydHMgZWFjaCkgaXMKKyAgIG5vdCBzZXQgYXQgdGhlIG1vbWVudCB5b3Ugd3JpdGUgdG8gYW4gb3V0cHV0IG9mIGl0LgorICAgQ2xlYXJpbmcgdGhlIGJpdCB1cGRhdGVzIHRoZSBwb3J0LiAqLworI2RlZmluZSBNRTE2MDBfU0lNX09VVFBVVF9SRUcJMHgyNAkvKio8IFJlZ2lzdGVyIHRvIHVwZGF0ZSBhbGwgY2hhbm5lbHMgb2YgYSBzdWJkZXZpY2Ugc2ltdWx0YW5lb3VzbHkuICovCisKKy8qIEN1cnJlbnQgb24vb2ZmIChvbmx5IGxvd2VyIDggYml0cyk6IG9mZiA9IDAsIG9uICA9IDEgKi8KKyNkZWZpbmUgTUUxNjAwX0NVUlJFTlRfT05fUkVHCTB4MjYJLyoqPCBSZWdpc3RlciB0byBzd2ljaHQgYmV0d2VlbiB2b2x0YWdlIGFuZCBjdXJyZW50IG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE2MDBfQU9fTUFYX0RBVEEJCTB4MEZGRgkvKio8IFRoZSBtYXhpbXVtIGRpZ2l0YWwgZGF0YSBhY2NlcHRlZCBieSBhbiBhbmFsb2cgb3V0cHV0IGNoYW5uZWwuICovCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmMyY2IxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDI2MSBAQAorLyoqCisgKiBAZmlsZSBtZTE2MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtMTYwMCBkZXZpY2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lMTYwMF9kZXZpY2UuaCIKKworc3RhdGljIHZvaWQgbWUxNjAwX3NldF9yZWdpc3RyeShtZTE2MDBfZGV2aWNlX3QgKiBzdWJkZXZpY2UsIHVpbnQzMl90IHJlZ19iYXNlKTsKK3N0YXRpYyB2b2lkIG1lMTYwMF9kZXN0cnVjdG9yKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSk7CisKKy8qKgorICogQGJyaWVmIEdsb2JhbCB2YXJpYWJsZS4KKyAqIFRoaXMgaXMgd29ya2luZyBxdWV1ZSBmb3IgcnVuaW5nIGEgc2VwYXJhdGUgYXRhc2sgdGhhdCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB3b3JrIHN0YXR1cyAoc3RhcnQsIHN0b3AsIHRpbWVvdXRzKS4KKyAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTE2MDBfd29ya3F1ZXVlOworCittZV9kZXZpY2VfdCAqbWUxNjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwlpbnQgZXJyOworCW1lMTYwMF9kZXZpY2VfdCAqbWUxNjAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCBjaGlwX2lkeDsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lMTYwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTE2MDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWUxNjAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lMTYwMF9kZXZpY2UsIDAsIHNpemVvZihtZTE2MDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTE2MDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWUxNjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2NrIC4KKwlzcGluX2xvY2tfaW5pdCgmbWUxNjAwX2RldmljZS0+Y29uZmlnX3JlZ3NfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lMTYwMF9kZXZpY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkvLyBHZXQgdGhlIG51bWJlciBvZiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZXMuCisJY2hpcF9pZHggPQorCSAgICBtZTE2MDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTE2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvLyBDcmVhdGUgc2hhZG93IGluc3RhbmNlLgorCW1lMTYwMF9kZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA9CisJICAgIG1lMTYwMF92ZXJzaW9uc1tjaGlwX2lkeF0uYW9fY2hpcHM7CisJbWUxNjAwX2RldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5ID0KKwkgICAga21hbGxvYyhtZTE2MDBfdmVyc2lvbnNbY2hpcF9pZHhdLmFvX2NoaXBzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJbWUxNjAwX3NldF9yZWdpc3RyeShtZTE2MDBfZGV2aWNlLAorCQkJICAgIG1lMTYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdKTsKKwltZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3Muc2hhZG93ID0KKwkgICAga21hbGxvYyhtZTE2MDBfdmVyc2lvbnNbY2hpcF9pZHhdLmFvX2NoaXBzICogc2l6ZW9mKHVpbnQxNl90KSwKKwkJICAgIEdGUF9LRVJORUwpOworCW1lMTYwMF9kZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5taXJyb3IgPQorCSAgICBrbWFsbG9jKG1lMTYwMF92ZXJzaW9uc1tjaGlwX2lkeF0uYW9fY2hpcHMgKiBzaXplb2YodWludDE2X3QpLAorCQkgICAgR0ZQX0tFUk5FTCk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKwlmb3IgKGkgPSAwOyBpIDwgbWUxNjAwX3ZlcnNpb25zW2NoaXBfaWR4XS5hb19jaGlwczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUxNjAwX2FvX2NvbnN0cnVjdG9yKG1lMTYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICgobWUxNjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICAgIFtjaGlwX2lkeF0uY3VyciA+CisJCQkJCQkJICAgICAgIGkpID8gMSA6IDApLAorCQkJCQkJCSAgICAgJm1lMTYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgY29uZmlnX3JlZ3NfbG9jaywKKwkJCQkJCQkgICAgICZtZTE2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGFvX3NoYWRvd3NfbG9jaywKKwkJCQkJCQkgICAgICZtZTE2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGFvX3JlZ3Nfc2hhZG93cywKKwkJCQkJCQkgICAgIG1lMTYwMF93b3JrcXVldWUpOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTE2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMTYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxNjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJLy8gT3ZlcndyaXRlIGJhc2UgY2xhc3MgbWV0aG9kcy4KKwltZTE2MDBfZGV2aWNlLT5iYXNlLm1lX2RldmljZV9kZXN0cnVjdG9yID0gbWUxNjAwX2Rlc3RydWN0b3I7CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lMTYwMF9kZXZpY2U7Cit9CisKK3N0YXRpYyB2b2lkIG1lMTYwMF9kZXN0cnVjdG9yKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSkKK3sKKwltZTE2MDBfZGV2aWNlX3QgKm1lMTYwMF9kZXZpY2UgPSAobWUxNjAwX2RldmljZV90ICopIGRldmljZTsKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBEZXN0cm95IHNoYWRvdyBpbnN0YW5jZS4KKwlrZnJlZShtZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnkpOworCWtmcmVlKG1lMTYwMF9kZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5zaGFkb3cpOworCWtmcmVlKG1lMTYwMF9kZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5taXJyb3IpOworCisJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNjAwX2RldmljZSk7CisJa2ZyZWUobWUxNjAwX2RldmljZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lMTYwMF9zZXRfcmVnaXN0cnkobWUxNjAwX2RldmljZV90ICogc3ViZGV2aWNlLCB1aW50MzJfdCByZWdfYmFzZSkKK3sJCQkJLy8gQ3JlYXRlIHNoYWRvdyBzdHJ1Y3R1cmUuCisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDEpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMF0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMF9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMikgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xX1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAzKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzJdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzJfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDQpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbM10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfM19SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gNSkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs0XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF80X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSA2KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzVdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzVfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDcpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbNl0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfNl9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gOCkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs3XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF83X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSA5KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzhdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzhfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDEwKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzldID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzlfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDExKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzEwXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xMF9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMTIpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMTFdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzExX1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxMykgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxMl0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMTJfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDE0KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzEzXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xM19SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMTUpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMTRdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzE0X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxNikgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxNV0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMTVfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID4gMTYpIHsKKwkJUEVSUk9SKCJNb3JlIHRoYW4gMTYgb3V0cHV0cyEgKCVkKVxuIiwKKwkJICAgICAgIHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50KTsKKwl9Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTE2MDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWRcbi4iKTsKKworCW1lMTYwMF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibWUxNjAwIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTE2MDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWRcbi4iKTsKKworCWZsdXNoX3dvcmtxdWV1ZShtZTE2MDBfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtZTE2MDBfd29ya3F1ZXVlKTsKK30KKworbW9kdWxlX2luaXQobWUxNjAwX2luaXQpOworbW9kdWxlX2V4aXQobWUxNjAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTE2MDAgRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtMTYwMCBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lMTYwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiMjMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qKgorICogQGZpbGUgbWUxNjAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTE2MDAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTYwMF9ICisjZGVmaW5lIF9NRTE2MDBfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWUxNjAwX2FvLmgiCisjaW5jbHVkZSAibWUxNjAwX2FvX3JlZy5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgdG8gc3RvcmUgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNjAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsJCQkJLyoqPCBUaGUgUENJIGRldmljZSBpZCBvZiB0aGUgZGV2aWNlLiAqLworCXVuc2lnbmVkIGludCBhb19jaGlwczsJCQkvKio8IFRoZSBudW1iZXIgb2YgYW5hbG9nIG91dHB1dHMgb24gdGhlIGRldmljZS4gKi8KKwlpbnQgY3VycjsJCQkJCQkvKio8IEZsYWcgdG8gaWRlbnRpZnkgYW1vdW50cyBvZiBjdXJyZW50IG91dHB1dC4gKi8KK30gbWUxNjAwX3ZlcnNpb25fdDsKKworLyoqCisgICogQGJyaWVmIERlZmluZXMgZm9yIGVhY2ggTUUtMTYwMCBkZXZpY2UgdmVyc2lvbiBpdHMgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWUxNjAwX3ZlcnNpb25fdCBtZTE2MDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFUsIDQsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF84VSwgOCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzEyVSwgMTIsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlUsIDE2LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVXzhJLCAxNiwgOH0sCisJezB9Cit9OworCisvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTE2MDBfdmVyc2lvbnMuICovCisjZGVmaW5lIE1FMTYwMF9ERVZJQ0VfVkVSU0lPTlMgKHNpemVvZihtZTE2MDBfdmVyc2lvbnMpIC8gc2l6ZW9mKG1lMTYwMF92ZXJzaW9uX3QpIC0gMSkKKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWUxNjAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lMTYwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWUxNjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTE2MDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTE2MDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTYwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTE2MDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCQkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCXNwaW5sb2NrX3QgY29uZmlnX3JlZ3NfbG9jazsJCQkvKio8IFByb3RlY3RzIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4gKi8KKworCW1lMTYwMF9hb19zaGFkb3dfdCBhb19yZWdzX3NoYWRvd3M7CQkvKio8IEFkZHJlc3NlcyBhbmQgc2hhZG93cyBvZiBvdXRwdXQncyByZWdpc3RlcnMuICovCisJc3BpbmxvY2tfdCBhb19zaGFkb3dzX2xvY2s7CQkJCS8qKjwgUHJvdGVjdHMgdGhlIHNoYWRvdydzIHN0cnVjdC4gKi8KK30gbWUxNjAwX2RldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTYwMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTE2MDAgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWUxNjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMGRlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpLmMKQEAgLTAsMCArMSwzNDM0IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9haS5jCisgKgorICogQGJyaWVmIE1FLTQwMDAgYW5hbG9nIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorCisjaW5jbHVkZSAibWU0NjAwX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9haV9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfYWkuaCIKKworLyoKKyAqIERlY2xhcmF0aW9ucyAobG9jYWwpCisgKi8KKworc3RhdGljIHZvaWQgbWU0NjAwX2FpX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpOworCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgcmVhZF9tb2RlLAorCQkJCSAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IGlubGluZSBtZTQ2MDBfYWlfaW9fc3RyZWFtX3JlYWRfZ2V0X3ZhbHVlKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqCisJCQkJCQkgICAgIGluc3RhbmNlLCBpbnQgKnZhbHVlcywKKwkJCQkJCSAgICAgY29uc3QgaW50IGNvdW50LAorCQkJCQkJICAgICBjb25zdCBpbnQgZmxhZ3MpOworCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdW5pdCwgaW50ICpjb3VudCk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfdGltZXIobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIGludCB0aW1lciwKKwkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU0NjAwX2FpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGFpX211eF90b2dnbGVyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSk7CisKKy8qKiBJbW1pZGlhdGUgc3RvcC4KKyogUmVzZXQgYWxsIElSUSdzIHNvdXJjZXMuIChibG9jayBsYWNoZXMpCisqIFByZXNlcnZlIEZJRk8KKyovCitzdGF0aWMgaW50IGFpX3N0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpOworCisvKiogSW1taWRpYXRlIHN0b3AuCisqIFJlc2V0IGFsbCBJUlEncyBzb3VyY2VzLiAoYmxvY2sgbGFjaGVzKQorKiBSZXNldCBkYXRhIEZJRk8KKyovCit2b2lkIGlubGluZSBhaV9zdG9wX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBJbnRlcnJ1cHQgbG9naWNzLgorKiBSZWFkIGRhdGFzCisqIFJlc2V0IGxhdGNoZXMKKyovCit2b2lkIGFpX2xpbWl0ZWRfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBjb25zdCB1aW50MzJfdCBpcnFfc3RhdHVzLAorCQkgICAgY29uc3QgdWludDMyX3QgY3RybF9zdGF0dXMpOwordm9pZCBhaV9pbmZpbml0ZV9pc3IobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCSAgICAgY29uc3QgdWludDMyX3QgaXJxX3N0YXR1cywgY29uc3QgdWludDMyX3QgY3RybF9zdGF0dXMpOworCisvKiogTGFzdCBjaHVuY2sgb2YgZGF0YXMuIFdlIG11c3QgcmVzY2hlZHVsZSBzYW1wbGUgY291bnRlci4KKyogTGVhdmluZyBTQ19SRUxPQUQgZG9lc24ndCBkbyBhbnkgaGFybSwgYnV0IGluIHNvbWUgYmFkIGNhc2UgY2FuIG1ha2UgZXh0cmEgaW50ZXJydXB0cy4KKyogV2hlbiB0aHJlc2hvbGQgaXMgd3JvbmdseSBzZXQgc29tZSBJUlEgYXJlIGxvc3QuKCEhISkKKyovCit2b2lkIGlubGluZSBhaV9yZXNjaGVkdWxlX1NDKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIFJlYWQgZGF0YXMgZnJvbSBGSUZPIGFuZCBjb3B5IHRoZW0gdG8gYnVmZmVyICovCitzdGF0aWMgaW50IGlubGluZSBhaV9yZWFkX2RhdGEobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkgICAgICAgY29uc3QgaW50IGNvdW50KTsKKworLyoqIENvcHkgcmVzdCBvZiBkYXRhIGZyb20gZmlmbyB0byBjaXJjdWxhciBidWZmZXIuKi8KK3N0YXRpYyBpbnQgaW5saW5lIGFpX3JlYWRfZGF0YV9wb29saW5nKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIFNldCBJU00gdG8gbmV4dCBzdGF0ZSBmb3IgaW5maW5pdGUgZGF0YSBhcXVzYXRpb24gbW9kZSovCit2b2lkIGlubGluZSBhaV9pbmZpbml0ZV9JU00obWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpOworCisvKiogU2V0IElTTSB0byBuZXh0IHN0YXRlIGZvciBkZWZpbmUgYW1vdW50IG9mIGRhdGEgYXF1c2F0aW9uIG1vZGUqLwordm9pZCBpbmxpbmUgYWlfbGltaXRlZF9JU00obWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkgICB1aW50MzJfdCBpcnFfc3RhdHVzKTsKKworLyoqIFNldCBJU00gdG8gbmV4dCBzdGFnZSBmb3IgbGltaXRlZCBtb2RlICovCit2b2lkIGlubGluZSBhaV9kYXRhX2FjcXVpc2l0aW9uX2xvZ2ljKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzayh2b2lkICpzdWJkZXZpY2UpOworI2Vsc2UKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2VuZGlmCisKKy8qIERlZmluaXRpb25zCisgKi8KKworbWU0NjAwX2FpX3N1YmRldmljZV90ICptZTQ2MDBfYWlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCByYW5nZXMsCisJCQkJCSAgICAgaW50IGlzb2xhdGVkLAorCQkJCQkgICAgIGludCBzaCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTQ2MDBfd3EpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLgorCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNDYwMF9haV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLy8gSW5pdGlhbGl6ZSBjaXJjdWxhciBidWZmZXIuCisJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gTUU0NjAwX0FJX0NJUkNfQlVGX0NPVU5UIC0gMTsKKworCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0KKwkgICAgKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIE1FNDYwMF9BSV9DSVJDX0JVRl9TSVpFX09SREVSKTsKKwlQREVCVUcoImNpcmNfYnVmID0gJXAgc2l6ZT0lbGRcbiIsIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCSAgICAgICBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSk7CisKKwlpZiAoIXN1YmRldmljZS0+Y2lyY19idWYuYnVmKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBjaXJjdWxhciBidWZmZXIuXG4iKTsKKwkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZS0+Y2lyY19idWYuYnVmLCAwLCBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSk7CisJc3ViZGV2aWNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCXN1YmRldmljZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisKKwkvLyBJbml0aWFsaXplIHdhaXQgcXVldWUuCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3ViZGV2aWNlLT53YWl0X3F1ZXVlKTsKKworCS8vIFNhdmUgdGhlIG51bWJlciBvZiBjaGFubmVscy4KKwlzdWJkZXZpY2UtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzaW5nbGUgY29uZmlnIGVudHJpZXMgdG8gcmVzZXQgdmFsdWVzICovCisJZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfY29uZmlnW2ldLnN0YXR1cyA9IE1FX1NJTkdMRV9DSEFOTkVMX05PVF9DT05GSUdVUkVEOwkvL25vdCBjb25maWd1cmVkCisJfQorCisJLy8gU2F2ZSBpZiBpc29sYXRlZCBkZXZpY2UuCisJc3ViZGV2aWNlLT5pc29sYXRlZCA9IGlzb2xhdGVkOworCisJLy8gU2F2ZSBpZiBzYW1wbGUgYW5kIGhvbGQgaXMgYXZhaWxhYmxlLgorCXN1YmRldmljZS0+c2ggPSBzaDsKKworCS8vIFNldCBzdHJlYW0gY29uZmlnIHRvIG5vdCBjb25maWd1cmVkIHN0YXRlLgorCXN1YmRldmljZS0+Zmlmb19pcnFfdGhyZXNob2xkID0gMDsKKwlzdWJkZXZpY2UtPmRhdGFfcmVxdWlyZWQgPSAwOworCXN1YmRldmljZS0+Y2hhbl9saXN0X2xlbiA9IDA7CisKKwkvLyBJbml0aWFsaXplIHJlZ2lzdGVycyBhZGRyZXNzZXMuCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NUUkxfUkVHOworCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX1NUQVRVU19SRUc7CisJc3ViZGV2aWNlLT5jaGFubmVsX2xpc3RfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfQ0hBTk5FTF9MSVNUX1JFRzsKKwlzdWJkZXZpY2UtPmRhdGFfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfREFUQV9SRUc7CisJc3ViZGV2aWNlLT5jaGFuX3RpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NIQU5fVElNRVJfUkVHOworCXN1YmRldmljZS0+Y2hhbl9wcmVfdGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfQ0hBTl9QUkVfVElNRVJfUkVHOworCXN1YmRldmljZS0+c2Nhbl90aW1lcl9sb3dfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfU0NBTl9USU1FUl9MT1dfUkVHOworCXN1YmRldmljZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyA9CisJICAgIHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fVElNRVJfSElHSF9SRUc7CisJc3ViZGV2aWNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnID0KKwkgICAgcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfU0NBTl9QUkVfVElNRVJfTE9XX1JFRzsKKwlzdWJkZXZpY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnID0KKwkgICAgcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfU0NBTl9QUkVfVElNRVJfSElHSF9SRUc7CisJc3ViZGV2aWNlLT5zdGFydF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9TVEFSVF9SRUc7CisJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0lSUV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+c2FtcGxlX2NvdW50ZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfU0FNUExFX0NPVU5URVJfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvLyBJbml0aWFsaXplIHJhbmdlcy4KKwlzdWJkZXZpY2UtPnJhbmdlc19sZW4gPSByYW5nZXM7CisJc3ViZGV2aWNlLT5yYW5nZXNbMF0ubWluID0gLTEwRTY7CisJc3ViZGV2aWNlLT5yYW5nZXNbMF0ubWF4ID0gOTk5OTY5NDsKKworCXN1YmRldmljZS0+cmFuZ2VzWzFdLm1pbiA9IDA7CisJc3ViZGV2aWNlLT5yYW5nZXNbMV0ubWF4ID0gOTk5OTg0NzsKKworCXN1YmRldmljZS0+cmFuZ2VzWzJdLm1pbiA9IC0yNUU1OworCXN1YmRldmljZS0+cmFuZ2VzWzJdLm1heCA9IDI0OTk5MjM7CisKKwlzdWJkZXZpY2UtPnJhbmdlc1szXS5taW4gPSAwOworCXN1YmRldmljZS0+cmFuZ2VzWzNdLm1heCA9IDI0OTk5NjE7CisKKwkvLyBXZSBoYXZlIHRvIHN3aXRjaCB0aGUgbXV4IGluIG9yZGVyIHRvIGdldCBpdCB3b3JrIGNvcnJlY3RseS4KKwlhaV9tdXhfdG9nZ2xlcihzdWJkZXZpY2UpOworCisJLy8gUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKwlpZiAocmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lNDYwMF9haV9pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCVNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQlNRTQ2MDBfTkFNRSwgc3ViZGV2aWNlKSkgeworCQlQRVJST1IoIkNhbm5vdCByZWdpc3RlciBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCQkgICBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVBJTkZPKCJSZWdpc3RlcmVkIGlycT0lZC5cbiIsIHN1YmRldmljZS0+aXJxKTsKKworCS8vIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTQ2MDBfYWlfZGVzdHJ1Y3RvcjsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lNDYwMF9haV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2FpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lNDYwMF9haV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPQorCSAgICBtZTQ2MDBfYWlfaW9fc3RyZWFtX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWU0NjAwX2FpX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3JlYWQgPSBtZTQ2MDBfYWlfaW9fc3RyZWFtX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhcnQgPQorCSAgICBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9CisJICAgIG1lNDYwMF9haV9pb19zdHJlYW1fc3RhdHVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0b3AgPSBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0b3A7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lNDYwMF9haV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MgPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMgPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfbnVtYmVyX3JhbmdlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfaW5mbzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWU0NjAwX2FpX3F1ZXJ5X3RpbWVyOworCisJLy8gUHJlcGFyZSB3b3JrIHF1ZXVlLgorCXN1YmRldmljZS0+bWU0NjAwX3dvcmtxdWV1ZSA9IG1lNDYwMF93cTsKKworLyogd29ya3F1ZXVlIEFQSSBjaGFuZ2VkIGluIGtlcm5lbCAyLjYuMjAgKi8KKyNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkgKQorCUlOSVRfV09SSygmc3ViZGV2aWNlLT5haV9jb250cm9sX3Rhc2ssIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzaywKKwkJICAodm9pZCAqKXN1YmRldmljZSk7CisjZWxzZQorCUlOSVRfREVMQVlFRF9XT1JLKCZzdWJkZXZpY2UtPmFpX2NvbnRyb2xfdGFzaywKKwkJCSAgbWU0NjAwX2FpX3dvcmtfY29udHJvbF90YXNrKTsKKyNlbmRpZgorCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2FpX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTQ2MDBfYWlfaW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCBpbnN0YW5jZSk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpbnN0YW5jZS0+Y2lyY19idWYuYnVmLAorCQkgICBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJY29uc3QgaW50IHRpbWVvdXQgPSBIWiAvIDEwOwkvLzEwMG1zCisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfbm9uZTsKKworCWZvciAoaSA9IDA7IGkgPD0gdGltZW91dDsgaSsrKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBzdGF0dXMpOworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCS8vU3RvcCBETUEKKwkJY3RybCAmPSB+TUU0NjAwX0FJX0NUUkxfUlBDSV9GSUZPOworCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zIQorCQljdHJsICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUDsKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgc3RhdHVzKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSkKKwkJCWJyZWFrOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJaWYgKGkgPiB0aW1lb3V0KSB7CisJCVBFUlJPUigiRlNNIGlzIHN0aWxsIGJ1c3kuXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgc3RhdHVzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gQ2xlYXIgYWxsIGZlYXR1cmVzLiBEaXNzYWJsZSBpbnRlcnJ1cHRzLgorCWN0cmwgJj0gfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUAorCQkgIHwgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUQorCQkgIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEpOworCWN0cmwgfD0gKE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUCisJCSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQKKwkJIHwgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCk7CisKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIHN0YXR1cyk7CisKKwlvdXRsKE1FNDYwMF9BSV9NSU5fQ0hBTl9USUNLUyAtIDEsIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGx4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0FJX01JTl9DSEFOX1RJQ0tTKTsKKwlvdXRsKE1FNDYwMF9BSV9NSU5fQUNRX1RJQ0tTIC0gMSwgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl9wcmVfdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxseFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUyk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcpOworCVBERUJVR19SRUcoInNjYW5fcHJlX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcpOworCVBERUJVR19SRUcoInNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDB4RUZGRkZGRkYsIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcpOworCVBERUJVR19SRUcoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIDB4RUZGRkZGRkYpOworCisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPSAwOworCWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkID0gMDsKKwlpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbiA9IDA7CisKKwkvLyBJbml0aWFsaXplIHRoZSBzaW5nbGUgY29uZmlnIGVudHJpZXMgdG8gcmVzZXQgdmFsdWVzLgorCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+Y2hhbm5lbHM7IGkrKykgeworCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tpXS5zdGF0dXMgPQorCQkgICAgTUVfU0lOR0xFX0NIQU5ORUxfTk9UX0NPTkZJR1VSRUQ7CisJfQorCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfbm9uZTsKKworCS8vU2lnbmFsIHJlc2V0IGlmIHVzZXIgaXMgb24gd2FpdC4KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlpbnQgaTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU0lOR0xFX0NPTkZJR19DT05USU5VRSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3dpdGNoICh0cmlnX3R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJaWYgKHRyaWdfZWRnZSAhPSBNRV9UUklHX0VER0VfTk9ORSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS4gU29mdHdhcmUgdHJpZ2dlciBoYXMgbm90IGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9BTkFMT0c6CisJCWlmIChpbnN0YW5jZS0+Y2hhbm5lbHMgPD0gMTYpCS8vT25seSB2ZXJzaW9ucyB3aXRoIDMyIGNoYW5uZWxzIGhhdmUgYW5hbG9nIHRyaWdnZXIgKDQ2NzAgYW5kIDQ2ODApCisJCXsKKwkJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCX0KKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMOgorCQlpZiAoKHRyaWdfZWRnZSAhPSBNRV9UUklHX0VER0VfQU5ZKQorCQkgICAgJiYgKHRyaWdfZWRnZSAhPSBNRV9UUklHX0VER0VfUklTSU5HKQorCQkgICAgJiYgKHRyaWdfZWRnZSAhPSBNRV9UUklHX0VER0VfRkFMTElORykpIHsKKwkJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJfQorCisJaWYgKHRyaWdfY2hhbiAhPSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU47CisJfQorCisJaWYgKChzaW5nbGVfY29uZmlnIDwgMCkgfHwgKHNpbmdsZV9jb25maWcgPj0gaW5zdGFuY2UtPnJhbmdlc19sZW4pKSB7CisJCVBFUlJPUigiSW52YWxpZCBzaW5nbGUgY29uZmlnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKworCWlmICgocmVmICE9IE1FX1JFRl9BSV9HUk9VTkQpICYmIChyZWYgIT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFuYWxvZyByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwl9CisKKwlpZiAoKHNpbmdsZV9jb25maWcgJSAyKSAmJiAocmVmICE9IE1FX1JFRl9BSV9HUk9VTkQpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKChyZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkKKwkgICAgJiYgKChpbnN0YW5jZS0+Y2hhbm5lbHMgPT0gMTYpIHx8IChjaGFubmVsID49IDE2KSkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFuYWxvZyByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwl9CisKKwlpZiAoY2hhbm5lbCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmIChjaGFubmVsID49IGluc3RhbmNlLT5jaGFubmVscykgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkvL1ByZXBhcmUgZGF0YSBlbnRyeS4KKwkvLyBDb21tb24gZm9yIGFsbCBtb2Rlcy4KKwlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSA9CisJICAgIGNoYW5uZWwgfCBNRTQ2MDBfQUlfTElTVF9MQVNUX0VOVFJZOworCisJaWYgKHJlZiA9PSBNRV9SRUZfQUlfRElGRkVSRU5USUFMKSB7CS8vIE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTDsKKwl9CisvKgorCQkvLyBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgPSAweDAwMDAKKwkJLy8gJ2VudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCcgPD09IERvIG5vdGhpbmcuIFJlbW92ZWQuCisJCWVsc2UKKwkJey8vIE1FX1JFRl9BSV9HUk9VTkQKKwkJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRDsKKwkJfQorKi8KKwlzd2l0Y2ggKHNpbmdsZV9jb25maWcpIHsKKwljYXNlIDA6CQkvLy0xMFYuLjEwVgorLyoKKwkJCQkJLy8gTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCA9IDB4MDAwMAorCQkJCQkvLyAnZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCcgPD09IERvIG5vdGhpbmcuIFJlbW92ZWQuCisJCQkJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTA7CisqLyBicmVhazsKKworCWNhc2UgMToJCS8vMFYuLjEwVgorCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PQorCQkgICAgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMTA7CisJCWJyZWFrOworCisJY2FzZSAyOgkJLy8tMi41Vi4uMi41VgorCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PQorCQkgICAgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzU7CisJCWJyZWFrOworCisJY2FzZSAzOgkJLy8wVi4uMi41VgorCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PQorCQkgICAgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81OworCQlicmVhazsKKwl9CisKKwkvLyBQcmVwYXJlIGNvbnRyb2wgcmVnaXN0ZXIuCisJLy8gQ29tbW9uIGZvciBhbGwgbW9kZXMuCisJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCA9CisJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCisJc3dpdGNoICh0cmlnX3R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJLy8gTm90aGluZyB0byBzZXQuCisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCB8PQorCQkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfQU5BTE9HOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfD0KKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdfZWRnZSkgeworCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJLy8gTm90aGluZyB0byBzZXQuCisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX0VER0VfQU5ZOgorCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5jdHJsIHw9CisJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19CT1RIOworCisJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCB8PQorCQkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfRkFMTElORzsKKwkJYnJlYWs7CisJfQorCisJLy8gRW5hYmxlIHRoaXMgY2hhbm5lbAorCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLnN0YXR1cyA9IE1FX1NJTkdMRV9DSEFOTkVMX0NPTkZJR1VSRUQ7CisKKwkvLyBDb3B5IHRoaXMgc2V0dGluZ3MgdG8gb3RoZXIgb3V0cHV0cy4KKwlpZiAoZmxhZ3MgPT0gTUVfSU9fU0lOR0xFX0NPTkZJR19DT05USU5VRSkgeworCQlmb3IgKGkgPSBjaGFubmVsICsgMTsgaSA8IGluc3RhbmNlLT5jaGFubmVsczsgaSsrKSB7CisJCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tpXS5jdHJsID0KKwkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5jdHJsOworCQkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uZW50cnkgPQorCQkJICAgIGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5OworCQkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uc3RhdHVzID0KKwkJCSAgICBNRV9TSU5HTEVfQ0hBTk5FTF9DT05GSUdVUkVEOworCQl9CisJfQorCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXZvbGF0aWxlIHVpbnQzMl90IHRtcDsKKwl2b2xhdGlsZSB1aW50MzJfdCB2YWw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwl1bnNpZ25lZCBsb25nIGo7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCWlmICgoY2hhbm5lbCA+IGluc3RhbmNlLT5jaGFubmVscykgfHwgKGNoYW5uZWwgPCAwKSkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmIChpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5zdGF0dXMgIT0KKwkgICAgTUVfU0lOR0xFX0NIQU5ORUxfQ09ORklHVVJFRCkgeworCQlQRVJST1IoIkNoYW5uZWwgaXMgbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCWlmIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGJ1c3kuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vIENhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suXG4iKTsKKwlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2spOworCisJaWYgKHRpbWVfb3V0KSB7CisJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWRlbGF5ID0gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJLy8gTWFyayB0aGF0IFN0cmVhbUNvbmZpZyBpcyByZW1vdmVkLgorCWluc3RhbmNlLT5jaGFuX2xpc3RfbGVuID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCS8vLyBAbm90ZSBJbXBydGFudDogUHJlc2VydmUgRVhUIElSUSBzZXR0aW5ncy4KKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkvLyBDbGVhciBGSUZPcyBhbmQgZGlzc2FibGUgaW50ZXJydXB0cworCXRtcCAmPQorCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPKTsKKworCXRtcCAmPQorCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwKKwkgICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRKTsKKwl0bXAgfD0KKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQgfAorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUOworCisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcpOworCVBERUJVR19SRUcoInNjYW5fcHJlX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcpOworCVBERUJVR19SRUcoInNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcpOworCVBERUJVR19SRUcoInNjYW5fdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcpOworCVBERUJVR19SRUcoInNjYW5fdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCg2NSwgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFuX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgNjUpOworCW91dGwoNjUsIGluc3RhbmNlLT5jaGFuX3ByZV90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fcHJlX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFuX3ByZV90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDY1KTsKKworCS8vUmVhY3RpdmUgRklGT3MuIEVuYWJsZSB3b3JrLgorCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCW91dGwoaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnksCisJICAgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyk7CisJUERFQlVHX1JFRygiY2hhbm5lbF9saXN0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFubmVsX2xpc3RfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSk7CisKKwkvLyBQcmVzZXJ2ZSBFWFQgSVJRIHNldHRpbmdzLgorCXRtcCAmPSAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQpOworCW91dGwoaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCB8IHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCB8IHRtcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJaWYgKCEoaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCAmIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHKSkgewkvLyBTb2Z0d2FyZSBzdGFydAorCQlpbmwoaW5zdGFuY2UtPnN0YXJ0X3JlZyk7CisJCVBERUJVR19SRUcoInN0YXJ0X3JlZyBpbmwoMHglbFgrMHglbFgpXG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c3RhcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlKTsKKworCQlkZWxheSA9IDI7CisJfQorCisJaiA9IGppZmZpZXM7CisKKwl3aGlsZSAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkpIHsKKwkJaWYgKGRlbGF5ICYmICgoamlmZmllcyAtIGopID49IGRlbGF5KSkgeworCQkJaWYgKCEoaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCAmIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHKSkgewkvLyBTb2Z0d2FyZSBzdGFydC4KKwkJCQlQRVJST1IoIlZhbHVlIG5vdCBhdmFpbGFibGUgYWZ0ZXIgd2FpdC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfSBlbHNlIHsJLy8gRXh0ZXJuYWwgc3RhcnQuCisJCQkJUEVSUk9SKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJLy8gV2FpdAorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZCkgeworCQkJUEVSUk9SKCJXYWl0IGludGVycnVwdGVkIGJ5IHJlc2V0LlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIFJlYWQgdmFsdWUuCisJaWYgKCFlcnIpIHsKKwkJdmFsID0gaW5sKGluc3RhbmNlLT5kYXRhX3JlZykgXiAweDgwMDA7CisJCVBERUJVR19SRUcoImRhdGFfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5kYXRhX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsKTsKKwkJKnZhbHVlID0gdmFsICYgTUU0NjAwX0FJX01BWF9EQVRBOworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IDB4RkZGRkZGRkY7CisJfQorCisJLy8gUmVzdG9yZSBzZXR0aW5ncy4KKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkvLyBDbGVhciBGSUZPcyBhbmQgZGlzc2FibGUgaW50ZXJydXB0cy4KKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyk7CisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJROworCXRtcCB8PQorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCB8CisJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9MRV9JUlFfUkVTRVQgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWludCBpOwkJCS8vIGludGVybmFsIG11bHRpcHVycG9zZSB2YXJpYWJsZQorCXVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhX3JlcXVpcmVkOworCisJdm9sYXRpbGUgdWludDMyX3QgZW50cnk7CisJdm9sYXRpbGUgdWludDMyX3QgY3RybCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwl2b2xhdGlsZSB1aW50MzJfdCB0bXA7CS8vIHVzZSB3aGVuIGN1cnJlbnQgY29weSBvZiByZWdpc3RlcidzIHZhbHVlIG5lZWRlZAorCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJdWludDY0X3QgYWNxX3RpY2tzOworCXVpbnQ2NF90IHNjYW5fdGlja3M7CisJdWludDY0X3QgY29udl90aWNrczsKKwl1bnNpZ25lZCBpbnQgYWNxX3N0YXJ0X3RpY2tzX2xvdyA9IHRyaWdnZXItPmlBY3FTdGFydFRpY2tzTG93OworCXVuc2lnbmVkIGludCBhY3Ffc3RhcnRfdGlja3NfaGlnaCA9IHRyaWdnZXItPmlBY3FTdGFydFRpY2tzSGlnaDsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pU2NhblN0YXJ0VGlja3NMb3c7CisJdW5zaWduZWQgaW50IHNjYW5fc3RhcnRfdGlja3NfaGlnaCA9IHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0hpZ2g7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfbG93ID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzTG93OworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NIaWdoOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIC8vIENvbnZlcnQgdGlja3MgdG8gNjQgYml0IGxvbmcgdmFsdWVzCisJICAgIGFjcV90aWNrcyA9CisJICAgICh1aW50NjRfdCkgYWNxX3N0YXJ0X3RpY2tzX2xvdyArCisJICAgICgodWludDY0X3QpIGFjcV9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKwlzY2FuX3RpY2tzID0KKwkgICAgKHVpbnQ2NF90KSBzY2FuX3N0YXJ0X3RpY2tzX2xvdyArCisJICAgICgodWludDY0X3QpIHNjYW5fc3RhcnRfdGlja3NfaGlnaCA8PCAzMik7CisJY29udl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCisJLy8gQ2hlY2sgc2V0dGluZ3MgLSBiZWdpbgorCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKwkJZ290byBFUlJPUjsKKwkJYnJlYWs7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpCisJICAgICYmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSAhPSBNRV9UUklHX0VER0VfTk9ORSkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCQkJZ290byBFUlJPUjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdDaGFuICE9IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19DSEFOOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmICgoYWNxX3RpY2tzIDwgTUU0NjAwX0FJX01JTl9BQ1FfVElDS1MpCisJICAgIHx8IChhY3FfdGlja3MgPiBNRTQ2MDBfQUlfTUFYX0FDUV9USUNLUykpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfQVJHOworCQlnb3RvIEVSUk9SOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9USU1FUjoKKwkJaWYgKChzY2FuX3RpY2tzIDwgTUU0NjAwX0FJX01JTl9TQ0FOX1RJQ0tTKQorCQkgICAgfHwgKHNjYW5fdGlja3MgPiBNRTQ2MDBfQUlfTUFYX1NDQU5fVElDS1MpCisJCSAgICB8fCAoc2Nhbl90aWNrcyA8IGNvdW50ICogY29udl90aWNrcykKKwkJICAgICkgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RhcnQgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfQVJHOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMOgorCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkIChBY3EgaXMgSFcgZGlnaXRhbClcbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUQVJUX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0VYVF9BTkFMT0cpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQgKEFjcSBpcyBIVyBhbmFsb2cpXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRk9MTE9XOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUQVJUX1RSSUdfVFlQRTsKKwkJZ290byBFUlJPUjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX1RJTUVSOgorCQlpZiAoKGNvbnZfdGlja3MgPCBNRTQ2MDBfQUlfTUlOX0NIQU5fVElDS1MpCisJCSAgICB8fCAoY29udl90aWNrcyA+IE1FNDYwMF9BSV9NQVhfQ0hBTl9USUNLUykpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfQVJHOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMOgorCQlpZiAoKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfRk9MTE9XKQorCQkgICAgfHwgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9CisJCQlNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpKSB7CisJCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9BTkFMT0c6CisJCWlmICgodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9GT0xMT1cpCisJCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgIT0KKwkJCU1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisKKwkJYnJlYWs7CisJfQorLyoqCisqIEFjZXB0YWJsZSBzZXR0aW5nczoKKyogaVNjYW5TdG9wVHJpZ1R5cGUJCToJaUFjcVN0b3BUcmlnVHlwZQorKgorKiBNRV9UUklHX1RZUEVfTk9ORQkJOglNRV9UUklHX1RZUEVfTk9ORQktPiBpbmZpbml0ZSBjb3VudCB3aXRoIG1hbnVhbCBzdG9wCisqIE1FX1RSSUdfVFlQRV9OT05FCQk6CU1FX1RSSUdfVFlQRV9DT1VOVAktPiBzdG9wIGFmdGVyIGdldHRpbmcgaVNjYW5TdG9wQ291bnQgbGlzdCBvZiB2YWx1ZXMgKGlTY2FuU3RvcENvdW50ICogY291bnQpCisqIE1FX1RSSUdfVFlQRV9DT1VOVAk6CU1FX1RSSUdfVFlQRV9GT0xMT1cJLT4gc3RvcCBhZnRlciBnZXR0aW5nIGlBY3FTdG9wQ291bnQgdmFsdWVzIChpdCBjYW4gc3RvcHMgaW4gbWlkbGUgb2YgdGhlIGxpc3QpCisqLworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfQ09VTlQ6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCA8PSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfQVJHOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfTk9ORToKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9OT05FKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRk9MTE9XOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfQ09VTlQ6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50IDw9IDApIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCBhY3F1aXNpdGlvbiBvciBzY2FuIHN0b3AgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJZ290byBFUlJPUjsKKwkJYnJlYWs7CisJfQorCisJaWYgKChjb3VudCA8PSAwKSB8fCAoY291bnQgPiBNRTQ2MDBfQUlfTElTVF9DT1VOVCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbGlzdCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05GSUdfTElTVF9DT1VOVDsKKwkJZ290byBFUlJPUjsKKwl9CisvLy9UaGlzIGlzIGdlbmVyYWwgbGltaXRhdGlvbgorLy8gICAgICBpZiAoZmlmb19pcnFfdGhyZXNob2xkIDwgMCB8fCBmaWZvX2lycV90aHJlc2hvbGQgPj0gTUU0NjAwX0FJX0NJUkNfQlVGX0NPVU5UKQorLy8vVGhpcyBpcyBsaW1pdGF0aW9uIGZyb20gV2luZG93cy4gSSB1c2UgaXQgZm9yIGNvbXBhdGliaWxpdHkuCisJaWYgKGZpZm9faXJxX3RocmVzaG9sZCA8IDAKKwkgICAgfHwgZmlmb19pcnFfdGhyZXNob2xkID49IE1FNDYwMF9BSV9GSUZPX0NPVU5UKSB7CisJCVBFUlJPUigiSW52YWxpZCBmaWZvIGlycSB0aHJlc2hvbGQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRklGT19JUlFfVEhSRVNIT0xEOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmICgoY29uZmlnX2xpc3RbMF0uaVJlZiA9PSBNRV9SRUZfQUlfRElGRkVSRU5USUFMKQorCSAgICAmJiAoaW5zdGFuY2UtPmNoYW5uZWxzID09IDE2KSkgeworCQlQRVJST1IKKwkJICAgICgiRGlmZmVyZW50aWFsIHJlZmVyZW5jZSBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc3ViZGV2aWNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfU0FNUExFX0FORF9IT0xEKSB7CisJCWlmICghaW5zdGFuY2UtPnNoKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlNhbXBsZSBhbmQgaG9sZCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGJvYXJkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlpZiAoY29uZmlnX2xpc3RbMF0uaVJlZiA9PSBNRV9SRUZfQUlfRElGRkVSRU5USUFMKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlNhbXBsZSBhbmQgaG9sZCBpcyBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQkJZ290byBFUlJPUjsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmICgoY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZyA8IDApCisJCSAgICB8fCAoY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZyA+PSBpbnN0YW5jZS0+cmFuZ2VzX2xlbikpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBzdHJlYW0gY29uZmlnIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TVFJFQU1fQ09ORklHOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWlmICgoY29uZmlnX2xpc3RbaV0uaVJlZiAhPSBNRV9SRUZfQUlfR1JPVU5EKQorCQkgICAgJiYgKGNvbmZpZ19saXN0W2ldLmlSZWYgIT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2VzIGluIHRoZSBsaXN0LiBSZWY9MHgleFxuIiwKKwkJCSAgICAgICBjb25maWdfbGlzdFtpXS5pUmVmKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWlmIChjb25maWdfbGlzdFtpXS5pU3RyZWFtQ29uZmlnICUgMikgewkvLyBTdHJlYW1Db25maWc6IDEgb3IgMworCQkJaWYgKGNvbmZpZ19saXN0W2ldLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIk9ubHkgYmlwb2xhciBtb2RlcyBzdXBwb3J0IGRpZmZlcmVudGlhbCBtZWFzdXJlbWVudC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0KKworCQlpZiAoY29uZmlnX2xpc3RbaV0uaVJlZiAhPSBjb25maWdfbGlzdFswXS5pUmVmKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIk5vdCBhbGwgcmVmZXJlbmNlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBsaXN0IGFyZSBlcXVhbC4gUmVmWzBdPTB4JXggUmVmWyVkXT0weCV4XG4iLAorCQkJICAgICBjb25maWdfbGlzdFswXS5pUmVmLCBpLCBjb25maWdfbGlzdFtpXS5pUmVmKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWlmICgoY29uZmlnX2xpc3RbaV0uaVJlZiA9PSBNRV9SRUZfQUlfRElGRkVSRU5USUFMKQorCQkgICAgJiYgKGNvbmZpZ19saXN0W2ldLmlDaGFubmVsID49IDE2KSkgeworCQkJUEVSUk9SKCJDaGFubmVsIG5vdCBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlDaGFubmVsIDwgMCkKKwkJICAgIHx8IChjb25maWdfbGlzdFtpXS5pQ2hhbm5lbCA+PSBpbnN0YW5jZS0+Y2hhbm5lbHMpKSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQlnb3RvIEVSUk9SOworCQl9CisJfQorCisJLy8gQ2hlY2sgc2V0dGluZ3MgLSBlbmQKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay5cbiIpOworCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFzayk7CisKKwkvLyBXb3JrIGFyb3VuZCBmcm9tIEtlaXRoIEhhcnRsZXkgLSBiZWdpbgorCWlmICh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1RJTUVSKSB7CisJCWlmIChjb3VudCA9PSAxKSB7CisJCQkvLyBUaGUgaGFyZHdhcmUgZG9lcyBub3Qgd29yayBwcm9wZXJseSB3aXRoIGEgbm9uLXplcm8gc2NhbiB0aW1lCisJCQkvLyBpZiB0aGVyZSBpcyBvbmx5IE9ORSBjaGFubmVsIGluIHRoZSBjaGFubmVsIGxpc3QuIEluIHRoaXMgY2FzZQorCQkJLy8gd2UgbXVzdCBzZXQgdGhlIHNjYW4gdGltZSB0byB6ZXJvIGFuZCB1c2UgdGhlIGNoYW5uZWwgdGltZS4KKworCQkJY29udl90aWNrcyA9IHNjYW5fdGlja3M7CisJCQl0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgPSBNRV9UUklHX1RZUEVfRk9MTE9XOworCQl9IGVsc2UgaWYgKHNjYW5fdGlja3MgPT0gY291bnQgKiBjb252X3RpY2tzKSB7CisJCQkvLyBBbm90aGVyIGhhcmR3YXJlIHByb2JsZW0uIElmIHRoZSBudW1iZXIgb2Ygc2NhbiB0aWNrcyBpcworCQkJLy8gZXhhY3RseSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNoYW5uZWwgdGlja3MgbXVsdGlwbGllZCBieQorCQkJLy8gdGhlIG51bWJlciBvZiBjaGFubmVscyB0aGVuIHRoZSBzYW1wbGluZyByYXRlIGlzIHJlZHVjZWQKKwkJCS8vIGJ5IGhhbGYuCisJCQl0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgPSBNRV9UUklHX1RZUEVfRk9MTE9XOworCQl9CisJfQorCS8vIFdvcmsgYXJvdW5kIGZyb20gS2VpdGggSGFydGxleSAtIGVuZAorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGJ1c3kuXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKworCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfbm9uZTsKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkvLyBTdG9wIGFsbCBhY3Rpb25zLiBCbG9jayBhbGwgaW50ZXJydXB0cy4gQ2xlYXIgKGRpc2FibGUpIEZJRk9zLgorCWN0cmwgPQorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCB8CisJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkvLyBQcmVzZXJ2ZSBFWFQgSVJRIGFuZCBPRkZTRVQgc2V0dGluZ3MuIENsZWFuIG90aGVyIGJpdHMuCisJdG1wICY9CisJICAgIChNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVCB8CisJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRlVMTFNDQUxFIHwgTUU0NjAwX0FJX0NUUkxfQklUX09GRlNFVCk7CisKKwkvLyBTZW5kIGl0IHRvIHJlZ2lzdGVyLgorCW91dGwodG1wIHwgY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wIHwgY3RybCk7CisKKwkvLyBFbmFibGUgY2hhbm5lbCBmaWZvIC0+IGRhdGEgZmlmbyBpbiBzdHJlYW1fc3RhcnQoKS4KKwljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk87CisJb3V0bCh0bXAgfCBjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXAgfCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJLy8gV3JpdGUgdGhlIGNoYW5uZWwgbGlzdAorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWVudHJ5ID0gY29uZmlnX2xpc3RbaV0uaUNoYW5uZWw7CisKKwkJc3dpdGNoIChjb25maWdfbGlzdFtpXS5pU3RyZWFtQ29uZmlnKSB7CisJCWNhc2UgMDoJLy9CSVBPTEFSIDEwVgorLyoKKwkJCQkvLyBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwID0gMHgwMDAwCisJCQkJLy8gJ2VudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAnIDw9PSBEbyBub3RoaW5nLiBSZW1vdmVkLgorCQkJCWVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTA7CisqLworCQkJYnJlYWs7CisJCWNhc2UgMToJLy9VTklQT0xBUiAxMFYKKwkJCWVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwOworCQkJYnJlYWs7CisJCWNhc2UgMjoJLy9CSVBPTEFSIDIuNVYKKwkJCWVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMl81OworCQkJYnJlYWs7CisJCWNhc2UgMzoJLy9VTklQT0xBUiAyLjVWCisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8yXzU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUl9DUklUSUNBTCgiVU5DSEVDSyBFUlJPUiBpbiBjb25maWdfbGlzdCFcbiIpOworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJXUk9ORyByYW5nZVxuUG9zaXRpb246JWQgUmFuZ2U6MHglMDRYXG4iLCBpLAorCQkJICAgICBjb25maWdfbGlzdFtpXS5pU3RyZWFtQ29uZmlnKTsKKwkJCWdvdG8gVkVSSUZZX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKGNvbmZpZ19saXN0W2ldLmlSZWYpIHsKKwkJY2FzZSBNRV9SRUZfQUlfR1JPVU5EOgkvL1NJTkdMRSBFTkRFRAorLyoKKwkJCQkvLyBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgPSAweDAwMDAKKwkJCQkvLyAnZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEJyA9PT4gRG8gbm90aGluZy4gUmVtb3ZlZC4KKwkJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQ7CisqLyBicmVhazsKKwkJY2FzZSBNRV9SRUZfQUlfRElGRkVSRU5USUFMOgkvL0RJRkZFUkVOVElBTAorCQkJZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgRVJST1IgaW4gY29uZmlnX2xpc3QhXG4iKTsKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiV1JPTkcgcmVmZXJlbmNlXG5Qb3NpdGlvbjolZCBSZWZlcmVuY2U6MHglMDRYXG4iLAorCQkJICAgICBpLCBjb25maWdfbGlzdFtpXS5pUmVmKTsKKwkJCWdvdG8gVkVSSUZZX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKworCQkvL0FkZCBsYXN0IGVudHJ5IGZsYWcKKwkJaWYgKGkgPT0gKGNvdW50IC0gMSkpIHsKKwkJCWVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0xBU1RfRU5UUlk7CisJCX0KKworCQlvdXRsKGVudHJ5LCBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyk7CisJCVBERUJVR19SRUcoImNoYW5uZWxfbGlzdF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jaGFubmVsX2xpc3RfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgZW50cnkpOworCX0KKworCS8vIFNldCB0cmlnZ2VyaW5nIHJlZ2lzdGVycworCS0tYWNxX3RpY2tzOworCW91dGwoYWNxX3RpY2tzLCBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFuX3ByZV90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFuX3ByZV90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGFjcV90aWNrcyk7CisJb3V0bChhY3FfdGlja3MsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxsWFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgYWNxX3RpY2tzICYgMHhGRkZGRkZGRik7CisJb3V0bCgoYWNxX3RpY2tzID4+IDMyKSwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbFhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICAoYWNxX3RpY2tzID4+IDMyKSAmIDB4RkZGRkZGRkYpOworCisJLy8gU2V0IHRyaWdnZXJzCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSkgeworCQkvLyBJbnRlcm5hbAorCWNhc2UgTUVfVFJJR19UWVBFX1NXOgorCQkvLyBOb3RoaW5nIHRvIHNldC4KKwkJYnJlYWs7CisKKwkJLy8gRXh0ZXJuYWwKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0FOQUxPRzsKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRzsKKworCQkvLyBFeHRlcm5hbCB0cmlnZ2VyIG5lZWRzIGVkZ2UncyBkZWZpbml0aW9uCisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQkJLy8gTm90aGluZyB0byBzZXQuCisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9UUklHX0VER0VfQU5ZOgorCQkJY3RybCB8PQorCQkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0ZBTExJTkcgfAorCQkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0JPVEg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJVTkNIRUNLIFRSSUdHRVIgRURHRSBpbiB0cmlnZ2VycyBzdHJ1Y3R1cmUhXG4iKTsKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiV1JPTkcgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlcjoweCUwNFguXG4iLAorCQkJICAgICB0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSk7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SX0NSSVRJQ0FMKCJVTkNIRUNLIFRSSUdHRVIgaW4gdHJpZ2dlcnMgc3RydWN0dXJlIVxuIik7CisJCVBFUlJPUl9DUklUSUNBTCgiV1JPTkcgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlcjoweCUwNFguXG4iLAorCQkJCXRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9USU1FUjoKKwkJLS1zY2FuX3RpY2tzOworCQlvdXRsKHNjYW5fdGlja3MsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcpOworCQlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHNjYW5fdGlja3MgJiAweEZGRkZGRkZGKTsKKwkJb3V0bCgoc2Nhbl90aWNrcyA+PiAzMiksIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbFhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIChzY2FuX3RpY2tzID4+IDMyKSAmIDB4RkZGRkZGRkYpOworCisJCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMDsKKwkJfSBlbHNlIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMOgorCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9BTkFMT0c6CisJCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIDApOworCQlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAwKTsKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8yOworCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0ZPTExPVzoKKwkJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgMCk7CisJCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcpOworCQlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIDApOworCisJCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMDsKKwkJfSBlbHNlIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiVU5DSEVDSyBUUklHR0VSIGluIHRyaWdnZXJzIHN0cnVjdHVyZSFcbiIpOworCQlQRVJST1JfQ1JJVElDQUwoIldST05HIHNjYW4gc3RhcnQgdHJpZ2dlcjoweCUwNFguXG4iLAorCQkJCXRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSk7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gVkVSSUZZX0VSUk9SOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCS0tY29udl90aWNrczsKKwkJb3V0bChjb252X3RpY2tzLCBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcpOworCQlQREVCVUdfUkVHKCJjaGFuX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbFhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBjb252X3RpY2tzKTsKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlvdXRsKDAsIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyk7CisJCVBERUJVR19SRUcoImNoYW5fdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzAgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8xOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiVU5DSEVDSyBUUklHR0VSIGluIHRyaWdnZXJzIHN0cnVjdHVyZSFcbiIpOworCQlQRVJST1JfQ1JJVElDQUwoIldST05HIGNvbnYgc3RhcnQgdHJpZ2dlcjoweCUwNFguXG4iLAorCQkJCXRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSk7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gVkVSSUZZX0VSUk9SOworCisJCWJyZWFrOworCX0KKworCS8vU2FtcGxlICYgSG9sZCBmZWF0dXJlCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19TQU1QTEVfQU5EX0hPTEQpIHsKKwkJaWYgKGluc3RhbmNlLT5zaCkgeworCQkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0FNUExFX0hPTEQ7CisJCX0gZWxzZSB7CisJCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgUyZIIGZlYXR1cmUhXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJfQorCX0KKwkvL0VuYWJsZSBJUlFzIHNvdXJjZXMgYnV0IGxlYXZlIGxhdGNoZXMgYmxvY2tlZC4KKwljdHJsIHw9IChNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9MRV9JUlEpOwkvL1RoZSBsYXN0IElSUSBzb3VyY2UgKE1FNDYwMF9BSV9DVFJMX0JJVF9MRV9JUlEpIGlzIHVudXNlZCEKKworCS8vRXZlcnl0aGluZyBpcyBnb29kLiBGaW5hbGl6ZQorCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJLy9QcmVzZXJ2ZSBFWFQgSVJRIGFuZCBPRkZTRVQgc2V0dGluZ3MuIENsZWFuIG90aGVyIGJpdHMuCisJdG1wICY9CisJICAgIChNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVCB8CisJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRlVMTFNDQUxFIHwgTUU0NjAwX0FJX0NUUkxfQklUX09GRlNFVCk7CisKKwkvLyB3cml0ZSB0aGUgY29udHJvbCB3b3JkCisJb3V0bChjdHJsIHwgdG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsIHwgdG1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJLy9TZXQgdGhlIGdsb2JhbCBwYXJhbWV0ZXJzIGVuZCBleGl0LgorCWluc3RhbmNlLT5jaGFuX2xpc3RfbGVuID0gY291bnQ7CisJaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA9IGZpZm9faXJxX3RocmVzaG9sZDsKKworCWlmICh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9DT1VOVCkgeworCQlkYXRhX3JlcXVpcmVkID0KKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdHJpZ2dlci0+aUFjcVN0b3BDb3VudCAqCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWNvdW50OworCQlpZiAoZGF0YV9yZXF1aXJlZCA+IFVJTlRfTUFYKQorCQkJZGF0YV9yZXF1aXJlZCA9IFVJTlRfTUFYOworCQlpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA9ICh1bnNpZ25lZCBpbnQpZGF0YV9yZXF1aXJlZDsKKwl9IGVsc2UgaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9DT1VOVCkKKwkJaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgPQorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0cmlnZ2VyLT5pU2NhblN0b3BDb3VudDsKKwllbHNlCisJCWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkID0gMDsKKworCS8vIE1hcmsgc3ViZGV2aWNlIGFzIGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzdHJlYW0gbW9kZS4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOworCisJLy8gRGVpbml0IHNpbmdsZSBjb25maWcuIFNldCBhbGwgZW50cmllcyB0byBOT1RfQ09ORklHVVJFRC4KKwlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPmNoYW5uZWxzOyBpKyspIHsKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uc3RhdHVzID0KKwkJICAgIE1FX1NJTkdMRV9DSEFOTkVMX05PVF9DT05GSUdVUkVEOworCX0KKworICAgICAgVkVSSUZZX0VSUk9SOgkJLy8gRXJyb3IgaW4gY29kZS4gV3Jvbmcgc2V0dGluZyBjaGVjay4gVGhpcyBzaG91bGQgbmV2ZXIgZXZlciBoYXBwZW5kIQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKyAgICAgIEVSUk9SOgkJCS8vIEVycm9yIGluIHNldHRpbmdzLgorCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX25ld192YWx1ZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyB0OworCXVuc2lnbmVkIGxvbmcgajsKKwlpbnQgdm9sYXRpbGUgaGVhZDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmICh0ID09IDApCisJCQl0ID0gMTsKKwl9IGVsc2UgewkJLy8gTWF4IHRpbWUuCisJCXQgPSBMT05HX01BWDsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaiA9IGppZmZpZXM7CisKKwl3aGlsZSAoMSkgeworCQkvLyBPbmx5IHJ1bmluZyBkZXZpY2UgY2FuIGdlbmVyYXRlIGJyZWFrLgorCQloZWFkID0gaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQ7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgoaGVhZCAhPQorCQkJCQkJICAgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpCisJCQkJCQkgIHx8CisJCQkJCQkgICgoaW5zdGFuY2UtPnN0YXR1cyA8PQorCQkJCQkJICAgIGFpX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpCisJCQkJCQkgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyA+PQorCQkJCQkJICAgICAgIGFpX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpKSksCisJCQkJCQkgdCk7CisKKwkJaWYgKGhlYWQgIT0gaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpIHsJLy8gTmV3IGRhdGEgaW4gYnVmZmVyLgorCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2VuZCkgewkvLyBFbmQgb2Ygd29yay4KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yKSB7CisJCQllcnIgPSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yKSB7CisJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKChqaWZmaWVzIC0gaikgPj0gdCkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyB0aW1lZCBvdXQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJYnJlYWs7CisJCX0KKwkJLy8gQ29ycmVjdCB0aW1lb3V0LgorCQl0IC09IGppZmZpZXMgLSBqOworCX0KKworCSpjb3VudCA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpbmxpbmUgbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkX2dldF92YWx1ZShtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKgorCQkJCQkJICAgICBpbnN0YW5jZSwgaW50ICp2YWx1ZXMsCisJCQkJCQkgICAgIGNvbnN0IGludCBjb3VudCwKKwkJCQkJCSAgICAgY29uc3QgaW50IGZsYWdzKQoreworCWludCBuOworCWludCBpOworCXVpbnQzMl90IHZhbHVlOworCisJLy8vQ2hlY2tpbmcgaG93IG1hbnkgZGF0YXMgY2FuIGJlIGNvcGllZC4KKwluID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCWlmIChuIDw9IDApCisJCXJldHVybiAwOworCisJaWYgKG4gPiBjb3VudCkKKwkJbiA9IGNvdW50OworCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCWlmIChuIDwgaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4pCS8vTm90IGVub3VnaCBkYXRhIQorCQkJcmV0dXJuIDA7CisJCW4gLT0gbiAlIGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCk7CisJCWlmIChwdXRfdXNlcih2YWx1ZSwgdmFsdWVzICsgaSkpIHsKKwkJCVBFUlJPUigiQ2Fubm90IGNvcHkgbmV3IHZhbHVlcyB0byB1c2VyLlxuIik7CisJCQlyZXR1cm4gLU1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKys7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHJlYWRfbW9kZSwKKwkJCQkgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWludCByZXQ7CisKKwlpbnQgYyA9ICpjb3VudDsKKwlpbnQgbWluID0gYzsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TVFJFQU1fUkVBRF9GUkFNRVMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghdmFsdWVzIHx8ICFjb3VudCkgeworCQlQRVJST1IoIlJlcXVlc3QgaGFzIGludmFsaWQgcG9pbnRlci5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9QT0lOVEVSOworCX0KKworCWlmIChjIDwgMCkgeworCQlQRVJST1IoIlJlcXVlc3QgaGFzIGludmFsaWQgdmFsdWUncyBjb3VudGVyLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1ZBTFVFX0NPVU5UOworCX0KKworCWlmICgocmVhZF9tb2RlICE9IE1FX1JFQURfTU9ERV9CTE9DS0lORykKKwkgICAgJiYgKHJlYWRfbW9kZSAhPSBNRV9SRUFEX01PREVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCByZWFkIG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFQURfTU9ERTsKKwl9CisKKwlpZiAoYyA9PSAwKSB7CQkvL1lvdSBnZXQgd2hhdCB5b3Ugd2FudCEgTm90aGluZyBtb3JlIG9yIGxlc3MuCisJCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworCX0KKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9DaGVjayBpZiBzdWJkZXZpY2UgaXMgY29uZmlndXJlZC4KKwlpZiAoaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4gPD0gMCkgeworCQlQRVJST1IoIlN1YmRldmljZSB3YXNuJ3QgY29uZmlndXJlZC5cbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fUkVBRF9GUkFNRVMpIHsKKwkJaWYgKGMgPCBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbikgewkvL05vdCBlbm91Z2ggZGF0YSByZXF1ZXN0ZWQuCisJCQlQRVJST1IKKwkJCSAgICAoIldoZW4gdXNpbmcgRlJBTUVfUkVBRCBtb2RlIG1pbmltYWwgc2l6ZSBpcyBkZWZpbmVkIGJ5IGNoYW5uZWwgbGlzdC5cbiIpOworCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwkJfQorCX0KKworCWlmIChjID4gKE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVCAtIGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuKSkgewkvLyBUbyByZXR1cm4gYWNjZXB0YWJsZSBhbW91bnQgb2YgZGF0YSB3aGVuIHVzZXIgcGFzcyB0b28gYmlnIHZhbHVlLgorCQltaW4gPSBNRTQ2MDBfQUlfQ0lSQ19CVUZfQ09VTlQgLSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbjsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fUkVBRF9GUkFNRVMpIHsKKwkJLy9XYWl0IGZvciB3aG9sZSBsaXN0LgorCQlpZiAocmVhZF9tb2RlID09IE1FX1JFQURfTU9ERV9CTE9DS0lORykgeworCQkJbWluID0gYyAtIChjICUgaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4pOworCQl9CisKKwkJaWYgKHJlYWRfbW9kZSA9PSBNRV9SRUFEX01PREVfTk9OQkxPQ0tJTkcpIHsKKwkJCW1pbiA9IGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuOworCQl9CisJfQorCisJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSkgewkvL1dvcmtpbmcKKwkJLy9JZiBibG9ja2luZyBtb2RlIC0+IHdhaXQgZm9yIGRhdGEuCisJCWlmICgobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpIDwgbWluKQorCQkgICAgJiYgKHJlYWRfbW9kZSA9PSBNRV9SRUFEX01PREVfQkxPQ0tJTkcpKSB7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKChtZV9jaXJjX2J1Zl92YWx1ZXMKKwkJCQkJCSAgICgmaW5zdGFuY2UtPmNpcmNfYnVmKSA+PSBtaW4pCisJCQkJCQkgIHx8ICEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKQorCQkJCQkJICAgICAgICYKKwkJCQkJCSAgICAgICBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pKSk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIldhaXQgb24gdmFsdWVzIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkX2dldF92YWx1ZShpbnN0YW5jZSwgdmFsdWVzLCBjLCBmbGFncyk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyID0gLXJldDsKKwkJKmNvdW50ID0gMDsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCSpjb3VudCA9IDA7CisJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1c7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfbm9uZSkgeworCQkJUERFQlVHKCJTdHJlYW0gY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJfSBlbHNlIHsKKwkJKmNvdW50ID0gcmV0OworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworLyoqIEBicmllZiBTdG9wIGFxdXNhdGlvbi4gUHJlc2VydmUgRklGT3MuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyovCisKK3N0YXRpYyBpbnQgYWlfc3RvcF9pbW1lZGlhdGVseShtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdm9sYXRpbGUgdWludDMyX3QgY3RybDsKKwljb25zdCBpbnQgdGltZW91dCA9IEhaIC8gMTA7CS8vMTAwbXMKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gdGltZW91dDsgaSsrKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9TVE9QOworCQljdHJsIHw9CisJCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwKKwkJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUIHwKKwkJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUKTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSkgewkvLyBFeGl0LgorCQkJYnJlYWs7CisJCX0KKworCQlQSU5GTygiV2FpdCBmb3Igc3RvcDogJWRcbiIsIGkgKyAxKTsKKwkJLy9TdGlsbCB3b3JraW5nIQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChpID4gdGltZW91dCkgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcgcmVmOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJdm9sYXRpbGUgdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWRlbGF5ID0gMTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIKKwkgICAgc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICgodG1wICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSkgeworCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbiA9PSAwKSB7CS8vTm90IGNvbmZpZ3VyZWQhCisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc3RyZWFtIG1vZGUhXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmICghKHRtcCAmIChNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8wIHwgTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzIpKSkgewkvL01vZGUgMCA9IHNpbmdsZSB3b3JrID0+IG5vIHN0cmVhbSBjb25maWcKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgY29uZmlndXJlZCB0byB3b3JrIGluIHNpbmdsZSBtb2RlLlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJZ290byBFUlJPUjsKKwl9CisJLy9SZXNldCBzdG9wIGJpdHMuCisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TVE9QOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJLy9TdGFydCBkYXRhcycgRklGTy4KKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwkvL0ZyZWUgc3RvcCBiaXRzLgorCXRtcCAmPSB+KE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TVE9QKTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJLy9DYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLlxuIik7CisJaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrKTsKKworCS8vU2V0IHRoZSBzdGFydGluZyB2YWx1ZXMuCisJaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCA9IDA7CisJaW5zdGFuY2UtPklTTS5yZWFkID0gMDsKKwkvL0NsZWFyIGNpcmN1bGFyIGJ1ZmZlcgorCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkvL1NldCBldmVyeXRoaW5nLgorCWFpX2RhdGFfYWNxdWlzaXRpb25fbG9naWMoaW5zdGFuY2UpOworCisJLy9TZXQgc3RhdHVzIHRvICd3YWl0IGZvciBzdGFydCcKKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDsKKworCS8vIFNldCBjb250cm9sIHRhc2sncyB0aW1lb3V0CisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSBkZWxheTsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKworCS8vTGV0cyBnbyEgU3RhcnQgd29yaworCWlubChpbnN0YW5jZS0+c3RhcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGFydF9yZWcgaW5sKDB4JWxYKzB4JWxYKVxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlKTsKKworCS8vIFNjaGVkdWxlIGNvbnRyb2wgdGFzaworCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDE7CisJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJICAgJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2ssIDEpOworCisJUERFVkVMT1AoIkRlbGF5OiVsZFxuIiwgZGVsYXkpOworCisJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgewkvL1dhaXQgZm9yIHN0YXJ0LgorCQlyZWYgPSBqaWZmaWVzOworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0KSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgKworCQkJCQkJIDEgOiBMT05HX01BWCk7CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zdHJlYW1fcnVuKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYWlfc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQREVCVUcoIlN0YXJ0aW5nIHN0cmVhbSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSByZWYpID4gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc3RyZWFtX3J1bikgeworCQkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJfSBlbHNlIGlmICgoamlmZmllcyAtIHJlZikgPiBkZWxheSArIDEpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIFNpZ25hbCBjb21lIGJ1dCBzdGF0dXMgaXMgc3RyYW5nZTogJWRcbiIsCisJCQkJCSAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJCX0KKworCQkJCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFzayk7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfQorCX0KKyNpZmRlZiBNRURFQlVHX0lORk8KKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJUElORk8oIlNUQVRVU19CSVRfRlNNPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSA/ICJvbiIgOiAib2ZmIik7CisJUElORk8oIkNUUkxfQklUX0hGX0lSUT0lcy5cbiIsCisJICAgICAgKHRtcCAmIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlEpID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCVBJTkZPKCJDVFJMX0JJVF9IRl9JUlFfUkVTRVQ9JXMuXG4iLAorCSAgICAgICh0bXAgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUKSA/ICJyZXNldCIgOiAid29yayIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19JUlE9JXMuXG4iLAorCSAgICAgICh0bXAgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRKSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfUkVMT0FEPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRCkgPyAib24iIDogIm9mZiIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19JUlFfUkVTRVQ9JXMuXG4iLAorCSAgICAgICh0bXAgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUKSA/ICJyZXNldCIgOiAid29yayIpOworI2VuZGlmCisKKyAgICAgIEVSUk9SOgorCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXR1cyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHdhaXQsCisJCQkJICAgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgeworCWNhc2UgYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9lbmQ6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZXJyb3I6CisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfSURMRTsKKwkJYnJlYWs7CisKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX3J1bjoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfQlVTWTsKKwkJYnJlYWs7CisKKwljYXNlIGFpX3N0YXR1c19ub25lOgorCWRlZmF1bHQ6CisJCSpzdGF0dXMgPQorCQkgICAgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pID8KKwkJICAgIE1FX1NUQVRVU19CVVNZIDogTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCX0KKworCWlmICgod2FpdCA9PSBNRV9XQUlUX0lETEUpICYmICgqc3RhdHVzID09IE1FX1NUQVRVU19CVVNZKSkgeworCQkvLyBPbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICBhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYWlfc3RhdHVzX3N0cmVhbV9ydW4pCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIldhaXQgZm9yIElETEUgY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgZm9yIElETEUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfbm9uZTsKKwkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfSURMRTsKKwl9CisKKwkqdmFsdWVzID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCVBERUJVRygibWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpPSVkLlxuIiwgKnZhbHVlcyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncykKK3sKKy8qKgorIEBub3RlIFN0b3AgaXMgaW1wbGVtZW50ZWQgb25seSBpbiBibG9ja2luZyBtb2RlLgorIEBub3RlIEZ1bmN0aW9uIHJldHVybiB3aGVuIHN0YXRlIG1hY2hpbmUgaXMgc3RvcGVkLgorKi8KKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQzMl90IGN0cmw7CisJaW50IHJldDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkKKwkgICAgJiYgKHN0b3BfbW9kZSAhPSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRSkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0b3AgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RPUF9NT0RFOworCX0KKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvLyBNYXJrIGFzIHN0b3BwaW5nLiA9PiBTb2Z0d2FyZSBzdG9wLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCisJaWYgKHN0b3BfbW9kZSA9PSBNRV9TVE9QX01PREVfSU1NRURJQVRFKSB7CisJCXJldCA9IGFpX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCisJCWlmIChyZXQpIHsKKwkJCVBFUlJPUigiRlNNIGlzIHN0aWxsIGJ1c3kuXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQl9CisJCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwl9IGVsc2UgaWYgKHN0b3BfbW9kZSA9PSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRSkgeworCQkvLyBTZXQgc3RvcCBiaXQgaW4gcmVnaXN0cnkuCisJCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX1NUT1A7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisKKwkJLy8gT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSwKKwkJCQkJCSBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYWlfc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCVBERUJVRygiU3RvcHBpbmcgc3RyZWFtIGNhbmNlbGVkLlxuIik7CisJCQlyZXQgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiU3RvcHBpbmcgc3RyZWFtIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisJCQlyZXQgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKwkJLy8gRW5kIG9mIHdvcmsuCisJCWFpX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCisJfQorCisJcmV0ID0gYWlfcmVhZF9kYXRhX3Bvb2xpbmcoaW5zdGFuY2UpOworCWlmIChyZXQgPiAwKSB7CQkvLyBFdmVyeXRoaW5nIGZpbmUuIE1vcmUgZGF0YXMgcHV0IHRvIHNvZnR3YXJlIGJ1ZmZlci4KKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQlyZXQgPSBNRV9FUlJOT19TVUNDRVNTOworCQkvLyBTaWduYWwgdGhhdCB3ZSBwdXQgbGFzdCBkYXRhIHRvIHNvZnR3YXJlIGJ1ZmZlci4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsJLy8gRXZlcnl0aGluZyBmaW5lLiBObyBtb3JlIGRhdGFzIGluIEZJRk8uCisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2VuZDsKKwkJcmV0ID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9IGVsc2UgaWYgKHJldCA9PSAtTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1cpIHsJLy8gU3RvcCBpcyB1bnN1Y2Nlc3NmdWwsIGJ1ZmZlciBpcyBvdmVyZmxvdy4KKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQlyZXQgPSBNRV9FUlJOT19TVUNDRVNTOworCX0gZWxzZSB7CQkvLyBTdG9wIGlzIHVuc3VjY2Vzc2Z1bAorCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisJCXJldCA9IC1yZXQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgaTsKKwlpbnQgciA9IC0xOworCWludCBkaWZmID0gMjFFNjsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoKCptYXggLSAqbWluKSA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9NSU5fTUFYOworCX0KKworCWlmICgodW5pdCA9PSBNRV9VTklUX1ZPTFQpIHx8ICh1bml0ID09IE1FX1VOSVRfQU5ZKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPnJhbmdlc19sZW47IGkrKykgeworCQkJaWYgKChpbnN0YW5jZS0+cmFuZ2VzW2ldLm1pbiA8PSAqbWluKQorCQkJICAgICYmICgoaW5zdGFuY2UtPnJhbmdlc1tpXS5tYXggKyAxMDAwKSA+PSAqbWF4KSkgeworCQkJCWlmICgoaW5zdGFuY2UtPnJhbmdlc1tpXS5tYXggLQorCQkJCSAgICAgaW5zdGFuY2UtPnJhbmdlc1tpXS5taW4pIC0gKCptYXggLSAqbWluKSA8CisJCQkJICAgIGRpZmYpIHsKKwkJCQkJciA9IGk7CisJCQkJCWRpZmYgPQorCQkJCQkgICAgKGluc3RhbmNlLT5yYW5nZXNbaV0ubWF4IC0KKwkJCQkJICAgICBpbnN0YW5jZS0+cmFuZ2VzW2ldLm1pbikgLSAoKm1heCAtCisJCQkJCQkJCQkgKm1pbik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHIgPCAwKSB7CisJCQlQRVJST1IoIk5vIG1hdGNoaW5nIHJhbmdlIGZvdW5kLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTk9fUkFOR0U7CisJCX0gZWxzZSB7CisJCQkqbWluID0gaW5zdGFuY2UtPnJhbmdlc1tyXS5taW47CisJCQkqbWF4ID0gaW5zdGFuY2UtPnJhbmdlc1tyXS5tYXg7CisJCQkqbWF4ZGF0YSA9IE1FNDYwMF9BSV9NQVhfREFUQTsKKwkJCSpyYW5nZSA9IHI7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcGh5c2ljYWwgdW5pdCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVU5JVDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfbnVtYmVyX3JhbmdlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKCh1bml0ID09IE1FX1VOSVRfVk9MVCkgfHwgKHVuaXQgPT0gTUVfVU5JVF9BTlkpKSB7CisJCSpjb3VudCA9IGluc3RhbmNlLT5yYW5nZXNfbGVuOworCX0gZWxzZSB7CisJCSpjb3VudCA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2luZm8obWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICgocmFuZ2UgPCBpbnN0YW5jZS0+cmFuZ2VzX2xlbikgJiYgKHJhbmdlID49IDApKSB7CisJCSp1bml0ID0gTUVfVU5JVF9WT0xUOworCQkqbWluID0gaW5zdGFuY2UtPnJhbmdlc1tyYW5nZV0ubWluOworCQkqbWF4ID0gaW5zdGFuY2UtPnJhbmdlc1tyYW5nZV0ubWF4OworCQkqbWF4ZGF0YSA9IE1FNDYwMF9BSV9NQVhfREFUQTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcmFuZ2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SQU5HRTsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfdGltZXIobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIGludCB0aW1lciwKKwkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJc3dpdGNoICh0aW1lcikgeworCisJY2FzZSBNRV9USU1FUl9BQ1FfU1RBUlQ6CisJCSpiYXNlX2ZyZXF1ZW5jeSA9IE1FNDYwMF9BSV9CQVNFX0ZSRVFVRU5DWTsKKwkJKm1pbl90aWNrcyA9IE1FNDYwMF9BSV9NSU5fQUNRX1RJQ0tTOworCQkqbWF4X3RpY2tzID0gTUU0NjAwX0FJX01BWF9BQ1FfVElDS1M7CisJCWJyZWFrOworCisJY2FzZSBNRV9USU1FUl9TQ0FOX1NUQVJUOgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTQ2MDBfQUlfQkFTRV9GUkVRVUVOQ1k7CisJCSptaW5fdGlja3MgPSBNRTQ2MDBfQUlfTUlOX1NDQU5fVElDS1M7CisJCSptYXhfdGlja3MgPSBNRTQ2MDBfQUlfTUFYX1NDQU5fVElDS1M7CisJCWJyZWFrOworCisJY2FzZSBNRV9USU1FUl9DT05WX1NUQVJUOgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTQ2MDBfQUlfQkFTRV9GUkVRVUVOQ1k7CisJCSptaW5fdGlja3MgPSBNRTQ2MDBfQUlfTUlOX0NIQU5fVElDS1M7CisJCSptYXhfdGlja3MgPSBNRTQ2MDBfQUlfTUFYX0NIQU5fVElDS1M7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVyIHNwZWNpZmllZC4oMHglMDR4KVxuIiwgdGltZXIpOworCisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVSOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCSpudW1iZXIgPSBpbnN0YW5jZS0+Y2hhbm5lbHM7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJKnR5cGUgPSBNRV9UWVBFX0FJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TVFJFQU1JTkc7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwkqY2FwcyA9CisJICAgIE1FX0NBUFNfQUlfVFJJR19TWU5DSFJPTk9VUyB8IE1FX0NBUFNfQUlfRklGTyB8CisJICAgIE1FX0NBUFNfQUlfRklGT19USFJFU0hPTEQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgY2FwLCBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWlmIChjb3VudCAhPSAxKSB7CisJCVBFUlJPUigiSW52YWxpZCBjYXBhYmlsaXR5IGFyZ3VtZW50IGNvdW50LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NBUF9BUkdfQ09VTlQ7CisJfQorCisJc3dpdGNoIChjYXApIHsKKwljYXNlIE1FX0NBUF9BSV9GSUZPX1NJWkU6CisJCWFyZ3NbMF0gPSBNRTQ2MDBfQUlfRklGT19DT1VOVDsKKwkJYnJlYWs7CisKKwljYXNlIE1FX0NBUF9BSV9CVUZGRVJfU0laRToKKwkJYXJnc1swXSA9CisJCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZikgPyBNRTQ2MDBfQUlfQ0lSQ19CVUZfQ09VTlQgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBjYXBhYmlsaXR5LlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0FQOworCQlhcmdzWzBdID0gMDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGFpX2xpbWl0ZWRfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBjb25zdCB1aW50MzJfdCBpcnFfc3RhdHVzLAorCQkgICAgY29uc3QgdWludDMyX3QgY3RybF9zdGF0dXMpCit7CisJaW50IHRvX3JlYWQ7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsJLy9ObyB0aHJlc2hvbGQgcHJvdmlkZWQuIFNDIGVuZHMgd29yay4gSEYgbmVlZCByZXNldGluZy4KKwkJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpIHsKKwkJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIGluc3RhbmNlLT5JU00ubmV4dCkgIT0gaW5zdGFuY2UtPklTTS5uZXh0KSB7CS8vRVJST1IhCisJCQkJUEVSUk9SCisJCQkJICAgICgiTGltaXRlZCBhbW91bnRzIGFxdXNpdGlvbiB3aXRoIFRIPTA6IENpcmN1bGFyIGJ1ZmZlciBmdWxsIVxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJICAgIGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQkJfSBlbHNlIHsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQl9CisJCQkvL0VuZCBvZiB3b3JrLgorCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQl9IGVsc2UgaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKKwkJCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgKz0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKworCQkJaWYgKGFpX3JlYWRfZGF0YShpbnN0YW5jZSwgTUU0NjAwX0FJX0ZJRk9fSEFMRikgIT0gTUU0NjAwX0FJX0ZJRk9fSEFMRikgewkvL0VSUk9SIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb24gd2l0aCBUSCA9IDA6IENpcmN1bGFyIGJ1ZmZlciBmdWxsIVxuIik7CisJCQkJLy9FbmQgb2Ygd29yay4KKwkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJICAgIGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQkJfSBlbHNlIHsKKwkJCQkvL0NvbnRpbnVlLgorCQkJCWFpX2xpbWl0ZWRfSVNNKGluc3RhbmNlLCBpcnFfc3RhdHVzKTsKKwkJCX0KKwkJfQorCQkvL1NpZ25hbCB1c2VyLgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJfSBlbHNlCQkJLy9pZihpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKQorCXsKKwkJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpIHsKKwkJCWluc3RhbmNlLT5JU00ucmVhZCA9IDA7CisJCQlpZiAoKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPCBNRTQ2MDBfQUlfRklGT19IQUxGKQorCQkJICAgICYmICghKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkpKQorCQkJeworCQkJCXRvX3JlYWQgPQorCQkJCSAgICBNRTQ2MDBfQUlfRklGT19IQUxGIC0KKwkJCQkgICAgKE1FNDYwMF9BSV9GSUZPX0hBTEYgJQorCQkJCSAgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCk7CisJCQkJUERFQlVHCisJCQkJICAgICgiTGltaXRlZCBhbW91bnRzIGFxdXNpdGlvbiB3aXRoIFRIICE9IDA6IE5vdCBmYXN0IGVub3VnaCBkYXRhIGFxdXNpdGlvbiEgY29ycmVjdGlvbj0lZFxuIiwKKwkJCQkgICAgIHRvX3JlYWQpOworCQkJfSBlbHNlIHsKKwkJCQl0b19yZWFkID0gaW5zdGFuY2UtPklTTS5uZXh0OworCQkJfQorCQkJaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCArPSB0b19yZWFkOworCisJCQlhaV9yZXNjaGVkdWxlX1NDKGluc3RhbmNlKTsKKworCQkJaWYgKGFpX3JlYWRfZGF0YShpbnN0YW5jZSwgdG9fcmVhZCkgIT0gdG9fcmVhZCkgewkvL0VSUk9SIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb24gd2l0aCBUSCAhPSAwOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJCS8vRW5kIG9mIHdvcmsuCisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJLy9Db250aW51ZS4KKwkJCQlhaV9saW1pdGVkX0lTTShpbnN0YW5jZSwgaXJxX3N0YXR1cyk7CisJCQl9CisKKwkJCS8vU2lnbmFsIHVzZXIuCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJCX0gZWxzZSBpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRikgeworCQkJaW5zdGFuY2UtPklTTS5yZWFkICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQlpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisKKwkJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIE1FNDYwMF9BSV9GSUZPX0hBTEYpICE9IE1FNDYwMF9BSV9GSUZPX0hBTEYpIHsJLy9FUlJPUiEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uIHdpdGggVEggIT0gMDogQ2lyY3VsYXIgYnVmZmVyIGZ1bGwhXG4iKTsKKwkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I7CisJCQkJLy9TaWduYWwgdXNlci4KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+CisJCQkJCQkJICB3YWl0X3F1ZXVlKTsKKwkJCX0gZWxzZSB7CisJCQkJLy9Db3VudGludWUuCisJCQkJYWlfbGltaXRlZF9JU00oaW5zdGFuY2UsIGlycV9zdGF0dXMpOworCQkJfQorCQl9CisKKwkJaWYgKGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgPj0gaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpIHsJLy9FbmQgb2Ygd29yay4gTmV4dCBwYXJhbm9pZCBwaWNlIG9mIGNvZGU6ICc+PScgaW5zdGVhZCBvZCAnPT0nIG9ubHkgdG8gYmUgc3VyZS4KKwkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCWlmIChpbnN0YW5jZS0+c3RhdHVzIDwgYWlfc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQl9CisjaWZkZWYgTUVERUJVR19FUlJPUgorCQkJaWYgKGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgPiBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCkgewkvL1RoaXMgaXMgc2VjdXJpdHkgY2hlY2sgY2FzZS4gVGhpcyBzaG91bGQgbmV2ZXIgZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb246IFJlYWQgbW9yZSBkYXRhIHRoYW4gbmVjZXNzYXJ5ISBkYXRhX3JlcXVpcmVkPSVkIDwgcmVhZD0lZFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkLAorCQkJCSAgICAgaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCk7CisJCQkJLy9TaWduYWwgZXJyb3IgKHdhcm5pbmc/PykuCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KK30KKwordm9pZCBhaV9pbmZpbml0ZV9pc3IobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCSAgICAgY29uc3QgdWludDMyX3QgaXJxX3N0YXR1cywgY29uc3QgdWludDMyX3QgY3RybF9zdGF0dXMpCit7CisJaW50IHRvX3JlYWQ7CisKKwlpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykgewkvL25leHQgY2h1bmNrIG9mIGRhdGEgLT4gcmVhZCBmaWZvCisJCS8vU2V0IG5ldyBzdGF0ZSBpbiBJU00uCisJCWlmICgoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA8IE1FNDYwMF9BSV9GSUZPX0hBTEYpICYmICghKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkpKSB7CS8vVGhlcmUgaXMgbW9yZSBkYXRhIHRoYW4gd2UgZWNwZWN0ZWQuIFByb3BhYmx5IHdlIGFyZW4ndCBmYXN0IGVub3VnaC4gUmVhZCBhcyBtYW55IGFzIHBvc3NpYmxlLgorCQkJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsKKwkJCQl0b19yZWFkID0KKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRiAtCisJCQkJICAgIChNRTQ2MDBfQUlfRklGT19IQUxGICUKKwkJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpOworCQkJCWlmICh0b19yZWFkID4gaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkgeworCQkJCQlQREVCVUcKKwkJCQkJICAgICgiSW5maW5pdGUgYXF1c2l0aW9uOiBOb3QgZmFzdCBlbm91Z2ggZGF0YSBhcXVzaXRpb24hIFRIICE9IDA6IGNvcnJlY3Rpb249JWRcbiIsCisJCQkJCSAgICAgdG9fcmVhZCk7CisJCQkJfQorCQkJfSBlbHNlIHsJLy9ObyB0aHJlc2hvbGQgc3BlY2lmaWVkLgorCQkJCXRvX3JlYWQgPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJfQorCQl9IGVsc2UgeworCQkJdG9fcmVhZCA9IGluc3RhbmNlLT5JU00ubmV4dDsKKwkJfQorCisJCWluc3RhbmNlLT5JU00ucmVhZCArPSB0b19yZWFkOworCisJCS8vR2V0IGRhdGEKKwkJaWYgKGFpX3JlYWRfZGF0YShpbnN0YW5jZSwgdG9fcmVhZCkgIT0gdG9fcmVhZCkgewkvL0VSUk9SIQorCQkJUEVSUk9SKCJJbmZpbml0ZSBhcXVzaXRpb246IENpcmN1bGFyIGJ1ZmZlciBmdWxsIVxuIik7CisJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I7CisJCX0gZWxzZSB7CisJCQlhaV9pbmZpbml0ZV9JU00oaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCArPSBpbnN0YW5jZS0+SVNNLnJlYWQ7CisJCQlpbnN0YW5jZS0+SVNNLnJlYWQgPSAwOworCQl9CisKKwkJLy9TaWduYWwgZGF0YSB0byB1c2VyCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwl9IGVsc2UgaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsJLy9maWZvIGlzIGhhbGYgZnVsbCAtPiByZWFkIGZpZm8gICAgICAgTGFyZ2UgYmxvY2tzIG9ubHkhCisJCWluc3RhbmNlLT5JU00ucmVhZCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCisJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIE1FNDYwMF9BSV9GSUZPX0hBTEYpICE9IE1FNDYwMF9BSV9GSUZPX0hBTEYpIHsJLy9FUlJPUiEKKwkJCVBFUlJPUigiSW5maW5pdGUgYXF1c2l0aW9uOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCisJCQkvL1NpZ25hbCBpdC4KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwkJfSBlbHNlIHsKKwkJCWFpX2luZmluaXRlX0lTTShpbnN0YW5jZSk7CisJCX0KKwl9Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU0NjAwX2FpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXVpbnQzMl90IGlycV9zdGF0dXM7CisJdWludDMyX3QgY3RybF9zdGF0dXM7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZSA9IGRldl9pZDsKKwkvL2ludCB0b19yZWFkOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlycV9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoIQorCSAgICAoaXJxX3N0YXR1cyAmCisJICAgICAoTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGIHwgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSkpIHsKKyNpZmRlZiBNRURFQlVHX0lORk8KKwkJaWYgKChpcnFfc3RhdHVzICYgKE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRiB8IE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQyB8IE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9MRSkpID09IE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9MRSkgewkvL1RoaXMgaXMgc2VjdXJpdHkgY2hlY2sgY2FzZS4gTEUgaXMgdW51c2VkLiBUaGlzIHNob3VsZCBuZXZlciBldmVyIGhhcHBlbmQuCisJCQlQSU5GTworCQkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlycV9zdGF0dXNfcmVnPUxFX0lSUVxuIiwKKwkJCSAgICAgamlmZmllcywgX19GVU5DVElPTl9fKTsKKwkJfSBlbHNlIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGlycV9zdGF0dXMpOworCQl9CisjZW5kaWYKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmICghaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZikgewkvL1NlY3VyaXR5IGNoZWNrLgorCQlQRVJST1JfQ1JJVElDQUwoIkNJUkNVTEFSIEJVRkZFUiBOT1QgRVhJU1RTIVxuIik7CisJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwkvL0dldCB0aGUgc3RhdHVzIHJlZ2lzdGVyLgorCWN0cmxfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKworI2lmZGVmIE1FREVCVUdfSU5GTworCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKQorCQlQSU5GTygiSEYgaW50ZXJydXB0IGFjdGl2ZVxuIik7CisJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpCisJCVBJTkZPKCJTQyBpbnRlcnJ1cHQgYWN0aXZlXG4iKTsKKwlpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9MRSkKKwkJUElORk8oIkxFIGludGVycnVwdCBhY3RpdmVcbiIpOworI2VuZGlmCisKKwkvL1RoaXMgaXMgc2FmZXR5IGNoZWNrIQorCWlmICgoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRikKKwkgICAgJiYgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkpIHsKKwkJUERFQlVHKCJIRiBpbnRlcnJ1cHQgYWN0aXZlIGJ1dCBGSUZPIHVuZGVyIGhhbGZcbiIpOworCQkvL1Jlc2V0IEhGIGludGVycnVwdCBsYXRjaC4KKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJb3V0bChjdHJsX3N0YXR1cyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQsCisJCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGN0cmxfc3RhdHVzKTsKKwkJb3V0bChjdHJsX3N0YXR1cywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGN0cmxfc3RhdHVzKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorI2lmZGVmIE1FREVCVUdfSU5GTworCVBJTkZPKCJTVEFUVVNfQklUX0ZTTT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSA/ICJvbiIgOiAib2ZmIik7CisKKwlQSU5GTygiU1RBVFVTX0JJVF9FRl9DSEFOTkVMPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9DSEFOTkVMKSA/ICJub3QgZW1wdHkiIDoKKwkgICAgICAiZW1wdHkiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9IRl9DSEFOTkVMPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9DSEFOTkVMKSA/ICIgPCBIRiIgOgorCSAgICAgICIgPiBIRiIpOworCVBJTkZPKCJTVEFUVVNfQklUX0ZGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0NIQU5ORUwpID8gIm5vdCBmdWxsIiA6CisJICAgICAgImZ1bGwiKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0VGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpID8gIm5vdCBlbXB0eSIgOgorCSAgICAgICJlbXB0eSIpOworCVBJTkZPKCJTVEFUVVNfQklUX0hGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpID8gIiA8IEhGIiA6ICIgPiBIRiIpOworCVBJTkZPKCJTVEFUVVNfQklUX0ZGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0RBVEEpID8gIm5vdCBmdWxsIiA6CisJICAgICAgImZ1bGwiKTsKKworCVBJTkZPKCJDVFJMX0JJVF9IRl9JUlE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlEpID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCVBJTkZPKCJDVFJMX0JJVF9IRl9JUlFfUkVTRVQ9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQpID8gInJlc2V0IiA6CisJICAgICAgIndvcmsiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRKSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfUkVMT0FEPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FEKSA/ICJvbiIgOiAib2ZmIik7CisJUElORk8oIkNUUkxfQklUX1NDX0lSUV9SRVNFVD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCkgPyAicmVzZXQiIDoKKwkgICAgICAid29yayIpOworI2VuZGlmCisKKwkvL0xvb2sgZm9yIG92ZXJmbG93IGVycm9yLgorCWlmICghKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkpIHsKKwkJLy9GSUZPIGlzIGZ1bGwuIFJlYWQgZGF0YXMgYW5kIHJlc2V0IGFsbCBzZXR0aW5ncy4KKwkJUEVSUk9SKCJGSUZPIG92ZXJmbG93LlxuIik7CisJCWFpX3JlYWRfZGF0YShpbnN0YW5jZSwgTUU0NjAwX0FJX0ZJRk9fQ09VTlQpOworCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJLy9TaWduYWwgaXQuCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCkgewkvL1RoaXMgaXMgaW5maW5pdGUgYXF1c2l0aW9uLgorI2lmZGVmIE1FREVCVUdfRVJST1IKKwkJaWYgKChpcnFfc3RhdHVzICYKKwkJICAgICAoTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGIHwgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSkKKwkJICAgID09CisJCSAgICAoTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGIHwgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSkgeworCQkJLy8vSW4gaW5maW5pdGUgbW9kZSBvbmx5IG9uZSBpbnRlcnJ1cHQgc291cmNlIHNob3VsZCBiZSByZXBvcnRlZCEKKwkJCVBFUlJPUgorCQkJICAgICgiRXJyb3IgaW4gSVNNISBJbmZpbml0ZSBhcXVzaXRpb246IEhGIGFuZCBTQyBpbnRlcnJ1cHRzIGFjdGl2ZSEgdGhyZXNob2xkPSVkIG5leHQ9JWQgY3RybD0weCUwNFggaXJxX3N0YXR1c19yZWc9MHglMDRYIiwKKwkJCSAgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCwgaW5zdGFuY2UtPklTTS5uZXh0LAorCQkJICAgICBjdHJsX3N0YXR1cywgaXJxX3N0YXR1cyk7CisJCX0KKyNlbmRpZgorCisJCWFpX2luZmluaXRlX2lzcihpbnN0YW5jZSwgaXJxX3N0YXR1cywgY3RybF9zdGF0dXMpOworCisjaWZkZWYgTUVERUJVR19JTkZPCisJCWN0cmxfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisjZW5kaWYKKwl9IGVsc2UgeworCisJCWFpX2xpbWl0ZWRfaXNyKGluc3RhbmNlLCBpcnFfc3RhdHVzLCBjdHJsX3N0YXR1cyk7CisJCWN0cmxfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKCEoY3RybF9zdGF0dXMgJiAoTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQpKSkgewkvL0hGIGFjdGl2ZSwgYnV0IHdlIGhhdmUgbW9yZSB0aGFuIGhhbGYgYWxyZWFkeSA9PiBIRiB3aWxsIG5ldmVyIGNvbWUKKwkJCVBERUJVRworCQkJICAgICgiTUlTU0VEIEhGLiBkYXRhX3JlcXVpcmVkPSVkIElTTS5yZWFkPSVkIElTTS5nbG9iYWw9JWQgSVNNLm5leHQ9JWRcbiIsCisJCQkgICAgIGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkLCBpbnN0YW5jZS0+SVNNLnJlYWQsCisJCQkgICAgIGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQsIGluc3RhbmNlLT5JU00ubmV4dCk7CisJCQlhaV9saW1pdGVkX2lzcihpbnN0YW5jZSwgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGLAorCQkJCSAgICAgICBjdHJsX3N0YXR1cyk7CisJCX0KKwl9CisKKyNpZmRlZiBNRURFQlVHX0lORk8KKwlQSU5GTygiU1RBVFVTX0JJVF9GU009JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgPyAib24iIDogIm9mZiIpOworCisJUElORk8oIlNUQVRVU19CSVRfRUZfQ0hBTk5FTD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfQ0hBTk5FTCkgPyAibm90IGVtcHR5IiA6CisJICAgICAgImVtcHR5Iik7CisJUElORk8oIlNUQVRVU19CSVRfSEZfQ0hBTk5FTD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfQ0hBTk5FTCkgPyAiIDwgSEYiIDoKKwkgICAgICAiID4gSEYiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9GRl9DSEFOTkVMPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GRl9DSEFOTkVMKSA/ICJub3QgZnVsbCIgOgorCSAgICAgICJmdWxsIik7CisKKwlQSU5GTygiU1RBVFVTX0JJVF9FRl9EQVRBPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSA/ICJub3QgZW1wdHkiIDoKKwkgICAgICAiZW1wdHkiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9IRl9EQVRBPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBKSA/ICIgPCBIRiIgOiAiID4gSEYiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9GRl9EQVRBPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GRl9EQVRBKSA/ICJub3QgZnVsbCIgOgorCSAgICAgICJmdWxsIik7CisKKwlQSU5GTygiQ1RSTF9CSVRfSEZfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUKSA/ICJyZXNldCIgOgorCSAgICAgICJ3b3JrIik7CisJUElORk8oIkNUUkxfQklUX1NDX0lSUT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJUElORk8oIkNUUkxfQklUX1NDX1JFTE9BRD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRCkgPyAib24iIDogIm9mZiIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19JUlFfUkVTRVQ9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQpID8gInJlc2V0IiA6CisJICAgICAgIndvcmsiKTsKKwlQSU5GTygiJWxkIEVORFxuIiwgamlmZmllcyk7CisjZW5kaWYKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqIEBicmllZiBTdG9wIGFxdXNhdGlvbiBvZiBkYXRhLiBSZXNldCBpbnRlcnJ1cHRzJyBsYWNoZXMuIENsZWFyIGRhdGEncyBGSUZPLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLwordm9pZCBpbmxpbmUgYWlfc3RvcF9pc3IobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHNvZnQgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwlyZWdpc3RlciB1aW50MzJfdCB0bXA7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCS8vU3RvcCBhbGwuIFJlc2V0IGludGVycnVwdCBsYWNoZXMuIFJlc2V0IGRhdGEgRklGTy4KKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgfD0KKwkgICAgKE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQKKwkgICAgIHwgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVCB8CisJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUKTsKKwl0bXAgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIGZpZm8gdG8gY2lyY3VsYXIgYnVmZmVyLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIHJlcXVlc3RlZCBkYXRhLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgdmFsdWVzLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1cuCisqLworc3RhdGljIGludCBpbmxpbmUgYWlfcmVhZF9kYXRhKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkJICAgICAgIGNvbnN0IGludCBjb3VudCkKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwlpbnQgYyA9IGNvdW50OworCWludCBlbXB0eV9zcGFjZTsKKwlpbnQgY29waWVkID0gMDsKKwlpbnQgaSwgajsKKworCWVtcHR5X3NwYWNlID0gbWVfY2lyY19idWZfc3BhY2VfdG9fZW5kKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCWlmIChlbXB0eV9zcGFjZSA8PSAwKSB7CisJCVBERUJVRygiQ2lyY3VsYXIgYnVmZmVyIGZ1bGwuXG4iKTsKKwkJcmV0dXJuIC1NRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVzsKKwl9CisKKwlpZiAoZW1wdHlfc3BhY2UgPCBjKSB7CS8vQ29weSBmaXJzdCBwYXJ0LiBNYXggdG8gZW5kIG9mIGJ1ZmZlci4KKwkJUERFQlVHCisJCSAgICAoIlRyeSB0byBjb3B5ICVkIHZhbHVlcyBmcm9tIEZJRk8gdG8gY2lyY3VsYXIgYnVmZmVyIChwYXNzIDEpLlxuIiwKKwkJICAgICBlbXB0eV9zcGFjZSk7CisJCWZvciAoaSA9IDA7IGkgPCBlbXB0eV9zcGFjZTsgaSsrKSB7CisJCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkJICAgIChpbncoaW5zdGFuY2UtPmRhdGFfcmVnKSBeIDB4ODAwMCk7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCsrOworCQl9CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQljIC09IGVtcHR5X3NwYWNlOworCQljb3BpZWQgPSBlbXB0eV9zcGFjZTsKKworCQllbXB0eV9zcGFjZSA9IG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZCgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwl9CisKKwlpZiAoZW1wdHlfc3BhY2UgPiAwKSB7CisJCWogPSAoZW1wdHlfc3BhY2UgPCBjKSA/IGVtcHR5X3NwYWNlIDogYzsKKwkJUERFQlVHCisJCSAgICAoIlRyeSB0byBjb3B5ICVkIHZhbHVlcyBmcm9tIEZJRk8gdG8gY2lyY3VsYXIgYnVmZmVyIChwYXNzIDIpLlxuIiwKKwkJICAgICBjKTsKKwkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCQkJKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpID0KKwkJCSAgICAoaW53KGluc3RhbmNlLT5kYXRhX3JlZykgXiAweDgwMDApOworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQrKzsKKwkJfQorCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJY29waWVkICs9IGo7CisJfQorCXJldHVybiBjb3BpZWQ7Cit9CisKK3ZvaWQgaW5saW5lIGFpX2luZmluaXRlX0lTTShtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwlyZWdpc3RlciB2b2xhdGlsZSB1aW50MzJfdCBjdHJsX3NldCwgY3RybF9yZXNldCwgdG1wOworCisJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPCBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsJLy8gT25seSBzYW1wbGUgY291bnRlciB3aXRoIHJlbG9hZG5pZyBpcyB3b3JraW5nLiBSZXNldCBpdC4KKwkJUElORk8KKwkJICAgICgiT25seSBzYW1wbGUgY291bnRlciB3aXRoIHJlbG9hZG5pZyBpcyB3b3JraW5nLiBSZXNldCBpdC5cbiIpOworCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisJCWN0cmxfcmVzZXQgPSB+TUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwl9IGVsc2UgaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPT0gaW5zdGFuY2UtPklTTS5yZWFkKSB7CS8vVGhpcyBpcyBTQyBpbnRlcnJ1cHQgZm9yIGxhcmdlIGJsb2NrLiBUaGUgd2hvbGUgc2VjdGlvbiBpcyBkb25lLiBSZXNldCBTQ19JUlEgYW4gSEZfSVJRIGFuZCBzdGFydCBldmVyeXRoaW5nIGFnYWluIGZyb20gYmVnaW5uaW5nLgorCQlQSU5GTworCQkgICAgKCJUaGlzIGlzIFNDIGludGVycnVwdCBmb3IgbGFyZ2UgYmxvY2suIFRoZSB3aG9sZSBzZWN0aW9uIGlzIGRvbmUuIFJlc2V0IFNDX0lSUSBhbiBIRl9JUlEgYW5kIHN0YXJ0IGV2ZXJ5dGhpbmcgYWdhaW4gZnJvbSBiZWdpbm5pbmcuXG4iKTsKKwkJY3RybF9zZXQgPQorCQkgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8CisJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQljdHJsX3Jlc2V0ID0KKwkJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8CisJCSAgICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQpOworCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA+PSAoTUU0NjAwX0FJX0ZJRk9fTUFYX1NDICsgaW5zdGFuY2UtPklTTS5yZWFkKSkgewkvL1RoaXMgaXMgSEYgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay5UaGUgbmV4dCBpbnRlcnJ1cHQgc2hvdWxkIGJlIGZyb20gSEYsIGFsc28uIFJlc2V0IEhGLgorCQlQSU5GTworCQkgICAgKCJUaGlzIGlzIEhGIGludGVycnVwdCBmb3IgbGFyZ2UgYmxvY2suVGhlIG5leHQgaW50ZXJydXB0IHNob3VsZCBiZSBmcm9tIEhGLCBhbHNvLiBSZXNldCBIRi5cbiIpOworCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCWN0cmxfcmVzZXQgPSB+TUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwl9IGVsc2UgewkJLy9UaGlzIGlzIEhGIGludGVycnVwdCBmb3IgbGFyZ2UgYmxvY2suVGhlIG5leHQgaW50ZXJydXB0IHNob3VsZCBiZSBmcm9tIFNDLiBEb24ndCByZXNldCBIRiEKKwkJUElORk8KKwkJICAgICgiVGhpcyBpcyBIRiBpbnRlcnJ1cHQgZm9yIGxhcmdlIGJsb2NrLlRoZSBuZXh0IGludGVycnVwdCBzaG91bGQgYmUgZnJvbSBTQy4gRG9uJ3QgcmVzZXQgSEYhXG4iKTsKKwkJY3RybF9zZXQgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQljdHJsX3Jlc2V0ID0gMHhGRkZGRkZGRjsKKwl9CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaC4KKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBJTkZPKCJjdHJsPTB4JXggY3RybF9zZXQ9MHgleCBjdHJsX3Jlc2V0PTB4JXhcbiIsIHRtcCwgY3RybF9zZXQsCisJICAgICAgY3RybF9yZXNldCk7CisJdG1wIHw9IGN0cmxfc2V0OworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCWlmIChjdHJsX3Jlc2V0ICE9IDB4RkZGRkZGRkYpIHsKKwkJb3V0bCh0bXAgJiBjdHJsX3Jlc2V0LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3Jlc2V0IG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICB0bXAgJiBjdHJsX3Jlc2V0KTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCit9CisKK3ZvaWQgaW5saW5lIGFpX2xpbWl0ZWRfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkJICAgdWludDMyX3QgaXJxX3N0YXR1cykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwlyZWdpc3RlciB2b2xhdGlsZSB1aW50MzJfdCBjdHJsX3NldCwgY3RybF9yZXNldCA9IDB4RkZGRkZGRkYsIHRtcDsKKworCWlmICghaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkgewkvL05vIHRocmVzaG9sZCBwcm92aWRlZC4gU0MgZW5kcyB3b3JrLgorCQlQSU5GTygiTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTQyBlbmRzIHdvcmsuXG4iKTsKKwkJY3RybF9zZXQgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQlpZiAoaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgPiAoTUU0NjAwX0FJX0ZJRk9fQ09VTlQgLSAxICsgaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCkpIHsJLy9IRiBuZWVkIHJlc2V0aW5nLgorCQkJY3RybF9yZXNldCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJfQorCX0gZWxzZQkJCS8vaWYoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkKKwl7CisJCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKSB7CisJCQlQSU5GTygiVGhyZXNob2xkIHByb3ZpZGVkLiBDbGVhciBIRiBsYXRjaC5cbiIpOworCQkJY3RybF9zZXQgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCisJCQlpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA+PSAoTUU0NjAwX0FJX0ZJRk9fTUFYX1NDICsgaW5zdGFuY2UtPklTTS5yZWFkKSkgewkvL1RoaXMgaXMgbm90IHRoZSBsYXN0IG9uZS4gSEYgbmVlZCByZXNldGluZy4KKwkJCQlQSU5GTworCQkJCSAgICAoIlRoZSBuZXh0IGludGVycnVwdCBpcyBIRi4gSEYgbmVlZCBiZSBhY3RpdmF0aW5nLlxuIik7CisJCQkJY3RybF9yZXNldCA9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQkJfQorCQl9CisKKwkJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpIHsKKwkJCVBJTkZPKCJUaHJlc2hvbGQgcHJvdmlkZWQuIFJlc3RhcnQgU0MuXG4iKTsKKwkJCWN0cmxfc2V0ID0gTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwkJCWN0cmxfcmVzZXQgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisKKwkJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID49IE1FNDYwMF9BSV9GSUZPX01BWF9TQykgewkvL1RoaXMgaXMgbm90IHRoZSBsYXN0IG9uZS4gSEYgbmVlZCB0byBiZSBhY3RpdmF0aW5nLgorCQkJCVBJTkZPCisJCQkJICAgICgiVGhlIG5leHQgaW50ZXJydXB0IGlzIEhGLiBIRiBuZWVkIHRvIGJlIGFjdGl2YXRpbmcuXG4iKTsKKwkJCQljdHJsX3Jlc2V0ICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQkJfQorCQl9CisJfQorCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2guCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgfD0gY3RybF9zZXQ7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlpZiAoY3RybF9yZXNldCAhPSAweEZGRkZGRkZGKSB7CisJCW91dGwodG1wICYgY3RybF9yZXNldCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHRtcCAmIGN0cmxfcmVzZXQpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKK30KKworLyoqIEBicmllZiBMYXN0IGNodW5jayBvZiBkYXRhcy4gV2UgbXVzdCByZXNjaGVkdWxlIHNhbXBsZSBjb3VudGVyLgorKglAbm90ZSBMYXN0IGNodW5jay4KKyoJTGVhdmluZyBTQ19SRUxPQUQgZG9lc24ndCBkbyBhbnkgaGFybSwgYnV0IGluIHNvbWUgYmFkIGNhc2UgY2FuIG1ha2UgZXh0cmEgaW50ZXJydXB0cy4KKyoJQHdhcm5pbmcgV2hlbiB0aHJlc2hvbGQgaXMgd3JvbmdseSBzZXQgc29tZSBJUlEgYXJlIGxvc3QuKCEhISkKKyovCit2b2lkIGlubGluZSBhaV9yZXNjaGVkdWxlX1NDKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQoreworCXJlZ2lzdGVyIHVpbnQzMl90IHJlc3Q7CisKKwlpZiAoaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgPD0gaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCkKKwkJcmV0dXJuOworCisJcmVzdCA9IGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkIC0gaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZDsKKwlpZiAocmVzdCA8IGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsJLy9FbmQgb2Ygd29yayBzb29uIC4uLi4KKwkJUERFQlVHKCJSZXNjaGVkdWxpbmcgU0MgZnJvbSAlZCB0byAlZC5cbiIsCisJCSAgICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLCByZXN0KTsKKwkJLy8vIEBub3RlIFdyaXRlIG5ldyB2YWx1ZSB0byBTQyA8PT0gIERBTkdFUiEgVGhpcyBpcyBub3Qgc2FmZSBzb2x1dGlvbiEgV2UgY2FuIG1pc3Mgc29tZSBpbnB1dHMuCisJCW91dGwocmVzdCwgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyk7CisJCVBERUJVR19SRUcoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHJlc3QpOworCQlpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID0gcmVzdDsKKworCQlpZiAocmVzdCA8IE1FNDYwMF9BSV9GSUZPX01BWF9TQykgeworCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0gcmVzdDsKKwkJfSBlbHNlIHsKKwkJCWluc3RhbmNlLT5JU00ubmV4dCA9IHJlc3QgJSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJaWYgKGluc3RhbmNlLT5JU00ubmV4dCArIE1FNDYwMF9BSV9GSUZPX0hBTEYgPAorCQkJICAgIE1FNDYwMF9BSV9GSUZPX01BWF9TQykgeworCQkJCWluc3RhbmNlLT5JU00ubmV4dCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJfQorCQl9CisJfQorfQorCisvKiogU3RhcnQgdGhlIElTTS4gQWxsIG11c3QgYmUgcmVzZXRlZCBiZWZvcmUgZW50ZXIgdG8gdGhpcyBmdW5jdGlvbi4gKi8KK3ZvaWQgaW5saW5lIGFpX2RhdGFfYWNxdWlzaXRpb25fbG9naWMobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJcmVnaXN0ZXIgdWludDMyX3QgdG1wOworCisJaWYgKCFpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCkgewkvL1RoaXMgaXMgaW5maW5pdGUgYXF1c2l0aW9uLgorCQlpZiAoIWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsJLy9ObyB0aHJlc2hvbGQgcHJvdmlkZWQuIFNldCBTQyB0byAwLjUqRklGTy4gQ2xlYXIgdGhlIFNDJ3MgbGF0Y2guCisJCQkvL1NldCB0aGUgc2FtcGxlIGNvdW50ZXIKKwkJCW91dGwoTUU0NjAwX0FJX0ZJRk9fSEFMRiwgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyk7CisJCQlQREVCVUdfUkVHCisJCQkgICAgKCJzYW1wbGVfY291bnRlcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgICBNRTQ2MDBfQUlfRklGT19IQUxGKTsKKwkJfSBlbHNlIHsJLy9UaHJlc2hvbGQgcHJvdmlkZWQuIFNldCBTQyB0byB0cmVzaG9sZC4gQ2xlYXIgdGhlIFNDJ3MgbGF0Y2guCisJCQkvL1NldCB0aGUgc2FtcGxlIGNvdW50ZXIKKwkJCW91dGwoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCwKKwkJCSAgICAgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyk7CisJCQlQREVCVUdfUkVHCisJCQkgICAgKCJzYW1wbGVfY291bnRlcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkIDwgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CS8vRW5hYmxlIG9ubHkgc2FtcGxlIGNvdW50ZXIncyBpbnRlcnJ1cHQuIFNldCByZWxvYWQgYml0LiBDbGVhciB0aGUgU0MncyBsYXRjaC4KKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FEOworCQkJdG1wICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdG1wKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJCWlmICghaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkgewkvL05vIHRocmVzaG9sZCBwcm92aWRlZC4gU2V0IElTTS5uZXh0IHRvIDAuNSpGSUZPLgorCQkJCWluc3RhbmNlLT5JU00ubmV4dCA9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQl9IGVsc2UgewkvL1RocmVzaG9sZCBwcm92aWRlZC4gU2V0IElTTS5uZXh0IHRvIHRyZXNob2xkLgorCQkJCWluc3RhbmNlLT5JU00ubmV4dCA9CisJCQkJICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQ7CisJCQl9CisJCX0gZWxzZSB7CS8vRW5hYmxlIHNhbXBsZSBjb3VudGVyJ3MgYW5kIEhGJ3MgaW50ZXJydXB0cy4KKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FEOworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwKKwkJCSAgICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdG1wKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0KKwkJCSAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkICUgTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCWlmIChpbnN0YW5jZS0+SVNNLm5leHQgKyBNRTQ2MDBfQUlfRklGT19IQUxGIDwKKwkJCSAgICBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgKz0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CQkvL1RoaXMgYXF1c2l0aW9uIGlzIGxpbWl0ZWQgdG8gc2V0IG51bWJlciBvZiBkYXRhLgorCQlpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA+PSBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCkgewkvL1N0dXBpZCBzaXR1YXRpb24uCisJCQlpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID0gMDsKKwkJCVBERUJVRworCQkJICAgICgiU3R1cGlkIHNpdHVhdGlvbjogZGF0YV9yZXF1aXJlZCglZCkgPCB0aHJlc2hvbGQoJWQpLlxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCwKKwkJCSAgICAgaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpOworCQl9CisKKwkJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBFYXN5IGNhc2U6IEhGPXJlYWQgYW5kIFNDPWVuZC4KKwkJCS8vU2V0IHRoZSBzYW1wbGUgY291bnRlciB0byBkYXRhX3JlcXVpcmVkLgorCQkJb3V0bChpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCwKKwkJCSAgICAgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyk7CisJCQlQREVCVUdfUkVHCisJCQkgICAgKCJzYW1wbGVfY291bnRlcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgICBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCk7CisKKwkJCS8vUmVzZXQgdGhlIGxhdGNoZXMgb2Ygc2FtcGxlIGNvdW50ZXIgYW5kIEhGIChpZiBTQz5GSUZPKS4KKwkJCS8vTm8gU0MgcmVsb2FkIQorCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwKKwkJCSAgICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQpOworCQkJaWYgKGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkID4KKwkJCSAgICAoTUU0NjAwX0FJX0ZJRk9fQ09VTlQgLSAxKSkgeworCQkJCXRtcCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgPQorCQkJCSAgICBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCAlCisJCQkJICAgIE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisKKwkJCX0gZWxzZSB7CisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0gaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQ7CisJCQl9CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJCX0gZWxzZSB7CS8vVGhlIG1vc3QgZ2VuZXJhbCBjYXNlLiBXZSBoYXZlIGNvbmNyZXQgbnVtYmUgb2YgcmVxdWlyZWQgZGF0YSBhbmQgdGhyZXNob2xkLiBTQz1USAorCQkJLy9TZXQgdGhlIHNhbXBsZSBjb3VudGVyIHRvIHRocmVzaG9sZC4KKwkJCW91dGwoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCwKKwkJCSAgICAgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyk7CisJCQlQREVCVUdfUkVHCisJCQkgICAgKCJzYW1wbGVfY291bnRlcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKTsKKworCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJLy9JbiB0aGlzIG1vbWVudCB3ZSBhcmUgc3VyZSB0aGF0IFNDIHdpbGwgY29tZSBtb3JlIHRoYW4gb25jZS4KKwkJCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FEOworCisJCQlpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA8IE1FNDYwMF9BSV9GSUZPX01BWF9TQykgewkvL1RoZSB0aHJlc2hvbGQgaXMgc28gc21hbGwgdGhhdCB3ZSBkbyBuZWVkIEhGLgorCQkJCXRtcCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgPQorCQkJCSAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkOworCQkJfSBlbHNlIHsJLy9UaGUgdGhyZXNob2xkIGlzIGxhcmdlLiBUaGUgSEYgbXVzdCBiZSB1c2UuCisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8CisJCQkJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCk7CisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0KKwkJCQkgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCAlCisJCQkJICAgIE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQkJaWYgKGluc3RhbmNlLT5JU00ubmV4dCArIE1FNDYwMF9BSV9GSUZPX0hBTEYgPAorCQkJCSAgICBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsKKwkJCQkJaW5zdGFuY2UtPklTTS5uZXh0ICs9CisJCQkJCSAgICBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJCX0KKwkJCX0KKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWlfbXV4X3RvZ2dsZXIobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl9wcmVfdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDY1LCBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCA2NSk7CisJb3V0bCg2NSwgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl9wcmVfdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgNjUpOworCisJLy8gVHVybiBvbiBpbnRlcm5hbCByZWZlcmVuY2UuCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9GVUxMU0NBTEU7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkvLyBDbGVhciBkYXRhIGFuZCBjaGFubmVsIGZpZm8uCisJdG1wICY9CisJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8pOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCS8vIFdyaXRlIGNoYW5uZWwgZW50cnkuCisJb3V0bChNRTQ2MDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUwgfAorCSAgICAgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81IHwgMzEsCisJICAgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyk7CisJUERFQlVHX1JFRygiY2hhbm5lbF9saXN0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFubmVsX2xpc3RfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBNRTQ2MDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUwgfAorCQkgICBNRTQ2MDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8yXzUgfCAzMSk7CisKKwkvLyBTdGFydCBjb252ZXJzaW9uLgorCWlubChpbnN0YW5jZS0+c3RhcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGFydF9yZWcgaW5sKDB4JWxYKzB4JWxYKVxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlKTsKKwl1ZGVsYXkoMTApOworCisJLy8gQ2xlYXIgZGF0YSBhbmQgY2hhbm5lbCBmaWZvLgorCXRtcCAmPQorCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPKTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkvLyBXcml0ZSBjaGFubmVsIGVudHJ5LgorCS8vIE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCB8IE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAgPD0gMHgwMDAwCisJb3V0bChNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgfAorCSAgICAgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCwgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcpOworCVBERUJVR19SRUcoImNoYW5uZWxfbGlzdF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEIHwKKwkJICAgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCk7CisKKwkvLyBTdGFydCBjb252ZXJzaW9uLgorCWlubChpbnN0YW5jZS0+c3RhcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGFydF9yZWcgaW5sKDB4JWxYKzB4JWxYKVxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlKTsKKwl1ZGVsYXkoMTApOworCisJLy8gQ2xlYXIgY29udHJvbCByZWdpc3Rlci4KKwl0bXAgJj0gKE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUKTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisvKiogQGJyaWVmIENvcHkgcmVzdCBvZiBkYXRhIGZyb20gZmlmbyB0byBjaXJjdWxhciBidWZmZXIuCisqIEBub3RlIEhlbHBlciBmb3IgU1RPUCBjb21tYW5kLiBBZnRlciBGU00gaXMgc3RvcHBlZC4KKyogQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIHRoYXQgY29weSBhbGwgcmVtYWluaWcgZGF0YSBmcm9tIEZJRk8gdG8gYnVmZmVyLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3I6IE5lZ2F0aXZlIGVycm9yIGNvZGUgLU1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XLgorKi8KK3N0YXRpYyBpbnQgaW5saW5lIGFpX3JlYWRfZGF0YV9wb29saW5nKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCWludCBlbXB0eV9zcGFjZTsKKwlpbnQgY29waWVkID0gMDsKKwlpbnQgc3RhdHVzID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiU3BhY2UgbGVmdCBpbiBjaXJjdWxhciBidWZmZXIgPSAlZC5cbiIsCisJICAgICAgIG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpKTsKKworCXdoaWxlICgoZW1wdHlfc3BhY2UgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSkpIHsKKwkJaWYgKCEoc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpKSB7CS8vTm8gbW9yZSBkYXRhLiBzdGF0dXMgPSBNRV9FUlJOT19TVUNDRVNTID0gMAorCQkJYnJlYWs7CisJCX0KKwkJKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpID0KKwkJICAgIChpbncoaW5zdGFuY2UtPmRhdGFfcmVnKSBeIDB4ODAwMCk7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKys7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0KKworI2lmZGVmIE1FREVCVUdfRVJST1IKKwlpZiAoIXN0YXR1cykKKwkJUERFQlVHCisJCSAgICAoIkNvcGllZCBhbGwgcmVtYWluaW5nIGRhdGFzICglZCkgZnJvbSBGSUZPIHRvIGNpcmN1bGFyIGJ1ZmZlci5cbiIsCisJCSAgICAgY29waWVkKTsKKwllbHNlIHsKKwkJUERFQlVHKCJObyBtb3JlIGVtcHR5IHNwYWNlIGluIGJ1ZmZlci5cbiIpOworCQlQREVCVUcoIkNvcGllZCAlZCBkYXRhcyBmcm9tIEZJRk8gdG8gY2lyY3VsYXIgYnVmZmVyLlxuIiwKKwkJICAgICAgIGNvcGllZCk7CisJCVBERUJVRygiRklGTyBzdGlsbCBub3QgZW1wdHkuXG4iKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gKCFzdGF0dXMpID8gY29waWVkIDogLU1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIHZvaWQgbWU0NjAwX2FpX3dvcmtfY29udHJvbF90YXNrKHZvaWQgKnN1YmRldmljZSkKKyNlbHNlCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorI2VuZGlmCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJaW50IHJlc2NoZWR1bGUgPSAwOworCWludCBzaWduYWxpbmcgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisjZWxzZQorCWluc3RhbmNlID0KKwkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWU0NjAwX2FpX3N1YmRldmljZV90LCBhaV9jb250cm9sX3Rhc2spOworI2VuZGlmCisJUElORk8oIjwlczogJWxkPiBleGVjdXRlZC5cbiIsIF9fRlVOQ1RJT05fXywgamlmZmllcyk7CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCVBERUJVR19SRUcoInN0YXR1c19yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zdGF0dXNfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0dXMpOworCisJc3dpdGNoIChpbnN0YW5jZS0+c3RhdHVzKSB7CS8vIENoZWNraW5nIGFjdHVhbCBtb2RlLgorCQkvLyBOb3QgY29uZmlndXJlZCBmb3Igd29yay4KKwljYXNlIGFpX3N0YXR1c19ub25lOgorCQlicmVhazsKKworCQkvL1RoaXMgYXJlIHN0YWJsZSBtb2Rlcy4gTm8gbmVlZCB0byBkbyBhbnl0aGluZy4gKD8pCisJY2FzZSBhaV9zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZXJyb3I6CisJCVBFUlJPUigiU2hvdWxkbid0IGJlIHJ1bm5pbmchLlxuIik7CisJCWJyZWFrOworCisJCS8vIFN0cmVhbSBtb2RlcworCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwkJaWYgKHN0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgewkvLyBJU00gc3RhcnRlZC4uCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9ydW47CisJCQkvLyBTaWduYWwgdGhlIGVuZCBvZiB3YWl0IGZvciBzdGFydC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQkvLyBXYWl0IG5vdyBmb3Igc3RvcC4KKwkJCXJlc2NoZWR1bGUgPSAxOworCQkJYnJlYWs7CisKKwkJCS8vIENoZWNrIHRpbWVvdXQuCisJCQlpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cy4gUmVzZXQgRklGTyA9PiBUb28gbGF0ZSEKKwkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX3J1bjoKKwkJLy8gV2FpdCBmb3Igc3RvcCBJU00uCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSkgewkvLyBJU00gc3RvcGVkLiBPdmVyd3JpdGUgSVNSLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQkJLy8gU2lnbmFsIHRoZSBlbmQgb2Ygd2FpdCBmb3Igc3RvcC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCX0gZWxzZSB7CisJCQkvLyBXYWl0IGZvciBzdG9wIElTTS4KKwkJCXJlc2NoZWR1bGUgPSAxOworCQl9CisJCWJyZWFrOworCisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2VuZDoKKwkJLy9FbmQgd29yay4KKwkJaWYgKHN0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgewkvLyBTdGlsbCB3b3JraW5nPyBTdG9wIGl0IQorCQkJUEVSUk9SCisJCQkgICAgKCJTdGF0dXMgaXMgJ2FpX3N0YXR1c19zdHJlYW1fZW5kJyBidXQgaGFyZHdhcmUgaXMgc3RpbGwgd29ya2luZyFcbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9CisJCQkgICAgKE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCQkgICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQgfAorCQkJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUKTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SX0NSSVRJQ0FMKCJTdGF0dXMgaXMgaW4gd3Jvbmcgc3RhdGUgKCVkKSFcbiIsCisJCQkJaW5zdGFuY2UtPnN0YXR1cyk7CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJc2lnbmFsaW5nID0gMTsKKwkJYnJlYWs7CisKKwl9CisKKwlpZiAoc2lnbmFsaW5nKSB7CS8vU2lnbmFsIGl0LgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJfQorCisJaWYgKGluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyAmJiByZXNjaGVkdWxlKSB7CS8vIFJlc2NoZWR1bGUgdGFzaworCQlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNDYwMF93b3JrcXVldWUsCisJCQkJICAgJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2ssIDEpOworCX0gZWxzZSB7CisJCVBJTkZPKCI8JXM+IEVuZGluZyBjb250cm9sIHRhc2suXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWExYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2FpLmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgTUUtNDAwMCBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZSAgKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfQUlfSF8KKyNkZWZpbmUgX01FNDYwMF9BSV9IXworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorI2luY2x1ZGUgIm1lY2lyY19idWYuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTQ2MDBfQUlfTUFYX0RBVEEJCQkJMHhGRkZGCisKKyNpZmRlZiBNRV9TWU5BUFNFCisjIGRlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUgk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyNlbHNlCisjIGRlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUgk1CS8vIDJebiBQQUdFUyA9Pj4gMTI4S0IKKyNlbmRpZgorI2RlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSAJCVBBR0VfU0laRTw8TUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIJLy8gQnVmZmVyIHNpemUgaW4gYnl0ZXMuCisKKyNpZmRlZiBfQ0JVRkZfMzJiX3QKKyMgZGVmaW5lIE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVAkJKChNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSkgLyBzaXplb2YodWludDMyX3QpKQkvLyBTaXplIGluIHZhbHVlcworI2Vsc2UKKyMgZGVmaW5lIE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVAkJKChNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSkgLyBzaXplb2YodWludDE2X3QpKQkvLyBTaXplIGluIHZhbHVlcworI2VuZGlmCisKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fSEFMRgkJCQkxMDI0CS8vTUU0NjAwX0FJX0ZJRk9fQ09VTlQvMiAgICAgICAgICAgICAgICAvLzEwMjQKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDCQkJMTM1MgkvLzAuNjYqTUU0NjAwX0FJX0ZJRk9fQ09VTlQgICAgICAgICAgICAgLy8xMzUyCisKK3R5cGVkZWYgZW51bSBNRTQ2MDBfQUlfU1RBVFVTIHsKKwlhaV9zdGF0dXNfbm9uZSA9IDAsCisJYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkLAorCWFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCwKKwlhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0LAorCWFpX3N0YXR1c19zdHJlYW1fcnVuLAorCWFpX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQsCisJYWlfc3RhdHVzX3N0cmVhbV9lbmQsCisJYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yLAorCWFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yLAorCWFpX3N0YXR1c19zdHJlYW1fZXJyb3IsCisJYWlfc3RhdHVzX2xhc3QKK30gTUU0NjAwX0FJX1NUQVRVUzsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX3NpbmdsZV9jb25maWdfZW50cnkgeworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1aW50MzJfdCBlbnRyeTsKKwl1aW50MzJfdCBjdHJsOworfSBtZTQ2MDBfc2luZ2xlX2NvbmZpZ19lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfcmFuZ2VfZW50cnkgeworCWludCBtaW47CisJaW50IG1heDsKK30gbWU0NjAwX3JhbmdlX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9haV9JU00geworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBnbG9iYWxfcmVhZDsJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgcmVhZCBpbiB0b3RhbC4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmVhZDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZWFkIGZvciB0aGlzIGNodW5jay4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbmV4dDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZXF1ZXN0IGJ5IHVzZXIuICovCit9IG1lNDYwMF9haV9JU01fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2FpX3RpbWVvdXQgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworfSBtZTQ2MDBfYWlfdGltZW91dF90OworCisvKioKKyAqIEBicmllZiBUaGUgTUUtNDAwMCBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfYWlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJLyogSGFyZHdhcmUgZmVhdXRyZXMgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOwkJCQkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwlpbnQgaXNvbGF0ZWQ7CQkJCQkJCQkJLyoqPCBNYXJrcyBpZiB0aGlzIHN1YmRldmljZSBpcyBvbiBhbiBvcHRvaXNvbGF0ZWQgZGV2aWNlLiAqLworCWludCBzaDsJCQkJCQkJCQkJCS8qKjwgTWFya3MgaWYgdGhpcyBzdWJkZXZpY2UgaGFzIHNhbXBsZSBhbmQgaG9sZCBkZXZpY2VzLiAqLworCisJdW5zaWduZWQgaW50IGNoYW5uZWxzOwkJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIHRoaXMgc3ViZGV2aWNlLiAqLworCW1lNDYwMF9zaW5nbGVfY29uZmlnX2VudHJ5X3Qgc2luZ2xlX2NvbmZpZ1szMl07CS8qKjwgVGhlIGNvbmZpZ3VyYXRpb24gc2V0IGZvciBzaW5nbGUgYWNxdWlzaXRpb24uICovCisKKwl1bnNpZ25lZCBpbnQgZGF0YV9yZXF1aXJlZDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZXF1ZXN0IGJ5IHVzZXIuICovCisJdW5zaWduZWQgaW50IGZpZm9faXJxX3RocmVzaG9sZDsJCQkJLyoqPCBUaGUgdXNlciBhZGp1c3RlZCBGSUZPIGhpZ2ggd2F0ZXIgaW50ZXJydXB0IGxldmVsLiAqLworCXVuc2lnbmVkIGludCBjaGFuX2xpc3RfbGVuOwkJCQkJCS8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgdXNlciBkZWZpbmVkIGNoYW5uZWwgbGlzdC4gKi8KKworCW1lNDYwMF9haV9JU01fdCBJU007CQkJCQkJCS8qKjwgVGhlIGluZm9ybWF0aW9uIHJlcXVlc3QgYnkgSW50ZXJydXB0LVN0YXRlLU1hY2hpbmUuICovCisJdm9sYXRpbGUgZW51bSBNRTQ2MDBfQUlfU1RBVFVTIHN0YXR1czsJCQkvKio8IFRoZSBjdXJyZW50IHN0cmVhbSBzdGF0dXMgZmxhZy4gKi8KKwltZTQ2MDBfYWlfdGltZW91dF90IHRpbWVvdXQ7CQkJCQkvKio8IFRoZSB0aW1lb3V0IGZvciBzdGFydCBpbiBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIG1vZGUuICovCisKKwkJCQkJCQkJCQkJLyogUmVnaXN0ZXJzICovLyoqPCBBbGwgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIGxvbmcuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFubmVsX2xpc3RfcmVnOworCXVuc2lnbmVkIGxvbmcgZGF0YV9yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFuX3RpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNoYW5fcHJlX3RpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXJfbG93X3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXJfaGlnaF9yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3ByZV90aW1lcl9sb3dfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9wcmVfdGltZXJfaGlnaF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGFydF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNhbXBsZV9jb3VudGVyX3JlZzsKKworCXVuc2lnbmVkIGludCByYW5nZXNfbGVuOworCW1lNDYwMF9yYW5nZV9lbnRyeV90IHJhbmdlc1s0XTsJCQkJCS8qKjwgVGhlIHJhbmdlcyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuICovCisKKwkvKiBTb2Z0d2FyZSBidWZmZXIgKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkJCQkvKio8IENpcmN1bGFyIGJ1ZmZlciBob2xkaW5nIG1lYXN1cm1lbnQgZGF0YS4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJCQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTQ2MDBfd29ya3F1ZXVlOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWlfY29udHJvbF90YXNrOworI2Vsc2UKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFpX2NvbnRyb2xfdGFzazsKKyNlbmRpZgorCisJdm9sYXRpbGUgaW50IGFpX2NvbnRyb2xfdGFza19mbGFnOwkJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KKworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTQ2MDBfYWlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTQwMDAgYW5hbG9nIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjaGFubmVscyBUaGUgbnVtYmVyIG9mIGFuYWxvZyBpbnB1dCBjaGFubmVscyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuCisgKiBAcGFyYW0gY2hhbm5lbHMgVGhlIG51bWJlciBvZiBhbmFsb2cgaW5wdXQgcmFuZ2VzIGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS4KKyAqIEBwYXJhbSBpc29sYXRlZCBGbGFnIGluZGljYXRpbmcgaWYgdGhpcyBkZXZpY2UgaXMgb3B0byBpc29sYXRlZC4KKyAqIEBwYXJhbSBzaCBGbGFnIGluZGljYXRpbmcgaWYgc2FtcGxlIGFuZCBob2xkIGRldmljZXMgYXJlIGF2YWlsYWJsZS4KKyAqIEBwYXJhbSBpcnEgVGhlIGlycSBudW1iZXIgYXNzaWduZWQgYnkgUENJIEJJT1MuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKm1lNDYwMF9haV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHJhbmdlcywKKwkJCQkJICAgICBpbnQgaXNvbGF0ZWQsCisJCQkJCSAgICAgaW50IHNoLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2ssCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU0NjAwX3dxKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWlfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2ZhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpX3JlZy5oCkBAIC0wLDAgKzEsMTA3IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9haV9yZWcuaAorICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FJX1JFR19IXworI2RlZmluZSBfTUU0NjAwX0FJX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX1JFRwkJCQkJMHg3NAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19SRUcJCQkJMHg3NAkvLyBSL18KKyNkZWZpbmUgTUU0NjAwX0FJX0NIQU5ORUxfTElTVF9SRUcJCQkweDc4CS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfREFUQV9SRUcJCQkJCTB4N0MJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BSV9DSEFOX1RJTUVSX1JFRwkJCTB4ODAJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9DSEFOX1BSRV9USU1FUl9SRUcJCTB4ODQJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0xPV19SRUcJCTB4ODgJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0hJR0hfUkVHCQkweDhDCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfU0NBTl9QUkVfVElNRVJfTE9XX1JFRwkweDkwCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfU0NBTl9QUkVfVElNRVJfSElHSF9SRUcJMHg5NAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVJUX1JFRwkJCQkJMHg5OAkvLyBSL18KKworI2RlZmluZSBNRTQ2MDBfQUlfU0FNUExFX0NPVU5URVJfUkVHCQkweEMwCS8vIF8vVworCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzAJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzEJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzIJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9TQU1QTEVfSE9MRAkJMHgwMDAwMDAwOAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AJMHgwMDAwMDAxMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUAkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8JCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTwkJMHgwMDAwMDA4MAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRlVMTFNDQUxFCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQJCQkweDAwMDAwMjAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0FOQUxPRwkweDAwMDAwNDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHCQkJMHgwMDAwMDgwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HCTB4MDAwMDEwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVAkJMHgwMDAwNDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRCQkJMHgwMDAwODAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUCQkweDAwMDEwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlEJCQkweDAwMDIwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUQkJCTB4MDAwODAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVAkJMHgwMDEwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FECQkweDAwMjAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0JPVEgJCTB4ODAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9DSEFOTkVMCQkweDAwNDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0NIQU5ORUwJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfQ0hBTk5FTAkJMHgwMTAwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBCQkweDAyMDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEJCTB4MDQwMDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfREFUQQkJMHgwODAwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9MRQkJCQkweDEwMDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTQkJCTB4MjAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9SUENJX0ZJRk8JCQkweDQwMDAwMDAwCS8vQWx3YXlzIHNldCB0byB6ZXJvIQorCisjZGVmaW5lIE1FNDYwMF9BSV9CQVNFX0ZSRVFVRU5DWQkJCTMzRTYKKworI2RlZmluZSBNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUwkJCQk2NkxMCisjZGVmaW5lIE1FNDYwMF9BSV9NQVhfQUNRX1RJQ0tTCQkJCTB4RkZGRkZGRkZMTAorCisjZGVmaW5lIE1FNDYwMF9BSV9NSU5fU0NBTl9USUNLUwkJCTY2TEwKKyNkZWZpbmUgTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTCQkJMHhGRkZGRkZGRkZMTAorCisjZGVmaW5lIE1FNDYwMF9BSV9NSU5fQ0hBTl9USUNLUwkJCTY2TEwKKyNkZWZpbmUgTUU0NjAwX0FJX01BWF9DSEFOX1RJQ0tTCQkJMHhGRkZGRkZGRkxMCisKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fQ09VTlQJCQkJMjA0OAorCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX0NPVU5UCQkJCTEwMjQKKworI2RlZmluZSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQJMHgwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMCTB4MDIwCisKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMAkJMHgwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzUJMHgwNDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMTAJMHgwODAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81CTB4MEMwCisKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfTEFTVF9FTlRSWQkJMHgxMDAKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzkyZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hby5jCkBAIC0wLDAgKzEsNjAxMSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfYW8uYworICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvLy9Db21tb24gcGFydC4gKEZvciBub3JtYWwgYW5kIEJvc2NoIGJ1aWxkcy4pCisKKy8qIEluY2x1ZGVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lNDYwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfYW9fcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FvLmgiCisKKy8qIERlZmluZXMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV90aW1lcihtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKmNhcHMpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KTsKKworI2lmbmRlZiBCT1NDSAorLy8vIEBub3RlIE5PUk1BTCBCVUlMRAorLy8vIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UgICAoay5nYW50emtlQG1laWxoYXVzLmRlKQorLyogSW5jbHVkZXMKKyAqLworCisjIGluY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisvKiBEZWZpbmVzCisgKi8KKworLyoqIFJlbW92ZSBzdWJkZXZpY2UuCisqLworc3RhdGljIHZvaWQgbWU0NjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKKworLyoqIFJlc2V0IHN1YmRldmljZS4gU3RvcCBhbGwgYWN0aW9ucy4gUmVzZXQgcmVnaXN0cnkuIERpc2FibGUgRklGTy4gU2V0IG91dHB1dCB0byAwViBhbmQgc3RhdHVzIHRvICdub25lJy4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKKworLyoqIFNldCBvdXRwdXQgYXMgc2luZ2xlCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKKy8qKiBQYXNzIHRvIHVzZXIgYWN0dWFsIHZhbHVlIG9mIG91dHB1dC4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogV3JpdGUgdG8gb3V0cHV0IHJlcXVlZCB2YWx1ZS4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogU2V0IG91dHB1dCBhcyBzdHJlYW1lZCBkZXZpY2UuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncyk7CisKKy8qKiBXYWl0IGZvciAvIENoZWNrIGVtcHR5IHNwYWNlIGluIGJ1ZmZlci4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisvKiogU3RhcnQgc3RyZWFtaW5nLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKy8qKiBDaGVjayBhY3R1YWwgc3RhdGUuIC8gV2FpdCBmb3IgZW5kLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKTsKKworLyoqIFN0b3Agc3RyZWFtaW5nLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CisKKy8qKiBXcml0ZSBkYXRhcyB0byBidWZmb3IuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworLyoqIEludGVycnVwdCBoYW5kbGVyLiBDb3B5IGZyb20gYnVmZmVyIHRvIEZJRk8uCisqLworc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisJCQkJICwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MKKyNlbmRpZgorICAgICk7CisvKiogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpIGluIHdyYXBhcm91bmQgbW9kZS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSAgICBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChmYXN0KS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGEobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChzbG93KS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8gY2lyY3VsYXIgYnVmZmVyLgorKi8KK2ludCBpbmxpbmUgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCAqdXNlcl92YWx1ZXMpOworCisvKiogU3RvcCBwcmVzZW50YXRpb24uIFByZXNlcnZlIEZJRk9zLgorKi8KK2ludCBpbmxpbmUgYW9fc3RvcF9pbW1lZGlhdGVseShtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBUYXNrIGZvciBhc3luY2hyb25pY2FsIHN0YXRlIHZlcmlmeWluZy4KKyovCitzdGF0aWMgdm9pZCBtZTQ2MDBfYW9fd29ya19jb250cm9sX3Rhc2soCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCQkJCQkgICAgICAgdm9pZCAqc3ViZGV2aWNlCisjZWxzZQorCQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrCisjZW5kaWYKKyAgICApOworLyogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IDA7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwkvL1N0b3Agc3RhdGUgbWFjaGluZS4KKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwl0bXAgJj0KKwkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkvL1NldCBzaW5nbGUgbW9kZSwgZGlzc2FibGUgRklGTywgZGlzc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciwgc2V0IG91dHB1dCB0byBhbmFsb2csIGJsb2NrIGludGVycnVwdC4KKwlvdXRsKE1FNDYwMF9BT19NT0RFX1NJTkdMRSB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEsCisJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBNRTQ2MDBfQU9fTU9ERV9TSU5HTEUgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCSAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCSAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEpOworCisJLy9TZXQgb3V0cHV0IHRvIDBWCisJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IDB4ODAwMDsKKworCS8vU2V0IHN0YXR1cyB0byBzaWduYWwgdGhhdCBkZXZpY2UgaXMgdW5jb25maWd1cmVkLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKworCS8vU2lnbmFsIHJlc2V0IGlmIHVzZXIgaXMgb24gd2FpdC4KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmM7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vIENoZWNraW5nIHBhcmFtZXRlcnMKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuIE11c3QgYmUgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzd2l0Y2ggKHRyaWdfdHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX1NXOgorCQlpZiAodHJpZ19lZGdlICE9IE1FX1RSSUdfRURHRV9OT05FKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBTb2Z0d2FyZSB0cmlnZ2VyIGhhcyBub3QgZWRnZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCXN3aXRjaCAodHJpZ19lZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgdHlwZS4gVHJpZ2dlciBtdXN0IGJlIHNvZnR3YXJlIG9yIGRpZ2l0YWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCX0KKworCWlmICgodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKQorCSAgICAmJiAodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKworCWlmIChyZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCByZWZlcmVuY2UuIEFuYWxvZyBvdXRwdXRzIGhhdmUgdG8gaGF2ZSBnb3QgUkVGX0FPX0dST1VORC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKHNpbmdsZV9jb25maWcgIT0gMCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBzaW5nbGUgY29uZmlnIHNwZWNpZmllZC4gT25seSBvbmUgcmFuZ2UgZm9yIGFubG9nIG91dHB1dHMgaXMgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuIEFuYWxvZyBvdXRwdXQgaGF2ZSBvbmx5IG9uZSBjaGFubmVsLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9TdWJkZXZpY2UgcnVubmluZyBpbiBzdHJlYW0gbW9kZSEKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCkKKwkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPCBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgYnVzeS5cbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorLy8vIEBub3RlIEZvciBzaW5nbGUgYWxsIGNhbGxzIChjb25maWcgYW5kIHdyaXRlKSBhcmUgZXJhc2luZyBwcmV2aW91cyBzdGF0ZSEKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKworCS8vIENvcnJlY3Qgc2luZ2xlIG1pcnJvcnMKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJLy9TdG9wIGRldmljZQorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCS8vIFNldCBjb250cm9sIHJlZ2lzdGVyLgorCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJLy8gU2V0IHN0b3AgYml0LiBTdG9wIHN0cmVhbWluZyBtb2RlLgorCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkvL1Jlc2V0IGFsbCBiaXRzLgorCWN0cmwgPSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUDsKKworCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKworCQlpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9BTlkpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9GQUxMSU5HKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9SSVNJTkcpIHsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IDB4MDsKKwkJfQorCX0gZWxzZSBpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQlQREVCVUcoIlNvZnR3YXJlIHRyaWdnZXJcbiIpOworCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJfQorCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwkvLyBTZXQgcHJlbG9hZC9zeW5jaHJvbml6YXRpb24gcmVnaXN0ZXIuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkJICAgIH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJfSBlbHNlCQkJLy9pZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkKKwl7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8PQorCQkgICAgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwl9CisKKwlpZiAodHJpZ19jaGFuID09IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKSB7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkgICAgfihNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpOworCX0gZWxzZQkJCS8vaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpCisJeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwl9CisKKwkvL1Jlc2V0IGhhcmR3YXJlIHJlZ2lzdGVyCisJc3luYyA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmMpOworCXN5bmMgJj0gfihNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwlzeW5jIHw9IE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCS8vT3V0cHV0IGNvbmZpZ3VyZWQgaW4gZGVmYXVsdCAoc2FmZSkgbW9kZS4KKwlvdXRsKHN5bmMsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmMpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gJWRcbiIsIGZsYWdzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyA8PSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKwlpZiAoKCFmbGFncykgJiYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCkpIHsJLy9CbG9ja2luZyBtb2RlLiBXYWl0IGZvciB0cmlnZ2VyLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKwkJCWlmIChkZWxheSA9PSAwKQorCQkJCWRlbGF5ID0gMTsKKwkJfQorCisJCWogPSBqaWZmaWVzOworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBUaGlzIHByb2NlZHVyZSBoYXMgb3duIHRpbWVvdXQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisKKwkJKnZhbHVlID0KKwkJICAgICghZXJyKSA/IGluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA6IGluc3RhbmNlLT4KKwkJICAgIHNpbmdsZV92YWx1ZTsKKwl9IGVsc2UgewkJLy9Ob24tYmxvY2tpbmcgbW9kZQorCQkvL1JlYWQgdmFsdWUKKwkJKnZhbHVlID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMHgwOworCisJLy9SZWdpc3RyeSBoYW5kbGluZyB2YXJpYWJsZXMuCisJdWludDMyX3Qgc3luY19tYXNrOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgdG1wOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3RhdHVzOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMgfAorCSAgICAgIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodmFsdWUgJiB+TUU0NjAwX0FPX01BWF9EQVRBKSB7CisJCVBFUlJPUigiSW52YWxpZCB2YWx1ZSBwcm92aWRlZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fVkFMVUVfT1VUX09GX1JBTkdFOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkKKwkgICAgfHwgKGluc3RhbmNlLT5zdGF0dXMgPiBhb19zdGF0dXNfc2luZ2xlX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworLy8vIEBub3RlIEZvciBzaW5nbGUgYWxsIGNhbGxzIChjb25maWcgYW5kIHdyaXRlKSBhcmUgZXJhc2luZyBwcmV2aW91cyBzdGF0ZSEKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy8gQ29ycmVjdCBzaW5nbGUgbWlycm9ycworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkvL1N0b3AgZGV2aWNlCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSB2YWx1ZTsKKworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy9ObyBGSUZPCisJCS8vU2V0IHRoZSBzaW5nbGUgbW9kZS4KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCisJCS8vV3JpdGUgdmFsdWUKKwkJUERFQlVHKCJXcml0ZSB2YWx1ZVxuIik7CisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9IGVsc2UgewkJLy8gbWl4LW1vZGUKKwkJLy9TZXQgc3BlZWQKKwkJb3V0bChNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwkJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGludClNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MpOworCQlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IEhaIC8gMTA7CS8vMTAwbXMKKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisJCS8vU2V0IHRoZSBjb250aW5vdXMgbW9kZS4KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQljdHJsIHw9IE1FNDYwMF9BT19NT0RFX0NPTlRJTlVPVVM7CisKKwkJLy9QcmVwYXJlIEZJRk8KKwkJaWYgKCEoY3RybCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuCisJCQlQSU5GTygiRW5hYmxlaW5nIEZJRk8uXG4iKTsKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJY3RybCB8PQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTyB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJfSBlbHNlIHsJLy9DaGVjayBpZiBGSUZPIGlzIGVtcHR5CisJCQlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpIHsJLy9GSUZPIG5vdCBlbXB0eQorCQkJCVBJTkZPKCJSZXNldGluZyBGSUZPLlxuIik7CisJCQkJY3RybCAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTyB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEpOworCQkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCQkJY3RybCB8PQorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJfSBlbHNlIHsJLy9GSUZPIGVtcHR5LCBvbmx5IGludGVycnVwdCBuZWVkcyB0byBiZSBkaXNhYmxlZCEKKwkJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQl9CisJCX0KKworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vV3JpdGUgb3V0cHV0IC0gMSB2YWx1ZSB0byBGSUZPCisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQlvdXRsKHZhbHVlIDw8PSAxNiwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSA8PD0gMTYpOworCQl9IGVsc2UgeworCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSk7CisJCX0KKwl9CisKKwltb2RlID0gKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzID4+IGluc3RhbmNlLT5hb19pZHg7CisJbW9kZSAmPSAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKTsKKworCVBJTkZPKCJUcmlnZ2VyaW5nIG1vZGU6IDB4JXhcbiIsIG1vZGUpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlzeW5jX21hc2sgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2spOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoJCS8vSW5kaXZpZHVhbCBzb2Z0d2FyZQorCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgewkvLyBObyBGSUZPIC0gSW4gdGhpcyBjYXNlIHJlc2V0dGluZyAnTUU0NjAwX0FPX1NZTkNfSE9MRCcgd2lsbCB0cmlnZ2VyIG91dHB1dC4KKwkJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSBNRTQ2MDBfQU9fU1lOQ19IT0xEKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlLiBUaGlzIGlzIGV4Y2VwdGlvbi4gSXQgaXMgc2V0IHRvIHN5bmNocm9ub3VzIGFuZCB0cmlnZ2VyZWQgbGF0ZXIuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJc3luY19tYXNrIHw9CisJCQkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gRklGTworCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IDB4MCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZS4KKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfigoTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgfAorCQkJCSAgICAgICBNRTQ2MDBfQU9fU1lOQ19IT0xEKSA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfQorCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRzoJLy9JbmRpdmlkdWFsIGhhcmR3YXJlCisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy8gTm8gRklGTyAtIEluIHRoaXMgY2FzZSByZXNldHRpbmcgJ01FNDYwMF9BT19TWU5DX0hPTEQnIHdpbGwgdHJpZ2dlciBvdXRwdXQuCisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU0NjAwX0FPX1NZTkNfSE9MRCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCXN5bmNfbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0gZWxzZSB7CS8vIEZJRk8KKwkJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSAweDApIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oKE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIHwKKwkJCQkgICAgICAgTUU0NjAwX0FPX1NZTkNfSE9MRCkgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FNDYwMF9BT19TWU5DX0hPTEQ6CS8vU3luY2hyb25vdXMgc29mdHdhcmUKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHN5bmNfbWFzayAmICgoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU0NjAwX0FPX1NZTkNfSE9MRCkKKwkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQlzeW5jX21hc2sgfD0KKwkJCSAgICBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19tYXNrICY9IH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlzeW5jX21hc2sgfD0gTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisJCWJyZWFrOworCisJY2FzZSAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKToJLy9TeW5jaHJvbm91cyBoYXJkd2FyZQorCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQlzeW5jX21hc2sgfD0KKwkJCSAgICAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgIGluc3RhbmNlLT5hb19pZHg7CisKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0KKwkJYnJlYWs7CisJfQorLy8gICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsgICAgICAgIC8vIE1vdmVkIGRvd24uCisKKwkvL0FjdGl2YXRlIElTTSAocmVtb3ZlICdzdG9wJyBiaXRzKQorCWN0cmwgJj0KKwkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEgpOworCWN0cmwgfD0gaW5zdGFuY2UtPmN0cmxfdHJnOworCWN0cmwgJj0gfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKy8vLyBAbm90ZSBXaGVuIGZsYWcgJ01FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMnIGlzIHNldCB0aGFuIG91dHB1dCBpcyB0cmlnZ2VyZWQuIEFMV0FZUyEKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy9ObyBGSUZPCisJCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9GaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cy4KKwkJCXRtcCA9IH4oKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHwgMHhGRkZGMDAwMCk7CisJCQlQSU5GTworCQkJICAgICgiRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMuIG1hc2s6MHglMDh4XG4iLAorCQkJICAgICB0bXApOworCQkJdG1wIHw9IHN5bmNfbWFzayAmIDB4RkZGRjAwMDA7CisJCQkvLyBBZGQgdGhpcyBjaGFubmVsIHRvIGxpc3QKKwkJCXRtcCAmPSB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9IGVsc2UgaWYgKCFtb2RlKSB7CS8vIEFkZCB0aGlzIGNoYW5uZWwgdG8gbGlzdAorCQkJb3V0bChzeW5jX21hc2sgJgorCQkJICAgICB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrICYgfihNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8CisJCQkJCQkgaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisKKwl9IGVsc2UgewkJLy8gbWl4LW1vZGUgLSBiZWdpbgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisJCQkvL0FkZCBjaGFubmVsIHRvIHN0YXJ0IGxpc3QKKwkJCW91dGwoc3luY19tYXNrIHwKKwkJCSAgICAgKE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrIHwgKE1FNDYwMF9BT19TWU5DX0hPTEQgPDwKKwkJCQkJCWluc3RhbmNlLT5hb19pZHgpKTsKKworCQkJLy9GaXJlCisJCQlQSU5GTworCQkJICAgICgiRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMgYnkgc29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgMHg4MDAwKTsKKworCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0gZWxzZSBpZiAoIW1vZGUpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKy8qCQkJLy9SZW1vdmUgY2hhbm5lbCBmcm9tIHN0YXJ0IGxpc3QgLy88PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCQlvdXRsKHN5bmNfbWFzayAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworKi8KKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIDB4ODAwMCk7CisKKy8qCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MgLy88PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2spOworKi8KKwkJfQorCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwlqID0gamlmZmllczsKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDsKKworCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gZGVsYXk7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGo7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNDYwMF93b3JrcXVldWUsCisJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisKKwlpZiAoIShmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoKCghZGVsYXkpIHx8ICgoamlmZmllcyAtIGopIDw9IGRlbGF5KSkKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zaW5nbGVfZW5kKSkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQl9IGVsc2UgeworCQkJCWlmICgoamlmZmllcyAtIGopID4gZGVsYXkpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkJICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCQl9CisKKwkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCX0KKworCQkJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDY0X3QgY29udl90aWNrczsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NMb3c7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfaGlnaCA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0hpZ2g7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJY29udl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCisJaWYgKGZsYWdzICYKKwkgICAgfihNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgfCBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQKKwkgICAgICB8IE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkpIHsKKwkJaWYgKCFmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJIYXJkd2FyZSBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgaGFzIHRvIGJlIHdpdGggTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ELlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkKKwkJICAgIHx8ICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlIG11c3QgYmUgaW4gaW5maW5pdGUgbW9kZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKwl9CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIk9ubHkgMSBlbnRyeSBpbiBjb25maWcgbGlzdCBhY2NlcHRhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pQ2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaVN0cmVhbUNvbmZpZyAhPSAwKSB7CisJCVBFUlJPUigiT25seSBvbmUgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUUkVBTV9DT05GSUc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IoIk91dHB1dCBpcyByZWZlcmVuY2VkIHRvIGdyb3VuZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlGbGFncykgeworCQlQRVJST1IoIkludmFsaWQgY29uZmlnIGxpc3QgZmxhZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSAhPSBNRV9UUklHX0VER0VfTk9ORSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfRk9MTE9XKSB7CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKHRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfVElNRVIpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKwl9CisKKwlpZiAoKGNvbnZfdGlja3MgPCBNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MpCisJICAgIHx8IChjb252X3RpY2tzID4gTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTKSkgeworCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NMb3cgfHwgdHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoKSB7CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAodHJpZ2dlci0+aVNjYW5TdGFydFRpY2tzTG93IHx8IHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0hpZ2gpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9BUkc7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCAhPSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIGNvdW50IHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfQVJHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJUaGUgY29udGlub3VzIG1vZGUgaGFzIG5vdCAnc2NhbicgY29udGVjdHMuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50ICE9IDApIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX0FSRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50IDw9IDApIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJUaGUgY29udGlub3VzIG1vZGUgaGFzIG5vdCAnc2NhbicgY29udGVjdHMuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbikgeworCWNhc2UgTUVfVFJJR19DSEFOX0RFRkFVTFQ6CisJY2FzZSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVM6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdGFydCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0NIQU47CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pICYmICFpbnN0YW5jZS0+Yml0cGF0dGVybikgeworCQlQRVJST1IoIlRoaXMgc3ViZGV2aWNlIG5vdCBzdXBwb3J0IG91dHB1dCByZWRpcmVjdGlvbi5cbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCS8vU3RvcCBkZXZpY2UKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy9DaGVjayBpZiBzdGF0ZSBtYWNoaW5lIGlzIHN0b3BwZWQuCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCS8vUmVzZXQgY29udHJvbCByZWdpc3Rlci4gQmxvY2sgYWxsIGFjdGlvbnMuIERpc2FibGUgSVJRLiBEaXNhYmxlIEZJRk8uCisJY3RybCA9CisJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9UaGlzIGlzIHBhcmFub2ljLCBidXQgdG8gYmUgc3VyZS4KKwlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCS8qIFNldCBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgewkvL1dyYXBhcm91bmQKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUElORk8oIkhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX01PREVfV1JBUEFST1VORDsKKwkJCWluc3RhbmNlLT5tb2RlID0gTUU0NjAwX0FPX0hXX1dSQVBfTU9ERTsKKwkJfSBlbHNlIHsJLy9Tb2Z0d2FyZSB3cmFwYXJvdW5kCisJCQlQSU5GTygiU29mdHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTOworCQkJaW5zdGFuY2UtPm1vZGUgPSBNRTQ2MDBfQU9fU1dfV1JBUF9NT0RFOworCQl9CisJfSBlbHNlIHsJCS8vQ29udGlub3VzCisJCVBJTkZPKCJDb250aW5vdXMuXG4iKTsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTOworCQlpbnN0YW5jZS0+bW9kZSA9IE1FNDYwMF9BT19DT05USU5PVVM7CisJfQorCisJLy9TZXQgdGhlIHRyaWdnZXIgZWRnZS4KKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vU2V0IHRoZSB0cmlnZ2VyIHR5cGUgYW5kIGVkZ2UgZm9yIGV4dGVybmFsIHRyaWdnZXIuCisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSBNRTQ2MDBfQU9fRVhUX1RSSUc7CisvKgorCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisqLworCQlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogcmlzaW5nLlxuIik7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJUElORk8oIlNldCB0aGUgdHJpZ2dlciBlZGdlOiBmYWxsaW5nLlxuIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogYm90aCBlZGdlcy5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlQSU5GTygiSW50ZXJuYWwgc29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSA9IDA7CisJfQorCisJLy9TZXQgdGhlIHN0b3AgbW9kZSBhbmQgdmFsdWUuCisJaWYgKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CS8vQW1vdW50IG9mIGRhdGEKKwkJaW5zdGFuY2UtPnN0b3BfbW9kZSA9IE1FNDYwMF9BT19BQ1FfU1RPUF9NT0RFOworCQlpbnN0YW5jZS0+c3RvcF9jb3VudCA9IHRyaWdnZXItPmlBY3FTdG9wQ291bnQ7CisJfSBlbHNlIGlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpIHsJLy9BbW91bnQgb2YgJ3NjYW5zJworCQlpbnN0YW5jZS0+c3RvcF9tb2RlID0gTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFOworCQlpbnN0YW5jZS0+c3RvcF9jb3VudCA9IHRyaWdnZXItPmlTY2FuU3RvcENvdW50OworCX0gZWxzZSB7CQkvL0luZmluaXRlCisJCWluc3RhbmNlLT5zdG9wX21vZGUgPSBNRTQ2MDBfQU9fSU5GX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSAwOworCX0KKworCVBJTkZPKCJTdG9wIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2NvdW50KTsKKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpIHsJLy9TeW5jaHJvbm91cyBzdGFydAorCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSB8PSBNRTQ2MDBfQU9fU1lOQ19IT0xEOworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vRXh0ZXJuYWx5IHRyaWdnZXJlZAorCQkJUElORk8oIlN5bmNocm9ub3VzIHN0YXJ0LiBFeHRlcm5hbHkgdHJpZ2dlciBhY3RpdmUuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGFydF9tb2RlIHw9IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHOworCQl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJCWVsc2UgeworCQkJUElORk8KKwkJCSAgICAoIlN5bmNocm9ub3VzIHN0YXJ0LiBFeHRlcm5hbHkgdHJpZ2dlciBkaXNzYWJsZWQuXG4iKTsKKwkJfQorI2VuZGlmCisKKwl9CisJLy9TZXQgc3BlZWQKKwlvdXRsKGNvbnZfdGlja3MgLSAyLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJ0aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGx4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT50aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGNvbnZfdGlja3MgLSAyKTsKKwlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IChpbnQpKGNvbnZfdGlja3MgKiBIWikgLyBNRTQ2MDBfQU9fQkFTRV9GUkVRVUVOQ1k7CS8vPD09IE1VU1QgYmUgd2l0aCBjYXN0IQorCisJLy9Db25lY3Qgb3V0cHV0cyB0byBhbmFsb2cgb3IgZGlnaXRhbCBwb3J0LgorCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pIHsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0RPOworCX0KKwkvLyBXcml0ZSB0aGUgY29udHJvbCB3b3JkCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCS8vU2V0IHN0YXR1cy4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwlsb25nIGo7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJUEVSUk9SKCJDaXJjdWxhciBidWZmZXIgbm90IGV4aXN0cy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhlIGJ1ZmZlciBpcyBOT1QgZnVsbC4KKwkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJfSBlbHNlIHsJCS8vVGhlIGJ1ZmZlciBpcyBmdWxsLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCQlpZiAodCA9PSAwKQorCQkJCXQgPSAxOworCQl9IGVsc2UgewkvL01heCB0aW1lLgorCQkJdCA9IExPTkdfTUFYOworCQl9CisKKwkJKmNvdW50ID0gMDsKKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBJbnRlcnJ1cHRzIGFyZSB3aGVuIEZJRk8gSEYgaXMgc2lnbmFsZWQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfc3BhY2UKKwkJCQkJCSAgICgmaW5zdGFuY2UtPmNpcmNfYnVmKSkKKwkJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpCisJCQkJCQkgICAgICAgJgorCQkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpLAorCQkJCQkJIHQpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQlQRVJST1IoIkFPIHN1YmRldmljZSBpcyBub3QgcnVubmluZy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfSBlbHNlIGlmICgoamlmZmllcyAtIGopID49IHQpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgdGltZWQgb3V0LlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9IGVsc2UgewkvL1VmZi4uLiBhbGwgaXMgZ29vZC4gSW5mb3JtIHVzZXIgYWJvdXQgZW1wdHkgc3BhY2UuCisJCQkqY291bnQgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmNoOworCWludCBjb3VudCA9IDA7CisJaW50IGNpcmNfYnVmZmVyX2NvdW50OworCisJdW5zaWduZWQgbG9uZyByZWY7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzICYgfk1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvL0NoZWNraW5nIGFjdHVhbCBtb2RlLgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vQ29ycmVjdCBtb2RlcyEKKwkJYnJlYWs7CisKKwkJLy9UaGUgZGV2aWNlIGlzIGluIHdyb25nIG1vZGUuCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJUERFQlVHKCJCZWZvcmUgcmVzdGFydCBicm9rZSBzdHJlYW0gJ1NUT1AnIG11c3QgYmUgY2FsZWQuXG4iKTsKKwkJcmV0dXJuIE1FX1NUQVRVU19FUlJPUjsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJUERFQlVHKCJTdHJlYW0gaXMgYWxyZWFkeSB3b3JraW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKworCWRlZmF1bHQ6CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIlN0YXR1cyBpcyBpbiB3cm9uZyBzdGF0ZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJY2lyY19idWZmZXJfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlpZiAoIWNpcmNfYnVmZmVyX2NvdW50ICYmICFpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KSB7CS8vTm8gdmFsdWVzIGluIGJ1ZmZlcgorCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJUEVSUk9SKCJObyB2YWx1ZXMgaW4gYnVmZmVyIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19MQUNLX09GX1JFU09VUkNFUzsKKwl9CisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKwkvL1NldCB2YWx1ZXMgZm9yIHNpbmdsZV9yZWFkKCkKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gTUU0NjAwX0FPX01BWF9EQVRBICsgMTsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBNRTQ2MDBfQU9fTUFYX0RBVEEgKyAxOworCisJLy9TZXR0aW5nIHN0b3AgcG9pbnRzCisJaWYgKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFKSB7CisJCWluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPQorCQkgICAgaW5zdGFuY2UtPnN0b3BfY291bnQgKiBjaXJjX2J1ZmZlcl9jb3VudDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID0gaW5zdGFuY2UtPnN0b3BfY291bnQ7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApCisJICAgICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDwgY2lyY19idWZmZXJfY291bnQpKSB7CisJCVBFUlJPUigiTW9yZSBkYXRhIGluIGJ1ZmZlciB0aGFuIHByZXZpb3VzbHkgc2V0IGxpbWl0IVxuIik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy9DaGVjayBGSUZPCisJaWYgKCEoY3RybCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuIDw9IFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdXNlciBjYWxsIHdpdGggTUVfV1JJVEVfTU9ERV9QUkVMT0FECisJCVBJTkZPKCJFbmFibGVpbmcgRklGTy5cbiIpOworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCX0gZWxzZSB7CQkvL0Jsb2NrIElSUQorCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgY3RybCB8IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEpOworCisJLy9GaWxsIEZJRk8gPD0gR2VuZXJhbHkgdGhpcyBzaG91bGQgYmUgZG9uZSBieSB1c2VyIHByZS1sb2FkIGNhbGwgYnV0IHRoaXMgaXMgc2Vjb25kIHBsYWNlIHRvIGRvIGl0LgorCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpKSB7CS8vRklGTyBlbXB0eQorCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA9PSAwKSB7CisJCQljb3VudCA9IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCQl9IGVsc2UgeworCQkJY291bnQgPQorCQkJICAgIChNRTQ2MDBfQU9fRklGT19DT1VOVCA8CisJCQkgICAgIGluc3RhbmNlLT4KKwkJCSAgICAgc3RvcF9kYXRhX2NvdW50KSA/IE1FNDYwMF9BT19GSUZPX0NPVU5UIDoKKwkJCSAgICBpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50OworCQl9CisKKwkJLy9Db3B5IGRhdGEKKwkJY291bnQgPQorCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCisJCWlmIChjb3VudCA8IDApIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCX0KKwl9CisJLy9TZXQgcHJlLWxvYWQgZmVhdHVyZXMuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCXN5bmNoICY9CisJICAgIH4oKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCSAgICAgIGFvX2lkeCk7CisJc3luY2ggfD0KKwkgICAgKGluc3RhbmNlLT5zdGFydF9tb2RlICYgfk1FNDYwMF9BT19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJLy9EZWZhdWx0IGNvdW50IGlzICcwJworCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTQ2MDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3VudDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfSBlbHNlIHsJCS8vV3JhcGFyb3VuZAorCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3VudDsKKworCQkvL1NwZWNpYWwgY2FzZTogSW5maW5pdGUgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBGSUZPIGRhdGFzIGFsd2F5cyBzaG91bGQgcnVucyBpbiBoYXJkd2FyZSBtb2RlLgorCQlpZiAoKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU0NjAwX0FPX0lORl9TVE9QX01PREUpCisJCSAgICAmJiAoY2lyY19idWZmZXJfY291bnQgPD0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpKSB7CS8vQ2hhbmdlIHRvIGhhcmR3YXJlIHdyYXBhcm91bmQKKwkJCVBERUJVRworCQkJICAgICgiQ2hhbmdlaW5nIG1vZGUgZnJvbSBzb2Z0d2FyZSB3cmFwYXJvdW5kIHRvIGhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCS8vQ29weSBhbGwgZGF0YQorCQkJY291bnQgPQorCQkJICAgIGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNpcmNfYnVmZmVyX2NvdW50LAorCQkJCQkgIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9XUkFQQVJPVU5EOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPT0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vUmVzZXQgcG9zaXRpb24gaW5kaWNhdG9yLgorCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA+IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlBSRUxPQURFRCBNT1JFIFZBTFVFUyBUSEFOIEFSRSBJTiBCVUZGRVIhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0KKworCS8vU2V0IHN0YXR1cyB0byAnd2FpdCBmb3Igc3RhcnQnCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ7CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCS8vU3RhcnQgc3RhdGUgbWFjaGluZSBhbmQgaW50ZXJydXB0cworCWN0cmwgJj0gfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJaWYgKGluc3RhbmNlLT5zdGFydF9tb2RlID09IE1FNDYwMF9BT19FWFRfVFJJRykgewkvLyBFeHRlcm5hbCB0cmlnZ2VyLgorCQlQSU5GTygiRXh0ZXJuYWwgdHJpZ2dlci5cbiIpOworCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwl9CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vTW9yZSB0aGFuIGhhbGYhCisJCWlmICgoY3RybCAmIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSykgPT0gTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUykgewkvL0VuYWJsZSBJUlEgb25seSB3aGVuIGhhcmR3YXJlX2NvbnRpbm91cyBpcyBzZXQgYW5kIEZJRk8gaXMgbW9yZSB0aGFuIGhhbGYKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJLy9UcmlnZ2VyIG91dHB1dAorCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJLy9BZGQgY2hhbm5lbCB0byBzdGFydCBsaXN0CisJCW91dGwoc3luY2ggfCAoTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwKKwkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgc3luY2ggfCAoTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSk7CisKKwkJLy9GaXJlCisJCVBJTkZPCisJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzIGJ5IHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2gpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJfSBlbHNlIGlmICghaW5zdGFuY2UtPnN0YXJ0X21vZGUpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKy8qCisJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0LgkvLyA8PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJb3V0bChzeW5jaCAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSk7CisqLworCQkvL0ZpcmUKKwkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKy8qCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncy4JLy8gPD09IFVubmVjZXNzYXJ5LiBSZW1vdmVkLgorCQkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKyovCisJfQorCS8vIFNldCBjb250cm9sIHRhc2sncyB0aW1lb3V0CisJcmVmID0gamlmZmllczsKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IGRlbGF5OworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSByZWY7CisKKwlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpIHsJLy9MZXNzIHRoYW4gaGFsZiBidXQgbm90IGVtcHR5IQorCQlQSU5GTygiTGVzcyB0aGFuIGhhbGYuXG4iKTsKKwkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgIT0gMCkgeworCQkJY291bnQgPSBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDI7CisJCX0gZWxzZSB7CisJCQljb3VudCA9CisJCQkgICAgKChNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIpIDwKKwkJCSAgICAgaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCkgPyBNRTQ2MDBfQU9fRklGT19DT1VOVCAvCisJCQkgICAgMiA6IGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQ7CisJCX0KKworCQkvL0NvcHkgZGF0YQorCQljb3VudCA9CisJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisKKwkJaWYgKGNvdW50IDwgMCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggRVJST1IhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCX0gZWxzZSB7CS8vV3JhcGFyb3VuZAorCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCisJCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9PSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9SZXNldCBwb3NpdGlvbiBpbmRpY2F0b3IuCisJCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPiBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIlBSRUxPQURFRCBNT1JFIFZBTFVFUyBUSEFOIEFSRSBJTiBCVUZGRVIhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCX0KKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikpIHsJLy9Nb3JlIHRoYW4gaGFsZiEKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0KKwl9CisJLy9TcGVjaWFsIGNhc2U6IExpbWl0ZWQgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBIQUxGIEZJRk8gZGF0YXMgbmVlZCB3b3JrIGFyb3VuZCB0byBnZW5lcmF0ZSBmaXJzdCBpbnRlcnJ1cHQuCisJaWYgKChpbnN0YW5jZS0+c3RvcF9tb2RlICE9IE1FNDYwMF9BT19JTkZfU1RPUF9NT0RFKQorCSAgICAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX1NXX1dSQVBfTU9ERSkKKwkgICAgJiYgKGNpcmNfYnVmZmVyX2NvdW50IDw9IChNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIpKSkgewkvL1B1dCBtb3JlIGRhdGEgdG8gRklGTworCQlQSU5GTygiTGltaXRlZCB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEhBTEYgRklGTyBkYXRhcy5cbiIpOworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJd2hpbGUgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPiBpbnN0YW5jZS0+ZGF0YV9jb3VudCkgewkvL01heGltdW0gZGF0YSBub3Qgc2V0IGpldC4KKwkJCS8vQ29weSB0byBidWZmZXIKKwkJCWlmIChjaXJjX2J1ZmZlcl9jb3VudCAhPSBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjaXJjX2J1ZmZlcl9jb3VudCwgMCkpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjaXJjX2J1ZmZlcl9jb3VudDsKKworCQkJaWYgKCEoKHN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vRklGTyBpcyBtb3JlIHRoYW4gaGFsZi4gRW5hYmxlIElSUSBhbmQgZW5kIGNvcHkuCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLy8gU2NoZWR1bGUgY29udHJvbCB0YXNrLgorCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDE7CisJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCisJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgewkvL1dhaXQgZm9yIHN0YXJ0LgorCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgKworCQkJCQkJIDEgOiBMT05HX01BWCk7CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fcnVuKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQREVCVUcoIlN0YXJ0aW5nIHN0cmVhbSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfSBlbHNlIGlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIHJlZikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX3J1bikgeworCQkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChqaWZmaWVzIC0gcmVmKSA+IGRlbGF5KSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQkJCX0KKwkJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHdhaXQgIT0gTUVfV0FJVF9OT05FKSAmJiAod2FpdCAhPSBNRV9XQUlUX0lETEUpKSB7CisJCVBFUlJPUigiSW52YWxpZCB3YWl0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dBSVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3dpdGNoIChpbnN0YW5jZS0+c3RhdHVzKSB7CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW46CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19CVVNZOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX25vbmU6CisJZGVmYXVsdDoKKwkJKnN0YXR1cyA9CisJCSAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgPworCQkgICAgTUVfU1RBVFVTX0JVU1kgOiBNRV9TVEFUVVNfSURMRTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCh3YWl0ID09IE1FX1dBSVRfSURMRSkgJiYgKCpzdGF0dXMgPT0gTUVfU1RBVFVTX0JVU1kpKSB7CisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zaW5nbGVfcnVuKQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX3J1bikKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpKSwKKwkJCQkJCSBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCVBERUJVRygiV2FpdCBmb3IgSURMRSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBmb3IgSURMRSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJfQorCisJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CQkJCS8vIFN0b3Agd29yayBhbmQgZW1wdHkgYnVmZmVyIGFuZCBGSUZPCisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl2b2xhdGlsZSB1aW50MzJfdCBjdHJsOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU1RSRUFNX1NUT1BfUFJFU0VSVkVfQlVGRkVSUykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkKKwkgICAgJiYgKHN0b3BfbW9kZSAhPSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRSkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0b3AgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RPUF9NT0RFOworCX0KKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGluc3RhbmNlLT5zdGF0dXMgPCBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpIHsKKwkJLy9UaGVyZSBpcyBub3RoaW5nIHRvIHN0b3AhCisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBpbiBzdHJlYW1pbmcgbW9kZS4gJWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL01hcmsgYXMgc3RvcHBpbmcuID0+IFNvZnR3YXJlIHN0b3AuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ7CisKKwlpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpIHsJLy9TdG9wcGVkIG5vdyEKKwkJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpICYgTUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQlpZiAoY3RybCA9PSBNRTQ2MDBfQU9fTU9ERV9XUkFQQVJPVU5EKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZCA9PiBIYXJkd2FyZSBzdG9wLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIlN0b3BwaW5nIHN0cmVhbSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIlN0b3BwaW5nIHN0cmVhbSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9CisJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwKKwkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwlpZiAoIWZsYWdzKSB7CQkvL1Jlc2V0IEZJRk8KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCX0KKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICghZmxhZ3MpIHsJCS8vUmVzZXQgc29mdHdhcmUgYnVmZmVyCisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHJlZ19jb3B5OworCisJaW50IGNvcGllZF9mcm9tX3VzZXIgPSAwOworCWludCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyID0gKmNvdW50OworCisJaW50IGNvcGllZF92YWx1ZXM7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vQ2hlY2tpbmcgYXJndW1lbnRzCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgqY291bnQgPD0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY291bnQgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwl9CisKKwlpZiAodmFsdWVzID09IE5VTEwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFkZHJlc3Mgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9QT0lOVEVSOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgfHwgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkKSkgewkvL1RoZSBkZXZpY2UgaXMgaW4gc2luZ2xlIG1vZGUuCisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorLy8vIEBub3RlIElmIG5vICdwcmUtbG9hZCcgaXMgdXNlZC4gc3RyZWFtX3N0YXJ0KCkgd2lsbCBtb3ZlIGRhdGEgdG8gRklGTy4KKwlzd2l0Y2ggKHdyaXRlX21vZGUpIHsKKwljYXNlIE1FX1dSSVRFX01PREVfUFJFTE9BRDoKKworCQkvL0RldmljZSBtdXN0IGJlIHN0b3BwZWQuCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiU3ViZGV2aWNlIG11c3RuJ3QgYmUgcnVuaW5nIHdoZW4gJ3ByZS1sb2FkJyBtb2RlIGlzIHVzZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNRV9XUklURV9NT0RFX05PTkJMT0NLSU5HOgorCWNhc2UgTUVfV1JJVEVfTU9ERV9CTE9DS0lORzoKKwkJLy8vIEBub3RlIEluIGJsb2NraW5nIG1vZGU6IFdoZW4gZGV2aWNlIGlzIG5vdCBydW5pbmcgYW5kIHRoZXJlIGlzIG5vdCBlbm91Z2h0IHNwYWNlIGNhbGwgd2lsbCBibG9ja2VkIHVwIQorCQkvLy8gQG5vdGUgU29tZSBvdGhlciB0aHJlYWQgbXVzdCBlbXB0eSBidWZmZXIgYnkgc3RhcnRpbmcgZW5naW5lLgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCB3cml0ZSBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFOworCX0KKworCWlmIChpbnN0YW5jZS0+bW9kZSAmIE1FNDYwMF9BT19XUkFQX01PREUpIHsJLy9XcmFwYXJvdW5kIG1vZGUuIERldmljZSBtdXN0IGJlIHN0b3BwZWQuCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiU3ViZGV2aWNlIG11c3RuJ3QgYmUgcnVuaW5nIHdoZW4gJ3ByZS1sb2FkJyBtb2RlIGlzIHVzZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dSSVRFX01PREU7CisJCX0KKwl9CisKKwlpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19IV19XUkFQX01PREUpICYmICh3cml0ZV9tb2RlICE9IE1FX1dSSVRFX01PREVfUFJFTE9BRCkpIHsJLy8gaGFyZHdhcmUgd3JhcF9hcm91bmQgbW9kZS4KKwkJLy9UaGlzIGlzIHRyYW5zcGFyZW50IGZvciB1c2VyLgorCQlQREVCVUcoIkNoYW5naW5nIHdyaXRlX21vZGUgdG8gTUVfV1JJVEVfTU9ERV9QUkVMT0FELlxuIik7CisJCXdyaXRlX21vZGUgPSBNRV9XUklURV9NT0RFX1BSRUxPQUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vSW5pdCBlbnZpcm9tZW50IC0gcHJlbG9hZAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL0NoZWNrIEZJRk8KKwkJaWYgKCEocmVnX2NvcHkgJiBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8pKSB7CS8vRklGTyBub3QgYWN0aXZlLiBFbmFibGUgaXQuCisJCQlyZWdfY29weSB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQkvL0NvcHkgdG8gYnVmZmVyLiBUaGlzIHN0ZXAgaXMgY29tbW9uIGZvciBhbGwgbW9kZXMuCisJCWNvcGllZF9mcm9tX3VzZXIgPQorCQkgICAgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKGluc3RhbmNlLCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyLAorCQkJCQkgIHZhbHVlcyArICgqY291bnQgLQorCQkJCQkJICAgIGxlZnRfdG9fY29weV9mcm9tX3VzZXIpKTsKKwkJbGVmdF90b19jb3B5X2Zyb21fdXNlciAtPSBjb3BpZWRfZnJvbV91c2VyOworCisJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAhKHJlZ19jb3B5ICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL0JST0tFTiBQSVBFISBUaGUgc3RhdGUgbWFjaGluZSBpcyBzdG9wZWQgYnV0IGxvZ2ljYWwgc3RhdHVzIHNob3cgdGhhdCBzaG91bGQgYmUgd29ya2luZy4KKwkJCVBFUlJPUigiQnJva2VuIHBpcGUgaW4gd3JpdGUuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0NPTlRJTk9VUykgJiYgKHJlZ19jb3B5ICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vQ29udGlub3VzIG1vZGUgcnVuaW5nIGFuZCBkYXRhIGFyZSBiZWxvdyBoYWxmIQorCisJCQkvLyBCbG9jayBpbnRlcnJ1cHRzLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkvL3JlZ19jb3B5ICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCXJlZ19jb3B5IHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vRmFzdCBjb3B5CisJCQljb3BpZWRfdmFsdWVzID0KKwkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIsCisJCQkJCSAgMCk7CisJCQlpZiAoY29waWVkX3ZhbHVlcyA+IDApIHsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3BpZWRfdmFsdWVzOworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9CisJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gQWN0aXZhdGUgaW50ZXJydXB0cy4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJLy9yZWdfY29weSB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCXJlZ19jb3B5ICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoY29waWVkX3ZhbHVlcyA9PSAwKSB7CS8vVGhpcyB3YXMgY2hlY2tlZCBhbmQgbmV2ZXIgc2hvdWxkIGhhcHBlbmQhCisJCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BJTkcgRklOSVNIIFdJVEggMCFcbiIpOworCQkJfQorCisJCQlpZiAoY29waWVkX3ZhbHVlcyA8IDApIHsJLy9UaGlzIHdhcyBjaGVja2VkIGFuZCBuZXZlciBzaG91bGQgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJDT1BJTkcgRklOSVNIIFdJVEggQU4gRVJST1IhXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCQkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFsZWZ0X3RvX2NvcHlfZnJvbV91c2VyKSB7CS8vQWxsIGRhdGFzIHdlcmUgY29waWVkLgorCQkJYnJlYWs7CisJCX0gZWxzZSB7CS8vTm90IGFsbCBkYXRhcyB3ZXJlIGNvcGllZC4KKwkJCWlmIChpbnN0YW5jZS0+bW9kZSAmIE1FNDYwMF9BT19XUkFQX01PREUpIHsJLy9FcnJvciB0b28gbXVjaCBkYXRhcyEgV3JhcGFyb3VuZCBpcyBsaW1pdGVkIGluIHNpemUhCisJCQkJUEVSUk9SCisJCQkJICAgICgiVG9vIG11Y2ggZGF0YSBmb3Igd3JhcGFyb3VuZCBtb2RlISAgRXhjZWVkZWQgc2l6ZSBvZiAlbGQuXG4iLAorCQkJCSAgICAgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMSk7CisJCQkJZXJyID0gTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1c7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh3cml0ZV9tb2RlICE9IE1FX1dSSVRFX01PREVfQkxPQ0tJTkcpIHsJLy9Ob24gYmxvY2tpbmcgY2FsbHMKKwkJCQlicmVhazsKKwkJCX0KKworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGNpcmNfYnVmKSk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCVBFUlJPUigiV3JpdGluZyBpbnRlcnJ1cHRlZCBieSBzaWduYWwuXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgewkvL1Jlc2V0CisJCQkJUEVSUk9SKCJXcml0aW5nIGludGVycnVwdGVkIGJ5IHJlc2V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vQ29weSBkYXRhIHRvIEZJRk8gLSBwcmVsb2FkCisJCWNvcGllZF92YWx1ZXMgPQorCQkgICAgYW9fd3JpdGVfZGF0YV9wb29saW5nKGluc3RhbmNlLCBNRTQ2MDBfQU9fRklGT19DT1VOVCwKKwkJCQkJICBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KTsKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3BpZWRfdmFsdWVzOworCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3BpZWRfdmFsdWVzOworCisJCWlmICgoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0hXX1dSQVBfTU9ERSkKKwkJICAgICYmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikgPgorCQkJTUU0NjAwX0FPX0ZJRk9fQ09VTlQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlRvbyBtdWNoIGRhdGEgZm9yIGhhcmR3YXJlIHdyYXBhcm91bmQgbW9kZSEgRXhjZWVkZWQgc2l6ZSBvZiAlZC5cbiIsCisJCQkgICAgIE1FNDYwMF9BT19GSUZPX0NPVU5UKTsKKwkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQl9CisJfQorCisJKmNvdW50ID0gKmNvdW50IC0gbGVmdF90b19jb3B5X2Zyb21fdXNlcjsKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CitzdGF0aWMgaXJxcmV0dXJuX3QgbWU0NjAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKKwkJCQkgLCBzdHJ1Y3QgcHRfcmVncyAqcmVncworI2VuZGlmCisgICAgKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPSBkZXZfaWQ7CisJdWludDMyX3QgaXJxX3N0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN0YXR1czsKKwlpbnQgY291bnQgPSAwOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEoaXJxX3N0YXR1cyAmIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fSEYgPDwgaW5zdGFuY2UtPmFvX2lkeCkpKSB7CisJCVBJTkZPKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogSUQ9JWQ6IHN0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGluc3RhbmNlLT5hb19pZHgsIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIkNJUkNVTEFSIEJVRkZFUiBOT1QgRVhJU1RTIVxuIik7CisJCS8vQmxvY2sgaW50ZXJydXB0cy4gU3RvcCBtYWNoaW5lLgorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJRIHwKKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vSW5mb3JtIHVzZXIKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vVG9vIGxhdGUuIE5vdCB3b3JraW5nISBFTkQ/IEJST0tFTiBQSVBFPworCQlQREVCVUcoIkludGVycnVwdCBjb21lIGJ1dCBJU00gaXMgbm90IHdvcmtpbmchXG4iKTsKKwkJLy9CbG9jayBpbnRlcnJ1cHRzLiBTdG9wIG1hY2hpbmUuCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0KKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwkvL0dlbmVyYWwgcHJvY2VkdXJlLiBQcm9jZXNzIG1vcmUgZGF0YXMuCisKKyNpZmRlZiBNRURFQlVHX0RFQlVHCisJaWYgKCFtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9CdWZmZXIgaXMgZW1wdHkhCisJCVBERUJVRygiQ2lyY3VsYXIgYnVmZmVyIGVtcHR5IVxuIik7CisJfQorI2VuZGlmCisKKwkvL0NoZWNrIEZJRk8KKwlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpIHsJLy9PSyBsZXNzIHRoYW4gaGFsZgorCisJCS8vQmxvY2sgaW50ZXJydXB0cworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkJZG8geworCQkJLy9DYWxjdWxhdGUgaG93IG1hbnkgc2hvdWxkIGJlIGNvcGllZC4KKwkJCWNvdW50ID0KKwkJCSAgICAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCkgPyBpbnN0YW5jZS0+CisJCQkgICAgc3RvcF9kYXRhX2NvdW50IC0KKwkJCSAgICBpbnN0YW5jZS0+ZGF0YV9jb3VudCA6IE1FNDYwMF9BT19GSUZPX0NPVU5UIC8gMjsKKwkJCWlmIChNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIgPCBjb3VudCkgeworCQkJCWNvdW50ID0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQkJfQorCQkJLy9Db3B5IGRhdGEKKwkJCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTQ2MDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCQkJY291bnQgPSBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgMCk7CisJCQkJaWYgKGNvdW50ID4gMCkgeworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3VudDsKKwkJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0KKwkJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQkJCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3VudDsKKworCQkJCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCkgJiYgIW1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1N0b3BpbmcuIFdob2xlIGJ1ZmZlciB3YXMgY29waWVkLgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKChpbnN0YW5jZS0+bW9kZSA9PSBNRTQ2MDBfQU9fU1dfV1JBUF9NT0RFKSAmJiAoKGN0cmwgJiBNRTQ2MDBfQU9fQ1RSTF9NT0RFX01BU0spID09IE1FNDYwMF9BT19NT0RFX0NPTlRJTlVPVVMpKSB7CS8vV3JhcGFyb3VuZCAoc29mdHdhcmUpCisJCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCkgewkvL1dlIHN0b3BpbmcgPT4gQ29weSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisJCQkJCWNvdW50ID0KKwkJCQkJICAgIGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNvdW50LCAwKTsKKwkJCQl9IGVsc2UgewkvL0NvcHkgaW4gd3JhcGFyb3VuZCBtb2RlLgorCQkJCQljb3VudCA9CisJCQkJCSAgICBhb193cml0ZV9kYXRhX3dyYXBhcm91bmQoaW5zdGFuY2UsCisJCQkJCQkJCSAgICAgY291bnQsCisJCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCQkgICAgIHByZWxvYWRlZF9jb3VudCk7CisJCQkJfQorCisJCQkJaWYgKGNvdW50ID4gMCkgeworCQkJCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3VudDsKKwkJCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3VudDsKKwkJCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCAlPQorCQkJCQkgICAgbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+CisJCQkJCQkJICAgICAgIGNpcmNfYnVmKTsKKworCQkJCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCkgJiYgIWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpIHsJLy9TdG9waW5nLiBXaG9sZSBidWZmZXIgd2FzIGNvcGllZC4KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGNvdW50IDw9IDApIHx8IChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDw9IGluc3RhbmNlLT5kYXRhX2NvdW50KSkpIHsJLy9FbmQgb2Ygd29yay4KKwkJCQlicmVhazsKKwkJCX0KKwkJfQkJLy9SZXBlYXQgaWYgc3RpbGwgaXMgdW5kZXIgaGFsZiBmaWZvCisJCXdoaWxlICgoc3RhdHVzID0KKwkJCWlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpOworCisJCS8vVW5ibG9jayBpbnRlcnJ1cHRzCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJaWYgKGNvdW50ID49IDApIHsJLy9Db3B5IHdhcyBzdWNjZXNzZnVsLgorCQkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSB7CS8vRmluaXNoaW5nIHdvcmsuIE5vIG1vcmUgaW50ZXJydXB0cy4KKwkJCQlQREVCVUcoIkZpbmlzaGluZyB3b3JrLiBJbnRlcnJ1cHQgZGlzYWJsZWQuXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDsKKwkJCX0gZWxzZSBpZiAoY291bnQgPiAwKSB7CS8vTm9ybWFsIHdvcmsuIEVuYWJsZSBpbnRlcnJ1cHQuCisJCQkJUERFQlVHKCJOb3JtYWwgd29yay4gRW5hYmxlIGludGVycnVwdC5cbiIpOworCQkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCX0gZWxzZSB7CS8vTm9ybWFsIHdvcmsgYnV0IHRoZXJlIGFyZSBubyBtb3JlIGRhdGEgaW4gYnVmZmVyLiBJbnRlcnJ1cHQgYWN0aXZlIGJ1dCBibG9ja2VkLiBzdHJlYW1fd3JpdGUoKSB3aWxsIHVuYmxvY2sgaXQuCisJCQkJUERFQlVHCisJCQkJICAgICgiTm8gZGF0YSBpbiBzb2Z0d2FyZSBidWZmZXIuIEludGVycnVwdCBibG9ja2VkLlxuIik7CisJCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCX0KKwkJfSBlbHNlIHsJLy9FcnJvciBkdXJpbmcgY29weS4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I7CisJCX0KKworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCX0gZWxzZSB7CQkvLz8/IG1vcmUgdGhhbiBoYWxmCisJCVBERUJVRworCQkgICAgKCJJbnRlcnJ1cHQgY29tZSBidXQgRklGTyBtb3JlIHRoYW4gaGFsZiBmdWxsISBSZXNldCBpbnRlcnJ1cHQuXG4iKTsKKwkJLy9SZXNldCBwZW5kaW5nIGludGVycnVwdAorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwl9CisKKwlQSU5GTygiSVNSOiBCdWZmZXIgY291bnQ6ICVkLihUOiVkIEg6JWQpXG4iLAorCSAgICAgIG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSwgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwsCisJICAgICAgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpOworCVBJTkZPKCJJU1I6IFN0b3AgY291bnQ6ICVkLlxuIiwgaW5zdGFuY2UtPnN0b3BfY291bnQpOworCVBJTkZPKCJJU1I6IFN0b3AgZGF0YSBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50KTsKKwlQSU5GTygiSVNSOiBEYXRhIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5kYXRhX2NvdW50KTsKKworCS8vSW5mb3JtIHVzZXIKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lNDYwMF9hb19kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCisJLy8gUmVzZXQgc3ViZGV2aWNlIHRvIGFzdXJlIGNsZWFuIGV4aXQuCisJbWU0NjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShzdWJkZXZpY2UsIE5VTEwsCisJCQkJICAgICBNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MpOworCisJLy8gUmVtb3ZlIGFueSB0YXNrcyBmcm9tIHdvcmsgcXVldWUuIFRoaXMgaXMgcGFyYW5vaWMgYmVjYXVzZSBpdCB3YXMgZG9uZSBhbGxyZWFkeSBpbiByZXNldCgpLgorCWlmICghY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaykpIHsJLy9XYWl0IDIgdGlja3MgdG8gYmUgc3VyZSB0aGF0IGNvbnRyb2wgdGFzayBpcyByZW1vdmVkIGZyb20gcXVldWUuCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CisJCWlmIChpbnN0YW5jZS0+aXJxKSB7CisJCQlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCBpbnN0YW5jZSk7CisJCQlpbnN0YW5jZS0+aXJxID0gMDsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWluc3RhbmNlLT5jaXJjX2J1Zi5idWYsCisJCQkJICAgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQl9CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5idWYgPSBOVUxMOworCX0KKworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lNDYwMF9hb19zdWJkZXZpY2VfdCAqbWU0NjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBmaWZvLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1lNDYwMF93cSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBhb19pZHgpOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2FvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lNDYwMF9hb19zdWJkZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+cHJlbG9hZF9yZWdfbG9jayA9IHByZWxvYWRfcmVnX2xvY2s7CisJc3ViZGV2aWNlLT5wcmVsb2FkX2ZsYWdzID0gcHJlbG9hZF9mbGFnczsKKworCS8vIFN0b3JlIGFuYWxvZyBvdXRwdXQgaW5kZXguCisJc3ViZGV2aWNlLT5hb19pZHggPSBhb19pZHg7CisKKwkvLyBTdG9yZSBpZiBhbmFsb2cgb3V0cHV0IGhhcyBmaWZvLgorCXN1YmRldmljZS0+ZmlmbyA9IChhb19pZHggPCBmaWZvKSA/IDEgOiAwOworCisJaWYgKHN1YmRldmljZS0+ZmlmbykgewkvLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjaXJjdWxhciBidWZmZXIuCisJCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IE1FNDYwMF9BT19DSVJDX0JVRl9DT1VOVCAtIDE7CisKKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYgPQorCQkgICAgKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJCQkJCSAgICAgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQlQREVCVUcoImNpcmNfYnVmID0gJXAgc2l6ZT0lbGRcbiIsIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkgICAgICAgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpOworCisJCWlmICghc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lbXNldChzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwgMCwgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpOworCX0gZWxzZSB7CQkvLyBObyBGSUZPLgorCQlzdWJkZXZpY2UtPmNpcmNfYnVmLm1hc2sgPSAwOworCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJfQorCisJc3ViZGV2aWNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJc3ViZGV2aWNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwlzdWJkZXZpY2UtPnRpbWVvdXQuZGVsYXkgPSAwOworCXN1YmRldmljZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKworCS8vIEluaXRpYWxpemUgd2FpdCBxdWV1ZS4KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLy8gSW5pdGlhbGl6ZSBzaW5nbGUgdmFsdWUgdG8gMFYuCisJc3ViZGV2aWNlLT5zaW5nbGVfdmFsdWUgPSAweDgwMDA7CisJc3ViZGV2aWNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IDB4ODAwMDsKKworCS8vIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisJaWYgKHN1YmRldmljZS0+ZmlmbykgeworCQlzdWJkZXZpY2UtPmlycSA9IGlycTsKKwkJaWYgKHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTQ2MDBfYW9faXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJCVNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQkJTUU0NjAwX05BTUUsIHN1YmRldmljZSkpIHsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBpbnRlcnJ1cHQgbGluZS5cbiIpOworCQkJUERFQlVHKCJmcmVlIGNpcmNfYnVmID0gJXAgc2l6ZT0lZCIsCisJCQkgICAgICAgc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCQkgICAgICAgUEFHRV9TSElGVCA8PCBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJCSAgIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+aXJxID0gMDsKKwl9CisKKwkvLyBJbml0aWFsaXplIHJlZ2lzdGVycy4KKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfSVJRX1NUQVRVU19SRUc7CisJc3ViZGV2aWNlLT5wcmVsb2FkX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPX1NZTkNfUkVHOworCWlmIChhb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5iaXRwYXR0ZXJuID0gMDsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJpdHBhdHRlcm4gPSAwOworCX0gZWxzZSBpZiAoYW9faWR4ID09IDIpIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfRklGT19SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX1NJTkdMRV9SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisJCXN1YmRldmljZS0+Yml0cGF0dGVybiA9IDA7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMykgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5iaXRwYXR0ZXJuID0gMTsKKwl9IGVsc2UgeworCQlQRVJST1JfQ1JJVElDQUwoIldST05HIFNVQkRFVklDRSBpZHg9JWQhIiwgYW9faWR4KTsKKwkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJaWYgKHN1YmRldmljZS0+ZmlmbykgeworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCQkgICBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCX0KKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYgPSBOVUxMOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU0NjAwX2FvX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9hb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfYW9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTQ2MDBfYW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWU0NjAwX2FvX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXg7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV90aW1lciA9IG1lNDYwMF9hb19xdWVyeV90aW1lcjsKKworCS8vIFByZXBhcmUgd29yayBxdWV1ZQorCXN1YmRldmljZS0+bWU0NjAwX3dvcmtxdWV1ZSA9IG1lNDYwMF93cTsKKworLyogd29ya3F1ZXVlIEFQSSBjaGFuZ2VkIGluIGtlcm5lbCAyLjYuMjAgKi8KKyNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkgKQorCUlOSVRfV09SSygmc3ViZGV2aWNlLT5hb19jb250cm9sX3Rhc2ssIG1lNDYwMF9hb193b3JrX2NvbnRyb2xfdGFzaywKKwkJICAodm9pZCAqKXN1YmRldmljZSk7CisjZWxzZQorCUlOSVRfREVMQVlFRF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywKKwkJCSAgbWU0NjAwX2FvX3dvcmtfY29udHJvbF90YXNrKTsKKyNlbmRpZgorCisJaWYgKHN1YmRldmljZS0+ZmlmbykgewkvLyBTZXQgc3BlZWQgZm9yIHNpbmdsZSBvcGVyYXRpb25zLgorCQlvdXRsKE1FNDYwMF9BT19NSU5fQ0hBTl9USUNLUyAtIDEsIHN1YmRldmljZS0+dGltZXJfcmVnKTsKKwkJc3ViZGV2aWNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID0gSFogLyAxMDsJLy8xMDBtcworCX0KKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKKy8qKiBAYnJpZWYgU3RvcCBwcmVzZW50YXRpb24uIFByZXNlcnZlIEZJRk9zLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLworaW50IGlubGluZSBhb19zdG9wX2ltbWVkaWF0ZWx5KG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQoreworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQzMl90IGN0cmw7CisJaW50IHRpbWVvdXQ7CisJaW50IGk7CisKKwl0aW1lb3V0ID0KKwkgICAgKGluc3RhbmNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID4KKwkgICAgIChIWiAvIDEwKSkgPyBpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA6IEhaIC8gMTA7CisJZm9yIChpID0gMDsgaSA8PSB0aW1lb3V0OyBpKyspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cy4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCB8PQorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJICAgIHwgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJY3RybCAmPQorCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvLyBFeGl0LgorCQkJYnJlYWs7CisJCX0KKwkJLy9TdGlsbCB3b3JraW5nIQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChpID4gdGltZW91dCkgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpIGluIHdyYXBhcm91bmQuCisqIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbi4gQ2hlY2tpbmcgaXMgZG9uZSBhdCBiZWdpbmluZyBhbmQgZW5kIG9ubHkuCisqIEBub3RlIFRoZSBpcyBub3QgcmVhc29uYWJsZSB3YXkgdG8gY2hlY2sgaG93IG1hbnkgd2FsdWVzIHdhcyBpbiBGSUZPIGF0IGJlZ2luaW5nLiBUaGUgY291bnQgbXVzdCBiZSBtYW5hZ2VkIGV4dGVybmFseS4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHJldHVybiBPbiBlcnJvci9zdWNjZXNzOiAwLglObyBkYXRhcyB3ZXJlIGNvcGllZCA9PiBubyBkYXRhIGluIGJ1ZmZlci4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XLgorKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YV93cmFwYXJvdW5kKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJICAgIGludCBzdGFydF9wb3MpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlOworCWludCBwb3MgPQorCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKyBzdGFydF9wb3MpICYgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJaW50IGxvY2FsX2NvdW50ID0gY291bnQ7CisJaW50IGkgPSAxOworCisJaWYgKGNvdW50IDw9IDApIHsJLy9Xcm9uZyBjb3VudCEKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGkgPCBsb2NhbF9jb3VudCkgeworCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQlpZiAocG9zID09IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSB7CisJCQlwb3MgPSBpbnN0YW5jZS0+Y2lyY19idWYudGFpbDsKKwkJfQorCQlpKys7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEKKwkJUEVSUk9SKCJGSUZPIHdhcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhIGlkeD0lZFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQlyZXR1cm4gLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCX0gZWxzZSB7CQkvL0FkZCBsYXN0IHZhbHVlCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCXZhbHVlIDw8PSAxNjsKKwkJfQorCQkvL1B1dCB2YWx1ZSB0byBGSUZPCisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCS8vUERFQlVHX1JFRygiaWR4PSVkIGZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5hb19pZHgsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJfQorCisJUElORk8oIldSQVBBUk9VTkQgTE9BREVEICVkIHZhbHVlcy4gaWR4PSVkXG4iLCBsb2NhbF9jb3VudCwKKwkgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwlyZXR1cm4gbG9jYWxfY291bnQ7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gc29mdHdhcmUgYnVmZmVyIHRvIGZpZm8gKGZhc3QpLgorKiBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24uIENoZWNraW5nIGlzIGRvbmUgYXQgYmVnaW5pbmcgYW5kIGVuZCBvbmx5LgorKiBAbm90ZSBUaGUgaXMgbm90IHJlYXNvbmFibGUgd2F5IHRvIGNoZWNrIGhvdyBtYW55IHdhbHVlcyB3YXMgaW4gRklGTyBhdCBiZWdpbmluZy4gVGhlIGNvdW50IG11c3QgYmUgbWFuYWdlZCBleHRlcm5hbHkuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IE1heGltdW0gbnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcGFyYW0gc3RhcnRfcG9zIFBvc2l0aW9uIG9mIHRoZSBmaXJzIHZhbHVlIGluIGJ1ZmZlci4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEByZXR1cm4gT24gZXJyb3Ivc3VjY2VzczogMC4JTm8gZGF0YXMgd2VyZSBjb3BpZWQgPT4gbm8gZGF0YSBpbiBidWZmZXIuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVy4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGEobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCSBpbnQgc3RhcnRfcG9zKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgcG9zID0KKwkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsgc3RhcnRfcG9zKSAmIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCWludCBsb2NhbF9jb3VudCA9IGNvdW50OworCWludCBtYXhfY291bnQ7CisJaW50IGkgPSAxOworCisJaWYgKGNvdW50IDw9IDApIHsJLy9Xcm9uZyBjb3VudCEKKwkJcmV0dXJuIDA7CisJfQorCisJbWF4X2NvdW50ID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpIC0gc3RhcnRfcG9zOworCWlmIChtYXhfY291bnQgPD0gMCkgewkvL05vIGRhdGEgdG8gY29weSEKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1heF9jb3VudCA8IGNvdW50KSB7CisJCWxvY2FsX2NvdW50ID0gbWF4X2NvdW50OworCX0KKworCXdoaWxlIChpIDwgbG9jYWxfY291bnQpIHsKKwkJLy9HZXQgdmFsdWUgZnJvbSBidWZmZXIKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQkvL1ByZXBhcmUgaXQKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCXZhbHVlIDw8PSAxNjsKKwkJfQorCQkvL1B1dCB2YWx1ZSB0byBGSUZPCisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCS8vUERFQlVHX1JFRygiaWR4PSVkIGZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5hb19pZHgsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisKKwkJcG9zKys7CisJCXBvcyAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJaSsrOworCX0KKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRkYpKSB7CS8vRklGTyBpcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhCisJCVBFUlJPUigiRklGTyB3YXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkISBpZHg9JWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIC1NRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwl9IGVsc2UgewkJLy9BZGQgbGFzdCB2YWx1ZQorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCX0KKworCVBJTkZPKCJGQVNUIExPQURFRCAlZCB2YWx1ZXMuIGlkeD0lZFxuIiwgbG9jYWxfY291bnQsIGluc3RhbmNlLT5hb19pZHgpOworCXJldHVybiBsb2NhbF9jb3VudDsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBzb2Z0d2FyZSBidWZmZXIgdG8gZmlmbyAoc2xvdykuCisqIEBub3RlIFRoaXMgaXMgc2xvdyBmdW5jdGlvbiB0aGF0IGNvcHkgYWxsIGRhdGEgZnJvbSBidWZmZXIgdG8gRklGTyB3aXRoIGZ1bGwgY29udHJvbC4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgdmFsdWVzLgorKiBAcmV0dXJuIE9uIGVycm9yL3N1Y2Nlc3M6IDAuCUZJRk8gd2FzIGZ1bGwgYXQgYmVnaW5pbmcuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19SSU5HX0JVRkZFUl9VTkRFRkZMT1cuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3Bvb2xpbmcobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgaW50IHN0YXJ0X3BvcykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgc2xvdyBmdW5jdGlvbiEKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdmFsdWU7CisJaW50IHBvcyA9CisJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArIHN0YXJ0X3BvcykgJiBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwlpbnQgbG9jYWxfY291bnQgPSBjb3VudDsKKwlpbnQgaTsKKwlpbnQgbWF4X2NvdW50OworCisJaWYgKGNvdW50IDw9IDApIHsJLy9Xcm9uZyBjb3VudCEKKwkJUEVSUk9SKCJTTE9XIExPQURFRDogV3JvbmcgY291bnQhIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAwOworCX0KKworCW1heF9jb3VudCA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSAtIHN0YXJ0X3BvczsKKwlpZiAobWF4X2NvdW50IDw9IDApIHsJLy9ObyBkYXRhIHRvIGNvcHkhCisJCVBFUlJPUigiU0xPVyBMT0FERUQ6IE5vIGRhdGEgdG8gY29weSEgaWR4PSVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtYXhfY291bnQgPCBjb3VudCkgeworCQlsb2NhbF9jb3VudCA9IG1heF9jb3VudDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9jYWxfY291bnQ7IGkrKykgeworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwhCisJCQlyZXR1cm4gaTsKKwkJfQorCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0KKworCVBJTkZPKCJTTE9XIExPQURFRCAlZCB2YWx1ZXMuIGlkeD0lZFxuIiwgbG9jYWxfY291bnQsIGluc3RhbmNlLT5hb19pZHgpOworCXJldHVybiBsb2NhbF9jb3VudDsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSB1c2VyIHNwYWNlIHRvIGNpcmN1bGFyIGJ1ZmZlci4KKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIGRhdGFzIGluIHVzZXIgc3BhY2UuCisqIEBwYXJhbSB1c2VyX3ZhbHVlcyBCdWZmZXIncyBwb2ludGVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgdmFsdWVzLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fSU5URVJOQUwuCisqLworaW50IGlubGluZSBhb19nZXRfZGF0YV9mcm9tX3VzZXIobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgaW50ICp1c2VyX3ZhbHVlcykKK3sKKwlpbnQgaSwgZXJyOworCWludCBlbXB0eV9zcGFjZTsKKwlpbnQgY29waWVkOworCWludCB2YWx1ZTsKKworCWVtcHR5X3NwYWNlID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJLy9XZSBoYXZlIG9ubHkgdGhpcyBzcGFjZSBmcmVlLgorCWNvcGllZCA9IChjb3VudCA8IGVtcHR5X3NwYWNlKSA/IGNvdW50IDogZW1wdHlfc3BhY2U7CisJZm9yIChpID0gMDsgaSA8IGNvcGllZDsgaSsrKSB7CS8vQ29weSBmcm9tIHVzZXIgdG8gYnVmZmVyCisJCWlmICgoZXJyID0gZ2V0X3VzZXIodmFsdWUsIChpbnQgKikodXNlcl92YWx1ZXMgKyBpKSkpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkJVRkZFUiBMT0FERUQ6IGdldF91c2VyKDB4JXApIHJldHVybiBhbiBlcnJvcjogJWQuIGlkeD0lZFxuIiwKKwkJCSAgICAgdXNlcl92YWx1ZXMgKyBpLCBlcnIsIGluc3RhbmNlLT5hb19pZHgpOworCQkJcmV0dXJuIC1NRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCQkvLy8gQG5vdGUgVGhlIGFuYWxvZyBvdXRwdXQgaW4gbWU0NjAwIHNlcmllcyBoYXMgc2l6ZSBvZiAxNiBiaXRzLgorCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkgICAgKHVpbnQxNl90KSB2YWx1ZTsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQrKzsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oIkJVRkZFUiBMT0FERUQgJWQgdmFsdWVzLiBpZHg9JWRcbiIsIGNvcGllZCwgaW5zdGFuY2UtPmFvX2lkeCk7CisJcmV0dXJuIGNvcGllZDsKK30KKworLyoqIEBicmllZiBDaGVja2luZyBhY3R1YWwgaGFyZHdhcmUgYW5kIGxvZ2ljYWwgc3RhdGUuCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyovCitzdGF0aWMgdm9pZCBtZTQ2MDBfYW9fd29ya19jb250cm9sX3Rhc2soCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCQkJCQkgICAgICAgdm9pZCAqc3ViZGV2aWNlCisjZWxzZQorCQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrCisjZW5kaWYKKyAgICApCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3luY2g7CisJaW50IHJlc2NoZWR1bGUgPSAwOworCWludCBzaWduYWxpbmcgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisjZWxzZQorCWluc3RhbmNlID0KKwkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWU0NjAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOworI2VuZGlmCisJUElORk8oIjwlczogJWxkPiBleGVjdXRlZC4gaWR4PSVkXG4iLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMsCisJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCVBERUJVR19SRUcoInN0YXR1c19yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zdGF0dXNfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0dXMpOworCisJc3dpdGNoIChpbnN0YW5jZS0+c3RhdHVzKSB7CS8vIENoZWNraW5nIGFjdHVhbCBtb2RlLgorCisJCS8vIE5vdCBjb25maWd1cmVkIGZvciB3b3JrLgorCWNhc2UgYW9fc3RhdHVzX25vbmU6CisJCWJyZWFrOworCisJCS8vVGhpcyBhcmUgc3RhYmxlIG1vZGVzLiBObyBuZWVkIHRvIGRvIGFueXRoaW5nLiAoPykKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJUEVSUk9SKCJTaG91bGRuJ3QgYmUgcnVubmluZyEuXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kOgorCQlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmQ6CisJCWlmIChzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsJLy8gU3RhdGUgbWFjaGluZSBpcyB3b3JraW5nIGJ1dCB0aGUgc3RhdHVzIGlzIHNldCB0byBlbmQuIEZvcmNlIHN0b3AuCisKKwkJCS8vIFdhaXQgZm9yIHN0b3AuCisJCQlyZXNjaGVkdWxlID0gMTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMgYW5kIHRyaWdnZXIuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgfD0KKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QCisJCSAgICB8IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCWN0cmwgJj0KKwkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQljdHJsICY9CisJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEgpOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCWJyZWFrOworCisJCS8vIFNpbmdsZSBtb2RlcworCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdDoKKworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQlpZiAoKChpbnN0YW5jZS0+ZmlmbykKKwkJCSAgICAgJiYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpKSkKKwkJCSAgICB8fCAoIShpbnN0YW5jZS0+ZmlmbykpKSB7CS8vIFNpbmdsZSBpcyBpbiBlbmQgc3RhdGUuCisJCQkJUERFQlVHKCJTaW5nbGUgY2FsbCBoYXMgYmVlbiBjb21wbGl0ZWQuXG4iKTsKKworCQkJCS8vIFNldCBjb3JyZWN0IHZhbHVlIGZvciBzaW5nbGVfcmVhZCgpOworCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPQorCQkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm87CisKKwkJCQkvLyBTZXQgc3RhdHVzIGFzICdhb19zdGF0dXNfc2luZ2xlX2VuZCcKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCQkJCS8vIFdhaXQgZm9yIHN0b3AgSVNNLgorCQkJCXJlc2NoZWR1bGUgPSAxOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLy8gQ2hlY2sgdGltZW91dC4KKwkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzIGFuZCB0cmlnZ2VyLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCWN0cmwgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQkvLy8gRml4IGZvciB0aW1lb3V0IGVycm9yLgorCQkJY3RybCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEgpOworCQkJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vRGlzYWJsaW5nIEZJRk8KKwkJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQl9CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4gQmxvY2sgdHJpZ2dlcmluZyBmcm9tIHRoaXMgb3V0cHV0LgorCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXN5bmNoICY9CisJCQkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlpZiAoIShpbnN0YW5jZS0+ZmlmbykpIHsJLy8gTm8gRklGTyAtIHNldCB0byBzaW5nbGUgc2FmZSBtb2RlCisJCQkJc3luY2ggfD0KKwkJCQkgICAgTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJfQorCQkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jaCk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCWlmICghKGluc3RhbmNlLT5maWZvKSkgewkvLyBObyBGSUZPCisJCQkJLy8gUmVzdG9yZSBvbGQgc2V0dGluZ3MuCisJCQkJUERFQlVHKCJXcml0ZSBvbGQgdmFsdWUgYmFjayB0byByZWdpc3Rlci5cbiIpOworCQkJCW91dGwoaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSwKKwkJCQkgICAgIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlKTsKKwkJCX0KKwkJCS8vIFNldCBjb3JyZWN0IHZhbHVlIGZvciBzaW5nbGVfcmVhZCgpOworCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCX0KKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJCS8vIFN0cmVhbSBtb2RlcworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZy4gV2FpdGluZyBmb3Igc3RhcnQgZmluaXNoLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fcnVuOworCisJCQkvLyBTaWduYWwgZW5kIG9mIHRoaXMgc3RlcAorCQkJc2lnbmFsaW5nID0gMTsKKwkJfSBlbHNlIHsJLy8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4KKwkJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSkgewkvLyBGSUZPIGlzIGVtcHR5LiBQcm9jZWR1cmUgaGFzIHN0YXJ0ZWQgYW5kIGZpbmlzaCBhbHJlYWR5IQorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKworCQkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJCXNpZ25hbGluZyA9IDE7CisJCQkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJCQlyZXNjaGVkdWxlID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIENoZWNrIHRpbWVvdXQuCisJCWlmICgoaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpICYmICgoamlmZmllcyAtIGluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUpID49IGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSkgewkvLyBUaW1lb3V0CisJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cy4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQljdHJsICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQkvL1JlbW92ZSBmcm9tIHN5bmNocm9ub3VzIHN0YXJ0LiBCbG9jayB0cmlnZ2VyaW5nIGZyb20gdGhpcyBvdXRwdXQuCisJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJc3luY2ggJj0KKwkJCSAgICB+KChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8CisJCQkgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY2gpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJfQorCQkvLyBXYWl0IGZvciBzdG9wLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCQlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4gVGhpcyBpcyBhbiBlcnJvci4KKwkJCS8vIEJST0tFTiBQSVBFIQorCQkJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpKSB7CS8vIEZJRk8gaXMgZW1wdHkuCisJCQkJaWYgKG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvLyBTb2Z0d2FyZSBidWZmZXIgaXMgbm90IGVtcHR5LgorCQkJCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpIHsJLy9GaW5pc2hpbmcgd29yay4gUmVxdWVkIGRhdGEgc2hvd24uCisJCQkJCQlQREVCVUcKKwkJCQkJCSAgICAoIklTTSBzdG9wZWQuIE5vIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIG5vdCBlbXB0eS5cbiIpOworCQkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJCQkgICAgYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkLiBObyBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBub3QgZW1wdHkuXG4iKTsKKwkJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkJICAgIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIGVtcHR5LgorCQkJCQlQREVCVUcKKwkJCQkJICAgICgiSVNNIHN0b3BlZC4gTm8gZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgZW1wdHkuXG4iKTsKKwkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vIFRoZXJlIGFyZSBzdGlsbCBkYXRhcyBpbiBGSUZPLgorCQkJCWlmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIG5vdCBlbXB0eS4KKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkIGJ1dCBzb21lIGRhdGEgaW4gRklGTyBhbmQgYnVmZmVyLlxuIik7CisJCQkJfSBlbHNlIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIGVtcHR5LgorCQkJCQlQRVJST1IKKwkJCQkJICAgICgiT3V0cHV0IHN0cmVhbSBoYXMgYmVlbiBicm9rZW4uIElTTSBzdG9wZWQgYnV0IHNvbWUgZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgZW1wdHkuXG4iKTsKKwkJCQl9CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKworCQkJfQorCisJCQkvLyBTaWduYWwgdGhlIGZhaWx1cmUuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OgorCQlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4gV2FpdGluZyBmb3Igc3RvcCBmaW5pc2guCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQlzaWduYWxpbmcgPSAxOworCQl9CisJCS8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZy4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SX0NSSVRJQ0FMKCJTdGF0dXMgaXMgaW4gd3Jvbmcgc3RhdGUgKCVkKSFcbiIsCisJCQkJaW5zdGFuY2UtPnN0YXR1cyk7CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJc2lnbmFsaW5nID0gMTsKKwkJYnJlYWs7CisKKwl9CisKKwlpZiAoc2lnbmFsaW5nKSB7CS8vU2lnbmFsIGl0LgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJfQorCisJaWYgKGluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyAmJiByZXNjaGVkdWxlKSB7CS8vIFJlc2NoZWR1bGUgdGFzaworCQlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNDYwMF93b3JrcXVldWUsCisJCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCX0gZWxzZSB7CisJCVBJTkZPKCI8JXM+IEVuZGluZyBjb250cm9sIHRhc2suXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKworfQorI2Vsc2UKKy8vLyBAbm90ZSBTUEVDSUFMIEJVSUxEIEZPUiBCT1NDSAorLy8vIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorc3RhdGljIGludCBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCXRtcCAmPSB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCXdoaWxlIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSA7CisKKwlvdXRsKE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QLAorCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChjaGFubmVsID09IDApIHsKKwkJaWYgKHNpbmdsZV9jb25maWcgPT0gMCkgeworCQkJaWYgKHJlZiA9PSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCQkJaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQkJCQlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkJCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCQl0bXAgfD0KKwkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCQkJCXNwaW5fbG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQl0bXAgJj0KKwkJCQkJCSAgICB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPgorCQkJCQkJICAgICAgYW9faWR4KTsKKwkJCQkJCW91dGwodG1wLAorCQkJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJCQkJCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICAgIHByZWxvYWRfcmVnX2xvY2spOworCQkJCQl9IGVsc2UgaWYgKHRyaWdfdHlwZSA9PQorCQkJCQkJICAgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQkJCQlpZiAodHJpZ19lZGdlID09CisJCQkJCQkgICAgTUVfVFJJR19FREdFX1JJU0lORykgeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09CisJCQkJCQkJICAgTUVfVFJJR19FREdFX0ZBTExJTkcpCisJCQkJCQl7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09CisJCQkJCQkJICAgTUVfVFJJR19FREdFX0FOWSkgeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRworCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLlxuIik7CisJCQkJCQkJZXJyID0KKwkJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKworCQkJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgIHByZWxvYWRfcmVnX2xvY2spOworCisJCQkJCQl0bXAgPQorCQkJCQkJICAgIGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJdG1wICY9CisJCQkJCQkgICAgfigweDEwMDAxIDw8IGluc3RhbmNlLT4KKwkJCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJCQl0bXAgfD0gMHgxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuXG4iKTsKKwkJCQkJCWVyciA9CisJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICh0cmlnX2NoYW4gPT0KKwkJCQkJICAgTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSB7CisJCQkJCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQkJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXRtcCB8PQorCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQkJdG1wID0KKwkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQkJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgIHByZWxvYWRfcmVnX2xvY2spOworCQkJCQkJdG1wID0KKwkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCXRtcCAmPQorCQkJCQkJICAgIH4oMHgxMDAwMSA8PCBpbnN0YW5jZS0+CisJCQkJCQkgICAgICBhb19pZHgpOworCQkJCQkJdG1wIHw9IDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJCQkJCSAgICAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgICAgcHJlbG9hZF9yZWdfbG9jayk7CisJCQkJCX0gZWxzZSBpZiAodHJpZ190eXBlID09CisJCQkJCQkgICBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpIHsKKwkJCQkJCWlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCSAgICBNRV9UUklHX0VER0VfUklTSU5HKSB7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCQkgICBNRV9UUklHX0VER0VfRkFMTElORykKKwkJCQkJCXsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPgorCQkJCQkJCQljdHJsX3JlZyk7CisJCQkJCQkJdG1wIHw9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCQkgICBNRV9UUklHX0VER0VfQU5ZKSB7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRQorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuXG4iKTsKKwkJCQkJCQllcnIgPQorCQkJCQkJCSAgICBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCisJCQkJCQlzcGluX2xvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgcHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQl0bXAgfD0KKwkJCQkJCSAgICAweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuXG4iKTsKKwkJCQkJCWVyciA9CisJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIKKwkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICh0bXAgJiAweDMpIHsKKwkJUEVSUk9SKCJOb3QgaW4gc2luZ2xlIG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAwOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCWludCBpOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICh0bXAgJiAweDMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlQRVJST1IoIk5vdCBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJCWlmICghKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpKSB7CisJCQlqID0gamlmZmllczsKKworCQkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmcXVldWUsIDEpOworCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpZiAoZGVsYXkgJiYgKChqaWZmaWVzIC0gaikgPiBkZWxheSkpIHsKKwkJCQkJUEVSUk9SKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKChpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKSAmICgweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpKQorCQkgICA9PSAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgeworCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoIShmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQkJCWogPSBqaWZmaWVzOworCisJCQkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJCSAgICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZxdWV1ZSwKKwkJCQkJCQkJICAgICAgIDEpOworCisJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisKKwkJCQkJaWYgKGRlbGF5ICYmICgoamlmZmllcyAtIGopID4gZGVsYXkpKSB7CisJCQkJCQlQRVJST1IoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkKKwkJICAgPT0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKworCQlQREVCVUcoIlN5bmNocm9ub3VzIFNXLCBmbGFncyA9IDB4JVguXG4iLCBmbGFncyk7CisKKwkJaWYgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJUERFQlVHKCJUcmlnZ2VyIHN5bmNocm9ub3VzIFNXLlxuIik7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNRTQ2MDBfQU9fTUFYX1NVQkRFVklDRVM7IGkrKykgeworCQkJCWlmICgoKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICYgKDB4MSA8PCBpKSkpIHsKKwkJCQkJaWYgKCh0bXAgJiAoMHgxMDAwMSA8PCBpKSkgPT0KKwkJCQkJICAgICgweDEgPDwgaSkpIHsKKwkJCQkJCW1hc2sgfD0gMHgxIDw8IGk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXRtcCAmPSB+KG1hc2spOworCisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9IGVsc2UgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCX0KKworICAgICAgRVJST1I6CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGN0cmw7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDY0X3QgY29udl90aWNrczsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NMb3c7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfaGlnaCA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0hpZ2g7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJY29udl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIKKwkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSkgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgYnVzeS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgPSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0cmVhbSBjb25maWd1cmF0aW9uIGxpc3QgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQ7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlDaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlTdHJlYW1Db25maWcgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgc3RyZWFtIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TVFJFQU1fQ09ORklHOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pUmVmICE9IE1FX1JFRl9BT19HUk9VTkQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFuYWxvZyByZWZlcmVuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisKKwkJCWdvdG8gRVJST1I7CisKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9GT0xMT1c6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisKKwkJZ290byBFUlJPUjsKKworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCWlmICgoY29udl90aWNrcyA8IE1FNDYwMF9BT19NSU5fQ0hBTl9USUNLUykKKwkJICAgIHx8IChjb252X3RpY2tzID4gTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkc7CisJCQlnb3RvIEVSUk9SOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKworCS8qIFByZXNldCB0byBoYXJkd2FyZSB3cmFwYXJvdW5kIG1vZGUgKi8KKwlpbnN0YW5jZS0+ZmxhZ3MgJj0gfihNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX01BU0spOworCisJc3dpdGNoICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfTk9ORToKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQkvKiBTZXQgZmxhZ3MgdG8gaW5kaWNhdGUgdXNhZ2Ugb2Ygc29mdHdhcmUgbW9kZS4gKi8KKwkJCWluc3RhbmNlLT5mbGFncyB8PSBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORjsKKwkJCWluc3RhbmNlLT53cmFwX2NvdW50ID0gMDsKKwkJCWluc3RhbmNlLT53cmFwX3JlbWFpbmluZyA9IDA7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkc7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIHVzYWdlIG9mIHNvZnR3YXJlIG1vZGUuICovCisJCQlpbnN0YW5jZS0+ZmxhZ3MgfD0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU47CisJCQlpbnN0YW5jZS0+d3JhcF9jb3VudCA9IHRyaWdnZXItPmlTY2FuU3RvcENvdW50OworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gdHJpZ2dlci0+aVNjYW5TdG9wQ291bnQ7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCisJCWdvdG8gRVJST1I7CisKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50IDw9IDApIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIHVzYWdlIG9mIHNvZnR3YXJlIG1vZGUuICovCisJCQlpbnN0YW5jZS0+ZmxhZ3MgfD0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU47CisJCQlpbnN0YW5jZS0+d3JhcF9jb3VudCA9IHRyaWdnZXItPmlBY3FTdG9wQ291bnQ7CisJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSB0cmlnZ2VyLT5pQWNxU3RvcENvdW50OworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcCBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4pIHsKKworCWNhc2UgTUVfVFJJR19DSEFOX0RFRkFVTFQ6CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQl0bXAgJj0gfigweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVM6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXRtcCAmPSB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXRtcCB8PSAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQl9IGVsc2UgeworCQkJY3RybCAmPSB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQl0bXAgJj0gfigweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQl0bXAgfD0gMHgxMDAwMCA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0NIQU47CisJCWdvdG8gRVJST1I7CisKKwkJYnJlYWs7CisJfQorCisJb3V0bChjb252X3RpY2tzIC0gMiwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0JJVF9QQVRURVJOKSB7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ID09IDMpIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETzsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCQlnb3RvIEVSUk9SOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggPT0gMykgeworCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETzsKKwkJfQorCX0KKworCS8qIFNldCBoYXJkd2FyZSBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzA7CisJfSBlbHNlIHsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfTU9ERV8xOworCX0KKworCVBERUJVRygiUHJlbG9hZCB3b3JkID0gMHglWC5cbiIsIGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpKTsKKworCVBERUJVRygiQ3RybCB3b3JkID0gMHglbFguXG4iLCBjdHJsKTsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CS8vIFdyaXRlIHRoZSBjb250cm9sIHdvcmQKKworICAgICAgRVJST1I6CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJbG9uZyBqOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmICh0ID09IDApCisJCQl0ID0gMTsKKwl9CisKKwkqY291bnQgPSAwOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKHQpIHsKKwkJaiA9IGppZmZpZXM7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfc3BhY2UKKwkJCQkJCSAgICgmaW5zdGFuY2UtPmNpcmNfYnVmKSkKKwkJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpCisJCQkJCQkgICAgICAgJgorCQkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpLAorCQkJCQkJIHQpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQlQRVJST1IoIkFPIHN1YmRldmljZSBpcyBub3QgcnVubmluZy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSBqKSA+PSB0KSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIHRpbWVkIG91dC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfSBlbHNlIHsKKwkJCSpjb3VudCA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCQl9CisJfSBlbHNlIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkgKChtZV9jaXJjX2J1Zl9zcGFjZQorCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikpCisJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJBTyBzdWJkZXZpY2UgaXMgbm90IHJ1bm5pbmcuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9IGVsc2UgeworCQkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwl3aGlsZSAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyByZWY7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCXN3aXRjaCAodG1wICYgKE1FNDYwMF9BT19DVFJMX01BU0tfTU9ERSkpIHsKKworCWNhc2UgMDoJCS8vIFNpbmdsZSBtb2RlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgY29uZmlndXJlZCBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisKKwljYXNlIDE6CQkvLyBXcmFwYXJvdW5kIG1vZGUKKwkJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgewkvLyBOb3JtYWwgd3JhcGFyb3VuZCB3aXRoIGV4dGVybmFsIHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgeworCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCQkJCWlmIChkZWxheSkgeworCQkJCQlyZWYgPSBqaWZmaWVzOworCisJCQkJCXdoaWxlICghCisJCQkJCSAgICAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCisJCQkJCQlpZiAoKChqaWZmaWVzIC0gcmVmKSA+PSBkZWxheSkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJd2hpbGUgKCEKKwkJCQkJICAgICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9OT05CTE9DS0lORykgeworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKwkJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgPT0gKDB4MTAwMDAgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd2l0aCBleHRlcm5hbCB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgeworCQkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwkJCQkJaWYgKGRlbGF5KSB7CisJCQkJCQlyZWYgPSBqaWZmaWVzOworCisJCQkJCQl3aGlsZSAoIQorCQkJCQkJICAgICAgIChpbmwKKwkJCQkJCQkoaW5zdGFuY2UtPgorCQkJCQkJCSBzdGF0dXNfcmVnKSAmCisJCQkJCQkJTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkKKwkJCQkJCXsKKwkJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCQkgICAgKCZxdWV1ZSwgMSk7CisKKwkJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcKKwkJCQkJCQkgICAgKGN1cnJlbnQpKSB7CisJCQkJCQkJCVBFUlJPUgorCQkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQkJZXJyID0KKwkJCQkJCQkJICAgIE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoKChqaWZmaWVzIC0gcmVmKSA+PQorCQkJCQkJCSAgICAgZGVsYXkpKSB7CisJCQkJCQkJCVBFUlJPUgorCQkJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQkJZXJyID0KKwkJCQkJCQkJICAgIE1FX0VSUk5PX1RJTUVPVVQ7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJd2hpbGUgKCEKKwkJCQkJCSAgICAgICAoaW5sCisJCQkJCQkJKGluc3RhbmNlLT4KKwkJCQkJCQkgc3RhdHVzX3JlZykgJgorCQkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpCisJCQkJCQl7CisJCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nCisJCQkJCQkJICAgIChjdXJyZW50KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIGlmIChzdGFydF9tb2RlID09CisJCQkJCSAgIE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpIHsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpID09ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd3JhcGFyb3VuZCB3aXRoIHN3IHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CisJCQkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9IGVsc2UgewkvLyBTb2Z0d2FyZSBzdGFydAorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIDI6CQkvLyBDb250aW51b3VzIG1vZGUKKwkJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgewkvLyBFeHRlcm5hbGx5IHRyaWdnZXJlZAorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKSB7CisJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJCQkJaWYgKGRlbGF5KSB7CisJCQkJCXJlZiA9IGppZmZpZXM7CisKKwkJCQkJd2hpbGUgKCEKKwkJCQkJICAgICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoKGppZmZpZXMgLSByZWYpID49IGRlbGF5KSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAoIQorCQkJCQkgICAgICAgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJCQkJTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkgICAgKCZxdWV1ZSwgMSk7CisKKwkJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQkJLyogRG8gbm90aGluZyAqLworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQlzdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKwkJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgPT0gKDB4MTAwMDAgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd2l0aCBleHRlcm5hbCB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJCXRtcCB8PQorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcgfAorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsKKwkJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJCQkJCWlmIChkZWxheSkgeworCQkJCQkJcmVmID0gamlmZmllczsKKworCQkJCQkJd2hpbGUgKCEKKwkJCQkJCSAgICAgICAoaW5sCisJCQkJCQkJKGluc3RhbmNlLT4KKwkJCQkJCQkgc3RhdHVzX3JlZykgJgorCQkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpCisJCQkJCQl7CisJCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nCisJCQkJCQkJICAgIChjdXJyZW50KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKCgoamlmZmllcyAtIHJlZikgPj0KKwkJCQkJCQkgICAgIGRlbGF5KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19USU1FT1VUOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXdoaWxlICghCisJCQkJCQkgICAgICAgKGlubAorCQkJCQkJCShpbnN0YW5jZS0+CisJCQkJCQkJIHN0YXR1c19yZWcpICYKKwkJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKQorCQkJCQkJeworCQkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJCWlmIChzaWduYWxfcGVuZGluZworCQkJCQkJCSAgICAoY3VycmVudCkpIHsKKwkJCQkJCQkJUEVSUk9SCisJCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCQllcnIgPQorCQkJCQkJCQkgICAgTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoc3RhcnRfbW9kZSA9PQorCQkJCQkgICBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERTsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpID09ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd3JhcGFyb3VuZCB3aXRoIHN3IHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJCVBERUJVRygiQ1RSTCBSZWcgPSAweCVYLlxuIiwgaW5sKGluc3RhbmNlLT5jdHJsX3JlZykpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSAweDgwMDA7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIHN0YXJ0CisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCVBFUlJPUigiSW52YWxpZCBtb2RlIGNvbmZpZ3VyZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCWdvdG8gRVJST1I7CisJfQorCisgICAgICBFUlJPUjoKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXR1cyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHdhaXQsCisJCQkJICAgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmICh3YWl0ID09IE1FX1dBSVRfTk9ORSkgeworCQkqc3RhdHVzID0KKwkJICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSA/CisJCSAgICBNRV9TVEFUVVNfQlVTWSA6IE1FX1NUQVRVU19JRExFOworCQkqdmFsdWVzID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJfSBlbHNlIGlmICh3YWl0ID09IE1FX1dBSVRfSURMRSkgeworCQl3aGlsZSAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZxdWV1ZSwgMSk7CisKKwkJCWlmIChpbnN0YW5jZS0+ZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUpIHsKKwkJCQlQRVJST1IoIk91dHB1dCBzdHJlYW0gd2FzIGludGVycnVwdGVkLlxuIik7CisJCQkJKnN0YXR1cyA9IE1FX1NUQVRVU19FUlJPUjsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIldhaXQgb24gc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwuXG4iKTsKKwkJCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisKKwkJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCB3YWl0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfV0FJVDsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgc3RvcCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERTsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkgICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgaTsKKwlpbnQgdmFsdWU7CisJaW50IGNudCA9ICpjb3VudDsKKwlpbnQgYzsKKwlpbnQgazsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoKmNvdW50IDw9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvdW50IG9mIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlzd2l0Y2ggKHRtcCAmIDB4MykgeworCisJY2FzZSAxOgkJLy8gV3JhcGFyb3VuZCBtb2RlCisJCWlmIChpbnN0YW5jZS0+Ym9zY2hfZncpIHsJLy8gQm9zY2ggZmlybXdhcmUKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCWlmIChjbnQgIT0gNykgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIkludmFsaWQgY291bnQgb2YgdmFsdWVzIHNwZWNpZmllZC4gNyBleHBlY3RlZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzKSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiQ2FuJ3QgY29weSB2YWx1ZSBmcm9tIHVzZXIgc3BhY2UuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJaWYgKGkgPT0gMCkgeworCQkJCQkvKiBNYXhpbXVtIHZvbHRhZ2UgKi8KKwkJCQkJdmFsdWUgPDw9IDE2OworCQkJCQl2YWx1ZSB8PQorCQkJCQkgICAgaW5sKGluc3RhbmNlLT5yZWdfYmFzZSArCisJCQkJCQkweEQ0KSAmIDB4RkZGRjsKKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnJlZ19iYXNlICsgMHhENCk7CisJCQkJfSBlbHNlIGlmIChpID09IDEpIHsKKwkJCQkJLyogTWluaW11bSB2b2x0YWdlICovCisJCQkJCXZhbHVlICY9IDB4RkZGRjsKKwkJCQkJdmFsdWUgfD0KKwkJCQkJICAgIGlubChpbnN0YW5jZS0+cmVnX2Jhc2UgKworCQkJCQkJMHhENCkgJiAweEZGRkYwMDAwOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ0KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gMikgeworCQkJCQkvKiBEZWx0YSB1cCAqLworCQkJCQl2YWx1ZSA8PD0gMTY7CisJCQkJCXZhbHVlIHw9CisJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnJlZ19iYXNlICsKKwkJCQkJCTB4RDgpICYgMHhGRkZGOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ4KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gMykgeworCQkJCQkvKiBEZWx0YSBkb3duICovCisJCQkJCXZhbHVlICY9IDB4RkZGRjsKKwkJCQkJdmFsdWUgfD0KKwkJCQkJICAgIGlubChpbnN0YW5jZS0+cmVnX2Jhc2UgKworCQkJCQkJMHhEOCkgJiAweEZGRkYwMDAwOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ4KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gNCkgeworCQkJCQkvKiBTdGFydCB2YWx1ZSAqLworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweERDKTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gNSkgeworCQkJCQkvKiBJbnZlcnQgKi8KKwkJCQkJaWYgKHZhbHVlKSB7CisJCQkJCQl2YWx1ZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQkJdmFsdWUgfD0gMHgxMDA7CisJCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmFsdWUgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXZhbHVlICY9IH4weDEwMDsKKwkJCQkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGkgPT0gNikgeworCQkJCQkvKiBUaW1lciBmb3IgcG9zaXRpdmUgcmFtcCAqLworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEUwKTsKKwkJCQl9CisKKwkJCQl2YWx1ZXMrKzsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gTm9ybWFsIGZpcm13YXJlCisJCQlQREVCVUcoIldyaXRlIGZvciB3cmFwYXJvdW5kIG1vZGUuXG4iKTsKKworCQkJaWYgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRoZXJlIGlzIGFscmVhZHkgYSBjb252ZXJzaW9uIHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisKKwkJCWlmICgoKmNvdW50ID4gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpIHx8CisJCQkgICAgKChpbnN0YW5jZS0+CisJCQkgICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJCSAgICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pKSB7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX01PREVfMSk7CisJCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzE7CisJCQl9CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKCgqY291bnQgPD0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpICYmCisJCQkgICAgKChpbnN0YW5jZS0+CisJCQkgICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJCSAgICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkYpKSB7CisJCQkJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzICsgaSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKworCQkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJCXZhbHVlIDw8PSAxNjsKKworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKCpjb3VudCA8PSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQpICYmCisJCQkJICAgKChpbnN0YW5jZS0+CisJCQkJICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykKKwkJCQkgICAgPT0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkYpKSB7CisJCQkJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzICsgaSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYuYnVmW2ldID0gdmFsdWU7CS8qIFVzZWQgdG8gaG9sZCB0aGUgdmFsdWVzLiAqLworCQkJCX0KKworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsJLyogVXNlZCBhcyB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLiAqLworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gKmNvdW50OwkvKiBVc2VkIGFzIHRoZSBidWZmZXIgc2l6ZS4gKi8KKworCQkJCS8qIFByZWxvYWQgdGhlIEZJRk8uICovCisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisJCQkJICAgICBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyspIHsKKwkJCQkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID49CisJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkKKwkJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCQkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJCW91dGwoaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJCSB0YWlsXSA8PCAxNiwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCQkJZWxzZQorCQkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkJIHRhaWxdLAorCQkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKCpjb3VudCA8PSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQpICYmCisJCQkJICAgKChpbnN0YW5jZS0+CisJCQkJICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykKKwkJCQkgICAgPT0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pKSB7CisJCQkJdW5zaWduZWQgaW50IHByZWxvYWRfY291bnQ7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspIHsKKwkJCQkJaWYgKGdldF91c2VyKHZhbHVlLCB2YWx1ZXMgKyBpKSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJDYW5ub3QgY29weSB2YWx1ZSBmcm9tIHVzZXIgc3BhY2UuXG4iKTsKKwkJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJfQorCisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5idWZbaV0gPSB2YWx1ZTsJLyogVXNlZCB0byBob2xkIHRoZSB2YWx1ZXMuICovCisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOwkvKiBVc2VkIGFzIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24uICovCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAqY291bnQ7CS8qIFVzZWQgYXMgdGhlIGJ1ZmZlciBzaXplLiAqLworCisJCQkJLyogVHJ5IHRvIHByZWxvYWQgdGhlIHdob2xlIEZJRk8uICovCisJCQkJcHJlbG9hZF9jb3VudCA9IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCisJCQkJaWYgKHByZWxvYWRfY291bnQgPiBpbnN0YW5jZS0+d3JhcF9jb3VudCkKKwkJCQkJcHJlbG9hZF9jb3VudCA9IGluc3RhbmNlLT53cmFwX2NvdW50OworCisJCQkJLyogUHJlbG9hZCB0aGUgRklGTy4gKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgcHJlbG9hZF9jb3VudDsKKwkJCQkgICAgIGkrKywgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwrKykgeworCQkJCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPj0KKwkJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKQorCQkJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkJIHRhaWxdIDw8IDE2LAorCQkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCQllbHNlCisJCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJCQkgdGFpbF0sCisJCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0KKwkJCQkgICAgaW5zdGFuY2UtPndyYXBfY291bnQgLSBwcmVsb2FkX2NvdW50OworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlRvIG1hbnkgdmFsdWVzIHdyaXR0ZW4uXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1ZBTFVFX0NPVU5UOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCWNhc2UgMjoJCS8vIENvbnRpbnVvdXMgbW9kZQorCQkvKiBDaGVjayBpZiBpbiBTVyB3cmFwcm91bmQgbW9kZSAqLworCQlpZiAoaW5zdGFuY2UtPmZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgY29uZmlndXJlZCBTVyB3cmFwcm91bmQgbW9kZS5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCXN3aXRjaCAod3JpdGVfbW9kZSkgeworCisJCWNhc2UgTUVfV1JJVEVfTU9ERV9CTE9DS0lORzoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCVBERUJVRygiV3JpdGUgZm9yIGJsb2NraW5nIGNvbnRpbnVvdXMgbW9kZS5cbiIpOworCisJCQl3aGlsZSAoY250ID4gMCkgeworCQkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCQkgKGMgPQorCQkJCQkJCSAgbWVfY2lyY19idWZfc3BhY2VfdG9fZW5kCisJCQkJCQkJICAoJmluc3RhbmNlLT4KKwkJCQkJCQkgICBjaXJjX2J1ZikpKTsKKworCQkJCWlmIChpbnN0YW5jZS0+CisJCQkJICAgIGZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJCcm9rZW4gcGlwZSBpbiBibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiV2FpdCBmb3IgZnJlZSBidWZmZXIgaW50ZXJydXB0ZWQgZnJvbSBzaWduYWwuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCVBERUJVRygiU3BhY2UgdG8gZW5kID0gJWQuXG4iLCBjKTsKKworCQkJCS8qIE9ubHkgYWJsZSB0byB3cml0ZSBzaXplIG9mIGZyZWUgYnVmZmVyIG9yIHNpemUgb2YgY291bnQgKi8KKworCQkJCWlmIChjbnQgPCBjKQorCQkJCQljID0gY250OworCQkJCWsgPSBzaXplb2YoaW50KSAqIGM7CisJCQkJayAtPSBjb3B5X2Zyb21fdXNlcihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsKKwkJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCwKKwkJCQkJCSAgICB2YWx1ZXMsIGspOworCQkJCWMgPSBrIC8gc2l6ZW9mKGludCk7CisKKwkJCQlQREVCVUcoIkNvcHkgJWQgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIsIGMpOworCisJCQkJaWYgKCFjKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJDYW5ub3QgY29weSB2YWx1ZXMgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0KKwkJCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICsKKwkJCQkgICAgIGMpICYgKGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrKTsKKworCQkJCXZhbHVlcyArPSBjOworCQkJCWNudCAtPSBjOworCQkJCXJldCArPSBjOworCisJCQkJLyogVmFsdWVzIGFyZSBub3cgYXZhaWxhYmxlIHNvIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKworCQkJCWlmIChtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSkgeworCQkJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQl9CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCX0KKworCQkJKmNvdW50ID0gcmV0OworCisJCQlicmVhazsKKworCQljYXNlIE1FX1dSSVRFX01PREVfTk9OQkxPQ0tJTkc6CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlQREVCVUcoIldyaXRlIGZvciBub24gYmxvY2tpbmcgY29udGludW91cyBtb2RlLlxuIik7CisKKwkJCXdoaWxlIChjbnQgPiAwKSB7CisJCQkJaWYgKGluc3RhbmNlLT4KKwkJCQkgICAgZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk1FNDYwMDpCcm9rZW4gcGlwZSBpbiBub25ibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJYyA9IG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZCgmaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY2lyY19idWYpOworCisJCQkJaWYgKCFjKSB7CisJCQkJCVBERUJVRworCQkJCQkgICAgKCJSZXR1cm5pbmcgZnJvbSBub25ibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlQREVCVUcoIlNwYWNlIHRvIGVuZCA9ICVkLlxuIiwgYyk7CisKKwkJCQkvKiBPbmx5IGFibGUgdG8gd3JpdGUgc2l6ZSBvZiBmcmVlIGJ1ZmZlciBvciBzaXplIG9mIGNvdW50ICovCisKKwkJCQlpZiAoY250IDwgYykKKwkJCQkJYyA9IGNudDsKKwkJCQlrID0gc2l6ZW9mKGludCkgKiBjOworCQkJCWsgLT0gY29weV9mcm9tX3VzZXIoaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArCisJCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQsCisJCQkJCQkgICAgdmFsdWVzLCBrKTsKKwkJCQljID0gayAvIHNpemVvZihpbnQpOworCisJCQkJUERFQlVHKCJDb3B5ICVkIHZhbHVlcyBmcm9tIHVzZXIgc3BhY2UuXG4iLCBjKTsKKworCQkJCWlmICghYykgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9CisJCQkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCArCisJCQkJICAgICBjKSAmIChpbnN0YW5jZS0+Y2lyY19idWYubWFzayk7CisKKwkJCQl2YWx1ZXMgKz0gYzsKKwkJCQljbnQgLT0gYzsKKwkJCQlyZXQgKz0gYzsKKworCQkJCS8qIFZhbHVlcyBhcmUgbm93IGF2YWlsYWJsZSBzbyBlbmFibGUgaW50ZXJydXB0cyAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgIGNwdV9mbGFncyk7CisKKwkJCQlpZiAobWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsKKwkJCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisKKwkJCSpjb3VudCA9IHJldDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9XUklURV9NT0RFX1BSRUxPQUQ6CisJCQlQREVCVUcoIldyaXRlIGZvciBwcmVsb2FkIGNvbnRpbnVvdXMgbW9kZS5cbiIpOworCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SCisJCQkJICAgICgiQ2FuJ3QgUHJlbG9hZCBEQUMgRklGTyB3aGlsZSBjb252ZXJzaW9uIGlzIHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQkJdG1wIHw9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJCWluc3RhbmNlLT5mbGFncyAmPSB+TUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQljID0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisKKwkJCWlmIChjbnQgPCBjKQorCQkJCWMgPSBjbnQ7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKwkJCQlpZiAoZ2V0X3VzZXIodmFsdWUsIHZhbHVlcykpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkNhbid0IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQl2YWx1ZSA8PD0gMTY7CisKKwkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCisJCQkJdmFsdWVzKys7CisJCQl9CisKKwkJCWNudCAtPSBjOworCisJCQlyZXQgKz0gYzsKKworCQkJUERFQlVHKCJXcm90ZSAlZCB2YWx1ZXMgdG8gZmlmby5cbiIsIGMpOworCisJCQl3aGlsZSAoMSkgeworCQkJCWMgPSBtZV9jaXJjX2J1Zl9zcGFjZV90b19lbmQoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGNpcmNfYnVmKTsKKworCQkJCWlmIChjID09IDApCisJCQkJCWJyZWFrOworCisJCQkJaWYgKGNudCA8IGMpCisJCQkJCWMgPSBjbnQ7CisKKwkJCQlpZiAoYyA8PSAwKQorCQkJCQlicmVhazsKKworCQkJCWsgPSBzaXplb2YoaW50KSAqIGM7CisKKwkJCQlrIC09IGNvcHlfZnJvbV91c2VyKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKworCQkJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkLAorCQkJCQkJICAgIHZhbHVlcywgayk7CisKKwkJCQljID0gayAvIHNpemVvZihpbnQpOworCisJCQkJUERFQlVHKCJXcm90ZSAlZCB2YWx1ZXMgdG8gY2lyY3VsYXIgYnVmZmVyLlxuIiwKKwkJCQkgICAgICAgYyk7CisKKwkJCQlpZiAoIWMpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkNhbid0IGNvcHkgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9CisJCQkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCArCisJCQkJICAgICBjKSAmIChpbnN0YW5jZS0+Y2lyY19idWYubWFzayk7CisKKwkJCQl2YWx1ZXMgKz0gYzsKKwkJCQljbnQgLT0gYzsKKwkJCQlyZXQgKz0gYzsKKwkJCX0KKworCQkJKmNvdW50ID0gcmV0OworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJUEVSUk9SKCJJbnZhbGlkIHdyaXRlIG1vZGUgc3BlY2lmaWVkLlxuIik7CisKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERTsKKworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIFNpbmdsZSBtb2RlIG9mIGludmFsaWQKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlQRVJST1IoIlN1YmRldmljZSBpcyBjb25maWd1cmVkIGluIHNpbmdsZSBtb2RlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgdmFsdWU7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZSA9IGRldl9pZDsKKwlpbnQgaTsKKwlpbnQgYyA9IDA7CisJaW50IGMxID0gMDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQREVCVUcoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoISgoMHgxIDw8IChpbnN0YW5jZS0+YW9faWR4ICsgMykpICYgaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZykpKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisJaWYgKCEodG1wICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpICYmCisJICAgICh0bXAgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikgJiYKKwkgICAgKHRtcCAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSkgeworCQljID0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisJCVBERUJVRygiRmlmbyBlbXB0eS5cbiIpOworCX0gZWxzZSBpZiAoKHRtcCAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSAmJgorCQkgICAodG1wICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpICYmCisJCSAgICh0bXAgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikpIHsKKwkJYyA9IE1FNDYwMF9BT19GSUZPX0NPVU5UIC8gMjsKKwkJUERFQlVHKCJGaWZvIHVuZGVyIGhhbGYgZnVsbC5cbiIpOworCX0gZWxzZSB7CisJCWMgPSAwOworCQlQREVCVUcoIkZpZm8gZnVsbC5cbiIpOworCX0KKworCVBERUJVRygiVHJ5IHRvIHdyaXRlIDB4JTA0WCB2YWx1ZXMuXG4iLCBjKTsKKworCWlmICgoaW5zdGFuY2UtPmZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLKSA9PQorCSAgICBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORikgeworCQl3aGlsZSAoYykgeworCQkJYzEgPSBjOworCisJCQlpZiAoYzEgPiAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgLSBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCkpCS8qIE9ubHkgdXAgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJCQkJYzEgPSAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgLQorCQkJCSAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKTsKKworCQkJLyogV3JpdGUgdGhlIHZhbHVlcyB0byB0aGUgRklGTyAqLworCQkJZm9yIChpID0gMDsgaSA8IGMxOyBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyssIGMtLSkgeworCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWxdIDw8IDE2LAorCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQkJZWxzZQorCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWxdLAorCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQl9CisKKwkJCWlmIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA+PSBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkJLyogU3RhcnQgZnJvbSBiZWdpbm5pbmcgKi8KKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCX0KKworCQlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJCcm9rZW4gcGlwZS5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCX0gZWxzZSBpZiAoKGluc3RhbmNlLT5mbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pIHsKKwkJd2hpbGUgKGMgJiYgaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nKSB7CisJCQljMSA9IGM7CisKKwkJCWlmIChjMSA+IChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAtIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKSkJLyogT25seSB1cCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwkJCQljMSA9IChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAtCisJCQkJICAgICAgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwpOworCisJCQlpZiAoYzEgPiBpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcpCS8qIE9ubHkgdXAgdG8gY291bnQgb2YgdXNlciBkZWZpbmVkIG51bWJlciBvZiB2YWx1ZXMgKi8KKwkJCQljMSA9IGluc3RhbmNlLT53cmFwX3JlbWFpbmluZzsKKworCQkJLyogV3JpdGUgdGhlIHZhbHVlcyB0byB0aGUgRklGTyAqLworCQkJZm9yIChpID0gMDsgaSA8IGMxOworCQkJICAgICBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyssIGMtLSwKKwkJCSAgICAgaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nLS0pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi50YWlsXSA8PCAxNiwKKwkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCWVsc2UKKwkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi50YWlsXSwKKwkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJfQorCisJCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPj0gaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpCS8qIFN0YXJ0IGZyb20gYmVnaW5uaW5nICovCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQl9CisKKwkJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCWlmICghaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nKSB7CisJCQlQREVCVUcoIkZpbml0ZSBTVyB3cmFwYXJvdW5kIGRvbmUuXG4iKTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCX0KKworCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJCcm9rZW4gcGlwZS5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJfSBlbHNlIHsJCS8qIFJlZ3VsYXIgY29udGludW91cyBtb2RlICovCisKKwkJd2hpbGUgKDEpIHsKKwkJCWMxID0gbWVfY2lyY19idWZfdmFsdWVzX3RvX2VuZCgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkJCVBERUJVRygiVmFsdWVzIHRvIGVuZCA9ICVkLlxuIiwgYzEpOworCisJCQlpZiAoYzEgPiBjKQorCQkJCWMxID0gYzsKKworCQkJaWYgKGMxIDw9IDApIHsKKwkJCQlQREVCVUcoIldvcmsgZG9uZSBvciBidWZmZXIgZW1wdHkuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgYzE7IGkrKykgeworCQkJCQl2YWx1ZSA9CisJCQkJCSAgICAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKworCQkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArCisJCQkJCSAgICAgIGkpIDw8IDE2OworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCW91dHNsKGluc3RhbmNlLT5maWZvX3JlZywKKwkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsKKwkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCwgYzEpOworCisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9CisJCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsKKwkJCSAgICAgYzEpICYgKGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrKTsKKworCQkJUERFQlVHKCIlZCB2YWx1ZXMgd3JvdGUgdG8gcG9ydCAweCUwNFguXG4iLCBjMSwKKwkJCSAgICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCisJCQljIC09IGMxOworCQl9CisKKwkJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCWlmICghbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CisJCQlQREVCVUcKKwkJCSAgICAoIkRpc2FibGUgSW50ZXJydXB0IGJlY2F1c2Ugbm8gdmFsdWVzIGxlZnQgaW4gYnVmZmVyLlxuIik7CisJCQl0bXAgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisKKwkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCVBERUJVRygiQnJva2VuIHBpcGUgaW4gbWU0NjAwX2FvX2lzci5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWtmcmVlKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lNDYwMF9hb19zdWJkZXZpY2VfdCAqbWU0NjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LCBpbnQgZmlmbywgaW50IGlycSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnX2xvY2sgPSBwcmVsb2FkX3JlZ19sb2NrOworCXN1YmRldmljZS0+cHJlbG9hZF9mbGFncyA9IHByZWxvYWRfZmxhZ3M7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjaXJjdWxhciBidWZmZXIgKi8KKwlzdWJkZXZpY2UtPmNpcmNfYnVmLm1hc2sgPSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQgLSAxOworCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0ga21hbGxvYyhNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZS0+Y2lyY19idWYuYnVmKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZS0+Y2lyY19idWYuYnVmLCAwLCBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSk7CisKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCXN1YmRldmljZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogSW5pdGlhbGl6ZSBzaW5nbGUgdmFsdWUgdG8gMFYgKi8KKwlzdWJkZXZpY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKworCS8qIFN0b3JlIGFuYWxvZyBvdXRwdXQgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmFvX2lkeCA9IGFvX2lkeDsKKworCS8qIFN0b3JlIGlmIGFuYWxvZyBvdXRwdXQgaGFzIGZpZm8gKi8KKwlzdWJkZXZpY2UtPmZpZm8gPSBmaWZvOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKworCWlmIChhb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKworCQlpZiAoaW5sKHN1YmRldmljZS0+cmVnX2Jhc2UgKyBNRTQ2MDBfQU9fQk9TQ0hfUkVHKSA9PSAweDIwMDAwKSB7CisJCQlQSU5GTygiQm9zY2ggZmlybXdhcmUgaW4gdXNlIGZvciBjaGFubmVsIDAuXG4iKTsKKwkJCXN1YmRldmljZS0+Ym9zY2hfZncgPSAxOworCQl9IGVsc2UgeworCQkJc3ViZGV2aWNlLT5ib3NjaF9mdyA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJvc2NoX2Z3ID0gMDsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAyKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJvc2NoX2Z3ID0gMDsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5ib3NjaF9mdyA9IDA7CisJfQorCisJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0lSUV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+cHJlbG9hZF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYOworCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCisJaWYgKHJlcXVlc3RfaXJxCisJICAgIChzdWJkZXZpY2UtPmlycSwgbWU0NjAwX2FvX2lzciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisJICAgICBNRTQ2MDBfTkFNRSwgc3ViZGV2aWNlKSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJa2ZyZWUoc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU0NjAwX2FvX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9hb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfYW9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTQ2MDBfYW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWU0NjAwX2FvX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXg7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV90aW1lciA9IG1lNDYwMF9hb19xdWVyeV90aW1lcjsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKKyNlbmRpZiAvLyBCT1NDSAorCisvKiBDb21tb24gZnVuY3Rpb25zCisqLworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJaWYgKCgqbWF4IDw9IChNRTQ2MDBfQU9fTUFYX1JBTkdFICsgMTAwMCkpCisJCSAgICAmJiAoKm1pbiA+PSBNRTQ2MDBfQU9fTUlOX1JBTkdFKSkgeworCQkJKm1pbiA9IE1FNDYwMF9BT19NSU5fUkFOR0U7CisJCQkqbWF4ID0gTUU0NjAwX0FPX01BWF9SQU5HRTsKKwkJCSptYXhkYXRhID0gTUU0NjAwX0FPX01BWF9EQVRBOworCQkJKnJhbmdlID0gMDsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiTm8gbWF0Y2hpbmcgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTk9fUkFOR0U7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcGh5c2ljYWwgdW5pdCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVU5JVDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICgodW5pdCA9PSBNRV9VTklUX1ZPTFQpIHx8ICh1bml0ID09IE1FX1VOSVRfQU5ZKSkgeworCQkqY291bnQgPSAxOworCX0gZWxzZSB7CisJCSpjb3VudCA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm8obWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAocmFuZ2UgPT0gMCkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IE1FNDYwMF9BT19NSU5fUkFOR0U7CisJCSptYXggPSBNRTQ2MDBfQU9fTUFYX1JBTkdFOworCQkqbWF4ZGF0YSA9IE1FNDYwMF9BT19NQVhfREFUQTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcmFuZ2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SQU5HRTsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfdGltZXIobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIGludCB0aW1lciwKKwkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICgodGltZXIgIT0gTUVfVElNRVJfQUNRX1NUQVJUKSAmJiAodGltZXIgIT0gTUVfVElNRVJfQ09OVl9TVEFSVCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FUjsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy9TdHJlYW1pbmcgZGV2aWNlLgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTQ2MDBfQU9fQkFTRV9GUkVRVUVOQ1k7CisJCWlmICh0aW1lciA9PSBNRV9USU1FUl9BQ1FfU1RBUlQpIHsKKwkJCSptaW5fdGlja3MgPSBNRTQ2MDBfQU9fTUlOX0FDUV9USUNLUzsKKwkJCSptYXhfdGlja3MgPSBNRTQ2MDBfQU9fTUFYX0FDUV9USUNLUzsKKwkJfSBlbHNlIGlmICh0aW1lciA9PSBNRV9USU1FUl9DT05WX1NUQVJUKSB7CisJCQkqbWluX3RpY2tzID0gTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTOworCQkJKm1heF90aWNrcyA9IE1FNDYwMF9BT19NQVhfQ0hBTl9USUNLUzsKKwkJfQorCX0gZWxzZSB7CQkvL05vdCBzdHJlYW1pbmcgZGV2aWNlIQorCQkqYmFzZV9mcmVxdWVuY3kgPSAwOworCQkqbWluX3RpY2tzID0gMDsKKwkJKm1heF90aWNrcyA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpudW1iZXIgPSAxOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSp0eXBlID0gTUVfVFlQRV9BTzsKKwkqc3VidHlwZSA9IChpbnN0YW5jZS0+ZmlmbykgPyBNRV9TVUJUWVBFX1NUUkVBTUlORyA6IE1FX1NVQlRZUEVfU0lOR0xFOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpjYXBzID0KKwkgICAgTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTIHwgKChpbnN0YW5jZS0+ZmlmbykgPyBNRV9DQVBTX0FPX0ZJRk8gOgorCQkJCQkgICBNRV9DQVBTX05PTkUpOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkgYXJndW1lbnQgY291bnQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQX0FSR19DT1VOVDsKKwl9CisKKwlzd2l0Y2ggKGNhcCkgeworCWNhc2UgTUVfQ0FQX0FJX0ZJRk9fU0laRToKKwkJYXJnc1swXSA9IChpbnN0YW5jZS0+ZmlmbykgPyBNRTQ2MDBfQU9fRklGT19DT1VOVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkU6CisJCWFyZ3NbMF0gPQorCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpID8gTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NBUDsKKwkJYXJnc1swXSA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJjNGEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hby5oCkBAIC0wLDAgKzEsMjYzIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9hby5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTQwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FPX0hfCisjIGRlZmluZSBfTUU0NjAwX0FPX0hfCisKKyMgaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorIyBpbmNsdWRlICJtZXN1YmRldmljZS5oIgorIyBpbmNsdWRlICJtZWNpcmNfYnVmLmgiCisjIGluY2x1ZGUgIm1laW9jdGwuaCIKKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGlmZGVmIEJPU0NICisjICAgdW5kZWYgTUVfU1lOQVBTRQorIyAgIGlmbmRlZiBfQ0JVRkZfMzJiX3QKKyMgCSBkZWZpbmUgX0NCVUZGXzMyYl90CisjICAgZW5kaWYgLy9fQ0JVRkZfMzJiX3QKKyMgIGVuZGlmIC8vQk9TQ0gKKworIyAgZGVmaW5lIE1FNDYwMF9BT19NQVhfU1VCREVWSUNFUwkJNAorIyAgZGVmaW5lIE1FNDYwMF9BT19GSUZPX0NPVU5UCQkJNDA5NgorCisjICBkZWZpbmUgTUU0NjAwX0FPX0JBU0VfRlJFUVVFTkNZCQkzMzAwMDAwMExMCisKKyMgIGRlZmluZSBNRTQ2MDBfQU9fTUlOX0FDUV9USUNLUwkJMExMCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9BQ1FfVElDS1MJCTBMTAorCisjICBkZWZpbmUgTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTCQk2NkxMCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTCQkweEZGRkZGRkZGTEwKKworIyAgZGVmaW5lIE1FNDYwMF9BT19NSU5fUkFOR0UJCQktMTAwMDAwMDAKKyMgIGRlZmluZSBNRTQ2MDBfQU9fTUFYX1JBTkdFCQkJOTk5OTY5NAorCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9EQVRBCQkJMHhGRkZGCisKKyMgIGlmZGVmIE1FX1NZTkFQU0UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyMgIGVsc2UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk1CS8vIDJebiBQQUdFUyA9Pj4gMTI4S0IKKyMgIGVuZGlmCisjICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUgCQlQQUdFX1NJWkU8PE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSCS8vIEJ1ZmZlciBzaXplIGluIGJ5dGVzLgorCisjICBpZmRlZiBfQ0JVRkZfMzJiX3QKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UCSgoTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQzMl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyMgIGVsc2UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UCSgoTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQxNl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBNRTQ2MDBfQU9fQ09OVElOT1VTCQkJCQkweDAKKyMgIGRlZmluZSBNRTQ2MDBfQU9fV1JBUF9NT0RFCQkJCQkweDEKKyMgIGRlZmluZSBNRTQ2MDBfQU9fSFdfTU9ERQkJCQkJCTB4MgorCisjICBkZWZpbmUgTUU0NjAwX0FPX0hXX1dSQVBfTU9ERQkJCQkoTUU0NjAwX0FPX1dSQVBfTU9ERSB8IE1FNDYwMF9BT19IV19NT0RFKQorIyAgZGVmaW5lIE1FNDYwMF9BT19TV19XUkFQX01PREUJCQkJTUU0NjAwX0FPX1dSQVBfTU9ERQorCisjICBkZWZpbmUgTUU0NjAwX0FPX0lORl9TVE9QX01PREUJCQkJMHgwCisjICBkZWZpbmUgTUU0NjAwX0FPX0FDUV9TVE9QX01PREUJCQkJMHgxCisjICBkZWZpbmUgTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFCQkJCTB4MgorCisjICBpZmRlZiBCT1NDSAkJCS8vU1BFQ0lBTCBCVUlMRCBGT1IgQk9TQ0gKKworLyogQml0cyBmb3IgZmxhZ3MgYXR0cmlidXRlLiAqLworIyAgIGRlZmluZSBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUJCQkweDEKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV8wCQkweDIKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV8xCQkweDQKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLCShNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFXzAgfCBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFXzEpCisKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9OT05FCTB4MAorIyAgIGRlZmluZSBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORgkJMHgyCisjICAgZGVmaW5lIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfRklOCQkweDQKKworCS8qKgorCSogQGJyaWVmIFRoZSBNRS00MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorCSovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqcHJlbG9hZF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI3ByZWxvYWRfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisKKwl1bnNpZ25lZCBpbnQgaXJxOwkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkvKio8IENpcmN1bGFyIGJ1ZmZlciBob2xkaW5nIG1lYXN1cm1lbnQgZGF0YS4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCWludCBzaW5nbGVfdmFsdWU7CQkJCQkvKio8IE1pcnJvciBvZiB0aGUgdmFsdWUgd3JpdHRlbiBpbiBzaW5nbGUgbW9kZS4gKi8KKworCWludCB2b2xhdGlsZSBmbGFnczsJCQkJCS8qKjwgRmxhZ3MgdXNlZCBmb3Igc3RvcmluZyBTVyB3cmFwYXJvdW5kIHNldHVwIGFuZCBlcnJvciBzaWduYWxsaW5nIGZyb20gSVNSLiAqLworCXVuc2lnbmVkIGludCB3cmFwX2NvdW50OwkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCB3cmFwYXJvdW5kIGN5Y2xlIGNvdW50LiAqLworCXVuc2lnbmVkIGludCB3cmFwX3JlbWFpbmluZzsJCS8qKjwgVGhlIHdyYXBhcm91bmQgY3ljbGUgZG93biBjb3VudGVyIHVzZWQgYnkgYSBydW5uaW5nIGNvbnZlcnNpb24uICovCisJdW5zaWduZWQgaW50IGFvX2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhpcyBhbmFsb2cgb3V0cHV0IG9uIHRoaXMgZGV2aWNlLiAqLworCWludCBmaWZvOwkJCQkJCQkvKio8IElmIHNldCB0aGlzIGRldmljZSBoYXMgYSBGSUZPLiAqLworCisJaW50IGJvc2NoX2Z3OwkJCQkJCS8qKjwgSWYgc2V0IHRoZSBib3NjaCBmaXJtd2FyZSBpcyBpbiBQUk9NLiAqLworCisJLyogUmVnaXN0ZXJzICovCisJdWludDMyX3QgY3RybF9yZWc7CisJdWludDMyX3Qgc3RhdHVzX3JlZzsKKwl1aW50MzJfdCBmaWZvX3JlZzsKKwl1aW50MzJfdCBzaW5nbGVfcmVnOworCXVpbnQzMl90IHRpbWVyX3JlZzsKKwl1aW50MzJfdCBpcnFfc3RhdHVzX3JlZzsKKwl1aW50MzJfdCBwcmVsb2FkX3JlZzsKKwl1aW50MzJfdCByZWdfYmFzZTsKK30gbWU0NjAwX2FvX3N1YmRldmljZV90OworCisJLyoqCisJKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDAwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZSBmb3IgQk9TQ0ggcHJvamVjdC4KKwkqCisJKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKwkqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKwkqIEBwYXJhbSBwcmVsb2FkX2ZsYWdzIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGhvbGQmdHJpZ2dlciByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorCSogQHBhcmFtIGFvX2lkeCBTdWJkZXZpY2UgbnVtYmVyLgorCSogQHBhcmFtIGZpZm8gRmxhZyBzZXQgaWYgc3ViZGV2aWNlIGhhcyBoYXJkd2FyZSBGSUZPLgorCSogQHBhcmFtIGlycSBJUlEgbnVtYmVyLgorCSoKKwkqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorCSogTlVMTCBvbiBlcnJvci4KKwkqLworbWU0NjAwX2FvX3N1YmRldmljZV90ICptZTQ2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIGludCBhb19pZHgsIGludCBmaWZvLCBpbnQgaXJxKTsKKworIyAgZWxzZQkvL35CT1NDSAorCisvL01FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRSBpcyBPQlNPTEVURSA9PiBOb3cgcHJvYmxlbXMgYXJlIHJlcG9ydGVkIGluIHN0YXR1cy4KKwordHlwZWRlZiBlbnVtIE1FNDYwMF9BT19TVEFUVVMgeworCWFvX3N0YXR1c19ub25lID0gMCwKKwlhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQsCisJYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCwKKwlhb19zdGF0dXNfc2luZ2xlX3J1biwKKwlhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0LAorCWFvX3N0YXR1c19zaW5nbGVfZW5kLAorCWFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCwKKwlhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0LAorCWFvX3N0YXR1c19zdHJlYW1fcnVuLAorCWFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQsCisJYW9fc3RhdHVzX3N0cmVhbV9lbmQsCisJYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yLAorCWFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yLAorCWFvX3N0YXR1c19zdHJlYW1fZXJyb3IsCisJYW9fc3RhdHVzX2xhc3QKK30gTUU0NjAwX0FPX1NUQVRVUzsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2FvX3RpbWVvdXQgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworfSBtZTQ2MDBfYW9fdGltZW91dF90OworCisJLyoqCisJKiBAYnJpZWYgVGhlIE1FLTQ2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisJKi8KK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9hb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwl1bnNpZ25lZCBpbnQgYW9faWR4OwkJCQkJCS8qKjwgVGhlIGluZGV4IG9mIHRoaXMgYW5hbG9nIG91dHB1dCBvbiB0aGlzIGRldmljZS4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqcHJlbG9hZF9yZWdfbG9jazsJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCBwcmVsb2FkX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisKKwkvKiBIYXJkd2FyZSBmZWF1dHJlcyAqLworCXVuc2lnbmVkIGludCBpcnE7CQkJCQkJCS8qKjwgVGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1MuICovCisJaW50IGZpZm87CQkJCQkJCQkJLyoqPCBJZiBzZXQgdGhpcyBkZXZpY2UgaGFzIGEgRklGTy4gKi8KKwlpbnQgYml0cGF0dGVybjsJCQkJCQkJCS8qKjwgSWYgc2V0IHRoaXMgZGV2aWNlIHVzZSBiaXRwYXR0ZXJuLiAqLworCisJaW50IHNpbmdsZV92YWx1ZTsJCQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIG91dHB1dCB2YWx1ZSBpbiBzaW5nbGUgbW9kZS4gKi8KKwlpbnQgc2luZ2xlX3ZhbHVlX2luX2ZpZm87CQkJCQkvKio8IE1pcnJvciBvZiB0aGUgdmFsdWUgd3JpdHRlbiBpbiBzaW5nbGUgbW9kZS4gKi8KKwl1aW50MzJfdCBjdHJsX3RyZzsJCQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHRyaWdnZXIgc2V0dGluZ3MuICovCisKKwl2b2xhdGlsZSBpbnQgbW9kZTsJCQkJCQkJLyoqPCBGbGFncyB1c2VkIGZvciBzdG9yaW5nIFNXIHdyYXBhcm91bmQgc2V0dXAqLworCWludCBzdG9wX21vZGU7CQkJCQkJCQkvKio8IFRoZSB1c2VyIGRlZmluZWQgc3RvcCBjb25kaXRpb24gZmxhZy4gKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnRfbW9kZTsKKwl1bnNpZ25lZCBpbnQgc3RvcF9jb3VudDsJCQkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCBkYXRlcyBwcmVzZW50YXRpb24gZW5kIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBzdG9wX2RhdGFfY291bnQ7CQkJCS8qKjwgVGhlIHN0b3AgcHJlc2VudGF0aW9uIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBkYXRhX2NvdW50OwkJCQkJLyoqPCBUaGUgcmVhbCBwcmVzZW50YXRpb24gY291bnQuICovCisJdW5zaWduZWQgaW50IHByZWxvYWRlZF9jb3VudDsJCQkJLyoqPCBUaGUgbmV4dCBkYXRhIGFkZHJlcyBpbiBidWZmZXIuIDw9IGZvciB3cmFwYXJvdW5kIG1vZGUuICovCisJaW50IGhhcmR3YXJlX3N0b3BfZGVsYXk7CQkJCQkvKio8IFRoZSB0aW1lIHRoYXQgc3RvcCBjYW4gdGFrZS4gVGhpcyBpcyBvbmx5IHRvIG5vdCBzaG93IGhhcmR3YXJlIGJ1ZyB0byB1c2VyLiAqLworCisJdm9sYXRpbGUgZW51bSBNRTQ2MDBfQU9fU1RBVFVTIHN0YXR1czsJCS8qKjwgVGhlIGN1cnJlbnQgc3RyZWFtIHN0YXR1cyBmbGFnLiAqLworCW1lNDYwMF9hb190aW1lb3V0X3QgdGltZW91dDsJCQkJLyoqPCBUaGUgdGltZW91dCBmb3Igc3RhcnQgaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2RlLiAqLworCisJCQkJCQkJCQkJLyogUmVnaXN0ZXJzICovLyoqPCBBbGwgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIGxvbmcuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBmaWZvX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNpbmdsZV9yZWc7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIHByZWxvYWRfcmVnOworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisKKwkvKiBTb2Z0d2FyZSBidWZmZXIgKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkJCS8qKjwgQ2lyY3VsYXIgYnVmZmVyIGhvbGRpbmcgbWVhc3VybWVudCBkYXRhLiAzMiBiaXQgbG9uZyAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CQkJCS8qKjwgV2FpdCBxdWV1ZSB0byBwdXQgb24gdGFza3Mgd2FpdGluZyBmb3IgZGF0YSB0byBhcnJpdmUuICovCisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dvcmtxdWV1ZTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IHdvcmtfc3RydWN0IGFvX2NvbnRyb2xfdGFzazsKKyNlbHNlCisJc3RydWN0IGRlbGF5ZWRfd29yayBhb19jb250cm9sX3Rhc2s7CisjZW5kaWYKKworCXZvbGF0aWxlIGludCBhb19jb250cm9sX3Rhc2tfZmxhZzsJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KKworfSBtZTQ2MDBfYW9fc3ViZGV2aWNlX3Q7CisKKwkvKioKKwkqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00NjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCSoKKwkqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorCSogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorCSogQHBhcmFtIHByZWxvYWRfZmxhZ3MgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgaG9sZCZ0cmlnZ2VyIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisJKiBAcGFyYW0gYW9faWR4IFN1YmRldmljZSBudW1iZXIuCisJKiBAcGFyYW0gZmlmbyBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhhcmR3YXJlIEZJRk8uCisJKiBAcGFyYW0gaXJxIElSUSBudW1iZXIuCisJKiBAcGFyYW0gbWU0NjAwX3dxIFF1ZXVlIGZvciBhc3luY2hyb25vdXMgdGFzayAoMSBxdWV1ZSBmb3IgYWxsIHN1YmRldmljZSBvbiAxIGJvYXJkKS4KKwkqCisJKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKwkqIE5VTEwgb24gZXJyb3IuCisJKi8KK21lNDYwMF9hb19zdWJkZXZpY2VfdCAqbWU0NjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBmaWZvLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU0NjAwX3dxKTsKKworIyAgZW5kaWYgLy9CT1NDSAorIyBlbmRpZgkvL19fS0VSTkVMX18KKyNlbmRpZiAvLyB+X01FNDYwMF9BT19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW9fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzZDgyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW9fcmVnLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTQwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FPX1JFR19IXworI2RlZmluZSBfTUU0NjAwX0FPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9BT18wMF9DVFJMX1JFRwkJCQkJMHgwMAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAwX1NUQVRVU19SRUcJCQkJCTB4MDQJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BT18wMF9GSUZPX1JFRwkJCQkJMHgwOAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAwX1NJTkdMRV9SRUcJCQkJCTB4MEMJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wMF9USU1FUl9SRUcJCQkJCTB4MTAJLy8gXy9XCisKKyNkZWZpbmUgTUU0NjAwX0FPXzAxX0NUUkxfUkVHCQkJCQkweDE4CS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDFfU1RBVFVTX1JFRwkJCQkJMHgxQwkvLyBSL18KKyNkZWZpbmUgTUU0NjAwX0FPXzAxX0ZJRk9fUkVHCQkJCQkweDIwCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQU9fMDFfU0lOR0xFX1JFRwkJCQkJMHgyNAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAxX1RJTUVSX1JFRwkJCQkJMHgyOAkvLyBfL1cKKworI2RlZmluZSBNRTQ2MDBfQU9fMDJfQ1RSTF9SRUcJCQkJCTB4MzAJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wMl9TVEFUVVNfUkVHCQkJCQkweDM0CS8vIFIvXworI2RlZmluZSBNRTQ2MDBfQU9fMDJfRklGT19SRUcJCQkJCTB4MzgJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BT18wMl9TSU5HTEVfUkVHCQkJCQkweDNDCS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDJfVElNRVJfUkVHCQkJCQkweDQwCS8vIF8vVworCisjZGVmaW5lIE1FNDYwMF9BT18wM19DVFJMX1JFRwkJCQkJMHg0OAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAzX1NUQVRVU19SRUcJCQkJCTB4NEMJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BT18wM19GSUZPX1JFRwkJCQkJMHg1MAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAzX1NJTkdMRV9SRUcJCQkJCTB4NTQJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wM19USU1FUl9SRUcJCQkJCTB4NTgJLy8gXy9XCisKKyNkZWZpbmUgTUU0NjAwX0FPX0RFTVVYX0FESlVTVF9SRUcJCQkJMHhCQwkvLyAtL1cKKyNkZWZpbmUgTUU0NjAwX0FPX0RFTVVYX0FESlVTVF9WQUxVRQkJCTB4NEMKKworI2lmZGVmIEJPU0NICisjIGRlZmluZSBNRTQ2MDBfQU9fQk9TQ0hfUkVHCQkJCQkweEM0CisKKyMgZGVmaW5lIE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYCQkJCTB4QjQJLy8gUi9XCisKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzAJCQkJMHgwMDEKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzEJCQkJMHgwMDIKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX01BU0tfTU9ERQkJCQkweDAwMworCisjZWxzZSAvL35CT1NDSAorCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX1JFRwkJCQkJCTB4QjQJLy8gUi9XICAgIC8vL01FNDYwMF9BT19TWU5DX1JFRyA8PT0+IE1FNDYwMF9BT19QUkVMT0FEX1JFRyA8PT0+IE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYCisKKyMgZGVmaW5lIE1FNDYwMF9BT19NT0RFX1NJTkdMRQkJCQkJMHgwMDAwMDAwMAorIyBkZWZpbmUgTUU0NjAwX0FPX01PREVfV1JBUEFST1VORAkJCQkweDAwMDAwMDAxCisjIGRlZmluZSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTCQkJCTB4MDAwMDAwMDIKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSwkJCQkoTUU0NjAwX0FPX01PREVfV1JBUEFST1VORCB8IE1FNDYwMF9BT19NT0RFX0NPTlRJTlVPVVMpCisjZW5kaWYgLy9CT1NDSAorCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFX1dSQVBBUk9VTkQJCU1FNDYwMF9BT19NT0RFX1dSQVBBUk9VTkQKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX01PREVfQ09OVElOT1VTCQlNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHCQkweDAwMDAwMDEwCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAkJMHgwMDAwMDA4MAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0RPCQkJMHgwMDAwMDEwMAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RICTB4MDAwMDA4MDAKKy8qCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0hPTERfMAkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19IT0xEXzEJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfSE9MRF8yCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0hPTERfMwkJCQkJMHgwMDAwMDAwOAorKi8KKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfSE9MRAkJCQkJCTB4MDAwMDAwMDEKKworLyoKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUdfMAkJCQkweDAwMDEwMDAwCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0VYVF9UUklHXzEJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJR18yCQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUdfMwkJCQkweDAwMDgwMDAwCisqLworI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRwkJCQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIE1FNDYwMF9BT19FWFRfVFJJRwkJCQkJCTB4ODAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00JCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GRgkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRgkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9FRgkJCQkJMHgwMDAwMDAwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0NTU4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU0NjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorCisjaW5jbHVkZSAibWVmaXJtd2FyZS5oIgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZG8uaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGkuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvLmgiCisjaW5jbHVkZSAibWU4MjU0LmgiCisjaW5jbHVkZSAibWU0NjAwX2FpLmgiCisjaW5jbHVkZSAibWU0NjAwX2FvLmgiCisjaW5jbHVkZSAibWU0NjAwX2V4dF9pcnEuaCIKKworLyoqCisgKiBAYnJpZWYgR2xvYmFsIHZhcmlhYmxlLgorICogVGhpcyBpcyB3b3JraW5nIHF1ZXVlIGZvciBydW5pbmcgYSBzZXBhcmF0ZSBhdGFzayB0aGF0IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHdvcmsgc3RhdHVzIChzdGFydCwgc3RvcCwgdGltZW91dHMpLgorICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1lNDYwMF93b3JrcXVldWU7CisKKyNpZmRlZiBCT1NDSAorbWVfZGV2aWNlX3QgKm1lNDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UsIGludCBtZV9ib3NjaF9mdykKKyNlbHNlIC8vfkJPU0NICittZV9kZXZpY2VfdCAqbWU0NjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyNlbmRpZgkJCQkvL0JPU0NICit7CisJbWU0NjAwX2RldmljZV90ICptZTQ2MDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTQ2MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lNDYwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgTUUtNDYwMCBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lNDYwMF9kZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIERvd25sb2FkIHRoZSB4aWxpbnggZmlybXdhcmUuCisJaWYgKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwKSB7CS8vSmVreWxsIDw9PiBtZTQ2MTAKKwkJZXJyID0KKwkJICAgIG1lX3hpbGlueF9kb3dubG9hZChtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCSAgICAgICByZWdfYmFzZXNbMV0sCisJCQkJICAgICAgIG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJICAgICAgIHJlZ19iYXNlc1s1XSwgJnBjaV9kZXZpY2UtPmRldiwKKwkJCQkgICAgICAgIm1lNDYxMC5iaW4iKTsKKwl9IGVsc2UgewkJLy8gR2VuZXJhbCBtZTQ2MDAgZmlybXdhcmUKKyNpZmRlZiBCT1NDSAorCQllcnIgPQorCQkgICAgbWVfeGlsaW54X2Rvd25sb2FkKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJICAgICAgIHJlZ19iYXNlc1sxXSwKKwkJCQkgICAgICAgbWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkgICAgICAgcmVnX2Jhc2VzWzVdLCAmcGNpX2RldmljZS0+ZGV2LAorCQkJCSAgICAgICAobWVfYm9zY2hfZncpID8gIm1lNDYwMF9ib3NjaC5iaW4iIDoKKwkJCQkgICAgICAgIm1lNDYwMC5iaW4iKTsKKyNlbHNlIC8vfkJPU0NICisJCWVyciA9CisJCSAgICBtZV94aWxpbnhfZG93bmxvYWQobWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCSAgICAgICBtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCSAgICAgICByZWdfYmFzZXNbNV0sICZwY2lfZGV2aWNlLT5kZXYsCisJCQkJICAgICAgICJtZTQ2MDAuYmluIik7CisjZW5kaWYKKwl9CisKKwlpZiAoZXJyKSB7CisJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgZG93bmxvYWQgZmlybXdhcmUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLgorCXZlcnNpb25faWR4ID0KKwkgICAgbWU0NjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZtZTQ2MDBfZGV2aWNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCW1lNDYwMF9kZXZpY2UtPnByZWxvYWRfZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2luaXQoJm1lNDYwMF9kZXZpY2UtPmRpb19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU0NjAwX2RldmljZS0+YWlfY3RybF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU0NjAwX2RldmljZS0+Y3RyX2N0cmxfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTQ2MDBfZGV2aWNlLT5jdHJfY2xrX3NyY19yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgZGlnaXRhbCBpbnB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2RpX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBkaWdpdGFsIG91dHB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZG9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2RvX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBkaWdpdGFsIGlucHV0L291dHB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lNDYwMF9kaW9fY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgICBkb19zdWJkZXZpY2VzICsKKwkJCQkJCQkgICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgIGRpX3N1YmRldmljZXMgKyBpLAorCQkJCQkJCSAgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBkaW9fbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgYW5hbG9nIGlucHV0IGluc3RhbmNlcy4KKwlmb3IgKGkgPSAwOyBpIDwgbWU0NjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5haV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTQ2MDBfYWlfY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYWlfY2hhbm5lbHMsCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhaV9yYW5nZXMsCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhaV9pc29sYXRlZCwKKwkJCQkJCQkgICAgIG1lNDYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgIGFpX3NoLAorCQkJCQkJCSAgICAgbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGFpX2N0cmxfbG9jaywKKwkJCQkJCQkgICAgIG1lNDYwMF93b3JrcXVldWUpOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU0NjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJLy8gQ3JlYXRlIGFuYWxvZyBvdXRwdXQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmFvX3N1YmRldmljZXM7IGkrKykgeworI2lmZGVmIEJPU0NICisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2FvX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCQkJICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBwcmVsb2FkX2ZsYWdzLCBpLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYW9fZmlmbywKKwkJCQkJCQkgICAgIG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pcnEpOworI2Vsc2UgLy9+Qk9TQ0gKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTQ2MDBfYW9fY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgJm1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfZmxhZ3MsIGksCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhb19maWZvLAorCQkJCQkJCSAgICAgbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgIG1lNDYwMF93b3JrcXVldWUpOworI2VuZGlmCisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgY291bnRlciBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uY3RyX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODI1NF9jb25zdHJ1Y3RvcihtZTQ2MDBfZGV2aWNlLT5iYXNlLgorCQkJCQkJCSAgaW5mby5wY2kuZGV2aWNlX2lkLAorCQkJCQkJCSAgbWU0NjAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQkgIGluZm8ucGNpLnJlZ19iYXNlc1szXSwKKwkJCQkJCQkgIDAsIGksCisJCQkJCQkJICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICBjdHJfY3RybF9yZWdfbG9jaywKKwkJCQkJCQkgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgIGN0cl9jbGtfc3JjX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBleHRlcm5hbCBpbnRlcnJ1cHQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmV4dF9pcnFfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJICAgIG1lNDYwMF9leHRfaXJxX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sCisJCQkJCSAgICAgICBtZTQ2MDBfZGV2aWNlLT5iYXNlLmlycSwKKwkJCQkJICAgICAgICZtZTQ2MDBfZGV2aWNlLT5haV9jdHJsX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU0NjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWU0NjAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKyNpZm5kZWYgQk9TQ0gKKwltZTQ2MDBfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm1lNDYwMCIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTQ2MDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworI2lmbmRlZiBCT1NDSAorCWZsdXNoX3dvcmtxdWV1ZShtZTQ2MDBfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtZTQ2MDBfd29ya3F1ZXVlKTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChtZTQ2MDBfaW5pdCk7Cittb2R1bGVfZXhpdChtZTQ2MDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUgorICAgICgiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4gJiBLcnp5c3p0b2YgR2FudHprZSA8ay5nYW50emtlQG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgTUUtNDZ4eCBEZXZpY2VzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtNDZ4eCBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lNDYwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4MTJkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUU0NjAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNDYwMCBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBkb19zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBkaV9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgY3RyX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGFpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGFpX2NoYW5uZWxzOworCXVuc2lnbmVkIGludCBhaV9yYW5nZXM7CisJdW5zaWduZWQgaW50IGFpX2lzb2xhdGVkOworCXVuc2lnbmVkIGludCBhaV9zaDsKKwl1bnNpZ25lZCBpbnQgYW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fZmlmbzsJLy9Ib3cgbWFueSBkZXZpY2VzIGhhdmUgRklGTworCXVuc2lnbmVkIGludCBleHRfaXJxX3N1YmRldmljZXM7Cit9IG1lNDYwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lNDYwMF92ZXJzaW9uX3QgbWU0NjAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwLCAwLCAwLCA0LCAzLCAxLCAxNiwgMSwgMCwgMCwgMCwgMCwgMX0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTAsIDAsIDAsIDQsIDAsIDEsIDE2LCA0LCAwLCAwLCAwLCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MCwgMCwgMCwgNCwgMywgMSwgMTYsIDQsIDAsIDAsIDIsIDAsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEksIDEsIDEsIDIsIDMsIDEsIDE2LCA0LCAxLCAwLCAyLCAwLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTLCAwLCAwLCA0LCAzLCAxLCAxNiwgNCwgMCwgMSwgMiwgMCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVMsIDEsIDEsIDIsIDMsIDEsIDE2LCA0LCAxLCAxLCAyLCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MCwgMCwgMCwgNCwgMywgMSwgMzIsIDQsIDAsIDAsIDQsIDAsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEksIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAwLCA0LCAwLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTLCAwLCAwLCA0LCAzLCAxLCAzMiwgNCwgMCwgMSwgNCwgMCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVMsIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAxLCA0LCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MCwgMCwgMCwgNCwgMywgMSwgMzIsIDQsIDAsIDAsIDQsIDQsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MEksIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAwLCA0LCA0LCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTLCAwLCAwLCA0LCAzLCAxLCAzMiwgNCwgMCwgMSwgNCwgNCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVMsIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAxLCA0LCA0LCAxfSwKKworCXswfSwKK307CisKKyNkZWZpbmUgTUU0NjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lNDYwMF92ZXJzaW9ucykgLyBzaXplb2YobWU0NjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTQ2MDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lNDYwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTQ2MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lNDYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUU0NjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWU0NjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IHByZWxvYWRfcmVnX2xvY2s7CQkvKio8IEd1YXJkcyB0aGUgcHJlbG9hZCByZWdpc3RlciBvZiB0aGUgYW5hb2xvZyBvdXRwdXQgZGV2aWNlcy4gKi8KKwl1bnNpZ25lZCBpbnQgcHJlbG9hZF9mbGFnczsJCQkvKio8IFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAjcHJlbG9hZF9yZWdfbG9jay4gKi8KKwlzcGlubG9ja190IGRpb19sb2NrOwkJCQkvKio8IExvY2tzIHRoZSBjb250cm9sIHJlZ2lzdGVyIG9mIHRoZSBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2VzLiAqLworCXNwaW5sb2NrX3QgYWlfY3RybF9sb2NrOwkJCS8qKjwgTG9ja3MgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgb2YgdGhlIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UuICovCisJc3BpbmxvY2tfdCBjdHJfY3RybF9yZWdfbG9jazsJCS8qKjwgTG9ja3MgdGhlIGNvdW50ZXIgY29udHJvbCByZWdpc3Rlci4gKi8KKwlzcGlubG9ja190IGN0cl9jbGtfc3JjX3JlZ19sb2NrOwkvKio8IE5vdCB1c2VkIG9uIHRoaXMgZGV2aWNlIGJ1dCBuZWVkZWQgZm9yIHRoZSBtZTgyNTQgc3ViZGV2aWNlIGNvbnN0cnVjdG9yIGNhbGwuICovCit9IG1lNDYwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqIEBwYXJhbSBtZV9ib3NjaF9mdyBJZiBzZXQgdGhlIGRldmljZSBzaGFsbCB1c2UgdGhlIGJvc2NoIGZpcm13YXJlLiAoT25seSBmb3Igc3BlY2lhbCBCT1NDSCBidWlsZCkKKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS00NjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworCisjaWZkZWYgQk9TQ0gKKy8qKgorICogQGJyaWVmIFRoZSBNRS00NjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKiBAcGFyYW0gbWVfYm9zY2hfZncgSWYgc2V0IHRoZSBkZXZpY2Ugc2hhbGwgdXNlIHRoZSBib3NjaCBmaXJtd2FyZS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS00NjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lNDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UsIGludCBtZV9ib3NjaF9mdykKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworI2Vsc2UgLy9+Qk9TQ0gKKy8qKgorICogQGJyaWVmIFRoZSBNRS00NjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNDYwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTQ2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisjZW5kaWYKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNjOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaS5jCisgKgorICogQGJyaWVmIE1FLTQwMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9kaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJbW9kZSAmPSB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yIHwgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzMpOwkvLzB4RkZGMworCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0bCgwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKm1lNDYwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfZGlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2RpX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19QT1JUXzFfUkVHOworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fQ1RSTF9SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lNDYwMF9kaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2RpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lNDYwMF9kaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNDYwMF9kaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNDYwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhiMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RpLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIGlucHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRElfSF8KKyNkZWZpbmUgX01FNDYwMF9ESV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RpX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2RpX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00MDAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2RpX3N1YmRldmljZV90ICptZTQ2MDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmOTVkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2Rpby5jCisgKgorICogQGJyaWVmIE1FLTQwMDAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2Rpb19yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvKiBTZXQgcG9ydCB0byBpbnB1dCBtb2RlICovCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0KKwkgICAgfigoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfCBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgICBpbnQgcmVmLAorCQkJCSAgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgbW9kZTsKKwl1aW50MzJfdCBzaXplID0KKwkgICAgZmxhZ3MgJiAoTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQklUIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQorCQkgICAgIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRCB8CisJCSAgICAgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQpOworCXVpbnQzMl90IG1hc2s7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUiBzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQltb2RlICY9CisJCQkJICAgIH4oKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQkJbW9kZSB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgICBkaW9faWR4ICogMik7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fTVVYMzJNKSB7CisJCQkJbWFzayA9CisJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgICBkaW9faWR4ICoKKwkJCQkJCQkJICAgICAyKTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkgICAgaW5zdGFuY2UtPmRpb19pZHg7CisJCQkJbW9kZSAmPSB+bWFzazsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xOworCQkJCX0gZWxzZSBpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19ISUdIKSB7CisJCQkJCW1vZGUgfD0KKwkJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKTsKKwkJCQkJbW9kZSB8PSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzE7CisJCQkJCW1vZGUgfD0KKwkJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkJICAgIGluc3RhbmNlLT5kaW9faWR4OworCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIHBvcnQgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09CisJCQkJICAgTUVfU0lOR0xFX0NPTkZJR19ESU9fREVNVVgzMikgeworCQkJCW1hc2sgPQorCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgZGlvX2lkeCAqCisJCQkJCQkJCSAgICAgMik7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAgfAorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzE7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJICAgIGluc3RhbmNlLT5kaW9faWR4OworCQkJCW1vZGUgJj0gfm1hc2s7CisKKwkJCQlpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19MT1cpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCQltb2RlIHw9IE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMDsKKwkJCQl9IGVsc2UgaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fSElHSCkgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wOworCQkJCQltb2RlIHw9CisJCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJCSAgICBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJCSAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0JJVF9QQVRURVJOKSB7CisJCQkJbWFzayA9CisJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgICBkaW9faWR4ICoKKwkJCQkJCQkJICAgICAyKTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkgICAgaW5zdGFuY2UtPmRpb19pZHg7CisJCQkJbW9kZSAmPSB+bWFzazsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCQltb2RlIHw9CisJCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJCSAgICBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9CisJCQkJICAgIGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgYnl0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJYnl0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKworCQkJCWlmICh2YWx1ZSkKKwkJCQkJYnl0ZSB8PSAweDEgPDwgY2hhbm5lbDsKKwkJCQllbHNlCisJCQkJCWJ5dGUgJj0gfigweDEgPDwgY2hhbm5lbCk7CisKKwkJCQlvdXRsKGJ5dGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRElPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX0RJUl9CWVRFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTQ2MDBfZGlvX3N1YmRldmljZV90ICptZTQ2MDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTQ2MDBfZGlvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2Rpb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfZGlvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgZGlnaXRhbCBpL28gaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfRElPX1BPUlRfUkVHICsgKGRpb19pZHggKiA0KTsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU0NjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU0NjAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTQ2MDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI1YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uaApAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRElPX0hfCisjZGVmaW5lIF9NRTQ2MDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCS8qIFJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDAwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTQ2MDBfZGlvX3N1YmRldmljZV90ICptZTQ2MDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDAxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpb19yZWcuaApAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FNDYwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU0NjAwX0RJT19QT1JUXzBfUkVHCQkJCTB4QTAJCQkJCS8qKjwgUG9ydCAwIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfRElPX1BPUlRfMV9SRUcJCQkJMHhBNAkJCQkJLyoqPCBQb3J0IDEgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF9ESU9fUE9SVF8yX1JFRwkJCQkweEE4CQkJCQkvKio8IFBvcnQgMiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19QT1JUXzNfUkVHCQkJCTB4QUMJCQkJCS8qKjwgUG9ydCAzIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FNDYwMF9ESU9fRElSX1JFRwkJCQkJMHhCMAkJCQkJLyoqPCBEaXJlY3Rpb24gcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF9ESU9fUE9SVF9SRUcJCQkJCU1FNDYwMF9ESU9fUE9SVF8wX1JFRwkvKio8IEJhc2UgZm9yIHBvcnQncyByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfUkVHCQkJCQkweEI4CQkJCQkvKio8IENvbnRyb2wgcmVnaXN0ZXIuICovCisvKiogUG9ydCBBIC0gRE8gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAJCQkweDAwMDEKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEJCQkweDAwMDIKKy8qKiBQb3J0IEIgLSBESSAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMgkJCTB4MDAwNAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMwkJCTB4MDAwOAorLyoqIFBvcnQgQyAtIERJTyAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNAkJCTB4MDAxMAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNQkJCTB4MDAyMAorLyoqIFBvcnQgRCAtIERJTyAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNgkJCTB4MDA0MAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNwkJCTB4MDA4MAorCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMAkJMHgwMTAwCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMQkJMHgwMjAwCisKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMAkJMHgwNDAwCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzEJCTB4MDgwMAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8yCQkweDEwMDAKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMwkJMHgyMDAwCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1OTFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZG8uYwpAQCAtMCwwICsxLDQzMyBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZG8uYworICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lNDYwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2RvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8qIFNldCBwb3J0IHRvIG91dHB1dCBtb2RlICovCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfk1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xOwkvLzB4RkZGRAorCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzA7CS8vMHgxCisJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZG9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJaW50IHNpemUgPQorCSAgICBmbGFncyAmIChNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CSVQgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFCisJCSAgICAgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEIHwKKwkJICAgICBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19EV09SRCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPSB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzApOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX01VWDMyTSkgeworCQkJCW1vZGUgJj0gfihNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJCSAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xIHwKKwkJCQkJICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9IChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMSk7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEKKwkJCQkJCSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgcG9ydCByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0KKwkJCQkgICBNRV9TSU5HTEVfQ09ORklHX0RJT19ERU1VWDMyKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEgfAorCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzApOworCisJCQkJaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fTE9XKSB7CisJCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wKTsKKwkJCQl9IGVsc2UgaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fSElHSCkgeworCQkJCQltb2RlIHw9IChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMAorCQkJCQkJIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJCSAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0JJVF9QQVRURVJOKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEgfAorCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzApOworCisJCQkJaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fTE9XKSB7CisJCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPQorCSAgICBpbmwoaW5zdGFuY2UtPgorCQljdHJsX3JlZykgJiAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisKKwlpZiAobW9kZSA9PSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCkgeworCQlzd2l0Y2ggKGZsYWdzKSB7CisJCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkJKnZhbHVlID0KKwkJCQkgICAgaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwkJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJCWlmIChjaGFubmVsID09IDApIHsKKwkJCQkqdmFsdWUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IGJ5dGU7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0KKwkgICAgaW5sKGluc3RhbmNlLT4KKwkJY3RybF9yZWcpICYgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpOworCisJaWYgKG1vZGUgPT0gTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzApIHsKKwkJc3dpdGNoIChmbGFncykgeworCisJCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkJYnl0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKworCQkJCWlmICh2YWx1ZSkKKwkJCQkJYnl0ZSB8PSAweDEgPDwgY2hhbm5lbDsKKwkJCQllbHNlCisJCQkJCWJ5dGUgJj0gfigweDEgPDwgY2hhbm5lbCk7CisKKwkJCQlvdXRsKGJ5dGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCQljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU0NjAwX2RvX3N1YmRldmljZV90ICptZTQ2MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU0NjAwX2RvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2RvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lNDYwMF9kb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fQ1RSTF9SRUc7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19QT1JUXzBfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfZG9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9kb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfZG9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTQ2MDBfZG9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2RvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfZG9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Mzg1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZG8uaAorICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRE9fSF8KKyNkZWZpbmUgX01FNDYwMF9ET19IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2RvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2RvX3N1YmRldmljZV90ICptZTQ2MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTEwZGNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2V4dF9pcnEuYworICoKKyAqIEBicmllZiBNRS00MDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZTQ2MDBfcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FpX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9leHRfaXJxX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9leHRfaXJxLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfaW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgICAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fSVJRX1NUQVJUX0RJT19CSVQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKQorCSAgICAmJiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfRkFMTElORykKKwkgICAgJiYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX0FOWSkKKwkgICAgKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJfQorCisJaWYgKGlycV9zb3VyY2UgIT0gTUVfSVJRX1NPVVJDRV9ESU9fTElORSkgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJdG1wID0gMHgwOwkJLy9pbmwoaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisKKwlpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCS8vdG1wICY9IH5NRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTSzsKKwkJLy90bXAgfD0gTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfUklTSU5HOworCX0gZWxzZSBpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfRkFMTElORykgeworCQkvL3RtcCAmPSB+TUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0s7CisJCS8vdG1wIHw9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0ZBTExJTkc7CisJCXRtcCA9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0ZBTExJTkc7CisJfSBlbHNlIGlmIChpcnFfZWRnZSA9PSBNRV9JUlFfRURHRV9BTlkpIHsKKwkJLy90bXAgJj0gfk1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLOworCQkvL3RtcCB8PSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19BTlk7CisJCXRtcCA9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0FOWTsKKwl9CisKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisJUERFQlVHX1JFRygiZXh0X2lycV9jb25maWdfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCAmPSB+KE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUKTsKKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKGluc3RhbmNlLT5yaXNlZCAhPQorCQkJCQkJCSAgICAgIDApLCB0KTsKKworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIldhaXQgb24gZXh0ZXJuYWwgaW50ZXJydXB0IHRpbWVkIG91dC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5yaXNlZCAhPSAwKSk7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnJpc2VkIDwgMCkgeworCQkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCBhYm9ydGVkIGJ5IHVzZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCX0KKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlQRVJST1IoIldhaXQgb24gZXh0ZXJuYWwgaW50ZXJydXB0IGFib3J0ZWQgYnkgc2lnbmFsLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKwkqdmFsdWUgPSBpbnN0YW5jZS0+dmFsdWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX2lvX2lycV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgJj0gfihNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWd2IG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wICY9IH4oTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQpOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVndiBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPmNvdW50ID0gMDsKKwlvdXRsKE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0FOWSwgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisJUERFQlVHX1JFRygiZXh0X2lycV9jb25maWdfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfQU5ZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2V4dF9pcnFfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWluc3RhbmNlID0gKG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZXh0X2lycV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0VYVF9JUlE7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkcgfCBNRV9DQVBTX0VYVF9JUlFfRURHRV9GQUxMSU5HIHwKKwkgICAgTUVfQ0FQU19FWFRfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9leHRfaXJxX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9leHRfaXJxX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBpcnFfc3RhdHVzOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlycV9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoIShpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0VYKSkgeworCQlQSU5GTygiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBpcnFfc3RhdHVzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAxOworCWluc3RhbmNlLT52YWx1ZSA9IGlubChpbnN0YW5jZS0+ZXh0X2lycV92YWx1ZV9yZWcpOworCWluc3RhbmNlLT5jb3VudCsrOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUOworCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJY3RybCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVDsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lNDYwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkJICAgICAgIGludCBpcnEsCisJCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqCisJCQkJCQkgICAgICAgY3RybF9yZWdfbG9jaykKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3ViZGV2aWNlLT53YWl0X3F1ZXVlKTsKKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCisJaWYgKHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTQ2MDBfZXh0X2lycV9pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCVNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQlNRTQ2MDBfTkFNRSwgc3ViZGV2aWNlKSkgeworCQlQRVJST1IoIkNhbm5vdCByZWdpc3RlciBpbnRlcnJ1cHQuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVBJTkZPKCJSZWdpc3RlcmVkIGlycT0lZC5cbiIsIHN1YmRldmljZS0+aXJxKTsKKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzICovCisJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0lSUV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPmV4dF9pcnFfY29uZmlnX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0VYVF9JUlFfQ09ORklHX1JFRzsKKwlzdWJkZXZpY2UtPmV4dF9pcnFfdmFsdWVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfRVhUX0lSUV9WQUxVRV9SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTQ2MDBfZXh0X2lycV9kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU0NjAwX2V4dF9pcnFfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWU0NjAwX2V4dF9pcnFfaW9faXJxX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQgPSBtZTQ2MDBfZXh0X2lycV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWU0NjAwX2V4dF9pcnFfaW9faXJxX3N0b3A7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTQ2MDBfZXh0X2lycV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+Y291bnQgPSAwOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZXh0X2lycS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3YjI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZXh0X2lycS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2V4dF9pcnEuaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBNRS00MDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0VYVF9JUlFfSF8KKyNkZWZpbmUgX01FNDYwMF9FWFRfSVJRX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOworCisJaW50IGlycTsKKworCWludCByaXNlZDsKKwlpbnQgdmFsdWU7CisJaW50IGNvdW50OworCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgZXh0X2lycV9jb25maWdfcmVnOworCXVuc2lnbmVkIGxvbmcgZXh0X2lycV92YWx1ZV9yZWc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGlycSBUaGUgaW50ZXJydXB0IG51bWJlciBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqbWU0NjAwX2V4dF9pcnFfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgaW50IGlycSwKKwkJCQkJCSAgICAgICBzcGlubG9ja190ICoKKwkJCQkJCSAgICAgICBjdHJsX3JlZ19sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZXh0X2lycV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZXh0X2lycV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThlMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxX3JlZy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2V4dF9pcnFfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9FWFRfSVJRX1JFR19IXworI2RlZmluZSBfTUU0NjAwX0VYVF9JUlFfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU0NjAwX0VYVF9JUlFfQ09ORklHX1JFRwkJMHhDQwkvLyBSL18KKyNkZWZpbmUgTUU0NjAwX0VYVF9JUlFfVkFMVUVfUkVHCQkweEQwCS8vIFIvXworCisjZGVmaW5lIE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX1JJU0lORwkweDAKKyNkZWZpbmUgTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfRkFMTElORwkweDEKKyNkZWZpbmUgTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfQU5ZCQkweDMKKyNkZWZpbmUgTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0sJCTB4MworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxNTJiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX3JlZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTQwMDAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX1JFR19IXworI2RlZmluZSBfTUU0NjAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX1JFRwkJCTB4OUMJLy8gUi9fCisKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0VYCQkweDAxCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9MRQkJMHgwMgorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYJCTB4MDQKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPXzBfSEYJMHgwOAorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fMV9IRgkweDEwCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BT18yX0hGCTB4MjAKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPXzNfSEYJMHg0MAorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MJCTB4ODAKKworI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fSEYJCU1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BT18wX0hGCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1ZmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uYwpAQCAtMCwwICsxLDM3MzkgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2FvLmMKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWU2MDAwX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9hb19yZWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfYW8uaCIKKworLyogRGVmaW5lcworICovCisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwKKwkJCQkJICAgIGludCAqbWluLAorCQkJCQkgICAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSk7CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdW5pdCwgaW50ICpjb3VudCk7CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3JhbmdlX2luZm8obWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSk7CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcyk7CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSk7CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqY2Fwcyk7CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpOworCisvKiogUmVtb3ZlIHN1YmRldmljZS4gKi8KK3N0YXRpYyB2b2lkIG1lNjAwMF9hb19kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSk7CisKKy8qKiBSZXNldCBzdWJkZXZpY2UuIFN0b3AgYWxsIGFjdGlvbnMuIFJlc2V0IHJlZ2lzdHJ5LiBEaXNhYmxlIEZJRk8uIFNldCBvdXRwdXQgdG8gMFYgYW5kIHN0YXR1cyB0byAnbm9uZScuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKKworLyoqIFNldCBvdXRwdXQgYXMgc2luZ2xlICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKTsKKworLyoqIFBhc3MgdG8gdXNlciBhY3R1YWwgdmFsdWUgb2Ygb3V0cHV0LiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworLyoqIFdyaXRlIHRvIG91dHB1dCByZXF1ZWQgdmFsdWUuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogU2V0IG91dHB1dCBhcyBzdHJlYW1lZCBkZXZpY2UuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKTsKKworLyoqIFdhaXQgZm9yIC8gQ2hlY2sgZW1wdHkgc3BhY2UgaW4gYnVmZmVyLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworLyoqIFN0YXJ0IHN0cmVhbWluZy4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKy8qKiBDaGVjayBhY3R1YWwgc3RhdGUuIC8gV2FpdCBmb3IgZW5kLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0YXR1cyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHdhaXQsCisJCQkJICAgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpOworCisvKiogU3RvcCBzdHJlYW1pbmcuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpOworCisvKiogV3JpdGUgZGF0YXMgdG8gYnVmZm9yLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworLyoqIEludGVycnVwdCBoYW5kbGVyLiBDb3B5IGZyb20gYnVmZmVyIHRvIEZJRk8uICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNjAwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU2MDAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorCisvKiogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpIGluIHdyYXBhcm91bmQgbW9kZS4gKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YV93cmFwYXJvdW5kKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJICAgIGludCBzdGFydF9wb3MpOworCisvKiogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpLiovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGEobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChzbG93KS4qLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3Bvb2xpbmcobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgaW50IHN0YXJ0X3Bvcyk7CisKKy8qKiBDb3B5IGRhdGEgZnJvbSB1c2VyIHNwYWNlIHRvIGNpcmN1bGFyIGJ1ZmZlci4gKi8KK2ludCBpbmxpbmUgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCAqdXNlcl92YWx1ZXMpOworCisvKiogU3RvcCBwcmVzZW50YXRpb24uIFByZXNlcnZlIEZJRk9zLiAqLworaW50IGlubGluZSBhb19zdG9wX2ltbWVkaWF0ZWx5KG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIEZ1bmN0aW9uIGZvciBjaGVja2luZyB0aW1lb3V0IGluIG5vbi1ibG9ja2luZyBtb2RlLiAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3N0YXRpYyB2b2lkIG1lNjAwMF9hb193b3JrX2NvbnRyb2xfdGFzayh2b2lkICpzdWJkZXZpY2UpOworI2Vsc2UKK3N0YXRpYyB2b2lkIG1lNjAwMF9hb193b3JrX2NvbnRyb2xfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2VuZGlmCisKKy8qIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXA7CisJdWludDMyX3QgY3RybDsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IDA7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwkvL1N0b3Agc3RhdGUgbWFjaGluZS4KKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwl0bXAgJj0KKwkgICAgfigoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkgICAgfigoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKworCS8vUmVzZXQgdHJpZ2dlcmluZyBmbGFnCisJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWlmIChpbnN0YW5jZS0+ZmlmbykgeworCQkvL1NldCBzaW5nbGUgbW9kZSwgZGlzc2FibGUgRklGTywgZGlzc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciwgYmxvY2sgaW50ZXJydXB0LgorCQljdHJsID0gTUU2MDAwX0FPX01PREVfU0lOR0xFOworCisJCS8vQmxvY2sgSVNNLgorCQljdHJsIHw9CisJCSAgICAoTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJLy9TZXQgc3BlZWQKKwkJb3V0bChNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKwl9CisKKwlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IEhaIC8gMTA7CS8vMTAwbXMKKworCS8vU2V0IG91dHB1dCB0byAwVgorCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDgwMDApOworCisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSAweDgwMDA7CisKKwkvL1NldCBzdGF0dXMgdG8gc2lnbmFsIHRoYXQgZGV2aWNlIGlzIHVuY29uZmlndXJlZC4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJLy9TaWduYWwgcmVzZXQgaWYgdXNlciBpcyBvbiB3YWl0LgorCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3luYzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBJRD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkvLyBDaGVja2luZyBwYXJhbWV0ZXJzCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLiBNdXN0IGJlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1MuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vU3RyZWFtIGhhcmR3YXJlICh3aXRoIG9yIHdpdGhvdXQgZmlmbykKKwkJaWYgKCh0cmlnX2VkZ2UgPT0gTUVfVFJJR19UWVBFX1NXKQorCQkgICAgJiYgKHRyaWdfZWRnZSAhPSBNRV9UUklHX0VER0VfTk9ORSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuIFNvZnR3YXJlIHRyaWdnZXIgaGFzIG5vdCBlZGdlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCX0KKworCQlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgeworCQkJc3dpdGNoICh0cmlnX2VkZ2UpIHsKKwkJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS5cbiIpOworCQkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJCX0KKwkJfQorCisJCWlmICgodHJpZ190eXBlICE9IE1FX1RSSUdfVFlQRV9TVykKKwkJICAgICYmICh0cmlnX3R5cGUgIT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgdHlwZS4gVHJpZ2dlciBtdXN0IGJlIHNvZnR3YXJlIG9yIGRpZ2l0YWwuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfVFlQRTsKKwkJfQorCX0gZWxzZSB7CQkvL1NpbmdsZQorCQlpZiAodHJpZ19lZGdlICE9IE1FX1RSSUdfRURHRV9OT05FKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBTaW5nbGUgb3V0cHV0IHRyaWdnZXIgaGFzbid0IG93biBlZGdlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCX0KKworCQlpZiAodHJpZ190eXBlICE9IE1FX1RSSUdfVFlQRV9TVykgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgdHlwZS4gVHJpZ2dlciBtdXN0IGJlIHNvZnR3YXJlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCX0KKworCX0KKworCWlmICgodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKQorCSAgICAmJiAodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKy8qCisJaWYgKCh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSAmJiAodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykpCisJeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC4gTXVzdCBiZSBzeW5jaHJvbm91cyB3aGVuIGRpZ2l0YWwgaXMgY2hvb3NlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfQ0hBTjsKKwl9CisqLworCWlmIChyZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCByZWZlcmVuY2UuIEFuYWxvZyBvdXRwdXRzIGhhdmUgdG8gaGF2ZSBnb3QgUkVGX0FPX0dST1VORC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKHNpbmdsZV9jb25maWcgIT0gMCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBzaW5nbGUgY29uZmlnIHNwZWNpZmllZC4gT25seSBvbmUgcmFuZ2UgZm9yIGFubG9nIG91dHB1dHMgaXMgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuIEFuYWxvZyBvdXRwdXQgaGF2ZSBvbmx5IG9uZSBjaGFubmVsLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9TdWJkZXZpY2UgcnVubmluZyBpbiBzdHJlYW0gbW9kZSEKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCkKKwkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPCBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgYnVzeS5cbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorLy8vIEBub3RlIEZvciBzaW5nbGUgYWxsIGNhbGxzIChjb25maWcgYW5kIHdyaXRlKSBhcmUgZXJhc2luZyBwcmV2aW91cyBzdGF0ZSEKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKworCS8vIENvcnJlY3Qgc2luZ2xlIG1pcnJvcnMKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJLy9TdG9wIGRldmljZQorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vIFNldCBjb250cm9sIHJlZ2lzdGVyLgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkvLyBTZXQgc3RvcCBiaXQuIFN0b3Agc3RyZWFtaW5nIG1vZGUgKElmIHJ1bm5pbmcuKS4KKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL1Jlc2V0IGFsbCBiaXRzLgorCQljdHJsID0KKwkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QOworCQlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgeworCQkJUElORk8oIkV4dGVybmFsIGRpZ2l0YWwgdHJpZ2dlci5cbiIpOworCisJCQlpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9BTlkpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0KKwkJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9GQUxMSU5HKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJCWluc3RhbmNlLT5jdHJsX3RyZyA9CisJCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQl9IGVsc2UgaWYgKHRyaWdfZWRnZSA9PSBNRV9UUklHX0VER0VfUklTSU5HKSB7CisJCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gMHgwOworCQkJfQorCQl9IGVsc2UgaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJCVBERUJVRygiU09GVFdBUkUgVFJJR0dFUlxuIik7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJCX0KKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCX0gZWxzZSB7CisJCVBERUJVRygiU09GVFdBUkUgVFJJR0dFUlxuIik7CisJfQorCisJLy8gU2V0IHByZWxvYWQvc3luY2hyb25pemF0aW9uIHJlZ2lzdGVyLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkJICAgIH4oTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJfSBlbHNlCQkJLy9pZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkKKwl7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8PQorCQkgICAgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwl9CisKKwlpZiAodHJpZ19jaGFuID09IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKSB7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkgICAgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpOworCX0gZWxzZQkJCS8vaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpCisJeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJICAgIE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwl9CisKKwkvL1Jlc2V0IGhhcmR3YXJlIHJlZ2lzdGVyCisJc3luYyA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmMpOworCXN5bmMgJj0gfihNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwlzeW5jIHw9IE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCS8vT3V0cHV0IGNvbmZpZ3VyZWQgaW4gZGVmYXVsdCBtb2RlIChzYWZlIG9uZSkKKwlvdXRsKHN5bmMsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmMpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gJWRcbiIsIGZsYWdzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RhdHVzID49IGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCkKKwkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPD0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKwlpZiAoKCFmbGFncykgJiYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCkpIHsJLy9CbG9ja2luZyBtb2RlLiBXYWl0IGZvciB0cmlnZ2VyLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKwkJCWlmIChkZWxheSA9PSAwKQorCQkJCWRlbGF5ID0gMTsKKwkJfQorCisJCWogPSBqaWZmaWVzOworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBUaGlzIHByb2NlZHVyZSBoYXMgb3duIHRpbWVvdXQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfQorCisJCSp2YWx1ZSA9CisJCSAgICAoIWVycikgPyBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gOiBpbnN0YW5jZS0+CisJCSAgICBzaW5nbGVfdmFsdWU7CisJfSBlbHNlIHsJCS8vTm9uLWJsb2NraW5nIG1vZGUKKwkJLy9SZWFkIHZhbHVlCisJCSp2YWx1ZSA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGo7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwl1aW50MzJfdCBzeW5jX21hc2s7CisJdWludDMyX3QgbW9kZTsKKworCXVpbnQzMl90IHRtcDsKKworLy8vIFdvcmthcm91bmQgZm9yIG1peC1tb2RlIC0gYmVnaW4KKwl1aW50MzJfdCBjdHJsID0gMHgwOworCXVpbnQzMl90IHN0YXR1czsKKy8vLyBXb3JrYXJvdW5kIGZvciBtaXgtbW9kZSAtIGVuZAorCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMgfAorCSAgICAgIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19ub25lKQorCSAgICB8fCAoaW5zdGFuY2UtPnN0YXR1cyA+IGFvX3N0YXR1c19zaW5nbGVfZW5kKSkgeworCQlQRVJST1IoIlN1YmRldmljZSBub3QgY29uZmlndXJlZCB0byB3b3JrIGluIHNpbmdsZSBtb2RlIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHZhbHVlICYgfk1FNjAwMF9BT19NQVhfREFUQSkgeworCQlQRVJST1IoIkludmFsaWQgdmFsdWUgcHJvdmlkZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1ZBTFVFX09VVF9PRl9SQU5HRTsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworLy8vIEBub3RlIEZvciBzaW5nbGUgYWxsIGNhbGxzIChjb25maWcgYW5kIHdyaXRlKSBhcmUgZXJhc2luZyBwcmV2aW91cyBzdGF0ZSEKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy8gQ29ycmVjdCBzaW5nbGUgbWlycm9ycworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkvL1N0b3AgZGV2aWNlCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSB2YWx1ZTsKKworCWlmIChpbnN0YW5jZS0+ZmlmbykgeworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSB7CS8vLyBXb3JrYXJvdW5kIGZvciBtaXgtbW9kZSAtIGJlZ2luCisJCS8vU2V0IHNwZWVkCisJCW91dGwoTUU2MDAwX0FPX01JTl9DSEFOX1RJQ0tTIC0gMSwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisJCVBERUJVR19SRUcoInRpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnRpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIChpbnQpTUU2MDAwX0FPX01JTl9DSEFOX1RJQ0tTKTsKKwkJaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSBIWiAvIDEwOwkvLzEwMG1zCisKKwkJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKworCQkvL1NldCB0aGUgY29udGlub3VzIG1vZGUuCisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX01PREVfTUFTSzsKKwkJY3RybCB8PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTOworCisJCS8vUHJlcGFyZSBGSUZPCisJCWlmICghKGN0cmwgJiBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8pKSB7CS8vRklGTyB3YXNuJ3QgZW5hYmVsZWQuIERvIGl0LgorCQkJUElORk8oIkVuYWJsZWluZyBGSUZPLlxuIik7CisJCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQl9IGVsc2UgewkvL0NoZWNrIGlmIEZJRk8gaXMgZW1wdHkKKwkJCWlmIChzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9FRikgewkvL0ZJRk8gbm90IGVtcHR5CisJCQkJUElORk8oIlJlc2V0aW5nIEZJRk8uXG4iKTsKKwkJCQljdHJsICY9CisJCQkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPIHwKKwkJCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSk7CisJCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJfSBlbHNlIHsJLy9GSUZPIGVtcHR5LCBvbmx5IGludGVycnVwdCBuZWVkcyB0byBiZSBkaXNhYmxlZCEKKwkJCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCX0KKwkJfQorCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCQkvL1dyaXRlIG91dHB1dCAtIDEgdmFsdWUgdG8gRklGTworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJb3V0bCh2YWx1ZSA8PD0gMTYsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQlQREVCVUdfUkVHKCJmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdmFsdWUgPDw9IDE2KTsKKwkJfSBlbHNlIHsKKwkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQlQREVCVUdfUkVHKCJmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdmFsdWUpOworCQl9CisJCS8vLyBXb3JrYXJvdW5kIGZvciBtaXgtbW9kZSAtIGVuZAorCX0gZWxzZSB7CQkvL05vIEZJRk8gLSBhbHdheXMgaW4gc2luZ2xlIG1vZGUKKwkJLy9Xcml0ZSB2YWx1ZQorCQlQREVCVUcoIldyaXRlIHZhbHVlXG4iKTsKKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCX0KKworCW1vZGUgPSAqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgPj4gaW5zdGFuY2UtPmFvX2lkeDsKKwltb2RlICY9IChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpOworCisJUElORk8oIlRyaWdnZXJpbmcgbW9kZTogMHglMDh4XG4iLCBtb2RlKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJc3luY19tYXNrID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY19tYXNrKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDA6CQkvLzB4MDAwMDAwMDA6IEluZGl2aWR1YWwgc29mdHdhcmUKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmIChpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgewkvLyBGSUZPIC0gQ29udGlub3VzIG1vZGUKKwkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwkJCWlmICgoc3luY19tYXNrICYgKChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSAweDApIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oKE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIHwKKwkJCQkgICAgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCkgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0gZWxzZSB7CS8vIE5vIEZJRk8gLSBTaW5nbGUgbW9kZTogSW4gdGhpcyBjYXNlIHJlc2V0dGluZyAnTUU2MDAwX0FPX1NZTkNfSE9MRCcgd2lsbCB0cmlnZ2VyIG91dHB1dC4KKwkJCWlmICgoc3luY19tYXNrICYgKChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSBNRTYwMDBfQU9fU1lOQ19IT0xEKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlLiBUaGlzIGlzIGV4Y2VwdGlvbi4gSXQgaXMgc2V0IHRvIHN5bmNocm9ub3VzIGFuZCB0cmlnZ2VyZWQgbGF0ZXIuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJc3luY19tYXNrIHw9CisJCQkJICAgIE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfQorCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRzoJLy8weDAwMDEwMDAwOiBJbmRpdmlkdWFsIGhhcmR3YXJlCisJCVBERUJVRygiRElHSVRBTCBUUklHR0VSXG4iKTsKKwkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSB7CS8vIEZJRk8gLSBDb250aW5vdXMgbW9kZQorCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IDB4MCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZS4KKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfigoTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgfAorCQkJCSAgICAgICBNRTYwMDBfQU9fU1lOQ19IT0xEKSA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gTm8gRklGTyAtIFNpbmdsZSBtb2RlCisJCQlpZiAoKHN5bmNfbWFzayAmCisJCQkgICAgICgoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCkpICE9IE1FNjAwMF9BT19TWU5DX0hPTEQpIHsKKwkJCQkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCXN5bmNfbWFzayB8PQorCQkJCSAgICBNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FNjAwMF9BT19TWU5DX0hPTEQ6CS8vMHgwMDAwMDAwMTogU3luY2hyb25vdXMgc29mdHdhcmUKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmICgoc3luY19tYXNrICYKKwkJICAgICAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCkpICE9CisJCSAgICAoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSkgeworCQkJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUKKwkJCXN5bmNfbWFzayB8PQorCQkJICAgIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQlzeW5jX21hc2sgfD0gTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKwkJfQorCQkvL1NldCB0cmlnZ2VyaW5nIGZsYWcKKwkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzIHw9IDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4OworCQlicmVhazsKKworCWNhc2UgKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyk6CS8vMHgwMDAxMDAwMTogU3luY2hyb25vdXMgaGFyZHdhcmUKKwkJUERFQlVHKCJESUdJVEFMIFRSSUdHRVJcbiIpOworCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKworCQlpZiAoKHN5bmNfbWFzayAmCisJCSAgICAgKChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8CisJCSAgICAgIGluc3RhbmNlLT5hb19pZHgpKSAhPQorCQkgICAgKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykpIHsKKwkJCS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQlzeW5jX21hc2sgfD0KKwkJCSAgICAoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgIGluc3RhbmNlLT5hb19pZHg7CisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisJCS8vU2V0IHRyaWdnZXJpbmcgZmxhZworCQkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgfD0gMHgxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCWJyZWFrOworCX0KKy8vICAgICAgICAgICAgICBzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7ICAgICAgICAvLyBNb3ZlZCBkb3duLgorCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vQWN0aXZhdGUgSVNNIChyZW1vdmUgJ3N0b3AnIGJpdHMpCisJCWN0cmwgJj0KKwkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USCk7CisJCWN0cmwgfD0gaW5zdGFuY2UtPmN0cmxfdHJnOworCQljdHJsICY9CisJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKy8vLyBAbm90ZSBXaGVuIGZsYWcgJ01FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMnIGlzIHNldCB0aGFuIG91dHB1dCBpcyB0cmlnZ2VyZWQuIEFMV0FZUyEKKworCVBJTkZPKCI8JXM+IHN0YXJ0IG1vZGU9IDB4JTA4eCAlc1xuIiwgX19GVU5DVElPTl9fLCBtb2RlLAorCSAgICAgIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpID8gIlNZTkNIUk9OT1VTIiA6CisJICAgICAgIiIpOworCWlmIChpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgewkvLyBGSUZPIC0gQ29udGlub3VzIG1vZGUKKwkJaWYgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgewkvL1RyaWdnZXIgb3V0cHV0cworCQkJLy9BZGQgY2hhbm5lbCB0byBzdGFydCBsaXN0CisJCQlvdXRsKHN5bmNfbWFzayB8CisJCQkgICAgIChNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLAorCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayB8IChNRTYwMDBfQU9fU1lOQ19IT0xEIDw8CisJCQkJCQlpbnN0YW5jZS0+YW9faWR4KSk7CisKKwkJCS8vRmlyZQorCQkJUElORk8KKwkJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzIGJ5IHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIDB4ODAwMCk7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCisJCX0gZWxzZSBpZiAoIW1vZGUpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKy8qCQkJLy9SZW1vdmUgY2hhbm5lbCBmcm9tIHN0YXJ0IGxpc3QKKwkJCW91dGwoc3luY19tYXNrICYgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNfbWFzayAmIH4oTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSk7CisqLworCQkJLy9GaXJlCisJCQlQSU5GTygiU29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgMHg4MDAwKTsKKworLyoJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY19tYXNrKTsKKyovCisJCX0KKy8vLyBAbm90ZSBUaGlzIGlzIG1peC1tb2RlIGNhc2UuIEZvciBub3cgSSBkbyBub3QgaGF2ZSBwb3NzaWJpbGl0eSB0byB0cmlnZ2VyIGZpcnN0IDQgY2hhbm5lbHMgKGNvbnRpbm91cyBtb2RlKSBhbmQgb3RoZXIgKHNpbmdsZSkgb25lcyBhdCBvbmNlLgorLy8vIEBub3RlIEJlY2F1c2UgdHJpZ2dlcmluZyBpcyBub3Qgd29ya2luZyBpdCBjYW4gbm90IGJlIGFkZCB0byBzeW5jaHJvbm91cyBsaXN0LiBGaXJzdCA0IGNoYW5uZWxzIGRvbid0IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiwgYW55d2F5LgorCQkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgJj0gMHhGRkZGRkZGMDsKKwl9IGVsc2UgewkJLy8gTm8gRklGTyAtIFNpbmdsZSBtb2RlCisJCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9GaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cy4KKwkJCXRtcCA9IH4oKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHwgMHhGRkZGMDAwMCk7CisJCQlQSU5GTworCQkJICAgICgiRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMuIG1hc2s6MHglMDh4XG4iLAorCQkJICAgICB0bXApOworCQkJdG1wIHw9IHN5bmNfbWFzayAmIDB4RkZGRjAwMDA7CisJCQkvLyBBZGQgdGhpcyBjaGFubmVsIHRvIGxpc3QKKwkJCXRtcCAmPSB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCisJCQkvL1NldCBhbGwgYXMgdHJpZ2dlcmVkLgorCQkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzID0gMHgwOworCQl9IGVsc2UgaWYgKCFtb2RlKSB7CS8vIEFkZCB0aGlzIGNoYW5uZWwgdG8gbGlzdAorCQkJb3V0bChzeW5jX21hc2sgJgorCQkJICAgICB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrICYgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8CisJCQkJCQkgaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCisJCQkvL1NldCBhbGwgYXMgdHJpZ2dlcmVkLgorCQkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzID0gMHgwOworCQl9CisKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ7CisKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IGRlbGF5OworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDE7CisJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTYwMDBfd29ya3F1ZXVlLAorCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCisJaWYgKCEoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9XUklURV9OT05CTE9DS0lORykpIHsKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5ICsKKwkJCQkJCSAxIDogTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zaW5nbGVfZW5kKSB7CisJCQlQREVCVUcoIlNpbmdsZSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQlpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zaW5nbGVfZW5kKSB7CisJCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSBqKSA+IGRlbGF5KSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiVGltZW91dCByZWFjaGVkLiBOb3QgaGFuZGxlZCBieSBjb250cm9sIHRhc2shXG4iKTsKKwkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiVGltZW91dCByZWFjaGVkLiBTaWduYWwgY29tZSBidXQgc3RhdHVzIGlzIHN0cmFuZ2U6ICVkXG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQl9CisKKwkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKwkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBjdHJsOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQ2NF90IGNvbnZfdGlja3M7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfbG93ID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzTG93OworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NIaWdoOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJY29udl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCisJaWYgKGZsYWdzICYKKwkgICAgfihNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgfAorCSAgICAgIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfSEFSRFdBUkVfT05MWSkgeworCQlpZiAoIWZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkhhcmR3YXJlIE1FX0lPX1NUUkVBTV9DT05GSUdfSEFSRFdBUkVfT05MWSBoYXMgdG8gYmUgd2l0aCBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQl9CisKKwkJaWYgKCh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9OT05FKQorCQkgICAgfHwgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9OT05FKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJIYXJkd2FyZSB3cmFwYXJvdW5kIG1vZGUgbXVzdCBiZSBpbiBpbmZpbml0ZSBtb2RlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCX0KKworCWlmIChjb3VudCAhPSAxKSB7CisJCVBFUlJPUigiT25seSAxIGVudHJ5IGluIGNvbmZpZyBsaXN0IGFjY2VwdGFibGUuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQ7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlDaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pU3RyZWFtQ29uZmlnICE9IDApIHsKKwkJUEVSUk9SKCJPbmx5IG9uZSByYW5nZSBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RSRUFNX0NPTkZJRzsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaVJlZiAhPSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCVBFUlJPUigiT3V0cHV0IGlzIHJlZmVyZW5jZWQgdG8gZ3JvdW5kLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwl9CisKKwlpZiAoKHRyaWdnZXItPmlBY3FTdGFydFRpY2tzTG93ICE9IDApCisJICAgIHx8ICh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0hpZ2ggIT0gMCkpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaUZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBjb25maWcgbGlzdCBmbGFnLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX1NXKQorCSAgICAmJiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSkgeworCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpIHsKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJfQorCX0KKworCWlmICgodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKQorCSAgICAmJiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UgIT0gTUVfVFJJR19UWVBFX05PTkUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJfQorCisJaWYgKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfRk9MTE9XKSB7CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKHRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfVElNRVIpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKwl9CisKKwlpZiAoKGNvbnZfdGlja3MgPCBNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MpCisJICAgIHx8IChjb252X3RpY2tzID4gTUU2MDAwX0FPX01BWF9DSEFOX1RJQ0tTKSkgeworCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NMb3cgfHwgdHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoKSB7CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAodHJpZ2dlci0+aVNjYW5TdGFydFRpY2tzTG93IHx8IHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0hpZ2gpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9BUkc7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCAhPSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIGNvdW50IHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfQVJHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJUaGUgY29udGlub3VzIG1vZGUgaGFzIG5vdCAnc2NhbicgY29udGVjdHMuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50ICE9IDApIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX0FSRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50IDw9IDApIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJUaGUgY29udGlub3VzIG1vZGUgaGFzIG5vdCAnc2NhbicgY29udGVjdHMuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQl9CisJCX0KKy8vICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKy8vICAgICAgICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworLy8gICAgICAgICAgICAgICAgICAgICAgfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4pIHsKKwljYXNlIE1FX1RSSUdfQ0hBTl9ERUZBVUxUOgorCWNhc2UgTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19DSEFOOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vU3RvcCBkZXZpY2UKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy9DaGVjayBpZiBzdGF0ZSBtYWNoaW5lIGlzIHN0b3BwZWQuCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCS8vUmVzZXQgY29udHJvbCByZWdpc3Rlci4gQmxvY2sgYWxsIGFjdGlvbnMuIERpc2FibGUgSVJRLiBEaXNhYmxlIEZJRk8uCisJY3RybCA9IE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QOworCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkvL1RoaXMgaXMgcGFyYW5vaWMsIGJ1dCB0byBiZSBzdXJlLgorCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJLyogU2V0IG1vZGUuICovCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CS8vV3JhcGFyb3VuZAorCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkpIHsJLy9IYXJkd2FyZSB3cmFwYXJvdW5kCisJCQlQSU5GTygiSGFyZHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJY3RybCB8PSBNRTYwMDBfQU9fTU9ERV9XUkFQQVJPVU5EOworCQkJaW5zdGFuY2UtPm1vZGUgPSBNRTYwMDBfQU9fSFdfV1JBUF9NT0RFOworCQl9IGVsc2UgewkvL1NvZnR3YXJlIHdyYXBhcm91bmQKKwkJCVBJTkZPKCJTb2Z0d2FyZSB3cmFwYXJvdW5kLlxuIik7CisJCQljdHJsIHw9IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVM7CisJCQlpbnN0YW5jZS0+bW9kZSA9IE1FNjAwMF9BT19TV19XUkFQX01PREU7CisJCX0KKwl9IGVsc2UgewkJLy9Db250aW5vdXMKKwkJUElORk8oIkNvbnRpbm91cy5cbiIpOworCQljdHJsIHw9IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVM7CisJCWluc3RhbmNlLT5tb2RlID0gTUU2MDAwX0FPX0NPTlRJTk9VUzsKKwl9CisKKwkvL1NldCB0aGUgdHJpZ2dlciBlZGdlLgorCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpIHsJLy9TZXQgdGhlIHRyaWdnZXIgdHlwZSBhbmQgZWRnZSBmb3IgZXh0ZXJuYWwgdHJpZ2dlci4KKwkJUElORk8oIkV4dGVybmFsIGRpZ2l0YWwgdHJpZ2dlci5cbiIpOworCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSA9IE1FNjAwMF9BT19FWFRfVFJJRzsKKworCQlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogcmlzaW5nLlxuIik7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJUElORk8oIlNldCB0aGUgdHJpZ2dlciBlZGdlOiBmYWxsaW5nLlxuIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogYm90aCBlZGdlcy5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9CisJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlQSU5GTygiSW50ZXJuYWwgc29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSA9IDA7CisJfQorCisJLy9TZXQgdGhlIHN0b3AgbW9kZSBhbmQgdmFsdWUuCisJaWYgKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CS8vQW1vdW50IG9mIGRhdGEKKwkJaW5zdGFuY2UtPnN0b3BfbW9kZSA9IE1FNjAwMF9BT19BQ1FfU1RPUF9NT0RFOworCQlpbnN0YW5jZS0+c3RvcF9jb3VudCA9IHRyaWdnZXItPmlBY3FTdG9wQ291bnQ7CisJfSBlbHNlIGlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpIHsJLy9BbW91bnQgb2YgJ3NjYW5zJworCQlpbnN0YW5jZS0+c3RvcF9tb2RlID0gTUU2MDAwX0FPX1NDQU5fU1RPUF9NT0RFOworCQlpbnN0YW5jZS0+c3RvcF9jb3VudCA9IHRyaWdnZXItPmlTY2FuU3RvcENvdW50OworCX0gZWxzZSB7CQkvL0luZmluaXRlCisJCWluc3RhbmNlLT5zdG9wX21vZGUgPSBNRTYwMDBfQU9fSU5GX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSAwOworCX0KKworCVBJTkZPKCJTdG9wIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2NvdW50KTsKKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpIHsJLy9TeW5jaHJvbm91cyBzdGFydAorCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSB8PSBNRTYwMDBfQU9fU1lOQ19IT0xEOworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vRXh0ZXJuYWx5IHRyaWdnZXJlZAorCQkJUElORk8oIlN5bmNocm9ub3VzIHN0YXJ0LiBFeHRlcm5hbHkgdHJpZ2dlciBhY3RpdmUuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGFydF9tb2RlIHw9IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHOworCQl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJCWVsc2UgeworCQkJUElORk8KKwkJCSAgICAoIlN5bmNocm9ub3VzIHN0YXJ0LiBFeHRlcm5hbHkgdHJpZ2dlciBkaXNzYWJsZWQuXG4iKTsKKwkJfQorI2VuZGlmCisKKwl9CisJLy9TZXQgc3BlZWQKKwlvdXRsKGNvbnZfdGlja3MgLSAyLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJ0aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGx4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT50aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGNvbnZfdGlja3MgLSAyKTsKKwlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IChpbnQpKGNvbnZfdGlja3MgKiBIWikgLyBNRTYwMDBfQU9fQkFTRV9GUkVRVUVOQ1k7CS8vPD09IE1VU1QgYmUgd2l0aCBjYXN0IQorCisJLy8gV3JpdGUgdGhlIGNvbnRyb2wgd29yZAorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkvL1NldCBzdGF0dXMuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJbG9uZyBqOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJUEVSUk9SKCJDaXJjdWxhciBidWZmZXIgbm90IGV4aXN0cy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhlIGJ1ZmZlciBpcyBOT1QgZnVsbC4KKwkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJfSBlbHNlIHsJCS8vVGhlIGJ1ZmZlciBpcyBmdWxsLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCQlpZiAodCA9PSAwKQorCQkJCXQgPSAxOworCQl9IGVsc2UgewkvL01heCB0aW1lLgorCQkJdCA9IExPTkdfTUFYOworCQl9CisKKwkJKmNvdW50ID0gMDsKKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBJbnRlcnJ1cHRzIGFyZSB3aGVuIEZJRk8gSEYgaXMgc2lnbmFsZWQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfc3BhY2UKKwkJCQkJCSAgICgmaW5zdGFuY2UtPmNpcmNfYnVmKSkKKwkJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpCisJCQkJCQkgICAgICAgJgorCQkJCQkJICAgICAgIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpLAorCQkJCQkJIHQpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQlQRVJST1IoIkFPIHN1YmRldmljZSBpcyBub3QgcnVubmluZy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfSBlbHNlIGlmICgoamlmZmllcyAtIGopID49IHQpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgdGltZWQgb3V0LlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9IGVsc2UgewkvL1VmZi4uLiBhbGwgaXMgZ29vZC4gSW5mb3JtIHVzZXIgYWJvdXQgZW1wdHkgc3BhY2UuCisJCQkqY291bnQgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmNoOworCWludCBjb3VudCA9IDA7CisJaW50IGNpcmNfYnVmZmVyX2NvdW50OworCisJdW5zaWduZWQgbG9uZyByZWY7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoKHN0YXJ0X21vZGUgIT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykKKwkgICAgJiYgKHN0YXJ0X21vZGUgIT0gTUVfU1RBUlRfTU9ERV9OT05CTE9DS0lORykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0YXJ0IG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJc3dpdGNoIChpbnN0YW5jZS0+c3RhdHVzKSB7CS8vQ2hlY2tpbmcgYWN0dWFsIG1vZGUuCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZDoKKwkJLy9Db3JyZWN0IG1vZGVzIQorCQlicmVhazsKKworCQkvL1RoZSBkZXZpY2UgaXMgaW4gd3JvbmcgbW9kZS4KKwljYXNlIGFvX3N0YXR1c19ub25lOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdDoKKwkJUEVSUk9SCisJCSAgICAoIlN1YmRldmljZSBtdXN0IGJlIHByZWluaXRpYWxpemUgY29ycmVjdGx5IGZvciBzdHJlYW1pbmcuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQlQREVCVUcoIkJlZm9yZSByZXN0YXJ0IGJyb2tlIHN0cmVhbSAnU1RPUCcgbXVzdCBiZSBjYWxlZC5cbiIpOworCQlyZXR1cm4gTUVfU1RBVFVTX0VSUk9SOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW46CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OgorCQlQREVCVUcoIlN0cmVhbSBpcyBhbHJlYWR5IHdvcmtpbmcuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCisJZGVmYXVsdDoKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTYwMDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQ7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0KKwljaXJjX2J1ZmZlcl9jb3VudCA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKworCWlmICghY2lyY19idWZmZXJfY291bnQgJiYgIWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpIHsJLy9ObyB2YWx1ZXMgaW4gYnVmZmVyCisJCU1FX1NVQkRFVklDRV9FWElUOworCQlQRVJST1IoIk5vIHZhbHVlcyBpbiBidWZmZXIhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0xBQ0tfT0ZfUkVTT1VSQ0VTOworCX0KKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy9TdG9wIGRldmljZQorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCS8vU2V0IHZhbHVlcyBmb3Igc2luZ2xlX3JlYWQoKQorCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSBNRTYwMDBfQU9fTUFYX0RBVEEgKyAxOworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IE1FNjAwMF9BT19NQVhfREFUQSArIDE7CisKKwkvL1NldHRpbmcgc3RvcCBwb2ludHMKKwlpZiAoaW5zdGFuY2UtPnN0b3BfbW9kZSA9PSBNRTYwMDBfQU9fU0NBTl9TVE9QX01PREUpIHsKKwkJaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA9CisJCSAgICBpbnN0YW5jZS0+c3RvcF9jb3VudCAqIGNpcmNfYnVmZmVyX2NvdW50OworCX0gZWxzZSB7CisJCWluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPSBpbnN0YW5jZS0+c3RvcF9jb3VudDsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgIT0gMCkKKwkgICAgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPCBjaXJjX2J1ZmZlcl9jb3VudCkpIHsKKwkJUEVSUk9SKCJNb3JlIGRhdGEgaW4gYnVmZmVyIHRoYW4gcHJldmlvdXNseSBzZXQgbGltaXQhXG4iKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkvL0NoZWNrIEZJRk8KKwlpZiAoIShjdHJsICYgTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPKSkgewkvL0ZJRk8gd2Fzbid0IGVuYWJlbGVkLiBEbyBpdC4gPD0gVGhpcyBzaG91bGQgYmUgZG9uZSBieSB1c2VyIGNhbGwgd2l0aCBNRV9XUklURV9NT0RFX1BSRUxPQUQKKwkJUElORk8oIkVuYWJsZWluZyBGSUZPLlxuIik7CisJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCX0gZWxzZSB7CQkvL0Jsb2NrIElSUQorCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwl9CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCS8vRmlsbCBGSUZPIDw9IEdlbmVyYWx5IHRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdXNlciBwcmUtbG9hZCBjYWxsIGJ1dCB0aGlzIGlzIHNlY29uZCBwbGFjZSB0byBkbyBpdC4KKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGKSkgewkvL0ZJRk8gZW1wdHkKKwkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgIT0gMCkgeworCQkJY291bnQgPSBNRTYwMDBfQU9fRklGT19DT1VOVDsKKwkJfSBlbHNlIHsKKwkJCWNvdW50ID0KKwkJCSAgICAoTUU2MDAwX0FPX0ZJRk9fQ09VTlQgPAorCQkJICAgICBpbnN0YW5jZS0+CisJCQkgICAgIHN0b3BfZGF0YV9jb3VudCkgPyBNRTYwMDBfQU9fRklGT19DT1VOVCA6CisJCQkgICAgaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudDsKKwkJfQorCisJCS8vQ29weSBkYXRhCisJCWNvdW50ID0KKwkJICAgIGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNvdW50LCBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KTsKKworCQlpZiAoY291bnQgPCAwKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCVBFUlJPUl9DUklUSUNBTCgiQ09QWSBGSU5JU0ggV0lUSCBFUlJPUiFcbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJfQorCS8vU2V0IHByZS1sb2FkIGZlYXR1cmVzLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlzeW5jaCAmPQorCSAgICB+KChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT4KKwkgICAgICBhb19pZHgpOworCXN5bmNoIHw9CisJICAgIChpbnN0YW5jZS0+c3RhcnRfbW9kZSAmIH5NRTYwMDBfQU9fRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHg7CisJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2gpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCS8vRGVmYXVsdCBjb3VudCBpcyAnMCcKKwlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKz0gY291bnQ7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0gZWxzZSB7CQkvL1dyYXBhcm91bmQKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3VudDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisKKwkJLy9TcGVjaWFsIGNhc2U6IEluZmluaXRlIHdyYXBhcm91bmQgd2l0aCBsZXNzIHRoYW4gRklGTyBkYXRhcyBhbHdheXMgc2hvdWxkIHJ1bnMgaW4gaGFyZHdhcmUgbW9kZS4KKwkJaWYgKChpbnN0YW5jZS0+c3RvcF9tb2RlID09IE1FNjAwMF9BT19JTkZfU1RPUF9NT0RFKQorCQkgICAgJiYgKGNpcmNfYnVmZmVyX2NvdW50IDw9IE1FNjAwMF9BT19GSUZPX0NPVU5UKSkgewkvL0NoYW5nZSB0byBoYXJkd2FyZSB3cmFwYXJvdW5kCisJCQlQREVCVUcKKwkJCSAgICAoIkNoYW5nZWluZyBtb2RlIGZyb20gc29mdHdhcmUgd3JhcGFyb3VuZCB0byBoYXJkd2FyZSB3cmFwYXJvdW5kLlxuIik7CisJCQkvL0NvcHkgYWxsIGRhdGEKKwkJCWNvdW50ID0KKwkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjaXJjX2J1ZmZlcl9jb3VudCwKKwkJCQkJICBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KTsKKwkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX01PREVfTUFTSzsKKwkJCWN0cmwgfD0gTUU2MDAwX0FPX01PREVfV1JBUEFST1VORDsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID09IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1Jlc2V0IHBvc2l0aW9uIGluZGljYXRvci4KKwkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPiBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJQUkVMT0FERUQgTU9SRSBWQUxVRVMgVEhBTiBBUkUgSU4gQlVGRkVSIVxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCX0KKwl9CisKKwkvL1NldCBzdGF0dXMgdG8gJ3dhaXQgZm9yIHN0YXJ0JworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0OworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkvL1N0YXJ0IHN0YXRlIG1hY2hpbmUgYW5kIGludGVycnVwdHMKKwlQSU5GTygiPCVzOiVkPiBTdGFydCBzdGF0ZSBtYWNoaW5lLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJY3RybCAmPSB+KE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwlpZiAoaW5zdGFuY2UtPnN0YXJ0X21vZGUgPT0gTUU2MDAwX0FPX0VYVF9UUklHKSB7CisJCVBERUJVRygiRElHSVRBTCBUUklHR0VSXG4iKTsKKwkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJfQorCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL01vcmUgdGhhbiBoYWxmIQorCQlpZiAoKGN0cmwgJiBNRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0spID09IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVMpIHsJLy9FbmFibGUgSVJRIG9ubHkgd2hlbiBoYXJkd2FyZV9jb250aW5vdXMgaXMgc2V0IGFuZCBGSUZPIGlzIG1vcmUgdGhhbiBoYWxmCisJCQlQSU5GTygiPCVzOiVkPiBTdGFydCBpbnRlcnJ1cHRzLlxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgICAgX19MSU5FX18pOworCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJfQorCX0KKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vVHJpZ2dlciBvdXRwdXQKKwlQSU5GTygiPCVzPiBzdGFydCBtb2RlPSAweCV4ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGluc3RhbmNlLT5zdGFydF9tb2RlLAorCSAgICAgIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpID8gIlNZTkNIUk9OT1VTIiA6CisJICAgICAgIiIpOworCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJLy9BZGQgY2hhbm5lbCB0byBzdGFydCBsaXN0CisJCW91dGwoc3luY2ggfCAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwKKwkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgc3luY2ggfCAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSk7CisKKwkJLy9GaXJlCisJCVBJTkZPCisJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzIGJ5IHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2gpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJfSBlbHNlIGlmICghaW5zdGFuY2UtPnN0YXJ0X21vZGUpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKy8qCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJLy9SZW1vdmUgY2hhbm5lbCBmcm9tIHN0YXJ0IGxpc3QKKwkJCW91dGwoc3luY2ggJiB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2ggJiB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworKi8KKwkJLy9GaXJlCisJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDgwMDApOworCisvKgorCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2gpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisqLworCX0KKwkvLyBTZXQgY29udHJvbCB0YXNrJ3MgdGltZW91dAorCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gZGVsYXk7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwlpZiAoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpIHsJLy9MZXNzIHRoYW4gaGFsZiBidXQgbm90IGVtcHR5IQorCQlQSU5GTygiTGVzcyB0aGFuIGhhbGYuXG4iKTsKKwkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPT0gMCkgeworCQkJY291bnQgPSBNRTYwMDBfQU9fRklGT19DT1VOVCAvIDI7CisJCX0gZWxzZSB7CisJCQljb3VudCA9CisJCQkgICAgKChNRTYwMDBfQU9fRklGT19DT1VOVCAvIDIpIDwKKwkJCSAgICAgaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCkgPyBNRTYwMDBfQU9fRklGT19DT1VOVCAvCisJCQkgICAgMiA6IGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQ7CisJCX0KKworCQkvL0NvcHkgZGF0YQorCQljb3VudCA9CisJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisKKwkJaWYgKGNvdW50IDwgMCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggRVJST1IhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCX0gZWxzZSB7CS8vV3JhcGFyb3VuZAorCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCisJCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9PSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9SZXNldCBwb3NpdGlvbiBpbmRpY2F0b3IuCisJCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPiBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIlBSRUxPQURFRCBNT1JFIFZBTFVFUyBUSEFOIEFSRSBJTiBCVUZGRVIhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCX0KKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9IRikpIHsJLy9Nb3JlIHRoYW4gaGFsZiEKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQlQSU5GTygiPCVzOiVkPiBTdGFydCBpbnRlcnJ1cHRzLlxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgICAgX19MSU5FX18pOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0KKwl9CisJLy9TcGVjaWFsIGNhc2U6IExpbWl0ZWQgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBIQUxGIEZJRk8gZGF0YXMgbmVlZCB3b3JrIGFyb3VuZCB0byBnZW5lcmF0ZSBmaXJzdCBpbnRlcnJ1cHQuCisJaWYgKChpbnN0YW5jZS0+c3RvcF9tb2RlICE9IE1FNjAwMF9BT19JTkZfU1RPUF9NT0RFKQorCSAgICAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX1NXX1dSQVBfTU9ERSkKKwkgICAgJiYgKGNpcmNfYnVmZmVyX2NvdW50IDw9IChNRTYwMDBfQU9fRklGT19DT1VOVCAvIDIpKSkgewkvL1B1dCBtb3JlIGRhdGEgdG8gRklGTworCQlQSU5GTygiTGltaXRlZCB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEhBTEYgRklGTyBkYXRhcy5cbiIpOworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJd2hpbGUgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPiBpbnN0YW5jZS0+ZGF0YV9jb3VudCkgewkvL01heGltdW0gZGF0YSBub3Qgc2V0IGpldC4KKwkJCS8vQ29weSB0byBidWZmZXIKKwkJCWlmIChjaXJjX2J1ZmZlcl9jb3VudCAhPSBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjaXJjX2J1ZmZlcl9jb3VudCwgMCkpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjaXJjX2J1ZmZlcl9jb3VudDsKKworCQkJaWYgKCEoKHN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykpICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vRklGTyBpcyBtb3JlIHRoYW4gaGFsZi4gRW5hYmxlIElSUSBhbmQgZW5kIGNvcHkuCisJCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCQlQSU5GTygiPCVzOiVkPiBTdGFydCBpbnRlcnJ1cHRzLlxuIiwKKwkJCQkgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKwkJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8vIFNjaGVkdWxlIGNvbnRyb2wgdGFzaworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDE7CisJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTYwMDBfd29ya3F1ZXVlLAorCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCisJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgewkvL1dhaXQgZm9yIHN0YXJ0LgorCQlyZWYgPSBqaWZmaWVzOworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgKworCQkJCQkJIDEgOiBMT05HX01BWCk7CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fcnVuKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQREVCVUcoIlN0YXJ0aW5nIHN0cmVhbSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCWlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIHJlZikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX3J1bikgeworCQkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJfSBlbHNlIGlmICgoamlmZmllcyAtIHJlZikgPiBkZWxheSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLiBOb3QgaGFuZGxlZCBieSBjb250cm9sIHRhc2shXG4iKTsKKwkJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkJICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgod2FpdCAhPSBNRV9XQUlUX05PTkUpICYmICh3YWl0ICE9IE1FX1dBSVRfSURMRSkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHdhaXQgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfSU5WQUxJRDsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfV0FJVDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5zdGF0dXMpIHsKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZXJyb3I6CisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfSURMRTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW46CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0JVU1k7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwlkZWZhdWx0OgorCQkqc3RhdHVzID0KKwkJICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSA/CisJCSAgICBNRV9TVEFUVVNfQlVTWSA6IE1FX1NUQVRVU19JRExFOworCQlicmVhazsKKwl9CisKKwlpZiAoKHdhaXQgPT0gTUVfV0FJVF9JRExFKSAmJiAoKnN0YXR1cyA9PSBNRV9TVEFUVVNfQlVTWSkpIHsKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0KQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3NpbmdsZV9ydW4pCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0KQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fcnVuKQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCkpLAorCQkJCQkJIExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJUERFQlVHKCJXYWl0IGZvciBJRExFIGNhbmNlbGVkLiAlZFxuIiwKKwkJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IGZvciBJRExFIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfSURMRTsKKwl9CisKKwkqdmFsdWVzID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncykKK3sJCQkJLy8vIEBub3RlIFN0b3Agd29yayBhbmQgZW1wdHkgYnVmZmVyIGFuZCBGSUZPCisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl2b2xhdGlsZSB1aW50MzJfdCBjdHJsOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU1RSRUFNX1NUT1BfUFJFU0VSVkVfQlVGRkVSUykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkKKwkgICAgJiYgKHN0b3BfbW9kZSAhPSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRSkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0b3AgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RPUF9NT0RFOworCX0KKworCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPnN0YXR1cyA8IGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCkgeworCQkvL1RoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcCEKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGluIHN0cmVhbWluZyBtb2RlLiAlZFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vTWFyayBhcyBzdG9wcGluZy4gPT4gU29mdHdhcmUgc3RvcC4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDsKKworCWlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkgewkvL1N0b3BwZWQgbm93IQorCQllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwl9IGVsc2UgaWYgKHN0b3BfbW9kZSA9PSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRSkgeworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZykgJiBNRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0s7CisJCWlmIChjdHJsID09IE1FNjAwMF9BT19NT0RFX1dSQVBBUk9VTkQpIHsJLy9IYXJkd2FyZSB3cmFwYXJvdW5kID0+IEhhcmR3YXJlIHN0b3AuCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisJCX0KKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIlN0b3BwaW5nIHN0cmVhbSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIlN0b3BwaW5nIHN0cmVhbSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCWlmICghZmxhZ3MpIHsJCS8vUmVzZXQgRklGTworCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJaWYgKCFmbGFncykgewkJLy9SZXNldCBzb2Z0d2FyZSBidWZmZXIKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkgICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdWludDMyX3QgcmVnX2NvcHk7CisKKwlpbnQgY29waWVkX2Zyb21fdXNlciA9IDA7CisJaW50IGxlZnRfdG9fY29weV9mcm9tX3VzZXIgPSAqY291bnQ7CisKKwlpbnQgY29waWVkX3ZhbHVlczsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJLy9DaGVja2luZyBhcmd1bWVudHMKKwlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKmNvdW50IDw9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvdW50IG9mIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJfQorCisJaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisJCVBFUlJPUigiSW52YWxpZCBhZGRyZXNzIG9mIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUE9JTlRFUjsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpIHx8IChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZCkpIHsJLy9UaGUgZGV2aWNlIGlzIGluIHNpbmdsZSBtb2RlLgorCQlQRVJST1IKKwkJICAgICgiU3ViZGV2aWNlIG11c3QgYmUgcHJlaW5pdGlhbGl6ZSBjb3JyZWN0bHkgZm9yIHN0cmVhbWluZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCXN3aXRjaCAod3JpdGVfbW9kZSkgeworCWNhc2UgTUVfV1JJVEVfTU9ERV9QUkVMT0FEOgorCisJCS8vRGV2aWNlIG11c3QgYmUgc3RvcHBlZC4KKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCkKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJTdWJkZXZpY2UgbXVzdG4ndCBiZSBydW5pbmcgd2hlbiAncHJlLWxvYWQnIG1vZGUgaXMgdXNlZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJfQorCQlicmVhazsKKwljYXNlIE1FX1dSSVRFX01PREVfTk9OQkxPQ0tJTkc6CisJY2FzZSBNRV9XUklURV9NT0RFX0JMT0NLSU5HOgorCQkvLy8gQG5vdGUgSW4gYmxvY2tpbmcgbW9kZTogV2hlbiBkZXZpY2UgaXMgbm90IHJ1bmluZyBhbmQgdGhlcmUgaXMgbm90IGVub3VnaHQgc3BhY2UgY2FsbCB3aWxsIGJsb2NrZWQgdXAhCisJCS8vLyBAbm90ZSBTb21lIG90aGVyIHRocmVhZCBtdXN0IGVtcHR5IGJ1ZmZlciBieSBzdHJhdGluZyBlbmdpbmUuCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHdyaXRlIG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dSSVRFX01PREU7CisJfQorCisJaWYgKGluc3RhbmNlLT5tb2RlICYgTUU2MDAwX0FPX1dSQVBfTU9ERSkgewkvL1dyYXBhcm91bmQgbW9kZS4gRGV2aWNlIG11c3QgYmUgc3RvcHBlZC4KKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCkKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJTdWJkZXZpY2UgbXVzdG4ndCBiZSBydW5pbmcgd2hlbiAncHJlLWxvYWQnIG1vZGUgaXMgdXNlZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERTsKKwkJfQorCX0KKworCWlmICgoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0hXX1dSQVBfTU9ERSkKKwkgICAgJiYgKHdyaXRlX21vZGUgIT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSkgeworLyoKKwkJUEVSUk9SKCJPbmx5ICdwcmUtbG9hZCcgd3JpdGUgaXMgYWNjZXB0YWJsZSBpbiBoYXJkd2FyZSB3cmFwYXJvdW5kIG1vZGUuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKyovCisJCS8vVGhpcyBpcyB0cmFuc3BhcmVudCBmb3IgdXNlci4KKwkJUERFQlVHKCJDaGFuZ2luZyB3cml0ZV9tb2RlIHRvIE1FX1dSSVRFX01PREVfUFJFTE9BRC5cbiIpOworCQl3cml0ZV9tb2RlID0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmICh3cml0ZV9tb2RlID09IE1FX1dSSVRFX01PREVfUFJFTE9BRCkgewkvL0luaXQgZW52aXJvbWVudCAtIHByZWxvYWQKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJcmVnX2NvcHkgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJLy9DaGVjayBGSUZPCisJCWlmICghKHJlZ19jb3B5ICYgTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPKSkgewkvL0ZJRk8gbm90IGFjdGl2ZS4gRW5hYmxlIGl0LgorCQkJcmVnX2NvcHkgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJLy9Db3B5IHRvIGJ1ZmZlci4gVGhpcyBzdGVwIGlzIGNvbW1vbiBmb3IgYWxsIG1vZGVzLgorCQljb3BpZWRfZnJvbV91c2VyID0KKwkJICAgIGFvX2dldF9kYXRhX2Zyb21fdXNlcihpbnN0YW5jZSwgbGVmdF90b19jb3B5X2Zyb21fdXNlciwKKwkJCQkJICB2YWx1ZXMgKyAoKmNvdW50IC0KKwkJCQkJCSAgICBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyKSk7CisJCWxlZnRfdG9fY29weV9mcm9tX3VzZXIgLT0gY29waWVkX2Zyb21fdXNlcjsKKworCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX3J1bikgJiYgIShyZWdfY29weSAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy9CUk9LRU4gUElQRSEgVGhlIHN0YXRlIG1hY2hpbmUgaXMgc3RvcGVkIGJ1dCBsb2dpY2FsIHN0YXR1cyBzaG93IHRoYXQgc2hvdWxkIGJlIHdvcmtpbmcuCisJCQlQRVJST1IoIkJyb2tlbiBwaXBlIGluIHdyaXRlLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX3J1bikgJiYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19DT05USU5PVVMpICYmIChyZWdfY29weSAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL0NvbnRpbm91cyBtb2RlIHJ1bmluZyBhbmQgZGF0YSBhcmUgYmVsb3cgaGFsZiEKKworCQkJLy8gQmxvY2sgaW50ZXJydXB0cy4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJcmVnX2NvcHkgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkvL0Zhc3QgY29weQorCQkJY29waWVkX3ZhbHVlcyA9CisJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyLAorCQkJCQkgIDApOworCQkJaWYgKGNvcGllZF92YWx1ZXMgPiAwKSB7CisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKz0gY29waWVkX3ZhbHVlczsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPQorCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJCQkvLyBBY3RpdmF0ZSBpbnRlcnJ1cHRzLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlyZWdfY29weSB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwocmVnX2NvcHksIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgcmVnX2NvcHkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKGNvcGllZF92YWx1ZXMgPT0gMCkgewkvL1RoaXMgd2FzIGNoZWNrZWQgYW5kIG5ldmVyIHNob3VsZCBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTCgiQ09QWSBGSU5JU0ggV0lUSCAwIVxuIik7CisJCQl9CisKKwkJCWlmIChjb3BpZWRfdmFsdWVzIDwgMCkgewkvL1RoaXMgd2FzIGNoZWNrZWQgYW5kIG5ldmVyIHNob3VsZCBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTCgiQ09QWSBGSU5JU0ggV0lUSCBFUlJPUiFcbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I7CisJCQkJZXJyID0gTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWxlZnRfdG9fY29weV9mcm9tX3VzZXIpIHsJLy9BbGwgZGF0YXMgd2VyZSBjb3BpZWQuCisJCQlicmVhazsKKwkJfSBlbHNlIHsJLy9Ob3QgYWxsIGRhdGFzIHdlcmUgY29waWVkLgorCQkJaWYgKGluc3RhbmNlLT5tb2RlICYgTUU2MDAwX0FPX1dSQVBfTU9ERSkgewkvL0Vycm9yIHRvbyBtdWNoIGRhdGFzISBXcmFwYXJvdW5kIGlzIGxpbWl0ZWQgaW4gc2l6ZSEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJUb28gbXVjaCBkYXRhIGZvciB3cmFwYXJvdW5kIG1vZGUhICBFeGNlZWRlZCBzaXplIG9mICVsZC5cbiIsCisJCQkJICAgICBNRTYwMDBfQU9fQ0lSQ19CVUZfQ09VTlQgLSAxKTsKKwkJCQllcnIgPSBNRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHdyaXRlX21vZGUgIT0gTUVfV1JJVEVfTU9ERV9CTE9DS0lORykgewkvL05vbiBibG9ja2luZyBjYWxscworCQkJCWJyZWFrOworCQkJfQorCisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT4KKwkJCQkJCQkJICAgY2lyY19idWYpKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJUEVSUk9SKCJXcml0aW5nIGludGVycnVwdGVkIGJ5IHNpZ25hbC5cbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19ub25lKSB7CS8vUmVzZXQKKwkJCQlQRVJST1IoIldyaXRpbmcgaW50ZXJydXB0ZWQgYnkgcmVzZXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAod3JpdGVfbW9kZSA9PSBNRV9XUklURV9NT0RFX1BSRUxPQUQpIHsJLy9Db3B5IGRhdGEgdG8gRklGTyAtIHByZWxvYWQKKwkJY29waWVkX3ZhbHVlcyA9CisJCSAgICBhb193cml0ZV9kYXRhX3Bvb2xpbmcoaW5zdGFuY2UsIE1FNjAwMF9BT19GSUZPX0NPVU5ULAorCQkJCQkgIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvcGllZF92YWx1ZXM7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvcGllZF92YWx1ZXM7CisKKwkJaWYgKChpbnN0YW5jZS0+bW9kZSA9PSBNRTYwMDBfQU9fSFdfV1JBUF9NT0RFKQorCQkgICAgJiYgKG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSA+CisJCQlNRTYwMDBfQU9fRklGT19DT1VOVCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiVG9vIG11Y2ggZGF0YSBmb3IgaGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlISBFeGNlZWRlZCBzaXplIG9mICVkLlxuIiwKKwkJCSAgICAgTUU2MDAwX0FPX0ZJRk9fQ09VTlQpOworCQkJZXJyID0gTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJCX0KKwl9CisKKwkqY291bnQgPSAqY291bnQgLSBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyOworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTYwMDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU2MDAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2VuZGlmCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZSA9IGRldl9pZDsKKwl1aW50MzJfdCBpcnFfc3RhdHVzOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3RhdHVzOworCWludCBjb3VudCA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlycV9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoIShpcnFfc3RhdHVzICYgKE1FNjAwMF9JUlFfU1RBVFVTX0JJVF9BT19IRiA8PCBpbnN0YW5jZS0+YW9faWR4KSkpIHsKKwkJUElORk8oIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBJRD0lZDogc3RhdHVzX3JlZz0weCUwNFhcbiIsCisJCSAgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaW5zdGFuY2UtPmFvX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCVBFUlJPUl9DUklUSUNBTCgiQ0lSQ1VMQVIgQlVGRkVSIE5PVCBFWElTVFMhXG4iKTsKKwkJLy9CbG9jayBpbnRlcnJ1cHRzLiBTdG9wIG1hY2hpbmUuCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0KKwkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vSW5mb3JtIHVzZXIKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vVG9vIGxhdGUuIE5vdCB3b3JraW5nISBFTkQ/IEJST0tFTiBQSVBFPworCQkvLy8gQG5vdGUgRXJyb3IgY2hlY2tpbmcgd2FzIG1vdmVkIHRvIHNlcGFyYXRlIHRhc2suCisJCVBERUJVRygiSW50ZXJydXB0IGNvbWUgYnV0IElTTSBpcyBub3Qgd29ya2luZyFcbiIpOworCQkvL0Jsb2NrIGludGVycnVwdHMuIFN0b3AgbWFjaGluZS4KKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJY3RybCB8PQorCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCQkvLy8gQG5vdGUgVXNlciBub3RpZmljYXRpb24gd2FzIGFsc28gbW92ZWQgdG8gc2VwYXJhdGUgdGFzay4KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwkvL0dlbmVyYWwgcHJvY2VkdXJlLiBQcm9jZXNzIG1vcmUgZGF0YXMuCisKKyNpZmRlZiBNRURFQlVHX0RFQlVHCisJaWYgKCFtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9CdWZmZXIgaXMgZW1wdHkhCisJCVBERUJVRygiQ2lyY3VsYXIgYnVmZmVyIGVtcHR5IVxuIik7CisJfQorI2VuZGlmCisKKwkvL0NoZWNrIEZJRk8KKwlpZiAoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpIHsJLy9PSyBsZXNzIHRoYW4gaGFsZgorCisJCS8vQmxvY2sgaW50ZXJydXB0cworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCWRvIHsKKwkJCS8vQ2FsY3VsYXRlIGhvdyBtYW55IHNob3VsZCBiZSBjb3BpZWQuCisJCQljb3VudCA9CisJCQkgICAgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpID8gaW5zdGFuY2UtPgorCQkJICAgIHN0b3BfZGF0YV9jb3VudCAtCisJCQkgICAgaW5zdGFuY2UtPmRhdGFfY291bnQgOiBNRTYwMDBfQU9fRklGT19DT1VOVCAvIDI7CisJCQlpZiAoTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyIDwgY291bnQpIHsKKwkJCQljb3VudCA9IE1FNjAwMF9BT19GSUZPX0NPVU5UIC8gMjsKKwkJCX0KKwkJCS8vQ29weSBkYXRhCisJCQlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQkJCWNvdW50ID0gYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIDApOworCQkJCWlmIChjb3VudCA+IDApIHsKKwkJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKz0gY291bnQ7CisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9CisJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisKKwkJCQkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpICYmICFtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9TdG9waW5nLiBXaG9sZSBidWZmZXIgd2FzIGNvcGllZC4KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmICgoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX1NXX1dSQVBfTU9ERSkgJiYgKChjdHJsICYgTUU2MDAwX0FPX0NUUkxfTU9ERV9NQVNLKSA9PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTKSkgewkvL1dyYXBhcm91bmQgKHNvZnR3YXJlKQorCQkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpIHsJLy9XZSBzdG9waW5nID0+IENvcHkgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorCQkJCQljb3VudCA9CisJCQkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgMCk7CisJCQkJfSBlbHNlIHsJLy9Db3B5IGluIHdyYXBhcm91bmQgbW9kZS4KKwkJCQkJY291bnQgPQorCQkJCQkgICAgYW9fd3JpdGVfZGF0YV93cmFwYXJvdW5kKGluc3RhbmNlLAorCQkJCQkJCQkgICAgIGNvdW50LAorCQkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkJICAgICBwcmVsb2FkZWRfY291bnQpOworCQkJCX0KKworCQkJCWlmIChjb3VudCA+IDApIHsKKwkJCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisJCQkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgKz0gY291bnQ7CisJCQkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgJT0KKwkJCQkJICAgIG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgICBjaXJjX2J1Zik7CisKKwkJCQkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpICYmICFpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KSB7CS8vU3RvcGluZy4gV2hvbGUgYnVmZmVyIHdhcyBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKChjb3VudCA8PSAwKSB8fCAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpKSB7CS8vRW5kIG9mIHdvcmsuCisJCQkJYnJlYWs7CisJCQl9CisJCX0JCS8vUmVwZWF0IGlmIHN0aWxsIGlzIHVuZGVyIGhhbGYgZmlmbworCQl3aGlsZSAoKHN0YXR1cyA9CisJCQlpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpKSAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKTsKKworCQkvL1VuYmxvY2sgaW50ZXJydXB0cworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWlmIChjb3VudCA+PSAwKSB7CS8vQ29weSB3YXMgc3VjY2Vzc2Z1bC4KKwkJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDw9IGluc3RhbmNlLT5kYXRhX2NvdW50KSkgewkvL0ZpbmlzaGluZyB3b3JrLiBObyBtb3JlIGludGVycnVwdHMuCisJCQkJUERFQlVHKCJGaW5pc2hpbmcgd29yay4gSW50ZXJydXB0IGRpc2FibGVkLlxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ7CisJCQl9IGVsc2UgaWYgKGNvdW50ID4gMCkgewkvL05vcm1hbCB3b3JrLiBFbmFibGUgaW50ZXJydXB0LgorCQkJCVBERUJVRygiTm9ybWFsIHdvcmsuIEVuYWJsZSBpbnRlcnJ1cHQuXG4iKTsKKwkJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJfSBlbHNlIHsJLy9Ob3JtYWwgd29yayBidXQgdGhlcmUgYXJlIG5vIG1vcmUgZGF0YSBpbiBidWZmZXIuIEludGVycnVwdCBibG9ja2VkLiBzdHJlYW1fd3JpdGUoKSB3aWxsIHVuYmxvY2sgaXQuCisJCQkJUERFQlVHCisJCQkJICAgICgiTm8gZGF0YSBpbiBzb2Z0d2FyZSBidWZmZXIuIEludGVycnVwdCBibG9ja2VkLlxuIik7CisJCQl9CisJCX0gZWxzZSB7CS8vRXJyb3IgZHVyaW5nIGNvcHkuCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCQl9CisKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwl9IGVsc2UgewkJLy8/PyBtb3JlIHRoYW4gaGFsZgorCQlQREVCVUcKKwkJICAgICgiSW50ZXJydXB0IGNvbWUgYnV0IEZJRk8gbW9yZSB0aGFuIGhhbGYgZnVsbCEgUmVzZXQgaW50ZXJydXB0LlxuIik7CisJfQorCisJUElORk8oIklTUjogQnVmZmVyIGNvdW50OiAlZC4oVDolZCBIOiVkKVxuIiwKKwkgICAgICBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZiksIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsLAorCSAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKTsKKwlQSU5GTygiSVNSOiBTdG9wIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2NvdW50KTsKKwlQSU5GTygiSVNSOiBTdG9wIGRhdGEgY291bnQ6ICVkLlxuIiwgaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCk7CisJUElORk8oIklTUjogRGF0YSBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+ZGF0YV9jb3VudCk7CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkvL0luZm9ybSB1c2VyCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtZTYwMDBfYW9fZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKworCS8vIFJlc2V0IHN1YmRldmljZSB0byBhc3VyZSBjbGVhbiBleGl0LgorCW1lNjAwMF9hb19pb19yZXNldF9zdWJkZXZpY2Uoc3ViZGV2aWNlLCBOVUxMLAorCQkJCSAgICAgTUVfSU9fUkVTRVRfU1VCREVWSUNFX05PX0ZMQUdTKTsKKworCS8vIFJlbW92ZSBhbnkgdGFza3MgZnJvbSB3b3JrIHF1ZXVlLiBUaGlzIGlzIHBhcmFub2ljIGJlY2F1c2UgaXQgd2FzIGRvbmUgYWxscmVhZHkgaW4gcmVzZXQoKS4KKwlpZiAoIWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spKSB7CS8vV2FpdCAyIHRpY2tzIHRvIGJlIHN1cmUgdGhhdCBjb250cm9sIHRhc2sgaXMgcmVtb3ZlZCBmcm9tIHF1ZXVlLgorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDIpOworCX0KKworCWlmIChpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgeworCQlpZiAoaW5zdGFuY2UtPmlycSkgeworCQkJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPmlycSA9IDA7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZikgeworCQkJUERFQlVHKCJmcmVlIGNpcmNfYnVmID0gJXAgc2l6ZT0lZCIsCisJCQkgICAgICAgaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCSAgICAgICBQQUdFX1NISUZUIDw8IE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCQkgICBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCX0KKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJfQorCisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworbWU2MDAwX2FvX3N1YmRldmljZV90ICptZTYwMDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIHVpbnQzMl90ICogdHJpZ2dlcmluZ19mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBmaWZvLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgaW50IGhpZ2hfcmFuZ2UsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1lNjAwMF93cSkKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZCBJRD0lZC5cbiIsIGFvX2lkeCk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNjAwMF9hb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTYwMDBfYW9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+cHJlbG9hZF9yZWdfbG9jayA9IHByZWxvYWRfcmVnX2xvY2s7CisJc3ViZGV2aWNlLT5wcmVsb2FkX2ZsYWdzID0gcHJlbG9hZF9mbGFnczsKKwlzdWJkZXZpY2UtPnRyaWdnZXJpbmdfZmxhZ3MgPSB0cmlnZ2VyaW5nX2ZsYWdzOworCisJLyogU3RvcmUgYW5hbG9nIG91dHB1dCBpbmRleCAqLworCXN1YmRldmljZS0+YW9faWR4ID0gYW9faWR4OworCisJLyogU3RvcmUgaWYgYW5hbG9nIG91dHB1dCBoYXMgZmlmbyAqLworCXN1YmRldmljZS0+ZmlmbyA9IGZpZm87CisKKwlpZiAoc3ViZGV2aWNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSB7CisJCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGNpcmN1bGFyIGJ1ZmZlciAqLworCQlzdWJkZXZpY2UtPmNpcmNfYnVmLm1hc2sgPSBNRTYwMDBfQU9fQ0lSQ19CVUZfQ09VTlQgLSAxOworCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9CisJCSAgICAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJCQkJICAgICBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCVBERUJVRygiY2lyY19idWYgPSAlcCBzaXplPSVsZFxuIiwgc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCSAgICAgICBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRSk7CisKKwkJaWYgKCFzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZikgeworCQkJUEVSUk9SCisJCQkgICAgKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVtc2V0KHN1YmRldmljZS0+Y2lyY19idWYuYnVmLCAwLCBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRSk7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gMDsKKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYgPSBOVUxMOworCX0KKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCXN1YmRldmljZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlzdWJkZXZpY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCXN1YmRldmljZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCXN1YmRldmljZS0+dGltZW91dC5kZWxheSA9IDA7CisJc3ViZGV2aWNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3ViZGV2aWNlLT53YWl0X3F1ZXVlKTsKKworCS8qIEluaXRpYWxpemUgc2luZ2xlIHZhbHVlIHRvIDBWICovCisJc3ViZGV2aWNlLT5zaW5nbGVfdmFsdWUgPSAweDgwMDA7CisJc3ViZGV2aWNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IDB4ODAwMDsKKworCS8qIEluaXRpYWxpemUgcmFuZ2UgYm9hcmRlcnMgKi8KKwlpZiAoaGlnaF9yYW5nZSkgeworCQlzdWJkZXZpY2UtPm1pbiA9IE1FNjAwMF9BT19NSU5fUkFOR0VfSElHSDsKKwkJc3ViZGV2aWNlLT5tYXggPSBNRTYwMDBfQU9fTUFYX1JBTkdFX0hJR0g7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5taW4gPSBNRTYwMDBfQU9fTUlOX1JBTkdFOworCQlzdWJkZXZpY2UtPm1heCA9IE1FNjAwMF9BT19NQVhfUkFOR0U7CisJfQorCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworCisJaWYgKHN1YmRldmljZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgeworCQlzdWJkZXZpY2UtPmlycSA9IGlycTsKKwkJaWYgKHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTYwMDBfYW9faXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJCVNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQkJTUU2MDAwX05BTUUsIHN1YmRldmljZSkpIHsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBpbnRlcnJ1cHQgbGluZS5cbiIpOworCQkJUERFQlVHKCJmcmVlIGNpcmNfYnVmID0gJXAgc2l6ZT0lZCIsCisJCQkgICAgICAgc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCQkgICAgICAgUEFHRV9TSElGVCA8PCBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJCSAgIE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5pcnEgPSAwOworCX0KKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzICovCisJLy8gT25seSBzdHJlYW1lZCBzdWJkZXZpY2VzIHN1cHBvcnQgaW50ZXJydXB0cy4gRm9yIHRoZSByZXN0IHRoaXMgcmVnaXN0ZXIgaGFzIG5vIG1lYW5pbmcuCisJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPX0lSUV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+cHJlbG9hZF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19QUkVMT0FEX1JFRzsKKworCWlmIChhb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAwX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMF9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMF9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+aXJxX3Jlc2V0X3JlZyA9CisJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wMF9JUlFfUkVTRVRfUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMF9TSU5HTEVfUkVHOworCX0gZWxzZSBpZiAoYW9faWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMV9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDFfRklGT19SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDFfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPmlycV9yZXNldF9yZWcgPQorCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDFfSVJRX1JFU0VUX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDFfU0lOR0xFX1JFRzsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAyKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDJfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAyX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAyX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0KKwkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzAyX0lSUV9SRVNFVF9SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAyX1NJTkdMRV9SRUc7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMykgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAzX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wM19GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wM19USU1FUl9SRUc7CisJCXN1YmRldmljZS0+aXJxX3Jlc2V0X3JlZyA9CisJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wM19JUlFfUkVTRVRfUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wM19TSU5HTEVfUkVHOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19EVU1ZOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19EVU1ZOworCQlzdWJkZXZpY2UtPmlycV9yZXNldF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19EVU1ZOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19EVU1ZOworCisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHOworCQlpZiAoYW9faWR4ID09IDQpIHsKKwkJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDRfU0lOR0xFX1JFRzsKKwkJfSBlbHNlIGlmIChhb19pZHggPT0gNSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wNV9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSA2KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzA2X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDcpIHsKKwkJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDdfU0lOR0xFX1JFRzsKKwkJfSBlbHNlIGlmIChhb19pZHggPT0gOCkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wOF9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSA5KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzA5X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDEwKSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzEwX1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDExKSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzExX1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDEyKSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzEyX1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDEzKSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzEzX1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDE0KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzE0X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDE1KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzE1X1NJTkdMRV9SRUc7CisJCX0gZWxzZSB7CisJCQlQRVJST1JfQ1JJVElDQUwoIldST05HIFNVQkRFVklDRSBJRD0lZCEiLCBhb19pZHgpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJCWlmIChzdWJkZXZpY2UtPmZpZm8pIHsKKwkJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN1YmRldmljZS0+Y2lyY19idWYuCisJCQkJCSAgIGJ1ZiwgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQkJfQorCQkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYgPSBOVUxMOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU2MDAwX2FvX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTYwMDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNjAwMF9hb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTYwMDBfYW9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTYwMDBfYW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9CisJICAgIG1lNjAwMF9hb19pb19zdHJlYW1fY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPQorCSAgICBtZTYwMDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUgPQorCSAgICBtZTYwMDBfYW9faW9fc3RyZWFtX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZTYwMDBfYW9faW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWU2MDAwX2FvX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXg7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV90aW1lciA9IG1lNjAwMF9hb19xdWVyeV90aW1lcjsKKworCS8vcHJlcGFyZSB3b3JrIHF1ZXVlIGFuZCB3b3JrIGZ1bmN0aW9uCisJc3ViZGV2aWNlLT5tZTYwMDBfd29ya3F1ZXVlID0gbWU2MDAwX3dxOworCisvKiB3b3JrcXVldWUgQVBJIGNoYW5nZWQgaW4ga2VybmVsIDIuNi4yMCAqLworI2lmICggTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSApCisJSU5JVF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrLAorCQkgICh2b2lkICopc3ViZGV2aWNlKTsKKyNlbHNlCisJSU5JVF9ERUxBWUVEX1dPUksoJnN1YmRldmljZS0+YW9fY29udHJvbF90YXNrLAorCQkJICBtZTYwMDBfYW9fd29ya19jb250cm9sX3Rhc2spOworI2VuZGlmCisKKwlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CS8vU2V0IHNwZWVkCisJCW91dGwoTUU2MDAwX0FPX01JTl9DSEFOX1RJQ0tTIC0gMSwgc3ViZGV2aWNlLT50aW1lcl9yZWcpOworCQlzdWJkZXZpY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSBIWiAvIDEwOwkvLzEwMG1zCisJfQorCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworLyoqIEBicmllZiBTdG9wIHByZXNlbnRhdGlvbi4gUHJlc2VydmUgRklGT3MuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyovCitpbnQgaW5saW5lIGFvX3N0b3BfaW1tZWRpYXRlbHkobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgY3RybDsKKwlpbnQgdGltZW91dDsKKwlpbnQgaTsKKwl1aW50MzJfdCBzaW5nbGVfbWFzazsKKworCXNpbmdsZV9tYXNrID0KKwkgICAgKGluc3RhbmNlLT5hb19pZHggLSBNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19PRkZTRVQgPAorCSAgICAgMCkgPyAweDAwMDAgOiAoMHgwMDAxIDw8IChpbnN0YW5jZS0+YW9faWR4IC0KKwkJCQkgICAgICAgTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfT0ZGU0VUKSk7CisKKwl0aW1lb3V0ID0KKwkgICAgKGluc3RhbmNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID4KKwkgICAgIChIWiAvIDEwKSkgPyBpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA6IEhaIC8gMTA7CisJZm9yIChpID0gMDsgaSA8PSB0aW1lb3V0OyBpKyspIHsKKwkJaWYgKGluc3RhbmNlLT5maWZvKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cy4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9CisJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCWN0cmwgJj0KKwkJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvLyBFeGl0LgorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIHNpbmdsZV9tYXNrKSkgewkvLyBFeGl0LgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJUElORk8oIjwlcz4gV2FpdCBmb3Igc3RvcDogJWRcbiIsIF9fRlVOQ1RJT05fXywgaSk7CisKKwkJLy9TdGlsbCB3b3JraW5nIQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChpID4gdGltZW91dCkgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpIGluIHdyYXBhcm91bmQuCisqIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbi4gQ2hlY2tpbmcgaXMgZG9uZSBhdCBiZWdpbmluZyBhbmQgZW5kIG9ubHkuCisqIEBub3RlIFRoZSBpcyBub3QgcmVhc29uYWJsZSB3YXkgdG8gY2hlY2sgaG93IG1hbnkgd2FsdWVzIHdhcyBpbiBGSUZPIGF0IGJlZ2luaW5nLiBUaGUgY291bnQgbXVzdCBiZSBtYW5hZ2VkIGV4dGVybmFseS4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHJldHVybiBPbiBlcnJvci9zdWNjZXNzOiAwLglObyBkYXRhcyB3ZXJlIGNvcGllZCA9PiBubyBkYXRhIGluIGJ1ZmZlci4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XLgorKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YV93cmFwYXJvdW5kKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJICAgIGludCBzdGFydF9wb3MpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlOworCWludCBwb3MgPQorCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKyBzdGFydF9wb3MpICYgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJaW50IGxvY2FsX2NvdW50ID0gY291bnQ7CisJaW50IGkgPSAxOworCisJaWYgKGNvdW50IDw9IDApIHsJLy9Xcm9uZyBjb3VudCEKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGkgPCBsb2NhbF9jb3VudCkgeworCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQlpZiAocG9zID09IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSB7CisJCQlwb3MgPSBpbnN0YW5jZS0+Y2lyY19idWYudGFpbDsKKwkJfQorCQlpKys7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEKKwkJUEVSUk9SKCJpZHg9JWQgRklGTyBpcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJfSBlbHNlIHsJCS8vQWRkIGxhc3QgdmFsdWUKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9CisKKwlQSU5GTygiaWR4PSVkIFdSQVBBUk9VTkQgTE9BREVEICVkIHZhbHVlc1xuIiwgaW5zdGFuY2UtPmFvX2lkeCwKKwkgICAgICBsb2NhbF9jb3VudCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChmYXN0KS4KKyogQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uLiBDaGVja2luZyBpcyBkb25lIGF0IGJlZ2luaW5nIGFuZCBlbmQgb25seS4KKyogQG5vdGUgVGhlIGlzIG5vdCByZWFzb25hYmxlIHdheSB0byBjaGVjayBob3cgbWFueSB3YWx1ZXMgd2FzIGluIEZJRk8gYXQgYmVnaW5pbmcuIFRoZSBjb3VudCBtdXN0IGJlIG1hbmFnZWQgZXh0ZXJuYWx5LgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcmV0dXJuIE9uIGVycm9yL3N1Y2Nlc3M6IDAuCU5vIGRhdGFzIHdlcmUgY29waWVkID0+IG5vIGRhdGEgaW4gYnVmZmVyLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1cuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkgaW50IHN0YXJ0X3BvcykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdmFsdWU7CisJaW50IHBvcyA9CisJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArIHN0YXJ0X3BvcykgJiBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwlpbnQgbG9jYWxfY291bnQgPSBjb3VudDsKKwlpbnQgbWF4X2NvdW50OworCWludCBpID0gMTsKKworCWlmIChjb3VudCA8PSAwKSB7CS8vV3JvbmcgY291bnQhCisJCXJldHVybiAwOworCX0KKworCW1heF9jb3VudCA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSAtIHN0YXJ0X3BvczsKKwlpZiAobWF4X2NvdW50IDw9IDApIHsJLy9ObyBkYXRhIHRvIGNvcHkhCisJCXJldHVybiAwOworCX0KKworCWlmIChtYXhfY291bnQgPCBjb3VudCkgeworCQlsb2NhbF9jb3VudCA9IG1heF9jb3VudDsKKwl9CisKKwl3aGlsZSAoaSA8IGxvY2FsX2NvdW50KSB7CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWkrKzsKKwl9CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkIQorCQlQRVJST1IoImlkeD0lZCBGSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCFcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIC1NRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwl9IGVsc2UgewkJLy9BZGQgbGFzdCB2YWx1ZQorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCX0KKworCVBJTkZPKCJpZHg9JWQgRkFTVCBMT0FERUQgJWQgdmFsdWVzXG4iLCBpbnN0YW5jZS0+YW9faWR4LCBsb2NhbF9jb3VudCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChzbG93KS4KKyogQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIHRoYXQgY29weSBhbGwgZGF0YSBmcm9tIGJ1ZmZlciB0byBGSUZPIHdpdGggZnVsbCBjb250cm9sLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3Ivc3VjY2VzczogMC4JRklGTyB3YXMgZnVsbCBhdCBiZWdpbmluZy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX1JJTkdfQlVGRkVSX1VOREVGRkxPVy4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIQorCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgcG9zID0KKwkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsgc3RhcnRfcG9zKSAmIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCWludCBsb2NhbF9jb3VudCA9IGNvdW50OworCWludCBpOworCWludCBtYXhfY291bnQ7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlQRVJST1IoImlkeD0lZCBTTE9XIExPQURFRDogV3JvbmcgY291bnQhXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWF4X2NvdW50ID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpIC0gc3RhcnRfcG9zOworCWlmIChtYXhfY291bnQgPD0gMCkgewkvL05vIGRhdGEgdG8gY29weSEKKwkJUEVSUk9SKCJpZHg9JWQgU0xPVyBMT0FERUQ6IE5vIGRhdGEgdG8gY29weSFcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1heF9jb3VudCA8IGNvdW50KSB7CisJCWxvY2FsX2NvdW50ID0gbWF4X2NvdW50OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsb2NhbF9jb3VudDsgaSsrKSB7CisJCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCEKKwkJCXJldHVybiBpOworCQl9CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oImlkeD0lZCBTTE9XIExPQURFRCAlZCB2YWx1ZXNcbiIsIGluc3RhbmNlLT5hb19pZHgsIGxvY2FsX2NvdW50KTsKKwlyZXR1cm4gbG9jYWxfY291bnQ7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBjaXJjdWxhciBidWZmZXIuCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IE51bWJlciBvZiBkYXRhcyBpbiB1c2VyIHNwYWNlLgorKiBAcGFyYW0gdXNlcl92YWx1ZXMgQnVmZmVyJ3MgcG9pbnRlci4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIHZhbHVlcy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0lOVEVSTkFMLgorKi8KK2ludCBpbmxpbmUgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCAqdXNlcl92YWx1ZXMpCit7CisJaW50IGksIGVycjsKKwlpbnQgZW1wdHlfc3BhY2U7CisJaW50IGNvcGllZDsKKwlpbnQgdmFsdWU7CisKKwllbXB0eV9zcGFjZSA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCS8vV2UgaGF2ZSBvbmx5IHRoaXMgc3BhY2UgZnJlZS4KKwljb3BpZWQgPSAoY291bnQgPCBlbXB0eV9zcGFjZSkgPyBjb3VudCA6IGVtcHR5X3NwYWNlOworCWZvciAoaSA9IDA7IGkgPCBjb3BpZWQ7IGkrKykgewkvL0NvcHkgZnJvbSB1c2VyIHRvIGJ1ZmZlcgorCQlpZiAoKGVyciA9IGdldF91c2VyKHZhbHVlLCAoaW50ICopKHVzZXJfdmFsdWVzICsgaSkpKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJpZHg9JWQgQlVGRkVSIExPQURFRDogZ2V0X3VzZXIoMHglcCkgcmV0dXJuIGFuIGVycm9yOiAlZFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPmFvX2lkeCwgdXNlcl92YWx1ZXMgKyBpLCBlcnIpOworCQkJcmV0dXJuIC1NRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCQkvLy8gQG5vdGUgVGhlIGFuYWxvZyBvdXRwdXQgaW4gbWU2MDAwIHNlcmllcyBoYXMgc2l6ZSBvZiAxNiBiaXRzLgorCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkgICAgKHVpbnQxNl90KSB2YWx1ZTsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQrKzsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oImlkeD0lZCBCVUZGRVIgTE9BREVEICVkIHZhbHVlc1xuIiwgaW5zdGFuY2UtPmFvX2lkeCwgY29waWVkKTsKKwlyZXR1cm4gY29waWVkOworfQorCitzdGF0aWMgdm9pZCBtZTYwMDBfYW9fd29ya19jb250cm9sX3Rhc2soCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCQkJCQkgICAgICAgdm9pZCAqc3ViZGV2aWNlCisjZWxzZQorCQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrCisjZW5kaWYKKyAgICApCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3luY2g7CisJaW50IHJlc2NoZWR1bGUgPSAwOworCWludCBzaWduYWxpbmcgPSAwOworCXVpbnQzMl90IHNpbmdsZV9tYXNrOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisjZWxzZQorCWluc3RhbmNlID0KKwkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWU2MDAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOworI2VuZGlmCisJUElORk8oIjwlczogJWxkPiBleGVjdXRlZC4gaWR4PSVkXG4iLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMsCisJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCVBERUJVR19SRUcoInN0YXR1c19yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zdGF0dXNfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0dXMpOworCisvLy8gQG5vdGUgQU9fU1RBVFVTX0JJVF9GU00gZG9lc24ndCB3b3JrIGFzIHNob3VsZCBiZSBmb3IgcHVyZSBzaW5nbGUgY2hhbm5lbHMgKGlkeD49NCkKKy8vICAgICAgc2luZ2xlX21hc2sgPSAoaW5zdGFuY2UtPmFvX2lkeC1NRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19PRkZTRVQgPCAwKSA/IDB4MDAwMCA6ICgweDAwMDEgPDwgKGluc3RhbmNlLT5hb19pZHgtTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfT0ZGU0VUKSk7CisJc2luZ2xlX21hc2sgPSAqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgJiAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCisJc3dpdGNoIChpbnN0YW5jZS0+c3RhdHVzKSB7CS8vIENoZWNraW5nIGFjdHVhbCBtb2RlLgorCisJCS8vIE5vdCBjb25maWd1cmVkIGZvciB3b3JrLgorCWNhc2UgYW9fc3RhdHVzX25vbmU6CisJCWJyZWFrOworCisJCS8vVGhpcyBhcmUgc3RhYmxlIG1vZGVzLiBObyBuZWVkIHRvIGRvIGFueXRoaW5nLiAoPykKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJUEVSUk9SKCJTaG91bGRuJ3QgYmUgcnVubmluZyEuXG4iKTsKKwkJYnJlYWs7CisKKwkJLy8gU2luZ2xlIG1vZGVzCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW46CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0OgorCQlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy8gRXh0cmEgcmVnaXN0ZXJzLgorCQkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLgorCQkJCWlmICgoKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKQorCQkJCSAgICAgJiYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRUYpKSkKKwkJCQkgICAgfHwgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSkgewkvLyBTaW5nbGUgaXMgaW4gZW5kIHN0YXRlLgorCQkJCQlQREVCVUcKKwkJCQkJICAgICgiU2luZ2xlIGNhbGwgaGFzIGJlZW4gY29tcGxpdGVkLlxuIik7CisKKwkJCQkJLy8gU2V0IGNvcnJlY3QgdmFsdWUgZm9yIHNpbmdsZV9yZWFkKCk7CisJCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPQorCQkJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvOworCisJCQkJCS8vIFNldCBzdGF0dXMgYXMgJ2FvX3N0YXR1c19zaW5nbGVfZW5kJworCQkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisKKwkJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJaWYgKChzaW5nbGVfbWFzaykgJiYgKCppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmIChNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpKSkgewkvLyBUaGlzIGlzIG9uZSBvZiBzeW5jaHJvbm91cyBzdGFydCBjaGFubmVscy4gU2V0IGFsbCBhcyB0cmlnZ2VyZWQuCisJCQkJCQkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgPQorCQkJCQkJICAgIDB4MDAwMDAwMDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvL1NldCB0aGlzIGNoYW5uZWwgYXMgdHJpZ2dlcmVkIChub25lIGFjdGl2ZSkuCisJCQkJCQkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgJj0KKwkJCQkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCQkJfQorCQkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJCXNpZ25hbGluZyA9IDE7CisJCQkJCS8vIFdhaXQgZm9yIHN0b3AgSVNNLgorCQkJCQlyZXNjaGVkdWxlID0gMTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvLyBDaGVjayB0aW1lb3V0LgorCQkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMgYW5kIHRyaWdnZXIuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgIGNwdV9mbGFncyk7CisJCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCWN0cmwgfD0KKwkJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJY3RybCAmPQorCQkJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJCWN0cmwgJj0KKwkJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEgpOworCQkJCS8vRGlzYWJsaW5nIEZJRk8KKwkJCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisKKwkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkvL1JlbW92ZSBmcm9tIHN5bmNocm9ub3VzIHN0YXJ0LiBCbG9jayB0cmlnZ2VyaW5nIGZyb20gdGhpcyBvdXRwdXQuCisJCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlzeW5jaCAmPQorCQkJCSAgICB+KChNRTYwMDBfQU9fU1lOQ19IT0xEIHwKKwkJCQkgICAgICAgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgewkvLyBObyBGSUZPIC0gc2V0IHRvIHNpbmdsZSBzYWZlIG1vZGUKKwkJCQkJc3luY2ggfD0KKwkJCQkJICAgIE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPgorCQkJCQkgICAgYW9faWR4OworCQkJCX0KKwkJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY2gpOworCQkJCS8vU2V0IHRoaXMgY2hhbm5lbCBhcyB0cmlnZ2VyZWQgKG5vbmUgYWN0aXZlKS4KKwkJCQkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgJj0KKwkJCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCQkJLy8gU2V0IGNvcnJlY3QgdmFsdWUgZm9yIHNpbmdsZV9yZWFkKCk7CisJCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0KKwkJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJCXNpZ25hbGluZyA9IDE7CisJCQl9CisJCX0gZWxzZSB7CS8vIE5vIGV4dHJhIHJlZ2lzdGVycy4KKy8qCisJCQkJaWYgKCEoc3RhdHVzICYgc2luZ2xlX21hc2spKQorCQkJCXsvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLgorCQkJCQlQREVCVUcoIlNpbmdsZSBjYWxsIGhhcyBiZWVuIGNvbXBsaXRlZC5cbiIpOworCisJCQkJCS8vIFNldCBjb3JyZWN0IHZhbHVlIGZvciBzaW5nbGVfcmVhZCgpOworCQkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvOworCisJCQkJCS8vIFNldCBzdGF0dXMgYXMgJ2FvX3N0YXR1c19zaW5nbGVfZW5kJworCQkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisKKwkJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJCXNpZ25hbGluZyA9IDE7CisJCQkJCS8vIFdhaXQgZm9yIHN0b3AgSVNNLgorCQkJCQlyZXNjaGVkdWxlID0gMTsKKworCQkJCQlicmVhazsKKwkJCQl9CisqLworCQkJaWYgKCFzaW5nbGVfbWFzaykgewkvLyBXYXMgdHJpZ2dlcmVkLgorCQkJCVBERUJVRygiU2luZ2xlIGNhbGwgaGFzIGJlZW4gY29tcGxpdGVkLlxuIik7CisKKwkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0KKwkJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvOworCisJCQkJLy8gU2V0IHN0YXR1cyBhcyAnYW9fc3RhdHVzX3NpbmdsZV9lbmQnCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gQ2hlY2sgdGltZW91dC4KKwkJCWlmICgoaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpICYmICgoamlmZmllcyAtIGluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUpID49IGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSkgewkvLyBUaW1lb3V0CisJCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKworCQkJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4gQmxvY2sgdHJpZ2dlcmluZyBmcm9tIHRoaXMgb3V0cHV0LgorCQkJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJc3luY2ggJj0KKwkJCQkgICAgfihNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKwkJCQlzeW5jaCB8PQorCQkJCSAgICBNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY2gpOworCQkJCS8vU2V0IHRoaXMgY2hhbm5lbCBhcyB0cmlnZ2VyZWQgKG5vbmUgYWN0aXZlKS4KKwkJCQkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgJj0KKwkJCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCQkJLy8gUmVzdG9yZSBvbGQgc2V0dGluZ3MuCisJCQkJUERFQlVHKCJXcml0ZSBvbGQgdmFsdWUgYmFjayB0byByZWdpc3Rlci5cbiIpOworCQkJCW91dGwoaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSwKKwkJCQkgICAgIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlKTsKKworCQkJCS8vIFNldCBjb3JyZWN0IHZhbHVlIGZvciBzaW5nbGVfcmVhZCgpOworCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9CisJCQkJICAgIGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCQkJfQorCQl9CisKKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZDoKKwkJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CS8vIE5vIEZJRk8KKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiU3RyZWFtaW5nIG9uIHNpbmdsZSBkZXZpY2UhIFRoaXMgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIVxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZDoKKwkJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vIEV4dHJhIHJlZ2lzdGVycy4KKwkJCWlmIChzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pIHsJLy8gU3RhdGUgbWFjaGluZSBpcyB3b3JraW5nIGJ1dCB0aGUgc3RhdHVzIGlzIHNldCB0byBlbmQuIEZvcmNlIHN0b3AuCisKKwkJCQkvLyBXYWl0IGZvciBzdG9wLgorCQkJCXJlc2NoZWR1bGUgPSAxOworCQkJfQorCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cyBhbmQgdHJpZ2dlci4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9CisJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwKKwkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJCWN0cmwgJj0KKwkJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKwkJfSBlbHNlIHsJLy8gTm8gZXh0cmEgcmVnaXN0ZXJzLgorLyoKKwkJCQlpZiAoc3RhdHVzICYgc2luZ2xlX21hc2spCisJCQkJey8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZyBidXQgdGhlIHN0YXR1cyBpcyBzZXQgdG8gZW5kLiBGb3JjZSBzdG9wLgorCisJCQkJCS8vIFdhaXQgZm9yIHN0b3AuCisJCQkJCXJlc2NoZWR1bGUgPSAxOworCQkJCX0KKyovCisJCX0KKwkJYnJlYWs7CisKKwkJLy8gU3RyZWFtIG1vZGVzCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0OgorCQlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsJLy8gTm8gRklGTworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZy4gV2FpdGluZyBmb3Igc3RhcnQgZmluaXNoLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fcnVuOworCisJCQkvLyBTaWduYWwgZW5kIG9mIHRoaXMgc3RlcAorCQkJc2lnbmFsaW5nID0gMTsKKwkJfSBlbHNlIHsJLy8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4KKwkJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGKSkgewkvLyBGSUZPIGlzIGVtcHR5LiBQcm9jZWR1cmUgaGFzIHN0YXJ0ZWQgYW5kIGZpbmlzaCBhbHJlYWR5IQorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKworCQkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJCXNpZ25hbGluZyA9IDE7CisJCQkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJCQlyZXNjaGVkdWxlID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIENoZWNrIHRpbWVvdXQuCisJCWlmICgoaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpICYmICgoamlmZmllcyAtIGluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUpID49IGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSkgewkvLyBUaW1lb3V0CisJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cy4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQljdHJsICY9CisJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQkvL1JlbW92ZSBmcm9tIHN5bmNocm9ub3VzIHN0YXJ0LiBCbG9jayB0cmlnZ2VyaW5nIGZyb20gdGhpcyBvdXRwdXQuCisJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJc3luY2ggJj0KKwkJCSAgICB+KChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8CisJCQkgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY2gpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJfQorCQkvLyBXYWl0IGZvciBzdG9wLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCQlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsJLy8gTm8gRklGTworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFRoaXMgaXMgYW4gZXJyb3IuCisJCQkvLyBCUk9LRU4gUElQRSEKKwkJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGKSkgewkvLyBGSUZPIGlzIGVtcHR5LgorCQkJCWlmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIG5vdCBlbXB0eS4KKwkJCQkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSB7CS8vRmluaXNoaW5nIHdvcmsuIFJlcXVlZCBkYXRhIHNob3duLgorCQkJCQkJUERFQlVHCisJCQkJCQkgICAgKCJJU00gc3RvcGVkLiBObyBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBub3QgZW1wdHkuXG4iKTsKKwkJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkJICAgIGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCQl9IGVsc2UgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZC4gTm8gZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgbm90IGVtcHR5LlxuIik7CisJCQkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkJCSAgICBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBlbXB0eS4KKwkJCQkJUERFQlVHCisJCQkJCSAgICAoIklTTSBzdG9wZWQuIE5vIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIGVtcHR5LlxuIik7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCQl9CisJCQl9IGVsc2UgewkvLyBUaGVyZSBhcmUgc3RpbGwgZGF0YXMgaW4gRklGTy4KKwkJCQlpZiAobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBub3QgZW1wdHkuCisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZCBidXQgc29tZSBkYXRhIGluIEZJRk8gYW5kIGJ1ZmZlci5cbiIpOworCQkJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBlbXB0eS4KKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkIGJ1dCBzb21lIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIGVtcHR5LlxuIik7CisJCQkJfQorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I7CisKKwkJCX0KKworCQkJLy8gU2lnbmFsIHRoZSBmYWlsdXJlLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CS8vIE5vIEZJRk8KKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiU3RyZWFtaW5nIG9uIHNpbmdsZSBkZXZpY2UhIFRoaXMgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIVxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLiBXYWl0aW5nIGZvciBzdG9wIGZpbmlzaC4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCXNpZ25hbGluZyA9IDE7CisJCX0KKwkJLy8gU3RhdGUgbWFjaGluZSBpcyB3b3JraW5nLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1JfQ1JJVElDQUwoIlN0YXR1cyBpcyBpbiB3cm9uZyBzdGF0ZSAoJWQpIVxuIiwKKwkJCQlpbnN0YW5jZS0+c3RhdHVzKTsKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQlzaWduYWxpbmcgPSAxOworCQlicmVhazsKKworCX0KKworCWlmIChzaWduYWxpbmcpIHsJLy9TaWduYWwgaXQuCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnICYmIHJlc2NoZWR1bGUpIHsJLy8gUmVzY2hlZHVsZSB0YXNrCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU2MDAwX3dvcmtxdWV1ZSwKKwkJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisJfSBlbHNlIHsKKwkJUElORk8oIjwlcz4gRW5kaW5nIGNvbnRyb2wgdGFzay5cbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwKKwkJCQkJICAgIGludCAqbWluLAorCQkJCQkgICAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSkKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoKCptYXggLSAqbWluKSA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9NSU5fTUFYOworCX0KKworCWlmICgodW5pdCA9PSBNRV9VTklUX1ZPTFQpIHx8ICh1bml0ID09IE1FX1VOSVRfQU5ZKSkgeworCQlpZiAoKCptYXggPD0gKGluc3RhbmNlLT5tYXggKyAxMDAwKSkgJiYgKCptaW4gPj0gaW5zdGFuY2UtPm1pbikpIHsKKwkJCSptaW4gPSBpbnN0YW5jZS0+bWluOworCQkJKm1heCA9IGluc3RhbmNlLT5tYXg7CisJCQkqbWF4ZGF0YSA9IE1FNjAwMF9BT19NQVhfREFUQTsKKwkJCSpyYW5nZSA9IDA7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIk5vIG1hdGNoaW5nIHJhbmdlIGF2YWlsYWJsZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX05PX1JBTkdFOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBoeXNpY2FsIHVuaXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1VOSVQ7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdW5pdCwgaW50ICpjb3VudCkKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJKmNvdW50ID0gMTsKKwl9IGVsc2UgeworCQkqY291bnQgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKHJhbmdlID09IDApIHsKKwkJKnVuaXQgPSBNRV9VTklUX1ZPTFQ7CisJCSptaW4gPSBpbnN0YW5jZS0+bWluOworCQkqbWF4ID0gaW5zdGFuY2UtPm1heDsKKwkJKm1heGRhdGEgPSBNRTYwMDBfQU9fTUFYX0RBVEE7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHJhbmdlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkFOR0U7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy9TdHJlYW1pbmcgZGV2aWNlLgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTYwMDBfQU9fQkFTRV9GUkVRVUVOQ1k7CisJCWlmICh0aW1lciA9PSBNRV9USU1FUl9BQ1FfU1RBUlQpIHsKKwkJCSptaW5fdGlja3MgPSBNRTYwMDBfQU9fTUlOX0FDUV9USUNLUzsKKwkJCSptYXhfdGlja3MgPSBNRTYwMDBfQU9fTUFYX0FDUV9USUNLUzsKKwkJfSBlbHNlIGlmICh0aW1lciA9PSBNRV9USU1FUl9DT05WX1NUQVJUKSB7CisJCQkqbWluX3RpY2tzID0gTUU2MDAwX0FPX01JTl9DSEFOX1RJQ0tTOworCQkJKm1heF90aWNrcyA9IE1FNjAwMF9BT19NQVhfQ0hBTl9USUNLUzsKKwkJfQorCX0gZWxzZSB7CQkvL05vdCBzdHJlYW1pbmcgZGV2aWNlIQorCQkqYmFzZV9mcmVxdWVuY3kgPSAwOworCQkqbWluX3RpY2tzID0gMDsKKwkJKm1heF90aWNrcyA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpudW1iZXIgPSAxOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqdHlwZSA9IE1FX1RZUEVfQU87CisJKnN1YnR5cGUgPQorCSAgICAoaW5zdGFuY2UtPgorCSAgICAgZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgPyBNRV9TVUJUWVBFX1NUUkVBTUlORyA6CisJICAgIE1FX1NVQlRZUEVfU0lOR0xFOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpjYXBzID0KKwkgICAgTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTIHwgKChpbnN0YW5jZS0+ZmlmbykgPyBNRV9DQVBTX0FPX0ZJRk8gOgorCQkJCQkgICBNRV9DQVBTX05PTkUpOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkgYXJndW1lbnQgY291bnQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQX0FSR19DT1VOVDsKKwl9CisKKwlzd2l0Y2ggKGNhcCkgeworCWNhc2UgTUVfQ0FQX0FJX0ZJRk9fU0laRToKKwkJYXJnc1swXSA9IChpbnN0YW5jZS0+ZmlmbykgPyBNRTYwMDBfQU9fRklGT19DT1VOVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkU6CisJCWFyZ3NbMF0gPQorCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpID8gTUU2MDAwX0FPX0NJUkNfQlVGX0NPVU5UIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NBUDsKKwkJYXJnc1swXSA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjI5NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hby5oCkBAIC0wLDAgKzEsMjAwIEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9hby5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTYwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX0FPX0hfCisjZGVmaW5lIF9NRTYwMDBfQU9fSF8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lY2lyY19idWYuaCIKKyNpbmNsdWRlICJtZWlvY3RsLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU2MDAwX0FPX01BWF9TVUJERVZJQ0VTCTE2CisjZGVmaW5lIE1FNjAwMF9BT19GSUZPX0NPVU5UCQk4MTkyCisKKyNkZWZpbmUgTUU2MDAwX0FPX0JBU0VfRlJFUVVFTkNZCTMzMDAwMDAwTAorCisjZGVmaW5lIE1FNjAwMF9BT19NSU5fQUNRX1RJQ0tTCQkwTEwKKyNkZWZpbmUgTUU2MDAwX0FPX01BWF9BQ1FfVElDS1MJCTBMTAorCisjZGVmaW5lIE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUwk2NkxMCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfQ0hBTl9USUNLUwkweEZGRkZGRkZGTEwKKworI2RlZmluZSBNRTYwMDBfQU9fTUlOX1JBTkdFCQkJLTEwMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfUkFOR0UJCQk5OTk5Njk0CisKKyNkZWZpbmUgTUU2MDAwX0FPX01JTl9SQU5HRV9ISUdICTAKKyNkZWZpbmUgTUU2MDAwX0FPX01BWF9SQU5HRV9ISUdICTQ5OTk5MjM3CisKKyNkZWZpbmUgTUU2MDAwX0FPX01BWF9EQVRBCQkJMHhGRkZGCisKKyNpZmRlZiBNRV9TWU5BUFNFCisjIGRlZmluZSBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUiAJCTgJLy8gMl5uIFBBR0VTID0+PiBNYXhpbXVtIHZhbHVlIG9mIDFNQiBmb3IgU3luYXBzZQorI2Vsc2UKKyMgZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSIAkJNQkvLyAyXm4gUEFHRVMgPT4+IDEyOEtCCisjZW5kaWYKKyNkZWZpbmUgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUgCQlQQUdFX1NJWkU8PE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSCS8vIEJ1ZmZlciBzaXplIGluIGJ5dGVzLgorCisjICBpZmRlZiBfQ0JVRkZfMzJiX3QKKyMgICBkZWZpbmUgTUU2MDAwX0FPX0NJUkNfQlVGX0NPVU5UCSgoTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQzMl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyMgIGVsc2UKKyMgICBkZWZpbmUgTUU2MDAwX0FPX0NJUkNfQlVGX0NPVU5UCSgoTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQxNl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBNRTYwMDBfQU9fQ09OVElOT1VTCQkJCQkweDAKKyMgIGRlZmluZSBNRTYwMDBfQU9fV1JBUF9NT0RFCQkJCQkweDEKKyMgIGRlZmluZSBNRTYwMDBfQU9fSFdfTU9ERQkJCQkJCTB4MgorCisjICBkZWZpbmUgTUU2MDAwX0FPX0hXX1dSQVBfTU9ERQkJCQkoTUU2MDAwX0FPX1dSQVBfTU9ERSB8IE1FNjAwMF9BT19IV19NT0RFKQorIyAgZGVmaW5lIE1FNjAwMF9BT19TV19XUkFQX01PREUJCQkJTUU2MDAwX0FPX1dSQVBfTU9ERQorCisjICBkZWZpbmUgTUU2MDAwX0FPX0lORl9TVE9QX01PREUJCQkJMHgwCisjICBkZWZpbmUgTUU2MDAwX0FPX0FDUV9TVE9QX01PREUJCQkJMHgxCisjICBkZWZpbmUgTUU2MDAwX0FPX1NDQU5fU1RPUF9NT0RFCQkJCTB4MgorCisjICBkZWZpbmUgTUU2MDAwX0FPX0VYVFJBX0hBUkRXQVJFCQkJCTB4MQorIyAgZGVmaW5lIE1FNjAwMF9BT19IQVNfRklGTwkJCQkJMHgyCisKK3R5cGVkZWYgZW51bSBNRTYwMDBfQU9fU1RBVFVTIHsKKwlhb19zdGF0dXNfbm9uZSA9IDAsCisJYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkLAorCWFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQsCisJYW9fc3RhdHVzX3NpbmdsZV9ydW4sCisJYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdCwKKwlhb19zdGF0dXNfc2luZ2xlX2VuZCwKKwlhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQsCisJYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCwKKwlhb19zdGF0dXNfc3RyZWFtX3J1biwKKwlhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0LAorCWFvX3N0YXR1c19zdHJlYW1fZW5kLAorCWFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvciwKKwlhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvciwKKwlhb19zdGF0dXNfc3RyZWFtX2Vycm9yLAorCWFvX3N0YXR1c19sYXN0Cit9IE1FNjAwMF9BT19TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IG1lNjAwMF9hb190aW1lb3V0IHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKK30gbWU2MDAwX2FvX3RpbWVvdXRfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTYwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lNjAwMF9hb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCXVuc2lnbmVkIGludCBhb19pZHg7CisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqcHJlbG9hZF9yZWdfbG9jazsJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHByZWxvYWRfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1aW50MzJfdCAqcHJlbG9hZF9mbGFnczsKKwl1aW50MzJfdCAqdHJpZ2dlcmluZ19mbGFnczsKKworCS8qIEhhcmR3YXJlIGZlYXV0cmVzICovCisJdW5zaWduZWQgaW50IGlycTsJCQkJCQkvKio8IFRoZSBpbnRlcnJ1cHQgcmVxdWVzdCBudW1iZXIgYXNzaWduZWQgYnkgdGhlIFBDSSBCSU9TLiAqLworCWludCBmaWZvOwkJCQkJCQkJLyoqPCBJZiBzZXQgdGhpcyBkZXZpY2UgaGFzIGEgRklGTy4gKi8KKworCS8vUmFuZ2UKKwlpbnQgbWluOworCWludCBtYXg7CisKKwlpbnQgc2luZ2xlX3ZhbHVlOwkJCQkJCS8qKjwgTWlycm9yIG9mIHRoZSBvdXRwdXQgdmFsdWUgaW4gc2luZ2xlIG1vZGUuICovCisJaW50IHNpbmdsZV92YWx1ZV9pbl9maWZvOwkJCQkvKio8IE1pcnJvciBvZiB0aGUgdmFsdWUgd3JpdHRlbiBpbiBzaW5nbGUgbW9kZS4gKi8KKwl1aW50MzJfdCBjdHJsX3RyZzsJCQkJCQkvKio8IE1pcnJvciBvZiB0aGUgdHJpZ2dlciBzZXR0aW5ncy4gKi8KKworCXZvbGF0aWxlIGludCBtb2RlOwkJCQkJCS8qKjwgRmxhZ3MgdXNlZCBmb3Igc3RvcmluZyBTVyB3cmFwYXJvdW5kIHNldHVwKi8KKwlpbnQgc3RvcF9tb2RlOwkJCQkJCQkvKio8IFRoZSB1c2VyIGRlZmluZWQgc3RvcCBjb25kaXRpb24gZmxhZy4gKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnRfbW9kZTsKKwl1bnNpZ25lZCBpbnQgc3RvcF9jb3VudDsJCQkJLyoqPCBUaGUgdXNlciBkZWZpbmVkIGRhdGVzIHByZXNlbnRhdGlvbiBlbmQgY291bnQuICovCisJdW5zaWduZWQgaW50IHN0b3BfZGF0YV9jb3VudDsJCQkvKio8IFRoZSBzdG9wIHByZXNlbnRhdGlvbiBjb3VudC4gKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9jb3VudDsJCQkJLyoqPCBUaGUgcmVhbCBwcmVzZW50YXRpb24gY291bnQuICovCisJdW5zaWduZWQgaW50IHByZWxvYWRlZF9jb3VudDsJCQkvKio8IFRoZSBuZXh0IGRhdGEgYWRkcmVzIGluIGJ1ZmZlci4gPD0gZm9yIHdyYXBhcm91bmQgbW9kZS4gKi8KKwlpbnQgaGFyZHdhcmVfc3RvcF9kZWxheTsJCQkJLyoqPCBUaGUgdGltZSB0aGF0IHN0b3AgY2FuIHRha2UuIFRoaXMgaXMgb25seSB0byBub3Qgc2hvdyBoYXJkd2FyZSBidWcgdG8gdXNlci4gKi8KKworCXZvbGF0aWxlIGVudW0gTUU2MDAwX0FPX1NUQVRVUyBzdGF0dXM7CS8qKjwgVGhlIGN1cnJlbnQgc3RyZWFtIHN0YXR1cyBmbGFnLiAqLworCW1lNjAwMF9hb190aW1lb3V0X3QgdGltZW91dDsJCQkvKio8IFRoZSB0aW1lb3V0IGZvciBzdGFydCBpbiBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIG1vZGUuICovCisKKwkJCQkJCQkJCS8qIFJlZ2lzdGVycyAqLy8qKjwgQWxsIHJlZ2lzdGVycyBhcmUgMzIgYml0cyBsb25nLiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgZmlmb19yZWc7CisJdW5zaWduZWQgbG9uZyBzaW5nbGVfcmVnOworCXVuc2lnbmVkIGxvbmcgdGltZXJfcmVnOworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBwcmVsb2FkX3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9yZXNldF9yZWc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBTb2Z0d2FyZSBidWZmZXIgKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkJLyoqPCBDaXJjdWxhciBidWZmZXIgaG9sZGluZyBtZWFzdXJtZW50IGRhdGEuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsJCQkvKio8IFdhaXQgcXVldWUgdG8gcHV0IG9uIHRhc2tzIHdhaXRpbmcgZm9yIGRhdGEgdG8gYXJyaXZlLiAqLworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1lNjAwMF93b3JrcXVldWU7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCXN0cnVjdCB3b3JrX3N0cnVjdCBhb19jb250cm9sX3Rhc2s7CisjZWxzZQorCXN0cnVjdCBkZWxheWVkX3dvcmsgYW9fY29udHJvbF90YXNrOworI2VuZGlmCisKKwl2b2xhdGlsZSBpbnQgYW9fY29udHJvbF90YXNrX2ZsYWc7CQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KKworfSBtZTYwMDBfYW9fc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTYwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKiBAcGFyYW0gcHJlbG9hZF9mbGFncyBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBob2xkJnRyaWdnZXIgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKyAqIEBwYXJhbSBhb19pZHggU3ViZGV2aWNlIG51bWJlci4KKyAqIEBwYXJhbSBmaWZvIEZsYWcgc2V0IGlmIHN1YmRldmljZSBoYXMgaGFyZHdhcmUgRklGTy4KKyAqIEBwYXJhbSBpcnEgSVJRIG51bWJlci4KKyAqIEBwYXJhbSBoaWdoX3JhbmdlIEZsYWcgc2V0IGlmIHN1YmRldmljZSBoYXMgaGlnaCBjdXJyZW4gb3V0cHV0LgorICogQHBhcmFtIG1lNjAwMF93cSBRdWV1ZSBmb3IgYXN5bmNocm9ub3VzIHRhc2sgKDEgcXVldWUgZm9yIGFsbCBzdWJkZXZpY2Ugb24gMSBib2FyZCkuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTYwMDBfYW9fc3ViZGV2aWNlX3QgKm1lNjAwMF9hb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICBzcGlubG9ja190ICogcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJICAgICB1aW50MzJfdCAqIHByZWxvYWRfZmxhZ3MsCisJCQkJCSAgICAgdWludDMyX3QgKiB0cmlnZ2VyaW5nX2ZsYWdzLAorCQkJCQkgICAgIGludCBhb19pZHgsCisJCQkJCSAgICAgaW50IGZpZm8sCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBpbnQgaGlnaF9yYW5nZSwKKwkJCQkJICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAorCQkJCQkgICAgICptZTYwMDBfd3EpOworCisjZW5kaWYgLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUU2MDAwX0FPX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjhmNDZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hb19yZWcuaApAQCAtMCwwICsxLDE3NyBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfYW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTYwMDBfQU9fUkVHX0hfCisjZGVmaW5lIF9NRTYwMDBfQU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8vIEFPCisjZGVmaW5lIE1FNjAwMF9BT18wMF9DVFJMX1JFRwkJCQkJMHgwMAkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAwX1NUQVRVU19SRUcJCQkJCTB4MDQJLy8gUi9fCisjZGVmaW5lIE1FNjAwMF9BT18wMF9GSUZPX1JFRwkJCQkJMHgwOAkvLyBfL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAwX1NJTkdMRV9SRUcJCQkJCTB4MEMJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wMF9USU1FUl9SRUcJCQkJCTB4MTAJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzAxX0NUUkxfUkVHCQkJCQkweDE4CS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDFfU1RBVFVTX1JFRwkJCQkJMHgxQwkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAxX0ZJRk9fUkVHCQkJCQkweDIwCS8vIF8vVworI2RlZmluZSBNRTYwMDBfQU9fMDFfU0lOR0xFX1JFRwkJCQkJMHgyNAkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAxX1RJTUVSX1JFRwkJCQkJMHgyOAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDJfQ1RSTF9SRUcJCQkJCTB4MzAJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wMl9TVEFUVVNfUkVHCQkJCQkweDM0CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDJfRklGT19SRUcJCQkJCTB4MzgJLy8gXy9XCisjZGVmaW5lIE1FNjAwMF9BT18wMl9TSU5HTEVfUkVHCQkJCQkweDNDCS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDJfVElNRVJfUkVHCQkJCQkweDQwCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wM19DVFJMX1JFRwkJCQkJMHg0OAkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAzX1NUQVRVU19SRUcJCQkJCTB4NEMJLy8gUi9fCisjZGVmaW5lIE1FNjAwMF9BT18wM19GSUZPX1JFRwkJCQkJMHg1MAkvLyBfL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAzX1NJTkdMRV9SRUcJCQkJCTB4NTQJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wM19USU1FUl9SRUcJCQkJCTB4NTgJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCQkJCTB4QTQJLy8gUi9fCisjZGVmaW5lIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX09GRlNFVAkJCTQJLy9UaGUgZmlyc3Qgc2luZ2xlIHN1YmRldmljZSA9PiBiaXQgMCBpbiBNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcuCisKKyNkZWZpbmUgTUU2MDAwX0FPXzA0X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMDRfU0lOR0xFX1JFRwkJCQkJMHg3NAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDVfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18wNV9TSU5HTEVfUkVHCQkJCQkweDc4CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wNl9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzA2X1NJTkdMRV9SRUcJCQkJCTB4N0MJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzA3X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMDdfU0lOR0xFX1JFRwkJCQkJMHg4MAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDhfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18wOF9TSU5HTEVfUkVHCQkJCQkweDg0CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wOV9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzA5X1NJTkdMRV9SRUcJCQkJCTB4ODgJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzEwX1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMTBfU0lOR0xFX1JFRwkJCQkJMHg4QwkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMTFfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18xMV9TSU5HTEVfUkVHCQkJCQkweDkwCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18xMl9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzEyX1NJTkdMRV9SRUcJCQkJCTB4OTQJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzEzX1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMTNfU0lOR0xFX1JFRwkJCQkJMHg5OAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMTRfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18xNF9TSU5HTEVfUkVHCQkJCQkweDlDCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18xNV9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzE1X1NJTkdMRV9SRUcJCQkJCTB4QTAJLy8gXy9XCisKKy8vTUU2MDAwX0FPX0NUUkxfUkVHCisjZGVmaW5lIE1FNjAwMF9BT19NT0RFX1NJTkdMRQkJCQkJMHgwMAorI2RlZmluZSBNRTYwMDBfQU9fTU9ERV9XUkFQQVJPVU5ECQkJCTB4MDEKKyNkZWZpbmUgTUU2MDAwX0FPX01PREVfQ09OVElOVU9VUwkJCQkweDAyCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX01PREVfTUFTSwkJCQkoTUU2MDAwX0FPX01PREVfV1JBUEFST1VORCB8IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVMpCisKKyNkZWZpbmUgTUU2MDAwX0FPX0NUUkxfQklUX01PREVfV1JBUEFST1VORAkJMHgwMDEKKyNkZWZpbmUgTUU2MDAwX0FPX0NUUkxfQklUX01PREVfQ09OVElOVU9VUwkJMHgwMDIKKyNkZWZpbmUgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AJCQkJCTB4MDA0CisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTwkJCTB4MDA4CisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRwkJMHgwMTAKKyNkZWZpbmUgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRQkJCTB4MDIwCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRCQkJMHgwNDAKKyNkZWZpbmUgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCQkweDA4MAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEggCTB4ODAwCisKKy8vTUU2MDAwX0FPX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNCQkJCTB4MDEKKyNkZWZpbmUgTUU2MDAwX0FPX1NUQVRVU19CSVRfRkYJCQkJCTB4MDIKKyNkZWZpbmUgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYJCQkJCTB4MDQKKyNkZWZpbmUgTUU2MDAwX0FPX1NUQVRVU19CSVRfRUYJCQkJCTB4MDgKKworI2RlZmluZSBNRTYwMDBfQU9fUFJFTE9BRF9SRUcJCQkJCTB4QTgJLy8gUi9XICAgIC8vL01FNjAwMF9BT19TWU5DX1JFRyA8PT0+IE1FNjAwMF9BT19QUkVMT0FEX1JFRworLyoKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8wCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzIJCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8zCQkJCQkweDAwMDAwMDA4CisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfNAkJCQkJMHgwMDAwMDAxMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzUJCQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF82CQkJCQkweDAwMDAwMDQwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfNwkJCQkJMHgwMDAwMDA4MAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzgJCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF85CQkJCQkweDAwMDAwMjAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMTAJCQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8xMQkJCQkJMHgwMDAwMDgwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEyCQkJCQkweDAwMDAxMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMTMJCQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8xNAkJCQkJMHgwMDAwNDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzE1CQkJCQkweDAwMDA4MDAwCisqLworI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xECQkJCQkJMHgwMDAwMDAwMQorLyoKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMAkJCQkweDAwMDEwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzEJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18yCQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMwkJCQkweDAwMDgwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzQJCQkJMHgwMDEwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR181CQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfNgkJCQkweDAwNDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzcJCQkJMHgwMDgwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR184CQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfOQkJCQkweDAyMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzEwCQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMTEJCQkJMHgwODAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xMgkJCQkweDEwMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzEzCQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMTQJCQkJMHg0MDAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xNQkJCQkweDgwMDAwMDAwCisqLworI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRwkJCQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIE1FNjAwMF9BT19FWFRfVFJJRwkJCQkJCTB4ODAwMDAwMDAKKworLy8gQU8tSVJRCisjZGVmaW5lIE1FNjAwMF9BT19JUlFfU1RBVFVTX1JFRwkJCQkweDYwCS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDBfSVJRX1JFU0VUX1JFRwkJCQkweDY0CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDFfSVJRX1JFU0VUX1JFRwkJCQkweDY4CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDJfSVJRX1JFU0VUX1JFRwkJCQkweDZDCS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDNfSVJRX1JFU0VUX1JFRwkJCQkweDcwCS8vIFIvXworCisjZGVmaW5lIE1FNjAwMF9JUlFfU1RBVFVTX0JJVF8wCQkJCQkweDAxCisjZGVmaW5lIE1FNjAwMF9JUlFfU1RBVFVTX0JJVF8xCQkJCQkweDAyCisjZGVmaW5lIE1FNjAwMF9JUlFfU1RBVFVTX0JJVF8yCQkJCQkweDA0CisjZGVmaW5lIE1FNjAwMF9JUlFfU1RBVFVTX0JJVF8zCQkJCQkweDA4CisKKyNkZWZpbmUgTUU2MDAwX0lSUV9TVEFUVVNfQklUX0FPX0hGCQkJCU1FNjAwMF9JUlFfU1RBVFVTX0JJVF8wCisKKy8vRFVNWSByZWdpc3RlcgorI2RlZmluZSBNRTYwMDBfQU9fRFVNWQkJCQkJCQkJCTB4RkMKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWU0YzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgRGV2aWNlIGNsYXNzIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVmaXJtd2FyZS5oIgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTYwMDBfcmVnLmgiCisjaW5jbHVkZSAibWU2MDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9kaW8uaCIKKyNpbmNsdWRlICJtZTYwMDBfYW8uaCIKKworLyoqCisgKiBAYnJpZWYgR2xvYmFsIHZhcmlhYmxlLgorICogVGhpcyBpcyB3b3JraW5nIHF1ZXVlIGZvciBydW5pbmcgYSBzZXBhcmF0ZSBhdGFzayB0aGF0IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHdvcmsgc3RhdHVzIChzdGFydCwgc3RvcCwgdGltZW91dHMpLgorICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1lNjAwMF93b3JrcXVldWU7CisKK21lX2RldmljZV90ICptZTYwMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCW1lNjAwMF9kZXZpY2VfdCAqbWU2MDAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwlpbnQgZXJyOworCWludCBpOworCWludCBoaWdoX3JhbmdlID0gMDsKKwlpbnQgZmlmbzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lNjAwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTYwMDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWU2MDAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lNjAwMF9kZXZpY2UsIDAsIHNpemVvZihtZTYwMDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTYwMDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogRG93bmxvYWQgdGhlIHhpbGlueCBmaXJtd2FyZSAqLworCWVyciA9IG1lX3hpbGlueF9kb3dubG9hZChtZTYwMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1sxXSwKKwkJCQkgbWU2MDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0sCisJCQkJICZwY2lfZGV2aWNlLT5kZXYsICJtZTYwMDAuYmluIik7CisKKwlpZiAoZXJyKSB7CisJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2UpOworCQlrZnJlZShtZTYwMDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW4ndCBkb3dubG9hZCBmaXJtd2FyZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1lNjAwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgZGV2aWNlX2lkKTsKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2NrIC4KKwlzcGluX2xvY2tfaW5pdCgmbWU2MDAwX2RldmljZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lNjAwMF9kZXZpY2UtPmRpb19jdHJsX3JlZ19sb2NrKTsKKworCS8qIENyZWF0ZSBkaWdpdGFsIGlucHV0L291dHB1dCBpbnN0YW5jZXMuICovCisJZm9yIChpID0gMDsgaSA8IG1lNjAwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lNjAwMF9kaW9fY29uc3RydWN0b3IobWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICByZWdfYmFzZXNbM10sIGksCisJCQkJCQkJICAgICAgJm1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGRpb19jdHJsX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU2MDAwX2RldmljZSk7CisJCQlrZnJlZShtZTYwMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNjAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8qIENyZWF0ZSBhbmFsb2cgb3V0cHV0IGluc3RhbmNlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWU2MDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5hb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJaGlnaF9yYW5nZSA9ICgoaSA9PSA4KQorCQkJICAgICAgJiYKKwkJCSAgICAgICgobWU2MDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkJCQlQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OSkKKwkJCSAgICAgICB8fCAobWU2MDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkJCQkgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjI1OSkKKwkJCSAgICAgICkKKwkJICAgICk/IDEgOiAwOworCisJCWZpZm8gPQorCQkgICAgKGkgPAorCQkgICAgIG1lNjAwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uCisJCSAgICAgYW9fZmlmbykgPyBNRTYwMDBfQU9fSEFTX0ZJRk8gOiAweDA7CisJCWZpZm8gfD0gKGkgPCA0KSA/IE1FNjAwMF9BT19FWFRSQV9IQVJEV0FSRSA6IDB4MDsKKworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lNjAwMF9hb19jb25zdHJ1Y3RvcihtZTYwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICAmbWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkJCSAgICAgJm1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgcHJlbG9hZF9mbGFncywKKwkJCQkJCQkgICAgICZtZTYwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHRyaWdnZXJpbmdfZmxhZ3MsCisJCQkJCQkJICAgICBpLCBmaWZvLAorCQkJCQkJCSAgICAgbWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgIGhpZ2hfcmFuZ2UsCisJCQkJCQkJICAgICBtZTYwMDBfd29ya3F1ZXVlKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU2MDAwX2RldmljZSk7CisJCQlrZnJlZShtZTYwMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNjAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWU2MDAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lNjAwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJbWU2MDAwX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJtZTYwMDAiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lNjAwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZmx1c2hfd29ya3F1ZXVlKG1lNjAwMF93b3JrcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKG1lNjAwMF93b3JrcXVldWUpOworfQorCittb2R1bGVfaW5pdChtZTYwMDBfaW5pdCk7Cittb2R1bGVfZXhpdChtZTYwMDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUgorICAgICgiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4gJiBLcnp5c3p0b2YgR2FudHprZSA8ay5nYW50emtlQG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgTUUtNjAwMCBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBNRS02MDAwIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWU2MDAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGNjN2QxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTYwMDAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNjAwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUU2MDAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNjAwMCBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fZmlmbzsJLy9Ib3cgbWFueSBkZXZpY2VzIGhhdmUgRklGTworfSBtZTYwMDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBNRS02MDAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTYwMDBfdmVyc2lvbl90IG1lNjAwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMEYsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMUYsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0YsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMEYsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMUYsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0YsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNEYsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNUYsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0YsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNEYsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNUYsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0YsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjI1OSwgMiwgOSwgMH0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTksIDIsIDksIDR9LAorCisJezB9LAorfTsKKworI2RlZmluZSBNRTYwMDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWU2MDAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTYwMDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lNjAwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWU2MDAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lNjAwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWU2MDAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTYwMDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTYwMDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtNjAwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IHByZWxvYWRfcmVnX2xvY2s7CQkvKio8IEd1YXJkcyB0aGUgcHJlbG9hZCByZWdpc3Rlci4gKi8KKwl1aW50MzJfdCBwcmVsb2FkX2ZsYWdzOworCXVpbnQzMl90IHRyaWdnZXJpbmdfZmxhZ3M7CisKKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworfSBtZTYwMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MDAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNjAwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTYwMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2YxMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uYwpAQCAtMCwwICsxLDQxNSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9kaW8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTYwMDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTYwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfigweDMgPDwgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSIHNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCQltb2RlIHw9CisJCQkJICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGRpb19pZHggKiAyKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRiKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPQorCQkJCSAgICBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4MDBGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90IGJ5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUiBzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlieXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweDAwRkY7CisKKwkJCQlpZiAodmFsdWUpCisJCQkJCWJ5dGUgfD0gMHgxIDw8IGNoYW5uZWw7CisJCQkJZWxzZQorCQkJCQlieXRlICY9IH4oMHgxIDw8IGNoYW5uZWwpOworCisJCQkJb3V0YihieXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgICBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmIChtb2RlID09CisJCQkgICAgKE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqbWU2MDAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNjAwMF9kaW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2Rpb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBTZXQgdGhlIHN1YmRldmljZSBwb3J0cyAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9ESU9fQ1RSTF9SRUc7CisJc3dpdGNoIChkaW9faWR4KSB7CisJY2FzZSAwOgorCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfRElPX1BPUlRfMF9SRUc7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0RJT19QT1JUXzFfUkVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSBkaWdpdGFsIGkvbyBpbmRleCAqLworCXN1YmRldmljZS0+ZGlvX2lkeCA9IGRpb19pZHg7CisKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU2MDAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU2MDAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTYwMDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU2MDAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTYwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU2MDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU2MDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThiZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS02MDAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTYwMDBfRElPX0hfCisjZGVmaW5lIF9NRTYwMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU2MDAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTYwMDBfZGlvX3N1YmRldmljZV90ICptZTYwMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2E3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpb19yZWcuaApAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9kaW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FNjAwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU2MDAwX0RJT19DVFJMX1JFRwkJCQkweDAwCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfMF9SRUcJCQkweDAxCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfMV9SRUcJCQkweDAyCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfUkVHCQkJCU1FNjAwMF9ESU9fUE9SVF8wX1JFRwkvLyBSL1cKKworI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMAkJMHgwMQorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMQkJMHgwMgorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMgkJMHgwNAorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMwkJMHgwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1MjczMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfcmVnLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX1JFR19IXworI2RlZmluZSBfTUU2MDAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNjAwMF9JTklUX1hJTElOWF9SRUcJCTB4QUMJLy8gUi8tCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmI3OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtODEwMCBkZXZpY2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGkuaCIKKyNpbmNsdWRlICJtZTgxMDBfZG8uaCIKKyNpbmNsdWRlICJtZTgyNTQuaCIKKworbWVfZGV2aWNlX3QgKm1lODEwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWU4MTAwX2RldmljZV90ICptZTgxMDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTgxMDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MTAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lODEwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTgxMDBfZGV2aWNlLCAwLCBzaXplb2YobWU4MTAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lODEwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWU4MTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWU4MTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTgxMDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lODEwMF9kZXZpY2UtPmN0cl9jdHJsX3JlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU4MTAwX2RldmljZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTgxMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODEwMF9kaV9jb25zdHJ1Y3RvcihtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICBtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMV0sIGksCisJCQkJCQkJICAgICBtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxLAorCQkJCQkJCSAgICAgJm1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgZGlvX2N0cmxfcmVnX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTgxMDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lODEwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU4MTAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lODEwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZG9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU4MTAwX2RvX2NvbnN0cnVjdG9yKG1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICZtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19jdHJsX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSk7CisJCQlrZnJlZShtZTgxMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODEwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTgxMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmN0cl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyNTRfY29uc3RydWN0b3IobWU4MTAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQkgIGluZm8ucGNpLmRldmljZV9pZCwKKwkJCQkJCQkgIG1lODEwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJICBpbmZvLnBjaS5yZWdfYmFzZXNbMl0sCisJCQkJCQkJICAwLCBpLAorCQkJCQkJCSAgJm1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgY3RyX2N0cmxfcmVnX2xvY2ssCisJCQkJCQkJICAmbWU4MTAwX2RldmljZS0+CisJCQkJCQkJICBjbGtfc3JjX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSk7CisJCQlrZnJlZShtZTgxMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODEwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lODEwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lODEwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWU4MTAwX2luaXQpOworCittb2R1bGVfZXhpdChtZTgxMDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUigiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIFRlbXBsYXRlIERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIFRlbXBsYXRlIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWU4MTAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM0MmVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuaApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTgxMDBfREVWSUNFX0gKKyNkZWZpbmUgX01FODEwMF9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSBob2xkaW5nIE1FLTgxMDAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MTAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgZGlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZG9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgY3RyX3N1YmRldmljZXM7Cit9IG1lODEwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTgxMDBfdmVyc2lvbl90IG1lODEwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BLCAxLCAxLCAzfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQiwgMiwgMiwgM30sCisJezB9LAorfTsKKworI2RlZmluZSBNRTgxMDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWU4MTAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTgxMDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lODEwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWU4MTAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lODEwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWU4MTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTgxMDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTgxMDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtODEwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgxMDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworCXNwaW5sb2NrX3QgY3RyX2N0cmxfcmVnX2xvY2s7CisJc3BpbmxvY2tfdCBjbGtfc3JjX3JlZ19sb2NrOworfSBtZTgxMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS04MTAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtODEwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTgxMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxNDYzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZGkuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGkuYworICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTgxMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MTAwX2RpX3JlZy5oIgorI2luY2x1ZGUgIm1lODEwMF9kaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIHNob3J0IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgJj0gfihNRTgxMDBfRElPX0NUUkxfQklUX0lOVEJfMSB8IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wKTsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dHcoMCwgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwlQREVCVUdfUkVHKCJtYXNrX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5tYXNrX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0dygwLCBpbnN0YW5jZS0+cGF0dGVybl9yZWcpOworCVBERUJVR19SRUcoInBhdHRlcm5fcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBhdHRlcm5fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+aXJxX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCW91dGwoUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOIHwKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOIHwKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9QT0wgfAorCSAgICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOLCBpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCVBERUJVR19SRUcoInBseDppcnFfc3RhdHVzX3JlZyBvdXRsKDB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcsCisJCSAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTiB8IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCQkgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfCBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MIHwKKwkJICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19pcnFfc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCBpcnFfc291cmNlLAorCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDE2X3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19QQVRURVJOKSB7CisJCWlmIChmbGFncyAmCisJCSAgICB+KE1FX0lPX0lSUV9TVEFSVF9QQVRURVJOX0ZJTFRFUklORyB8CisJCSAgICAgIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfTk9UX1VTRUQpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9FREdFOworCQl9CisJfSBlbHNlIGlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX01BU0spIHsKKwkJaWYgKGZsYWdzICYKKwkJICAgIH4oTUVfSU9fSVJRX1NUQVJUX0VYVEVOREVEX1NUQVRVUyB8CisJCSAgICAgIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCQlQRVJST1IoIkludmFsaWQgaXJxIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfRURHRTsKKwkJfQorCisJCWlmICghKGlycV9hcmcgJiAweEZGRkYpKSB7CisJCQlQRVJST1IoIk5vIG1hc2sgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfQVJHOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGlycSBzb3VyY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19QQVRURVJOKSB7CisJCW91dHcoaXJxX2FyZywgaW5zdGFuY2UtPnBhdHRlcm5fcmVnKTsKKwkJaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPSBpcnFfYXJnOworCQlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPQorCQkgICAgKGZsYWdzICYgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HKSA/IDEgOiAwOworCX0KKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCW91dHcoaXJxX2FyZywgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwl9CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbncoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJY3RybCAmPSB+TUU4MTAwX0RJT19DVFJMX0JJVF9JTlRCXzE7CisJfQorCisJaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQljdHJsIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xOworCX0KKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBpbncoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlpbnN0YW5jZS0+c3RhdHVzX2ZsYWcgPSBmbGFncyAmIE1FX0lPX0lSUV9TVEFSVF9FWFRFTkRFRF9TVEFUVVM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19pcnFfd2FpdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICppcnFfY291bnQsCisJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlpbnQgY291bnQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJUERFVkVMT1AoIlBJRDogJWQuXG4iLCBjdXJyZW50LT5waWQpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUyB8IE1FX0lPX0lSUV9XQUlUX0VYVEVOREVEX1NUQVRVUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA8PSAwKSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJCWNvdW50ID0gaW5zdGFuY2UtPmlycV9jb3VudDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKChjb3VudCAhPQorCQkJCQkJCSAgICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICAgIGlycV9jb3VudCkKKwkJCQkJCQkgICAgICB8fCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgIHJpc2VkIDwgMCkpLAorCQkJCQkJCSAgICAgdCk7CisvLyAgICAgICAgICAgICAgICAgICAgICB0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsIChpbnN0YW5jZS0+cmlzZWQgIT0gMCksIHQpOworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGNvdW50ICE9IGluc3RhbmNlLT5pcnFfY291bnQpCisJCQkJCQkgIHx8IChpbnN0YW5jZS0+cmlzZWQgPCAwKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5pcnFfY291bnQ7CisJaWYgKCFlcnIpIHsKKwkJaWYgKGZsYWdzICYgTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUykgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZTsKKwkJfSBlbHNlIGlmIChmbGFncyAmIE1FX0lPX0lSUV9XQUlUX0VYVEVOREVEX1NUQVRVUykgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlczsKKwkJfSBlbHNlIHsJLy8gVXNlIGRlZmF1bHQKKwkJCWlmICghaW5zdGFuY2UtPnN0YXR1c19mbGFnKSB7CisJCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlczsKKwkJCX0KKwkJfQorCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworLyoKKwkJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSAwOworCQkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisqLworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZGlfaW9faXJxX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQxNl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgJj0gfihNRTgxMDBfRElPX0NUUkxfQklUX0lOVEJfMSB8IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wKTsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKwlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIkludmFsaWQgcG9ydCBjb25maWd1cmF0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbncoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxKSB7CisJCQkqdmFsdWUgPSAoaW53KGluc3RhbmNlLT5wb3J0X3JlZykgPj4gOCkgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE2OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fQklUX1BBVFRFUk5fSVJRIHwgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZTgxMDBfZGlfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCAodm9pZCAqKWluc3RhbmNlKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODEwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgxMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IGljc3I7CisKKwl1aW50MTZfdCBpcnFfc3RhdHVzOworCXVpbnQxNl90IGxpbmVfdmFsdWUgPSAwOworCisJdWludDMyX3Qgc3RhdHVzX3ZhbCA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWljc3IgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoaW5zdGFuY2UtPmRpX2lkeCA9PSAwKSB7CisKKwkJaWYgKChpY3NyICYKKwkJICAgICAoUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOIHwKKwkJICAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOKSkgIT0KKwkJICAgIChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4gfAorCQkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTikpIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PTAgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJCSAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBpY3NyKTsKKwkJCXJldHVybiBJUlFfTk9ORTsKKwkJfQorCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmRpX2lkeCA9PSAxKSB7CisJCWlmICgoaWNzciAmCisJCSAgICAgKFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURSB8IFBMWF9JTlRDU1JfUENJX0lOVF9FTiB8CisJCSAgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTikpICE9CisJCSAgICAoUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOIHwKKwkJICAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4pKSB7CisJCQlQSU5GTworCQkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlkeD0xIHBseDppcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCisJCQkgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaWNzcik7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIiVzKCk6V3JvbmcgaW50ZXJydXB0IGlkeD0lZCBjc3I9MHglWC5cbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIGluc3RhbmNlLT5kaV9pZHgsIGljc3IpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJtZTgxMDBfaXNyKCk6SW50ZXJydXB0IGZyb20gaWR4PSVkIG9jY3VyZWQuXG4iLAorCSAgICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW53KGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKwlsaW5lX3ZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZyk7CisKKwlpcnFfc3RhdHVzID0gaW5zdGFuY2UtPmxpbmVfdmFsdWUgXiBsaW5lX3ZhbHVlOworCisJLy8gTWFrZSBleHRlbmRlZCBpbmZvcm1hdGlvbi4KKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAofih1aW50MTZfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgJiBsaW5lX3ZhbHVlKSkgPDwgMTY7CS8vUmFpc2UKKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAoKHVpbnQxNl90KSBpbnN0YW5jZS0+bGluZV92YWx1ZSAmIH5saW5lX3ZhbHVlKSk7CS8vRmFsbAorCisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBsaW5lX3ZhbHVlOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA9PSAwKSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSBpcnFfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gc3RhdHVzX3ZhbDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlIHw9IGlycV9zdGF0dXM7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWVfZWRnZXMgfD0gc3RhdHVzX3ZhbDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnKSB7CS8vIEZvciBjb21wYXJlIG1vZGUgb25seS4KKwkJaWYgKGluc3RhbmNlLT5jb21wYXJlX3ZhbHVlID09IGluc3RhbmNlLT5saW5lX3ZhbHVlKSB7CisJCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQkJaW5zdGFuY2UtPmlycV9jb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPmlycV9jb3VudCsrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU4MTAwX2RpX3N1YmRldmljZV90ICptZTgxMDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWU4MTAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVpbnQzMl90IHBseF9yZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4LAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MTAwX2RpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODEwMF9kaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleC4gKi8KKwlzdWJkZXZpY2UtPmRpX2lkeCA9IGRpX2lkeDsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCWVyciA9IHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTgxMDBfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUU4MTAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXJzICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9CisJICAgIG1lODEwMF9yZWdfYmFzZSArIE1FODEwMF9DVFJMX1JFR19BICsgZGlfaWR4ICogTUU4MTAwX1JFR19PRkZTRVQ7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJICAgIG1lODEwMF9yZWdfYmFzZSArIE1FODEwMF9ESV9SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+bWFza19yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfTUFTS19SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+cGF0dGVybl9yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfUEFUVEVSTl9SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+ZGluX2ludF9yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfSU5UX0RJX1JFR19BICsgZGlfaWR4ICogTUU4MTAwX1JFR19PRkZTRVQ7CisJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0KKwkgICAgbWU4MTAwX3JlZ19iYXNlICsgTUU4MTAwX1JFU19JTlRfUkVHX0EgKyBkaV9pZHggKiBNRTgxMDBfUkVHX09GRlNFVDsKKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcGx4X3JlZ19iYXNlICsgUExYX0lOVENTUjsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSBtZTgxMDBfcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lODEwMF9kaV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lODEwMF9kaV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWU4MTAwX2RpX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MTAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgxMDBfZGlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MTAwX2RpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU4MTAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU4MTAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTgxMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU4MTAwX2RpX2Rlc3RydWN0b3I7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPmlycV9jb3VudCA9IDA7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZGI3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGkuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ESV9IXworI2RlZmluZSBfTUU4MTAwX0RJX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgxMDBfZGlfc3ViZGV2aWNlIHsKKwkvLyBJbmhlcml0YW5jZQorCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CisKKwl1bnNpZ25lZCBkaV9pZHg7CisKKwlpbnQgaXJxOworCXZvbGF0aWxlIGludCByaXNlZDsKKwl1bnNpZ25lZCBpbnQgaXJxX2NvdW50OworCisJdWludCBzdGF0dXNfZmxhZzsJCQkJLyoqPCBEZWZhdWx0IGludGVydXB0IHN0YXR1cyBmbGFnICovCisJdWludCBzdGF0dXNfdmFsdWU7CQkJCS8qKjwgSW50ZXJ1cHQgc3RhdHVzICovCisJdWludCBzdGF0dXNfdmFsdWVfZWRnZXM7CQkvKio8IEV4dGVuZGVkIGludGVydXB0IHN0YXR1cyAqLworCXVpbnQgbGluZV92YWx1ZTsKKworCXVpbnQxNl90IGNvbXBhcmVfdmFsdWU7CisJdWludDhfdCBmaWx0ZXJpbmdfZmxhZzsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CisJdW5zaWduZWQgbG9uZyBtYXNrX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBhdHRlcm5fcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkaW5faW50X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9yZXNldF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKKworfSBtZTgxMDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTgxMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgxMDBfZGlfc3ViZGV2aWNlX3QgKm1lODEwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTgxMDBfcmVnX2Jhc2UsCisJCQkJCSAgICAgdWludDMyX3QgcGx4X3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9sZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNiZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaV9yZWcuaApAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9kaV9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ESV9SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9ESV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfUkVTX0lOVF9SRUdfQQkJMHgwMgkvLyhyLCApCisjZGVmaW5lIE1FODEwMF9ESV9SRUdfQQkJCTB4MDQJLy8ociwgKQorI2RlZmluZSBNRTgxMDBfUEFUVEVSTl9SRUdfQQkJMHgwOAkvLyggLHcpCisjZGVmaW5lIE1FODEwMF9NQVNLX1JFR19BCQkweDBBCS8vKCAsdykKKyNkZWZpbmUgTUU4MTAwX0lOVF9ESV9SRUdfQQkJMHgwQQkvLyhyLCApCisKKyNkZWZpbmUgTUU4MTAwX1JFU19JTlRfUkVHX0IJCTB4MEUJLy8ociwgKQorI2RlZmluZSBNRTgxMDBfRElfUkVHX0IJCQkweDEwCS8vKHIsICkKKyNkZWZpbmUgTUU4MTAwX1BBVFRFUk5fUkVHX0IJCTB4MTQJLy8oICx3KQorI2RlZmluZSBNRTgxMDBfTUFTS19SRUdfQgkJMHgxNgkvLyggLHcpCisjZGVmaW5lIE1FODEwMF9JTlRfRElfUkVHX0IJCTB4MTYJLy8ociwgKQorCisjZGVmaW5lIE1FODEwMF9SRUdfT0ZGU0VUCQkweDBDCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3YjlmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uYwpAQCAtMCwwICsxLDM5MSBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZG8uYworICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lODEwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTgxMDBfZG9fcmVnLmgiCisjaW5jbHVkZSAibWU4MTAwX2RvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDE2X3QgY3RybDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbncoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsICY9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xIHwgTUU4MTAwX0RJT19DVFJMX0JJVF9JTlRCXzA7CisJb3V0dyhjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJb3V0dygwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPSAwOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU4MTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgY29uZmlnOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWNvbmZpZyA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJICAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0hJR0hfSU1QRURBTkNFKSB7CisJCQkJY29uZmlnICY9IH4oTUU4MTAwX0RJT19DVFJMX0JJVF9FTkFCTEVfRElPKTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19TSU5LKSB7CisJCQkJY29uZmlnIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfRU5BQkxFX0RJTzsKKwkJCQljb25maWcgJj0gfk1FODEwMF9ESU9fQ1RSTF9CSVRfU09VUkNFOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX1NPVVJDRSkgeworCQkJCWNvbmZpZyB8PQorCQkJCSAgICBNRTgxMDBfRElPX0NUUkxfQklUX0VOQUJMRV9ESU8gfAorCQkJCSAgICBNRTgxMDBfRElPX0NUUkxfQklUX1NPVVJDRTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dHcoY29uZmlnLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjb25maWcpOworCX0KKworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZG9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgJiAweEZGOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJKnZhbHVlID0gKGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPj4gOCkgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvcjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgxMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCAxNikpIHsKKwkJCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPQorCQkJICAgIHZhbHVlID8gKGluc3RhbmNlLT4KKwkJCQkgICAgIHBvcnRfcmVnX21pcnJvciB8ICgweDEgPDwgY2hhbm5lbCkpCisJCQkgICAgOiAoaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmIH4oMHgxIDw8IGNoYW5uZWwpKTsKKwkJCW91dHcoaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmPSB+MHhGRjsKKwkJCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgfD0gdmFsdWUgJiAweEZGOworCQkJb3V0dyhpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IpOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmPSB+MHhGRjAwOworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciB8PSAodmFsdWUgPDwgOCkgJiAweEZGMDA7CisJCQlvdXR3KGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvcik7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yID0gdmFsdWU7CisJCQlvdXR3KHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSAxNjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgxMDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX1NJTktfU09VUkNFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTgxMDBfZG9fc3ViZGV2aWNlX3QgKm1lODEwMF9kb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZG9faWR4LAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODEwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgxMDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgxMDBfRE9fUkVHX0E7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FODEwMF9DVFJMX1JFR19BOworCX0gZWxzZSBpZiAoZG9faWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU4MTAwX0RPX1JFR19COworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTgxMDBfQ1RSTF9SRUdfQjsKKwl9IGVsc2UgeworCQlQRVJST1IoIldyb25nIHN1YmRldmljZSBpZHg9JWQuXG4iLCBkb19pZHgpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+ZG9faWR4ID0gZG9faWR4OworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgxMDBfZG9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MTAwX2RvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU4MTAwX2RvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODEwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODEwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MTAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y4ODAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kby5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogQGZpbGUgbWU4MTAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtODEwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MTAwX0RPX0hfCisjZGVmaW5lIF9NRTgxMDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODEwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlICNjdHJsX3JlZy4gKi8KKworCXVuc2lnbmVkIGludCBkb19pZHg7CisKKwl1aW50MTZfdCBwb3J0X3JlZ19taXJyb3I7CQkvKio8IE1pcnJvciB1c2VkIHRvIHN0b3JlIGN1cnJlbnQgcG9ydCByZWdpc3RlciBzZXR0aW5nIHdoaWNoIGlzIHdyaXRlIG9ubHkuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IENvbnRyb2wgcmVnaXN0ZXIuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODEwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODEwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MTAwX2RvX3N1YmRldmljZV90ICptZTgxMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2EyMzgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kb19yZWcuaApAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9hb19yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ET19SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9ET19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfRE9fUkVHX0EJCQkweDA2CS8vKCAsdykKKyNkZWZpbmUgTUU4MTAwX0RPX1JFR19CCQkJMHgxMgkvLyggLHcpCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM0YjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9yZWcuaApAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfQ1RSTF9SRUdfQQkJCTB4MDAJLy8oICx3KQorI2RlZmluZSBNRTgxMDBfQ1RSTF9SRUdfQgkJCTB4MEMJLy8oICx3KQorCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfU09VUkNFCQkweDEwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xCQkweDIwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wCQkweDQwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfRU5BQkxFX0RJTwkJMHg4MAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxYzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RpLmgiCisjaW5jbHVkZSAibWU4MjAwX2RvLmgiCisjaW5jbHVkZSAibWU4MjAwX2Rpby5oIgorCittZV9kZXZpY2VfdCAqbWU4MjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwltZTgyMDBfZGV2aWNlX3QgKm1lODIwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lODIwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyMDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWU4MjAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lODIwMF9kZXZpY2UsIDAsIHNpemVvZihtZTgyMDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTgyMDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTgyMDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTgyMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lODIwMF9kZXZpY2UtPmlycV9jdHJsX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTgyMDBfZGV2aWNlLT5pcnFfbW9kZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU4MjAwX2RldmljZS0+ZGlvX2N0cmxfbG9jayk7CisKKwkvKiBTZXR1cCB0aGUgUExYIGludGVycnVwdCBjb25maWd1cmF0aW9uICovCisJb3V0bChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfRU4gfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX1BPTCB8CisJICAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCB8CisJICAgICBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4sCisJICAgICBtZTgyMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1sxXSArIFBMWF9JTlRDU1IpOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisKKwlmb3IgKGkgPSAwOyBpIDwgbWU4MjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyMDBfZGlfY29uc3RydWN0b3IobWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLCBpLAorCQkJCQkJCSAgICAgbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgICZtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGlycV9jdHJsX2xvY2ssCisJCQkJCQkJICAgICAmbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBpcnFfbW9kZV9sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MjAwX2RldmljZSk7CisJCQlrZnJlZShtZTgyMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODIwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTgyMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODIwMF9kb19jb25zdHJ1Y3RvcihtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICBtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxLAorCQkJCQkJCSAgICAgJm1lODIwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgaXJxX21vZGVfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTgyMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWU4MjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU4MjAwX2Rpb19jb25zdHJ1Y3RvcihtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICAmbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgZGlvX2N0cmxfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTgyMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTgyMDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTgyMDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7Cit9CisKK21vZHVsZV9pbml0KG1lODIwMF9pbml0KTsKKworbW9kdWxlX2V4aXQobWU4MjAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBUZW1wbGF0ZSBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBUZW1wbGF0ZSBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lODIwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkMmEwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGV2aWNlLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RFVklDRV9ICisjZGVmaW5lIF9NRTgyMDBfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyBNRS04MjAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IGRpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRvX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRpb19zdWJkZXZpY2VzOworfSBtZTgyMDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBEZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWU4MjAwX3ZlcnNpb25fdCBtZTgyMDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgyMDBfQSwgMSwgMSwgMn0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0IsIDIsIDIsIDJ9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUU4MjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lODIwMF92ZXJzaW9ucykgLyBzaXplb2YobWU4MjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTgyMDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lODIwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTgyMDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lODIwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUU4MjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWU4MjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTgyMDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGlycV9jdHJsX2xvY2s7CS8qKjwgTG9jayBmb3IgdGhlIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyLiAqLworCXNwaW5sb2NrX3QgaXJxX21vZGVfbG9jazsJLyoqPCBMb2NrIGZvciB0aGUgaW50ZXJydXB0IG1vZGUgcmVnaXN0ZXIuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9sb2NrOwkvKio8IExvY2sgZm9yIHRoZSBkaWdpdGFsIGkvbyBjb250cm9sIHJlZ2lzdGVyLiAqLworfSBtZTgyMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS04MjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtODIwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTgyMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNDU2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGkuYwpAQCAtMCwwICsxLDg1NyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGkuYworICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvLy9JbmNsdWRlcworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MjAwX2RpX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kaS5oIgorCisvLy8gRGVmaW5lcworc3RhdGljIHZvaWQgbWU4MjAwX2RpX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX2lycV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IGlycV9zb3VyY2UsCisJCQkJICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3JfRVgoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcl9FWChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbWU4MjAwX2RpX2NoZWNrX3ZlcnNpb24obWU4MjAwX2RpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKKy8vL0Z1bmN0aW9ucworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXZvbGF0aWxlIHVpbnQ4X3QgdG1wOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJaWYgKGZsYWdzICYKKwkJICAgIH4oTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HIHwKKwkJICAgICAgTUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmIChpcnFfZWRnZSAhPSBNRV9JUlFfRURHRV9OT1RfVVNFRCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJCX0KKwl9IGVsc2UgaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQlpZiAoZmxhZ3MgJgorCQkgICAgfihNRV9JT19JUlFfU1RBUlRfRVhURU5ERURfU1RBVFVTIHwKKwkJICAgICAgTUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKQorCQkgICAgJiYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX0ZBTExJTkcpCisJCSAgICAmJiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfQU5ZKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJCX0KKworCQlpZiAoIShpcnFfYXJnICYgMHhGRikpIHsKKwkJCVBFUlJPUigiTm8gbWFzayBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9BUkc7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJb3V0YihpcnFfYXJnLCBpbnN0YW5jZS0+Y29tcGFyZV9yZWcpOworCQlQREVCVUdfUkVHKCJjb21wYXJlX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNvbXBhcmVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBpcnFfYXJnKTsKKwkJb3V0YigweEZGLCBpbnN0YW5jZS0+bWFza19yZWcpOworCQlQREVCVUdfUkVHKCJtYXNrX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPm1hc2tfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweGZmKTsKKwkJaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPSBpcnFfYXJnOworCQlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPQorCQkgICAgKGZsYWdzICYgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HKSA/IDEgOiAwOworCX0KKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCW91dGIoaXJxX2FyZywgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwkJUERFQlVHX1JFRygibWFza19yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5tYXNrX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgaXJxX2FyZyk7CisJCWluc3RhbmNlLT5maWx0ZXJpbmdfZmxhZyA9IDA7CisJfQorCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9tb2RlX3JlZyk7CisJdG1wICY9CisJICAgIH4oTUU4MjAwX0lSUV9NT0RFX01BU0sgPDwKKwkgICAgICAoTUU4MjAwX0lSUV9NT0RFX0RJX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJdG1wIHw9CisJCSAgICBNRTgyMDBfSVJRX01PREVfTUFTS19DT01QQVJFIDw8IChNRTgyMDBfSVJRX01PREVfRElfU0hJRlQgKgorCQkJCQkJICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCXRtcCB8PQorCQkgICAgTUU4MjAwX0lSUV9NT0RFX01BU0tfTUFTSyA8PCAoTUU4MjAwX0lSUV9NT0RFX0RJX1NISUZUICoKKwkJCQkJCSAgaW5zdGFuY2UtPmRpX2lkeCk7CisJfQorCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX21vZGVfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfbW9kZV9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX21vZGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX2N0cmxfbG9jayk7CisJdG1wID0gaW5iKGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCXRtcCB8PQorCSAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUiA8PAorCSAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwl0bXAgfD0KKwkgICAgTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9FTkFCTEUgPDwgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqCisJCQkJCSAgICAgIGluc3RhbmNlLT5kaV9pZHgpOworCisJaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQl0bXAgJj0KKwkJICAgIH4oTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRSA8PAorCQkgICAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCQlpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX1JJU0lORyA8PAorCQkJICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KTsKKwkJfSBlbHNlIGlmIChpcnFfZWRnZSA9PSBNRV9JUlFfRURHRV9GQUxMSU5HKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0ZBTExJTkcgPDwKKwkJCSAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCk7CisJCX0gZWxzZSBpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0FOWSA8PAorCQkJICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KTsKKwkJfQorCX0KKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwl0bXAgJj0KKwkgICAgfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCWluc3RhbmNlLT5saW5lX3ZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX2ZsYWcgPSBmbGFncyAmIE1FX0lPX0lSUV9TVEFSVF9FWFRFTkRFRF9TVEFUVVM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJaW50IGNvdW50OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCVBERVZFTE9QKCJQSUQ6ICVkLlxuIiwgY3VycmVudC0+cGlkKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX0lSUV9XQUlUX05PUk1BTF9TVEFUVVMgfCBNRV9JT19JUlFfV0FJVF9FWFRFTkRFRF9TVEFUVVMpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQljb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKChjb3VudCAhPQorCQkJCQkJCSAgICAgICBpbnN0YW5jZS0+Y291bnQpCisJCQkJCQkJICAgICAgfHwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICByaXNlZCA8IDApKSwKKwkJCQkJCQkgICAgIHQpOworLy8gICAgICAgICAgICAgICAgICAgICAgdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApLCB0KTsKKwkJCWlmICh0ID09IDApIHsKKwkJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IHRpbWVkIG91dC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKChjb3VudCAhPSBpbnN0YW5jZS0+Y291bnQpCisJCQkJCQkgIHx8IChpbnN0YW5jZS0+cmlzZWQgPCAwKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKwlpZiAoIWVycikgeworCQlpZiAoZmxhZ3MgJiBNRV9JT19JUlFfV0FJVF9OT1JNQUxfU1RBVFVTKSB7CisJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlOworCQl9IGVsc2UgaWYgKGZsYWdzICYgTUVfSU9fSVJRX1dBSVRfRVhURU5ERURfU1RBVFVTKSB7CisJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzOworCQl9IGVsc2UgewkvLyBVc2UgZGVmYXVsdAorCQkJaWYgKCFpbnN0YW5jZS0+c3RhdHVzX2ZsYWcpIHsKKwkJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzOworCQkJfQorCQl9CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisvKgorCQkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKyovCisJfSBlbHNlIHsKKwkJKnZhbHVlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCXRtcCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwl0bXAgfD0KKwkgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFIDw8CisJICAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXRtcCAmPQorCSAgICB+KE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwl0bXAgfD0KKwkgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfQ0xFQVIgPDwKKwkgICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisvLyAgICAgICAgICAgICAgICAgICAgICB0bXAgJj0gfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8IChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisJb3V0Yih0bXAsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisJaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWluc3RhbmNlLT5jb3VudCA9IDA7CisJcmV0dXJuIG1lODIwMF9kaV9pb19pcnFfc3RvcChzdWJkZXZpY2UsIGZpbGVwLCAwLCAwKTsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0RJT19CSVRfUEFUVEVSTl9JUlEgfAorCSAgICBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9SSVNJTkcgfAorCSAgICBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9GQUxMSU5HIHwKKwkgICAgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgY3RybDsKKwl1aW50OF90IGlycV9zdGF0dXM7CisJdWludDhfdCBsaW5lX3ZhbHVlID0gMDsKKwl1aW50OF90IGxpbmVfc3RhdHVzID0gMDsKKwl1aW50MzJfdCBzdGF0dXNfdmFsID0gMDsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghaXJxX3N0YXR1cykgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGluc3RhbmNlLT5kaV9pZHgsIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX2N0cmxfbG9jayk7CisJY3RybCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwljdHJsIHw9CisJICAgIE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfQ0xFQVIgPDwgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqCisJCQkJCSAgICAgaW5zdGFuY2UtPmRpX2lkeCk7CisJb3V0YihjdHJsLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwljdHJsICY9CisJICAgIH4oTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUiA8PAorCSAgICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisJb3V0YihjdHJsLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCWxpbmVfdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aXJxX2N0cmxfbG9jayk7CisKKwlsaW5lX3N0YXR1cyA9ICgodWludDhfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgXiBsaW5lX3ZhbHVlKTsKKworCS8vIE1ha2UgZXh0ZW5kZWQgaW5mb3JtYXRpb24uCisJc3RhdHVzX3ZhbCB8PSAoMHgwMEZGICYgKH4odWludDhfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgJiBsaW5lX3ZhbHVlKSkgPDwgMTY7CS8vUmFpc2UKKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAoKHVpbnQ4X3QpIGluc3RhbmNlLT5saW5lX3ZhbHVlICYgfmxpbmVfdmFsdWUpKTsJLy9GYWxsCisKKwlpbnN0YW5jZS0+bGluZV92YWx1ZSA9IChpbnQpbGluZV92YWx1ZTsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPT0gMCkgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gaXJxX3N0YXR1cyB8IGxpbmVfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gc3RhdHVzX3ZhbDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlIHw9IGlycV9zdGF0dXMgfCBsaW5lX3N0YXR1czsKKwkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyB8PSBzdGF0dXNfdmFsOworCX0KKworCWlmIChpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcpIHsJLy8gRm9yIGNvbXBhcmUgbW9kZSBvbmx5LgorCQlpZiAoaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPT0gaW5zdGFuY2UtPmxpbmVfdmFsdWUpIHsKKwkJCWluc3RhbmNlLT5yaXNlZCA9IDE7CisJCQlpbnN0YW5jZS0+Y291bnQrKzsKKwkJfQorCX0gZWxzZSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDE7CisJCWluc3RhbmNlLT5jb3VudCsrOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3JfRVgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyX0VYKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgaXJxX3N0YXR1cyA9IDA7CisJdWludDE2X3QgaXJxX3N0YXR1c19FWCA9IDA7CisJdWludDMyX3Qgc3RhdHVzX3ZhbCA9IDA7CisJaW50IGksIGo7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vUmVzZXQgbGF0Y2hlcy4gQ29weSBzdGF0dXMgdG8gZXh0ZW5kZWQgcmVnaXN0ZXJzLgorCWlycV9zdGF0dXMgPSBpbmIoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJpZHg9JWQgaXJxX3N0YXR1c19yZWc9MHglMDJYXG4iLCBpbnN0YW5jZS0+ZGlfaWR4LAorCQkgICBpcnFfc3RhdHVzKTsKKworCWlmICghaXJxX3N0YXR1cykgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGluc3RhbmNlLT5kaV9pZHgsIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1c19FWCA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19sb3dfcmVnKTsKKwlpcnFfc3RhdHVzX0VYIHw9IChpbmIoaW5zdGFuY2UtPmlycV9zdGF0dXNfaGlnaF9yZWcpIDw8IDgpOworCisJUERFVkVMT1AoIkVYVEVOREVEIFJFRzogMHglMDR4XG4iLCBpcnFfc3RhdHVzX0VYKTsKKwlpbnN0YW5jZS0+bGluZV92YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJLy8gRm9ybWF0IGV4dGVuZGVkIGluZm9ybWF0aW9uLgorCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgODsgaSsrLCBqICs9IDIpIHsKKwkJc3RhdHVzX3ZhbCB8PSAoKDB4MDEgPDwgaikgJiBpcnFfc3RhdHVzX0VYKSA+PiAoaiAtIGkpOwkvL0ZhbGwKKwkJc3RhdHVzX3ZhbCB8PSAoKDB4MDEgPDwgKGogKyAxKSkgJiBpcnFfc3RhdHVzX0VYKSA8PCAoMTUgLSBqICsgaSk7CS8vUmFpc2UKKwl9CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaWYgKGluc3RhbmNlLT5yaXNlZCA9PSAwKSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSBpcnFfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gc3RhdHVzX3ZhbDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlIHw9IGlycV9zdGF0dXM7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWVfZWRnZXMgfD0gc3RhdHVzX3ZhbDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnKSB7CS8vIEZvciBjb21wYXJlIG1vZGUgb25seS4KKwkJaWYgKGluc3RhbmNlLT5jb21wYXJlX3ZhbHVlID09IGluc3RhbmNlLT5saW5lX3ZhbHVlKSB7CisJCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQkJaW5zdGFuY2UtPmNvdW50Kys7CisJCX0KKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQlpbnN0YW5jZS0+Y291bnQrKzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lODIwMF9kaV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsICh2b2lkICopaW5zdGFuY2UpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lODIwMF9kaV9zdWJkZXZpY2VfdCAqbWU4MjAwX2RpX2NvbnN0cnVjdG9yKHVpbnQzMl90IG1lODIwMF9yZWdiYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogaXJxX2N0cmxfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogaXJxX21vZGVfbG9jaykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyMDBfZGlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU4MjAwX2RpX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIENoZWNrIGZpcm13YXJlIHZlcnNpb24uCisJbWU4MjAwX2RpX2NoZWNrX3ZlcnNpb24oc3ViZGV2aWNlLAorCQkJCW1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0ZJUk1XQVJFX1ZFUlNJT05fUkVHKTsKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmlycV9jdHJsX2xvY2sgPSBpcnFfY3RybF9sb2NrOworCXN1YmRldmljZS0+aXJxX21vZGVfbG9jayA9IGlycV9tb2RlX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXguICovCisJc3ViZGV2aWNlLT5kaV9pZHggPSBkaV9pZHg7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkaV9pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfUE9SVF8wX1JFRzsKKwkJc3ViZGV2aWNlLT5tYXNrX3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX01BU0tfMF9SRUc7CisJCXN1YmRldmljZS0+Y29tcGFyZV9yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfQ09NUEFSRV8wX1JFRzsKKwkJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9CisJCSAgICBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9DSEFOR0VfMF9SRUc7CisKKwkJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX2xvd19yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8wX0xPV19SRUc7CisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19oaWdoX3JlZyA9CisJCSAgICBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9FWFRFTkRfQ0hBTkdFXzBfSElHSF9SRUc7CisJfSBlbHNlIGlmIChkaV9pZHggPT0gMSkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfUE9SVF8xX1JFRzsKKwkJc3ViZGV2aWNlLT5tYXNrX3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX01BU0tfMV9SRUc7CisJCXN1YmRldmljZS0+Y29tcGFyZV9yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfQ09NUEFSRV8xX1JFRzsKKwkJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9CisJCSAgICBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9DSEFOR0VfMV9SRUc7CisKKwkJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX2xvd19yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8xX0xPV19SRUc7CisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19oaWdoX3JlZyA9CisJCSAgICBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9FWFRFTkRfQ0hBTkdFXzFfSElHSF9SRUc7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJXcm9uZyBzdWJkZXZpY2UgaWR4PSVkLlxuIiwgZGlfaWR4KTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXN1YmRldmljZS0+aXJxX2N0cmxfcmVnID0gbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfSVJRX0NUUkxfUkVHOworCXN1YmRldmljZS0+aXJxX21vZGVfcmVnID0gbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfSVJRX01PREVfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IG1lODIwMF9yZWdiYXNlOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWU4MjAwX2RpX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWU4MjAwX2RpX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AgPSBtZTgyMDBfZGlfaW9faXJxX3N0b3A7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTgyMDBfZGlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lODIwMF9kaV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTgyMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lODIwMF9kaV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTgyMDBfZGlfZGVzdHJ1Y3RvcjsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+Y291bnQgPSAwOworCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gKi8KKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKwlpZiAoc3ViZGV2aWNlLT52ZXJzaW9uID4gMCkgewkvLyBORVcKKwkJZXJyID0gcmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lODIwMF9pc3JfRVgsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCQkgIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQkJICBNRTgyMDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCX0gZWxzZSB7CQkvL09MRAorCQllcnIgPSByZXF1ZXN0X2lycShzdWJkZXZpY2UtPmlycSwgbWU4MjAwX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCQkgIE1FODIwMF9OQU1FLCAodm9pZCAqKXN1YmRldmljZSk7CisJfQorCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQREVCVUcoIlJlZ2lzdHJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQorCitzdGF0aWMgdm9pZCBtZTgyMDBfZGlfY2hlY2tfdmVyc2lvbihtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWluc3RhbmNlLT52ZXJzaW9uID0gMHgwMDAwMDBGRiAmIGluYihhZGRyKTsKKwlQREVWRUxPUCgibWU4MjAwIGZpcm13YXJlIHZlcnNpb246ICVkXG4iLCBpbnN0YW5jZS0+dmVyc2lvbik7CisKKwkvLy8gQG5vdGUgRml4IGZvciB3cm9uZyB2YWx1ZXMgaW4gdGhpcyByZWdpc3RyeS4KKwlpZiAoKGluc3RhbmNlLT52ZXJzaW9uIDwgMHg3KSB8fCAoaW5zdGFuY2UtPnZlcnNpb24gPiAweDFGKSkKKwkJaW5zdGFuY2UtPnZlcnNpb24gPSAweDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzYjAwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGkuaApAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kaS5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RJX0hfCisjZGVmaW5lIF9NRTgyMDBfRElfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF9kaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsKKwlzcGlubG9ja190ICppcnFfY3RybF9sb2NrOworCXNwaW5sb2NrX3QgKmlycV9tb2RlX2xvY2s7CisKKwl1bnNpZ25lZCBpbnQgZGlfaWR4OworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCisJaW50IGlycTsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgdGhlIGludGVycnVwdCByZXF1ZXN0LiAqLworCXZvbGF0aWxlIGludCByaXNlZDsJCQkJLyoqPCBGbGFnIHRvIGluZGljYXRlIGlmIGFuIGludGVycnVwdCBvY2N1cmVkLiAqLworCXVpbnQgc3RhdHVzX2ZsYWc7CQkJCS8qKjwgRGVmYXVsdCBpbnRlcnVwdCBzdGF0dXMgZmxhZyAqLworCXVpbnQgc3RhdHVzX3ZhbHVlOwkJCQkvKio8IEludGVydXB0IHN0YXR1cyAqLworCXVpbnQgc3RhdHVzX3ZhbHVlX2VkZ2VzOwkJCS8qKjwgRXh0ZW5kZWQgaW50ZXJ1cHQgc3RhdHVzICovCisJdWludCBsaW5lX3ZhbHVlOworCWludCBjb3VudDsJCQkJCQkvKio8IENvdW50cyB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgb2NjdXJlZC4gKi8KKwl1aW50OF90IGNvbXBhcmVfdmFsdWU7CisJdWludDhfdCBmaWx0ZXJpbmdfZmxhZzsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CS8qKjwgVG8gd2FpdCBvbiBpbnRlcnJ1cHRzLiAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFRoZSBkaWdpdGFsIGlucHV0IHBvcnQuICovCisJdW5zaWduZWQgbG9uZyBjb21wYXJlX3JlZzsJCS8qKjwgVGhlIHJlZ2lzdGVyIHRvIGhvbGQgdGhlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aC4gKi8KKwl1bnNpZ25lZCBsb25nIG1hc2tfcmVnOwkJCS8qKjwgVGhlIHJlZ2lzdGVyIHRvIGhvbGQgdGhlIG1hc2suICovCisJdW5zaWduZWQgbG9uZyBpcnFfbW9kZV9yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgbW9kZSByZWdpc3Rlci4gKi8KKwl1bnNpZ25lZCBsb25nIGlycV9jdHJsX3JlZzsJCS8qKjwgVGhlIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyLiAqLworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CS8qKjwgVGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIuIEFsc28gaW50ZXJydXB0IHJlc2V0aW5nIHJlZ2lzdGVyIChmaXJtd2FyZSB2ZXJzaW9uIDcgYW5kIGxhdGVyKS4qLworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgZmlybXdhcmVfdmVyc2lvbl9yZWc7CS8qKjwgVGhlIGludGVycnVwdCByZXNldGluZyByZWdpc3Rlci4gKi8KKworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19sb3dfcmVnOwkvKio8IFRoZSBpbnRlcnJ1cHQgZXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyIChsb3cgcGFydCkuICovCisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX2hpZ2hfcmVnOwkvKio8IFRoZSBpbnRlcnJ1cHQgZXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyIChoaWdoIHBhcnQpLiAqLworfSBtZTgyMDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTgyMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyMDBfZGlfc3ViZGV2aWNlX3QgKm1lODIwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTgyMDBfcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRpX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfY3RybF9sb2NrLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YTYxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpX3JlZy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RpX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RJX1JFR19IXworI2RlZmluZSBfTUU4MjAwX0RJX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisvLyBDb21tb24gcmVnaXN0cnkgZm9yIHdob2xlIGZhbWlseS4KKyNkZWZpbmUgTUU4MjAwX0RJX1BPUlRfMF9SRUcJCQkJCTB4MwkvLyBSCisjZGVmaW5lIE1FODIwMF9ESV9QT1JUXzFfUkVHCQkJCQkweDQJLy8gUgorCisjZGVmaW5lIE1FODIwMF9ESV9NQVNLXzBfUkVHCQkJCQkweDUJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESV9NQVNLXzFfUkVHCQkJCQkweDYJLy8gUi9XCisKKyNkZWZpbmUgTUU4MjAwX0RJX0NPTVBBUkVfMF9SRUcJCQkJCTB4QQkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RJX0NPTVBBUkVfMV9SRUcJCQkJCTB4QgkvLyBSL1cKKworI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfUkVHCQkJCQkweEMJLy8gUi9XCisKKyNpZm5kZWYgTUU4MjAwX0lSUV9NT0RFX1JFRworIyBkZWZpbmUgTUU4MjAwX0lSUV9NT0RFX1JFRwkJCQkJMHhECS8vIFIvVworI2VuZGlmCisKKy8vIFRoaXMgcmVnaXN0cnkgYXJlIGZvciBhbGwgdmVyc2lvbnMKKyNkZWZpbmUgTUU4MjAwX0RJX0NIQU5HRV8wX1JFRwkJCQkJMHhFCS8vIFIKKyNkZWZpbmUgTUU4MjAwX0RJX0NIQU5HRV8xX1JFRwkJCQkJMHhGCS8vIFIKKworI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSCQkJMHg0CisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFCQkJMHg4CisKKy8vIFRoaXMgcmVnaXN0cnkgYXJlIGZvciBmaXJtd2FyZSB2ZXJzaW9ucyA3IGFuZCBsYXRlcgorI2RlZmluZSBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8wX0xPV19SRUcJCTB4MTAJLy8gUgorI2RlZmluZSBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8wX0hJR0hfUkVHCQkweDExCS8vIFIKKyNkZWZpbmUgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMV9MT1dfUkVHCQkweDEyCS8vIFIKKyNkZWZpbmUgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMV9ISUdIX1JFRwkJMHgxMwkvLyBSCisKKyNpZm5kZWYgTUU4MjAwX0ZJUk1XQVJFX1ZFUlNJT05fUkVHCisjIGRlZmluZSBNRTgyMDBfRklSTVdBUkVfVkVSU0lPTl9SRUcJCQkweDE0CS8vIFIKKyNlbmRpZgorCisvLyBCaXQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRQkJCTB4MworI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX1JJU0lORwkJMHgwCisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9NQVNLX0VER0VfRkFMTElORwkweDEKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRV9BTlkJCTB4MworCisvLyBPdGhlcnMKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUCQkJCTQKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOGNhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpby5jCkBAIC0wLDAgKzEsNDE4IEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kaW8uYworICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lODIwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWU4MjAwX2Rpby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lODIwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaW5zdGFuY2UgPSAobWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJbW9kZSAmPSB+KDB4MyA8PCAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJb3V0Yihtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3Qgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19PVVRQVVQpIHsKKwkJCQltb2RlICY9CisJCQkJICAgIH4oKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJCW1vZGUgfD0KKwkJCQkgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgZGlvX2lkeCAqIDIpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJJbnZhbGlkIHBvcnQgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRiKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAoKG1vZGUgPT0KKwkJCSAgICAgKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHx8ICFtb2RlKSB7CisJCQkJKnZhbHVlID0KKwkJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQkJcG9ydF9yZWcpICYgKDB4MDAwMSA8PCBjaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAoKG1vZGUgPT0KKwkJCSAgICAgKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHx8ICFtb2RlKSB7CisJCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweDAwRkY7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50OF90IG1vZGU7CisJdWludDhfdCBieXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlieXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisKKwkJCQlpZiAodmFsdWUpCisJCQkJCWJ5dGUgfD0gMHgxIDw8IGNoYW5uZWw7CisJCQkJZWxzZQorCQkJCQlieXRlICY9IH4oMHgxIDw8IGNoYW5uZWwpOworCisJCQkJb3V0YihieXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBieXRlKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlvdXRiKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqbWU4MjAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU4MjAwX2Rpb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgZGlnaXRhbCBpL28gaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU4MjAwX0RJT19DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRElPX1BPUlRfUkVHICsgZGlvX2lkeDsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU4MjAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTgyMDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU4MjAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTgyMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU4MjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRkOTNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTgyMDBfRElPX0hfCisjZGVmaW5lIF9NRTgyMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgyMDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU4MjAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODIwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyMDBfZGlvX3N1YmRldmljZV90ICptZTgyMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTRhMTMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW9fcmVnLmgKQEAgLTAsMCArMSw0MyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGlvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODIwMF9ESU9fUkVHX0hfCisjZGVmaW5lIF9NRTgyMDBfRElPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9ESU9fQ1RSTF9SRUcJCQkJCTB4NwkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RJT19QT1JUXzBfUkVHCQkJCTB4OAkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RJT19QT1JUXzFfUkVHCQkJCTB4OQkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RJT19QT1JUX1JFRwkJCQkJTUU4MjAwX0RJT19QT1JUXzBfUkVHCS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wCQkJMHgwMQorI2RlZmluZSBNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMQkJCTB4MDIKKyNkZWZpbmUgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzIJCQkweDA0CisjZGVmaW5lIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8zCQkJMHgwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGJhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvLmMKQEAgLTAsMCArMSw2MDAgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RvLmMKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MjAwX2RvX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19pcnFfc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCBpcnFfc291cmNlLAorCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmIChpcnFfc291cmNlICE9IE1FX0lSUV9TT1VSQ0VfRElPX09WRVJfVEVNUCkgeworCQlQRVJST1IoIkludmFsaWQgaW50ZXJydXB0IHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCXRtcCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwl0bXAgfD0KKwkgICAgTUU4MjAwX0lSUV9NT0RFX0JJVF9FTkFCTEVfUE9XRVIgPDwgKE1FODIwMF9JUlFfTU9ERV9QT1dFUl9TSElGVCAqCisJCQkJCQkgaW5zdGFuY2UtPmRvX2lkeCk7CisJb3V0Yih0bXAsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19pcnFfd2FpdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICppcnFfY291bnQsCisJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA8PSAwKSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisKKwkJaWYgKHRpbWVfb3V0KSB7CisJCQl0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgd2FpdF9xdWV1ZSwKKwkJCQkJCQkgICAgIChpbnN0YW5jZS0+cmlzZWQgIT0KKwkJCQkJCQkgICAgICAwKSwgdCk7CisKKwkJCWlmICh0ID09IDApIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIGludGVycnVwdCB0aW1lZCBvdXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQl9IGVsc2UgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+cmlzZWQgIT0gMCkpOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5yaXNlZCA8IDApIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSB1c2VyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKwl9CisKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJUEVSUk9SKCJXYWl0IG9uIGV4dGVybmFsIGludGVycnVwdCBhYm9ydGVkIGJ5IHNpZ25hbC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCSppcnFfY291bnQgPSBpbnN0YW5jZS0+Y291bnQ7CisJKnZhbHVlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX2lycV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJdG1wICY9CisJICAgIH4oTUU4MjAwX0lSUV9NT0RFX0JJVF9FTkFCTEVfUE9XRVIgPDwKKwkgICAgICAoTUU4MjAwX0lSUV9NT0RFX1BPV0VSX1NISUZUICogaW5zdGFuY2UtPmRvX2lkeCkpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9faW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50OF90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCXRtcCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwl0bXAgJj0KKwkgICAgfihNRTgyMDBfSVJRX01PREVfQklUX0VOQUJMRV9QT1dFUiA8PAorCSAgICAgIChNRTgyMDBfSVJRX01PREVfUE9XRVJfU0hJRlQgKiBpbnN0YW5jZS0+ZG9faWR4KSk7CisJb3V0Yih0bXAsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IC0xOworCWluc3RhbmNlLT5jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19PVVRQVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQlzdGF0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJc3RhdGUgPQorCQkJICAgIHZhbHVlID8gKHN0YXRlIHwgKDB4MSA8PCBjaGFubmVsKSkgOiAoc3RhdGUgJgorCQkJCQkJCQkgIH4oMHgxIDw8CisJCQkJCQkJCSAgICBjaGFubmVsKSk7CisJCQlvdXRiKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRE87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19PVkVSX1RFTVBfSVJROworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZTgyMDBfZG9fZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCAodm9pZCAqKWluc3RhbmNlKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9kb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfZG9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQxNl90IGN0cmw7CisJdWludDhfdCBpcnFfc3RhdHVzOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RvX3N1YmRldmljZV90ICopIGRldl9pZDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5iKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEKKwkgICAgKGlycV9zdGF0dXMgJgorCSAgICAgKE1FODIwMF9ET19JUlFfU1RBVFVTX0JJVF9BQ1RJVkUgPDwgaW5zdGFuY2UtPmRvX2lkeCkpKSB7CisJCVBJTkZPCisJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpZHg9JWQgaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaW5zdGFuY2UtPmRvX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwlpbnN0YW5jZS0+Y291bnQrKzsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX21vZGVfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwljdHJsIHw9IE1FODIwMF9JUlFfTU9ERV9CSVRfQ0xFQVJfUE9XRVIgPDwgaW5zdGFuY2UtPmRvX2lkeDsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCWN0cmwgJj0gfihNRTgyMDBfSVJRX01PREVfQklUX0NMRUFSX1BPV0VSIDw8IGluc3RhbmNlLT5kb19pZHgpOworCW91dHcoY3RybCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU4MjAwX2RvX3N1YmRldmljZV90ICptZTgyMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODIwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgyMDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+aXJxX21vZGVfbG9jayA9IGlycV9tb2RlX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgKi8KKwlzdWJkZXZpY2UtPmRvX2lkeCA9IGRvX2lkeDsKKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRE9fUE9SVF8wX1JFRzsKKwl9IGVsc2UgaWYgKGRvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FODIwMF9ET19QT1JUXzFfUkVHOworCX0gZWxzZSB7CisJCVBFUlJPUigiV3Jvbmcgc3ViZGV2aWNlIGlkeD0lZC5cbiIsIGRvX2lkeCk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzdWJkZXZpY2UtPmlycV9jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU4MjAwX0lSUV9NT0RFX1JFRzsKKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRE9fSVJRX1NUQVRVU19SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgdGhlIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogUmVxdWVzdCB0aGUgaW50ZXJydXB0IGxpbmUgKi8KKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIG1lODIwMF9kb19pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJICBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJICBNRTgyMDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVBJTkZPKCJSZWdpc3RlcmVkIGlycT0lZC5cbiIsIGlycSk7CisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTgyMDBfZG9faW9faXJxX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQgPSBtZTgyMDBfZG9faW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lODIwMF9kb19pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lODIwMF9kb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU4MjAwX2RvX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lODIwMF9kb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lODIwMF9kb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTgyMDBfZG9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTgyMDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lODIwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTgyMDBfZG9fZGVzdHJ1Y3RvcjsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+Y291bnQgPSAwOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU4MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RPX0hfCisjZGVmaW5lIF9NRTgyMDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqaXJxX21vZGVfbG9jazsKKworCWludCBpcnE7CQkJCS8qKjwgVGhlIG51bWJlciBvZiB0aGUgaW50ZXJydXB0IHJlcXVlc3QgKi8KKwlpbnQgcmlzZWQ7CQkJCS8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJlZCAqLworCWludCBjb3VudDsJCQkJLyoqPCBDb3VudHMgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIG9jY3VyZWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJLyoqPCBUbyB3YWl0IG9uIGludGVycnVwdHMgKi8KKworCXVuc2lnbmVkIGludCBkb19pZHg7CQkJLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBkaWdpdGFsIG91dHB1dCAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFRoZSBkaWdpdGFsIG91dHB1dCBwb3J0ICovCisJdW5zaWduZWQgbG9uZyBpcnFfY3RybF9yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODIwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MjAwX2RvX3N1YmRldmljZV90ICptZTgyMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDk1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvX3JlZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RPX1JFR19IXworI2RlZmluZSBfTUU4MjAwX0RPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9ET19JUlFfU1RBVFVTX1JFRwkJCTB4MAkvLyBSCisjZGVmaW5lIE1FODIwMF9ET19QT1JUXzBfUkVHCQkJCTB4MQkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RPX1BPUlRfMV9SRUcJCQkJMHgyCS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9ET19JUlFfU1RBVFVTX0JJVF9BQ1RJVkUJCTB4MQorI2RlZmluZSBNRTgyMDBfRE9fSVJRX1NUQVRVU19TSElGVAkJCTEKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2ZlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX3JlZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX1JFR19IXworI2RlZmluZSBfTUU4MjAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9SRUcJCQkJMHhECS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9NQVNLICAgICAJCQkweDMKKworI2RlZmluZSBNRTgyMDBfSVJRX01PREVfTUFTS19NQVNLCQkJMHgwCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9NQVNLX0NPTVBBUkUJCQkweDEKKworI2RlZmluZSBNRTgyMDBfSVJRX01PREVfQklUX0VOQUJMRV9QT1dFUgkJMHgxMAorI2RlZmluZSBNRTgyMDBfSVJRX01PREVfQklUX0NMRUFSX1BPV0VSCQkJMHg0MAorCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9ESV9TSElGVAkJCTIKKyNkZWZpbmUgTUU4MjAwX0lSUV9NT0RFX1BPV0VSX1NISUZUCQkJMQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDRjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU0LmMKQEAgLTAsMCArMSwxMTc2IEBACisvKioKKyAqIEBmaWxlIG1lODI1NC5jCisgKgorICogQGJyaWVmIDgyNTQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU4MjU0X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NC5oIgorCisvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE1FODI1NF9OVU1CRVJfQ0hBTk5FTFMgMQkvKio8IE9uZSBjaGFubmVsIHBlciBjb3VudGVyLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSX1dJRFRIIDE2CQkJLyoqPCBPbmUgY291bnRlciBoYXMgMTYgYml0cy4gKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU4MjU0X2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgY2xrX3NyYzsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlCisJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMCB8CisJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnZhbF9yZWcpOworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnZhbF9yZWcpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwljbGtfc3JjID0gaW5iKGluc3RhbmNlLT5jbGtfc3JjX3JlZyk7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJaWYgKGluc3RhbmNlLT5tZTgyNTRfaWR4ID09IDApIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0KKwkJCQkgICAgfihNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaIHwKKwkJCQkgICAgICBNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8yX0NMS19TUkNfUFJFVik7CisJCX0gZWxzZSB7CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkKKwkJCQljbGtfc3JjICY9CisJCQkJICAgIH4oTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWiB8CisJCQkJICAgICAgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ19RVUFSWik7CisJCQllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMV9DTEtfU1JDX1BSRVYpOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMl9DTEtfU1JDX1BSRVYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX01BU0spOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCisJCS8qIE5vIGNsb2NrIHNvdXJjZSByZWdpc3RlciBhdmFpbGFibGUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIHR5cGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJaWYgKCFlcnIpCisJCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTE0MDBfYWJfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwl1aW50OF90IGNsa19zcmM7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWNsa19zcmMgPSBpbmIoaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXN3aXRjaCAocmVmKSB7CisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQlpZiAoaW5zdGFuY2UtPm1lODI1NF9pZHggPT0gMCkgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUVVBUlopOworCQkJZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9BXzFfQ0xLX1NSQ19QUkVWKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQl8yX0NMS19TUkNfUFJFVik7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfUkVGX0NUUl9QUkVWSU9VUzoKKwkJaWYgKGluc3RhbmNlLT5tZTgyNTRfaWR4ID09IDApIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQV8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQUJfODI1NF9CXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzFNSFo6CisJCWlmIChpbnN0YW5jZS0+bWU4MjU0X2lkeCA9PSAwKSB7CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUVVBUlopOworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWik7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaOgorCQlpZiAoaW5zdGFuY2UtPm1lODI1NF9pZHggPT0gMCkgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlLlxuIik7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE0MDBfY2RfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwl1aW50OF90IGNsa19zcmM7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWNsa19zcmMgPSBpbmIoaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXN3aXRjaCAocmVmKSB7CisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX01BU0spOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX1BSRVZJT1VTOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0FDRV8xX0NMS19TUkNfTUFTSyk7CisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQ0RfODI1NF9BQ0VfMV9DTEtfU1JDX1BSRVYpOworCQkJfSBlbHNlIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzJfQ0xLX1NSQ19QUkVWKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX1BSRVYpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfUkVGX0NUUl9JTlRFUk5BTF8xTUhaOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ18xTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xME1IWik7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlLlxuIik7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwlzd2l0Y2ggKHJlZikgeworCisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQkvLyBOb3RoaW5nIHRvIGRvCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX3JlZl9jb25maWcobWU4MjU0X3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCByZWYpCit7CisJc3dpdGNoIChyZWYpIHsKKworCWNhc2UgTUVfUkVGX0NUUl9FWFRFUk5BTDoKKwkJLy8gTm90aGluZyB0byBkbworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgaW50IHJlZiwKKwkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkvLyBDb25maWd1cmUgdGhlIGNvdW50ZXIgbW9kZXMKKwlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzAgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00wIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MwIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTIgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMykgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzAgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00zIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MwIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNCB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81KSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTUgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJfQorCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzEgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00wIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MxIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTIgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMykgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzEgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00zIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MxIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNCB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81KSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTUgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8wKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMiB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMSkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzIgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00xIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzIpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMiB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8zKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMiB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTMgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfNCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzIgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX000IHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzUpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBzaW5nbGUgY29uZmlndXJhdGlvbi5cbiIpOworCQkJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQl9CisJfQorCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUI6CisJCWVyciA9IG1lMTQwMF9hYl9yZWZfY29uZmlnKGluc3RhbmNlLCByZWYpOworCisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQllcnIgPSBtZTE0MDBfY2RfcmVmX2NvbmZpZyhpbnN0YW5jZSwgcmVmKTsKKworCQlpZiAoZXJyKSB7CisJCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCWVyciA9IG1lNDYwMF9yZWZfY29uZmlnKGluc3RhbmNlLCByZWYpOworCisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQjoKKwkJZXJyID0gbWU4MTAwX3JlZl9jb25maWcoaW5zdGFuY2UsIHJlZik7CisKKwkJaWYgKGVycikgeworCQkJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIHR5cGUuXG4iKTsKKworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjU0X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCBsb19ieXRlOworCXVpbnQxNl90IGhpX2J5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX1RMTywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX1RMTywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlCisJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfVExPLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJbG9fYnl0ZSA9IGluYihpbnN0YW5jZS0+dmFsX3JlZyk7CisJaGlfYnl0ZSA9IGluYihpbnN0YW5jZS0+dmFsX3JlZyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJKnZhbHVlID0gbG9fYnl0ZSB8IChoaV9ieXRlIDw8IDgpOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyNTRfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTgyNTRfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnZhbF9yZWcpOworCW91dGIoKHZhbHVlID4+IDgpLCBpbnN0YW5jZS0+dmFsX3JlZyk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IE1FODI1NF9OVU1CRVJfQ0hBTk5FTFM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9DVFI7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX0NUUl84MjU0OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlpbnN0YW5jZSA9IChtZTgyNTRfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCSpjYXBzID0gaW5zdGFuY2UtPmNhcHM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkgYXJndW1lbnQgY291bnQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQX0FSR19DT1VOVDsKKwl9CisKKwlpZiAoY2FwID09IE1FX0NBUF9DVFJfV0lEVEgpIHsKKwkJYXJnc1swXSA9IE1FODI1NF9DVFJfV0lEVEg7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQUJfZ2V0X3ZhbF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJc3dpdGNoIChtZTgyNTRfaWR4KSB7CisKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBBQl84MjU0X0FfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfODI1NF9CXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQUJfZ2V0X2N0cmxfcmVnKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXN3aXRjaCAobWU4MjU0X2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMEFCXzgyNTRfQV9DVFJMX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfODI1NF9CX0NUUkxfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMEFCX2dldF9jbGtfc3JjX3JlZyh1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCQkgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJc3dpdGNoIChtZTgyNTRfaWR4KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfQ0xLX1NSQ19SRUcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMEFCX0NMS19TUkNfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMENEX2dldF92YWxfcmVnKHVpbnQzMl90IHJlZ19iYXNlLCB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXN3aXRjaCAobWU4MjU0X2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfODI1NF9BXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSAxOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ184MjU0X0JfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDI6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQ18wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWNhc2UgMzoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfODI1NF9EXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSA0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ184MjU0X0VfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDU6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQV8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWNhc2UgNjoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfODI1NF9CXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSA3OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF84MjU0X0NfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDg6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRF8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRV8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMENEX2dldF9jdHJsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlzd2l0Y2ggKG1lODI1NF9pZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQV9DVFJMX1JFRyk7CisKKwljYXNlIDE6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQl9DVFJMX1JFRyk7CisKKwljYXNlIDI6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQ19DVFJMX1JFRyk7CisKKwljYXNlIDM6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfRF9DVFJMX1JFRyk7CisKKwljYXNlIDQ6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfRV9DVFJMX1JFRyk7CisKKwljYXNlIDU6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQV9DVFJMX1JFRyk7CisKKwljYXNlIDY6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQl9DVFJMX1JFRyk7CisKKwljYXNlIDc6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQ19DVFJMX1JFRyk7CisKKwljYXNlIDg6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRF9DVFJMX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF84MjU0X0VfQ1RSTF9SRUcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQ0RfZ2V0X2Nsa19zcmNfcmVnKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJCSB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlzd2l0Y2ggKG1lODI1NF9pZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDX0NMS19TUkNfMF9SRUcpOworCisJY2FzZSAxOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ19DTEtfU1JDXzBfUkVHKTsKKworCWNhc2UgMjoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfQ0xLX1NSQ18xX1JFRyk7CisKKwljYXNlIDM6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDX0NMS19TUkNfMV9SRUcpOworCisJY2FzZSA0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ19DTEtfU1JDXzJfUkVHKTsKKworCWNhc2UgNToKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfQ0xLX1NSQ18wX1JFRyk7CisKKwljYXNlIDY6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEX0NMS19TUkNfMF9SRUcpOworCisJY2FzZSA3OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF9DTEtfU1JDXzFfUkVHKTsKKworCWNhc2UgODoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfQ0xLX1NSQ18xX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF9DTEtfU1JDXzJfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lNDYwMF9nZXRfdmFsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJICAgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJcmV0dXJuIChyZWdfYmFzZSArIE1FNDYwMF84MjU0XzBfVkFMX1JFRyArIGN0cl9pZHgpOworfQorCitzdGF0aWMgdWludDMyX3QgbWU0NjAwX2dldF9jdHJsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXJldHVybiAocmVnX2Jhc2UgKyBNRTQ2MDBfODI1NF9DVFJMX1JFRyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtZTgxMDBfZ2V0X3ZhbF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXJldHVybiAocmVnX2Jhc2UgKyBNRTgxMDBfQ09VTlRFUl9SRUdfMCArIGN0cl9pZHggKiAyKTsKK30KKworc3RhdGljIHVpbnQzMl90IG1lODEwMF9nZXRfY3RybF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlyZXR1cm4gKHJlZ19iYXNlICsgTUU4MTAwX0NPVU5URVJfQ1RSTF9SRUcpOworfQorCittZTgyNTRfc3ViZGV2aWNlX3QgKm1lODI1NF9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgsCisJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY2xrX3NyY19yZWdfbG9jaykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UKKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyNTRfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIDgyNTQgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODI1NF9zdWJkZXZpY2VfdCkpOworCisJLy8gQ2hlY2sgaWYgY291bnRlciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKworCWlmIChjdHJfaWR4ID4gMikgeworCQlQRVJST1IoIkNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKwlzdWJkZXZpY2UtPmNsa19zcmNfcmVnX2xvY2sgPSBjbGtfc3JjX3JlZ19sb2NrOworCisJLy8gU2F2ZSB0eXBlIG9mIE1laWxoYXVzIGRldmljZQorCXN1YmRldmljZS0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCisJLy8gU2F2ZSB0aGUgaW5kaWNlcworCXN1YmRldmljZS0+bWU4MjU0X2lkeCA9IG1lODI1NF9pZHg7CisJc3ViZGV2aWNlLT5jdHJfaWR4ID0gY3RyX2lkeDsKKworCS8vIERvIGRldmljZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbgorCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoJLy8gRmFsbCB0aHJvdWdoCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJLy8gQ2hlY2sgaWYgODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkJaWYgKG1lODI1NF9pZHggPiAxKSB7CisJCQlQRVJST1IoIjgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGNhcGFiaWxpdGllcworCQlpZiAoY3RyX2lkeCA9PSAwKQorCQkJc3ViZGV2aWNlLT5jYXBzID0KKwkJCSAgICBNRV9DQVBTX0NUUl9DTEtfSU5URVJOQUxfMU1IWiB8CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCSAgICBNRV9DQVBTX0NUUl9DTEtfRVhURVJOQUw7CisJCWVsc2UKKwkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX1BSRVZJT1VTIHwgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTE0MDBBQl9nZXRfdmFsX3JlZyhyZWdfYmFzZSwgbWU4MjU0X2lkeCwgY3RyX2lkeCk7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPQorCQkgICAgbWUxNDAwQUJfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9CisJCSAgICBtZTE0MDBBQl9nZXRfY2xrX3NyY19yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gNCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJLy8gQ2hlY2sgaWYgODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkJaWYgKG1lODI1NF9pZHggPiA5KSB7CisJCQlQRVJST1IoIjgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGNhcGFiaWxpdGllcworCQlpZiAoY3RyX2lkeCA9PSAwKSB7CisJCQlpZiAobWU4MjU0X2lkeCA9PSAwKQorCQkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19QUkVWSU9VUyB8CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCQkJZWxzZQorCQkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCQl9IGVsc2UKKwkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX1BSRVZJT1VTIHwgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTE0MDBDRF9nZXRfdmFsX3JlZyhyZWdfYmFzZSwgbWU4MjU0X2lkeCwgY3RyX2lkeCk7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPQorCQkgICAgbWUxNDAwQ0RfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9CisJCSAgICBtZTE0MDBDRF9nZXRfY2xrX3NyY19yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvLyBJbml0aWFsaXplIHRoZSBjb3VudGVycyBjYXBhYmlsaXRpZXMKKwkJc3ViZGV2aWNlLT5jYXBzID0gTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTQ2MDBfZ2V0X3ZhbF9yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0KKwkJICAgIG1lNDYwMF9nZXRfY3RybF9yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlzdWJkZXZpY2UtPmNsa19zcmNfcmVnID0gMDsJLy8gTm90IHVzZWQKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCQkvLyBDaGVjayBpZiA4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZQorCQlpZiAobWU4MjU0X2lkeCA+IDApIHsKKwkJCVBFUlJPUigiODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY291bnRlcnMgY2FwYWJpbGl0aWVzCisJCXN1YmRldmljZS0+Y2FwcyA9IE1FX0NBUFNfQ1RSX0NMS19FWFRFUk5BTDsKKworCQkvLyBHZXQgdGhlIGNvdW50ZXJzIHJlZ2lzdGVycworCQlzdWJkZXZpY2UtPnZhbF9yZWcgPQorCQkgICAgbWU4MTAwX2dldF92YWxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9CisJCSAgICBtZTgxMDBfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9IDA7CS8vIE5vdCB1c2VkCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisJCVBFUlJPUigiTm8gODI1NCBzdWJkZXZpY2VzIGF2YWlsYWJsZSBmb3Igc3ViZGV2aWNlIGRldmljZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiVW5rbm93biBkZXZpY2UgdHlwZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBPdmVybG9hZCBzdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzLgorCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjU0X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZTgyNTRfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjU0X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWU4MjU0X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODI1NF9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTQuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzJiNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogQGZpbGUgbWU4MjU0LmgKKyAqCisgKiBAYnJpZWYgODI1NCBjb3VudGVyIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODI1NF9IXworI2RlZmluZSBfTUU4MjU0X0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIDgyNTQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgyNTRfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjbGtfc3JjX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1aW50MzJfdCBkZXZpY2VfaWQ7CQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIHR5cGUgY2FycnlpbmcgdGhlIDgyNTQgY2hpcC4gKi8KKwlpbnQgbWU4MjU0X2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIDgyNTQgY2hpcCBvbiB0aGUgZGV2aWNlLiAqLworCWludCBjdHJfaWR4OwkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgY291bnRlciBvbiB0aGUgODI1NCBjaGlwLiAqLworCisJaW50IGNhcHM7CQkJCS8qKjwgSG9sZHMgdGhlIGRldmljZSBjYXBhYmlsaXRpZXMuICovCisKKwl1bnNpZ25lZCBsb25nIHZhbF9yZWc7CQkJLyoqPCBIb2xkcyB0aGUgYWN0dWFsIGNvdW50ZXIgdmFsdWUuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgODI1NCBtb2Rlcy4gKi8KKwl1bnNpZ25lZCBsb25nIGNsa19zcmNfcmVnOwkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIGNvdW50ZXIgY29ubmVjdGlvbnMuICovCit9IG1lODI1NF9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgODI1NCBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBraW5kIG9mIE1laWxoYXVzIGRldmljZSBob2xkaW5nIHRoZSA4MjU0LgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWU4MjU0X2lkeCBUaGUgaW5kZXggb2YgdGhlIDgyNTQgY2hpcCBvbiB0aGUgTWVpbGhhdXMgZGV2aWNlLgorICogQHBhcmFtIGN0cl9pZHggVGhlIGluZGV4IG9mIHRoZSBjb3VudGVyIGluc2lkZSBhIDgyNTQgY2hpcC4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIDgyNTQgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICogQHBhcmFtIGNsa19zcmNfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyNTRfc3ViZGV2aWNlX3QgKm1lODI1NF9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgsCisJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY2xrX3NyY19yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU0X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTJjMzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NF9yZWcuaApAQCAtMCwwICsxLDE3MiBAQAorLyoqCisgKiBAZmlsZSBtZTgyNTRfcmVnLmgKKyAqCisgKiBAYnJpZWYgODI1NCBjb3VudGVyIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FODI1NF9SRUdfSF8KKyNkZWZpbmUgX01FODI1NF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogTUUxNDAwIEEvQiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX1ZBTF9SRUcJCTB4MDAwNCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMV9WQUxfUkVHCQkweDAwMDUgLyoqPCBPZmZzZXQgb2YgODI1NCBBIGNvdW50ZXIgMSB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzJfVkFMX1JFRwkJMHgwMDA2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDIgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV9DVFJMX1JFRwkJMHgwMDA3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8wX1ZBTF9SRUcJCTB4MDAwQyAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMV9WQUxfUkVHCQkweDAwMEQgLyoqPCBPZmZzZXQgb2YgODI1NCBCIGNvdW50ZXIgMSB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzJfVkFMX1JFRwkJMHgwMDBFIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDIgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl9DVFJMX1JFRwkJMHgwMDBGIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMEFCX0NMS19TUkNfUkVHCQkJMHgwMDEwIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3Rlci4gKi8KKworLyogTUUxNDAwIEMgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8wX1ZBTF9SRUcJCTB4MDAwNCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8xX1ZBTF9SRUcJCTB4MDAwNSAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8yX1ZBTF9SRUcJCTB4MDAwNiAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV9DVFJMX1JFRwkJCTB4MDAwNyAvKio8IE9mZnNldCBvZiA4MjU0IEEgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8wX1ZBTF9SRUcJCTB4MDAwQyAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8xX1ZBTF9SRUcJCTB4MDAwRCAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8yX1ZBTF9SRUcJCTB4MDAwRSAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl9DVFJMX1JFRwkJCTB4MDAwRiAvKio8IE9mZnNldCBvZiA4MjU0IEIgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18wX1ZBTF9SRUcJCTB4MDAxMCAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18xX1ZBTF9SRUcJCTB4MDAxMSAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18yX1ZBTF9SRUcJCTB4MDAxMiAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ19DVFJMX1JFRwkJCTB4MDAxMyAvKio8IE9mZnNldCBvZiA4MjU0IEMgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8wX1ZBTF9SRUcJCTB4MDAxNCAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8xX1ZBTF9SRUcJCTB4MDAxNSAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8yX1ZBTF9SRUcJCTB4MDAxNiAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF9DVFJMX1JFRwkJCTB4MDAxNyAvKio8IE9mZnNldCBvZiA4MjU0IEQgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8wX1ZBTF9SRUcJCTB4MDAxOCAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8xX1ZBTF9SRUcJCTB4MDAxOSAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8yX1ZBTF9SRUcJCTB4MDAxQSAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV9DVFJMX1JFRwkJCTB4MDAxQiAvKio8IE9mZnNldCBvZiA4MjU0IEUgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDX0NMS19TUkNfMF9SRUcgIAkJCTB4MDAxQyAvKio8IE9mZnNldCBvZiBjbG9jayBzb3VyY2UgcmVnaXN0ZXIgMC4gKi8KKyNkZWZpbmUgTUUxNDAwQ19DTEtfU1JDXzFfUkVHICAJCQkweDAwMUQgLyoqPCBPZmZzZXQgb2YgY2xvY2sgc291cmNlIHJlZ2lzdGVyIDEuICovCisjZGVmaW5lIE1FMTQwMENfQ0xLX1NSQ18yX1JFRyAgCQkJMHgwMDFFIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3RlciAyLiAqLworCisvKiBNRTE0MDAgRCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzBfVkFMX1JFRwkJMHgwMDQ0IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzFfVkFMX1JFRwkJMHgwMDQ1IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzJfVkFMX1JFRwkJMHgwMDQ2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BX0NUUkxfUkVHCQkJMHgwMDQ3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzBfVkFMX1JFRwkJMHgwMDRDIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzFfVkFMX1JFRwkJMHgwMDREIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzJfVkFMX1JFRwkJMHgwMDRFIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CX0NUUkxfUkVHCQkJMHgwMDRGIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzBfVkFMX1JFRwkJMHgwMDUwIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzFfVkFMX1JFRwkJMHgwMDUxIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzJfVkFMX1JFRwkJMHgwMDUyIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DX0NUUkxfUkVHCQkJMHgwMDUzIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzBfVkFMX1JFRwkJMHgwMDU0IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzFfVkFMX1JFRwkJMHgwMDU1IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzJfVkFMX1JFRwkJMHgwMDU2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EX0NUUkxfUkVHCQkJMHgwMDU3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzBfVkFMX1JFRwkJMHgwMDU4IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzFfVkFMX1JFRwkJMHgwMDU5IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzJfVkFMX1JFRwkJMHgwMDVBIC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FX0NUUkxfUkVHCQkJMHgwMDVCIC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfQ0xLX1NSQ18wX1JFRyAgCQkJMHgwMDVDIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3RlciAwLiAqLworI2RlZmluZSBNRTE0MDBEX0NMS19TUkNfMV9SRUcgIAkJCTB4MDA1RCAvKio8IE9mZnNldCBvZiBjbG9jayBzb3VyY2UgcmVnaXN0ZXIgMS4gKi8KKyNkZWZpbmUgTUUxNDAwRF9DTEtfU1JDXzJfUkVHICAJCQkweDAwNUUgLyoqPCBPZmZzZXQgb2YgY2xvY2sgc291cmNlIHJlZ2lzdGVyIDIuICovCisKKy8qIE1FNDYwMCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FNDYwMF84MjU0XzBfVkFMX1JFRwkJCTB4MDAwMCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfODI1NF8xX1ZBTF9SRUcJCQkweDAwMDEgLyoqPCBPZmZzZXQgb2YgODI1NCBBIGNvdW50ZXIgMCB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUU0NjAwXzgyNTRfMl9WQUxfUkVHCQkJMHgwMDAyIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF84MjU0X0NUUkxfUkVHCQkJMHgwMDAzIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisvKiBDb21tYW5kIHdvcmRzIGZvciA4MjU0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfU0MwICAgMHgwMAkgLyoqPCBDb3VudGVyIDAgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9TQzEgICAweDQwCSAvKio8IENvdW50ZXIgMSBzZWxlY3Rpb24uICovCisjZGVmaW5lIE1FODI1NF9DVFJMX1NDMiAgIDB4ODAJIC8qKjwgQ291bnRlciAyIHNlbGVjdGlvbi4gKi8KKworI2RlZmluZSBNRTgyNTRfQ1RSTF9UTE8gICAweDAwCSAvKio8IENvdW50ZXIgbGF0Y2hpbmcgb3BlcmF0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9MU0IgICAweDEwCSAvKio8IE9ubHkgcmVhZCBMU0IuICovCisjZGVmaW5lIE1FODI1NF9DVFJMX01TQiAgIDB4MjAJIC8qKjwgT25seSByZWFkIE1TQi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTE0gICAgMHgzMAkgLyoqPCBGaXJzdCByZWFkIExTQiwgdGhlbiBNU0IuICAqLworCisjZGVmaW5lIE1FODI1NF9DVFJMX00wICAgIDB4MDAJIC8qKjwgTW9kZSAwIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTTEgICAgMHgwMgkgLyoqPCBNb2RlIDEgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9NMiAgICAweDA0CSAvKio8IE1vZGUgMiBzZWxlY3Rpb24uICovCisjZGVmaW5lIE1FODI1NF9DVFJMX00zICAgIDB4MDYJIC8qKjwgTW9kZSAzIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTTQgICAgMHgwOAkgLyoqPCBNb2RlIDQgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9NNSAgICAweDBBCSAvKio8IE1vZGUgNSBzZWxlY3Rpb24uICovCisKKyNkZWZpbmUgTUU4MjU0X0NUUkxfQklOICAgMHgwMAkgLyoqPCBCaW5hcnkgY291bnRlci4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfQkNEICAgMHgwMQkgLyoqPCBCQ0QgY291bnRlci4gKi8KKworLyogTUUtMTQwMCBBL0IgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzBfQ0xLX1NSQ18xTUhaCQkoMCA8PCA3KQkvKio8IDFNSHogY2xvY2suICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfMTBNSFoJCSgxIDw8IDcpCS8qKjwgMTBNSHogY2xvY2suICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUElOCQkoMCA8PCA2KQkvKio8IENMSyAwIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaCQkoMSA8PCA2KQkvKio8IENvbm5lY3QgQ0xLIDAgd2l0aCBxdWFyei4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMV9DTEtfU1JDX1BJTgkJKDAgPDwgNSkJLyoqPCBDTEsgMSB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzFfQ0xLX1NSQ19QUkVWCQkoMSA8PCA1KQkvKio8IENvbm5lY3QgT1VUIDAgd2l0aCBDTEsgMS4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMl9DTEtfU1JDX1BJTgkJKDAgPDwgNCkJLyoqPCBDTEsgMiB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWCQkoMSA8PCA0KQkvKio8IENvbm5lY3QgT1VUIDEgd2l0aCBDTEsgMi4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDXzFNSFoJCSgwIDw8IDMpCS8qKjwgMU1IeiBjbG9jay4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWgkJKDEgPDwgMykJLyoqPCAxME1IeiBjbG9jay4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ19QSU4JCSgwIDw8IDIpCS8qKjwgQ0xLIDAgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8wX0NMS19TUkNfUVVBUloJCSgxIDw8IDIpCS8qKjwgQ29ubmVjdCBDTEsgMCB3aXRoIHF1YXJ6LiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUElOCQkoMCA8PCAxKQkvKio8IENMSyAxIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMV9DTEtfU1JDX1BSRVYJCSgxIDw8IDEpCS8qKjwgQ29ubmVjdCBPVVQgMCB3aXRoIENMSyAxLiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8yX0NMS19TUkNfUElOCQkoMCA8PCAwKQkvKio8IENMSyAyIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMl9DTEtfU1JDX1BSRVYJCSgxIDw8IDApCS8qKjwgQ29ubmVjdCBPVVQgMSB3aXRoIENMSyAyLiAqLworCisvKiBNRS0xNDAwIEMvRCBjbG9jayBzb3VyY2UgcmVnaXN0ZXJzIGJpdHMgKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0sJMHgwMwkvKio8IE1hc2tzIGFsbCBDTEsgc291cmNlIGJpdHMuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QSU4JCTB4MDAJLyoqPCBDb25uZWN0IENMSyB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDXzFNSFoJMHgwMQkvKio8IENvbm5lY3QgQ0xLIHRvIDFNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xME1IWgkweDAyCS8qKjwgQ29ubmVjdCBDTEsgdG8gMTBNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QUkVWCTB4MDMJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dCBvbiBNRS0xNDAwIEQgZXh0ZW5zaW9uLiAqLworCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLCTB4MDQJLyoqPCBNYXNrcyBhbGwgQ0xLIHNvdXJjZSBiaXRzLiAqLworI2RlZmluZSBNRTE0MDBDRF84MjU0X0FDRV8xX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19QUkVWCTB4MDQJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0FDRV8yX0NMS19TUkNfTUFTSwkweDA4CS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX1BJTgkJMHgwMAkvKio8IENvbm5lY3QgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzJfQ0xLX1NSQ19QUkVWCTB4MDgJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLCQkweDMwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8wX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDXzFNSFoJCTB4MTAJLyoqPCBDb25uZWN0IENMSyB0byAxTUh6LiAqLworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ18xME1IWgkweDIwCS8qKjwgQ29ubmVjdCBDTEsgdG8gMTBNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDX1BSRVYJCTB4MzAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19NQVNLCQkweDQwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8xX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX1BSRVYJCTB4NDAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLCQkweDgwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8yX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX1BSRVYJCTB4ODAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworLyogTUUtODEwMCBjb3VudGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBNRTgxMDBfQ09VTlRFUl9SRUdfMAkJCQkweDE4CS8vKHIsdykKKyNkZWZpbmUgTUU4MTAwX0NPVU5URVJfUkVHXzEJCQkJMHgxQQkvLyhyLHcpCisjZGVmaW5lIE1FODEwMF9DT1VOVEVSX1JFR18yCQkJCTB4MUMJLy8ocix3KQorI2RlZmluZSBNRTgxMDBfQ09VTlRFUl9DVFJMX1JFRwkJCQkweDFFCS8vKHIsdykKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBlN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NS5jCkBAIC0wLDAgKzEsNDYyIEBACisvKioKKyAqIEBmaWxlIG1lODI1NS5jCisgKgorICogQGJyaWVmIDgyNTUgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWU4MjU1X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdWludDhfdCBnZXRfbW9kZV9mcm9tX21pcnJvcih1aW50MzJfdCBtaXJyb3IpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKG1pcnJvciAmIE1FODI1NV9QT1JUXzBfT1VUUFVUKSB7CisJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8xX09VVFBVVCkgeworCQkJaWYgKG1pcnJvciAmIE1FODI1NV9QT1JUXzJfT1VUUFVUKSB7CisJCQkJcmV0dXJuIE1FODI1NV9NT0RFX09PTzsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIE1FODI1NV9NT0RFX0lPTzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8yX09VVFBVVCkgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9PSU87CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9JSU87CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWlycm9yICYgTUU4MjU1X1BPUlRfMV9PVVRQVVQpIHsKKwkJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8yX09VVFBVVCkgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9PT0k7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9JT0k7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobWlycm9yICYgTUU4MjU1X1BPUlRfMl9PVVRQVVQpIHsKKwkJCQlyZXR1cm4gTUU4MjU1X01PREVfT0lJOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gTUU4MjU1X01PREVfSUlJOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1lODI1NV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU4MjU1X3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCSppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yICY9CisJICAgIH4oTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCW91dGIoZ2V0X21vZGVfZnJvbV9taXJyb3IoKmluc3RhbmNlLT5jdHJsX3JlZ19taXJyb3IpLAorCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRiKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NV9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgaW50IHJlZiwKKwkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyNTVfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjU1X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkqaW5zdGFuY2UtPmN0cmxfcmVnX21pcnJvciAmPQorCQkgICAgfihNRTgyNTVfUE9SVF8wX09VVFBVVCA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJCW91dGIoZ2V0X21vZGVfZnJvbV9taXJyb3IoKmluc3RhbmNlLT5jdHJsX3JlZ19taXJyb3IpLAorCQkgICAgIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCSppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yIHw9CisJCSAgICAoTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCQlvdXRiKGdldF9tb2RlX2Zyb21fbWlycm9yKCppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yKSwKKwkJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU1X2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjU1X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyNTVfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyNTVfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgYnl0ZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCWlmICgqaW5zdGFuY2UtPgorCQkJICAgIGN0cmxfcmVnX21pcnJvciAmIChNRTgyNTVfUE9SVF8wX09VVFBVVCA8PAorCQkJCQkgICAgICAgaW5zdGFuY2UtPmRpb19pZHgpKSB7CisJCQkJYnl0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJCQkJaWYgKHZhbHVlKQorCQkJCQlieXRlIHw9IDB4MSA8PCBjaGFubmVsOworCQkJCWVsc2UKKwkJCQkJYnl0ZSAmPSB+KDB4MSA8PCBjaGFubmVsKTsKKworCQkJCW91dGIoYnl0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoKmluc3RhbmNlLT4KKwkJCSAgICBjdHJsX3JlZ19taXJyb3IgJiAoTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwKKwkJCQkJICAgICAgIGluc3RhbmNlLT5kaW9faWR4KSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU1X3F1ZXJ5X251bWJlcl9jaGFubmVscyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCWludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gTUU4MjU1X05VTUJFUl9DSEFOTkVMUzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyNTVfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU4MjU1X3N1YmRldmljZV90ICptZTgyNTVfY29uc3RydWN0b3IodWludDMyX3QgZGV2aWNlX2lkLAorCQkJCSAgICAgICB1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG1lODI1NV9pZHgsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCSAgICAgICBpbnQgKmN0cmxfcmVnX21pcnJvciwKKwkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MjU1X3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MjU1X3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciA4MjU1IGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgyNTVfc3ViZGV2aWNlX3QpKTsKKworCS8qIENoZWNrIGlmIGNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoZGlvX2lkeCA+IDIpIHsKKwkJUEVSUk9SKCJESU8gaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIGdsb2JhbCBwb3J0IHNldHRpbmdzICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19taXJyb3IgPSBjdHJsX3JlZ19taXJyb3I7CisKKwkvKiBTYXZlIHR5cGUgb2YgTWVpbGhhdXMgZGV2aWNlICovCisJc3ViZGV2aWNlLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisKKwkvKiBTYXZlIHRoZSBpbmRpY2VzICovCisJc3ViZGV2aWNlLT5tZTgyNTVfaWR4ID0gbWU4MjU1X2lkeDsKKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogRG8gZGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJLyogQ2hlY2sgaWYgODI1NSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgKi8KKwkJaWYgKG1lODI1NV9pZHggPiAxKSB7CisJCQlQRVJST1IoIjgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogR2V0IHRoZSByZWdpc3RlcnMgKi8KKwkJaWYgKG1lODI1NV9pZHggPT0gMCkgeworCQkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUxNDAwQUJfUE9SVF9BX0NUUkw7CisJCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FMTQwMEFCX1BPUlRfQV8wICsgZGlvX2lkeDsKKwkJfSBlbHNlIGlmIChtZTgyNTVfaWR4ID09IDEpIHsKKwkJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTQwMEFCX1BPUlRfQl9DVFJMOworCQkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTE0MDBBQl9QT1JUX0JfMCArIGRpb19pZHg7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMSkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIEdldCB0aGUgcmVnaXN0ZXJzICovCisJCWlmIChtZTgyNTVfaWR4ID09IDApIHsKKwkJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTQwMENEX1BPUlRfQV9DVFJMOworCQkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTE0MDBDRF9QT1JUX0FfMCArIGRpb19pZHg7CisJCX0gZWxzZSBpZiAobWU4MjU1X2lkeCA9PSAxKSB7CisJCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTE0MDBDRF9QT1JUX0JfQ1RSTDsKKwkJCXN1YmRldmljZS0+cG9ydF9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUUxNDAwQ0RfUE9SVF9CXzAgKyBkaW9faWR4OworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIlVua25vd24gZGV2aWNlIHR5cGUuIGRldiBJRDogMHglMDR4XG4iLCBkZXZpY2VfaWQpOworCisJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPdmVybG9hZCBzdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjU1X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZTgyNTVfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjU1X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWU4MjU1X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODI1NV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODI1NV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjU1X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzgyMzAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qKgorICogQGZpbGUgbWU4MjU1LmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgUElPIDgyNTUgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUU4MjU1X0hfCisjZGVmaW5lIF9NRTgyNTVfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgODI1NSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODI1NV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwlpbnQgKmN0cmxfcmVnX21pcnJvcjsJCQkvKio8IFBvaW50ZXIgdG8gbWlycm9yIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBhbmQgI2N0cmxfcmVnX21pcnJvciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgZGV2aWNlX2lkOwkJCQkvKio8IFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgaG9sZGluZyB0aGUgODI1NSBjaGlwLiAqLworCWludCBtZTgyNTVfaWR4OwkJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIDgyNTUgY2hpcCBvbiB0aGUgZGV2aWNlLiAqLworCWludCBkaW9faWR4OwkJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIERJTyBwb3J0IG9uIHRoZSA4MjU1IGNoaXAuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gcmVhZCBvciB3cml0ZSBhIHZhbHVlIGZyb20gb3IgdG8gdGhlIHBvcnQgcmVzcGVjdGl2ZWx5LiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIDgyNTUgbW9kZXMuICovCit9IG1lODI1NV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgODI1NSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBraW5kIG9mIE1laWxoYXVzIGRldmljZSBob2xkaW5nIHRoZSA4MjU1LgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWU4MjU1X2lkeCBUaGUgaW5kZXggb2YgdGhlIDgyNTUgY2hpcCBvbiB0aGUgTWVpbGhhdXMgZGV2aWNlLgorICogQHBhcmFtIGRpb19pZHggVGhlIGluZGV4IG9mIHRoZSBjb3VudGVyIGluc2lkZSBhIDgyNTUgY2hpcC4KKyAqIEBwYXJhbSBjdHJfcmVnX21pcnJvciBQb2ludGVyIHRvIG1pcnJvciBvZiBjb250cm9sIHJlZ2lzdGVyLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgODI1NSBjb250cm9sIHJlZ2lzdGVyIGFuZCAjY3RybF9yZWdfbWlycm9yIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyNTVfc3ViZGV2aWNlX3QgKm1lODI1NV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU1X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJICAgICAgIGludCAqY3RybF9yZWdfbWlycm9yLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU1X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRlYTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NV9yZWcuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIEBmaWxlIG1lODI1NV9yZWcuaAorICoKKyAqIEBicmllZiA4MjU1IGNvdW50ZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUU4MjU1X1JFR19IXworI2RlZmluZSBfTUU4MjU1X1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODI1NV9OVU1CRVJfQ0hBTk5FTFMJCTgJCS8qKjwgVGhlIG51bWJlciBvZiBjaGFubmVscyBwZXIgODI1NSBwb3J0LiAqLworCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQV8wCQkJMHgwMDAwCS8qKjwgUG9ydCAwIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9BXzEJCQkweDAwMDEJLyoqPCBQb3J0IDEgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBBQl9QT1JUX0FfMgkJCTB4MDAwMgkvKio8IFBvcnQgMiBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQV9DVFJMCQkweDAwMDMJLyoqPCBDb250cm9sIHJlZ2lzdGVyIGZvciA4MjU1IEEuICovCisKKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9CXzAJCQkweDAwMDgJLyoqPCBQb3J0IDAgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBBQl9QT1JUX0JfMQkJCTB4MDAwOQkvKio8IFBvcnQgMSBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQl8yCQkJMHgwMDBBCS8qKjwgUG9ydCAyIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9CX0NUUkwJCTB4MDAwQgkvKio8IENvbnRyb2wgcmVnaXN0ZXIgZm9yIDgyNTUgQi4gKi8KKworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0FfMAkJCTB4MDAwMAkvKio8IFBvcnQgMCBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQV8xCQkJMHgwMDAxCS8qKjwgUG9ydCAxIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfUE9SVF9BXzIJCQkweDAwMDIJLyoqPCBQb3J0IDIgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0FfQ1RSTAkJMHgwMDAzCS8qKjwgQ29udHJvbCByZWdpc3RlciBmb3IgODI1NSBBLiAqLworCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQl8wCQkJMHgwMDQwCS8qKjwgUG9ydCAwIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfUE9SVF9CXzEJCQkweDAwNDEJLyoqPCBQb3J0IDEgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0JfMgkJCTB4MDA0MgkvKio8IFBvcnQgMiBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQl9DVFJMCQkweDAwNDMJLyoqPCBDb250cm9sIHJlZ2lzdGVyIGZvciA4MjU1IEIuICovCisKKyNkZWZpbmUgTUU4MjU1X01PREVfT09PCQkJCTB4ODAJLyoqPCBQb3J0IDIgPSBPdXRwdXQsIFBvcnQgMSA9IE91dHB1dCwgUG9ydCAwID0gT3V0cHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lPTwkJCQkweDg5CS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IE91dHB1dCAqLworI2RlZmluZSBNRTgyNTVfTU9ERV9PSU8JCQkJMHg4MgkvKio8IFBvcnQgMiA9IE91dHB1dCwgUG9ydCAxID0gSW5wdXQsICBQb3J0IDAgPSBPdXRwdXQgKi8KKyNkZWZpbmUgTUU4MjU1X01PREVfSUlPCQkJCTB4OEIJLyoqPCBQb3J0IDIgPSBJbnB1dCwgIFBvcnQgMSA9IElucHV0LCAgUG9ydCAwID0gT3V0cHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX09PSQkJCQkweDkwCS8qKjwgUG9ydCAyID0gT3V0cHV0LCBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lPSQkJCQkweDk5CS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX09JSQkJCQkweDkyCS8qKjwgUG9ydCAyID0gT3V0cHV0LCBQb3J0IDEgPSBJbnB1dCwgIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lJSQkJCQkweDlCCS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBJbnB1dCwgIFBvcnQgMCA9IElucHV0ICovCisKKyNkZWZpbmUgTUU4MjU1X1BPUlRfMF9PVVRQVVQJCTB4MQkJLyoqPCBJZiBzZXQgaW4gbWlycm9yIHRoZW4gcG9ydCAwIGlzIGluIG91dHB1dCBtb2RlLiAqLworI2RlZmluZSBNRTgyNTVfUE9SVF8xX09VVFBVVAkJMHgyCQkvKio8IElmIHNldCBpbiBtaXJyb3IgdGhlbiBwb3J0IDEgaXMgaW4gb3V0cHV0IG1vZGUuICovCisjZGVmaW5lIE1FODI1NV9QT1JUXzJfT1VUUFVUCQkweDQJCS8qKjwgSWYgc2V0IGluIG1pcnJvciB0aGVuIHBvcnQgMiBpcyBpbiBvdXRwdXQgbW9kZS4gKi8KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWNpcmNfYnVmLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjaXJjX2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjU5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjaXJjX2J1Zi5oCkBAIC0wLDAgKzEsMTMxIEBACisvKioKKyAqIEBmaWxlIG1lY2lyY19idWYuaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBjaXJjdWxhciBidWZmZXIgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlICAoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FQ0lSQ19CVUZfSF8KKyNkZWZpbmUgX01FQ0lSQ19CVUZfSF8KKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGlmZGVmIEJPU0NICisKK3R5cGVkZWYgc3RydWN0IG1lX2NpcmNfYnVmIHsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKy8vICAgICAgdW5zaWduZWQgaW50IGNvdW50OworCXVpbnQzMl90ICpidWY7CisJaW50IHZvbGF0aWxlIGhlYWQ7CisJaW50IHZvbGF0aWxlIHRhaWw7Cit9IG1lX2NpcmNfYnVmX3Q7CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3ZhbHVlcyhtZV9jaXJjX2J1Zl90ICogYnVmKQoreworLy8gICAgICByZXR1cm4gKChidWYtPmhlYWQgLSBidWYtPnRhaWwpICYgKGJ1Zi0+Y291bnQgLSAxKSk7CisJcmV0dXJuICgoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSAmIChidWYtPm1hc2spKTsKK30KKworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfc3BhY2UobWVfY2lyY19idWZfdCAqIGJ1ZikKK3sKKy8vICAgICAgcmV0dXJuICgoYnVmLT50YWlsIC0gKGJ1Zi0+aGVhZCArIDEpKSAmIChidWYtPmNvdW50IC0gMSkpOworCXJldHVybiAoKGJ1Zi0+dGFpbCAtIChidWYtPmhlYWQgKyAxKSkgJiAoYnVmLT5tYXNrKSk7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3ZhbHVlc190b19lbmQobWVfY2lyY19idWZfdCAqIGJ1ZikKK3sKKwlpbnQgZW5kOworCWludCBuOworLy8gICAgICBlbmQgPSBidWYtPmNvdW50IC0gYnVmLT50YWlsOworLy8gICAgICBuID0gKGJ1Zi0+aGVhZCArIGVuZCkgJiAoYnVmLT5jb3VudCAtIDEpOworCWVuZCA9IGJ1Zi0+bWFzayArIDEgLSBidWYtPnRhaWw7CisJbiA9IChidWYtPmhlYWQgKyBlbmQpICYgKGJ1Zi0+bWFzayk7CisJcmV0dXJuIChuIDwgZW5kKSA/IG4gOiBlbmQ7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCWludCBlbmQ7CisJaW50IG47CisKKy8vICAgICAgZW5kID0gYnVmLT5jb3VudCAtIDEgLSBidWYtPmhlYWQ7CisvLyAgICAgIG4gPSAoZW5kICsgYnVmLT50YWlsKSAmIChidWYtPmNvdW50IC0gMSk7CisJZW5kID0gYnVmLT5tYXNrIC0gYnVmLT5oZWFkOworCW4gPSAoZW5kICsgYnVmLT50YWlsKSAmIChidWYtPm1hc2spOworCXJldHVybiAobiA8PSBlbmQpID8gbiA6IChlbmQgKyAxKTsKK30KKworI2RlZmluZSBfQ0JVRkZfMzJiX3QKKworIyAgZWxzZQkvL35CT1NDSAorLy8vIEBub3RlIGJ1Zi0+bWFzayA9IGJ1Zi0+Y291bnQtMSA9IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVC0xCisKKyMgICBpZmRlZiBfQ0JVRkZfMzJiX3QKKwkvLzMyIGJpdAordHlwZWRlZiBzdHJ1Y3QgbWVfY2lyY19idWZfMzJiIHsKKwlpbnQgdm9sYXRpbGUgaGVhZDsKKwlpbnQgdm9sYXRpbGUgdGFpbDsKKwl1bnNpZ25lZCBpbnQgbWFzazsJLy9idWZmb3Igc2l6ZS0xIG11c3QgYmUgMl5uLTEgdG8gd29yaworCXVpbnQzMl90ICpidWY7Cit9IG1lX2NpcmNfYnVmX3Q7CisjICAgZWxzZQorCS8vMTYgYml0Cit0eXBlZGVmIHN0cnVjdCBtZV9jaXJjX2J1Zl8xNmIgeworCWludCB2b2xhdGlsZSBoZWFkOworCWludCB2b2xhdGlsZSB0YWlsOworCXVuc2lnbmVkIGludCBtYXNrOwkvL2J1ZmZvciBzaXplLTEgbXVzdCBiZSAyXm4tMSB0byB3b3JrCisJdWludDE2X3QgKmJ1ZjsKK30gbWVfY2lyY19idWZfdDsKKyMgICBlbmRpZiAvL19DQlVGRl8zMmJfdAorCisvKiogSG93IG1hbnkgdmFsdWVzIGlzIGluIGJ1ZmZlciAqLworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfdmFsdWVzKG1lX2NpcmNfYnVmX3QgKiBidWYpCit7CisJcmV0dXJuICgoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSAmIChidWYtPm1hc2spKTsKK30KKworLyoqIEhvdyBtYW55IHNwYWNlIGxlZnQgKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlKG1lX2NpcmNfYnVmX3QgKiBidWYpCit7CisJcmV0dXJuICgoYnVmLT50YWlsIC0gKGJ1Zi0+aGVhZCArIDEpKSAmIChidWYtPm1hc2spKTsKK30KKworLyoqIEhvdyBtYW55IHZhbHVlcyBjYW4gYmUgcmVhZCBmcm9tIGJ1ZmZvciBpbiBvbmUgY2h1bmNrLiAqLworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfdmFsdWVzX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCXJldHVybiAoYnVmLT50YWlsIDw9CisJCWJ1Zi0+aGVhZCkgPyAoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSA6IChidWYtPm1hc2sgLSBidWYtPnRhaWwgKworCQkJCQkJCTEpOworfQorCisvKiogSG93IG1hbnkgdmFsdWVzIGNhbiBiZSB3cml0ZSB0byBidWZmZXIgaW4gb25lIGNodW5jay4gKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCXJldHVybiAoYnVmLT50YWlsIDw9CisJCWJ1Zi0+aGVhZCkgPyAoYnVmLT5tYXNrIC0gYnVmLT5oZWFkICsgMSkgOiAoYnVmLT50YWlsIC0KKwkJCQkJCQkgICAgYnVmLT5oZWFkIC0gMSk7Cit9CisKKyMgIGVuZGlmIC8vQk9TQ0gKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUVDSVJDX0JVRl9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ3YzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lY29tbW9uLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUJOm1lY29tbW9uLmgKKyAqIEF1dGhvcgk6R0cgKEd1ZW50ZXIgR2ViaGFyZHQpCTxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICogQXV0aG9yCTpLRyAoS3J6eXN6dG9mIEdhbnR6a2UpCTxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVDT01NT05fSF8KKyNkZWZpbmUgX01FQ09NTU9OX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFRoZSB2ZXJzaW9uIG9mIHRoaXMgcmVsZWFzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBNRV9WRVJTSU9OX0RSSVZFUgorLyogVW5rbm93biB2ZXJzaW9uICovCisjIGRlZmluZSBNRV9WRVJTSU9OX0RSSVZFUgkweEZGRkZGRkZGCisjZW5kaWYKKworI2lmbmRlZiBMSUJNRURSSVZFUl9WRVJTSU9OCisvKiBVbmtub3duIHZlcnNpb24gKi8KKyMgZGVmaW5lIExJQk1FRFJJVkVSX1ZFUlNJT04JMHhGRkZGRkZGRgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZDAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qKgorICogQGZpbGUgbWVkZWJ1Zy5oCisgKgorICogQGJyaWVmIERlYnVnZ2luZyBkZWZpbmVzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKyNpZm5kZWYgX01FREVCVUdfSF8KKyNkZWZpbmUgX01FREVCVUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvL01lc3NhZ2VzIGNvbnRyb2wuCisKKyNpZmRlZiBNRURFQlVHX1RFU1RfQUxMCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGFsbCBpbmZvIG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19URVNUCisjICBkZWZpbmUgTUVERUJVR19URVNUCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX1RFU1RfSU5GTworIyAgZGVmaW5lIE1FREVCVUdfVEVTVF9JTkZPCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX0RFQlVHX1JFRworIyAgZGVmaW5lIE1FREVCVUdfREVCVUdfUkVHCS8qIFN3aXRjaCB0byBlbmFibGUgcmVnaXN0cnkgYWNjZXNzIGRlYnVnaW5nIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorIyBpZm5kZWYgTUVERUJVR19ERUJVR19MT0NLUworIyAgZGVmaW5lIE1FREVCVUdfREVCVUdfTE9DS1MJLyogU3dpdGNoIHRvIGVuYWJsZSBsb2NraW5nIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNRURFQlVHX1RFU1RfSU5GTwkvKiBTd2l0Y2ggdG8gZW5hYmxlIGluZm8gIGFuZCB0ZXN0IG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19JTkZPCisjICBkZWZpbmUgTUVERUJVR19JTkZPCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGluZm8gbWVzc2FnZXMuICovCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX1RFU1QKKyMgIGRlZmluZSBNRURFQlVHX1RFU1QKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTUVERUJVR19URVNUCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGRlYnVnIHRlc3QgbWVzc2FnZXMuICovCisjIGlmbmRlZiBNRURFQlVHX0RFQlVHCisjICBkZWZpbmUgTUVERUJVR19ERUJVRwkJLyogU3dpdGNoIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcy4gKi8KKyMgZW5kaWYKKyMgaWZuZGVmIE1FREVCVUdfRVJST1IKKyMgIGRlZmluZSBNRURFQlVHX0VSUk9SCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGVycm9yIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNRURFQlVHX0VSUk9SCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGVycm9yIG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19FUlJPUl9DUklUSUNBTAkvKiBBbHNvIGNyaXRpY2FsIGVycm9yIG1lc3NhZ2VzLiAqLworIyAgZGVmaW5lIE1FREVCVUdfRVJST1JfQ1JJVElDQUwJLyogU3dpdGNoIHRvIGVuYWJsZSBoaWdoIGltcG9ydGFuY2UgZXJyb3IgbWVzc2FnZXMuICovCisjIGVuZGlmCisjZW5kaWYKKworI3VuZGVmIFBERUJVRwkJCS8qIE9ubHkgdG8gYmUgc3VyZS4gKi8KKyN1bmRlZiBQSU5GTwkJCS8qIE9ubHkgdG8gYmUgc3VyZS4gKi8KKyN1bmRlZiBQRVJST1IJCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisjdW5kZWYgUEVSUk9SX0NSSVRJQ0FMCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisjdW5kZWYgUERFQlVHX1JFRwkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBERUJVR19MT0NLUwkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBTRUNVUklUWQkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBMT0cJCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisKKyNpZmRlZiBNRURFQlVHX0RFQlVHCisjIGRlZmluZSBQREVCVUcoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUciTUVfRFJWIEQ6IDwlcz4gIiBmbXQsIF9fRlVOQ1RJT05fXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfREVCVUdfTE9DS1MKKyMgZGVmaW5lIFBERUJVR19MT0NLUyhmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyJNRV9EUlYgTDogPCVzPiAiIGZtdCwgX19GVU5DVElPTl9fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHX0xPQ0tTKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKyMgZGVmaW5lIFBERUJVR19SRUcoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUciTUVfRFJWIFI6IDwlczolZD4gUkVHOiIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHX1JFRyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfSU5GTworIyBkZWZpbmUgUElORk8oZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyJNRV9EUlYgSTogIiBmbXQsICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQSU5GTyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfRVJST1IKKyMgZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIiTUVfRFJWIEU6IDwlczolaT4gIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfRVJST1JfQ1JJVElDQUwKKyMgZGVmaW5lIFBFUlJPUl9DUklUSUNBTChmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSViBDOiA8JXM6JWk+ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQRVJST1JfQ1JJVElDQUwoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKy8vVGhpcyBkZWJ1ZyBpcyBvbmx5IHRvIGRldGVjdCBsb2dpY2FsIGVycm9ycyEKKyMgZGVmaW5lIFBTRUNVUklUWShmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSViBTRUNVUklUWTogPCVzOiVzOiVpPiAiIGZtdCwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjYXJncykKKy8vVGhpcyBkZWJ1ZyBpcyB0byBrZWVwIHRyYWNrIGluIGN1c3RvbWVycycgc3lzdGVtCisjIGRlZmluZSBQTE9HKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0lORk8iTUVfRFJWOiAiIGZtdCwgIyNhcmdzKQorCisvL1RoaXMgZGVidWcgaXMgdG8gY2hlY2sgbmV3IHBhcnRzIGR1cmluZyBkZXZlbG9wbWVudAorI2lmZGVmIE1FREVCVUdfREVWRUxPUAorIyBkZWZpbmUgUERFVkVMT1AoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fQ1JJVCJNRV9EUlY6IDwlczolczolaT4gIiBmbXQsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFVkVMT1AoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNlbmRpZiAvL19fS0VSTkVMX18KKyNlbmRpZiAvL19NRURFQlVHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZWZpbmVzLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1OGVmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlZmluZXMuaApAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWRlZmluZXMuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICogQXV0aG9yICAgICAgOiBLRyAoS3J6eXN6dG9mIEdhbnR6a2UpICA8ay5nYW50emtlQG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FREVGSU5FU19IXworI2RlZmluZSBfTUVERUZJTkVTX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEdlbmVyYWwKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfVkFMVUVfTk9UX1VTRUQJCQkJCQkJMHgwCisjZGVmaW5lIE1FX1ZBTFVFX0lOVkFMSUQJCQkJCQkJfjB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGNvbW1vbiB0byBhY2Nlc3MgZnVuY3Rpb25zCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0xPQ0tfUkVMRUFTRQkJCQkJCQkJMHgwMDAxMDAwMQorI2RlZmluZSBNRV9MT0NLX1NFVAkJCQkJCQkJCTB4MDAwMTAwMDIKKyNkZWZpbmUgTUVfTE9DS19DSEVDSwkJCQkJCQkJMHgwMDAxMDAwMworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lT3BlbiBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9PUEVOX05PX0ZMQUdTCQkJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lQ2xvc2UgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfQ0xPU0VfTk9fRkxBR1MJCQkJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgbWVMb2NrRHJpdmVyIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0xPQ0tfRFJJVkVSX05PX0ZMQUdTCQkJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgbWVMb2NrRGV2aWNlIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0xPQ0tfREVWSUNFX05PX0ZMQUdTCQkJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgbWVMb2NrU3ViZGV2aWNlIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0xPQ0tfU1VCREVWSUNFX05PX0ZMQUdTCQkJCQkweDAKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGNvbW1vbiB0byBlcnJvciBmdW5jdGlvbnMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfRVJST1JfTVNHX01BWF9DT1VOVAkJCQkJCTI1NgorCisjZGVmaW5lIE1FX1NXSVRDSF9ESVNBQkxFCQkJCQkJCTB4MDAwMjAwMDEKKyNkZWZpbmUgTUVfU1dJVENIX0VOQUJMRQkJCQkJCQkweDAwMDIwMDAyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgY29tbW9uIHRvIGlvIGZ1bmN0aW9ucworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9SRUZfRElPX0ZJRk9fTE9XCQkJCQkJCTB4MDAwMzAwMDEKKyNkZWZpbmUgTUVfUkVGX0RJT19GSUZPX0hJR0gJCQkJCQkweDAwMDMwMDAyCisKKyNkZWZpbmUgTUVfUkVGX0NUUl9QUkVWSU9VUwkJCQkJCQkweDAwMDQwMDAxCisjZGVmaW5lIE1FX1JFRl9DVFJfSU5URVJOQUxfMU1IWgkJCQkJMHgwMDA0MDAwMgorI2RlZmluZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaCQkJCQkweDAwMDQwMDAzCisjZGVmaW5lIE1FX1JFRl9DVFJfRVhURVJOQUwJCQkJCQkJMHgwMDA0MDAwNAorCisjZGVmaW5lIE1FX1JFRl9BSV9HUk9VTkQJCQkJCQkJMHgwMDA1MDAwMQorI2RlZmluZSBNRV9SRUZfQUlfRElGRkVSRU5USUFMCQkJCQkJMHgwMDA1MDAwMgorCisjZGVmaW5lIE1FX1JFRl9BT19HUk9VTkQJCQkJCQkJMHgwMDA2MDAwMQorCisjZGVmaW5lIE1FX1RSSUdfQ0hBTl9ERUZBVUxUCQkJCQkJMHgwMDA3MDAwMQorI2RlZmluZSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMJCQkJCTB4MDAwNzAwMDIKKworI2RlZmluZSBNRV9UUklHX1RZUEVfTk9ORQkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1RSSUdfVFlQRV9TVwkJCQkJCQkJMHgwMDA4MDAwMQorI2RlZmluZSBNRV9UUklHX1RZUEVfVEhSRVNIT0xECQkJCQkJMHgwMDA4MDAwMgorI2RlZmluZSBNRV9UUklHX1RZUEVfV0lORE9XCQkJCQkJCTB4MDAwODAwMDMKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0VER0UJCQkJCQkJMHgwMDA4MDAwNAorI2RlZmluZSBNRV9UUklHX1RZUEVfU0xPUEUJCQkJCQkJMHgwMDA4MDAwNQorI2RlZmluZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwJCQkJCTB4MDAwODAwMDYKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0VYVF9BTkFMT0cJCQkJCQkweDAwMDgwMDA3CisjZGVmaW5lIE1FX1RSSUdfVFlQRV9QQVRURVJOCQkJCQkJMHgwMDA4MDAwOAorI2RlZmluZSBNRV9UUklHX1RZUEVfVElNRVIJCQkJCQkJMHgwMDA4MDAwOQorI2RlZmluZSBNRV9UUklHX1RZUEVfQ09VTlQJCQkJCQkJMHgwMDA4MDAwQQorI2RlZmluZSBNRV9UUklHX1RZUEVfRk9MTE9XCQkJCQkJCTB4MDAwODAwMEIKKworI2RlZmluZSBNRV9UUklHX0VER0VfTk9ORQkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1RSSUdfRURHRV9BQk9WRQkJCQkJCQkweDAwMDkwMDAxCisjZGVmaW5lIE1FX1RSSUdfRURHRV9CRUxPVwkJCQkJCQkweDAwMDkwMDAyCisjZGVmaW5lIE1FX1RSSUdfRURHRV9FTlRSWQkJCQkJCQkweDAwMDkwMDAzCisjZGVmaW5lIE1FX1RSSUdfRURHRV9FWElUCQkJCQkJCTB4MDAwOTAwMDQKKyNkZWZpbmUgTUVfVFJJR19FREdFX1JJU0lORwkJCQkJCQkweDAwMDkwMDA1CisjZGVmaW5lIE1FX1RSSUdfRURHRV9GQUxMSU5HCQkJCQkJMHgwMDA5MDAwNgorI2RlZmluZSBNRV9UUklHX0VER0VfQU5ZCQkJCQkJCTB4MDAwOTAwMDcKKworI2RlZmluZSBNRV9USU1FUl9BQ1FfU1RBUlQJCQkJCQkJMHgwMDBBMDAwMQorI2RlZmluZSBNRV9USU1FUl9TQ0FOX1NUQVJUCQkJCQkJCTB4MDAwQTAwMDIKKyNkZWZpbmUgTUVfVElNRVJfQ09OVl9TVEFSVAkJCQkJCQkweDAwMEEwMDAzCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9GcmVxdWVuY3lUb1RpY2tzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0ZSRVFVRU5DWV9UT19USUNLU19OT19GTEFHUwkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPSXJxU3RhcnQgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSVJRX1NPVVJDRV9ESU9fUEFUVEVSTgkJCQkJMHgwMDBCMDAwMQorI2RlZmluZSBNRV9JUlFfU09VUkNFX0RJT19NQVNLCQkJCQkJMHgwMDBCMDAwMgorI2RlZmluZSBNRV9JUlFfU09VUkNFX0RJT19MSU5FCQkJCQkJMHgwMDBCMDAwMworI2RlZmluZSBNRV9JUlFfU09VUkNFX0RJT19PVkVSX1RFTVAJCQkJCTB4MDAwQjAwMDQKKworI2RlZmluZSBNRV9JUlFfRURHRV9OT1RfVVNFRAkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfSVJRX0VER0VfUklTSU5HCQkJCQkJCTB4MDAwQzAwMDEKKyNkZWZpbmUgTUVfSVJRX0VER0VfRkFMTElORwkJCQkJCQkweDAwMEMwMDAyCisjZGVmaW5lIE1FX0lSUV9FREdFX0FOWQkJCQkJCQkJMHgwMDBDMDAwMworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPSXJxU3RhcnQgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX05PX0ZMQUdTCQkJCQkweDAwMDAwMAorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfRElPX0JJVAkJCQkJCTB4MDAwMDAxCisjZGVmaW5lIE1FX0lPX0lSUV9TVEFSVF9ESU9fQllURQkJCQkJMHgwMDAwMDIKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX0RJT19XT1JECQkJCQkweDAwMDAwNAorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfRElPX0RXT1JECQkJCQkweDAwMDAwOAorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfUEFUVEVSTl9GSUxURVJJTkcJCQkweDAwMDAxMAorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfRVhURU5ERURfU1RBVFVTCQkJCTB4MDAwMDIwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9JcnFXYWl0IGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0lSUV9XQUlUX05PX0ZMQUdTCQkJCQkJMHgwMDAwMDAKKyNkZWZpbmUgTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUwkJCQkweDAwMDAwMQorI2RlZmluZSBNRV9JT19JUlFfV0FJVF9FWFRFTkRFRF9TVEFUVVMJCQkJMHgwMDAwMDIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT0lycVN0b3AgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fSVJRX1NUT1BfTk9fRkxBR1MJCQkJCQkweDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPSXJxU2V0Q2FsbGJhY2sgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fSVJRX1NFVF9DQUxMQkFDS19OT19GTEFHUwkJCQkweDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1Jlc2V0RGV2aWNlIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1JFU0VUX0RFVklDRV9OT19GTEFHUwkJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9SZXNldFN1YmRldmljZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TaW5nbGVDb25maWcgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQJCQkJCTB4MDAwRDAwMDEKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUCQkJCQkweDAwMEQwMDAyCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX0hJR0hfSU1QRURBTkNFCQkJMHgwMDBEMDAwMworI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19TSU5LCQkJCQkweDAwMEQwMDA0CisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX1NPVVJDRQkJCQkJMHgwMDBEMDAwNQorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19NVVgzMk0JCQkJCTB4MDAwRDAwMDYKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fREVNVVgzMgkJCQkweDAwMEQwMDA3CisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX0JJVF9QQVRURVJOCQkJMHgwMDBEMDAwOAorCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8wCQkJMHgwMDBFMDAwMQorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMQkJCTB4MDAwRTAwMDIKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzIJCQkweDAwMEUwMDAzCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8zCQkJMHgwMDBFMDAwNAorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfNAkJCTB4MDAwRTAwMDUKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzUJCQkweDAwMEUwMDA2CisKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUwkJCQkweDAwCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVAkJCQkJMHgwMQorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFCQkJCTB4MDIKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRAkJCQkweDA0CisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JECQkJCTB4MDgKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19NVUxUSVNJR19MRURfT04JCQkweDEwCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfTVVMVElTSUdfTEVEX09GRgkJMHgyMAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0FJX1JNUwkJCQkJMHg0MAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0NPTlRJTlVFCQkJCTB4ODAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1NpbmdsZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TSU5HTEVfTk9fRkxBR1MJCQkJCQkweDAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HCQkJCQkweDIwCisKKyNkZWZpbmUgTUVfRElSX0lOUFVUCQkJCQkJCQkweDAwMEYwMDAxCisjZGVmaW5lIE1FX0RJUl9PVVRQVVQJCQkJCQkJCTB4MDAwRjAwMDIKKworI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9OT19GTEFHUwkJCQkJMHgwMAorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUCQkJCQkweDAxCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFCQkJCQkweDAyCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19XT1JECQkJCQkweDA0CisjZGVmaW5lIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19EV09SRAkJCQkJMHgwOAorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTCQkJMHgxMAorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9XUklURV9OT05CTE9DS0lORwkJCTB4MjAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbUNvbmZpZyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX05PX0ZMQUdTCQkJCTB4MAorI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX0JJVF9QQVRURVJOCQkJCTB4MQorI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQJCQkJMHgyCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9DT05GSUdfU0FNUExFX0FORF9IT0xECQkJMHg0CisjZGVmaW5lIE1FX0lPX1NUUkVBTV9DT05GSUdfSEFSRFdBUkVfT05MWQkJCTB4OAorCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9DT05GSUdfVFlQRV9OT19GTEFHUwkJCTB4MAorCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9UUklHR0VSX1RZUEVfTk9fRkxBR1MJCQkweDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVJlYWQgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfUkVBRF9NT0RFX0JMT0NLSU5HCQkJCQkJMHgwMDEwMDAwMQorI2RlZmluZSBNRV9SRUFEX01PREVfTk9OQkxPQ0tJTkcJCQkJCTB4MDAxMDAwMDIKKworI2RlZmluZSBNRV9JT19TVFJFQU1fUkVBRF9OT19GTEFHUwkJCQkJMHgwCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9SRUFEX0ZSQU1FUwkJCQkJMHgxCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TdHJlYW1Xcml0ZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9XUklURV9NT0RFX0JMT0NLSU5HCQkJCQkJMHgwMDExMDAwMQorI2RlZmluZSBNRV9XUklURV9NT0RFX05PTkJMT0NLSU5HCQkJCQkweDAwMTEwMDAyCisjZGVmaW5lIE1FX1dSSVRFX01PREVfUFJFTE9BRAkJCQkJCTB4MDAxMTAwMDMKKworI2RlZmluZSBNRV9JT19TVFJFQU1fV1JJVEVfTk9fRkxBR1MJCQkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVN0YXJ0IGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVEFSVF9OT19GTEFHUwkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIE1FX1NUQVJUX01PREVfQkxPQ0tJTkcJCQkJCQkweDAwMTIwMDAxCisjZGVmaW5lIE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcJCQkJCTB4MDAxMjAwMDIKKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9OT19GTEFHUwkJCTB4MAorI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9UUklHX1NZTkNIUk9OT1VTCTB4MQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtU3RvcCBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RPUF9OT19GTEFHUwkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9JT19TVFJFQU1fU1RPUF9QUkVTRVJWRV9CVUZGRVJTCQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1FX1NUT1BfTU9ERV9JTU1FRElBVEUJCQkJCQkweDAwMTMwMDAxCisjZGVmaW5lIE1FX1NUT1BfTU9ERV9MQVNUX1ZBTFVFCQkJCQkJMHgwMDEzMDAwMgorCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVE9QX1RZUEVfTk9fRkxBR1MJCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtU3RhdHVzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1dBSVRfTk9ORQkJCQkJCQkJMHgwMDE0MDAwMQorI2RlZmluZSBNRV9XQUlUX0lETEUJCQkJCQkJCTB4MDAxNDAwMDIKKworI2RlZmluZSBNRV9TVEFUVVNfSU5WQUxJRAkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1NUQVRVU19JRExFCQkJCQkJCQkweDAwMTUwMDAxCisjZGVmaW5lIE1FX1NUQVRVU19CVVNZCQkJCQkJCQkweDAwMTUwMDAyCisjZGVmaW5lIE1FX1NUQVRVU19FUlJPUgkJCQkJCQkJMHgwMDE1MDAwMworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVEFUVVNfTk9fRkxBR1MJCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtU2V0Q2FsbGJhY2tzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TRVRfQ0FMTEJBQ0tTX05PX0ZMQUdTCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtTmV3VmFsdWVzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9ORVdfVkFMVUVTX05PX0ZMQUdTCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPVGltZVRvVGlja3MgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1RJTUVfVE9fVElDS1NfTk9fRkxBR1MJCQkweDAwMDAwMDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1vZHVsZSB0eXBlcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19OT05FCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfRElGRjE2XzEwVgkJCTB4MDAxNjAwMDEKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfRElGRjE2XzIwVgkJCTB4MDAxNjAwMDIKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfRElGRjE2XzUwVgkJCTB4MDAxNjAwMDMKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfQ1VSUkVOVDE2XzBfMjBNQQkweDAwMTYwMDA0CisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX1JURDhfUFQxMDAJCQkweDAwMTYwMDA1CisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX1JURDhfUFQ1MDAJCQkweDAwMTYwMDA2CisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX1JURDhfUFQxMDAwCQkJMHgwMDE2MDAwNworI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9CCQkJMHgwMDE2MDAwOAorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9FCQkJMHgwMDE2MDAwOQorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9KCQkJMHgwMDE2MDAwQQorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9LCQkJMHgwMDE2MDAwQgorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9OCQkJMHgwMDE2MDAwQworI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9SCQkJMHgwMDE2MDAwRAorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9TCQkJMHgwMDE2MDAwRQorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9UCQkJMHgwMDE2MDAwRgorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVEVNUF9TRU5TT1IJCTB4MDAxNjAwMTAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVRdWVyeVN1YmRldmljZUNhcHMgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfQ0FQU19OT05FCQkJCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgTUVfQ0FQU19ESU9fRElSX0JJVAkJCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FX0NBUFNfRElPX0RJUl9CWVRFCQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0RJT19ESVJfV09SRAkJCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUVfQ0FQU19ESU9fRElSX0RXT1JECQkJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBNRV9DQVBTX0RJT19TSU5LX1NPVVJDRQkJCQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUVfQ0FQU19ESU9fQklUX1BBVFRFUk5fSVJRCQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FX0NBUFNfRElPX0JJVF9NQVNLX0lSUV9FREdFX1JJU0lORwkJMHgwMDAwMDA0MAorI2RlZmluZSBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9GQUxMSU5HCQkweDAwMDAwMDgwCisjZGVmaW5lIE1FX0NBUFNfRElPX0JJVF9NQVNLX0lSUV9FREdFX0FOWQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUVfQ0FQU19ESU9fT1ZFUl9URU1QX0lSUQkJCQkJMHgwMDAwMDIwMAorCisjZGVmaW5lIE1FX0NBUFNfQ1RSX0NMS19QUkVWSU9VUwkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRV9DQVBTX0NUUl9DTEtfSU5URVJOQUxfMU1IWgkJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xME1IWgkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FX0NBUFNfQ1RSX0NMS19FWFRFUk5BTAkJCQkJMHgwMDAwMDAwOAorCisjZGVmaW5lIE1FX0NBUFNfQUlfVFJJR19TWU5DSFJPTk9VUwkJCQkJMHgwMDAwMDAwMQorLy8vIEBub3RlIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIG1lMTYwMCBpbiBvbGQgc3R5bGUuCisjZGVmaW5lIE1FX0NBUFNfQUlfVFJJR19TSU1VTFRBTkVPVVMJCQkJTUVfQ0FQU19BSV9UUklHX1NZTkNIUk9OT1VTCisjZGVmaW5lIE1FX0NBUFNfQUlfRklGTwkJCQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0FJX0ZJRk9fVEhSRVNIT0xECQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTCQkJCQkweDAwMDAwMDAxCisvLy8gQG5vdGUgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgbWUxNjAwIGluIG9sZCBzdHlsZS4KKyNkZWZpbmUgTUVfQ0FQU19BT19UUklHX1NJTVVMVEFORU9VUwkJCQlNRV9DQVBTX0FPX1RSSUdfU1lOQ0hST05PVVMKKyNkZWZpbmUgTUVfQ0FQU19BT19GSUZPCQkJCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FX0NBUFNfQU9fRklGT19USFJFU0hPTEQJCQkJCTB4MDAwMDAwMDQKKworI2RlZmluZSBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkcJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUVfQ0FQU19FWFRfSVJRX0VER0VfRkFMTElORwkJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FX0NBUFNfRVhUX0lSUV9FREdFX0FOWQkJCQkJMHgwMDAwMDAwNAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZVF1ZXJ5U3ViZGV2aWNlQ2Fwc0FyZ3MgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfQ0FQX0FJX0ZJRk9fU0laRQkJCQkJCQkweDAwMUQwMDAwCisjZGVmaW5lIE1FX0NBUF9BSV9CVUZGRVJfU0laRQkJCQkJCTB4MDAxRDAwMDEKKworI2RlZmluZSBNRV9DQVBfQU9fRklGT19TSVpFCQkJCQkJCTB4MDAxRjAwMDAKKyNkZWZpbmUgTUVfQ0FQX0FPX0JVRkZFUl9TSVpFCQkJCQkJMHgwMDFGMDAwMQorCisjZGVmaW5lIE1FX0NBUF9DVFJfV0lEVEgJCQkJCQkJMHgwMDIwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGNvbW1vbiB0byBxdWVyeSBmdW5jdGlvbnMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfVU5JVF9JTlZBTElECQkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1VOSVRfVk9MVAkJCQkJCQkJMHgwMDE3MDAwMQorI2RlZmluZSBNRV9VTklUX0FNUEVSRQkJCQkJCQkJMHgwMDE3MDAwMgorI2RlZmluZSBNRV9VTklUX0FOWQkJCQkJCQkJCTB4MDAxNzAwMDMKKworI2RlZmluZSBNRV9UWVBFX0lOVkFMSUQJCQkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfVFlQRV9BTwkJCQkJCQkJCTB4MDAxODAwMDEKKyNkZWZpbmUgTUVfVFlQRV9BSQkJCQkJCQkJCTB4MDAxODAwMDIKKyNkZWZpbmUgTUVfVFlQRV9ESU8JCQkJCQkJCQkweDAwMTgwMDAzCisjZGVmaW5lIE1FX1RZUEVfRE8JCQkJCQkJCQkweDAwMTgwMDA0CisjZGVmaW5lIE1FX1RZUEVfREkJCQkJCQkJCQkweDAwMTgwMDA1CisjZGVmaW5lIE1FX1RZUEVfQ1RSCQkJCQkJCQkJMHgwMDE4MDAwNgorI2RlZmluZSBNRV9UWVBFX0VYVF9JUlEJCQkJCQkJCTB4MDAxODAwMDcKKworI2RlZmluZSBNRV9TVUJUWVBFX0lOVkFMSUQJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9TVUJUWVBFX1NJTkdMRQkJCQkJCQkweDAwMTkwMDAxCisjZGVmaW5lIE1FX1NVQlRZUEVfU1RSRUFNSU5HCQkJCQkJMHgwMDE5MDAwMgorI2RlZmluZSBNRV9TVUJUWVBFX0NUUl84MjU0CQkJCQkJCTB4MDAxOTAwMDMKKyNkZWZpbmUgTUVfU1VCVFlQRV9BTlkJCQkJCQkJCTB4MDAxOTAwMDQKKworI2RlZmluZSBNRV9ERVZJQ0VfRFJJVkVSX05BTUVfTUFYX0NPVU5UCQkJCTY0CisjZGVmaW5lIE1FX0RFVklDRV9OQU1FX01BWF9DT1VOVAkJCQkJNjQKKworI2RlZmluZSBNRV9ERVZJQ0VfREVTQ1JJUFRJT05fTUFYX0NPVU5UCQkJCTI1NgorCisjZGVmaW5lIE1FX0JVU19UWVBFX0lOVkFMSUQJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9CVVNfVFlQRV9QQ0kJCQkJCQkJCTB4MDAxQTAwMDEKKyNkZWZpbmUgTUVfQlVTX1RZUEVfVVNCCQkJCQkJCQkweDAwMUEwMDAyCisKKyNkZWZpbmUgTUVfUExVR0dFRF9JTlZBTElECQkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfUExVR0dFRF9JTgkJCQkJCQkJMHgwMDFCMDAwMQorI2RlZmluZSBNRV9QTFVHR0VEX09VVAkJCQkJCQkJMHgwMDFCMDAwMgorCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX0lOVkFMSUQJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfRVhURU5TSU9OX1RZUEVfTk9ORQkJCQkJCTB4MDAxQzAwMDEKKyNkZWZpbmUgTUVfRVhURU5TSU9OX1RZUEVfTVVYMzJNCQkJCQkweDAwMUMwMDAyCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX0RFTVVYMzIJCQkJCTB4MDAxQzAwMDMKKyNkZWZpbmUgTUVfRVhURU5TSU9OX1RZUEVfTVVYMzJTCQkJCQkweDAwMUMwMDA0CisKKyNkZWZpbmUgTUVfQUNDRVNTX1RZUEVfSU5WQUxJRAkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfQUNDRVNTX1RZUEVfTE9DQUwJCQkJCQkweDAwMUQwMDAxCisjZGVmaW5lIE1FX0FDQ0VTU19UWVBFX1JFTU9URQkJCQkJCTB4MDAxRDAwMDIKKworLy8vIEBub3RlIEFkZCBieSBLRworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZVV0aWxpdHlQV00KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIE1FX1BXTV9TVEFSVF9DT05ORUNUX0lOVEVSTkFMCQkJCTB4MDAyMDAwMDEKKworLyogRmxhZ3MgZm9yIFNpbmdsZUNvbmZpZyBjaGFubmVscyBjb25maWd1cmUgKi8KKyNkZWZpbmUgTUVfU0lOR0xFX0NIQU5ORUxfTk9UX0NPTkZJR1VSRUQJCQkweDAwCisjZGVmaW5lIE1FX1NJTkdMRV9DSEFOTkVMX0NPTkZJR1VSRUQJCQkJMHgwMQorCisvKiBEZWZpbmUgaWYgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZG93bmxvYWRlZCB0byBkcml2ZXIgKi8KKyNkZWZpbmUgTUVfQ09ORklHX0xPQURfTk9fRkxBR1MJCQkJCQkweDAKKyNkZWZpbmUgTUVfQ09ORklHX0xPQURfVE9fRFJJVkVSCQkJCQkweDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjJlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZXZpY2UuYwpAQCAtMCwwICsxLDE3NDAgQEAKKy8qKgorICogQGZpbGUgbWVkZXZpY2UuYworICoKKyAqIEBicmllZiBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19pcnFfc3RhcnQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IGlycV9zb3VyY2UsCisJCQkJICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQocywKKwkJCQkJCSAgIGZpbGVwLAorCQkJCQkJICAgY2hhbm5lbCwKKwkJCQkJCSAgIGlycV9zb3VyY2UsCisJCQkJCQkgICBpcnFfZWRnZSwgaXJxX2FyZywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX2lycV93YWl0KHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICppcnFfY291bnQsCisJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQocywKKwkJCQkJCSAgZmlsZXAsCisJCQkJCQkgIGNoYW5uZWwsCisJCQkJCQkgIGlycV9jb3VudCwKKwkJCQkJCSAgdmFsdWUsIHRpbWVfb3V0LCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9faXJxX3N0b3Aoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJIGludCBzdWJkZXZpY2UsIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19pcnFfc3RvcChzLCBmaWxlcCwgY2hhbm5lbCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKwlpbnQgaSwgbjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEdldCB0aGUgbnVtYmVyIG9mIHN1YmRldmljZXMuICovCisJbiA9IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCk7CisKKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogUmVzZXQgZXZlcnkgc3ViZGV2aWNlIGluIGxpc3QuICovCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgaSk7CisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UocywgZmlsZXAsIGZsYWdzKTsKKworCQlpZiAoZXJyKSB7CisJCQlQRVJST1IoIkNhbm5vdCByZXNldCBzdWJkZXZpY2UuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgc3ViZGV2aWNlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZShzLCBmaWxlcCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3NpbmdsZV9jb25maWcoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcocywKKwkJCQkJCSAgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgICBjaGFubmVsLAorCQkJCQkJICAgICAgIHNpbmdsZV9jb25maWcsCisJCQkJCQkgICAgICAgcmVmLAorCQkJCQkJICAgICAgIHRyaWdfY2hhbiwKKwkJCQkJCSAgICAgICB0cmlnX3R5cGUsCisJCQkJCQkgICAgICAgdHJpZ19lZGdlLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQocywKKwkJCQkJCSAgICAgZmlsZXAsCisJCQkJCQkgICAgIGNoYW5uZWwsCisJCQkJCQkgICAgIHZhbHVlLCB0aW1lX291dCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUocywKKwkJCQkJCSAgICAgIGZpbGVwLAorCQkJCQkJICAgICAgY2hhbm5lbCwKKwkJCQkJCSAgICAgIHZhbHVlLCB0aW1lX291dCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV9jb25maWcoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcocywKKwkJCQkJCSAgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgICBjb25maWdfbGlzdCwKKwkJCQkJCSAgICAgICBjb3VudCwKKwkJCQkJCSAgICAgICB0cmlnZ2VyLAorCQkJCQkJICAgICAgIGZpZm9faXJxX3RocmVzaG9sZCwKKwkJCQkJCSAgICAgICBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhzLAorCQkJCQkJCSAgIGZpbGVwLAorCQkJCQkJCSAgIHRpbWVfb3V0LAorCQkJCQkJCSAgIGNvdW50LCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX3JlYWQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgIGludCByZWFkX21vZGUsCisJCQkJICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkKHMsCisJCQkJCQkgICAgIGZpbGVwLAorCQkJCQkJICAgICByZWFkX21vZGUsCisJCQkJCQkgICAgIHZhbHVlcywgY291bnQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KHMsCisJCQkJCQkgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgIHN0YXJ0X21vZGUsCisJCQkJCQkgICAgICB0aW1lX291dCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMocywKKwkJCQkJCSAgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgICB3YWl0LAorCQkJCQkJICAgICAgIHN0YXR1cywgY291bnQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zdHJlYW1fc3RvcChzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN1YmRldmljZSwgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcChzLAorCQkJCQkJICAgICBmaWxlcCwgc3RvcF9tb2RlLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkgICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV93cml0ZShzLAorCQkJCQkJICAgICAgZmlsZXAsCisJCQkJCQkgICAgICB3cml0ZV9tb2RlLAorCQkJCQkJICAgICAgdmFsdWVzLCBjb3VudCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2xvY2tfZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCXJldHVybiBtZV9kbG9ja19sb2NrKCZkZXZpY2UtPmRsb2NrLAorCQkJICAgICBmaWxlcCwgbG9jaywgZmxhZ3MsICZkZXZpY2UtPnNsaXN0KTsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfbG9ja19zdWJkZXZpY2Uoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsIGludCBsb2NrLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlKHMsIGZpbGVwLCBsb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICAgY2hhciAqKmRlc2NyaXB0aW9uKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqZGVzY3JpcHRpb24gPSBkZXZpY2UtPmRldmljZV9kZXNjcmlwdGlvbjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2Uoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgICBpbnQgKnZlbmRvcl9pZCwKKwkJCQkgICAgICAgaW50ICpkZXZpY2VfaWQsCisJCQkJICAgICAgIGludCAqc2VyaWFsX25vLAorCQkJCSAgICAgICBpbnQgKmJ1c190eXBlLAorCQkJCSAgICAgICBpbnQgKmJ1c19ubywKKwkJCQkgICAgICAgaW50ICpkZXZfbm8sIGludCAqZnVuY19ubywgaW50ICpwbHVnZ2VkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChkZXZpY2UtPmJ1c190eXBlID09IE1FX0JVU19UWVBFX1BDSSkgeworCQkqdmVuZG9yX2lkID0gZGV2aWNlLT5pbmZvLnBjaS52ZW5kb3JfaWQ7CisJCSpkZXZpY2VfaWQgPSBkZXZpY2UtPmluZm8ucGNpLmRldmljZV9pZDsKKwkJKnNlcmlhbF9ubyA9IGRldmljZS0+aW5mby5wY2kuc2VyaWFsX25vOworCQkqYnVzX3R5cGUgPSBNRV9CVVNfVFlQRV9QQ0k7CisJCSpidXNfbm8gPSBkZXZpY2UtPmluZm8ucGNpLnBjaV9idXNfbm87CisJCSpkZXZfbm8gPSBkZXZpY2UtPmluZm8ucGNpLnBjaV9kZXZfbm87CisJCSpmdW5jX25vID0gZGV2aWNlLT5pbmZvLnBjaS5wY2lfZnVuY19ubzsKKwkJKnBsdWdnZWQgPSBNRV9QTFVHR0VEX0lOOworCX0gZWxzZSB7CisJCSpwbHVnZ2VkID0gTUVfUExVR0dFRF9PVVQ7CisJfQorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsIGNoYXIgKipuYW1lKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbmFtZSA9IGRldmljZS0+ZGV2aWNlX25hbWU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgIGNoYXIgKipuYW1lKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbmFtZSA9IGRldmljZS0+ZHJpdmVyX25hbWU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIG1lX3NsaXN0X3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0LCBudW1iZXIpOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICBpbnQgc3ViZGV2aWNlLCBpbnQgKm51bWJlcikKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyhzLCBudW1iZXIpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgaW50IHN1YmRldmljZSwgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzKHMsIHVuaXQsIGNvdW50KTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwKKwkJCQkJICAgIGludCAqbWluLAorCQkJCQkgICAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgocywKKwkJCQkJCQkgICAgIHVuaXQsCisJCQkJCQkJICAgICBtaW4sCisJCQkJCQkJICAgICBtYXgsCisJCQkJCQkJICAgICBtYXhkYXRhLCByYW5nZSk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyhzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyhzLAorCQkJCQkJICAgICAgIHJhbmdlLAorCQkJCQkJICAgICAgIHVuaXQsIG1pbiwgbWF4LCBtYXhkYXRhKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgaW50IHN0YXJ0X3N1YmRldmljZSwKKwkJCQkJICAgICBpbnQgdHlwZSwKKwkJCQkJICAgICBpbnQgc3VidHlwZSwgaW50ICpzdWJkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJcmV0dXJuIG1lX3NsaXN0X2dldF9zdWJkZXZpY2VfYnlfdHlwZSgmZGV2aWNlLT5zbGlzdCwKKwkJCQkJICAgICAgc3RhcnRfc3ViZGV2aWNlLAorCQkJCQkgICAgICB0eXBlLCBzdWJ0eXBlLCBzdWJkZXZpY2UpOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlKHMsIHR5cGUsIHN1YnR5cGUpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICBpbnQgc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzLCBjYXBzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgY2FwLCBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MocywKKwkJCQkJCQkJY2FwLAorCQkJCQkJCQlhcmdzLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfdGltZXIoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIHVpbnQ2NF90ICogbWluX3RpY2tzLCB1aW50NjRfdCAqIG1heF90aWNrcykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyKHMsCisJCQkJCQkgIHRpbWVyLAorCQkJCQkJICBiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkJCSAgbWluX3RpY2tzLCBtYXhfdGlja3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCQkgaW50ICp2ZXJzaW9uKQorLyoqIEB0b2RvIFZlcnNpb25zIHNob2xkIGJlIHJlYWQgZnJvbSBkcml2ZXIuIEkgbXVzdCBvdmVyd3JpdGUgdGhpcyBmdW5jdGlvbiBpbiBlYWNoIG1vZHVsZS4gSGVyZSBzaG91bGQgYmUgcmV0dXJuZWQgYW4gZXJyb3IhCisqLworeworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdmVyc2lvbiA9IE1FX1ZFUlNJT05fRFJJVkVSOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9jb25maWdfbG9hZChzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgbWVfY2ZnX2RldmljZV9lbnRyeV90ICogY29uZmlnKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsJLy9JZiBubyBuZWVkIGZvciBjb25maWcgcmV0dXJuIHN1Y2Nlc3MuCisvLyAgICAgIHJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgdm9pZCBtZV9kZXZpY2VfZGVzdHJ1Y3RvcihtZV9kZXZpY2VfdCAqIG1lX2RldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJbWVfZGV2aWNlX2RlaW5pdChtZV9kZXZpY2UpOworCWtmcmVlKG1lX2RldmljZSk7Cit9CisKKy8qIC8vbWVfZGV2aWNlX3VzYl9pbml0CitpbnQgbWVfZGV2aWNlX3VzYl9pbml0KG1lX2RldmljZV90ICptZV9kZXZpY2UsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAtMTsKK30KKyovCisKK3N0YXRpYyBpbnQgZ2V0X2RldmljZV9kZXNjcmlwdGlvbnModWludDE2X3QgZGV2aWNlX2lkLAorCQkJCSAgIGNoYXIgKipkZXZpY2VfbmFtZSwKKwkJCQkgICBjaGFyICoqZGV2aWNlX2Rlc2NyaXB0aW9uLAorCQkJCSAgIGNoYXIgKipkcml2ZXJfbmFtZSkKKy8qKiBAdG9kbyBUaGlzIGlzIHdyb25nIGNvbmNlcHQhIFN0YXRpYyB0YWJsZSBoYXMgdG9vIHN0cm9uZyBsaW1pdGF0aW9ucyEKKyogJ2RldmljZV9uYW1lJyBhbmQgJ2RyaXZlcl9uYW1lJyBzaG91bGQgYmUgY2FsY3VsYXRlZCBmcm9tICdkZXZpY2VfaWQnCisqICdkZXZpY2VfZGVzY3JpcHRpb24nIHNob3VsZCBiZSByZWFkIGZyb20gZGV2aWNlIG9yIG1vdmVkIHRvIHVzZXIgc3BhY2UgYW5kIGhhbmRsZWQgYnkgbGlicmFyeSEKKyovCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0I6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTAwMF9OQU1FX0RFVklDRV9NRTEwMDA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTEwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTAwMDsKKwkJKmRyaXZlcl9uYW1lID0gTUUxMDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MDA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMDsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBBOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBBOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEI7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEI7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRTsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBFQTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRUE7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUI7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEVCOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEM7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEM7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRDsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFU6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDA0VTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwNFU7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzhVOgorCQkqZGV2aWNlX25hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwOFU7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDhVOworCQkqZHJpdmVyX25hbWUgPSBNRTE2MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlU6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxMlU7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDEyVTsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVOgorCQkqZGV2aWNlX25hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTZVOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SToKKwkJKmRldmljZV9uYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VThJOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU4STsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2MTA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDYxMDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NTA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY1MDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NjA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwSTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwSTsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MElTOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBJUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSTsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MElTOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwSTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSTsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MElTOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2ODBJUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDg7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTY7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJODsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTY7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTQ7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFODsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0Y6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFMTY7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEUxNjsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDg7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTY7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJODsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTY7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTQ7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFODsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0Y6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFMTY7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEUxNjsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0ODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDhESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDhESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDRGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTZESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJOERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSThESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDVGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTZESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTRESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3ODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFOERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0Y6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFMTZESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEUxNkRJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0ODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDhESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDhESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTZESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJOERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSThESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTZESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTRESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3ODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFOERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0Y6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFMTZESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEUxNkRJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTk6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYyMDBJOURJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MjAwSTlESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MzU5OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MzAwSTlESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjMwMEk5RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDYzMDoKKwkJKmRldmljZV9uYW1lID0gTUUwNjAwX05BTUVfREVWSUNFX01FMDYzMDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwNjMwOworCQkqZHJpdmVyX25hbWUgPSBNRTA2MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCQkqZGV2aWNlX25hbWUgPSBNRTgxMDBfTkFNRV9ERVZJQ0VfTUU4MTAwQTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FODEwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MTAwQTsKKwkJKmRyaXZlcl9uYW1lID0gTUU4MTAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQjoKKwkJKmRldmljZV9uYW1lID0gTUU4MTAwX05BTUVfREVWSUNFX01FODEwMEI7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEI7CisJCSpkcml2ZXJfbmFtZSA9IE1FODEwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0E6CisJCSpkZXZpY2VfbmFtZSA9IE1FODIwMF9OQU1FX0RFVklDRV9NRTgyMDBBOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU4MjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgyMDBBOworCQkqZHJpdmVyX25hbWUgPSBNRTgyMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9COgorCQkqZGV2aWNlX25hbWUgPSBNRTgyMDBfTkFNRV9ERVZJQ0VfTUU4MjAwQjsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FODIwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MjAwQjsKKwkJKmRyaXZlcl9uYW1lID0gTUU4MjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NDA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk0MDsKKwkJKmRyaXZlcl9uYW1lID0gTUUwOTAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NTA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NTA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk1MDsKKwkJKmRyaXZlcl9uYW1lID0gTUUwOTAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NjA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk2MDsKKwkJKmRyaXZlcl9uYW1lID0gTUUwOTAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKy8qCisJCWNhc2UgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMToKKwkJCSpkZXZpY2VfbmFtZSA9IE1FUEhJU1RPX1MxX05BTUVfREVWSUNFOworCQkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FUEhJU1RPX1MxX0RFU0NSSVBUSU9OX0RFVklDRTsKKwkJCSpkcml2ZXJfbmFtZSA9IE1FUEhJU1RPX1MxX05BTUVfRFJJVkVSOworCQkJYnJlYWs7CisqLworCWRlZmF1bHQ6CisJCSpkZXZpY2VfbmFtZSA9IEVNUFRZX05BTUVfREVWSUNFOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gRU1QVFlfREVTQ1JJUFRJT05fREVWSUNFOworCQkqZHJpdmVyX25hbWUgPSBFTVBUWV9OQU1FX0RSSVZFUjsKKworCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIGlkLlxuIik7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtZV9kZXZpY2VfcGNpX2luaXQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBJbml0aWFsaXplIGRldmljZSBsaXN0IGhlYWQuCisJSU5JVF9MSVNUX0hFQUQoJm1lX2RldmljZS0+bGlzdCk7CisKKwkvLyBJbml0aWFsaXplIGRldmljZSBkZXNjcmlwdGlvbiBzdHJpbmdzLgorCWVyciA9IGdldF9kZXZpY2VfZGVzY3JpcHRpb25zKHBjaV9kZXZpY2UtPmRldmljZSwKKwkJCQkgICAgICAmbWVfZGV2aWNlLT5kZXZpY2VfbmFtZSwKKwkJCQkgICAgICAmbWVfZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb24sCisJCQkJICAgICAgJm1lX2RldmljZS0+ZHJpdmVyX25hbWUpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBkZXNjcmlwdGlvbiBzdHJpbmdzLlxuIik7CisJCXJldHVybiAxOworCX0KKwkvLyBFbmFibGUgdGhlIHBjaSBkZXZpY2UuCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldmljZSk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlQRVJST1IoIkNhbm5vdCBlbmFibGUgUENJIGRldmljZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLy8gUmVxdWVzdCB0aGUgUENJIHJlZ2lzdGVyIHJlZ2lvbnMuCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2lfZGV2aWNlLCBtZV9kZXZpY2UtPmRldmljZV9uYW1lKTsKKworCWlmIChlcnIgPCAwKSB7CisJCVBFUlJPUigiQ2Fubm90IHJlcXVlc3QgUENJIHJlZ2lvbnMuXG4iKTsKKwkJZ290byBFUlJPUl8wOworCX0KKwkvLyBUaGUgYnVzIGNhcnJ5aW5nIHRoZSBkZXZpY2UgaXMgYSBQQ0kgYnVzLgorCW1lX2RldmljZS0+YnVzX3R5cGUgPSBNRV9CVVNfVFlQRV9QQ0k7CisKKwkvLyBTdG9yZSB0aGUgUENJIGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2FnZS4KKwltZV9kZXZpY2UtPmluZm8ucGNpLnBjaV9kZXZpY2UgPSBwY2lfZGV2aWNlOworCisJLy8gR2V0IFBDSSByZWdpc3RlciBiYXNlcyBhbmQgc2l6ZXMuCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQltZV9kZXZpY2UtPmluZm8ucGNpLnJlZ19iYXNlc1tpXSA9CisJCSAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldmljZSwgaSk7CisJCW1lX2RldmljZS0+aW5mby5wY2kucmVnX3NpemVzW2ldID0KKwkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldmljZSwgaSk7CisJfQorCisJLy8gR2V0IHRoZSBQQ0kgbG9jYXRpb24uCisJbWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfYnVzX25vID0gcGNpX2RldmljZS0+YnVzLT5udW1iZXI7CisJbWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2X25vID0gUENJX1NMT1QocGNpX2RldmljZS0+ZGV2Zm4pOworCW1lX2RldmljZS0+aW5mby5wY2kucGNpX2Z1bmNfbm8gPSBQQ0lfRlVOQyhwY2lfZGV2aWNlLT5kZXZmbik7CisKKwkvLyBHZXQgTWVpbGhhdXMgc3BlY2lmaWMgZGV2aWNlIGluZm9ybWF0aW9uLgorCW1lX2RldmljZS0+aW5mby5wY2kudmVuZG9yX2lkID0gcGNpX2RldmljZS0+dmVuZG9yOworCW1lX2RldmljZS0+aW5mby5wY2kuZGV2aWNlX2lkID0gcGNpX2RldmljZS0+ZGV2aWNlOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXZpY2UsIDB4MDgsCisJCQkgICAgICZtZV9kZXZpY2UtPmluZm8ucGNpLmh3X3JldmlzaW9uKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldmljZSwgMHgyQywgJm1lX2RldmljZS0+aW5mby5wY2kuc2VyaWFsX25vKTsKKworCS8vIEdldCB0aGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyLgorCW1lX2RldmljZS0+aXJxID0gcGNpX2RldmljZS0+aXJxOworCisJLy8gSW5pdGlhbGl6ZSBkZXZpY2UgbG9jayBpbnN0YW5jZS4KKwllcnIgPSBtZV9kbG9ja19pbml0KCZtZV9kZXZpY2UtPmRsb2NrKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgbG9jayBpbnN0YW5jZS5cbiIpOworCQlnb3RvIEVSUk9SXzE7CisJfQorCS8vIEluaXRpYWxpemUgc3ViZGV2aWNlIGxpc3QgaW5zdGFuY2UuCisJbWVfc2xpc3RfaW5pdCgmbWVfZGV2aWNlLT5zbGlzdCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGxpc3QgaW5zdGFuY2UuXG4iKTsKKwkJZ290byBFUlJPUl8yOworCX0KKwkvLyBJbml0aWFsaXplIG1ldGhvZCBwb2ludGVycy4KKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19pcnFfc3RhcnQgPSBtZV9kZXZpY2VfaW9faXJxX3N0YXJ0OworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX2lycV93YWl0ID0gbWVfZGV2aWNlX2lvX2lycV93YWl0OworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX2lycV9zdG9wID0gbWVfZGV2aWNlX2lvX2lycV9zdG9wOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZSA9IG1lX2RldmljZV9pb19yZXNldF9kZXZpY2U7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0gbWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnID0gbWVfZGV2aWNlX2lvX3NpbmdsZV9jb25maWc7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQ7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9jb25maWc7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPQorCSAgICBtZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3JlYWQgPSBtZV9kZXZpY2VfaW9fc3RyZWFtX3JlYWQ7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGFydDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0b3AgPSBtZV9kZXZpY2VfaW9fc3RyZWFtX3N0b3A7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0gbWVfZGV2aWNlX2lvX3N0cmVhbV93cml0ZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9sb2NrX2RldmljZSA9IG1lX2RldmljZV9sb2NrX2RldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9sb2NrX3N1YmRldmljZSA9IG1lX2RldmljZV9sb2NrX3N1YmRldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlID0gbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlID0gbWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciA9CisJICAgIG1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXI7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3N1YmRldmljZXM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPSBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbzsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZSA9CisJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfdGltZXIgPSBtZV9kZXZpY2VfcXVlcnlfdGltZXI7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcjsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9jb25maWdfbG9hZCA9IG1lX2RldmljZV9jb25maWdfbG9hZDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9kZXN0cnVjdG9yID0gbWVfZGV2aWNlX2Rlc3RydWN0b3I7CisKKwlyZXR1cm4gMDsKKworICAgICAgRVJST1JfMDoKKwltZV9kbG9ja19kZWluaXQoJm1lX2RldmljZS0+ZGxvY2spOworCisgICAgICBFUlJPUl8xOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2RldmljZSk7CisKKyAgICAgIEVSUk9SXzI6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXZpY2UpOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgbWVfZGV2aWNlX2RlaW5pdChtZV9kZXZpY2VfdCAqIG1lX2RldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwltZV9zbGlzdF9kZWluaXQoJm1lX2RldmljZS0+c2xpc3QpOworCW1lX2Rsb2NrX2RlaW5pdCgmbWVfZGV2aWNlLT5kbG9jayk7CisKKwlpZiAobWVfZGV2aWNlLT5idXNfdHlwZSA9PSBNRV9CVVNfVFlQRV9QQ0kpIHsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhtZV9kZXZpY2UtPmluZm8ucGNpLnBjaV9kZXZpY2UpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UobWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2aWNlKTsKKwl9CisvKgorCWVsc2UKKwl7CisJCS8vIE11c3QgYmUgYW4gVVNCIGRldmljZS4KKwl9CisqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRhODI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmgKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVkZXZpY2UuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxzdXBwb3J0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FREVWSUNFX0hfCisjZGVmaW5lIF9NRURFVklDRV9IXworCisjaWZuZGVmIEtCVUlMRF9NT0ROQU1FCisjICBkZWZpbmUgS0JVSUxEX01PRE5BTUUgS0JVSUxEX1NUUihtZW1haW4pCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorLy8jaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lc2xpc3QuaCIKKyNpbmNsdWRlICJtZWRsb2NrLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBwb2ludGVyIHR5cGUgdG8gYSBQQ0kgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX2RldmljZSAqKCptZV9wY2lfY29uc3RydWN0b3JfdCkgKHN0cnVjdCBwY2lfZGV2ICopOworCisvKioKKyAqIEBicmllZiBEZWZpbmVzIGEgcG9pbnRlciB0eXBlIHRvIGEgTUUtNDAwMCBQQ0kgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKi8KKyNpZmRlZiBCT1NDSAordHlwZWRlZiBzdHJ1Y3QgbWVfZGV2aWNlICooKm1lX2Jvc2NoX2NvbnN0cnVjdG9yX3QpIChzdHJ1Y3QgcGNpX2RldiAqLAorCQkJCQkJICAgICBpbnQgbWVfYm9zY2hfZncpOworI2VuZGlmCisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBwb2ludGVyIHR5cGUgdG8gYSBVU0IgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKi8KKy8vdHlwZWRlZiBzdHJ1Y3QgbWVfZGV2aWNlICooKm1lX3VzYl9jb25zdHJ1Y3Rvcl90KShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworLyoqCisgKiBAYnJpZWYgRGVmaW5lcyBhIHBvaW50ZXIgdHlwZSB0byB0aGUgZHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX2RldmljZSAqKCptZV9kdW1teV9jb25zdHJ1Y3Rvcl90KSAodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkJCQkgICAgIGludCBidXNfdHlwZSwKKwkJCQkJCSAgICAgaW50IGJ1c19ubywKKwkJCQkJCSAgICAgaW50IGRldl9ubywgaW50IGZ1bmNfbm8pOworCisvL2V4dGVybiBtZV91c2JfY29uc3RydWN0b3JfdCBtZXBoaXN0b19zMV9jb25zdHJ1Y3RvciBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisvKioKKyAqIEBicmllZiBIb2xkcyB0aGUgUENJIGRldmljZSBpbmZvcm1hdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfcGNpX2luZm8geworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlOwkJCS8qKjwgS2VybmVsIFBDSSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCXVpbnQzMl90IHJlZ19iYXNlc1s2XTsJCQkJLyoqPCBUaGUgYmFzZSBhZHJlc3NlcyBvZiB0aGUgUENJIGJhcnMuICovCisJdWludDMyX3QgcmVnX3NpemVzWzZdOwkJCQkvKio8IFRoZSBzaXplcyBvZiB0aGUgUENJIGJhcnMuICovCisKKwl1aW50MzJfdCBwY2lfYnVzX25vOwkJCQkvKio8IFBDSSBidXMgbnVtYmVyLiAqLworCXVpbnQzMl90IHBjaV9kZXZfbm87CQkJCS8qKjwgUENJIGRldmljZSBudW1iZXIuICovCisJdWludDMyX3QgcGNpX2Z1bmNfbm87CQkJCS8qKjwgUENJIGZ1bmN0aW9uIG51bWJlci4gKi8KKworCXVpbnQxNl90IHZlbmRvcl9pZDsJCQkJCS8qKjwgTWVpbGhhdXMgUENJIHZlbmRvciBpZC4gKi8KKwl1aW50MTZfdCBkZXZpY2VfaWQ7CQkJCQkvKio8IE1laWxoYXVzIGRldmljZSBpZC4gKi8KKwl1aW50OF90IGh3X3JldmlzaW9uOwkJCQkvKio8IEhhcmR3YXJlIHJldmlzaW9uIG9mIHRoZSBkZXZpY2UuICovCisJdWludDMyX3Qgc2VyaWFsX25vOwkJCQkJLyoqPCBTZXJpYWwgbnVtYmVyIG9mIHRoZSBkZXZpY2UuICovCit9IG1lX3BjaV9pbmZvX3Q7CisKKy8qKgorICogQGJyaWVmIEhvbGRzIHRoZSBVU0IgZGV2aWNlIGluZm9ybWF0aW9uLgorICovCisvL3R5cGVkZWYgc3RydWN0IG1lX3VzYl9pbmZvIHsKKy8vfSBtZV91c2JfaW5mb190OworCisvKioKKyAqIEBicmllZiBUaGUgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9kZXZpY2UgeworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkJCS8qKjwgRW5hYmxlcyB0aGUgZGV2aWNlIHRvIGJlIGFkZGVkIHRvIGEgZHluYW1pYyBsaXN0LiAqLworLy8gICAgICBpbnQgbWFnaWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUuICovCisKKwlpbnQgYnVzX3R5cGU7CQkJCQkJLyoqPCBUaGUgZGVzY3JpbWluYXRvciBmb3IgdGhlIHVuaW9uLiAqLworCXVuaW9uIHsKKwkJbWVfcGNpX2luZm9fdCBwY2k7CQkJCS8qKjwgUENJIHNwZWNpZmljIGRldmljZSBpbmZvcm1hdGlvbi4gKi8KKy8vICAgICAgICAgICAgICBtZV91c2JfaW5mb190IHVzYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVTQiBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24uICovCisJfSBpbmZvOwkJCQkJCQkJLyoqPCBIb2xkcyB0aGUgZGV2aWNlIGluZm9ybWF0aW9uLiAqLworCisJaW50IGlycTsJCQkJCQkJLyoqPCBUaGUgaXJxIGFzc2lnbmVkIHRvIHRoaXMgZGV2aWNlLiAqLworCisJbWVfZGxvY2tfdCBkbG9jazsJCQkJCS8qKjwgVGhlIGRldmljZSBsb2NraW5nIHN0cnVjdHVyZS4gKi8KKwltZV9zbGlzdF90IHNsaXN0OwkJCQkJLyoqPCBUaGUgY29udGFpbmVyIGhvbGRpbmcgYWxsIHN1YmRldmljZXMgYmVsb25naW5nIHRvIHRoaXMgZGV2aWNlLiAqLworCisJY2hhciAqZGV2aWNlX25hbWU7CQkJCQkvKio8IFRoZSBuYW1lIG9mIHRoZSBNZWlsaGF1cyBkZXZpY2UuICovCisJY2hhciAqZGV2aWNlX2Rlc2NyaXB0aW9uOwkJCS8qKjwgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBNZWlsaGF1cyBkZXZpY2UuICovCisJY2hhciAqZHJpdmVyX25hbWU7CQkJCQkvKio8IFRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgZHJpdmVyIG1vZHVsZSBzdXBwb3J0aW5nIHRoZSBkZXZpY2UgZmFtaWx5LiAqLworCisJLyogTWV0aG9kcyAqLworCWludCAoKm1lX2RldmljZV9pb19pcnFfc3RhcnQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IGlycV9zb3VyY2UsCisJCQkJICAgICAgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9faXJxX3dhaXQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgKmlycV9jb3VudCwKKwkJCQkgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9faXJxX3N0b3ApIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwgaW50IGNoYW5uZWwsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fcmVzZXRfZGV2aWNlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3NpbmdsZV9jb25maWcpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgY2hhbm5lbCwKKwkJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJCSAgIGludCByZWYsCisJCQkJCSAgIGludCB0cmlnX2NoYW4sCisJCQkJCSAgIGludCB0cmlnX3R5cGUsCisJCQkJCSAgIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJIGludCBzdWJkZXZpY2UsCisJCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zaW5nbGVfd3JpdGUpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkJICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJCSAgIGludCBjb3VudCwKKwkJCQkJICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJCSAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgdGltZV9vdXQsCisJCQkJCSAgICAgICBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCQkgaW50IHJlYWRfbW9kZSwKKwkJCQkJIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGFydCkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgIGludCBzdGFydF9tb2RlLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgaW50IHdhaXQsCisJCQkJCSAgIGludCAqc3RhdHVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCQkgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fd3JpdGUpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkJICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9sb2NrX2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfbG9ja19zdWJkZXZpY2UpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJIGludCBzdWJkZXZpY2UsIGludCBsb2NrLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgICBjaGFyICoqZGVzY3JpcHRpb24pOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgIGludCAqdmVuZG9yX2lkLAorCQkJCQkgICAgaW50ICpkZXZpY2VfaWQsCisJCQkJCSAgICBpbnQgKnNlcmlhbF9ubywKKwkJCQkJICAgIGludCAqYnVzX3R5cGUsCisJCQkJCSAgICBpbnQgKmJ1c19ubywKKwkJCQkJICAgIGludCAqZGV2X25vLAorCQkJCQkgICAgaW50ICpmdW5jX25vLCBpbnQgKnBsdWdnZWQpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgIGNoYXIgKipuYW1lKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJICAgY2hhciAqKm5hbWUpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSAgaW50ICpudW1iZXIpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQlpbnQgc3ViZGV2aWNlLCBpbnQgKm51bWJlcik7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICAgIGludCB1bml0LCBpbnQgKmNvdW50KTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCQkJIGludCB1bml0LAorCQkJCQkJIGludCAqbWluLAorCQkJCQkJIGludCAqbWF4LAorCQkJCQkJIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgIGludCByYW5nZSwKKwkJCQkJICAgaW50ICp1bml0LAorCQkJCQkgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJICBpbnQgc3RhcnRfc3ViZGV2aWNlLAorCQkJCQkJICBpbnQgdHlwZSwKKwkJCQkJCSAgaW50IHN1YnR5cGUsIGludCAqc3ViZGV2aWNlKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgICAgIGludCBzdWJkZXZpY2UsIGludCAqY2Fwcyk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgICAgaW50IHN1YmRldmljZSwKKwkJCQkJCSAgICBpbnQgY2FwLAorCQkJCQkJICAgIGludCAqYXJncywgaW50IGNvdW50KTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV90aW1lcikgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgdGltZXIsCisJCQkJICAgICAgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgICAgICB1aW50NjRfdCAqIG1pbl90aWNrcywKKwkJCQkgICAgICB1aW50NjRfdCAqIG1heF90aWNrcyk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSAgICAgIGludCAqdmVyc2lvbik7CisKKwlpbnQgKCptZV9kZXZpY2VfY29uZmlnX2xvYWQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJICAgICAgbWVfY2ZnX2RldmljZV9lbnRyeV90ICogY29uZmlnKTsKKworCXZvaWQgKCptZV9kZXZpY2VfZGVzdHJ1Y3RvcikgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UpOworfSBtZV9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBQQ0kgZGV2aWNlIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBQQ0kgZGV2aWNlIGNvbnRleHQgYXMgaGFuZGVkIG92ZXIgYnkga2VybmVsLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGV2aWNlX3BjaV9pbml0KG1lX2RldmljZV90ICogbWVfZGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSk7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgVVNCIGRldmljZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gdXNiX2ludGVyZmFjZSBUaGUgVVNCIGRldmljZSBpbnRlcmZhY2UgYXMgaGFuZGVkIG92ZXIgYnkga2VybmVsLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCisvL2ludCBtZV9kZXZpY2VfdXNiX2luaXQobWVfZGV2aWNlX3QgKm1lX2RldmljZSwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CisKKy8qKgorICAqIEBicmllZiBEZWluaXRpYWxpemVzIGEgZGV2aWNlIGJhc2UgY2xhc3Mgc3RydWN0dXJlIGFuZCBmcmVlcyBhbnkgcHJldmlvdXNseQorICAqIHJlcXVlc3RlZCByZXNvdXJjZXMgcmVsYXRlZCB3aXRoIHRoaXMgc3RydWN0dXJlLiBJdCBhbHNvIGZyZWVzIGFueSBzdWJkZXZpY2UKKyAgKiBpbnN0YW5jZSBob2xkIGJ5IHRoZSBzdWJkZXZpY2UgbGlzdC4KKyAgKgorICAqIEBwYXJhbSBtZV9kZXZpY2UgVGhlIGRldmljZSBjbGFzcyB0byBkZWluaXRpYWxpemUuCisgICovCit2b2lkIG1lX2RldmljZV9kZWluaXQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0ZTM2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qKgorICogQGZpbGUgbWVfZGxpc3QuYworICoKKyAqIEBicmllZiBJbXBsZW1lbnRzIHRoZSBkZXZpY2UgbGlzdCBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorCisjaW5jbHVkZSAibWVkbGlzdC5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworaW50IG1lX2RsaXN0X3F1ZXJ5X251bWJlcl9kZXZpY2VzKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QsIGludCAqbnVtYmVyKQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisJKm51bWJlciA9IGRsaXN0LT5uOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCit1bnNpZ25lZCBpbnQgbWVfZGxpc3RfZ2V0X251bWJlcl9kZXZpY2VzKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QpCit7CisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKwlyZXR1cm4gZGxpc3QtPm47Cit9CisKK21lX2RldmljZV90ICptZV9kbGlzdF9nZXRfZGV2aWNlKHN0cnVjdCBtZV9kbGlzdCAqIGRsaXN0LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfZGV2aWNlX3QgKmRldmljZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChpbmRleCA+PSBkbGlzdC0+bikgeworCQlQRVJST1IoIkluZGV4IG91dCBvZiByYW5nZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmRsaXN0LT5oZWFkKSB7CisJCWlmIChpID09IGluZGV4KSB7CisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJYnJlYWs7CisJCX0KKworCQkrK2k7CisJfQorCisJcmV0dXJuIGRldmljZTsKK30KKwordm9pZCBtZV9kbGlzdF9hZGRfZGV2aWNlX3RhaWwoc3RydWN0IG1lX2RsaXN0ICpkbGlzdCwgbWVfZGV2aWNlX3QgKiBkZXZpY2UpCit7CisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+bGlzdCwgJmRsaXN0LT5oZWFkKTsKKwkrK2RsaXN0LT5uOworfQorCittZV9kZXZpY2VfdCAqbWVfZGxpc3RfZGVsX2RldmljZV90YWlsKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0OworCW1lX2RldmljZV90ICpkZXZpY2U7CisKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJaWYgKGxpc3RfZW1wdHkoJmRsaXN0LT5oZWFkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsYXN0ID0gZGxpc3QtPmhlYWQucHJldjsKKworCWRldmljZSA9IGxpc3RfZW50cnkobGFzdCwgbWVfZGV2aWNlX3QsIGxpc3QpOworCisJbGlzdF9kZWwobGFzdCk7CisKKwktLWRsaXN0LT5uOworCisJcmV0dXJuIGRldmljZTsKK30KKworaW50IG1lX2RsaXN0X2luaXQobWVfZGxpc3RfdCAqIGRsaXN0KQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlJTklUX0xJU1RfSEVBRCgmZGxpc3QtPmhlYWQpOworCWRsaXN0LT5uID0gMDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZV9kbGlzdF9kZWluaXQobWVfZGxpc3RfdCAqIGRsaXN0KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZGxpc3QtPmhlYWQpKSB7CisJCXMgPSBkbGlzdC0+aGVhZC5uZXh0OworCQlsaXN0X2RlbChzKTsKKwkJZGV2aWNlID0gbGlzdF9lbnRyeShzLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCWRldmljZS0+bWVfZGV2aWNlX2Rlc3RydWN0b3IoZGV2aWNlKTsKKwl9CisKKwlkbGlzdC0+biA9IDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTFjMTFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxpc3QuaApAQCAtMCwwICsxLDkxIEBACisvKioKKyAqIEBmaWxlIG1lX2RsaXN0LmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIGRldmljZSBsaXN0IGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FX0RMSVNUX0hfCisjZGVmaW5lIF9NRV9ETElTVF9IXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIGRldmljZSBsaXN0IGNvbnRhaW5lci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfZGxpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsJCS8qKjwgVGhlIGhlYWQgb2YgdGhlIGludGVybmFsIGxpc3QuICovCisJdW5zaWduZWQgaW50IG47CQkJLyoqPCBUaGUgbnVtYmVyIG9mIGRldmljZXMgaW4gdGhlIGxpc3QuICovCit9IG1lX2RsaXN0X3Q7CisKKy8qKgorICogQGJyaWVmIFF1ZXJpZXMgdGhlIG51bWJlciBvZiBkZXZpY2VzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqIEBwYXJhbVtvdXRdIG51bWJlciBUaGUgbnVtYmVyIG9mIGRldmljZXMuCisgKgorICogQHJldHVybiBNRS1pRFMgZXJyb3IgY29kZS4KKyAqLworaW50IG1lX2RsaXN0X3F1ZXJ5X251bWJlcl9kZXZpY2VzKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QsIGludCAqbnVtYmVyKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRldmljZXMgY3VycmVudGx5IGluc2lkZSB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gZGxpc3QgVGhlIGRldmljZSBsaXN0IHRvIHF1ZXJ5LgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBkZXZpY2VzIGluIHRoZSBsaXN0LgorICovCit1bnNpZ25lZCBpbnQgbWVfZGxpc3RfZ2V0X251bWJlcl9kZXZpY2VzKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QpOworCisvKioKKyAqIEBicmllZiBHZXQgYSBkZXZpY2UgYnkgaW5kZXguCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGRldmljZSB0byBnZXQgaW4gdGhlIGxpc3QuCisgKgorICogQHJldHVybiBUaGUgZGV2aWNlIGF0IGluZGV4IGlmIGF2YWlsYWJsZS5cbgorICogICAgICAgICBOVUxMIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCisgKi8KK21lX2RldmljZV90ICptZV9kbGlzdF9nZXRfZGV2aWNlKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QsIHVuc2lnbmVkIGludCBpbmRleCk7CisKKy8qKgorICogQGJyaWVmIEFkZHMgYSBkZXZpY2UgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdCB0byBhZGQgYSBkZXZpY2UgdG8uCisgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgdG8gYWRkIHRvIHRoZSBsaXN0LgorICovCit2b2lkIG1lX2RsaXN0X2FkZF9kZXZpY2VfdGFpbChzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0LCBtZV9kZXZpY2VfdCAqIGRldmljZSk7CisKKy8qKgorICogQGJyaWVmIFJlbW92ZXMgYSBkZXZpY2UgZnJvbSB0aGUgdGFpbCBvZiB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gZGxpc3QgVGhlIGRldmljZSBsaXN0LgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgcmVtb3ZlZCBzdWJkZWl2Y2UuXG4KKyAqICAgICAgICAgTlVMTCBpbiBjYXNlcyB3aGVyZSB0aGUgbGlzdCB3YXMgZW1wdHkuCisgKi8KK21lX2RldmljZV90ICptZV9kbGlzdF9kZWxfZGV2aWNlX3RhaWwoc3RydWN0IG1lX2RsaXN0ICpkbGlzdCk7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgZGV2aWNlIGxpc3Qgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBsb2NrIFRoZSBkZXZpY2UgbGlzdCBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGxpc3RfaW5pdChtZV9kbGlzdF90ICogZGxpc3QpOworCisvKioKKyAqIEBicmllZiBEZWluaXRpYWxpemVzIGEgZGV2aWNlIGxpc3Qgc3RydWN0dXJlIGFuZCBkZXN0cnVjdHMgZXZlcnkgZGV2aWNlIGluIGl0LgorICoKKyAqIEBwYXJhbSBkbGlzdCBUaGUgZGV2aWNlIGxpc3Qgc3RydWN0dXJlIHRvIGRlaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCit2b2lkIG1lX2RsaXN0X2RlaW5pdChtZV9kbGlzdF90ICogZGxpc3QpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0OWUzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qKgorICogQGZpbGUgbWVkbG9jay5jCisgKgorICogQGJyaWVmIEltcGxlbWVudHMgdGhlIGRldmljZSBsb2NrIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lc2xpc3QuaCIKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lZGxvY2suaCIKKworaW50IG1lX2Rsb2NrX2VudGVyKHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmRsb2NrLT5zcGluX2xvY2spOworCisJaWYgKChkbG9jay0+ZmlsZXApICE9IE5VTEwgJiYgKGRsb2NrLT5maWxlcCAhPSBmaWxlcCkpIHsKKwkJUEVSUk9SKCJEZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQlzcGluX3VubG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisJCXJldHVybiBNRV9FUlJOT19MT0NLRUQ7CisJfQorCisJZGxvY2stPmNvdW50Kys7CisKKwlzcGluX3VubG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworaW50IG1lX2Rsb2NrX2V4aXQoc3RydWN0IG1lX2Rsb2NrICpkbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCXNwaW5fbG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisJZGxvY2stPmNvdW50LS07CisJc3Bpbl91bmxvY2soJmRsb2NrLT5zcGluX2xvY2spOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK2ludCBtZV9kbG9ja19sb2NrKHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssCisJCSAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzLCBtZV9zbGlzdF90ICogc2xpc3QpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJaW50IGk7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCXNwaW5fbG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisKKwlzd2l0Y2ggKGxvY2spIHsKKworCWNhc2UgTUVfTE9DS19SRUxFQVNFOgorCQlpZiAoKGRsb2NrLT5maWxlcCA9PSBmaWxlcCkgfHwgKGRsb2NrLT5maWxlcCA9PSBOVUxMKSkgeworCQkJZGxvY2stPmZpbGVwID0gTlVMTDsKKworCQkJLyogVW5sb2NrIGFsbCBwb3NzaWJseSBsb2NrZWQgc3ViZGV2aWNlcy4gKi8KKworCQkJZm9yIChpID0gMDsgaSA8IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcyhzbGlzdCk7CisJCQkgICAgIGkrKykgeworCQkJCXN1YmRldmljZSA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2Uoc2xpc3QsIGkpOworCisJCQkJaWYgKHN1YmRldmljZSkKKwkJCQkJZXJyID0KKwkJCQkJICAgIHN1YmRldmljZS0+CisJCQkJCSAgICBtZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2UKKwkJCQkJICAgIChzdWJkZXZpY2UsIGZpbGVwLCBNRV9MT0NLX1JFTEVBU0UsCisJCQkJCSAgICAgZmxhZ3MpOworCQkJCWVsc2UKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19TRVQ6CisJCWlmIChkbG9jay0+Y291bnQpIHsKKwkJCVBFUlJPUigiRGV2aWNlIGlzIHVzZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19VU0VEOworCQl9IGVsc2UgaWYgKChkbG9jay0+ZmlsZXAgIT0gTlVMTCkgJiYgKGRsb2NrLT5maWxlcCAhPSBmaWxlcCkpIHsKKwkJCVBFUlJPUigiRGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0xPQ0tFRDsKKwkJfSBlbHNlIGlmIChkbG9jay0+ZmlsZXAgPT0gTlVMTCkgeworCQkJLyogQ2hlY2sgYW55IHN1YmRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLiAqLworCisJCQlmb3IgKGkgPSAwOyBpIDwgbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKHNsaXN0KTsKKwkJCSAgICAgaSsrKSB7CisJCQkJc3ViZGV2aWNlID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZShzbGlzdCwgaSk7CisKKwkJCQlpZiAoc3ViZGV2aWNlKSB7CisJCQkJCWlmICgoZXJyID0KKwkJCQkJICAgICBzdWJkZXZpY2UtPgorCQkJCQkgICAgIG1lX3N1YmRldmljZV9sb2NrX3N1YmRldmljZQorCQkJCQkgICAgIChzdWJkZXZpY2UsIGZpbGVwLCBNRV9MT0NLX0NIRUNLLAorCQkJCQkgICAgICBmbGFncykpKSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIkEgc3ViZGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJfQorCQkJfQorCisJCQkvKiBJZiBubyBzdWJkZXZpY2VzIGFyZSBsb2NrZWQgYnkgb3RoZXIgcHJvY2Vzc2VzLAorCQkJICAgd2UgY2FuIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkZXZpY2UuIE90aGVyd2lzZSB3ZSBqdW1wIGFoZWFkLiAqLworCQkJaWYgKCFlcnIpCisJCQkJZGxvY2stPmZpbGVwID0gZmlsZXA7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19DSEVDSzoKKwkJaWYgKGRsb2NrLT5jb3VudCkgeworCQkJZXJyID0gTUVfRVJSTk9fVVNFRDsKKwkJfSBlbHNlIGlmICgoZGxvY2stPmZpbGVwICE9IE5VTEwpICYmIChkbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCQllcnIgPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0gZWxzZSBpZiAoZGxvY2stPmZpbGVwID09IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoc2xpc3QpOworCQkJICAgICBpKyspIHsKKwkJCQlzdWJkZXZpY2UgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKHNsaXN0LCBpKTsKKworCQkJCWlmIChzdWJkZXZpY2UpIHsKKwkJCQkJaWYgKChlcnIgPQorCQkJCQkgICAgIHN1YmRldmljZS0+CisJCQkJCSAgICAgbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlCisJCQkJCSAgICAgKHN1YmRldmljZSwgZmlsZXAsIE1FX0xPQ0tfQ0hFQ0ssCisJCQkJCSAgICAgIGZsYWdzKSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQSBzdWJkZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBsb2NrLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9MT0NLOworCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZkbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgbWVfZGxvY2tfZGVpbml0KHN0cnVjdCBtZV9kbG9jayAqZGxvY2spCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworfQorCitpbnQgbWVfZGxvY2tfaW5pdChtZV9kbG9ja190ICogZGxvY2spCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJZGxvY2stPmZpbGVwID0gTlVMTDsKKwlkbG9jay0+Y291bnQgPSAwOworCXNwaW5fbG9ja19pbml0KCZkbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxvY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ZGRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmgKQEAgLTAsMCArMSw3NiBAQAorLyoqCisgKiBAZmlsZSBtZWRsb2NrLmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIGRldmljZSBsb2NrIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FRExPQ0tfSF8KKyNkZWZpbmUgX01FRExPQ0tfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBkZXZpY2UgbG9jayBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfZGxvY2sgeworCXN0cnVjdCBmaWxlICpmaWxlcDsJCS8qKjwgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBkZXZpY2UuICovCisJaW50IGNvdW50OwkJCQkvKio8IE51bWJlciBvZiB0YXNrcyB3aGljaCBhcmUgaW5zaWRlIHRoZSBkZXZpY2UuICovCisJc3BpbmxvY2tfdCBzcGluX2xvY2s7CS8qKjwgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGF0dHJpYnV0ZXMgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KK30gbWVfZGxvY2tfdDsKKworLyoqCisgKiBAYnJpZWYgVHJpZXMgdG8gZW50ZXIgYSBkZXZpY2UuCisgKgorICogQHBhcmFtIGRsb2NrIFRoZSBkZXZpY2UgbG9jayBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmaWxlcCBUaGUgZmlsZSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX2Rsb2NrX2VudGVyKHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCk7CisKKy8qKgorICogQGJyaWVmIEV4aXRzIGEgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBkbG9jayBUaGUgZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmlsZXAgVGhlIGZpbGUgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9kbG9ja19leGl0KHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCk7CisKKy8qKgorICogQGJyaWVmIFRyaWVzIHRvIHBlcmZvcm0gYSBsb2NraW5nIGFjdGlvbiBvbiBhIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZGxvY2sgVGhlIGRldmljZSBsb2NrIGluc3RhbmNlLgorICogQHBhcmFtIGZpbGVwIFRoZSBmaWxlIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBwcm9jZXNzLgorICogQHBhcmFtIFRoZSBhY3Rpb24gdG8gYmUgZG9uZS4KKyAqIEBwYXJhbSBmbGFncyBGbGFncyBmcm9tIHVzZXIgc3BhY2UuCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IG9mIHRoZSBkZXZpY2UuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9kbG9ja19sb2NrKHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssCisJCSAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzLCBtZV9zbGlzdF90ICogc2xpc3QpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhIGxvY2sgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBkbG9jayBUaGUgbG9jayBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGxvY2tfaW5pdChtZV9kbG9ja190ICogZGxvY2spOworCisvKioKKyAqIEBicmllZiBEZWluaXRpYWxpemVzIGEgbG9jayBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIGRsb2NrIFRoZSBsb2NrIHN0cnVjdHVyZSB0byBkZWluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLwordm9pZCBtZV9kbG9ja19kZWluaXQobWVfZGxvY2tfdCAqIGRsb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlMjQwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRyaXZlci5oCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1lZHJpdmVyLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqICBBdXRob3I6CUtyenlzenRvZiBHYW50emtlCTxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVEUklWRVJfSF8KKyNkZWZpbmUgX01FRFJJVkVSX0hfCisKKyNpbmNsdWRlICJtZXR5cGVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgZHJpdmVyIHN5c3RlbQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVPcGVuKGludCBpRmxhZ3MpOworCWludCBtZUNsb3NlKGludCBpRmxhZ3MpOworCisJaW50IG1lTG9ja0RyaXZlcihpbnQgaUxvY2ssIGludCBpRmxhZ3MpOworCWludCBtZUxvY2tEZXZpY2UoaW50IGlEZXZpY2UsIGludCBpTG9jaywgaW50IGlGbGFncyk7CisJaW50IG1lTG9ja1N1YmRldmljZShpbnQgaURldmljZSwgaW50IGlTdWJkZXZpY2UsIGludCBpTG9jaywgaW50IGlGbGFncyk7CisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgRXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZUVycm9yR2V0TGFzdE1lc3NhZ2UoY2hhciAqcGNFcnJvck1zZywgaW50IGlDb3VudCk7CisJaW50IG1lRXJyb3JHZXRNZXNzYWdlKGludCBpRXJyb3JDb2RlLCBjaGFyICpwY0Vycm9yTXNnLCBpbnQgaUNvdW50KTsKKwlpbnQgbWVFcnJvclNldERlZmF1bHRQcm9jKGludCBpU3dpdGNoKTsKKwlpbnQgbWVFcnJvclNldFVzZXJQcm9jKG1lRXJyb3JDQl90IHBFcnJvclByb2MpOworCisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgRnVuY3Rpb25zIHRvIHBlcmZvcm0gSS9PIG9uIGEgZGV2aWNlCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZUlPSXJxU2V0Q2FsbGJhY2soCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJbWVJT0lycUNCX3QgcENhbGxiYWNrLAorCQkJdm9pZCAqcENhbGxiYWNrQ29udGV4dCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPSXJxU3RhcnQoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50IGlJcnFTb3VyY2UsCisJCQlpbnQgaUlycUVkZ2UsCisJCQlpbnQgaUlycUFyZywKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPSXJxU3RvcCgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaUNoYW5uZWwsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT0lycVdhaXQoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50ICpwaUlycUNvdW50LAorCQkJaW50ICpwaVZhbHVlLAorCQkJaW50IGlUaW1lT3V0LAorCQkJaW50IGlGbGFncyk7CisKKwlpbnQgbWVJT1Jlc2V0RGV2aWNlKGludCBpRGV2aWNlLCBpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1Jlc2V0U3ViZGV2aWNlKGludCBpRGV2aWNlLCBpbnQgaVN1YmRldmljZSwgaW50IGlGbGFncyk7CisKKwlpbnQgbWVJT1N0cmVhbUZyZXF1ZW5jeVRvVGlja3MoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlUaW1lciwKKwkJCWRvdWJsZSAqcGRGcmVxdWVuY3ksCisJCQlpbnQgKnBpVGlja3NMb3csCisJCQlpbnQgKnBpVGlja3NIaWdoLAorCQkJaW50IGlGbGFncyk7CisKKwlpbnQgbWVJT1NpbmdsZUNvbmZpZygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaUNoYW5uZWwsCisJCQlpbnQgaVNpbmdsZUNvbmZpZywKKwkJCWludCBpUmVmLAorCQkJaW50IGlUcmlnQ2hhbiwKKwkJCWludCBpVHJpZ1R5cGUsCisJCQlpbnQgaVRyaWdFZGdlLAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TaW5nbGUobWVJT1NpbmdsZV90ICpwU2luZ2xlTGlzdCwgaW50IGlDb3VudCwgaW50IGlGbGFncyk7CisKKwlpbnQgbWVJT1N0cmVhbUNvbmZpZygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQltZUlPU3RyZWFtQ29uZmlnX3QgKnBDb25maWdMaXN0LAorCQkJaW50IGlDb3VudCwKKwkJCW1lSU9TdHJlYW1UcmlnZ2VyX3QgKnBUcmlnZ2VyLAorCQkJaW50IGlGaWZvSXJxVGhyZXNob2xkLAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1OZXdWYWx1ZXMoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlUaW1lT3V0LAorCQkJaW50ICpwaUNvdW50LAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1SZWFkKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpUmVhZE1vZGUsCisJCQlpbnQgKnBpVmFsdWVzLAorCQkJaW50ICpwaUNvdW50LAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1Xcml0ZSgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVdyaXRlTW9kZSwKKwkJCWludCAqcGlWYWx1ZXMsCisJCQlpbnQgKnBpQ291bnQsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1N0cmVhbVN0YXJ0KG1lSU9TdHJlYW1TdGFydF90ICpwU3RhcnRMaXN0LCBpbnQgaUNvdW50LCBpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1N0cmVhbVN0b3AobWVJT1N0cmVhbVN0b3BfdCAqcFN0b3BMaXN0LCBpbnQgaUNvdW50LCBpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1N0cmVhbVN0YXR1cygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVdhaXQsCisJCQlpbnQgKnBpU3RhdHVzLAorCQkJaW50ICpwaUNvdW50LAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1TZXRDYWxsYmFja3MoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJbWVJT1N0cmVhbUNCX3QgcFN0YXJ0Q0IsCisJCQl2b2lkICpwU3RhcnRDQkNvbnRleHQsCisJCQltZUlPU3RyZWFtQ0JfdCBwTmV3VmFsdWVzQ0IsCisJCQl2b2lkICpwTmV3VmFsdWVzQ0JDb250ZXh0LAorCQkJbWVJT1N0cmVhbUNCX3QgcEVuZENCLAorCQkJdm9pZCAqcEVuZENCQ29udGV4dCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtVGltZVRvVGlja3MoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlUaW1lciwKKwkJCWRvdWJsZSAqcGRUaW1lLAorCQkJaW50ICpwaVRpY2tzTG93LAorCQkJaW50ICpwaVRpY2tzSGlnaCwKKwkJCWludCBpRmxhZ3MpOworCisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgRnVuY3Rpb25zIHRvIHF1ZXJ5IHRoZSBkcml2ZXIgc3lzdGVtCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZVF1ZXJ5RGVzY3JpcHRpb25EZXZpY2UoaW50IGlEZXZpY2UsIGNoYXIgKnBjRGVzY3JpcHRpb24sIGludCBpQ291bnQpOworCisJaW50IG1lUXVlcnlJbmZvRGV2aWNlKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgKnBpVmVuZG9ySWQsCisJCQlpbnQgKnBpRGV2aWNlSWQsCisJCQlpbnQgKnBpU2VyaWFsTm8sCisJCQlpbnQgKnBpQnVzVHlwZSwKKwkJCWludCAqcGlCdXNObywKKwkJCWludCAqcGlEZXZObywKKwkJCWludCAqcGlGdW5jTm8sCisJCQlpbnQgKnBpUGx1Z2dlZCk7CisKKwlpbnQgbWVRdWVyeU5hbWVEZXZpY2UoaW50IGlEZXZpY2UsIGNoYXIgKnBjTmFtZSwgaW50IGlDb3VudCk7CisJaW50IG1lUXVlcnlOYW1lRGV2aWNlRHJpdmVyKGludCBpRGV2aWNlLCBjaGFyICpwY05hbWUsIGludCBpQ291bnQpOworCisJaW50IG1lUXVlcnlOdW1iZXJEZXZpY2VzKGludCAqcGlOdW1iZXIpOworCWludCBtZVF1ZXJ5TnVtYmVyU3ViZGV2aWNlcyhpbnQgaURldmljZSwgaW50ICpwaU51bWJlcik7CisJaW50IG1lUXVlcnlOdW1iZXJDaGFubmVscyhpbnQgaURldmljZSwgaW50IGlTdWJkZXZpY2UsIGludCAqcGlOdW1iZXIpOworCWludCBtZVF1ZXJ5TnVtYmVyUmFuZ2VzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVW5pdCwKKwkJCWludCAqcGlOdW1iZXIpOworCisJaW50IG1lUXVlcnlSYW5nZUJ5TWluTWF4KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVW5pdCwKKwkJCWRvdWJsZSAqcGRNaW4sCisJCQlkb3VibGUgKnBkTWF4LAorCQkJaW50ICpwaU1heERhdGEsCisJCQlpbnQgKnBpUmFuZ2UpOworCWludCBtZVF1ZXJ5UmFuZ2VJbmZvKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpUmFuZ2UsCisJCQlpbnQgKnBpVW5pdCwKKwkJCWRvdWJsZSAqcGRNaW4sCisJCQlkb3VibGUgKnBkTWF4LAorCQkJaW50ICpwaU1heERhdGEpOworCisJaW50IG1lUXVlcnlTdWJkZXZpY2VCeVR5cGUoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3RhcnRTdWJkZXZpY2UsCisJCQlpbnQgaVR5cGUsCisJCQlpbnQgaVN1YnR5cGUsCisJCQlpbnQgKnBpU3ViZGV2aWNlKTsKKwlpbnQgbWVRdWVyeVN1YmRldmljZVR5cGUoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50ICpwaVR5cGUsCisJCQlpbnQgKnBpU3VidHlwZSk7CisJaW50IG1lUXVlcnlTdWJkZXZpY2VDYXBzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCAqcGlDYXBzKTsKKwlpbnQgbWVRdWVyeVN1YmRldmljZUNhcHNBcmdzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpQ2FwLAorCQkJaW50ICpwaUFyZ3MsCisJCQlpbnQgaUNvdW50KTsKKworCWludCBtZVF1ZXJ5VmVyc2lvbkxpYnJhcnkoaW50ICpwaVZlcnNpb24pOworCWludCBtZVF1ZXJ5VmVyc2lvbk1haW5Ecml2ZXIoaW50ICpwaVZlcnNpb24pOworCWludCBtZVF1ZXJ5VmVyc2lvbkRldmljZURyaXZlcihpbnQgaURldmljZSwgaW50ICpwaVZlcnNpb24pOworCisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgQ29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZVV0aWxpdHlFeHRyYWN0VmFsdWVzKAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50ICpwaUFJQnVmZmVyLAorCQkJaW50IGlBSUJ1ZmZlckNvdW50LAorCQkJbWVJT1N0cmVhbUNvbmZpZ190ICpwQ29uZmlnTGlzdCwKKwkJCWludCBpQ29uZmlnTGlzdENvdW50LAorCQkJaW50ICpwaUNoYW5CdWZmZXIsCisJCQlpbnQgKnBpQ2hhbkJ1ZmZlckNvdW50KTsKKwlpbnQgbWVVdGlsaXR5RGlnaXRhbFRvUGh5c2ljYWwoCisJCQlkb3VibGUgZE1pbiwKKwkJCWRvdWJsZSBkTWF4LAorCQkJaW50IGlNYXhEYXRhLAorCQkJaW50IGlEYXRhLAorCQkJaW50IGlNb2R1bGVUeXBlLAorCQkJZG91YmxlIGRSZWZWYWx1ZSwKKwkJCWRvdWJsZSAqcGRQaHlzaWNhbCk7CisJaW50IG1lVXRpbGl0eURpZ2l0YWxUb1BoeXNpY2FsVigKKwkJCWRvdWJsZSBkTWluLAorCQkJZG91YmxlIGRNYXgsCisJCQlpbnQgaU1heERhdGEsCisJCQlpbnQgKnBpRGF0YUJ1ZmZlciwKKwkJCWludCBpQ291bnQsCisJCQlpbnQgaU1vZHVsZVR5cGUsCisJCQlkb3VibGUgZFJlZlZhbHVlLAorCQkJZG91YmxlICpwZFBoeXNpY2FsQnVmZmVyKTsKKwlpbnQgbWVVdGlsaXR5UGh5c2ljYWxUb0RpZ2l0YWwoCisJCQlkb3VibGUgZE1pbiwKKwkJCWRvdWJsZSBkTWF4LAorCQkJaW50IGlNYXhEYXRhLAorCQkJZG91YmxlIGRQaHlzaWNhbCwKKwkJCWludCAqcGlEYXRhKTsKKwlpbnQgbWVVdGlsaXR5UFdNU3RhcnQoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlMSwKKwkJCWludCBpU3ViZGV2aWNlMiwKKwkJCWludCBpU3ViZGV2aWNlMywKKwkJCWludCBpUmVmLAorCQkJaW50IGlQcmVzY2FsZXIsCisJCQlpbnQgaUR1dHlDeWNsZSwKKwkJCWludCBpRmxhZyk7CisJaW50IG1lVXRpbGl0eVBXTVN0b3AoaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZTEpOworCWludCBtZVV0aWxpdHlQV01SZXN0YXJ0KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZTEsCisJCQlpbnQgaVJlZiwKKwkJCWludCBpUHJlc2NhbGVyKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGUgaW50byBkcml2ZXIgc3lzdGVtCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZUNvbmZpZ0xvYWQoY2hhciAqcGNDb25maWdGaWxlKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEZ1bmN0aW9ucyB0byBxdWVyeSBhIHJlbW90ZSBkcml2ZXIgc3lzdGVtCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZVJRdWVyeURlc2NyaXB0aW9uRGV2aWNlKAorCQkJY2hhciAqbG9jYXRpb24sCisJCQlpbnQgaURldmljZSwKKwkJCWNoYXIgKnBjRGVzY3JpcHRpb24sCisJCQlpbnQgaUNvdW50KTsKKworCWludCBtZVJRdWVyeUluZm9EZXZpY2UoCisJCQljaGFyICpsb2NhdGlvbiwKKwkJCWludCBpRGV2aWNlLAorCQkJaW50ICpwaVZlbmRvcklkLAorCQkJaW50ICpwaURldmljZUlkLAorCQkJaW50ICpwaVNlcmlhbE5vLAorCQkJaW50ICpwaUJ1c1R5cGUsCisJCQlpbnQgKnBpQnVzTm8sCisJCQlpbnQgKnBpRGV2Tm8sCisJCQlpbnQgKnBpRnVuY05vLAorCQkJaW50ICpwaVBsdWdnZWQpOworCisJaW50IG1lUlF1ZXJ5TmFtZURldmljZSgKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQljaGFyICpwY05hbWUsCisJCQlpbnQgaUNvdW50KTsKKworCWludCBtZVJRdWVyeU51bWJlckRldmljZXMoY2hhciAqbG9jYXRpb24sIGludCAqcGlOdW1iZXIpOworCWludCBtZVJRdWVyeU51bWJlclN1YmRldmljZXMoY2hhciAqbG9jYXRpb24sIGludCBpRGV2aWNlLCBpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVSUXVlcnlOdW1iZXJDaGFubmVscygKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCAqcGlOdW1iZXIpOworCWludCBtZVJRdWVyeU51bWJlclJhbmdlcygKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVW5pdCwKKwkJCWludCAqcGlOdW1iZXIpOworCisJaW50IG1lUlF1ZXJ5UmFuZ2VJbmZvKAorCQkJY2hhciAqbG9jYXRpb24sCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlSYW5nZSwKKwkJCWludCAqcGlVbml0LAorCQkJZG91YmxlICpwZE1pbiwKKwkJCWRvdWJsZSAqcGRNYXgsCisJCQlpbnQgKnBpTWF4RGF0YSk7CisKKwlpbnQgbWVSUXVlcnlTdWJkZXZpY2VUeXBlKAorCQkJY2hhciAqbG9jYXRpb24sCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50ICpwaVR5cGUsCisJCQlpbnQgKnBpU3VidHlwZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZHVtbXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWR1bW15LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5ZjA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWR1bW15LmMKQEAgLTAsMCArMSwxMjY2IEBACisvKiBEZXZpY2UgZHJpdmVyIGZvciBNZWlsaGF1cyBNRS1EVU1NWSBkZXZpY2VzLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIFVzZXIgYXBwbGljYXRpb24gY291bGQgYWxzbyBpbmNsdWRlIHRoZSBrZXJuZWwgaGVhZGVyIGZpbGVzLiBCdXQgdGhlCisgKiByZWFsIGtlcm5lbCBmdW5jdGlvbnMgYXJlIHByb3RlY3RlZCBieSAjaWZkZWYgX19LRVJORUxfXy4KKyAqLworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBUaGlzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgbW9kdWxlLmggaXMgaW5jbHVkZWQuIE5vdCBuZWVkZWQsIHdoZW4KKyAqIGl0IGlzIGEgYnVpbHQgaW4gZHJpdmVyLgorICovCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWVkdW1teS5oIgorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9faXJxX3N0YXJ0KG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQlpbnQgc3ViZGV2aWNlLAorCQkJCWludCBjaGFubmVsLAorCQkJCWludCBpcnFfc291cmNlLAorCQkJCWludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19pcnFfd2FpdChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkgICAgICAgaW50IHN1YmRldmljZSwKKwkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCSAgICAgICBpbnQgKmlycV9jb3VudCwKKwkJCSAgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZW91dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX2lycV9zdG9wKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCSAgICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3Jlc2V0X2RldmljZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19yZXNldF9zdWJkZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zaW5nbGVfY29uZmlnKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgaW50IHJlZiwKKwkJCQkgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3NpbmdsZV9yZWFkKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc2luZ2xlX3dyaXRlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgIGludCBjaGFubmVsLAorCQkJCSAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX2NvbmZpZyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgaW50IGNvdW50LAorCQkJCSAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCWludCBzdWJkZXZpY2UsCisJCQkJCWludCB0aW1lb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3JlYWQobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgaW50IHJlYWRfbW9kZSwKKwkJCQkgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3N0YXJ0KG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zdHJlYW1fc3RhdHVzKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgIGludCB3YWl0LAorCQkJCSAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zdHJlYW1fc3RvcChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBzdWJkZXZpY2UsIGludCBzdG9wX21vZGUsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zdHJlYW1fd3JpdGUobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9sb2NrX2RldmljZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBsb2NrLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfbG9ja19zdWJkZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgc3ViZGV2aWNlLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJICAgIGNoYXIgKipkZXNjcmlwdGlvbikKK3sKKwltZWR1bW15X2RldmljZV90ICppbnN0YW5jZSA9IChtZWR1bW15X2RldmljZV90ICopIGRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworLy8gICAgICBpZiAoaW5zdGFuY2UtPm1hZ2ljICE9IE1FRFVNTVlfTUFHSUNfTlVNQkVSKQorLy8gICAgICB7CisvLyAgICAgICAgICAgICAgUEVSUk9SKCJXcm9uZyBtYWdpYyBudW1iZXIuXG4iKTsKKy8vICAgICAgICAgICAgICByZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisvLyAgICAgIH0KKworCXN3aXRjaCAoaW5zdGFuY2UtPmRldmljZV9pZCkgeworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMDoKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQToKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQjoKKwkJKmRlc2NyaXB0aW9uID0gTUUxMDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTEwMDA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEI6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRUE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEVCOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwkJKmRlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBDOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJKmRlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBEOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF80VToKKwkJKmRlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDA0VTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFU6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwOFU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzEyVToKKwkJKmRlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxMlU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VToKKwkJKmRlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SToKKwkJKmRlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU4STsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjEwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MDoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NTA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MElTOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MElTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MFM6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODA6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MEk6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MFM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSVM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTg6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEkxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTg6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEkxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDhESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDRGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTg6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSThESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDVGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEkxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNzQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDhESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTg6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSThESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEkxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MjU5OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjIwMEk5RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OToKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYzMDBJOURJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzA6CisJCSpkZXNjcmlwdGlvbiA9IE1FMDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwNjMwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCQkqZGVzY3JpcHRpb24gPSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0I6CisJCSpkZXNjcmlwdGlvbiA9IE1FODEwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MTAwQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDA6CisJCSpkZXNjcmlwdGlvbiA9IE1FMDkwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwOTQwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MDoKKwkJKmRlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NTA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTYwOgorCQkqZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk2MDsKKworCQlicmVhazsKKy8qCisJCWNhc2UgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMToKKwkJCSpkZXNjcmlwdGlvbiA9IE1FUEhJU1RPX1MxX0RFU0NSSVBUSU9OX0RFVklDRTsKKworCQkJYnJlYWs7CisqLworCWRlZmF1bHQ6CisJCSpkZXNjcmlwdGlvbiA9IEVNUFRZX0RFU0NSSVBUSU9OX0RFVklDRTsKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBpZCBpbiBkZXZpY2UgaW5mby5cbiIpOworCisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X2luZm9fZGV2aWNlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICAgaW50ICp2ZW5kb3JfaWQsCisJCQkJICAgICBpbnQgKmRldmljZV9pZCwKKwkJCQkgICAgIGludCAqc2VyaWFsX25vLAorCQkJCSAgICAgaW50ICpidXNfdHlwZSwKKwkJCQkgICAgIGludCAqYnVzX25vLAorCQkJCSAgICAgaW50ICpkZXZfbm8sIGludCAqZnVuY19ubywgaW50ICpwbHVnZ2VkKQoreworCW1lZHVtbXlfZGV2aWNlX3QgKmluc3RhbmNlID0gKG1lZHVtbXlfZGV2aWNlX3QgKikgZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisvLyAgICAgIGlmIChpbnN0YW5jZS0+bWFnaWMgIT0gTUVEVU1NWV9NQUdJQ19OVU1CRVIpCisvLyAgICAgIHsKKy8vICAgICAgICAgICAgICBQRVJST1IoIldyb25nIG1hZ2ljIG51bWJlci5cbiIpOworLy8gICAgICAgICAgICAgIHJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKy8vICAgICAgfQorCisJKnZlbmRvcl9pZCA9IGluc3RhbmNlLT52ZW5kb3JfaWQ7CisJKmRldmljZV9pZCA9IGluc3RhbmNlLT5kZXZpY2VfaWQ7CisJKnNlcmlhbF9ubyA9IGluc3RhbmNlLT5zZXJpYWxfbm87CisJKmJ1c190eXBlID0gaW5zdGFuY2UtPmJ1c190eXBlOworCSpidXNfbm8gPSBpbnN0YW5jZS0+YnVzX25vOworCSpkZXZfbm8gPSBpbnN0YW5jZS0+ZGV2X25vOworCSpmdW5jX25vID0gaW5zdGFuY2UtPmZ1bmNfbm87CisJKnBsdWdnZWQgPSBNRV9QTFVHR0VEX09VVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyKG1lX2RldmljZV90ICogZGV2aWNlLCBjaGFyICoqbmFtZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm5hbWUgPSBNRURVTU1ZX05BTUVfRFJJVkVSOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfbmFtZV9kZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsIGNoYXIgKipuYW1lKQoreworCW1lZHVtbXlfZGV2aWNlX3QgKmluc3RhbmNlID0gKG1lZHVtbXlfZGV2aWNlX3QgKikgZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisvLyAvLyAvLyAgICAgICAgaWYgKGluc3RhbmNlLT5tYWdpYyAhPSBNRURVTU1ZX01BR0lDX05VTUJFUikKKy8vIC8vIC8vICAgICAgICB7CisvLyAvLyAvLyAgICAgICAgICAgICAgICBQRVJST1IoIldyb25nIG1hZ2ljIG51bWJlci5cbiIpOworLy8gLy8gLy8gICAgICAgICAgICAgICAgcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworLy8gLy8gLy8gICAgICAgIH0KKworCXN3aXRjaCAoaW5zdGFuY2UtPmRldmljZV9pZCkgeworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMDoKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQToKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQjoKKwkJKm5hbWUgPSBNRTEwMDBfTkFNRV9ERVZJQ0VfTUUxMDAwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMDoKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQToKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwQTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEI6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEI7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBFOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQToKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBFQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBEOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF80VToKKwkJKm5hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwNFU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzhVOgorCQkqbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDA4VTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTJVOgorCQkqbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxMlU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VToKKwkJKm5hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTZVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlVfOEk6CisJCSpuYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VThJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMDoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjEwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MDoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjUwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEk6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzBTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MElTOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzBJUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODA6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODBJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MFM6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MFM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MElTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwNDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDAxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxODoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDAxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExODoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDhESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDRGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDAxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1ODoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSThESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDVGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNzg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0NDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDhESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDAxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1ODoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSThESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDYzMDoKKwkJKm5hbWUgPSBNRTA2MDBfTkFNRV9ERVZJQ0VfTUUwNjMwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCQkqbmFtZSA9IE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBBOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCQkqbmFtZSA9IE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBCOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MDoKKwkJKm5hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTQwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MDoKKwkJKm5hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTUwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MDoKKwkJKm5hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTYwOworCisJCWJyZWFrOworLyoKKwkJY2FzZSBVU0JfREVWSUNFX0lEX01FUEhJU1RPX1MxOgorCQkJKm5hbWUgPSBNRVBISVNUT19TMV9OQU1FX0RFVklDRTsKKworCQkJYnJlYWs7CisqLworCWRlZmF1bHQ6CisJCSpuYW1lID0gRU1QVFlfTkFNRV9ERVZJQ0U7CisJCVBFUlJPUigiSW52YWxpZCBQQ0kgZGV2aWNlIGlkLlxuIik7CisKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMobWVfZGV2aWNlX3QgKiBkZXZpY2UsIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJIGludCBzdWJkZXZpY2UsIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgICAgIGludCBzdWJkZXZpY2UsIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCQlpbnQgc3ViZGV2aWNlLCBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJaW50IHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSAgICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgY2FwLCBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJICAgaW50IHN0YXJ0X3N1YmRldmljZSwKKwkJCQkJICAgaW50IHR5cGUsCisJCQkJCSAgIGludCBzdWJ0eXBlLCBpbnQgKnN1YmRldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgaW50IHVuaXQsCisJCQkJCSAgaW50ICptaW4sCisJCQkJCSAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9yYW5nZV9pbmZvKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgcmFuZ2UsCisJCQkJICAgIGludCAqdW5pdCwgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitpbnQgbWVkdW1teV9xdWVyeV90aW1lcihtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCWludCBzdWJkZXZpY2UsCisJCQlpbnQgdGltZXIsCisJCQlpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJdWludDY0X3QgKiBtaW5fdGlja3MsIHVpbnQ2NF90ICogbWF4X3RpY2tzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcihtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJICAgICAgIGludCAqdmVyc2lvbikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkqdmVyc2lvbiA9IE1FX1ZFUlNJT05fRFJJVkVSOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZWR1bW15X2Rlc3RydWN0b3IobWVfZGV2aWNlX3QgKiBkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWtmcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kZXZpY2VfaW5mbyh1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsCisJCQkgICAgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJICAgIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkgICAgaW50IGJ1c190eXBlLAorCQkJICAgIGludCBidXNfbm8sCisJCQkgICAgaW50IGRldl9ubywKKwkJCSAgICBpbnQgZnVuY19ubywgbWVkdW1teV9kZXZpY2VfdCAqIGluc3RhbmNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworLy8gICAgICBpbnN0YW5jZS0+bWFnaWMgPSBNRURVTU1ZX01BR0lDX05VTUJFUjsKKwlpbnN0YW5jZS0+dmVuZG9yX2lkID0gdmVuZG9yX2lkOworCWluc3RhbmNlLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisJaW5zdGFuY2UtPnNlcmlhbF9ubyA9IHNlcmlhbF9ubzsKKwlpbnN0YW5jZS0+YnVzX3R5cGUgPSBidXNfdHlwZTsKKwlpbnN0YW5jZS0+YnVzX25vID0gYnVzX25vOworCWluc3RhbmNlLT5kZXZfbm8gPSBkZXZfbm87CisJaW5zdGFuY2UtPmZ1bmNfbm8gPSBmdW5jX25vOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9jb25maWdfbG9hZChtZV9kZXZpY2VfdCAqIGRldmljZSwgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJICAgICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kZXZpY2VfaW5zdGFuY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+bGlzdCk7CisKKwlkZXZpY2UtPm1lX2RldmljZV9pb19pcnFfc3RhcnQgPSBtZWR1bW15X2lvX2lycV9zdGFydDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19pcnFfd2FpdCA9IG1lZHVtbXlfaW9faXJxX3dhaXQ7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9faXJxX3N0b3AgPSBtZWR1bW15X2lvX2lycV9zdG9wOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZSA9IG1lZHVtbXlfaW9fcmVzZXRfZGV2aWNlOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9IG1lZHVtbXlfaW9fcmVzZXRfc3ViZGV2aWNlOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZWR1bW15X2lvX3NpbmdsZV9jb25maWc7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZWR1bW15X2lvX3NpbmdsZV9yZWFkOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9IG1lZHVtbXlfaW9fc2luZ2xlX3dyaXRlOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPSBtZWR1bW15X2lvX3N0cmVhbV9jb25maWc7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPSBtZWR1bW15X2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWVkdW1teV9pb19zdHJlYW1fcmVhZDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQgPSBtZWR1bW15X2lvX3N0cmVhbV9zdGFydDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzID0gbWVkdW1teV9pb19zdHJlYW1fc3RhdHVzOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWVkdW1teV9pb19zdHJlYW1fc3RvcDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fd3JpdGUgPSBtZWR1bW15X2lvX3N0cmVhbV93cml0ZTsKKworCWRldmljZS0+bWVfZGV2aWNlX2xvY2tfZGV2aWNlID0gbWVkdW1teV9sb2NrX2RldmljZTsKKwlkZXZpY2UtPm1lX2RldmljZV9sb2NrX3N1YmRldmljZSA9IG1lZHVtbXlfbG9ja19zdWJkZXZpY2U7CisKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UgPQorCSAgICBtZWR1bW15X3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZTsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZSA9IG1lZHVtbXlfcXVlcnlfaW5mb19kZXZpY2U7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyID0KKwkgICAgbWVkdW1teV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXI7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2UgPSBtZWR1bW15X3F1ZXJ5X25hbWVfZGV2aWNlOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMgPQorCSAgICBtZWR1bW15X3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9IG1lZHVtbXlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMgPSBtZWR1bW15X3F1ZXJ5X251bWJlcl9yYW5nZXM7CisKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWVkdW1teV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPSBtZWR1bW15X3F1ZXJ5X3JhbmdlX2luZm87CisKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9IG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUgPQorCSAgICBtZWR1bW15X3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0gbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfdGltZXIgPSBtZWR1bW15X3F1ZXJ5X3RpbWVyOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyID0KKwkgICAgbWVkdW1teV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXI7CisKKwlkZXZpY2UtPm1lX2RldmljZV9kZXN0cnVjdG9yID0gbWVkdW1teV9kZXN0cnVjdG9yOworCWRldmljZS0+bWVfZGV2aWNlX2NvbmZpZ19sb2FkID0gbWVkdW1teV9jb25maWdfbG9hZDsKKwlyZXR1cm4gMDsKK30KKworbWVfZGV2aWNlX3QgKm1lZHVtbXlfY29uc3RydWN0b3IodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJCSB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkJIGludCBidXNfdHlwZSwKKwkJCQkgaW50IGJ1c19ubywgaW50IGRldl9ubywgaW50IGZ1bmNfbm8pCit7CisJaW50IHJlc3VsdCA9IDA7CisJbWVkdW1teV9kZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBhdHRyaWJ1dGVzICovCisJaW5zdGFuY2UgPSBrbWFsbG9jKHNpemVvZihtZWR1bW15X2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWluc3RhbmNlKSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChpbnN0YW5jZSwgMCwgc2l6ZW9mKG1lZHVtbXlfZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgZGV2aWNlIGluZm8gKi8KKwlyZXN1bHQgPSBpbml0X2RldmljZV9pbmZvKHZlbmRvcl9pZCwKKwkJCQkgIGRldmljZV9pZCwKKwkJCQkgIHNlcmlhbF9ubywKKwkJCQkgIGJ1c190eXBlLCBidXNfbm8sIGRldl9ubywgZnVuY19ubywgaW5zdGFuY2UpOworCisJaWYgKHJlc3VsdCkgeworCQlQRVJST1IoIkNhbm5vdCBpbml0IGJhb3JkIGluZm8uXG4iKTsKKwkJa2ZyZWUoaW5zdGFuY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBpbnN0YW5jZSAqLworCXJlc3VsdCA9IGluaXRfZGV2aWNlX2luc3RhbmNlKChtZV9kZXZpY2VfdCAqKSBpbnN0YW5jZSk7CisKKwlpZiAocmVzdWx0KSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXQgYmFvcmQgaW5mby5cbiIpOworCQlrZnJlZShpbnN0YW5jZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgaW5zdGFuY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBkdW1teV9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHVtbXlfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQoZHVtbXlfaW5pdCk7CisKK21vZHVsZV9leGl0KGR1bW15X2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNZWlsaGF1cyBNRS1EVU1NWSBEZXZpY2VzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtRFVNTVkgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZWR1bW15X2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWR1bW15LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzAwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVkdW1teS5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVEVU1NWV9IXworI2RlZmluZSBfTUVEVU1NWV9IXworCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUVEVU1NWV9NQUdJQ19OVU1CRVIJMHhERERECisKK3R5cGVkZWYgc3RydWN0IG1lZHVtbXlfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworLy8gICAgICBpbnQgbWFnaWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZDsJLyoqPCBWZW5kb3IgSUQgKi8KKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQ7CS8qKjwgRGV2aWNlIElEICovCisJdW5zaWduZWQgaW50IHNlcmlhbF9ubzsJCS8qKjwgU2VyaWFsIG51bWJlciBvZiB0aGUgZGV2aWNlICovCisJaW50IGJ1c190eXBlOwkJCQkvKio8IEJ1cyB0eXBlICovCisJaW50IGJ1c19ubzsJCQkJCS8qKjwgQnVzIG51bWJlciAqLworCWludCBkZXZfbm87CQkJCQkvKio8IERldmljZSBudW1iZXIgKi8KKwlpbnQgZnVuY19ubzsJCQkJLyoqPCBGdW5jdGlvbiBudW1iZXIgKi8KK30gbWVkdW1teV9kZXZpY2VfdDsKKworbWVfZGV2aWNlX3QgKm1lZHVtbXlfY29uc3RydWN0b3IodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJCSB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkJIGludCBidXNfdHlwZSwKKwkJCQkgaW50IGJ1c19ubywKKwkJCQkgaW50IGRldl9ubywKKwkJCQkgaW50IGZ1bmNfbm8pIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVlcnJvci5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWRhNGJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZXJyb3IuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWVycm9yLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqIEF1dGhvciAgICAgIDogS0cgKEtyenlzenRvZiBHYW50emtlKQk8ay5nYW50emtlQG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FRVJST1JfSF8KKyNkZWZpbmUgX01FRVJST1JfSF8KKworZXh0ZXJuIGNoYXIgKm1lRXJyb3JNc2dUYWJsZVtdOworCisjZGVmaW5lIE1FX0VSUk5PX1NVQ0NFU1MJCQkJCQkwCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfREVWSUNFCQkJCQkxCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFCQkJCTIKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMCQkJCTMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHCQkJNAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1JFRgkJCQkJNQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1RSSUdfQ0hBTgkJCQk2CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFCQkJCTcKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0UJCQkJOAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQJCQkJOQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTCQkJCQkxMAorI2RlZmluZSBNRV9FUlJOT19PUEVOCQkJCQkJCTExCisjZGVmaW5lIE1FX0VSUk5PX0NMT1NFCQkJCQkJCTEyCisjZGVmaW5lIE1FX0VSUk5PX05PVF9PUEVOCQkJCQkJMTMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9ESVIJCQkJCTE0CisjZGVmaW5lIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRwkJCQkxNQorI2RlZmluZSBNRV9FUlJOT19OT1RfU1VQUE9SVEVECQkJCQkxNgorI2RlZmluZSBNRV9FUlJOT19TVUJERVZJQ0VfVFlQRQkJCQkJMTcKKyNkZWZpbmUgTUVfRVJSTk9fVVNFUl9CVUZGRVJfU0laRQkJCQkxOAorI2RlZmluZSBNRV9FUlJOT19MT0NLRUQJCQkJCQkJMTkKKyNkZWZpbmUgTUVfRVJSTk9fTk9NT1JFX1NVQkRFVklDRV9UWVBFCQkJMjAKKyNkZWZpbmUgTUVfRVJSTk9fVElNRU9VVAkJCQkJCTIxCisjZGVmaW5lIE1FX0VSUk5PX1NJR05BTAkJCQkJCQkyMgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0UJCQkJMjMKKyNkZWZpbmUgTUVfRVJSTk9fVEhSRUFEX1JVTk5JTkcJCQkJCTI0CisjZGVmaW5lIE1FX0VSUk5PX1NUQVJUX1RIUkVBRAkJCQkJMjUKKyNkZWZpbmUgTUVfRVJSTk9fQ0FOQ0VMX1RIUkVBRAkJCQkJMjYKKyNkZWZpbmUgTUVfRVJSTk9fTk9fQ0FMTEJBQ0sJCQkJCTI3CisjZGVmaW5lIE1FX0VSUk5PX1VTRUQJCQkJCQkJMjgKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9VTklUCQkJCQkyOQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX01JTl9NQVgJCQkJMzAKKyNkZWZpbmUgTUVfRVJSTk9fTk9fUkFOR0UJCQkJCQkzMQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1JBTkdFCQkJCQkzMgorI2RlZmluZSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWQkJCQkJMzMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9MT0NLCQkJCQkzNAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NXSVRDSAkJCQkJMzUKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9FUlJPUl9NU0dfQ09VTlQJCTM2CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU1RSRUFNX0NPTkZJRwkJCTM3CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQJCTM4CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRQkzOQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0UJNDAKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19DSEFOCTQxCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RJTUVPVVQJCTQyCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRwkJCTQzCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEUJNDQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUQVJUX0FSRwkJCTQ1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEUJNDYKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRwkJCTQ3CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX1RSSUdfVFlQRQk0OAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkcJCQk0OQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRQkJNTAKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkcJCQk1MQorI2RlZmluZSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkcJCQk1MgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1JFQURfTU9ERQkJCQk1MworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1ZBTFVFX0NPVU5UCQkJNTQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFCQkJCTU1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfVElNRVIJCQkJCTU2CisjZGVmaW5lIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQJCQkJNTcKKyNkZWZpbmUgTUVfRVJSTk9fVVNFRF9JTlRFUk5BTAkJCQkJNTgKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9EVVRZX0NZQ0xFCQkJCTU5CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfV0FJVAkJCQkJNjAKKyNkZWZpbmUgTUVfRVJSTk9fQ09OTkVDVF9SRU1PVEUJCQkJCTYxCisjZGVmaW5lIE1FX0VSUk5PX0NPTU1VTklDQVRJT04JCQkJCTYyCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0xJU1QJCQk2MworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX01PRFVMRV9UWVBFCQkJNjQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFCQkJCTY1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU1RPUF9NT0RFCQkJCTY2CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRklGT19JUlFfVEhSRVNIT0xECQk2NworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1BPSU5URVIJCQkJNjgKKyNkZWZpbmUgTUVfRVJSTk9fQ1JFQVRFX0VWRU5UCQkJCQk2OQorI2RlZmluZSBNRV9FUlJOT19MQUNLX09GX1JFU09VUkNFUwkJCQk3MAorI2RlZmluZSBNRV9FUlJOT19DQU5DRUxMRUQJCQkJCQk3MQorI2RlZmluZSBNRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVwkJCTcyCisjZGVmaW5lIE1FX0VSUk5PX1JJTkdfQlVGRkVSX1VOREVGRkxPVwkJCTczCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0UJCQkJNzQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9JUlFfQVJHCQkJCTc1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ0FQCQkJCQk3NgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0NBUF9BUkdfQ09VTlQJCQk3NworI2RlZmluZSBNRV9FUlJOT19JTlRFUk5BTAkJCQkJCTc4CisKKy8qKiBOZXcgZXJyb3IgZm9yIHJhbmdlIGNoZWNrICovCisjZGVmaW5lIE1FX0VSUk5PX1ZBTFVFX09VVF9PRl9SQU5HRQkJCQk3OQorI2RlZmluZSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVwkJCTgwCisjZGVmaW5lIE1FX0VSUk5PX0ZJRk9fQlVGRkVSX1VOREVGRkxPVwkJCTgxCisKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9FUlJPUl9OVU1CRVIJCQk4MgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVmaXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdkMjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuYwpAQCAtMCwwICsxLDEzNyBAQAorLyoqCisgKiBAZmlsZSBtZWZpcm13YXJlLmMKKyAqCisgKiBAYnJpZWYgSW1wbGVtZW50cyB0aGUgZmlybXdhcmUgaGFuZGxpbmcuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKSAgICAgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgS3J6eXN6dG9mIEdhbnR6a2Ugay5nYW50emtlQG1laWxoYXVzLmRlICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBLQlVJTERfTU9ETkFNRQorIyAgZGVmaW5lIEtCVUlMRF9NT0ROQU1FIEtCVUlMRF9TVFIobWVmaXJtd2FyZSkKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKKyNpbmNsdWRlICJtZWZpcm13YXJlLmgiCisKK2ludCBtZV94aWxpbnhfZG93bmxvYWQodW5zaWduZWQgbG9uZyByZWdpc3Rlcl9iYXNlX2NvbnRyb2wsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHJlZ2lzdGVyX2Jhc2VfZGF0YSwKKwkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZmlybXdhcmVfbmFtZSkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fRklSTVdBUkU7CisJdWludDMyX3QgdmFsdWUgPSAwOworCWludCBpZHggPSAwOworCisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmICghZmlybXdhcmVfbmFtZSkgeworCQlQRVJST1IoIlJlcXVlc3QgZm9yIGZpcm13YXJlIGZhaWxlZC4gTm8gbmFtZSBwcm92aWRlZC4gXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlQSU5GTygiUmVxdWVzdCAnJXMnIGZpcm13YXJlLlxuIiwgZmlybXdhcmVfbmFtZSk7CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpcm13YXJlX25hbWUsIGRldik7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiUmVxdWVzdCBmb3IgZmlybXdhcmUgZmFpbGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIFNldCBQTFggbG9jYWwgaW50ZXJydXB0IDIgcG9sYXJpdHkgdG8gaGlnaC4KKwkvLyBJbnRlcnJ1cHQgaXMgdGhyb3duIGJ5IGluaXQgcGluIG9mIHhpbGlueC4KKwlvdXRsKFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9QT0wsIHJlZ2lzdGVyX2Jhc2VfY29udHJvbCArIFBMWF9JTlRDU1IpOworCisJLy8gU2V0IC9DUyBhbmQgL1dSSVRFIG9mIHRoZSBYaWxpbngKKwl2YWx1ZSA9IGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKwl2YWx1ZSB8PSBNRV9GSVJNV0FSRV9DU19XUklURTsKKwlvdXRsKHZhbHVlLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKworCS8vIEluaXQgWGlsaW54IHdpdGggQ1MxCisJaW5sKHJlZ2lzdGVyX2Jhc2VfZGF0YSArIE1FX1hJTElOWF9DUzFfUkVHKTsKKworCS8vIFdhaXQgZm9yIGluaXQgdG8gY29tcGxldGUKKwl1ZGVsYXkoMjApOworCisJLy8gQ2hlY2tsIC9JTklUIHBpbgorCWlmICghCisJICAgIChpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lOVENTUikgJgorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFKSkgeworCQlQRVJST1IoIkNhbid0IGluaXQgWGlsaW54LlxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLy8gUmVzZXQgL0NTIGFuZCAvV1JJVEUgb2YgdGhlIFhpbGlueAorCXZhbHVlID0gaW5sKHJlZ2lzdGVyX2Jhc2VfY29udHJvbCArIFBMWF9JQ1IpOworCXZhbHVlICY9IH5NRV9GSVJNV0FSRV9DU19XUklURTsKKwlvdXRsKHZhbHVlLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKworCS8vIERvd25sb2FkIFhpbGlueCBmaXJtd2FyZQorCXVkZWxheSgxMCk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGZ3LT5zaXplOyBpZHgrKykgeworCQlvdXRsKGZ3LT5kYXRhW2lkeF0sIHJlZ2lzdGVyX2Jhc2VfZGF0YSk7CisjaWZkZWYgTUU2MDAwX3YyXzQKKy8vLyAgICAgVGhpcyBjaGVja2luZyBvbmx5IGZvciBib2FyZCdzIHZlcnNpb24gMi40CisJCS8vIENoZWNrIGlmIEJVU1kgZmxhZyBpcyBzZXQgKGxvdyA9IHJlYWR5LCBoaWdoID0gYnVzeSkKKwkJaWYgKGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKSAmCisJCSAgICBNRV9GSVJNV0FSRV9CVVNZX0ZMQUcpIHsKKwkJCVBFUlJPUigiWGlsaW54IGlzIHN0aWxsIGJ1c3kgKGlkeCA9ICVkKVxuIiwgaWR4KTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKyNlbmRpZiAvL01FNjAwMF92Ml80CisJfQorCVBERUJVRygiRG93bmxvYWQgZmluaXNoZWQuICVkIGJ5dGVzIHdyaXR0ZW4gdG8gUExYLlxuIiwgaWR4KTsKKworCS8vIElmIGRvbmUgZmxhZyBpcyBoaWdoIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsCisJaWYgKGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKSAmIE1FX0ZJUk1XQVJFX0RPTkVfRkxBRykgeworCQlQREVCVUcoIlNVQ0NFU1MuIERvbmUgZmxhZyBpcyBzZXQuXG4iKTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkZBSUxVUkUuIERPTkUgZmxhZyBpcyBub3Qgc2V0LlxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvLyBTZXQgL0NTIGFuZCAvV1JJVEUKKwl2YWx1ZSA9IGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKwl2YWx1ZSB8PSBNRV9GSVJNV0FSRV9DU19XUklURTsKKwlvdXRsKHZhbHVlLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKworCVBERUJVRygiRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBDSSBpbnRlcmZhY2UuXG4iKTsKKwlvdXRsKE1FX1BMWF9QQ0lfQUNUSVZBVEUsIHJlZ2lzdGVyX2Jhc2VfY29udHJvbCArIFBMWF9JTlRDU1IpOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVmaXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjY4NTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuaApAQCAtMCwwICsxLDU3IEBACisvKioKKyAqIEBmaWxlIG1lZmlybXdhcmUuaAorICoKKyAqIEBicmllZiBEZWZpbml0aW9ucyBvZiB0aGUgZmlybXdhcmUgaGFuZGxpbmcgZnVuY3Rpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpICAgICAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBieSBLcnp5c3p0b2YgR2FudHprZSBrLmdhbnR6a2VAbWVpbGhhdXMuZGUgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9NRUZJUk1XQVJFX0gKKyMgZGVmaW5lIF9NRUZJUk1XQVJFX0gKKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUVfRVJSTk9fRklSTVdBUkUJCS0xCisKKy8qKgorKiBSZWdpc3RyeQorKi8KKyNkZWZpbmUgTUVfWElMSU5YX0NTMV9SRUcJCTB4MDBDOAorCisvKioKKyogRmxhZ3MgKGJpdHMpCisqLworCisjZGVmaW5lIE1FX0ZJUk1XQVJFX0JVU1lfRkxBRwkweDAwMDAwMDIwCisjZGVmaW5lIE1FX0ZJUk1XQVJFX0RPTkVfRkxBRwkweDAwMDAwMDA0CisjZGVmaW5lIE1FX0ZJUk1XQVJFX0NTX1dSSVRFCTB4MDAwMDAxMDAKKworI2RlZmluZSBNRV9QTFhfUENJX0FDVElWQVRFCQkweDQzCisKK2ludCBtZV94aWxpbnhfZG93bmxvYWQodW5zaWduZWQgbG9uZyByZWdpc3Rlcl9iYXNlX2NvbnRyb2wsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHJlZ2lzdGVyX2Jhc2VfZGF0YSwKKwkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZmlybXdhcmVfbmFtZSk7CisKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisKKyNlbmRpZiAvL19NRUZJUk1XQVJFX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWlkcy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlNzU3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWlkcy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVpZHMuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FSURTX0hfCisjZGVmaW5lIF9NRUlEU19IXworCisjaWZkZWYgX19LRVJORUxfXworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERyaXZlciBuYW1lcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FTUFJTl9OQU1FCQkJCSJtZW1haW4iCisjZGVmaW5lIE1FMTAwMF9OQU1FCQkJCSJtZTEwMDAiCisjZGVmaW5lIE1FMTQwMF9OQU1FCQkJCSJtZTE0MDAiCisjZGVmaW5lIE1FMTYwMF9OQU1FCQkJCSJtZTE2MDAiCisjZGVmaW5lIE1FNDYwMF9OQU1FCQkJCSJtZTQ2MDAiCisjZGVmaW5lIE1FNjAwMF9OQU1FCQkJCSJtZTYwMDAiCisjZGVmaW5lIE1FMDYwMF9OQU1FCQkJCSJtZTA2MDAiCS8vIm1lNjMwIgorI2RlZmluZSBNRTgxMDBfTkFNRQkJCQkibWU4MTAwIgorI2RlZmluZSBNRTgyMDBfTkFNRQkJCQkibWU4MjAwIgorI2RlZmluZSBNRTA5MDBfTkFNRQkJCQkibWUwOTAwIgkvLyJtZTl4IgorLy8jZGVmaW5lIE1FUEhJU1RPX1MxX05BTUUgICAgICAgICAgICAgICAgICAgICAgIm1lcGhpc3RvX3MxIgorI2RlZmluZSBNRURVTU1ZX05BTUUJCQkibWVkdW1teSIKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMTI2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1laW50ZXJuYWwuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FSU5URVJOQUxfSF8KKyNkZWZpbmUgX01FSU5URVJOQUxfSF8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgVmVuZG9yIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUVJTEhBVVMJCQkJCQkweDE0MDIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgRGV2aWNlIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwCQkJCTB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMF9BCQkJCTB4MTAwQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMF9CCQkJCTB4MTAwQgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwCQkJCTB4MTQwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQQkJCQkweDE0MEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEIJCQkJMHgxNDBCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwCQkJCTB4MTRFMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQQkJCQkweDE0RUEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUIJCQkJMHgxNEVCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBDCQkJCTBYMTQwQworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRAkJCQkwWDE0MEQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF80VQkJCTB4MTYwNCAvLyA0IHZvbHRhZ2Ugb3V0cHV0cworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF84VQkJCTB4MTYwOCAvLyA4IHZvbHRhZ2Ugb3V0cHV0cworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlUJCQkweDE2MEMgLy8gMTIgdm9sdGFnZSBvdXRwdXRzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VQkJCTB4MTYwRiAvLyAxNiB2b2x0YWdlIG91dHB1dHMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVXzhJCQkweDE2OEYgLy8gMTYgdm9sdGFnZS84IGN1cnJlbnQgby4KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMAkJCQkweDQ2MTAgLy8gSmVreWxsCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTAJCQkJMHg0NjUwIC8vIExvdyBDb3N0IHZlcnNpb24KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MAkJCQkweDQ2NjAgLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEkJCQkJMHg0NjYxIC8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTCQkJCTB4NDY2MiAvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVMJCQkJMHg0NjYzIC8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MAkJCQkweDQ2NzAgLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEkJCQkJMHg0NjcxIC8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTCQkJCTB4NDY3MiAvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVMJCQkJMHg0NjczIC8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MAkJCQkweDQ2ODAgLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MEkJCQkJMHg0NjgxIC8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTCQkJCTB4NDY4MiAvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVMJCQkJMHg0NjgzIC8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworLyogTUU2MDAwIHN0YW5kYXJkIHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDQgICAJCQkweDYwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDggICAJCQkweDYwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMEYgICAJCQkweDYwMEYKKworLyogTUU2MDAwIGlzb2xhdGVkIHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQgICAJCQkweDYwMTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTggICAJCQkweDYwMTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMUYgICAJCQkweDYwMUYKKworLyogTUU2MDAwIGlzbGUgdmVyc2lvbiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNCAgIAkJCTB4NjAzNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzOCAgIAkJCTB4NjAzOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzRiAgIAkJCTB4NjAzRgorCisvKiBNRTYwMDAgc3RhbmRhcmQgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NCAgIAkJCTB4NjA0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0OCAgIAkJCTB4NjA0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RiAgIAkJCTB4NjA0RgorCisvKiBNRTYwMDAgaXNvbGF0ZWQgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NCAgIAkJCTB4NjA1NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1OCAgIAkJCTB4NjA1OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1RiAgIAkJCTB4NjA1RgorCisvKiBNRTYwMDAgaXNsZSB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0ICAgCQkJMHg2MDc0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4ICAgCQkJMHg2MDc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDdGICAgCQkJMHg2MDdGCisKKy8qIE1FNjEwMCBzdGFuZGFyZCB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA0ICAgCQkJMHg2MTA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4ICAgCQkJMHg2MTA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGICAgCQkJMHg2MTBGCisKKy8qIE1FNjEwMCBpc29sYXRlZCB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE0ICAgCQkJMHg2MTE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4ICAgCQkJMHg2MTE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGICAgCQkJMHg2MTFGCisKKy8qIE1FNjEwMCBpc2xlIHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzQgICAJCQkweDYxMzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzggICAJCQkweDYxMzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0YgICAJCQkweDYxM0YKKworLyogTUU2MTAwIHN0YW5kYXJkIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDQJCQkJMHg2MTQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4ICAgCQkJMHg2MTQ4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGICAgCQkJMHg2MTRGCisKKy8qIE1FNjEwMCBpc29sYXRlZCB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU0ICAgCQkJMHg2MTU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4ICAgCQkJMHg2MTU4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGICAgCQkJMHg2MTVGCisKKy8qIE1FNjEwMCBpc2xlIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzQgICAJCQkweDYxNzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzggICAJCQkweDYxNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0YgICAJCQkweDYxN0YKKworLyogTUU2MjAwIGlzb2xhdGVkIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTkJCQkJMHg2MjU5CisKKy8qIE1FNjMwMCBpc29sYXRlZCB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MzU5CQkJCTB4NjM1OQorCisvKiBNRTA2MzAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzAJCQkJMHgwNjMwCisKKy8qIE1FODEwMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BCQkJCTB4ODEwQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9CICAJCQkweDgxMEIKKworLyogTUU4MjAwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0EJCQkJMHg4MjBBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0IgIAkJCTB4ODIwQgorCisvKiBNRTA5MDAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDAJCQkJMHgwOTQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwCQkJCTB4MDk1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MAkJCQkweDA5NjAKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVTQiBWZW5kb3IgSURzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8vI2RlZmluZSBVU0JfVkVORE9SX0lEX01FUEhJU1RPX1MxCQkJCQkweDA0MDMKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVTQiBEZXZpY2UgSURzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8vI2RlZmluZSBVU0JfREVWSUNFX0lEX01FUEhJU1RPX1MxCQkJCQkweERDRDAKKworCisvKiBNRS0xMDAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUxMDAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0xMDAwIgorCisjZGVmaW5lIE1FMTAwMF9OQU1FX0RFVklDRV9NRTEwMDAJCQkJCSJNRS0xMDAwIgorCisjZGVmaW5lIE1FMTAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxMDAwCQkJIk1FLTEwMDAgZGV2aWNlLCAxMjggZGlnaXRhbCBpL28gbGluZXMuIgorCisvKiBNRS0xNDAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUxNDAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0xNDAwIgorCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDAJCQkJCSJNRS0xNDAwIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRQkJCQkJIk1FLTE0MDBFIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwQQkJCQkJIk1FLTE0MDBBIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUEJCQkJCSJNRS0xNDAwRUEiCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBCCQkJCQkiTUUtMTQwMEIiCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBFQgkJCQkJIk1FLTE0MDBFQiIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEMJCQkJCSJNRS0xNDAwQyIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEQJCQkJCSJNRS0xNDAwRCIKKworI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMAkJCSJNRS0xNDAwIGRldmljZSwgMjQgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEUJCQkiTUUtMTQwMEUgZGV2aWNlLCAyNCBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQQkJCSJNRS0xNDAwQSBkZXZpY2UsIDI0IGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLiIKKyNkZWZpbmUgTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFQQkJCSJNRS0xNDAwRUEgZGV2aWNlLCAyNCBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQgkJCSJNRS0xNDAwQiBkZXZpY2UsIDQ4IGRpZ2l0YWwgaS9vIGxpbmVzLCA2IGNvdW50ZXJzLiIKKyNkZWZpbmUgTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFQgkJCSJNRS0xNDAwRUIgZGV2aWNlLCA0OCBkaWdpdGFsIGkvbyBsaW5lcywgNiBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQwkJCSJNRS0xNDAwQyBkZXZpY2UsIDI0IGRpZ2l0YWwgaS9vIGxpbmVzLCAxNSBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRAkJCSJNRS0xNDAwRCBkZXZpY2UsIDQ4IGRpZ2l0YWwgaS9vIGxpbmVzLCAzMCBjb3VudGVycy4iCisKKy8qIE1FLTE2MDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTE2MDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTE2MDAiCisKKyNkZWZpbmUgTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDRVCQkJCQkiTUUtMTYwMC80VSIKKyNkZWZpbmUgTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDhVCQkJCQkiTUUtMTYwMC84VSIKKyNkZWZpbmUgTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDEyVQkJCQkiTUUtMTYwMC8xMlUiCisjZGVmaW5lIE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxNlUJCQkJIk1FLTE2MDAvMTZVIgorI2RlZmluZSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTZVOEkJCQkJIk1FLTE2MDAvMTZVOEkiCisKKyNkZWZpbmUgTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDA0VQkJCSJNRS0xNjAwLzRVIGRldmljZSwgNCB2b2x0YWdlIG91dHB1dHMuIgorI2RlZmluZSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDhVCQkJIk1FLTE2MDAvOFUgZGV2aWNlLCA4IHZvbHRhZ2Ugb3V0cHV0cy4iCisjZGVmaW5lIE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTJVCQkJIk1FLTE2MDAvMTJVIGRldmljZSwgMTIgdm9sdGFnZSBvdXRwdXRzLiIKKyNkZWZpbmUgTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlUJCQkiTUUtMTYwMC8xNlUgZGV2aWNlLCAxNiB2b2x0YWdlIG91dHB1dHMuIgorI2RlZmluZSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDE2VThJCQkiTUUtMTYwMC8xNlU4SSBkZXZpY2UsIDE2IHZvbHRhZ2UsIDggY3VycmVudCBvdXRwdXRzLiIKKworLyogTUUtNDAwMCBkZWZpbmVzICovCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtNDYwMCIKKworI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjEwCQkJCQkiTUUtNDYxMCIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY1MAkJCQkJIk1FLTQ2NTAiCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NjAJCQkJCSJNRS00NjYwIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwSQkJCQkJIk1FLTQ2NjBJIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwUwkJCQkJIk1FLTQ2NjBTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwSVMJCQkJCSJNRS00NjYwSVMiCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzAJCQkJCSJNRS00NjcwIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSQkJCQkJIk1FLTQ2NzBJIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwUwkJCQkJIk1FLTQ2NzBTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSVMJCQkJCSJNRS00NjcwSVMiCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODAJCQkJCSJNRS00NjgwIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwSQkJCQkJIk1FLTQ2ODBJIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwUwkJCQkJIk1FLTQ2ODBTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwSVMJCQkJCSJNRS00NjgwSVMiCisKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2MTAJCQkiTUUtNDYxMCBkZXZpY2UsIDE2IHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY1MAkJCSJNRS00NjUwIGRldmljZSwgMTYgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwCQkJIk1FLTQ2NjAgZGV2aWNlLCAxNiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwSQkJCSJNRS00NjYwSSBvcHRvIGlzb2xhdGVkIGRldmljZSwgMTYgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MFMJCQkiTUUtNDY2MCBkZXZpY2UsIDE2IHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzICg4IFMmSCksIDIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MElTCQkJIk1FLTQ2NjBJIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAxNiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cyAoOCBTJkgpLCAyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzAJCQkiTUUtNDY3MCBkZXZpY2UsIDMyIHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJCQkJIk1FLTQ2NzBJIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwUwkJCSJNRS00NjcwUyBkZXZpY2UsIDMyIHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzICg4IFMmSCksIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MElTCQkJIk1FLTQ2NzBJUyBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMgKDggUyZIKSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwCQkJIk1FLTQ2ODAgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSQkJCSJNRS00NjgwSSBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MFMJCQkiTUUtNDY4MFMgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSVMJCQkiTUUtNDY4MElTIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cyAoOCBTJkgpLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKworLyogTUUtNjAwMCBkZWZpbmVzICovCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtNjAwMCIKKworI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNAkJCQkJIk1FLTYwMDAvNCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDgJCQkJCSJNRS02MDAwLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDAxNgkJCQkJIk1FLTYwMDAvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNAkJCQkJIk1FLTYwMDBJLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJOAkJCQkJIk1FLTYwMDBJLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJMTYJCQkJIk1FLTYwMDBJLzE2IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTQJCQkJIk1FLTYwMDBJU0xFLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFOAkJCQkiTUUtNjAwMElTTEUvOCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEUxNgkJCQkiTUUtNjAwMElTTEUvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA0CQkJCQkiTUUtNjEwMC80IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwOAkJCQkJIk1FLTYxMDAvOCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDE2CQkJCQkiTUUtNjEwMC8xNiIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0CQkJCQkiTUUtNjEwMEkvNCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk4CQkJCQkiTUUtNjEwMEkvOCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEkxNgkJCQkiTUUtNjEwMEkvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFNAkJCQkiTUUtNjEwMElTTEUvNCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4CQkJCSJNRS02MTAwSVNMRS84IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2CQkJCSJNRS02MTAwSVNMRS8xNiIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDRESU8JCQkJIk1FLTYwMDAvNC9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4RElPCQkJCSJNRS02MDAwLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTZESU8JCQkJIk1FLTYwMDAvMTYvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTRESU8JCQkJIk1FLTYwMDBJLzQvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSThESU8JCQkJIk1FLTYwMDBJLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2RElPCQkJCSJNRS02MDAwSS8xNi9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFNERJTwkJCSJNRS02MDAwSVNMRS80L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4RElPCQkJIk1FLTYwMDBJU0xFLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPCQkJIk1FLTYwMDBJU0xFLzE2L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDRESU8JCQkJIk1FLTYxMDAvNC9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4RElPCQkJCSJNRS02MTAwLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTZESU8JCQkJIk1FLTYxMDAvMTYvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTRESU8JCQkJIk1FLTYxMDBJLzQvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSThESU8JCQkJIk1FLTYxMDBJLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2RElPCQkJCSJNRS02MTAwSS8xNi9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFNERJTwkJCSJNRS02MTAwSVNMRS80L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4RElPCQkJIk1FLTYxMDBJU0xFLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPCQkJIk1FLTYxMDBJU0xFLzE2L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjIwMEk5RElPCQkJCSJNRS02MjAwSS85L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjMwMEk5RElPCQkJCSJNRS02MzAwSS85L0RJTyIKKworI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDQJCQkiTUUtNjAwMC80IGRldmljZSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDgJCQkiTUUtNjAwMC84IGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwMTYJCQkiTUUtNjAwMC8xNiBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNAkJCSJNRS02MDAwSS80IGlzb2xhdGVkIGRldmljZSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTgJCQkiTUUtNjAwMEkvOCBpc29sYXRlZCBkZXZpY2UsIDggc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEkxNgkJCSJNRS02MDAwSS8xNiBpc29sYXRlZCBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFNAkJIk1FLTYwMDBJU0xFLzQgaXNsZSBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU4CQkiTUUtNjAwMElTTEUvOCBpc2xlIGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTE2CQkiTUUtNjAwMElTTEUvMTYgaXNsZSBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0CQkJIk1FLTYxMDAvNCBkZXZpY2UsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4CQkJIk1FLTYxMDAvOCBkZXZpY2UsIDQgc3RyZWFtaW5nLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwMTYJCQkiTUUtNjEwMC8xNiBkZXZpY2UsIDQgc3RyZWFtaW5nLCAxMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk0CQkJIk1FLTYxMDBJLzQgaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTgJCQkiTUUtNjEwMEkvOCBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTE2CQkJIk1FLTYxMDBJLzE2IGlzb2xhdGVkIGRldmljZSwgNCBzdHJlYW1pbmcsIDEyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTQJCSJNRS02MTAwSVNMRS80IGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTgJCSJNRS02MTAwSVNMRS84IGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEUxNgkJIk1FLTYxMDBJU0xFLzE2IGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZywgMTIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0RElPCQkiTUUtNjAwMC80L0RJTyBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwOERJTwkJIk1FLTYwMDAvOC9ESU8gZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2RElPCQkiTUUtNjAwMC8xNi9ESU8gZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk0RElPCQkiTUUtNjAwMEkvNC9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4RElPCQkiTUUtNjAwMEkvOC9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEkxNkRJTwkJIk1FLTYwMDBJLzE2L0RJTyBpc29sYXRlZCBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0RElPCSJNRS02MDAwSVNMRS80L0RJTyBpc2xlIGRldmljZSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFOERJTwkiTUUtNjAwMElTTEUvOC9ESU8gaXNsZSBkZXZpY2UsIDggc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPCSJNRS02MDAwSVNMRS8xNi9ESU8gaXNsZSBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDRESU8JCSJNRS02MTAwLzQvRElPIGRldmljZSwgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4RElPCQkiTUUtNjEwMC84L0RJTyBkZXZpY2UsIDQgc3RyZWFtaW5nLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2RElPCQkiTUUtNjEwMC8xNi9ESU8gZGV2aWNlLCA0IHN0cmVhbWluZywgMTIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTRESU8JCSJNRS02MTAwSS80L0RJTyBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSThESU8JCSJNRS02MTAwSS84L0RJTyBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEkxNkRJTwkJIk1FLTYxMDBJLzE2L0RJTyBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nLCAxMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFNERJTwkiTUUtNjEwMElTTEUvNC9ESU8gaXNsZSBkZXZpY2UsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRThESU8JIk1FLTYxMDBJU0xFLzgvRElPIGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTZESU8JIk1FLTYxMDBJU0xFLzE2L0RJTyBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcsIDEyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjIwMEk5RElPCQkiTUUtNjIwMEkvOS9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA5IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjMwMEk5RElPCQkiTUUtNjMwMEkvOS9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZywgNSBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKworLyogTUUtNjMwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUwNjAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0wNjAwIgorCisjZGVmaW5lIE1FMDYwMF9OQU1FX0RFVklDRV9NRTA2MzAJCQkJCSJNRS02MzAiCisKKyNkZWZpbmUgTUUwNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA2MzAJCQkiTUUtNjMwIGRldmljZSwgdXAgdG8gMTYgcmVsYXksIDggZGlnaXRhbCB0dGwgaW5wdXQgbGluZXMsIDggaXNvbGF0ZWQgZGlnaXRhbCBpbnB1dCBsaW5lcywgMTYgZGlnaXRhbCBpL28gbGluZXMsIDIgZXh0ZXJuYWwgaW50ZXJydXB0cy4iCisKKy8qIE1FLTgxMDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTgxMDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTgxMDAiCisKKyNkZWZpbmUgTUU4MTAwX05BTUVfREVWSUNFX01FODEwMEEJCQkJCSJNRS04MTAwQSIKKyNkZWZpbmUgTUU4MTAwX05BTUVfREVWSUNFX01FODEwMEIJCQkJCSJNRS04MTAwQiIKKworI2RlZmluZSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEEJCQkiTUUtODEwMEEgb3B0byBpc29sYXRlZCBkZXZpY2UsIDE2IGRpZ2l0YWwgaW5wdXQgbGluZXMsIDE2IGRpZ2l0YWwgb3V0cHV0IGxpbmVzLiIKKyNkZWZpbmUgTUU4MTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgxMDBCCQkJIk1FLTgxMDBCIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAzMiBkaWdpdGFsIGlucHV0IGxpbmVzLCAzMiBkaWdpdGFsIG91dHB1dCBsaW5lcywgMyBjb3VudGVycy4iCisKKy8qIE1FLTgyMDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTgyMDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTgyMDAiCisKKyNkZWZpbmUgTUU4MjAwX05BTUVfREVWSUNFX01FODIwMEEJCQkJCSJNRS04MjAwQSIKKyNkZWZpbmUgTUU4MjAwX05BTUVfREVWSUNFX01FODIwMEIJCQkJCSJNRS04MjAwQiIKKworI2RlZmluZSBNRTgyMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODIwMEEJCQkiTUUtODIwMEEgb3B0byBpc29sYXRlZCBkZXZpY2UsIDggZGlnaXRhbCBvdXRwdXQgbGluZXMsIDggZGlnaXRhbCBpbnB1dCBsaW5lcywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTgyMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODIwMEIJCQkiTUUtODIwMEIgb3B0byBpc29sYXRlZCBkZXZpY2UsIDE2IGRpZ2l0YWwgb3V0cHV0IGxpbmVzLCAxNiBkaWdpdGFsIGlucHV0IGxpbmVzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisKKy8qIE1FLTA5MDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTA5MDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTA5MDAiCisKKyNkZWZpbmUgTUUwOTAwX05BTUVfREVWSUNFX01FMDk0MAkJCQkJIk1FLTk0IgorI2RlZmluZSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTUwCQkJCQkiTUUtOTUiCisjZGVmaW5lIE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NjAJCQkJCSJNRS05NiIKKworI2RlZmluZSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk0MAkJCSJNRS05NCBkZXZpY2UsIDE2IGRpZ2l0YWwgaW5wdXQgbGluZXMsIDIgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmVzLiIKKyNkZWZpbmUgTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NTAJCQkiTUUtOTUgZGV2aWNlLCAxNiBkaWdpdGFsIG91dHB1dCBsaW5lcy4iCisjZGVmaW5lIE1FMDkwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwOTYwCQkJIk1FLTk2IGRldmljZSwgOCBkaWdpdGFsIGlucHV0IGxpbmVzLCA4IGRpZ2l0YWwgb3V0cHV0IGxpbmVzLCAyIGV4dGVybmFsIGludGVycnVwdCBsaW5lcy4iCisKKy8qIE1FLURVTU1ZIGRlZmluZXMgKi8KKyNkZWZpbmUgTUVEVU1NWV9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtRHVtbXkiCisKKy8qIE1FUEhJU1RPX1MxIGRlZmluZXMgKi8KKy8qCisjZGVmaW5lIE1FUEhJU1RPX1MxX05BTUVfRFJJVkVSCQkJCQkJIk1FcGhpc3RvIFNjb3BlIDEiCisjZGVmaW5lIE1FUEhJU1RPX1MxX05BTUVfREVWSUNFCQkJCQkJIk1FcGhpc3RvIFNjb3BlIDEiCisjZGVmaW5lIE1FUEhJU1RPX1MxX0RFU0NSSVBUSU9OX0RFVklDRQkJCQkiTUVwaGlzdG8gU2NvcGUgMSBkZXZpY2UsIDIgYW5hbG9nIGlucHV0cywgMjQgZGlnaXRhbCBpL28uIgorKi8KKy8qIEVycm9yIGRlZmluZXMgKi8KKyNkZWZpbmUgRU1QVFlfTkFNRV9EUklWRVIJCQkJCQkJIk1FLT8/PyIKKyNkZWZpbmUgRU1QVFlfTkFNRV9ERVZJQ0UJCQkJCQkJIk1FLT8/PyIKKyNkZWZpbmUgRU1QVFlfREVTQ1JJUFRJT05fREVWSUNFCQkJCQkiTUUtPz8/IHVua25vd24gZGV2aWNlIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWlvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzcxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpb2N0bC5oCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1laW9jdGwuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FSU9DVExfSF8KKyNkZWZpbmUgX01FSU9DVExfSF8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFR5cGVzIGZvciB0aGUgaW5wdXQvb3V0cHV0IGlvY3RscworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19pcnFfc3RhcnQgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgaXJxX3NvdXJjZTsKKwlpbnQgaXJxX2VkZ2U7CisJaW50IGlycV9hcmc7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9faXJxX3N0YXJ0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9faXJxX3dhaXQgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgaXJxX2NvdW50OworCWludCB2YWx1ZTsKKwlpbnQgdGltZV9vdXQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9faXJxX3dhaXRfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19pcnFfc3RvcCB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjaGFubmVsOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX2lycV9zdG9wX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fcmVzZXRfZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3Jlc2V0X2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3Jlc2V0X3N1YmRldmljZSB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3Jlc2V0X3N1YmRldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3NpbmdsZV9jb25maWcgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgc2luZ2xlX2NvbmZpZzsKKwlpbnQgcmVmOworCWludCB0cmlnX2NoYW47CisJaW50IHRyaWdfdHlwZTsKKwlpbnQgdHJpZ19lZGdlOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3NpbmdsZV9jb25maWdfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zaW5nbGUgeworCW1lSU9TaW5nbGVfdCAqc2luZ2xlX2xpc3Q7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3NpbmdsZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9jb25maWcgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwltZUlPU3RyZWFtQ29uZmlnX3QgKmNvbmZpZ19saXN0OworCWludCBjb3VudDsKKwltZUlPU3RyZWFtVHJpZ2dlcl90IHRyaWdnZXI7CisJaW50IGZpZm9faXJxX3RocmVzaG9sZDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fY29uZmlnX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc3RyZWFtX25ld192YWx1ZXMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgdGltZV9vdXQ7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc3RyZWFtX3JlYWQgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgcmVhZF9tb2RlOworCWludCAqdmFsdWVzOworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fcmVhZF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9zdGFydCB7CisJbWVJT1N0cmVhbVN0YXJ0X3QgKnN0YXJ0X2xpc3Q7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3N0cmVhbV9zdGFydF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9zdGF0dXMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgd2FpdDsKKwlpbnQgc3RhdHVzOworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fc3RhdHVzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc3RyZWFtX3N0b3AgeworCW1lSU9TdHJlYW1TdG9wX3QgKnN0b3BfbGlzdDsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX3N0b3BfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zdHJlYW1fd3JpdGUgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgd3JpdGVfbW9kZTsKKwlpbnQgKnZhbHVlczsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX3dyaXRlX3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUeXBlcyBmb3IgdGhlIGxvY2sgaW9jdGxzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lX2xvY2tfZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWludCBsb2NrOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2xvY2tfZGV2aWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfbG9ja19kcml2ZXIgeworCWludCBmbGFnczsKKwlpbnQgbG9jazsKKwlpbnQgZXJybm87Cit9IG1lX2xvY2tfZHJpdmVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfbG9ja19zdWJkZXZpY2UgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgbG9jazsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9sb2NrX3N1YmRldmljZV90OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVHlwZXMgZm9yIHRoZSBxdWVyeSBpb2N0bHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfaW5mb19kZXZpY2UgeworCWludCBkZXZpY2U7CisJaW50IHZlbmRvcl9pZDsKKwlpbnQgZGV2aWNlX2lkOworCWludCBzZXJpYWxfbm87CisJaW50IGJ1c190eXBlOworCWludCBidXNfbm87CisJaW50IGRldl9ubzsKKwlpbnQgZnVuY19ubzsKKwlpbnQgcGx1Z2dlZDsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X2luZm9fZGV2aWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWNoYXIgKm5hbWU7CisJaW50IGNvdW50OworCWludCBlcnJubzsKK30gbWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfbmFtZV9kZXZpY2UgeworCWludCBkZXZpY2U7CisJY2hhciAqbmFtZTsKKwlpbnQgY291bnQ7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9uYW1lX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciB7CisJaW50IGRldmljZTsKKwljaGFyICpuYW1lOworCWludCBjb3VudDsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXIgeworCWludCB2ZXJzaW9uOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciB7CisJaW50IGRldmljZTsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzIHsKKwlpbnQgbnVtYmVyOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbnVtYmVyX2RldmljZXNfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyB7CisJaW50IGRldmljZTsKKwlpbnQgbnVtYmVyOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXNfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgbnVtYmVyOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfbnVtYmVyX3JhbmdlcyB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjaGFubmVsOworCWludCB1bml0OworCWludCBudW1iZXI7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9udW1iZXJfcmFuZ2VzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUgeworCWludCBkZXZpY2U7CisJaW50IHN0YXJ0X3N1YmRldmljZTsKKwlpbnQgdHlwZTsKKwlpbnQgc3VidHlwZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCB0eXBlOworCWludCBzdWJ0eXBlOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjYXBzOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNhcDsKKwlpbnQgYXJnc1s4XTsKKwlpbnQgY291bnQ7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfdGltZXIgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgdGltZXI7CisJaW50IGJhc2VfZnJlcXVlbmN5OworCWxvbmcgbG9uZyBtaW5fdGlja3M7CisJbG9uZyBsb25nIG1heF90aWNrczsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3RpbWVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heCB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjaGFubmVsOworCWludCB1bml0OworCWludCBtaW47CisJaW50IG1heDsKKwlpbnQgbWF4X2RhdGE7CisJaW50IHJhbmdlOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3JhbmdlX2luZm8geworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgdW5pdDsKKwlpbnQgcmFuZ2U7CisJaW50IG1pbjsKKwlpbnQgbWF4OworCWludCBtYXhfZGF0YTsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3JhbmdlX2luZm9fdDsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFR5cGVzIGZvciB0aGUgY29uZmlndXJhdGlvbiBpb2N0bHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3RjcGlwX2xvY2F0aW9uIHsKKwlpbnQgYWNjZXNzX3R5cGU7CisJY2hhciAqcmVtb3RlX2hvc3Q7CisJaW50IHJlbW90ZV9kZXZpY2VfbnVtYmVyOworfSBtZV9jZmdfdGNwaXBfbG9jYXRpb25fdDsKKworCit0eXBlZGVmIHVuaW9uIG1lX2NmZ190Y3BpcCB7CisJaW50IGFjY2Vzc190eXBlOworCW1lX2NmZ190Y3BpcF9sb2NhdGlvbl90IGxvY2F0aW9uOworfSBtZV9jZmdfdGNwaXBfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9jZmdfcGNpX2h3X2xvY2F0aW9uIHsKKwl1bnNpZ25lZCBpbnQgYnVzX3R5cGU7CisJdW5zaWduZWQgaW50IGJ1c19ubzsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX25vOworCXVuc2lnbmVkIGludCBmdW5jdGlvbl9ubzsKK30gbWVfY2ZnX3BjaV9od19sb2NhdGlvbl90OworCisvKgordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3VzYl9od19sb2NhdGlvbiB7CisJdW5zaWduZWQgaW50IGJ1c190eXBlOworCXVuc2lnbmVkIGludCByb290X2h1Yl9ubzsKK30gbWVfY2ZnX3VzYl9od19sb2NhdGlvbl90OworKi8KKwordHlwZWRlZiB1bmlvbiBtZV9jZmdfaHdfbG9jYXRpb24geworCXVuc2lnbmVkIGludCBidXNfdHlwZTsKKwltZV9jZmdfcGNpX2h3X2xvY2F0aW9uX3QgcGNpOworLy8JbWVfY2ZnX3VzYl9od19sb2NhdGlvbl90IHVzYjsKK30gbWVfY2ZnX2h3X2xvY2F0aW9uX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX2RldmljZV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yX2lkOworCXVuc2lnbmVkIGludCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IHNlcmlhbF9ubzsKKwltZV9jZmdfaHdfbG9jYXRpb25fdCBod19sb2NhdGlvbjsKK30gbWVfY2ZnX2RldmljZV9pbmZvX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3N1YmRldmljZV9pbmZvIHsKKwlpbnQgdHlwZTsKKwlpbnQgc3ViX3R5cGU7CisJdW5zaWduZWQgaW50IG51bWJlcl9jaGFubmVsczsKK30gbWVfY2ZnX3N1YmRldmljZV9pbmZvX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3JhbmdlX2VudHJ5IHsKKwlpbnQgdW5pdDsKKwlkb3VibGUgbWluOworCWRvdWJsZSBtYXg7CisJdW5zaWduZWQgaW50IG1heF9kYXRhOworfSBtZV9jZmdfcmFuZ2VfZW50cnlfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9jZmdfbXV4MzJtX2RldmljZSB7CisJaW50IHR5cGU7CisJaW50IHRpbWVkOworCXVuc2lnbmVkIGludCBhaV9jaGFubmVsOworCXVuc2lnbmVkIGludCBkaW9fZGV2aWNlOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB0aW1lcl9kZXZpY2U7CisJdW5zaWduZWQgaW50IHRpbWVyX3N1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgbXV4MzJzX2NvdW50OworfSBtZV9jZmdfbXV4MzJtX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19kZW11eDMyX2RldmljZSB7CisJaW50IHR5cGU7CisJaW50IHRpbWVkOworCXVuc2lnbmVkIGludCBhb19jaGFubmVsOworCXVuc2lnbmVkIGludCBkaW9fZGV2aWNlOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB0aW1lcl9kZXZpY2U7CisJdW5zaWduZWQgaW50IHRpbWVyX3N1YmRldmljZTsKK30gbWVfY2ZnX2RlbXV4MzJfZGV2aWNlX3Q7CisKKwordHlwZWRlZiB1bmlvbiBtZV9jZmdfZXh0ZXJuYWxfZGV2aWNlIHsKKwlpbnQgdHlwZTsKKwltZV9jZmdfbXV4MzJtX2RldmljZV90IG11eDMybTsKKwltZV9jZmdfZGVtdXgzMl9kZXZpY2VfdCBkZW11eDMyOworfSBtZV9jZmdfZXh0ZXJuYWxfZGV2aWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3N1YmRldmljZV9lbnRyeSB7CisJbWVfY2ZnX3N1YmRldmljZV9pbmZvX3QgaW5mbzsKKwltZV9jZmdfcmFuZ2VfZW50cnlfdCAqcmFuZ2VfbGlzdDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJaW50IGxvY2tlZDsKKwltZV9jZmdfZXh0ZXJuYWxfZGV2aWNlX3QgZXh0ZXJuYWxfZGV2aWNlOworfSBtZV9jZmdfc3ViZGV2aWNlX2VudHJ5X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX2RldmljZV9lbnRyeSB7CisJbWVfY2ZnX3RjcGlwX3QgdGNwaXA7CisJbWVfY2ZnX2RldmljZV9pbmZvX3QgaW5mbzsKKwltZV9jZmdfc3ViZGV2aWNlX2VudHJ5X3QgKnN1YmRldmljZV9saXN0OworCXVuc2lnbmVkIGludCBjb3VudDsKK30gbWVfY2ZnX2RldmljZV9lbnRyeV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NvbmZpZ19sb2FkIHsKKwltZV9jZmdfZGV2aWNlX2VudHJ5X3QgKmRldmljZV9saXN0OworCXVuc2lnbmVkIGludCBjb3VudDsKKwlpbnQgZXJybm87Cit9IG1lX2NvbmZpZ19sb2FkX3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUaGUgaW9jdGxzIG9mIHRoZSBib2FyZAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FTUFJTl9NQUdJQyAneScKKworI2RlZmluZSBNRV9JT19JUlFfRU5BQkxFCQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMSwgbWVfaW9faXJxX3N0YXJ0X3QpCisjZGVmaW5lIE1FX0lPX0lSUV9XQUlUCQkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDIsIG1lX2lvX2lycV93YWl0X3QpCisjZGVmaW5lIE1FX0lPX0lSUV9ESVNBQkxFCQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMywgbWVfaW9faXJxX3N0b3BfdCkKKworI2RlZmluZSBNRV9JT19SRVNFVF9ERVZJQ0UJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCA0LCBtZV9pb19yZXNldF9kZXZpY2VfdCkKKyNkZWZpbmUgTUVfSU9fUkVTRVRfU1VCREVWSUNFCQkJX0lPVyAoTUVNQUlOX01BR0lDLCA1LCBtZV9pb19yZXNldF9zdWJkZXZpY2VfdCkKKworI2RlZmluZSBNRV9JT19TSU5HTEUJCQkJCV9JT1dSKE1FTUFJTl9NQUdJQywgNiwgbWVfaW9fc2luZ2xlX3QpCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUcJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCA3LCBtZV9pb19zaW5nbGVfY29uZmlnX3QpCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX0NPTkZJRwkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDgsIG1lX2lvX3N0cmVhbV9jb25maWdfdCkKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX05FV19WQUxVRVMJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDksIG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9SRUFECQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMTAsIG1lX2lvX3N0cmVhbV9yZWFkX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVEFSVAkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDExLCBtZV9pb19zdHJlYW1fc3RhcnRfdCkKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUQVRVUwkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDEyLCBtZV9pb19zdHJlYW1fc3RhdHVzX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVE9QCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgMTMsIG1lX2lvX3N0cmVhbV9zdG9wX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9XUklURQkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDE0LCBtZV9pb19zdHJlYW1fd3JpdGVfdCkKKworI2RlZmluZSBNRV9MT0NLX0RSSVZFUgkJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCAxNSwgbWVfbG9ja19kcml2ZXJfdCkKKyNkZWZpbmUgTUVfTE9DS19ERVZJQ0UJCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgMTYsIG1lX2xvY2tfZGV2aWNlX3QpCisjZGVmaW5lIE1FX0xPQ0tfU1VCREVWSUNFCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgMTcsIG1lX2xvY2tfc3ViZGV2aWNlX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfREVTQ1JJUFRJT05fREVWSUNFCQlfSU9SIChNRU1BSU5fTUFHSUMsIDE4LCBtZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2VfdCkKKworI2RlZmluZSBNRV9RVUVSWV9JTkZPX0RFVklDRQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMTksIG1lX3F1ZXJ5X2luZm9fZGV2aWNlX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfTkFNRV9ERVZJQ0UJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDIwLCBtZV9xdWVyeV9uYW1lX2RldmljZV90KQorI2RlZmluZSBNRV9RVUVSWV9OQU1FX0RFVklDRV9EUklWRVIJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjEsIG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcl90KQorCisjZGVmaW5lIE1FX1FVRVJZX05VTUJFUl9ERVZJQ0VTCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyMiwgbWVfcXVlcnlfbnVtYmVyX2RldmljZXNfdCkKKyNkZWZpbmUgTUVfUVVFUllfTlVNQkVSX1NVQkRFVklDRVMJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjMsIG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzX3QpCisjZGVmaW5lIE1FX1FVRVJZX05VTUJFUl9DSEFOTkVMUwkJX0lPUiAoTUVNQUlOX01BR0lDLCAyNCwgbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzX3QpCisjZGVmaW5lIE1FX1FVRVJZX05VTUJFUl9SQU5HRVMJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDI1LCBtZV9xdWVyeV9udW1iZXJfcmFuZ2VzX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfUkFOR0VfQllfTUlOX01BWAkJX0lPUiAoTUVNQUlOX01BR0lDLCAyNiwgbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heF90KQorI2RlZmluZSBNRV9RVUVSWV9SQU5HRV9JTkZPCQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjcsIG1lX3F1ZXJ5X3JhbmdlX2luZm9fdCkKKworI2RlZmluZSBNRV9RVUVSWV9TVUJERVZJQ0VfQllfVFlQRQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyOCwgbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGVfdCkKKyNkZWZpbmUgTUVfUVVFUllfU1VCREVWSUNFX1RZUEUJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDI5LCBtZV9xdWVyeV9zdWJkZXZpY2VfdHlwZV90KQorI2RlZmluZSBNRV9RVUVSWV9TVUJERVZJQ0VfQ0FQUwkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjksIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX3QpCisjZGVmaW5lIE1FX1FVRVJZX1NVQkRFVklDRV9DQVBTX0FSR1MJX0lPUiAoTUVNQUlOX01BR0lDLCAzMCwgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnc190KQorCisjZGVmaW5lIE1FX1FVRVJZX1RJTUVSCQkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDMxLCBtZV9xdWVyeV90aW1lcl90KQorCisjZGVmaW5lIE1FX1FVRVJZX1ZFUlNJT05fREVWSUNFX0RSSVZFUglfSU9SIChNRU1BSU5fTUFHSUMsIDMyLCBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXJfdCkKKyNkZWZpbmUgTUVfUVVFUllfVkVSU0lPTl9NQUlOX0RSSVZFUglfSU9SIChNRU1BSU5fTUFHSUMsIDMzLCBtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3QpCisKKyNkZWZpbmUgTUVfQ09ORklHX0xPQUQJCQkJCV9JT1dSKE1FTUFJTl9NQUdJQywgMzQsIG1lX2NvbmZpZ19sb2FkX3QpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWQxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVtYWluLmMKQEAgLTAsMCArMSwyMDIyIEBACisvKioKKyAqIEBmaWxlIG1lbWFpbi5jCisgKgorICogQGJyaWVmIE1haW4gTWVpbGhhdXMgZGV2aWNlIGRyaXZlci4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisvLyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZXR5cGVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lbWFpbi5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzCisqLworCisjaWZkZWYgQk9TQ0gKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVfYm9zY2hfZncgPSAwOworCisjIGlmZGVmIG1vZHVsZV9wYXJhbQorbW9kdWxlX3BhcmFtKG1lX2Jvc2NoX2Z3LCBpbnQsIFNfSVJVR08pOworIyBlbHNlCitNT0RVTEVfUEFSTShtZV9ib3NjaF9mdywgImkiKTsKKyMgZW5kaWYKKworTU9EVUxFX1BBUk1fREVTQyhtZV9ib3NjaF9mdywKKwkJICJGbGFncyB3aGljaCBzaWduYWxzIHRoZSBNRS00NjAwIGRyaXZlciB0byBsb2FkIHRoZSBib3NjaCBmaXJtd2FyZSAoZGVmYXVsdCA9IDApLiIpOworI2VuZGlmIC8vQk9TQ0gKKworc3RhdGljIHVuc2lnbmVkIGludCBtYWpvciA9IDA7CisjaWZkZWYgbW9kdWxlX3BhcmFtCittb2R1bGVfcGFyYW0obWFqb3IsIGludCwgU19JUlVHTyk7CisjZWxzZQorTU9EVUxFX1BBUk0obWFqb3IsICJpIik7CisjZW5kaWYKKworLyogR2xvYmFsIERyaXZlciBMb2NrCisqLworCitzdGF0aWMgc3RydWN0IGZpbGUgKm1lX2ZpbGVwID0gTlVMTDsKK3N0YXRpYyBpbnQgbWVfY291bnQgPSAwOworc3RhdGljIHNwaW5sb2NrX3QgbWVfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKG1lX3J3c2VtKTsKKworLyogQm9hcmQgaW5zdGFuY2VzIGFyZSBrZXB0IGluIGEgZ2xvYmFsIGxpc3QgKi8KK0xJU1RfSEVBRChtZV9kZXZpY2VfbGlzdCk7CisKKy8qIFByb3RvdHlwZXMKKyovCisKK3N0YXRpYyBpbnQgbWVfcHJvYmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCBtZV9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIGludCBpbnNlcnRfdG9fZGV2aWNlX2xpc3QobWVfZGV2aWNlX3QgKiBuX2RldmljZSk7CitzdGF0aWMgaW50IHJlcGxhY2Vfd2l0aF9kdW1teShpbnQgdmVuZG9yX2lkLCBpbnQgZGV2aWNlX2lkLCBpbnQgc2VyaWFsX25vKTsKK3N0YXRpYyB2b2lkIGNsZWFyX2RldmljZV9saXN0KHZvaWQpOworc3RhdGljIGludCBtZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGVfcHRyLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworc3RhdGljIGludCBtZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgbWVfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisvL3N0YXRpYyBpbnQgbWVfcHJvYmVfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CisvL3N0YXRpYyB2b2lkIG1lX2Rpc2Nvbm5lY3RfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworCisvKiBDaGFyYWN0ZXIgZGV2aWNlIHN0cnVjdHVyZQorKi8KKworc3RhdGljIHN0cnVjdCBjZGV2ICpjZGV2cDsKKworLyogRmlsZSBvcGVyYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBtb2R1bGUKKyovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1lX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuaW9jdGwgPSBtZV9pb2N0bCwKKwkub3BlbiA9IG1lX29wZW4sCisJLnJlbGVhc2UgPSBtZV9yZWxlYXNlLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgbWVfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IE1FTUFJTl9OQU1FLAorCS5pZF90YWJsZSA9IG1lX3BjaV90YWJsZSwKKwkucHJvYmUgPSBtZV9wcm9iZV9wY2ksCisJLnJlbW92ZSA9IG1lX3JlbW92ZV9wY2kKK307CisKKy8qIC8vbWVfdXNiX2RyaXZlcgorc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG1lX3VzYl9kcml2ZXIgPQoreworCS5uYW1lID0gTUVNQUlOX05BTUUsCisJLmlkX3RhYmxlID0gbWVfdXNiX3RhYmxlLAorCS5wcm9iZSA9IG1lX3Byb2JlX3VzYiwKKwkuZGlzY29ubmVjdCA9IG1lX2Rpc2Nvbm5lY3RfdXNiCit9OworKi8KKworI2lmZGVmIE1FX0xPQ0tfTVVMVElQTEVYX1RFTVBMQVRFCitNRV9MT0NLX01VTFRJUExFWF9URU1QTEFURSgibWVfbG9ja19kZXZpY2UiLAorCQkJICAgbWVfbG9ja19kZXZpY2VfdCwKKwkJCSAgIG1lX2xvY2tfZGV2aWNlLAorCQkJICAgbWVfZGV2aWNlX2xvY2tfZGV2aWNlLAorCQkJICAgKGRldmljZSwgZmlsZXAsIGthcmcubG9jaywga2FyZy5mbGFncykpCisKKyAgICBNRV9MT0NLX01VTFRJUExFWF9URU1QTEFURSgibWVfbG9ja19zdWJkZXZpY2UiLAorCQkJICAgbWVfbG9ja19zdWJkZXZpY2VfdCwKKwkJCSAgIG1lX2xvY2tfc3ViZGV2aWNlLAorCQkJICAgbWVfZGV2aWNlX2xvY2tfc3ViZGV2aWNlLAorCQkJICAgKGRldmljZSwgZmlsZXAsIGthcmcuc3ViZGV2aWNlLCBrYXJnLmxvY2ssCisJCQlrYXJnLmZsYWdzKSkKKyNlbHNlCisjZXJyb3IgbWFjcm8gTUVfTE9DS19NVUxUSVBMRVhfVEVNUExBVEUgbm90IGRlZmluZWQKKyNlbmRpZgorCisjaWZkZWYgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFCitNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX2lycV9zdGFydCIsCisJCQkgbWVfaW9faXJxX3N0YXJ0X3QsCisJCQkgbWVfaW9faXJxX3N0YXJ0LAorCQkJIG1lX2RldmljZV9pb19pcnFfc3RhcnQsCisJCQkgKGRldmljZSwKKwkJCSAgZmlsZXAsCisJCQkgIGthcmcuc3ViZGV2aWNlLAorCQkJICBrYXJnLmNoYW5uZWwsCisJCQkgIGthcmcuaXJxX3NvdXJjZSwKKwkJCSAga2FyZy5pcnFfZWRnZSwga2FyZy5pcnFfYXJnLCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9faXJxX3dhaXQiLAorCQkJIG1lX2lvX2lycV93YWl0X3QsCisJCQkgbWVfaW9faXJxX3dhaXQsCisJCQkgbWVfZGV2aWNlX2lvX2lycV93YWl0LAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy5jaGFubmVsLAorCQkgICAgICAma2FyZy5pcnFfY291bnQsICZrYXJnLnZhbHVlLCBrYXJnLnRpbWVfb3V0LCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9faXJxX3N0b3AiLAorCQkJIG1lX2lvX2lycV9zdG9wX3QsCisJCQkgbWVfaW9faXJxX3N0b3AsCisJCQkgbWVfZGV2aWNlX2lvX2lycV9zdG9wLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLCBrYXJnLnN1YmRldmljZSwga2FyZy5jaGFubmVsLCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fcmVzZXRfZGV2aWNlIiwKKwkJCSBtZV9pb19yZXNldF9kZXZpY2VfdCwKKwkJCSBtZV9pb19yZXNldF9kZXZpY2UsCisJCQkgbWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZSwgKGRldmljZSwgZmlsZXAsIGthcmcuZmxhZ3MpKQorCisgICAgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19yZXNldF9zdWJkZXZpY2UiLAorCQkJIG1lX2lvX3Jlc2V0X3N1YmRldmljZV90LAorCQkJIG1lX2lvX3Jlc2V0X3N1YmRldmljZSwKKwkJCSBtZV9kZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlLAorCQkJIChkZXZpY2UsIGZpbGVwLCBrYXJnLnN1YmRldmljZSwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX3NpbmdsZV9jb25maWciLAorCQkJIG1lX2lvX3NpbmdsZV9jb25maWdfdCwKKwkJCSBtZV9pb19zaW5nbGVfY29uZmlnLAorCQkJIG1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy5jaGFubmVsLAorCQkgICAgICBrYXJnLnNpbmdsZV9jb25maWcsCisJCSAgICAgIGthcmcucmVmLAorCQkgICAgICBrYXJnLnRyaWdfY2hhbiwKKwkJICAgICAga2FyZy50cmlnX3R5cGUsIGthcmcudHJpZ19lZGdlLCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fc3RyZWFtX25ld192YWx1ZXMiLAorCQkJIG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzX3QsCisJCQkgbWVfaW9fc3RyZWFtX25ld192YWx1ZXMsCisJCQkgbWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwga2FyZy50aW1lX291dCwgJmthcmcuY291bnQsIGthcmcuZmxhZ3MpKQorCisgICAgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19zdHJlYW1fcmVhZCIsCisJCQkgbWVfaW9fc3RyZWFtX3JlYWRfdCwKKwkJCSBtZV9pb19zdHJlYW1fcmVhZCwKKwkJCSBtZV9kZXZpY2VfaW9fc3RyZWFtX3JlYWQsCisJCQkgKGRldmljZSwKKwkJICAgICAgZmlsZXAsCisJCSAgICAgIGthcmcuc3ViZGV2aWNlLAorCQkgICAgICBrYXJnLnJlYWRfbW9kZSwga2FyZy52YWx1ZXMsICZrYXJnLmNvdW50LCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fc3RyZWFtX3N0YXR1cyIsCisJCQkgbWVfaW9fc3RyZWFtX3N0YXR1c190LAorCQkJIG1lX2lvX3N0cmVhbV9zdGF0dXMsCisJCQkgbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMsCisJCQkgKGRldmljZSwKKwkJICAgICAgZmlsZXAsCisJCSAgICAgIGthcmcuc3ViZGV2aWNlLAorCQkgICAgICBrYXJnLndhaXQsICZrYXJnLnN0YXR1cywgJmthcmcuY291bnQsIGthcmcuZmxhZ3MpKQorCisgICAgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19zdHJlYW1fd3JpdGUiLAorCQkJIG1lX2lvX3N0cmVhbV93cml0ZV90LAorCQkJIG1lX2lvX3N0cmVhbV93cml0ZSwKKwkJCSBtZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy53cml0ZV9tb2RlLCBrYXJnLnZhbHVlcywgJmthcmcuY291bnQsIGthcmcuZmxhZ3MpKQorI2Vsc2UKKyNlcnJvciBtYWNybyBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUgbm90IGRlZmluZWQKKyNlbmRpZgorCisjaWZkZWYgTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURQorTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURSgibWVfcXVlcnlfbmFtZV9kZXZpY2UiLAorCQkJCW1lX3F1ZXJ5X25hbWVfZGV2aWNlX3QsCisJCQkJbWVfcXVlcnlfbmFtZV9kZXZpY2UsCisJCQkJbWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlLCAoZGV2aWNlLCAmbXNnKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9TVFJfVEVNUExBVEUoIm1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciIsCisJCQkJbWVfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyX3QsCisJCQkJbWVfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyLAorCQkJCW1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIsCisJCQkJKGRldmljZSwgJm1zZykpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfU1RSX1RFTVBMQVRFKCJtZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UiLAorCQkJCW1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZV90LAorCQkJCW1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZSwKKwkJCQltZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlLAorCQkJCShkZXZpY2UsICZtc2cpKQorI2Vsc2UKKyNlcnJvciBtYWNybyBNRV9RVUVSWV9NVUxUSVBMRVhfU1RSX1RFTVBMQVRFIG5vdCBkZWZpbmVkCisjZW5kaWYKKworI2lmZGVmIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURQorTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9pbmZvX2RldmljZSIsCisJCQkgICAgbWVfcXVlcnlfaW5mb19kZXZpY2VfdCwKKwkJCSAgICBtZV9xdWVyeV9pbmZvX2RldmljZSwKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2UsCisJCQkgICAgKGRldmljZSwKKwkJCSAgICAgJmthcmcudmVuZG9yX2lkLAorCQkJICAgICAma2FyZy5kZXZpY2VfaWQsCisJCQkgICAgICZrYXJnLnNlcmlhbF9ubywKKwkJCSAgICAgJmthcmcuYnVzX3R5cGUsCisJCQkgICAgICZrYXJnLmJ1c19ubywKKwkJCSAgICAgJmthcmcuZGV2X25vLCAma2FyZy5mdW5jX25vLCAma2FyZy5wbHVnZ2VkKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMiLAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzX3QsCisJCQkgICAgbWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzLAorCQkJICAgIChkZXZpY2UsICZrYXJnLm51bWJlcikpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X251bWJlcl9jaGFubmVscyIsCisJCQkgICAgbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzX3QsCisJCQkgICAgbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsICZrYXJnLm51bWJlcikpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlIiwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZV90LAorCQkJICAgIG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZSwKKwkJCSAgICAoZGV2aWNlLAorCQkJIGthcmcuc3RhcnRfc3ViZGV2aWNlLAorCQkJIGthcmcudHlwZSwga2FyZy5zdWJ0eXBlLCAma2FyZy5zdWJkZXZpY2UpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSIsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGVfdCwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSwKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsICZrYXJnLnR5cGUsICZrYXJnLnN1YnR5cGUpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyIsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfdCwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfY2FwcywKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsICZrYXJnLmNhcHMpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzIiwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzX3QsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncywKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncywKKwkJCSAgICAoZGV2aWNlLCBrYXJnLnN1YmRldmljZSwga2FyZy5jYXAsIGthcmcuYXJncywKKwkJCSBrYXJnLmNvdW50KSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfbnVtYmVyX3JhbmdlcyIsCisJCQkgICAgbWVfcXVlcnlfbnVtYmVyX3Jhbmdlc190LAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9yYW5nZXMsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsIGthcmcudW5pdCwgJmthcmcubnVtYmVyKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heCIsCisJCQkgICAgbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heF90LAorCQkJICAgIG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgsCisJCQkgICAgKGRldmljZSwKKwkJCSBrYXJnLnN1YmRldmljZSwKKwkJCSBrYXJnLnVuaXQsCisJCQkgJmthcmcubWluLCAma2FyZy5tYXgsICZrYXJnLm1heF9kYXRhLCAma2FyZy5yYW5nZSkpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X3JhbmdlX2luZm8iLAorCQkJICAgIG1lX3F1ZXJ5X3JhbmdlX2luZm9fdCwKKwkJCSAgICBtZV9xdWVyeV9yYW5nZV9pbmZvLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9yYW5nZV9pbmZvLAorCQkJICAgIChkZXZpY2UsCisJCQkga2FyZy5zdWJkZXZpY2UsCisJCQkga2FyZy5yYW5nZSwKKwkJCSAma2FyZy51bml0LCAma2FyZy5taW4sICZrYXJnLm1heCwgJmthcmcubWF4X2RhdGEpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV90aW1lciIsCisJCQkgICAgbWVfcXVlcnlfdGltZXJfdCwKKwkJCSAgICBtZV9xdWVyeV90aW1lciwKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfdGltZXIsCisJCQkgICAgKGRldmljZSwKKwkJCSBrYXJnLnN1YmRldmljZSwKKwkJCSBrYXJnLnRpbWVyLAorCQkJICZrYXJnLmJhc2VfZnJlcXVlbmN5LAorCQkJICZrYXJnLm1pbl90aWNrcywgJmthcmcubWF4X3RpY2tzKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyIiwKKwkJCSAgICBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXJfdCwKKwkJCSAgICBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciwKKwkJCSAgICAoZGV2aWNlLCAma2FyZy52ZXJzaW9uKSkKKyNlbHNlCisjZXJyb3IgbWFjcm8gTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFIG5vdCBkZWZpbmVkCisjZW5kaWYKKworLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLworCitzdGF0aWMgbWVfZGV2aWNlX3QgKmdldF9kdW1teV9pbnN0YW5jZSh1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsCisJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHNlcmlhbF9ubywKKwkJCQkgICAgICAgaW50IGJ1c190eXBlLAorCQkJCSAgICAgICBpbnQgYnVzX25vLCBpbnQgZGV2X25vLCBpbnQgZnVuY19ubykKK3sKKwlpbnQgZXJyOworCW1lX2R1bW15X2NvbnN0cnVjdG9yX3QgY29uc3RydWN0b3IgPSBOVUxMOworCW1lX2RldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmICgoY29uc3RydWN0b3IgPSBzeW1ib2xfZ2V0KG1lZHVtbXlfY29uc3RydWN0b3IpKSA9PSBOVUxMKSB7CisJCWVyciA9IHJlcXVlc3RfbW9kdWxlKE1FRFVNTVlfTkFNRSk7CisKKwkJaWYgKGVycikgeworCQkJUEVSUk9SKCJFcnJvciB3aGlsZSByZXF1ZXN0IGZvciBtb2R1bGUgJXMuXG4iLAorCQkJICAgICAgIE1FRFVNTVlfTkFNRSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICgoY29uc3RydWN0b3IgPSBzeW1ib2xfZ2V0KG1lZHVtbXlfY29uc3RydWN0b3IpKSA9PSBOVUxMKSB7CisJCQlQRVJST1IoIkNhbid0IGdldCAlcyBkcml2ZXIgbW9kdWxlIGNvbnN0cnVjdG9yLlxuIiwKKwkJCSAgICAgICBNRURVTU1ZX05BTUUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlpZiAoKGluc3RhbmNlID0gKCpjb25zdHJ1Y3RvcikgKHZlbmRvcl9pZCwKKwkJCQkJZGV2aWNlX2lkLAorCQkJCQlzZXJpYWxfbm8sCisJCQkJCWJ1c190eXBlLAorCQkJCQlidXNfbm8sIGRldl9ubywgZnVuY19ubykpID09IE5VTEwpCisJCXN5bWJvbF9wdXQobWVkdW1teV9jb25zdHJ1Y3Rvcik7CisKKwlyZXR1cm4gaW5zdGFuY2U7Cit9CisKK3N0YXRpYyBpbnQgbWVfcHJvYmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZXJyOworCW1lX3BjaV9jb25zdHJ1Y3Rvcl90IGNvbnN0cnVjdG9yID0gTlVMTDsKKyNpZmRlZiBCT1NDSAorCW1lX2Jvc2NoX2NvbnN0cnVjdG9yX3QgY29uc3RydWN0b3JfYm9zY2ggPSBOVUxMOworI2VuZGlmCisJbWVfZGV2aWNlX3QgKm5fZGV2aWNlID0gTlVMTDsKKwl1aW50MzJfdCBkZXZpY2U7CisKKwljaGFyIGNvbnN0cnVjdG9yX25hbWVbMjRdID0gIm1lMDAwMF9wY2lfY29uc3RydWN0b3IiOworCWNoYXIgbW9kdWxlX25hbWVbN10gPSAibWUwMDAwIjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlkZXZpY2UgPSBkZXYtPmRldmljZTsKKwlpZiAoKGRldmljZSAmIDB4RjAwMCkgPT0gMHg2MDAwKSB7CS8vIEV4Y2VwdGlvbnM6IG1lNjF4eCwgbWU2Mnh4LCBtZTYzeHggYXJlIGhhbmRsZWQgYnkgb25lIGRyaXZlci4KKwkJZGV2aWNlICY9IDB4RjBGRjsKKwl9CisKKwljb25zdHJ1Y3Rvcl9uYW1lWzJdICs9IChjaGFyKSgoZGV2aWNlID4+IDEyKSAmIDB4MDAwRik7CisJY29uc3RydWN0b3JfbmFtZVszXSArPSAoY2hhcikoKGRldmljZSA+PiA4KSAmIDB4MDAwRik7CisJUERFQlVHKCJjb25zdHJ1Y3Rvcl9uYW1lOiAlc1xuIiwgY29uc3RydWN0b3JfbmFtZSk7CisJbW9kdWxlX25hbWVbMl0gKz0gKGNoYXIpKChkZXZpY2UgPj4gMTIpICYgMHgwMDBGKTsKKwltb2R1bGVfbmFtZVszXSArPSAoY2hhcikoKGRldmljZSA+PiA4KSAmIDB4MDAwRik7CisJUERFQlVHKCJtb2R1bGVfbmFtZTogJXNcbiIsIG1vZHVsZV9uYW1lKTsKKworCWlmICgoY29uc3RydWN0b3IgPQorCSAgICAgKG1lX3BjaV9jb25zdHJ1Y3Rvcl90KSBzeW1ib2xfZ2V0KGNvbnN0cnVjdG9yX25hbWUpKSA9PSBOVUxMKSB7CisJCWlmIChyZXF1ZXN0X21vZHVsZShtb2R1bGVfbmFtZSkpIHsKKwkJCVBFUlJPUigiRXJyb3Igd2hpbGUgcmVxdWVzdCBmb3IgbW9kdWxlICVzLlxuIiwKKwkJCSAgICAgICBtb2R1bGVfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWlmICgoY29uc3RydWN0b3IgPQorCQkgICAgIChtZV9wY2lfY29uc3RydWN0b3JfdCkgc3ltYm9sX2dldChjb25zdHJ1Y3Rvcl9uYW1lKSkgPT0KKwkJICAgIE5VTEwpIHsKKwkJCVBFUlJPUigiQ2FuJ3QgZ2V0ICVzIGRyaXZlciBtb2R1bGUgY29uc3RydWN0b3IuXG4iLAorCQkJICAgICAgIG1vZHVsZV9uYW1lKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorI2lmZGVmIEJPU0NICisJaWYgKChkZXZpY2UgJiAweEYwMDApID09IDB4NDAwMCkgewkvLyBCb3NjaCBidWlsZCBoYXMgZGlmZmVybnQgY29uc3RydWN0b3IgZm9yIG1lNDYwMC4KKwkJaWYgKChuX2RldmljZSA9CisJCSAgICAgKCpjb25zdHJ1Y3Rvcl9ib3NjaCkgKGRldiwgbWVfYm9zY2hfZncpKSA9PSBOVUxMKSB7CisJCQlzeW1ib2xfcHV0KGNvbnN0cnVjdG9yX25hbWUpOworCQkJUEVSUk9SCisJCQkgICAgKCJDYW4ndCBnZXQgZGV2aWNlIGluc3RhbmNlIG9mICVzIGRyaXZlciBtb2R1bGUuXG4iLAorCQkJICAgICBtb2R1bGVfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisjZW5kaWYKKwkJaWYgKChuX2RldmljZSA9ICgqY29uc3RydWN0b3IpIChkZXYpKSA9PSBOVUxMKSB7CisJCQlzeW1ib2xfcHV0KGNvbnN0cnVjdG9yX25hbWUpOworCQkJUEVSUk9SCisJCQkgICAgKCJDYW4ndCBnZXQgZGV2aWNlIGluc3RhbmNlIG9mICVzIGRyaXZlciBtb2R1bGUuXG4iLAorCQkJICAgICBtb2R1bGVfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorI2lmZGVmIEJPU0NICisJfQorI2VuZGlmCisKKwlpbnNlcnRfdG9fZGV2aWNlX2xpc3Qobl9kZXZpY2UpOworCWVyciA9CisJICAgIG5fZGV2aWNlLT5tZV9kZXZpY2VfaW9fcmVzZXRfZGV2aWNlKG5fZGV2aWNlLCBOVUxMLAorCQkJCQkJTUVfSU9fUkVTRVRfREVWSUNFX05PX0ZMQUdTKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiRXJyb3Igd2hpbGUgcmVzZXRpbmcgZGV2aWNlLlxuIik7CisJfSBlbHNlIHsKKwkJUERFQlVHKCJSZXNldGluZyBkZXZpY2Ugd2FzIHN1Y2Vzc2Z1bC5cbiIpOworCX0KKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9pbnN0YW5jZShtZV9kZXZpY2VfdCAqIGRldmljZSkKK3sKKwlpbnQgdmVuZG9yX2lkOworCWludCBkZXZpY2VfaWQ7CisJaW50IHNlcmlhbF9ubzsKKwlpbnQgYnVzX3R5cGU7CisJaW50IGJ1c19ubzsKKwlpbnQgZGV2X25vOworCWludCBmdW5jX25vOworCWludCBwbHVnZ2VkOworCisJdWludDMyX3QgZGV2X2lkOworCisJY2hhciBjb25zdHJ1Y3Rvcl9uYW1lWzI0XSA9ICJtZTAwMDBfcGNpX2NvbnN0cnVjdG9yIjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKGRldmljZSwKKwkJCQkJICAgICZ2ZW5kb3JfaWQsCisJCQkJCSAgICAmZGV2aWNlX2lkLAorCQkJCQkgICAgJnNlcmlhbF9ubywKKwkJCQkJICAgICZidXNfdHlwZSwKKwkJCQkJICAgICZidXNfbm8sCisJCQkJCSAgICAmZGV2X25vLCAmZnVuY19ubywgJnBsdWdnZWQpOworCisJZGV2X2lkID0gZGV2aWNlX2lkOworCWRldmljZS0+bWVfZGV2aWNlX2Rlc3RydWN0b3IoZGV2aWNlKTsKKworCWlmIChwbHVnZ2VkICE9IE1FX1BMVUdHRURfSU4pIHsKKwkJUERFQlVHKCJyZWxlYXNlOiBtZWR1bW15X2NvbnN0cnVjdG9yXG4iKTsKKworCQlzeW1ib2xfcHV0KCJtZWR1bW15X2NvbnN0cnVjdG9yIik7CisJfSBlbHNlIHsKKwkJaWYgKChkZXZfaWQgJiAweEYwMDApID09IDB4NjAwMCkgewkvLyBFeGNlcHRpb25zOiBtZTYxeHgsIG1lNjJ4eCwgbWU2M3h4IGFyZSBoYW5kbGVkIGJ5IG9uZSBkcml2ZXIuCisJCQlkZXZfaWQgJj0gMHhGMEZGOworCQl9CisKKwkJY29uc3RydWN0b3JfbmFtZVsyXSArPSAoY2hhcikoKGRldl9pZCA+PiAxMikgJiAweDAwMEYpOworCQljb25zdHJ1Y3Rvcl9uYW1lWzNdICs9IChjaGFyKSgoZGV2X2lkID4+IDgpICYgMHgwMDBGKTsKKwkJUERFQlVHKCJyZWxlYXNlOiAlc1xuIiwgY29uc3RydWN0b3JfbmFtZSk7CisKKwkJc3ltYm9sX3B1dChjb25zdHJ1Y3Rvcl9uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5zZXJ0X3RvX2RldmljZV9saXN0KG1lX2RldmljZV90ICogbl9kZXZpY2UpCit7CisJbWVfZGV2aWNlX3QgKm9fZGV2aWNlID0gTlVMTDsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlpbnQgbl92ZW5kb3JfaWQ7CisJaW50IG5fZGV2aWNlX2lkOworCWludCBuX3NlcmlhbF9ubzsKKwlpbnQgbl9idXNfdHlwZTsKKwlpbnQgbl9idXNfbm87CisJaW50IG5fZGV2X25vOworCWludCBuX2Z1bmNfbm87CisJaW50IG5fcGx1Z2dlZDsKKwlpbnQgb192ZW5kb3JfaWQ7CisJaW50IG9fZGV2aWNlX2lkOworCWludCBvX3NlcmlhbF9ubzsKKwlpbnQgb19idXNfdHlwZTsKKwlpbnQgb19idXNfbm87CisJaW50IG9fZGV2X25vOworCWludCBvX2Z1bmNfbm87CisJaW50IG9fcGx1Z2dlZDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCW5fZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2Uobl9kZXZpY2UsCisJCQkJCSAgICAgICZuX3ZlbmRvcl9pZCwKKwkJCQkJICAgICAgJm5fZGV2aWNlX2lkLAorCQkJCQkgICAgICAmbl9zZXJpYWxfbm8sCisJCQkJCSAgICAgICZuX2J1c190eXBlLAorCQkJCQkgICAgICAmbl9idXNfbm8sCisJCQkJCSAgICAgICZuX2Rldl9ubywKKwkJCQkJICAgICAgJm5fZnVuY19ubywgJm5fcGx1Z2dlZCk7CisKKwlkb3duX3dyaXRlKCZtZV9yd3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCW9fZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJb19kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZShvX2RldmljZSwKKwkJCQkJCSAgICAgICZvX3ZlbmRvcl9pZCwKKwkJCQkJCSAgICAgICZvX2RldmljZV9pZCwKKwkJCQkJCSAgICAgICZvX3NlcmlhbF9ubywKKwkJCQkJCSAgICAgICZvX2J1c190eXBlLAorCQkJCQkJICAgICAgJm9fYnVzX25vLAorCQkJCQkJICAgICAgJm9fZGV2X25vLAorCQkJCQkJICAgICAgJm9fZnVuY19ubywgJm9fcGx1Z2dlZCk7CisKKwkJaWYgKG9fcGx1Z2dlZCA9PSBNRV9QTFVHR0VEX09VVCkgeworCQkJaWYgKCgob192ZW5kb3JfaWQgPT0gbl92ZW5kb3JfaWQpICYmCisJCQkgICAgIChvX2RldmljZV9pZCA9PSBuX2RldmljZV9pZCkgJiYKKwkJCSAgICAgKG9fc2VyaWFsX25vID09IG5fc2VyaWFsX25vKSAmJgorCQkJICAgICAob19idXNfdHlwZSA9PSBuX2J1c190eXBlKSkgfHwKKwkJCSAgICAoKG9fdmVuZG9yX2lkID09IG5fdmVuZG9yX2lkKSAmJgorCQkJICAgICAob19kZXZpY2VfaWQgPT0gbl9kZXZpY2VfaWQpICYmCisJCQkgICAgIChvX2J1c190eXBlID09IG5fYnVzX3R5cGUpICYmCisJCQkgICAgIChvX2J1c19ubyA9PSBuX2J1c19ubykgJiYKKwkJCSAgICAgKG9fZGV2X25vID09IG5fZGV2X25vKSAmJgorCQkJICAgICAob19mdW5jX25vID09IG5fZnVuY19ubykpKSB7CisJCQkJbl9kZXZpY2UtPmxpc3QucHJldiA9IHBvcy0+cHJldjsKKwkJCQluX2RldmljZS0+bGlzdC5uZXh0ID0gcG9zLT5uZXh0OworCQkJCXBvcy0+cHJldi0+bmV4dCA9ICZuX2RldmljZS0+bGlzdDsKKwkJCQlwb3MtPm5leHQtPnByZXYgPSAmbl9kZXZpY2UtPmxpc3Q7CisJCQkJcmVsZWFzZV9pbnN0YW5jZShvX2RldmljZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocG9zID09ICZtZV9kZXZpY2VfbGlzdCkgeworCQlsaXN0X2FkZF90YWlsKCZuX2RldmljZS0+bGlzdCwgJm1lX2RldmljZV9saXN0KTsKKwl9CisKKwl1cF93cml0ZSgmbWVfcndzZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1lX3JlbW92ZV9wY2koc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgdmVuZG9yX2lkID0gZGV2LT52ZW5kb3I7CisJaW50IGRldmljZV9pZCA9IGRldi0+ZGV2aWNlOworCWludCBzdWJzeXN0ZW1fdmVuZG9yID0gZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCWludCBzdWJzeXN0ZW1fZGV2aWNlID0gZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCWludCBzZXJpYWxfbm8gPSAoc3Vic3lzdGVtX2RldmljZSA8PCAxNikgfCBzdWJzeXN0ZW1fdmVuZG9yOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJUElORk8oIlZlbmRvciBpZCA9IDB4JTA4WFxuIiwgdmVuZG9yX2lkKTsKKwlQSU5GTygiRGV2aWNlIGlkID0gMHglMDhYXG4iLCBkZXZpY2VfaWQpOworCVBJTkZPKCJTZXJpYWwgTnVtYmVyID0gMHglMDhYXG4iLCBzZXJpYWxfbm8pOworCisJcmVwbGFjZV93aXRoX2R1bW15KHZlbmRvcl9pZCwgZGV2aWNlX2lkLCBzZXJpYWxfbm8pOworfQorCitzdGF0aWMgaW50IHJlcGxhY2Vfd2l0aF9kdW1teShpbnQgdmVuZG9yX2lkLCBpbnQgZGV2aWNlX2lkLCBpbnQgc2VyaWFsX25vKQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCW1lX2RldmljZV90ICpuX2RldmljZSA9IE5VTEw7CisJbWVfZGV2aWNlX3QgKm9fZGV2aWNlID0gTlVMTDsKKwlpbnQgb192ZW5kb3JfaWQ7CisJaW50IG9fZGV2aWNlX2lkOworCWludCBvX3NlcmlhbF9ubzsKKwlpbnQgb19idXNfdHlwZTsKKwlpbnQgb19idXNfbm87CisJaW50IG9fZGV2X25vOworCWludCBvX2Z1bmNfbm87CisJaW50IG9fcGx1Z2dlZDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWRvd25fd3JpdGUoJm1lX3J3c2VtKTsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJb19kZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQlvX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKG9fZGV2aWNlLAorCQkJCQkJICAgICAgJm9fdmVuZG9yX2lkLAorCQkJCQkJICAgICAgJm9fZGV2aWNlX2lkLAorCQkJCQkJICAgICAgJm9fc2VyaWFsX25vLAorCQkJCQkJICAgICAgJm9fYnVzX3R5cGUsCisJCQkJCQkgICAgICAmb19idXNfbm8sCisJCQkJCQkgICAgICAmb19kZXZfbm8sCisJCQkJCQkgICAgICAmb19mdW5jX25vLCAmb19wbHVnZ2VkKTsKKworCQlpZiAob19wbHVnZ2VkID09IE1FX1BMVUdHRURfSU4pIHsKKwkJCWlmICgoKG9fdmVuZG9yX2lkID09IHZlbmRvcl9pZCkgJiYKKwkJCSAgICAgKG9fZGV2aWNlX2lkID09IGRldmljZV9pZCkgJiYKKwkJCSAgICAgKG9fc2VyaWFsX25vID09IHNlcmlhbF9ubykpKSB7CisJCQkJbl9kZXZpY2UgPSBnZXRfZHVtbXlfaW5zdGFuY2Uob192ZW5kb3JfaWQsCisJCQkJCQkJICAgICAgb19kZXZpY2VfaWQsCisJCQkJCQkJICAgICAgb19zZXJpYWxfbm8sCisJCQkJCQkJICAgICAgb19idXNfdHlwZSwKKwkJCQkJCQkgICAgICBvX2J1c19ubywKKwkJCQkJCQkgICAgICBvX2Rldl9ubywKKwkJCQkJCQkgICAgICBvX2Z1bmNfbm8pOworCisJCQkJaWYgKCFuX2RldmljZSkgeworCQkJCQl1cF93cml0ZSgmbWVfcndzZW0pOworCQkJCQlQRVJST1IoIkNhbm5vdCBnZXQgZHVtbXkgaW5zdGFuY2UuXG4iKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCisJCQkJbl9kZXZpY2UtPmxpc3QucHJldiA9IHBvcy0+cHJldjsKKworCQkJCW5fZGV2aWNlLT5saXN0Lm5leHQgPSBwb3MtPm5leHQ7CisJCQkJcG9zLT5wcmV2LT5uZXh0ID0gJm5fZGV2aWNlLT5saXN0OworCQkJCXBvcy0+bmV4dC0+cHJldiA9ICZuX2RldmljZS0+bGlzdDsKKwkJCQlyZWxlYXNlX2luc3RhbmNlKG9fZGV2aWNlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXVwX3dyaXRlKCZtZV9yd3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfZGV2aWNlX2xpc3Qodm9pZCkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCW1lX2RldmljZV90ICpkZXZpY2U7CisKKwkvLyBDbGVhciB0aGUgZGV2aWNlIGluZm8gbGlzdCAuCisJZG93bl93cml0ZSgmbWVfcndzZW0pOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtZV9kZXZpY2VfbGlzdCkpIHsKKwkJZW50cnkgPSBtZV9kZXZpY2VfbGlzdC5uZXh0OworCQlkZXZpY2UgPSBsaXN0X2VudHJ5KGVudHJ5LCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCWxpc3RfZGVsKGVudHJ5KTsKKwkJcmVsZWFzZV9pbnN0YW5jZShkZXZpY2UpOworCX0KKworCXVwX3dyaXRlKCZtZV9yd3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgbG9ja19kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX2RldmljZV90ICpkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwlzd2l0Y2ggKGxvY2spIHsKKworCWNhc2UgTUVfTE9DS19TRVQ6CisJCWlmIChtZV9jb3VudCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJEcml2ZXIgU3lzdGVtIGlzIGN1cnJlbnRseSB1c2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVVNFRDsKKwkJfSBlbHNlIGlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJEcml2ZXIgU3lzdGVtIGlzIGFscmVhZHkgbG9nZ2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fTE9DS0VEOworCQl9IGVsc2UgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZtZV9kZXZpY2VfbGlzdCwgbGlzdCkgeworCQkJCWVyciA9CisJCQkJICAgIGRldmljZS0+bWVfZGV2aWNlX2xvY2tfZGV2aWNlKGRldmljZSwgZmlsZXAsCisJCQkJCQkJCSAgTUVfTE9DS19DSEVDSywKKwkJCQkJCQkJICBmbGFncyk7CisKKwkJCQlpZiAoZXJyKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFlcnIpCisJCQkJbWVfZmlsZXAgPSBmaWxlcDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9MT0NLX1JFTEVBU0U6CisJCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQkJZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmbWVfZGV2aWNlX2xpc3QsIGxpc3QpIHsKKwkJCQlkZXZpY2UtPm1lX2RldmljZV9sb2NrX2RldmljZShkZXZpY2UsIGZpbGVwLAorCQkJCQkJCSAgICAgIE1FX0xPQ0tfUkVMRUFTRSwKKwkJCQkJCQkgICAgICBmbGFncyk7CisJCQl9CisKKwkJCW1lX2ZpbGVwID0gTlVMTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGxvY2sgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9MT0NLOworCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCXVwX3JlYWQoJm1lX3J3c2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfbG9ja19kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGVwLCBtZV9sb2NrX2RyaXZlcl90ICogYXJnKQoreworCWludCBlcnIgPSAwOworCisJbWVfbG9ja19kcml2ZXJfdCBsb2NrOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmxvY2ssIGFyZywgc2l6ZW9mKG1lX2xvY2tfZHJpdmVyX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbG9jay5lcnJubyA9IGxvY2tfZHJpdmVyKGZpbGVwLCBsb2NrLmxvY2ssIGxvY2suZmxhZ3MpOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmxvY2ssIHNpemVvZihtZV9sb2NrX2RyaXZlcl90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBxdWVyeSBiYWNrIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlX3B0ciwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGVfcHRyLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJbG9ja19kcml2ZXIoZmlsZXAsIE1FX0xPQ0tfUkVMRUFTRSwgTUVfTE9DS19EUklWRVJfTk9fRkxBR1MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcihzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCW1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXJfdCAqIGFyZykKK3sKKwlpbnQgZXJyOworCW1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXJfdCBrYXJnOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJa2FyZy52ZXJzaW9uID0gTUVfVkVSU0lPTl9EUklWRVI7CisJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKG1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXJfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgcXVlcnkgYmFjayB0byB1c2VyIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lX2NvbmZpZ19sb2FkX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGthcmcsIGludCBkZXZpY2Vfbm8pCit7CisKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgayA9IDA7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOworCW1lX2RldmljZV90ICpkZXZpY2UgPSBOVUxMOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQlpZiAoayA9PSBkZXZpY2Vfbm8pIHsKKwkJCWRldmljZSA9IGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQlicmVhazsKKwkJfQorCisJCWsrKzsKKwl9CisKKwlpZiAocG9zID09ICZtZV9kZXZpY2VfbGlzdCkgeworCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwkJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCQlQRVJST1IoIlJlc291cmNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19MT0NLRUQ7CisJCX0gZWxzZSB7CisJCQltZV9jb3VudCsrOworCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCisJCQllcnIgPQorCQkJICAgIGRldmljZS0+bWVfZGV2aWNlX2NvbmZpZ19sb2FkKGRldmljZSwgZmlsZXAsIGthcmcpOworCisJCQlzcGluX2xvY2soJm1lX2xvY2spOworCQkJbWVfY291bnQtLTsKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfY29uZmlnX2xvYWQoc3RydWN0IGZpbGUgKmZpbGVwLCBtZV9jb25maWdfbG9hZF90ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGk7CisJbWVfY29uZmlnX2xvYWRfdCBjZmdfc2V0dXA7CisJbWVfY29uZmlnX2xvYWRfdCBrYXJnX2NmZ19zZXR1cDsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IE5VTEw7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ld19saXN0OworCW1lX2RldmljZV90ICpvX2RldmljZTsKKwltZV9kZXZpY2VfdCAqbl9kZXZpY2U7CisJaW50IG9fdmVuZG9yX2lkOworCWludCBvX2RldmljZV9pZDsKKwlpbnQgb19zZXJpYWxfbm87CisJaW50IG9fYnVzX3R5cGU7CisJaW50IG9fYnVzX25vOworCWludCBvX2Rldl9ubzsKKwlpbnQgb19mdW5jX25vOworCWludCBvX3BsdWdnZWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDb3B5IGFyZ3VtZW50IHRvIGtlcm5lbCBzcGFjZS4KKwllcnIgPSBjb3B5X2Zyb21fdXNlcigma2FyZ19jZmdfc2V0dXAsIGFyZywgc2l6ZW9mKG1lX2NvbmZpZ19sb2FkX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8vIEFsbG9jYXRlIGtlcm5lbCBidWZmZXIgZm9yIGRldmljZSBsaXN0LgorCWNmZ19zZXR1cC5kZXZpY2VfbGlzdCA9CisJICAgIGttYWxsb2Moc2l6ZW9mKG1lX2NmZ19kZXZpY2VfZW50cnlfdCkgKiBrYXJnX2NmZ19zZXR1cC5jb3VudCwKKwkJICAgIEdGUF9LRVJORUwpOworCisJaWYgKCFjZmdfc2V0dXAuZGV2aWNlX2xpc3QpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgYnVmZmVyICVsaSBmb3IgZGV2aWNlIGxpc3QuXG4iLAorCQkgICAgICAgc2l6ZW9mKG1lX2NmZ19kZXZpY2VfZW50cnlfdCkgKiBrYXJnX2NmZ19zZXR1cC5jb3VudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvLyBDb3B5IGRldmljZSBsaXN0IHRvIGtlcm5lbCBzcGFjZS4KKwllcnIgPQorCSAgICBjb3B5X2Zyb21fdXNlcihjZmdfc2V0dXAuZGV2aWNlX2xpc3QsIGthcmdfY2ZnX3NldHVwLmRldmljZV9saXN0LAorCQkJICAgc2l6ZW9mKG1lX2NmZ19kZXZpY2VfZW50cnlfdCkgKgorCQkJICAga2FyZ19jZmdfc2V0dXAuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgZGV2aWNlIGxpc3QgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWNmZ19zZXR1cC5jb3VudCA9IGthcmdfY2ZnX3NldHVwLmNvdW50OworCisJSU5JVF9MSVNUX0hFQUQoJm5ld19saXN0KTsKKworCWRvd25fd3JpdGUoJm1lX3J3c2VtKTsKKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwlpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQlQRVJST1IoIkRyaXZlciBTeXN0ZW0gaXMgbG9nZ2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQlrYXJnX2NmZ19zZXR1cC5lcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsKKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmdfY2ZnX3NldHVwLmNvdW50OyBpKyspIHsKKwkJCVBERUJVRygibWVfY29uZmlnX2xvYWQoKSBkZXZpY2U9JWQuXG4iLCBpKTsKKwkJCWlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0udGNwaXAuYWNjZXNzX3R5cGUgPT0KKwkJCSAgICBNRV9BQ0NFU1NfVFlQRV9MT0NBTCkgeworCQkJCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQkJb19kZXZpY2UgPQorCQkJCQkgICAgbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJCQkJb19kZXZpY2UtPgorCQkJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlCisJCQkJCSAgICAob19kZXZpY2UsICZvX3ZlbmRvcl9pZCwKKwkJCQkJICAgICAmb19kZXZpY2VfaWQsICZvX3NlcmlhbF9ubywKKwkJCQkJICAgICAmb19idXNfdHlwZSwgJm9fYnVzX25vLCAmb19kZXZfbm8sCisJCQkJCSAgICAgJm9fZnVuY19ubywgJm9fcGx1Z2dlZCk7CisKKwkJCQkJaWYgKGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkgICAgaHdfbG9jYXRpb24uYnVzX3R5cGUgPT0KKwkJCQkJICAgIE1FX0JVU19UWVBFX1BDSSkgeworCQkJCQkJaWYgKCgob192ZW5kb3JfaWQgPT0KKwkJCQkJCSAgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgIGluZm8udmVuZG9yX2lkKQorCQkJCQkJICAgICAmJiAob19kZXZpY2VfaWQgPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBkZXZpY2VfaWQpCisJCQkJCQkgICAgICYmIChvX3NlcmlhbF9ubyA9PQorCQkJCQkJCSBjZmdfc2V0dXAuCisJCQkJCQkJIGRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCQkJIHNlcmlhbF9ubykKKwkJCQkJCSAgICAgJiYgKG9fYnVzX3R5cGUgPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5idXNfdHlwZSkpCisJCQkJCQkgICAgfHwKKwkJCQkJCSAgICAoKG9fdmVuZG9yX2lkID09CisJCQkJCQkgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uCisJCQkJCQkgICAgICBpbmZvLnZlbmRvcl9pZCkKKwkJCQkJCSAgICAgJiYgKG9fZGV2aWNlX2lkID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgZGV2aWNlX2lkKQorCQkJCQkJICAgICAmJiAob19idXNfdHlwZSA9PQorCQkJCQkJCSBjZmdfc2V0dXAuCisJCQkJCQkJIGRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCQkJIGh3X2xvY2F0aW9uLmJ1c190eXBlKQorCQkJCQkJICAgICAmJiAob19idXNfbm8gPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5wY2kuYnVzX25vKQorCQkJCQkJICAgICAmJiAob19kZXZfbm8gPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5wY2kuCisJCQkJCQkJIGRldmljZV9ubykKKwkJCQkJCSAgICAgJiYgKG9fZnVuY19ubyA9PQorCQkJCQkJCSBjZmdfc2V0dXAuCisJCQkJCQkJIGRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCQkJIGh3X2xvY2F0aW9uLnBjaS4KKwkJCQkJCQkgZnVuY3Rpb25fbm8pKSkgeworCQkJCQkJCWxpc3RfbW92ZV90YWlsKHBvcywKKwkJCQkJCQkJICAgICAgICZuZXdfbGlzdCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKy8qCisJCQkJCWVsc2UgaWYgKGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLmJ1c190eXBlID09IE1FX0JVU19UWVBFX1VTQikKKwkJCQkJeworCQkJCQkJaWYgKCgob192ZW5kb3JfaWQgPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8udmVuZG9yX2lkKSAmJgorCQkJCQkJICAgICAgICAob19kZXZpY2VfaWQgPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uZGV2aWNlX2lkKSAmJgorCQkJCQkJICAgICAgICAob19zZXJpYWxfbm8gPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uc2VyaWFsX25vKSAmJgorCQkJCQkJICAgICAgICAob19idXNfdHlwZSA9PSBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSkpIHx8CisJCQkJCQkgICAgICAgICgob192ZW5kb3JfaWQgPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8udmVuZG9yX2lkKSAmJgorCQkJCQkJICAgICAgICAgKG9fZGV2aWNlX2lkID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmRldmljZV9pZCkgJiYKKwkJCQkJCSAgICAgICAgIChvX2J1c190eXBlID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLmJ1c190eXBlKSAmJgorCQkJCQkJICAgICAgICAgKG9fYnVzX25vID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLnVzYi5yb290X2h1Yl9ubykpKQorCQkJCQkJeworCQkJCQkJCWxpc3RfbW92ZV90YWlsKHBvcywgJm5ld19saXN0KTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorKi8KKwkJCQkJZWxzZSB7CisJCQkJCQlQRVJST1IoIldyb25nIGJ1cyB0eXBlOiAlZC5cbiIsCisJCQkJCQkgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICAgIGluZm8uaHdfbG9jYXRpb24uCisJCQkJCQkgICAgICAgYnVzX3R5cGUpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsJLy8gRGV2aWNlIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0CisJCQkJCWlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJICAgIGh3X2xvY2F0aW9uLmJ1c190eXBlID09CisJCQkJCSAgICBNRV9CVVNfVFlQRV9QQ0kpIHsKKwkJCQkJCW5fZGV2aWNlID0KKwkJCQkJCSAgICBnZXRfZHVtbXlfaW5zdGFuY2UKKwkJCQkJCSAgICAoY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLnZlbmRvcl9pZCwKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLmRldmljZV9pZCwKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLnNlcmlhbF9ubywKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLmh3X2xvY2F0aW9uLmJ1c190eXBlLAorCQkJCQkJICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uCisJCQkJCQkgICAgIGluZm8uaHdfbG9jYXRpb24ucGNpLgorCQkJCQkJICAgICBidXNfbm8sCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5od19sb2NhdGlvbi5wY2kuCisJCQkJCQkgICAgIGRldmljZV9ubywKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLmh3X2xvY2F0aW9uLnBjaS4KKwkJCQkJCSAgICAgZnVuY3Rpb25fbm8pOworCisJCQkJCQlpZiAoIW5fZGV2aWNlKSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiQ2FuJ3QgZ2V0IGR1bW15IGluc3RhbmNlLlxuIik7CisJCQkJCQkJa2ZyZWUoY2ZnX3NldHVwLgorCQkJCQkJCSAgICAgIGRldmljZV9saXN0KTsKKwkJCQkJCQlzcGluX2xvY2soJm1lX2xvY2spOworCQkJCQkJCW1lX2NvdW50LS07CisJCQkJCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQkJCQkJCXVwX3dyaXRlKCZtZV9yd3NlbSk7CisJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCQl9CisKKwkJCQkJCWxpc3RfYWRkX3RhaWwoJm5fZGV2aWNlLT5saXN0LAorCQkJCQkJCSAgICAgICZuZXdfbGlzdCk7CisJCQkJCX0KKy8qCisJCQkJCWVsc2UgaWYgKGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLmJ1c190eXBlID09IE1FX0JVU19UWVBFX1VTQikKKwkJCQkJeworCQkJCQkJbl9kZXZpY2UgPSBnZXRfZHVtbXlfaW5zdGFuY2UoCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby52ZW5kb3JfaWQsCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5kZXZpY2VfaWQsCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5zZXJpYWxfbm8sCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSwKKwkJCQkJCSAgICAgICAgICAgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLnVzYi5yb290X2h1Yl9ubywKKwkJCQkJCSAgICAgICAgICAgICAgIDAsCisJCQkJCQkgICAgICAgICAgICAgICAwKTsKKworCQkJCQkJaWYgKCFuX2RldmljZSkKKwkJCQkJCXsKKwkJCQkJCQlQRVJST1IoIkNhbid0IGdldCBkdW1teSBpbnN0YW5jZS5cbiIpOworCQkJCQkJCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJCQkJCQkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKwkJCQkJCQltZV9jb3VudC0tOworCQkJCQkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJCQkJCQl1cF93cml0ZSgmbWVfcndzZW0pOworCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJfQorCisJCQkJCQlsaXN0X2FkZF90YWlsKCZuX2RldmljZS0+bGlzdCwgJm5ld19saXN0KTsKKwkJCQkJfQorKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5fZGV2aWNlID0gZ2V0X2R1bW15X2luc3RhbmNlKDAsCisJCQkJCQkJICAgICAgMCwgMCwgMCwgMCwgMCwgMCk7CisKKwkJCQlpZiAoIW5fZGV2aWNlKSB7CisJCQkJCVBFUlJPUigiQ2FuJ3QgZ2V0IGR1bW15IGluc3RhbmNlLlxuIik7CisJCQkJCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJCQkJCXNwaW5fbG9jaygmbWVfbG9jayk7CisJCQkJCW1lX2NvdW50LS07CisJCQkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJCQkJdXBfd3JpdGUoJm1lX3J3c2VtKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCisJCQkJbGlzdF9hZGRfdGFpbCgmbl9kZXZpY2UtPmxpc3QsICZuZXdfbGlzdCk7CisJCQl9CisJCX0KKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJm1lX2RldmljZV9saXN0KSkgeworCQkJb19kZXZpY2UgPQorCQkJICAgIGxpc3RfZW50cnkobWVfZGV2aWNlX2xpc3QubmV4dCwgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJb19kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZShvX2RldmljZSwKKwkJCQkJCQkgICAgICAmb192ZW5kb3JfaWQsCisJCQkJCQkJICAgICAgJm9fZGV2aWNlX2lkLAorCQkJCQkJCSAgICAgICZvX3NlcmlhbF9ubywKKwkJCQkJCQkgICAgICAmb19idXNfdHlwZSwKKwkJCQkJCQkgICAgICAmb19idXNfbm8sCisJCQkJCQkJICAgICAgJm9fZGV2X25vLAorCQkJCQkJCSAgICAgICZvX2Z1bmNfbm8sCisJCQkJCQkJICAgICAgJm9fcGx1Z2dlZCk7CisKKwkJCWlmIChvX3BsdWdnZWQgPT0gTUVfUExVR0dFRF9JTikgeworCQkJCWxpc3RfbW92ZV90YWlsKG1lX2RldmljZV9saXN0Lm5leHQsICZuZXdfbGlzdCk7CisJCQl9IGVsc2UgeworCQkJCWxpc3RfZGVsKG1lX2RldmljZV9saXN0Lm5leHQpOworCQkJCXJlbGVhc2VfaW5zdGFuY2Uob19kZXZpY2UpOworCQkJfQorCQl9CisKKwkJLy8gTW92ZSB0ZW1wb3JhcnkgbmV3IGxpc3QgdG8gZ2xvYmFsIGRyaXZlciBsaXN0LgorCQlsaXN0X3NwbGljZSgmbmV3X2xpc3QsICZtZV9kZXZpY2VfbGlzdCk7CisKKwkJa2FyZ19jZmdfc2V0dXAuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjZmdfc2V0dXAuY291bnQ7IGkrKykgeworCisJCWthcmdfY2ZnX3NldHVwLmVycm5vID0KKwkJICAgIG1lX2NvbmZpZ19sb2FkX2RldmljZShmaWxlcCwgJmNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXSwgaSk7CisJCWlmIChrYXJnX2NmZ19zZXR1cC5lcnJubykgeworCQkJUEVSUk9SKCJtZV9jb25maWdfbG9hZF9kZXZpY2UoJWQpPSVkXG4iLCBpLAorCQkJICAgICAgIGthcmdfY2ZnX3NldHVwLmVycm5vKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCW1lX2NvdW50LS07CisJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCXVwX3dyaXRlKCZtZV9yd3NlbSk7CisKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZ19jZmdfc2V0dXAsIHNpemVvZihtZV9jb25maWdfbG9hZF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBjb25maWcgbGlzdCB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVfaW9fc3RyZWFtX3N0YXJ0KHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfaW9fc3RyZWFtX3N0YXJ0X3QgKiBhcmcpCit7CisJaW50IGVycjsKKwlpbnQgaSwgazsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCW1lX2lvX3N0cmVhbV9zdGFydF90IGthcmc7CisJbWVJT1N0cmVhbVN0YXJ0X3QgKmxpc3Q7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwllcnIgPSBjb3B5X2Zyb21fdXNlcigma2FyZywgYXJnLCBzaXplb2YobWVfaW9fc3RyZWFtX3N0YXJ0X3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlsaXN0ID0ga21hbGxvYyhzaXplb2YobWVJT1N0cmVhbVN0YXJ0X3QpICoga2FyZy5jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWxpc3QpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgYnVmZmVyIGZvciBzdGFydCBsaXN0LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVyciA9CisJICAgIGNvcHlfZnJvbV91c2VyKGxpc3QsIGthcmcuc3RhcnRfbGlzdCwKKwkJCSAgIHNpemVvZihtZUlPU3RyZWFtU3RhcnRfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHN0YXJ0IGxpc3QgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJUEVSUk9SKCJEcml2ZXIgU3lzdGVtIGlzIGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwga2FyZy5jb3VudDsgaSsrKSB7CisJCQlsaXN0W2ldLmlFcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsKKwkJfQorCX0gZWxzZSB7CisJCW1lX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwga2FyZy5jb3VudDsgaSsrKSB7CisJCQlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKwkJCWsgPSAwOworCQkJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQkJCWlmIChrID09IGxpc3RbaV0uaURldmljZSkgeworCQkJCQlkZXZpY2UgPQorCQkJCQkgICAgbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaysrOworCQkJfQorCisJCQlpZiAocG9zID09ICZtZV9kZXZpY2VfbGlzdCkgeworCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQlsaXN0W2ldLmlFcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOworCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdFtpXS5pRXJybm8gPQorCQkJCSAgICBkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQoZGV2aWNlLAorCQkJCQkJCQkgICAgICBmaWxlcCwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVN1YmRldmljZSwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVN0YXJ0TW9kZSwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVRpbWVPdXQsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlGbGFncyk7CisKKwkJCQlpZiAobGlzdFtpXS5pRXJybm8pIHsKKwkJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCQlrYXJnLmVycm5vID0gbGlzdFtpXS5pRXJybm87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQl9CisKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCQltZV9jb3VudC0tOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJfQorCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9pb19zdHJlYW1fc3RhcnRfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVyciA9CisJICAgIGNvcHlfdG9fdXNlcihrYXJnLnN0YXJ0X2xpc3QsIGxpc3QsCisJCQkgc2l6ZW9mKG1lSU9TdHJlYW1TdGFydF90KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgc3RhcnQgbGlzdCB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShsaXN0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfaW9fc2luZ2xlKHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfaW9fc2luZ2xlX3QgKiBhcmcpCit7CisJaW50IGVycjsKKwlpbnQgaSwgazsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCW1lX2lvX3NpbmdsZV90IGthcmc7CisJbWVJT1NpbmdsZV90ICpsaXN0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKG1lX2lvX3NpbmdsZV90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKG1lSU9TaW5nbGVfdCkgKiBrYXJnLmNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghbGlzdCkgeworCQlQRVJST1IoIkNhbid0IGdldCBidWZmZXIgZm9yIHNpbmdsZSBsaXN0LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVyciA9CisJICAgIGNvcHlfZnJvbV91c2VyKGxpc3QsIGthcmcuc2luZ2xlX2xpc3QsCisJCQkgICBzaXplb2YobWVJT1NpbmdsZV90KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgc2luZ2xlIGxpc3QgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJUEVSUk9SKCJEcml2ZXIgU3lzdGVtIGlzIGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwga2FyZy5jb3VudDsgaSsrKSB7CisJCQlsaXN0W2ldLmlFcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsKKwkJfQorCX0gZWxzZSB7CisJCW1lX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwga2FyZy5jb3VudDsgaSsrKSB7CisJCQlrID0gMDsKKworCQkJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQlpZiAoayA9PSBsaXN0W2ldLmlEZXZpY2UpIHsKKwkJCQkJZGV2aWNlID0KKwkJCQkJICAgIGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWsrKzsKKwkJCX0KKworCQkJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWlmIChsaXN0W2ldLmlEaXIgPT0gTUVfRElSX09VVFBVVCkgeworCQkJCQlsaXN0W2ldLmlFcnJubyA9CisJCQkJCSAgICBkZXZpY2UtPgorCQkJCQkgICAgbWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZShkZXZpY2UsCisJCQkJCQkJCSAgICAgIGZpbGVwLAorCQkJCQkJCQkgICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgICBpU3ViZGV2aWNlLAorCQkJCQkJCQkgICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgICBpQ2hhbm5lbCwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVZhbHVlLAorCQkJCQkJCQkgICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgICBpVGltZU91dCwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaUZsYWdzKTsKKworCQkJCQlpZiAobGlzdFtpXS5pRXJybm8pIHsKKwkJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJCWthcmcuZXJybm8gPSBsaXN0W2ldLmlFcnJubzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChsaXN0W2ldLmlEaXIgPT0gTUVfRElSX0lOUFVUKSB7CisJCQkJCWxpc3RbaV0uaUVycm5vID0KKwkJCQkJICAgIGRldmljZS0+CisJCQkJCSAgICBtZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQoZGV2aWNlLAorCQkJCQkJCQkgICAgIGZpbGVwLAorCQkJCQkJCQkgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgaVN1YmRldmljZSwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlDaGFubmVsLAorCQkJCQkJCQkgICAgICZsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlWYWx1ZSwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlUaW1lT3V0LAorCQkJCQkJCQkgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgaUZsYWdzKTsKKworCQkJCQlpZiAobGlzdFtpXS5pRXJybm8pIHsKKwkJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJCWthcmcuZXJybm8gPSBsaXN0W2ldLmlFcnJubzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBzaW5nbGUgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCQlsaXN0W2ldLmlFcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfRElSOworCQkJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ESVI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQl9CisKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCQltZV9jb3VudC0tOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJfQorCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9pb19zaW5nbGVfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZXJyID0KKwkgICAgY29weV90b191c2VyKGthcmcuc2luZ2xlX2xpc3QsIGxpc3QsCisJCQkgc2l6ZW9mKG1lSU9TaW5nbGVfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHNpbmdsZSBsaXN0IHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGxpc3QpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9pb19zdHJlYW1fY29uZmlnKHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfaW9fc3RyZWFtX2NvbmZpZ190ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGsgPSAwOworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCW1lX2RldmljZV90ICpkZXZpY2U7CisJbWVfaW9fc3RyZWFtX2NvbmZpZ190IGthcmc7CisJbWVJT1N0cmVhbUNvbmZpZ190ICpsaXN0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKG1lX2lvX3N0cmVhbV9jb25maWdfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlsaXN0ID0ga21hbGxvYyhzaXplb2YobWVJT1N0cmVhbUNvbmZpZ190KSAqIGthcmcuY291bnQsIEdGUF9LRVJORUwpOworCisJaWYgKCFsaXN0KSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IGJ1ZmZlciBmb3IgY29uZmlnIGxpc3QuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXJyID0KKwkgICAgY29weV9mcm9tX3VzZXIobGlzdCwga2FyZy5jb25maWdfbGlzdCwKKwkJCSAgIHNpemVvZihtZUlPU3RyZWFtQ29uZmlnX3QpICoga2FyZy5jb3VudCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBjb25maWcgbGlzdCB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwlpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQlQRVJST1IoIkRyaXZlciBTeXN0ZW0gaXMgbG9nZ2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fTE9DS0VEOworCX0gZWxzZSB7CisJCW1lX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCQlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKworCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCQlpZiAoayA9PSBrYXJnLmRldmljZSkgeworCQkJCWRldmljZSA9IGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWsrKzsKKwkJfQorCisJCWlmIChwb3MgPT0gJm1lX2RldmljZV9saXN0KSB7CisJCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJfSBlbHNlIHsKKwkJCWthcmcuZXJybm8gPQorCQkJICAgIGRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9jb25maWcoZGV2aWNlLCBmaWxlcCwKKwkJCQkJCQkgICAgICAga2FyZy5zdWJkZXZpY2UsCisJCQkJCQkJICAgICAgIGxpc3QsIGthcmcuY291bnQsCisJCQkJCQkJICAgICAgICZrYXJnLnRyaWdnZXIsCisJCQkJCQkJICAgICAgIGthcmcuCisJCQkJCQkJICAgICAgIGZpZm9faXJxX3RocmVzaG9sZCwKKwkJCQkJCQkgICAgICAga2FyZy5mbGFncyk7CisJCX0KKworCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKwkJbWVfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCX0KKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YobWVfaW9fc3RyZWFtX2NvbmZpZ190KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBiYWNrIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGxpc3QpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9xdWVyeV9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgbWVfcXVlcnlfbnVtYmVyX2RldmljZXNfdCAqIGFyZykKK3sKKwlpbnQgZXJyOworCW1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3Qga2FyZzsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWthcmcubnVtYmVyID0gMDsKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCWthcmcubnVtYmVyKys7CisJfQorCisJdXBfcmVhZCgmbWVfcndzZW0pOworCisJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHF1ZXJ5IGJhY2sgdG8gdXNlciBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZV9pb19zdHJlYW1fc3RvcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIG1lX2lvX3N0cmVhbV9zdG9wX3QgKiBhcmcpCit7CisJaW50IGVycjsKKwlpbnQgaSwgazsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCW1lX2lvX3N0cmVhbV9zdG9wX3Qga2FyZzsKKwltZUlPU3RyZWFtU3RvcF90ICpsaXN0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKG1lX2lvX3N0cmVhbV9zdG9wX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlsaXN0ID0ga21hbGxvYyhzaXplb2YobWVJT1N0cmVhbVN0b3BfdCkgKiBrYXJnLmNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghbGlzdCkgeworCQlQRVJST1IoIkNhbid0IGdldCBidWZmZXIgZm9yIHN0b3AgbGlzdC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X2Zyb21fdXNlcihsaXN0LCBrYXJnLnN0b3BfbGlzdCwKKwkJCSAgIHNpemVvZihtZUlPU3RyZWFtU3RvcF90KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgc3RvcCBsaXN0IHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCVBFUlJPUigiRHJpdmVyIFN5c3RlbSBpcyBsb2dnZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0KKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJayA9IDA7CisJCQlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQlpZiAoayA9PSBsaXN0W2ldLmlEZXZpY2UpIHsKKwkJCQkJZGV2aWNlID0KKwkJCQkJICAgIGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWsrKzsKKwkJCX0KKworCQkJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWxpc3RbaV0uaUVycm5vID0KKwkJCQkgICAgZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0b3AoZGV2aWNlLAorCQkJCQkJCQkgICAgIGZpbGVwLAorCQkJCQkJCQkgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgaVN1YmRldmljZSwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlTdG9wTW9kZSwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlGbGFncyk7CisKKwkJCQlpZiAobGlzdFtpXS5pRXJybm8pIHsKKwkJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCQlrYXJnLmVycm5vID0gbGlzdFtpXS5pRXJybm87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQl9CisKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCQltZV9jb3VudC0tOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJfQorCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9pb19zdHJlYW1fc3RvcF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8gdXNlciBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X3RvX3VzZXIoa2FyZy5zdG9wX2xpc3QsIGxpc3QsCisJCQkgc2l6ZW9mKG1lSU9TdHJlYW1TdG9wX3QpICoga2FyZy5jb3VudCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBzdG9wIGxpc3QgdG8gdXNlciBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUobGlzdCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiAgLy9tZV9wcm9iZV91c2IKK3N0YXRpYyBpbnQgbWVfcHJvYmVfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwkvL2ludCBlcnI7CisJLy9tZV91c2JfY29uc3RydWN0b3JfdCAqY29uc3RydWN0b3IgPSBOVUxMOworCW1lX2RldmljZV90ICpuX2RldmljZSA9IE5VTEw7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzd2l0Y2ggKGlkLT5pZFByb2R1Y3QpCisJeworCQkJY2FzZSBVU0JfREVWSUNFX0lEX01FUEhJU1RPX1MxOgorCQkJCWlmKChjb25zdHJ1Y3RvciA9IHN5bWJvbF9nZXQobWVwaGlzdG9fczFfY29uc3RydWN0b3IpKSA9PSBOVUxMKXsKKwkJCQkJZXJyID0gcmVxdWVzdF9tb2R1bGUoTUVQSElTVE9fUzFfTkFNRSk7CisJCQkJCWlmKGVycil7CisJCQkJCQlQRVJST1IoIkVycm9yIHdoaWxlIHJlcXVlc3QgZm9yIG1vZHVsZSAlcy5cbiIsIE1FUEhJU1RPX1MxX05BTUUpOworCQkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJCX0KKwkJCQkJaWYoKGNvbnN0cnVjdG9yID0gc3ltYm9sX2dldChtZXBoaXN0b19zMV9jb25zdHJ1Y3RvcikpID09IE5VTEwpeworCQkJCQkJUEVSUk9SKCJDYW4ndCBnZXQgJXMgZHJpdmVyIG1vZHVsZSBjb25zdHJ1Y3Rvci5cbiIsIE1FUEhJU1RPX1MxX05BTUUpOworCQkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZigobl9kZXZpY2UgPSAoKmNvbnN0cnVjdG9yKShpbnRlcmZhY2UpKSA9PSBOVUxMKXsKKwkJCQkJc3ltYm9sX3B1dChtZXBoaXN0b19zMV9jb25zdHJ1Y3Rvcik7CisJCQkJCVBFUlJPUigiQ2FuJ3QgZ2V0IGRldmljZSBpbnN0YW5jZSBvZiAlcyBkcml2ZXIgbW9kdWxlLlxuIiwgTUVQSElTVE9fUzFfTkFNRSk7CisJCQkJCXJldHVybiAtRU5PREVWOworCQkJCX0KKworCQkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IoIkludmFsaWQgcHJvZHVjdCBpZC5cbiIpOworCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaW5zZXJ0X3RvX2RldmljZV9saXN0KG5fZGV2aWNlKTsKK30KKyovCisKKy8qICAvL21lX2Rpc2Nvbm5lY3RfdXNiCitzdGF0aWMgdm9pZCBtZV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKwlpbnQgdmVuZG9yX2lkID0gZGV2aWNlLT5kZXNjcmlwdG9yLmlkVmVuZG9yOworCWludCBkZXZpY2VfaWQgPSBkZXZpY2UtPmRlc2NyaXB0b3IuaWRQcm9kdWN0OworCWludCBzZXJpYWxfbm87CisKKwlzc2NhbmYoJmRldmljZS0+c2VyaWFsWzJdLCAiJXgiLCAmc2VyaWFsX25vKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCVBJTkZPKCJWZW5kb3IgaWQgPSAweCUwOFhcbiIsIHZlbmRvcl9pZCk7CisJUElORk8oIkRldmljZSBpZCA9IDB4JTA4WFxuIiwgZGV2aWNlX2lkKTsKKwlQSU5GTygiU2VyaWFsIE51bWJlciA9IDB4JTA4WFxuIiwgc2VyaWFsX25vKTsKKworCXJlcGxhY2Vfd2l0aF9kdW1teSh2ZW5kb3JfaWQsIGRldmljZV9pZCwgc2VyaWFsX25vKTsKK30KKyovCisKK3N0YXRpYyBpbnQgbWVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZXAsCisJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBzZXJ2aWNlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChfSU9DX1RZUEUoc2VydmljZSkgIT0gTUVNQUlOX01BR0lDKSB7CisJCVBFUlJPUigiSW52YWxpZCBtYWdpYyBudW1iZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCisJUERFQlVHKCJzZXJ2aWNlIG51bWJlcjogMHgleC5cbiIsIHNlcnZpY2UpOworCisJc3dpdGNoIChzZXJ2aWNlKSB7CisJY2FzZSBNRV9JT19JUlFfRU5BQkxFOgorCQlyZXR1cm4gbWVfaW9faXJxX3N0YXJ0KGZpbGVwLCAobWVfaW9faXJxX3N0YXJ0X3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fSVJRX1dBSVQ6CisJCXJldHVybiBtZV9pb19pcnFfd2FpdChmaWxlcCwgKG1lX2lvX2lycV93YWl0X3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fSVJRX0RJU0FCTEU6CisJCXJldHVybiBtZV9pb19pcnFfc3RvcChmaWxlcCwgKG1lX2lvX2lycV9zdG9wX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fUkVTRVRfREVWSUNFOgorCQlyZXR1cm4gbWVfaW9fcmVzZXRfZGV2aWNlKGZpbGVwLCAobWVfaW9fcmVzZXRfZGV2aWNlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fUkVTRVRfU1VCREVWSUNFOgorCQlyZXR1cm4gbWVfaW9fcmVzZXRfc3ViZGV2aWNlKGZpbGVwLAorCQkJCQkgICAgIChtZV9pb19yZXNldF9zdWJkZXZpY2VfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHOgorCQlyZXR1cm4gbWVfaW9fc2luZ2xlX2NvbmZpZyhmaWxlcCwKKwkJCQkJICAgKG1lX2lvX3NpbmdsZV9jb25maWdfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TSU5HTEU6CisJCXJldHVybiBtZV9pb19zaW5nbGUoZmlsZXAsIChtZV9pb19zaW5nbGVfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fQ09ORklHOgorCQlyZXR1cm4gbWVfaW9fc3RyZWFtX2NvbmZpZyhmaWxlcCwKKwkJCQkJICAgKG1lX2lvX3N0cmVhbV9jb25maWdfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fTkVXX1ZBTFVFUzoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzKGZpbGVwLAorCQkJCQkgICAgICAgKG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzX3QgKikKKwkJCQkJICAgICAgIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9SRUFEOgorCQlyZXR1cm4gbWVfaW9fc3RyZWFtX3JlYWQoZmlsZXAsIChtZV9pb19zdHJlYW1fcmVhZF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9TVEFSVDoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9zdGFydChmaWxlcCwgKG1lX2lvX3N0cmVhbV9zdGFydF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9TVEFUVVM6CisJCXJldHVybiBtZV9pb19zdHJlYW1fc3RhdHVzKGZpbGVwLAorCQkJCQkgICAobWVfaW9fc3RyZWFtX3N0YXR1c190ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9TVE9QOgorCQlyZXR1cm4gbWVfaW9fc3RyZWFtX3N0b3AoZmlsZXAsIChtZV9pb19zdHJlYW1fc3RvcF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9XUklURToKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV93cml0ZShmaWxlcCwgKG1lX2lvX3N0cmVhbV93cml0ZV90ICopIGFyZyk7CisKKwljYXNlIE1FX0xPQ0tfRFJJVkVSOgorCQlyZXR1cm4gbWVfbG9ja19kcml2ZXIoZmlsZXAsIChtZV9sb2NrX2RyaXZlcl90ICopIGFyZyk7CisKKwljYXNlIE1FX0xPQ0tfREVWSUNFOgorCQlyZXR1cm4gbWVfbG9ja19kZXZpY2UoZmlsZXAsIChtZV9sb2NrX2RldmljZV90ICopIGFyZyk7CisKKwljYXNlIE1FX0xPQ0tfU1VCREVWSUNFOgorCQlyZXR1cm4gbWVfbG9ja19zdWJkZXZpY2UoZmlsZXAsIChtZV9sb2NrX3N1YmRldmljZV90ICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX0lORk9fREVWSUNFOgorCQlyZXR1cm4gbWVfcXVlcnlfaW5mb19kZXZpY2UoZmlsZXAsCisJCQkJCSAgICAobWVfcXVlcnlfaW5mb19kZXZpY2VfdCAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9ERVNDUklQVElPTl9ERVZJQ0U6CisJCXJldHVybiBtZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UoZmlsZXAsCisJCQkJCQkgICAobWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlX3QKKwkJCQkJCSAgICAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9OQU1FX0RFVklDRToKKwkJcmV0dXJuIG1lX3F1ZXJ5X25hbWVfZGV2aWNlKGZpbGVwLAorCQkJCQkgICAgKG1lX3F1ZXJ5X25hbWVfZGV2aWNlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTkFNRV9ERVZJQ0VfRFJJVkVSOgorCQlyZXR1cm4gbWVfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyKGZpbGVwLAorCQkJCQkJICAgKG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcl90CisJCQkJCQkgICAgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTlVNQkVSX0RFVklDRVM6CisJCXJldHVybiBtZV9xdWVyeV9udW1iZXJfZGV2aWNlcyhmaWxlcCwKKwkJCQkJICAgICAgIChtZV9xdWVyeV9udW1iZXJfZGV2aWNlc190ICopCisJCQkJCSAgICAgICBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9OVU1CRVJfU1VCREVWSUNFUzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKGZpbGVwLAorCQkJCQkJICAobWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXNfdAorCQkJCQkJICAgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTlVNQkVSX0NIQU5ORUxTOgorCQlyZXR1cm4gbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKGZpbGVwLAorCQkJCQkJKG1lX3F1ZXJ5X251bWJlcl9jaGFubmVsc190ICopCisJCQkJCQlhcmcpOworCisJY2FzZSBNRV9RVUVSWV9OVU1CRVJfUkFOR0VTOgorCQlyZXR1cm4gbWVfcXVlcnlfbnVtYmVyX3JhbmdlcyhmaWxlcCwKKwkJCQkJICAgICAgKG1lX3F1ZXJ5X251bWJlcl9yYW5nZXNfdCAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9SQU5HRV9CWV9NSU5fTUFYOgorCQlyZXR1cm4gbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heChmaWxlcCwKKwkJCQkJCSAobWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heF90ICopCisJCQkJCQkgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfUkFOR0VfSU5GTzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3JhbmdlX2luZm8oZmlsZXAsCisJCQkJCSAgIChtZV9xdWVyeV9yYW5nZV9pbmZvX3QgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfU1VCREVWSUNFX0JZX1RZUEU6CisJCXJldHVybiBtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZShmaWxlcCwKKwkJCQkJCSAgKG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlX3QKKwkJCQkJCSAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1NVQkRFVklDRV9UWVBFOgorCQlyZXR1cm4gbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGUoZmlsZXAsCisJCQkJCSAgICAgICAobWVfcXVlcnlfc3ViZGV2aWNlX3R5cGVfdCAqKQorCQkJCQkgICAgICAgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfU1VCREVWSUNFX0NBUFM6CisJCXJldHVybiBtZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhmaWxlcCwKKwkJCQkJICAgICAgIChtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc190ICopCisJCQkJCSAgICAgICBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9TVUJERVZJQ0VfQ0FQU19BUkdTOgorCQlyZXR1cm4gbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhmaWxlcCwKKwkJCQkJCSAgICAobWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnc190CisJCQkJCQkgICAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1RJTUVSOgorCQlyZXR1cm4gbWVfcXVlcnlfdGltZXIoZmlsZXAsIChtZV9xdWVyeV90aW1lcl90ICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1ZFUlNJT05fTUFJTl9EUklWRVI6CisJCXJldHVybiBtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyKGZpbGVwLAorCQkJCQkJICAgIChtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3QKKwkJCQkJCSAgICAgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfVkVSU0lPTl9ERVZJQ0VfRFJJVkVSOgorCQlyZXR1cm4gbWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyKGZpbGVwLAorCQkJCQkJICAgICAgKG1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcl90CisJCQkJCQkgICAgICAgKikgYXJnKTsKKworCWNhc2UgTUVfQ09ORklHX0xPQUQ6CisJCXJldHVybiBtZV9jb25maWdfbG9hZChmaWxlcCwgKG1lX2NvbmZpZ19sb2FkX3QgKikgYXJnKTsKKwl9CisKKwlQRVJST1IoIkludmFsaWQgaW9jdGwgbnVtYmVyLlxuIik7CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorc3RhdGljIGludCBtZW1haW5faW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCWRldl90IGRldiA9IE1LREVWKG1ham9yLCAwKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIFJlZ2lzdGVyIHBjaSBkcml2ZXIuIFRoaXMgd2lsbCByZXR1cm4gMCBpZiB0aGUgUENJIHN1YnN5c3RlbSBpcyBub3QgYXZhaWxhYmxlLgorCXJlc3VsdCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1lX3BjaV9kcml2ZXIpOworCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJUEVSUk9SKCJDYW4ndCByZWdpc3RlciBwY2kgZHJpdmVyLlxuIik7CisJCWdvdG8gSU5JVF9FUlJPUl8xOworCX0KKworLyoKKwkvLyBSZWdpc3RlciB1c2IgZHJpdmVyLiBUaGlzIHdpbGwgcmV0dXJuIC1FTk9ERVYgaWYgbm8gVVNCIHN1YnN5c3RlbSBpcyBhdmFpbGFibGUuCisJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZtZV91c2JfZHJpdmVyKTsKKworCWlmIChyZXN1bHQpCisJeworCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCXsKKwkJCVBFUlJPUigiTm8gVVNCIHN1YnN5c3RlbSBhdmFpbGFibGUuXG4iKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVBFUlJPUigiQ2FuJ3QgcmVnaXN0ZXIgdXNiIGRyaXZlci5cbiIpOworCQkJZ290byBJTklUX0VSUk9SXzI7CisJCX0KKwl9CisqLworCS8vIFJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlLgorCWlmIChtYWpvcikgeworCQlyZXN1bHQgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgMSwgTUVNQUlOX05BTUUpOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldiwgMCwgMSwgTUVNQUlOX05BTUUpOworCQltYWpvciA9IE1BSk9SKGRldik7CisJfQorCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgbWFqb3IgZHJpdmVyIG5vLlxuIik7CisJCWdvdG8gSU5JVF9FUlJPUl8zOworCX0KKworCWNkZXZwID0gY2Rldl9hbGxvYygpOworCisJaWYgKCFjZGV2cCkgeworCQlQRVJST1IoIkNhbid0IGdldCBjaGFyYWN0ZXIgZGV2aWNlIHN0cnVjdHVyZS5cbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIElOSVRfRVJST1JfNDsKKwl9CisKKwljZGV2cC0+b3BzID0gJm1lX2ZpbGVfb3BlcmF0aW9uczsKKworCWNkZXZwLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmVzdWx0ID0gY2Rldl9hZGQoY2RldnAsIGRldiwgMSk7CisKKwlpZiAocmVzdWx0IDwgMCkgeworCQlQRVJST1IoIkNhbm5vdCBhZGQgY2hhcmFjdGVyIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKKwkJZ290byBJTklUX0VSUk9SXzU7CisJfQorCisJcmV0dXJuIDA7CisKKyAgICAgIElOSVRfRVJST1JfNToKKwljZGV2X2RlbChjZGV2cCk7CisKKyAgICAgIElOSVRfRVJST1JfNDoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAxKTsKKworICAgICAgSU5JVF9FUlJPUl8zOgorLy8gICAgICB1c2JfZGVyZWdpc3RlcigmbWVfdXNiX2RyaXZlcik7CisKKy8vSU5JVF9FUlJPUl8yOgorCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbWVfcGNpX2RyaXZlcik7CisJY2xlYXJfZGV2aWNlX2xpc3QoKTsKKworICAgICAgSU5JVF9FUlJPUl8xOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZW1haW5fZXhpdCh2b2lkKQoreworCWRldl90IGRldiA9IE1LREVWKG1ham9yLCAwKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWNkZXZfZGVsKGNkZXZwKTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAxKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1lX3BjaV9kcml2ZXIpOworLy8gICAgICB1c2JfZGVyZWdpc3RlcigmbWVfdXNiX2RyaXZlcik7CisJY2xlYXJfZGV2aWNlX2xpc3QoKTsKK30KKworbW9kdWxlX2luaXQobWVtYWluX2luaXQpOworbW9kdWxlX2V4aXQobWVtYWluX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ2VudHJhbCBtb2R1bGUgZm9yIE1laWxoYXVzIERyaXZlciBTeXN0ZW0uIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgUENJL2NQQ0kgYm9hcmRzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgQk9TQ0gKKy8vIEV4cG9ydCB0aGUgZmxhZyBmb3IgdGhlIEJPU0NIIGZpcm13YXJlLgorRVhQT1JUX1NZTUJPTChtZV9ib3NjaF9mdyk7CisjZW5kaWYgLy8gQk9TQ0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE2ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lbWFpbi5oCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1lbWFpbi5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVNQUlOX0hfCisjZGVmaW5lIF9NRU1BSU5fSF8KKworI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKy8qI2luY2x1ZGUgIm1lMTAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTE0MDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWUxNjAwX2RldmljZS5oIiovCisjaW5jbHVkZSAibWU0NjAwX2RldmljZS5oIgorLyojaW5jbHVkZSAibWU2MDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lMDYwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lMDkwMF9kZXZpY2UuaCIqLworI2luY2x1ZGUgIm1lZHVtbXkuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgZGV2aWNlIHRhYmxlLgorICBUaGlzIGlzIHVzZWQgYnkgbW9kcHJvYmUgdG8gdHJhbnNsYXRlIFBDSSBJRHMgdG8gZHJpdmVycy4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1lX3BjaV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0IsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEEsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUEsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBDLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzRVLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFUsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlUsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlUsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlVfOEksCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwOCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMUYsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzRiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwOCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMUYsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzRiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0OCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDRGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNUYsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNzgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3RiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0OCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNUYsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3RiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTksIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MzU5LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDYzMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0IsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0EsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9CLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWVfcGNpX3RhYmxlKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVU0IgZGV2aWNlIHRhYmxlLgorICBUaGlzIGlzIHVzZWQgYnkgbW9kcHJvYmUgdG8gdHJhbnNsYXRlIFVTQiBJRHMgdG8gZHJpdmVycy4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbWVfdXNiX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NRVBISVNUT19TMSwgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMSkgfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBtZV91c2JfdGFibGUpOworKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUZW1wbGF0ZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX01VTFRJUExFWF9URU1QTEFURShOQU1FLCBUWVBFLCBDQUxMLCBERVZfQ0FMTCwgQVJHUykJXAorc3RhdGljIGludCBDQUxMKHN0cnVjdCBmaWxlICpmaWxlcCwgVFlQRSAqYXJnKXsJXAorCWludCBlcnIgPSAwOyBcCisJaW50IGsgPSAwOyBcCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOyBcCisJbWVfZGV2aWNlX3QgKmRldmljZTsgXAorCVRZUEUga2FyZzsgXAorCVwKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7IFwKKwlcCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKFRZUEUpKTsgXAorCWlmKGVycil7IFwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2VcbiIpOyBcCisJCXJldHVybiAtRUZBVUxUOyBcCisJfSBcCisJXAorCWRvd25fcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpewlcCisJCWlmKGsgPT0ga2FyZy5kZXZpY2UpewlcCisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOwlcCisJCQkJYnJlYWs7CVwKKwkJfQlcCisJCWsrKzsJXAorCX0JXAorCVwKKwlpZihwb3MgPT0gJm1lX2RldmljZV9saXN0KXsgXAorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWRcbiIpOyBcCisJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsgXAorCX0gXAorCWVsc2V7IFwKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsJXAorCQlpZigobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSl7CVwKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsJXAorCQkJUEVSUk9SKCJSZXNvdXJjZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzXG4iKTsJXAorCQkJaWYoa2FyZy5sb2NrID09IE1FX0xPQ0tfU0VUKQlcCisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsJXAorCQkJZWxzZSBpZihrYXJnLmxvY2sgPT0gTUVfTE9DS19SRUxFQVNFKQlcCisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CVwKKwkJCWVsc2V7CVwKKwkJCQlQRVJST1IoIkludmFsaWQgbG9jayBzcGVjaWZpZWRcbiIpOwlcCisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfTE9DSzsJXAorCQkJfVwKKwkJfQlcCisJCWVsc2UgewlcCisJCQltZV9jb3VudCsrOwlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJCVwKKwkJCWthcmcuZXJybm8gPSBkZXZpY2UtPkRFVl9DQUxMIEFSR1M7CVwKKwkJCVwKKwkJCXNwaW5fbG9jaygmbWVfbG9jayk7CVwKKwkJCW1lX2NvdW50LS07CVwKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsJXAorCQl9CVwKKwl9IFwKKwlcCisJdXBfcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YoVFlQRSkpOyBcCisJaWYoZXJyKXsgXAorCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIGJhY2sgdG8gdXNlciBzcGFjZVxuIik7IFwKKwkJcmV0dXJuIC1FRkFVTFQ7IFwKKwl9IFwKKwlcCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7IFwKK30KKworI2RlZmluZSBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoTkFNRSwgVFlQRSwgQ0FMTCwgREVWX0NBTEwsIEFSR1MpCVwKK3N0YXRpYyBpbnQgQ0FMTChzdHJ1Y3QgZmlsZSAqZmlsZXAsIFRZUEUgKmFyZyl7CVwKKwlpbnQgZXJyID0gMDsgXAorCWludCBrID0gMDsgXAorCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsgXAorCW1lX2RldmljZV90ICpkZXZpY2U7IFwKKwlUWVBFIGthcmc7IFwKKwlcCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOyBcCisJXAorCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihUWVBFKSk7IFwKKwlpZihlcnIpeyBcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlXG4iKTsgXAorCQlyZXR1cm4gLUVGQVVMVDsgXAorCX0gXAorCVwKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KXsJXAorCQlpZihrID09IGthcmcuZGV2aWNlKXsJXAorCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsJXAorCQkJCWJyZWFrOwlcCisJCX0JXAorCQlrKys7CVwKKwl9CVwKKwlcCisJaWYocG9zID09ICZtZV9kZXZpY2VfbGlzdCl7IFwKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkXG4iKTsgXAorCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7IFwKKwl9IFwKKwllbHNleyBcCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CVwKKwkJaWYoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpewlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJCVBFUlJPUigiUmVzb3VyY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzc1xuIik7CVwKKwkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CVwKKwkJfQlcCisJCWVsc2UgewlcCisJCQltZV9jb3VudCsrOwlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJCVwKKwkJCWthcmcuZXJybm8gPSBkZXZpY2UtPkRFVl9DQUxMIEFSR1M7CVwKKwkJCVwKKwkJCXNwaW5fbG9jaygmbWVfbG9jayk7CVwKKwkJCW1lX2NvdW50LS07CVwKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsJXAorCQl9CVwKKwl9IFwKKwlcCisJdXBfcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YoVFlQRSkpOyBcCisJaWYoZXJyKXsgXAorCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIGJhY2sgdG8gdXNlciBzcGFjZVxuIik7IFwKKwkJcmV0dXJuIC1FRkFVTFQ7IFwKKwl9IFwKKyBcCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7IFwKK30KKworI2RlZmluZSBNRV9RVUVSWV9NVUxUSVBMRVhfU1RSX1RFTVBMQVRFKE5BTUUsIFRZUEUsIENBTEwsIERFVl9DQUxMLCBBUkdTKQlcCitzdGF0aWMgaW50IENBTEwoc3RydWN0IGZpbGUgKmZpbGVwLCBUWVBFICphcmcpewlcCisJaW50IGVyciA9IDA7CVwKKwlpbnQgayA9IDA7CVwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CVwKKwltZV9kZXZpY2VfdCAqZGV2aWNlOwlcCisJY2hhciAqbXNnID0gTlVMTDsJXAorCVRZUEUga2FyZzsJXAorCVwKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7IFwKKwlcCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKFRZUEUpKTsJXAorCWlmKGVycil7CVwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2VcbiIpOwlcCisJCXJldHVybiAtRUZBVUxUOwlcCisJfQlcCisJXAorCWRvd25fcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpewlcCisJCWlmKGsgPT0ga2FyZy5kZXZpY2UpewlcCisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOwlcCisJCQkJYnJlYWs7CVwKKwkJfQlcCisJCWsrKzsJXAorCX0JXAorCVwKKwlpZihwb3MgPT0gJm1lX2RldmljZV9saXN0KXsJXAorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWRcbiIpOwlcCisJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsJXAorCX0JXAorCWVsc2V7CVwKKwkJa2FyZy5lcnJubyA9IGRldmljZS0+REVWX0NBTEwgQVJHUzsJXAorCQlpZigha2FyZy5lcnJubyl7CVwKKwkJCWlmKChzdHJsZW4obXNnKSArIDEpID4ga2FyZy5jb3VudCl7CVwKKwkJCQlQRVJST1IoIlVzZXIgYnVmZmVyIGZvciBkZXZpY2UgbmFtZSBpcyB0byBsaXR0bGVcbiIpOwlcCisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1VTRVJfQlVGRkVSX1NJWkU7CVwKKwkJCX0JXAorCQkJZWxzZXsJXAorCQkJCWVyciA9IGNvcHlfdG9fdXNlcihrYXJnLm5hbWUsIG1zZywgc3RybGVuKG1zZykgKyAxKTsJXAorCQkJCWlmKGVycil7CVwKKwkJCQkJUEVSUk9SKCJDYW4ndCBjb3B5IGRldmljZSBuYW1lIHRvIHVzZXIgc3BhY2VcbiIpOwlcCisJCQkJCXJldHVybiAtRUZBVUxUOwlcCisJCQkJfQlcCisJCQl9CVwKKwkJfQlcCisJfQlcCisJXAorCXVwX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKFRZUEUpKTsJXAorCWlmKGVycil7CVwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHF1ZXJ5IGJhY2sgdG8gdXNlciBzcGFjZVxuIik7CVwKKwkJcmV0dXJuIC1FRkFVTFQ7CVwKKwl9CVwKKwlcCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7CVwKK30KKworI2RlZmluZSBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoTkFNRSwgVFlQRSwgQ0FMTCwgREVWX0NBTEwsIEFSR1MpCVwKK3N0YXRpYyBpbnQgQ0FMTChzdHJ1Y3QgZmlsZSAqZmlsZXAsIFRZUEUgKmFyZyl7CVwKKwlpbnQgZXJyID0gMDsJXAorCWludCBrID0gMDsJXAorCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsJXAorCW1lX2RldmljZV90ICpkZXZpY2U7CVwKKwlUWVBFIGthcmc7CVwKKwkJXAorCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsgXAorCSBcCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKFRZUEUpKTsJXAorCWlmKGVycil7CVwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyBmcm9tIHVzZXIgc3BhY2VcbiIpOwlcCisJCXJldHVybiAtRUZBVUxUOwlcCisJfQlcCisJXAorCWRvd25fcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpewlcCisJCWlmKGsgPT0ga2FyZy5kZXZpY2UpewlcCisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOwlcCisJCQlicmVhazsJXAorCQl9CVwKKwkJaysrOwlcCisJfQlcCisJCVwKKwlpZihwb3MgPT0gJm1lX2RldmljZV9saXN0KXsJXAorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWRcbiIpOwlcCisJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsJXAorCX0JXAorCWVsc2V7CVwKKwkJa2FyZy5lcnJubyA9IGRldmljZS0+REVWX0NBTEwgQVJHUzsJXAorCX0JXAorCVwKKwl1cF9yZWFkKCZtZV9yd3NlbSk7CVwKKwlcCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihUWVBFKSk7CVwKKwlpZihlcnIpewlcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8gdXNlciBzcGFjZVxuIik7CVwKKwkJcmV0dXJuIC1FRkFVTFQ7CVwKKwl9CVwKKwkJXAorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOwlcCit9CisKKyNlbmRpZiAvL19fS0VSTkVMX18KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lcGx4X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lcGx4X3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Njg2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVwbHhfcmVnLmgKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiBAZmlsZSBtZXBseF9yZWcuaAorICoKKyAqIEBicmllZiBQTFggOTA1MiBQQ0kgYnJpZGdlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FUExYX1JFR19IXworI2RlZmluZSBfTUVQTFhfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgUExYX0lOVENTUgkJCQkweDRDCQkvKio8IEludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTgkJMHgwMQkJLyoqPCBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAxIGlzIGVuYWJsZWQgKHIvdykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wJCTB4MDIJCS8qKjwgSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMSBwb2xhcml0eSBpcyBhY3RpdmUgaGlnaCAoci93KS4gKi8KKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFCQkweDA0CQkvKio8IElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgaXMgYWN0aXZlIChyL18pLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4JCTB4MDgJCS8qKjwgSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBlbmFibGVkIChyL3cpLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MCQkweDEwCQkvKio8IElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgcG9sYXJpdHkgaXMgYWN0aXZlIGhpZ2ggKHIvdykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURQkJMHgyMAkJLyoqPCBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAyIGlzIGFjdGl2ZSAgKHIvXykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfUENJX0lOVF9FTgkJCTB4NDAJCS8qKjwgSWYgc2V0LCBQQ0kgaW50ZXJydXB0IGlzIGVuYWJsZWQgKHIvdykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfU09GVF9JTlQJCQkweDgwCQkvKio8IElmIHNldCwgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIChyL3cpLiAqLworCisjZGVmaW5lIFBMWF9JQ1IJCQkJCTB4NTAJCS8qKjwgSW5pdGlhbGl6YXRpb24gY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX0NMT0NLX1NFVAkJMHgwMTAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fQ0hJUF9TRUxFQ1QJCTB4MDIwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX1dSSVRFCQkweDA0MDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9SRUFECQkJMHgwODAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fVkFMSUQJCTB4MTAwMDAwMDAKKworI2RlZmluZSBQTFhfSUNSX01BU0tfRUVQUk9NCQkJMHgxRjAwMDAwMAorI2RlZmluZSBFRVBST01fREVMQVkJCQkJMQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4YjY2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qKgorICogQGZpbGUgbWVfc2xpc3QuYworICoKKyAqIEBicmllZiBJbXBsZW1lbnRzIHRoZSBzdWJkZXZpY2UgbGlzdCBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorCisjaW5jbHVkZSAibWVzbGlzdC5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworaW50IG1lX3NsaXN0X3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QsIGludCAqbnVtYmVyKQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisJKm51bWJlciA9IHNsaXN0LT5uOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCit1bnNpZ25lZCBpbnQgbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QpCit7CisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKwlyZXR1cm4gc2xpc3QtPm47Cit9CisKK21lX3N1YmRldmljZV90ICptZV9zbGlzdF9nZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zbGlzdCAqIHNsaXN0LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChpbmRleCA+PSBzbGlzdC0+bikgeworCQlQRVJST1IoIkluZGV4IG91dCBvZiByYW5nZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnNsaXN0LT5oZWFkKSB7CisJCWlmIChpID09IGluZGV4KSB7CisJCQlzdWJkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfc3ViZGV2aWNlX3QsIGxpc3QpOworCQkJYnJlYWs7CisJCX0KKworCQkrK2k7CisJfQorCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworaW50IG1lX3NsaXN0X2dldF9zdWJkZXZpY2VfYnlfdHlwZShzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LAorCQkJCSAgIHVuc2lnbmVkIGludCBzdGFydF9zdWJkZXZpY2UsCisJCQkJICAgaW50IHR5cGUsIGludCBzdWJ0eXBlLCBpbnQgKnN1YmRldmljZSkKK3sKKwltZV9zdWJkZXZpY2VfdCAqcG9zOworCWludCBzX3R5cGUsIHNfc3VidHlwZTsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSAwOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChzdGFydF9zdWJkZXZpY2UgPj0gc2xpc3QtPm4pIHsKKwkJUEVSUk9SKCJTdGFydCBpbmRleCBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PTU9SRV9TVUJERVZJQ0VfVFlQRTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnNsaXN0LT5oZWFkLCBsaXN0KSB7CisJCWlmIChpbmRleCA8IHN0YXJ0X3N1YmRldmljZSkgewkvLyBHbyBmb3J3YXJkIHRvIHN0YXJ0IHN1YmRldmljZS4KKwkJCSsraW5kZXg7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBvcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlKHBvcywKKwkJCQkJCSAgICAgICAmc190eXBlLCAmc19zdWJ0eXBlKTsKKworCQlpZiAoc3VidHlwZSA9PSBNRV9TVUJUWVBFX0FOWSkgeworCQkJaWYgKHNfdHlwZSA9PSB0eXBlKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaWYgKChzX3R5cGUgPT0gdHlwZSkgJiYgKHNfc3VidHlwZSA9PSBzdWJ0eXBlKSkKKwkJCQlicmVhazsKKwkJfQorCisJCSsraW5kZXg7CisJfQorCisJaWYgKGluZGV4ID49IHNsaXN0LT5uKSB7CisJCXJldHVybiBNRV9FUlJOT19OT01PUkVfU1VCREVWSUNFX1RZUEU7CisJfQorCisJKnN1YmRldmljZSA9IGluZGV4OworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3ZvaWQgbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QsCisJCQkJIG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlKQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlsaXN0X2FkZF90YWlsKCZzdWJkZXZpY2UtPmxpc3QsICZzbGlzdC0+aGVhZCk7CisJKytzbGlzdC0+bjsKK30KKworbWVfc3ViZGV2aWNlX3QgKm1lX3NsaXN0X2RlbF9zdWJkZXZpY2VfdGFpbChzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqbGFzdDsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChsaXN0X2VtcHR5KCZzbGlzdC0+aGVhZCkpCisJCXJldHVybiBOVUxMOworCisJbGFzdCA9IHNsaXN0LT5oZWFkLnByZXY7CisKKwlzdWJkZXZpY2UgPSBsaXN0X2VudHJ5KGxhc3QsIG1lX3N1YmRldmljZV90LCBsaXN0KTsKKworCWxpc3RfZGVsKGxhc3QpOworCisJLS1zbGlzdC0+bjsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKK2ludCBtZV9zbGlzdF9pbml0KG1lX3NsaXN0X3QgKiBzbGlzdCkKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJSU5JVF9MSVNUX0hFQUQoJnNsaXN0LT5oZWFkKTsKKwlzbGlzdC0+biA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWVfc2xpc3RfZGVpbml0KG1lX3NsaXN0X3QgKiBzbGlzdCkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKnM7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnNsaXN0LT5oZWFkKSkgeworCQlzID0gc2xpc3QtPmhlYWQubmV4dDsKKwkJbGlzdF9kZWwocyk7CisJCXN1YmRldmljZSA9IGxpc3RfZW50cnkocywgbWVfc3ViZGV2aWNlX3QsIGxpc3QpOworCQlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9kZXN0cnVjdG9yKHN1YmRldmljZSk7CisJfQorCisJc2xpc3QtPm4gPSAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2Yzg5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKgorICogQGZpbGUgbWVfc2xpc3QuaAorICoKKyAqIEBicmllZiBQcm92aWRlcyB0aGUgc3ViZGV2aWNlIGxpc3QgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUVfU0xJU1RfSF8KKyNkZWZpbmUgX01FX1NMSVNUX0hfCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgc3ViZGV2aWNlIGxpc3QgY29udGFpbmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9zbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwkJLyoqPCBUaGUgaGVhZCBvZiB0aGUgaW50ZXJuYWwgbGlzdC4gKi8KKwl1bnNpZ25lZCBpbnQgbjsJCQkvKio8IFRoZSBudW1iZXIgb2Ygc3ViZGV2aWNlcyBpbiB0aGUgbGlzdC4gKi8KK30gbWVfc2xpc3RfdDsKKworLyoqCisgKiBAYnJpZWYgUXVlcmllcyB0aGUgbnVtYmVyIG9mIHN1YmRldmljZXMgY3VycmVudGx5IGluc2lkZSB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHRvIHF1ZXJ5LgorICogQHBhcmFtW291dF0gbnVtYmVyIFRoZSBudW1iZXIgb2Ygc3ViZGV2aWNlcyBvZiB0aGUgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gTUUtaURTIGVycm9yIGNvZGUuCisgKi8KK2ludCBtZV9zbGlzdF9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LCBpbnQgKm51bWJlcik7CisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWJkZXZpY2VzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc3ViZGV2aWNlcyBpbiB0aGUgbGlzdC4KKyAqLwordW5zaWduZWQgaW50IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgR2V0IGEgc3ViZGV2aWNlIGJ5IGluZGV4LgorICoKKyAqIEBwYXJhbSBzbGlzdCBUaGUgc3ViZGV2aWNlIGxpc3QgdG8gcXVlcnkuCisgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBzdWJkZXZpY2UgdG8gZ2V0IGluIHRoZSBsaXN0LgorICoKKyAqIEByZXR1cm4gVGhlIHN1YmRldmljZSBhdCBpbmRleCBpZiBhdmFpbGFibGUuXG4KKyAqICAgICAgICAgTlVMTCBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgorICovCittZV9zdWJkZXZpY2VfdCAqbWVfc2xpc3RfZ2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpOworCisvKioKKyAqIEBicmllZiBHZXQgYSBzdWJkZXZpY2UgaW5kZXggYnkgdHlwZSBhbmQgc3VidHlwZS4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHRvIHF1ZXJ5LgorICogQHBhcmFtIHN0YXJ0X3N1YmRldmljZSBUaGUgc3ViZGV2aWNlIGluZGV4IGF0IHdoaWNoIHRoZSBzdGFydCBzaGFsbCBiZWdpbi4KKyAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBzdWJkZXZpY2UgdG8gcXVlcnkuCisgKiBAcGFyYW0gc3VidHlwZSBUaGUgc3VidHlwZSBvZiB0aGUgc3ViZGV2aWNlIHRvIHF1ZXJ5LgorICogQHBhcmFtW291dF0gc3ViZGV2aWNlIE9uIHN1Y2Nlc3MgdGhpcyBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHN1YmRldmljZSBtYXRjaGluZyB0aGUgcmVxdWVzdGVkIHR5cGUuCisgKgorICogQHJldHVybiBNRV9FUlJOT19TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlX2J5X3R5cGUoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgc3RhcnRfc3ViZGV2aWNlLAorCQkJCSAgIGludCB0eXBlLCBpbnQgc3VidHlwZSwgaW50ICpzdWJkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBBZGRzIGEgc3ViZGV2aWNlIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBzbGlzdCBUaGUgc3ViZGV2aWNlIGxpc3QgdG8gYWRkIGEgc3ViZGV2aWNlIHRvLgorICogQHBhcmFtIHN1YmRldmljZSBUaGUgc3ViZGV2aWNlIHRvIGFkZCB0byB0aGUgbGlzdC4KKyAqLwordm9pZCBtZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwKKwkJCQkgbWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBSZW1vdmVzIGEgc3ViZGV2aWNlIGZyb20gdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdC4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIHJlbW92ZWQgc3ViZGVpdmNlLlxuCisgKiAgICAgICAgIE5VTEwgaW4gY2FzZXMgd2hlcmUgdGhlIGxpc3Qgd2FzIGVtcHR5LgorICovCittZV9zdWJkZXZpY2VfdCAqbWVfc2xpc3RfZGVsX3N1YmRldmljZV90YWlsKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhIHN1YmRldmljZSBsaXN0IHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gbG9jayBUaGUgc3ViZGV2aWNlIGxpc3Qgc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3NsaXN0X2luaXQobWVfc2xpc3RfdCAqIHNsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIHN1YmRldmljZSBsaXN0IHN0cnVjdHVyZSBhbmQgZGVzdHJ1Y3RzIGV2ZXJ5IHN1YmRldmljZSBpbiBpdC4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHN0cnVjdHVyZSB0byBkZWluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLwordm9pZCBtZV9zbGlzdF9kZWluaXQobWVfc2xpc3RfdCAqIHNsaXN0KTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzBiODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbG9jay5jCkBAIC0wLDAgKzEsMTM2IEBACisvKioKKyAqIEBmaWxlIG1lc2xvY2suYworICoKKyAqIEBicmllZiBJbXBsZW1lbnRzIHRoZSBzdWJkZXZpY2UgbG9jayBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXNsb2NrLmgiCisKK2ludCBtZV9zbG9ja19lbnRlcihzdHJ1Y3QgbWVfc2xvY2sgKnNsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCWlmICgoc2xvY2stPmZpbGVwKSAhPSBOVUxMICYmIChzbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCX0KKworCXNsb2NrLT5jb3VudCsrOworCisJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK2ludCBtZV9zbG9ja19leGl0KHN0cnVjdCBtZV9zbG9jayAqc2xvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJnNsb2NrLT5zcGluX2xvY2spOworCXNsb2NrLT5jb3VudC0tOworCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitpbnQgbWVfc2xvY2tfbG9jayhzdHJ1Y3QgbWVfc2xvY2sgKnNsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBsb2NrKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCXN3aXRjaCAobG9jaykgeworCisJY2FzZSBNRV9MT0NLX1JFTEVBU0U6CisJCXNwaW5fbG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwkJaWYgKHNsb2NrLT5maWxlcCA9PSBmaWxlcCkKKwkJCXNsb2NrLT5maWxlcCA9IE5VTEw7CisKKwkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWJyZWFrOworCisJY2FzZSBNRV9MT0NLX1NFVDoKKwkJc3Bpbl9sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCQlpZiAoc2xvY2stPmNvdW50KSB7CisJCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisJCQlQRVJST1IoIlN1YmRldmljZSBpcyB1c2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX1VTRUQ7CisJCX0gZWxzZSBpZiAoc2xvY2stPmZpbGVwID09IE5VTEwpCisJCQlzbG9jay0+ZmlsZXAgPSBmaWxlcDsKKwkJZWxzZSBpZiAoc2xvY2stPmZpbGVwICE9IGZpbGVwKSB7CisJCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisJCQlQRVJST1IoIlN1YmRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWJyZWFrOworCisJY2FzZSBNRV9MT0NLX0NIRUNLOgorCQlzcGluX2xvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWlmIChzbG9jay0+Y291bnQpIHsKKwkJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKwkJCXJldHVybiBNRV9FUlJOT19VU0VEOworCQl9IGVsc2UgaWYgKChzbG9jay0+ZmlsZXAgIT0gTlVMTCkgJiYgKHNsb2NrLT5maWxlcCAhPSBmaWxlcCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKwkJCXJldHVybiBNRV9FUlJOT19MT0NLRUQ7CisJCX0KKworCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKwordm9pZCBtZV9zbG9ja19kZWluaXQoc3RydWN0IG1lX3Nsb2NrICpzbG9jaykKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7Cit9CisKK2ludCBtZV9zbG9ja19pbml0KG1lX3Nsb2NrX3QgKiBzbG9jaykKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzbG9jay0+ZmlsZXAgPSBOVUxMOworCXNsb2NrLT5jb3VudCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnNsb2NrLT5zcGluX2xvY2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbG9jay5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDJiMjVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suaApAQCAtMCwwICsxLDczIEBACisvKioKKyAqIEBmaWxlIG1lc2xvY2suaAorICoKKyAqIEBicmllZiBQcm92aWRlcyB0aGUgc3ViZGV2aWNlIGxvY2sgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUVTTE9DS19IXworI2RlZmluZSBfTUVTTE9DS19IXworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHN1YmRldmljZSBsb2NrIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9zbG9jayB7CisJc3RydWN0IGZpbGUgKmZpbGVwOwkJLyoqPCBQb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlIGhvbGRpbmcgdGhlIHN1YmRldmljZS4gKi8KKwlpbnQgY291bnQ7CQkJLyoqPCBOdW1iZXIgb2YgdGFza3Mgd2hpY2ggYXJlIGluc2lkZSB0aGUgc3ViZGV2aWNlLiAqLworCXNwaW5sb2NrX3Qgc3Bpbl9sb2NrOwkJLyoqPCBTcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgYXR0cmlidXRlcyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworfSBtZV9zbG9ja190OworCisvKioKKyAqIEBicmllZiBUcmllcyB0byBlbnRlciBhIHN1YmRldmljZS4KKyAqCisgKiBAcGFyYW0gc2xvY2sgVGhlIHN1YmRldmljZSBsb2NrIGluc3RhbmNlLgorICogQHBhcmFtIGZpbGVwIFRoZSBmaWxlIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfc2xvY2tfZW50ZXIoc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwKTsKKworLyoqCisgKiBAYnJpZWYgRXhpdHMgYSBzdWJkZXZpY2UuCisgKgorICogQHBhcmFtIHNsb2NrIFRoZSBzdWJkZXZpY2UgbG9jayBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmaWxlcCBUaGUgZmlsZSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3Nsb2NrX2V4aXQoc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwKTsKKworLyoqCisgKiBAYnJpZWYgVHJpZXMgdG8gcGVyZm9ybSBhIGxvY2tpbmcgYWN0aW9uIG9uIGEgc3ViZGV2aWNlLgorICoKKyAqIEBwYXJhbSBzbG9jayBUaGUgc3ViZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmlsZXAgVGhlIGZpbGUgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKiBAcGFyYW0gVGhlIGFjdGlvbiB0byBiZSBkb25lLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfc2xvY2tfbG9jayhzdHJ1Y3QgbWVfc2xvY2sgKnNsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBsb2NrKTsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gc2xvY2sgVGhlIGxvY2sgc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3Nsb2NrX2luaXQobWVfc2xvY2tfdCAqIHNsb2NrKTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIGxvY2sgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBzbG9jayBUaGUgbG9jayBzdHJ1Y3R1cmUgdG8gZGVpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3ZvaWQgbWVfc2xvY2tfZGVpbml0KG1lX3Nsb2NrX3QgKiBzbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzdWJkZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXN1YmRldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDRmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzdWJkZXZpY2UuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoqCisgKiBAZmlsZSBtZXN1YmRldmljZS5jCisgKgorICogQGJyaWVmIFN1YmRldmljZSBiYXNlIGNsYXNzIGltcGxlbWVudGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0KHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IGlycV9zb3VyY2UsCisJCQkJICAgICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIGludCBjaGFubmVsLAorCQkJCQkgaW50IHNpbmdsZV9jb25maWcsCisJCQkJCSBpbnQgcmVmLAorCQkJCQkgaW50IHRyaWdfY2hhbiwKKwkJCQkJIGludCB0cmlnX3R5cGUsCisJCQkJCSBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgY2hhbm5lbCwKKwkJCQkJaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJCSBpbnQgY291bnQsCisJCQkJCSBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkJIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgICAgaW50IHRpbWVfb3V0LAorCQkJCQkgICAgIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgcmVhZF9tb2RlLAorCQkJCSAgICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIGludCB3YWl0LAorCQkJCQkgaW50ICpzdGF0dXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCWludCB3cml0ZV9tb2RlLAorCQkJCQlpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIG1lX3Nsb2NrX2xvY2soJnN1YmRldmljZS0+bG9jaywgZmlsZXAsIGxvY2spOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCB1bml0LAorCQkJCQkgICAgICAgaW50ICptaW4sCisJCQkJCSAgICAgICBpbnQgKm1heCwKKwkJCQkJICAgICAgIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8oc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgaW50IHJhbmdlLAorCQkJCQkgaW50ICp1bml0LAorCQkJCQkgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZQorCQkJCQkJICAqc3ViZGV2aWNlLCBpbnQgY2FwLAorCQkJCQkJICBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgaW50IHRpbWVyLAorCQkJCSAgICBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSAgICBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9jb25maWdfbG9hZChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJbWVfc3ViZGV2aWNlX2RlaW5pdChzdWJkZXZpY2UpOworCWtmcmVlKHN1YmRldmljZSk7Cit9CisKK2ludCBtZV9zdWJkZXZpY2VfaW5pdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSkKK3sKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogSW5pdCBsaXN0IGhlYWQgKi8KKwlJTklUX0xJU1RfSEVBRCgmc3ViZGV2aWNlLT5saXN0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN1YmRldmljZSBsb2NrIGluc3RhbmNlICovCisKKwllcnIgPSBtZV9zbG9ja19pbml0KCZzdWJkZXZpY2UtPmxvY2spOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBsb2NrIGluc3RhbmNlLlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIFN1YmRldmljZSBiYXNlIGNsYXNzIG1ldGhvZHMgKi8KKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0OworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWVfc3ViZGV2aWNlX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9IG1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9CisJICAgIG1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9IG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhcnQ7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9CisJICAgIG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV93cml0ZSA9IG1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGU7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2UgPSBtZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPQorCSAgICBtZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbzsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIgPSBtZV9zdWJkZXZpY2VfcXVlcnlfdGltZXI7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfY29uZmlnX2xvYWQgPSBtZV9zdWJkZXZpY2VfY29uZmlnX2xvYWQ7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lX3N1YmRldmljZV9kZXN0cnVjdG9yOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWVfc3ViZGV2aWNlX2RlaW5pdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJbWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZShzdWJkZXZpY2UsIE5VTEwsCisJCQkJCU1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisJbWVfc2xvY2tfZGVpbml0KCZzdWJkZXZpY2UtPmxvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzdWJkZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWVjMmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qKgorICogQGZpbGUgbWVzdWJkZXZpY2UuaAorICoKKyAqIEBicmllZiBQcm92aWRlcyB0aGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUVTVUJERVZJQ0VfSF8KKyNkZWZpbmUgX01FU1VCREVWSUNFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJtZXR5cGVzLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworIyBpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdXNlZCB0byBlbnRlciBhIHN1YmRldmljZS4KKyAqLworI2RlZmluZSBNRV9TVUJERVZJQ0VfRU5URVIJXAoreyBcCisJaW50IGVycjsgXAorCWVyciA9IG1lX3Nsb2NrX2VudGVyKCZpbnN0YW5jZS0+YmFzZS5sb2NrLCBmaWxlcCk7IFwKKwlpZihlcnIpeyBcCisJCVBFUlJPUigiQ2Fubm90IGVudGVyIHN1YmRldmljZS5cbiIpOyBcCisJCXJldHVybiBlcnI7IFwKKwl9IFwKK30KKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdXNlZCB0byBleGl0IGEgc3ViZGV2aWNlLgorICovCisjZGVmaW5lIE1FX1NVQkRFVklDRV9FWElUCVwKK3tcCisJaW50IGVycjsgXAorCWVyciA9IG1lX3Nsb2NrX2V4aXQoJmluc3RhbmNlLT5iYXNlLmxvY2ssIGZpbGVwKTsgXAorCWlmKGVycil7IFwKKwkJUEVSUk9SKCJDYW5ub3QgZXhpdCBzdWJkZXZpY2UuXG4iKTsgXAorCQlyZXR1cm4gZXJyOyBcCisJfSBcCit9CisKKy8qKgorICogQGJyaWVmIFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfc3ViZGV2aWNlIHsKKwkvKiBBdHRyaWJ1dGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyoqPCBFbmFibGVzIHRoZSBzdWJkZXZpY2UgdG8gYmUgYWRkZWQgdG8gYSBkeW5hbWljIGxpc3QuICovCisJbWVfc2xvY2tfdCBsb2NrOwkJLyoqPCBVc2VkIGJ5IHVzZXIgYXBwbGljYXRpb24gaW4gb3JkZXIgdG8gbG9jayB0aGUgc3ViZGV2aWNlIGZvciBleGNsdXNpdmUgdXNhZ2UuICovCisKKwkvKiBNZXRob2RzICovCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkJICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkJICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX2lycV93YWl0KSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkJc3RydWN0IGZpbGUgKiBmaWxlcCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCQkgICAgICBpbnQgcmVmLAorCQkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCQkgICAgICBpbnQgdHJpZ190eXBlLAorCQkJCQkgICAgICBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkJICAgIGludCAqdmFsdWUsCisJCQkJCSAgICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCQkgICAgIGludCB2YWx1ZSwKKwkJCQkJICAgICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCQkgICAgICBpbnQgY291bnQsCisJCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLAorCQkJCQkgICAgICBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgIHN1YmRldmljZSwKKwkJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LAorCQkJCQkJICBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICBpbnQgcmVhZF9tb2RlLAorCQkJCQkgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgIGludCBzdGFydF9tb2RlLAorCQkJCQkgICAgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICAgaW50IHdhaXQsCisJCQkJCSAgICAgIGludCAqc3RhdHVzLAorCQkJCQkgICAgICBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV93cml0ZSkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkJICAgICBpbnQgKnZhbHVlcywKKwkJCQkJICAgICBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICBpbnQgbG9jaywgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICoKKwkJCQkJCSAgIHN1YmRldmljZSwgaW50ICpudW1iZXIpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICoKKwkJCQkJCSBzdWJkZXZpY2UsIGludCB1bml0LAorCQkJCQkJIGludCAqY291bnQpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICoKKwkJCQkJCSAgICBzdWJkZXZpY2UsIGludCB1bml0LAorCQkJCQkJICAgIGludCAqbWluLCBpbnQgKm1heCwKKwkJCQkJCSAgICBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8pIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgIHN1YmRldmljZSwgaW50ICp0eXBlLAorCQkJCQkJICBpbnQgKnN1YnR5cGUpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgIHN1YmRldmljZSwgaW50ICpjYXBzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgICAgICAgc3ViZGV2aWNlLCBpbnQgY2FwLAorCQkJCQkJICAgICAgIGludCAqYXJncywgaW50IGNvdW50KTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV90aW1lcikgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdGltZXIsCisJCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsCisJCQkJCSBsb25nIGxvbmcgKm1heF90aWNrcyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfY29uZmlnX2xvYWQpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgbWVfY2ZnX2RldmljZV9lbnRyeV90ICogY29uZmlnKTsKKworCXZvaWQgKCptZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcikgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UpOworfSBtZV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBzdWJkZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBzdWJkZXZpY2UgVGhlIHN1YmRldmljZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfc3ViZGV2aWNlX2luaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBEZWluaXRpYWxpemVzIGEgc3ViZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gc3ViZGV2aWNlIFRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKi8KK3ZvaWQgbWVfc3ViZGV2aWNlX2RlaW5pdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODYzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuYwpAQCAtMCwwICsxLDEzNyBAQAorLyoqCisgKiBAZmlsZSBtZXRlbXBsX2RldmljZS5jCisgKgorICogQGJyaWVmIHRlbXBsYXRlIGRldmljZSBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtZWlkcy5oPgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1ldGVtcGxfZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXRlbXBsX3N1Yi5oIgorCittZV9kZXZpY2VfdCAqbWV0ZW1wbF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWV0ZW1wbF9kZXZpY2VfdCAqbWV0ZW1wbF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1ldGVtcGxfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWV0ZW1wbF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZXRlbXBsX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1ldGVtcGxfZGV2aWNlLCAwLCBzaXplb2YobWV0ZW1wbF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1ldGVtcGxfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWV0ZW1wbF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWV0ZW1wbF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1ldGVtcGxfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZXRlbXBsX2RldmljZS0+Y3RybF9yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKwlmb3IgKGkgPSAwOyBpIDwgbWV0ZW1wbF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWV0ZW1wbF9zdWJfY29uc3RydWN0b3IobWV0ZW1wbF9kZXZpY2UtPgorCQkJCQkJCSAgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICAgICZtZXRlbXBsX2RldmljZS0+CisJCQkJCQkJICAgICAgIGN0cmxfcmVnX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZXRlbXBsX2RldmljZSk7CisJCQlrZnJlZShtZXRlbXBsX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZXRlbXBsX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJLyogT3ZlcndyaXRlIGJhc2UgY2xhc3MgbWV0aG9kcyBpZiBhcHBsaWNhYmxlLiAqLworCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZXRlbXBsX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1ldGVtcGxfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZXRlbXBsX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuLiIpOworfQorCittb2R1bGVfaW5pdChtZXRlbXBsX2luaXQpOworCittb2R1bGVfZXhpdChtZXRlbXBsX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBUZW1wbGF0ZSBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBUZW1wbGF0ZSBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1ldGVtcGxfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzNzAyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX2RldmljZS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9kZXZpY2UuaAorICoKKyAqIEBicmllZiB0ZW1wbGF0ZSBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUVURU1QTF9ERVZJQ0VfSAorI2RlZmluZSBfTUVURU1QTF9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSBob2xkaW5nIHRlbXBsYXRlIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1ldGVtcGxfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBzdWJkZXZpY2VzOworfSBtZXRlbXBsX3ZlcnNpb25fdDsKKworLyoqCisgKiBAYnJpZWYgRGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1ldGVtcGxfdmVyc2lvbl90IG1ldGVtcGxfdmVyc2lvbnNbXSA9IHsKKwl7MHhERUFELCAxfSwKKwl7MH0sCit9OworCisjZGVmaW5lIE1FVEVNUExfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWV0ZW1wbF92ZXJzaW9ucykgLyBzaXplb2YobWV0ZW1wbF92ZXJzaW9uX3QpIC0gMSkgLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWV0ZW1wbF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWV0ZW1wbF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZXRlbXBsX3ZlcnNpb25zLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZXRlbXBsX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRVRFTVBMX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWV0ZW1wbF92ZXJzaW9uc1tpXS5kZXZpY2VfaWQgPT0gZGV2aWNlX2lkKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZXRlbXBsX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIENoaWxkIGNsYXNzIGF0dHJpYnV0ZXMuICovCisJc3BpbmxvY2tfdCBjdHJsX3JlZ19sb2NrOworfSBtZXRlbXBsX2RldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyB0ZW1wbGF0ZSBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZXRlbXBsX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9zdWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQ2NWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9zdWIuYworICoKKyAqIEBicmllZiBTdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXRlbXBsX3N1Yl9yZWcuaCIKKyNpbmNsdWRlICJtZXRlbXBsX3N1Yi5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBtZXRlbXBsX3N1Yl9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJaW5zdGFuY2UgPSAobWV0ZW1wbF9zdWJfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJLyogVW50aWwgdGhlcmUgdGhpcyB3YXMgdGhlIHRoaW5ncyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBkb2VzLgorCSAgIElmIHlvdSBkbyBub3QgaGF2ZSBhbnkgYWRkaXRpb25hbCB0aGluZ3MgdG8gZG8geW91IGNhbiB3aXBlIGl0IG91dC4gKi8KKworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK3N0YXRpYyBpbnQgbWV0ZW1wbF9zdWJfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZXRlbXBsX3N1Yl9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IDA7CisJKnN1YnR5cGUgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1ldGVtcGxfc3ViX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21ldGVtcGxfc3ViX3N1YmRldmljZV90ICptZXRlbXBsX3N1Yl9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgc3ViX2lkeCwKKwkJCQkJCSBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1ldGVtcGxfc3ViX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1ldGVtcGxfc3ViX3N1YmRldmljZV90KSk7CisKKwkvKiBDaGVjayBpZiBzdWJkZXZpY2UgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoc3ViX2lkeCA+PSAyKSB7CisJCVBFUlJPUigiVGVtcGxhdGUgc3ViZGV2aWNlIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5zdWJfaWR4ID0gc3ViX2lkeDsKKworCS8qIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZXRlbXBsX3N1Yl9kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWV0ZW1wbF9zdWJfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZXRlbXBsX3N1Yl9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWV0ZW1wbF9zdWJfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9zdWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGM4YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmgKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKiBAZmlsZSBtZXRlbXBsX3N1Yi5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRVRFTVBMX1NVQl9IXworI2RlZmluZSBfTUVURU1QTF9TVUJfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1ldGVtcGxfc3ViX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlpbnQgc3ViX2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIHN1YmRldmljZSBvbiB0aGUgZGV2aWNlLiAqLworCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgbW9kZXMuICovCit9IG1ldGVtcGxfc3ViX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gc3ViX2lkeCBUaGUgaW5kZXggb2YgdGhlIHN1YmRldmljZSBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWV0ZW1wbF9zdWJfc3ViZGV2aWNlX3QgKm1ldGVtcGxfc3ViX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkJIHVuc2lnbmVkIGludCBzdWJfaWR4LAorCQkJCQkJIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yl9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yl9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJjYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViX3JlZy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9zdWJfcmVnLmgKKyAqCisgKiBAYnJpZWYgU3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FVEVNUExfU1VCX1JFR19IXworI2RlZmluZSBfTUVURU1QTF9TVUJfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUVURU1QTF9QT1JUX01PREUJCQkweDAwMTAJCS8qKjwgQ29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOGVhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0eXBlcy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWV0eXBlcy5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVUWVBFU19IXworI2RlZmluZSBfTUVUWVBFU19IXworCisKK3R5cGVkZWYgaW50ICgqbWVFcnJvckNCX3QpKGNoYXIgKnBjRnVuY3Rpb25OYW1lLCBpbnQgaUVycm9yQ29kZSk7CisKK3R5cGVkZWYgaW50ICgqbWVJT1N0cmVhbUNCX3QpKAorCQlpbnQgaURldmljZSwKKwkJaW50IGlTdWJkZXZpY2UsCisJCWludCBpQ291bnQsCisJICAgCXZvaWQgKnB2Q29udGV4dCwKKwkgICAJaW50IGlFcnJvckNvZGUpOworCit0eXBlZGVmIGludCAoKm1lSU9JcnFDQl90KSgKKwkJaW50IGlEZXZpY2UsCisJICAgCWludCBpU3ViZGV2aWNlLAorCSAgIAlpbnQgaUNoYW5uZWwsCisJCWludCBpSXJxQ291bnQsCisJICAgCWludCBpVmFsdWUsCisJICAgCXZvaWQgKnB2Q29udGV4dCwKKwkgICAJaW50IGlFcnJvckNvZGUpOworCisKK3R5cGVkZWYgc3RydWN0IG1lSU9TaW5nbGUgeworCWludCBpRGV2aWNlOworCWludCBpU3ViZGV2aWNlOworCWludCBpQ2hhbm5lbDsKKwlpbnQgaURpcjsKKwlpbnQgaVZhbHVlOworCWludCBpVGltZU91dDsKKwlpbnQgaUZsYWdzOworCWludCBpRXJybm87Cit9IG1lSU9TaW5nbGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU3RyZWFtQ29uZmlnIHsKKwlpbnQgaUNoYW5uZWw7CisJaW50IGlTdHJlYW1Db25maWc7CisJaW50IGlSZWY7CisJaW50IGlGbGFnczsKK30gbWVJT1N0cmVhbUNvbmZpZ190OworCisKK3R5cGVkZWYgc3RydWN0IG1lSU9TdHJlYW1UcmlnZ2VyIHsKKwlpbnQgaUFjcVN0YXJ0VHJpZ1R5cGU7CisJaW50IGlBY3FTdGFydFRyaWdFZGdlOworCWludCBpQWNxU3RhcnRUcmlnQ2hhbjsKKwlpbnQgaUFjcVN0YXJ0VGlja3NMb3c7CisJaW50IGlBY3FTdGFydFRpY2tzSGlnaDsKKwlpbnQgaUFjcVN0YXJ0QXJnc1sxMF07CisJaW50IGlTY2FuU3RhcnRUcmlnVHlwZTsKKwlpbnQgaVNjYW5TdGFydFRpY2tzTG93OworCWludCBpU2NhblN0YXJ0VGlja3NIaWdoOworCWludCBpU2NhblN0YXJ0QXJnc1sxMF07CisJaW50IGlDb252U3RhcnRUcmlnVHlwZTsKKwlpbnQgaUNvbnZTdGFydFRpY2tzTG93OworCWludCBpQ29udlN0YXJ0VGlja3NIaWdoOworCWludCBpQ29udlN0YXJ0QXJnc1sxMF07CisJaW50IGlTY2FuU3RvcFRyaWdUeXBlOworCWludCBpU2NhblN0b3BDb3VudDsKKwlpbnQgaVNjYW5TdG9wQXJnc1sxMF07CisJaW50IGlBY3FTdG9wVHJpZ1R5cGU7CisJaW50IGlBY3FTdG9wQ291bnQ7CisJaW50IGlBY3FTdG9wQXJnc1sxMF07CisJaW50IGlGbGFnczsKK30gbWVJT1N0cmVhbVRyaWdnZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU3RyZWFtU3RhcnQgeworCWludCBpRGV2aWNlOworCWludCBpU3ViZGV2aWNlOworCWludCBpU3RhcnRNb2RlOworCWludCBpVGltZU91dDsKKwlpbnQgaUZsYWdzOworCWludCBpRXJybm87Cit9IG1lSU9TdHJlYW1TdGFydF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lSU9TdHJlYW1TdG9wIHsKKwlpbnQgaURldmljZTsKKwlpbnQgaVN1YmRldmljZTsKKwlpbnQgaVN0b3BNb2RlOworCWludCBpRmxhZ3M7CisJaW50IGlFcnJubzsKK30gbWVJT1N0cmVhbVN0b3BfdDsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9taW1pby9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21pbWlvL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiYTRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBJTlBVVF9NSU1JTworCXRyaXN0YXRlICJNaW1pbyBYaSBpbnRlcmFjdGl2ZSB3aGl0ZWJvYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKKwlkZWZhdWx0IE4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIE1pbWlvIFhpIGludGVyYWN0aXZlCisJICB3aGl0ZWJvYXJkIGRldmljZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWltaW8uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWltaW8vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWltaW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4MDdlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfSU5QVVRfTUlNSU8pCSs9IG1pbWlvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9taW1pby9taW1pby5jIGIvZHJpdmVycy9zdGFnaW5nL21pbWlvL21pbWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhODEwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9taW1pby5jCkBAIC0wLDAgKzEsOTE0IEBACisvKgorICogSGFyZHdhcmUgZXZlbnQgPT4gaW5wdXQgZXZlbnQgbWFwcGluZzoKKyAqCisgKgorICoKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfUEVOICAgICAgICAgICAgMHgxNDAgYmxhY2sKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfUlVCQkVSICAgICAgICAgMHgxNDEgYmx1ZQorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9CUlVTSCAgICAgICAgICAweDE0MiBncmVlbgorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9QRU5DSUwgICAgICAgICAweDE0MyByZWQKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfQUlSQlJVU0ggICAgICAgMHgxNDQgZXJhc2VyCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX0ZJTkdFUiAgICAgICAgIDB4MTQ1IHNtYWxsIGVyYXNlcgorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9NT1VTRSAgICAgICAgICAweDE0NiBtaW1pbyBpbnRlcmFjdGl2ZQorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9MRU5TICAgICAgICAgICAweDE0NyBtaW1pbyBpbnRlcmFjdGl2ZSBidXQxCisgaW5wdXQuaDojZGVmaW5lIExPQ0FMQlROX1RPT0xfRVhUUkExICAgIDB4MTRhIG1pbWlvIGludGVyYWN0aXZlIGJ1dDIgPT0gQlROX1RPVUNICisgaW5wdXQuaDojZGVmaW5lIExPQ0FMQlROX1RPT0xfRVhUUkEyICAgIDB4MTRiIG1pbWlvIGV4dHJhIHBlbnMgKG9yYW5nZSwgYnJvd24sIHllbGxvdywgcHVycGxlKSA9PSBCVE5fU1RZTFVTCisgaW5wdXQuaDojZGVmaW5lIExPQ0FMQlROX1RPT0xfRVhUUkEzICAgIDB4MTRjIHVudXNlZCA9PSBCVE5fU1RZTFVTMgorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9ET1VCTEVUQVAgICAgICAweDE0ZCB1bnVzZWQKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfVFJJUExFVEFQICAgICAgMHgxNGUgdW51c2VkCisgKgorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fSykgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfUEVOKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fQikgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfUlVCQkVSKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fRykgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfQlJVU0gpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9SKSAgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9QRU5DSUwpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9FKSAgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9BSVJCUlVTSCkKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0VTKSAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX0ZJTkdFUikKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0kpICAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX01PVVNFKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fSUwpICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfTEVOUykKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0lSKSAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX0RPVUJMRVRBUCkKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0VYKSAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX1RSSVBMRVRBUCkKKyAqIE1JTUlPX0VWX1BFTkRBVEEgICAgICAgICAgICAgICAgID0+IEVWX0FCUyBCSVQoQUJTX1gpLCBCSVQoQUJTX1kpCisgKiBNSU1JT19FVl9NRU1SRVNFVCAgICAgICAgICAgICAgPT4gRVZfS0VZIEJJVChCVE5fMCkKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfTkVXUEFHRSkgICAgICAgPT4gRVZfS0VZIEJJVChCVE5fMSkKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfVEFHUEFHRSkgICAgICA9PiBFVl9LRVkgQklUKEJUTl8yKQorICogTUlNSU9fRVZfQUNDKEFDQ19QUklOVFBBR0UpICAgICAgPT4gRVZfS0VZIEJJVChCVE5fMykKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfTUFYSU1JWkUpICAgICAgPT4gRVZfS0VZIEJJVChCVE5fNCkKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfRklORENUTFBOTCkgICAgICA9PiBFVl9LRVkgQklUKEJUTl81KQorICoKKyAqCisgKiBvcGVuIGlzc3VlczoKKyAqICAgICAgLSBjb2xkLWxvYWQgb2YgZGF0YSBjYXB0dXJlZCB3aGVuIG1pbWlvIGluIHN0YW5kYWxvbmUgbW9kZSBub3QgeWV0CisgKiAgICAgICAgIHN1cHBvcnRlZDsgbmVlZCB0byBzbm9vcCBXaW4zMiBib3ggdG8gc2VlIGRhdGFzdHJlYW0gZm9yIHRoaXMuCisgKiAgICAgICAtIG1pbWlvIG1vdXNlIG5vdCB5ZXQgc3VwcG9ydGVkOyBuZWVkIHRvIHNub29wIFdpbjMyIGJveCB0byBzZWUgdGhlCisgKiAgICAgICAgIGRhdGFzdHJlYW0gZm9yIHRoaXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYwLjAzMSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIm13aWxkZXJAY3Mubm1zdS5lZHUiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiVVNCIG1pbWlvLXhpIGRyaXZlciIKKworZW51bSB7VVBWQUxVRSwgRE9XTlZBTFVFLCBNT1ZFVkFMVUV9OworCisjZGVmaW5lIE1JTUlPX1hSQU5HRV9NQVgJOTYwMAorI2RlZmluZSBNSU1JT19ZUkFOR0VfTUFYCTQ4MDAKKworI2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMQlCVE5fVE9VQ0gKKyNkZWZpbmUgTE9DQUxCVE5fVE9PTF9FWFRSQTIJQlROX1NUWUxVUworI2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMwlCVE5fU1RZTFVTMgorCisjZGVmaW5lIE1JTUlPX1ZFTkRPUl9JRAkJMHgwOGQzCisjZGVmaW5lIE1JTUlPX1BST0RVQ1RfSUQJMHgwMDAxCisjZGVmaW5lIE1JTUlPX01BWFBBWUxPQUQJKDgpCisjZGVmaW5lIE1JTUlPX01BWE5BTUVMRU4JKDY0KQorI2RlZmluZSBNSU1JT19UWFdBSVQJCSgxKQorI2RlZmluZSBNSU1JT19UWERPTkUJCSgyKQorCisjZGVmaW5lIE1JTUlPX0VWX1BFTkRPV04JKDB4MjIpCisjZGVmaW5lIE1JTUlPX0VWX1BFTkRBVEEJKDB4MjQpCisjZGVmaW5lIE1JTUlPX0VWX1BFTlVQCQkoMHg1MSkKKyNkZWZpbmUgTUlNSU9fRVZfTUVNUkVTRVQJKDB4NDUpCisjZGVmaW5lIE1JTUlPX0VWX0FDQwkJKDB4YjIpCisKKyNkZWZpbmUgTUlNSU9fUEVOX0sJCSgxKQkvKiBibGFjayBwZW4gKi8KKyNkZWZpbmUgTUlNSU9fUEVOX0IJCSgyKQkvKiBibHVlIHBlbiAqLworI2RlZmluZSBNSU1JT19QRU5fRwkJKDMpCS8qIGdyZWVuIHBlbiAqLworI2RlZmluZSBNSU1JT19QRU5fUgkJKDQpCS8qIHJlZCBwZW4gKi8KKy8qIDUsIDYsIDcsIDggYXJlIGV4dHJhIHBlbnMgKi8KKyNkZWZpbmUgTUlNSU9fUEVOX0UJCSg5KQkvKiBiaWcgZXJhc2VyICovCisjZGVmaW5lIE1JTUlPX1BFTl9FUwkJKDEwKQkvKiBsaWwgZXJhc2VyICovCisjZGVmaW5lIE1JTUlPX1BFTkpVTVBfU1RBUlQJKDEwKQorI2RlZmluZSBNSU1JT19QRU5KVU1QCQkoNikKKyNkZWZpbmUgTUlNSU9fUEVOX0kJCSgxNykJLyogbWltaW8gaW50ZXJhY3RpdmUgKi8KKyNkZWZpbmUgTUlNSU9fUEVOX0lMCQkoMTgpCS8qIG1pbWlvIGludGVyYWN0aXZlIGJ1dHRvbiAxICovCisjZGVmaW5lIE1JTUlPX1BFTl9JUgkJKDE5KQkvKiBtaW1pbyBpbnRlcmFjdGl2ZSBidXR0b24gMiAqLworCisjZGVmaW5lIE1JTUlPX1BFTl9NQVgJCShNSU1JT19QRU5fSVIpCisKKyNkZWZpbmUgQUNDX0RPTkUJCSgwKQorI2RlZmluZSBBQ0NfTkVXUEFHRQkJKDEpCisjZGVmaW5lIEFDQ19UQUdQQUdFCQkoMikKKyNkZWZpbmUgQUNDX1BSSU5UUEFHRQkJKDQpCisjZGVmaW5lIEFDQ19NQVhJTUlaRQkJKDgpCisjZGVmaW5lIEFDQ19GSU5EQ1RMUE5MCQkoMTYpCisKKyNkZWZpbmUgaXN2YWxpZHR4c2l6ZShuKQkoKG4pID4gMCAmJiAobikgPD0gTUlNSU9fTUFYUEFZTE9BRCkKKworCitzdHJ1Y3QgcGt0YnVmIHsKKwl1bnNpZ25lZCBjaGFyIGluc3RyOworCXVuc2lnbmVkIGNoYXIgYnVmWzE2XTsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnE7Cit9OworCitzdHJ1Y3QgdXNiaW50ZW5kcHQgeworCWRtYV9hZGRyX3QgZG1hOworCXN0cnVjdCB1cmIgKnVyYjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjOworfTsKKworc3RydWN0IG1pbWlvIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICp1aWZjOworCWludCBvcGVuOworCWludCBwcmVzZW50OworCWludCBncmVldGVkOworCWludCB0eGZsYWdzOworCWNoYXIgcGh5c1tNSU1JT19NQVhOQU1FTEVOXTsKKwlzdHJ1Y3QgdXNiaW50ZW5kcHQgaW47CisJc3RydWN0IHVzYmludGVuZHB0IG91dDsKKwlzdHJ1Y3QgcGt0YnVmIHBrdGJ1ZjsKKwl1bnNpZ25lZCBjaGFyIG1pbm9yOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCXNwaW5sb2NrX3QgdHhsb2NrOworCXZvaWQgKCpyeGhhbmRsZXIpKHN0cnVjdCBtaW1pbyAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7CisJaW50IGxhc3RfcGVuX2Rvd247Cit9OworCitzdGF0aWMgdm9pZCBtaW1pb19jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICopOworc3RhdGljIHZvaWQgbWltaW9fZGVhbGxvYyhzdHJ1Y3QgbWltaW8gKik7CitzdGF0aWMgdm9pZCBtaW1pb19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOworc3RhdGljIGludCBtaW1pb19ncmVldChzdHJ1Y3QgbWltaW8gKik7CitzdGF0aWMgdm9pZCBtaW1pb19pcnFfaW4oc3RydWN0IHVyYiAqKTsKK3N0YXRpYyB2b2lkIG1pbWlvX2lycV9vdXQoc3RydWN0IHVyYiAqKTsKK3N0YXRpYyBpbnQgbWltaW9fb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICopOworc3RhdGljIGludCBtaW1pb19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIG1pbWlvX3J4X2hhbmRsZXIoc3RydWN0IG1pbWlvICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgbWltaW9fdHgoc3RydWN0IG1pbWlvICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworc3RhdGljIGNoYXIgbWltaW9fbmFtZVtdID0gIlZpcnR1YWxJbmsgbWltaW8tWGkiOworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG1pbWlvX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShNSU1JT19WRU5ET1JfSUQsIE1JTUlPX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKDB4MDUyNSwgMHhhNGEwKSB9LCAvKiBnYWRnZXQgemVybyBmaXJtd2FyZSAqLworCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIG1pbWlvX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG1pbWlvX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtaW1pbyIsCisJLnByb2JlID0gbWltaW9fcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBtaW1pb19kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9IG1pbWlvX3RhYmxlLAorfTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoZGlzY29ubmVjdF9zZW0pOworCitzdGF0aWMgdm9pZCBtaW1pb19jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwltaW1pbyA9IGlucHV0X2dldF9kcnZkYXRhKGlkZXYpOworCWlmICghbWltaW8pIHsKKwkJZGV2X2VycigmaWRldi0+ZGV2LCAibnVsbCBtaW1pbyBhdHRhY2hlZCB0byBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1pbWlvLT5vcGVuIDw9IDApCisJCWRldl9lcnIoJmlkZXYtPmRldiwgIm1pbWlvIG5vdCBvcGVuLlxuIik7CisJZWxzZQorCQltaW1pby0+b3Blbi0tOworCisJaWYgKG1pbWlvLT5wcmVzZW50ID09IDAgJiYgbWltaW8tPm9wZW4gPT0gMCkKKwkJbWltaW9fZGVhbGxvYyhtaW1pbyk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWlvX2RlYWxsb2Moc3RydWN0IG1pbWlvICptaW1pbykKK3sKKwlpZiAobWltaW8gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJdXNiX2tpbGxfdXJiKG1pbWlvLT5pbi51cmIpOworCisJdXNiX2tpbGxfdXJiKG1pbWlvLT5vdXQudXJiKTsKKworCWlmIChtaW1pby0+aWRldikgeworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShtaW1pby0+aWRldik7CisJCWlmIChtaW1pby0+aWRldi0+Z3JhYikKKwkJCWlucHV0X2Nsb3NlX2RldmljZShtaW1pby0+aWRldi0+Z3JhYik7CisJCWVsc2UKKwkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJtaW1pby0+aWRldi0+Z3JhYiA9PSBOVUxMIgorCQkJCSIgLS0gZGlkbid0IGNhbGwgaW5wdXRfY2xvc2VfZGV2aWNlXG4iKTsKKwl9CisKKwl1c2JfZnJlZV91cmIobWltaW8tPmluLnVyYik7CisKKwl1c2JfZnJlZV91cmIobWltaW8tPm91dC51cmIpOworCisJaWYgKG1pbWlvLT5pbi5idWYpIHsKKwkJdXNiX2J1ZmZlcl9mcmVlKG1pbWlvLT51ZGV2LCBNSU1JT19NQVhQQVlMT0FELCBtaW1pby0+aW4uYnVmLAorCQkJCW1pbWlvLT5pbi5kbWEpOworCX0KKworCWlmIChtaW1pby0+b3V0LmJ1ZikKKwkJdXNiX2J1ZmZlcl9mcmVlKG1pbWlvLT51ZGV2LCBNSU1JT19NQVhQQVlMT0FELCBtaW1pby0+b3V0LmJ1ZiwKKwkJCQltaW1pby0+b3V0LmRtYSk7CisKKwlpZiAobWltaW8tPmlkZXYpCisJCWlucHV0X2ZyZWVfZGV2aWNlKG1pbWlvLT5pZGV2KTsKKworCWtmcmVlKG1pbWlvKTsKK30KKworc3RhdGljIHZvaWQgbWltaW9fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZjKQoreworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwlkb3duKCZkaXNjb25uZWN0X3NlbSk7CisKKwltaW1pbyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZjKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGlmYywgTlVMTCk7CisJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImRpc2Nvbm5lY3RcbiIpOworCisJaWYgKG1pbWlvKSB7CisJCW1pbWlvLT5wcmVzZW50ID0gMDsKKworCQlpZiAobWltaW8tPm9wZW4gPD0gMCkKKwkJCW1pbWlvX2RlYWxsb2MobWltaW8pOworCX0KKworCXVwKCZkaXNjb25uZWN0X3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgbWltaW9fZ3JlZXQoc3RydWN0IG1pbWlvICptaW1pbykKK3sKKwljb25zdCBzdHJ1Y3QgZ3J0cGt0IHsKKwkJaW50IG5ieXRlczsKKwkJdW5zaWduZWQgZGVsYXk7CisJCWNoYXIgZGF0YVs4XTsKKwl9IGdydHBrdHNbXSA9IHsKKwkJeyAzLCAwLCB7IDB4MTEsIDB4NTUsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHg1MywgMHg1NSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMCwgeyAweDQzLCAweDU1LCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAwLCB7IDB4MzMsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHgxMywgMHgwMCwgMHg1ZSwgMHgwMiwgMHg0ZiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMCwgeyAweDEzLCAweDAwLCAweDA0LCAweDAzLCAweDE0LCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAyLCB7IDB4MTMsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MTcsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHgxMywgMHgwMCwgMHgwZCwgMHgwOCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMCwgeyAweDEzLCAweDAwLCAweDRkLCAweDAxLCAweDVmLCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyAzLCAwLCB7IDB4ZjEsIDB4NTUsIDB4YTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDcsIDIsIHsgMHg1MiwgMHg1NSwgMHgwMCwgMHgwNywgMHgzMSwgMHg1NSwgMHg2NCwgMHgwMCB9IH0sCisJCXsgMCwgMCwgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwl9OworCWludCByc2x0OworCWNvbnN0IHN0cnVjdCBncnRwa3QgKnBrdDsKKworCWZvciAocGt0ID0gZ3J0cGt0czsgcGt0LT5uYnl0ZXM7IHBrdCsrKSB7CisJCXJzbHQgPSBtaW1pb190eChtaW1pbywgcGt0LT5kYXRhLCBwa3QtPm5ieXRlcyk7CisJCWlmIChyc2x0KQorCQkJcmV0dXJuIHJzbHQ7CisJCWlmIChwa3QtPmRlbGF5KQorCQkJbXNsZWVwKHBrdC0+ZGVsYXkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtaW1pb19pcnFfaW4oc3RydWN0IHVyYiAqdXJiKQoreworCWludCByc2x0OworCWNoYXIgKmRhdGE7CisJY29uc3QgY2hhciAqcmVhc29uID0gImdvaW5nIGRvd24iOworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwltaW1pbyA9IHVyYi0+Y29udGV4dDsKKworCWlmIChtaW1pbyA9PSBOVUxMKQorCQkvKiBwYXJhbm9pYSAqLworCQlyZXR1cm47CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoKKwkJcmVhc29uID0gInRpbWVvdXQgLS0gdW5wbHVnZ2VkPyI7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiJXMuXG4iLCByZWFzb24pOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInVua25vd24gdXJiLXN0YXR1czogJWQuXG4iLAorCQkJdXJiLT5zdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQorCWRhdGEgPSBtaW1pby0+aW4uYnVmOworCisJaWYgKG1pbWlvLT5yeGhhbmRsZXIpCisJCW1pbWlvLT5yeGhhbmRsZXIobWltaW8sIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CitleGl0OgorCS8qCisJICogS2VlcCBsaXN0ZW5pbmcgdG8gZGV2aWNlIG9uIHNhbWUgdXJiLgorCSAqLworCXJzbHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyc2x0KQorCQlkZXZfZXJyKCZtaW1pby0+aWRldi0+ZGV2LCAidXNiX3N1Ym1pdF91cmIgZmFpbHVyZTogJWQuXG4iLAorCQkJcnNsdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWlvX2lycV9vdXQoc3RydWN0IHVyYiAqdXJiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1pbWlvICptaW1pbzsKKworCW1pbWlvID0gdXJiLT5jb250ZXh0OworCisJaWYgKHVyYi0+c3RhdHVzKQorCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAidXJiLXN0YXR1czogJWQuXG4iLCB1cmItPnN0YXR1cyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWltaW8tPnR4bG9jaywgZmxhZ3MpOworCW1pbWlvLT50eGZsYWdzIHw9IE1JTUlPX1RYRE9ORTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaW1pby0+dHhsb2NrLCBmbGFncyk7CisJd21iKCk7CisJd2FrZV91cCgmbWltaW8tPndhaXRxKTsKK30KKworc3RhdGljIGludCBtaW1pb19vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmlkZXYpCit7CisJaW50IHJzbHQ7CisJc3RydWN0IG1pbWlvICptaW1pbzsKKworCXJzbHQgPSAwOworCWRvd24oJmRpc2Nvbm5lY3Rfc2VtKTsKKwltaW1pbyA9IGlucHV0X2dldF9kcnZkYXRhKGlkZXYpOworCWRldl9kYmcoJmlkZXYtPmRldiwgIm1pbWlvX29wZW5cbiIpOworCisJaWYgKG1pbWlvID09IE5VTEwpIHsKKwkJZGV2X2VycigmaWRldi0+ZGV2LCAibnVsbCBtaW1pby5cbiIpOworCQlyc2x0ID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWlmIChtaW1pby0+b3BlbisrKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAobWltaW8tPnByZXNlbnQgJiYgIW1pbWlvLT5ncmVldGVkKSB7CisJCXN0cnVjdCB1cmIgKnVyYiA9IG1pbWlvLT5pbi51cmI7CisJCW1pbWlvLT5pbi51cmItPmRldiA9IG1pbWlvLT51ZGV2OworCQlyc2x0ID0gdXNiX3N1Ym1pdF91cmIobWltaW8tPmluLnVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChyc2x0KSB7CisJCQlkZXZfZXJyKCZpZGV2LT5kZXYsICJ1c2Jfc3VibWl0X3VyYiBmYWlsdXJlICIKKwkJCQkiKHJlcyA9ICVkOiAlcykuIE5vdCBncmVldGluZy5cbiIsCisJCQkJcnNsdCwKKwkJCQkoIXVyYiA/ICJ1cmIgaXMgTlVMTCIgOgorCQkJCSAodXJiLT5oY3ByaXYgPyAidXJiLT5oY3ByaXYgaXMgbm9uLU5VTEwiIDoKKwkJCQkgICghdXJiLT5jb21wbGV0ZSA/ICJ1cmIgaXMgbm90IGNvbXBsZXRlIiA6CisJCQkJICAgKHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPD0gMCA/ICJ1cmIgaGFzIG5vIHBhY2tldHMiIDoKKwkJCQkgICAgKHVyYi0+aW50ZXJ2YWwgPD0gMCA/ICJ1cmIgaW50ZXJ2YWwgdG9vIHNtYWxsIiA6CisJCQkJICAgICAidXJiIGludGVydmFsIHRvbyBsYXJnZSBvciBzb21lIG90aGVyIGVycm9yIikpKSkpKTsKKwkJCXJzbHQgPSAtRUlPOworCQkJZ290byBleGl0OworCQl9CisJCXJzbHQgPSBtaW1pb19ncmVldChtaW1pbyk7CisJCWlmIChyc2x0ID09IDApIHsKKwkJCWRldl9kYmcoJmlkZXYtPmRldiwgIk1pbWlvIGdyZWV0ZWQgT0suXG4iKTsKKwkJCW1pbWlvLT5ncmVldGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJmlkZXYtPmRldiwgIk1pbWlvIGdyZWV0IEZhaWx1cmUgKCVkKVxuIiwKKwkJCQlyc2x0KTsKKwkJfQorCX0KKworZXhpdDoKKwl1cCgmZGlzY29ubmVjdF9zZW0pOworCXJldHVybiByc2x0OworfQorCitzdGF0aWMgaW50IG1pbWlvX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmMsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJY2hhciBwYXRoWzY0XTsKKwlpbnQgcGlwZSwgbWF4cDsKKwlzdHJ1Y3QgbWltaW8gKm1pbWlvOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmhvc3RpZmM7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCByZXMgPSAwOworCWludCBpOworCisJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaWZjKTsKKworCW1pbWlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1pbWlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtaW1pbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikgeworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWltaW8tPnVpZmMgPSBpZmM7CisJbWltaW8tPnVkZXYgPSB1ZGV2OworCW1pbWlvLT5wa3RidWYucCA9IG1pbWlvLT5wa3RidWYuYnVmOworCW1pbWlvLT5wa3RidWYucSA9IG1pbWlvLT5wa3RidWYuYnVmOworCS8qIGluaXRfaW5wdXRfZGV2KG1pbWlvLT5pZGV2KTsgKi8KKwltaW1pby0+aWRldiA9IGlucHV0X2RldjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaW1pby0+d2FpdHEpOworCXNwaW5fbG9ja19pbml0KCZtaW1pby0+dHhsb2NrKTsKKwlob3N0aWZjID0gaWZjLT5jdXJfYWx0c2V0dGluZzsKKworCWlmIChob3N0aWZjLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMikgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJVbmV4cGVjdGVkIGVuZHBvaW50IGNvdW50OiAlZC5cbiIsCisJCQlob3N0aWZjLT5kZXNjLmJOdW1FbmRwb2ludHMpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWltaW8tPmluLmRlc2MgPSAmKGhvc3RpZmMtPmVuZHBvaW50WzBdLmRlc2MpOworCW1pbWlvLT5vdXQuZGVzYyA9ICYoaG9zdGlmYy0+ZW5kcG9pbnRbMV0uZGVzYyk7CisKKwltaW1pby0+aW4uYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBNSU1JT19NQVhQQVlMT0FELCBHRlBfS0VSTkVMLAorCQkJCQkgJm1pbWlvLT5pbi5kbWEpOworCW1pbWlvLT5vdXQuYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBNSU1JT19NQVhQQVlMT0FELCBHRlBfS0VSTkVMLAorCQkJCQkgICZtaW1pby0+b3V0LmRtYSk7CisKKwlpZiAobWltaW8tPmluLmJ1ZiA9PSBOVUxMIHx8IG1pbWlvLT5vdXQuYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAidXNiX2J1ZmZlcl9hbGxvYyBmYWlsdXJlLlxuIik7CisJCW1pbWlvX2RlYWxsb2MobWltaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltaW1pby0+aW4udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwltaW1pby0+b3V0LnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAobWltaW8tPmluLnVyYiA9PSBOVUxMIHx8IG1pbWlvLT5vdXQudXJiID09IE5VTEwpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAidXNiX2FsbG9jX3VyYiBmYWlsdXJlLlxuIik7CisJCW1pbWlvX2RlYWxsb2MobWltaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBpbnB1dCB1cmIuCisJICovCisJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKHVkZXYsIG1pbWlvLT5pbi5kZXNjLT5iRW5kcG9pbnRBZGRyZXNzKTsKKwltYXhwID0gdXNiX21heHBhY2tldCh1ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisJaWYgKG1heHAgPiBNSU1JT19NQVhQQVlMT0FEKQorCQltYXhwID0gTUlNSU9fTUFYUEFZTE9BRDsKKwl1c2JfZmlsbF9pbnRfdXJiKG1pbWlvLT5pbi51cmIsIHVkZXYsIHBpcGUsIG1pbWlvLT5pbi5idWYsIG1heHAsCisJCQkgbWltaW9faXJxX2luLCBtaW1pbywgbWltaW8tPmluLmRlc2MtPmJJbnRlcnZhbCk7CisJbWltaW8tPmluLnVyYi0+dHJhbnNmZXJfZG1hID0gbWltaW8tPmluLmRtYTsKKwltaW1pby0+aW4udXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCS8qCisJICogQnVpbGQgdGhlIG91dHB1dCB1cmIuCisJICovCisJcGlwZSA9IHVzYl9zbmRpbnRwaXBlKHVkZXYsIG1pbWlvLT5vdXQuZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCWlmIChtYXhwID4gTUlNSU9fTUFYUEFZTE9BRCkKKwkJbWF4cCA9IE1JTUlPX01BWFBBWUxPQUQ7CisJdXNiX2ZpbGxfaW50X3VyYihtaW1pby0+b3V0LnVyYiwgdWRldiwgcGlwZSwgbWltaW8tPm91dC5idWYsIG1heHAsCisJCQkgbWltaW9faXJxX291dCwgbWltaW8sIG1pbWlvLT5vdXQuZGVzYy0+YkludGVydmFsKTsKKwltaW1pby0+b3V0LnVyYi0+dHJhbnNmZXJfZG1hID0gbWltaW8tPm91dC5kbWE7CisJbWltaW8tPm91dC51cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCisJLyoKKwkgKiBCdWlsZCBpbnB1dCBkZXZpY2UgaW5mbworCSAqLworCXVzYl9tYWtlX3BhdGgodWRldiwgcGF0aCwgNjQpOworCXNucHJpbnRmKG1pbWlvLT5waHlzLCBNSU1JT19NQVhOQU1FTEVOLCAiJXMvaW5wdXQwIiwgcGF0aCk7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBtaW1pbyk7CisJLyogaW5wdXRfZGV2LT5kZXYgPSAmaWZjLT5kZXY7ICovCisJaW5wdXRfZGV2LT5vcGVuID0gbWltaW9fb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gbWltaW9fY2xvc2U7CisJaW5wdXRfZGV2LT5uYW1lID0gbWltaW9fbmFtZTsKKwlpbnB1dF9kZXYtPnBoeXMgPSBtaW1pby0+cGh5czsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmaWZjLT5kZXY7CisKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfVVNCOworCWlucHV0X2Rldi0+aWQudmVuZG9yID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gfD0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKKwlmb3IgKGkgPSBCVE5fVE9PTF9QRU47IGkgPD0gTE9DQUxCVE5fVE9PTF9FWFRSQTI7ICsraSkKKwkJc2V0X2JpdChpLCBpbnB1dF9kZXYtPmtleWJpdCk7CisKKwlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fTUlTQyldIHw9IEJJVF9NQVNLKEJUTl8wKSB8CisJCQkJCQkgQklUX01BU0soQlROXzEpIHwKKwkJCQkJCSBCSVRfTUFTSyhCVE5fMikgfAorCQkJCQkJIEJJVF9NQVNLKEJUTl8zKSB8CisJCQkJCQkgQklUX01BU0soQlROXzQpIHwKKwkJCQkJCSBCSVRfTUFTSyhCVE5fNSk7CisJLyogICBpbnB1dF9kZXYtPmtleWJpdFtCVE5fTU9VU0VdIHw9IEJJVChCVE5fTEVGVCk7ICovCisJaW5wdXRfZGV2LT5hYnNiaXRbMF0gfD0gQklUX01BU0soQUJTX1gpIHwgQklUX01BU0soQUJTX1kpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIE1JTUlPX1hSQU5HRV9NQVgsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsIE1JTUlPX1lSQU5HRV9NQVgsIDAsIDApOworCWlucHV0X2Rldi0+YWJzYml0W0JJVF9XT1JEKEFCU19NSVNDKV0gfD0gQklUX01BU0soQUJTX01JU0MpOworCisjaWYgMAorCWlucHV0X2Rldi0+YWJzbWluW0FCU19YXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNtaW5bQUJTX1ldID0gMDsKKwlpbnB1dF9kZXYtPmFic21heFtBQlNfWF0gPSA5NjAwOworCWlucHV0X2Rldi0+YWJzbWF4W0FCU19ZXSA9IDQ4MDA7CisJaW5wdXRfZGV2LT5hYnNmdXp6W0FCU19YXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNmdXp6W0FCU19ZXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNmbGF0W0FCU19YXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNmbGF0W0FCU19ZXSA9IDA7CisjZW5kaWYKKworI2lmIDAKKwkvKiB0aGlzIHdpbGwganVzdCByZWR1Y2UgdGhlIHByZWNpc2lvbiAqLworCWlucHV0X2Rldi0+YWJzZnV6eltBQlNfWF0gPSA4OyAvKiBleHBlcmltZW50YWw7IG1heSBuZWVkIHRvIGNoYW5nZSAqLworCWlucHV0X2Rldi0+YWJzZnV6eltBQlNfWV0gPSA4OyAvKiBleHBlcmltZW50YWw7IG1heSBuZWVkIHRvIGNoYW5nZSAqLworI2VuZGlmCisKKwkvKgorCSAqIFJlZ2lzdGVyIHRoZSBpbnB1dCBkZXZpY2UuCisJICovCisJcmVzID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG1pbWlvLT5pZGV2KTsKKwlpZiAocmVzKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImlucHV0X3JlZ2lzdGVyX2RldmljZSBmYWlsdXJlICglZClcbiIsCisJCQlyZXMpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJpbnB1dDogJXMgb24gJXMgKHJlcyA9ICVkKS5cbiIsCisJCWlucHV0X2Rldi0+bmFtZSwgaW5wdXRfZGV2LT5waHlzLCByZXMpOworCisJdXNiX3NldF9pbnRmZGF0YShpZmMsIG1pbWlvKTsKKwltaW1pby0+cHJlc2VudCA9IDE7CisKKwkvKgorCSAqIFN1Ym1pdCB0aGUgaW5wdXQgdXJiIHRvIHRoZSB1c2Igc3Vic3lzdGVtLgorCSAqLworCW1pbWlvLT5pbi51cmItPmRldiA9IG1pbWlvLT51ZGV2OworCXJlcyA9IHVzYl9zdWJtaXRfdXJiKG1pbWlvLT5pbi51cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXMpIHsKKwkJZGV2X2VycigmbWltaW8tPmlkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWx1cmUgKCVkKVxuIiwKKwkJCXJlcyk7CisJCW1pbWlvX2RlYWxsb2MobWltaW8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gZ3JlZXQgdGhlIG1pbWlvIGFmdGVyIGdpdmluZworCSAqIGl0IHNvbWUgcG9zdC1pbml0IHNldHRsaW5nIHRpbWUuCisJICoKKwkgKiBub3RlOiBzb21ldGltZXMgdGhpcyBzbGVlcCBpbnRlcnZhbCBpc24ndAorCSAqIGxvbmcgZW5vdWdoIHRvIHBlcm1pdCB0aGUgZGV2aWNlIHRvIHJlLWluaXQKKwkgKiBhZnRlciBhIGhvdC1zd2FwOyBtYXliZSBuZWVkIHRvIGJ1bXAgaXQgdXAuCisJICoKKwkgKiBBcyBpdCBpcywgdGhpcyBwcm9iYWJseSBicmVha3MgbW9kdWxlIHVubG9hZGluZyBzdXBwb3J0IQorCSAqLworCW1zbGVlcCgxMDI0KTsKKworCXJlcyA9IG1pbWlvX2dyZWV0KG1pbWlvKTsKKwlpZiAocmVzID09IDApIHsKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgIk1pbWlvIGdyZWV0ZWQgT0suXG4iKTsKKwkJbWltaW8tPmdyZWV0ZWQgPSAxOworCQltaW1pby0+cnhoYW5kbGVyID0gbWltaW9fcnhfaGFuZGxlcjsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiTWltaW8gZ3JlZXQgRmFpbHVyZSAoJWQpXG4iLCByZXMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9taW1pb19yeF9wZW51cGRvd24oc3RydWN0IG1pbWlvICptaW1pbywKKwkJCQkgICAgIGludCBkb3duLAorCQkJCSAgICAgY29uc3QgY2hhciAqY29uc3QgaW5zdHJbXSwKKwkJCQkgICAgIGNvbnN0IGludCBpbnN0cl9vZnN0W10pCit7CisJaW50IHBlbmlkLCB4OworCWlmIChtaW1pby0+cGt0YnVmLnEgLSBtaW1pby0+cGt0YnVmLnAgPCAoZG93biA/IDQgOiAzKSkKKwkJcmV0dXJuIDE7IAkJLyogcGFydGlhbCBwa3QgKi8KKworCWlmIChkb3duKSB7CisJCXggPSAqbWltaW8tPnBrdGJ1Zi5wIF4gKihtaW1pby0+cGt0YnVmLnAgKyAxKSBeCisJCQkqKG1pbWlvLT5wa3RidWYucCArIDIpOworCQlpZiAoeCAhPSAqKG1pbWlvLT5wa3RidWYucCArIDMpKSB7CisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiRVZfUEVOJXM6IGJhZCB4c3VtLlxuIiwKKwkJCQlkb3duID8gIkRPV04iOiJVUCIpOworCQkJLyogc2tpcCB0aGlzIGV2ZW50IGRhdGEgKi8KKwkJCW1pbWlvLT5wa3RidWYucCArPSA0OworCQkJLyogZGVjb2RlIGFueSByZW1haW5pbmcgZXZlbnRzICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlwZW5pZCA9IG1pbWlvLT5wa3RidWYuaW5zdHIgPSAqKG1pbWlvLT5wa3RidWYucCArIDIpOworCQlpZiAocGVuaWQgPiBNSU1JT19QRU5fTUFYKSB7CisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LAorCQkJCSJVbm1hcHBlZCBwZW5JRCAobm90IGluIFswLCAlZF0pOiAlZFxuIiwKKwkJCQlNSU1JT19QRU5fTUFYLCAoaW50KW1pbWlvLT5wa3RidWYuaW5zdHIpOworCQkJcGVuaWQgPSBtaW1pby0+cGt0YnVmLmluc3RyID0gMDsKKwkJfQorCQltaW1pby0+bGFzdF9wZW5fZG93biA9IHBlbmlkOworCX0gZWxzZSB7CisJCXBlbmlkID0gbWltaW8tPmxhc3RfcGVuX2Rvd247CisJfQorCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICIlcyAoaWQgJWQsIGNvZGUgJWQpICVzLlxuIiwgaW5zdHJbcGVuaWRdLAorCQlpbnN0cl9vZnN0W3BlbmlkXSwgcGVuaWQsIGRvd24gPyAiZG93biIgOiAidXAiKTsKKworCWlmIChpbnN0cl9vZnN0W3BlbmlkXSA+PSAwKSB7CisJCWludCBjb2RlID0gQlROX1RPT0xfUEVOICsgaW5zdHJfb2ZzdFtwZW5pZF07CisJCWludCB2YWx1ZSA9IGRvd24gPyBET1dOVkFMVUUgOiBVUFZBTFVFOworCQlpZiAoY29kZSA+IEtFWV9NQVgpCisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiaW5wdXRfZXZlbnQgd2lsbCBpZ25vcmUgIgorCQkJCSItLSBjb2RlICglZCkgPiBLRVlfTUFYXG4iLCBjb2RlKTsKKwkJaWYgKCF0ZXN0X2JpdChjb2RlLCBtaW1pby0+aWRldi0+a2V5Yml0KSkKKwkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJpbnB1dF9ldmVudCB3aWxsIGlnbm9yZSAiCisJCQkJIi0tIGJpdCBmb3IgY29kZSAoJWQpIG5vdCBlbmFibGVkXG4iLCBjb2RlKTsKKwkJaWYgKCEhdGVzdF9iaXQoY29kZSwgbWltaW8tPmlkZXYtPmtleSkgPT0gdmFsdWUpCisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiaW5wdXRfZXZlbnQgd2lsbCBpZ25vcmUgIgorCQkJCSItLSBiaXQgZm9yIGNvZGUgKCVkKSBhbHJlYWR5IHNldCB0byAlZFxuIiwKKwkJCQljb2RlLCB2YWx1ZSk7CisJCWlmICh2YWx1ZSAhPSBET1dOVkFMVUUpIHsKKwkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJaW5wdXRfcmVwb3J0X2tleShtaW1pby0+aWRldiwgY29kZSwgdmFsdWUpOworCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCX0gZWxzZSB7CisJCQkvKiB3YWl0IHVudGlsIHdlIGdldCBzb21lIGNvb3JkaW5hdGVzICovCisJCX0KKwl9IGVsc2UgeworCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAicGVuSUQgb2Zmc2V0WyVkXSA9PSAlZCBpcyA8IDAgIgorCQkJIi0gbm90IHNlbmRpbmdcbiIsIHBlbmlkLCBpbnN0cl9vZnN0W3BlbmlkXSk7CisJfQorCW1pbWlvLT5wa3RidWYucCArPSBkb3duID8gNCA6IDM7IC8qIDMgZm9yIHVwLCA0IGZvciBkb3duICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGF5IHR1bmVkIGZvciBwYXJ0aWFsLXBhY2tldCBleGNpdGVtZW50LgorICoKKyAqIFRoaXMgcm91dGluZSBidWZmZXJzIGRhdGEgcGFja2V0cyByZWNlaXZlZCBmcm9tIHRoZSBtaW1pbyBkZXZpY2UKKyAqIGluIHRoZSBtaW1pbydzIGRhdGEgc3BhY2UuICBUaGlzIGJ1ZmZlcmluZyBpcyBuZWNlc3NhcnkgYmVjYXVzZQorICogdGhlIG1pbWlvJ3MgaW4gZW5kcG9pbnQgY2FuIHNlcnZlIHVzIHBhcnRpYWwgcGFja2V0cyBvZiBkYXRhLCBhbmQKKyAqIHdlIHdhbnQgdGhlIGRyaXZlciB0byBzdXBwb3J0IHRoZSBzZXJ2aWNpbmcgb2YgbXVsdGlwbGUgbWltaW9zLgorICogRW1waXJpY2FsIGV2aWRlbmNlIGdhdGhlcmVkIHNvIGZhciBzdWdnZXN0cyB0aGF0IHRoZSBtZXRob2Qgb2YKKyAqIGJ1ZmZlcmluZyBwYWNrZXQgZGF0YSBpbiB0aGUgbWltaW8ncyBkYXRhIHNwYWNlIHdvcmtzLiAgUHJldmlvdXMKKyAqIHZlcnNpb25zIG9mIHRoaXMgZHJpdmVyIGRpZCBub3QgYnVmZmVyIHBhY2tldCBkYXRhIGluIGVhY2ggbWltaW8ncworICogZGF0YS1zcGFjZSwgYW5kIHdlcmUgdGhlcmVmb3JlIG5vdCBhYmxlIHRvIHNlcnZpY2UgbXVsdGlwbGUgbWltaW9zLgorICogTm90ZSB0aGF0IHNpbmNlIHRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJ1bm5pbmcgaW4gaW50ZXJydXB0CisgKiBjb250ZXh0LCBjYXJlIG5lZWRzIHRvIGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IHRoaXMgcm91dGluZSBkb2VzIG5vdAorICogYmVjb21lIGJsb2F0ZWQsIGFuZCBpdCBtYXkgYmUgdGhhdCBhbm90aGVyIHNwaW5sb2NrIGlzIG5lZWRlZCBpbiBlYWNoCisgKiBtaW1pbyB0byBndWFyZCB0aGUgYnVmZmVyZWQgcGFja2V0IGRhdGEgcHJvcGVybHkuCisgKi8KK3N0YXRpYyB2b2lkIG1pbWlvX3J4X2hhbmRsZXIoc3RydWN0IG1pbWlvICptaW1pbywKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWltaW8tPmlkZXYtPmRldjsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluc3RyW10gPSB7CisJCSI/MCIsCisJCSJibGFjayBwZW4iLCAiYmx1ZSBwZW4iLCAiZ3JlZW4gcGVuIiwgInJlZCBwZW4iLAorCQkiYnJvd24gcGVuIiwgIm9yYW5nZSBwZW4iLCAicHVycGxlIHBlbiIsICJ5ZWxsb3cgcGVuIiwKKwkJImJpZyBlcmFzZXIiLCAibGlsIGVyYXNlciIsCisJCSI/MTEiLCAiPzEyIiwgIj8xMyIsICI/MTQiLCAiPzE1IiwgIj8xNiIsCisJCSJtaW1pbyBpbnRlcmFjdGl2ZSIsICJpbnRlcmFjdGl2ZSBidXR0b24xIiwKKwkJImludGVyYWN0aXZlIGJ1dHRvbjIiCisJfTsKKworCS8qIE1pbWlvIEludGVyYWN0aXZlIGdpdmVzOgorCSAqIGRvd246IFsweDIyIDB4MDEgMHgxMSAweDMyIDB4MjRdCisJICogYjEgIDogWzB4MjIgMHgwMSAweDEyIDB4MzEgMHgyNF0KKwkgKiBiMiAgOiBbMHgyMiAweDAxIDB4MTMgMHgzMCAweDI0XQorCSAqLworCXN0YXRpYyBjb25zdCBpbnQgaW5zdHJfb2ZzdFtdID0geworCQktMSwKKwkJMCwgMSwgMiwgMywKKwkJOSwgOSwgOSwgOSwKKwkJNCwgNSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJNiwgNywgOCwKKwl9OworCisJbWVtY3B5KG1pbWlvLT5wa3RidWYucSwgZGF0YSwgbmJ5dGVzKTsKKwltaW1pby0+cGt0YnVmLnEgKz0gbmJ5dGVzOworCisJd2hpbGUgKG1pbWlvLT5wa3RidWYucCA8IG1pbWlvLT5wa3RidWYucSkgeworCQlpbnQgdCA9ICptaW1pby0+cGt0YnVmLnA7CisJCXN3aXRjaCAodCkgeworCQljYXNlIE1JTUlPX0VWX1BFTlVQOgorCQljYXNlIE1JTUlPX0VWX1BFTkRPV046CisJCQlpZiAoaGFuZGxlX21pbWlvX3J4X3BlbnVwZG93bihtaW1pbywKKwkJCQkJCSAgICAgIHQgPT0gTUlNSU9fRVZfUEVORE9XTiwKKwkJCQkJCSAgICAgIGluc3RyLCBpbnN0cl9vZnN0KSkKKwkJCQlyZXR1cm47IC8qIHBhcnRpYWwgcGFja2V0ICovCisJCQlicmVhazsKKworCQljYXNlIE1JTUlPX0VWX1BFTkRBVEE6CisJCQlpZiAobWltaW8tPnBrdGJ1Zi5xIC0gbWltaW8tPnBrdGJ1Zi5wIDwgNikKKwkJCQkvKiBwYXJ0aWFsIHBrdCAqLworCQkJCXJldHVybjsKKwkJCXggPSAqbWltaW8tPnBrdGJ1Zi5wIF4gKihtaW1pby0+cGt0YnVmLnAgKyAxKSBeCisJCQkJKihtaW1pby0+cGt0YnVmLnAgKyAyKSBeCisJCQkJKihtaW1pby0+cGt0YnVmLnAgKyAzKSBeCisJCQkJKihtaW1pby0+cGt0YnVmLnAgKyA0KTsKKwkJCWlmICh4ICE9ICoobWltaW8tPnBrdGJ1Zi5wICsgNSkpIHsKKwkJCQlkZXZfZGJnKGRldiwgIkVWX1BFTkRBVEE6IGJhZCB4c3VtLlxuIik7CisJCQkJbWltaW8tPnBrdGJ1Zi5wICs9IDY7IC8qIHNraXAgdGhpcyBldmVudCBkYXRhICovCisJCQkJYnJlYWs7IC8qIGRlY29kZSBhbnkgcmVtYWluaW5nIGV2ZW50cyAqLworCQkJfQorCQkJeCA9ICoobWltaW8tPnBrdGJ1Zi5wICsgMSk7CisJCQl4IDw8PSA4OworCQkJeCB8PSAqKG1pbWlvLT5wa3RidWYucCArIDIpOworCQkJeSA9ICoobWltaW8tPnBrdGJ1Zi5wICsgMyk7CisJCQl5IDw8PSA4OworCQkJeSB8PSAqKG1pbWlvLT5wa3RidWYucCArIDQpOworCQkJZGV2X2RiZyhkZXYsICJjb29yZDogKCVkLCAlZClcbiIsIHgsIHkpOworCQkJaWYgKGluc3RyX29mc3RbbWltaW8tPnBrdGJ1Zi5pbnN0cl0gPj0gMCkgeworCQkJCWludCBjb2RlID0gQlROX1RPT0xfUEVOICsKKwkJCQkJICAgaW5zdHJfb2ZzdFttaW1pby0+bGFzdF9wZW5fZG93bl07CisjaWYgMAorCQkJCS8qIFV0dGVyIGhhY2sgdG8gZW5zdXJlIHdlIGdldCBmb3J3YXJkZWQgX0FORF8KKwkJCQkgKiBzbyB3ZSBjYW4gaWRlbnRpZnkgd2hlbiBhIGNvbXBsZXRlIHNpZ25hbCBpcworCQkJCSAqIHJlY2VpdmVkICovCisJCQkJbWltaW8tPmlkZXYtPmFic1tBQlNfWV0gPSAtMTsKKwkJCQltaW1pby0+aWRldi0+YWJzW0FCU19YXSA9IC0xOworI2VuZGlmCisJCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7ICovCisJCQkJaW5wdXRfcmVwb3J0X2FicyhtaW1pby0+aWRldiwgQUJTX1gsIHgpOworCQkJCWlucHV0X3JlcG9ydF9hYnMobWltaW8tPmlkZXYsIEFCU19ZLCB5KTsKKwkJCQkvKiBmYWtlIGEgcGVudXAgKi8KKwkJCQljaGFuZ2VfYml0KGNvZGUsIG1pbWlvLT5pZGV2LT5rZXkpOworCQkJCWlucHV0X3JlcG9ydF9rZXkobWltaW8tPmlkZXYsCisJCQkJCQkgY29kZSwKKwkJCQkJCSBET1dOVkFMVUUpOworCQkJCS8qIGFsd2F5cyBzeW5jIGhlcmUgKi8KKwkJCQltaW1pby0+aWRldi0+c3luYyA9IDA7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQl9CisJCQltaW1pby0+cGt0YnVmLnAgKz0gNjsKKwkJCWJyZWFrOworCQljYXNlIE1JTUlPX0VWX01FTVJFU0VUOgorCQkJaWYgKG1pbWlvLT5wa3RidWYucSAtIG1pbWlvLT5wa3RidWYucCA8IDcpCisJCQkJLyogcGFydGlhbCBwa3QgKi8KKwkJCQlyZXR1cm47CisJCQlkZXZfZGJnKGRldiwgIm1lbS1yZXNldC5cbiIpOworCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7ICovCisJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMCwgMSk7CisJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMCwgMCk7CisJCQlpbnB1dF9zeW5jKG1pbWlvLT5pZGV2KTsKKwkJCW1pbWlvLT5wa3RidWYucCArPSA3OworCQkJYnJlYWs7CisJCWNhc2UgTUlNSU9fRVZfQUNDOgorCQkJaWYgKG1pbWlvLT5wa3RidWYucSAtIG1pbWlvLT5wa3RidWYucCA8IDQpCisJCQkJLyogcGFydGlhbCBwa3QgKi8KKwkJCQlyZXR1cm47CisJCQl4ID0gKm1pbWlvLT5wa3RidWYucCBeICoobWltaW8tPnBrdGJ1Zi5wICsgMSkgXgorCQkJCSoobWltaW8tPnBrdGJ1Zi5wICsgMik7CisJCQlpZiAoeCAhPSAqKG1pbWlvLT5wa3RidWYucCArIDMpKSB7CisJCQkJZGV2X2RiZyhkZXYsICJFVl9BQ0M6IGJhZCB4c3VtLlxuIik7CisJCQkJbWltaW8tPnBrdGJ1Zi5wICs9IDQ7IC8qIHNraXAgdGhpcyBldmVudCBkYXRhICovCisJCQkJYnJlYWs7IC8qIGRlY29kZSBhbnkgcmVtYWluaW5nIGV2ZW50cyAqLworCQkJfQorCQkJc3dpdGNoICgqKG1pbWlvLT5wa3RidWYucCArIDIpKSB7CisJCQljYXNlIEFDQ19ORVdQQUdFOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJuZXctcGFnZS5cbiIpOworCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl8xLCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMSwgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19UQUdQQUdFOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJ0YWctcGFnZS5cbiIpOworCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl8yLCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMiwgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19QUklOVFBBR0U6CisJCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInByaW50LXBhZ2UuXG4iKTsKKwkJCQkvKiBpbnB1dF9yZWdzKG1pbWlvLT5pZGV2LCByZWdzKTsqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl8zLCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMywgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19NQVhJTUlaRToKKwkJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LAorCQkJCQkibWF4aW1pemUtd2luZG93LlxuIik7CisJCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7ICovCisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzQsIDEpOworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl80LCAwKTsKKwkJCQlpbnB1dF9zeW5jKG1pbWlvLT5pZGV2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNDX0ZJTkRDVExQTkw6CisJCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImZpbmQtY3RsLXBhbmVsLlxuIik7CisJCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7ICovCisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzUsIDEpOworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl81LCAwKTsKKwkJCQlpbnB1dF9zeW5jKG1pbWlvLT5pZGV2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNDX0RPTkU6CisJCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImFjYy1kb25lLlxuIik7CisJCQkJLyogbm8gZXZlbnQgaXMgZGlzcGF0Y2hlZCB0byB0aGUgaW5wdXQKKwkJCQkgKiBzdWJzeXN0ZW0gZm9yIHRoaXMgZGV2aWNlIGV2ZW50LgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXZfZGJnKGRldiwgInVua25vd24gYWNjIGV2ZW50LlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltaW1pby0+cGt0YnVmLnAgKz0gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbWltaW8tPnBrdGJ1Zi5wKys7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogTm8gcGFydGlhbCBldmVudCB3YXMgcmVjZWl2ZWQsIHNvIHJlc2V0IG1pbWlvJ3MgcGt0YnVmIHB0cnMuCisJICovCisJbWltaW8tPnBrdGJ1Zi5wID0gbWltaW8tPnBrdGJ1Zi5xID0gbWltaW8tPnBrdGJ1Zi5idWY7Cit9CisKK3N0YXRpYyBpbnQgbWltaW9fdHgoc3RydWN0IG1pbWlvICptaW1pbywgY29uc3QgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQoreworCWludCByc2x0OworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAoIShpc3ZhbGlkdHhzaXplKG5ieXRlcykpKSB7CisJCWRldl9lcnIoJm1pbWlvLT5pZGV2LT5kZXYsICJpbnZhbGlkIGFyZzogbmJ5dGVzOiAlZC5cbiIsCisJCQluYnl0ZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEluaXQgdGhlIG91dCB1cmIgYW5kIGNvcHkgdGhlIGRhdGEgdG8gc2VuZC4KKwkgKi8KKwltaW1pby0+b3V0LnVyYi0+ZGV2ID0gbWltaW8tPnVkZXY7CisJbWltaW8tPm91dC51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBuYnl0ZXM7CisJbWVtY3B5KG1pbWlvLT5vdXQudXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgbmJ5dGVzKTsKKworCS8qCisJICogU2VuZCB0aGUgZGF0YS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWltaW8tPnR4bG9jaywgZmxhZ3MpOworCW1pbWlvLT50eGZsYWdzID0gTUlNSU9fVFhXQUlUOworCXJzbHQgPSB1c2Jfc3VibWl0X3VyYihtaW1pby0+b3V0LnVyYiwgR0ZQX0FUT01JQyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWltaW8tPnR4bG9jaywgZmxhZ3MpOworCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJyc2x0OiAlZC5cbiIsIHJzbHQpOworCisJaWYgKHJzbHQpIHsKKwkJZGV2X2VycigmbWltaW8tPmlkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWx1cmU6ICVkLlxuIiwKKwkJCXJzbHQpOworCQlyZXR1cm4gcnNsdDsKKwl9CisKKwkvKgorCSAqIFdhaXQgZm9yIGNvbXBsZXRpb24gdG8gYmUgc2lnbmFsbGVkICh0aGUgbWltaW9faXJxX291dAorCSAqIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIG9yIE1JTUlPX1RYRE9ORSBpbiB3aXRoIHR4ZmxhZ3MpLgorCSAqLworCXRpbWVvdXQgPSBIWjsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKCZtaW1pby0+d2FpdHEsICZ3YWl0KTsKKworCXdoaWxlICh0aW1lb3V0ICYmICgobWltaW8tPnR4ZmxhZ3MgJiBNSU1JT19UWERPTkUpID09IDApKSB7CisJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQlybWIoKTsKKwl9CisKKwlpZiAoKG1pbWlvLT50eGZsYWdzICYgTUlNSU9fVFhET05FKSA9PSAwKQorCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAidHggdGltZWQgb3V0LlxuIik7CisKKwkvKgorCSAqIE5vdyB0aGF0IGNvbXBsZXRpb24gaGFzIGJlZW4gc2lnbmFsbGVkLAorCSAqIHVubGluayB0aGUgdXJiIHNvIHRoYXQgaXQgY2FuIGJlIHJlY3ljbGVkLgorCSAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJm1pbWlvLT53YWl0cSwgJndhaXQpOworCXVzYl91bmxpbmtfdXJiKG1pbWlvLT5vdXQudXJiKTsKKworCXJldHVybiByc2x0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBtaW1pb19pbml0KHZvaWQpCit7CisJaW50IHJzbHQ7CisKKwlyc2x0ID0gdXNiX3JlZ2lzdGVyKCZtaW1pb19kcml2ZXIpOworCWlmIChyc2x0ICE9IDApIHsKKwkJZXJyKCIlczogdXNiX3JlZ2lzdGVyIGZhaWx1cmU6ICVkIiwgX19mdW5jX18sIHJzbHQpOworCQlyZXR1cm4gcnNsdDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6IgorCSAgICAgICBEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CisJcmV0dXJuIHJzbHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtaW1pb19leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJm1pbWlvX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1pbWlvX2luaXQpOworbW9kdWxlX2V4aXQobWltaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Ftc2R1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvYW1zZHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTEyM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Ftc2R1LmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZHZXRBbXNkdVN1YkZyYW1lICAgICAgICAgICovCisvKiAgICAgIEdldCBhIHN1YmZyYW1lIGZyb20gYS1NU0RVLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBBLU1TRFUgZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogb2Zmc2V0IG9mIHN1YmZyYW1lIGluIHRoZSBBLU1TRFUgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTlVMTCBvciBzdWJmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZHZXRBbXNkdVN1YkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIG9mZnNldCkKK3sKKyAgICB1MTZfdCBzdWJmcmFtZUxlbjsKKyAgICB1MTZfdCBhbXNkdUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIHpidWZfdCogbmV3QnVmOworCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfQU1TRFUoZGV2LCBidWYsIGFtc2R1TGVuKTsKKworICAgIC8qIFZlcmlmeSBBLU1TRFUgbGVuZ3RoICovCisgICAgaWYgKGFtc2R1TGVuIDwgKCpvZmZzZXQgKyAxNCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBMb2NhdGUgQS1NU0RVIHN1YmZyYW1lIGJ5IG9mZnNldCBhbmQgdmVyaWZ5IHN1YmZyYW1lIGxlbmd0aCAqLworICAgIHN1YmZyYW1lTGVuID0gKHptd19idWZfcmVhZGIoZGV2LCBidWYsICpvZmZzZXQgKyAxMikgPDwgOCkgKworICAgICAgICAgICAgICAgICAgem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKm9mZnNldCArIDEzKTsKKyAgICBpZiAoc3ViZnJhbWVMZW4gPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIFZlcmlmeSBBLU1TRFUgc3ViZnJhbWUgbGVuZ3RoICovCisgICAgaWYgKCgqb2Zmc2V0KzE0K3N1YmZyYW1lTGVuKSA8PSBhbXNkdUxlbikKKyAgICB7CisgICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlciAqLworICAgICAgICBpZiAoKG5ld0J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMjQrMitzdWJmcmFtZUxlbikpICE9IE5VTEwpCisgICAgICAgIHsKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgICAgIC8qIENvcHkgYW5kIGNvbnZlcnQgc3ViZnJhbWUgdG8gd2xhbiBmcmFtZSBmb3JtYXQgKi8KKyAgICAgICAgICAgIC8qIFNIQUxMIE5PVCBJTkNMVURFIFFPUyBhbmQgQU1TRFUgaGVhZGVyLiBSYXkgMjAwNzA4MDcgRm9yIFZpc3RhICovCisgICAgICAgICAgICB6ZlJ4QnVmZmVyQ29weShkZXYsIG5ld0J1ZiwgYnVmLCAwLCAwLCAyNCk7CisgICAgICAgICAgICB6ZlJ4QnVmZmVyQ29weShkZXYsIG5ld0J1ZiwgYnVmLCAyNCwgKm9mZnNldCsxNCwgc3ViZnJhbWVMZW4pOworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIG5ld0J1ZiwgMjQrc3ViZnJhbWVMZW4pOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENvcHkgc3ViZnJhbWUgdG8gbmV3IGJ1ZmZlciAqLworICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCBuZXdCdWYsIGJ1ZiwgMCwgKm9mZnNldCwgMTQrc3ViZnJhbWVMZW4pOworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIG5ld0J1ZiwgMTQrc3ViZnJhbWVMZW4pOworI2VuZGlmCisgICAgICAgICAgICAvKiBVcGRhdGUgb2Zmc2V0ICovCisgICAgICAgICAgICAqb2Zmc2V0ICs9ICgoKDE0K3N1YmZyYW1lTGVuKSszKSAmIDB4ZmZmYyk7CisKKyAgICAgICAgICAgIC8qIFJldHVybiBidWZmZXIgcG9pbnRlciAqLworICAgICAgICAgICAgcmV0dXJuIG5ld0J1ZjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZEZUFtc2R1ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIERlLUFNU0RVLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBBLU1TRFUgZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFwIDogVkFQIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZEZUFtc2R1KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5TW9kZSkKK3sKKyAgICB1MTZfdCBvZmZzZXQgPSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIrWk1fU0laRV9PRl9RT1NfQ1RSTDsKKyAgICB6YnVmX3QqIHN1YmZyYW1lQnVmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIGlmIChlbmNyeU1vZGUgPT0gWk1fQUVTIHx8IGVuY3J5TW9kZSA9PSBaTV9US0lQKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ICs9IChaTV9TSVpFX09GX0lWICsgWk1fU0laRV9PRl9FWFRfSVYpOworICAgIH0KKyAgICBlbHNlIGlmIChlbmNyeU1vZGUgPT0gWk1fV0VQNjQgfHwgZW5jcnlNb2RlID09IFpNX1dFUDEyOCkKKyAgICB7CisgICAgICAgIG9mZnNldCArPSBaTV9TSVpFX09GX0lWOworICAgIH0KKworICAgIC8qIFJlcGVhdGx5IGNhbGxpbmcgemZHZXRBbXNkdVN1YkZyYW1lKCkgdW50aWwgTlVMTCByZXR1cm5lZCAqLworICAgIHdoaWxlICgoc3ViZnJhbWVCdWYgPSB6ZkdldEFtc2R1U3ViRnJhbWUoZGV2LCBidWYsICZvZmZzZXQpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQrKzsKKyAgICAgICAgaWYgKHdkLT56ZmNiUmVjdkV0aCAhPSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICB3ZC0+emZjYlJlY3ZFdGgoZGV2LCBzdWJmcmFtZUJ1ZiwgKHU4X3QpdmFwKTsKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX01TRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgIH0KKyAgICB9CisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NhZ2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZkMDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NhZ2cuYwpAQCAtMCwwICsxLDM2MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGNhZ2cuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgQS1NUERVIGFnZ3JlZ2F0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zLiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2V4dGVybiB1OF90IHpjVXBUb0FjWzhdOworY29uc3QgdThfdCBwcmlbXSA9IHszLDMsMiwzLDIsMSwzLDIsMSwwfTsKKworCit1MTZfdCBhZ2dyX2NvdW50OwordTMyX3Qgc3VjY2Vzc19tcGR1OwordTMyX3QgdG90YWxfbXBkdTsKKwordm9pZCB6ZkFnZ0luaXQoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaSxqOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICAvKgorICAgICAqIHJlc2V0IHN0YSBpbmZvcm1hdGlvbgorICAgICAqLworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+YWdnSW5pdGlhdGVkID0gMDsKKyAgICB3ZC0+YWRkYmFDb21wbGV0ZSA9IDA7CisgICAgd2QtPmFkZGJhQ291bnQgPSAwOworICAgIHdkLT5yZW9yZGVyID0gMTsKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaj0wOyBqPFpNX0FDOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPmFnZ1N0YVtpXS5hZ2dRTnVtYmVyW2pdID0gWk1fQUdHX1BPT0xfU0laRTsKKyAgICAgICAgICAgIHdkLT5hZ2dTdGFbaV0uYWdnRmxhZ1tqXSA9IHdkLT5hZ2dTdGFbaV0uY291bnRbal0gPSAwOworICAgICAgICAgICAgd2QtPmFnZ1N0YVtpXS50aWRfdHhbal0gPSBOVUxMOworICAgICAgICAgICAgd2QtPmFnZ1N0YVtpXS50aWRfdHhbaisxXSA9IE5VTEw7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogcmVzZXQgVHgvUnggYWdncmVnYXRpb24gcXVldWUgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICB3ZC0+YWdnU3RhdGUgPSAwOworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIHJlc2V0IHR4IGFnZ3JlZ2F0aW9uIHF1ZXVlCisgICAgICAgICAqLworICAgICAgICB3ZC0+YWdnUVBvb2xbaV0gPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgYWdnUXVldWUpKTsKKyAgICAgICAgaWYoIXdkLT5hZ2dRUG9vbFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3ZC0+YWdnUVBvb2xbaV0tPmFnZ0hlYWQgPSB3ZC0+YWdnUVBvb2xbaV0tPmFnZ1RhaWwgPQorICAgICAgICB3ZC0+YWdnUVBvb2xbaV0tPmFnZ1FFbmFibGVkID0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dSZWFkeSA9CisgICAgICAgIHdkLT5hZ2dRUG9vbFtpXS0+Y2xlYXJGbGFnID0gd2QtPmFnZ1FQb29sW2ldLT5kZWxldGVGbGFnID0gMDsKKyAgICAgICAgLy93ZC0+YWdnUVBvb2xbaV0tPmFnZ1NpemUgPSAxNjsKKworICAgICAgICAvKgorICAgICAgICAgKiByZXNldCByeCBhZ2dyZWdhdGlvbiBxdWV1ZQorICAgICAgICAgKi8KKyAgICAgICAgd2QtPnRpZF9yeFtpXSA9IHpmd01lbUFsbG9jYXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBhZ2dfdGlkX3J4KSk7CisgICAgICAgIGlmICghd2QtPnRpZF9yeFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3ZC0+dGlkX3J4W2ldLT5haWQgPSBaTV9NQVhfU1RBX1NVUFBPUlQ7CisgICAgICAgIHdkLT50aWRfcnhbaV0tPnNlcV9zdGFydCA9IHdkLT50aWRfcnhbaV0tPmJhd19oZWFkID0gXAorICAgICAgICB3ZC0+dGlkX3J4W2ldLT5iYXdfdGFpbCA9IDA7CisgICAgICAgIHdkLT50aWRfcnhbaV0tPnNxX2V4Y2VlZF9jb3VudCA9IHdkLT50aWRfcnhbaV0tPnNxX2JlaGluZF9jb3VudCA9IDA7CisgICAgICAgIGZvciAoaj0wOyBqPD1aTV9BR0dfQkFXX1NJWkU7IGorKykKKyAgICAgICAgICAgIHdkLT50aWRfcnhbaV0tPmZyYW1lW2pdLmJ1ZiA9IDA7CisgICAgICAgIC8qCisgICAgICAgICAqIHJlc2V0IEFEREJBIGV4Y2hhbmdlIHN0YXR1cyBjb2RlCisgICAgICAgICAqIDA6IE5VTEwKKyAgICAgICAgICogMTogQUREQkEgUmVxdWVzdCBzZW50L3JlY2VpdmVkCisgICAgICAgICAqIDI6IEFDSyBmb3IgQUREQkEgUmVxdWVzdCBzZW50L3JlY2VpdmVkCisgICAgICAgICAqIDM6IEFEREJBIFJlc3BvbnNlIHNlbnQvcmVjZWl2ZWQKKyAgICAgICAgICogNDogQUNLIGZvciBBRERCQSBSZXNwb25zZSBzZW50L3JlY2VpdmVkCisgICAgICAgICAqLworICAgICAgICB3ZC0+dGlkX3J4W2ldLT5hZGRCYUV4Y2hhbmdlU3RhdHVzQ29kZSA9IDA7CisKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6ZkFnZ1RhbGx5UmVzZXQoZGV2KTsKKyAgICBERVNUUS5pbml0ID0gemZBZ2dEZXN0SW5pdDsKKyAgICBERVNUUS5pbml0KGRldik7CisgICAgd2QtPmFnZ0luaXRpYXRlZCA9IDE7CisgICAgYWdncl9jb3VudCA9IDA7CisgICAgc3VjY2Vzc19tcGR1ID0gMDsKKyAgICB0b3RhbF9tcGR1ID0gMDsKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKKyAgICBCQVcgPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgYmF3X2VuYWJsZXIpKTsKKyAgICBpZighQkFXKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBCQVctPmluaXQgPSB6ZkJhd0luaXQ7CisgICAgQkFXLT5pbml0KGRldik7CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ0dldFN0YSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIFNUQSBBSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgYnVmIGFzIGlucHV0LCB1c2UgdGhlIGRlc3QgYWRkcmVzcyBvZiBidWYgYXMgaW5kZXggdG8gICAgICAqLworLyogICAgICBzZWFyY2ggU1RBIEFJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIGZvciBvbmUgcGFydGljdWxhciBwYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK3UxNl90IHpmQWdnR2V0U3RhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBkc3RbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZHN0WzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZCA9IDA7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyNpZiBaTV9BR0dfRlBHQV9ERUJVRworICAgIGlkID0gMDsKKyNlbmRpZgorCisgICAgcmV0dXJuIGlkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4R2V0UXVldWUgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIFF1ZXVlIFBvb2wgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgYWlkIGFzIGlucHV0LCBsb29rIGZvciB0aGUgcXVldWUgaW5kZXggYXNzb2NpYXRlZCAgICAgICAgICAqLworLyogICAgICB3aXRoIHRoaXMgYWlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWlkIDogYXNzb2NpYXRlZCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUXVldWUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RJRF9UWCB6ZkFnZ1R4R2V0UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFpZCwgdTE2X3QgdGlkKQoreworICAgIC8vdTE2X3QgICBpOworICAgIFRJRF9UWCAgdGlkX3R4OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogbm90IGEgU1RBIGFpZAorICAgICAqLworICAgIGlmICgweGZmZmYgPT0gYWlkKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHRpZF90eCA9IHdkLT5hZ2dTdGFbYWlkXS50aWRfdHhbdGlkXTsKKyAgICBpZiAoIXRpZF90eCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKDAgPT0gdGlkX3R4LT5hZ2dRRW5hYmxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gdGlkX3R4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeE5ld1F1ZXVlICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBRdWV1ZSBQb29sIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIGFpZCBhcyBpbnB1dCwgZmluZCBhIG5ldyBxdWV1ZSBmb3IgdGhpcyBhaWQuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWlkIDogYXNzb2NpYXRlZCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUXVldWUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RJRF9UWCB6ZkFnZ1R4TmV3UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFpZCwgdTE2X3QgdGlkLCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCAgIGk7CisgICAgVElEX1RYICB0aWRfdHg9TlVMTDsKKyAgICB1MTZfdCAgIGFjID0gemNVcFRvQWNbdGlkJjB4N10gJiAweDM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogbm90IGEgU1RBIGFpZAorICAgICAqLworICAgIGlmICgweGZmZmYgPT0gYWlkKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKgorICAgICAqIGZpbmQgb25lIG5ldyBxdWV1ZSBmb3Igc3RhCisgICAgICovCisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIHRoaXMgcSBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aWRfdHggPSB3ZC0+YWdnUVBvb2xbaV07CisgICAgICAgICAgICB0aWRfdHgtPmFnZ1FFbmFibGVkID0gMTsKKyAgICAgICAgICAgIHRpZF90eC0+YWdnUVNUQSA9IGFpZDsKKyAgICAgICAgICAgIHRpZF90eC0+YWMgPSBhYzsKKyAgICAgICAgICAgIHRpZF90eC0+dGlkID0gdGlkOworICAgICAgICAgICAgdGlkX3R4LT5hZ2dIZWFkID0gdGlkX3R4LT5hZ2dUYWlsID0gdGlkX3R4LT5zaXplID0gMDsKKyAgICAgICAgICAgIHRpZF90eC0+YWdnUmVhZHkgPSAwOworICAgICAgICAgICAgd2QtPmFnZ1N0YVthaWRdLnRpZF90eFt0aWRdID0gdGlkX3R4OworICAgICAgICAgICAgdGlkX3R4LT5kc3RbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIHRpZF90eC0+ZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgICAgICAgICB0aWRfdHgtPmRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHRpZF90eDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4RW5xdWV1ZSAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIFN0YXR1cyBjb2RlIFpNX1NVQ0NFU1Mgb3IgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGFpZCxhYyxxbnVtLGJ1ZikgYXMgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhaWQgOiBhc3NvY2lhdGVkIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHFudW06IHRoZSBxdWV1ZSBudW1iZXIgdG8gd2hpY2ggd2lsbCBiZSBlbnF1ZXVlZCAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiB0aGUgcGFja2V0IHRvIGJlIHF1ZXVlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdGF0dXMgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBZ2dUeEVucXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQsIFRJRF9UWCB0aWRfdHgpCit7CisgICAgLy91MTZfdCAgIHFsZW4sIGZyYW1lTGVuOworICAgIHUzMl90ICAgdGltZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisKKyAgICBpZiAodGlkX3R4LT5zaXplIDwgKFpNX0FHR1FfU0laRSAtIDIpKQorICAgIHsKKyAgICAgICAgLyogUXVldWUgbm90IGZ1bGwgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIGJ1ZmZlciBjb3B5CisgICAgICAgICAqIGluIHpmd0J1ZkZyZWUgd2lsbCByZXR1cm4gYSBuZGlzbXNlbmRjb21wbGV0ZQorICAgICAgICAgKiB0byByZXNvbHZlIHRoZSBzeW5jaHJvbml6ZSBwcm9ibGVtIGluIGFnZ3JlZ2F0ZQorICAgICAgICAgKi8KKworICAgICAgICB1OF90ICAgIHNlbmRDb21wbGV0ZSA9IDA7CisKKyAgICAgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnSGVhZF0uYnVmID0gYnVmOworICAgICAgICB0aW1lID0gem1fYWdnX0dldFRpbWUoKTsKKyAgICAgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnSGVhZF0uYXJyaXZhbFRpbWUgPSB0aW1lOworICAgICAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dIZWFkXS5iYXdfcmV0cmFuc21pdCA9IDA7CisKKyAgICAgICAgdGlkX3R4LT5hZ2dIZWFkID0gKCh0aWRfdHgtPmFnZ0hlYWQgKyAxKSAmIFpNX0FHR1FfU0laRV9NQVNLKTsKKyAgICAgICAgdGlkX3R4LT5sYXN0QXJyaXZhbCA9IHRpbWU7CisgICAgICAgIHRpZF90eC0+c2l6ZSsrOworICAgICAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICAgICAgaWYgKGJ1ZiAmJiAodGlkX3R4LT5zaXplIDwgKFpNX0FHR1FfU0laRSAtIDEwKSkpIHsKKyAgICAgICAgICAgIHRpZF90eC0+Y29tcGxldGUgPSB0aWRfdHgtPmFnZ0hlYWQ7CisgICAgICAgICAgICBzZW5kQ29tcGxldGUgPSAxOworICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgaWYgKCFERVNUUS5leGlzdChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCkpIHsKKyAgICAgICAgICAgIERFU1RRLmluc2VydChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAidGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgidGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisKKyAgICAgICAgaWYgKGJ1ZiAmJiBzZW5kQ29tcGxldGUgJiYgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uKSB7CisgICAgICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB3ZC0+emZjYlNlbmRDb21wbGV0ZUluZGljYXRpb24oZGV2LCBidWYpOworICAgICAgICB9CisKKyAgICAgICAgLyppZiAodGlkX3R4LT5zaXplID49IDE2ICYmIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSA+IDIwKQorICAgICAgICAgICAgemZBZ2dUeFNlbmQoZGV2LCB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldiksIHRpZF90eCk7CisgICAgICAgICovCisgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiY2FuJ3QgZW5xdWV1ZSwgdGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFF1ZXVlIEZ1bGwKKyAgICAgICAgICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogem1fbXNnMV9hZ2coWk1fTFZfMCwgIlF1ZXVlIGZ1bGwsIHFudW0gPSAiLCBxbnVtKTsKKyAgICAgICAgICogd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgICogemZ3QnVmRnJlZShkZXYsIGJ1ZiwgWk1fU1VDQ0VTUyk7CisgICAgICAgICAqIHptX21zZzFfYWdnKFpNX0xWXzEsICJQYWNrZXQgZGlzY2FyZGVkLCBWVFhRIGZ1bGwsIGFjPSIsIGFjKTsKKyAgICAgICAgICoKKyAgICAgICAgICogcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgICAgICAgKi8KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCFERVNUUS5leGlzdChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCkpIHsKKyAgICAgICAgICAgIERFU1RRLmluc2VydChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworfQorCit1MTZfdCAgICB6ZkFnZ0Rlc3RFeGlzdCh6ZGV2X3QqIGRldiwgdTE2X3QgUXR5cGUsIHUxNl90IGFjLCBUSURfVFggdGlkX3R4LCB2b2lkKiB2dHhxKSB7CisgICAgc3RydWN0IGRlc3QqIGRlc3Q7CisgICAgdTE2X3QgICBleGlzdCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCFERVNUUS5IZWFkW2FjXSkgeworICAgICAgICBleGlzdCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkZXN0ID0gREVTVFEuSGVhZFthY107CisgICAgICAgIGlmIChkZXN0LT50aWRfdHggPT0gdGlkX3R4KSB7CisgICAgICAgICAgICBleGlzdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoZGVzdC0+bmV4dCAhPSBERVNUUS5IZWFkW2FjXSkgeworICAgICAgICAgICAgICAgIGRlc3QgPSBkZXN0LT5uZXh0OworICAgICAgICAgICAgICAgIGlmIChkZXN0LT50aWRfdHggPT0gdGlkX3R4KXsKKyAgICAgICAgICAgICAgICAgICAgZXhpc3QgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIGV4aXN0OworfQorCit2b2lkICAgIHpmQWdnRGVzdEluc2VydCh6ZGV2X3QqIGRldiwgdTE2X3QgUXR5cGUsIHUxNl90IGFjLCBUSURfVFggdGlkX3R4LCB2b2lkKiB2dHhxKQoreworICAgIHN0cnVjdCBkZXN0KiBuZXdfZGVzdDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgbmV3X2Rlc3QgPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgZGVzdCkpOworICAgIGlmKCFuZXdfZGVzdCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbmV3X2Rlc3QtPlF0eXBlID0gUXR5cGU7CisgICAgbmV3X2Rlc3QtPnRpZF90eCA9IHRpZF90eDsKKyAgICBpZiAoMCA9PSBRdHlwZSkKKyAgICAgICAgbmV3X2Rlc3QtPnRpZF90eCA9IHRpZF90eDsKKyAgICBlbHNlCisgICAgICAgIG5ld19kZXN0LT52dHhxID0gdnR4cTsKKyAgICBpZiAoIURFU1RRLkhlYWRbYWNdKSB7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgbmV3X2Rlc3QtPm5leHQgPSBuZXdfZGVzdDsKKyAgICAgICAgREVTVFEuSGVhZFthY10gPSBERVNUUS5kZXN0W2FjXSA9IG5ld19kZXN0OworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBuZXdfZGVzdC0+bmV4dCA9IERFU1RRLmRlc3RbYWNdLT5uZXh0OworICAgICAgICBERVNUUS5kZXN0W2FjXS0+bmV4dCA9IG5ld19kZXN0OworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworCisgICAgLy9ERVNUUS5zaXplW2FjXSsrOworICAgIHJldHVybjsKK30KKwordm9pZCAgICB6ZkFnZ0Rlc3REZWxldGUoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCBUSURfVFggdGlkX3R4LCB2b2lkKiB2dHhxKQoreworICAgIHN0cnVjdCBkZXN0KiBkZXN0LCAqdGVtcDsKKyAgICB1MTZfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPmRlc3RMb2NrKSB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgaWYgKCFERVNUUS5IZWFkW2ldKSBjb250aW51ZTsKKyAgICAgICAgZGVzdCA9IERFU1RRLkhlYWRbaV07CisgICAgICAgIGlmICghZGVzdCkgY29udGludWU7CisKKworICAgICAgICB3aGlsZSAoZGVzdCAmJiAoZGVzdC0+bmV4dCAhPSBERVNUUS5IZWFkW2ldKSkgeworICAgICAgICAgICAgaWYgKFF0eXBlID09IDAgJiYgZGVzdC0+bmV4dC0+dGlkX3R4ID09IHRpZF90eCl7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUXR5cGUgPT0gMSAmJiBkZXN0LT5uZXh0LT52dHhxID09IHZ0eHEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3QgPSBkZXN0LT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChRdHlwZSA9PSAwICYmIGRlc3QtPm5leHQtPnRpZF90eCA9PSB0aWRfdHgpIHx8IChRdHlwZSA9PSAxICYmIGRlc3QtPm5leHQtPnZ0eHEgPT0gdnR4cSkpIHsKKworICAgICAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgICAgICBpZiAodGlkX3R4LT5zaXplKSB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIURFU1RRLkhlYWRbaV0pIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAgPSBkZXN0LT5uZXh0OworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IGRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgREVTVFEuSGVhZFtpXSA9IERFU1RRLmRlc3RbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAvL0RFU1RRLnNpemVbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdC0+bmV4dCA9IGRlc3QtPm5leHQtPm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsvKiBkbyBub3RoaW5nICovfSAvL3pmd01lbUZyZWUoZGV2LCB0ZW1wLCBzaXplb2Yoc3RydWN0IGRlc3QpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZndNZW1GcmVlKGRldiwgdGVtcCwgc2l6ZW9mKHN0cnVjdCBkZXN0KSk7CisKKyAgICAgICAgICAgIC8qem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmIChERVNUUS5zaXplW2ldID4gMCkKKyAgICAgICAgICAgICAgICBERVNUUS5zaXplW2ldLS07CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgKi8KKyAgICAgICAgfQorCisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkICAgIHpmQWdnRGVzdEluaXQoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgLy93ZC0+ZGVzdFEuSGVhZFtpXS5uZXh0ID0gd2QtPmRlc3RRLkhlYWRbaV07CisgICAgICAgIC8vd2QtPmRlc3RRLmRlc3RbaV0gPSB3ZC0+ZGVzdFEuSGVhZFtpXTsKKyAgICAgICAgLy9ERVNUUS5zaXplW2ldID0gMDsKKyAgICAgICAgREVTVFEuSGVhZFtpXSA9IE5VTEw7CisgICAgfQorICAgIERFU1RRLmluc2VydCAgPSB6ZkFnZ0Rlc3RJbnNlcnQ7CisgICAgREVTVFEuZGVsZXRlICA9IHpmQWdnRGVzdERlbGV0ZTsKKyAgICBERVNUUS5pbml0ICAgID0gemZBZ2dEZXN0SW5pdDsKKyAgICBERVNUUS5nZXROZXh0ID0gemZBZ2dEZXN0R2V0TmV4dDsKKyAgICBERVNUUS5leGlzdCAgID0gemZBZ2dEZXN0RXhpc3Q7CisgICAgREVTVFEucHByaSA9IDA7CisgICAgcmV0dXJuOworfQorCitzdHJ1Y3QgZGVzdCogemZBZ2dEZXN0R2V0TmV4dCh6ZGV2X3QqIGRldiwgdTE2X3QgYWMpCit7CisgICAgc3RydWN0IGRlc3QgKmRlc3QgPSBOVUxMOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmIChERVNUUS5kZXN0W2FjXSkgeworICAgICAgICBkZXN0ID0gREVTVFEuZGVzdFthY107CisgICAgICAgIERFU1RRLmRlc3RbYWNdID0gREVTVFEuZGVzdFthY10tPm5leHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkZXN0ID0gTlVMTDsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBkZXN0OworfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCit1MTZfdCAgIHpmQWdnVGlkVHhJbnNlcnRIZWFkKHpkZXZfdCogZGV2LCBzdHJ1Y3QgYnVmSW5mbyAqYnVmX2luZm8sVElEX1RYIHRpZF90eCkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB1MzJfdCB0aW1lOworICAgIHN0cnVjdCBiYXdfaGVhZGVyICpiYXdfaGVhZGVyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgYnVmID0gYnVmX2luZm8tPmJ1ZjsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh0aWRfdHgtPnNpemUgPj0gKFpNX0FHR1FfU0laRSAtIDIpKSB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHRpZF90eC0+YWdnVGFpbCA9ICh0aWRfdHgtPmFnZ1RhaWwgPT0gMCk/IFpNX0FHR1FfU0laRV9NQVNLOiB0aWRfdHgtPmFnZ1RhaWwgLSAxOworICAgIHRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ1RhaWxdLmJ1ZiA9IGJ1ZjsKKyAgICAvL3RpbWUgPSB6bV9hZ2dfR2V0VGltZSgpOworICAgIHRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ1RhaWxdLmFycml2YWxUaW1lID0gYnVmX2luZm8tPnRpbWVzdGFtcDsKKyAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5iYXdfcmV0cmFuc21pdCA9IGJ1Zl9pbmZvLT5iYXdfcmV0cmFuc21pdDsKKworICAgIGJhd19oZWFkZXIgPSAmdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnVGFpbF0uYmF3X2hlYWRlcjsKKyAgICBiYXdfaGVhZGVyLT5oZWFkZXJMZW4gICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJMZW47CisgICAgYmF3X2hlYWRlci0+bWljTGVuICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuOworICAgIGJhd19oZWFkZXItPnNuYXBMZW4gICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXBMZW47CisgICAgYmF3X2hlYWRlci0+cmVtb3ZlTGVuICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+cmVtb3ZlTGVuOworICAgIGJhd19oZWFkZXItPmtleUlkeCAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmtleUlkeDsKKyAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+aGVhZGVyLCAodThfdCAqKWJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXIsIDU4KTsKKyAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+bWljICAgLCAodThfdCAqKWJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5taWMgICAsIDgpOworICAgIHpmd01lbW9yeUNvcHkoKHU4X3QgKiliYXdfaGVhZGVyLT5zbmFwICAsICh1OF90ICopYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXAgICwgOCk7CisKKyAgICB0aWRfdHgtPnNpemUrKzsKKyAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLy90aWRfdHgtPmxhc3RBcnJpdmFsID0gdGltZTsKKyAgICBpZiAoMSA9PSB0aWRfdHgtPnNpemUpIHsKKyAgICAgICAgREVTVFEuaW5zZXJ0KGRldiwgMCwgdGlkX3R4LT5hYywgdGlkX3R4LCBOVUxMKTsKKyAgICB9CisKKworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIweEMyOmluc2VydEhlYWQsIHRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCisKK3ZvaWQgICAgemZpVHhDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHx8CisgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKSApIHsKKyAgICAgICAgemZBZ2dUeFNjaGVkdWxlcihkZXYsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKworVElEX1RYICB6ZkFnZ1R4UmVhZHkoemRldl90KiBkZXYpIHsKKyAgICAvL3N0cnVjdCBkZXN0KiBkZXN0OworICAgIHUxNl90ICAgaTsKKyAgICBUSURfVFggIHRpZF90eCA9IE5VTEw7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YWdnUVBvb2xbaV0tPnNpemUgPj0gMTYpIHsKKyAgICAgICAgICAgICAgICB0aWRfdHggPSB3ZC0+YWdnUVBvb2xbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gdGlkX3R4OworfQorCit1MTZfdCAgIHpmQWdnVmFsaWRUaWRUeCh6ZGV2X3QqIGRldiwgVElEX1RYIHRpZF90eCkgeworICAgIHUxNl90ICAgaSwgdmFsaWQgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YWdnUVBvb2xbaV0gPT0gdGlkX3R4KQorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHZhbGlkOworfQorCit2b2lkICAgIHpmQWdnVHhTY2hlZHVsZXIoemRldl90KiBkZXYsIHU4X3QgU2NhbkFuZENsZWFyKQoreworICAgIFRJRF9UWCAgdGlkX3R4ID0gTlVMTDsKKyAgICB2b2lkKiAgIHZ0eHE7CisgICAgc3RydWN0IGRlc3QqIGRlc3Q7CisgICAgemJ1Zl90KiAgYnVmOworICAgIHUzMl90IHR4cWwsIG1pbl90eHFsOworICAgIC8vdTE2X3QgYWdncl9zaXplID0gMTsKKyAgICB1MTZfdCB0eHFfdGhyZXNob2xkOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIXdkLT5hZ2dJbml0aWF0ZWQpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZGVidWcgKi8KKyAgICB0eHFsID0gVFhRTDsKKyAgICBtaW5fdHhxbCA9IEFHR19NSU5fVFhRTDsKKworICAgIGlmKHdkLT50eHFfdGhyZXNob2xkKQorICAgICAgICB0eHFfdGhyZXNob2xkID0gd2QtPnR4cV90aHJlc2hvbGQ7CisgICAgZWxzZQorICAgICAgICB0eHFfdGhyZXNob2xkID0gQUdHX01JTl9UWFFMOworCisgICAgdGlkX3R4ID0gemZBZ2dUeFJlYWR5KGRldik7CisgICAgaWYgKHRpZF90eCkgU2NhbkFuZENsZWFyID0gMDsKKyAgICB3aGlsZSAoemZIcEdldEZyZWVUeGRDb3VudChkZXYpID4gMjAgJiYgKFRYUUwgPCB0eHFfdGhyZXNob2xkIHx8IHRpZF90eCkpIHsKKyAgICAvL3doaWxlICh6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikgPiAyMCAmJiAoU2NhbkFuZENsZWFyIHx8IHRpZF90eCkpIHsKKyAgICAvL3doaWxlIChUWFFMIDwgdHhxX3RocmVzaG9sZCkgeworICAgICAgICB1MTZfdCBpOworICAgICAgICB1OF90IGFjOworICAgICAgICBzOF90IGRlc3RRX2NvdW50ID0gMDsKKyAgICAvL3doaWxlICgoemZIcEdldEZyZWVUeGRDb3VudChkZXYpKSA+IDMyKSB7CisKKyAgICAgICAgLy9EYmdQcmludCgiemZBZ2dUeFNjaGVkdWxlcjogaW4gd2hpbGUgbG9vcCIpOworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChERVNUUS5IZWFkW2ldKSBkZXN0UV9jb3VudCsrOworICAgICAgICB9CisgICAgICAgIGlmICgwID49IGRlc3RRX2NvdW50KSBicmVhazsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBhYyA9IHByaVtERVNUUS5wcHJpXTsgREVTVFEucHByaSA9IChERVNUUS5wcHJpICsgMSkgJSAxMDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBmb3IgKGk9MDsgaTwxMDsgaSsrKXsKKyAgICAgICAgICAgIGlmKERFU1RRLkhlYWRbYWNdKSBicmVhazsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGFjID0gcHJpW0RFU1RRLnBwcmldOyBERVNUUS5wcHJpID0gKERFU1RRLnBwcmkgKyAxKSAlIDEwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSAxMCkgYnJlYWs7CisgICAgICAgIC8vRGJnUHJpbnQoInpmQWdnVHhTY2hlZHVsZXI6IGhhdmUgZGVzdCBRIik7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5kZXN0TG9jayA9IDE7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgZGVzdCA9IERFU1RRLmdldE5leHQoZGV2LCBhYyk7CisgICAgICAgIGlmICghZGVzdCkgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5kZXN0TG9jayA9IDA7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICBEYmdQcmludCgiYnVnIHJlcG9ydCEgREVTVFEuZ2V0TmV4dCBnb3Qgbm90aGluZyEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0LT5RdHlwZSA9PSAwKSB7CisgICAgICAgICAgICB0aWRfdHggPSBkZXN0LT50aWRfdHg7CisKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoInpmQWdnVHhTY2hlZHVsZXI6IGhhdmUgdGlkX3R4IFEiKTsKKworICAgICAgICAgICAgaWYodGlkX3R4ICYmIHpmQWdnVmFsaWRUaWRUeChkZXYsIHRpZF90eCkpCisgICAgICAgICAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHdkLT5kZXN0TG9jayA9IDA7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHRpZF90eCA9IHpmQWdnVHhSZWFkeShkZXYpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPmRlc3RMb2NrID0gMDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBpZiAodGlkX3R4ICYmICF0aWRfdHgtPnNpemUpIHsKKworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAvL0RFU1RRLmRlbGV0ZShkZXYsIDAsIHRpZF90eCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHdkLT5hZ2dTdGF0ZSA9PSAwKXsKKyAgICAgICAgICAgICAgICAvL3dkLT5hZ2dTdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHpmQWdnVHhTZW5kKGRldiwgemZIcEdldEZyZWVUeGRDb3VudChkZXYpLCB0aWRfdHgpOworICAgICAgICAgICAgICAgIC8vd2QtPmFnZ1N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZ0eHEgPSBkZXN0LT52dHhxOworICAgICAgICAgICAgYnVmID0gemZHZXRWdHhxKGRldiwgYWMpOworICAgICAgICAgICAgem1fYXNzZXJ0KCBidWYgIT0gMCApOworCisgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKworICAgICAgICB9CisgICAgICAgIC8qZmx1c2ggYWxsIGJ1dCA8IDE2IGZyYW1lcyBpbiB0aWRfdHggdG8gVFhRKi8KKyAgICAgICAgdGlkX3R4ID0gemZBZ2dUeFJlYWR5KGRldik7CisgICAgfQorCisgICAgLyp3aGlsZSAoKHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSkgPiAzMikgeworICAgIC8vd2hpbGUgKCh6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID4gMzIpIHsKKworICAgICAgICBkZXN0UV9jb3VudCA9IDA7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgZGVzdFFfY291bnQgKz0gd2QtPmRlc3RRLnNpemVbaV07CisgICAgICAgIGlmICgwID49IGRlc3RRX2NvdW50KSBicmVhazsKKworICAgICAgICBhYyA9IHByaVt3ZC0+ZGVzdFEucHByaV07IHdkLT5kZXN0US5wcHJpID0gKHdkLT5kZXN0US5wcHJpICsgMSkgJSAxMDsKKyAgICAgICAgZm9yIChpPTA7IGk8MTA7IGkrKyl7CisgICAgICAgICAgICBpZih3ZC0+ZGVzdFEuc2l6ZVthY10hPTApIGJyZWFrOworICAgICAgICAgICAgYWMgPSBwcmlbd2QtPmRlc3RRLnBwcmldOyB3ZC0+ZGVzdFEucHByaSA9ICh3ZC0+ZGVzdFEucHByaSArIDEpICUgMTA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gMTApIGJyZWFrOworICAgICAgICBkZXN0ID0gd2QtPmRlc3RRLmdldE5leHQoZGV2LCBhYyk7CisgICAgICAgIGlmIChkZXN0LT5RdHlwZSA9PSAwKSB7CisgICAgICAgICAgICB0aWRfdHggPSBkZXN0LT50aWRfdHg7CisgICAgICAgICAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICAgICAgICAgIGlmICghdGlkX3R4LT5zaXplKSB7CisgICAgICAgICAgICAgICAgd2QtPmRlc3RRLmRlbGV0ZShkZXYsIDAsIHRpZF90eCwgTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCh3ZC0+YWdnU3RhdGUgPT0gMCkgJiYgKHRpZF90eC0+c2l6ZSA+PSAxNikpeworICAgICAgICAgICAgICAgIHpmQWdnVHhTZW5kKGRldiwgemZIcEdldEZyZWVUeGRDb3VudChkZXYpLCB0aWRfdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyAgICAqLworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHggICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gU3RhdHVzIGNvZGUgWk1fU1VDQ0VTUyBvciBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbWFuYWdlbWVudCBBLU1QRFUgYWdncmVnYXRpb24gZnVuY3Rpb24sICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG1hbmFnZW1lbnQgYWdncmVnYXRpb24gcXVldWUsIGNhbGN1bGF0ZSBhcnJpdmFscmF0ZSwgICAgICAgICAgICAqLworLyogICAgICBhZGQvZGVsZXRlIGFuIGFnZ3JlZ2F0aW9uIHF1ZXVlIG9mIGEgc3RyZWFtLCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZW5xdWV1ZSBwYWNrZXRzIGludG8gcmVzcG9uc2libGUgYWdncmVnYXRlIHF1ZXVlLiAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGRldiwgYnVmLCBhYykgYXMgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBwYWNrZXQgYnVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc3RhdHVzIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCB0aWQpCit7CisgICAgdTE2X3QgYWlkOworICAgIC8vdTE2X3QgcW51bTsKKyAgICAvL3UxNl90IGFnZ2ZsYWcgPSAwOworICAgIC8vdTE2X3QgYXJyaXZhbHJhdGUgPSAwOworICAgIFRJRF9UWCB0aWRfdHg7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYoIXdkLT5hZ2dJbml0aWF0ZWQpCisgICAgeworICAgICAgICByZXR1cm4gWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICBhaWQgPSB6ZkFnZ0dldFN0YShkZXYsIGJ1Zik7CisKKyAgICAvL2Fycml2YWxyYXRlID0gemZBZ2dUeEFycml2YWxSYXRlKGRldiwgYWlkLCB0aWQpOworCisgICAgaWYgKDB4ZmZmZiA9PSBhaWQpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTVEEgbm90IGFzc29jaWF0ZWQsIHRoaXMgaXMgYSBCQy9NQyBvciBTVEEtPkFQIHBhY2tldAorICAgICAgICAgKi8KKworICAgICAgICByZXR1cm4gWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNUQSBhc3NvY2lhdGVkLCBhIHVuaWNhc3QgcGFja2V0CisgICAgICovCisKKyAgICB0aWRfdHggPSB6ZkFnZ1R4R2V0UXVldWUoZGV2LCBhaWQsIHRpZCk7CisKKyAgICAvKnRpZF9xLnRpZF90eCA9IHRpZF90eDsKKyAgICB3ZC0+ZGVzdFEuaW5zZXJ0ID0gemZBZ2dEZXN0SW5zZXJ0OworICAgIHdkLT5kZXN0US5pbnNlcnQoZGV2LCAwLCB0aWRfcSk7CisgICAgKi8KKyAgICBpZiAodGlkX3R4ICE9IE5VTEwpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiB0aGlzIChhaWQsIGFjKSBpcyBhZ2dyZWdhdGVkCisgICAgICAgICAqLworCisgICAgICAgIC8vaWYgKGFycml2YWxyYXRlIDwgWk1fQUdHX0xPV19USFJFU0hPTEQpCisgICAgICAgIGlmICgwKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogYXJyaXZhbCByYXRlIHRvbyBsb3cKKyAgICAgICAgICAgICAqIGRlbGV0ZSB0aGlzIGFnZ3JlZ2F0ZSBxdWV1ZQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIC8vd2QtPmFnZ1FQb29sW3FudW1dLT5jbGVhckZsYWcgPSB3ZC0+YWdnUVBvb2xbcW51bV0tPmRlbGV0ZUZsYWcgPTE7CisKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB6ZkFnZ1R4RW5xdWV1ZShkZXYsIGJ1ZiwgYWlkLCB0aWRfdHgpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIHRoaXMgKGFpZCwgYWMpIG5vdCB5ZXQgYWdncmVnYXRlZAorICAgICAgICAgKiBxdWV1ZSBub3QgZm91bmQKKyAgICAgICAgICovCisKKyAgICAgICAgLy9pZiAoYXJyaXZhbHJhdGUgPiBaTV9BR0dfSElHSF9USFJFU0hPTEQpCisgICAgICAgIGlmICgxKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogYXJyaXZhbHJhdGUgaGlnaCBlbm91Z2ggdG8gZ2V0IGEgbmV3IGFnZyBxdWV1ZQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHRpZF90eCA9IHpmQWdnVHhOZXdRdWV1ZShkZXYsIGFpZCwgdGlkLCBidWYpOworCisgICAgICAgICAgICAvL3ptX21zZzFfYWdnKFpNX0xWXzAsICJnZXQgbmV3IEFnZ1F1ZXVlIHFudW0gPSAiLCB0aWRfdHgtPik7CisKKyAgICAgICAgICAgIGlmICh0aWRfdHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBnb3QgYSBuZXcgYWdncmVnYXRlIHF1ZXVlCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICAvL3dkLT5hZ2dTdGFbYWlkXS5hZ2dGbGFnW2FjXSA9IDE7CisKKyAgICAgICAgICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGFkZCBBRERCQSBmdW5jdGlvbnMgaGVyZQorICAgICAgICAgICAgICAgICAqIHJldHVybiBaTV9FUlJfVFhfQlVGRkVSX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgICAgICAqLworCisKKyAgICAgICAgICAgICAgICAvL3pmQWdnU2VuZEFkZGJhUmVxdWVzdChkZXYsIHRpZF90eC0+ZHN0LCB0aWRfdHgtPmFjLCB0aWRfdHgtPnRpZCk7CisgICAgICAgICAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgLy93ZC0+YWdnU3RhW2FpZF0uYWdnRmxhZ1thY10gPSAwOworCisgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHpmQWdnVHhFbnF1ZXVlKGRldiwgYnVmLCBhaWQsIHRpZF90eCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGp1c3QgY2FuJ3QgZ2V0IGEgbmV3IGFnZ3JlZ2F0ZSBxdWV1ZQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9UWF9CVUZGRVJfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogYXJyaXZhbCByYXRlIGlzIG5vdCBoaWdoIGVub3VnaCB0byBnZXQgYSBuZXcgYWdnIHF1ZXVlCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9UWF9CVUZGRVJfVU5BVkFJTEFCTEU7CisgICAgICAgIH0KKyAgICB9CisKKworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhSZWFkeUNvdW50ICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gY291bnRlciBvZiByZWFkeSB0byBhZ2dyZWdhdGUgcXVldWVzLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBhYykgYXMgaW5wdXQsIG9ubHkgY2FsY3VsYXRlIHRoZSByZWFkeSB0byBhZ2dyZWdhdGUgICovCisvKiAgICAgIHF1ZXVlcyBvZiBvbmUgcGFydGljdWxhciBhYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhYyAgOiBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBjb3VudGVyIG9mIHJlYWR5IHRvIGFnZ3JlZ2F0ZSBxdWV1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBZ2dUeFJlYWR5Q291bnQoemRldl90KiBkZXYsIHUxNl90IGFjKQoreworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmVhZHljb3VudCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaT0wIDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCAmJiAod2QtPmFnZ1FQb29sW2ldLT5hZ2dSZWFkeSB8fCBcCisgICAgICAgICAgICAgICAgd2QtPmFnZ1FQb29sW2ldLT5jbGVhckZsYWcpICYmIGFjID09IHdkLT5hZ2dRUG9vbFtpXS0+YWMpCisgICAgICAgICAgICByZWFkeWNvdW50Kys7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiByZWFkeWNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeFBhcnRpYWwgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiB0aGUgbnVtYmVyIHRoYXQgVnR4cSBoYXMgdG8gc2VuZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIGFjLCByZWFkeWNvdW50KSBhcyBpbnB1dCwgY2FsY3VsYXRlIHRoZSByYXRpbyBvZiAgICAgKi8KKy8qICAgICAgVnR4cSBsZW5ndGggdG8gKFZ0eHEgbGVuZ3RoICsgcmVhZHljb3VudCkgb2YgYSBwYXJ0aWN1bGFyIGFjLCAgICovCisvKiAgICAgIGFuZCByZXR1cm5zIHRoZSBWdHhxIGxlbmd0aCAqIHRoZSByYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhYyAgOiBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmVhZHljb3VudDogdGhlIG51bWJlciBvZiByZWFkeSB0byBhZ2dyZWdhdGUgcXVldWVzIG9mIHRoaXMgYWMgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVnR4cSBsZW5ndGggKiByYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhQYXJ0aWFsKHpkZXZfdCogZGV2LCB1MTZfdCBhYywgdTE2X3QgcmVhZHljb3VudCkKK3sKKyAgICB1MTZfdCBxbGVuOworICAgIHUxNl90IHBhcnRpYWw7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHFsZW4gPSB6bV9hZ2dfcWxlbihkZXYsIHdkLT52dHhxSGVhZFthY10sIHdkLT52dHhxVGFpbFthY10pOworCisgICAgaWYgKChxbGVuICsgcmVhZHljb3VudCkgPiAwKQorICAgIHsKKyAgICAgICAgcGFydGlhbCA9ICh1MTZfdCkoIHptX2FnZ193ZWlnaHQoYWMpICogKCh1MTZfdClxbGVuLyhxbGVuICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHljb3VudCkpICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBhcnRpYWwgPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocGFydGlhbCA+IHFsZW4pCisgICAgICAgIHBhcnRpYWwgPSBxbGVuOworCisgICAgcmV0dXJuIHBhcnRpYWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhTZW5kICAgICAgICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gc2VudGNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBhYywgbikgYXMgaW5wdXQsIG4gaXMgdGhlIG51bWJlciBvZiBzY2hlZHVsZWQgYWdnICAgICovCisvKiAgICAgIHF1ZXVlcyB0byBiZSBzZW50IG9mIHRoZSBwYXJ0aWN1bGFyIGFjLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhYyAgOiBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbiAgIDogdGhlIG51bWJlciBvZiBzY2hlZHVsZWQgYWdncmVnYXRpb24gcXVldWVzIHRvIGJlIHNlbnQgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VudGNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhTZW5kKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVlVHhkLCBUSURfVFggdGlkX3R4KQoreworICAgIC8vdTE2X3QgICBxbnVtOworICAgIC8vdTE2X3QgICBxbGVuOworICAgIHUxNl90ICAgajsKKyAgICAvL3UxNl90ICAgc2VudGNvdW50ID0gMDsKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICBzdHJ1Y3QgIGFnZ0NvbnRyb2wgYWdnQ29udHJvbDsKKyAgICB1MTZfdCAgIGFnZ0xlbjsKKyAgICAvL3pidWZfdCogIG5ld0J1ZjsKKyAgICAvL3UxNl90ICAgYnVmTGVuOworICAgIC8vVElEX0JBVyB0aWRfYmF3ID0gTlVMTDsKKyAgICAvL3N0cnVjdCBidWZJbmZvICpidWZfaW5mbzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvL3doaWxlICh0aWRfdHgtPnNpemUgPiAwKQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICBhZ2dMZW4gPSB6bV9hZ2dfbWluKDE2LCB6bV9hZ2dfbWluKHRpZF90eC0+c2l6ZSwgKHUxNl90KShmcmVlVHhkIC0gMikpKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogd2h5IHRoZXJlIGhhdmUgdG8gYmUgMiBmcmVlIFR4ZD8KKyAgICAgICAgICAgICAqLworICAgIGlmIChhZ2dMZW4gPD0wICkKKyAgICAgICAgcmV0dXJuIDA7CisKKworICAgIGlmIChhZ2dMZW4gPT0gMSkgeworICAgICAgICBidWYgPSB6ZkFnZ1R4R2V0VnR4cShkZXYsIHRpZF90eCk7CisgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgaWYgKHRpZF90eC0+c2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvL0RFU1RRLmRlbGV0ZShkZXYsIDAsIHRpZF90eCwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBGcmVlIFR4ZCBxdWV1ZSBpcyBiaWcgZW5vdWdoIHRvIHB1dCBhZ2dyZWdhdGlvbgorICAgICAgICAgICAgICAgICAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKHdkLT5hZ2dTdGF0ZSA9PSAxKSB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3ZC0+YWdnU3RhdGUgPSAxOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJhZ2dMZW49IiwgYWdnTGVuKTsKKyAgICB0aWRfdHgtPmFnZ0ZyYW1lU2l6ZSA9IDA7CisgICAgZm9yIChqPTA7IGogPCBhZ2dMZW47IGorKykgeworICAgICAgICBidWYgPSB6ZkFnZ1R4R2V0VnR4cShkZXYsIHRpZF90eCk7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgaWYgKCBidWYgKSB7CisgICAgICAgICAgICAvL3N0cnVjdCBhZ2dUYWxseSAqYWdnX3RhbDsKKyAgICAgICAgICAgIHUxNl90IGNvbXBsZXRlSW5kZXg7CisKKyAgICAgICAgICAgIGlmICgwID09IGopIHsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLmFtcGR1SW5kaWNhdGlvbiA9IFpNX0FHR19GSVJTVF9NUERVOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoaiA9PSAoYWdnTGVuIC0gMSkpIHx8IHRpZF90eC0+c2l6ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFnZ0NvbnRyb2wuYW1wZHVJbmRpY2F0aW9uID0gWk1fQUdHX0xBU1RfTVBEVTsKKyAgICAgICAgICAgICAgICAvL3dkLT5hZ2dTdGF0ZSA9IDA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLmFtcGR1SW5kaWNhdGlvbiA9IFpNX0FHR19NSURETEVfTVBEVTsKKyAgICAgICAgICAgICAgICAvKiB0aGUgcGFja2V0IGlzIGRlbGF5ZWQgbW9yZSB0aGFuIDUwMCBtcywgZHJvcCBpdCAqLworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aWRfdHgtPmFnZ0ZyYW1lU2l6ZSArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAgICAgICAgIGFnZ0NvbnRyb2wuYWRkYmFJbmRpY2F0aW9uID0gMDsKKyAgICAgICAgICAgIGFnZ0NvbnRyb2wuYWdnRW5hYmxlZCA9IDE7CisKKyNpZmRlZiBaTV9BR0dfVEFMTFkKKyAgICAgICAgICAgIGFnZ190YWwgPSAmd2QtPmFnZ190YWw7CisgICAgICAgICAgICBhZ2dfdGFsLT5zZW50X3BhY2tldHNfc3VtKys7CisKKyNlbmRpZgorCisgICAgICAgICAgICB6ZkFnZ1R4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwLCAmYWdnQ29udHJvbCwgdGlkX3R4KTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGNvbXBsZXRlSW5kZXggPSB0aWRfdHgtPmNvbXBsZXRlOworICAgICAgICAgICAgaWYoem1fYWdnX2luUSh0aWRfdHgsIHRpZF90eC0+Y29tcGxldGUpKQorICAgICAgICAgICAgICAgIHptX2FnZ19wbHVzKHRpZF90eC0+Y29tcGxldGUpOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgaWYoem1fYWdnX2luUSh0aWRfdHgsIGNvbXBsZXRlSW5kZXgpICYmIHdkLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiB0aWRfdHgtPmFnZ3Z0eHFbY29tcGxldGVJbmRleF0uYnVmKSB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uKGRldiwgdGlkX3R4LT5hZ2d2dHhxW2NvbXBsZXRlSW5kZXhdLmJ1Zik7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiaW4gcXVldWUgY29tcGxldGUgd29ya2VkISIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGhpcyBhZ2dyZWdhdGlvbiBxdWV1ZSBpcyBlbXB0eQorICAgICAgICAgICAgICovCisgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiYWdnTGVuIG5vdCByZWFjaGVkLCBidXQgbm8gbW9yZSBmcmFtZSwgaj0iLCBqKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+YWdnU3RhdGUgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvL3ptX2FjcXVpcmVfYWdnX3NwaW5fbG9jayhBZGFwdGVyKTsKKyAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICAvL3ptX3JlbGVhc2VfYWdnX3NwaW5fbG9jayhBZGFwdGVyKTsKKworICAgIGlmICh0aWRfdHgtPnNpemUgPT0gMCkgeworICAgICAgICAvL0RFU1RRLmRlbGV0ZShkZXYsIDAsIHRpZF90eCwgTlVMTCk7CisgICAgfQorCisKKworICAgIC8vemZBZ2dJbnZva2VCYXIoZGV2LCB0aWRfdHgpOworICAgIGlmKGo+MCkgeworICAgICAgICBhZ2dyX2NvdW50Kys7CisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIweEMyOnNlbnQgMSBhZ2dyLCBhZ2dyX2NvdW50PSIsIGFnZ3JfY291bnQpOworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiMHhDMjpzZW50IDEgYWdnciwgYWdncl9zaXplPSIsIGopOworICAgIH0KKyAgICByZXR1cm4gajsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeEdldFJlYWR5UXVldWUgICAgICAgICovCisvKiAgICAgIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBhZ2dyZWdhdGlvbiBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIGFjKSBhcyBpbnB1dCwgZmluZCB0aGUgYWdnIHF1ZXVlIHdpdGggc21hbGxlc3QgICAgICAgKi8KKy8qICAgICAgYXJyaXZhbCB0aW1lICh3YWl0ZWQgbG9uZ2VzdCkgYW1vbmcgdGhvc2UgcmVhZHkgb3IgY2xlYXJGbGFnICAgICovCisvKiAgICAgIHNldCBxdWV1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhYyAgOiBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZ2dyZWdhdGlvbiBxdWV1ZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVElEX1RYIHpmQWdnVHhHZXRSZWFkeVF1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBhYykKK3sKKyAgICAvL3UxNl90ICAgICAgIHFudW0gPSBaTV9BR0dfUE9PTF9TSVpFOworICAgIHUxNl90ICAgICAgIGk7CisgICAgdTMyX3QgICAgICAgdGltZSA9IDA7CisgICAgVElEX1RYICAgICAgdGlkX3R4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpPTAgO2k8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKDEgPT0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCAmJiBhYyA9PSB3ZC0+YWdnUVBvb2xbaV0tPmFjICYmCisgICAgICAgICAgICAgICAgKHdkLT5hZ2dRUG9vbFtpXS0+c2l6ZSA+IDApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMCA9PSB0aW1lIHx8IHRpbWUgPiB3ZC0+YWdnUVBvb2xbaV0tPmFnZ3Z0eHFbIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YWdnUVBvb2xbaV0tPmFnZ0hlYWQgXS5hcnJpdmFsVGltZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWRfdHggPSB3ZC0+YWdnUVBvb2xbaV07CisgICAgICAgICAgICAgICAgdGltZSA9IHRpZF90eC0+YWdndnR4cVsgdGlkX3R4LT5hZ2dIZWFkIF0uYXJyaXZhbFRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHRpZF90eDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4R2V0VnR4cSAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIGFuIE1TRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGRldiwgcW51bSkgYXMgaW5wdXQsIHJldHVybiBhbiBNU0RVIG91dCBvZiB0aGUgYWdnIHF1ZXVlLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBxbnVtOiBxdWV1ZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhIE1TRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworemJ1Zl90KiB6ZkFnZ1R4R2V0VnR4cSh6ZGV2X3QqIGRldiwgVElEX1RYIHRpZF90eCkKK3sKKyAgICB6YnVmX3QqIGJ1ZiA9IE5VTEw7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKHRpZF90eC0+YWdnSGVhZCAhPSB0aWRfdHgtPmFnZ1RhaWwpCisgICAgeworICAgICAgICBidWYgPSB0aWRfdHgtPmFnZ3Z0eHFbIHRpZF90eC0+YWdnVGFpbCBdLmJ1ZjsKKworICAgICAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5idWYgPSBOVUxMOworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHRpZF90eC0+YWdnVGFpbCA9ICgodGlkX3R4LT5hZ2dUYWlsICsgMSkgJiBaTV9BR0dRX1NJWkVfTUFTSyk7CisgICAgICAgIGlmKHRpZF90eC0+c2l6ZSA+IDApIHRpZF90eC0+c2l6ZS0tOworICAgICAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gYnVmKSB7CisgICAgICAgICAgICAvL3RpZF90eC0+YWdnVGFpbCA9IHRpZF90eC0+YWdnSGVhZCA9IHRpZF90eC0+c2l6ZSA9IDA7CisgICAgICAgICAgICAvL3ptX21zZzFfYWdnKFpNX0xWXzAsICJHZXRWdHhxIGJ1ZiA9PSBOVUxMLCB0aWRfdHgtPnNpemU9IiwgdGlkX3R4LT5zaXplKTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBxdWV1ZSBpcyBlbXB0eQorICAgICAgICAgKi8KKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInRpZF90eC0+YWdnSGVhZCA9PSB0aWRfdHgtPmFnZ1RhaWwsIHRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworCisgICAgfQorCisgICAgaWYgKHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpICE9IHRpZF90eC0+c2l6ZSkKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInFsZW4hPXRpZF90eC0+c2l6ZSEgdGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeERlbGV0ZVF1ZXVlICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBaTV9TVUNDRVNTIChjYW4ndCBmYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIHFudW0pIGFzIGlucHV0LCByZXNldCAoZGVsZXRlKSB0aGlzIGFnZ3JlZ2F0ZSBxdWV1ZSwgKi8KKy8qICAgICAgdGhpcyBxdWV1ZSBpcyB2aXJ0dWFsbHkgcmV0dXJuZWQgdG8gdGhlIGFnZ3JlZ2F0ZSBxdWV1ZSBwb29sLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHFudW06IHF1ZXVlIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFpNX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkFnZ1R4RGVsZXRlUXVldWUoemRldl90KiBkZXYsIHUxNl90IHFudW0pCit7CisgICAgdTE2X3QgYWMsIHRpZDsKKyAgICBzdHJ1Y3QgYWdnUXVldWUgKnR4X3RpZDsKKyAgICBzdHJ1Y3QgYWdnU3RhICAgKmFnZ19zdGE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgdHhfdGlkID0gd2QtPmFnZ1FQb29sW3FudW1dOworICAgIGFnZ19zdGEgPSAmd2QtPmFnZ1N0YVt0eF90aWQtPmFnZ1FTVEFdOworICAgIGFjID0gdHhfdGlkLT5hYzsKKyAgICB0aWQgPSB0eF90aWQtPnRpZDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB0eF90aWQtPmFnZ1FFbmFibGVkID0gMDsKKyAgICB0eF90aWQtPmFnZ0hlYWQgPSB0eF90aWQtPmFnZ1RhaWwgPSAwOworICAgIHR4X3RpZC0+YWdnUmVhZHkgPSAwOworICAgIHR4X3RpZC0+Y2xlYXJGbGFnID0gdHhfdGlkLT5kZWxldGVGbGFnID0gMDsKKyAgICB0eF90aWQtPnNpemUgPSAwOworICAgIGFnZ19zdGEtPmNvdW50W2FjXSA9IDA7CisKKyAgICBhZ2dfc3RhLT50aWRfdHhbdGlkXSA9IE5VTEw7CisgICAgYWdnX3N0YS0+YWdnRmxhZ1thY10gPSAwOworCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJxdWV1ZSBkZWxldGVkISBxbnVtPSIsIHFudW0pOworCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKK3ZvaWQgemZCYXdDb3JlKHpkZXZfdCogZGV2LCB1MTZfdCBiYXdfc2VxLCB1MzJfdCBiaXRtYXAsIHUxNl90IGFnZ0xlbikgeworICAgIFRJRF9CQVcgdGlkX2JhdzsKKyAgICBzMTZfdCBpOworICAgIHpidWZfdCogYnVmOworICAgIHN0cnVjdCBidWZJbmZvICpidWZfaW5mbzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgdGlkX2JhdyA9IEJBVy0+Z2V0UShkZXYsIGJhd19zZXEpOworICAgIC8vdGlkX2JhdyA9IE5VTEw7CisgICAgaWYgKE5VTEwgPT0gdGlkX2JhdykKKyAgICAgICAgcmV0dXJuOworCisgICAgdG90YWxfbXBkdSArPSBhZ2dMZW47CisgICAgZm9yIChpID0gYWdnTGVuIC0gMTsgaT49MDsgaS0tKSB7CisgICAgICAgIGlmICgoKGJpdG1hcCA+PiBpKSAmIDB4MSkgPT0gMCkgeworICAgICAgICAgICAgYnVmX2luZm8gPSBCQVctPnBvcChkZXYsIGksIHRpZF9iYXcpOworICAgICAgICAgICAgYnVmID0gYnVmX2luZm8tPmJ1ZjsKKyAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAvL3dkLT56ZmNiU2V0QmF3UShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgemZBZ2dUaWRUeEluc2VydEhlYWQoZGV2LCBidWZfaW5mbywgdGlkX2Jhdy0+dGlkX3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3NfbXBkdSsrOworICAgICAgICB9CisgICAgfQorICAgIEJBVy0+ZGlzYWJsZShkZXYsIHRpZF9iYXcpOworICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2KTsKKyAgICB6bV9kZWJ1Z19tc2cxKCJzdWNjZXNzX21wZHUgPSAiLCBzdWNjZXNzX21wZHUpOworICAgIHptX2RlYnVnX21zZzEoIiAgdG90YWxfbXBkdSA9ICIsIHRvdGFsX21wZHUpOworfQorCit2b2lkICAgIHpmQmF3SW5pdCh6ZGV2X3QqIGRldikgeworICAgIFRJRF9CQVcgdGlkX2JhdzsKKyAgICB1MTZfdCBpLGo7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGZvciAoaT0wOyBpPFpNX0JBV19QT09MX1NJWkU7IGkrKyl7CisgICAgICAgIHRpZF9iYXcgPSAmQkFXLT50aWRfYmF3W2ldOworICAgICAgICBmb3IgKGo9MDsgajxaTV9WVFhRX1NJWkU7IGorKykgeworICAgICAgICAgICAgdGlkX2Jhdy0+ZnJhbWVbal0uYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB0aWRfYmF3LT5lbmFibGVkID0gdGlkX2Jhdy0+aGVhZCA9IHRpZF9iYXctPnRhaWwgPSB0aWRfYmF3LT5zaXplID0gMDsKKyAgICAgICAgdGlkX2Jhdy0+c3RhcnRfc2VxID0gMDsKKyAgICB9CisgICAgQkFXLT5kZWxQb2ludCA9IDA7CisgICAgQkFXLT5jb3JlID0gemZCYXdDb3JlOworICAgIEJBVy0+Z2V0TmV3USA9IHpmQmF3R2V0TmV3UTsKKyAgICBCQVctPmluc2VydCA9IHpmQmF3SW5zZXJ0OworICAgIEJBVy0+cG9wID0gemZCYXdQb3A7CisgICAgQkFXLT5lbmFibGUgPSB6ZkJhd0VuYWJsZTsKKyAgICBCQVctPmRpc2FibGUgPSB6ZkJhd0Rpc2FibGU7CisgICAgQkFXLT5nZXRRID0gemZCYXdHZXRROworfQorCisKKworVElEX0JBVyB6ZkJhd0dldE5ld1EoemRldl90KiBkZXYsIHUxNl90IHN0YXJ0X3NlcSwgVElEX1RYIHRpZF90eCkgeworICAgIFRJRF9CQVcgdGlkX2Jhdz1OVUxMOworICAgIFRJRF9CQVcgbmV4dF9iYXc9TlVMTDsKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKgorICAgIGZvciAoaT0wOyBpPFpNX0JBV19QT09MX1NJWkU7IGkrKyl7CisgICAgICAgIHRpZF9iYXcgPSAmQkFXLT50aWRfYmF3W2ldOworICAgICAgICBpZiAoRkFMU0UgPT0gdGlkX2Jhdy0+ZW5hYmxlZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAqLworCisgICAgdGlkX2JhdyA9ICZCQVctPnRpZF9iYXdbQkFXLT5kZWxQb2ludF07CisgICAgaSA9IEJBVy0+ZGVsUG9pbnQ7CisgICAgLy9pZiAoWk1fQkFXX1BPT0xfU0laRSA9PSBpKSB7CisgICAgICAgIC8vcmV0dXJuIE5VTEw7CisgICAgLy8gICAgdThfdCB0ZW1wID0gQkFXLT5kZWxQb2ludDsKKyAgICAvLyAgICB0aWRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tCQVctPmRlbFBvaW50XTsKKyAgICAvLyAgICBCQVctPmRpc2FibGUoZGV2LCB0aWRfYmF3KTsKKyAgICAvLyAgICBCQVctPmRlbFBvaW50ID0gKEJBVy0+ZGVsUG9pbnQgPCAoWk1fQkFXX1BPT0xfU0laRSAtIDEpKT8gKEJBVy0+ZGVsUG9pbnQgKyAxKTogMDsKKyAgICAvLyAgICB0ZW1wID0gQkFXLT5kZWxQb2ludDsKKyAgICAvL30KKworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJnZXQgbmV3IHRpZF9iYXcsIGluZGV4PSIsIGkpOworICAgIEJBVy0+ZGVsUG9pbnQgPSAoaSA8IChaTV9CQVdfUE9PTF9TSVpFIC0xKSk/IChpICsgMSk6IDA7CisgICAgbmV4dF9iYXcgPSAmQkFXLT50aWRfYmF3W0JBVy0+ZGVsUG9pbnRdOworICAgIGlmICgxID09IG5leHRfYmF3LT5lbmFibGVkKSBCQVctPmRpc2FibGUoZGV2LCBuZXh0X2Jhdyk7CisKKyAgICBCQVctPmVuYWJsZShkZXYsIHRpZF9iYXcsIHN0YXJ0X3NlcSk7CisgICAgdGlkX2Jhdy0+dGlkX3R4ID0gdGlkX3R4OworCisgICAgcmV0dXJuIHRpZF9iYXc7Cit9CisKK3UxNl90ICAgemZCYXdJbnNlcnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBiYXdfc2VxLCBUSURfQkFXIHRpZF9iYXcsIHU4X3QgYmF3X3JldHJhbnNtaXQsIHN0cnVjdCBiYXdfaGVhZGVyX3IgKmhlYWRlcl9yKSB7CisgICAgLy9USURfQkFXIHRpZF9iYXc7CisgICAgLy91MTZfdCAgIGJ1ZkxlbjsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmKHRpZF9iYXctPnNpemUgPCAoWk1fVlRYUV9TSVpFIC0gMSkpIHsKKyAgICAgICAgc3RydWN0IGJhd19oZWFkZXIgKmJhd19oZWFkZXIgPSAmdGlkX2Jhdy0+ZnJhbWVbdGlkX2Jhdy0+aGVhZF0uYmF3X2hlYWRlcjsKKworICAgICAgICBiYXdfaGVhZGVyLT5oZWFkZXJMZW4gICA9IGhlYWRlcl9yLT5oZWFkZXJMZW47CisgICAgICAgIGJhd19oZWFkZXItPm1pY0xlbiAgICAgID0gaGVhZGVyX3ItPm1pY0xlbjsKKyAgICAgICAgYmF3X2hlYWRlci0+c25hcExlbiAgICAgPSBoZWFkZXJfci0+c25hcExlbjsKKyAgICAgICAgYmF3X2hlYWRlci0+cmVtb3ZlTGVuICAgPSBoZWFkZXJfci0+cmVtb3ZlTGVuOworICAgICAgICBiYXdfaGVhZGVyLT5rZXlJZHggICAgICA9IGhlYWRlcl9yLT5rZXlJZHg7CisgICAgICAgIHpmd01lbW9yeUNvcHkoKHU4X3QgKiliYXdfaGVhZGVyLT5oZWFkZXIsICh1OF90ICopaGVhZGVyX3ItPmhlYWRlciwgNTgpOworICAgICAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+bWljICAgLCAodThfdCAqKWhlYWRlcl9yLT5taWMgICAsIDgpOworICAgICAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+c25hcCAgLCAodThfdCAqKWhlYWRlcl9yLT5zbmFwICAsIDgpOworICAgICAgICAvL3dkLT56ZmNiU2V0QmF3UShkZXYsIGJ1ZiwgMSk7CisgICAgICAgIHRpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmJ1ZiA9IGJ1ZjsKKyAgICAgICAgdGlkX2Jhdy0+ZnJhbWVbdGlkX2Jhdy0+aGVhZF0uYmF3X3NlcSA9IGJhd19zZXE7CisgICAgICAgIHRpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmJhd19yZXRyYW5zbWl0ID0gYmF3X3JldHJhbnNtaXQgKyAxOworCisgICAgICAgIC8vdGlkX2Jhdy0+ZnJhbWVbdGlkX2Jhdy0+aGVhZF0uZGF0YSA9IHBCdWYtPmRhdGE7CisgICAgICAgIHRpZF9iYXctPmhlYWQrKzsKKyAgICAgICAgdGlkX2Jhdy0+c2l6ZSsrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy93ZC0+emZjYlNldEJhd1EoZGV2LCBidWYsIDApOworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RydWN0IGJ1ZkluZm8qIHpmQmF3UG9wKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KSB7CisgICAgLy9USURfQkFXIHRpZF9iYXc7CisgICAgLy96YnVmX3QqIGJ1ZjsKKyAgICBzdHJ1Y3QgYnVmSW5mbyAqYnVmX2luZm87CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgYnVmX2luZm8gPSAmd2QtPmJ1Zl9pbmZvOworICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyID0gTlVMTDsKKworICAgIGlmIChOVUxMID09IChidWZfaW5mby0+YnVmID0gdGlkX2Jhdy0+ZnJhbWVbaW5kZXhdLmJ1ZikpCisgICAgICAgIHJldHVybiBidWZfaW5mbzsKKworICAgIGJ1Zl9pbmZvLT5iYXdfcmV0cmFuc21pdCA9IHRpZF9iYXctPmZyYW1lW2luZGV4XS5iYXdfcmV0cmFuc21pdDsKKyAgICBidWZfaW5mby0+YmF3X2hlYWRlciA9ICZ0aWRfYmF3LT5mcmFtZVtpbmRleF0uYmF3X2hlYWRlcjsKKyAgICBidWZfaW5mby0+dGltZXN0YW1wID0gdGlkX2Jhdy0+ZnJhbWVbaW5kZXhdLnRpbWVzdGFtcDsKKyAgICAvL3BCdWYtPmRhdGEgPSBwQnVmLT5idWZmZXI7CisgICAgLy93ZC0+emZjYlJlc3RvcmVCdWZEYXRhKGRldiwgYnVmKTsKKyAgICB0aWRfYmF3LT5mcmFtZVtpbmRleF0uYnVmID0gTlVMTDsKKworICAgIHJldHVybiBidWZfaW5mbzsKK30KKwordm9pZCAgICB6ZkJhd0VuYWJsZSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3LCB1MTZfdCBzdGFydF9zZXEpIHsKKyAgICAvL1RJRF9CQVcgdGlkX2JhdzsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHRpZF9iYXctPmVuYWJsZWQgPSBUUlVFOworICAgIHRpZF9iYXctPmhlYWQgPSB0aWRfYmF3LT50YWlsID0gdGlkX2Jhdy0+c2l6ZSA9IDA7CisgICAgdGlkX2Jhdy0+c3RhcnRfc2VxID0gc3RhcnRfc2VxOworfQorCit2b2lkICAgIHpmQmF3RGlzYWJsZSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3KSB7CisgICAgLy9USURfQkFXIHRpZF9iYXc7CisgICAgdTE2X3QgaTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICBmb3IgKGk9MDsgaTxaTV9WVFhRX1NJWkU7IGkrKykgeworICAgICAgICBpZiAodGlkX2Jhdy0+ZnJhbWVbaV0uYnVmKSB7CisKKyAgICAgICAgICAgIC8vd2QtPnpmY2JTZXRCYXdRKGRldiwgdGlkX2Jhdy0+ZnJhbWVbaV0uYnVmLCAwKTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB0aWRfYmF3LT5mcmFtZVtpXS5idWYsIFpNX1NVQ0NFU1MpOworICAgICAgICAgICAgdGlkX2Jhdy0+ZnJhbWVbaV0uYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRpZF9iYXctPmVuYWJsZWQgPSBGQUxTRTsKK30KKworVElEX0JBVyB6ZkJhd0dldFEoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEpIHsKKyAgICBUSURfQkFXIHRpZF9iYXc9TlVMTDsKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICBmb3IgKGk9MDsgaTxaTV9CQVdfUE9PTF9TSVpFOyBpKyspeworICAgICAgICB0aWRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tpXTsKKyAgICAgICAgaWYgKFRSVUUgPT0gdGlkX2Jhdy0+ZW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImdldCBhbiBvbGQgdGlkX2JhdywgYmF3X3NlcT0iLCBiYXdfc2VxKTsKKyAgICAgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJjaGVjayBhICB0aWRfYmF3LT5zdGFydF9zZXE9IiwgdGlkX2Jhdy0+c3RhcnRfc2VxKTsKKyAgICAgICAgICAgIGlmKGJhd19zZXEgPT0gdGlkX2Jhdy0+c3RhcnRfc2VxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisgICAgaWYgKFpNX0JBV19QT09MX1NJWkUgPT0gaSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHRpZF9iYXc7Cit9CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCisKK3UxNl90IHpmQWdnVGFsbHlSZXNldCh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgYWdnVGFsbHkqIGFnZ190YWw7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBhZ2dfdGFsID0gJndkLT5hZ2dfdGFsOworICAgIGFnZ190YWwtPmdvdF9wYWNrZXRzX3N1bSA9IDA7CisgICAgYWdnX3RhbC0+Z290X2J5dGVzX3N1bSA9IDA7CisgICAgYWdnX3RhbC0+c2VudF9ieXRlc19zdW0gPSAwOworICAgIGFnZ190YWwtPnNlbnRfcGFja2V0c19zdW0gPSAwOworICAgIGFnZ190YWwtPmF2Z19nb3RfcGFja2V0cyA9IDA7CisgICAgYWdnX3RhbC0+YXZnX2dvdF9ieXRlcyA9IDA7CisgICAgYWdnX3RhbC0+YXZnX3NlbnRfcGFja2V0cyA9IDA7CisgICAgYWdnX3RhbC0+YXZnX3NlbnRfYnl0ZXMgPSAwOworICAgIGFnZ190YWwtPnRpbWUgPSAwOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1NjYW5BbmRDbGVhciAgICAgICAgICAgKi8KKy8qICAgICAgSWYgdGhlIHBhY2tldHMgaW4gYSBxdWV1ZSBoYXZlIHdhaXRlZCBmb3IgdG9vIGxvbmcsIGNsZWFyIGFuZCAgICovCisvKiAgICAgIGRlbGV0ZSB0aGlzIGFnZ3JlZ2F0aW9uIHF1ZXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiAgICAgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0aW1lICAgIDogY3VycmVudCB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBaTV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgICB6ZkFnZ1NjYW5BbmRDbGVhcih6ZGV2X3QqIGRldiwgdTMyX3QgdGltZSkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IGhlYWQ7CisgICAgdTE2X3QgdGFpbDsKKyAgICB1MzJfdCB0aWNrOworICAgIHUzMl90IGFycml2YWxUaW1lOworICAgIC8vdTE2X3QgYWlkLCBhYzsKKyAgICBUSURfVFggdGlkX3R4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmKCEod2QtPnN0YXRlID09IFpNX1dMQU5fU1RBVEVfRU5BQkxFRCkpIHJldHVybiAwOworICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAxKTsKKyAgICB0aWNrID0gem1fYWdnX0dldFRpbWUoKTsKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXdkLT5hZ2dRUG9vbFtpXSkgcmV0dXJuIDA7CisgICAgICAgIGlmICgxID09IHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZF90eCA9IHdkLT5hZ2dRUG9vbFtpXTsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGhlYWQgPSB0aWRfdHgtPmFnZ0hlYWQ7CisgICAgICAgICAgICB0YWlsID0gdGlkX3R4LT5hZ2dUYWlsOworCisgICAgICAgICAgICBhcnJpdmFsVGltZSA9ICh1MzJfdCl0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5hcnJpdmFsVGltZTsKKworCisgICAgICAgICAgICBpZigodGljayAtIGFycml2YWxUaW1lKSA8PSBaTV9BR0dfQ0xFQVJfVElNRSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigodGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCkpID4gMCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRpZF90eC0+Y2xlYXJGbGFnID0gMTsKKworICAgICAgICAgICAgICAgIC8vem1fbXNnMV9hZ2coWk1fTFZfMCwgImNsZWFyIHF1ZXVlICAgIHRpY2sgPSIsIHRpY2spOworICAgICAgICAgICAgICAgIC8vem1fbXNnMV9hZ2coWk1fTFZfMCwgImNsZWFyIHF1ZXVlIGFycml2YWwgPSIsIGFycml2YWxUaW1lKTsKKworCisgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIC8vemZBZ2dUeFNjaGVkdWxlcihkZXYpOworICAgICAgICAgICAgICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGlkX3R4LT5zaXplID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBxdWV1ZSBlbXB0eQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICh0aWNrIC0gdGlkX3R4LT5sYXN0QXJyaXZhbCA+IFpNX0FHR19ERUxFVEVfVElNRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJkZWxldGUgcXVldWUsIGlkbGUgZm9yIG4gc2VjLiBuID0gIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX0FHR19ERUxFVEVfVElNRS8xMCk7CisKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgemZBZ2dUeERlbGV0ZVF1ZXVlKGRldiwgaSk7CisgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgICAgIHpmQWdnUnhDbGVhcihkZXYsIHRpbWUpOworCisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgaWYoKHdkLT50aWNrICUgMTAwKSA9PSAwKSB7CisgICAgICAgIHpmQWdnUHJpbnRUYWxseShkZXYpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3UxNl90ICAgemZBZ2dQcmludFRhbGx5KHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBhZ2dUYWxseSogYWdnX3RhbDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGFnZ190YWwgPSAmd2QtPmFnZ190YWw7CisKKyAgICBpZihhZ2dfdGFsLT5nb3RfcGFja2V0c19zdW0gPCAxMCkKKyAgICB7CisgICAgICAgIHpmQWdnVGFsbHlSZXNldChkZXYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhZ2dfdGFsLT50aW1lKys7CisgICAgYWdnX3RhbC0+YXZnX2dvdF9wYWNrZXRzID0gKGFnZ190YWwtPmF2Z19nb3RfcGFja2V0cyAqIChhZ2dfdGFsLT50aW1lIC0gMSkgKworICAgICAgICAgICAgYWdnX3RhbC0+Z290X3BhY2tldHNfc3VtKSAvIGFnZ190YWwtPnRpbWU7CisgICAgYWdnX3RhbC0+YXZnX2dvdF9ieXRlcyA9IChhZ2dfdGFsLT5hdmdfZ290X2J5dGVzICogKGFnZ190YWwtPnRpbWUgLSAxKSArCisgICAgICAgICAgICBhZ2dfdGFsLT5nb3RfYnl0ZXNfc3VtKSAvIGFnZ190YWwtPnRpbWU7CisgICAgYWdnX3RhbC0+YXZnX3NlbnRfcGFja2V0cyA9IChhZ2dfdGFsLT5hdmdfc2VudF9wYWNrZXRzICogKGFnZ190YWwtPnRpbWUgLSAxKQorICAgICAgICAgICAgKyBhZ2dfdGFsLT5zZW50X3BhY2tldHNfc3VtKSAvIGFnZ190YWwtPnRpbWU7CisgICAgYWdnX3RhbC0+YXZnX3NlbnRfYnl0ZXMgPSAoYWdnX3RhbC0+YXZnX3NlbnRfYnl0ZXMgKiAoYWdnX3RhbC0+dGltZSAtIDEpICsKKyAgICAgICAgICAgIGFnZ190YWwtPnNlbnRfYnl0ZXNfc3VtKSAvIGFnZ190YWwtPnRpbWU7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImdvdF9wYWNrZXRzX3N1bSA9IiwgYWdnX3RhbC0+Z290X3BhY2tldHNfc3VtKTsKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiICBnb3RfYnl0ZXNfc3VtID0iLCBhZ2dfdGFsLT5nb3RfYnl0ZXNfc3VtKTsKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAic2VudF9wYWNrZXRzX3N1bT0iLCBhZ2dfdGFsLT5zZW50X3BhY2tldHNfc3VtKTsKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiIHNlbnRfYnl0ZXNfc3VtID0iLCBhZ2dfdGFsLT5zZW50X2J5dGVzX3N1bSk7CisgICAgYWdnX3RhbC0+Z290X3BhY2tldHNfc3VtID0gYWdnX3RhbC0+Z290X2J5dGVzX3N1bSA9YWdnX3RhbC0+c2VudF9wYWNrZXRzX3N1bQorICAgICAgICAgICAgICAgID0gYWdnX3RhbC0+c2VudF9ieXRlc19zdW0gPSAwOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJhdmdfZ290X3BhY2tldHMgPSIsIGFnZ190YWwtPmF2Z19nb3RfcGFja2V0cyk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiAgYXZnX2dvdF9ieXRlcyA9IiwgYWdnX3RhbC0+YXZnX2dvdF9ieXRlcyk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImF2Z19zZW50X3BhY2tldHM9IiwgYWdnX3RhbC0+YXZnX3NlbnRfcGFja2V0cyk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiBhdmdfc2VudF9ieXRlcyA9IiwgYWdnX3RhbC0+YXZnX3NlbnRfYnl0ZXMpOworICAgIGlmICgod2QtPmNvbW1UYWxseS5CQV9GYWlsID09IDApIHx8ICh3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPT0gMCkpCisgICAgeworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiSGFyZHdhcmUgVHggTVBEVT0iLCB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUpOworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiICBCQSBGYWlsIG51bWJlcj0iLCB3ZC0+Y29tbVRhbGx5LkJBX0ZhaWwpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIxLyhCQSBmYWlsIHJhdGUpPSIsIHdkLT5jb21tVGFsbHkuSHdfVHhfTVBEVS93ZC0+Y29tbVRhbGx5LkJBX0ZhaWwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmQWdnUnhDbGVhcih6ZGV2X3QqIGRldiwgdTMyX3QgdGltZSkKK3sKKyAgICB1MTZfdCAgIGk7CisgICAgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworICAgICAgICBpZiAodGlkX3J4LT5iYXdfaGVhZCAhPSB0aWRfcngtPmJhd190YWlsKQorICAgICAgICB7CisgICAgICAgICAgICB1MTZfdCBqID0gdGlkX3J4LT5iYXdfdGFpbDsKKyAgICAgICAgICAgIHdoaWxlICgoaiAhPSB0aWRfcngtPmJhd19oZWFkKSAmJiAhdGlkX3J4LT5mcmFtZVtqXS5idWYpIHsKKyAgICAgICAgICAgIAlqID0gKGogKyAxKSAmIFpNX0FHR19CQVdfTUFTSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaiAhPSB0aWRfcngtPmJhd19oZWFkKSAmJiAodGltZSAtIHRpZF9yeC0+ZnJhbWVbal0uYXJyaXZhbFRpbWUpID4KKyAgICAgICAgICAgICAgICAgICAgKFpNX0FHR19DTEVBUl9USU1FIC0gNSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB6bV9tc2cwX2FnZyhaTV9MVl8xLCAicXVldWUgUnhGbHVzaCBieSBSeENsZWFyIik7CisgICAgICAgICAgICAgICAgemZBZ2dSeEZsdXNoKGRldiwgMCwgdGlkX3J4KTsKKyAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3N0cnVjdCBhZ2dfdGlkX3J4KiB6ZkFnZ1J4RW5hYmxlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICBkc3QwLCBzcmNbM10sIGFjLCBhaWQsIGZyYWdPZmY7CisgICAgdThfdCAgICB1cDsKKyAgICB1MTZfdCAgIG9mZnNldCA9IDA7CisgICAgdTE2X3QgICBzZXFfbm87CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZVN1YnR5cGU7CisgICAgdTMyX3QgdGNwX3NlcTsKKyAgICAvL3N0cnVjdCBhZ2dTdGEgKmFnZ19zdGE7CisjaWYgWk1fQUdHX0ZQR0FfUkVPUkRFUklORworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcng7CisjZW5kaWYKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjIpID4+IDQ7CisgICAgLy9EYmdQcmludCgiUnggc2VxPSVkXG4iLCBzZXFfbm8pOworICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmcmFtZUN0cmwgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKTsKKyAgICBmcmFtZVR5cGUgPSBmcmFtZUN0cmwgJiAweGY7CisgICAgZnJhbWVTdWJ0eXBlID0gZnJhbWVDdHJsICYgMHhmMDsKKworCisgICAgaWYgKGZyYW1lVHlwZSAhPSBaTV9XTEFOX0RBVEFfRlJBTUUpIC8vbm9uLVFvcyBEYXRhPyAoZnJhbWVTdWJ0eXBlJjB4ODApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX1BFUkZPUk1BTkNFX0VWQUxVQVRJT04KKyAgICB0Y3Bfc2VxID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjIrMzYpIDw8IDI0OworICAgIHRjcF9zZXEgKz0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjIrMzcpIDw8IDE2OworICAgIHRjcF9zZXEgKz0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjIrMzgpIDw8IDg7CisgICAgdGNwX3NlcSArPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyMiszOSk7CisjZW5kaWYKKworICAgIFpNX1NFUV9ERUJVRygiSW4gICAgICAgICAgICAgICAgICAgJTVkLCAlMTJ1XG4iLCBzZXFfbm8sIHRjcF9zZXEpOworICAgIGRzdDAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrNCk7CisKKyAgICBzcmNbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTApOworICAgIHNyY1sxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzE0KTsKKworI2lmIFpNX0FHR19GUEdBX0RFQlVHCisgICAgYWlkID0gMDsKKyNlbHNlCisgICAgYWlkID0gemZBcEZpbmRTdGEoZGV2LCBzcmMpOworI2VuZGlmCisKKyAgICAvL2FnZ19zdGEgPSAmd2QtPmFnZ1N0YVthaWRdOworICAgIC8vemZUeEdldElwVG9zQW5kRnJhZyhkZXYsIGJ1ZiwgJnVwLCAmZnJhZ09mZik7CisgICAgLy9hYyA9IHpjVXBUb0FjW3VwJjB4N10gJiAweDM7CisKKyAgICAvKgorICAgICAqIEZpbHRlciB1bmljYXN0IGZyYW1lIG9ubHksIGFpZCA9PSAwIGlzIGZvciBkZWJ1ZyBvbmx5CisgICAgICovCisgICAgaWYgKChkc3QwICYgMHgxKSA9PSAwICYmIGFpZCA9PSAwKQorICAgIHsKKyNpZiBaTV9BR0dfRlBHQV9SRU9SREVSSU5HCisgICAgICAgIHRpZF9yeCA9IHpmQWdnUnhHZXRRdWV1ZShkZXYsIGJ1ZikgOworICAgICAgICBpZighdGlkX3J4KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAodGlkX3J4LT5hZGRCYUV4Y2hhbmdlU3RhdHVzQ29kZSA9PSBaTV9BR0dfQUREQkFfUkVTUE9OU0UpCisgICAgICAgICAgICByZXR1cm4gdGlkX3J4OworICAgICAgICB9CisjZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit1MTZfdCB6ZkFnZ1J4KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4KQoreworICAgIHUxNl90ICAgc2VxX25vOworICAgIHMxNl90ICAgaW5kZXg7CisgICAgdTE2X3QgICBvZmZzZXQgPSAwOworICAgIHpidWZfdCogcGJ1ZjsKKyAgICB1OF90ICAgIGZyYW1lU3ViVHlwZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICBaTV9QRVJGT1JNQU5DRV9SWF9SRU9SREVSKGRldik7CisKKyAgICBzZXFfbm8gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMjIpID4+IDQ7CisKKyAgICBpbmRleCA9IHNlcV9ubyAtIHRpZF9yeC0+c2VxX3N0YXJ0OworICAgIC8qCisgICAgICogZm9yIGRlYnVnCisgICAgICovCisKKyAgICAvKiB6bV9tc2cyX2FnZyhaTV9MVl8wLCAicXVldWUgc2VxID0gIiwgc2VxX25vKTsKKyAgICAgKiBEYmdQcmludCgiJXM6JXMlbHhoICVzJWx4aFxuIiwgX19GVU5DVElPTl9fLCAicXVldWUgc2VxPSIsIHNlcV9ubywKKyAgICAgKiAgICI7IHNlcV9zdGFydD0iLCB0aWRfcngtPnNlcV9zdGFydCk7CisgICAgICovCisKKyAgICAvL0RiZ1ByaW50KCJzZXFfbm89JWQsIHNlcV9zdGFydD0lZFxuIiwgc2VxX25vLCB0aWRfcngtPnNlcV9zdGFydCk7CisKKyAgICAvKiBJbiBzb21lIEFQcywgd2UgZm91bmQgdGhhdCBpdCBtaWdodCB0cmFuc21pdCBOVUxMIGRhdGEgd2hvc2Ugc2VxdWVuY2UgbnVtYmVyCisgICAgICAgaXMgb3V0IG9yIG9yZGVyLiBJbiBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGlnbm9yZSB0aGVzZSBOVUxMIGRhdGEuCisgICAgICovCisKKyAgICBmcmFtZVN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCkgJiAweEYwKSA+PiA0OworCisgICAgLyogSWYgdGhpcyBpcyBhIE5VTEwgZGF0YSBpbnN0ZWFkIG9mIFFvcyBOVUxMIGRhdGEgKi8KKyAgICBpZiAoKGZyYW1lU3ViVHlwZSAmIDB4MEMpID09IDB4MDQpCisgICAgeworICAgICAgICBzMTZfdCBzZXFfZGlmZjsKKworICAgICAgICBzZXFfZGlmZiA9IChzZXFfbm8gPiB0aWRfcngtPnNlcV9zdGFydCkgPworICAgICAgICAgICAgICAgICAgICAgICBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydCA6IHRpZF9yeC0+c2VxX3N0YXJ0IC0gc2VxX25vOworCisgICAgICAgIGlmIChzZXFfZGlmZiA+IFpNX0FHR19CQVdfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRnJlZSBSeCBOVUxMIGRhdGEgaW4gemZBZ2dSeCIpOworCisgICAgICAgICAgICAvKiBGcmVlIFJ4IGJ1ZmZlciAqLworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICByZXR1cm4gWk1fRVJSX09VVF9PRl9PUkRFUl9OVUxMX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHNlcXVlbmNlIG51bWJlciB3cmFwIGF0IDRrCisgICAgICovCisgICAgaWYgKHRpZF9yeC0+c2VxX3N0YXJ0ID4gc2VxX25vKQorICAgIHsKKyAgICAgICAgLy9pbmRleCArPSA0MDk2OworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA+PSA0MDk2KSB7CisgICAgICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIH0KKworICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA9PSBzZXFfbm8pIHsKKyAgICAJem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAJaWYgKCgodGlkX3J4LT5iYXdfaGVhZCAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSA+IDApIHsKKyAgICAJICAgIC8vRGJnUHJpbnQoImhlYWQ9JWQsIHRhaWw9JWQiLCB0aWRfcngtPmJhd19oZWFkLCB0aWRfcngtPmJhd190YWlsKTsKKyAgICAgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICB9CisgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gKHRpZF9yeC0+c2VxX3N0YXJ0ICsgMSkgJiAoNDA5NiAtIDEpOworICAgIAl6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIGJ1Zik7CisKKyAgICAJaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKSA+PiA0OworICAgICAgICAgICAgLy9EYmdQcmludCgiUmVjdiBpbmRpY2F0ZSBzZXE9JWRcbiIsIHNlcV9ubyk7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCIxLiBzZXE9JWRcbiIsIHNlcV9ubyk7CisKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXpmQWdnUnhFbnF1ZXVlKGRldiwgYnVmLCB0aWRfcngsIGFkZEluZm8pKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHVwbGljYXRlZCBwYWNrZXQKKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHdoaWxlICh0aWRfcngtPmJhd19oZWFkICE9IHRpZF9yeC0+YmF3X3RhaWwpIHsvLyAmJiB0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmJ1ZikKKyAgICAgICAgdTE2X3QgdGFpbEluZGV4OworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgdGFpbEluZGV4ID0gdGlkX3J4LT5iYXdfdGFpbDsKKyAgICAgICAgcGJ1ZiA9IHRpZF9yeC0+ZnJhbWVbdGFpbEluZGV4XS5idWY7CisgICAgICAgIHRpZF9yeC0+ZnJhbWVbdGFpbEluZGV4XS5idWYgPSAwOworICAgICAgICBpZiAoIXBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9ICh0aWRfcngtPnNlcV9zdGFydCArIDEpICYgKDQwOTYgLSAxKTsKKworCisgICAgICAgIC8vaWYocGJ1ZiAmJiB0aWRfcngtPmJhd19zaXplID4gMCkKKyAgICAgICAgLy8gICAgdGlkX3J4LT5iYXdfc2l6ZS0tOworCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfUlhfU0VRKGRldiwgcGJ1Zik7CisKKyAgICAgICAgaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIHBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJlY3YgaW5kaWNhdGUgc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgLy9EYmdQcmludCgiMS4gc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBwYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIHBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJlY3YgaW5kaWNhdGUgc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgcGJ1ZiwgYWRkSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RydWN0IGFnZ190aWRfcnggKnpmQWdnUnhHZXRRdWV1ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICBzcmNbM107CisgICAgdTE2X3QgICBhaWQsIGFjLCBpOworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMCk7CisgICAgc3JjWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICBzcmNbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTQpOworICAgIGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKTsKKworICAgIGFjID0gKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI0KSAmIDB4Rik7CisKKyAgICAvLyBtYXJrIGJ5IHNwaW4gbG9jayBkZWJ1ZworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkUgOyBpKyspCisgICAgeworICAgICAgICBpZigod2QtPnRpZF9yeFtpXS0+YWlkID09IGFpZCkgJiYgKHdkLT50aWRfcnhbaV0tPmFjID09IGFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGlkX3J4ID0gd2QtPnRpZF9yeFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbWFyayBieSBzcGluIGxvY2sgZGVidWcKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIHRpZF9yeDsKK30KKworCit1MTZfdCAgIHpmQWdnUnhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvKQoreworICAgIHUxNl90IHNlcV9ubywgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBxX2luZGV4OworICAgIHMxNl90IGluZGV4OworICAgIHU4X3QgIGJkcm9wZnJhbWUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICBpbmRleCAgPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKworICAgIC8qCisgICAgICogc2VxdWVuY2UgbnVtYmVyIHdyYXAgYXQgNGsKKyAgICAgKiAtMTAwMDogY2hlY2sgZm9yIGR1cGxpY2F0ZSBwYXN0IHBhY2tldAorICAgICAqLworICAgIGJkcm9wZnJhbWUgPSAwOworICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA+IHNlcV9ubykgeworICAgICAgICBpZiAoKHRpZF9yeC0+c2VxX3N0YXJ0ID4gMzk2NykgJiYgKHNlcV9ubyA8IDEyOCkpIHsKKyAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgIH0gZWxzZSBpZiAodGlkX3J4LT5zZXFfc3RhcnQgLSBzZXFfbm8gPiA3MCkgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHRpZF9yeC0+c3FfYmVoaW5kX2NvdW50Kys7CisgICAgICAgICAgICBpZiAodGlkX3J4LT5zcV9iZWhpbmRfY291bnQgPiAzKSB7CisgICAgICAgICAgICAgICAgdGlkX3J4LT5zcV9iZWhpbmRfY291bnQgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiZHJvcGZyYW1lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZHJvcGZyYW1lID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydCA+IDcwKSB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgdGlkX3J4LT5zcV9leGNlZWRfY291bnQrKzsKKyAgICAgICAgICAgIGlmICh0aWRfcngtPnNxX2V4Y2VlZF9jb3VudCA+IDMpIHsKKyAgICAgICAgICAgICAgICB0aWRfcngtPnNxX2V4Y2VlZF9jb3VudCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJkcm9wZnJhbWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiZHJvcGZyYW1lID09IDEpIHsKKyAgICAgICAgLyppZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkgeworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBidWYsIGFkZEluZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfSovCisKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfRlJFRShkZXYsIGJ1Zik7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8qemZBZ2dSeEZsdXNoKGRldiwgc2VxX25vLCB0aWRfcngpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IHNlcV9ubzsKKyAgICAgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgKi8KKworICAgICAgICAvL0RiZ1ByaW50KCJGcmVlIGFuIG9sZCBwYWNrZXQsIHNlcV9zdGFydD0lZCwgc2VxX25vPSVkXG4iLCB0aWRfcngtPnNlcV9zdGFydCwgc2VxX25vKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBkdXBsaWNhdGUgcGFzdCBwYWNrZXQKKyAgICAgICAgICogaGFwcGVucyBvbmx5IGluIHNpbXVsYXRlZCBhZ2dyZWdhdGlvbiBlbnZpcm9ubWVudAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHRpZF9yeC0+c3FfZXhjZWVkX2NvdW50ID4gMCl7CisgICAgICAgICAgICB0aWRfcngtPnNxX2V4Y2VlZF9jb3VudC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpZF9yeC0+c3FfYmVoaW5kX2NvdW50ID4gMCkgeworICAgICAgICAgICAgdGlkX3J4LT5zcV9iZWhpbmRfY291bnQtLTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgemZBZ2dSeEZsdXNoKGRldiwgc2VxX25vLCB0aWRfcngpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IHNlcV9ubzsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0KKworICAgIC8vaWYgKGluZGV4ID49IChaTV9BR0dfQkFXX1NJWkUgLSAxKSkKKyAgICBpZiAoaW5kZXggPj0gKFpNX0FHR19CQVdfTUFTSykpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBxdWV1ZSBmdWxsCisgICAgICAgICAqLworICAgICAgICAvL0RiZ1ByaW50KCJpbmRleCA+PSA2NCwgc2VxX3N0YXJ0PSVkLCBzZXFfbm89JWRcbiIsIHRpZF9yeC0+c2VxX3N0YXJ0LCBzZXFfbm8pOworICAgICAgICB6ZkFnZ1J4Rmx1c2goZGV2LCBzZXFfbm8sIHRpZF9yeCk7CisgICAgICAgIC8vdGlkX3J4LT5zZXFfc3RhcnQgPSBzZXFfbm87CisgICAgICAgIGluZGV4ID0gc2VxX25vIC0gdGlkX3J4LT5zZXFfc3RhcnQ7CisgICAgICAgIGlmICgodGlkX3J4LT5zZXFfc3RhcnQgPiBzZXFfbm8pICYmICh0aWRfcngtPnNlcV9zdGFydCA+IDEwMDApICYmICh0aWRfcngtPnNlcV9zdGFydCAtIDEwMDApID4gc2VxX25vKQorICAgICAgICB7CisgICAgICAgIC8vaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgLy9pbmRleCA9IHNlcV9ubyAtIHRpZF9yeC0+c2VxX3N0YXJ0OworICAgICAgICB3aGlsZSAoaW5kZXggPj0gKFpNX0FHR19CQVdfTUFTSykpIHsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoImluZGV4ID49IDY0LCBzZXFfc3RhcnQ9JWQsIHNlcV9ubz0lZFxuIiwgdGlkX3J4LT5zZXFfc3RhcnQsIHNlcV9ubyk7CisgICAgICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9ICh0aWRfcngtPnNlcV9zdGFydCArIFpNX0FHR19CQVdfTUFTSykgJiAoNDA5NiAtIDEpOworICAgICAgICAgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgICAgIGlmICgodGlkX3J4LT5zZXFfc3RhcnQgPiBzZXFfbm8pICYmICh0aWRfcngtPnNlcV9zdGFydCA+IDEwMDApICYmICh0aWRfcngtPnNlcV9zdGFydCAtIDEwMDApID4gc2VxX25vKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHFfaW5kZXggPSAodGlkX3J4LT5iYXdfdGFpbCArIGluZGV4KSAmIFpNX0FHR19CQVdfTUFTSzsKKyAgICBpZiAodGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYgJiYgKCgodGlkX3J4LT5iYXdfaGVhZCAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSA+CisgICAgICAgICAgICAgICAgKCgocV9pbmRleCkgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykpKQorICAgIHsKKworICAgICAgICBaTV9QRVJGT1JNQU5DRV9EVVAoZGV2LCB0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZiwgYnVmKTsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8vRGJnUHJpbnQoIkZyZWUgYSBkdXBsaWNhdGUgcGFja2V0LCBzZXFfc3RhcnQ9JWQsIHNlcV9ubz0lZFxuIiwgdGlkX3J4LT5zZXFfc3RhcnQsIHNlcV9ubyk7CisgICAgICAgIC8vRGJnUHJpbnQoImhlYWQ9JWQsIHRhaWw9JWQiLCB0aWRfcngtPmJhd19oZWFkLCB0aWRfcngtPmJhd190YWlsKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHVwbGljYXRlIHBhY2tldAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZih0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZikgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYsIDApOworICAgICAgICB0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZiA9IDA7CisgICAgfQorCisgICAgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYgPSBidWY7CisgICAgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5hcnJpdmFsVGltZSA9IHptX2FnZ19HZXRUaW1lKCk7CisgICAgemZ3TWVtb3J5Q29weSgodm9pZCopJnRpZF9yeC0+ZnJhbWVbcV9pbmRleF0uYWRkSW5mbywgKHZvaWQqKWFkZEluZm8sIHNpemVvZihzdHJ1Y3QgenNBZGRpdGlvbkluZm8pKTsKKworICAgIC8qCisgICAgICogZm9yIGRlYnVnIHNpbXVsYXRlZCBhZ2dyZWdhdGlvbiBvbmx5LAorICAgICAqIHNob3VsZCBiZSBkb25lIGluIHJ4IG9mIEFEREJBIFJlcXVlc3QKKyAgICAgKi8KKyAgICAvL3RpZF9yeC0+YWRkSW5mbyA9IGFkZEluZm87CisKKworICAgIGlmICgoKHRpZF9yeC0+YmF3X2hlYWQgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykgPD0gaW5kZXgpCisgICAgeworICAgICAgICAvL3RpZF9yeC0+YmF3X3NpemUgPSBpbmRleCArIDE7CisgICAgICAgIGlmICgoKHRpZF9yeC0+YmF3X2hlYWQgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykgPD0KKyAgICAgICAgICAgICAgICAvLygocV9pbmRleCArIDEpICYgWk1fQUdHX0JBV19NQVNLKSkKKyAgICAgICAgICAgICAgICAoKChxX2luZGV4KSAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSkvL3RpZF9yeC0+YmF3X3NpemUgKQorICAgICAgICAgICAgdGlkX3J4LT5iYXdfaGVhZCA9IChxX2luZGV4ICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKgorICAgICAqIHN1Y2Nlc3MKKyAgICAgKi8KKyAgICAvL0RiZ1ByaW50KCJoZWFkPSVkLCB0YWlsPSVkLCBzdGFydD0lZCIsIHRpZF9yeC0+YmF3X2hlYWQsIHRpZF9yeC0+YmF3X3RhaWwsIHRpZF9yeC0+c2VxX3N0YXJ0KTsKKyAgICByZXR1cm4gMTsKK30KKwordTE2X3QgemZBZ2dSeEZsdXNoKHpkZXZfdCogZGV2LCB1MTZfdCBzZXFfbm8sIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcngpCit7CisgICAgemJ1Zl90KiBwYnVmOworICAgIHUxNl90ICAgc2VxOworICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfRkxVU0goZGV2KTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHRpZF9yeC0+YmF3X3RhaWwgPT0gdGlkX3J4LT5iYXdfaGVhZCkgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcGJ1ZiA9IHRpZF9yeC0+ZnJhbWVbdGlkX3J4LT5iYXdfdGFpbF0uYnVmOworICAgICAgICB6ZndNZW1vcnlDb3B5KCh2b2lkKikmYWRkSW5mbywgKHZvaWQqKSZ0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmFkZEluZm8sIHNpemVvZihzdHJ1Y3QgenNBZGRpdGlvbkluZm8pKTsKKyAgICAgICAgdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWYgPSAwOworICAgICAgICAvL2lmKHBidWYgJiYgdGlkX3J4LT5iYXdfc2l6ZSA+IDApIHRpZF9yeC0+YmF3X3NpemUtLTsKKyAgICAgICAgdGlkX3J4LT5iYXdfdGFpbCA9ICh0aWRfcngtPmJhd190YWlsICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gKHRpZF9yeC0+c2VxX3N0YXJ0ICsgMSkgJiAoNDA5NiAtIDEpOworCSAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmIChwYnVmKQorICAgICAgICB7CisKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIHBidWYpOworCisgICAgICAgICAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgcGJ1ZiwgMjIpID4+IDQ7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiUmVjdiBpbmRpY2F0ZSBzZXE9JWRcbiIsIHNlcSk7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiMi4gc2VxPSVkXG4iLCBzZXEpOworICAgICAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgcGJ1ZiwgJmFkZEluZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBwYnVmLCAyMikgPj4gNDsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJSZWN2IGluZGljYXRlIHNlcT0lZFxuIiwgc2VxKTsKKyAgICAgICAgICAgICAgICB6ZmlSZWN2ODAyMTEoZGV2LCBwYnVmLCAmYWRkSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHRpZF9yeC0+YmF3X2hlYWQgPSB0aWRfcngtPmJhd190YWlsID0gMDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybiAxOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnUnhGcmVlQnVmICAgICAgICAgICAgICAqLworLyogICAgICBGcmVlcyBhbGwgcXVldWVkIHBhY2tldHMgaW4gYnVmZmVyIHdoZW4gdGhlIGRyaXZlciBpcyBkb3duLiAgICAgKi8KKy8qICAgICAgVGhlIHpmRnJlZVJlc291cmNlKCkgd2lsbCBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIGFsbCBmcmVlZC4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2ICAgICA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90ICAgemZBZ2dSeEZyZWVCdWYoemRldl90KiBkZXYsIHUxNl90IGRlc3Ryb3kpCit7CisgICAgdTE2X3QgICBpOworICAgIHpidWZfdCogYnVmOworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcng7CisKKyAgICBUSURfVFggIHRpZF90eDsKKyAgICAvL3N0cnVjdCBidWZJbmZvICpidWZfaW5mbzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgdTE2X3QgajsKKworICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworCisgICAgICAgIGZvcihqPTA7IGogPD0gWk1fQUdHX0JBV19TSVpFOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBidWYgPSB0aWRfcngtPmZyYW1lW2pdLmJ1ZjsKKyAgICAgICAgICAgIHRpZF9yeC0+ZnJhbWVbal0uYnVmID0gMDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoIHRpZF9yeC0+YmF3X2hlYWQgIT0gdGlkX3J4LT5iYXdfdGFpbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0aWRfcngtPmJhd19oZWFkICE9IHRpZF9yeC0+YmF3X3RhaWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmID0gdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWY7CisgICAgICAgICAgICAgICAgdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWYgPSAwOworICAgICAgICAgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICB0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmJ1ZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgLy9pZiAodGlkX3J4LT5iYXdfc2l6ZSA+IDApdGlkX3J4LT5iYXdfc2l6ZS0tOworICAgICAgICAgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICAgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0Kys7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IDA7CisgICAgICAgIHRpZF9yeC0+YmF3X2hlYWQgPSB0aWRfcngtPmJhd190YWlsID0gMDsKKyAgICAgICAgdGlkX3J4LT5haWQgPSBaTV9NQVhfU1RBX1NVUFBPUlQ7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgICAgICAjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCisgICAgICAgIGlmICh0aWRfYmF3LT5lbmFibGVkKSB7CisgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiRGV2aWNlIGRvd24sIGNsZWFyIEJBVyBxdWV1ZToiLCBpKTsKKyAgICAgICAgICAgIEJBVy0+ZGlzYWJsZShkZXYsIHRpZF9iYXcpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAjZW5kaWYKKyAgICAgICAgaWYgKDEgPT0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCkgeworICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgYnVmID0gemZBZ2dUeEdldFZ0eHEoZGV2LCB0aWRfdHgpOworICAgICAgICAgICAgd2hpbGUgKGJ1ZikgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgIGJ1ZiA9IHpmQWdnVHhHZXRWdHhxKGRldiwgdGlkX3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGRlc3Ryb3kpIHsKKyAgICAgICAgICAgIHpmd01lbUZyZWUoZGV2LCB3ZC0+YWdnUVBvb2xbaV0sIHNpemVvZihzdHJ1Y3QgYWdnUXVldWUpKTsKKyAgICAgICAgICAgIHpmd01lbUZyZWUoZGV2LCB3ZC0+dGlkX3J4W2ldLCBzaXplb2Yoc3RydWN0IGFnZ190aWRfcngpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVworICAgIGlmKGRlc3Ryb3kpIHpmd01lbUZyZWUoZGV2LCBCQVcsIHNpemVvZihzdHJ1Y3QgYmF3X2VuYWJsZXIpKTsKKyAgICAjZW5kaWYKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworCit2b2lkIHpmQWdnUmVjdkJBUih6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYpIHsKKyAgICB1MTZfdCBzdGFydF9zZXEsIGxlbjsKKyAgICB1OF90IGksIGJpdG1hcFs4XTsKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBzdGFydF9zZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBsZW4tMik7CisgICAgRGJnUHJpbnQoIlJlY2VpdmVkIGEgQkFSIENvbnRyb2wgZnJhbWUsIHN0YXJ0X3NlcT0lZCIsIHN0YXJ0X3NlcT4+NCk7CisgICAgLyogdG9kbzogc2V0IHRoZSBiaXRtYXAgYnkgcmVvcmRlcmluZyBidWZmZXIhICovCisgICAgZm9yIChpPTA7IGk8ODsgaSsrKSBiaXRtYXBbaV09MDsKKyAgICB6ZlNlbmRCQShkZXYsIHN0YXJ0X3NlcSwgYml0bWFwKTsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordm9pZCB6ZkFnZ1R4UmV0cmFuc21pdCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCkgeworICAgIHUxNl90IHJlbW92ZUxlbjsKKyAgICB1MTZfdCBlcnI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgaWYgKGFnZ0NvbnRyb2wgJiYgKFpNX0FHR19GSVJTVF9NUERVID09IGFnZ0NvbnRyb2wtPmFtcGR1SW5kaWNhdGlvbikgKSB7CisgICAgICAgIHRpZF90eC0+YmFyX3NzbiA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbMTVdOworICAgICAgICBhZ2dDb250cm9sLT50aWRfYmF3LT5zdGFydF9zZXEgPSB0aWRfdHgtPmJhcl9zc24gPj4gNDsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInN0YXJ0IHNlcT0iLCB0aWRfdHgtPmJhcl9zc24gPj4gNCk7CisgICAgfQorICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbNF0gfD0gKDEgPDwgMTEpOworICAgIGlmIChhZ2dDb250cm9sICYmIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQpIHsKKyAgICAgICAgLy9pZiAod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0wICYmICEoYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlcls2XSYweDEpKQorICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vaWYgKCgoYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlclsyXSAmIDB4MykgPT0gMikpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyWzFdIHw9IDB4MjA7CisgICAgICAgICAgICAgICAgaWYgKFpNX0FHR19MQVNUX01QRFUgPT0gYWdnQ29udHJvbC0+YW1wZHVJbmRpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbMV0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlclsxXSAmPSB+MHg0MDAwOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlpNX0FHR19MQVNUX01QRFUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vZWxzZSB7CisgICAgICAgICAgICAvLyAgICB6bV9kZWJ1Z19tc2cxKCJubyBhZ2dyLCBoZWFkZXJbMl0mMHgzID0gIixidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyWzJdICYgMHgzKQorICAgICAgICAgICAgLy8gICAgYWdnQ29udHJvbC0+YWdnRW5hYmxlZCA9IDA7CisgICAgICAgICAgICAvL30KKyAgICAgICAgLy99CisgICAgICAgIC8vZWxzZSB7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsIHdkLT5lbmFibGVBZ2dyZWdhdGlvbiA9ICIsIHdkLT5lbmFibGVBZ2dyZWdhdGlvbik7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsICFoZWFkZXJbNl0mMHgxID0gIiwhKGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbNl0mMHgxKSk7CisgICAgICAgIC8vICAgIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQgPSAwOworICAgICAgICAvL30KKyAgICB9CisKKyAgICAvKmlmIChhZ2dDb250cm9sLT50aWRfYmF3KSB7CisgICAgICAgIHN0cnVjdCBiYXdfaGVhZGVyX3IgaGVhZGVyX3I7CisKKyAgICAgICAgaGVhZGVyX3IuaGVhZGVyICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyOworICAgICAgICBoZWFkZXJfci5taWMgICAgICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5taWM7CisgICAgICAgIGhlYWRlcl9yLnNuYXAgICAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXA7CisgICAgICAgIGhlYWRlcl9yLmhlYWRlckxlbiAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlckxlbjsKKyAgICAgICAgaGVhZGVyX3IubWljTGVuICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuOworICAgICAgICBoZWFkZXJfci5zbmFwTGVuICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuOworICAgICAgICBoZWFkZXJfci5yZW1vdmVMZW4gICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5yZW1vdmVMZW47CisgICAgICAgIGhlYWRlcl9yLmtleUlkeCAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmtleUlkeDsKKworICAgICAgICBCQVctPmluc2VydChkZXYsIGJ1Zl9pbmZvLT5idWYsIHRpZF90eC0+YmFyX3NzbiA+PiA0LCBhZ2dDb250cm9sLT50aWRfYmF3LCBidWZfaW5mby0+YmF3X3JldHJhbnNtaXQsICZoZWFkZXJfcik7CisgICAgfSovCisKKyAgICBpZiAoKGVyciA9IHpmSHBTZW5kKGRldiwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlckxlbiwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXAsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YnVmLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+cmVtb3ZlTGVuLAorICAgICAgICAgICAgICAgICAgICBaTV9FWFRFUk5BTF9BTExPQ19CVUYsCisgICAgICAgICAgICAgICAgICAgICh1OF90KXRpZF90eC0+YWMsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5rZXlJZHgpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIHJldHVybjsKKworemxFcnJvcjoKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmX2luZm8tPmJ1ZiwgMCk7CisgICAgcmV0dXJuOworCit9CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeFNlbmRFdGggICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxlZCB0byB0cmFuc21pdCBFdGhlcm5ldCBmcmFtZSBmcm9tIHVwcGVyIGVsYXllci4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCwgMD0+c3RhbmRhcmQsIDB4MTAtMHgxNz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiwgSG9uZGEgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwgdTE2X3QgYnVmVHlwZSwgdThfdCBmbGFnLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCkKK3sKKyAgICB1MTZfdCBlcnI7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCByZW1vdmVMZW47CisgICAgdTE2X3QgaGVhZGVyWyg4KzMwKzIrMTgpLzJdOyAgICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgaGVhZGVyTGVuOworICAgIHUxNl90IG1pY1s4LzJdOworICAgIHUxNl90IG1pY0xlbjsKKyAgICB1MTZfdCBzbmFwWzgvMl07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1MTZfdCBmcmFnTGVuOworICAgIHUxNl90IGZyYW1lTGVuOworICAgIHUxNl90IGZyYWdOdW07CisgICAgc3RydWN0IHpzRnJhZyBmcmFnOworICAgIHUxNl90IGksIGlkOworICAgIHUxNl90IGRhWzNdOworICAgIHUxNl90IHNhWzNdOworICAgIHU4X3QgdXA7CisgICAgdThfdCBxb3NUeXBlLCBrZXlJZHggPSAwOworICAgIHUxNl90IGZyYWdPZmY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZUeFNlbmRFdGgoKSwgcG9ydD0iLCBwb3J0KTsKKworICAgIC8qIEdldCBJUCBUT1MgZm9yIFFvUyBBQyBhbmQgSVAgZnJhZyBvZmZzZXQgKi8KKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgLyogREEgKi8KKyAgICAgICAgZGFbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTgpOworICAgICAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDIwKTsKKyAgICAgICAgLyogU0EgKi8KKyAgICAgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgICAgIHNhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgICAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgLyogREEgKi8KKyAgICAgICAgZGFbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICAgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKyAgICAgICAgLyogU0EgKi8KKyAgICAgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgICAgIHNhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgICAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vCisgICAgfQorI2Vsc2UKKyAgICAvKiBEQSAqLworICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgIC8qIFNBICovCisgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgIHNhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworI2VuZGlmCisgICAgLy9EZWNpZGUgS2V5IEluZGV4IGluIEFUT00sIE5vIG1lYW5pbmcgaW4gT1RVUy0tQ1dZYW5nKG0pCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAga2V5SWR4ID0gd2QtPmFwLmJjSGFsS2V5SWR4W3BvcnRdOworICAgICAgICBpZCA9IHpmQXBGaW5kU3RhKGRldiwgZGEpOworICAgICAgICBpZiAoaWQgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICBjYXNlIFpNX1RLSVA6CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAga2V5SWR4ID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5rZXlJZHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoICh3ZC0+c3RhLmVuY3J5TW9kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFpNX1dFUDY0OgorICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICBrZXlJZHggPSB3ZC0+c3RhLmtleUlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgICAgICBpZiAoKGRhWzBdJiAweDEpKQorICAgICAgICAgICAgICAgIGtleUlkeCA9IDU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2V5SWR4ID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgIGtleUlkeCA9IHdkLT5zdGEuY2VuY0tleUlkOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ3JlYXRlIFNOQVAgKi8KKyAgICByZW1vdmVMZW4gPSB6ZlR4R2VuV2xhblNuYXAoZGV2LCBidWYsIHNuYXAsICZzbmFwTGVuKTsKKyAgICAvL3ptX21zZzFfdHgoWk1fTFZfMCwgImZyYWdPZmY9IiwgZnJhZ09mZik7CisKKyAgICBmcmFnTGVuID0gd2QtPmZyYWdUaHJlc2hvbGQ7CisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBmcmFtZUxlbiAtPSByZW1vdmVMZW47CisKKyNpZiAwCisgICAgLyogQ3JlYXRlIE1JQyAqLworICAgIGlmICggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSYmCisgICAgICAgICAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fVEtJUCkgKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmFtZUxlbiA+IGZyYWdMZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBtaWNMZW4gPSB6ZlR4R2VuV2xhblRhaWwoZGV2LCBidWYsIHNuYXAsIHNuYXBMZW4sIG1pYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhcHBlbmQgTUlDIGJ5IEhNQUMgKi8KKyAgICAgICAgICAgIG1pY0xlbiA9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWljTGVuID0gMDsKKyAgICB9CisjZWxzZQorICAgIGlmICggZnJhbWVMZW4gPiBmcmFnTGVuICkKKyAgICB7CisgICAgICAgIG1pY0xlbiA9IHpmVHhHZW5XbGFuVGFpbChkZXYsIGJ1Ziwgc25hcCwgc25hcExlbiwgbWljKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogYXBwZW5kIE1JQyBieSBITUFDICovCisgICAgICAgIG1pY0xlbiA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBBY2Nlc3MgQ2F0ZWdvcnkgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB6ZkFwR2V0U3RhUW9zVHlwZShkZXYsIGRhLCAmcW9zVHlwZSk7CisgICAgICAgIGlmIChxb3NUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1cCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IFNUQSBRb1MgY29udHJvbCBmaWVsZCAqLworICAgICAgICB1cCA9IDA7CisgICAgfQorCisgICAgLyogQXNzaWduIHNlcXVlbmNlIG51bWJlciAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgZnJhZy5zZXFbMF0gPSAoKHdkLT5zZXFbemNVcFRvQWNbdXAmMHg3XV0rKykgPDwgNCk7CisgICAgaWYgKGFnZ0NvbnRyb2wgJiYgKFpNX0FHR19GSVJTVF9NUERVID09IGFnZ0NvbnRyb2wtPmFtcGR1SW5kaWNhdGlvbikgKSB7CisgICAgICAgIHRpZF90eC0+YmFyX3NzbiA9IGZyYWcuc2VxWzBdOworCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJzdGFydCBzZXE9IiwgdGlkX3R4LT5iYXJfc3NuID4+IDQpOworICAgIH0KKyAgICAvL3RpZF90eC0+YmF3X2J1Zlt0aWRfdHgtPmJhd19oZWFkLTFdLmJhd19zZXE9ZnJhZy5zZXFbMF07CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgICAgIGZyYWcuYnVmWzBdID0gYnVmOworICAgICAgICBmcmFnLmJ1ZlR5cGVbMF0gPSBidWZUeXBlOworICAgICAgICBmcmFnLmZsYWdbMF0gPSBmbGFnOworICAgICAgICBmcmFnTnVtID0gMTsKKworICAgIGZvciAoaT0wOyBpPGZyYWdOdW07IGkrKykKKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBXTEFOIGhlYWRlcihDb250cm9sIFNldHRpbmcgKyA4MDIuMTEgaGVhZGVyICsgSVYpICovCisgICAgICAgIGlmICh1cCAhPTAgKSB6bV9kZWJ1Z19tc2cxKCJ1cCBub3QgMCwgdXA9Iix1cCk7CisgICAgICAgIGhlYWRlckxlbiA9IHpmVHhHZW5XbGFuSGVhZGVyKGRldiwgZnJhZy5idWZbaV0sIGhlYWRlciwgZnJhZy5zZXFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuZmxhZ1tpXSwgc25hcExlbittaWNMZW4sIHJlbW92ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgZGEsIHNhLCB1cCwgJm1pY0xlbiwgc25hcCwgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdnQ29udHJvbCk7CisKKyAgICAgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgICAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBmcmFnLmJ1ZltpXSwgJmFkZHJUYmwpKSA9PSAwKQorICAgICAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGZyYWcuYnVmW2ldLCAmYWRkclRibCkpID09IDApCisgICAgICAgIC8veworICAgICAgICAvLyAgICBlcnIgPSBaTV9FUlJfQlVGRkVSX0RNQV9BRERSOworICAgICAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgICAgIC8vfQorCisgICAgICAgIC8qIEZsdXNoIGJ1ZmZlciBvbiBjYWNoZSAqLworICAgICAgICAvL3pmd0J1ZkZsdXNoKGRldiwgZnJhZy5idWZbaV0pOworCisjaWYgMAorICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJoZWFkZXJMZW49IiwgaGVhZGVyTGVuKTsKKyAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAic25hcExlbj0iLCBzbmFwTGVuKTsKKyAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAibWljTGVuPSIsIG1pY0xlbik7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgInJlbW92ZUxlbj0iLCByZW1vdmVMZW4pOworICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgImZyYWcuYnVmVHlwZVswXT0iLCBmcmFnLmJ1ZlR5cGVbMF0pOworI2VuZGlmCisKKyAgICAgICAgZnJhZ0xlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBmcmFnLmJ1ZltpXSk7CisgICAgICAgIGlmICgoZGFbMF0mMHgxKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RPY3RldHMgKz0gKGZyYWdMZW4rc25hcExlbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGRhWzBdJiAweDEpKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4QnJvYWRjYXN0RnJtKys7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4QnJvYWRjYXN0T2N0ZXRzICs9IChmcmFnTGVuK3NuYXBMZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdE9jdGV0cyArPSAoZnJhZ0xlbitzbmFwTGVuKTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYysrOworCisjaWYgMCAvL1dobyBjYXJlIHRoaXM/CisgICAgICAgIGlmICggKGkpJiYoaSA9PSAoZnJhZ051bS0xKSkgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+dHJhZlRhbGx5LnR4RGF0YUJ5dGVDb3VudCAtPSBtaWNMZW47CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qaWYgKGFnZ0NvbnRyb2wtPnRpZF9iYXcgJiYgYWdnQ29udHJvbC0+YWdnRW5hYmxlZCkgeworICAgICAgICAgICAgc3RydWN0IGJhd19oZWFkZXJfciBoZWFkZXJfcjsKKworICAgICAgICAgICAgaGVhZGVyX3IuaGVhZGVyICAgICAgPSBoZWFkZXI7CisgICAgICAgICAgICBoZWFkZXJfci5taWMgICAgICAgICA9IG1pYzsKKyAgICAgICAgICAgIGhlYWRlcl9yLnNuYXAgICAgICAgID0gc25hcDsKKyAgICAgICAgICAgIGhlYWRlcl9yLmhlYWRlckxlbiAgID0gaGVhZGVyTGVuOworICAgICAgICAgICAgaGVhZGVyX3IubWljTGVuICAgICAgPSBtaWNMZW47CisgICAgICAgICAgICBoZWFkZXJfci5zbmFwTGVuICAgICA9IHNuYXBMZW47CisgICAgICAgICAgICBoZWFkZXJfci5yZW1vdmVMZW4gICA9IHJlbW92ZUxlbjsKKyAgICAgICAgICAgIGhlYWRlcl9yLmtleUlkeCAgICAgID0ga2V5SWR4OworCisgICAgICAgICAgICBCQVctPmluc2VydChkZXYsIGJ1ZiwgdGlkX3R4LT5iYXJfc3NuID4+IDQsIGFnZ0NvbnRyb2wtPnRpZF9iYXcsIDAsICZoZWFkZXJfcik7CisgICAgICAgIH0qLworCisgICAgICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhlYWRlckxlbiwgc25hcCwgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljLCBtaWNMZW4sIGZyYWcuYnVmW2ldLCByZW1vdmVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuYnVmVHlwZVtpXSwgemNVcFRvQWNbdXAmMHg3XSwga2V5SWR4KSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisKKworICAgICAgICBjb250aW51ZTsKKworemxFcnJvcjoKKyAgICAgICAgaWYgKGZyYWcuYnVmVHlwZVtpXSA9PSBaTV9FWFRFUk5BTF9BTExPQ19CVUYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBmcmFnLmJ1ZltpXSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmcmFnLmJ1ZlR5cGVbaV0gPT0gWk1fSU5URVJOQUxfQUxMT0NfQlVGKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgZnJhZy5idWZbaV0sIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfSAvKiBmb3IgKGk9MDsgaTxmcmFnTnVtOyBpKyspICovCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworLyoKKyAqIHpmQWdnU2VuZEFEREJBKCkgcmVmZXJzIHpmU2VuZE1tRnJhbWUoKSBpbiBjbW0uYworICovCit1MTZfdCAgIHpmQWdnU2VuZEFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgdTE2X3QgKmRzdCwgdTE2X3QgYWMsIHUxNl90IHVwKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMzI7CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICAvKgorICAgICAqIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBtYW5hZ21lbnQgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgICovCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIC8qCisgICAgICogYWRkIGFkZGJhIGZyYW1lIGJvZHkKKyAgICAgKi8KKyAgICBvZmZzZXQgPSB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KGRldiwgYnVmLCBvZmZzZXQsIGFjLCB1cCk7CisKKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAvKgorICAgICAqIENvcHkgd2xhbiBoZWFkZXIKKyAgICAgKi8KKyAgICB6ZkFnZ0dlbkFkZGJhSGVhZGVyKGRldiwgZHN0LCBoZWFkZXIsIG9mZnNldC1obGVuLCBidWYsIHZhcCwgZW5jcnlwdCk7CisgICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCBoZWFkZXJbaV0pOworICAgIH0KKworICAgIC8qIEdldCBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8veworICAgIC8vICAgIGdvdG8gemxFcnJvcjsKKyAgICAvL30KKworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAib2Zmc2V0PSIsIG9mZnNldCk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJobGVuPSIsIGhsZW4pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibFNpemU9IiwgYWRkclRibFNpemUpOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibC5sZW5bMF09IiwgYWRkclRibC5sZW5bMF0pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibC5waHlzQWRkcmxbMF09IiwgYWRkclRibC5waHlzQWRkcmxbMF0pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5kYXRhPSIsIGJ1Zi0+ZGF0YSk7CisKKyAgICAjaWYgMAorICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwLCBidWYsIDAsCisgICAgICAgICAgICBaTV9JTlRFUk5BTF9BTExPQ19CVUYsIDAsIDB4ZmYpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKyAgICAjZWxzZQorICAgIHpmUHV0Vm1tcShkZXYsIGJ1Zik7CisgICAgemZQdXNoVnR4cShkZXYpOworICAgICNlbmRpZgorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisKK30KKwordTE2X3QgICB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBhYywgdTE2X3QgdXApCit7CisgICAgdTE2X3QgYmFfcGFyYW1ldGVyLCBzdGFydF9zZXE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgLyoKKyAgICAgKiBBRERCQSBSZXF1ZXN0IGZyYW1lIGJvZHkKKyAgICAgKi8KKworICAgIC8qCisgICAgICogQ2F0ZWdvcnkKKyAgICAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDMpOworICAgIC8qCisgICAgICogQWN0aW9uIGRldGFpbHMgPSAwCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0FEREJBX1JFUVVFU1RfRlJBTUUpOworICAgIC8qCisgICAgICogRGlhbG9nIFRva2VuID0gbm9uemVybworICAgICAqIFRCRDogZGVmaW5lIGhvdyB0byBnZXQgZGlhbG9nIHRva2VuPworICAgICAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMik7CisgICAgLyoKKyAgICAgKiBCbG9jayBBY2sgcGFyYW1ldGVyIHNldAorICAgICAqIEJBIHBvbGljeSA9IDEgZm9yIGltbWVkaWF0ZSBCQSwgMCBmb3IgZGVsYXllZCBCQQorICAgICAqIFRJRCg0Yml0cykgJiBidWZmZXIgc2l6ZSg0Yml0cykgKFRJRD11cCAmIGJ1ZmZlciBzaXplPTB4ODApCisgICAgICogVEJEOiBob3cgdG8gZ2V0IGJ1ZmZlciBzaXplPworICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgKiCieCAgICBCMCAgICCieCAgICBCMSAgICAgonggQjIgIEI1IKJ4IEI2ICAgICAgQjE1IKJ4CisgICAgICogonWid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAqIKJ4IFJlc2VydmVkIKJ4IEJBIHBvbGljeSCieCAgVElEICAgonggQnVmZmVyIHNpemUgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICovCisgICAgYmFfcGFyYW1ldGVyID0gMSA8PCAxMjsgICAgIC8vIGJ1ZmZlciBzaXplID0gMHg0MCg2NCkKKyAgICBiYV9wYXJhbWV0ZXIgfD0gdXAgPDwgMjsgICAgLy8gdGlkID0gdXAKKyAgICBiYV9wYXJhbWV0ZXIgfD0gMjsgICAgICAgICAgLy8gYmEgcG9saWN5ID0gMQorICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIGJhX3BhcmFtZXRlcik7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qCisgICAgICogQkEgdGltZW91dCB2YWx1ZQorICAgICAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDApOworICAgIG9mZnNldCs9MjsKKyAgICAvKgorICAgICAqIEJBIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcgorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggQjAgICAgICAgQjMgonggQjQgICAgICAgICAgICAgIEIxNSCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggRnJhZyBudW0oMCkgonggQkEgc3RhcnRpbmcgc2VxIG51bSCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICovCisgICAgc3RhcnRfc2VxID0gKCh3ZC0+c2VxW2FjXSkgPDwgNCkgJiAweEZGRjA7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgc3RhcnRfc2VxKTsKKyAgICBvZmZzZXQrPTI7CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCit1MTZfdCB6ZkFnZ0dlbkFkZGJhSGVhZGVyKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICB1OF90ICBobGVuID0gMzI7ICAgICAgICAvLyBNQUMgY3RybCArIFBIWSBjdHJsICsgODAyLjExIE1NIGhlYWRlcgorICAgIC8vdThfdCBmcmFtZVR5cGUgPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgY29udHJvbCBzZXR0aW5nCisgICAgICovCisgICAgLy9ib2R5TGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaGVhZGVyWzBdID0gMjQrbGVuKzQ7ICAgLy9MZW5ndGgKKyAgICBoZWFkZXJbMV0gPSAweDg7ICAgICAgICAvL01BQyBjb250cm9sLCBiYWNrb2ZmICsgKGFjaykKKworI2lmIDAKKyAgICAvKiBDQ0sgMU0gKi8KKyAgICBoZWFkZXJbMl0gPSAweDBmMDA7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgIGhlYWRlclszXSA9IDB4MDAwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisjZWxzZQorICAgIC8qIE9GRE0gNk0gKi8KKyAgICBoZWFkZXJbMl0gPSAweDBmMDE7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgIGhlYWRlclszXSA9IDB4MDAwQjsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisjZW5kaWYKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgV0xBTiBoZWFkZXIKKyAgICAgKiBGcmFtZSBjb250cm9sIGZyYW1lIHR5cGUgYW5kIHN1YnR5cGUKKyAgICAgKi8KKyAgICBoZWFkZXJbNCswXSA9IFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT047CisgICAgLyoKKyAgICAgKiBEdXJhdGlvbgorICAgICAqLworICAgIGhlYWRlcls0KzFdID0gMDsKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzQrOV0gPSB3ZC0+c3RhLmJzc2lkWzFdOworICAgICAgICBoZWFkZXJbNCsxMF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pCisgICAgeworICAgICAgICAvKiBBZGRyZXNzIDMgPSAwMDowMDowMDowMDowMDowMCAqLworICAgICAgICBoZWFkZXJbNCs4XSA9IDA7CisgICAgICAgIGhlYWRlcls0KzldID0gMDsKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzQrOV0gPSB3ZC0+c3RhLmJzc2lkWzFdOworICAgICAgICBoZWFkZXJbNCsxMF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIC8qIEFkZHJlc3MgMyA9IEJTU0lEICovCisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPm1hY0FkZHJbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPm1hY0FkZHJbMV07CisgICAgICAgIGhlYWRlcls0KzEwXSA9IHdkLT5tYWNBZGRyWzJdICsgKHZhcDw8OCk7CisgICAgfQorCisgICAgLyogQWRkcmVzcyAxID0gREEgKi8KKyAgICBoZWFkZXJbNCsyXSA9IGRzdFswXTsKKyAgICBoZWFkZXJbNCszXSA9IGRzdFsxXTsKKyAgICBoZWFkZXJbNCs0XSA9IGRzdFsyXTsKKworICAgIC8qIEFkZHJlc3MgMiA9IFNBICovCisgICAgaGVhZGVyWzQrNV0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICBoZWFkZXJbNCs2XSA9IHdkLT5tYWNBZGRyWzFdOworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaGVhZGVyWzQrN10gPSB3ZC0+bWFjQWRkclsyXTsKKyAgICB9CisKKyAgICAvKiBTZXF1ZW5jZSBDb250cm9sICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBoZWFkZXJbNCsxMV0gPSAoKHdkLT5tbXNlcSsrKTw8NCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgcmV0dXJuIGhsZW47Cit9CisKKwordTE2X3QgICB6ZkFnZ1Byb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGNhdGVnb3J5OworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBjYXRlZ29yeSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDI0KTsKKworICAgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgIGNhc2UgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FOgorICAgICAgICB6ZkFnZ0Jsb2NrQWNrQWN0aW9uRnJhbWUoZGV2LCBidWYpOworICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKK3UxNl90ICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGFjdGlvbjsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWN0aW9uID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjUpOworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICBjYXNlIFpNX1dMQU5fQUREQkFfUkVRVUVTVF9GUkFNRToKKyAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMCwgIlJlY2VpdmVkIEJBIEFjdGlvbiBmcmFtZSBpcyBBRERCQSByZXF1ZXN0Iik7CisgICAgICAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdChkZXYsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRToKKyAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMCwgIlJlY2VpdmVkIEJBIEFjdGlvbiBmcmFtZSBpcyBBRERCQSByZXNwb25zZSIpOworICAgICAgICB6ZkFnZ1JlY3ZBZGRiYVJlc3BvbnNlKGRldiwgYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9XTEFOX0RFTEJBX0ZSQU1FOgorICAgICAgICB6ZkFnZ1JlY3ZEZWxiYShkZXYsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy91MTZfdCBkaWFsb2c7CisgICAgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgYmY7CisgICAgdTE2X3QgaTsKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGJmLmJ1ZiA9IGJ1ZjsKKyAgICBiZi5kaWFsb2cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNik7CisgICAgLyoKKyAgICAgKiBiYSBwYXJhbWV0ZXIgc2V0CisgICAgICovCisgICAgYmYuYmFfcGFyYW1ldGVyID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjcpOworICAgIGJmLmJhX3BvbGljeSAgID0gKGJmLmJhX3BhcmFtZXRlciA+PiAxKSAmIDE7CisgICAgYmYudGlkICAgICAgICAgPSAoYmYuYmFfcGFyYW1ldGVyID4+IDIpICYgMHhGOworICAgIGJmLmJ1ZmZlcl9zaXplID0gKGJmLmJhX3BhcmFtZXRlciA+PiA2KTsKKyAgICAvKgorICAgICAqIEJBIHRpbWVvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBiZi5iYV90aW1lb3V0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjkpOworICAgIC8qCisgICAgICogQkEgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyCisgICAgICovCisgICAgYmYuYmFfc3RhcnRfc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzEpID4+IDQ7CisKKyAgICBpPTI2OworICAgIHdoaWxlKGkgPCAzMikgeworICAgICAgICB6bV9kZWJ1Z19tc2cyKCJSZWN2IEFEREJBIFJlcToiLCB6bXdfcnhfYnVmX3JlYWRiKGRldixidWYsaSkpOworICAgICAgICBpKys7CisgICAgfQorCisgICAgemZBZ2dTZW5kQWRkYmFSZXNwb25zZShkZXYsICZiZik7CisKKyAgICB6ZkFnZ0FkZGJhU2V0VGlkUngoZGV2LCBidWYsICZiZik7CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordTE2X3QgICB6ZkFnZ0FkZGJhU2V0VGlkUngoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciAqYmYpCit7CisgICAgdTE2X3QgaSwgYWMsIGFpZCwgZnJhZ09mZjsKKyAgICB1MTZfdCBzcmNbM107CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1OF90ICB1cDsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBzcmNbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTApOworICAgIHNyY1sxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzE0KTsKKyAgICBhaWQgPSB6ZkFwRmluZFN0YShkZXYsIHNyYyk7CisKKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKyAgICBhYyA9IHpjVXBUb0FjW3VwJjB4N10gJiAweDM7CisKKyAgICBhYyA9IGJmLT50aWQ7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFIDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoKHdkLT50aWRfcnhbaV0tPmFpZCA9PSBhaWQpICYmICh3ZC0+dGlkX3J4W2ldLT5hYyA9PSBhYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZF9yeCA9IHdkLT50aWRfcnhbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGlkX3J4KQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnRpZF9yeFtpXS0+YWlkID09IFpNX01BWF9TVEFfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdGlkX3J4KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHRpZF9yeC0+YWlkID0gYWlkOworICAgIHRpZF9yeC0+YWMgPSBhYzsKKyAgICB0aWRfcngtPmFkZEJhRXhjaGFuZ2VTdGF0dXNDb2RlID0gWk1fQUdHX0FEREJBX1JFU1BPTlNFOworICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gYmYtPmJhX3N0YXJ0X3NlcTsKKyAgICB0aWRfcngtPmJhd19oZWFkID0gdGlkX3J4LT5iYXdfdGFpbCA9IDA7CisgICAgdGlkX3J4LT5zcV9leGNlZWRfY291bnQgPSB0aWRfcngtPnNxX2JlaGluZF9jb3VudCA9IDA7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVzcG9uc2UoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGksYWMsIGFpZD0wOworICAgIHUxNl90IHNyY1szXTsKKyAgICBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciBiZjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICBhaWQgPSB6ZkFwRmluZFN0YShkZXYsIHNyYyk7CisKKworICAgIGJmLmJ1ZiA9IGJ1ZjsKKyAgICBiZi5kaWFsb2cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNik7CisgICAgYmYuc3RhdHVzX2NvZGUgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNyk7CisgICAgaWYgKCFiZi5zdGF0dXNfY29kZSkKKyAgICB7CisgICAgICAgIHdkLT5hZGRiYUNvbXBsZXRlPTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBiYSBwYXJhbWV0ZXIgc2V0CisgICAgICovCisgICAgYmYuYmFfcGFyYW1ldGVyID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjkpOworICAgIGJmLmJhX3BvbGljeSAgID0gKGJmLmJhX3BhcmFtZXRlciA+PiAxKSAmIDE7CisgICAgYmYudGlkICAgICAgICAgPSAoYmYuYmFfcGFyYW1ldGVyID4+IDIpICYgMHhGOworICAgIGJmLmJ1ZmZlcl9zaXplID0gKGJmLmJhX3BhcmFtZXRlciA+PiA2KTsKKyAgICAvKgorICAgICAqIEJBIHRpbWVvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBiZi5iYV90aW1lb3V0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzEpOworCisgICAgaT0yNjsKKyAgICB3aGlsZShpIDwgMzIpIHsKKyAgICAgICAgem1fZGVidWdfbXNnMigiUmVjdiBBRERCQSBSc3A6Iiwgem13X3J4X2J1Zl9yZWFkYihkZXYsYnVmLGkpKTsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIGFjID0gemNVcFRvQWNbYmYudGlkJjB4N10gJiAweDM7CisKKyAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvL3dkLT5hZ2dTdGFbYWlkXS5hZ2dGbGFnW2FjXSA9IDA7CisKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordTE2X3QgICB6ZkFnZ1JlY3ZEZWxiYSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3UxNl90ICAgemZBZ2dTZW5kQWRkYmFSZXNwb25zZSh6ZGV2X3QqIGRldiwgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgKmJmKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMzI7CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKyAgICB1MTZfdCBkc3RbM107CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgLyoKKyAgICAgKiBUQkQgOiBNYXhpbXVtIHNpemUgb2YgbWFuYWdtZW50IGZyYW1lCisgICAgICovCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CisgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzZXJ2ZSByb29tIGZvciB3bGFuIGhlYWRlcgorICAgICAqLworICAgIG9mZnNldCA9IGhsZW47CisKKyAgICAvKgorICAgICAqIGFkZCBhZGRiYSBmcmFtZSBib2R5CisgICAgICovCisgICAgb2Zmc2V0ID0gemZBZ2dTZXRBZGRiYVJlc3BvbnNlRnJhbWVCb2R5KGRldiwgYnVmLCBiZiwgb2Zmc2V0KTsKKworCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogQ29weSB3bGFuIGhlYWRlcgorICAgICAqLworCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJmLT5idWYsIDEwKTsKKyAgICBkc3RbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYmYtPmJ1ZiwgMTIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBiZi0+YnVmLCAxNCk7CisgICAgemZBZ2dHZW5BZGRiYUhlYWRlcihkZXYsIGRzdCwgaGVhZGVyLCBvZmZzZXQtaGxlbiwgYnVmLCB2YXAsIGVuY3J5cHQpOworICAgIGZvciAoaT0wOyBpPChobGVuPj4xKTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIGkqMiwgaGVhZGVyW2ldKTsKKyAgICB9CisKKyAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3QnVmTWFwRG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3TWFwVHhEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL3sKKyAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgLy99CisKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiaGxlbj0iLCBobGVuKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmxTaXplPSIsIGFkZHJUYmxTaXplKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwubGVuWzBdPSIsIGFkZHJUYmwubGVuWzBdKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwucGh5c0FkZHJsWzBdPSIsIGFkZHJUYmwucGh5c0FkZHJsWzBdKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImJ1Zi0+ZGF0YT0iLCBidWYtPmRhdGEpOworCisgICAgI2lmIDAKKyAgICBpZiAoKGVyciA9IHpmSHBTZW5kKGRldiwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fSU5URVJOQUxfQUxMT0NfQlVGLCAwLCAweGZmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisgICAgI2Vsc2UKKyAgICB6ZlB1dFZtbXEoZGV2LCBidWYpOworICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICAjZW5kaWYKKworICAgIC8vemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KGRldiwgZHN0LCB6Y1VwVG9BY1tiZi0+dGlkJjB4N10gJiAweDMsIGJmLT50aWQpOworICAgIHJldHVybiBaTV9TVUNDRVNTOworCit9CisKK3UxNl90ICAgemZBZ2dTZXRBZGRiYVJlc3BvbnNlRnJhbWVCb2R5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciAqYmYsIHUxNl90IG9mZnNldCkKK3sKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qCisgICAgICogQUREQkEgUmVxdWVzdCBmcmFtZSBib2R5CisgICAgICovCisKKyAgICAvKgorICAgICAqIENhdGVnb3J5CisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAzKTsKKyAgICAvKgorICAgICAqIEFjdGlvbiBkZXRhaWxzID0gMAorICAgICAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRSk7CisgICAgLyoKKyAgICAgKiBEaWFsb2cgVG9rZW4gPSBub256ZXJvCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBiZi0+ZGlhbG9nKTsKKyAgICAvKgorICAgICAqIFN0YXR1cyBjb2RlCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qCisgICAgICogQmxvY2sgQWNrIHBhcmFtZXRlciBzZXQKKyAgICAgKiBCQSBwb2xpY3kgPSAxIGZvciBpbW1lZGlhdGUgQkEsIDAgZm9yIGRlbGF5ZWQgQkEKKyAgICAgKiBUSUQoNGJpdHMpICYgYnVmZmVyIHNpemUoNGJpdHMpIChUSUQ9MHgxICYgYnVmZmVyIHNpemU9MHg4MCkKKyAgICAgKiBUQkQ6IGhvdyB0byBnZXQgVElEIG51bWJlciBhbmQgYnVmZmVyIHNpemU/CisgICAgICogonqid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneieworICAgICAqIKJ4ICAgIEIwICAgIKJ4ICAgIEIxICAgICCieCBCMiAgQjUgonggQjYgICAgICBCMTUgongKKyAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggUmVzZXJ2ZWQgonggQkEgcG9saWN5IKJ4ICBUSUQgICCieCBCdWZmZXIgc2l6ZSCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KKyAgICAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBiZi0+YmFfcGFyYW1ldGVyKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyoKKyAgICAgKiBCQSB0aW1lb3V0IHZhbHVlCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgYmYtPmJhX3RpbWVvdXQpOworICAgIG9mZnNldCs9MjsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3ZvaWQgICB6ZkFnZ0ludm9rZUJhcih6ZGV2X3QqIGRldiwgVElEX1RYIHRpZF90eCkKK3sKKyAgICBzdHJ1Y3QgYWdnQmFyQ29udHJvbCBhZ2dCYXJDb250cm9sOworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8vYmFyX2NvbnRyb2wgPSBhZ2dCYXJDb250cm9sLT50aWRfaW5mbyA8PCAxMiB8IGFnZ0JhckNvbnRyb2wtPmNvbXByZXNzZWRfYml0bWFwIDw8IDIKKyAgICAvLyAgICAgICAgfCBhZ2dCYXJDb250cm9sLT5tdWx0aV90aWQgPDwgMSB8IGFnZ0JhckNvbnRyb2wtPmJhcl9hY2tfcG9saWN5OworICAgIGFnZ0JhckNvbnRyb2wuYmFyX2Fja19wb2xpY3kgPSAwOworICAgIGFnZ0JhckNvbnRyb2wubXVsdGlfdGlkID0gMDsKKyAgICBhZ2dCYXJDb250cm9sLmNvbXByZXNzZWRfYml0bWFwID0gMDsKKyAgICBhZ2dCYXJDb250cm9sLnRpZF9pbmZvID0gdGlkX3R4LT50aWQ7CisgICAgemZBZ2dTZW5kQmFyKGRldiwgdGlkX3R4LCAmYWdnQmFyQ29udHJvbCk7CisKKyAgICByZXR1cm47CisKK30KKy8qCisgKiB6ZkFnZ1NlbmRCYXIoKSByZWZlcnMgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KCkKKyAqLwordTE2X3QgICB6ZkFnZ1NlbmRCYXIoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgsIHN0cnVjdCBhZ2dCYXJDb250cm9sICphZ2dCYXJDb250cm9sKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMTYrODsgIC8qIG1hYyBoZWFkZXIgKyBjb250cm9sIGhlYWRlcnMqLworICAgIHUxNl90IGhlYWRlclsoOCsyNCsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICAvKgorICAgICAqIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBtYW5hZ21lbnQgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgICovCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIC8qCisgICAgICogYWRkIGFkZGJhIGZyYW1lIGJvZHkKKyAgICAgKi8KKyAgICBvZmZzZXQgPSB6ZkFnZ1NldEJhckJvZHkoZGV2LCBidWYsIG9mZnNldCwgdGlkX3R4LCBhZ2dCYXJDb250cm9sKTsKKworCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogQ29weSB3bGFuIGhlYWRlcgorICAgICAqLworICAgIHpmQWdnR2VuQmFySGVhZGVyKGRldiwgdGlkX3R4LT5kc3QsIGhlYWRlciwgb2Zmc2V0LWhsZW4sIGJ1ZiwgdmFwLCBlbmNyeXB0KTsKKyAgICBmb3IgKGk9MDsgaTwoaGxlbj4+MSk7IGkrKykKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBpKjIsIGhlYWRlcltpXSk7CisgICAgfQorCisgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd0J1Zk1hcERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy97CisgICAgLy8gICAgZ290byB6bEVycm9yOworICAgIC8vfQorCisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJvZmZzZXQ9Iiwgb2Zmc2V0KTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImhsZW49IiwgaGxlbik7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLnBoeXNBZGRybFswXT0iLCBhZGRyVGJsLnBoeXNBZGRybFswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmRhdGE9IiwgYnVmLT5kYXRhKTsKKworICAgICNpZiAwCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorICAgICNlbHNlCisgICAgemZQdXRWbW1xKGRldiwgYnVmKTsKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKworfQorCit1MTZfdCAgIHpmQWdnU2V0QmFyQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgVElEX1RYIHRpZF90eCwgc3RydWN0IGFnZ0JhckNvbnRyb2wgKmFnZ0JhckNvbnRyb2wpCit7CisgICAgdTE2X3QgYmFyX2NvbnRyb2wsIHN0YXJ0X3NlcTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qCisgICAgICogQkFSIENvbnRyb2wgZnJhbWUgYm9keQorICAgICAqLworCisgICAgLyoKKyAgICAgKiBCQVIgQ29udHJvbCBGaWVsZAorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggICAgQjAgICCieCAgICBCMSAgICAgonggICAgIEIyICAgICCieCBCMyAgIEIxMSCieCBCMTIgIEIxNSCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggQkFSIEFjayCieCBNdWx0aS1USUQgonggQ29tcHJlc3NlZCCieCBSZXNlcnZlZCCieCBUSURfSU5GTyCieAorICAgICAqIKJ4ICBQb2xpY3kgonggICAgICAgICAgIKJ4ICAgQml0bWFwICAgonggICAgICAgICAgonggICAgICAgICAgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneifQorICAgICAqLworICAgIGJhcl9jb250cm9sID0gYWdnQmFyQ29udHJvbC0+dGlkX2luZm8gPDwgMTIgfCBhZ2dCYXJDb250cm9sLT5jb21wcmVzc2VkX2JpdG1hcCA8PCAyCisgICAgICAgICAgICB8IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCA8PCAxIHwgYWdnQmFyQ29udHJvbC0+YmFyX2Fja19wb2xpY3k7CisKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBiYXJfY29udHJvbCk7CisgICAgb2Zmc2V0Kz0yOworICAgIGlmICgwID09IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCkgeworICAgICAgICAvKgorICAgICAgICAgKiBCQSBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIKKyAgICAgICAgICogonqid6J3oneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgICAgICogonggQjAgICAgICAgQjMgonggQjQgICAgICAgICAgICAgIEIxNSCieAorICAgICAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAgICAgKiCieCBGcmFnIG51bSgwKSCieCBCQSBzdGFydGluZyBzZXEgbnVtIKJ4CisgICAgICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICAgICAqLworICAgICAgICBzdGFydF9zZXEgPSAodGlkX3R4LT5iYXJfc3NuIDw8IDQpICYgMHhGRkYwOworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBzdGFydF9zZXEpOworICAgICAgICBvZmZzZXQrPTI7CisgICAgfQorICAgIGlmICgxID09IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCAmJiAxID09IGFnZ0JhckNvbnRyb2wtPmNvbXByZXNzZWRfYml0bWFwKSB7CisgICAgICAgIC8qIG11bHRpLXRpZCBCbG9ja0Fja1JlcSB2YXJpYW50LCBub3QgaW1wbGVtZW50ZWQqLworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3UxNl90IHpmQWdnR2VuQmFySGVhZGVyKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICB1OF90ICBobGVuID0gMTYrODsgICAgICAgIC8vIE1BQyBjdHJsICsgUEhZIGN0cmwgKyA4MDIuMTEgTU0gaGVhZGVyCisgICAgLy91OF90IGZyYW1lVHlwZSA9IFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT047CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcKKyAgICAgKi8KKyAgICAvL2JvZHlMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBoZWFkZXJbMF0gPSAxNitsZW4rNDsgICAvL0xlbmd0aAorICAgIGhlYWRlclsxXSA9IDB4ODsgICAgICAgIC8vTUFDIGNvbnRyb2wsIGJhY2tvZmYgKyAoYWNrKQorCisjaWYgMQorICAgIC8qIENDSyAxTSAqLworICAgIGhlYWRlclsyXSA9IDB4MGYwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgaGVhZGVyWzNdID0gMHgwMDAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyNlbHNlCisgICAgLyogQ0NLIDZNICovCisgICAgaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICBoZWFkZXJbM10gPSAweDAwMEI7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorCisjZW5kaWYKKyAgICAvKgorICAgICAqIEdlbmVyYXRlIFdMQU4gaGVhZGVyCisgICAgICogRnJhbWUgY29udHJvbCBmcmFtZSB0eXBlIGFuZCBzdWJ0eXBlCisgICAgICovCisgICAgaGVhZGVyWzQrMF0gPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkFSOworICAgIC8qCisgICAgICogRHVyYXRpb24KKyAgICAgKi8KKyAgICBoZWFkZXJbNCsxXSA9IDA7CisKKyAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgIGhlYWRlcls0KzJdID0gZHN0WzBdOworICAgIGhlYWRlcls0KzNdID0gZHN0WzFdOworICAgIGhlYWRlcls0KzRdID0gZHN0WzJdOworCisgICAgLyogQWRkcmVzcyAyID0gU0EgKi8KKyAgICBoZWFkZXJbNCs1XSA9IHdkLT5tYWNBZGRyWzBdOworICAgIGhlYWRlcls0KzZdID0gd2QtPm1hY0FkZHJbMV07CisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICBoZWFkZXJbNCs3XSA9IHdkLT5tYWNBZGRyWzJdOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZWFkZXJbNCs3XSA9IHdkLT5tYWNBZGRyWzJdOworICAgIH0KKworICAgIC8qIFNlcXVlbmNlIENvbnRyb2wgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGhlYWRlcls0KzExXSA9ICgod2QtPm1tc2VxKyspPDw0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisKKyAgICByZXR1cm4gaGxlbjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODdhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5oCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogY2FnZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBBLU1QRFUgYWdncmVnYXRpb24gcmVsYXRpdmVkIGZ1bmN0aW9ucy4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypSZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaG8gICAgICAgICBXaGVuICAgICAgICBXaGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBIb25kYSAgICAgICAxMi00LTA2ICAgICBjcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NBR0dfSAorI2RlZmluZSBfQ0FHR19ICisKKworLyoKKyAqIHRoZSBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgZmxhZywgMCBpZiBkb24ndCBkbyBhZ2dyZWdhdGUKKyAqLworCisjZGVmaW5lIFpNX0FHR19GUEdBX0RFQlVHICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fQUdHX0ZQR0FfUkVPUkRFUklORyAgICAgICAgICAgICAgMQorCisjaWZuZGVmIFpNX0FHR19UQUxMWQorLy8jZGVmaW5lIFpNX0FHR19UQUxMWQorI2VuZGlmCisvKgorICogQWdncmVnYXRlIGNvbnRyb2wKKyAqLworCisKKyNkZWZpbmUgWk1fQUdHX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWk1fQkFXX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgWk1fQUdHUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fQUdHUV9TSVpFX01BU0sgICAgICAgICAgICAgICAgICAgKFpNX0FHR1FfU0laRS0xKQorI2RlZmluZSBaTV9BR0dfTE9XX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FHR19ISUdIX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDUKKworLyoKKyAqIG51bWJlciBvZiBhY2Nlc3MgY2F0ZWdvcmllcyAoYWMpCisgKi8KKyNkZWZpbmUgWk1fQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorLyoKKyAqIHRoZSB0aW1lciB0byBjbGVhciBhZ2dyZWdhdGlvbiBxdWV1ZSwgdW5pdDogMSB0aWNrCisgKiBpZiB0aGUgcGFja2V0IGlzIHRvbyBvbGQgKGN1cnJlbnQgdGltZSAtIGFycml2YWwgdGltZSkKKyAqIHRoZSBwYWNrZXQgYW5kIHRoZSBhZ2dyZWdhdGUgcXVldWUgd2lsbCBiZSBjbGVhcmVkCisgKi8KKyNkZWZpbmUgWk1fQUdHX0NMRUFSX1RJTUUgICAgICAgICAgICAgICAgICAgMTAKKy8qCisgKiBkZWxldGUgdGhlIHF1ZXVlIGlmIGlkbGUgZm9yIFpNX0RFTEVURV9USU1FCisgKiB1bml0OiAxMG1zCisgKi8KKyNkZWZpbmUgWk1fQUdHX0RFTEVURV9USU1FICAgICAgICAgICAgICAgICAgMTAwMDAKKworLyoKKyAqIGJsb2NrIGFjayB3aW5kb3cgc2l6ZQorICovCisjZGVmaW5lIFpNX0FHR19CQVdfU0laRSAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFpNX0FHR19CQVdfTUFTSyAgICAgICAgICAgICAgICAgICAgIChaTV9BR0dfQkFXX1NJWkUtMSkKKy8qCisgKiBvcmlnaW5hdG9yICAgICBBRERCQSBSZXNxdWVzdCAgICByZWNlaXZlcgorICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICAgIDF8ICAgICAgICAgIEFDSyAgICAgICAgICAgICAgICAgfDEKKyAqICAgICAgfDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAyfCAgICAgICAgIEFEREJBIFJlc3BvbnNlICAgICAgIHwyCisgKiAgICAgIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgM3wgICAgICAgICAgQUNLICAgICAgICAgICAgICAgICB8MworICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyAqLworI2RlZmluZSBaTV9BR0dfQUREQkFfUkVRVUVTVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FHR19BRERCQV9SRVFVRVNUX0FDSyAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fQUdHX0FEREJBX1JFU1BPTlNFICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9BR0dfQUREQkFfUkVTUE9OU0VfQUNLICAgICAgICAgICA0CisKKyNkZWZpbmUgWk1fQUdHX1NJTkdMRV9NUERVICAgICAgICAgICAgICAgICAgMDAKKyNkZWZpbmUgWk1fQUdHX0ZJUlNUX01QRFUgICAgICAgICAgICAgICAgICAgMDEKKyNkZWZpbmUgWk1fQUdHX01JRERMRV9NUERVICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgWk1fQUdHX0xBU1RfTVBEVSAgICAgICAgICAgICAgICAgICAgMTAKKy8qCisgKiBlbmQgb2YgQWdncmVnYXRlIGNvbnRyb2wKKyAqLworCisjZGVmaW5lIFRJRF9UWCAgc3RydWN0IGFnZ1F1ZXVlKgorI2RlZmluZSBUSURfQkFXIHN0cnVjdCBiYXdfcSoKKyNkZWZpbmUgQkFXIHdkLT5iYXdfZW5hYmxlcgorI2RlZmluZSBERVNUUSB3ZC0+ZGVzdFEKKworLyoKKyAqIFF1ZXVlIGFjY2VzcworICovCisjZGVmaW5lIHptX2FnZ19xbGVuKGRldiwgaGVhZCwgdGFpbCkgKChoZWFkIC0gdGFpbCkgJiBaTV9BR0dRX1NJWkVfTUFTSykKKyNkZWZpbmUgem1fYWdnX2luUSh0aWRfdHgsIHB0KSAoKCgocHQgLSB0aWRfdHgtPmFnZ1RhaWwpICYgWk1fQUdHUV9TSVpFX01BU0spIDwgXAorICAgICAgICAoKHRpZF90eC0+YWdnSGVhZCAtIHRpZF90eC0+YWdnVGFpbCkgJiBaTV9BR0dRX1NJWkVfTUFTSykpPyBUUlVFOkZBTFNFKQorI2RlZmluZSB6bV9hZ2dfcGx1cyhwdCkgcHQgPSAocHQgKyAxKSAmIFpNX0FHR1FfU0laRV9NQVNLCisjZGVmaW5lIHptX2FnZ19taW4oQSwgQikgKChBPkIpPyBCOkEpCisjZGVmaW5lIHptX2FnZ19HZXRUaW1lKCkgd2QtPnRpY2sKKyNkZWZpbmUgVFhRTCAoemZIcEdldE1heFR4ZENvdW50KGRldikgLSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpCisKKy8qIGRvbid0IGNoYW5nZSBBR0dfTUlOX1RYUUwgZWFzaWx5LCB0aGlzIG1pZ2h0IGNhdXNlIEJBVyBCU09EICovCisjZGVmaW5lIEFHR19NSU5fVFhRTCAgICAgICAgICAgICAgICAgICAgICAgIDIKKy8qCisgKiBjb25zaWRlciB0Y3AsdWRwLGFjKDEyMzQpCisgKi8KKyNkZWZpbmUgem1fYWdnX2R5bmFtaWNfdGhyZXNob2xkKGRldiwgYXIpICAgKChhciA+IDE2KT8gMTE6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhciA+IDEyKT8gODogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyID4gOCk/IDU6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhciA+IDQpPyAyOjEpCisjZGVmaW5lIHptX2FnZ193ZWlnaHQoYWMpICAgKCgzID09IGFjKT8gNDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiA9PSBhYyk/IDM6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPT0gYWMpPyAyOjEpCisvKgorICogdGhlIHJlcXVpcmVkIGZyZWUgcXVldWUgcmF0aW8gcGVyIGFjCisgKi8KKworI2RlZmluZSB6bV9hZ2dfcmF0aW8oYWMpICAgICgoMyA9PSBhYyk/IDM6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPT0gYWMpPyAoemZIcEdldE1heFR4ZENvdW50KGRldikqMS80KTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA9PSBhYyk/ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoyLzQpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHpmSHBHZXRNYXhUeGRDb3VudChkZXYpKjMvNCkpCisKKy8vI2RlZmluZSB6bV9hZ2dfcmF0aW8oYWMpICAgIDMKKy8qCisgKiBlbmQgb2YgUXVldWUgYWNjZXNzCisgKi8KKworI2RlZmluZSBaTV9BR0dNU0dfTEVWICAgIFpNX0xWXzMKKyNkZWZpbmUgem1fbXNnMF9hZ2cobHYsIG1zZykgaWYgKFpNX0FHR01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfYWdnKGx2LCBtc2csIHZhbCkgaWYgKFpNX0FHR01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9hZ2cobHYsIG1zZywgdmFsKSBpZiAoWk1fQUdHTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCitzdHJ1Y3QgYmF3X2hlYWRlcl9yIHsKKyAgICB1MTZfdCAgICAgICAqaGVhZGVyOworICAgIHUxNl90ICAgICAgICptaWM7CisgICAgdTE2X3QgICAgICAgKnNuYXA7CisgICAgdTE2X3QgICAgICAgaGVhZGVyTGVuOworICAgIHUxNl90ICAgICAgIG1pY0xlbjsKKyAgICB1MTZfdCAgICAgICBzbmFwTGVuOworICAgIHUxNl90ICAgICAgIHJlbW92ZUxlbjsKKyAgICB1OF90ICAgICAgICBrZXlJZHg7Cit9OworCitzdHJ1Y3QgYmF3X2hlYWRlciB7CisgICAgdTE2X3QgICAgICAgaGVhZGVyWzI5XTsvL1soOCszMCsyKzE4KS8yXTsgIDU4IGJ5dGVzICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgICAgICAgaGVhZGVyTGVuOworICAgIHUxNl90ICAgICAgIG1pY1s0XTsgLy9bOC8yXTsgOCBieXRlcworICAgIHUxNl90ICAgICAgIG1pY0xlbjsKKyAgICB1MTZfdCAgICAgICBzbmFwWzRdOyAvL1s4LzJdOyA4IGJ5dGVzCisgICAgdTE2X3QgICAgICAgc25hcExlbjsKKyAgICB1MTZfdCAgICAgICByZW1vdmVMZW47CisgICAgdThfdCAgICAgICAga2V5SWR4OworfTsKKworc3RydWN0IGJ1ZkluZm8geworICAgIHpidWZfdCogICAgIGJ1ZjsKKyAgICB1OF90ICAgICAgICBiYXdfcmV0cmFuc21pdDsKKyAgICB1MzJfdCAgICAgICB0aW1lc3RhbXA7CisgICAgc3RydWN0IGJhd19oZWFkZXIgICAqYmF3X2hlYWRlcjsKK307CisjZW5kaWYKK3N0cnVjdCBhZ2dFbGVtZW50Cit7CisgICAgemJ1Zl90KiAgICAgYnVmOworICAgIHUzMl90ICAgICAgIGFycml2YWxUaW1lOworICAgIHU4X3QgICAgICAgIGJhd19yZXRyYW5zbWl0OworICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIC8vc3RydWN0IGJhd19oZWFkZXIgIGJhd19oZWFkZXI7Cit9OworCisKKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKK3N0cnVjdCBiYXdfYnVmCit7CisgICAgemJ1Zl90KiAgICAgYnVmOworICAgIHUxNl90ICAgICAgIGJhd19zZXE7CisgICAgdTMyX3QgICAgICAgdGltZXN0YW1wOworICAgIHU4X3QgICAgICAgIGJhd19yZXRyYW5zbWl0OworICAgIHN0cnVjdCBiYXdfaGVhZGVyIGJhd19oZWFkZXI7Cit9OworCitzdHJ1Y3QgYmF3X3EgeworICAgIHN0cnVjdCBiYXdfYnVmICBmcmFtZVtaTV9WVFhRX1NJWkVdOworICAgIHUxNl90ICAgICAgIGVuYWJsZWQ7CisgICAgdTE2X3QgICAgICAgc3RhcnRfc2VxOworICAgIHUxNl90ICAgICAgIGhlYWQ7CisgICAgdTE2X3QgICAgICAgdGFpbDsKKyAgICB1MTZfdCAgICAgICBzaXplOworICAgIFRJRF9UWCAgICAgIHRpZF90eDsKKworICAgIC8vc3RydWN0IGJhd19oZWFkZXIgKmJhd19oZWFkZXI7Cit9OworCitzdHJ1Y3QgYmF3X2VuYWJsZXIKK3sKKyAgICBzdHJ1Y3QgYmF3X3EgICAgdGlkX2Jhd1taTV9CQVdfUE9PTF9TSVpFXTsKKyAgICB1OF90ICAgIGRlbFBvaW50OworICAgIHZvaWQgICAgKCpjb3JlKSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSwgdTMyX3QgYml0bWFwLCB1MTZfdCBhZ2dMZW4pOworICAgIC8vdm9pZCAgICAoKmNvcmUpOworICAgIHZvaWQgICAgKCppbml0KSh6ZGV2X3QqIGRldik7CisgICAgVElEX0JBVyAoKmdldE5ld1EpKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpOworICAgIFRJRF9CQVcgKCpnZXRRKSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSk7CisgICAgdTE2X3QgICAoKmluc2VydCkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBiYXdfc2VxLCBUSURfQkFXIHRpZF9iYXcsIHU4X3QgYmF3X3JldHJhbnNtaXQsIHN0cnVjdCBiYXdfaGVhZGVyX3IgKmhlYWRlcl9yKTsKKyAgICBzdHJ1Y3QgYnVmSW5mbyogKCpwb3ApKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KTsKKyAgICB2b2lkICAgICgqZW5hYmxlKSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3LCB1MTZfdCBzdGFydF9zZXEpOworICAgIHZvaWQgICAgKCpkaXNhYmxlKSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3KTsKKworfTsKKyNlbmRpZgorc3RydWN0IGFnZ1F1ZXVlCit7CisgICAgc3RydWN0ICAgICAgYWdnRWxlbWVudCAgYWdndnR4cVtaTV9BR0dRX1NJWkVdOworICAgIHUxNl90ICAgICAgIGFnZ0hlYWQ7CisgICAgdTE2X3QgICAgICAgYWdnVGFpbDsKKyAgICBzMTZfdCAgICAgICBzaXplOworICAgIHUxNl90ICAgICAgIGFnZ1FTVEE7CisgICAgdTE2X3QgICAgICAgYWdnUUVuYWJsZWQ7CisgICAgdTE2X3QgICAgICAgYWM7CisgICAgdTE2X3QgICAgICAgdGlkOworICAgIHUxNl90ICAgICAgIGFnZ1JlYWR5OworICAgIHUxNl90ICAgICAgIGNsZWFyRmxhZzsKKyAgICB1MTZfdCAgICAgICBkZWxldGVGbGFnOworICAgIHUzMl90ICAgICAgIGxhc3RBcnJpdmFsOworICAgIHUxNl90ICAgICAgIGFnZ0ZyYW1lU2l6ZTsKKyAgICB1MTZfdCAgICAgICBiYXJfc3NuOyAgICAvKiBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgaW4gQkFSICovCisgICAgdTE2X3QgICAgICAgZHN0WzNdOworICAgIHUxNl90ICAgICAgIGNvbXBsZXRlOyAgICAgLyogY29tcGxldGUgaW5kaWNhdGlvbiBwb2ludGVyICovCit9OworCitzdHJ1Y3QgYWdnU3RhCit7CisgICAgdTE2X3QgICAgICAgY291bnRbWk1fQUNdOworICAgIFRJRF9UWCAgICAgIHRpZF90eFs4XTsKKyAgICB1MTZfdCAgICAgICBhZ2dGbGFnW1pNX0FDXTsKK307CisKK3N0cnVjdCBhZ2dfdGlkX3J4Cit7CisgICAgdTE2X3QgICAgICAgYWlkOworICAgIHUxNl90ICAgICAgIGFjOworICAgIHUxNl90ICAgICAgIGFkZEJhRXhjaGFuZ2VTdGF0dXNDb2RlOworICAgIC8vc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvOworICAgIHUxNl90ICAgICAgIHNlcV9zdGFydDsJCS8qIGZpcnN0IHNlcSBleHBlY3RlZCBuZXh0ICovCisgICAgdTE2X3QgICAgICAgYmF3X2hlYWQ7CQkvKiBoZWFkIG9mIHZhbGlkIGJsb2NrIGFjayB3aW5kb3cgKi8KKyAgICB1MTZfdCAgICAgICBiYXdfdGFpbDsJCS8qIHRhaWwgb2YgdmFsaWQgYmxvY2sgYWNrIHdpbmRvdyAqLworICAgIC8vdTE2X3QgICAgICAgZnJlZV9jb3VudDsJCS8qIGJsb2NrIGFjayB3aW5kb3cgc2l6ZQkqLworICAgIHU4X3QgICAgICAgIHNxX2V4Y2VlZF9jb3VudDsKKyAgICB1OF90ICAgICAgICBzcV9iZWhpbmRfY291bnQ7CisgICAgc3RydWN0IGFnZ0VsZW1lbnQgZnJhbWVbWk1fQUdHX0JBV19TSVpFICsgMV07IC8qIG91dC1vZi1vcmRlciByeCBmcmFtZXMgKi8KK307CisKK3N0cnVjdCBhZ2dDb250cm9sCit7CisgICAgdTE2X3QgICAgICAgYWdnRW5hYmxlZDsKKyAgICB1MTZfdCAgICAgICBhbXBkdUluZGljYXRpb247CisgICAgdTE2X3QgICAgICAgYWRkYmFJbmRpY2F0aW9uOworICAgIC8vVElEX0JBVyAgICAgdGlkX2JhdzsKKyAgICB1MzJfdCAgICAgICB0aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlcgoreworICAgIHpidWZfdCogICAgIGJ1ZjsKKyAgICB1MTZfdCAgICAgICBiYV9wYXJhbWV0ZXI7CisgICAgdThfdCAgICAgICAgZGlhbG9nOworICAgIHUxNl90ICAgICAgIGJhX3BvbGljeTsKKyAgICB1MTZfdCAgICAgICB0aWQ7CisgICAgdTE2X3QgICAgICAgYnVmZmVyX3NpemU7CisgICAgdTE2X3QgICAgICAgYmFfdGltZW91dDsKKyAgICB1MTZfdCAgICAgICBiYV9zdGFydF9zZXE7CisgICAgdTE2X3QgICAgICAgc3RhdHVzX2NvZGU7Cit9OworCitzdHJ1Y3QgYWdnQmFyQ29udHJvbAoreworICAgIHUxNl90ICAgICAgIGJhcl9hY2tfcG9saWN5ICAgICAgOworICAgIHUxNl90ICAgICAgIG11bHRpX3RpZCAgICAgICAgICAgOworICAgIHUxNl90ICAgICAgIGNvbXByZXNzZWRfYml0bWFwICAgOworICAgIHUxNl90ICAgICAgIHRpZF9pbmZvICAgICAgICAgICAgOworfTsKKworc3RydWN0IGFnZ1RhbGx5Cit7CisgICAgdTMyX3QgICAgICAgZ290X3BhY2tldHNfc3VtOworICAgIHUzMl90ICAgICAgIGdvdF9ieXRlc19zdW07CisgICAgdTMyX3QgICAgICAgc2VudF9wYWNrZXRzX3N1bTsKKyAgICB1MzJfdCAgICAgICBzZW50X2J5dGVzX3N1bTsKKyAgICB1MzJfdCAgICAgICBhdmdfZ290X3BhY2tldHM7CisgICAgdTMyX3QgICAgICAgYXZnX2dvdF9ieXRlczsKKyAgICB1MzJfdCAgICAgICBhdmdfc2VudF9wYWNrZXRzOworICAgIHUzMl90ICAgICAgIGF2Z19zZW50X2J5dGVzOworICAgIHUxNl90ICAgICAgIHRpbWU7Cit9OworCisKK3N0cnVjdCBkZXN0USB7CisgICAgc3RydWN0IGRlc3R7CisgICAgICAgIHUxNl90ICAgUXR5cGUgOiAxOyAvKiAwIGFnZ3IsIDEgdnR4cSAqLworICAgICAgICBUSURfVFggIHRpZF90eDsKKyAgICAgICAgdm9pZCogICB2dHhxOworCisgICAgICAgIHN0cnVjdCBkZXN0KiBuZXh0OworICAgIH0gKmRlc3RbNF07CisgICAgc3RydWN0IGRlc3QqIEhlYWRbNF07CisgICAgLy9zMTZfdCAgIHNpemVbNF07CisgICAgdTE2X3QgICBwcHJpOworICAgIHZvaWQgICAgKCppbnNlcnQpKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgdTE2X3QgYWMsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOworICAgIHZvaWQgICAgKCpkZWxldGUpKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7CisgICAgdm9pZCAgICAoKmluaXQpKHpkZXZfdCogZGV2KTsKKyAgICBzdHJ1Y3QgZGVzdCogKCpnZXROZXh0KSh6ZGV2X3QqIGRldiwgdTE2X3QgYWMpOworICAgIHUxNl90ICAgKCpleGlzdCkoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7CisgICAgLy92b2lkICAgICgqc2NhbikoemRldl90KiBkZXYpOworfTsKKy8qCisgKiBhZ2dyZWdhdGlvbiB0eAorICovCit2b2lkICAgIHpmQWdnSW5pdCh6ZGV2X3QqIGRldik7Cit1MTZfdCAgIHpmQXBGaW5kU3RhKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkcik7Cit1MTZfdCAgIHpmQWdnR2V0U3RhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CitUSURfVFggIHpmQWdnVHhHZXRRdWV1ZSh6ZGV2X3QqIGRldiwgdTE2X3QgYWlkLCB1MTZfdCB0aWQpOworVElEX1RYICB6ZkFnZ1R4TmV3UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFpZCwgdTE2X3QgdGlkLCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnVHhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgYWlkLCBUSURfVFggdGlkX3R4KTsKK3UxNl90ICAgemZBZ2dUeCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHRpZCk7Cit1MTZfdCAgIHpmQWdnVHhSZWFkeUNvdW50KHpkZXZfdCogZGV2LCB1MTZfdCBhYyk7Cit1MTZfdCAgIHpmQWdnVHhQYXJ0aWFsKHpkZXZfdCogZGV2LCB1MTZfdCBhYywgdTE2X3QgcmVhZHljb3VudCk7Cit1MTZfdCAgIHpmQWdnVHhTZW5kKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVlVHhkLCBUSURfVFggdGlkX3R4KTsKK1RJRF9UWCAgemZBZ2dUeEdldFJlYWR5UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFjKTsKK3pidWZfdCogemZBZ2dUeEdldFZ0eHEoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgpOwordTE2X3QgICB6ZkFnZ1R4RGVsZXRlUXVldWUoemRldl90KiBkZXYsIHUxNl90IHFudW0pOwordTE2X3QgICB6ZkFnZ1NjYW5BbmRDbGVhcih6ZGV2X3QqIGRldiwgdTMyX3QgdGltZSk7Cit1MTZfdCAgIHpmQWdnQ2xlYXJRdWV1ZSh6ZGV2X3QqIGRldik7Cit2b2lkICAgIHpmQWdnVHhTY2hlZHVsZXIoemRldl90KiBkZXYsIHU4X3QgU2NhbkFuZENsZWFyKTsKKworLyogdGlkX3R4IG1hbmlwdWxhdGlvbiAqLworI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordTE2X3QgICB6ZkFnZ1RpZFR4SW5zZXJ0SGVhZCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8qIGJ1Zl9pbmZvLCBUSURfVFggdGlkX3R4KTsKKyNlbmRpZgordm9pZCAgICB6ZkFnZ0Rlc3RJbnNlcnQoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7Cit2b2lkICAgIHpmQWdnRGVzdERlbGV0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgUXR5cGUsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOwordm9pZCAgICB6ZkFnZ0Rlc3RJbml0KHpkZXZfdCogZGV2KTsKK3N0cnVjdCBkZXN0KiB6ZkFnZ0Rlc3RHZXROZXh0KHpkZXZfdCogZGV2LCB1MTZfdCBhYyk7Cit1MTZfdCAgIHpmQWdnRGVzdEV4aXN0KHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgdTE2X3QgYWMsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOworLyoKKyAqIGFnZ3JlZ2F0aW9uIHJ4CisgKi8KK3N0cnVjdCBhZ2dfdGlkX3J4ICp6ZkFnZ1J4RW5hYmxlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgICB6ZkFnZ1J4KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4KTsKK3N0cnVjdCBhZ2dfdGlkX3J4ICp6ZkFnZ1J4R2V0UXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90ICAgemZBZ2dSeEVucXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4LCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8gKmFkZEluZm8pOwordTE2X3QgICB6ZkFnZ1J4Rmx1c2goemRldl90KiBkZXYsIHUxNl90IHNlcV9ubywgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCk7Cit1MTZfdCAgIHpmQWdnUnhGcmVlQnVmKHpkZXZfdCogZGV2LCB1MTZfdCBkZXN0cm95KTsKK3UxNl90ICAgemZBZ2dSeENsZWFyKHpkZXZfdCogZGV2LCB1MzJfdCB0aW1lKTsKK3ZvaWQgICAgemZBZ2dSZWN2QkFSKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisvKgorICogZW5kIG9mIGFnZ3JlZ2F0aW9uIHJ4CisgKi8KKworLyoKKyAqIEFEREJBCisgKi8KK3UxNl90ICAgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KHpkZXZfdCogZGV2LCB1MTZfdCAqZHN0LCB1MTZfdCBhYywgdTE2X3QgdXApOwordTE2X3QgICB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KHpkZXZfdCogZGV2LHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFjLCB1MTZfdCB1cCk7Cit1MTZfdCAgIHpmQWdnR2VuQWRkYmFIZWFkZXIoemRldl90KiBkZXYsIHUxNl90KiBkc3QsCisgICAgICAgICAgICAgICAgdTE2X3QqIGhlYWRlciwgdTE2X3QgbGVuLCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5cHQpOwordTE2X3QgICB6ZkFnZ1Byb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90ICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgICB6ZkFnZ1JlY3ZBZGRiYVJlc3BvbnNlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnUmVjdkRlbGJhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnU2VuZEFkZGJhUmVzcG9uc2UoemRldl90KiBkZXYsIHN0cnVjdCBhZ2dCYUZyYW1lUGFyYW1ldGVyICpiZik7Cit1MTZfdCAgIHpmQWdnU2V0QWRkYmFSZXNwb25zZUZyYW1lQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgKmJmLCB1MTZfdCBvZmZzZXQpOwordTE2X3QgICB6ZkFnZ0FkZGJhU2V0VGlkUngoemRldl90KiBkZXYsIHpidWZfdCogYnVmLAorICAgICAgICAgICAgICAgIHN0cnVjdCBhZ2dCYUZyYW1lUGFyYW1ldGVyICpiZik7CisvKgorICogemZBZ2dUeFNlbmRFdGgKKyAqLwordTE2X3QgemZBZ2dUeFNlbmRFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0LCB1MTZfdCBidWZUeXBlLCB1OF90IGZsYWcsIHN0cnVjdCBhZ2dDb250cm9sICphZ2dDb250cm9sLCBUSURfVFggdGlkX3R4KTsKKworLyoKKyAqIHN0YXRpc3RpY3MgZnVuY3Rpb25zCisgKi8KK3UxNl90IHpmQWdnVGFsbHlSZXNldCh6ZGV2X3QqIGRldik7CisKK3UxNl90ICAgemZBZ2dQcmludFRhbGx5KHpkZXZfdCogZGV2KTsKKworLyoKKyAqIEJBUgorICovCit2b2lkICAgIHpmQWdnSW52b2tlQmFyKHpkZXZfdCogZGV2LCBUSURfVFggdGlkX3R4KTsKK3UxNl90ICAgemZBZ2dTZW5kQmFyKHpkZXZfdCogZGV2LCBUSURfVFggdGlkX3R4LCBzdHJ1Y3QgYWdnQmFyQ29udHJvbCAqYWdnQmFyQ29udHJvbCk7Cit1MTZfdCAgIHpmQWdnU2V0QmFyQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgVElEX1RYIHRpZF90eCwgc3RydWN0IGFnZ0JhckNvbnRyb2wgKmFnZ0JhckNvbnRyb2wpOwordTE2X3QgICB6ZkFnZ0dlbkJhckhlYWRlcih6ZGV2X3QqIGRldiwgdTE2X3QqIGRzdCwKKyAgICAgICAgICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCk7CisKKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKKy8qIEJBVyBCQSByZXRyYW5zbWlzc2lvbiAqLwordm9pZCAgICB6ZkJhd0NvcmUoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEsIHUzMl90IGJpdG1hcCwgdTE2X3QgYWdnTGVuKTsKK3ZvaWQgICAgemZCYXdJbml0KHpkZXZfdCogZGV2KTsKK1RJRF9CQVcgemZCYXdHZXROZXdRKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpOwordTE2X3QgICB6ZkJhd0luc2VydCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IGJhd19zZXEsIFRJRF9CQVcgdGlkX2JhdywgdThfdCBiYXdfcmV0cmFuc21pdCwgc3RydWN0IGJhd19oZWFkZXJfciAqaGVhZGVyX3IpOworc3RydWN0IGJ1ZkluZm8qIHpmQmF3UG9wKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KTsKK3ZvaWQgICAgemZCYXdFbmFibGUoemRldl90KiBkZXYsIFRJRF9CQVcgdGlkX2JhdywgdTE2X3Qgc3RhcnRfc2VxKTsKK3ZvaWQgICAgemZCYXdEaXNhYmxlKHpkZXZfdCogZGV2LCBUSURfQkFXIHRpZF9iYXcpOworVElEX0JBVyB6ZkJhd0dldFEoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEpOwordm9pZCB6ZkFnZ1R4UmV0cmFuc21pdCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCk7CisjZW5kaWYKKy8qIGV4dGVybiBmdW5jdGlvbnMgKi8KK2V4dGVybiB6YnVmX3QqIHpmR2V0VnR4cSh6ZGV2X3QqIGRldiwgdThfdCBhYyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DQUdHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NjbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5OTc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKQEAgLTAsMCArMSwxODYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjbWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbW1hbmQgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKyNpbmNsdWRlICIuLi9oYWwvaHByZWcuaCIKKworCit1MTZfdCB6ZldsYW5SZXNldCh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZlVwZGF0ZVJ4UmF0ZSh6ZGV2X3QqIGRldik7CisKKworZXh0ZXJuIHZvaWQgemZpVXNiUmVjdih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpOworZXh0ZXJuIHZvaWQgemZpVXNiUmVnSW4oemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdm9pZCB6ZmlVc2JPdXRDb21wbGV0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpOworZXh0ZXJuIHZvaWQgemZpVXNiUmVnT3V0Q29tcGxldGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmSHBSZWluaXQoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CisKKy8qIEdldCBzaXplIChieXRlKSBvZiBkcml2ZXIgY29yZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUuICAgICovCisvKiBUaGlzIHNpemUgd2lsbCBiZSB1c2VkIGJ5IGRyaXZlciB3cmFwcGVyIHRvIGFsbG9jYXRlICAgICAqLworLyogYSBtZW1vcnkgc3BhY2UgZm9yIGRyaXZlciBjb3JlIHRvIHN0b3JlIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3UxNl90IHpmaUdsb2JhbERhdGFTaXplKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IHJldDsKKyAgICByZXQgPSAoc2l6ZW9mKHN0cnVjdCB6c1dsYW5EZXYpKTsKKyAgICB6bV9hc3NlcnQoKHJldD4+MTYpID09IDApOworICAgIHJldHVybiAodTE2X3QpcmV0OworfQorCisKKy8qIEluaXRpYWxpemUgV0xBTiBoYXJkd2FyZSBhbmQgc29mdHdhcmUsIHJlc291cmNlIHdpbGwgYmUgYWxsb2NhdGVkICovCisvKiBmb3IgV0xBTiBvcGVyYXRpb24sIG11c3QgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSBvdGhlciBmdW5jdGlvbi4gICAqLworZXh0ZXJuIHUxNl90IHpmaVdsYW5PcGVuKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNDYkZ1bmNUYmwqIGNiRnVuY1RibCkKK3sKKyAgICAvL3UxNl90IHJldDsKKyAgICAvL3UzMl90IGk7CisgICAgLy91OF90KiBjaDsKKyAgICAvL3U4X3QgIGJQYXNzaXZlOworICAgIHUzMl90IGRldlNpemU7CisgICAgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIGNiVXNiRnVuY1RibDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJzdGFydCIpOworCisgICAgZGV2U2l6ZSA9IHNpemVvZihzdHJ1Y3QgenNXbGFuRGV2KTsKKyAgICAvKiBaZXJvaXplIHpzV2xhbkRldiBzdHJ1Y3QgKi8KKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLCAodTE2X3QpZGV2U2l6ZSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICB6ZkFnZ0luaXQoZGV2KTsKKyNlbmRpZgorCisgICAgemZDd21Jbml0KGRldik7CisKKyAgICB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsVHhNUERVID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsQkFGYWlsID0gMDsKKyAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVDsKKworICAgIGlmIChjYkZ1bmNUYmwgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIHpmY2JSZWN2RXRoKCkgaXMgbWFuZGF0b3J5ICovCisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGNiRnVuY1RibC0+emZjYlJlY3ZFdGggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogemZjYlJlY3ZFdGgoKSBpcyBtYW5kYXRvcnkgKi8KKyAgICAgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+emZjYkF1dGhOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBdXRoTm90aWZ5OworICAgICAgICB3ZC0+emZjYkF1dGhOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBdXRoTm90aWZ5OworICAgICAgICB3ZC0+emZjYkFzb2NOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBc29jTm90aWZ5OworICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JEaXNBc29jTm90aWZ5OworICAgICAgICB3ZC0+emZjYkFwQ29ubmVjdE5vdGlmeSA9IGNiRnVuY1RibC0+emZjYkFwQ29ubmVjdE5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiQ29ubmVjdE5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JTY2FuTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiU2Nhbk5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiTWljRmFpbHVyZU5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnk7CisgICAgICAgIHdkLT56ZmNiSWJzc1BhcnRuZXJOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JJYnNzUGFydG5lck5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JNYWNBZGRyZXNzTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiTWFjQWRkcmVzc05vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uID0gY2JGdW5jVGJsLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbjsKKyAgICAgICAgd2QtPnpmY2JSZWN2RXRoID0gY2JGdW5jVGJsLT56ZmNiUmVjdkV0aDsKKyAgICAgICAgd2QtPnpmY2JSZXN0b3JlQnVmRGF0YSA9IGNiRnVuY1RibC0+emZjYlJlc3RvcmVCdWZEYXRhOworICAgICAgICB3ZC0+emZjYlJlY3Y4MDIxMSA9IGNiRnVuY1RibC0+emZjYlJlY3Y4MDIxMTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICB3ZC0+emZjYkNlbmNBc29jTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiQ2VuY0Fzb2NOb3RpZnk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB3ZC0+emZjYkNsYXNzaWZ5VHhQYWNrZXQgPSBjYkZ1bmNUYmwtPnpmY2JDbGFzc2lmeVR4UGFja2V0OworICAgICAgICB3ZC0+emZjYkh3V2F0Y2hEb2dOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JId1dhdGNoRG9nTm90aWZ5OworICAgIH0KKworICAgIC8vYWRkIGJ5IGhvbmRhIDAzMzAKKyAgICBjYlVzYkZ1bmNUYmwuemZjYlVzYlJlY3YgPSB6ZmlVc2JSZWN2OworICAgIGNiVXNiRnVuY1RibC56ZmNiVXNiUmVnSW4gPSB6ZmlVc2JSZWdJbjsKKyAgICBjYlVzYkZ1bmNUYmwuemZjYlVzYk91dENvbXBsZXRlID0gemZpVXNiT3V0Q29tcGxldGU7CisgICAgY2JVc2JGdW5jVGJsLnpmY2JVc2JSZWdPdXRDb21wbGV0ZSA9IHpmaVVzYlJlZ091dENvbXBsZXRlOworICAgIHpmd1VzYlJlZ2lzdGVyQ2FsbEJhY2soZGV2LCAmY2JVc2JGdW5jVGJsKTsKKyAgICAvKiBJbml0IE9XTiBNQUMgYWRkcmVzcyAqLworICAgIHdkLT5tYWNBZGRyWzBdID0gMHg4MDAwOworICAgIHdkLT5tYWNBZGRyWzFdID0gMHgwMDAwOworICAgIHdkLT5tYWNBZGRyWzJdID0gMHgwMDAwOworCisgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlID0gMHhmZmZmOworCisgICAgemZIcEluaXQoZGV2LCB3ZC0+ZnJlcXVlbmN5KTsKKworICAgIC8qIGluaXQgcmVnaW9uIGNvZGUgKi8KKyAgICAvL3dkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IE5VTEwxX1dPUkxEOyAvL09ubHkgMi40ZyBSZWdDb2RlCisgICAgLy96ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBOVUxMMV9XT1JMRCk7CisgICAgLy96ZmlXbGFuU2V0RG90MTFETW9kZShkZXYgLCAxKTsgLy8gRW5hYmxlIDgwMi4xMWQKKyAgICAvKiBHZXQgdGhlIGZpcnN0IGNoYW5uZWwgKi8KKyAgICAvL3dkLT5mcmVxdWVuY3kgPSB6ZkNoR2V0Rmlyc3RDaGFubmVsKGRldiwgJmJQYXNzaXZlKTsKKyNpZmRlZiBaTV9BUF9ERUJVRworICAgIC8vd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisjZW5kaWYKKworICAgIC8vU1RBIG1vZGUKKyAgICB3ZC0+c3RhLm1UeFJhdGUgPSAweDA7CisgICAgd2QtPnN0YS51VHhSYXRlID0gMHgzOworICAgIHdkLT5zdGEubW1UeFJhdGUgPSAweDA7CisgICAgd2QtPnN0YS5hZGFwdGVyU3RhdGUgPSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVDsKKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gPSAweDAxOworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSA9IDB4MDA7CisKKyAgICB3ZC0+c3RhLnByZWFtYmxlVHlwZUhUID0gMDsKKyAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9IDA7CisgICAgd2QtPnN0YS5odEN0cmxTVEJDID0gMDsKKyAgICB3ZC0+c3RhLmh0Q3RybFNHID0gMDsKKyAgICB3ZC0+c3RhLmRlZmF1bHRUQSA9IDA7CisgICAgLy93ZC0+c3RhLmFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbCA9IFpNX1RJTUVfQUNUSVZFX1NDQU4vWk1fTVNfUEVSX1RJQ0s7CisJeworCQl1OF90IER1ciA9IFpNX1RJTUVfQUNUSVZFX1NDQU47CisJCXpmd0dldEFjdGl2ZVNjYW5EdXIoZGV2LCAmRHVyKTsKKwkJd2QtPnN0YS5hY3RpdmVzY2FuVGlja1BlckNoYW5uZWwgPSBEdXIvWk1fTVNfUEVSX1RJQ0s7CisKKwl9CisgICAgd2QtPnN0YS5wYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsID0gWk1fVElNRV9QQVNTSVZFX1NDQU4vWk1fTVNfUEVSX1RJQ0s7CisgICAgd2QtPnN0YS5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgd2QtPnN0YS5kcm9wVW5lbmNyeXB0ZWRQa3RzID0gRkFMU0U7CisKKyAgICAvKiBzZXQgZGVmYXVsdCB0byBieXBhc3MgYWxsIG11bHRpY2FzdCBwYWNrZXQgZm9yIGxpbnV4LCB3aW5kb3cgWFAgd291bGQgc2V0IDAgYnkgd3JhcHBlciBpbml0aWFsaXphdGlvbiAqLworCXdkLT5zdGEuYkFsbE11bHRpY2FzdCA9IDE7CisKKyAgICAvKiBJbml0aWFsIHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICB3ZC0+c3RhLnJpZnNTdGF0ZSA9IFpNX1JJRlNfU1RBVEVfREVURUNUSU5HOworICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZUNudCA9IDA7CisgICAgd2QtPnN0YS5yaWZzQ291bnQgPSAwOworCisgICAgd2QtPnN0YS5vc1J4RmlsdGVyID0gMDsKKyAgICB3ZC0+c3RhLmJTYWZlTW9kZSA9IDA7CisKKyAgICAvL0NvbW1vbgorICAgIHpmUmVzZXRTdXBwb3J0UmF0ZShkZXYsIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0RJU0NPTk5FQ1QpOworICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsKKyAgICB3ZC0+cnRzVGhyZXNob2xkID0gMjM0NjsKKyAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IDMyNzY3OworICAgIHdkLT53bGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgd2QtPnR4TUNTID0gMHhmZjsgICAgLy9BVVRPCisgICAgd2QtPmR0aW0gPSAxOworICAgIC8vd2QtPnR4TVQgPSAxOyAgICAgICAvL09GRE0KKyAgICB3ZC0+dGljayA9IDE7CisgICAgd2QtPm1heFR4UG93ZXIyID0gMHhmZjsKKyAgICB3ZC0+bWF4VHhQb3dlcjUgPSAweGZmOworICAgIHdkLT5zdXBwb3J0TW9kZSA9IDB4ZmZmZmZmZmY7CisgICAgd2QtPndzLmFkaG9jTW9kZSA9IFpNX0FESE9DQkFORF9HOworICAgIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID0gMHhmZjsKKworICAgIC8vQVAgbW9kZQorICAgIC8vd2QtPmJnTW9kZSA9IHdkLT53cy5iZ01vZGU7CisgICAgd2QtPmFwLnNzaWRMZW5bMF0gPSA2OworICAgIHdkLT5hcC5zc2lkWzBdWzBdID0gJ1onOworICAgIHdkLT5hcC5zc2lkWzBdWzFdID0gJ0QnOworICAgIHdkLT5hcC5zc2lkWzBdWzJdID0gJzEnOworICAgIHdkLT5hcC5zc2lkWzBdWzNdID0gJzInOworICAgIHdkLT5hcC5zc2lkWzBdWzRdID0gJzInOworICAgIHdkLT5hcC5zc2lkWzBdWzVdID0gJzEnOworCisgICAgLy8gSW5pdCB0aGUgY291bnRyeSBpc28gbmFtZSBhcyBOQQorICAgIHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IDA7CisgICAgd2QtPndzLmNvdW50cnlJc29OYW1lWzFdID0gMDsKKyAgICB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworCisJLyogaW5pdCBmcmFnbWVudGF0aW9uIGlzIGRpc2FibGVkICovCisJLy96ZmlXbGFuU2V0RnJhZ1RocmVzaG9sZChkZXYsIDApOworCisJLyogYWlyb3BlZWsgOiBzd1NuaWZmZXIgMT0+b24gIDA9Pm9mZiAqLworCXdkLT5zd1NuaWZmZXIgPSAwOworICAgIHdkLT5YTGlua01vZGUgPSAwOworCisvLyBqaGxlZSBIVCAwCisjaWYgMQorICAgIC8qIEFQIE1vZGUqLworICAgIC8qIEluaXQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPmFwLkhUQ2FwLkRhdGEuRWxlbWVudElEID0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWTsKKyAgICB3ZC0+YXAuSFRDYXAuRGF0YS5MZW5ndGggPSAyNjsKKyAgICAvL3dkLT5hcC5IVENhcC5EYXRhLlN1cENoYW5uZWxXaWR0aFNldCA9IDA7CisgICAgLy93ZC0+YXAuSFRDYXAuRGF0YS5NSU1PUG93ZXJTYXZlID0gMzsKKyAgICAvL3dkLT5hcC5IVENhcC5EYXRhLlNob3J0R0lmb3I0ME1IeiA9IDA7CisgICAgLy93ZC0+YXAuSFRDYXAuRGF0YS5TaG9ydEdJZm9yMjBNSHogPSAwOworICAgIC8vd2QtPmFwLkhUQ2FwLkRhdGEuRFNTU2FuZENDS2luNDBNSHogPSAwOworICAgIHdkLT5hcC5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CisgICAgd2QtPmFwLkhUQ2FwLkRhdGEuTUNTU2V0WzBdID0gMHhGRjsgLy8gTUNTIDAgfiAgNworICAgIHdkLT5hcC5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKKworICAgIC8qIEluaXQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEID0gWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWTsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5MZW5ndGggPSAyMjsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5Db250cm9sQ2hhbm5lbCA9IDY7CisgICAgLy93ZC0+YXAuRXh0SFRDYXAuRGF0YS5FeHRDaGFubmVsT2Zmc2V0ID0gMzsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQ7CisgICAgLy93ZC0+YXAuRXh0SFRDYXAuRGF0YS5SSUZTTW9kZSA9IDE7CisgICAgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuT3BlcmF0aW5nSW5mbyB8PSAxOworCisgICAgLyogU1RBIE1vZGUqLworICAgIC8qIEluaXQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkVsZW1lbnRJRCA9IFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFk7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCA9IDI2OworCisgICAgLyogVGVzdCB3aXRoIDVHLUFQIDogNzYwMyAqLworICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLlN1cENoYW5uZWxXaWR0aFNldCA9IDE7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TTUVuYWJsZWQ7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TdXBDaGFubmVsV2lkdGhTZXQ7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TaG9ydEdJZm9yNDBNSHo7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9EU1NTYW5kQ0NLaW40ME1IejsKKyNpZm5kZWYgWk1fRElTQUJMRV9BTVNEVThLX1NVUFBPUlQKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX01heEFNU0RVTGVuZ3RoOworI2VuZGlmCisgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuTUlNT1Bvd2VyU2F2ZSA9IDA7CisgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuU2hvcnRHSWZvcjQwTUh6ID0gMDsKKyAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5TaG9ydEdJZm9yMjBNSHogPSAwOworICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLkRTU1NhbmRDQ0tpbjQwTUh6ID0gMDsKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuQU1QRFVQYXJhbSB8PSBIVENBUF9NYXhSeEFNUERVMzsKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuTUNTU2V0WzBdID0gMHhGRjsgLy8gTUNTIDAgfiAgNworICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5NQ1NTZXRbMV0gPSAweEZGOyAvLyBNQ1MgOCB+IDE1CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLlBDTyB8PSBIVENBUF9UcmFuc21pc3Npb25UaW1lMzsKKyAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5UcmFuc21pc3Npb25UaW1lID0gMDsKKyAgICAvKiBJbml0IEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5FbGVtZW50SUQgPSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZOworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5MZW5ndGggPSAyMjsKKyAgICB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuQ29udHJvbENoYW5uZWwgPSA2OworCisgICAgLy93ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuRXh0Q2hhbm5lbE9mZnNldCB8PSAzOworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QmVsb3c7CisKKyAgICAvL3dkLT5zdGEuRXh0SFRDYXAuRGF0YS5SZWNvbVR4V2lkdGhTZXQgPSAxOworICAgIC8vd2QtPnN0YS5FeHRIVENhcC5EYXRhLlJJRlNNb2RlID0gMTsKKyAgICB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuT3BlcmF0aW5nSW5mbyB8PSAxOworI2VuZGlmCisKKyNpZiAwCisgICAgLyogV01FIHRlc3QgY29kZSAqLworICAgIHdkLT5hcC5xb3NNb2RlWzBdID0gMTsKKyNlbmRpZgorCisgICAgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzBdID0gMHgyMjIxOworICAgIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVsxXSA9IDB4MjIyMTsKKworICAgIHpmVGltZXJJbml0KGRldik7CisKKyAgICBaTV9QRVJGT1JNQU5DRV9JTklUKGRldik7CisKKyAgICB6ZkJzc0luZm9DcmVhdGUoZGV2KTsKKyAgICB6ZlNjYW5NZ3JJbml0KGRldik7CisgICAgemZQb3dlclNhdmluZ01nckluaXQoZGV2KTsKKworI2lmIDAKKyAgICAvKiBUZXN0IGNvZGUgKi8KKyAgICB7CisgICAgICAgIHUzMl90IGtleVs0XSA9IHsweGZmZmZmZmZmLCAweGZmLCAwLCAwfTsKKyAgICAgICAgdTE2X3QgYWRkclszXSA9IHsweDgwMDAsIDB4MDFhYiwgMHgwMDAwfTsKKyAgICAgICAgLy96ZlNldEtleShkZXYsIDAsIDAsIFpNX1dFUDY0LCBhZGRyLCBrZXkpOworICAgICAgICAvL3pmU2V0S2V5KGRldiwgMCwgMCwgWk1fQUVTLCBhZGRyLCBrZXkpOworICAgICAgICAvL3pmU2V0S2V5KGRldiwgNjQsIDAsIDEsIHdkLT5tYWNBZGRyLCBrZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gV01FIHNldHRpbmdzCisgICAgd2QtPndzLnN0YVdtZUVuYWJsZWQgPSAxOyAgICAgICAgICAgLy8gRW5hYmxlIFdNRSBieSBkZWZhdWx0CisgICAgI2RlZmluZSBaTV9VQVBTRF9RX1NJWkUgMzIgLy8yXk4KKyAgICB3ZC0+YXAudWFwc2RRID0gemZRdWV1ZUNyZWF0ZShkZXYsIFpNX1VBUFNEX1FfU0laRSk7CisgICAgem1fYXNzZXJ0KHdkLT5hcC51YXBzZFEgIT0gTlVMTCk7CisgICAgd2QtPnN0YS51YXBzZFEgPSB6ZlF1ZXVlQ3JlYXRlKGRldiwgWk1fVUFQU0RfUV9TSVpFKTsKKyAgICB6bV9hc3NlcnQod2QtPnN0YS51YXBzZFEgIT0gTlVMTCk7CisKKyAgICAvL3pmSHBJbml0KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisKKyAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIC8vemZIcFNldE1hY0FkZHJlc3MoZGV2LCB3ZC0+bWFjQWRkciwgMCk7CisgICAgemZIcEdldE1hY0FkZHJlc3MoZGV2KTsKKworICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworCisjaWYgWk1fUENJX0xPT1BfQkFDSyA9PSAxCisgICAgemZ3V3JpdGVSZWcoZGV2LCBaTV9SRUdfUENJX0NPTlRST0wsIDYpOworI2VuZGlmIC8qICNpZiBaTV9QQ0lfTE9PUF9CQUNLID09IDEgKi8KKworICAgIC8vemZpV2xhblNldERvdDExRE1vZGUoZGV2ICwgMSk7IC8vIEVuYWJsZSA4MDIuMTFkCisgICAgLy96ZmlXbGFuU2V0RG90MTFIREZTTW9kZShkZXYgLCAxKTsgLy8gRW5hYmxlIDgwMi4xMWggREZTCisgICAgd2QtPnN0YS5ERlNFbmFibGUgPSAxOworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKworICAgIC8vemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIDUyNjAwMDAsIFRSVUUpOworICAgIC8vemZpV2xhblNldEFuaU1vZGUoZGV2ICwgMSk7IC8vIEVuYWJsZSBBTkkKKworICAgIC8qIFRyZ2dlciBSeCBETUEgKi8KKyAgICB6ZkhwU3RhcnRSZWN2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJlbmQiKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBXTEFOIGhhcmR3YXJlIHdpbGwgYmUgc2h1dGRvd24gYW5kIGFsbCByZXNvdXJjZSB3aWxsIGJlIHJlbGVhc2UgKi8KK3UxNl90IHpmaVdsYW5DbG9zZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgImVudGVyIik7CisKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0NMT1NFREVEOworCisgICAgLy96ZmlXbGFuRGlzYWJsZShkZXYsIDEpOworICAgIHpmV2xhblJlc2V0KGRldik7CisKKyAgICB6ZkhwU3RvcFJlY3YoZGV2KTsKKworICAgIC8qIERpc2FibGUgTUFDICovCisgICAgLyogRGlzYWJsZSBQSFkgKi8KKyAgICAvKiBEaXNhYmxlIFJGICovCisKKyAgICB6ZkhwUmVsZWFzZShkZXYpOworCisgICAgemZRdWV1ZURlc3Ryb3koZGV2LCB3ZC0+YXAudWFwc2RRKTsKKyAgICB6ZlF1ZXVlRGVzdHJveShkZXYsIHdkLT5zdGEudWFwc2RRKTsKKworICAgIHpmQnNzSW5mb0Rlc3Ryb3koZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIC8qIGFkZCBieSBob25kYSAqLworICAgIHpmQWdnUnhGcmVlQnVmKGRldiwgMSk7ICAvLzEgZm9yIHJlbGVhc2Ugc3RydWN0dXJlIG1lbW9yeQorICAgIC8qIGVuZCBvZiBhZGQgYnkgaG9uZGEgKi8KKyNlbmRpZgorCisgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJleGl0Iik7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkdldFdyYXBwZXJTZXR0aW5nKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICBiUGFzc2l2ZTsKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworI2lmIDAKKyAgICBpZiAoICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMF0gIT0gMCkKKyAgICAgICAgIHx8ICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMV0gIT0gMCkKKyAgICAgICAgIHx8ICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gIT0gJ1wwJykgKQorICAgIHsKKyAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKAorICAgICAgICAgICAgZGV2LAorICAgICAgICAgICAgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZShkZXYsIHdkLT53cy5jb3VudHJ5SXNvTmFtZSkgKTsKKyAgICB9CisjZW5kaWYKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPndsYW5Nb2RlID0gd2QtPndzLndsYW5Nb2RlOworCisgICAgLyogc2V0IGNoYW5uZWwgKi8KKyAgICBpZiAoIHdkLT53cy5mcmVxdWVuY3kgKQorICAgIHsKKyAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IHdkLT53cy5mcmVxdWVuY3k7CisgICAgICAgIHdkLT53cy5mcmVxdWVuY3kgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsICZiUGFzc2l2ZSk7CisKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT53cy5hZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IFpNX0NIX0FfMzY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gWk1fQ0hfR182OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmZGVmIFpNX0FQX0RFQlVHCisgICAgLyogaG9uZGEgYWRkIGZvciBkZWJ1ZywgMjQzNyBjaGFubmVsIDYsIDI0NTIgY2hhbm5lbCA5ICovCisgICAgd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisgICAgLyogZW5kIG9mIGFkZCBieSBob25kYSAqLworI2VuZGlmCisKKyAgICAvKiBzZXQgcHJlYW1ibGUgdHlwZSAqLworICAgIHN3aXRjaCAod2QtPndzLnByZWFtYmxlVHlwZSkKKyAgICB7CisgICAgY2FzZSBaTV9QUkVBTUJMRV9UWVBFX0FVVE86CisgICAgY2FzZSBaTV9QUkVBTUJMRV9UWVBFX1NIT1JUOgorICAgIGNhc2UgWk1fUFJFQU1CTEVfVFlQRV9MT05HOgorICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlID0gd2QtPndzLnByZWFtYmxlVHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2QtPnByZWFtYmxlVHlwZSA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB3ZC0+d3MucHJlYW1ibGVUeXBlID0gMDsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5hcC5hdXRoQWxnb1swXSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICAgICAgICAgIHdkLT5hcC5lbmNyeU1vZGVbMF0gPSB3ZC0+d3MuZW5jcnlNb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvW3ZhcElkICsgMV0gPSB3ZC0+d3MuYXV0aE1vZGU7CisgICAgICAgICAgICB3ZC0+YXAuZW5jcnlNb2RlW3ZhcElkICsgMV0gPSB3ZC0+d3MuZW5jcnlNb2RlOworICAgICAgICB9CisgICAgICAgIHdkLT53cy5hdXRoTW9kZSA9IDA7CisgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisKKyAgICAgICAgLyogR2V0IGJlYWNvbkludGVydmFsIGZyb20gV3JhcHBlclNldHRpbmcgKi8KKyAgICAgICAgaWYgKCh3ZC0+d3MuYmVhY29uSW50ZXJ2YWwgPj0gMjApICYmICh3ZC0+d3MuYmVhY29uSW50ZXJ2YWwgPD0gMTAwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IHdkLT53cy5iZWFjb25JbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsgLy8xMDBtcworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT53cy5kdGltID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmR0aW0gPSB3ZC0+d3MuZHRpbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5kdGltID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHdkLT5hcC5xb3NNb2RlID0gd2QtPndzLmFwV21lRW5hYmxlZCAmIDB4MTsKKyAgICAgICAgd2QtPmFwLnVhcHNkRW5hYmxlZCA9ICh3ZC0+d3MuYXBXbWVFbmFibGVkICYgMHgyKSA+PiAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLmF1dGhNb2RlID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSB3ZC0+d3Mud2VwU3RhdHVzOworCisgICAgICAgIGlmICggd2QtPndzLmJlYWNvbkludGVydmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmJlYWNvbkludGVydmFsID0gd2QtPndzLmJlYWNvbkludGVydmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmJlYWNvbkludGVydmFsID0gMHg2NDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEuIFNldCBkZWZhdWx0IGNoYW5uZWwgNiAoMjQzN01IeikgKi8KKy8vICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisKKyAgICAgICAgICAgIC8qIDIuIE90dXMgc3VwcG9ydCA4MDIuMTFnIE1vZGUgKi8KKyAgICAgICAgICAgIGlmICgod2QtPndzLmFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRykgfHwKKyAgICAgICAgICAgICAgICAod2QtPndzLmFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQkcpIHx8CisgICAgICAgICAgICAgICAgKHdkLT53cy5hZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRykgKSB7CisgICAgICAgICAgICAgICAgd2QtPndmYy5iSWJzc0dNb2RlID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2QtPndmYy5iSWJzc0dNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogMy4gc2V0IHNob3J0IHByZWFtYmxlICAqLworICAgICAgICAgICAgLy93ZC0+c3RhLnByZWFtYmxlVHlwZSA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQgOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IEFUSU0gd2luZG93ICovCisgICAgICAgIGlmICggd2QtPndzLmF0aW1XaW5kb3cgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmF0aW1XaW5kb3cgPSB3ZC0+d3MuYXRpbVdpbmRvdzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5hdGltV2luZG93ID0gMHgwYTsKKyAgICAgICAgICAgIHdkLT5zdGEuYXRpbVdpbmRvdyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdGluZ0hpZGRlbkFQID0gMTsvL3dkLT53cy5jb25uZWN0aW5nSGlkZGVuQVA7CisgICAgICAgIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyA9IHdkLT53cy5kcm9wVW5lbmNyeXB0ZWRQa3RzOworICAgICAgICB3ZC0+c3RhLmlic3NKb2luT25seSA9IHdkLT53cy5pYnNzSm9pbk9ubHk7CisKKyAgICAgICAgaWYgKCB3ZC0+d3MuYkRlc2lyZWRCc3NpZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLmRlc2lyZWRCc3NpZCwgd2QtPndzLmRlc2lyZWRCc3NpZCwgNik7CisgICAgICAgICAgICB3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPSBUUlVFOworICAgICAgICAgICAgd2QtPndzLmJEZXNpcmVkQnNzaWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYkRlc2lyZWRCc3NpZCA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgc3NpZCAqLworICAgICAgICBpZiAoIHdkLT53cy5zc2lkTGVuICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICghemZNZW1vcnlJc0VxdWFsKHdkLT53cy5zc2lkLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3NpZExlbikpfHwKKyAgICAgICAgICAgICAgICAgKHdkLT53cy5zc2lkTGVuICE9IHdkLT5zdGEuc3NpZExlbil8fAorICAgICAgICAgICAgICAgICAod2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBKXx8CisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEFQU0spIHx8CisgICAgICAgICAgICAgICAgICh3ZC0+d3Muc3RhV21lUW9zSW5mbyE9IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKmlmIHUtQVBTRCB0ZXN0KHNldCBRb3NJbmZvKSwgY2xlYXIgY29ubmVjdEJ5UmVhc3NvIHRvIGRvIGFzc29jaWF0aW9uIChub3QgcmVhc3NvY2lhdGlvbikqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvID0gRkFMU0U7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5mYWlsQ250T2ZSZWFzc28gPSAwOworICAgICAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgPSAwOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuID0gd2QtPndzLnNzaWRMZW47CisgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEuc3NpZCwgd2QtPndzLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3NpZExlbiA8IDMyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3NpZFt3ZC0+c3RhLnNzaWRMZW5dID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgLyogQU5ZIEJTUyAqLworICAgICAgICAgICAgd2QtPnN0YS5zc2lkWzBdID0gMDsKKyAgICAgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+c3RhLndtZUVuYWJsZWQgPSB3ZC0+d3Muc3RhV21lRW5hYmxlZDsKKyAgICAgICAgd2QtPnN0YS53bWVRb3NJbmZvID0gd2QtPndzLnN0YVdtZVFvc0luZm87CisKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit1MTZfdCB6ZldsYW5FbmFibGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgICAgYnNzaWRbNl0gPSB7MHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MH07CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1VOS05PV04gKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiVW5rbm93biBNb2RlLi4uU2tpcC4uLiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB1MTZfdCB2YXBJZDsKKworICAgICAgICB2YXBJZCA9IHpmd0dldFZhcElkKGRldik7CisKKyAgICAgICAgaWYgKHZhcElkID09IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICAgICAgemZBcEluaXRTdGFUYmwoZGV2KTsKKworICAgICAgICAgICAgLyogQVAgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICB3ZC0+YlJhdGUgPSAweGY7CisgICAgICAgICAgICB3ZC0+Z1JhdGUgPSAweGZmOworICAgICAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAweGY7CisgICAgICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IDB4MDsKKyAgICAgICAgICAgIC8vd2QtPmJlYWNvbkludGVydmFsID0gMTAwOworICAgICAgICAgICAgd2QtPmFwLmFwQml0bWFwID0gMTsKKyAgICAgICAgICAgIHdkLT5hcC5iZWFjb25Db3VudGVyID0gMDsKKyAgICAgICAgICAgIC8vd2QtPmFwLnZhcE51bWJlciA9IDE7ICAgIC8vbWFyayBieSB5Z3dlaSBmb3IgVmFwCisKKyAgICAgICAgICAgIHdkLT5hcC5oaWRlU3NpZFswXSA9IDA7CisgICAgICAgICAgICB3ZC0+YXAuc3RhQWdpbmdUaW1lU2VjID0gMTAqNjA7CisgICAgICAgICAgICB3ZC0+YXAuc3RhUHJvYmluZ1RpbWVTZWMgPSA2MDsKKworICAgICAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYmNtY0hlYWRbaV0gPSB3ZC0+YXAuYmNtY1RhaWxbaV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3dkLT5hcC51bmlIZWFkID0gd2QtPmFwLnVuaVRhaWwgPSAwOworCisgICAgICAgICAgICAvKiBsb2FkIEFQIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIHdkLT5iUmF0ZUJhc2ljID0gd2QtPndzLmJSYXRlQmFzaWM7CisgICAgICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IHdkLT53cy5nUmF0ZUJhc2ljOworICAgICAgICAgICAgd2QtPmJnTW9kZSA9IHdkLT53cy5iZ01vZGU7CisgICAgICAgICAgICBpZiAoKHdkLT53cy5zc2lkTGVuIDw9IDMyKSAmJiAod2QtPndzLnNzaWRMZW4gIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnNzaWRMZW5bMF0gPSB3ZC0+d3Muc3NpZExlbjsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT53cy5zc2lkTGVuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3NpZFswXVtpXSA9IHdkLT53cy5zc2lkW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IDA7IC8vIFJlc2V0IFdyYXBwZXIgVmFyaWFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdkLT5hcC5lbmNyeU1vZGVbMF0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMF0gPSAweDAwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMF0gPSAweDAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNldCBTaG9ydCBTbG90IFRpbWUgYml0IGlmIG5vdCAxMWIgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAud2xhblR5cGVbMF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd2QtPmFwLmNhcGFiWzBdIHw9IDB4NDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3ZC0+YXAudmFwTnVtYmVyID0gMTsgICAgLy8gbWFyayBieSB5Z3dlaSBmb3IgVmFwIFRlc3QKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICAvKiBWQVAgVGVzdCBDb2RlICovCisgICAgICAgICAgICB3ZC0+YXAuYXBCaXRtYXAgPSAweDM7CisgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMV0gPSAweDQwMTsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkTGVuWzFdID0gNDsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkWzFdWzBdID0gJ3YnOworICAgICAgICAgICAgd2QtPmFwLnNzaWRbMV1bMV0gPSAnYSc7CisgICAgICAgICAgICB3ZC0+YXAuc3NpZFsxXVsyXSA9ICdwJzsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkWzFdWzNdID0gJzEnOworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvWzFdID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICAgICAgd2QtPmFwLmVuY3J5TW9kZVsxXSA9IHdkLT53cy5lbmNyeU1vZGU7CisgICAgICAgICAgICB3ZC0+YXAudmFwTnVtYmVyID0gMjsKKyNlbHNlCisgICAgICAgICAgICAvKiBWQVAgVGVzdCBDb2RlICovCisgICAgICAgICAgICB3ZC0+YXAuYXBCaXRtYXAgPSAweDEgfCAoMHgwMSA8PCAodmFwSWQrMSkpOworCisgICAgICAgICAgICBpZiAoKHdkLT53cy5zc2lkTGVuIDw9IDMyKSAmJiAod2QtPndzLnNzaWRMZW4gIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnNzaWRMZW5bdmFwSWQrMV0gPSB3ZC0+d3Muc3NpZExlbjsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT53cy5zc2lkTGVuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3NpZFt2YXBJZCsxXVtpXSA9IHdkLT53cy5zc2lkW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IDA7IC8vIFJlc2V0IFdyYXBwZXIgVmFyaWFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdkLT5hcC5lbmNyeU1vZGVbdmFwSWQrMV0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWQrMV0gPSAweDQwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWQrMV0gPSAweDQxMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvW3ZhcElkKzFdID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICAgICAgd2QtPmFwLmVuY3J5TW9kZVt2YXBJZCsxXSA9IHdkLT53cy5lbmNyeU1vZGU7CisKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gYmUgbW9kaWZpZWQgd2hlbiBWQVAgaXMgdXNlZCAqLworICAgICAgICAgICAgLy93ZC0+YXAudmFwTnVtYmVyID0gMjsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgd2QtPmFwLnZhcE51bWJlcisrOworCisgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworCisgICAgICAgIHpmSW5pdE1hY0FwTW9kZShkZXYpOworCisgICAgICAgIC8qIERpc2FibGUgcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIHpmQXBTZXRQcm90ZWN0aW9uTW9kZShkZXYsIDApOworCisgICAgICAgIHpmQXBTZW5kQmVhY29uKGRldik7CisgICAgfSAvKmlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVDb3VudCA9IDA7ICAgIC8qIHJlc2V0IG9wcG9zaXRlIGNvdW50ICovCisgICAgICAgIC8vd2QtPnN0YS5iQXV0b1JlY29ubmVjdCA9IHdkLT5zdGEuYkF1dG9SZWNvbm5lY3RFbmFibGVkOworICAgICAgICAvL3dkLT5zdGEuc2NhbldpdGhTU0lEID0gMDsKKyAgICAgICAgemZTdGFJbml0T3Bwb3NpdGVJbmZvKGRldik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgemZTdGFSZXNldFN0YXR1cyhkZXYsIDApOworCisgICAgICAgIGlmICggKHdkLT5zdGEuY21EaXNhbGxvd1NzaWRMZW5ndGggIT0gMCkmJgorICAgICAgICAgICAgICh3ZC0+c3RhLnNzaWRMZW4gPT0gd2QtPnN0YS5jbURpc2FsbG93U3NpZExlbmd0aCkmJgorICAgICAgICAgICAgICh6Zk1lbW9yeUlzRXF1YWwod2QtPnN0YS5zc2lkLCB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuKSkgJiYKKyAgICAgICAgICAgICAod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9US0lQKSkKKyAgICAgICAgeyAgIC8qIGNvdW50ZXJtZWFzdXJlcyAqLworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiY291bnRlcm1lYXN1cmVzIGRpc2FsbG93IGFzc29jaWF0aW9uIik7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCggd2QtPndsYW5Nb2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfSUJTUzoKKyAgICAgICAgICAgICAgICAgICAgLyogc29tZSByZWdpc3RlcnMgbWF5IGJlIHNldCBoZXJlICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRBcFN0YU1vZGUoZGV2LCBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldEFwU3RhTW9kZShkZXYsIFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfR0VORVJBTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJaTV9NT0RFX0lCU1MiKTsKKyAgICAgICAgICAgICAgICAgICAgemZJYnNzQ29ubmVjdE5ldHdvcmsoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfSU5GUkFTVFJVQ1RVUkU6CisgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgcmVnaXN0ZXJzIG1heSBiZSBzZXQgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICB6ZkhwU2V0QXBTdGFNb2RlKGRldiwgWk1fSEFMXzgwMjExX01PREVfU1RBKTsKKworICAgICAgICAgICAgICAgICAgICB6ZkluZnJhQ29ubmVjdE5ldHdvcmsoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfUFNFVURPOgorICAgICAgICAgICAgICAgICAgICAvKiBzb21lIHJlZ2lzdGVycyBtYXkgYmUgc2V0IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgemZIcFNldEFwU3RhTW9kZShkZXYsIFpNX0hBTF84MDIxMV9NT0RFX1NUQSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIGJzc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy9pZiAoICh3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkmJgorICAgIC8vICAgICAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVApICkKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETyApCisgICAgeworICAgICAgICAvKiBSZXNldCBXbGFuIHN0YXR1cyAqLworICAgICAgICB6ZldsYW5SZXNldChkZXYpOworCisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgfQorCisKKyAgICBpZih3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgICAgIC8vemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBBc3NpZ24gZGVmYXVsdCBUeCBSYXRlCisgICAgaWYgKCB3ZC0+c3RhLkVuYWJsZUhUICkKKyAgICB7CisJCXUzMl90IG9uZVR4U3RyZWFtQ2FwOworCQlvbmVUeFN0cmVhbUNhcCA9ICh6ZkhwQ2FwYWJpbGl0eShkZXYpICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKTsKKwkJaWYob25lVHhTdHJlYW1DYXApCisJCQl3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzUwMDA7CisJCWVsc2UKKwkJCXdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMjcwMDAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSA1NDAwMDsKKyAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gNTQwMDA7CisgICAgfQorCisgICAgd2QtPnN0YXRlID0gWk1fV0xBTl9TVEFURV9FTkFCTEVEOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEVuYWJsZS9kaXNhYmxlIFdsYW4gb3BlcmF0aW9uICovCit1MTZfdCB6ZmlXbGFuRW5hYmxlKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMSwgIkVuYWJsZSBXbGFuIik7CisKKyAgICB6ZkdldFdyYXBwZXJTZXR0aW5nKGRldik7CisKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSAmd2QtPnRyYWZUYWxseSwgc2l6ZW9mKHN0cnVjdCB6c1RyYWZUYWxseSkpOworCisgICAgLy8gUmVzZXQgY21NaWNGYWlsdXJlQ291bnQgdG8gMCBmb3IgbmV3IGFzc29jaWF0aW9uIHJlcXVlc3QKKyAgICBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMSApCisgICAgeworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fVElNRVIpOworICAgICAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50ID0gMDsKKyAgICB9CisKKyAgICB6ZkZsdXNoVnR4cShkZXYpOworICAgIGlmICgod2QtPnF1ZXVlRmx1c2hlZCAmIDB4MTApICE9IDApCisgICAgeworICAgICAgICB6ZkhwVXNiUmVzZXQoZGV2KTsKKyAgICB9CisgICAgcmV0ID0gemZXbGFuRW5hYmxlKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorLyogQWRkIGEgZmxhZyBuYW1lZCBSZXNldEtleUNhY2hlIHRvIHNob3cgaWYgS2V5Q2FjaGUgc2hvdWxkIGJlIGNsZWFyZWQuCisgICBmb3IgaG9zdGFwZCBpbiBBUCBtb2RlLCBpZiBkcml2ZXIgcmVjZWl2ZXMgaXdjb25maWcgaW9jdGwKKyAgIGFmdGVyIHNldHRpbmcgZ3JvdXAga2V5LCBpdCBzaG91bGRuJ3QgY2xlYXIgS2V5Q2FjaGUuICAgICAgICAgICAgICAgICAqLwordTE2X3QgemZpV2xhbkRpc2FibGUoemRldl90KiBkZXYsIHU4X3QgUmVzZXRLZXlDYWNoZSkKK3sKKyAgICB1MTZfdCAgaTsKKyAgICB1OF90IGlzQ29ubmVjdGVkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisjZW5kaWYKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEOworCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiRGlzYWJsZSBXbGFuIik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIGlzQ29ubmVjdGVkID0gemZTdGFJc0Nvbm5lY3RlZChkZXYpOworCisgICAgICAgIGlmICggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSYmCisgICAgICAgICAgICAgKHdkLT5zdGEuY3VycmVudEF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9XUEEyKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vemZpV2xhbkRlYXV0aChkZXYsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCB3ZC0+c3RhLmJzc2lkLCAzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAvL3ptd19kZWJ1Z19tc2cwKCJzZW5kIGEgRGVhdXRoIGZyYW1lISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgY29ubmVjdGVkIHBlZXIgc3RhdGlvbnMKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5pYnNzQnNzSXNDcmVhdG9yID0gMDsKKyAgICAgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9JQlNTX01PTklUT1IpOworICAgICAgICAgICAgemZTdGFJYnNzTW9uaXRvcmluZyhkZXYsIDEpOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEuaWJzc1dwYTJQc2sgPSAwOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfSU5JVDsKKworICAgICAgICAvKiByZXNldCBjb25uZWN0IHRpbWVvdXQgY291bnRlciAqLworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQgPSAwOworCisgICAgICAgIC8qIHJlc2V0IGNvbm5lY3RTdGF0ZSB0byBOb25lICovCisgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfTk9ORTsKKworICAgICAgICAvKiByZXNldCBsZWFwIGVuYWJsZSB2YXJpYWJsZSAqLworICAgICAgICB3ZC0+c3RhLmxlYXBFbmFibGVkID0gMDsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICAgICAgaWYoIHdkLT5zdGEucmlmc1N0YXRlID09IFpNX1JJRlNfU1RBVEVfREVURUNURUQgKQorICAgICAgICAgICAgemZIcERpc2FibGVSaWZzKGRldik7CisgICAgICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkc7CisgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZUNudCA9IDA7CisgICAgICAgIHdkLT5zdGEucmlmc0NvdW50ID0gMDsKKworICAgICAgICB3ZC0+c3RhLm9zUnhGaWx0ZXIgPSAwOworICAgICAgICB3ZC0+c3RhLmJTYWZlTW9kZSA9IDA7CisKKyAgICAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVCk7CisgICAgICAgIGlmIChSZXNldEtleUNhY2hlKQorICAgICAgICAgICAgemZIcFJlc2V0S2V5Q2FjaGUoZGV2KTsKKworICAgICAgICBpZiAoaXNDb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCwgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JDb25uZWN0Tm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0FCTEVELCB3ZC0+c3RhLmJzc2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpXS52YWxpZCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlYXNvbiA6IFNlbmRpbmcgc3RhdGlvbiBpcyBsZWF2aW5nICovCisgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0uYWRkciwgMywgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoUmVzZXRLZXlDYWNoZSkKKyAgICAgICAgICAgIHpmSHBSZXNldEtleUNhY2hlKGRldik7CisKKyAgICAgICAgd2QtPmFwLnZhcE51bWJlci0tOworICAgIH0KKworICAgIC8qIHN0b3AgYmVhY29uICovCisgICAgemZIcERpc2FibGVCZWFjb24oZGV2KTsKKworICAgIC8qIEZsdXNoIFZUeFEgYW5kIE1tUSAqLworICAgIHpmRmx1c2hWdHhxKGRldik7CisgICAgLyogRmx1c2ggQVAgUFMgcXVldWVzICovCisgICAgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKGRldik7CisgICAgLyogRnJlZSBidWZmZXIgaW4gZGVmcmFnbWVudCBsaXN0Ki8KKyAgICB6ZkFnaW5nRGVmcmFnTGlzdChkZXYsIDEpOworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIC8qIGFkZCBieSBob25kYSAqLworICAgIHpmQWdnUnhGcmVlQnVmKGRldiwgMCk7ICAvLzEgZm9yIHJlbGVhc2Ugc3RydWN0dXJlIG1lbW9yeQorICAgIC8qIGVuZCBvZiBhZGQgYnkgaG9uZGEgKi8KKyAgICAjZW5kaWYKKworICAgIC8vIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlZXIgc3RhdGlvbnMgb2YgSUJTUyBvciBBUCBvZiBTdGF0aW9uIG1vZGUKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLT5zdGEub3Bwb3NpdGVJbmZvLCBzaXplb2Yoc3RydWN0IHpzT3Bwb3NpdGVJbmZvKSAqIFpNX01BWF9PUFBPU0lURV9DT1VOVCk7CisKKyAgICAvKiBUdXJuIG9mZiBTb2Z0d2FyZSBXRVAvVEtJUCAqLworICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRGlzYWJsZSBzb2Z0d2FyZSBlbmNyeXB0aW9uIik7CisgICAgICAgIHpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbihkZXYpOworICAgIH0KKworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZpV2xhblN1c3BlbmQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIEhBTCBzdGF0ZSB0byBpbml0IHNvIHRoYXQgYW55IHBhY2tldCBjYW4ndCBiZSB0cmFuc21pdHRlZCBiZXR3ZWVuCisgICAgLy8gcmVzdW1lICYgSEFMIHJlaW5pdC4gVGhpcyB3b3VsZCBjYXVzZSB0aGUgY2hpcCBoYW5nIGlzc3VlIGluIE9UVVMuCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+aGFsU3RhdGUgPSBaTV9IQUxfU1RBVEVfSU5JVDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmaVdsYW5SZXN1bWUoemRldl90KiBkZXYsIHU4X3QgZG9SZWNvbm4pCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogUmVkb3dubG9hZCBmaXJtd2FyZSwgUmVpbml0IE1BQyxQSFksUkYgKi8KKyAgICB6ZkhwUmVpbml0KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisKKyAgICAvL1NldCBjaGFubmVsIGFjY29yZGluZyB0byBBUCdzIGNvbmZpZ3VyYXRpb24KKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgd2QtPmZyZXF1ZW5jeSwgd2QtPkJhbmRXaWR0aDQwLAorICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCwgMSk7CisKKyAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIHdkLT5tYWNBZGRyLCAwKTsKKworICAgIC8qIFN0YXJ0IFJ4ICovCisgICAgemZIcFN0YXJ0UmVjdihkZXYpOworCisgICAgemZGbHVzaFZ0eHEoZGV2KTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYKKyAgICAgICAgIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiUmVzdW1lIFdsYW4iKTsKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpIHx8ICh6ZlN0YUlzQ29ubmVjdGluZyhkZXYpKSApCisgICAgeworICAgICAgICBpZiAoZG9SZWNvbm4gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiUmUtY29ubmVjdC4uLiIpOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvID0gRkFMU0U7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICB6ZldsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkb1JlY29ubiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwU2V0Um9sbENhbGxUYWJsZShkZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIHpmaVdsYW5GbHVzaEFsbFF1ZXVlZEJ1ZmZlcnMgKi8KKy8qICAgICAgRmx1c2ggVmlydHVhbCBUeFEsIE1tUSwgUFMgZnJhbWVzIGFuZCBkZWZyYWdtZW50IGxpc3QgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpV2xhbkZsdXNoQWxsUXVldWVkQnVmZmVycyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBGbHVzaCBWVHhRIGFuZCBNbVEgKi8KKyAgICB6ZkZsdXNoVnR4cShkZXYpOworICAgIC8qIEZsdXNoIEFQIFBTIHF1ZXVlcyAqLworICAgIHpmQXBGbHVzaEJ1ZmZlcmVkUHNGcmFtZShkZXYpOworICAgIC8qIEZyZWUgYnVmZmVyIGluIGRlZnJhZ21lbnQgbGlzdCovCisgICAgemZBZ2luZ0RlZnJhZ0xpc3QoZGV2LCAxKTsKK30KKworLyogRG8gV0xBTiBzaXRlIHN1cnZleSAqLwordTE2X3QgemZpV2xhblNjYW4oemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgcmV0ID0gMTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCIiKTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgd2QtPmhlYXJ0QmVhdE5vdGlmaWNhdGlvbiB8PSBaTV9CU1NJRF9MSVNUX1NDQU47CisgICAgICAgIHdkLT5zdGEuc2NhbkZyZXF1ZW5jeSA9IDA7CisgICAgICAgIC8vd2QtPnN0YS5wVXBkYXRlQnNzTGlzdC0+YnNzQ291bnQgPSAwOworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoICF6ZlN0YUJsb2NrV2xhblNjYW4oZGV2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInNjYW4gcmVxdWVzdCIpOworICAgICAgICAgICAgLy96ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9TQ0FOLCBaTV9USUNLX1pFUk8pOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGdvdG8gc3RhcnRfc2NhbjsKKyAgICAgICAgfQorICAgICAgICAjZWxzZQorICAgICAgICAgICAgZ290byBzdGFydF9zY2FuOworICAgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHJldDsKKworc3RhcnRfc2NhbjoKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYod2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZ0Zyb21SZWcgJiBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBKSAgIC8vIGZsYWcgZm9yIEFscGhhCisgICAgICAgIHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcgfD0gWk1fTEVEX0NUUkxfRkxBR19BTFBIQTsKKworICAgIHJldCA9IHpmU2Nhbk1nclNjYW5TdGFydChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgem1fZGVidWdfbXNnMSgicmV0ID0gIiwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworLyogcmF0ZSAgICAgICAgICovCisvKiAgICAwIDogQVVUTyAgKi8KKy8qICAgIDEgOiBDQ0sgMU0gKi8KKy8qICAgIDIgOiBDQ0sgMk0gKi8KKy8qICAgIDMgOiBDQ0sgNS41TSAqLworLyogICAgNCA6IENDSyAxMU0gKi8KKy8qICAgIDUgOiBPRkRNIDZNICovCisvKiAgICA2IDogT0ZETSA5TSAqLworLyogICAgNyA6IE9GRE0gMTJNICovCisvKiAgICA4IDogT0ZETSAxOE0gKi8KKy8qICAgIDkgOiBPRkRNIDI0TSAqLworLyogICAgMTAgOiBPRkRNIDM2TSAqLworLyogICAgMTEgOiBPRkRNIDQ4TSAqLworLyogICAgMTIgOiBPRkRNIDU0TSAqLworLyogICAgMTMgOiBNQ1MgMCAqLworLyogICAgMjggOiBNQ1MgMTUgKi8KK3UxNl90IHpjUmF0ZVRvTUNTW10gPQorICAgIHsweGZmLCAwLCAxLCAyLCAzLCAweGIsIDB4ZiwgMHhhLCAweGUsIDB4OSwgMHhkLCAweDgsIDB4Y307Cit1MTZfdCB6Y1JhdGVUb01UW10gPSB7MCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CisKK3UxNl90IHpmaVdsYW5TZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90IHJhdGUpCit7ICAgLy8gamhsZWUgSFQgMAorICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChyYXRlIDw9MTIpCisgICAgeworICAgICAgICB3ZC0+dHhNQ1MgPSB6Y1JhdGVUb01DU1tyYXRlXTsKKyAgICAgICAgd2QtPnR4TVQgPSB6Y1JhdGVUb01UW3JhdGVdOworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHJhdGU8PTI4KXx8KHJhdGU9PTEzKzMyKSkKKyAgICB7CisgICAgICAgIHdkLT50eE1DUyA9IHJhdGUgLSAxMiAtIDE7CisgICAgICAgIHdkLT50eE1UID0gMjsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0VSUl9JTlZBTElEX1RYX1JBVEU7Cit9CisKK2NvbnN0IHUzMl90IHpjUmF0ZUlkVG9LYnBzNDBNW10gPQorICAgIHsKKyAgICAgICAgMTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsICAgICAgICAgICAgICAgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICA2MDAwLCA5MDAwLCAxMjAwMCwgMTgwMDAsICAgICAgICAgICAgICAgICAvKiA2TSAgOU0gIDEyTSAgMThNICAgICAgICAgLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDI0MDAwLCAzNjAwMCwgNDgwMDAsIDU0MDAwLCAgICAgICAgICAgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgMTM1MDAsIDI3MDAwLCA0MDUwMCwgNTQwMDAsICAgICAgICAgICAgICAgLyogTUNTMCBNQ1MxIE1DUzIgTUNTMyAgICAgICwgMTIgMTMgMTQgMTUqLworICAgICAgICA4MTAwMCwgMTA4MDAwLCAxMjE1MDAsIDEzNTAwMCwgICAgICAgICAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDI3MDAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgICAgICAgICAgICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMTYyMDAwLCAyMTYwMDAsIDI0MzAwMCwgMjcwMDAwLCAgICAgICAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAyNzAwMDAsIDMwMDAwMCwgMTUwMDAwICAgICAgICAgICAgICAgICAgICAvKiBNQ1MxNFNHLCBNQ1MxNVNHLCBNQ1M3U0cgLCAyOCAyOSAzMCovCisgICAgfTsKKworY29uc3QgdTMyX3QgemNSYXRlSWRUb0ticHMyME1bXSA9CisgICAgeworICAgICAgICAxMDAwLCAyMDAwLCA1NTAwLCAxMTAwMCwgICAgICAgICAgICAgICAgICAvKiAxTSwgMk0sIDVNLCAxMU0gICAgICAgICAgLCAgMCAgMSAgMiAgMyovCisgICAgICAgIDYwMDAsIDkwMDAsIDEyMDAwLCAxODAwMCwgICAgICAgICAgICAgICAgIC8qIDZNICA5TSAgMTJNICAxOE0gICAgICAgICAsICA0ICA1ICA2ICA3Ki8KKyAgICAgICAgMjQwMDAsIDM2MDAwLCA0ODAwMCwgNTQwMDAsICAgICAgICAgICAgICAgLyogMjRNICAzNk0gIDQ4TSAgNTRNICAgICAgICwgIDggIDkgMTAgMTEqLworICAgICAgICA2NTAwLCAxMzAwMCwgMTk1MDAsIDI2MDAwLCAgICAgICAgICAgICAgICAvKiBNQ1MwIE1DUzEgTUNTMiBNQ1MzICAgICAgLCAxMiAxMyAxNCAxNSovCisgICAgICAgIDM5MDAwLCA1MjAwMCwgNTg1MDAsIDY1MDAwLCAgICAgICAgICAgICAgIC8qIE1DUzQgTUNTNSBNQ1M2IE1DUzcgICAgICAsIDE2IDE3IDE4IDE5Ki8KKyAgICAgICAgMTMwMDAsIDI2MDAwLCAzOTAwMCwgNTIwMDAsICAgICAgICAgICAgICAgLyogTUNTOCBNQ1M5IE1DUzEwIE1DUzExICAgICwgMjAgMjEgMjIgMjMqLworICAgICAgICA3ODAwMCwgMTA0MDAwLCAxMTcwMDAsIDEzMDAwMCwgICAgICAgICAgICAvKiBNQ1MxMiBNQ1MxMyBNQ1MxNCBNQ1MxNSAgLCAyNCAyNSAyNiAyNyovCisgICAgICAgIDEzMDAwMCwgMTQ0NDAwLCA3MjIwMCAgICAgICAgICAgICAgICAgICAgIC8qIE1DUzE0U0csIE1DUzE1U0csIE1TRzdTRyAsIDI4IDI5IDMwKi8KKyAgICB9OworCit1MzJfdCB6ZmlXbGFuUXVlcnlUeFJhdGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCByYXRlSWQgPSAweGZmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogSWYgVHggcmF0ZSBoYWQgbm90IGJlZW4gdHJhaW5lZCwgcmV0dXJuIG1heGltdW0gVHggcmF0ZSBpbnN0ZWFkICovCisgICAgaWYgKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkpCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvL05vdCBpbiBmaXhlZCByYXRlIG1vZGUKKyAgICAgICAgaWYgKHdkLT50eE1DUyA9PSAweGZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5mbGFnICYgWk1fUkNfVFJBSU5FRF9CSVQpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZUlkID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVDb3VudC0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlSWQgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwub3BlcmF0aW9uUmF0ZVNldFt3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwuY3VycmVudFJhdGVJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgaWYgKHJhdGVJZCAhPSAweGZmKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gemNSYXRlSWRUb0ticHM0ME1bcmF0ZUlkXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB6Y1JhdGVJZFRvS2JwczIwTVtyYXRlSWRdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiB3ZC0+Q3VycmVudFR4UmF0ZUticHM7CisgICAgfQorfQorCit2b2lkIHpmV2xhblVwZGF0ZVJ4UmF0ZSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHUzMl90IHJ4UmF0ZUticHM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAiYWRkSW5mby0+VGFpbC5EYXRhLlJ4TWFjU3RhdHVzID0iLCBhZGRJbmZvLT5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgJiAweDAzKTsKKworICAgIC8qIGI1fmI0OiBNUERVIGluZGljYXRpb24uICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgIDAwOiBTaW5nbGUgTVBEVS4gICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgMTA6IEZpcnN0IE1QRFUgb2YgQS1NUERVLiAgICAgICAqLworICAgIC8qICAgICAgICAxMTogTWlkZGxlIE1QRFUgb2YgQS1NUERVLiAgICAgICovCisgICAgLyogICAgICAgIDAxOiBMYXN0IE1QRFUgb2YgQS1NUERVLiAgICAgICAgKi8KKyAgICAvKiBPbmx5IEZpcnN0IE1QRFUgYW5kIFNpbmdsZSBNUERVIGhhdmUgUExDUCBoZWFkZXIgKi8KKyAgICAvKiBGaXJzdCBNUERVICA6IChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCAqLworICAgIC8qIFNpbmdsZSBNUERVIDogKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwICovCisgICAgaWYgKChhZGRJbmZvLT5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgJiAweDEwKSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogTW9kdWxhdGlvbiB0eXBlICovCisgICAgICAgIHdkLT5tb2R1bGF0aW9uVHlwZSA9IGFkZEluZm8tPlRhaWwuRGF0YS5SeE1hY1N0YXR1cyAmIDB4MDM7CisgICAgICAgIHN3aXRjaCh3ZC0+bW9kdWxhdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAJCWNhc2UgMHgwOiB3ZC0+cmF0ZUZpZWxkID0gYWRkSW5mby0+UGxjcEhlYWRlclswXSAmIDB4ZmY7IC8vQ0NLIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cnhJbmZvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWNhc2UgMHgxOiB3ZC0+cmF0ZUZpZWxkID0gYWRkSW5mby0+UGxjcEhlYWRlclswXSAmIDB4MGY7IC8vTGVnYWN5LU9GRE0gbW9kZQorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yeEluZm8gPSAwOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkJY2FzZSAweDI6IHdkLT5yYXRlRmllbGQgPSBhZGRJbmZvLT5QbGNwSGVhZGVyWzNdOyAvL0hULU9GRE0gbW9kZQorICAgIAkJICAgICAgICAgIHdkLT5yeEluZm8gPSBhZGRJbmZvLT5QbGNwSGVhZGVyWzZdOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgcnhSYXRlS2JwcyA9IHpmVXBkYXRlUnhSYXRlKGRldik7CisgICAgICAgIGlmICh3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJ4UmF0ZUticHMgPiB3ZC0+Q3VycmVudFJ4UmF0ZUticHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gcnhSYXRlS2JwczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IHJ4UmF0ZUticHM7CisgICAgICAgICAgICB3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPSAxOworICAgICAgICB9CisgICAgfQorfQorI2lmIDAKK3UxNl90IHpjSW5kZXh0b1JhdGVCR1sxNl0gPSB7MTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsIDAsIDAsIDAsIDAsIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAxMjAwMCwgNjAwMCwgNTQwMDAsIDM2MDAwLCAxODAwMCwgOTAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjIwTFsxNl0gPSB7NjUwMCwgMTMwMDAsIDE5NTAwLCAyNjAwMCwgMzkwMDAsIDUyMDAwLCA1ODUwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MDAwLCAxMzAwMCwgMjYwMDAsIDM5MDAwLCA1MjAwMCwgNzgwMDAsIDEwNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNzAwMCwgMTMwMDAwfTsKK3UzMl90IHpjSW5kZXh0b1JhdGVOMjBTWzE2XSA9IHs3MjAwLCAxNDQwMCwgMjE3MDAsIDI4OTAwLCA0MzMwMCwgNTc4MDAsIDY1MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIyMDAsIDE0NDAwLCAyODkwMCwgNDMzMDAsIDU3ODAwLCA4NjcwMCwgMTE1NjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwMDAwLCAxNDQ0MDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU40MExbMTZdID0gezEzNTAwLCAyNzAwMCwgNDA1MDAsIDU0MDAwLCA4MTAwMCwgMTA4MDAwLCAxMjE1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUwMDAsIDI3MDAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgMTYyMDAwLCAyMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMwMDAsIDI3MDAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjQwU1sxNl0gPSB7MTUwMDAsIDMwMDAwLCA0NTAwMCwgNjAwMDAsIDkwMDAwLCAxMjAwMDAsIDEzNTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAwMCwgMzAwMDAsIDYwMDAwLCA5MDAwMCwgMTIwMDAwLCAxODAwMDAsIDI0MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3MDAwMCwgMzAwMDAwfTsKKyNlbmRpZgorCitleHRlcm4gdTE2X3QgemNJbmRleHRvUmF0ZUJHWzE2XTsKK2V4dGVybiB1MzJfdCB6Y0luZGV4dG9SYXRlTjIwTFsxNl07CitleHRlcm4gdTMyX3QgemNJbmRleHRvUmF0ZU4yMFNbMTZdOworZXh0ZXJuIHUzMl90IHpjSW5kZXh0b1JhdGVONDBMWzE2XTsKK2V4dGVybiB1MzJfdCB6Y0luZGV4dG9SYXRlTjQwU1sxNl07CisKK3UzMl90IHpmaVdsYW5RdWVyeVJ4UmF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPSAwOworICAgIHJldHVybiB3ZC0+Q3VycmVudFJ4UmF0ZUticHM7Cit9CisKK3UzMl90IHpmVXBkYXRlUnhSYXRlKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgbWNzLCBiYW5kd2lkdGg7CisgICAgdTMyX3QgcnhSYXRlS2JwcyA9IDEzMDAwMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT5tb2R1bGF0aW9uVHlwZSkKKyAgICB7CisJCWNhc2UgMHgwOiAvL0NDSyBtb2RlCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdkLT5yYXRlRmllbGQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBhOiByeFJhdGVLYnBzID0gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTQ6IHJ4UmF0ZUticHMgPSAyMDAwOworCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDM3OiByeFJhdGVLYnBzID0gNTUwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NmU6IHJ4UmF0ZUticHMgPSAxMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgMHgxOiAvL0xlZ2FjeS1PRkRNIG1vZGUKKyAgICAgICAgICAgICAgICAgIGlmICh3ZC0+cmF0ZUZpZWxkIDw9IDE1KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlQkdbd2QtPnJhdGVGaWVsZF07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSAweDI6IC8vSFQtT0ZETSBtb2RlCisJCSAgICAgICAgICBtY3MgPSB3ZC0+cmF0ZUZpZWxkICYgMHg3RjsKKwkJICAgICAgICAgIGJhbmR3aWR0aCA9IHdkLT5yYXRlRmllbGQgJiAweDgwOworICAgICAgICAgICAgICAgICAgaWYgKG1jcyA8PSAxNSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFuZHdpZHRoICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZigod2QtPnJ4SW5mbyAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEdJIDQwIE1IeiBNSU1PIFJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjQwU1ttY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBHSSA0MCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZU40MExbbWNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZigod2QtPnJ4SW5mbyAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEdJIDIwIE1IeiBNSU1PIFJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjIwU1ttY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBHSSAyMCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZU4yMExbbWNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAid2QtPkN1cnJlbnRSeFJhdGVLYnBzPSIsIHdkLT5DdXJyZW50UnhSYXRlS2Jwcyk7CisKKyAgICAgLy8gVG9EbzogdXNlIGJhbmR3aXRoIGZpZWxkIHRvIGRlZmluZSA0ME1CCisgICAgcmV0dXJuIHJ4UmF0ZUticHM7Cit9CisKKy8qIEdldCBXTEFOIHN0YXN0aWNzICovCit1MTZfdCB6ZmlXbGFuR2V0U3RhdGlzdGljcyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBSZXR1cm4gbGluayBzdGF0aXN0aWNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmaVdsYW5SZXNldCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEOworCisgICAgcmV0dXJuIHpmV2xhblJlc2V0KGRldik7Cit9CisKKy8qIFJlc2V0IFdMQU4gKi8KK3UxNl90IHpmV2xhblJlc2V0KHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgaXNDb25uZWN0ZWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX2RlYnVnX21zZzAoInpmV2xhblJlc2V0Iik7CisKKyAgICBpc0Nvbm5lY3RlZCA9IHpmU3RhSXNDb25uZWN0ZWQoZGV2KTsKKworICAgIC8vaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBpZiAoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkmJgorICAgICAgICAgICAgICh3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSAhPSBaTV9BVVRIX01PREVfV1BBMikgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZW5kIGRlYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3pmaVdsYW5EZWF1dGgoZGV2LCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgLy96bXdfZGVidWdfbXNnMCgic2VuZCBhIERlYXV0aCBmcmFtZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpOworICAgIHpmSHBSZXNldEtleUNhY2hlKGRldik7CisKKyAgICBpZiAoaXNDb25uZWN0ZWQpCisgICAgeworICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fUkVTRVQsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX1JFU0VULCB3ZC0+c3RhLmJzc2lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0b3AgYmVhY29uICovCisgICAgemZIcERpc2FibGVCZWFjb24oZGV2KTsKKworICAgIC8qIEZyZWUgYnVmZmVyIGluIGRlZnJhZ21lbnQgbGlzdCovCisgICAgemZBZ2luZ0RlZnJhZ0xpc3QoZGV2LCAxKTsKKworICAgIC8qIEZsdXNoIFZUeFEgYW5kIE1tUSAqLworICAgIHpmRmx1c2hWdHhxKGRldik7CisKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyogYWRkIGJ5IGhvbmRhICovCisgICAgemZBZ2dSeEZyZWVCdWYoZGV2LCAwKTsgIC8vMSBmb3IgcmVsZWFzZSBzdHJ1Y3R1cmUgbWVtb3J5CisgICAgLyogZW5kIG9mIGFkZCBieSBob25kYSAqLworICAgICNlbmRpZgorCisgICAgemZTdGFSZWZyZXNoQmxvY2tMaXN0KGRldiwgMSk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lCU1NfTU9OSVRPUik7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSKTsKKyAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fRElTQ09OTkVDVCk7CisKKyAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX05PTkU7CisgICAgd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gPSBGQUxTRTsKKyAgICB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkTGVuZ3RoID0gMDsKKyAgICB3ZC0+c3RhLmJBdXRvUmVjb25uZWN0ID0gMDsKKyAgICB3ZC0+c3RhLkludGVybmFsU2NhblJlcSA9IDA7CisgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9JTklUOworICAgIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPSAwOworICAgIHdkLT5zdGEuaWJzc0Jzc0lzQ3JlYXRvciA9IDA7CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHdkLT5zdGEuaWJzc1dwYTJQc2sgPSAwOworI2VuZGlmCisgICAgLyogcmVzZXQgY29ubmVjdCB0aW1lb3V0IGNvdW50ZXIgKi8KKyAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQgPSAwOworCisgICAgLyogcmVzZXQgbGVhcCBlbmFibGUgdmFyaWFibGUgKi8KKyAgICB3ZC0+c3RhLmxlYXBFbmFibGVkID0gMDsKKworICAgIC8qIFJlc2V0IHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RFRCApCisgICAgICAgIHpmSHBEaXNhYmxlUmlmcyhkZXYpOworICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkc7CisgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250ID0gMDsKKyAgICB3ZC0+c3RhLnJpZnNDb3VudCA9IDA7CisKKyAgICB3ZC0+c3RhLm9zUnhGaWx0ZXIgPSAwOworICAgIHdkLT5zdGEuYlNhZmVNb2RlID0gMDsKKworICAgIC8vIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlZXIgc3RhdGlvbnMgb2YgSUJTUyBvciBBUCBvZiBTdGF0aW9uIG1vZGUKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLT5zdGEub3Bwb3NpdGVJbmZvLCBzaXplb2Yoc3RydWN0IHpzT3Bwb3NpdGVJbmZvKSAqIFpNX01BWF9PUFBPU0lURV9DT1VOVCk7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZTY2FuTWdyU2NhblN0b3AoZGV2LCBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMKTsKKyAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgLyogVHVybiBvZmYgU29mdHdhcmUgV0VQL1RLSVAgKi8KKyAgICBpZiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkRpc2FibGUgc29mdHdhcmUgZW5jcnlwdGlvbiIpOworICAgICAgICB6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsKKyAgICB9CisKKyAgICAvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLworICAgIC8vemZIcFNldFRUU0lGU1RpbWUoZGV2LCAweDgpOworCisgICAgLyogS2VlcCBQc2V1ZG8gbW9kZSAqLworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfUFNFVURPICkKKyAgICB7CisgICAgICAgIHdkLT53bGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBEZWF1dGhlbnRpY2F0ZSBhIFNUQSAqLwordTE2X3QgemZpV2xhbkRlYXV0aCh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUxNl90IHJlYXNvbikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8vdTE2X3QgaWQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogd2Ugd2lsbCByZXNldCBhbGwga2V5IGluIHpmSHBSZXNldEtleUNhY2hlKCkgd2hlbiBjYWxsCisgICAgICAgICAqIHpmaVdsYW5EaXNhYmxlKCksIGlmIHdlIHdhbnQgdG8gcmVzZXQgUGFpcndpc2VLZXkgZm9yIGVhY2ggc3RhLAorICAgICAgICAgKiBuZWVkIHRvIHVzZSBhIG51bGxBZGRyIHRvIGxldCBrZXlpbmRleCBub3QgbWF0Y2guCisgICAgICAgICAqIG90aGVyd2lzZSBoYXJkd2FyZSB3aWxsIHN0aWxsIGZpbmQgUGFpcndpc2VLZXkgd2hlbiBBUCBjaGFuZ2UKKyAgICAgICAgICogZW5jcnlwdGlvbiBtb2RlIGZyb20gV1BBIHRvIFdFUAorICAgICAgICAgKi8KKworICAgICAgICAvKgorICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBtYWNBZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICB1MzJfdCBrZXlbOF07CisgICAgICAgICAgICB1MTZfdCBudWxsQWRkclszXSA9IHsgMHgwLCAweDAsIDB4MCB9OworCisgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLmVuY3J5TW9kZSAhPSBaTV9OT19XRVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldEFwUGFpcndpc2VLZXkoZGV2LCBudWxsQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX05PX1dFUCwgJmtleVswXSwgJmtleVs0XSwgaSsxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vemZIcFNldEFwUGFpcndpc2VLZXkoZGV2LCAodTE2X3QgKiltYWNBZGRyLAorICAgICAgICAgICAgLy8gICAgICAgIFpNX05PX1dFUCwgJmtleVswXSwgJmtleVs0XSwgaWQrMSk7CisgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0ua2V5SWR4ID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBtYWNBZGRyLCByZWFzb24sIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgfQorCisgICAgLyogSXNzdWUgREVBVVRIIGNvbW1hbmQgdG8gRlcgKi8KKyAgICByZXR1cm4gMDsKK30KKworCisvKiBYUCBwYWNrZXQgZmlsdGVyIGZlYXR1cmUgOiAqLworLyogMT0+ZW5hYmxlOiBBbGwgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0cywgbm90IGp1c3QgdGhlIG9uZXMgZW51bWVyYXRlZCBpbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MgbGlzdC4gKi8KKy8qIDA9PmRpc2FibGUgKi8KK3ZvaWQgemZpV2xhblNldEFsbE11bHRpY2FzdCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAic3RhLmJBbGxNdWx0aWNhc3QgPSAiLCBzZXR0aW5nKTsKKyAgICB3ZC0+c3RhLmJBbGxNdWx0aWNhc3QgPSAodThfdClzZXR0aW5nOworfQorCisKKy8qIEhUIGNvbmZpZ3VyZSBBUEkgKi8KK3ZvaWQgemZpV2xhblNldEhUQ3RybCh6ZGV2X3QqIGRldiwgdTMyX3QgKnNldHRpbmcsIHUzMl90IGZvcmNlVHhUUEMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnByZWFtYmxlVHlwZSAgICAgICAgPSAodThfdClzZXR0aW5nWzBdOworICAgIHdkLT5zdGEucHJlYW1ibGVUeXBlSFQgID0gKHU4X3Qpc2V0dGluZ1sxXTsKKyAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9ICh1OF90KXNldHRpbmdbMl07CisgICAgd2QtPnN0YS5odEN0cmxTVEJDICAgICAgPSAodThfdClzZXR0aW5nWzNdOworICAgIHdkLT5zdGEuaHRDdHJsU0cgICAgICAgID0gKHU4X3Qpc2V0dGluZ1s0XTsKKyAgICB3ZC0+c3RhLmRlZmF1bHRUQSAgICAgICA9ICh1OF90KXNldHRpbmdbNV07CisgICAgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uICAgPSAodThfdClzZXR0aW5nWzZdOworICAgIHdkLT5lbmFibGVXRFMgICAgICAgICAgID0gKHU4X3Qpc2V0dGluZ1s3XTsKKworICAgIHdkLT5mb3JjZVR4VFBDICAgICAgICAgID0gZm9yY2VUeFRQQzsKK30KKworLyogRkI1MCBpbiBPUyBYUCwgUkQgcHJpdmF0ZSB0ZXN0IGNvZGUgKi8KK3ZvaWQgemZpV2xhblF1ZXJ5SFRDdHJsKHpkZXZfdCogZGV2LCB1MzJfdCAqc2V0dGluZywgdTMyX3QgKmZvcmNlVHhUUEMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc2V0dGluZ1swXSA9IHdkLT5wcmVhbWJsZVR5cGU7CisgICAgc2V0dGluZ1sxXSA9IHdkLT5zdGEucHJlYW1ibGVUeXBlSFQ7CisgICAgc2V0dGluZ1syXSA9IHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoOworICAgIHNldHRpbmdbM10gPSB3ZC0+c3RhLmh0Q3RybFNUQkM7CisgICAgc2V0dGluZ1s0XSA9IHdkLT5zdGEuaHRDdHJsU0c7CisgICAgc2V0dGluZ1s1XSA9IHdkLT5zdGEuZGVmYXVsdFRBOworICAgIHNldHRpbmdbNl0gPSB3ZC0+ZW5hYmxlQWdncmVnYXRpb247CisgICAgc2V0dGluZ1s3XSA9IHdkLT5lbmFibGVXRFM7CisKKyAgICAqZm9yY2VUeFRQQyA9IHdkLT5mb3JjZVR4VFBDOworfQorCit2b2lkIHpmaVdsYW5EYmcoemRldl90KiBkZXYsIHU4X3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+ZW5hYmxlSEFMRGJnSW5mbyA9IHNldHRpbmc7Cit9CisKKy8qIEZCNTAgaW4gT1MgWFAsIFJEIHByaXZhdGUgdGVzdCBjb2RlICovCit2b2lkIHpmaVdsYW5TZXRSeFBhY2tldER1bXAoemRldl90KiBkZXYsIHUzMl90IHNldHRpbmcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIGlmIChzZXR0aW5nKQorICAgIHsKKyAgICAgICAgd2QtPnJ4UGFja2V0RHVtcCA9IDE7ICAgLyogZW5hYmxlICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5yeFBhY2tldER1bXAgPSAwOyAgIC8qIGRpc2FibGUgKi8KKyAgICB9Cit9CisKKworLyogRkI1MCBpbiBPUyBYUCwgUkQgcHJpdmF0ZSB0ZXN0IGNvZGUgKi8KKy8qIFRhbGx5ICovCit2b2lkIHpmaVdsYW5SZXNldFRhbGx5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisJICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0gPSAwOwkJLy90eFVuaWNhc3RGcmFtZXMKKwkgICB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0RnJtID0gMDsJCS8vdHhNdWx0aWNhc3RGcmFtZXMKKwkgICB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdE9jdGV0cyA9IDA7CS8vdHhVbmlPY3RldHMgIGJ5dGUgc2l6ZQorCSAgIHdkLT5jb21tVGFsbHkudHhNdWx0aWNhc3RPY3RldHMgPSAwOwkvL3R4TXVsdGlPY3RldHMgIGJ5dGUgc2l6ZQorCSAgIHdkLT5jb21tVGFsbHkudHhGcm1VcHBlck5ESVMgPSAwOworCSAgIHdkLT5jb21tVGFsbHkudHhGcm1EcnZNZ3QgPSAwOworCSAgIHdkLT5jb21tVGFsbHkuUmV0cnlGYWlsQ250ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1RvdGFsVHhGcm0gPSAwOwkJLy9IYXJkd2FyZSB0b3RhbCBUeCBGcmFtZQorCSAgIHdkLT5jb21tVGFsbHkuSHdfUmV0cnlDbnQgPSAwOwkJLy90eE11bHRpcGxlUmV0cmllc0ZyYW1lcworCSAgIHdkLT5jb21tVGFsbHkuSHdfVW5kZXJydW5DbnQgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5Ecml2ZXJSeEZybUNudCA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5LnJ4VW5pY2FzdEZybSA9IDA7CQkvL3J4VW5pY2FzdEZyYW1lcworCSAgIHdkLT5jb21tVGFsbHkucnhNdWx0aWNhc3RGcm0gPSAwOwkvL3J4TXVsdGljYXN0RnJhbWVzCisJICAgd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5yeFVuaWNhc3RPY3RldHMgPSAwOwkvL3J4VW5pT2N0ZXRzICBieXRlIHNpemUKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0T2N0ZXRzID0gMDsJLy9yeE11bHRpT2N0ZXRzICBieXRlIHNpemUKKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybSA9IDA7Ly8gRGlzY2FyZCBieSBWYWxpZGF0ZUZyYW1lCisJICAgd2QtPmNvbW1UYWxseS5MZXNzVGhhbkRhdGFNaW5MZW4gPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5HcmVhdGVyVGhhbk1heExlbiA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybUNhdXNlQnlNdWx0aWNhc3RMaXN0ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybUNhdXNlQnlGcm1DdHJsID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4TmVlZEZyZ0ZybSA9IDA7CQkvLyBuZWVkIG1vcmUgZnJnIGZybQorCSAgIHdkLT5jb21tVGFsbHkuRHJpdmVyUnhNZ3RGcm1DbnQgPSAwOworCSAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RGcm0gPSAwOwkvL1JlY2VpdmUgYnJvYWRjYXN0IGZyYW1lIGNvdW50CisJICAgd2QtPmNvbW1UYWxseS5yeEJyb2FkY2FzdE9jdGV0cyA9IDA7CS8vUmVjZWl2ZSBicm9hZGNhc3QgZnJhbWUgYnl0ZSBzaXplCisJICAgd2QtPmNvbW1UYWxseS5Id19Ub3RhbFJ4RnJtID0gMDsvLworCSAgIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQgPSAwOwkJLy9yeFBMQ1BDUkNFcnJDbnQKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X0NSQzMyQ250ID0gMDsJCS8vcnhDUkMzMkVyckNudAorCSAgIHdkLT5jb21tVGFsbHkuSHdfRGVjcnlwRXJyX1VOSSA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9NdWwgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5Id19SeEZJRk9PdmVycnVuID0gMDsvLworCSAgIHdkLT5jb21tVGFsbHkuSHdfUnhUaW1lT3V0ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkxvc3NBUCA9IDA7Ly8KKworCSAgIHdkLT5jb21tVGFsbHkuVHhfTVBEVSA9IDA7CisJICAgd2QtPmNvbW1UYWxseS5CQV9GYWlsID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X0FNUERVID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPSAwOworCisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFswXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFsxXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFsyXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFszXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFs0XSA9IDA7CisKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeERyb3BNUERVID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4RGVsTVBEVSA9IDA7CisKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5TWlzY0Vycm9yID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5WFJFcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeU9GRE1FcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUNDS0Vycm9yID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5SFRFcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeVRvdGFsQ291bnQgPSAwOworCisjaWYJKGRlZmluZWQoR0NDSykgJiYgZGVmaW5lZChPRkRNKSkKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4MTFiRGF0YUZyYW1lID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4T0ZETURhdGFGcmFtZSA9IDA7CisjZW5kaWYKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKy8qIEZCNTAgaW4gT1MgWFAsIFJEIHByaXZhdGUgdGVzdCBjb2RlICovCit2b2lkIHpmaVdsYW5RdWVyeVRhbGx5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNDb21tVGFsbHkgKnRhbGx5KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHpmTWVtb3J5Q29weSgodThfdCopdGFsbHksICh1OF90Kikmd2QtPmNvbW1UYWxseSwgc2l6ZW9mKHN0cnVjdCB6c0NvbW1UYWxseSkpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9Cit2b2lkIHpmaVdsYW5RdWVyeVRyYWZUYWxseSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzVHJhZlRhbGx5ICp0YWxseSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKXRhbGx5LCAodThfdCopJndkLT50cmFmVGFsbHksIHNpemVvZihzdHJ1Y3QgenNUcmFmVGFsbHkpKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5RdWVyeU1vbkhhbFJ4SW5mbyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzTW9uSGFsUnhJbmZvICptb25IYWxSeEluZm8pCit7CisgICAgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKGRldiwgKHU4X3QgKiltb25IYWxSeEluZm8pOworfQorCisvKiBwYXJzZSB0aGUgbW9kZU1ES0VuYWJsZSB0byBEcnZDb3JlICovCit2b2lkIHpmaURLRW5hYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPm1vZGVNREtFbmFibGUgPSBlbmFibGU7CisgICAgem1fZGVidWdfbXNnMSgibW9kZU1ES0VuYWJsZSA9ICIsIHdkLT5tb2RlTURLRW5hYmxlKTsKK30KKworLyogYWlyb1BlZWsgKi8KK3UzMl90IHpmaVdsYW5RdWVyeVBhY2tldFR5cGVQcm9taXNjdW91cyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN3U25pZmZlcjsKK30KKworLyogYWlyb1BlZWsgKi8KK3ZvaWQgemZpV2xhblNldFBhY2tldFR5cGVQcm9taXNjdW91cyh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0VmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisJICAgd2QtPnN3U25pZmZlciA9IHNldFZhbHVlOworCSAgIHptX21zZzFfbW0oWk1fTFZfMCwgIndkLT5zd1NuaWZmZXIgIiwgd2QtPnN3U25pZmZlcik7CisJICAgaWYgKHNldFZhbHVlKQorCSAgIHsKKwkgICAgICAgCS8qIHdyaXRlIHJlZ2lzdGVyIGZvciBzbmlmZmVyIG1vZGUgKi8KKyAgICAgICAgICAgIHpmSHBTZXRTbmlmZmVyTW9kZShkZXYsIDEpOworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiZW5hbGJlIHNuaWZmZXIgbW9kZSIpOworCSAgIH0KKwkgICBlbHNlCisJICAgeworICAgICAgICAgICAgemZIcFNldFNuaWZmZXJNb2RlKGRldiwgMCk7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJkaXNhbGJlIHNuaWZmZXIgbW9kZSIpOworCSAgIH0KK30KKwordm9pZCB6ZmlXbGFuU2V0WExpbmtNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBzZXRWYWx1ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+WExpbmtNb2RlID0gc2V0VmFsdWU7CisgICAgaWYgKHNldFZhbHVlKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUgcmVnaXN0ZXIgZm9yIHNuaWZmZXIgbW9kZSAqLworICAgICAgICB6ZkhwU2V0U25pZmZlck1vZGUoZGV2LCAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZIcFNldFNuaWZmZXJNb2RlKGRldiwgMCk7CisgICAgfQorfQorCitleHRlcm4gdm9pZCB6ZlN0YUNoYW5uZWxNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB1OF90IHNjYW4pOwordm9pZCB6ZmlTZXRDaGFubmVsTWFuYWdlbWVudCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHNldHRpbmcpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB3ZC0+c3RhLkVuYWJsZUhUID0gMTsKKyAgICAgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDE7CisgICAgICAgICAgICB3ZC0+RXh0T2Zmc2V0ICAgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHdkLT5zdGEuRW5hYmxlSFQgPSAxOworICAgICAgICAgICAgd2QtPkJhbmRXaWR0aDQwID0gMTsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgICA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgd2QtPnN0YS5FbmFibGVIVCA9IDE7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICAgICAgd2QtPkV4dE9mZnNldCAgID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgd2QtPkJhbmRXaWR0aDQwID0gMDsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgICA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCk7Cit9CisKK3ZvaWQgemZpU2V0Umlmcyh6ZGV2X3QqIGRldiwgdTE2X3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmllLkh0SW5mby5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9SSUZTTW9kZTsKKyAgICB3ZC0+c3RhLkVuYWJsZUhUID0gMTsKKyAgICBzd2l0Y2ggKHNldHRpbmcpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB3ZC0+c3RhLkhUMjA0MCA9IDA7CisvLyAgICAgICAgICAgIHpmSHBTZXRSaWZzKGRldiwgMSwgMCwgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApPyAxOjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHdkLT5zdGEuSFQyMDQwID0gMTsKKy8vICAgICAgICAgICAgemZIcFNldFJpZnMoZGV2LCAxLCAxLCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCk/IDE6MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdkLT5zdGEuSFQyMDQwID0gMDsKKy8vICAgICAgICAgICAgemZIcFNldFJpZnMoZGV2LCAxLCAwLCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCk/IDE6MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgemZpQ2hlY2tSaWZzKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmKHdkLT5zdGEuaWUuSHRJbmZvLkNoYW5uZWxJbmZvICYgRXh0SHRDYXBfUklGU01vZGUpCisgICAgeworLy8gICAgICAgIHpmSHBTZXRSaWZzKGRldiwgd2QtPnN0YS5FbmFibGVIVCwgd2QtPnN0YS5IVDIwNDAsICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKT8gMTowKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpU2V0UmVvcmRlcih6ZGV2X3QqIGRldiwgdTE2X3QgdmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnJlb3JkZXIgPSB2YWx1ZTsKK30KKwordm9pZCB6ZmlTZXRTZXFEZWJ1Zyh6ZGV2X3QqIGRldiwgdTE2X3QgdmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnNlcV9kZWJ1ZyA9IHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2Z1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2M0OWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmMKQEAgLTAsMCArMSwxMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK3U4X3QgemZRdWVyeU9wcG9zaXRlUmF0ZSh6ZGV2X3QqIGRldiwgdThfdCBkc3RfbWFjWzZdLCB1OF90IGZyYW1lVHlwZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBGb3IgQVAncyByYXRlIGFkYXB0aW9uICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBGb3IgU1RBJ3MgcmF0ZSBhZGFwdGlvbiAqLworICAgIGlmICggKGZyYW1lVHlwZSAmIDB4MGMpID09IFpNX1dMQU5fREFUQV9GUkFNRSApCisgICAgeworICAgICAgICBpZiAoIFpNX0lTX01VTFRJQ0FTVChkc3RfbWFjKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3ZC0+c3RhLm1UeFJhdGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gd2QtPnN0YS51VHhSYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHdkLT5zdGEubW1UeFJhdGU7Cit9CisKK3ZvaWQgemZDb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7aSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtpLCBzcmNbaV0pOworICAgIH0KK30KKwordm9pZCB6ZkNvcHlUb1J4QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDtpKyspCisgICAgeworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2ksIHNyY1tpXSk7CisgICAgfQorfQorCit2b2lkIHpmQ29weUZyb21JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgZHN0W2ldID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0K2kpOworICAgIH0KK30KKwordm9pZCB6ZkNvcHlGcm9tUnhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGRzdFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCtpKTsKKyAgICB9Cit9CisKKyNpZiAxCit2b2lkIHpmTWVtb3J5Q29weSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQoreworICAgIHpmd01lbW9yeUNvcHkoZHN0LCBzcmMsIGxlbmd0aCk7Cit9CisKK3ZvaWQgemZNZW1vcnlNb3ZlKHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpCit7CisgICAgemZ3TWVtb3J5TW92ZShkc3QsIHNyYywgbGVuZ3RoKTsKK30KKwordm9pZCB6Zlplcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB6ZndaZXJvTWVtb3J5KHZhLCBsZW5ndGgpOworfQorCit1OF90IHpmTWVtb3J5SXNFcXVhbCh1OF90KiBtMSwgdThfdCogbTIsIHUxNl90IGxlbmd0aCkKK3sKKyAgICByZXR1cm4gemZ3TWVtb3J5SXNFcXVhbChtMSwgbTIsIGxlbmd0aCk7Cit9CisjZW5kaWYKKwordThfdCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4X3QqIHN0ciwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpCit7CisgICAgdTE2X3QgaTsKKyAgICB1OF90IGNoOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGNoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0K2kpOworICAgICAgICBpZiAoIGNoICE9IHN0cltpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCit2b2lkIHpmVHhCdWZmZXJDb3B5KHpkZXZfdCpkZXYsIHpidWZfdCogZHN0LCB6YnVmX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgZHN0T2Zmc2V0LCB1MTZfdCBzcmNPZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgZHN0LCBkc3RPZmZzZXQraSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIHNyYywgc3JjT2Zmc2V0K2kpKTsKKyAgICB9Cit9CisKK3ZvaWQgemZSeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBkc3QsIGRzdE9mZnNldCtpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgc3JjLCBzcmNPZmZzZXQraSkpOworICAgIH0KK30KKworCit2b2lkIHpmQ29sbGVjdEhXVGFsbHkoemRldl90KmRldiwgdTMyX3QqIHJzcCwgdThfdCBpZCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19VbmRlcnJ1bkNudCArPSAoMHhGRkZGICYgcnNwWzFdKTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19Ub3RhbFJ4RnJtICs9IHJzcFsyXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19DUkMzMkNudCArPSByc3BbM107CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQgKz0gcnNwWzRdOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgICAgIC8qIFRoZXNlIGNvZGUgYXJlIGhlcmUgdG8gc2F0aXNmeSBWaXN0YSBEVE0gKi8KKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfVU5JICs9ICgocnNwWzVdPjUwKSAmJiAocnNwWzVdPDYwKSk/NTA6cnNwWzVdOworICAgICAgICAjZWxzZQorICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9VTkkgKz0gcnNwWzVdOworICAgICAgICAjZW5kaWYKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeEZJRk9PdmVycnVuICs9IHJzcFs2XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfTXVsICs9IHJzcFs3XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SZXRyeUNudCArPSByc3BbOF07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfVG90YWxUeEZybSArPSByc3BbOV07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhUaW1lT3V0ICs9cnNwWzEwXTsKKworICAgICAgICB3ZC0+Y29tbVRhbGx5LlR4X01QRFUgKz0gcnNwWzExXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5CQV9GYWlsICs9IHJzcFsxMl07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUgKz0gcnNwWzEzXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19UeF9NUERVICs9IHJzcFsxNF07CisgICAgICAgIHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxUeE1QRFUgKz0gcnNwWzExXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5SYXRlQ3RybEJBRmFpbCArPSByc3BbMTJdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSArPSByc3BbMV07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhEcm9wTVBEVSArPSByc3BbMl07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhEZWxNUERVICs9IHJzcFszXTsKKworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5TWlzY0Vycm9yICs9IHJzcFs0XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeVhSRXJyb3IgKz0gcnNwWzVdOworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5T0ZETUVycm9yICs9IHJzcFs2XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUNDS0Vycm9yICs9IHJzcFs3XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUhURXJyb3IgKz0gcnNwWzhdOworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5VG90YWxDb3VudCArPSByc3BbOV07CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAicnNwbGVuID0iLCByc3BbMF0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19VbmRlcnJ1bkNudCAgICA9ICIsICgweEZGRkYgJiByc3BbMV0pKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfVG90YWxSeEZybSAgICAgPSAiLCByc3BbMl0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19DUkMzMkNudCAgICAgICA9ICIsIHJzcFszXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0NSQzE2Q250ICAgICAgID0gIiwgcnNwWzRdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfRGVjcnlwRXJyX1VOSSAgPSAiLCByc3BbNV0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeEZJRk9PdmVycnVuICA9ICIsIHJzcFs2XSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0RlY3J5cEVycl9NdWwgID0gIiwgcnNwWzddKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUmV0cnlDbnQgICAgICAgPSAiLCByc3BbOF0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19Ub3RhbFR4RnJtICAgICA9ICIsIHJzcFs5XSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4VGltZU91dCAgICAgID0gIiwgcnNwWzEwXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIlR4X01QRFUgICAgICAgICAgID0gIiwgcnNwWzExXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkJBX0ZhaWwgICAgICAgICAgID0gIiwgcnNwWzEyXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1R4X0FNUERVICAgICAgID0gIiwgcnNwWzEzXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1R4X01QRFUgICAgICAgID0gIiwgcnNwWzE0XSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgInJzcGxlbiAgICAgICAgICAgICA9ICIsIHJzcFswXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4TVBEVSAgICAgICAgICA9ICIsICgweEZGRkYgJiByc3BbMV0pKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEcm9wTVBEVSAgICAgID0gIiwgcnNwWzJdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEZWxNUERVICAgICAgID0gIiwgcnNwWzNdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlNaXNjRXJyb3IgID0gIiwgcnNwWzRdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlYUkVycm9yICAgID0gIiwgcnNwWzVdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlPRkRNRXJyb3IgID0gIiwgcnNwWzZdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlDQ0tFcnJvciAgID0gIiwgcnNwWzddKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlIVEVycm9yICAgID0gIiwgcnNwWzhdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlUb3RhbENvdW50ID0gIiwgcnNwWzldKTsKKyAgICB9CisKK30KKworLyogVGltZXIgcmVsYXRlZCBmdW5jdGlvbnMgKi8KK3ZvaWQgemZUaW1lckluaXQoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCIiKTsKKworICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50ID0gWk1fTUFYX1RJTUVSX0NPVU5UOworICAgIHdkLT50aW1lckxpc3QuaGVhZCA9ICYod2QtPnRpbWVyTGlzdC5saXN0WzBdKTsKKyAgICB3ZC0+dGltZXJMaXN0LnRhaWwgPSAmKHdkLT50aW1lckxpc3QubGlzdFtaTV9NQVhfVElNRVJfQ09VTlQtMV0pOworICAgIHdkLT50aW1lckxpc3QuaGVhZC0+cHJlID0gTlVMTDsKKyAgICB3ZC0+dGltZXJMaXN0LmhlYWQtPm5leHQgPSAmKHdkLT50aW1lckxpc3QubGlzdFsxXSk7CisgICAgd2QtPnRpbWVyTGlzdC50YWlsLT5wcmUgPSAmKHdkLT50aW1lckxpc3QubGlzdFtaTV9NQVhfVElNRVJfQ09VTlQtMl0pOworICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IE5VTEw7CisKKyAgICBmb3IoIGk9MTsgaTwoWk1fTUFYX1RJTUVSX0NPVU5ULTEpOyBpKysgKQorICAgIHsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5saXN0W2ldLnByZSA9ICYod2QtPnRpbWVyTGlzdC5saXN0W2ktMV0pOworICAgICAgICB3ZC0+dGltZXJMaXN0Lmxpc3RbaV0ubmV4dCA9ICYod2QtPnRpbWVyTGlzdC5saXN0W2krMV0pOworICAgIH0KKworICAgIHdkLT5iVGltZXJSZWFkeSA9IFRSVUU7Cit9CisKKwordTE2X3QgemZUaW1lclNjaGVkdWxlKHpkZXZfdCogZGV2LCB1MTZfdCBldmVudCwgdTMyX3QgdGljaykKK3sKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwRnJlZUVudHJ5OworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnBFbnRyeTsKKyAgICB1OF90ICAgaSwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT50aW1lckxpc3QuZnJlZUNvdW50ID09IDAgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgibm8gbW9yZSB0aW1lciIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzIoImV2ZW50ID0gIiwgZXZlbnQpOworICAgIC8vem1fZGVidWdfbXNnMSgidGFyZ2V0IHRpY2sgPSAiLCB3ZC0+dGljayArIHRpY2spOworCisgICAgY291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQgLSB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudDsKKworICAgIGlmICggY291bnQgPT0gMCApCisgICAgeworICAgICAgICB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudC0tOworICAgICAgICB3ZC0+dGltZXJMaXN0LmhlYWQtPmV2ZW50ID0gZXZlbnQ7CisgICAgICAgIHdkLT50aW1lckxpc3QuaGVhZC0+dGltZXIgPSB3ZC0+dGljayArIHRpY2s7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiZnJlZSB0aW1lciBjb3VudCA9ICIsIHdkLT50aW1lckxpc3QuZnJlZUNvdW50KTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwRnJlZUVudHJ5ID0gd2QtPnRpbWVyTGlzdC50YWlsOworICAgIHBGcmVlRW50cnktPnRpbWVyID0gd2QtPnRpY2sgKyB0aWNrOworICAgIHBGcmVlRW50cnktPmV2ZW50ID0gZXZlbnQ7CisgICAgd2QtPnRpbWVyTGlzdC50YWlsID0gcEZyZWVFbnRyeS0+cHJlOworICAgIHBFbnRyeSA9IHdkLT50aW1lckxpc3QuaGVhZDsKKworICAgIGZvciggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gcHJldmVudCBmcm9tIHRoZSBjYXNlIG9mIHRpY2sgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCAoIHBFbnRyeS0+dGltZXIgPiBwRnJlZUVudHJ5LT50aW1lciApJiYKKyAgICAgICAgICAgICAoKHBFbnRyeS0+dGltZXIgLSBwRnJlZUVudHJ5LT50aW1lcikgPCAxMDAwMDAwMDAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRnJlZUVudHJ5LT5wcmUgPSBwRW50cnktPnByZTsKKyAgICAgICAgICAgICAgICBwRnJlZUVudHJ5LT5wcmUtPm5leHQgPSBwRnJlZUVudHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBGcmVlRW50cnktPnByZSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBFbnRyeS0+cHJlID0gcEZyZWVFbnRyeTsKKyAgICAgICAgICAgIHBGcmVlRW50cnktPm5leHQgPSBwRW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoIGkgPT0gMCApCisgICAgeworICAgICAgICB3ZC0+dGltZXJMaXN0LmhlYWQgPSBwRnJlZUVudHJ5OworICAgIH0KKworICAgIGlmICggaSA9PSBjb3VudCApCisgICAgeworICAgICAgICBwRnJlZUVudHJ5LT5wcmUgPSBwRW50cnktPnByZTsKKyAgICAgICAgcEZyZWVFbnRyeS0+cHJlLT5uZXh0ID0gcEZyZWVFbnRyeTsKKyAgICAgICAgcEVudHJ5LT5wcmUgPSBwRnJlZUVudHJ5OworICAgICAgICBwRnJlZUVudHJ5LT5uZXh0ID0gcEVudHJ5OworICAgIH0KKworICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50LS07CisgICAgLy96bV9kZWJ1Z19tc2cxKCJmcmVlIHRpbWVyIGNvdW50ID0gIiwgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmVGltZXJDYW5jZWwoemRldl90KiBkZXYsIHUxNl90IGV2ZW50KQoreworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnBFbnRyeTsKKyAgICB1OF90ICAgaSwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptX2RlYnVnX21zZzIoImV2ZW50ID0gIiwgZXZlbnQpOworICAgIC8vem1fZGVidWdfbXNnMSgiZnJlZSB0aW1lciBjb3VudChiKSA9ICIsIHdkLT50aW1lckxpc3QuZnJlZUNvdW50KTsKKworICAgIHBFbnRyeSA9IHdkLT50aW1lckxpc3QuaGVhZDsKKyAgICBjb3VudCA9IFpNX01BWF9USU1FUl9DT1VOVCAtIHdkLT50aW1lckxpc3QuZnJlZUNvdW50OworCisgICAgZm9yKCBpPTA7IGk8Y291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHBFbnRyeS0+ZXZlbnQgPT0gZXZlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBFbnRyeSA9PSB3ZC0+dGltZXJMaXN0LmhlYWQgKQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBoZWFkIGVudHJ5ICovCisgICAgICAgICAgICAgICAgd2QtPnRpbWVyTGlzdC5oZWFkID0gcEVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IHBFbnRyeTsKKyAgICAgICAgICAgICAgICBwRW50cnktPnByZSA9IHdkLT50aW1lckxpc3QudGFpbDsKKyAgICAgICAgICAgICAgICB3ZC0+dGltZXJMaXN0LnRhaWwgPSBwRW50cnk7CisgICAgICAgICAgICAgICAgcEVudHJ5ID0gd2QtPnRpbWVyTGlzdC5oZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBub24taGVhZCBlbnRyeSAqLworICAgICAgICAgICAgICAgIHBFbnRyeS0+cHJlLT5uZXh0ID0gcEVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIHBFbnRyeS0+bmV4dC0+cHJlID0gcEVudHJ5LT5wcmU7CisgICAgICAgICAgICAgICAgd2QtPnRpbWVyTGlzdC50YWlsLT5uZXh0ID0gcEVudHJ5OworICAgICAgICAgICAgICAgIHBFbnRyeS0+cHJlID0gd2QtPnRpbWVyTGlzdC50YWlsOworICAgICAgICAgICAgICAgIHdkLT50aW1lckxpc3QudGFpbCA9IHBFbnRyeTsKKyAgICAgICAgICAgICAgICBwRW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzEoImZyZWUgdGltZXIgY291bnQoYSkgPSAiLCB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZlRpbWVyQ2xlYXIoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQ7Cit9CisKK3UxNl90IHpmVGltZXJDaGVja0FuZEhhbmRsZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwRW50cnk7CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSAqcFRoZUxhc3RFbnRyeSA9IE5VTEw7CisgICAgdTE2X3QgIGV2ZW50W1pNX01BWF9USU1FUl9DT1VOVF07CisgICAgdThfdCAgIGksIGo9MCwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCAhd2QtPmJUaW1lclJlYWR5ICkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBwRW50cnkgPSB3ZC0+dGltZXJMaXN0LmhlYWQ7CisgICAgY291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQgLSB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudDsKKworICAgIGZvciggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gcHJldmVudCBmcm9tIHRoZSBjYXNlIG9mIHRpY2sgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCAoIHBFbnRyeS0+dGltZXIgPiB3ZC0+dGljayApJiYKKyAgICAgICAgICAgICAoKHBFbnRyeS0+dGltZXIgLSB3ZC0+dGljaykgPCAxMDAwMDAwMDAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnRbaisrXSA9IHBFbnRyeS0+ZXZlbnQ7CisgICAgICAgIHBUaGVMYXN0RW50cnkgPSBwRW50cnk7CisgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoIGogPiAwICkKKyAgICB7CisgICAgICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IHdkLT50aW1lckxpc3QuaGVhZDsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5oZWFkLT5wcmUgPSB3ZC0+dGltZXJMaXN0LnRhaWw7CisgICAgICAgIHdkLT50aW1lckxpc3QuaGVhZCA9IHBFbnRyeTsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC50YWlsID0gcFRoZUxhc3RFbnRyeTsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQgKz0gajsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJmcmVlIHRpbWVyIGNvdW50ID0gIiwgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQpOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlByb2Nlc3NFdmVudChkZXYsIGV2ZW50LCBqKTsKKworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZkNvcmVTZXRLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCB0eXBlLAorICAgICAgICB1MTZfdCogbWFjLCB1MzJfdCoga2V5KQoreworICAgIHUzMl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZysrOworICAgIHptX2RlYnVnX21zZzEoIiAgIHpmQ29yZVNldEtleSsrKysgIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXQgPSB6ZkhwU2V0S2V5KGRldiwgdXNlciwga2V5SWQsIHR5cGUsIG1hYywga2V5KTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHpmQ29yZVNldEtleUNvbXBsZXRlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisjaWYgMAorICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nID0gMDsKKyNlbHNlCisgICAgaWYod2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZy0tOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyNlbmRpZgorICAgIHptX2RlYnVnX21zZzEoIiAgemZDb3JlU2V0S2V5Q29tcGxldGUtLS0gIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworCisgICAgemZQdXNoVnR4cShkZXYpOworfQorCit2b2lkIHpmQ29yZUhhbEluaXRDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmhhbFN0YXRlID0gWk1fSEFMX1NUQVRFX1JVTk5JTkc7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmUHVzaFZ0eHEoZGV2KTsKK30KKwordm9pZCB6ZkNvcmVNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5tYWNBZGRyWzBdID0gYWRkclswXSB8ICgodTE2X3QpYWRkclsxXTw8OCk7CisgICAgd2QtPm1hY0FkZHJbMV0gPSBhZGRyWzJdIHwgKCh1MTZfdClhZGRyWzNdPDw4KTsKKyAgICB3ZC0+bWFjQWRkclsyXSA9IGFkZHJbNF0gfCAoKHUxNl90KWFkZHJbNV08PDgpOworCisKKyAgICAvL3pmSHBTZXRNYWNBZGRyZXNzKGRldiwgd2QtPm1hY0FkZHIsIDApOworICAgIGlmICh3ZC0+emZjYk1hY0FkZHJlc3NOb3RpZnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT56ZmNiTWFjQWRkcmVzc05vdGlmeShkZXYsIGFkZHIpOworICAgIH0KK30KKwordm9pZCB6ZkNvcmVTZXRJc29OYW1lKHpkZXZfdCogZGV2LCB1OF90KiBpc29OYW1lKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IGlzb05hbWVbMF07CisgICAgd2QtPndzLmNvdW50cnlJc29OYW1lWzFdID0gaXNvTmFtZVsxXTsKKyAgICB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworIH0KKworCitleHRlcm4gdm9pZCB6ZlNjYW5NZ3JTY2FuRXZlbnRTdGFydCh6ZGV2X3QqIGRldik7CitleHRlcm4gdThfdCB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZlByb2Nlc3NFdmVudCh6ZGV2X3QqIGRldiwgdTE2X3QqIGV2ZW50QXJyYXksIHU4X3QgZXZlbnRDb3VudCkKK3sKKyAgICB1OF90IGksIGosIGJ5cGFzcyA9IEZBTFNFOworICAgIHUxNl90IGV2ZW50QnlwYXNzWzMyXTsKKyAgICB1OF90IGV2ZW50QnlwYXNzQ291bnQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHpmWmVyb01lbW9yeSgodThfdCopIGV2ZW50QnlwYXNzLCA2NCk7CisKKyAgICBmb3IoIGk9MDsgaTxldmVudENvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqPTA7IGo8ZXZlbnRCeXBhc3NDb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBldmVudEJ5cGFzc1tqXSA9PSBldmVudEFycmF5W2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXBhc3MgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBieXBhc3MgKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCggZXZlbnRBcnJheVtpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfU0NBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5FdmVudFN0YXJ0KGRldik7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50QnlwYXNzW2V2ZW50QnlwYXNzQ291bnQrK10gPSBaTV9FVkVOVF9JTl9TQ0FOOworICAgICAgICAgICAgICAgICAgICBldmVudEJ5cGFzc1tldmVudEJ5cGFzc0NvdW50KytdID0gWk1fRVZFTlRfVElNRU9VVF9TQ0FOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9FVkVOVF9USU1FT1VUX1NDQU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OF90IHJlczsKKworICAgICAgICAgICAgICAgICAgICByZXMgPSB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KGRldik7CisgICAgICAgICAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudEJ5cGFzc1tldmVudEJ5cGFzc0NvdW50KytdID0gWk1fRVZFTlRfVElNRU9VVF9TQ0FOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByZXMgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QnlwYXNzW2V2ZW50QnlwYXNzQ291bnQrK10gPSBaTV9FVkVOVF9JTl9TQ0FOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX0lCU1NfTU9OSVRPUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhSWJzc01vbml0b3JpbmcoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfSU5fU0NBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX0NNX1RJTUVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiWk1fRVZFTlRfQ01fVElNRVIiKTsKKworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfQ01fRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QiKTsKKworICAgICAgICAgICAgICAgICAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKKworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICAvL3pmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBaTV9USUNLX0NNX0JMT0NLX1RJTUVPVVQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIFJlc29sdXRpb24gb24gV2luWFAgaXMgMTUvMTYgbXMgICovCisgICAgICAgICAgICAgICAgICAgIC8qIERlY3JlYXNlIFRpbWUgb2Zmc2V0IGZvciA8WFA+IENvdW50ZXIgTWVhc3VyZSAqLworICAgICAgICAgICAgICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9DTV9CTE9DS19USU1FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVElDS19DTV9CTE9DS19USU1FT1VUIC0gWk1fVElDS19DTV9CTE9DS19USU1FT1VUX09GRlNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jbU1pY0ZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vemZpV2xhbkRpc2FibGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgemZIcFJlc2V0S2V5Q2FjaGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9NSUNfRkFJTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfQ01fQkxPQ0tfVElNRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJaTV9FVkVOVF9DTV9CTE9DS19USU1FUiIpOworCisgICAgICAgICAgICAgICAgICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jbURpc2FsbG93U3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5iQXV0b1JlY29ubmVjdCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSOmJBdXRvUmVjb25uZWN0IT0wIik7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgemZTY2FuTWdyU2NhblN0YXJ0KGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9FVkVOVF9USU1FT1VUX0FEREJBOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3ZC0+YWRkYmFDb21wbGV0ZSAmJiAod2QtPmFkZGJhQ291bnQgPCA1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KGRldiwgd2QtPnN0YS5ic3NpZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9BRERCQSwgMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX0FEREJBKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX1RJTUVPVVRfUEVSRk9STUFOQ0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZmlQZXJmb3JtYW5jZVJlZnJlc2goZGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfU0tJUF9DT1VOVEVSTUVBU1VSRToKKwkJCQkvL2VuYWJsZSB0aGUgQ291bnRlcm1lYXN1cmUKKwkJCQl7CisJCQkJCXptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogRW5hYmxlIE1JQyBDaGVjayAiKTsKKwkJCQkJd2QtPlRLSVBfR3JvdXBfS2V5Q2hhbmdpbmcgPSAweDA7CisJCQkJfQorCQkJCWJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmQnNzSW5mb0NyZWF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1OF90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID0gMDsKKyAgICB3ZC0+c3RhLmJzc0xpc3QuaGVhZCA9IE5VTEw7CisgICAgd2QtPnN0YS5ic3NMaXN0LnRhaWwgPSBOVUxMOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5SGVhZCA9IDA7CisgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlUYWlsID0gMDsKKyAgICB3ZC0+c3RhLmJzc0luZm9GcmVlQ291bnQgPSBaTV9NQVhfQlNTOworCisgICAgZm9yKCBpPTA7IGk8IFpNX01BWF9CU1M7IGkrKyApCisgICAgeworICAgICAgICAvL3dkLT5zdGEuYnNzSW5mb0FycmF5W2ldID0gJih3ZC0+c3RhLmJzc0luZm9Qb29sW2ldKTsKKyAgICAgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlbaV0gPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmQnNzSW5mb0Rlc3Ryb3koemRldl90KiBkZXYpCit7CisgICAgdThfdCAgIGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZCc3NJbmZvUmVmcmVzaChkZXYsIDEpOworCisgICAgZm9yKCBpPTA7IGk8IFpNX01BWF9CU1M7IGkrKyApCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5ic3NJbmZvQXJyYXlbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3TWVtRnJlZShkZXYsIHdkLT5zdGEuYnNzSW5mb0FycmF5W2ldLCBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RydWN0IHpzQnNzSW5mbyogemZCc3NJbmZvQWxsb2NhdGUoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50ID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcEJzc0luZm8gPSB3ZC0+c3RhLmJzc0luZm9BcnJheVt3ZC0+c3RhLmJzc0luZm9BcnJheUhlYWRdOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5W3dkLT5zdGEuYnNzSW5mb0FycmF5SGVhZF0gPSBOVUxMOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5SGVhZCA9ICh3ZC0+c3RhLmJzc0luZm9BcnJheUhlYWQgKyAxKSAmIChaTV9NQVhfQlNTIC0gMSk7CisgICAgd2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50LS07CisKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXBCc3NJbmZvLCBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworCisgICAgcmV0dXJuIHBCc3NJbmZvOworfQorCit2b2lkIHpmQnNzSW5mb0ZyZWUoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2Fzc2VydCh3ZC0+c3RhLmJzc0luZm9BcnJheVt3ZC0+c3RhLmJzc0luZm9BcnJheVRhaWxdID09IE5VTEwpOworCisgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID0gcEJzc0luZm8tPnNpZ25hbFF1YWxpdHkgPSAwOworICAgIHBCc3NJbmZvLT5zb3J0VmFsdWUgPSAwOworCisgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlbd2QtPnN0YS5ic3NJbmZvQXJyYXlUYWlsXSA9IHBCc3NJbmZvOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5VGFpbCA9ICh3ZC0+c3RhLmJzc0luZm9BcnJheVRhaWwgKyAxKSAmIChaTV9NQVhfQlNTIC0gMSk7CisgICAgd2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50Kys7Cit9CisKK3ZvaWQgemZCc3NJbmZvUmVvcmRlckxpc3QoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8gPSBOVUxMOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBJbnNCc3NJbmZvID0gTlVMTDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTmV4dEJzc0luZm8gPSBOVUxMOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBQcmVCc3NJbmZvID0gTlVMTDsKKyAgICB1OF90IGkgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAod2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID4gMSkKKyAgICB7CisgICAgICAgIHBJbnNCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEluc0Jzc0luZm87CisgICAgICAgIHBCc3NJbmZvID0gcEluc0Jzc0luZm8tPm5leHQ7CisgICAgICAgIHBJbnNCc3NJbmZvLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKDEpCisgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID49IHBJbnNCc3NJbmZvLT5zaWduYWxTdHJlbmd0aCkKKyAgICAgICAgICAgICAgICBpZiggcEJzc0luZm8tPnNvcnRWYWx1ZSA+PSBwSW5zQnNzSW5mby0+c29ydFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSW5zZXJ0IEJzc0luZm8gdG8gaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NMaXN0LmhlYWQgPSBwQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0QnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPm5leHQgPSBwSW5zQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnNlcnQgQnNzSW5mbyB0byBuZWl0aGVyIGhlYWQgbm9yIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVCc3NJbmZvLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5uZXh0ID0gcEluc0Jzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEluc0Jzc0luZm8tPm5leHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9TaWduYWwgc3RyZW5ndGggc21hbGxlciB0aGFuIGN1cnJlbnQgQnNzSW5mbywgY2hlY2sgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgcFByZUJzc0luZm8gPSBwSW5zQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnNCc3NJbmZvID0gcEluc0Jzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0luc2VydCBCc3NJbmZvIHRvIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnNCc3NJbmZvLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBOZXh0QnNzSW5mbzsKKyAgICAgICAgICAgIHBJbnNCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgICAgIH0KKyAgICB9IC8vaWYgKHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCA+IDEpCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmQnNzSW5mb0luc2VydFRvTGlzdCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8pCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fYXNzZXJ0KHBCc3NJbmZvKTsKKworICAgIC8vem1fZGVidWdfbXNnMigicEJzc0luZm8gPSAiLCBwQnNzSW5mbyk7CisKKyAgICBpZiAoIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCA9PSAwICkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC5oZWFkID0gcEJzc0luZm87CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgfQorCisgICAgcEJzc0luZm8tPm5leHQgPSBOVUxMOworICAgIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCsrOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworfQorCit2b2lkIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbykKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTm93QnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwUHJlQnNzSW5mbyA9IE5VTEw7CisgICAgdThfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9hc3NlcnQocEJzc0luZm8pOworICAgIHptX2Fzc2VydCh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJwQnNzSW5mbyA9ICIsIHBCc3NJbmZvKTsKKworICAgIHBOb3dCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHBOb3dCc3NJbmZvID09IHBCc3NJbmZvICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBoZWFkICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NMaXN0LmhlYWQgPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJlQnNzSW5mby0+bmV4dCA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGkgPT0gKHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCAtIDEpICkKKyAgICAgICAgICAgIHsgICAvKiByZW1vdmUgdGFpbCAqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcFByZUJzc0luZm87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcFByZUJzc0luZm8gPSBwTm93QnNzSW5mbzsKKyAgICAgICAgcE5vd0Jzc0luZm8gPSBwTm93QnNzSW5mby0+bmV4dDsKKyAgICB9CisKKyAgICB6bV9hc3NlcnQoaSAhPSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworICAgIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudC0tOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworfQorCit2b2lkIHpmQnNzSW5mb1JlZnJlc2goemRldl90KiBkZXYsIHUxNl90IG1vZGUpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogICBwQnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiAgIHBOZXh0QnNzSW5mbzsKKyAgICB1OF90ICAgaSwgYnNzQ291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBwQnNzSW5mbyA9IHdkLT5zdGEuYnNzTGlzdC5oZWFkOworICAgIGJzc0NvdW50ID0gd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50OworCisgICAgZm9yKCBpPTA7IGk8YnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAobW9kZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIHBCc3NJbmZvID0gcE5leHRCc3NJbmZvOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+ZmxhZyAmIFpNX0JTU19JTkZPX1ZBTElEX0JJVCApCisgICAgICAgICAgICB7ICAgLyogdGhpcyBvbmUgbXVzdCBiZSBrZXB0ICovCisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZsYWcgJj0gflpNX0JTU19JTkZPX1ZBTElEX0JJVDsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNkZWZpbmUgWk1fQlNTX0NBQ0hFX1RJTUVfSU5fTVMgICAyMDAwMAorICAgICAgICAgICAgICAgIGlmICgod2QtPnRpY2sgLSBwQnNzSW5mby0+dGljaykgPiAoWk1fQlNTX0NBQ0hFX1RJTUVfSU5fTVMvWk1fTVNfUEVSX1RJQ0spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5leHRCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBOZXh0QnNzSW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vZm9yKCBpPTA7IGk8YnNzQ291bnQ7IGkrKyApCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmRHVtcFNTSUQodThfdCBsZW5ndGgsIHU4X3QgKnZhbHVlKQoreworICAgIHU4X3QgYnVmWzUwXTsKKyAgICB1OF90IHRtcExlbmd0aCA9IGxlbmd0aDsKKworICAgIGlmICggdG1wTGVuZ3RoID4gNDkgKQorICAgIHsKKyAgICAgICAgdG1wTGVuZ3RoID0gNDk7CisgICAgfQorCisgICAgemZNZW1vcnlDb3B5KGJ1ZiwgdmFsdWUsIHRtcExlbmd0aCk7CisgICAgYnVmW3RtcExlbmd0aF0gPSAnXDAnOworICAgIC8vcHJpbnRrKCJTU0lEOiAlc1xuIiwgYnVmKTsKKyAgICAvL3ptX2RlYnVnX21zZ19zKCJzc2lkID0gIiwgdmFsdWUpOworfQorCit2b2lkIHpmQ29yZVJlaW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyA9IDA7CisgICAgd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMDsKK30KKwordm9pZCB6ZkdlbmVyYXRlUmFuZG9tQlNTSUQoemRldl90KiBkZXYsIHU4X3QgKk1BQ0FkZHIsIHU4X3QgKkJTU0lEKQoreworICAgIC8vVUxPTkdMT05HICAgdGltZTsKKyAgICB1MzJfdCB0aW1lOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdGltZSA9IHdkLT50aWNrOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIHRoZSByYW5kb20gQlNTSUQgdG8gYmUgdGhlIHNhbWUgYXMgTUFDIGFkZHJlc3MuCisgICAgLy8KKworICAgIC8vIFJ0bENvcHlNZW1vcnkoQlNTSUQsIE1BQ0FkZHIsIHNpemVvZihET1QxMV9NQUNfQUREUkVTUykpOworICAgIHpmTWVtb3J5Q29weShCU1NJRCwgTUFDQWRkciwgNik7CisKKyAgICAvLworICAgIC8vIEdldCB0aGUgc3lzdGVtIHRpbWUgaW4gMTAgbWlsbGlzZWNvbmQuCisgICAgLy8KKworICAgIC8vIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgoUExBUkdFX0lOVEVHRVIpJnRpbWUpOworICAgIC8vIHRpbWUgLz0gMTAwMDAwOworCisgICAgLy8KKyAgICAvLyBSYW5kb21pemUgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgQlNTSUQuCisgICAgLy8KKworICAgIEJTU0lEWzBdIF49ICh1OF90KSh0aW1lICYgMHhmZik7CisgICAgQlNTSURbMF0gJj0gfjB4MDE7ICAgICAgICAgICAgICAvLyBUdXJuIG9mZiBtdWx0aWNhc3QgYml0CisgICAgQlNTSURbMF0gfD0gMHgwMjsgICAgICAgICAgICAgICAvLyBUdXJuIG9uIGxvY2FsIGJpdAorCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFsxXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFsyXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFszXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworfQorCit1OF90IHpmaVdsYW5HZXREZXN0QWRkckZyb21CdWYoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCAqbWFjQWRkcikKK3sKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIG1hY0FkZHJbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgICAgIG1hY0FkZHJbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIG1hY0FkZHJbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgbWFjQWRkclsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDYpOworICAgICAgICBtYWNBZGRyWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBEQSAqLworICAgICAgICBtYWNBZGRyWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICAgICAgbWFjQWRkclsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZWxzZQorICAgIC8qIERBICovCisgICAgbWFjQWRkclswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBtYWNBZGRyWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLworCit1MTZfdCB6ZkZpbmRDbGVhbkZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRob2NNb2RlKQoreworICAgIHU4X3QgICBpLCBqOworICAgIHUxNl90ICByZXR1cm5DaGFubmVsOworICAgIHUxNl90ICBjb3VudF8yNEcgPSAwLCBtaW4yNEdJbmRleCA9IDA7CisgICAgdTE2X3QgIGNvdW50XzVHID0gMCwgIG1pbjVHSW5kZXggPSAwOworICAgIHUxNl90ICBDb21iaW5hdGlvbkJzc051bWJlckluMjRHWzE1XSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEJzc051bWJlckluMjRHWzE3XSAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKyAgICB1MTZfdCAgQXJyYXlfMjRHWzE1XSAgICAgICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEJzc051bWJlckluNUdbMzFdICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEFycmF5XzVHWzMxXSAgICAgICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQpID09IE5VTEwpCisgICAgeworICAgICAgICBpZiggYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRyB8fAorICAgICAgICAgICAgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CRyB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybkNoYW5uZWwgPSB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbChkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuQ2hhbm5lbCA9IHpmQ2hHZXRGaXJzdDVHaHpDaGFubmVsKGRldik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuQ2hhbm5lbDsKKyAgICB9CisKKyAgICAvKiAjMSBHZXQgQWxsb3dlZCBDaGFubmVsIGZvbGxvd2luZyBDb3VudHJ5IENvZGUgISAqLworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgMzAwMCkKKyAgICAgICAgeyAvLyAyLjRHSHoKKyAgICAgICAgICAgIEFycmF5XzI0R1tjb3VudF8yNEddID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgICAgIGNvdW50XzI0RysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyA1R0h6CisgICAgICAgICAgICBjb3VudF81RysrOworICAgICAgICAgICAgQXJyYXlfNUdbaV0gPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsOworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB3aGlsZSggcEJzc0luZm8gIT0gTlVMTCApCisgICAgeworICAgICAgICAvKiAjMl8xIENvdW50IEJTUyBudW1iZXIgaW4gc29tZSBzcGVjaWZpY2VkIGZyZXF1ZW5jeSBpbiAyLjRHSHogYmFuZCAhICovCisgICAgICAgIGlmKCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0IgfHwgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9HIHx8CisgICAgICAgICAgICBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0JHIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpPTA7IGk8PShjb3VudF8yNEcrMyk7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gQXJyYXlfMjRHW2ldICkKKyAgICAgICAgICAgICAgICB7IC8vIEFycmF5XzI0R1swXSBjb3JyZXNwb25kIHRvIEJzc051bWJlckluMjRHWzJdCisgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluMjRHW3BCc3NJbmZvLT5jaGFubmVsKzFdKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogIzJfMiBDb3VudCBCU1MgbnVtYmVyIGluIHNvbWUgc3BlY2lmaWNlZCBmcmVxdWVuY3kgaW4gNUdIeiBiYW5kICEgKi8KKyAgICAgICAgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaT0wOyBpPGNvdW50XzVHOyBpKysgKQorICAgICAgICAgICAgeyAvLyA1R0h6IGNoYW5uZWwgaXMgbm90IGVxdWFsIHRvIGFycmF5IGluZGV4CisgICAgICAgICAgICAgICAgaWYoIHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gQXJyYXlfNUdbaV0gKQorICAgICAgICAgICAgICAgIHsgLy8gQXJyYXlfNUdbMF0gY29ycmVzcG9uZCB0byBCc3NOdW1iZXJJbjVHWzBdCisgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluNUdbaV0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgIH0KKworI2lmIDAKKyAgICBmb3IoaT0wOyBpPD0oY291bnRfMjRHKzMpOyBpKyspCisgICAgeworICAgICAgICBwcmludGsoIjIuNEdIeiBCZWZvcmUgY29tYmluLCAlZCBCU1MgbmV0d29yayA6ICVkIiwgaSwgQnNzTnVtYmVySW4yNEdbaV0pOworICAgIH0KKworICAgIGZvcihpPTA7IGk8Y291bnRfNUc7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50aygiNUdIeiBCZWZvcmUgY29tYmluLCAlZCBCU1MgbmV0d29yayA6ICVkIiwgaSwgQnNzTnVtYmVySW41R1tpXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRyB8fAorICAgICAgICBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0JHIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICB7CisgICAgICAgIC8qICMzXzEgQ291bnQgQlNTIG51bWJlciB0aGF0IGluZmx1ZW5jZSB0aGUgc3BlY2lmaWNlZCBmcmVxdWVuY3kgaW4gMi40R0h6ICEgKi8KKyAgICAgICAgZm9yKCBqPTA7IGo8Y291bnRfMjRHOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDb21iaW5hdGlvbkJzc051bWJlckluMjRHW2pdID0gQnNzTnVtYmVySW4yNEdbal0gICArIEJzc051bWJlckluMjRHW2orMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluMjRHW2orMl0gKyBCc3NOdW1iZXJJbjI0R1tqKzNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NOdW1iZXJJbjI0R1tqKzRdOworICAgICAgICAgICAgLy9wcmludGsoIkFmdGVyIGNvbWJpbmUsIHRoZSBudW1iZXIgb2YgQlNTIG5ldHdvcmsgY2hhbm5lbCAlZCBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiAsIENvbWJpbmF0aW9uQnNzTnVtYmVySW4yNEdbal0pOworICAgICAgICB9CisKKyAgICAgICAgLyogIzRfMSBGaW5kIHRoZSBsZXNzIHV0aWxpemVkIGZyZXF1ZW5jeSBpbiAyLjRHSHogYmFuZCAhICovCisgICAgICAgIG1pbjI0R0luZGV4ID0gemZGaW5kTWluaW11bVV0aWxpemF0aW9uQ2hhbm5lbEluZGV4KGRldiwgQ29tYmluYXRpb25Cc3NOdW1iZXJJbjI0RywgY291bnRfMjRHKTsKKyAgICB9CisKKyAgICAvKiAjNF8yIEZpbmQgdGhlIGxlc3MgdXRpbGl6ZWQgZnJlcXVlbmN5IGluIDVHSHogYmFuZCAhICovCisgICAgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgeworICAgICAgICBtaW41R0luZGV4ID0gemZGaW5kTWluaW11bVV0aWxpemF0aW9uQ2hhbm5lbEluZGV4KGRldiwgQnNzTnVtYmVySW41RywgY291bnRfNUcpOworICAgIH0KKworICAgIGlmKCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0IgfHwgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9HIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQkcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5XzI0R1ttaW4yNEdJbmRleF07CisgICAgfQorICAgIGVsc2UgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSApCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlfNUdbbWluNUdJbmRleF07CisgICAgfQorICAgIGVsc2UgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICB7CisgICAgICAgIGlmICggQ29tYmluYXRpb25Cc3NOdW1iZXJJbjI0R1ttaW4yNEdJbmRleF0gPD0gQnNzTnVtYmVySW41R1ttaW41R0luZGV4XSApCisgICAgICAgICAgICByZXR1cm4gQXJyYXlfMjRHW21pbjI0R0luZGV4XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFycmF5XzVHW21pbjVHSW5kZXhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAyNDEyOworfQorCit1MTZfdCB6ZkZpbmRNaW5pbXVtVXRpbGl6YXRpb25DaGFubmVsSW5kZXgoemRldl90KiBkZXYsIHUxNl90KiBhcnJheSwgdTE2X3QgY291bnQpCit7CisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgIHRlbXBNaW5JbmRleCwgdGVtcE1pblZhbHVlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaSA9IDE7CisgICAgdGVtcE1pbkluZGV4ID0gMDsKKyAgICB0ZW1wTWluVmFsdWUgPSBhcnJheVt0ZW1wTWluSW5kZXhdOworICAgIHdoaWxlKCBpPCBjb3VudCApCisgICAgeworICAgICAgICBpZiggYXJyYXlbaV0gPCB0ZW1wTWluVmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wTWluVmFsdWUgPSBhcnJheVtpXTsKKyAgICAgICAgICAgIHRlbXBNaW5JbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiB0ZW1wTWluSW5kZXg7Cit9CisKK3U4X3QgemZDb21wYXJlV2l0aEJzc2lkKHpkZXZfdCogZGV2LCB1MTZfdCogYnNzaWQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB6Zk1lbW9yeUlzRXF1YWwoKHU4X3QqKWJzc2lkLCAodThfdCopd2QtPnN0YS5ic3NpZCwgNikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jZnVuYy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NTQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jZnVuYy5oCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBmdW5jX2V4dHIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9uIHByb3RvdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NGVU5DX0gKKyNkZWZpbmUgX0NGVU5DX0gKKworI2luY2x1ZGUgInF1ZXVlLmgiCisKKy8qIGFtc2R1LmMgKi8KK3ZvaWQgemZEZUFtc2R1KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5TW9kZSk7CisKKy8qIGNzY2FubWdyLmMgKi8KK3ZvaWQgemZTY2FuTWdySW5pdCh6ZGV2X3QqIGRldik7Cit1OF90IHpmU2Nhbk1nclNjYW5TdGFydCh6ZGV2X3QqIGRldiwgdThfdCBzY2FuVHlwZSk7Cit2b2lkIHpmU2Nhbk1nclNjYW5TdG9wKHpkZXZfdCogZGV2LCB1OF90IHNjYW5UeXBlKTsKK3ZvaWQgemZTY2FuTWdyU2NhbkFjayh6ZGV2X3QqIGRldik7CisKKy8qIGNwc21nci5jICovCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JJbml0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nclNldE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7Cit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JNYWluKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01ncldha2V1cCh6ZGV2X3QqIGRldik7Cit1OF90IHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKHpkZXZfdCAqZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nclByb2Nlc3NCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nckNvbm5lY3ROb3RpZnkoemRldl90ICpkZXYpOwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJlVEJUVEludGVycnVwdCh6ZGV2X3QgKmRldik7CisKKy8qIGNjbWQuYyAqLwordTE2X3QgemZXbGFuRW5hYmxlKHpkZXZfdCogZGV2KTsKKworLyogY2Z1bmMuYyAqLwordThfdCB6ZlF1ZXJ5T3Bwb3NpdGVSYXRlKHpkZXZfdCogZGV2LCB1OF90IGRzdF9tYWNbNl0sIHU4X3QgZnJhbWVUeXBlKTsKK3ZvaWQgemZDb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmQ29weVRvUnhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpOwordm9pZCB6ZkNvcHlGcm9tSW50VHhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmQ29weUZyb21SeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpOwordm9pZCB6Zk1lbW9yeU1vdmUodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmWmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKTsKK3U4X3QgemZNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKTsKK3U4X3QgemZSeEJ1ZmZlckVxdWFsVG9TdHIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBjb25zdCB1OF90KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZUeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZSeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKTsKKwordm9pZCB6ZkNvbGxlY3RIV1RhbGx5KHpkZXZfdCpkZXYsIHUzMl90KiByc3AsIHU4X3QgaWQpOwordm9pZCB6ZlRpbWVySW5pdCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZlRpbWVyU2NoZWR1bGUoemRldl90KiBkZXYsIHUxNl90IGV2ZW50LCB1MzJfdCB0aWNrKTsKK3UxNl90IHpmVGltZXJDYW5jZWwoemRldl90KiBkZXYsIHUxNl90IGV2ZW50KTsKK3ZvaWQgemZUaW1lckNsZWFyKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmVGltZXJDaGVja0FuZEhhbmRsZSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmUHJvY2Vzc0V2ZW50KHpkZXZfdCogZGV2LCB1MTZfdCogZXZlbnRBcnJheSwgdThfdCBldmVudENvdW50KTsKKwordm9pZCB6ZkJzc0luZm9DcmVhdGUoemRldl90KiBkZXYpOwordm9pZCB6ZkJzc0luZm9EZXN0cm95KHpkZXZfdCogZGV2KTsKKworc3RydWN0IHpzQnNzSW5mbyogemZCc3NJbmZvQWxsb2NhdGUoemRldl90KiBkZXYpOwordm9pZCB6ZkJzc0luZm9GcmVlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1Jlb3JkZXJMaXN0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZCc3NJbmZvSW5zZXJ0VG9MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1JlZnJlc2goemRldl90KiBkZXYsIHUxNl90IG1vZGUpOwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5KTsKK3ZvaWQgemZDb3JlU2V0RnJlcXVlbmN5VjIoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwKKyAgICAgICAgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IpOwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYik7Cit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeUV4VjIoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IsIHU4X3QgZm9yY2VTZXRGcmVxKTsKK3ZvaWQgemZSZVNldEN1cnJlbnRGcmVxdWVuY3koemRldl90KiBkZXYpOwordTMyX3QgemZDb3JlU2V0S2V5KHpkZXZfdCogZGV2LCB1OF90IHVzZXIsIHU4X3Qga2V5SWQsIHU4X3QgdHlwZSwKKyAgICAgICAgdTE2X3QqIG1hYywgdTMyX3QqIGtleSk7Cit2b2lkIHpmQ29yZVNldEtleUNvbXBsZXRlKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZDb3JlUmVpbml0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZDb3JlTWFjQWRkcmVzc05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCAqYWRkcik7Cit2b2lkIHpmQ29yZVNldElzb05hbWUoemRldl90KiBkZXYsIHU4X3QqIGlzb05hbWUpOwordm9pZCB6ZkdlbmVyYXRlUmFuZG9tQlNTSUQoemRldl90KiBkZXYsIHU4X3QgKk1BQ0FkZHIsIHU4X3QgKkJTU0lEKTsKK3ZvaWQgemZDb3JlSGFsSW5pdENvbXBsZXRlKHpkZXZfdCogZGV2KTsKKwordTE2X3QgemZGaW5kQ2xlYW5GcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGFkaG9jTW9kZSk7Cit1MTZfdCB6ZkZpbmRNaW5pbXVtVXRpbGl6YXRpb25DaGFubmVsSW5kZXgoemRldl90KiBkZXYsIHUxNl90KiBhcnJheSwgdTE2X3QgY291bnQpOwordThfdCB6ZkNvbXBhcmVXaXRoQnNzaWQoemRldl90KiBkZXYsIHUxNl90KiBic3NpZCk7CisKKy8qIGNoYi5jICovCit2b2lkIHpmRHVtcEJzc0xpc3QoemRldl90KiBkZXYpOworCisKK3UxNl90IHpmSXNzdWVDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbiwgdTE2X3Qgc3JjLCB1OF90KiBidWYpOworCisKKy8qIGNpYy5jICovCit2b2lkIHpmVXBkYXRlQnNzaWQoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkKTsKK3ZvaWQgemZSZXNldFN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOwordm9pZCB6ZlVwZGF0ZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXkpOwordThfdCB6ZklzR09ubHlNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCAgZnJlcXVlbmN5LCB1OF90KiByYXRlQXJyYXkpOwordm9pZCB6ZkdhdGhlckJNb2RlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXksIHU4X3QqIGV4dHJhdGVBcnJheSk7Cit1OF90IHpmUFNEZXZpY2VTbGVlcCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkdldFJhbmRvbU51bWJlcih6ZGV2X3QqIGRldiwgdTE2X3QgaW5pdFZhbHVlKTsKK3ZvaWQgemZDb3JlRXZlbnQoemRldl90KiBkZXYsIHUxNl90IGV2ZW50LCB1OF90KiByc3ApOwordm9pZCB6ZkJlYWNvbkNmZ0ludGVycnVwdCh6ZGV2X3QqIGRldiwgdThfdCogcnNwKTsKK3ZvaWQgemZFbmRPZkF0aW1XaW5kb3dJbnRlcnJ1cHQoemRldl90KiBkZXYpOworCisvKiBjaW5pdC5jICovCit1MTZfdCB6ZlR4R2VuV2xhbkhlYWRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBoZWFkZXIsIHUxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgZmxhZywgdTE2X3QgcGx1c0xlbiwgdTE2X3QgbWludXNMZW4sIHUxNl90IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCogZGEsIHUxNl90KiBzYSwgdThfdCB1cCwgdTE2X3QgKm1pY0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBzbmFwLCB1MTZfdCBzbmFwTGVuLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCk7Cit1MTZfdCB6ZlR4R2VuTW1IZWFkZXIoemRldl90KiBkZXYsIHU4X3QgZnJhbWVUeXBlLCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCk7Cit2b2lkIHpmSW5pdE1hY0FwTW9kZSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0TmV4dENoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCogcGJQYXNzaXZlKTsKK3UxNl90IHpmQ2hHZXRGaXJzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSk7Cit1MTZfdCB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0Rmlyc3Q1R2h6Q2hhbm5lbCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0TGFzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSk7Cit1MTZfdCB6ZkNoR2V0TGFzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmQ2hOdW1Ub0ZyZXEoemRldl90KiBkZXYsIHU4X3QgY2gsIHU4X3QgZnJlcUJhbmQpOwordThfdCB6ZkNoRnJlcVRvTnVtKHUxNl90IGZyZXEsIHU4X3QqIGJJczVHQmFuZCk7CisKKy8qIGNtbS5jICovCit2b2lkIHpmUHJvY2Vzc01hbmFnZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOyAvL0NXWWFuZyhtKQordm9pZCB6ZlNlbmRNbUZyYW1lKHpkZXZfdCogZGV2LCB1OF90IGZyYW1lVHlwZSwgdTE2X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICB1MzJfdCBwMSwgdTMyX3QgcDIsIHUzMl90IHAzKTsKK3UxNl90IHpmRmluZEVsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IGVpZCk7Cit1MTZfdCB6ZkZpbmRXaWZpRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSwgdThfdCBzdWJ0eXBlKTsKK3UxNl90IHpmRmluZFN1cGVyR0VsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUpOwordTE2X3QgemZGaW5kWFJFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlKTsKK3UxNl90IHpmUmVtb3ZlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90IGVpZCk7Cit1MTZfdCB6ZlVwZGF0ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCogdXBkYXRlZWlkKTsKK3ZvaWQgemZQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKTsKK3ZvaWQgemZQcm9jZXNzUHJvYmVSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOwordTE2X3QgemZTZW5kUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgYldpdGhTU0lEKTsKK3UxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdThfdCBlaWQsIHU4X3QgcmF0ZVNldCk7Cit1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1MTZfdCB6Zk1tQWRkSWVFcnAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOwordm9pZCB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7Cit1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpOwordTE2X3QgemZNbUFkZEhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7IC8vQ1dZYW5nKCspCit1MTZfdCB6Zk1tQWRkUHJlTkhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1MTZfdCB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOyAvL0NXWWFuZygrKQordTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpOwordTE2X3QgemZGaW5kQnJkY21NcnZsUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgemZGaW5kTWFydmVsRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZkZpbmRCcm9hZGNvbUV4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgemZGaW5kUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisvKiBjbW1hcC5jICovCit2b2lkIHpmTW1BcFRpbWVUaWNrKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcEFnaW5nU3RhKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmQXBBZGRTdGEoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0ZSwgdTE2X3QgYXBJZCwgdThfdCB0eXBlLAorICAgICAgICAgICAgICAgICB1OF90IHFvc1R5cGUsIHU4X3QgcW9zSW5mbyk7Cit2b2lkIHpmQXBQcm90Y3Rpb25Nb25pdG9yKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcFByb2Nlc3NCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZBcFByb2Nlc3NBdXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCk7Cit2b2lkIHpmQXBQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpOwordm9pZCB6ZkFwUHJvY2Vzc0Fzb2NSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZBcFByb2Nlc3NEZWF1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKTsKK3ZvaWQgemZBcFByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCk7Cit2b2lkIHpmQXBQcm9jZXNzUHJvYmVSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOwordm9pZCB6ZkFwU3RvcmVBc29jUmVxSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQpOwordTE2X3QgemZBcEFkZEllU3NpZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFwKTsKK3ZvaWQgemZBcFNlbmRCZWFjb24oemRldl90KiBkZXYpOwordTE2X3QgemZBcEdldFNUQUluZm8oemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCogc3RhdGUsIHU4X3QqIHZhcCk7Cit1MTZfdCB6ZkludHJhYnNzRm9yd2FyZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3Qgc3JjVmFwKTsKK3UxNl90IHpmQXBCdWZmZXJQc0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7Cit2b2lkIHpmQXBJbml0U3RhVGJsKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcEdldFN0YVR4UmF0ZUFuZFFvc1R5cGUoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCogcGh5Q3RybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCogcW9zVHlwZSwgdTE2X3QqIHJjUHJvYmluZ0ZsYWcpOwordm9pZCB6ZkFwR2V0U3RhUW9zVHlwZSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHU4X3QqIHFvc1R5cGUpOwordm9pZCB6ZkFwU2V0U3RhVHhSYXRlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTMyX3QgcGh5Q3RybCk7CitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworc3RydWN0IHpzTWljVmFyKiB6ZkFwR2V0VHhNaWNLZXkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBxb3NUeXBlKTsKK3UxNl90IHpmQXBBZGRJZVdtZVBhcmEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhcCk7Cit1MTZfdCB6ZkFwVXBkYXRlUHNCaXQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiB2YXAsIHU4X3QqIHVhcHNkVHJpZyk7Cit2b2lkIHpmQXBQcm9jZXNzUHNQb2xsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZkFwRmluZFN0YSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIpOwordm9pZCB6ZkFwR2V0U3RhRW5jcnlUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdThfdCogZW5jcnlUeXBlKTsKK3ZvaWQgemZBcEdldFN0YVdwYUl2KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIGl2MTYsIHUzMl90KiBpdjMyKTsKK3ZvaWQgemZBcFNldFN0YVdwYUl2KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QgaXYxNiwgdTMyX3QgaXYzMik7Cit2b2lkIHpmQXBDbGVhclN0YUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit2b2lkIHpmQXBHZXRTdGFDZW5jSXZBbmRLZXlJZHgoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYsCisgICAgICAgIHU4X3QgKmtleUlkeCk7Cit2b2lkIHpmQXBTZXRTdGFDZW5jSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK3ZvaWQgemZBcFNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBtb2RlKTsKK3ZvaWQgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcFNlbmRGYWlsdXJlKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKK3U4X3QgemZBcFJlbW92ZUZyb21Qc1F1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBpZCwgdTE2X3QqIHNyYyk7Cit2b2lkIHpmQXBQcm9jZXNzQWN0aW9uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisvKiBjbW1zdGEuYyAqLwordm9pZCB6Zk1tU3RhVGltZVRpY2soemRldl90KiBkZXYpOwordm9pZCB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoemRldl90KiBkZXYpOyAgLy8gTXh6ZW5nCit2b2lkIHpmU3RhUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbyk7IC8vQ1dZYW5nKG0pCit2b2lkIHpmU3RhUHJvY2Vzc0F1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKTsKK3ZvaWQgemZTdGFQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpOwordm9pZCB6ZlN0YVByb2Nlc3NBc29jUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhUHJvY2Vzc0RlYXV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YVByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKTsKK3ZvaWQgemZTdGFQcm9jZXNzQXRpbSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YVN0b3JlQXNvY1JzcEllKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhQ2hhbm5lbE1hbmFnZW1lbnQoemRldl90KiBkZXYsIHU4X3Qgc2Nhbik7Cit2b2lkIHpmSWJzc0Nvbm5lY3ROZXR3b3JrKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZJbmZyYUNvbm5lY3ROZXR3b3JrKHpkZXZfdCogZGV2KTsKK3U4X3QgemZDaGVja0F1dGhlbnRpY2F0aW9uKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit1OF90IHpmQ2hhbmdlQWRhcHRlclN0YXRlKHpkZXZfdCogZGV2LCB1OF90IG5ld1N0YXRlKTsKK3UxNl90IHpmU3RhQWRkSWVTc2lkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3UxNl90IHpmU3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKTsKK3UxNl90IHpmU3RhQWRkSWVJYnNzKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3ZvaWQgemZTdGFTdGFydENvbm5lY3QoemRldl90KiBkZXYsIHU4X3QgYklzU2hhcmVkS2V5KTsKK3U4X3QgemZTdGFJc0Nvbm5lY3RlZCh6ZGV2X3QqIGRldik7Cit1OF90IHpmU3RhSXNDb25uZWN0aW5nKHpkZXZfdCogZGV2KTsKK3U4X3QgemZTdGFJc0Rpc2Nvbm5lY3QoemRldl90KiBkZXYpOwordm9pZCB6ZlN0YVNlbmRCZWFjb24oemRldl90KiBkZXYpOwordm9pZCB6ZlNlbmROdWxsRGF0YSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKTsKK3ZvaWQgemZTZW5kUFNQb2xsKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZTZW5kQkEoemRldl90KiBkZXYsIHUxNl90IHN0YXJ0X3NlcSwgdThfdCAqYml0bWFwKTsKK3ZvaWQgemRSYXRlSW5mb0NvdW50VHgoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyKTsKK3N0cnVjdCB6c01pY1ZhciogemZTdGFHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworc3RydWN0IHpzTWljVmFyKiB6ZlN0YUdldFR4TWljS2V5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZlN0YVJ4VmFsaWRhdGVGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YU1pY0ZhaWx1cmVIYW5kbGluZyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordThfdCB6ZlN0YUJsb2NrV2xhblNjYW4oemRldl90KiBkZXYpOwordm9pZCB6ZlN0YUlic3NQU0NoZWNrU3RhdGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3U4X3QgemZTdGFJYnNzUFNRdWV1ZURhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZTdGFJYnNzUFNTZW5kKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZTdGFSZXNldFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiSW5pdCk7Cit1MTZfdCB6ZlN0YUFkZEllV21lSW5mbyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBxb3NJbmZvKTsKK3ZvaWQgemZJbml0UGFydG5lck5vdGlmeUV2ZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCk7Cit2b2lkIHpmU3RhSW5pdE9wcG9zaXRlSW5mbyh6ZGV2X3QqIGRldik7Cit2b2lkIHpmU3RhSWJzc01vbml0b3JpbmcoemRldl90KiBkZXYsIHU4X3QgcmVzZXQpOworc3RydWN0IHpzQnNzSW5mbyogemZTdGFGaW5kQnNzSW5mbyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyICpwUHJvYmVSc3BIZWFkZXIpOwordThfdCB6ZlN0YUluaXRCc3NJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIgKnBQcm9iZVJzcEhlYWRlciwKKyAgICAgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8sIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbywgdThfdCB0eXBlKTsKK3M4X3QgemZTdGFGaW5kRnJlZU9wcG9zaXRlKHpkZXZfdCogZGV2LCB1MTZfdCAqc2EsIGludCAqcEZvdW5kSWR4KTsKK3M4X3QgemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoemRldl90KiBkZXYsIHUxNl90ICpzYSwgdThfdCAqcEZvdW5kSWR4KTsKK3ZvaWQgemZTdGFSZWZyZXNoQmxvY2tMaXN0KHpkZXZfdCogZGV2LCB1MTZfdCBmbHVzaEZsYWcpOwordm9pZCB6ZlN0YUNvbm5lY3RGYWlsKHpkZXZfdCogZGV2LCB1MTZfdCByZWFzb24sIHUxNl90KiBic3NpZCwgdThfdCB3ZWlnaHQpOwordm9pZCB6ZlN0YUdldFR4UmF0ZSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUzMl90KiBwaHlDdHJsLAorICAgICAgICB1MTZfdCogcmNQcm9iaW5nRmxhZyk7Cit1MTZfdCB6ZlN0YVByb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3N0cnVjdCB6c1RraXBTZWVkKiB6ZlN0YUdldFJ4U2VlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBDRU5DICovCit1MTZfdCB6ZlN0YUFkZEllQ2VuYyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQwordm9pZCB6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldiwgdThfdCB2YWx1ZSk7Cit2b2lkIHpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldik7Cit1MTZfdCB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoemRldl90ICpkZXYsIHU4X3QgaXNCTW9kZSwgdThfdCBpc0hULCB1OF90IGlzSFQ0MCwgdThfdCBzaWduYWxTdHJlbmd0aCk7Cit1MTZfdCB6ZlN0YUFkZElic3NBZGRpdGlvbmFsSUUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOworCisvKiBjdGtpcC5jICovCit2b2lkIHpmVGtpcEluaXQodThfdCoga2V5LCB1OF90KiB0YSwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkLCB1OF90KiBpbml0SXYpOwordm9pZCB6Zk1pY1NldEtleSh1OF90KiBrZXksIHN0cnVjdCB6c01pY1ZhciogcE1pYyk7Cit2b2lkIHpmTWljQXBwZW5kQnl0ZSh1OF90IGIsIHN0cnVjdCB6c01pY1ZhciogcE1pYyk7Cit2b2lkIHpmTWljQ2xlYXIoc3RydWN0IHpzTWljVmFyKiBwTWljKTsKK3ZvaWQgemZNaWNBcHBlbmRUeEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRhLCB1OF90KiBzYSwKKyAgICAgICAgICAgICAgICAgICAgICB1MTZfdCByZW1vdmVMZW4sIHU4X3QqIG1pYyk7Cit1OF90IHpmTWljUnhWZXJpZnkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZNaWNHZXRNaWModThfdCogZHN0LCBzdHJ1Y3QgenNNaWNWYXIqIHBNaWMpOwordm9pZCB6ZkNhbFR4TWljKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCAqZGEsIHUxNl90ICpzYSwgdThfdCB1cCwgdThfdCAqbWljKTsKK3ZvaWQgemZUS0lQRW5jcnlwdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90IG9mZnNldCwgdThfdCBrZXlMZW4sIHU4X3QqIGtleSwgdTMyX3QqIGljdik7Cit1MTZfdCB6ZlRLSVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5KTsKK3ZvaWQgemZUa2lwR2V0c2VlZHModTE2X3QgaXYxNiwgdThfdCAqUkM0S2V5LCBzdHJ1Y3QgenNUa2lwU2VlZCAqU2VlZCk7Cit1OF90IHpmVGtpcFBoYXNlMUtleU1peCh1MzJfdCBpdjMyLCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpOwordThfdCB6ZlRraXBQaGFzZTJLZXlNaXgodTE2X3QgaXYxNiwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkKTsKK3ZvaWQgemZXRVBFbmNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCogV2VwS2V5LCB1OF90ICppdik7Cit1MTZfdCB6ZldFUERlY3J5cHQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3Qga2V5TGVuLCB1OF90KiBXZXBLZXksIHU4X3QgKml2KTsKKworLyogY3R4cnguYyAqLwordTE2X3QgemZTZW5kODAyMTFGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZklzclBjaVR4Q29tcCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmVHhQY2lEbWFTdGFydCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZlR4UG9ydENvbnRyb2woemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KTsKK3UxNl90IHpmVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwKKyAgICAgICAgICAgICAgICAgIHUxNl90IGJ1ZlR5cGUsIHUxNl90IGZsYWcpOwordTE2X3QgemZUeEdlbldsYW5UYWlsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIG1pYyk7Cit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pOwordm9pZCB6ZlR4R2V0SXBUb3NBbmRGcmFnKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogdXAsIHUxNl90KiBmcmFnT2ZmKTsKK3UxNl90IHpmUHV0VnR4cSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlB1c2hWdHhxKHpkZXZfdCogZGV2KTsKK3U4X3QgemZJc1Z0eHFFbXB0eSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkdldFNlcUN0cmwoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOwordThfdCB6ZkdldEZyYWdObyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlNob3dSeEVBUE9MKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3ZvaWQgemZTaG93VHhFQVBPTCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOwordTE2X3QgemZQdXRWbW1xKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmRmx1c2hWdHhxKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBZ2luZ0RlZnJhZ0xpc3QoemRldl90KiBkZXYsIHUxNl90IGZsdXNoRmxhZyk7CisKK3ZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpOwordm9pZCB6ZjgwMjExRnJhbWVTZW5kKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCBoZWFkZXJMZW4sIHUxNl90KiBzbmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHUxNl90IG9mZnNldCwgdTE2X3QgYnVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYWMsIHU4X3Qga2V5SWR4KTsKK3ZvaWQgemZDaGVja0lzUklGU0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZnJhbWVTdWJUeXBlKTsKKworLyogcXVldWUuYyAqLworc3RydWN0IHpzUXVldWUqIHpmUXVldWVDcmVhdGUoemRldl90KiBkZXYsIHUxNl90IHNpemUpOwordm9pZCB6ZlF1ZXVlRGVzdHJveSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpOwordTE2X3QgemZRdWV1ZVB1dE5jcyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHpidWZfdCogYnVmLCB1MzJfdCB0aWNrKTsKK3UxNl90IHpmUXVldWVQdXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB6YnVmX3QqIGJ1ZiwgdTMyX3QgdGljayk7Cit6YnVmX3QqIHpmUXVldWVHZXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxKTsKK3pidWZfdCogemZRdWV1ZUdldFdpdGhNYWMoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1OF90KiBhZGRyLCB1OF90KiBtYik7Cit2b2lkIHpmUXVldWVGbHVzaCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpOwordm9pZCB6ZlF1ZXVlQWdlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwgdTMyX3QgdGljaywgdTMyX3QgbXNBZ2UpOwordm9pZCB6ZlF1ZXVlR2VuZXJhdGVVYXBzZFRpbSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsCisgICAgICAgIHU4X3QqIHVuaUJpdE1hcCwgdTE2X3QqIGhpZ2hlc3RCeXRlKTsKKworLyogaHBtYWluLmMgKi8KK3UxNl90IHpmSHBJbml0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpOwordTE2X3QgemZIcFJlbGVhc2UoemRldl90KiBkZXYpOwordm9pZCB6ZkhwU2V0RnJlcXVlbmN5RXgoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgdThfdCBpbml0UkYpOwordTE2X3QgemZIcFN0YXJ0UmVjdih6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkhwU3RvcFJlY3YoemRldl90KiBkZXYpOwordTE2X3QgemZIcFJlc2V0S2V5Q2FjaGUoemRldl90KiBkZXYpOwordTE2X3QgemZIcFNldEFwU3RhTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK3UxNl90IHpmSHBTZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpOwordTE2X3QgemZIcFNldFNuaWZmZXJNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBvbik7Cit1OF90IHpmSHBVcGRhdGVRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHUxNl90KiBjd21pblRibCwgdTE2X3QqIGN3bWF4VGJsLAorICAgICAgICB1MTZfdCogYWlmc1RibCwgdTE2X3QqIHR4b3BUYmwpOwordm9pZCB6ZkhwU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbik7Cit2b2lkIHpmSHBFbmFibGVCZWFjb24oemRldl90KiBkZXYsIHUxNl90IG1vZGUsIHUxNl90IGJjbkludGVydmFsLCB1MTZfdCBkdGltLCB1OF90IGVuYWJsZUF0aW0pOwordm9pZCB6ZkhwRGlzYWJsZUJlYWNvbih6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBTZXRCYXNpY1JhdGVTZXQoemRldl90KiBkZXYsIHUxNl90IGJSYXRlQmFzaWMsIHUxNl90IGdSYXRlQmFzaWMpOwordm9pZCB6ZkhwU2V0UlRTQ1RTUmF0ZSh6ZGV2X3QqIGRldiwgdTMyX3QgcmF0ZSk7Cit2b2lkIHpmSHBTZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgbWFjQWRkcklkKTsKK3UzMl90IHpmSHBHZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2KTsKK3UzMl90IHpmSHBHZXRUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZIcFNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QsIHU4X3QgYkFsbE11bHRpY2FzdCk7CisKK3UxNl90IHpmSHBSZW1vdmVLZXkoemRldl90KiBkZXYsIHUxNl90IHVzZXIpOwordTMyX3QgemZIcFNldEtleSh6ZGV2X3QqIGRldiwgdThfdCB1c2VyLCB1OF90IGtleUlkLCB1OF90IHR5cGUsCisgICAgICAgIHUxNl90KiBtYWMsIHUzMl90KiBrZXkpOworLy91MzJfdCB6ZkhwU2V0U3RhUGFpcndpc2VLZXkoemRldl90KiBkZXYsIHUxNl90KiBhcE1hY0FkZHIsIHU4X3QgdHlwZSwKKy8vICAgICAgICB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5KTsKKy8vdTMyX3QgemZIcFNldFN0YUdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisvLyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSk7Cit1MzJfdCB6ZkhwU2V0QXBQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIHN0YU1hY0FkZHIsIHU4X3QgdHlwZSwKKyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSwgdTE2X3Qgc3RhQWlkKTsKK3UzMl90IHpmSHBTZXRBcEdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisgICAgICAgIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXksIHUxNl90IHZhcElkKTsKK3UzMl90IHpmSHBTZXREZWZhdWx0S2V5KHpkZXZfdCogZGV2LCB1OF90IGtleUlkLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpOwordTMyX3QgemZIcFNldFBlclVzZXJLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCogbWFjLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpOworCit2b2lkIHpmSHBTZW5kQmVhY29uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKTsKK3UxNl90IHpmSHBHZXRQYXlsb2FkTGVuKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBwbGNwSGRyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4TVQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhNQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhCVywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeFNHCisgICAgICAgICAgICAgICAgICAgICAgICApOwordTMyX3QgemZIcEdldEZyZWVUeGRDb3VudCh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkhwR2V0TWF4VHhkQ291bnQoemRldl90KiBkZXYpOwordTE2X3QgemZIcFNlbmQoemRldl90KiBkZXYsIHUxNl90KiBoZWFkZXIsIHUxNl90IGhlYWRlckxlbiwKKyAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90KiB0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBidWZUeXBlLCB1OF90IGFjLCB1OF90IGtleUlkeCk7Cit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZSh6ZGV2X3QqIGRldiwgdTE2X3QgcmVnaW9uQ29kZSk7Cit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tQ291bnRyeSh6ZGV2X3QqIGRldiwgdTE2X3QgQ291bnRyeUNvZGUpOwordThfdCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUlTTyh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUluZm8sIHU4X3QgbGVuZ3RoKTsKK2NvbnN0IGNoYXIqIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpOwordTE2X3QgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUpOwordThfdCB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbih6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBMZWRDdHJsKHpkZXZfdCogZGV2LCB1MTZfdCBsZWRJZCwgdThfdCBtb2RlKTsKK3UxNl90IHpmSHBSZXNldFR4UngoemRldl90KiBkZXYpOwordTE2X3QgemZIcERlbGV0ZUFsbG93Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit1MTZfdCB6ZkhwQWRkQWxsb3dDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKK3UzMl90IHpmSHBDd21VcGRhdGUoemRldl90KiBkZXYpOwordTMyX3QgemZIcEFuaVVwZGF0ZSh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkhwQW5pVXBkYXRlUnNzaSh6ZGV2X3QqIGRldiwgdThfdCByc3NpKTsKK3ZvaWQgemZIcEFuaUF0dGFjaCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBBbmlBclBvbGwoemRldl90KiBkZXYsIHUzMl90IGxpc3RlblRpbWUsIHUzMl90IHBoeUNudDEsIHUzMl90IHBoeUNudDIpOwordm9pZCB6ZkhwSGVhcnRCZWF0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZIcFBvd2VyU2F2ZVNldFN0YXRlKHpkZXZfdCogZGV2LCB1OF90IHBzU3RhdGUpOwordm9pZCB6ZkhwUG93ZXJTYXZlU2V0TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBzdGFNb2RlLCB1OF90IHBzTW9kZSwgdTE2X3QgYmNuSW50ZXJ2YWwpOwordTE2X3QgemZIcElzRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit1MTZfdCB6ZkhwSXNEZnNDaGFubmVsTkNTKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKK3UxNl90IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBhQmFuZCk7Cit1MTZfdCB6ZkhwSXNBbGxvd2VkQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit2b2lkIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdThfdCBkaXNhYmxlRmxhZyk7Cit2b2lkIHpmSHBTZXRUVFNJRlNUaW1lKHpkZXZfdCogZGV2LCB1OF90IHNpZnNfdGltZSk7CisKK3ZvaWQgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCB1OF90ICptb25IYWxSeEluZm8pOworCit2b2lkIHpmRHVtcFNTSUQodThfdCBsZW5ndGgsIHU4X3QgKnZhbHVlKTsKK3ZvaWQgemZIcFNldEFnZ1BrdE51bSh6ZGV2X3QqIGRldiwgdTMyX3QgbnVtKTsKK3ZvaWQgemZIcFNldE1QRFVEZW5zaXR5KHpkZXZfdCogZGV2LCB1OF90IGRlbnNpdHkpOwordm9pZCB6ZkhwU2V0U2xvdFRpbWUoemRldl90KiBkZXYsIHU4X3QgdHlwZSk7Cit2b2lkIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOwordm9pZCB6ZkhwU2V0Umlmcyh6ZGV2X3QqIGRldiwgdThfdCBodF9lbmFibGUsIHU4X3QgaHQyMDQwLCB1OF90IGdfbW9kZSk7Cit2b2lkIHpmSHBCZWdpblNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKTsKK3ZvaWQgemZIcEZpbmlzaFNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKTsKK3UxNl90IHpmSHBFbmFibGVId1JldHJ5KHpkZXZfdCogZGV2KTsKK3UxNl90IHpmSHBEaXNhYmxlSHdSZXRyeSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBTV0RlY3J5cHQoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKTsKK3ZvaWQgemZIcFNXRW5jcnlwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpOwordTMyX3QgemZIcENhcGFiaWxpdHkoemRldl90KiBkZXYpOwordm9pZCB6ZkhwU2V0Um9sbENhbGxUYWJsZSh6ZGV2X3QqIGRldik7Cit1OF90IHpmSHByZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmU3RhQWRkSWVQb3dlckNhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1OF90IHpmSHBHZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2KTsKK3U4X3QgemZIcEdldE1pblR4UG93ZXIoemRldl90KiBkZXYpOwordTE2X3QgemZTdGFBZGRJZVN1cHBvcnRDaCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit2b2lkIHpmSHBFbmFibGVSaWZzKHpkZXZfdCogZGV2LCB1OF90IG1vZGUyNGcsIHU4X3QgbW9kZUh0LCB1OF90IG1vZGVIdDIwNDApOwordm9pZCB6ZkhwRGlzYWJsZVJpZnMoemRldl90KiBkZXYpOwordTE2X3QgemZIcFVzYlJlc2V0KHpkZXZfdCogZGV2KTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfQ0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NoYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NoYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWMxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2hiLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGhiLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgaG91c2Uga2VlcGluZyBhbmQgdGltZXIgZnVuY3Rpb25zLiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCisvKiBDYWxsZWQgYnkgd3JhcHBlciBldmVyeSAxMCBtc2VjICovCit2b2lkIHpmaUhlYXJ0QmVhdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+dGljaysrOworCisjaWYgMAorICAgIC8qID0+IGV2ZXJ5IDEuMjggc2Vjb25kcyAqLworICAgIGlmICh3ZC0+Y3dtLmN3X2VuYWJsZSAmJiAoKHdkLT50aWNrICYgMHg3ZikgPT0gMHgzZikpCisgICAgeworICAgICAgICB6ZkhwQ3dtVXBkYXRlKGRldik7CisgICAgfQorI2VuZGlmCisgICAgLyogPT4gZXZlcnkgMi41NiBzZWNvbmRzICovCisgICAgaWYgKCh3ZC0+dGljayAmIDB4ZmYpID09IDApCisgICAgeworICAgICAgICB6ZkFnaW5nRGVmcmFnTGlzdChkZXYsIDEpOworICAgIH0KKworICAgIC8qIFdhdGNoIERvZyAqLworICAgIC8vemZXYXRjaERvZygpOworCisgICAgLyogTEVEIENvbnRyb2wgKHBlciAxMDBtcykgKi8KKyAgICBpZiAoKHdkLT50aWNrICUgMTApID09IDkpCisgICAgeworICAgICAgICB6ZkxlZDEwMG1zQ3RybChkZXYpOworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorICAgICAgICBpZiAoIXdkLT5tb2RlTURLRW5hYmxlKQorICAgICAgICB7CisgICAgICAgICAgICB6ZmlEYmdSZWFkVGFsbHkoZGV2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX1JFV1JJVEVfQkVBQ09OX1NUQVJUX0FERFJFU1MKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbisrOyAgLy8gYWRkIDEwbXMKKworICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9PSAyKSAmJgorICAgICAgICAgICAgICAgICAod2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbiA9PSAzMDApICYmCisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmlic3NSZWNlaXZlQmVhY29uQ291bnQgPCAzKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSXQgaXMgaGFwcGVuISEhIE5vIGVycm9yIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICB6ZlJlU2V0Q3VycmVudEZyZXF1ZW5jeShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYod2QtPnN0YS5SZWNlaXZlZFBhY2tldFJhdGVDb3VudGVyIDw9IDApCisgICAgeworICAgICAgICB3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA9IHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzOworCS8vem1fZGVidWdfbXNnMSgiUmVjZWl2ZSBQYWNrZXQgUGVyIFNlY29uZCAgPSAiLCB3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCk7CisJICAgIGlmICh3ZC0+c3RhLlRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0cyAhPSAwKQorCSAgICB7CisJICAgICAgICB3ZC0+c3RhLmF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzID0gd2QtPnN0YS5Ub3RhbE51bWJlck9mUmVjZWl2ZUJ5dGVzL3dkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAgd2QtPnN0YS5hdmdTaXplT2ZSZWNlaXZlUGFja2V0cyA9IDY0MDsKKwkgICAgfQorICAgICAgICB3ZC0+c3RhLlRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0cyA9IDA7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlcyA9IDA7CisgICAgICAgIHdkLT5zdGEuUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlciA9IDEwMDsgLypmb3IgYW5vdGhlciAxcyovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEuUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlci0tOworICAgIH0KKworCS8qID0+IGV2ZXJ5IDEuMjggc2Vjb25kcyAqLworCWlmKCh3ZC0+dGljayAmIDB4N2YpID09IDB4M2YpCisJeworCQlpZiggd2QtPnN0YS5Ob25OQVBjb3VudCA+IDApCisJCXsKKwkJCXdkLT5zdGEuUlRTSW5BR0dNb2RlID0gVFJVRTsKKwkJCXdkLT5zdGEuTm9uTkFQY291bnQgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJd2QtPnN0YS5SVFNJbkFHR01vZGUgPSBGQUxTRTsKKwkJfQorCX0KKworCisKKyAgICAvKiBNYWludGFpbiBtYW5hZ2VtZW50IHRpbWUgdGljayAqLworICAgIHpmTW1BcFRpbWVUaWNrKGRldik7CisgICAgemZNbVN0YVRpbWVUaWNrKGRldik7CisKKyAgICAvL3pmUGh5Q3JUdW5pbmcoZGV2KTsKKworICAgIC8vemZUeFBvd2VyQ29udHJvbChkZXYpOworICAgIHpmSHBIZWFydEJlYXQoZGV2KTsKKworfQorCisKK3ZvaWQgemZEdW1wQnNzTGlzdCh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKKyAgICB1OF90ICAgc3RyWzMzXTsKKyAgICB1OF90ICAgaSwgajsKKyAgICB1MzJfdCAgYWRkcjEsIGFkZHIyOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fZGVidWdfbXNnMCgiKioqKiogQnNzIHNjYW4gcmVzdWx0ICoqKioqIik7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIGkgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoIkJTUyAjIiwgaSk7CisgICAgICAgIGZvcihqPTA7IGo8cEJzc0luZm8tPnNzaWRbMV07IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyW2pdID0gcEJzc0luZm8tPnNzaWRbMitqXTsKKyAgICAgICAgfQorICAgICAgICBzdHJbcEJzc0luZm8tPnNzaWRbMV1dID0gMDsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU1NJRCA9ICIpOworICAgICAgICB6bV9kZWJ1Z19tc2cwKHN0cik7CisKKyAgICAgICAgYWRkcjEgPSAocEJzc0luZm8tPmJzc2lkWzBdIDw8IDE2KSArIChwQnNzSW5mby0+YnNzaWRbMV0gPDwgOCApCisgICAgICAgICAgICAgICAgKyBwQnNzSW5mby0+YnNzaWRbMl07CisgICAgICAgIGFkZHIyID0gKHBCc3NJbmZvLT5ic3NpZFszXSA8PCAxNikgKyAocEJzc0luZm8tPmJzc2lkWzRdIDw8IDggKQorICAgICAgICAgICAgICAgICsgcEJzc0luZm8tPmJzc2lkWzVdOworICAgICAgICB6bV9kZWJ1Z19tc2cyKCJCc3NpZCA9ICIsIGFkZHIxKTsKKyAgICAgICAgem1fZGVidWdfbXNnMigiICAgICAgICAiLCBhZGRyMik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImZyZXF1ZW5jeSA9ICIsIHBCc3NJbmZvLT5mcmVxdWVuY3kpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJzZWN1cml0eSB0eXBlID0gIiwgcEJzc0luZm8tPnNlY3VyaXR5VHlwZSk7CisgICAgICAgIHptX2RlYnVnX21zZzEoIldNRSA9ICIsIHBCc3NJbmZvLT53bWVTdXBwb3J0KTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiYmVhY29uIGludGVydmFsID0gIiwgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdCisgICAgICAgICAgICAgICAgICAgICAgKyAocEJzc0luZm8tPmJlYWNvbkludGVydmFsWzFdIDw8IDgpKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY2FwYWJpbGl0eSA9ICIsIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdCisgICAgICAgICAgICAgICAgICAgICAgKyAocEJzc0luZm8tPmNhcGFiaWxpdHlbMV0gPDwgOCkpOworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlc1sxXSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGo9MDsgajxwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXNbMV07IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMigic3VwcG9ydGVkIHJhdGVzID0gIiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzWzIral0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCBqPTA7IGo8cEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cyKCJleHQgc3VwcG9ydGVkIHJhdGVzID0gIiwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzIral0pOworICAgICAgICB9CisKKyAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX2RlYnVnX21zZzAoIioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2ljLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0ZjA3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaWMuYwpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKKwordm9pZCB6ZlVwZGF0ZUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCkKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmJzc2lkWzBdID0gYnNzaWRbMF0gKyAoKCh1MTZfdCkgYnNzaWRbMV0pIDw8IDgpOworICAgIHdkLT5zdGEuYnNzaWRbMV0gPSBic3NpZFsyXSArICgoKHUxNl90KSBic3NpZFszXSkgPDwgOCk7CisgICAgd2QtPnN0YS5ic3NpZFsyXSA9IGJzc2lkWzRdICsgKCgodTE2X3QpIGJzc2lkWzVdKSA8PCA4KTsKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZkhwU2V0QnNzaWQoZGV2LCBic3NpZCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmVzZXRTdXBwb3J0UmF0ZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBSZXNldCBzdXBwb3J0IHJhdGUgdG8gZGVmYXVsdCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdHlwZTogWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTyAgICAgICA9PiByZXNldCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0RJU0NPTk5FQ1QgPT4gcmVzZXQgdG8gZGlzY29ubmVjdCBzdGF0dXMgICAgICAqLworLyogICAgICAgICAgICBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9JQlNTX0IgICAgID0+IHJlc2V0IHRvIElCU1MgY3JlYXRvcihiIG1vZGUpICAgKi8KKy8qICAgICAgICAgICAgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyAgICA9PiByZXNldCB0byBJQlNTIGNyZWF0b3IoYS9nIG1vZGUpICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZSZXNldFN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHR5cGUpCisgICAgeworICAgIGNhc2UgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTzoKKyAgICAgICAgd2QtPmJSYXRlID0gMDsKKyAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAwOworICAgICAgICB3ZC0+Z1JhdGUgPSAwOworICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVDoKKyAgICAgICAgd2QtPmJSYXRlID0gMHhmOworICAgICAgICB3ZC0+YlJhdGVCYXNpYyA9IDB4ZjsKKyAgICAgICAgd2QtPmdSYXRlID0gMHhmZjsKKyAgICAgICAgd2QtPmdSYXRlQmFzaWMgPSAweDE1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQjoKKyAgICAgICAgd2QtPmJSYXRlID0gMHhmOworICAgICAgICB3ZC0+YlJhdGVCYXNpYyA9IDB4ZjsKKyAgICAgICAgd2QtPmdSYXRlID0gMDsKKyAgICAgICAgd2QtPmdSYXRlQmFzaWMgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQUc6CisgICAgICAgIHdkLT5iUmF0ZSA9IDB4ZjsKKyAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAweGY7CisgICAgICAgIHdkLT5nUmF0ZSA9IDB4ZmY7CisgICAgICAgIHdkLT5nUmF0ZUJhc2ljID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHpmVXBkYXRlU3VwcG9ydFJhdGUoemRldl90KiBkZXYsIHU4X3QqIHJhdGVBcnJheSkKK3sKKyAgICB1OF90IGJSYXRlPTAsIGJSYXRlQmFzaWM9MCwgZ1JhdGU9MCwgZ1JhdGVCYXNpYz0wOworICAgIHU4X3QgbGVuZ3RoID0gcmF0ZUFycmF5WzFdOworICAgIHU4X3QgaSwgajsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvcihpPTI7IGk8bGVuZ3RoKzI7IGkrKykKKyAgICB7CisgICAgICAgIGZvcihqPTA7IGo8NDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChyYXRlQXJyYXlbaV0gJiAweDdmKSA9PSB6ZzExYlJhdGVUYmxbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJSYXRlIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgIGlmICggcmF0ZUFycmF5W2ldICYgMHg4MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiUmF0ZUJhc2ljIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggaiA9PSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGo9MDsgajw4OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAocmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWdSYXRlVGJsW2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGdSYXRlIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgICAgICBpZiAoIHJhdGVBcnJheVtpXSAmIDB4ODAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBnUmF0ZUJhc2ljIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICB3ZC0+YlJhdGUgfD0gYlJhdGU7CisgICAgd2QtPmJSYXRlQmFzaWMgfD0gYlJhdGVCYXNpYzsKKyAgICB3ZC0+Z1JhdGUgfD0gZ1JhdGU7CisgICAgd2QtPmdSYXRlQmFzaWMgfD0gZ1JhdGVCYXNpYzsKK30KKwordThfdCB6ZklzR09ubHlNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCAgZnJlcXVlbmN5LCB1OF90KiByYXRlQXJyYXkpCit7CisgICAgdThfdCBsZW5ndGggPSByYXRlQXJyYXlbMV07CisgICAgdThfdCBpLCBqOworCisgICAgaWYgKGZyZXF1ZW5jeSA8IDMwMDApIHsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoICgocmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWdSYXRlVGJsW2pdKQorICAgICAgICAgICAgICAgICAgICAgJiYgKHJhdGVBcnJheVtpXSAmIDB4ODApICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkdhdGhlckJNb2RlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXksIHU4X3QqIGV4dHJhdGVBcnJheSkKK3sKKyAgICB1OF90IGdhdGhlckJNb2RlW1pNX01BWF9TVVBQX1JBVEVTX0lFX1NJWkUgKyAyXTsKKyAgICB1OF90IGksIGosIGsgPSAwOworICAgIHU4X3QgbGVuZ3RoOworCisgICAgZ2F0aGVyQk1vZGVbMF0gPSBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEU7CisgICAgZ2F0aGVyQk1vZGVbMV0gPSAwOworCisgICAgbGVuZ3RoID0gcmF0ZUFycmF5WzFdOworICAgIGZvciAoaSA9IDI7IGkgPCBsZW5ndGgrMjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIGlmICggKHJhdGVBcnJheVtpXSAmIDB4N2YpID09IHpnMTFiUmF0ZVRibFtqXSApIHsKKyAgICAgICAgICAgICAgICBnYXRoZXJCTW9kZVsyK2tdID0gcmF0ZUFycmF5W2ldOworCisgICAgICAgICAgICAgICAgZ2F0aGVyQk1vZGVbMV0rKzsKKyAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW5ndGggPSBleHRyYXRlQXJyYXlbMV07CisgICAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKCAoZXh0cmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWJSYXRlVGJsW2pdICkgeworICAgICAgICAgICAgICAgIGdhdGhlckJNb2RlWzIra10gPSBleHRyYXRlQXJyYXlbaV07CisKKyAgICAgICAgICAgICAgICBnYXRoZXJCTW9kZVsxXSsrOworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGV4dHJhdGVBcnJheVswXSA9IGV4dHJhdGVBcnJheVsxXSA9IDA7CisgICAgemZNZW1vcnlDb3B5KHJhdGVBcnJheSwgZ2F0aGVyQk1vZGUsIGdhdGhlckJNb2RlWzFdKzIpOworfQorCit1MTZfdCB6ZkdldFJhbmRvbU51bWJlcih6ZGV2X3QqIGRldiwgdTE2X3QgaW5pdFZhbHVlKQoreworI2lmIDAKKyAgICAvKiBDb21waWxlci9MaW5rZXIgZXJyb3Igb24gTGludXggKi8KKyAgICBpZiAoIGluaXRWYWx1ZSApCisgICAgeworICAgICAgICBzcmFuZChpbml0VmFsdWUpOworICAgIH0KKworICAgIHJldHVybiAoKHUxNl90KXJhbmQoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZlBTRGV2aWNlU2xlZXAoemRldl90KiBkZXYpCit7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBlbnRlciBQUyBtb2RlICovCisKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6Y09mZG1QaHlDcnRsVG9SYXRlW10gPQoreworICAgIC8qIDB4OD00OE0sIDB4OT0yNE0sIDB4YT0xMk0sIDB4Yj02TSwgMHhjPTU0TSwgMHhkPTM2TSwgMHhlPTE4TSwgMHhmPTlNICovCisgICAgICAgICAgICAxMCwgICAgICAgOCwgICAgICAgNiwgICAgICA0LCAgICAgIDExLCAgICAgICA5LCAgICAgICA3LCAgICAgIDUKK307CisKK3U4X3QgemZQaHlDdHJsVG9SYXRlKHUzMl90IHBoeUN0cmwpCit7CisgICAgdTMyX3QgbXQsIG1jcywgc2c7CisgICAgdThfdCByYXRlID0gMDsKKworICAgIG10ID0gcGh5Q3RybCAmIDB4MzsKKyAgICBtY3MgPSAocGh5Q3RybD4+MTgpICYgMHgzZjsKKyAgICBzZyA9IChwaHlDdHJsPj4zMSkgJiAweDE7CisKKyAgICBpZiAoKG10ID09IDApICYmIChtY3MgPD0zKSkKKyAgICB7CisgICAgICAgIHJhdGUgPSAodThfdCltY3M7CisgICAgfQorICAgIGVsc2UgaWYgKChtdCA9PSAxKSAmJiAobWNzID49IDB4OCkgJiYgKG1jcyA8PSAweGYpKQorICAgIHsKKyAgICAgICAgcmF0ZSA9IHpjT2ZkbVBoeUNydGxUb1JhdGVbbWNzLThdOworICAgIH0KKyAgICBlbHNlIGlmICgobXQgPT0gMikgJiYgKG1jcyA8PSAxNSkpCisgICAgeworICAgICAgICByYXRlID0gKHU4X3QpbWNzICsgMTI7CisgICAgICAgIGlmKHNnKSB7CisgICAgICAgICAgICBpZiAobWNzICE9IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZSA9ICh1OF90KW1jcyArIDEyICsgMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy9NQ1M3LVNHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZSA9ICh1OF90KTMwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJhdGU7Cit9CisKKwordm9pZCB6ZkNvcmVFdmVudCh6ZGV2X3QqIGRldiwgdTE2X3QgZXZlbnQsIHU4X3QqIHJzcCkKK3sKKyAgICB1MTZfdCBpOworICAgIHpidWZfdCogcHNCdWY7CisgICAgdThfdCBtb3JlRGF0YTsKKyAgICB1OF90IHZhcCA9IDA7CisgICAgdThfdCBwZWVySWR4OworICAgIHM4X3QgcmVzOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICBpZiAoZXZlbnQgPT0gMCkgLy9CZWFjb24gRXZlbnQKKyAgICB7CisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkFwU2VuZEJlYWNvbihkZXYpOworCisgICAgICAgICAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUT0RPIDogU2VuZCBxdWV1ZWQgYnJvYWRjYXN0IGZyYW1lcyBhdCBCQy9NQyBldmVudCAqLworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwc0J1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG1vcmVEYXRhID0gMDsKKyAgICAgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5iY21jVGFpbFt2YXBdICE9IHdkLT5hcC5iY21jSGVhZFt2YXBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ptX21zZzBfbW0oWk1fTFZfMCwgIlNlbmQgQkNNQyBmcmFtZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVmID0gd2QtPmFwLmJjbWNBcnJheVt2YXBdW3dkLT5hcC5iY21jSGVhZFt2YXBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5hcC5iY21jSGVhZFt2YXBdID0gKHdkLT5hcC5iY21jSGVhZFt2YXBdICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoWk1fQkNNQ19BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmJjbWNUYWlsW3ZhcF0gIT0gd2QtPmFwLmJjbWNIZWFkW3ZhcF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZURhdGEgPSAweDIwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwc0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIDogY29uZmlnIG1vcmVEYXRhIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBwc0J1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlKHBzQnVmICE9IE5VTEwpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTVEEgbW9kZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPiBaTV9TVEFfUFNfTk9ORSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2VuZCBxdWV1ZWQgcGFja2V0cyAqLworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8d2QtPnN0YS5zdGFQU0RhdGFDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCB3ZC0+c3RhLnN0YVBTRGF0YVF1ZXVlW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdkLT5zdGEuc3RhUFNEYXRhQ291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU3RhU2VuZEJlYWNvbihkZXYpOworICAgICAgICAgICAgICAgIHdkLT5zdGEuaWJzc0F0aW1UaW1lciA9IFpNX0JJVF8xNSB8IHdkLT5zdGEuYXRpbVdpbmRvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclByZVRCVFRJbnRlcnJ1cHQoZGV2KTsKKyAgICAgICAgfQorICAgIH0gLy9pZiAoZXZlbnQgPT0gMCkgLy9CZWFjb24gRXZlbnQKKyAgICBlbHNlIGlmIChldmVudCA9PSAxKSAvL1JldHJ5IGNvbXBsZXRlZCBldmVudAorICAgIHsKKyAgICAgICAgdTMyX3QgcmV0cnlSYXRlOworCisgICAgICAgIHJldHJ5UmF0ZSA9ICh1MzJfdCkocnNwWzZdKSArICgoKHUzMl90KShyc3BbN10pKTw8OCkKKyAgICAgICAgICAgICAgICArICgoKHUzMl90KShyc3BbOF0pKTw8MTYpICsgKCgodTMyX3QpKHJzcFs5XSkpPDwyNCk7CisgICAgICAgIC8qIERlZ3JhZGUgVHggUmF0ZSAqLworICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBpZiAoKGk9emZBcEZpbmRTdGEoZGV2LCAodTE2X3QqKXJzcCkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoZGV2LCAmd2QtPmFwLnN0YVRhYmxlW2ldLnJjQ2VsbCwgMCwodTMyX3QpemZQaHlDdHJsVG9SYXRlKHJldHJ5UmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsICh1MTZfdCopcnNwLCAmcGVlcklkeCk7CisgICAgICAgICAgICBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bcGVlcklkeF0ucmNDZWxsLCAwLCh1MzJfdCl6ZlBoeUN0cmxUb1JhdGUocmV0cnlSYXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfSAvL2Vsc2UgaWYgKGV2ZW50ID09IDEpIC8vUmV0cnkgY29tcGxldGVkIGV2ZW50CisgICAgZWxzZSBpZiAoZXZlbnQgPT0gMikgLy9UeCBGYWlsIGV2ZW50CisgICAgeworICAgICAgICB1MzJfdCByZXRyeVJhdGU7CisKKyAgICAgICAgcmV0cnlSYXRlID0gKHUzMl90KShyc3BbNl0pICsgKCgodTMyX3QpKHJzcFs3XSkpPDw4KQorICAgICAgICAgICAgICAgICsgKCgodTMyX3QpKHJzcFs4XSkpPDwxNikgKyAoKCh1MzJfdCkocnNwWzldKSk8PDI0KTsKKworICAgICAgICAvKiBEZWdyYWRlIFR4IFJhdGUgKi8KKyAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgaWYgKChpPXpmQXBGaW5kU3RhKGRldiwgKHUxNl90Kilyc3ApKSAhPSAweGZmZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5hcC5zdGFUYWJsZVtpXS5yY0NlbGwsIDAsKHUzMl90KXpmUGh5Q3RybFRvUmF0ZShyZXRyeVJhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIHpmQXBTZW5kRmFpbHVyZShkZXYsIHJzcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgcmVzID0gemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoZGV2LCAodTE2X3QqKXJzcCwgJnBlZXJJZHgpOworICAgICAgICAgICAgaWYgKCByZXMgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLnJjQ2VsbCwgMCwodTMyX3QpemZQaHlDdHJsVG9SYXRlKHJldHJ5UmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0gLy9lbHNlIGlmIChldmVudCA9PSAyKSAvL1R4IEZhaWwgZXZlbnQKKyAgICBlbHNlIGlmIChldmVudCA9PSAzKSAvL1R4IENvbXAgZXZlbnQKKyAgICB7CisgICAgICAgIHUzMl90IHJldHJ5UmF0ZTsKKworICAgICAgICByZXRyeVJhdGUgPSAodTMyX3QpKHJzcFs2XSkgKyAoKCh1MzJfdCkocnNwWzddKSk8PDgpCisgICAgICAgICAgICAgICAgKyAoKCh1MzJfdCkocnNwWzhdKSk8PDE2KSArICgoKHUzMl90KShyc3BbOV0pKTw8MjQpOworCisgICAgICAgIC8qIFRPRE8gOiBUeCBjb21wbGV0ZWQsIHVzZWQgZm9yIHJhdGUgY29udHJvbCBwcm9iaW5nICovCisgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICgoaT16ZkFwRmluZFN0YShkZXYsICh1MTZfdCopcnNwKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsICZ3ZC0+YXAuc3RhVGFibGVbaV0ucmNDZWxsLCB6ZlBoeUN0cmxUb1JhdGUocmV0cnlSYXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKGRldiwgKHUxNl90Kilyc3AsICZwZWVySWR4KTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1twZWVySWR4XS5yY0NlbGwsIHpmUGh5Q3RybFRvUmF0ZShyZXRyeVJhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICB9IC8vZWxzZSBpZiAoZXZlbnQgPT0gMykgLy9UeCBDb21wIGV2ZW50CisgICAgZWxzZSBpZiAoZXZlbnQgPT0gNCkgLy9CQSBmYWlsZWQgY291bnQKKyAgICB7CisgICAgICAgIHUzMl90IGZhaWw7CisgICAgICAgIHUzMl90IHJhdGU7CisgICAgICAgIHBlZXJJZHggPSAwOworCisgICAgICAgIGZhaWw9KCh1MzJfdCopcnNwKVswXSAmIDB4RkZGRjsKKyAgICAgICAgcmF0ZT0oKHUzMl90Kilyc3ApWzBdID4+IDE2OworCisgICAgICAgIGlmIChyYXRlID4gMTUpIHsKKyAgICAgICAgICAgIHJhdGUgPSAocmF0ZSAmIDB4RikgKyAxMiArIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByYXRlID0gcmF0ZSArIDEyOworICAgICAgICB9CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLnJjQ2VsbCwgKHU4X3QpcmF0ZSwgZmFpbCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmQmVhY29uQ2ZnSW50ZXJydXB0KHpkZXZfdCogZGV2LCB1OF90KiByc3ApCit7CisgICAgdTMyX3QgdHhCZWFjb25Db3VudGVyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgeworICAgICAgICB0eEJlYWNvbkNvdW50ZXIgPSAqKCh1MzJfdCAqKXJzcCk7CisgICAgICAgIGlmICggd2QtPnN0YS5iZWFjb25UeENudCAhPSB0eEJlYWNvbkNvdW50ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLnR4QmVhY29uSW5kID0gMTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT50aWNrSWJzc1NlbmRCZWFjb24gPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEudHhCZWFjb25JbmQgPSAwOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19ERUxBWUVEX0pPSU5fSU5ESUNBVElPTgorICAgICAgICBpZiAoIHdkLT5zdGEudHhCZWFjb25JbmQgJiYgd2QtPnN0YS5pYnNzRGVsYXllZEluZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeShkZXYsIDEsICZ3ZC0+c3RhLmlic3NEZWxheWVkSW5kRXZlbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmlic3NEZWxheWVkSW5kID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgd2QtPnN0YS5iZWFjb25UeENudCA9IHR4QmVhY29uQ291bnRlcjsKKworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0aW1lIGlzIGV4cGlyZWQgYWZ0ZXIgQVRJTSB3aW5kb3c/PworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYnVmZmVyZWQgYW55IGRhdGEgZm9yIHRob3NlIHN0YXRpb25zIHRoYXQgYXJlIHNsZWVwaW5nCisgICAgICAgIC8vIElmIGl0J3MgdHJ1ZSwgdGhlbiB0cmFuc21pdHRpbmcgQVRJTSBwa3QgdG8gbm90aWZ5IHRoZW0KKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1BTCisgICAgICAgIC8vIFRPRE86IE5lZWQgdG8gY2hlY2sgaWYgdGhlIHN0YXRpb24gcmVjZWl2ZSBvdXIgQVRJTSBwa3Q/Pz8KKyAgICAgICAgemZTdGFJYnNzUFNTZW5kKGRldik7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF0aW1XaW5kb3cgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIHdvbid0IHJlY2VpdmUgdGhlIGVuZCBvZiBBVElNIGlzciBzbyB3ZSBmYWtlIGl0CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoZGV2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCit2b2lkIHpmRW5kT2ZBdGltV2luZG93SW50ZXJydXB0KHpkZXZfdCogZGV2KQoreworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1BTCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8vIFRyYW5zbWl0IGFueSBxdWV1ZWQgcGt0IGZvciB0aGUgc3RhdGlvbnMhIQorICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoZGV2KTsKKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Npbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4NTNjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaW5pdC5jCkBAIC0wLDAgKzEsMTkxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBpbml0IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAiLi4vaGFsL2hwcmVnLmgiCisKK2V4dGVybiBjb25zdCB1OF90IHpjVXBUb0FjWzhdOworCit1MTZfdCB6Y0luZGV4dG9SYXRlQkdbMTZdID0gezEwMDAsIDIwMDAsIDU1MDAsIDExMDAwLCAwLCAwLCAwLCAwLCA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwgMTIwMDAsIDYwMDAsIDU0MDAwLCAzNjAwMCwgMTgwMDAsIDkwMDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU4yMExbMTZdID0gezY1MDAsIDEzMDAwLCAxOTUwMCwgMjYwMDAsIDM5MDAwLCA1MjAwMCwgNTg1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTAwMCwgMTMwMDAsIDI2MDAwLCAzOTAwMCwgNTIwMDAsIDc4MDAwLCAxMDQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcwMDAsIDEzMDAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjIwU1sxNl0gPSB7NzIwMCwgMTQ0MDAsIDIxNzAwLCAyODkwMCwgNDMzMDAsIDU3ODAwLCA2NTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMjAwLCAxNDQwMCwgMjg5MDAsIDQzMzAwLCA1NzgwMCwgODY3MDAsIDExNTYwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDAwMCwgMTQ0NDAwfTsKK3UzMl90IHpjSW5kZXh0b1JhdGVONDBMWzE2XSA9IHsxMzUwMCwgMjcwMDAsIDQwNTAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgMTIxNTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1MDAwLCAyNzAwMCwgNTQwMDAsIDgxMDAwLCAxMDgwMDAsIDE2MjAwMCwgMjE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQzMDAwLCAyNzAwMDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU40MFNbMTZdID0gezE1MDAwLCAzMDAwMCwgNDUwMDAsIDYwMDAwLCA5MDAwMCwgMTIwMDAwLCAxMzUwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAwMDAsIDMwMDAwLCA2MDAwMCwgOTAwMDAsIDEyMDAwMCwgMTgwMDAwLCAyNDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzAwMDAsIDMwMDAwMH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlR4R2VuV2xhbkhlYWRlciAgICAgICAgICAgKi8KKy8qICAgICAgR2VuZXJhdGUgV0xBTiBNQUMgaGVhZGVyIGFuZCBMTEMgaGVhZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBpZCA6IEluZGV4IG9mIFR4RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbGVuZ3RoIG9mIHJlbW92ZWQgRXRoZXJuZXQgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVHhHZW5XbGFuSGVhZGVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBmbGFnLCB1MTZfdCBwbHVzTGVuLCB1MTZfdCBtaW51c0xlbiwgdTE2X3QgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCAqbWljTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sIHN0cnVjdCBhZ2dDb250cm9sICphZ2dDb250cm9sKQoreworCisgICAgdTE2X3QgbGVuOworICAgIHUxNl90IG1hY0N0cmw7CisgICAgdTMyX3QgcGh5Q3RybDsKKyAgICB1MTZfdCBobGVuID0gMTY7CisgICAgdTE2X3QgaWN2TGVuID0gMDsKKyAgICB1MTZfdCB3ZHNQb3J0SWQ7CisgICAgdTE2X3QgdmFwID0gMDsKKyAgICB1MTZfdCBtY3MgPSAwOworICAgIHUxNl90IG10ID0gMDsKKyAgICB1OF90ICBxb3NUeXBlOworICAgIHU4X3QgIGIxLCBiMjsKKyAgICB1MTZfdCB3ZHNQb3J0OworICAgIHU4X3QgIGVuY0V4ZW1wdGlvbkFjdGlvblR5cGU7CisgICAgdTE2X3QgcmF0ZVByb2JpbmdGbGFnID0gMDsKKyAgICB1OF90ICB0a2lwRnJhbWVPZmZzZXQgPSAwOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHU4X3QgICAgcmVzLCBwZWVySWR4OworICAgIHU4X3QgICAgdXNlcklkeD0wOworICAgIHUxNl90ICAgKml2MTY7CisgICAgdTMyX3QgICAqaXYzMjsKKyNlbmRpZgorCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAvKiBHZW5lcmF0ZSBXTEFOIGhlYWRlciAqLworICAgIC8qIEZyYW1lIGNvbnRyb2wgKi8KKyAgICBoZWFkZXJbNF0gPSAweDAwMDggfCAoZmxhZzw8OCk7CisgICAgLyogRHVyYXRpb24gKi8KKyAgICBoZWFkZXJbNV0gPSAweDAwMDA7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisgICAgeworICAgICAgICAvKiBUb0RTIGJpdCAqLworICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMTAwOworCisgICAgICAgIC8qU29tZXRpbWVzIHdlIHdha2UgdXAgdG8gdHgvcnggYnV0IEFQIHN0aWxsIHRoaW5rIHdlIGFyZSBzbGVlcGluZywgc28gc3RpbGwgbmVlZCB0byBzZXQgdGhpcyBiaXQqLworICAgICAgICBpZiAoIHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikgfHwgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgxMDAwOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRkcmVzcyAxID0gQlNTSUQgKi8KKyAgICAgICAgaGVhZGVyWzZdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzddID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgaGVhZGVyWzhdID0gd2QtPnN0YS5ic3NpZFsyXTsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gREEgKi8KKyAgICAgICAgaGVhZGVyWzEyXSA9IGRhWzBdOworICAgICAgICBoZWFkZXJbMTNdID0gZGFbMV07CisgICAgICAgIGhlYWRlclsxNF0gPSBkYVsyXTsKKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogQWRkcmVzcyAxID0gREEgKi8KKyAgICAgICAgaGVhZGVyWzZdID0gZGFbMF07CisgICAgICAgIGhlYWRlcls3XSA9IGRhWzFdOworICAgICAgICBoZWFkZXJbOF0gPSBkYVsyXTsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICAgICAgaGVhZGVyWzEyXSA9IDA7CisgICAgICAgIGhlYWRlclsxM10gPSAwOworICAgICAgICBoZWFkZXJbMTRdID0gMDsKKworICAgICAgICAvKiBQU0VVRE8gdGVzdCA6IFdEUyAqLworICAgICAgICBpZiAod2QtPmVuYWJsZVdEUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVG9EUyBhbmQgRnJvbURTIGJpdCAqLworICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDMwMDsKKworICAgICAgICAgICAgLyogQWRkcmVzcyA0ID0gU0EgKi8KKyAgICAgICAgICAgIGhlYWRlclsxNl0gPSAwOworICAgICAgICAgICAgaGVhZGVyWzE3XSA9IDA7CisgICAgICAgICAgICBoZWFkZXJbMThdID0gMDsKKworICAgICAgICAgICAgaGxlbiA9IDE5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgICAgICBoZWFkZXJbNl0gPSBkYVswXTsKKyAgICAgICAgaGVhZGVyWzddID0gZGFbMV07CisgICAgICAgIGhlYWRlcls4XSA9IGRhWzJdOworICAgICAgICAvKiBBZGRyZXNzIDMgPSBCU1NJRCAqLworICAgICAgICBoZWFkZXJbMTJdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzEzXSA9IHdkLT5zdGEuYnNzaWRbMV07CisgICAgICAgIGhlYWRlclsxNF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsIGRhLCAmcGVlcklkeCk7CisgICAgICAgIGlmKHJlcyA9PSAwKSAvLyBGaW5kIG9wcG9zaXRlIGluIG91ciBPcHBvc2l0ZUluZm8gU3RydWN0dXJlICEKKyAgICAgICAgeworICAgICAgICAgICAgdXNlcklkeCA9IHBlZXJJZHg7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmIChwb3J0IDwgMHgyMCkKKyAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBGcm9tRFMgYml0ICovCisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMjAwOworCisgICAgICAgICAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgICAgICAgICAgaGVhZGVyWzZdID0gZGFbMF07CisgICAgICAgICAgICBoZWFkZXJbN10gPSBkYVsxXTsKKyAgICAgICAgICAgIGhlYWRlcls4XSA9IGRhWzJdOworICAgICAgICAgICAgLyogQWRkcmVzcyAzID0gU0EgKi8KKyAgICAgICAgICAgIGhlYWRlclsxMl0gPSBzYVswXTsKKyAgICAgICAgICAgIGhlYWRlclsxM10gPSBzYVsxXTsKKyAgICAgICAgICAgIGhlYWRlclsxNF0gPSBzYVsyXTsKKworICAgICAgICAgICAgaWYgKHBvcnQgPCBaTV9NQVhfQVBfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXAgPSBwb3J0OworICAgICAgICAgICAgICAgIGhlYWRlclsxNF0gKz0gKHZhcDw8OCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAvKiBXRFMgcG9ydCAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBUb0RTIGFuZCBGcm9tRFMgYml0ICovCisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMzAwOworCisgICAgICAgICAgICB3ZHNQb3J0SWQgPSBwb3J0IC0gMHgyMDsKKworICAgICAgICAgICAgLyogQWRkcmVzcyAxID0gUkEgKi8KKyAgICAgICAgICAgIGhlYWRlcls2XSA9IHdkLT5hcC53ZHMubWFjQWRkclt3ZHNQb3J0SWRdWzBdOworICAgICAgICAgICAgaGVhZGVyWzddID0gd2QtPmFwLndkcy5tYWNBZGRyW3dkc1BvcnRJZF1bMV07CisgICAgICAgICAgICBoZWFkZXJbOF0gPSB3ZC0+YXAud2RzLm1hY0FkZHJbd2RzUG9ydElkXVsyXTsKKyAgICAgICAgICAgIC8qIEFkZHJlc3MgMyA9IERBICovCisgICAgICAgICAgICBoZWFkZXJbMTJdID0gZGFbMF07CisgICAgICAgICAgICBoZWFkZXJbMTNdID0gZGFbMV07CisgICAgICAgICAgICBoZWFkZXJbMTRdID0gZGFbMl07CisgICAgICAgICAgICAvKiBBZGRyZXNzIDQgPSBTQSAqLworICAgICAgICAgICAgaGVhZGVyWzE2XSA9IHNhWzBdOworICAgICAgICAgICAgaGVhZGVyWzE3XSA9IHNhWzFdOworICAgICAgICAgICAgaGVhZGVyWzE4XSA9IHNhWzJdOworCisgICAgICAgICAgICBobGVuID0gMTk7CisgICAgICAgIH0KKyAgICB9IC8qIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAqLworCisgICAgLyogQWRkcmVzcyAyID0gVEEgKi8KKyAgICBoZWFkZXJbOV0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICBoZWFkZXJbMTBdID0gd2QtPm1hY0FkZHJbMV07CisjaWZkZWYgWk1fVkFQTU9ERV9NVUxUSUxFX1NTSUQKKyAgICBoZWFkZXJbMTFdID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICBoZWFkZXJbMTFdID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgJiYgKHdkLT5YTGlua01vZGUpICkKKyAgICB7CisgICAgICAgIGhlYWRlcls5XSAgPSBzYVswXTsKKyAgICAgICAgaGVhZGVyWzEwXSA9IHNhWzFdOworICAgICAgICBoZWFkZXJbMTFdID0gc2FbMl07CisgICAgfQorCisgICAgLyogU2VxdWVuY2UgQ29udHJvbCAqLworICAgIGhlYWRlclsxNV0gPSBzZXE7CisKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIHpmQXBHZXRTdGFUeFJhdGVBbmRRb3NUeXBlKGRldiwgZGEsICZwaHlDdHJsLCAmcW9zVHlwZSwgJnJhdGVQcm9iaW5nRmxhZyk7CisgICAgICAgIG10ID0gKHUxNl90KShwaHlDdHJsICYgMHgzKTsKKyAgICAgICAgbWNzID0gKHUxNl90KSgocGh5Q3RybCA+PiAxNikgJiAweDNmKTsKKyNpZiAxCisgICAgICAgIC8vemZBcEdldFN0YVFvc1R5cGUoZGV2LCBkYSwgJnFvc1R5cGUpOworCisgICAgICAgIC8qIGlmIERBID09IFdNRSBTVEEgKi8KKyAgICAgICAgaWYgKHFvc1R5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUW9TIGRhdGEgKi8KKyAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDAwODA7CisKKyAgICAgICAgICAgIC8qIFFvUyBDb250cm9sICovCisgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSB1cDsKKyAgICAgICAgICAgIGhsZW4gKz0gMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWYgMAorICAgIC8vQUdHIFRlc3QgQ29kZQorICAgIGlmIChoZWFkZXJbNl0gPT0gMHg4MDAwKQorICAgIHsKKyAgICAgICAgLyogUW9TIGRhdGEgKi8KKyAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAvKiBRb1MgQ29udHJvbCAqLworICAgICAgICBoZWFkZXJbaGxlbl0gPSAwOworICAgICAgICBobGVuICs9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgLyogVG9kbzogcmF0ZSBjb250cm9sIGhlcmUgZm9yIHFvcyBmaWVsZCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogUmF0ZSBjb250cm9sICovCisgICAgICAgIHpmU3RhR2V0VHhSYXRlKGRldiwgZGEsICZwaHlDdHJsLCAmcmF0ZVByb2JpbmdGbGFnKTsKKyAgICAgICAgbXQgPSAodTE2X3QpKHBoeUN0cmwgJiAweDMpOworICAgICAgICBtY3MgPSAodTE2X3QpKChwaHlDdHJsID4+IDE2KSAmIDB4M2YpOworICAgIH0KKworICAgIGlmICh3ZC0+dHhNQ1MgIT0gMHhmZikKKyAgICB7CisgICAgICAgIC8qIGZpeGVkIHJhdGUgKi8KKwkgICAgcGh5Q3RybCA9ICgodTMyX3Qpd2QtPnR4TUNTPDwxNikgKyB3ZC0+dHhNVDsKKyAgICAgICAgbWNzID0gd2QtPnR4TUNTOworICAgICAgICBtdCA9IHdkLT50eE1UOworICAgIH0KKworICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb24pCisgICAgeworICAgICAgICAvKiBmb3JjZSBlbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgaWYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbj09MiAmJiAhKGhlYWRlcls2XSYweDEpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBRb1MgZGF0YSAqLworICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAgICAgLyogUW9TIENvbnRyb2wgKi8KKyAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICBobGVuICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAvKiBpZiB3ZC0+ZW5hYmxlQWdncmVnYXRpb249MCA9PiBhdXRvICovCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyoKKyAgICAgKiBhZ2dyZWdhdGlvbiBjb250cm9sCisgICAgICovCisKKyAgICAvKgorICAgICAqIFFvUyBkYXRhCisgICAgICovCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB7CisgICAgICAgIGlmIChhZ2dDb250cm9sICYmIG10ID09IDIpIHsKKyAgICAgICAgICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb249PTAgJiYgIShoZWFkZXJbNl0mMHgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMDgwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBRb1MgQ29udHJvbAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBNU0RVIExlbmd0aAorICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogR2VuZXJhdGUgY29udHJvbCBzZXR0aW5nICovCisgICAgLyogQmFja29mZiwgTm9uLUJ1cnN0IGFuZCBoYXJkd2FyZSBkdXJhdGlvbiAqLworICAgIG1hY0N0cmwgPSAweDIwODsKKworICAgIC8qIEFDSyAqLworICAgIGlmICgoaGVhZGVyWzZdICYgMHgxKSA9PSAweDEpCisgICAgeworICAgICAgICAvKiBtdWx0aWNhc3QgZnJhbWUgOiBTZXQgTk8tQUNLIGJpdCAqLworICAgICAgICBtYWNDdHJsIHw9IDB4NDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogdW5pY2FzdCBmcmFtZSAqLworICAgICNpZiAwCisgICAgICAgIC8vIEVuYWJsZSBSVFMgYWNjb3JkaW5nIHRvIE1QRFUgTGVuZ3RocyAoIG5vdCBNU0RVIExlbmd0aHMgKQorICAgICAgICBpZiAobGVuID49IHdkLT5ydHNUaHJlc2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVuYWJsZSBSVFMgKi8KKyAgICAgICAgICAgIG1hY0N0cmwgfD0gMTsKKyAgICAgICAgfQorICAgICNlbmRpZgorICAgIH0KKyAgICAvKiBWQVAgdGVzdCBjb2RlICovCisgICAgLy9tYWNDdHJsIHw9IDB4NDsKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIHU4X3QgZW5jcnlUeXBlOworICAgICAgICB1MTZfdCBpdjE2OworICAgICAgICB1MzJfdCBpdjMyOworCisgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZSAqLworICAgICAgICBpZiAoKGhlYWRlcls2XSAmIDB4MSkgPT0gMHgxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBtdWx0aWNhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuaXYxNlt2YXBdKys7CisKKyAgICAgICAgICAgICAgICBpZih3ZC0+YXAuaXYxNlt2YXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKHdkLT5hcC5pdjE2W3ZhcF0gPj4gOCk7CisgICAgICAgICAgICAgICAgYjIgPSAoYjEgfCAweDIwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5hcC5pdjE2W3ZhcF07CisgICAgICAgICAgICAgICAgYjIgPSAweDIwIHwgKHdkLT5hcC5iY0tleUluZGV4W3ZhcF0gPDwgNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpIHdkLT5hcC5pdjMyW3ZhcF07CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+YXAuaXYzMlt2YXBdID4+IDE2KTsKKworICAgICAgICAgICAgICAgIC8vbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgIGlmICggKCEoc2VxICYgMHhmKSkmJighKGZsYWcgJiAweDQpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBwbHVzTGVuICs9IDg7CisgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLmVuY3J5TW9kZVt2YXBdID09IFpNX0FFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuaXYxNlt2YXBdKys7CisKKyAgICAgICAgICAgICAgICBpZih3ZC0+YXAuaXYxNlt2YXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgd2QtPmFwLml2MTZbdmFwXTsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPmFwLml2MTZbdmFwXSA+PiA4KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDAgfCAod2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNCk7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpICh3ZC0+YXAuaXYzMlt2YXBdKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCkgKHdkLT5hcC5pdjMyW3ZhcF0gPj4gMTYpOworCisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBlbHNlIGlmICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fQ0VOQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3UzMl90IHR4aXZbNF07CisKKyAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzBdKys7CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnR4aXZbdmFwXVswXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwXVsxXSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAudHhpdlt2YXBdWzFdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzJdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC50eGl2W3ZhcF1bMl0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC50eGl2W3ZhcF1bM10rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnR4aXZbdmFwXVszXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC50eGl2W3ZhcF1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzJdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAod2QtPmFwLmJjS2V5SW5kZXhbdmFwXSAmIDB4MDAwMSk7ICAgIC8qIEZvciBLZXkgSWQgYW5kIHJlc2VydmVkIGZpZWxkICovCisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVswXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVswXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVsxXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis0XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVsxXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNV0gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVsyXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis2XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVsyXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rN10gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVszXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis4XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVszXSA+PiAxNik7CisKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gMTY7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBTVEEncyBlbmNyeXB0aW9uIHR5cGUgKi8KKyAgICAgICAgICAgIHpmQXBHZXRTdGFFbmNyeVR5cGUoZGV2LCBkYSwgJmVuY3J5VHlwZSk7CisKKyAgICAgICAgICAgIGlmIChlbmNyeVR5cGUgPT0gWk1fVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgaXYxNiBhbmQgaXYzMiAqLworICAgICAgICAgICAgICAgIHpmQXBHZXRTdGFXcGFJdihkZXYsIGRhLCAmaXYxNiwgJml2MzIpOworCisgICAgICAgICAgICAgICAgaXYxNisrOworICAgICAgICAgICAgICAgIGlmIChpdjE2ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKGl2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgYjIgPSAoYjEgfCAweDIwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIGl2MTY7CisgICAgICAgICAgICAgICAgYjIgPSAweDIwOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSBpdjMyOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAoaXYzMiA+PiAxNik7CisKKyAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKworICAgICAgICAgICAgICAgIC8qIHNldCBoYXJkd2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICBpZiAoICghKHNlcSAmIDB4ZikpJiYoIShmbGFnICYgMHg0KSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgcGx1c0xlbiArPSA4OworICAgICAgICAgICAgICAgICAgICAqbWljTGVuID0gODsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKworICAgICAgICAgICAgICAgIC8qIFNldCBpdjE2IGFuZCBpdjMyICovCisgICAgICAgICAgICAgICAgemZBcFNldFN0YVdwYUl2KGRldiwgZGEsIGl2MTYsIGl2MzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZW5jcnlUeXBlID09IFpNX0FFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgaXYxNiBhbmQgaXYzMiAqLworICAgICAgICAgICAgICAgIHpmQXBHZXRTdGFXcGFJdihkZXYsIGRhLCAmaXYxNiwgJml2MzIpOworCisgICAgICAgICAgICAgICAgaXYxNisrOworICAgICAgICAgICAgICAgIGlmIChpdjE2ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgaXYxNjsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAoaXYxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpIChpdjMyKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCkgKGl2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworCisgICAgICAgICAgICAgICAgLyogU2V0IGl2MTYgYW5kIGl2MzIgKi8KKyAgICAgICAgICAgICAgICB6ZkFwU2V0U3RhV3BhSXYoZGV2LCBkYSwgaXYxNiwgaXYzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGVsc2UgaWYgKGVuY3J5VHlwZSA9PSBaTV9DRU5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUzMl90IHR4aXZbNF07CisgICAgICAgICAgICAgICAgdThfdCBrZXlJZHg7CisKKyAgICAgICAgICAgICAgICAvKiBHZXQgQ0VOQyBUeElWICovCisgICAgICAgICAgICAgICAgemZBcEdldFN0YUNlbmNJdkFuZEtleUlkeChkZXYsIGRhLCB0eGl2LCAma2V5SWR4KTsKKworICAgICAgICAgICAgICAgIHR4aXZbMF0gKz0gMjsKKworICAgICAgICAgICAgICAgIGlmICh0eGl2WzBdID09IDAgfHwgdHhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhpdlsxXSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0eGl2WzFdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGl2WzJdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHR4aXZbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHR4aXZbM10rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhpdlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHR4aXZbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB0eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoa2V5SWR4ICYgMHgwMDAxKTsgICAgLyogRm9yIEtleSBJZCBhbmQgcmVzZXJ2ZWQgZmllbGQgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9ICh1MTZfdCl0eGl2WzBdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSh0eGl2WzBdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCl0eGl2WzFdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzRdID0gKHUxNl90KSh0eGl2WzFdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis1XSA9ICh1MTZfdCl0eGl2WzJdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzZdID0gKHUxNl90KSh0eGl2WzJdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis3XSA9ICh1MTZfdCl0eGl2WzNdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzhdID0gKHUxNl90KSh0eGl2WzNdID4+IDE2KTsKKworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSAxNjsgIC8qIE1JQyAqLworCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBobGVuICs9IDk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgQ0VOQyBJViAqLworICAgICAgICAgICAgICAgIHpmQXBTZXRTdGFDZW5jSXYoZGV2LCBkYSwgdHhpdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB9CisKKyAgICAgICAgLyogcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIGlmICh3ZC0+YXAucHJvdGVjdGlvbk1vZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5hYmxlIFNlbGYtQ1RTICovCisgICAgICAgICAgICBtYWNDdHJsICY9IDB4RkZGQzsKKyAgICAgICAgICAgIG1hY0N0cmwgfD0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJhdGUgQ29udHJvbCAqLworICAgICAgICBpZiAocG9ydCA8IDB4MjApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFQICovCisgICAgICAgICAgICAvKiBJViAqLworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQNjQpIHx8CisgICAgICAgICAgICAgICAgICAgICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQMTI4KSB8fAorICAgICAgICAgICAgICAgICAgICAod2QtPmFwLmVuY3J5TW9kZVt2YXBdID09IFpNX1dFUDI1NikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAweDA7ICAgLy9JVgorICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gd2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNDsgLy9JViB3aXRoIEtleWlkLS1DV1lhbmcobSkKKyAgICAgICAgICAgICAgICBobGVuICs9IDI7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXRFMgKi8KKworICAgICAgICAgICAgLyogVE9ETyA6IEZpeGVkIHJhdGUgdG8gNTRNICovCisgICAgICAgICAgICBwaHlDdHJsID0gMHhjMDAwMTsgICAvL1BIWSBjb250cm9sIEwKKworICAgICAgICAgICAgLyogV0RTIHBvcnQgY2hlY2tpbmcgKi8KKyAgICAgICAgICAgIGlmICgod2RzUG9ydCA9IChwb3J0IC0gMHgyMCkpID49IFpNX01BWF9XRFNfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZHNQb3J0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIC8qIElWICovCisgICAgICAgICAgICBzd2l0Y2ggKHdkLT5hcC53ZHMuZW5jcnlNb2RlW3dkc1BvcnRdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDB4MDsgICAvL0lWCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gd2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNDsgLy9JViB3aXRoIEtleWlkCisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDQwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICBiMiA9IChiMSB8IDB4MjApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgIGIyID0gMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSB3ZC0+c3RhLml2MzI7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDQwOworICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBoYXJkd2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoIShzZXEgJiAweGYpKSYmKCEoZmxhZyAmIDB4NCkpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNMZW4gKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYxNisrOworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgIGIyID0gKHU4X3QpICh3ZC0+c3RhLml2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsgLyogU2V0IHRvIEFFUyBpbiBjb250cm9sIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gODsgIC8qIE1JQyAqLworCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7IC8qIFNldCBXRVAgYml0IGluIHdsYW4gaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsgLyogcGx1cyBJViBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9LyogZW5kIG9mIHN3aXRjaCAqLworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgIC8qIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQICovCisgICAgeworICAgICAgICBlbmNFeGVtcHRpb25BY3Rpb25UeXBlID0gemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZShkZXYsIGJ1Zik7CisKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZiAxCisgICAgICAgICAgICAvKiBpZiBXTUUgQVAgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFFvUyBkYXRhICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAgICAgICAgIC8qIFFvUyBDb250cm9sICovCisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gdXA7CisgICAgICAgICAgICAgICAgaGxlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA8IFpNX0FVVEhfTU9ERV9XUEEgKQorICAgICAgICAgICAgICAgIHsgICAvKiBub24tV1BBICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdIHw9ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgU29mdHdhcmUgV0VQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1dFUF9FTkNSWV9FTikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3Qga2V5TGVuID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBpdlszXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdlswXSA9IDB4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZbMV0gPSAweDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2WzJdID0gMHgwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlNb2RlW3dkLT5zdGEua2V5SWRdID09IFpNX1dFUDY0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVbd2QtPnN0YS5rZXlJZF0gPT0gWk1fV0VQMTI4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3ZC0+c3RhLlNXRW5jcnlNb2RlW3dkLT5zdGEua2V5SWRdID09IFpNX1dFUDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5TGVuID0gMjk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZldFUEVuY3J5cHQoZGV2LCBidWYsICh1OF90Kikgc25hcCwgc25hcExlbiwgbWludXNMZW4sIGtleUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndlcEtleVt3ZC0+c3RhLmtleUlkXSwgaXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICAgLyogV1BBICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS53cGFTdGF0ZSA+PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGVuY3J5cHRpb24gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKGIxIHwgMHgyMCkgJiAweDdmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAweDIwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyW2hsZW4rMV0gPSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpIHwgKCgodTE2X3QpYjIgPDwgOCkgKyBiMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RBIGluIGluZnJhc3RydWN0dXJlIG1vZGUgc2hvdWxkIHVzZSBrZXlJZCA9IDAgdG8gdHJhbnNtaXQgdW5pY2FzdCAhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKCh1MTZfdCliMiA8PCA4KSArIGIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHNvZnR3YXJlIGVuY3J5cHRpb24gZW5hYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1RLSVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBzYW1lIHRvIFdFUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICghKHNlcSAmIDB4ZikpJiYoIShmbGFnICYgMHg0KSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c0xlbiArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1pY0xlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBtaWNbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgaWN2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OF90IFJDNEtleVsxNl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogUmVtb3ZlIHRoZSBjcml0aWNpYWwgc2VjdGlvbiBoZXJlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDYWxUeE1pYyhkZXYsIGJ1ZiwgKHU4X3QgKilzbmFwLCBzbmFwTGVuLCBtaW51c0xlbiwgZGEsIHNhLCB1cCwgbWljKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcHBlbmQgTUlDIHRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgbWljLCBvZmZzZXQsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBLZXkgTWl4aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMUtleU1peCh3ZC0+c3RhLml2MzIsICZ3ZC0+c3RhLnR4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMktleU1peCh3ZC0+c3RhLml2MTYsICZ3ZC0+c3RhLnR4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcEdldHNlZWRzKHdkLT5zdGEuaXYxNiwgUkM0S2V5LCAmd2QtPnN0YS50eFNlZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuY3J5cHQgRGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZlRLSVBFbmNyeXB0KGRldiwgYnVmLCAodThfdCAqKXNuYXAsIHNuYXBMZW4sIG1pbnVzTGVuLCAxNiwgUkM0S2V5LCAmaWN2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9BRVMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJbaGxlbisxXSA9ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCkgfCAoMHgyMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVEEgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSBzaG91bGQgdXNlIGtleUlkID0gMCB0byB0cmFuc21pdCB1bmljYXN0ICEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjdW1sYXRlIHRoZSBQTiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSArPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlswXSA9PSAwIHx8IHdkLT5zdGEudHhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzFdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsyXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAod2QtPnN0YS5jZW5jS2V5SWQgJiAweDAwMDEpOyAgICAvKiBGb3IgS2V5IElkIGFuZCByZXNlcnZlZCBmaWVsZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMF0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMV0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzVdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNl0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMl0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzddID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rOF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbM10gPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDE2OyAgLyogTUlDICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICB9IC8qIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKSAqLworCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICAgICAgeworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgICAgICAgICBpZiggd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0ud3BhU3RhdGUgPj0gWk1fU1RBX1dQQV9TVEFURV9QS19PSyB8fCB3ZC0+c3RhLndwYVN0YXRlID49IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaXNVbmljYXN0ID0gMSA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKGRhWzBdJiAweDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1VuaWNhc3QgPSAwIDsgLy8gTm90IHVuaWNhc3QgLCBpcyBicm9hZGNhc3QKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLmlic3NXcGEyUHNrID09IDEgKQorICAgICAgICAgICAgICAgICAgICB7IC8qIFRoZSBJViBvcmRlciBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiB1bmljYXN0IGFuZCBicm9hZGNhc3QgISAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1VuaWNhc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2MTYgPSAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdjMyID0gJndkLT5zdGEub3Bwb3NpdGVJbmZvW3VzZXJJZHhdLml2MzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYxNiA9ICZ3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYzMiA9ICZ3ZC0+c3RhLml2MzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdjE2ID0gJndkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl2MzIgPSAmd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKCppdjE2KSsrOworICAgICAgICAgICAgICAgICAgICBpZiAoICppdjE2ID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqaXYzMisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5lbmNyeU1vZGUgPT0gWk1fQUVTIHx8IHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX0FFUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIlN0YXRpb24gZW5jcnlwdGlvbiBtb2RlIGlzIEFFUy1DQ01QXG4iKSA7CisgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAoKml2MTYpOworICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAodThfdCkgKCgqaXYxNikgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNVbmljYXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMCB8ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAoKml2MzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICgoKml2MzIpID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVA2NCl8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDEyOCl8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gMHgwOyAvL0lWCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSB8PSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogLS0tLS0gMjAwNzA0MDUgYWRkIGJ5IE14emVuZyAtLS0tLSAqLworICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLndwYVN0YXRlID49IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlzVW5pY2FzdCA9IDEgOworCisgICAgICAgICAgICAgICAgICAgIGlmKChkYVswXSYgMHgxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmljYXN0ID0gMCA7IC8vIE5vdCB1bmljYXN0ICwgaXMgYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLml2MTYgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYzMisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9BRVMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiU3RhdGlvbiBlbmNyeXB0aW9uIG1vZGUgaXMgQUVTLUNDTVBcbiIpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKHU4X3QpICh3ZC0+c3RhLml2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNVbmljYXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMCB8ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA4OyAgLyogTUlDICovCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fV0VQNjQpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fV0VQMTI4KXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gMHgwOyAvL0lWCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSB8PSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfSAgIC8vIEVuZCBpZiAoIGVuY0V4ZW1wdGlvbkFjdGlvblR5cGUgPT0gWk1fRU5DUllQVElPTl9FWEVNUFRfTk9fRVhFTVBUSU9OICkKKyAgICAgICAgfSAgIC8vIEVuZCBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh3ZC0+c3RhLmVuY3J5TW9kZSkKKwkgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgIGhsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYxNisrOworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5pdjE2ID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKHdkLT5zdGEuaXYxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICBiMiA9IChiMSB8IDB4MjApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgd2QtPnN0YS5pdjE2OworICAgICAgICAgICAgICAgIGIyID0gMHgyMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgIC8vbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgIGlmICggKCEoc2VxICYgMHhmKSkmJighKGZsYWcgJiAweDQpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBwbHVzTGVuICs9IDg7CisgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfS8qIGVuZCBvZiBQU0VVRE8gVEtJUCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYzMisrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA4OyAgLyogTUlDICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisgICAgICAgICAgICB9LyogZW5kIG9mIFBTRVVETyBBRVMgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgICAgICAgICAgLyogQWNjdW1sYXRlIHRoZSBQTiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMF0gKz0gMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS50eGl2WzBdID09IDAgfHwgd2QtPnN0YS50eGl2WzBdID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMl0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnR4aXZbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS50eGl2WzNdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMF07CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAod2QtPnN0YS50eGl2WzBdID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpIHdkLT5zdGEudHhpdlsxXTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMV0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis1XSA9ICh1MTZfdCkgd2QtPnN0YS50eGl2WzJdOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis2XSA9ICh1MTZfdCkgKHdkLT5zdGEudHhpdlsyXSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzddID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbM107CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzhdID0gKHUxNl90KSAod2QtPnN0YS50eGl2WzNdID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDE2OyAgLyogTUlDICovCisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA5OworCQkJCWJyZWFrOworCQkgICAgI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwkJCX0vKiBlbmQgb2Ygc3dpdGNoICovCisJCX0KKworICAgICAgICAvKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcgKi8KKworICAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKyAgICAgICAgaWYgKHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZT09MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGb3JjZSBlbmFibGUgcHJvdGVjdGlvbjogc2VsZiBjdHMgICovCisgICAgICAgICAgICAgICAgbWFjQ3RybCAmPSAweEZGRkM7CisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAgICAgLyogaWYgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlPTAgPT4gYXV0byAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTZWxmLUNUUyAqLworICAgICAgICAgICAgICAgIG1hY0N0cmwgJj0gMHhGRkZDOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKHdkLT50eE1DUyAhPSAweGZmKQorICAgIHsKKyAgICAgICAgLyogZml4ZWQgcmF0ZSAqLworCSAgICBwaHlDdHJsID0gKCh1MzJfdCl3ZC0+dHhNQ1M8PDE2KSArIHdkLT50eE1UOworICAgICAgICBtY3MgPSB3ZC0+dHhNQ1M7CisgICAgICAgIG10ID0gd2QtPnR4TVQ7CisgICAgfQorCisgICAgaWYgKG10ID09IDIpCisgICAgeworI2lmIDAKKyAgICAgICAgLyogSFQgUFQ6IDAgTWl4ZWQgbW9kZSAgICAxIEdyZWVuIGZpZWxkICovCisJICAgIGlmICh3ZC0+c3RhLnByZWFtYmxlVHlwZUhUID09IFpNX1BSRUFNQkxFX1RZUEVfR1JFRU5fRklFTEQpCisJICAgIHsKKyAgICAgICAgICAgIHBoeUN0cmwgfD0gMHg0OyAgICAgLyogQml0IDIgKi8KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qIEJhbmR3aWR0aCAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKQorICAgICAgICB7CisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDgwPDwxNik7ICAvKiBCSVQgMjMgKi8KKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgLyogU1RCQyAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxTVEJDPD0weDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBoeUN0cmwgfD0gKHdkLT5zdGEuaHRDdHJsU1RCQzw8MjgpOyAgIC8qIEJJVCAyMyAqLworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogU2hvcnQgR0kgKi8KKyAgICAgICAgaWYod2QtPnN0YS5odEN0cmxTRykKKyAgICAgICAgeworICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHg4MDAwPDwxNik7ICAgICAgICAgLyogQklUIDMxICovCisgICAgICAgIH0KKworICAgICAgICAvKiBUQSAqLworICAgICAgICBpZiAoICgobWNzID49MHg4KSAmJiAobWNzPD0weGYpKSAgfHwgKHdkLT5zdGEuaHRDdHJsU1RCQykgKQorICAgICAgICB7CisgICAgICAgCSAgICBwaHlDdHJsIHw9IDB4MTgwMDsgICAgICAgICAgICAgICAvKiBCSVQgMTEgMTIgKi8KKyAgICAJfQorICAgIH0KKyAgICBlbHNlIGlmKG10ID09IDEpCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICAvL2J1ZyB0aGF0IGNhdXNlIE9GRE0gcmF0ZSBiZWNvbWUgZHVwbGljYXRlIGxlZ2FjeSByYXRlCisgICAgICAgIC8qIEJhbmR3aWR0aCAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKQorICAgICAgICB7CisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDgwPDwxNik7ICAvKiBCSVQgMjMgKi8KKyAgICAgICAgICAgIG10ID0gMzsgICAgICAgICAgICAgICAgIC8qIGR1cGxpY2F0ZSBsZWdhY3kgKi8KKyAgICAgICAgICAgIHBoeUN0cmwgfD0gbXQ7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYobXQgPT0gMCkKKyAgICB7CisJLyogQ0NLIFBUOiBMZWdjeSBQcmVhbWJsZTogMSBsb25nIHByZWFtYmxlICAgIDIgc2hvcnQgcHJlYW1ibGUgKi8KKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVCkKKyAgICAgICAgeworICAgIAkgICAgICAgLy9waHlDdHJsIHw9IDB4NDsgICAgLyogQklUIDIgKi8KKyAgICAJfQorICAgIH0KKworICAgIC8qIFRBICovCisgICAgaWYgKHdkLT5zdGEuZGVmYXVsdFRBKQorICAgIHsKKyAgICAgICAgcGh5Q3RybCB8PSAweDEwMDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBoeUN0cmwgfD0gMHgwODAwOworICAgIH0KKworICAgIC8vR2V0IEN1cnJlbnRUeFJhdGUgLS0gQ1dZYW5nKCspCisgICAgaWYgKChtdCA9PSAwKSB8fCAobXQgPT0gMSkpIC8vQixHIFJhdGUKKyAgICB7CisgICAgICAgIGlmIChtY3MgPCAxNikKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZUJHW21jc107CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobXQgPT0gMikKKyAgICB7CisgICAgICAgIGlmIChtY3MgPCAxNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID09IFpNX0JBTkRXSURUSF80ME1IWikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocGh5Q3RybCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBHSSA0MCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IHpjSW5kZXh0b1JhdGVONDBTW21jc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgR0kgNDAgTUh6IE1JTU8gUmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjQwTFttY3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocGh5Q3RybCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBHSSAyMCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IHpjSW5kZXh0b1JhdGVOMjBTW21jc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgR0kgMjAgTUh6IE1JTU8gUmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjIwTFttY3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vODAyLjExIGhlYWRlcihpbmNsdWRlIElWKSA9IChobGVuPDwxKS04CisgICAgLy9ldGhlcm5ldCBmcmFtZSA9IGxlbgorICAgIC8vc25hcCArIG1pYyA9IHBsdXNMZW4KKyAgICAvL2V0aGVybmV0IGhlYWRlciA9IG1pbnVzTGVuCisgICAgLy9pY3YgPSBpY3ZMZW4KKyAgICAvL2NyYzMyID0gNAorICAgIC8vbGVuZ3RoPTgwMi4xMSBoZWFkZXIrc25hcCsoZXRoZXJuZXQgZnJhbWUtZXRoZXJuZXQgaGVhZGVyKSttaWMraWN2K2NyYzMyCisgICAgaGVhZGVyWzBdID0gKChobGVuPDwxKS04KStwbHVzTGVuKyhsZW4tbWludXNMZW4pK2ljdkxlbis0OyAgLy9MZW5ndGgKKworICAgIC8vIGhlYWRlclswXSA6IE1QRFUgTGVuZ3RocworICAgIGlmICgoaGVhZGVyWzZdICYgMHgxKSAhPSAweDEpIC8vIFVuaWNhc3QgRnJhbWUKKyAgICB7CisgICAgICAgIGlmIChoZWFkZXJbMF0gPj0gd2QtPnJ0c1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5hYmxlIFJUUyAqLworICAgICAgICAgICAgbWFjQ3RybCB8PSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgdGtpcEZyYW1lT2Zmc2V0ID0gODsKKworICAgIGlmKCB3ZC0+c3RhLkVuYWJsZUhUICE9IDEgKQorICAgIHsgLy8gQWdncmVnYXRpb24gc2hvdWxkIG5vdCBiZSBmcmFnbWVudGVkICEKKyAgICAgICAgaWYgKCBoZWFkZXJbMF0gPiAoIHdkLT5mcmFnVGhyZXNob2xkICsgdGtpcEZyYW1lT2Zmc2V0ICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gTmVlZCB0byBiZSBmcmFnbWVudGVkICEgIQorICAgICAgICB9CisgICAgfQorCisgICAgLy9pZiAoIHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1RLSVAgKQorICAgIC8veworICAgIC8vICAgIHptX2RlYnVnX21zZzEoImN0cmwgbGVuZ3RoID0gIiwgaGVhZGVyWzBdKTsKKyAgICAvL30KKworICAgIC8vTUFDIGNvbnRyb2wKKyAgICBpZiAocmF0ZVByb2JpbmdGbGFnICE9IDApCisgICAgeworICAgICAgICBtYWNDdHJsIHw9IDB4ODAwMDsKKyAgICB9CisgICAgaGVhZGVyWzFdID0gbWFjQ3RybDsKKyAgICAvL1BIWSBjb250cm9sIEwKKyAgICBoZWFkZXJbMl0gPSAodTE2X3QpICgocGh5Q3RybCYweGZmZmYpIHwgMHg3MDAgfCAoemNVcFRvQWNbdXAmMHg3XTw8MTMpKTsKKyAgICAvL1BIWSBjb250cm9sIEgKKyAgICBoZWFkZXJbM10gPSAodTE2X3QpICgocGh5Q3RybD4+MTYpIHwgMHg3MDApOworCisgICAgaWYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbikKKyAgICB7CisgICAgICAgIC8qIGZvcmNlIGVuYWJsZSBhZ2dyZWdhdGlvbiAqLworICAgICAgICBpZiAod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0yICYmICEoaGVhZGVyWzZdJjB4MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKGhlYWRlclsyXSAmIDB4MykgPT0gMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIGFnZ3JlZ2F0aW9uICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzFdIHw9IDB4MjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAvKiBpZiB3ZC0+ZW5hYmxlQWdncmVnYXRpb249MCA9PiBhdXRvICovCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgaWYgKHdkLT5hZGRiYUNvbXBsZXRlKSB7CisgICAgICAgICNpZmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgICAgIGlmICghKGhlYWRlcls2XSYweDEpICYmICFyYXRlUHJvYmluZ0ZsYWcgJiYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbiAhPSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoaGVhZGVyWzJdICYgMHgzKSA9PSAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBVbmljYXN0IGZyYW1lIHdpdGggSFQgcmF0ZSA9PiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgc29mdHdhcmUgZW5jcnlwdGlvbiBpbiBzaW5nbGUgcGFja2V0IG1vZGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfVEtJUF9FTkNSWV9FTikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYWdncmVnYXRpb24gZ3JvdXAgYml0cyBwZXIgQUMgKi8KKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzFdIHw9ICgweDIwIHwgKHpjVXBUb0FjW3VwJjB4N108PDEwKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaXNzdWU6IC1QQjQyIEVuYWJsZSBSVFMvQ1RTIHRvIHByZXZlbnQgT1dMIFR4IGhhbmcgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgT3dsIEFwLCBlbmFibGUgUlRTL0NUUyBwcm90ZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLmF0aE93bEFwID09IDEpIHx8ICh3ZC0+c3RhLlJUU0luQUdHTW9kZSA9PSBUUlVFKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzFdICY9IDB4ZmZmYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gMHgxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUklGUyA6IHdvcmthcm91bmQgODU0VCBSVFMvQ1RTICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQxMyA6IFRJIGVuYWJsZSBSSUZTICovCisgICAgICAgICAgICAgICAgICAgICAgICAvL2hlYWRlclsxXSB8PSAweDIwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2Vsc2UKKyAgICAgICAgLyoKKyAgICAgICAgICogYWdncmVnYXRpb24gYW1wZHVJbmRpY2F0aW9uIGNvbnRyb2wKKyAgICAgICAgICovCisgICAgICAgIGlmIChhZ2dDb250cm9sICYmIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb249PTAgJiYgIShoZWFkZXJbNl0mMHgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChoZWFkZXJbMl0gJiAweDMpID09IDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGFnZ3JlZ2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDIwOworICAgICAgICAgICAgICAgICAgICBpZiAoWk1fQUdHX0xBU1RfTVBEVSA9PSBhZ2dDb250cm9sLT5hbXBkdUluZGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibm8gYWdnciwgaGVhZGVyWzJdJjB4MyA9ICIsaGVhZGVyWzJdICYgMHgzKQorICAgICAgICAgICAgICAgICAgICBhZ2dDb250cm9sLT5hZ2dFbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJubyBhZ2dyLCB3ZC0+ZW5hYmxlQWdncmVnYXRpb24gPSAiLCB3ZC0+ZW5hYmxlQWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsICFoZWFkZXJbNl0mMHgxID0gIiwhKGhlYWRlcls2XSYweDEpKTsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLT5hZ2dFbmFibGVkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICAjaWZkZWYgWk1fQUdHUl9CSVRfT04KKyAgICAgICAgaWYgKCEoaGVhZGVyWzZdJjB4MSkgJiYgIXJhdGVQcm9iaW5nRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoaGVhZGVyWzJdICYgMHgzKSA9PSAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBVbmljYXN0IGZyYW1lIHdpdGggSFQgcmF0ZSA9PiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICAvKiBTZXQgYWdncmVnYXRpb24gZ3JvdXAgYml0cyBwZXIgQUMgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gKDB4MjAgfCAoemNVcFRvQWNbdXAmMHg3XTw8MTApKTsKKworICAgICAgICAgICAgICAgIC8vaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUlRTL0NUUyB0byBwcmV2ZW50IE9XTCBUeCBoYW5nIHVwICovCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSAmPSAweGZmZmM7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIChobGVuPDwxKTsKK30KKworCit1MTZfdCB6ZlR4R2VuTW1IZWFkZXIoemRldl90KiBkZXYsIHU4X3QgZnJhbWVUeXBlLCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICAvL3UxNl90IGJvZHlMZW47CisgICAgdThfdCAgaGxlbiA9IDMyOyAgICAgICAgLy8gTUFDIGN0cmwgKyBQSFkgY3RybCArIDgwMi4xMSBNTSBoZWFkZXIKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcgKi8KKyAgICAvL2JvZHlMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBoZWFkZXJbMF0gPSAyNCtsZW4rNDsgICAvL0xlbmd0aAorICAgIGlmICgoZHN0WzBdICYgMHgxKSAhPSAwKSAvL0Jyb2FkY2FzdCwgbXVsdGljYXN0IGZyYW1lcworICAgIHsKKyAgICAgICAgaGVhZGVyWzFdID0gMHhjOyAgICAgICAgICAgIC8vTUFDIGNvbnRyb2wsIGJhY2tvZmYgKyBub2FjaworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZWFkZXJbMV0gPSAweDg7ICAgICAgICAgICAgLy9NQUMgY29udHJvbCwgYmFja29mZiArIChhY2spCisgICAgfQorICAgIC8qIER1YWxiYW5kIE1hbmFnZW1lbnQgZnJhbWUgdHggUmF0ZSAqLworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLIDFNICovCisgICAgICAgICAgICBoZWFkZXJbMl0gPSAweDBmMDA7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgICAgICAgICAgaGVhZGVyWzNdID0gMHgwMDAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyA2TSAqLworICAgICAgICAgICAgaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MDAwQjsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyAyTSAqLworICAgICAgICAgICAgaGVhZGVyWzJdID0gMHgwZjAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MDAwMTsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgNk0gKi8KKyAgICAgICAgICAgIGhlYWRlclsyXSA9IDB4MGYwMTsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgICAgICBoZWFkZXJbM10gPSAweDAwMEI7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorICAgICAgICB9CisgICAgfQorICAgIC8qIEdlbmVyYXRlIFdMQU4gaGVhZGVyICovCisgICAgLyogRnJhbWUgY29udHJvbCAqLworICAgIGhlYWRlcls0KzBdID0gZnJhbWVUeXBlOworICAgIC8qIER1cmF0aW9uICovCisgICAgaGVhZGVyWzQrMV0gPSAwOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRICkKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyWzQrOF0gPSAweEZGRkY7CisgICAgICAgICAgICBoZWFkZXJbNCs5XSA9IDB4RkZGRjsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IDB4RkZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9CQSApIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgICAgIGhlYWRlcls0KzldID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IHdkLT5zdGEuYnNzaWRbMl07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICAgICAgaGVhZGVyWzQrOF0gPSAwOworICAgICAgICBoZWFkZXJbNCs5XSA9IDA7CisgICAgICAgIGhlYWRlcls0KzEwXSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICBoZWFkZXJbNCs4XSA9IHdkLT5zdGEuYnNzaWRbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPnN0YS5ic3NpZFsyXTsKKworICAgICAgICBpZiAoIGZyYW1lVHlwZSA9PSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHB1dCBBVElNIHRvIHF1ZXVlIDV0aCAqLworICAgICAgICAgICAgLy9oZWFkZXJbMl0gfD0gKFpNX0JJVF8xM3xaTV9CSVRfMTQpOworICAgICAgICAgICAgaGVhZGVyWzJdIHw9IFpNX0JJVF8xNTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIC8qIEFkZHJlc3MgMyA9IEJTU0lEICovCisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPm1hY0FkZHJbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPm1hY0FkZHJbMV07CisjaWZkZWYgWk1fVkFQTU9ERV9NVUxUSUxFX1NTSUQKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorICAgICAgICAvL2lmIGluIHNjYW4sIG11c3Qgc2V0IGFkZHJlc3MgMyB0byBicm9hZGNhc3QgYmVjYXVzZSBvZiBzb21lIGFwIHdvdWxkIGNhcmUgdGhpcworICAgICAgICAvL2lmICgod2QtPmhlYXJ0QmVhdE5vdGlmaWNhdGlvbiAmIFpNX0JTU0lEX0xJU1RfU0NBTikKKyAgICAgICAgLy8gICAgICAgID09IFpNX0JTU0lEX0xJU1RfU0NBTikKKyAgICAgICAgLy9pZiBGcmFtZVR5cGUgaXMgUHJvYmUgUmVxdWVzdCwgQWRkcmVzczMgc2hvdWxkIGJlIGJvcmFkY2FzdAorICAgICAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSkKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyWzQrOF0gPSAweEZGRkY7CisgICAgICAgICAgICBoZWFkZXJbNCs5XSA9IDB4RkZGRjsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IDB4RkZGRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFkZHJlc3MgMSA9IERBICovCisgICAgaGVhZGVyWzQrMl0gPSBkc3RbMF07CisgICAgaGVhZGVyWzQrM10gPSBkc3RbMV07CisgICAgaGVhZGVyWzQrNF0gPSBkc3RbMl07CisKKyAgICAvKiBBZGRyZXNzIDIgPSBTQSAqLworICAgIGhlYWRlcls0KzVdID0gd2QtPm1hY0FkZHJbMF07CisgICAgaGVhZGVyWzQrNl0gPSB3ZC0+bWFjQWRkclsxXTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICAgICAgaGVhZGVyWzQrN10gPSB3ZC0+bWFjQWRkclsyXSArICh2YXA8PDgpOyAvL1ZBUAorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl07CisgICAgfQorCisgICAgLyogU2VxdWVuY2UgQ29udHJvbCAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaGVhZGVyWzQrMTFdID0gKCh3ZC0+bW1zZXErKyk8PDQpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCApCisgICAgeworICAgICAgICAvKlFvcyBDb250cm9sKi8KKyAgICAgICAgaGVhZGVyWzQrMTJdID0gMHgwOworICAgICAgICBobGVuKz0yOworICAgICAgICBoZWFkZXJbMF0rPTI7CisgICAgfQorCisgICAgaWYgKCBlbmNyeXB0ICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyWzE2XSA9IDB4MDsgICAvL0lWCisgICAgICAgICAgICAgICAgaGVhZGVyWzE3XSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgIGhlYWRlclsxN10gfD0gKCgodTE2X3QpIHdkLT5zdGEua2V5SWQpIDw8IDE0KTsKKyAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbMF0gKz0gODsgICAgICAgICAvLyBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDQwOyAgICAgIC8vIGVuYWJsZSBlbmNyeXB0aW9uIG9uIG1hY0N0cmwKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbmFibGUgSFcgZHVyYXRpb24KKyAgICBpZiAoIGZyYW1lVHlwZSAhPSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMICkKKyAgICB7CisgICAgICAgIGhlYWRlclsxXSB8PSAweDIwMDsKKyAgICB9CisKKyAgICByZXR1cm4gaGxlbjsKK30KKwordm9pZCB6ZkluaXRNYWNBcE1vZGUoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0FQLCAod2QtPmJlYWNvbkludGVydmFsL3dkLT5hcC52YXBOdW1iZXIpLCAxLCAwKTsKKworICAgIC8qIEFQIG1vZGUgKi8KKyAgICB6ZkhwU2V0QXBTdGFNb2RlKGRldiwgWk1fSEFMXzgwMjExX01PREVfQVApOworCisgICAgLyogVkFQIHRlc3QgY29kZSAqLworICAgIC8qIEFQICsgVkFQIG1vZGUgKi8KKyAgICBpZiAod2QtPmFwLnZhcE51bWJlciA+PSAyKQorICAgIHsKKyAgICAgICAgZm9yIChpPTE7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgod2QtPmFwLmFwQml0bWFwID4+IGkpICYgMHgxKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IG1hY1szXTsKKyAgICAgICAgICAgICAgICBtYWNbMF0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICAgICAgICAgICAgICBtYWNbMV0gPSB3ZC0+bWFjQWRkclsxXTsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICAgICAgICAgIG1hY1syXSA9IHdkLT5tYWNBZGRyWzJdOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgICAgICAgICAgICAgbWFjWzJdID0gd2QtPm1hY0FkZHJbMl0gKyAoaTw8OCk7IC8vVkFQCisjZW5kaWYKKyAgICAgICAgICAgICAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIG1hYywgaSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJhc2ljIHJhdGUgc2V0dGluZyAqLworICAgIHpmSHBTZXRCYXNpY1JhdGVTZXQoZGV2LCB3ZC0+YlJhdGVCYXNpYywgd2QtPmdSYXRlQmFzaWMpOworCisgICAgLyogU2V0IFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIEFQIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMSk7CisKKyAgICByZXR1cm47Cit9CisKK3UxNl90IHpmQ2hHZXROZXh0Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90KiBwYlBhc3NpdmUpCit7CisgICAgdThfdCAgIGk7CisgICAgdThfdCAgIGJQYXNzaXZlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQXZvaWQgTlVMTCB2YWx1ZSAqLworICAgIGlmICggcGJQYXNzaXZlID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGJQYXNzaXZlID0gJmJQYXNzaXZlOworICAgIH0KKworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSA9PSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQtMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYlBhc3NpdmUgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkNoR2V0Rmlyc3RDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90KiBwYlBhc3NpdmUpCit7CisgICAgdThfdCAgIGJQYXNzaXZlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQXZvaWQgTlVMTCB2YWx1ZSAqLworICAgIGlmICggcGJQYXNzaXZlID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGJQYXNzaXZlID0gJmJQYXNzaXZlOworICAgIH0KKworICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFswXS5jaGFubmVsRmxhZ3MgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgIHsKKyAgICAgICAgKnBiUGFzc2l2ZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbMF0uY2hhbm5lbDsKK30KKwordTE2X3QgemZDaEdldEZpcnN0MkdoekNoYW5uZWwoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yKCBpPTA7IGk8d2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPCAzMDAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZmluZCB0aGUgZmlyc3QgMkdoeiBjaGFubmVsICovCisgICAgICAgICAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENhbiBub3QgZmluZCBhbnkgMkdoeiBjaGFubmVsICovCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmQ2hHZXRGaXJzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbmQgdGhlIGZpcnN0IDVHaHogY2hhbm5lbCAqLworICAgICAgICAgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDYW4gbm90IGZpbmQgYW55IDVHaHogY2hhbm5lbCAqLworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkNoR2V0TGFzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSkKK3sKKyAgICB1OF90ICAgYlBhc3NpdmU7CisgICAgdThfdCAgIENoYW5uZWxJbmRleDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIENoYW5uZWxJbmRleCA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250LTE7CisKKyAgICAvKiBBdm9pZCBOVUxMIHZhbHVlICovCisgICAgaWYgKCBwYlBhc3NpdmUgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYlBhc3NpdmUgPSAmYlBhc3NpdmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtDaGFubmVsSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgIHsKKyAgICAgICAgKnBiUGFzc2l2ZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbQ2hhbm5lbEluZGV4XS5jaGFubmVsOworfQorCit1MTZfdCB6ZkNoR2V0TGFzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICAgaTsKKyAgICB1MTZfdCAgIGxhc3Q1R2h6ZnJlcXVlbmN5OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbGFzdDVHaHpmcmVxdWVuY3kgPSAwOworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3Q1R2h6ZnJlcXVlbmN5ID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXN0NUdoemZyZXF1ZW5jeTsKK30KKworLyogZnJlcUJhbmQgPSAwID0+IGF1dG8gY2hlY2sgICAqLworLyogICAgICAgICAgPSAxID0+IDIuNCBHSHogYmFuZCAqLworLyogICAgICAgICAgPSAyID0+IDUgR0h6IGJhbmQgICAqLwordTE2X3QgemZDaE51bVRvRnJlcSh6ZGV2X3QqIGRldiwgdThfdCBjaCwgdThfdCBmcmVxQmFuZCkKK3sKKyAgICB1MTZfdCBmcmVxID0gMHhmZmZmOworCisgICAgaWYgKCBmcmVxQmFuZCA9PSAwICkKKyAgICB7CisgICAgICAgIGlmIChjaCA+IDE0KQorICAgICAgICB7ICAgLyogYWRhcHRlciBpcyBhdCA1IEdIeiBiYW5kICovCisgICAgICAgICAgICBmcmVxQmFuZCA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxQmFuZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZyZXFCYW5kID09IDIgKQorICAgIHsgICAvKiB0aGUgY2hhbm5lbCBiZWxvbmdzIHRvIDUgR0h6IGJhbmQgKi8KKyAgICAgICAgaWYgKCAoY2ggPj0gMTg0KSYmKGNoIDw9IDE5NikgKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gNDAwMCArIGNoKjU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gNTAwMCArIGNoKjU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiB0aGUgY2hhbm5lbCBiZWxvbmdzIHRvIDIuNCBHSHogYmFuZCAqLworICAgICAgICBpZiAoIGNoID09IDE0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlcSA9IFpNX0NIX0dfMTQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gWk1fQ0hfR18xICsgKGNoLTEpKjU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZnJlcTsKK30KKwordThfdCB6ZkNoRnJlcVRvTnVtKHUxNl90IGZyZXEsIHU4X3QqIHBiSXM1R0JhbmQpCit7CisgICAgdThfdCAgIGNoOworICAgIHU4X3QgICBJczVHQmFuZDsKKworICAgIC8qIHRvIGF2b2lkIE5VTEwgdmFsdWUgKi8KKyAgICBpZiAoIHBiSXM1R0JhbmQgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYklzNUdCYW5kID0gJklzNUdCYW5kOworICAgIH0KKworICAgICpwYklzNUdCYW5kID0gRkFMU0U7CisKKyAgICBpZiAoIGZyZXEgPT0gWk1fQ0hfR18xNCApCisgICAgeworICAgICAgICBjaCA9IDE0OworICAgIH0KKyAgICBlbHNlIGlmICggZnJlcSA8IDQwMDAgKQorICAgIHsKKyAgICAgICAgY2ggPSAoZnJlcSAtIFpNX0NIX0dfMSkgLyA1ICsgMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZyZXEgPCA1MDAwICkKKyAgICB7CisgICAgICAgIGNoID0gKGZyZXEgLSA0MDAwKSAvIDU7CisgICAgICAgICpwYklzNUdCYW5kID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2ggPSAoZnJlcSAtIDUwMDApIC8gNTsKKyAgICAgICAgKnBiSXM1R0JhbmQgPSBUUlVFOworICAgIH0KKworICAgIHJldHVybiBjaDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQzNzlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbS5jCkBAIC0wLDAgKzEsMjE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogbW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBjb21tb24gZnVuY3Rpb25zIGZvciBoYW5kbGUgbWFuYWdlbWVudCAgICAgKi8KKy8qICAgICAgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgIi4uL2hhbC9ocHJlZy5oIgorCisvKiBUT0RPIDogcHV0IGFsbCBjb25zdGFudCB0YWJsZXMgdG8gYSBmaWxlICovCitjb25zdCB1OF90IHpnMTFiUmF0ZVRibFs0XSA9IHsyLCA0LCAxMSwgMjJ9OworY29uc3QgdThfdCB6ZzExZ1JhdGVUYmxbOF0gPSB7MTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOH07CisKKy8qIDB4ZmYgPT4gZWxlbWVudCBkb2VzIG5vdCBleGlzdCAqLworY29uc3QgdThfdCB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtdID0KK3sKKyAgICA0LCAgICAgIC8qICAwIDogYXNvYyByZXEgKi8KKyAgICA2LCAgICAgIC8qICAxIDogYXNvYyByc3AgKi8KKyAgICAxMCwgICAgIC8qICAyIDogcmVhc29jIHJlcSovCisgICAgNiwgICAgICAvKiAgMyA6IHJlYXNvYyByc3AgKi8KKyAgICAwLCAgICAgIC8qICA0IDogcHJvYmUgcmVxICovCisgICAgMTIsICAgICAvKiAgNSA6IHByb2JlIHJzcCAqLworICAgIDB4ZmYsICAgLyogIDYgOiByZXNlcnZlZCAqLworICAgIDB4ZmYsICAgLyogIDcgOiByZXNlcnZlZCAqLworICAgIDEyLCAgICAgLyogIDggOiBiZWFjb24gKi8KKyAgICA0LCAgICAgIC8qICA5IDogQVRJTSAqLworICAgIDB4ZmYsICAgLyogMTAgOiBkaXNhc29jICovCisgICAgNiwgICAgICAvKiAxMSA6IGF1dGggKi8KKyAgICAweGZmLCAgIC8qIDEyIDogZGVhdXRoICovCisgICAgNCwgICAgICAvKiAxMyA6IGFjdGlvbiAqLworICAgIDB4ZmYsICAgLyogMTQgOiByZXNlcnZlZCAqLworICAgIDB4ZmYsICAgLyogMTUgOiByZXNlcnZlZCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmluZEVsZW1lbnQgICAgICAgICAgICAgICAqLworLyogICAgICBGaW5kIGEgc3BlY2lmaWMgZWxlbWVudCBpbiBtYW5hZ2VtZW50IGZyYW1lICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogbWFuYWdlbWVudCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVpZCA6IHRhcmdldCBlbGVtZW50IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ5dGUgb2Zmc2V0IG9mIHRhcmdldCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvciAweGZmZmYgaWYgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZGaW5kRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgZWlkKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZCwgSFRFaWQ9MDsKKyAgICB1OF90IG91aVs0XSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAxfTsKKyAgICB1OF90IG91aTExblszXSA9IHsweDAwLDB4OTAsMHg0Q307CisgICAgdThfdCBIVFR5cGUgPSAwOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICAvLyBqaGxlZSBIVCAwCisKKyAgICBpZiAoKGVpZCA9PSBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSB8fAorICAgICAgICAoZWlkID09IFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKQorICAgIHsKKyAgICAgICAgSFRFaWQgPSBlaWQ7CisgICAgICAgIGVpZCA9IFpNX1dMQU5fRUlEX1dQQV9JRTsKKyAgICAgICAgSFRUeXBlID0gMTsKKyAgICB9CisKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IGVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCAmJiBlaWQgIT0gWk1fV0xBTl9FSURfU1NJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWlkID09IFpNX1dMQU5fRUlEX1dQQV9JRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYXZvaWQgc3RhIHRvIGJlIHRob3VnaHQgdXNlIDExbiB3aGVuIGZpbmQgYSBXUEFfSUUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMCkgJiYgemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIG91aSwgb2Zmc2V0KzIsIDQpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgICAgIC8vIENXWWFuZygrKQorCisgICAgICAgICAgICAgICAgaWYgKChIVFR5cGUgPT0gMSkgJiYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1Ziwgb3VpMTFuLCBvZmZzZXQrMiwgMykgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpID09IEhURWlkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIDU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgICNpZiAxCisgICAgICAgIGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgICNlbHNlCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmluZFdpZmlFbGVtZW50ICAgICAgICAgICAqLworLyogICAgICBGaW5kIGEgc3BlY2lmaWMgV2lmaSBlbGVtZW50IGluIG1hbmFnZW1lbnQgZnJhbWUgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogbWFuYWdlbWVudCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiBPVUkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdWJUeXBlIDogT1VJIHN1YnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBieXRlIG9mZnNldCBvZiB0YXJnZXQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3IgMHhmZmZmIGlmIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmRmluZFdpZmlFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJpbmdvICovCisgICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4NTApCisgICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweEYyKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KSkgPT0gdHlwZSkpCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN1YnR5cGUgIT0gMHhmZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpID09IHN1YnR5cGUgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOworICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZlJlbW92ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCBlaWQpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgIEhURWlkID0gMDsKKyAgICB1OF90ICBvdWlbNF0gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMX07CisgICAgdThfdCAgb3VpMTFuWzNdID0gezB4MDAsMHg5MCwweDRDfTsKKyAgICB1OF90ICBIVFR5cGUgPSAwOworCisgICAgaWYgKChlaWQgPT0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkgfHwKKyAgICAgICAgKGVpZCA9PSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkKKyAgICB7CisgICAgICAgIEhURWlkID0gZWlkOworICAgICAgICBlaWQgPSBaTV9XTEFOX0VJRF9XUEFfSUU7CisgICAgICAgIEhUVHlwZSA9IDE7CisgICAgfQorCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpCisgICAgeworICAgICAgICBlbGVuID0gKihidWYrb2Zmc2V0KzEpOworCisgICAgICAgIGlmICgqKGJ1ZitvZmZzZXQpID09IGVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBlaWQgPT0gWk1fV0xBTl9FSURfV1BBX0lFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrMikgPT0gb3VpWzBdKQorICAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWlbMV0pCisgICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzQpID09IG91aVsyXSkKKyAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNSkgPT0gb3VpWzNdKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggKEhUVHlwZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzIpID09IG91aTExblswXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWkxMW5bMV0pCisgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNCkgPT0gb3VpMTFuWzJdKQorICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzUpID09IEhURWlkKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzaXplLWVsZW4tMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3UxNl90IHpmVXBkYXRlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90KiB1cGRhdGVlaWQpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBlbGVuOworCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICAgICAgZWxlbiA9ICooYnVmK29mZnNldCsxKTsKKworICAgICAgICBpZiAoKihidWYrb2Zmc2V0KSA9PSB1cGRhdGVlaWRbMF0pIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVlaWRbMV0gPD0gZWxlbikgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0LCB1cGRhdGVlaWQsIHVwZGF0ZWVpZFsxXSsyKTsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZS0oZWxlbi11cGRhdGVlaWRbMV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQsIHVwZGF0ZWVpZCwgdXBkYXRlZWlkWzFdKzIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUrKHVwZGF0ZWVpZFsxXS1lbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKwordTE2X3QgemZGaW5kU3VwZXJHRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSkKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCBzdXBlcl9mZWF0dXJlOworICAgIHU4X3Qgb3VpU3VwZXJHWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDEsIDB4MDEsIDB4MDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQorICAgIHsKKyAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCisgICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWlTdXBlckcsIG9mZnNldCsyLCA2KSAmJiAoIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSA+PSA2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBlcl9mZWF0dXJlIDA6dXNlRmFzdEZyYW1lLCAxOnVzZUNvbXByZXNzaW9uLCAyOnVzZVR1cmJvUHJpbWUgKi8KKyAgICAgICAgICAgICAgICBzdXBlcl9mZWF0dXJlPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgaWYgKChzdXBlcl9mZWF0dXJlICYgMHgwMSkgfHwgKHN1cGVyX2ZlYXR1cmUgJiAweDAyKSB8fCAoc3VwZXJfZmVhdHVyZSAmIDB4MDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgI2lmIDEKKyAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTE2X3QgemZGaW5kWFJFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZDsKKyAgICB1OF90IG91aXhyWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDMsIDB4MDEsIDB4MDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQorICAgIHsKKyAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCisgICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWl4ciwgb2Zmc2V0KzIsIDYpICYmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpID49IDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgI2lmIDEKKyAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVN1cHBvcnRSYXRlICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBTdXBwb3J0IFJhdGUgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICBlaWQgOiBlbGVtZW50IElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmF0ZVNldCA6ICBDQ0sgb3IgT0ZETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGVpZCwgdThfdCByYXRlU2V0KQoreworICAgIHU4X3QgbGVuID0gMDsKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy9pZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gb2Zmc2V0OworICAgIC8vfQorCisgICAgLyogSW5mb3JtYXRpb24gOiBTdXBwb3J0IFJhdGUgKi8KKyAgICBpZiAoIHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfQ0NLICkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+YlJhdGUgJiAoMHgxPDxpKSkgPT0gKDB4MTw8aSkpCisgICAgICAgICAgICAvL2lmICgoMHhmICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrbGVuKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemcxMWJSYXRlVGJsW2ldKygod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKSk7CisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfT0ZETSApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgLy9pZiAoKDB4ZmYgJiAoMHgxPDxpKSkgPT0gKDB4MTw8aSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtsZW4rMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZzExZ1JhdGVUYmxbaV0rKCh3ZC0+Z1JhdGVCYXNpYyAmICgweDE8PGkpKTw8KDctaSkpKTsKKyAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZW4gPiAwKQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBJRCAqLworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCBlaWQpOworCisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrMSwgbGVuKTsKKworICAgICAgICAvKiBSZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgb2Zmc2V0ICs9ICgyK2xlbik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZURzICAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBEUyB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9EUyk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisKKyAgICAvKiBJbmZvcm1hdGlvbiA6IERTICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCkpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZNbUFkZEllRXJwICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IEVSUCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmTW1BZGRJZUVycCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9FUlApOworCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDEpOworCisgICAgLyogSW5mb3JtYXRpb24gOiBFUlAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5lcnBFbGVtZW50KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVdwYSAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBXUEEgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgaW50IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgLy96bXdfaW50dHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIC8vem13X2ludHR4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+YXAud3BhTGVuKTsKKyAgICBmb3IoaSA9IDA7IGkgPCB3ZC0+YXAud3BhTGVuW2FwSWRdOyBpKyspCisgICAgeworICAgICAgICAvKiBJbmZvcm1hdGlvbiA6IFdQQSAqLworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC53cGFJZVthcElkXVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRIVENhcGFiaWxpdHkgICAgICAgICAqLworLyogICAgICBBZGQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgICAgMjAwNi4wNiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHU4X3QgT1VJWzNdID0gezB4MCwweDkwLDB4NEN9OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBQcm9iIElEICovCisgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9XUEFfSUUpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkxlbmd0aCArIDQpOworCisgICAgICAgIC8qIE9VSSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkVsZW1lbnRJRCk7CisKKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5CeXRlW2krMl0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCArIDQpOworCisgICAgICAgIC8qIE9VSSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuRGF0YS5FbGVtZW50SUQpOworCisgICAgICAgIC8qIEhUIENhcGFiaWxpdHkgRGF0YSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisKK3UxNl90IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIC8vdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFByb2IgSUQgKi8KKyAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5IVENhcC5CeXRlW2krMl0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkgICAqLworLyogICAgICBBZGQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgICAgMjAwNi4wNiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFByb2IgSUQgKi8KKyAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CisKKyAgICAgICAgLyogT1VJIERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CisKKyAgICAgICAgLyogT1VJIERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5FeHRIVENhcC5EYXRhLkVsZW1lbnRJRCk7CisKKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuRXh0SFRDYXAuQnl0ZVtpKzJdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZSAgICAgICAgICAgICAgICovCisvKiAgICAgIFNlbmQgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmcmFtZVR5cGUgOiBtYW5hZ2VtZW50IGZyYW1lIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZHN0IDogZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHAxIDogcGFyYW1ldGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwMiA6IHBhcmFtZXRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcDMgOiBwYXJhbWV0ZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHByb2JlIHJlcSA6IHAxPT4gYldpdGhTU0lELCBwMj0+UiwgcDM9PlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwcm9iZSByc3AgOiBwMT0+UiwgcDI9PlIsIHAzPT5WQVAgSUQoQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZGVhdXRoIDogcDE9PlJlYXNvbiBDb2RlLCBwMj0+UiwgcDM9PlZBUCBJRChBUCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERpc2Fzb2MgOiBwMT0+UmVhc29uIENvZGUsIHAyPT5SLCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgICAgICAgICovCisvKiBBVElNIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKHJlKWFzb2MgcnNwIDogcDE9PlN0YXR1cyBDb2RlLCBwMj0+QUlELCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgKi8KKy8qIGFzb2MgcmVxIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZWFzb2MgcmVxIDogcDE9PkFQIE1BQ1swXSwgcDI9PkFQIE1BQ1sxXSwgcDM9PkFQIE1BQ1syXSAgICAgICAgICAgICAqLworLyogYXV0aCA6IHAxPT5sb3c9QWxnb3JpdGhtLCBoaWdoPVRyYW5zYWN0aW9uLCBwMj0+U3RhdHVzLCBwMz0+VkFQIElEICAgKi8KK3ZvaWQgemZTZW5kTW1GcmFtZSh6ZGV2X3QqIGRldiwgdThfdCBmcmFtZVR5cGUsIHUxNl90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgdTMyX3QgcDEsIHUzMl90IHAyLCB1MzJfdCBwMykKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICAvL3UxNl90IGFkZHJUYmxTaXplOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IG9mZnNldCA9IDA7CisgICAgdTE2X3QgaGxlbiA9IDMyOworICAgIHUxNl90IGhlYWRlclsoMjQrMjUrMSkvMl07CisgICAgdTE2X3QgdmFwID0gMDsKKyAgICB1MTZfdCBpOworICAgIHU4X3QgZW5jcnlwdCA9IDA7CisgICAgdTE2X3QgYWlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzIsICJTZW5kIG1tIGZyYW1lLCB0eXBlPSIsIGZyYW1lVHlwZSk7CisgICAgLyogVEJEIDogTWF4aW11bSBzaXplIG9mIG1hbmFnbWVudCBmcmFtZSAqLworICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFsbG9jIG1tIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9SZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIHN3aXRjaCAoZnJhbWVUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgorICAgICAgICAgICAgb2Zmc2V0ID0gemZTZW5kUHJvYmVSZXEoZGV2LCBidWYsIG9mZnNldCwgKHU4X3QpIHAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJzcCIpOworICAgICAgICAgICAgLyogMjQtMzEgVGltZSBTdGFtcCA6IGhhcmR3YXJlIFdPTidUIGZpbGwgdGhpcyBmaWVsZCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzIsIDApOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCs0LCAwKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CisgICAgICAgICAgICBvZmZzZXQrPTg7CisKKyAgICAgICAgICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CisgICAgICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5hcC5jYXBhYlt2YXBdKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CisgICAgICAgICAgICAgICAgLyogU1NJRCAqLworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0pOworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKTsKKyAgICAgICAgICAgICAgICAvKiBTU0lEICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+ZnJlcXVlbmN5IDwgMzAwMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9DQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogVE9ETyChRyBJQlNTICovCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgaWYgKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5lcnBFbGVtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIEcgTW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICAgICAgICAgCSAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllRXJwKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisJCWlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworCisgICAgICAgICAgICAvKiBUT0RPIDogUlNOICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgJiYgd2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVdwYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgJiYgd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5xb3NNb2RlID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZkFwQWRkSWVXbWVQYXJhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICAvKiBUT0RPIDogTmVlZCB0byBjaGVjayBpZiBpdCBpcyBvayAqLworICAgICAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICAvL0NXWWFuZygrKQorICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZElic3NBZGRpdGlvbmFsSUUoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BVVRIIDoKKyAgICAgICAgICAgIGlmIChwMSA9PSAweDMwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsgICAgICAgIC8vIGZvciByZXNlcnZpbmcgd2VwIGhlYWRlcgorICAgICAgICAgICAgICAgIGVuY3J5cHQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBbGdvdHJpdGhtIE51bWJlciAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KShwMSYweGZmZmYpKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogVHJhbnNhY3Rpb24gTnVtYmVyICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAxPj4xNikpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisgICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAyKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoYWxsZW5nZSBUZXh0ID0+IHNoYXJlLTIgb3Igc2hhcmUtMyAqLworICAgICAgICAgICAgaWYgKHAxID09IDB4MjAwMDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHAyID09IDApIC8vU3RhdHVzID09IHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ODAxMCk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgICAgICAgICAgLyogc2hhcmUtMiA6IEFQIGdlbmVyYXRlIGNoYWxsZW5nZSB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDEyODsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuY2hhbGxlbmdlVGV4dFtpXSA9ICh1OF90KXpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLmNoYWxsZW5nZVRleHQsIG9mZnNldCwgMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDEyODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwMSA9PSAweDMwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNoYXJlLTMgOiBTVEEgcmV0dXJuIGNoYWxsZW5nZSBUZXh0ICovCisgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPnN0YS5jaGFsbGVuZ2VUZXh0LCBvZmZzZXQsIHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSA6CisgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVswXSk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CisKKyAgICAgICAgICAgIC8qIExpc3RlbiBJbnRlcnZhbCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHgwMDA1KTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogUmVhc3NvY2FpdGVkIFJlcXVlc3QgOiBDdXJyZW50IEFQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMF0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMV0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMl0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU1NJRCAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisKKworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTdXBwb3J0IFJhdGUgKi8KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gJiBaTV9CSVRfMCkgPT0gMSkKKyAgICAgICAgICAgIHsgICAvL3NwZWN0cnVtIG1hbmFnbWVudCBmbGFnIGVuYWJsZQorICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVQb3dlckNhcChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllU3VwcG9ydENoKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL29mZnNldCA9IHpmU3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgZnJhbWVUeXBlKTsKKyAgICAgICAgICAgIC8vTW92ZSB0byB3cmFwcGVyIGZ1bmN0aW9uLCBmb3IgT1MgZGlmZmVyZW5jZS0tQ1dZYW5nKG0pCisgICAgICAgICAgICAvL2ZvciB3aW5kb3dzIHdyYXBwZXIsIHpmd1N0YUFkZEllV3BhUnNuKCkgc2hvdWxkIGJlIGJlbG93OgorICAgICAgICAgICAgLy91MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldHVybiB6ZlN0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIG9mZnNldCA9IHpmd1N0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgLyogQ0VOQyAqLworICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKKyAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVDZW5jKGRldiwgYnVmLCBvZmZzZXQpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGlmICgoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9XTUVfRU5BQkxFX0JJVCkgIT0gMCkgLy9XTUUgZW5hYmxlZAorICAgICAgICAgICAgICAmJiAoKHdkLT5zdGEuYXBXbWVDYXBhYmlsaXR5ICYgMHgxKSAhPSAwKSkgLy9XTUUgQVAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+c3RhLmFwV21lQ2FwYWJpbGl0eSAmIDB4ODApICE9IDApIC8vVUFQU0QgQVAKKyAgICAgICAgICAgICAgICAgJiYgKCh3ZC0+c3RhLndtZUVuYWJsZWQgJiBaTV9TVEFfVUFQU0RfRU5BQkxFX0JJVCkgIT0gMCkpIC8vVUFQU0QgZW5hYmxlZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS53bWVRb3NJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmbmRlZiBaTV9ESVNBQkxFX0FNU0RVOEtfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgOEsgQS1NU0RVCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9NYXhBTVNEVUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgNEsgQS1NU0RVCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+QmFuZFdpZHRoNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gfkhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuQU1QRFVQYXJhbSAmPSB+SFRDQVBfTWF4UnhBTVBEVTM7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVxdWVzdCBmcmFtZSBib2R5LCBmb3IgVklTVEEgb25seQorICAgICAgICAgICAgd2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5U2l6ZSA9ICgob2Zmc2V0IC0gaGxlbikgPgorICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpPworICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU6KG9mZnNldCAtIGhsZW4pOworICAgICAgICAgICAgZm9yIChpPTA7IGk8d2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5U2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JlcUZyYW1lQm9keVtpXSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkgKyBobGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgorICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgorICAgICAgICAgICAgdmFwID0gKHUxNl90KSBwMzsKKworICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisgICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAxKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogQUlEICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAyfDB4YzAwMCkpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisKKyAgICAgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisKKyAgICAgICAgICAgIC8qIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IGlmIFdNRSBTVEEgdGhlbiBzZW5kIFdNRSBwYXJhbWV0ZXIgZWxlbWVudCAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAucW9zTW9kZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZBcEFkZEllV21lUGFyYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGpobGVlIEhUIDAKKyAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSA6CisgICAgICAgICAgICAvKiBOVUxMIGZyYW1lICovCisgICAgICAgICAgICAvKiBUT0RPIDogYWRkIHR3byBkdW1iIGJ5dGVzIHRlbXBvcmFyaWx5ICovCisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1FPU19OVUxMIDoKKyAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAxMCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9EQVRBX0ZSQU1FIDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgorICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgorICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB2YXAgPSAodTE2X3QpIHAzOworCisgICAgICAgICAgICAgIGlmICgoYWlkID0gemZBcEZpbmRTdGEoZGV2LCBkc3QpKSAhPSAweGZmZmYpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAvKiBDbGVhciBTVEEgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKworICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiRGlzQXNvY05vdGlmeShkZXYsICh1OF90Kilkc3QsIHZhcCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFJlYXNvbiBDb2RlICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpcDEpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm1hbmFnZW1lbnQgZnJhbWUgYm9keSBzaXplPSIsIG9mZnNldC1obGVuKTsKKworICAgIC8vQ29weSB3bGFuIGhlYWRlcgorICAgIHpmVHhHZW5NbUhlYWRlcihkZXYsIGZyYW1lVHlwZSwgZHN0LCBoZWFkZXIsIG9mZnNldC1obGVuLCBidWYsIHZhcCwgZW5jcnlwdCk7CisgICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCBoZWFkZXJbaV0pOworICAgIH0KKworICAgIC8qIEdldCBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8veworICAgIC8vICAgIGdvdG8gemxFcnJvcjsKKyAgICAvL30KKworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgImhsZW49IiwgaGxlbik7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLnBoeXNBZGRybFswXT0iLCBhZGRyVGJsLnBoeXNBZGRybFswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmRhdGE9IiwgYnVmLT5kYXRhKTsKKworICAgICNpZiAwCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorICAgICNlbHNlCisgICAgemZQdXRWbW1xKGRldiwgYnVmKTsKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm47CisjaWYgMAoremxFcnJvcjoKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIHJldHVybjsKKyNlbmRpZgorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NNYW5hZ2VtZW50ICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIG1hbmFnZW1lbnQgZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlByb2Nlc3NNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKSAvL0NXWWFuZyhtKQoreworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHUxNl90IHRhWzNdOworICAgIHUxNl90IHJhWzNdOworICAgIHUxNl90IHZhcCA9IDAsIGluZGV4ID0gMDsKKyAgICAvL3UxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByYVswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgIHJhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgcmFbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKworICAgIHRhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgIHRhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgIHRhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworI2lmIDEKKyAgICAgICAgdmFwID0gMDsKKyAgICAgICAgaWYgKChyYVswXSAmIDB4MSkgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQVAgOiBGaW5kIHZpcnR1YWwgQVAgKi8KKyAgICAgICAgICAgIGlmICgoaW5kZXggPSB6ZkFwRmluZFN0YShkZXYsIHRhKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9IHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udmFwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMiwgInZhcD0iLCB2YXApOworI2VuZGlmCisKKyAgICAgICAgLyogRGlzcGF0Y2ggYnkgZnJhbWUgdHlwZSAqLworICAgICAgICBzd2l0Y2ggKGZyYW1lVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkVBQ09OIDoKKyAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0JlYWNvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQXV0aChkZXYsIGJ1ZiwgdGEsIHZhcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQXNvY1JlcShkZXYsIGJ1ZiwgdGEsIHZhcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgorICAgICAgICAgICAgICAgIC8vemZBcFByb2Nlc3NBc29jUnNwKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBEZWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzRGVhdXRoKGRldiwgYnVmLCB0YSwgdmFwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBEaXNhc3NvY2lhdGlvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyA6CisgICAgICAgICAgICAgICAgemZBcFByb2Nlc3NEaXNhc29jKGRldiwgYnVmLCB0YSwgdmFwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSA6CisgICAgICAgICAgICAgICAgemZQcm9jZXNzUHJvYmVSZXEoZGV2LCBidWYsIHRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIEFjdGlvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OIDoKKyAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvL2lmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpIHx8ICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKSkKKyAgICB7CisgICAgICAgIC8qIERpc3BhdGNoIGJ5IGZyYW1lIHR5cGUgKi8KKyAgICAgICAgc3dpdGNoIChmcmFtZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCZWFjb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0JFQUNPTiA6CisgICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLworICAgICAgICAgICAgICAgIGlmICgoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJj0gfihaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSAmIFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0JlYWNvbihkZXYsIGJ1ZiwgQWRkSW5mbyk7IC8vQ1dZYW5nKG0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgorICAgICAgICAgICAgICAgIC8qIFRPRE8gOiB2YXAgcGFyYW1ldGVyIGlzIHVzZWxlc3MgaW4gU1RBIG1vZGUsIGdldCByaWQgb2YgaXQgKi8KKyAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBdXRoKGRldiwgYnVmLCB0YSwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IHZhcCBwYXJhbWV0ZXIgaXMgdXNlbGVzcyBpbiBTVEEgbW9kZSwgZ2V0IHJpZCBvZiBpdCAqLworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0Fzb2NSZXEoZGV2LCBidWYsIHRhLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBBc3NvY2lhdGlvbiByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JTUCA6CisgICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgorICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0Fzb2NSc3AoZGV2LCBidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIERlYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCA6CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRGVhdXRoZW50aWNhdGlvbiByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0RlYXV0aChkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRGlzYXNzb2NpYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgorICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkRpc2Fzc29jaWF0aW9uIHJlY2VpdmVkIik7CisgICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzRGlzYXNvYyhkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgorICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxKGRldiwgYnVmLCB0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKKyAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFuZWwgaXMgc2lsZW50IGJ1dCByZWNlaXZlIHByb2JlIHJlc3BvbnNlIGZyb20gb3RoZXIgQVAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSkgIT0gMCkgJiYgd2QtPnN0YS5ERlNFbmFibGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9IH4oWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NQcm9iZVJzcChkZXYsIGJ1ZiwgQWRkSW5mbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU06CisgICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzQXRpbShkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQWN0aW9uICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT04gOgorICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMiwgIlByb2Nlc3NBY3Rpb25NZ3RGcmFtZSIpOworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJlcSAgICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUHJvY2Vzc1Byb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYykKK3sKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdThfdCBsZW47CisgICAgdTE2X3QgaSwgajsKKyAgICB1OF90IGNoOworICAgIHUxNl90IHNlbmRGbGFnOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogY2hlY2sgbW9kZSA6IEFQL0lCU1MgKi8KKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJJZ25vcmUgcHJvYmUgcmVxIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAiUGFja2V0cyBkcm9wcGVkIGR1ZSB0byBkaXNjb25uZWN0IHN0YXRlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCAwLCAwLCAwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY2hlY2sgU1NJRCAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJlcSBTU0lEIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgod2QtPmFwLmFwQml0bWFwICYgKDE8PGkpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJsZW49IiwgbGVuKTsKKyAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKKyAgICAgICAgICAgIC8qIGJvYXJkY2FzdCBTU0lEICovCisgICAgICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5oaWRlU3NpZFtpXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEZsYWcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnNzaWRMZW5baV0gPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyK2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2ldW2pdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZW5kRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlbmRGbGFnID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2VuZCBwcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AsIHNyYywgaSwgMCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJzcCAgICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyBwcm9iZSByZXNwb25zZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFkZEluZm8gOiBSeCBIZWFkZXIgYW5kIFJ4IE1hYyBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBBcmVzcyBZYW5nICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKK3sKKyAgICAvKiBHYXRoZXIgc2NhbiByZXN1bHQgKi8KKyAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyKiAgcFByb2JlUnNwSGVhZGVyOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvOworICAgIHU4X3QgICBwQnVmW3NpemVvZihzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlcildOworICAgIGludCAgICByZXM7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnVmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIpKTsKKyAgICBwUHJvYmVSc3BIZWFkZXIgPSAoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIqKSBwQnVmOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiYnNzIGNvdW50ID0gIiwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KTsKKworICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyKTsKKworICAgIC8vaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgaWYgKCBwQnNzSW5mbyA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IGVudHJ5IGlmIEJTUyBub3QgaW4gdGhlIHNjYW4gbGlzdCAqLworICAgICAgICBwQnNzSW5mbyA9IHpmQnNzSW5mb0FsbG9jYXRlKGRldik7CisgICAgICAgIGlmIChwQnNzSW5mbyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSB6ZlN0YUluaXRCc3NJbmZvKGRldiwgYnVmLCBwUHJvYmVSc3BIZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKKyAgICAgICAgICAgIC8vemZEdW1wU1NJRChwQnNzSW5mby0+c3NpZFsxXSwgJihwQnNzSW5mby0+c3NpZFsyXSkpOworICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyLCBwQnNzSW5mbywgQWRkSW5mbywgMSk7CisgICAgICAgIGlmIChyZXMgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgemZCc3NJbmZvUmVtb3ZlRnJvbUxpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeDsKKworICAgICAgICAgICAgLy8gSXQgd291bGQgcmVzZXQgdGhlIGFsaXZlIGNvdW50ZXIgaWYgdGhlIHBlZXIgc3RhdGlvbiBpcyBmb3VuZCEKKyAgICAgICAgICAgIHpmU3RhRmluZEZyZWVPcHBvc2l0ZShkZXYsICh1MTZfdCAqKXBCc3NJbmZvLT5tYWNhZGRyLCAmaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlNlbmRQcm9iZVJlcSAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2VuZCBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UxNl90IHpmU2VuZFByb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGJXaXRoU1NJRCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgLyogU1NJRCAqLworICAgIGlmIChiV2l0aFNTSUQgPT0gMCkgIC8qIGJyb2FkY2FzdCBzc2lkICovCisgICAgeworICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7ICAgLyogbGVuZ3RoID0gMCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBpZiAod2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAwKTsgICAvKiBsZW5ndGggPSAwICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAorICAgICAgICAgICAgICAgICAgICB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuKTsKKyAgICAgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWQsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbik7IC8qIHNzaWQgKi8KKyAgICAgICAgICAgIG9mZnNldCArPSB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuOworICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgLyogU3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKKyAgICB7ICAgLyogODAyLjExYitnICovCisgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKKworICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgeworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPndmYy5iSWJzc0dNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgIC8qIDgwMi4xMWEgKi8KKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIgKi8KKy8qICAgICAgVXBkYXRlIFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIGRlZmF1bHQgdmFsdWUuICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG1vZGUgOiAwPT5TVEEsIDE9PkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmVXBkYXRlRGVmYXVsdFFvc1BhcmFtZXRlcih6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHUxNl90IGN3bWluWzVdOworICAgIHUxNl90IGN3bWF4WzVdOworICAgIHUxNl90IGFpZnNbNV07CisgICAgdTE2X3QgdHhvcFs1XTsKKworICAgIC8qIFdNTSBwYXJhbWV0ZXIgZm9yIFNUQSAqLworICAgIC8qIEJlc3QgRWZmb3IgKi8KKyAgICBjd21pblswXSA9IDE1OworICAgIGN3bWF4WzBdID0gMTAyMzsKKyAgICBhaWZzWzBdID0gMyAqIDkgKyAxMDsKKyAgICB0eG9wWzBdID0gMDsKKyAgICAvKiBCYWNrIEdyb3VuZCAqLworICAgIGN3bWluWzFdID0gMTU7CisgICAgY3dtYXhbMV0gPSAxMDIzOworICAgIGFpZnNbMV0gPSA3ICogOSArIDEwOworICAgIHR4b3BbMV0gPSAwOworICAgIC8qIFZJREVPICovCisgICAgY3dtaW5bMl0gPSA3OworICAgIGN3bWF4WzJdID0gMTU7CisgICAgYWlmc1syXSA9IDIgKiA5ICsgMTA7CisgICAgdHhvcFsyXSA9IDk0OworICAgIC8qIFZPSUNFICovCisgICAgY3dtaW5bM10gPSAzOworICAgIGN3bWF4WzNdID0gNzsKKyAgICBhaWZzWzNdID0gMiAqIDkgKyAxMDsKKyAgICB0eG9wWzNdID0gNDc7CisgICAgLyogU3BlY2lhbCBUeFEgKi8KKyAgICBjd21pbls0XSA9IDM7CisgICAgY3dtYXhbNF0gPSA3OworICAgIGFpZnNbNF0gPSAyICogOSArIDEwOworICAgIHR4b3BbNF0gPSAwOworCisgICAgLyogV01NIHBhcmFtZXRlciBmb3IgQVAgKi8KKyAgICBpZiAobW9kZSA9PSAxKQorICAgIHsKKyAgICAgICAgY3dtYXhbMF0gPSA2MzsKKyAgICAgICAgYWlmc1szXSA9IDEgKiA5ICsgMTA7CisgICAgICAgIGFpZnNbNF0gPSAxICogOSArIDEwOworICAgIH0KKyAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKK30KKwordTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgwMykKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4N2YpCisgICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA9PSB0eXBlKSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc3VidHlwZSAhPSAweGZmICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPT0gc3VidHlwZSAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTE2X3QgemZGaW5kQnJkY21NcnZsUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgxMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4MTgpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHg1MCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSAweDdGKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBCaW5nbyAqLworICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKT4oYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOworICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkZpbmRNYXJ2ZWxFeHRDYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZDsKKyAgICB1OF90IHRtcDsKKworICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLworICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CisKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJpbmdvICovCisgICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpKSA9PSAweDUwKQorICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UxNl90IHpmRmluZEJyb2FkY29tRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCB0bXA7CisKKyAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOworCisgICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IDI0OworCisgICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlKChvZmZzZXQrMikgPCBidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPiAoYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4MTApCisgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweDE4KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkZpbmRSbG5rRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCB0bXA7CisKKyAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOworCisgICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IDI0OworCisgICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlKChvZmZzZXQrMikgPCBidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gMHg3RikKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPiAoYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorCisgICAgcmV0dXJuIDB4ZmZmZjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1hcC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwOWZkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1hcC5jCkBAIC0wLDAgKzEsMjQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogbW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBjb21tb24gZnVuY3Rpb25zIGZvciBoYW5kbGUgQVAgICAgICAgICAgICAgKi8KKy8qICAgICAgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKK2V4dGVybiBjb25zdCB1OF90IHpjVXBUb0FjW107CisKK3ZvaWQgemZNbUFwVGltZVRpY2soemRldl90KiBkZXYpCit7CisgICAgdTMyX3Qgbm93OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgid2QtPndsYW5Nb2RlIDogIiwgd2QtPndsYW5Nb2RlKTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICAvKiA9PiBldmVyeSAxLjI4IHNlY29uZHMgKi8KKyAgICAgICAgLyogQVAgOiBhZ2luZyBTVEEgdGhhdCBkb2VzIG5vdCBhY3RpdmUgZm9yIHdkLT5hcC5zdGFBZ2luZ1RpbWUgICAgKi8KKyAgICAgICAgbm93ID0gd2QtPnRpY2sgJiAweDdmOworICAgICAgICBpZiAobm93ID09IDB4MCkKKyAgICAgICAgeworICAgICAgICAgICAgemZBcEFnaW5nU3RhKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobm93ID09IDB4MWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmUXVldWVBZ2UoZGV2LCB3ZC0+YXAudWFwc2RRLCB3ZC0+dGljaywgMTAwMDApOworICAgICAgICB9CisgICAgICAgIC8qIEFQIDogY2hlY2sgKHdkLT5hcC5wcm90ZWN0ZWRPYnNzKSBhbmQgKHdkLT5hcC5iU3RhQXNzb2NpYXRlZCkgICovCisgICAgICAgIC8qICAgICAgdG8gZW5hYmxlIE5vbkVycCBhbmQgUHJvdGVjdGlvbiBtb2RlICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKG5vdyA9PSAweDNmKQorICAgICAgICB7CisgICAgICAgICAgICAvL3pmQXBQcm90Y3Rpb25Nb25pdG9yKGRldik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwSW5pdFN0YVRibCAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW5pdCBBUCdzIHN0YXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBcEluaXRTdGFUYmwoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaT0wOyBpPFpNX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnN0YXRlID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMF0gPSAwOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0uYWRkclsxXSA9IDA7CisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpXS5hZGRyWzJdID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnRpbWUgPSAwOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0udmFwID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwRmluZFN0YSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmluZCBhIFNUQSBpbiBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBUYXJnZXQgU1RBIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IFNUQSB0YWJsZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEZpbmRTdGEoemRldl90KiBkZXYsIHUxNl90KiBhZGRyKQoreworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaV0udmFsaWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaV0uYWRkclswXSA9PSBhZGRyWzBdKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMV0gPT0gYWRkclsxXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5hcC5zdGFUYWJsZVtpXS5hZGRyWzJdID09IGFkZHJbMl0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UxNl90IHpmQXBHZXRTVEFJbmZvKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIHN0YXRlLCB1OF90KiB2YXApCit7CisgICAgdTE2X3QgaWQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAqdmFwID0gd2QtPmFwLnN0YVRhYmxlW2lkXS52YXA7CisgICAgICAgICpzdGF0ZSA9IHdkLT5hcC5zdGFUYWJsZVtpZCsrXS5zdGF0ZTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIGlkOworfQorCisKK3ZvaWQgemZBcEdldFN0YVFvc1R5cGUoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1OF90KiBxb3NUeXBlKQoreworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgKnFvc1R5cGUgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpxb3NUeXBlID0gMDsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBHZXRTdGFUeFJhdGVBbmRRb3NUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTMyX3QqIHBoeUN0cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QqIHFvc1R5cGUsIHUxNl90KiByY1Byb2JpbmdGbGFnKQoreworICAgIHUxNl90IGlkOworICAgIHU4X3QgcmF0ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHJhdGUgPSAodThfdCl6ZlJhdGVDdHJsR2V0VHhSYXRlKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpZF0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKyNpZmRlZiBaTV9BUF9ERUJVRworICAgICAgICAvL3JhdGUgPSAxNTsKKyNlbmRpZgorICAgICAgICAqcGh5Q3RybCA9IHpjUmF0ZVRvUGh5Q3RybFtyYXRlXTsKKyAgICAgICAgKnFvc1R5cGUgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLIDFNICovCisgICAgICAgICAgICAvL2hlYWRlclsyXSA9IDB4MGYwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgICAgICAvL2hlYWRlclszXSA9IDB4MDAwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgICAgICAqcGh5Q3RybCA9IDB4MDAwMDBGMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgNk0gKi8KKyAgICAgICAgICAgIC8vaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIC8vaGVhZGVyWzNdID0gMHgwMDBCOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgICAgICpwaHlDdHJsID0gMHgwMDBCMEYwMTsKKyAgICAgICAgfQorICAgICAgICAqcW9zVHlwZSA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIlBoeUN0cmw9IiwgKnBoeUN0cmwpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwR2V0U3RhRW5jcnlUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdThfdCogZW5jcnlUeXBlKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgKmVuY3J5VHlwZSA9IHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqZW5jcnlUeXBlID0gWk1fTk9fV0VQOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzMsICJlbmN5clR5cGU9IiwgKmVuY3J5VHlwZSk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBHZXRTdGFXcGFJdih6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90KiBpdjE2LCB1MzJfdCogaXYzMikKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MTZfdCBpZDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgICppdjE2ID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjE2OworICAgICAgICAqaXYzMiA9IHdkLT5hcC5zdGFUYWJsZVtpZF0uaXYzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKml2MTYgPSAwOworICAgICAgICAqaXYzMiA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIml2MTY9IiwgKml2MTYpOworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIml2MzI9IiwgKml2MzIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU2V0U3RhV3BhSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBpdjE2LCB1MzJfdCBpdjMyKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjE2ID0gaXYxNjsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjMyID0gaXYzMjsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgem1fbXNnMl9tbShaTV9MVl8zLCAiaXYxNj0iLCBpdjE2KTsKKyAgICB6bV9tc2cyX21tKFpNX0xWXzMsICJpdjMyPSIsIGl2MzIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwQ2xlYXJTdGFLZXkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGJjQWRkclszXSA9IHsgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiB9OworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHpmTWVtb3J5SXNFcXVhbCgodThfdCopYmNBZGRyLCAodThfdCopYWRkciwgc2l6ZW9mKGJjQWRkcikpID09IFRSVUUpCisgICAgeworICAgICAgICAvKiBUdXJuIG9mZiBncm91cCBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAvLyAgICB6ZkNsZWFyS2V5KGRldiwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUdXJuIG9mZiBTVEEncyBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIHpmSHBSZW1vdmVLZXkoZGV2LCBpZCsxKTsKKworICAgICAgICAgICAgLyogVXBkYXRlIFNUQSdzIEVuY3J5cHRpb24gVHlwZSAqLworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJDYW4ndCBmaW5kIFNUQSBhZGRyZXNzXG4iKTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KK30KKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit2b2lkIHpmQXBHZXRTdGFDZW5jSXZBbmRLZXlJZHgoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYsIHU4X3QgKmtleUlkeCkKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MTZfdCBpZDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAqaXYrKyA9IHdkLT5hcC5zdGFUYWJsZVtpZF0udHhpdlswXTsKKyAgICAgICAgKml2KysgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbMV07CisgICAgICAgICppdisrID0gd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzJdOworICAgICAgICAqaXYgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbM107CisgICAgICAgICprZXlJZHggPSB3ZC0+YXAuc3RhVGFibGVbaWRdLmNlbmNLZXlJZHg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICppdisrID0gMHg1YzM2NWMzNzsKKyAgICAgICAgKml2KysgPSAweDVjMzY1YzM2OworICAgICAgICAqaXYrKyA9IDB4NWMzNjVjMzY7CisgICAgICAgICppdiA9IDB4NWMzNjVjMzY7CisgICAgICAgICprZXlJZHggPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBTZXRTdGFDZW5jSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgdTE2X3QgaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzBdID0gKml2Kys7CisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0udHhpdlsxXSA9ICppdisrOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbMl0gPSAqaXYrKzsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzNdID0gKml2OworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwRmx1c2hCdWZmZXJlZFBzRnJhbWUgICAgKi8KKy8qICAgICAgRnJlZSBidWZmZXJlZCBQUyBmcmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGVtcHR5RmxhZzsKKyAgICB1MTZfdCBmcmVlQ291bnQ7CisgICAgdTE2X3QgdmFwOworICAgIHpidWZfdCogcHNCdWYgPSBOVUxMOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZnJlZUNvdW50ID0gMDsKKyAgICBlbXB0eUZsYWcgPSAwOworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSBOVUxMOworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBpZiAod2QtPmFwLnVuaUhlYWQgIT0gd2QtPmFwLnVuaVRhaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzQnVmID0gd2QtPmFwLnVuaUFycmF5W3dkLT5hcC51bmlIZWFkXTsKKyAgICAgICAgICAgIHdkLT5hcC51bmlIZWFkID0gKHdkLT5hcC51bmlIZWFkICsgMSkgJiAoWk1fVU5JX0FSUkFZX1NJWkUgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtcHR5RmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAocHNCdWYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIHBzQnVmLCBaTV9FUlJfRkxVU0hfUFNfUVVFVUUpOworICAgICAgICB9CisgICAgICAgIHptX2Fzc2VydChmcmVlQ291bnQrKyA8IChaTV9VTklfQVJSQVlfU0laRSoyKSk7CisKKyAgICAgICAgaWYgKGVtcHR5RmxhZyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodmFwPTA7IHZhcDxaTV9NQVhfQVBfU1VQUE9SVDsgdmFwKyspCisgICAgeworICAgICAgICBmcmVlQ291bnQgPSAwOworICAgICAgICBlbXB0eUZsYWcgPSAwOworICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHNCdWYgPSBOVUxMOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuYmNtY0hlYWRbdmFwXSAhPSB3ZC0+YXAuYmNtY1RhaWxbdmFwXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc0J1ZiA9IHdkLT5hcC5iY21jQXJyYXlbdmFwXVt3ZC0+YXAuYmNtY0hlYWRbdmFwXV07CisgICAgICAgICAgICAgICAgd2QtPmFwLmJjbWNIZWFkW3ZhcF0gPSAod2QtPmFwLmJjbWNIZWFkW3ZhcF0gKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgJiAoWk1fQkNNQ19BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1wdHlGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmIChwc0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgWk1fRVJSX0ZMVVNIX1BTX1FVRVVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptX2Fzc2VydChmcmVlQ291bnQrKyA8IChaTV9CQ01DX0FSUkFZX1NJWkUqMikpOworCisgICAgICAgICAgICBpZiAoZW1wdHlGbGFnICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK3UxNl90IHpmQXBCdWZmZXJQc0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBhZGRyWzNdOworICAgIHUxNl90IHZhcCA9IDA7CisgICAgdThfdCB1cDsKKyAgICB1MTZfdCBmcmFnT2ZmOworICAgIHU4X3QgYWM7CisgICAgdTE2X3QgcmV0OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChwb3J0IDwgWk1fTUFYX0FQX1NVUFBPUlQpCisgICAgeworICAgICAgICB2YXAgPSBwb3J0OworICAgIH0KKworICAgIGFkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKTsKKyAgICBhZGRyWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgYWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgaWYgKChhZGRyWzBdICYgMHgxKSA9PSAweDEpCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnN0YVBvd2VyU2F2aW5nID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyogQnVmZmVyIHRoaXMgQkMgb3IgTUMgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICgoKHdkLT5hcC5iY21jVGFpbFt2YXBdKzEpJihaTV9CQ01DX0FSUkFZX1NJWkUtMSkpCisgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5iY21jSGVhZFt2YXBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5hcC5iY21jQXJyYXlbdmFwXVt3ZC0+YXAuYmNtY1RhaWxbdmFwXSsrXSA9IGJ1ZjsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYmNtY1RhaWxbdmFwXSAmPSAoWk1fQkNNQ19BUlJBWV9TSVpFLTEpOworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzAsICJCdWZmZXIgQkNNQyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGJjbWNBcnJheSBmdWxsICovCisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHptX21zZzBfdHgoWk1fTFZfMCwgIkJDTUMgYnVmZmVyIGZ1bGwiKTsKKworICAgICAgICAgICAgICAgIC8qIGZyZWUgYnVmZmVyIGFjY29yZGluZyB0byBidWZmZXIgdHlwZSAqLworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX0VSUl9CQ01DX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSA9PSAxKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgemZUeEdldElwVG9zQW5kRnJhZyhkZXYsIGJ1ZiwgJnVwLCAmZnJhZ09mZik7CisgICAgICAgICAgICAgICAgYWMgPSB6Y1VwVG9BY1t1cCYweDddICYgMHgzOworCisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGUgPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvICYgKDB4OD4+YWMpKSAhPSAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHpmUXVldWVQdXROY3MoZGV2LCB3ZC0+YXAudWFwc2RRLCBidWYsIHdkLT50aWNrKTsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBaTV9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9FUlJfQVBfVUFQU0RfUVVFVUVfRlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCdWZmZXIgdGhpcyB1bmljYXN0IGZyYW1lICovCisgICAgICAgICAgICAgICAgaWYgKCgod2QtPmFwLnVuaVRhaWwrMSkmKFpNX1VOSV9BUlJBWV9TSVpFLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gd2QtPmFwLnVuaUhlYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudW5pQXJyYXlbd2QtPmFwLnVuaVRhaWwrK10gPSBidWY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC51bmlUYWlsICY9IChaTV9VTklfQVJSQVlfU0laRS0xKTsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF90eChaTV9MVl8wLCAiQnVmZmVyIFVOSSIpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHVuaUFycmF5IGZ1bGwgKi8KKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF90eChaTV9MVl8wLCAiVU5JIGJ1ZmZlciBmdWxsIik7CisgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgYnVmZmVyIGFjY29yZGluZyB0byBidWZmZXIgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9FUlJfVU5JX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gLyogaWYgKHdkLT5hcC5zdGFUYWJsZVtpZCsrXS5wc01vZGUgPT0gMSkgKi8KKyAgICAgICAgfSAvKiBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKSAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkFwR2V0U1RBSW5mb0FuZFVwZGF0ZVBzKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OF90KiB2YXAsIHUxNl90IHBzTW9kZSwgdThfdCogdWFwc2RUcmlnKQoreworICAgIHUxNl90IGlkOworICAgIHU4X3QgdWFwc2RTdGFBd2FrZSA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworI2lmZGVmIFpNX0FQX0RFQlVHCisgICAgLy9wc01vZGU9MDsKKyNlbmRpZgorCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGlmIChwc01vZGUgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAicHNNb2RlID0gMSIpOworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0ucHNNb2RlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVBvd2VyU2F2aW5nKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0ucW9zVHlwZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiVUFQU0QgdHJpZ2dlciIpOworICAgICAgICAgICAgICAgICAgICAqdWFwc2RUcmlnID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFQb3dlclNhdmluZy0tOworICAgICAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NUeXBlID09IDEpICYmICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvJjB4ZikhPTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWFwc2RTdGFBd2FrZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5wc01vZGUgPSAodThfdCkgcHNNb2RlOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnRpbWUgPSB3ZC0+dGljazsKKyAgICAgICAgKnZhcCA9IHdkLT5hcC5zdGFUYWJsZVtpZF0udmFwOworICAgICAgICAqc3RhdGUgPSB3ZC0+YXAuc3RhVGFibGVbaWQrK10uc3RhdGU7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh1YXBzZFN0YUF3YWtlID09IDEpCisgICAgeworICAgICAgICB6YnVmX3QqIHBzQnVmOworICAgICAgICB1OF90IG1iOworCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBzQnVmID0gemZRdWV1ZUdldFdpdGhNYWMoZGV2LCB3ZC0+YXAudWFwc2RRLCAodThfdCopYWRkciwgJm1iKSkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIHBzQnVmLCAwLCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcEdldE5ld1N0YSAgICAgICAgICAgICAgICovCisvKiAgICAgIEdldCBhIG5ldyBTVEEgZnJvbSBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IFNUQSB0YWJsZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEdldE5ld1N0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgInpmQXBHZXROZXdTdGE9IiwgaSk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwQWRkU3RhICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGEgU1RBIHRvIHN0YXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBTVEEgTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdGF0ZSA6IFNUQSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYXBJZCA6IFZpcnR1YWwgQVAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiAwPT4xMWIsIDE9PjExZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBPdGhlciA6IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZFN0YSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXRlLCB1MTZfdCBhcElkLCB1OF90IHR5cGUsCisgICAgICAgICAgICAgICAgIHU4X3QgcW9zVHlwZSwgdThfdCBxb3NJbmZvKQoreworICAgIHUxNl90IGluZGV4OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiU1RBIHR5cGU9IiwgdHlwZSk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpbmRleCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMiwgImZvdW5kIik7CisgICAgICAgIC8qIFVwZGF0ZSBTVEEgc3RhdGUgKi8KKyAgICAgICAgaWYgKChzdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSB8fCAoc3RhdGUgPT0gWk1fU1RBVEVfUFJFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udGltZSA9IHdkLT50aWNrOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFpNX1NUQVRFX0FTT0MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2luZGV4XS5zdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSkKKyAgICAgICAgICAgICAgICAgICAgLy8mJiAod2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPT0gYXBJZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udGltZSA9IHdkLT50aWNrOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0ucW9zVHlwZSA9IHFvc1R5cGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uc3RhVHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS5xb3NJbmZvID0gcW9zSW5mbzsKKworICAgICAgICAgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEluaXQgMTFiL2cgKi8KKyAgICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpbmRleF0ucmNDZWxsLCB0eXBlLCAxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSW5pdCAxMWEgKi8KKyAgICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpbmRleF0ucmNDZWxsLCB0eXBlLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JBcENvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiQXBDb25uZWN0Tm90aWZ5KGRldiwgKHU4X3QqKWFkZHIsIGFwSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzIsICJOb3QgZm91bmQiKTsKKyAgICAgICAgaWYgKChzdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSB8fCAoc3RhdGUgPT0gWk1fU1RBVEVfUFJFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBhIG5ldyBTVEEgYW5kIHVwZGF0ZSBzdGF0ZSAqLworICAgICAgICAgICAgaW5kZXggPSB6ZkFwR2V0TmV3U3RhKGRldik7CisgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzEsICJuZXcgU1RBIGluZGV4PSIsIGluZGV4KTsKKworICAgICAgICAgICAgaWYgKGluZGV4ICE9IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLmFkZHJbaV0gPSBhZGRyW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YWxpZCA9IDE7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS50aW1lID0gd2QtPnRpY2s7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcEFnaW5nU3RhICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFnaW5nIFNUQSBpbiBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG51bWJlciBvZiAxMWIgU1RBIGluIFNUQSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBBZ2luZ1N0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHUzMl90IGRlbHRhTXM7CisgICAgdTE2X3QgYWRkclszXTsKKyAgICB1MTZfdCB0eEZsYWc7CisgICAgdTE2X3QgcHNTdGFDb3VudCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgd2QtPmFwLmdTdGFBc3NvY2lhdGVkID0gd2QtPmFwLmJTdGFBc3NvY2lhdGVkID0gMDsKKworICAgIGZvciAoaT0wOyBpPFpNX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgdHhGbGFnID0gMDsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpXS52YWxpZCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyWzBdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMF07CisgICAgICAgICAgICBhZGRyWzFdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMV07CisgICAgICAgICAgICBhZGRyWzJdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMl07CisgICAgICAgICAgICAvKiBtaWxsaXNlY29uZCAqLworICAgICAgICAgICAgZGVsdGFNcyA9ICh1MzJfdCkoKHUzMl90KXdkLT50aWNrLSh1MzJfdCl3ZC0+YXAuc3RhVGFibGVbaV0udGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAqIFpNX01TX1BFUl9USUNLOworCisgICAgICAgICAgICAvKiBwcmVhdXRoICovCisgICAgICAgICAgICBpZiAoKHdkLT5hcC5zdGFUYWJsZVtpXS5zdGF0ZSA9PSBaTV9TVEFURV9QUkVBVVRIKQorICAgICAgICAgICAgICAgICAgICAmJiAoZGVsdGFNcyA+IFpNX1BSRUFVVEhfVElNRU9VVF9NUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQWdpbmcgU1RBICovCisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYXV0aFNoYXJpbmcgPSAwOworICAgICAgICAgICAgICAgIHR4RmxhZyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGF1dGggKi8KKyAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2ldLnN0YXRlID09IFpNX1NUQVRFX0FVVEgpCisgICAgICAgICAgICAgICAgICAgICYmIChkZWx0YU1zID4gWk1fQVVUSF9USU1FT1VUX01TKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBBZ2luZyBTVEEgKi8KKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0udmFsaWQgPSAwOworICAgICAgICAgICAgICAgIHR4RmxhZyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFzb2MgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaV0uc3RhdGUgPT0gWk1fU1RBVEVfQVNPQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNTdGFDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkZWx0YU1zID4gKCh1MzJfdCl3ZC0+YXAuc3RhQWdpbmdUaW1lU2VjPDwxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBZ2luZyBTVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiQWdlIFNUQSBpbmRleD0iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHhGbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGFNcyA+ICgodTMyX3Qpd2QtPmFwLnN0YVByb2JpbmdUaW1lU2VjPDwxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnBzTW9kZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9iaW5nIG5vbi1QUyBTVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlByb2JpbmcgU1RBIGluZGV4PSIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnRpbWUgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5hcC5zdGFQcm9iaW5nVGltZVNlYyAqIFpNX1RJQ0tfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eEZsYWcgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICh0eEZsYWcgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2VuZCBkZWF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBhZGRyLCA0LCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eEZsYWcgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fREFUQV9GUkFNRSwgYWRkciwgMCwgMCwgMCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHdkLT5hcC5zdGFQb3dlclNhdmluZyA9IHBzU3RhQ291bnQ7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZBcFByb3RjdGlvbk1vbml0b3IoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogMTFiIFNUQSBhc3NvY2lhdGVkID0+IG5vbkVycCwgUHJvdGVjdCAqLworICAgIGlmICh3ZC0+YXAuYlN0YUFzc29jaWF0ZWQgPiAwKQorICAgIHsKKyAgICAgICAgLyogRW5hYmxlIE5vbkVycCBiaXQgaW4gaW5mb3JtYXRpb24gZWxlbWVudCAqLworICAgICAgICB3ZC0+ZXJwRWxlbWVudCA9IFpNX1dMQU5fTk9OX0VSUF9QUkVTRU5UX0JJVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgWk1fV0xBTl9VU0VfUFJPVEVDVElPTl9CSVQ7CisKKyAgICAgICAgLyogRW5hYmxlIHByb3RlY3Rpb24gbW9kZSAqLworICAgICAgICB6ZkFwU2V0UHJvdGVjdGlvbk1vZGUoZGV2LCAxKTsKKworICAgIH0KKyAgICAvKiAxMWIgU1RBIG5vdCBhc3NvY2lhdGVkLCBwcm90ZWN0aW9uIE9CU1MgcHJlc2VudCA9PiBQcm90ZWN0ICovCisgICAgZWxzZSBpZiAod2QtPmFwLnByb3RlY3RlZE9ic3MgPiAyKSAvL1RocmVzaG9sZAorICAgIHsKKyAgICAgICAgaWYgKHdkLT5kaXNhYmxlU2VsZkN0cyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIE5vbkVycCBiaXQgaW4gaW5mb3JtYXRpb24gZWxlbWVudCAqLworICAgICAgICAgICAgd2QtPmVycEVsZW1lbnQgPSBaTV9XTEFOX1VTRV9QUk9URUNUSU9OX0JJVDsKKworICAgICAgICAgICAgLyogRW5hYmxlIHByb3RlY3Rpb24gbW9kZSAqLworICAgICAgICAgICAgemZBcFNldFByb3RlY3Rpb25Nb2RlKGRldiwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBOb25FcnAgYml0IGluIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyAgICAgICAgd2QtPmVycEVsZW1lbnQgPSAwOworCisgICAgICAgIC8qIERpc2FibGUgcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIHpmQXBTZXRQcm90ZWN0aW9uTW9kZShkZXYsIDApOworICAgIH0KKyAgICB3ZC0+YXAucHJvdGVjdGVkT2JzcyA9IDA7Cit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHU4X3QgY2g7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJSeCBiZWFjb24iKTsKKworICAgIC8qIHVwZGF0ZSBOb24tRVJQIGZsYWcod2QtPmFwLm5vbkVycE9ic3MpICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FUlApKSA9PSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMWIgT0JTUyAqLworICAgICAgICB3ZC0+YXAucHJvdGVjdGVkT2JzcysrOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CisgICAgaWYgKChjaCAmIFpNX1dMQU5fVVNFX1BST1RFQ1RJT05fQklUKSA9PSBaTV9XTEFOX1VTRV9QUk9URUNUSU9OX0JJVCkKKyAgICB7CisgICAgICAgIC8qIFByb3RlY3RlZCBPQlNTICovCisgICAgICAgIHdkLT5hcC5wcm90ZWN0ZWRPYnNzID0gMTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc0F1dGggICAgICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIGF1dGhlbnRpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGUgOiBBUCBhbGxvd3Mgb25lIGF1dGhlbnRpY2F0aW5nIFNUQSBhdCBhIHRpbWUsIGRvZXMgbm90ICAgICAgICAgICovCisvKiAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBNYWtlIHN1cmUgICAgICAgICAgICAqLworLyogICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgYmUgYmxvY2tlZCBkdWUgICAgICAgICAgKi8KKy8qICAgICAgICB0byBpbmNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UuICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIHpmQXBQcm9jZXNzQXV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpCit7CisgICAgdTE2X3QgYWxnbywgc2VxLCBzdGF0dXM7CisgICAgdThfdCBhdXRoU2hhcmluZzsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgaTsKKyAgICB1OF90IGNoYWxsZW5nZVBhc3NlZCA9IDA7CisgICAgdThfdCBmcmFtZUN0cmw7CisgICAgdTMyX3QgcmV0QWxnb1NlcTsKKyAgICB1MzJfdCByZXRTdGF0dXM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIGZyYW1lQ3RybCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworICAgIC8qIEFQIDogQXV0aCBzaGFyZSAzICovCisgICAgLyogc2hpZnQgZm9yIFdFUCBJViAqLworICAgIGlmICgoZnJhbWVDdHJsICYgMHg0MCkgIT0gMCkKKyAgICB7CisgICAgICAgIGFsZ28gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyOCk7CisgICAgICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhbGdvID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjQpOworICAgICAgICBzZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNik7CisgICAgICAgIHN0YXR1cyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI4KTsKKyAgICB9CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJSeCBBdXRoLCBzZXE9Iiwgc2VxKTsKKworICAgIC8qIFNldCBkZWZhdWx0IHRvIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSBub3Qgc3VwcG9ydCAqLworICAgIHJldEFsZ29TZXEgPSAweDIwMDAwIHwgYWxnbzsKKyAgICByZXRTdGF0dXMgPSAxMzsgLyogYXV0aGVudGljYXRpb24gYWxnb3JpdGhtIG5vdCBzdXBwb3J0ICovCisKKyAgICAvKiBBUCA6IEF1dGggb3BlbiAxICovCisgICAgaWYgKGFsZ28gPT0gMCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAuYXV0aEFsZ29bYXBJZF0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4MjAwMDA7CisgICAgICAgICAgICBpZiAoc2VxID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIGF1dGggKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IHpmQXBBZGRTdGEoZGV2LCBzcmMsIFpNX1NUQVRFX0FVVEgsIGFwSWQsIDAsIDAsIDApKSAhPSAweGZmZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IGNhbGwgemZ3QXV0aE5vdGlmeSgpIGZvciBob3N0IHRvIGp1ZGdlICovCisgICAgICAgICAgICAgICAgICAgIC8vemZ3QXV0aE5vdGlmeShkZXYsIHNyYyk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiByZXNwb25zZSBBdXRoIHNlcT0yLCBzdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDA7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiByZXNwb25zZSBBdXRoIHNlcT0yLCB1bnNwZWNpZmljIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9Miwgc2VxdWVuY2UgbnVtYmVyIG91dCBvZiBleHBlY3RlZCAqLworICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIEFQIDogQXV0aCBzaGFyZSAxICovCisgICAgZWxzZSBpZiAoYWxnbyA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hcC5hdXRoQWxnb1thcElkXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VxID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4MjAwMDE7CisKKyAgICAgICAgICAgICAgICAvKiBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmF1dGhTaGFyaW5nID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdXRoU2hhcmluZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dGhTaGFyaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLmF1dGhTaGFyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgaWYgKGF1dGhTaGFyaW5nID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IHJlc3BvbnNlIEF1dGggc2VxPTIsIHN0YXR1cyA9IGZhaWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIHByZWF1dGggKi8KKyAgICAgICAgICAgICAgICAgICAgemZBcEFkZFN0YShkZXYsIHNyYywgWk1fU1RBVEVfUFJFQVVUSCwgYXBJZCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiBjYWxsIHpmd0F1dGhOb3RpZnkoKSBmb3IgaG9zdCB0byBqdWRnZSAqLworICAgICAgICAgICAgICAgICAgICAvL3pmd0F1dGhOb3RpZnkoZGV2LCBzcmMpOworCisgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiAqLworICAgICAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNlcSA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldEFsZ29TZXEgPSAweDQwMDAxOworCisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5hdXRoU2hhcmluZyA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgY2hhbGxlbmdlIHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHptd19idWZfcmVhZGgoZGV2LCBidWYsIDMwKzQpID09IDB4ODAxMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTI4OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5jaGFsbGVuZ2VUZXh0W2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzIraSs0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VQYXNzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYWxsZW5nZVBhc3NlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IHVwZGF0ZSBTVEEgdG8gYXV0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZBcEFkZFN0YShkZXYsIHNyYywgWk1fU1RBVEVfQVVUSCwgYXBJZCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiwgY2hhbGxlbmdlIGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE1OworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIDogZGVsZXRlIFNUQSAqLworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLmF1dGhTaGFyaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4NDAwMDE7CisgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMTQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgsIHNyYywgcmV0QWxnb1NlcSwKKyAgICAgICAgICAgIHJldFN0YXR1cywgYXBJZCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpCit7CisgICAgdTE2X3QgYWlkID0gMHhmZmZmOworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1OF90IHN0YVR5cGUgPSAwOworICAgIHU4X3QgcW9zVHlwZSA9IDA7CisgICAgdThfdCBxb3NJbmZvID0gMDsKKyAgICB1OF90IHRtcDsKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHUxNl90IGVuY01vZGUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8qIEFQIDogY2hlY2sgU1NJRCAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGsgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2QtPmFwLnZhcE51bWJlcjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkTGVuW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoayA9PSB3ZC0+YXAudmFwTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHpsRGVhdXRoOworICAgICAgICB9CisKKyAgICAgICAgayA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3ZC0+YXAudmFwTnVtYmVyOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHdkLT5hcC5zc2lkTGVuW2pdOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0bXAgPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMitpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2pdW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gd2QtPmFwLnNzaWRMZW5bal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBJZCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChrID09IHdkLT5hcC52YXBOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPIDogY2hlY2sgY2FwYWJpbGl0eSAqLworCisgICAgLyogQVAgOiBjaGVjayBzdXBwb3J0IHJhdGUgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMWcgU1RBICovCisgICAgICAgIHN0YVR5cGUgPSAxOworICAgIH0KKyAgICAvL0NXWWFuZygrKQorICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIDExbiBTVEEgKi8KKyAgICAgICAgc3RhVHlwZSA9IDI7CisgICAgfQorCisgICAgLyogVE9ETyA6IGRvIG5vdCBhbGxvdyAxMWIgU1RBIHRvIGFzc29jaWF0ZWQgaW4gUHVyZSBHIG1vZGUgKi8KKyAgICBpZiAod2QtPmFwLndsYW5UeXBlW2FwSWRdID09IFpNX1dMQU5fVFlQRV9QVVJFX0cgJiYgc3RhVHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNyYywgMywgMCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBJbiBwdXJlIEIgbW9kZSwgd2Ugc2V0IEcgU1RBIGludG8gQiBtb2RlICovCisgICAgaWYgKHdkLT5hcC53bGFuVHlwZVthcElkXSA9PSBaTV9XTEFOX1RZUEVfUFVSRV9CICYmIHN0YVR5cGUgPT0gMSkKKyAgICB7CisgICAgICAgIHN0YVR5cGUgPSAwOworICAgIH0KKworICAgIC8qIEFQIDogY2hlY2sgMTFpIGFuZCBXUEEgKi8KKyAgICAvKiBBUCA6IGNoZWNrIDExaCAqLworCisgICAgLyogQVAgOiBjaGVjayBXTUUgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZFdpZmlFbGVtZW50KGRldiwgYnVmLCAyLCAwKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogV01FIFNUQSAqLworICAgICAgICBxb3NUeXBlID0gMTsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiV01FIFNUQSIpOworCisgICAgICAgIGlmICh3ZC0+YXAudWFwc2RFbmFibGVkICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHFvc0luZm8gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2QtPmFwLndwYVN1cHBvcnRbYXBJZF0gPT0gMSkKKyAgICB7CisgICAgICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX1dQQV9JRSkpICE9IDB4ZmZmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdldCBXUEEgSUUgKi8KKyAgICAgICAgICAgIHU4X3QgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgICAgICAgICAgaWYgKGxlbmd0aCsyIDwgWk1fTUFYX1dQQUlFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGF3cGFMZW5bYXBJZF0gPSBsZW5ndGgrMjsKKyAgICAgICAgICAgICAgICBlbmNNb2RlID0gMTsKKworCisgICAgICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiV1BBIE1vZGUgemZ3QXNvY05vdGlmeSwgYXBJZD0iLCBhcElkKTsKKworICAgICAgICAgICAgICAgIC8qIEFQIDogQ2FsbCB6ZndBc29jTm90aWZ5KCkgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JBc29jTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkFzb2NOb3RpZnkoZGV2LCBzcmMsIHdkLT5hcC5zdGF3cGFJZVthcElkXSwgd2QtPmFwLnN0YXdwYUxlblthcElkXSwgYXBJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9SU05fSUUpKSAhPSAweGZmZmYgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBnZXQgUlNOIElFICovCisgICAgICAgICAgICB1OF90IGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGgrMiA8IFpNX01BWF9XUEFJRV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLnN0YXdwYUllW2FwSWRdLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3Rhd3BhTGVuW2FwSWRdID0gbGVuZ3RoKzI7CisgICAgICAgICAgICAgICAgZW5jTW9kZSA9IDE7CisKKyAgICAgICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJSU04gTW9kZSB6ZndBc29jTm90aWZ5LCBhcElkPSIsIGFwSWQpOworCisgICAgICAgICAgICAgICAgLyogQVAgOiBDYWxsIHpmd0Fzb2NOb3RpZnkoKSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+emZjYkFzb2NOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiQXNvY05vdGlmeShkZXYsIHNyYywgd2QtPmFwLnN0YXdwYUllW2FwSWRdLCB3ZC0+YXAuc3Rhd3BhTGVuW2FwSWRdLCBhcElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byB6bERlYXV0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGVsc2UgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfQ0VOQ19JRSkpICE9IDB4ZmZmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdldCBDRU5DIElFICovCisgICAgICAgICAgICB1OF90IGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCsyIDwgWk1fTUFYX1dQQUlFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGF3cGFMZW5bYXBJZF0gPSBsZW5ndGgrMjsKKyAgICAgICAgICAgICAgICBlbmNNb2RlID0gMTsKKworICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkNFTkMgTW9kZSB6ZndBc29jTm90aWZ5LCBhcElkPSIsIGFwSWQpOworCisgICAgICAgICAgICAgICAgLyogQVAgOiBDYWxsIHpmd0Fzb2NOb3RpZnkoKSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+emZjYkNlbmNBc29jTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkNlbmNBc29jTm90aWZ5KGRldiwgc3JjLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YXdwYUxlblthcElkXSwgYXBJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgIC8qIGFwIGlzIGVuY3J5cHRpb24gYnV0IHN0YSBoYXMgbm8gd3BhL3JzbiBpZSAqLworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNyYywgNiwgMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgLyogc3RhIGhhcyB3cGEvcnNuIGllIGJ1dCBhcCBpcyBubyBlbmNyeXB0aW9uICovCisgICAgaWYgKCh3ZC0+YXAud3BhU3VwcG9ydFthcElkXSA9PSAwKSAmJiAoZW5jTW9kZSA9PSAxKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDYsIDAsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIGFzb2MgKi8KKyAgICBhaWQgPSB6ZkFwQWRkU3RhKGRldiwgc3JjLCBaTV9TVEFURV9BU09DLCBhcElkLCBzdGFUeXBlLCBxb3NUeXBlLCBxb3NJbmZvKTsKKworICAgIHpmQXBTdG9yZUFzb2NSZXFJZShkZXYsIGJ1ZiwgYWlkKTsKKworemxEZWF1dGg6CisgICAgLyogQVAgOiBzZW5kIGFzb2MgcnNwMiAqLworICAgIGlmIChhaWQgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisKKyAgICAgICAgaWYgKGZyYW1lVHlwZSA9PSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSkKKyAgICAgICAgeworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUlNQLCBzcmMsIDAsIGFpZCsxLCBhcElkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUlNQLCBzcmMsIDAsIGFpZCsxLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUT0RPIDogc2VuZCBkZWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDYsIDAsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU3RvcmVBc29jUmVxSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKiBwQXNzb0ZyYW1lOworICAgIC8vdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkFzc29GcmFtZUhlYWRlcildOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUxNl90IGxlbmd0aDsKKyAgICB1OF90ICAqaHRjYXA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplOyBpKyspCisgICAgeworICAgICAgICB3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKzI0KTsKKyAgICB9CisgICAgLyogY2FwYWJpbGl0eTogMiBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSAyNDsKKworICAgIC8qIExpc3RlbiBpbnRlcnZhbDogMiBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSAyNjsKKworICAgIC8qIFNTSUQgKi8KKyAgICBvZmZzZXQgPSAyODsKKworICAgIC8qIHN1cHBvcnRlZCByYXRlcyAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFKSkgPT0gMHhmZmZmKQorICAgICAgICByZXR1cm47CisgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0ICsgMSk7CisKKyAgICAvKiBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSA9PSAweGZmZmYpCisgICAgICAgIHJldHVybjsKKyAgICBsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyAxKTsKKworICAgIC8qIHBvd2VyIGNhcGFiaWxpdHk6NCBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSBvZmZzZXQgKyAyICsgbGVuZ3RoOworCisgICAgLyogc3VwcG9ydGVkIGNoYW5uZWxzOiA0IG9jdGV0cyAqLworICAgIG9mZnNldCA9IG9mZnNldCArIDIgKyA0OworCisgICAgLyogUlNOICovCisKKyAgICAvKiBRb1MgKi8KKworICAgIC8qIEhUIGNhcGFiaWxpdGllczogMjggb2N0ZXRzICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKSB7CisgICAgICAgIC8qIGF0aGVyb3MgcHJlIG4gKi8KKyAgICAgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+YXAuaWVbYWlkXS5IdENhcDsKKyAgICAgICAgaHRjYXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICBodGNhcFsxXSA9IDI2OworICAgICAgICBmb3IgKGk9MTsgaTw9MjY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaSsxXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiQVNPQzogIEhUIENhcGFiaWxpdGllcywgaHRjYXA9IiwgaHRjYXBbaSsxXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZKSkgIT0gMHhmZmZmKSB7CisgICAgICAgIC8qIHByZSBuIDIuMCBzdGFuZGFyZCAqLworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5hcC5pZVthaWRdLkh0Q2FwOworICAgICAgICBmb3IgKGk9MDsgaTwyODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBodGNhcFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiQVNPQzogIEhUIENhcGFiaWxpdGllcywgaHRjYXA9IiwgaHRjYXBbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBub3QgMTFuIEFQICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qIHN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMgKi8KKyAgICBvZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgICAgLy9sZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyAxKTsKKyAgICB7CisgICAgdThfdCAqaHRjYXA7CisgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+c3RhLmllLkh0SW5mbzsKKyAgICAvL3ptX2RlYnVnX21zZzIoIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMgaW5mbz0iLCAoKHUxNl90ICopaHRjYXApWzFdKTsKKyAgICAvL3ptX2RlYnVnX21zZzIoIkFTT0M6ICBBLU1QRFUgcGFyYW1ldGVycz0iLCBodGNhcFs0XSk7CisgICAgLy96bV9kZWJ1Z19tc2cyKCJBU09DOiAgU3VwcG9ydGVkIE1DUyBzZXQ9IiwgKCh1MzJfdCAqKWh0Y2FwKVsxXT4+OCk7CisgICAgfQorCit9CisKK3ZvaWQgemZBcFByb2Nlc3NBc29jUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKworfQorCit2b2lkIHpmQXBQcm9jZXNzRGVhdXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCkKK3sKKyAgICB1MTZfdCBhaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIEFQIDogaWYgU0E9YXNzb2NpYXRlZCBTVEEgdGhlbiBkZWF1dGhlbnRpY2F0ZSBTVEEgKi8KKyAgICBpZiAoKGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1RBIHRhYmxlICovCisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKyAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopc3JjLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZBcFByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCkKK3sKKyAgICB1MTZfdCBhaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIEFQIDogaWYgU0E9YXNzb2NpYXRlZCBTVEEgdGhlbiBkZWF1dGhlbnRpY2F0ZSBTVEEgKi8KKyAgICBpZiAoKGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1RBIHRhYmxlICovCisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopc3JjLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKQoreworI2lmIDAKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJSeCBwcm9iZXJzcCIpOworCisgICAgLyogR2F0aGVyIHNjYW4gcmVzdWx0ICovCisKKyAgICAvL3ptX2RlYnVnX21zZzEoImJzc0xpc3QgQ291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworICAgIC8qIHJldHVybiBpZiBub3QgaW4gc2Nhbm5pbmcgKi8KKyAgICBpZiAoKHdkLT5oZWFydEJlYXROb3RpZmljYXRpb24gJiBaTV9CU1NJRF9MSVNUX1NDQU4pCisgICAgICAgICAgICAhPSBaTV9CU1NJRF9MSVNUX1NDQU4pCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9pZiAoIHdkLT5zdGEucFVwZGF0ZUJzc0xpc3QtPmJzc0NvdW50ID09IFpNX01BWF9CU1MgKQorICAgIGlmICggd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID09IFpNX01BWF9CU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmUHJvY2Vzc1Byb2JlUnNwKGRldiwgYnVmLCBBZGRJbmZvKTsKKworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwQWRkSWVTc2lkICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIEFQIGluZm9ybWF0aW9uIGVsZW1lbnQgU1NJRCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFwIDogdmlydHVhbCBBUCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQXBBZGRJZVNzaWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhcCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLnNzaWRMZW5bdmFwXSk7CisKKyAgICAvKiBJbmZvcm1hdGlvbiA6IFNTSUQgKi8KKyAgICBmb3IgKGk9MDsgaTx3ZC0+YXAuc3NpZExlblt2YXBdOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5zc2lkW3ZhcF1baV0pOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQXBBZGRJZVRpbSAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgQVAgaW5mb3JtYXRpb24gZWxlbWVudCBUSU0gdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZEllVGltKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCB2YXApCit7CisgICAgdThfdCB1bmlCaXRNYXBbOV07CisgICAgdTE2X3QgaGlnaGVzdEJ5dGU7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBsZW5PZmZzZXQ7CisgICAgdTE2X3QgaWQ7CisgICAgdTE2X3QgZHN0WzNdOworICAgIHUxNl90IGFpZDsKKyAgICB1MTZfdCBiaXRQb3NpdGlvbjsKKyAgICB1MTZfdCBieXRlUG9zaXRpb247CisgICAgemJ1Zl90KiBwc0J1ZjsKKyAgICB6YnVmX3QqIHRtcEJ1ZkFycmF5W1pNX1VOSV9BUlJBWV9TSVpFXTsKKyAgICB1MTZfdCB0bXBCdWZBcnJheVNpemUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1RJTSk7CisKKyAgICAvKiBvZmZzZXQgb2YgRWxlbWVudCBMZW5ndGggKi8KKyAgICBsZW5PZmZzZXQgPSBvZmZzZXQrKzsKKworICAgIC8qIEluZm9ybWF0aW9uIDogVElNICovCisgICAgLyogRFRJTSBjb3VudCAqLworICAgIC8qIFRPRE8gOiBEb2Vzbid0IHdvcmsgZm9yIFZpcnR1YWwgQVAncyBjYXNlICovCisgICAgd2QtPkN1cnJlbnREdGltQ291bnQrKzsKKyAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPj0gd2QtPmR0aW0pCisgICAgeworICAgICAgICB3ZC0+Q3VycmVudER0aW1Db3VudCA9IDA7CisgICAgfQorICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPkN1cnJlbnREdGltQ291bnQpOworICAgIC8qIERUSU0gcGVyaW9kICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+ZHRpbSk7CisgICAgLyogYml0bWFwIG9mZnNldCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7CisKKyAgICAvKiBVcGRhdGUgQkNNQyBiaXQgKi8KKyAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5hcC50aW1CY21jQml0W3ZhcF0gPSAod2QtPmFwLmJjbWNUYWlsW3ZhcF0hPXdkLT5hcC5iY21jSGVhZFt2YXBdKT8xOjA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5hcC50aW1CY21jQml0W3ZhcF0gPSAwOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBVbmljYXN0IGJpdG1hcCAqLworICAgIC8qIHJlc2V0IGJpdCBtYXAgKi8KKyAgICBmb3IgKGk9MDsgaTw5OyBpKyspCisgICAgeworICAgICAgICB1bmlCaXRNYXBbaV0gPSAwOworICAgIH0KKyAgICBoaWdoZXN0Qnl0ZSA9IDA7CisjaWYgMQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlkID0gd2QtPmFwLnVuaUhlYWQ7CisgICAgd2hpbGUgKGlkICE9IHdkLT5hcC51bmlUYWlsKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSB3ZC0+YXAudW5pQXJyYXlbaWRdOworCisgICAgICAgIC8qIFRPRE8gOiBBZ2luZyBQUyBmcmFtZSBhZnRlciBxdWV1aW5nIGZvciBtb3JlIHRoYW4gMTAgc2Vjb25kcyAqLworCisgICAgICAgIC8qIGdldCBkZXN0aW5hdGlvbiBTVEEncyBhaWQgKi8KKyAgICAgICAgZHN0WzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCAwKTsKKyAgICAgICAgZHN0WzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCAyKTsKKyAgICAgICAgZHN0WzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCA0KTsKKyAgICAgICAgaWYgKChhaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRzdCkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVthaWRdLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgImFpZD0iLGFpZCk7CisgICAgICAgICAgICAgICAgYWlkKys7CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KGFpZDw9NjQpOworICAgICAgICAgICAgICAgIGJpdFBvc2l0aW9uID0gKDEgPDwgKGFpZCAmIDB4NykpOworICAgICAgICAgICAgICAgIGJ5dGVQb3NpdGlvbiA9IChhaWQgPj4gMyk7CisgICAgICAgICAgICAgICAgdW5pQml0TWFwW2J5dGVQb3NpdGlvbl0gfD0gYml0UG9zaXRpb247CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZVBvc2l0aW9uPmhpZ2hlc3RCeXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGVzdEJ5dGUgPSBieXRlUG9zaXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlkID0gKGlkKzEpICYgKFpNX1VOSV9BUlJBWV9TSVpFLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlNlbmQgUFMgZnJhbWUgd2hpY2ggU1RBIG5vIGxvbmdlciBpbiBQUyBtb2RlIik7CisgICAgICAgICAgICAgICAgLyogU2VuZCBQUyBmcmFtZSB3aGljaCBTVEEgbm8gbG9uZ2VyIGluIFBTIG1vZGUgKi8KKyAgICAgICAgICAgICAgICB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoZGV2LCBpZCwgZHN0KTsKKyAgICAgICAgICAgICAgICB0bXBCdWZBcnJheVt0bXBCdWZBcnJheVNpemUrK10gPSBwc0J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkZyZWUgZ2FyYmFnZSBQUyBmcmFtZSIpOworICAgICAgICAgICAgLyogRnJlZSBnYXJiYWdlIFBTIGZyYW1lICovCisgICAgICAgICAgICB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoZGV2LCBpZCwgZHN0KTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICB6ZlF1ZXVlR2VuZXJhdGVVYXBzZFRpbShkZXYsIHdkLT5hcC51YXBzZFEsIHVuaUJpdE1hcCwgJmhpZ2hlc3RCeXRlKTsKKworICAgIHptX21zZzFfbW0oWk1fTFZfMywgImJtPSIsdW5pQml0TWFwWzBdKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJoaWdoZXN0Qnl0ZT0iLGhpZ2hlc3RCeXRlKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJ0aW1CY21jQml0W109Iix3ZC0+YXAudGltQmNtY0JpdFt2YXBdKTsKKworICAgIC8qIGJpdG1hcCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bmlCaXRNYXBbMF0gfCB3ZC0+YXAudGltQmNtY0JpdFt2YXBdKTsKKyAgICBmb3IgKGk9MDsgaTxoaWdoZXN0Qnl0ZTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB1bmlCaXRNYXBbaSsxXSk7CisgICAgfQorCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1ZiwgbGVuT2Zmc2V0LCBoaWdoZXN0Qnl0ZSs0KTsKKworICAgIGZvciAoaT0wOyBpPHRtcEJ1ZkFycmF5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgLyogUHV0IHRvIFZUWFFbYWNdICovCisgICAgICAgIHpmUHV0VnR4cShkZXYsIHRtcEJ1ZkFycmF5W2ldKTsKKyAgICB9CisgICAgLyogUHVzaCBWVFhRW2FjXSAqLworICAgIHpmUHVzaFZ0eHEoZGV2KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcFJlbW92ZUZyb21Qc1F1ZXVlICAgICAgICovCisvKiAgICAgIFJlbW92ZSB6YnVmIGZyb20gUFMgcXVldWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBpZCA6IGluZGV4IGluIHBzIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtb3JlIGRhdGEgYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordThfdCB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoemRldl90KiBkZXYsIHUxNl90IGlkLCB1MTZfdCogYWRkcikKK3sKKyAgICB1MTZfdCBkc3RbM107CisgICAgdTE2X3QgbmlkOworICAgIHU4X3QgbW9yZURhdGEgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5hcC51bmlUYWlsID0gKHdkLT5hcC51bmlUYWlsLTEpICYgKFpNX1VOSV9BUlJBWV9TSVpFLTEpOworICAgIHdoaWxlIChpZCAhPSB3ZC0+YXAudW5pVGFpbCkKKyAgICB7CisgICAgICAgIG5pZCA9IChpZCArIDEpICYgKFpNX1VOSV9BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgIHdkLT5hcC51bmlBcnJheVtpZF0gPSB3ZC0+YXAudW5pQXJyYXlbbmlkXTsKKworICAgICAgICAvKiBTZWFyY2ggdW50aWwgdGFpbCB0byBjb25maWcgbW9yZSBkYXRhIGJpdCAqLworICAgICAgICBkc3RbMF0gPSB6bXdfYnVmX3JlYWRoKGRldiwgd2QtPmFwLnVuaUFycmF5W2lkXSwgMCk7CisgICAgICAgIGRzdFsxXSA9IHptd19idWZfcmVhZGgoZGV2LCB3ZC0+YXAudW5pQXJyYXlbaWRdLCAyKTsKKyAgICAgICAgZHN0WzJdID0gem13X2J1Zl9yZWFkaChkZXYsIHdkLT5hcC51bmlBcnJheVtpZF0sIDQpOworICAgICAgICBpZiAoKGFkZHJbMF0gPT0gZHN0WzBdKSAmJiAoYWRkclsxXSA9PSBkc3RbMV0pCisgICAgICAgICAgICAgICAgJiYgKGFkZHJbMl0gPT0gZHN0WzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgbW9yZURhdGEgPSAweDIwOworICAgICAgICB9CisKKyAgICAgICAgaWQgPSBuaWQ7CisgICAgfQorICAgIHJldHVybiBtb3JlRGF0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQXBBZGRJZVdtZVBhcmEgICAgICAgICAgICAqLworLyogICAgICBBZGQgV01FIFBhcmFtZXRlciBFbGVtZW50IHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZEllV21lUGFyYSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFwKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dJRklfSUUpOworCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDI0KTsKKworICAgIC8qIE9VSSAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDUwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4RjIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMik7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDEpOworCisgICAgLyogUW9TIEluZm8gKi8KKyAgICBpZiAod2QtPmFwLnVhcHNkRW5hYmxlZCkKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg4MSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKyAgICB9CisKKyAgICAvKiBSZXNlcnZlZCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisKKyAgICAvKiBCZXN0IEVmZm9ydCBBQyBwYXJhbWV0ZXJzICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAzKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4QTQpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAwKTsKKyAgICAvKiBCYWNrZnJvdW5kIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MjcpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHhBNCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIC8qIFZpZGVvIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4NDIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg0Myk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDVFKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIC8qIFZvaWNlIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4NjIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgzMik7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDJGKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcFNlbmRCZWFjb24gICAgICAgICAgICAgICovCisvKiAgICAgIFNuZWQgQVAgbW9kZSBiZWFjb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBTZW5kQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCB2YXA7CisgICAgdTE2X3Qgc2VxOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHdkLT5hcC5iZWFjb25Db3VudGVyKys7CisgICAgaWYgKHdkLT5hcC5iZWFjb25Db3VudGVyID49IHdkLT5hcC52YXBOdW1iZXIpCisgICAgeworICAgICAgICB3ZC0+YXAuYmVhY29uQ291bnRlciA9IDA7CisgICAgfQorICAgIHZhcCA9IHdkLT5hcC5iZWFjb25Db3VudGVyOworCisKKyAgICB6bV9tc2cxX21tKFpNX0xWXzIsICJTZW5kIGJlYWNvbiwgdmFwPSIsIHZhcCk7CisKKyAgICAvKiBUQkQgOiBNYXhpbXVtIHNpemUgb2YgYmVhY29uICovCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgYmVhY29uIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gMDsKKworICAgIC8qIHdsYW4gaGVhZGVyICovCisgICAgLyogRnJhbWUgY29udHJvbCAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDA4MCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIER1cmF0aW9uICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHgwMDAwKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAxICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAyICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsxXSk7CisgICAgb2Zmc2V0Kz0yOworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMl0pOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHdkLT5tYWNBZGRyWzJdKyh2YXA8PDgpKSk7IC8vVkFQCisjZW5kaWYKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAzICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsxXSk7CisgICAgb2Zmc2V0Kz0yOworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMl0pOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHdkLT5tYWNBZGRyWzJdKyh2YXA8PDgpKSk7IC8vVkFQCisjZW5kaWYKKyAgICBvZmZzZXQrPTI7CisKKyAgICAvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHNlcSA9ICgod2QtPm1tc2VxKyspPDw0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHNlcSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogMjQtMzEgVGltZSBTdGFtcCA6IGhhcmR3YXJlIHdpbGwgZmlsbCB0aGlzIGZpZWxkICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsyLCAwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzQsIDApOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CisgICAgb2Zmc2V0Kz04OworCisgICAgLyogQmVhY29uIEludGVydmFsICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICBvZmZzZXQrPTI7CisKKyAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOworICAgIG9mZnNldCs9MjsKKworICAgIC8qIFNTSUQgKi8KKyAgICBpZiAod2QtPmFwLmhpZGVTc2lkW3ZhcF0gPT0gMCkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TU0lEKTsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAwKTsKKworICAgIH0KKworICAgIC8qIFN1cHBvcnQgUmF0ZSAqLworICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgIHsKKyAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgIH0KKworICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICBvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIFRJTSAqLworICAgIG9mZnNldCA9IHpmQXBBZGRJZVRpbShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworCisgICAgLyogSWYgV0xBTiBUeXBlIGlzIG5vdCBQVVJFIEIgKi8KKyAgICBpZiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikKKyAgICB7CisgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICB7CisgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLworICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPIDogY291bnRyeSBpbmZvcm1hdGlvbiAqLworICAgIC8qIFRPRE8gOiBSU04gKi8KKyAgICBpZiAod2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllV3BhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CisgICAgfQorCisgICAgLyogV01FIFBhcmFtZXRlcnMgKi8KKyAgICBpZiAod2QtPmFwLnFvc01vZGUgPT0gMSkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVdtZVBhcmEoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICB9CisKKyAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIDEyMTIgOiB3cml0ZSB0byBiZWFjb24gZmlmbyAqLworICAgIC8qIDEyMjEgOiB3cml0ZSB0byBzaGFyZSBtZW1vcnkgKi8KKyAgICB6ZkhwU2VuZEJlYWNvbihkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIEZyZWUgYmVhY29uIGJ1ZmZlciAqLworICAgIC8qIFRPRE86IEluIG9yZGVyIHRvIGZpdCB0aGUgbWFkd2lmaSBiZWFjb24gYXJjaGl0ZWN0dXJlLCB3ZSBuZWVkIHRvCisgICAgICAgZnJlZSBiZWFjb24gYnVmZmVyIGluIHRoZSBIQUwgbGF5ZXIuCisgICAgICovCisKKyAgICAvL3pmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkludHJhYnNzRm9yd2FyZCAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGVkIHRvIHRyYW5zbWl0IGludHJhLUJTUyBmcmFtZSBmcm9tIHVwcGVyIGxheWVyLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAxIDogdW5pY2FzdCBpbnRyYXMtQlNTIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IG90aGVyIGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSW50cmFic3NGb3J3YXJkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCBzcmNWYXApCit7CisgICAgdTE2X3QgZXJyOworICAgIHUxNl90IGFzb2NGbGFnID0gMDsKKyAgICB1MTZfdCBkc3RbM107CisgICAgdTE2X3QgYWlkOworICAgIHUxNl90IHN0YVN0YXRlOworICAgIHpidWZfdCogdHhCdWY7CisgICAgdTE2X3QgbGVuOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgdGVtcDsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCB2YXAgPSAwOworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCs0KTsKKyNlbHNlCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZHN0WzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisjZW5kaWYgIC8vIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorCisgICAgLyogRG8gSW50cmEtQlNTIGZvcndhcmQoZGF0YSBjb3B5KSBpZiBuZWNlc3NhcnkqLworICAgIGlmICgoZHN0WzBdJjB4MSkgIT0gMHgxKQorICAgIHsKKyAgICAgICAgYWlkID0gemZBcEdldFNUQUluZm8oZGV2LCBkc3QsICZzdGFTdGF0ZSwgJnZhcCk7CisgICAgICAgIGlmICgoYWlkICE9IDB4ZmZmZikgJiYgKHN0YVN0YXRlID09IFpNX1NUQVRFX0FTT0MpICYmIChzcmNWYXAgPT0gdmFwKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNvY0ZsYWcgPSAxOworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiSW50cmEtQlNTIGZvcndhcmQgOiBhc29jIFNUQSIpOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmFwID0gc3JjVmFwOworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJJbnRyYS1CU1MgZm9yd2FyZCA6IEJDb3JNQyIpOworICAgIH0KKworICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgPSBhc3NvY2lhdGVkIFNUQSBvciBCQy9NQyAqLworICAgIGlmICgoYXNvY0ZsYWcgPT0gMSkgfHwgKChkc3RbMF0mMHgxKSA9PSAweDEpKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgZnJhbWUgKi8KKyAgICAgICAgaWYgKCh0eEJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fUlhfRlJBTUVfU0laRSkpCisgICAgICAgICAgICAgICAgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiQWxsb2MgaW50cmEtYnNzIGJ1ZiBGYWlsISIpOworICAgICAgICAgICAgZ290byB6bEFsbG9jRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb3B5IGZyYW1lICovCisgICAgICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgdHhCdWYsIGksIHRlbXApOworICAgICAgICB9CisgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCB0eEJ1ZiwgbGVuKTsKKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgICAgICAvKiBUeC1BMiA9IFJ4LUExLCBUeC1BMyA9IFJ4LUEyLCBUeC1BMSA9IFJ4LUEzICovCisgICAgICAgIGZvciAoaT0wOyBpPDY7IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQraSk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIHR4QnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraSwgdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2kpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCB0eEJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUK2ksIHRlbXApOworICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCtpKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgdHhCdWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCtpLCB0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRpZgorCisgICAgICAgIC8qIFRyYW5zbWl0IGZyYW1lICovCisgICAgICAgIC8qIFJldHVybiBlcnJvciBpZiBwb3J0IGlzIGRpc2FibGVkICovCisgICAgICAgIGlmICgoZXJyID0gemZUeFBvcnRDb250cm9sKGRldiwgdHhCdWYsIHZhcCkpID09IFpNX1BPUlRfRElTQUJMRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IFpNX0VSUl9UWF9QT1JUX0RJU0FCTEVEOworICAgICAgICAgICAgZ290byB6bFR4RXJyb3I7CisgICAgICAgIH0KKworI2lmIDEKKyAgICAgICAgLyogQVAgOiBCdWZmZXIgZnJhbWUgZm9yIHBvd2VyIHNhdmluZyBTVEEgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkFwQnVmZmVyUHNGcmFtZShkZXYsIHR4QnVmLCB2YXApKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3J3YXJkIGZyYW1lIGlmIG5vdCBiZWVuIGJ1ZmZlcmVkICovCisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgLyogUHV0IHRvIFZUWFFbYWNdICovCisgICAgICAgICAgICByZXQgPSB6ZlB1dFZ0eHEoZGV2LCB0eEJ1Zik7CisgICAgICAgICAgICAvKiBQdXNoIFZUWFFbYWNdICovCisgICAgICAgICAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCB0eEJ1ZiwgdmFwLCBaTV9JTlRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHJldHVybiBhc29jRmxhZzsKKworemxUeEVycm9yOgorICAgIHpmd0J1ZkZyZWUoZGV2LCB0eEJ1ZiwgMCk7Cit6bEFsbG9jRXJyb3I6CisgICAgcmV0dXJuIGFzb2NGbGFnOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBzYVs2XTsKKyAgICB1MTZfdCBpZCA9IDAsIG1hY0FkZHJbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHNhLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpOworCisgICAgbWFjQWRkclswXSA9IHNhWzBdICsgKHNhWzFdIDw8IDgpOworICAgIG1hY0FkZHJbMV0gPSBzYVsyXSArIChzYVszXSA8PCA4KTsKKyAgICBtYWNBZGRyWzJdID0gc2FbNF0gKyAoc2FbNV0gPDwgOCk7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBtYWNBZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICByZXR1cm4gKCZ3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4TWljS2V5KTsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRUeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHFvc1R5cGUpCit7CisgICAgdThfdCBkYVs2XTsKKyAgICB1MTZfdCBpZCA9IDAsIG1hY0FkZHJbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6ZkNvcHlGcm9tSW50VHhCdWZmZXIoZGV2LCBidWYsIGRhLCAwLCA2KTsKKworICAgIG1hY0FkZHJbMF0gPSBkYVswXSArIChkYVsxXSA8PCA4KTsKKyAgICBtYWNBZGRyWzFdID0gZGFbMl0gKyAoZGFbM10gPDwgOCk7CisgICAgbWFjQWRkclsyXSA9IGRhWzRdICsgKGRhWzVdIDw8IDgpOworCisgICAgaWYgKChtYWNBZGRyWzBdICYgMHgxKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoJndkLT5hcC5iY01pY0tleVswXSk7CisgICAgfQorICAgIGVsc2UgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgbWFjQWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgICpxb3NUeXBlID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NUeXBlOworICAgICAgICByZXR1cm4gKCZ3ZC0+YXAuc3RhVGFibGVbaWRdLnR4TWljS2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordTE2X3QgemZBcFVwZGF0ZVBzQml0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogdmFwLCB1OF90KiB1YXBzZFRyaWcpCit7CisgICAgdTE2X3Qgc3RhU3RhdGU7CisgICAgdTE2X3QgYWlkOworICAgIHUxNl90IHBzQml0OworICAgIHUxNl90IHNyY1szXTsKKyAgICB1MTZfdCBkc3RbMV07CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKSAmIDB4MykgIT0gMykKKyAgICB7CisgICAgICAgIC8qIEFQICovCisgICAgICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgICAgIHBzQml0ID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHgxMCkgPj4gNDsKKyAgICAgICAgLyogR2V0IEFJRCBhbmQgdXBkYXRlIFNUQSBQUyBtb2RlICovCisgICAgICAgIGFpZCA9IHpmQXBHZXRTVEFJbmZvQW5kVXBkYXRlUHMoZGV2LCBzcmMsICZzdGFTdGF0ZSwgdmFwLCBwc0JpdCwgdWFwc2RUcmlnKTsKKworICAgICAgICAvKiBpZiBTVEEgbm90IGFzc29jaWF0ZWQsIHNlbmQgZGVhdXRoICovCisgICAgICAgIGlmICgoYWlkID09IDB4ZmZmZikgfHwgKHN0YVN0YXRlICE9IFpNX1NUQVRFX0FTT0MpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGRzdFswXSYweDEpPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDB4NywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWk1fRVJSX1NUQV9OT1RfQVNTT0NJQVRFRDsKKyAgICAgICAgfQorICAgIH0gLyogaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKSAmIDB4MykgIT0gMykgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBXRFMgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1dEU19TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmFwLndkcy53ZHNCaXRtYXAgJiAoMTw8aSkpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzcmNbMF0gPT0gd2QtPmFwLndkcy5tYWNBZGRyW2ldWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNyY1sxXSA9PSB3ZC0+YXAud2RzLm1hY0FkZHJbaV1bMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3JjWzJdID09IHdkLT5hcC53ZHMubWFjQWRkcltpXVsyXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqdmFwID0gMHgyMCArIGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordm9pZCB6ZkFwUHJvY2Vzc1BzUG9sbCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgc3JjWzNdOworICAgIHUxNl90IGRzdFszXTsKKyAgICB6YnVmX3QqIHBzQnVmID0gTlVMTDsKKyAgICB1MTZfdCBpZDsKKyAgICB1OF90IG1vcmVEYXRhID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBzcmNbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgc3JjWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgIHNyY1syXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKworICAgIC8qIEZpbmQgcHMgYnVmZmVyIGZvciBQc1BvbGwgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlkID0gd2QtPmFwLnVuaUhlYWQ7CisgICAgd2hpbGUgKGlkICE9IHdkLT5hcC51bmlUYWlsKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSB3ZC0+YXAudW5pQXJyYXlbaWRdOworCisgICAgICAgIGRzdFswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIGRzdFsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgMik7CisgICAgICAgIGRzdFsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgNCk7CisKKyAgICAgICAgaWYgKChzcmNbMF0gPT0gZHN0WzBdKSAmJiAoc3JjWzFdID09IGRzdFsxXSkgJiYgKHNyY1syXSA9PSBkc3RbMl0pKQorICAgICAgICB7CisgICAgICAgICAgICBtb3JlRGF0YSA9IHpmQXBSZW1vdmVGcm9tUHNRdWV1ZShkZXYsIGlkLCBzcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwc0J1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWQgPSAoaWQgKyAxKSAmIChaTV9VTklfQVJSQVlfU0laRSAtIDEpOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogU2VuZCBwcyBidWZmZXIgKi8KKyAgICBpZiAocHNCdWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFNlbmQgd2l0aCBtb3JlIGRhdGEgYml0ICovCisgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgcHNCdWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgbW9yZURhdGEpOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU2V0UHJvdGVjdGlvbk1vZGUoemRldl90KiBkZXYsIHUxNl90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKG1vZGUgPT0gMCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAucHJvdGVjdGlvbk1vZGUgIT0gbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV3JpdGUgTUFDJlBIWSByZWdpc3RlcnMgdG8gZGlzYWJsZSBwcm90ZWN0aW9uICovCisKKyAgICAgICAgICAgIHdkLT5hcC5wcm90ZWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnByb3RlY3Rpb25Nb2RlICE9IG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdyaXRlIE1BQyZQSFkgcmVnaXN0ZXJzIHRvIGVuYWJsZSBwcm90ZWN0aW9uICovCisKKyAgICAgICAgICAgIHdkLT5hcC5wcm90ZWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwU2VuZEZhaWx1cmUgICAgICAgICAgICAgKi8KKy8qICAgICAgU2VuZCBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWNlaXZlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBTZW5kRmFpbHVyZSh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBzdGFBZGRyWzNdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgc3RhQWRkclswXSA9IGFkZHJbMF0gKyAoKCh1MTZfdClhZGRyWzFdKTw8OCk7CisgICAgc3RhQWRkclsxXSA9IGFkZHJbMl0gKyAoKCh1MTZfdClhZGRyWzNdKTw8OCk7CisgICAgc3RhQWRkclsyXSA9IGFkZHJbNF0gKyAoKCh1MTZfdClhZGRyWzVdKTw8OCk7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBzdGFBZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogU2VuZCBmYWlsdHVyZSA6IEFkZCAzIG1pbnV0ZXMgdG8gaW5hY3RpdmUgdGltZSB0aGF0IHdpbGwgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgIHdpbGwgbWFrZSBTVEEgYmVlbiBraWNrZWQgb3V0IHNvb24gKi8KKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50aW1lIC09ICgzKlpNX1RJQ0tfUEVSX01JTlVURSk7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc0FjdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBjYXRlZ29yeTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgY2F0ZWdvcnkgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNCk7CisKKyAgICBzd2l0Y2ggKGNhdGVnb3J5KQorICAgIHsKKyAgICBjYXNlIFpNX1dMQU5fQkxPQ0tfQUNLX0FDVElPTl9GUkFNRToKKyAgICAgICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKGRldiwgYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWJhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMKQEAgLTAsMCArMSw1NzgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAicmF0ZWN0cmwuaCIKKyNpbmNsdWRlICIuLi9oYWwvaHByZWcuaCIKKworLyogVE9ETyA6IGNoYW5nZSBnbG9iYWwgdmFyaWFibGUgdG8gY29uc3RhbnQgKi8KK3U4X3QgICB6Z1dwYVJhZGl1c091aVtdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAxIH07Cit1OF90ICAgemdXcGFBZXNPdWlbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9OwordThfdCAgIHpnV3BhMlJhZGl1c091aVtdID0geyAweDAwLCAweDBmLCAweGFjLCAweDAxIH07Cit1OF90ICAgemdXcGEyQWVzT3VpW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQgfTsKKworY29uc3QgdTE2X3QgemNDd1RsYlsxNl0gPSB7ICAgMCwgICAgMSwgICAgMywgICAgNywgICAxNSwgICAzMSwgICA2MywgIDEyNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsICA1MTEsIDEwMjMsIDIwNDcsIDQwOTUsIDQwOTUsIDQwOTUsIDQwOTV9OworCit2b2lkIHpmU3RhU3RhcnRDb25uZWN0Q2IoemRldl90KiBkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTdGFQdXRBcEludG9CbG9ja2luZ0xpc3QgICovCisvKiAgICAgIFB1dCBBUCBpbnRvIGJsb2NraW5nIEFQIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBic3NpZCA6IEFQJ3MgQlNTSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgd2VpZ2h0IDogd2VpZ2h0IG9mIEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZTdGFQdXRBcEludG9CbG9ja2luZ0xpc3QoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkLCB1OF90IHdlaWdodCkKK3sKKyAgICB1MTZfdCBpLCBqOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKHdlaWdodCA+IDApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvKkZpbmQgc2FtZSBic3NpZCBlbnRyeSBmaXJzdCovCisgICAgICAgIGZvciAoaT0wOyBpPFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8NjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0uYWRkcltqXSE9IGJzc2lkW2pdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihqPT02KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qVGhpcyBic3NpZCBkb2Vzbid0IGhhdmUgb2xkIHJlY29yZC5GaW5kIGFuIGVtcHR5IGVudHJ5Ki8KKyAgICAgICAgaWYgKGkgPT0gWk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLndlaWdodCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIGxpc3QgaXMgZnVsbCwgcGljayBvbmUgZW50cnkgZm9yIHJlcGxhY2VtZW50ICovCisgICAgICAgIGlmIChpID09IFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSBic3NpZFs1XSAmIChaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFLTEpOworICAgICAgICB9CisKKyAgICAgICAgLyogVXBkYXRlIEFQIGFkZHJlc3MgYW5kIHdlaWdodCAqLworICAgICAgICBmb3IgKGo9MDsgajw2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0uYWRkcltqXSA9IGJzc2lkW2pdOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgPSB3ZWlnaHQ7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUlzQXBJbkJsb2NraW5nTGlzdCAgICAgKi8KKy8qICAgICAgSXMgQVAgaW4gYmxvY2tpbmcgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJzc2lkIDogQVAncyBCU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRSVUUgOiBBUCBpbiBibG9ja2luZyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGQUxTRSA6IEFQIG5vdCBpbiBibG9ja2luZyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFJc0FwSW5CbG9ja2luZ0xpc3QoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkKQoreworICAgIHUxNl90IGksIGo7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8NjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLmFkZHJbal0gIT0gYnNzaWRbal0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YVJlZnJlc2hCbG9ja0xpc3QgICAgICAgKi8KKy8qICAgICAgSXMgQVAgaW4gYmxvY2tpbmcgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsdXNoRmxhZyA6IGZsdXNoIHdob2xlIGJsb2NraW5nIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmU3RhUmVmcmVzaEJsb2NrTGlzdCh6ZGV2X3QqIGRldiwgdTE2X3QgZmx1c2hGbGFnKQoreworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGZvciAoaT0wOyBpPFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLndlaWdodCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmx1c2hGbGFnICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0ud2VpZ2h0LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwgICAgICAgICAgICAqLworLyogICAgICBIYW5kbGUgQ29ubmVjdCBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnNzaWQgOiBCU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJlYXNvbiA6IHJlYXNvbiBvZiBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmU3RhQ29ubmVjdEZhaWwoemRldl90KiBkZXYsIHUxNl90IHJlYXNvbiwgdTE2X3QqIGJzc2lkLCB1OF90IHdlaWdodCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBDaGFuZ2UgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKKworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CisKKyAgICAvKiBOb3RpZnkgd3JhcHBlciBvZiBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2VzICovCisgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgcmVhc29uLCBic3NpZCk7CisgICAgfQorCisgICAgLyogUHV0IEFQIGludG8gaW50ZXJuYWwgYmxvY2tpbmcgbGlzdCAqLworICAgIHpmU3RhUHV0QXBJbnRvQmxvY2tpbmdMaXN0KGRldiwgKHU4X3QgKilic3NpZCwgd2VpZ2h0KTsKKworICAgIC8qIElzc3VlIGFub3RoZXIgU0NBTiAqLworICAgIGlmICggd2QtPnN0YS5iQXV0b1JlY29ubmVjdCApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJTdGFydCBpbnRlcm5hbCBzY2FuLi4uIik7CisgICAgICAgIHpmU2Nhbk1nclNjYW5TdG9wKGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgIHpmU2Nhbk1nclNjYW5TdGFydChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgIH0KK30KKwordThfdCB6ZmlXbGFuSUJTU0dldFBlZXJTdGF0aW9uc0NvdW50KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7Cit9CisKK3U4X3QgemZpV2xhbklCU1NJdGVyYXRlUGVlclN0YXRpb25zKHpkZXZfdCogZGV2LCB1OF90IG51bVRvSXRlcmF0ZSwgemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiIGNhbGxiYWNrLCB2b2lkICpjdHgpCit7CisgICAgdThfdCBvcHBvc2l0ZUNvdW50OworICAgIHU4X3QgaTsKKyAgICB1OF90IGluZGV4ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgb3Bwb3NpdGVDb3VudCA9IHdkLT5zdGEub3Bwb3NpdGVDb3VudDsKKyAgICBpZiAoIG9wcG9zaXRlQ291bnQgPiBudW1Ub0l0ZXJhdGUgKQorICAgIHsKKyAgICAgICAgb3Bwb3NpdGVDb3VudCA9IG51bVRvSXRlcmF0ZTsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIG9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjYWxsYmFjayhkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXSwgY3R4LCBpbmRleCsrKTsKKyAgICAgICAgb3Bwb3NpdGVDb3VudC0tOworCisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworCitzOF90IHpmU3RhRmluZEZyZWVPcHBvc2l0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgKnNhLCBpbnQgKnBGb3VuZElkeCkKK3sKKyAgICBpbnQgb3Bwb3NpdGVDb3VudDsKKyAgICBpbnQgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG9wcG9zaXRlQ291bnQgPSB3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7CisKKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIG9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvcHBvc2l0ZUNvdW50LS07CisgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgc2EsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy93ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5hbGl2ZUNvdW50ZXIrKzsKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlciA9IFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSOworCisgICAgICAgICAgICAvKiBpdCBpcyBhbHJlYWR5IHN0b3JlZCAqLworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGVyZSdzIHN0aWxsIHNwYWNlIGZvciBuZXcgY29tZXIKKyAgICBpZiAoIHdkLT5zdGEub3Bwb3NpdGVDb3VudCA9PSBaTV9NQVhfT1BQT1NJVEVfQ09VTlQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIEZpbmQgYW4gdW51c2VkIHNsb3QgZm9yIG5ldyBwZWVyIHN0YXRpb24KKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnZhbGlkID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRm91bmRJZHggPSBpOworICAgIHJldHVybiAwOworfQorCitzOF90IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKHpkZXZfdCogZGV2LCB1MTZfdCAqc2EsIHU4X3QgKnBGb3VuZElkeCkKK3sKKyAgICB1MzJfdCBvcHBvc2l0ZUNvdW50OworICAgIHUzMl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBvcHBvc2l0ZUNvdW50ID0gd2QtPnN0YS5vcHBvc2l0ZUNvdW50OworCisgICAgZm9yKGk9MDsgaSA8IFpNX01BWF9PUFBPU0lURV9DT1VOVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBvcHBvc2l0ZUNvdW50ID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0udmFsaWQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgb3Bwb3NpdGVDb3VudC0tOworICAgICAgICBpZiAoIHpmTWVtb3J5SXNFcXVhbCgodThfdCopIHNhLCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyLCA2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwRm91bmRJZHggPSAodThfdClpOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRm91bmRJZHggPSAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB6ZlN0YUluaXRDb21tb25PcHBvc2l0ZUluZm8oemRldl90KiBkZXYsIGludCBpKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIHNldCB0aGUgZGVmYXVsdCByYXRlIHRvIHRoZSBoaWdoZXN0IHJhdGUgKi8KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9IDE7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyID0gWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVI7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUNvdW50Kys7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgLyogU2V0IHBhcmFtZXRlcnMgZm9yIG5ldyBvcHBvc2l0ZSBwZWVyIHN0YXRpb24gISEhICovCisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uY2FtSWR4ID0gMHhmZjsgIC8vIE5vdCBzZXQga2V5IGluIHRoaXMgbG9jYXRpb24KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5wa0luc3RhbGxlZCA9IDA7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQgOyAgLy8gTm8gZW5jcnlwdGlvbgorI2VuZGlmCit9CisKK2ludCB6ZlN0YVNldE9wcG9zaXRlSW5mb0Zyb21CU1NJbmZvKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbykKK3sKKyAgICBpbnQgaTsKKyAgICB1OF90KiAgZHN0OworICAgIHUxNl90ICBzYVszXTsKKyAgICBpbnQgcmVzOworICAgIHUzMl90IG9uZVR4U3RyZWFtQ2FwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZNZW1vcnlDb3B5KCh1OF90Kikgc2EsIHBCc3NJbmZvLT5tYWNhZGRyLCA2KTsKKworICAgIHJlcyA9IHpmU3RhRmluZEZyZWVPcHBvc2l0ZShkZXYsIHNhLCAmaSk7CisgICAgaWYgKCByZXMgIT0gMCApCisgICAgeworICAgICAgICBnb3RvIHpsUmV0dXJuOworICAgIH0KKworICAgIGRzdCA9IHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHI7CisgICAgemZNZW1vcnlDb3B5KGRzdCwgKHU4X3QgKilzYSwgNik7CisKKyAgICBvbmVUeFN0cmVhbUNhcCA9ICh6ZkhwQ2FwYWJpbGl0eShkZXYpICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKTsKKworICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBIYW5kbGUgMTFuICovCisgICAgICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMi40R0h6ICovCisgICAgICAgICAgICBpZiAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDEsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAxLCBwQnNzSW5mby0+U0c0MCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1R0h6ICovCisgICAgICAgICAgICBpZiAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDAsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAwLCBwQnNzSW5mby0+U0c0MCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IEhhbmRsZSAxMW4gKi8KKyAgICAgICAgaWYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgICAgIGlmIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMSwgcEJzc0luZm8tPlNHNDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIDAsIDEsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgICAgIGlmIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMCwgcEJzc0luZm8tPlNHNDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIDEsIDAsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgemZTdGFJbml0Q29tbW9uT3Bwb3NpdGVJbmZvKGRldiwgaSk7Cit6bFJldHVybjoKKyAgICByZXR1cm4gMDsKK30KKworaW50IHpmU3RhU2V0T3Bwb3NpdGVJbmZvRnJvbVJ4QnVmKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICBpbnQgICBpOworICAgIHU4X3QqICBkc3Q7CisgICAgdTE2X3QgIHNhWzNdOworICAgIGludCByZXMgPSAwOworICAgIHUxNl90ICBvZmZzZXQ7CisgICAgdThfdCAgIGJTdXBwb3J0RXh0UmF0ZTsKKyAgICB1MzJfdCBydHNjdHNSYXRlID0gMHhmZmZmZmZmZjsgLyogQ1RTOk9GRE0gNk0sIFJUUzpPRkRNIDZNICovCisgICAgdTMyX3Qgb25lVHhTdHJlYW1DYXA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKTsKKyAgICBzYVsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCsyKTsKKyAgICBzYVsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXMgPSB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCBzYSwgJmkpOworICAgIGlmICggcmVzICE9IDAgKQorICAgIHsKKyAgICAgICAgZ290byB6bFJldHVybjsKKyAgICB9CisKKyAgICBkc3QgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyOworICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgZHN0LCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpOworCisgICAgaWYgKCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkgJiYgISh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgeworICAgICAgICBiU3VwcG9ydEV4dFJhdGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGJTdXBwb3J0RXh0UmF0ZSA9IDE7CisgICAgfQorCisgICAgaWYgKCAoYlN1cHBvcnRFeHRSYXRlID09IDEpCisgICAgICAgICAmJiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICYmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgICAgICAgJiYgKHdkLT53ZmMuYklic3NHTW9kZSA9PSAwKSApCisgICAgeworICAgICAgICBiU3VwcG9ydEV4dFJhdGUgPSAwOworICAgIH0KKworICAgIHdkLT5zdGEuY29ubmVjdGlvbl8xMWIgPSAwOworICAgIG9uZVR4U3RyZWFtQ2FwID0gKHpmSHBDYXBhYmlsaXR5KGRldikgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pOworCisgICAgaWYgKCAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSAhPSAweGZmZmYpCisgICAgICAgICAmJiAoYlN1cHBvcnRFeHRSYXRlID09IDEpICkKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBIYW5kbGUgMTFuICovCisgICAgICAgIGlmICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMW5nCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDEsIHdkLT5zdGEuU0c0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMWcKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAxLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnRzY3RzUmF0ZSA9IDB4MDAwMDFiYjsgLyogQ1RTOkNDSyAxTSwgUlRTOk9GRE0gNk0gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMW5hCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDAsIHdkLT5zdGEuU0c0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMWEKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAwLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnRzY3RzUmF0ZSA9IDB4MTBiMDFiYjsgLyogQ1RTOk9GRE0gNk0sIFJUUzpPRkRNIDZNICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IEhhbmRsZSAxMW4gKi8KKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDIuNEdIeiAqLworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzExbmcKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMSwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgICAgICBydHNjdHNSYXRlID0gMHgwMDAwMWJiOyAvKiBDVFM6Q0NLIDFNLCBSVFM6T0ZETSA2TSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFiCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgMCwgMSwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgICAgICBydHNjdHNSYXRlID0gMHgwOyAvKiBDVFM6Q0NLIDFNLCBSVFM6Q0NLIDFNICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0aW9uXzExYiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1R0h6ICovCisgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFuYQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIChvbmVUeFN0cmVhbUNhcCE9MCk/MzoyLCAwLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFhCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgMSwgMCwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ0c2N0c1JhdGUgPSAweDEwYjAxYmI7IC8qIENUUzpPRkRNIDZNLCBSVFM6T0ZETSA2TSAqLworICAgICAgICB9CisgICAgfQorCisgICAgemZTdGFJbml0Q29tbW9uT3Bwb3NpdGVJbmZvKGRldiwgaSk7CisKK3psUmV0dXJuOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocnRzY3RzUmF0ZSAhPSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgICAgemZIcFNldFJUU0NUU1JhdGUoZGV2LCBydHNjdHNSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCB6ZlN0YVByb3RFcnBNb25pdG9yKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCAgIG9mZnNldDsKKyAgICB1OF90ICAgIGVycDsKKyAgICB1OF90ICAgIGJzc2lkWzZdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpJiYoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSApCisgICAgeworICAgICAgICBaTV9NQUNfV09SRF9UT19CWVRFKHdkLT5zdGEuYnNzaWQsIGJzc2lkKTsKKworICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIGJzc2lkLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChvZmZzZXQ9emZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfRVJQKSkgIT0gMHhmZmZmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIGVycCAmIFpNX0JJVF8xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9uIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJwcm90ZWN0aW9uIG1vZGUgb2ZmIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJLy9DaGVjayB0aGUgZXhpc3RlbmNlIG9mIE5vbi1OIEFQCisJCS8vRm9sbG93IHRoZSBjaGVjayB0aGUgInBCc3NJbmZvLT5FbmFibGVIVCIKKwkJCWlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKwkJCXt9CisJCQllbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorCQkJe30KKwkJCWVsc2UKKwkJCXt3ZC0+c3RhLk5vbk5BUGNvdW50Kys7fQorICAgIH0KK30KKwordm9pZCB6ZlN0YVVwZGF0ZVdtZVBhcmFtZXRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICB0bXA7CisgICAgdTE2X3QgICBhaWZzWzVdOworICAgIHUxNl90ICAgY3dtaW5bNV07CisgICAgdTE2X3QgICBjd21heFs1XTsKKyAgICB1MTZfdCAgIHR4b3BbNV07CisgICAgdThfdCAgICBhY207CisgICAgdThfdCAgICBhYzsKKyAgICB1MTZfdCAgIGxlbjsKKyAgICB1MTZfdCAgIGk7CisgICAJdTE2X3QgICBvZmZzZXQ7CisgICAgdThfdCAgICByeFdtZVBhcmFtZXRlclNldENvdW50OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogVXBkYXRlIGlmIFdNRSBwYXJhbWV0ZXIgc2V0IGNvdW50IGlzIGNoYW5nZWQgKi8KKyAgICAvKiBJZiBjb25uZWN0IHRvIFdNRSBBUCAqLworICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgIHsKKyAgICAgICAgLyogRmluZCBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID49IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnhXbWVQYXJhbWV0ZXJTZXRDb3VudD16bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgaWYgKHJ4V21lUGFyYW1ldGVyU2V0Q291bnQgIT0gd2QtPnN0YS53bWVQYXJhbWV0ZXJTZXRDb3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIndtZVBhcmFtZXRlclNldENvdW50IGNoYW5nZWQhIik7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEud21lUGFyYW1ldGVyU2V0Q291bnQgPSByeFdtZVBhcmFtZXRlclNldENvdW50OworICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZSBXTUUgcGFyYW1ldGVyIGFuZCB1cGRhdGUgVHhRIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgYWNtID0gMHhmOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gKDgrKGkqNCkrNCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wPXptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMCtpKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjID0gKHRtcCA+PiA1KSAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcCAmIDB4MTApID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY20gJj0gKH4oMTw8YWMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlmc1thY10gPSAoKHRtcCAmIDB4ZikgKiA5KSArIDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcD16bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEraSo0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIDJebiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3bWluW2FjXSA9IHpjQ3dUbGJbKHRtcCAmIDB4ZildOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3bWF4W2FjXSA9IHpjQ3dUbGJbKHRtcCA+PiA0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhvcFthY109em13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsxMitpKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhY20gJiAweDQpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3bWluWzJdID0gY3dtaW5bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBjd21heFsyXSA9IGN3bWF4WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgYWlmc1syXSA9IGFpZnNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB0eG9wWzJdID0gdHhvcFswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGFjbSAmIDB4OCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3dtaW5bM10gPSBjd21pblsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3bWF4WzNdID0gY3dtYXhbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBhaWZzWzNdID0gYWlmc1syXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4b3BbM10gPSB0eG9wWzJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN3bWluWzRdID0gMzsKKyAgICAgICAgICAgICAgICAgICAgY3dtYXhbNF0gPSA3OworICAgICAgICAgICAgICAgICAgICBhaWZzWzRdID0gMjg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjd21pblsyXSthaWZzWzJdKSA+ICgoY3dtaW5bMF0rYWlmc1swXSkrMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCit9CisvKiBwcm9jZXNzIDgwMi4xMWggRHluYW1pYyBGcmVxdWVuY3kgU2VsZWN0aW9uICovCit2b2lkIHpmU3RhVXBkYXRlRG90MTFIREZTKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKgorICAgIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBFbGVtZW50IEZvcm1hdAorICAgICstLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfEZvcm1hdHxFbGVtZW50IElEfExlbmd0aHxDaGFubmVsIFN3aXRjaCBNb2RlfE5ldyBDaGFubmVsIE51bWJlcnxDaGFubmVsIFN3aXRjaCBDb3VudHwKKyAgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHxCeXRlcyB8ICAgMSAgICAgIHwgIDEgICB8CSAgICAgMSAgICAgICAgICAgfCAgICAgICAxICAgICAgICAgIHwgICAgICAgICAgMSAgICAgICAgIHwKKyAgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHxWYWx1ZSB8ICAgMzcgICAgIHwgIDMgICB8ICAgICAgIDAgb3IgMSAgICAgIHx1bnNpZ25lZCBpbnRlZ2VyICB8dW5zaWduZWQgaW50ZWdlciAgICB8CisgICAgKy0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAqLworICAgIC8vdThfdCAgICBsZW5ndGgsIGNoYW5uZWwsIGlzNUc7CisgICAgdTE2X3QgICBvZmZzZXQ7CisKKyAgICAvKiBnZXQgRUlEKENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCkgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRSkpID09IDB4ZmZmZiApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkVJRChDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkgPT0gMHgzICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpIGZvdW5kIik7CisKKyAgICAgICAgLy9sZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgIC8vemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMsIG9mZnNldCwgbGVuZ3RoKzIpOworCisgICAgICAgIC8vQ2hhbmVsbCBTd2l0Y2ggTW9kZSBzZXQgdG8gMSwgZHJpdmVyIHNob3VsZCBkaXNhYmxlIHRyYW5zbWl0IGltbWVkaWF0ZQorICAgICAgICAvL3dlIGRvIHRoaXMgYnkgcG9sbCBDQ0EgaGlnaAorICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpID09IDB4MSApCisgICAgICAgIHsKKyAgICAgICAgCS8vdXNlIFpNX09JRF9JTlRFUk5BTF9XUklURSxaTV9DTURfUkVTRVQgdG8gbm90aWNlIGZpcm13YXJlIGZsdXNoIHF1ZW5lIGFuZCBzdG9wIGRtYSwKKyAgICAgICAgCS8vdGhlbiByZXN0YXJ0IHJ4IGRtYSBidXQgbm90IHR4IGRtYQorICAgICAgICAJaWYgKHdkLT5zdGEuREZTRGlzYWJsZVR4ICE9IFRSVUUpCisgICAgICAgIAl7CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IHpmSHBSZXNldFR4Unggd291bGQgY2F1c2UgUnggaGFuZyAqLworICAgICAgICAgICAgICAgIC8vemZIcFJlc2V0VHhSeChkZXYpOworICAgICAgICAgICAgICAgIHdkLT5zdGEuREZTRGlzYWJsZVR4ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAvKiBUcmdnZXIgUnggRE1BICovCisgICAgICAgICAgICAgICAgemZIcFN0YXJ0UmVjdihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAJLy9BZGFwdGVyLT5aRDgwMjExSFNldHRpbmcuRGlzYWJsZVR4Qnk4MDIxMUg9VFJVRTsKKyAgICAgICAgCS8vQWNxdWlyZUN0ck9mUGh5UmVnKEFkYXB0ZXIpOworICAgICAgICAJLy9aRDEyMDVfV1JJVEVfUkVHSVNURVIoQWRhcHRlcixDUjI0LCAweDApOworICAgICAgICAJLy9SZWxlYXNlRG9Ob3RTbGVlcChBZGFwdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkgPD0gMHgyICkKKyAgICAgICAgeworICAgICAgICAJLy9DaGFubmVsIFN3aXRjaAorICAgICAgICAJLy9pZiBDaGFubmVsIFN3aXRjaCBDb3VudCA9IDAgLCBTVEEgc2hvdWxkIGNoYW5nZSBjaGFubmVsIGltbWVkaWF0ZWx5LgorICAgICAgICAJLy9pZiBDaGFubmVsIFN3aXRjaCBDb3VudCA+IDAgLCBTVEEgc2hvdWxkIGNoYW5nZSBjaGFubmVsIGFmdGVyIFRCVFQqY291bnQKKyAgICAgICAgCS8vQnV0IGl0IHdvbid0IGJlIGFjY3VyYXRlIHRvIGxldCBkcml2ZXIgY2FsY3VsYXRlIFRCVFQqY291bnQsIGFuZCB0aGUgdmFsdWUgb2YKKyAgICAgICAgCS8vQ2hhbm5lbCBTd2l0Y2ggQ291bnQgd2lsbCBkZWNyZWFzZSBieSBvbmUgZWFjaCB3aGVuIGNvbnRpbnVlIHJlY2V2aW5nIGJlYWNvbgorICAgICAgICAJLy9TbyB3ZSBjaGFuZ2UgY2hhbm5lbCBoZXJlIHdoZW4gd2UgcmVjZWl2ZSBjb3VudCA8PTIuCisKKyAgICAgICAgICAgIHpmSHBEZWxldGVBbGxvd0NoYW5uZWwoZGV2LCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kpOworICAgICAgICAJd2QtPmZyZXF1ZW5jeSA9IHpmQ2hOdW1Ub0ZyZXEoZGV2LCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyksIDApOworICAgICAgICAJLy96ZkhwQWRkQWxsb3dDaGFubmVsKGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIAl6bV9kZWJ1Z19tc2cxKCJDV1kgLSBqdW1wIHRvIGZyZXF1ZW5jeSA9ICIsIHdkLT5mcmVxdWVuY3kpOworICAgICAgICAJemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIAl3ZC0+c3RhLkRGU0Rpc2FibGVUeCA9IEZBTFNFOworICAgICAgICAgICAgLyogSW5jcmVhc2UgcnhCZWFjb25Db3VudCB0byBwcmV2ZW50IGJlYWNvbiBsb3N0ICovCisgICAgICAgICAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucnhCZWFjb25Db3VudCA9IDEgPDwgNjsgLy8gMiB0aW1lcyBvZiBjaGVjayB3b3VsZCBwYXNzCisgICAgICAgICAgICB9CisgICAgICAgIAkvL3N0YXJ0IHR4IGRtYSB0byB0cmFuc21pdCBwYWNrZXQKKworICAgICAgICAJLy9pZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpICE9IHdkLT5mcmVxdWVuY3kpCisgICAgICAgIAkvL3sKKyAgICAgICAgCS8vCS8vWkREYmdQcmludCgoIlJhZGFyIERldGVjdCBieSBBUFxuIikpOworICAgICAgICAJLy8JemZDb3JlU2V0RnJlcXVlbmN5KCk7CisgICAgICAgIAkvLwlQcm9jZXNzUmFkYXJEZXRlY3RFdmVudChBZGFwdGVyKTsKKyAgICAgICAgCS8vCVNldF9SRl9DaGFubmVsKEFkYXB0ZXIsIFN3UmZkLT5SZmQtPlJ4QnVmZmVyW2luZGV4KzNdLCAoVUNIQVIpQWRhcHRlci0+UkZfTW9kZSwgMSk7CisgICAgICAgIAkvLwlBZGFwdGVyLT5DYXJkU2V0dGluZy5DaGFubmVsID0gU3dSZmQtPlJmZC0+UnhCdWZmZXJbaW5kZXgrM107CisgICAgICAgIAkvLwlBZGFwdGVyLT5TYXZlQ2hhbm5lbCA9IEFkYXB0ZXItPkNhcmRTZXR0aW5nLkNoYW5uZWw7CisgICAgICAgIAkvLwlBZGFwdGVyLT5VdGlsaXR5Q2hhbm5lbCA9IEFkYXB0ZXItPkNhcmRTZXR0aW5nLkNoYW5uZWw7CisgICAgICAgIAkvL30KKyAgICAgICAgfQorICAgIH0KKworfQorLyogVE9ETyA6IHByb2Nlc3MgODAyLjExaCBUcmFuc21pc3Npb24gUG93ZXIgQ29udHJvbCAqLwordm9pZCB6ZlN0YVVwZGF0ZURvdDExSFRQQyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3ZvaWQgemZTdGFJYnNzUFNDaGVja1N0YXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90ICAgaSwgZnJhbWVDdHJsOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBCU1NJRCAqLworICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCAodThfdCopIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VULCA2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMSk7CisKKyAgICAvKiBjaGVjayBwb3dlciBtYW5hZ2VtZW50IGJpdCAqLworICAgIGlmICggZnJhbWVDdHJsICYgWk1fQklUXzQgKQorICAgIHsKKyAgICAgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIHNvdXJjZSBhZGRyZXNzICovCisgICAgICAgICAgICBpZiAoIHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuZW50aXR5W2ldLmJVc2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggaSA9PSBaTV9NQVhfUFNfU1RBICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU1RBIGxpc3QgaXMgZnVsbCAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCwgNik7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLnN0YVBTTGlzdC5jb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZW5hYmxlIEFUSU0gd2luZG93CisgICAgICAgICAgICAvL3pmRW5hYmxlQXRpbVdpbmRvdyhkZXYpOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuY291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmNvdW50ICkKKyAgICB7CisgICAgICAgIGZvcihpPTE7IGk8Wk1fTUFYX1BTX1NUQTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5tYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYlVzZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuY291bnQtLTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iRGF0YVF1ZXVlZCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgcXVldWVkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPnN0YS5zdGFQU0xpc3QuY291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRpc2FibGUgQVRJTSB3aW5kb3cgKi8KKyAgICAgICAgICAgIC8vemZEaXNhYmxlQXRpbVdpbmRvdyhkZXYpOworICAgICAgICB9CisKKyAgICB9Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3U4X3QgemZTdGFJYnNzUFNRdWV1ZURhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgICBpOworICAgIHUxNl90ICBkYVszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggIXpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLnN0YVBTTGlzdC5jb3VudCA9PSAwICYmIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA8PSBaTV9TVEFfUFNfTk9ORSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBEQSAqLworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCArIDIpOworICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUICsgNCk7CisjZWxzZQorICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworI2VuZGlmCisKKyAgICBpZiAoIFpNX0lTX01VTFRJQ0FTVF9PUl9CUk9BRENBU1QoZGEpICkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVswXS5iRGF0YVF1ZXVlZCA9IFRSVUU7CisgICAgICAgIHdkLT5zdGEuaWJzc1BTRGF0YVF1ZXVlW3dkLT5zdGEuaWJzc1BTRGF0YUNvdW50KytdID0gYnVmOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBVbmljYXN0IHBhY2tldC4uLgorCisgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHpmTWVtb3J5SXNFcXVhbCh3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QqKSBkYSwgNikgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBUUlVFOworICAgICAgICAgICAgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQrK10gPSBidWY7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisjaWYgMAorICAgIGlmICggd2QtPnN0YS5wb3dlclNhdmVNb2RlID4gWk1fU1RBX1BTX05PTkUgKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5zdGFQU0RhdGFRdWV1ZVt3ZC0+c3RhLnN0YVBTRGF0YUNvdW50KytdID0gYnVmOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3ZvaWQgemZTdGFJYnNzUFNTZW5kKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICBpOworICAgIHUxNl90ICBiY2FzdEFkZHJbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICF6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPFpNX01BWF9QU19TVEE7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS5zdGFQU0xpc3QuZW50aXR5W2ldLmJEYXRhUXVldWVkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjYXN0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2VuZCBBVElNIHRvIHByZXZlbnQgdGhlIHBlZXIgdG8gZ28gdG8gc2xlZXAKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2X3QqKSB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5pYnNzUFNEYXRhQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbaV0sIDAsCisgICAgICAgICAgICAgICAgICAgIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgfQorCisgICAgd2QtPnN0YS5pYnNzUHJldlBTRGF0YUNvdW50ID0gd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQ7CisgICAgd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQgPSAwOworfQorCisKK3ZvaWQgemZTdGFSZWNvbm5lY3QoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICYmCisgICAgICAgICB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpfHwoemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFJlY292ZXIgemVybyBTU0lEIGxlbmd0aCAgKi8KKyAgICBpZiAoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYgKHdkLT53cy5zc2lkTGVuID09IDApKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZTdGFSZWNvbm5lY3Q6IE5PVCBTdXBwb3J0ISEgU2V0IFNTSUQgdG8gYW55IEJTUyIpOworICAgICAgICAvKiBBTlkgQlNTICovCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEuc3NpZFswXSA9IDA7CisgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IDA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgLy8gUkFZOiBUbyBlbnN1cmUgbm8gVFggcGVuZGluZyBiZWZvcmUgcmUtY29ubmVjdGluZworICAgIHpmRmx1c2hWdHhxKGRldik7CisgICAgemZXbGFuRW5hYmxlKGRldik7CisgICAgemZTY2FuTWdyU2NhbkFjayhkZXYpOworfQorCit2b2lkIHpmU3RhVGltZXIxMDBtcyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICh3ZC0+dGljayAlIDEwKSA9PSAwICkKKyAgICB7CisgICAgICAgIHpmUHVzaFZ0eHEoZGV2KTsKKy8vICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyTWFpbihkZXYpOworICAgIH0KK30KKworCit2b2lkIHpmU3RhQ2hlY2tSeEJlYWNvbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5iZWFjb25JbnRlcnZhbCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSAxMDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAod2QtPnRpY2sgJSAoKHdkLT5iZWFjb25JbnRlcnZhbCAqIDEwKSAvIFpNX01TX1BFUl9USUNLKSkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHJ4QmVhY29uQ291bnQgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4QmVhY29uQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5iZWFjb25NaXNzU3RhdGUgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJLypub3RpZnkgQVAgdGhhdCB3ZSBsZWZ0Ki8KKyAgICAgICAgICAgIAl6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgLyogQmVhY29uIExvc3QgKi8KKyAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQkVBQ09OX01JU1MsCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJzc2lkLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25NaXNzU3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeUV4VjIoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB3ZC0+QmFuZFdpZHRoNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uTWlzc1N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdkLT5zdGEucnhCZWFjb25Db3VudCA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCit2b2lkIHpmU3RhQ2hlY2tDb25uZWN0VGltZW91dCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggIXpmU3RhSXNDb25uZWN0aW5nKGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9PUEVOKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8yKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVNTT0NJQVRFKSApCisgICAgeworICAgICAgICBpZiAoICh3ZC0+dGljayAtIHdkLT5zdGEuY29ubmVjdFRpbWVyKSA+IFpNX0lOVEVSVkFMX0NPTk5FQ1RfVElNRU9VVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuZmFpbENudE9mUmVhc3NvKys7CisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmZhaWxDbnRPZlJlYXNzbyA+IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfTk9ORTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImNvbm5lY3QgdGltZW91dCwgc3RhdGUgPSAiLCB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworCitmYWlsZWQ6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZih3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9BVVRPKQorCXsgLy8gRml4IHNvbWUgQVAgbm90IHNlbmQgYXV0aGVudGljYXRpb24gZmFpbGVkIG1lc3NhZ2UgdG8gc3RhIGFuZCBsZWFkIHRvIGNvbm5lY3QgdGltZW91dCAhCisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQrKzsKKwl9CisgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX1RJTUVPVVQsIHdkLT5zdGEuYnNzaWQsIDIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6Zk1tU3RhVGltZVRpY2soemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogYWlyb3BlZWsgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVAgJiYgIXdkLT5zd1NuaWZmZXIpCisgICAgeworICAgICAgICBpZiAoIHdkLT50aWNrICYgMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmVGltZXJDaGVja0FuZEhhbmRsZShkZXYpOworICAgICAgICB9CisKKyAgICAgICAgemZTdGFDaGVja1J4QmVhY29uKGRldik7CisgICAgICAgIHpmU3RhVGltZXIxMDBtcyhkZXYpOworICAgICAgICB6ZlN0YUNoZWNrQ29ubmVjdFRpbWVvdXQoZGV2KTsKKyAgICAgICAgemZQb3dlclNhdmluZ01nck1haW4oZGV2KTsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqLworICAgIHpmQWdnU2NhbkFuZENsZWFyKGRldiwgd2QtPnRpY2spOworI2VuZGlmCit9CisKK3ZvaWQgemZTdGFTZW5kQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHUxNl90IG9mZnNldCwgc2VxOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem1fZGVidWdfbXNnMCgiXG4iKTsKKworICAgIC8qIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBiZWFjb24gKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJBbGxvY2F0ZSBiZWFjb24gYnVmZmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gMDsKKyAgICAvKiB3bGFuIGhlYWRlciAqLworICAgIC8qIEZyYW1lIGNvbnRyb2wgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDAwODApOworICAgIG9mZnNldCs9MjsKKyAgICAvKiBEdXJhdGlvbiAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAwMCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMSAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMiAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5tYWNBZGRyWzBdKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMV0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsyXSk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMyAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+c3RhLmJzc2lkWzFdKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5ic3NpZFsyXSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogU2VxdWVuY2UgbnVtYmVyICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBzZXEgPSAoKHdkLT5tbXNlcSsrKTw8NCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBzZXEpOworICAgIG9mZnNldCs9MjsKKworICAgIC8qIDI0LTMxIFRpbWUgU3RhbXAgOiBoYXJkd2FyZSB3aWxsIGZpbGwgdGhpcyBmaWVsZCAqLworICAgIG9mZnNldCs9ODsKKworICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogQ2FwYWJpbGl0eSAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CisKKyAgICAvKiBTU0lEICovCisgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICBpZih3ZC0+ZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpICAvLyAyLjQgR0h6ICBiK2cKKyAgICB7CisKKyAgICAJLyogU3VwcG9ydCBSYXRlICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisKKyAgICAJLyogRFMgcGFyYW1ldGVyIHNldCAqLworICAgIAlvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIAlvZmZzZXQgPSB6ZlN0YUFkZEllSWJzcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICBpZiggd2QtPndmYy5iSWJzc0dNb2RlCisgICAgICAgICAgICAmJiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgKSAgICAvLyBPbmx5IGFjY29tcGFueSB3aXRoIGVuYWJsaW5nIGEgbW9kZSAuCisgICAgICAgIHsKKyAgICAgIAkgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgCSAgICB3ZC0+ZXJwRWxlbWVudCA9IDA7CisgICAgICAgCSAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgCX0KKworICAgICAgIAkvKiBUT0RPIDogY291bnRyeSBpbmZvcm1hdGlvbiAqLworICAgICAgICAvKiBSU04gKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ID0gemZ3U3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgorICAgICAgICB7CisgICAgICAgICAgICAvKiBFbmFibGUgRyBNb2RlICovCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKyAgICAgICAJICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworCSAgICB9CisgICAgfQorICAgIGVsc2UgICAgLy8gNUdIeiBhCisgICAgeworICAgICAgICAvKiBTdXBwb3J0IFJhdGUgYSBNb2RlICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKworICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZURzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgCW9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgIC8qIFRPRE8gOiBjb3VudHJ5IGluZm9ybWF0aW9uICovCisgICAgICAgIC8qIFJTTiAqLworICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQTJQU0sgKQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IE5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgb2sgKi8KKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKKyAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgLyogMTIxMiA6IHdyaXRlIHRvIGJlYWNvbiBmaWZvICovCisgICAgLyogMTIyMSA6IHdyaXRlIHRvIHNoYXJlIG1lbW9yeSAqLworICAgIHpmSHBTZW5kQmVhY29uKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgLyogRnJlZSBiZWFjb24gYnVmZmVyICovCisgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKK30KKwordm9pZCB6ZlN0YVNpZ25hbFN0YXRpc3RpYyh6ZGV2X3QqIGRldiwgdThfdCBTaWduYWxTdHJlbmd0aCwgdThfdCBTaWduYWxRdWFsaXR5KSAvL0NXWWFuZygrKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEFkZCBZb3VyIENvZGUgdG8gRG8gV29ya3MgTGlrZSBNb3ZpbmcgQXZlcmFnZSBIZXJlICovCisgICAgd2QtPlNpZ25hbFN0cmVuZ3RoID0gKHdkLT5TaWduYWxTdHJlbmd0aCAqIDcgKyBTaWduYWxTdHJlbmd0aCAqIDMpLzEwOworICAgIHdkLT5TaWduYWxRdWFsaXR5ID0gKHdkLT5TaWduYWxRdWFsaXR5ICogNyArIFNpZ25hbFF1YWxpdHkgKiAzKS8xMDsKKworfQorCitzdHJ1Y3QgenNCc3NJbmZvKiB6ZlN0YUZpbmRCc3NJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIgKnBQcm9iZVJzcEhlYWRlcikKK3sKKyAgICB1OF90ICAgIGk7CisgICAgdThfdCAgICBqOworICAgIHU4X3QgICAgazsKKyAgICB1OF90ICAgIGlzTWF0Y2hlZCwgbGVuZ3RoLCBjaGFubmVsOworICAgIHUxNl90ICAgb2Zmc2V0LCBmcmVxdWVuY3k7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQpID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzIoImNoZWNrIHBCc3NJbmZvID0gIiwgcEJzc0luZm8pOworCisgICAgICAgIC8qIENoZWNrIEJTU0lEICovCisgICAgICAgIGZvciggaj0wOyBqPDY7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmJzc2lkW2pdICE9IHBQcm9iZVJzcEhlYWRlci0+YnNzaWRbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkJLyogQ2hlY2sgU1NJRCAqLworICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdIDw9IDMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNvbXBhcmUgbGVuZ3RoIGFuZCBzc2lkICovCisgICAgICAgICAgICAgICAgaXNNYXRjaGVkID0gMTsKKwkJCQlpZigocFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdICE9IDApICYmIChwQnNzSW5mby0+c3NpZFsxXSAhPSAwKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgZm9yKCBrPTE7IGs8cFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdICsgMTsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnNzaWRba10gIT0gcFByb2JlUnNwSGVhZGVyLT5zc2lkW2tdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXRjaGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpc01hdGNoZWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgY2hhbm5lbCAqLworICAgICAgICAvKiBBZGQgY2hlY2sgY2hhbm5lbCB0byBzb2x2ZSB0aGUgYnVnICMzMTIyMiAqLworICAgICAgICBpZiAoaXNNYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0RTKSkgIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpmSHBJc0FsbG93ZWRDaGFubmVsKGRldiwgemZDaE51bVRvRnJlcShkZXYsIGNoYW5uZWwsIDApKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gemZDaE51bVRvRnJlcShkZXYsIGNoYW5uZWwsIDApOzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmICggKChmcmVxdWVuY3kgPiAzMDAwKSAmJiAocEJzc0luZm8tPmZyZXF1ZW5jeSA+IDMwMDApKQorICAgICAgICAgICAgICAgICAgICAgfHwgKChmcmVxdWVuY3kgPCAzMDAwKSAmJiAocEJzc0luZm8tPmZyZXF1ZW5jeSA8IDMwMDApKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVkdW5kYW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgfQorCisgICAgaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgeworICAgICAgICBwQnNzSW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBCc3NJbmZvOworfQorCit1OF90IHpmU3RhSW5pdEJzc0luZm8oemRldl90KiBkZXYsIHpidWZfdCogYnVmLAorICAgICAgICBzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlciAqcFByb2JlUnNwSGVhZGVyLAorICAgICAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbywgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvLCB1OF90IHR5cGUpCit7CisgICAgdThfdCAgICBsZW5ndGgsIGNoYW5uZWwsIGlzNUc7CisgICAgdTE2X3QgICBpLCBvZmZzZXQ7CisgICAgdThfdCAgICBhcFFvc0luZm87CisgICAgdTE2X3QgICAgZWFjaElFbGVuZ3RoID0gMDsKKyAgICB1MTZfdCAgIGFjY3VtdWxhdGVMZW4gPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCh0eXBlID09IDEpICYmICgocEJzc0luZm8tPmZsYWcgJiBaTV9CU1NfSU5GT19WQUxJRF9CSVQpICE9IDApKQorICAgIHsKKyAgICAgICAgZ290byB6bFVwZGF0ZVJzc2k7CisgICAgfQorCisgICAgLyogZ2V0IFNTSUQgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9TU0lEKSkgPT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBub3QgZm91bmQiKTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworCXsKKwkJdThfdCBTaG93X0ZsYWcgPSAwOworCQl6ZndHZXRTaG93WmVyb0xlbmd0aFNTSUQoZGV2LCAmU2hvd19GbGFnKTsKKworCQlpZihTaG93X0ZsYWcpCisJCXsKKwkJCWlmIChsZW5ndGggPiBaTV9NQVhfU1NJRF9MRU5HVEggKQorCQkJeworCQkJCXptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBpcyBpbnZhbGlkIik7CisJCQkJZ290byB6bEVycm9yOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworICAgIGlmICggbGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gWk1fTUFYX1NTSURfTEVOR1RIICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBpcyBpbnZhbGlkIik7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKwkJfQorCX0KKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5zc2lkLCBvZmZzZXQsIGxlbmd0aCsyKTsKKworICAgIC8qIGdldCBEUyBwYXJhbWV0ZXIgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9EUykpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgIGlmICggbGVuZ3RoICE9IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBYm5vcm1hbCBEUyBQYXJhbSBTZXQgSUUiKTsKKyAgICAgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBjaGFubmVsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworCisgICAgICAgIGlmICh6ZkhwSXNBbGxvd2VkQ2hhbm5lbChkZXYsIHpmQ2hOdW1Ub0ZyZXEoZGV2LCBjaGFubmVsLCAwKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvLT5mcmVxdWVuY3kgPSB6ZkNoTnVtVG9GcmVxKGRldiwgY2hhbm5lbCwgMCk7IC8vIGF1dG8gY2hlY2sKKyAgICAgICAgcEJzc0luZm8tPmNoYW5uZWwgPSBjaGFubmVsOworCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRFMgcGFyYW1ldGVyIG5vdCBmb3VuZCAqLworICAgICAgICBwQnNzSW5mby0+ZnJlcXVlbmN5ID0gd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5OworICAgICAgICBwQnNzSW5mby0+Y2hhbm5lbCA9IHpmQ2hGcmVxVG9OdW0od2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5LCAmaXM1Ryk7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzZWN1cml0eSB0eXBlICovCisgICAgcEJzc0luZm8tPnNlY3VyaXR5VHlwZSA9IFpNX1NFQ1VSSVRZX1RZUEVfTk9ORTsKKworICAgIC8qIGdldCBtYWNhZGRyICovCisgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5tYWNhZGRyW2ldID0gcFByb2JlUnNwSGVhZGVyLT5zYVtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgYnNzaWQgKi8KKyAgICBmb3IoIGk9MDsgaTw2OyBpKysgKQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmJzc2lkW2ldID0gcFByb2JlUnNwSGVhZGVyLT5ic3NpZFtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgdGltZXN0YW1wICovCisgICAgZm9yKCBpPTA7IGk8ODsgaSsrICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT50aW1lU3RhbXBbaV0gPSBwUHJvYmVSc3BIZWFkZXItPnRpbWVTdGFtcFtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgYmVhY29uIGludGVydmFsICovCisgICAgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdID0gcFByb2JlUnNwSGVhZGVyLT5iZWFjb25JbnRlcnZhbFswXTsKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMV0gPSBwUHJvYmVSc3BIZWFkZXItPmJlYWNvbkludGVydmFsWzFdOworCisgICAgLyogZ2V0IGNhcGFiaWxpdHkgKi8KKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSA9IHBQcm9iZVJzcEhlYWRlci0+Y2FwYWJpbGl0eVswXTsKKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVsxXSA9IHBQcm9iZVJzcEhlYWRlci0+Y2FwYWJpbGl0eVsxXTsKKworICAgIC8qIENvcHkgZnJhbWUgYm9keSAqLworICAgIG9mZnNldCA9IDM2OyAgICAgICAgICAgIC8vIENvcHkgZnJvbSB0aGUgc3RhcnQgb2YgdmFyaWFibGUgSUUKKyAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLW9mZnNldDsKKyAgICBpZiAocEJzc0luZm8tPmZyYW1lQm9keXNpemUgPiAoWk1fTUFYX1BST0JFX0ZSQU1FX0JPRFlfU0laRS0xKSkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gWk1fTUFYX1BST0JFX0ZSQU1FX0JPRFlfU0laRS0xOworICAgIH0KKyAgICBhY2N1bXVsYXRlTGVuID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgZWFjaElFbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0ICsgYWNjdW11bGF0ZUxlbisxKSArIDI7ICAvL0xlbisoRUlEK0RhdGEpCisKKyAgICAgICAgaWYgKCAoZWFjaElFbGVuZ3RoID49IDIpCisgICAgICAgICAgICAgJiYgKChhY2N1bXVsYXRlTGVuICsgZWFjaElFbGVuZ3RoKSA8PSBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSkgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5mcmFtZUJvZHkrYWNjdW11bGF0ZUxlbiwgb2Zmc2V0K2FjY3VtdWxhdGVMZW4sIGVhY2hJRWxlbmd0aCk7CisgICAgICAgICAgICBhY2N1bXVsYXRlTGVuKz0odTE2X3QpZWFjaElFbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAicHJvYmVyc3AgZnJhbWVCb2R5c2l6ZSBhYm5vcm1hbCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoYWNjdW11bGF0ZUxlbiA8IHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplKTsKKyAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IGFjY3VtdWxhdGVMZW47CisKKyAgICAvKiBnZXQgc3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFKSkgPT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChzdXBwb3J0ZWQgcmF0ZXMpIG5vdCBmb3VuZCIpOworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgIGlmICggbGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gWk1fTUFYX1NVUFBfUkFURVNfSUVfU0laRSkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlN1cHBvcnRlZCByYXRlcyBJRSBsZW5ndGggYWJub3JtYWwiKTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcywgb2Zmc2V0LCBsZW5ndGgrMik7CisKKworCisgICAgLyogZ2V0IENvdW50cnkgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9DT1VOVFJZKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9DT1VOVFJZX0lORk9fU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFOworICAgICAgICB9CisgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJzc0luZm8tPmNvdW50cnlJbmZvLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICAgICAgLyogY2hlY2sgODAyLjExZCBzdXBwb3J0IGRhdGEgKi8KKyAgICAgICAgaWYgKHdkLT5zdGEuYjgwMl8xMUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tSVNPKGRldiwgKHU4X3QgKikmcEJzc0luZm8tPmNvdW50cnlJbmZvLCAzKTsKKyAgICAgICAgICAgIC8qIG9ubHkgc2V0IHJlZ3VsYXRvcnkgb25lIHRpbWUgKi8KKyAgICAgICAgICAgIHdkLT5zdGEuYjgwMl8xMUQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IEVSUCBpbmZvcm1hdGlvbiAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VSUCkpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBwQnNzSW5mby0+ZXJwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworICAgIH0KKworICAgIC8qIGdldCBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9TVVBQX1JBVEVTX0lFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkV4dGVuZGVkIHJhdGVzIElFIGxlbmd0aCBhYm5vcm1hbCIpOworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzBdID0gMDsKKyAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgV1BBIElFICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfV1BBX0lFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9JRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT53cGFJZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgICAgIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPSBaTV9TRUNVUklUWV9UWVBFX1dQQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPndwYUllWzFdID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgV1BTIElFICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgNCwgMHhmZikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9XUFNfSUVfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IFpNX01BWF9XUFNfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT53c2NJZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT53c2NJZVsxXSA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IFN1cGVyRyBJRSAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kU3VwZXJHRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICBwQnNzSW5mby0+YXBDYXAgfD0gWk1fU3VwZXJHX0FQOworICAgIH0KKworICAgIC8qIGdldCBYUiBJRSAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kWFJFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hcENhcCB8PSBaTV9YUl9BUDsKKyAgICB9CisKKyAgICAvKiBnZXQgUlNOIElFICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfUlNOX0lFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9JRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5yc25JZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgICAgIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPSBaTV9TRUNVUklUWV9UWVBFX1dQQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPnJzbkllWzFdID0gMDsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBnZXQgQ0VOQyBJRSAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0NFTkNfSUUpKSAhPSAweGZmZmYgKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgICAgICBpZiAobGVuZ3RoID4gWk1fTUFYX0lFX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5jZW5jSWUsIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICBwQnNzSW5mby0+c2VjdXJpdHlUeXBlID0gWk1fU0VDVVJJVFlfVFlQRV9DRU5DOworICAgICAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmPSAweGZmZWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5jZW5jSWVbMV0gPSAwOworICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgLyogZ2V0IFdNRSBQYXJhbWV0ZXIgSUUsIHByb2JlIHJzcCBtYXkgY29udGFpbiBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KKyAgICAvL2lmICggd2QtPmJRb1NFbmFibGUgKQorICAgIHsKKyAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgYXBRb3NJbmZvID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpICYgMHg4MDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT53bWVTdXBwb3J0ID0gMSB8IGFwUW9zSW5mbzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kV2lmaUVsZW1lbnQoZGV2LCBidWYsIDIsIDApKSAhPSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwUW9zSW5mbyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KSAmIDB4ODA7CisgICAgICAgICAgICBwQnNzSW5mby0+d21lU3VwcG9ydCA9IDEgIHwgYXBRb3NJbmZvOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPndtZVN1cHBvcnQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIC8vQ1dZYW5nKCspCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogMTFuIEFQICovCisgICAgICAgIHBCc3NJbmZvLT5FbmFibGVIVCA9IDE7CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkgJiAweDAyKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpICYgMHg0MCkKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPlNHNDAgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPlNHNDAgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMW4gQVAgKi8KKyAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMTsKKyAgICAgICAgcEJzc0luZm8tPmFwQ2FwIHw9IFpNX0FsbDExTl9BUDsKKyAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSAmIDB4MDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikgJiAweDQwKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+U0c0MCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+U0c0MCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMDsKKyAgICB9CisgICAgLyogSFQgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBhdGhlcm9zIHByZSBuICovCisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSAmIDB4MDM7CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVElORk9STUFUSU9OKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogcHJlIG4gMi4wIHN0YW5kYXJkICovCisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSAmIDB4MDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKCAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkKKyAgICAgICAgICYmICgocEJzc0luZm8tPmV4dENoT2Zmc2V0ICE9IDEpICYmIChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgIT0gMykpICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICB9CisKKyAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkKKyAgICB7CisgICAgICAgIGlmICh6ZkhwSXNBbGxvd2VkQ2hhbm5lbChkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3krKChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQ9PTEpPzIwOi0yMCkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIG5vdCBhbiBhbGxvd2VkIGNoYW5uZWwsIHRyZWF0IEFQIGFzIG5vbi1IVCBtb2RlICovCisgICAgICAgICAgICBwQnNzSW5mby0+RW5hYmxlSFQgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmVuYWJsZUhUNDAgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmV4dENoT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBBVEggRXh0ZW5kZWQgQ2FwYWJpbGl0eSAqLworICAgIGlmICggKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKSYmCisgICAgICAgICgob2Zmc2V0ID0gemZGaW5kQnJkY21NcnZsUmxua0V4dENhcChkZXYsIGJ1ZikpID09IDB4ZmZmZikpCisKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hdGhPd2xBcCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hdGhPd2xBcCA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IEJyb2FkY29tIEV4dGVuZGVkIENhcGFiaWxpdHkgKi8KKyAgICBpZiAoIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkgLy8oKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgICAgICAmJiAoKG9mZnNldCA9IHpmRmluZEJyb2FkY29tRXh0Q2FwKGRldiwgYnVmKSkgIT0gMHhmZmZmKSApCisgICAgeworICAgICAgICBwQnNzSW5mby0+YnJvYWRjb21IVEFwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmJyb2FkY29tSFRBcCA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IE1hcnZlbCBFeHRlbmRlZCBDYXBhYmlsaXR5ICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRNYXJ2ZWxFeHRDYXAoZGV2LCBidWYpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICBwQnNzSW5mby0+bWFydmVsQXAgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQnNzSW5mby0+bWFydmVsQXAgPSAwOworICAgIH0KKworICAgIC8qIGdldCBBVElNIHdpbmRvdyAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0lCU1MpKSAhPSAweGZmZmYgKQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmF0aW1XaW5kb3cgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLG9mZnNldCsyKTsKKyAgICB9CisKKyAgICAvKiBGaXQgZm9yIHN1cHBvcnQgbW9kZSAqLworICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5ID4gMzAwMCkgeworICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV81X04pIHsKKyNpZiAwCisgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV81XzU0KSB7CisgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBhLCBuICovCisgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG4gKi8KKyAgICAgICAgICAgICAgICAvKiByZWplY3Qgbm9uLW4gYnNzIGluZm8gKi8KKyAgICAgICAgICAgICAgICBpZiAoIXBCc3NJbmZvLT5FbmFibGVIVCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfNV81NCkgeworICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYSAqLworICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBuIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+RW5hYmxlSFQgPSAwOworICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+YXBDYXAgJj0gKH5aTV9BbGwxMU5fQVApOworICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUSU5GT1JNQVRJT04pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG5vbmUgKi8KKyAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfTikgeworI2lmIDAKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzU0KSB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfMTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBiLCBnLCBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IGcsIG4gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcmVqZWN0IGItb25seSBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoICghcEJzc0luZm8tPkVuYWJsZUhUKQorICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfMTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBiLCBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIDEuIHJlamVjdCBnLW9ubHkgYnNzIGluZm8KKyAgICAgICAgICAgICAgICAgICAgICogMi4gaWYgbm9uIGctb25seSwgZGVsZXRlIGcgbW9kZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhcEJzc0luZm8tPkVuYWJsZUhUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkdhdGhlckJNb2RlKGRldiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZXJwID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gemZSZW1vdmVFbGVtZW50KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keSwgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VSUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5LCBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmVXBkYXRlRWxlbWVudChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHksIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIHJlamVjdCBub24tbiBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXBCc3NJbmZvLT5FbmFibGVIVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZGVsZXRlIG4gbW9kZSBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5hcENhcCAmPSAoflpNX0FsbDExTl9BUCk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFkpOworICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwgWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWSk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTik7CisKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzU0KSB7CisjaWYgMAorICAgICAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzExKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYiwgZyAqLworICAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgbiBtb2RlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBnICovCisgICAgICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBuIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcmVqZWN0IGItb25seSBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzExKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYiAqLworICAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgbiBtb2RlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICggemZJc0dPbmx5TW9kZShkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3ksIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gemxFcnJvcjI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkdhdGhlckJNb2RlKGRldiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5lcnAgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keSwgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVJQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gemZSZW1vdmVFbGVtZW50KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5LCBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlVwZGF0ZUVsZW1lbnQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHksIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwQnNzSW5mby0+ZmxhZyB8PSBaTV9CU1NfSU5GT19WQUxJRF9CSVQ7CisKK3psVXBkYXRlUnNzaToKKyAgICAvKiBVcGRhdGUgVGltZXIgaW5mb3JtYXRpb24gKi8KKyAgICBwQnNzSW5mby0+dGljayA9IHdkLT50aWNrOworCisgICAgLyogVXBkYXRlIEVSUCBpbmZvcm1hdGlvbiAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VSUCkpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBwQnNzSW5mby0+ZXJwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworICAgIH0KKworICAgIGlmKCAoczhfdClwQnNzSW5mby0+c2lnbmFsU3RyZW5ndGggPCAoczhfdClBZGRJbmZvLT5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgxICkKKyAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBzaWduYWwgc3RyZW5ndGggKi8KKyAgICAgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID0gKHU4X3QpQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMTsKKyAgICAgICAgLyogVXBkYXRlIHNpZ25hbCBxdWFsaXR5ICovCisgICAgICAgIHBCc3NJbmZvLT5zaWduYWxRdWFsaXR5ID0gKHU4X3QpKEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDEgKiAyKTsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIHNvcnRpbmcgdmFsdWUgICovCisgICAgICAgIHBCc3NJbmZvLT5zb3J0VmFsdWUgPSB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzWzZdICsgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworemxFcnJvcjoKKworICAgIHJldHVybiAxOworCit6bEVycm9yMjoKKworICAgIHJldHVybiAyOworfQorCit2b2lkIHpmU3RhUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykgLy9DV1lhbmcobSkKK3sKKyAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHN0cnVjdCB6c1dsYW5CZWFjb25GcmFtZUhlYWRlciogIHBCZWFjb25IZWFkZXI7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgdThfdCAgIHBCdWZbc2l6ZW9mKHN0cnVjdCB6c1dsYW5CZWFjb25GcmFtZUhlYWRlcildOworICAgIHU4X3QgICBic3NpZFs2XTsKKyAgICBpbnQgICAgcmVzOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIHN0YSByb3V0aW5lIGpvYnMgKi8KKyAgICB6ZlN0YVByb3RFcnBNb25pdG9yKGRldiwgYnVmKTsgIC8qIGNoZWNrIHByb3RlY3Rpb24gbW9kZSAqLworCisgICAgaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICB7CisgICAgICAgIFpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYnNzaWQpOworCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBic3NpZCwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclByb2Nlc3NCZWFjb24oZGV2LCBidWYpOworICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlV21lUGFyYW1ldGVyKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlRG90MTFIREZTKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlRG90MTFIVFBDKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2lnbmFsIHN0cmVuZ3RoIGFuZCBzaWduYWwgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIHpmU3RhU2lnbmFsU3RhdGlzdGljKGRldiwgQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5KTsgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4QmVhY29uQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIGJzc2lkLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQsIDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCBldmVudDsKKworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIjIwMDcwOTE2IFJlY2VpdmUgb3Bwb3NpdGUgQmVhY29uISIpOworICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5pYnNzUmVjZWl2ZUJlYWNvbkNvdW50Kys7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHJlcyA9IHpmU3RhU2V0T3Bwb3NpdGVJbmZvRnJvbVJ4QnVmKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBwZWVyIHN0YXRpb24gZm91bmQuIE5vdGlmeSB0aGUgd3JhcHBlciBub3cKKyAgICAgICAgICAgICAgICAgICAgemZJbml0UGFydG5lck5vdGlmeUV2ZW50KGRldiwgYnVmLCAmZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMSwgJmV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2lnbmFsIHN0cmVuZ3RoIGFuZCBzaWduYWwgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIHpmU3RhU2lnbmFsU3RhdGlzdGljKGRldiwgQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5KTsgLy9DV1lhbmcoKykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZSBpZiAoIHdkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgPT0gWk1fSUJTU19QQVJUTkVSX0xPU1QgKQorICAgICAgICAgICAgLy8gV2h5IGRvZXMgdGhpcyBoYXBwZW4gaW4gSUJTUz8/IFRoZSBpbXBhY3Qgb2YgVmlzdGEgc2luY2UKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdGVsbCBpdCB0aGUgQlNTSUQKKyNpZiAwCisgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS5vcHBvc2l0ZUNvdW50ID09IDAgKQorICAgICAgICAgICAgeyAgIC8qIElCU1MgbWVyZ2UgaWYgU1NJRCBtYXRjaGVkICovCisgICAgICAgICAgICAgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpICE9IDB4ZmZmZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLnNzaWRMZW4gPT0gem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsyLCB3ZC0+c3RhLnNzaWRMZW4pKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlJbmZvID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNhcGFiaWxpdHlJbmZvICYgWk1fQklUXzEgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmIFpNX0JJVF80KSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhcGFiaWxpdHlJbmZvICYgWk1fQklUXzQpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIklCU1MgbWVyZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVXBkYXRlQnNzaWQoZGV2LCBic3NpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXR1cm4gaWYgbm90IGNoYW5uZWwgc2NhbiAqLworICAgIGlmICggIXdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIGdvdG8gemxSZXR1cm47CisgICAgfQorCisgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnVmLCAwLCBzaXplb2Yoc3RydWN0IHpzV2xhbkJlYWNvbkZyYW1lSGVhZGVyKSk7CisgICAgcEJlYWNvbkhlYWRlciA9IChzdHJ1Y3QgenNXbGFuQmVhY29uRnJhbWVIZWFkZXIqKSBwQnVmOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiYnNzIGNvdW50ID0gIiwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KTsKKworICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcEJlYWNvbkhlYWRlcik7CisKKyAgICBpZiAoIHBCc3NJbmZvID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYSBuZXcgZW50cnkgaWYgQlNTIG5vdCBpbiB0aGUgc2NhbiBsaXN0ICovCisgICAgICAgIHBCc3NJbmZvID0gemZCc3NJbmZvQWxsb2NhdGUoZGV2KTsKKyAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhSW5pdEJzc0luZm8oZGV2LCBidWYsIHBCZWFjb25IZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKKyAgICAgICAgICAgIC8vemZEdW1wU1NJRChwQnNzSW5mby0+c3NpZFsxXSwgJihwQnNzSW5mby0+c3NpZFsyXSkpOworICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcEJlYWNvbkhlYWRlciwgcEJzc0luZm8sIEFkZEluZm8sIDEpOworICAgICAgICBpZiAocmVzID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHg7CisKKyAgICAgICAgICAgIC8vIEl0IHdvdWxkIHJlc2V0IHRoZSBhbGl2ZSBjb3VudGVyIGlmIHRoZSBwZWVyIHN0YXRpb24gaXMgZm91bmQhCisgICAgICAgICAgICB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCAodTE2X3QgKilwQnNzSW5mby0+bWFjYWRkciwgJmlkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit6bFJldHVybjoKKworICAgIHJldHVybjsKK30KKworCit2b2lkIHpmQXV0aEZyZXFDb21wbGV0ZUNiKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9PSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX0NPTVBMRVRFRCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSIpOworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lciA9IHdkLT50aWNrOworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc0F1dGggICAgICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIGF1dGhlbnRpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGUgOiBBUCBhbGxvd3Mgb25lIGF1dGhlbnRpY2F0aW5nIFNUQSBhdCBhIHRpbWUsIGRvZXMgbm90ICAgICAgICAgICovCisvKiAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBNYWtlIHN1cmUgICAgICAgICAgICAqLworLyogICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgYmUgYmxvY2tlZCBkdWUgICAgICAgICAgKi8KKy8qICAgICAgICB0byBpbmNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UuICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIHpmU3RhUHJvY2Vzc0F1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKQoreworICAgIHN0cnVjdCB6c1dsYW5BdXRoRnJhbWVIZWFkZXIqIHBBdXRoRnJhbWU7CisgICAgdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkF1dGhGcmFtZUhlYWRlcildOworICAgIHUzMl90IHAxLCBwMjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEF1dGhGcmFtZSA9IChzdHJ1Y3QgenNXbGFuQXV0aEZyYW1lSGVhZGVyKikgcEJ1ZjsKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsIHNpemVvZihzdHJ1Y3QgenNXbGFuQXV0aEZyYW1lSGVhZGVyKSk7CisKKyAgICBpZiAoIHdkLT5zdGEuY29ubmVjdFN0YXRlID09IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiApCisgICAgeworICAgICAgICBpZiAoICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c2VxKSA9PSAyKSYmCisgICAgICAgICAgICAgKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5hbGdvKSA9PSAwKSYmCisgICAgICAgICAgICAgKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5zdGF0dXMpID09IDApICkKKyAgICAgICAgeworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0VGltZXIgPSB3ZC0+dGljazsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLy9TZXQgY2hhbm5lbCBhY2NvcmRpbmcgdG8gQVAncyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAvL01vdmUgdG8gaGVyZSBiZWNhdXNlIG9mIENpc2NvIDExbiBBUCBmZWF0dXJlCisgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgemZBdXRoRnJlcUNvbXBsZXRlQ2IpOworCisgICAgICAgICAgICAvKiBzZW5kIGFzc29jaWF0aW9uIGZyYW1lICovCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgc3RhdHVzID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhGcmFtZS0+c3RhdHVzKTsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX0FVVE8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAxOworICAgICAgICAgICAgICAgIHpmU3RhU3RhcnRDb25uZWN0KGRldiwgd2QtPnN0YS5iSXNTaGFyZWRLZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0FVVEhfRkFJTEVELCB3ZC0+c3RhLmJzc2lkLCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xICkKKyAgICB7CisgICAgICAgIGlmICggKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5hbGdvKSA9PSAxKSAmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c2VxKSA9PSAyKSAmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c3RhdHVzKSA9PSAwKSkKKyAgICAgICAgICAgICAgLy8mJiAocEF1dGhGcmFtZS0+Y2hhbGxlbmdlVGV4dFsxXSA8PSAyNTUpICkKKyAgICAgICAgeworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEuY2hhbGxlbmdlVGV4dCwgcEF1dGhGcmFtZS0+Y2hhbGxlbmdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aEZyYW1lLT5jaGFsbGVuZ2VUZXh0WzFdKzIpOworCisgICAgICAgICAgICAvKiBzZW5kIHRoZSAzcmQgYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICAgICAgICAgIHAxID0gMHgzMDAwMTsKKyAgICAgICAgICAgIHAyID0gMDsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NpZCwgcDEsIHAyLCAwKTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFRpbWVyID0gd2QtPnRpY2s7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVUJfU1RBVEVfQVVUSF9TSEFSRV8yIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMjsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJhdXRoZW50aWNhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoRnJhbWUtPnN0YXR1cyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQVVUSF9GQUlMRUQsIHdkLT5zdGEuYnNzaWQsIDMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9PSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzIgKQorICAgIHsKKyAgICAgICAgaWYgKCAoem13X2xlMTZfdG9fY3B1KHBBdXRoRnJhbWUtPmFsZ28pID09IDEpJiYKKyAgICAgICAgICAgICAoem13X2xlMTZfdG9fY3B1KHBBdXRoRnJhbWUtPnNlcSkgPT0gNCkmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c3RhdHVzKSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy9Nb3ZlIHRvIGhlcmUgYmVjYXVzZSBvZiBDaXNjbyAxMW4gQVAgZmVhdHVyZQorICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5RXgoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB3ZC0+QmFuZFdpZHRoNDAsCisgICAgICAgICAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQsIE5VTEwpOworCisgICAgICAgICAgICAvKiBzZW5kIGFzc29jaWF0aW9uIGZyYW1lICovCisgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0VGltZXIgPSB3ZC0+dGljazsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NVQl9TVEFURV9BU1NPQ0lBVEUiKTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVNTT0NJQVRFOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgc3RhdHVzID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhGcmFtZS0+c3RhdHVzKTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QiKTsKKyAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BVVRIX0ZBSUxFRCwgd2QtPnN0YS5ic3NpZCwgMyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgidW5rbm93biBjYXNlIik7CisgICAgfQorfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Fzb2NSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKQoreworCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Fzb2NSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHN0cnVjdCB6c1dsYW5Bc3NvRnJhbWVIZWFkZXIqIHBBc3NvRnJhbWU7CisgICAgdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkFzc29GcmFtZUhlYWRlcildOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUzMl90IG9uZVR4U3RyZWFtQ2FwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEFzc29GcmFtZSA9IChzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKikgcEJ1ZjsKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsIHNpemVvZihzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKSk7CisKKyAgICBpZiAoIHdkLT5zdGEuY29ubmVjdFN0YXRlID09IFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSApCisgICAgeworICAgICAgICBpZiAoIHBBc3NvRnJhbWUtPnN0YXR1cyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCIpOworCisgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEud21lQ29ubmVjdGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgod2QtPnN0YS53bWVFbmFibGVkICYgWk1fU1RBX1dNRV9FTkFCTEVfQklUKSAhPSAwKSAvL1dNRSBlbmFibGVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQXNvYyByc3AgbWF5IGNvbnRhaW4gV01FIHBhcmFtZXRlciBlbGVtZW50ICovCisgICAgICAgICAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIldNRSBlbmFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53bWVDb25uZWN0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9VQVBTRF9FTkFCTEVfQklUKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KSAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiVUFQU0QgZW5hYmxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5xb3NJbmZvID0gd2QtPnN0YS53bWVRb3NJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgemZTdGFVcGRhdGVXbWVQYXJhbWV0ZXIoZGV2LCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVzcG9uc2UgZnJhbWUgYm9keSwgZm9yIFZJU1RBIG9ubHkKKyAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JzcEZyYW1lQm9keVNpemUgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS0yNDsKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplID4gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JzcEZyYW1lQm9keVNpemUgPSBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5W2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSsyNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpmU3RhU3RvcmVBc29jUnNwSWUoZGV2LCBidWYpOworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgJiYKKyAgICAgICAgICAgICAgICAoKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0KSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICh3ZC0+RXh0T2Zmc2V0ICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy96ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgIC8vICAgICAgICB3ZC0+RXh0T2Zmc2V0LCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb21wbGV0ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfVEtJUF9FTkNSWV9FTikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHpmQWdnU2VuZEFkZGJhUmVxdWVzdChkZXYsIHdkLT5zdGEuYnNzaWQsIDAsIDApOworICAgICAgICAgICAgICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9USU1FT1VUX0FEREJBLCAxMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2V0IFJJRlMgc3VwcG9ydCAqLworICAgICAgICAgICAgaWYod2QtPnN0YS5pZS5IdEluZm8uQ2hhbm5lbEluZm8gJiBFeHRIdENhcF9SSUZTTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUMjA0MCA9IDE7CisvLyAgICAgICAgICAgICAgICB6ZkhwU2V0UmlmcyhkZXYsIHdkLT5zdGEuRW5hYmxlSFQsIDEsICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKT8gMTowKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPnN0YS5haWQgPSBwQXNzb0ZyYW1lLT5haWQgJiAweDNmZmY7CisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlQ291bnQgPSAwOyAgICAvKiByZXNldCBvcHBvc2l0ZSBjb3VudCAqLworICAgICAgICAgICAgemZTdGFTZXRPcHBvc2l0ZUluZm9Gcm9tUnhCdWYoZGV2LCBidWYpOworCisgICAgICAgICAgICB3ZC0+c3RhLnJ4QmVhY29uQ291bnQgPSAxNjsKKworICAgICAgICAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtID0gemZIcEdldFRyYW5zbWl0UG93ZXIoZGV2KTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCAhPSAwKSAvKiAxMW4gKi8KKyAgICAgICAgICAgIAl7CisgICAgCQkgICAgICAgIG9uZVR4U3RyZWFtQ2FwID0gKHpmSHBDYXBhYmlsaXR5KGRldikgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pOworICAgIAkJICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gMSkgLyogSFQ0MCovCisgICAgCQkgICAgICAgIHsKKyAgICAJCQkJCWlmKG9uZVR4U3RyZWFtQ2FwKSAvKiBvbmUgVHggc3RyZWFtICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgaWYgKHdkLT5zdGEuU0c0MCkKKyAgICAJCQkJICAgICAgICB7CisgICAgCQkJCSAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDE1MDAwMDsKKyAgICAJCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMzAwMDAwOworICAgIAkJCQkgICAgICAgIH0KKyAgICAJCQkJICAgICAgICBlbHNlCisgICAgCQkJCSAgICAgICAgeworICAgIAkJCQkgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzUwMDA7CisgICAgCQkJCQkJICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAJCQkJICAgICAgICB9CisgICAgCQkJCSAgICB9CisgICAgCQkJCSAgICBlbHNlIC8qIFR3byBUeCBzdHJlYW1zICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgaWYgKHdkLT5zdGEuU0c0MCkKKyAgICAJCQkJICAgICAgICB7CisgICAgCQkJCSAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDMwMDAwMDsKKyAgICAJCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMzAwMDAwOworICAgIAkJCQkgICAgICAgIH0KKyAgICAJCQkJICAgICAgICBlbHNlCisgICAgCQkJCSAgICAgICAgeworICAgIAkJCQkgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAyNzAwMDA7CisgICAgCQkJCQkJICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAJCQkJICAgICAgICB9CisgICAgCQkJCSAgICB9CisgICAgCQkgICAgICAgIH0KKyAgICAJCSAgICAgICAgZWxzZSAvKiBIVDIwICovCisgICAgCQkgICAgICAgIHsKKyAgICAJCSAgICAgICAgICAgIGlmKG9uZVR4U3RyZWFtQ2FwKSAvKiBvbmUgVHggc3RyZWFtICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzID0gNjUwMDAwOworICAgIAkJCQkJCXdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDEzMDAwMDsKKyAgICAJCQkJICAgIH0KKyAgICAJCQkJICAgIGVsc2UgLyogVHdvIFR4IHN0cmVhbXMgKi8KKyAgICAJCQkJICAgIHsKKyAgICAJCQkJICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzAwMDA7CisgICAgCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMTMwMDAwOworICAgIAkJCQkgICAgfQorICAgIAkJICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLyogMTFhYmcgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmNvbm5lY3Rpb25fMTFiICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDExMDAwOworICAgIAkJCSAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMTEwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSA1NDAwMDsKKyAgICAJCQkgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDU0MDAwOworICAgIAkJCSAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCwgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RCeVJlYXNzbyA9IFRSVUU7CisgICAgICAgICAgICB3ZC0+c3RhLmZhaWxDbnRPZlJlYXNzbyA9IDA7CisKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JDb25uZWN0Tm90aWZ5KGRldik7CisKKyAgICAgICAgICAgIC8qIERpc2FibGUgaGVyZSBiZWNhdXNlIGZpeGVkIHJhdGUgaXMgb25seSBmb3IgdGVzdCwgVEJELiAqLworICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5FbmFibGVIVCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgd2QtPnR4TUNTID0gNzsgLy9SYXRlID0gNjVNYnBzCisgICAgICAgICAgICAvLyAgICB3ZC0+dHhNVCA9IDI7IC8vIEh0IHJhdGUKKyAgICAgICAgICAgIC8vICAgIHdkLT5lbmFibGVBZ2dyZWdhdGlvbiA9IDI7IC8vIEVuYWJsZSBBZ2dyZWdhdGlvbgorICAgICAgICAgICAgLy99CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJhc3NvY2lhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvRnJhbWUtPnN0YXR1cyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RCeVJlYXNzbyA9IEZBTFNFOworICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0FTT0NfRkFJTEVELCB3ZC0+c3RhLmJzc2lkLCAzKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCit2b2lkIHpmU3RhU3RvcmVBc29jUnNwSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUxNl90IGxlbmd0aDsKKyAgICB1OF90ICAqaHRjYXA7CisgICAgdThfdCAgYXNvY0J3NDAgPSAwOworICAgIHU4X3QgIGFzb2NFeHRPZmZzZXQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8d2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5W2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSsyNCk7CisgICAgfQorCisgICAgLyogSFQgY2FwYWJpbGl0aWVzOiAyOCBvY3RldHMgKi8KKyAgICBpZiAoICAgICgod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5ID4gMzAwMCkgJiYgISh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzVfTikpCisgICAgICAgICB8fCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApICYmICEod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgKQorICAgIHsKKyAgICAgICAgLyogbm90IDExbiBBUCAqLworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRDYXA7CisgICAgICAgIGZvciAoaT0wOyBpPDI4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICB3ZC0+RXh0T2Zmc2V0ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIGF0aGVyb3MgcHJlIG4gKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgiYXRoZXJvcyBwcmUgbiIpOworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRDYXA7CisgICAgICAgIGh0Y2FwWzBdID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgaHRjYXBbMV0gPSAyNjsKKyAgICAgICAgZm9yIChpPTE7IGk8PTI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2krMV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMSwgIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMsIGh0Y2FwPSIsIGh0Y2FwW2krMV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBwcmUgbiAyLjAgc3RhbmRhcmQgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicHJlIG4gMi4wIHN0YW5kYXJkIik7CisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdENhcDsKKyAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMSwgIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMsIGh0Y2FwPSIsIGh0Y2FwW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3QgMTFuIEFQICovCisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdENhcDsKKyAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgICAgIHdkLT5FeHRPZmZzZXQgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNvY0J3NDAgPSAodThfdCkoKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0KSA+PiAxKTsKKworICAgIC8qIEhUIGluZm9ybWF0aW9uICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogYXRoZXJvcyBwcmUgbiAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJhdGhlcm9zIHByZSBuIEhUSU5GTyIpOworICAgICAgICBsZW5ndGggPSAyMjsKKyAgICAgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+c3RhLmllLkh0SW5mbzsKKyAgICAgICAgaHRjYXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICBodGNhcFsxXSA9IDIyOworICAgICAgICBmb3IgKGk9MTsgaTw9MjI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaSsxXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiQVNPQzogIEhUIEluZm8sIGh0aW5mbz0iLCBodGNhcFtpKzFdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIHByZSBuIDIuMCBzdGFuZGFyZCAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJwcmUgbiAyLjAgc3RhbmRhcmQgSFRJTkZPIik7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIDEpOworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRJbmZvOworICAgICAgICBmb3IgKGk9MDsgaTwyNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBodGNhcFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiQVNPQzogIEhUIEluZm8sIGh0aW5mbz0iLCBodGNhcFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgibm8gSFRJTkZPIik7CisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdEluZm87CisgICAgICAgIGZvciAoaT0wOyBpPDI0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc29jRXh0T2Zmc2V0ID0gd2QtPnN0YS5pZS5IdEluZm8uQ2hhbm5lbEluZm8gJiBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QmVsb3c7CisKKyAgICBpZiAoKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkgJiYgKGFzb2NCdzQwID09IDEpICYmICgoYXNvY0V4dE9mZnNldCA9PSAxKSB8fCAoYXNvY0V4dE9mZnNldCA9PSAzKSkpCisgICAgeworICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSBhc29jQnc0MDsKKyAgICAgICAgd2QtPkV4dE9mZnNldCA9IGFzb2NFeHRPZmZzZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgICAgIHdkLT5FeHRPZmZzZXQgPSAwOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlN0YVByb2Nlc3NEZWF1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGFwTWFjQWRkclszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogU1RBIDogaWYgU0E9Y29ubmVjdGVkIEFQIHRoZW4gZGlzY29ubmVjdCB3aXRoIEFQICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgeworICAgICAgICBhcE1hY0FkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpOworICAgICAgICBhcE1hY0FkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrMik7CisgICAgICAgIGFwTWFjQWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCs0KTsKKyAgCWlmICgoYXBNYWNBZGRyWzBdID09IHdkLT5zdGEuYnNzaWRbMF0pICYmIChhcE1hY0FkZHJbMV0gPT0gd2QtPnN0YS5ic3NpZFsxXSkgJiYgKGFwTWFjQWRkclsyXSA9PSB3ZC0+c3RhLmJzc2lkWzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHpmd0J1ZkdldFNpemUoZGV2LCBidWYpID49IDI0KzIpIC8vbm90IGEgbWFsZm9ybWVkIGZyYW1lCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHpmU3RhSXNDb25uZWN0aW5nKGRldikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQVVUSF9GQUlMRUQsIHdkLT5zdGEuYnNzaWQsIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgeworICAgICAgICB1MTZfdCBwZWVyTWFjQWRkclszXTsKKyAgICAgICAgdThfdCAgcGVlcklkeDsKKyAgICAgICAgczhfdCAgcmVzOworCisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICAgICAgeworICAgICAgICAgICAgcGVlck1hY0FkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgcGVlck1hY0FkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrMik7CisgICAgICAgICAgICBwZWVyTWFjQWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKGRldiwgcGVlck1hY0FkZHIsICZwZWVySWR4KTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLmFsaXZlQ291bnRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Rpc2Fzb2MoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGFwTWFjQWRkclszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFNUQSA6IGlmIFNBPWNvbm5lY3RlZCBBUCB0aGVuIGRpc2Nvbm5lY3Qgd2l0aCBBUCAqLworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgYXBNYWNBZGRyWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKTsKKyAgICAgICAgYXBNYWNBZGRyWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgICAgICBhcE1hY0FkZHJbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrNCk7CisKKyAgICAgICAgaWYgKChhcE1hY0FkZHJbMF0gPT0gd2QtPnN0YS5ic3NpZFswXSkgJiYgKGFwTWFjQWRkclsxXSA9PSB3ZC0+c3RhLmJzc2lkWzFdKSAmJiAoYXBNYWNBZGRyWzJdID09IHdkLT5zdGEuYnNzaWRbMl0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgPj0gMjQrMikgLy9ub3QgYSBtYWxmb3JtZWQgZnJhbWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQywgd2QtPnN0YS5ic3NpZCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BU09DX0ZBSUxFRCwgd2QtPnN0YS5ic3NpZCwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIHByb2JlIHJlcXVlc3QgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZTdGFQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKQoreworICAgIHUxNl90IG9mZnNldDsKKyAgICB1OF90IGxlbjsKKyAgICB1MTZfdCBpLCBqOworICAgIHUxNl90IHNlbmRGbGFnOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogY2hlY2sgbW9kZSA6IEFQL0lCU1MgKi8KKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSB8fCAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJJZ25vcmUgcHJvYmUgcmVxIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjaGVjayBTU0lEICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9TU0lEKSkgPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAicHJvYmUgcmVxIFNTSUQgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQVBfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCh3ZC0+YXAuYXBCaXRtYXAgJiAoaTw8aSkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKKyAgICAgICAgICAgIC8qIGJvYXJkY2FzdCBTU0lEICovCisgICAgICAgICAgICBpZiAoKGxlbiA9PSAwKSAmJiAod2QtPmFwLmhpZGVTc2lkW2ldID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnNzaWRMZW5baV0gPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxK2opCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gd2QtPmFwLnNzaWRbaV1bal0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IGxlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VuZEZsYWcgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTZW5kIHByb2JlIHJlc3BvbnNlICovCisgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCBpLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZlN0YVByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKK3sKKyAgICAvKiByZXR1cm4gaWYgbm90IGNoYW5uZWwgc2NhbiAqLworICAgIC8vIFByb2JlIHJlc3BvbnNlIGlzIHNlbnQgd2l0aCB1bmljYXN0LiBJcyB0aGlzIHJlcXVpcmVkPworICAgIC8vIElCU1Mgd291bGQgc2VuZCBwcm9iZSByZXF1ZXN0IGFuZCB0aGUgY29kZSBiZWxvdyB3b3VsZCBwcmV2ZW50CisgICAgLy8gdGhlIHByb2JlIHJlc3BvbnNlIGZyb20gaGFuZGxpbmcuCisgICAgI2lmIDAKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICF3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgICNlbmRpZgorCisgICAgemZQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOworfQorCit2b2lkIHpmSUJTU1NldHVwQnNzRGVzYyh6ZGV2X3QgKmRldikKK3sKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgdThfdCBpOworI2VuZGlmCisgICAgc3RydWN0IHpzQnNzSW5mbyAqcEJzc0luZm87CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHBCc3NJbmZvID0gJndkLT5zdGEuaWJzc0Jzc0Rlc2M7CisgICAgemZaZXJvTWVtb3J5KCh1OF90ICopcEJzc0luZm8sIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisKKyAgICBwQnNzSW5mby0+c2lnbmFsU3RyZW5ndGggPSAxMDA7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mby0+bWFjYWRkciwgKHU4X3QgKil3ZC0+bWFjQWRkciw2KTsKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mby0+YnNzaWQsICh1OF90ICopd2QtPnN0YS5ic3NpZCwgNik7CisKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF0gPSAodThfdCkod2QtPmJlYWNvbkludGVydmFsKSA7CisgICAgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzFdID0gKHU4X3QpKCh3ZC0+YmVhY29uSW50ZXJ2YWwpID4+IDgpIDsKKworICAgIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdID0gd2QtPnN0YS5jYXBhYmlsaXR5WzBdOworICAgIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdID0gd2QtPnN0YS5jYXBhYmlsaXR5WzFdOworCisgICAgcEJzc0luZm8tPnNzaWRbMF0gPSBaTV9XTEFOX0VJRF9TU0lEOworICAgIHBCc3NJbmZvLT5zc2lkWzFdID0gd2QtPnN0YS5zc2lkTGVuOworICAgIHpmTWVtb3J5Q29weSgodThfdCAqKSZwQnNzSW5mby0+c3NpZFsyXSwgKHU4X3QgKil3ZC0+c3RhLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJnBCc3NJbmZvLT5mcmFtZUJvZHlbb2Zmc2V0XSwgKHU4X3QgKilwQnNzSW5mby0+c3NpZCwKKyAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuICsgMik7CisgICAgb2Zmc2V0ICs9IHdkLT5zdGEuc3NpZExlbiArIDI7CisKKyAgICAvKiBzdXBwb3J0IHJhdGUgKi8KKworICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICBwQnNzSW5mby0+Y2hhbm5lbCA9IHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCk7CisgICAgcEJzc0luZm8tPmZyZXF1ZW5jeSA9IHdkLT5mcmVxdWVuY3k7CisgICAgcEJzc0luZm8tPmF0aW1XaW5kb3cgPSB3ZC0+c3RhLmF0aW1XaW5kb3c7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICB7CisgICAgICAgIHU4X3QgcnNuWzY0XT0KKyAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IElEICovCisgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQsCisgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdHlwZSwgZGVmYXVsdD1QU0sgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgLyogUlNOIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMAorICAgICAgICB9OworCisgICAgICAgIC8qIE92ZXJ3cml0ZSBHcm91cCBDaXBoZXIgU3VpdGUgYnkgQVAncyBzZXR0aW5nICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rNCwgemdXcGEyQWVzT3VpLCA0KTsKKworICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3ZlcndyaXRlIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBieSBBRVMgKi8KKyAgICAgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTAsIHpnV3BhMkFlc091aSwgNCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSU04gZWxlbWVudCBpZAorICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1JTTl9JRSA7CisKKyAgICAgICAgLy8gUlNOIGxlbmd0aAorICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5W29mZnNldCsrXSA9IHJzblsxXSA7CisKKyAgICAgICAgLy8gUlNOIGluZm9ybWF0aW9uCisgICAgICAgIGZvcihpPTA7IGk8cnNuWzFdOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlbb2Zmc2V0KytdID0gcnNuW2krMl0gOworICAgICAgICB9CisKKyAgICAgICAgemZNZW1vcnlDb3B5KHBCc3NJbmZvLT5yc25JZSwgcnNuLCByc25bMV0rMik7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgemZJYnNzQ29ubmVjdE5ldHdvcmsoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyB0bXBCc3NJbmZvOworICAgIHU4X3QgICBtYWNBZGRyWzZdLCBic3NpZFs2XSwgYnNzTm90Rm91bmQgPSBUUlVFOworICAgIHUxNl90ICBpLCBqPTEwMDsKKyAgICB1MTZfdCAgazsKKyAgICBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgZXZlbnQ7CisgICAgdTMyX3QgIGNoYW5uZWxGbGFnczsKKyAgICB1MTZfdCAgb3Bwb3NpdGVXZXBTdGF0dXM7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogY2hhbmdlIHN0YXRlIHRvIENPTk5FQ1RJTkcgYW5kIHN0b3AgdGhlIGNoYW5uZWwgc2Nhbm5pbmcgKi8KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9DT05ORUNUSU5HKTsKKyAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IEZBTFNFOworICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworCisgICAgLyogRVNTIGJpdCBvZmYgKi8KKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF8wOworICAgIC8qIElCU1MgYml0IG9uICovCisgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF8xOworICAgIC8qIG5vdCBub3QgdXNlIHNob3J0IHNsb3QgdGltZSAqLworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmPSB+Wk1fQklUXzI7CisKKyAgICB3ZC0+c3RhLndtZUNvbm5lY3RlZCA9IDA7CisgICAgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID0gMDsKKyAgICB3ZC0+c3RhLnFvc0luZm8gPSAwOworICAgIHdkLT5zdGEuRW5hYmxlSFQgPSAwOworICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgd2QtPkV4dE9mZnNldCA9IDA7CisKKyAgICBpZiAoIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgeworICAgICAgICAvL1Jlb3JkZXIgQnNzTGlzdCBieSBSU1NJLS1DV1lhbmcoKykKKyAgICAgICAgemZCc3NJbmZvUmVvcmRlckxpc3QoZGV2KTsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICAgICAgZm9yKGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMjAwNzA4MDYgIzEgUHJpdmFjeSBiaXQKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfNCApCisgICAgICAgICAgICB7IC8vIFByaXZhY3kgSWJzcyBuZXR3b3JrCisvLyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJQcml2YWN5IGJpdCBvbiIpOworICAgICAgICAgICAgICAgIG9wcG9zaXRlV2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRDsKKworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnJzbkllWzFdICE9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAocEJzc0luZm8tPnJzbkllWzddID09IDB4MDEpIHx8IChwQnNzSW5mby0+cnNuSWVbN10gPT0gMHgwNSkgKQorICAgICAgICAgICAgICAgICAgICB7IC8vIFdFUC00MCAmIFdFUC0xMDQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQNDAgb3IgV0VQMTA0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBCc3NJbmZvLT5yc25JZVs3XSA9PSAweDAyICkKKyAgICAgICAgICAgICAgICAgICAgeyAvLyBUS0lQCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlRLSVAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9zaXRlV2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwQnNzSW5mby0+cnNuSWVbN10gPT0gMHgwNCApCisgICAgICAgICAgICAgICAgICAgIHsgLy8gQUVTCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNDTVAtQUVTIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiUHJpdmFjeSBiaXQgb2ZmIik7CisgICAgICAgICAgICAgICAgb3Bwb3NpdGVXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoemZNZW1vcnlJc0VxdWFsKCYocEJzc0luZm8tPnNzaWRbMl0pLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuKSkmJgorICAgICAgICAgICAgICAgICAod2QtPnN0YS5zc2lkTGVuID09IHBCc3NJbmZvLT5zc2lkWzFdKSYmCisgICAgICAgICAgICAgICAgIChvcHBvc2l0ZVdlcFN0YXR1cyA9PSB3ZC0+c3RhLndlcFN0YXR1cykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIHN1cHBvcnQgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5ID4gMzAwMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHBCc3NJbmZvLT5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0FfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyB8PSBDSEFOTkVMX0hUNDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0E7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHBCc3NJbmZvLT5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0dfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9HOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCAgICgoY2hhbm5lbEZsYWdzID09IENIQU5ORUxfQikgJiYgKHdkLT5jb25uZWN0TW9kZSAmIFpNX0JJVF8wKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKChjaGFubmVsRmxhZ3MgPT0gQ0hBTk5FTF9HKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzEpKQorICAgICAgICAgICAgICAgICAgICB8fCAoKGNoYW5uZWxGbGFncyA9PSBDSEFOTkVMX0EpICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMikpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoY2hhbm5lbEZsYWdzICYgQ0hBTk5FTF9IVDIwKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzMpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBCeXBhc3MgREZTIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoemZIcElzRGZzQ2hhbm5lbE5DUyhkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3kpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQnlwYXNzIERGUyBjaGFubmVsIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGNoZWNrIElCU1MgYml0ICovCisgICAgICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF8xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1heSBjaGVjayB0aW1lc3RhbXAgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChqIDwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KSAmJiAocEJzc0luZm8gIT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd01lbW9yeUNvcHkoKHU4X3QqKSZ0bXBCc3NJbmZvLCAodThfdCopKHBCc3NJbmZvKSwgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKKyAgICAgICAgICAgIHBCc3NJbmZvID0gJnRtcEJzc0luZm87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8vaWYgKCBqIDwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ICkKKyAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXM7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIklCU1MgZm91bmQiKTsKKworICAgICAgICAgICAgLyogRm91bmQgSUJTUywgcmVzZXQgYnNzTm90Rm91bmRDb3VudCAqLworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuYnNzTm90Rm91bmRDb3VudCA9IDA7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICBic3NOb3RGb3VuZCA9IEZBTFNFOworICAgICAgICAgICAgd2QtPnN0YS5hdGltV2luZG93ID0gcEJzc0luZm8tPmF0aW1XaW5kb3c7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gcEJzc0luZm8tPmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworICAgICAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIHBCc3NJbmZvLT5ic3NpZCk7CisgICAgICAgICAgICB6ZlJlc2V0U3VwcG9ydFJhdGUoZGV2LCBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPKTsKKyAgICAgICAgICAgIHpmVXBkYXRlU3VwcG9ydFJhdGUoZGV2LCBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMpOworICAgICAgICAgICAgemZVcGRhdGVTdXBwb3J0UmF0ZShkZXYsIHBCc3NJbmZvLT5leHRTdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTE2X3QpIHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXSkgPDwgOCk7CisKKyAgICAgICAgICAgIGlmICh3ZC0+YmVhY29uSW50ZXJ2YWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJzbiBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxXSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5yc25JZSwgcEJzc0luZm8tPnJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+cnNuSWVbMV0rMik7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAgICAgLyogSWYgbm90IHVzZSBSU05BICwgcnVuIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmlic3NXcGEyUHNrID0gMTsKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yc25JZVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByaXZhY3kgYml0ICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdICYgWk1fQklUXzQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSB8PSBaTV9CSVRfNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF80OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcmVhbWJsZSB0eXBlICovCisgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gd2QtPnByZWFtYmxlVHlwZTsKKyAgICAgICAgICAgIGlmICggd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0FVVE8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF81KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPSBaTV9QUkVBTUJMRV9UWVBFX0xPTkc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0xPTkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdICY9IH5aTV9CSVRfNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA9IHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplICsgMTI7CisKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVNpemUgPiBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGs9MDsgazw4OyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlba10gPSBwQnNzSW5mby0+dGltZVN0YW1wW2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbOF0gPSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF07CisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVs5XSA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXTsKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzEwXSA9IHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdOworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbMTFdID0gcEJzc0luZm8tPmNhcGFiaWxpdHlbMV07CisgICAgICAgICAgICAvL2ZvciAoaz0xMjsgazx3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVNpemU7IGsrKykKKyAgICAgICAgICAgIGZvciAoaz0wOyBrPHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbaysxMl0gPSBwQnNzSW5mby0+ZnJhbWVCb2R5W2tdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgcmVzID0gemZTdGFTZXRPcHBvc2l0ZUluZm9Gcm9tQlNTSW5mbyhkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5ic3NpZCwgKHU4X3QgKikocEJzc0luZm8tPmJzc2lkKSwgNik7CisgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KGV2ZW50LnBlZXJNYWNBZGRyLCAodThfdCAqKShwQnNzSW5mby0+bWFjYWRkciksIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLy96ZndJYnNzUGFydG5lck5vdGlmeShkZXYsIDEsICZldmVudCk7CisgICAgICAgICAgICBnb3RvIGNvbm5lY3RfZG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElCU1Mgbm90IGZvdW5kICovCisgICAgaWYgKCBic3NOb3RGb3VuZCApCisgICAgeworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgdTE2X3Qgb2Zmc2V0IDsKKyNlbmRpZgorICAgICAgICBpZiAoIHdkLT5zdGEuaWJzc0pvaW5Pbmx5ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSUJTUyBqb2luIG9ubHkuLi5yZXRyeS4uLiIpOworICAgICAgICAgICAgZ290byByZXRyeV9pYnNzOworICAgICAgICB9CisKKyAgICAgICAgaWYod2QtPnN0YS5ic3NOb3RGb3VuZENvdW50PDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJJQlNTIG5vdCBmb3VuZCwgZG8gc2l0ZXN1cnZleSEhICBic3NOb3RGb3VuZENvdW50PSIsIHdkLT5zdGEuYnNzTm90Rm91bmRDb3VudCk7CisgICAgICAgICAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQrKzsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBnb3RvIHJldHJ5X2lic3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgLyogRmFpbCBJQlNTIGZvdW5kLCBUT0RPIGNyZWF0ZSBJQlNTICovCisgICAgICAgICAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKHpmSHBJc0Rmc0NoYW5uZWwoZGV2LCB3ZC0+ZnJlcXVlbmN5KSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKGRldiwgd2QtPmZyZXF1ZW5jeSA+IDMwMDApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID09IDAgKQorICAgICAgICB7IC8qIEF1dG8gc2V0IGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiQ3JlYXRlIEFkIEhvYyBOZXR3b3JrIEJhbmQgIiwgd2QtPndzLmFkaG9jTW9kZSk7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZGaW5kQ2xlYW5GcmVxdWVuY3koZGV2LCB3ZC0+d3MuYWRob2NNb2RlKTsKKyAgICAgICAgICAgIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgICB6bV9kZWJ1Z19tc2cxKCJJQlNTIG5vdCBmb3VuZCwgY3JlYXRlZCBvbmUgaW4gY2hhbm5lbCAiLCB3ZC0+ZnJlcXVlbmN5KTsKKworICAgICAgICB3ZC0+c3RhLmlic3NCc3NJc0NyZWF0b3IgPSAxOworCisgICAgICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIGlmICh3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChrPTA7IGs8NjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzc2lkW2tdID0gd2QtPnN0YS5kZXNpcmVkQnNzaWRba107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgbWFjQWRkclswXSA9ICh3ZC0+bWFjQWRkclswXSAmIDB4ZmYpOworICAgICAgICAgICAgbWFjQWRkclsxXSA9ICh3ZC0+bWFjQWRkclswXSA+PiA4KTsKKyAgICAgICAgICAgIG1hY0FkZHJbMl0gPSAod2QtPm1hY0FkZHJbMV0gJiAweGZmKTsKKyAgICAgICAgICAgIG1hY0FkZHJbM10gPSAod2QtPm1hY0FkZHJbMV0gPj4gOCk7CisgICAgICAgICAgICBtYWNBZGRyWzRdID0gKHdkLT5tYWNBZGRyWzJdICYgMHhmZik7CisgICAgICAgICAgICBtYWNBZGRyWzVdID0gKHdkLT5tYWNBZGRyWzJdID4+IDgpOworICAgICAgICAgICAgemZHZW5lcmF0ZVJhbmRvbUJTU0lEKGRldiwgKHU4X3QgKil3ZC0+bWFjQWRkciwgKHU4X3QgKilic3NpZCk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgZm9yIChrPTA7IGs8NjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzc2lkW2tdID0gKHU4X3QpIHpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBic3NpZFswXSAmPSB+Wk1fQklUXzA7CisgICAgICAgICAgICBic3NpZFswXSB8PSBaTV9CSVRfMTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIGJzc2lkKTsKKyAgICAgICAgLy93ZC0+c3RhLmF0aW1XaW5kb3cgPSAweDBhOworCisgICAgICAgIC8qIHJhdGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgaWYod2QtPmZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KSAgLy8gMi40IEdIeiAgYitnCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2QtPndmYy5iSWJzc0dNb2RlCisgICAgICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19CKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpmUmVzZXRTdXBwb3J0UmF0ZShkZXYsIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQUcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmPSB+Wk1fQklUXzQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzQ7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gd2QtPnByZWFtYmxlVHlwZTsKKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9MT05HKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF81OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzU7CisgICAgICAgIH0KKworICAgICAgICB6ZklCU1NTZXR1cEJzc0Rlc2MoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKworICAgICAgICAvLyAyMDA3MDQxMSBBZGQgV1BBMlBTSyBpbmZvcm1hdGlvbiB0byBpdHMgSUJTUyBuZXR3b3JrICEhIQorICAgICAgICBvZmZzZXQgPSAwIDsKKworICAgICAgICAvKiB0aW1lc3RhbXAgKi8KKyAgICAgICAgb2Zmc2V0ICs9IDggOworCisgICAgICAgIC8qIGJlYWNvbiBpbnRlcnZhbCAqLworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSAodThfdCkod2QtPmJlYWNvbkludGVydmFsKSA7CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9ICh1OF90KSgod2QtPmJlYWNvbkludGVydmFsKSA+PiA4KSA7CisKKyAgICAgICAgLyogY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gOworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gOworICAgICAgICAjaWYgMAorICAgICAgICAvKiBzc2lkICovCisgICAgICAgIC8vIHNzaWQgZWxlbWVudCBpZAorICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBaTV9XTEFOX0VJRF9TU0lEIDsKKyAgICAgICAgLy8gc3NpZCBsZW5ndGgKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5zc2lkTGVuIDsKKyAgICAgICAgLy8gc3NpZCBpbmZvcm1hdGlvbgorICAgICAgICBmb3IoaT0wOyBpPHdkLT5zdGEuc3NpZExlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLnNzaWRbaV0gOworICAgICAgICB9CisKKyAgICAgICAgLyogc3VwcG9ydCByYXRlICovCisgICAgICAgIHJhdGVTZXQgPSBaTV9SQVRFX1NFVF9DQ0sgOworICAgICAgICBpZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ICs9IDAgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc3VwcG9ydCByYXRlIGVsZW1lbnQgaWQKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSA7CisKKyAgICAgICAgICAgIC8vIHN1cHBvcnQgcmF0ZSBsZW5ndGgKKyAgICAgICAgICAgIGxlbk9mZnNldCA9IG9mZnNldCsrOworCisgICAgICAgICAgICAvLyBzdXBwb3J0IHJhdGUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5iUmF0ZSAmICgweDE8PGkpKSA9PSAoMHgxPDxpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9CisgICAgICAgICAgICAgICAgCSAgICB6ZzExYlJhdGVUYmxbaV0rKCh3ZC0+YlJhdGVCYXNpYyAmICgweDE8PGkpKTw8KDctaSkpIDsKKyAgICAgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdXBwb3J0IHJhdGUgbGVuZ3RoCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtsZW5PZmZzZXRdID0gbGVuIDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgICAgLy8gRFMgcGFyYW1ldGVyIHNldCBlbGVtZXQgaWQKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfRFMgOworCisgICAgICAgIC8vIERTIHBhcmFtZXRlciBzZXQgbGVuZ3RoCisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IDEgOworCisgICAgICAgIC8vIERTIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24KKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0KKyAgICAgICAgIAl6ZkNoRnJlcVRvTnVtKHdkLT5mcmVxdWVuY3ksIE5VTEwpIDsKKworICAgICAgICAvKiBJQlNTIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgICAgLy8gSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQgaWQKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfSUJTUyA7CisKKyAgICAgICAgLy8gSUJTUyBwYXJhbWV0ZXIgc2V0IGxlbmd0aAorICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSAyIDsKKworICAgICAgICAvLyBJQlNTIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24KKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0XSA9IHdkLT5zdGEuYXRpbVdpbmRvdyA7CisgICAgICAgIG9mZnNldCArPSAyIDsKKworICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gYW5kIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLworICAgICAgICBpZiAoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgd2QtPmVycEVsZW1lbnQgPSAwOworICAgICAgICAgICAgLy8gRVJQIGVsZW1lbnQgaWQKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX0VSUCA7CisKKyAgICAgICAgICAgIC8vIEVSUCBsZW5ndGgKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IDEgOworCisgICAgICAgICAgICAvLyBFUlAgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5lcnBFbGVtZW50IDsKKworICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICBpZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gMCA7CisKKyAgICAgICAgICAgICAgICAvLyBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgZWxlbWVudCBpZAorICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUgOworCisgICAgICAgICAgICAgICAgLy8gRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzIGxlbmd0aAorICAgICAgICAgICAgICAgIGxlbk9mZnNldCA9IG9mZnNldCsrIDsKKworICAgICAgICAgICAgICAgIC8vIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpnMTFnUmF0ZVRibFtpXSsoKHdkLT5nUmF0ZUJhc2ljICYgKDB4MTw8aSkpPDwoNy1pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGV4dGVuZGVkIHN1cHBvcnQgcmF0ZSBsZW5ndGgKKyAgICAgICAgICAgIAkgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W2xlbk9mZnNldF0gPSBsZW4gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIC8qIFJTTiA6IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpbmZsdWVuY2UgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBJQlNTIG5ldHdvcmsgKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICAgICAgeworICAgICAgICAgICAgdThfdCBmcmFtZVR5cGUgPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCA7CisgICAgICAgICAgICB1OF90ICAgIHJzbls2NF09CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IElEICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDA0LAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgQ2lwaGVyIFN1aXRlIENvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgQ2lwaGVyIFN1aXRlLCBkZWZhdWx0PVRLSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB0eXBlLCBkZWZhdWx0PVBTSyAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTTiBjYXBhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbis0LCB6Z1dwYTJBZXNPdWksIDQpOworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBPdmVyd3JpdGUgUGFpcndpc2UgQ2lwaGVyIFN1aXRlIGJ5IEFFUyAqLworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTAsIHpnV3BhMkFlc091aSwgNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJTTiBlbGVtZW50IGlkCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBaTV9XTEFOX0VJRF9SU05fSUUgOworCisgICAgICAgICAgICAvLyBSU04gbGVuZ3RoCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSByc25bMV0gOworCisgICAgICAgICAgICAvLyBSU04gaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvcihpPTA7IGk8cnNuWzFdOyBpKyspCisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gcnNuW2krMl0gOworCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5yc25JZSwgcnNuLCByc25bMV0rMik7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAvKiBJZiBub3QgdXNlIFJTTkEgLCBydW4gdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB3ZC0+c3RhLmlic3NXcGEyUHNrID0gMTsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgICNpZiAwCisgICAgICAgIC8qIEhUIENhcGFiaWxpdGllcyBJbmZvICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgT1VJWzNdID0geyAweDAgLCAweDkwICwgMHg0QyB9IDsKKworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfV1BBX0lFIDsKKworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCArIDQgOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IE9VSVtpXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5zdGEuSFRDYXAuRGF0YS5FbGVtZW50SUQgOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLkhUQ2FwLkJ5dGVbaSsyXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICB7CisgICAgICAgICAgICB1OF90IE9VSVszXSA9IHsgMHgwICwgMHg5MCAsIDB4NEMgfSA7CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1dQQV9JRSA7CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5MZW5ndGggKyA0IDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBPVUlbaV0gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEIDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5FeHRIVENhcC5CeXRlW2krMl0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA9IG9mZnNldCA7CisKKyAgICAgICAgaWYgKHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA+IFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLy8gMjAwNzA0MTYgTGV0IENyZWF0ZSBJQlNTIG5ldHdvcmsgY291bGQgZW50ZXIgdGhlIHpmd0lic3NQYXJ0bmVyTm90aWZ5IGZ1bmN0aW9uCisgICAgICAgIC8vIGJzc05vdEZvdW5kID0gRkFMU0UgOworCisgICAgICAgIHByaW50aygiVGhlIGNhcGFiaWxpdHkgaW5mbyAxID0gJTAyeFxuIiwgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKSA7CisgICAgICAgIHByaW50aygiVGhlIGNhcGFiaWxpdHkgaW5mbyAyID0gJTAyeFxuIiwgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKSA7CisgICAgICAgIGZvcihrPTA7IGs8d2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplOyBrKyspCisgICAgICAgIHsKKwkgICAgIHByaW50aygiJTAyeCAiLCB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtrXSkgOworICAgICAgICB9CisgICAgICAgICNpZiAwCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5ic3NpZCwgKHU4X3QgKilic3NpZCwgNik7CisgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5wZWVyTWFjQWRkciwgKHU4X3QgKil3ZC0+bWFjQWRkciwgNik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICNlbmRpZgorI2VuZGlmCisKKyAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvL3dkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgPSBaTV9JQlNTX1BBUlRORVJfTE9TVDsKKyAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLmlic3NCc3NJc0NyZWF0b3IgPSAwOworICAgIH0KKworY29ubmVjdF9kb25lOgorICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0lCU1MsIHdkLT5iZWFjb25JbnRlcnZhbCwgd2QtPmR0aW0sICh1OF90KXdkLT5zdGEuYXRpbVdpbmRvdyk7CisgICAgemZTdGFTZW5kQmVhY29uKGRldik7IC8vIFJlZnJlc2ggQmVhY29uIGNvbnRlbnQgZm9yIFpEMTIxMUIgSGFsUGx1cworICAgIHpmSHBTZXRBdGltV2luZG93KGRldiwgd2QtPnN0YS5hdGltV2luZG93KTsKKworICAgIC8vIFN0YXJ0IHRoZSBJQlNTIHRpbWVyIHRvIG1vbml0b3IgZm9yIG5ldyBzdGF0aW9ucworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfSUJTU19NT05JVE9SLCBaTV9USUNLX0lCU1NfTU9OSVRPUik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgIH0KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9DT05ORUNURUQpOworICAgIHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtID0gemZIcEdldFRyYW5zbWl0UG93ZXIoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX0RFTEFZRURfSk9JTl9JTkRJQ0FUSU9OCisgICAgaWYgKCAhYnNzTm90Rm91bmQgKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5pYnNzRGVsYXllZEluZCA9IDE7CisgICAgICAgIHpmTWVtb3J5Q29weSgodThfdCAqKSZ3ZC0+c3RhLmlic3NEZWxheWVkSW5kRXZlbnQsICh1OF90ICopJmV2ZW50LCBzaXplb2Yoc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50KSk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoICFic3NOb3RGb3VuZCApCisgICAgeworICAgICAgICBpZiAod2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMSwgJmV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworCityZXRyeV9pYnNzOgorICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcpOworICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9OT1RfRk9VTkQsIHdkLT5zdGEuYnNzaWQsIDApOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlN0YVByb2Nlc3NBdGltKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJSZWNlaXZpbmcgQXRpbSB3aW5kb3cgbm90aWZpY2F0aW9uIik7CisKKyAgICB3ZC0+c3RhLnJlY3ZBdGltID0gMTsKK30KKworc3RhdGljIHN0cnVjdCB6c0Jzc0luZm8qIHpmSW5mcmFGaW5kQVBUb0Nvbm5lY3QoemRldl90KiBkZXYsCisgICAgICAgIHN0cnVjdCB6c0Jzc0luZm8qIGNhbmRpZGF0ZUJzcykKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTm93QnNzSW5mbz1OVUxMOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmV0LCBhcFdlcFN0YXR1czsKKyAgICB1MzJfdCBrOworICAgIHUzMl90IGNoYW5uZWxGbGFnczsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoaT0wOyBpPHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXBXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCh6Zk1lbW9yeUlzRXF1YWwoJihwQnNzSW5mby0+c3NpZFsyXSksIHdkLT5zdGEuc3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnNzaWRMZW4pKSYmCisgICAgICAgICAgICAgICh3ZC0+c3RhLnNzaWRMZW4gPT0gcEJzc0luZm8tPnNzaWRbMV0pKXx8CisgICAgICAgICAgICAgKCh3ZC0+c3RhLnNzaWRMZW4gPT0gMCkmJgorICAgICAgICAgICAgICAgLyogY29ubmVjdCB0byBhbnkgQlNTOiBBUCdzIGFucyBTVEEncyBXRVAgc3RhdHVzIG11c3QgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgKHdkLT5zdGEud2VwU3RhdHVzID09IGFwV2VwU3RhdHVzICkmJgorICAgICAgICAgICAgICAocEJzc0luZm8tPnNlY3VyaXR5VHlwZSAhPSBaTV9TRUNVUklUWV9UWVBFX1dQQSkgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnNzaWRMZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQU5ZIEJTUyBmb3VuZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICgod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRElTQUJMRUQgJiYgYXBXZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCkgfHwKKyAgICAgICAgICAgICAgICAgKHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQgJiYKKyAgICAgICAgICAgICAgICAgKGFwV2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEICYmIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyA9PSAxKSkpICYmCisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmF1dGhNb2RlID49IFpNX0FVVEhfTU9ERV9PUEVOICYmIHdkLT5zdGEuYXV0aE1vZGUgPD0gWk1fQVVUSF9NT0RFX0FVVE8pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJQcml2YWN5IHBvbGljeSBpcyBpbmNvbnNpc3RlbnQiKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmb3IgV1BBIG5lZ2F0aXZlIHRlc3QgKi8KKyAgICAgICAgICAgIGlmICggIXpmQ2hlY2tBdXRoZW50aWNhdGlvbihkZXYsIHBCc3NJbmZvKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ2hlY2sgYnNzaWQgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPT0gVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazw2OyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5kZXNpcmVkQnNzaWRba10gIT0gcEJzc0luZm8tPmJzc2lkW2tdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzEsICJkZXNpcmVkIGJzc2lkIG5vdCBtYXRjaGVkIDEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGsgIT0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMSwgImRlc2lyZWQgYnNzaWQgbm90IG1hdGNoZWQgMiIpOworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoZWNrIHN1cHBvcnQgbW9kZSAqLworICAgICAgICAgICAgaWYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPiAzMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCAgIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9BX0hUOworICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggICAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgICAgIHx8IChwQnNzSW5mby0+YXBDYXAgJiBaTV9BbGwxMU5fQVApICkgLy8xMW4gQVAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfR19IVDsKKyAgICAgICAgICAgICAgICAgICAgaWYocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9COworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9HOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICAgKChjaGFubmVsRmxhZ3MgPT0gQ0hBTk5FTF9CKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzApKQorICAgICAgICAgICAgICAgIHx8ICgoY2hhbm5lbEZsYWdzID09IENIQU5ORUxfRykgJiYgKHdkLT5jb25uZWN0TW9kZSAmIFpNX0JJVF8xKSkKKyAgICAgICAgICAgICAgICB8fCAoKGNoYW5uZWxGbGFncyA9PSBDSEFOTkVMX0EpICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMikpCisgICAgICAgICAgICAgICAgfHwgKChjaGFubmVsRmxhZ3MgJiBDSEFOTkVMX0hUMjApICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMykpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTa2lwIGlmIEFQIGluIGJsb2NraW5nIGxpc3QgKi8KKyAgICAgICAgICAgIGlmICgocmV0ID0gemZTdGFJc0FwSW5CbG9ja2luZ0xpc3QoZGV2LCBwQnNzSW5mby0+YnNzaWQpKSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkNhbmRpZGF0ZSBBUCBpbiBibG9ja2luZyBMaXN0LCBza2lwIGlmIHRoZXJlJ3Mgc3RpbGxhIGNob2ljZSEiKTsKKyAgICAgICAgICAgICAgICBwTm93QnNzSW5mbyA9IHBCc3NJbmZvOworICAgICAgICAgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfMCApICAvLyBjaGVjayBpZiBpbmZyYS1CU1MKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5vd0Jzc0luZm8gPSBwQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5hcFdtZUNhcGFiaWxpdHkgPSBwQnNzSW5mby0+d21lU3VwcG9ydDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgfQorCitkb25lOgorICAgIGlmIChwTm93QnNzSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemZ3TWVtb3J5Q29weSgodm9pZCopY2FuZGlkYXRlQnNzLCAodm9pZCopcE5vd0Jzc0luZm8sIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisgICAgICAgIHBOb3dCc3NJbmZvID0gY2FuZGlkYXRlQnNzOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcE5vd0Jzc0luZm87Cit9CisKKwordm9pZCB6ZkluZnJhQ29ubmVjdE5ldHdvcmsoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyogcE5vd0Jzc0luZm89TlVMTDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvIGNhbmRpZGF0ZUJzczsKKyAgICAvL3UxNl90IGksIGo9MTAwLCBxdWFsaXR5PTEwMDAwOworICAgIC8vdThfdCByZXQ9RkFMU0UsIGFwV2VwU3RhdHVzOworICAgIHU4X3QgcmV0PUZBTFNFOworICAgIHUxNl90IGs7CisgICAgdThfdCBkZW5zaXR5ID0gWk1fTVBEVV9ERU5TSVRZX05PTkU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIFJlc2V0IGJzc05vdEZvdW5kQ291bnQgZm9yIEFkLUhvYzpJQlNTICovCisgICAgLyogTmVlZCByZXZpZXcgOiBJYnNzQ29ubiAtPiBJbmZyYUNvbm4gLT4gSWJzc0Nvbm4gZXRjLCBmbGFnL2NvdW50ZXIgcmVzZXQ/ICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICB6ZlN0YVJlZnJlc2hCbG9ja0xpc3QoZGV2LCAwKTsKKworICAgIC8qIGNoYW5nZSBzdGF0ZSB0byBDT05ORUNUSU5HIGFuZCBzdG9wIHRoZSBjaGFubmVsIHNjYW5uaW5nICovCisgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVElORyk7CisgICAgemZQb3dlclNhdmluZ01ncldha2V1cChkZXYpOworCisgICAgd2QtPnN0YS53bWVDb25uZWN0ZWQgPSAwOworICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDA7CisgICAgd2QtPnN0YS5xb3NJbmZvID0gMDsKKyAgICB6ZlF1ZXVlRmx1c2goZGV2LCB3ZC0+c3RhLnVhcHNkUSk7CisKKyAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX05PTkU7CisKKyAgICAvL1Jlb3JkZXIgQnNzTGlzdCBieSBSU1NJLS1DV1lhbmcoKykKKyAgICB6ZkJzc0luZm9SZW9yZGVyTGlzdChkZXYpOworCisgICAgcE5vd0Jzc0luZm8gPSB6ZkluZnJhRmluZEFQVG9Db25uZWN0KGRldiwgJmNhbmRpZGF0ZUJzcyk7CisKKwlpZiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkKKwl7CisJICAgIGlmICh3ZC0+c3RhLmJTYWZlTW9kZSA9PSAwKQorCSAgICB7CisJCSAgICB6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsvL1F1aWNrbHkgcmVib290CisJICAgIH0KKwl9CisgICAgaWYgKCBwTm93QnNzSW5mbyAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vem1fYXNzZXJ0KHBOb3dCc3NJbmZvICE9IE5VTEwpOworCisgICAgICAgIHBCc3NJbmZvID0gcE5vd0Jzc0luZm87CisgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IHBCc3NJbmZvLT5zc2lkWzFdOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5zc2lkLCAmKHBCc3NJbmZvLT5zc2lkWzJdKSwgcEJzc0luZm8tPnNzaWRbMV0pOworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gcEJzc0luZm8tPmZyZXF1ZW5jeTsKKyAgICAgICAgLy93ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgPSAxOworCisgICAgICAgIC8vemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIHpmVXBkYXRlQnNzaWQoZGV2LCBwQnNzSW5mby0+YnNzaWQpOworICAgICAgICB6ZlJlc2V0U3VwcG9ydFJhdGUoZGV2LCBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPKTsKKyAgICAgICAgemZVcGRhdGVTdXBwb3J0UmF0ZShkZXYsIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgIHpmVXBkYXRlU3VwcG9ydFJhdGUoZGV2LCBwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXMpOworCisgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUxNl90KSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMV0pIDw8IDgpOworICAgICAgICBpZiAod2QtPmJlYWNvbkludGVydmFsID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVTUyBiaXQgb24gKi8KKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF8wOworICAgICAgICAvKiBJQlNTIGJpdCBvZmYgKi8KKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdICY9IH5aTV9CSVRfMTsKKworICAgICAgICAvKiAxMW4gQVAgZmxhZyAqLworICAgICAgICB3ZC0+c3RhLkVuYWJsZUhUID0gcEJzc0luZm8tPkVuYWJsZUhUOworICAgICAgICB3ZC0+c3RhLlNHNDAgPSBwQnNzSW5mby0+U0c0MDsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9DRU5DICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS53bWVFbmFibGVkID0gMDsgLy9EaXNhYmxlIFdNTSBpbiBDRU5DCisgICAgICAgICAgICBjZW5jSW5pdChkZXYpOworICAgICAgICAgICAgY2VuY1NldENFTkNNb2RlKGRldiwgTmRpc0NFTkNfUFNLKTsKKyAgICAgICAgICAgIHdkLT5zdGEud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQ7CisgICAgICAgICAgICAvKiBDRU5DICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5jZW5jSWVbMV0gIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQ0VOQzsKKyAgICAgICAgICAgICAgICAvL3dkLT5zdGEuZW5jcnlNb2RlID0gWk1fQ0VOQzsKKyAgICAgICAgICAgICAgICB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3BvbihkZXYsICh1OF90ICopJnBCc3NJbmZvLT5jZW5jSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAodThfdCAqKSZwQnNzSW5mby0+c3NpZCwgKHU4X3QgKikmcEJzc0luZm8tPm1hY2FkZHIpOworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLmNlbmNJZSwgcEJzc0luZm8tPmNlbmNJZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5jZW5jSWVbMV0rMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jZW5jSWVbMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9JTklUOworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fVEtJUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9US0lQOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvbiBzb2Z0d2FyZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZm9yIFRLSVAgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZTdGFFbmFibGVTV0VuY3J5cHRpb24oZGV2LCAoWk1fU1dfVEtJUF9FTkNSWV9FTnxaTV9TV19US0lQX0RFQ1JZX0VOKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRG8gbm90IHN1cHBvcnQgVEtJUCBpbiAxMW4gbW9kZSAqLworICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5FbmFibGVIVCA9IDA7CisgICAgICAgICAgICAgICAgLy9wQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9BRVMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworCisgICAgICAgICAgICAgICAgLyogSWYgQVAgc3VwcG9ydHMgSFQgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2V0IE1QRFUgZGVuc2l0eSB0byA4IHVzKi8KKyAgICAgICAgICAgICAgICAgICAgZGVuc2l0eSA9IFpNX01QRFVfREVOU0lUWV84VVM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT53cGFJZVsxXSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgcEJzc0luZm8tPndwYUllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+d3BhSWVbMV0rMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFJZVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnJzbkllWzFdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnJzbkllLCBwQnNzSW5mby0+cnNuSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5yc25JZVsxXSsyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJzbkllWzFdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvKiBjaGVjayBwcmVhbWJsZSBiaXQgKi8KKyAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IHdkLT5wcmVhbWJsZVR5cGU7CisgICAgICAgIGlmICggd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0FVVE8gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9MT05HOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9MT05HKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF81OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF81OworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgODAyLjExbiA0ME1IeiBTZXR0aW5nICovCisgICAgICAgIGlmICgocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgJiYKKyAgICAgICAgICAgICgocEJzc0luZm8tPmV4dENoT2Zmc2V0ID09IDEpIHx8IChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgPT0gMykpKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSBwQnNzSW5mby0+ZW5hYmxlSFQ0MDsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgPSBwQnNzSW5mby0+ZXh0Q2hPZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICAgICAgd2QtPkV4dE9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayA4MDIuMTFIIHN1cHBvcnQgYml0ICovCisKKyAgICAgICAgLyogY2hlY2sgT3dsIEFwICovCisgICAgICAgIGlmICggcEJzc0luZm8tPmF0aE93bEFwICYgWk1fQklUXzAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGZ1bmN0aW9uLCBGVyByZXRyeSB3aWxsIGJlIGVuYWJsZSwgWk1fTUFDX1JFR19SRVRSWV9NQVgKKyAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0IHRvIDAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHpmSHBEaXNhYmxlSHdSZXRyeShkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5hdGhPd2xBcCA9IDE7CisgICAgICAgICAgICAvKiBTZXQgTVBEVSBkZW5zaXR5IHRvIDggdXMqLworICAgICAgICAgICAgZGVuc2l0eSA9IFpNX01QRFVfREVOU0lUWV84VVM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGZ1bmN0aW9uLCBGVyByZXRyeSB3aWxsIGJlIGRpc2FibGUsIFpNX01BQ19SRUdfUkVUUllfTUFYCisgICAgICAgICAgICAgICB3aWxsIGJlIHNldCB0byAzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB6ZkhwRW5hYmxlSHdSZXRyeShkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5hdGhPd2xBcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnJlb3JkZXIgPSAxOworCisgICAgICAgIC8qIFNldCBNUERVIGRlbnNpdHkgKi8KKyAgICAgICAgemZIcFNldE1QRFVEZW5zaXR5KGRldiwgZGVuc2l0eSk7CisKKyAgICAgICAgLyogY2hlY2sgc2hvcnQgc2xvdCB0aW1lIGJpdCAqLworICAgICAgICBpZiAoIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdICYgWk1fQklUXzIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gfD0gWk1fQklUXzI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5lcnAgJiBaTV9CSVRfMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9uIik7CisgICAgICAgICAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IFRSVUU7CisgICAgICAgICAgICB6ZkhwU2V0U2xvdFRpbWUoZGV2LCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9mZiIpOworICAgICAgICAgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBGQUxTRTsKKyAgICAgICAgICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBCc3NJbmZvLT5tYXJ2ZWxBcCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmVuYWJsZURydkJBID0gMDsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiA4NzAxIDogTmV0R2VhciAzNTAwIChNQVJWRUxMKQorICAgICAgICAgICAgICogRG93bmxpbmsgaXNzdWUgOiBzZXQgc2xvdHRpbWUgdG8gMjAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKGRldiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmVuYWJsZURydkJBID0gMTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgbm90IGdvb2QgZm9yIGhlcmUgZG8gcmVzZXQgc2xvdCB0aW1lLgorICAgICAgICAgICAgICogSSB0aGluayBpdCBzaG91bGQgcmVzZXQgd2hlbiBsZWF2ZSBNQVJWRUxMIGFwCisgICAgICAgICAgICAgKiBvciBlbnRlciBkaXNjb25uZWN0IHN0YXRlIGV0Yy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lUmVnaXN0ZXIoZGV2LCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vU3RvcmUgcHJvYmUgcmVzcG9uc2UgZnJhbWUgYm9keSwgZm9yIFZJU1RBIG9ubHkKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gcEJzc0luZm8tPmZyYW1lQm9keXNpemUgKyAxMjsKKyAgICAgICAgaWYgKHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA+IFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICB9CisgICAgICAgIGZvciAoaz0wOyBrPDg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlba10gPSBwQnNzSW5mby0+dGltZVN0YW1wW2tdOworICAgICAgICB9CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzhdID0gcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdOworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVs5XSA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXTsKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbMTBdID0gcEJzc0luZm8tPmNhcGFiaWxpdHlbMF07CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzExXSA9IHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdOworICAgICAgICBmb3IgKGs9MDsgazwod2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplIC0gMTIpOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W2srMTJdID0gcEJzc0luZm8tPmZyYW1lQm9keVtrXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80ICkmJgorICAgICAgICAgICAgICgoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX09QRU4gKXx8CisgICAgICAgICAgICAgICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSl8fAorICAgICAgICAgICAgICAod2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTykpICkKKyAgICAgICAgeyAgIC8qIHByaXZhY3kgZW5hYmxlZCAqLworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJBZGFwdGVyIGlzIG5vIFdFUCwgdHJ5IHRvIGNvbm5lY3QgdG8gV0VQIEFQIik7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERvIG5vdCBzdXBwb3J0IFdFUCBpbiAxMW4gbW9kZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUdXJuIG9uIHNvZnR3YXJlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBmb3IgV0VQICovCisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhRW5hYmxlU1dFbmNyeXB0aW9uKGRldiwgKFpNX1NXX1dFUF9FTkNSWV9FTnxaTV9TV19XRVBfREVDUllfRU4pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3dkLT5zdGEuRW5hYmxlSFQgPSAwOworICAgICAgICAgICAgICAgIC8vd2QtPkJhbmRXaWR0aDQwID0gMDsKKyAgICAgICAgICAgICAgICAvL3dkLT5FeHRPZmZzZXQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzQ7CisKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTyApCisgICAgICAgICAgICB7IC8qIFRyeSB0byB1c2Ugb3BlbiBhbmQgc2hhcmVkLWtleSBhdXRoZWh0aWNhdGlvbiBhbHRlcm5hdGl2ZWx5ICovCisgICAgICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5jb25uZWN0VGltZW91dENvdW50ICUgMikgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZICkKKyAgICAgICAgICAgIHsgICAvKiBvcGVuICBvciBhdXRvICovCisgICAgICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDApOworICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9PUEVOICkKKyAgICAgICAgICAgIHsgICAvKiBzaGFyZWQga2V5ICovCisgICAgICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDEpIDsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJJc1NoYXJlZEtleSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChwQnNzSW5mby0+c2VjdXJpdHlUeXBlID09IFpNX1NFQ1VSSVRZX1RZUEVfV1BBKXx8CisgICAgICAgICAgICAgICAgIChwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF80OworICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgV1BBIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmPSAoflpNX0JJVF80KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYXV0aGVudGljYXRpb24gd2l0aCBvcGVuIHN5c3RlbSAqLworICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDApOworICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogSW1wcm92ZSBXRVAvVEtJUCBwZXJmb3JtYWNlIHdpdGggSFQgQVAsIGRldGFpbCBpbmZvcm1hdGlvbiBwbGVhc2UgbG9vayBidWcjMzI0OTUgKi8KKyAgICAgICAgLyoKKyAgICAgICAgaWYgKCAocEJzc0luZm8tPmJyb2FkY29tSFRBcCA9PSAxKQorICAgICAgICAgICAgICYmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHhhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHg4KTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEZXNpcmVkIFNTSUQgbm90IGZvdW5kIik7CisgICAgICAgIGdvdG8gemxDb25uZWN0RmFpbGVkOworICAgIH0KKworCisgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB6ZlN0YVN0YXJ0Q29ubmVjdENiKTsKKyAgICByZXR1cm47CisKK3psQ29ubmVjdEZhaWxlZDoKKyAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5ELCB3ZC0+c3RhLmJzc2lkLCAwKTsKKyAgICByZXR1cm47Cit9CisKK3U4X3QgemZDaGVja1dQQUF1dGgoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHU4X3QgICByZXQ9VFJVRTsKKyAgICB1OF90ICAgcG1rQ291bnQ7CisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgICBlbmNBbGdvVHlwZSA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fVEtJUCApCisgICAgeworICAgICAgICBlbmNBbGdvVHlwZSA9IFpNX1RLSVA7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgeworICAgICAgICBlbmNBbGdvVHlwZSA9IFpNX0FFUzsKKyAgICB9CisKKyAgICBzd2l0Y2god2QtPnN0YS5hdXRoTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBUFNLOgorICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+d3BhSWVbMV0gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBta0NvdW50ID0gcEJzc0luZm8tPndwYUllWzEyXTsKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBwbWtDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPndwYUllWzE3ICsgNCppXSA9PSBlbmNBbGdvVHlwZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTI6CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTJQU0s6CisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxXSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG1rQ291bnQgPSBwQnNzSW5mby0+cnNuSWVbOF07CisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgcG1rQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxMyArIDQqaV0gPT0gZW5jQWxnb1R5cGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK2RvbmU6CisgICAgcmV0dXJuIHJldDsKK30KKwordThfdCB6ZkNoZWNrQXV0aGVudGljYXRpb24oemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHU4X3QgICByZXQ9VFJVRTsKKyAgICB1MTZfdCAgZW5jQWxnb1R5cGU7CisgICAgdTE2X3QgVW5pY2FzdENpcGhlck51bTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIENvbm5lY3RpbmcgdG8gQU5ZIGhhcyBiZWVuIGNoZWNrZWQgKi8KKyAgICBpZiAoIHdkLT5zdGEuc3NpZExlbiA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisKKwlzd2l0Y2god2QtPnN0YS5hdXRoTW9kZSkKKwkvL3N3aXRjaCh3ZC0+d3MuYXV0aE1vZGUpLy9RdWlja2x5IHJlYm9vdAorICAgIHsKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBX0FVVE86CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPOgorICAgICAgICAgICAgZW5jQWxnb1R5cGUgPSAwOworICAgICAgICAgICAgaWYocEJzc0luZm8tPnJzbkllWzFdICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVW5pY2FzdENpcGhlck51bSA9IChwQnNzSW5mby0+cnNuSWVbOF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBCc3NJbmZvLT5yc25JZVs5XSA8PCA4KTsKKworICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIG9ubHkgb25lIHVuaWNhc3QgY2lwaGVyICovCisgICAgICAgICAgICAgICAgaWYgKFVuaWNhc3RDaXBoZXJOdW0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY0FsZ29UeXBlID0gcEJzc0luZm8tPnJzbkllWzEzXTsKKyAgICAgICAgICAgICAgICAgICAgLy9lbmNBbGdvVHlwZSA9IHBCc3NJbmZvLT5yc25JZVs3XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgaWk7CisgICAgICAgICAgICAgICAgICAgIHUxNl90IGRlc2lyZWRDaXBoZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB1MTZfdCBJRU9mZlNldCA9IDEzOworCisgICAgICAgICAgICAgICAgICAgIC8qIEVudW1lcmF0ZSBhbGwgdGhlIHN1cHBvcnRlZCB1bmljYXN0IGNpcGhlciAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBVbmljYXN0Q2lwaGVyTnVtOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPnJzbkllW0lFT2ZmU2V0K2lpKjRdID4gZGVzaXJlZENpcGhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQ2lwaGVyID0gcEJzc0luZm8tPnJzbkllW0lFT2ZmU2V0K2lpKjRdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW5jQWxnb1R5cGUgPSBkZXNpcmVkQ2lwaGVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggZW5jQWxnb1R5cGUgPT0gMHgwMiApCisgICAgICAgICAgICAgICAgeworICAgIAkJCSAgICB3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKworICAgIAkJCSAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGVuY0FsZ29UeXBlID09IDB4MDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihwQnNzSW5mby0+d3BhSWVbMV0gIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVbmljYXN0Q2lwaGVyTnVtID0gKHBCc3NJbmZvLT53cGFJZVsxMl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBCc3NJbmZvLT53cGFJZVsxM10gPDwgOCk7CisKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB1bmljYXN0IGNpcGhlciAqLworICAgICAgICAgICAgICAgIGlmIChVbmljYXN0Q2lwaGVyTnVtID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmNBbGdvVHlwZSA9IHBCc3NJbmZvLT53cGFJZVsxN107CisgICAgICAgICAgICAgICAgICAgIC8vZW5jQWxnb1R5cGUgPSBwQnNzSW5mby0+d3BhSWVbMTFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpaTsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgZGVzaXJlZENpcGhlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHUxNl90IElFT2ZmU2V0ID0gMTc7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRW51bWVyYXRlIGFsbCB0aGUgc3VwcG9ydGVkIHVuaWNhc3QgY2lwaGVyICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IFVuaWNhc3RDaXBoZXJOdW07IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+d3BhSWVbSUVPZmZTZXQraWkqNF0gPiBkZXNpcmVkQ2lwaGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRDaXBoZXIgPSBwQnNzSW5mby0+d3BhSWVbSUVPZmZTZXQraWkqNF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNBbGdvVHlwZSA9IGRlc2lyZWRDaXBoZXI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBlbmNBbGdvVHlwZSA9PSAweDAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgCQkJICAgIHdkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworCisgICAgCQkJICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBX0FVVE8gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvL1pNX0FVVEhfTU9ERV9XUEFQU0tfQVVUTworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGVuY0FsZ29UeXBlID09IDB4MDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy9aTV9BVVRIX01PREVfV1BBUFNLX0FVVE8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBUFNLOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBUFNLOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9XUEFfTk9ORToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBMjoKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBMlBTSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgIT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ID0gemZDaGVja1dQQUF1dGgoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9PUEVOOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9BVVRPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPndzY0llWzFdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBBUCBpcyBhIEp1bXBzdGFydCBBUCwgaXQncyBvayEhIFJheQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3U4X3QgemZTdGFJc0Nvbm5lY3RlZCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuYWRhcHRlclN0YXRlID09IFpNX1NUQV9TVEFURV9DT05ORUNURUQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmU3RhSXNDb25uZWN0aW5nKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmU3RhSXNEaXNjb25uZWN0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmQ2hhbmdlQWRhcHRlclN0YXRlKHpkZXZfdCogZGV2LCB1OF90IG5ld1N0YXRlKQoreworICAgIHU4X3QgcmV0ID0gVFJVRTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvL2lmICggbmV3U3RhdGUgPT0gd2QtPnN0YS5hZGFwdGVyU3RhdGUgKQorICAgIC8veworICAgIC8vICAgIHJldHVybiBGQUxTRTsKKyAgICAvL30KKworICAgIHN3aXRjaChuZXdTdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVDoKKyAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVCk7CisKKyAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5TdG9wKGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdG9wIHRoZSBhY3Rpb24gb2YgY2hhbm5lbCBzY2FubmluZyAqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuYkNoYW5uZWxTY2FuID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0ID0gIFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICNpZiAxCisgICAgICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3RvcCB0aGUgYWN0aW9uIG9mIGNoYW5uZWwgc2Nhbm5pbmcgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IEZBTFNFOworICAgICAgICAgICAgICAgIHJldCA9ICBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX1NUQV9TVEFURV9DT05ORUNURUQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vaWYgKCByZXQgKQorICAgIC8veworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+c3RhLmFkYXB0ZXJTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHptX2RlYnVnX21zZzEoImNoYW5nZSBhZGFwdGVyIHN0YXRlID0gIiwgbmV3U3RhdGUpOworICAgIC8vfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhTW1BZGRJZVNzaWQgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBTU0lEIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllU3NpZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5zc2lkTGVuKTsKKworICAgIC8qIEluZm9ybWF0aW9uIDogU1NJRCAqLworICAgIGZvciAoaT0wOyBpPHdkLT5zdGEuc3NpZExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLnNzaWRbaV0pOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YU1tQWRkSWVXcGEgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgU1NJRCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBKaS1IdWFuZyBMZWUgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4wMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCit7CisgICAgdTMyX3QgIGk7CisgICAgdThfdCAgICBzc25bNjRdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4ZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBPVUkgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHcm91cCBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDUwLCAweGYyLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IFN1aXRlIENvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdHlwZSwgZGVmYXVsdD1QU0sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUEEgY2FwYWJpbGl0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgdThfdCAgICByc25bNjRdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogR3JvdXAgQ2lwaGVyIFN1aXRlLCBkZWZhdWx0PVRLSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIHR5cGUsIGRlZmF1bHQ9UFNLICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUlNOIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQVBTSyApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzgsIHdkLT5zdGEud3BhSWUrOCwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzE0LCB6Z1dwYUFlc091aSwgNCk7CisgICAgICAgIH0KKworICAgICAgICB6ZkNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBzc24sIG9mZnNldCwgc3NuWzFdKzIpOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgc3NuLCBzc25bMV0rMik7CisgICAgICAgIG9mZnNldCArPSAoc3NuWzFdKzIpOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQSApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzgsIHdkLT5zdGEud3BhSWUrOCwgNCk7CisgICAgICAgIC8qIE92ZXJ3cml0ZSBLZXkgTWFuYWdlbWVudCBTdWl0ZSBieSBXUEEtUmFkaXVzICovCisgICAgICAgIHpmTWVtb3J5Q29weShzc24rMjAsIHpnV3BhUmFkaXVzT3VpLCA0KTsKKworICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3ZlcndyaXRlIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBieSBBRVMgKi8KKyAgICAgICAgICAgIHpmTWVtb3J5Q29weShzc24rMTQsIHpnV3BhQWVzT3VpLCA0KTsKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHNzbiwgb2Zmc2V0LCBzc25bMV0rMik7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLndwYUllLCBzc24sIHNzblsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChzc25bMV0rMik7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSyApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzQsIHdkLT5zdGEucnNuSWUrNCwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzEwLCB6Z1dwYTJBZXNPdWksIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8d2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90Kikgd2QtPnN0YS5ic3NpZCwgNikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGkgPCB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgQ291bnQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgcnNuWzIyXSA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgIHJzblsyM10gPSAweDAwOworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbisyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkSW5mb1tpXS5wbWtpZCwgMTYpOworCQkJICAgICAgICAgICAgICAgICByc25bMV0gKz0gMTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgcnNuLCBvZmZzZXQsIHJzblsxXSsyKTsKKyAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEucnNuSWUsIHJzbiwgcnNuWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKHJzblsxXSsyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyICkKKyAgICB7CisgICAgICAgIC8qIE92ZXJ3cml0ZSBHcm91cCBDaXBoZXIgU3VpdGUgYnkgQVAncyBzZXR0aW5nICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rNCwgd2QtPnN0YS5yc25JZSs0LCA0KTsKKyAgICAgICAgLyogT3ZlcndyaXRlIEtleSBNYW5hZ2VtZW50IFN1aXRlIGJ5IFdQQTItUmFkaXVzICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTYsIHpnV3BhMlJhZGl1c091aSwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzEwLCB6Z1dwYTJBZXNPdWksIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgfHwgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEgKSkpCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgQ291bnQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICByc25bMjJdID0gMTsKKyAgICAgICAgICAgICAgICByc25bMjNdID0gMDsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBUaGUgY2FsbGVyIGlzIHJlc3Buc2libGUgdG8gZ2l2ZSB1cyB0aGUgcmVsZXZhbnQgUE1LSUQuCisgICAgICAgICAgICAgICAgICogIFdlJ2xsIG9ubHkgYWNjZXB0IDEgUE1LSUQgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkLCAodThfdCopIHdkLT5zdGEuYnNzaWQsIDYpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbisyNCwgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLnBta2lkLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByc25bMV0gKz0gMTg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHJzbiwgb2Zmc2V0LCByc25bMV0rMik7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnJzbkllLCByc24sIHJzblsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChyc25bMV0rMik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhQWRkSWVJYnNzICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBJQlNTIHBhcmFtZXRlciB0byBidWZmZXIuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllSWJzcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9JQlNTKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAyKTsKKworICAgIC8qIEFUSU0gd2luZG93ICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5hdGltV2luZG93KTsKKyAgICBvZmZzZXQgKz0gMjsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTdGFBZGRJZVdtZUluZm8gICAgICAgICAgICovCisvKiAgICAgIEFkZCBXTUUgSW5mb3JtYXRpb24gRWxlbWVudCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmU3RhQWRkSWVXbWVJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IHFvc0luZm8pCit7CisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfV0lGSV9JRSk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgNyk7CisKKyAgICAvKiBPVUkgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg1MCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweEYyKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKworICAgIC8qIFFvUyBJbmZvICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBxb3NJbmZvKTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUFkZEllUG93ZXJDYXAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgUG93ZXIgY2FwYWJpbGl0eSB0byBidWZmZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFyb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDcuMTIgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFBZGRJZVBvd2VyQ2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHU4X3QgTWF4VHhQb3dlcjsKKyAgICB1OF90IE1pblR4UG93ZXI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9QT1dFUl9DQVBBQklMSVRZKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAyKTsKKworICAgIE1pblR4UG93ZXIgPSAodThfdCkoemZIcEdldE1pblR4UG93ZXIoZGV2KS8yKTsKKyAgICBNYXhUeFBvd2VyID0gKHU4X3QpKHpmSHBHZXRNYXhUeFBvd2VyKGRldikvMik7CisKKyAgICAvKiBNaW4gVHJhbnNtaXQgUG93ZXIgQ2FwICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsrLCBNaW5UeFBvd2VyKTsKKworICAgIC8qIE1heCBUcmFuc21pdCBQb3dlciBDYXAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KyssIE1heFR4UG93ZXIpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUFkZEllU3VwcG9ydENoICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBzdXBwb3J0ZWQgY2hhbm5lbHMgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFyb24gICAgICAgICAgICAyMDA3LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllU3VwcG9ydENoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworCisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgIGNvdW50XzI0RyA9IDA7CisgICAgdTE2X3QgIGNvdW50XzVHID0gMDsKKyAgICB1MTZfdCAgY2hhbm5lbE51bTsKKyAgICB1OF90ICAgbGVuZ3RoOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA8IDMwMDApCisgICAgICAgIHsgLy8gMi40SHoKKyAgICAgICAgICAgIGNvdW50XzI0RysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyA1R0h6CisgICAgICAgICAgICBjb3VudF81RysrOworICAgICAgICB9CisgICAgfQorCisgICAgbGVuZ3RoID0gKHU4X3QpKGNvdW50XzVHICogMiArIDIpOyAvLzVHIGZpbGwgYnkgcGFpciwgMiw0RyAoY29udGludW91cyBjaGFubmVscykgZmlsbCAyIGJ5dGVzCisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TVVBQT1JURURfQ0hBTk5FTFMgKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBsZW5ndGgpOworCisgICAgLy8gMi40R0h6IChjb250aW51b3VzIGNoYW5uZWxzKQorICAgIC8qIEZpcnN0IGNoYW5uZWwgbnVtYmVyICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsrLCAxKTsgLy9TdGFydCBmcm9tIGNoYW5ubGUgMQorICAgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY291bnRfMjRHKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCA7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gNDAwMCAmJiB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgNTAwMCkKKyAgICAgICAgeyAvLyA1R0h6IDQwMDAgLTUwMDBNaHoKKyAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbC00MDAwKS81OworICAgICAgICAgICAgLyogRmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY2hhbm5lbE51bSk7CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA+PSA1MDAwKQorICAgICAgICB7IC8vIDVHSHogPjUwMDBNaHoKKyAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbC01MDAwKS81OworICAgICAgICAgICAgLyogRmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY2hhbm5lbE51bSk7CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisgICAgICAgIH0KKyAgICB9CisgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKwordm9pZCB6ZlN0YVN0YXJ0Q29ubmVjdENiKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmU3RhU3RhcnRDb25uZWN0KGRldiwgd2QtPnN0YS5iSXNTaGFyZWRLZXkpOworfQorCit2b2lkIHpmU3RhU3RhcnRDb25uZWN0KHpkZXZfdCogZGV2LCB1OF90IGJJc1NoYXJlZEtleSkKK3sKKyAgICB1MzJfdCBwMSwgcDI7CisgICAgdThfdCBuZXdDb25uU3RhdGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIHAxX2xvdyA9IGFsZ29yaXRobSBudW1iZXIsIHAxX2hpZ2ggPSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBpZiAoIGJJc1NoYXJlZEtleSApCisgICAgeworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xOworICAgICAgICBuZXdDb25uU3RhdGUgPSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzE7CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMSIpOworICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19TSEFSRURfS0VZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9PUEVOOworICAgICAgICBuZXdDb25uU3RhdGUgPSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX09QRU47CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiIpOworICAgICAgICBpZiggd2QtPnN0YS5sZWFwRW5hYmxlZCApCisgICAgICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19MRUFQOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19PUEVOX1NZU1RFTTsKKyAgICB9CisKKyAgICAvKiBzdGF0dXMgY29kZSAqLworICAgIHAyID0gMHgwOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lciA9IHdkLT50aWNrOworICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gbmV3Q29ublN0YXRlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBzZW5kIHRoZSAxc3QgYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgsIHdkLT5zdGEuYnNzaWQsIHAxLCBwMiwgMCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZTZW5kTnVsbERhdGEoemRldl90KiBkZXYsIHU4X3QgdHlwZSkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICAvL3UxNl90IGFkZHJUYmxTaXplOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IGVycjsKKyAgICB1MTZfdCBobGVuOworICAgIHUxNl90IGhlYWRlclsoMzQrOCsxKS8yXTsKKyAgICB1MTZfdCBiY2FzdEFkZHJbM10gPSB7MHhmZmZmLDB4ZmZmZiwweGZmZmZ9OworICAgIHUxNl90ICpkc3RBZGRyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCAwKTsKKworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5sZW49IiwgYnVmLT5sZW4pOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgIHsKKyAgICAgICAgZHN0QWRkciA9IGJjYXN0QWRkcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZHN0QWRkciA9IHdkLT5zdGEuYnNzaWQ7CisgICAgfQorCisgICAgaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCisgICAgeworICAgICAgICAvKiBJZiBjb25uZWN0IHRvIGEgV01NIEFQLCBTZW5kIFFvUyBOdWxsIGRhdGEgKi8KKyAgICAgICAgaGxlbiA9IHpmVHhHZW5NbUhlYWRlcihkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCwgZHN0QWRkciwgaGVhZGVyLCAwLCBidWYsIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBobGVuID0gemZUeEdlbk1tSGVhZGVyKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX05VTEwsIGRzdEFkZHIsIGhlYWRlciwgMCwgYnVmLCAwLCAwKTsKKyAgICB9CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisgICAgeworICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMTAwOyAvL1RPRFMgYml0CisgICAgfQorCisgICAgaWYgKCB0eXBlID09IDEgKQorICAgIHsKKyAgICAgICAgaGVhZGVyWzRdIHw9IDB4MTAwMDsKKyAgICB9CisKKyAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3QnVmTWFwRG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3TWFwVHhEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL3sKKyAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgLy99CisKKyAgICAvKmluY3JlYXNlIHVuaWNhc3QgZnJhbWUgY291bnRlciovCisgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0rKzsKKworICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisKKyAgICByZXR1cm47CisKK3psRXJyb3I6CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICByZXR1cm47CisKK30KKwordm9pZCB6ZlNlbmRQU1BvbGwoemRldl90KiBkZXYpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3QgaGxlbjsKKyAgICB1MTZfdCBoZWFkZXJbKDgrMjQrMSkvMl07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIDApOworCisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmxlbj0iLCBidWYtPmxlbik7CisKKyAgICB6ZlR4R2VuTW1IZWFkZXIoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMLCB3ZC0+c3RhLmJzc2lkLCBoZWFkZXIsIDAsIGJ1ZiwgMCwgMCk7CisKKyAgICBoZWFkZXJbMF0gPSAyMDsKKyAgICBoZWFkZXJbNF0gfD0gMHgxMDAwOworICAgIGhlYWRlcls1XSA9IHdkLT5zdGEuYWlkIHwgMHhjMDAwOyAvL0JvdGggYml0LTE0IGFuZCBiaXQtMTUgYXJlIDEKKyAgICBobGVuID0gMTYgKyA4OworCisgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd0J1Zk1hcERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy97CisgICAgLy8gICAgZ290byB6bEVycm9yOworICAgIC8vfQorCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fSU5URVJOQUxfQUxMT0NfQlVGLCAwLCAweGZmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm47CisKK3psRXJyb3I6CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICByZXR1cm47CisKK30KKwordm9pZCB6ZlNlbmRCQSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhcnRfc2VxLCB1OF90ICpiaXRtYXApCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3QgaGxlbjsKKyAgICB1MTZfdCBoZWFkZXJbKDgrMjQrMSkvMl07CisgICAgdTE2X3QgaSwgb2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFsbG9jIG1tIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgMTIpOyAvLyAyOCA9IEZDIDIgKyBEVSAyICsgUkEgNiArIFRBIDYgKyBCQUMgMiArIFNFUSAyICsgQml0TWFwIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEyID0gQkFDIDIgKyBTRVEgMiArIEJpdE1hcCA4CisKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImJ1Zi0+bGVuPSIsIGJ1Zi0+bGVuKTsKKworICAgIHpmVHhHZW5NbUhlYWRlcihkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9CQSwgd2QtPnN0YS5ic3NpZCwgaGVhZGVyLCAwLCBidWYsIDAsIDApOworCisgICAgaGVhZGVyWzBdID0gMzI7IC8qIE1BQyBoZWFkZXIgMTYgKyBCQSBjb250cm9sIDIgKyBCQSBpbmZvIDEwICsgRkNTIDQqLworICAgIGhlYWRlclsxXSA9IDB4NDsgIC8qIE5vIEFDSyAqLworCisgICAgLyogc2VuZCBieSBPRkRNIDZNICovCisgICAgaGVhZGVyWzJdID0gKHUxNl90KSh6Y1JhdGVUb1BoeUN0cmxbNF0gJiAweGZmZmYpOworICAgIGhlYWRlclszXSA9ICh1MTZfdCkoemNSYXRlVG9QaHlDdHJsWzRdPj4xNikgJiAweGZmZmY7CisKKyAgICBobGVuID0gMTYgKyA4OyAgLyogTUFDIGhlYWRlciAxNiArIGNvbnRyb2wgOCovCisgICAgb2Zmc2V0ID0gMDsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDA1KTsgLypjb21wcmVzc2VkIGJpdG1hcCBvbiovCisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHN0YXJ0X3NlcSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgZm9yIChpPTA7IGk8ODsgaSsrKSB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIGJpdG1hcFtpXSk7CisgICAgICAgIG9mZnNldCsrOworICAgIH0KKworICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisgICAgcmV0dXJuOworCit6bEVycm9yOgorCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgcmV0dXJuOworCit9CisKK3ZvaWQgemZTdGFHZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1MzJfdCogcGh5Q3RybCwKKyAgICAgICAgdTE2X3QqIHJjUHJvYmluZ0ZsYWcpCit7CisgICAgdThfdCAgIGFkZHJbNl0sIGk7CisgICAgdThfdCAgIHJhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9NQUNfV09SRF9UT19CWVRFKG1hY0FkZHIsIGFkZHIpOworICAgICpwaHlDdHJsID0gMDsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmF0ZSA9ICh1OF90KXpmUmF0ZUN0cmxHZXRUeFJhdGUoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKy8vI2lmZGVmIFpNX0ZCNTAKKyAgICAgICAgLy9yYXRlID0gMjc7CisvLyNlbmRpZgorICAgICAgICAqcGh5Q3RybCA9IHpjUmF0ZVRvUGh5Q3RybFtyYXRlXTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgZm9yKGk9MDsgaTx3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhZGRyWzBdICYmIDB4MDEgPT0gMSApIC8vIFRoZSBkZWZhdWx0IGJlYWNvbiB0cmFuc21pdHRlZCByYXRlIGlzIENDSyBhbmQgMSBNYnBzICwgYnV0IHRoZSBhIG1vZGUgc2hvdWxkIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9GRE0gbW9kdWxhdGlvbiBhbmQgNk1icHMgdG8gdHJhbnNtaXQgYmVhY29uLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcmF0ZSA9ICh1OF90KXpmUmF0ZUN0cmxHZXRUeFJhdGUoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKyAgICAgICAgICAgICAgICByYXRlID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbMF07CisgICAgICAgICAgICAgICAgKnBoeUN0cmwgPSB6Y1JhdGVUb1BoeUN0cmxbcmF0ZV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggemZNZW1vcnlJc0VxdWFsKGFkZHIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlID0gKHU4X3QpemZSYXRlQ3RybEdldFR4UmF0ZShkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIHJjUHJvYmluZ0ZsYWcpOworICAgICAgICAgICAgICAgICpwaHlDdHJsID0gemNSYXRlVG9QaHlDdHJsW3JhdGVdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmU3RhR2V0UnhNaWNLZXkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3Qga2V5SW5kZXg7CisgICAgdThfdCBkYTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBpZiBuZWVkIG5vdCBjaGVjayBNSUMsIHJldHVybiBOVUxMICovCisgICAgaWYgKCAoKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX1RLSVApJiYod2QtPnN0YS5lbmNyeU1vZGUgIT0gWk1fQUVTKSl8fAorICAgICAgICAgKHdkLT5zdGEud3BhU3RhdGUgPCBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKSApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBkYTAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworCisgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSAmIDB4ODApID09IDB4ODApCisgICAgICAgIGtleUluZGV4ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfSVZfT0ZGU0VUKzUpOyAvKiBRb3MgUGFja2V0Ki8KKyAgICBlbHNlCisgICAgICAgIGtleUluZGV4ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfSVZfT0ZGU0VUKzMpOyAvKiBub3JtYWwgUGFja2V0Ki8KKyAgICBrZXlJbmRleCA9IChrZXlJbmRleCAmIDB4YzApID4+IDY7CisKKyAgICByZXR1cm4gKCZ3ZC0+c3RhLnJ4TWljS2V5W2tleUluZGV4XSk7Cit9CisKK3N0cnVjdCB6c01pY1ZhciogemZTdGFHZXRUeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogaWYgbmVlZCBub3QgY2hlY2sgTUlDLCByZXR1cm4gTlVMTCAqLworICAgIC8vaWYgKCAoKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX1RLSVApJiYod2QtPnN0YS5lbmNyeU1vZGUgIT0gWk1fQUVTKSl8fAorICAgIC8vICAgICAod2QtPnN0YS53cGFTdGF0ZSA8IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spICkKKyAgICBpZiAoICh3ZC0+c3RhLmVuY3J5TW9kZSAhPSBaTV9US0lQKSB8fCAod2QtPnN0YS53cGFTdGF0ZSA8IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spICkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoJndkLT5zdGEudHhNaWNLZXkpOworfQorCit1MTZfdCB6ZlN0YVJ4VmFsaWRhdGVGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCAgIGZyYW1lVHlwZSwgZnJhbWVDdHJsOworICAgIHU4X3QgICBkYTA7CisgICAgLy91MTZfdCAgc2FbM107CisgICAgdTE2X3QgIHJldDsKKyAgICB1MTZfdCAgaTsKKyAgICAvL3U4X3QgICAgc2EwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZGEwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICAvL3NhMCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCk7CisKKyAgICBpZiAoICghemZTdGFJc0Nvbm5lY3RlZChkZXYpKSYmKChmcmFtZVR5cGUgJiAweGYpID09IFpNX1dMQU5fREFUQV9GUkFNRSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9EQVRBX0JFRk9SRV9DT05ORUNURUQ7CisgICAgfQorCisKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpJiYoKGZyYW1lVHlwZSAmIDB4ZikgPT0gWk1fV0xBTl9EQVRBX0ZSQU1FKSApCisgICAgeworICAgICAgICAvKiBjaGVjayBCU1NJRCAqLworICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmlnIEVuZGlhbiBhbmQgTGl0dGxlIEVuZGlhbiBDb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICB1MTZfdCBtYWNbM107CisgICAgICAgICAgICBtYWNbMF0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFswXSk7CisgICAgICAgICAgICBtYWNbMV0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFsxXSk7CisgICAgICAgICAgICBtYWNbMl0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFsyXSk7CisgICAgICAgICAgICBpZiAoICF6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgKHU4X3QgKiltYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpICkKKyAgICAgICAgICAgIHsKKy8qV2Ugd2lsbCBnZXQgbG90cyBvZiBnYXJiYWdlIGRhdGEsIGVzcGVjaWFsbHkgaW4gQUVTIG1vZGUuKi8KKy8qVG8gYXZvaWQgc2VuZGluZyB0b28gbWFueSBkZWF1dGhlbnRpY2F0aW9uIGZyYW1lcyBpbiBTVEEgbW9kZSwgbWFyayBpdC4qLworI2lmIDAKKyAgICAgICAgICAgICAgICAvKiBJZiB1bmljYXN0IGZyYW1lLCBzZW5kIGRlYXV0aCB0byB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCBkYTAgJiAweDAxICkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FbaV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrKGkqMikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCS8qIElmIG11dGlsY2FzdCBhZGRyZXNzLCBkb24ndCBzZW5kIGRlYXV0aGVudGljYXRpb24qLworCQkJCQlpZiAoKCBzYTAgJiAweDAxICkgPT0gMCkKKwkgICAgICAgICAgICAgICAgICAJemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNhLCA3LCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0RBVEFfQlNTSURfTk9UX01BVENIRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBCaWcgRW5kaWFuIGFuZCBMaXR0bGUgRW5kaWFuIENvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgIHUxNl90IG1hY1szXTsKKyAgICAgICAgICAgIG1hY1swXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzBdKTsKKyAgICAgICAgICAgIG1hY1sxXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzFdKTsKKyAgICAgICAgICAgIG1hY1syXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzJdKTsKKyAgICAgICAgICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCAodThfdCAqKW1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfREFUQV9CU1NJRF9OT1RfTUFUQ0hFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lQ3RybCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworCisgICAgICAgIC8qIGNoZWNrIHNlY3VyaXR5IGJpdCAqLworICAgICAgICBpZiAoIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyAmJgorICAgICAgICAgICAgICh3ZC0+c3RhLndlcFN0YXR1cyAhPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCApJiYKKyAgICAgICAgICAgICAoICEoZnJhbWVDdHJsICYgWk1fQklUXzYpICkgKQorICAgICAgICB7ICAgLyogc2VjdXJpdHkgb24sIGJ1dCBnb3QgZGF0YSB3aXRob3V0IGVuY3J5cHRpb24gKi8KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIHJldCA9IFpNX0VSUl9EQVRBX05PVF9FTkNSWVBURUQ7CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEucFN0YVJ4U2VjdXJpdHlDaGVja0NiICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IHdkLT5zdGEucFN0YVJ4U2VjdXJpdHlDaGVja0NiKGRldiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA9PSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5jb21tVGFsbHkuc3dSeERyb3BVbmVuY3J5cHRlZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGlmICggKHdkLT5zdGEud2VwU3RhdHVzICE9IFpNX0VOQ1JZUFRJT05fVEtJUCkmJgorICAgICAgICAgICAgICAgICAod2QtPnN0YS53ZXBTdGF0dXMgIT0gWk1fRU5DUllQVElPTl9BRVMpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0RBVEFfTk9UX0VOQ1JZUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZTdGFNaWNGYWlsdXJlSGFuZGxpbmcoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgICBkYTA7CisgICAgdThfdCAgIG1pY05vdGlmeSA9IDE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlIDwgIFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50Kys7CisKKyAgICBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMSApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJnZXQgdGhlIGZpcnN0IE1JQyBmYWlsdXJlIik7CisgICAgICAgIC8vemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfQ01fVElNRVIsIFpNX1RJQ0tfQ01fVElNRU9VVCk7CisKKyAgICAgICAgLyogVGltZXIgUmVzb2x1dGlvbiBvbiBXaW5YUCBpcyAxNS8xNiBtcyAgKi8KKyAgICAgICAgLyogRGVjcmVhc2UgVGltZSBvZmZzZXQgZm9yIDxYUD4gQ291bnRlciBNZWFzdXJlICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX1RJTUVSLCBaTV9USUNLX0NNX1RJTUVPVVQgLSBaTV9USUNLX0NNX1RJTUVPVVRfT0ZGU0VUKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMiApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJnZXQgdGhlIHNlY29uZCBNSUMgZmFpbHVyZSIpOworICAgICAgICAvKiByZXNlcnZlIDIgc2Vjb25kIGZvciBPUyB0byBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCB0byBBUCAqLworICAgICAgICB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkTGVuZ3RoID0gd2QtPnN0YS5zc2lkTGVuOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5jbURpc2FsbG93U3NpZCwgd2QtPnN0YS5zc2lkLCB3ZC0+c3RhLnNzaWRMZW4pOworICAgICAgICAvL3dkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPSAwOworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fVElNRVIpOworICAgICAgICAvL3pmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QsIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCk7CisKKyAgICAgICAgLyogVGltZXIgUmVzb2x1dGlvbiBvbiBXaW5YUCBpcyAxNS8xNiBtcyAgKi8KKyAgICAgICAgLyogRGVjcmVhc2UgVGltZSBvZmZzZXQgZm9yIDxYUD4gQ291bnRlciBNZWFzdXJlICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QsIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCAtIFpNX1RJQ0tfQ01fRElTQ09OTkVDVF9PRkZTRVQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtaWNOb3RpZnkgPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAobWljTm90aWZ5ID09IDEpCisgICAgeworICAgICAgICBkYTAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworICAgICAgICBpZiAoIGRhMCAmIDB4MDEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5KGRldiwgd2QtPnN0YS5ic3NpZCwgWk1fTUlDX0dST1VQX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYk1pY0ZhaWx1cmVOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYk1pY0ZhaWx1cmVOb3RpZnkoZGV2LCB3ZC0+c3RhLmJzc2lkLCBaTV9NSUNfUEFJUldJU0VfRVJST1IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3U4X3QgemZTdGFCbG9ja1dsYW5TY2FuKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICByZXQ9RkFMU0U7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgemZTdGFSZXNldFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiSW5pdCkKK3sKKyAgICB1OF90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmSHBEaXNhYmxlQmVhY29uKGRldik7CisKKyAgICB3ZC0+ZHRpbSA9IDE7CisgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdID0gMHgwMTsKKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gPSAweDAwOworICAgIC8qIDgwMi4xMWggKi8KKyAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUgfHwgd2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKworICAgIC8qIHJlbGVhc2UgcXVldWVkIHBhY2tldHMgKi8KKyAgICBmb3IoaT0wOyBpPHdkLT5zdGEuaWJzc1BTRGF0YUNvdW50OyBpKyspCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbaV0sIDApOworICAgIH0KKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5zdGFQU0RhdGFDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIHdkLT5zdGEuc3RhUFNEYXRhUXVldWVbaV0sIDApOworICAgIH0KKworICAgIHdkLT5zdGEuaWJzc1BTRGF0YUNvdW50ID0gMDsKKyAgICB3ZC0+c3RhLnN0YVBTRGF0YUNvdW50ID0gMDsKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSAmd2QtPnN0YS5zdGFQU0xpc3QsIHNpemVvZihzdHJ1Y3QgenNTdGFQU0xpc3QpKTsKKworICAgIHdkLT5zdGEud21lQ29ubmVjdGVkID0gMDsKKyAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworICAgIHdkLT5zdGEucW9zSW5mbyA9IDA7CisgICAgemZRdWV1ZUZsdXNoKGRldiwgd2QtPnN0YS51YXBzZFEpOworCisgICAgcmV0dXJuOworCit9CisKK3ZvaWQgemZTdGFJYnNzTW9uaXRvcmluZyh6ZGV2X3QqIGRldiwgdThfdCByZXNldCkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IG9wcG9zaXRlQ291bnQ7CisgICAgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50IGV2ZW50OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiemZTdGFJYnNzTW9uaXRvcmluZyAlZCIsIHdkLT5zdGEub3Bwb3NpdGVDb3VudCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgb3Bwb3NpdGVDb3VudCA9IHdkLT5zdGEub3Bwb3NpdGVDb3VudDsKKworICAgIGZvcihpPTA7IGkgPCBaTV9NQVhfT1BQT1NJVEVfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggb3Bwb3NpdGVDb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJlc2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0udmFsaWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvcHBvc2l0ZUNvdW50LS07CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5hbGl2ZUNvdW50ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJTZXR0aW5nIGFsaXZlIHRvICIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlcik7CisKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyICE9IFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNl90Kil3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyLCAxLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlci0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZTdGFJYnNzTW9uaXRvcmluZyByZW1vdmUgdGhlIHBlZXIgc3RhdGlvbiIpOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KGV2ZW50LmJzc2lkLCAodThfdCAqKSh3ZC0+c3RhLmJzc2lkKSwgNik7CisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkoZXZlbnQucGVlck1hY0FkZHIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpOworCisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9IDA7CisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlQ291bnQtLTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMCwgJmV2ZW50KTsKKyAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitkb25lOgorICAgIGlmICggcmVzZXQgPT0gMCApCisgICAgeworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9JQlNTX01PTklUT1IsIFpNX1RJQ0tfSUJTU19NT05JVE9SKTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmSW5pdFBhcnRuZXJOb3RpZnlFdmVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpCit7CisgICAgdTE2X3QgICpwZWVyTWFjQWRkcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHBlZXJNYWNBZGRyID0gKHUxNl90ICopZXZlbnQtPnBlZXJNYWNBZGRyOworCisgICAgemZNZW1vcnlDb3B5KGV2ZW50LT5ic3NpZCwgKHU4X3QgKikod2QtPnN0YS5ic3NpZCksIDYpOworICAgIHBlZXJNYWNBZGRyWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKTsKKyAgICBwZWVyTWFjQWRkclsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCArIDIpOworICAgIHBlZXJNYWNBZGRyWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUICsgNCk7Cit9CisKK3ZvaWQgemZTdGFJbml0T3Bwb3NpdGVJbmZvKHpkZXZfdCogZGV2KQoreworICAgIGludCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yKGk9MDsgaTxaTV9NQVhfT1BQT1NJVEVfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnZhbGlkID0gMDsKKyAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyID0gWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVI7CisgICAgfQorfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit1MTZfdCB6ZlN0YUFkZEllQ2VuYyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPnN0YS5jZW5jSWVbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHdkLT5zdGEuY2VuY0llLCBvZmZzZXQsIHdkLT5zdGEuY2VuY0llWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKHdkLT5zdGEuY2VuY0llWzFdKzIpOworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK3UxNl90IHpmU3RhUHJvY2Vzc0FjdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBjYXRlZ29yeSwgYWN0aW9uRGV0YWlsczsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBjYXRlZ29yeSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDI0KTsKKyAgICBhY3Rpb25EZXRhaWxzID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjUpOworICAgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgICAgICBjYXNlIDA6CQkvL1NwZWN0cnVtIE1hbmFnZW1lbnQKKwkgICAgICAgIHN3aXRjaChhY3Rpb25EZXRhaWxzKQorCSAgICAgICAgeworCSAgICAgICAgCWNhc2UgMDoJCQkvL01lYXN1cmVtZW50IFJlcXVlc3QKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAxOgkJCS8vTWVhc3VyZW1lbnQgUmVwb3J0CisJICAgICAgICAJCS8vUHJvY2Vzc0FjdGlvblNwZWN0cnVtRnJhbWVfTWVhc3VyZW1lbnRSZXBvcnQoQWRhcHRlcixwQWN0aW9uQm9keSszKTsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAyOgkJCS8vVFBDIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHpmU3RhVXBkYXRlRG90MTFIVFBDKGRldiwgYnVmKTsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAzOgkJCS8vVFBDIHJlcG9ydAorICAgICAgICAgICAgICAgICAgICAvL2lmICh3ZC0+c3RhLlRQQ0VuYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgemZTdGFVcGRhdGVEb3QxMUhUUEMoZGV2LCBidWYpOworCSAgICAgICAgCQlicmVhazsKKwkgICAgICAgIAljYXNlIDQ6CQkJLy9DaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuREZTRW5hYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgemZTdGFVcGRhdGVEb3QxMUhERlMoZGV2LCBidWYpOworCSAgICAgICAgCQlicmVhazsKKwkgICAgICAgIAlkZWZhdWx0OgorCSAgICAgICAgCQl6bV9kZWJ1Z19tc2cxKCJBY3Rpb24gRnJhbWUgY29udGFpbiBub3Qgc3VwcG9ydCBhY3Rpb24gZmllbGQgIiwgYWN0aW9uRGV0YWlscyk7CisJICAgICAgICAJCWJyZWFrOworCSAgICAgICAgfQorICAgICAgICAJYnJlYWs7CisgICAgICAgIGNhc2UgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FOgorICAgICAgICAgICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKGRldiwgYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OgkvL1FvcyBNYW5hZ2VtZW50CisgICAgICAgIAlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogRGV0ZXJtaW5lIHRoZSB0aW1lIG5vdCBzZW5kIGJlYWNvbiAsIGlmIG1vcmUgdGhhbiBzb21lIHZhbHVlICwKKyAgIHJlLXdyaXRlIHRoZSBiZWFjb24gc3RhcnQgYWRkcmVzcyAqLwordm9pZCB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnRpY2tJYnNzU2VuZEJlYWNvbisrOyAgICAvLyBJbmNyZWFzZSAxIHBlciAxMG1zIC4KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCB3ZC0+dGlja0lic3NTZW5kQmVhY29uID09IDQwICkKKyAgICB7CisvLyAgICAgICAgRGJnUHJpbnQoIjIwMDcwNzI3Iik7CisgICAgICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0lCU1MsIHdkLT5iZWFjb25JbnRlcnZhbCwgd2QtPmR0aW0sICh1OF90KXdkLT5zdGEuYXRpbVdpbmRvdyk7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT50aWNrSWJzc1NlbmRCZWFjb24gPSAwOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KK30KKworc3RydWN0IHpzVGtpcFNlZWQqIHpmU3RhR2V0UnhTZWVkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGtleUluZGV4OworICAgIHU4X3QgZGEwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogaWYgbmVlZCBub3QgY2hlY2sgTUlDLCByZXR1cm4gTlVMTCAqLworICAgIGlmICggKCh3ZC0+c3RhLmVuY3J5TW9kZSAhPSBaTV9US0lQKSYmKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX0FFUykpfHwKKyAgICAgICAgICh3ZC0+c3RhLndwYVN0YXRlIDwgWk1fU1RBX1dQQV9TVEFURV9QS19PSykgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZGEwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKworICAgIGlmICgoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgJiAweDgwKSA9PSAweDgwKQorICAgICAgICBrZXlJbmRleCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCs1KTsgLyogUW9zIFBhY2tldCovCisgICAgZWxzZQorICAgICAgICBrZXlJbmRleCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCszKTsgLyogbm9ybWFsIFBhY2tldCovCisgICAga2V5SW5kZXggPSAoa2V5SW5kZXggJiAweGMwKSA+PiA2OworCisgICAgcmV0dXJuICgmd2QtPnN0YS5yeFNlZWRba2V5SW5kZXhdKTsKK30KKwordm9pZCB6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldiwgdThfdCB2YWx1ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSA9IHZhbHVlOworICAgIHpmSHBTV0RlY3J5cHQoZGV2LCAxKTsKKyAgICB6ZkhwU1dFbmNyeXB0KGRldiwgMSk7Cit9CisKK3ZvaWQgemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKHpkZXZfdCAqZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlID0gMDsKKyAgICB6ZkhwU1dEZWNyeXB0KGRldiwgMCk7CisgICAgemZIcFNXRW5jcnlwdChkZXYsIDApOworfQorCit1MTZfdCB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoemRldl90ICpkZXYsIHU4X3QgaXNCTW9kZSwgdThfdCBpc0hULCB1OF90IGlzSFQ0MCwgdThfdCBzaWduYWxTdHJlbmd0aCkKK3sKKwl1OF90ICB3ZWlnaHRPZkIgICAgICAgICAgID0gMDsKKwl1OF90ICB3ZWlnaHRPZkFHQmVsb3dUaHIgID0gMDsKKwl1OF90ICB3ZWlnaHRPZkFHVXBUaHIgICAgID0gMTU7CisJdThfdCAgd2VpZ2h0T2ZOMjBCZWxvd1RociA9IDE1OworCXU4X3QgIHdlaWdodE9mTjIwVXBUaHIgICAgPSAzMDsKKwl1OF90ICB3ZWlnaHRPZk40MEJlbG93VGhyID0gMTY7CisJdThfdCAgd2VpZ2h0T2ZONDBVcFRociAgICA9IDMyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYoIGlzQk1vZGUgPT0gMCApCisgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZkIpOyAgICAvLyBwdXJlIGIgbW9kZSAsIGRvIG5vdCBhZGQgdGhlIHdlaWdodCB2YWx1ZSBmb3IgdGhpcyBBUCAhCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGlzSFQgPT0gMCAmJiBpc0hUNDAgPT0gMCApCisgICAgICAgIHsgLy8gYSAsIGcgLCBiL2cgbW9kZSAhIGFkZCB0aGUgd2VpZ2h0IHZhbHVlIDE1IGZvciB0aGlzIEFQIGlmIGl0J3Mgc2lnbmFsIHN0cmVuZ3RoIGlzIG1vcmUgdGhhbiBzb21lIHZhbHVlICEKKyAgICAgICAgICAgIGlmKCBzaWduYWxTdHJlbmd0aCA8IDE4ICkgLy8gLTc3IGRCbQorCQkJCXJldHVybiBzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mQUdCZWxvd1RocjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKHNpZ25hbFN0cmVuZ3RoICsgd2VpZ2h0T2ZBR1VwVGhyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBpc0hUID09IDEgJiYgaXNIVDQwID09IDAgKQorICAgICAgICB7IC8vIDgwMjExbiBtb2RlIHVzZSAyME1IegorICAgICAgICAgICAgaWYoIHNpZ25hbFN0cmVuZ3RoIDwgMjMgKSAvLyAtNzIgZEJtCisgICAgICAgICAgICAgICAgcmV0dXJuIChzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mTjIwQmVsb3dUaHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZk4yMFVwVGhyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIGlzSFQgPT0gMSAmJiBpc0hUNDAgPT0gMQorICAgICAgICB7IC8vIDgwMjExbiBtb2RlIHVzZSA0ME1IegorICAgICAgICAgICAgaWYoIHNpZ25hbFN0cmVuZ3RoIDwgMTYgKSAvLyAtNzkgZEJtCisgICAgICAgICAgICAgICAgcmV0dXJuIChzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mTjQwQmVsb3dUaHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZk40MFVwVGhyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordTE2X3QgemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworCXUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jb2lkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY29pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDdmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY29pZC5jCkBAIC0wLDAgKzEsMjY5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBPSUQgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAiLi4vaGFsL2hwcmVnLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzICAgICAgKi8KKy8qICAgICAgUXVlcnkgT1dOIE1BQyBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IGZvciByZXR1cm4gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgYWRkclswXSA9ICh1OF90KSh3ZC0+bWFjQWRkclswXSAmIDB4ZmYpOworICAgIGFkZHJbMV0gPSAodThfdCkod2QtPm1hY0FkZHJbMF0gPj4gOCk7CisgICAgYWRkclsyXSA9ICh1OF90KSh3ZC0+bWFjQWRkclsxXSAmIDB4ZmYpOworICAgIGFkZHJbM10gPSAodThfdCkod2QtPm1hY0FkZHJbMV0gPj4gOCk7CisgICAgYWRkcls0XSA9ICh1OF90KSh3ZC0+bWFjQWRkclsyXSAmIDB4ZmYpOworICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIGFkZHJbNV0gPSAodThfdCkod2QtPm1hY0FkZHJbMl0gPj4gOCk7CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICBhZGRyWzVdID0gKHU4X3QpKHdkLT5tYWNBZGRyWzJdID4+IDgpOyAvLyBNdWx0aXBsZSBTU0lECisjZWxzZQorICAgICAgICBhZGRyWzVdID0gdmFwSWQgKyAxICsgKHU4X3QpKHdkLT5tYWNBZGRyWzJdID4+IDgpOyAvL1ZBUAorI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmaVdsYW5RdWVyeUJzc0xpc3QoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0xpc3QqIHBCc3NMaXN0KQoreworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyogICBwRHN0QnNzSW5mbzsKKyAgICB1OF90ICAgaTsKKyAgICB1OF90KiAgcE1lbUxpc3Q7CisgICAgdThfdCogIHBNZW1JbmZvOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHBNZW1MaXN0ID0gKHU4X3QqKSBwQnNzTGlzdDsKKyAgICBwTWVtSW5mbyA9IHBNZW1MaXN0ICsgc2l6ZW9mKHN0cnVjdCB6c0Jzc0xpc3QpOworICAgIHBCc3NMaXN0LT5oZWFkID0gKHN0cnVjdCB6c0Jzc0luZm8qKSBwTWVtSW5mbzsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBwQnNzSW5mbyA9IHdkLT5zdGEuYnNzTGlzdC5oZWFkOworICAgIHBEc3RCc3NJbmZvID0gKHN0cnVjdCB6c0Jzc0luZm8qKSBwTWVtSW5mbzsKKyAgICBwQnNzTGlzdC0+YnNzQ291bnQgPSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKXBEc3RCc3NJbmZvLCAodThfdCopcEJzc0luZm8sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5uZXh0ICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgcERzdEJzc0luZm8tPm5leHQgPSBwRHN0QnNzSW5mbyArIDE7CisgICAgICAgICAgICBwRHN0QnNzSW5mbysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KGk9PSh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2Nhbk1nclNjYW5BY2soZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlCc3NMaXN0VjEoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0xpc3RWMSogYnNzTGlzdFYxKQoreworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgcEJzc0luZm87CisgICAgLy9zdHJ1Y3QgenNCc3NJbmZvKiAgIHBEc3RCc3NJbmZvOworICAgIHU4X3QgICBpLCBqLCBiZHJvcCA9IDAsIGsgPSAwLCBTYW1lX0NvdW50ID0gMDsKKyAgICB1OF90ICAgYnNzaWRbNl07CisgICAgLy91OF90KiAgcE1lbUxpc3Q7CisgICAgLy91OF90KiAgcE1lbUluZm87CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgYnNzTGlzdFYxLT5ic3NDb3VudCA9IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudDsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgWk1fTUFDX1dPUkRfVE9fQllURSh3ZC0+c3RhLmJzc2lkLCBic3NpZCk7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBiZHJvcCA9IDA7CisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpCisgICAgICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkgKQorICAgICAgICB7CisJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmJzc2lkW2pdICE9IGJzc2lkW2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgICggKGogPT0gNikKKyAgICAgICAgICAgICAgICAgICYmKChwQnNzSW5mby0+c3NpZFsxXSA9PSB3ZC0+c3RhLnNzaWRMZW4pIHx8IChwQnNzSW5mby0+c3NpZFsxXSA9PSAwKSApJiYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gd2QtPmZyZXF1ZW5jeSkgKQorICAgICAgICAgICAgeworCQkJCWlmKHBCc3NJbmZvLT5zc2lkWzFdID09IDApCisJCQkJCXBCc3NJbmZvLT5zc2lkWzFdID0gd2QtPnN0YS5zc2lkTGVuOworCisJCQkJaWYoU2FtZV9Db3VudCA9PSAwKQorCQkJCXsvL0ZpcnN0IG1lZXQKKwkJCQkJU2FtZV9Db3VudCsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vc2FtZSBvbmUKKwkJCQkJYmRyb3AgPSAxOworCQkJCQlic3NMaXN0VjEtPmJzc0NvdW50LS07CisJCQkJfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmRyb3AgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90KikoJmJzc0xpc3RWMS0+YnNzSW5mb1trXSksICh1OF90KilwQnNzSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworCisJCQlpZihTYW1lX0NvdW50ID09IDEpCisJCQl7CisJCQkJemZNZW1vcnlDb3B5KCYoYnNzTGlzdFYxLT5ic3NJbmZvW2tdLnNzaWRbMl0pLCB3ZC0+c3RhLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisJCQkJU2FtZV9Db3VudCsrOworCQkJfQorCisJCQlrKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5uZXh0ICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KGk9PSh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2Nhbk1nclNjYW5BY2soZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlBZEhvY0NyZWF0ZWRCc3NEZXNjKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvICpwQnNzSW5mbykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mbywgKHU4X3QgKikmd2QtPnN0YS5pYnNzQnNzRGVzYywgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBZEhvY0lzQ3JlYXRvcih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN0YS5pYnNzQnNzSXNDcmVhdG9yOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlTdXBwb3J0TW9kZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN1cHBvcnRNb2RlOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHUzMl90IHJldCA9IDA7CisKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSB7CisgICAgICAgIHJldCA9IHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHpmSHBHZXRUcmFuc21pdFBvd2VyKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVdsYW5GbHVzaEJzc0xpc3QgICAgICAgICAqLworLyogICAgICBGbHVzaCBCU1NJRCBMaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZmlXbGFuRmx1c2hCc3NMaXN0KHpkZXZfdCogZGV2KQoreworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIENhbGwgemZCc3NJbmZvUmVmcmVzaCgpIHR3aWNlIHRvIHJlbW92ZSBhbGwgZW50cnkgKi8KKyAgICB6ZkJzc0luZm9SZWZyZXNoKGRldiwgMSk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0V2xhbk1vZGUoemRldl90KiBkZXYsIHU4X3Qgd2xhbk1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPndzLndsYW5Nb2RlID0gd2xhbk1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IGF1dGhNb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT53cy5hdXRoTW9kZSA9IGF1dGhNb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldFdlcFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCB3ZXBTdGF0dXMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPndzLndlcFN0YXR1cyA9IHdlcFN0YXR1czsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZpV2xhblNldFNTSUQoemRldl90KiBkZXYsIHU4X3QqIHNzaWQsIHU4X3Qgc3NpZExlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHNzaWRMZW5ndGggPD0gMzIgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IHNzaWRMZW5ndGg7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+d3Muc3NpZCwgc3NpZCwgc3NpZExlbmd0aCk7CisKKyAgICAgICAgaWYgKCBzc2lkTGVuZ3RoIDwgMzIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+d3Muc3NpZFtzc2lkTGVuZ3RoXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0WzBdLnNzaWRMZW4gPSBzc2lkTGVuZ3RoOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPndzLnByb2JpbmdTc2lkTGlzdFswXS5zc2lkLCBzc2lkLCBzc2lkTGVuZ3RoKTsKKyAgICAgICAgZm9yIChpPTE7IGk8Wk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtpXS5zc2lkTGVuID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKHpkZXZfdCogZGV2LCB1MTZfdCBmcmFnVGhyZXNob2xkKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKGZyYWdUaHJlc2hvbGQgPT0gMCkKKyAgICB7ICAgLyogZnJhZ21lbnRhdGlvbiBpcyBkaXNhYmxlZCAqLworICAgICAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IDMyNzY3OworICAgIH0KKyAgICBlbHNlIGlmIChmcmFnVGhyZXNob2xkIDwgMjU2KQorICAgIHsKKyAgICAgICAgLyogTWluaW11bSBmcmFnbWVudCB0aHJlc2hvbGQgKi8KKyAgICAgICAgd2QtPmZyYWdUaHJlc2hvbGQgPSAyNTY7CisgICAgfQorICAgIGVsc2UgaWYgKGZyYWdUaHJlc2hvbGQgPiAyMzQ2KQorICAgIHsKKyAgICAgICAgd2QtPmZyYWdUaHJlc2hvbGQgPSAyMzQ2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IGZyYWdUaHJlc2hvbGQgJiAweGZmZmU7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKHpkZXZfdCogZGV2LCB1MTZfdCBydHNUaHJlc2hvbGQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnJ0c1RocmVzaG9sZCA9IHJ0c1RocmVzaG9sZDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5TZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBiSW1tZWRpYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIGJJbW1lZGlhdGUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPmZyZXF1ZW5jeSA9ICh1MTZfdCkgKGZyZXF1ZW5jeS8xMDAwKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIGlmKCBmcmVxdWVuY3kgPT0gMCApCisgICAgICAgIHsgLy8gQXV0byBzZWxlY3QgY2xlYW4gY2hhbm5lbCBkZXBlbmQgb24gd2lyZWxlc3MgZW52aXJvbm1lbnQgIQorICAgICAgICAgICAgd2QtPndzLmF1dG9TZXRGcmVxdWVuY3kgPSAwOworICAgICAgICB9CisgICAgICAgIHdkLT53cy5mcmVxdWVuY3kgPSAodTE2X3QpIChmcmVxdWVuY3kvMTAwMCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpCit7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICB3ZC0+d3MuZGVzaXJlZEJzc2lkW2ldID0gYnNzaWRbaV07CisgICAgfQorICAgIHdkLT53cy5iRGVzaXJlZEJzc2lkID0gVFJVRTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZpV2xhblNldEJlYWNvbkludGVydmFsKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgIGJlYWNvbkludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCAgIGJJbW1lZGlhdGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggYkltbWVkaWF0ZSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSBiZWFjb25JbnRlcnZhbDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiB1cGRhdGUgYmVhY29uIGludGVydmFsIGhlcmUgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPndzLmJlYWNvbkludGVydmFsID0gYmVhY29uSW50ZXJ2YWw7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCisKK3ZvaWQgemZpV2xhblNldER0aW1Db3VudCh6ZGV2X3QqIGRldiwgdThfdCAgZHRpbSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoZHRpbSA+IDApCisgICAgeworICAgICAgICB3ZC0+d3MuZHRpbSA9IGR0aW07CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKwordm9pZCB6ZmlXbGFuU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbmRvdywgdThfdCBiSW1tZWRpYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIGJJbW1lZGlhdGUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5hdGltV2luZG93ID0gYXRpbVdpbmRvdzsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiBhdGltIHdpbmRvdyBoZXJlICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT53cy5hdGltV2luZG93ID0gYXRpbVdpbmRvdzsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9Cit9CisKKwordm9pZCB6ZmlXbGFuU2V0RW5jcnlNb2RlKHpkZXZfdCogZGV2LCB1OF90IGVuY3J5TW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICAvKiBIb3N0YXBkIElzc3VlICovCisgICAgICAgIGlmICgod2QtPndzLmVuY3J5TW9kZSAhPSBaTV9BRVMpICYmICh3ZC0+d3MuZW5jcnlNb2RlICE9IFpNX1RLSVApKQorICAgICAgICAgICAgd2QtPndzLmVuY3J5TW9kZSA9IGVuY3J5TW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB3ZC0+d3MuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldERlZmF1bHRLZXlJZCh6ZGV2X3QqIGRldiwgdThfdCBrZXlJZCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmtleUlkID0ga2V5SWQ7Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5SXNQS0luc3RhbGxlZCh6ZGV2X3QgKmRldiwgdThfdCAqc3RhTWFjQWRkcikKK3sKKyAgICB1OF90IGlzSW5zdGFsbGVkID0gMDsKKworI2lmIDEKKy8vI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB1OF90ICAgcmVzLCBwZWVySWR4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmVzID0gemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoZGV2LCAodTE2X3QgKilzdGFNYWNBZGRyLCAmcGVlcklkeCk7CisgICAgaWYoIHJlcyA9PSAwICkKKyAgICB7CisgICAgICAgIGlzSW5zdGFsbGVkID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bcGVlcklkeF0ucGtJbnN0YWxsZWQ7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisvLyNlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm4gaXNJbnN0YWxsZWQ7Cit9CisKK3U4X3QgemZpV2xhblNldEtleSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvKQoreworICAgIHUxNl90ICBicm9hZGNhc3RbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgdTMyX3QqIGtleTsKKyAgICB1OF90ICAgZW5jcnlNb2RlID0gWk1fTk9fV0VQOworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB1OF90ICAgZW5jcnlUeXBlID0gWk1fTk9fV0VQOworI2VuZGlmCisgICAgdThfdCAgIG1pY0tleVsxNl07CisgICAgdTE2X3QgIGlkID0gMDsKKyAgICB1OF90ICAgdmFwSWQsIGksIGFkZHJbNl07CisgICAgdThfdCAgIHVzZXJJZHg9MDsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAvKiBEZXRlcm1pbmUgb3Bwb3NpdGUgZXhpc3Qgb3Igbm90ICovCisgICAgdThfdCAgIHJlcywgcGVlcklkeDsKKy8vICAgIHU4X3QgICB1c2VySWR4PTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuaWJzc1dwYTJQc2sgPT0gMSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsICh1MTZfdCopa2V5SW5mby5tYWNBZGRyLCAmcGVlcklkeCk7CisgICAgICAgIGlmKCByZXMgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzZXJJZHggPSBwZWVySWR4OworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5jYW1JZHggPT0gMHhmZiApCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uY2FtSWR4ID0gdXNlcklkeDsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyNlbHNlCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworI2VuZGlmCisKKyAgICBpZiAoIGtleUluZm8uZmxhZyAmIFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgKQorICAgIHsgICAvKiBzZXQga2V5IGJ5IGF1dGhlbnRpY2F0b3IgKi8KKyAgICAgICAgLyogc2V0IHBhaXJ3aXNlIGtleSAqLworICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfUEspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpbmQgU1RBJ3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGtleUluZm8ubWFjQWRkcikpID09IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDYW4ndCBTVEEgaW4gdGhlIHN0YVRhYmxlICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLml2MTYgPSAwOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjMyID0gMDsKKworICAgICAgICAgICAgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDMyKQorICAgICAgICAgICAgeyAgIC8qIFRLSVAgKi8KKyAgICAgICAgICAgICAgICAvL3U4X3QgS2V5UnNjWzZdID0gezAsIDAsIDAsIDAsIDAsIDB9OworCisgICAgICAgICAgICAgICAgLyogSW4gdGhlIGN1cnJlbnQgQVAgbW9kZSwgd2Ugc2V0IEtleVJzYyB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgLy96ZlRraXBJbml0KGtleUluZm8ua2V5LCAodThfdCopIHdkLT5tYWNBZGRyLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAmKHdkLT5hcC5zdGFUYWJsZVtpZF0udHhTZWVkKSwgS2V5UnNjKTsKKyAgICAgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikga2V5SW5mby5tYWNBZGRyLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAmKHdkLT5hcC5zdGFUYWJsZVtpZF0ucnhTZWVkKSwgS2V5UnNjKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19DRU5DKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiU2V0IENFTkMgcGFpcndpc2UgS2V5Iik7CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPSBaTV9DRU5DOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzBdID0gMHg1YzM2NWMzNzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMF0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMV0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMl0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbM10gPSAweDVjMzY1YzM2OworCisgICAgICAgICAgICAgICAgICAgIC8qIFNldCBLZXkgSW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5jZW5jS2V5SWR4ID0ga2V5SW5mby5rZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX0NFTkMsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSA9IFpNX1RLSVA7CisKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KG1pY0tleSwgJmtleUluZm8ua2V5WzE2XSwgOCk7CisgICAgICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSgmbWljS2V5WzhdLCAma2V5SW5mby5rZXlbMjRdLCA4KTsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX1RLSVAsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICh1MzJfdCopIG1pY0tleSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIGZyYWdtZW50YXRpb24sIHdlIHVzZSBzb2Z0d2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJih3ZC0+YXAuc3RhVGFibGVbaWRdLnR4TWljS2V5KSwgJihrZXlJbmZvLmtleVsxNl0pLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJih3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4TWljS2V5KSwgJihrZXlJbmZvLmtleVsyNF0pLCA4KTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDE2KQorICAgICAgICAgICAgeyAgIC8qIEFFUyAqLworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDbGVhciBLZXkgSW5mbyAqLworICAgICAgICAgICAgICAgIHpmQXBDbGVhclN0YUtleShkZXYsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkcik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDAsIHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlLAorICAgICAgICAgICAgLy8gICAgICAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIHpmSHBTZXRBcFBhaXJ3aXNlS2V5KGRldiwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSwgKHUzMl90Kikga2V5SW5mby5rZXksCisgICAgICAgICAgICAgICAgICAgICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0sIGlkKzEpOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5rZXlJZHggPSBpZCArIDEgKyA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGtleUluZm8uZmxhZyAmIFpNX0tFWV9GTEFHX0dLKQorICAgICAgICB7CisgICAgICAgICAgICB2YXBJZCA9IGtleUluZm8udmFwSWQ7CisKKyAgICAgICAgICAgIHdkLT5hcC5pdjE2W3ZhcElkXSA9IDA7CisgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBJZF0gPSAwOworCisgICAgICAgICAgICBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMzIpCisgICAgICAgICAgICB7ICAgLyogVEtJUCAqLworICAgICAgICAgICAgICAgIC8vdThfdCBLZXlSc2NbNl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CisKKyAgICAgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPm1hY0FkZHIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICYod2QtPmFwLmJjU2VlZCksIEtleVJzYyk7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIGdyb3VwIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzBdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX0NFTkMsIGtleUluZm8udmFwQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIGtleUluZm8ua2V5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gKHUzMl90ICopa2V5SW5mby5rZXk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IE1JQyBrZXkgdG8gSE1BQyAqLworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIGJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIGtleUluZm8udmFwQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICh1MzJfdCopICgma2V5SW5mby5rZXlbMTZdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJihrZXlJbmZvLmtleVsxNl0pLCAmKHdkLT5hcC5iY01pY0tleVswXSkpOworICAgICAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAxNikKKyAgICAgICAgICAgIHsgICAvKiBBRVMgKi8KKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9BRVM7CisgICAgICAgICAgICAgICAga2V5ID0gKHUzMl90ICopa2V5SW5mby5rZXk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ1dZIC0gU2V0IEFFUyBHcm91cCBLZXkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ2xlYXIgS2V5IEluZm8gKi8KKyAgICAgICAgICAgICAgICB6ZkFwQ2xlYXJTdGFLZXkoZGV2LCBicm9hZGNhc3QpOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgV0VQIGJpdCBpbiB0aGUgY2FwYWJpbGl0eSBmaWVsZCAqLworICAgICAgICAgICAgICAgIHdkLT5hcC5jYXBhYlt2YXBJZF0gJj0gMHhmZmVmOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgIC8qIFdFUCAqLworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSA1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDEzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAyOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1dFUDI1NjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW9kaWZpY2F0aW9uIGZvciBDQU0gbm90IHN1cHBvcnQgVkFQIHNlYXJjaAorICAgICAgICAgICAgLy96ZkNvcmVTZXRLZXkoZGV2LCAwLCAwLCBlbmNyeU1vZGUsIGJyb2FkY2FzdCwga2V5KTsKKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgZW5jcnlNb2RlLCB3ZC0+bWFjQWRkciwga2V5KTsKKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgZW5jcnlNb2RlLCBrZXlJbmZvLnZhcEFkZHIsIGtleSk7CisgICAgICAgICAgICB6ZkhwU2V0QXBHcm91cEtleShkZXYsIHdkLT5tYWNBZGRyLCBlbmNyeU1vZGUsCisgICAgICAgICAgICAgICAgICAgIGtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSwgdmFwSWQpOworCisgICAgICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBlbmNyeU1vZGUpOworICAgICAgICAgICAgd2QtPndzLmVuY3J5TW9kZSA9IGVuY3J5TW9kZTsKKworICAgICAgICAgICAgLyogc2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyBlbmNyeXB0aW9uIHR5cGUgKi8KKyAgICAgICAgICAgIHdkLT5hcC5lbmNyeU1vZGVbdmFwSWRdID0gZW5jcnlNb2RlOworCisgICAgICAgICAgICAvKiBzZXQgdGhlIG11bHRpY2FzdCBrZXkgaW5kZXggKi8KKyAgICAgICAgICAgIHdkLT5hcC5iY0tleUluZGV4W3ZhcElkXSA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICB3ZC0+YXAuYmNIYWxLZXlJZHhbdmFwSWRdID0gdmFwSWQgKyA2MDsKKworICAgICAgICAgICAgLyogVHVybiBvbiBXRVAgYml0IGluIHRoZSBjYXBhYmlsaXR5IGZpZWxkICovCisgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWRdIHw9IDB4MTA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiBzZXQgYnkgc3VwcGxpY2FudCAqLworCisgICAgICAgIGlmICgga2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfUEsgKQorICAgICAgICB7ICAgLyogc2V0IHBhaXJ3aXNlIGtleSAqLworCisgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPm1hY0FkZHIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgJndkLT5zdGEudHhTZWVkLCBrZXlJbmZvLmluaXRJdik7CisgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAmd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0sIGtleUluZm8uaW5pdEl2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5pYnNzV3BhMlBzayA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB1bmljYXN0IC0tID4gcGFpcndpc2Uga2V5ICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYxNiA9IDA7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYzMiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5wa0luc3RhbGxlZCA9IDE7CisjZWxzZQorICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgIHdkLT5zdGEuaXYzMiA9IDA7CisKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW3VzZXJJZHhdLnBrSW5zdGFsbGVkID0gMTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsgICAvKiBUS0lQICovCisgICAgICAgICAgICAgICAgemZUa2lwSW5pdChrZXlJbmZvLmtleSwgKHU4X3QqKSB3ZC0+bWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnR4U2VlZCwga2V5SW5mby5pbml0SXYpOworICAgICAgICAgICAgICAgIHpmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4U2VlZFtrZXlJbmZvLmtleUluZGV4XSwga2V5SW5mby5pbml0SXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIHBhaXJ3aXNlIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQ0VOQzsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsxXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsyXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlszXSA9IDB4NWMzNjVjMzY7CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdID0gMHg1YzM2NWMzNzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgS2V5IEluZGV4ICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY2VuY0tleUlkID0ga2V5SW5mby5rZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX0NFTkMsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fVEtJUDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzE2XSwgJndkLT5zdGEudHhNaWNLZXkpOworICAgICAgICAgICAgICAgICAgICB6Zk1pY1NldEtleSgma2V5SW5mby5rZXlbMjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2QtPnN0YS5yeE1pY0tleVtrZXlJbmZvLmtleUluZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDE2ICkKKyAgICAgICAgICAgIHsgICAvKiBBRVMgKi8KKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NXcGEyUHNrID09IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgICAgICBlbmNyeVR5cGUgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5lbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgICAgICBlbmNyeVR5cGUgPSB3ZC0+c3RhLmVuY3J5TW9kZTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2VyIDAgKi8KKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgd2QtPnN0YS5lbmNyeU1vZGUsCisgICAgICAgICAgICAvLyAgICAgICAgIHdkLT5zdGEuYnNzaWQsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIC8vemZIcFNldFN0YVBhaXJ3aXNlS2V5KGRldiwgd2QtPnN0YS5ic3NpZCwgd2QtPnN0YS5lbmNyeU1vZGUsCisgICAgICAgICAgICAvLyAgICAodTMyX3QqKSBrZXlJbmZvLmtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICBpZiAoIChrZXlJbmZvLmtleUxlbmd0aD09MTYpICYmICh3ZC0+c3RhLmlic3NXcGEyUHNrPT0xKSApCisgICAgICAgICAgICB7IC8qIElmIG5vdCBBRVMtQ0NNUCBhbmQgaWJzcyBuZXR3b3JrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4LCAgLy8ga2V5IGlkID09IDAgKCBQYWlyd2lzZSBrZXkgPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QqKWtleUluZm8ubWFjQWRkciwgICAvLyBSWCBuZWVkIFNvdXJjZSBBZGRyZXNzICggQWRkcmVzcyAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlUeXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0ud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsvKiBCaWcgRW5kaWFuIGFuZCBMaXR0bGUgRW5kaWFuIENvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkclsyICogaV0gPSB3ZC0+c3RhLmJzc2lkW2ldICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgYWRkclsyICogaSArIDFdID0gd2QtPnN0YS5ic3NpZFtpXSA+PiA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZkhwU2V0UGVyVXNlcktleShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9VU0VSX0tFWV9QSywgICAvLyB1c2VyIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBrZXkgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIsLy8odThfdCAqKXdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKworICAgICAgICAgICAgICAgIHdkLT5zdGEua2V5SWQgPSA0OworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIC8qIEJpZyBFbmRpYW4gYW5kIExpdHRsZSBFbmRpYW4gQ29tcGF0aWJpbGl0eSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyWzIgKiBpXSA9IHdkLT5zdGEuYnNzaWRbaV0gJiAweGZmOworICAgICAgICAgICAgICAgIGFkZHJbMiAqIGkgKyAxXSA9IHdkLT5zdGEuYnNzaWRbaV0gPj4gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpmSHBTZXRQZXJVc2VyS2V5KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1VTRVJfS0VZX1BLLCAgIC8vIHVzZXIgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIGtleSBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwvLyh1OF90ICopd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICB3ZC0+c3RhLmtleUlkID0gNDsKKyNlbmRpZgorCisgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgga2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfR0sgKQorICAgICAgICB7ICAgLyogc2V0IGdyb3VwIGtleSAqLworCisgICAgICAgICAgICB6ZlRraXBJbml0KGtleUluZm8ua2V5LCAodThfdCopIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4U2VlZFtrZXlJbmZvLmtleUluZGV4XSwga2V5SW5mby5pbml0SXYpOworCisgICAgICAgICAgICBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsgICAvKiBUS0lQICovCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIGdyb3VwIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbMF0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbM10gPSAweDVjMzY1YzM2OworCisgICAgICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMSwgWk1fQ0VOQywga2V5SW5mby52YXBBZGRyLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworICAgICAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1RLSVA7CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIHdkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLnRrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggIShrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19JTklUX0lWKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLml2MTYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0uaXYzMiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBzZXQgTUlDIGtleSB0byBITUFDICovCisgICAgICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgOCwgMSwgWk1fVEtJUCwgYnJvYWRjYXN0LAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICh1MzJfdCopICgma2V5SW5mby5rZXlbMTZdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkLT5zdGEucnhNaWNLZXlba2V5SW5mby5rZXlJbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxNiApCisgICAgICAgICAgICB7ICAgLyogQUVTICovCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgIC8va2V5ID0gKHUzMl90Kikgd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0udGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgLyogV0VQICovCisgICAgICAgICAgICAgICAgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSA1ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1dFUDY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gMTMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gMjkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIGtleUluZm8ua2V5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2VyIDggKi8KKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgOCwgMCwgZW5jcnlNb2RlLCBicm9hZGNhc3QsIGtleSk7CisgICAgICAgICAgICAvL3pmSHBTZXRTdGFHcm91cEtleShkZXYsIGJyb2FkY2FzdCwgZW5jcnlNb2RlLAorICAgICAgICAgICAgLy8gICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgICAgICAgICAgaWYgKCAoa2V5SW5mby5rZXlMZW5ndGg9PTE2KSAmJiAod2QtPnN0YS5pYnNzV3BhMlBzaz09MSkgKQorICAgICAgICAgICAgey8qIElmIG5vdCBBRVMtQ0NNUCBhbmQgaWJzcyBuZXR3b3JrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXgsICAgICAgICAgICAgICAgIC8vIGtleSBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHU4X3QgKilicm9hZGNhc3QsICAgICAgICAgICAgICAgICAgLy8gZm9yIG9ubHkgMiBzdGF0aW9ucyBJQlNTIG5ldHdybCAoIEEyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KilrZXlJbmZvLm1hY0FkZHIsICAgLy8gZm9yIG11bHRpcGxlICggPiAyICkgc3RhdGlvbnMgSUJTUyBuZXR3b3JrICggQTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXRQZXJVc2VyS2V5KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVVNFUl9LRVlfR0ssICAgLy8gdXNlciBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBrZXkgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QgKilicm9hZGNhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfR0tfT0s7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVVNFUl9LRVlfR0ssICAgLy8gdXNlciBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8ga2V5IGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCAqKWJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKworICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfR0tfT0s7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAvKiBsZWdhY3kgV0VQICovCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJsZWdhY3kgV0VQIik7CisKKyAgICAgICAgICAgIGlmICgga2V5SW5mby5rZXlJbmRleCA+PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gNSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDY0Iik7CisKKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9XRVA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDEyOCIpOworCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUS0lQICovCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgSVYgc2luY2Ugc29tZSBBUCB3b3VsZCBmYWlsIGluIElWIGNoZWNrIGFuZCBkcm9wIG91ciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlICE9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9US0lQOworCisgICAgICAgICAgICAgICAgemZUa2lwSW5pdChrZXlJbmZvLmtleSwgKHU4X3QqKSB3ZC0+c3RhLmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLCBrZXlJbmZvLmluaXRJdik7CisgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4TWljS2V5W2tleUluZm8ua2V5SW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQUVTICovCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgSVYgc2luY2Ugc29tZSBBUCB3b3VsZCBmYWlsIGluIElWIGNoZWNrIGFuZCBkcm9wIG91ciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlICE9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYnJvYWRjYXN0IC0tID4gZ3JvdXAga2V5ICovCisgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgaW5pdGlhbGl6ZSB3aGVuIHNldCBvdXIgZGVmYXVsdCBrZXkgISAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYgPSAwOworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0FFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAyOSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDI1NiIpOworCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgNjQsIDEsIHdkLT5zdGEuZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgd2QtPnN0YS5ic3NpZCwgKHUzMl90KikgKCZrZXlJbmZvLmtleVsxNl0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90IGk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJrZXkgPSAiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBrZXlJbmZvLmtleUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMigiIiwga2V5SW5mby5rZXlbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9mb3IgV0VQIGRlZmF1bHQga2V5IDF+MyBhbmQgQVRPTSBwbGF0Zm9ybS0tQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICAgICAgICAgIHdkLT5hcC5iY0hhbEtleUlkeFt2YXBJZF0gPSBrZXlJbmZvLmtleUluZGV4OworICAgICAgICAgICAgICAgIHdkLT5hcC5iY0tleUluZGV4W3ZhcElkXSA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5rZXlJZCA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICB9CisKKwkJCWlmKGVuY3J5TW9kZSA9PSBaTV9US0lQKQorCQkJeworCQkJCWlmKHdkLT5US0lQX0dyb3VwX0tleUNoYW5naW5nID09IDB4MSkKKwkJCQl7CisJCQkJCXptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogQ2FuY2VsIE9sZCBUaW1lciAiKTsKKwkJCQkJemZUaW1lckNhbmNlbChkZXYsCVpNX0VWRU5UX1NLSVBfQ09VTlRFUk1FQVNVUkUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl6bV9kZWJ1Z19tc2cwKCJDb3VudGVybWVhc3VyZSA6IENyZWF0ZSBOZXcgVGltZXIgIik7CisJCQkJfQorCisJCQkJd2QtPlRLSVBfR3JvdXBfS2V5Q2hhbmdpbmcgPSAweDE7CisJCQkJemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfU0tJUF9DT1VOVEVSTUVBU1VSRSwgMTUwKTsKKwkJCX0KKworCisKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0IGtleSAqLworICAgICAgICAgICAgLy96ZkNvcmVTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUluZm8ua2V5SW5kZXgsIDAsCisgICAgICAgICAgICAvLyAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlLCB3ZC0+c3RhLmJzc2lkLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisKKyAgICAgICAgICAgIGlmICggZW5jcnlNb2RlID09IFpNX1RLSVAgfHwKKyAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID09IFpNX0FFUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldERlZmF1bHRLZXkoZGV2LCBrZXlJbmZvLmtleUluZGV4LCBlbmNyeU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3QqKSBrZXlJbmZvLmtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICBpZiAoIChrZXlJbmZvLmtleUxlbmd0aD09MTYpICYmICh3ZC0+c3RhLmlic3NXcGEyUHNrPT0xKSApCisgICAgICAgICAgICB7LyogSWYgbm90IEFFUy1DQ01QIGFuZCBpYnNzIG5ldHdvcmsgLCB1c2UgdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9HS19PSzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9HS19PSzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0s7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgICAgICB3ZC0+d3MuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXREZWZhdWx0S2V5KGRldiwga2V5SW5mby5rZXlJbmRleCwgZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIC8qIFNhdmUga2V5IGZvciBzb2Z0d2FyZSBXRVAgKi8KKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53ZXBLZXlba2V5SW5mby5rZXlJbmRleF0sIGtleUluZm8ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAga2V5SW5mby5rZXlMZW5ndGgpOworCisgICAgICAgICAgICAgICAgLyogVE9ETzogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHNhdmUgdGhlIFNXRW5jcnlNb2RlICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5TV0VuY3J5TW9kZVtrZXlJbmZvLmtleUluZGV4XSA9IGVuY3J5TW9kZTsKKworICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKy8vICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nID0gMTsKKyAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIFBTRVVETyB0ZXN0ICovCit1OF90IHpmaVdsYW5QU0VVRE9TZXRLZXkoemRldl90KiBkZXYsIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbykKK3sKKyAgICAvL3UxNl90ICBicm9hZGNhc3RbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgLy91MzJfdCoga2V5OworICAgIHU4X3QgICBtaWNLZXlbMTZdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoIChrZXlJbmZvLmtleUxlbmd0aCkKKyAgICB7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBrZXkgKi8KKyAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAwLCBaTV9XRVA2NCwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisJCSAgICAgICAgICBicmVhazsKKworICAgICAgIAljYXNlIDEzOgorICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9XRVAxMjg7CisgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBrZXkgKi8KKyAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAwLCBaTV9XRVAxMjgsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwgKHUzMl90Kikga2V5SW5mby5rZXkpOworICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAJY2FzZSAyOToKKyAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQga2V5ICovCisgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCA2NCwgMSwgWk1fV0VQMjU2LCAgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgNjQsIDAsIFpNX1dFUDI1NiwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisJCSAgICAgICAgICBicmVhazsKKworICAgICAgIAljYXNlIDE2OgorICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9BRVM7CisgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDAsIFpNX0FFUywgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCA2NCwgMCwgWk1fQUVTLCAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgCWNhc2UgMzI6CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGlmIChrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19DRU5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGJvYXJkY2FzdEFkZHJbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgICAgICAgICAgICAgdTE2X3QgQWRkcl9hW10gPSB7IDB4MDAwMCwgMHgwMDgwLCAweDA5MDF9OworICAgICAgICAgICAgICAgIHUxNl90IEFkZHJfYltdID0geyAweDAwMDAsIDB4MDA4MCwgMHgwOTAyfTsKKyAgICAgICAgICAgICAgICAvKiBDRU5DIHRlc3Q6IHVzZXIwLDEgYW5kIHVzZXIyIGZvciBib2FyZGNhc3QgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMCwgMSwgWk1fQ0VOQywgKHUxNl90ICopQWRkcl9hLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDAsIDAsIFpNX0NFTkMsICh1MTZfdCAqKUFkZHJfYSwgKHUzMl90Kikga2V5SW5mby5rZXkpOworCisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMSwgMSwgWk1fQ0VOQywgKHUxNl90ICopQWRkcl9iLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDEsIDAsIFpNX0NFTkMsICh1MTZfdCAqKUFkZHJfYiwgKHUzMl90Kikga2V5SW5mby5rZXkpOworCisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMiwgMSwgWk1fQ0VOQywgKHUxNl90ICopYm9hcmRjYXN0QWRkciwgKHUzMl90KikgKCZrZXlJbmZvLmtleVsxNl0pKTsKKyAgICAgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCAyLCAwLCBaTV9DRU5DLCAodTE2X3QgKilib2FyZGNhc3RBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisKKyAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIFBOIHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzBdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMV0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsyXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAxLCBaTV9US0lQLCAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIG1pY0tleSk7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgNjQsIDAsIFpNX1RLSVAsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwgKHUzMl90Kikga2V5SW5mby5rZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisKKyAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZpV2xhblNldFBvd2VyU2F2ZU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyNpZiAwCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5wb3dlclNhdmVNb2RlID0gbW9kZTsKKworICAgIC8qIHNlbmQgbnVsbCBkYXRhIHdpdGggUHdyQml0IHRvIGluZm9ybSBBUCAqLworICAgIGlmICggbW9kZSA+IFpNX1NUQV9QU19OT05FICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV2aWNlIGludG8gUFMgbW9kZSAqLworICAgICAgICB6ZlBTRGV2aWNlU2xlZXAoZGV2KTsKKyAgICB9CisjZW5kaWYKKworICAgIHpmUG93ZXJTYXZpbmdNZ3JTZXRNb2RlKGRldiwgbW9kZSk7Cit9CisKK3ZvaWQgemZpV2xhblNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPm1hY0FkZHJbMF0gPSBtYWNbMF07CisgICAgd2QtPm1hY0FkZHJbMV0gPSBtYWNbMV07CisgICAgd2QtPm1hY0FkZHJbMl0gPSBtYWNbMl07CisKKyAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIG1hYywgMCk7Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5V2xhbk1vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53bGFuTW9kZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBZGFwdGVyU3RhdGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5zdGF0ZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBdXRoZW50aWNhdGlvbk1vZGUoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpCit7CisgICAgdThfdCAgIGF1dGhNb2RlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBiV3JhcHBlciApCisgICAgeworICAgICAgICBhdXRoTW9kZSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9hdXRoTW9kZSA9IHdkLT5zdGEuYXV0aE1vZGU7CisgICAgICAgIGF1dGhNb2RlID0gd2QtPnN0YS5jdXJyZW50QXV0aE1vZGU7CisgICAgfQorCisgICAgcmV0dXJuIGF1dGhNb2RlOworfQorCit1OF90IHpmaVdsYW5RdWVyeVdlcFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiV3JhcHBlcikKK3sKKyAgICB1OF90IHdlcFN0YXR1czsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggYldyYXBwZXIgKQorICAgIHsKKyAgICAgICAgd2VwU3RhdHVzID0gd2QtPndzLndlcFN0YXR1czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2VwU3RhdHVzID0gd2QtPnN0YS53ZXBTdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHdlcFN0YXR1czsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBzc2lkLCB1OF90KiBwU3NpZExlbmd0aCkKK3sKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU3NpZExlbmd0aCA9IHdkLT5hcC5zc2lkTGVuWzBdOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5hcC5zc2lkWzBdLCB3ZC0+YXAuc3NpZExlblswXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcFNzaWRMZW5ndGggPSB3ZC0+YXAuc3NpZExlblt2YXBJZCArIDFdOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5hcC5zc2lkW3ZhcElkICsgMV0sIHdkLT5hcC5zc2lkTGVuW3ZhcElkICsgMV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwU3NpZExlbmd0aCA9IHdkLT5zdGEuc3NpZExlbjsKKyAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5zdGEuc3NpZCwgd2QtPnN0YS5zc2lkTGVuKTsKKyAgICB9Cit9CisKK3UxNl90IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5mcmFnVGhyZXNob2xkOworfQorCit1MTZfdCB6ZmlXbGFuUXVlcnlSdHNUaHJlc2hvbGQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5ydHNUaHJlc2hvbGQ7Cit9CisKK3UzMl90IHpmaVdsYW5RdWVyeUZyZXF1ZW5jeSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gKHdkLT5mcmVxdWVuY3kqMTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHpmaVdsYW5RdWVyeUN1cnJlbnRGcmVxdWVuY3kKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgLSAgIDAgOiBubyB2YWxpZGF0ZSBjdXJyZW50IGZyZXF1ZW5jeQorICogICAtICg+MCk6IGN1cnJlbnQgZnJlcXVlbmN5IGRlcGVuZCBvbiAicW1vZGUiCisgKiBJbnB1dDoKKyAqICAgLSBxbW9kZToKKyAqICAgICAgMDogcmV0dXJuIHZhbHVlIGRlcGVuZCBvbiB0aGUgc3VwcG9ydCBtb2RlLCB0aGlzCisgICAgICAgICAgIHFtb2RlIGlzIHVzZSB0byBzb2x2ZSB0aGUgYnVnICMzMTIyMworICogICAgICAxOiByZXR1cm4gdGhlIGFjdHVhbGx5IGN1cnJlbnQgZnJlcXVlbmN5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlXbGFuUXVlcnlDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2LCB1OF90IHFtb2RlKQoreworICAgIHUzMl90IGZyZXF1ZW5jeTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAocW1vZGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA+IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gemZDaEdldExhc3Q1R2h6Q2hhbm5lbChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAgIGZyZXF1ZW5jeSA9IHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgIH0KKworICAgIHJldHVybiAoZnJlcXVlbmN5KjEwMDApOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lBdHRyaWJ1dGUoemRldl90KiBkZXYsIHUzMl90IGZyZXEpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdThfdCAgaTsKKyAgICB1MTZfdCBmcmVxdWVuY3kgPSAodTE2X3QpIChmcmVxLzEwMDApOworICAgIHUzMl90IHJldCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxdWVuY3kgKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBCYW5kV2lkdGggIDA9PjIwICAxPT40MCAqLworLyogRXh0T2Zmc2V0ICAwPT4yMCAgMT0+aGlnaCBjb250cm9sIDQwICAgMz0+bG93IGNvbnRyb2wgNDAgKi8KK3ZvaWQgemZpV2xhblF1ZXJ5RnJlcXVlbmN5SFQoemRldl90KiBkZXYsIHUzMl90ICpiYW5kV2lkdGgsIHUzMl90ICpleHRPZmZzZXQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgKmJhbmRXaWR0aCA9IHdkLT5CYW5kV2lkdGg0MDsKKyAgICAqZXh0T2Zmc2V0ID0gd2QtPkV4dE9mZnNldDsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlDV01vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5jd20uY3dfbW9kZTsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5Q1dFbmFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5jd20uY3dfZW5hYmxlOworfQorCit2b2lkIHpmaVdsYW5RdWVyeUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCkKK3sKKyAgICB1OF90ICAgYWRkcls2XTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYWRkcik7CisgICAgemZNZW1vcnlDb3B5KGJzc2lkLCBhZGRyLCA2KTsKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QmVhY29uSW50ZXJ2YWwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5iZWFjb25JbnRlcnZhbDsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5UnhCZWFjb25Ub3RhbCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgd2QtPnN0YS5yeEJlYWNvblRvdGFsICs9IHdkLT5zdGEucnhCZWFjb25Db3VudDsKKworICAgIHJldHVybiB3ZC0+c3RhLnJ4QmVhY29uVG90YWw7Cit9CisKK3UxNl90IHpmaVdsYW5RdWVyeUF0aW1XaW5kb3coemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgYXRpbVdpbmRvdzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGF0aW1XaW5kb3cgPSB3ZC0+c3RhLmF0aW1XaW5kb3c7CisKKyAgICByZXR1cm4gYXRpbVdpbmRvdzsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlFbmNyeU1vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICByZXR1cm4gd2QtPmFwLmVuY3J5TW9kZVswXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB3ZC0+c3RhLmVuY3J5TW9kZTsKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5Q2FwYWJpbGl0eSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBjYXBhYmlsaXR5OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgY2FwYWJpbGl0eSA9IHdkLT5zdGEuY2FwYWJpbGl0eVswXSArCisgICAgICAgICAgICAgICAgICgoKHUxNl90KSB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0pIDw8IDgpOworCisgICAgcmV0dXJuIGNhcGFiaWxpdHk7CisKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QWlkKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLmFpZDsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgICBpLCBqPTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+YlJhdGUgJiAoMHgxIDw8IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUFycmF5W2pdID0gemcxMWJSYXRlVGJsW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwTGVuZ3RoID0gajsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlFeHRTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgICBpLCBqPTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IoIGk9MDsgaTw4OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+Z1JhdGUgJiAoMHgxIDw8IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUFycmF5W2pdID0gemcxMWdSYXRlVGJsW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmdSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwTGVuZ3RoID0gajsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlSc25JZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QqIHBMZW5ndGgpCit7CisgICAgdThfdCBsZW47CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBsZW4gPSB3ZC0+c3RhLnJzbkllWzFdICsgMjsKKyAgICB6Zk1lbW9yeUNvcHkoaWUsIHdkLT5zdGEucnNuSWUsIGxlbik7CisgICAgKnBMZW5ndGggPSBsZW47Cit9CisKK3ZvaWQgemZpV2xhblF1ZXJ5V3BhSWUoemRldl90KiBkZXYsIHU4X3QqIGllLCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgbGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbGVuID0gd2QtPnN0YS53cGFJZVsxXSArIDI7CisgICAgemZNZW1vcnlDb3B5KGllLCB3ZC0+c3RhLndwYUllLCBsZW4pOworICAgICpwTGVuZ3RoID0gbGVuOworCit9CisKK3U4X3QgemZpV2xhblF1ZXJ5TXVsdGljYXN0Q2lwaGVyQWxnbyh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2goIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlICkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTJQU0s6CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTI6CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEucnNuSWVbN10gPT0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1RLSVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0FFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQVBTSzoKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBOgorICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnJzbkllWzExXSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fVEtJUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fQUVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB3ZC0+c3RhLmVuY3J5TW9kZTsKKyAgICB9Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5SFRNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvLyAwOkxlZ2FuY3ksIDE6TgorICAgIHJldHVybiB3ZC0+c3RhLkVuYWJsZUhUOworfQorCit1OF90IHpmaVdsYW5RdWVyeUJhbmRXaWR0aDQwKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvLyAwOjIwTSwgMTo0ME0KKyAgICByZXR1cm4gd2QtPkJhbmRXaWR0aDQwOworfQorCit1MTZfdCB6ZmlXbGFuUXVlcnlSZWdpb25Db2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGU7Cit9Cit2b2lkIHpmaVdsYW5TZXRXcGFJZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QgTGVuZ3RoKQoreworICAgIHUxNl90IHZhcElkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICB7CisgICAgICAgIHZhcElkID0gemZ3R2V0VmFwSWQoZGV2KTsKKworICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YXBJZCsrOworCisgICAgICAgIHptX2Fzc2VydChMZW5ndGggPCBaTV9NQVhfV1BBSUVfU0laRSk7CisgICAgICAgIGlmIChMZW5ndGggPCBaTV9NQVhfV1BBSUVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmFwLndwYUxlblt2YXBJZF0gPSBMZW5ndGg7CisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPmFwLndwYUllW3ZhcElkXSwgaWUsIHdkLT5hcC53cGFMZW5bdmFwSWRdKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEud3BhTGVuID0gTGVuZ3RoOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgaWUsIHdkLT5zdGEud3BhTGVuKTsKKyAgICB9CisgICAgLy96ZmlXbGFuU2V0V3BhU3VwcG9ydChkZXYsIDEpOworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgIHsKKyAgICAgICAgd2QtPmFwLndwYVN1cHBvcnRbdmFwSWRdID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnN0YS53cGFTdXBwb3J0ID0gMTsKKyAgICB9CisKK30KKwordm9pZCB6ZmlXbGFuU2V0V3BhU3VwcG9ydCh6ZGV2X3QqIGRldiwgdThfdCBXcGFTdXBwb3J0KQoreworICAgIHUxNl90IHZhcElkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICB7CisgICAgICAgIHZhcElkID0gemZ3R2V0VmFwSWQoZGV2KTsKKworICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YXBJZCsrOworCisgICAgICAgIHdkLT5hcC53cGFTdXBwb3J0W3ZhcElkXSA9IFdwYVN1cHBvcnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEud3BhU3VwcG9ydCA9IFdwYVN1cHBvcnQ7CisgICAgfQorCit9CisKK3ZvaWQgemZpV2xhblNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBtb2RlOworICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworICAgIH0KKworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIndkLT5wcm90ZWN0aW9uTW9kZT0iLCB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSk7Cit9CisKK3ZvaWQgemZpV2xhblNldEJhc2ljUmF0ZSh6ZGV2X3QqIGRldiwgdThfdCBiUmF0ZVNldCwgdThfdCBnUmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCBuUmF0ZVNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+d3MuYlJhdGVCYXNpYyA9IGJSYXRlU2V0OworICAgIHdkLT53cy5nUmF0ZUJhc2ljID0gZ1JhdGVTZXQ7CisgICAgd2QtPndzLm5SYXRlQmFzaWMgPSBuUmF0ZVNldDsKK30KKwordm9pZCB6ZmlXbGFuU2V0QkdNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmJnTW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgemZpV2xhblNldHByZWFtYmxlVHlwZSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5wcmVhbWJsZVR5cGUgPSB0eXBlOworfQorCit1OF90IHpmaVdsYW5RdWVyeXByZWFtYmxlVHlwZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPndzLnByZWFtYmxlVHlwZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlQb3dlclNhdmVNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGU7Cit9CisKK3U4X3QgemZpV2xhblNldFBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdTE2X3QqIGJzc2lkLCB1OF90KiBwbWtpZCkKK3sKKyAgICB1MzJfdCAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCB6Zk1lbW9yeUlzRXF1YWwoKHU4X3QqKSB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0uYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KikgYnNzaWQsIDYpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbWF0Y2hlZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGkgPCB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50ICkKKyAgICB7CisgICAgICAgIC8qIG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgb25lICovCisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0ucG1raWQsIHBta2lkLCAxNik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICggaSA8IFpNX1BNS0lEX01BWF9CU1NfQ05UICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkWzBdID0gYnNzaWRbMF07CisgICAgICAgICAgICB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0uYnNzaWRbMV0gPSBic3NpZFsxXTsKKyAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkSW5mb1tpXS5ic3NpZFsyXSA9IGJzc2lkWzJdOworCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLnBta2lkLCBwbWtpZCwgMTYpOworICAgICAgICAgICAgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmaVdsYW5RdWVyeVBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MzJfdCBsZW4pCit7CisgICAgLy9zdHJ1Y3QgenNQbWtpZEluZm8qIHBQbWtpZEluZm8gPSAoIHN0cnVjdCB6c1Bta2lkSW5mbyogKSBidWY7CisgICAgdTMyX3QgIHNpemU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzaXplID0gc2l6ZW9mKHUzMl90KSArCisgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgKiBzaXplb2Yoc3RydWN0IHpzUG1raWRCc3NpZEluZm8pOworCisgICAgaWYgKCBsZW4gPCBzaXplICkKKyAgICB7CisgICAgICAgIHJldHVybiB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50OworICAgIH0KKworICAgIHpmTWVtb3J5Q29weShidWYsICh1OF90KikgJndkLT5zdGEucG1raWRJbmZvLCAodTE2X3QpIHNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZpV2xhblNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QpCit7CisgICAgc3RydWN0IHpzTXVsdGljYXN0QWRkciogcE1hY0xpc3QgPSAoc3RydWN0IHpzTXVsdGljYXN0QWRkciopIHBMaXN0OworICAgIHU4X3QgICBpOworICAgIHU4X3QgICBiQWxsTXVsdGljYXN0ID0gMDsKKyAgICAvL3UzMl90ICB2YWx1ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplID0gc2l6ZTsKKyAgICBmb3IoaT0wOyBpPHNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLm11bHRpY2FzdExpc3QubWFjQWRkcltpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgcE1hY0xpc3RbaV0uYWRkciwgNik7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLm9zUnhGaWx0ZXIgJiBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICkKKyAgICAgICAgYkFsbE11bHRpY2FzdCA9IDE7CisgICAgemZIcFNldE11bHRpY2FzdExpc3QoZGV2LCBzaXplLCBwTGlzdCwgYkFsbE11bHRpY2FzdCk7CisKK30KKwordm9pZCB6ZmlXbGFuUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleVR5cGUsIHU4X3Qga2V5SWQpCit7CisgICAgdTE2X3QgIGZha2VNYWNBZGRyWzNdID0gezAsIDAsIDB9OworICAgIHUzMl90ICBmYWtlS2V5WzRdID0gezAsIDAsIDAsIDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBrZXlUeXBlID09IDAgKQorICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIFdFUCBrZXkgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVtb3ZlIFdFUCBrZXkiKTsKKyAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMCwKKyAgICAgICAgICAgICAgICAgWk1fTk9fV0VQLCBmYWtlTWFjQWRkciwgZmFrZUtleSk7CisgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgIH0KKyAgICBlbHNlIGlmICgga2V5VHlwZSA9PSAxICkKKyAgICB7CisgICAgICAgIC8qIHJlbW92ZSBwYWlyd2lzZSBrZXkgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVtb3ZlIHBhaXJ3aXNlIGtleSIpOworICAgICAgICB6ZkhwUmVtb3ZlS2V5KGRldiwgWk1fVVNFUl9LRVlfUEspOworICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIGdyb3VwIGtleSAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJyZW1vdmUgZ3JvdXAga2V5Iik7CisgICAgICAgIHpmSHBSZW1vdmVLZXkoZGV2LCBaTV9VU0VSX0tFWV9HSyk7CisgICAgfQorfQorCisKK3ZvaWQgemZpV2xhblF1ZXJ5UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUqIHBFbnRyeSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKSBwRW50cnksICh1OF90KikgJndkLT5yZWd1bGF0aW9uVGFibGUsCisgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUpKTsKK30KKworLyogcGFyYW1ldGVyICJ0aW1lIiBpcyBzcGVjaWZpZWQgaW4gbXMgKi8KK3ZvaWQgemZpV2xhblNldFNjYW5UaW1lclBlckNoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IHRpbWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fZGVidWdfbXNnMSgic2NhbiB0aW1lIChtcykgPSAiLCB0aW1lKTsKKworICAgIHdkLT5zdGEuYWN0aXZlc2NhblRpY2tQZXJDaGFubmVsID0gdGltZSAvIFpNX01TX1BFUl9USUNLOworfQorCit2b2lkIHpmaVdsYW5TZXRBdXRvUmVjb25uZWN0KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmJBdXRvUmVjb25uZWN0ID0gZW5hYmxlOworICAgIC8vd2QtPnN0YS5iQXV0b1JlY29ubmVjdEVuYWJsZWQgPSBlbmFibGU7Cit9CisKK3ZvaWQgemZpV2xhblNldFN0YVdtZSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUsIHU4X3QgdWFwc2RJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5zdGFXbWVFbmFibGVkID0gZW5hYmxlICYgMHgzOworICAgIGlmICgoZW5hYmxlICYgMHgyKSAhPSAwKQorICAgIHsKKyAgICAgICAgd2QtPndzLnN0YVdtZVFvc0luZm8gPSB1YXBzZEluZm8gJiAweDZmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+d3Muc3RhV21lUW9zSW5mbyA9IDA7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRBcFdtZSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmFwV21lRW5hYmxlZCA9IGVuYWJsZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnl3bWVFbmFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53cy5zdGFXbWVFbmFibGVkOworfQorCit2b2lkIHpmaVdsYW5TZXRQcm9iaW5nSGlkZGVuU3NpZCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCBzc2lkTGVuLAorICAgIHUxNl90IGVudHJ5KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICBpZiAoKHNzaWRMZW4gPD0gMzIpICYmIChlbnRyeSA8IFpNX01BWF9QUk9CRV9ISURERU5fU1NJRF9TSVpFKSkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbZW50cnldLnNzaWRMZW4gPSBzc2lkTGVuOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPndzLnByb2JpbmdTc2lkTGlzdFtlbnRyeV0uc3NpZCwgc3NpZCwgc3NpZExlbik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmaVdsYW5TZXREaXNhYmxlUHJvYmluZ1dpdGhTc2lkKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5kaXNhYmxlUHJvYmluZ1dpdGhTc2lkID0gbW9kZTsKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZmlXbGFuU2V0RHJvcFVuZW5jcnlwdGVkUGFja2V0cyh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmRyb3BVbmVuY3J5cHRlZFBrdHMgPSBlbmFibGU7Cit9CisKK3ZvaWQgemZpV2xhblNldFN0YVJ4U2VjdXJpdHlDaGVja0NiKHpkZXZfdCogZGV2LCB6ZnBTdGFSeFNlY3VyaXR5Q2hlY2tDYiBwU3RhUnhTZWN1cml0eUNoZWNrQ2IpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5wU3RhUnhTZWN1cml0eUNoZWNrQ2IgPSBwU3RhUnhTZWN1cml0eUNoZWNrQ2I7Cit9CisKK3ZvaWQgemZpV2xhblNldElCU1NKb2luT25seSh6ZGV2X3QqIGRldiwgdThfdCBqb2luT25seSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+d3MuaWJzc0pvaW5Pbmx5ID0gam9pbk9ubHk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlDb25maWdXZHNQb3J0ICAgICAgICAgICAgKi8KKy8qICAgICAgQ29uZmlndXJlIFdEUyBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHdkc1BvcnRJZCA6IFdEUyBwb3J0IElELCBzdGFydCBmcm9tIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmbGFnIDogMD0+ZGlzYWJsZSBXRFMgcG9ydCwgMT0+ZW5hYmxlIFdEUyBwb3J0ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgd2RzQWRkciA6IFdEUyBuZWlnaGJvciBNQUMgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVuY1R5cGUgOiBlbmNyeXB0aW9uIHR5cGUgZm9yIFdEUyBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB3ZHNLZXkgOiBlbmNyeXB0aW9uIGtleSBmb3IgV0RTIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpQ29uZmlnV2RzUG9ydCh6ZGV2X3QqIGRldiwgdThfdCB3ZHNQb3J0SWQsIHUxNl90IGZsYWcsIHUxNl90KiB3ZHNBZGRyLAorICAgICAgICB1MTZfdCBlbmNUeXBlLCB1MzJfdCogd2RzS2V5KQoreworICAgIHUxNl90IGFkZHJbM107CisgICAgdTMyX3Qga2V5WzRdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkc1BvcnRJZCA+IFpNX01BWF9XRFNfU1VQUE9SVCkKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9FUlJfV0RTX1BPUlRfSUQ7CisgICAgfQorCisgICAgaWYgKGZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIEVuYWJsZSBXRFMgcG9ydCAqLworICAgICAgICB3ZC0+YXAud2RzLm1hY0FkZHJbd2RzUG9ydElkXVswXSA9IHdkc0FkZHJbMF07CisgICAgICAgIHdkLT5hcC53ZHMubWFjQWRkclt3ZHNQb3J0SWRdWzFdID0gd2RzQWRkclsxXTsKKyAgICAgICAgd2QtPmFwLndkcy5tYWNBZGRyW3dkc1BvcnRJZF1bMl0gPSB3ZHNBZGRyWzJdOworCisgICAgICAgIHdkLT5hcC53ZHMud2RzQml0bWFwIHw9ICgxIDw8IHdkc1BvcnRJZCk7CisgICAgICAgIHdkLT5hcC53ZHMuZW5jcnlNb2RlW3dkc1BvcnRJZF0gPSAodThfdCkgZW5jVHlwZTsKKworICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCAxMCtaTV9NQVhfV0RTX1NVUFBPUlQsIDAsICh1OF90KSBlbmNUeXBlLCB3ZHNBZGRyLCB3ZHNLZXkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBEaXNhYmxlIFdEUyBwb3J0ICovCisgICAgICAgIGFkZHJbMF0gPSBhZGRyWzFdID0gYWRkclsyXSA9IDA7CisgICAgICAgIGtleVswXSA9IGtleVsxXSA9IGtleVsyXSA9IGtleVszXSA9IDA7CisgICAgICAgIHdkLT5hcC53ZHMud2RzQml0bWFwICY9ICh+KDEgPDwgd2RzUG9ydElkKSk7CisgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDEwK1pNX01BWF9XRFNfU1VQUE9SVCwgMCwgWk1fTk9fV0VQLCBhZGRyLCBrZXkpOworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBDRU5DICovCit2b2lkIHpmaVdsYW5RdWVyeUdTTih6ZGV2X3QqIGRldiwgdThfdCAqZ3NuLCB1MTZfdCB2YXBJZCkKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MzJfdCB0eGl2WzRdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIGNvbnZlcnQgbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuIGZvciAzMiBiaXRzICovCisgICAgdHhpdlszXSA9IHdkLT5hcC50eGl2W3ZhcElkXVswXTsKKyAgICB0eGl2WzJdID0gd2QtPmFwLnR4aXZbdmFwSWRdWzFdOworICAgIHR4aXZbMV0gPSB3ZC0+YXAudHhpdlt2YXBJZF1bMl07CisgICAgdHhpdlswXSA9IHdkLT5hcC50eGl2W3ZhcElkXVszXTsKKworICAgIHpmTWVtb3J5Q29weShnc24sICh1OF90Kil0eGl2LCAxNik7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworLy9DV1lhbmcoKykKK3ZvaWQgemZpV2xhblF1ZXJ5U2lnbmFsSW5mbyh6ZGV2X3QqIGRldiwgdThfdCAqYnVmZmVyKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qQ2hhbmdlIFNpZ25hbCBTdHJlbmd0aC9RdWFsaXR5IFZhbHVlIHRvIEh1bWFuIFNlbnNlIEhlcmUqLworCisgICAgYnVmZmVyWzBdID0gd2QtPlNpZ25hbFN0cmVuZ3RoOworICAgIGJ1ZmZlclsxXSA9IHdkLT5TaWduYWxRdWFsaXR5OworfQorCisvKiBPUy1YUCAqLwordTE2X3QgemZpU3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQoreworICAgIHJldHVybiAgemZTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBmcmFtZVR5cGUpOworfQorCisvKiB6ZmlEZWJ1Z0NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgY21kICAgICAgIHZhbHVlLWRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAwICAgICAgIHNjaGVkdWxlIHRpbWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAxICAgICAgIGNhbmNlbCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDIgICAgICAgY2xlYXIgdGltZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDMgICAgICAgdGVzdCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgNiAgICAgICBjaGVja3N1bSB0ZXN0ICAgICAwLzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgNyAgICAgICBlbmFibGVQcm90ZWN0aW9uTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDggICAgICAgcnggcGFja2V0IGNvbnRlbnQgZHVtcCAgICAwLzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordTMyX3QgemZpRGVidWdDbWQoemRldl90KiBkZXYsIHUzMl90IGNtZCwgdTMyX3QgdmFsdWUpCit7CisgICAgdTE2X3QgZXZlbnQ7CisgICAgdTMyX3QgdGljazsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCBjbWQgPT0gMCApCisgICAgeyAgIC8qIHNjaGVkdWxlIHRpbWVyICovCisgICAgICAgIGV2ZW50ID0gKHUxNl90KSAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZik7CisgICAgICAgIHRpY2sgPSB2YWx1ZSAmIDB4ZmZmZjsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgZXZlbnQsIHRpY2spOworICAgIH0KKyAgICBlbHNlIGlmICggY21kID09IDEgKQorICAgIHsgICAvKiBjYW5jZWwgdGltZXIgKi8KKyAgICAgICAgZXZlbnQgPSAodTE2X3QpICh2YWx1ZSAmIDB4ZmZmZik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBldmVudCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gMiApCisgICAgeyAgIC8qIGNsZWFyIHRpbWVyICovCisgICAgICAgIHpmVGltZXJDbGVhcihkZXYpOworICAgIH0KKyAgICBlbHNlIGlmICggY21kID09IDMgKQorICAgIHsgICAvKiB0ZXN0IHRpbWVyICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDEsICA1MDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCAyLCAxMDAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgMywgMTAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDQsIDEwMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA1LCAxNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgNiwgMjAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDcsIDIyMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA2LCAyNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgOCwgMjgwMCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gNCkKKyAgICB7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDEsICA1MDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCAyLCAxMDAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgMywgMTAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDQsIDEwMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA1LCAxNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgNiwgMjAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDcsIDIyMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA2LCAyNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgOCwgMjgwMCk7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCAxKTsKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIDMpOworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgNik7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gNSApCisgICAgeworICAgICAgICB3ZC0+c3RhLmtleUlkID0gKHU4X3QpIHZhbHVlOworICAgIH0KKwllbHNlIGlmICggY21kID09IDYgKQorCXsKKwkgICAgLyogMDogbm9ybWFsICAgIDE6IGFsd2F5cyBzZXQgVENQL1VEUCBjaGVja3N1bSB6ZXJvICovCisgICAgICAgIHdkLT5jaGVja3N1bVRlc3QgPSB2YWx1ZTsKKwl9CisJZWxzZSBpZiAoIGNtZCA9PSA3ICkKKwl7CisgICAgICAgIHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZSA9IHZhbHVlOworICAgCSAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJ3ZC0+ZW5hYmxlUHJvdGVjdGlvbk1vZGU9Iiwgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlKTsKKwl9CisJZWxzZSBpZiAoIGNtZCA9PSA4ICkKKwl7CisgICAgICAgIC8qIHJ4IHBhY2tldCBjb250ZW50IGR1bXAgKi8KKyAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cnhQYWNrZXREdW1wID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5yeFBhY2tldER1bXAgPSAwOworICAgICAgICB9CisJfQorCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQwordThfdCB6ZmlXbGFuU2V0Q2VuY1BhaXJ3aXNlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleWlkLCB1MzJfdCAqdHhpdiwgdTMyX3QgKnJ4aXYsCisgICAgICAgIHU4X3QgKmtleSwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1OF90IGNlbmNLZXlbMzJdOworICAgIHU4X3QgaTsKKyAgICB1MTZfdCBtYWNBZGRyWzNdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaV0gPSBrZXlbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaSArIDE2XSA9IG1pY1tpXTsKKyAgICBrZXlJbmZvLmtleSA9IGNlbmNLZXk7CisgICAga2V5SW5mby5rZXlMZW5ndGggPSAzMjsKKyAgICBrZXlJbmZvLmtleUluZGV4ID0ga2V5aWQ7CisgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQ0VOQyB8IFpNX0tFWV9GTEFHX1BLOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIG1hY0FkZHJbaV0gPSB3ZC0+c3RhLmJzc2lkW2ldOworICAgIGtleUluZm8ubWFjQWRkciA9IG1hY0FkZHI7CisKKyAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgLy93ZC0+c3RhLnR4aXZbMF0gPSB0eGl2WzBdOworICAgIC8vd2QtPnN0YS50eGl2WzFdID0gdHhpdlsxXTsKKyAgICAvL3dkLT5zdGEudHhpdlsyXSA9IHR4aXZbMl07CisgICAgLy93ZC0+c3RhLnR4aXZbM10gPSB0eGl2WzNdOworICAgIC8vCisgICAgLy93ZC0+c3RhLnJ4aXZbMF0gPSByeGl2WzBdOworICAgIC8vd2QtPnN0YS5yeGl2WzFdID0gcnhpdlsxXTsKKyAgICAvL3dkLT5zdGEucnhpdlsyXSA9IHJ4aXZbMl07CisgICAgLy93ZC0+c3RhLnJ4aXZbM10gPSByeGl2WzNdOworCisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZpV2xhblNldENlbmNHcm91cEtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlpZCwgdTMyX3QgKnJ4aXYsCisgICAgICAgIHU4X3QgKmtleSwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1OF90IGNlbmNLZXlbMzJdOworICAgIHU4X3QgaTsKKyAgICB1MTZfdCBtYWNBZGRyWzZdID0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaV0gPSBrZXlbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaSArIDE2XSA9IG1pY1tpXTsKKyAgICBrZXlJbmZvLmtleSA9IGNlbmNLZXk7CisgICAga2V5SW5mby5rZXlMZW5ndGggPSAzMjsKKyAgICBrZXlJbmZvLmtleUluZGV4ID0ga2V5aWQ7CisgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQ0VOQyB8IFpNX0tFWV9GTEFHX0dLOworICAgIGtleUluZm8udmFwSWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGtleUluZm8udmFwQWRkcltpXSA9IHdkLT5tYWNBZGRyW2ldOworICAgIGtleUluZm8ubWFjQWRkciA9IG1hY0FkZHI7CisKKyAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgd2QtPnN0YS5yeGl2R0tbMF0gPSAoKHJ4aXZbM10gPj4gMjQpICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbM10gPj4gMTYpICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbM10gPj4gOCkgJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICArICgocnhpdlszXSAmIDB4RkYpIDw8IDI0KTsKKyAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9ICgocnhpdlsyXSA+PiAyNCkgJiAweEZGKQorICAgICAgICAgICAgICAgICAgICAgICsgKCgocnhpdlsyXSA+PiAxNikgJiAweEZGKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICsgKCgocnhpdlsyXSA+PiA4KSAmIDB4RkYpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICsgKChyeGl2WzJdICYgMHhGRikgPDwgMjQpOworICAgIHdkLT5zdGEucnhpdkdLWzJdID0gKChyeGl2WzFdID4+IDI0KSAmIDB4RkYpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKChyeGl2WzFdID4+IDE2KSAmIDB4RkYpIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKChyeGl2WzFdID4+IDgpICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKHJ4aXZbMV0gJiAweEZGKSA8PCAyNCk7CisgICAgd2QtPnN0YS5yeGl2R0tbM10gPSAoKHJ4aXZbMF0gPj4gMjQpICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbMF0gPj4gMTYpICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbMF0gPj4gOCkgJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICArICgocnhpdlswXSAmIDB4RkYpIDw8IDI0KTsKKworICAgIHdkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfQ0VOQzsKKyAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9DRU5DOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCit1OF90IHpmaVdsYW5TZXREb3QxMURNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgdThfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iODAyXzExRCA9IG1vZGU7CisgICAgaWYgKG1vZGUpIC8vRW5hYmxlIDgwMi4xMWQKKyAgICB7CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IE5PX0VOVU1SRDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgfD0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFOworICAgIH0KKyAgICBlbHNlIC8vRGlzYWJsZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgJj0gflpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZmlXbGFuU2V0RG90MTFIREZTTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gRW5hYmxlIDgwMi4xMWggREZTIik7CisKKyAgICAvLyBUT0RPIDogREZTIEVuYWJsZSBpbiA1MjUwIHRvIDUzNTAgTUh6IGFuZCA1NDcwIHRvIDU3MjUgTUh6IC4KKyAgICAvL2lmICggQWRhcHRlci0+WkQ4MDIxMUhTdXBwb3J0ICYmCisgICAgLy8gICBBZGFwdGVyLT5DYXJkU2V0dGluZy5OZXR3b3JrVHlwZUluVXNlID09IE5kaXM4MDJfMTFPRkRNNSAmJgorICAgIC8vICAgKChDaGFubmVsTm8gPj01MiAmJiBDaGFubmVsTm8gPD0gNjQpCXx8CQkJCS8vNTI1MH41MzUwIE1IWgorICAgIC8vICAgIChDaGFubmVsTm8gPj0xMDAgJiYgQ2hhbm5lbE5vIDw9IDE0MCkpKSAJCQkvLzU0NzB+NTcyNSBNSFoKKyAgICAvL3sKKyAgICAvLyAgIEFkYXB0ZXItPlpEODAyMTFIU2V0dGluZy5ERlNFbmFibGU9VFJVRTsKKyAgICAvL30KKyAgICAvL2Vsc2UKKyAgICAvL3sKKyAgICAvLyAgIEFkYXB0ZXItPlpEODAyMTFIU2V0dGluZy5ERlNFbmFibGU9RkFMU0U7CisgICAgLy99CisKKyAgICB3ZC0+c3RhLkRGU0VuYWJsZSA9IG1vZGU7CisgICAgaWYgKG1vZGUpCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKyAgICBlbHNlCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmPSAoflpNX0JJVF8wKTsKKworICAgIHJldHVybiAwOworfQorCit1OF90IHpmaVdsYW5TZXREb3QxMUhUUENNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy8gVE9ETyA6IFRQQyBFbmFibGUgaW4gNTE1MH41MzUwIE1IeiBhbmQgNTQ3MH41NzI1TUh6LgorICAgIC8vaWYgKCBBZGFwdGVyLT5aRDgwMjExSFN1cHBvcnQgJiYKKyAgICAvLyAgIEFkYXB0ZXItPkNhcmRTZXR0aW5nLk5ldHdvcmtUeXBlSW5Vc2UgPT0gTmRpczgwMl8xMU9GRE01ICYmCisgICAgLy8gICAoKENoYW5uZWxObyA9PSAzNiB8fCBDaGFubmVsTm8gPT0gNDAgfHwgQ2hhbm5lbE5vID09IDQ0IHx8IENoYW5uZWxObyA9PSA0OCkgfHwJLy81MTUwfjUyNTAgTUhaICwgTm90IEphcGFuCisgICAgLy8gICAgKENoYW5uZWxObyA+PTUyICYmIENoYW5uZWxObyA8PSA2NCkgfHwJCQkJLy81MjUwfjUzNTAgTUhaCisgICAgLy8gICAgKENoYW5uZWxObyA+PTEwMCAmJiBDaGFubmVsTm8gPD0gMTQwKSkpIAkJCS8vNTQ3MH41NzI1IE1IWgorICAgIC8veworICAgIC8vICAgQWRhcHRlci0+WkQ4MDIxMUhTZXR0aW5nLlRQQ0VuYWJsZT1UUlVFOworICAgIC8vfQorICAgIC8vZWxzZQorICAgIC8veworICAgIC8vICAgQWRhcHRlci0+WkQ4MDIxMUhTZXR0aW5nLlRQQ0VuYWJsZT1GQUxTRTsKKyAgICAvL30KKworICAgIHdkLT5zdGEuVFBDRW5hYmxlID0gbW9kZTsKKyAgICBpZiAobW9kZSkKKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzFdIHw9IFpNX0JJVF8wOworICAgIGVsc2UKKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzFdICY9ICh+Wk1fQklUXzApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZpV2xhblNldEFuaU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+YW5pRW5hYmxlID0gbW9kZTsKKyAgICBpZiAobW9kZSkKKyAgICAgICAgemZIcEFuaUF0dGFjaChkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9PU19MSU5VWF9GVU5DCit2b2lkIHpmaVdsYW5TaG93VGFsbHkoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVW5kZXJydW5DbnQgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1VuZGVycnVuQ250KTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19Ub3RhbFJ4RnJtICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfVG90YWxSeEZybSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfQ1JDMzJDbnQgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X0NSQzMyQ250KTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19DUkMxNkNudCAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0RlY3J5cEVycl9VTkkgID0gIiwgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfVU5JKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19SeEZJRk9PdmVycnVuICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhGSUZPT3ZlcnJ1bik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfRGVjcnlwRXJyX011bCAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9NdWwpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1JldHJ5Q250ICAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SZXRyeUNudCk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVG90YWxUeEZybSAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1RvdGFsVHhGcm0pOworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkh3X1J4VGltZU91dCAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFRpbWVPdXQpOworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlR4X01QRFUgICAgICAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5UeF9NUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJCQV9GYWlsICAgICAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuQkFfRmFpbCk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVHhfQU1QRFUgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1R4X0FNUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19UeF9NUERVICAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfVHhfTVBEVSk7CisKKyAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeE1QRFUgICAgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEcm9wTVBEVSAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeERyb3BNUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeERlbE1QRFUgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1J4RGVsTVBEVSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlNaXNjRXJyb3IgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeU1pc2NFcnJvcik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlYUkVycm9yICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeVhSRXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5T0ZETUVycm9yICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlPRkRNRXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5Q0NLRXJyb3IgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlDQ0tFcnJvcik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlIVEVycm9yICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeUhURXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5VG90YWxDb3VudCA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlUb3RhbENvdW50KTsKKworICAgIGlmICghKCh3ZC0+Y29tbVRhbGx5LlR4X01QRFUgPT0gMCkgJiYgKHdkLT5jb21tVGFsbHkuQkFfRmFpbCA9PSAwKSkpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2dfcCgiQkEgRmFpbCBSYXRpbyglKSAgPSAiLCB3ZC0+Y29tbVRhbGx5LkJBX0ZhaWwgKiAxMDAsCisgICAgICAgICAgICAgICAgKHdkLT5jb21tVGFsbHkuQkFfRmFpbCArIHdkLT5jb21tVGFsbHkuVHhfTVBEVSkpOworICAgIH0KKworICAgIGlmICghKCh3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPT0gMCkgJiYgKHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUgPT0gMCkpKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnX3AoIkF2ZyBBZ2cgTnVtYmVyICAgID0gIiwKKyAgICAgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUsIHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUpOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkIHpmaVdsYW5TZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2LCB1OF90IHBvd2VyMiwgdThfdCBwb3dlcjUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPm1heFR4UG93ZXIyID0gcG93ZXIyOworICAgIHdkLT5tYXhUeFBvd2VyNSA9IHBvd2VyNTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5RdWVyeU1heFR4UG93ZXIoemRldl90KiBkZXYsIHU4X3QgKnBvd2VyMiwgdThfdCAqcG93ZXI1KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICpwb3dlcjIgPSB3ZC0+bWF4VHhQb3dlcjI7CisgICAgKnBvd2VyNSA9IHdkLT5tYXhUeFBvd2VyNTsKK30KKwordm9pZCB6ZmlXbGFuU2V0Q29ubmVjdE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+Y29ubmVjdE1vZGUgPSBtb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldFN1cHBvcnRNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdXBwb3J0TW9kZSA9IG1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0QWRob2NNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5hZGhvY01vZGUgPSBtb2RlOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlBZGhvY01vZGUoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpCit7CisgICAgdTMyX3QgYWRob2NNb2RlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBiV3JhcHBlciApCisgICAgeworICAgICAgICBhZGhvY01vZGUgPSB3ZC0+d3MuYWRob2NNb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhZGhvY01vZGUgPSB3ZC0+d2ZjLmJJYnNzR01vZGU7CisgICAgfQorCisgICAgcmV0dXJuIGFkaG9jTW9kZTsKK30KKworCit1OF90IHpmaVdsYW5TZXRDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUsIHU4X3QgbGVuZ3RoKQoreworICAgIHU4X3QgYnVmWzVdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChsZW5ndGggPT0gNCkKKyAgICB7CisgICAgICAgIGJ1ZlsyXSA9IHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IGNvdW50cnlJc29OYW1lWzJdOworICAgICAgICBidWZbM10gPSB3ZC0+d3MuY291bnRyeUlzb05hbWVbMV0gPSBjb3VudHJ5SXNvTmFtZVsxXTsKKyAgICAgICAgYnVmWzRdID0gd2QtPndzLmNvdW50cnlJc29OYW1lWzJdID0gY291bnRyeUlzb05hbWVbMF07CisgICAgfQorICAgIGVsc2UgaWYgKGxlbmd0aCA9PSAzKQorICAgIHsKKyAgICAgICAgYnVmWzJdID0gd2QtPndzLmNvdW50cnlJc29OYW1lWzBdID0gY291bnRyeUlzb05hbWVbMV07CisgICAgICAgIGJ1ZlszXSA9IHdkLT53cy5jb3VudHJ5SXNvTmFtZVsxXSA9IGNvdW50cnlJc29OYW1lWzBdOworICAgICAgICBidWZbNF0gPSB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21JU08oZGV2LCBidWYsIGxlbmd0aCk7Cit9CisKKworY29uc3QgY2hhciogemZpV2xhblF1ZXJ5Q291bnRyeUlzb05hbWUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53cy5jb3VudHJ5SXNvTmFtZTsKK30KKworCisKK3ZvaWQgemZpV2xhblNldFJlZ3VsYXRvcnkoemRldl90KiBkZXYsIHU4X3QgQ0NTLCB1MTZfdCBDb2RlLCB1OF90IGJmaXJzdENoYW5uZWwpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChDQ1MpCisgICAgeworICAgICAgICAvKiBSZXNldCBSZWd1bGF0aW9uIFRhYmxlIGJ5IENvdW50cnkgQ29kZSAqLworICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUNvdW50cnkoZGV2LCBDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVzZXQgUmVndWxhdGlvbiBUYWJsZSBieSBSZWdpb24gQ29kZSAqLworICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBDb2RlKTsKKyAgICB9CisKKyAgICBpZiAoYmZpcnN0Q2hhbm5lbCkgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsIE5VTEwpOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3koZGV2LCB3ZC0+ZnJlcXVlbmN5KTsKKyAgICB9Cit9CisKKworY29uc3QgY2hhciogemZpSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpCit7CisgICAgcmV0dXJuIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoZGV2LCByZWdpb25Db2RlKTsKK30KKwordTE2X3QgemZpV2xhbkNoYW5uZWxUb0ZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdThfdCBjaGFubmVsKQoreworICAgIHJldHVybiB6ZkNoTnVtVG9GcmVxKGRldiwgY2hhbm5lbCwgMCk7Cit9CisKK3U4X3QgemZpV2xhbkZyZXF1ZW5jeVRvQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1OF90IGlzNUdCYW5kID0gMDsKKworICAgIHJldHVybiB6ZkNoRnJlcVRvTnVtKGZyZXEsICZpczVHQmFuZCk7Cit9CisKK3ZvaWQgemZpV2xhbkRpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKQoreworICAgIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbChkZXYsIGRpc2FibGVGbGFnKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZpV2xhblNldExFREN0cmxQYXJhbSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlLCB1OF90IGZsYWcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsVHlwZSA9IHR5cGU7CisgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZ0Zyb21SZWcgID0gZmxhZzsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5FbmFibGVMZWFwQ29uZmlnKHpkZXZfdCogZGV2LCB1OF90IGxlYXBFbmFibGVkKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEubGVhcEVuYWJsZWQgPSBsZWFwRW5hYmxlZDsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5SHdDYXBhYmlsaXR5KHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiB6ZkhwQ2FwYWJpbGl0eShkZXYpOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlSZWNlaXZlZFBhY2tldCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN0YS5SZWNlaXZlZFBrdFJhdGVQZXJTZWNvbmQ7Cit9CisKK3ZvaWQgemZpV2xhbkNoZWNrU1dFbmNyeXB0aW9uKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKQorICAgIHsKKyAgICAgICAgemZIcFNXRGVjcnlwdChkZXYsIDEpOworICAgIH0KK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QWxsb3dDaGFubmVscyh6ZGV2X3QqIGRldiwgdTE2X3QgKmNoYW5uZWxzKQoreworICAgIHUxNl90IGlpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpaSsrKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHNbaWldID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaWldLmNoYW5uZWw7CisgICAgfQorCisgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OworfQorCit2b2lkIHpmaVdsYW5TZXREeW5hbWljU0lGU1BhcmFtKHpkZXZfdCogZGV2LCB1OF90IHZhbCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPSB2YWw7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJ3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPSAiLCB3ZC0+ZHluYW1pY1NJRlNFbmFibGUpCit9CisKK3UxNl90IHpmaVdsYW5HZXRNdWx0aWNhc3RBZGRyZXNzQ291bnQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplOworfQorCit2b2lkIHpmaVdsYW5HZXRNdWx0aWNhc3RMaXN0KHpkZXZfdCogZGV2LCB1OF90KiBwTUNMaXN0KQoreworICAgIHN0cnVjdCB6c011bHRpY2FzdEFkZHIqIHBNYWNMaXN0ID0gKHN0cnVjdCB6c011bHRpY2FzdEFkZHIqKSBwTUNMaXN0OworICAgIHU4X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoIGk9MDsgaTx3ZC0+c3RhLm11bHRpY2FzdExpc3Quc2l6ZTsgaSsrICkKKyAgICB7CisgICAgICAgIHpmTWVtb3J5Q29weShwTWFjTGlzdFtpXS5hZGRyLCB3ZC0+c3RhLm11bHRpY2FzdExpc3QubWFjQWRkcltpXS5hZGRyLCA2KTsKKyAgICB9Cit9CisKK3ZvaWQgemZpV2xhblNldFBhY2tldEZpbHRlcih6ZGV2X3QqIGRldiwgdTMyX3QgUGFja2V0RmlsdGVyKQoreworICAgIHU4X3QgIGJBbGxNdWx0aWNhc3QgPSAwOworICAgIHUzMl90IG9sZEZpbHRlcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG9sZEZpbHRlciA9IHdkLT5zdGEub3NSeEZpbHRlcjsKKworICAgIHdkLT5zdGEub3NSeEZpbHRlciA9IFBhY2tldEZpbHRlcjsKKworICAgIGlmICgob2xkRmlsdGVyICYgWk1fUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCkgIT0KKyAgICAgICAgKHdkLT5zdGEub3NSeEZpbHRlciAmIFpNX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QpKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9zUnhGaWx0ZXIgJiBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICkKKyAgICAgICAgICAgIGJBbGxNdWx0aWNhc3QgPSAxOworICAgICAgICB6ZkhwU2V0TXVsdGljYXN0TGlzdChkZXYsIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCopd2QtPnN0YS5tdWx0aWNhc3RMaXN0Lm1hY0FkZHIsIGJBbGxNdWx0aWNhc3QpOworICAgIH0KK30KKwordThfdCB6ZmlDb21wYXJlV2l0aE11bHRpY2FzdExpc3RBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0TWFjQWRkcikKK3sKKyAgICB1OF90IGk7CisgICAgdThfdCBiSXNJbk1DTGlzdEFkZHIgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yICggaT0wOyBpPHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplOyBpKysgKQorICAgIHsKKyAgICAJaWYgKCB6ZndNZW1vcnlJc0VxdWFsKCh1OF90Kilkc3RNYWNBZGRyLCAodThfdCopd2QtPnN0YS5tdWx0aWNhc3RMaXN0Lm1hY0FkZHJbaV0uYWRkciwgNikgKQorICAgIAl7CisgICAgICAgICAgICBiSXNJbk1DTGlzdEFkZHIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgCX0KKyAgICB9CisKKyAgICByZXR1cm4gYklzSW5NQ0xpc3RBZGRyOworfQorCit2b2lkIHpmaVdsYW5TZXRTYWZlTW9kZUVuYWJsZWQoemRldl90KiBkZXYsIHU4X3Qgc2FmZU1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iU2FmZU1vZGUgPSBzYWZlTW9kZTsKKworICAgIGlmICggc2FmZU1vZGUgKQorICAgIAl6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbihkZXYsIDEpOworICAgIGVsc2UKKyAgICAgICAgemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldElCU1NBZGRpdGlvbmFsSUVMZW5ndGgoemRldl90KiBkZXYsIHUzMl90IGlic3NBZGRpdGlvbmFsSUVTaXplLCB1OF90KiBpYnNzQWRkaXRpb25hbElFKQoreworCXptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworCWlmICggaWJzc0FkZGl0aW9uYWxJRVNpemUgKQorICAgIHsKKwkgICAgd2QtPnN0YS5pYnNzQWRkaXRpb25hbElFU2l6ZSA9IGlic3NBZGRpdGlvbmFsSUVTaXplOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5pYnNzQWRkaXRpb25hbElFLCBpYnNzQWRkaXRpb25hbElFLCAodTE2X3QpaWJzc0FkZGl0aW9uYWxJRVNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgCXdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVNpemUgPSAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NwcmVjb21wLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3ByZWNvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjcwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NwcmVjb21wLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0NQUkVDT01QX0gKKyNkZWZpbmUgX0NQUkVDT01QX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorI2luY2x1ZGUgIi4uL29hbF9tYXJjLmgiCisjaW5jbHVkZSAicHViX3pmaS5oIgorI2luY2x1ZGUgInB1Yl96ZncuaCIKKyNpbmNsdWRlICJwdWJfdXNiLmgiCisjaW5jbHVkZSAid2xhbi5oIgorI2luY2x1ZGUgInN0cnVjdC5oIgorI2luY2x1ZGUgImNmdW5jLmgiCisjaW5jbHVkZSAiY2FnZy5oIgorI2luY2x1ZGUgImN3bS5oIgorI2luY2x1ZGUgInBlcmZvcm1hbmNlLmgiCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Nwc21nci5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Nwc21nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzNjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3BzbWdyLmMKQEAgLTAsMCArMSw3MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAgKiAgVGhlIHBvd2VyIHNhdmluZyBtYW5hZ2VyIGlzIHRvIHNhdmUgdGhlIHBvd2VyIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICogIEdlbmVyYWxseSBzcGVha2luZywgaXQgY29udHJvbHM6CisgICoKKyAgKiAgICAgICAgIC0gd2hlbiB0byBzbGVlcAorICAqICAgICAgICAgLQorICAqCisgICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdySW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPSBaTV9TVEFfUFNfTk9ORTsKKyAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKyAgICB3ZC0+c3RhLnBzTWdyLmlzU2xlZXBBbGxvd2VkID0gMDsKKyAgICB3ZC0+c3RhLnBzTWdyLm1heFNsZWVwUGVyaW9kcyA9IDE7CisgICAgd2QtPnN0YS5wc01nci50aWNrcyA9IDA7CisgICAgd2QtPnN0YS5wc01nci5zbGVlcEFsbG93ZWR0aWNrID0gMDsKK30KKworc3RhdGljIHUxNl90IHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQc05vbmUoemRldl90KiBkZXYsIHU4X3QgKmlzV2FrZVVwUmVxdWlyZWQpCit7CisgICAgdTE2X3QgcmV0ID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2god2QtPnN0YS5wc01nci5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICppc1dha2VVcFJlcXVpcmVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QxOgorICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqaXNXYWtlVXBSZXF1aXJlZCA9IDE7Cit6bV9kZWJ1Z19tc2cwKCJ6ZlBvd2VyU2F2aW5nTWdySGFuZGxlUHNOb25lOiBXYWtlIHVwIG5vd1xuIik7CisgICAgICAgICAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEgc2VuZCBOdWxsIGRhdGFcbiIpOworICAgICAgICAgICAgICAgIC8vemZTZW5kTnVsbERhdGEoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdySGFuZGxlUHMoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQczogUHJlcGFyZSB0byBzbGVlcC4uLlxuIik7CisgICAgICAgICAgICAvL3dkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMToKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDI6CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1NMRUVQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JTZXRNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgdTE2X3Qgc2VuZE51bGwgPSAwOworICAgIHU4X3QgaXNXYWtlVXBSZXF1aXJlZCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX2RlYnVnX21zZzEoIm1vZGUgPSAiLCBtb2RlKTsKKworICAgIGlmIChtb2RlID4gWk1fU1RBX1BTX0xJR0hUKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmV0dXJuIC0gd3JvbmcgcG93ZXIgc2F2ZSBtb2RlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgI2lmIDEKKyAgICBzd2l0Y2gobW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICBzZW5kTnVsbCA9IHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQc05vbmUoZGV2LCAmaXNXYWtlVXBSZXF1aXJlZCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IubWF4U2xlZXBQZXJpb2RzID0gMTsKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQcyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9TVEFfUFNfTUFYOgorICAgICAgICAgICAgd2QtPnN0YS5wc01nci5tYXhTbGVlcFBlcmlvZHMgPSBaTV9QU19NQVhfU0xFRVBfUEVSSU9EUzsKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQcyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICNlbHNlCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBpZiAoIG1vZGUgIT0gWk1fU1RBX1BTX05PTkUgKQorICAgICAgICAgICAgeworem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nclNldE1vZGU6IHN3aXRjaCBmcm9tIFpNX1BTX01TR19TVEFURV9BQ1RJVkUgdG8gWk1fUFNfTVNHX1NUQVRFX1QxXG4iKTsKKyAgICAgICAgICAgICAgICAvLyBTdGFsbCB0aGUgVFggJiBzdGFydCB0byB3YWl0IHRoZSBwZW5kaW5nIFRYIHRvIGJlIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9IG1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggaXNXYWtlVXBSZXF1aXJlZCApCisgICAgeworICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoZGV2LCAwKTsKKyAgICAgICAgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID0gMDsKKyAgICB9CisKKyAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KQorICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSApCisgICAgeworICAgICAgICBzd2l0Y2gobW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTk9ORToKKyAgICAgICAgICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDAsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX0ZBU1Q6CisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19NQVg6CisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDEsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAwLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlbmROdWxsID09IDEpCisgICAgeworICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nck5vdGlmeVBTVG9BUCh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggKHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCAhPSAxKSYmCisgICAgICAgICAod2QtPnN0YS5wc01nci5sYXN0VHhVbmljYXN0RnJtICE9IHdkLT5jb21tVGFsbHkudHhVbmljYXN0RnJtIHx8CisgICAgICAgICAgd2QtPnN0YS5wc01nci5sYXN0VHhCcm9hZGNhc3RGcm0gIT0gd2QtPmNvbW1UYWxseS50eEJyb2FkY2FzdEZybSB8fAorICAgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4TXVsdGljYXN0RnJtICE9IHdkLT5jb21tVGFsbHkudHhNdWx0aWNhc3RGcm0pICkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4VW5pY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhVbmljYXN0RnJtOworICAgICAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeEJyb2FkY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm07CisgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4TXVsdGljYXN0RnJtID0gd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvLyBJZiB0aGUgdHggUSBpcyBub3QgZW1wdHkuLi5yZXR1cm4KKyAgICBpZiAoIHpmSXNWdHhxRW1wdHkoZGV2KSA9PSBGQUxTRSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCit6bV9kZWJ1Z19tc2cwKCJWdHhRIGlzIGVtcHR5IG5vdy4uLkNoZWNrIGlmIEhBTCBUWFEgaXMgZW1wdHlcbiIpOworCisgICAgLy8gVGhlIHRoZSBIQUwgVFggUSBpcyBub3QgZW1wdHkuLi5yZXR1cm4KKyAgICBpZiAoIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSAhPSB6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCit6bV9kZWJ1Z19tc2cwKCJIQUwgVFhRIGlzIGVtcHR5IG5vdy4uLkNvdWxkIGdvIHRvIHNsZWVwLi4uXG4iKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAod2QtPnN0YS5wb3dlclNhdmVNb2RlID09IFpNX1NUQV9QU19MSUdIVCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA+IDIwMCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpCisgICAgICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLnBzTWdyLnNsZWVwQWxsb3dlZHRpY2spIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnNsZWVwQWxsb3dlZHRpY2stLTsKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDI7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLy8gU2VuZCB0aGUgTnVsbCBwa3QgdG8gQVAgdG8gbm90aWZ5IHRoYXQgSSdtIGdvaW5nIHRvIHNsZWVwCisgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgIHsKK3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxIHNlbmQgTnVsbCBkYXRhXG4iKTsKKyAgICAgICAgemZQb3dlclNhdmluZ01nck5vdGlmeVBTVG9BUChkZXYpOworICAgIH0KKworICAgIC8vIFN0YWxsIHRoZSBUWCBub3cKKyAgICAvLyB6ZlR4RW5naW5lU3RvcChkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIE51bGwgcGt0IGlzIHRyYW5zbWl0dGVkCisgICAgaWYgKCB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikgIT0gemZIcEdldE1heFR4ZENvdW50KGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnN0YS5wc01nci5zdGF0ZSA9IFpNX1BTX01TR19TVEFURV9TTEVFUDsKKyAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeFVuaWNhc3RGcm0gPSB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdEZybTsKKyAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeEJyb2FkY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm07CisgICAgd2QtPnN0YS5wc01nci5sYXN0VHhNdWx0aWNhc3RGcm0gPSB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0RnJtOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvLyBMZXQgQ0hJUCBzbGVlcCBub3cKK3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyIHp6enouLi4uXG4iKTsKKyAgICB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoZGV2LCAxKTsKKyAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworfQorCit1OF90IHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNTbGVlcGluZyA9IEZBTFNFOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPT0gWk1fUFNfTVNHX1NUQVRFX1NMRUVQIHx8CisgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID09IFpNX1BTX01TR19TVEFURV9UMikKKyAgICB7CisgICAgICAgIGlzU2xlZXBpbmcgPSBUUlVFOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybiBpc1NsZWVwaW5nOworfQorCitzdGF0aWMgdThfdCB6ZlBvd2VyU2F2aW5nTWdySXNJZGxlKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNJZGxlID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICYmIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPT0gMCApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGluZyhkZXYpICkKKyAgICB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAod2QtPnN0YS5wb3dlclNhdmVNb2RlID09IFpNX1NUQV9QU19MSUdIVCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA+IDIwMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAmJiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljaykgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljay0tOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlzSWRsZSA9IDE7CisKK2RvbmU6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggemZJc1Z0eHFFbXB0eShkZXYpID09IEZBTFNFICkKKyAgICB7CisgICAgICAgIGlzSWRsZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGlzSWRsZTsKK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNJZGxlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpc0lkbGUgPSB6ZlBvd2VyU2F2aW5nTWdySXNJZGxlKGRldik7CisKKyAgICBpZiAoIGlzSWRsZSA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgc3dpdGNoKHdkLT5zdGEucG93ZXJTYXZlTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1NUQV9QU19NQVg6CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX0ZBU1Q6CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX0xJR0hUOgorICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlOiBJRExFIHNvIHNsZXAgbm93Li4uXG4iKTsKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdyRGlzY29ubmVjdE1haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0RJU0NPTk5FQ1RfUFMKKyAgICBzd2l0Y2god2QtPnN0YS5wc01nci5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JTbGVlcElmSWRsZShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMToKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisjZWxzZQorICAgIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoZGV2KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdySW5mcmFNYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh3ZC0+c3RhLnBzTWdyLnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QxOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QyOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDIoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisvL3ByaW50aygiemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkICMxXG4iKTsKKyAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9PSBaTV9TVEFfUFNfTk9ORSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisvL3ByaW50aygiemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkICMyXG4iKTsKKyAgICAvLyBpZiB3ZSByZWNlaXZlZCBhbnkgQVRJTSB3aW5kb3cgZnJvbSB0aGUgb3RoZXJzIHRvIGluZGljYXRlIHdlIGhhdmUgYnVmZmVyZWQgZGF0YQorICAgIC8vIGF0IHRoZSBvdGhlciBzdGF0aW9uLCB3ZSBjYW4ndCBnbyB0byBzbGVlcAorICAgIGlmICggd2QtPnN0YS5yZWN2QXRpbSApCisgICAgeworICAgICAgICB3ZC0+c3RhLnJlY3ZBdGltID0gMDsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ2FuJ3Qgc2xlZXAgZHVlIHRvIHJlY2V2aW5nIEFUSU0gd2luZG93ISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgd2UgYXJlIHRoZSBvbmUgdG8gdHggYmVhY29uIGR1cmluZyBsYXN0IGJlYWNvbiBpbnRlcnZhbC4gd2UgY2FuJ3QgZ28gdG8gc2xlZXAKKyAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIGJlIGFsaXZlIHRvIHJlc3BvbmQgdGhlIHByb2JlIHJlcXVlc3QhCisgICAgaWYgKCB3ZC0+c3RhLnR4QmVhY29uSW5kICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkNhbid0IHNsZWVwIGR1ZSB0byBqdXN0IHRyYW5zbWl0IGEgYmVhY29uISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd2UgYnVmZmVyIGFueSBkYXRhIGZvciB0aGUgb3RoZXIgc3RhdGlvbnMuIHdlIGNvdWxkIG5vdCBnbyB0byBzbGVlcAorICAgIGlmICggd2QtPnN0YS5pYnNzUHJldlBTRGF0YUNvdW50ICE9IDAgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ2FuJ3Qgc2xlZXAgZHVlIHRvIGJ1ZmZlcmluZyBkYXRhIGZvciB0aGUgb3RoZXJzISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gYmVmb3JlIHNsZWVwaW5nLCB3ZSBzdGlsbCBuZWVkIHRvIG5vdGlmeSB0aGUgb3RoZXJzIGJ5IHRyYW5zbWl0dGluZyBudWxsCisgICAgLy8gcGt0IHdpdGggcG93ZXIgbWdtdCBiaXQgdHVybmVkIG9uLgorICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHpmUG93ZXJTYXZpbmdNZ3JJQlNTTWFpbih6ZGV2X3QqIGRldikKK3sKKyAgICAvLyB3YWl0IGZvciB0aGUgZW5kIG9mCisgICAgLy8gaWYgbmVlZCB0byB3YWl0IHRvIGtub3cgaWYgd2UgYXJlIHRoZSBvbmUgdG8gdHJhbnNtaXQgdGhlIGJlYWNvbgorICAgIC8vIGR1cmluZyB0aGUgYmVhY29uIGludGVydmFsLiBJZiBpdCdzIG1lLCB3ZSBjYW4ndCBnbyB0byBzbGVlcC4KKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh3ZC0+c3RhLnBzTWdyLnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFOgorICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDE6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKyNpZiAxCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JNYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAod2QtPnN0YS5hZGFwdGVyU3RhdGUpCisgICAgeworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1Q6CisgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JEaXNjb25uZWN0TWFpbihkZXYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX1NUQV9TVEFURV9DT05ORUNURUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgeworICAgICAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JJbmZyYU1haW4oZGV2KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgeworICAgICAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JJQlNTTWFpbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgemZQb3dlclNhdmluZ01nck1haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBnb3RvIGNoZWNrX3NsZWVwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgICAgICBnb3RvIHNsZWVwaW5nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDE6CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDI6CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMihkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworCitzbGVlcGluZzoKKyAgICByZXR1cm47CisKK2NoZWNrX3NsZWVwOgorICAgIHpmUG93ZXJTYXZpbmdNZ3JTbGVlcElmSWRsZShkZXYpOworICAgIHJldHVybjsKK30KKyNlbmRpZgorCisjaWZkZWYgWk1fRU5BQkxFX1BPV0VSX1NBVkUKK3ZvaWQgemZQb3dlclNhdmluZ01ncldha2V1cCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworLy96bV9kZWJ1Z19tc2cwKCJ6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwIik7CisKKyAgICAvL2lmICggd2QtPnN0YS5wc01nci5zdGF0ZSAhPSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFICYmICggemZQb3dlclNhdmluZ01ncklzSWRsZShkZXYpID09IDAgKSkKKyAgICBpZiAoIHdkLT5zdGEucHNNZ3Iuc3RhdGUgIT0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPSAwOworICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKworICAgICAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA+IFpNX1NUQV9QU19OT05FICkKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDE7CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvLyBXYWtlIHVwIHRoZSBDSElQIG5vdyEhCisgICAgICAgIHpmSHBQb3dlclNhdmVTZXRTdGF0ZShkZXYsIDApOworICAgIH0KK30KKyNlbHNlCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoemRldl90KiBkZXYpCit7Cit9CisjZW5kaWYKKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCAgIGxlbmd0aCwgYml0bWFwOworICAgIHUxNl90ICBvZmZzZXQsIG4xLCBuMiwgcSwgcjsKKyAgICB6YnVmX3QqIHBzQnVmOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9PSBaTV9TVEFfUFNfTk9ORSAgKQorICAgIC8vaWYgKCB3ZC0+c3RhLnBzTWdyLnN0YXRlICE9IFpNX1BTX01TR19TVEFURV9TTEVFUCApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2QtPnN0YS5wc01nci5pc1NsZWVwQWxsb3dlZCA9IDE7CisKKyAgICBpZiAoIChvZmZzZXQ9emZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfVElNKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworICAgICAgICBpZiAoIGxlbmd0aCA+IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBuMSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KSAmICh+Wk1fQklUXzApOworICAgICAgICAgICAgbjIgPSBsZW5ndGggKyBuMSAtIDQ7CisgICAgICAgICAgICBxID0gd2QtPnN0YS5haWQgPj4gMzsKKyAgICAgICAgICAgIHIgPSB3ZC0+c3RhLmFpZCAmIDc7CisKKyAgICAgICAgICAgIGlmICgocSA+PSBuMSkgJiYgKHEgPD0gbjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdG1hcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1K3EtbjEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoYml0bWFwID4+IHIpICYgIFpNX0JJVF8wICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKCB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPT0gWk1fU1RBX1BTX0ZBU1QgKQorICAgICAgICAgICAgICAgICAgICBpZiAoIDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX1MxOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZlNlbmRQU1BvbGwoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEucW9zSW5mbyYweGYpICE9IDB4ZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW5kIHBzLXBvbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiemZTZW5kUFNQb2xsICMxXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX01BWDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIndha2UgdXAgYW5kIHNlbmQgUFMtUG9sbFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZFBTUG9sbChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgid2FrZSB1cCBhbmQgc2VuZCBudWxsIGRhdGFcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljayA9IDQwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKChwc0J1ZiA9IHpmUXVldWVHZXQoZGV2LCB3ZC0+c3RhLnVhcHNkUSkpICE9IE5VTEwpCisgICAgeworICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIHBzQnVmLCAwLCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgIH0KKworICAgIC8vcHJpbnRrKCJ6ZlBvd2VyU2F2aW5nTWdyUHJvY2Vzc0JlYWNvbiAjMVxuIik7CisgICAgemZQb3dlclNhdmluZ01nck1haW4oZGV2KTsKK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyQ29ubmVjdE5vdGlmeSh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHN3aXRjaCh3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAwLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTUFYOgorICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTElHSFQ6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAxLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHpmSHBQb3dlclNhdmVTZXRNb2RlKGRldiwgMCwgMCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJlVEJUVEludGVycnVwdCh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIGRpc2FibGUgVEJUVCBpbnRlcnJ1cHQgd2hlbiBjaGFuZ2UgZnJvbSBjb25uZWN0aW9uIHRvIGRpc2Nvbm5lY3QgKi8KKyAgICBpZiAoemZTdGFJc0Rpc2Nvbm5lY3QoZGV2KSkgeworICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDAsIDApOworICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdGEucHNNZ3IudGlja3MrKzsKKworICAgIGlmICggd2QtPnN0YS5wc01nci50aWNrcyA8IHdkLT5zdGEucHNNZ3IubWF4U2xlZXBQZXJpb2RzICkKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5wc01nci50aWNrcyA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoZGV2KTsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NzY2FubWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3NjYW5tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI4MzVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NzY2FubWdyLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordm9pZCB6ZlNjYW5NZ3JJbml0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1swXSA9IDA7CisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzWzFdID0gMDsKKworICAgIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUgPSBaTV9TQ0FOX01HUl9TQ0FOX05PTkU7CisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMzsKKyAgICAvL3dkLT5zdGEuc2Nhbk1nci5zY2FuU3RhcnREZWxheSA9IDA7Cit9CisKK3U4X3QgemZTY2FuTWdyU2NhblN0YXJ0KHpkZXZfdCogZGV2LCB1OF90IHNjYW5UeXBlKQoreworICAgIHU4X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzEoInNjYW5UeXBlID0gIiwgc2NhblR5cGUpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggc2NhblR5cGUgIT0gWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCAmJgorICAgICAgICAgc2NhblR5cGUgIT0gWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTCApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJ1bmtub3duIHNjYW5UeXBlIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICh6ZlN0YUlzQ29ubmVjdGluZyhkZXYpKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVqZWN0IHNjYW4gcmVxdWVzdCBkdWUgdG8gY29ubmVjdGluZyIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpID0gc2NhblR5cGUgLSAxOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2ldID09IDEgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMSgic2NhbiByZXNjaGVkdWxlZCIsIHNjYW5UeXBlKTsKKyAgICAgICAgZ290byBzY2FuX2RvbmU7CisgICAgfQorCisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2ldID0gMTsKKyAgICB6bV9kZWJ1Z19tc2cxKCJzY2FuIHNjaGVkdWxlZDogIiwgc2NhblR5cGUpOworCisgICAgLy8gSWYgdGhlcmUncyBubyBzY2FuIHBlbmRpbmcsIHdlIGRvIHRoZSBzY2FuIHJpZ2h0IGF3YXkuCisgICAgLy8gSWYgdGhlcmUncyBhbiBpbnRlcm5hbCBzY2FuIGFuZCB0aGUgbmV3IHNjYW4gcmVxdWVzdCBpcyBleHRlcm5hbCBvbmUsCisgICAgLy8gd2Ugd2lsbCByZXN0YXJ0IHRoZSBzY2FuLgorICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgKQorICAgIHsKKyAgICAgICAgZ290byBzY2hlZHVsZV9zY2FuOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMICYmCisgICAgICAgICAgICAgIHNjYW5UeXBlID09IFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgKQorICAgIHsKKyAgICAgICAgLy8gU3RvcCB0aGUgaW50ZXJuYWwgc2NhbiAmIHNjaGVkdWxlIGV4dGVybmFsIHNjYW4gZmlyc3QKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX1NDQU4pOworCisgICAgICAgIC8qIEZpeCBmb3IgV0hRTCBzZW5kcmVjdiA9PiB3ZSBkbyBub3QgYXBwbHkgZGVsYXkgdGltZSBpbiB3aGljaCB0aGUgZGV2aWNlCisgICAgICAgICAgIHN0b3AgdHJhbnNtaXR0aW5nIHBhY2tldCB3aGVuIHdlIGFscmVhZHkgY29ubmVjdCB0byBzb21lIEFQICAqLworICAgICAgICB3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPSBGQUxTRTsKKworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfVElNRU9VVF9TQ0FOKTsKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworCisgICAgICAgIHdkLT5zdGEuYkNoYW5uZWxTY2FuID0gRkFMU0U7CisgICAgICAgIGdvdG8gc2NoZWR1bGVfc2NhbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU2NhbiBpcyBidXN5Li4ud2FpdGluZyBsYXRlciB0byBzdGFydFxuIik7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gMDsKKworc2Nhbl9kb25lOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIDE7CisKK3NjaGVkdWxlX3NjYW46CisKKyAgICB3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPSBUUlVFOworCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfU0NBTiwgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5KTsKKyAgICB3ZC0+c3RhLnNjYW5NZ3Iuc2NhblN0YXJ0RGVsYXkgPSAzOworICAgIC8vd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMDsKKyAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gc2NhblR5cGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSAmJiAoIXpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpKQorICAgIHsKKyAgICAgICAgemZTZW5kTnVsbERhdGEoZGV2LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZTY2FuTWdyU2NhblN0b3AoemRldl90KiBkZXYsIHU4X3Qgc2NhblR5cGUpCit7CisgICAgdThfdCBzY2FuTm90aWZ5UmVxdWlyZWQgPSAwOworICAgIHU4X3QgdGhlT3RoZXJTY2FuID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUgPT0gWk1fU0NBTl9NR1JfU0NBTl9OT05FICkKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCh3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbMF0gPT0gMCk7CisgICAgICAgIHptX2Fzc2VydCh3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbMV0gPT0gMCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBzd2l0Y2goc2NhblR5cGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUw6CisgICAgICAgICAgICBzY2FuTm90aWZ5UmVxdWlyZWQgPSAxOworICAgICAgICAgICAgdGhlT3RoZXJTY2FuID0gWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTDoKKyAgICAgICAgICAgIHRoZU90aGVyU2NhbiA9IFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSAhPSBzY2FuVHlwZSApCisgICAgeworICAgICAgICBnb3RvIHN0b3BfZG9uZTsKKyAgICB9CisKKyAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfU0NBTik7CisKKyAgICAvKiBGaXggZm9yIFdIUUwgc2VuZHJlY3YgPT4gd2UgZG8gbm90IGFwcGx5IGRlbGF5IHRpbWUgaW4gd2hpY2ggdGhlIGRldmljZQorICAgICAgIHN0b3AgdHJhbnNtaXR0aW5nIHBhY2tldCB3aGVuIHdlIGFscmVhZHkgY29ubmVjdCB0byBzb21lIEFQICAqLworICAgIHdkLT5zdGEuYlNjaGVkdWxlU2NhbiA9IEZBTFNFOworCisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX1RJTUVPVVRfU0NBTik7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworCisgICAgd2QtPnN0YS5iQ2hhbm5lbFNjYW4gPSBGQUxTRTsKKyAgICB3ZC0+c3RhLnNjYW5GcmVxdWVuY3kgPSAwOworCisgICAgaWYgKCB3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbdGhlT3RoZXJTY2FuIC0gMV0gKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9IHRoZU90aGVyU2NhbjsKKworICAgICAgICAvLyBTY2hlZHVsZSB0aGUgb3RoZXIgc2NhbiBhZnRlciAxIHNlY29uZCBsYXRlcgorICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9TQ0FOLCAxMDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworICAgIH0KKworc3RvcF9kb25lOgorICAgIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1tzY2FuVHlwZSAtIDFdID0gMDsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBhdm9pZCBsb3NlIHJlY2VpdmUgcGFja2V0IHdoZW4gc2l0ZSBzdXJ2ZXkgKi8KKyAgICBpZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgfQorCisgICAgaWYgKCBzY2FuTm90aWZ5UmVxdWlyZWQgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU2NhbiBub3RpZnkgYWZ0ZXIgcmVzZXQiKTsKKyAgICAgICAgaWYgKHdkLT56ZmNiU2Nhbk5vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYlNjYW5Ob3RpZnkoZGV2LCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKKworZG9uZToKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlNjYW5NZ3JTY2FuQWNrKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMzsKKyAgICAvL3dkLT5zdGEuc2Nhbk1nci5zY2FuU3RhcnREZWxheSA9IDA7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKworZXh0ZXJuIHZvaWQgemZTdGFSZWNvbm5lY3QoemRldl90KiBkZXYpOworCitzdGF0aWMgdm9pZCB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgazsKKyAgICB1MTZfdCAgZHN0WzNdID0geyAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmIH07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBJbmNyZWFzZSByeEJlYWNvbkNvdW50IHRvIHByZXZlbnQgYmVhY29uIGxvc3QgKi8KKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5yeEJlYWNvbkNvdW50Kys7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJQYXNzaXZlU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIGVuYWJsZSA4MDIubDExaCBhbmQgaW4gREZTIEJhbmQgLCBkaXNhYmxlIHNlbmRpbmcgcHJvYmUgcmVxdWVzdCAqLworICAgIGlmICh3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICB7CisgICAgICAgIGlmICh6ZkhwSXNEZnNDaGFubmVsKGRldiwgd2QtPnN0YS5zY2FuRnJlcXVlbmN5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSwgZHN0LCAwLCAwLCAwKTsKKworICAgIGlmICggd2QtPnN0YS5kaXNhYmxlUHJvYmluZ1dpdGhTc2lkICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGs9MTsgazw9Wk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkU7IGsrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPndzLnByb2JpbmdTc2lkTGlzdFtrLTFdLnNzaWRMZW4gIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEsIGRzdCwgaywgMCwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworLy9wcmludGsoInpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IgIzFcbiIpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9JTl9TQ0FOLCBaTV9USUNLX0lOX1NDQU4pOworICAgIGlmICh3ZC0+c3RhLmJQYXNzaXZlU2NhbikKKyAgICB7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX1RJTUVPVVRfU0NBTiwgd2QtPnN0YS5wYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9TQ0FOLCB3ZC0+c3RhLmFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbCk7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KGRldik7Cit9CisKKworc3RhdGljIHZvaWQgemZTY2FuTWdyRXZlbnRTY2FuQ29tcGxldGVDYih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCit2b2lkIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggIXdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICF3ZC0+c3RhLmJQYXNzaXZlU2NhbiApCisgICAgeworICAgICAgICB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KGRldik7CisgICAgICAgICNpZiAwCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0lOX1NDQU4sIFpNX1RJQ0tfSU5fU0NBTik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKwordThfdCB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90ICAgbmV4dFNjYW5GcmVxdWVuY3kgPSAwOworICAgIHU4X3QgICAgdGVtcDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICggd2QtPnN0YS5zY2FuRnJlcXVlbmN5ID09IDAgKQorICAgIHsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG5leHRTY2FuRnJlcXVlbmN5ID0gemZDaEdldE5leHRDaGFubmVsKGRldiwgd2QtPnN0YS5zY2FuRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLmJQYXNzaXZlU2Nhbik7CisKKyAgICBpZiAoIChuZXh0U2NhbkZyZXF1ZW5jeSA9PSAweGZmZmYpCisgICAgICAgICB8fCAod2QtPnN0YS5zY2FuRnJlcXVlbmN5ID09IHpmQ2hHZXRMYXN0Q2hhbm5lbChkZXYsICZ0ZW1wKSkgKQorICAgIHsKKyAgICAgICAgdThfdCBjdXJyU2NhblR5cGU7CisgICAgICAgIHU4X3QgaXNFeHRlcm5hbFNjYW4gPSAwOworICAgICAgICB1OF90IGlzSW50ZXJuYWxTY2FuID0gMDsKKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoImVuZCBzY2FuID0gIiwgS2VRdWVyeUludGVycnVwdFRpbWUoKSk7CisgICAgICAgIHdkLT5zdGEuc2NhbkZyZXF1ZW5jeSA9IDA7CisKKyAgICAgICAgem1fZGVidWdfbXNnMSgic2NhbiAxIHR5cGU6ICIsIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJzY2FuIGNoYW5uZWwgY291bnQgPSAiLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCk7CisKKyAgICAgICAgLy96ZkJzc0luZm9SZWZyZXNoKGRldik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX1NDQU4pOworCisgICAgICAgIGlmICggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJXT1chISBzY2FuIGlzIGNhbmNlbGxlZFxuIik7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgZ290byByZXBvcnRfc2Nhbl9yZXN1bHQ7CisgICAgICAgIH0KKworCisgICAgICAgIGN1cnJTY2FuVHlwZSA9IHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGU7CisgICAgICAgIHN3aXRjaChjdXJyU2NhblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTDoKKyAgICAgICAgICAgICAgICBpc0V4dGVybmFsU2NhbiA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1taTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMIC0gMV0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW1pNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwgLSAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxTY2FuID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMOgorICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxTY2FuID0gMTsKKworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW1pNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgLSAxXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBleHRlcm5hbCBzY2FuIHNob3VsZCBwcmUtZW1wdHMgaW50ZXJuYWwgc2Nhbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gU28gdGhpcyBzaGFsbCBub3QgYmUgaGFwcGVuZWQhIQorICAgICAgICAgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2N1cnJTY2FuVHlwZSAtIDFdID0gMDsKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMTAwOworICAgICAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICB3ZC0+RXh0T2Zmc2V0LCB6ZlNjYW5NZ3JFdmVudFNjYW5Db21wbGV0ZUNiKTsKKworICAgICAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IEZBTFNFOworCisgICAgICAgICNpZiAxCisgICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgIHsgLy8gRmluaXNoIHNpdGUgc3VydmV5LCByZXNldCB0aGUgdmFyaWFibGUgdG8gZGV0ZWN0IHVzaW5nIHdyb25nIGZyZXF1ZW5jeSAhCisgICAgICAgICAgICB6ZkhwRmluaXNoU2l0ZVN1cnZleShkZXYsIDEpOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuaWJzc1NpdGVTdXJ2ZXlTdGF0dXMgPSAyOworICAgICAgICAgICAgd2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbiA9IDA7CisgICAgICAgICAgICB3ZC0+c3RhLmlic3NSZWNlaXZlQmVhY29uQ291bnQgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyogIzUgUmUtZW5hYmxlIFJJRlMgZnVuY3Rpb24gYWZ0ZXIgdGhlIHNpdGUgc3VydmV5ICEgKi8KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYmVjYXVzZSBzd2l0Y2ggYmFuZCB3aWxsIHJlc2V0IHRoZSBCQiByZWdpc3RlciB0byBpbml0aWFsIHZhbHVlICovCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RFRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcEVuYWJsZVJpZnMoZGV2LCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTwzMDAwKT8xOjApLCB3ZC0+c3RhLkVuYWJsZUhULCB3ZC0+c3RhLkhUMjA0MCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwRmluaXNoU2l0ZVN1cnZleShkZXYsIDApOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuaWJzc1NpdGVTdXJ2ZXlTdGF0dXMgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworcmVwb3J0X3NjYW5fcmVzdWx0OgorICAgICAgICAvKiBhdm9pZCBsb3NlIHJlY2VpdmUgcGFja2V0IHdoZW4gc2l0ZSBzdXJ2ZXkgKi8KKyAgICAgICAgLy9pZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgICAgIC8vfQorCisgICAgICAgIGlmICggaXNFeHRlcm5hbFNjYW4gKS8vUXVpY2tseSByZWJvb3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT56ZmNiU2Nhbk5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT56ZmNiU2Nhbk5vdGlmeShkZXYsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpc0ludGVybmFsU2NhbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5JbnRlcm5hbFNjYW5SZXEgPSAwOworICAgICAgICAgICAgemZTdGFSZWNvbm5lY3QoZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLnNjYW5GcmVxdWVuY3kgPSBuZXh0U2NhbkZyZXF1ZW5jeTsKKworICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9JTl9TQ0FOKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJzY2FuIDIiKTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKwordm9pZCB6ZlNjYW5NZ3JTY2FuRXZlbnRTdGFydCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgemZQb3dlclNhdmluZ01ncldha2V1cChkZXYpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgKQorICAgIHsKKyAgICAgICAgZ290byBub19zY2FuOworICAgIH0KKworICAgIC8vemZCc3NJbmZvUmVmcmVzaChkZXYpOworICAgIHpmQnNzSW5mb1JlZnJlc2goZGV2LCAwKTsKKyAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IFRSVUU7CisgICAgd2QtPnN0YS5iU2NoZWR1bGVTY2FuID0gRkFMU0U7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX1NDQU4pOworCisgICAgLy96bV9kZWJ1Z19tc2cxKCJzdGFydCBzY2FuID0gIiwgS2VRdWVyeUludGVycnVwdFRpbWUoKSk7CisgICAgd2QtPnN0YS5zY2FuRnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsICZ3ZC0+c3RhLmJQYXNzaXZlU2Nhbik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIGF2b2lkIGxvc2UgcmVjZWl2ZSBwYWNrZXQgd2hlbiBzaXRlIHN1cnZleSAqLworICAgIC8vaWYgKCh6ZlN0YUlzQ29ubmVjdGVkKGRldikpICYmICghemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkpCisgICAgLy97CisgICAgLy8gICAgemZTZW5kTnVsbERhdGEoZGV2LCAxKTsKKyAgICAvL30KKy8vICAgIHptX2RlYnVnX21zZzAoInNjYW4gMCIpOworLy8gICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgI2lmIDEKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgIHsvLyBJZiBkb2luZyBzaXRlIHN1cnZleSAhCisgICAgICAgIHpmSHBCZWdpblNpdGVTdXJ2ZXkoZGV2LCAxKTsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9IDE7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBCZWdpblNpdGVTdXJ2ZXkoZGV2LCAwKTsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9IDA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgICNlbmRpZgorCisgICAgem1fZGVidWdfbXNnMCgic2NhbiAwIik7CisgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgcmV0dXJuOworCitub19zY2FuOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQyZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0a2lwLmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN0a2lwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVHggYW5kIFJ4IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCit1MTZfdCB6Z1RraXBTYm94TG93ZXJbMjU2XSA9CisgICAgeworICAgICAgICAweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisgICAgICAgIDB4NTAsMHgwMywweEE5LDB4N0QsMHgxOSwweDYyLDB4RTYsMHg5QSwKKyAgICAgICAgMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAorICAgICAgICAweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisgICAgICAgIDB4QzIsMHgxQywweEFFLDB4NkEsMHg1QSwweDQxLDB4MDIsMHg0RiwKKyAgICAgICAgMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAorICAgICAgICAweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisgICAgICAgIDB4MDksMHgzNiwweDlCLDB4M0QsMHgyNiwweDY5LDB4Q0QsMHg5RiwKKyAgICAgICAgMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAorICAgICAgICAweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisgICAgICAgIDB4RjUsMHg2OCwweDAwLDB4MkMsMHg2MCwweDFGLDB4QzgsMHhFRCwKKyAgICAgICAgMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAorICAgICAgICAweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisgICAgICAgIDB4Q0YsMHgxMCwweDA2LDB4ODEsMHhGMCwweDQ0LDB4QkEsMHhFMywKKyAgICAgICAgMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAorICAgICAgICAweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisgICAgICAgIDB4NEMsMHgxNCwweDM1LDB4MkYsMHhFMSwweEEyLDB4Q0MsMHgzOSwKKyAgICAgICAgMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAorICAgICAgICAweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisgICAgICAgIDB4Q0EsMHgyOSwweEQzLDB4M0MsMHg3OSwweEUyLDB4MUQsMHg3NiwKKyAgICAgICAgMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAorICAgICAgICAweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisgICAgICAgIDB4MzIsMHg0MywweDU5LDB4QjcsMHg4QywweDY0LDB4RDIsMHhFMCwKKyAgICAgICAgMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAorICAgICAgICAweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisgICAgICAgIDB4MjMsMHg3QywweDlDLDB4MjEsMHhERCwweERDLDB4ODYsMHg4NSwKKyAgICAgICAgMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAorICAgICAgICAweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisgICAgICAgIDB4MzgsMHgxMywweEIzLDB4MzMsMHhCQiwweDcwLDB4ODksMHhBNywKKyAgICAgICAgMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAorICAgICAgICAweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisgICAgICAgIDB4QzMsMHhCMCwweDc3LDB4MTEsMHhDQiwweEZDLDB4RDYsMHgzQQorICAgIH07CisKKwordTE2X3QgemdUa2lwU2JveFVwcGVyWzI1Nl0gPQorICAgIHsKKyAgICAgICAgMHhDNiwweEY4LDB4RUUsMHhGNiwweEZGLDB4RDYsMHhERSwweDkxLAorICAgICAgICAweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCisgICAgICAgIDB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKyAgICAgICAgMHg0MSwweEIzLDB4NUYsMHg0NSwweDIzLDB4NTMsMHhFNCwweDlCLAorICAgICAgICAweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCisgICAgICAgIDB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKyAgICAgICAgMHgwOCwweDk1LDB4NDYsMHg5RCwweDMwLDB4MzcsMHgwQSwweDJGLAorICAgICAgICAweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCisgICAgICAgIDB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKyAgICAgICAgMHhBNCwweDc2LDB4QjcsMHg3RCwweDUyLDB4REQsMHg1RSwweDEzLAorICAgICAgICAweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCisgICAgICAgIDB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKyAgICAgICAgMHhCQiwweEM1LDB4NEYsMHhFRCwweDg2LDB4OUEsMHg2NiwweDExLAorICAgICAgICAweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCisgICAgICAgIDB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKyAgICAgICAgMHg2MywweDc3LDB4QUYsMHg0MiwweDIwLDB4RTUsMHhGRCwweEJGLAorICAgICAgICAweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCisgICAgICAgIDB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKyAgICAgICAgMHhDMCwweDE5LDB4OUUsMHhBMywweDQ0LDB4NTQsMHgzQiwweDBCLAorICAgICAgICAweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCisgICAgICAgIDB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKyAgICAgICAgMHg5RiwweEJELDB4NDMsMHhDNCwweDM5LDB4MzEsMHhEMywweEYyLAorICAgICAgICAweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCisgICAgICAgIDB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKyAgICAgICAgMHg2RiwweEYwLDB4NEEsMHg1QywweDM4LDB4NTcsMHg3MywweDk3LAorICAgICAgICAweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCisgICAgICAgIDB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKyAgICAgICAgMHhDMiwweDZBLDB4QUUsMHg2OSwweDE3LDB4OTksMHgzQSwweDI3LAorICAgICAgICAweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCisgICAgICAgIDB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKyAgICAgICAgMHgwMywweDU5LDB4MDksMHgxQSwweDY1LDB4RDcsMHg4NCwweEQwLAorICAgICAgICAweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKKyAgICB9OworCit1MTZfdCB6ZnJvdHIxKHUxNl90IGEpCisvLyByb3RhdGUgcmlnaHQgYnkgMSBiaXQuCit7CisgICAgdTE2X3QgYjsKKworICAgIGlmIChhICYgMHgwMSkKKyAgICB7CisgICAgICAgIGIgPSAoYSA+PiAxKSB8IDB4ODAwMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYiA9IChhID4+IDEpICYgMHg3ZmZmOworICAgIH0KKyAgICByZXR1cm4gYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB6ZlRraXBTYm94KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnMgYSAxNiBiaXQgdmFsdWUgZnJvbSBhIDY0SyBlbnRyeSB0YWJsZS4gVGhlIFRhYmxlICAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVGtpcFNib3godTE2X3QgaW5kZXgpCit7CisgICAgdTE2X3QgICBsb3c7CisgICAgdTE2X3QgICBoaWdoOworICAgIHUxNl90ICAgbGVmdCwgcmlnaHQ7CisKKyAgICBsb3cgPSAoaW5kZXggJiAweEZGKTsKKyAgICBoaWdoID0gKChpbmRleCA+PiA4KSAmIDB4RkYpOworCisgICAgbGVmdCA9IHpnVGtpcFNib3hMb3dlcltsb3ddICsgKHpnVGtpcFNib3hVcHBlcltsb3ddIDw8IDggKTsKKyAgICByaWdodCA9IHpnVGtpcFNib3hVcHBlcltoaWdoXSArICh6Z1RraXBTYm94TG93ZXJbaGlnaF0gPDwgOCApOworCisgICAgcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCit1OF90IHpmVGtpcFBoYXNlMUtleU1peCh1MzJfdCBpdjMyLCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpCit7CisgICAgdTE2X3QgICB0c2MwOworICAgIHUxNl90ICAgdHNjMTsKKyAgICB1MTZfdCAgIGksIGo7CisjaWYgMAorICAgIC8qIE5lZWQgbm90IHByb2NlZWQgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGl2MzIgKi8KKyAgICBpZiAoIGl2MzIgPT0gcFNlZWQtPml2MzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisgICAgdHNjMCA9ICh1MTZfdCkgKChpdjMyID4+IDE2KSAmIDB4ZmZmZik7IC8qIG1zYiAqLworICAgIHRzYzEgPSAodTE2X3QpIChpdjMyICYgMHhmZmZmKTsKKworICAgIC8qIFBoYXNlIDEsIHN0ZXAgMSAqLworICAgIHBTZWVkLT50dGFrWzBdID0gdHNjMTsKKyAgICBwU2VlZC0+dHRha1sxXSA9IHRzYzA7CisgICAgcFNlZWQtPnR0YWtbMl0gPSAodTE2X3QpIChwU2VlZC0+dGFbMF0gKyAocFNlZWQtPnRhWzFdIDw8OCkpOworICAgIHBTZWVkLT50dGFrWzNdID0gKHUxNl90KSAocFNlZWQtPnRhWzJdICsgKHBTZWVkLT50YVszXSA8PDgpKTsKKyAgICBwU2VlZC0+dHRha1s0XSA9ICh1MTZfdCkgKHBTZWVkLT50YVs0XSArIChwU2VlZC0+dGFbNV0gPDw4KSk7CisKKyAgICAvKiBQaGFzZSAxLCBzdGVwIDIgKi8KKyAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgeworICAgICAgICBqID0gMiooaSAmIDEpOworICAgICAgICBwU2VlZC0+dHRha1swXSA9KHBTZWVkLT50dGFrWzBdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1s0XQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxK2pdLCBwU2VlZC0+dGtbal0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1sxXSA9KHBTZWVkLT50dGFrWzFdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1swXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1s1K2pdLCBwU2VlZC0+dGtbNCtqXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1syXSA9KHBTZWVkLT50dGFrWzJdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1s5K2pdLCBwU2VlZC0+dGtbOCtqXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1szXSA9KHBTZWVkLT50dGFrWzNdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1syXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxMytqXSwgcFNlZWQtPnRrWzEyK2pdKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmZmZjsKKyAgICAgICAgcFNlZWQtPnR0YWtbNF0gPShwU2VlZC0+dHRha1s0XSArIHpmVGtpcFNib3gocFNlZWQtPnR0YWtbM10KKyAgICAgICAgICAgICAgICAgICAgICAgICBeIFpNX0JZVEVfVE9fV09SRChwU2VlZC0+dGtbMStqXSwgcFNlZWQtPnRrW2pdICApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1s0XSA9KHBTZWVkLT50dGFrWzRdICsgaSkgJiAweGZmZmY7CisgICAgfQorCisgICAgaWYgKCBpdjMyID09IChwU2VlZC0+aXYzMisxKSApCisgICAgeworICAgICAgICBwU2VlZC0+aXYzMnRtcCA9IGl2MzI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1OF90IHpmVGtpcFBoYXNlMktleU1peCh1MTZfdCBpdjE2LCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpCit7CisgICAgdTE2X3QgdHNjMjsKKworICAgIHRzYzIgPSBpdjE2OworCisgICAgLyogUGhhc2UgMiwgU3RlcCAxICovCisgICAgcFNlZWQtPnBwa1swXSA9IHBTZWVkLT50dGFrWzBdOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+dHRha1sxXTsKKyAgICBwU2VlZC0+cHBrWzJdID0gcFNlZWQtPnR0YWtbMl07CisgICAgcFNlZWQtPnBwa1szXSA9IHBTZWVkLT50dGFrWzNdOworICAgIHBTZWVkLT5wcGtbNF0gPSBwU2VlZC0+dHRha1s0XTsKKyAgICBwU2VlZC0+cHBrWzVdID0gKHBTZWVkLT50dGFrWzRdICsgdHNjMikgJiAweGZmZmY7CisKKyAgICAvKiBQaGFzZTIsIFN0ZXAgMiAqLworICAgIHBTZWVkLT5wcGtbMF0gPSBwU2VlZC0+cHBrWzBdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbNV0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzFdLHBTZWVkLT50a1swXSkpOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+cHBrWzFdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzNdLHBTZWVkLT50a1syXSkpOworICAgIHBTZWVkLT5wcGtbMl0gPSBwU2VlZC0+cHBrWzJdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMV0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzVdLHBTZWVkLT50a1s0XSkpOworICAgIHBTZWVkLT5wcGtbM10gPSBwU2VlZC0+cHBrWzNdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMl0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzddLHBTZWVkLT50a1s2XSkpOworICAgIHBTZWVkLT5wcGtbNF0gPSBwU2VlZC0+cHBrWzRdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbM10gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzldLHBTZWVkLT50a1s4XSkpOworICAgIHBTZWVkLT5wcGtbNV0gPSBwU2VlZC0+cHBrWzVdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbNF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzExXSxwU2VlZC0+dGtbMTBdKSk7CisKKyAgICBwU2VlZC0+cHBrWzBdID0gcFNlZWQtPnBwa1swXQorICAgICAgICAgICAgICAgICsgemZyb3RyMShwU2VlZC0+cHBrWzVdIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxM10scFNlZWQtPnRrWzEyXSkpOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+cHBrWzFdCisgICAgICAgICAgICAgICAgKyB6ZnJvdHIxKHBTZWVkLT5wcGtbMF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzE1XSxwU2VlZC0+dGtbMTRdKSk7CisgICAgcFNlZWQtPnBwa1syXSA9IHBTZWVkLT5wcGtbMl0gKyB6ZnJvdHIxKHBTZWVkLT5wcGtbMV0pOworICAgIHBTZWVkLT5wcGtbM10gPSBwU2VlZC0+cHBrWzNdICsgemZyb3RyMShwU2VlZC0+cHBrWzJdKTsKKyAgICBwU2VlZC0+cHBrWzRdID0gcFNlZWQtPnBwa1s0XSArIHpmcm90cjEocFNlZWQtPnBwa1szXSk7CisgICAgcFNlZWQtPnBwa1s1XSA9IHBTZWVkLT5wcGtbNV0gKyB6ZnJvdHIxKHBTZWVkLT5wcGtbNF0pOworCisgICAgaWYgKGl2MTYgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChwU2VlZC0+aXYxNiA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZWVkLT5pdjE2dG1wPTA7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoaXYxNiA9PSAocFNlZWQtPml2MTYrMSkpCisgICAgeworICAgICAgICBwU2VlZC0+aXYxNnRtcCA9IGl2MTY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIHpmVGtpcEluaXQodThfdCoga2V5LCB1OF90KiB0YSwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkLCB1OF90KiBpbml0SXYpCit7CisgICAgdTE2X3QgIGl2MTY7CisgICAgdTMyX3QgIGl2MzI7CisgICAgdTE2X3QgIGk7CisKKyAgICAvKiBjbGVhciBtZW1vcnkgKi8KKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSBwU2VlZCwgc2l6ZW9mKHN0cnVjdCB6c1RraXBTZWVkKSk7CisgICAgLyogc2V0IGtleSB0byBzZWVkICovCisgICAgemZNZW1vcnlDb3B5KHBTZWVkLT50YSwgdGEsIDYpOworICAgIHpmTWVtb3J5Q29weShwU2VlZC0+dGssIGtleSwgMTYpOworCisgICAgaXYxNiA9ICppbml0SXYrKzsKKyAgICBpdjE2ICs9ICppbml0SXY8PDg7CisgICAgaW5pdEl2Kys7CisKKyAgICBpdjMyPTA7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykgICAgICAvLyBpbml0aXYgaXMgbGl0dGxlIGVuZGlhbgorICAgIHsKKyAgICAgICAgaXYzMiArPSAqaW5pdEl2PDwoaSo4KTsKKyAgICAgICAgKmluaXRJdisrOworICAgIH0KKworICAgIHBTZWVkLT5pdjMyID0gaXYzMisxOyAvLyBGb3JjZSBSZWNhbGN1bGF0aW5nIG9uIFRraXAgUGhhc2UxCisgICAgemZUa2lwUGhhc2UxS2V5TWl4KGl2MzIsIHBTZWVkKTsKKworICAgIHBTZWVkLT5pdjE2ID0gaXYxNjsKKyAgICBwU2VlZC0+aXYzMiA9IGl2MzI7Cit9CisKK3UzMl90IHpmR2V0VTMydCh1OF90KiBwKQoreworICAgIHUzMl90IHJlcz0wOworICAgIHUxNl90IGk7CisKKyAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQorICAgIHsKKyAgICAgICAgcmVzIHw9ICgqcCsrKSA8PCAoOCppKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworCit9CisKK3ZvaWQgemZQdXRVMzJ0KHU4X3QqIHAsIHUzMl90IHZhbHVlKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgICpwKysgPSAodThfdCkgKHZhbHVlICYgMHhmZik7CisgICAgICAgIHZhbHVlID4+PSA4OworICAgIH0KK30KKwordm9pZCB6Zk1pY0NsZWFyKHN0cnVjdCB6c01pY1ZhciogcE1pYykKK3sKKyAgICBwTWljLT5sZWZ0ID0gcE1pYy0+azA7CisgICAgcE1pYy0+cmlnaHQgPSBwTWljLT5rMTsKKyAgICBwTWljLT5uQnl0ZXMgPSAwOworICAgIHBNaWMtPm0gPSAwOworfQorCit2b2lkIHpmTWljU2V0S2V5KHU4X3QqIGtleSwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIHBNaWMtPmswID0gemZHZXRVMzJ0KGtleSk7CisgICAgcE1pYy0+azEgPSB6ZkdldFUzMnQoa2V5KzQpOworICAgIHpmTWljQ2xlYXIocE1pYyk7Cit9CisKK3ZvaWQgemZNaWNBcHBlbmRCeXRlKHU4X3QgYiwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIC8vIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIKKyAgICBwTWljLT5tIHw9IGIgPDwgKDgqIHBNaWMtPm5CeXRlcyk7CisgICAgcE1pYy0+bkJ5dGVzKys7CisKKyAgICAvLyBQcm9jZXNzIHRoZSB3b3JkIGlmIGl0IGlzIGZ1bGwuCisgICAgaWYgKCBwTWljLT5uQnl0ZXMgPj0gNCApCisgICAgeworICAgICAgICBwTWljLT5sZWZ0IF49IHBNaWMtPm07CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPTDMyKHBNaWMtPmxlZnQsIDE3ICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49ICgocE1pYy0+bGVmdCAmIDB4ZmYwMGZmMDApID4+IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKChwTWljLT5sZWZ0ICYgMHgwMGZmMDBmZikgPDwgOCk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPTDMyKCBwTWljLT5sZWZ0LCAzICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPUjMyKCBwTWljLT5sZWZ0LCAyICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIC8vIENsZWFyIHRoZSBidWZmZXIKKyAgICAgICAgcE1pYy0+bSA9IDA7CisgICAgICAgIHBNaWMtPm5CeXRlcyA9IDA7CisgICAgfQorfQorCit2b2lkIHpmTWljR2V0TWljKHU4X3QqIGRzdCwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIC8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCisgICAgemZNaWNBcHBlbmRCeXRlKDB4NWEsIHBNaWMpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljKTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pYyk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWMpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljKTsKKworICAgIC8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorICAgIHdoaWxlKCBwTWljLT5uQnl0ZXMgIT0gMCApCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pYyk7CisgICAgfQorCisgICAgLy8gVGhlIGFwcGVuZEJ5dGUgZnVuY3Rpb24gaGFzIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4KKyAgICB6ZlB1dFUzMnQoZHN0LCBwTWljLT5sZWZ0KTsKKyAgICB6ZlB1dFUzMnQoZHN0KzQsIHBNaWMtPnJpZ2h0KTsKKworICAgIC8vIFJlc2V0IHRvIHRoZSBlbXB0eSBtZXNzYWdlLgorICAgIHpmTWljQ2xlYXIocE1pYyk7CisKK30KKwordThfdCB6Zk1pY1J4VmVyaWZ5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICBzdHJ1Y3QgenNNaWNWYXIqICBwTWljS2V5OworICAgIHN0cnVjdCB6c01pY1ZhciAgICBNeU1pY0tleTsKKyAgICB1OF90ICAgbWljWzhdOworICAgIHU4X3QgICBkYVs2XTsKKyAgICB1OF90ICAgc2FbNl07CisgICAgdThfdCAgIGJWYWx1ZTsKKyAgICB1MTZfdCAgaSwgcGF5bG9hZE9mZnNldCwgdGFpbE9mZnNldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIG5lZWQgbm90IGNoZWNrIE1JQyBpZiBwTWljS0V5IGlzIGVxdWFsIHRvIE5VTEwgKi8KKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZkFwR2V0UnhNaWNLZXkoZGV2LCBidWYpOworCisgICAgICAgIGlmICggcE1pY0tleSAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBzYSwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KTsKKyAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgZGEsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWk1fTUlDX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZlN0YUdldFJ4TWljS2V5KGRldiwgYnVmKTsKKworICAgICAgICBpZiAoIHBNaWNLZXkgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1Ziwgc2EsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIGRhLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQsIDYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFpNX01JQ19TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9NSUNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBNeU1pY0tleS5rMD1wTWljS2V5LT5rMDsKKyAgICBNeU1pY0tleS5rMT1wTWljS2V5LT5rMTsKKyAgICBwTWljS2V5ID0gJk15TWljS2V5OworCisgICAgemZNaWNDbGVhcihwTWljS2V5KTsKKyAgICB0YWlsT2Zmc2V0ID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgdGFpbE9mZnNldCAtPSA4OworCisgICAgLyogYXBwZW5kIERBICovCisgICAgZm9yKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoZGFbaV0sIHBNaWNLZXkpOworICAgIH0KKyAgICAvKiBhcHBlbmQgU0EgKi8KKyAgICBmb3IoaT0wOyBpPDY7IGkrKykKKyAgICB7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShzYVtpXSwgcE1pY0tleSk7CisgICAgfQorCisgICAgLyogYXBwZW5kIGZvciBhbGlnbm1lbnQgKi8KKyAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApICYgMHg4MCkgIT0gMCkKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsMjQpJjB4NywgcE1pY0tleSk7CisgICAgZWxzZQorICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisKKyAgICAvKiBhcHBlbmQgcGF5bG9hZCAqLworICAgIHBheWxvYWRPZmZzZXQgPSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIgKworICAgICAgICAgICAgICAgICAgICBaTV9TSVpFX09GX0lWICsKKyAgICAgICAgICAgICAgICAgICAgWk1fU0laRV9PRl9FWFRfSVY7CisKKyAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApICYgMHg4MCkgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFFvcyBQYWNrZXQsIFBsY3BoZWFkZXIgKyAyICovCisgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVE9ETyA6IFJ4IFFvcyBlbGVtZW50IG9mZnNldCBpbiBzb2Z0d2FyZSBNSUMgY2hlY2sgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF5bG9hZE9mZnNldCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9cGF5bG9hZE9mZnNldDsgaTx0YWlsT2Zmc2V0OyBpKyspCisgICAgeworICAgICAgICBiVmFsdWUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKGJWYWx1ZSwgcE1pY0tleSk7CisgICAgfQorCisgICAgemZNaWNHZXRNaWMobWljLCBwTWljS2V5KTsKKworICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBtaWMsIHRhaWxPZmZzZXQsIDgpICkKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9NSUNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gWk1fTUlDX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZUa2lwR2V0c2VlZHModTE2X3QgaXYxNiwgdThfdCAqUkM0S2V5LCBzdHJ1Y3QgenNUa2lwU2VlZCAqU2VlZCkKK3sKKyAgICBSQzRLZXlbMF0gID0gWk1fSEk4KGl2MTYpOworICAgIFJDNEtleVsxXSAgPSAoWk1fSEk4KGl2MTYpIHwgMHgyMCkgJiAweDdmOworICAgIFJDNEtleVsyXSAgPSBaTV9MTzgoaXYxNik7CisgICAgUkM0S2V5WzNdICA9ICgoU2VlZC0+cHBrWzVdIF4gWk1fQllURV9UT19XT1JEKFNlZWQtPnRrWzFdLFNlZWQtPnRrWzBdKSk+PjEpICYgMHhmZjsKKyAgICBSQzRLZXlbNF0gID0gU2VlZC0+cHBrWzBdICYgMHhmZjsKKyAgICBSQzRLZXlbNV0gID0gU2VlZC0+cHBrWzBdID4+IDg7CisgICAgUkM0S2V5WzZdICA9IFNlZWQtPnBwa1sxXSAmIDB4ZmY7CisgICAgUkM0S2V5WzddICA9IFNlZWQtPnBwa1sxXSA+PiA4OworICAgIFJDNEtleVs4XSAgPSBTZWVkLT5wcGtbMl0gJiAweGZmOworICAgIFJDNEtleVs5XSAgPSBTZWVkLT5wcGtbMl0gPj4gODsKKyAgICBSQzRLZXlbMTBdID0gU2VlZC0+cHBrWzNdICYgMHhmZjsKKyAgICBSQzRLZXlbMTFdID0gU2VlZC0+cHBrWzNdID4+IDg7CisgICAgUkM0S2V5WzEyXSA9IFNlZWQtPnBwa1s0XSAmIDB4ZmY7CisgICAgUkM0S2V5WzEzXSA9IFNlZWQtPnBwa1s0XSA+PiA4OworICAgIFJDNEtleVsxNF0gPSBTZWVkLT5wcGtbNV0gJiAweGZmOworICAgIFJDNEtleVsxNV0gPSBTZWVkLT5wcGtbNV0gPj4gODsKK30KKwordm9pZCB6ZkNhbFR4TWljKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCAqZGEsIHUxNl90ICpzYSwgdThfdCB1cCwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c01pY1ZhciogIHBNaWNLZXk7CisgICAgdTE2X3QgIGk7CisgICAgdTE2X3QgbGVuOworICAgIHU4X3QgYlZhbHVlOworICAgIHU4X3QgcW9zVHlwZTsKKyAgICB1OF90ICpwRGEgPSAodThfdCAqKWRhOworICAgIHU4X3QgKnBTYSA9ICh1OF90ICopc2E7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBuZWVkIG5vdCBjaGVjayBNSUMgaWYgcE1pY0tFeSBpcyBlcXVhbCB0byBOVUxMICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBwTWljS2V5ID0gemZBcEdldFR4TWljS2V5KGRldiwgYnVmLCAmcW9zVHlwZSk7CisKKyAgICAgICAgaWYgKCBwTWljS2V5ID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgcE1pY0tleSA9IHpmU3RhR2V0VHhNaWNLZXkoZGV2LCBidWYpOworCisgICAgICAgIGlmICggcE1pY0tleSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgicE1pY0tleSBpcyBOVUxMIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmTWljQ2xlYXIocE1pY0tleSk7CisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBhcHBlbmQgREEgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUocERhW2ldLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICAvKiBhcHBlbmQgU0EgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUocFNhW2ldLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICBpZiAodXAgIT0gMCkKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKCh1cCYweDcpLCBwTWljS2V5KTsKKyAgICBlbHNlCisgICAgICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworCisgICAgLyogRm9yIFNuYXAgaGVhZGVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgc25hcExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKHNuYXBbaV0sIHBNaWNLZXkpOworICAgIH0KKworICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgICBiVmFsdWUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKGJWYWx1ZSwgcE1pY0tleSk7CisgICAgfQorCisgICAgemZNaWNHZXRNaWMobWljLCBwTWljS2V5KTsKK30KKwordm9pZCB6ZlRLSVBFbmNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5LCB1MzJfdCogaWN2KQoreworICAgIHU4X3QgaXZbM107CisKKyAgICBpdlswXSA9IGtleVswXTsKKyAgICBpdlsxXSA9IGtleVsxXTsKKyAgICBpdlsyXSA9IGtleVsyXTsKKworICAgIGtleUxlbiAtPSAzOworCisgICAgemZXRVBFbmNyeXB0KGRldiwgYnVmLCBzbmFwLCBzbmFwTGVuLCBvZmZzZXQsIGtleUxlbiwgJmtleVszXSwgaXYpOworfQorCit1MTZfdCB6ZlRLSVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5KQoreworICAgIHUxNl90IHJldCA9IFpNX0lDVl9TVUNDRVNTOworICAgIHU4X3QgaXZbM107CisKKyAgICBpdlswXSA9IGtleVswXTsKKyAgICBpdlsxXSA9IGtleVsxXTsKKyAgICBpdlsyXSA9IGtleVsyXTsKKworICAgIGtleUxlbiAtPSAzOworCisgICAgcmV0ID0gemZXRVBEZWNyeXB0KGRldiwgYnVmLCBvZmZzZXQsIGtleUxlbiwgJmtleVszXSwgaXYpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1OGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jCkBAIC0wLDAgKzEsNDA5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaHRyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBUeCBhbmQgUnggZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK3UxNl90IHpmV2xhblJ4VmFsaWRhdGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90IHpmV2xhblJ4RmlsdGVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisKKworCitjb25zdCB1OF90IHpnU25hcEJyaWRnZVR1bm5lbFs2XSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHhGOCB9OworY29uc3QgdThfdCB6Z1NuYXA4MDIxaFs2XSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworLyogVGFibGUgZm9yIGNvbnZlcnRpbmcgSVAgRFNDUCBQMi1QMCBiaXRzIHRvIDgwMi4xMWUgQWNjZXNzIENhdGVnb3J5ICovCitjb25zdCB1OF90IHpjVXBUb0FjWzhdID0gezAsIDEsIDEsIDAsIDIsIDIsIDMsIDN9OyAvL1dNTSBkZWZhdWx0CisvL2NvbnN0IHU4X3QgemNVcFRvQWNbOF0gPSB7MCwgMSwgMSwgMCwgMCwgMCwgMCwgMH07IC8vRm9yIDIgVHhRCisvL2NvbnN0IHU4X3QgemNVcFRvQWNbOF0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07IC8vRm9yIHNpbmdsZSBUeFEKK2NvbnN0IHU4X3QgemNNYXhzcFRvUGt0TnVtWzRdID0gezgsIDIsIDQsIDZ9OworCit1OF90IHpmR2V0RW5jcnlNb2RlRnJvbVJ4U3RhdHVzKHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1OF90IHNlY3VyaXR5Qnl0ZTsKKyAgICB1OF90IGVuY3J5TW9kZTsKKworICAgIHNlY3VyaXR5Qnl0ZSA9IChhZGRJbmZvLT5UYWlsLkRhdGEuU0FJbmRleCAmIDB4YzApID4+IDQ7ICAvKiBieXRlNCAqLworICAgIHNlY3VyaXR5Qnl0ZSB8PSAoYWRkSW5mby0+VGFpbC5EYXRhLkRBSW5kZXggJiAweGMwKSA+PiA2OyAvKiBieXRlNSAqLworCisgICAgc3dpdGNoKCBzZWN1cml0eUJ5dGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9OT19XRVA6CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgIGNhc2UgWk1fQUVTOgorCisgICAgICAgICAgICBlbmNyeU1vZGUgPSBzZWN1cml0eUJ5dGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICBpZiAoIChzZWN1cml0eUJ5dGUgJiAweGY4KSA9PSAweDA4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkZWNyeXB0ZWQgYnkgc29mdHdhcmUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVuY3J5TW9kZTsKK30KKwordm9pZCB6ZkdldFJ4SXZJY3ZMZW5ndGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHZhcCwgdTE2X3QqIHBJdkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBwSWN2TGVuLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3Qgd2RzUG9ydDsKKyAgICB1OF90ICBlbmNyeU1vZGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAqcEl2TGVuID0gMDsKKyAgICAqcEljdkxlbiA9IDA7CisKKyAgICBlbmNyeU1vZGUgPSB6ZkdldEVuY3J5TW9kZUZyb21SeFN0YXR1cyhhZGRJbmZvKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgaWYgKHZhcCA8IFpNX01BWF9BUF9TVVBQT1JUKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCB3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQNjQgKSB8fAorICAgICAgICAgICAgICAgICAgICAoIHdkLT5hcC5lbmNyeU1vZGVbdmFwXSA9PSBaTV9XRVAxMjggKSB8fAorICAgICAgICAgICAgICAgICAgICAoIHdkLT5hcC5lbmNyeU1vZGVbdmFwXSA9PSBaTV9XRVAyNTYgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdTE2X3QgaWQ7CisgICAgICAgICAgICAgICAgdTE2X3QgYWRkclszXTsKKworICAgICAgICAgICAgICAgIGFkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgICAgIGFkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrMik7CisgICAgICAgICAgICAgICAgYWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgICAgICAgICAgICAgIC8qIEZpbmQgU1RBJ3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID09IFpNX1RLSVApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID09IFpNX0FFUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDg7IC8vIEFFUyBNSUMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vKnBJY3ZMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgKnBJY3ZMZW49IDE2OworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdEUyBwb3J0IGNoZWNraW5nICovCisgICAgICAgICAgICBpZiAoKHdkc1BvcnQgPSB2YXAgLSAweDIwKSA+PSBaTV9NQVhfV0RTX1NVUFBPUlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2RzUG9ydCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2QtPmFwLndkcy5lbmNyeU1vZGVbd2RzUG9ydF0pCisJCQl7CisJCQljYXNlIFpNX1dFUDY0OgorCQkJY2FzZSBaTV9XRVAxMjg6CisJCQljYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFpNX1RLSVA6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBaTV9BRVM6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSAwOworCQkJCWJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDE4OworICAgICAgICAgICAgICAgICpwSWN2TGVuID0gMTY7CisJCQkJYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCQkJfS8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICAgICAgfQorICAgIH0KKwllbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogdGVzdDogNjUxOCBmb3IgUUEgYXV0byB0ZXN0ICovCisgICAgICAgIHN3aXRjaCAoZW5jcnlNb2RlKQorCQl7CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgICpwSXZMZW4gPSA0OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgWk1fVEtJUDoKKyAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgWk1fQUVTOgorICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAqcEljdkxlbiA9IDA7CisJCQlicmVhazsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICAqcEl2TGVuID0gMTg7CisgICAgICAgICAgICAqcEljdkxlbiA9IDE2OworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwkJfS8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCAoZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgKGVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAoZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICB7CisgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICpwSWN2TGVuID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX1RLSVAgKQorICAgICAgICB7CisgICAgICAgICAgICAqcEl2TGVuID0gODsKKyAgICAgICAgICAgICpwSWN2TGVuID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA4OyAvLyBBRVMgTUlDCisgICAgICAgIH0KKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX0NFTkMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwSXZMZW4gPSAxODsKKyAgICAgICAgICAgICpwSWN2TGVuPSAxNjsKKyAgICAgICAgfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdpbmdEZWZyYWdMaXN0ICAgICAgICAgICAqLworLyogICAgICBGb3JjZSBmbHVzaGluZyB3aG9sZSBkZWZyYWcgbGlzdCBvciBhZ2luZyB0aGUgYnVmZmVyICAgICAgICAgICAgKi8KKy8qICAgICAgaW4gdGhlIGRlZnJhZyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsdXNoRmxhZyA6IDE9PmZsdXNoaW5nLCAwPT5BZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQWdpbmdEZWZyYWdMaXN0KHpkZXZfdCogZGV2LCB1MTZfdCBmbHVzaEZsYWcpCit7CisgICAgdTE2X3QgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IoaT0wOyBpPFpNX01BWF9ERUZSQUdfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKHdkLT50aWNrIC0gd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLnRpY2spID4KKyAgICAgICAgICAgICAgICAgICAgICAgIChaTV9ERUZSQUdfQUdJTkdfVElNRV9TRUMgKiBaTV9USUNLX1BFUl9TRUNPTkQpKQorICAgICAgICAgICAgICAgfHwgKGZsdXNoRmxhZyAhPSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJBZ2luZyBkZWZyYWcgbGlzdCA6IiwgaSk7CisgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgYnVmZmVycyBpbiB0aGUgZGVmcmFnIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50W2pdLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdDb3VudCA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QgICovCisvKiAgICAgIEFkZCBmaXJzdCBmcmFnbWVudCB0byBkZWZyYWdtZW50IGxpc3QsIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSAgICAqLworLyogICAgICB3aWxsIGJlIHNlbGVjdGVkLiBJZiB0aGUgbGlzdCBpcyBmdWxsLCBzZXF1ZW50aWFsbHkgc2VsZWN0ICAgICAgKi8KKy8qICAgICAgb25lIGVudHJ5IGZvciByZXBsYWNlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGZpcnN0IGZyYWdtZW50IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogYWRkcmVzcyBvZiBmaXJzdCBmcmFnbWVudCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VxTnVtIDogc2VxdWVuY2Ugb2YgZmlyc3QgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBhZGRyLCB1MTZfdCBzZXFOdW0pCit7CisgICAgdTE2X3QgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBGaW5kIGFuIGVtcHR5IG9uZSBpbiBkZWZyYWcgbGlzdCAqLworICAgIGZvcihpPTA7IGk8Wk1fTUFYX0RFRlJBR19FTlRSSUVTOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgZnVsbCwgc2VxdWVudGlhbGx5IHJlcGxhY2UgZXhpc3Rpbmcgb25lICovCisgICAgaWYgKGkgPT0gWk1fTUFYX0RFRlJBR19FTlRSSUVTKQorICAgIHsKKyAgICAgICAgaSA9IHdkLT5kZWZyYWdUYWJsZS5yZXBsYWNlTnVtKysgJiAoWk1fTUFYX0RFRlJBR19FTlRSSUVTLTEpOworICAgICAgICAvKiBGcmVlIHRoZSBidWZmZXJzIGluIHRoZSBkZWZyYWcgbGlzdCB0byBiZSByZXBsYWNlZCAqLworICAgICAgICBmb3IgKGo9MDsgajx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRbal0sIDApOworICAgICAgICB9CisgICAgfQorCisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdDb3VudCA9IDE7CisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50WzBdID0gYnVmOworICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5zZXFOdW0gPSBzZXFOdW07CisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLnRpY2sgPSB3ZC0+dGljazsKKworICAgIGZvciAoaj0wOyBqPDY7IGorKykKKyAgICB7CisgICAgICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5hZGRyW2pdID0gYWRkcltqXTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFkZEZyYWdUb0RlZnJhZ0xpc3QgICAgICAgKi8KKy8qICAgICAgQWRkIG1pZGRsZSBvciBsYXN0IGZyYWdtZW50IHRvIGRlZnJhZ21lbnQgbGlzdC4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGZpcnN0IGZyYWdtZW50IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogYWRkcmVzcyBvZiBmcmFnbWVudCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VxTnVtIDogc2VxdWVuY2UgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZyYWdOdW0gOiBmcmFnbWVudCBudW1iZXIgb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtb3JlRnJhZyA6IG1vcmUgZnJhZyBiaXQgb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkSW5mbyA6IGFkZGl0aW9uIGluZm8gb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZBZGRGcmFnVG9EZWZyYWdMaXN0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogYWRkciwKKyAgICAgICAgdTE2X3Qgc2VxTnVtLCB1OF90IGZyYWdOdW0sIHU4X3QgbW9yZUZyYWcsCisgICAgICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHpidWZfdCogcmV0dXJuQnVmID0gTlVMTDsKKyAgICB1MTZfdCBkZWZyYWdEb25lID0gMDsKKyAgICB1MTZfdCBsZW5FcnIgPSAwOworICAgIHUxNl90IHN0YXJ0QWRkciwgZnJhZ0hlYWQsIGZyYW1lTGVuLCBpdkxlbiwgaWN2TGVuOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIEZpbmQgZnJhZyBpbiB0aGUgZGVmcmFnIGxpc3QgKi8KKyAgICBmb3IoaT0wOyBpPFpNX01BWF9ERUZSQUdfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb21wYXJlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGZvciAoaj0wOyBqPDY7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcltqXSAhPSB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uYWRkcltqXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqID09IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ29tcGFyZSBzZXF1ZW5jZSBhbmQgZnJhZ21lbnQgbnVtYmVyICovCisgICAgICAgICAgICAgICAgaWYgKHNlcU51bSA9PSB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uc2VxTnVtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmcmFnTnVtID09IHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmcmFnTnVtIDwgOCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBmcmFnIGZyYW1lIHRvIGRlZnJhZyBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRbZnJhZ051bV0gPSBidWY7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZyYWdEb25lID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vcmVGcmFnID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgYWxsIGZyYWdtZW50IGlmIG1vcmUgZGF0YSBiaXQgaXMgY2xlYXJlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkJ1ZiA9IHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnbWVudFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFkZHIgPSB6ZndCdWZHZXRTaXplKGRldiwgcmV0dXJuQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIFdMQU4gaGVhZGVyIDI0KERhdGEpIG9yIDI2KFFvUyBEYXRhKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdIZWFkID0gMjQgKyAoKHptd19yeF9idWZfcmVhZGgoZGV2LCByZXR1cm5CdWYsIDApICYgMHg4MCkgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZHZXRSeEl2SWN2TGVuZ3RoKGRldiwgcmV0dXJuQnVmLCAwLCAmaXZMZW4sICZpY3ZMZW4sIGFkZEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdIZWFkICs9IGl2TGVuOyAvKiBza2lwIElWICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MTsgazx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50W2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdGFydEFkZHIrZnJhbWVMZW4tZnJhZ0hlYWQpIDwgMTU2MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCByZXR1cm5CdWYsIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnbWVudFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBZGRyLCBmcmFnSGVhZCwgZnJhbWVMZW4tZnJhZ0hlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBZGRyICs9IChmcmFtZUxlbi1mcmFnSGVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5FcnIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRba10sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCByZXR1cm5CdWYsIHN0YXJ0QWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAobGVuRXJyID09IDEpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgcmV0dXJuQnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkZWZyYWdEb25lID09IDApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHJldHVybkJ1ZjsKK30KKworCisvKiByZXR1cm4gdmFsdWUgPSBOVUxMID0+IHNhdmUgb3IgZnJlZSB0aGlzIGZyYW1lICAgICAgICAgKi8KK3pidWZfdCogemZEZWZyYWdtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogcGJJc0RlZnJhZywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1OF90IGZyYWdOdW07CisgICAgdTE2X3Qgc2VxTnVtOworICAgIHU4X3QgbW9yZUZyYWdCaXQ7CisgICAgdThfdCBhZGRyWzZdOworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKQorCisgICAgKnBiSXNEZWZyYWcgPSBGQUxTRTsKKyAgICBzZXFOdW0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAyMik7CisgICAgZnJhZ051bSA9ICh1OF90KShzZXFOdW0gJiAweGYpOworICAgIG1vcmVGcmFnQml0ID0gKHptd19idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgWk1fQklUXzIpID4+IDI7CisKKyAgICBpZiAoKGZyYWdOdW0gPT0gMCkgJiYgKG1vcmVGcmFnQml0ID09IDApKQorICAgIHsKKyAgICAgICAgLyogTm90IHBhcnQgb2YgYSBmcmFnbWVudGF0aW9uICovCisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4RnJhZ21lbnRDb3VudCsrOworICAgICAgICBzZXFOdW0gPSBzZXFOdW0gPj4gNDsKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyW2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2kpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYWdOdW0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbW9yZSBmcmFnID0gMSAqLworICAgICAgICAgICAgLyogRmlyc3QgcGFydCBvZiBhIGZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMiwgIkZpcnN0IEZyYWcsIHNlcT0iLCBzZXFOdW0pOworICAgICAgICAgICAgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QoZGV2LCBidWYsIGFkZHIsIHNlcU51bSk7CisgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWlkZGxlIG9yIGxhc3QgcGFydCBvZiBhIGZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMiwgIkZyYWcgc2VxPSIsIHNlcU51bSk7CisgICAgICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJGcmFnIG1vcmVGcmFnQml0PSIsIG1vcmVGcmFnQml0KTsKKyAgICAgICAgICAgIGJ1ZiA9IHpmQWRkRnJhZ1RvRGVmcmFnTGlzdChkZXYsIGJ1ZiwgYWRkciwgc2VxTnVtLCBmcmFnTnVtLCBtb3JlRnJhZ0JpdCwgYWRkSW5mbyk7CisgICAgICAgICAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBiSXNEZWZyYWcgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisjaWYgWk1fUFJPVE9DT0xfUkVTUE9OU0VfU0lNVUxBVElPTgordTE2X3QgemZTd2FwKHUxNl90IG51bSkKK3sKKyAgICByZXR1cm4gKChudW0gPj4gOCkgKyAoKG51bSAmIDB4ZmYpIDw8IDgpKTsKK30KKworCit2b2lkIHpmUHJvdFJzcFNpbSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgZXRoVHlwZTsKKyAgICB1MTZfdCBhcnBPcDsKKyAgICB1MTZfdCBwcm90OworICAgIHUxNl90IHRlbXA7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBkaXBbMl07CisgICAgdTE2X3QgZHN0UG9ydDsKKyAgICB1MTZfdCBzcmNQb3J0OworCisgICAgZXRoVHlwZSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJldGhUeXBlPSIsIGV0aFR5cGUpOworCisgICAgLyogQVJQICovCisgICAgaWYgKGV0aFR5cGUgPT0gMHgwNjA4KQorICAgIHsKKyAgICAgICAgYXJwT3AgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgICAgIGRpcFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM4KTsKKyAgICAgICAgZGlwWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNDApOworICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJhcnBPcD0iLCBhcnBPcCk7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgImlwMD0iLCBkaXBbMF0pOworICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJpcDE9IiwgZGlwWzFdKTsKKworICAgICAgICAvL0FSUCByZXF1ZXN0IHRvIDE5Mi4xNjguMS4xNQorICAgICAgICBpZiAoKGFycE9wID09IDB4MDEwMCkgJiYgKGRpcFswXSA9PSAweGE4YzApICYmIChkaXBbMV0gPT0gMHgwZjAxKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMiwgIkFSUCIpOworICAgICAgICAgICAgLyogQVJQIHJlc3BvbnNlICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjAsIDB4MDIwMCk7CisKKyAgICAgICAgICAgIC8qIGRzdCBoYXJkd2FyZSBhZGRyZXNzICovCisKKyAgICAgICAgICAgIC8qIHNyYyBoYXJkd2FyZSBhZGRyZXNzICovCisgICAgICAgICAgICAvL3ptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgLy96bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgOCwgMHgwMDAwKTsKKyAgICAgICAgICAgIC8vem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDEwLCAweDAwMDApOworCisgICAgICAgICAgICAvKiBkc3QgaXAgYWRkcmVzcyAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMisoaSoyKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMyKyhpKjIpLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3JjIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMiwgMHhhMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCwgMHgwMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNiwgMHgwMDAwKTsKKworICAgICAgICAgICAgLyogc3JjIGlwIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCwgMHhhOGMwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAzMCwgMHgwZjAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJQ01QICovCisgICAgZWxzZSBpZiAoZXRoVHlwZSA9PSAweDAwMDgpCisgICAgeworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJJUCIpOworICAgICAgICBwcm90ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjMpOworICAgICAgICBkaXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzMCk7CisgICAgICAgIGRpcFsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMyKTsKKyAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAicHJvdD0iLCBwcm90KTsKKyAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiaXAwPSIsIGRpcFswXSk7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgImlwMT0iLCBkaXBbMV0pOworCisgICAgICAgIC8qIFBJTkcgcmVxdWVzdCB0byAxOTIuMTY4LjEuMTUgKi8KKyAgICAgICAgaWYgKChwcm90ID09IDB4MSkgJiYgKGRpcFswXSA9PSAweGE4YzApICYmIChkaXBbMV0gPT0gMHgwZjAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiSUNNUCIpOworICAgICAgICAgICAgLyogY2hhbmdlIGRzdCAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNoYW5nZSBzcmMgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDgsIDB4MDAwMCk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTAsIDB4MDAwMCk7CisKKyAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArKGkqMiksIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4LCAweDBmMDEpOworCisgICAgICAgICAgICAvKiBjaGFuZ2UgaWNtcCB0eXBlIHRvIGVjaG8gcmVwbHkgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgYnVmLCAzNCwgMHgwKTsKKworICAgICAgICAgICAgLyogdXBkYXRlIGljbXAgY2hlY2tzdW0gKi8KKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNik7CisgICAgICAgICAgICB0ZW1wICs9IDg7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzYsIHRlbXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHByb3QgPT0gMHg2KQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJUQ1AiKTsKKyAgICAgICAgICAgIHNyY1BvcnQgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNCk7CisgICAgICAgICAgICBkc3RQb3J0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzYpOworICAgICAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiU3JjIFBvcnQ9Iiwgc3JjUG9ydCk7CisgICAgICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJEc3QgUG9ydD0iLCBkc3RQb3J0KTsKKyAgICAgICAgICAgIGlmICgoZHN0UG9ydCA9PSAweDE1MDApIHx8IChzcmNQb3J0ID09IDB4MTUwMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiRlRQIik7CisKKyAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgZHN0ICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYrKGkqMikpOworICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHNyYyAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA4LCAweDAwMDApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCwgMHgwMDAwKTsKKworICAgICAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMwKyhpKjIpLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCwgMHgwZjAxKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgLyogUGF0Y2ggc3JjIHBvcnQgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAoemZTd2FwKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM0LCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzgpOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAoemZTd2FwKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM4LCB0ZW1wKTsKKworICAgICAgICAgICAgICAgIC8qIFBhdGNoIGNoZWNrc3VtICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDUwKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gemZTd2FwKHRlbXApOworICAgICAgICAgICAgICAgIHRlbXAgPSB+dGVtcDsKKyAgICAgICAgICAgICAgICB0ZW1wICs9IDI7CisgICAgICAgICAgICAgICAgdGVtcCA9IH50ZW1wOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAodGVtcCk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDUwLCB0ZW1wKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHJvdCA9PSAweDExKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgZHN0ICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYrKGkqMikpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCBpKjIsIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY2hhbmdlIHNyYyAqLworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsIDB4YTAwMCk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgOCwgMHgwMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCwgMHgwMDAwKTsKKworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiVURQIik7CisgICAgICAgICAgICBzcmNQb3J0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworICAgICAgICAgICAgZHN0UG9ydCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM2KTsKKyAgICAgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgIlNyYyBQb3J0PSIsIHNyY1BvcnQpOworICAgICAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiRHN0IFBvcnQ9IiwgZHN0UG9ydCk7CisKKyAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArKGkqMiksIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4LCAweDBmMDEpOworCisgICAgICAgICAgICAvKiBleGNoYW5nZSBwb3J0ICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzQsIHNyY1BvcnQrMSk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzYsIGRzdFBvcnQpOworCisgICAgICAgICAgICAvKiBjaGVja3N1bSA9IDAgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA0MCwgMCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIGlmIChldGhUeXBlID09IDB4MDA2MCkgLyogPT4weDAwNjAgaXMgcG9ydCAqLworICAgIHsKKyAgICAgICAgLyogY2hhbmdlIHNyYyBmb3IgRXZsIHRvb2wgbG9vcCBiYWNrIHJlY2VpdmUgKi8KKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsIDB4YTAwMCk7CisgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA4LCAweDAwMDApOworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTAsIDB4MDAwMCk7CisgICAgfQorCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVR4U2VuZEV0aCAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsZWQgdG8gbmF0aXZlIDgwMi4xMSBtYW5hZ2VtZW50IGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHBvcnQgOiBXTEFOIHBvcnQsIDA9PnN0YW5kYXJkLCAweDEtMHg3PT5WQVAsIDB4MjAtMHgyNT0+V0RTICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFJheSAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmaVR4U2VuZDgwMjExTWdtdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpCit7CisgICAgdTE2X3QgZXJyOworICAgIC8vdTE2X3QgYWRkclRibFNpemUgPSAwOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IGhsZW47CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7aTwxMjtpKyspCisgICAgeworICAgICAgICBoZWFkZXJbaV0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICB9CisgICAgaGxlbiA9IDI0OworCisgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgMjQpOworCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwLCAwKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworemxFcnJvcjoKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIHJldHVybiAwOworfQorCit1OF90IHpmaUlzVHhRdWV1ZUZ1bGwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICgoKCh3ZC0+dnR4cUhlYWRbMF0gKyAxKSAmIFpNX1ZUWFFfU0laRV9NQVNLKSAhPSB3ZC0+dnR4cVRhaWxbMF0pICkKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlUeFNlbmRFdGggICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGVkIHRvIHRyYW5zbWl0IEV0aGVybmV0IGZyYW1lIGZyb20gdXBwZXIgbGF5ZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwb3J0IDogV0xBTiBwb3J0LCAwPT5zdGFuZGFyZCwgMHgxLTB4Nz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS41ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB1MTZfdCBlcnIsIHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX1BFUkZPUk1BTkNFX1RYX01TRFUoZGV2LCB3ZC0+dGljayk7CisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZpVHhTZW5kRXRoKCksIHBvcnQ9IiwgcG9ydCk7CisgICAgLyogUmV0dXJuIGVycm9yIGlmIHBvcnQgaXMgZGlzYWJsZWQgKi8KKyAgICBpZiAoKGVyciA9IHpmVHhQb3J0Q29udHJvbChkZXYsIGJ1ZiwgcG9ydCkpID09IFpNX1BPUlRfRElTQUJMRUQpCisgICAgeworICAgICAgICBlcnIgPSBaTV9FUlJfVFhfUE9SVF9ESVNBQkxFRDsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworI2lmIDEKKyAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAmJiAocG9ydCA8IDB4MjApKQorICAgIHsKKyAgICAgICAgLyogQVAgOiBCdWZmZXIgZnJhbWUgZm9yIHBvd2VyIHNhdmluZyBTVEEgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkFwQnVmZmVyUHNGcmFtZShkZXYsIGJ1ZiwgcG9ydCkpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICggemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qY2hlY2sgWk1fRU5BQkxFX1BPV0VSX1NBVkUgZmxhZyovCisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfUFMKKyAgICAvKiBJQlNTIHBvd2VyLXNhdmluZyBtb2RlICovCisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgaWYgKCB6ZlN0YUlic3NQU1F1ZXVlRGF0YShkZXYsIGJ1ZikgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgMQorICAgIC8vaWYgKCB3ZC0+YlFvU0VuYWJsZSApCisgICAgaWYgKDEpCisgICAgeworICAgICAgICAvKiBQdXQgdG8gVlRYUVthY10gKi8KKyAgICAgICAgcmV0ID0gemZQdXRWdHhxKGRldiwgYnVmKTsKKworICAgICAgICAvKiBQdXNoIFZUWFFbYWNdICovCisgICAgICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0ID0gemZUeFNlbmRFdGgoZGV2LCBidWYsIHBvcnQsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyNlbHNlCisgICAgcmV0dXJuIHpmVHhTZW5kRXRoKGRldiwgYnVmLCBwb3J0LCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworI2VuZGlmCisKK3psRXJyb3I6CisgICAgem1fbXNnMl90eChaTV9MVl8xLCAiVHggQ29tcCBlcnI9IiwgZXJyKTsKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGggICAgICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxlZCB0byB0cmFuc21pdCBFdGhlcm5ldCBmcmFtZSBmcm9tIHVwcGVyIGxheWVyLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCwgMD0+c3RhbmRhcmQsIDB4MTAtMHgxNz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwgdTE2X3QgYnVmVHlwZSwgdTE2X3QgZmxhZykKK3sKKyAgICB1MTZfdCBlcnI7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCByZW1vdmVMZW47CisgICAgdTE2X3QgaGVhZGVyWyg4KzMwKzIrMTgpLzJdOyAgICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgaGVhZGVyTGVuOworICAgIHUxNl90IG1pY1s4LzJdOworICAgIHUxNl90IG1pY0xlbjsKKyAgICB1MTZfdCBzbmFwWzgvMl07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1MTZfdCBmcmFnTGVuOworICAgIHUxNl90IGZyYW1lTGVuOworICAgIHUxNl90IGZyYWdOdW07CisgICAgc3RydWN0IHpzRnJhZyBmcmFnOworICAgIHUxNl90IGksIGosIGlkOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBkYVszXTsKKyAgICB1MTZfdCBzYVszXTsKKyAgICB1OF90IHVwOworICAgIHU4X3QgcW9zVHlwZSwga2V5SWR4ID0gMDsKKyAgICB1MTZfdCBmcmFnT2ZmOworICAgIHUxNl90IG5ld0ZsYWc7CisgICAgc3RydWN0IHpzTWljVmFyKiAgcE1pY0tleTsKKyAgICB1OF90IHRraXBGcmFtZU9mZnNldCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgbmV3RmxhZyA9IGZsYWcgJiAweGZmMDA7CisgICAgZmxhZyA9IGZsYWcgJiAweGZmOworCisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZUeFNlbmRFdGgoKSwgcG9ydD0iLCBwb3J0KTsKKworICAgIC8qIEdldCBJUCBUT1MgZm9yIFFvUyBBQyBhbmQgSVAgZnJhZyBvZmZzZXQgKi8KKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKworICAgIC8vRU9TUCBiaXQKKyAgICBpZiAobmV3RmxhZyAmIDB4MTAwKQorICAgIHsKKyAgICAgICAgdXAgfD0gMHgxMDsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpOworICAgICAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KTsKKyAgICAgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBEQSAqLworICAgICAgICBkYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgICAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDYpOworICAgICAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgICAgICAvKiBTQSAqLworICAgICAgICBzYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE2KTsKKyAgICAgICAgc2FbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgICAgIHNhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLworICAgIH0KKyNlbHNlCisgICAgLyogREEgKi8KKyAgICBkYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAvKiBTQSAqLworICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgc2FbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKyAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyNlbmRpZgorICAgIC8vRGVjaWRlIEtleSBJbmRleCBpbiBBVE9NLCBObyBtZWFuaW5nIGluIE9UVVMtLUNXWWFuZyhtKQorICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGtleUlkeCA9IHdkLT5hcC5iY0hhbEtleUlkeFtwb3J0XTsKKyAgICAgICAgaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRhKTsKKyAgICAgICAgaWYgKGlkICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBjYXNlIFpNX0NFTkM6CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIGtleUlkeCA9IHdkLT5hcC5zdGFUYWJsZVtpZF0ua2V5SWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaCAod2QtPnN0YS5lbmNyeU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgY2FzZSBaTV9XRVAxMjg6CisgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAga2V5SWR4ID0gd2QtPnN0YS5rZXlJZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgaWYgKChkYVswXSAmIDB4MSkpCisgICAgICAgICAgICAgICAga2V5SWR4ID0gNTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBrZXlJZHggPSA0OworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgY2FzZSBaTV9DRU5DOgorICAgICAgICAgICAga2V5SWR4ID0gd2QtPnN0YS5jZW5jS2V5SWQ7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDcmVhdGUgU05BUCAqLworICAgIHJlbW92ZUxlbiA9IHpmVHhHZW5XbGFuU25hcChkZXYsIGJ1Ziwgc25hcCwgJnNuYXBMZW4pOworICAgIC8vem1fbXNnMV90eChaTV9MVl8wLCAiZnJhZ09mZj0iLCBmcmFnT2ZmKTsKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBBZGQgMjAwNzEwMjUgTXh6ZW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRXRoZXJuZXQgOiBmcmFtZUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS02LS0rLS02LS0rLS0yLS0rLS0tLS0yMC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tIFZhcmlhYmxlIC0tLS0tLS0rLS0tLS0tLS0tICovCisvKiAgICB8ICBEQSB8ICBTQSB8IFR5cGV8ICBJUCBIZWFkZXIgfCBUQ1AoMjApIFVEUCgxMikgSUNNUCg4KSB8IEFwcGxpY2F0aW9uIFBheWxvYWQgTCB8ICAgICAgICAgICovCisvKiAtLS0rLS0tLS0rLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tICovCisvKiAgTVNEVSA9IDYgKyA2ICsgMiArICggTmV0d29yayBMYXllciBoZWFkZXIgKSArICggVHJhbnNwb3J0IExheWVyIGhlYWRlciApICsgTCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTVNEVSAtIERBIC0gU0EgOiBmcmFtZUxlbiAtPSByZW1vdmVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS0yLS0rLS0tLS0yMC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tIFZhcmlhYmxlIC0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICB8IFR5cGV8IElQIEhlYWRlciAgfCBUQ1AoMjApIFVEUCgxMikgSUNNUCg4KSB8IEFwcGxpY2F0aW9uIFBheWxvYWQgTCB8ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkJCQkJCQkJCQkJCSAgKi8KKy8qICBNUERVIDogZnJhbWVMZW4gKyBtcGR1TGVuZ3RoT2Zmc2V0IDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0rLS0tMi0tLSstLS0tMi0tLSstNi0rLTYtKy0tNi0tKy0tLTItLS0tKy0tMS0tKy0tMS0rLS0tMS0tLSstLS0tLS0tMy0tLS0tLSstZnJhbWVMZW4tKy0tLTQtLSstICovCisvKiAgfCBmcmFtZSB8ZHVyYXRpb258IERBfFNBIHxCU1NJRHxzZXF1ZW5jZXxTTkFQIHxTTkFQfENvbnRyb2x8ICAgIFJGQyAxMDQyICB8ICAgICAgICAgIHwgIEZDUyB8ICAqLworLyogIHxDb250cm9sfCAgICAgICAgfCAgIHwgICB8ICAgICB8IG51bWJlciB8RFNBUCB8U1NBUHwgICAgICAgfCBlbmNhcHN1bGF0aW9ufCAgICAgICAgICB8ICAgICAgfCAgKi8KKy8qIC0rLS0tLS0tLSstLS0tLS0tLSstLS0rLS0tKy0tLS0tKy0tLS0tLS0tKy0tLS0tKy0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLSstICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgdGtpcEZyYW1lT2Zmc2V0ID0gODsKKworICAgIGZyYWdMZW4gPSB3ZC0+ZnJhZ1RocmVzaG9sZCArIHRraXBGcmFtZU9mZnNldDsgICAvLyBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCBmb3IgTVBEVSBMZW5ndGhzCisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsgICAgLy8gTVNEVSBMZW5ndGhzCisgICAgZnJhbWVMZW4gLT0gcmVtb3ZlTGVuOyAgICAgICAgICAgICAgICAgLy8gTVNEVSBMZW5ndGhzIC0gREEgLSBTQQorCisgICAgLyogIzFzdCBjcmVhdGUgTUlDIExlbmd0aCBtYW51YWxseSAqLworICAgIG1pY0xlbiA9IDA7CisKKyAgICAvKiBBY2Nlc3MgQ2F0ZWdvcnkgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB6ZkFwR2V0U3RhUW9zVHlwZShkZXYsIGRhLCAmcW9zVHlwZSk7CisgICAgICAgIGlmIChxb3NUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1cCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IFNUQSBRb1MgY29udHJvbCBmaWVsZCAqLworICAgICAgICB1cCA9IDA7CisgICAgfQorCisgICAgLyogIzJuZCBBc3NpZ24gc2VxdWVuY2UgbnVtYmVyICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmcmFnLnNlcVswXSA9ICgod2QtPnNlcVt6Y1VwVG9BY1t1cCYweDddXSsrKSA8PCA0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogIzNyZCBQYXNzIHRoZSB0b3RhbCBwYXlsb2FkIHRvIGdlbmVyYXRlIE1QRFUgbGVuZ3RoICEgKi8KKyAgICBmcmFnLmJ1ZlswXSA9IGJ1ZjsKKyAgICBmcmFnLmJ1ZlR5cGVbMF0gPSBidWZUeXBlOworICAgIGZyYWcuZmxhZ1swXSA9ICh1OF90KWZsYWc7CisgICAgZnJhZ051bSA9IDE7CisKKyAgICBoZWFkZXJMZW4gPSB6ZlR4R2VuV2xhbkhlYWRlcihkZXYsIGZyYWcuYnVmWzBdLCBoZWFkZXIsIGZyYWcuc2VxWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuZmxhZ1swXSwgc25hcExlbittaWNMZW4sIHJlbW92ZUxlbiwgcG9ydCwgZGEsIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwLCAmbWljTGVuLCBzbmFwLCBzbmFwTGVuLCBOVUxMKTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiIzEgaGVhZGVyTGVuID0gIiwgaGVhZGVyTGVuKTsKKworICAgIC8qICM0dGggQ2hlY2sgdGhlIEhlYWRlckxlbiBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIE1QRFUgTGVuZ3RocyBiaWdnZXIgdGhhbiBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCAgKi8KKyAgICAvKiBJZiBNUERVIExlbmd0aHMgbGFyZ2UgdGhhbiBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAtLT4gaGVhZGVyTGVuID0gMCAqLworICAgIGlmKCBoZWFkZXJMZW4gIT0gMCApCisgICAgeworICAgICAgICB6ZjgwMjExRnJhbWVTZW5kKGRldiwgZnJhZy5idWZbMF0sIGhlYWRlciwgc25hcExlbiwgZGEsIHNhLCB1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMZW4sIHNuYXAsIG1pYywgbWljTGVuLCByZW1vdmVMZW4sIGZyYWcuYnVmVHlwZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6Y1VwVG9BY1t1cCYweDddLCBrZXlJZHgpOworICAgIH0KKyAgICBlbHNlIC8vaWYoIGhlYWRlckxlbiA9PSAwICkgLy8gTmVlZCB0byBiZSBmcmFnbWVudGVkCisgICAgeworICAgICAgICB1MTZfdCBtcGR1TGVuZ3RoT2Zmc2V0OworICAgICAgICB1MTZfdCBwc2V1ZFNuYXBMZW4gPSAwOworCisgICAgICAgIG1wZHVMZW5ndGhPZmZzZXQgPSBoZWFkZXJbMF0gLSBmcmFtZUxlbjsgLy8gRm9yIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICEKKworICAgICAgICBtaWNMZW4gPSB6ZlR4R2VuV2xhblRhaWwoZGV2LCBidWYsIHNuYXAsIHNuYXBMZW4sIG1pYyk7IC8vIEdldCBzbmFwIGFuZCBtaWMgaW5mb3JtYXRpb24KKworICAgICAgICBmcmFnTGVuID0gZnJhZ0xlbiAtIG1wZHVMZW5ndGhPZmZzZXQ7CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCIjMiBmcmFtZUxlbiA9ICIsIGZyYW1lTGVuKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCIjMyBmcmFnVGhyZXNob2xkID0gIiwgZnJhZ0xlbik7CisKKyAgICAgICAgLyogZnJhZ21lbnRhdGlvbiAqLworICAgICAgICBpZiAoZnJhbWVMZW4gPj0gZnJhZ0xlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy9jb3B5IGZyYWdMZW4gdG8gZnJhZworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSggZnJhbWVMZW4gPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZyYWcuYnVmW2ldID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBmcmFnTGVuKzMyKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZyYWcuYnVmVHlwZVtpXSA9IFpNX0lOVEVSTkFMX0FMTE9DX0JVRjsKKyAgICAgICAgICAgICAgICAgICAgZnJhZy5zZXFbaV0gPSBmcmFnLnNlcVswXSArIGk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJlbW92ZUxlbiArIGkqZnJhZ0xlbjsKKworICAgICAgICAgICAgICAgICAgICAvKiBDb25zaWRlciB0aGUgb2Zmc2V0IGlmIHdlIGNvbnNpZGVyIHNuYXAgbGVuZ3RoIHRvIHRoZSBvdGhlciBmcmFnbWVudGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIGlmICggaSA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIHBzZXVkU25hcExlbiooaS0xKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMZW4gPiBmcmFnTGVuICsgcHNldWRTbmFwTGVuKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLmZsYWdbaV0gPSBmbGFnIHwgMHg0OyAvKiBNb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGZyYWdtZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBTTkFQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8c25hcExlbjsgais9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgZnJhZy5idWZbaV0sIGosIHNuYXBbKGo+PjEpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhCdWZmZXJDb3B5KGRldiwgZnJhZy5idWZbaV0sIGJ1Ziwgc25hcExlbiwgb2Zmc2V0LCBmcmFnTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgZnJhZy5idWZbaV0sIHNuYXBMZW4rZnJhZ0xlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcHNldWQgc25hcCBsZW5ndGggdG8gdGhlIG90aGVyIGZyYWdtZW50ZWQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZFNuYXBMZW4gPSBzbmFwTGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gLT0gZnJhZ0xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybWVkaWF0ZSBGcmFnbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemZUeEJ1ZmZlckNvcHkoZGV2LCBmcmFnLmJ1ZltpXSwgYnVmLCAwLCBvZmZzZXQsIGZyYWdMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemZ3QnVmU2V0U2l6ZShkZXYsIGZyYWcuYnVmW2ldLCBmcmFnTGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhCdWZmZXJDb3B5KGRldiwgZnJhZy5idWZbaV0sIGJ1ZiwgMCwgb2Zmc2V0LCBmcmFnTGVuK3BzZXVkU25hcExlbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBmcmFnLmJ1ZltpXSwgZnJhZ0xlbitwc2V1ZFNuYXBMZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gLT0gKGZyYWdMZW4rcHNldWRTbmFwTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZnJhbWVMZW4gLT0gZnJhZ0xlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgZnJhZ21lbnQgICovCisgICAgICAgICAgICAgICAgICAgICAgICB6ZlR4QnVmZmVyQ29weShkZXYsIGZyYWcuYnVmW2ldLCBidWYsIDAsIG9mZnNldCwgZnJhbWVMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIE1JQyBpZiBuZWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1pY0xlbiApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9SeEJ1ZmZlcihkZXYsIGZyYWcuYnVmW2ldLCAodThfdCopIG1pYywgZnJhbWVMZW4sIG1pY0xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgZnJhZy5idWZbaV0sIGZyYW1lTGVuK21pY0xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLmZsYWdbaV0gPSAodThfdClmbGFnOyAvKiBObyBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBwYXkgYXR0ZW50aW9uIHRvIHRoZSBpbmRleCBvZiB0aGUgYnVmICEhIQorICAgICAgICAgICAgICAgIC8vIElmIHdyaXRlIHRvIG51bGwgYnVmICwgdGhlIE9TIHdpbGwgY3Jhc2ggISEhCisgICAgICAgICAgICAgICAgemZ3Q29weUJ1ZkNvbnRleHQoZGV2LCBidWYsIGZyYWcuYnVmW2ktMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ051bSA9IGk7CisgICAgICAgICAgICBzbmFwTGVuID0gbWljTGVuID0gcmVtb3ZlTGVuID0gMDsKKworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTxmcmFnTnVtOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBXTEFOIGhlYWRlcihDb250cm9sIFNldHRpbmcgKyA4MDIuMTEgaGVhZGVyICsgSVYpICovCisgICAgICAgICAgICBoZWFkZXJMZW4gPSB6ZlR4R2VuV2xhbkhlYWRlcihkZXYsIGZyYWcuYnVmW2ldLCBoZWFkZXIsIGZyYWcuc2VxW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy5mbGFnW2ldLCBzbmFwTGVuK21pY0xlbiwgcmVtb3ZlTGVuLCBwb3J0LCBkYSwgc2EsIHVwLCAmbWljTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcCwgc25hcExlbiwgTlVMTCk7CisKKyAgICAgICAgICAgIHpmODAyMTFGcmFtZVNlbmQoZGV2LCBmcmFnLmJ1ZltpXSwgaGVhZGVyLCBzbmFwTGVuLCBkYSwgc2EsIHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMZW4sIHNuYXAsIG1pYywgbWljTGVuLCByZW1vdmVMZW4sIGZyYWcuYnVmVHlwZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemNVcFRvQWNbdXAmMHg3XSwga2V5SWR4KTsKKworICAgICAgICB9IC8qIGZvciAoaT0wOyBpPGZyYWdOdW07IGkrKykgKi8KKyAgICB9CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZUeFBvcnRDb250cm9sICAgICAgICAgICAgICovCisvKiAgICAgIENoZWNrIHBvcnQgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwb3J0IDogcG9ydCBudW1iZXIsIDA9PnN0YW5kYXJkLCAxMC0xNz0+VmlydHVhbCBBUCwgMjAtMjU9PldEUyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBaTV9QT1JUX0VOQUJMRUQgb3IgWk1fUE9SVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaWduYXR1cmUgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS40ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZUeFBvcnRDb250cm9sKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzMsICJQYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGRpc2Nvbm5lY3Qgc3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBaTV9QT1JUX0RJU0FCTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFpNX1BPUlRfRU5BQkxFRDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZklkbFJlY3YgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRG8gZnJhbWUgdmFsaWRhdGlvbiBhbmQgZmlsdGVyaW5nIHRoZW4gcGFzcyB0byB6ZndSZWN2ODAyMTEoKS4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIDgwMi4xMSBmcmFtZSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3QgcmV0ID0gMDsKKyAgICB1MTZfdCBic3NpZFszXTsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIC8qIHRhbGx5ICovCisgICAgd2QtPmNvbW1UYWxseS5Ecml2ZXJSeEZybUNudCsrOworCisgICAgYnNzaWRbMF0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgYnNzaWRbMV0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgYnNzaWRbMl0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisKKyAgICAvKiBWYWxpZGF0ZSBSeCBmcmFtZSAqLworICAgIGlmICgocmV0ID0gemZXbGFuUnhWYWxpZGF0ZShkZXYsIGJ1ZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzEsICJSeCBpbnZhbGlkOiIsIHJldCk7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAvLyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgLyoKKyAgICAgKiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKyAgICB0aWRfcnggPSB6ZkFnZ1J4RW5hYmxlZChkZXYsIGJ1Zik7CisgICAgaWYgKHRpZF9yeCAmJiB3ZC0+cmVvcmRlcikKKyAgICB7CisgICAgICAgIHpmQWdnUngoZGV2LCBidWYsIGFkZEluZm8sIHRpZF9yeCk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKgorICAgICAqIGVuZCBvZiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKyAgICAvLyNlbmRpZgorI2VuZGlmCisKKyAgICAvKiBGaWx0ZXIgUnggZnJhbWUgKi8KKyAgICBpZiAoKHJldCA9IHpmV2xhblJ4RmlsdGVyKGRldiwgYnVmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHptX21zZzFfcngoWk1fTFZfMSwgIlJ4IGR1cGxpY2F0ZWQ6IiwgcmV0KTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIC8qIERpc2NhcmQgZXJyb3IgZnJhbWUgZXhjZXB0IG1pYyBmYWlsdXJlICovCisgICAgaWYgKChhZGRJbmZvLT5UYWlsLkRhdGEuRXJyb3JJbmRpY2F0aW9uICYgMHgzZikgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICggd2QtPlhMaW5rTW9kZSAmJiAoKGFkZEluZm8tPlRhaWwuRGF0YS5FcnJvckluZGljYXRpb24gJiAweDNmKT09MHgxMCkgJiYKKyAgICAgICAgICAgICB6ZkNvbXBhcmVXaXRoQnNzaWQoZGV2LCBic3NpZCkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBCeXBhc3MgZnJhbWVzICEhIQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBPVFVTIGNvbW1hbmQtODIxMiBkdW1wIHJ4IHBhY2tldCAqLworICAgIGlmICh3ZC0+cnhQYWNrZXREdW1wKQorICAgIHsKKyAgICAgICAgemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisgICAgfQorCisgICAgLyogQ2FsbCB6ZndSZWN2ODAyMTEoKSB3cmFwcGVyIGZ1bmN0aW9uIHRvIGRlbGl2ZXIgUnggcGFja2V0ICovCisgICAgLyogdG8gZHJpdmVyIGZyYW1ld29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsgLy9DV1lhbmcobSkKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuOworCit6bEVycm9yOgorICAgIHptX21zZzFfcngoWk1fTFZfMSwgIkZyZWUgcGFja2V0LCBlcnJvciBjb2RlOiIsIHJldCk7CisKKyAgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybSsrOworCisgICAgLyogRnJlZSBSeCBidWZmZXIgKi8KKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgIHJldHVybjsKK30KKworCit2b2lkIHpmU2hvd1J4RUFQT0woemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdThfdCAgIHBhY2tldFR5cGUsIGtleVR5cGUsIGNvZGUsIGlkZW50aWZpZXIsIHR5cGUsIGZsYWdzOworICAgIHUxNl90ICBwYWNrZXRMZW4sIGtleUluZm8sIGtleUxlbiwga2V5RGF0YUxlbiwgbGVuZ3RoLCBPcF9Db2RlOworICAgIHUzMl90ICByZXBsYXlDb3VudGVySCwgcmVwbGF5Q291bnRlckwsIHZlbmRvcklkLCBWZW5kb3JUeXBlOworCisgICAgLyogRUFQT0wgcGFja2V0IHR5cGUgKi8KKyAgICBwYWNrZXRUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOyAvLyAwOiBFQVAtUGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTogRUFQT0wtU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyOiBFQVBPTC1Mb2dvZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzOiBFQVBPTC1LZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0OiBFQVBPTC1FbmNhcHN1bGF0ZWQtQVNGLUFsZXJ0CisKKyAgICAvKiBFQVBPTCBmcmFtZSBmb3JtYXQgKi8KKyAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgIC8qICAgICAgICAgICAgUEFFIEV0aGVybmV0IFR5cGUgKDB4ODg4ZSkgICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAyICovCisgICAgLyogICAgIFByb3RvY29sIFZlcnNpb24gICAgfCAgICAgICAgIFR5cGUgICAgICAgICAgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gNiAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICBQYWNrZXQgQm9keSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOICovCisKKyAgICAvKiBFQVBPTCBib2R5IGxlbmd0aCAqLworICAgIHBhY2tldExlbiA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyk7CisKKyAgICBpZiggcGFja2V0VHlwZSA9PSAwICkKKyAgICB7IC8vIEVBUC1QYWNrZXQKKworICAgICAgICAvKiBFQVAtUGFja2V0IENvZGUgKi8KKyAgICAgICAgY29kZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsgLy8gMSA6IFJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiA6IFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgOiBTdWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgOiBGYWlsdXJlCisgICAgICAgIC8vIEFuIEVBUCBwYWNrZXQgb2YgdGhlIHR5cGUgb2YgU3VjY2VzcyBhbmQgRmFpbHVyZSBoYXMgbm8gRGF0YSBmaWVsZCwgYW5kIGhhcyBhIGxlbmd0aCBvZiA0LgorCisgICAgICAgIC8qIEVBUCBQYWNrZXQgZm9ybWF0ICovCisgICAgICAgIC8qICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgICAgICAvKiAgICAgICAgICAgQ29kZSAgICAgICAgICB8ICAgICAgICBJZGVudGlmaWVyICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDIgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQiKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiUGFja2V0IExlbmd0aCA9ICIsIHBhY2tldExlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgQ29kZSA9ICIsIGNvZGUpOworCisgICAgICAgIGlmKCBjb2RlID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFR5cGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7IC8vIDEgICA6IElkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyICAgOiBOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgICA6IE5hayAoUmVzcG9uc2UgT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgICA6IE1ENS1DaGFsbGVuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgICA6IE9uZSBUaW1lIFBhc3N3b3JkIChPVFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2ICAgOiBHZW5lcmljIFRva2VuIENhcmQgKEdUQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NCA6IChFeHBhbmRlZCBUeXBlcylXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NSA6IEV4cGVyaW1lbnRhbCBVc2UKKworICAgICAgICAgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gYW4gRUFQIHBhY2tldCBvZiB0aGUgdHlwZSBvZiBSZXF1ZXN0IG9yIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtYXQgc2hvd24gYmVsbG93aW5nICovCisgICAgICAgICAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICBOICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgVHlwZSAgICAgICAgICB8ICAgICAgICBUeXBlIERhdGEgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBUeXBlID0gIiwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBJZGVudGl0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBNRDUtQ2hhbGxlbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBPbmUgVGltZSBQYXNzd29yZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgR2VuZXJpYyBUb2tlbiBDYXJkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDI1NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IFdpLUZpIFByb3RlY3RlZCBTZXR1cCIpOworCisgICAgICAgICAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICBUeXBlICAgICAgfCAgICAgICAgICAgICAgIFZlbmRvci1JZCAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3ItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICBWZW5kb3IgZGF0YS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgSWRlbnRpZmllciAqLworICAgICAgICAgICAgaWRlbnRpZmllciA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KTsKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgTGVuZ3RoICovCisgICAgICAgICAgICBsZW5ndGggPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzcpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBUeXBlICovCisgICAgICAgICAgICB0eXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IElkZW50aWZpZXIgPSAiLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgTGVuZ3RoID0gIiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgVHlwZSA9ICIsIHR5cGUpOworCisgICAgICAgICAgICBpZiggdHlwZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIElkZW50aXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBOb3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IE5hayIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTUQ1LUNoYWxsZW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA1ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgT25lIFRpbWUgUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IEdlbmVyaWMgVG9rZW4gQ2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyNTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVzcG9uc2UgV2ktRmkgUHJvdGVjdGVkIFNldHVwIik7CisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFN1Y2Nlc3MiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGNvZGUgPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgRmFpbHVyZSIpOworCisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IExlbmd0aCAqLworICAgICAgICAgICAgbGVuZ3RoID0gKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBJZGVudGlmaWVyID0gIiwgaWRlbnRpZmllcik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IExlbmd0aCA9ICIsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSAxICkKKyAgICB7IC8vIEVBUE9MLVN0YXJ0CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLVN0YXJ0Iik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMiApCisgICAgeyAvLyBFQVBPTC1Mb2dvZmYKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQT0wtTG9nb2ZmIik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMyApCisgICAgeyAvLyBFQVBPTC1LZXkKKyAgICAgICAgLyogRUFQT0wtS2V5IHR5cGUgKi8KKyAgICAgICAga2V5VHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsKKyAgICAgICAgLyogRUFQT0wtS2V5IGluZm9ybWF0aW9uICovCisgICAgICAgIGtleUluZm8gPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CisgICAgICAgIC8qIEVBUE9MLUtleSBsZW5ndGggKi8KKyAgICAgICAga2V5TGVuID0gKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIC8qIEVBUE9MLUtleSByZXBsYXkgY291bnRlciAoaGlnaCBkb3VibGUgd29yZCkgKi8KKyAgICAgICAgcmVwbGF5Q291bnRlckggPSAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzkpKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICAgICAgLyogRUFQT0wtS2V5IHJlcGxheSBjb3VudGVyIChsb3cgZG91YmxlIHdvcmQpICovCisgICAgICAgIHJlcGxheUNvdW50ZXJMID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMykpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNCkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNSkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTYpOworICAgICAgICAvKiBFQVBPTC1LZXkgZGF0YSBsZW5ndGggKi8KKyAgICAgICAga2V5RGF0YUxlbiA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTcpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTgpOworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUtleSIpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJwYWNrZXQgbGVuZ3RoID0gIiwgcGFja2V0TGVuKTsKKworICAgICAgICBpZiAoIGtleVR5cGUgPT0gMjU0ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgia2V5IHR5cGUgPSAyNTQgKFNTTiBrZXkgZGVzY3JpcHRvcikiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoImtleSB0eXBlID0gMHgiLCBrZXlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzIoInJlcGxheSBjb3VudGVyKEwpID0gIiwgcmVwbGF5Q291bnRlckwpOworCisgICAgICAgIHptX2RlYnVnX21zZzIoImtleSBpbmZvcm1hdGlvbiA9ICIsIGtleUluZm8pOworCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF8zICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFpcndpc2Uga2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIgICAgLSBncm91cCBrZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF82ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IGluc3RhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF83ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5lZWRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5vdCBuZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF84ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIHNldCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF85ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IGVuY3J5cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IG5vdCBlbmNyeXB0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoImtleUxlbiA9ICIsIGtleUxlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImtleURhdGFMZW4gPSAiLCBrZXlEYXRhTGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSA0ICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUVuY2Fwc3VsYXRlZC1BU0YtQWxlcnQiKTsKKyAgICB9Cit9CisKK3ZvaWQgemZTaG93VHhFQVBPTCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1OF90ICAgcGFja2V0VHlwZSwga2V5VHlwZSwgY29kZSwgaWRlbnRpZmllciwgdHlwZSwgZmxhZ3M7CisgICAgdTE2X3QgIHBhY2tldExlbiwga2V5SW5mbywga2V5TGVuLCBrZXlEYXRhTGVuLCBsZW5ndGgsIE9wX0NvZGU7CisgICAgdTMyX3QgIHJlcGxheUNvdW50ZXJILCByZXBsYXlDb3VudGVyTCwgdmVuZG9ySWQsIFZlbmRvclR5cGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJFQVBPTCBQYWNrZXQgc2l6ZSA9ICIsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpKTsKKworICAgIC8qIEVBUE9MIHBhY2tldCB0eXBlICovCisgICAgLy8gMDogRUFQLVBhY2tldAorICAgIC8vIDE6IEVBUE9MLVN0YXJ0CisgICAgLy8gMjogRUFQT0wtTG9nb2ZmCisgICAgLy8gMzogRUFQT0wtS2V5CisgICAgLy8gNDogRUFQT0wtRW5jYXBzdWxhdGVkLUFTRi1BbGVydAorCisgICAgLyogRUFQT0wgZnJhbWUgZm9ybWF0ICovCisgICAgLyogIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgKi8KKyAgICAvKiAgICAgICAgICAgIFBBRSBFdGhlcm5ldCBUeXBlICgweDg4OGUpICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gMiAqLworICAgIC8qICAgICBQcm90b2NvbCBWZXJzaW9uICAgIHwgICAgICAgICBUeXBlICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDYgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgUGFja2V0IEJvZHkgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgcGFja2V0VHlwZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAvKiBFQVBPTCBib2R5IGxlbmd0aCAqLworICAgIHBhY2tldExlbiA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyk7CisKKyAgICBpZiggcGFja2V0VHlwZSA9PSAwICkKKyAgICB7IC8vIEVBUC1QYWNrZXQKKyAgICAgICAgLyogRUFQLVBhY2tldCBDb2RlICovCisgICAgICAgIGNvZGUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCk7IC8vIDEgOiBSZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgOiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzIDogU3VjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IDogRmFpbHVyZQorCisgICAgICAgIC8vIEFuIEVBUCBwYWNrZXQgb2YgdGhlIHR5cGUgb2YgU3VjY2VzcyBhbmQgRmFpbHVyZSBoYXMgbm8gRGF0YSBmaWVsZCwgYW5kIGhhcyBhIGxlbmd0aCBvZiA0LgorCisgICAgICAgIC8qIEVBUCBQYWNrZXQgZm9ybWF0ICovCisgICAgICAgIC8qICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgICAgICAvKiAgICAgICAgICAgQ29kZSAgICAgICAgICB8ICAgICAgICBJZGVudGlmaWVyICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDIgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQiKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiUGFja2V0IExlbmd0aCA9ICIsIHBhY2tldExlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgQ29kZSA9ICIsIGNvZGUpOworCisgICAgICAgIGlmKCBjb2RlID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFR5cGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7IC8vIDEgICA6IElkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyICAgOiBOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgICA6IE5hayAoUmVzcG9uc2UgT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgICA6IE1ENS1DaGFsbGVuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgICA6IE9uZSBUaW1lIFBhc3N3b3JkIChPVFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2ICAgOiBHZW5lcmljIFRva2VuIENhcmQgKEdUQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NCA6IChFeHBhbmRlZCBUeXBlcylXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NSA6IEV4cGVyaW1lbnRhbCBVc2UKKworICAgICAgICAgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gYW4gRUFQIHBhY2tldCBvZiB0aGUgdHlwZSBvZiBSZXF1ZXN0IG9yIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtYXQgc2hvd24gYmVsbG93aW5nICovCisgICAgICAgICAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICBOICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgVHlwZSAgICAgICAgICB8ICAgICAgICBUeXBlIERhdGEgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBUeXBlID0gIiwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBJZGVudGl0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBNRDUtQ2hhbGxlbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBPbmUgVGltZSBQYXNzd29yZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgR2VuZXJpYyBUb2tlbiBDYXJkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDI1NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IFdpLUZpIFByb3RlY3RlZCBTZXR1cCIpOworCisgICAgICAgICAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICBUeXBlICAgICAgfCAgICAgICAgICAgICAgIFZlbmRvci1JZCAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3ItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICBWZW5kb3IgZGF0YS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgSWRlbnRpZmllciAqLworICAgICAgICAgICAgaWRlbnRpZmllciA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KTsKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgTGVuZ3RoICovCisgICAgICAgICAgICBsZW5ndGggPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzcpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBUeXBlICovCisgICAgICAgICAgICB0eXBlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IElkZW50aWZpZXIgPSAiLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgTGVuZ3RoID0gIiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgVHlwZSA9ICIsIHR5cGUpOworCisgICAgICAgICAgICBpZiggdHlwZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIElkZW50aXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBOb3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IE5hayIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTUQ1LUNoYWxsZW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA1ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgT25lIFRpbWUgUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IEdlbmVyaWMgVG9rZW4gQ2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyNTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVzcG9uc2UgV2ktRmkgUHJvdGVjdGVkIFNldHVwIik7CisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFN1Y2Nlc3MiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGNvZGUgPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgRmFpbHVyZSIpOworCisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IExlbmd0aCAqLworICAgICAgICAgICAgbGVuZ3RoID0gKCgodTE2X3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBJZGVudGlmaWVyID0gIiwgaWRlbnRpZmllcik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IExlbmd0aCA9ICIsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSAxICkKKyAgICB7IC8vIEVBUE9MLVN0YXJ0CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLVN0YXJ0Iik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMiApCisgICAgeyAvLyBFQVBPTC1Mb2dvZmYKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQT0wtTG9nb2ZmIik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMyApCisgICAgeyAvLyBFQVBPTC1LZXkKKyAgICAgICAgLyogRUFQT0wtS2V5IHR5cGUgKi8KKyAgICAgICAga2V5VHlwZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsKKyAgICAgICAgLyogRUFQT0wtS2V5IGluZm9ybWF0aW9uICovCisgICAgICAgIGtleUluZm8gPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CisgICAgICAgIC8qIEVBUE9MLUtleSBsZW5ndGggKi8KKyAgICAgICAga2V5TGVuID0gKCgodTE2X3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIC8qIEVBUE9MLUtleSByZXBsYXkgY291bnRlciAoaGlnaCBkb3VibGUgd29yZCkgKi8KKyAgICAgICAgcmVwbGF5Q291bnRlckggPSAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzkpKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICAgICAgLyogRUFQT0wtS2V5IHJlcGxheSBjb3VudGVyIChsb3cgZG91YmxlIHdvcmQpICovCisgICAgICAgIHJlcGxheUNvdW50ZXJMID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMykpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNCkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNSkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTYpOworICAgICAgICAvKiBFQVBPTC1LZXkgZGF0YSBsZW5ndGggKi8KKyAgICAgICAga2V5RGF0YUxlbiA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTcpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTgpOworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUtleSIpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJwYWNrZXQgbGVuZ3RoID0gIiwgcGFja2V0TGVuKTsKKworICAgICAgICBpZiAoIGtleVR5cGUgPT0gMjU0ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgia2V5IHR5cGUgPSAyNTQgKFNTTiBrZXkgZGVzY3JpcHRvcikiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoImtleSB0eXBlID0gMHgiLCBrZXlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzIoInJlcGxheSBjb3VudGVyKEwpID0gIiwgcmVwbGF5Q291bnRlckwpOworCisgICAgICAgIHptX2RlYnVnX21zZzIoImtleSBpbmZvcm1hdGlvbiA9ICIsIGtleUluZm8pOworCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF8zICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFpcndpc2Uga2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIgICAgLSBncm91cCBrZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF82ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IGluc3RhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF83ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5lZWRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5vdCBuZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF84ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIHNldCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF85ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IGVuY3J5cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IG5vdCBlbmNyeXB0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoImtleUxlbiA9ICIsIGtleUxlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImtleURhdGFMZW4gPSAiLCBrZXlEYXRhTGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSA0ICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUVuY2Fwc3VsYXRlZC1BU0YtQWxlcnQiKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVJlY3Y4MDIxMSAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsZWQgdG8gcmVjZWl2ZSA4MDIuMTEgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogcmVjZWl2ZWQgODAyLjExIGZyYW1lIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHU4X3Qgc25hcENhc2U9MCwgZW5jcnlNb2RlOworICAgIHUxNl90IGZyYW1lVHlwZSwgdHlwZUxlbmd0aEZpZWxkOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZVN1YnR5cGU7CisgICAgdTE2X3QgcmV0OworICAgIHUxNl90IGxlbjsKKyAgICB1OF90IGJJc0RlZnJhZyA9IDA7CisgICAgdTE2X3Qgb2Zmc2V0LCB0YWlsTGVuOworICAgIHU4X3QgdmFwID0gMDsKKyAgICB1MTZfdCBkYVszXSwgc2FbM107CisgICAgdTE2X3QgaWk7CisgICAgdThfdCB1YXBzZFRyaWcgPSAwOworICAgIHpidWZfdCogcHNCdWY7CisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgdThfdCBpOworI2VuZGlmCisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICAvL3ptX21zZzJfcngoWk1fTFZfMiwgInpmaVJlY3Y4MDIxMSgpLCBidWY9IiwgYnVmKTsKKworICAgIC8vem1fbXNnMl9yeChaTV9MVl8wLCAiaFswXT0iLCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKSk7CisgICAgLy96bV9tc2cyX3J4KFpNX0xWXzAsICJoWzJdPSIsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIpKTsKKyAgICAvL3ptX21zZzJfcngoWk1fTFZfMCwgImhbNF09Iiwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkpOworCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisKKyNpZiAwICAgLy8gTW92ZSB0byBQcm9jZXNzQmVhY29uIHRvIGp1ZGdlIGlmIHRoZXJlJ3MgYSBuZXcgcGVlciBzdGF0aW9uCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykmJgorICAgICAgICAgKHdkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgIT0gWk1fSUJTU19QQVJUTkVSX0FMSVZFKSApCisgICAgeworICAgICAgICB6ZlN0YUlic3NNb25pdG9yaW5nKGRldiwgYnVmKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIElmIGRhdGEgZnJhbWUgKi8KKyAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fREFUQV9GUkFNRSkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzKys7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlcyArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJSZWNlaXZlIHBhY2tldHMgICAgID0gIiwgd2QtPnN0YS5Ub3RhbE51bWJlck9mUmVjZWl2ZVBhY2tldHMpOworCisgICAgICAgIC8vem1fbXNnMF9yeChaTV9MVl8wLCAiUnggZGF0YSIpOworICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gemZBcFVwZGF0ZVBzQml0KGRldiwgYnVmLCAmdmFwLCAmdWFwc2RUcmlnKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHVhcHNkVHJpZyYweGYpICE9IDApICYmICgoZnJhbWVTdWJ0eXBlICYgMHg4MCkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCBhYyA9IHpjVXBUb0FjW3ptd19idWZfcmVhZGIoZGV2LCBidWYsIDI0KSYweDddOworICAgICAgICAgICAgICAgIHU4X3QgcGt0TnVtOworICAgICAgICAgICAgICAgIHU4X3QgbWI7CisgICAgICAgICAgICAgICAgdTE2X3QgZmxhZzsKKyAgICAgICAgICAgICAgICB1OF90IHNyY1s2XTsKKworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJRb1MgY3RybD0lZFxuIiwgem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjQpKTsKKyAgICAgICAgICAgICAgICAvL3ByaW50aygiVUFQU0QgdHJpZ2dlciwgYWM9JWRcbiIsIGFjKTsKKworICAgICAgICAgICAgICAgIGlmICgoKDB4OD4+YWMpICYgdWFwc2RUcmlnKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGt0TnVtID0gemNNYXhzcFRvUGt0TnVtWyh1YXBzZFRyaWc+PjQpICYgMHgzXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGlpPTA7IGlpPDY7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tpaV0gPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraWkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaT0wOyBpaTxwa3ROdW07IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKChwc0J1ZiA9IHpmUXVldWVHZXQoZGV2LCB3ZC0+YXAudWFwc2RRKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHNCdWYgPSB6ZlF1ZXVlR2V0V2l0aE1hYyhkZXYsIHdkLT5hcC51YXBzZFEsIHNyYywgJm1iKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGlpKzEpID09IHBrdE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRU9TUCBhbnl3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MTAwIHwgKG1iPDw1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbW9yZSBkYXRhLCBub3QgRU9TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vIG1vcmUgZGF0YSwgRU9TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgcHNCdWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgZmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHNCdWYgPT0gTlVMTCkgfHwgKG1iID09IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWkgPT0gMCkgJiYgKHBzQnVmID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCwgKHUxNl90KilzcmMsIDAsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUxNl90IGZyYW1lQ3RybE1TQjsKKyAgICAJCXU4X3QgICBic3NpZFs2XTsKKworICAgICAgICAgICAgLyogQ2hlY2sgSXMgUklGUyBmcmFtZSBhbmQgZGVjaWRlIHRvIGVuYWJsZSBSSUZTIG9yIG5vdCAqLworICAgICAgICAgICAgaWYoIHdkLT5zdGEuRW5hYmxlSFQgKQorICAgICAgICAgICAgICAgIHpmQ2hlY2tJc1JJRlNGcmFtZShkZXYsIGJ1ZiwgZnJhbWVTdWJ0eXBlKTsKKworICAgICAgICAgICAgaWYgKCB6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpIHx8IHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lQ3RybE1TQiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworCisgICAgICAgICAgICAgICAgLyogY2hlY2sgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgICAgaWYgKCBmcmFtZUN0cmxNU0IgJiBaTV9CSVRfNSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIHJ4IGZyYW1lJ3MgQUMgaXMgbm90IGRlbGl2ZXJ5LWVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLnFvc0luZm8mMHhmKSAhPSAweGYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgcnhBYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZyYW1lU3VidHlwZSAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhBYyA9IHpjVXBUb0FjW3ptd19idWZfcmVhZGIoZGV2LCBidWYsIDI0KSYweDddOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgweDg+PnJ4QWMpICYgd2QtPnN0YS5xb3NJbmZvKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZFBTUG9sbChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQkvKmluY3JlYXNlIGJlYWNvbiBjb3VudCB3aGVuIHJlY2VpdmUgdmFpbGQgZGF0YSBmcmFtZSBmcm9tIEFQKi8KKyAgICAgICAgCVpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYnNzaWQpOworCisJCQlpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpJiYKKwkJCQl6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgYnNzaWQsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCwgNikpCisJCQl7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yeEJlYWNvbkNvdW50Kys7CisJCQl9CisgICAgICAgIH0KKworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJSeCBWQVA9IiwgdmFwKTsKKworICAgICAgICAvKiBoYW5kbGUgSVYsIEVYVC1JViwgSUNWLCBhbmQgRVhULUlDViAqLworICAgICAgICB6ZkdldFJ4SXZJY3ZMZW5ndGgoZGV2LCBidWYsIHZhcCwgJm9mZnNldCwgJnRhaWxMZW4sIGFkZEluZm8pOworCisgICAgICAgIHpmU3RhSWJzc1BTQ2hlY2tTdGF0ZShkZXYsIGJ1Zik7CisgICAgICAgIC8vUW9TIGRhdGEgZnJhbWUKKyAgICAgICAgaWYgKChmcmFtZVN1YnR5cGUgJiAweDgwKSA9PSAweDgwKQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgICAgICAvKiByZW1vdmUgSUNWICovCisgICAgICAgIGlmICh0YWlsTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbiA+IHRhaWxMZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuIC09IHRhaWxMZW47CisgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbHRlciBOVUxMIGRhdGEgKi8KKyAgICAgICAgaWYgKCgoZnJhbWVTdWJ0eXBlJjB4NDApICE9IDApIHx8ICgobGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikpPD0yNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMSwgIkZyZWUgUnggTlVMTCBkYXRhLCBsZW49IiwgbGVuKTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgYW5kIGhhbmRsZSBkZWZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmJTYWZlTW9kZSAmJiAod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9BRVMpICYmIHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiQnlwYXNzIGRlZnJhZ21lbnRhdGlvbiBwYWNrZXRzIGluIHNhZmUgbW9kZSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYnVmID0gemZEZWZyYWdtZW50KGRldiwgYnVmLCAmYklzRGVmcmFnLCBhZGRJbmZvKSkgPT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGhhcyBiZWVuIGZyZWVkIGluIHpmRGVmcmFnbWVudCAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IFpNX01JQ19TVUNDRVNTOworCisgICAgICAgIC8qIElmIFNXIFdFUC9US0lQIGFyZSBub3QgdHVybmVkIG9uICovCisgICAgICAgIGlmICgod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19US0lQX0RFQ1JZX0VOKSA9PSAwICYmCisgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfREVDUllfRU4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3J5TW9kZSA9IHpmR2V0RW5jcnlNb2RlRnJvbVJ4U3RhdHVzKGFkZEluZm8pOworCisgICAgICAgICAgICAvKiBjaGVjayBpZiBUS0lQICovCisgICAgICAgICAgICBpZiAoIGVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGJJc0RlZnJhZyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB6Zk1pY1J4VmVyaWZ5KGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgTUlDIGZhaWx1cmUgYml0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggWk1fUlhfU1RBVFVTX0lTX01JQ19GQUlMKGFkZEluZm8pICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gWk1fTUlDX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIHJldCA9PSBaTV9NSUNfRkFJTFVSRSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OF90IFVuaWNhc3RfUGt0ID0gMHgwOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSAmIDB4MSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4VW5pY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgVW5pY2FzdF9Qa3QgPSAweDE7CisgICAgICAgICAgICAgICAgICAgIH0vKgorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpID09IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5jb21tVGFsbHkuc3dSeE11bHRpY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICB1OF90IGFkZHJbNl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4PTA7IGlkeDw2OyBpZHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyW2lkeF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkoZGV2LCBhZGRyLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoVW5pY2FzdF9Qa3QpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ291bnRlcm1lYXN1cmUgOiBVbmljYXN0X1BrdCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJDb3VudGVybWVhc3VyZSA6IE5vbi1VbmljYXN0X1BrdCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHdkLT5US0lQX0dyb3VwX0tleUNoYW5naW5nID09IDB4MCkgfHwgKFVuaWNhc3RfUGt0ID09IDB4MSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ291bnRlcm1lYXN1cmUgOiBEbyBNSUMgQ2hlY2sgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZTdGFNaWNGYWlsdXJlSGFuZGxpbmcoZGV2LCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogU0tJUCBNSUMgQ2hlY2sgZHVlIHRvIEdyb3VwIEtleWNoYW5naW5nICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgTUlDIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgSXNFbmNyeUZyYW1lOworCisgICAgICAgICAgICAvKiBUT0RPOiBDaGVjayB3aGV0aGVyIFdFUCBiaXQgaXMgdHVybmVkIG9uIGluIE1BQyBoZWFkZXIgKi8KKyAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKworICAgICAgICAgICAgSXNFbmNyeUZyYW1lID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHg0MCk7CisKKyAgICAgICAgICAgIGlmIChJc0VuY3J5RnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU29mdHdhcmUgZGVjcnlwdGlvbiBmb3IgVEtJUCAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1RLSVBfREVDUllfRU4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpdjE2OworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpdjMyOworICAgICAgICAgICAgICAgICAgICB1OF90IFJDNEtleVsxNl07CisgICAgICAgICAgICAgICAgICAgIHUxNl90IEl2T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgenNUa2lwU2VlZCAqcnhTZWVkOworCisgICAgICAgICAgICAgICAgICAgIEl2T2Zmc2V0ID0gb2Zmc2V0ICsgWk1fU0laRV9PRl9XTEFOX0RBVEFfSEVBREVSOworCisgICAgICAgICAgICAgICAgICAgIHJ4U2VlZCA9IHpmU3RhR2V0UnhTZWVkKGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocnhTZWVkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInJ4U2VlZCBpcyBOVUxMIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgdGhpcyBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpdjE2ID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KSA8PCA4KSArIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzIpOworICAgICAgICAgICAgICAgICAgICBpdjMyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgSXZPZmZzZXQrNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzUpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCs2KSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzcpIDw8IDI0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBUS0lQIEtleSBNaXhpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgemZUa2lwUGhhc2UxS2V5TWl4KGl2MzIsIHJ4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMktleU1peChpdjE2LCByeFNlZWQpOworICAgICAgICAgICAgICAgICAgICB6ZlRraXBHZXRzZWVkcyhpdjE2LCBSQzRLZXksIHJ4U2VlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRGVjcnlwdCBEYXRhICovCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHpmVEtJUERlY3J5cHQoZGV2LCBidWYsIEl2T2Zmc2V0K1pNX1NJWkVfT0ZfSVYrWk1fU0laRV9PRl9FWFRfSVYsIDE2LCBSQzRLZXkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gWk1fSUNWX0ZBSUxVUkUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlRLSVAgSUNWIGZhaWwiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzY2FyZCBJQ1YgZmFpbGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBJQ1YgZnJvbSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgbGVuLTQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIE1JQyAqLworICAgICAgICAgICAgICAgICAgICByZXQgPSB6Zk1pY1J4VmVyaWZ5KGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IFpNX01JQ19GQUlMVVJFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCkgJiAweDEpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4VW5pY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSA9PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBhZGRyWzZdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpZHg9MDsgaWR4PDY7IGlkeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcltpZHhdID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkFwTWljRmFpbHVyZU5vdGlmeShkZXYsIGFkZHIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU3RhTWljRmFpbHVyZUhhbmRsaW5nKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiTUlDIGZhaWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgTUlDIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gWk1fU0laRV9PRl9JViArIFpNX1NJWkVfT0ZfRVhUX0lWOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfV0VQX0RFQ1JZX0VOKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgSXZPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHU4X3Qga2V5TGVuID0gNTsKKyAgICAgICAgICAgICAgICAgICAgdThfdCBpdlszXTsKKyAgICAgICAgICAgICAgICAgICAgdThfdCAqd2VwS2V5OworICAgICAgICAgICAgICAgICAgICB1OF90IGtleUlkeDsKKworICAgICAgICAgICAgICAgICAgICBJdk9mZnNldCA9IG9mZnNldCArIFpNX1NJWkVfT0ZfV0xBTl9EQVRBX0hFQURFUjsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXRyaWV2ZSBJViAqLworICAgICAgICAgICAgICAgICAgICBpdlswXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaXZbMV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCsxKTsKKyAgICAgICAgICAgICAgICAgICAgaXZbMl0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCsyKTsKKworICAgICAgICAgICAgICAgICAgICBrZXlJZHggPSAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzMpID4+IDYpICYgMHgwMyk7CisKKyAgICAgICAgICAgICAgICAgICAgSXZPZmZzZXQgKz0gWk1fU0laRV9PRl9JVjsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5TV0VuY3J5TW9kZVtrZXlJZHhdID09IFpNX1dFUDY0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVba2V5SWR4XSA9PSBaTV9XRVAxMjgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUxlbiA9IDEzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVba2V5SWR4XSA9PSBaTV9XRVAyNTYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUxlbiA9IDI5OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgemZXRVBEZWNyeXB0KGRldiwgYnVmLCBJdk9mZnNldCwga2V5TGVuLCB3ZC0+c3RhLndlcEtleVtrZXlJZHhdLCBpdik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBaTV9JQ1ZfRkFJTFVSRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIElDViBmYWlsIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgSUNWIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSB3ZC0+c3RhLlNXRW5jcnlNb2RlW2tleUlkeF07CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIElDViBmcm9tIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCBsZW4tNCk7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IFpNX1NJWkVfT0ZfSVY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAvL2Vsc2UgaWYgKCBlbmNyeU1vZGUgPT0gWk1fQ0VOQyApIC8qIGNoZWNrIGlmIENFTkMgKi8KKyAgICAgICAgaWYgKCBlbmNyeU1vZGUgPT0gWk1fQ0VOQyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMl90IHJ4SVZbNF07CisKKyAgICAgICAgICAgIHJ4SVZbMF0gPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjgpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgKyB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNik7CisgICAgICAgICAgICByeElWWzFdID0gKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMyKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICsgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzApOworICAgICAgICAgICAgcnhJVlsyXSA9ICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICArIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM0KTsKKyAgICAgICAgICAgIHJ4SVZbM10gPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNDApIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgKyB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzOCk7CisKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigicnhJVlswXSA9IDB4IiwgcnhJVlswXSk7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoInJ4SVZbMV0gPSAweCIsIHJ4SVZbMV0pOworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJyeElWWzJdID0gMHgiLCByeElWWzJdKTsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigicnhJVlszXSA9IDB4IiwgcnhJVlszXSk7CisKKyAgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MqLworICAgICAgICAgICAgZGFbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworICAgICAgICAgICAgZGFbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrMik7CisgICAgICAgICAgICBkYVsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCs0KTsKKworICAgICAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChkYVswXSAmIDB4MSkpCisgICAgICAgICAgICAgICAgeyAvL211bHRpY2FzdCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAvKiBBY2N1bWxhdGUgdGhlIFBOIHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzBdICsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZHS1swXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdkdLWzFdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzJdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2R0tbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbM10rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZHS1szXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1syXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdkdLWzBdID0gMHgiLCB3ZC0+c3RhLnJ4aXZHS1swXSk7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigid2QtPnN0YS5yeGl2R0tbMV0gPSAweCIsIHdkLT5zdGEucnhpdkdLWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ3ZC0+c3RhLnJ4aXZHS1syXSA9IDB4Iiwgd2QtPnN0YS5yeGl2R0tbMl0pOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdkdLWzNdID0gMHgiLCB3ZC0+c3RhLnJ4aXZHS1szXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhKCh3ZC0+c3RhLnJ4aXZHS1swXSA9PSByeElWWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdkdLWzFdID09IHJ4SVZbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5yeGl2R0tbMl0gPT0gcnhJVlsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLnJ4aXZHS1szXSA9PSByeElWWzNdKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgUGFja2V0RGlzY2FyZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNjYXJkIFBOIENvZGUgRXJyb3IgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeElWWzBdIDwgd2QtPnN0YS5yeGl2R0tbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0RGlzY2FyZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2R0tbMF0gPiAweGZmZmZmZmYwKQorICAgICAgICAgICAgICAgICAgICAgICAgeyAvL2JvdW5kYXJ5IGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ4SVZbMF0gPCAweGZmZmZmZmYwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKCgweGZmZmZmZmZmIC0gd2QtPnN0YS5yeGl2R0tbMF0pICsgcnhJVlswXSkgPiAxNikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXREaXNjYXJkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7IC8vbm9ybWFsIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ4SVZbMF0gLSB3ZC0+c3RhLnJ4aXZHS1swXSkgPiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldERpc2NhcmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bmMgc3RhIHBuIGNvZGUgd2l0aCBhcCBiZWNhdXNlIG9mIGxvc3Rpbmcgc29tZSBwYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1swXSA9IHJ4SVZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IHJ4SVZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1syXSA9IHJ4SVZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1szXSA9IHJ4SVZbM107CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFja2V0RGlzY2FyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEaXNjYXJkIFBOIENvZGUgbG9zdCB0b28gbXVjaCBtdWx0aWNhc3QgZnJhbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgLy91bmljYXN0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIC8qIEFjY3VtbGF0ZSB0aGUgUE4gc2VxdWVuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdlswXSA9PSAwIHx8IHdkLT5zdGEucnhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMV0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZbMV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzJdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2WzJdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlszXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlsyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdlswXSA9IDB4Iiwgd2QtPnN0YS5yeGl2WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ3ZC0+c3RhLnJ4aXZbMV0gPSAweCIsIHdkLT5zdGEucnhpdlsxXSk7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigid2QtPnN0YS5yeGl2WzJdID0gMHgiLCB3ZC0+c3RhLnJ4aXZbMl0pOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdlszXSA9IDB4Iiwgd2QtPnN0YS5yeGl2WzNdKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICEoKHdkLT5zdGEucnhpdlswXSA9PSByeElWWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlsxXSA9PSByeElWWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlsyXSA9PSByeElWWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlszXSA9PSByeElWWzNdKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlBOIENvZGUgbWlzbWF0Y2gsIGxvc3QgdW5pY2FzdCBmcmFtZSwgc3luYyBwbiBjb2RlIHRvIHJlY3YgcGFja2V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jIHN0YSBwbiBjb2RlIHdpdGggYXAgYmVjYXVzZSBvZiBsb3N0aW5nIHNvbWUgcGFja2V0cworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdID0gcnhJVlswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlsxXSA9IHJ4SVZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMl0gPSByeElWWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzNdID0gcnhJVlszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgUE4gQ29kZSBFcnJvciBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJEaXNjYXJkIFBOIENvZGUgbWlzbWF0Y2ggdW5pY2FzdCBmcmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisgICAgICAgIC8qIGZvciB0YWxseSAqLworICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCkgJiAweDEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZvciBBQ1UgdG8gZGlzcGxheSBSeFJhdGUgKi8KKyAgICAgICAgICAgIHpmV2xhblVwZGF0ZVJ4UmF0ZShkZXYsIGFkZEluZm8pOworCisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4VW5pY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5yeFVuaWNhc3RPY3RldHMgKz0gKGxlbi0yNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RGcm0rKzsKKyAgICAgICAgICAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RPY3RldHMgKz0gKGxlbi0yNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0RnJtKys7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0T2N0ZXRzICs9IChsZW4tMjQpOworICAgICAgICB9CisgICAgICAgIHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljKys7CisKKyAgICAgICAgaWYgKChmcmFtZVN1YnR5cGUgJiAweDgwKSA9PSAweDgwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiBRb1MgY29udHJvbCBiaXQtNyBpcyAxID0+IEEtTVNEVSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNCkgJiAweDgwKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVBbXNkdShkZXYsIGJ1ZiwgdmFwLCBlbmNyeU1vZGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBNSUMgb2YgVEtJUAorICAgICAgICBpZiAoIGVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgLSA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQgODAyLjExIGFuZCBTTkFQIGhlYWRlciB0byBldGhlcm5ldCBoZWFkZXIgKi8KKyAgICAgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpfHwKKyAgICAgICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzKi8KKyAgICAgICAgICAgIGRhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICAgICAgICAgIGRhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKzIpOworICAgICAgICAgICAgZGFbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrNCk7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGJyb2FkY2FzdCBmcmFtZSAqLworICAgICAgICAgICAgaWYgKCAoZGFbMF0gPT0gMHhmZmZmKSAmJiAoZGFbMV0gPT0gMHhmZmZmKSAmJiAoZGFbMl0gPT0gMHhmZmZmKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQXAgc2VuZCBicm9hZGNhc3QgZnJhbWUgdG8gdGhlIERVVCAhCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjaGVjayBtdWx0aWNhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIC8qIFRPRE8gOiBSZW1vdmUgdGhlc2UgY29kZSwgaGFyZHdhcmUgc2hvdWxkIGJlIGFibGUgdG8gYmxvY2sgKi8KKyAgICAgICAgICAgIC8qICAgICAgICBtdWx0aWNhc3QgZnJhbWUgb24gdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgICBvciBieXBhc3MgYWxsIG11bHRpY2FzdCBwYWNrZXQgYnkgZmxhZyBiQWxsTXVsdGljYXN0ICovCisgICAgICAgICAgICBlbHNlIGlmICgoZGFbMF0gJiAweDAxKSAmJiAod2QtPnN0YS5iQWxsTXVsdGljYXN0ID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpaT0wOyBpaTx3ZC0+c3RhLm11bHRpY2FzdExpc3Quc2l6ZTsgaWkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKHdkLT5zdGEubXVsdGljYXN0TGlzdC5tYWNBZGRyW2lpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCopIGRhLCA2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGlpID09IHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplICkKKyAgICAgICAgICAgICAgICB7ICAgLyogbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImRpc2NhcmQgdW5rbm93biBtdWx0aWNhc3QgZnJhbWUiKTsKKworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSSAvL05hdGl2ZSBXaWZpIDogMSwgRXRoZXJuZXQgZm9ybWF0IDogMAorICAgICAgICAgICAgLy9UbyByZW1vdmUgSVYKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaT0xMjsgaT4wOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgKChpLTEpKjIpK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAoaS0xKSoyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICB9CisjZWxzZQorCisgICAgICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIHpnU25hcEJyaWRnZVR1bm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCtvZmZzZXQsIDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNuYXBDYXNlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgemdTbmFwODAyMWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQrb2Zmc2V0LCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZUxlbmd0aEZpZWxkID0KKyAgICAgICAgICAgICAgICAgICAgKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMwK29mZnNldCkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzErb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigidHB5ZUxlbmd0aEZpZWxkID0gIiwgdHlwZUxlbmd0aEZpZWxkKTsKKworICAgICAgICAgICAgICAgIC8vODEzNyA6IElQWCwgODBGMyA6IEFwcGxldGFsaworICAgICAgICAgICAgICAgIGlmICggKHR5cGVMZW5ndGhGaWVsZCAhPSAweDgxMzcpJiYKKyAgICAgICAgICAgICAgICAgICAgICh0eXBlTGVuZ3RoRmllbGQgIT0gMHg4MEYzKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbmFwQ2FzZSA9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCB0eXBlTGVuZ3RoRmllbGQgPT0gMHg4ODhFICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2hvd1J4RUFQT0woZGV2LCBidWYsIDMyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZndEdW1wQnVmKGRldiwgYnVmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc291cmNlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAzICovCisgICAgICAgICAgICAgICAgc2FbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpOworICAgICAgICAgICAgICAgIHNhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgICAgICAgICAgICAgIHNhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAyICovCisgICAgICAgICAgICAgICAgc2FbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgICAgIHNhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpOworICAgICAgICAgICAgICAgIHNhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHNuYXBDYXNlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTQSAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCtvZmZzZXQsIHNhWzBdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCBzYVsxXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4K29mZnNldCwgc2FbMl0pOworCisgICAgICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDEgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTgrb2Zmc2V0LCBkYVswXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDIwK29mZnNldCwgZGFbMV0pOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMitvZmZzZXQsIGRhWzJdKTsKKyAgICAgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBICovCisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDE2K29mZnNldCwgc2FbMF0pOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHNhWzFdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjArb2Zmc2V0LCBzYVsyXSk7CisKKyAgICAgICAgICAgICAgICAvKiBEQSA9IEFkZHJlc3MgMSAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCtvZmZzZXQsIGRhWzBdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTIrb2Zmc2V0LCBkYVsxXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDE0K29mZnNldCwgZGFbMl0pOworICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIDEwK29mZnNldCk7CisgICAgICAgICAgICAgICAgLyogRXRoZXJuZXQgcGF5bG9hZCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICB0eXBlTGVuZ3RoRmllbGQgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKSAtIDE0OworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMiwgKHR5cGVMZW5ndGhGaWVsZDw8OCkrKHR5cGVMZW5ndGhGaWVsZD4+OCkpOworICAgICAgICAgICAgfQorI2VuZGlmICAvLyBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHgzKSAhPSAzKQorICAgICAgICAgICAgaWYgKHZhcCA8IFpNX01BWF9BUF9TVVBQT1JUKQorICAgICAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICAgICAgeworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSSAvL05hdGl2ZSBXaWZpIDogMSwgRXRoZXJuZXQgZm9ybWF0IDogMAorICAgICAgICAgICAgICAgIC8vVG8gcmVtb3ZlIElWCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTI7IGk+MDsgaS0tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgKChpLTEpKjIpK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgKGktMSkqMikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBTQSA9IEFkZHJlc3MgMiAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjgrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzQpKTsKKyAgICAgICAgICAgICAgICAvKiBEQSA9IEFkZHJlc3MgMyAqLworICAgICAgICAgICAgICAgIC8qIFNlcSA6IFJlYWQgMjAgd3JpdGUgMjIsIHJlYWQgMTggd3JpdGUgMjAsIHJlYWQgMTYgd3JpdGUgMTggKi8KKyAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBtdXN0IG5vdCBiZSBpbnZlcnRlZCAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMitvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrNCkpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrMikpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworI2VuZGlmICAvLyBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgICAgIGlmICgocmV0ID0gemZJbnRyYWJzc0ZvcndhcmQoZGV2LCBidWYsIHZhcCkpID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFJ4IGJ1ZmZlciBpZiBpbnRyYS1CU1MgdW5pY2FzdCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJGcmVlIGludHJhLUJTUyB1bmljYXN0IGZyYW1lIik7CisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogV0RTIG1vZGUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJSeCBXRFMgZGF0YSIpOworCisgICAgICAgICAgICAgICAgLyogU0EgPSBBZGRyZXNzIDQgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTRfT0ZGU0VUKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMyK29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCsyKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM0K29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCs0KSk7CisgICAgICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDMgKi8KKyAgICAgICAgICAgICAgICAvKiBTZXEgOiBSZWFkIDIwIHdyaXRlIDIyLCByZWFkIDE4IHdyaXRlIDIwLCByZWFkIDE2IHdyaXRlIDE4ICovCisgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgbXVzdCBub3QgYmUgaW52ZXJ0ZWQgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjgrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzQpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjQrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKSk7CisgICAgICAgICAgICAgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgMjQrb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pCisgICAgICAgIHsKKwkJCS8qIFdEUyB0ZXN0OiByZW1vdmUgYWRkNCAqLworICAgICAgICAgICAgaWYgKHdkLT5lbmFibGVXRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAyICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjQrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKSk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrNCkpOworICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDEgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrMikpOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDIyK29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCs0KSk7CisgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsbCB6ZndSZWN2RXRoKCkgdG8gbm90aWZ5IHVwcGVyIGxheWVyICovCisgICAgICAgIC8vem1fbXNnMl9yeChaTV9MVl8yLCAiQ2FsbCB6ZndSZWN2RXRoKCksIGJ1Zj0iLCBidWYpOworICAgICAgICAvL3pmd0R1bXBCdWYoZGV2LCBidWYpOworCisgICAgICAgICNpZiBaTV9QUk9UT0NPTF9SRVNQT05TRV9TSU1VTEFUSU9OID09IDEKKyAgICAgICAgemZQcm90UnNwU2ltKGRldiwgYnVmKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIC8vemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisKKyAgICAgICAgLyogdGFsbHkgKi8KKyAgICAJd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQrKzsKKworICAgIAlpZiAod2QtPnpmY2JSZWN2RXRoICE9IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdkV0aChkZXYsIGJ1ZiwgdmFwKTsKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX01TRFUoZGV2LCB3ZC0+dGljaykKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBpZiBtYW5hZ2VtZW50IGZyYW1lICovCisgICAgZWxzZSBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fTUFOQUdFTUVOVF9GUkFNRSkKKyAgICB7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgIlJ4IG1hbmFnZW1lbnQsRkM9IiwgZnJhbWVDdHJsKTsKKyAgICAgICAgLyogQ2FsbCB6ZlByb2Nlc3NNYW5hZ2VtZW50KCkgdG8gaGFuZGxlIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyAgICAgICAgemZQcm9jZXNzTWFuYWdlbWVudChkZXYsIGJ1ZiwgYWRkSW5mbyk7IC8vQ1dZYW5nKG0pCisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKyAgICAvKiBQc1BvbGwgKi8KKyAgICBlbHNlIGlmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApICYmIChmcmFtZUN0cmwgPT0gMHhhNCkpCisgICAgeworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzAsICJSeCBQc1BvbGwiKTsKKyAgICAgICAgemZBcFByb2Nlc3NQc1BvbGwoZGV2LCBidWYpOworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiUnggZGlzY2FyZCEhIik7CisgICAgICAgIHdkLT5jb21tVGFsbHkuRHJpdmVyRGlzY2FyZGVkRnJtKys7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZXbGFuUnhWYWxpZGF0ZSAgICAgICAgICAgICovCisvKiAgICAgIFZhbGlkYXRlIFJ4IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiByZWNlaXZlZCA4MDIuMTEgZnJhbWUgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZXbGFuUnhWYWxpZGF0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZUxlbjsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCAgZnJhbWVTdWJUeXBlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhDOworICAgIGZyYW1lU3ViVHlwZSA9IChmcmFtZUN0cmwgJiAweEYwKSA+PiA0OworCisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIEFjY2VwdCBEYXRhL01hbmFnZW1lbnQgZnJhbWUgd2l0aCBwcm90b2NvbCB2ZXJzaW9uID0gMCAqLworICAgIGlmICgoZnJhbWVUeXBlID09IDB4OCkgfHwgKGZyYW1lVHlwZSA9PSAweDApKQorICAgIHsKKworICAgICAgICAvKiBUT0RPIDogY2hlY2sgcnggc3RhdHVzID0+IGVycm8gYml0ICovCisKKyAgICAgICAgLyogQ2hlY2sgTWluaW11bSBMZW5ndGggd2l0aCBXZXAgKi8KKyAgICAgICAgaWYgKChmcmFtZUN0cmwgJiAweDQwMDApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1pbmltdW0gTGVuZ3RoID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAgIFBMQ1AoNSkrSGVhZGVyKDI0KStJVig0KStJQ1YoNCkrQ1JDKDQpK1J4U3RhdHVzKDgpICovCisgICAgICAgICAgICBpZiAoZnJhbWVMZW4gPCAzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX01JTl9SWF9FTkNSWVBUX0ZSQU1FX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZnJhbWVTdWJUeXBlID09IDB4NSB8fCBmcmFtZVN1YlR5cGUgPT0gMHg4ICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWluaW11bSBMZW5ndGggPSBQTENQKDUpK01BQ0hlYWRlcigyNCkrVGltZXN0YW1wKDgpK0JlYWNvbkludGVydmFsKDIpK0NhcCgyKStDUkMoNCkrUnhTdGF0dXMoOCkgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZUxlbiA8IDM2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfTUlOX1JYX0ZSQU1FX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1pbmltdW0gTGVuZ3RoID0gUExDUCg1KStNQUNIZWFkZXIoMjQpK0NSQyg0KStSeFN0YXR1cyg4KSAqLworICAgICAgICAgICAgaWYgKGZyYW1lTGVuIDwgMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9NSU5fUlhfRlJBTUVfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgZnJhbWUgTGVuZ3RoID4gWk1fV0xBTl9NQVhfUlhfU0laRS4gKi8KKyAgICAgICAgaWYgKGZyYW1lTGVuID4gWk1fV0xBTl9NQVhfUlhfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9NQVhfUlhfRlJBTUVfTEVOR1RIOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmcmFtZUN0cmwmMHhmZikgPT0gMHhhNCkKKyAgICB7CisgICAgICAgIC8qIFBzUG9sbCAqLworICAgICAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgInJ4IHBzcG9sbCIpOworICAgIH0KKyAgICBlbHNlIGlmICgoZnJhbWVDdHJsJjB4ZmYpID09IFpNX1dMQU5fRlJBTUVfVFlQRV9CQVIpCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5lbmFibGVEcnZCQSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkFnZ1JlY3ZCQVIoZGV2LCBidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9SWF9CQVJfRlJBTUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9FUlJfUlhfRlJBTUVfVFlQRTsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9QU0VVRE8gKQorICAgIHsKKyAgICAgICAgaWYgKCAocmV0PXpmU3RhUnhWYWxpZGF0ZUZyYW1lKGRldiwgYnVmKSkhPVpNX1NVQ0NFU1MgKQorICAgICAgICB7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzEoImRpc2NhcmQgZnJhbWUsIGNvZGUgPSAiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZldsYW5SeEZpbHRlciAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmlsdGVyIGR1cGxpY2F0ZWQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIDgwMi4xMSBmcmFtZSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZldsYW5SeEZpbHRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgc3JjWzNdOworICAgIHUxNl90IGRzdDA7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IHNlcTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgaW5kZXg7CisgICAgdTE2X3QgY29sOworICAgIHUxNl90IGk7CisgICAgdThfdCB1cCA9IDA7IC8qIFVzZXIgcHJpb3JpdHkgKi8KKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICAvKiBSWCBQUkVGSVggKi8KKyAgICBvZmZzZXQgPSAwOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8vIERvbid0IGRpdmlkZSAyXjQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSBmcmFnZW1lbnRhdGlvbiBwa3QgdG8gYmUgdHJlYXRlZCBhcworICAgIC8vIGR1cGxpY2F0ZWQgZnJhbWVzCisgICAgc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKTsKKyAgICBkc3QwID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzQpOworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMCk7CisgICAgc3JjWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICBzcmNbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTQpOworCisgICAgLyogUW9TIGRhdGEgZnJhbWUgKi8KKyAgICBpZiAoKGZyYW1lVHlwZSAmIDB4ODgpID09IDB4ODgpCisgICAgeworICAgICAgICB1cCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyNCk7CisgICAgICAgIHVwICY9IDB4NzsKKyAgICB9CisKKyAgICBpbmRleCA9IChzcmNbMl0rdXApICYgKFpNX0ZJTFRFUl9UQUJMRV9ST1ctMSk7CisKKyAgICAvKiBUQkQgOiBmaWx0ZXIgZnJhbWUgd2l0aCBzb3VyY2UgYWRkcmVzcyA9PSBvd24gTUFDIGFkcmVzcyAqLworICAgIGlmICgod2QtPm1hY0FkZHJbMF0gPT0gc3JjWzBdKSAmJiAod2QtPm1hY0FkZHJbMV0gPT0gc3JjWzFdKQorICAgICAgICAgICAgJiYgKHdkLT5tYWNBZGRyWzJdID09IHNyY1syXSkpCisgICAgeworICAgICAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgIlJ4IGZpbHRlcj0+c3JjIGlzIG93biBNQUMiKTsKKyAgICAgICAgd2QtPnRyYWZUYWxseS5yeFNyY0lzT3duTWFjKys7CisjaWYgMAorICAgICAgICByZXR1cm4gWk1fRVJSX1JYX1NSQ19BRERSX0lTX09XTl9NQUM7CisjZW5kaWYKKyAgICB9CisKKyAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJSeCBzZXE9Iiwgc2VxKTsKKworICAgIC8qIEZpbHRlciB1bmljYXN0IGZyYW1lIG9ubHkgKi8KKyAgICBpZiAoKGRzdDAgJiAweDEpID09IDApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGZvcihpPTA7IGk8Wk1fRklMVEVSX1RBQkxFX0NPTDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5yeEZpbHRlclRibFtpXVtpbmRleF0uYWRkclswXSA9PSBzcmNbMF0pCisgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+cnhGaWx0ZXJUYmxbaV1baW5kZXhdLmFkZHJbMV0gPT0gc3JjWzFdKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5hZGRyWzJdID09IHNyY1syXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5yeEZpbHRlclRibFtpXVtpbmRleF0udXAgPT0gdXApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKGZyYW1lVHlwZSYweDgwMCk9PTB4ODAwKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYod2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5zZXE9PXNlcSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICAvKiBoaXQgOiBkdXBsaWNhdGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMSwgIlJ4IGZpbHRlciBoaXQ9PmR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnRyYWZUYWxseS5yeER1cGxpY2F0ZSsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX1JYX0RVUExJQ0FURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaGl0IDogbm90IGR1cGxpY2F0ZWQgZnJhbWUsIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5zZXEgPSBzZXE7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMiwgIlJ4IGZpbHRlciBoaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGZvcihpPTA7IGk8Wk1fRklMVEVSX1RBQkxFX0NPTDsgaSsrKSAqLworCisgICAgICAgIC8qIG1pc3MgOiBhZGQgdG8gdGFibGUgKi8KKyAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiUnggZmlsdGVyIG1pc3MiKTsKKyAgICAgICAgLyogVE9ETyA6IFJhbmRvbSBzZWxlY3QgYSBjb2x1bW4gKi8KKyAgICAgICAgY29sID0gKHUxNl90KSh3ZC0+dGljayAmIChaTV9GSUxURVJfVEFCTEVfQ09MLTEpKTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLmFkZHJbMF0gPSBzcmNbMF07CisgICAgICAgIHdkLT5yeEZpbHRlclRibFtjb2xdW2luZGV4XS5hZGRyWzFdID0gc3JjWzFdOworICAgICAgICB3ZC0+cnhGaWx0ZXJUYmxbY29sXVtpbmRleF0uYWRkclsyXSA9IHNyY1syXTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLnNlcSA9IHNlcTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLnVwID0gdXA7CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9IC8qIGlmICgoZHN0MCAmIDB4MSkgPT0gMCkgKi8KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKKwordTE2X3QgemZUeEdlbldsYW5UYWlsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIG1pYykKK3sKKyAgICBzdHJ1Y3QgenNNaWNWYXIqICBwTWljS2V5OworICAgIHUxNl90ICBpLCBsZW5ndGgsIHBheWxvYWRPZmZzZXQ7CisgICAgdThfdCAgIGJWYWx1ZSwgcW9zVHlwZSA9IDA7CisgICAgdThfdCAgIHNuYXBCeXRlWzEyXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgcE1pY0tleSA9IHpmQXBHZXRUeE1pY0tleShkZXYsIGJ1ZiwgJnFvc1R5cGUpOworCisgICAgICAgIGlmICggcE1pY0tleSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZlN0YUdldFR4TWljS2V5KGRldiwgYnVmKTsKKworICAgICAgICBpZiAoIHBNaWNLZXkgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxlbmd0aCA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgemZNaWNDbGVhcihwTWljS2V5KTsKKworICAgIC8qIGFwcGVuZCBEQSBhbmQgU0EgKi8KKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICBmb3IoaT0xNjsgaTwyMjsgaSsrKQorICAgIHsgLy8gVklTVEEgREEKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyAgICBmb3IoaT0xMDsgaTwxNjsgaSsrKQorICAgIHsgLy8gVklTVEEgU0EKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyNlbHNlCisgICAgZm9yKGk9MDsgaTwxMjsgaSsrKQorICAgIHsKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogYXBwZW5kIGZvciBhbGlnbm1lbnQgKi8KKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgICAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpID4+IDUsIHBNaWNLZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBpZiAocW9zVHlwZSA9PSAxKQorICAgICAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpID4+IDUsIHBNaWNLZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBRb3MgU29mdHdhcmUgTUlDIGluIElCU1MgTW9kZSAqLworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworCisgICAgaWYgKCBzbmFwbGVuID09IDAgKQorICAgIHsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IFpNXzgwMjExX0ZSQU1FX1RZUEVfT0ZGU0VUOworCisgICAgICAgIGZvcihpPTA7IGk8KHNuYXBsZW4+PjEpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNuYXBCeXRlW2kqMl0gPSAodThfdCkgKHNuYXBbaV0gJiAweGZmKTsKKyAgICAgICAgICAgIHNuYXBCeXRlW2kqMisxXSA9ICh1OF90KSAoKHNuYXBbaV0gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7IGk8c25hcGxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoc25hcEJ5dGVbaV0sIHBNaWNLZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9cGF5bG9hZE9mZnNldDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGJWYWx1ZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkpOworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoYlZhbHVlLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICB6Zk1pY0dldE1pYyggKHU4X3QqKSBtaWMsIHBNaWNLZXkpOworCisgICAgcmV0dXJuIFpNX1NJWkVfT0ZfTUlDOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnICAgICAgICAgKi8KKy8qICAgICAgR2V0IElQIFRPUyBhbmQgZnJhZyBvZmZzZXQgZnJvbSBUeCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IFR4IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB1cCA6IHBvaW50ZXIgZm9yIHJldHVybmluZyB1c2VyIHByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZnJhZ09mZiA6IHBvaW50ZXIgZm9yIHJldHVybmluZyBpcCBmcmFnIG9mZnNldCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZUeEdldElwVG9zQW5kRnJhZyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHVwLCB1MTZfdCogZnJhZ09mZikKK3sKKyAgICB1OF90IGlwdjsKKyAgICB1MTZfdCBsZW47CisJdTE2X3QgZXRoZXJUeXBlOworICAgIHU4X3QgdG9zOworCisgICAgKnVwID0gMDsKKyAgICAqZnJhZ09mZiA9IDA7CisKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIGlmIChsZW4gPj0gMzQpIC8vTWluaW11bSBJUHY0IHBhY2tldCBzaXplLCAxNChFdGhlciBoZWFkZXIpKzIwKElQdjQgaGVhZGVyKQorICAgIHsKKyAgICAgICAgZXRoZXJUeXBlID0gKCgodTE2X3Qpem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfVFlQRV9PRkZTRVQpKTw8OCkKKyAgICAgICAgICAgICAgICAgICAgKyB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9UWVBFX09GRlNFVCArIDEpOworCisgICAgICAgIC8qIHByb3RvY29sIHR5cGUgPSBJUCAqLworICAgICAgICBpZiAoZXRoZXJUeXBlID09IDB4MDgwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaXB2ID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfSVBfT0ZGU0VUKSA+PiA0OworICAgICAgICAgICAgaWYgKGlwdiA9PSAweDQpIC8vSVB2NAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvcyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpOworICAgICAgICAgICAgICAgICp1cCA9ICh0b3MgPj4gNSk7CisgICAgICAgICAgICAgICAgKmZyYWdPZmYgPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9JUF9PRkZTRVQgKyA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRPRE8gOiBoYW5kbGUgVkxBTiB0YWcgYW5kIElQdjYgcGFja2V0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pCit7CisgICAgc25hcFswXSA9IHptd19idWZfcmVhZGgoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyAwKTsKKyAgICBzbmFwWzFdID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiArIDIpOworICAgIHNuYXBbMl0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgNCk7CisgICAgKnNuYXBsZW4gPSA2OworCisgICAgcmV0dXJuIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyAqc25hcGxlbjsKK30KKyNlbHNlCit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pCit7CisgICAgdTE2X3QgcmVtb3ZlZDsKKwkgICB1MTZfdCBldGhlclR5cGU7CisgICAJdTE2X3QgbGVuOworCisJICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaWYgKGxlbiA8IDE0KSAvL01pbmltdW0gRXRoZXJuZXQgcGFja2V0IHNpemUsIDE0KEV0aGVyIGhlYWRlcikKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBBc3NlcnQ/ICovCisgICAgICAgICpzbmFwbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgUkZDMTA0MiBoZWFkZXIgKi8KKyAgICBldGhlclR5cGUgPSAoKCh1MTZfdCl6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCAxMikpPDw4KQorICAgICAgICAgICAgICAgICsgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMTMpOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJldGhlcm5ldCB0eXBlIG9yIGxlbmd0aCA9ICIsIGV0aGVyVHlwZSk7CisKKyAgICBpZiAoZXRoZXJUeXBlID4gMTUwMCkKKyAgICB7CisgICAgICAgIC8qIEVUSEVSTkVUIGZvcm1hdCAqLworICAgICAgICByZW1vdmVkID0gMTI7CisgICAgICAgIHNuYXBbMF0gPSAweGFhYWE7CisgICAgICAgIHNuYXBbMV0gPSAweDAwMDM7CisgICAgICAgIGlmICgoZXRoZXJUeXBlID09MHg4MTM3KSB8fCAoZXRoZXJUeXBlID09IDB4ODBmMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJyaWRnZSBUdW5uZWwgKi8KKyAgICAgICAgICAgIHNuYXBbMl0gPSAweEY4MDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSRkMgMTA0MiAqLworICAgICAgICAgICAgc25hcFsyXSA9IDB4MDAwMDsKKyAgICAgICAgfQorICAgICAgICAqc25hcGxlbiA9IDY7CisKKyAgICAgICAgaWYgKCBldGhlclR5cGUgPT0gMHg4ODhFICkKKyAgICAgICAgeworICAgICAgICAgICAgemZTaG93VHhFQVBPTChkZXYsIGJ1ZiwgMTQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDgwMi4zIGZvcm1hdCAqLworICAgICAgICByZW1vdmVkID0gMTQ7CisgICAgICAgICpzbmFwbGVuID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVtb3ZlZDsKK30KKyNlbmRpZgorCit1OF90IHpmSXNWdHhxRW1wdHkoemRldl90KiBkZXYpCit7CisgICAgdThfdCBpc0VtcHR5ID0gVFJVRTsKKyAgICB1OF90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+dm1tcUhlYWQgIT0gd2QtPnZtbXFUYWlsKQorICAgIHsKKyAgICAgICAgaXNFbXB0eSA9IEZBTFNFOworICAgICAgICBnb3RvIGNoZWNrX2RvbmU7CisgICAgfQorCisgICAgZm9yKGk9MDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+dnR4cUhlYWRbaV0gIT0gd2QtPnZ0eHFUYWlsW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBpc0VtcHR5ID0gRkFMU0U7CisgICAgICAgICAgICBnb3RvIGNoZWNrX2RvbmU7CisgICAgICAgIH0KKyAgICB9CisKK2NoZWNrX2RvbmU6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gaXNFbXB0eTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHV0VnR4cSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQdXQgVHggYnVmZmVyIHRvIHZpcnR1YWwgVHhRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogVHggYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyBvciBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmUHV0VnR4cSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBhYzsKKyAgICB1OF90IHVwOworICAgIHUxNl90IGZyYWdPZmY7CisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgc3RydWN0IGFnZ1RhbGx5ICphZ2dfdGFsOworI2VuZGlmCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgI2lmbmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisJdTE2X3QgcmV0OworICAgIHUxNl90IHRpZDsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHpmVHhHZXRJcFRvc0FuZEZyYWcoZGV2LCBidWYsICZ1cCwgJmZyYWdPZmYpOworCisgICAgaWYgKCB3ZC0+emZjYkNsYXNzaWZ5VHhQYWNrZXQgIT0gTlVMTCApCisgICAgeworICAgICAgICBhYyA9IHdkLT56ZmNiQ2xhc3NpZnlUeFBhY2tldChkZXYsIGJ1Zik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFjID0gemNVcFRvQWNbdXAmMHg3XSAmIDB4MzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqIG1haW4gQS1NUERVIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uCisgICAgICovCisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgYWdnX3RhbCA9ICZ3ZC0+YWdnX3RhbDsKKyAgICBhZ2dfdGFsLT5nb3RfcGFja2V0c19zdW0rKzsKKworI2VuZGlmCisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAjaWZuZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICB0aWQgPSB1cCYweDc7CisgICAgaWYod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0wKQorICAgIHsKKyAgICAgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisgICAgICAgICAgICAvLyAoaW5mcmFzdHJ1Y3R1cmVfbW9kZSAmJiBjb25uZWN0X3RvXzExbl9hcCkgfHwgKGFwX21vZGUgJiYgaXNfMTFuX2FwKQorICAgICAgICAgICAgLy9yZXQgPSB6ZkFnZ1B1dFZ0eHEoZGV2LCBidWYpOworCisKKyAgICAgICAgICAgIHJldCA9IHpmQWdnVHgoZGV2LCBidWYsIHRpZCk7CisgICAgICAgICAgICBpZiAoWk1fU1VDQ0VTUyA9PSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEID09IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4UW9zRHJvcENvdW50W2FjXSsrOworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgVlRYUSBmdWxsLCBhYz0iLCBhYyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRSA9PSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAqIGNvbnRpbnVlIGZvbGxvd2luZyBwcm9jZXNzaW9uLCBwdXQgaW50byBWVFhRCisgICAgICAgICAgICAgICAgKiByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorI2VuZGlmCisgICAgLyoKKyAgICAgKiBlbmQgb2YgYWRkIGJ5IGhvbmRhCisgICAgICovCisKKyAgICAvKiBGaXJzdCBJcCBmcmFnICovCisgICAgaWYgKChmcmFnT2ZmICYgMHhmZjNmKSA9PSAweDAwMjApCisgICAgeworICAgICAgICAvKiBEb24ndCBsZXQgaXAgZnJhZyBpbiBpZiBWVFhRIHVuYWJsZSB0byBob2xkICovCisgICAgICAgIC8qIHdob2xlIGlwIGZyYWcgYnVyc3QoYXNzdW1lIDIwIGZyYWcpICAgICAgICAgKi8KKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKCgod2QtPnZ0eHFIZWFkW2FjXSAtIHdkLT52dHhxVGFpbFthY10pJiBaTV9WVFhRX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA+IChaTV9WVFhRX1NJWkUtMjApKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cW9zRHJvcElwRnJhZ1thY10gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnFvc0Ryb3BJcEZyYWdbYWNdID0gMDsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICh3ZC0+cW9zRHJvcElwRnJhZ1thY10gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ2dFEgZnVsbCwgZHJvcCBidWYgPSAiLCBidWYpOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgZmlyc3QgaXAgZnJhZywgYWM9IiwgYWMpOworICAgICAgICAgICAgLy9WVFhRW10gY2FuIG5vdCBob2xkIHdob2xkIGlwIGZyYWcgYnVyc3QoYXNzdW1lIDIwIGZyYWdzKQorICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmcmFnT2ZmICYgMHhmZjNmKSA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPnFvc0Ryb3BJcEZyYWdbYWNdID0gMDsKKyAgICB9CisKKyAgICBpZiAoKChmcmFnT2ZmICY9IDB4ZmYxZikgIT0gMCkgJiYgKHdkLT5xb3NEcm9wSXBGcmFnW2FjXSA9PSAxKSkKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkudHhRb3NEcm9wQ291bnRbYWNdKys7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzEsICJQYWNrZXQgZGlzY2FyZGVkLCBpcCBmcmFnLCBhYz0iLCBhYyk7CisgICAgICAgIC8vRGlzY2FyZCBmb2xsb3dpbmcgaXAgZnJhZ3MKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCgod2QtPnZ0eHFIZWFkW2FjXSArIDEpICYgWk1fVlRYUV9TSVpFX01BU0spICE9IHdkLT52dHhxVGFpbFthY10pCisgICAgeworICAgICAgICB3ZC0+dnR4cVthY11bd2QtPnZ0eHFIZWFkW2FjXV0gPSBidWY7CisgICAgICAgIHdkLT52dHhxSGVhZFthY10gPSAoKHdkLT52dHhxSGVhZFthY10gKyAxKSAmIFpNX1ZUWFFfU0laRV9NQVNLKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgWk1fU1VDQ0VTUyk7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMSwgIlBhY2tldCBkaXNjYXJkZWQsIFZUWFEgZnVsbCwgYWM9IiwgYWMpOworICAgICAgICByZXR1cm4gWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQ7IC8vVlRYUVtdIEZ1bGwKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmR2V0VnR4cSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHZXQgVHggYnVmZmVyIGZyb20gdmlydHVhbCBUeFEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUeCBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworemJ1Zl90KiB6ZkdldFZ0eHEoemRldl90KiBkZXYsIHU4X3QgYWMpCit7CisgICAgemJ1Zl90KiBidWY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWMgJj0gMHgzOworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKHdkLT52dHhxSGVhZFthY10gIT0gd2QtPnZ0eHFUYWlsW2FjXSkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHdkLT52dHhxW2FjXVt3ZC0+dnR4cVRhaWxbYWNdXTsKKyAgICAgICAgd2QtPnZ0eHFUYWlsW2FjXSA9ICgod2QtPnZ0eHFUYWlsW2FjXSArIDEpICYgWk1fVlRYUV9TSVpFX01BU0spOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMDsgLy9WVFhRW10gZW1wdHkKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlB1dFZtbXEgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUHV0IFR4IGJ1ZmZlciB0byB2aXJ0dWFsIE1tUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IFR4IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFpNX1NVQ0NFU1Mgb3IgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlB1dFZtbXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKCh3ZC0+dm1tcUhlYWQgKyAxKSAmIFpNX1ZNTVFfU0laRV9NQVNLKSAhPSB3ZC0+dm1tcVRhaWwpCisgICAgeworICAgICAgICB3ZC0+dm1tcVt3ZC0+dm1tcUhlYWRdID0gYnVmOworICAgICAgICB3ZC0+dm1tcUhlYWQgPSAoKHdkLT52bW1xSGVhZCArIDEpICYgWk1fVk1NUV9TSVpFX01BU0spOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiUGFja2V0IGRpc2NhcmRlZCwgVk1tUSBmdWxsIik7CisgICAgICAgIHJldHVybiBaTV9FUlJfVk1NUV9GVUxMOyAvL1ZUWFFbXSBGdWxsCisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkdldFZtbXEgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2V0IFR4IGJ1ZmZlciBmcm9tIHZpcnR1YWwgTW1RICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVHggYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZHZXRWbW1xKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPnZtbXFIZWFkICE9IHdkLT52bW1xVGFpbCkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHdkLT52bW1xW3dkLT52bW1xVGFpbF07CisgICAgICAgIHdkLT52bW1xVGFpbCA9ICgod2QtPnZtbXFUYWlsICsgMSkgJiBaTV9WTU1RX1NJWkVfTUFTSyk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOyAvL1ZUWFFbXSBlbXB0eQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHVzaFZ0eHEgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTZXJ2aWNlIFZpcnR1YWwgVHhRICh3ZWlnaHRlZCByb3VuZCByb2JpbikgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2V0IFR4IGJ1ZmZlciBmb3JtIHZpcnR1YWwgVHhRIGFuZCBwdXQgdG8gaGFyZHdhcmUgVHhEIHF1ZXVlICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZQdXNoVnR4cSh6ZGV2X3QqIGRldikKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHR4ZWQ7CisgICAgdTMyX3QgZnJlZVR4ZDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3Qgc2tpcEZsYWcgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKworICAgIC8vem1fZGVidWdfbXNnMSgiemZIcEdldEZyZWVUeGRDb3VudCA9ICIsIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSk7CisKKyAgICBpZiAod2QtPmhhbFN0YXRlID09IFpNX0hBTF9TVEFURV9JTklUKQorICAgIHsKKyAgICAgICAgaWYgKCF3ZC0+bW9kZU1ES0VuYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSEFMIGlzIG5vdCByZWFkeSBmb3IgVHgiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT5zdGEuREZTRGlzYWJsZVR4KQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmV0dXJuIGJlY2F1c2UgODAyLjExaCBERlMgRGlzYWJsZSBUeCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyAhPSAwKQorICAgIHsKKyAgICAgICAgLy9Ib2xkIHVudGlsIFJGIGZyZXF1ZW5jeSBjaGFuZ2VkCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoKCB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyApICYmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVAgKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX1BPV0VSX1NBVkUKKyAgICBlbHNlIGlmICggemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlBhY2tldHMgcXVldWVkIHNpbmNlIHRoZSBNQUMgaXMgaW4gcG93ZXItc2F2aW5nIG1vZGVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICh3ZC0+dnR4cVB1c2hpbmcgIT0gMCkKKyAgICB7CisgICAgICAgIHNraXBGbGFnID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnZ0eHFQdXNoaW5nID0gMTsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChza2lwRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgdHhlZCA9IDA7CisKKyAgICAgICAgLyogMjAwNi4xMi4yMCwgU2VydmUgTWFuYWdlbWVudCBxdWV1ZSAqLworICAgICAgICB3aGlsZSggemZIcEdldEZyZWVUeGRDb3VudChkZXYpID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWbW1xKGRldikpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJzZW5kIGJ1ZiA9ICIsIGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh3ZC0+c3RhLmJTY2hlZHVsZVNjYW4pIHx8ICgod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gVFJVRSkgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvL0hvbGQgdW50aWwgU2NhbiBTdG9wCisgICAgICAgICAgICB3ZC0+dnR4cVB1c2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAjaWZuZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICAgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisKKyAgICAgICAgICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAwKTsKKworICAgICAgICAgICAgaWYgKHR4ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHdkLT52dHhxUHVzaGluZyA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgICAgIC8qIFNlcnZpY2UgVlR4UVszXSAqLworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZnJlZVR4ZCA9IHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSkgPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1ZiA9IHpmR2V0VnR4cShkZXYsIDMpKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigic2VuZCBidWYgPSAiLCBidWYpOworICAgICAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgWk1fUEVSRk9STUFOQ0VfVFhfTVBEVShkZXYsIHdkLT50aWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMl0gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGZyZWVUeGQgPSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID49ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoxLzQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWdHhxKGRldiwgMikpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmFjMFByaW9yaXR5SGlnaGVyVGhhbkFjMiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChidWYgPSB6ZkdldFZ0eHEoZGV2LCAwKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMF0gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGZyZWVUeGQgPSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID49ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoyLzQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWdHhxKGRldiwgMCkpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMV0gKi8KKyAgICAgICAgaWYgKChmcmVlVHhkID0gemZIcEdldEZyZWVUeGRDb3VudChkZXYpKSA+PSAoemZIcEdldE1heFR4ZENvdW50KGRldikqMy80KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChidWYgPSB6ZkdldFZ0eHEoZGV2LCAxKSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICBaTV9QRVJGT1JNQU5DRV9UWF9NUERVKGRldiwgd2QtPnRpY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWxsIFZUeFFzIGFyZSBlaXRoZXIgZW1wdHkgb3IgZXhjZWVkIHRoZWlyIHRocmVzaG9sZCAqLworICAgICAgICBpZiAodHhlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+dnR4cVB1c2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSAvL3doaWxlICgxKQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZsdXNoVnR4cSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmx1c2ggVmlydHVhbCBUeFEgYW5kIE1tUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZGbHVzaFZ0eHEoemRldl90KiBkZXYpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgdThfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEZsdXNoIE1tUSAqLworICAgIHdoaWxlICgoYnVmID0gemZHZXRWbW1xKGRldikpICE9IDApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZGbHVzaFZ0eHE6IFtWbW1xXSIpOworICAgICAgICB3ZC0+cXVldWVGbHVzaGVkICB8PSAweDEwOworICAgIH0KKworICAgIC8qIEZsdXNoIFZUeFEgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICB3aGlsZSAoKGJ1ZiA9IHpmR2V0VnR4cShkZXYsIGkpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoInpmRmx1c2hWdHhxOiBbemZHZXRWdHhxXS0gIiwgaSk7CisgICAgICAgICAgICB3ZC0+cXVldWVGbHVzaGVkIHw9ICgxPDxpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZjgwMjExRnJhbWVTZW5kKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCBoZWFkZXJMZW4sIHUxNl90KiBzbmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHUxNl90IG9mZnNldCwgdTE2X3QgYnVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYWMsIHU4X3Qga2V5SWR4KQoreworICAgIHUxNl90IGVycjsKKyAgICB1MTZfdCBmcmFnTGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhZ0xlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIGlmICgoZGFbMF0mMHgxKSA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0rKzsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RPY3RldHMgKz0gKGZyYWdMZW4rc25hcExlbik7CisgICAgfQorICAgIGVsc2UgaWYgKGRhWzBdID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm0rKzsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eEJyb2FkY2FzdE9jdGV0cyArPSAoZnJhZ0xlbitzbmFwTGVuKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybSsrOworICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0T2N0ZXRzICs9IChmcmFnTGVuK3NuYXBMZW4pOworICAgIH0KKyAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYysrOworCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGVhZGVyTGVuLCBzbmFwLCBzbmFwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZUeXBlLCBhYywga2V5SWR4KSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGlmIChidWZUeXBlID09IFpNX0VYVEVSTkFMX0FMTE9DX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChidWZUeXBlID09IFpNX0lOVEVSTkFMX0FMTE9DX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZDaGVja0lzUklGU0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZnJhbWVTdWJ0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qICMyIFJlY29yZCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1bmljYXN0IGZyYW1lIGlzIHNlcGFyYXRlZCBieSBSSUZTIG9yIG5vdCAqLworICAgIGlmIChmcmFtZVN1YnR5cGUgJiAweDgwKQorICAgIHsgICAvL1FvUyBkYXRhIGZyYW1lCisgICAgICAgIHUxNl90IHNlcXVlbmNlTnVtOworICAgICAgICB1MTZfdCBxb3NDb250cm9sRmllbGQ7CisKKyAgICAgICAgc2VxdWVuY2VOdW0gPSAoIHptd19idWZfcmVhZGgoZGV2LCBidWYsIDIyKSA+PiA0ICk7IC8vIERpc2NhcmQgZnJhZ21lbnQgbnVtYmVyICEKKyAgICAgICAgcW9zQ29udHJvbEZpZWxkID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjQpOyAvLyBEb24ndCBjb25zaWRlciBXRFMgKFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0pCisgICAgICAgIC8vRGJnUHJpbnQoIlRoZSBRb1MgQ29udHJvbCBGaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWQiLCBxb3NDb250cm9sRmllbGQpOworICAgICAgICAvL0RiZ1ByaW50KCJUaGUgUklGUyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICVkIiwgd2QtPnN0YS5yaWZzQ291bnQpOworCisgICAgICAgIGlmKCBxb3NDb250cm9sRmllbGQgJiBaTV9CSVRfNSApCisgICAgICAgIHsvLyBBQ0sgcG9saWN5IGlzICJObyBBQ0siCisgICAgICAgICAgICAvKiBSSUZTLUxpa2UgZnJhbWUgKi8KKyAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlW3dkLT5zdGEucmlmc0xpa2VGcmFtZUNudF0gICA9IHNlcXVlbmNlTnVtOworCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXSAhPSAwICkKKyAgICAgICAgICAgICAgICB7Ly8gUklGUy1saWtlIFBhdHRlcm4gY29sbGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGlmKCAoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzJdIC0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPT0gMiApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzFdIC0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMF0gPT0gMiApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogUklGUyBwYXR0ZXJuIG1hdGNoZWQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogIzMgRW5hYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIFJJRlMgcGF0dGVybiBtYXRjaGVkICAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZIcEVuYWJsZVJpZnMoZGV2LCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTwzMDAwKT8xOjApLCB3ZC0+c3RhLkVuYWJsZUhULCB3ZC0+c3RhLkhUMjA0MCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBSSUZTIHRpbWVyCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNUaW1lciA9IHdkLT50aWNrOworCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNDb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc3RhdGUgdG8gYmUgRGV0ZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsvLyBzdGF0ZSA9IERldGVjdGVkCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgUklGUyB0aW1lcgorICAgICAgICAgICAgICAgIGlmKCAod2QtPnRpY2sgLSB3ZC0+c3RhLnJpZnNUaW1lcikgPCBaTV9SSUZTX1RJTUVSX1RJTUVPVVQgKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNUaW1lciA9IHdkLT50aWNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0RiZ1ByaW50KCJTTjEgPSAlZCwgU04yID0gJWQsIFNOMyA9ICVkXG4iLCB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzFdLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMl0pOworCisgICAgICAgICAgICAvLyBVcGRhdGUgUklGUy1saWtlIHNlcXVlbmNlIG51bWJlcgorICAgICAgICAgICAgaWYoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzJdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzBdID0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV07CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPSB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkgcmVjb3JkIHRocmVlIGFkamFjZW50IGZyYW1lCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250IDwgMiApCisgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAjNCBEaXNhYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIHRpbWVyIFRJTUVPVVQgICovCisgICAgaWYoIHdkLT5zdGEucmlmc1N0YXRlID09IFpNX1JJRlNfU1RBVEVfREVURUNURUQgKQorICAgIHsKKyAgICAgICAgaWYoICggd2QtPnRpY2sgLSB3ZC0+c3RhLnJpZnNUaW1lciApID4gWk1fUklGU19USU1FUl9USU1FT1VUICkKKyAgICAgICAgey8vIFRJTUVPVVQKKyAgICAgICAgICAgIC8vIERpc2FibGUgUklGUworICAgICAgICAgICAgemZIcERpc2FibGVSaWZzKGRldik7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IFJJRlMtbGlrZSBzZXF1ZW5jZSBudW1iZXIgRklGTworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMF0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMl0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250ID0gMDsKKworICAgICAgICAgICAgLy8gU2V0IHN0YXRlIHRvIGJlIERldGVjdGluZworICAgICAgICAgICAgd2QtPnN0YS5yaWZzU3RhdGUgPSBaTV9SSUZTX1NUQVRFX0RFVEVDVElORzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzFiYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dlcC5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjd2VwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFR4IGFuZCBSeCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordTMyX3QgY3JjMzJfdGFiW10gPQoreworICAgICAgIDB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhlZTBlNjEyY0wsIDB4OTkwOTUxYmFMLCAweDA3NmRjNDE5TCwKKyAgICAgICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCisgICAgICAgMHhlMGQ1ZTkxZUwsIDB4OTdkMmQ5ODhMLCAweDA5YjY0YzJiTCwgMHg3ZWIxN2NiZEwsIDB4ZTdiODJkMDdMLAorICAgICAgIDB4OTBiZjFkOTFMLCAweDFkYjcxMDY0TCwgMHg2YWIwMjBmMkwsIDB4ZjNiOTcxNDhMLCAweDg0YmU0MWRlTCwKKyAgICAgICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCisgICAgICAgMHg2NDZiYThjMEwsIDB4ZmQ2MmY5N2FMLCAweDhhNjVjOWVjTCwgMHgxNDAxNWM0ZkwsIDB4NjMwNjZjZDlMLAorICAgICAgIDB4ZmEwZjNkNjNMLCAweDhkMDgwZGY1TCwgMHgzYjZlMjBjOEwsIDB4NGM2OTEwNWVMLCAweGQ1NjA0MWU0TCwKKyAgICAgICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCisgICAgICAgMHgzNWI1YThmYUwsIDB4NDJiMjk4NmNMLCAweGRiYmJjOWQ2TCwgMHhhY2JjZjk0MEwsIDB4MzJkODZjZTNMLAorICAgICAgIDB4NDVkZjVjNzVMLCAweGRjZDYwZGNmTCwgMHhhYmQxM2Q1OUwsIDB4MjZkOTMwYWNMLCAweDUxZGUwMDNhTCwKKyAgICAgICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCisgICAgICAgMHhiOGJkYTUwZkwsIDB4MjgwMmI4OWVMLCAweDVmMDU4ODA4TCwgMHhjNjBjZDliMkwsIDB4YjEwYmU5MjRMLAorICAgICAgIDB4MmY2ZjdjODdMLCAweDU4Njg0YzExTCwgMHhjMTYxMWRhYkwsIDB4YjY2NjJkM2RMLCAweDc2ZGM0MTkwTCwKKyAgICAgICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCisgICAgICAgMHg5ZmJmZTRhNUwsIDB4ZThiOGQ0MzNMLCAweDc4MDdjOWEyTCwgMHgwZjAwZjkzNEwsIDB4OTYwOWE4OGVMLAorICAgICAgIDB4ZTEwZTk4MThMLCAweDdmNmEwZGJiTCwgMHgwODZkM2QyZEwsIDB4OTE2NDZjOTdMLCAweGU2NjM1YzAxTCwKKyAgICAgICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCisgICAgICAgMHgxYjAxYTU3YkwsIDB4ODIwOGY0YzFMLCAweGY1MGZjNDU3TCwgMHg2NWIwZDljNkwsIDB4MTJiN2U5NTBMLAorICAgICAgIDB4OGJiZWI4ZWFMLCAweGZjYjk4ODdjTCwgMHg2MmRkMWRkZkwsIDB4MTVkYTJkNDlMLCAweDhjZDM3Y2YzTCwKKyAgICAgICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCisgICAgICAgMHg0YWRmYTU0MUwsIDB4M2RkODk1ZDdMLCAweGE0ZDFjNDZkTCwgMHhkM2Q2ZjRmYkwsIDB4NDM2OWU5NmFMLAorICAgICAgIDB4MzQ2ZWQ5ZmNMLCAweGFkNjc4ODQ2TCwgMHhkYTYwYjhkMEwsIDB4NDQwNDJkNzNMLCAweDMzMDMxZGU1TCwKKyAgICAgICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCisgICAgICAgMHhjOTBjMjA4NkwsIDB4NTc2OGI1MjVMLCAweDIwNmY4NWIzTCwgMHhiOTY2ZDQwOUwsIDB4Y2U2MWU0OWZMLAorICAgICAgIDB4NWVkZWY5MGVMLCAweDI5ZDljOTk4TCwgMHhiMGQwOTgyMkwsIDB4YzdkN2E4YjRMLCAweDU5YjMzZDE3TCwKKyAgICAgICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCisgICAgICAgMHgwM2I2ZTIwY0wsIDB4NzRiMWQyOWFMLCAweGVhZDU0NzM5TCwgMHg5ZGQyNzdhZkwsIDB4MDRkYjI2MTVMLAorICAgICAgIDB4NzNkYzE2ODNMLCAweGUzNjMwYjEyTCwgMHg5NDY0M2I4NEwsIDB4MGQ2ZDZhM2VMLCAweDdhNmE1YWE4TCwKKyAgICAgICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCisgICAgICAgMHg4NzA4YTNkMkwsIDB4MWUwMWYyNjhMLCAweDY5MDZjMmZlTCwgMHhmNzYyNTc1ZEwsIDB4ODA2NTY3Y2JMLAorICAgICAgIDB4MTk2YzM2NzFMLCAweDZlNmIwNmU3TCwgMHhmZWQ0MWI3NkwsIDB4ODlkMzJiZTBMLCAweDEwZGE3YTVhTCwKKyAgICAgICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCisgICAgICAgMHhkNmQ2YTNlOEwsIDB4YTFkMTkzN2VMLCAweDM4ZDhjMmM0TCwgMHg0ZmRmZjI1MkwsIDB4ZDFiYjY3ZjFMLAorICAgICAgIDB4YTZiYzU3NjdMLCAweDNmYjUwNmRkTCwgMHg0OGIyMzY0YkwsIDB4ZDgwZDJiZGFMLCAweGFmMGExYjRjTCwKKyAgICAgICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCisgICAgICAgMHg0NjY5YmU3OUwsIDB4Y2I2MWIzOGNMLCAweGJjNjY4MzFhTCwgMHgyNTZmZDJhMEwsIDB4NTI2OGUyMzZMLAorICAgICAgIDB4Y2MwYzc3OTVMLCAweGJiMGI0NzAzTCwgMHgyMjAyMTZiOUwsIDB4NTUwNTI2MmZMLCAweGM1YmEzYmJlTCwKKyAgICAgICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCisgICAgICAgMHgyY2Q5OWU4YkwsIDB4NWJkZWFlMWRMLCAweDliNjRjMmIwTCwgMHhlYzYzZjIyNkwsIDB4NzU2YWEzOWNMLAorICAgICAgIDB4MDI2ZDkzMGFMLCAweDljMDkwNmE5TCwgMHhlYjBlMzYzZkwsIDB4NzIwNzY3ODVMLCAweDA1MDA1NzEzTCwKKyAgICAgICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCisgICAgICAgMHhlNWQ1YmUwZEwsIDB4N2NkY2VmYjdMLCAweDBiZGJkZjIxTCwgMHg4NmQzZDJkNEwsIDB4ZjFkNGUyNDJMLAorICAgICAgIDB4NjhkZGIzZjhMLCAweDFmZGE4MzZlTCwgMHg4MWJlMTZjZEwsIDB4ZjZiOTI2NWJMLCAweDZmYjA3N2UxTCwKKyAgICAgICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCisgICAgICAgMHg4ZjY1OWVmZkwsIDB4Zjg2MmFlNjlMLCAweDYxNmJmZmQzTCwgMHgxNjZjY2Y0NUwsIDB4YTAwYWUyNzhMLAorICAgICAgIDB4ZDcwZGQyZWVMLCAweDRlMDQ4MzU0TCwgMHgzOTAzYjNjMkwsIDB4YTc2NzI2NjFMLCAweGQwNjAxNmY3TCwKKyAgICAgICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCisgICAgICAgMHgzN2Q4M2JmMEwsIDB4YTliY2FlNTNMLCAweGRlYmI5ZWM1TCwgMHg0N2IyY2Y3ZkwsIDB4MzBiNWZmZTlMLAorICAgICAgIDB4YmRiZGYyMWNMLCAweGNhYmFjMjhhTCwgMHg1M2IzOTMzMEwsIDB4MjRiNGEzYTZMLCAweGJhZDAzNjA1TCwKKyAgICAgICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCisgICAgICAgMHg1ZDY4MWIwMkwsIDB4MmE2ZjJiOTRMLCAweGI0MGJiZTM3TCwgMHhjMzBjOGVhMUwsIDB4NWEwNWRmMWJMLAorICAgICAgIDB4MmQwMmVmOGRMCit9OworCit2b2lkIHpmV0VQRW5jcnlwdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90IG9mZnNldCwgdThfdCBrZXlMZW4sIHU4X3QqIFdlcEtleSwgdThfdCAqaXYpCit7CisgICAgdThfdCAgICBTWzI1Nl0sUzJbMjU2XTsKKyAgICB1MTZfdCAgIHVpOworICAgIHUxNl90ICAgaTsKKyAgICB1MTZfdCAgIGo7CisgICAgdThfdCAgICB0ZW1wOworICAgIHU4X3QgICAgSzsKKyAgICB1MzJfdCAgIGx0ZW1wOworICAgIHUxNl90ICAgbGVuOworICAgIHUzMl90ICAgaWN2OworICAgIHU4X3QgICAga2V5WzMyXTsKKworICAgIGtleVswXSA9IGl2WzBdOworICAgIGtleVsxXSA9IGl2WzFdOworICAgIGtleVsyXSA9IGl2WzJdOworCisgICAgLyogQXBwZW5kIFdlcCBLZXkgYWZ0ZXIgSVYgKi8KKyAgICB6Zk1lbW9yeUNvcHkoJmtleVszXSwgV2VwS2V5LCBrZXlMZW4pOworCisgICAga2V5TGVuICs9IDM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIFNbaV0gPSAodThfdClpOworICAgICAgICBTMltpXSA9IGtleVtpJihrZXlMZW4tMSldOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChqICsgU1tpXSArIFMyW2ldKSA7CisgICAgICAgIGomPTI1NSA7CisKKyAgICAgICAgLy8gU3dhcCBTW2ldIGFuZCBTW2pdCisgICAgICAgIHRlbXAgPSBTW2ldOworICAgICAgICBTW2ldID0gU1tqXTsKKyAgICAgICAgU1tqXSA9IHRlbXA7CisgICAgfQorCisgICAgaSA9IGogPSAwOworICAgIGljdiA9IC0xOworCisgICAgLyogRm9yIFNuYXAgSGVhZGVyICovCisgICAgZm9yICh1aSA9IDA7IHVpIDwgc25hcExlbjsgdWkrKykKKyAgICB7CisgICAgICAgIHU4X3QgSW47CisKKyAgICAgICAgaSsrOworICAgICAgICBpICY9IDI1NTsKKyAgICAgICAgaiArPSBTW2ldOworICAgICAgICBqICY9IDI1NTsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKy8vICAgICAgICAgIHRlbXAgPSAoU1tpXSArIHRlbXApICYgMjU1OworICAgICAgICB0ZW1wICs9IFNbaV07CisgICAgICAgIHRlbXAgJj0yNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIEluID0gc25hcFt1aV07CisgICAgICAgIGljdiA9ICAoaWN2Pj44KSBeIGNyYzMyX3RhYlsoaWN2XkluKSYweGZmXTsKKworICAgICAgICBzbmFwW3VpXSA9IEluIF4gSzsKKyAgICAgICAgLy96bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1ZiwgdWksIEluIF4gSyk7CisgICAgfQorCisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICBmb3IgKHVpID0gb2Zmc2V0OyB1aSA8IGxlbjsgdWkrKykKKyAgICB7CisgICAgICAgIHU4X3QgSW47CisKKyAgICAgICAgaSsrOworICAgICAgICBpICY9IDI1NTsKKyAgICAgICAgaiArPSBTW2ldOworICAgICAgICBqICY9IDI1NTsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKy8vICAgICAgICAgIHRlbXAgPSAoU1tpXSArIHRlbXApICYgMjU1OworICAgICAgICB0ZW1wICs9IFNbaV07CisgICAgICAgIHRlbXAgJj0yNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIEluID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgdWkpOworICAgICAgICBpY3YgPSAgKGljdj4+OCkgXiBjcmMzMl90YWJbKGljdl5JbikmMHhmZl07CisKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIHVpLCBJbiBeIEspOworICAgIH0gLy9FbmQgb2YgZm9yICh1aSA9IDA7IHVpIDwgTnVtX0J5dGVzOyB1aSsrKQorCisgICAgaWN2ID0gfihpY3YpOworICAgIGx0ZW1wID0gKHUzMl90KSBpY3Y7CisKKyAgICBmb3IgKHVpID0gMDsgdWkgPCA0OyB1aSsrKQorICAgIHsKKyAgICAgICAgaSArKzsKKyAgICAgICAgaSAmPSAyNTU7CisgICAgICAgIGogKz0gU1tpXTsKKyAgICAgICAgaiAmPSAyNTU7CisKKyAgICAgICAgLy8gU3dhcCBTW2ldIGFuZCBTW2pdCisgICAgICAgIHRlbXAgPSBTW2ldOworICAgICAgICBTW2ldID0gU1tqXTsKKyAgICAgICAgU1tqXSA9IHRlbXA7CisgICAgICAgIHRlbXAgKz0gU1tpXTsKKyAgICAgICAgdGVtcCAmPSAyNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIC8vKk91dCsrID0gKHU4X3QpKGx0ZW1wIF4gSykmMHhmZjsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIGxlbit1aSwgKHU4X3QpKGx0ZW1wIF4gSykmMHhmZik7CisgICAgICAgIGx0ZW1wID4+PSA4OworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIGxlbis0KTsKK30KKwordTE2X3QgemZXRVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCogV2VwS2V5LCB1OF90ICppdikKK3sKKyAgICB1OF90ICAgIFNbMjU2XTsKKyAgICB1OF90ICAgIFMyWzI1Nl07CisgICAgdTE2X3QgICB1aTsKKyAgICB1MTZfdCAgIGk7CisgICAgdTE2X3QgICBqOworICAgIHUzMl90ICAgaWN2X3RtcDsKKyAgICB1MzJfdCAgICppY3Y7CisgICAgdTMyX3QgICByeGJ1Zl9pY3Y7CisgICAgdThfdCAgICB0ZW1wOworICAgIHU4X3QgICAgSzsKKyAgICB1MTZfdCAgIGxlbjsKKyAgICB1OF90ICAgIGtleVszMl07CisKKyAgICAvKiBSZXRyaWV2ZSBJViAqLworICAgIGtleVswXSA9IGl2WzBdOworICAgIGtleVsxXSA9IGl2WzFdOworICAgIGtleVsyXSA9IGl2WzJdOworCisgICAgLyogQXBwZW5kIFdlcCBLZXkgYWZ0ZXIgSVYgKi8KKyAgICB6Zk1lbW9yeUNvcHkoJmtleVszXSwgV2VwS2V5LCBrZXlMZW4pOworCisgICAga2V5TGVuICs9IDM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIFNbaV0gPSAodThfdClpOworICAgICAgICBTMltpXSA9IGtleVtpJihrZXlMZW4tMSldOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChqICsgU1tpXSArIFMyW2ldKTsKKyAgICAgICAgaiY9MjU1IDsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKyAgICB9CisKKyAgICBpID0gaiA9IDA7CisKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIGZvciAodWkgPSBvZmZzZXQ7IHVpIDwgbGVuOyB1aSsrKQorICAgIHsKKyAgICAgICAgdThfdCBJbjsKKworICAgICAgICBpKys7CisgICAgICAgIGkgJj0gMjU1OworICAgICAgICBqICs9IFNbaV07CisgICAgICAgIGogJj0gMjU1OworCisgICAgICAgIC8vIFN3YXAgU1tpXSBhbmQgU1tqXQorICAgICAgICB0ZW1wID0gU1tpXTsKKyAgICAgICAgU1tpXSA9IFNbal07CisgICAgICAgIFNbal0gPSB0ZW1wOworLy8gICAgICAgICAgdGVtcCA9IChTW2ldICsgdGVtcCkgJiAyNTU7CisgICAgICAgIHRlbXAgKz0gU1tpXTsKKyAgICAgICAgdGVtcCAmPTI1NTsKKyAgICAgICAgSyA9IFNbdGVtcF07ICAgICAgICAvLyBLZXkgdXNlZCB0byBYb3Igd2l0aCBpbnB1dCBkYXRhCisKKyAgICAgICAgSW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCB1aSk7CisKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBidWYsIHVpLCBJbiBeIEspOworICAgIH0gLy9FbmQgb2YgZm9yICh1aSA9IDA7IHVpIDwgTnVtX0J5dGVzOyB1aSsrKQorCisgICAgaWN2ID0gJmljdl90bXA7CisgICAgKmljdiA9IC0xOworCisgICAgZm9yICh1aSA9IG9mZnNldDsgdWkgPCBsZW4gLSA0OyB1aSsrKQorICAgIHsKKyAgICAgICAgdThfdCBJbjsKKworICAgICAgICBJbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIHVpKTsKKyAgICAgICAgKmljdiA9ICAoKmljdj4+OCkgXiBjcmMzMl90YWJbKCppY3ZeSW4pJjB4ZmZdOworICAgIH0KKworICAgICppY3YgPSB+KmljdjsKKworICAgIHJ4YnVmX2ljdiA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tNCkgfAorICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTMpIDw8IDggfAorICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTIpIDw8IDE2IHwKKyAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbi0xKSA8PCAyNCk7CisKKyAgICBpZiAoKmljdiAhPSByeGJ1Zl9pY3YpCisgICAgeworICAgICAgICByZXR1cm4gWk1fSUNWX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0lDVl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjExNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dtLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN3bS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgY2hhbm5lbCB3aWR0aCByZWxhdGVkIGZ1bmN0aW9ucy4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKKworCit2b2lkIHpmQ3dtSW5pdCh6ZGV2X3QqIGRldikgeworICAgIC8vdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT53bGFuTW9kZSkgeworICAgIGNhc2UgWk1fTU9ERV9BUDoKKyAgICAgICAgd2QtPmN3bS5jd19tb2RlID0gQ1dNX01PREUyMDQwOworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIHdkLT5jd20uY3dfZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFOgorICAgIGNhc2UgWk1fTU9ERV9QU0VVRE86CisgICAgY2FzZSBaTV9NT0RFX0lCU1M6CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2QtPmN3bS5jd19tb2RlID0gQ1dNX01PREUyMDQwOworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHdkLT5jd20uY3dfZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgemZDb3JlQ3dtQnVzeSh6ZGV2X3QqIGRldiwgdTE2X3QgYnVzeSkKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkN3bUJ1c3k9IiwgYnVzeSk7CisKKyAgICBpZih3ZC0+Y3dtLmN3X21vZGUgPT0gQ1dNX01PREUyMCkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZih3ZC0+Y3dtLmN3X21vZGUgPT0gQ1dNX01PREU0MCkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYnVzeSkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIGlmKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSB8fCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8gfHwKKyAgICAgICAgd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykpIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYmIEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldCAhPSAwICYmCisgICAgICAgICAgICB3ZC0+c3RhLmllLkh0SW5mby5DaGFubmVsSW5mbyAmJiBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQgIT0gMCAmJgorICAgICAgICAgICAgKHdkLT5zdGEuaWUuSHRJbmZvLkNoYW5uZWxJbmZvICYmIEV4dEh0Q2FwX0V4dENoYW5uZWxPZmZzZXRBYm92ZSkgPT0gMSkgeworCisgICAgICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgd2QtPmN3bS5jd193aWR0aCA9IENXTV9XSURUSDQwOworICAgIH0KKworfQorCisKKworCit1MTZfdCB6ZkN3bUlzRXh0Q2hhbkJ1c3kodTMyX3QgY3RsQnVzeSwgdTMyX3QgZXh0QnVzeSkKK3sKKyAgICB1MzJfdCBidXN5OyAvKiBwZXJjZW50YWdlICovCisgICAgdTMyX3QgY3ljbGVUaW1lLCBjdGxDbGVhcjsKKworICAgIGN5Y2xlVGltZSA9IDEyODAwMDA7IC8vMS4yOCBzZWNvbmRzCisKKyAgICBpZiAoY3ljbGVUaW1lID4gY3RsQnVzeSkgeworICAgICAgICBjdGxDbGVhciA9IGN5Y2xlVGltZSAtIGN0bEJ1c3k7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGN0bENsZWFyID0gMDsKKyAgICB9CisKKyAgICAvKiBDb21wdXRlIHJhdGlvIG9mIGV4dGVuc2lvbiBjaGFubmVsIGJ1c3kgdG8gY29udHJvbCBjaGFubmVsIGNsZWFyCisgICAgICogYXMgYW4gYXBwcm94aW1hdGlvbiB0byBleHRlbnNpb24gY2hhbm5lbCBjbGVhbmxpbmVzcy4KKyAgICAgKgorICAgICAqIEFjY29yZGluZyB0byB0aGUgaGFyZHdhcmUgZm9sa3MsIGV4dCByeGNsZWFyIGlzIHVuZGVmaW5lZAorICAgICAqIGlmIHRoZSBjdHJsIHJ4Y2xlYXIgaXMgZGUtYXNzZXJ0ZWQgKGkuZS4gYnVzeSkKKyAgICAgKi8KKyAgICBpZiAoY3RsQ2xlYXIpIHsKKyAgICAgICAgYnVzeSA9IChleHRCdXN5ICogMTAwKSAvIGN0bENsZWFyOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1c3kgPSAwOworICAgIH0KKyAgICBpZiAoYnVzeSA+IEFUSF9DV01fRVhUQ0hfQlVTWV9USFJFU0hPTEQpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzM5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dtLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN3bS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgY2hhbm5lbCB3aWR0aCByZWxhdGl2ZWQgZnVuY3Rpb25zLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qUmV2aXNpb24gSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgV2hhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSG9uZGEgICAgICAgMy0xOS0wNyAgICAgY3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DV01fSAorI2RlZmluZSBfQ1dNX0gKKworI2RlZmluZSBBVEhfQ1dNX0VYVENIX0JVU1lfVEhSRVNIT0xEICAzMCAgLyogRXh0ZW5zaW9uIENoYW5uZWwgQnVzeSBUaHJlc2hvbGQgKDAtMTAwJSkgKi8KKwordm9pZCB6ZkN3bUluaXQoemRldl90KiBkZXYpOwordm9pZCB6ZkNvcmVDd21CdXN5KHpkZXZfdCogZGV2LCB1MTZfdCBidXN5KTsKK3UxNl90IHpmQ3dtSXNFeHRDaGFuQnVzeSh1MzJfdCBjdGxCdXN5LCB1MzJfdCBleHRCdXN5KTsKKworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DV01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2ZyZXFjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvZnJlcWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIwZGYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2ZyZXFjdHJsLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworLyogemZBZGRGcmVxQ2hhbmdlUmVxIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIHRoZSBjcml0aWNhbCBzZWN0aW9uICovCitzdGF0aWMgdm9pZCB6ZkFkZEZyZXFDaGFuZ2VSZXEoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisvL3ByaW50aygiemZBZGRGcmVxQ2hhbmdlUmVxICBmcmVxUmVxUXVldWVUYWlsJWRcbiIsIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsKTsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsXSA9IGZyZXF1ZW5jeTsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWxdID0gYnc0MDsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUV4dE9mZnNldFt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbF0gPSBleHRPZmZzZXQ7CisgICAgd2QtPmZyZXFDdHJsLmZyZXFDaGFuZ2VDb21wQ2Jbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWxdID0gY2I7CisgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWwrKzsKKyAgICBpZiAoIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsID49IFpNX01BWF9GUkVRX1JFUV9RVUVVRSApCisgICAgeworICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbCA9IDA7CisgICAgfQorfQorCit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeVYyKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxdWVuY3ksIHpmcEZyZXFDaGFuZ2VDb21wbGV0ZUNiIGNiKQoreworICAgIHpmQ29yZVNldEZyZXF1ZW5jeUV4KGRldiwgZnJlcXVlbmN5LCAwLCAwLCBjYik7Cit9CisKK3ZvaWQgemZDb3JlU2V0RnJlcXVlbmN5RXhWMih6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYiwgdThfdCBmb3JjZVNldEZyZXEpCit7CisgICAgdThfdCBzZXRGcmVxSW1tZWQgPSAwOworICAgIHU4X3QgaW5pdFJGID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcT0iLCBmcmVxdWVuY3kpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA9PSBmcmVxdWVuY3kpCisgICAgICAgICYmICh3ZC0+c3RhLmN1cnJlbnRCdzQwID09IGJ3NDApCisgICAgICAgICYmICh3ZC0+c3RhLmN1cnJlbnRFeHRPZmZzZXQgPT0gZXh0T2Zmc2V0KSkKKyAgICB7CisgICAgICAgIGlmICggZm9yY2VTZXRGcmVxID09IDAgJiYgd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgWk1fRkI1MAorICAgIC8qaWYoZnJlcXVlbmN5IT0yNDM3KSB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9Ki8KKyNlbmRpZgorCisgICAgemZBZGRGcmVxQ2hhbmdlUmVxKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsIGNiKTsKKworLy8gICAgem1fYXNzZXJ0KCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgPT0gMCApOworICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICBpZiAoIHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyA9PSAwICkKKyAgICB7CisgICAgICAgIGlmICgod2QtPnN0YS5jdXJyZW50Qnc0MCAhPSBidzQwKSB8fCAod2QtPnN0YS5jdXJyZW50RXh0T2Zmc2V0ICE9IGV4dE9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXRSRiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgICAgICB3ZC0+c3RhLmN1cnJlbnRCdzQwID0gYnc0MDsKKyAgICAgICAgd2QtPnN0YS5jdXJyZW50RXh0T2Zmc2V0ID0gZXh0T2Zmc2V0OworICAgICAgICBzZXRGcmVxSW1tZWQgPSAxOworICAgIH0KKyAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcrKzsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIHNldEZyZXFJbW1lZCApCisgICAgeworICAgICAgICAvL3pmSHBTZXRGcmVxdWVuY3koZGV2LCBmcmVxdWVuY3ksIDApOworICAgICAgICBpZiAoIGZvcmNlU2V0RnJlcSApCisgICAgICAgIHsgLy8gQ29sZCByZXNldCB0byByZXNldCB0aGUgZnJlcXVlbmN5IGFmdGVyIHNjYW5uaW5nICEKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIiM2XzEgMjAwNzA5MTciKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkl0IGlzIGhhcHBlbiEhISBObyBlcnJvciBtZXNzYWdlIik7CisgICAgICAgICAgICB6ZkhwU2V0RnJlcXVlbmN5RXgoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCwgMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LCBpbml0UkYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAgICB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAmJiAoZnJlcXVlbmN5ID09IHdkLT5mcmVxdWVuY3kpKSB7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5Qb3dlckluSGFsZkRibSA9IHpmSHBHZXRUcmFuc21pdFBvd2VyKGRldik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCitkb25lOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIGNiICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgY2IoZGV2KTsKKyAgICB9CisgICAgemZQdXNoVnR4cShkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYikKK3sKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsIGNiLCAwKTsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSkKK3sKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lWMihkZXYsIGZyZXF1ZW5jeSwgTlVMTCk7Cit9CisKKy8qIHpmUmVtb3ZlRnJlcUNoYW5nZVJlcSBTSE9VTEQgTk9UIGJlIGNhbGxlZCBpbnNpZGUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KK3N0YXRpYyB2b2lkIHpmUmVtb3ZlRnJlcUNoYW5nZVJlcSh6ZGV2X3QqIGRldikKK3sKKyAgICB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYiA9IE5VTEw7CisgICAgdTE2X3QgZnJlcXVlbmN5OworICAgIHU4X3QgYnc0MDsKKyAgICB1OF90IGV4dE9mZnNldDsKKyAgICB1MTZfdCBjb21wRnJlcSA9IDA7CisgICAgdThfdCBjb21wQnc0MCA9IDA7CisgICAgdThfdCBjb21wRXh0T2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZCAhPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbCkKKyAgICB7CisgICAgICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcT0iLAorICAgICAgICAgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdKTsKKyAgICAgICAgY29tcEZyZXEgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXTsKKyAgICAgICAgY29tcEJ3NDAgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBjb21wRXh0T2Zmc2V0ID0gd2QtPmZyZXFDdHJsLmZyZXFSZXFFeHRPZmZzZXRbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworCisgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdID0gMDsKKyAgICAgICAgY2IgPSB3ZC0+ZnJlcUN0cmwuZnJlcUNoYW5nZUNvbXBDYlt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkKys7CisgICAgICAgIGlmICggd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPj0gWk1fTUFYX0ZSRVFfUkVRX1FVRVVFICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIGNiICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgY2IoZGV2KTsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdoaWxlICh3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXSAhPSAwKQorICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgIGJ3NDAgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBleHRPZmZzZXQ9d2QtPmZyZXFDdHJsLmZyZXFSZXFFeHRPZmZzZXRbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBpZiAoKGNvbXBGcmVxID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICYmIChjb21wQnc0MCA9PSBidzQwKQorICAgICAgICAgICAgJiYgKGNvbXBFeHRPZmZzZXQgPT0gZXh0T2Zmc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRHVwbGljYXRlZCBmcmVxdWVuY3kgY29tbWFuZCAqLworICAgICAgICAgICAgem1fbXNnMV9zY2FuKFpNX0xWXzEsICJEdXBsaWNhdGVkIEZyZXE9IiwgZnJlcXVlbmN5KTsKKworICAgICAgICAgICAgY2IgPSB3ZC0+ZnJlcUN0cmwuZnJlcUNoYW5nZUNvbXBDYlt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXSA9IDA7CisgICAgICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZCsrOworCisgICAgICAgICAgICBpZiAoIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkID49IFpNX01BWF9GUkVRX1JFUV9RVUVVRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmctLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICggY2IgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2IoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1OF90ICAgIGluaXRSRiA9IDA7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEuY3VycmVudEJ3NDAgIT0gYnc0MCkgfHwgKHdkLT5zdGEuY3VycmVudEV4dE9mZnNldCAhPSBleHRPZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluaXRSRiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRCdzQwID0gYnc0MDsKKyAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEV4dE9mZnNldCA9IGV4dE9mZnNldDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LCBpbml0UkYpOworICAgICAgICAgICAgaWYgKCAgICB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAgICAmJiAoZnJlcXVlbmN5ID09IHdkLT5mcmVxdWVuY3kpKSB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uUG93ZXJJbkhhbGZEYm0gPSB6ZkhwR2V0VHJhbnNtaXRQb3dlcihkZXYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiZmxhZ0ZyZXFDaGFuZ2luZz0iLCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAvL3dkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyA9IDA7CisgICAgaWYgKCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgIT0gMCApCisgICAgeworICAgICAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmctLTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZSZW1vdmVGcmVxQ2hhbmdlUmVxKGRldik7CisKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmUmVTZXRDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzAoIkl0IGlzIGhhcHBlbiEhISBObyBlcnJvciBtZXNzYWdlIik7CisKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgd2QtPmZyZXF1ZW5jeSwgMCwgMCwgTlVMTCwgMSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvbGVkbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvbGVkbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMDRhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9sZWRtZ3IuYwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTEgICAgICAgICAgICAgICovCisvKiAgICAgIFRyYWRpdGlvbmFsIHNpbmdsZS1MRUQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBiaXQgMTUtMTIgOiBUb2ZmIGZvciBTY2FuIHN0YXRlCisvLyAgICAgMTEtOCA6IFRvbiBmb3IgU2NhbiBzdGF0ZQorLy8gICAgIDcgOiBSZXNlcnZlZAorLy8gICAgIDYgOiBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgYml0IDYgPSAwCisvLyAgICAgNS00IDogQ29ubmVjdCBzdGF0ZQorLy8gICAgICAgICAgIDAwID0+IGFsd2F5cyBvZmYKKy8vICAgICAgICAgICAwMSA9PiBhbHdheXMgb24KKy8vICAgICAgICAgICAxMCA9PiBJZGxlIG9mZiwgYWNpdHZlIG9uCisvLyAgICAgICAgICAgMTEgPT4gSWRsZSBvbiwgYWN0aXZlIG9mZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgIGJpdCA2ID0gMQorLy8gICAgIDUtNCA6IGZyZXEKKy8vICAgICAgICAgICAwMCA9PiAxSHoKKy8vICAgICAgICAgICAwMSA9PiAwLjVIegorLy8gICAgICAgICAgIDEwID0+IDAuMjVIegorLy8gICAgICAgICAgIDExID0+IDAuMTI1SHoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAzIDogUG93ZXIgc2F2ZSBzdGF0ZQorLy8gICAgICAgICAwID0+IGFsd2F5cyBvZmYgaW4gcG93ZXIgc2F2ZSBzdGF0ZQorLy8gICAgICAgICAxID0+IHdvcmtzIGFzIGNvbm5lY3Qgc3RhdGUKKy8vICAgICAyIDogRGlzYWJsZSBzdGF0ZQorLy8gICAgIDEgOiBSZXNlcnZlZAorLy8gICAgIDAgOiBQb3dlci1vbiBzdGF0ZQordm9pZCB6ZkxlZEN0cmxUeXBlMSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHUzMl90IHRvbiwgdG9mZiwgdG1wLCBwZXJpb2Q7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0xFRF9OVU1CRVI7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikgIT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TY2FuIHN0YXRlCisgICAgICAgICAgICB0b24gPSAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4ZjAwKSA+PiA4KSAqIDU7CisgICAgICAgICAgICB0b2ZmID0gKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweGYwMDApID4+IDEyKSAqIDU7CisKKyAgICAgICAgICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLyAodG9uK3RvZmYpOworICAgICAgICAgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAtICh0bXAgKiAodG9uK3RvZmYpKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wIDwgdG9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpICYmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg4KSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ29ubmVjdCBzdGF0ZQorICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg0MCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgxMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID4gMCkgfHwgKHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID4gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPSB3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweDIwKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4MTApID4+IDQpXjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vLyBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gNSAqICgxIDw8ICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgzMCkgPj4gNCkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLyAocGVyaW9kKjIpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLSAodG1wICogKHBlcmlvZCoyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPCBwZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy9lbHNlLCBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCisgICAgICAgICAgICB9IC8vZWxzZSwgaWYgKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpCisgICAgICAgIH0gLy9lbHNlIDogaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQorICAgIH0gLy9mb3IgKGk9MDsgaTxaTV9NQVhfTEVEX05VTUJFUjsgaSsrKQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTIgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEN1c3RvbWl6ZSBmb3IgTmV0Z2VhciBEdWFsLUxFRCBzdGF0ZSAoKGJ1ZyMzMTI5MikpICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMS4gU3RhdHVzOiAgV2hlbiBkb25nbGUgZG9lcyBub3QgY29ubmVjdCB0byAyLjRHIG9yIDVHIGJ1dCBpbiBzaXRlICAgICovCisvKiAgICAgICAgICAgICAgICAgIHN1cnZleS9hc3NvY2lhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBTbG93IGJsaW5raW5nLCBBbWJlciB0aGVuIEJsdWUgcGVyIDUwMG1zICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMi4gU3RhdHVzOglDb25uZWN0aW9uIGF0IDIuNEcgaW4gc2l0ZSBzdXJ2ZXkvYXNzb2NpYXRpb24gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgTEVEIHN0YXR1czogU2xvdyBibGlua2luZywgQW1iZXIvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDMuIFN0YXR1czoJQ29ubmVjdGlvbiBhdCA1RyBpbiBzaXRlIHN1cnZleS9hc3NvY2lhdGlvbiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIExFRCBzdGF0dXM6IFNsb3cgYmxpbmtpbmcsIEJsdWUvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA0LiBTdGF0dXM6CVdoZW4gdHJhbnNmZXIgdGhlIHBhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBCbGluayBwZXIgcGFja2V0LCBpbmNsdWRpbmcgVFggYW5kIFJYICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgNS4gU3RhdHVzOglXaGVuIGxpbmtpbmcgaXMgZXN0YWJsaXNoZWQgYnV0IG5vIHRyYWZmaWMgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgTEVEIHN0YXR1czogQWx3YXlzIG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDYuIFN0YXR1czoJV2hlbiBsaW5raW5nIGlzIGRyb3BwZWQgYnV0IG5vIHJlLWNvbm5lY3Rpb24gICAgICAgICAgICAgICovCisvKiAgICAgICAgIExFRCBzdGF0dXM6IEFsd2F5cyBvZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA3LiBTdGF0dXM6CUZyb20gb25lIGNvbm5lY3Rpb24oMi40RyBvciA1RykgdG8gY2hhbmdlIHRvIGFub3RoZXIgYmFuZCAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBBbWJlci9CbHVlID0+U2xvdyBibGlua2luZywgQW1iZXIgdGhlbiBCbHVlIHBlciA1MDBtcyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFuZy1DaHVuIExpdSAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjExICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkxlZEN0cmxUeXBlMl9zY2FuKHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZkxlZEN0cmxUeXBlMih6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCB0b24sIHRvZmYsIHRtcCwgcGVyaW9kOworICAgIHUxNl90IE9wZXJhdGVMRUQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQorICAgIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdCBzdGF0ZQorICAgICAgICBpZih3ZC0+bGVkU3RydWN0LmNvdW50ZXIgJSA0ICE9IDApCisgICAgCXsKKyAgICAgIAkgICAgLy8gVXBkYXRlIExFRCBlYWNoIDQwMG1zKDQqMTAwKQorICAgICAgCSAgICAvLyBQcmV2ZW50IHRoaXMgc2l0dWF0aW9uCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgIF9fXworICAgICAgICAgICAgLy8gTEVEWzBdIE9OICAgfCAgICAgICB8ICAgICAgIHwgeCB8CisgICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KKyAgICAgICAgICAgIC8vIExFRFsxXSBPTgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQorICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMl9zY2FuKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQorICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgNCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUyX3NjYW4oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRlTEVEID0gMDsgICAgIC8vIExFRFswXTogd29yayBvbiAyLjRHIChiL2cgYmFuZCkKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRlTEVEID0gMTsgICAgIC8vIExFRFsxXTogd29yayBvbiA1RyAoYSBiYW5kKQorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbT3BlcmF0ZUxFRF0gJiAweDgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgT3BlcmF0ZUxFRCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0Nvbm5lY3Qgc3RhdGUKKyAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkgICAvLyBldmVuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTm8gdHJhZmZpYywgYWx3YXlzIE9OCisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgorCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCisJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CisJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorCQkgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZMZWRDdHJsVHlwZTJfc2Nhbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvLyBXaGVuIGRvaW5nIHNjYW4sIGJsaW5rKEFtYmVyL0JsdWUpIGFuZCBvZmYgcGVyIDUwMG1zIChhYm91dCA0MDBtcyBpbiBvdXIgZHJpdmVyKQorICAgIC8vICAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fCisgICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgfCAgICAgICA4ICAgICAgIDEyICAgICAgfCAgICAgICB8CisgICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorICAgIC8vIExFRFsxXSBPTiAgICAwICAgICAgIDQgICAgICAgfF9fX19fX198ICAgICAgIDAgICAgICAgMworICAgIC8vCisKKyAgICBzd2l0Y2god2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMTYpCisgICAgeworICAgICAgICBjYXNlIDA6ICAgLy8gY2FzZSAwfjMsIExFRFswXSBvbgorICAgICAgICAgICAgaWYod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDEpOworICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA4OiAgIC8vIGNhc2UgOH4xMSwgTEVEWzFdIG9uCisgICAgICAgICAgICBpZih3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6ICAvLyBvdGhlcnMsIGFsbCBvZmYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEN1c3RvbWl6ZSBmb3IgTmV0Z2VhciBTaW5nbGUtTEVEIHN0YXRlICgoYnVnIzMyMjQzKSkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIKFFT2ZmOiB3aGVuIHRoZSBhZGFwdGVyIGlzIGRpc2FibGVkIG9yIGhhc24ndCBzdGFydGVkIHRvIGFzc29jaWF0ZSB3aXRoIEFQICAgICovCisvKiAgICAgICAgIHlldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgoUVPbjogT25jZSBhZHBhdGVyIGFzc29jaWF0ZSB3aXRoIEFQIHN1Y2Nlc3NmdWxseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICChRVNsb3cgYmxpbmtpbmc6IHdoZW5ldmVyIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yIHRyeSB0byBhc3NvY2lhdGUgd2l0aCBBUCAqLworLyogICAgLSBJZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gYWxyZWFkeSwgYW5kIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yICAgICAgICAgICovCisvKiAgICAgIHJlLWFzc29jaWF0ZSBhY3Rpb24sIHRoZSBMRUQgc2hvdWxkIGtlZXAgTEVEIGJhY2tncmFvdWQgYXMgT04sIHRodXMgICAgICAgKi8KKy8qICAgICAgdGhlIGJsaW5raW5nIGJlaGF2aW9yIFNIT1VMRCBiZSBPRkYgKDIwMG1zKSAtIE9OICg4MDBtcykgYW5kIGNvbnRpbnVlIHRoaXMqLworLyogICAgICBjeWNsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtIElmIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24geWV0LCBhbmQgYWRhcHRlcnMgc3RhcnQgdG8gZG8gc2l0ZS1zdXJ2ZXkgb3IgICAgKi8KKy8qICAgICAgYXNzb2NpYXRlIGFjdGlvbiwgdGhlIExFRCBzaG91bGQga2VlcCBMRUQgYmFja2dyb3VuZCBhcyBPRkYsIHRodXMgdGhlICAgICAqLworLyogICAgICBibGlua2luZyBiZWhhdmlvciBTSE9VTEQgYmUgT04gKDIwMG1zKSAtIE9GRiAoODAwbXMpIGFuZCBjb250aW51ZSB0aGlzICAgICovCisvKiAgICAgIGN5Y2xlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0gRm9yIHRoZSBjYXNlIHRoYXQgYXNzb2NpYXRlIGZhaWwsIGFkcGF0ZXIgc2hvdWxkIGtlZXAgYXNzb2NpYXRpbmcsIGFuZCB0aGUqLworLyogICAgICBMRUQgc2hvdWxkIGFsc28ga2VlcCBzbG93IGJsaW5raW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgoUVRdWljayBibGlua2luZzogdG8gYmxpbmsgT0ZGLU9OIGN5Y2xlIGZvciBlYWNoIHRpbWUgdGhhdCB0cmFmZmljIHBhY2tldCBpcyAgKi8KKy8qICAgIHJlY2VpdmVkIG9yIGlzIHRyYW5zbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwOC4wMSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KTsKKwordm9pZCB6ZkxlZEN0cmxUeXBlMyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpICE9IFRSVUUpCisgICAgeworICAgICAgICAvLyBEaXNjb25uZWN0IHN0YXRlCisgICAgICAgIGlmKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDIgIT0gMCkKKyAgICAJeworICAgICAgCSAgICAvLyBVcGRhdGUgTEVEIGVhY2ggMjAwbXMoMioxMDApCisgICAgICAJICAgIC8vIFByZXZlbnQgdGhpcyBzaXR1YXRpb24KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICBfX18gICAgIF8KKyAgICAgICAgICAgIC8vIExFRFswXSBPTiAgIHwgICB8ICAgfHh8CisgICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLT4+Pi4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQorICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlM19zY2FuKGRldiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQorICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMiAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzX3NjYW4oZGV2LCAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMF0gJiAweDgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9Db25uZWN0IHN0YXRlCisgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAmIDEpID09IDApICAgLy8gZXZlbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5vIHRyYWZmaWMsIGFsd2F5cyBPTgorICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgorCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCisJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CisJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorCQkgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KQoreworICAgIHUzMl90IHRvbiwgdG9mZiwgdG1wOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vIERvaW5nIHNjYW4gd2hlbiA6CisgICAgLy8gMS4gRGlzY29ubmVjdGVkOiBPTiAoMjAwbXMpIC0gT0ZGICg4MDBtcykgKDIwMG1zLTYwMG1zIGluIG91ciBkcml2ZXIpCisgICAgLy8gICAgICAgICAgICAgICBfX18gICAgICAgICAgICAgX19fICAgICAgICAgICAgIF9fXworICAgIC8vIExFRFswXSBPTiAgICB8ICAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgIHwgICB8CisgICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KKyAgICAvLyAgICAgICAgICAgICAgMCAgIDIgICA0ICAgNiAgIDggIDEwICAxMiAgMTQgIDE2CisgICAgLy8gMi4gQ29ubmVjdGVkOiAgIE9OICg4MDBtcykgLSBPRkYgKDIwMG1zKSAoNjAwbXMtMjAwbXMgaW4gb3VyIGRyaXZlcikKKyAgICAvLyAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICBfX19fX19fX19fXyAgICAgX19fX19fCisgICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8ICAgfAorICAgIC8vIC0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstPj4+Li4uCisgICAgLy8gICAgICAgICAgICAgIDAgICAyICAgNCAgIDYgICA4ICAxMCAgMTIgIDE0ICAxNgorCisgICAgLy9TY2FuIHN0YXRlCisgICAgaWYoIWlzQ29ubmVjdCkKKyAgICAgICAgdG9uID0gMiwgdG9mZiA9IDY7CisgICAgZWxzZQorICAgICAgICB0b24gPSA2LCB0b2ZmID0gMjsKKworICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKKyAgICB7CisgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlICh0b24rdG9mZik7CisgICAgICAgaWYgKHRtcCA8IHRvbikKKyAgICAgICAgeworICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAxKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTGVkQ3RybF9CbGlua1doZW5TY2FuX0FscGhhICAgICAqLworLyogICAgICBDdXN0b21pemUgZm9yIEFscGhhL0RMaW5rIExFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBCbGluayBMRUQgMTIgdGltZXMgd2l0aGluIDMgc2Vjb25kcyB3aGVuIGRvaW5nIEFjdGl2ZSBTY2FuICAgICAgICAgICovCisvKgkgICAgICAgICAgICAgICAgICAgICAgX19fICAgX19fICAgX19fICAgX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKgkgICAgICBMRURbMF0gT04gICAgICB8ICAgfCB8ICAgfCB8ICAgfCB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKgkgICAgICAtLS0tLS0tT0ZGLT4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0tKy0tPj4+Li4uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xMSAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoemRldl90KiBkZXYpCit7CisgICAgc3RhdGljIHUzMl90IGNvdW50ZXIgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmKGNvdW50ZXIgPiAzNCkgICAgICAgIC8vIGNvdW50ZXIgZm9yIDMgc2VjCisgICAgeworICAgICAgICB3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnICY9IH4odThfdClaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOworICAgICAgICBjb3VudGVyID0gMDsKKyAgICB9CisKKyAgICBpZiggKGNvdW50ZXIgJSAzKSA8IDIpCisgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgZWxzZQorICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworCisgICAgY291bnRlcisrOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZDEwMG1zQ3RybCAgICAgICAgICAgICAgKi8KKy8qICAgICAgTEVEIDEwMCBtaWxsaXNlY29uZHMgdGltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPmxlZFN0cnVjdC5jb3VudGVyKys7CisKKyAgICBpZih3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcpIHsKKyAgICAgICAgY2FzZSBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOgorICAgICAgICAgICAgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoZGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybFR5cGUpIHsKKyAgICAgICAgY2FzZSAxOgkJCS8vIFRyYWRpdGlvbmFsIDEgTEVECisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CQkJLy8gRHVhbC1MRURzIGZvciBOZXRnZWFyCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMihkZXYpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CQkJLy8gU2luZ2xlLUxFRCBmb3IgTmV0Z2VhciAoV04xMTF2MikKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzKGRldik7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcGVyZm9ybWFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWI0MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHBlcmZvcm1hbmNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisKKyNkZWZpbmUgWk1fVFBfU0laRSA1MAorc3RydWN0IHpzU3VtbWFyeSB6bV9zdW1tYXJ5Oworc3RydWN0IHpzVmFyaWF0aW9uIHptX3ZhcjsKK3N0cnVjdCB6c1Rocm91Z2hwdXQgem1fdHA7CisKK3ZvaWQgemZpUGVyZm9ybWFuY2VJbml0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX3N1bW1hcnkudGlja19iYXNlID0gd2QtPnRpY2s7CisgICAgem1fc3VtbWFyeS50eF9tc2R1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnR4X21wZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfbXNkdV9jb3VudCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9tcGR1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3N1bSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9zZXFfYmFzZSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfc2VxID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfc3VtID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2xvc3Rfc3VtID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9lcnJvciA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9mcmVlID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbiA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9mbHVzaCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9jbGVhciA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9yZW9yZGVyID0gMDsKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21zZHVfdGlja1tpXSA9IHptX3Zhci50eF9tcGR1X3RpY2tbaV0gPSAwOworICAgICAgICB6bV92YXIucnhfbXNkdV90aWNrW2ldID0gem1fdmFyLnJ4X21wZHVfdGlja1tpXSA9IDA7CisgICAgfQorCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSwgMTAwKTsKKworICAgIHptX3RwLnNpemUgPSBaTV9UUF9TSVpFOworICAgIHptX3RwLmhlYWQgPSB6bV90cC5zaXplIC0gMTsKKyAgICB6bV90cC50YWlsID0gMDsKKyAgICBmb3IgKGk9MDsgaTx6bV90cC5zaXplOyBpKyspCisgICAgeworICAgICAgICB6bV90cC50eFtpXT0wOworICAgICAgICB6bV90cC5yeFtpXT0wOworICAgIH0KK30KKwordm9pZCB6ZmlQZXJmb3JtYW5jZUdyYXBoKHpkZXZfdCogZGV2KQoreworICAgIHMxNl90ICAgaSxqOworICAgIHU4X3QgICAgc1taTV9UUF9TSVpFKzVdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaT0wOyBpPCh6bV90cC5zaXplLTEpOyBpKyspCisgICAgeworICAgICAgICB6bV90cC50eFtpXSA9IHptX3RwLnR4W2krMV07CisgICAgICAgIHptX3RwLnJ4W2ldID0gem1fdHAucnhbaSsxXTsKKyAgICB9CisgICAgem1fdHAudHhbem1fdHAuc2l6ZS0xXSA9IHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCoxNTAwKjgvMTAwMDAwMDsKKyAgICB6bV90cC5yeFt6bV90cC5zaXplLTFdID0gem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50KjE1MDAqOC8xMDAwMDAwOworCisgICAgZm9yIChpPTE1OyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIHNbMF0gPSAoaS8xMCkgKyAnMCc7CisgICAgICAgIHNbMV0gPSAoaSUxMCkgKyAnMCc7CisgICAgICAgIHNbMl0gPSAnMCc7CisgICAgICAgIHNbM10gPSAnfCc7CisgICAgICAgIGZvciAoaj0wOyBqPHptX3RwLnNpemU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh6bV90cC50eFtqXS8xMCA9PSBpKSAmJiAoem1fdHAucnhbal0vMTAgPT0gaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc1s0K2pdID0gJ1gnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoem1fdHAudHhbal0vMTAgPT0gaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzWzQral0gPSAnVCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh6bV90cC5yeFtqXS8xMCA9PSBpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNbNCtqXSA9ICdSJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzWzQral0gPSAnICc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc1t6bV90cC5zaXplKzRdID0gJ1wwJzsKKyAgICAgICAgRGJnUHJpbnQoIiVzIixzKTsKKyAgICB9CisgICAgRGJnUHJpbnQoIjAwMHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyIpOworCit9CisKKwordm9pZCB6ZmlQZXJmb3JtYW5jZVJlZnJlc2goemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZpRGJnUmVhZFJlZyhkZXYsIDB4MTE3NzJjKTsKKworICAgIHptX3Zhci50eF9tc2R1X21lYW4gPSB6bV9zdW1tYXJ5LnR4X21zZHVfY291bnQgLyAxMDA7CisgICAgem1fdmFyLnR4X21wZHVfbWVhbiA9IHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCAvIDEwMDsKKyAgICB6bV92YXIucnhfbXNkdV9tZWFuID0gem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50IC8gMTAwOworICAgIHptX3Zhci5yeF9tcGR1X21lYW4gPSB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQgLyAxMDA7CisKKyAgICB6bV92YXIudHhfbXNkdV9zdW0gPSB6bV92YXIudHhfbXBkdV9zdW0gPSAwOworICAgIHptX3Zhci5yeF9tc2R1X3N1bSA9IHptX3Zhci5yeF9tcGR1X3N1bSA9IDA7CisgICAgem1fc3VtbWFyeS50eF9pZGxlX2NvdW50ID0gem1fc3VtbWFyeS5yeF9pZGxlX2NvdW50ID0gMDsKKyAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykKKyAgICB7CisgICAgICAgIHptX3Zhci50eF9tc2R1X3N1bSArPSAoem1fdmFyLnR4X21zZHVfdGlja1tpXSAqIHptX3Zhci50eF9tc2R1X3RpY2tbaV0pOworICAgICAgICB6bV92YXIudHhfbXBkdV9zdW0gKz0gKHptX3Zhci50eF9tcGR1X3RpY2tbaV0gKiB6bV92YXIudHhfbXBkdV90aWNrW2ldKTsKKyAgICAgICAgem1fdmFyLnJ4X21zZHVfc3VtICs9ICh6bV92YXIucnhfbXNkdV90aWNrW2ldICogem1fdmFyLnJ4X21zZHVfdGlja1tpXSk7CisgICAgICAgIHptX3Zhci5yeF9tcGR1X3N1bSArPSAoem1fdmFyLnJ4X21wZHVfdGlja1tpXSAqIHptX3Zhci5yeF9tcGR1X3RpY2tbaV0pOworCisgICAgICAgIGlmICghem1fdmFyLnR4X21wZHVfdGlja1tpXSkgem1fc3VtbWFyeS50eF9pZGxlX2NvdW50Kys7CisgICAgICAgIGlmICghem1fdmFyLnJ4X21wZHVfdGlja1tpXSkgem1fc3VtbWFyeS5yeF9pZGxlX2NvdW50Kys7CisgICAgfQorICAgIHptX3Zhci50eF9tc2R1X3ZhciA9ICh6bV92YXIudHhfbXNkdV9zdW0gLyAxMDApIC0gKHptX3Zhci50eF9tc2R1X21lYW4gKiB6bV92YXIudHhfbXNkdV9tZWFuKTsKKyAgICB6bV92YXIudHhfbXBkdV92YXIgPSAoem1fdmFyLnR4X21wZHVfc3VtIC8gMTAwKSAtICh6bV92YXIudHhfbXBkdV9tZWFuICogem1fdmFyLnR4X21wZHVfbWVhbik7CisgICAgem1fdmFyLnJ4X21zZHVfdmFyID0gKHptX3Zhci5yeF9tc2R1X3N1bSAvIDEwMCkgLSAoem1fdmFyLnJ4X21zZHVfbWVhbiAqIHptX3Zhci5yeF9tc2R1X21lYW4pOworICAgIHptX3Zhci5yeF9tcGR1X3ZhciA9ICh6bV92YXIucnhfbXBkdV9zdW0gLyAxMDApIC0gKHptX3Zhci5yeF9tcGR1X21lYW4gKiB6bV92YXIucnhfbXBkdV9tZWFuKTsKKworICAgIHptX3N1bW1hcnkudGlja19iYXNlID0gd2QtPnRpY2s7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc3VtICs9IHptX3N1bW1hcnkucnhfYnJva2VuX3NlcTsKKyAgICB6bV9zdW1tYXJ5LnJ4X2xvc3Rfc3VtICs9ICh6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgLSB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9zZXEgLSB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEpOworCisgICAgemZpUGVyZm9ybWFuY2VHcmFwaChkZXYpOworCisgICAgRGJnUHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgRGJnUHJpbnQoIiogVFg6IE1TRFU9JTVkLCBWQVI9JTVkOyBNUERVPSU1ZCwgVkFSPSU1ZFxuIiwgem1fc3VtbWFyeS50eF9tc2R1X2NvdW50LAorICAgICAgICB6bV92YXIudHhfbXNkdV92YXIsIHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCwgem1fdmFyLnR4X21wZHVfdmFyKTsKKyAgICBEYmdQcmludCgiKiBUWDogaWRsZT0lNWQsVHhSYXRlPSUzZCwgIFBFUj0lNWRcbiIsIHptX3N1bW1hcnkudHhfaWRsZV9jb3VudCwKKyAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzLzEwMDAsCisgICAgICAgICh1MTZfdCl3ZC0+UEVSW3dkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5jdXJyZW50UmF0ZV0pOworICAgIERiZ1ByaW50KCIqIFJYOiBNU0RVPSU1ZCwgVkFSPSU1ZDsgTVBEVT0lNWQsIFZBUj0lNWRcbiIsIHptX3N1bW1hcnkucnhfbXNkdV9jb3VudCwKKyAgICAgICAgem1fdmFyLnJ4X21zZHVfdmFyLCB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQsIHptX3Zhci5yeF9tcGR1X3Zhcik7CisgICAgRGJnUHJpbnQoIiogUlg6IGlkbGU9JTVkLFJ4UmF0ZT0lM2QsQU1TRFU9JTVkXG4iLCB6bV9zdW1tYXJ5LnJ4X2lkbGVfY291bnQsCisgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2Jwcy8xMDAwLCB6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbik7CisgICAgRGJnUHJpbnQoIiogUlggYnJva2VuIHNlcT0lNGQsIGRpc3RhbmNlcz0lNGQsIGR1cGxpY2F0ZXM9JTRkXG4iLCB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEsCisgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcV9kaXMsIHptX3N1bW1hcnkucnhfZHVwbGljYXRlX3NlcSk7CisgICAgRGJnUHJpbnQoIiogUlggICAgb2xkIHNlcT0lNGQsICAgICAgbG9zdD0lNGQsIGJyb2tlbiBzdW09JTRkXG4iLCB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEsCisgICAgICAgICh6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgLSB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9zZXEgLSB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEpLAorICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zdW0pOworICAgIERiZ1ByaW50KCIqIFJ4ICAgbG9zdCBzdW09JTRkLGR1cC4gZXJyb3I9JTRkLCBmcmVlIGNvdW50PSU0ZFxuIiwgem1fc3VtbWFyeS5yeF9sb3N0X3N1bSwKKyAgICAgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfZXJyb3IsIHptX3N1bW1hcnkucnhfZnJlZSk7CisgICAgRGJnUHJpbnQoIiogUnggIGZsdXNoIHN1bT0lNGQsIGNsZWFyIHN1bT0lNGQsIHJlb3JkZXI9JTdkXG4iLCB6bV9zdW1tYXJ5LnJ4X2ZsdXNoLAorICAgICAgICB6bV9zdW1tYXJ5LnJ4X2NsZWFyLCB6bV9zdW1tYXJ5LnJ4X3Jlb3JkZXIpOworICAgIERiZ1ByaW50KCIqIEZpcm13YXJlIHJlc2V0PSUzZCwgcmVzZXQgc3VtPSU0ZFxuIiwgem1fc3VtbWFyeS5yZXNldF9jb3VudCwKKyAgICAgICAgem1fc3VtbWFyeS5yZXNldF9zdW0pOworICAgIERiZ1ByaW50KCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CisgICAgLy9yZXNldCBjb3VudCAxMTc3MmMKKyAgICB6bV9zdW1tYXJ5LnR4X21zZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfc2VxID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfYW1zZHVfbGVuID0gMDsKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21zZHVfdGlja1tpXSA9IHptX3Zhci50eF9tcGR1X3RpY2tbaV0gPSAwOworICAgICAgICB6bV92YXIucnhfbXNkdV90aWNrW2ldID0gem1fdmFyLnJ4X21wZHVfdGlja1tpXSA9IDA7CisgICAgfQorCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSwgMTAwKTsKK30KKwordm9pZCB6ZmlUeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljaykKK3sKKyAgICB1MzJfdCAgIGluZGV4OworICAgIHptX3N1bW1hcnkudHhfbXNkdV9jb3VudCsrOworCisgICAgaW5kZXggPSB0aWNrIC0gem1fc3VtbWFyeS50aWNrX2Jhc2U7CisKKyAgICBpZiAoaW5kZXggPCAxMDApCisgICAgeworICAgICAgICB6bV92YXIudHhfbXNkdV90aWNrW2luZGV4XSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+dGljayBleGNlZWRlZCB0aWNrX2Jhc2UrMTAwIVxuIik7CisgICAgfQorfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VNU0RVKHpkZXZfdCogZGV2LCB1MzJfdCB0aWNrKQoreworICAgIHUzMl90ICAgaW5kZXg7CisgICAgem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50Kys7CisKKyAgICBpbmRleCA9IHRpY2sgLSB6bV9zdW1tYXJ5LnRpY2tfYmFzZTsKKworICAgIGlmIChpbmRleCA8IDEwMCkKKyAgICB7CisgICAgICAgIHptX3Zhci5yeF9tc2R1X3RpY2tbaW5kZXhdKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoIndkLT50aWNrIGV4Y2VlZGVkIHRpY2tfYmFzZSsxMDAhXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpVHhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spCit7CisgICAgdTMyX3QgICBpbmRleDsKKyAgICB6bV9zdW1tYXJ5LnR4X21wZHVfY291bnQrKzsKKworICAgIGluZGV4ID0gdGljayAtIHptX3N1bW1hcnkudGlja19iYXNlOworCisgICAgaWYgKGluZGV4IDwgMTAwKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21wZHVfdGlja1tpbmRleF0rKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9EYmdQcmludCgid2QtPnRpY2sgZXhjZWVkZWQgdGlja19iYXNlKzEwMCFcbiIpOworICAgIH0KK30KKworI2lmbmRlZiBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRQorI2RlZmluZSBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRSAgIDEyCisjZW5kaWYKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUzMl90ICAgaW5kZXg7CisgICAgdTE2X3QgICBmcmFtZVR5cGU7CisgICAgdTE2X3QgICBmcmFtZUN0cmw7CisgICAgdThfdCAgICBtcGR1SW5kOworICAgIHUxNl90ICAgcGxjcEhkckxlbjsKKyAgICB1MTZfdCAgIGxlbjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tMSk7CisgICAgLyogRmlyc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmKCgobXBkdUluZCAmIDB4MzApID09IDB4MDApIHx8ICgobXBkdUluZCAmIDB4MzApID09IDB4MjApKQorICAgIC8vaWYgKChtcGR1SW5kICYgMHgxMCkgPT0gMHgwMCkKKyAgICB7CisgICAgICAgIHBsY3BIZHJMZW4gPSAxMjsgICAgICAgIC8vIFBMQ1AgaGVhZGVyIGxlbmd0aAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkgPT0gd2QtPm1hY0FkZHJbMF0gJiYKKyAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYpID09IHdkLT5tYWNBZGRyWzFdICYmCisgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KSA9PSB3ZC0+bWFjQWRkclsyXSkgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpID09IHdkLT5tYWNBZGRyWzBdICYmCisgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KSA9PSB3ZC0+bWFjQWRkclsxXSAmJgorICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCkgPT0gd2QtPm1hY0FkZHJbMl0peworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDEyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZUN0cmwgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBwbGNwSGRyTGVuICsgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworCisgICAgaWYgKGZyYW1lVHlwZSAhPSBaTV9XTEFOX0RBVEFfRlJBTUUpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgem1fc3VtbWFyeS5yeF9tcGR1X2NvdW50Kys7CisKKyAgICBpbmRleCA9IHdkLT50aWNrIC0gem1fc3VtbWFyeS50aWNrX2Jhc2U7CisKKyAgICBpZiAoaW5kZXggPCAxMDApCisgICAgeworICAgICAgICB6bV92YXIucnhfbXBkdV90aWNrW2luZGV4XSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+dGljayBleGNlZWRlZCB0aWNrX2Jhc2UrMTAwIVxuIik7CisgICAgfQorfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VTZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90ICAgc2VxX25vOworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCAgIG9sZF9kaXMgPSB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzOworICAgIC8vc3lzX3RpbWUgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZmcmVxKTsKKworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMikgPj4gNDsKKworICAgIFpNX1NFUV9ERUJVRygiT3V0ICAgJTVkXG4iLCBzZXFfbm8pOworCisgICAgaWYgKHNlcV9ubyA8IHptX3N1bW1hcnkucnhfc2VxX2Jhc2UpCisgICAgeworICAgICAgICBpZiAoc2VxX25vID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICE9IDQwOTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxKys7CisgICAgICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KDQwOTYgLSB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc2VxX25vIDwgMzAwKSAmJiAoem1fc3VtbWFyeS5yeF9zZXFfYmFzZSA+IDM4MDApKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXErKzsKKyAgICAgICAgICAgIFpNX1NFUV9ERUJVRygiQnJva2VuIHNlcSIpOworICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KDQwOTYgLSB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICsgc2VxX25vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSsrOworICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzKz0oem1fc3VtbWFyeS5yeF9zZXFfYmFzZSAtIHNlcV9ubyk7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXErKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoc2VxX25vICE9ICh6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc2VxX25vID4gMzgwMCkgJiYgKHptX3N1bW1hcnkucnhfc2VxX2Jhc2UgPCAzMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSsrOworICAgICAgICAgICAgICAgIFpNX1NFUV9ERUJVRygiQnJva2VuIHNlcSIpOworICAgICAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcV9kaXMrPSg0MDk2IC0gc2VxX25vICsgem1fc3VtbWFyeS5yeF9zZXFfYmFzZSk7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9vbGRfc2VxKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxKys7CisgICAgICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KHNlcV9ubyAtIHptX3N1bW1hcnkucnhfc2VxX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzZXFfbm8gPT0gem1fc3VtbWFyeS5yeF9zZXFfYmFzZSkKKyAgICB7CisgICAgICAgIHptX3N1bW1hcnkucnhfZHVwbGljYXRlX3NlcSsrOworICAgIH0KKworICAgIGlmICgoem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyAtIG9sZF9kaXMpID4gMTAwKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiogc2VxX25vPSU0ZCwgYmFzZV9zZXE9JTRkLCBkaXNfZGlmZj0lNGQiLCBzZXFfbm8sCisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlLCB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzIC0gb2xkX2Rpcyk7CisgICAgfQorICAgIHptX3N1bW1hcnkucnhfc2VxX2Jhc2UgPSBzZXFfbm87Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgcmVnLCB1MzJfdCByc3ApCit7CisgICAgem1fc3VtbWFyeS5yZXNldF9jb3VudCA9ICh1MTZfdClyc3AgLSB6bV9zdW1tYXJ5LnJlc2V0X3N1bTsKKyAgICB6bV9zdW1tYXJ5LnJlc2V0X3N1bSA9ICh1MTZfdClyc3A7Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUR1cCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYxLCB6YnVmX3QqIGJ1ZjIpCit7CisgICAgdTE2X3QgICBzZXFfbm8xLCBzZXFfbm8yOworCisgICAgc2VxX25vMSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYxLCAyMikgPj4gNDsKKyAgICBzZXFfbm8yID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZjIsIDIyKSA+PiA0OworICAgIGlmIChzZXFfbm8xICE9IHNlcV9ubzIpCisgICAgeworICAgICAgICB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9lcnJvcisrOworICAgIH0KK30KKwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlRnJlZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgem1fc3VtbWFyeS5yeF9mcmVlKys7Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUFNU0RVKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKQoreworICAgIGlmICh6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbiA8IGxlbikKKyAgICB7CisgICAgICAgIHptX3N1bW1hcnkucnhfYW1zZHVfbGVuID0gbGVuOworICAgIH0KK30KK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZsdXNoKHpkZXZfdCogZGV2KQoreworICAgIHptX3N1bW1hcnkucnhfZmx1c2grKzsKK30KKwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlQ2xlYXIoemRldl90KiBkZXYpCit7CisgICAgem1fc3VtbWFyeS5yeF9jbGVhcisrOworICAgIFpNX1NFUV9ERUJVRygiUnhDbGVhciIpOworfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VSZW9yZGVyKHpkZXZfdCogZGV2KQoreworICAgIHptX3N1bW1hcnkucnhfcmVvcmRlcisrOworfQorI2VuZGlmIC8qIGVuZCBvZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY2NThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9QRVJGT1JNQU5DRV9ICisjZGVmaW5lIF9QRVJGT1JNQU5DRV9ICisKKyNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgorCitzdHJ1Y3QgenNTdW1tYXJ5Cit7CisgICAgdTMyX3QgdHhfbXNkdV9jb3VudDsKKyAgICB1MzJfdCB0eF9tcGR1X2NvdW50OworICAgIHUzMl90IHJ4X21zZHVfY291bnQ7CisgICAgdTMyX3QgcnhfbXBkdV9jb3VudDsKKyAgICB1MzJfdCB0aWNrX2Jhc2U7CisgICAgdTE2X3Qgcnhfc2VxX2Jhc2U7CisgICAgdTE2X3QgcnhfYnJva2VuX3NlcTsKKyAgICB1MTZfdCByeF9icm9rZW5fc3VtOworICAgIHUxNl90IHJ4X2Jyb2tlbl9zZXFfZGlzOworICAgIHUxNl90IHJ4X2R1cGxpY2F0ZV9zZXE7CisgICAgdTE2X3QgcnhfZHVwbGljYXRlX2Vycm9yOworICAgIHUxNl90IHJ4X29sZF9zZXE7CisgICAgdTE2X3QgcnhfbG9zdF9zdW07CisgICAgdTE2X3QgdHhfaWRsZV9jb3VudDsKKyAgICB1MTZfdCByeF9pZGxlX2NvdW50OworICAgIHUxNl90IHJlc2V0X2NvdW50OworICAgIHUxNl90IHJlc2V0X3N1bTsKKyAgICB1MTZfdCByeF9mcmVlOworICAgIHUxNl90IHJ4X2Ftc2R1X2xlbjsKKyAgICB1MTZfdCByeF9mbHVzaDsKKyAgICB1MTZfdCByeF9jbGVhcjsKKyAgICB1MzJfdCByeF9yZW9yZGVyOworfTsKKworc3RydWN0IHpzVmFyaWF0aW9uCit7CisgICAgdTMyX3QgdHhfbXNkdV90aWNrWzEwMF07CisgICAgdTMyX3QgdHhfbXBkdV90aWNrWzEwMF07CisgICAgdTMyX3QgcnhfbXNkdV90aWNrWzEwMF07CisgICAgdTMyX3QgcnhfbXBkdV90aWNrWzEwMF07CisKKyAgICB1MzJfdCB0eF9tc2R1X21lYW47CisgICAgdTMyX3QgdHhfbXBkdV9tZWFuOworICAgIHUzMl90IHJ4X21zZHVfbWVhbjsKKyAgICB1MzJfdCByeF9tcGR1X21lYW47CisKKyAgICB1MzJfdCB0eF9tc2R1X3N1bTsKKyAgICB1MzJfdCB0eF9tcGR1X3N1bTsKKyAgICB1MzJfdCByeF9tc2R1X3N1bTsKKyAgICB1MzJfdCByeF9tcGR1X3N1bTsKKworICAgIHUzMl90IHR4X21zZHVfdmFyOworICAgIHUzMl90IHR4X21wZHVfdmFyOworICAgIHUzMl90IHJ4X21zZHVfdmFyOworICAgIHUzMl90IHJ4X21wZHVfdmFyOworfTsKKworc3RydWN0IHpzVGhyb3VnaHB1dAoreworICAgIHUzMl90IHR4WzUwXTsKKyAgICB1MzJfdCByeFs1MF07CisgICAgdTE2X3QgaGVhZDsKKyAgICB1MTZfdCB0YWlsOworICAgIHUxNl90IHNpemU7CisgICAgTEFSR0VfSU5URUdFUiBzeXNfdGltZTsKKyAgICBMQVJHRV9JTlRFR0VSIGZyZXE7Cit9OworCit2b2lkIHpmaVBlcmZvcm1hbmNlSW5pdCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmaVBlcmZvcm1hbmNlUmVmcmVzaCh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljayk7Cit2b2lkIHpmaVR4UGVyZm9ybWFuY2VNUERVKHpkZXZfdCogZGV2LCB1MzJfdCB0aWNrKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVNlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCByZWcsIHUzMl90IHJzcCk7Cit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VEdXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmMSwgemJ1Zl90KiBidWYyKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZyZWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUFNU0RVKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZsdXNoKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUNsZWFyKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVJlb3JkZXIoemRldl90KiBkZXYpOworI2VuZGlmIC8qIGVuZCBvZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTiAqLworI2VuZGlmIC8qIGVuZCBvZiBfUEVSRk9STUFOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNGJkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfdXNiLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9QVUJfVVNCX0gKKyNkZWZpbmUgX1BVQl9VU0JfSAorCisjaW5jbHVkZSAiLi4vb2FsX2R0LmgiCisKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfQVAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfU1RBICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfSUJTU19HRU5FUkFMICAgIDIKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfSUJTU19XUEEyUFNLICAgIDMKKworLyogVVNCIG1vZHVsZSBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFF1ZXVlIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA4MDIxMWNvcmUgcmVxdWlyZXMgT0FMIHRvIGltcGxlbWVudCBhIHRyYW5zbWlzc2lvbiBxdWV1ZSBpbiBPQUwncyAgICAqLworLyogVVNCIG1vZHVsZS4gQmVjYXVzZSB0aGVyZSBpcyBvbmx5IGxpbWl0ZWQgb24tY2hpcCBtZW1vcnksIHNvIFVTQiAgICAgKi8KKy8qIGRhdGEgdHJhbnNmZXIgbWF5IGJlIHBlbmRpbmcgdW50aWwgb24tY2hpcCBtZW1vcnkgaXMgYXZhaWxhYmxlLiAgICAgICovCisvKiA4MDIxMWNvcmUgYWxzbyByZXF1aXJlcyBPQUwncyBVU0IgbW9kdWxlIHRvIHByb3ZpZGUgdHdvIGZ1bmN0aW9ucyAgICAqLworLyogemZ3VXNiR2V0RnJlZVR4UVNpemUoKSBhbmQgemZ3VXNiR2V0TWF4VHhRU2l6ZSgpIGZvciA4MDIxMWNvcmUgdG8gICAgKi8KKy8qIHF1ZXJ5IHRoZSBzdGF0dXMgb2YgdGhpcyB0cmFuc21pc3Npb24gcXVldWUuIFRoZSBtYWluIHB1cnBvc2Ugb2YgICAgICovCisvKiB0aGlzIHF1ZXVlIGlzIGZvciBRb1MvV01NLiBUaG91Z2ggdGhlcmUgYXJlIGhhcmR3YXJlIHByaW9yaXR5ICAgICAgICAqLworLyogcXVldWVzIG9uIHRoZSBjaGlwLCBhbmQgYWxzbyBzb2Z0d2FyZSBwcmlvcml0eSBxdWV1ZXMgaW4gdGhlICAgICAgICAgKi8KKy8qIDgwMjExY29yZS4gVGhlcmUgaXMgc3RpbGwgb25lIGFuZCBvbmx5IG9uZSBVU0IgY2hhbm5lbC4gU28gICAgICAgICAgICovCisvKiA4MDIxMWNvcmUgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIHRoYXQgemZ3VXNiR2V0RnJlZVR4UVNpemUoKSAgICAgICAqLworLyogcmV0dXJuZWQgdG8gc2NoZWR1bGUgdGhlIHRyYWZmaWMgZnJvbSB0aGUgc29mdHdhcmUgcHJpb3JpdHkgICAgICAgICAgKi8KKy8qIHF1ZXVlcyB0byB0aGUgaGFyZHdhcmUgcHJpb3JpdHkgcXVldWVzLiBGb3IgZXhhbXBsZSwgaWYgODAyMTFjb3JlICAgICovCisvKiBmb3VuZCB0aGF0IFVTQiB0cmFuc21pc3Npb24gcXVldWUgaXMgZ29pbmcgdG8gYmUgZnVsbCwgaXQgd2lsbCAgICAgICAqLworLyogbm90IGFsbG93IHBhY2tldHMgd2l0aCBsb3dlciBwcmlvcml0eSB0byBlbnRlciB0aGUgVVNCIGNoYW5uZWwuICAgICAgKi8KKworCisvKiBTdHJ1Y3R1cmUgZm9yIFVTQiBjYWxsIGJhY2sgZnVuY3Rpb25zICovCitzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgeworICAgIHZvaWQgKCp6ZmNiVXNiUmVjdikoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKTsKKyAgICB2b2lkICgqemZjYlVzYlJlZ0luKSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKKyAgICB2b2lkICgqemZjYlVzYk91dENvbXBsZXRlKSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpOworICAgIHZvaWQgKCp6ZmNiVXNiUmVnT3V0Q29tcGxldGUpKHpkZXZfdCogZGV2KTsKK307CisKKy8qIENhbGwgYmFjayBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCZWxvdyBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIE9BTCAgICAgICAgICAgICAqLworCisvKiBXaGVuIGRhdGEgaXMgYXZhaWxhYmxlIGluIGVuZHBvaW50IDMsIE9BTCBzaGFsbCBlbWJlZCB0aGUgZGF0YSBpbiAqLworLyogemJ1Zl90IGFuZCBzdXBwbHkgdG8gODAyMTFjb3JlIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qIHZvaWQgKCp6ZmNiVXNiUmVjdikoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKTsgKi8KKworLyogV2hlbiBkYXRhIGlzIGF2YWlsYWJsZSBpbiBlbmRwb2ludCAyLCBPQUwgc2hhbGwgY2FsbCB0aGlzIGZ1bmN0aW9uICovCisvKiB2b2lkICgqemZjYlVzYlJlZ0luKSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsgKi8KKworLyogV2hlbiBVU0IgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZWQgaW4gZW5kcG9pbnQgMSwgT0FMIHNoYWxsIGNhbGwgdGhpcyBmdW5jdGlvbiAqLworLyogdm9pZCAoKnpmY2JVc2JPdXRDb21wbGV0ZSkoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90IHN0YXR1cywgdThfdCAqaGRyKTsgKi8KKworCisvKiBDYWxsIG91dCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQmVsb3cgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBzdXBwbHkgYnkgdGhlIE9BTCBmb3IgODAyMTFjb3JlIHRvICAgICAgKi8KKy8qIG1hbmlwdWxhdGUgdGhlIFVTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFJldHVybiBPQUwncyBVU0IgVHhRIHNpemUgKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JHZXRNYXhUeFFTaXplKHpkZXZfdCogZGV2KTsKKworLyogUmV0dXJuIE9BTCdzIFR4USBhdmFpbGFibGUgc2l6ZSAqLworZXh0ZXJuIHUzMl90IHpmd1VzYkdldEZyZWVUeFFTaXplKHpkZXZfdCogZGV2KTsKKworLyogUmVnaXN0ZXIgY2FsbCBiYWNrIGZ1bmN0aW9uICovCitleHRlcm4gdm9pZCB6ZndVc2JSZWdpc3RlckNhbGxCYWNrKHpkZXZfdCogZGV2LCBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgKnpmVXNiRnVuYyk7CisKKy8qIEVuYWJsZSBVU0IgaW50ZXJydXB0IGVuZHBvaW50ICovCitleHRlcm4gdTMyX3QgemZ3VXNiRW5hYmxlSW50RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KTsKKworLyogRW5hYmxlIFVTQiBSeCBlbmRwb2ludCAqLworZXh0ZXJuIGludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCk7CisKKy8qIDgwMjExY29yZSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2VuZCBhIFVTQiByZXF1ZXN0IG92ZXIgZW5kcG9pbnQgMCAqLworZXh0ZXJuIHUzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2woemRldl90KiBkZXYsIHU4X3QgcmVxLCB1MTZfdCB2YWx1ZSwKKyAgICAgICAgdTE2X3QgaW5kZXgsIHZvaWQgKmRhdGEsIHUzMl90IHNpemUpOworZXh0ZXJuIHUzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2xJbyh6ZGV2X3QqIGRldiwgdThfdCByZXEsIHU4X3QgcmVxdHlwZSwKKyAgICAgICAgdTE2X3QgdmFsdWUsIHUxNl90IGluZGV4LCB2b2lkICpkYXRhLCB1MzJfdCBzaXplKTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0cmFuc2ZlciBkYXRhIG91dCBvdmVyIGVuZHBvaW50IDEgKi8KK2V4dGVybiB2b2lkIHpmd1VzYkNtZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0cmFuc2ZlciBkYXRhIG91dCBvdmVyIGVuZHBvaW50IDQgKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JTZW5kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgVVNCIGNvbmZpZ3VyYXRpb24gKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JTZXRDb25maWd1cmF0aW9uKHpkZXZfdCAqZGV2LCB1MTZfdCB2YWx1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1YmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKQEAgLTAsMCArMSw4MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9QVUJfREVGU19ICisjZGVmaW5lIF9QVUJfREVGU19ICisKKyNpbmNsdWRlICIuLi9vYWxfZHQuaCIKKworLyoqKioqIFNlY3Rpb24gMSA6IFR1bmFibGUgUGFyYW1ldGVycyAqKioqKi8KKy8qIFRoZSBkZWZpbnRpb25zIGluIHRoaXMgc2VjdGlvbiBhcmUgdHVuYWJlbCBwYXJhbWV0ZXJzICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIEJTUyB0aGF0IGNvdWxkIGJlIHNjYW5lZCAqLworI2RlZmluZSBaTV9NQVhfQlNTICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgKKworLyogTWF4aW11bSBudW1iZXIgb2YgV1BBMiBQTUtJRCB0aGF0IHN1cHBvcnRlZCAqLworI2RlZmluZSBaTV9QTUtJRF9NQVhfQlNTX0NOVCAgICAgICAgICAgICAgIDgKKworLyogRW5hYmxlIGFnZ3JlZ2F0aW9uIGFuZCBkZWFnZ3JlZ2F0aW9uICovCisjZGVmaW5lIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyogRW5hYmxlIEJBIGZhaWxlZCByZXRyYW5zbWlzc2lvbiBpbiBmaXJtd2FyZSAqLworICAgICNkZWZpbmUgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgI2RlZmluZSBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgLy8jZGVmaW5lIFpNX0FHR1JfQklUX09OCisjZW5kaWYKKworCisjaWZuZGVmIFpNX0ZCNTAKKy8vI2RlZmluZSBaTV9GQjUwCisjZW5kaWYKKworI2lmbmRlZiBaTV9BUF9ERUJVRworLy8jZGVmaW5lIFpNX0FQX0RFQlVHCisjZW5kaWYKKworLy8jZGVmaW5lIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorCisvKioqKiogRW5kIG9mIHNlY3Rpb24gMSAqKioqKi8KKworCisvKioqKiogU2VjdGlvbiAyIDogUHVibGljIERlZmluaXRpb25zLCBkYXRhIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKioqKiovCisvKiBmdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCisjZGVmaW5lIFpNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgMQorCisvLyBtZWRpYSBjb25uZWN0IHN0YXR1cworI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5EICAgIDB4MDIKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0FCTEVEICAgICAgICAgICAgMHgwMworI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCAweDA0CisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUICAgIDB4MDUKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX1JFU0VUICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9ERUFVVEggICAweDA3CisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RJU0FTT0MgIDB4MDgKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVElNRU9VVCAgMHgwOQorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BVVRIX0ZBSUxFRCAgMHgwYQorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BU09DX0ZBSUxFRCAgMHgwYgorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9NSUNfRkFJTCAgIDB4MGMKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVU5SRUFDSEFCTEUgMHgwZAorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9CRUFDT05fTUlTUyAgMHgwZQorCisvLyBQYWNrZXQgRmlsdGVyCisjZGVmaW5lIFpNX1BBQ0tFVF9UWVBFX0RJUkVDVEVEICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgWk1fUEFDS0VUX1RZUEVfTVVMVElDQVNUICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFpNX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgWk1fUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMgICAgICAgICAgMHgwMDAwMDAyMAorCisvKiBCU1MgbW9kZSBkZWZpbml0aW9uICovCisvKiBUT0RPIDogVGhlIGRlZmluaXRpb25zIGhlcmUgYXJlIGNvdXBsZWQgd2l0aCBYUCdzIE5ESVMgT0lELiAqLworLyogICAgICAgIFdlIGNhbid0IGJlIGNoYW5nZWQgdGhlbSBmcmVlbHksIG5lZWQgdG8gZGlzYXJtIHRoaXMgbWluZSAqLworI2RlZmluZSBaTV9NT0RFX0lCU1MgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fTU9ERV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFX01BWCAgICAgICAgICAzCisjZGVmaW5lIFpNX01PREVfQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fTU9ERV9QU0VVRE8gICAgICAgICAgICAgICAgICAgICAgNQorCisKKy8qIEF1dGhlbnRpY2F0aW9uIG1vZGUgKi8KKyNkZWZpbmUgWk1fQVVUSF9NT0RFX09QRU4gICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FVVEhfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9BVVRIX01PREVfV1BBUFNLICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX0FVVEhfTU9ERV9XUEFfTk9ORSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQTIgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaTV9BVVRIX01PREVfV1BBMlBTSyAgICAgICAgICAgICAgICA3CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX0NFTkMgICAgICAgICAgICAgICAgICAgOAorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQV9BVVRPICAgICAgICAgICAgICAgOQorI2RlZmluZSBaTV9BVVRIX01PREVfV1BBUFNLX0FVVE8gICAgICAgICAgICAxMAorCisvLyBFbmNyeXB0aW9uIG1vZGUKKyNkZWZpbmUgWk1fTk9fV0VQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFpNX0FFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBaTV9US0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgWk1fV0VQNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFpNX1dFUDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBaTV9XRVAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9DRU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIEVuY3J5cHRpb24gdHlwZSBmb3Igd2VwIHN0YXR1cyAqLworI2RlZmluZSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCAgICAgICAgICAwCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fRU5DUllQVElPTl9XRVBfS0VZX0FCU0VOVCAgICAgICAgMgorI2RlZmluZSBaTV9FTkNSWVBUSU9OX05PVF9TVVBQT1JURUQgICAgICAgICAzCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fVEtJUCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fRU5DUllQVElPTl9US0lQX0tFWV9BQlNFTlQgICAgICAgNQorI2RlZmluZSBaTV9FTkNSWVBUSU9OX0FFUyAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fQUVTX0tFWV9BQlNFTlQgICAgICAgIDcKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fQ0VOQyAgICAgICAgICAgICAgICAgIDgKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIHNlY3VyaXR5IHR5cGUgKi8KKyNkZWZpbmUgWk1fU0VDVVJJVFlfVFlQRV9OT05FICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9TRUNVUklUWV9UWVBFX1dFUCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NFQ1VSSVRZX1RZUEVfV1BBICAgICAgICAgICAgICAgIDIKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX1NFQ1VSSVRZX1RZUEVfQ0VOQyAgICAgICAgICAgICAgIDMKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIEVuY3J5cHRpb24gRXhlbXB0aW9uIEFjdGlvbiBUeXBlICAqLworI2RlZmluZSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gICAwCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fRVhFTVBUX0FMV0FZUyAgICAgICAgIDEKKworLyogTUlDIGZhaWx1cmUgKi8KKyNkZWZpbmUgWk1fTUlDX1BBSVJXSVNFX0VSUk9SICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9NSUNfR1JPVVBfRVJST1IgICAgICAgICAgICAgICAgICAweDBFCisKKworLyogcG93ZXIgc2F2ZSBtb2RlICovCisjZGVmaW5lIFpNX1NUQV9QU19OT05FICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1NUQV9QU19NQVggICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NUQV9QU19GQVNUICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1NUQV9QU19MSUdIVCAgICAgICAgICAgICAgICAgICAzCisKKy8qIFdNRSBBQyBUeXBlICovCisjZGVmaW5lIFpNX1dNRV9BQ19CSyAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgLyogQmFja2dyb3VuZCBBQyAqLworI2RlZmluZSBaTV9XTUVfQUNfQkUgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC8qIEJlc3QtZWZmb3J0IEFDICovCisjZGVmaW5lIFpNX1dNRV9BQ19WSURFTyAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgLyogVmlkZW8gQUMgKi8KKyNkZWZpbmUgWk1fV01FX0FDX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvKiBWb2ljZSBBQyAqLworCisvKiBQcmVhbWJsZSB0eXBlICovCisjZGVmaW5lIFpNX1BSRUFNQkxFX1RZUEVfQVVUTyAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fUFJFQU1CTEVfVFlQRV9MT05HICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9QUkVBTUJMRV9UWVBFX1NIT1JUICAgICAgICAgICAgICAyCisKKy8qIHdpcmVsZXNzIG1vZGVzIGNvbnN0YW50cyAqLworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzVfNTQgICAgICAgIDB4MDEgICAvLy88IDUgR0h6IDU0IE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV81XzEwOCAgICAgICAweDAyICAgLy8vPCA1IEdIeiAxMDggTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzExICAgICAgIDB4MDQgICAvLy88IDIuNCBHSHogMTEgTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzU0ICAgICAgIDB4MDggICAvLy88IDIuNCBHSHogNTQgTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzEwOCAgICAgIDB4MTAgICAvLy88IDIuNCBHSHogMTA4IE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV80OV8xMyAgICAgIDB4MTAwICAgLy8vPCA0LjkgR0h6IDEzLjUgTWJwcywgcXVhcnRlciByYXRlIGNobi1iYW5kd2lkdGggPSA1CisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNDlfMjcgICAgICAweDIwMCAgIC8vLzwgNC45IEdIeiAyNyBNYnBzLCBoYWxmIHJhdGUgY2huLWJhbmR3aWR0aCA9IDEwCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNDlfNTQgICAgICAweDQwMCAgIC8vLzwgNC45IEdIeiA1NCBNYnBzLCBmdWxsIHJhdGUgY2huLWJhbmR3aWR0aCA9IDIwCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNV8zMDAgICAgIDB4MTAwMCAgIC8vLzwgNSBHSHogMzAwIE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF8zMDAgICAgMHgyMDAwICAgLy8vPCAyLjQgR0h6IDMwMCBNYnBzCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNV8xMzAgICAgIDB4NDAwMCAgIC8vLzwgNSBHSHogMTMwIE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF8xMzAgICAgMHg4MDAwICAgLy8vPCAyLjQgR0h6IDEzMCBNYnBzCisKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF9OICAgICAgKFpNX1dJUkVMRVNTX01PREVfMjRfMTMwfFpNX1dJUkVMRVNTX01PREVfMjRfMzAwKQorI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzVfTiAgICAgICAoWk1fV0lSRUxFU1NfTU9ERV81XzEzMHxaTV9XSVJFTEVTU19NT0RFXzVfMzAwKQorI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0ICAgICAgICAoWk1fV0lSRUxFU1NfTU9ERV8yNF8xMXxaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV81ICAgICAgICAgKFpNX1dJUkVMRVNTX01PREVfNV81NHxaTV9XSVJFTEVTU19NT0RFXzVfTikKKworLyogQWRIb2MgTW9kZSB3aXRoIGRpZmZlcmVudCBiYW5kICovCisjZGVmaW5lIFpNX0FESE9DQkFORF9BICAgICAgICAgMQorI2RlZmluZSBaTV9BREhPQ0JBTkRfQiAgICAgICAgIDIKKyNkZWZpbmUgWk1fQURIT0NCQU5EX0cgICAgICAgICAzCisjZGVmaW5lIFpNX0FESE9DQkFORF9CRyAgICAgICAgNAorI2RlZmluZSBaTV9BREhPQ0JBTkRfQUJHICAgICAgIDUKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtIGluIHRoZSBmaWVsZCBhbGdObyBvZiBhdXRoZW50aWNhdGlvbiBmcmFtZXMgKi8KKyNkZWZpbmUgWk1fQVVUSF9BTEdPX09QRU5fU1lTVEVNICAgICAgMHgxMDAwMCAgICAvKiBPcGVuIHN5c3RlbSAqLworI2RlZmluZSBaTV9BVVRIX0FMR09fU0hBUkVEX0tFWSAgICAgICAweDEwMDAxICAgIC8qIFNoYXJlZCBLZXkgKi8KKyNkZWZpbmUgWk1fQVVUSF9BTEdPX0xFQVAgICAgICAgICAgICAgMHgxMDA4MCAgICAvKiBMZWFwICovCisKK3N0cnVjdCB6c1NjYW5SZXN1bHQKK3sKKyAgICB1MzJfdCByZXNlcnZlZDsKK307CisKKworc3RydWN0IHpzU3Rhc3RpY3MKK3sKKyAgICB1MzJfdCByZXNlcnZlZDsKK307CisKKyNkZWZpbmUgWk1fTUFYX1NVUFBfUkFURVNfSUVfU0laRSAgICAgICAxMgorI2RlZmluZSBaTV9NQVhfSUVfU0laRSAgICAgICAgICAgICAgICAgIDUwIC8vMTAwCisjZGVmaW5lIFpNX01BWF9XUFNfSUVfU0laRSAgICAgICAgICAgICAgMTUwCisjZGVmaW5lIFpNX01BWF9QUk9CRV9GUkFNRV9CT0RZX1NJWkUgICAgNTEyLy8zMDAKKyNkZWZpbmUJWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFCQkyMAorCisjZGVmaW5lIFpNX01BWF9TU0lEX0xFTkdUSCAgICAgICAgICAzMgorc3RydWN0IHpzQnNzSW5mbworeworICAgIHU4X3QgICBtYWNhZGRyWzZdOworICAgIHU4X3QgICBic3NpZFs2XTsKKyAgICB1OF90ICAgYmVhY29uSW50ZXJ2YWxbMl07CisgICAgdThfdCAgIGNhcGFiaWxpdHlbMl07CisgICAgdThfdCAgIHRpbWVTdGFtcFs4XTsKKyAgICB1OF90ICAgc3NpZFtaTV9NQVhfU1NJRF9MRU5HVEggKyAyXTsgICAvLyBFSUQoMSkgKyBMZW5ndGgoMSkgKyBTU0lEKDMyKQorICAgIHU4X3QgICBzdXBwb3J0ZWRSYXRlc1taTV9NQVhfU1VQUF9SQVRFU19JRV9TSVpFICsgMl07IC8vIEVJRCgxKSArIExlbmd0aCgxKSArIHN1cHBvcnRlZCByYXRlcyBbMTJdCisgICAgdThfdCAgIGNoYW5uZWw7CisgICAgdTE2X3QgIGZyZXF1ZW5jeTsKKyAgICB1MTZfdCAgYXRpbVdpbmRvdzsKKyAgICB1OF90ICAgZXJwOworICAgIHU4X3QgICBleHRTdXBwb3J0ZWRSYXRlc1taTV9NQVhfU1VQUF9SQVRFU19JRV9TSVpFICsgMl07IC8vIEVJRCgxKSArIExlbmd0aCgxKSArIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlcyBbMTJdCisgICAgdThfdCAgIHdwYUllW1pNX01BWF9JRV9TSVpFICsgMl07CisgICAgdThfdCAgIHdzY0llW1pNX01BWF9XUFNfSUVfU0laRSArIDJdOworICAgIHU4X3QgICByc25JZVtaTV9NQVhfSUVfU0laRSArIDJdOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdThfdCAgIGNlbmNJZVtaTV9NQVhfSUVfU0laRSArIDJdOyAvKiBDRU5DICovIC8qIGhhbGYgc2l6ZSBiZWNhdXNlIG9mIG1lbW9yeSBleGNlZWQgNjRrIGJvdW5kYXJ5ICovCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgICBzZWN1cml0eVR5cGU7CisgICAgdThfdCAgIHNpZ25hbFN0cmVuZ3RoOworICAgIHU4X3QgICBzaWduYWxRdWFsaXR5OworICAgIHUxNl90ICBzb3J0VmFsdWU7CisgICAgdThfdCAgIHdtZVN1cHBvcnQ7CisgICAgdThfdCAgIGZsYWc7CisgICAgdThfdCAgIEVuYWJsZUhUOworICAgIHU4X3QgICBlbmFibGVIVDQwOworICAgIHU4X3QgICBTRzQwOworICAgIHU4X3QgICBleHRDaE9mZnNldDsKKyAgICB1OF90ICAgYXBDYXA7IC8vIGJpdDA6MTFOIEFQCisgICAgdTE2X3QgIGZyYW1lQm9keXNpemU7CisgICAgdThfdCAgIGZyYW1lQm9keVtaTV9NQVhfUFJPQkVfRlJBTUVfQk9EWV9TSVpFXTsKKyAgICB1OF90ICAgY291bnRyeUluZm9bWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFICsgMl07CisgICAgdTE2X3QgIGF0aE93bEFwOworICAgIHUxNl90ICBtYXJ2ZWxBcDsKKyAgICB1MTZfdCAgYnJvYWRjb21IVEFwOworICAgIHUzMl90ICB0aWNrOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIG5leHQ7Cit9OworCitzdHJ1Y3QgenNCc3NMaXN0Cit7CisgICAgdThfdCBic3NDb3VudDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBoZWFkOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHRhaWw7Cit9OworCitzdHJ1Y3QgenNCc3NMaXN0VjEKK3sKKyAgICB1OF90IGJzc0NvdW50OworICAgIHN0cnVjdCB6c0Jzc0luZm8gYnNzSW5mb1taTV9NQVhfQlNTXTsKK307CisKKyNkZWZpbmUgWk1fS0VZX0ZMQUdfR0sgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTV9LRVlfRkxBR19QSyAgICAgICAgICAgICAgICAgMFgwMDAyCisjZGVmaW5lIFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgICAgICAweDAwMDQKKyNkZWZpbmUgWk1fS0VZX0ZMQUdfSU5JVF9JViAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWSAgICAgICAgMHgwMDEwCisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9LRVlfRkxBR19DRU5DICAgICAgICAgICAgICAgMHgwMDIwCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisvLyBDb21tZW50OiBGb3IgVEtJUCwga2V5WzBdfmtleVsxNV0gID0+IFRLSVAga2V5CisvLyAgICAgICAgICAgICAgICAgICAga2V5WzE2XX5rZXlbMjNdID0+IFR4IE1JQyBrZXkKKy8vICAgICAgICAgICAgICAgICAgICBrZXlbMjRdfmtleVszMV0gPT4gUnggTUlDIGtleQorc3RydWN0IHpzS2V5SW5mbworeworICAgIHU4X3QqICAga2V5OworICAgIHU4X3QgICAga2V5TGVuZ3RoOworICAgIHU4X3QgICAga2V5SW5kZXg7CisgICAgdThfdCogICBpbml0SXY7CisgICAgdTE2X3QgICBmbGFnOworICAgIHU4X3QgICAgdmFwSWQ7CisgICAgdTE2X3QgICAgdmFwQWRkclszXTsKKyAgICB1MTZfdCogICBtYWNBZGRyOworfTsKKworCisKKy8qCisgKiBDaGFubmVscyBhcmUgc3BlY2lmaWVkIGJ5IGZyZXF1ZW5jeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNl90CWNoYW5uZWw7CS8qIHNldHRpbmcgaW4gTWh6ICovCisJdTMyX3QJY2hhbm5lbEZsYWdzOwkvKiBzZWUgYmVsb3cgKi8KKwl1OF90CXByaXZGbGFnczsKKwlzOF90CW1heFJlZ1R4UG93ZXI7CS8qIG1heCByZWd1bGF0b3J5IHR4IHBvd2VyIGluIGRCbSAqLworCXM4X3QJbWF4VHhQb3dlcjsJLyogbWF4IHRydWUgdHggcG93ZXIgaW4gMC4yNSBkQm0gKi8KKwlzOF90CW1pblR4UG93ZXI7CS8qIG1pbiB0cnVlIHR4IHBvd2VyIGluIDAuMjUgZEJtICovCit9IFpNX0hBTF9DSEFOTkVMOworCitzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUKK3sKKyAgICB1MTZfdCAgIHJlZ2lvbkNvZGU7CisgICAgdTE2X3QgICBDdXJDaEluZGV4OworICAgIHUxNl90ICAgYWxsb3dDaGFubmVsQ250OworICAgIFpNX0hBTF9DSEFOTkVMICAgYWxsb3dDaGFubmVsWzYwXTsgICAvKiAyLjRHSHo6IDE0IGNoYW5uZWxzLCA1IEdIejogMzEgY2hhbm5lbHMgKi8KK307CisKK3N0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudAoreworICAgIHU4X3QgYnNzaWRbNl07ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCU1NJRCBvZiBJQlNTCisgICAgdThfdCBwZWVyTWFjQWRkcls2XTsgICAgICAgICAgICAgICAgLy8gVGhlIE1BQyBhZGRyZXNzIG9mIHBlZXIgc3RhdGlvbgorfTsKKworI2RlZmluZSBaTV9SQ19UUkFJTkVEX0JJVCAgIDB4MQorc3RydWN0IHpzUmNDZWxsCit7CisgICAgdTMyX3QgdHhDb3VudDsKKyAgICB1MzJfdCBmYWlsQ291bnQ7CisgICAgdThfdCBjdXJyZW50UmF0ZTsKKyAgICB1OF90IGN1cnJlbnRSYXRlSW5kZXg7CisgICAgdTMyX3QgcHJvYmluZ1RpbWU7CisgICAgdThfdCBvcGVyYXRpb25SYXRlU2V0WzI0XTsKKyAgICB1OF90IG9wZXJhdGlvblJhdGVDb3VudDsKKyAgICB1MTZfdCByeFJzc2k7CisgICAgdThfdCBmbGFnOworICAgIHUzMl90ICBsYXN0dHhDb3VudDsKKyAgICB1MzJfdCAgbGFzdFRpbWU7Cit9OworCitzdHJ1Y3QgenNPcHBvc2l0ZUluZm8KK3sKKyAgICB1OF90ICAgICAgICAgICAgbWFjQWRkcls2XTsKKyAgICBzdHJ1Y3QgenNSY0NlbGwgcmNDZWxsOworICAgIHU4X3QgICAgICAgICAgICB2YWxpZDsgICAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGUgaWYgdGhpcyBvcHBvc2l0ZSBpcyBzdGlsbCB2YWxpZAorICAgIHU4X3QgICAgICAgICAgICBhbGl2ZUNvdW50ZXI7CisgICAgdThfdCAgICAgICAgICAgIHBrSW5zdGFsbGVkOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIC8qIEZvciBXUEEyUFNLICEgKi8KKyAgICB1OF90IAkJCXdwYVN0YXRlOworICAgIHU4X3QgICAgICAgICAgICBjYW1JZHg7CisgICAgdThfdCAgICAgICAgICAgIGVuY3J5TW9kZTsKKyAgICB1MTZfdCAgICAgICAgICAgaXYxNjsKKyAgICB1MzJfdCAgICAgICAgICAgaXYzMjsKKyNlbmRpZgorfTsKKwordHlwZWRlZiB2b2lkICgqemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiKSgKKyAgICB6ZGV2X3QqIGRldiwgc3RydWN0IHpzT3Bwb3NpdGVJbmZvICpwZWVySW5mbywgdm9pZCAqY3R4LCB1OF90IGluZGV4KTsKKwordHlwZWRlZiB1MTZfdCAoKnpmcFN0YVJ4U2VjdXJpdHlDaGVja0NiKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisKKy8qIENvbW11bmljYXRpb24gVGFsbHkgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB6c0NvbW1UYWxseQoreworICAgIHUzMl90IHR4VW5pY2FzdEZybTsJCSAgICAvLyAgMCB0eFVuaWNhc3RGcmFtZXMKKyAgICB1MzJfdCB0eE11bHRpY2FzdEZybTsJCS8vICAxIHR4TXVsdGljYXN0RnJhbWVzCisgICAgdTMyX3QgdHhVbmljYXN0T2N0ZXRzOwkgICAgLy8gIDIgdHhVbmlPY3RldHMgIGJ5dGUgc2l6ZQorICAgIHUzMl90IHR4TXVsdGljYXN0T2N0ZXRzOwkvLyAgMyB0eE11bHRpT2N0ZXRzICBieXRlIHNpemUKKyAgICB1MzJfdCB0eEZybVVwcGVyTkRJUzsgICAgICAgLy8gIDQKKyAgICB1MzJfdCB0eEZybURydk1ndDsgICAgICAgICAgLy8gIDUKKyAgICB1MzJfdCBSZXRyeUZhaWxDbnQ7CQkgICAgLy8gIDYKKyAgICB1MzJfdCBId19Ub3RhbFR4RnJtOwkJLy8gIDcgSGFyZHdhcmUgdG90YWwgVHggRnJhbWUKKyAgICB1MzJfdCBId19SZXRyeUNudDsJCSAgICAvLyAgOCB0eE11bHRpcGxlUmV0cmllc0ZyYW1lcworICAgIHUzMl90IEh3X1VuZGVycnVuQ250OyAgICAgICAvLyAgOQorCisgICAgdTMyX3QgRHJpdmVyUnhGcm1DbnQ7ICAgICAgIC8vIDEwCisgICAgdTMyX3QgcnhVbmljYXN0RnJtOwkJICAgIC8vIDExIHJ4VW5pY2FzdEZyYW1lcworICAgIHUzMl90IHJ4TXVsdGljYXN0RnJtOwkgICAgLy8gMTJyeE11bHRpY2FzdEZyYW1lcworCisgICAgdTMyX3QgTm90aWZ5TkRJU1J4RnJtQ250OyAgIC8vIDE0CisgICAgdTMyX3QgcnhVbmljYXN0T2N0ZXRzOwkvLyAxNSByeFVuaU9jdGV0cyAgYnl0ZSBzaXplCisgICAgdTMyX3QgcnhNdWx0aWNhc3RPY3RldHM7CSAgICAvLyAxNiByeE11bHRpT2N0ZXRzICBieXRlIHNpemUKKyAgICB1MzJfdCBEcml2ZXJEaXNjYXJkZWRGcm07ICAgICAgIC8vIDE3IERpc2NhcmQgYnkgVmFsaWRhdGVGcmFtZQorICAgIHUzMl90IExlc3NUaGFuRGF0YU1pbkxlbjsgICAgICAgLy8gMTgKKyAgICB1MzJfdCBHcmVhdGVyVGhhbk1heExlbjsgICAgICAgIC8vIDE5CisgICAgdTMyX3QgRHJpdmVyRGlzY2FyZGVkRnJtQ2F1c2VCeU11bHRpY2FzdExpc3Q7CisgICAgdTMyX3QgRHJpdmVyRGlzY2FyZGVkRnJtQ2F1c2VCeUZybUN0cmw7CisgICAgdTMyX3QgcnhOZWVkRnJnRnJtOwkJICAgIC8vIDIyIG5lZWQgbW9yZSBmcmcgZnJtCisgICAgdTMyX3QgRHJpdmVyUnhNZ3RGcm1DbnQ7CisgICAgdTMyX3QgcnhCcm9hZGNhc3RGcm07CSAgICAvLyAyNCBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZSBjb3VudAorICAgIHUzMl90IHJ4QnJvYWRjYXN0T2N0ZXRzOwkvLyAyNSBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZSBieXRlIHNpemUKKyAgICB1MzJfdCByeDExYkRhdGFGcmFtZTsJCS8vIDI2IE1lYXN1cmVkIHF1YWxpdHkgMTFiIGRhdGEgZnJhbWUgY291bnQKKyAgICB1MzJfdCByeE9GRE1EYXRhRnJhbWU7CSAgICAvLyAyNyBNZWFzdXJlZCBxdWFsaXR5IDExZyBkYXRhIGZyYW1lIGNvdW50CisKKworICAgIHUzMl90IEh3X1RvdGFsUnhGcm07ICAgICAgICAvLyAyOAorICAgIHUzMl90IEh3X0NSQzE2Q250OwkJICAgIC8vIDI5IHJ4UExDUENSQ0VyckNudAorICAgIHUzMl90IEh3X0NSQzMyQ250OwkJICAgIC8vIDMwIHJ4Q1JDMzJFcnJDbnQKKyAgICB1MzJfdCBId19EZWNyeXBFcnJfVU5JOyAgICAgLy8gMzEKKyAgICB1MzJfdCBId19EZWNyeXBFcnJfTXVsOyAgICAgLy8gMzIKKworICAgIHUzMl90IEh3X1J4RklGT092ZXJydW47ICAgICAvLyAzNAorICAgIHUzMl90IEh3X1J4VGltZU91dDsgICAgICAgICAvLyAzNQorICAgIHUzMl90IExvc3NBUDsgICAgICAgICAgICAgICAvLyAzNgorCisgICAgdTMyX3QgVHhfTVBEVTsgICAgICAgICAgICAgIC8vIDM3CisgICAgdTMyX3QgQkFfRmFpbDsgICAgICAgICAgICAgIC8vIDM4CisgICAgdTMyX3QgSHdfVHhfQU1QRFU7ICAgICAgICAgIC8vIDM5CisgICAgdTMyX3QgSHdfVHhfTVBEVTsgICAgICAgICAgIC8vIDQwCisKKyAgICB1MzJfdCBSYXRlQ3RybFR4TVBEVTsKKyAgICB1MzJfdCBSYXRlQ3RybEJBRmFpbDsKKworICAgIHUzMl90IHR4UW9zRHJvcENvdW50WzVdOyAgICAvLzQxIDQyIDQzIDQ0IDQ1CisKKwl1MzJfdCBId19SeE1QRFU7ICAgICAgICAgICAgLy8gNDYKKwl1MzJfdCBId19SeERyb3BNUERVOyAgICAgICAgLy8gNDcKKwl1MzJfdCBId19SeERlbE1QRFU7ICAgICAgICAgLy8gNDgKKworCXUzMl90IEh3X1J4UGh5TWlzY0Vycm9yOyAgICAvLyA0OQorCXUzMl90IEh3X1J4UGh5WFJFcnJvcjsgICAgICAvLyA1MAorICAgIHUzMl90IEh3X1J4UGh5T0ZETUVycm9yOyAgICAvLyA1MQorICAgIHUzMl90IEh3X1J4UGh5Q0NLRXJyb3I7ICAgICAvLyA1MgorICAgIHUzMl90IEh3X1J4UGh5SFRFcnJvcjsgICAgICAvLyA1MworICAgIHUzMl90IEh3X1J4UGh5VG90YWxDb3VudDsgICAvLyA1NAorCisgICAgdTMyX3Qgc3dSeEZyYWdtZW50Q291bnQ7ICAgICAgICAgLy8gNTUKKyAgICB1MzJfdCBzd1J4VW5pY2FzdE1pY0ZhaWxDb3VudDsgICAvLyA1NgorICAgIHUzMl90IHN3UnhNdWx0aWNhc3RNaWNGYWlsQ291bnQ7IC8vIDU3CisgICAgdTMyX3Qgc3dSeERyb3BVbmVuY3J5cHRlZENvdW50OyAgLy8gNTgKKworICAgIHUzMl90IHR4QnJvYWRjYXN0RnJtOworICAgIHUzMl90IHR4QnJvYWRjYXN0T2N0ZXRzOworfTsKKworLyogVHJhZmZpYyBNb25pdG9yIFRhbGx5IGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgenNUcmFmVGFsbHkKK3sKKyAgICB1MzJfdCByeER1cGxpY2F0ZTsKKyAgICB1MzJfdCByeFNyY0lzT3duTWFjOworICAgIC8vdTMyX3QgcnhEYXRhRnJhbWVDb3VudDsKKyAgICAvL3UzMl90IHJ4RGF0YUJ5dGVDb3VudDsKKyAgICAvL3UzMl90IHJ4RGF0YUJ5dGVzSW4xMDAwbXM7CisgICAgLy91MzJfdCByeERhdGFUbXBGb3IxMDAwbXM7CisgICAgLy91MzJfdCByeERhdGFCeXRlc0luMjAwMG1zOworICAgIC8vdTMyX3QgcnhEYXRhVG1wRm9yMjAwMG1zOworCisgICAgLy91MzJfdCB0eERhdGFGcmFtZUNvdW50OworICAgIC8vdTMyX3QgdHhEYXRhQnl0ZUNvdW50OworICAgIC8vdTMyX3QgdHhEYXRhQnl0ZXNJbjEwMDBtczsKKyAgICAvL3UzMl90IHR4RGF0YVRtcEZvcjEwMDBtczsKKyAgICB1MzJfdCB0eERhdGFCeXRlc0luMjAwMG1zOworICAgIHUzMl90IHR4RGF0YVRtcEZvcjIwMDBtczsKK307CisKKy8qIEhhbCByeCBwYWNrZXQgbW9uaXRlciBpbmZvcm1hdGlvbiAqLworc3RydWN0IHpzTW9uSGFsUnhJbmZvCit7CisgICAgdTMyX3QgY3VycmVudFJTU0lbN107CisgICAgdTMyX3QgY3VycmVudFJ4RVZNWzE0XTsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhTVQ7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YU1DUzsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhQlc7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YVNHOworfTsKKworc3RydWN0IHpzVGFpbAoreworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgxOworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgyOworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgzOworICAgIHU4X3QgU2lnbmFsUXVhbGl0eTsKKyAgICB1OF90IFNBSW5kZXg7CisgICAgdThfdCBEQUluZGV4OworICAgIHU4X3QgRXJyb3JJbmRpY2F0aW9uOworICAgIHU4X3QgUnhNYWNTdGF0dXM7Cit9OworCit1bmlvbiB6dVRhaWwKK3sKKyAgICBzdHJ1Y3QgenNUYWlsIERhdGE7CisgICAgdThfdCBCeXRlWzhdOworfTsKKworc3RydWN0IHpzQWRkaXRpb25JbmZvCit7CisgICAgdThfdCBQbGNwSGVhZGVyWzEyXTsKKyAgICB1bmlvbiB6dVRhaWwgICBUYWlsOworfTsKKworCitzdHJ1Y3QgenNQbWtpZEJzc2lkSW5mbworeworICAgIHUxNl90ICAgICAgYnNzaWRbM107CisgICAgdThfdCAgICAgICBwbWtpZFsxNl07Cit9OworCitzdHJ1Y3QgenNQbWtpZEluZm8KK3sKKwkgICB1MzJfdAkJYnNzaWRDb3VudDsKKwkgICBzdHJ1Y3QgenNQbWtpZEJzc2lkSW5mbwlic3NpZEluZm9bWk1fUE1LSURfTUFYX0JTU19DTlRdOworfTsKKworCitzdHJ1Y3QgenNDYkZ1bmNUYmwKK3sKKyAgICB1MTZfdCAoKnpmY2JBdXRoTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpOworICAgIHUxNl90ICgqemZjYkFzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyAgICB1MTZfdCAoKnpmY2JEaXNBc29jTm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CisgICAgdTE2X3QgKCp6ZmNiQXBDb25uZWN0Tm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JDb25uZWN0Tm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCB1MTZfdCogYnNzaWQpOworICAgIHZvaWQgKCp6ZmNiU2Nhbk5vdGlmeSkoemRldl90KiBkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQqIHJlc3VsdCk7CisgICAgdm9pZCAoKnpmY2JNaWNGYWlsdXJlTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXR1cyk7CisgICAgdm9pZCAoKnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1Zik7CisgICAgdm9pZCAoKnpmY2JJYnNzUGFydG5lck5vdGlmeSkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywKKyAgICAgICAgICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpOworICAgIHZvaWQgKCp6ZmNiTWFjQWRkcmVzc05vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworICAgIHZvaWQgKCp6ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbikoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYlJlY3ZFdGgpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JSZWN2ODAyMTEpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKyAgICB2b2lkICgqemZjYlJlc3RvcmVCdWZEYXRhKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdTE2X3QgKCp6ZmNiQ2VuY0Fzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgdThfdCAoKnpmY2JDbGFzc2lmeVR4UGFja2V0KSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisgICAgdm9pZCAoKnpmY2JId1dhdGNoRG9nTm90aWZ5KSh6ZGV2X3QqIGRldik7Cit9OworCitleHRlcm4gdm9pZCB6Zlplcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCk7CisjZGVmaW5lIFpNX0lOSVRfQ0JfRlVOQ19UQUJMRShwKSAgICAgICAgemZaZXJvTWVtb3J5KCh1OF90ICopcCwgc2l6ZW9mKHN0cnVjdCB6c0NiRnVuY1RibCkpOworCisvL2V4dGVybiBzdHJ1Y3QgenNXbGFuRGV2IHpnV2xhbkRldjsKKworLyogSW5pdGlhbGl6ZSBXTEFOIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSwgcmVzb3VyY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgKi8KKy8qIGZvciBXTEFOIG9wZXJhdGlvbiwgbXVzdCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIG90aGVyIGZ1bmN0aW9uLiAgICovCitleHRlcm4gdTE2X3QgemZpV2xhbk9wZW4oemRldl90KiBkZXYsIHN0cnVjdCB6c0NiRnVuY1RibCogY2JGdW5jVGJsKTsKKworLyogV0xBTiBoYXJkd2FyZSB3aWxsIGJlIHNodXRkb3duIGFuZCBhbGwgcmVzb3VyY2Ugd2lsbCBiZSByZWxlYXNlICovCitleHRlcm4gdTE2X3QgemZpV2xhbkNsb3NlKHpkZXZfdCogZGV2KTsKKworLyogRW5hYmxlL2Rpc2FibGUgV2xhbiBvcGVyYXRpb24gKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuRW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuRGlzYWJsZSh6ZGV2X3QqIGRldiwgdThfdCBSZXNldEtleUNhY2hlKTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUmVzdW1lKHpkZXZfdCogZGV2LCB1OF90IGRvUmVjb25uKTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuU3VzcGVuZCh6ZGV2X3QqIGRldik7CisKKy8qIEVuYWJsZS9kaXNhYmxlIElTUiBpbnRlcnJ1cHQgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuSW50ZXJydXB0RW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuSW50ZXJydXB0RGlzYWJsZSh6ZGV2X3QqIGRldik7CisKKy8qIERvIFdMQU4gc2l0ZSBzdXJ2ZXkgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuU2Nhbih6ZGV2X3QqIGRldik7CisKKy8qIEdldCBXTEFOIHN0YXN0aWNzICovCitleHRlcm4gdTE2X3QgemZpV2xhbkdldFN0YXRpc3RpY3MoemRldl90KiBkZXYpOworCisvKiBSZXNldCBXTEFOICovCitleHRlcm4gdTE2X3QgemZpV2xhblJlc2V0KHpkZXZfdCogZGV2KTsKKworLyogRGVhdXRoZW50aWNhdGUgYSBTVEEgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuRGVhdXRoKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgcmVhc29uKTsKKworZXh0ZXJuIHUxNl90IHpmaVR4U2VuZEV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpOworZXh0ZXJuIHU4X3QgemZpSXNUeFF1ZXVlRnVsbCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZpVHhTZW5kODAyMTFNZ210KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisKK2V4dGVybiB2b2lkIHpmaUlzclBjaSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB1OF90IHpmaVdsYW5JQlNTR2V0UGVlclN0YXRpb25zQ291bnQoemRldl90KiBkZXYpOworZXh0ZXJuIHU4X3QgemZpV2xhbklCU1NJdGVyYXRlUGVlclN0YXRpb25zKHpkZXZfdCogZGV2LCB1OF90IG51bVRvSXRlcmF0ZSwgemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiIGNhbGxiYWNrLCB2b2lkICpjdHgpOworZXh0ZXJuIHZvaWQgemZpV2xhbkZsdXNoQWxsUXVldWVkQnVmZmVycyh6ZGV2X3QqIGRldik7CisKKy8qIGNvaWQuYyAqLworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcik7CisKK2V4dGVybiB1MTZfdCB6ZmlHbG9iYWxEYXRhU2l6ZSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaUhlYXJ0QmVhdCh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRXbGFuTW9kZSh6ZGV2X3QqIGRldiwgdThfdCB3bGFuTW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IGF1dGhNb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRXZXBTdGF0dXMoemRldl90KiBkZXYsIHU4X3Qgd2VwU3RhdHVzKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBzc2lkLCB1OF90IHNzaWRMZW5ndGgpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYsIHUxNl90IGZyYWdUaHJlc2hvbGQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFJ0c1RocmVzaG9sZCh6ZGV2X3QqIGRldiwgdTE2X3QgcnRzVGhyZXNob2xkKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBiSW1tZWRpYXRlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEJlYWNvbkludGVydmFsKHpkZXZfdCogZGV2LCB1MTZfdCBiZWFjb25JbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYkltbWVkaWF0ZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0RHRpbUNvdW50KHpkZXZfdCogZGV2LCB1OF90ICBkdGltKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRBdGltV2luZG93KHpkZXZfdCogZGV2LCB1MTZfdCBhdGltV2luZG93LCB1OF90IGJJbW1lZGlhdGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEVuY3J5TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBlbmNyeU1vZGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblNldEtleSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvKTsKK2V4dGVybiB1OF90IHpmaVdsYW5QU0VVRE9TZXRLZXkoemRldl90KiBkZXYsIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0UG93ZXJTYXZlTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeUJzc0xpc3RWMSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzTGlzdFYxKiBic3NMaXN0VjEpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5QnNzTGlzdCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzTGlzdCogcEJzc0xpc3QpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhbkZsdXNoQnNzTGlzdCh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpV2xhbkRpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKTsKKworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5V2xhbk1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5DaGFubmVsVG9GcmVxdWVuY3koemRldl90KiBkZXYsIHU4X3QgY2hhbm5lbCk7CitleHRlcm4gdThfdCB6ZmlXbGFuRnJlcXVlbmN5VG9DaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKKworI2RlZmluZSBaTV9XTEFOX1NUQVRFX09QRU5FRCAgICAgICAgMAorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0VOQUJMRUQgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEICAgICAgMgorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0NMT1NFREVEICAgICAgMworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5QWRhcHRlclN0YXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUF1dGhlbnRpY2F0aW9uTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBiV3JhcHBlcik7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlXZXBTdGF0dXMoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5U1NJRCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCogcFNzaWRMZW5ndGgpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeVJ0c1RocmVzaG9sZCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5RnJlcXVlbmN5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MzJfdCB6ZmlXbGFuUXVlcnlDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2LCB1OF90IHFtb2RlKTsKK2V4dGVybiB1MzJfdCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lBdHRyaWJ1dGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lIVCh6ZGV2X3QqIGRldiwgdTMyX3QgKmJhbmRXaWR0aCwgdTMyX3QgKmV4dE9mZnNldCk7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlDV01vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeUNXRW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCk7CitleHRlcm4gdTE2X3QgemZpV2xhblF1ZXJ5QmVhY29uSW50ZXJ2YWwoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVJ4QmVhY29uVG90YWwoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeUF0aW1XaW5kb3coemRldl90KiBkZXYpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5RW5jcnlNb2RlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlDYXBhYmlsaXR5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlBaWQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5U3VwcG9ydFJhdGUoemRldl90KiBkZXYsIHU4X3QqIHJhdGVBcnJheSwgdThfdCogcExlbmd0aCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlFeHRTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeVJzbkllKHpkZXZfdCogZGV2LCB1OF90KiBpZSwgdThfdCogcExlbmd0aCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlXcGFJZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QqIHBMZW5ndGgpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5SFRNb2RlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUJhbmRXaWR0aDQwKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeU11bHRpY2FzdENpcGhlckFsZ28oemRldl90ICpkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeVJlZ2lvbkNvZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFdwYUllKHpkZXZfdCogZGV2LCB1OF90KiBpZSwgdThfdCBMZW5ndGgpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFdwYVN1cHBvcnQoemRldl90KiBkZXYsIHU4X3QgV3BhU3VwcG9ydCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuQ2hlY2tTdGFXcGFJZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QmFzaWNSYXRlKHpkZXZfdCogZGV2LCB1OF90IGJSYXRlU2V0LCB1OF90IGdSYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90IG5SYXRlU2V0KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRCR01vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0cHJlYW1ibGVUeXBlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5cHJlYW1ibGVUeXBlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeVBvd2VyU2F2ZU1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWMpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5TZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90IHJhdGUpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVR4UmF0ZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZldsYW5VcGRhdGVSeFJhdGUoemRldl90KiBkZXYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UnhSYXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXRQbWtpZEluZm8oemRldl90KiBkZXYsIHUxNl90KiBic3NpZCwgdThfdCogcG1raWQpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MzJfdCBsZW4pOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEFsbE11bHRpY2FzdCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0SFRDdHJsKHpkZXZfdCogZGV2LCB1MzJfdCAqc2V0dGluZywgdTMyX3QgZm9yY2VUeFRQQyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlIVEN0cmwoemRldl90KiBkZXYsIHUzMl90ICpzZXR0aW5nLCB1MzJfdCAqZm9yY2VUeFRQQyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuRGJnKHpkZXZfdCogZGV2LCB1OF90IHNldHRpbmcpOworCitleHRlcm4gdm9pZCB6ZmlXbGFuUmVzZXRUYWxseSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlUYWxseSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQ29tbVRhbGx5ICp0YWxseSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlUcmFmVGFsbHkoemRldl90KiBkZXYsIHN0cnVjdCB6c1RyYWZUYWxseSAqdGFsbHkpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNNb25IYWxSeEluZm8gKmhhbFJ4SW5mbyk7CisKK2V4dGVybiB1MzJfdCB6ZmlGV0NvbmZpZyh6ZGV2X3QqIGRldiwgdTMyX3Qgc2l6ZSk7CisKK2V4dGVybiB2b2lkIHpmaURLRW5hYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBlbmFibGUpOworCitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0TXVsdGljYXN0TGlzdCh6ZGV2X3QqIGRldiwgdThfdCBzaXplLCB1OF90KiBwTGlzdCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleVR5cGUsIHU4X3Qga2V5SWQpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5SXNQS0luc3RhbGxlZCh6ZGV2X3QgKmRldiwgdThfdCAqc3RhTWFjQWRkcik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UGFja2V0VHlwZVByb21pc2N1b3VzKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRQYWNrZXRUeXBlUHJvbWlzY3VvdXMoemRldl90KiBkZXYsIHUzMl90IHNldFZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVNldENoYW5uZWxNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB1MzJfdCBzZXR0aW5nKTsKK2V4dGVybiB2b2lkIHpmaVNldFJpZnMoemRldl90KiBkZXYsIHUxNl90IHNldHRpbmcpOworZXh0ZXJuIHZvaWQgemZpQ2hlY2tSaWZzKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVNldFJlb3JkZXIoemRldl90KiBkZXYsIHUxNl90IHZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVNldFNlcURlYnVnKHpkZXZfdCogZGV2LCB1MTZfdCB2YWx1ZSk7CisKK2V4dGVybiB1MTZfdCB6ZmlDb25maWdXZHNQb3J0KHpkZXZfdCogZGV2LCB1OF90IHdkc1BvcnRJZCwgdTE2X3QgZmxhZywgdTE2X3QqIHdkc0FkZHIsCisgICAgICAgIHUxNl90IGVuY1R5cGUsIHUzMl90KiB3ZHNLZXkpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUqIHBFbnRyeSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0U2NhblRpbWVyUGVyQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgdGltZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXV0b1JlY29ubmVjdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpOworZXh0ZXJuIHUzMl90IHpmaURlYnVnQ21kKHpkZXZfdCogZGV2LCB1MzJfdCBjbWQsIHUzMl90IHZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRQcm9iaW5nSGlkZGVuU3NpZCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCBzc2lkTGVuLAorICAgIHUxNl90IGVudHJ5KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREcm9wVW5lbmNyeXB0ZWRQYWNrZXRzKHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0SUJTU0pvaW5Pbmx5KHpkZXZfdCogZGV2LCB1OF90IGpvaW5Pbmx5KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREZWZhdWx0S2V5SWQoemRldl90KiBkZXYsIHU4X3Qga2V5SWQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldERpc2FibGVQcm9iaW5nV2l0aFNzaWQoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlHU04oemRldl90KiBkZXYsIHU4X3QgKmdzbiwgdTE2X3QgdmFwSWQpOworZXh0ZXJuIHUxNl90IHpmaVN0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0RG90MTFETW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXREb3QxMUhERlNNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblNldERvdDExSFRQQ01vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0QW5pTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTdGFXbWUoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlLCB1OF90IHVhcHNkSW5mbyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXBXbWUoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeXdtZUVuYWJsZSh6ZGV2X3QqIGRldik7CisjaWZkZWYgWk1fT1NfTElOVVhfRlVOQworZXh0ZXJuIHZvaWQgemZpV2xhblNob3dUYWxseSh6ZGV2X3QqIGRldik7CisjZW5kaWYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworLyogQ0VOQyAqLworZXh0ZXJuIHU4X3QgemZpV2xhblNldENlbmNQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlpZCwgdTMyX3QgKnR4aXYsIHUzMl90ICpyeGl2LAorICAgICAgICB1OF90ICprZXksIHU4X3QgKm1pYyk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0Q2VuY0dyb3VwS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleWlkLCB1MzJfdCAqcnhpdiwKKyAgICAgICAgdThfdCAqa2V5LCB1OF90ICptaWMpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeVNpZ25hbEluZm8oemRldl90KiBkZXYsIHU4X3QgKmJ1ZmZlcik7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlBZEhvY0NyZWF0ZWRCc3NEZXNjKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvICpwQnNzSW5mbyk7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlBZEhvY0lzQ3JlYXRvcih6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5U3VwcG9ydE1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVRyYW5zbWl0UG93ZXIoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkVuYWJsZUxlYXBDb25maWcoemRldl90KiBkZXYsIHU4X3QgbGVhcEVuYWJsZWQpOworCisvKiByZXR1cm5lZCBidWZmZXIgYWxsb2NhdGVkIGJ5IGRyaXZlciBjb3JlICovCitleHRlcm4gdm9pZCB6ZmlSZWN2RXRoQ29tcGxldGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKworZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKworZXh0ZXJuIHZvaWQgemZpV2xhblNldE1heFR4UG93ZXIoemRldl90KiBkZXYsIHU4X3QgcG93ZXIyLCB1OF90IHBvd2VyNSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlNYXhUeFBvd2VyKHpkZXZfdCogZGV2LCB1OF90ICpwb3dlcjIsIHU4X3QgKnBvd2VyNSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0Q29ubmVjdE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0U3VwcG9ydE1vZGUoemRldl90KiBkZXYsIHUzMl90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEFkaG9jTW9kZSh6ZGV2X3QqIGRldiwgdTMyX3QgbW9kZSk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5QWRob2NNb2RlKHpkZXZfdCogZGV2LCB1OF90IGJXcmFwcGVyKTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXRDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUsIHU4X3QgbGVuZ3RoKTsKK2V4dGVybiBjb25zdCBjaGFyKiB6ZmlXbGFuUXVlcnlDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlyZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUNDUyh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0Q0NTKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFJlZ3VsYXRvcnkoemRldl90KiBkZXYsIHU4X3QgQ0NTLCB1MTZfdCBDb2RlLCB1OF90IGJmaXJzdENoYW5uZWwpOworZXh0ZXJuIGNvbnN0IGNoYXIqIHpmaUhwR2V0aXNvTmFtZWZyb21yZWdpb25Db2RlKHpkZXZfdCogZGV2LCB1MTZfdCByZWdpb25Db2RlKTsKK2V4dGVybiB2b2lkICB6ZmlXbGFuU2V0TEVEQ3RybFBhcmFtKHpkZXZfdCogZGV2LCB1OF90IHR5cGUsIHU4X3QgZmxhZyk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UmVjZWl2ZWRQYWNrZXQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkNoZWNrU1dFbmNyeXB0aW9uKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlBbGxvd0NoYW5uZWxzKHpkZXZfdCAqZGV2LCB1MTZfdCAqY2hhbm5lbHMpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5HZXRNdWx0aWNhc3RBZGRyZXNzQ291bnQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkdldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3QqIHBNQ0xpc3QpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFBhY2tldEZpbHRlcih6ZGV2X3QqIGRldiwgdTMyX3QgUGFja2V0RmlsdGVyKTsKK2V4dGVybiB1OF90IHpmaUNvbXBhcmVXaXRoTXVsdGljYXN0TGlzdEFkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBkc3RNYWNBZGRyKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTYWZlTW9kZUVuYWJsZWQoemRldl90KiBkZXYsIHU4X3Qgc2FmZU1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldElCU1NBZGRpdGlvbmFsSUVMZW5ndGgoemRldl90KiBkZXYsIHUzMl90IGlic3NBZGRpdGlvbmFsSUVTaXplLCAgdThfdCogaWJzc0FkZGl0aW9uYWxJRSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0WExpbmtNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBzZXRWYWx1ZSk7CisKKy8qIGhwcncuYyAqLworZXh0ZXJuIHUzMl90IHpmaURiZ1dyaXRlRmxhc2goemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZpRGJnV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZpRGJnUmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkcik7CisKK2V4dGVybiB1MzJfdCB6ZmlEYmdXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tX3YyKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmLCB1MzJfdCB3cmxlbik7CisKK2V4dGVybiB1MTZfdCB6ZmlEYmdDaGlwRXJhc2VGbGFzaCh6ZGV2X3QgKmRldik7CitleHRlcm4gdTE2X3QgemZpRGJnUHJvZ3JhbUZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBvZmZzZXQsIHUzMl90IGxlbiwgdTMyX3QgKmRhdGEpOworZXh0ZXJuIHUzMl90IHpmaURiZ0dldEZsYXNoQ2hlY2tTdW0oemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IGxlbik7CitleHRlcm4gdTMyX3QgemZpRGJnUmVhZEZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCBsZW4pOworZXh0ZXJuIHUzMl90IHpmaURvd25sb2FkRndTZXQoemRldl90ICpkZXYpOworCitleHRlcm4gdTMyX3QgemZpRGJnRGVsYXlXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCitleHRlcm4gdTMyX3QgemZpRGJnU2V0SUZTeW50aGVzaXplcih6ZGV2X3QqIGRldiwgdTMyX3QgdmFsdWUpOworZXh0ZXJuIHUzMl90IHpmaURiZ1JlYWRUYWxseSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB1MzJfdCB6ZmlEYmdRdWVyeUh3VHhCdXN5KHpkZXZfdCogZGV2KTsKKworZXh0ZXJuIHU4X3QgemZpV2xhbkdldERlc3RBZGRyRnJvbUJ1Zih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90ICptYWNBZGRyKTsKKworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeUh3Q2FwYWJpbGl0eSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREeW5hbWljU0lGU1BhcmFtKHpkZXZfdCogZGV2LCB1OF90IHZhbCk7CisKKy8qKioqKiBFbmQgb2Ygc2VjdGlvbiAyICoqKioqLworCisvKioqKiogc2VjdGlvbiAzIHBlcmZvcm1hY2UgZXZhbHVhdGlvbiAqKioqKi8KKyNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgorZXh0ZXJuIHZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOworZXh0ZXJuIHZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmaVJ4UGVyZm9ybWFuY2VSZWcoemRldl90KiBkZXYsIHUzMl90IHJlZywgdTMyX3QgcnNwKTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfSU5JVChkZXYpICAgICAgICAgICAgICAgIHpmaVBlcmZvcm1hbmNlSW5pdChkZXYpOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9UWF9NU0RVKGRldiwgdGljaykgICAgICAgemZpVHhQZXJmb3JtYW5jZU1TRFUoZGV2LCB0aWNrKTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfTVNEVShkZXYsIHRpY2spICAgICAgIHpmaVJ4UGVyZm9ybWFuY2VNU0RVKGRldiwgdGljayk7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB0aWNrKSAgICAgICB6ZmlUeFBlcmZvcm1hbmNlTVBEVShkZXYsIHRpY2spOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9NUERVKGRldiwgYnVmKSAgICAgICAgemZpUnhQZXJmb3JtYW5jZU1QRFUoZGV2LCBidWYpOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9TRVEoZGV2LCBidWYpICAgICAgICAgemZpUnhQZXJmb3JtYW5jZVNlcShkZXYsIGJ1Zik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JFRyhkZXYsIHJlZywgcnNwKSAgICB7aWYoY21kWzFdID09IHJlZykgemZpUnhQZXJmb3JtYW5jZVJlZyhkZXYsIHJlZywgcnNwKTt9CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0RVUChkZXYsIGJ1ZjEsIGJ1ZjIpICAgICB6ZmlSeFBlcmZvcm1hbmNlRHVwKGRldiwgYnVmMSwgYnVmMik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0ZSRUUoZGV2LCBidWYpICAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlRnJlZShkZXYsIGJ1Zik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBsZW4pICB6ZmlSeFBlcmZvcm1hbmNlQU1TRFUoZGV2LCBidWYsIGxlbik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0ZMVVNIKGRldikgICAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlRmx1c2goZGV2KTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfQ0xFQVIoZGV2KSAgICAgICAgICAgIHpmaVJ4UGVyZm9ybWFuY2VDbGVhcihkZXYpOworI2RlZmluZSBaTV9TRVFfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zZXFfZGVidWcpIERiZ1ByaW50CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX1JFT1JERVIoZGV2KSAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlUmVvcmRlcihkZXYpOworI2Vsc2UKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfSU5JVChkZXYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1RYX01TRFUoZGV2LCB0aWNrKQorI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9NU0RVKGRldiwgdGljaykKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfVFhfTVBEVShkZXYsIHRpY2spCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX01QRFUoZGV2LCBidWYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIGJ1ZikKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUkVHKGRldiwgcmVnLCByc3ApCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0RVUChkZXYsIGJ1ZjEsIGJ1ZjIpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0ZSRUUoZGV2LCBidWYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBsZW4pCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0ZMVVNIKGRldikKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfQ0xFQVIoZGV2KQorI2RlZmluZSBaTV9TRVFfREVCVUcKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfUkVPUkRFUihkZXYpCisjZW5kaWYKKy8qKioqKiBFbmQgb2Ygc2VjdGlvbiAzICoqKioqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmdy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWEyMjcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfUFVCX1pGV19ICisjZGVmaW5lIF9QVUJfWkZXX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorCisKKy8qIEJ1ZmZlciBtYW5hZ2VtZW50ICovCisjaWZkZWYgWk1fRU5BQkxFX0JVRkZFUl9ERUJVRworZXh0ZXJuIHpidWZfdCogemZ3QnVmQWxsb2NhdGVXaXRoQ29udGV4dCh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuLCB1OF90ICpmdW5jdGlvbk5hbWUsIFVMT05HIGxpbmUpOworI2RlZmluZSB6ZndCdWZBbGxvY2F0ZShkZXYsIGxlbikgIHpmd0J1ZkFsbG9jYXRlV2l0aENvbnRleHQoZGV2LCBsZW4sICh1OF90ICopX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNlbHNlCitleHRlcm4gemJ1Zl90KiB6ZndCdWZBbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgemZ3QnVmRnJlZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IGVyckNvZGUpOworZXh0ZXJuIHUxNl90IHpmd0J1ZkNoYWluKHpkZXZfdCogZGV2LCB6YnVmX3QqKiBoZWFkLCB6YnVmX3QqIHRhaWwpOworZXh0ZXJuIHUxNl90IHpmd0J1ZkNvcHkoemRldl90KiBkZXYsIHpidWZfdCogZHN0LCB6YnVmX3QqIHNyYyk7CitleHRlcm4gdTE2X3QgemZ3QnVmU2V0U2l6ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpOworZXh0ZXJuIHUxNl90IHpmd0J1ZlJlbW92ZUhlYWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBzaXplKTsKK2V4dGVybiB1MTZfdCB6ZndCdWZHZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CitleHRlcm4gdm9pZCAgemZ3Q29weUJ1ZkNvbnRleHQoemRldl90KiBkZXYsIHpidWZfdCogc291cmNlLCB6YnVmX3QqIGRlc3QpOworCisvKiBNZW1vcnkgbWFuYWdlbWVudCAqLworZXh0ZXJuIHZvaWQqIHpmd01lbUFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MzJfdCBzaXplKTsKK2V4dGVybiB2b2lkIHpmd01lbUZyZWUoemRldl90KiBkZXYsIHZvaWQqIG1lbSwgdTMyX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCB6ZndNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpOworZXh0ZXJuIHZvaWQgemZ3TWVtb3J5TW92ZSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKTsKK2V4dGVybiB2b2lkIHpmd1plcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCk7CitleHRlcm4gdThfdCB6ZndNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKTsKKworLyogT3RoZXJzICovCitleHRlcm4gdm9pZCB6ZndTbGVlcCh6ZGV2X3QqIGRldiwgdTMyX3QgbXMpOworZXh0ZXJuIHUxNl90IHpmd0dldFZhcElkKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpOworZXh0ZXJuIHUzMl90IHpmd1dhaXRGb3JFdmVudCh6ZGV2X3QgKmRldiwgdTMyX3QgZXZlbnQsIHUzMl90IHRpbWVvdXQpOworZXh0ZXJuIHZvaWQgemZ3U2VuZEV2ZW50KHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmd0dldEFjdGl2ZVNjYW5EdXIoemRldl90KiBkZXYsIHU4X3QqIER1ciApOworZXh0ZXJuIHZvaWQgemZ3R2V0U2hvd1plcm9MZW5ndGhTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBEdXIgKTsKKy8qIEZvciBkZWJ1Z2dpbmcgKi8KK2V4dGVybiB2b2lkIHpmd0R1bXBCdWYoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmd0RiZ1JlYWRSZWdEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworLyogRm9yIEV2bCAqLworZXh0ZXJuIHZvaWQgemZ3RGJnRG93bmxvYWRGd0luaXREb25lKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmd0RiZ1JlYWRGbGFzaERvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiByc3BkYXRhLCB1MzJfdCBkYXRhbGVuKTsKK2V4dGVybiB2b2lkIHpmd0RiZ0dldEZsYXNoQ2hrU3VtRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcGRhdGEpOworZXh0ZXJuIHZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaERvbmUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaENoa0RvbmUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3RGJnV3JpdGVSZWdEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHZvaWQgemZ3RGJnV3JpdGVFZXByb21Eb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHZvaWQgemZ3RGJnUmVhZFRhbGx5RG9uZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZndXbGFuUmVhZFJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdm9pZCB6ZndXbGFuV3JpdGVSZWdEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHZvaWQgemZ3V2xhblJlYWRUYWxseURvbmUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoemRldl90KiBkZXYsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZ3UmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3Qgb2Zmc2V0KTsKK2V4dGVybiB1MzJfdCB6ZndSZWFkRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyKTsKKworLyogUmVzZXJ2ZWQgZm9yIFZpc3RhLCBwbGVhc2UgcmV0dXJuIDAgKi8KK2V4dGVybiB1OF90IHpmd0dldFBrdEVuY0V4ZW1wdGlvbkFjdGlvblR5cGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBSZXNlcnZlZCBmb3IgQ0VOQywgcGxlYXNlIHJldHVybiAwICovCitleHRlcm4gdThfdCB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3Bvbih6ZGV2X3QqIGRldiwgdThfdCAqcFdJRWMsCisgICAgICAgIHU4X3QgKnBQZWVyU1NJRGMsIHU4X3QgKnBQZWVyQWRkcmMpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKworI2lmZGVmIFpNX0hBTFBMVVNfTE9DSworZXh0ZXJuIGFzbWxpbmthZ2Ugc3RydWN0IHpzV2xhbkRldiAqemZ3R2V0V2xhbkRldih6ZGV2X3QqIGRldik7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHpmd0VudGVyQ3JpdGljYWxTZWN0aW9uKHpkZXZfdCogZGV2KTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgemZ3TGVhdmVDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpOworZXh0ZXJuIGFzbWxpbmthZ2UgdThfdCB6ZndCdWZSZWFkQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7CitleHRlcm4gYXNtbGlua2FnZSB1MTZfdCB6ZndCdWZSZWFkSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgdmFsdWUpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUhhbGZXb3JkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCB2YWx1ZSk7CitleHRlcm4gYXNtbGlua2FnZSB1OF90ICp6ZndHZXRCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyNlbmRpZgorCisjZW5kaWYgLy9fUFVCX1pGV19ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcXVldWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcXVldWUuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogcXVldWUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBxdWV1ZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAicXVldWUuaCIKKworCitzdHJ1Y3QgenNRdWV1ZSogemZRdWV1ZUNyZWF0ZSh6ZGV2X3QqIGRldiwgdTE2X3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgenNRdWV1ZSogcTsKKworICAgIGlmICgocSA9IChzdHJ1Y3QgenNRdWV1ZSopemZ3TWVtQWxsb2NhdGUoZGV2LCBzaXplb2Yoc3RydWN0IHpzUXVldWUpCisgICAgICAgICAgICArIChzaXplb2Yoc3RydWN0IHpzUXVldWVDZWxsKSooc2l6ZS0xKSkpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcS0+c2l6ZSA9IHNpemU7CisgICAgICAgIHEtPnNpemVNYXNrID0gc2l6ZS0xOworICAgICAgICBxLT5oZWFkID0gMDsKKyAgICAgICAgcS0+dGFpbCA9IDA7CisgICAgfQorICAgIHJldHVybiBxOworfQorCit2b2lkIHpmUXVldWVEZXN0cm95KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSkKK3sKKyAgICB1MTZfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCB6c1F1ZXVlKSArIChzaXplb2Yoc3RydWN0IHpzUXVldWVDZWxsKSoocS0+c2l6ZS0xKSk7CisKKyAgICB6ZlF1ZXVlRmx1c2goZGV2LCBxKTsKKyAgICB6ZndNZW1GcmVlKGRldiwgcSwgc2l6ZSk7CisKKyAgICByZXR1cm47Cit9CisKK3UxNl90IHpmUXVldWVQdXROY3MoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB6YnVmX3QqIGJ1ZiwgdTMyX3QgdGljaykKK3sKKyAgICB1MTZfdCByZXQgPSBaTV9FUlJfUVVFVUVfRlVMTDsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMSwgInpmUXVldWVQdXROY3MoKSIpOworCisgICAgaWYgKCgocS0+dGFpbCsxKSZxLT5zaXplTWFzaykgIT0gcS0+aGVhZCkKKyAgICB7CisgICAgICAgIHEtPmNlbGxbcS0+dGFpbF0uYnVmID0gYnVmOworICAgICAgICBxLT5jZWxsW3EtPnRhaWxdLnRpY2sgPSB0aWNrOworICAgICAgICBxLT50YWlsID0gKHEtPnRhaWwrMSkgJiBxLT5zaXplTWFzazsKKyAgICAgICAgcmV0ID0gWk1fU1VDQ0VTUzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit1MTZfdCB6ZlF1ZXVlUHV0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwgemJ1Zl90KiBidWYsIHUzMl90IHRpY2spCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0ID0gemZRdWV1ZVB1dE5jcyhkZXYsIHEsIGJ1ZiwgdGljayk7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHJldDsKK30KKworemJ1Zl90KiB6ZlF1ZXVlR2V0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSkKK3sKKyAgICB6YnVmX3QqIGJ1ZiA9IE5VTEw7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocS0+aGVhZCAhPSBxLT50YWlsKQorICAgIHsKKyAgICAgICAgYnVmID0gcS0+Y2VsbFtxLT5oZWFkXS5idWY7CisgICAgICAgIHEtPmhlYWQgPSAocS0+aGVhZCsxKSAmIHEtPnNpemVNYXNrOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gYnVmOworfQorCit1MTZfdCB6ZkNvbXBhcmVEc3R3aXRoQnVmKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCBpOworICAgIHU4X3QgZHN0WzZdOworCisgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgIHsKKyAgICAgICAgZHN0W2ldID0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIGlmIChkc3RbaV0gIT0gYWRkcltpXSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDEraTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3pidWZfdCogemZRdWV1ZUdldFdpdGhNYWMoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1OF90KiBhZGRyLCB1OF90KiBtYikKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB6YnVmX3QqIHJldEJ1ZiA9IE5VTEw7CisgICAgdTE2X3QgaW5kZXgsIG5leHQ7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgICptYiA9IDA7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaW5kZXggPSBxLT5oZWFkOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBpZiAoaW5kZXggIT0gcS0+dGFpbCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gcS0+Y2VsbFtpbmRleF0uYnVmOworCisgICAgICAgICAgICAvL2lmIGJ1ZidzIGRldGluYXRpb24gYWRkcmVzcyA9PSBpbnB1dCBhZGRyCisgICAgICAgICAgICBpZiAoemZDb21wYXJlRHN0d2l0aEJ1ZihkZXYsIGJ1ZiwgYWRkcikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXRCdWYgPSBidWY7CisgICAgICAgICAgICAgICAgLy9HZXQgaXQsIGFuZCB0cmFjZSB0aGUgd2hvbGUgcXVldWUgdG8gY2FsY3VsYXRlIG1vcmUgYml0CisgICAgICAgICAgICAgICAgd2hpbGUgKChuZXh0ID0oKGluZGV4KzEpJnEtPnNpemVNYXNrKSkgIT0gcS0+dGFpbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHEtPmNlbGxbaW5kZXhdLmJ1ZiA9IHEtPmNlbGxbbmV4dF0uYnVmOworICAgICAgICAgICAgICAgICAgICBxLT5jZWxsW2luZGV4XS50aWNrID0gcS0+Y2VsbFtuZXh0XS50aWNrOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoKm1iID09IDApICYmICh6ZkNvbXBhcmVEc3R3aXRoQnVmKGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5jZWxsW25leHRdLmJ1ZiwgYWRkcikgPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICptYiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHEtPnRhaWwgPSAocS0+dGFpbC0xKSAmIHEtPnNpemVNYXNrOworCisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0QnVmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSAoaW5kZXggKyAxKSAmIHEtPnNpemVNYXNrOworICAgICAgICB9IC8vaWYgKGluZGV4ICE9IHEtPnRhaWwpCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHJldEJ1ZjsKKworfQorCit2b2lkIHpmUXVldWVGbHVzaCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpCit7CisgICAgemJ1Zl90KiBidWY7CisKKyAgICB3aGlsZSAoKGJ1ZiA9IHpmUXVldWVHZXQoZGV2LCBxKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlF1ZXVlQWdlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwgdTMyX3QgdGljaywgdTMyX3QgbXNBZ2UpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgdTMyX3QgICBidWZ0aWNrOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgaWYgKHEtPmhlYWQgIT0gcS0+dGFpbCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmdGljayA9IHEtPmNlbGxbcS0+aGVhZF0udGljazsKKyAgICAgICAgICAgIGlmICgoKHRpY2sgLSBidWZ0aWNrKSpaTV9NU19QRVJfVElDSykgPiBtc0FnZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWYgPSBxLT5jZWxsW3EtPmhlYWRdLmJ1ZjsKKyAgICAgICAgICAgICAgICBxLT5oZWFkID0gKHEtPmhlYWQrMSkgJiBxLT5zaXplTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBZ2UgZnJhbWUgaW4gcXVldWUhIik7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworCit1OF90IHpmUXVldWVSZW1vdmV3aXRoSW5kZXgoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1MTZfdCBpbmRleCwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCBuZXh0OworICAgIHU4X3QgbWIgPSAwOworCisgICAgLy90cmFjZSB0aGUgd2hvbGUgcXVldWUgdG8gY2FsY3VsYXRlIG1vcmUgYml0CisgICAgd2hpbGUgKChuZXh0ID0oKGluZGV4KzEpJnEtPnNpemVNYXNrKSkgIT0gcS0+dGFpbCkKKyAgICB7CisgICAgICAgIHEtPmNlbGxbaW5kZXhdLmJ1ZiA9IHEtPmNlbGxbbmV4dF0uYnVmOworICAgICAgICBxLT5jZWxsW2luZGV4XS50aWNrID0gcS0+Y2VsbFtuZXh0XS50aWNrOworCisgICAgICAgIGlmICgobWIgPT0gMCkgJiYgKHpmQ29tcGFyZURzdHdpdGhCdWYoZGV2LAorICAgICAgICAgICAgICAgIHEtPmNlbGxbbmV4dF0uYnVmLCBhZGRyKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWIgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSBuZXh0OworICAgIH0KKyAgICBxLT50YWlsID0gKHEtPnRhaWwtMSkgJiBxLT5zaXplTWFzazsKKworICAgIHJldHVybiBtYjsKKworfQorCit2b2lkIHpmUXVldWVHZW5lcmF0ZVVhcHNkVGltKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwKKyAgICAgICAgdThfdCogdW5pQml0TWFwLCB1MTZfdCogaGlnaGVzdEJ5dGUpCit7CisgICAgemJ1Zl90KiBwc0J1ZjsKKyAgICB1OF90IGRzdFs2XTsKKyAgICB1MTZfdCBpZCwgYWlkLCBpbmRleCwgaTsKKyAgICB1MTZfdCBiaXRQb3NpdGlvbjsKKyAgICB1MTZfdCBieXRlUG9zaXRpb247CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaW5kZXggPSBxLT5oZWFkOworCisgICAgd2hpbGUgKGluZGV4ICE9IHEtPnRhaWwpCisgICAgeworICAgICAgICBwc0J1ZiA9IHEtPmNlbGxbaW5kZXhdLmJ1ZjsKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbaV0gPSB6bXdfYnVmX3JlYWRiKGRldiwgcHNCdWYsIGkpOworICAgICAgICB9CisgICAgICAgIC8qIFRPRE8gOiB1c2UgdThfdCogZm90IE1BQyBhZGRyZXNzICovCisgICAgICAgIGlmICgoKGlkID0gemZBcEZpbmRTdGEoZGV2LCAodTE2X3QqKWRzdCkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAmJiAod2QtPmFwLnN0YVRhYmxlW2lkXS5wc01vZGUgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBQVkIgb25seSB3aGVuIGFsbCBBQyBhcmUgZGVsaXZlcnktZW5hYmxlZCAqLworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc0luZm8gJiAweGYpID09IDB4ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWQgPSBpZCArIDE7CisgICAgICAgICAgICAgICAgYml0UG9zaXRpb24gPSAoMSA8PCAoYWlkICYgMHg3KSk7CisgICAgICAgICAgICAgICAgYnl0ZVBvc2l0aW9uID0gKGFpZCA+PiAzKTsKKyAgICAgICAgICAgICAgICB1bmlCaXRNYXBbYnl0ZVBvc2l0aW9uXSB8PSBiaXRQb3NpdGlvbjsKKworICAgICAgICAgICAgICAgIGlmIChieXRlUG9zaXRpb24+KmhpZ2hlc3RCeXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKmhpZ2hlc3RCeXRlID0gYnl0ZVBvc2l0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ID0gKGluZGV4KzEpICYgcS0+c2l6ZU1hc2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGcmVlIGdhcmJhZ2UgVUFQU0QgZnJhbWUgKi8KKyAgICAgICAgICAgIHpmUXVldWVSZW1vdmV3aXRoSW5kZXgoZGV2LCBxLCBpbmRleCwgZHN0KTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyNmI4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9RVUVVRV9ICisjZGVmaW5lIF9RVUVVRV9ICisKKyNpbmNsdWRlICIuLi9vYWxfZHQuaCIKKworc3RydWN0IHpzUXVldWVDZWxsCit7CisgICAgdTMyX3QgICB0aWNrOworICAgIHpidWZfdCogYnVmOworfTsKKworc3RydWN0IHpzUXVldWUKK3sKKyAgICB1MTZfdCAgIHNpemU7CisgICAgdTE2X3QgICBzaXplTWFzazsKKyAgICB1MTZfdCAgIGhlYWQ7CisgICAgdTE2X3QgICB0YWlsOworICAgIHN0cnVjdCB6c1F1ZXVlQ2VsbCBjZWxsWzFdOworfTsKKworI2VuZGlmIC8vI2lmbmRlZiBfUVVFVUVfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3JhdGVjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDMxMDRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3JhdGVjdHJsLmMKQEAgLTAsMCArMSw4NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJyYXRlY3RybC5oIgorCitjb25zdCB1MzJfdCB6Y1JhdGVUb1BoeUN0cmxbXSA9CisgICAgeworICAgICAgICAvKiAxTSwgICAgICAgIDJNLCAgICAgICAgIDVNLCAgICAgICAgMTFNICwgIDAgIDEgIDIgIDMqLworICAgICAgICAweDAwMDAwLCAgICAweDEwMDAwLCAgICAweDIwMDAwLCAgICAweDMwMDAwLAorICAgICAgICAvKiA2TSAgICAgICAgIDlNICAgICAgICAgIDEyTSAgICAgICAgMThNICwgIDQgIDUgIDYgIDcqLworICAgICAgICAweGIwMDAxLCAgICAweGYwMDAxLCAgICAweGEwMDAxLCAgICAweGUwMDAxLAorICAgICAgICAvKiAyNE0gICAgICAgICAzNk0gICAgICAgIDQ4TSAgICAgICAgNTRNICwgIDggIDkgIDEwIDExKi8KKyAgICAgICAgMHg5MDAwMSwgICAgMHhkMDAwMSwgICAgMHg4MDAwMSwgICAgMHhjMDAwMSwKKyAgICAgICAgLyogTUNTMCAgICAgIE1DUzEgICAgICAgIE1DUzIgICAgICAgIE1DUzMsICAxMiAxMyAxNCAxNSovCisgICAgICAgIDB4MDAwMDIsICAgIDB4MTAwMDIsICAgIDB4MjAwMDIsICAgIDB4MzAwMDIsCisgICAgICAgIC8qIE1DUzQgICAgICBNQ1M1ICAgICAgICBNQ1M2ICAgICAgICBNQ1M3LCAgMTYgMTcgMTggMTkqLworICAgICAgICAweDQwMDAyLCAgICAweDUwMDAyLCAgICAweDYwMDAyLCAgICAweDcwMDAyLAorICAgICAgICAvKiBNQ1M4ICAgICAgTUNTOSAgICAgICAgTUNTMTAgICAgICAgTUNTMTEsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMHg4MDAwMiwgICAgMHg5MDAwMiwgICAgMHhhMDAwMiwgICAgMHhiMDAwMiwKKyAgICAgICAgLyogTUNTMTIgICAgIE1DUzEzICAgICAgIE1DUzE0ICAgICAgIE1DUzE1LCAyNCAyNSAyNiAyNyovCisgICAgICAgIDB4YzAwMDIsICAgIDB4ZDAwMDIsICAgIDB4ZTAwMDIsICAgIDB4ZjAwMDIsCisgICAgICAgIC8qIE1DUzE0U0csICBNQ1MxNVNHICAgICBNQ1M3U0cgICAgICAgICAgICwgMjggMjksIDMwKi8KKyAgICAgICAgMHg4MDBlMDAwMiwgMHg4MDBmMDAwMiwgMHg4MDA3MDAwMgorICAgIH07CisKKworY29uc3QgdThfdCB6Y0h0UmF0ZVRhYmxlWzE1XVs0XSA9CisgICAgeyAvKls1RyAyME1Iel0gIFs1RyA0ME1Iel0gWzIuNEcgMjBNSHpdICBbMi40RyA0ME1Iel0qLworICAgICAgICB7ICA0LCAgICAgICAgICA0LCAgICAgICAgICAwLCAgICAgICAgICAwfSwgICAvKk9GRE02TSBPRkRNNk0gIENDSzFNICBDQ0sxTSAgKi8KKyAgICAgICAgeyAgNSwgICAgICAgICAgNSwgICAgICAgICAgMSwgICAgICAgICAgMX0sICAgLypPRkRNOU0gT0ZETTlNICBDQ0syTSAgQ0NLMk0gICovCisgICAgICAgIHsgIDEzLCAgICAgICAgIDEyLCAgICAgICAgIDIsICAgICAgICAgIDJ9LCAgIC8qTUNTMSAgIE1DUzAgICAgQ0NLNU0gIENDSzVNICAqLworICAgICAgICB7ICAxNCwgICAgICAgICAxMywgICAgICAgICAzLCAgICAgICAgICAzfSwgICAvKk1DUzIgICBNQ1MxICAgIENDSzExTSBDQ0sxMU0gKi8KKyAgICAgICAgeyAgMTUsICAgICAgICAgMTQsICAgICAgICAgMTMsICAgICAgICAgMTJ9LCAgLypNQ1MzICAgTUNTMiAgICBNQ1MxICAgTUNTMCAgICovCisgICAgICAgIHsgIDE2LCAgICAgICAgIDE1LCAgICAgICAgIDE0LCAgICAgICAgIDEzfSwgIC8qTUNTNCAgIE1DUzMgICAgTUNTMiAgIE1DUzEgICAqLworICAgICAgICB7ICAyMywgICAgICAgICAxNiwgICAgICAgICAxNSwgICAgICAgICAxNH0sICAvKk1DUzExICBNQ1M0ICAgIE1DUzMgICBNQ1MyICAgKi8KKyAgICAgICAgeyAgMjQsICAgICAgICAgMjMsICAgICAgICAgMTYsICAgICAgICAgMTV9LCAgLypNQ1MxMiAgTUNTMTEgICBNQ1M0ICAgTUNTMyAgICovCisgICAgICAgIHsgIDI1LCAgICAgICAgIDI0LCAgICAgICAgIDIzLCAgICAgICAgIDE2fSwgIC8qTUNTMTMgIE1DUzEyICAgTUNTMTEgIE1DUzQgICAqLworICAgICAgICB7ICAyNiwgICAgICAgICAyNSwgICAgICAgICAyNCwgICAgICAgICAyM30sICAvKk1DUzE0ICBNQ1MxMyAgIE1DUzEyICBNQ1MxMSAgKi8KKyAgICAgICAgeyAgMjcsICAgICAgICAgMjYsICAgICAgICAgMjUsICAgICAgICAgMjR9LCAgLypNQ1MxNSAgTUNTMTQgICBNQ1MxMyAgTUNTMTIgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDI3LCAgICAgICAgIDI2LCAgICAgICAgIDI1fSwgIC8qMCAgICAgIE1DUzE1ICAgTUNTMTQgIE1DUzEzICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAyOSwgICAgICAgICAyNywgICAgICAgICAyNn0sICAvKjAgICAgICBNQ1MxNVNHIE1DUzE1ICBNQ1MxNCAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMjh9LCAgLyowICAgICAgMCAgICAgICAwICAgICAgTUNTMTRTRyovCisgICAgICAgIHsgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDI5fSAgIC8qMCAgICAgIDAgICAgICAgMCAgICAgIE1DUzE1U0cqLworICAgIH07CisKK2NvbnN0IHU4X3QgemNIdE9uZVR4U3RyZWFtUmF0ZVRhYmxlWzE1XVs0XSA9CisgICAgeyAvKls1RyAyME1Iel0gIFs1RyA0ME1Iel0gWzIuNEcgMjBNSHpdICBbMi40RyA0ME1Iel0qLworICAgICAgICB7ICA0LCAgICAgICAgICA0LCAgICAgICAgICAwLCAgICAgICAgICAwfSwgICAvKk9GRE02TSBPRkRNNk0gIENDSzFNICBDQ0sxTSAgKi8KKyAgICAgICAgeyAgNSwgICAgICAgICAgNSwgICAgICAgICAgMSwgICAgICAgICAgMX0sICAgLypPRkRNOU0gT0ZETTlNICBDQ0syTSAgQ0NLMk0gICovCisgICAgICAgIHsgIDEzLCAgICAgICAgIDEyLCAgICAgICAgIDIsICAgICAgICAgIDJ9LCAgIC8qTUNTMSAgIE1DUzAgICAgQ0NLNU0gIENDSzVNICAqLworICAgICAgICB7ICAxNCwgICAgICAgICAxMywgICAgICAgICAzLCAgICAgICAgICAzfSwgICAvKk1DUzIgICBNQ1MxICAgIENDSzExTSBDQ0sxMU0gKi8KKyAgICAgICAgeyAgMTUsICAgICAgICAgMTQsICAgICAgICAgMTMsICAgICAgICAgMTJ9LCAgLypNQ1MzICAgTUNTMiAgICBNQ1MxICAgTUNTMCAgICovCisgICAgICAgIHsgIDE2LCAgICAgICAgIDE1LCAgICAgICAgIDE0LCAgICAgICAgIDEzfSwgIC8qTUNTNCAgIE1DUzMgICAgTUNTMiAgIE1DUzEgICAqLworICAgICAgICB7ICAxNywgICAgICAgICAxNiwgICAgICAgICAxNSwgICAgICAgICAxNH0sICAvKk1DUzUgICBNQ1M0ICAgIE1DUzMgICBNQ1MyICAgKi8KKyAgICAgICAgeyAgMTgsICAgICAgICAgMTcsICAgICAgICAgMTYsICAgICAgICAgMTV9LCAgLypNQ1M2ICAgTUNTNSAgICBNQ1M0ICAgTUNTMyAgICovCisgICAgICAgIHsgIDE5LCAgICAgICAgIDE4LCAgICAgICAgIDE3LCAgICAgICAgIDE2fSwgIC8qTUNTNyAgIE1DUzYgICAgTUNTNSAgIE1DUzQgICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAxOSwgICAgICAgICAxOCwgICAgICAgICAxN30sICAvKjAgICAgICBNQ1M3ICAgIE1DUzYgICBNQ1M1ICAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMzAsICAgICAgICAgMTksICAgICAgICAgMTh9LCAgLyowICAgICAgTUNTN1NHICBNQ1M3ICAgTUNTNiAgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDE5fSwgIC8qMCAgICAgIDAgICAgICAgMCAgICAgIE1DUzcgICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAzMH0sICAvKjAgICAgICAwICAgICAgIDAgICAgICBNQ1M3U0cgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCB9LCAgLyowICAgICAgMCAgICAgICAwICAgICAgMCAgICAgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAgfSAgIC8qMCAgICAgIDAgICAgICAgMCAgICAgIDAgICAgICAqLworICAgIH07CisKK2NvbnN0IHUxNl90IHpjUmF0ZVtdID0KKyAgICB7CisgICAgICAgIDEsIDIsIDUsIDExLCAgICAgICAgICAgICAgICAgIC8qIDFNLCAyTSwgNU0sIDExTSAgICAgICAgICAsICAwICAxICAyICAzKi8KKyAgICAgICAgNiwgOSwgMTIsIDE4LCAgICAgICAgICAgICAgICAgLyogNk0gIDlNICAxMk0gIDE4TSAgICAgICAgICwgIDQgIDUgIDYgIDcqLworICAgICAgICAyNCwgMzYsIDQ4LCA1NCwgICAgICAgICAgICAgICAvKiAyNE0gIDM2TSAgNDhNICA1NE0gICAgICAgLCAgOCAgOSAxMCAxMSovCisgICAgICAgIDEzLCAyNywgNDAsIDU0LCAgICAgICAgICAgICAgIC8qIE1DUzAgTUNTMSBNQ1MyIE1DUzMgICAgICAsIDEyIDEzIDE0IDE1Ki8KKyAgICAgICAgODEsIDEwOCwgMTIxLCAxMzUsICAgICAgICAgICAgLyogTUNTNCBNQ1M1IE1DUzYgTUNTNyAgICAgICwgMTYgMTcgMTggMTkqLworICAgICAgICAyNywgNTQsIDgxLCAxMDgsICAgICAgICAgICAgICAvKiBNQ1M4IE1DUzkgTUNTMTAgTUNTMTEgICAgLCAyMCAyMSAyMiAyMyovCisgICAgICAgIDE2MiwgMjE2LCAyNDMsIDI3MCwgICAgICAgICAgIC8qIE1DUzEyIE1DUzEzIE1DUzE0IE1DUzE1ICAsIDI0IDI1IDI2IDI3Ki8KKyAgICAgICAgMjcwLCAzMDAsIDE1MCAgICAgICAgICAgICAgICAgLyogTUNTMTRTRywgTUNTMTVTRywgTUNTN1NHICwgMjggMjkgMzAqLworICAgIH07CisKK2NvbnN0IHUxNl90IFBFUlRocmVzaG9sZFtdID0KKyAgICB7CisgICAgICAgIDEwMCwgNTAsIDUwLCA1MCwgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICA1MCwgNTAsIDMwLCAzMCwgICAgIC8qIDZNICA5TSAgMTJNICAxOE0gICAgICAgICAsICA0ICA1ICA2ICA3Ki8KKyAgICAgICAgMjUsIDI1LCAyNSwgMjAsICAgICAvKiAyNE0gIDM2TSAgNDhNICA1NE0gICAgICAgLCAgOCAgOSAxMCAxMSovCisgICAgICAgIDUwLCA1MCwgNTAsIDQwLCAgICAvKiBNQ1MwIE1DUzEgTUNTMiBNQ1MzICAgICAgLCAxMiAxMyAxNCAxNSovCisgICAgICAgIDMwLCAzMCwgMzAsIDMwLCAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDMwLCAzMCwgMjUsIDI1LCAgICAvKiBNQ1M4IE1DUzkgTUNTMTAgTUNTMTEgICAgLCAyMCAyMSAyMiAyMyovCisgICAgICAgIDI1LCAyNSwgMTUsIDE1LCAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAxNSwgMTUsIDEwICAgICAgICAgIC8qIE1DUzE0U0csIE1DUzE1U0cgICAgICAgICAsIDI4IDI5Ki8KKyAgICB9OworCitjb25zdCB1MTZfdCBGYWlsRGlmZltdID0KKyAgICB7CisgICAgICAgIDQwLCA0NiwgNDAsIDAsICAgICAgICAgIC8qIDFNLCAyTSwgNU0sIDExTSAgICAgICAgICAsICAwICAxICAyICAzKi8KKyAgICAgICAgMjQsIDE3LCAyMiwgMTYsICAgICAgICAgLyogNk0gIDlNICAxMk0gIDE4TSAgICAgICAgICwgIDQgIDUgIDYgIDcqLworICAgICAgICAxOSwgMTMsIDUsIDAsICAgICAgICAgICAvKiAyNE0gIDM2TSAgNDhNICA1NE0gICAgICAgLCAgOCAgOSAxMCAxMSovCisgICAgICAgIDM2LCAyMiwgMTUsIDE5LCAgICAgICAgIC8qIE1DUzAgTUNTMSBNQ1MyIE1DUzMgICAgICAsIDEyIDEzIDE0IDE1Ki8KKyAgICAgICAgMTIsIDUsIDQsIDcsICAgICAgICAgICAgLyogTUNTNCBNQ1M1IE1DUzYgTUNTNyAgICAgICwgMTYgMTcgMTggMTkqLworICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiBNQ1M4IE1DUzkgTUNTMTAgTUNTMTEgICAgLCAyMCAyMSAyMiAyMyovCisgICAgICAgIDksIDQsIDMsIDMsICAgICAgICAgICAgIC8qIE1DUzEyIE1DUzEzIE1DUzE0IE1DUzE1ICAsIDI0IDI1IDI2IDI3Ki8KKyAgICAgICAgMywgMCwgMCAgICAgICAgICAgICAgICAgLyogTUNTMTRTRywgTUNTMTVTRyAgICAgICAgICwgMjggMjkqLworICAgIH07CisKKworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAordTMyX3QgVHhNUERVWzI5XTsKK3UzMl90IEJBRmFpbFsyOV07Cit1MzJfdCBCQVBFUlsyOV07Citjb25zdCB1MTZfdCBCQURpZmZbXSA9CisgICAgeworICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAzNjEsIDIyMCwgMTUxLCAxODcsCisgICAgICAgIDEyMiwgNDgsIDQxLCA2NSwKKyAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgODgsIDMzLCAyNywgMjUsCisgICAgICAgIDAKKyAgICB9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwgICAgICAgICAgKi8KKy8qICAgICAgSW5pdGlhbGl6ZSByYXRlIGNvbnRyb2wgY2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiAwPT4xMWIsIDE9PjExYS9nLCAyPT4xMW4sIDM9PjExbiBvbmUgVHggc3RyZWFtICAgICAgICAgICAqLworLyogICAgICBnQmFuZCA6IDE9PjIuNEcsIDA9PjVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlJhdGVDdHJsSW5pdENlbGwoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1OF90IHR5cGUsCisgICAgICAgIHU4X3QgZ0JhbmQsIHU4X3QgU0c0MCkKK3sKKyAgICB1OF90IGk7CisgICAgdThfdCBtYXhyYXRlOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChTRzQwKSBTRzQwID0gMTsKKworICAgIGlmIChnQmFuZCAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gMSkgLy8xMWcKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKSAvLzFNIDJNIDVNIDExTQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9ICh1OF90KWk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9NDsgaTwxMDsgaSsrKSAvLzEyTSAxOE0gMjRNIDM2TSA0OE0gNTRNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gMitpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSAxMDsKKyAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDU7IC8vMThNCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAyKSAvLzExbmcKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAvL0FQIDExbmcgNDBNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRSYXRlVGFibGVbaV1bM107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCFTRzQwKSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbMTNdID0gMjc7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSAxNCtTRzQwOworICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvL1NUQQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9PSBaTV9CQU5EV0lEVEhfNDBNSFopIC8vMTFuZyA0ME0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDE1OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRSYXRlVGFibGVbaV1bM107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIVNHNDApIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFsxM10gPSAyNzsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSAxNCtTRzQwOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLzExbmcgMjBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxMzsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0UmF0ZVRhYmxlW2ldWzJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gMTM7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMykgLy8xMW5nIG9uZSBUeCBzdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9PSBaTV9CQU5EV0lEVEhfNDBNSFopIC8vMTFuZyA0ME0gb25lIFR4IHN0cmVhbQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoU0c0MCAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhyYXRlID0gMTM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhyYXRlID0gMTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bWF4cmF0ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbaV1bM107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSBpOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAoKGkrMSkqMykvNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLzExbmcgMjBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxMTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbaV1bMl07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSBpOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAoKGkrMSkqMykvNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvL2lmICh0eXBlID09IDApIC8vMTFiCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSAodThfdClpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSA0OworICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAodHlwZSA9PSAyKSAvLzExbmEKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAvL0FQIDExbmEgNDBNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8KDEyK1NHNDApOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0UmF0ZVRhYmxlW2ldWzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDEyK1NHNDA7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy9TVEEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKSAvLzExbmEgNDBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwoMTIrU0c0MCk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdFJhdGVUYWJsZVtpXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDEyK1NHNDA7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgICAgLy8xMW5hIDIwTQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdFJhdGVUYWJsZVtpXVswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDExOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDMpIC8vMTFuYSBvbmUgVHggc3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKSAvLzExbmEgNDBNIG9uZSBUeCBzdHJlYW0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKFNHNDAgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4cmF0ZSA9IDExOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4cmF0ZSA9IDEwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPG1heHJhdGU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdE9uZVR4U3RyZWFtUmF0ZVRhYmxlW2ldWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gKChpKzEpKjMpLzQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgICAgLy8xMW5nIDIwTQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8OTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbaV1bMF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSBpOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAoKGkrMSkqMykvNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvL2lmICh0eXBlID09IDEpIC8vMTFhCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykgLy82TSA5TSAxMk0gMThNIDI0TSAzNk0gNDhNIDU0TQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IGkrNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gODsKKyAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDQ7ICAvLzI0TQorICAgICAgICB9CisgICAgfQorCisgICAgcmNDZWxsLT5mbGFnID0gMDsKKyAgICByY0NlbGwtPnR4Q291bnQgPSAwOworICAgIHJjQ2VsbC0+ZmFpbENvdW50ID0gMDsKKyAgICByY0NlbGwtPmN1cnJlbnRSYXRlID0gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W3JjQ2VsbC0+Y3VycmVudFJhdGVJbmRleF07CisgICAgcmNDZWxsLT5sYXN0dHhDb3VudCA9IDA7CisgICAgcmNDZWxsLT5sYXN0VGltZSAgICA9IHdkLT50aWNrOworICAgIHJjQ2VsbC0+cHJvYmluZ1RpbWUgPSB3ZC0+dGljazsKKyAgICBmb3IgKGk9MDsgaTxaTV9SQVRFX1RBQkxFX1NJWkU7IGkrKykgeworICAgICAgICB3ZC0+UEVSW2ldID0gMDsKKyAgICAgICAgd2QtPnR4TVBEVVtpXSA9IHdkLT50eEZhaWxbaV0gPSAwOworICAgIH0KKyAgICB3ZC0+cHJvYmVDb3VudCA9IDA7CisgICAgd2QtPnByb2JlSW50ZXJ2YWwgPSAwOworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorICAgIGZvciAoaT0wOyBpPDI5OyBpKyspIHsKKyAgICAgICAgVHhNUERVW2ldPTA7CisgICAgICAgIEJBRmFpbFtpXT0wOworICAgICAgICBCQVBFUltpXT0wOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEdldEhpZ2hlclJhdGUgICAgICovCisvKiAgICAgIEdldCBhIGhpZ2hlciByYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmUmF0ZUN0cmxHZXRIaWdoZXJSYXRlKHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsKQoreworICAgIHU4X3QgcmF0ZUluZGV4OworCisgICAgcmF0ZUluZGV4ID0gcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4CisgICAgICAgICAgICArICgoKHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCsxKSA8IHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50KT8xOjApOworICAgIHJldHVybiByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbcmF0ZUluZGV4XTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybE5leHRMb3dlclJhdGUgICAgICovCisvKiAgICAgIEdldCBhIGxvd2VyIHJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmUmF0ZUN0cmxOZXh0TG93ZXJSYXRlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgaWYgKHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA+IDApCisgICAgeworICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXgtLTsKKyAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZSA9IHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtyY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXhdOworICAgIH0KKyAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJMb3dlciBUeCBSYXRlPSIsIHJjQ2VsbC0+Y3VycmVudFJhdGUpOworICAgIC8vRGJnUHJpbnQoIkxvd2VyIFR4IFJhdGU9JWQiLCByY0NlbGwtPmN1cnJlbnRSYXRlKTsKKyAgICByY0NlbGwtPmZhaWxDb3VudCA9IHJjQ2VsbC0+dHhDb3VudCA9IDA7CisgICAgcmNDZWxsLT5sYXN0dHhDb3VudCA9IDA7CisgICAgcmNDZWxsLT5sYXN0VGltZSAgPSB3ZC0+dGljazsKKyAgICByZXR1cm4gcmNDZWxsLT5jdXJyZW50UmF0ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybFJhdGVEaWZmICAgICAgICAgICovCisvKiAgICAgIFJhdGUgZGlmZmVyZW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICByZXRyeVJhdGUgOiByZXRyeSByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICByYXRlIGRpZmZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordThfdCB6ZlJhdGVDdHJsUmF0ZURpZmYoc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3QgcmV0cnlSYXRlKQoreworICAgIHUxNl90IGk7CisKKyAgICAvKiBGaW5kIHJldHJ5UmF0ZSBpbiBvcGVyYXRpb25SYXRlU2V0W10gKi8KKyAgICBmb3IgKGk9MDsgaTxyY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHJldHJ5UmF0ZSA9PSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpIDwgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoKHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCAtIGkpKzEpPj4xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaSA9PSByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBUT0RPIDogcmV0cnkgcmF0ZSBub3QgaW4gb3BlcmF0aW9uIHJhdGUgc2V0ICovCisgICAgem1fbXNnMV90eChaTV9MVl8wLCAiTm90IGluIG9wZXJhdGlvbiByYXRlIHNldDoiLCByZXRyeVJhdGUpOworICAgIHJldHVybiAxOworCit9CisKK3UzMl90IHpmUmF0ZUN0cmxVRFBUUCh6ZGV2X3QqIGRldiwgdTE2X3QgUmF0ZSwgdTMyX3QgUEVSKSB7CisgICAgaWYgKChQRVIgPCAxMDApICYmIChSYXRlID4gMCkgJiYgUEVSKQorICAgICAgICByZXR1cm4gMTE2ODAwMC8oKCgxMjMwNC9SYXRlKSsxOTcpKigxMDArMTAwKlBFUi8oMTAwLVBFUikpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit1OF90IHpmUmF0ZUN0cmxGaW5kTWF4VURQVFAoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsKSB7CisgICAgdThfdCBpLCBtYXhJbmRleD0wLCByYXRlSW5kZXg7CisgICAgdTMyX3QgbWF4PTAsIFVEUFRocm91Z2hwdXQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByYXRlSW5kZXggPSB6bV9hZ2dfbWluKHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCszLCByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudC0xKTsKKyAgICBmb3IgKGk9cmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4OyBpIDwgcmF0ZUluZGV4OyBpKyspIHsKKyAgICAgICAgVURQVGhyb3VnaHB1dCA9IHpmUmF0ZUN0cmxVRFBUUChkZXYsIHpjUmF0ZVtyY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV1dLAorICAgICAgICAgICAgd2QtPlBFUltyY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV1dKTsKKyAgICAgICAgaWYgKG1heCA8IFVEUFRocm91Z2hwdXQpIHsKKyAgICAgICAgICAgIG1heCA9IFVEUFRocm91Z2hwdXQ7CisgICAgICAgICAgICBtYXhJbmRleCA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W21heEluZGV4XTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsR2V0VHhSYXRlICAgICAgICAgKi8KKy8qICAgICAgR2V0IHRyYW5zbWlzc2lvbiByYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwcm9iaW5nIDogcmF0ZSBwcm9iaW5nIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUeCByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZSYXRlQ3RybEdldFR4UmF0ZSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHUxNl90KiBwcm9iaW5nKQoreworICAgIHU4X3QgbmV3UmF0ZSwgaGlnaFJhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fbXNnMV90eChaTV9MVl8zLCAidHhDb3VudD0iLCByY0NlbGwtPnR4Q291bnQpOworICAgIHptX21zZzFfdHgoWk1fTFZfMywgInByb2JpbmdUaW1lPSIsIHJjQ2VsbC0+cHJvYmluZ1RpbWUpOworICAgIHptX21zZzFfdHgoWk1fTFZfMywgInRpY2s9Iiwgd2QtPnRpY2spOworICAgICpwcm9iaW5nID0gMDsKKyAgICBuZXdSYXRlID0gcmNDZWxsLT5jdXJyZW50UmF0ZTsKKworICAgIGlmICh3ZC0+cHJvYmVDb3VudCAmJiAod2QtPnByb2JlQ291bnQgPCB3ZC0+c3VjY2Vzc19wcm9iaW5nKSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cHJvYmVJbnRlcnZhbCA8IDUwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cHJvYmVJbnRlcnZhbCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnByb2JlSW50ZXJ2YWwrKzsKKyAgICAgICAgICAgIGlmICh3ZC0+cHJvYmVJbnRlcnZhbCA+IDUyKSAvL3Byb2JlIDUxLCA1MiwgNTMgdGhyZWUgcGFja2V0cyBldmVyeSA1MCBwYWNrZXRzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnByb2JlSW50ZXJ2YWwgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3UmF0ZT16ZlJhdGVDdHJsR2V0SGlnaGVyUmF0ZShyY0NlbGwpOworICAgICAgICAgICAgKnByb2JpbmcgPSAxOworICAgICAgICAgICAgd2QtPnByb2JlQ291bnQrKzsKKyAgICAgICAgICAgIHJjQ2VsbC0+cHJvYmluZ1RpbWUgPSB3ZC0+dGljazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBBY2N1bXVsYXRlIGF0IGxlYXN0IDEwMDBtcyBhbmQgOCBwYWNrZXRzIG9yIEFjY3VtdWxhdGUgb3ZlciAxSyBwYWNrZXRzICovCisgICAgZWxzZSBpZiAoKCgod2QtPnRpY2sgLSByY0NlbGwtPnByb2JpbmdUaW1lKSA+IChaTV9SQVRFX0NUUkxfUFJPQklOR19JTlRFUlZBTF9NUy9aTV9NU19QRVJfVElDSykpCisgICAgICAgICAgICAgICAgJiYgKHJjQ2VsbC0+dHhDb3VudCA+PSBaTV9SQVRFX0NUUkxfTUlOX1BST0JJTkdfUEFDS0VUKSkKKyAgICAgICAgfHwgKHJjQ2VsbC0+dHhDb3VudCA+PSAxMDAwKSkKKyAgICB7CisjaWZuZGVmIFpNX0RJU0FCTEVfUkFURV9DVFJMCisgICAgICAgIC8qIFBFUiA9IGZhaWwvdG90YWwgKi8KKyAgICAgICAgd2QtPnByb2JlQ291bnQgPSAwOworICAgICAgICB3ZC0+cHJvYmVTdWNjZXNzQ291bnQgPSAwOworICAgICAgICBpZiAod2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSAhPSAwKSB7CisgICAgICAgICAgICB3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gem1fYWdnX21pbigxMDAsCisgICAgICAgICAgICAgICAgKHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0qMTAwKS93ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdKTsKKyAgICAgICAgICAgIGlmICghd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSkgd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSArKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIFBFUiA8IHRocmVzaG9sZCwgZG8gcmF0ZSBwcm9iaW5nLCByZXR1cm4gcHJvYmluZyByYXRlICovCisgICAgICAgIGlmICgod2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSA8PSAoWk1fUkFURV9QUk9CSU5HX1RIUkVTSE9MRCsxNSkpIHx8CisgICAgICAgICAgICAoKHJjQ2VsbC0+Y3VycmVudFJhdGUgPD0gMTYpICYmCisgICAgICAgICAgICAoKHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0vMikgPD0gWk1fUkFURV9QUk9CSU5HX1RIUkVTSE9MRCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG5ld1JhdGU9emZSYXRlQ3RybEdldEhpZ2hlclJhdGUocmNDZWxsKSkgIT0gcmNDZWxsLT5jdXJyZW50UmF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcHJvYmluZyA9IDE7CisgICAgICAgICAgICAgICAgd2QtPnByb2JlQ291bnQrKzsKKyAgICAgICAgICAgICAgICB3ZC0+cHJvYmVJbnRlcnZhbCA9IDA7CisgICAgICAgICAgICAgICAgd2QtPnN1Y2Nlc3NfcHJvYmluZyA9CisgICAgICAgICAgICAgICAgICAgIChyY0NlbGwtPmN1cnJlbnRSYXRlIDw9IDE2KT8gKFpNX1JBVEVfU1VDQ0VTU19QUk9CSU5HLzIpIDogWk1fUkFURV9TVUNDRVNTX1BST0JJTkc7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiU3RhcnQgUHJvYmluZyIpOworICAgICAgICAgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgIlByb2JpbmcgUmF0ZT0iLCBuZXdSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgem1fbXNnMF90eChaTV9MVl8xLCAiRGltaW5pc2ggY291bnRlciIpOworICAgICAgICByY0NlbGwtPmZhaWxDb3VudCA9IHJjQ2VsbC0+ZmFpbENvdW50Pj4xOworICAgICAgICByY0NlbGwtPnR4Q291bnQgPSByY0NlbGwtPnR4Q291bnQ+PjE7CisgICAgICAgIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisgICAgICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisKKworICAgICAgICBpZiAocmNDZWxsLT5jdXJyZW50UmF0ZSA+IDE1KSB7CisgICAgICAgICAgICBoaWdoUmF0ZSA9IHpmUmF0ZUN0cmxHZXRIaWdoZXJSYXRlKHJjQ2VsbCk7CisgICAgICAgICAgICBpZiAoKGhpZ2hSYXRlICE9IHJjQ2VsbC0+Y3VycmVudFJhdGUpICYmIHdkLT5QRVJbaGlnaFJhdGVdICYmCisgICAgICAgICAgICAgICAgKCh3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdICsgRmFpbERpZmZbcmNDZWxsLT5jdXJyZW50UmF0ZV0pID4KKyAgICAgICAgICAgICAgICB3ZC0+UEVSW2hpZ2hSYXRlXSkpIHsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJQRVIgY29tcGFyZSBmb3JjZSByYWlzZSByYXRlIHRvICVkIiwgaGlnaFJhdGUpOworICAgICAgICAgICAgICAgIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IHdkLT5wcm9iZUNvdW50ID0gWk1fUkFURV9TVUNDRVNTX1BST0JJTkc7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4U3VjY2Vzc0V2ZW50KGRldiwgcmNDZWxsLCBoaWdoUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBoaWdoUmF0ZSA9IHpmUmF0ZUN0cmxGaW5kTWF4VURQVFAoZGV2LCByY0NlbGwpOworICAgICAgICAgICAgaWYgKHJjQ2VsbC0+Y3VycmVudFJhdGUgPCBoaWdoUmF0ZSkgeworICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIlVEUCBUaHJvdWdocHV0IGNvbXBhcmUgZm9yY2UgcmFpc2UgcmF0ZSB0byAlZCIsIGhpZ2hSYXRlKTsKKyAgICAgICAgICAgICAgICB3ZC0+cHJvYmVTdWNjZXNzQ291bnQgPSB3ZC0+cHJvYmVDb3VudCA9IFpNX1JBVEVfU1VDQ0VTU19QUk9CSU5HOworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsIHJjQ2VsbCwgaGlnaFJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJjQ2VsbC0+cHJvYmluZ1RpbWUgPSB3ZC0+dGljazsKKyAgICB9CisKKyAgICBpZiggKHdkLT50aWNrID4gMTAwMCkKKyAgICAgICAgJiYgKCh3ZC0+dGljayAtIHJjQ2VsbC0+bGFzdFRpbWUpID4gMzg0MCkgKQorICAgIHsKKyAgICAgICAgaWYgKHJjQ2VsbC0+bGFzdHR4Q291bnQgPCA3MCkKKyAgICAgICAgeworICAgICAgICAgICAgcmNDZWxsLT5mYWlsQ291bnQgPSByY0NlbGwtPmZhaWxDb3VudD4+MTsKKyAgICAgICAgICAgIHJjQ2VsbC0+dHhDb3VudCA9IHJjQ2VsbC0+dHhDb3VudD4+MTsKKyAgICAgICAgICAgIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisgICAgICAgICAgICB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSA+PiAxOworCisgICAgICAgICAgICByY0NlbGwtPmZhaWxDb3VudCA9IChyY0NlbGwtPmZhaWxDb3VudCA8IHJjQ2VsbC0+dHhDb3VudCk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+ZmFpbENvdW50IDogcmNDZWxsLT50eENvdW50OworICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9ICh3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdIDwgd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA6IHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV07CisgICAgICAgIH0KKworICAgICAgICByY0NlbGwtPmxhc3RUaW1lICAgID0gd2QtPnRpY2s7CisgICAgICAgIHJjQ2VsbC0+bGFzdHR4Q291bnQgPSAwOworICAgIH0KKworICAgIHJjQ2VsbC0+dHhDb3VudCsrOworICAgIHJjQ2VsbC0+bGFzdHR4Q291bnQrKzsKKyAgICB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdKys7CisgICAgem1fbXNnMV90eChaTV9MVl8xLCAiR2V0IFR4IFJhdGU9IiwgbmV3UmF0ZSk7CisgICAgcmV0dXJuIG5ld1JhdGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeEZhaWxFdmVudCAgICAgICAqLworLyogICAgICBUeCBmYWlsIGV2ZW50LiBDYWxjdWxhdGUgUEVSIGFuZCBsb3dlciBUeCByYXRlIGlmIHVuZGVyICAgICAgICAgKi8KKy8qICAgICAgUEVSIHVuZGVyIHRocmVzaG9sZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHJ5UmF0ZSA6IHJldHJ5IHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUmF0ZUN0cmxUeEZhaWxFdmVudCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3QgYWdnUmF0ZSwgdTMyX3QgcmV0cnlSYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyNpZm5kZWYgWk1fRElTQUJMRV9SQVRFX0NUUkwKKyAgICAvL0RiZ1ByaW50KCJhZ2dSYXRlPSVkLCByZXRyeVJhdGU9JWQiLCBhZ2dSYXRlLCByZXRyeVJhdGUpOworICAgIGlmIChhZ2dSYXRlICYmIChhZ2dSYXRlICE9IHJjQ2VsbC0+Y3VycmVudFJhdGUpKSB7CisgICAgICAgIHdkLT50eEZhaWxbYWdnUmF0ZV0gKz0gcmV0cnlSYXRlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFhZ2dSYXRlKSB7CisgICAgICAgIHJldHJ5UmF0ZSA9ICh6ZlJhdGVDdHJsUmF0ZURpZmYocmNDZWxsLCAodThfdClyZXRyeVJhdGUpKzEpPj4xOworICAgICAgICBpZiAocmNDZWxsLT5jdXJyZW50UmF0ZSA8MTIpIC8vbGVnYWN5IHJhdGUKKyAgICAgICAgeworICAgICAgICAgICAgcmV0cnlSYXRlKj0yOworICAgICAgICB9CisgICAgfQorICAgIHJjQ2VsbC0+ZmFpbENvdW50ICs9IHJldHJ5UmF0ZTsKKyAgICB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdICs9IHJldHJ5UmF0ZTsKKworICAgIC8vRGJnUHJpbnQoImZhaWxDb3VudD0lZCIsIHJjQ2VsbC0+ZmFpbENvdW50KTsKKyAgICBpZiAocmNDZWxsLT5mYWlsQ291bnQgPiBaTV9NSU5fUkFURV9GQUlMX0NPVU5UKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gIT0gMCkgeworICAgICAgICAgICAgd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHptX2FnZ19taW4oMTAwLAorICAgICAgICAgICAgICAgICh3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdKjEwMCkvd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSk7CisgICAgICAgICAgICBpZiAoIXdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0pIHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0gKys7CisgICAgICAgIH0KKyAgICAgICAgLy96bV9tc2cxX3R4KFpNX0xWXzEsICJQRVI9IiwgcGVyKTsKKyAgICAgICAgLy9EYmdQcmludCgiUEVSPSVkLCB0eEZhaWw9JWQsIHR4TVBEVT0lZCIsIHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0sIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0sIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0pOworICAgICAgICBpZiAod2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSA+IFBFUlRocmVzaG9sZFtyY0NlbGwtPmN1cnJlbnRSYXRlXSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTG93ZXIgVHggUmF0ZSBpZiBQRVIgPCBUSFJFU0hPTEQgKi8KKyAgICAgICAgICAgIHpmUmF0ZUN0cmxOZXh0TG93ZXJSYXRlKGRldiwgcmNDZWxsKTsKKyAgICAgICAgICAgIHJjQ2VsbC0+ZmxhZyB8PSBaTV9SQ19UUkFJTkVEX0JJVDsKKworICAgICAgICAgICAgLy8gUmVzb2x2ZSBjb21wYXRpYmlsaXR5IHByb2JsZW0gd2l0aCBNYXJ2ZWxsCisgICAgICAgICAgICBpZihyY0NlbGwtPmN1cnJlbnRSYXRlID09IDE1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgemZIcFNldEFnZ1BrdE51bShkZXYsIDgpOworICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisgICAgICAgICAgICB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSA+PiAxOworCisgICAgICAgICAgICB3ZC0+cHJvYmVDb3VudCA9IHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyNlbmRpZgorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4U3VjY2Vzc0V2ZW50ICAgICovCisvKiAgICAgIFR4IHN1Y2Nlc3MgZXZlbnQuIFJhaXNlIFR4IHJhdGUgYmVjYXVzZSByYXRlIHByb2Jpbmcgc3VjY2Vzcy4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdWNjZXNzUmF0ZSA6IHN1Y2Nlc3MgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlJhdGVDdHJsVHhTdWNjZXNzRXZlbnQoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1OF90IHN1Y2Nlc3NSYXRlKQoreworICAgIC8qIFJhaXNlIFR4IFJhdGUgKi8KKyAgICB1MTZfdCBpLCBQRVJQcm9iZTsKKyAgICB1MTZfdCBwY291bnQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vRGJnUHJpbnQoIlByb2Jpbmcgc3VjY2Vzc1JhdGU9JWQiLCBzdWNjZXNzUmF0ZSk7CisgICAgLyogRmluZCBzdWNjZXNzUmF0ZSBpbiBvcGVyYXRpb25SYXRlU2V0W10gKi8KKyAgICB3ZC0+cHJvYmVTdWNjZXNzQ291bnQrKzsKKyAgICBpZiAod2QtPnByb2JlQ291bnQgPCB3ZC0+c3VjY2Vzc19wcm9iaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBjb3VudCA9IHdkLT5wcm9iZUNvdW50OworICAgIGlmIChwY291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIFBFUlByb2JlID0gd2QtPnByb2JlU3VjY2Vzc0NvdW50ICogMTAwIC8gcGNvdW50OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRVJQcm9iZSA9IDE7CisgICAgfQorCisgICAgaWYgKFBFUlByb2JlIDwgKChyY0NlbGwtPmN1cnJlbnRSYXRlIDwgMTYpPyA4MDoxMDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvL0RiZ1ByaW50KCJ3ZC0+cHJvYmVDb3VudD0lZCwgd2QtPnByb2JlU3VjY2Vzc0NvdW50PSVkIiwgd2QtPnByb2JlQ291bnQsIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCk7CisgICAgd2QtPnByb2JlQ291bnQgPSB3ZC0+cHJvYmVTdWNjZXNzQ291bnQgPSAwOworICAgIGZvciAoaT0wOyBpPHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50OyBpKyspCisgICAgeworICAgICAgICBpZiAoc3VjY2Vzc1JhdGUgPT0gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA+IHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSYWlzZSBjdXJyZW50IFR4IHJhdGUgKi8KKyAgICAgICAgICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJSYWlzZSBUeCBSYXRlPSIsIHN1Y2Nlc3NSYXRlKTsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJSYWlzZSBUeCBSYXRlPSVkIiwgc3VjY2Vzc1JhdGUpOworCisgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBjb21wYXRpYmlsaXR5IHByb2JsZW0gd2l0aCBNYXJ2ZWxsCisgICAgICAgICAgICAgICAgaWYoKHJjQ2VsbC0+Y3VycmVudFJhdGUgPD0gMTUpICYmIChzdWNjZXNzUmF0ZSA+IDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRBZ2dQa3ROdW0oZGV2LCAxNik7CisgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZSA9IHN1Y2Nlc3NSYXRlOworICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9ICh1OF90KWk7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5mYWlsQ291bnQgPSByY0NlbGwtPnR4Q291bnQgPSAwOworICAgICAgICAgICAgICAgIHJjQ2VsbC0+bGFzdHR4Q291bnQgPSAwOworICAgICAgICAgICAgICAgIHJjQ2VsbC0+bGFzdFRpbWUgID0gd2QtPnRpY2s7CisgICAgICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKyAgICAgICAgICAgICAgICB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsUnhSc3NpRXZlbnQgICAgICAgKi8KKy8qICAgICAgUnggUlNTSSBldmVudC4gQ2FsY3VsYXRlIFJTU0kgbW92aW5nIGF2ZXJhZ2UsIGFjY2VsYXJhdGUgICAgICAgICovCisvKiAgICAgIHJhdGUgcHJvYmluZyBpZiBSU1NJIHZhcmlhdGlvbiBvdmVyIHRocmVzaG9sZC4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdWNjZXNzUmF0ZSA6IHN1Y2Nlc3MgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlJhdGVDdHJsUnhSc3NpRXZlbnQoc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHUxNl90IHJ4UnNzaSkKK3sKKyAgICAvKiBpZiBkZWx0YShyY0NlbGwtPnJ4UnNzaSwgcnhSc3NpKSA+IFpNX1JBVEVfQ1RSTF9SU1NJX1ZBUklBVElPTiAqLworICAgIGlmICgocmNDZWxsLT5yeFJzc2kgLSByeFJzc2kpID4gWk1fUkFURV9DVFJMX1JTU0lfVkFSSUFUSU9OKQorICAgIHsKKyAgICAgICAgLyogQWNjZWxlcmF0ZSByYXRlIHByb2JpbmcgdmlhIGRlY3JlYWluZyByY0NlbGwtPnByb2JpbmdUaW1lICovCisgICAgICAgIHJjQ2VsbC0+cHJvYmluZ1RpbWUgLT0gWk1fUkFURV9DVFJMX1BST0JJTkdfSU5URVJWQUxfTVMvWk1fTVNfUEVSX1RJQ0s7CisgICAgfQorCisgICAgLyogVXBkYXRlIFJTU0kgbW92aW5nIGF2ZXJhZ2UgKi8KKyAgICByY0NlbGwtPnJ4UnNzaSA9ICgoKHJjQ2VsbC0+cnhSc3NpKjcpICsgcnhSc3NpKSs0KSA+PiAzOworICAgIHJldHVybjsKK30KKworCisjaWZkZWYgWk1fRU5BQkxFX0JBX1JBVEVDVFJMCit1OF90IEhpZ2hlclJhdGUodThfdCBSYXRlKSB7CisgICAgaWYgKFJhdGUgPCAyOCkgUmF0ZSsrOyAvLzI4PU1DUzE1U0csIDI3PU1DUzE1LCAyNj1NQ1MxNCwgMjU9TUNTMTMKKyAgICBpZiAoUmF0ZSA+IDI4KSBSYXRlID0gMjg7CisgICAgd2hpbGUgKChSYXRlID49IDIwKSAmJiAoUmF0ZSA8PSAyMykpIHsKKyAgICAgICAgUmF0ZSArKzsKKyAgICB9CisgICAgcmV0dXJuIFJhdGU7Cit9CisKK3U4X3QgTG93ZXJSYXRlKHU4X3QgUmF0ZSkgeworICAgIGlmIChSYXRlID4gMSkgUmF0ZS0tOworICAgIHdoaWxlICgoUmF0ZSA+PSAyMCkgJiYgKFJhdGUgPD0gMjMpKSB7CisgICAgICAgIFJhdGUgLS07CisgICAgfQorICAgIHJldHVybiBSYXRlOworfQorCit1OF90IFJhdGVNYXBUb1JhdGVJbmRleCh1OF90IFJhdGUsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsKSB7CisgICAgdThfdCBpOworICAgIGZvciAoaT0wOyBpPHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKFJhdGUgPT0gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZlJhdGVDdHJsQWdnclN0YSh6ZGV2X3QqIGRldikgeworICAgIHU4X3QgUmF0ZUluZGV4LCBSYXRlOworICAgIHU4X3QgSFJhdGU7CisgICAgdThfdCBMUmF0ZTsKKyAgICB1MzJfdCBSYXRlQ3RybFR4TVBEVSwgUmF0ZUN0cmxCQUZhaWw7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgUmF0ZUluZGV4ID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLmN1cnJlbnRSYXRlSW5kZXg7CisgICAgUmF0ZSA9IHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5vcGVyYXRpb25SYXRlU2V0W1JhdGVJbmRleF07CisKKyAgICBUeE1QRFVbUmF0ZV0gPSAoVHhNUERVW1JhdGVdIC8gNSkgKyAod2QtPmNvbW1UYWxseS5SYXRlQ3RybFR4TVBEVSAqIDQgLyA1KTsKKyAgICBCQUZhaWxbUmF0ZV0gPSAoQkFGYWlsW1JhdGVdIC8gNSkgKyAod2QtPmNvbW1UYWxseS5SYXRlQ3RybEJBRmFpbCAqIDQgLyA1KTsKKyAgICBSYXRlQ3RybFR4TVBEVSA9IHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxUeE1QRFU7CisgICAgUmF0ZUN0cmxCQUZhaWwgPSB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsQkFGYWlsOworICAgIHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxUeE1QRFUgPSAwOworICAgIHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxCQUZhaWwgPSAwOworICAgIGlmIChUeE1QRFVbUmF0ZV0gPiAwKSB7CisgICAgICAgIEJBUEVSW1JhdGVdID0gQkFGYWlsW1JhdGVdICogMTAwMCAvIFR4TVBEVVtSYXRlXTsgLy9QRVIqMTAwMAorICAgICAgICBCQVBFUltSYXRlXSA9IChCQVBFUltSYXRlXT4wKT8gQkFQRVJbUmF0ZV06MTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBIUmF0ZSA9IEhpZ2hlclJhdGUoUmF0ZSk7CisgICAgTFJhdGUgPSBMb3dlclJhdGUoUmF0ZSk7CisgICAgaWYgKEJBUEVSW1JhdGVdPjIwMCkgeworICAgICAgICBpZiAoKFJhdGVDdHJsVHhNUERVID4gMTAwKSAmJiAoQkFQRVJbUmF0ZV08MzAwKSAmJiAoSFJhdGUgIT0gUmF0ZSkgJiYgQkFQRVJbSFJhdGVdICYmCisgICAgICAgICAgICAoQkFQRVJbSFJhdGVdIDwgQkFQRVJbUmF0ZV0gKyBCQURpZmZbUmF0ZV0pKSB7CisgICAgICAgICAgICBSYXRlID0gSFJhdGU7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCJSYXRlIGltcHJvdmVkIHRvICVkIiwgUmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBSYXRlID0gTFJhdGU7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCJSYXRlIGRlY3JlYXNlZCB0byAlZCIsIFJhdGUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKEJBUEVSW1JhdGVdICYmIEJBUEVSW1JhdGVdPDEwMCkgeworICAgICAgICBpZiAoUmF0ZUN0cmxUeE1QRFUgPiAxMDApIHsKKyAgICAgICAgICAgIFJhdGUgPSBIUmF0ZTsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJhdGUgaW1wcm92ZWQgdG8gJWQiLCBSYXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwuY3VycmVudFJhdGUgPSBSYXRlOworICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5jdXJyZW50UmF0ZUluZGV4ID0gUmF0ZU1hcFRvUmF0ZUluZGV4KFJhdGUsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9yYXRlY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDExZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfUkFURUNUUkxfSAorI2RlZmluZSBfUkFURUNUUkxfSAorCisjZGVmaW5lIFpNX1JBVEVfQ1RSTF9QUk9CSU5HX0lOVEVSVkFMX01TICAgIDEwMDAgLy8xMDAwbXMKKyNkZWZpbmUgWk1fUkFURV9DVFJMX01JTl9QUk9CSU5HX1BBQ0tFVCAgICAgOAorCisjZGVmaW5lIFpNX01JTl9SQVRFX0ZBSUxfQ09VTlQgICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgWk1fUkFURV9QUk9CSU5HX1RIUkVTSE9MRCAgICAgICAgICAgMTUgIC8vNiUKKyNkZWZpbmUgWk1fUkFURV9TVUNDRVNTX1BST0JJTkcgICAgICAgICAgICAgMTAKKworI2RlZmluZSBaTV9SQVRFX0NUUkxfUlNTSV9WQVJJQVRJT04gICAgICAgICA1ICAvL1RCRAorCitleHRlcm4gY29uc3QgdTMyX3QgemNSYXRlVG9QaHlDdHJsW107CisKK2V4dGVybiB2b2lkIHpmUmF0ZUN0cmxJbml0Q2VsbCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3QgdHlwZSwgdThfdCBnQmFuZCwgdThfdCBTRzQwKTsKK2V4dGVybiB1MTZfdCB6ZlJhdGVDdHJsR2V0VHhSYXRlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdTE2X3QqIHByb2JpbmcpOworZXh0ZXJuIHZvaWQgemZSYXRlQ3RybFR4RmFpbEV2ZW50KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCBhZ2dSYXRlLCB1MzJfdCByZXRyeVJhdGUpOworZXh0ZXJuIHZvaWQgemZSYXRlQ3RybFR4U3VjY2Vzc0V2ZW50KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCBzdWNjZXNzUmF0ZSk7CitleHRlcm4gdm9pZCB6ZlJhdGVDdHJsQWdnclN0YSh6ZGV2X3QqIGRldik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9zdHJ1Y3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzYzMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3N0cnVjdC5oCkBAIC0wLDAgKzEsMTMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1NUUlVDVF9ICisjZGVmaW5lIF9TVFJVQ1RfSAorCisjaW5jbHVkZSAiLi4vb2FsX21hcmMuaCIKKworI2RlZmluZSBaTV9TV19MT09QX0JBQ0sgICAgICAgICAgICAgICAgICAgICAwIC8qIDE9PmVuYWJsZSwgMD0+ZGlzYWJsZSAqLworI2RlZmluZSBaTV9QQ0lfTE9PUF9CQUNLICAgICAgICAgICAgICAgICAgICAwIC8qIDE9PmVuYWJsZSwgMD0+ZGlzYWJsZSAqLworI2RlZmluZSBaTV9QUk9UT0NPTF9SRVNQT05TRV9TSU1VTEFUSU9OICAgICAwCisKKyNkZWZpbmUgWk1fUlhfRlJBTUVfU0laRSAgICAgICAgICAgICAgIDE2MDAKKworZXh0ZXJuIGNvbnN0IHU4X3QgemcxMWJSYXRlVGJsWzRdOworZXh0ZXJuIGNvbnN0IHU4X3QgemcxMWdSYXRlVGJsWzhdOworCisjZGVmaW5lIFpNX0RSSVZFUl9DT1JFX01BSk9SX1ZFUlNJT04gICAgICAgIDEKKyNkZWZpbmUgWk1fRFJJVkVSX0NPUkVfTUlOT1JfVkVSU0lPTiAgICAgICAgMQorI2RlZmluZSBaTV9EUklWRVJfQ09SRV9CUkFOQ0hfTUFKT1JfVkVSU0lPTiAzCisjZGVmaW5lIFpNX0RSSVZFUl9DT1JFX0JSQU5DSF9NSU5PUl9WRVJTSU9OIDM5CisKKyNpZm5kZWYgWk1fVlRYUV9TSVpFCisjZGVmaW5lIFpNX1ZUWFFfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgLy8yXk4KKyNlbmRpZgorCisjZGVmaW5lIFpNX1ZUWFFfU0laRV9NQVNLICAgICAgICAgICAgICAgICAgIChaTV9WVFhRX1NJWkUtMSkKKyNkZWZpbmUgWk1fVk1NUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOCAvLzJeTgorI2RlZmluZSBaTV9WTU1RX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAgICAoWk1fVk1NUV9TSVpFLTEpCisKKyNpbmNsdWRlICJjYWdnLmgiCisKKyNkZWZpbmUgWk1fQUdHX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWk1fUkFURV9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBaTV9NQVhfQlVGX0RJU0NSRVRFX05VTUJFUiAgICAgICAgICA1CisKKworCisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElCU1MgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSICAgICA0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQklUIG1hcHBpbmcgcmVsYXRlZCBtYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBaTV9CSVRfMCAgICAgICAweDEKKyNkZWZpbmUgWk1fQklUXzEgICAgICAgMHgyCisjZGVmaW5lIFpNX0JJVF8yICAgICAgIDB4NAorI2RlZmluZSBaTV9CSVRfMyAgICAgICAweDgKKyNkZWZpbmUgWk1fQklUXzQgICAgICAgMHgxMAorI2RlZmluZSBaTV9CSVRfNSAgICAgICAweDIwCisjZGVmaW5lIFpNX0JJVF82ICAgICAgIDB4NDAKKyNkZWZpbmUgWk1fQklUXzcgICAgICAgMHg4MAorI2RlZmluZSBaTV9CSVRfOCAgICAgICAweDEwMAorI2RlZmluZSBaTV9CSVRfOSAgICAgICAweDIwMAorI2RlZmluZSBaTV9CSVRfMTAgICAgICAweDQwMAorI2RlZmluZSBaTV9CSVRfMTEgICAgICAweDgwMAorI2RlZmluZSBaTV9CSVRfMTIgICAgICAweDEwMDAKKyNkZWZpbmUgWk1fQklUXzEzICAgICAgMHgyMDAwCisjZGVmaW5lIFpNX0JJVF8xNCAgICAgIDB4NDAwMAorI2RlZmluZSBaTV9CSVRfMTUgICAgICAweDgwMDAKKyNkZWZpbmUgWk1fQklUXzE2ICAgICAgMHgxMDAwMAorI2RlZmluZSBaTV9CSVRfMTcgICAgICAweDIwMDAwCisjZGVmaW5lIFpNX0JJVF8xOCAgICAgIDB4NDAwMDAKKyNkZWZpbmUgWk1fQklUXzE5ICAgICAgMHg4MDAwMAorI2RlZmluZSBaTV9CSVRfMjAgICAgICAweDEwMDAwMAorI2RlZmluZSBaTV9CSVRfMjEgICAgICAweDIwMDAwMAorI2RlZmluZSBaTV9CSVRfMjIgICAgICAweDQwMDAwMAorI2RlZmluZSBaTV9CSVRfMjMgICAgICAweDgwMDAwMAorI2RlZmluZSBaTV9CSVRfMjQgICAgICAweDEwMDAwMDAKKyNkZWZpbmUgWk1fQklUXzI1ICAgICAgMHgyMDAwMDAwCisjZGVmaW5lIFpNX0JJVF8yNiAgICAgIDB4NDAwMDAwMAorI2RlZmluZSBaTV9CSVRfMjcgICAgICAweDgwMDAwMDAKKyNkZWZpbmUgWk1fQklUXzI4ICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBaTV9CSVRfMjkgICAgICAweDIwMDAwMDAwICAgLy9XUEEgc3VwcG9ydAorI2RlZmluZSBaTV9CSVRfMzAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFpNX0JJVF8zMSAgICAgIDB4ODAwMDAwMDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1BQyBhZGRyZXNzIHJlbGF0ZWQgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFpNX01BQ19CWVRFX1RPX1dPUkQobWFjYiwgbWFjdykgICBtYWN3WzBdID0gbWFjYlswXSArIChtYWNiWzFdIDw8IDgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWN3WzFdID0gbWFjYlsyXSArIChtYWNiWzNdIDw8IDgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWN3WzJdID0gbWFjYls0XSArIChtYWNiWzVdIDw8IDgpOworCisjZGVmaW5lIFpNX01BQ19XT1JEX1RPX0JZVEUobWFjdywgbWFjYikgICBtYWNiWzBdID0gKHU4X3QpIChtYWN3WzBdICYgMHhmZik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2JbMV0gPSAodThfdCkgKG1hY3dbMF0gPj4gOCk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjYlsyXSA9ICh1OF90KSAobWFjd1sxXSAmIDB4ZmYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNiWzNdID0gKHU4X3QpIChtYWN3WzFdID4+IDgpOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2JbNF0gPSAodThfdCkgKG1hY3dbMl0gJiAweGZmKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjYls1XSA9ICh1OF90KSAobWFjd1syXSA+PiA4KTsKKworI2RlZmluZSBaTV9NQUNfMChtYWN3KSAgICgodThfdCkobWFjd1swXSAmIDB4ZmYpKQorI2RlZmluZSBaTV9NQUNfMShtYWN3KSAgICgodThfdCkobWFjd1swXSA+PiA4KSkKKyNkZWZpbmUgWk1fTUFDXzIobWFjdykgICAoKHU4X3QpKG1hY3dbMV0gJiAweGZmKSkKKyNkZWZpbmUgWk1fTUFDXzMobWFjdykgICAoKHU4X3QpKG1hY3dbMV0gPj4gOCkpCisjZGVmaW5lIFpNX01BQ180KG1hY3cpICAgKCh1OF90KShtYWN3WzJdICYgMHhmZikpCisjZGVmaW5lIFpNX01BQ181KG1hY3cpICAgKCh1OF90KShtYWN3WzJdID4+IDgpKQorCisjZGVmaW5lIFpNX0lTX01VTFRJQ0FTVF9PUl9CUk9BRENBU1QobWFjKSAobWFjWzBdICYgMHgwMSkKKyNkZWZpbmUgWk1fSVNfTVVMVElDQVNUKG1hYykgKChtYWNbMF0gJiAweDAxKSAmJiAoKCh1OF90KW1hY1swXSkgIT0gMHhGRikpCisKKyNkZWZpbmUgWk1fTUFDX0VRVUFMKG1hYzEsIG1hYzIpICAgKChtYWMxWzBdPT1tYWMyWzBdKSYmKG1hYzFbMV09PW1hYzJbMV0pJiYobWFjMVsyXT09bWFjMlsyXSkpCisjZGVmaW5lIFpNX01BQ19OT1RfRVFVQUwobWFjMSwgbWFjMikgICAoKG1hYzFbMF0hPW1hYzJbMF0pfHwobWFjMVsxXSE9bWFjMlsxXSl8fChtYWMxWzJdIT1tYWMyWzJdKSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTUFDIGFkZHJlc3MgcmVsYXRlZCBtYWMncm9zIChlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFpNX0JZVEVfVE9fV09SRChBLCBCKSAgICgoQTw8OCkrQikKKyNkZWZpbmUgWk1fUk9MMzIoIEEsIG4gKSBcCisgICAgICAgICggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgICYgKCAoMVVMIDw8IChuKSkgLSAxICkgKSApCisjZGVmaW5lIFpNX1JPUjMyKCBBLCBuICkgWk1fUk9MMzIoIChBKSwgMzItKG4pICkKKyNkZWZpbmUgWk1fTE84KHYxNikgICgodThfdCkoKHYxNikgJiAweEZGKSkKKyNkZWZpbmUgWk1fSEk4KHYxNikgICgodThfdCkoKCh2MTYpPj44KSYweEZGKSkKKworI2lmZGVmIFpNX0VOQUJMRV9CVUZGRVJfVFJBQ0UKK2V4dGVybiB2b2lkIHpmd0J1ZlRyYWNlKHpkZXZfdCogZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqZnVuY3Rpb25OYW1lKTsKKyNkZWZpbmUgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKSAgICAgICB6ZndCdWZUcmFjZShkZXYsIGJ1ZiwgX19GVU5DVElPTl9fKTsKKyNlbHNlCisjZGVmaW5lIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKyNlbmRpZgorCisvKiBub3RpZmljYXRpb24gZXZlbnRzIHRvIGhlYXJ0IGJlYXQgZnVuY3Rpb24gKi8KKyNkZWZpbmUgWk1fQlNTSURfTElTVF9TQ0FOICAgICAgICAgMHgwMQorCisvKiBDQU0gbW9kZSAqLworI2RlZmluZSBaTV9DQU1fQVAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBaTV9DQU1fU1RBICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBaTV9DQU1fSE9TVCAgICAgICAgICAgICAgICAgICAgIDB4NAorCisvKiBmaW5pdGUgc3RhdGUgbWFjaGluZSBmb3IgYWRhcHRlciAqLworI2RlZmluZSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVCAgICAgICAgICAgMQorI2RlZmluZSBaTV9TVEFfU1RBVEVfQ09OTkVDVElORyAgICAgICAgICAgMgorI2RlZmluZSBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEICAgICAgICAgICAgMworCisvKiBFdmVudCBkZWZpbml0aW9ucyBmb3IgIGZpbml0ZSBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfU0NBTiAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9CR19TQ0FOICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTl9FVkVOVF9USU1FT1VUX1JFQ09OTkVDVCAgICAgICAgMHgwMDAyCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfSU5JVF9TQ0FOICAgICAgICAweDAwMDMKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9BVVRIICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX0FTU08gICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfQVVUT19TQ0FOICAgICAgICAweDAwMDYKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9NSUNfRkFJTCAgICAgICAgIDB4MDAwNworI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX0NIRUNLX0FQICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFpNX0VWRU5UX0NPTk5FQ1QgICAgICAgICAgICAgICAgICAweDAwMDkKKyNkZWZpbmUgWk1fRVZFTlRfSU5JVF9TQ0FOICAgICAgICAgICAgICAgIDB4MDAwYQorI2RlZmluZSBaTV9FVkVOVF9TQ0FOICAgICAgICAgICAgICAgICAgICAgMHgwMDBiCisjZGVmaW5lIFpNX0VWRU5UX0JHX1NDQU4gICAgICAgICAgICAgICAgICAweDAwMGMKKyNkZWZpbmUgWk1fRVZFTlRfRElTQ09OTkVDVCAgICAgICAgICAgICAgIDB4MDAwZAorI2RlZmluZSBaTV9FVkVOVF9XUEFfTUlDX0ZBSUwgICAgICAgICAgICAgMHgwMDBlCisjZGVmaW5lIFpNX0VWRU5UX0FQX0FMSVZFICAgICAgICAgICAgICAgICAweDAwMGYKKyNkZWZpbmUgWk1fRVZFTlRfQ0hBTkdFX1RPX0FQICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBaTV9FVkVOVF9DSEFOR0VfVE9fU1RBICAgICAgICAgICAgMHgwMDExCisjZGVmaW5lIFpNX0VWRU5UX0lETEUgICAgICAgICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgWk1fRVZFTlRfQVVUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBaTV9FVkVOVF9BU1NPX1JTUCAgICAgICAgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIFpNX0VWRU5UX1dQQV9QS19PSyAgICAgICAgICAgICAgICAweDAwMTUKKyNkZWZpbmUgWk1fRVZFTlRfV1BBX0dLX09LICAgICAgICAgICAgICAgIDB4MDAxNgorI2RlZmluZSBaTV9FVkVOVF9SQ1ZfQkVBQ09OICAgICAgICAgICAgICAgMHgwMDE3CisjZGVmaW5lIFpNX0VWRU5UX1JDVl9QUk9CRV9SU1AgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgWk1fRVZFTlRfU0VORF9EQVRBICAgICAgICAgICAgICAgIDB4MDAxOQorI2RlZmluZSBaTV9FVkVOVF9BVVRPX1NDQU4gICAgICAgICAgICAgICAgMHgwMDFhCisjZGVmaW5lIFpNX0VWRU5UX01JQ19GQUlMMSAgICAgICAgICAgICAgICAweDAwMWQKKyNkZWZpbmUgWk1fRVZFTlRfTUlDX0ZBSUwyICAgICAgICAgICAgICAgIDB4MDAxZQorI2RlZmluZSBaTV9FVkVOVF9JQlNTX01PTklUT1IgICAgICAgICAgICAgMHgwMDFmCisjZGVmaW5lIFpNX0VWRU5UX0lOX1NDQU4gICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgWk1fRVZFTlRfQ01fVElNRVIgICAgICAgICAgICAgICAgIDB4MDAyMQorI2RlZmluZSBaTV9FVkVOVF9DTV9ESVNDT05ORUNUICAgICAgICAgICAgMHgwMDIyCisjZGVmaW5lIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSICAgICAgICAgICAweDAwMjMKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9BRERCQSAgICAgICAgICAgIDB4MDAyNAorI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX1BFUkZPUk1BTkNFICAgICAgMHgwMDI1CisjZGVmaW5lIFpNX0VWRU5UX1NLSVBfQ09VTlRFUk1FQVNVUkUJICAweDAwMjYKKyNkZWZpbmUgWk1fRVZFTlRfTk9ORSAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisvKiBBY3Rpb25zIGFmdGVyIGNhbGwgZmluaXRlIHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgWk1fQUNUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBaTV9BQ1RJT05fUVVFVUVfREFUQSAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFpNX0FDVElPTl9EUk9QX0RBVEEgICAgICAgICAgICAgICAweDAwMDIKKworLyogVGltZXJzIGZvciBmaW5pdGUgc3RhdGUgbWFjaGluZSAqLworI2RlZmluZSBaTV9USUNLX1pFUk8gICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9USUNLX0lOSVRfU0NBTl9FTkQgICAgICAgICAgICAgOAorI2RlZmluZSBaTV9USUNLX05FWFRfQkdfU0NBTiAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgWk1fVElDS19CR19TQ0FOX0VORCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fVElDS19BVVRIX1RJTUVPVVQgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fVElDS19BU1NPX1RJTUVPVVQgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fVElDS19BVVRPX1NDQU4gICAgICAgICAgICAgICAgIDMwMAorI2RlZmluZSBaTV9USUNLX01JQ19GQUlMX1RJTUVPVVQgICAgICAgICAgNjAwMAorI2RlZmluZSBaTV9USUNLX0NIRUNLX0FQMSAgICAgICAgICAgICAgICAgMTUwCisjZGVmaW5lIFpNX1RJQ0tfQ0hFQ0tfQVAyICAgICAgICAgICAgICAgICAzNTAKKyNkZWZpbmUgWk1fVElDS19DSEVDS19BUDMgICAgICAgICAgICAgICAgIDI1MAorI2RlZmluZSBaTV9USUNLX0lCU1NfTU9OSVRPUiAgICAgICAgICAgICAgMTYwCisjZGVmaW5lIFpNX1RJQ0tfSU5fU0NBTiAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1RJQ0tfQ01fVElNRU9VVCAgICAgICAgICAgICAgICA2MDAwCisjZGVmaW5lIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCAgICAgICAgICAgICAyMDAKKyNkZWZpbmUgWk1fVElDS19DTV9CTE9DS19USU1FT1VUICAgICAgICAgIDYwMDAKKworLyogRml4IGJ1ZyMzMzMzOCBDb3VudGVyIE1lYXN1cmUgSXNzdXIgKi8KKyNpZmRlZiBORElTX0NNX0ZPUl9YUAorI2RlZmluZSBaTV9USUNLX0NNX1RJTUVPVVRfT0ZGU0VUICAgICAgICAyMTYwCisjZGVmaW5lIFpNX1RJQ0tfQ01fRElTQ09OTkVDVF9PRkZTRVQgICAgIDcyCisjZGVmaW5lIFpNX1RJQ0tfQ01fQkxPQ0tfVElNRU9VVF9PRkZTRVQgIDIxNjAKKyNlbHNlCisjZGVmaW5lIFpNX1RJQ0tfQ01fVElNRU9VVF9PRkZTRVQgICAgICAgIDAKKyNkZWZpbmUgWk1fVElDS19DTV9ESVNDT05ORUNUX09GRlNFVCAgICAgMAorI2RlZmluZSBaTV9USUNLX0NNX0JMT0NLX1RJTUVPVVRfT0ZGU0VUICAwCisjZW5kaWYKKworI2RlZmluZSBaTV9USU1FX0FDVElWRV9TQ0FOICAgICAgICAgICAgICAgMzAgLy9tcworI2RlZmluZSBaTV9USU1FX1BBU1NJVkVfU0NBTiAgICAgICAgICAgICAgMTEwIC8vbXMKKworLyogZmluaXRlIHN0YXRlIG1hY2hpbmUgZm9yIEJTUyBjb25uZWN0ICovCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX05PTkUgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiAgICAgICAxCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMSAgICAyCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMiAgICAzCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSAgICAgICA0CisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX1NTSURfTk9UX0ZPVU5EICA1CisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEICA2CisKKy8qIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZvciBXUEEgaGFuZHNoYWtpbmcgKi8KKyNkZWZpbmUgWk1fU1RBX1dQQV9TVEFURV9JTklUICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fU1RBX1dQQV9TVEFURV9QS19PSyAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fU1RBX1dQQV9TVEFURV9HS19PSyAgICAgICAgICAgIDIKKworLyogdmFyaW91cyB0aW1lcnMgKi8KKyNkZWZpbmUgWk1fSU5URVJWQUxfQ09OTkVDVF9USU1FT1VUICAgICAgICAgIDIwICAgLyogMjAwIG1pbGlzZWNvbmQgKi8KKworLyogSUJTUyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBaTV9JQlNTX1BBUlRORVJfTE9TVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9JQlNTX1BBUlRORVJfQUxJVkUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9JQlNTX1BBUlRORVJfQ0hFQ0sgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIFpNX0JDTUNfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgIDE2IC8qIE11c3QgYmUgMl5OICovCisjZGVmaW5lIFpNX1VOSV9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgIDE2IC8qIE11c3QgYmUgMl5OICovCisKKyNkZWZpbmUgWk1fTUFYX0RFRlJBR19FTlRSSUVTICAgICAgICAgICAgICAgNCAgLyogMl5OICovCisjZGVmaW5lIFpNX0RFRlJBR19BR0lOR19USU1FX1NFQyAgICAgICAgICAgIDUgIC8qIDUgc2Vjb25kcyAqLworCisjZGVmaW5lIFpNX01BWF9XUEFJRV9TSVpFICAgICAgICAgICAgICAgICAgIDEyOAorLyogV0VQIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgWk1fVVNFUl9LRVlfREVGQVVMVCAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fVVNFUl9LRVlfUEsgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBLZXkgKi8KKyNkZWZpbmUgWk1fVVNFUl9LRVlfR0sgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAvKiBHcm91cCBLZXkgKi8KKy8qIEFQIFdMQU4gVHlwZSAqLworI2RlZmluZSBaTV9XTEFOX1RZUEVfUFVSRV9CICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1dMQU5fVFlQRV9QVVJFX0cgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fV0xBTl9UWVBFX01JWEVEICAgICAgICAgICAgICAgICAgMAorCisvKiBIQUwgU3RhdGUgKi8KKyNkZWZpbmUgWk1fSEFMX1NUQVRFX0lOSVQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9IQUxfU1RBVEVfUlVOTklORyAgICAgICAgICAgICAgICAxCisKKy8qIEFQIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgWk1fQWxsMTFOX0FQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBaTV9YUl9BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFpNX1N1cGVyR19BUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKworLyogTVBEVSBEZW5zaXR5ICovCisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV9OT05FICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzFfOFVTICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfMV80VVMgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV8xXzJVUyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzFVUyAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfMlVTICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV80VVMgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzhVUyAgICAgICAgICAgICAgICAgNworCisvKiBTb2Z0d2FyZSBFbmNyeXB0aW9uICovCisjZGVmaW5lIFpNX1NXX1RLSVBfRU5DUllfRU4gICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBaTV9TV19US0lQX0RFQ1JZX0VOICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgWk1fU1dfV0VQX0VOQ1JZX0VOICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFpNX1NXX1dFUF9ERUNSWV9FTiAgICAgICAgICAgICAgICAgMHgwOAorCisvKiBEZWZhdWx0IFN1cHBvcnQgUmF0ZSAqLworI2RlZmluZSBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPICAgICAgIDB4MAorI2RlZmluZSBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9ESVNDT05ORUNUIDB4MQorI2RlZmluZSBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9JQlNTX0IgICAgIDB4MgorI2RlZmluZSBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9JQlNTX0FHICAgIDB4MworCisvKiBzZWN1cml0eSByZWxhdGVkIGRlZmluaXRpb25zICovCitzdHJ1Y3QgenNUa2lwU2VlZAoreworICAgIHU4X3QgICB0a1szMl07ICAgICAvKiBrZXkgKi8KKyAgICB1OF90ICAgdGFbNl07CisgICAgdTE2X3QgIHR0YWtbNV07CisgICAgdTE2X3QgIHBwa1s2XTsKKyAgICB1MTZfdCAgaXYxNixpdjE2dG1wOworICAgIHUzMl90ICBpdjMyLGl2MzJ0bXA7Cit9OworCitzdHJ1Y3QgenNNaWNWYXIKK3sKKyAgICB1MzJfdCAgazAsIGsxOyAgICAgICAgLy8gS2V5CisgICAgdTMyX3QgIGxlZnQsIHJpZ2h0OyAgIC8vIEN1cnJlbnQgc3RhdGUKKyAgICB1MzJfdCAgbTsgICAgICAgICAgICAgLy8gTWVzc2FnZSBhY2N1bXVsYXRvciAoc2luZ2xlIHdvcmQpCisgICAgdTE2X3QgIG5CeXRlczsgICAgICAgIC8vICMgYnl0ZXMgaW4gTQorfTsKKworc3RydWN0IHpzRGVmcmFnRW50cnkKK3sKKyAgICB1OF90ICAgIGZyYWdDb3VudDsKKyAgICB1OF90ICAgIGFkZHJbNl07CisgICAgdTE2X3QgICBzZXFOdW07CisgICAgemJ1Zl90KiBmcmFnbWVudFs4XTsKKyAgICB1MzJfdCAgIHRpY2s7Cit9OworCitzdHJ1Y3QgenNEZWZyYWdMaXN0Cit7CisgICAgc3RydWN0IHpzRGVmcmFnRW50cnkgICBkZWZyYWdFbnRyeVtaTV9NQVhfREVGUkFHX0VOVFJJRVNdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgcmVwbGFjZU51bTsKK307CisKKyNkZWZpbmUgWk1fTUFYX09QUE9TSVRFX0NPVU5UICAgICAgMTYKKyNkZWZpbmUgWk1fTUFYX1RYX1NBTVBMRVMgICAgICAgICAgMTUKKyNkZWZpbmUgWk1fVFhfUkFURV9ET1dOX0NSSVRFUklBICAgODAKKyNkZWZpbmUgWk1fVFhfUkFURV9VUF9DUklURVJJQSAgICAyMDAKKworCisjZGVmaW5lIFpNX01BWF9QUk9CRV9ISURERU5fU1NJRF9TSVpFIDIKK3N0cnVjdCB6c1NzaWRMaXN0Cit7CisgICAgdThfdCAgICAgICAgICAgIHNzaWRbMzJdOworICAgIHU4X3QgICAgICAgICAgICBzc2lkTGVuOworfTsKKworc3RydWN0IHpzV3JhcHBlclNldHRpbmcKK3sKKyAgICB1OF90ICAgICAgICAgICAgYkRlc2lyZWRCc3NpZDsKKyAgICB1OF90ICAgICAgICAgICAgZGVzaXJlZEJzc2lkWzZdOworICAgIHUxNl90ICAgICAgICAgICBic3NpZFszXTsKKyAgICB1OF90ICAgICAgICAgICAgc3NpZFszMl07CisgICAgdThfdCAgICAgICAgICAgIHNzaWRMZW47CisgICAgdThfdCAgICAgICAgICAgIGF1dGhNb2RlOworICAgIHU4X3QgICAgICAgICAgICB3ZXBTdGF0dXM7CisgICAgdThfdCAgICAgICAgICAgIGVuY3J5TW9kZTsKKyAgICB1OF90ICAgICAgICAgICAgd2xhbk1vZGU7CisgICAgdTE2X3QgICAgICAgICAgIGZyZXF1ZW5jeTsKKyAgICB1MTZfdCAgICAgICAgICAgYmVhY29uSW50ZXJ2YWw7CisgICAgdThfdCAgICAgICAgICAgIGR0aW07CisgICAgdThfdCAgICAgICAgICAgIHByZWFtYmxlVHlwZTsKKyAgICB1MTZfdCAgICAgICAgICAgYXRpbVdpbmRvdzsKKworICAgIHN0cnVjdCB6c1NzaWRMaXN0IHByb2JpbmdTc2lkTGlzdFtaTV9NQVhfUFJPQkVfSElEREVOX1NTSURfU0laRV07CisKKyAgICB1OF90ICAgICAgICAgICAgZHJvcFVuZW5jcnlwdGVkUGt0czsKKyAgICB1OF90ICAgICAgICAgICAgaWJzc0pvaW5Pbmx5OworICAgIHUzMl90ICAgICAgICAgICBhZGhvY01vZGU7CisgICAgdThfdCAgICAgICAgICAgIGNvdW50cnlJc29OYW1lWzRdOworICAgIHUxNl90ICAgICAgICAgICBhdXRvU2V0RnJlcXVlbmN5OworCisgICAgLyogQVAgKi8KKyAgICB1OF90ICAgICAgICAgICAgYlJhdGVCYXNpYzsKKyAgICB1OF90ICAgICAgICAgICAgZ1JhdGVCYXNpYzsKKyAgICB1MzJfdCAgICAgICAgICAgblJhdGVCYXNpYzsKKyAgICB1OF90ICAgICAgICAgICAgYmdNb2RlOworCisgICAgLyogQ29tbW9uICovCisgICAgdThfdCAgICAgICAgICAgIHN0YVdtZUVuYWJsZWQ7CisgICAgdThfdCAgICAgICAgICAgIHN0YVdtZVFvc0luZm87CisgICAgdThfdCAgICAgICAgICAgIGFwV21lRW5hYmxlZDsKKworCisgICAgLyogcmF0ZSBpbmZvcm1hdGlvbjogYWRkZWQgaW4gdGhlIGZ1dHVyZSAqLworfTsKKworc3RydWN0IHpzV3JhcHBlckZlYXR1cmVDdHJsCit7CisgICAgdThfdCAgICAgICAgICAgYklic3NHTW9kZTsKK307CisKKyNkZWZpbmUgIFpNX01BWF9QU19TVEEgICAgICAgICAgICAxNgorI2RlZmluZSAgWk1fUFNfUVVFVUVfU0laRSAgICAgICAgIDMyCisKK3N0cnVjdCB6c1N0YVBTRW50aXR5Cit7CisgICAgdThfdCAgICAgICAgICAgYlVzZWQ7CisgICAgdThfdCAgICAgICAgICAgbWFjQWRkcls2XTsKKyAgICB1OF90ICAgICAgICAgICBiRGF0YVF1ZXVlZDsKK307CisKK3N0cnVjdCB6c1N0YVBTTGlzdAoreworICAgIHU4X3QgICAgICAgICAgIGNvdW50OworICAgIHN0cnVjdCB6c1N0YVBTRW50aXR5ICAgIGVudGl0eVtaTV9NQVhfUFNfU1RBXTsKK307CisKKyNkZWZpbmUgWk1fTUFYX1RJTUVSX0NPVU5UICAgMzIKKworLyogZG91YmxlIGxpbmtlZCBsaXN0ICovCitzdHJ1Y3QgenNUaW1lckVudHJ5Cit7CisgICAgdTE2X3QgICBldmVudDsKKyAgICB1MzJfdCAgIHRpbWVyOworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnByZTsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpuZXh0OworfTsKKworc3RydWN0IHpzVGltZXJMaXN0Cit7CisgICAgdThfdCAgIGZyZWVDb3VudDsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5IGxpc3RbWk1fTUFYX1RJTUVSX0NPVU5UXTsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpoZWFkOworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnRhaWw7Cit9OworCisvKiBNdWx0aWNhc3QgbGlzdCAqLworI2RlZmluZSBaTV9NQVhfTVVMVElDQVNUX0xJU1RfU0laRSAgICAgNjQKKworc3RydWN0IHpzTXVsdGljYXN0QWRkcgoreworICAgIHU4X3QgYWRkcls2XTsKK307CisKK3N0cnVjdCB6c011bHRpY2FzdExpc3QKK3sKKyAgICB1OF90ICAgc2l6ZTsKKyAgICBzdHJ1Y3QgenNNdWx0aWNhc3RBZGRyIG1hY0FkZHJbWk1fTUFYX01VTFRJQ0FTVF9MSVNUX1NJWkVdOworfTsKKworZW51bSBpZWVlODAyMTFfY3dtX21vZGUgeworICAgIENXTV9NT0RFMjAsCisgICAgQ1dNX01PREUyMDQwLAorICAgIENXTV9NT0RFNDAsCisgICAgQ1dNX01PREVNQVgKKworfTsKKworZW51bSBpZWVlODAyMTFfY3dtX2V4dHByb3RzcGFjaW5nIHsKKyAgICBDV01fRVhUUFJPVFNQQUNJTkcyMCwKKyAgICBDV01fRVhUUFJPVFNQQUNJTkcyNSwKKyAgICBDV01fRVhUUFJPVFNQQUNJTkdNQVgKK307CisKK2VudW0gaWVlZTgwMjExX2N3bV93aWR0aCB7CisgICAgQ1dNX1dJRFRIMjAsCisgICAgQ1dNX1dJRFRINDAKK307CisKK2VudW0gaWVlZTgwMjExX2N3bV9leHRwcm90bW9kZSB7CisgICAgQ1dNX0VYVFBST1ROT05FLCAgLyogbm8gcHJvdGVjdGlvbiAqLworICAgIENXTV9FWFRQUk9UQ1RTT05MWSwgICAvKiBDVFMgdG8gc2VsZiAqLworICAgIENXTV9FWFRQUk9UUlRTQ1RTLCAgICAvKiBSVFMtQ1RTICovCisgICAgQ1dNX0VYVFBST1RNQVgKK307CisKK3N0cnVjdCBpZWVlODAyMTFfY3dtIHsKKworICAgIC8qIENvbmZpZ3VyYXRpb24gKi8KKyAgICBlbnVtIGllZWU4MDIxMV9jd21fbW9kZSAgICAgICAgIGN3X21vZGU7ICAgICAgICAgICAgLyogQ1dNIG1vZGUgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3X2V4dG9mZnNldDsgICAgICAgLyogQ1dNIEV4dGVuc2lvbiBDaGFubmVsIE9mZnNldCAqLworICAgIGVudW0gaWVlZTgwMjExX2N3bV9leHRwcm90bW9kZSAgY3dfZXh0cHJvdG1vZGU7ICAgICAvKiBDV00gRXh0ZW5zaW9uIENoYW5uZWwgUHJvdGVjdGlvbiBNb2RlICovCisgICAgZW51bSBpZWVlODAyMTFfY3dtX2V4dHByb3RzcGFjaW5nIGN3X2V4dHByb3RzcGFjaW5nOy8qIENXTSBFeHRlbnNpb24gQ2hhbm5lbCBQcm90ZWN0aW9uIFNwYWNpbmcgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3X2VuYWJsZTsgICAgICAgICAgLyogQ1dNIFN0YXRlIE1hY2hpbmUgRW5hYmxlZCAqLworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dfZXh0YnVzeXRocmVzaG9sZDsvKiBDV00gRXh0ZW5zaW9uIENoYW5uZWwgQnVzeSBUaHJlc2hvbGQgKi8KKworICAgIC8qIFN0YXRlICovCisgICAgZW51bSBpZWVlODAyMTFfY3dtX3dpZHRoICAgICAgICBjd193aWR0aDsgICAgICAgICAgIC8qIENXTSBjaGFubmVsIHdpZHRoICovCit9OworCisKKy8qIEFQIDogU1RBIGRhdGFiYXNlIHN0cnVjdHVyZSAqLworc3RydWN0IHpzU3RhVGFibGUKK3sKKyAgICB1MzJfdCB0aW1lOyAgICAgLyogdGljayB0aW1lICovCisgICAgLy91MzJfdCBwaHlDdHJsOyAgIC8qIFR4IFBIWSBDVFJMICovCisgICAgdTE2X3QgYWRkclszXTsgIC8qIFNUQSBNQUMgYWRkcmVzcyAqLworICAgIHUxNl90IHN0YXRlOyAgICAvKiBhdXQvYXNvYyAqLworICAgIC8vdTE2X3QgcmV0cnk7ICAgIC8qIFJldHJ5IGNvdW50ICovCisgICAgc3RydWN0IHpzUmNDZWxsIHJjQ2VsbDsKKworICAgIHU4X3QgdmFsaWQ7ICAgICAvKiBWYWxpZCBmbGFnIDogMT0+dmFsaWQgKi8KKyAgICB1OF90IHBzTW9kZTsgICAgLyogU1RBIHBvd2VyIHNhdmluZyBtb2RlICovCisgICAgdThfdCBzdGFUeXBlOyAgIC8qIDA9PjExYiwgMT0+MTFnLCAyPT4xMW4gKi8KKyAgICB1OF90IHFvc1R5cGU7ICAgLyogMD0+TGVnYWN5LCAxPT5XTUUgKi8KKyAgICB1OF90IHFvc0luZm87ICAgLyogV01FIFFvUyBpbmZvICovCisgICAgdThfdCB2YXA7ICAgICAgIC8qIFZpcnR1YWwgQVAgSUQgKi8KKyAgICB1OF90IGVuY3J5TW9kZTsgLyogRW5jcnlwdGlvbiB0eXBlIGZvciB0aGlzIFNUQSAqLworICAgIHU4X3Qga2V5SWR4OworICAgIHN0cnVjdCB6c01pY1ZhciAgICAgdHhNaWNLZXk7CisgICAgc3RydWN0IHpzTWljVmFyICAgICByeE1pY0tleTsKKyAgICB1MTZfdCBpdjE2OworICAgIHUzMl90IGl2MzI7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBDRU5DICovCisgICAgdThfdCBjZW5jS2V5SWR4OworICAgIHUzMl90IHR4aXZbNF07CisgICAgdTMyX3Qgcnhpdls0XTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCit9OworCitzdHJ1Y3QgemRTdHJ1Y3RXZHMKK3sKKyAgICB1OF90ICAgIHdkc0JpdG1hcDsgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGJpdC1OIHRvIDEgdG8gZW5hYmxlIFdEUyAqLworICAgIHU4X3QgICAgZW5jcnlNb2RlW1pNX01BWF9XRFNfU1VQUE9SVF07ICAvKiBXRFMgZW5jcnlwdGlvbiBtb2RlICovCisgICAgdTE2X3QgICBtYWNBZGRyW1pNX01BWF9XRFNfU1VQUE9SVF1bM107IC8qIFdEUyBuZWlnaGJvciBNQUMgYWRkcmVzcyAqLworfTsKKworICAgIC8vIGh0Y2FwaW5mbyAxNmJpdHMKKyNkZWZpbmUgSFRDQVBfQWR2Q29kaW5nQ2FwICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBIVENBUF9TdXBDaGFubmVsV2lkdGhTZXQgICAgMHgwMDAyCisjZGVmaW5lIEhUQ0FQX0R5bmFtaWNTTVBTICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSFRDQVBfU01FbmFibGVkICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBIVENBUF9HcmVlbkZpZWxkICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEhUQ0FQX1Nob3J0R0lmb3IyME1IeiAgICAgICAweDAwMjAKKyNkZWZpbmUgSFRDQVBfU2hvcnRHSWZvcjQwTUh6ICAgICAgIDB4MDA0MAorI2RlZmluZSBIVENBUF9UeFNUQkMgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEhUQ0FQX1J4T25lU3RyZWFtICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgSFRDQVBfUnhUd29TdHJlYW0gICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBIVENBUF9SeFRocmVlU3RyZWFtICAgICAgICAgMHgwMzAwCisjZGVmaW5lIEhUQ0FQX0RlbGF5ZWRCbG9ja0FDSyAgICAgICAweDA0MDAKKyNkZWZpbmUgSFRDQVBfTWF4QU1TRFVMZW5ndGggICAgICAgIDB4MDgwMAorI2RlZmluZSBIVENBUF9EU1NTYW5kQ0NLaW40ME1IeiAgICAgMHgxMDAwCisjZGVmaW5lIEhUQ0FQX1BTTVBTdXAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgSFRDQVBfU1RCQ0NvbnRyb2xGcmFtZVN1cCAgIDB4NDAwMAorI2RlZmluZSBIVENBUF9MU0lHVFhPUFByb3RlY3Rpb25TVVAgMHg4MDAwCisgICAgLy8gQW1wZHUgSFQgUGFyYW1ldGVyIEluZm8gOGJpdHMKKyNkZWZpbmUgSFRDQVBfTWF4UnhBTVBEVTAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSFRDQVBfTWF4UnhBTVBEVTEgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSFRDQVBfTWF4UnhBTVBEVTIgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSFRDQVBfTWF4UnhBTVBEVTMgICAgICAgICAgIDB4MDMKKyAgICAvLyBQQ08gOGJpdHMKKyNkZWZpbmUgSFRDQVBfUENPICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSFRDQVBfVHJhbnNtaXNzaW9uVGltZTEgICAgIDB4MDIKKyNkZWZpbmUgSFRDQVBfVHJhbnNtaXNzaW9uVGltZTIgICAgIDB4MDQKKyNkZWZpbmUgSFRDQVBfVHJhbnNtaXNzaW9uVGltZTMgICAgIDB4MDYKKyAgICAvLyBNQ1MgRmVlZEJhY2sgOGJpdHMKKyNkZWZpbmUgSFRDQVBfUGx1c0hUQ1N1cHBvcnQgICAgICAgIDB4MDQKKyNkZWZpbmUgSFRDQVBfUkRSZXNwb25kZXIgICAgICAgICAgIDB4MDgKKyAgICAvLyBUWCBCZWFtZm9ybWluZyAwIDhiaXRzCisjZGVmaW5lIEhUQ0FQX1R4QkZDYXBhYmxlICAgICAgICAgICAweDAxCisjZGVmaW5lIEhUQ0FQX1J4U3RhZ2dlcmVkU291bmRDYXAgICAweDAyCisjZGVmaW5lIEhUQ0FQX1R4U3RhZ2dlcmVkU291bmRDYXAgICAweDA0CisjZGVmaW5lIEhUQ0FQX1J4WkxGQ2FwYWJsZSAgICAgICAgICAweDA4CisjZGVmaW5lIEhUQ0FQX1R4WkxGQ2FwYWJsZSAgICAgICAgICAweDEwCisjZGVmaW5lIEhUQ0FQX0ltcGxpY2l0VHhCRkNhcGFibGUgICAweDIwCisgICAgLy8gVHggQmVhbWZvcm1pbmcgMSA4Yml0cworI2RlZmluZSBIVENBUF9FeHBsaWNpdENTSVR4QkZDYXAgICAgMHgwMQorI2RlZmluZSBIVENBUF9FeHBVbmNvbXBTdGVlck1hdHJDYXAgMHgwMgorICAgIC8vIEFudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdGllcyA4Yml0cworI2RlZmluZSBIVENBUF9BbnRlbm5hU2VsZWN0aW9uQ2FwICAgICAgIDB4MDEKKyNkZWZpbmUgSFRDQVBfRXhwbGljaXRDU0lUeEFTQ2FwICAgICAgICAweDAyCisjZGVmaW5lIEhUQ0FQX0FudGVubmFJbmRGZWVUeEFTQ2FwICAgICAgMHgwNAorI2RlZmluZSBIVENBUF9FeHBsaWNpdENTSUZlZWRiYWNrQ2FwICAgIDB4MDgKKyNkZWZpbmUgSFRDQVBfQW50ZW5uYUluZEZlZWRiYWNrQ2FwICAgICAweDEwCisjZGVmaW5lIEhUQ0FQX1J4QVNDYXAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBIVENBUF9UeFNvdW5kUFBEVXNDYXAgICAgICAgICAgIDB4NDAKKworCisKK3N0cnVjdCB6c0hUQ2FwYWJpbGl0eQoreworICAgIHU4X3QgRWxlbWVudElEOworICAgIHU4X3QgTGVuZ3RoOworICAgIC8vIEhUIENhcGFiaWxpdHkgSW5mbworICAgIHUxNl90IEh0Q2FwSW5mbzsKKyAgICB1OF90IEFNUERVUGFyYW07CisgICAgdThfdCBNQ1NTZXRbMTZdOyAgICAvLzE2IGJ5dGVzCisgICAgLy8gRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvCisgICAgdThfdCBQQ087CisgICAgdThfdCBNQ1NGZWVkQmFjazsKKworICAgIHU4X3QgVHhCRkNhcFs0XTsKKyAgICB1OF90IEFzZWxDYXA7Cit9OworCit1bmlvbiB6dUhUQ2FwYWJpbGl0eQoreworICAgIHN0cnVjdCB6c0hUQ2FwYWJpbGl0eSBEYXRhOworICAgIHU4X3QgQnl0ZVsyOF07Cit9OworCisgICAgLy9jaGFubmVsaW5mbyA4Yml0cworI2RlZmluZSBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QWJvdmUgIDB4MDEKKyNkZWZpbmUgRXh0SHRDYXBfRXh0Q2hhbm5lbE9mZnNldEJlbG93ICAweDAzCisjZGVmaW5lIEV4dEh0Q2FwX1JlY29tVHhXaWR0aFNldCAgICAgICAgMHgwNAorI2RlZmluZSBFeHRIdENhcF9SSUZTTW9kZSAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRXh0SHRDYXBfQ29udHJvbEFjY2Vzc09ubHkgICAgICAweDEwCisgICAgLy9vcGVyYXRpbmdpbmZvIDE2Yml0cworI2RlZmluZSBFeHRIdENhcF9Ob25HRkRldmljZVByZXNlbnQgICAgIDB4MDAwNAorICAgIC8vYmVhY29uaW5mbyAxNmJpdHMKKyNkZWZpbmUgRXh0SHRDYXBfRHVhbEJlYWNvbiAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgRXh0SHRDYXBfRHVhbFNUQkNQcm90ZWN0aW9uICAgICAweDAwODAKKyNkZWZpbmUgRXh0SHRDYXBfU2Vjb25kYXJ5QmVhY29uICAgICAgICAweDAxMDAKKyNkZWZpbmUgRXh0SHRDYXBfTFNJR1RYT1BQcm90ZWN0RnVsbFN1cCAweDAyMDAKKyNkZWZpbmUgRXh0SHRDYXBfUENPQWN0aXZlICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRXh0SHRDYXBfUENPUGhhc2UgICAgICAgICAgICAgICAweDA4MDAKKworCitzdHJ1Y3QgenNFeHRIVENhcGFiaWxpdHkKK3sKKyAgICB1OF90ICAgIEVsZW1lbnRJRDsKKyAgICB1OF90ICAgIExlbmd0aDsKKyAgICB1OF90ICAgIENvbnRyb2xDaGFubmVsOworICAgIHU4X3QgICAgQ2hhbm5lbEluZm87CisgICAgdTE2X3QgICBPcGVyYXRpbmdJbmZvOworICAgIHUxNl90ICAgQmVhY29uSW5mbzsKKyAgICAvLyBTdXBwb3J0ZWQgTUNTIFNldAorICAgIHU4X3QgICAgTUNTU2V0WzE2XTsKK307CisKK3VuaW9uIHp1RXh0SFRDYXBhYmlsaXR5Cit7CisgICAgc3RydWN0IHpzRXh0SFRDYXBhYmlsaXR5IERhdGE7CisgICAgdThfdCBCeXRlWzI0XTsKK307CisKK3N0cnVjdCBJbmZvcm1hdGlvbkVsZW1lbnRTdGEgeworICAgIHN0cnVjdCB6c0hUQ2FwYWJpbGl0eSAgICAgICBIdENhcDsKKyAgICBzdHJ1Y3QgenNFeHRIVENhcGFiaWxpdHkgICAgSHRJbmZvOworfTsKKworc3RydWN0IEluZm9ybWF0aW9uRWxlbWVudEFwIHsKKyAgICBzdHJ1Y3QgenNIVENhcGFiaWxpdHkgICAgICAgSHRDYXA7Cit9OworCisjZGVmaW5lIFpNX01BWF9GUkVRX1JFUV9RVUVVRSAgMzIKK3R5cGVkZWYgdm9pZCAoKnpmcEZyZXFDaGFuZ2VDb21wbGV0ZUNiKSh6ZGV2X3QqIGRldik7CisKK3N0cnVjdCB6c1dsYW5EZXZGcmVxQ29udHJvbAoreworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgICAgZnJlcVJlcVF1ZXVlW1pNX01BWF9GUkVRX1JFUV9RVUVVRV07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgIGZyZXFSZXFCdzQwW1pNX01BWF9GUkVRX1JFUV9RVUVVRV07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgIGZyZXFSZXFFeHRPZmZzZXRbWk1fTUFYX0ZSRVFfUkVRX1FVRVVFXTsKKyAgICB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiAgIGZyZXFDaGFuZ2VDb21wQ2JbWk1fTUFYX0ZSRVFfUkVRX1FVRVVFXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICAgIGZyZXFSZXFRdWV1ZUhlYWQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgICBmcmVxUmVxUXVldWVUYWlsOworfTsKKworc3RydWN0IHpzV2xhbkRldkFwCit7CisgICAgdTE2X3QgICBwcm90ZWN0ZWRPYnNzOyAgICAvKiBwcm90ZWN0ZWQgb3ZlcmxhcCBCU1MgKi8KKyAgICB1MTZfdCAgIHN0YUFnaW5nVGltZVNlYzsgIC8qIGluIHNlY29uZCwgU1RBIHdpbGwgYmUgZGVhdGhlZCBpZiBpdCBkb2VzIG5vdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWN0aXZlIGZvciB0aGlzIGxvbmcgdGltZSAgICAgICAgICAgICAgICAgICAgICovCisgICAgdTE2X3QgICBzdGFQcm9iaW5nVGltZVNlYzsvKiBpbiBzZWNvbmQsIFNUQSB3aWxsIGJlIHByb2JlZCBpZiBpdCBkb2VzIG5vdCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjdGl2ZSBmb3IgdGhpcyBsb25nIHRpbWUgICAgICAgICAgICAgICAgICAgICAqLworICAgIHU4X3QgICAgYXV0aFNoYXJpbmc7ICAgICAgLyogYXV0aGVudGljYXRpb24gb24gZ29pbmcqLworICAgIHU4X3QgICAgYlN0YUFzc29jaWF0ZWQ7ICAgLyogMTFiIFNUQSBhc3NvY2lhdGVkICovCisgICAgdThfdCAgICBnU3RhQXNzb2NpYXRlZDsgICAvKiAxMWcgU1RBIGFzc29jaWF0ZWQgKi8KKyAgICB1OF90ICAgIG5TdGFBc3NvY2lhdGVkOyAgIC8qIDExbiBTVEEgYXNzb2NpYXRlZCAqLworICAgIHUxNl90ICAgcHJvdGVjdGlvbk1vZGU7ICAgLyogQVAgcHJvdGVjdGlvbiBtb2RlIGZsYWcgKi8KKyAgICB1MTZfdCAgIHN0YVBvd2VyU2F2aW5nOyAgIC8qIFNldCBhc3NvY2lhdGVkIHBvd2VyIHNhdmluZyBTVEEgY291bnQgKi8KKworCisKKyAgICB6YnVmX3QqICB1bmlBcnJheVtaTV9VTklfQVJSQVlfU0laRV07IC8qIGFycmF5IHRvIHN0b3JlIHVuaWNhc3QgZnJhbWVzICovCisgICAgdTE2X3QgICB1bmlIZWFkOworICAgIHUxNl90ICAgdW5pVGFpbDsKKworICAgIC8qIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHVuaW9uIHp1SFRDYXBhYmlsaXR5IEhUQ2FwOyAvL0NXWWFuZygrKQorCisgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgdW5pb24genVFeHRIVENhcGFiaWxpdHkgRXh0SFRDYXA7IC8vQ1dZYW5nKCspCisKKyAgICAvKiBTVEEgdGFibGUgKi8KKyAgICBzdHJ1Y3QgenNTdGFUYWJsZSBzdGFUYWJsZVtaTV9NQVhfU1RBX1NVUFBPUlRdOworCisgICAgLyogV0RTICovCisgICAgc3RydWN0IHpkU3RydWN0V2RzIHdkczsKKyAgICAvKiBXUEEgKi8KKyAgICB1OF90IHdwYUllW1pNX01BWF9BUF9TVVBQT1JUXVtaTV9NQVhfV1BBSUVfU0laRV07CisgICAgdThfdCB3cGFMZW5bWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHU4X3Qgc3Rhd3BhSWVbWk1fTUFYX0FQX1NVUFBPUlRdW1pNX01BWF9XUEFJRV9TSVpFXTsKKyAgICB1OF90IHN0YXdwYUxlbltaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdThfdCB3cGFTdXBwb3J0W1pNX01BWF9BUF9TVVBQT1JUXTsKKworICAgIC8vc3RydWN0IHpzVGtpcFNlZWQgICBiY1NlZWQ7CisgICAgdThfdCBiY0tleUluZGV4W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90IGJjSGFsS2V5SWR4W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICBzdHJ1Y3QgenNNaWNWYXIgICAgIGJjTWljS2V5W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1MTZfdCBpdjE2W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1MzJfdCBpdjMyW1pNX01BWF9BUF9TVVBQT1JUXTsKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgLyogQ0VOQyAqLworICAgIHUzMl90IHR4aXZbWk1fTUFYX0FQX1NVUFBPUlRdWzRdOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKworICAgIC8qIFZpcnR1YWwgQVAgKi8KKyAgICB1OF90ICAgIGJlYWNvbkNvdW50ZXI7CisgICAgdThfdCAgICB2YXBOdW1iZXI7CisgICAgdThfdCAgICBhcEJpdG1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGJpdC1OIHRvIDEgdG8gZW5hYmxlIFZBUCAqLworICAgIHU4X3QgICAgaGlkZVNzaWRbWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHU4X3QgICAgYXV0aEFsZ29bWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHU4X3QgICAgc3NpZFtaTV9NQVhfQVBfU1VQUE9SVF1bMzJdOyAgICAgIC8qIFNTSUQgKi8KKyAgICB1OF90ICAgIHNzaWRMZW5bWk1fTUFYX0FQX1NVUFBPUlRdOyAgICAgICAvKiBTU0lEIGxlbmd0aCAqLworICAgIHU4X3QgICAgZW5jcnlNb2RlW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90ICAgIHdlcFN0YXR1c1taTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdTE2X3QgICBjYXBhYltaTV9NQVhfQVBfU1VQUE9SVF07ICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgIHU4X3QgICAgdGltQmNtY0JpdFtaTV9NQVhfQVBfU1VQUE9SVF07ICAgIC8qIEJNQ00gYml0IG9mIFRJTSAqLworICAgIHU4X3QgICAgd2xhblR5cGVbWk1fTUFYX0FQX1NVUFBPUlRdOworCisgICAgLyogQXJyYXkgdG8gc3RvcmUgQkMgb3IgTUMgZnJhbWVzICovCisgICAgemJ1Zl90KiAgYmNtY0FycmF5W1pNX01BWF9BUF9TVVBQT1JUXVtaTV9CQ01DX0FSUkFZX1NJWkVdOworICAgIHUxNl90ICAgYmNtY0hlYWRbWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHUxNl90ICAgYmNtY1RhaWxbWk1fTUFYX0FQX1NVUFBPUlRdOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgcW9zTW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE9PldNRSAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHVhcHNkRW5hYmxlZDsKKyAgICBzdHJ1Y3QgenNRdWV1ZSogICAgICAgICB1YXBzZFE7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VUZXh0WzEyOF07CisKKyAgICBzdHJ1Y3QgSW5mb3JtYXRpb25FbGVtZW50QXAgaWVbWk1fTUFYX1NUQV9TVVBQT1JUXTsKKworCit9OworCisjZGVmaW5lIFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkUgICAgNCAvKiAyXk4gKi8KK3N0cnVjdCB6c0Jsb2NraW5nQXAKK3sKKyAgICB1OF90IGFkZHJbNl07CisgICAgdThfdCB3ZWlnaHQ7Cit9OworCisjZGVmaW5lIFpNX1NDQU5fTUdSX1NDQU5fTk9ORSAgICAgICAgICAgMAorI2RlZmluZSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMICAgICAgIDEKKyNkZWZpbmUgWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTCAgICAgICAyCisKK3N0cnVjdCB6c1dsYW5EZXZTdGFTY2FuTWdyCit7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgc2NhblJlcXNbMl07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY3VyclNjYW5UeXBlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHNjYW5TdGFydERlbGF5OworfTsKKworI2RlZmluZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFICAgICAgICAgIDAKKyNkZWZpbmUgWk1fUFNfTVNHX1NUQVRFX1NMRUVQICAgICAgICAgICAxCisjZGVmaW5lIFpNX1BTX01TR19TVEFURV9UMSAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9QU19NU0dfU1RBVEVfVDIgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fUFNfTVNHX1NUQVRFX1MxICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgWk1fUFNfTUFYX1NMRUVQX1BFUklPRFMgICAgICAgICAzICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYmVhY29uIHBlcmlvZHMKKworc3RydWN0IHpzV2xhbkRldlN0YVBTTWdyCit7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgc3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaXNTbGVlcEFsbG93ZWQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgbWF4U2xlZXBQZXJpb2RzOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHRpY2tzOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGxhc3RUeFVuaWNhc3RGcm07CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgbGFzdFR4TXVsdGljYXN0RnJtOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGxhc3RUeEJyb2FkY2FzdEZybTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB0ZW1wV2FrZVVwOyAvKmVuYWJsZSB3aGVuIHdha2UgdXAgYnV0IHN0aWxsIGluIHBzIG1vZGUgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBzbGVlcEFsbG93ZWR0aWNrOworfTsKKworc3RydWN0IHpzV2xhbkRldlN0YQoreworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGJlYWNvblR4Q250OyAgLyogVHJhbnNtaXR0ZWQgYmVhY29uIGNvdW50ZXIgKGluIElCU1MpICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgdHhCZWFjb25JbmQ7ICAvKiBJbiBJQlNTIG1vZGUsIHRydWUgbWVhbnMgdGhhdCB3ZSBqdXN0IHRyYW5zbWl0IGEgYmVhY29uIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBiZWFjb24gcGVyaW9kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYmVhY29uQ250OyAgICAvKiByZWNlaXZlIGJlYWNvbiBjb3VudCwgd2lsbCBiZSBwZXJvZGljYWxseSByZXNldCAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGJzc2lkWzNdOyAgICAgLyogQlNTSUQgb2YgY29ubmVjdGVkIEFQICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgc3NpZFszMl07ICAgICAvKiBTU0lEICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgc3NpZExlbjsgICAgICAvKiBTU0lEIGxlbmd0aCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIG1UeFJhdGU7ICAgICAgLyogVHggcmF0ZSBmb3IgbXVsdGljYXN0ICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgdVR4UmF0ZTsgICAgICAvKiBUeCByYXRlIGZvciB1bmljYXN0ICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgbW1UeFJhdGU7ICAgICAvKiBUeCByYXRlIGZvciBtYW5hZ2VtZW50IGZyYW1lICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYkNoYW5uZWxTY2FuOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJTY2hlZHVsZVNjYW47CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbFNjYW5SZXE7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYWN0aXZlc2NhblRpY2tQZXJDaGFubmVsOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIHBhc3NpdmVTY2FuVGlja1BlckNoYW5uZWw7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgc2NhbkZyZXF1ZW5jeTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBjb25uUG93ZXJJbkhhbGZEYm07CisKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBjdXJyZW50RnJlcXVlbmN5OworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdzQwOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFeHRPZmZzZXQ7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiUGFzc2l2ZVNjYW47CisKKyAgICBzdHJ1Y3QgenNCbG9ja2luZ0FwICAgICBibG9ja2luZ0FwTGlzdFtaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFXTsKKworICAgIC8vc3RydWN0IHpzQnNzSW5mbyAgICAgICAgYnNzSW5mb1Bvb2xbWk1fTUFYX0JTU107CisgICAgc3RydWN0IHpzQnNzSW5mbyogICAgICAgYnNzSW5mb0FycmF5W1pNX01BWF9CU1NdOworICAgIHN0cnVjdCB6c0Jzc0xpc3QgICAgICAgIGJzc0xpc3Q7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYnNzSW5mb0FycmF5SGVhZDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBic3NJbmZvQXJyYXlUYWlsOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJzc0luZm9GcmVlQ291bnQ7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBhdXRoTW9kZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXV0aE1vZGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd2VwU3RhdHVzOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBrZXlJZDsKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1dwYTJQc2s7CisjZW5kaWYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNlbmNLZXlJZDsgLy9DRU5DCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGRyb3BVbmVuY3J5cHRlZFBrdHM7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc0pvaW5Pbmx5OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJTdGF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBvbGRBZGFwdGVyU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY29ubmVjdFN0YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RSZXRyeTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3cGFTdGF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3cGFJZVtaTV9NQVhfSUVfU0laRSArIDJdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHJzbkllW1pNX01BWF9JRV9TSVpFICsgMl07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY2hhbGxlbmdlVGV4dFsyNTUrMl07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eVsyXTsKKyAgICAvL3U4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpbmdIaWRkZW5BUDsKKyAgICAvL3U4X3QgICAgICAgICAgICAgICAgICAgIHNjYW5XaXRoU1NJRDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBhaWQ7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgbWd0RnJhbWVDb3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiUHJvdGVjdGlvbk1vZGU7CisJdTMyX3QJCQkJCU5vbk5BUGNvdW50OworCXU4X3QJCQkJCVJUU0luQUdHTW9kZTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBjb25uZWN0VGltZXI7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYXRpbVdpbmRvdzsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQnNzaWRbNl07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYkRlc2lyZWRCc3NpZDsKKyAgICBzdHJ1Y3QgenNUa2lwU2VlZCAgICAgICB0eFNlZWQ7CisgICAgc3RydWN0IHpzVGtpcFNlZWQgICAgICAgcnhTZWVkWzRdOworICAgIHN0cnVjdCB6c01pY1ZhciAgICAgICAgIHR4TWljS2V5OworICAgIHN0cnVjdCB6c01pY1ZhciAgICAgICAgIHJ4TWljS2V5WzRdOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGl2MTY7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgaXYzMjsKKyAgICBzdHJ1Y3QgenNPcHBvc2l0ZUluZm8gICBvcHBvc2l0ZUluZm9bWk1fTUFYX09QUE9TSVRFX0NPVU5UXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZUNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJzc05vdEZvdW5kQ291bnQ7ICAgICAvKiBzaXRlc3VydmV5IGZvciBzZWFyY2ggZGVzaXJlZCBJU0JCIHRocmVzaG9sZCAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIHJ4QmVhY29uQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYmVhY29uTWlzc1N0YXRlOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIHJ4QmVhY29uVG90YWw7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYklzU2hhcmVkS2V5OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0Q291bnQ7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICByZWN2QXRpbTsKKworICAgIC8qIFNjYW5NZ3IgQ29udHJvbCBibG9jayAqLworICAgIHN0cnVjdCB6c1dsYW5EZXZTdGFTY2FuTWdyIHNjYW5NZ3I7CisgICAgc3RydWN0IHpzV2xhbkRldlN0YVBTTWdyICAgcHNNZ3I7CisKKyAgICAvLyBUaGUgY2FsbGJhY2sgd291bGQgYmUgY2FsbGVkIGlmIHJlY2VpdmluZyBhbiB1bmVuY3J5cHRlZCBwYWNrZXRzIGJ1dAorICAgIC8vIHRoZSBzdGF0aW9uIGlzIGluIGVuY3J5cHRlZCBtb2RlLiBUaGUgd3JhcHBlciBjb3VsZCBkZWNpZGUgd2hldGhlcgorICAgIC8vIHRvIGRyb3AgdGhlIHBhY2tldCBieSBpdHMgT1Mgc2V0dGluZy4KKyAgICB6ZnBTdGFSeFNlY3VyaXR5Q2hlY2tDYiBwU3RhUnhTZWN1cml0eUNoZWNrQ2I7CisKKyAgICAvKiBXTUUgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBhcFdtZUNhcGFiaWxpdHk7IC8vYml0LTAgPT4gYSBXTUUgQVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYml0LTcgPT4gYSBVQVBTRCBBUAorICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdtZVBhcmFtZXRlclNldENvdW50OworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd21lRW5hYmxlZDsKKyAgICAjZGVmaW5lIFpNX1NUQV9XTUVfRU5BQkxFX0JJVCAgICAgICAweDEKKyAgICAjZGVmaW5lIFpNX1NUQV9VQVBTRF9FTkFCTEVfQklUICAgICAweDIKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3bWVRb3NJbmZvOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd21lQ29ubmVjdGVkOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHFvc0luZm87CisgICAgc3RydWN0IHpzUXVldWUqICAgICAgICAgdWFwc2RROworCisgICAgLyogY291bnRlcm1lYXN1cmVzICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY21NaWNGYWlsdXJlQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY21EaXNhbGxvd1NzaWRMZW5ndGg7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY21EaXNhbGxvd1NzaWRbMzJdOworCisgICAgLyogcG93ZXItc2F2aW5nIG1vZGUgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBwb3dlclNhdmVNb2RlOworICAgIHpidWZfdCogICAgICAgICAgICAgICAgIHN0YVBTRGF0YVF1ZXVlW1pNX1BTX1FVRVVFX1NJWkVdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHN0YVBTRGF0YUNvdW50OworCisgICAgLyogSUJTUyBwb3dlci1zYXZpbmcgbW9kZSAqLworICAgIC8qIHJlY29yZCB0aGUgU1RBIHdoaWNoIGhhcyBlbnRlcmVkIHRoZSBQUyBtb2RlICovCisgICAgc3RydWN0IHpzU3RhUFNMaXN0ICAgICAgc3RhUFNMaXN0OworICAgIC8qIHF1ZXVlIHRoZSBkYXRhIG9mIHRoZSBQUyBTVEFzICovCisgICAgemJ1Zl90KiAgICAgICAgICAgICAgICAgIGlic3NQU0RhdGFRdWV1ZVtaTV9QU19RVUVVRV9TSVpFXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBpYnNzUFNEYXRhQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1ByZXZQU0RhdGFDb3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiSWJzc1BTRW5hYmxlOworICAgIC8qIEJJVF8xNTogT04vT0ZGLCBCSVRfMH4xNDogQXRpbSBUaW1lciAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGlic3NBdGltVGltZXI7CisKKyAgICAvKiBXUEEyICovCisgICAgc3RydWN0IHpzUG1raWRJbmZvICAgICAgcG1raWRJbmZvOworCisgICAgLyogTXVsdGljYXN0IGxpc3QgcmVsYXRlZCBvYmplY3RzICovCisgICAgc3RydWN0IHpzTXVsdGljYXN0TGlzdCAgbXVsdGljYXN0TGlzdDsKKworICAgIC8qIFhQIHBhY2tldCBmaWx0ZXIgZmVhdHVyZSA6ICovCisgICAgLyogMT0+ZW5hYmxlOiBBbGwgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0cywgbm90IGp1c3QgdGhlIG9uZXMgZW51bWVyYXRlZCBpbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MgbGlzdC4gKi8KKyAgICAvKiAwPT5kaXNhYmxlICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYkFsbE11bHRpY2FzdDsKKworICAgIC8qIHJlYXNzb2NpYXRpb24gZmxhZyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RCeVJlYXNzbzsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBmYWlsQ250T2ZSZWFzc287CisKKwkvKiBmb3IgSFQgY29uZmlndXJlIGNvbnRyb2wgc2V0dGluZyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHByZWFtYmxlVHlwZUhUOyAgLyogSFQ6IDAgTWl4ZWQgbW9kZSAgICAxIEdyZWVuIGZpZWxkICovCisJdThfdCAgICAgICAgICAgICAgICAgICAgaHRDdHJsQmFuZHdpZHRoOworCXU4X3QgICAgICAgICAgICAgICAgICAgIGh0Q3RybFNUQkM7CisJdThfdCAgICAgICAgICAgICAgICAgICAgaHRDdHJsU0c7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRBOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl8xMWI7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBFbmFibGVIVDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBTRzQwOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIEhUMjA0MDsKKyAgICAvKiBmb3IgV1BBIHNldHRpbmcgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3cGFTdXBwb3J0OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdwYUxlbjsKKworICAgIC8qIElCU1MgcmVsYXRlZCBvYmplY3RzICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc0RlbGF5ZWRJbmQ7CisgICAgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50IGlic3NEZWxheWVkSW5kRXZlbnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1BhcnRuZXJTdGF0dXM7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiQXV0b1JlY29ubmVjdDsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGZsYWdGcmVxQ2hhbmdpbmc7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgZmxhZ0tleUNoYW5naW5nOworICAgIHN0cnVjdCB6c0Jzc0luZm8gICAgICAgIGlic3NCc3NEZXNjOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NCc3NJc0NyZWF0b3I7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgaWJzc1JlY2VpdmVCZWFjb25Db3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBpYnNzU2l0ZVN1cnZleVN0YXR1czsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGRpc2FibGVQcm9iaW5nV2l0aFNzaWQ7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBDRU5DICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY2VuY0llW1pNX01BWF9JRV9TSVpFICsgMl07CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHUzMl90IHR4aXZbNF07ICAvL1R4IFBOIFNlcXVlbmNlCisgICAgdTMyX3Qgcnhpdls0XTsgIC8vUnggUE4gU2VxdWVuY2UKKyAgICB1MzJfdCByeGl2R0tbNF07Ly9Ccm9hZGNhc3QgUnggUE4gU2VxdWVuY2UKKyAgICB1OF90ICB3ZXBLZXlbNF1bMzJdOyAgICAvLyBGb3IgU29mdHdhcmUgV0VQCisJdThfdCAgU1dFbmNyeU1vZGVbNF07CisKKyAgICAvKiA4MDIuMTFkICovCisgICAgdThfdCBiODAyXzExRDsKKworICAgIC8qIDgwMi4xMWggKi8KKyAgICB1OF90IFRQQ0VuYWJsZTsKKyAgICB1OF90IERGU0VuYWJsZTsKKyAgICB1OF90IERGU0Rpc2FibGVUeDsKKworICAgIC8qIE93bCBBUCAqLworICAgIHU4X3QgYXRoT3dsQXA7CisKKyAgICAvKiBFbmFibGUgQkEgcmVzcG9uc2UgaW4gZHJpdmVyICovCisgICAgdThfdCBlbmFibGVEcnZCQTsKKworICAgIC8qIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHVuaW9uIHp1SFRDYXBhYmlsaXR5IEhUQ2FwOyAvL0NXWWFuZygrKQorCisgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgdW5pb24genVFeHRIVENhcGFiaWxpdHkgRXh0SFRDYXA7IC8vQ1dZYW5nKCspCisKKyAgICBzdHJ1Y3QgSW5mb3JtYXRpb25FbGVtZW50U3RhICAgaWU7CisKKyNkZWZpbmUgWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFICAgMjAwCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYXNvY1JlcUZyYW1lQm9keVtaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkVdOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGFzb2NSZXFGcmFtZUJvZHlTaXplOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGFzb2NSc3BGcmFtZUJvZHlbWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFXTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBhc29jUnNwRnJhbWVCb2R5U2l6ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiZWFjb25GcmFtZUJvZHlbWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFXTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBiZWFjb25GcmFtZUJvZHlTaXplOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIFNXRW5jcnlwdEVuYWJsZTsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGxlYXBFbmFibGVkOworCisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIFRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0czsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlczsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgYXZnU2l6ZU9mUmVjZWl2ZVBhY2tldHM7CisKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlcjsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZWRQa3RSYXRlUGVyU2Vjb25kOworCisgICAgLyogIzIgUmVjb3JkIHRoZSBzZXF1ZW5jZSBudW1iZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHVuaWNhc3QgZnJhbWUgaXMgc2VwYXJhdGVkIGJ5IFJJRlMgb3Igbm90ICovCisjZGVmaW5lICAgIFpNX1JJRlNfU1RBVEVfREVURUNUSU5HICAgIDAKKyNkZWZpbmUgICAgWk1fUklGU19TVEFURV9ERVRFQ1RFRCAgICAgMQorI2RlZmluZSAgICBaTV9SSUZTX1RJTUVSX1RJTUVPVVQgICAgICA0NDgwICAgICAgICAgIC8vIDxEcml2ZXIgdGltZT40NDgwbXMgPFJlYWwgdGltZT43cworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHJpZnNTdGF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICByaWZzTGlrZUZyYW1lQ250OworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIHJpZnNMaWtlRnJhbWVTZXF1ZW5jZVszXTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICByaWZzVGltZXI7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgcmlmc0NvdW50OworCisgICAgLyogUlggZmlsdGVyIGRlc2lyZWQgYnkgdXBwZXIgbGF5ZXJzLiAgTm90ZSB0aGlzIGNvbnRhaW5zIHNvbWUgYml0cyB3aGljaCBtdXN0IGJlIGZpbHRlcmVkCisgICAgICAgYnkgc3cgc2luY2UgdGhlIGh3IHN1cHBvcnRzIG9ubHkgYSBzdWJzZXQgb2YgcG9zc2libGUgZmlsdGVyIGFjdGlvbnMuPSAqLworICAgIHUzMl90ICBvc1J4RmlsdGVyOworCisgICAgdThfdCAgIGJTYWZlTW9kZTsKKworICAgIHUzMl90ICBpYnNzQWRkaXRpb25hbElFU2l6ZTsKKyAgICB1OF90ICAgaWJzc0FkZGl0aW9uYWxJRVsyNTZdOworfTsgLy9zdHJ1Y3QgenNXbGFuRGV2U3RhCisKKyNkZWZpbmUgWk1fQ01EX1FVRVVFX1NJWkUgICAgICAgICAgICAgICAgICAgMjU2ICAvL1JvZ2VyIENoZWNrLCB0ZXN0IDY0IHdoZW4gcmVhZHkKKworI2RlZmluZSBaTV9PSURfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX09JRF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fT0lEX0lOVEVSTkFMX1dSSVRFICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9DTURfU0VUX0ZSRVFVRU5DWSAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX0NNRF9TRVRfS0VZICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWk1fQ1dNX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaTV9NQUNfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFpNX0FOSV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fRUVQUk9NX1JFQUQgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBaTV9FRVBST01fV1JJVEUgICAgICAgICAgICAgICAgICAgICAweDBBCisjZGVmaW5lIFpNX09JRF9DSEFOCQkJCQkJCTB4MzAKKyNkZWZpbmUgWk1fT0lEX1NZTlRICQkJCQkJMHgzMgorI2RlZmluZSBaTV9PSURfVEFMTFkJCQkJCQkweDgxCisjZGVmaW5lIFpNX09JRF9UQUxMWV9BUEQJCQkJCTB4ODIKKworI2RlZmluZSBaTV9PSURfREtUWF9TVEFUVVMgICAgICAgICAgICAgICAgICAweDkyCisjZGVmaW5lIFpNX09JRF9GTEFTSF9DSEtTVU0gICAgICAgICAgICAgICAgIDB4RDAKKyNkZWZpbmUgWk1fT0lEX0ZMQVNIX1JFQUQgICAgICAgICAgICAgICAgICAgMHhEMQorI2RlZmluZSBaTV9PSURfRkxBU0hfUFJPR1JBTSAgICAgICAgICAgICAgICAweEQyCisjZGVmaW5lIFpNX09JRF9GV19ETF9JTklUICAgICAgICAgICAgICAgICAgIDB4RDMKKworLyogRHJpdmVyIHRvIEZpcm13YXJlIE9JRCAqLworI2RlZmluZSBaTV9DTURfRUNITyAgICAgICAgIDB4ODAKKyNkZWZpbmUgWk1fQ01EX1RBTExZICAgICAgICAweDgxCisjZGVmaW5lIFpNX0NNRF9UQUxMWV9BUEQgICAgMHg4MgorI2RlZmluZSBaTV9DTURfQ09ORklHICAgICAgIDB4ODMKKyNkZWZpbmUgWk1fQ01EX1JSRUcgICAgICAgICAweDAwCisjZGVmaW5lIFpNX0NNRF9XUkVHICAgICAgICAgMHgwMQorI2RlZmluZSBaTV9DTURfUk1FTSAgICAgICAgIDB4MDIKKyNkZWZpbmUgWk1fQ01EX1dNRU0gICAgICAgICAweDAzCisjZGVmaW5lIFpNX0NNRF9CSVRBTkQgICAgICAgMHgwNAorI2RlZmluZSBaTV9DTURfQklUT1IgICAgICAgIDB4MDUKKyNkZWZpbmUgWk1fQ01EX0VLRVkgICAgICAgICAweDI4CisjZGVmaW5lIFpNX0NNRF9ES0VZICAgICAgICAgMHgyOQorI2RlZmluZSBaTV9DTURfRlJFUVVFTkNZICAgIDB4MzAKKyNkZWZpbmUgWk1fQ01EX1JGX0lOSVQgICAgICAweDMxCisjZGVmaW5lIFpNX0NNRF9TWU5USCAgICAgICAgMHgzMgorI2RlZmluZSBaTV9DTURfRlJFUV9TVFJBVCAgIDB4MzMKKyNkZWZpbmUgWk1fQ01EX1JFU0VUICAgICAgICAweDkwCisjZGVmaW5lIFpNX0NNRF9ES1JFU0VUICAgICAgMHg5MQorI2RlZmluZSBaTV9DTURfREtUWF9TVEFUVVMgIDB4OTIKKyNkZWZpbmUgWk1fQ01EX0ZEQyAgICAgICAgICAweEEwCisjZGVmaW5lIFpNX0NNRF9XUkVFUFJPTSAgICAgMHhCMAorI2RlZmluZSBaTV9DTURfV0ZMQVNIICAgICAgIDB4QjAKKyNkZWZpbmUgWk1fQ01EX0ZMQVNIX0VSQVNFICAweEIxCisjZGVmaW5lIFpNX0NNRF9GTEFTSF9QUk9HICAgMHhCMgorI2RlZmluZSBaTV9DTURfRkxBU0hfQ0hLU1VNIDB4QjMKKyNkZWZpbmUgWk1fQ01EX0ZMQVNIX1JFQUQgICAweEI0CisjZGVmaW5lIFpNX0NNRF9GV19ETF9JTklUICAgMHhCNQorI2RlZmluZSBaTV9DTURfTUVNX1dSRUVQUk9NIDB4QkIKKworCisvKiBkdXBsaWNhdGUgZmlsdGVyIHRhYmxlIGNvbHVtbiAqLworI2RlZmluZSBaTV9GSUxURVJfVEFCTEVfQ09MICAgICAgICAgICAgICAgICAyIC8qIDJebiAqLworLyogZHVwbGljYXRlIGZpbHRlciB0YWJsZSBSb3cgKi8KKyNkZWZpbmUgWk1fRklMVEVSX1RBQkxFX1JPVyAgICAgICAgICAgICAgICAgOCAvKiAyXm4gKi8KKworLyogZHVwbGljYXRlIGZpbHRlciB0YWJsZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB6c1J4RmlsdGVyCit7CisgICAgdTE2X3QgYWRkclszXTsKKyAgICB1MTZfdCBzZXE7CisgICAgdThfdCB1cDsKK307CisKK3N0cnVjdCB6c1dsYW5EZXYKK3sKKyAgICAvKiBBUCBnbG9iYWwgdmFyaWFibGVzICovCisgICAgc3RydWN0IHpzV2xhbkRldkFwIGFwOworICAgIC8qIFNUQSBnbG9iYWwgdmFyaWFibGVzICovCisgICAgc3RydWN0IHpzV2xhbkRldlN0YSBzdGE7CisgICAgLyogc2F2ZSB3cmFwcGVyIHNldHRpbmcgKi8KKyAgICBzdHJ1Y3QgenNXcmFwcGVyU2V0dGluZyB3czsKKyAgICAvKiBmZWF0dXJlcyBkZXRlcm1pbmVkIGJ5IHdyYXBwZXIgKHZlbmRvcikgKi8KKyAgICBzdHJ1Y3QgenNXcmFwcGVyRmVhdHVyZUN0cmwgd2ZjOworICAgIC8qIFRyYWZmaWMgTW9uaXRvciB0YWxseSAqLworICAgIHN0cnVjdCB6c1RyYWZUYWxseSB0cmFmVGFsbHk7CisgICAgLyogQ29tbXVuaWNhdGlvbiB0YWxseSAqLworICAgIHN0cnVjdCB6c0NvbW1UYWxseSBjb21tVGFsbHk7CisgICAgLyogRHVwbGljYXRlIGZyYW1lIGZpbHRlciB0YWJsZSAqLworICAgIHN0cnVjdCB6c1J4RmlsdGVyIHJ4RmlsdGVyVGJsW1pNX0ZJTFRFUl9UQUJMRV9DT0xdW1pNX0ZJTFRFUl9UQUJMRV9ST1ddOworICAgIC8qIFJlZ3VsYXRvcnkgdGFibGUgKi8KKyAgICBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUgIHJlZ3VsYXRpb25UYWJsZTsKKworICAgIC8qICovCisgICAgc3RydWN0IHpzV2xhbkRldkZyZXFDb250cm9sIGZyZXFDdHJsOworCisgICAgZW51bSBkZXZTdGF0ZSBzdGF0ZTsKKworICAgIHU4X3QgIGhhbFN0YXRlOworICAgIHU4X3QgIHdsYW5Nb2RlOyAgICAgICAgIC8qIEFQL0lORlJBU1RSVUNUVVJFL0lCU1MvUFNFVURPICovCisgICAgdTE2X3QgbWFjQWRkclszXTsgICAgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICB1MTZfdCBiZWFjb25JbnRlcnZhbDsgICAvKiBiZWFjb24gSW50ZXJ2YWwgKi8KKyAgICB1OF90IGR0aW07ICAgICAgICAgICAgICAvKiBEVElNIHBlcmlvZCAqLworICAgIHU4X3QgICAgICAgICAgICBDdXJyZW50RHRpbUNvdW50OworICAgIHU4X3QgIHByZWFtYmxlVHlwZTsKKyAgICB1OF90ICBwcmVhbWJsZVR5cGVJblVzZWQ7CisgICAgdThfdCAgbWF4VHhQb3dlcjI7CSAgICAvKiAyLjQgR0h6IE1heCBUeCBwb3dlciAoVW5pdDogMC41IGRCbSkgKi8KKyAgICB1OF90ICBtYXhUeFBvd2VyNTsJICAgIC8qIDUgR0h6IE1heCBUeCBwb3dlciAoVW5pdDogMC41IGRCbSkgKi8KKyAgICB1OF90ICBjb25uZWN0TW9kZTsKKyAgICB1MzJfdCBzdXBwb3J0TW9kZTsKKworICAgIHU4X3QgYlJhdGU7ICAgICAgICAgICAgIC8qIDExYiBTdXBwb3J0IFJhdGUgYml0IG1hcCAqLworICAgIHU4X3QgYlJhdGVCYXNpYzsgICAgICAgIC8qIDExYiBCYXNpYyBSYXRlIGJpdCBtYXAgKi8KKyAgICB1OF90IGdSYXRlOyAgICAgICAgICAgICAvKiAxMWcgU3VwcG9ydCBSYXRlIGJpdCBtYXAgKi8KKyAgICB1OF90IGdSYXRlQmFzaWM7ICAgICAgICAvKiAxMWcgQmFzaWMgUmF0ZSBiaXQgbWFwICovCisgICAgLyogY2hhbm5lbCBpbmRleCBwb2ludCB0byB0aGUgaXRlbSBpbiByZWd1bGF0aW9uIHRhYmxlICovCisgICAgdThfdCBjaGFubmVsSW5kZXg7CisKKyAgICAvKiBjaGFubmVsIG1hbmFnZW1lbnQgKi8KKyAgICB1OF90ICAgIEJhbmRXaWR0aDQwOworICAgIHU4X3QgICAgRXh0T2Zmc2V0OyAgICAgIC8vMSBhYm92ZSwgMyBiZWxvdywgMCBub3QgcHJlc2VudAorICAgIHUxNl90ICAgZnJlcXVlbmN5OyAgICAgIC8qIG9wZXJhdGlvbiBmcmVxdWVuY3kgKi8KKworICAgIHU4X3QgZXJwRWxlbWVudDsgICAgICAgIC8qIEVSUCBpbmZvcm1hdGlvbiBlbGVtZW50IGRhdGEgKi8KKworICAgIHU4X3QgZGlzYWJsZVNlbGZDdHM7ICAgIC8qIHNldCB0byAxIHRvIGRpc2FibGUgU2VsZi1DVFMgKi8KKyAgICB1OF90IGJnTW9kZTsKKworCS8qIHByaXZhdGUgdGVzdCBmbGFnICovCisgICAgdTMyX3QgZW5hYmxlUHJvdGVjdGlvbk1vZGU7ICAgLyogZm9yY2UgZW5hYmxlL2Rpc2FibGUgc2VsZiBjdHMgKi8KKwl1MzJfdCBjaGVja3N1bVRlc3Q7ICAgICAvKiBPVFVTIGNoZWNrc3VtIHRlc3QgMT0+emVybyBjaGVja3N1bSAwPT5ub3JtYWwgKi8KKwl1MzJfdCByeFBhY2tldER1bXA7ICAgICAvKiByeCBwYWNrZXQgZHVtcCAqLworCisgICAgdThfdCBlbmFibGVBZ2dyZWdhdGlvbjsgLyogZm9yY2UgZW5hYmxlL2Rpc2FibGUgQS1NU1BVICovCisgICAgdThfdCBlbmFibGVXRFM7ICAgICAgICAgLyogZm9yY2UgZW5hYmxlL2Rpc2FibGUgV0RTIHRlc3RpbmcgKi8KKwl1OF90IGVuYWJsZVR4UGF0aE1vZGU7ICAvKiBPVFVTIHNwZWNpYWwgdGVzdGluZyBtb2RlIDE9PmRpYWJsZSwgMD0+ZW5hYmxlOiBaTV9TWVNURU1fVEVTVF9NT0RFICovCisgICAgdThfdCBlbmFibGVIQUxEYmdJbmZvOyAgLyogICovCisKKyAgICB1MzJfdCBmb3JjZVR4VFBDOyAgICAgICAvKiBmb3JjZSB0eCBwYWNrZXQgc2VuZCBUUEMgKi8KKworICAgIHUxNl90IHNlcVs0XTsKKyAgICB1MTZfdCBtbXNlcTsKKworICAgIC8qIGRyaXZlciBjb3JlIHRpbWUgdGljayAqLworICAgIHUzMl90IHRpY2s7CisgICAgdTE2X3QgdGlja0lic3NTZW5kQmVhY29uOworICAgIHUxNl90IHRpY2tJYnNzUmVjZWl2ZUJlYWNvbjsKKworICAgIC8qIFJUUyB0aHJlc2hvbGQgKi8KKyAgICB1MTZfdCBydHNUaHJlc2hvbGQ7CisKKyAgICAvKiBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCwgIDI1NiA8PSB2YWx1ZSA8PSAyMzQ2LCAwPWRpc2FibGVkICovCisgICAgdTE2X3QgZnJhZ1RocmVzaG9sZDsKKworICAgIC8qIFR4IFJhdGUgKi8KKyAgICB1MTZfdCB0eE1DUzsKKyAgICB1MTZfdCB0eE1UOworICAgIHUzMl90IEN1cnJlbnRUeFJhdGVLYnBzOyAvL0NXWWFuZygrKQorICAgIC8qIFJ4IFJhdGUgKi8KKyAgICB1MzJfdCBDdXJyZW50UnhSYXRlS2JwczsgLy9KYW5ldCgrKQorICAgIHU4X3QgQ3VycmVudFJ4UmF0ZVVwZGF0ZWQ7CisgICAgdThfdCBtb2R1bGF0aW9uVHlwZTsKKyAgICB1OF90IHJ4SW5mbzsKKyAgICB1MTZfdCByYXRlRmllbGQ7CisKKyAgICAvKiB0aW1lciByZWxhdGVkIG9iamVjdHMgKi8KKyAgICBzdHJ1Y3QgenNUaW1lckxpc3QgIHRpbWVyTGlzdDsKKyAgICB1OF90ICAgICAgICAgICAgICAgIGJUaW1lclJlYWR5OworCisgICAgLyogZm9yIGRlZnJhZ21lbnRhdGlvbiAqLworICAgIHN0cnVjdCB6c0RlZnJhZ0xpc3QgZGVmcmFnVGFibGU7CisKKyAgICAvKiBEYXRhIHN0cnVjdCBmb3IgSW50ZXJmYWNlIERlcGVuZGVudCBMYXllciAqLworICAgIC8vc3RydWN0IHpzSWRsU3RydWN0IGlkbFN0cnVjdDsKKworICAgIC8qIFNpZ25hbCBTdHJlbmd0aC9RdWFsaXR5IFJlbGF0ZWQgUGFyYW1ldGVycyAqLworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGg7IC8vQ1dZYW5nKCspCisgICAgdThfdCBTaWduYWxRdWFsaXR5OyAgLy9DV1lhbmcoKykKKworCisKKyAgICAvKiBRb1MgKi8KKyAgICB6YnVmX3QqIHZ0eHFbNF1bWk1fVlRYUV9TSVpFXTsKKyAgICB1MTZfdCB2dHhxSGVhZFs0XTsKKyAgICB1MTZfdCB2dHhxVGFpbFs0XTsKKyAgICB1MTZfdCBxb3NEcm9wSXBGcmFnWzRdOworCisgICAgLyogTWFuYWdlbWVudCBUeCBxdWV1ZSAqLworICAgIHpidWZfdCogdm1tcVtaTV9WTU1RX1NJWkVdOworICAgIHUxNl90IHZtbXFIZWFkOworICAgIHUxNl90IHZtbXFUYWlsOworCisgICAgdThfdCAgICAgICAgICAgICAgICB2dHhxUHVzaGluZzsKKworICAgIC8qCisgICAgICogYWRkIGJ5IGhvbmRhCisgICAgICogMS4gQWdncmVnYXRlIHF1ZXVlcworICAgICAqIDIuIFNUQSdzIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIHF1ZXVlIG51bWJlcgorICAgICAqIDMuIHJ4IGFnZ3JlZ2F0aW9uIHJlLW9yZGVyaW5nIHF1ZXVlCisgICAgICovCisgICAgc3RydWN0IGFnZ1F1ZXVlICAgICphZ2dRUG9vbFtaTV9BR0dfUE9PTF9TSVpFXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgIGFnZ0luaXRpYXRlZDsKKyAgICB1OF90ICAgICAgICAgICAgICAgIGFkZGJhQ29tcGxldGU7CisgICAgdThfdCAgICAgICAgICAgICAgICBhZGRiYUNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgYWdnU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICBkZXN0TG9jazsKKyAgICBzdHJ1Y3QgYWdnU3RhICAgICAgIGFnZ1N0YVtaTV9NQVhfU1RBX1NVUFBPUlRdOworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICAqdGlkX3J4W1pNX0FHR19QT09MX1NJWkVdOworICAgIHN0cnVjdCBhZ2dUYWxseSAgICAgYWdnX3RhbDsKKyAgICBzdHJ1Y3QgZGVzdFEgICAgICAgIGRlc3RROworICAgIHN0cnVjdCBiYXdfZW5hYmxlciAqYmF3X2VuYWJsZXI7CisgICAgc3RydWN0IGllZWU4MDIxMV9jd20gICAgY3dtOworICAgIHUxNl90ICAgICAgICAgICAgICAgcmVvcmRlcjsKKyAgICB1MTZfdCAgICAgICAgICAgICAgIHNlcV9kZWJ1ZzsKKyAgICAvKiByYXRlIGNvbnRyb2wgKi8KKyAgICB1MzJfdCB0eE1QRFVbWk1fUkFURV9UQUJMRV9TSVpFXTsKKyAgICB1MzJfdCB0eEZhaWxbWk1fUkFURV9UQUJMRV9TSVpFXTsKKyAgICB1MzJfdCBQRVJbWk1fUkFURV9UQUJMRV9TSVpFXTsKKyAgICB1MTZfdCBwcm9iZUNvdW50OworICAgIHUxNl90IHByb2JlU3VjY2Vzc0NvdW50OworICAgIHUxNl90IHByb2JlSW50ZXJ2YWw7CisgICAgdTE2X3Qgc3VjY2Vzc19wcm9iaW5nOworICAgIC8qCisgICAgICogZW5kIG9mIGFkZCBieSBob25kYQorICAgICAqLworCisgICAgLyogYWlyb3BlZWsgc25pZmZlciBtb2RlIGZvciB1cHBlciBzdyAqLworICAgIHUzMl90ICAgICAgICAgICAgICAgc3dTbmlmZmVyOyAgIC8qIHdpbmRvdzogYWlyb1BlZWsgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgIFhMaW5rTW9kZTsKKworICAgIC8qIE1ESyBtb2RlICovCisgICAgLyogaW5pdCBieSAwPT5ub3JtYWwgZHJpdmVyIDE9Pk1ESyBkcml2ZXIgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgIG1vZGVNREtFbmFibGU7CisKKyAgICB1MzJfdCAgICAgICAgICAgICAgIGhlYXJ0QmVhdE5vdGlmaWNhdGlvbjsKKworICAgIC8qIHBvaW50ZXIgZm9yIEhBTCBQbHVzIHByaXZhdGUgbWVtb3J5ICovCisgICAgdm9pZCogaHBQcml2YXRlOworCisgICAgLyogZm9yIFdQQSBzZXR0aW5nICovCisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICB3cGFTdXBwb3J0W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICAvL3U4X3QgICAgICAgICAgICAgICAgICAgIHdwYUxlbltaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICB3cGFJZVtaTV9NQVhfQVBfU1VQUE9SVF1bWk1fTUFYX0lFX1NJWkVdOworCisgICAgc3RydWN0IHpzTGVkU3RydWN0ICAgICAgbGVkU3RydWN0OworCisgICAgLyogYW5pIGZsYWcgKi8KKyAgICB1OF90IGFuaUVuYWJsZTsKKyAgICB1MTZfdCB0eHFfdGhyZXNob2xkOworCisJLy9Ta2lwIE1pYyBFcnJvciBDaGVjaworCXU4X3QJVEtJUF9Hcm91cF9LZXlDaGFuZ2luZzsKKworCXU4X3QgICAgZHluYW1pY1NJRlNFbmFibGU7CisKKwl1OF90ICAgIHF1ZXVlRmx1c2hlZDsKKworICAgIHUxNl90ICgqemZjYkF1dGhOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkcik7CisgICAgdTE2X3QgKCp6ZmNiQXNvY05vdGlmeSkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCk7CisgICAgdTE2X3QgKCp6ZmNiRGlzQXNvY05vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpOworICAgIHUxNl90ICgqemZjYkFwQ29ubmVjdE5vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpOworICAgIHZvaWQgKCp6ZmNiQ29ubmVjdE5vdGlmeSkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgdTE2X3QqIGJzc2lkKTsKKyAgICB2b2lkICgqemZjYlNjYW5Ob3RpZnkpKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTY2FuUmVzdWx0KiByZXN1bHQpOworICAgIHZvaWQgKCp6ZmNiTWljRmFpbHVyZU5vdGlmeSkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0dXMpOworICAgIHZvaWQgKCp6ZmNiQXBNaWNGYWlsdXJlTm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogYWRkciwgemJ1Zl90KiBidWYpOworICAgIHZvaWQgKCp6ZmNiSWJzc1BhcnRuZXJOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpOworICAgIHZvaWQgKCp6ZmNiTWFjQWRkcmVzc05vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworICAgIHZvaWQgKCp6ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbikoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYlJlY3ZFdGgpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JSZWN2ODAyMTEpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKyAgICB2b2lkICgqemZjYlJlc3RvcmVCdWZEYXRhKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdTE2X3QgKCp6ZmNiQ2VuY0Fzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgdThfdCAoKnpmY2JDbGFzc2lmeVR4UGFja2V0KSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworICAgIHZvaWQgKCp6ZmNiSHdXYXRjaERvZ05vdGlmeSkoemRldl90KiBkZXYpOworfTsKKworCitzdHJ1Y3QgenNXbGFuS2V5Cit7CisgICAgdThfdCBrZXk7Cit9OworCisKKy8qIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisvKiBQbGVhc2UgbGVhdmUgdGhlbSBhbG9uZSAqLworLyogRm9yIFR4IHBhY2tldCBhbGxvY2F0ZWQgaW4gdXBwZXIgbGF5ZXIgbGF5ZXIgKi8KKyNkZWZpbmUgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpCisjZGVmaW5lIHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkgem13X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisjZGVmaW5lIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKKworLyogRm9yIFJ4IHBhY2tldCBhbGxvY2F0ZWQgaW4gZHJpdmVyICovCisjZGVmaW5lIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkKKyNkZWZpbmUgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9TVFJVQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3dsYW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS93bGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjMThiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS93bGFuLmgKQEAgLTAsMCArMSw1OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdsYW5fZGVmcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgV0xBTiBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfV0xBTl9ICisjZGVmaW5lIF9XTEFOX0gKKworCisjZGVmaW5lIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSU5URVJOQUxfQUxMT0NfQlVGICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFpNX1NJWkVfT0ZfQ1RSTF9TRVQgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fU0laRV9PRl9JViAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9TSVpFX09GX0VYVF9JViAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1NJWkVfT0ZfTUlDICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fU0laRV9PRl9DQ1hfTUlDICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIgICAgICAgICAyNAorI2RlZmluZSBaTV9TSVpFX09GX1FPU19DVFJMICAgICAgICAgICAgICAgICAyCisKKy8qIEhlYWRlciBkZWZpbml0aW9uICovCisjZGVmaW5lIFpNX1NJWkVfT0ZfV0xBTl9XRFNfSEVBREVSICAgICAgICAgIDMyCisjZGVmaW5lIFpNX1NJWkVfT0ZfU05BUF9IRUFERVIgICAgICAgICAgICAgIDgKKworI2RlZmluZSBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCAgICAgICAgICAgIDEwCisjZGVmaW5lIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCAgICAgICAgICAgIDE2CisjZGVmaW5lIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCAgICAgICAgICAgIDI0CisjZGVmaW5lIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCAgICAgICAgICAgIDI0CisjZGVmaW5lIFpNX1NJWkVfT0ZfV0xBTl9EQVRBX0hFQURFUiAgICAgICAgIDI0CisKKy8qIFBvcnQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBaTV9QT1JUX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1BPUlRfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgIDEKKworLyogRnJhbWUgVHlwZSAqLworI2RlZmluZSBaTV9XTEFOX01BTkFHRU1FTlRfRlJBTUUgICAgICAgICAgICAweDAKKyNkZWZpbmUgWk1fV0xBTl9DT05UUk9MX0ZSQU1FICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIFpNX1dMQU5fREFUQV9GUkFNRSAgICAgICAgICAgICAgICAgIDB4OAorCisvKiBGcmFtZSBTdWJ0eXBlICovCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUkVRICAgICAgICAgIDB4MDAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgICAgICAgICAgMHgxMAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUkVRICAgICAgICAweDIwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgICAgICAgIDB4MzAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRICAgICAgICAgMHg0MAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgICAgICAgICAweDUwCisvKiAweDYwLCAweDcwID0+IFJlc2VydmVkICovCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9CRUFDT04gICAgICAgICAgIDB4ODAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU0gICAgICAgICAgICAgMHg5MAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyAgICAgICAgICAweEEwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9BVVRIICAgICAgICAgICAgIDB4QjAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCAgICAgICAgICAgMHhDMAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OCQkJMHhEMAorCisvKiBGcmFtZSB0eXBlIGFuZCBzdWJ0eXBlICovCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9OVUxMICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0JBUiAgICAgICAgICAgICAgMHg4NAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkEgICAgICAgICAgICAgICAweDk0CisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9QU1BPTEwgICAgICAgICAgIDB4QTQKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX1JUUyAgICAgICAgICAgICAgMHhCNAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQ1RTICAgICAgICAgICAgICAweEM0CisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCAgICAgICAgIDB4QzgKKworLyogYWN0aW9uIGZyYW1lICovCisjZGVmaW5lIFpNX1dMQU5fU1BFQ1RSVU1fTUFOQUdFTUVOVF9BQ1RJT05fRlJBTUUgICAgMAorI2RlZmluZSBaTV9XTEFOX1FPU19BQ1RJT05fRlJBTUUgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1dMQU5fRExTX0FDVElPTl9GUkFNRSAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FICAgICAgMworLyogYmxvY2sgYWNrIGFjdGlvbiBmcmFtZSovCisjZGVmaW5lIFpNX1dMQU5fQUREQkFfUkVRVUVTVF9GUkFNRSAgICAgICAgIDAKKyNkZWZpbmUgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRSAgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX0RFTEJBX0ZSQU1FICAgICAgICAgICAgICAgICAyCisKKy8qIEVsZW1lbnQgSUQgKi8KKyNkZWZpbmUgWk1fV0xBTl9FSURfU1NJRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1dMQU5fRUlEX0ZIICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fV0xBTl9FSURfRFMgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9XTEFOX0VJRF9DRlMgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1dMQU5fRUlEX1RJTSAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWk1fV0xBTl9FSURfSUJTUyAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaTV9XTEFOX0VJRF9DT1VOVFJZICAgICAgICAgICAgICAgICA3CisvKiByZXNlcnZlZCA4LTE1ICovCisjZGVmaW5lIFpNX1dMQU5fRUlEX0NIQUxMRU5HRSAgICAgICAgICAgICAgIDE2CisvKiByZXNlcnZlZCAxNy0zMSAqLworI2RlZmluZSBaTV9XTEFOX0VJRF9QT1dFUl9DT05TVFJBSU5UICAgICAgICAzMgorI2RlZmluZSBaTV9XTEFOX0VJRF9QT1dFUl9DQVBBQklMSVRZICAgICAgICAzMworI2RlZmluZSBaTV9XTEFOX0VJRF9UUENfUkVRVUVTVCAgICAgICAgICAgICAzNAorI2RlZmluZSBaTV9XTEFOX0VJRF9UUENfUkVQT1JUICAgICAgICAgICAgICAzNQorI2RlZmluZSBaTV9XTEFOX0VJRF9TVVBQT1JURURfQ0hBTk5FTFMgICAgICAzNgorI2RlZmluZSBaTV9XTEFOX0VJRF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRSAzNworI2RlZmluZSBaTV9XTEFOX0VJRF9NRUFTVVJFTUVOVF9SRVFVRVNUICAgICAzOAorI2RlZmluZSBaTV9XTEFOX0VJRF9NRUFTVVJFTUVOVF9SRVBPUlQgICAgICAzOQorI2RlZmluZSBaTV9XTEFOX0VJRF9RVUlFVCAgICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBaTV9XTEFOX0VJRF9JQlNTX0RGUyAgICAgICAgICAgICAgICA0MQorI2RlZmluZSBaTV9XTEFOX0VJRF9FUlAgICAgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkgICAgICA0NQorI2RlZmluZSBaTV9XTEFOX0VJRF9SU05fSUUgICAgICAgICAgICAgICAgICA0OAorI2RlZmluZSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFICAgICAgICAgICA1MAorI2RlZmluZSBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZICAgICAgICAgICA1MQorI2RlZmluZSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZICA1MgorI2RlZmluZSBaTV9XTEFOX0VJRF9ORVdfRVhUX0NIQU5ORUxfT0ZGU0VUICA1MworI2RlZmluZSBaTV9XTEFOX1BSRU4yX0VJRF9IVElORk9STUFUSU9OICAgICA2MQorI2RlZmluZSBaTV9XTEFOX1BSRU4yX0VJRF9TRUNPTkRDSE9GRlNFVCAgICA2MgorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX1dMQU5fRUlEX0NFTkNfSUUgICAgICAgICAgICAgICAgIDY4CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSAgICAgICAgICAyMjEgICAgIC8qIFZlbmRvciBwcml2YXRlIHNwYWNlOyBtdXN0IGRlbXV4IE9VSSAqLworI2RlZmluZSBaTV9XTEFOX0VJRF9XUEFfSUUgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgWk1fV0xBTl9FSURfV1BTX0lFICAgICAgICAgICAgICAgICAgMjIxCisjZGVmaW5lIFpNX1dMQU5fRUlEX1dJRklfSUUgICAgICAgICAgICAgICAgIDIyMQorCisvKiBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBaTV9XTEFOX05PTl9FUlBfUFJFU0VOVF9CSVQgICAgICAgICAweDEKKyNkZWZpbmUgWk1fV0xBTl9VU0VfUFJPVEVDVElPTl9CSVQgICAgICAgICAgMHgyCisjZGVmaW5lIFpNX1dMQU5fQkFSS0VSX1BSRUFNQkxFX01PREVfQklUICAgIDB4NAorCisvKiBDaGFubmVsIGZyZXF1ZW5jeSwgaW4gTUh6ICovCisjZGVmaW5lIFpNX0NIX0dfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMjQxMgorI2RlZmluZSBaTV9DSF9HXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MTcKKyNkZWZpbmUgWk1fQ0hfR18zICAgICAgICAgICAgICAgICAgICAgICAgICAyNDIyCisjZGVmaW5lIFpNX0NIX0dfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMjQyNworI2RlZmluZSBaTV9DSF9HXzUgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MzIKKyNkZWZpbmUgWk1fQ0hfR182ICAgICAgICAgICAgICAgICAgICAgICAgICAyNDM3CisjZGVmaW5lIFpNX0NIX0dfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ0MgorI2RlZmluZSBaTV9DSF9HXzggICAgICAgICAgICAgICAgICAgICAgICAgIDI0NDcKKyNkZWZpbmUgWk1fQ0hfR185ICAgICAgICAgICAgICAgICAgICAgICAgICAyNDUyCisjZGVmaW5lIFpNX0NIX0dfMTAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ1NworI2RlZmluZSBaTV9DSF9HXzExICAgICAgICAgICAgICAgICAgICAgICAgIDI0NjIKKyNkZWZpbmUgWk1fQ0hfR18xMiAgICAgICAgICAgICAgICAgICAgICAgICAyNDY3CisjZGVmaW5lIFpNX0NIX0dfMTMgICAgICAgICAgICAgICAgICAgICAgICAgMjQ3MgorI2RlZmluZSBaTV9DSF9HXzE0ICAgICAgICAgICAgICAgICAgICAgICAgIDI0ODQKKyNkZWZpbmUgWk1fQ0hfQV8xODQgICAgICAgICAgICAgICAgICAgICAgICA0OTIwCisjZGVmaW5lIFpNX0NIX0FfMTg4ICAgICAgICAgICAgICAgICAgICAgICAgNDk0MAorI2RlZmluZSBaTV9DSF9BXzE5MiAgICAgICAgICAgICAgICAgICAgICAgIDQ5NjAKKyNkZWZpbmUgWk1fQ0hfQV8xOTYgICAgICAgICAgICAgICAgICAgICAgICA0OTgwCisjZGVmaW5lIFpNX0NIX0FfOCAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0MAorI2RlZmluZSBaTV9DSF9BXzEyICAgICAgICAgICAgICAgICAgICAgICAgIDUwNjAKKyNkZWZpbmUgWk1fQ0hfQV8xNiAgICAgICAgICAgICAgICAgICAgICAgICA1MDgwCisjZGVmaW5lIFpNX0NIX0FfMzYgICAgICAgICAgICAgICAgICAgICAgICAgNTE4MAorI2RlZmluZSBaTV9DSF9BXzQwICAgICAgICAgICAgICAgICAgICAgICAgIDUyMDAKKyNkZWZpbmUgWk1fQ0hfQV80NCAgICAgICAgICAgICAgICAgICAgICAgICA1MjIwCisjZGVmaW5lIFpNX0NIX0FfNDggICAgICAgICAgICAgICAgICAgICAgICAgNTI0MAorI2RlZmluZSBaTV9DSF9BXzUyICAgICAgICAgICAgICAgICAgICAgICAgIDUyNjAKKyNkZWZpbmUgWk1fQ0hfQV81NiAgICAgICAgICAgICAgICAgICAgICAgICA1MjgwCisjZGVmaW5lIFpNX0NIX0FfNjAgICAgICAgICAgICAgICAgICAgICAgICAgNTMwMAorI2RlZmluZSBaTV9DSF9BXzY0ICAgICAgICAgICAgICAgICAgICAgICAgIDUzMjAKKyNkZWZpbmUgWk1fQ0hfQV8xMDAgICAgICAgICAgICAgICAgICAgICAgICA1NTAwCisjZGVmaW5lIFpNX0NIX0FfMTA0ICAgICAgICAgICAgICAgICAgICAgICAgNTUyMAorI2RlZmluZSBaTV9DSF9BXzEwOCAgICAgICAgICAgICAgICAgICAgICAgIDU1NDAKKyNkZWZpbmUgWk1fQ0hfQV8xMTIgICAgICAgICAgICAgICAgICAgICAgICA1NTYwCisjZGVmaW5lIFpNX0NIX0FfMTE2ICAgICAgICAgICAgICAgICAgICAgICAgNTU4MAorI2RlZmluZSBaTV9DSF9BXzEyMCAgICAgICAgICAgICAgICAgICAgICAgIDU2MDAKKyNkZWZpbmUgWk1fQ0hfQV8xMjQgICAgICAgICAgICAgICAgICAgICAgICA1NjIwCisjZGVmaW5lIFpNX0NIX0FfMTI4ICAgICAgICAgICAgICAgICAgICAgICAgNTY0MAorI2RlZmluZSBaTV9DSF9BXzEzMiAgICAgICAgICAgICAgICAgICAgICAgIDU2NjAKKyNkZWZpbmUgWk1fQ0hfQV8xMzYgICAgICAgICAgICAgICAgICAgICAgICA1NjgwCisjZGVmaW5lIFpNX0NIX0FfMTQwICAgICAgICAgICAgICAgICAgICAgICAgNTcwMAorI2RlZmluZSBaTV9DSF9BXzE0OSAgICAgICAgICAgICAgICAgICAgICAgIDU3NDUKKyNkZWZpbmUgWk1fQ0hfQV8xNTMgICAgICAgICAgICAgICAgICAgICAgICA1NzY1CisjZGVmaW5lIFpNX0NIX0FfMTU3ICAgICAgICAgICAgICAgICAgICAgICAgNTc4NQorI2RlZmluZSBaTV9DSF9BXzE2MSAgICAgICAgICAgICAgICAgICAgICAgIDU4MDUKKyNkZWZpbmUgWk1fQ0hfQV8xNjUgICAgICAgICAgICAgICAgICAgICAgICA1ODI1CisKKworLyogQVAgOiBTVEEgdGFibGUgPT4gU1RBIFR5cGUgKi8KKyNkZWZpbmUgWk1fMTFCX1NUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFpNXzExR19TVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBaTV8xMU5fU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKworLyogQVAgOiB0aW1lb3V0ICovCisjZGVmaW5lIFpNX01TX1BFUl9USUNLICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFpNX1RJQ0tfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICgxMDAwL1pNX01TX1BFUl9USUNLKQorI2RlZmluZSBaTV9USUNLX1BFUl9NSU5VVEUgICAgICAgICAgICAgICAgICAoNjAqMTAwMC9aTV9NU19QRVJfVElDSykKKyNkZWZpbmUgWk1fUFJFQVVUSF9USU1FT1VUX01TICAgICAgICAgICAgICAgMTAwMCAvKiAxIHNlYyAqLworI2RlZmluZSBaTV9BVVRIX1RJTUVPVVRfTVMgICAgICAgICAgICAgICAgICAxMDAwIC8qIDEgc2VjICovCisKKy8qIEVycm9yIGNvZGUgKi8KKyNkZWZpbmUgWk1fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9FUlJfVFhfUE9SVF9ESVNBQkxFRCAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0VSUl9CVUZGRVJfRE1BX0FERFIgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fRVJSX0ZSRUVfVFhEX0VYSEFVU1RFRCAgICAgICAgICAgMworI2RlZmluZSBaTV9FUlJfVFhfQlVGRkVSX1VOQVZBSUxBQkxFICAgICAgICA0CisjZGVmaW5lIFpNX0VSUl9CQ01DX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSAgIDUKKyNkZWZpbmUgWk1fRVJSX1VOSV9QU19CVUZGRVJfVU5BVkFJTEFCTEUgICAgNgorI2RlZmluZSBaTV9FUlJfRVhDRUVEX1BSSU9SSVRZX1RIUkVTSE9MRCAgICA3CisjZGVmaW5lIFpNX0VSUl9WTU1RX0ZVTEwgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fRVJSX0ZMVVNIX1BTX1FVRVVFICAgICAgICAgICAgICAgOQorI2RlZmluZSBaTV9FUlJfQ01EX0lOVF9NSVNTRUQgICAgICAgICAgICAgICAxNSAvKiBQb2xsaW5nIGNtZCBpbnQgdGltZW91dCovCisvKiBSeCAqLworI2RlZmluZSBaTV9FUlJfUlhfRlJBTUVfVFlQRSAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBaTV9FUlJfTUlOX1JYX0VOQ1JZUFRfRlJBTUVfTEVOR1RIICAyMQorI2RlZmluZSBaTV9FUlJfTUlOX1JYX0ZSQU1FX0xFTkdUSCAgICAgICAgICAyMgorI2RlZmluZSBaTV9FUlJfTUFYX1JYX0ZSQU1FX0xFTkdUSCAgICAgICAgICAyMworI2RlZmluZSBaTV9FUlJfUlhfRFVQTElDQVRFICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBaTV9FUlJfUlhfU1JDX0FERFJfSVNfT1dOX01BQyAgICAgICAyNQorI2RlZmluZSBaTV9FUlJfTUlOX1JYX1BST1RPQ09MX1ZFUlNJT04gICAgICAyNgorI2RlZmluZSBaTV9FUlJfV1BBX0dLX05PVF9JTlNUQUxMRUQgICAgICAgICAyNworI2RlZmluZSBaTV9FUlJfU1RBX05PVF9BU1NPQ0lBVEVEICAgICAgICAgICAyOAorI2RlZmluZSBaTV9FUlJfREFUQV9CRUZPUkVfQ09OTkVDVEVEICAgICAgICAyOQorI2RlZmluZSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEICAgICAgICAgICAzMAorI2RlZmluZSBaTV9FUlJfREFUQV9CU1NJRF9OT1RfTUFUQ0hFRCAgICAgICAzMQorI2RlZmluZSBaTV9FUlJfUlhfQkFSX0ZSQU1FICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBaTV9FUlJfT1VUX09GX09SREVSX05VTExfREFUQSAgICAgICAzMworCisvKiBaRkkgKi8KKyNkZWZpbmUgWk1fRVJSX0lOVkFMSURfVFhfUkFURSAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgWk1fRVJSX1dEU19QT1JUX0lEICAgICAgICAgICAgICAgICAgNDEKKworLyogUVVFVUUgKi8KKyNkZWZpbmUgWk1fRVJSX1FVRVVFX0ZVTEwgICAgICAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgWk1fRVJSX1NUQV9VQVBTRF9RVUVVRV9GVUxMICAgICAgICAgNTEKKyNkZWZpbmUgWk1fRVJSX0FQX1VBUFNEX1FVRVVFX0ZVTEwgICAgICAgICAgNTIKKworLyogTWF4aW11bSBSeCBmcmFtZSBsZW5ndGggKi8KKyNpZiBaTV9MQVJHRVBBWUxPQURfVEVTVCA9PSAxCisjZGVmaW5lIFpNX1dMQU5fTUFYX1JYX1NJWkUgICAgICAgICAgICAgICAgIDE2Mzg0CisjZWxzZQorI2RlZmluZSBaTV9XTEFOX01BWF9SWF9TSVpFICAgICAgICAgICAgICAgICA4MTkyCisjZW5kaWYKKworLyogUENJIERNQSB0ZXN0IGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgWk1fRVJSX0lOVEVSUlVQVF9NSVNTRUQgICAgICAgICAgICAgMTAwCisjZGVmaW5lIFpNX0VSUl9PV05fQklUX05PVF9DTEVBUkVEICAgICAgICAgIDEwMQorI2RlZmluZSBaTV9FUlJfUlhfU0VRX05VTUJFUiAgICAgICAgICAgICAgICAxMDIKKyNkZWZpbmUgWk1fRVJSX1JYX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIFpNX0VSUl9SWF9EQVRBICAgICAgICAgICAgICAgICAgICAgIDEwNAorI2RlZmluZSBaTV9FUlJfUlhfREVTQ1JJUFRPUl9OVU0gICAgICAgICAgICAxMDUKKy8qIENvbW1vbiByZWdpc3RlciB0ZXN0IGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgWk1fRVJSX1JFR0lTVEVSX0FDQ0VTUyAgICAgICAgICAgICAgMTEwIC8qIFJlZ2lzdGVyIFIvVyB0ZXN0IGZhaWwqLworI2RlZmluZSBaTV9FUlJfQ0xFQVJfSU5URVJSVVBUX0ZMQUcgICAgICAgICAxMTEKKyNkZWZpbmUgWk1fRVJSX0NPTU1BTkRfUkVTUE9OU0UgICAgICAgICAgICAgMTEyCisjZGVmaW5lIFpNX0VSUl9JTlRFUlJVUFRfR0VORVJBVEUgICAgICAgICAgIDExMworI2RlZmluZSBaTV9FUlJfSU5URVJSVVBUX0FDSyAgICAgICAgICAgICAgICAxMTQKKyNkZWZpbmUgWk1fRVJSX1NDUkFUQ0hfQUNDRVNTICAgICAgICAgICAgICAgMTE1CisjZGVmaW5lIFpNX0VSUl9JTlRFUlJVUFRfTUFTS19BQ0NFU1MgICAgICAgIDExNgorI2RlZmluZSBaTV9FUlJfU0hBUkVfTUVNT1JZX1BDSV9BQ0NFU1MgICAgICAxMTcKKyNkZWZpbmUgWk1fRVJSX1NIQVJFX01FTU9SWV9GV19BQ0NFU1MgICAgICAgMTE4CisjZGVmaW5lIFpNX0VSUl9TSEFSRV9NRU1PUllfRElTQUJMRSAgICAgICAgIDExOQorI2RlZmluZSBaTV9FUlJfU0hBUkVfTUVNT1JZX1RFU1RfUkVTUE9OU0UgICAxMjAKKworLyogRmlybXdhcmUgRG93bmxvYWQgZXJyb3IgY29kZSAqLworI2RlZmluZSBaTV9FUlJfRklSTVdBUkVfRE9XTkxPQURfVElNRU9VVCAgICAxNTAKKyNkZWZpbmUgWk1fRVJSX0ZJUk1XQVJFX0RPV05MT0FEX0lOVF9GTEFHICAgMTUxCisjZGVmaW5lIFpNX0VSUl9GSVJNV0FSRV9SRUFEWV9USU1FT1VUICAgICAgIDE1MgorI2RlZmluZSBaTV9FUlJfRklSTVdBUkVfV1JPTkdfVFlQRSAgICAgICAgICAxNTMKKworLyogRGVidWcgKi8KKyNkZWZpbmUgWk1fTFZfMCAgICAgMC8vRGVidWcgbGV2ZWwgMCwgRGlzYWJsZSBkZWJ1ZyBtZXNzYWdlCisjZGVmaW5lIFpNX0xWXzEgICAgIDEvL0RlYnVnIGxldmVsIDEsIFNob3cgbWluaW11bSBpbmZvcm1hdGlvbgorI2RlZmluZSBaTV9MVl8yICAgICAyLy9EZWJ1ZyBsZXZlbCAyLCBTaG93IG1lZGl1bSBtZXNzYWdlCisjZGVmaW5lIFpNX0xWXzMgICAgIDMvL0RlYnVnIGxldmVsIDMsIFNob3cgYWxsCisKKyNkZWZpbmUgWk1fU0NBTk1TR19MRVYgIFpNX0xWXzEKKyNkZWZpbmUgWk1fVFhNU0dfTEVWICAgIFpNX0xWXzAvL1pNX0xWXzAKKyNkZWZpbmUgWk1fUlhNU0dfTEVWICAgIFpNX0xWXzAKKyNkZWZpbmUgWk1fTU1NU0dfTEVWICAgIFpNX0xWXzAKKyNkZWZpbmUgWk1fREVTTVNHX0xFViAgIFpNX0xWXzAvL1pNX0xWXzAKKyNkZWZpbmUgWk1fQlVGTVNHX0xFViAgIFpNX0xWXzAvL1pNX0xWXzEKKyNkZWZpbmUgWk1fSU5JVE1TR19MRVYgIFpNX0xWXzAKKworI2RlZmluZSB6bV9tc2cwX3NjYW4obHYsIG1zZykgaWYgKFpNX1NDQU5NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX3NjYW4obHYsIG1zZywgdmFsKSBpZiAoWk1fU0NBTk1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9zY2FuKGx2LCBtc2csIHZhbCkgaWYgKFpNX1NDQU5NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgem1fbXNnMF90eChsdiwgbXNnKSBpZiAoWk1fVFhNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX3R4KGx2LCBtc2csIHZhbCkgaWYgKFpNX1RYTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMShtc2csIHZhbCk7fQorI2RlZmluZSB6bV9tc2cyX3R4KGx2LCBtc2csIHZhbCkgaWYgKFpNX1RYTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIHptX21zZzBfcngobHYsIG1zZykgaWYgKFpNX1JYTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV9yeChsdiwgbXNnLCB2YWwpIGlmIChaTV9SWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9yeChsdiwgbXNnLCB2YWwpIGlmIChaTV9SWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzIobXNnLCB2YWwpO30KKworI2RlZmluZSB6bV9tc2cwX21tKGx2LCBtc2cpIGlmIChaTV9NTU1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfbW0obHYsIG1zZywgdmFsKSBpZiAoWk1fTU1NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfbW0obHYsIG1zZywgdmFsKSBpZiAoWk1fTU1NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgem1fbXNnMF9kZXMobHYsIG1zZykgaWYgKFpNX0RFU01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfZGVzKGx2LCBtc2csIHZhbCkgaWYgKFpNX0RFU01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9kZXMobHYsIG1zZywgdmFsKSBpZiAoWk1fREVTTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIHptX21zZzBfYnVmKGx2LCBtc2cpIGlmIChaTV9CVUZNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX2J1ZihsdiwgbXNnLCB2YWwpIGlmIChaTV9CVUZNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfYnVmKGx2LCBtc2csIHZhbCkgaWYgKFpNX0JVRk1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzIobXNnLCB2YWwpO30KKworI2RlZmluZSB6bV9tc2cwX2luaXQobHYsIG1zZykgaWYgKFpNX0lOSVRNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX2luaXQobHYsIG1zZywgdmFsKSBpZiAoWk1fSU5JVE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9pbml0KGx2LCBtc2csIHZhbCkgaWYgKFpNX0lOSVRNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgWk1fTUFYX0FQX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgMiAgLyogTXVzdCA8PSA4ICovCisjZGVmaW5lIFpNX01BWF9XRFNfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDYgIC8qIE11c3QgPD0gNiAqLworI2RlZmluZSBaTV9NQVhfU1RBX1NVUFBPUlQgICAgICAgICAgICAgICAgICAxNiAvKiBNdXN0IDw9IDY0ICovCisKKy8qIFNUQSB0YWJsZSBzdGF0ZSAqLworI2RlZmluZSBaTV9TVEFURV9BVVRIICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NUQVRFX1BSRUFVVEggICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fU1RBVEVfQVNPQyAgICAgICAgICAgICAgICAgICAgICAgMworCisvKiBSYXRlIHNldCAqLworI2RlZmluZSBaTV9SQVRFX1NFVF9DQ0sgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1JBVEVfU0VUX09GRE0gICAgICAgICAgICAgICAgICAgIDEKKworLyogSFQgUFQgKi8KKyNkZWZpbmUgWk1fUFJFQU1CTEVfVFlQRV9NSVhFRF9NT0RFICAgICAgICAgMAorI2RlZmluZSBaTV9QUkVBTUJMRV9UWVBFX0dSRUVOX0ZJRUxEICAgICAgICAxCisKKy8qIEhUIGJhbmR3aWR0aCAqLworI2RlZmluZSBaTV9CQU5EV0lEVEhfMjBNSFogICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX0JBTkRXSURUSF80ME1IWiAgICAgICAgICAgICAgICAgIDEKKworLyogTUlDIHN0YXR1cyAqLworI2RlZmluZSBaTV9NSUNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX01JQ19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogSUNWIHN0YXR1cyAqLworI2RlZmluZSBaTV9JQ1ZfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX0lDVl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogZGVmaW5pdGlvbiBjaGVjayAqLworI2lmIChaTV9NQVhfQVBfU1VQUE9SVCA+IDgpCitkZWZpbml0aW9uIGVycm9yLCBaTV9NQVhfQVBfU1VQUE9SVCA+IDgKKyNlbmRpZgorI2lmIChaTV9NQVhfQVBfU1VQUE9SVCA+IDY0KQorZGVmaW5pdGlvbiBlcnJvciwgWk1fTUFYX1NUQV9TVVBQT1JUID4gNjQKKyNlbmRpZgorCisvKiAgVHJhbnNtaXNzaW9uIFJhdGUgaW5mb3JtYXRpb24gKi8KKworLyogV0xBTiBmcmFtZSBmb3JtYXQgKi8KKyNkZWZpbmUgWk1fUExDUF9IRUFERVJfU0laRSAgICAgICAgICA1CisjZGVmaW5lIFpNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIICAgNgorI2RlZmluZSBaTV9USU1FU1RBTVBfT0ZGU0VUICAgICAgICAgIDAKKyNkZWZpbmUgWk1fQkVBQ09OX0lOVEVSVkFMX09GRlNFVCAgICA4CisjZGVmaW5lIFpNX0NBUEFCSUxJVFlfT0ZGU0VUICAgICAgICAxMAorCisvKiBSZWFzb24gQ29kZSAqLworLyogQW4gdW5zb2xpY2l0ZWQgbm90aWZpY2F0aW9uIG1hbmFnZW1lbnQgZnJhbWUgb2YgICAgICAgKi8KKy8qIHR5cGUgRGlzYXNzb2NhdGlvbiBvciBEZWF1dGhlbnRpY2F0aW9uIHdhcyBnZW5lcmF0ZWQuICovCisjaWZkZWYgWk1fUkVBU09OX0NPREUKKyNkZWZpbmUgWk1fV0xBTl9SRUFTT05fQ09ERV9VTlNQRUNJRklFRCAgIDEKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9ESVNBU09DX0RFQVVUSF9SRUFTT05fQ09ERSAgMjQKKyNlbmRpZgorCitzdHJ1Y3QgenNXbGFuTWFuYWdlbWVudEZyYW1lSGVhZGVyCit7CisgICAgLy91OF90ICAgICAgcGxjcEhkcltaTV9QTENQX0hFQURFUl9TSVpFXTsKKyAgICB1OF90ICAgICAgICBmcmFtZUN0cmxbMl07CisgICAgdThfdCAgICAgICAgZHVyYXRpb25bMl07CisgICAgdThfdCAgICAgICAgZGFbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIHNhW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBic3NpZFtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgc2VxQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBib2R5WzFdOworfTsKKworc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIKK3sKKyAgICAvL3U4X3QgICAgICBwbGNwSGRyW1pNX1BMQ1BfSEVBREVSX1NJWkVdOworICAgIHU4X3QgICAgICAgIGZyYW1lQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBkdXJhdGlvblsyXTsKKyAgICB1OF90ICAgICAgICBkYVtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgc2FbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIGJzc2lkW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBzZXFDdHJsWzJdOworICAgIHU4X3QgICAgICAgIHRpbWVTdGFtcFs4XTsKKyAgICB1OF90ICAgICAgICBiZWFjb25JbnRlcnZhbFsyXTsKKyAgICB1OF90ICAgICAgICBjYXBhYmlsaXR5WzJdOworICAgIHU4X3QgICAgICAgIHNzaWRbWk1fTUFYX1NTSURfTEVOR1RIICsgMl07ICAgLy8gRUlEKDEpICsgTGVuZ3RoKDEpICsgU1NJRCgzMikKK30gOworCisjZGVmaW5lIHpzV2xhbkJlYWNvbkZyYW1lSGVhZGVyIHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIKKworc3RydWN0IHpzV2xhbkF1dGhGcmFtZUhlYWRlcgoreworICAgIC8vdThfdCAgICAgIHBsY3BIZHJbWk1fUExDUF9IRUFERVJfU0laRV07CisgICAgdThfdCAgICAgICAgZnJhbWVDdHJsWzJdOworICAgIHU4X3QgICAgICAgIGR1cmF0aW9uWzJdOworICAgIHU4X3QgICAgICAgIGFkZHJlc3MxW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBhZGRyZXNzMltaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgYWRkcmVzczNbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIHNlcUN0cmxbMl07CisgICAgdTE2X3QgICAgICAgYWxnbzsKKyAgICB1MTZfdCAgICAgICBzZXE7CisgICAgdTE2X3QgICAgICAgc3RhdHVzOworICAgIHU4X3QgICAgICAgIGNoYWxsZW5nZVRleHRbMjU1XTsgLy8gdGhlIGZpcnN0IDIgYnl0ZXMgYXJlIGluZm9ybWF0aW9uIElELCBsZW5ndGgKK307CisKK3N0cnVjdCB6c1dsYW5Bc3NvRnJhbWVIZWFkZXIKK3sKKyAgICAvL3U4X3QgICAgICBwbGNwSGRyW1BMQ1BfSEVBREVSX1NJWkVdOworICAgIHU4X3QgICAgICAgIGZyYW1lQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBkdXJhdGlvblsyXTsKKyAgICB1OF90ICAgICAgICBhZGRyZXNzMVtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgYWRkcmVzczJbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIGFkZHJlc3MzW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBzZXFDdHJsWzJdOworICAgIHU4X3QgICAgICAgIGNhcGFiaWxpdHlbMl07CisgICAgdTE2X3QgICAgICAgc3RhdHVzOworICAgIHUxNl90ICAgICAgIGFpZDsKKyAgICAvL3U4X3QgICAgICAgIHN1cHBvcnRlZFJhdGVzWzEwXTsKK307CisKK3N0cnVjdCB6c0ZyYWcKK3sKKyAgICB6YnVmX3QqIGJ1ZlsxNl07CisgICAgdTE2X3QgYnVmVHlwZVsxNl07CisgICAgdTE2X3Qgc2VxWzE2XTsKKyAgICB1OF90IGZsYWdbMTZdOworCit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIYXJkd2FyZSByZWxhdGVkIGRlZmluaXRpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIFpNX01BQ19SRUdfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAweDFjMzAwMAorCisjZGVmaW5lIFpNX01BQ19SRUdfQVRJTV9XSU5ET1cgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg1MUMpCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX1BFUklPRCAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg1MjApCisjZGVmaW5lIFpNX01BQ19SRUdfUFJFVEJUVCAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg1MjQpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19NQUNfQUREUl9MICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDYxMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19NQUNfQUREUl9IICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDYxNCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0dST1VQX0hBU0hfVEJMX0wgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjI0KQorI2RlZmluZSBaTV9NQUNfUkVHX0dST1VQX0hBU0hfVEJMX0ggICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjI4KQorCisjZGVmaW5lIFpNX01BQ19SRUdfQkFTSUNfUkFURSAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MzApCisjZGVmaW5lIFpNX01BQ19SRUdfTUFOREFUT1JZX1JBVEUgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MzQpCisjZGVmaW5lIFpNX01BQ19SRUdfUlRTX0NUU19SQVRFICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MzgpCisjZGVmaW5lIFpNX01BQ19SRUdfQkFDS09GRl9QUk9URUNUICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2M2MpCisjZGVmaW5lIFpNX01BQ19SRUdfUlhfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2NDApCisjZGVmaW5lIFpNX01BQ19SRUdfUlhfUEVfREVMQVkgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2NEMpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19EWU5BTUlDX1NJRlNfQUNLICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY1OCkKKyNkZWZpbmUgWk1fTUFDX1JFR19TTklGRkVSICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY3NCkKKyNkZWZpbmUgWk1fTUFDX1JFR19UWF9VTkRFUlJVTgkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4Njg4KQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX1RPVEFMCQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkEwKQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX0NSQzMyCQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkE0KQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX0NSQzE2CQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkE4KQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX0VSUl9VTkkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZBQykKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9PVkVSUlVOCQkgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2QjApCisjZGVmaW5lIFpNX01BQ19SRUdfUlhfRVJSX01VTAkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkJDKQorI2RlZmluZSBaTV9NQUNfUkVHX1RYX1JFVFJZCQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkNDKQorI2RlZmluZSBaTV9NQUNfUkVHX1RYX1RPVEFMCQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkY0KQorCisKKyNkZWZpbmUgWk1fTUFDX1JFR19BQ0tfRVhURU5TSU9OICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY5MCkKKyNkZWZpbmUgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY5OCkKKworI2RlZmluZSBaTV9NQUNfUkVHX1NMT1RfVElNRSAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkYwKQorCisjZGVmaW5lIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9MICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg3MDQpCisjZGVmaW5lIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9IICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg3MDgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzBfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIwMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzFfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIwNCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzJfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIwOCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzNfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIwQykKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzRfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIxMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzFfQUMwX0FJRlMgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIxNCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzNfQUMyX0FJRlMgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIxOCkKKworI2RlZmluZSBaTV9NQUNfUkVHX1JFVFJZX01BWCAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4QjI4KQorCisjZGVmaW5lIFpNX01BQ19SRUdfVFhPUF9OT1RfRU5PVUdIX0lORElDQVRJT04gICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMzApCisKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzFfQUMwX1RYT1AgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEI0NCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzNfQUMyX1RYT1AgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEI0OCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0FDS19UQUJMRSAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4QzAwKQorCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX0FERFIgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhEODQpCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX0xFTkdUSCAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhEODgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19CQ05fUExDUCAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEQ5MCkKKyNkZWZpbmUgWk1fTUFDX1JFR19CQ05fQ1RSTCAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEQ5NCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9IVDEgICAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4REEwKQorI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9IVDIgICAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4REE0KQorCisKKyNkZWZpbmUgWk1fUlhfU1RBVFVTX0lTX01JQ19GQUlMKHJ4U3RhdHVzKSByeFN0YXR1cy0+VGFpbC5EYXRhLkVycm9ySW5kaWNhdGlvbiAmIFpNX0JJVF82CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICAgICAgICAgICAyNAorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9UWVBFX09GRlNFVCAgICAgICAgICAzMCAgICAvLyBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgU05BUAorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9JUF9PRkZTRVQgICAgICAgICAgICAzMiAgICAvLyBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgU05BUCArIFRZUEUKKyNlbHNlCisjZGVmaW5lIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gICAgICAgICAgIDE0CisjZGVmaW5lIFpNXzgwMjExX0ZSQU1FX1RZUEVfT0ZGU0VUICAgICAgICAgIDEyICAgIC8vIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyBTTkFQCisjZGVmaW5lIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCAgICAgICAgICAgIDE0ICAgIC8vIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyBTTkFQICsgVFlQRQorI2VuZGlmCisKKyNkZWZpbmUgWk1fQlNTX0lORk9fVkFMSURfQklUICAgICAgMHgwMQorI2RlZmluZSBaTV9CU1NfSU5GT19VUERBVEVEX0JJVCAgICAweDAyCisKKworCisKKworI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX1JYX1RJTUVPVVQgICAgICAweDAxCisjZGVmaW5lIFpNX0VSUk9SX0lORElDQVRJT05fT1ZFUlJVTiAgICAgICAgIDB4MDIKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9ERUNSWVBUX0VSUk9SICAgMHgwNAorI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX0NSQzMyX0VSUk9SICAgICAweDA4CisjZGVmaW5lIFpNX0VSUk9SX0lORElDQVRJT05fQUREUl9OT1RfTUFUQ0ggIDB4MTAKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9DUkMxNl9FUlJPUiAgICAgMHgyMAorI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX01JQ19FUlJPUiAgICAgICAweDQwCisKKyNkZWZpbmUgWk1fUlhNQUNfU1RBVFVTX01PRF9UWVBFX0NDSyAgICAgICAgMHgwMAorI2RlZmluZSBaTV9SWE1BQ19TVEFUVVNfTU9EX1RZUEVfT0ZETSAgICAgICAweDAxCisjZGVmaW5lIFpNX1JYTUFDX1NUQVRVU19NT0RfVFlQRV9IVF9PRkRNICAgIDB4MDIKKyNkZWZpbmUgWk1fUlhNQUNfU1RBVFVTX01PRF9UWVBFX0RMX09GRE0gICAgMHgwMworI2RlZmluZSBaTV9SWE1BQ19TVEFUVVNfVE9UQUxfRVJST1IgICAgICAgICAweDgwCisKKworCisKKworI2RlZmluZSBaTV9NQVhfTEVEX05VTUJFUiAgICAgICAyCisKKyNkZWZpbmUgWk1fTEVEX0RJU0FCTEVfTU9ERSAgICAgMHgwCisjZGVmaW5lIFpNX0xFRF9MSU5LX01PREUgICAgICAgIDB4MQorI2RlZmluZSBaTV9MRURfTElOS19UUl9NT0RFICAgICAweDIKKyNkZWZpbmUgWk1fTEVEX1RSX09OX01PREUgICAgICAgMHgzCisjZGVmaW5lIFpNX0xFRF9UUl9PRkZfTU9ERSAgICAgIDB4NAorCisjZGVmaW5lIFpNX0xFRF9DVFJMX0ZMQUdfQUxQSEEgICAgICAweDEKKworc3RydWN0IHpzTGVkU3RydWN0Cit7CisgICAgdTMyX3QgICBjb3VudGVyOworICAgIHUzMl90ICAgY291bnRlcjEwMG1zOworICAgIHUxNl90ICAgbGVkTGlua1N0YXRlOworICAgIHUxNl90ICAgbGVkTW9kZVtaTV9NQVhfTEVEX05VTUJFUl07CisgICAgdTMyX3QgICB0eFRyYWZmaWM7CisgICAgdTMyX3QgICByeFRyYWZmaWM7CisgICAgdThfdCAgICBMRURDdHJsVHlwZTsKKyAgICB1OF90ICAgIExFREN0cmxGbGFnOyAgICAgICAgIC8vIENvbnRyb2wgRmxhZyBmb3IgdmVuZG9ycworICAgIHU4X3QgICAgTEVEQ3RybEZsYWdGcm9tUmVnOyAgLy8gQ29udHJvbCBGbGFnIGZvciB2ZW5kb3JzIGluIHJlZ2lzdHJ5Cit9OworCisKKy8vSEFMKyBjYXBhYmlsaXR5IGJpdHMgZGVmaW5pdGlvbgorI2RlZmluZSBaTV9IUF9DQVBfMTFOICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0gICAgIDB4MgorI2RlZmluZSBaTV9IUF9DQVBfMkcgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBaTV9IUF9DQVBfNUcgICAgICAgICAgICAgICAgICAgIDB4OAorCisjZW5kaWYgLyogI2lmbmRlZiBfV0xBTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ5ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZwpAQCAtMCwwICsxLDMyIEBACitjb25maWcgT1RVUworCXRyaXN0YXRlICJBdGhlcm9zIE9UVVMgODAyLjExbiBVU0Igd2lyZWxlc3Mgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBXTEFOXzgwMjExICYmIE1BQzgwMjExCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEF0aGVyb3MgODAyLjExbiBVU0IgaGFyZHdhcmU6CisJICAgICogVUI4MSAtIDJ4MiAyLjQgR0h6CisJICAgICogVUI4MiAtIDJ4MiAyLjQgR0h6IGFuZCA1IEdIegorCSAgICAqIFVCODMgLSAxeDIgMi40IEdIegorCisJICBUaGlzIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgZGV2aWNlcyBjdXJyZW50bHkgb24gdGhlIG1hcmtldDoKKwkgIERsaW5rIERXQS0xNjBBMSwgTmV0Z2VhciBXTkRBMzEwMCBhbmQgV04xMTF2MiwgVFAtTGluaworCSAgVEwtV044MjFOLCBhbmQgQVZNIEZSSVRaIVdMQU4gTiBVU0IgU3RpY2suCisKKwkgIFRoaXMgZHJpdmVyIHJlcXVpcmVzIGl0cyBvd24gc3VwcGxpY2FudCBkcml2ZXIgZm9yCisJICB3cGFfc3VwcGxpY2FudCAwLjQuOC4gRm9yIHlvdXIgY29udmVuaWVuY2UgeW91IGNhbiBmaW5kIHRoZQorCSAgdGFyYmFsbCBoZXJlOgorCisJICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvbWNncm9mL290dXMvd3BhX3N1cHBsaWNhbnQtMC40Ljhfb3R1cy50YXIuYnoyCisKKwkgIEJlZm9yZSBjb21waWxpbmcgd3BhX3N1cHBsaWNhbnQsIGVuc3VyZSB5b3VyIC5jb25maWcgaGFzIGF0CisJICBsZWFzdCB0aGUgZm9sbG93aW5nOgorCQlDT05GSUdfV0lSRUxFU1NfRVhURU5TSU9OPXkKKwkJQ09ORklHX0VBUF9XU0M9eQorCQlDT05GSUdfV1NDX0lFPXkKKwkJQ09ORklHX0RSSVZFUl9XRVhUPXkKKwkJQ09ORklHX0RSSVZFUl9PVFVTPXkKKworCSAgQWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbXBpbGUsIHlvdSBjYW4gdXNlIHRoZSBBdGhlcm9zIGRldmljZSBhcworCSAgc2hvd24gaW4gdGhlIGV4YW1wbGU6CisJICAkIHdwYV9zdXBwbGljYW50IC1Eb3R1cyAtaSA8YXRoZXJvcyBkZXZpY2UgZnJvbSBpZmNvbmZpZz4gLWMgL3BhdGgvdG8vd3BhX3N1cHBsaWNhbnQuY29uZiAtZAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmNjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDY3IEBACitvYmotJChDT05GSUdfT1RVUykJKz0gYXJ1c2JfbG54Lm8KKworRVhUUkFfQ0ZMQUdTICs9IC1EQU1BQworRVhUUkFfQ0ZMQUdTICs9IC1ER0NDSworRVhUUkFfQ0ZMQUdTICs9IC1ET0ZETQorRVhUUkFfQ0ZMQUdTICs9IC1EVFhRX0lOX0lTUgorRVhUUkFfQ0ZMQUdTICs9IC1EV0xBTl9IT1NUSUY9MCAjMDpVU0IsIDE6UENJCisKKyNUZXN0IE1vZGUKK0VYVFJBX0NGTEFHUyArPSAtRFpNX1VTQl9TVFJFQU1fTU9ERT0xCitFWFRSQV9DRkxBR1MgKz0gLURaTV9VU0JfVFhfU1RSRUFNX01PREU9MAorRVhUUkFfQ0ZMQUdTICs9IC1EWk1fUENJX0RNQV9URVNUPTAKK0VYVFJBX0NGTEFHUyArPSAtRFpNX0xBUkdFUEFZTE9BRF9URVNUPTAKK0VYVFJBX0NGTEFHUyArPSAtRFpNX0ZXX0xPT1BfQkFDSz0wCitFWFRSQV9DRkxBR1MgKz0gLURaTV9MSU5VWF9UUEM9MQorI0VYVFJBX0NGTEFHUyArPSAtRFpNX0RPTlRfQ09QWV9SWF9CVUZGRVIKKworRVhUUkFfQ0ZMQUdTICs9IC1EWk1fSE9TVEFQRF9TVVBQT1JUCisjRVhUUkFfQ0ZMQUdTICs9IC1EZlRYX0dBSU5fT0ZETT0wCisjRVhUUkFfQ0ZMQUdTICs9IC1EWk1fQ09ORklHX0JJR19FTkRJQU4gLURCSUdfRU5ESUFOCitFWFRSQV9DRkxBR1MgKz0gLURaTV9IQUxQTFVTX0xPQ0sKK0VYVFJBX0NGTEFHUyArPSAtRFpNX09UVVNfTElOVVhfUEhBU0VfMgorCithcnVzYl9sbngtb2JqcyA6PSBcCisJdXNiZHJ2Lm8gXAorCXpkdXNiLm8gXAorCWlvY3RsLm8gXAorCXdyYXBfYnVmLm8gXAorCXdyYXBfbWVtLm8gXAorCXdyYXBfZXYubyBcCisJd3JhcF91c2IubyBcCisJd3JhcF9wa3QubyBcCisJd3JhcF9kYmcubyBcCisJd3JhcF9taXMubyBcCisJd3JhcF9zZWMubyBcCisJd3dyYXAubyBcCisJODAyMTFjb3JlL2NjbWQubyBcCisJODAyMTFjb3JlL2NoYi5vIFwKKwk4MDIxMWNvcmUvY2luaXQubyBcCisJODAyMTFjb3JlL2NtbS5vIFwKKwk4MDIxMWNvcmUvY21tYXAubyBcCisJODAyMTFjb3JlL2NtbXN0YS5vIFwKKwk4MDIxMWNvcmUvY2Z1bmMubyBcCisJODAyMTFjb3JlL2NvaWQubyBcCisJODAyMTFjb3JlL2N0a2lwLm8gXAorCTgwMjExY29yZS9jdHhyeC5vIFwKKwk4MDIxMWNvcmUvY2ljLm8gXAorCTgwMjExY29yZS9jcHNtZ3IubyBcCisJODAyMTFjb3JlL2NzY2FubWdyLm8gXAorCTgwMjExY29yZS9yYXRlY3RybC5vIFwKKwk4MDIxMWNvcmUvbGVkbWdyLm8gXAorCTgwMjExY29yZS9hbXNkdS5vIFwKKwk4MDIxMWNvcmUvY3dtLm8gXAorCTgwMjExY29yZS9jYWdnLm8gXAorCTgwMjExY29yZS9xdWV1ZS5vIFwKKwk4MDIxMWNvcmUvZnJlcWN0cmwubyBcCisJODAyMTFjb3JlL2N3ZXAubyBcCisJaGFsL2hwcncubyBcCisJaGFsL2hwbWFpbi5vIFwKKwloYWwvaHB1c2IubyBcCisJaGFsL2hwcmVnLm8gXAorCWhhbC9ocGZ3dWluaXQubyBcCisJaGFsL2hwZndidS5vIFwKKwloYWwvaHBmdzIubyBcCisJaGFsL2hwREtmd3UubyBcCisJaGFsL2hwZndzcGl1Lm8gXAorCWhhbC9ocGFuaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL290dXMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTEyMjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvVE9ETwpAQCAtMCwwICsxLDkgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCisJLSBzcGFyc2UgY2xlYW51cHMKKwktIHBvcnQgdG8gaW4ta2VybmVsIDgwMjExIHN0YWNrCisJLSBwcm9wZXIgbmV0d29yayBkZXZlbG9wZXIgbWFpbnRhaW5lcgorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQKK0x1aXMgUm9kcmlndWV6IDxMdWlzLlJvZHJpZ3VlekBBdGhlcm9zLmNvbT4gYW5kIHRoZQorb3R1cy1kZXZlbEBsaXN0cy5tYWR3aWZpLXByb2plY3Qub3JnIG1haWxpbmcgbGlzdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTJmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBhcGRiZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIERlYnVnIHRvb2xzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19SRUFEICAgICAgICAgICAweDAxCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19XUklURSAgICAgICAgICAweDAyCisjZGVmaW5lIFpNX0lPQ1RMX01FTV9EVU1QICAgICAgICAgICAweDAzCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19EVU1QICAgICAgICAgICAweDA1CisjZGVmaW5lIFpNX0lPQ1RMX1RYRF9EVU1QICAgICAgICAgICAweDA2CisjZGVmaW5lIFpNX0lPQ1RMX1JYRF9EVU1QICAgICAgICAgICAweDA3CisjZGVmaW5lIFpNX0lPQ1RMX01FTV9SRUFEICAgICAgICAgICAweDBCCisjZGVmaW5lIFpNX0lPQ1RMX01FTV9XUklURSAgICAgICAgICAweDBDCisjZGVmaW5lIFpNX0lPQ1RMX0RNQV9URVNUICAgICAgICAgICAweDEwCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19URVNUICAgICAgICAgICAweDExCisjZGVmaW5lIFpNX0lPQ1RMX1RFU1QgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFpNX0lPQ1RMX1RBTExZICAgICAgICAgICAgICAweDgxIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1JUUyAgICAgICAgICAgICAgICAweEEwCisjZGVmaW5lIFpNX0lPQ1RMX01JWF9NT0RFICAgICAgICAgICAweEExCisjZGVmaW5lIFpNX0lPQ1RMX0ZSQUcgICAgICAgICAgICAgICAweEEyCisjZGVmaW5lIFpNX0lPQ1RMX1NDQU4gICAgICAgICAgICAgICAweEEzCisjZGVmaW5lIFpNX0lPQ1RMX0tFWSAgICAgICAgICAgICAgICAweEE0CisjZGVmaW5lIFpNX0lPQ1RMX1JBVEUgICAgICAgICAgICAgICAweEE1CisjZGVmaW5lIFpNX0lPQ1RMX0VOQ1JZUFRJT05fTU9ERSAgICAweEE2CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9UWENOVCAgICAgICAgICAweEE3CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQgICAgICAweEE4CisjZGVmaW5lIFpNX0lPQ1RMX0RVUkFUSU9OX01PREUgICAgICAweEE5CisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfS0VZICAgICAgICAweEFBCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfTU9ERSAgICAgICAweEFCCisjZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9TVFJFTkdUSCAgICAweEFDIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9RVUFMSVRZICAgICAweEFEIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFICAgICAweEFFCisjZGVmaW5lCVpEQVBJT0NUTCAgICAgICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURQorCitzdHJ1Y3QgemRhcF9pb2N0bCB7CisJdW5zaWduZWQgc2hvcnQgY21kOyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHRvIHJ1biAqLworCXVuc2lnbmVkIGludCAgIGFkZHI7ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgICB2YWx1ZTsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVsweDEwMF07Cit9OworCisvKiBEZWNsYXJhdGlvbiBvZiBtYWNybyBhbmQgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIFdFUCBLZXlzICovCisKKyNpZiAwCisKKyNkZWZpbmUgU0tJUF9FTEVNIHsgXAorICAgIHdoaWxlKGlzeGRpZ2l0KCpwKSkgXAorICAgICAgICBwKys7IFwKK30KKworI2RlZmluZSBTS0lQX0RFTElNRVRFUiB7IFwKKyAgICBpZigqcCA9PSAnOicgfHwgKnAgPT0gJyAnKSBcCisgICAgICAgIHArKzsgXAorfQorCisjZW5kaWYKKworY2hhciBoZXgoY2hhcik7Cit1bnNpZ25lZCBjaGFyIGFzY3RvaGV4KGNoYXIgKnN0cik7CisKK2NoYXIgKnByZ25hbWU7CisKK2ludCBzZXRfaW9jdGwoaW50IHNvY2ssIHN0cnVjdCBpZnJlcSAqcmVxKQoreworICAgIGlmIChpb2N0bChzb2NrLCBaREFQSU9DVEwsIHJlcSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGlvY3RsKFNJT0NHSUZNQVApOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBwcmduYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IHJlYWRfcmVnKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKyAgICBzdHJ1Y3QgemRhcF9pb2N0bCAqemRyZXEgPSAwOworCisgICAgaWYgKCFzZXRfaW9jdGwoc29jaywgcmVxKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy96ZHJlcSA9IChzdHJ1Y3QgemRhcF9pb2N0bCAqKXJlcS0+aWZyX2RhdGE7CisgICAgLy9wcmludGYoICJyZWcgPSAlNHgsIHZhbHVlID0gJTR4XG4iLCB6ZHJlcS0+YWRkciwgemRyZXEtPnZhbHVlKTsKKworICAgIHJldHVybiAwOworfQorCisKK2ludCByZWFkX21lbShpbnQgc29jaywgc3RydWN0IGlmcmVxICpyZXEpCit7CisgICAgc3RydWN0IHpkYXBfaW9jdGwgKnpkcmVxID0gMDsKKyAgICBpbnQgaTsKKworICAgIGlmICghc2V0X2lvY3RsKHNvY2ssIHJlcSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOworICAgIHByaW50ZiggImR1bXAgbWVtIGZyb20gJXgsIGxlbmd0aCA9ICV4XG4iLCB6ZHJlcS0+YWRkciwgemRyZXEtPnZhbHVlKTsKKworICAgIGZvciAoaT0wOyBpPHpkcmVxLT52YWx1ZTsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJTAyeCIsIHpkcmVxLT5kYXRhW2ldKTsKKyAgICAgICAgcHJpbnRmKCIgIik7CisKKyAgICAgICAgaWYgKChpPjApICYmICgoaSsxKSUxNiA9PSAwKSkKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9Ki8KKworICAgIHJldHVybiAwOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgc29jazsKKyAgICBpbnQgYWRkciwgdmFsdWU7CisgICAgc3RydWN0IGlmcmVxIHJlcTsKKyAgICBjaGFyICphY3Rpb24gPSBOVUxMOworICAgIHN0cnVjdCB6ZGFwX2lvY3RsIHpkcmVxOworCisgICAgcHJnbmFtZSA9IGFyZ3ZbMF07CisKKyAgICBpZiAoYXJnYyA8IDMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiB1c2FnZSBpcyBcIiVzIDxpZm5hbWU+IDxvcGVyYXRpb24+IFs8YWRkcmVzcz5dIFs8dmFsdWU+XVwiXG4iLAorICAgICAgICAgICAgICAgIHByZ25hbWUsIHByZ25hbWUpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwidmFsaWQgb3BlcmF0aW9uOiByZWFkLCB3cml0ZSwgbWVtLCByZWcsXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgIDogdHhkLCByeGQsIHJtZW0sIHdtZW1cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICAgOiBkbWF0LCByZWd0LCB0ZXN0XG4iKTsKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHNjYW4sIENoYW5uZWwgU2NhblxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgcnRzIDxkZWNpbWFsPiwgU2V0IFJUUyBUaHJlc2hvbGRcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGZyYWcgPGRlY2ltYWw+LCBTZXQgRnJhZ21lbnQgVGhyZXNob2xkXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICByYXRlIDwwLTI4PiwgMDpBVVRPLCAxLTQ6Q0NLLCA1LTEyOk9GRE0sIDEzLTI4OkhUXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBUQkQgbWl4IDwwIG9yIDE+LCBTZXQgMSB0byBlbmFibGUgbWl4ZWQgbW9kZVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgZW5jLCA8MC0zPiwgMD0+T1BFTiwgMT0+V0VQNjQsIDI9PldFUDEyOCwgMz0+V0VQMjU2XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBza2V5IDxrZXk+LCBTZXQgV0VQIGtleVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgdHhjbnQsIEdldCBUeFEgQ250XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBkYWdjbnQsIEdldCBEZWFnZ3JlZ2F0ZSBDbnRcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGR1cm1vZGUgPG1vZGU+LCBTZXQgRHVyYXRpb24gTW9kZSAwPT5IVywgMT0+U1dcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGFlc2tleSA8dXNlcj4gPGtleT5cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGFlc21vZGUgPG1vZGU+XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICB3bGFubW9kZSA8MCwxPiAwOlN0YXRpb24gbW9kZSwgMTpQSUJTUyBtb2RlXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICB0YWwgPDAsMT4sIEdldCBDdXJyZW50IFRhbGx5IEluZm8sIDA9PnJlYWQsIDE9PnJlYWQgYW5kIHJlc2V0XG4iKTsKKworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHN0cmNweShyZXEuaWZyX25hbWUsIGFyZ3ZbMV0pOworICAgIHpkcmVxLmFkZHIgPSAwOworICAgIHpkcmVxLnZhbHVlID0gMDsKKworICAgIC8qIGEgc2lsbHkgcmF3IHNvY2tldCBqdXN0IGZvciBpb2N0bCgpbGluZyBpdCAqLworICAgIHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fUkFXKTsKKyAgICBpZiAoc29jayA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ja2V0KCk6ICVzXG4iLCBhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGlmIChhcmdjID49IDQpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiV4IiwgJmFkZHIpOworICAgIH0KKworICAgIGlmIChhcmdjID49IDUpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndls0XSwgIiV4IiwgJnZhbHVlKTsKKyAgICB9CisKKyAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICB6ZHJlcS52YWx1ZSA9IHZhbHVlOworCisgICAgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlYWQiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19SRUFEOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJtZW0iKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9EVU1QOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ3cml0ZSIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1dSSVRFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWciKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19EVU1QOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGQiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RYRF9EVU1QOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyeGQiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JYRF9EVU1QOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJybWVtIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NRU1fUkVBRDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid21lbSIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1dSSVRFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkbWF0IikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9ETUFfVEVTVDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVndCIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1RFU1Q7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRlc3QiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RFU1Q7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRhbCIpKQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RBTExZOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJydHMiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SVFM7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIm1peCIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUlYX01PREU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImZyYWciKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9GUkFHOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJzY2FuIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TQ0FOOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJza2V5IikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9LRVk7CisKKyAgICAgICAgaWYgKGFyZ2MgPj0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0ZW1wWzI5XTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50IGtleUxlbjsKKyAgICAgICAgICAgIGludCBlbmNUeXBlOworCisgICAgICAgICAgICBrZXlMZW4gPSBzdHJsZW4oYXJndlszXSk7CisKKyAgICAgICAgICAgIGlmIChrZXlMZW4gPT0gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCIsICZ0ZW1wWzBdLCAmdGVtcFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5TGVuID09IDI2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrZXlMZW4gPT0gNTgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsxMF0sICZ0ZW1wWzExXSwgJnRlbXBbMTJdLCAmdGVtcFsxM10sICZ0ZW1wWzE0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzE1XSwgJnRlbXBbMTZdLCAmdGVtcFsxN10sICZ0ZW1wWzE4XSwgJnRlbXBbMTldLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMjBdLCAmdGVtcFsyMV0sICZ0ZW1wWzIyXSwgJnRlbXBbMjNdLCAmdGVtcFsyNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsyNV0sICZ0ZW1wWzI2XSwgJnRlbXBbMjddLCAmdGVtcFsyOF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBrZXkgbGVuZ3RoXG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgemRyZXEuYWRkciA9IGtleUxlbi8yOworCisgICAgICAgICAgICBmb3IoaT0wOyBpPHpkcmVxLmFkZHI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZHJlcS5kYXRhW2ldID0gdGVtcFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IgOiBLZXkgcmVxdWlyZWQhXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyYXRlIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCisgICAgICAgIGlmIChhZGRyID4gMjgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCByYXRlLCByYW5nZTowfjI4XG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JBVEU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImVuYyIpKQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKworICAgICAgICBpZiAoYWRkciA+IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBlbmNyeXB0aW9uIG1vZGUsIHJhbmdlOjB+M1xuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFkZHIgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgYWRkciA9IDU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYWRkciA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyID0gNjsKKyAgICAgICAgfQorCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInR4Y250IikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9HRVRfVFhDTlQ7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImRhZ2NudCIpKQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKworICAgICAgICBpZiAoYWRkciAhPSAwICYmIGFkZHIgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaGUgdmFsdWUgc2hvdWxkIGJlIDAgb3IgMVxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQ7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImR1cm1vZGUiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIER1cmF0aW9uIG1vZGUgc2hvdWxkIGJlIDAgb3IgMVxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0RVUkFUSU9OX01PREU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc2tleSIpKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0ZW1wWzE2XTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKworICAgICAgICBzc2NhbmYoYXJndls0XSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLCAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sICZ0ZW1wWzVdLCAmdGVtcFs2XSwgJnRlbXBbN10sICZ0ZW1wWzhdLCAmdGVtcFs5XSwgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSwgJnRlbXBbMTNdLCAmdGVtcFsxNF0sICZ0ZW1wWzE1XSk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07CisgICAgICAgIH0KKworICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0VUX0FFU19LRVk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc21vZGUiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9BRVNfTU9ERTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid2xhbm1vZGUiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGFjdGlvblxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgcmVxLmlmcl9kYXRhID0gKGNoYXIgKikmemRyZXE7CisgICAgc2V0X2lvY3RsKHNvY2ssICZyZXEpOworCitmYWlsOgorICAgIGV4aXQoMCk7Cit9CisKK3Vuc2lnbmVkIGNoYXIgYXNjdG9oZXgoY2hhciAqc3RyKQoreworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisKKyAgICB2YWx1ZSA9IGhleCgqc3RyKSAmIDB4MGY7CisgICAgdmFsdWUgPSB2YWx1ZSA8PCA0OworICAgIHN0cisrOworICAgIHZhbHVlIHw9IGhleCgqc3RyKSAmIDB4MGY7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2NoYXIgaGV4KGNoYXIgdikKK3sKKyAgICBpZihpc2RpZ2l0KHYpKQorICAgICAgICByZXR1cm4gdiAtICcwJzsKKyAgICBlbHNlIGlmKGlzeGRpZ2l0KHYpKQorICAgICAgICByZXR1cm4gKHRvbG93ZXIodikgLSAnYScgKyAxMCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvYXRocl9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwZjc4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogYXRocl9jb21tb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBXUEEgcmVsYXRlZCBmdW5jdGlvbiBhbmQgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9BVEhSX0NPTU1PTl9ICisjZGVmaW5lIF9BVEhSX0NPTU1PTl9ICisKKyNkZWZpbmUgWkRfSU9DVExfV1BBCQkJKFNJT0NERVZQUklWQVRFICsgMSkKKyNkZWZpbmUgWkRfSU9DVExfUEFSQU0JCQkoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBaRF9JT0NUTF9HRVRXUEFJRQkJKFNJT0NERVZQUklWQVRFICsgMykKKyNkZWZpbmUgWkRfUEFSQU1fUk9BTUlORwkJMHgwMDAxCisjZGVmaW5lIFpEX1BBUkFNX1BSSVZBQ1kJCTB4MDAwMgorI2RlZmluZSBaRF9QQVJBTV9XUEEJCQkweDAwMDMKKyNkZWZpbmUgWkRfUEFSQU1fQ09VTlRFUk1FQVNVUkVTCTB4MDAwNAorI2RlZmluZSBaRF9QQVJBTV9EUk9QVU5FTkNSWVBURUQJMHgwMDA1CisjZGVmaW5lIFpEX1BBUkFNX0FVVEhfQUxHUwkJMHgwMDA2CisKKyNkZWZpbmUgWkRfQ01EX1NFVF9FTkNSWVBUX0tFWQkJMHgwMDAxCisjZGVmaW5lIFpEX0NNRF9TRVRfTUxNRQkJCTB4MDAwMgorI2RlZmluZSBaRF9DTURfU0NBTl9SRVEJCQkweDAwMDMKKyNkZWZpbmUgWkRfQ01EX1NFVF9HRU5FUklDX0VMRU1FTlQJMHgwMDA0CisjZGVmaW5lIFpEX0NNRF9HRVRfVFNDCQkJMHgwMDA1CisKKyNkZWZpbmUgWkRfRkxBR19TRVRfVFhfS0VZICAgICAgICAgICAgICAweDAwMDEKKworI2RlZmluZSBaRF9HRU5FUklDX0VMRU1FTlRfSERSX0xFTiBcCisoKGludCkgKCYoKHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gKikgMCktPnUuZ2VuZXJpY19lbGVtLmRhdGEpKQorCisjZGVmaW5lIFpEX0NSWVBUX0FMR19OQU1FX0xFTgkJMTYKKyNkZWZpbmUgWkRfTUFYX0tFWV9TSVpFCQkJMzIKKyNkZWZpbmUgWkRfTUFYX0dFTkVSSUNfU0laRQkJNjQKKworI2RlZmluZSBJRUVFODAyMTFfQUREUl9MRU4JCTYKKyNkZWZpbmUgSUVFRTgwMjExX01BWF9JRV9TSVpFCQkyNTYKKworI2lmZGVmIFpNX0VOQUxCRV9XQVBJCisjZGVmaW5lIFpNX0NNRF9XQVBJX1NFVFdBUEkgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFpNX0NNRF9XQVBJX0dFVFdBUEkgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFpNX0NNRF9XQVBJX1NFVEtFWSAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFpNX0NNRF9XQVBJX0dFVEtFWSAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFpNX0NNRF9XQVBJX1JFS0VZICAgICAgICAgICAgICAgMHgwMDA1CisKKyNkZWZpbmUgWk1fV0FQSV9XQUlfUkVRVUVTVCAgICAgICAgICAgICAweDAwZjEKKyNkZWZpbmUgWk1fV0FQSV9VTklDQVNUX1JFS0VZICAgICAgICAgICAweDAwZjIKKyNkZWZpbmUgWk1fV0FQSV9TVEFfQUdJTkcgICAgICAgICAgICAgICAweDAwZjMKKyNkZWZpbmUgWk1fV0FQSV9NVUxUSV9SRUtFWSAgICAgICAgICAgICAweDAwZjQKKworI2RlZmluZSBaTV9XQVBJX0tFWV9TSVpFICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFpNX1dBUElfSVZfTEVOICAgICAgICAgICAgICAgICAgMTYKKyNlbmRpZiAvL1pNX0VOQUxCRV9XQVBJCisvKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLworCitzdHJ1Y3QgYXRocl93bGFuX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBhbGdbWkRfQ1JZUFRfQUxHX05BTUVfTEVOXTsKKwkJCXUzMiBmbGFnczsKKwkJCXUzMiBlcnI7CisJCQl1OCBpZHg7CisJCQl1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCisJCQl1MTYga2V5X2xlbjsKKwkJCXU4IGtleVtaRF9NQVhfS0VZX1NJWkVdOworCQl9IGNyeXB0OworCQlzdHJ1Y3QgeworCQkJdTMyIGZsYWdzX2FuZDsKKwkJCXUzMiBmbGFnc19vcjsKKwkJfSBzZXRfZmxhZ3Nfc3RhOworCQlzdHJ1Y3QgeworCQkJdTggbGVuOworCQkJdTggZGF0YVtaRF9NQVhfR0VORVJJQ19TSVpFXTsKKwkJfSBnZW5lcmljX2VsZW07CisJCXN0cnVjdCB7CisjZGVmaW5lIE1MTUVfU1RBX0RFQVVUSCAwCisjZGVmaW5lIE1MTUVfU1RBX0RJU0FTU09DIDEKKwkJCXUxNiBjbWQ7CisJCQl1MTYgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IHNzaWRfbGVuOworCQkJdTggc3NpZFszMl07CisJCX0gc2Nhbl9yZXE7CisJfSB1OworfTsKKworc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSB7CisJdTggd3BhX21hY2FkZHJbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1OCB3cGFfaWVbSUVFRTgwMjExX01BWF9JRV9TSVpFXTsKK307CisKKyNpZmRlZiBaTV9FTkFMQkVfV0FQSQorc3RydWN0IGF0aHJfd2FwaV9wYXJhbSB7CisJdTE2IGNtZDsKKwl1MTYgbGVuOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggc3RhX2FkZHJbRVRIX0FMRU5dOworCQkJdTggcmVzZXJ2ZWQ7CisJCQl1OCBrZXlpZDsKKwkJCXU4IGtleVtaTV9XQVBJX0tFWV9TSVpFXTsKKwkJfSBjcnlwdDsKKwkJc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4IHdhcGlfcG9saWN5OworCQl9IGluZm87CisJfSB1OworfTsKKworc3RydWN0IGF0aHJfd2FwaV9zdGFfaW5mbworeworCXUxNgltc2dfdHlwZTsKKwl1MTYJZGF0YWxlbjsKKyAgICAJdTgJc3RhX21hY1tFVEhfQUxFTl07CisJdTgJcmVzZXJ2ZV9kYXRhWzJdOworICAgIAl1OAlnc25bWk1fV0FQSV9JVl9MRU5dOworCXU4CXdpZVsyNTZdOworfTsKKyNlbmRpZiAvL1pNX0VOQUxCRV9XQVBJCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocERLZnd1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBES2Z3dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGM2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBES2Z3dS5jCkBAIC0wLDAgKzEsODMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNES0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REUzRTdGRkMsIDB4RTExNEQ3M0UsCisweDFFMTNENDNFLCAweDFFNEM0NzBCLCAweDAwMDlCMDE3LCAweDk1NkVFNjAwLAorMHhDODQwNjBFMiwgMHgyRjAyOEYwMywgMHg4RkY5MzY1MiwgMHhENDM4NzYwMSwKKzB4NEUwQkRFMzgsIDB4RDQzODAwMDksIDB4MDAwOTRFMEIsIDB4NEUwQkQ0MzcsCisweDdGMDQwMDA5LCAweEEwMzY0RjI2LCAweDRGMjI2RUY2LCAweDQxMEJEMTM0LAorMHhENDM0MDAwOSwgMHgwMDA5NDQwQiwgMHg0NTBCRDUzMywgMHhENzMzMDAwOSwKKzB4RDIzM0UxRkYsIDB4MjcxMjYxMUQsIDB4RDQzMjUwMjksIDB4RTFGRkNCMDEsCisweDEyMDlFNTAxLCAweDEyMTEyMjEyLCAweEQ1MkYyNDUyLCAweEQyMkY5NzQwLAorMHhFNzAwMjU3MiwgMHhENDJGRDEyRSwgMHgyMjcwRDYyRiwgMHgyMTcyRTIwMSwKKzB4MjYyMDI0MjAsIDB4RTRGRkQ2MkQsIDB4RTYwMDI2NDEsIDB4RTEwNEQ1MkMsCisweDYwNjM2NjZELCAweDYyNkQ3NjAxLCAweDMyMTI0MDAwLCAweDA1NDU4RkY4LAorMHgwMDBCNEYyNiwgMHhFQUM4MDAwOSwgMHhEQjI2NkFBQywgMHhERDI3REMyNiwKKzB4RDgyOERFMjcsIDB4NEMwQkU5MDEsIDB4NEQwQjAwMDksIDB4NEUwQjAwMDksCisweDYwQjIwMDA5LCAweDg5MDc4ODAxLCAweDYyNDJENDIzLCAweDg5MDMzMkE2LAorMHg2MDUwRDUyMiwgMHg4QkVFODgwMSwgMHgyQjkyRDQxRiwgMHgyNjY4NjY0MiwKKzB4NDgwQjg5RTksIDB4RDUxRDAwMDksIDB4QUZFNEUyMDAsIDB4MjcxMDI1MjAsCisweDAwMDAwRkEwLCAweDAwMUMwMDFDLCAweDAwMjAwRUQ0LCAweDAwMDBCMzhFLAorMHgwMDIwMkY5MCwgMHgwMDIwMTM1NiwgMHgwMDIwMkY5QywgMHgwMDIwMkZCNCwKKzB4MDAyMDEzMTQsIDB4MDAyMDE0MTIsIDB4MDAyMDBFRjgsIDB4MDAxQzM1MTAsCisweDAwMUMzNjI0LCAweDAwMUUyMTJDLCAweDAwMjAyRjAwLCAweDAwMjAyQTlDLAorMHgwMDIwMkYwOCwgMHgwMDIwMkYxNCwgMHgwMDIwMkYyMCwgMHgwMDIwMkYyMiwKKzB4MDAyMDJGMjYsIDB4MDAxQzEwMjgsIDB4MDAyMDEyMjAsIDB4MDAyMDI5NEMsCisweDAwMjAxRDEwLCAweDAwMjAxRUM4LCAweDAwMjAzMjIwLCAweDAwMjAyRjI0LAorMHgyRkI2MkY5NiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhERTk0N0Y4MCwKKzB4NjFFMEUwMjQsIDB4MEYxNEQ0OTMsIDB4NzEwMTYxRTMsIDB4RDc5MjYyMTAsCisweDQ3MEJFMDI4LCAweEQ1OTEwRjI0LCAweDAwMDk0NTBCLCAweDZEMDMyMDA4LAorMHgxRjBCOEYxMSwgMHhENDhGREM4RSwgMHhERDhGNjdDMCwgMHg2NTdDNEQwQiwKKzB4REQ4RkQxOEUsIDB4NkI5QzY5MTAsIDB4NDIwODYyQjMsIDB4MzJCODQyMDgsCisweDNEMkM0MjA4LCAweEUwMjgxRkRCLCAweEU1ODAwNEZDLCAweDYwNEM2NkUyLAorMHgzMDUwNjU1QywgMHgyRDYyOEYxMywgMHgwMUZDRTAyNCwgMHg2NDFDRTUwMCwKKzB4NjI1RERFODQsIDB4OEIwMTMyNDMsIDB4MDAwOUEzOUUsIDB4Njc1MzY1NUQsCisweDYwNzAzN0VDLCAweDM5REM2OTUzLCAweEFGRjI3NTAxLCAweDIwMDg4MDk0LAorMHhFMDI0OEIxMywgMHhFNTAwMDFGQywgMHhBMDA5REU3QSwgMHg2NTVENjQxQywKKzB4MzJFQzYyNTMsIDB4NkM1MzZCMjIsIDB4M0NEQzY3QjIsIDB4NzUwNDFDNzEsCisweDMyNDM2MjVELCAweEEzN0Y4QkYzLCAweDg4MDEyRDEwLCAweEUwMjQ4QjE2LAorMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU2RSwgMHg4QjAxMzI3MywKKzB4MDAwOUEzNzIsIDB4NkNFMzY0NEQsIDB4N0MwNDY5NDMsIDB4MzlFQzZCNDMsCisweDY1OTIzQkNDLCAweDc0MDg2REIyLCAweDI1RDJBRkVGLCAweDhCMTk4ODA0LAorMHgwMUZDRTAyNCwgMHgyRDcwRTcwMCwgMHgxRkQ4NkQxQywgMHg2MjdEREU2MSwKKzB4OEIwMTMyRDMsIDB4MDAwOUEzNTgsIDB4NkI3MzY3N0QsIDB4M0JFQzYxRTMsCisweDcxMDQ2NEIyLCAweDNDMUM2QzczLCAweDY5NDI2NUMyLCAweDI5NTk3NzA4LAorMHgyNDkyQUZFRCwgMHg4QjE4ODgwNSwgMHgwMUZDRTAyNCwgMHgyRDQwRTQwMCwKKzB4REU1NDY3MUMsIDB4MzI3MzYyNEQsIDB4QTMzRDhCMDEsIDB4NjQ0RDAwMDksCisweDZCRTM2RDQzLCAweDY1RDIzREVDLCAweDYxNDM3QjA0LCAweDZDMTIzMUJDLAorMHg3NDA4Njk1MiwgMHhBRkVEMjlDQiwgMHg4ODMxMjU5MiwgMHhERTRBOEIyMCwKKzB4NjVFNkRCNEEsIDB4NjFFNkRDNEEsIDB4NjdFMkQ5NEEsIDB4NjJFMjdFMDQsCisweDFGRUM3RUU4LCAweDdFMDQ2NEUyLCAweDZFRTIxRkVELCAweDVCRkQyQkUwLAorMHg2MEIyN0IwNCwgMHhDOTAxMUZCRSwgMHg2QkIyMkMwMCwgMHgyOUIwNEIwOSwKKzB4REM0MTJGMjYsIDB4NjYxMzRDMEIsIDB4RTIwMDdGMDQsIDB4MkQyMEEzMEMsCisweDhCMjE4ODMwLCAweEQ5MzlERTM4LCAweEUwNjQ2NUU2LCAweDcyMDQ2MkUzLAorMHg2NzI2NjZFMiwgMHg2RTIzREMzNiwgMHg2MjIyN0VFOCwgMHg2QkUyNjFFNiwKKzB4MjlCMDFGRUYsIDB4N0UwNDBGMTYsIDB4QzkwMTYwRTIsIDB4NkVFMjJDMDAsCisweDRFMDlEQzMwLCAweDJGMjYyQ0UwLCAweEQxMzBFMDY4LCAweDA0RkU0MTBCLAorMHhFMjAwN0YwNCwgMHgyRDIwQTJFOCwgMHg4QjA1ODgzMywgMHg0RTBCREUyQywKKzB4RTEwMDAwMDksIDB4MkQxMEEyRTAsIDB4ODkwMTg4MjgsIDB4MDAwOUExMDYsCisweEUxNDNERTIwLCAweEUwNDA2MkUxLCAweDMyMTc2MjJELCAweDBGRTY4RjA0LAorMHg2MDIzRTI0MCwgMHgyNjIxMDZGRSwgMHg4QjAxMzIxNywgMHgwMDA5QTBFRiwKKzB4MDJGRUUwNDAsIDB4ODUyMUU0MDEsIDB4OEIwMTMwNDYsIDB4MDAwOUEwRTcsCisweEU1MDFFMDQwLCAweDJENTAwN0ZFLCAweDY0NzFCMkM3LCAweDA5RkVFMDQwLAorMHg2MjkxRTE0MywgMHg2NTJERTA2OCwgMHg4RDZCMzUxNywgMHhFNjQwMEY1NiwKKzB4OEIyNzM1NjMsIDB4RTA0OEU2MDAsIDB4RTExQTBGNjUsIDB4NzJDMEEwMzEsCisweDAwMTE3ODAwLCAweDAwMjAyRkI4LCAweDAwMjAxMzU2LCAweDAwMjAyNDgwLAorMHgwMDIwMkYxQSwgMHgwMDIwMkZCQywgMHgwMDIwMTNBMiwgMHgwMDIwMkYxOSwKKzB4MDAyMDJCNDAsIDB4MDAxMTc4MDQsIDB4MDAxMTc4MTAsIDB4MDAyMDJGMTUsCisweDAwMjAyRjE2LCAweDAwMjAyRjE3LCAweDAwMjAwQjg0LCAweDAwMjAwQkQ4LAorMHgwMDIwMEJENCwgMHg0MTIxNjE1MywgMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwKKzB4NDUyMTQ1MjEsIDB4NjA1MzQ1MjEsIDB4NjYwM0M5MDMsIDB4MEY2NUUwNDgsCisweEUwMDc3MTE4LCAweEUwNDQyMjA5LCAweDY0MUQwRjI1LCAweDY1RjNFMDRDLAorMHgwRjQ2QjMxNCwgMHgwNEZERTA0OCwgMHgwQkZERTA0NCwgMHg2MUJENjc0RCwKKzB4NDEwODQ3MDgsIDB4MEYxNkUwNTAsIDB4RDI5MzYwNzMsIDB4NDIwQjA5RkUsCisweDZDMDdFMDBGLCAweDYwNzMyOUM5LCAweEUwNDAwRjk2LCAweDY1RjMwRUZFLAorMHg2RDBEODVFMiwgMHgwMUZFRTA1MCwgMHg2MEQzNDIwQiwgMHg2MDczMjkwQiwKKzB4RTA0QzBGOTYsIDB4MDRGRUIyRDksIDB4MDZGRUUwNDAsIDB4NjI2MUUwNjgsCisweDBGNTY2NTJELCAweDM1NjNFNjQwLCAweEUwMDA4OTRFLCAweDYwMjM4MUY4LAorMHg0MDA4QzkwMywgMHg2QjAzNDAwMCwgMHhFMDU0NjEwMywgMHhFMDU4MEZCNiwKKzB4RUNGRkREN0QsIDB4NkNDQzBGRjYsIDB4MEZENkUwNkMsIDB4NEQwQjYwQzMsCisweDQyMjE2MjUzLCAweDQyMjE0MjIxLCAweDY0MjM0MjIxLCAweDMyNEM0MjAwLAorMHhFMDVDNkUwNywgMHg0NTIxNDIwMCwgMHhFMDQwMEZFNiwgMHgwQkZFNDUyMSwKKzB4QzkwMzYwNTMsIDB4MzBGQzQwMDgsIDB4NkQwMzdCMDYsIDB4ODVGODFGMDUsCisweDZDMkQxRkI3LCAweDFGQzY2RTAzLCAweDBGQzZFMDYwLCAweDA1RkVFMDU4LAorMHg2NEMzQjJCNCwgMHgzM0ZDRTM1NCwgMHg1NjMyNjJEMiwgMHgyMjY5NjEzMiwKKzB4NjdCNDJEMjIsIDB4NDkwQjU5MzYsIDB4MjIwQjYwN0MsIDB4MDVGRUUwNTgsCisweDY0QzMyRDIyLCAweDdFMDFCMjg5LCAweEU3MDY2MkVELCAweDhGRTMzMjczLAorMHhFMDQwN0MwMSwgMHg2MjYxMDZGRSwgMHgwNkZFRTA0MCwgMHg4NTYxNDIwMCwKKzB4MzAyQzc2MEMsIDB4NjEwMzcwMUIsIDB4NjRGM0U1MDAsIDB4NzUwMUU3MDQsCisweDZCNUQ2OTY2LCAweDI0OTIzQjczLCAweDc0MDQ4RkY5LCAweEIyNkM2NUYzLAorMHhFMDQwNjQxRCwgMHhCMjA1MDZGRSwgMHhBMURENjQ2MSwgMHhENDRGMDAwOSwKKzB4RTIwMUQ3NEYsIDB4MkQyMDQ3MEIsIDB4MDAwOUExRDYsIDB4OEIwNzg4MjksCisweEVDMDBERTRDLCAweDYxRTIyREMwLCAweDY0MURCMUQ3LCAweDAwMDlBMUNDLAorMHg2MjJDRTI4MSwgMHg4QjAxMzAyMCwgMHgwMDA5QTExOCwgMHgwNkZDRTAyOCwKKzB4RTY4MjYyNkMsIDB4MzI2MDY2NkMsIDB4QTBFRThCMDEsIDB4RTY4MzAwMDksCisweDMyNjA2NjZDLCAweEEwREM4QjAxLCAweEU2OTAwMDA5LCAweDMyNjA2NjZDLAorMHhBMEQwOEIwMSwgMHhFNjkxMDAwOSwgMHgzMjYwNjY2QywgMHhBMEI5OEIwMSwKKzB4RTZCMDAwMDksIDB4MzI2MDY2NkMsIDB4QTA3RjhCMDEsIDB4RTZCQjAwMDksCisweDMyNjA2NjZDLCAweEU2OTI4OTIwLCAweDMyNjA2NjZDLCAweEU0MDA4QjE0LAorMHhFQjA0RDUzMSwgMHg1MjUxNjY1MiwgMHg4QjA3MzYyMCwgMHg2MjRENzQwMSwKKzB4OEZGNzMyQjcsIDB4RTYwMDc1MDgsIDB4NTJGQkEwMDIsIDB4RTYwMTUyRkIsCisweEU2MDQxMjYxLCAweDIyNjBBMTg4LCAweEQyMjlENDI4LCAweEQ0Mjk2NTQyLAorMHgwMDA5NDIwQiwgMHgwMDA5QTE4MCwgMHhFMTAwRTY3MCwgMHg2MDEzMzZGQywKKzB4RTAyNDgxNjIsIDB4MEJGQ0QyMUYsIDB4NkJCQzY3MjIsIDB4MjY3MjdCRkMsCisweEVCMDQxNkIyLCAweDA2RkVFMDc4LCAweDMyNjM2MjFELCAweEExNkI4QjAxLAorMHhERTFEMDAwOSwgMHgzMUVDNjExRCwgMHhENDFDNkUxMiwgMHg0MTBCRDExNCwKKzB4RTA3MDAwMDksIDB4NDUwQkQ1MUEsIDB4RDQxQTA0RkUsIDB4NDIwQkQyMTAsCisweEQyMTcwMDA5LCAweDY0RTM0MjBCLCAweEQ2MERENDE3LCAweDAwMDk0NjBCLAorMHgwNUZFRTA3MCwgMHgwMUZERTA3NCwgMHg2MTFERTYwMCwgMHg2MjUzMzUxQywKKzB4MzI2QzY2NkQsIDB4MjJFMDc2MDEsIDB4MzJCMzYyNkQsIDB4NEUxOThGRjcsCisweEUwNzQ3MTA0LCAweDBGMTVBRkNFLCAweDAwMjAyOUY4LCAweDAwMjAyRkRDLAorMHgwMDIwMTM1NiwgMHgwMDExNzgwNCwgMHgwMDIwMkIxMCwgMHgwMDExNzgwMCwKKzB4MDAyMDEzQTIsIDB4MDAyMDMwMTQsIDB4MDAxMTc4MDgsIDB4MDAyMDJGRjQsCisweDAwMjAxMzlBLCAweDAwMjAzMDA4LCAweDAwMjAzMDEwLCAweDAyRkNFMDI0LAorMHg2NzJDRTA3QywgMHhFQzAwMEY3NiwgMHhFMDdDRUIwNCwgMHg2MkNEMDdGRSwKKzB4OEIwMTMyNzMsIDB4MDAwOUExMTgsIDB4NkNDREQ3QjksIDB4MzU3QzY1QzMsCisweDYyQzM3NzA0LCAweEQ0QjczMjdDLCAweDZENTJEN0I3LCAweDZFMjI0NzBCLAorMHg0NzBCRDdCNiwgMHhENEI2NjREMywgMHg0MjBCRDJCMywgMHhEMkIzMDAwOSwKKzB4NjRFMzQyMEIsIDB4RDZCMEQ0QjMsIDB4MDAwOTQ2MEIsIDB4NjdEM0U2MDAsCisweDM3NkM2NjZELCAweDYyNkQ3NjAxLCAweDI3RTAzMkIzLCAweDRFMTk4RkY3LAorMHg3QzA4QUZEMywgMHg2MjEyRDFBNiwgMHgyMjI4NjIyQywgMHhEMkFBOEIwNCwKKzB4MDAwOTQyMEIsIDB4MDAwOUEwMDMsIDB4NDIwQkQyQTgsIDB4NTZGQjAwMDksCisweEEwRTFFMjAwLCAweEIxQTYyNjIwLCAweDU2RkIwMDA5LCAweEEwREJFMjAwLAorMHg1MkZCMjYyMCwgMHhFNTAwRDY5QSwgMHg2NTYyMjI1MCwgMHg3NjA0RDJBMCwKKzB4NjI2MjIyNTIsIDB4QTBDRkQ2OUYsIDB4NTZGQjI2MjAsIDB4MjYxMEUxMjQsCisweDUyMTdEMTlELCAweDUyMTgxNjIxLCAweDUyMTkxNjIyLCAweDUyMUExNjIzLAorMHg1NTFCMTYyNCwgMHgxNjU1RTIwMCwgMHgxNjU2NTUxQywgMHgxNjU3NTUxRCwKKzB4MTY1ODU1MUUsIDB4MTY1OTU1MUYsIDB4MTEyODExMjcsIDB4MTEyQTExMjksCisweDExMkMxMTJCLCAweDExMkUxMTJELCAweDExMkZBMEFFLCAweEQ2OEZEMThFLAorMHg2MjYyRTA0MCwgMHg3NjA0NjUxMiwgMHgyMTUyMzUyQywgMHg1NTExNjI2NiwKKzB4MTE1MTM1MkMsIDB4NjI2MjY1NjMsIDB4NzUwODU2MTIsIDB4MTE2MjM2MkMsCisweDU2MTM2MjUyLCAweDM2MkM3NUVDLCAweDYyNTIxMTYzLCAweDc1MTA1NjE0LAorMHgxMTY0MzYyQywgMHg2MjUyNjY1MywgMHg3NjEwNTUxNSwgMHgxMTU1MzUyQywKKzB4NTYxNjYyNjIsIDB4MzYyQ0Q1N0UsIDB4NjI1NjExNjYsIDB4MzYyQzU2MTcsCisweDY2NTMxMTY3LCAweDU1MTg2MjUyLCAweDM1MkM3NjA0LCAweDYyNjYxMTU4LAorMHgzNTJDNTUxOSwgMHg2NTYzMTE1OSwgMHg1NjFBNjI2MiwgMHgzNjJDNzUwNCwKKzB4NjI1MjExNkEsIDB4NzUwNDU2MUIsIDB4MTE2QjM2MkMsIDB4NTYxQzYyNTYsCisweDExNkMzNjJDLCAweDU2MUQ2MjU2LCAweDExNkQzNjJDLCAweDYyNTI2NjUzLAorMHg3NjA0NTUxRSwgMHgxMTVFMzUyQywgMHg1NjFGNjI2MiwgMHgzNjJDRDU2OSwKKzB4NjI1MjExNkYsIDB4NzU5NDA2MUUsIDB4MDE2NjM2MkMsIDB4NjY1M0UwNDQsCisweDA1MUU2MjUyLCAweDM1MkM3NjQ0LCAweEUwNDgwMTU2LCAweDA2MUU2MjYyLAorMHgwMTY2MzYyQywgMHhFMDU0RDY2MCwgMHgwNTFFNjI2MiwgMHgzNTJDNDIyOSwKKzB4NzYwNDAxNTYsIDB4RTA1ODYyNjIsIDB4NDIyOTA2MUUsIDB4MDE2NjM2MkMsCisweEUyMzg1NkZCLCAweEUwNDQyNjIwLCAweEUwNDgwMjFFLCAweDYyMTIxNjIxLAorMHg1NTExMTYyMiwgMHgxNjUzRTIwMCwgMHgxNjU0NTUxMiwgMHgxNjU1NTUxNSwKKzB4MTY1NjU1MTMsIDB4MTY1NzU1MTYsIDB4RTA0MDA1MUUsIDB4MDUxRTE2NTgsCisweDE2NTlFMDUwLCAweDE2NUE1NTE0LCAweEUwNEMwNTFFLCAweDA1MUUxNjVCLAorMHgxNjVDRTA1NCwgMHhFMDU4MDUxRSwgMHgwNTFFMTY1RCwgMHgxNjVFRTA0NCwKKzB4RTA0ODAxMjYsIDB4MTEyMTIxMjIsIDB4MTEyNTExMjIsIDB4MTEyNjExMjMsCisweEUwNDAwMTI2LCAweEUwNTAwMTI2LCAweDAxMjYxMTI0LCAweDAxMjZFMDRDLAorMHgwMTI2RTA1NCwgMHgwMTI2RTA1OCwgMHgzRjNDOTM1OCwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4MDAwQjZCRjYsIDB4NEYyMjY5RjYsIDB4RTI0MDYxNEQsCisweDg5MTQzMTIzLCAweDMxMjdFMjFGLCAweDhCMDlENzM0LCAweEQ0MzQ2MTRELAorMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywgMHgxNzYxQTAwNywKKzB4RTAwMUQ0MkYsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsIDB4NEYyNjI3NjIsCisweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTEyLAorMHhENzI2MzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDIyNSwgMHg0MjBCNzFFMCwKKzB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyMjEsIDB4RTAwMTQyMEIsCisweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LAorMHg2MjUyRDUxQywgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUxODQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4QTAwMTAwMDksCisweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLCAweDAwMDAwMDgwLAorMHgwMDExNzgwNCwgMHgwMDIwMkZGNCwgMHgwMDIwMTM1NiwgMHgwMDIwMTM5QSwKKzB4MDAyMDMwMDgsIDB4MDAyMDMwMTAsIDB4MDAyMDBDMzgsIDB4MDAyMDBDMTIsCisweDAwMjAyRjAwLCAweDAwMjAyRjE0LCAweDAwMjAyQUE0LCAweDAwMUMzNkEwLAorMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwgMHgwMDFDMzcwNCwKKzB4MDAyMDI5RjgsIDB4MDAxQzM3M0MsIDB4NDYxOEU2ODAsIDB4RDUyRjQ2MjgsCisweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LCAweDdGRkM0RjIyLAorMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDYyOSwgMHg1NEUxMTYxNSwKKzB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsIDB4MTY3ODZFRjIsCisweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkE4LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2QzUzREQxRSwgMHg2RTQzQkZENiwgMHgyREUyQkY5NSwKKzB4MDAwOUJGRDIsIDB4MkMxMjUxRDUsIDB4MUM0MTU0RDYsIDB4MUM1MjU1RDcsCisweDFDNjM1NkQ4LCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweDYxNjM2Q0Y2LAorMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwgMHgyNDIyNzYwMSwgMHgzNjEyNzQwNCwKKzB4MDAwQjhCRjksIDB4NEYyMjAwMDksIDB4RDEwRkQ0MEUsIDB4MDAwOTQxMEIsCisweEQ0MEZEMjBFLCAweEU1MDU2MDIyLCAweDIyMDJDQjIwLCAweEQ1MEQyNDUyLAorMHg0NTBCRTcwMCwgMHhENzBDMjQ3MiwgMHgwMDA5NDcwQiwgMHhFNjAxRDEwQiwKKzB4MjE2MkQyMEIsIDB4NEYyNjQ2MTgsIDB4MjI2MjAwMEIsIDB4MDAxQzM3MDAsCisweDAwMUMzNzBDLCAweDAwMjAzMDI4LCAweDAwMjAxMzU2LCAweDAwMUMzNTAwLAorMHgwMDFENDAwNCwgMHgwMDIwMTNDQywgMHgwMDIwMEVGOCwgMHgwMDFFMjEyQywKKzB4MDAxQzNEMzAsIDB4MDAwOUExQTksIDB4MkZFNjJGRDYsIDB4REQ4RjRGMjIsCisweEEwMDQ5RUE3LCAweEQ0OEUwMDA5LCAweDQyMEJEMjhFLCAweDYyRDI2NUQyLAorMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjhBRDQ4QiwgMHg1NUQxNDIwQiwKKzB4MjJFODUyRDEsIDB4QTAwNDhCRjgsIDB4RDQ4ODAwMDksIDB4NDIwQkQyODUsCisweDUyRDI1NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyODFENDg0LAorMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywgMHhBMDA0OEJGOCwgMHhENDgxMDAwOSwKKzB4NDIwQkQyN0MsIDB4NTJENDU1RDQsIDB4OEJGODIyRTgsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2RDczLAorMHg2QzUzQjAxOCwgMHg2NEMzNTdGNCwgMHhCMDU0NjVFMywgMHhCMDZBNjZEMywKKzB4QjA5QTAwMDksIDB4QjA5RTAwMDksIDB4QjBBMjAwMDksIDB4QjBCRTAwMDksCisweEIwQzEwMDA5LCAweEIxMjQwMDA5LCAweDRGMjYwMDA5LCAweDZERjY2RUY2LAorMHg2Q0Y2QTAyMywgMHgzNDEyRDE2QywgMHhENjZDMDUyOSwgMHgyNjUwRDc2QywKKzB4Mjc0MjAwMEIsIDB4MDAwOUEwMTQsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZFNjM2RDczLCAweDZDNTNCRkVFLCAweDY0QzM1N0Y0LCAweEIwMkE2NUUzLAorMHhCMTA2NjZEMywgMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwgMHg2Q0Y2QTAwNSwKKzB4RTYwM0QyNjAsIDB4MDAwQjQ2MTgsIDB4RDI1RTIyNjIsIDB4MDAwQkU2MDAsCisweDRGMjIyMjYyLCAweEU0MEFCRjdFLCAweDAwMDlCRjdFLCAweEUxMDREMjVBLAorMHhFNTAwNDExOCwgMHgyMjEyRTQwQSwgMHgyMjUyQkY3NCwgMHg2MDcyRDc1NywKKzB4NEYyNkNCMjAsIDB4MjcwMjAwMEIsIDB4RDE1NTRGMjIsIDB4RTQwMDQxMEIsCisweDQ1MkJENTU0LCAweDJGRTY0RjI2LCAweDZFNjNEMTUzLCAweDQ0MTg2NjEyLAorMHg0NTI4OTIxMCwgMHgyNjI5NDQwOCwgMHg0NDA4NDUwMCwgMHg0NDAwMjY1QiwKKzB4NDcwODI2NEIsIDB4NDcwODIxNjIsIDB4MjdFQkQxNEMsIDB4MDAwQjIxNzIsCisweDAzRjA2RUY2LCAweDJGRTYxRkZGLCAweERFNDk0RjIyLCAweEU0MEFFMTAxLAorMHgyRTEyQkY0OCwgMHg3MjZDNjJFMywgMHhFNDAxRTEwMCwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4RTczMDIyNDIsIDB4RTQwQUU1MDMsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjUyMjI3MiwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MTIxQUJGMjIsCisweDJFNjJFNjAwLCAweDAwMEI0RjI2LCAweEQyMzI2RUY2LCAweEU0NDFFMTAxLAorMHgwMDBCMjIxMiwgMHhEMTMwMjI0MiwgMHhFNjA1RDQzMCwgMHgwMDBCMjE2MiwKKzB4RDUyRjI0NjIsIDB4NjA1MEQyMkYsIDB4OEIwRTg4MDEsIDB4NjA0MEQ0MkUsCisweDhCMDc4ODAxLCAweDk2MjZENTJELCAweDg4MDE2MDUwLCAweDk2MjM4QjBDLAorMHgwMDA5QTAwQSwgMHhBMDA3OTYyMSwgMHhFNjAwMDAwOSwgMHgyMjYyRDQyNiwKKzB4ODgwMTYwNDAsIDB4RTYwNDhCMDAsIDB4QUVGM0U0MEEsIDB4RDIyNDIyNjIsCisweEU0MEFFNjAxLCAweDIyNjJBRUVFLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHhEQzIwNEYyMiwgMHg2MEMyRUQwMCwgMHhDQjAxRUI2NCwgMHg2MEMyMkMwMiwKKzB4QTA0MUM5MDEsIDB4MDNDNDZFMDMsIDB4MDM0MDAzRDQsIDB4MDAxQzNCODgsCisweDAwMjAzMDJDLCAweDAwMjAxM0EyLCAweDAwMjAzMDM0LCAweDAwMjAzMDNDLAorMHgwMDIwMzA0NCwgMHgwMDIwMzA0QywgMHgwMDI1RTcyMCwgMHgwMDIwMzIxQywKKzB4MDAyMDJGMDQsIDB4MDAxQzU5NjgsIDB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsCisweDAwMjAxMTU0LCAweDAwMjAxMTgwLCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLAorMHgwMDFDNTgzMCwgMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywKKzB4MDAyMDJGMTYsIDB4MDAxQzU4MDQsIDB4MDAyMDJGMTUsIDB4MDAyMDJGMTcsCisweDAwMUM1ODFDLCAweDAwMUM1ODYwLCAweDg5MDczREIyLCAweEU0MEE2MEMyLAorMHhCRTlGQzkwMSwgMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4QjAzM0RCMiwKKzB4RDIzRUQ0M0QsIDB4MDAwOTQyMEIsIDB4NEYyNkU0MEEsIDB4NkRGNjZFRjYsCisweEFFOEY2Q0Y2LCAweDQ0MTE2QkY2LCAweDYwNEI4RjAxLCAweDAwMEI2MDQzLAorMHgyRkI2MDAwOSwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhEQzM0N0ZGQywKKzB4NjBDMkVEMDAsIDB4Q0IwMkVCNjQsIDB4NjBDMjJDMDIsIDB4QzkwMjJGMDIsCisweDZFMDNBMDA5LCAweDg5MDgzREIzLCAweEU0MEE2MEMyLCAweEM5MDIyRjAyLAorMHg2RTAzQkU3MCwgMHgyRUU4N0QwMSwgMHgzREIzOEJGNCwgMHhENDI5OEIwOCwKKzB4N0YwNEQyMjYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweEQ1MjI2QkY2LAorMHg2MDUyNTY1MSwgMHgwMDBCNDYyOCwgMHgyRkI2MzA2QywgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NEYwMjRGMTIsIDB4NkU0M0JGRjEsIDB4REMxQjZCMDMsCisweEJGRUNERDFCLCAweDMwQjgwMDA5LCAweDA2MEEzQzA1LCAweDQ2MDk0NjA5LAorMHgzRDY1NDYwMSwgMHg0MjA5MDIwQSwgMHg0MjA5NDIwOSwgMHg4QkYwMzJFMiwKKzB4NEYxNjRGMDYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDJERTBGLCAweEU0MDNFNTAwLCAweEJGRDQyRTEyLAorMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywgMHg0RjI2MkU3MiwKKzB4NkVGNkFGQ0IsIDB4MDAwOTAwMEIsIDB4MDAyMDMwNTQsIDB4MDAyMDEzNTYsCisweDAwMUM1ODYwLCAweDAwMjAzMDZDLCAweDAwMUMxMDQwLCAweENDQ0NDQ0NELAorMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGREMsIDB4NjQ1M0UxMTAsCisweDZDNTM0MTI4LCAweEVEMDk2RTUzLCAweDY2NTM2NTVELCAweDM2NUM0NjA4LAorMHg3NTAxNDYwOCwgMHg2MDQzMzYxQywgMHgwRjY2Njc1RCwgMHhFQjAwNjBDMywKKzB4MjZDMTM3RDMsIDB4ODE2MjgxNjEsIDB4MTZCMjgxNjMsIDB4MTZCNDE2RTMsCisweDc0MDQ4RkVBLCAweEQ5QTY2OEYyLCAweDE5ODFEQUE2LCAweDU5RjEyOTgyLAorMHgxQTkxRDFBNSwgMHg1QUYyMkE5MiwgMHg1REY0NUJGMywgMHg1NEY2NUVGNSwKKzB4MjFBMjExQTEsIDB4MTFCMjExQjMsIDB4MTFENDExRDUsIDB4MTFFNjExRTcsCisweDExNDgxMTQ5LCAweDU1RjdFRTAwLCAweDU3RjhERDlDLCAweDY0RTNEMjlDLAorMHhEQjlERDk5QywgMHhFODQ1RUFCOCwgMHgyRDUyMUQ1MSwgMHg2QUFDMjI3MiwKKzB4NkVFRDQ4MDgsIDB4NEQwODZERTMsIDB4M0RFQzY1RTMsIDB4NEQwODQ1MDgsCisweDNEOUMzNUVDLCAweDQ1MDg2MEMzLCAweDgxRDEyREMxLCAweDQ1MDhFMDUwLAorMHg0NTA4NDAwOCwgMHg2MEMzODFEMiwgMHhFNjAwMzVCQywgMHg4MUQzMzRBMiwKKzB4MUQ1MzFERDIsIDB4OEQwMUQ0ODksIDB4RDQ4NjFENjQsIDB4QjA1QzY1RDMsCisweDY0RUQ3RTAxLCAweDhCREMzNDgyLCAweERCODhEMTgyLCAweEQyODA2ODEyLAorMHgxQjgxNDgyOSwgMHgyRkQyNjQxMiwgMHgyQjkyNjk0RCwgMHhEOTdGNjcyMiwKKzB4MUI3MzQ3MjksIDB4RDc3QzY4MjIsIDB4MUJBMjZBOEQsIDB4RDI4MDZCNzIsCisweDIyQjJENTdCLCAweEUwMDM1RDcyLCAweDVFNzQxMkQyLCAweDEyRTQ0MDE4LAorMHhENjdDNTE3NiwgMHg1NDc4MTIxNiwgMHgxMjQ4RTEwMywgMHhENDc5Njc5MiwKKzB4Njg1MjEyN0EsIDB4MjhDMUU3RkYsIDB4ODE5MTY5NTIsIDB4NkE1MkUwNTAsCisweDgxQTI0MDA4LCAweDYwQzM2QjUyLCAweDZDNTI4MUIzLCAweDZFNTIxQ0MyLAorMHg2MjUyMUU2MywgMHgxMjY0RTYwMCwgMHg0NjA4NjU2MywgMHg3NTAxMzY0QywKKzB4NjY1RDI2NzIsIDB4OEJGODM2MTMsIDB4NEYyNjdGMjQsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDYwNjE2NjQyLAorMHg4RDA0QzgwMywgMHg2MDYxRTUwMCwgMHg4ODAyQzkwMywgMHg1MjYyOEIwMywKKzB4NTEyNDY1NjMsIDB4MDAwQjI0MTIsIDB4MkZENjYwNTMsIDB4NEYyMjJGRTYsCisweDZFNTM3RkVDLCAweEU1NTA2MjUzLCAweEU0MDA2RDQzLCAweEEwMDE0NTA4LAorMHg1MjI0RTEwMSwgMHgyMjExNjA0MywgMHg4MTIzODEyMSwgMHg4MTIyNjA1MywKKzB4MzYyMDU2RTIsIDB4RDI1NDhCRjUsIDB4NjRGMzE2RTQsIDB4NDIwQkU2MTQsCisweDY1RTE2NUUzLCAweDI1NDlFNEZDLCAweDYxRjEyRTUxLCAweDIxNDk2NUYzLAorMHg1NEQxMkYxMSwgMHg0MTBCRDE0QywgMHg1N0QxRTYxNCwgMHhDQjAxNjA3MSwKKzB4MURFMTI3MDEsIDB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsCisweDRGMjIyRkU2LCAweDZFNTM3RkVDLCAweEU1RkM2NjUzLCAweDYwNjE2RDQzLAorMHhDQjAxMjA1OSwgMHg1MkUyMjYwMSwgMHg4QjA2MzI2MCwgMHg1MUUyMTJFNCwKKzB4OEIwNDMxRTAsIDB4QTAwMjUyRDEsIDB4QUZGMDFFMjIsIDB4RDIzQTU2NjQsCisweEU2MTQ2NEYzLCAweDY1RTM0MjBCLCAweEUxRkM2N0UxLCAweDJFNzEyNzE5LAorMHg1NEQxNjdGMSwgMHhEMTM0MjcxOSwgMHhFNjE0NjVGMywgMHgyRjcxNDEwQiwKKzB4NjAyMTUyRDEsIDB4MjIwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDRGMjIyRkU2LCAweERFMjM2MjRDLCAweDQyMDA0MjA4LAorMHgzRTJDQTAwNSwgMHhENDFGNTI1MiwgMHhCRjhFNTYyNCwgMHg2NUUyMkU2MiwKKzB4MzUyMDUyRTEsIDB4RDYyMjhCRjYsIDB4NEYyNjI2MjIsIDB4NkVGNjAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweERDMTg0RjIyLCAweDUyQzFEQjFGLAorMHgzNjIwNjZDMiwgMHg2MDYxODkxQywgMHg4ODAxQzkwMywgMHhERTEzODkxOCwKKzB4QkY2M0REMUIsIDB4NjUwMzY0RTMsIDB4NjZCMjg1MDMsIDB4MzI2MjYyMEQsCisweEQ0MEI4OTA3LCAweDAwMDlCRjlCLCAweDREMEJENDE2LCAweEFGRTYwMDA5LAorMHhCRjYyMDAwOSwgMHhENDE0NjRFMywgMHgwMDA5NEQwQiwgMHgwMDA5QUZERiwKKzB4MjI2MkQyMTIsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDAwMjAyQjAwLCAweDAwMjAyQjA4LCAweDAwMjAyQjEwLCAweDAwMjAyQjM4LAorMHgwMDIwMkYxQywgMHgwMDEwMDBCNCwgMHgwMDEwMTY4MCwgMHgwMDFFMjEwOCwKKzB4MDAxQzNEMDAsIDB4MDAxMTc4ODAsIDB4MDAyMDBBOUUsIDB4MDAyMDJGMDAsCisweDAwMjAxMzU2LCAweDAwMjAzMDg4LCAweDAwMjAzMDhDLCAweDAwMUMzRDI4LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MDIyRDIyQiwKKzB4OEQ0MUM4MDMsIDB4REUyQTJGMDEsIDB4REIyQkRDMkEsIDB4RUQwMUEwMTcsCisweEM5MDM2MDUxLCAweDg5MTY4ODAxLCAweEQxMjhENDI2LCAweDAwMDk0MTBCLAorMHg2MTAzNTUwMywgMHhDODIwODU1MSwgMHhFMDUwODkwMywgMHg3MjAxMDJCRSwKKzB4RDIyMzBCMjYsIDB4NDIwQjY0RTMsIDB4RDYyMjY1MTMsIDB4NTJDMTI2RDIsCisweDM1MjA2NUMyLCAweERFMjA4QkU0LCAweERCMjFERDIwLCAweDUyRDFEQzIxLAorMHgzNTIwNjVEMiwgMHg2MDUxODkxOCwgMHg4ODAxQzkwMywgMHhENDFCODkxNCwKKzB4NDYwQkQ2MTYsIDB4NTcwMzAwMDksIDB4OEYwNDM3RTAsIDB4RTIwMTY1MDMsCisweEFGRUMyQjIwLCAweEQ0MTgyQzUyLCAweDQyMEJEMjE4LCAweEQ2MTEwMDA5LAorMHg0MTE4RTEwMSwgMHgyNjEyQUZFMywgMHhDODA0NjBGMSwgMHhEMjE0ODkwNywKKzB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsIDB4NDIyQjZDRjYsIDB4N0YwNDZCRjYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDAwMUUyMTAwLAorMHgwMDIwMkIxMCwgMHgwMDIwMkIwOCwgMHgwMDIwMkFBNCwgMHgwMDIwMTA2QywKKzB4MDAyMDEwRUUsIDB4MDAxQzNEMzAsIDB4MDAxMTc4ODAsIDB4MDAyMDJCMDAsCisweDAwMjAyRjIwLCAweDAwMjAyRjFDLCAweDAwMjAyQjM4LCAweDAwMjAxMDhBLAorMHgwMDIwMDE3MCwgMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwKKzB4MDAwMDEyNjYsIDB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LAorMHg3RTAxNjRENCwgMHg2NDRDQkZGMiwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4RTUwMDZDRjYsIDB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsCisweDIyMjg2MjYwLCAweEFGRTM4QkZBLCAweDJGRTYwMDA5LCAweDc1MDc2MjUzLAorMHhFMTA4Njc1MywgMHg2MDQzRUUwQSwgMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwKKzB4OEQwMTQ0MDksIDB4RTYzMEU2MzcsIDB4NDExMDM2NUMsIDB4OEZGMjI3NjAsCisweEUwMDA3N0ZGLCAweDAwMEI4MDI4LCAweDAwMEI2RUY2LCAweDAwMEJFMDAwLAorMHgyRkU2RTAwMCwgMHg3RkVDNEYyMiwgMHg2RTQzNjI1MywgMHhCRkRDNjVGMywKKzB4QkZEMDY0MjMsIDB4QkZDRTY0RTMsIDB4RDQwMzY0RjMsIDB4MDAwOUJGQ0IsCisweDRGMjY3RjE0LCAweDZFRjYwMDBCLCAweDAwMjAzMDkwLCAweEU0RkRENTlBLAorMHhENjlBNjE1MiwgMHgyNTEyMjE0OSwgMHg3NDAxNjA1MiwgMHgyNTAyQ0IwMSwKKzB4RDE5NzY3NTIsIDB4MjU3MjI3NDksIDB4Qzg0MDYwMTAsIDB4NjA2Mjg5MDIsCisweDI2MDJDQjA0LCAweEU1MDE2MDYyLCAweDI2MDJDQjA4LCAweEU0MDI2MDYyLAorMHgyNjAyQzlDRiwgMHg0NTE4NjA2MiwgMHgyNjAyQ0IwMywgMHgwMDBCMTY0MiwKKzB4RDU4QzE2NTMsIDB4RDI4REQ3OEMsIDB4RTEwMEQ0OEQsIDB4MjUxMUU2MDAsCisweDIyMTAyNzExLCAweDI0NjFBRkQyLCAweEQyOEE2NjRDLCAweDM2MkM0NjAwLAorMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjg2NjU0QywgMHgzNTJDNDUwMCwKKzB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyODIsCisweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjdFLAorMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjc5NjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3NTY1NEMsCisweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3MSwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNkQsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsCisweEQ2Njg2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHg2MjRDNjAwQywgMHg0MjAwRDY2MywgMHg2MDIwMzI2QywKKzB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsIDB4NjQ0Q0QxNUYsCisweDYyNDAzNDFDLCAweDYwMkMwMDBCLCAweDY0NENEMTVELCAweDYyNDAzNDFDLAorMHg2MDJDMDAwQiwgMHg0RjIyMkZFNiwgMHg2NDVDNkU0MywgMHgzNDY3RTYwQSwKKzB4QkZFQjg5MTQsIDB4NjQwQzAwMDksIDB4ODgwMTYwRUMsIDB4RTAwRjhCMDIsCisweDI0MDlBMDAyLCAweDQ0MDk0NDA5LCAweEU2MEE2MjRDLCAweDg5MDUzMjYzLAorMHg2NDRDQkZFMiwgMHg2MDIzNjIwQywgMHg4QjAwQzg4MCwgMHg2MDIzRTIwMCwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4NjA2MkQ2NEEsIDB4OEIwMzg4MDEsCisweDAwMDlCMjQ2LCAweDAwMDlBMDAzLCAweEU2NDBEMjQ3LCAweEQ2NDcyMjYwLAorMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwgMHhENjQyNEYyMiwgMHg4ODAyNjA2MiwKKzB4QjI4RjhCMDEsIDB4RDY0MTAwMDksIDB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsCisweEQ0M0RENTNDLCAweEU3MDFFMTAwLCAweDAwMEIyNTEyLCAweEQyM0EyNDcwLAorMHgwMDBCRTYwNCwgMHg0RjIyMjI2MCwgMHhEMTNBRDQzOSwgMHgwMDA5NDEwQiwKKzB4RTFGREQ1MzksIDB4RDIzOTY2NTAsIDB4RTcwMDI2MTksIDB4NEYyNjI1NjAsCisweDIyNzAwMDBCLCAweEQ0MzY0RjIyLCAweDQxMEJEMTMyLCAweEQ1MzIwMDA5LAorMHg2NjUwRTdGQiwgMHg0RjI2MjY3OSwgMHgyNTYwMDAwQiwgMHhENDMxNEYyMiwKKzB4NDEwQkQxMkMsIDB4RDUyQzAwMDksIDB4NjY1MEU3RjcsIDB4NEYyNjI2NzksCisweDI1NjAwMDBCLCAweDk0MkRENTI4LCAweDIyNDk2MjUwLCAweDI1MjAwMDBCLAorMHhFNEJGRDUyNSwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhEMjI2NEYyMiwKKzB4NjAwRDg1MjIsIDB4ODkxMTIwMDgsIDB4ODkxMzg4MDEsIDB4ODkxNTg4MDMsCisweDg5NDM4ODA1LCAweDg5NDk4ODA2LCAweDg5NEY4ODA4LCAweDg5NTU4ODA5LAorMHg4OTVCODgwQSwgMHg4OTYxODgwQiwgMHgwMDA5QTA2OCwgMHgwMDA5QjA2QSwKKzB4NjAwQ0EwNjUsIDB4MDAwOUIwNzgsIDB4NjAwQ0EwNjEsIDB4MDAwOUIwODEsCisweDYwMENBMDVELCAweDAwMDBGRjdGLCAweDAwMUUyMTQ4LCAweDAwMUUxMTA4LAorMHgwMDFFMTAwMCwgMHgwMDIwMkY2MCwgMHgwMDIwMkY2MiwgMHgwMDIwMkY4MSwKKzB4MDAyMDJGNDQsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMkYsCisweDAwMUUxMDkwLCAweDAwMjAyRjY4LCAweDAwMUUxMDBCLCAweDAwMjAyRjY0LAorMHgwMDIwMzA5NCwgMHgwMDIwMTM1NiwgMHgwMDFFMTAyOCwgMHgwMDIwMkY4MCwKKzB4MDAyMDMwQTAsIDB4MDAyMDMwQjAsIDB4MDAyMDJGMzgsIDB4NjI2MEQ2ODQsCisweDhCMkIyMjI4LCAweDAwMDlCMDYxLCAweDYwMENBMDI5LCAweDYyNjBENjgwLAorMHg4QjIzMjIyOCwgMHgwMDA5QjA2OSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY3QywKKzB4OEIxQjIyMjgsIDB4MDAwOUIwQzcsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2NzgsCisweDhCMTMyMjI4LCAweDAwMDlCMENELCAweDYwMENBMDExLCAweDYyNjBENjc0LAorMHg4QjBCMjIyOCwgMHgwMDA5QjEyNSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3MCwKKzB4OEIwMzIyMjgsIDB4MDAwOUIxM0QsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsCisweDAwMDkwMDBCLCAweEQyNkNEMTZCLCAweEQ1NkM4NDEyLCAweDQwMDBDOTBGLAorMHhENzZCMDEyRCwgMHhFNDAzRDY2QiwgMHhFMjBGNjExQywgMHgyNTQwRTAwMSwKKzB4MjUyMDI3MTIsIDB4MjYwMjAwMEIsIDB4RTYwMUQyNjIsIDB4MzA2Njg1MjMsCisweEUwMDA4RDA1LCAweEQ2NjNEMjYwLCAweEUwMDE4MTIyLCAweDAwMEIyNjAyLAorMHhEMjVDMDAwOSwgMHg2MDBEODUyMywgMHg4OTA1MjAwOCwgMHg4QjBBODgwMSwKKzB4NjA2MEQ2NUQsIDB4MjYwMENCMDEsIDB4RDQ1N0Q2NUEsIDB4RTAwMUUxMDEsCisweDAwMEIyNjEyLCAweDAwMEI4MTQyLCAweEQxNTJFMDAwLCAweDg1MTNFNTAxLAorMHg2NDBENDUxOCwgMHg2NjAzMzQ1MywgMHhFMDAwOEQwNSwgMHhENTUxRDI1MywKKzB4MjI2MEUwMDEsIDB4MDAwQjI1MDIsIDB4NEYyMjAwMDksIDB4ODUxM0QxNDksCisweDY0NTM2NTBELCAweDYyNDk0NDE5LCAweDIyN0Q2NzJFLCAweDg4MDE2MDJDLAorMHg4ODAyODkwOSwgMHg4ODAzODkxMCwgMHg4ODA2ODkxQSwgMHg4ODA3ODkzNSwKKzB4QTA0Qzg5M0IsIDB4RDU0NjAwMDksIDB4NjY1MkQ3NDYsIDB4Mjc2MkQ0NDYsCisweDYyMkM2MjYxLCAweDI0MjFBMDM4LCAweDIyMjg2MjVDLCAweEQ0NDM4QjNGLAorMHg2NjQyRDU0MCwgMHgyNTYyRDQ0MCwgMHgyNDAxODU2MSwgMHg2MjAzQTAyQywKKzB4MjAwODYwNUMsIDB4ODgxMDg5MDcsIDB4ODgyMDg5MDgsIDB4ODgzMDg5MDksCisweEEwMkM4OTBBLCAweEQyM0EwMDA5LCAweDYyMjJBMDA4LCAweEEwMDVEMjM5LAorMHhEMjM5NjIyMiwgMHg2MjIyQTAwMiwgMHg2MjYyRDYzOCwgMHhENDMyRDUzMSwKKzB4NjYyMTI1MjIsIDB4QTAwRjYyNkMsIDB4RDYzNTI0MjEsIDB4NjI2MUQ1MkQsCisweDYyMkNENDJELCAweEEwMDcyNTYyLCAweEQ2MzIyNDIxLCAweDg1NjFENTI5LAorMHgyNTYyRDQyOSwgMHg2MjAzMjQwMSwgMHg2NjJEODUxNSwgMHgzNjE3NjEwRCwKKzB4NjUwMzhGMDEsIDB4QjBDQjI0NTEsIDB4QTAwMTAwMDksIDB4RTAwMEUwMDEsCisweDAwMEI0RjI2LCAweEQ2MTkwMDA5LCAweEQ0MjdFMTAxLCAweDY1NDEyNjEwLAorMHhEMTE4RDcxNywgMHhFMjBGNjU1RCwgMHgyNzUyRTAwMSwgMHgwMDBCMjYyMCwKKzB4MkZFNjIxMDIsIDB4RDIwRjRGMjIsIDB4NjQwQzg1MjMsIDB4OEIwODI0NDgsCisweEQ1MTFENjFELCAweDI2MjFFMjAwLCAweDk0MEY4NDUxLCAweEEwNDgyMDQ5LAorMHhERTBEODA1MSwgMHhDODQwNjBFMCwgMHhFMjAxOEQzMiwgMHg4OTQ0MzQyNywKKzB4RDIxNkQ2MTUsIDB4MjY0MTQyMEIsIDB4MDAwOUEwMzAsIDB4MDAwMEZGN0YsCisweDAwMjAyRjgxLCAweDAwMjAyRjM4LCAweDAwMjAyRjQ0LCAweDAwMUUxMTAwLAorMHgwMDFFMTAwQywgMHgwMDIwMkY2NCwgMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwKKzB4MDAyMDJGNkMsIDB4MDAyMDJGNEMsIDB4MDAyMDJGNTAsIDB4MDAyMDJGNTQsCisweDAwMjAyRjcwLCAweDAwMjAyRjc0LCAweDAwMjAyRjc4LCAweDAwMjAyRjdDLAorMHgwMDIwMzI4MCwgMHgwMDIwMzI4QSwgMHgwMDIwMkY1RSwgMHgwMDIwMjI1QSwKKzB4ODkxMjM0MjcsIDB4RDI5NEQ2OTMsIDB4MjY0MTQyMEIsIDB4Q0I4MDg0RTEsCisweDgwRTFCMEY1LCAweEQ2OTE2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDYwLAorMHhENjhGMjYwMCwgMHhBMDAxRTAwMSwgMHhFMDAwMjYwMiwgMHgwMDBCNEYyNiwKKzB4RDY4QzZFRjYsIDB4Qzg4MDYwNjAsIDB4RDI4Njg5MTksIDB4ODgwMTYwMjEsCisweEQyODk4QjE1LCAweDg1MjRFNTAxLCAweDg5MTAzMDU2LCAweEUyMDNEMTg3LAorMHgyMTIwRDQ4NywgMHhFMDBCNjU0MSwgMHgwNjU2NjU1RCwgMHhFNDBGRDU4NSwKKzB4MjE0MEU3MDIsIDB4RDc3RTI1NzEsIDB4MDAwQkUwMDEsIDB4MDAwQjI3MDIsCisweDJGRTZFMDAwLCAweERFODA0RjIyLCAweEM4ODA4NEUxLCAweEQ1N0E4OTJDLAorMHgyMDA4ODU1NCwgMHg2MTAzOEYyOCwgMHg4NTUzRDc3QywgMHg2NDAzNjY3MiwKKzB4ODU2NjY1MEMsIDB4MzUyMDYyMEMsIDB4RDY3OThCMUUsIDB4NjUxQ0Q3NzQsCisweDI2NTE2NDRDLCAweDYwRTAyNzQxLCAweDg5MDRDODQwLCAweDQyMEJEMjc1LAorMHhBMDAzMDAwOSwgMHhEMjY4MDAwOSwgMHgwMDA5NDIwQiwgMHgwMDA5QjA5RiwKKzB4RTIwMUQxNjcsIDB4NjBFMDIxMjIsIDB4Q0IwNEQ0NjQsIDB4NjA0MDJFMDAsCisweDI0MDBDOTNGLCAweDYwMjNBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHhEQTYyMkZFNiwgMHg2NkExRTI0MCwKKzB4MzYyMkRDNUUsIDB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsCisweDRFMjEyQTYxLCAweERCNjFENDYwLCAweEU3MDBBMDBGLCAweDc3MDE2MkIyLAorMHg3MTAyNjEyMywgMHg2NjIxMkIxMiwgMHg3MTAyNjIxMywgMHg2MTIxMkIxMiwKKzB4NjUxRDY2NkQsIDB4MzU2QzQ1MjgsIDB4NjI3QzI0NTIsIDB4OEJFRDMyRTMsCisweEM5MDM2MEQzLCAweDhCMTA4ODAzLCAweDYxNzM2N0IyLCAweDJCMTI3MTAyLAorMHg3MTAyNkUxMywgMHgyQjEyNjU3MSwgMHg2NTVENkRFMSwgMHg0MjI4NjJERCwKKzB4MzI1Q0UxMDcsIDB4QTAwQzJDMTAsIDB4ODgwMjI0MjIsIDB4QTAwMzhCMDEsCisweDg4MDFFMjAzLCAweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY1NUQ2NTYxLAorMHhFNjBGMjQ1MiwgMHg2N0ExMkM2MCwgMHg4QjA1Mjc3OCwgMHhERDM4REM0NCwKKzB4RUIwMUVBMDAsIDB4MkRCMjJDQTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDZBRjYwMDBCLCAweDJGRTYyRkQ2LCAweEUyNDBERDM2LCAweDM2MjI2NkQxLAorMHg2MjYzODkwMCwgMHgzNjc4NjcyQywgMHg3NzAzREUzOCwgMHg0NzIxMkQ2MSwKKzB4NjRFMkQ2MzUsIDB4QTAwRTQ3MjEsIDB4NjU2MkUxMDAsIDB4NjI1MzcxMDEsCisweDc0MDEyNDUwLCAweDI0MjA0MjE5LCAweDQ1Mjk3NDAxLCAweDc0MDEyNDUwLAorMHgyNDUwNDUxOSwgMHg2MjFDNzQwMSwgMHg4QkVFMzI3MywgMHg2NkUyNDIwMCwKKzB4NDIwMDYxRDEsIDB4MjExODM2MkMsIDB4MkU2MjhGMDYsIDB4REQxQ0Q3MjgsCisweEU1MDFFNDAwLCAweDJENTIyNzQyLCAweDAwMEI2RUY2LCAweDJGRDY2REY2LAorMHg0RjIyMkZFNiwgMHhFRDBBRUUwMSwgMHg2NEUzQkM5NiwgMHhCQzlCNjRFMywKKzB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4QkM5RUVFMDEsIDB4NjRFMzY0RTMsCisweDdFMDFCQ0EzLCAweDMyRDc2MkVDLCAweDRGMjY4QkY3LCAweDAwMEI2RUY2LAorMHhEMTE4NkRGNiwgMHhENDE4OTIwRCwgMHg3MjEyMjEyMiwgMHgyNDIyRDYxNywKKzB4RDcxNzcyMDQsIDB4NzIyMDI2MjIsIDB4MjcyMkQxMTYsIDB4MDAwQjcyMzAsCisweDEzN0EyMTIyLCAweDAwMjAyRjVFLCAweDAwMjAyMzY2LCAweDAwMUUxMDE1LAorMHgwMDIwMkY2NCwgMHgwMDFFMTAwMSwgMHgwMDIwMkYzOCwgMHgwMDFFMTEwMCwKKzB4MDAyMDJGNjIsIDB4MDAyMDJGNTAsIDB4MDAxRTEwMDAsIDB4MDAyMDJGNTQsCisweDAwMjAyRjYwLCAweDAwMjAyMjVBLCAweDAwMUUxMDBDLCAweDAwMjAyRjRDLAorMHgwMDIwMkY2OCwgMHgwMDIwMkY2QywgMHgwMDIwMkY3MCwgMHgwMDIwMkY3NCwKKzB4MDAyMDJGNzgsIDB4MDAyMDJGN0MsIDB4NEYyMjJGRTYsIDB4RDY1MDdGRkMsCisweDg4MDE2MDYwLCAweEUyMDE4OTUxLCAweDI2MjBCRkJCLCAweEQ1NEVEMTRELAorMHhERTRFNjAxMCwgMHg2NEUzNjU1MiwgMHg3NDAyQzg0MCwgMHg4RDIyRDE0QywKKzB4RDI0Qzc1MDIsIDB4RTYwMUQ3NEMsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NDM3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1NDIsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweEEwMjA3MTAyLCAweEQyM0UwMDA5LCAweEU2MDFENzNCLCAweEU3MDQyNzIyLAorMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDMyNzQwMiwKKzB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsCisweDgxRTQ2MDdDLCAweEU0MTdENTMzLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLAorMHg4RkY5MjE3MSwgMHg5MjRBNzEwMiwgMHhEMjI2MkUyMSwgMHg1RTIzRDcyRSwKKzB4NjRGMjJGRTIsIDB4NjA0MzY1RjIsIDB4MjcwMEM5ODAsIDB4Qzk2MDYwNDMsCisweDgwNzE2MTAzLCAweEM5MDM2MDQzLCAweDgwNzI0NTE5LCAweDY1RjI2MDVDLAorMHg4MTcyNjZGMiwgMHg0NjE5NDYyOSwgMHg2MDZDNDUyOSwgMHg0MDE4NjQ1QywKKzB4ODE3MzMwNEMsIDB4MjExODVFMjMsIDB4NjRGMjJGRTIsIDB4NkU0QzYyRjIsCisweDYwMkM0MjE5LCAweDY2RjI2MkYyLCAweDQ2Mjk0MDE4LCAweDQ2MTkzMEVDLAorMHg0MjI5ODE3NCwgMHg2NTJDNjA2QywgMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywKKzB4MDAwOUJDOUMsIDB4MjIyODYyMEMsIDB4QTAwQTg5MDgsIDB4NjAxMzAwMDksCisweDhCMDM4ODQwLCAweDAwMDlCMDA5LCAweDAwMDlBMDAzLCAweEUyMDJENjBGLAorMHg3RjA0MjYyMiwgMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwgMHgwNjBBMDAwOSwKKzB4MDAyMDJGODAsIDB4MDAxRTEwMDAsIDB4MDAyMDJGNkMsIDB4MDAyMDMyODAsCisweDAwMjAzMjhDLCAweDAwMjAzMjI0LCAweDAwMjAyRjU0LCAweDAwMjAzMjU0LAorMHgwMDIwMzI1MiwgMHgwMDIwMzIyNiwgMHgwMDIwMkYzOCwgMHgwMDIwMkY2NCwKKzB4NEYyMjJGRTYsIDB4REU5MzdGRkMsIDB4MjAwODg0RTksIDB4MkYwMDhEMDYsCisweEQ2OTJENDkxLCAweDAwMDk0NjBCLCAweDY0RjBCMTk0LCAweDY2MjBEMjkwLAorMHg4OTAyMjY2OCwgMHhDOUJGNjBFMCwgMHg3RjA0MkUwMCwgMHgwMDBCNEYyNiwKKzB4MDAwQjZFRjYsIDB4MkZFNjAwMDksIDB4REU4QTRGMjIsIDB4NjBFMEQ2OEEsCisweENCQzBENDhBLCAweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LAorMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjg0NjE2RCwKKzB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsCisweEQyODA4QkY4LCAweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLAorMHg2RUY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MjYwRDY3QSwKKzB4ODk0NDIyMjgsIDB4RDU2RkUxMDAsIDB4NjA1MDI2MTAsIDB4Q0I0MEQ0NzcsCisweDI1MDA0NDBCLCAweDhEMDUyMDA4LCAweDYyRTA2RTAzLCAweDcxMDQ2MTJDLAorMHgyRjExQTAwNiwgMHhENDcyRDY2QSwgMHhERDcyNjc2MCwgMHg2NTdDNEQwQiwKKzB4RTIzQzZEMUQsIDB4OEIwMzNEMjcsIDB4RDI2NEQ0NkYsIDB4MDAwOTQyMEIsCisweDREMjE0RDIxLCAweEEwMDVENzZELCAweDY2RTZFNDAwLCAweDM1N0M0NTA4LAorMHg3NDAxMjU2MiwgMHgzNUQzNjU0RCwgMHhENzY5OEJGNywgMHg2MTcyRTAwMywKKzB4ODExMTQwMTgsIDB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsIDB4RDQ2NTYxNzIsCisweERENjU4MTEzLCAweDREMEJERTY1LCAweEUyMDE2NTcyLCAweEQ0NjQyRTIyLAorMHg0MjBCRDI1MiwgMHhENjUzMDAwOSwgMHhDOTNGNjA2MCwgMHg3RjA0MjYwMCwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweEQyNUM0RjIyLCAweDZCNDM2RTczLCAweDQyMEI2QzUzLCAweDIwMDg2RDYzLAorMHg2MTAzOEYwOCwgMHhEMjQ1RDQ1OCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjQyMkIsIDB4MjFCMDYwQzMsIDB4NjBEMzgwMTEsIDB4RTUwMDgxMTEsCisweDY0QkNBMDA3LCAweDYwNTM2NTVELCAweDY2NTMwMEVDLCAweDc1MDEzNjFDLAorMHg2MjVEODA2NCwgMHg4QkY1MzI0MywgMHg2MDYwRDYzNiwgMHgyNjAwQzlCRiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4N0ZDNDRGMjIsCisweDcyMDI2MkYzLCAweDIyNTEyRjQxLCAweDQ1Mjk3MjAyLCAweDYwNjMyMjUxLAorMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwgMHg2NTVDNjY2QywgMHhFNDA4QkZCQywKKzB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LCAweDY1MTNFQ0ZGLAorMHg2QjEzNkNDRCwgMHhERTM2RDczNSwgMHhFREZGNjRGMywgMHhEODM1RUEwNCwKKzB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsIDB4NjYwMzhEMEQsCisweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLCAweDY5ODIwMkVELAorMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwgMHg2MDYzNjI1QywKKzB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsIDB4RTY4MDg5MDUsCisweDY3RjNFNUM1LCAweEJGN0Y2NjZDLCAweDdGM0M2NTVDLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHhEMTFFNjhGNiwKKzB4NjAxMkQyMUUsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsIDB4MDAwQjIyNDIsCisweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzMEJDLCAweDAwMjAxMzU2LAorMHgwMDIwMkYxQSwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwKKzB4MDAxRTEwRkMsIDB4MDAyMDAxNzAsIDB4MDAyMDJGMjAsIDB4MDAyMDI0QkUsCisweDAwMjAzMEMwLCAweDAwMjAxM0EyLCAweDAwMjAzMERDLCAweDAwMTE3ODhDLAorMHgwMDIwMkYxQywgMHgwMDIwMkIwMCwgMHgwMDIwMTBFRSwgMHgwMDFFMjEzMCwKKzB4MDAyMDMwRTQsIDB4MDAyMDI0ODAsIDB4MDAyMDMwRTgsIDB4MDAyMDJGMjYsCisweDAwMjAyRjJFLCAweDAwMjAzMjIwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LAorMHhENTY1RDE2NCwgMHhFNDAwRDc2NSwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwKKzB4RDU2MzI3MjIsIDB4OTY2OUQ3NjMsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsCisweEU2MDExNTY1LCAweEQ1NjAxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywKKzB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsCisweEUyMTkyNTIyLCAweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsCisweDAwMDk0MjJCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLAorMHg2RTQzOEQwMiwgMHgwMDA5QkU2RCwgMHhDODEwNjBFMywgMHhCRTZBODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwMUM4NDAsIDB4MDAwOUJFOEMsIDB4QzgwMTYwRTMsCisweEREM0U4OTM4LCAweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNDLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwgMHg0NjBCRDYzQSwgMHg2MkYwMDAwOSwKKzB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsCisweEQ2MzU4OTA2LCAweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLAorMHg4OTAyQzgwOCwgMHg0NjBCRDYzMSwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwKKzB4NDIwQkQyMkYsIDB4RDUyRjAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRThCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMkI4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhENjI4ODkyRSwgMHg2MEUzNkU2MCwKKzB4ODkwMkM4ODAsIDB4NDIwQkQyMjYsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsCisweDQyMEJEMjI0LCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIyLAorMHg2MEUzMDAwOSwgMHg4OTBFQzgwNCwgMHg0MTBCRDEyMCwgMHhCRjBFMDAwOSwKKzB4QkY0RDAwMDksIDB4RDUxRTAwMDksIDB4NjA1MEQ0MUUsIDB4QzkwOEQ3MUUsCisweEJGODQyNTAwLCAweDYwRTMyNDcyLCAweDg5MDVDODA4LCAweDdGMDREMjFCLAorMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwgMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwKKzB4MDAwMDZERjYsIDB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsCisweDAwMUQ0MDAwLCAweDAwMDQwMDIxLCAweDAwMUM1ODlDLCAweDAwMUUxMDIxLAorMHgwMDIwMTUzNiwgMHgwMDIwMTU1OCwgMHgwMDIwMUI5OCwgMHgwMDIwMTU3MCwKKzB4MDAyMDE1N0UsIDB4MDAyMDJGNjQsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsCisweDAwMjAxNUQ0LCAweDAwMjAxNUUwLCAweDAwMjAxNTg2LCAweDAwMjAxNUE0LAorMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwgMHgxMjM0NTY3OCwgMHgwMDIwMTVCQywKKzB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsIDB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsCisweDI0NTAwMDBCLCAweDY0NENENkE0LCAweDAwMEIzNDZDLCAweDYyNUMyNDUwLAorMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwgMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywKKzB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsIDB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsCisweDQyMDg2MjVDLCAweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBENDk4LAorMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywKKzB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsIDB4MjcyOTQ2MTksIDB4NkU1MzYyNjksCisweDY3MkU2NTczLCAweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLAorMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywKKzB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsCisweDg4MDE2MDIxLCAweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LAorMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywgMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwKKzB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsCisweEU2MDJFNTA2LCAweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlGLAorMHhFNDAxODVGMiwgMHhCRkFCNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwKKzB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsCisweEJGODJFNDAyLCAweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgyLAorMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywgMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwKKzB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsCisweEU1RkVFNTAwLCAweEUwMTA2NTVDLCAweEJGNjFFNDAzLCAweEU1MTMwRjU0LAorMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwgMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwKKzB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsCisweEJGNzhFNDAzLCAweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDdFNDA0LAorMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwgMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwKKzB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LAorMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwKKzB4RDI0MThCNzEsIDB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsCisweEU1MEY4QjY5LCAweEU0MDFCRjFDLCAweEJGMUVFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwgMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwKKzB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsIDB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsCisweEJGMzA2NTQzLCAweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkY2MDUzLAorMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwgMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwKKzB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsCisweEU2NDBFNTAwLCAweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLAorMHhCRUU1RTQwMywgMHhFNTEzODBGOCwgMHhFNDBFQkVFNywgMHhFNDBFODRGOCwKKzB4QkVFNzcwODUsIDB4RTUwMDY1MDMsIDB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsCisweEJFRjVFNjQwLCAweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLAorMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDRCwKKzB4RTQwRjg0RkMsIDB4QkVDRDcwODMsIDB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsCisweEU1MDFFNDA0LCAweEJFREJFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwKKzB4MDAxRTEwMkYsIDB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsCisweDAwMUUxMDNFLCAweDAwMjAyRjVFLCAweDAwMjAyRjYwLCAweDAwMjAyRjYyLAorMHhEMjFERDExQywgMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwKKzB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsCisweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLAorMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywKKzB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsCisweDQ3MDg2NzUzLCAweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLAorMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwKKzB4MDAwMDYwNjMsIDB4MDAyMDJGMTksIDB4MDAyMDJGMTgsIDB4MDAyMDJGMUEsCisweDAwMjAyQjQwLCAweDdGRkM0RjIyLCAweEU2ODBEMUE4LCAweDY2NkM2MjEyLAorMHhEMkE3MkYyMiwgMHg2N0YzNjU2MywgMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwKKzB4MDAwQjRGMjYsIDB4RTY4MDAwMDksIDB4RDJBMTY2NkMsIDB4RTcwMDY1NjMsCisweDQyMkI3NTQwLCAweEU2ODA2NDczLCAweEQyOUQ2NjZDLCAweEU3MDA2NTYzLAorMHg0MjJCNzU0MywgMHgyRkI2NjQ3MywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NEQxOEVEMDEsIDB4REI5OERDOTcsIDB4NjVDMjUyQzEsIDB4ODkyMDM1MjAsCisweEM5MDM2MDUxLCAweDg5MUM4ODAxLCAweEQxOTRERTkyLCAweDY0RTM0MTBCLAorMHg4NTAzNjUwMywgMHg2NzBENjZCMiwgMHg4OTA3Mzc2MiwgMHhEMjkxRDQ5MCwKKzB4MDAwOTQyMEIsIDB4RTcwMUQxOTAsIDB4MjE3MkFGRTYsIDB4REU4RjY0RTMsCisweDAwMDk0RTBCLCAweEQ0OEZENjhFLCAweDQxMEJEMThGLCAweEFGREIyNkQyLAorMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHg0RjIyNkJGNiwKKzB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsCisweDgxRjJEMjdCLCAweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLAorMHg2NTYzNjA1MywgMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwKKzB4MkY4NjAwMDksIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGRUM0RjIyLCAweEUwMDBEMTc2LCAweEQ0NzgyRjEyLCAweDgxRjI2MTAzLAorMHhEQzc3MUY0MiwgMHhENjc3NkIxMywgMHhFMDAxNEIwOCwgMHg0NjBCREU3NiwKKzB4M0JFQzRCMDAsIDB4NjZDMjFGMDMsIDB4MzYyMDUyQzEsIDB4QTE4MThCMDEsCisweDYwNjEwMDA5LCAweDg4MDFDOTAzLCAweEExN0I4QjAxLCAweDg1NjEwMDA5LAorMHg4QjAxQzgwMSwgMHgwMDA5QTA4MCwgMHg4NUQyNUQ2MywgMHhDOTAzNjYwMywKKzB4ODVEMzY0MDMsIDB4NjA1MzY1MEQsIDB4NDAyMTQwMjEsIDB4NDUwMEM5M0YsCisweDMyMkE2MTAzLCAweDYwNTMyNTJELCAweEM5MDFFNTEwLCAweEQ5NUUzMTUzLAorMHg2RTAzOEQyMSwgMHg0NDA4RDc2MSwgMHg0NDA4Njg3MCwgMHg0NDAwNjIxMywKKzB4Mjg4ODQyMDAsIDB4MzQyQzhGMEUsIDB4NjA0M0QyNUQsIDB4NjBFMzA3MkQsCisweDRBMTk2QTdELCAweDY1OEU2OEE5LCAweDI4NUQ4ODAxLCAweDZBN0M4RjBCLAorMHg2QTEzQTAwOSwgMHg2MDQzRDI1NywgMHg2MUVEMEUyRCwgMHg2ODE5NDExOSwKKzB4Mjg3RDY3OEUsIDB4RDE1NDZBRUMsIDB4MjIyODYyMTAsIDB4RUFGRjg5MDEsCisweEVFRkY2QUFDLCAweDZFRUM2NUFELCAweDhCMEYzNUUwLCAweDREMEJERDNGLAorMHg1NDAzNjRDMywgMHhCRjcyRTUwMiwgMHhENDRDNkQwMywgMHg0MTBCRDEzRiwKKzB4RDc0QjY1RDMsIDB4RDQ0QkVFMDEsIDB4MjdFMkEwMjUsIDB4MjY3OUU3RkMsCisweDgxRDI2MDYzLCAweDk0NjA4NUQzLCAweDYxMDMyMDQ5LCAweDQ1MDgyNjhCLAorMHgyNTFCNjA2MywgMHg2MDUzODFEMiwgMHg4NUQ0ODFEMywgMHg0MTE4RTEwOCwKKzB4ODFENDIwMUIsIDB4RUUwMjYyQzIsIDB4MjA3OTg1MjEsIDB4NjRDMjgxMjEsCisweDYwNDE2NzhELCAweENCMDEzN0UzLCAweDI0MDE4RDA0LCAweEVFRTc4NUQyLAorMHg4MUQyMjBFOSwgMHg0OTBCRDQzOCwgMHg2MEMyMDAwOSwgMHg1MkYzNjZGMiwKKzB4MkIwMkNCMDEsIDB4MjYyMkFGNkYsIDB4RDIyMDg1NjEsIDB4OEYwMkM4MDIsCisweEEwRDI2NEMzLCAweDQyMEIwMDA5LCAweEQ5MzAwMDA5LCAweDVFMDM2NTAzLAorMHgwNzlFRTA0QywgMHg3NzAxREQyRSwgMHg2OUQyMDk3NiwgMHg3OTAxRDYyNiwKKzB4NkQ2MDJEOTIsIDB4ODkwNjJERDgsIDB4RDIxOEQ0MjQsIDB4RUQwMTQyMEIsCisweEEwQjNENzIzLCAweDYyNTEyN0QyLCAweDQxMThFMTBGLCAweDIyMTlFNDAyLAorMHgzMjQwNDQxOCwgMHg4NTUxOEI0NiwgMHgyMEQ5RURGQywgMHg2MDUxODE1MSwKKzB4Q0IwMTdERTMsIDB4ODVFMTI1MDEsIDB4MjBEOUQ2MEEsIDB4NDYwQjgxRTEsCisweDY5RjI2NEMzLCAweEEwOTk1N0YzLCAweDdFMDMyOTcyLCAweDAwMUMzRDlDLAorMHgwMDIwMUUzOCwgMHgwMDIwMkIzOCwgMHgwMDIwMkYwMCwgMHgwMDIwMTA2QywKKzB4MDAyMDJCMDAsIDB4MDAyMDEwRUUsIDB4MDAxRTIxMzAsIDB4MDAyMDEwOEEsCisweDAwMUMzRDMwLCAweDAwMjAzMjAwLCAweDAwMjAxMzU2LCAweDAwMjAzMjBDLAorMHgwMDIwMkIxMCwgMHgwMDIwMjlGOCwgMHgwMDFDM0QwMCwgMHgwMDIwMzIxQywKKzB4MDAyMDMxMDAsIDB4MDAyMDMxODAsIDB4MDAyMDJGMTQsIDB4MDAyMDJCMDgsCisweDAwMUUyMTJDLCAweDAwMjAzMjA0LCAweDAwMjAzMjA4LCAweDAwMjAyQUE0LAorMHgwMDIwMzIyMCwgMHg2RERENkQ1MSwgMHg2REQ5NEQxOSwgMHgyRDZENjZERSwKKzB4NjBEQzdEMDEsIDB4NDExODYxMDMsIDB4OEY0NTg4MDEsIDB4RDY1QjI1MTEsCisweDc0MDE2NDYyLCAweDg1RTMyNjQyLCAweDYwNjM2NjBELCAweDQwMjE0MDIxLAorMHg0NjAwQzkzRiwgMHgzMjJBNkQwMywgMHg2MDYzMjYyRCwgMHhEMTU0QzgwMSwKKzB4ODkwMUQ5NTQsIDB4MkQ2Qjk2QTEsIDB4RTAxMEU2MDAsIDB4NjRERDBGNjQsCisweDA3RkNFMDEwLCAweDQwMDA2MDdDLCAweDYyMkQwMjFELCAweDhEMTIzMjQwLAorMHg2MDYzNjYwMywgMHhFN0ZGMDIxRCwgMHg4QjAxMzI3MCwgMHgwMUQ1QTAwQiwKKzB4MDJGQ0UwMTAsIDB4NzIwMUU2MDQsIDB4NjIyQzBGMjQsIDB4OEJFNzMyNjIsCisweDY2NkMwNkZDLCAweDYwNjM0NjAwLCAweDcxMDEwMTlELCAweEQxNDIwOTE1LAorMHg2OTdENjcxMSwgMHg4OTA3Mzk0MCwgMHg2MDJENjIxMSwgMHg4OTAzODhGRiwKKzB4REQzRTIxRDEsIDB4MkQyMEUyMDEsIDB4RURGQzg1NTEsIDB4ODE1MTIwRDksCisweEQyM0I2MDUxLCAweDY0QzNDQjAxLCAweDI1MDE0MjBCLCAweDAyRkNFMDEwLAorMHg2MTJDRDQzOCwgMHg0NDBCRTAwMSwgMHgyNzAyNjdGMiwgMHhEMjM2ODVFRiwKKzB4NDIwQjU0RjIsIDB4QUU5NjY1MEQsIDB4NDIwQjAwMDksIDB4NTQwMzAwMDksCisweDg1NDQ2RTAzLCAweDREMThFRDA4LCAweDMwRDAyMEQ5LCAweEJFNTY4QjAzLAorMHhBMDA3RTUwMSwgMHg4NTQxMDAwOSwgMHg2MjBEREQyQywgMHg4OTAxMjJEOCwKKzB4RTUwMEJFNEQsIDB4RDIyQkQ0MkEsIDB4NjVFMzQyMEIsIDB4RUQwMUQ3MkEsCisweDI3RDJBRTc5LCAweEVFMDQ4NUYyLCAweDYxMEQ3MDAxLCAweDgxRjIzMUU3LAorMHg3QzA4OEQwMiwgMHgwMDA5QUU2NiwgMHg0RjI2N0YxNCwgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4NEYyMjJGRTYsCisweDZFMjJEMjFFLCAweEM4NDA2MEUzLCAweDIyRTI4RDAyLCAweDAwMDlCREQyLAorMHg0MjE4RTI0MCwgMHg4OTAxMkUyOCwgMHgwMDA5QkRERCwgMHhDODEwNjBFMywKKzB4RDQxNzg5MDUsIDB4NDIwQkQyMTcsIDB4QkREQzAwMDksIDB4NjBFMzAwMDksCisweDg5MDFDODA1LCAweDAwMDlCRTJELCAweEM4MDI2MEUzLCAweDRGMjY4OTAyLAorMHg2RUY2QUREOSwgMHgwMDBCNEYyNiwgMHg4MDAwNkVGNiwgMHgwMDIwMzIyMCwKKzB4MDAyMDJGMjYsIDB4MDAyMDJGMkUsIDB4MDAyMDJGMjIsIDB4MDAyMDJGMjQsCisweDAwMjAxMEVFLCAweDAwMjAyOUY4LCAweDAwMjAxM0EyLCAweDAwMDA4MDAwLAorMHgwMDIwMkIwOCwgMHgwMDIwMTA4QSwgMHgwMDFFMjEyQywgMHgwMDFDMzUxMCwKKzB4MDAyMDMyMTQsIDB4MDAyMDEzNTYsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsCisweDFBMUMxRTIwLCAweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLAorMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwKKzB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsCisweDAwMDkwMDA5LCAweDAwMjAyQTIyLCAweDAwMjAyOUQ4LCAweDAwMEJFMDAwLAorMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAxODQwMDAsIDB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsCisweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwKKzB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHg1NDRGMEQwQSwgMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywgMHgyMDYzNjU0NCwKKzB4MzIyMDMyMzEsIDB4MjAzNzMwMzAsIDB4MzMzQTMxMzIsIDB4MzQzMjNBMzYsCisweDAwMDAwMDAwLCAweDAwMDAwRDBBLCAweDAwMDAwMDQzLCAweDQyNzA3MzcyLAorMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwKKzB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsIDB4NjE3NjZFNDksCisweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLAorMHgwMDIxNDQ0OSwgMHg1MjUwNDU0NSwgMHg1NzIwNEQ0RiwgMHg2NTc0Njk3MiwKKzB4NjQ2MTIwMkMsIDB4MDAzRDcyNjQsIDB4NkM2MTc2MjAsIDB4MDAwMDAwM0QsCisweDAwMDAwQTBELCAweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLAorMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwgMHgwMDBBMEQ1MiwgMHgyMDNBMzA1MSwKKzB4MDAwMDAwMjAsIDB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMyNTEsCisweDAwMDAwMDIwLCAweDIwM0EzMzUxLCAweDAwMDAwMDIwLCAweDIwM0EzNDUxLAorMHgwMDAwMDAyMCwgMHg2MTQzNzc0OCwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwKKzB4NjYyMDIwNkUsIDB4MEE2QzY5NjEsIDB4MDAwMDAwMEQsIDB4NzM2OTZGNEUsCisweDYxNDMyMDY1LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLAorMHgyMTIxNkM2OSwgMHgwMDAwMEQwQSwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwKKzB4MDAwMDBEMEEsIDB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsCisweDYyNzM1NTc2LCAweDczNzU3MzVGLCAweDY0NkU2NTcwLCAweDAwMDAwQTBELAorMHg2MjczNTU3NiwgMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwgMHgwMDAwMDA0MiwKKzB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsIDB4NDk2NzdBMjAsCisweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELCAweDY1NEM3MjQ1LAorMHgwMDAwMDA2RSwgMHgwMDAwMDA0OSwgMHgyMDc0NkY0RSwgMHg3NTZGNkU2NSwKKzB4NDkyMDY4NjcsIDB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsIDB4MDAwMDAwMDAsCisweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLAorMHgwMjAwMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMDcsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAyMDAwMEZGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwKKzB4MDAzRDcxNjUsIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLAorMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwKKzB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMjA0MDUsCisweDAyMDkwMDAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwKKzB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y0RLRndJbWFnZVNpemU9MTI5ODg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTViNWQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5jCkBAIC0wLDAgKzEsNzMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJocGFuaS5oIgorI2luY2x1ZGUgImhwdXNiLmgiCisKKworZXh0ZXJuIHUxNl90IHpmRGVsYXlXcml0ZUludGVybmFsUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHUxNl90IHpmRmx1c2hEZWxheVdyaXRlKHpkZXZfdCogZGV2KTsKKworLyoKKyAqIEFudGkgbm9pc2UgaW1tdW5pdHkgc3VwcG9ydC4gIFdlIHRyYWNrIHBoeSBlcnJvcnMgYW5kIHJlYWN0CisgKiB0byBleGNlc3NpdmUgZXJyb3JzIGJ5IGFkanVzdGluZyB0aGUgbm9pc2UgaW1tdW5pdHkgcGFyYW1ldGVycy4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmV3IEFuaSBBbGdvcml0aG0gZm9yIFN0YXRpb24gc2lkZSBvbmx5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFpNX0hBTF9OT0lTRV9JTU1VTkVfTUFYICAgICA0ICAgLyogTWF4IG5vaXNlIGltbXVuaXR5IGxldmVsICovCisjZGVmaW5lIFpNX0hBTF9TUFVSX0lNTVVORV9NQVggICAgICA3ICAgLyogTWF4IHNwdXIgaW1tdW5pdHkgbGV2ZWwgKi8KKyNkZWZpbmUgWk1fSEFMX0ZJUlNUX1NURVBfTUFYICAgICAgIDIgICAvKiBNYXggZmlyc3Qgc3RlcCBsZXZlbCAqLworCisjZGVmaW5lIFpNX0hBTF9BTklfT0ZETV9UUklHX0hJR0ggICAgICAgNTAwCisjZGVmaW5lIFpNX0hBTF9BTklfT0ZETV9UUklHX0xPVyAgICAgICAgMjAwCisjZGVmaW5lIFpNX0hBTF9BTklfQ0NLX1RSSUdfSElHSCAgICAgICAgMjAwCisjZGVmaW5lIFpNX0hBTF9BTklfQ0NLX1RSSUdfTE9XICAgICAgICAgMTAwCisjZGVmaW5lIFpNX0hBTF9BTklfTk9JU0VfSU1NVU5FX0xWTCAgICAgNAorI2RlZmluZSBaTV9IQUxfQU5JX1VTRV9PRkRNX1dFQUtfU0lHICAgIFRSVUUKKyNkZWZpbmUgWk1fSEFMX0FOSV9DQ0tfV0VBS19TSUdfVEhSICAgICBGQUxTRQorI2RlZmluZSBaTV9IQUxfQU5JX1NQVVJfSU1NVU5FX0xWTCAgICAgIDcKKyNkZWZpbmUgWk1fSEFMX0FOSV9GSVJTVEVQX0xWTCAgICAgICAgICAwCisjZGVmaW5lIFpNX0hBTF9BTklfUlNTSV9USFJfSElHSCAgICAgICAgNDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9SU1NJX1RIUl9MT1cgICAgICAgICA3CisjZGVmaW5lIFpNX0hBTF9BTklfUEVSSU9EICAgICAgICAgICAgICAgMTAwCisKKyNkZWZpbmUgWk1fSEFMX0VQX1JORCh4LCBtdWwpIFwKKyAgICAoKCgoeCklKG11bCkpID49ICgobXVsKS8yKSkgPyAoKHgpICsgKChtdWwpIC0gMSkpIC8gKG11bCkgOiAoeCkvKG11bCkpCisKK3MzMl90IEJFQUNPTl9SU1NJKHpkZXZfdCogZGV2KQoreworICAgIHMzMl90IHJzc2k7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICByc3NpID0gWk1fSEFMX0VQX1JORChIcFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMubnNfYXZnYnJzc2ksIFpNX0hBTF9SU1NJX0VQX01VTFRJUExJRVIpOworCisgICAgcmV0dXJuIHJzc2k7Cit9CisKKy8qCisgKiBTZXR1cCBBTkkgaGFuZGxpbmcuICBTZXRzIGFsbCB0aHJlc2hvbGRzIGFuZCBsZXZlbHMgdG8gZGVmYXVsdCBsZXZlbCBBTkQKKyAqIHJlc2V0cyB0aGUgY2hhbm5lbCBzdGF0aXN0aWNzCisgKi8KKwordm9pZCB6ZkhwQW5pQXR0YWNoKHpkZXZfdCogZGV2KQoreworI2RlZmluZSBOKGEpICAgICAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorICAgIHUzMl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICBjb25zdCBpbnQgdG90YWxTaXplRGVzaXJlZFtdID0geyAtNTUsIC01NSwgLTU1LCAtNTUsIC02MiB9OworICAgIGNvbnN0IGludCBjb2Fyc2VIaWdoW10gICAgICAgPSB7IC0xNCwgLTE0LCAtMTQsIC0xNCwgLTEyIH07CisgICAgY29uc3QgaW50IGNvYXJzZUxvd1tdICAgICAgICA9IHsgLTY0LCAtNjQsIC02NCwgLTY0LCAtNzAgfTsKKyAgICBjb25zdCBpbnQgZmlycHdyW10gICAgICAgICAgID0geyAtNzgsIC03OCwgLTc4LCAtNzgsIC04MCB9OworCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICAgIEhwUHJpdi0+dG90YWxTaXplRGVzaXJlZFtpXSA9IHRvdGFsU2l6ZURlc2lyZWRbaV07CisgICAgICAgIEhwUHJpdi0+Y29hcnNlSGlnaFtpXSA9IGNvYXJzZUhpZ2hbaV07CisgICAgICAgIEhwUHJpdi0+Y29hcnNlTG93W2ldID0gY29hcnNlTG93W2ldOworICAgICAgICBIcFByaXYtPmZpcnB3cltpXSA9IGZpcnB3cltpXTsKKyAgICB9CisKKyAgICAvKiBvd2wgaGFzIHBoeSBjb3VudGVycyAqLworICAgIEhwUHJpdi0+aGFzSHdQaHlDb3VudGVycyA9IDE7CisKKyAgICBtZW1zZXQoKGNoYXIgKikmSHBQcml2LT5hbmksIDAsIHNpemVvZihIcFByaXYtPmFuaSkpOworICAgIGZvciAoaSA9IDA7IGkgPCBOKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsKTsgaSsrKQorICAgIHsKKyAgICAgICAgLyogTmV3IEFOSSBzdHVmZiAqLworICAgICAgICBIcFByaXYtPmFuaVtpXS5vZmRtVHJpZ0hpZ2ggPSBaTV9IQUxfQU5JX09GRE1fVFJJR19ISUdIOworICAgICAgICBIcFByaXYtPmFuaVtpXS5vZmRtVHJpZ0xvdyA9IFpNX0hBTF9BTklfT0ZETV9UUklHX0xPVzsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0uY2NrVHJpZ0hpZ2ggPSBaTV9IQUxfQU5JX0NDS19UUklHX0hJR0g7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLmNja1RyaWdMb3cgPSBaTV9IQUxfQU5JX0NDS19UUklHX0xPVzsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0ucnNzaVRockhpZ2ggPSBaTV9IQUxfQU5JX1JTU0lfVEhSX0hJR0g7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLnJzc2lUaHJMb3cgPSBaTV9IQUxfQU5JX1JTU0lfVEhSX0xPVzsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0ub2ZkbVdlYWtTaWdEZXRlY3RPZmYgPSAhWk1fSEFMX0FOSV9VU0VfT0ZETV9XRUFLX1NJRzsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0uY2NrV2Vha1NpZ1RocmVzaG9sZCA9IFpNX0hBTF9BTklfQ0NLX1dFQUtfU0lHX1RIUjsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0uc3B1ckltbXVuaXR5TGV2ZWwgPSBaTV9IQUxfQU5JX1NQVVJfSU1NVU5FX0xWTDsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0uZmlyc3RlcExldmVsID0gWk1fSEFMX0FOSV9GSVJTVEVQX0xWTDsKKyAgICAgICAgaWYgKEhwUHJpdi0+aGFzSHdQaHlDb3VudGVycykKKyAgICAgICAgeworICAgICAgICAgICAgSHBQcml2LT5hbmlbaV0ub2ZkbVBoeUVyckJhc2UgPSAwOy8vQVJfUEhZX0NPVU5UTUFYIC0gWk1fSEFMX0FOSV9PRkRNX1RSSUdfSElHSDsKKyAgICAgICAgICAgIEhwUHJpdi0+YW5pW2ldLmNja1BoeUVyckJhc2UgPSAwOy8vQVJfUEhZX0NPVU5UTUFYIC0gWk1fSEFMX0FOSV9DQ0tfVFJJR19ISUdIOworICAgICAgICB9CisgICAgfQorICAgIGlmIChIcFByaXYtPmhhc0h3UGh5Q291bnRlcnMpCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzIoIlNldHRpbmcgT2ZkbUVyckJhc2UgPSAweCIsIEhwUHJpdi0+YW5pWzBdLm9mZG1QaHlFcnJCYXNlKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJTZXR0aW5nIGNja0VyckJhc2UgPSAweCIsIEhwUHJpdi0+YW5pWzBdLmNja1BoeUVyckJhc2UpOworICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl8xLCBIcFByaXYtPmFuaVswXS5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzIsIEhwUHJpdi0+YW5pWzBdLmNja1BoeUVyckJhc2UpOworICAgIH0KKyAgICBIcFByaXYtPmFuaVBlcmlvZCA9IFpNX0hBTF9BTklfUEVSSU9EOworICAgIC8vaWYgKGF0aF9oYWxfZW5hYmxlQU5JKQorICAgIEhwUHJpdi0+cHJvY1BoeUVyciB8PSBaTV9IQUxfUFJPQ0VTU19BTkk7CisKKyAgICBIcFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMubnNfYXZnYnJzc2kgPSBaTV9SU1NJX0RVTU1ZX01BUktFUjsKKyAgICBIcFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMubnNfYXZncnNzaSA9IFpNX1JTU0lfRFVNTVlfTUFSS0VSOworICAgIEhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmd0eHJzc2kgPSBaTV9SU1NJX0RVTU1ZX01BUktFUjsKKyN1bmRlZiBOCit9CisKKy8qCisgKiBDb250cm9sIEFkYXB0aXZlIE5vaXNlIEltbXVuaXR5IFBhcmFtZXRlcnMKKyAqLwordThfdCB6ZkhwQW5pQ29udHJvbCh6ZGV2X3QqIGRldiwgWk1fSEFMX0FOSV9DTUQgY21kLCBpbnQgcGFyYW0pCit7CisjZGVmaW5lIE4oYSkgKHNpemVvZihhKS9zaXplb2YoYVswXSkpCisgICAgdHlwZWRlZiBzMzJfdCBUQUJMRVtdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlID0gSHBQcml2LT5jdXJhbmk7CisKKyAgICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgY2FzZSBaTV9IQUxfQU5JX05PSVNFX0lNTVVOSVRZX0xFVkVMOgorICAgIHsKKyAgICAgICAgdTMyX3QgbGV2ZWwgPSBwYXJhbTsKKworICAgICAgICBpZiAobGV2ZWwgPj0gTihIcFByaXYtPnRvdGFsU2l6ZURlc2lyZWQpKQorICAgICAgICB7CisgICAgICAgICAgem1fZGVidWdfbXNnMSgibGV2ZWwgb3V0IG9mIHJhbmdlLCBkZXNpcmVkIGxldmVsIDogIiwgbGV2ZWwpOworICAgICAgICAgIHptX2RlYnVnX21zZzEoIm1heCBsZXZlbCA6ICIsIE4oSHBQcml2LT50b3RhbFNpemVEZXNpcmVkKSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfREVTSVJFRF9TWiwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlEZXNpcmVkU1ogJiB+QVJfUEhZX0RFU0lSRURfU1pfVE9UX0RFUykKKyAgICAgICAgICAgICAgICB8ICgoSHBQcml2LT50b3RhbFNpemVEZXNpcmVkW2xldmVsXSA8PCBBUl9QSFlfREVTSVJFRF9TWl9UT1RfREVTX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfREVTSVJFRF9TWl9UT1RfREVTKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX0FHQ19DVEwxLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWUFnY0N0bDEgJiB+QVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9MT1cpCisgICAgICAgICAgICAgICAgfCAoKEhwUHJpdi0+Y29hcnNlTG93W2xldmVsXSA8PCBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPV19TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9MT1cpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfQUdDX0NUTDEsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZQWdjQ3RsMSAmIH5BUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0hJR0gpCisgICAgICAgICAgICAgICAgfCAoKEhwUHJpdi0+Y29hcnNlSGlnaFtsZXZlbF0gPDwgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9ISUdIX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0hJR0gpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfRklORF9TSUcsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZRmluZFNpZyAmIH5BUl9QSFlfRklORF9TSUdfRklSUFdSKQorICAgICAgICAgICAgICAgIHwgKChIcFByaXYtPmZpcnB3cltsZXZlbF0gPDwgQVJfUEhZX0ZJTkRfU0lHX0ZJUlBXUl9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX0ZJTkRfU0lHX0ZJUlBXUikpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIGlmIChsZXZlbCA+IGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwpCisgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfbml1cCsrOworICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwpCisgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfbmlkb3duKys7CisgICAgICAgIGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgPSAodThfdClsZXZlbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWk1fSEFMX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTjoKKyAgICB7CisgICAgICAgIGNvbnN0IFRBQkxFIG0xVGhyZXNoTG93ICAgPSB7IDEyNywgICA1MCB9OworICAgICAgICBjb25zdCBUQUJMRSBtMlRocmVzaExvdyAgID0geyAxMjcsICAgNDAgfTsKKyAgICAgICAgY29uc3QgVEFCTEUgbTFUaHJlc2ggICAgICA9IHsgMTI3LCAweDRkIH07CisgICAgICAgIGNvbnN0IFRBQkxFIG0yVGhyZXNoICAgICAgPSB7IDEyNywgMHg0MCB9OworICAgICAgICBjb25zdCBUQUJMRSBtMkNvdW50VGhyICAgID0geyAgMzEsICAgMTYgfTsKKyAgICAgICAgY29uc3QgVEFCTEUgbTJDb3VudFRockxvdyA9IHsgIDYzLCAgIDQ4IH07CisgICAgICAgIHUzMl90IG9uID0gcGFyYW0gPyAxIDogMDsKKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlJfTE9XLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWVNmY29yckxvdyAmIH5BUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XKQorICAgICAgICAgICAgICAgIHwgKChtMVRocmVzaExvd1tvbl0gPDwgQVJfUEhZX1NGQ09SUl9MT1dfTTFfVEhSRVNIX0xPV19TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1NGQ09SUl9MT1dfTTFfVEhSRVNIX0xPVykpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlJfTE9XLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWVNmY29yckxvdyAmIH5BUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XKQorICAgICAgICAgICAgICAgIHwgKChtMlRocmVzaExvd1tvbl0gPDwgQVJfUEhZX1NGQ09SUl9MT1dfTTJfVEhSRVNIX0xPV19TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1NGQ09SUl9MT1dfTTJfVEhSRVNIX0xPVykpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlIsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyICYgfkFSX1BIWV9TRkNPUlJfTTFfVEhSRVNIKQorICAgICAgICAgICAgICAgIHwgKChtMVRocmVzaFtvbl0gPDwgQVJfUEhZX1NGQ09SUl9NMV9USFJFU0hfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9TRkNPUlJfTTFfVEhSRVNIKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUiwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlTZmNvcnIgJiB+QVJfUEhZX1NGQ09SUl9NMl9USFJFU0gpCisgICAgICAgICAgICAgICAgfCAoKG0yVGhyZXNoW29uXSA8PCBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSF9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1NGQ09SUl9NMl9USFJFU0gpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWVNmY29yciAmIH5BUl9QSFlfU0ZDT1JSX00yQ09VTlRfVEhSKQorICAgICAgICAgICAgICAgIHwgKChtMkNvdW50VGhyW29uXSA8PCBBUl9QSFlfU0ZDT1JSX00yQ09VTlRfVEhSX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX00yQ09VTlRfVEhSKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUl9MT1csCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyTG93ICYgfkFSX1BIWV9TRkNPUlJfTE9XX00yQ09VTlRfVEhSX0xPVykKKyAgICAgICAgICAgICAgICB8ICgobTJDb3VudFRockxvd1tvbl0gPDwgQVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX0xPV19NMkNPVU5UX1RIUl9MT1cpKTsKKworICAgICAgICBpZiAob24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUl9MT1csCisgICAgICAgICAgICAgICAgICAgIEhwUHJpdi0+cmVnUEhZU2Zjb3JyTG93IHwgQVJfUEhZX1NGQ09SUl9MT1dfVVNFX1NFTEZfQ09SUl9MT1cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSX0xPVywKKyAgICAgICAgICAgICAgICAgICAgSHBQcml2LT5yZWdQSFlTZmNvcnJMb3cgJiB+QVJfUEhZX1NGQ09SUl9MT1dfVVNFX1NFTEZfQ09SUl9MT1cpOworICAgICAgICB9CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIGlmICghb24gIT0gYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob24pCisgICAgICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX29mZG1vbisrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9vZmRtb2ZmKys7CisgICAgICAgICAgICBhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYgPSAhb247CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWk1fSEFMX0FOSV9DQ0tfV0VBS19TSUdOQUxfVEhSOgorICAgIHsKKyAgICAgICAgY29uc3QgVEFCTEUgd2Vha1NpZ1RockNjayA9IHsgOCwgNiB9OworICAgICAgICB1MzJfdCBoaWdoID0gcGFyYW0gPyAxIDogMDsKKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9DQ0tfREVURUNULAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWUNja0RldGVjdCAmIH5BUl9QSFlfQ0NLX0RFVEVDVF9XRUFLX1NJR19USFJfQ0NLKQorICAgICAgICAgICAgICAgIHwgKCh3ZWFrU2lnVGhyQ2NrW2hpZ2hdIDw8IEFSX1BIWV9DQ0tfREVURUNUX1dFQUtfU0lHX1RIUl9DQ0tfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9DQ0tfREVURUNUX1dFQUtfU0lHX1RIUl9DQ0spKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgaWYgKGhpZ2ggIT0gYW5pU3RhdGUtPmNja1dlYWtTaWdUaHJlc2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoaWdoKQorICAgICAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9jY2toaWdoKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2Nja2xvdysrOworICAgICAgICAgICAgYW5pU3RhdGUtPmNja1dlYWtTaWdUaHJlc2hvbGQgPSAodThfdCloaWdoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTDoKKyAgICB7CisgICAgICAgIGNvbnN0IFRBQkxFIGZpcnN0ZXAgPSB7IDAsIDQsIDggfTsKKyAgICAgICAgdTMyX3QgbGV2ZWwgPSBwYXJhbTsKKworICAgICAgICBpZiAobGV2ZWwgPj0gTihmaXJzdGVwKSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibGV2ZWwgb3V0IG9mIHJhbmdlLCBkZXNpcmVkIGxldmVsIDogIiwgbGV2ZWwpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibWF4IGxldmVsIDogIiwgTihmaXJzdGVwKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfRklORF9TSUcsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZRmluZFNpZyAmIH5BUl9QSFlfRklORF9TSUdfRklSU1RFUCkKKyAgICAgICAgICAgICAgICB8ICgoZmlyc3RlcFtsZXZlbF0gPDwgQVJfUEhZX0ZJTkRfU0lHX0ZJUlNURVBfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQKSk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIGlmIChsZXZlbCA+IGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwpCisgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfc3RlcHVwKys7CisgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9zdGVwZG93bisrOworICAgICAgICBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID0gKHU4X3QpbGV2ZWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFpNX0hBTF9BTklfU1BVUl9JTU1VTklUWV9MRVZFTDoKKyAgICB7CisgICAgICAgIGNvbnN0IFRBQkxFIGN5Y3B3clRocjEgPSB7IDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2IH07CisgICAgICAgIHUzMl90IGxldmVsID0gcGFyYW07CisKKyAgICAgICAgaWYgKGxldmVsID49IE4oY3ljcHdyVGhyMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImxldmVsIG91dCBvZiByYW5nZSwgZGVzaXJlZCBsZXZlbCA6ICIsIGxldmVsKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIm1heCBsZXZlbCA6ICIsIE4oY3ljcHdyVGhyMSkpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1RJTUlORzUsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZVGltaW5nNSAmIH5BUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMSkKKyAgICAgICAgICAgICAgICB8ICgoY3ljcHdyVGhyMVtsZXZlbF0gPDwgQVJfUEhZX1RJTUlORzVfQ1lDUFdSX1RIUjFfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxKSk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIGlmIChsZXZlbCA+IGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9zcHVydXArKzsKKyAgICAgICAgZWxzZSBpZiAobGV2ZWwgPCBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwpCisgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfc3B1cmRvd24rKzsKKyAgICAgICAgYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsID0gKHU4X3QpbGV2ZWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFpNX0hBTF9BTklfUFJFU0VOVDoKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgQUhfUFJJVkFURV9ESUFHCisgICAgY2FzZSBaTV9IQUxfQU5JX01PREU6CisgICAgICAgIGlmIChwYXJhbSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBIcFByaXYtPnByb2NQaHlFcnIgJj0gflpNX0hBTF9QUk9DRVNTX0FOSTsKKyAgICAgICAgICAgIC8qIFR1cm4gb2ZmIEhXIGNvdW50ZXJzIGlmIHdlIGhhdmUgdGhlbSAqLworICAgICAgICAgICAgemZIcEFuaURldGFjaChkZXYpOworICAgICAgICAgICAgLy96ZkhwU2V0UnhGaWx0ZXIoZGV2LCB6ZkhwR2V0UnhGaWx0ZXIoZGV2KSAmfiBIQUxfUlhfRklMVEVSX1BIWUVSUik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgICAvKiBub3JtYWwvYXV0byBtb2RlICovCisgICAgICAgICAgICBIcFByaXYtPnByb2NQaHlFcnIgfD0gWk1fSEFMX1BST0NFU1NfQU5JOworICAgICAgICAgICAgaWYgKEhwUHJpdi0+aGFzSHdQaHlDb3VudGVycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3pmSHBTZXRSeEZpbHRlcihkZXYsIHpmSHBHZXRSeEZpbHRlcihkZXYpICZ+IEhBTF9SWF9GSUxURVJfUEhZRVJSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3pmSHBTZXRSeEZpbHRlcihkZXYsIHpmSHBHZXRSeEZpbHRlcihkZXYpIHwgSEFMX1JYX0ZJTFRFUl9QSFlFUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fSEFMX0FOSV9QSFlFUlJfUkVTRVQ6CisgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9vZmRtZXJycyA9IDA7CisgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9jY2tlcnJzID0gMDsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQUhfUFJJVkFURV9ESUFHICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgem1fZGVidWdfbXNnMSgiaW52YWxpZCBjbWQgIiwgY21kKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyN1bmRlZiAgTgorfQorCit2b2lkIHpmSHBBbmlSZXN0YXJ0KHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIGFuaVN0YXRlID0gSHBQcml2LT5jdXJhbmk7CisKKyAgICBhbmlTdGF0ZS0+bGlzdGVuVGltZSA9IDA7CisgICAgaWYgKEhwUHJpdi0+aGFzSHdQaHlDb3VudGVycykKKyAgICB7CisgICAgICAgIC8vaWYgKGFuaVN0YXRlLT5vZmRtVHJpZ0hpZ2ggPiBBUl9QSFlfQ09VTlRNQVgpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UgPSAwOworICAgICAgICAvLyAgICB6bV9kZWJ1Z19tc2cwKCJPRkRNIFRyaWdnZXIgaXMgdG9vIGhpZ2ggZm9yIGh3IGNvdW50ZXJzIik7CisgICAgICAgIC8vfQorICAgICAgICAvL2Vsc2UKKyAgICAgICAgLy8gICAgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlID0gQVJfUEhZX0NPVU5UTUFYIC0gYW5pU3RhdGUtPm9mZG1UcmlnSGlnaDsKKyAgICAgICAgLy9pZiAoYW5pU3RhdGUtPmNja1RyaWdIaWdoID4gQVJfUEhZX0NPVU5UTUFYKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UgPSAwOworICAgICAgICAvLyAgICB6bV9kZWJ1Z19tc2cwKCJDQ0sgVHJpZ2dlciBpcyB0b28gaGlnaCBmb3IgaHcgY291bnRlcnMiKTsKKyAgICAgICAgLy99CisgICAgICAgIC8vZWxzZQorICAgICAgICAvLyAgICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSA9IEFSX1BIWV9DT1VOVE1BWCAtIGFuaVN0YXRlLT5jY2tUcmlnSGlnaDsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJXcml0aW5nIG9mZG1iYXNlID0gMHgiLCBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UpOworICAgICAgICAvL3ptX2RlYnVnX21zZzIoIldyaXRpbmcgY2NrYmFzZSA9IDB4IiwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpOworICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl8xLCBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UpOworICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl8yLCBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSX01BU0tfMSwgQVJfUEhZX0VSUl9PRkRNX1RJTUlORyk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSX01BU0tfMiwgQVJfUEhZX0VSUl9DQ0tfVElNSU5HKTsKKyAgICAgICAgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlID0gMDsKKyAgICAgICAgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UgPSAwOworICAgIH0KKyAgICBhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ID0gMDsKKyAgICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgPSAwOworfQorCit2b2lkIHpmSHBBbmlPZmRtRXJyVHJpZ2dlcih6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAqYW5pU3RhdGU7CisgICAgczMyX3QgcnNzaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIC8vSEFMQVNTRVJUKGNoYW4gIT0gTlVMTCk7CisKKyAgICBpZiAoKEhwUHJpdi0+cHJvY1BoeUVyciAmIFpNX0hBTF9QUk9DRVNTX0FOSSkgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKyAgICAvKiBGaXJzdCwgcmFpc2Ugbm9pc2UgaW1tdW5pdHkgbGV2ZWwsIHVwIHRvIG1heCAqLworICAgIGlmIChhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsIDwgWk1fSEFMX05PSVNFX0lNTVVORV9NQVgpCisgICAgeworICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfTk9JU0VfSU1NVU5JVFlfTEVWRUwsIGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgKyAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiB0aGVuLCByYWlzZSBzcHVyIGltbXVuaXR5IGxldmVsLCB1cCB0byBtYXggKi8KKyAgICBpZiAoYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsIDwgWk1fSEFMX1NQVVJfSU1NVU5FX01BWCkKKyAgICB7CisgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9TUFVSX0lNTVVOSVRZX0xFVkVMLCBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwgKyAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByc3NpID0gQkVBQ09OX1JTU0koZGV2KTsKKyAgICBpZiAocnNzaSA+IGFuaVN0YXRlLT5yc3NpVGhySGlnaCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiByc3NpIGlzIGhpZ2gsIGNhbiB0dXJuIG9mZiBvZmRtIHdlYWsgc2lnIGRldGVjdC4KKyAgICAgICAgICovCisgICAgICAgIGlmICghYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfT0ZETV9XRUFLX1NJR05BTF9ERVRFQ1RJT04sIEZBTFNFKTsKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9TUFVSX0lNTVVOSVRZX0xFVkVMLCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBJZiB3ZWFrIHNpZyBkZXRlY3QgaXMgYWxyZWFkeSBvZmYsIGFzIGxhc3QgcmVzb3J0LCByYWlzZQorICAgICAgICAgKiBmaXJzdCBzdGVwIGxldmVsCisgICAgICAgICAqLworICAgICAgICBpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA8IFpNX0hBTF9GSVJTVF9TVEVQX01BWCkKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgKyAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChyc3NpID4gYW5pU3RhdGUtPnJzc2lUaHJMb3cpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gcnNzaSBpbiBtaWQgcmFuZ2UsIG5lZWQgb2ZkbSB3ZWFrIHNpZ25hbCBkZXRlY3QsCisgICAgICAgICAqIGJ1dCB3ZSBjYW4gcmFpc2UgZmlyc3RzdGVwTGV2ZWwKKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpCisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfT0ZETV9XRUFLX1NJR05BTF9ERVRFQ1RJT04sIFRSVUUpOworICAgICAgICBpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA8IFpNX0hBTF9GSVJTVF9TVEVQX01BWCkKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLCBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsICsgMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaXMgbG93LCBpZiBpbiAxMWIvZyBtb2RlLCB0dXJuIG9mZiBvZmRtCisgICAgICAgICAqIHdlYWsgc2lnbiBkZXRjdGlvbiBhbmQgemVybyBmaXJzdGVwTGV2ZWwgdG8gbWF4aW1pemUKKyAgICAgICAgICogQ0NLIHNlbnNpdGl2aXR5CisgICAgICAgICAqLworICAgICAgICBpZiAod2QtPmZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmKQorICAgICAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwgRkFMU0UpOworICAgICAgICAgICAgaWYgKGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPiAwKQorICAgICAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZkhwQW5pQ2NrRXJyVHJpZ2dlcih6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAqYW5pU3RhdGU7CisgICAgczMyX3QgcnNzaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIC8vSEFMQVNTRVJUKGNoYW4gIT0gTlVMTCk7CisKKyAgICBpZiAoKEhwUHJpdi0+cHJvY1BoeUVyciAmIFpNX0hBTF9QUk9DRVNTX0FOSSkgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogZmlyc3QsIHJhaXNlIG5vaXNlIGltbXVuaXR5IGxldmVsLCB1cCB0byBtYXggKi8KKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworICAgIGlmIChhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsIDwgWk1fSEFMX05PSVNFX0lNTVVORV9NQVgpCisgICAgeworICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfTk9JU0VfSU1NVU5JVFlfTEVWRUwsCisgICAgICAgICAgICAgICAgIGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgKyAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByc3NpID0gQkVBQ09OX1JTU0koZGV2KTsKKyAgICBpZiAocnNzaSA+ICBhbmlTdGF0ZS0+cnNzaVRockxvdykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiBzaWduYWwgaW4gbWlkIGFuZCBoaWdoIHJhbmdlLCByYWlzZSBmaXJzdGVwbGV2ZWwuCisgICAgICAgICAqLworICAgICAgICBpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA8IFpNX0hBTF9GSVJTVF9TVEVQX01BWCkKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLCBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsICsgMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiByc3NpIGlzIGxvdywgemVybyBmaXJzdGVwTGV2ZWwgdG8gbWF4aW1pemUKKyAgICAgICAgICogQ0NLIHNlbnNpdGl2aXR5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA+IDApCisgICAgICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIDApOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmSHBBbmlMb3dlckltbXVuaXR5KHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKyAgICBzMzJfdCByc3NpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKworICAgIHJzc2kgPSBCRUFDT05fUlNTSShkZXYpOworICAgIGlmIChyc3NpID4gYW5pU3RhdGUtPnJzc2lUaHJIaWdoKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHNpZ25hbCBpcyBoaWdoLCBsZWF2ZSBvZmRtIHdlYWsgc2lnbmFsIGRldGVjdGlvbiBvZmYKKyAgICAgICAgICogb3IgaXQgbWF5IG9zY2lsbGF0ZS4gTGV0IGl0IGZhbGwgdGhyb3VnaC4KKyAgICAgICAgICovCisgICAgfQorICAgIGVsc2UgaWYgKHJzc2kgPiBhbmlTdGF0ZS0+cnNzaVRockxvdykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiByc3NpIGluIG1pZCByYW5nZSwgdHVybiBvbiBvZmRtIHdlYWsgc2lnbmFsCisgICAgICAgICAqIGRldGVjdGlvbiBvciBsb3dlciBmaXJzdCBzdGVwIGxldmVsLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OLCBUUlVFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLCBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsIC0gMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaXMgbG93LCByZWR1Y2UgZmlyc3Qgc3RlcCBsZXZlbC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgLSAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiB0aGVuIGxvd2VyIHNwdXIgaW1tdW5pdHkgbGV2ZWwsIGRvd24gdG8gemVybyAqLworICAgIGlmIChhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwgPiAwKQorICAgIHsKKyAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUwsIGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCAtIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qCisgICAgICogaWYgYWxsIGVsc2UgZmFpbHMsIGxvd2VyIG5vaXNlIGltbXVuaXR5IGxldmVsIGRvd24gdG8gYSBtaW4gdmFsdWUKKyAgICAgKiB6ZXJvIGZvciBub3cKKyAgICAgKi8KKyAgICBpZiAoYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCA+IDApCisgICAgeworICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfTk9JU0VfSU1NVU5JVFlfTEVWRUwsIGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgLSAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworI2RlZmluZSBDTE9DS19SQVRFIDQ0MDAwICAgIC8qIFhYWCB1c2UgbWFjX3VzZWMgb3Igc2ltaWxhciAqLworLyogY29udmVydCBIVyBjb3VudGVyIHZhbHVlcyB0byBtcyB1c2luZyAxMWcgY2xvY2sgcmF0ZSwgZ29vOWQgZW5vdWdoCisgICBmb3IgMTFhIGFuZCBUdXJibyAqLworCisvKgorICogUmV0dXJuIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHRpbWUgc3BlbnQgYGBsaXN0ZW5pbmcnJyBieQorICogZGVkdWN0aW5nIHRoZSBjeWNsZXMgc3BlbnQgdHgnaW5nIGFuZCByeCdpbmcgZnJvbSB0aGUgdG90YWwKKyAqIGN5Y2xlIGNvdW50IHNpbmNlIG91ciBsYXN0IGNhbGwuICBBIHJldHVybiB2YWx1ZSA8MCBpbmRpY2F0ZXMKKyAqIGFuIGludmFsaWQvaW5jb25zaXN0ZW50IHRpbWUuCisgKi8KK3MzMl90IHpmSHBBbmlHZXRMaXN0ZW5UaW1lKHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKyAgICB1MzJfdCB0eEZyYW1lQ291bnQsIHJ4RnJhbWVDb3VudCwgY3ljbGVDb3VudDsKKyAgICBzMzJfdCBsaXN0ZW5UaW1lOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgdHhGcmFtZUNvdW50ID0gMDsvL09TX1JFR19SRUFEKGFoLCBBUl9URkNOVCk7CisgICAgcnhGcmFtZUNvdW50ID0gMDsvL09TX1JFR19SRUFEKGFoLCBBUl9SRkNOVCk7CisgICAgY3ljbGVDb3VudCA9IDA7Ly9PU19SRUdfUkVBRChhaCwgQVJfQ0NDTlQpOworCisgICAgYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKyAgICBpZiAoYW5pU3RhdGUtPmN5Y2xlQ291bnQgPT0gMCB8fCBhbmlTdGF0ZS0+Y3ljbGVDb3VudCA+IGN5Y2xlQ291bnQpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDeWNsZSBjb3VudGVyIHdyYXAgKG9yIGluaXRpYWwgY2FsbCk7IGl0J3Mgbm90IHBvc3NpYmxlCisgICAgICAgICAqIHRvIGFjY3VyYXRlbHkgY2FsY3VsYXRlIGEgdmFsdWUgYmVjYXVzZSB0aGUgcmVnaXN0ZXJzCisgICAgICAgICAqIHJpZ2h0IHNoaWZ0IHJhdGhlciB0aGFuIHdyYXAtLXNvIHB1bnQgYW5kIHJldHVybiAwLgorICAgICAgICAgKi8KKyAgICAgICAgbGlzdGVuVGltZSA9IDA7CisgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9semVybysrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzMzJfdCBjY2RlbHRhID0gY3ljbGVDb3VudCAtIGFuaVN0YXRlLT5jeWNsZUNvdW50OworICAgICAgICBzMzJfdCByZmRlbHRhID0gcnhGcmFtZUNvdW50IC0gYW5pU3RhdGUtPnJ4RnJhbWVDb3VudDsKKyAgICAgICAgczMyX3QgdGZkZWx0YSA9IHR4RnJhbWVDb3VudCAtIGFuaVN0YXRlLT50eEZyYW1lQ291bnQ7CisgICAgICAgIGxpc3RlblRpbWUgPSAoY2NkZWx0YSAtIHJmZGVsdGEgLSB0ZmRlbHRhKSAvIENMT0NLX1JBVEU7CisgICAgfQorICAgIGFuaVN0YXRlLT5jeWNsZUNvdW50ID0gY3ljbGVDb3VudDsKKyAgICBhbmlTdGF0ZS0+dHhGcmFtZUNvdW50ID0gdHhGcmFtZUNvdW50OworICAgIGFuaVN0YXRlLT5yeEZyYW1lQ291bnQgPSByeEZyYW1lQ291bnQ7CisgICAgcmV0dXJuIGxpc3RlblRpbWU7Cit9CisKKy8qCisgKiBEbyBwZXJpb2RpYyBwcm9jZXNzaW5nLiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZQorICogZHJpdmVyJ3MgcnggaW50ZXJydXB0IGhhbmRsZXIgYWZ0ZXIgcHJvY2Vzc2luZyBmcmFtZXMuCisgKi8KK3ZvaWQgemZIcEFuaUFyUG9sbCh6ZGV2X3QqIGRldiwgdTMyX3QgbGlzdGVuVGltZSwgdTMyX3QgcGh5Q250MSwgdTMyX3QgcGh5Q250MikKK3sKKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAqYW5pU3RhdGU7CisgICAgLy9zMzJfdCBsaXN0ZW5UaW1lOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgLyoKKyAgICAgKiBTaW5jZSB3ZSdyZSBjYWxsZWQgZnJvbSBlbmQgb2YgcnggdGFza2xldCwgd2UgYWxzbyBjaGVjayBmb3IKKyAgICAgKiBBUiBwcm9jZXNzaW5nIG5vdworICAgICAqLworCisgICAgYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKyAgICAvL0hwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cyA9ICpzdGF0czsgICAgICAgLyogWFhYIG9wdGltaXplPyAqLworCisgICAgLy9saXN0ZW5UaW1lID0gemZIcEFuaUdldExpc3RlblRpbWUoZGV2KTsKKyAgICAvL2lmIChsaXN0ZW5UaW1lIDwgMCkKKyAgICAvL3sKKyAgICAvLyAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfbG5lZysrOworICAgIC8vICAgIC8qIHJlc3RhcnQgQU5JIHBlcmlvZCBpZiBsaXN0ZW5UaW1lIGlzIGludmFsaWQgKi8KKyAgICAvLyAgICB6ZkhwQW5pUmVzdGFydChkZXYpOworICAgIC8vICAgIHJldHVybjsKKyAgICAvL30KKyAgICAvKiBYWFggYmV3YXJlIG9mIG92ZXJmbG93PyAqLworICAgIGFuaVN0YXRlLT5saXN0ZW5UaW1lICs9IGxpc3RlblRpbWU7CisKKyAgICBpZiAoSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzKQorICAgIHsKKyAgICAgICAgLy91MzJfdCBwaHlDbnQxLCBwaHlDbnQyOworICAgICAgICB1MzJfdCBvZmRtUGh5RXJyQ250LCBjY2tQaHlFcnJDbnQ7CisKKyAgICAgICAgLyogTkI6IHRoZXNlIGFyZSBub3QgcmVzZXQtb24tcmVhZCAqLworICAgICAgICAvL3BoeUNudDEgPSAwOy8vT1NfUkVHX1JFQUQoYWgsIEFSX1BIWV9FUlJfMSk7CisgICAgICAgIC8vcGh5Q250MiA9IDA7Ly9PU19SRUdfUkVBRChhaCwgQVJfUEhZX0VSUl8yKTsKKyAgICAgICAgLyogWFhYIHNvbWV0aW1lcyB6ZXJvLCB3aHk/ICovCisgICAgICAgIC8vaWYgKHBoeUNudDEgPCBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UgfHwKKyAgICAgICAgLy8gICAgcGh5Q250MiA8IGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgaWYgKHBoeUNudDEgPCBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHptX2RlYnVnX21zZzIoInBoeUNudDEgPSAweCIsIHBoeUNudDEpOworICAgICAgICAvLyAgICAgICAgem1fZGVidWdfbXNnMigicmVzZXR0aW5nIGNvdW50ZXIgdmFsdWUgdG8gMHgiLCBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UpOworICAgICAgICAvLyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMSwgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlKTsKKyAgICAgICAgLy8gICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSX01BU0tfMSwgQVJfUEhZX0VSUl9PRkRNX1RJTUlORyk7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy8gICAgaWYgKHBoeUNudDIgPCBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgem1fZGVidWdfbXNnMigicGh5Q250MiA9IDB4IiwgcGh5Q250Mik7CisgICAgICAgIC8vICAgICAgICB6bV9kZWJ1Z19tc2cyKCJyZXNldHRpbmcgY291bnRlciB2YWx1ZSB0byAweCIsIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKTsKKyAgICAgICAgLy8gICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzIsIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKTsKKyAgICAgICAgLy8gICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSX01BU0tfMiwgQVJfUEhZX0VSUl9DQ0tfVElNSU5HKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICByZXR1cm47ICAgICAvKiBYWFggKi8KKyAgICAgICAgLy99CisgICAgICAgIC8qIE5COiBvbmx5IHVzZSBhc3RfYW5pXyplcnJzIHdpdGggQUhfUFJJVkFURV9ESUFHICovCisgICAgICAgIC8vb2ZkbVBoeUVyckNudCA9IHBoeUNudDEgLSBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2U7CisgICAgICAgIC8vSHBQcml2LT5zdGF0cy5hc3RfYW5pX29mZG1lcnJzICs9IG9mZG1QaHlFcnJDbnQgLSBhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50OworICAgICAgICAvL2FuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQgPSBvZmRtUGh5RXJyQ250OworICAgICAgICBvZmRtUGh5RXJyQ250ID0gcGh5Q250MTsKKyAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX29mZG1lcnJzICs9IG9mZG1QaHlFcnJDbnQ7CisgICAgICAgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQgKz0gb2ZkbVBoeUVyckNudDsKKworICAgICAgICAvL2Nja1BoeUVyckNudCA9IHBoeUNudDIgLSBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZTsKKyAgICAgICAgLy9IcFByaXYtPnN0YXRzLmFzdF9hbmlfY2NrZXJycyArPSBjY2tQaHlFcnJDbnQgLSBhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQ7CisgICAgICAgIC8vYW5pU3RhdGUtPmNja1BoeUVyckNvdW50ID0gY2NrUGh5RXJyQ250OworICAgICAgICBjY2tQaHlFcnJDbnQgPSBwaHlDbnQyOworICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfY2NrZXJycyArPSBjY2tQaHlFcnJDbnQ7CisgICAgICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCArPSBjY2tQaHlFcnJDbnQ7CisgICAgfQorICAgIC8qCisgICAgICogSWYgYW5pIGlzIG5vdCBlbmFibGVkLCByZXR1cm4gYWZ0ZXIgd2UndmUgY29sbGVjdGVkCisgICAgICogc3RhdGlzdGljcworICAgICAqLworICAgIGlmICgoSHBQcml2LT5wcm9jUGh5RXJyICYgWk1fSEFMX1BST0NFU1NfQU5JKSA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGFuaVN0YXRlLT5saXN0ZW5UaW1lID4gNSAqIEhwUHJpdi0+YW5pUGVyaW9kKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdG8gc2VlIGlmIG5lZWQgdG8gbG93ZXIgaW1tdW5pdHkgaWYKKyAgICAgICAgICogNSBhbmlQZXJpb2RzIGhhdmUgcGFzc2VkCisgICAgICAgICAqLworICAgICAgICBpZiAoYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCA8PSBhbmlTdGF0ZS0+bGlzdGVuVGltZSAqCisgICAgICAgICAgICAgYW5pU3RhdGUtPm9mZG1UcmlnTG93LzEwMDAgJiYKKyAgICAgICAgICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA8PSBhbmlTdGF0ZS0+bGlzdGVuVGltZSAqCisgICAgICAgICAgICAgYW5pU3RhdGUtPmNja1RyaWdMb3cvMTAwMCkKKyAgICAgICAgICAgIHpmSHBBbmlMb3dlckltbXVuaXR5KGRldik7CisgICAgICAgIHpmSHBBbmlSZXN0YXJ0KGRldik7CisgICAgfQorICAgIGVsc2UgaWYgKGFuaVN0YXRlLT5saXN0ZW5UaW1lID4gSHBQcml2LT5hbmlQZXJpb2QpCisgICAgeworICAgICAgICAvKiBjaGVjayB0byBzZWUgaWYgbmVlZCB0byByYWlzZSBpbW11bml0eSAqLworICAgICAgICBpZiAoYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCA+IGFuaVN0YXRlLT5saXN0ZW5UaW1lICoKKyAgICAgICAgICAgIGFuaVN0YXRlLT5vZmRtVHJpZ0hpZ2ggLyAxMDAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pT2ZkbUVyclRyaWdnZXIoZGV2KTsKKyAgICAgICAgICAgIHpmSHBBbmlSZXN0YXJ0KGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYW5pU3RhdGUtPmNja1BoeUVyckNvdW50ID4gYW5pU3RhdGUtPmxpc3RlblRpbWUgKgorICAgICAgICAgICAgICAgYW5pU3RhdGUtPmNja1RyaWdIaWdoIC8gMTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEFuaUNja0VyclRyaWdnZXIoZGV2KTsKKyAgICAgICAgICAgIHpmSHBBbmlSZXN0YXJ0KGRldik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTY5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuaApAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzJfdAlhY2tyY3ZfYmFkOworCXUzMl90CXJ0c19iYWQ7CisJdTMyX3QJcnRzX2dvb2Q7CisJdTMyX3QJZmNzX2JhZDsKKwl1MzJfdAliZWFjb25zOworfSBaTV9IQUxfTUlCX1NUQVRTOworCisvKgorICogUGVyLW5vZGUgc3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IHRoZSBkcml2ZXIgZm9yIHVzZSBpbgorICogb3B0aW1pemluZyBzaWduYWwgcXVhbGl0eSBhbmQgb3RoZXIgb3BlcmF0aW9uYWwgYXNwZWN0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMl90CW5zX2F2Z2Jyc3NpOwkvKiBhdmVyYWdlIGJlYWNvbiByc3NpICovCisJdTMyX3QJbnNfYXZncnNzaTsJICAgIC8qIGF2ZXJhZ2UgZGF0YSByc3NpICovCisJdTMyX3QJbnNfYXZndHhyc3NpOwkvKiBhdmVyYWdlIHR4IHJzc2kgKi8KK30gWk1fSEFMX05PREVfU1RBVFM7CisKKyNkZWZpbmUJWk1fSEFMX1JTU0lfRVBfTVVMVElQTElFUgkoMTw8NykJLyogcG93MiB0byBvcHRpbWl6ZSBvdXQgKiBhbmQgLyAqLworCitzdHJ1Y3QgenNBbmlTdGF0cyB7CisgICAgdTMyX3QgICBhc3RfYW5pX25pdXA7ICAgLyogQU5JIGluY3JlYXNlZCBub2lzZSBpbW11bml0eSAqLworICAgIHUzMl90ICAgYXN0X2FuaV9uaWRvd247IC8qIEFOSSBkZWNyZWFzZWQgbm9pc2UgaW1tdW5pdHkgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfc3B1cnVwOyAvKiBBTkkgaW5jcmVhc2VkIHNwdXIgaW1tdW5pdHkgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfc3B1cmRvd247LyogQU5JIGRlc2NyZWFzZWQgc3B1ciBpbW11bml0eSAqLworICAgIHUzMl90ICAgYXN0X2FuaV9vZmRtb247IC8qIEFOSSBPRkRNIHdlYWsgc2lnbmFsIGRldGVjdCBvbiAqLworICAgIHUzMl90ICAgYXN0X2FuaV9vZmRtb2ZmOy8qIEFOSSBPRkRNIHdlYWsgc2lnbmFsIGRldGVjdCBvZmYgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfY2NraGlnaDsvKiBBTkkgQ0NLIHdlYWsgc2lnbmFsIHRocmVzaG9sZCBoaWdoICovCisgICAgdTMyX3QgICBhc3RfYW5pX2Nja2xvdzsgLyogQU5JIENDSyB3ZWFrIHNpZ25hbCB0aHJlc2hvbGQgbG93ICovCisgICAgdTMyX3QgICBhc3RfYW5pX3N0ZXB1cDsgLyogQU5JIGluY3JlYXNlZCBmaXJzdCBzdGVwIGxldmVsICovCisgICAgdTMyX3QgICBhc3RfYW5pX3N0ZXBkb3duOy8qIEFOSSBkZWNyZWFzZWQgZmlyc3Qgc3RlcCBsZXZlbCAqLworICAgIHUzMl90ICAgYXN0X2FuaV9vZmRtZXJyczsvKiBBTkkgY3VtdWxhdGl2ZSBvZmRtIHBoeSBlcnIgY291bnQgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfY2NrZXJyczsvKiBBTkkgY3VtdWxhdGl2ZSBjY2sgcGh5IGVyciBjb3VudCAqLworICAgIHUzMl90ICAgYXN0X2FuaV9yZXNldDsgIC8qIEFOSSBwYXJhbWV0ZXJzIHplcm8nZCBmb3Igbm9uLVNUQSAqLworICAgIHUzMl90ICAgYXN0X2FuaV9semVybzsgIC8qIEFOSSBsaXN0ZW4gdGltZSBmb3JjZWQgdG8gemVybyAqLworICAgIHUzMl90ICAgYXN0X2FuaV9sbmVnOyAgIC8qIEFOSSBsaXN0ZW4gdGltZSBjYWxjdWxhdGVkIDwgMCAqLworICAgIFpNX0hBTF9NSUJfU1RBVFMgICBhc3RfbWlic3RhdHM7ICAgLyogTUlCIGNvdW50ZXIgc3RhdHMgKi8KKyAgICBaTV9IQUxfTk9ERV9TVEFUUyAgYXN0X25vZGVzdGF0czsgIC8qIExhdGVzdCByc3NpIHN0YXRzIGZyb20gZHJpdmVyICovCit9OworCisvKgorICogUGVyLWNoYW5uZWwgQU5JIHN0YXRlIHByaXZhdGUgdG8gdGhlIGRyaXZlci4KKyAqLworc3RydWN0IHpzQW5pU3RhdGUgeworICAgIFpNX0hBTF9DSEFOTkVMIGM7CisgICAgdThfdCAgICBub2lzZUltbXVuaXR5TGV2ZWw7CisgICAgdThfdCAgICBzcHVySW1tdW5pdHlMZXZlbDsKKyAgICB1OF90ICAgIGZpcnN0ZXBMZXZlbDsKKyAgICB1OF90ICAgIG9mZG1XZWFrU2lnRGV0ZWN0T2ZmOworICAgIHU4X3QgICAgY2NrV2Vha1NpZ1RocmVzaG9sZDsKKworICAgIC8qIFRocmVzaG9sZHMgKi8KKyAgICB1MzJfdCAgIGxpc3RlblRpbWU7CisgICAgdTMyX3QgICBvZmRtVHJpZ0hpZ2g7CisgICAgdTMyX3QgICBvZmRtVHJpZ0xvdzsKKyAgICBzMzJfdCAgIGNja1RyaWdIaWdoOworICAgIHMzMl90ICAgY2NrVHJpZ0xvdzsKKyAgICBzMzJfdCAgIHJzc2lUaHJMb3c7CisgICAgczMyX3QgICByc3NpVGhySGlnaDsKKworICAgIHUzMl90ICAgbm9pc2VGbG9vcjsgLyogVGhlIGN1cnJlbnQgbm9pc2UgZmxvb3IgKi8KKyAgICB1MzJfdCAgIHR4RnJhbWVDb3VudDsgICAvKiBMYXN0IHR4RnJhbWVDb3VudCAqLworICAgIHUzMl90ICAgcnhGcmFtZUNvdW50OyAgIC8qIExhc3QgcnggRnJhbWUgY291bnQgKi8KKyAgICB1MzJfdCAgIGN5Y2xlQ291bnQ7IC8qIExhc3QgY3ljbGVDb3VudCAoY2FuIGRldGVjdCB3cmFwLWFyb3VuZCkgKi8KKyAgICB1MzJfdCAgIG9mZG1QaHlFcnJDb3VudDsvKiBPRkRNIGVyciBjb3VudCBzaW5jZSBsYXN0IHJlc2V0ICovCisgICAgdTMyX3QgICBjY2tQaHlFcnJDb3VudDsgLyogQ0NLIGVyciBjb3VudCBzaW5jZSBsYXN0IHJlc2V0ICovCisgICAgdTMyX3QgICBvZmRtUGh5RXJyQmFzZTsgLyogQmFzZSB2YWx1ZSBmb3Igb2ZkbSBlcnIgY291bnRlciAqLworICAgIHUzMl90ICAgY2NrUGh5RXJyQmFzZTsgIC8qIEJhc2UgdmFsdWUgZm9yIGNjayBlcnIgY291bnRlcnMgKi8KKyAgICBzMTZfdCAgIHBrdFJzc2lbMl07IC8qIEF2ZXJhZ2UgcnNzaSBvZiBwa3RzIGZvciAyIGFudGVubmFzICovCisgICAgczE2X3QgICBvZmRtRXJyUnNzaVsyXTsgLyogQXZlcmFnZSByc3NpIG9mIG9mZG0gcGh5IGVycnMgZm9yIDIgYW50ICovCisgICAgczE2X3QgICBjY2tFcnJSc3NpWzJdOyAgLyogQXZlcmFnZSByc3NpIG9mIGNjayBwaHkgZXJycyBmb3IgMiBhbnQgKi8KK307CisKK3R5cGVkZWYgZW51bSB7CisJWk1fSEFMX0FOSV9QUkVTRU5ULAkJCS8qIGlzIEFOSSBzdXBwb3J0IHByZXNlbnQgKi8KKwlaTV9IQUxfQU5JX05PSVNFX0lNTVVOSVRZX0xFVkVMLAkJLyogc2V0IGxldmVsICovCisJWk1fSEFMX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwJLyogZW5hYmxlL2Rpc2FibGUgKi8KKwlaTV9IQUxfQU5JX0NDS19XRUFLX1NJR05BTF9USFIsCQkvKiBlbmFibGUvZGlzYWJsZSAqLworCVpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwJCQkvKiBzZXQgbGV2ZWwgKi8KKwlaTV9IQUxfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUwsCQkvKiBzZXQgbGV2ZWwgKi8KKwlaTV9IQUxfQU5JX01PREUsCQkJCS8qIDAgPT4gbWFudWFsLCAxID0+IGF1dG8gKi8KKwlaTV9IQUxfQU5JX1BIWUVSUl9SRVNFVCwJCQkvKiByZXNldCBwaHkgZXJyb3Igc3RhdHMgKi8KK30gWk1fSEFMX0FOSV9DTUQ7CisKKyNkZWZpbmUgQVJfUEhZX0NPVU5UTUFYICAgICAgICAoMyA8PCAyMikgICAgICAgICAvLyBNYXggY291bnRlZCBiZWZvcmUgaW50cgorI2RlZmluZSBaTV9IQUxfUFJPQ0VTU19BTkkgICAgIDB4MDAwMDAwMDEgIC8qIEFOSSBzdGF0ZSBzZXR1cCAqLworI2RlZmluZSBaTV9SU1NJX0RVTU1ZX01BUktFUgkweDEyNworCisvKiBQSFkgcmVnaXN0ZXJzIGluIGFyNTQxNiwgcmVsYXRlZCBiYXNlIGFuZCByZWdpc3RlciBvZmZzZXRzCisgICBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkIGluIG90dXMgQkIgKi8KKyNkZWZpbmUgQVJfUEhZX0JBU0UgICAgIDB4MUM1ODAwICAgICAgLyogYmFzZSBhZGRyZXNzIG9mIHBoeSByZWdzICovCisjZGVmaW5lIEFSX1BIWShfbikgICAgICAoQVJfUEhZX0JBU0UgKyAoKF9uKTw8MikpCisKKyNkZWZpbmUgQVJfUEhZX1RFU1QgICAgICAgICAgICAgMHgxQzU4MDAgICAgICAgICAgLyogUEhZIHRlc3QgY29udHJvbCAqLworI2RlZmluZSBQSFlfQUdDX0NMUiAgICAgICAgICAgICAweDEwMDAwMDAwICAgICAgLyogZGlzYWJsZSBBR0MgdG8gQTIgKi8KKyNkZWZpbmUgUkZTSUxFTlRfQkIgICAgICAgICAgICAgMHgwMDAwMjAwMCAgICAgIC8qIHNodXNoIGJiICovCisKKyNkZWZpbmUgQVJfUEhZX1RVUkJPICAgICAgICAweDFDNTgwNCAgICAgIC8qIGZyYW1lIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX1RVUkJPX01PREUgICAgICAgIDB4MDAwMDAwMDEgIC8qIFNldCB0dXJibyBtb2RlIGJpdHMgKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX1RVUkJPX1NIT1JUICAgICAgIDB4MDAwMDAwMDIgIC8qIFNldCBzaG9ydCBzeW1ib2xzIHRvIHR1cmJvIG1vZGUgc2V0dGluZyAqLworI2RlZmluZSBBUl9QSFlfRkNfRFlOMjA0MF9FTiAgICAgICAgMHgwMDAwMDAwNCAgICAgIC8qIEVuYWJsZSBkeW4gMjAvNDAgbW9kZSAqLworI2RlZmluZSBBUl9QSFlfRkNfRFlOMjA0MF9QUklfT05MWSAgICAgIDB4MDAwMDAwMDggICAgICAvKiBkeW4gMjAvNDAgLSBwcmltYXJ5IG9ubHkgKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX0RZTjIwNDBfUFJJX0NIICAgIDB4MDAwMDAwMTAgICAgICAvKiBkeW4gMjAvNDAgLSBwcmltYXJ5IGNoIG9mZnNldCAoMD0rMTBNSHosIDE9LTEwTUh6KSovCisjZGVmaW5lIEFSX1BIWV9GQ19EWU4yMDQwX0VYVF9DSCAgICAgICAgMHgwMDAwMDAyMCAgICAgIC8qIGR5biAyMC80MCAtIGV4dCBjaCBzcGFjaW5nICgwPTIwTUh6LyAxPTI1TUh6KSAqLworI2RlZmluZSBBUl9QSFlfRkNfSFRfRU4gICAgICAgICAgICAgMHgwMDAwMDA0MCAgICAgIC8qIGh0IGVuYWJsZSAqLworI2RlZmluZSBBUl9QSFlfRkNfU0hPUlRfR0lfNDAgICAgICAgMHgwMDAwMDA4MCAgICAgIC8qIGFsbG93IHNob3J0IEdJIGZvciBIVCA0MCAqLworI2RlZmluZSBBUl9QSFlfRkNfV0FMU0ggICAgICAgICAgICAgMHgwMDAwMDEwMCAgICAgIC8qIHdhbHNoIHNwYXRpYWwgc3ByZWFkaW5nIGZvciAyIGNoYWlucywyIHN0cmVhbXMgVFggKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX1NJTkdMRV9IVF9MVEYxICAgICAgICAweDAwMDAwMjAwICAgICAgLyogc2luZ2xlIGxlbmd0aCAoNHVzKSAxc3QgSFQgbG9uZyB0cmFpbmluZyBzeW1ib2wgKi8KKworI2RlZmluZSBBUl9QSFlfVElNSU5HMiAgICAgIDB4MUM1ODEwICAgICAgLyogVGltaW5nIENvbnRyb2wgMiAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HMl9VU0VfRk9SQ0UgICAgMHgwMDAwMTAwMAorI2RlZmluZSBBUl9QSFlfVElNSU5HMl9GT1JDRV9WQUwgICAgMHgwMDAwMGZmZgorCisjZGVmaW5lIEFSX1BIWV9USU1JTkczICAgICAgMHgxQzU4MTQgICAgICAvKiBUaW1pbmcgY29udHJvbCAzICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkczX0RTQ19NQU4gIDB4RkZGRTAwMDAKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzNfRFNDX01BTl9TICAgIDE3CisjZGVmaW5lIEFSX1BIWV9USU1JTkczX0RTQ19FWFAgIDB4MDAwMUUwMDAKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzNfRFNDX0VYUF9TICAgIDEzCisKKyNkZWZpbmUgQVJfUEhZX0NISVBfSUQgICAgICAgICAgMHgxQzU4MTggICAgICAvKiBQSFkgY2hpcCByZXZpc2lvbiBJRCAqLworI2RlZmluZSBBUl9QSFlfQ0hJUF9JRF9SRVZfMCAgICAweDgwICAgICAgICAvKiA1NDE2IFJldiAwIChvd2wgMS4wKSBCQiAqLworI2RlZmluZSBBUl9QSFlfQ0hJUF9JRF9SRVZfMSAgICAweDgxICAgICAgICAvKiA1NDE2IFJldiAxIChvd2wgMi4wKSBCQiAqLworCisjZGVmaW5lIEFSX1BIWV9BQ1RJVkUgICAgICAgMHgxQzU4MUMgICAgICAvKiBhY3RpdmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEFSX1BIWV9BQ1RJVkVfRU4gICAgMHgwMDAwMDAwMSAgLyogQWN0aXZhdGUgUEhZIGNoaXBzICovCisjZGVmaW5lIEFSX1BIWV9BQ1RJVkVfRElTICAgMHgwMDAwMDAwMCAgLyogRGVhY3RpdmF0ZSBQSFkgY2hpcHMgKi8KKworI2RlZmluZSBBUl9QSFlfUkZfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAweDFDNTgyNAorI2RlZmluZSBBUl9QSFlfVFhfRU5EX0RBVEFfU1RBUlQgIDB4MDAwMDAwRkYKKyNkZWZpbmUgQVJfUEhZX1RYX0VORF9EQVRBX1NUQVJUX1MgIDAKKyNkZWZpbmUgQVJfUEhZX1RYX0VORF9QQV9PTiAgICAgICAweDAwMDBGRjAwCisjZGVmaW5lIEFSX1BIWV9UWF9FTkRfUEFfT05fUyAgICAgICA4CisKKworI2RlZmluZSBBUl9QSFlfUkZfQ1RMMyAgICAgICAgICAgICAgICAgIDB4MUM1ODI4CisjZGVmaW5lIEFSX1BIWV9UWF9FTkRfVE9fQTJfUlhfT04gICAgICAgMHgwMEZGMDAwMAorI2RlZmluZSBBUl9QSFlfVFhfRU5EX1RPX0EyX1JYX09OX1MgICAgIDE2CisKKyNkZWZpbmUgQVJfUEhZX0FEQ19DVEwgICAgICAweDFDNTgyQworI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PRkZfSU5CVUZHQUlOICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT0ZGX0lOQlVGR0FJTl9TICAwCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMX09GRl9QV0REQUMgICAweDAwMDAyMDAwCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMX09GRl9QV0RCQU5ER0FQICAgMHgwMDAwNDAwMCAvKiBCQiBSZXYgNC4yKyBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMX09GRl9QV0RBREMgICAweDAwMDA4MDAwIC8qIEJCIFJldiA0LjIrIG9ubHkgKi8KKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT05fSU5CVUZHQUlOIDB4MDAwMzAwMDAKKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT05fSU5CVUZHQUlOX1MgICAxNgorCisjZGVmaW5lIEFSX1BIWV9BRENfU0VSSUFMX0NUTCAgICAgICAweDFDNTgzMAorI2RlZmluZSBBUl9QSFlfU0VMX0lOVEVSTkFMX0FEREFDICAgMHgwMDAwMDAwMAorI2RlZmluZSBBUl9QSFlfU0VMX0VYVEVSTkFMX1JBRElPICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0ICAgICAgICAgICAgICAgICAgICAweDFDNTgzNAorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9UWF9FTkRfWFBBQl9PRkYgICAgMHhGRjAwMDAwMAorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9UWF9FTkRfWFBBQl9PRkZfUyAgMjQKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfVFhfRU5EX1hQQUFfT0ZGICAgIDB4MDBGRjAwMDAKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfVFhfRU5EX1hQQUFfT0ZGX1MgIDE2CisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X0ZSQU1FX1hQQUJfT04gICAgICAweDAwMDBGRjAwCisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X0ZSQU1FX1hQQUJfT05fUyAgICA4CisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X0ZSQU1FX1hQQUFfT04gICAgICAweDAwMDAwMEZGCisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X0ZSQU1FX1hQQUFfT05fUyAgICAwCisKKyNkZWZpbmUgQVJfUEhZX1NFVFRMSU5HICAgICAweDFDNTg0NAorI2RlZmluZSBBUl9QSFlfU0VUVExJTkdfU1dJVENIICAweDAwMDAzRjgwCisjZGVmaW5lIEFSX1BIWV9TRVRUTElOR19TV0lUQ0hfUyAgICA3CisKKyNkZWZpbmUgQVJfUEhZX1JYR0FJTiAgICAgICAweDFDNTg0OAorI2RlZmluZSBBUl9QSFlfUlhHQUlOX1RYUlhfQVRURU4gICAgMHgwMDAzRjAwMAorI2RlZmluZSBBUl9QSFlfUlhHQUlOX1RYUlhfQVRURU5fUyAgMTIKKyNkZWZpbmUgQVJfUEhZX1JYR0FJTl9UWFJYX1JGX01BWCAgIDB4MDA3QzAwMDAKKyNkZWZpbmUgQVJfUEhZX1JYR0FJTl9UWFJYX1JGX01BWF9TIDE4CisKKyNkZWZpbmUgQVJfUEhZX0RFU0lSRURfU1ogICAweDFDNTg1MAorI2RlZmluZSBBUl9QSFlfREVTSVJFRF9TWl9BREMgICAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBBUl9QSFlfREVTSVJFRF9TWl9BRENfUyAgICAgMAorI2RlZmluZSBBUl9QSFlfREVTSVJFRF9TWl9QR0EgICAgICAgMHgwMDAwRkYwMAorI2RlZmluZSBBUl9QSFlfREVTSVJFRF9TWl9QR0FfUyAgICAgOAorI2RlZmluZSBBUl9QSFlfREVTSVJFRF9TWl9UT1RfREVTICAgMHgwRkYwMDAwMAorI2RlZmluZSBBUl9QSFlfREVTSVJFRF9TWl9UT1RfREVTX1MgMjAKKworI2RlZmluZSBBUl9QSFlfRklORF9TSUcgICAgICAweDFDNTg1OAorI2RlZmluZSBBUl9QSFlfRklORF9TSUdfRklSU1RFUCAgMHgwMDAzRjAwMAorI2RlZmluZSBBUl9QSFlfRklORF9TSUdfRklSU1RFUF9TICAgICAgICAxMgorI2RlZmluZSBBUl9QSFlfRklORF9TSUdfRklSUFdSICAgMHgwM0ZDMDAwMAorI2RlZmluZSBBUl9QSFlfRklORF9TSUdfRklSUFdSX1MgICAgICAgICAxOAorCisjZGVmaW5lIEFSX1BIWV9BR0NfQ1RMMSAgICAgIDB4MUM1ODVDCisjZGVmaW5lIEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfTE9XICAgICAgIDB4MDAwMDdGODAKKyNkZWZpbmUgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9MT1dfUyAgICAgICAgIDcKKyNkZWZpbmUgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9ISUdIICAgICAgMHgwMDNGODAwMAorI2RlZmluZSBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0hJR0hfUyAgICAgICAgMTUKKworI2RlZmluZSBBUl9QSFlfQUdDX0NPTlRST0wgIDB4MUM1ODYwICAgICAgLyogY2hpcCBjYWxpYnJhdGlvbiBhbmQgbm9pc2UgZmxvb3Igc2V0dGluZyAqLworI2RlZmluZSBBUl9QSFlfQUdDX0NPTlRST0xfQ0FMICAweDAwMDAwMDAxICAvKiBkbyBpbnRlcm5hbCBjYWxpYnJhdGlvbiAqLworI2RlZmluZSBBUl9QSFlfQUdDX0NPTlRST0xfTkYgICAweDAwMDAwMDAyICAvKiBkbyBub2lzZS1mbG9vciBjYWxjdWxhdGlvbiAqLworCisjZGVmaW5lIEFSX1BIWV9DQ0EgICAgICAgICAgICAgIDB4MUM1ODY0CisjZGVmaW5lIEFSX1BIWV9NSU5DQ0FfUFdSICAgICAgIDB4MUZGMDAwMDAKKyNkZWZpbmUgQVJfUEhZX01JTkNDQV9QV1JfUyAgICAgMTkKKyNkZWZpbmUgQVJfUEhZX0NDQV9USFJFU0g2MiAgICAgMHgwMDA3RjAwMAorI2RlZmluZSBBUl9QSFlfQ0NBX1RIUkVTSDYyX1MgICAxMgorCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTE9XICAgIDB4MUM1ODZDCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTE9XX1VTRV9TRUxGX0NPUlJfTE9XICAweDAwMDAwMDAxCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTE9XX00yQ09VTlRfVEhSX0xPVyAgICAweDAwMDAzRjAwCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTE9XX00yQ09VTlRfVEhSX0xPV19TICA4CisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTE9XX00xX1RIUkVTSF9MT1cgIDB4MDAxRkMwMDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTFfVEhSRVNIX0xPV19TICAgIDE0CisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTE9XX00yX1RIUkVTSF9MT1cgIDB4MEZFMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTJfVEhSRVNIX0xPV19TICAgIDIxCisKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUiAgICAgICAweDFDNTg2OAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00yQ09VTlRfVEhSICAgIDB4MDAwMDAwMUYKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9NMkNPVU5UX1RIUl9TICAwCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTTFfVEhSRVNIICAweDAwRkUwMDAwCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTTFfVEhSRVNIX1MgICAgMTcKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9NMl9USFJFU0ggIDB4N0YwMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9NMl9USFJFU0hfUyAgICAyNAorCisjZGVmaW5lIEFSX1BIWV9TTEVFUF9DVFJfQ09OVFJPTCAgICAweDFDNTg3MAorI2RlZmluZSBBUl9QSFlfU0xFRVBfQ1RSX0xJTUlUICAgICAgMHgxQzU4NzQKKyNkZWZpbmUgQVJfUEhZX1NMRUVQX1NDQUwgICAgICAgMHgxQzU4NzgKKworI2RlZmluZSBBUl9QSFlfUExMX0NUTCAgICAgICAgICAweDFDNTg3YyAgICAgIC8qIFBMTCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMXzQwICAgICAgIDB4YWEgICAgICAgIC8qIDQwIE1IeiAqLworI2RlZmluZSBBUl9QSFlfUExMX0NUTF80MF81NDEzICAweDA0CisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMXzQ0ICAgICAgIDB4YWIgICAgICAgIC8qIDQ0IE1IeiBmb3IgMTFiLCAxMWcgKi8KKyNkZWZpbmUgQVJfUEhZX1BMTF9DVExfNDRfMjEzMyAgMHhlYiAgICAgICAgLyogNDQgTUh6IGZvciAxMWIsIDExZyAqLworI2RlZmluZSBBUl9QSFlfUExMX0NUTF80MF8yMTMzICAweGVhICAgICAgICAvKiA0MCBNSHogZm9yIDExYSwgdHVyYm9zICovCisKKyNkZWZpbmUgQVJfUEhZX1JYX0RFTEFZICAgICAweDFDNTkxNCAgICAgIC8qIGFuYWxvZyBwb3ctb24gdGltZSAoMTAwbnMpICovCisjZGVmaW5lIEFSX1BIWV9SWF9ERUxBWV9ERUxBWSAgIDB4MDAwMDNGRkYgIC8qIGRlbGF5IGZyb20gd2FrZXVwIHRvIHJ4IGVuYSAqLworCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDQgICAgIDB4MUM1OTIwICAgICAgLyogdGltaW5nIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfUV9RX0NPRkYgMHgwMUYgICAvKiBNYXNrIGZvciBrY29zX3RoZXRhLTEgZm9yIHEgY29ycmVjdGlvbiAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX1FfQ09GRl9TICAgMCAgIC8qIHNoaWZ0IGZvciBRX0NPRkYgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfUV9JX0NPRkYgMHg3RTAgICAvKiBNYXNrIGZvciBzaW5fdGhldGEgZm9yIGkgY29ycmVjdGlvbiAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX0lfQ09GRl9TICAgNSAgIC8qIFNoaWZ0IGZvciBzaW5fdGhldGEgZm9yIGkgY29ycmVjdGlvbiAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9FTkFCTEUgICAweDgwMCAgIC8qIGVuYWJsZSBJUSBjb3JyZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDQUxfTE9HX0NPVU5UX01BWCAweEYwMDAgIC8qIE1hc2sgZm9yIG1heCBudW1iZXIgb2Ygc2FtcGxlcyAobG9nYXJpdGhtaWMpICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDQUxfTE9HX0NPVU5UX01BWF9TICAgMTIgIC8qIFNoaWZ0IGZvciBtYXggbnVtYmVyIG9mIHNhbXBsZXMgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9ET19JUUNBTCAgICAweDEwMDAwICAgICAvKiBwZXJmb3JtIElRIGNhbGlicmF0aW9uICovCisKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzUgICAgICAweDFDNTkyNAorI2RlZmluZSBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMSAgMHgwMDAwMDBGRQorI2RlZmluZSBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMV9TICAgIDEKKworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTEgICAweDFDNTkzNAorI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTIgICAweDFDNTkzOAorI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURV9NQVggICAgMHgxQzU5M2MKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEVfTUFYX1RQQ19FTkFCTEUgMHgwMDAwMDA0MAorCisjZGVmaW5lIEFSX1BIWV9GUkFNRV9DVEwgICAgMHgxQzU5NDQKKyNkZWZpbmUgQVJfUEhZX0ZSQU1FX0NUTF9UWF9DTElQICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgQVJfUEhZX0ZSQU1FX0NUTF9UWF9DTElQX1MgIDMKKworI2RlZmluZSBBUl9QSFlfVFhQV1JBREogICAgIDB4MUM1OTRDICAgICAgLyogQkIgUmV2IDQuMisgb25seSAqLworI2RlZmluZSBBUl9QSFlfVFhQV1JBREpfQ0NLX0dBSU5fREVMVEEgIDB4MDAwMDBGQzAKKyNkZWZpbmUgQVJfUEhZX1RYUFdSQURKX0NDS19HQUlOX0RFTFRBX1MgICAgNgorI2RlZmluZSBBUl9QSFlfVFhQV1JBREpfQ0NLX1BDREFDX0lOREVYIDB4MDBGQzAwMDAKKyNkZWZpbmUgQVJfUEhZX1RYUFdSQURKX0NDS19QQ0RBQ19JTkRFWF9TICAgMTgKKworI2RlZmluZSBBUl9QSFlfUkFEQVJfMCAgICAgIDB4MUM1OTU0ICAgICAgLyogcmFkYXIgZGV0ZWN0aW9uIHNldHRpbmdzICovCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0VOQSAgMHgwMDAwMDAwMSAgLyogRW5hYmxlIHJhZGFyIGRldGVjdGlvbiAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9JTkJBTkQgICAweDAwMDAwMDNlICAvKiBJbmJhbmQgcHVsc2UgdGhyZXNob2xkICovCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0lOQkFORF9TIDEKKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfUFJTU0kgICAgMHgwMDAwMEZDMCAgLyogUHVsc2UgcnNzaSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfUFJTU0lfUyAgNgorI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9IRUlHSFQgICAweDAwMDNGMDAwICAvKiBQdWxzZSBoZWlnaHQgdGhyZXNob2xkICovCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0hFSUdIVF9TIDEyCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX1JSU1NJICAgIDB4MDBGQzAwMDAgIC8qIFJhZGFyIHJzc2kgdGhyZXNob2xkICovCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX1JSU1NJX1MgIDE4CisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0ZJUlBXUiAgIDB4N0YwMDAwMDAgIC8qIFJhZGFyIGZpcnB3ciB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfRklSUFdSX1MgMjQKKworI2RlZmluZSBBUl9QSFlfU1dJVENIX0NIQUlOXzAgICAgIDB4MUM1OTYwCisjZGVmaW5lIEFSX1BIWV9TV0lUQ0hfQ09NICAgICAgICAgMHgxQzU5NjQKKworI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEEgIDB4MUM1OTZDICAgICAgLyogQVI1MzEyIG9ubHkgKi8KKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0FEQ19TRUwgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0FEQ19TRUxfUyAgICAwCisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQV9GSUxUMiAgICAweDAwMDAwMEY4CisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQV9GSUxUMl9TICAzCisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQV9GSUxUMSAgICAweDAwMDAxRjAwCisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQV9GSUxUMV9TICA4CisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQV9BRENfQ0xJUCAweDAxRkZFMDAwCisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQV9BRENfQ0xJUF9TICAgMTMKKworI2RlZmluZSBBUl9QSFlfUkVTVEFSVCAgICAgIDB4MUM1OTcwICAgICAgLyogcmVzdGFydCAqLworI2RlZmluZSBBUl9QSFlfUkVTVEFSVF9ESVZfR0MgICAweDAwMUMwMDAwICAvKiBiYl9hbnRfZmFzdF9kaXZfZ2NfbGltaXQgKi8KKyNkZWZpbmUgQVJfUEhZX1JFU1RBUlRfRElWX0dDX1MgMTgKKworI2RlZmluZSBBUl9QSFlfUkZCVVNfUkVRICAgICAgICAweDFDNTk3QworI2RlZmluZSBBUl9QSFlfUkZCVVNfUkVRX0VOICAgICAweDAwMDAwMDAxCisKKyNkZWZpbmUgQVJfUEhZX1JYX0NIQUlOTUFTSyAgICAgMHgxQzU5YTQKKworI2RlZmluZSBBUl9QSFlfRVhUX0NDQSAgICAgICAgICAweDFDNTliYworI2RlZmluZSBBUl9QSFlfRVhUX01JTkNDQV9QV1IgICAweEZGODAwMDAwCisjZGVmaW5lIEFSX1BIWV9FWFRfTUlOQ0NBX1BXUl9TIDIzCisKKyNkZWZpbmUgQVJfUEhZX0hBTEZHSSAgICAgICAgICAgMHgxQzU5RDAgICAgICAvKiBUaW1pbmcgY29udHJvbCAzICovCisjZGVmaW5lIEFSX1BIWV9IQUxGR0lfRFNDX01BTiAgIDB4MDAwN0ZGRjAKKyNkZWZpbmUgQVJfUEhZX0hBTEZHSV9EU0NfTUFOX1MgNAorI2RlZmluZSBBUl9QSFlfSEFMRkdJX0RTQ19FWFAgICAweDAwMDAwMDBGCisjZGVmaW5lIEFSX1BIWV9IQUxGR0lfRFNDX0VYUF9TIDAKKworI2RlZmluZSBBUl9QSFlfSEVBVllfQ0xJUF9FTkFCTEUgICAgMHgxQzU5RTAKKworI2RlZmluZSBBUl9QSFlfTV9TTEVFUCAgICAgIDB4MUM1OWYwICAgICAgLyogc2xlZXAgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVJfUEhZX1JFRkNMS0RMWSAgICAweDFDNTlmNAorI2RlZmluZSBBUl9QSFlfUkVGQ0xLUEQgICAgIDB4MUM1OWY4CisKKy8qIFBIWSBJUSBjYWxpYnJhdGlvbiByZXN1bHRzICovCisjZGVmaW5lIEFSX1BIWV9JUUNBTF9SRVNfUFdSX01FQVNfSSAweDFDNUMxMCAgLyogcG93ZXIgbWVhc3VyZW1lbnQgZm9yIEkgKi8KKyNkZWZpbmUgQVJfUEhZX0lRQ0FMX1JFU19QV1JfTUVBU19RIDB4MUM1QzE0ICAvKiBwb3dlciBtZWFzdXJlbWVudCBmb3IgUSAqLworI2RlZmluZSBBUl9QSFlfSVFDQUxfUkVTX0lRX0NPUlJfTUVBUyAgIDB4MUM1QzE4ICAvKiBJUSBjb3JyZWxhdGlvbiBtZWFzdXJlbWVudCAqLworCisjZGVmaW5lIEFSX1BIWV9DVVJSRU5UX1JTU0kgMHgxQzVDMWMgICAgICAvKiByc3NpIG9mIGN1cnJlbnQgZnJhbWUgcngnZCAqLworCisjZGVmaW5lIEFSX1BIWV9SRkJVU19HUkFOVCAgICAgICAweDFDNUMyMAorI2RlZmluZSBBUl9QSFlfUkZCVVNfR1JBTlRfRU4gICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIEFSX1BIWV9NT0RFICAgICAweDFDNjIwMCAgLyogTW9kZSByZWdpc3RlciAqLworI2RlZmluZSBBUl9QSFlfTU9ERV9BUjIxMzMgIDB4MDggICAgLyogQVIyMTMzICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX0FSNTExMSAgMHgwMCAgICAvKiBBUjUxMTEvQVIyMTExICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX0FSNTExMiAgMHgwOCAgICAvKiBBUjUxMTIqLworI2RlZmluZSBBUl9QSFlfTU9ERV9EWU5BTUlDIDB4MDQgICAgLyogZHluYW1pYyBDQ0svT0ZETSBtb2RlICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX1JGMkdIWiAgMHgwMiAgICAvKiAyLjQgR0h6ICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX1JGNUdIWiAgMHgwMCAgICAvKiA1IEdIeiAqLworI2RlZmluZSBBUl9QSFlfTU9ERV9DQ0sgICAgIDB4MDEgICAgLyogQ0NLICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX09GRE0gICAgMHgwMCAgICAvKiBPRkRNICovCisKKyNkZWZpbmUgQVJfUEhZX0NDS19UWF9DVFJMICAweDFDNjIwNAorI2RlZmluZSBBUl9QSFlfQ0NLX1RYX0NUUkxfSkFQQU4gICAgMHgwMDAwMDAxMAorCisjZGVmaW5lIEFSX1BIWV9DQ0tfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzYyMDgKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1RfV0VBS19TSUdfVEhSX0NDSyAgICAgICAgICAweDAwMDAwMDNGCisjZGVmaW5lIEFSX1BIWV9DQ0tfREVURUNUX1dFQUtfU0lHX1RIUl9DQ0tfUyAgICAgICAgMAorI2RlZmluZSBBUl9QSFlfQ0NLX0RFVEVDVF9BTlRfU1dJVENIX1RJTUUgICAgICAgICAgIDB4MDAwMDFGQzAgLy8gWzEyOjZdIHNldHRsaW5nIHRpbWUgZm9yIGFudGVubmEgc3dpdGNoCisjZGVmaW5lIEFSX1BIWV9DQ0tfREVURUNUX0FOVF9TV0lUQ0hfVElNRV9TICAgICAgICAgNgorI2RlZmluZSBBUl9QSFlfQ0NLX0RFVEVDVF9CQl9FTkFCTEVfQU5UX0ZBU1RfRElWICAgIDB4MjAwMAorCisjZGVmaW5lIEFSX1BIWV9HQUlOXzJHSFogICAgMHgxQzYyMEMKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9SWFRYX01BUkdJTiAgICAweDAwRkMwMDAwCisjZGVmaW5lIEFSX1BIWV9HQUlOXzJHSFpfUlhUWF9NQVJHSU5fUyAgMTgKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9CU1dfTUFSR0lOICAgICAweDAwMDAzQzAwCisjZGVmaW5lIEFSX1BIWV9HQUlOXzJHSFpfQlNXX01BUkdJTl9TICAgMTAKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9CU1dfQVRURU4gICAgICAweDAwMDAwMDFGCisjZGVmaW5lIEFSX1BIWV9HQUlOXzJHSFpfQlNXX0FUVEVOX1MgICAgMAorCisjZGVmaW5lIEFSX1BIWV9DQ0tfUlhDVFJMNCAgMHgxQzYyMUMKKyNkZWZpbmUgQVJfUEhZX0NDS19SWENUUkw0X0ZSRVFfRVNUX1NIT1JUICAgMHgwMUY4MDAwMAorI2RlZmluZSBBUl9QSFlfQ0NLX1JYQ1RSTDRfRlJFUV9FU1RfU0hPUlRfUyAxOQorCisjZGVmaW5lIEFSX1BIWV9EQUdfQ1RSTENDSyAgMHgxQzYyMjgKKyNkZWZpbmUgQVJfUEhZX0RBR19DVFJMQ0NLX0VOX1JTU0lfVEhSICAweDAwMDAwMjAwIC8qIEJCIFJldiA0LjIrIG9ubHkgKi8KKyNkZWZpbmUgQVJfUEhZX0RBR19DVFJMQ0NLX1JTU0lfVEhSIDB4MDAwMUZDMDAgLyogQkIgUmV2IDQuMisgb25seSAqLworI2RlZmluZSBBUl9QSFlfREFHX0NUUkxDQ0tfUlNTSV9USFJfUyAgIDEwICAgICAvKiBCQiBSZXYgNC4yKyBvbmx5ICovCisKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEUzICAgMHgxQzYyMzQKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEU0ICAgMHgxQzYyMzgKKworI2RlZmluZSBBUl9QSFlfU0NSTV9TRVFfWFIgIDB4MUM2MjNDCisjZGVmaW5lIEFSX1BIWV9IRUFERVJfREVURUNUX1hSIDB4MUM2MjQwCisjZGVmaW5lIEFSX1BIWV9DSElSUF9ERVRFQ1RFRF9YUiAgICAweDFDNjI0NAorI2RlZmluZSBBUl9QSFlfQkxVRVRPT1RIICAgIDB4MUM2MjU0CisKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMSAgIDB4MUM2MjU4ICAvKiBhcjI0MTMgcG93ZXIgY29udHJvbCAqLworI2RlZmluZSBBUl9QSFlfVFBDUkcxX05VTV9QRF9HQUlOICAgMHgwMDAwYzAwMAorI2RlZmluZSBBUl9QSFlfVFBDUkcxX05VTV9QRF9HQUlOX1MgMTQKKworI2RlZmluZSBBUl9QSFlfVFBDUkcxX1BEX0dBSU5fMSAgICAweDAwMDMwMDAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfUERfR0FJTl8xX1MgIDE2CisjZGVmaW5lIEFSX1BIWV9UUENSRzFfUERfR0FJTl8yICAgIDB4MDAwQzAwMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzJfUyAgMTgKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzMgICAgMHgwMDMwMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDUkcxX1BEX0dBSU5fM19TICAyMAorLy8KKworI2RlZmluZSBBUl9QSFlfQU5BTE9HX1NXQVAgICAgICAweGEyNjgKKyNkZWZpbmUgQVJfUEhZX1NXQVBfQUxUX0NIQUlOICAgMHgwMDAwMDA0MAorCisjZGVmaW5lIEFSX1BIWV9UUENSRzUgICAweDFDNjI2QyAvKiBhcjI0MTMgcG93ZXIgY29udHJvbCAqLworI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fT1ZFUkxBUCAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX09WRVJMQVBfUyAgICAgMAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfMSAgICAweDAwMDAwM0YwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8xX1MgIDQKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzIgICAgMHgwMDAwRkMwMAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfMl9TICAxMAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfMyAgICAweDAwM0YwMDAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8zX1MgIDE2CisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV80ICAgIDB4MEZDMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzRfUyAgMjIKKworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTUgICAweDFDNjM4QworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTYgICAweDFDNjM5MAorCisjZGVmaW5lIEFSX1BIWV9DQUxfQ0hBSU5NQVNLICAgIDB4MUM2MzlDCisKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1NVQiAgICAgMHgxQzYzQzgKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEU3ICAgMHgxQzYzQ0MKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEU4ICAgMHgxQzYzRDAKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEU5ICAgMHgxQzYzRDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3Mi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZncyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjZWIwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3Mi5jCkBAIC0wLDAgKzEsMTAxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjUDJGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFOTQ3RkZDLCAweEUxMTRENTk0LAorMHgxRTEzRDQ5NCwgMHg2NzUyMUU0QywgMHhENDk0RDY5MywgMHgzNzQwMjc2OSwKKzB4NjI1MjhGMDYsIDB4NzIwMUQ2OTIsIDB4NjA2MDI1MjIsIDB4MjYwMEM5M0YsCisweEQ3OTA2MTUyLCAweDI1MTI2MTFELCAweDI2NEI2NjUyLCAweDI1NjI0NzBCLAorMHgwMDA5QjAwRCwgMHhFNjAwOTVBQywgMHhDODQwNjBFMiwgMHgyRjAyOEYwMywKKzB4OEZGOTM2NTIsIDB4N0YwNDc2MDEsIDB4QTA1QTRGMjYsIDB4NEYyMjZFRjYsCisweDQxMEJEMTg1LCAweEQ0ODUwMDA5LCAweDAwMDk0NDBCLCAweDQ1MEJENTg0LAorMHhENzg0MDAwOSwgMHhEMjg0RTFGRiwgMHgyNzEyNjExRCwgMHhENDgzNTAyOSwKKzB4RTFGRkNCMDEsIDB4MTIwOUU1MDEsIDB4MTIxMTIyMTIsIDB4RTcyMDI0NTIsCisweDQ3MThENTdGLCAweDI1NzJEMjdGLCAweEQxN0ZFNzAwLCAweEQ2ODBENDdGLAorMHhFMjAxMjI3MCwgMHgyNDcwMjE3MiwgMHhENjdFMjYyMCwgMHgyNjQxRTRGRiwKKzB4RDU3REU2MDAsIDB4NjY2REUxMDQsIDB4NzYwMTYwNjMsIDB4NDAwMDYyNkQsCisweDhGRjgzMjEyLCAweEQ1NzkwNTQ1LCAweDI1MjBFMjAxLCAweEQyNzlENzc4LAorMHgyNzEwRTEwMCwgMHhFNTgwMjIxMiwgMHg2NTVDNjYxMywgMHg2NjZERDQ3NiwKKzB4NzYwNDY3NjMsIDB4Mzc0QzYyNkQsIDB4OEZGODMyNTMsIDB4RDQ3MzI3MTIsCisweEQ1NzNFMTAxLCAweEQ2NzMyNDEwLCAweDI1NDJFNDAwLCAweEUwM0FFNTAxLAorMHhEMjcyRDc3MSwgMHhFMDM5MDY1NCwgMHgyNzExMDY1NCwgMHgwMDBCNEYyNiwKKzB4N0ZDODIyMTEsIDB4RDc2RkQxNkUsIDB4REM3MERCNkYsIDB4RDI3MURFNzAsCisweEQ1NzJENDcxLCAweDFGMTJENjcyLCAweDFGNzY3MTBDLCAweDFGQjg3N0ZDLAorMHgxRkVBMUZDOSwgMHg3MjA0MUYyQiwgMHhERTZGREM2RSwgMHgxRjEzRUIxMCwKKzB4MUY1MTFGNDQsIDB4MUY3NzFGNjUsIDB4RDg2QzFGMkMsIDB4REQ2REQ5NkMsCisweEQyNkRFQTAwLCAweDg5MDAzQTIyLCAweEQxNTg3QTAxLCAweDg4MDE2MDEwLAorMHg1NkY5OEIwMywgMHg0MjE4RTIwMSwgMHhEMTY4MjYyMiwgMHgwMDA5NDEwQiwKKzB4NDQwQkQ0NjcsIDB4RDU2NzAwMDksIDB4MDAwOTQ1MEIsIDB4NjAxMEQxNEMsCisweDhCMTA4ODAxLCAweEU2NTBEMTRCLCAweDQ2MTg2MjEyLCAweDhCMDgzMjY2LAorMHg1NkZBRDE0NywgMHgyMTIwRTIwMCwgMHhDQjAxNjA2MiwgMHgyNjAyQTAwMywKKzB4NzIwMTI3MTAsIDB4NjA4MjIxMjIsIDB4ODkwOTg4MDEsIDB4RTJDOEQxNUEsCisweDYyMkM2NjEyLCAweDg5MDMzNjI2LCAweDYwMTBEMTU4LCAweDhCQzg4ODAxLAorMHg1MUY3Njc5MiwgMHgyMTcyNTJGNiwgMHhENjU1NTE5MSwgMHg1NUZCMjIxMiwKKzB4NTJGQzY0NjIsIDB4NTU2MTI1NDIsIDB4MjI1MkU0MDAsIDB4NjE0MzY2NDMsCisweDA1REU2MDEzLCAweDM2Q0M0NjA4LCAweDAyREUyNjUyLCAweEM5MDM2MDIxLAorMHg4QjAyODgwMSwgMHg3MjAxNjJFMiwgMHg3NDAxMkUyMiwgMHgzNkIzNjY0QywKKzB4NzEwNDhGRUUsIDB4NjZDMkQxNDcsIDB4NDUyODY1MTIsIDB4MjY1QjQ1MTgsCisweDYwODIyQzYyLCAweDg5MDE4ODAxLCAweDAwMDlBMTY4LCAweDYyNzJENzQyLAorMHg4QjEzMjIyOCwgMHhENzI2RDU0MSwgMHg2NTUyRDQ0MSwgMHg1MTQzNjY3MiwKKzB4MzE2QzM2NUMsIDB4Mjc2MjI2NjgsIDB4MTQxMzhEMDUsIDB4NjI2MkQ2M0QsCisweEIxQTU3MjAxLCAweEQ2MUUyNjIyLCAweDI2MjJFMjAwLCAweDUyOTE2NjkyLAorMHg4QjAxMzYyMCwgMHgwMDA5QTE0NCwgMHg2MDYxQTA2RSwgMHgwMDFDMDAxQywKKzB4MDAxRDQwMjAsIDB4MDAwMEIzOEUsIDB4RkZGRjAwMDAsIDB4MTIzNDAwMDAsCisweDAwMUUxMDE1LCAweDAwMjAxMjc4LCAweDAwMjAxOEEwLCAweDAwMjAxOTIyLAorMHgwMDIwMTI4QywgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywKKzB4MDAyMDM5N0MsIDB4MDAyMDM1MTQsIDB4MDAyMDM5ODQsIDB4MDAyMDM5OTAsCisweDAwMjAzOTlDLCAweDAwMjAzOUY4LCAweDAwMjAzOUZDLCAweDAwMjAzOUE0LAorMHgwMDIwMzlBNSwgMHgwMDIwMzlBOCwgMHgwMDExNzcwMCwgMHgwMDIwM0ExMiwKKzB4MDAyMDM1NzgsIDB4MDAxMTQyRDgsIDB4MDAyMDNBMTQsIDB4MDAyMDNBMTYsCisweDAwMUMzRDMwLCAweDAwMTE3NzE4LCAweDAwMUMzRDAwLCAweDAwMUMxMDAwLAorMHgwMDFDMzZGOCwgMHgwMDExNzczNCwgMHgwMDFDMzY4NCwgMHgwMDExNzcxMCwKKzB4MDAxQzM1MjAsIDB4MDAxMTc2MDAsIDB4MDAxMTc3NDAsIDB4MDAxQzEwMjgsCisweDAwMjAzNThDLCAweDAwMjAzOUFDLCAweDdGRkZGRkZGLCAweDAwMjAxNzM0LAorMHgwMDIwMzJCRSwgMHgwMDIwMjJFOCwgMHgwMDIwM0RDMCwgMHgwMDIwMzlGQSwKKzB4MDAyMDM1ODQsIDB4MDAyMDM5RUMsIDB4MDAxQzNEMkMsIDB4MDAxQzM2QjAsCisweDAwMjAzNTFDLCAweDAwMTE3NzVDLCAweDg4MDFDOTBGLCAweEEwQ0Y4OTAxLAorMHhEMTdDMDAwOSwgMHgzNjIwNjIxMiwgMHhENDdCODkwNCwgMHgyNDIxRTIwMCwKKzB4MjE2MkEwQ0MsIDB4NjIxMUQxNzksIDB4ODkwMTIyMjgsIDB4MDAwOUEwQzMsCisweEUyMDJENzc1LCAweDc1MDE2NTcxLCAweDMxMjM2MTVELCAweDI3NTE4RDAyLAorMHgwMDA5QTBCQywgMHhEMjcyNTVGMiwgMHg2MjIyNjA1MiwgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEYxOTg4MEEsIDB4NTJGMzFGMkQsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDhDOTBGLCAweEEwQTc4OTAxLCAweDYwNjMwMDA5LAorMHg1MUYyNTVGOCwgMHhFNzAxQ0IwMSwgMHgyNTAyRDI2MywgMHhFMTAwMjE3MiwKKzB4MjIxMUQ1NjQsIDB4NzQwMTY0NTIsIDB4MjU0MkEwOTgsIDB4OEIzRjg4MDUsCisweDYwMjI1MkYzLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMTY4ODAyLAorMHhFNUZGRDQ1RCwgMHg2NTVENjc0MiwgMHg4QjEwMjc1OCwgMHg2MjcyRDc1QiwKKzB4OEIwQzMyNjAsIDB4NTVGMjU3RjgsIDB4Mjc2MkUxMDEsIDB4RDU1MjI1MTIsCisweEQ3NTdFNDAwLCAweDYyNzIyNTQxLCAweEEwNzc3MjAxLCAweDUyRjMyNzIyLAorMHg0MDE5NjAyMiwgMHg0MDA5NDAwOSwgMHg4ODA1QzkwRiwgMHgzMUIzOEI2RSwKKzB4RDU1MDhCNkMsIDB4NjE1MjU3RjQsIDB4NzEwMUUyNDAsIDB4NjQ3MjI1MTIsCisweDFGNEREMTRELCAweDQyMTgyNDE5LCAweDhCMDMzNDIwLCAweDYyNjJENjRCLAorMHgyNjIyNzIwMSwgMHhFMjAwRDY0MCwgMHgyNjIxQjBBQSwgMHgwMDA5QTA1NiwKKzB4MzEyM0UyMjAsIDB4ODgwMzhCNTIsIDB4NTJGMzhCMUUsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDNDOTBGLCAweEQ3NDE4QjE2LCAweDY0NzI1MUY0LAorMHg3NDAxRDIzRCwgMHg2NTEyMjc0MiwgMHgxRjVERTY0MCwgMHg0NjE4MjUyOSwKKzB4OEIwMzM1NjAsIDB4NjI2MkQ2M0IsIDB4MjYyMjcyMDEsIDB4RTIwMEQ2MkUsCisweDI2MjFCMDg2LCAweDAwMDlBMDEwLCAweEQ3MzhEMTM3LCAweEQyMkE2NDEyLAorMHhFNTAwNzQwMSwgMHgyMTQyM0E3NiwgMHgyMjUxOEYwNiwgMHhFQTAwRDYzNCwKKzB4NzIwMTYyNjIsIDB4MjYyMkIwNzQsIDB4MkZCMkQ1MzIsIDB4OTU0MDY2NTIsCisweEQ0MzA1QkYxLCAweDM2MjA1MjQxLCAweDYwNjE4OTEwLCAweDhCMDFDODAzLAorMHgyQjIyRTIwMSwgMHg4RkY1NDUxMCwgMHg1N0YxNTY2NCwgMHg2MjcyRTFGMCwKKzB4NDEyODQxMTgsIDB4MjcyMjIyMUIsIDB4NkJGMkEwMDgsIDB4NkJGMkEwMDYsCisweEUyMDBENjE1LCAweEQxMTUyNjIxLCAweDIxMjFFMjAwLCAweEUyMDI1NkY1LAorMHg0MjE4NjY2MiwgMHgyNjI4NDIyOCwgMHgxRjZEOEQwQywgMHhENjFGRDExRSwKKzB4NDYwQjY1MTEsIDB4MjAwODY0NUQsIDB4NTdGNTg5MDQsIDB4NjI3MkQxMUMsCisweDI3MjIyMjE5LCAweEQxMUJFMjAxLCAweDY2MTIyODIyLCAweDhCMDEyNjY4LAorMHgwMDA5QUUxNywgMHg0NTBCRDUxOCwgMHhEMTE4MDAwOSwgMHhBRTEwRTYwMCwKKzB4MDdEMTIxNjAsIDB4MDAyMDNBMEMsIDB4MDAyMDNBMTAsIDB4MDAyMDNBMTgsCisweDAwMUMzREMwLCAweDAwMTE3NzJDLCAweDAwMUMzQjg4LCAweDAwMjAzOUY0LAorMHgwMDExNzczQywgMHgwMDExNzc0NCwgMHgwMDAwRjAwMCwgMHgwMDExNzc2NCwKKzB4MDAxMTc3NDgsIDB4MDAxMTc3NjgsIDB4MDAxMTc3NkMsIDB4MDFGRkZGRkYsCisweDAwMTE3NzRDLCAweDAwMjAzNTg0LCAweDAwMTE0MkQ4LCAweDAwMTE0Nzc0LAorMHhGREZGRkZGRiwgMHgwMDIwM0RDMCwgMHgwMDIwMjQ2QywgMHgwMDIwMzlGQSwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEQxMUY3RkY0LCAweDYyMTJERTFGLCAweDY3RTI1NDExLCAweEQ0MUUxRjQxLAorMHgxRjcyMkYyMiwgMHg2NzQzRDUxRCwgMHg3Nzk0RDIxRCwgMHg1QTQyNTg0MSwKKzB4NkM3MjY5NDIsIDB4NkQyMjVCMTYsIDB4RTYwMDYwNTIsIDB4MjUwMkNCMjAsCisweDc2MDFFNTQwLCAweDMyNTM2MjZELCAweDYyRjI4QkZCLCAweDIxMjI1NUYxLAorMHg1NUYyMTE1MSwgMHgyRTUyRDYxMywgMHgxNEEyMTQ4MSwgMHhENDEyMjQ5MiwKKzB4MTFCNjI3QzIsIDB4Njc0MjI2RDIsIDB4RDkxMURBMTAsIDB4MkE3MkU4MDEsCisweDFBOEM0OTBCLCAweDQyMThFMjAxLCAweDdGMEMxQTJDLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHgwMDAwNjhGNiwKKzB4MDAxQzNCOUMsIDB4MDAxQzNEOTgsIDB4MDAxQzM3MDAsIDB4MDAxQzM1MDAsCisweDAwMUM1OTYwLCAweDAwMUM4OTYwLCAweDAwMjAzNThDLCAweDAwMUMzRDAwLAorMHgwMDIwMTYxMCwgMHgyRjk2MkY4NiwgMHgyRkM2MkZBNiwgMHgyRkU2MkZENiwKKzB4NEYxMjRGMjIsIDB4N0Y4ODRGMDIsIDB4RTAxOERFQjIsIDB4RDRCMjYxRTAsCisweDYxRTMwRjE0LCAweDYyMTA3MTAxLCAweDQ0MEJFMDFDLCAweDIwMDgwRjI0LAorMHg4RjEyNkQwMywgMHhENEFEMUYwOCwgMHg2NzQwRERBRCwgMHg2NTdDRDRBRCwKKzB4NDcwQkQ3QUQsIDB4RDJBRDAwMDksIDB4NjIxQzYxMjAsIDB4NDYwODY2MjMsCisweDM2Mjg0NjA4LCAweDNENkM0NjA4LCAweEUwMUMxRkQ4LCAweEU1ODAwNEZDLAorMHg2MDRDNjZFMiwgMHgzMDUwNjU1QywgMHgyRDYyOEYxNywgMHgwMUZDRTAxOCwKKzB4REVBM0U1MDAsIDB4NjQxQ0EwMDgsIDB4Njc1MzY1NUQsIDB4NjA3MDM3RUMsCisweDMxREM2MTUzLCAweDgwMTQ3NTAxLCAweDMyNDM2MjVELCAweEQ0OUQ4QkY0LAorMHhFMjAwRDU5RCwgMHhBMjdGMjQyMSwgMHgyMDA4MjUyMSwgMHhFMDE4OEIxMywKKzB4RTUwMDAxRkMsIDB4QTAwOURFOTYsIDB4NjU1RDY0MUMsIDB4MzJFQzYyNTMsCisweDYyNTM2NzIyLCAweDMyREM2NjcyLCAweDc1MDQxMjYxLCAweDMyNDM2MjVELAorMHhBMjY5OEJGMywgMHg4ODAxMkQxMCwgMHhFMDE4OEIxNiwgMHhFNDAwMDFGQywKKzB4NjcxQzJENDAsIDB4NjI0RERFOEEsIDB4OEIwMTMyNzMsIDB4MDAwOUEyNUMsCisweDZERTM2NDRELCAweDdEMDQ2MjQzLCAweDMyRUM2NjQzLCAweDY1MjIzNkRDLAorMHg3NDA4NjE2MiwgMHgyNTEyQUZFRiwgMHg4QjE5ODgwNCwgMHgwMUZDRTAxOCwKKzB4MkQ3MEU3MDAsIDB4MUZENTZEMUMsIDB4NjI3RERFN0QsIDB4OEIwMTMyRDMsCisweDAwMDlBMjQyLCAweDYxNzM2NzdELCAweDMxRUM2NUUzLCAweDc1MDQ2NDEyLAorMHgzNjVDNjY3MywgMHg2MTQyNjI2MiwgMHgyMTI5NzcwOCwgMHgyNDEyQUZFRCwKKzB4OEIxOTg4MDUsIDB4MDFGQ0UwMTgsIDB4MkQ3MEU3MDAsIDB4MUZENDZEMUMsCisweDYyN0RERTZGLCAweDhCMDEzMkQzLCAweDAwMDlBMjI2LCAweDYxNzM2NzdELAorMHgzMUVDNjVFMywgMHg3NTA0NjQxMiwgMHgzNjVDNjY3MywgMHg2MTQyNjI2MiwKKzB4MjEyQjc3MDgsIDB4MjQxMkFGRUQsIDB4OEI1OTg4MzEsIDB4NjFFNkRFNjcsCisweDYxRTMxRjE5LCAweDY0RTI3MTA0LCAweDFGNEE2MjE2LCAweDFGMkI2NDE2LAorMHg3NUU0NjUxMywgMHg2NjUzNjcxMiwgMHgxRjRDNzYwNCwgMHg2NDUyMUY3RCwKKzB4RDc1RjZFNjYsIDB4MjdFMEQyNUYsIDB4REU1RjYwNjIsIDB4QzkwMTMyNDUsCisweDY1NjIyRTAwLCAweDQ2MDkwNjBBLCAweDQ2MDlEMTVDLCAweDQ2MDk0NTA5LAorMHgyMTUwMUY0RSwgMHhCMkIwNjQ2RCwgMHg2MjBEMUY2RiwgMHg4QjAxMjIyOCwKKzB4MDAwOUExRUEsIDB4RDc1NkRFNTUsIDB4NjYxQzYxRTAsIDB4NjQxMEQxNTAsCisweDQ3MEI2NTRDLCAweDdGRkM1NEZGLCAweDJGRTI1RUZFLCAweDUxRkU3RkZDLAorMHgyRjEyRTA0MCwgMHg1NUZCRDE0RiwgMHg1N0ZENTZGQywgMHgwNEZFNDEwQiwKKzB4RDI0RDdGMDgsIDB4RTExQzY0MEQsIDB4MUQ0MTJEMTAsIDB4RDQ0QjY1MjIsCisweDY3NDIxRDUyLCAweDFENzNERTRBLCAweEQyNEE2NUUyLCAweDY3MjIxRDU0LAorMHgxRDc1RDI0OSwgMHhEMjQ5NkUyMiwgMHg2NjIyMURFNiwgMHgxRDY3QTFCQywKKzB4ODkwMTg4MzAsIDB4MDAwOUEwOEUsIDB4RTM0MEQ1MzgsIDB4MzNGQzYxNTYsCisweDIzMTI2NDU2LCAweDcxMDQ2MTUzLCAweDY3NTIxMzQxLCAweDEzNzI2NDE2LAorMHg3RUU0NkUxMywgMHg2NUU2NjIxMiwgMHg2NkUzRDczMSwgMHgxMzI0NkVFMiwKKzB4NzYwNDI3RTAsIDB4NjA2MkQyMkYsIDB4MzI1NURFMkYsIDB4MkUwMEM5MDEsCisweDA2MEE2RTYyLCAweEQxMkQ0NjA5LCAweDRFMDk0NjA5LCAweDEzNDM0NjA5LAorMHg2NDZEMjFFMCwgMHhCMjUwMUY1RSwgMHg2MjBEMUY2RiwgMHg4QjAxMjIyOCwKKzB4MDAwOUExOEEsIDB4REUyNUQ1MjIsIDB4NjFFMDY0NTAsIDB4RDcyNDY1NEMsCisweDQ3MEI1NEZGLCAweDdGRkM2NjFDLCAweDA2RkVFMDU0LCAweDdGRkMyRjYyLAorMHhFRTQwMDFGRSwgMHgyRjEyM0VGQywgMHg1NUUyRDEyNSwgMHg1N0U0NTZFMywKKzB4NjRFMjQxMEIsIDB4RDIxQzdGMDgsIDB4RTExQzY0MEQsIDB4MUQ0MTJEMTAsCisweEQ2MUE2NTIyLCAweDY3NjIxRDUyLCAweDFENzNERTE5LCAweEQyMTk2RUUyLAorMHg2MjIyMURFNCwgMHhEMjE4MUQyNSwgMHgxRDI2NjIyMiwgMHg2MjIyRDIxNywKKzB4MUQyN0ExNUEsIDB4MDAxMTc4MDAsIDB4MDAyMDJBMTgsIDB4MDAyMDM5OTYsCisweDAwMjAzNUJDLCAweDAwMjAzQTdDLCAweDAwMjAxOEQwLCAweDAwMjAzOTk1LAorMHgwMDExNzgwNCwgMHgwMDIwM0ExNCwgMHgwMDIwM0ExNiwgMHgwMDExNzgxMCwKKzB4MDAyMDM5OTEsIDB4MTA2MjRERDMsIDB4MDAyMDM5OTIsIDB4MDAyMDM5OTMsCisweDAwMTE0QUE0LCAweDAwMjAwRjY4LCAweDAwMUM1ODY0LCAweDAwMUM2ODY0LAorMHgwMDFDNzg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywgMHgwMDFDNzlCQywKKzB4MDAyMDBGQzAsIDB4OEIwNDg4MzMsIDB4NDcwQkQ3QTIsIDB4QTEyM0VFMDAsCisweDg4MjgyREUwLCAweEEwRDM4OTAxLCAweERFOUYwMDA5LCAweDYyRTFFMTQzLAorMHgzMjE2RTA1NCwgMHgwRkU2OEYwMiwgMHgyRTIxRTI0MCwgMHg2MjJENjJFMSwKKzB4OEIwMTMyMTcsIDB4MDAwOUEwQkMsIDB4RTUwMTg1RTEsIDB4OEIwMTMwNTYsCisweDAwMDlBMEI2LCAweDJEMTBFMTAxLCAweDY0RTFCMTExLCAweDA2RkVFMDU0LAorMHg2MjYxRTE0MywgMHgzNTE3NjUyRCwgMHhFNjQwODk0NSwgMHg4QjBDMzU2MywKKzB4RTA1OEU0MUEsIDB4RTUwMDBGNDUsIDB4NzJDMEUwNUMsIDB4NjAyMzBGNTUsCisweDY3MDNDOTA3LCAweEEwMTRFMDYwLCAweDY2NTMwRjc1LCAweDQ2MjE0NjIxLAorMHg0NjIxNDYyMSwgMHg0NTIxNDYyMSwgMHhFMDU4NzYxOCwgMHgwRjY1NDUyMSwKKzB4RTAwMzQ1MjEsIDB4RTA1QzI1MDksIDB4RTAwNzBGNTUsIDB4RTA2MDIyMDksCisweEU4NTQwRjI1LCAweDg1ODIzOEZDLCAweDY0MEQ2NUYzLCAweDE4NDRCMTcwLAorMHhERDdBODU4NCwgMHg4NTg2NkMwRCwgMHg2MTBENEMwOCwgMHg0MTA4NjBDMywKKzB4RTAwRjBFRkUsIDB4MTgxNTREMEIsIDB4MkUyOTYyMDcsIDB4NjY4MjYwQzMsCisweDg1NjIwRkU2LCAweDREMEI1MTg1LCAweDJFMEI2MDBELCAweDU0ODQ2MEMzLAorMHhCMTNDMEZFNiwgMHhFMDU0NjVGMywgMHhFNTQwMEVGRSwgMHhFMDZDNjJFMSwKKzB4MzY1MzY2MkQsIDB4MEY2NjhENDEsIDB4QzkwMzYwMjMsIDB4NDAwMDQwMDgsCisweDYxMDM2NDAzLCAweEQ5NjVFMDcwLCAweDBGNDZFNUZGLCAweEUwNzQ2NTVDLAorMHg2MDUzMEY5NiwgMHg2MjYzNDkwQiwgMHg0MjIxNDIyMSwgMHg0MjIxNDIyMSwKKzB4NDIwMDY3MjMsIDB4NDIwMDMyN0MsIDB4NkMwNzQ2MjEsIDB4NDYyMUUwNTQsCisweDYwNjMwOUZFLCAweDQwMDhDOTAzLCAweDc5MDYzMEZDLCAweDZBMDM2RDJELAorMHg2NUYzRTgwMCwgMHg2NEQzQjEyNCwgMHhFMDcwNkVBMiwgMHgyQUUyMkVDOSwKKzB4MDFGRTY2OTQsIDB4NjY2Q0UwNzQsIDB4NDcwQjA3RkUsIDB4MkUwQjYwNjMsCisweDY1RjMyQUUyLCAweEIwRkE2NEQzLCAweDYyOEQ3ODAxLCAweDMyRTNFRTA2LAorMHg3RDAxOEZFNywgMHgwRUZFRTA1NCwgMHhFMDU0NjJFMSwgMHg0MjAwMDZGRSwKKzB4NzYwQzg1NjEsIDB4NzAxQjMwMkMsIDB4RTQwMDYxMDMsIDB4RTcwNDY1RjMsCisweDY4NjY3NDAxLCAweDM5NzM2OTRELCAweDhGRjkyNTgyLCAweDY1RjM3NTA0LAorMHg2NDFEQjBERCwgMHgwRUZFRTA1NCwgMHg2NEUxQjA5QywgMHgwMDA5QTA1NCwKKzB4RDQzQjU2RjgsIDB4RUEwMUQyM0IsIDB4MjZBMDQyMEIsIDB4MDAwOUEwNEMsCisweDA2RkNFMDFDLCAweDg4Mjk2MDZDLCAweDVDRjg4QjA4LCAweEUyMDBENjM2LAorMHg1MjYxMkMyMCwgMHg2NDJEQjA0QiwgMHgwMDA5QTAzRSwgMHg2NjZDRTY4MSwKKzB4OEIwNDMwNjAsIDB4NDIwQkQyMzEsIDB4QTAzNTU0RjgsIDB4RTY4MjAwMDksCisweDMwNjA2NjZDLCAweEQyMkU4QjA0LCAweDU0Rjg0MjBCLCAweDAwMDlBMDJDLAorMHg2NjZDRTY4MywgMHg4QjBBMzA2MCwgMHhEQTI3NTVGOCwgMHgyNTkwRTkwMCwKKzB4RDgyODU1QTEsIDB4Mjg1MkQ2MjgsIDB4QTAxRDUyQTIsIDB4RTY5MjI2MjAsCisweDMwNjA2NjZDLCAweEQyMjA4QjA4LCAweDVDMjFEODI0LCAweDZDQ0M1MkY4LAorMHgyOEMxRTYwMCwgMHgyMjYwQTAxMCwgMHg2NjZDRTY5MywgMHg4QjA2MzA2MCwKKzB4RDYxRjU5RjgsIDB4RTIwMUVBMDAsIDB4QTAwNTI5QTAsIDB4RDYxNjI2MjEsCisweEQyMURENDFDLCAweDY1NjI0MjBCLCAweDRGMDY3Rjc4LCAweDRGMjY0RjE2LAorMHg2REY2NkVGNiwgMHg2QUY2NkNGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwKKzB4RTI0MDYxNEQsIDB4ODkzMjMxMjMsIDB4MzEyN0UyMUYsIDB4OEIyN0Q3MTMsCisweEQ0MDY2MTRELCAweEUwMDE3MUUwLCAweDU2NzE0NDBCLCAweDI2NTk2NTA3LAorMHgxNzYxQTAyNSwgMHgwMDIwMEZCQywgMHgwMDExNzgwNCwgMHgwMDIwMzQ3MCwKKzB4MDAyMDNBOUMsIDB4MDAyMDE4QzAsIDB4MDAxMTc4MDAsIDB4MDAxMTVGMDAsCisweDAwMTE2MDU4LCAweDAwMjAzOTdDLCAweDAwMjAzOTkwLCAweDAwMjAzQTFBLAorMHgwMDIwM0ExNiwgMHgwMDIwM0FCNCwgMHgwMDIwMThEMCwgMHgwMDFDMzcwNCwKKzB4RTAwMUQ0OTAsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsIDB4NEYyNjI3NjIsCisweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTEyLAorMHhENzg5MzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDI4NiwgMHg0MjBCNzFFMCwKKzB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyODIsIDB4RTAwMTQyMEIsCisweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LAorMHg2MjUyRDU3RSwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDU3QTQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4QTAwMTAwMDksCisweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTczNDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywgMHgyRkU2MDAwOSwKKzB4N0ZGQzRGMjIsIDB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsIDB4RTI4MEQ2NkQsCisweDU0RTExNjE1LCAweDE2NDY0MjE4LCAweDQyMjg1NUUyLCAweDU3RTMxNjU3LAorMHgxNjc4NkVGMiwgMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwgMHg2RUY2QUZDRSwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkM1M0RENjIsIDB4NkU0M0JGRDYsCisweDJERTJCRkJCLCAweDAwMDlCRkQyLCAweDJDMTI1MUQ1LCAweDFDNDE1NEQ2LAorMHgxQzUyNTVENywgMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4NjE2MzZDRjYsIDB4QTAwNEU2MDAsIDB4NjI1NjQxMDksIDB4MjQyMjc2MDEsCisweDM2MTI3NDA0LCAweDAwMEI4QkY5LCAweEQ2NTMwMDA5LCAweDg1NjJFNTAwLAorMHhBMDBCNjc0RCwgMHg2NTVENjEwRCwgMHg0MDAwNjA1MywgMHgzMDVDRDQ0RiwKKzB4MDI0RDQwMDgsIDB4MzI3MDYyMkQsIDB4NzUwMTg5MDUsIDB4MzIxMzYyNUQsCisweDAwMEI4QkYxLCAweDAwMEJFMDAwLCAweDJGRTZFMDAxLCAweDU0NDE2NzQzLAorMHg0RTA4RUU3RiwgMHg0RTI4RDI0NiwgMHgyNUU5NjU0MywgMHg2MDQzNkUyMSwKKzB4OUU3NTYyRUQsIDB4NDUyOUM5MDMsIDB4RTYwMDMyRTMsIDB4OEQ0NTYxMDMsCisweDIxMTg0NTA5LCAweEQyM0Y4QjA1LCAweDAwMkM2MDUzLCAweEEwOEFDOTNGLAorMHg2MDEzNjYwMywgMHg4QjI2ODgwMSwgMHg4ODBDNjA1MywgMHhENTNBOEIwNCwKKzB4QzkzRjg0NTMsIDB4NjYwM0EwN0YsIDB4OEIwNDg4MDgsIDB4ODRFMkRFMzYsCisweEEwNzhDOTNGLCAweDg4MEQ2NjAzLCAweDhCMDNENjMzLCAweEM5M0Y4NDYxLAorMHg2NjAzQTA3MSwgMHg4ODA5NjI2MCwgMHg2MjJDOEYwOSwgMHhFMDE0REUyQywKKzB4NjU1QzA1RUMsIDB4NjAyMzMyNTgsIDB4QTA2NEM5M0YsIDB4NjAyMzY2MDMsCisweEEwNjBDOTNGLCAweDg4MDI2NjAzLCAweEUwMDc4QjVELCAweDYwNDMyNTA5LAorMHg4OTA1QzgxMCwgMHg2MDUzRDIyNSwgMHhDOTNGMDAyQywgMHg2NjAzQTA1MywKKzB4NjA1M0RFMjMsIDB4QzkzRjAwRUMsIDB4NjYwM0EwNEQsIDB4ODgwMTYwMTMsCisweDYwNTM4QjE5LCAweDhCMDQ4ODBDLCAweDg0MjNEMjFFLCAweEEwNDJDOTNGLAorMHg4ODA4NjYwMywgMHhENTFCOEIwNCwgMHhDOTNGODQ1MiwgMHg2NjAzQTAzQiwKKzB4RDYxODg4MEQsIDB4ODQ2MThCMDMsIDB4QTAzNEM5M0YsIDB4NjA2MDY2MDMsCisweEEwMzBDOTNGLCAweDg4MDI2NjAzLCAweEUwMDc4QjJELCAweDYwNDMyNTA5LAorMHg4OTIzQzgxMCwgMHg2MDUzREUxMCwgMHhDOTNGMDBFQywgMHg2NjAzQTAyMywKKzB4MDAwMDBCQjgsIDB4MDAyMDM0NzAsIDB4MDAxQzM3MDQsIDB4MDAxQzM3M0MsCisweDAwMUMzNzAwLCAweDAwMUMzNzBDLCAweDAwMTE0MDAwLCAweDAwMTE0MDA4LAorMHgwMDExNDJEOCwgMHgwMDExNDJFNCwgMHgwMDExNDJFOCwgMHgwMDExNDJGNSwKKzB4MDAxMTQyRUQsIDB4MDAxMTQyRkQsIDB4MDAxMTQzMDksIDB4NjA1M0QyMDksCisweEM5M0YwMDJDLCAweDYwMTM2NjAzLCAweDhCMDM4ODAyLCAweEM4MTA2MDQzLAorMHg3NjAyODkwMCwgMHhDOTNGNjA2MywgMHg0MDAwNDAxOCwgMHgxNzQxMjQwQiwKKzB4NkVGNjAwMEIsIDB4MDAxMTQzMDEsIDB4MDAwOUExNkUsIDB4MkZFNjJGRDYsCisweEREOTQ0RjIyLCAweEEwMDQ5RUIyLCAweEQ0OTMwMDA5LCAweDQyMEJEMjkzLAorMHg2MkQyNjVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjhGRDQ5MCwKKzB4NTVEMTQyMEIsIDB4MjJFODUyRDEsIDB4QTAwNDhCRjgsIDB4RDQ4RDAwMDksCisweDQyMEJEMjhBLCAweDUyRDI1NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LAorMHhEMjg2RDQ4OSwgMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywgMHhBMDA0OEJGOCwKKzB4RDQ4NjAwMDksIDB4NDIwQkQyODEsIDB4NTJENDU1RDQsIDB4OEJGODIyRTgsCisweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RTYzNkM3MywgMHg2RDUzQjAxQSwgMHg2NEQzNTdGNCwgMHhCMDVGNjVFMywKKzB4QjA3NTY2QzMsIDB4QjBBNDAwMDksIDB4QjBBODAwMDksIDB4QjBBQzAwMDksCisweEIwQUMwMDA5LCAweEIwQUYwMDA5LCAweEIwMzE1NEY1LCAweDZDQ0Q2QzAzLAorMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgzNDEyRDE3MCwKKzB4RDY3MDA1MjksIDB4MjY1MEQ3NzAsIDB4Mjc0MjAwMEIsIDB4MDAwOUEwMTgsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2QzczLCAweDZENTNCRkVFLAorMHg2NEQzNTdGNCwgMHhCMDMzNjVFMywgMHhCMDhENjZDMywgMHhCMDBGNTRGNSwKKzB4NkNDRDZDMDMsIDB4NEYyNjYwQzMsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsCisweEU1MDNEMTYyLCAweEQ3NjNENDYyLCAweDIxNTI0NTE4LCAweDI0NzIwMDBCLAorMHhENDVGRDE1RSwgMHgyMTYyRTYwMCwgMHgyNDYyMDAwQiwgMHhCRjczNEYyMiwKKzB4QkY3M0U0MEEsIDB4RDI1QzAwMDksIDB4NDExOEUxMDQsIDB4RTQwQUU1MDAsCisweEJGNjkyMjEyLCAweEQ3NTkyMjUyLCAweENCMjA2MDcyLCAweDAwMEI0RjI2LAorMHg0RjIyMjcwMiwgMHg0MTBCRDE1NiwgMHhENTU2RTQwMCwgMHg0RjI2NDUyQiwKKzB4RDE1NTJGRTYsIDB4NjYxMjZFNjMsIDB4OTIxMDQ0MTgsIDB4NDQwODQ1MjgsCisweDQ1MDAyNjI5LCAweDI2NUI0NDA4LCAweDI2NEI0NDAwLCAweDIxNjI0NzA4LAorMHhEMTRFNDcwOCwgMHgyMTcyMjdFQiwgMHg2RUY2MDAwQiwgMHgxRkZGMDNGMCwKKzB4NEYyMjJGRTYsIDB4RTEwMURFNEEsIDB4QkYzREU0MEEsIDB4NjdFMzJFMTIsCisweEU1MDA3NzZDLCAweEUyMDRFMTMwLCAweDI3NTJFNDBBLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3MjIyNzEyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgxNzVBQkYxOCwgMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwKKzB4RDIzNDZFRjYsIDB4RTQ0MUUxMDEsIDB4MDAwQjIyMTIsIDB4RDEzMjIyNDIsCisweEU2MDVENDMyLCAweDAwMEIyMTYyLCAweDAwMEIyNDYyLCAweEQyMzAwMDA5LAorMHhFNDBBRTYwMSwgMHgyMjYyQUYwMCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4NkM0M0RCMkIsIDB4RUQwMDYwQjIsIDB4MkIwMkNCMDMsCisweEM5MDM2MEIyLCAweDZFMDNBMDA4LCAweDg5MDczREMyLCAweEU0NjQ2MEIyLAorMHhCMDdDQzkwMywgMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4RjA0M0RDMiwKKzB4RDQyMTJGRTEsIDB4NDYwQkQ2MjEsIDB4NjJGMTAwMDksIDB4NjAyMzYyMkQsCisweDg5RkZDODAxLCAweDdGMDQ2MDIzLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHgwMDFDM0I4OCwgMHgwMDIwM0FDOCwgMHgwMDIwMThEMCwKKzB4MDAyMDNBRDAsIDB4MDAyMDNBRDgsIDB4MDAyMDNBRTAsIDB4MDAyMDNBRTgsCisweDAwMjVFNzIwLCAweDAwMjAzREJDLCAweDAwMjAzOTgwLCAweDAwMUM1OTY4LAorMHgwMDFDM0I0MCwgMHgwMDBGODAwMCwgMHgwMDFENDAwNCwgMHgwMDFDMzUwMCwKKzB4MDAyMDE1RTQsIDB4MDAyMDE2MTAsIDB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsCisweDAwMUM1ODMwLCAweDAwMUM2MjY4LCAweDAwMUM1OUE0LCAweDAwMUM2MzlDLAorMHgwMDFDNTgxQywgMHgwMDFDNTg2MCwgMHgwMDIwM0FGMCwgMHgwMDIwMThDMCwKKzB4OEYwMTQ0MTEsIDB4NjA0MzYwNEIsIDB4MDAwOTAwMEIsIDB4NTY1MUQ1MkIsCisweDQ2Mjg2MDUyLCAweDMwNkMwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHhCRkYxNEYwMiwgMHg2QjAzNkU0MywgMHhERDI1REMyNCwKKzB4MDAwOUJGRUMsIDB4M0MwNTMwQjgsIDB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksCisweDAyMEEzRDY1LCAweDQyMDk0MjA5LCAweDMyRTI0MjA5LCAweDRGMDY4QkYwLAorMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgyRkM2NkJGNiwKKzB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsIDB4QkZDRjRGMDIsIDB4NkMwMzZFNDMsCisweEJGQ0JERDEzLCAweDMwQzgwMDA5LCAweDA2MEEzRDA1LCAweDQ2MDk0NjA5LAorMHgzNkUyNDYwMSwgMHg0RjA2OEJGNSwgMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwKKzB4NkNGNjAwMEIsIDB4NEYyMjJGRTYsIDB4RTEwMkRFMEIsIDB4RTQwM0U1MDAsCisweEJGQjkyRTEyLCAweEU2MDYyRTUyLCAweEU3MDA0NjE4LCAweDJFNjJFNDAzLAorMHg0RjI2MkU3MiwgMHg2RUY2QUZCMCwgMHgwMDA5MDAwQiwgMHgwMDFDMTA0MCwKKzB4Q0NDQ0NDQ0QsIDB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3Rjk4LAorMHg2NDUzRTcxMCwgMHg2QjUzNDcyOCwgMHhFRTFBRENCQywgMHg2MTUzNjU1RCwKKzB4MzE1QzQxMDgsIDB4NzUwMTQxMDgsIDB4NjA0MzMxN0MsIDB4MEYxNjY2NUQsCisweEVEMDA2MEIzLCAweDIxQjEzNkUzLCAweDgxMTI4MTExLCAweDExRDI4MTEzLAorMHgxMUQ0MTFEMywgMHg3NDA0OEZFQSwgMHhEOEIxNjdGMiwgMHgxODcxRDlCMSwKKzB4NThGMTI4NzIsIDB4MTk4MUQxQjAsIDB4NTlGMjI5ODIsIDB4NURGNDVBRjMsCisweDU0RjY1RUY1LCAweDIxOTIxMTkxLCAweDExQTIxMUEzLCAweDExRDQxMUQ1LAorMHgxMUU2MTFFNywgMHgxMTQ4MTE0OSwgMHhEQUE4NTVGNywgMHg1N0Y4RUUwMCwKKzB4NTJGOUREQTcsIDB4NjRFM0Q2QTcsIDB4MkE1MjFBNTEsIDB4RDhBN0Q5QTYsCisweDJENzJFQUVGLCAweDZBQUMyNjIyLCAweDZERTM2RUVELCAweDYxRTM0RDA4LAorMHg0MTA4M0RFQywgMHgzMUVDNEQwOCwgMHg2MEIzM0Q5QywgMHgyREIxNDEwOCwKKzB4RTA1MDgxRDEsIDB4RTc5RjQxMDgsIDB4NDEwODQwMDgsIDB4ODFEMjY3N0MsCisweDMxOEM2MEIzLCAweDM0NzJFMjAwLCAweDFERDI4MUQzLCAweEQ0OTMxRDEzLAorMHgxRDI0OEQwMSwgMHg2NUQzRDQ4RiwgMHg3RTAxQjBCMiwgMHgzNEEyNjRFRCwKKzB4REE4QzhCREEsIDB4NjhBMjJGRDIsIDB4NDgyOUREOTEsIDB4NjRBMjJEODIsCisweDY5NEQ3REZDLCAweDJEOTJEMjg2LCAweDRFMjk2RTIyLCAweDJERTI3RDBDLAorMHg2QUQzNjgyMiwgMHhENzg0NjE4RCwgMHg2RDcyMkExNiwgMHhENTgzRDQ4OSwKKzB4NUU3MjI0RDIsIDB4MTRFMkQ2ODgsIDB4RUUwMDUxNzQsIDB4NTg3NjE0MTQsCisweDE0ODZEMTg2LCAweEU3MTA1OTc4LCAweDYyNTIxNDk4LCAweDE0MkE2NUUzLAorMHg2NEUzMjZFMiwgMHg2NDRERTYwMCwgMHg0ODA4Njg0MywgMHg0ODA4Mzg0QywKKzB4NjA1MzM4MUMsIDB4MjhCMTBDODYsIDB4NjBCMzA5Q0UsIDB4NjA1MzgxOTEsCisweDYwNDMwQUNFLCAweDYwNTM4MUEyLCAweDYwQjMwRENFLCAweDYwNTM4MUQzLAorMHg3NDAxMDhDRSwgMHgwOUNFMTg4MiwgMHgxOUUzNjI0RCwgMHgzMjczMEFDRSwKKzB4OEZFMDFBNjQsIDB4RDk2QTc1MDQsIDB4NkM5MkUwMDMsIDB4MkNCMTQwMTgsCisweERBNkY2RDkyLCAweEUwNTA4MUQxLCAweDQwMDg2RTkyLCAweDYxOTI4MUUyLAorMHg4MTEzNjBCMywgMHhFNjAwNjQ5MiwgMHg2NzkyMTQ0MiwgMHgxN0EzRDQ2OCwKKzB4RTFGRjY4OTIsIDB4RTcwMzE4NjQsIDB4NDYwODY1NjMsIDB4NzUwMTM2NEMsCisweDY2NUQyNjEyLCAweDhCRjgzNjczLCAweEUwMDNEQzVBLCAweDQwMTg2REMyLAorMHg2RUMyMkRCMSwgMHg4MUUxRDI1RiwgMHhFRTAwNjFDMiwgMHg2NEMyMTExMiwKKzB4MTQyM0UwMjQsIDB4RDQ1QjY1QzIsIDB4NjdDMjE1RTQsIDB4ODE3MkU1ODAsCisweDY2RTM2OEMyLCAweDY1NUM4MTgzLCAweDY5NjM2NjZELCAweDZBNkQ3NjA0LAorMHgzQTUzMzk0QywgMHgyOUUyOEZGOCwgMHhEQzU0REI1MywgMHg3NDA0MjRCMiwKKzB4N0Y2ODI0QzIsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweDYxNDI2OEY2LCAweEM4MDM2MDExLCAweEU1MDA4RjAzLAorMHgzNDIwRDIzQywgMHg2MDExOEIwNiwgMHg4ODAyQzkwMywgMHhEMjM5OEIwNiwKKzB4OEIwMzM0MjAsIDB4NjUxMzU2MTIsIDB4MjQyMjUyNjQsIDB4NjA1MzAwMEIsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDYyNTM2RTUzLCAweDZENDNFNTUwLAorMHg0NTA4RTQwMCwgMHhFMTAxQTAwMSwgMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwKKzB4NjA1MzgxMjMsIDB4NTZFMjgxMjIsIDB4OEJGNTM2MjAsIDB4MTZFNEQyMzgsCisweEU2MTQ2NEYzLCAweDY1RTM0MjBCLCAweEU0RkM2NUUxLCAweDJFNTEyNTQ5LAorMHg2NUYzNjFGMSwgMHgyRjExMjE0OSwgMHhEMTMxNTREMSwgMHhFNjE0NDEwQiwKKzB4NjA3MTU3RDEsIDB4MjcwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDY2NTM2RTUzLAorMHg2RDQzRTVGQywgMHgyMDU5NjA2MSwgMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwKKzB4MTJFNDhCMDYsIDB4MzFFMDUxRTIsIDB4NTJEMThCMDQsIDB4MUUyMkEwMDIsCisweDU2NjRBRkYwLCAweDY0RjNEMjFFLCAweDQyMEJFNjE0LCAweDY3RTE2NUUzLAorMHgyNzE5RTFGQywgMHg2N0YxMkU3MSwgMHgyNzE5NTREMSwgMHg2NUYzRDExOCwKKzB4NDEwQkU2MTQsIDB4NTJEMTJGNzEsIDB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsCisweDRGMjY3RjE0LCAweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMjAzOUFDLAorMHgwMDIwMzU3QywgMHgwMDIwMzU4NCwgMHgwMDIwMzU4QywgMHgwMDIwMzVCNCwKKzB4MDAyMDM5OTgsIDB4MDAyMDM5QTAsIDB4MDAxMDAyMDgsIDB4MDAxMDE0QzAsCisweDAwMUUyMTBDLCAweDAwMUMzRDAwLCAweDAwMjAzOUVDLCAweDAwMTAwMEM4LAorMHgwMDExNzg4MCwgMHgwMDExNzc4MCwgMHgwMDA0MDAyMCwgMHgwMDI2QzQwMSwKKzB4MDAyMDBENDIsIDB4NEYyMjJGRTYsIDB4REU0MjYyNEMsIDB4NDIwMDQyMDgsCisweDNFMkNBMDA1LCAweEQ0NDA1MjUyLCAweEJGNjk1NjI0LCAweDY1RTIyRTYyLAorMHgzNTIwNTJFMSwgMHhENjNEOEJGNiwgMHg0RjI2MjYyMiwgMHg2RUY2MDAwQiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4REMzOTRGMjIsIDB4NTJDMURCMzksCisweDM2MjA2NkMyLCAweDYwNjE4OTFDLCAweDg4MDFDOTAzLCAweERFMzQ4OTE4LAorMHhCRjM4REQzNSwgMHg2NTAzNjRFMywgMHg2NkIyODUwMywgMHgzMjYyNjIwRCwKKzB4RDQzMjg5MDcsIDB4MDAwOUJGNzYsIDB4NEQwQkQ0MzEsIDB4QUZFNjAwMDksCisweEJGM0QwMDA5LCAweEQ0MkY2NEUzLCAweDAwMDk0RDBCLCAweDAwMDlBRkRGLAorMHgyMjYyRDIyRCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REQyOURDMjgsIDB4NkU0MzYwQzIsCisweDA0REU0MDA4LCAweEU2MTREMTI3LCAweDY1RTM0MTBCLCAweEQxMjdENzI2LAorMHg1NUUyMjdFMiwgMHgzNUUwNTI1NCwgMHgyMTIyOEYwNCwgMHg0MDA4NjBDMiwKKzB4MTIyMjAyREUsIDB4NjA1MzY1QzIsIDB4NzUwMTQwMDgsIDB4MERFNjA2REUsCisweEM5MEY2MDUzLCAweDYwNjMyQzAyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHg4NTQzNkNGNiwgMHg2NTBENTY0MywgMHg2MjJENjI2MiwgMHgzNTI3NzIwNCwKKzB4RTEwMDhGMEMsIDB4MjI2ODk2MEMsIDB4RDYxNThCMDMsIDB4NzIwMTUyNjEsCisweEQ2MTMxNjIxLCAweDYyNjJFMTAxLCAweDI2MjI3MjAxLCAweDYwMTMwMDBCLAorMHgwMDAwMDFGRiwgMHgwMDIwMzU4QywgMHgwMDIwMzU4NCwgMHgwMDFDM0QwMCwKKzB4MDAyMDM1QjQsIDB4MDAyMDM5N0MsIDB4MDAyMDE4QzAsIDB4MDAyMDM1N0MsCisweDAwMjAzQjE4LCAweDAwMjAzQjFDLCAweDAwMUMzRDI4LCAweDAwMjAzOUVDLAorMHgwMDIwMzlBQywgMHgwMDIwMEQ0MiwgMHgwMDIwMzlGMCwgMHgwMDIwMzlGNCwKKzB4MDAxMTc3NTQsIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGRjg0RjIyLCAweDZDMjJEMjQxLCAweEM4MDM2MEMzLCAweERFNDA4OTZFLAorMHhEQTQxREI0MCwgMHg1MkIxRDk0MSwgMHgzNjIwNjZCMiwgMHg2MDYxODk0NSwKKzB4ODgwMUM5MDMsIDB4REQzQjg5NDEsIDB4NDIwQkQyM0QsIDB4NjUwMzY0RDMsCisweDYwQTEyRjAyLCAweDg5MzI4ODAxLCAweDg1MTQ1MTUzLCAweDg4NDA2MDBDLAorMHgxRjExOEYwQywgMHhENTM3NjE5MSwgMHg2NDFENDUwQiwgMHg4QjI2MjAwOCwKKzB4RDczNTY2OTEsIDB4NjQ2RDQ3MEIsIDB4OEIyMDIwMDgsIDB4NDIwQkQyMzMsCisweDUxRjE1NEYxLCAweEM4MjA4NTExLCAweEQxMzE4OTA0LCAweDAyMUVFMDUwLAorMHgwMTI2NzIwMSwgMHg0MjBCRDIyRiwgMHgyMDA4NjRGMiwgMHg2NEQzODkwNywKKzB4NEQwQkREMkQsIDB4RDEyRDY1RjIsIDB4QUZDNEU2MDEsIDB4RDIyQzIxNjIsCisweDQyMEI2NUYyLCAweEQ3MkI2NEUzLCAweEFGQkNFNjAxLCAweEQyMjYyNzYyLAorMHg0MjBCNjVGMiwgMHhBRkI2NjREMywgMHhERTI3MDAwOSwgMHhEQTI4REQyNywKKzB4NTJEMURCMjgsIDB4MzYyMDY2RDIsIDB4NjA2MTg5MTgsIDB4ODgwMUM5MDMsCisweEQ0MjI4OTE0LCAweDQ1MEJENTE2LCAweDU2MDMwMDA5LCAweDhGMDQzNkUwLAorMHhFMjAxNjUwMywgMHhBRkVDMkEyMCwgMHhENDFGMkI1MiwgMHg0MjBCRDIxNiwKKzB4RDcxODAwMDksIDB4NDExOEUxMDEsIDB4MjcxMkFGRTMsIDB4QzgwNDYwQzMsCisweEQyMUE4OTAyLCAweDAwMDk0MjBCLCAweDRGMjY3RjA4LCAweDZERjY2RUY2LAorMHg2QkY2NkNGNiwgMHgwMDBCNkFGNiwgMHgwMDAwNjlGNiwgMHgwMDFFMjEwMCwKKzB4MDAyMDM1OEMsIDB4MDAyMDM1ODQsIDB4MDAyMDNBMTQsIDB4MDAxMTQyRDgsCisweDAwMjAxNEE2LCAweDAwMTE1RUEyLCAweDAwMTE0Nzc0LCAweDAwMjAwRDhBLAorMHgwMDIwMzUxQywgMHgwMDIwMTZDMiwgMHgwMDIwMTREMCwgMHgwMDFFMjEyQywKKzB4MDAyMDE1MzQsIDB4MDAxQzNEMzAsIDB4MDAxMTc4ODAsIDB4MDAyMDM1N0MsCisweDAwMjAzOTlDLCAweDAwMjAzOTk4LCAweDAwMjAzNUI0LCAweDAwMjAwNjQ0LAorMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwgMHgwMDAwMTI2NiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsIDB4MDAwOTAwMEIsCisweDAwMDkwMDBCLCAweDAwMDkwMDBCLCAweEUwMDAwMDBCLCAweEUwMDAwMDBCLAorMHgwMDA5MDAwQiwgMHhFNEZERDU5RCwgMHhENjlENjE1MiwgMHgyNTEyMjE0OSwKKzB4NzQwMTYwNTIsIDB4MjUwMkNCMDEsIDB4RDE5QTY3NTIsIDB4MjU3MjI3NDksCisweEM4NDA2MDEwLCAweDYwNjI4OTAyLCAweDI2MDJDQjA0LCAweEUxRjc2NDYyLAorMHgyNjQyMjQxOSwgMHhFNzAxNjA2MiwgMHgyNjAyQzlDRiwgMHhFNTAyNjA2MiwKKzB4MjYwMkNCMTAsIDB4NDcxODYwNjIsIDB4MjYwMkNCMDMsIDB4MDAwQjE2NTIsCisweEQ1OEQxNjczLCAweEQyOEVENzhELCAweEUxMDBENDhFLCAweDI1MTFFNjAwLAorMHgyMjEwMjcxMSwgMHgyNDYxQUZDRSwgMHhEMjhCNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI4NzY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjgzLAorMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3RiwKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI3QTY2NEMsCisweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNzY2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyNzIsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjZFLCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLAorMHhENjY5NjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4NjI0QzYwMEMsIDB4NDIwMEQ2NjQsIDB4NjAyMDMyNkMsCisweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLCAweDY0NENEMTYwLAorMHg2MjQwMzQxQywgMHg2MDJDMDAwQiwgMHg2NDRDRDE1RSwgMHg2MjQwMzQxQywKKzB4NjAyQzAwMEIsIDB4NEYyMjJGRTYsIDB4NjQ1QzZFNDMsIDB4MzQ2N0U2MEEsCisweEJGRUI4OTE0LCAweDY0MEMwMDA5LCAweDg4MDE2MEVDLCAweEUwMEY4QjAyLAorMHgyNDA5QTAwMiwgMHg0NDA5NDQwOSwgMHhFNjBBNjI0QywgMHg4OTA1MzI2MywKKzB4NjQ0Q0JGRTIsIDB4NjAyMzYyMEMsIDB4OEIwMEM4ODAsIDB4NjAyM0UyMDAsCisweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDYwNjJENjRCLCAweDhCMDM4ODAxLAorMHgwMDA5QjI1NiwgMHgwMDA5QTAwMywgMHhFNjQwRDI0OCwgMHhENjQ4MjI2MCwKKzB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsIDB4RDY0MzRGMjIsIDB4ODgwMjYwNjIsCisweEIyOUY4QjAxLCAweEQ2NDIwMDA5LCAweDRGMjZFMjAwLCAweDI2MjIwMDBCLAorMHhENDNFRDUzRCwgMHhFNzAxRTEwMCwgMHgwMDBCMjUxMiwgMHhEMjNCMjQ3MCwKKzB4MDAwQkU2MDQsIDB4NEYyMjIyNjAsIDB4RDEzQkQ0M0EsIDB4MDAwOTQxMEIsCisweEUxRkRENTNBLCAweEQyM0E2NjUwLCAweEU3MDAyNjE5LCAweDRGMjYyNTYwLAorMHgyMjcwMDAwQiwgMHhENTM3NEYyMiwgMHg2MTUyRDIzNywgMHg2MTFERDczNywKKzB4NjQ1MjI1MTIsIDB4MjQyQkU2RkYsIDB4RDQzNTI1NDIsIDB4NjY2REQyMkUsCisweDI3NjI0MjBCLCAweEUxRkJENTJELCAweDI3MTk2NzUwLCAweDAwMEI0RjI2LAorMHg0RjIyMjU3MCwgMHhEMTI4RDQyRiwgMHgwMDA5NDEwQiwgMHhFN0Y3RDUyNywKKzB4MjY3OTY2NTAsIDB4MDAwQjRGMjYsIDB4RDUyNDI1NjAsIDB4NjI1MDk0MjUsCisweDAwMEIyMjQ5LCAweEQ1MjEyNTIwLCAweDYyNTBFNEJGLCAweDAwMEIyMjQ5LAorMHg0RjIyMjUyMCwgMHg4NTIyRDIyNCwgMHgyMDA4NjAwRCwgMHg4ODAxODkxMSwKKzB4ODgwMzg5NDQsIDB4ODgwNTg5NDYsIDB4ODgwNjg5NDgsIDB4ODgwODg5NEUsCisweDg4MDk4OTU0LCAweDg4MEE4OTVBLCAweDg4MEI4OTYwLCAweEEwNkQ4OTY2LAorMHhCMDZGMDAwOSwgMHhBMDZBMDAwOSwgMHhGRjdGNjAwQywgMHgwMDFFMjE0OCwKKzB4MDAxRTExMDgsIDB4MDAxRTEwMDAsIDB4MDAyMDNBNEMsIDB4MDAyMDNBNEUsCisweDAwMjAzQTZELCAweDAwMjAzQTMwLCAweDAwMUUxMDNGLCAweDAwMUUxMDVGLAorMHgwMDFFMTAyRiwgMHgwMDFFMTA5MCwgMHgwMDIwM0E1NCwgMHgwMDFFMTAwQiwKKzB4MDAyMDNBNTAsIDB4MDAyMDNCMjAsIDB4MDAyMDE4QzAsIDB4MDAxRTEwMjgsCisweDAwMjAzQTZDLCAweDAwMUQ0MDIwLCAweDk4NzYwMDAwLCAweDAwMUMxMDAwLAorMHgwMDIwM0IyQywgMHgwMDIwM0IzQywgMHgwMDIwM0EyNCwgMHgwMDA5QjA0QywKKzB4NjAwQ0EwMzUsIDB4MDAwOUIwNTUsIDB4NjAwQ0EwMzEsIDB4NjI2MEQ2ODQsCisweDhCMkIyMjI4LCAweDAwMDlCMDYxLCAweDYwMENBMDI5LCAweDYyNjBENjgwLAorMHg4QjIzMjIyOCwgMHgwMDA5QjA2OSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY3QywKKzB4OEIxQjIyMjgsIDB4MDAwOUIwQzcsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2NzgsCisweDhCMTMyMjI4LCAweDAwMDlCMENELCAweDYwMENBMDExLCAweDYyNjBENjc0LAorMHg4QjBCMjIyOCwgMHgwMDA5QjEyNSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3MCwKKzB4OEIwMzIyMjgsIDB4MDAwOUIxM0QsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsCisweDAwMDkwMDBCLCAweEQyNkNEMTZCLCAweEQ1NkM4NDEyLCAweDQwMDBDOTBGLAorMHhENzZCMDEyRCwgMHhFNDAzRDY2QiwgMHhFMjBGNjExQywgMHgyNTQwRTAwMSwKKzB4MjUyMDI3MTIsIDB4MjYwMjAwMEIsIDB4RTYwMUQyNjIsIDB4MzA2Njg1MjMsCisweEUwMDA4RDA1LCAweEQ2NjNEMjYwLCAweEUwMDE4MTIyLCAweDAwMEIyNjAyLAorMHhEMjVDMDAwOSwgMHg2MDBEODUyMywgMHg4OTA1MjAwOCwgMHg4QjBBODgwMSwKKzB4NjA2MEQ2NUQsIDB4MjYwMENCMDEsIDB4RDQ1N0Q2NUEsIDB4RTAwMUUxMDEsCisweDAwMEIyNjEyLCAweDAwMEI4MTQyLCAweEQxNTJFMDAwLCAweDg1MTNFNTAxLAorMHg2NDBENDUxOCwgMHg2NjAzMzQ1MywgMHhFMDAwOEQwNSwgMHhENTUxRDI1MywKKzB4MjI2MEUwMDEsIDB4MDAwQjI1MDIsIDB4NEYyMjAwMDksIDB4ODUxM0QxNDksCisweDY0NTM2NTBELCAweDYyNDk0NDE5LCAweDIyN0Q2NzJFLCAweDg4MDE2MDJDLAorMHg4ODAyODkwOSwgMHg4ODAzODkxMCwgMHg4ODA2ODkxQSwgMHg4ODA3ODkzNSwKKzB4QTA0Qzg5M0IsIDB4RDU0NjAwMDksIDB4NjY1MkQ3NDYsIDB4Mjc2MkQ0NDYsCisweDYyMkM2MjYxLCAweDI0MjFBMDM4LCAweDIyMjg2MjVDLCAweEQ0NDM4QjNGLAorMHg2NjQyRDU0MCwgMHgyNTYyRDQ0MCwgMHgyNDAxODU2MSwgMHg2MjAzQTAyQywKKzB4MjAwODYwNUMsIDB4ODgxMDg5MDcsIDB4ODgyMDg5MDgsIDB4ODgzMDg5MDksCisweEEwMkM4OTBBLCAweEQyM0EwMDA5LCAweDYyMjJBMDA4LCAweEEwMDVEMjM5LAorMHhEMjM5NjIyMiwgMHg2MjIyQTAwMiwgMHg2MjYyRDYzOCwgMHhENDMyRDUzMSwKKzB4NjYyMTI1MjIsIDB4QTAwRjYyNkMsIDB4RDYzNTI0MjEsIDB4NjI2MUQ1MkQsCisweDYyMkNENDJELCAweEEwMDcyNTYyLCAweEQ2MzIyNDIxLCAweDg1NjFENTI5LAorMHgyNTYyRDQyOSwgMHg2MjAzMjQwMSwgMHg2NjJEODUxNSwgMHgzNjE3NjEwRCwKKzB4NjUwMzhGMDEsIDB4QjBDQjI0NTEsIDB4QTAwMTAwMDksIDB4RTAwMEUwMDEsCisweDAwMEI0RjI2LCAweEQ2MTkwMDA5LCAweEQ0MjdFMTAxLCAweDY1NDEyNjEwLAorMHhEMTE4RDcxNywgMHhFMjBGNjU1RCwgMHgyNzUyRTAwMSwgMHgwMDBCMjYyMCwKKzB4MkZFNjIxMDIsIDB4RDIwRjRGMjIsIDB4NjQwQzg1MjMsIDB4OEIwODI0NDgsCisweEQ1MTFENjFELCAweDI2MjFFMjAwLCAweDk0MEY4NDUxLCAweEEwNDgyMDQ5LAorMHhERTBEODA1MSwgMHhDODQwNjBFMCwgMHhFMjAxOEQzMiwgMHg4OTQ0MzQyNywKKzB4RDIxNkQ2MTUsIDB4MjY0MTQyMEIsIDB4MDAwOUEwMzAsIDB4MDAwMEZGN0YsCisweDAwMjAzQTZELCAweDAwMjAzQTI0LCAweDAwMjAzQTMwLCAweDAwMUUxMTAwLAorMHgwMDFFMTAwQywgMHgwMDIwM0E1MCwgMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwKKzB4MDAyMDNBNTgsIDB4MDAyMDNBMzgsIDB4MDAyMDNBM0MsIDB4MDAyMDNBNDAsCisweDAwMjAzQTVDLCAweDAwMjAzQTYwLCAweDAwMjAzQTY0LCAweDAwMjAzQTY4LAorMHgwMDIwM0UyMCwgMHgwMDIwM0UyQSwgMHgwMDIwM0E0QSwgMHgwMDIwMjdGMiwKKzB4ODkxMjM0MjcsIDB4RDI5NEQ2OTMsIDB4MjY0MTQyMEIsIDB4Q0I4MDg0RTEsCisweDgwRTFCMEY1LCAweEQ2OTE2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDYwLAorMHhENjhGMjYwMCwgMHhBMDAxRTAwMSwgMHhFMDAwMjYwMiwgMHgwMDBCNEYyNiwKKzB4RDY4QzZFRjYsIDB4Qzg4MDYwNjAsIDB4RDI4Njg5MTksIDB4ODgwMTYwMjEsCisweEQyODk4QjE1LCAweDg1MjRFNTAxLCAweDg5MTAzMDU2LCAweEUyMDNEMTg3LAorMHgyMTIwRDQ4NywgMHhFMDBCNjU0MSwgMHgwNjU2NjU1RCwgMHhFNDBGRDU4NSwKKzB4MjE0MEU3MDIsIDB4RDc3RTI1NzEsIDB4MDAwQkUwMDEsIDB4MDAwQjI3MDIsCisweDJGRTZFMDAwLCAweERFODA0RjIyLCAweEM4ODA4NEUxLCAweEQ1N0E4OTJDLAorMHgyMDA4ODU1NCwgMHg2MTAzOEYyOCwgMHg4NTUzRDc3QywgMHg2NDAzNjY3MiwKKzB4ODU2NjY1MEMsIDB4MzUyMDYyMEMsIDB4RDY3OThCMUUsIDB4NjUxQ0Q3NzQsCisweDI2NTE2NDRDLCAweDYwRTAyNzQxLCAweDg5MDRDODQwLCAweDQyMEJEMjc1LAorMHhBMDAzMDAwOSwgMHhEMjY4MDAwOSwgMHgwMDA5NDIwQiwgMHgwMDA5QjA5RiwKKzB4RTIwMUQxNjcsIDB4NjBFMDIxMjIsIDB4Q0IwNEQ0NjQsIDB4NjA0MDJFMDAsCisweDI0MDBDOTNGLCAweDYwMjNBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHhEQTYyMkZFNiwgMHg2NkExRTI0MCwKKzB4MzYyMkRDNUUsIDB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsCisweDRFMjEyQTYxLCAweERCNjFENDYwLCAweEU3MDBBMDBGLCAweDc3MDE2MkIyLAorMHg3MTAyNjEyMywgMHg2NjIxMkIxMiwgMHg3MTAyNjIxMywgMHg2MTIxMkIxMiwKKzB4NjUxRDY2NkQsIDB4MzU2QzQ1MjgsIDB4NjI3QzI0NTIsIDB4OEJFRDMyRTMsCisweEM5MDM2MEQzLCAweDhCMTA4ODAzLCAweDYxNzM2N0IyLCAweDJCMTI3MTAyLAorMHg3MTAyNkUxMywgMHgyQjEyNjU3MSwgMHg2NTVENkRFMSwgMHg0MjI4NjJERCwKKzB4MzI1Q0UxMDcsIDB4QTAwQzJDMTAsIDB4ODgwMjI0MjIsIDB4QTAwMzhCMDEsCisweDg4MDFFMjAzLCAweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY1NUQ2NTYxLAorMHhFNjBGMjQ1MiwgMHg2N0ExMkM2MCwgMHg4QjA1Mjc3OCwgMHhERDM4REM0NCwKKzB4RUIwMUVBMDAsIDB4MkRCMjJDQTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDZBRjYwMDBCLCAweDJGRTYyRkQ2LCAweEUyNDBERDM2LCAweDM2MjI2NkQxLAorMHg2MjYzODkwMCwgMHgzNjc4NjcyQywgMHg3NzAzREUzOCwgMHg0NzIxMkQ2MSwKKzB4NjRFMkQ2MzUsIDB4QTAwRTQ3MjEsIDB4NjU2MkUxMDAsIDB4NjI1MzcxMDEsCisweDc0MDEyNDUwLCAweDI0MjA0MjE5LCAweDQ1Mjk3NDAxLCAweDc0MDEyNDUwLAorMHgyNDUwNDUxOSwgMHg2MjFDNzQwMSwgMHg4QkVFMzI3MywgMHg2NkUyNDIwMCwKKzB4NDIwMDYxRDEsIDB4MjExODM2MkMsIDB4MkU2MjhGMDYsIDB4REQxQ0Q3MjgsCisweEU1MDFFNDAwLCAweDJENTIyNzQyLCAweDAwMEI2RUY2LCAweDJGRDY2REY2LAorMHg0RjIyMkZFNiwgMHhFRDBBRUUwMSwgMHg2NEUzQkM4NiwgMHhCQzhCNjRFMywKKzB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4QkM4RUVFMDEsIDB4NjRFMzY0RTMsCisweDdFMDFCQzkzLCAweDMyRDc2MkVDLCAweDRGMjY4QkY3LCAweDAwMEI2RUY2LAorMHhEMTE4NkRGNiwgMHhENDE4OTIwRCwgMHg3MjEyMjEyMiwgMHgyNDIyRDYxNywKKzB4RDcxNzcyMDQsIDB4NzIyMDI2MjIsIDB4MjcyMkQxMTYsIDB4MDAwQjcyMzAsCisweDEzN0EyMTIyLCAweDAwMjAzQTRBLCAweDAwMjAyOEZFLCAweDAwMUUxMDE1LAorMHgwMDIwM0E1MCwgMHgwMDFFMTAwMSwgMHgwMDIwM0EyNCwgMHgwMDFFMTEwMCwKKzB4MDAyMDNBNEUsIDB4MDAyMDNBM0MsIDB4MDAxRTEwMDAsIDB4MDAyMDNBNDAsCisweDAwMjAzQTRDLCAweDAwMjAyN0YyLCAweDAwMUUxMDBDLCAweDAwMjAzQTM4LAorMHgwMDIwM0E1NCwgMHgwMDIwM0E1OCwgMHgwMDIwM0E1QywgMHgwMDIwM0E2MCwKKzB4MDAyMDNBNjQsIDB4MDAyMDNBNjgsIDB4NEYyMjJGRTYsIDB4RDY3MDdGRkMsCisweDg4MDE2MDYwLCAweEUyMDE4OTUxLCAweDI2MjBCRkJCLCAweEQ1NkVEMTZELAorMHhERTZFNjAxMCwgMHg2NEUzNjU1MiwgMHg3NDAyQzg0MCwgMHg4RDIyRDE2QywKKzB4RDI2Qzc1MDIsIDB4RTYwMUQ3NkMsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NjM3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1NjIsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweEEwMjA3MTAyLCAweEQyNUUwMDA5LCAweEU2MDFENzVCLCAweEU3MDQyNzIyLAorMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDUyNzQwMiwKKzB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsCisweDgxRTQ2MDdDLCAweEU0MTdENTUzLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLAorMHg4RkY5MjE3MSwgMHg5Mjg5NzEwMiwgMHhEMjQ2MkUyMSwgMHg1RTIzRDc0RSwKKzB4NjRGMjJGRTIsIDB4NjA0MzY1RjIsIDB4MjcwMEM5ODAsIDB4Qzk2MDYwNDMsCisweDgwNzE2MTAzLCAweEM5MDM2MDQzLCAweDgwNzI0NTE5LCAweDY1RjI2MDVDLAorMHg4MTcyNjZGMiwgMHg0NjE5NDYyOSwgMHg2MDZDNDUyOSwgMHg0MDE4NjQ1QywKKzB4ODE3MzMwNEMsIDB4MjExODVFMjMsIDB4NjRGMjJGRTIsIDB4NkU0QzYyRjIsCisweDYwMkM0MjE5LCAweDY2RjI2MkYyLCAweDQ2Mjk0MDE4LCAweDQ2MTkzMEVDLAorMHg0MjI5ODE3NCwgMHg2NTJDNjA2QywgMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywKKzB4MDAwOUJDOTcsIDB4MjIyODYyMEMsIDB4QTAwQTg5MDgsIDB4NjAxMzAwMDksCisweDhCMDM4ODQwLCAweDAwMDlCMDA5LCAweDAwMDlBMDAzLCAweEUyMDJENjJGLAorMHg3RjA0MjYyMiwgMHgwMDBCNEYyNiwgMHg0RjIyNkVGNiwgMHg4NTUyRDUyQSwKKzB4ODgzMDYwMEQsIDB4ODgzMTg5MDMsIDB4QTAzNDg5MjMsIDB4ODU1NTAwMDksCisweEQ0MjhENzI3LCAweDg1NTMyNzAxLCAweDYxMERENjI3LCAweDI0MTI0MTE4LAorMHg0NjBCRDQyNiwgMHhENzIzMDAwOSwgMHhEMjI2RDQyNSwgMHg2NTcyNDIwQiwKKzB4RTIzMEQxMjAsIDB4NDIyODY3MTIsIDB4MjcyOUU2MjAsIDB4Mzc2MDQ2MjgsCisweEQ2MjE4QjAzLCAweEEwMTZFMjAwLCAweEQ2MUYyNjIyLCAweEEwMTJFMjAyLAorMHhEMTE4MjYyMiwgMHg2MjEyRTUzMCwgMHhFNjIwNDUyOCwgMHg0NjI4MjI1OSwKKzB4ODkwODMyNjAsIDB4RDQxQUQxMTksIDB4RTYwMUQ1MTMsIDB4MjE2MDQ1MEIsCisweDQ3MkJENzE4LCAweDRGMjY0RjI2LCAweDAwMDkwMDBCLCAweDAwMDAwNjBBLAorMHgwMDIwM0E2QywgMHgwMDFFMTAwMCwgMHgwMDIwM0E1OCwgMHgwMDIwM0UyMCwKKzB4MDAyMDNFMkMsIDB4MDAyMDNEQzQsIDB4MDAyMDNBNDAsIDB4MDAyMDNERjQsCisweDAwMjAzREYyLCAweDAwMjAzREM2LCAweDAwMjAzQTI0LCAweDAwMjAzQTUwLAorMHgwMDIwM0EzQywgMHgwMDIwM0EzOCwgMHgwMDIwMThDMCwgMHgwMDIwM0I0OCwKKzB4MDAyMDNCNEMsIDB4MDAyMDE4RDAsIDB4MDAyMDNBNTQsIDB4MDAxRTEwMEIsCisweDAwMjAzQjYwLCAweDAwMTE0MDA0LCAweDRGMjIyRkU2LCAweDg0RTlERTg2LAorMHgyNDQ4NjQwQywgMHhCMTdCODkwMSwgMHhEMjg0MDAwOSwgMHgyNjY4NjYyMCwKKzB4NjBFMDg5MDIsIDB4MkUwMEM5QkYsIDB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsCisweDJGRTYwMDA5LCAweERFN0U0RjIyLCAweDYwRTBENjdFLCAweENCQzBENDdFLAorMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwKKzB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY3ODYxNkQsIDB4RTUwMEEwMDQsCisweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELCAweEQyNzQ4QkY4LAorMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjI2MEQ2NkUsIDB4ODk0MDIyMjgsCisweEQ1NjVFMTAwLCAweDYwNTAyNjEwLCAweENCNDBENDZCLCAweDI1MDA0NDBCLAorMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywgMHg3MTA0NjEyQywgMHgyRjExQTAwNiwKKzB4RDQ2NkQ2NUUsIDB4REQ2NjY3NjAsIDB4NjU3QzREMEIsIDB4RTIzQzZEMUQsCisweDhCMDMzRDI3LCAweEQyNjRENDYzLCAweDAwMDk0MjBCLCAweDREMjE0RDIxLAorMHhBMDA1RDc2MiwgMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwKKzB4MzVEMzY1NEQsIDB4RDc1RThCRjcsIDB4NkU3MkUwMDMsIDB4ODFFMTQwMTgsCisweDZFNzI2MEYxLCAweDgxRTI3MDBDLCAweEQ0NUE2MTcyLCAweERENUE4MTEzLAorMHg2NTcyNEQwQiwgMHhENjRBRDI1OSwgMHgyMjEyRTEwMSwgMHhDOTNGNjA2MCwKKzB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweEQyNTI0RjIyLCAweDZCNDM2RTczLCAweDQyMEI2QzUzLAorMHgyMDA4NkQ2MywgMHg2NDAzOEQxQywgMHhFNTBFRDEzQywgMHgzMjUyNjIxMCwKKzB4NjBDMzg5MTYsIDB4ODA0MTI0QjAsIDB4ODE0MTYwRDMsIDB4QTAwN0U1MDAsCisweDY1NUQ2MUJDLCAweDAwRUM2MDUzLCAweDM2NEM2NjUzLCAweDgwNjQ3NTAxLAorMHgzMjEzNjI1RCwgMHhENjMwOEJGNSwgMHhDOUJGNjA2MCwgMHgyNjAwQTAwOCwKKzB4RDIzOUQ0NDAsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDJGOTYyRjg2LAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFMTAwN0ZDNCwKKzB4NjUxM0VDRkYsIDB4NkIxMzZDQ0QsIDB4REUzNEQ3MzMsIDB4RURGRjY0RjMsCisweEQ4MzNFQTA0LCAweDYwNTM2NTVDLCAweDAyN0Q0MDAwLCAweDMyQzA2MjJELAorMHg2NjAzOEQwRCwgMHgwOUVENjA2MywgMHgyNDkxMDI3RCwgMHgyNDIxNzQwMiwKKzB4Njk4MjAyRUQsIDB4MzkyODYyMkQsIDB4NzQwMjI4OTIsIDB4NzUwMTcxMDQsCisweDYwNjM2MjVDLCAweDA3RDUzMkEyLCAweDBFQjU4RkU0LCAweDI0NDg2NDFDLAorMHhFNjgwODkwNSwgMHg2N0YzRTVDNSwgMHhCRjhGNjY2QywgMHg3RjNDNjU1QywKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweEQxMUM2OEY2LCAweDYwMTJEMjFDLCAweENCMjBFNDA1LCAweDIxMDJFNTAwLAorMHgwMDBCMjI0MiwgMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywgMHgwMDIwMzk5NiwKKzB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsIDB4MDAxRTEwRkMsCisweDAwMjAwNjQ0LCAweDAwMjAzOTlDLCAweDAwMjAyQTU2LCAweDAwMjAzQjY0LAorMHgwMDIwMThEMCwgMHgwMDIwM0I4MCwgMHgwMDIwMThDMCwgMHgwMDExNzg4QywKKzB4MDAyMDM5OTgsIDB4MDAyMDM1N0MsIDB4MDAyMDE1MzQsIDB4MDAxRTIxMzAsCisweDAwMjAyQTE4LCAweDAwMjAzQjg4LCAweDAwMjAzOUZDLCAweDAwMjAzQTA0LAorMHgwMDIwM0RDMCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHhENTY0RDE2MywKKzB4RTQwMEQ3NjQsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsIDB4RDU2MjI3MjIsCisweDk2NjlENzYyLCAweDE1NDEyNTcyLCAweDk2NjYxNTYyLCAweEU2MDExNTY1LAorMHhENTVGMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsIDB4Njc2MzI1NzIsCisweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LCAweEUyMTkyNTIyLAorMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTIyMjU0MiwKKzB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LCAweDAwMDk0MjJCLAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhDODIwNjA0MywgMHg2RTQzOEQwMiwKKzB4MDAwOUJFODUsIDB4QzgxMDYwRTMsIDB4QkU4Mjg5MDEsIDB4NjBFMzAwMDksCisweDg5MDFDODQwLCAweDAwMDlCRUE0LCAweEM4MDE2MEUzLCAweEREM0Q4OTM4LAorMHhDODAyNjBEMCwgMHgyRjAwOEQwMywgMHg0NjBCRDYzQiwgMHg2MEYwMDAwOSwKKzB4ODkwMkM4MDQsIDB4NDYwQkQ2MzksIDB4NjJGMDAwMDksIDB4Qzg4MDYwMjMsCisweDYwRDA4OTAyLCAweDJEMDBDOTdGLCAweEM4MDE2MDIzLCAweEQ2MzQ4OTA2LAorMHgwMDA5NDYwQiwgMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwgMHg4OTAyQzgwOCwKKzB4NDYwQkQ2MzAsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsIDB4NDIwQkQyMkUsCisweEQ1MkUwMDA5LCAweDg4MDI2MDUyLCAweEQyMkQ4QjAzLCAweEEwMDVFNjA0LAorMHg4ODAxMjI2MCwgMHhEMjJBOEIwMiwgMHgyMjYwRTYwMSwgMHgyNTIyRTIwMCwKKzB4Qzg4MDYwRTMsIDB4RDIyNzg5MkQsIDB4NjBFMzZFMjAsIDB4ODkwMkM4ODAsCisweDQyMEJEMjI1LCAweDYwRTMwMDA5LCAweDg5MDJDODQwLCAweDQyMEJEMjIzLAorMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMSwgMHg2MEUzMDAwOSwKKzB4ODkwREM4MDQsIDB4REQyMEQxMUYsIDB4MDAwOTQxMEIsIDB4MDAwOUJGMTEsCisweDAwMDlCRjRDLCAweEQ1MUVENDFELCAweDI0NzBFNzA4LCAweDI1RDJCRjg1LAorMHhDODA4NjBFMywgMHhEMjFCODkwNSwgMHg0RjI2N0YwNCwgMHg0MjJCNkVGNiwKKzB4N0YwNDZERjYsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MDAxQzU4MUMsCisweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLCAweDAwMDQwMDIxLAorMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwgMHgwMDIwMUE0NiwgMHgwMDIwMUE2OCwKKzB4MDAyMDIwQzgsIDB4MDAyMDFBODAsIDB4MDAyMDFBOEUsIDB4MDAyMDNBNTAsCisweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxQUZBLCAweDAwMjAxQjA2LAorMHgwMDIwMUE5NiwgMHgwMDIwMUFCNCwgMHgxMjM0NTY3OCwgMHgwMDFFMTAwMCwKKzB4MDAxMEYxMDAsIDB4MDAyMDFBRTIsIDB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsCisweEQ2QTYyNDUwLCAweDM0NkM2NDRDLCAweDI0NTAwMDBCLCAweDY0NENENkE0LAorMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwgMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwKKzB4NDIwMDYwMTksIDB4NjcwRTYxNEMsIDB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsCisweDMyNENDOTBGLCAweDIyMDAwMDBCLCAweDQyMDg2MjVDLCAweDQyMDA0MjA4LAorMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwgMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwKKzB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsCisweDI3Mjk0NjE5LCAweDZFNTM2MjY5LCAweDY3MkU2NTczLCAweDQyMjEyMjdELAorMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwKKzB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsIDB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsCisweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLCAweEQyODQ4QjdCLAorMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywKKzB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRkE0LCAweEJGQTFFNDAxLCAweEU2MDJFNTA2LCAweDYwNjM0NjE4LAorMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwgMHhFNDAxODVGMiwgMHhCRkFCNjU0MywKKzB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsCisweDYwNTM3NTZDLCAweDgwRjhCRjgwLCAweEJGODJFNDAyLCAweDg0RjhFNTEyLAorMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwgMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywKKzB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsCisweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLCAweEUwMTA2NTVDLAorMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwKKzB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsIDB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsCisweEJGNzFFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLCAweEU1RkZFNjQwLAorMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwgMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwKKzB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsIDB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsCisweEU1MDFFNDA0LCAweEJGNTdFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwKKzB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsIDB4MjY2ODY2MjEsCisweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LCAweEU0MDFCRjFDLAorMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwKKzB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsCisweEJGMjk2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLCAweDY1RjBFNjQwLAorMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywgMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwKKzB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsIDB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsCisweEU2NDBFNTAwLCAweEJGMEZFNDAyLCAweEU2NDBFNTAwLCAweEJGMTZFNDAyLAorMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUU1RTQwMywgMHhFNTEzODBGOCwKKzB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsIDB4QkVFNzcwODUsIDB4RTUwMDY1MDMsCisweEJFRThFNjQwLCAweEU1MDBFNDAzLCAweEJFRjVFNjQwLCAweEU1MDBFNDAzLAorMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwKKzB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsIDB4RTQwRjg0RkMsIDB4QkVDRDcwODMsCisweEU1MDE2NTAzLCAweEJFQ0VFNjQwLCAweEU1MDFFNDA0LCAweEJFREJFNjQwLAorMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwKKzB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMkYsIDB4MDAxRTEwODAsCisweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLCAweDAwMjAzQTRBLAorMHgwMDIwM0E0QywgMHgwMDIwM0E0RSwgMHhEMjFERDExQywgMHg2NjIwNjAxMCwKKzB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsCisweDc3MDE2MjJDLCAweDY0MjMyMTcwLCAweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LAorMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwKKzB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsCisweEQ2MERENDBCLCAweDY1NUM2NTQwLCAweDQ3MDg2NzUzLCAweDM3NTg0NzA4LAorMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwKKzB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsIDB4MDAyMDM5OTUsCisweDAwMjAzOTk0LCAweDAwMjAzOTk2LCAweDAwMjAzNUJDLCAweDdGRkM0RjIyLAorMHhFNjgwRDFBOCwgMHg2NjZDNjIxMiwgMHhEMkE3MkYyMiwgMHg2N0YzNjU2MywKKzB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsIDB4RTY4MDAwMDksCisweEQyQTE2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQwLCAweEU2ODA2NDczLAorMHhEMjlENjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MywgMHgyRjg2NjQ3MywKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZDMDRGMjIsCisweERCOTdEMjk2LCAweDcyMDEyRjIyLCAweEQxOTYxRjIxLCAweDY2MTI1MjExLAorMHg4QjAxMzYyMCwgMHgwMDA5QTBGOSwgMHhDOTAzNjA2MSwgMHg4QjAxODgwMSwKKzB4MDAwOUEwRjMsIDB4RDI5MERDOEYsIDB4NjRDMzQyMEIsIDB4NjUwM0QxOEYsCisweDYwMTExRjAyLCAweDhCMDQ4ODAxLCAweDQyMEJEMjhELCAweEFGRTQ2NEMzLAorMHg1NDUzMDAwOSwgMHg4NDRDRUU4NCwgMHg4OTAxMzBFMCwgMHgwMDA5QTBDMywKKzB4NjYxMEQxODgsIDB4NjAyMzYyNkMsIDB4OEI3MTg4MDEsIDB4NjIxMEQxODYsCisweDg5NjYyMjI4LCAweERBODZEMjg1LCAweEUwMDM2MTIyLCAweDY0MjIxMTEyLAorMHg0MDE4RDg4MSwgMHhERDgzRTUwMCwgMHg4MTQxNjdBMywgMHg3NzA0Mjg1MCwKKzB4NjQ3MjY2QTIsIDB4NkVEM0Q1ODAsIDB4MUY0NTdFMDQsIDB4NjU1MjFGNTYsCisweDY0RTM2OEQyLCAweDFGODg3NEY4LCAweDY4NDM2OUUyLCAweDFGNjM3ODk0LAorMHgxRjk5MUY3NCwgMHg2MjgyNjE0MiwgMHhENzc5RDk3OCwgMHgxRjJCRDY3OSwKKzB4Njc3MjYyOTIsIDB4MUYxQTYwNjIsIDB4MjYwMkNCMjAsIDB4RDE3NkU2MDAsCisweEU1NDAxRjU3LCAweDFGN0QxRjJDLCAweDc2MDExRjFFLCAweDMyNTM2MjZELAorMHg1MUYzOEJGQiwgMHg1MkY1NTVGNCwgMHgyNTIyMkExMiwgMHg1NUY3NTdGNiwKKzB4Mjc1MjVBRjgsIDB4NURGOTJEQTIsIDB4MkVEMjUxRkIsIDB4RDU2QjVFRkEsCisweDU0RkMyNEUyLCAweDI4MTI1N0ZELCAweEQxNjBEODY5LCAweDI1NzIyOTQyLAorMHg2OTEyNjc4MiwgMHgxOTc0RDg2NiwgMHhERDY2NkExMiwgMHg1NkZFNjBBMSwKKzB4MkEwMUNCMDEsIDB4REE2NDY0MTIsIDB4RTkwMTI4NDIsIDB4NEEwQjJENDIsCisweDUyRkUyNjkyLCAweEQ2NjFFRTAxLCAweDIyRTI0RTE4LCAweDcyMDE2MjYyLAorMHg2MEIyMjYyMiwgMHhDQjAxRDE0RiwgMHgyQjAyRTIwMiwgMHgyMTIwQTAzRiwKKzB4OEIzQzIyMjgsIDB4RTYwMUQ1NUEsIDB4MjE2MEU3MDAsIDB4RTAxQzI1NzIsCisweEM4MDEwMDRDLCAweEQ4NTc4QjBDLCAweDFGOEZEMjU3LCAweEU2MDAyODIyLAorMHg3NjAxRTU3RCwgMHgzMjUzNjI2QywgMHg1NkZGOEJGQiwgMHgyNjIyRDI1MywKKzB4RTJGRTY5QjIsIDB4MkI5MjI5MjksIDB4MEE0Q0UwMUUsIDB4RTAxRjY1RjIsCisweDAxNEMyNUEwLCAweDc0MTA1N0YxLCAweEVBMDYyNzEwLCAweERENENFNjAwLAorMHg4NDQ2REU0QywgMHgyRDAwNzYwMSwgMHg2OTZDNjg0NCwgMHgyRTgwMzlBMywKKzB4OEZGNjdFMDEsIDB4REU0ODdEMDEsIDB4MkVBMEVBOTQsIDB4RTEwMDdFMDEsCisweDdFMEYyRTEwLCAweEQxMkZFMjA1LCAweDY0MTAyRTIwLCAweDYwMjM2MjRDLAorMHg4OTA4ODgwMSwgMHg1NUYyRDIyQSwgMHg2NEMzNDIwQiwgMHhFRTAxRDEzMiwKKzB4QUYxQTRFMTgsIDB4NTVGMjIxRTIsIDB4ODU1M0QxM0MsIDB4NjIwRDY2MTIsCisweDg5MDYzMjYyLCAweEQ2M0JENDNBLCAweEU4MDE0NjBCLCAweEFGMENENzNBLAorMHhEOTFGMjc4MiwgMHg2NEMzNDkwQiwgMHhFRTAxRDEyNywgMHhEQTM4RDQzNywKKzB4NEEwQjRFMTgsIDB4QUYwMDIxRTIsIDB4N0Y0MDAwMDksIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHg4NTQ2N0ZGNCwgMHgyRjAxRTY4MSwgMHg2NjZDODU0NywgMHg4NTQ4ODFGMSwKKzB4ODFGMkQyMDksIDB4NjdGMzg1NDIsIDB4ODU0MzgxRjMsIDB4ODFGNEU0MEMsCisweDY1NjM2MDUzLCAweDQyMEI4MUY1LCAweDdGMEM3NTQwLCAweDAwMEI0RjI2LAorMHgwMDAwMDAwOSwgMHgwMDFDM0Q5QywgMHgwMDIwMjNGQywgMHgwMDExNzc5QSwKKzB4MDAxQzM2RjgsIDB4MDAyMDM1QjQsIDB4MDAyMDE0QTYsIDB4MDAyMDNBMTYsCisweDAwMjAxNEQwLCAweDAwMjAzOUE1LCAweDAwMjAzOUE0LCAweDAwMjAzOUEwLAorMHgwMDFDM0I5QywgMHgwMDFDMzcwNCwgMHgwMDFDM0Q5OCwgMHgwMDFDM0JCNCwKKzB4MDAxQzU5NjAsIDB4MDAxQzM1MDAsIDB4MDAxQzNEMzAsIDB4MDAxQzg5NjAsCisweDAwMjAzNThDLCAweDAwMUMzRDAwLCAweDAwMjAxNjEwLCAweDAwMTE3NzMwLAorMHgwMDIwMzlBOCwgMHgwMDFDNTgyQywgMHgyMDAwQTAwMCwgMHgwMDAwQTAwMCwKKzB4MDAxMTc3OEMsIDB4MDAxMTc3OTIsIDB4MDAxMTc3ODgsIDB4MDAyMDM5N0MsCisweDAwMjAzNTdDLCAweDAwMjAxNTM0LCAweDAwMUUyMTMwLCAweDAwMjAzREEwLAorMHgwMDIwMThDMCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4RDE5QjdGRUMsIDB4MkYxMkUwMDAsIDB4NjEwM0Q0OUEsCisweDFGNDI4MUYyLCAweEREOUFEQTk5LCAweEQ2OUE2ODEzLCAweEUwMDE0ODA4LAorMHg0NjBCREU5OSwgMHgzOEVDNDgwMCwgMHg2NUEyMUYwMywgMHgzNTIwNTJBMSwKKzB4QTIzRThCMDEsIDB4NjA1MTAwMDksIDB4ODgwMUM5MDMsIDB4QTIzODhCMDEsCisweDUyNTMwMDA5LCAweDMyRTBERTkxLCAweEQ5OTE4QjEwLCAweDY0QTM0OTBCLAorMHg0QjBCREI5MCwgMHhERTkwNjQwMywgMHhENzkxRDY5MCwgMHhFQzAxRDU5MSwKKzB4MkUwMkUxMDAsIDB4MjcxMDI2QzAsIDB4MjUwMkFGREYsIDB4QzgwMTg1NTEsCisweEExNTc4QjAxLCAweDYyNTEwMDA5LCAweDQyMDA2MjJELCAweDVFNTMzNjZBLAorMHg4NUUyMjI2RCwgMHhDOTAzNjQyQywgMHg4NUUzNjYwMywgMHg2MDUzNjUwRCwKKzB4NDAyMTQwMjEsIDB4NDUwMEM5M0YsIDB4MzIyQTY3MDMsIDB4NjA1MzI1MkQsCisweEM5MDFEMTdGLCAweDYwMTA2QzAzLCAweDg4MDFEOTdGLCAweERCN0Y4QjA1LAorMHgyMTIwRTIwMCwgMHhDQjAxNjBCMiwgMHhEMTdEMkIwMiwgMHg4ODAxNjAxMSwKKzB4NjVBMjhCMEEsIDB4OEQwNDI0NDgsIDB4OUI5RTYyNTEsIDB4QTAwMzIyQjksCisweDkxOUIyNTIxLCAweDI1MjEyMjFCLCAweDM3QjNFQjEwLCAweDI0NDg4OTVFLAorMHhENDczOEIwNywgMHgyMjI4NjI0MSwgMHg2MDYzODkwMywgMHhBMDU3ODFGOCwKKzB4RDU3MDY0NzMsIDB4NDYwODQ2MDgsIDB4ODVFMjYyNzMsIDB4NDYwMDZCNTAsCisweDM2MkM0MjAwLCAweDJCQjhDOTEwLCAweDhGMUY2NDYzLCAweDI2Njg2NjAzLAorMHhEMjY5ODkxMSwgMHgwNjJENjA0MywgMHg0MTE5NjE2RCwgMHg2QjBFNjAxOSwKKzB4ODFGODIwQkQsIDB4ODgwMTYwQzMsIDB4NjQ2QzhGMkMsIDB4ODgwRjYwNzMsCisweEEwMjc4QjFCLCAweEQyNjEwMDA5LCAweDA1MkQ2MDQzLCAweDQxMTk2MTVELAorMHg2NzBFNjAxOSwgMHg2NDVDMjA3RCwgMHg4MUY4QTAxQywgMHg4OTBGMjY2OCwKKzB4NjA0M0QyNUIsIDB4NkI1RDA1MkQsIDB4NjBCOTRCMTksIDB4MjAxRDYxMEUsCisweDYwQzM4MUY4LCAweDhGMEQ4ODAxLCAweDY0NzM2NDVDLCAweEVDMDBBMDBBLAorMHg2MDQzRDI1NCwgMHg2MjVEMDUyRCwgMHg2MDI5NDIxOSwgMHgyMDdENjcwRSwKKzB4ODFGODY0NUMsIDB4ODgwMjg1RjgsIDB4ODVFMTg5MEEsIDB4OEQwN0M4MjAsCisweEU2REM2MjAzLCAweDYwMjMyMjY5LCAweDgxRTFBMDAyLCAweDY0NENFNEZGLAorMHg2MjEwRDE0OSwgMHg4OTAxMjIyOCwgMHg2NDRDRTRGRiwgMHg2NTRERUJGRiwKKzB4MzVCMDZCQkMsIDB4REIzNjhCMkIsIDB4NjRBMzRCMEIsIDB4NDEwQkQxMzUsCisweDU0MDM2NDAzLCAweDg1NDQ2RTAzLCAweEM5NDhEQjQwLCAweERDNDA4ODA4LAorMHhCRUFDOEIwMSwgMHg2NEIzRTUwMiwgMHg2NUUzNEMwQiwgMHhEQjNERUMwMSwKKzB4RDEzRDJEQzIsIDB4NjIxMjYwQjIsIDB4NzIwMTcwMDEsIDB4MjEyMjg4MDUsCisweDJCMDI4RjA4LCAweDY2NkNFNjgwLCAweDY1NjNEMjM4LCAweDc1NDlFNzAwLAorMHg2NDczNDIwQiwgMHhBMDMwRDQzNiwgMHg3RkZGMDAwOSwgMHg4NUUyODAwMCwKKzB4MjBCOUVCRkMsIDB4NjEwMzgxRTIsIDB4OTQyQTg1RTMsIDB4NjIwMzIwNDksCisweDQ1MDg4NUY4LCAweDgxRTIyMDFCLCAweEM5MDE2MEMzLCAweDQwMDg0MDE4LAorMHg0MDA4NDAwOCwgMHg0MDAwMjI1QiwgMHg2MDIzMjIwQiwgMHg4NUU0ODFFMywKKzB4NDExOEUxMDgsIDB4ODFFNDIwMUIsIDB4RTQwMjYyQTIsIDB4MjBCOTg1MjEsCisweDY3QTI4MTIxLCAweENCMDE2MDcxLCAweDg1RjgyNzAxLCAweDg5MDMzMDQyLAorMHhFQ0U3ODVFMiwgMHg4MUUyMjBDOSwgMHg0OTBCRDQxRSwgMHhBMDNCMDAwOSwKKzB4N0UwMzAwMDksIDB4MDAxQzNEMzAsIDB4MDAyMDNEQUMsIDB4MDAyMDM1OEMsCisweDAwMUUyMTJDLCAweDAwMjAzNDcwLCAweDAwMUMzRDAwLCAweDAwMTE3NzgwLAorMHgwMDIwMTRBNiwgMHgwMDIwMTY3MCwgMHgwMDExNzcwQywgMHgwMDIwMzlBNCwKKzB4MDAyMDM5QTUsIDB4MDAyMDM5QTAsIDB4MDAyMDE4QzAsIDB4MDAxQzM2RjgsCisweDAwMjAzQTFBLCAweDAwMjAzREJDLCAweDAwMjAzQkEwLCAweDAwMjAzQzIwLAorMHgwMDIwM0NBMCwgMHgwMDIwM0QyMCwgMHgwMDIwMzk5MCwgMHgwMDIwMzU4NCwKKzB4MDAyMDE0RDAsIDB4MDAyMDNBMUMsIDB4MDAyMDNBMjAsIDB4MDAyMDIzRkMsCisweDAwMjAzREE0LCAweDAwMjAzREE4LCAweDYwMjI2MkYyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4QjBCODgwQSwgMHg2MEUyREU4QywgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEIwMzg4MDgsIDB4Q0IwMTYwQTIsIDB4MjgwMkEwMDYsCisweDY1RTJERTg3LCAweDJFNTI3NTAxLCAweDI4NjI2NkEyLCAweDUyRjM2NkYyLAorMHgyNjIyQUU4MywgMHhEMjgzODU1MSwgMHhERTgzQzgwMiwgMHhBMDk1OEIwMSwKKzB4NDIwQjAwMDksIDB4NEUwQjY0QTMsIDB4NUUwMzY0MDMsIDB4ODVFNDY1MDMsCisweDQ5MThFOTA4LCAweEQ3N0QyMDlCLCAweEUwNEM4MUU0LCAweERDN0MwQjdFLAorMHg3QjAxRDk3QywgMHg2MUMyMDdCNiwgMHg3MTAxNjY5MCwgMHg4RDA2MjY2OCwKKzB4RDQ3OTJDMTIsIDB4NDIwQkQyNzksIDB4QTA3MEVCMDEsIDB4NjI1MTJEQjIsCisweDRCMThFQjBGLCAweDIyQjlFMTAyLCAweDMyMTA0MTE4LCAweDg1NTE4QjBGLAorMHgyMDI5RTJGQywgMHg2MDUxODE1MSwgMHhDQjAxNzJFMCwgMHg4NUUxMjUwMSwKKzB4MjAyOTk0QTMsIDB4ODVFNDgxRTEsIDB4QTA1MjIwNDksIDB4Njc1MTgxRTQsCisweDQ3MTk2NzdELCAweDY2N0U2Nzc5LCAweDc3MDEyNzZELCAweDY5MDM2MDdDLAorMHg4ODAxNDkxOCwgMHgyNTkxOEYzRSwgMHg2QjEyRDE2MSwgMHgyMUIyN0IwMSwKKzB4NjYwRDg1RTMsIDB4NDAyMTYwNjMsIDB4QzkzRjQwMjEsIDB4NkMwMzQ2MDAsCisweDI2MkQzMjJBLCAweEM4MDE2MDYzLCAweERCNUVEMTVELCAweDk2N0Q4OTAxLAorMHhFNjAwMkM2QiwgMHg2NjZDNjdDRCwgMHg0MDAwNjA2MywgMHg2MjJEMDIxRCwKKzB4OEQwRTMyNzAsIDB4NjA0MzY0MDMsIDB4RTlGRjAyMUQsIDB4OEIwMTMyOTAsCisweDAxQzVBMDA3LCAweDYyNkM3NjAxLCAweDMyOTJFOTA0LCAweDY0NkM4QkVCLAorMHg2MDQzNDQwMCwgMHhEMTUwMDRCRCwgMHgwQjQ1NzQwMSwgMHg2NjlENjkxMSwKKzB4ODkwNzM2NzAsIDB4NjAyRDYyMTEsIDB4ODkwMzg4RkYsIDB4RTIwMURCNEIsCisweDJCMjAyMUMxLCAweEVDRkM4NTUxLCAweDgxNTEyMEM5LCAweENCMDE2MDUxLAorMHhEQzQ3MjUwMSwgMHg2NEEzNEMwQiwgMHg1MUYzNjZGMiwgMHg4NUVGMjYxMiwKKzB4NTRGMkQyNDQsIDB4NjUwRDQyMEIsIDB4MDAwOUFERTcsIDB4RTUwMERDNDIsCisweDQyMEIyQzUyLCAweDRFMEI2NEEzLCAweDU0MDM2NDAzLCAweDg1NDQ2RTAzLAorMHg2NzAzRTkwOCwgMHg2NTAzNDkxOCwgMHgyNzk5ODU0MSwgMHhEQjMyMzc5MCwKKzB4OEYwQkQ5MzIsIDB4NjAxMzYxMEQsIDB4OEIwN0M4MjAsIDB4Qzk0ODYwNTMsCisweDhCMDM4ODA4LCAweEU1MDFCRDRCLCAweDAwMDlBMDA1LCAweDIxMjhEMjMzLAorMHhCRDQ0ODkwMSwgMHg2NEIzRTUwMCwgMHg0OTBCNjVFMywgMHhBREJDRUMwMSwKKzB4ODVGMjJEQzIsIDB4NzAwMUVFMDQsIDB4MzFFNzYxMEQsIDB4OEQwMjgxRjIsCisweEFEQTk3QTA4LCAweDdGMTQwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHhGN0ZGNjhGNiwgMHgyRkU2ODAwMCwKKzB4RDIyMzRGMjIsIDB4NjBFMzZFMjIsIDB4OEQwMkM4NDAsIDB4QkJFNTIyRTIsCisweEUyNDAwMDA5LCAweDJFMjg0MjE4LCAweEJCRjA4OTAxLCAweDYwRTMwMDA5LAorMHg4OTA1QzgxMCwgMHhEMjFDRDQxQiwgMHgwMDA5NDIwQiwgMHgwMDA5QkJFRiwKKzB4QzgwNTYwRTMsIDB4QkQ2RDg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsCisweEFCRUM0RjI2LCAweDRGMjY2RUY2LCAweDZFRjYwMDBCLCAweDAwMUMzRDNDLAorMHgwMDExNzc2MCwgMHgwMDIwMTRBNiwgMHgwMDIwMTY3MCwgMHgwMDIwMzUxQywKKzB4MDAyMDNEQzAsIDB4MDAyMDM5OTAsIDB4MDAyMDM1ODQsIDB4MDAyMDE0RDAsCisweDAwMjAzOUZDLCAweDAwMjAzQTA0LCAweDAwMjAzOUY4LCAweDAwMjAzOUZBLAorMHgwMDIwMTUzNCwgMHgwMDIwMThEMCwgMHgwMDIwM0ExQywgMHgwMDAwODAwMCwKKzB4MDAxQzM1MTAsIDB4MDAyMDNEQjQsIDB4MDAyMDE4QzAsIDB4ODkwMTRGMjIsCisweDYxMUI2MDBCLCAweDYxMUJCMDBBLCAweDAwMEI0RjI2LCAweDYwMEI2MDBCLAorMHg2MTFCQTAwNCwgMHg4REYxMjEwNywgMHg4QkY4NDAxMSwgMHg2MjBEMkYyNiwKKzB4OEYzRTMwMjAsIDB4NDAxODAwMTksIDB4OEIwQjMwMTYsIDB4MzEwNDMxMDQsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDQxMjQ2MkY2LAorMHg2MDFDMDAwQiwgMHg0MTI5NjIxOSwgMHgyMDA4NDAxOCwgMHgzMTA0ODkyNiwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDYxMTkzMTA0LAorMHgzMjA0MjIxRCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwKKzB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsCisweDIxMkQzMjA0LCAweDYwMTk2MkY2LCAweDQwMjQwMDBCLCAweDAwMEJFMDAwLAorMHg2MjEzNjJGNiwgMHg0MTI5NDIyOCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4NjAyRDQyMjQsIDB4NjJGNjAwMEIsCisweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLCAweDEyMTQxNjE4LAorMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwKKzB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsCisweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LCAweDAwMjAzNDlBLAorMHgwMDIwMzQ1MCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4MDAwQjQwMjgsCisweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywKKzB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDI3MDczNzIsCisweDNEMjA2Njc1LCAweDU1NEUyMDNELCAweDIwMkM0QzRDLCAweDZFNDk2NzdBLAorMHg0RTQ5NzI3NCwgMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwgMHg2MTc2NkU0OSwKKzB4MjA2NDY5NkMsIDB4NzI2NTczNzUsIDB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsCisweDAwMjE0NDQ5LCAweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLAorMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwgMHgyMDNBMzA1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMyNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMzUxLCAweDAwMDAwMDIwLCAweDIwM0EzNDUxLCAweDAwMDAwMDIwLAorMHgyQjQzNDc0MSwgMHg3MzY5NkY0RSwgMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywKKzB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsIDB4NkYyMDZDNjksIDB4Njk3NDIwNkUsCisweDBEMEE2NTZELCAweDAwMDAwMDAwLCAweDAwMDAwMDcyLCAweDAwMjA1MjIwLAorMHg2MjczNTU3NiwgMHg3NDczNzI1RiwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM3NTczNUYsIDB4NjQ2RTY1NzAsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsCisweDczNjU3MjVGLCAweDAwMEEwRDZELCAweDAwMDAwMDQ0LCAweDQ0Mzg3NTcwLAorMHg3MjYzNzM2NSwgMHg2Rjc0NzA2OSwgMHgzRDU4NDU3MiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwNDcsIDB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsCisweDQ5Njc3QTIwLCAweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELAorMHg2NTRDNzI0NSwgMHgwMDAwMDA2RSwgMHgyMDc0NkY0RSwgMHg3NTZGNkU2NSwKKzB4NDkyMDY4NjcsIDB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsIDB4MDAwMDAwMDAsCisweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLAorMHgwMjAwMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsCisweDAwMDMwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwKKzB4MDIwMDAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMTBGMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsIDB4MDAwMDAwNTksIDB4NzMyMDQxNDIsCisweDAwM0Q3MTY1LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwKKzB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsIDB4ODIwNTA3MDAsCisweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDMwNDA1LAorMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwgMHgwNDAwMDAwNCwKKzB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsIDB4NDAwMjgyMDUsCisweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLCAweDAwMDA0MDAyLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNQMkZ3SW1hZ2VTaXplPTE1OTY0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZndidS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZndidS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MGY1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd2J1LmMKQEAgLTAsMCArMSw1MjY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0J1ZkltYWdlW10gPSB7CisweDNBNEJDRjE4LCAweEY0NEMwNzZFLCAweEY1OTQ1MkVBLCAweDQ1MUJBNzU1LAorMHgxNDBBQzg3QSwgMHhDMDdFRTk0MiwgMHgzRUY5NzhBQiwgMHhGNUIwM0RDNiwKKzB4QjcwMDgwRjAsIDB4QTg5MDY0RUEsIDB4NTRFMkMxRDYsIDB4RUIwNDdERjQsCisweDE3OTgzOTBDLCAweDAwMzUwNjI0LCAweDM1QjNFQ0YwLCAweDU5RjJGQUJGLAorMHhBRjlEMjQ4RSwgMHhGOUJEQjlGMCwgMHhEMDVDOEI0NywgMHhDMDhCNUExNiwKKzB4OTkwMDkzQzcsIDB4RDMzNUExNjAsIDB4MUMwNDk0MkMsIDB4QkY2RTdBODgsCisweEZEMjMyQjBGLCAweDVDMjI0Mzg3LCAweEJGMUUxNTZDLCAweEYyNEYyQTI3LAorMHhGRjU2NDIxRCwgMHhCMjEzMDM3QywgMHgyQkE2N0JBMCwgMHg0OTUwQ0Y4QSwKKzB4MDVGMDBGMjUsIDB4QTVFODIwODUsIDB4NzQxNjhBMEMsIDB4MkYyQUIzMEIsCisweEM4MEM1N0VFLCAweEI2QkRGNTcwLCAweDg5QkM1QTk5LCAweDdGM0I1QTY3LAorMHhGNkM5NDNCOCwgMHgwQzlDOTIwMSwgMHhFODM4Mzc0NywgMHgwQzlBNzJENiwKKzB4RTA1MjA3MDQsIDB4QTY2RDdGMzAsIDB4RTQ0NEE0MzQsIDB4RTBDOTRBQjcsCisweDhERDc3NTFDLCAweDFBNjU5NDY0LCAweDZDOUFCQTRGLCAweDc5MkYyRDJELAorMHg1OTM2RjY2QiwgMHgwNjFFNTgwRSwgMHg1OTkwM0Y2QywgMHgxRkJGQjhBMCwKKzB4Q0M4MjJFRkUsIDB4NEIwMzBDQUYsIDB4QjYyNDU3QzksIDB4MjdFOUJGMTUsCisweEIxMTNBNDg3LCAweEZBMEZDOTE1LCAweDQ0N0IxODRBLCAweDUzMzBDRDUxLAorMHgwMEJDQzYyMiwgMHhGMzBERTE0OSwgMHhGRjcxOEUxQywgMHg3QjVEMjg2MSwKKzB4REJDQTU3M0UsIDB4RkIwRDdCRjksIDB4RTFDRkJBQUMsIDB4Rjk5RDQ1ODMsCisweDRCQTc0OThBLCAweDdDQUVBN0VCLCAweEJBOTU4RTMyLCAweDM2QzUzMEZGLAorMHg4Rjg4Q0E5OSwgMHhGOTNDQUJDMiwgMHg4RTQ3RUYxMSwgMHhGQjBFRUQ2RiwKKzB4NUIzNjY4QTEsIDB4OUQ2M0FEREUsIDB4QTBFRUFCOEMsIDB4MDg0OTE1RjEsCisweEZBQ0FBQTI3LCAweDIwOTYzOEZFLCAweDFDRUQ5RUZGLCAweEVFQkQyMzM1LAorMHgzOEM2RjQyNCwgMHgyRDFGM0Q3RSwgMHg5NzZFODEwNiwgMHhCRTA4N0FEMiwKKzB4MzIxOTQ4NDUsIDB4NzU2MDY2REIsIDB4QzcwRTMxNjUsIDB4QzU2OERDQjEsCisweDMyMTJFNEUxLCAweEI1RDk5MUFELCAweDA3QzNDRUY4LCAweERCNEFCQjM4LAorMHgxNTc0QzIzMiwgMHhGOEM3OTJCQywgMHgxNEU2MkRCRSwgMHg1QTQ4RTdEQywKKzB4RUZEQzU0MDcsIDB4QzQ1QjQwMTcsIDB4M0I4MTRFODksIDB4RjA5MzY0NjYsCisweDg5NDkxQjJCLCAweDlBMzU5QTQxLCAweDgyMjg3Njc1LCAweEEwRjMzOEQzLAorMHg1MjNGREQzQywgMHg0RTQwQjc5NSwgMHg0NThBREFBNCwgMHhFRDgxMjk1NywKKzB4N0FEQzczQkMsIDB4NkZEN0RCNzgsIDB4Mjc0MEZDMDQsIDB4NjM5MkFFQTMsCisweDE4NUFCQ0VBLCAweDZCNTBBQkMzLCAweDM2ODFGMDdGLCAweEM4NDBGOENFLAorMHg1NzMzRTdFQywgMHgwODA1RkE3MSwgMHgwQjM0NTMwQSwgMHg4Q0IzRDAzMywKKzB4ODE0NTE1NTEsIDB4NTNCMEI0RUMsIDB4OTA4NjQ2RDAsIDB4MTBBM0U2NDIsCisweEYzNThEQzM0LCAweEMxRkE1NzBDLCAweDJCMTI4NEIwLCAweDU5MjMyMkJCLAorMHg5RDU4Nzc4MywgMHhFN0Q3Nzk4OCwgMHhFMUJFNUQ3QiwgMHg0NEI5M0UyMywKKzB4RjhCRTk0QTIsIDB4NTA2REM3MjMsIDB4NkUwQTdEMDksIDB4M0ZCMTA0NkYsCisweERCM0ExNjZGLCAweDlDQjdENkEwLCAweEUyNzhERTZELCAweDg4NDU5MzM0LAorMHhCNTJCQTNDOSwgMHgyODQ3NDBBMiwgMHgwNEQzMDc5MiwgMHg5NDRENzlDQSwKKzB4MUQwNTBFQTksIDB4QTQwNERCMUIsIDB4OTk1MjYwMjMsIDB4QkFDRTI0RTcsCisweEI5RjIwNzA0LCAweDI4NEU2NDMyLCAweDQ3QTU5M0QxLCAweDk1RjhERkNCLAorMHgyMjBDOTE2NywgMHg4RkFBQkJCQywgMHg5M0QzNEU4QywgMHhDRTA3NzEzOCwKKzB4NEZDMTgwODEsIDB4RTc2REQ3RTUsIDB4Njc0NjVGNkMsIDB4N0E0NzlENzcsCisweDc0RDYxRjgyLCAweDAwNTU5MjE0LCAweDJGNjZFNDJFLCAweDg3NDJBOTZCLAorMHg2MjA2Mzk1MCwgMHhBMkRCRkFFNSwgMHgzNjhCOTY2RiwgMHhBQjVGQ0NFMSwKKzB4Q0I0MDIzQjEsIDB4MUU3QUY1NDIsIDB4MDU5NTNFMzAsIDB4OENBNTFDRkMsCisweDIyMTY1NDdELCAweDI5RDU2MkQ0LCAweEU5QzlGOEVFLCAweEE5MDUwNUM5LAorMHgwODhEMEVFQiwgMHhEN0EyOTBGQSwgMHg5NUU1QjU2NywgMHg1M0ZBRDNDMCwKKzB4Qjg5RkM2MjUsIDB4NjlBNzUxOUIsIDB4MzY4N0M3RUYsIDB4NzE4OENCNTUsCisweENFNURCOTdFLCAweEEyNjA1NzRBLCAweEQ0NTNEMTczLCAweDE0NUQ5NzBCLAorMHgxMjExMkNDNiwgMHgzOTk4MzlFMCwgMHgyOUM1NUJFQiwgMHhFNDY3QzcxRiwKKzB4MTBCM0M5RDQsIDB4OEYxQzk2NjIsIDB4RjIwN0E4MjYsIDB4RTAyNDU2MDAsCisweDY4OEIxODEyLCAweDVBNDgzMDMxLCAweDcwNDgzODBBLCAweDc4RTNENUJCLAorMHgxOTUxNTMzRCwgMHg4RkE1RDhFMywgMHhDNUJFNTAwRCwgMHg3MURCNUIyQiwKKzB4QTE3QUEwMDAsIDB4NDA4QzlCRTgsIDB4MTYxRTEyRjUsIDB4QjFDMzhDNDUsCisweDIyQTg4RjA1LCAweERFM0Y0NDA1LCAweDUwNzhBREJCLCAweENFMUJGMUE2LAorMHhCN0E3NUIwNCwgMHg2QjgzNjRFOCwgMHgwQ0UzMkUzRSwgMHg5QkY2NTUwNCwKKzB4MjhDMTgxNTcsIDB4NzgzNTlBQzYsIDB4NjE3QkYyMDIsIDB4MUU3NkZBMDksCisweDBGOEU2MUE4LCAweDZEMDJGMEQ1LCAweDgwMzU2NDU5LCAweDc5Q0VGQUU3LAorMHg3RDAwRjE1NSwgMHg1QzFDMDEyOCwgMHhDNzVDQTA3MywgMHgzMjgxNjA5MCwKKzB4OUZGNzhERkMsIDB4ODQ4RDI2OUMsIDB4RjgxMUIzMTQsIDB4QTg2OTIwRkMsCisweDZGODg1RDAxLCAweEFDRkU2NTI1LCAweEM3MjYwNzRELCAweEZFRDY4NTk5LAorMHhGMUQ1Qzc2QSwgMHg4Nzk5RTVGNSwgMHhGODVGNTE3MSwgMHhEOERFMkQzQiwKKzB4RTdERDhFNzUsIDB4NDNGODYxNEEsIDB4MDY4NEZDOEQsIDB4OTY4M0I4QzgsCisweDc0QkU3ODZCLCAweDI1MTQ3NjJELCAweDdEODY2NjgyLCAweEU3MTFGRTFGLAorMHgwREU5RTI3MywgMHgxMkY1MzE2NywgMHg0RkEzQTdGRSwgMHgyQTAwRUI2MSwKKzB4QjM5ODRBMjgsIDB4NDMxOUYyQjAsIDB4NDJCQTBDQTIsIDB4ODQ4NzcxQjYsCisweDk5NUU5NDVFLCAweEQ0MTExNUY1LCAweDQzRDk4MzRCLCAweDU0RUVEQzM2LAorMHg1QzNDNTQwNywgMHg2NzFCNTQwRSwgMHhEQ0YxODk0OCwgMHgxNTBFRDk3MywKKzB4MkQ0OTIyREUsIDB4RjkzQ0ExN0QsIDB4QjI0QTc2RTUsIDB4RDFDMDFDMjIsCisweEYyOTYzREQ2LCAweDNCODYwMDY2LCAweDA4RUYwRUE0LCAweDYwOUI2MENDLAorMHhFMkU5MDFGQSwgMHgyNUJFOUI5MywgMHhERjk2RDlCQywgMHg4NkQ0MTVERiwKKzB4NzVDQ0Y2QkIsIDB4ODgyRDU0QjIsIDB4Nzk3NkU5QUYsIDB4ODhBMEIxNzgsCisweDVBREU1QTU1LCAweDhBOEMwMTEyLCAweEQ4OTY3NTVBLCAweENCNjc4OUIzLAorMHg4QjYzQUUyRiwgMHgyNTQ1MDM2QywgMHhFNDY1NUI5NCwgMHgyMDk1OTk3NywKKzB4MjlERkI0RDEsIDB4Q0RBQUVCRjQsIDB4MUMwN0VDMDUsIDB4NUE2RjYwN0QsCisweDg4QTlCMzFELCAweDExOEM3NEQyLCAweDAwMEJCMDY1LCAweDc1QzQ2NzEyLAorMHhFRjFBNThCRCwgMHg1MEVDQTI2MiwgMHhDQ0UzOTNCOSwgMHg2RURCOTJFOCwKKzB4NzAwRUY1MTcsIDB4QkY2Q0Y0QUQsIDB4NTc0NTZEQzAsIDB4RjYyOTUxN0MsCisweDQwMzMxRjhCLCAweEMxMEE0NTRELCAweDZDQ0IwMkNGLCAweDlCRjExQjFDLAorMHhFMDg3MTQzNywgMHgyMzYyMzU4NSwgMHhGNTE5RjA5QywgMHg0REIyQUZDOCwKKzB4ODhGQ0JEN0IsIDB4QjUxMkZFOEQsIDB4REU0NDU4OTQsIDB4MDc4QUQwM0MsCisweDQ0Mzc1RkIwLCAweDBCQUJFREIxLCAweDQwRDVFOEUxLCAweDEzRjIwQTg2LAorMHhGMTQwNjMwMywgMHg3MjA1QzMyMiwgMHgzRkM0Mzc3OSwgMHg3QTYwRDUxMCwKKzB4MTQ0NjlFMDQsIDB4RjRFNzc4NzMsIDB4MkVBRDdFQ0UsIDB4QTEzNUQ2RUEsCisweDNGNEM0QjMwLCAweDIxNDg4MDc3LCAweDY5RjY0RjFDLCAweEVFRjQ4NzZFLAorMHg2MzYxMEMwQiwgMHhCN0IyNEM1QywgMHgzMjRBNzZGRSwgMHgwQ0Y2NTFEMywKKzB4OTQ2MEYwQjEsIDB4ODFBODMyMzAsIDB4MDgzOUNGRjksIDB4NzA3MjJGMDQsCisweEMyNzhGQjNCLCAweDVERDFCREE0LCAweDFFNEIzREJBLCAweEFFMTYxQTkzLAorMHg5RTEwMzNDMywgMHhEOTM4RkNFQywgMHhEQTJCMkY5MywgMHgyOENEODJFQSwKKzB4MTRBRDFGQUYsIDB4RTRFQzlDQjgsIDB4RTc3MEFGREYsIDB4RUZCMTI4OTgsCisweDUwMEJFMTgxLCAweDYwMjYyNUM1LCAweEYxNjA2MzFCLCAweDc4RDM2NDNGLAorMHg0RTEzRUQzNywgMHg2NDdCQjIyMywgMHhDRjE4RDc1QywgMHhGNDc3Rjk0QywKKzB4Nzg2RUNCODksIDB4QjNFRDIxRjgsIDB4MUJFRjM5MTYsIDB4MjQwRkIzNUEsCisweDVDNjlCN0Q5LCAweDhFOTYyOTBBLCAweEQ0MERDOThDLCAweEQxMzcwMjkxLAorMHg1ODcwMDIxRSwgMHgzRjdDRjIzRiwgMHhGRDRBNkFEQSwgMHgzNjQ4MjQ1NywKKzB4OTI2NjAwQUYsIDB4REM4NjE4QkMsIDB4NjdEMzc3OUYsIDB4MzQyMjgzMEMsCisweDg3QTQxRkJBLCAweENBMEFGRjUzLCAweDYzQkM0NUYzLCAweDUyMEJCQkFFLAorMHhFREUyRTAzMSwgMHhCNkZBOTQ1MCwgMHgyNThDQTcxMiwgMHhENzA5QzRFNCwKKzB4NjE3NzA5QjIsIDB4QUFDRTBCNDEsIDB4MzYzREJGNTUsIDB4NzAxRDY1ODMsCisweDM5RjNDODg1LCAweDdDRDYyOTdCLCAweDA3OEZFMTNCLCAweEEzOThEQUJGLAorMHhEQjk3QzUxNCwgMHgwMzkxMDJFMywgMHg1Q0E1NDVBRiwgMHg5Mjk4QkExOCwKKzB4RDE4REFGODYsIDB4M0Q3MEVFQTIsIDB4NTI2NkFENjgsIDB4QjA0OTQ1QjUsCisweDQwMkREQTVCLCAweDAxREM2Q0QxLCAweDkzQUM1MDUzLCAweDA4REY5RUE5LAorMHg0ODVFQkU5NywgMHhBNUQwNTg1MywgMHg2Q0JFRTkxMCwgMHhENDg1RjRFMiwKKzB4OEYyMDFEMDcsIDB4RUZDMzg0QTMsIDB4NzI3MkFGQkUsIDB4QzBCNDFGRDcsCisweDhFNTRBOTcxLCAweEE3RjlFMEY3LCAweEMyMTcwMEI0LCAweEMyNEE0RUQwLAorMHg1NDE5RUFDRiwgMHhCQzJEOEZCMSwgMHgyQzVCNUFGRiwgMHgwMzQ1Mjc0QywKKzB4QzQxREY0N0EsIDB4Mzc2NThBRkYsIDB4MjRDRjNCRTcsIDB4QTMwODYyNDgsCisweEY4MkI1OTI4LCAweEI0OUE5QjA0LCAweEQ0MTA1QUVGLCAweDQ0NEVCRThELAorMHgzNDgzNjhERiwgMHhEQzc3QTdBMCwgMHg2OEQzN0UwRCwgMHhEMkVCNTRFRSwKKzB4RERBQzhDMzMsIDB4RTVDOTNDNzksIDB4RTQ3MDZBQkYsIDB4MTc1MzZFRkQsCisweDZDMkIyQjE2LCAweDAzOEFBODA2LCAweERBRDQyNDU4LCAweEFFMUQ3NkExLAorMHhDQzhERTk1QywgMHgxQkEyMDY0NywgMHgwNTIxMDY4QywgMHgzMDZGQkU0NCwKKzB4NEUyOUQ4ODEsIDB4RDJBMTRENTMsIDB4QTE1NTg1M0UsIDB4NDQ1MDBDQzQsCisweEZDNDQ2NkI3LCAweDVBQUNENTFELCAweDUwNkQzQTczLCAweDNGNjFFMEZFLAorMHg1OEYxMUY5RCwgMHhDOTJBMkNBRCwgMHhEOUE0Rjg2QiwgMHgxRkE3NDdCMSwKKzB4NzdERUM1RDIsIDB4REZBQjM2OUEsIDB4RDQ3MUVBMDEsIDB4NzI0NTAyREEsCisweDYxOENFMjFBLCAweDUyMzg4QkVCLCAweDJFOEE0Q0M1LCAweDU4MzMyMjExLAorMHgzRkNDNDZFMSwgMHg1MDEyMTBFMiwgMHhFOUQ1MUQxQSwgMHgzNzIzN0I1NSwKKzB4OENFM0UyRjEsIDB4NkIyRTk4Q0MsIDB4QjU2QTExRTUsIDB4ODgxOTAzNkIsCisweEE2QUEyRjI3LCAweEIwMTI0QTBFLCAweDkyRjE3MzY0LCAweEQ0QTg5MjM4LAorMHgwNTA3RTMzNywgMHg4RUQ5NURFQywgMHg5QzAxNEJBOCwgMHhCQTVCMTFDNiwKKzB4OUMxNUQzOEMsIDB4NTI1OTZDOTgsIDB4OTMzMEREM0QsIDB4RDYxNDc1NzAsCisweDIxNzAxRjFCLCAweDVBMjM4NUYxLCAweEUyRjM4QzZDLCAweEIzRTk0Njk4LAorMHgyRjlDNjNGQSwgMHg3RTAyMzREOCwgMHg0Q0REMzI4OCwgMHhFMTk2OUI1RiwKKzB4ODUzQjNDMUQsIDB4RjYxNDY1QTcsIDB4RjI4MUM0MTksIDB4NDZDNUYwNzIsCisweDlGMTcyMkRELCAweDY0RjJBOTk0LCAweDg2QUVFOEE4LCAweDU1ODk1RTE3LAorMHg2MDQ3RDFBQywgMHgzMzc1QTkzNCwgMHgzMzZCRUFDQSwgMHg5MDc5MTE3NCwKKzB4NERBQ0M0RDIsIDB4MjQyNTM4NjAsIDB4MkE3ODc2RkIsIDB4OURCREY5OEQsCisweEQ1QkNFMTgyLCAweDY3RUI1RjcwLCAweENDMDZCQTM4LCAweEU4Rjc4NzE1LAorMHhGRUIwRUI0NCwgMHhFOTc3NkUwMywgMHg4OTJBMDg5OCwgMHg3QTA3MDY1MCwKKzB4NkQwNEREQzQsIDB4OTlBNUI3RUEsIDB4M0I0MTZCQjYsIDB4REFEQ0U4MzQsCisweEIzQjAzMjc4LCAweERCNzNCNzBFLCAweEIwRjAyMjRFLCAweDUzOEE0QUY5LAorMHhEMjVENkEzNywgMHg4RjYyN0ZCMCwgMHgxMUVEOTM4NywgMHhCOEM4ODQ1NywKKzB4MENGMzIwQ0EsIDB4QTIwRTYyQTIsIDB4MURBQ0RENEEsIDB4QUI4NDU3NUQsCisweDc0MERBRjc1LCAweEFCOURCOTU1LCAweEZGNzg3MzE0LCAweEE2ODBCOEUzLAorMHhDOTc2RDM4RSwgMHgxRkQzOEY0RCwgMHgwQUVCNjYzMywgMHhCNjlBMDNERiwKKzB4QjZDQTg2MTAsIDB4MTA2MzU0QzIsIDB4QzM3RDQ4QzgsIDB4M0U1RUVENTQsCisweDUzNENDOUJBLCAweEUzN0RGRkFELCAweDlGNjlFQjA1LCAweEY2NzIxN0VFLAorMHg1MDE4MEIzRCwgMHhDQzYxQzEyNywgMHhDMzU5OEQ3MywgMHhFNUMwMEYwMSwKKzB4RkZFOUIxMTEsIDB4NUUyM0VBMkYsIDB4RjZDNDVEQ0UsIDB4NDQ1ODVFMzksCisweEIwMkM2MDA0LCAweDM3MjMzOTAyLCAweDRGMzc0QzBELCAweDM0Mjg4ODk4LAorMHhFMjc0OTM3RCwgMHhDODFENDcyQywgMHgxN0E0MzE1MSwgMHgyNjM4RjdEMywKKzB4NTMwNEU1QjUsIDB4RDVDRTVFREUsIDB4MzU3RkE3QjMsIDB4RkJFMjc5ODYsCisweDY0RTY1RDFGLCAweEMyOEQxMjM3LCAweEE3M0Q5QUIzLCAweDEyNENBNkM4LAorMHg3NzBENzQxNSwgMHg1Nzg4QzMyQywgMHgxOERFRkMwMCwgMHhCM0IyQjA2QSwKKzB4NTVDQzg2QTAsIDB4OEQ5MjkzMDksIDB4ODRBQjM4MUEsIDB4OURFRkU4REQsCisweDI2Qzc0MkM4LCAweDk1MkJBQzM0LCAweDBBM0IxNDBGLCAweDgyQTkzMDRCLAorMHg1MkNFQzlGNCwgMHg0N0RGNEQwOCwgMHgxNUExMTZEOCwgMHg3Qjg5MEIxOCwKKzB4Qzg3QkVGMUEsIDB4QjU5NjAxQjYsIDB4RDM3QkZCMjgsIDB4NUQ5RjU2NEQsCisweEZCMDAyRjhELCAweEU3NjAyRTU3LCAweEU0MjlDODUyLCAweDlDMEE4Qzc1LAorMHhFMDI2MTFEQywgMHg4QTFDOTg2MSwgMHg3NDk1RDZERSwgMHhDQTA1OTcxMCwKKzB4QUU1OTY5QjgsIDB4RTVCMkNCREMsIDB4QTQ5RjZFQzEsIDB4ODVEMkE1NTMsCisweEU0NzE5QjBGLCAweDQwRjY4QkJDLCAweDA5MkUyNEI1LCAweDdCMTMyNjc4LAorMHhENzBDMTdFMSwgMHgzMDlFNkFBMSwgMHhFMDA5NjU3RiwgMHhBNzIzOEM3QSwKKzB4RTA1NzVENzgsIDB4MUQ2OTgwRTcsIDB4RUZDREQzNjgsIDB4MTlGMDhEOTMsCisweEZBQzAzQjg1LCAweDUxQkFEQThGLCAweDAzN0RGODM5LCAweDhGNEQyOUY0LAorMHgxREM4QTkxMywgMHg1MEM1NTQwMiwgMHhERUU1NzhGMCwgMHgyQkExQzA5MSwKKzB4OUFDQTU2N0UsIDB4QThGRkVDRkEsIDB4QTNDMDVEMTIsIDB4RjE4QzYyODMsCisweEVBQUU2NjYyLCAweEI0REM2QTc5LCAweENFQzVFNzgyLCAweDkzQTJFMzg0LAorMHg4RjhBNUU2RiwgMHhDQTgzNzlENSwgMHg4MUJDRDQ5RSwgMHg1RkNFMTc0QiwKKzB4RDE1NDNBNUIsIDB4ODQ1RDYzNUYsIDB4RDUzMTI1QjksIDB4M0IyMTIxQUUsCisweEY4RUNERDAxLCAweEY4NEQyRDExLCAweDY1NzlCQzIxLCAweDVDMkRDMjIwLAorMHg5RUMxQTY4OCwgMHgxMTQ4RDgzMSwgMHg2QzA4Nzc5OSwgMHg1ODk0NDM1NywKKzB4NTZGNzlGQzYsIDB4NkI2ODlCNTUsIDB4NzQwQjVGRDEsIDB4OUY3QkZCNUYsCisweDZCMkYzRTJELCAweDEwRTA5MjczLCAweDJFOUUzMjEzLCAweEYzNDM2QUEwLAorMHgxNEE5RjY4MSwgMHg5MDg3RDNDRSwgMHg2OEQwNDMwQiwgMHg5RkFGRTNFRiwKKzB4RDQ1QjhDNjEsIDB4Qjk4MjcyNEEsIDB4MDQ0NDhEN0YsIDB4ODcxMkU0N0EsCisweDJDMTg4RDE1LCAweDlDM0YwNkNDLCAweDYzNDNCMTMwLCAweDU2QzY3NjVDLAorMHhGNjU3QkM5QSwgMHgxNUYxRTk3MywgMHg0N0U3MTE4MSwgMHg4NjM5RjVENywKKzB4QzFGM0ZERDUsIDB4REM1MjI0NDEsIDB4NTZCQjI5MDgsIDB4QUE0OEFFQzYsCisweEVDMDQwODdBLCAweDhEMzc1ODc1LCAweEUyOTQxRjg4LCAweEVEMzFDQzcyLAorMHgwOUJEODc5NCwgMHg0QzgxRDVDMSwgMHgxQ0M5NkQ5QywgMHg5OEE4OTAyMiwKKzB4QUEzNjJDNTcsIDB4OTI0RDU4M0QsIDB4MjcwNDMwRTYsIDB4MEZENDA0MEEsCisweEFGNTYxMTU1LCAweDM4RENEMUNGLCAweEU4NjFEMkFDLCAweDI0QTJFRjNDLAorMHgyQjdFMzg2OCwgMHgxM0RBNkMxMiwgMHg2OTIwMkVCNiwgMHg0QTVGRUM2NiwKKzB4MTg1NDE3QTksIDB4M0M5MkVGRjQsIDB4OTQ5ODQyRTYsIDB4MDIxMTVEOTMsCisweEFEMTcyNkZGLCAweDRFMDkzRDdELCAweEMzRTQxQjlDLCAweDI3QkJDMUMxLAorMHg0RkZBNDlDNywgMHg2QzYzRDI0QywgMHg4NDI1NTQ0NCwgMHgyODJDM0JBMiwKKzB4M0Q2NzlEODYsIDB4MDNCNDEwQjEsIDB4NjREQjQ1NEMsIDB4NTM1NDk5RDQsCisweDI1QjQyMUExLCAweDdFNjhDOEZFLCAweDA0NzdFM0I5LCAweENFRkIwODdELAorMHg5RTU5Qjg5QywgMHhCQjc4NzU1OSwgMHgxQTU1MEVFNCwgMHgwNzhCNDhBQiwKKzB4NzNBODY1RkUsIDB4RDcyMjc0NzEsIDB4M0E4NjQwNDksIDB4RTVFRTNBMUQsCisweDIwMUJDMTlELCAweEVCOERBRTJDLCAweDBFMkFCMzFELCAweENEQUMyRDc5LAorMHhEQUFCMDhCMSwgMHg2M0VDRDRGMiwgMHhDMDBGOTcxNiwgMHhENDE1QzZCQiwKKzB4OEMyMEMzOUYsIDB4REVEOEY1QTIsIDB4MUQ2QTQxOTAsIDB4M0QzMTkxNjcsCisweDU2QjNBMjZCLCAweDA1NDdCRjUyLCAweEEwNTY5MjRGLCAweDREQUE1MzlBLAorMHg1NTcyNDFEMSwgMHg0MkM5MTI0RSwgMHgxODcyMzMyMywgMHg2QUQ2RTdFQywKKzB4OEUwMzkzMzcsIDB4RjZGRERENjUsIDB4NUYzNTI1RjksIDB4QzBBRDk3MDQsCisweDgxMEVGMDQ5LCAweENFMDIyRUUwLCAweDQxQ0U3RTUyLCAweDhFMTcyQTQ0LAorMHg2NDg4MDhFMiwgMHhDN0ZGNjg5NiwgMHgyQUQwOTg1QywgMHgzMDRCOTYzMSwKKzB4RDIxRUEzOUIsIDB4Mjc5RjUwODksIDB4Q0RCNUMzOTAsIDB4MjE3MTZBNDAsCisweDVFMzRCMjc4LCAweDM5NDc1RDcyLCAweEJBNEY0REIxLCAweDhCMjU4MThGLAorMHhFNkU0NjZGNCwgMHhDNEEwOURGOCwgMHg1OUYxOEFDNywgMHg4ODdBQjVGRSwKKzB4RUVBNEJBNDIsIDB4MTczNzFEQTgsIDB4QTgyMTkzRDEsIDB4NkRDMzBFRjcsCisweERFQjlEMzQ5LCAweDJCMzI3MUQ0LCAweDFGRTgzODM2LCAweEVDNzU1QTI5LAorMHgwNUYwN0ZDRCwgMHhDMzMxRDNBRSwgMHhDNjIwOEI3NiwgMHg0OTdGRjI4MCwKKzB4NEM1NzlDNUEsIDB4MjJCNzFGOTQsIDB4MzBGRDYyMEIsIDB4MzFCNzFBRTMsCisweERGN0QxQTQxLCAweEYwNDFBQ0E1LCAweDk1MzMyNjFCLCAweDMyNjJEMjkxLAorMHgwNjBFOTY3MiwgMHg3RDE5MUE1NSwgMHg2RDBGMDk0NSwgMHhGOEM3Nzc3QywKKzB4MUMxNzM4MDgsIDB4NzgzMDhFNzcsIDB4QzFFRUFEM0IsIDB4MDU5Q0NEOUQsCisweEE4RkRCRTE5LCAweEU0NzYzMEZBLCAweDg4QTQ5REU1LCAweDAzMzQ3REFCLAorMHg0RjMxRjk2OSwgMHhGOUM2MkIxMiwgMHg5M0FCMTI2RiwgMHg4QTdBM0JGQiwKKzB4ODI1OTE1NDUsIDB4MkExQTIxMzEsIDB4MURFQkIxMzQsIDB4NDQ5RTI4REQsCisweEZBN0UwMjQ4LCAweEMxRTNBNUJDLCAweDE3NDdFMDk3LCAweDRDNjlBQTVDLAorMHgxRkQ3MUI0QiwgMHhBQzY0Q0E2QywgMHg1NTQ1RjlGOSwgMHg1RTU4ODZGMiwKKzB4MjQzREJBNkMsIDB4NDk1QkUxNjMsIDB4NEVDRjVBNkMsIDB4NDMwQzkwMTksCisweDg5QTk4MEZBLCAweDUyODk0NUFFLCAweDAwQ0U2OTM2LCAweDlGOUE3M0IyLAorMHg5RTU5REM2QiwgMHhENTc3NDBDRCwgMHgwRTBDQjczNSwgMHhCMTIwMkJFMywKKzB4QUEyNkMyQTksIDB4MjY3QTc3QTYsIDB4M0ZBMTJDRjAsIDB4NDU4N0MwQUYsCisweDM1NEVEODMxLCAweEZGRDhCRDhFLCAweDU2Q0MwRjI2LCAweDc1NzE3QUUzLAorMHg1MUIxMDY3NCwgMHgzRTMzRUMyNiwgMHgyNkNFODBEQiwgMHg1QzRBOTE0MCwKKzB4MDE3RjZDMkYsIDB4RjkwMzhEOUEsIDB4MEEyMkMyOUYsIDB4QkExRjdDOEQsCisweDEyNUNDOTM0LCAweDZDRjY2QkZGLCAweDQ4QzEzRENELCAweDYzRkMzRDgxLAorMHgyNThDMTgxRCwgMHgxQTRDM0RERCwgMHgyRTI0QkVDQywgMHg3Qzg2QTlFRCwKKzB4NUJEMTk4OUMsIDB4NTdDRTU5NUMsIDB4REYyOTFBRkUsIDB4RUFGMDA4ODcsCisweEQ4REQ0MjU5LCAweERGNjczMzFFLCAweDUwRDBDRTg4LCAweDFGRDA5MEFFLAorMHg2MzJEQTVGMCwgMHg5NTI3MkE1QiwgMHgzMTE3MkYyNSwgMHg1NDdGRDdERiwKKzB4QUZCRTExRDksIDB4OTcxODlERkMsIDB4QzQ4ODExOTEsIDB4MUM5MjM2NUQsCisweDg0M0RFRkRFLCAweENGMEEzOTlCLCAweENGMzI3Q0FGLCAweEREQUYwQkNFLAorMHgwM0FBN0EyRSwgMHg0MTFBODY2NCwgMHg2Q0NGN0NEOSwgMHg2MTA5N0VGNSwKKzB4MDdGMzk0MUUsIDB4NUJDM0VCNzUsIDB4Mjc5MTk0NUYsIDB4QkVCQjUyNkUsCisweDE4NjMxQTM0LCAweDI1RkVCRjEwLCAweDQxOTgzNENGLCAweEY2NDJEMTc2LAorMHgzNzJGRkYxMCwgMHgyQTFCRUExQiwgMHg0MDBGRjM0NSwgMHgyNTdBMjM0QSwKKzB4OUYxNUU5OUQsIDB4RTA2QUExREIsIDB4M0EwREIzMTUsIDB4MkJBMzBEOTksCisweDBFOUU4MzFFLCAweDFCMjVFRTQxLCAweDhEQjMwRTcwLCAweDlGQkE2RDY0LAorMHhBQjhBQTVFMywgMHg1QTk2MTc3QSwgMHg2QkUwMzUzNSwgMHg5N0UzN0RDRSwKKzB4QUNBMjRGMjYsIDB4NUYwMDk2RjcsIDB4NUQwMjcyMkYsIDB4QUY4RjNFQzcsCisweEE2ODI0MTUxLCAweDcwRkFENDA2LCAweERFQkE4NTEzLCAweDk5QzYzRTM0LAorMHgxQ0M0QTNERiwgMHg3Rjc1NjUwOCwgMHhCNzM4NjUyNywgMHg2NDdDN0ZCOCwKKzB4NDNGMUY0REYsIDB4QzdFNEVDMTgsIDB4MzAyQkExMDksIDB4RDVFOTE3NUIsCisweDgyODU2Rjc3LCAweDBGNkQ0NUQ5LCAweDk1QUUyOEI5LCAweEU2MzM4NUMzLAorMHg4RkIyNjYxOSwgMHhCRDk5RjI5OCwgMHhDODg0Qjk0OCwgMHgwQjU5NkZGMSwKKzB4RTA2MUMzRjksIDB4QkMyRjlBODEsIDB4QzQ4OENEOTEsIDB4MzcyRUY1OTAsCisweDNEQTFCRkU1LCAweDEwREUwMzdCLCAweDcyMTBCNERDLCAweDc0RTRFRkY4LAorMHg2MzY1QUZEMiwgMHg4Q0VBQkM4NSwgMHgxRDhGRkQ0MywgMHg0REUyNDNGOCwKKzB4RUM5NzZGRDksIDB4QUQ4Mjc3NjUsIDB4QzY3OUYxNUQsIDB4QzEyNUVDMzEsCisweDk1RDM0ODFDLCAweEM0RUE2RUFDLCAweEM4RkMwMTRGLCAweDEzNTJFQjY2LAorMHg5QzQwMEVCNSwgMHgyMjdCRkFCOSwgMHhCMTJCRjk1OCwgMHg4NUI2RDc4MiwKKzB4NzhCNkU0NEQsIDB4RTIyMzJFRUUsIDB4NEYxMDE3MTEsIDB4OUFCRUJGNjksCisweDY2QUNDNjgyLCAweDA0QUQ1RjU1LCAweEU0RkM2MjM4LCAweEJBM0QyMjY2LAorMHhBMkJBMzE3MCwgMHgwODNGMzlBQiwgMHhGRjIwNzVDNCwgMHg5NDVDNEIwNSwKKzB4NDFFOEMxMTMsIDB4RUM3Q0FENjcsIDB4MzY1MzczM0UsIDB4MDM1MTBDM0IsCisweDFFOTczMTU4LCAweEZCRTUwN0YzLCAweDJDQ0Q4RDlBLCAweDZFQTk0NDJGLAorMHgwRDQ4REU5NSwgMHhDNTE3QkZBRSwgMHgwNEVCQjVDOSwgMHhFRkFCMTgyMywKKzB4RDVGQkZDMEEsIDB4Njg5MEYyMTIsIDB4QTFDMDBDQ0QsIDB4NkRENTYxRTYsCisweDIwRDM5QjFDLCAweDU2MTEzRkJBLCAweENGM0E3RkQ3LCAweDNBQjVBMERCLAorMHgzNjU2NTcyRSwgMHg3QkM0OENEMywgMHg4OTAyQUUzNiwgMHhEM0U5NEFGRiwKKzB4QzA2RUI0NDcsIDB4Q0M1MTNDMEMsIDB4MjU0NEI3REQsIDB4NkYxNjg4NzcsCisweDUzMTYyNjA3LCAweDQ2MURDRUYwLCAweEY0N0FGMkJCLCAweDhBRjlGM0NDLAorMHgxRUVGRjlFNiwgMHg1N0NGQjZCNiwgMHg3RjcxMjQzOSwgMHhBQjIwQzkzRCwKKzB4MDQzRjkwMDMsIDB4NjBDODA4QkMsIDB4ODZDMjEzN0MsIDB4NDZBREI0NzQsCisweDg0OEI2NUYyLCAweDU1NDQ3ODlCLCAweDE4RTlBRUM3LCAweEM4ODk5MTNFLAorMHhGRUI3OUIyRiwgMHhBM0ZCRTUxOCwgMHg2NzkyMjQ2MywgMHg5Mzc0NjM5OCwKKzB4OTY4RTE2MEYsIDB4OENBODU2QTQsIDB4QTA0MDIwMkUsIDB4NjYwQzAwQzYsCisweDhGMEE4RTYyLCAweEUyQkE1NERFLCAweDRCRDBDMTE3LCAweDFBMUEzMDkyLAorMHgwODZDQUEzQSwgMHgyQkJBNTY3NiwgMHg4OTYxMDE3NiwgMHgwMEVEMkY5NywKKzB4QzcyMTMwQzcsIDB4NUEwNTM4ODAsIDB4NzI5OEU1NTMsIDB4RDY3OTcxRUEsCisweDBENDFFNDc3LCAweDJGQTgyODVGLCAweEI4NTZBMTkwLCAweDEzMkRCOTE2LAorMHhDREZGREQxMSwgMHhCNTUxOUE4MSwgMHgxQkM3MDAxQiwgMHg5N0M4MjREQywKKzB4QkI0QzcwN0YsIDB4OTAxNjZEQzIsIDB4NDJERkFCN0EsIDB4OTBFMzMxODQsCisweDZDNkI5NDBDLCAweERDNTUzODE0LCAweEM0RjVFN0FBLCAweDk5NDM0QUU5LAorMHg4MkJCMDlENCwgMHhDQjBBN0RBMywgMHgzQTgwMzNBRSwgMHgwNTREMzQ4MSwKKzB4RTIwQUY3NjEsIDB4MjVGNUYyNTQsIDB4N0FEM0FGM0EsIDB4MjNBMzRDMjksCisweEExOUM1N0JDLCAweDM5QjU3QUQ5LCAweDU1RTFFQzU5LCAweDVFQ0E0MTk4LAorMHhEQjkwOEJDRCwgMHg0ODcxQzNGNCwgMHhFNzA5MTMyOCwgMHg2NEE5QjZFQywKKzB4MUNDQUIyRjMsIDB4RURCMjI0MjMsIDB4RkZCNkE3MTcsIDB4NkZBMTM1NDgsCisweDM2MUZGNzExLCAweDI0NjY0MDE3LCAweENCQkY5OTcwLCAweDgzQTdCN0RFLAorMHg5QjcwNDY5MCwgMHgwMUEwQjg3NywgMHg5NTA0MUI2MCwgMHhDMDQ4RjNFMSwKKzB4QTMxNjI1RjIsIDB4RTNERkJFMjcsIDB4RjY1NzI5NUIsIDB4MUY1QzNBRjUsCisweDYwRUUxNjM3LCAweDU3NUVERkFDLCAweDcyNTg0NEZCLCAweDI0MjcyM0QwLAorMHgwNEZBNDZGQywgMHgxQThDM0Y0NCwgMHgwRTAzQTVGRSwgMHg4Nzc4MDc5RiwKKzB4NjA2RTRFMUEsIDB4N0MwQUYzRDUsIDB4OTU3OEIyNjYsIDB4NjNCQ0U3NjUsCisweEE4RUQ2NkQ5LCAweDkyNDIzNzdBLCAweDgxN0E1RDVFLCAweEQwOTgxQTk4LAorMHhDMDdGMkU3RiwgMHgwRTY2Rjg0QSwgMHgzNjM1Rjg1NCwgMHhEN0FEODM1OSwKKzB4RENGMjMyMzAsIDB4QzFCOTA4NEMsIDB4QTc5ODdGRTUsIDB4QzNCMjdFQjQsCisweDFGNzQ3MDYxLCAweEZEMjc4NjAxLCAweEI2RUQzQjVBLCAweDlDRUY4QUEwLAorMHhBNTAyM0M0NiwgMHhCNDk4MzJBRiwgMHhCMTIwNTVGRCwgMHhEODUzMTBFMSwKKzB4MkMxOUFERTYsIDB4RUZCQjE3QTgsIDB4QzI0NkE0QzcsIDB4QkU0QjI2NjYsCisweDEzQzJEN0Y5LCAweDUwMDYzQkExLCAweDlCMDBFMDJELCAweDMzNUI5REY4LAorMHhENDI0QUYyNSwgMHhCQUU0MEM5MiwgMHhFODdCRDZCNywgMHgzODREMUVCMSwKKzB4OEI5MUU4RjQsIDB4OUUzRkM2RDUsIDB4NkJCMUE1MUUsIDB4MjFBRTU1MzMsCisweEZDQjhFNzEzLCAweDE4OEI2NkIxLCAweDY1NzJFOUVELCAweDk4ODI5MTc4LAorMHg3QkFFOENCRiwgMHhFMDBDMzJCNCwgMHhEQUZDMTRENSwgMHhFQThGQzc0NiwKKzB4MkM4RDcxMkUsIDB4ODlBMDVGQzksIDB4OUEyNzQ2NDEsIDB4QUMyNDUwQUQsCisweDI0Mzc3ODRGLCAweDNCMUI4MEYwLCAweDBCNEEzMUZELCAweDI3N0MwMjMyLAorMHhGRERDNjgyOSwgMHgzRjNDNjA2QywgMHgwRUY2MjM1MiwgMHgzRDA3RDA0QSwKKzB4NEUwOTM5RTgsIDB4RDU5QkYxMTUsIDB4QTAyNzUyRTcsIDB4NDJCRjcxMzMsCisweDlGQTA5MzlFLCAweDY0NzY0MTA5LCAweEQ1RDAzRUJBLCAweDNENDQzM0EzLAorMHgxNzQ5QjQzNywgMHgxMzcyOThCMSwgMHg2NzdCRTM0NCwgMHhBODNDRUY3RSwKKzB4MTc4MTNBMzksIDB4QkM3MTgyM0YsIDB4MjA3MEU5QTcsIDB4Mzg3M0FFRjgsCisweDVBRjFFMjFCLCAweDFGMENDNjkyLCAweEI4RUZCMDRELCAweDFBMUNDNTE0LAorMHhBREVENkMzRCwgMHhERjM1QThENywgMHg2RDkzMjc1RSwgMHg5QzM2MjU0NSwKKzB4NjJCRjc1ODMsIDB4RkM1NkQ5OTAsIDB4MENENkEzMjQsIDB4RjEyQTc5MzksCisweDUyNTg3MDI5LCAweEQwMEQ1RjE2LCAweDUxNjIyNTU1LCAweDExNzhFODg3LAorMHg4MUU3QkNDOCwgMHg5MkJCMUMxMSwgMHgwOTczMzBFNCwgMHhDRjhDNUNBRiwKKzB4RDA3NkQ2QkMsIDB4QkEyOTI5MTgsIDB4RjgzNUE4MjksIDB4NDI4MEE1MUUsCisweDA5Q0Q3ODI3LCAweDExNTgzNDg3LCAweEI4QkEyQ0VGLCAweEQ1OThBRTkzLAorMHg5OUY0RkQ3NywgMHhFQjE1MTExMCwgMHgxNTcxQjA3NiwgMHg2M0YyMTAzQSwKKzB4NTZDNkJGNDQsIDB4OUU2M0I1NTYsIDB4RkI5ODEyMzgsIDB4NUQ4Qzk3OEIsCisweDk1MDFEOTM2LCAweDgyQTFFOTcxLCAweEU1QTRGN0UyLCAweEM2RTM3MjdBLAorMHgwMzMyOUYwNywgMHgyNDhBQ0RENiwgMHg0MzdFOTE3QiwgMHgyM0IwMkIyMCwKKzB4NzNGNzZBQTAsIDB4NzVFQTA2QzUsIDB4RDdDNjYyQjMsIDB4MjY3Nzc3RjgsCisweERDOTZCRjA2LCAweDU0MDIwMzQ2LCAweENCREYwNjlCLCAweDAzMDEzM0VDLAorMHhBN0VGMUMyRSwgMHg1Njg5NTlBQiwgMHg0RkMzMURFMCwgMHgzQTIyODkwRSwKKzB4MjgwRjg2NTIsIDB4MUJEOENCMjQsIDB4OUE4RDkyQzksIDB4NTI3MThERTEsCisweDEyMDMzRkM3LCAweEQ0ODQ5MENDLCAweDY4MUFERUUyLCAweEY5MUJGN0I4LAorMHhCODYwOUIzOCwgMHgzNENGNEJDQSwgMHg4RjEyMzI5MCwgMHgwRDBGNEZDRCwKKzB4QzRGNDMzMjMsIDB4MkZDMDRGMUMsIDB4NDY2OUI4OTAsIDB4MUU4RDJBN0YsCisweDA2NThDQUU2LCAweDU0ODlGM0EzLCAweDlDRDM2MkZFLCAweEJBNTE5MEIxLAorMHgwNkE1ODgyMCwgMHg3QTlBRjc1OSwgMHhEQzk0RTY3MiwgMHhFQjI4NEI4NSwKKzB4RjhFRkEwMjIsIDB4MzgzN0MzNzksIDB4N0M5RTlBMkEsIDB4RDJFRDk2QkMsCisweDVEMUU0QzdFLCAweDk3RjIxNjlGLCAweEZDM0MzN0MyLCAweEUwMzlFREYxLAorMHhEQkU5MzkwOSwgMHg4MUZFQUM2QiwgMHhGQ0QzODNGQywgMHgxNzBCOTFGQiwKKzB4MDVCQTMyNDMsIDB4OEZCMkFERTEsIDB4NTJBRkI5ODQsIDB4RTgyNjJFOUEsCisweDFFNzA0NjM4LCAweDg5QjhERkQ4LCAweDE4QzBDNjQxLCAweDI3NjBDN0U2LAorMHhEM0FGRjNDOSwgMHhDNEUzNTQzQiwgMHgwQzBCNzkxMCwgMHgxREVGNzc5MiwKKzB4NDgzRDcxOTQsIDB4OUFBRjU4NjQsIDB4MDg2MDc5NDcsIDB4NjI2RjBDRjMsCisweEMwRjZBNDg2LCAweEVCNDUyNUNFLCAweEE4QkJBOEY4LCAweEU0NTBEQTE0LAorMHgyREM0RDExNCwgMHhCQ0E1MjdDOSwgMHg2NjgyQUE0RCwgMHhDQkI0OEE1RiwKKzB4MUI0NzRDOTksIDB4N0Y1QjUyNkMsIDB4RUM0MzVDMEMsIDB4OUU4RDNFMUEsCisweDY3RDJFQTI5LCAweEEzQjdBRENELCAweDgzMjg1OTBFLCAweDczNDU2MDdCLAorMHhCNjA1NzU4OCwgMHgxQThCMDM0QywgMHg1QzhDQTUzNCwgMHg4MTE1REM1RiwKKzB4MTg5QzJBQkUsIDB4RjFCOTI5MjcsIDB4NzhBM0I2MkYsIDB4NEI2MjFENDksCisweERDMTc2QTY4LCAweENCRDNDMURDLCAweEQ4MjM0OEJCLCAweEVFRjA1RkE3LAorMHhDMEREM0Q4MywgMHhDMUYyQTdCRiwgMHhCMjA3OUQwMCwgMHgxNEI1NzMwRSwKKzB4NzMyMDNDRDcsIDB4QTg2NzI0MzMsIDB4QTE3MUZGRUQsIDB4OUYxODEyMDAsCisweDRFMTZBNUM4LCAweDU2RDhBQzMxLCAweDczODAzRDg2LCAweEQ0Njg1Q0E0LAorMHhFOERFOUZFMiwgMHhBMzVEMkNFOCwgMHg4MDhDRjNFMiwgMHgxOTg3MDBBRSwKKzB4MDAzNDE2M0YsIDB4NTdCQzc2RkUsIDB4MjcxQUNGOTMsIDB4QUEzQUY2RDAsCisweDM3MDAzQTdFLCAweDQ1MEI3NEY0LCAweDE1NzQwMUNCLCAweEI3OUREREE4LAorMHhENjBBQjdBNCwgMHgzQTRDODc3OSwgMHhCNjk5MEZDOCwgMHhBMTY2OEQ1QSwKKzB4MDVCNzk2NUYsIDB4NzgxNDM3NkQsIDB4RkEwRDJEOEEsIDB4RDk3QTExNDIsCisweEU4MDRERTNELCAweDQ5MzkwODlFLCAweDc4RDQwQ0FDLCAweDAxREVGNUVBLAorMHgzREQxQ0FEQSwgMHg5NjQ2NTk1NiwgMHg2MzU4Q0ZCNiwgMHhBQ0UwMkRFNSwKKzB4QjRDOUY2Q0UsIDB4RTlDOTVBRkYsIDB4NzBFQUQyOEUsIDB4NTg4MDM2OTMsCisweDg5RUY5OTcyLCAweDU4RjAyNzNGLCAweERCMTdBMjc3LCAweDBCMDgyQjk4LAorMHhBQUIxM0FCRCwgMHhFODYzODFFQywgMHhDMTg5MjRENCwgMHhFMjhENDM0OCwKKzB4QzIxODk1QUIsIDB4RTE3MDczQUQsIDB4OTQxNzUzOUIsIDB4QTA0M0U1RjUsCisweDg4RkZEMDI2LCAweEQ5NzJGMDE3LCAweEQwQzhCOEQzLCAweEIzNEYzRDY3LAorMHhDNTI1RTRCNSwgMHgwMTg5QTVBMSwgMHg1OTIyNEEzNSwgMHhBQTE4RjJENSwKKzB4RkM5RTE3MEMsIDB4MTZEMzc5NUEsIDB4MzVEQjA5RkEsIDB4MTYyNERCMUQsCisweDRBNkUwNTlGLCAweEM1Qzg4QTkzLCAweDkwNTFEMzczLCAweDRCMTJCMDlDLAorMHg0MDg4QUYzOSwgMHg3MDUzOTRGNiwgMHgzNjBGMkJBQywgMHg4QTFGMjQyMCwKKzB4NjQxRDRGQTUsIDB4QTc4Qjc4RjksIDB4QTVBNTMwMkUsIDB4NjkxRDIxMDgsCisweDdDRkI1N0ZELCAweDE4MTJGRTY4LCAweDhBMkJCNUUwLCAweEYxODFDQTE0LAorMHgxODQ2ODQ4RSwgMHhEQzA0NEY2NywgMHgxN0ZDQ0EyOCwgMHgyMUQ3QzVBQywKKzB4NEM0MzQzMkYsIDB4QzQ1N0UyNkUsIDB4QjBDOUFERDIsIDB4NzkxRUUyQjQsCisweDYyMEYyN0JFLCAweDIyOUUwQjFFLCAweDc0NkI0RkZDLCAweDAyMDM4NzM4LAorMHgxQzdCOTcxQiwgMHgwNTE5MzQzMCwgMHg4NjQ1REJENywgMHg1ODY3OEY5OCwKKzB4MTQxRTkxMkQsIDB4RDg5QzU4N0UsIDB4OUZEN0I0M0YsIDB4MjE4NTFENTYsCisweDcyNTMxMUE3LCAweDA2MDVCMUIyLCAweEMxOEJGMkI3LCAweEM2Rjc5RUE5LAorMHhCRDg0QTAxQiwgMHhDOUI3RjJEQSwgMHgwNEU0N0VFOCwgMHgxQzFBMTRGNSwKKzB4QkQ1QjRGRjEsIDB4RTE1RkJDMkUsIDB4QzRENDNGMDEsIDB4NUQzOUFENEEsCisweEJEM0JEOTgzLCAweEIyMzE0QTRCLCAweDhEQUJBNjdFLCAweEI1MjYzQjVBLAorMHg5OTEyRjI2MiwgMHg4MjY1OUM4MCwgMHhDMzYxMDE4MSwgMHgzRjIyOTAxNCwKKzB4MjY4NTUzMkYsIDB4Q0U0RUMyMTAsIDB4RjQ2QUIwOUEsIDB4RkFGQTY5QzgsCisweEQxMjkyOTQ0LCAweDJFRjg4MEQ5LCAweEQwM0FBRUFCLCAweDBFODNDNDM1LAorMHg4NDJDNDgyQywgMHhBNzA5NTFBMSwgMHgwRTRFQTA3RCwgMHhFMDMzMkQwQywKKzB4M0VBMjdFNTUsIDB4MDQ3MjE0MjUsIDB4N0M4QjU2REMsIDB4OTYzOTEzMTIsCisweEY2MDBENzhDLCAweEM4NTA1MTdDLCAweEIzRjlGMkFFLCAweDU5QTk5MzUxLAorMHg4RDZBQTgzOCwgMHhGNTg2NjcyRSwgMHhEODFGRTUyNSwgMHgzQ0VGMzFERiwKKzB4QUJEQzcwNzksIDB4NkUxQkI4RjYsIDB4NkI0NUI4N0IsIDB4OUZEMkNBQzQsCisweDY0OEUzNTdBLCAweDZDNTdEMzBCLCAweDIzNzY2QjY0LCAweDhDOEJEOUMxLAorMHg5QTI5MDAxQSwgMHgyMDZGNDdFMywgMHg1RjQyM0Q3NSwgMHgyOTNBMzJDNCwKKzB4RENDNjQzMkIsIDB4QTQyODA5NTQsIDB4NDU3NzkwQjgsIDB4MTFFODRDRUYsCisweEFCMTFEMEJGLCAweEQwNDI1OEUzLCAweEZCNDRDMENFLCAweEVEODIzMUIyLAorMHgwMjc3QTZCMiwgMHhEOEU1QzUxNywgMHhDRURGNEM4QiwgMHgxOUQ5MDE3MCwKKzB4MjA1NTU1MzIsIDB4RkNCNjEwQjksIDB4ODhENUY1QTksIDB4RDM1REM3N0UsCisweEVGNUVBNjg2LCAweEQ4NjY5NTlDLCAweEYwODg2QjU2LCAweDAwNUNGQjkwLAorMHg1ODJBRDI1NSwgMHg3MzgxMjg5RiwgMHhDMThDRUQ0RCwgMHg0NDRGMEE2QiwKKzB4OTkxN0FFNTYsIDB4NTA1QTdCQ0QsIDB4Q0JEQzkwM0IsIDB4NTFFRjBGM0MsCisweEM0RTZBRjVBLCAweEIxNDhBRDJGLCAweDYwOUExMjRBLCAweEI1REE4OUU0LAorMHgzQTY4QzdENCwgMHg5ODY5NEYwMiwgMHhFODVCMTc2NiwgMHg3NTRCQTVGRiwKKzB4MTI5NkE1OEUsIDB4Mjc3MzY4NDMsIDB4OUI2MjgwQkQsIDB4MjY4NjAzMkQsCisweEI0MjhBQzA0LCAweEIwNkRCQTVDLCAweDYyNUZFMDM0LCAweEQ0QkNCMjVFLAorMHhDOTFDNUIzQywgMHg3M0JCNzBFNSwgMHhBMjZBNDc5QSwgMHg3MzE3MzIyOSwKKzB4M0FBMTIzNUMsIDB4RTE2MTcxRDEsIDB4NDJEMEQ0MkYsIDB4RkM2MjQ3NTIsCisweEYxRjVEQ0MyLCAweDFCNkYyMEE5LCAweEZGOUQ2MjZELCAweERCRjA1MkMwLAorMHg5MEUzOEQyMywgMHhGQjcyQ0M1RSwgMHg5MTg2NTE5QywgMHhGMjMzMDA5MywKKzB4RTUyNTEzODUsIDB4QTAwOTQ5NzcsIDB4RTgzRkEwNjYsIDB4MkUzODlDRTIsCisweEQzQTYyRTcyLCAweEE5NDIyQThCLCAweEM2MUNGRDVCLCAweDFCM0E1MTZBLAorMHg1ODA4NzgwMCwgMHgzQTQ3NDYyQywgMHg1NTdEREQ4QiwgMHg5NEZEMjFENCwKKzB4RTFBRUE5NDIsIDB4NEIyQ0M1MzIsIDB4QjIxODVCMzYsIDB4RENBMTUyNTksCisweDFEMDQ0RDdELCAweDc4MTMxN0I4LCAweDQ5Q0IxM0U3LCAweERBQUZGQkM2LAorMHgzMEEwNTY0NCwgMHg3N0IwNUYzNywgMHgwNjVBNTY3QywgMHg5NDcyMUM3OSwKKzB4NDczMTZDNjAsIDB4NThBQUM3QzksIDB4NDEwMDgxQUIsIDB4N0Q0QTM2RkEsCisweENERjIzNDU1LCAweDE4NzNFRjg3LCAweDE4Njk4MkI1LCAweDdDNzhEOURBLAorMHgzNTY3RDk2NiwgMHgxMEZGNUU4RSwgMHhEQjg4RTVCMywgMHhGRjFEMzlBMSwKKzB4QjhBMzQ1QTMsIDB4N0E3MjU4RjMsIDB4OTcwNkIzQ0UsIDB4QjVBRENDMjYsCisweDQ1NjFFRjVCLCAweEIwMDJGQkY2LCAweEYzRjRDNkZBLCAweDU3RUM3NUFELAorMHhCQ0YzNzkyNCwgMHhCQzA1QjBBRCwgMHgyQUIxOURBQSwgMHgwRUJEMjVFQSwKKzB4RjMzNUQwOEMsIDB4REZGNzlFMTksIDB4REQ4NkQ0MTgsIDB4RUNFMTE5NTEsCisweEMwNkY0RDUwLCAweEZENjk4REY4LCAweEJBNjE5MkVGLCAweDM2NUEyOENFLAorMHg3NERFQzBCNywgMHhFOTcxRjY3QiwgMHhCRjg5REQ0MiwgMHgxRTY4MzM5OSwKKzB4MTY0QTcxNTgsIDB4QTFFNDg0NzUsIDB4QkUxMzlFOEUsIDB4QkRFQkE3RkUsCisweDc0RTAzQUVDLCAweDg4RUE5NjE4LCAweDlCMDA0OEMyLCAweDY4QzFERDIwLAorMHg4REM5RkM4NSwgMHgyNEI1NUUzQiwgMHg1MUMzOEJEQSwgMHgyRUNEN0IxMywKKzB4NTRENjZDODksIDB4NjlBM0VCQzEsIDB4NEI0RTRGMTMsIDB4QUQzN0I3REYsCisweDAzMEExRDhCLCAweDg1QTExNEQ5LCAweDQwM0JFNDk1LCAweEI1RTQwMzMxLAorMHgzMTZFNzMxMCwgMHhCMzZBQTQ5NCwgMHhEQkZGQ0I5QSwgMHg1QzBFNURBNSwKKzB4MDk5QkE5RTgsIDB4NjY4MjZFOUQsIDB4MEJDNTg0OUIsIDB4MUEyMENCQUIsCisweDA3NDRGQkU2LCAweDJDQjUyMDQwLCAweDhCODg1MzNGLCAweEE4QTQ0QkYxLAorMHg2MkZFQjRBOCwgMHhEQjJBQkM0RCwgMHg0NkYwQjY3NiwgMHhDQkQwNjQ3MCwKKzB4REI2RDcxRUYsIDB4NURDMzU1MUEsIDB4NzFCMzFBNUIsIDB4MDQ2RDRDN0YsCisweEMwNTFBOTk4LCAweDFFQzE5RkY5LCAweEE5RTIxRjlGLCAweDc5NTFFMDgxLAorMHg3OEJDQkE2MiwgMHg5MUI2MjNGMiwgMHg4RUY2QTgxRCwgMHgxMDIzNzU1RSwKKzB4Q0U0N0Y1QUEsIDB4MEVGMjc1MjcsIDB4RTlFNDg4RDUsIDB4RDUzRTRBMjksCisweDc4QTI3NkUxLCAweEIyMTAwNTg1LCAweDAxMjA4RTNDLCAweEEzOEJDQUZGLAorMHgzNjIyMUZCNywgMHhCM0M5MTk0RSwgMHg1MUJENzVENCwgMHg5QzhDNzNBQywKKzB4N0FDQTk5NjQsIDB4MTc4OTBDOTQsIDB4OUZEQTUxRjQsIDB4QzRGREY2ODgsCisweDJDODI0NEIyLCAweDBEODM0Qzc0LCAweDI5MDk3M0QzLCAweDdGMTM0NTUzLAorMHgyOTZEMkZDMiwgMHg0RTA4RUQyNywgMHgxQzUxRTUzRCwgMHgzRDg5MkY0OSwKKzB4OTQ1Rjc2Q0MsIDB4MkU1MzFFNjMsIDB4NzFFRTM3RTAsIDB4OUM0N0YzNDYsCisweDJEOEQ5MjBDLCAweEMzRTQ2NUJBLCAweDNBNzJEMTQyLCAweDVCNkFCODBELAorMHgzNjRDMkFFNywgMHgzQjE4Mzg5QiwgMHhCOTQ0MjQ4NCwgMHg1RDY4N0JCNSwKKzB4OTdDNjVBNEYsIDB4QzdEQkU4QkUsIDB4MEY4NDAwNjEsIDB4NUE3M0VBODksCisweENCQkREOTU0LCAweEFGRTlDQUJELCAweDA2QUJERjk1LCAweEYxMzkzMDJELAorMHgzODA0RkVBOCwgMHg3Q0U2NTQyRiwgMHhERTQ3QjhFRCwgMHhEMzRCRTUwOSwKKzB4NUVCOUM5RTEsIDB4REM1ODI1MzQsIDB4RTc3RDdGQzgsIDB4MkJFRkVEN0UsCisweDRFQTI2REZELCAweDU0NjcwQjgxLCAweDY2NUM0NTMxLCAweDVCN0E3MDIzLAorMHhBMDVEOUEyRSwgMHg3MUJEREIyRSwgMHg5RDUxRDhDMiwgMHhEOEE2NjVDQywKKzB4QTlCODdBMjIsIDB4NTgxRDI4QkYsIDB4RjlENDAzNzMsIDB4RTA0RDhGNjMsCisweDExN0I5ODQyLCAweDg4NjhCOUJFLCAweDgzOTdGQUI5LCAweEVGNUNFRDc1LAorMHhGNzBGOTBEOCwgMHhEM0RGRDNBNiwgMHgxNzc5RjU3NiwgMHgzMDU5NTIwRCwKKzB4QzM4RjRBQTksIDB4NkI3QTZEMEEsIDB4NEU3MzExMkEsIDB4NEZGOURDRUQsCisweEFFQTEzODNBLCAweEJBQjBBQTkzLCAweDQxREJDQkVELCAweDI2Njc3NUE2LAorMHg4RUUwRDVENSwgMHhCNTIyQ0I5RSwgMHhDNkU1RDBEMywgMHg4NkU0QzhGRCwKKzB4QTg5NDY0MkYsIDB4RjY5ODIxQTksIDB4ODhCNDE3OTgsIDB4NDU4NUExODgsCisweDlEMjEzMEZDLCAweEM1QjE4RTBELCAweDZCOTJDOUVFLCAweDNDOTI4OUZCLAorMHgxRjAyQ0JCNiwgMHgzMUZBODZERSwgMHgxQjIyOTVDRCwgMHg1QjREQTE5QywKKzB4MzEzNEQ4RkMsIDB4RTVFQUJDNDQsIDB4REY4QzUwOTUsIDB4RjY1NzE4ODEsCisweDFGMkZCRDYyLCAweEU1ODVGRTYxLCAweDAyMENFREY2LCAweEQ3MEFCQzgzLAorMHg1RjM3NzQ2QSwgMHg2RkRBM0JGNywgMHg1NDM0RTUwMywgMHg0NENGNjkxNSwKKzB4NTYxQjIzOTMsIDB4RUE0QTIyNTEsIDB4QTk4OEMwODAsIDB4RTQ3QjE3OTEsCisweEQzMzVDRkJFLCAweEVEQTlERUUyLCAweDRGNzBGQjIyLCAweDgzQTJDMjlGLAorMHhGNDRGQTAwMiwgMHgwNjlEMjVFQywgMHg0RDUwNDNGNSwgMHg4ODc0NjRDQSwKKzB4NjYxRDFFOUYsIDB4OThCODU2QUQsIDB4ODFBMjNGQjAsIDB4MzY5M0JENDIsCisweENFMEFFQjBCLCAweDFGNkU4MzIyLCAweENCREY1NzFCLCAweDkzNjg4OTA5LAorMHhGQTE2QTc3NCwgMHgyNTgzNDQzNywgMHhFRTc3RkE5OCwgMHg4REM2OEM2MCwKKzB4MTU1QTg3NjAsIDB4MjJCOEZDQTMsIDB4MUIxQkIwNTQsIDB4Q0EzQUZGQ0EsCisweEM4RUFDRUE0LCAweEM4NkJBREQ5LCAweDQ3Mzc3MEFCLCAweDQxRDZFMzk4LAorMHg1NjhCMzk3RCwgMHgwNjVDMEJFNSwgMHg1MUQzOEEwRCwgMHgzQkIzQTBFMSwKKzB4QkMzODZEQ0IsIDB4N0RDQkE2QjAsIDB4MTkwMDcyNTQsIDB4M0Y0RkM3MjYsCisweEYyN0RBRTg1LCAweEY3RkRBNzJBLCAweDZEMEI1QzA3LCAweDY0QTBFRDEyLAorMHhFMjZEODg3OCwgMHgyMTBFNEY2QiwgMHg2NUY5MkMwRCwgMHg0RTRFMkNBNiwKKzB4NUU0NzlENDksIDB4N0IyODcwNTAsIDB4RTlBNDgzNkMsIDB4QzNBMTExQTIsCisweDlCOTBENkZELCAweEE1RjM2MkUwLCAweEFEQzk1MjZCLCAweDc5QjczNkU5LAorMHg3MkE5QTU3QiwgMHgxODFCNEU3MCwgMHg1MjM2RjMyQSwgMHg1NTY3RTNDOSwKKzB4MjNFRkQwNjMsIDB4ODcxMTMxNjMsIDB4Q0RGNkQ0RjQsIDB4RjUzQTg3MjIsCisweEI3MENGOTQxLCAweDc1N0Y0MEM4LCAweDZBNjUyQkU3LCAweEQ3MURBNUFBLAorMHhGODdENTFDMiwgMHhCNEE2OEUxNiwgMHg3NjNEOEZFQiwgMHhCNkRFNTQzNiwKKzB4MTIxODREQ0QsIDB4MzhEMURFOTAsIDB4QjM5RTUyMDksIDB4MTYwMDQ5MkEsCisweDA3M0FFOEY1LCAweDAzNjZBQzBFLCAweDFBRDUwMTRGLCAweDM5OEUwODczLAorMHhENjUzOTI4RSwgMHgzMEI1QjRERSwgMHhBQzY4QTA2RSwgMHg4REFFRjREMywKKzB4NzZBODgwRDgsIDB4RjNCM0JDQzUsIDB4MkI2MzFGNTgsIDB4MzQwOTE0REIsCisweEI0NzcxRENDLCAweDdDOUQ0QTQzLCAweEFGREIxMTM4LCAweDAxNEI1QTgzLAorMHgwRDQ0MTg1RCwgMHgyMEM4OTU3NiwgMHg5OTRCNDM2NywgMHhBODRCRDc5MiwKKzB4QjJFMTdDQjEsIDB4MDBDRTUyMTQsIDB4RkI5M0U1NEYsIDB4MDNDQ0E3RjEsCisweDk1NkE4MkU2LCAweDIyMzI5QTcxLCAweDJBNjM0Mzc0LCAweEYxOEI3QUQ5LAorMHgxRjE2OEJDNCwgMHhDMkNCMUVEQywgMHg4RTBBRjZDRCwgMHgyMTFBRjIyQSwKKzB4QUI1REEzNzQsIDB4NjNGMUYyNUUsIDB4RUM1OEQ0Q0MsIDB4NDhDNjVDNDYsCisweDVBN0Y3NTc0LCAweDdCQTYwMDQ3LCAweDI3OUVGMjk5LCAweEUwQjc3RjQ4LAorMHg2NDdBMDNDMywgMHhBRTdDNEQ4RiwgMHhGNjUxNDlEMCwgMHhBQzlFRjIyOCwKKzB4Q0Q5MEIxQ0QsIDB4Q0VFREE1NEMsIDB4RDhGRDBBNkEsIDB4OEQ3QzIyOTEsCisweEIzOEVGNkMxLCAweDdGMzhFNjc2LCAweERBREQwQThGLCAweDExMjU3MTNDLAorMHhBQTc4QTI5OSwgMHg1NDAzM0YyMCwgMHgxOTlDNzZDNSwgMHhDQUY4MkExNywKKzB4MTZGMkVFOEIsIDB4MjAwNzFEMEYsIDB4MkNBMDAwRjgsIDB4MDE3OEEyNEIsCisweDAwMjlFRTQ2LCAweEE5RDhDNzM4LCAweDEyM0QyQkJELCAweEVGN0NBQzUyLAorMHhCRDI0MTg2OSwgMHg0MzVGOEZGNywgMHhCNTczQTE5MCwgMHg0MDJCRkIyRiwKKzB4RkRBMzA5N0MsIDB4RjM3NjU4ODksIDB4NjhFMkM3RDUsIDB4NEMyNkY4NTgsCisweEQ2ODE0RDFGLCAweDZCMDQzQzdCLCAweDE3M0RCMDkxLCAweDk1MTI2QzdDLAorMHgwRkU4RTFCRSwgMHhGREVCMjMzQywgMHhCOTc5QjBDQiwgMHgwMEUwMDY1OSwKKzB4MTk5NTJFNTIsIDB4QTA5NzZGN0UsIDB4MDJGQjQ2MkMsIDB4Nzk4ODE1QzgsCisweEEyNTA0RUZFLCAweDBGNDgxMUFELCAweEJBOEYxMjJFLCAweDVFRTU4NjRGLAorMHhEMzlCNjc5OSwgMHg1MzE5RjZBMywgMHhGNkE2NjY4NSwgMHg5ODhEMTA2RiwKKzB4N0FCQTUyMjAsIDB4MDMyMDM4NEIsIDB4NERFNDhDNzksIDB4RjVDQjM2RTYsCisweDJCMzMyNzBGLCAweEZGNEU2OTY1LCAweEQ0RDg0M0Q1LCAweDdFRUU4NjFDLAorMHhBOTZBRTVFRSwgMHgzMTBFNTIxNSwgMHg2RDIwMDY4RSwgMHhCMTQ5QUU4QiwKKzB4MDk5N0Q5RUYsIDB4NTA0M0ZGRkEsIDB4MDUxNkUyQjYsIDB4M0ZDQ0RBMzIsCisweDhFNjA0QTA0LCAweDIzMDEyNzc4LCAweDk0NDRBNDc0LCAweEI3RjVEQzI0LAorMHgzQTU4RTZGQiwgMHgxN0I3NTlGQiwgMHhGMjlDMUVFNywgMHg4ODkzRDJEMSwKKzB4QzZDRDIzNUIsIDB4QUFCMENCQ0UsIDB4MkQ4NDQ3NEMsIDB4OEEwQkUwMjcsCisweEZEQjg3RkI1LCAweEU2QjUwN0JELCAweDE5QjQxOTI3LCAweDc4M0ZGNERBLAorMHg0ODVBMUQ1RCwgMHg4RUQyODVDMiwgMHgyNUFGQzRDNSwgMHhCRjBENjYyQiwKKzB4QzQyMzg1MzIsIDB4NDMzOUZDQ0YsIDB4MTRBNzg0QjYsIDB4NzE2NjU4MTksCisweEVENzZFNDczLCAweDVGMUJBRTlFLCAweEQwQUVDMTdCLCAweDRDRTc4ODE0LAorMHhEMzYwOUY2MSwgMHhENEU0OUVCMCwgMHhFNEUzRUZEQSwgMHg5QjdDQUQxRCwKKzB4RUYwMUFCQjcsIDB4RDEzN0JFRTksIDB4RUU4N0E4MUQsIDB4RDRCMjA0RkYsCisweDAwQjI1NzM3LCAweDI3NzBGQkQxLCAweDE3NEFGRjdGLCAweDBBNzdBMjFDLAorMHhGMUIzNzBFNywgMHg5QzA5M0NCMCwgMHgwODBDMUZGQSwgMHg4M0NFOTJEOSwKKzB4MTcwNzQ3MEMsIDB4MzMwMzQ3OUYsIDB4MjVGMUI2QUYsIDB4RjQwRUVCN0YsCisweEI5OEExNjc3LCAweEE1NEExQkEyLCAweDQzQjQxNDRBLCAweDJGMDkyQTM1LAorMHgzMzI4NkE3NywgMHhBMEFCOUM5MywgMHg0RjhENzBEQywgMHgzQTQ3QkY2RiwKKzB4QjYyMDlBQjUsIDB4QTRDOTQ1NTcsIDB4NUU3NTcwNTUsIDB4NzA2RUFEOUYsCisweDQ2N0JDMDJBLCAweDY0NzJBODU3LCAweDQyMDU1QzU3LCAweDY2RjJCQTYwLAorMHgzM0MwNTM2RiwgMHgzMjQwQkZCRCwgMHgzREQ3NEU2QiwgMHgxRjU4QTU1MiwKKzB4ODIyRTk1NzcsIDB4RjQ5QkZFNzcsIDB4NTQ5MERDNkQsIDB4MUQzMkJCQTAsCisweDFDMzBCMDcyLCAweDc4QTRBNUMwLCAweDFFRTg4QTU3LCAweDk3Q0FDM0M4LAorMHg5OTEyODYxRiwgMHhDOTE2QkJBRiwgMHhGQzNBN0YwRSwgMHhDQTVFMUYzQSwKKzB4NjMwRjA5Q0QsIDB4RjZDOEMyMTAsIDB4RjBBMTJBNzIsIDB4RjMxNDg2MTksCisweERGMTY3MkUxLCAweEZDRTVDMzkwLCAweDI5Q0FFNTU0LCAweEU5ODRBNDVDLAorMHg4QTFGMEEzQSwgMHg2QTAyQzcwNywgMHg4Q0ZCM0VENiwgMHhDMEE3NDFCRCwKKzB4N0E4NzFGRTUsIDB4OTEwMjFBNjksIDB4NTA1RkIwNUEsIDB4OEY4NTIyN0IsCisweEMzMDBBQ0YxLCAweDBBMUIyMDFCLCAweDIyNDYxNEIyLCAweDU0QTIzNTc2LAorMHg1MzYwQTVCQSwgMHhEQ0QyM0EzMSwgMHhGOThERjYzOCwgMHg3OUZGNzlENywKKzB4RUFDOEVBQzMsIDB4NEQyMkM2NUQsIDB4REZGQkYxRDksIDB4NTVGRDg4NDgsCisweDRCRkQyMzQ3LCAweEUyQTA4Mjg3LCAweEU2QTQ4ODI0LCAweDgwNjI1RUE5LAorMHg3MUFCM0Y3RSwgMHg5OUI4NERFNSwgMHg2NTEyQURCRSwgMHhGQkYyNEM0NywKKzB4M0VFRjI1NjQsIDB4MjNERjlGMUIsIDB4MjRCRTUxOTksIDB4REVERDcyRDUsCisweEEyRkUwNjNCLCAweDRGRTUyMEIxLCAweDlFNEU3QkJFLCAweEQ2MTVCREJFLAorMHhDMTRFODE4NCwgMHg0MEY4NkZCMSwgMHhENDAzQTY1QSwgMHhDNUFGNjM4NiwKKzB4NDEyRjg0MzQsIDB4NkQ2MDEyQjAsIDB4NEVDNTcxMDcsIDB4M0Y3NkFGMTksCisweDU0QTMwNUJELCAweEVBOUM0RUIyLCAweDU4NEUwMTc2LCAweDIwNzU5ODA1LAorMHgxQTE2Qzg0QSwgMHg1MEJCMTBEQiwgMHhFNjEwQUY0NSwgMHg5OENGMUVBMCwKKzB4M0Y4Qzc3NTYsIDB4RjkwNTZCRTAsIDB4QkFBNjZCN0QsIDB4RjcwNzZEQ0YsCisweDY3RjE5OTRELCAweDkyQkZFQjYyLCAweDg2RkJERTE3LCAweDM4OURCMzExLAorMHgyQTE3MUY1QSwgMHhFMTQ4OThCMSwgMHg0RDExNzIzRiwgMHgyOTg4OTA2MiwKKzB4Q0JGM0RENzksIDB4MkI3NDY4RkMsIDB4NEZCOTM3NzAsIDB4QzVGQ0VGRTgsCisweDhGRUU2Njc4LCAweDlGNEFCQTlDLCAweDZBNkIyM0UxLCAweEZFQTcwNzdGLAorMHhDODM1RjczNCwgMHhDQTY3ODA3QywgMHgxQkZCRUI0OSwgMHhCOEIxRTg0MiwKKzB4NkE4NTA2MjMsIDB4MDAxQzFFOEQsIDB4NzgyQUMwMUUsIDB4QTI4QTcyRDgsCisweDZDRDY2RkMxLCAweDc3RUY2RjEzLCAweEZGNDBEN0NGLCAweDRBMTYzREZCLAorMHhEQjIxQUE4OSwgMHgyOUQwM0E5RSwgMHgzQTREMUQ1NywgMHg3QTg5Q0RDOSwKKzB4QzU2MjNFMTAsIDB4OEE0NDQ3OTksIDB4MUY2MjBERjQsIDB4RkY4NzY3NTgsCisweEM5REVFRjJFLCAweDdGODY5MTFFLCAweEUzMTk2MDkzLCAweEEwMEVCNDIyLAorMHhDREIxNzQzRiwgMHg0QUFEMTk4OCwgMHg3MDE2NzcwMCwgMHg3MDU5NUM1RiwKKzB4OEU2NDgwMTMsIDB4NDAxRDg3NzAsIDB4Qzc2MkYwRTcsIDB4REI3NzY5MjYsCisweDJCREM1NUIzLCAweDhGNEFEMkMxLCAweDFBMkVFQjUwLCAweEJENEJGMkE0LAorMHhBNDNGRkU5MCwgMHg3NTI5MzVFNywgMHhCMDJDNzgwMSwgMHhERDRDRDNEQiwKKzB4MzgxNUMzOTQsIDB4QUY0Mjc2OTUsIDB4NzQ1NUE4RjksIDB4QzQ0NEM3RUMsCisweDlCQzlCMkM1LCAweDA4NDIzQkE3LCAweDVEOTFBREQ4LCAweDU5RDg2NkRCLAorMHgwQUQzMjI1OCwgMHg3QkMzOTdGNiwgMHgwRUY3REI1OSwgMHhDMTAzNDMyMCwKKzB4NzkwNzM0MDYsIDB4OTkxQTEyQjksIDB4OUQ2Nzc2QTAsIDB4NjM0OEE1RUIsCisweEJEOThDREM0LCAweDgxQTZDNUM1LCAweDc2QTNBQkE2LCAweEZBOUNERjc3LAorMHg5Nzc3MkI1OSwgMHhEOTg3RTQyQiwgMHhBNEI4OTNENCwgMHg2MUY3OEUzOCwKKzB4ODI1Njc2OTEsIDB4Q0I5MUNENTgsIDB4RUVGQTY5QUUsIDB4RjdENTExNzgsCisweEE0MzZDNTc4LCAweDk5RTg2RTA4LCAweEE4QzNCMTZCLCAweEQ2MDkwNTRGLAorMHgxRTBBRENFOCwgMHg1REY2RUYyMCwgMHhFQjNDQzQ1QiwgMHg5RkFFQTI0RiwKKzB4OTdGNTdGMTksIDB4NjZFMjcxM0YsIDB4NDJBNDIzQzMsIDB4MkEyMUIxN0MsCisweDZBNEM2QjQwLCAweEZBMEY0RjJCLCAweEQxRjNGNjRBLCAweEQwQUFGQTUwLAorMHg3NjdEM0FDMiwgMHg4MzdFNjI2RCwgMHgzQjIxMjc5QywgMHhDQUUxODg1NSwKKzB4RkE4Q0EzODUsIDB4QTkxQkRFNDUsIDB4MUE5NTMzMjcsIDB4NzMzOTQ4Q0MsCisweDE1OEI4Q0QyLCAweDkwNEFDNDNELCAweEE2QkM4RjgyLCAweDU1RjAyN0RBLAorMHg5NUI2QkIzMiwgMHg5MjY1RkY4MCwgMHg4RUVGMEQyNCwgMHgyOEY2Nzk2RSwKKzB4MUQ3MzY3MDAsIDB4QjYyMUQ0RDYsIDB4QUIyRjFBNEEsIDB4RUNEN0RCODMsCisweDM1Q0FENDE5LCAweDYwNjA0OTE3LCAweDVERTUxMzM1LCAweEEzRDdFMTIyLAorMHg2ODVEMDRENCwgMHg0OTQ3MzlENCwgMHgwMDYwNzIyQywgMHg1OTE0OTcxOCwKKzB4MDNDOUYxNDQsIDB4NDMzMjg4MTgsIDB4QkIxQUUxODksIDB4Q0E3QjkyNTAsCisweEM4MzU2NjZELCAweDgzOTUwMjIwLCAweEQ3NzQ0MDVGLCAweEY2RjRGQ0NFLAorMHgwRTM4Nzk0RCwgMHhBRjE4NEE3RSwgMHhFRjY2RTE1QiwgMHhBMEMyQTc0RiwKKzB4ODc2MTEyRDUsIDB4N0Q2OEM5Q0YsIDB4ODkwMjAxMUMsIDB4NkFCMEUxMjgsCisweDJBNTE1NTIwLCAweEE5OUQxREEwLCAweDlFQUNFQjRELCAweEI2NjlBQThGLAorMHg2Rjk2RENFMiwgMHhDRkVCNUNERiwgMHg0NkVCMzZCRCwgMHhFRERGODMxNywKKzB4NEZBMzBDM0UsIDB4OTU0MUE4QTEsIDB4QTVGNzU1MzMsIDB4RUZFMUZFRjYsCisweDdGMjFCNDgxLCAweERBMTFENUVBLCAweDY0NjQyMDY5LCAweDA4M0QyMTM3LAorMHhERjUwODcyNiwgMHg4RjZDQ0M0QiwgMHhDNTQxMkQwQSwgMHg2QTlGNkJFQSwKKzB4M0UzQ0M1NEYsIDB4MDc4QkJCMUUsIDB4QTYwNDc0NjgsIDB4RjFGQTM5QzIsCisweDI2MTQzNDM1LCAweDkwMTMyRUIzLCAweDQyMTY1ODBDLCAweEY2NzczQjhDLAorMHhBNkIxODhCRiwgMHhFM0I0OTUyMywgMHg4OUU0NTYzRiwgMHhEMEIxNjUzOCwKKzB4MkQ5MDc5RkQsIDB4NjlBQkRFMzYsIDB4NjY5QUM1RUIsIDB4RDA2MThERDksCisweDUwODBCRkVGLCAweEFEQzA1NkQ2LCAweDcyNDAyQzlDLCAweDBBRTc5RTA3LAorMHg4RDZERjQ4RSwgMHgwNTAyODM3RSwgMHg3OUJBMTdBRCwgMHhFNDg3MUM4OSwKKzB4QzQ1NTRDRDUsIDB4MjNGQ0IyQTQsIDB4NjQ2RkE5OTksIDB4MjEyQTlEQjgsCisweEJEMjNERjBBLCAweDg5MEI1RkU2LCAweEI1RDAzMjkyLCAweDlGQTNGRDU5LAorMHhENjEyRjhCMSwgMHg2MTEzNjVGQiwgMHg3RTdDOUZBQiwgMHgwMjQxOTREMiwKKzB4NDZDMkM2MTcsIDB4QUVCMEZBRDksIDB4QUU1RDNBN0UsIDB4RUE4QjBBQkIsCisweDc2MDczMEE0LCAweDUwNDQzRTc2LCAweEVDQTY0MzQxLCAweDUzOEU1MjU2LAorMHg4QTg1MDVGNSwgMHhFMEU0REMyOSwgMHgxMDVEQzU2NCwgMHhDNzNEOTNEOSwKKzB4RTNGMjdDOTAsIDB4OENDMDFGQzgsIDB4NDAwRDBGNzYsIDB4RENEMDExMzAsCisweDFFMzQxNkQ0LCAweDRDNjEyRTAzLCAweDBCRkU3QTVDLCAweEZEQjE1MzM0LAorMHg1MzI2QTc3RiwgMHg5OTU0OUJEQSwgMHhEREU5MEJBQiwgMHg5MjBCRDg3MiwKKzB4QzRCNEY1REYsIDB4N0IzOUJBQzIsIDB4Nzc3QzY2OTQsIDB4QjQ5NzExMDMsCisweDlFNzgwNkExLCAweEQzMTQxRjJELCAweDJCNDBCQUQwLCAweDc0QUYyNDhGLAorMHhEMUFFRUQ0MywgMHgyRjQ1MzczNiwgMHgxODgwMTA0RSwgMHhGOUNENTAyRiwKKzB4NzY5MUZFNTksIDB4MzlDM0ZFQzcsIDB4NzJFQTdCRjIsIDB4MEM5NEJBQjUsCisweDM1RDZGNTA5LCAweEFFODZBQzk2LCAweDA2MjRDMTgxLCAweEE2OURGNjk5LAorMHg1OTkxRkNFMywgMHhBQjIwRDRGMSwgMHhGMzBGMUJDOSwgMHhCMDk0Q0Y2MiwKKzB4QTNCNUE3MzIsIDB4M0JDOEMzMkYsIDB4RTc3MTAzNzAsIDB4NDI5QThEOTYsCisweEQ4OTEzQTQyLCAweENGQkQwRTRGLCAweDcxMEI3MDc4LCAweEM2NTAxRTkzLAorMHgyNDEyMjRBRiwgMHg5NzhEMjMyMCwgMHg4RUYxMDY0QiwgMHgyNzNGQUUwNywKKzB4MzE2RUMwMkMsIDB4QjNDMTZDMEIsIDB4ODI0OUMyNDUsIDB4MjFBRDExQ0IsCisweDYyNjVGRTU3LCAweEE5RjFENUZDLCAweDBCNTJGMUNELCAweDAzODFEOTgzLAorMHgyOTMxRDZCMSwgMHhEMTI2Q0Q5NCwgMHg2OUQ5NTE5NywgMHg3Q0ZCNkFEMCwKKzB4NDZFNkQ1MEQsIDB4RTYwQkNCRDIsIDB4NzJGQkI0MzYsIDB4Qzk3MUE0Q0EsCisweEE1ODBCOUI5LCAweEJDODIzNTE0LCAweDVEMTVBODQwLCAweDg3QTkxNjIyLAorMHg2MzQ5MEQxMywgMHgyNzcxODlBOCwgMHgyMkNBMkVEQywgMHgxQzU2NDU2RCwKKzB4MUI1RUI4MzYsIDB4RDhCQkYyRUIsIDB4MjBGNTZERkIsIDB4OTkzMjFFNEIsCisweDkyMzhCNzgzLCAweEU1RTVEMDg1LCAweEM4MURBQTExLCAweEVGOEREMDMyLAorMHhDRUMyODY0NSwgMHhGQzQwQUFBNSwgMHhCRkE1RkM2OCwgMHgxQzJDRjdDNywKKzB4QzBERkQxOTQsIDB4NUFCNzMwREEsIDB4RTNGQjU2QTksIDB4QTBBRDAwRTksCisweEI3QkEyRTJFLCAweDU3OUM4NzIyLCAweDA0QUEwN0ZELCAweEY1NUM2QzVDLAorMHhFNTZDRDZERCwgMHhBN0RBNTEwMCwgMHgyQTZCQTFFNSwgMHg5QjdFNTEwNCwKKzB4ODE0MTA0MjAsIDB4REM2MTMwQTgsIDB4M0VDODkzNUIsIDB4Q0MyRUM3ODIsCisweDE0MjM0NEVGLCAweEYwMTZFMENBLCAweEEzQUNGQThFLCAweDAxOUE3MDA5LAorMHhBMERBRUM1RCwgMHhGQTUwMzU2NSwgMHhDOTA3Nzk0RSwgMHg3N0FBNEU2OSwKKzB4QjQ1QjdFNTQsIDB4OTI5QTA1NkEsIDB4NDZBQTRBRTEsIDB4NTVFNTZFREYsCisweEZERDlENzI2LCAweDM1NzQ0RDVDLCAweEQ2ODU0NzAwLCAweDlBNkUxRUVFLAorMHgwQjAwRjZGQiwgMHg2QkU2NUJGQiwgMHg5Q0Y5OERFMCwgMHhEODBBQ0U2NiwKKzB4MUU1MzAwRTQsIDB4NzQ1MzM4REQsIDB4NENCOTI1REUsIDB4QjM2OUIwRDQsCisweDdBNTNBNjA2LCAweEQyQjk2RTU0LCAweDg4Rjk2QjMwLCAweEI3MkMzRTE5LAorMHhDMkE0MTE3NywgMHg2MjA2Rjg3OSwgMHhDMUY2Q0Q3OCwgMHg4NzlEQTc0RiwKKzB4NzYzRjk0MTcsIDB4RDEwOUI3NzksIDB4NkE1OEIzNEMsIDB4RENEN0MyMUEsCisweDFCMEEwMTU0LCAweDQ1RUUzQTlDLCAweDYyQzYwMTYxLCAweDc5RTQ3MDIwLAorMHg0MjI1MEEzOSwgMHg5RTJDMkM1OSwgMHhDRTRGNjIwNiwgMHhDMjk3MDM4NiwKKzB4OTgzQ0MyQzMsIDB4MERBRjBBODUsIDB4Mzg4NjI2REEsIDB4MDZBNTZEMjcsCisweDkyMjMyMDNBLCAweDk2RTAxNDhDLCAweDIyRjBEMDUyLCAweEQ1RjFBQTg4LAorMHgzOTRCQzhCOSwgMHgwM0NGNThGQSwgMHhDMEIxMDczQywgMHhDMTZCMzVDNywKKzB4N0I3Q0Y5RjgsIDB4MkUzQTI0QTUsIDB4QTE5MDg5QzksIDB4NDIyM0ZBRTksCisweDc3NTFEOTc3LCAweDgwMkU3MDYyLCAweDZEMzY1MUVGLCAweDM5RTlCNTJFLAorMHg5NDZEMDdGOCwgMHg4RTJFQUVCNywgMHhGOTI3OUE2NSwgMHgxNERFRTkxMSwKKzB4OEI5MkExNDksIDB4OTYxMTc1NkUsIDB4MDY3REQyMkQsIDB4NTk5MDc5NjcsCisweEIzNDE3RTNDLCAweDNCNzJBQjdBLCAweDgyNUQ4N0M3LCAweENFNUZBODUyLAorMHg1RDg4QzVGOCwgMHhFNzkyQkY2NiwgMHgyOERCM0E0QSwgMHgxMThDQTNBMiwKKzB4Q0M4NjI4NEUsIDB4QTBBQzRBRTgsIDB4MzMzOTRCNzAsIDB4OTc0Rjk2QzIsCisweDg2QUREM0I1LCAweEM4NzI5NUI5LCAweDE0NDdEMjZGLCAweEM5RUNBRTgwLAorMHgxMENBMDFENywgMHhFMDRFQ0M2OCwgMHhBRTU2NTk3RSwgMHhBQUExMjQ4QywKKzB4ODFDMzU0NjAsIDB4MDA4N0NBOTMsIDB4OTQzQUFCQTIsIDB4MEFGQ0JGQUEsCisweEVBNzdENUFCLCAweDAyMEQzNkQ2LCAweEYxQ0NCQkI2LCAweDhERjE0MjZGLAorMHhBRTcyNkQ5NiwgMHhBNkU0QzkxNSwgMHg1OEYxNUY5MSwgMHg1QjY5NkQ2RiwKKzB4MDAwNDJCMzAsIDB4QzZBQzkwQzMsIDB4QkQ4RTAxODcsIDB4RTczRUQyRTIsCisweENFRTY0Q0Y2LCAweDQ4QjU2NDM2LCAweEEzMzk5NENBLCAweEIzRTNCN0FCLAorMHgwNjBENUUxNCwgMHhDMUIxNzZDNiwgMHg0QTc2QzM5MSwgMHhEN0M4REIxRCwKKzB4MzMzRTQ5OTgsIDB4QzIwQkFDNEYsIDB4NTIzQkUzRTAsIDB4MjM3RTg3QkMsCisweEU2Q0RCRUMwLCAweEM1MDZGMTlDLCAweDI2MkMwMDM5LCAweDdGODVBNEFDLAorMHg0NjE2MDY5MywgMHgyRUExQkMzNiwgMHg0Q0FDMERGMiwgMHgwMDY2QjgzRiwKKzB4QkNCQzc3OEQsIDB4N0Y0QUI1MDcsIDB4OTlDQURCMkYsIDB4Qzk1NTIwRDAsCisweEM1Q0JGMDY3LCAweDkwM0VDRDY4LCAweEY1RDdCMEZDLCAweDA4MTk4QzhGLAorMHhBMTc4NzlFQywgMHgxOEMyNzIzRCwgMHg1QTRENkQzNywgMHgwODAxOThCNiwKKzB4MzUyNTE4NkMsIDB4RUY4QkUxNDQsIDB4NDRCMDU4NTEsIDB4MjhCNTAyNUEsCisweDBGREYwODVELCAweERFQjFGMjQ5LCAweEE3QzAwRjQyLCAweDc2MTRBNzM1LAorMHgzQkVCRjQ2NywgMHg3ODcxRDMwNSwgMHhENEY2MzgwOSwgMHg5RDA0NDA3OSwKKzB4RTU4NUQzRDYsIDB4QTg5OTUyRjMsIDB4RjQyQzJCOEUsIDB4MDQxNzlEQTQsCisweDAwQTZDRTg3LCAweDk2Q0E5MkI4LCAweDlERjJCMTU2LCAweDNFQ0YxOEJDLAorMHhERTI1MDlDRiwgMHg1Q0Q4NUZDQSwgMHhGOEE3Q0VFRiwgMHhDQjdEQzI1RSwKKzB4RjI4NDc0NzQsIDB4MzVCNTAxRDEsIDB4MTM3QkJCM0UsIDB4NDUxRTFCQjksCisweEQzNjBEODExLCAweDc5MkIzNDY0LCAweDRCRjg5QTgxLCAweEE3RTlDNDUwLAorMHg2MjhCQ0IwQywgMHgyQUY3MDM3RCwgMHhBNDVGNjI4RSwgMHhGMEVDODc1RCwKKzB4OUNFMzY3N0QsIDB4MkNEMEVBNTksIDB4QTUwQTAyMTcsIDB4OEJBNDVERDcsCisweDE3MzVBQ0YxLCAweDU4MDRDNEQ5LCAweEU2MTlCMzUyLCAweDk0OEY0NEE4LAorMHhBOUJGNUM3RiwgMHg2MTRENEY2QywgMHg2RDlGQ0E3OSwgMHgyOTcxN0IwQywKKzB4NTBCRjJENUMsIDB4RDU4NDdCNTIsIDB4MEQ0RkFBQTUsIDB4MUFBQkNBNUQsCisweDc3OTM5OUUwLCAweDU4QTkwQ0Q2LCAweDM3RUMyNjE1LCAweDYxQjY4QzA3LAorMHhDNDlGNEFFRSwgMHhGQUM0RDg5NywgMHg5QzY4Q0M2RCwgMHhCQjMzNTJGNiwKKzB4RjkzMzQzNkQsIDB4RDMxMDA3OEUsIDB4MkZCRkExN0EsIDB4M0Q4MzlDNEMsCisweDE4NkU2OUVGLCAweENCRTdDQzZBLCAweDc0MzQyMzFBLCAweDgwRjgxMzBCLAorMHg1OENEN0VBMiwgMHgyRTQ2RDcxNCwgMHgzNjcyODZFMiwgMHhBNkUyMDQ0RCwKKzB4QzJBQkM1MEEsIDB4NkZFREM5QzQsIDB4RTJGMjZGMDMsIDB4M0IwMzBENTIsCisweDM2NzREOEU3LCAweDkwOTZERjc4LCAweDkwOTAyODkyLCAweDQ0QTMyMTkwLAorMHhEMDhEMjY0OSwgMHhFRkUwRUQwQSwgMHhDRTFCRjRFOSwgMHg2MkMxOTc1MywKKzB4RkJGM0QxQTgsIDB4RDRBQTUzOTAsIDB4NEIzMkU3N0YsIDB4OTg5NEYwNUUsCisweDQxQjlEQkJFLCAweEU5QjA5NTYxLCAweDQ2Qzg4M0EwLCAweEFERDVENjBGLAorMHg2OUNFNUJCRSwgMHhGRDI5Q0NGMSwgMHgyRjIwOTM3MSwgMHg0QzY3MTZFOSwKKzB4MzFFOUEwOUYsIDB4MDQwODk3OTUsIDB4QjlFRjkwMjUsIDB4OTdDNjI2N0QsCisweDYzODIzMTUwLCAweDNBQjM0NkJBLCAweEVEM0UwNTc5LCAweDg1RkM3MDYyLAorMHgzN0IzNTc2MSwgMHg0QTMyQjZDRCwgMHhDMzhFQjQ3OSwgMHgyMDM2NDJDQywKKzB4NTY4RkNBRDcsIDB4NjdEOTJCNUQsIDB4RTUxQjhDM0UsIDB4MDIxMDQwNzgsCisweDAyNkJDNjA3LCAweDVBMDZDREE3LCAweEUyNzQzNUQwLCAweEM3QzIwQ0U3LAorMHhGRUE3NDAyMiwgMHg3NzMxMDA3NiwgMHgzNUM2Rjk1MywgMHhFMUIxOTlDNSwKKzB4MjYyRjEzOUIsIDB4RkQyRkUyQzcsIDB4M0VFRTAyRUIsIDB4OTE1QTg3M0YsCisweDJERTRBQjhFLCAweDI0MjFEQzE1LCAweEQxREQwRDlFLCAweERFMDJCNUFELAorMHgxNTFDNzZDRiwgMHg3OThCOTBCNywgMHg4MkVEREY0QywgMHg3OTVFMThDRiwKKzB4RjA5Q0VDNUEsIDB4MDcwQURGOEYsIDB4Q0RDRjUyMzIsIDB4RDQ5OEQ0M0MsCisweEI0RkMyNjYyLCAweDI1Njc4RTU0LCAweDVEMjAwNDgyLCAweEMzMUYyMUM5LAorMHgzNUU1QUYyOSwgMHg4Q0MwRTYwMywgMHg5OTUzNTFBRCwgMHhEOEVCNTRGNiwKKzB4NTY0RTM1RDksIDB4MEMxM0UzMjEsIDB4MzRDRkEzM0QsIDB4MzNEMUU1RjksCisweDJFQUM5NzQ4LCAweEZGQjk1MEQ2LCAweDIwMzIyMDZGLCAweDRGODcxQUUzLAorMHhCRDQ2NEM2MSwgMHgwNjM1NkVBMCwgMHhBMTVBMjkwRCwgMHhBNzg0NTZEMCwKKzB4RDJGNEVFODgsIDB4NEQ4MzU5MDgsIDB4MTVEQzg3QjMsIDB4NzlFREI2QzMsCisweEFFQUYwRjlFLCAweDVDM0U3RUY5LCAweDYzOUEwOTlFLCAweEQzNzVEOERBLAorMHhCNzE4NTEwQiwgMHgwOTBERjk2NSwgMHg5QzhBMzYyRSwgMHgyNUFEMTBCQiwKKzB4RjlBNDJCRTksIDB4OEFERTNERjAsIDB4NTUyNzQyNEUsIDB4MzAxRjBEMEYsCisweDJGNjkxQzlBLCAweDUzNEZFMUZDLCAweDdENDA2MDE2LCAweEY5ODgyMEEyLAorMHg0RDIwNDg3MSwgMHhFRDE0NTE3MywgMHhENjdFQ0U5QSwgMHgzNUY5Rjk5MCwKKzB4OEVENEQ3ODcsIDB4MUYzRjQ2RTEsIDB4NUE2OEYxNzEsIDB4OUE5RDI4QjAsCisweEU3MjZCRDVDLCAweDgxMTkyMjhELCAweDBBREJBNEQyLCAweEVBMjQzMjA0LAorMHhFNTIzQzBENiwgMHgyNjFFMzY2NCwgMHhCMkQxMjExQywgMHhCNEQ5MjkzQSwKKzB4OUM4OUQ5MjQsIDB4MTVBNkEzQTksIDB4MEQ4QzZDNjYsIDB4RUMwNEFEMzYsCisweDBDREYwRjk4LCAweDkyNjJDN0RGLCAweDhFRTBFMDlCLCAweDZCOTI5RUU5LAorMHhEQ0M3MTNCQywgMHg3NUZEMzRGRiwgMHgyNzg0RTY5NCwgMHgyM0MyMzA0NCwKKzB4QjdCMDRGMDksIDB4RjEwQjc1M0UsIDB4MkVDNzc0REEsIDB4NDcwQkU3MkUsCisweDA1NDUxMEU5LCAweDlDN0RERjEwLCAweDE0NjZDMjc3LCAweDlGNTJGNDkzLAorMHg3RjI5ODYwOCwgMHhGMUJBMTBEMywgMHg4ODQ3QTMxOSwgMHhFRThBNjNDQSwKKzB4OEU2NEIzNEUsIDB4RUJCNjY5MzMsIDB4NTc1QURCMjQsIDB4MDQxQkZENzYsCisweDcyN0VEMzY0LCAweDAwRjRBMDA4LCAweDhGNUVEQTkyLCAweDIxNDc3NjM3LAorMHgwQjM2MDYxNywgMHg1NkRDODk3OCwgMHgyN0Y4ODk0NCwgMHg2OUI3OTlFRiwKKzB4RUExRTk0M0IsIDB4NkZERDYwQjAsIDB4Q0UyQUQ4OUYsIDB4Qjk4Q0NGNDMsCisweDJBMzc5NkJGLCAweDRERDAyNTM1LCAweEM2QjUyNEVBLCAweDZCMTczMzQxLAorMHhEQ0UwQTQ1NywgMHg5MTc3MDY0NiwgMHg1N0E4RDEzOCwgMHhGQzIxODMzMSwKKzB4REM2QjcxMkQsIDB4MTRDMEIzQjksIDB4MzBDQTA5QUQsIDB4NzU5RUI5NDIsCisweEJDOTYzNEFCLCAweDhGOTJBN0U1LCAweEY3Rjg1QjUzLCAweDZDODMxQjNCLAorMHg1NkE3NUIxOCwgMHg0M0RCOUYxQywgMHhGODFGQzIxMiwgMHhCOEVCOTAyNiwKKzB4NzhBNzRCNTEsIDB4ODcwNjU1RTMsIDB4QTE3QjUzNkQsIDB4QkRFODY2Q0YsCisweEZDNjA5RjExLCAweEYzNEE3MDE2LCAweDdDNEZENERELCAweDIzNjMxMkY2LAorMHhCNTA1MjBBOCwgMHg0QkVFQTJDMywgMHgyQjY5MEJBMywgMHgxODcwMTY2NywKKzB4QkQ3OTFGQTksIDB4MjM2RDM2Q0YsIDB4NDlFNTc2Q0MsIDB4MzE2QTc3RTEsCisweDkzRTlCMEJGLCAweDUyNzE1NjAzLCAweDgzQjlBQUYyLCAweDBGOEYyQTgwLAorMHhBODdGNzY0QSwgMHhEMjA3OUJFQiwgMHg0OEEyNEFCNiwgMHhBQzM3MDk1MCwKKzB4MzA3N0ZCMkYsIDB4NEJBRkYzRjUsIDB4MUE3OTkyNkQsIDB4OEIzNjk5NTYsCisweEFENzhGNzM5LCAweEVEODhDRTQyLCAweEI5NkE3QzE1LCAweEE3QkJBMkVFLAorMHg0N0NDMzIzMywgMHg4MDRERTk2MiwgMHhFMEI0MzFBMywgMHg0QTgyNTdCOCwKKzB4QTRCMEU4RTIsIDB4MkZGQzQ5QjgsIDB4RjBDREY1RTUsIDB4RjA4OUMzMkEsCisweDQ2MzI4Mjg4LCAweEVBQ0JDMDU0LCAweEE0OENCNUNDLCAweDc3OTk2NTMwLAorMHg4M0E0RTE4NCwgMHgzQzJGNDdEOSwgMHg1MTA2MTc3QywgMHgzM0YxQTc4NywKKzB4QTIyNjZFN0EsIDB4RUJDNDI2QzgsIDB4RDdFOEFERDMsIDB4MkRGNDA0NzcsCisweEY5RThEN0JELCAweDgwQkQ4RUFCLCAweEU2MUNFNTVGLCAweEY2QTdFRjZGLAorMHg1QzY3RTFDMCwgMHhGQkQwMDg4QSwgMHg3RUQzN0IyNCwgMHhGNUJGRDU4RSwKKzB4QzI5Q0ZCMEYsIDB4NjFFQ0UwOEIsIDB4QTc3NkNGRDgsIDB4OUUwRjNBMDUsCisweDhGQzhCMDJGLCAweEZERjgyNzAyLCAweDAyOEMyRjJDLCAweDE2OUQzMDk0LAorMHhFNEFBMzIyOCwgMHhGMkNEMTQyRCwgMHg5QzcwNTc0RSwgMHgwNTdCRkU3OCwKKzB4NzgyQjkwMzksIDB4MEQwMTMxMUYsIDB4OTc1NTIwNTAsIDB4NkEwOTdGMkYsCisweDFCMzI0MkI4LCAweEY0M0YzMkZCLCAweDk2MDA0Mjg3LCAweEMzREMwOTM5LAorMHg0MjE1QTBFMSwgMHhBQ0QxQTI4QSwgMHgxODk5MzJFQywgMHg5QkJBMDQ3NSwKKzB4RkExNTRFNUIsIDB4NEI0RThEMDEsIDB4NEQ2QjE4QjEsIDB4MzE1NDVCM0MsCisweEM4NDlDNTJELCAweDYwOTU4QjlCLCAweEU5MkNGMDkwLCAweEFDM0UxQjU4LAorMHgyNTFEMDJBMywgMHhGQUVFNEY4QiwgMHhCMUNGNkNDQywgMHhDMkEwRDhCMCwKKzB4MDUwMURGNDYsIDB4RDAzNjlEOTQsIDB4RjNFMTE0NzksIDB4Mzk3NTk5RjgsCisweEI5MDA2NEQyLCAweDM0MUY2RDU3LCAweDMxRjAxNDFBLCAweDJGODk5MDI5LAorMHhCQzlFRjZFOCwgMHgxM0I0NzM0NywgMHhCOTNENTlCQiwgMHg1NTZFOTkwRiwKKzB4NTcyN0JERkMsIDB4QkE5RjUxMjEsIDB4RDY3QkU3Q0EsIDB4QjE2N0U4NEQsCisweDJDMEVEMEZGLCAweDI1MUZGRDRBLCAweEM5ODcxOUYyLCAweEQzNzlEOTc2LAorMHg4QjNBMEE5QiwgMHg0MEJBNUY2NiwgMHhFNDBBOTNFOCwgMHgyRjg5RkMwNCwKKzB4RkNCQUZERDQsIDB4RjI0MjQyNzAsIDB4MUJEQkREMTUsIDB4N0YxNDU5QjAsCisweDVBQ0I2QzZBLCAweEZBMjA3MTlGLCAweDJGMTZGRkI0LCAweDgyMERERTUwLAorMHg0NjhBQUMxNSwgMHg3ODE2MTM0QywgMHg5NzhEOTU3MCwgMHg2NzQ1Q0Q2RCwKKzB4QzFFNzY4QzEsIDB4MTVFMjQzQjUsIDB4QkEzMEFENjEsIDB4NDgzRkI2RkUsCisweENBQTE3RDBGLCAweDJGOEYwOTc0LCAweDM0QUI2OEI0LCAweEIzRTg2NEIwLAorMHhDMURBMzgyOCwgMHg1REFENDNCMCwgMHg3MkQxM0I4MSwgMHgwMUYyNzRBQiwKKzB4OUMwNjUxQUQsIDB4MEZDMzBDMTAsIDB4MEU3QUEzQ0IsIDB4REJFNkI5RDksCisweEY0MjNCOUE3LCAweDQ1N0I0RTMyLCAweDQwRThFMjY5LCAweDkxREEwNDJBLAorMHg5REJGNDFFOSwgMHgzMDhDMEYyRSwgMHhDQUJGQUMwRCwgMHgwRTJDODZCMiwKKzB4MTE3QkMzQzYsIDB4RUVBNTM4RjgsIDB4RjMxNTg1REYsIDB4MERGNTAyODEsCisweEVBQTk2MDFFLCAweDhGNDA4QUZBLCAweEYxMTQ0RjlBLCAweEEyQUIyRUNELAorMHhBQ0I4ODY4NSwgMHg2RjRFRkZCRCwgMHg4MUVFRjg4NiwgMHg0NkIwMjI0MCwKKzB4M0MwOUQ5MTYsIDB4NEYwREFGNjgsIDB4ODMzN0IzRTMsIDB4OUEwMTFCQTYsCisweDRDNjNBQzY2LCAweDJGQ0M2NjlFLCAweDBDN0QxNUJCLCAweDUxMjc5RDlGLAorMHhDMTM1NDc3OSwgMHhFRkY5NDBBRiwgMHhBOTU2Q0IzNywgMHgwREI3OTdFMiwKKzB4RTY2NUVFNTUsIDB4NzlBRjg3OUQsIDB4MjFCQkM5MDIsIDB4MzBCMjY0QkYsCisweDQxMUNEQzk4LCAweEU0NTMzODlGLCAweDQ3QzJDMTk3LCAweDNFNjAxNUY4LAorMHhGOUU3QUEyQiwgMHhBOTMwMjQ3NCwgMHgwNEM2ODg4RiwgMHg0RDExOEJGOSwKKzB4MERCN0FBQzAsIDB4NTJBMzhFREIsIDB4NERBQjIyRjIsIDB4N0RCQjZFQUIsCisweEQ0RDE3ODUxLCAweEZEOTQ0MzE0LCAweDQwQzU4MzhDLCAweEJBNkVCMEVGLAorMHg5QUEyODdBNSwgMHhGNkQyMzZGMCwgMHg0MUQ5RTJCQSwgMHg2OTY4RDc3NiwKKzB4MzFCMUQxMjksIDB4NDJDM0Y5NjMsIDB4MjdDQ0FEMzAsIDB4Q0Q2MUJGNEUsCisweDJDN0RBQkFCLCAweEE3OEE5Q0MzLCAweDdGODU2QjZGLCAweEI2RDQ0NEE1LAorMHg5MENCQjMxMiwgMHg5NTYxMTc4MSwgMHg0OTE2RDUzMSwgMHhDNDk2QzMwRSwKKzB4NzA2RDBDQjcsIDB4MzVEMDA2NEIsIDB4RkUyNkMzNkEsIDB4NjIxMUYxNEIsCisweDJDMjM0MEJBLCAweDU4NjMzNTY3LCAweDA2QjZCQThFLCAweEE3RUMzRDhELAorMHgxMDcxQjBDRCwgMHgzODhFRUZBOCwgMHg2MEQ4RkIxQywgMHg1Rjk5RDE0NywKKzB4NTJDQTZFQkYsIDB4RkE3MzYwMkUsIDB4MDM3NkMxNUMsIDB4M0M5MUI1N0QsCisweDkzODZBRjE3LCAweDE0QTM1QTFBLCAweEJEQjQyQTM5LCAweDBFODNDMjU3LAorMHhENEM1Qzc3NSwgMHhBNjA3RkE0NiwgMHg5MUI5QUQ0MCwgMHg3NjIzQzVENiwKKzB4RTNENTNFNkEsIDB4QTNDNjYzRTcsIDB4NUFEMzlCQ0UsIDB4MDNCNTgzOTQsCisweDM4ODYyQzdBLCAweDAxRDUwQjlGLCAweEVBQUIzOEVDLCAweEFCM0RGQjhCLAorMHgwNjc5NTM4NSwgMHhCMTdGNDg1RSwgMHhFMkY1NzkxNCwgMHhCNzlBM0JBQSwKKzB4MTNEQTc4ODYsIDB4NzEzNkM3RUIsIDB4NUU3NDhBRjcsIDB4RDM0RjE2RkMsCisweDk2OEY2NzAxLCAweDk5QzVEN0JFLCAweDUzMEY3RkFDLCAweENERjVENTY3LAorMHhFMzFERTBEMywgMHhDRjkzQkM2OCwgMHgzNEM1NzhBQSwgMHhBMjAxRjc2MSwKKzB4NUNCOERDMDAsIDB4Q0EyNERCOTgsIDB4RjhBRDdFNEYsIDB4ODA4RUM0NzYsCisweDYwM0JBNzUxLCAweDQ4OTU1NUM2LCAweEYyQTAzRkYwLCAweEQyNDYxRTlBLAorMHgxMDJDMzNCRSwgMHg3NjczOTMzQywgMHhDMTFBMjQyNCwgMHg2QTIzQzhDNiwKKzB4Njk0OTk4MTIsIDB4MTlBQTg1MTAsIDB4QzhDREE3NUYsIDB4MzRCNTIxNkEsCisweEQ4N0Y3NDIwLCAweEM4Q0VEQjUzLCAweDhERjExQkEyLCAweEIxMDkxMUM2LAorMHgzRjFFNTk1NSwgMHhGMDc1RjRFQiwgMHgxNzg3NEZDNSwgMHgwRDU1Njg1QiwKKzB4NUVFNTIxRTUsIDB4NDZDNzI5MjQsIDB4Rjg1NDAyMTAsIDB4NUQ1RTRDNUMsCisweEU4N0ExMzNDLCAweDkxNjMzREM5LCAweDM2QjU0RDVELCAweEE4QjVENDQwLAorMHg3REI3RDZDNCwgMHg1RkE4MkMxNywgMHhBRDY3OTAzOSwgMHg4NkIzQjgzOSwKKzB4REY1MTIxQjcsIDB4QzA4Qjc2OEEsIDB4MzM4QTUxMkYsIDB4Q0Y5QTRGOUEsCisweDVERUZCQjVCLCAweDRDOTMwMUIyLCAweDA4MDIzNzAyLCAweDVCMUQ3RTI4LAorMHhFQzgwMDUwNSwgMHgzQTg2OUU4MCwgMHg0QzUwQzhBRSwgMHhCMUFFOTA2NCwKKzB4QUZGQTM0RUIsIDB4RjJGMDA2QjksIDB4RDhBOUEzRDEsIDB4MkM2QzIxMzQsCisweDY3N0VFNjQ4LCAweEJCNkI2RDVDLCAweEEyODUxMzZDLCAweDZDNDdCRjRDLAorMHhBRjE1OERDMSwgMHgwRUY3NUUyQiwgMHg1QjlDNzRENSwgMHg5QjhENEJFMywKKzB4RTQ5NUJFMTksIDB4NTk0MEIyMjgsIDB4NTVFNjI2NTYsIDB4MzI0N0UwNjAsCisweEJGNzA5NENELCAweDFDMUFCMzgwLCAweEVDRUEyMjc1LCAweEI2REQ4MjUxLAorMHhDQ0EzOUREMiwgMHhBQjg1RDk5MiwgMHgyNzgxOTdEMiwgMHhGQjZDOUZEMCwKKzB4QkQ1M0I0NTgsIDB4ODlFRkUwRUMsIDB4NTJBM0RGRkQsIDB4QTZCN0ZGN0IsCisweEZCMDQzNjQ5LCAweDkzQzkzRjc5LCAweEFFQjRDRDZELCAweDcxREI1QzkwLAorMHg5RThERkU5MiwgMHgwRjFBNUI5MSwgMHg1NUM1Q0Y1RCwgMHgxQTE4NDdBQywKKzB4OEQyNUNGNkMsIDB4OTE0RkQzMTYsIDB4MzlGQ0ZFMjAsIDB4RDhGNjZBMDcsCisweDJDREQzREM2LCAweEU0MTVBQzcyLCAweDNEMUJEMDlCLCAweEE4MzIyQzU5LAorMHhCRDNBODI2QSwgMHgyQTk4OEE0MCwgMHhFQkQ4QjFERCwgMHg5RjUzRUVFRiwKKzB4REY1NzE4MTYsIDB4RDRGQ0NEQUUsIDB4Qjg1QTFFNTAsIDB4QkUxQTU3MUYsCisweDBFRDA3NTM0LCAweDRDMUU0NzFBLCAweDhCNEQzNkY2LCAweDBFMzg4RkM2LAorMHg5RUQyQkM0RCwgMHgzRTJEN0Y3MiwgMHg3NTJBQ0ExNSwgMHg4OTYwQjQ4RSwKKzB4NTg5MkIzRDcsIDB4NzBGNkYzQ0QsIDB4MjZDNDg1RUYsIDB4QzgzODM5QjksCisweEZFNkMyMjRCLCAweDM1NDcyMDNGLCAweEY3M0FDQTg0LCAweDA2NURDREJDLAorMHg4OTg2RUJEQywgMHhDRDU5RUExNCwgMHhDMEVGNThBOCwgMHhDNTU4NzIyOSwKKzB4NDg0RkJDRUYsIDB4OUI4QkYyNEQsIDB4MzUxQ0Y5NDYsIDB4RTEwQUE5NzMsCisweDE3OTE5NjQwLCAweDk1RkY3QjFDLCAweDgyQUI2NUU1LCAweDA3MEJDQzk4LAorMHgwRTdDREI4RCwgMHgzOERCMjdERSwgMHhDQTU0M0MyQiwgMHgwMTMxRUI0MSwKKzB4ODMwMDk5NkIsIDB4ODhCNjNENjYsIDB4MDNBREFDMUQsIDB4QjIwNUE4N0IsCisweEQ4QkRDMEM2LCAweDQ0M0Y2MDcxLCAweDJDRTY5RDJBLCAweDZFMUU1QTUzLAorMHg0RUZGOTNBQywgMHg3MDMyMjY1NywgMHg1Q0NERDE0NiwgMHgwNEM0MzVCNiwKKzB4NUJGM0NENjksIDB4NTFFMDkxMTUsIDB4MjU0NURGQjIsIDB4QTUyRUY0NDgsCisweDhEMzg3MDQ2LCAweDdDNEYxRjI1LCAweDJFRkZEOEFBLCAweEZENjQyMkIwLAorMHhCODJFMjZBNywgMHhDRjAxQ0M0NSwgMHg4ODg5OUVCRSwgMHhEQjYyMTk2NiwKKzB4QkJBMTgyMkYsIDB4QjI2NEFBRUIsIDB4MTA3NkVBQTUsIDB4QzI0QjBDRDUsCisweDU0RDU1NEIwLCAweDRFQ0E3QzA1LCAweEM4QzlCMDUzLCAweDcwQTg2RDk3LAorMHg0RTMyNjVDQSwgMHhFQTI0RjgxMCwgMHg4NzNCMTcyRCwgMHg3OUE3NEQxOCwKKzB4RUMzRjQ5RDUsIDB4RDE3OTk2MDIsIDB4QTIxQTI4QjYsIDB4M0ZCOTlBRDEsCisweEMyREIzNUIzLCAweDYzRUMyRTUxLCAweDE3RTQ0ODlGLCAweEU4RTE5MTY0LAorMHg3OUFERDgxOSwgMHgxMEQ2NjE1NywgMHg1RjYyMUE3MywgMHgxQ0QwNjNCQSwKKzB4NjY2NTgxNUYsIDB4RkEwQjcwODEsIDB4NkUwRkE0NzMsIDB4MENFMzU3MUUsCisweEI1RUFFRjQ2LCAweEFBMDRDRjU0LCAweDMzNjY4MENBLCAweERBQkJGRjExLAorMHgyMjU5RTc5NywgMHhCNTdCNDQ3MCwgMHgxMTFFQjRCRiwgMHhDMTcxRDQyQiwKKzB4NTg4OUE3QTQsIDB4NDE5Q0NCM0UsIDB4QkVBMUYzNjYsIDB4NDFGRTQxNEIsCisweEE2NUNCODk4LCAweDZDMjgzNjNBLCAweDhGODJGQzg0LCAweERCRUQ1QTlDLAorMHg0REJGMzUyNiwgMHhGMkYzNEU2NiwgMHg5RDJDOUIxMSwgMHgwQzBENERGQiwKKzB4NERCRjc5RDQsIDB4QTI1NkU4NkQsIDB4NjQwNzM3NkMsIDB4M0YzRThBRkYsCisweDQ3NEIzNTkzLCAweEU1NTk2NUM4LCAweENCMjBEMzU4LCAweDBDNjcxQTlCLAorMHgxNjlGODM0MiwgMHhEMkUxQzlFNywgMHhCRERCQUFFQiwgMHg5M0RGMEM3NSwKKzB4RjI3NzA3RjcsIDB4NTEwODMwNUIsIDB4NEZGMkMwNjAsIDB4RUI5QzA4REUsCisweERGMTEwMjBFLCAweEQyMjcxMDQ2LCAweDZEMUJGRDI3LCAweEVEMDIwQ0RDLAorMHgyQzIyNjU5QiwgMHg2OTIwNTBEOSwgMHhEMTRCRTI5MSwgMHgzRUJGOEU4NiwKKzB4ODM0NEI2MjUsIDB4Nzg0MEI5MUMsIDB4QjcwMkJENUYsIDB4NDkzNUQzMTgsCisweDAxQTIyMDEzLCAweEYyQTIwQjA4LCAweDY1MUExQzM4LCAweDAwNEZFNjMzLAorMHhFNTFEQ0MwNiwgMHhGNUI4NjEzOCwgMHg5RkJGRjExOCwgMHg2RjdCM0NENCwKKzB4MDI4OTM4QjQsIDB4MDcxRTk2QUUsIDB4REYzM0RDOUUsIDB4NzkwMDFBQzcsCisweDdCNUQyMEZDLCAweDNGMTM3Nzk0LCAweDgxMTY1QjA0LCAweDk3M0Y4RkQ0LAorMHgwQUU0Q0JGNSwgMHg3QzQ4MTgwQiwgMHg0QTk2QkM4OSwgMHg1ODA2NkU3NCwKKzB4ODY2NjlEQzYsIDB4REM1NUEyMTgsIDB4ODU4QzMxMzAsIDB4OTlBRUFDOTEsCisweDI2OTgzRkM0LCAweEVFNEQ0RjA2LCAweEQ4RDZENjU3LCAweDE4RUYyNjJCLAorMHgzNzRBNjIwRiwgMHg4NTk5NUY5QywgMHhDQzgxNEFDMSwgMHgzOUY0ODdFMCwKKzB4QzYyODE3N0IsIDB4MkZBRTJDMzksIDB4NjQyNTI1QTIsIDB4QzE0NzRGMkQsCisweEJDN0NENDlFLCAweEU4MUUxM0Y3LCAweDgzRjQyQkRCLCAweDhBQjdEOTlBLAorMHhBODA0MEIxMSwgMHhEOEFBNjhFQywgMHg5ODNCMzczOSwgMHhFRTQyRUNEQiwKKzB4Qzk1MTM0OTgsIDB4Q0FBMDZBMTQsIDB4RTQ3ODQwOTQsIDB4RTZCRUJCOUUsCisweDEzQkU4MDE4LCAweDU5RTNENUQ0LCAweDBDRjE3MjhGLCAweDk2MzQxM0JFLAorMHgzMTk1MzNCNywgMHgxNDY2MkFCRSwgMHgzMzYzQjQ1RCwgMHg1OUE5OTY4NywKKzB4QkJCMEZEQTQsIDB4Q0RCQjhCMjEsIDB4MDI0MEYzQjEsIDB4MjI2REFDM0IsCisweDMwRTFDNDlFLCAweDc2RTA3NkQ3LCAweDRCOTFDNTk4LCAweEIzQzQ2RTJGLAorMHg0QTY1N0NDNywgMHg2NkMzODc1QSwgMHhDQkM2RkM1NCwgMHhGODMyRUJFOCwKKzB4REQxRUFEM0QsIDB4RkVGREFGODUsIDB4OERFNTFCODgsIDB4QUVBRkQ1RDMsCisweDNFNENFQTgyLCAweDU1RjQ3OTM0LCAweDlGODMxNENBLCAweEQwMjIwQkMwLAorMHg1QUNFRjgxRiwgMHg3MUZERDhFOSwgMHgxM0ExNEVEOCwgMHg2RjFGQzFFNCwKKzB4NzUwNDZBMDQsIDB4QzZDNEZEQUYsIDB4NEZGRkY3MjQsIDB4RjQ0RkVERDYsCisweDdFMUM1Q0JDLCAweDc4NEM2QjRDLCAweDhEODVGMjIwLCAweDM4QjY1QzNFLAorMHg4Qzk5MjA1MCwgMHgyREUzNEMxMywgMHg5RjJBNDU0NywgMHg0OEU1OEY2NSwKKzB4QTI4MEI2ODksIDB4NkY1NDBEOEEsIDB4MTBCNjFCMzksIDB4MUM4QTI4NDksCisweEE3MzE2MzU4LCAweERCRkI3ODYyLCAweDE4MkM1NTNELCAweDkyRjA0Mzg5LAorMHgxRkU3QkFERCwgMHg2QTcyNENCQSwgMHg5NzBCRTAyMCwgMHg5Mzc2MDA1OCwKKzB4MkRGOUUwQUQsIDB4Q0ZGMUY4QjEsIDB4MTcwRDgxMEEsIDB4NDVGNEU2QTIsCisweDM3QTBFOEZELCAweDg2RDExQzZELCAweDRGM0M2QTNBLCAweDRCMTQ0NDUyLAorMHhDRTlCODdBMSwgMHg3QzA4QzMwRCwgMHg5Q0I5QjBBQiwgMHhENTVGMkNDNSwKKzB4RkY5NTE4MEYsIDB4RjM1NTA1QkQsIDB4RUQ1QkRCOTYsIDB4ODVDQTJFNDEsCisweDg3MDhCMjY0LCAweEQ2MDc5NzM0LCAweENBNzZBQjNELCAweEZENkNERjRGLAorMHg5QUFCODQwQiwgMHg5MkQzQTVGNywgMHg5M0E5MkMzOCwgMHgwNDE5QUE3QSwKKzB4MUQ1MDAwNkUsIDB4MTI2RjQ4RkYsIDB4QUNEQTQxMkMsIDB4MDExMzk0NTQsCisweDhFMjNDNDg2LCAweDAxRDQ0RjUxLCAweDdBNUY2RjEwLCAweDM3N0Q0RDVFLAorMHhCNzg0RTcyRiwgMHhBOUFDOTI1RiwgMHhCOUM2NkM3OSwgMHgwNTczMzFFNiwKKzB4Q0ZGMDQwRTQsIDB4NzdFOEE5NjAsIDB4MzVFMzFFRUMsIDB4RUI4MDdBNDQsCisweDg1OTRGRkZDLCAweEQyNzYyOUI3LCAweDVEREY1MjZFLCAweEJDRjJGNDg0LAorMHg4ODgwNTAxMywgMHg0MTA0Nzg1MCwgMHhCODU3NEVDRCwgMHgzRTE1MDgyRiwKKzB4MzA5QzE2REMsIDB4Mjk3QjY5MDQsIDB4MzBDMzlFQ0IsIDB4RDIwQjYxQUYsCisweDUxQTU3OEFGLCAweDRFMEQyNEE5LCAweEM2MUZCRTVGLCAweDdBODlGNEM2LAorMHg5NDMyMjk5RCwgMHhGRTI2MUI5NSwgMHhERDFGQzRDQSwgMHgwNDRCRkI5MiwKKzB4NDFCRTU2Q0EsIDB4MEEyQjY4MzEsIDB4RTEzNUQ3NUQsIDB4QUIyRDAwQTAsCisweEI0Mzc0MDgwLCAweEZBQTZEQkQwLCAweEE3MDRDNEE5LCAweEQ4MTM4NUE0LAorMHg1MTUzMzMxMiwgMHhFRDVFREFGNywgMHhFNEVERkFFQiwgMHg3NEI3REFGRSwKKzB4OUQ4MTBBQTcsIDB4NDBCOTE4MjcsIDB4NjUyMTlCQ0IsIDB4NzU0MzFDMTYsCisweDk0RDkyM0QzLCAweDAwQjdBQTRFLCAweEI4QTg4RkRBLCAweDkyNzI3OEQ3LAorMHg3QTIzNzY5NywgMHg0NUIxNDA5NywgMHgyRTNBNTYyRiwgMHg5MzAwMzMyMiwKKzB4MEI4OEE1RkYsIDB4RDEzRDRBREQsIDB4NkQ3Qjc1NzksIDB4NzJEODM0QzQsCisweDBCQ0FBMzYxLCAweEMwMkUwMEI4LCAweDE1MDIzNTUxLCAweDQ4MUM1RTkzLAorMHgwMkU4MUExNiwgMHg4QTg0NkEzMywgMHgxMjM5QTk3MSwgMHg5OTQ4MThCNCwKKzB4RkMzREJCNkQsIDB4NDNDOEQyRjIsIDB4RTNBRTU0OEMsIDB4NDA4MDMyRjEsCisweDAyQjA1NjM2LCAweEUzNjFBNjBDLCAweEZFMkNBMjkyLCAweDA2MUQyMzc0LAorMHhEQjI4NTU1NiwgMHg3MDYyN0VBNCwgMHg3RkM2NEFGMCwgMHhGRTEwMEI2RCwKKzB4NzFBRUIzRjIsIDB4QTU2NUE0MTIsIDB4QTY5ODczMUYsIDB4NDlERDk3NjcsCisweEMzNjI3RUJDLCAweDc1RkIyREJGLCAweEZEQzBFOTcxLCAweEY2RUQxMkE2LAorMHhBMjNEQzAwRiwgMHg4OTdFOTE3QiwgMHg3RjIwMzFFMCwgMHgxN0RDRTU2OCwKKzB4REY2OUNBRDMsIDB4QzZGQjVCNkQsIDB4MDk3MjY4QjAsIDB4RTExMDI0NDQsCisweDg2REY5MzgzLCAweEJEN0I5Q0MyLCAweEJBQUY3RENGLCAweDk4NUI0NUQxLAorMHg0MjE4RTk1QSwgMHhCMjQ1NUVGNCwgMHhEQjAxNUY5QiwgMHg1NENDQ0U3NiwKKzB4NTZFREY1NjEsIDB4NkY2NkY5NUUsIDB4RjhCMUVCRDAsIDB4RjdBMzlBRTAsCisweEY2NkQ4MzQ2LCAweEE0Njc3MDA3LCAweDAyQzRCM0VCLCAweDgyOTk4N0IwLAorMHg3QzBFMTkxOSwgMHg1MUY3MDYwQiwgMHg0QjMwRjFENiwgMHg4NUE0RTBDQSwKKzB4RUMwNDlGQTAsIDB4MTdDQkYxRTQsIDB4N0ExQUFEOTUsIDB4RUJBNEM1MTMsCisweEU4NDYyRTc4LCAweDU0Q0REQTBDLCAweEVFN0I4Mzc4LCAweDk4NThDOEMxLAorMHhCQTMzNTg3QywgMHg0RDZGMUIxNCwgMHg3QTJDMDUyNSwgMHg3RTZFRTREMiwKKzB4QUNBMTg2OTIsIDB4REQxODY4MjAsIDB4NDExOThCMDMsIDB4OEFDODVBQjcsCisweEJEODY5MDBCLCAweDM2RTJDMzU0LCAweEU2NUY5MTE1LCAweEIxMDY0NURBLAorMHg3OTcxRDIzMCwgMHhDODNEMzU4MywgMHg4QzYwQzgxRCwgMHg5NERCNTc0MSwKKzB4NEZDQjg5MzQsIDB4OUE1MjBGRTIsIDB4Q0U0OTQ0NkQsIDB4ODg2NEU2NDEsCisweEY1RUYyNUE1LCAweEMxREVFRDBBLCAweEM4MDU3RjM3LCAweEZCMzA1QzczLAorMHgzOTJFNjcwRCwgMHhBNEQwMEQyQSwgMHgzNTZBNDZGMCwgMHgyRjY3NTU2NywKKzB4Qjc5OTdDRjAsIDB4ODhBRjNBNEUsIDB4NTZDOUQ1MUUsIDB4REQ3NDZFQ0QsCisweDQwQ0ZBNDUzLCAweDVFQTc0MENELCAweEU0REQ2QkIxLCAweENDQjMxNDI5LAorMHhBMjIyN0YzRiwgMHgxOEExRUFGMCwgMHhDMTU1NDE3QiwgMHg0MUZFNzM1RiwKKzB4MTZENDBCMDAsIDB4QzlGNzJBRkMsIDB4ODZCMUQ2MkQsIDB4NkE5OUE4MkEsCisweDA5RDMzMjQ4LCAweEVDNDQ2MzlDLCAweDlCMEFCMkIyLCAweDY5NjkxNjRDLAorMHhFRjYwMkJCMSwgMHgwMjA4RkM2RiwgMHhDMTEwOTU3OCwgMHgyOTk3QUI4NywKKzB4RTU2MjZCMTQsIDB4Q0RBRjQ4RTEsIDB4MjA3ODE2MzMsIDB4MkVCRTBBNDEsCisweDczNzkyNjFFLCAweEYyMTZGN0ExLCAweDcxNEQ4MjU4LCAweDkzNkZFNjhGLAorMHgxNjA4NTZGOSwgMHgyQTREMTQxNiwgMHhCNTU4RTQxMiwgMHg3REIxOTZERiwKKzB4REM4OENDQjIsIDB4RjM3QUI2MTIsIDB4NzQyM0YyMTQsIDB4RDNCMDZBNDMsCisweDI1QTgwMTJELCAweEMxQzY5RkZBLCAweDkzNkYyQzE4LCAweDU2RDc3QzE5LAorMHg3NzRCRkM2OSwgMHhGNUU4NUUyNCwgMHhENzkxNThDOSwgMHhBNjdDM0UxNSwKKzB4Qjk1ODgxOUUsIDB4NjlGODEyNzgsIDB4RjJCMzUxMDcsIDB4QkYyRjQwODUsCisweDFDOTk3QTA2LCAweDZDMjM4QzNCLCAweEM3NTZENTZFLCAweEQxNUMxMTQ5LAorMHgzNTFFNkVDNCwgMHgyMzExMzAzRiwgMHgwNjIxNjAyQywgMHhCMTFCNkREMSwKKzB4QkU4RTUwQjUsIDB4MzRBNUY1ODksIDB4RTREMzA4QUUsIDB4NDM0NEIyOTcsCisweEEzM0FFOThELCAweDBBMzAzQ0RCLCAweDM4OEVBMTdCLCAweDAxMDdCNUE1LAorMHgzOEIzOTA0MiwgMHhGRTY3ODk5NSwgMHhCNDI2RkU2OSwgMHgyMjFGQ0YwNiwKKzB4QzQ1OTI2QUIsIDB4MjFBNDMwRjksIDB4NkQxOTJEMkUsIDB4NDE2OEMxMEIsCisweDVCQTZCMTMyLCAweDA1MTlFQ0E3LCAweDIxMTI3NTgyLCAweEY2QzQ0N0UwLAorMHgwQzcyRkMzMSwgMHgwOTQxQjNGMCwgMHg3NkYyMzg3NywgMHg4NkNGMDY3NywKKzB4RTc3ODUxMDUsIDB4QTQ2Mzc4NjQsIDB4OTRDODJCNDUsIDB4RjYwRkQ2QTAsCisweDQ2OTQxQzI3LCAweDdBMzNBNjk4LCAweEUxREY4QkZCLCAweDUyNDk5NzBCLAorMHhERkU2NUUxQywgMHhGNEE0RkIyMiwgMHg1OTk2MzlGNCwgMHhGRTBFOTcyMiwKKzB4N0JCNDhGNTgsIDB4NTMzNDY1RTMsIDB4OUU4ODRCMzUsIDB4MjYyMDQyOUMsCisweDI4NzVGRkMxLCAweEYxMUVDMENBLCAweDY2M0FGNUYwLCAweEIyQzU5QzM4LAorMHgwMzU1NkVEOSwgMHgyNzFFOUUzOSwgMHg4NTU2RTA2MiwgMHgwODIwNzY4MiwKKzB4RTU3OTdGMDAsIDB4NjZBMzYyQjUsIDB4N0VEODM5NEQsIDB4MjkyMkMzNzQsCisweDI3MTY1N0JFLCAweEFDMTUwNzFCLCAweEUyOTY2OTFFLCAweDBGRTJDNzQwLAorMHgxOTEyMEZCNSwgMHg5QUJEODg4QSwgMHhBMjAwNzYyQywgMHg3ODM3RjQxQywKKzB4QzZGNEVBMTksIDB4RjI4NkFCRjQsIDB4RkNBODk5OEYsIDB4OTdCMEU3RDUsCisweDEzMzlDNzlGLCAweEZFRDA1RDQzLCAweEIzMzkyRTcxLCAweEZDMkEwMUVCLAorMHhCNzIwQ0JFRCwgMHg0RkE3MTM1OCwgMHgwNEE1N0Y2MiwgMHgzRDU1OEIwQSwKKzB4MURFQjRENDAsIDB4QzlDODIzRjEsIDB4NDcwRjYzMEEsIDB4MDhGMjI5NzUsCisweDJCRDg1MTA3LCAweDMyODhBNjI4LCAweEIwQzg5Njc1LCAweDMyRDk1N0MxLAorMHg4MEI3ODQyNiwgMHg5OEE0Njk1MywgMHhBNDkzQUY2MCwgMHhDMkI4NEFDNCwKKzB4NDg2RDY1OEYsIDB4RkUxMTlGRjksIDB4QjJGRTU2NUYsIDB4RUFEQjU4Q0QsCisweDFGNDVGOUI0LCAweENFQUU2MkI2LCAweDY4RUM3MDJELCAweEY1MkFEREY3LAorMHgwRkZDMDcxNSwgMHg0MTI5RTQyQywgMHg5NTZBQzREOSwgMHgwMDM1Q0Q5QywKKzB4RjhGRUJBQTEsIDB4MjlDNTgzOTcsIDB4N0MyRTJFNDEsIDB4N0JFNzREQUYsCisweDI3OTFEMzRELCAweEI2RDY3QjBELCAweDhGNTU3NTI4LCAweDlEREVFRDVCLAorMHhCM0FBNEJCNywgMHgwNUUyMkU0MywgMHg0Q0RBNjAwRCwgMHg0MzJFMkQzMiwKKzB4NDA1REE1QkQsIDB4QUYyMzgxOEMsIDB4MkY3M0ZFMDksIDB4RDQ2MjQ2MjYsCisweDY1M0VGQ0IzLCAweDc3RDY1RDNGLCAweDUxQTNEQ0IzLCAweDc2N0Y0MDdDLAorMHhDNjY0NTJFMywgMHgxMEI2ODQyRSwgMHg5M0EwODQwRSwgMHhFNDUzQUQxMCwKKzB4REU1OEZDM0QsIDB4NkMyMjcyMTUsIDB4MUVFMTMwRUEsIDB4QjBCRjY0QkUsCisweEExMUU1RDM4LCAweDAxMzFCNzU1LCAweDE5MUY3MEQwLCAweERCNDgzOTU5LAorMHhBQThEMkY5RSwgMHg1QTAwMkFBMCwgMHhGNUEyOTk2RCwgMHhGRDBGOTVGOSwKKzB4RDZBMTI4NjQsIDB4M0FBNDhCNzQsIDB4NTBGNjY3OUYsIDB4MEFERjVDNDksCisweEUyRjhDRTY4LCAweEJGMjEzRTY3LCAweDVFOUFDRUVBLCAweENBQ0QwRUJFLAorMHg2REY3NjZBNSwgMHgzM0MwQTE1NiwgMHg3MjA4NjhFQSwgMHgzMTEyQTBEQywKKzB4QjM4MjM1MEEsIDB4MzY5RDlDNTAsIDB4RThGODkwRDAsIDB4MEExMjEzOTksCisweDJBQjQ1OEVBLCAweDUxQzgyMzNELCAweEJGNDY0MDNDLCAweDA3MjhDRDU1LAorMHgyM0Y2Nzc0QiwgMHgyRkI1OURCMCwgMHhGQTJDRjcyNCwgMHhCNDlGQTg0OCwKKzB4NUZGRkExMjUsIDB4REUyQzBEMTUsIDB4NzZCNzhDNDEsIDB4MTkyQkE2MkMsCisweDRDOTU2M0UyLCAweDhGNzQyNTA3LCAweDg4MjEwNEUwLCAweDM1N0FEMDc4LAorMHg3OTlFMjVBMiwgMHhFRjNFRDAyMSwgMHg2OUQ1NEI0NiwgMHg1RUM1Nzg3MCwKKzB4MEZGNDE4RTAsIDB4MDdDNUFDN0YsIDB4QzFBQ0JGOUEsIDB4ODBBODMwRDksCisweDgzN0M3QzVBLCAweDA0QzExRDg2LCAweEMxNEM4QkM3LCAweDkyQkE2NTBCLAorMHg5NEQzNEZBOCwgMHhEQkRENUVEQywgMHg5RUQyQTA4RiwgMHhBMUZBRTQ4NSwKKzB4NUZENjZDM0QsIDB4NENDQjZGOUYsIDB4QjdBQTU2QjAsIDB4MEZCM0M3M0EsCisweDAzQUY5NkU2LCAweERCMkQzOEY5LCAweDdBRjIwRDYwLCAweEI1N0NCRTkwLAorMHgyMEVCMkQ2RSwgMHhDRjkzNDQ1MiwgMHg4MkVDMjZGNiwgMHg4NEIzNzM3QSwKKzB4MDk3MkYxQjcsIDB4MzlCNkRCNEQsIDB4MTNFNTNDQzAsIDB4NjdDNDFENzIsCisweDk0QkFBQzc4LCAweDY2M0E5QzZDLCAweDM2OTI3NDQ4LCAweENGQkMyNjEwLAorMHg5ODBGNTNCQSwgMHg3RTU2Qzk2QSwgMHgwNEM2MkRGQiwgMHhBNDcxRDU3OSwKKzB4REY5QjJFRTEsIDB4RTEyREVCQjcsIDB4MkRCOUIwNDIsIDB4RjBDNzRCOTYsCisweDZBMzc2MkU5LCAweEY0REMzOUQ5LCAweDc2MUE1ODg0LCAweEZBMzYzRDNCLAorMHg5Mjc2Njc1OSwgMHhGM0VBRDQ0MSwgMHg4NzgyNjlFRCwgMHgxQUZGQUZFNSwKKzB4Q0I0MzI3NjQsIDB4RkUxOTQ3NUMsIDB4Q0Y4Nzc2REEsIDB4MUYwQUQ5MDYsCisweDdEOTlBQzIwLCAweEMyNzMxN0ZCLCAweDQzOTk0NEE0LCAweDY1RDE0QzJELAorMHg0M0U0NTI2MiwgMHhDREU2QjNCRCwgMHhFMjVDNjdDRCwgMHgzMjFBQTJFNiwKKzB4MzUyQTI3NjQsIDB4NTU2OUVGNDIsIDB4MDA1QzM3MEQsIDB4MjkwODAxRTAsCisweDYxODgzMDM1LCAweDJBMkRCQzQ4LCAweEUyRDU1OUZGLCAweDAxRjVERjEzLAorMHg2OUI2MTU1OCwgMHhFOTRCRjM2NCwgMHgzQ0E3NkZDQSwgMHgyRTAxNjQ4MywKKzB4REI2NzVGOUMsIDB4NEZBNUI2REMsIDB4NTlBNkMzRUMsIDB4NTZDNkU2Q0YsCisweDI0Q0Q1OUY1LCAweDQ2OTExODM0LCAweDY4M0I5RTM5LCAweEI1QUY2MTc0LAorMHg1QzMxRTI2OSwgMHg2NzlDOUExMiwgMHgzNzg3RDNFNiwgMHhGMTcyN0VFNiwKKzB4QjA3MDg4MkYsIDB4RkMzN0VBQ0EsIDB4QkVFMDc4M0YsIDB4RjYyMTgzNjksCisweDE5MzcyOTQwLCAweDNGRjdEODkwLCAweDY5NzM2OTE5LCAweEREOTYxQ0I5LAorMHg4ODMwMTBGMSwgMHg2RTQ3MkQ1QiwgMHgyNDQ3RTAwRCwgMHhGMzlFMUYwRSwKKzB4MURCRDQ0MkYsIDB4QkUxOTc3RTAsIDB4Qzg2NTVGNDIsIDB4MzdDODQyNTMsCisweDM0ODBEQUM0LCAweDRDRkUxREM4LCAweEYxNTIxQUQ1LCAweEE0NUM0RjhDLAorMHg4N0ZCQUVFMCwgMHgzRTQxRTlFMiwgMHhGNDc3NzFFNSwgMHgxNkM3NENERiwKKzB4QTMzRDQwMzUsIDB4Mzg1MTNBMTAsIDB4QUJGMzI2NEQsIDB4QjhEODBERjYsCisweEQ5QUQ3MjU2LCAweEY3ODM3NUI4LCAweEQ3NjYxQ0Y3LCAweDFDMzYzQUY5LAorMHhENDI1RkEzMiwgMHgwMDFEN0I5OCwgMHhEQjk2QTFDQywgMHhBMDkyRTY4MywKKzB4NjVDRjUzMTYsIDB4NUYyODI2ODksIDB4OUY1MkY5MTIsIDB4ODk1OEExQjcsCisweDY0NTdBM0Y3LCAweEFCNDNGQURELCAweDA2MTMyOEM3LCAweDlEMzFCNUUzLAorMHg3NUE3N0Y2RCwgMHg0QTc2NEQ0QSwgMHg0ODhDRTgzRSwgMHgyOTg4NzIxOCwKKzB4OUEwNEJERDAsIDB4RUYzMzEwNzAsIDB4QkNEMkY4ODQsIDB4NkJGNjZBNkYsCisweEI4NTE0M0NCLCAweEZBNTI5Mjc4LCAweDlFQTNBMzU0LCAweDRBNzNCREFGLAorMHgwQ0JCNzU2MywgMHhEMDFBRTM1RiwgMHhEMkFDM0RBQSwgMHhGQzgyNDNCNywKKzB4RDgwNUQ5N0IsIDB4QzE2MkE3NUYsIDB4MUQ0OUFDNjcsIDB4OUUxQkMzOEMsCisweDFEMDZBQUU4LCAweEVBRjgwQ0Q4LCAweENFODI1REQ0LCAweEFDQTNGMDZBLAorMHg4M0QwOTJFRSwgMHgzRjJCQUFCQywgMHgyNDgyRDEyMCwgMHhGMzAxNjgwQywKKzB4N0RBQzM3M0YsIDB4RjVENjE3OEQsIDB4QjdFOTIxN0YsIDB4Q0NGRThDMTMsCisweDk3NjAyNEUwLCAweEEyRjM5RjhDLCAweEI2QzY1NzM0LCAweDEwQUU1MTRBLAorMHg2OTY1ODRDRiwgMHgyNTQyMTEzQywgMHg0NzlDQjIwRiwgMHg4RDNBMjJFMywKKzB4RjdDNEI4OEMsIDB4RjRGN0ZCRTIsIDB4MkY1NTMzMDgsIDB4OUVBNzFFM0EsCisweDdCOTU4RjQ4LCAweDA5MjdEQUFCLCAweEYwODk0OUI3LCAweDdDRDQ2QzBFLAorMHg3QTg5MkJCQywgMHg4ODJGMzJDRSwgMHgzNEM0OTBDOCwgMHg4NDgzRUQwNCwKKzB4MDdFQjRFRkMsIDB4NEJFQkNEODIsIDB4ODNCMTVFRTgsIDB4OEYzQjc4QUMsCisweEY5NUVGREE5LCAweDgxNkJFQkY5LCAweDI2OUJEQTU4LCAweEVFMzczMzQyLAorMHhFMDlGREE5RiwgMHhDNzY1MUFBQiwgMHhCOEQzOThCMiwgMHhDN0Y0NDlCMiwKKzB4MDMxMzEwRjUsIDB4Qzg2OTcwNkYsIDB4REEyMkYxMjcsIDB4OEM2OERGOTEsCisweEU2NzYwNjhBLCAweEI4NUFBQUM3LCAweEQzMkYzNUJDLCAweEUyMkRGMDMxLAorMHhGRTE0MkJEOSwgMHhENEZCMjcwMCwgMHgyRDE5NzcwNywgMHhBM0E0M0E2NCwKKzB4MEMwMkIwNTAsIDB4RTk0NUFENTYsIDB4N0RFRTBBNUQsIDB4MTA3NURFM0UsCisweEQ5OUFEOTFDLCAweDZBN0JCNzFELCAweDE3NzRCM0I4LCAweDIyMjhCMTEyLAorMHgwREVFRTg0NCwgMHgzODA3NEVCRSwgMHg2REFDRjU3QiwgMHg3RTAwOTRCNywKKzB4Q0U0NkY4RUMsIDB4NERBRjM0RjQsIDB4NUI5NjE5MDcsIDB4QzgyMzZGRjcsCisweEZEMzgwQUE3LCAweDYxRUJBODRBLCAweEFFNDg5MkVCLCAweDBGMUI2MzY1LAorMHhCMEM0QzlBMCwgMHgwNEU2MDEyRCwgMHhBNUY5MEQwMSwgMHhENkM4ODgyRSwKKzB4QkNCOUMxRUIsIDB4MEU1RTBGRUMsIDB4NTNBNDY4ODksIDB4QTJDMEZBNTEsCisweDUyMERBNDU5LCAweDNGRDk1RkEyLCAweDZFMUQ2RkU4LCAweEJDMDkzMjIwLAorMHhBQjE2MzkwQSwgMHgxNjNFM0Q2RCwgMHgwQTYzNTE3QywgMHgzQkYzOEYzRCwKKzB4ODhBMUY2NkQsIDB4OTYyNjM1MzYsIDB4NDEyREYwMDgsIDB4MTJGQjEyNkQsCisweDQ0NDQxRDdBLCAweDMxQzlGNzI2LCAweEY2NkY2MENGLCAweEFFMTQ1M0Q0LAorMHhEQUVBRDcxQiwgMHg1NEVBRUUwRiwgMHg5NDhCNzNCQiwgMHgzMUVBM0U3NCwKKzB4MzU1RDRGREMsIDB4MkExRjNBOUUsIDB4NTg2RDA4REYsIDB4MTIzQUMyRTgsCisweEY1QUMwMDY1LCAweDg4NzRBQ0FCLCAweDA1QjAzRDYzLCAweDAxQkQ2QTRDLAorMHg3QTZBOTg4MCwgMHgyQkMxNkY5MywgMHhDNDExMkYwQywgMHg4Mjg3QjQwRCwKKzB4NDhFQUJGMDgsIDB4MjlFNTY4NjAsIDB4MEY1MDVDODQsIDB4NDQ3REMwOEIsCisweDE2NjUxMTlDLCAweDAwMzQ3RTM3LCAweDQ4MkVGMDNFLCAweDAxQjE1RDQ0LAorMHhFNkMxQjlGRiwgMHhCMTY1RTQzNiwgMHgwQ0Y2OTBGNywgMHg3RkM1QkQwMSwKKzB4Qjc4NEM3RjQsIDB4OUJFMDRFQkIsIDB4OUY2MTQ0MzEsIDB4NkMzN0E1QTksCisweDJEMERCODdELCAweEY2NTExMzY5LCAweEUxMTUwNzNBLCAweEY5NkM2QUI2LAorMHgwNEExM0MzQywgMHhCRjMwQjJEQSwgMHg5M0QxOEZDNiwgMHhGNjdEMkU0NywKKzB4Q0EwODkxNTEsIDB4NTFBNkJDMzksIDB4OEMxRkNBOTMsIDB4RkJGMkYyQkIsCisweEFEMEEzRjMzLCAweDgyQUEyNzY3LCAweDgxQkYyMzEzLCAweDc1OEE4MkI4LAorMHhFMTAzNzg4RSwgMHhDMDBDNEI1QywgMHg1RjUyRkY1OCwgMHhBQkFEMzhGNywKKzB4REE2OEVFOUEsIDB4OUI2RDQwNUQsIDB4ODAzNDQ5RDksIDB4NjE3OEIzNDUsCisweDNDNzg1RkI0LCAweEZFQkFCRTU1LCAweDBFMjQ1OEFCLCAweDAyMUYwRDcxLAorMHgzOTIwMUVEMSwgMHg3NDFCMUE3RCwgMHhFMEIwQUZGNCwgMHg0NTY1MkNGRiwKKzB4OTA3REE2NzgsIDB4MzEzQTkzQjQsIDB4MEIwRDZCMEQsIDB4NDJDOTZFNDMsCisweEVFRTNFN0UxLCAweEU4M0M4M0U5LCAweDkwNTJCODY3LCAweEY5NTE0MjQzLAorMHg2MUYyMENCMiwgMHg1N0UxQUM2NCwgMHhDMjQ0MzEyMywgMHg0MzJDOTZENCwKKzB4NjE2QTgyNEYsIDB4M0M4RDFFMDYsIDB4OEU2NDIyMkEsIDB4NjVDMUEyMUQsCisweDg2ODYzMDhBLCAweDJBNTc2QTJGLCAweDFDQTBGRjIwLCAweDJDOEY5RDNBLAorMHhDOThDOUM2OSwgMHgzNTMyMkEyOSwgMHhERkQzM0M5MywgMHg5NjM0RjQxMSwKKzB4MEI0RjhGRkMsIDB4M0FFRDRCMDEsIDB4RUJCQzcwMTIsIDB4RUQyMzg3RUEsCisweDQ4QkY0MkFGLCAweEQ2MDM5OUQ2LCAweDdBOUI4Q0E5LCAweDUzODg2MzM3LAorMHgyREJCOTQyOSwgMHgwQTZBRjc2NCwgMHhERTREOEY3OCwgMHgxRURFQ0VFNCwKKzB4NEY4RUU5OUUsIDB4QUYyM0VBRkQsIDB4OTI5NTUwQjEsIDB4MkNCRDg2MjEsCisweDIyQThGQUEyLCAweEJFMkEwQThELCAweDA2RjdFNzk0LCAweDE2RTFGM0VDLAorMHgwOTNBQUVBQSwgMHg5MkQ0MjlGOCwgMHhCQjc5QTdFNywgMHg0M0VGODlCQiwKKzB4MEUwOTc1MTEsIDB4NzQ4RTY4QjAsIDB4MzIyQzAwQUMsIDB4QTYyRUY0MkEsCisweEQwM0JCOEJDLCAweDlGRjY3ODEwLCAweERFMjRCRjAzLCAweDE0MENBNkZELAorMHg2OEYxNkI0MSwgMHgxQjdDNjhDNywgMHgzMjY0NjM0MiwgMHhDNUU3MTRGOCwKKzB4RUZGRkQyQjgsIDB4Mjc4NDM2MjgsIDB4Rjg0NDVGNTEsIDB4QjlFODUxOUIsCisweDhFQjAxRDA0LCAweDM1NkZCRjJGLCAweDMyRTk2QkFELCAweDZBNjI5QkRFLAorMHg1MjA2MzMxMywgMHgyMDAwNjlCMCwgMHhFMTYxQ0Y3MSwgMHg4NEZCN0ExMiwKKzB4MTgwNUFEQzAsIDB4ODBGNzUwMTIsIDB4RkU5RTYyOUUsIDB4OTMzOTVDMzMsCisweEZGMDc1QTkxLCAweEI2MUU0NkI4LCAweENBOUZFN0M4LCAweDk3RENDQkNBLAorMHhDRUZGQjZGOCwgMHgzMEVFNzk4NSwgMHgxRkFCQzgyOSwgMHgyMEIzRjU3QiwKKzB4MjcwNDJCMDcsIDB4RTEyQzUxNTEsIDB4MjM0ODJCOEEsIDB4N0I5QjhFQjIsCisweEM5OTdGRUIzLCAweDc2QUIyNDk3LCAweEQ1Q0RBNTkwLCAweDlFQkU5MEZELAorMHhFMzczMkIxOCwgMHhGRjI4Q0VDOSwgMHhDNjU4MjMyMCwgMHg2RUYxMDZGQSwKKzB4OEVENzQwMjMsIDB4MUEwQjY5RTUsIDB4NEE5NUREOTEsIDB4QjQxQUY4MkMsCisweDgzREY2OUQzLCAweEM1NDg4NjFDLCAweDJGNjBCQTkzLCAweEZDODE1OTg0LAorMHgxQTg0OEI2NywgMHgxRUFFODdDNCwgMHhGNzQ3OTEwMywgMHg4RTE2REI1MSwKKzB4MDQwQjk1QjksIDB4MkE5REI4MTIsIDB4OTg3QUZDRDEsIDB4ODY2REY0MTMsCisweEJGOTU1OEVELCAweEFDRjFBRjJGLCAweEE2NTMwNUNDLCAweDE2ODMzNkYzLAorMHgxRTU5Qjk3RiwgMHgzRjlGNDQ3QywgMHgzRDU0QjMwRCwgMHhFOTM5RDU5OCwKKzB4MzZBNDA4ODUsIDB4MDIzOTY3OTQsIDB4RUIwRjBBNjcsIDB4Q0VBRUExMkYsCisweEM1OEI0QUM4LCAweEU2RDQ5NzYwLCAweDBGOEYyNzc2LCAweDY2QThGNDM2LAorMHgzMUJBQ0Q3RCwgMHgzNzY5OTNERSwgMHgzMkJEMDQzMSwgMHg2OEJEQzcyOCwKKzB4NjNFQTY3NDgsIDB4RTZCMDBFMjksIDB4NzQ0OENBQkMsIDB4NDJBNjUxN0QsCisweEJCMTMxM0M0LCAweEEwNERDOEZGLCAweDNENDAyMjM3LCAweEEzODI2NDVGLAorMHg1MkVENTVENiwgMHg5MkQ3RDdCNywgMHg1NDEyMzBGRiwgMHg3QUZDMDQyMCwKKzB4M0RDNDYyNEYsIDB4RDlCMjE5M0QsIDB4QTczQjk3MDQsIDB4QkJERTBGRjEsCisweDlFQjU2NjE1LCAweDhBQjA4MEI2LCAweDNDNEQ4RTE0LCAweDUwMDFCNDNELAorMHgxRUJGQUEyMywgMHhENEFBQ0QyNywgMHhDRkFBQjRCQiwgMHg2RkZFRTYxRiwKKzB4QUU1QTc0MjYsIDB4REI5NDI5NDksIDB4NDUyQzBCMTYsIDB4NzM4RTA2MzcsCisweDM2QTUxMjJELCAweEZGMUY3QTRFLCAweDc0M0QzNUNGLCAweDg0N0Q1NEE5LAorMHg0MkMzRUFCQSwgMHhENDY3MjhDNSwgMHgzMEIyNzA4RCwgMHg0RjZCRTBCQywKKzB4M0MyNjc5MEQsIDB4QjBCNjdDOEEsIDB4RUUwN0VGREMsIDB4OUUzODA2MTEsCisweEVBRDY4MDRDLCAweDRFRjY2MDI0LCAweDg0NTlBRTM4LCAweDFERUFBRkZCLAorMHhGNzY1NzNBRSwgMHg2Q0IxQzhGMCwgMHhGRkNDMjY3RSwgMHgyNkEyMTVGNywKKzB4MEIxQTA1N0MsIDB4N0RBQjlDQjcsIDB4RDQwQkNCQTksIDB4RTU2MUY5RkUsCisweEE0NDAxM0E2LCAweDdCMjJDMEI5LCAweDk5OEE5MjFGLCAweEJEMjUyNDRCLAorMHgxNUUwN0ZFRCwgMHhGMTVCMkUzMSwgMHg1NEU4MDAxNiwgMHhBMTJCQ0U3RiwKKzB4NjU4QTIwOTMsIDB4QjY0MkM0N0IsIDB4RDczMUZDMDAsIDB4QzAwRTMwMkQsCisweDU1QjI1MURDLCAweDM0MjkzOUVCLCAweDZFQURCMkY3LCAweDBDRjkzMzE4LAorMHg2MUVCRDg1QSwgMHg5OUI3MTVFRiwgMHg2NzlDOEQzQSwgMHg5Q0MxQjgwMywKKzB4QUJFRjk1NUUsIDB4QjhDRkY5RDQsIDB4NzA3QTgzOUYsIDB4RjVEMDJBN0UsCisweDU5RTBEOTAzLCAweDVBNDI1RTNCLCAweEJCNjExNjNDLCAweDk2RUNFOUFBLAorMHg3OTdCODJBQSwgMHhBOUZBNkJCNiwgMHg3OTdDMDBEQywgMHhDMUMxRkM0QywKKzB4OEY3RkRBNjYsIDB4Nzc5MDI1MTQsIDB4NkQxQjg0M0QsIDB4NEY4ODFGQTQsCisweEMyNEFENjI1LCAweEJDMjM3QTQ1LCAweDlBMkUwRjQ0LCAweDgyRkFBM0YzLAorMHhENzBFMzQ4OSwgMHg0RjJCMzQxNywgMHg2NUNGNjVFNCwgMHhFQUFFNkE5MywKKzB4NEJFQUVDMkMsIDB4NDkxODcyM0QsIDB4N0Q4RjMwQjQsIDB4NzcwNkY1OUEsCisweENCMkE3NDUyLCAweDUwODNEMkQ2LCAweDQ3MjRCNDI2LCAweDg0RUIxNURDLAorMHhCQUEyQzZDRiwgMHg3MUZBOTg0QSwgMHhEREY3QTNERiwgMHhCMTE1QkYxQSwKKzB4MjU4QUYwRTMsIDB4QTE2MzdEODcsIDB4MDM1ODVERjgsIDB4NUVBNEI4MEQsCisweDg2NDFGMzE4LCAweDY2RUUyRjI0LCAweEM4MUU1MDVFLCAweDVFNjQwNjM5LAorMHhEQjc3MzlCOCwgMHgxQTNCODYxRiwgMHgwRjVFQ0M1MSwgMHhCMjFDMDBERCwKKzB4NjgwRkYzMEIsIDB4REU2OTc0NjgsIDB4NTdBNDNCMzMsIDB4RDdFRjZCM0IsCisweDRCRkM3RDI1LCAweDcxMEYwNzUyLCAweEFCQUE5NzUyLCAweENGQ0ZEODRELAorMHgzQkNDMUNEQywgMHgyMzgxQzUyNCwgMHhCNjBDQUQ5MiwgMHhFMDVCQzFBQSwKKzB4MkI4ODdEODgsIDB4Q0Q0NTY2QzUsIDB4MEQyOTc2RTcsIDB4Q0IwMDBBMkMsCisweDY2N0JFQ0Y2LCAweEVGQzdGMjIxLCAweDdBNzU4NEQxLCAweEM0MUQ4QjJFLAorMHhEOUJCN0QzRiwgMHg3Q0VCNTYyNiwgMHg3RDgxNjVBMCwgMHhFRTE3OEY5OSwKKzB4M0U4QThDQjcsIDB4NjkzRDQ1MDEsIDB4QjBFMjI4QTUsIDB4RDU1QjczQzEsCisweEFGOTA0M0JGLCAweDZDNjI3QTJDLCAweDdCOUY0OTBDLCAweDdFQTYxODk5LAorMHg5MkI5ODBBRiwgMHg2RDEzQzc1OCwgMHgyQzAwN0M3MywgMHg3NDMzNkUwRCwKKzB4QTM5RjEzQUMsIDB4NTMzRjA1RDcsIDB4NzU1MzZDRkIsIDB4OTcwOERFMjcsCisweEUyQTE0RTg3LCAweDM2NjczRkVGLCAweDcxQkE2NTRGLCAweEI5OENEMkZDLAorMHgyN0YyOUE2RSwgMHg4MjQ3ODE3MSwgMHgxQzI4MTVGMCwgMHg4QThGNDU0OSwKKzB4MDQ4QThEOUIsIDB4N0NFRTUxRjIsIDB4QTE2NDhBQzMsIDB4MDA0RjhCOEYsCisweEI2RkU4RUYwLCAweDZEMTBBMEExLCAweEFEN0EyNEQ4LCAweDc1MDM5NzE3LAorMHg5Nzg0Nzc4NiwgMHgyNzkxQ0MwNSwgMHg2OTM3RkQ2RiwgMHg2MEY5ODExNSwKKzB4NUZBQjZEMzUsIDB4QzA1NTBBNzAsIDB4QzBGNEQ4MTcsIDB4N0I1QkZEREIsCisweEVGNjNCNEQyLCAweDZDODdDNkM1LCAweDk1NkQ2Qjg3LCAweDY5MTc5MjU3LAorMHgxMDk3M0M5MCwgMHg4Q0RCRTg2MCwgMHhDN0M3NjFFRSwgMHhGODIzRTM0RSwKKzB4NkZBMkNGM0IsIDB4QTkwM0FCQ0IsIDB4QzgyQzlCMDEsIDB4NjBGRTk2RTYsCisweEU1RUMzM0MwLCAweDczQTMwMTFDLCAweDJBMUI5MDU0LCAweENGMTZGOTJELAorMHg0RkFGNkNDOCwgMHhEOURENzRGRSwgMHhCM0M2MzlFRCwgMHgzRjQ3QUY2MywKKzB4QzhFOTlEMTIsIDB4OTJEOTU5ODYsIDB4ODM1QUNBNkYsIDB4RDUyOTMwQTIsCisweEM3REQ1NEE1LCAweDYxN0ZERDE1LCAweEU5QTZEMjk1LCAweEY1NkM2MDg3LAorMHg3ODEzQjY2MiwgMHgxRjhFQTI0NCwgMHgxQ0RFM0JBRCwgMHg1OEZDMEY3QiwKKzB4MDJFMzFBNUEsIDB4QTc4RUFDNzQsIDB4MTBDMDYxMDcsIDB4MjJCQTNDNjMsCisweEY4NEFEMjI0LCAweDZBOEJGNjZDLCAweDJBNUNBQUM1LCAweDhBREMzRkI1LAorMHg5NjgzNDUxQSwgMHgxQjUyRkNCNCwgMHg5NTQ5MUJBNSwgMHhGRTZDMzcxMywKKzB4RTkwOThDRUYsIDB4NzNDMDFFRjksIDB4NkU4NUVGMUEsIDB4RUUxODk3NDMsCisweDJFOUU1Mjg2LCAweEMxRkFBNjY1LCAweEQ4NjFFMzg0LCAweDcwMUM4MzRELAorMHhEQzVDQTVDQywgMHg1MkEzQTZDNCwgMHhGMkFGMkM0MywgMHhDMzdDNjQ2NSwKKzB4NkU5NEFENjksIDB4OTg4MDhBRjQsIDB4RUQ4QTk5RjIsIDB4Mzc3MjU3RDMsCisweEU2MEYyMDk2LCAweDYxNUVGQ0I4LCAweDY3QTJCQjNBLCAweEI0RERENDBGLAorMHgxRDQ3RjkxOCwgMHg4NkY3N0Q2RSwgMHhGRDA1RDJCOCwgMHhFMThDMzMwQywKKzB4QTQ4MjYwQTQsIDB4NTYxNUI4M0IsIDB4QkNEN0Q4NTUsIDB4RjgwNzMyMTksCisweDg2MjJCQjg5LCAweEQzNUNFMDVCLCAweDE3MTYyNDgzLCAweDEzN0JEQjY5LAorMHhFQ0QwRjIyNiwgMHg2MUY4OTgyQSwgMHgzQzEwQUJENCwgMHgyRjMzQUJGNCwKKzB4OTM1OEI1NDcsIDB4NThCMjc3QTcsIDB4OTI0NTZBN0MsIDB4NDM4NEI0OUEsCisweDVGMUZGMEVDLCAweEExNTNFQTRELCAweEE4RTQ5MTAwLCAweEQzQTc1NzIzLAorMHhEMUFEQzYwNiwgMHg3NkMzMTRCNywgMHhCQzZBQjIyNywgMHgyNTczMTJBRiwKKzB4OEI2QUExRTMsIDB4RDg3RkY1RTgsIDB4MkJBRUQzNzMsIDB4Qzg0OEFCNjMsCisweEI3MkIxRTVFLCAweDczMEE3M0Q4LCAweDQ5MTVFNUI2LCAweERGN0Q3N0FELAorMHhFQUUyNDdENywgMHg5NTU2RERBOCwgMHhERTBDOUM0NywgMHhBNEUzMjk2RSwKKzB4MzFGNUJDOTQsIDB4MDUyNThCMjQsIDB4MjgzNzM3NEYsIDB4QzdFNEM4MUIsCisweDVBMUFDODE5LCAweDA2ODA3NEFFLCAweERGODc2NzMyLCAweEMwMTkyRUY5LAorMHg3RkZEODREOCwgMHhGRjFDRTE0OCwgMHg4MjFCNEFBMywgMHg1NjY3NDgzOCwKKzB4RjlBMTQ3RjQsIDB4MTgyRUY1OEIsIDB4MTZFMTcxNzQsIDB4REUyNzAyOUUsCisweDhCRUM1NUFELCAweDQwNjQ2Rjg5LCAweERCRkY5MkZDLCAweDlGMjRDMDE3LAorMHg3MTFFQUQxOCwgMHhBNjYzRTFFRiwgMHhFRjkyRjY4NCwgMHg0QkQwNUU2NywKKzB4N0UwODlCMTMsIDB4Q0JGNjE5QkUsIDB4Q0VCRUYyMzEsIDB4Qzk0NzU4NkMsCisweDBGNTI2QzQ3LCAweDY2NzI2MDBGLCAweERBQUI2M0RELCAweDk1MEQ0RkQwLAorMHgxOTlDM0VDMiwgMHgwRjIwMUM5RCwgMHgwNkJDQzhEMywgMHhBNzY3MkM2RCwKKzB4QjM5QzdEMEMsIDB4Qzc0QjA4MDUsIDB4QzlCQkQyNDksIDB4QUNERDUzOTYsCisweEFCN0JERjhFLCAweDEyMDEyQjhFLCAweDY3MjM2MDQ3LCAweDBBRTA3NDFCLAorMHgxRDc0N0U1NiwgMHg3RUM2QzAwQywgMHhEMDhFODM0MSwgMHhCMEFCREFENiwKKzB4NEZBNEJERjYsIDB4OTBDRThEMEUsIDB4NkU3MzQxMTcsIDB4M0VGOTE5MkUsCisweEFDQTMyREEyLCAweEZEQjlDNThFLCAweDI1NjYyNkI1LCAweDVFQTk2MUIzLAorMHhGQkMxNTc3NiwgMHgzNjYwMkI1RiwgMHhGOEQwODY0NCwgMHg1QjY5M0MyMywKKzB4QzYyRUEzQjEsIDB4QzY2NEM3QzMsIDB4NzNCRTg4NTksIDB4MTdGNDRFOEYsCisweEY5QjhEOTIzLCAweEQxNjhBM0E1LCAweDZDQ0QxMTBDLCAweEQzNTMxODFGLAorMHhDMEU3NzRFQywgMHg1RjlFMTI3QywgMHg2QzgyNDUxMSwgMHhGREExMzQ5NCwKKzB4Q0I1ODhCQTYsIDB4NDcxNDg2OTQsIDB4QUI4NzdFODcsIDB4RTk3Rjc1N0IsCisweEY1NEQwQTJBLCAweDBGRTExODkxLCAweDVEODc0N0ZCLCAweEU3ODAwQzdFLAorMHhFRjk2Mjk4RiwgMHg0MDBGNDU4QSwgMHhFMkQwNDUxOCwgMHg0QjRFNkVGQywKKzB4OUIxNTAwMkMsIDB4M0NFMUI1MzcsIDB4RjVBQ0I5QjgsIDB4NjcwMzA2NDcsCisweDQ3NUZEMTQ4LCAweDFFMDNBNDBBLCAweDg5NkM3QzA1LCAweDg1RjcwQjY4LAorMHhDNTkwQ0E4NCwgMHg1M0I1NDQwRSwgMHgxNDAwRjc4RiwgMHgzQUJFN0Y4QSwKKzB4MTlDQTY3RkYsIDB4NjhCNTRBMzQsIDB4NTU1OTg4QUMsIDB4NEFCMTZCNEEsCisweDc1MTFGQTYzLCAweDI0OEVDOUVDLCAweEMyNUFGRTRGLCAweDE5RjU3OEUxLAorMHhFOTJBRjAzRCwgMHhBRjlERTE4RiwgMHgyNzk4QzdBNywgMHg2QjQ2OTkwRiwKKzB4NDFENDU4OTQsIDB4NzQ2OTZBMEEsIDB4QzZBQUY1RjgsIDB4NzJDQzEwRTAsCisweERCOUNBMjgzLCAweEQ2QkJEMEYzLCAweDU4RUE0QzA2LCAweERFQTVFOEI5LAorMHgxOTA4RUJEQiwgMHg5NUQzM0RENSwgMHgyMEQ3MDEzQywgMHhFNzI1QzI4MiwKKzB4RkQ0OEM5MkYsIDB4REJCQTdEMTksIDB4QzdCRUJFQTksIDB4QjE4NkI3OTksCisweEREMEREMTdCLCAweEQ4MDkwQTQxLCAweEY5OEJDMjBCLCAweEREN0U0QjlELAorMHhFQkFFNDI0NywgMHg0Mzc2RkRDNCwgMHg3RjNFRkFDNiwgMHhBOUI5QTk1MSwKKzB4NEFFMzkwQzQsIDB4NjUxODYzQUYsIDB4MkNENDJEQkMsIDB4QzJBMTM5NjIsCisweEVGMEZDNDQzLCAweEFFRTYzMjQ2LCAweDA5QjgzRTE5LCAweEMzQzk0MEFCLAorMHgwMEIxMjgyNiwgMHhDMEEzMDQxMiwgMHhGQ0Y2QUJDQywgMHgzQ0ZFNzIxQSwKKzB4NjJDMUY0QzYsIDB4RTk2M0EzNTksIDB4QUUxMUYzRDYsIDB4RTQ5MEQxMkEsCisweEM0NUM5MjhCLCAweDA1Q0NBNzhBLCAweDE5ODJFOTNGLCAweDU3N0Y4MUNBLAorMHg2NkQ1MEQ2RSwgMHhCNEM3MDMwRiwgMHg5MzA5MkMzRSwgMHgxMThCMDhGRiwKKzB4MTc4NTQ1QjcsIDB4RUVENzQ4MzgsIDB4RjdEMkNFNDgsIDB4MjM4OTY5QkMsCisweEI4RUZBRUFFLCAweDc1NzI2QTNCLCAweEIxRTAyMjBGLCAweEM0RDYwRUI2LAorMHgwRUJDMDI0MywgMHg1RkUwRDZDQSwgMHgzNTQ1NkI0NSwgMHgxRjY0QUMyQSwKKzB4NTg0ODRBMUYsIDB4MkExMTQ1NUQsIDB4MzNCQzQ0MDMsIDB4NTZFNEU2MkQsCisweDYwQjQxRTJCLCAweERCNjVEM0Y4LCAweDdFQzE4RDM0LCAweEY1NzVEQzg1LAorMHg2RTBCOTk5NSwgMHgxQzE0QzkxRSwgMHhCMkE5NDcxOCwgMHhBRUM0QTgyMywKKzB4OTkzRDM3NEUsIDB4RjFFNDIxMEIsIDB4OENGQ0MwM0EsIDB4OTlCRDFDMjgsCisweEE5MjhFM0Y5LCAweEJCOTU3RDBFLCAweDc3Qzg2NUVGLCAweDdGRjUwQTQ1LAorMHg0Mjc5QTYzOCwgMHhFNjI4RkZBMSwgMHhCQ0NBMTcxRSwgMHgyODRDOUNFQywKKzB4QTQ3NkUzNDYsIDB4N0UyRjlDMDgsIDB4QkY2NTA0NEYsIDB4NUI3QzNENUIsCisweDZFNjBFRTVELCAweEY1Qzk5NTA5LCAweEZBMzUyQjdFLCAweDZGREU4RThBLAorMHhGMjM0MEZFMSwgMHhERjU0MkI2QywgMHg1MTBDQjMwQiwgMHgzNjdFNzAxNiwKKzB4MTk4QTBBOTUsIDB4QTRERjUwOEUsIDB4NTkzQzIzMzgsIDB4QjEyQkNERTEsCisweDU1NEFEM0MwLCAweDREREFCMUMxLCAweEQyQkQxODUwLCAweEY2RTEyNkNBLAorMHhGODcyODlDNywgMHg4NkVDOTJBNSwgMHg0RTAzMzkwNiwgMHg1MkRDNUYzRiwKKzB4Q0M2RTJFNTksIDB4RkY3NTE3NTMsIDB4REY4QjhCQTIsIDB4REJGNTk1NEEsCisweEJEMzY3NDg4LCAweDZBMENERjFGLCAweDQxMDMxMzlDLCAweERFNDlEQkIwLAorMHg1QTg0MjhGNCwgMHhBMjY4NzJCMSwgMHg5NkJGNzIwMywgMHg5OUQ1RTc4RSwKKzB4MjQzODUwQTYsIDB4Mzg5REFEODAsIDB4NjMzNUQzM0YsIDB4RUM2N0IwQTUsCisweDAyOUMwQ0E5LCAweEY1RjZGNkM5LCAweERGNTc0QzE1LCAweEU2RDNFQzI5LAorMHgxQUEzNDlCQSwgMHg0NTNFNzI1OCwgMHg3REI3OUJFMywgMHg1MUZDQTdGNiwKKzB4MkI0MkZDQTUsIDB4QkYwRTQ4NzEsIDB4NTgwNjNDNDAsIDB4MTkzNTgwRTIsCisweDI1NjA1MzIyLCAweEJDNDlDNDc5LCAweDBFRDcwRkM0LCAweEE3OEI1OUEwLAorMHhFNkNFM0U4QywgMHg5MkVFNjU3QSwgMHg2M0QxMjUyOSwgMHhGOTVEQUY0NSwKKzB4RjkyQzNCRjMsIDB4N0Q1MTQyMDAsIDB4Njk0REY4NEEsIDB4RUYxNzdFMkQsCisweDRFMTE5Q0NGLCAweEEwMjVDNTVELCAweEY5Njk3NEQ2LCAweDI2RDEzRTdGLAorMHg3OTlBREMyNywgMHhENzkyNUVDMSwgMHg4QUU2MEJGNywgMHhGOUVGMUEyRSwKKzB4ODlFQUREM0EsIDB4OUMyOENBQ0YsIDB4NjMzNzdFQjcsIDB4NkQxRUY3RTUsCisweDY1ODVCMTZDLCAweDk5NzJEMTE1LCAweDY1RjhGNUU2LCAweEY5M0RFQ0I0LAorMHg2RDcxNjA1RCwgMHhDNkZEQkNCOCwgMHhEOTM3QkEzMSwgMHhDRUQ3MjdFRSwKKzB4QzM0QzU2MDUsIDB4MjVGQTcwQjYsIDB4NUMwQjdGQjAsIDB4OEY5MzQwRjUsCisweEEzMzc2NjkzLCAweDQ0OThCNjZBLCAweDJEMjFGMzc3LCAweEMwQTRDNkVBLAorMHgwNzgwNzM2QiwgMHhGNDJEN0YwNywgMHhFNTZENDdFNSwgMHhCNDhDMjVENiwKKzB4QTQ4REEwREEsIDB4RkU2OTY5M0YsIDB4RjAxRTE5Q0EsIDB4OEEwQzVDOEYsCisweERGNzAyQzIzLCAweEUxOEE5M0YwLCAweEQ0RDVDOTFFLCAweEQyQTcwNkY3LAorMHg2NzRGOUUyOCwgMHhBRjBGODBDNywgMHg2NDhENDlFOCwgMHg2QkU4NjQwRiwKKzB4RjVGQ0ZGRDUsIDB4OEVEQzM5MUUsIDB4RTU4M0Q4QkMsIDB4ODQyNkMwOTAsCisweEY0NTZBMjdELCAweDA3MjQ5QkY0LCAweDA1NEEyRjQ1LCAweEFDNDZCNzNCLAorMHhCODlFRURGQiwgMHg0OEVBRjg2NywgMHg2OUIyRDdDQywgMHhDQTBDQTBGMSwKKzB4MzhDRDA0MjgsIDB4MDI5ODA4Q0YsIDB4ODZFRTc1REMsIDB4RjRGRUU5RjAsCisweDY5ODdENUU5LCAweDU2QUI1NTM3LCAweDNEREQwOTQwLCAweDQ3NDJGRjg5LAorMHgyQzNCMTc5RSwgMHhEMDVCNUNCMSwgMHgzQzRFOTAzMywgMHg2QkNGMDE0MSwKKzB4RjJGNkQzRTIsIDB4QUQyOTdCMUYsIDB4QjFDQzIzRDQsIDB4NTQ1MjAzOEIsCisweDE3NTFGQ0JFLCAweDI0QUE0NjVGLCAweDk0QzYyRDE4LCAweEY0OUIyRUM4LAorMHg5N0FDNDdERiwgMHhENjZDMTlCNSwgMHgwOUFBQjI5NywgMHg4OTkzNjE0NCwKKzB4RDE1QzAyNkIsIDB4NENFQzg3NzgsIDB4OTQwNTBENjEsIDB4RDgxMkU5NkYsCisweEI2QkQ3QjEyLCAweEE1RjlCRTc3LCAweDUzMUE1QzdBLCAweDM2MDVCQTcxLAorMHhENTAwQ0U1NCwgMHhFMzI1OTY0QywgMHgzMjM0MzJGRSwgMHg1ODBBOURDOCwKKzB4RDI1QTMxMzUsIDB4MDg5RDZDOUMsIDB4NTg4NTZGNzMsIDB4N0RGQ0VFMzAsCisweDdERTI1ODBGLCAweEY0RTQ0ODhCLCAweDcxODIxRERGLCAweEQxOTRGNURDLAorMHg3RDA3MDM5NCwgMHhCQTI4QkY3NiwgMHhBQUYwQTM4RSwgMHhENEY2Mjc1RSwKKzB4MUI3NDJFNjYsIDB4RDlFNjhFQTksIDB4NjhCMEY5MzksIDB4NTJBRjlEN0IsCisweDU0QTM5NzA1LCAweDIwRjg0NEMxLCAweEU2OTgxRERDLCAweDgwMzIyRTYyLAorMHg1MzYyMzVCOSwgMHg3QTU3RjRGQywgMHgxNEVCRjM3NiwgMHg2NEJFMkU1QSwKKzB4NzBBMTg5MTAsIDB4MEZFMDk1ODcsIDB4MTBFOUNBNzgsIDB4OEY5MEQzRDIsCisweEFFNzQ3MTdELCAweEE1NDRFQUVELCAweDY3NDZBRjNFLCAweDQzMENCM0ZDLAorMHhCQzE4NTU3NiwgMHhFQUEzNURDMywgMHhEQTYzMDlEMiwgMHg0MDY0M0Y4NywKKzB4Njg4NTkxMTcsIDB4QTE3QUM4NEQsIDB4RDc5MjJDQTgsIDB4RUY3QzBCRUYsCisweDgzMzM3MzQ4LCAweDlCNEIxNzkwLCAweDg4NzZBNzdFLCAweEYyOTNDOUM3LAorMHgyMEQzOTlDRCwgMHhBNzgyMjRCQSwgMHhGRDEyNzlDOCwgMHg4Qjc4MzdDMSwKKzB4MEYxREQ0MTUsIDB4QUUzRkJEMkUsIDB4QzRGNzdCNTIsIDB4NTFFNzlGQjMsCisweDdBODU2RDlELCAweDE0QkZEQUQ3LCAweDk5M0ZCNjI1LCAweDY2N0M2NUVGLAorMHgzMkY4MzMzOCwgMHhBQTA2RURDRSwgMHhBQ0U3QTA5OSwgMHhEMjZEQUU4OSwKKzB4REM2ODkxQ0UsIDB4Q0QyRjZGMDQsIDB4Mjc0MjVGQjgsIDB4N0MzMDFEOEQsCisweDFFREVCRTFBLCAweEJFNTQwQUY4LCAweDFEMzU2QzZBLCAweDk2M0U4NjM5LAorMHg5OTIwQ0E1NSwgMHhERUZFNUY0NCwgMHgxMDdENTU0NSwgMHgzRDA3OUJFNCwKKzB4RUY2NzNGNjYsIDB4REIzQzI5NTQsIDB4REQ3NkQ2NjYsIDB4MURGQkVGNTksCisweDhGMzg0QjM0LCAweEJFNkY3NzNDLCAweDA3OUREMTg3LCAweDIzMTRBQzhCLAorMHg1RkVCMDExNCwgMHg1OUU4NUNGMywgMHg5QkZFOTE5MCwgMHhCMzYwQTMxQiwKKzB4NEY3RUY5NjcsIDB4RkVCMEQ1NjEsIDB4QkZFNzc5RjIsIDB4RjMzNzAyQjMsCisweEJCMjYzNDE3LCAweDA5NjA3QzY1LCAweEE4NzdGMTA5LCAweEJCNDNDRkYxLAorMHg0QTE5MERCMiwgMHg5QjdCRDM4RiwgMHhBRUI3QzQ0OSwgMHgzREIzQTQ2MCwKKzB4N0Q5Mjg1MjIsIDB4RDE4QUM5NjYsIDB4MTg3RkU3NjYsIDB4OTc2Mjk3OTIsCisweEY1OUQ1MDZFLCAweDZGQkEyMDJDLCAweDc3MDM1RkYzLCAweERBMDY4Q0RFLAorMHhFMTk1Nzc5QSwgMHhBRUI5MjI5OCwgMHhEMkE0NEVERCwgMHgxMjU3N0Q4NSwKKzB4QTNCNDdCOUUsIDB4NUJEMDdDQjcsIDB4NEI2QUUzRkMsIDB4QkUzNUI2RTIsCisweDlEN0Y3QUYyLCAweDlBMzhFQTc1LCAweEQ4N0ZCMDU1LCAweDMzMzlGMkEzLAorMHhEN0NCODJCNCwgMHgzNTc3MjFFNCwgMHhCRUY0NjU1MywgMHg5REUyOENBMywKKzB4MUIxRUMyREYsIDB4RTI5QjlDQzAsIDB4RUZBRTM0N0UsIDB4RTU4NjQ5MTcsCisweEEwOTdCNzEyLCAweDZCNjcwNDFFLCAweDVCMjk1NDJGLCAweDAxRDk2RUVELAorMHhGOUE2REMwNywgMHhDMEI1RTNGMCwgMHgyMUUxODk5QywgMHhFOTM3M0E4NiwKKzB4RjMxNzY1MDksIDB4OTUwODQ0QTIsIDB4N0QyNEZGRUIsIDB4NURDMEJDQTAsCisweEM0NDJCN0MxLCAweDM3REM2RUMxLCAweEM2NUM4QkE1LCAweDE4RjBGQTg1LAorMHgyQUQ4MEQyRCwgMHhDNjhDRENCQiwgMHg2QUU1RUM5MywgMHhFMzk1NURCRCwKKzB4M0U4MEM0QjMsIDB4NTBGRUQxMjcsIDB4NzQzQ0FCQzAsIDB4RDBFOTE3MDcsCisweDlCRjdFQjRCLCAweDdBNjMyNzU1LCAweDlBMTkyNDgyLCAweDhGOTIzRTlFLAorMHhFMkU3MEZFNSwgMHg1RjUwQUExNiwgMHgwRUM0OTZEMSwgMHhDNkVDNDg2MiwKKzB4MDQwQTAyNzQsIDB4MkZDOTUxQzIsIDB4RjY1RDNBODAsIDB4OEQ1ODUxNjMsCisweEM2QjUyOUQxLCAweEQyQ0FFRTZFLCAweEUzRTExMkI3LCAweDMyNDQzMTJGLAorMHgxQjM5M0U1OCwgMHgyNDQ0RDUzOCwgMHhCRTY5QUMyMSwgMHhDOTJBMDUwNiwKKzB4RDFBNzQ0MzQsIDB4NDlDM0VBMDUsIDB4MEU1M0IzMTksIDB4Mzg0M0NFMDMsCisweDhEQjg0MTVFLCAweDc2NkI2RkM3LCAweDUxNUI5RTdBLCAweDNCQTA1QjMyLAorMHhCRkFGQzQ0OSwgMHgzMTMwMkE1NywgMHgxOTYwQTIxMSwgMHg2NkEwOTdFMCwKKzB4QkM2NUE5QjQsIDB4ODlFODMwNjUsIDB4MzZGREJGMkMsIDB4RENENDY2NEEsCisweDBFRDZDRkJGLCAweERENERDNkRDLCAweEQ3NkQyRjAwLCAweEI2REE2NTQwLAorMHg5QTM5NjQ0NCwgMHgyOEYxODVERSwgMHhBMEZFRkExRCwgMHhGNDc2RTBFRCwKKzB4RUYxNTUwNUEsIDB4MTgzMzY1QkYsIDB4NDgxRkZEOTAsIDB4MjlBQkVFNzUsCisweDFFQzkwQjA3LCAweEMxMEIyNjU3LCAweDBEQkY2RERCLCAweDUyQUQwMkI3LAorMHhFODdEREI1NCwgMHhEMzcwNDEwNiwgMHhENEUyQzU5MiwgMHgwQ0IyREQwNSwKKzB4NEJBQTJGRkIsIDB4MDI2MTEzNjgsIDB4RDUwRjhGMUMsIDB4NDE2RkYyNUMsCisweDlBNjk3ODJELCAweDI2OEM2NDc0LCAweDJFQ0Q0RDY0LCAweDE5NkRFMkY1LAorMHg0N0E4NTYxQywgMHg4QzdDRTZDOSwgMHhEMkIxRTJEMiwgMHhBMDM4QzE2NSwKKzB4M0FCODg0NEIsIDB4NEE2OTk4MzAsIDB4MEZGQzBCMTcsIDB4ODlCNjg1QUEsCisweERBMjc2RDg1LCAweEU5MzRDNENELCAweEY1MTEyMjZGLCAweDlDREQyQjFGLAorMHg5NEY3NTQ5MiwgMHg1NUVDRUI0MiwgMHg0MkYwQTNEMywgMHhEN0VCNDgyQywKKzB4QTc4RDAzNzMsIDB4NjJGMDg4QTYsIDB4N0VDRjQ2MDIsIDB4N0EzNDA0QjYsCisweDQwQjM2NDk1LCAweDYwNDQxREY0LCAweDY3MjJGNTM5LCAweENGRTc2QzQ4LAorMHhCNkI5NEM5RiwgMHg5QURCNEI2QSwgMHgxRUJCQTY1RiwgMHg1QjUwODFBRiwKKzB4Qjc2NDQyM0MsIDB4QjZGOTEwRTMsIDB4MTRBQzRCNkYsIDB4NUM4MTFFODIsCisweEFBMzZFNUYxLCAweDI0RUM4MkFGLCAweEEyRjFDMDUwLCAweDA1MDQzMjRDLAorMHgzMDRDRUQwRiwgMHgwMUUzMUREOSwgMHhDODJFQzdFNiwgMHhENTVBRkZGOSwKKzB4RkZCMzA0N0IsIDB4MzAwNkYyRTksIDB4QzcyNUJDRDEsIDB4N0RDQzEwODIsCisweEE5QTIyQ0Y4LCAweDY0RDVBRjlELCAweDM4OUMzNEFELCAweDdERkYzN0M2LAorMHg0MUYxNTA5RCwgMHgxODQ1QjNGRSwgMHgwNTVDMjNGMCwgMHhDNjI5MUY1RiwKKzB4Q0REM0M3REQsIDB4NUYwMzU2QjQsIDB4N0ZEMkMzODcsIDB4NDk0QTA5MUUsCisweDUwQzY5RDNFLCAweEZFNzY5QTVBLCAweDYzOTA0NzAxLCAweDg5NjBBQkYyLAorMHhFNjhFREYzQSwgMHgwQUI1N0M4RSwgMHgwQjlEMEE2QywgMHg1MTg4ODE0OCwKKzB4NTBDNUQ1MzMsIDB4QzY5MDM4RkEsIDB4M0FDQkU2NjEsIDB4MENBRUI2MDEsCisweDhDMTRBQjZDLCAweEJBODZEOTRGLCAweDA3MjQwNTZCLCAweDBGRUZGQ0JBLAorMHgxMjQ0OUREQiwgMHhBQkZGRUNDRSwgMHhCMTJBMkJENywgMHg3MjYwQTBFOCwKKzB4QkUxODRBNDgsIDB4Q0ZEM0NBM0YsIDB4REYwODg2NjAsIDB4NzhFRTlCNjcsCisweEE5RURCMTEzLCAweDRGRDVEMzUzLCAweDhFMzQ4Q0M2LCAweEQ1NzhDMzM3LAorMHhGMDQ5M0JFOSwgMHhDQ0ZCNTRFQywgMHg5Q0VFRjg1QywgMHgwQ0FBRTE1RSwKKzB4MzcxQUQxMkYsIDB4OUM1QjkyNzAsIDB4MjQ5NUYwREUsIDB4MDZERTJEQkIsCisweDkxMUFFN0VDLCAweEVFREUzMzYzLCAweDZERDM4RDZDLCAweDJBRjdGM0Q5LAorMHg1MUM4RDExOCwgMHhGMjM4MThBNywgMHg5NTQzOEFFQSwgMHgzQThBNzk4RiwKKzB4MjMwRDJCRUYsIDB4M0QxNjI3M0MsIDB4OUMzNkZGODMsIDB4Nzg1Qzk1MzcsCisweDNFNDJBRjJGLCAweDEyQTE2NzQxLCAweEU1OEQwREM0LCAweDMzRUJFRkY5LAorMHg2RjE5NzJEQSwgMHgxMjhDOUJBQSwgMHg4NThENjAzMiwgMHhEQUYxODVFMSwKKzB4QUUzNTUwNjUsIDB4REUwMDg2RjMsIDB4MEY2NjFBNjUsIDB4RjQzMzQxNjksCisweEIxNTU5QkE2LCAweDM4OTIxMDlBLCAweEU5MDNCQTAwLCAweEFFMENCRDU4LAorMHgwNzNDMjFBMCwgMHhGQ0FEQjI5OSwgMHhCNEUzOUFGMSwgMHg3ODQ3NTQ1OSwKKzB4QjQ2REM4NDcsIDB4REJBOTc2NjEsIDB4MTVEMTE4RjUsIDB4MDFFRDQ4RDAsCisweDk5RjY1OEJDLCAweDM5OUZEQzhFLCAweDQ0RDRBOTE5LCAweDdDMkNFNEI5LAorMHhDQTAzNjdDQywgMHhDQzJCOTgyOCwgMHgxNkFBQ0FBNiwgMHg3QUE1QjZCQSwKKzB4RkVDNzdDNjYsIDB4MjMxQjIyRjksIDB4QzhCRTBEMDQsIDB4NkZGMjc4OEMsCisweDVGOUNFQkI1LCAweDkwMUVBQTVELCAweERFNjgyQkJGLCAweDk5OEU3MEQ0LAorMHhCRDlDQ0NEQSwgMHg2OTk1NDQxRSwgMHg1NzAyRjM2MCwgMHhCQzAzNUVFRCwKKzB4MjBGNjBCNTEsIDB4RDU3MzYxRDgsIDB4QzA3MTExM0IsIDB4NzNDRTZDRTQsCisweEM2NTY5REM5LCAweEQyNEI4OUVELCAweEE2MDUyMjc2LCAweDhDRUUyMDI2LAorMHhGQkY1QjU4RSwgMHhGNjkyREY4MSwgMHg2QjdDREQ3QywgMHhGNUI2QzA0QywKKzB4RUMxQkJBMjksIDB4RDZBQzhDREQsIDB4MzIwNDkxRjgsIDB4MUQ4MTJBQzcsCisweDYzMUIwMDUxLCAweEQwOEE0RDJBLCAweDU2OTc0NkRELCAweEFBNjUzRkNGLAorMHhBOTJFOEU3MCwgMHhDNTlBNjcwNSwgMHgyNzhFQTFGRiwgMHg2M0U1RkExNywKKzB4MUMyMEU4MkQsIDB4NTUwRjdDRTMsIDB4NTVDRUQ0MTUsIDB4NUY5QzRDNEEsCisweDdENzQ2MzExLCAweDVCMDc5NzZBLCAweDEyNDc3RTMxLCAweEFCODExM0FBLAorMHg3OTZFRENFQSwgMHg0QTkwRTRCNCwgMHhCMzZFNjE4OCwgMHhFRTdENUUwRiwKKzB4MTVDRUEwNjAsIDB4QjgxQUIyQ0EsIDB4Mjk2RDIyQjAsIDB4RkEwNzUzRTIsCisweDBEMEQxNUJCLCAweEQ0QUY4QkQ3LCAweDk1MUZBNTc1LCAweENCRUJENThBLAorMHgwQUY1QzM2MiwgMHg5RUY0M0ZCMCwgMHhEOTdFNTE4NCwgMHhBMTQ0NjlCQywKKzB4Q0FFNUQ1NUUsIDB4OTNENENERjksIDB4OTVCMDEzQTgsIDB4Njk5OEYzNUMsCisweEYxRERDMEIxLCAweDQ3NkY5RkM3LCAweEI2NDcyQjcwLCAweDFENTVBQzVDLAorMHhGMEUwQzBDOCwgMHg5NTM3MkJGNSwgMHg3NUNDQ0RCRSwgMHg5RjlEMjAwMywKKzB4Q0FBRDBENTEsIDB4RUU1NENDMkUsIDB4RTVFQkRCRjAsIDB4OUIyNDhCQjMsCisweDRCRjA3RDE5LCAweDU0Mjk5N0U5LCAweDE3NDQ3QzRCLCAweENGMkIyNzY4LAorMHg4NjExOEE1QiwgMHg1NzU3OUYxMiwgMHhDNUNEOUU3NCwgMHg5N0VENTcyNCwKKzB4MDFCRDJFRTQsIDB4MkEwNDAzQTYsIDB4MDE4MzM3NDEsIDB4QTFFOEQzNjQsCisweDREMUEyRUVBLCAweDYyNzYwMzc3LCAweEExMEQ2ODYxLCAweDA5QzY4RTJGLAorMHhBQjQ4Mjg1MCwgMHhBQ0QyNEI3NCwgMHg1MDM4QzhDQSwgMHg3MURFM0E5MywKKzB4NjcxRDI1RTQsIDB4OUVBN0FDMUEsIDB4M0U3Mjg3RjUsIDB4OUZDOTYzQ0YsCisweDczRjkwQUI2LCAweEM3NzVEODQwLCAweDAwQjg2OEQ5LCAweEY2QTlCRTNELAorMHgxN0ZGQjQ3MiwgMHg1RDIzODlFMywgMHgwRDQyQTE0OSwgMHgyRkFCMTIzNSwKKzB4OTBBNzk5OEUsIDB4RDg5NUY2RUUsIDB4MTk5MjEwMTMsIDB4RUU0MkVBNDgsCisweEM1RDE5QTE3LCAweDU1MDc4OTBBLCAweDlGODkzQjI5LCAweDRGRjM5RjE5LAorMHhENkVGODVBRCwgMHgzRkZCMTU5OSwgMHhGMTc2MTAxNywgMHhGQzUxQjkwRCwKKzB4OEY2QzU2NkIsIDB4NDRCQUM3QTQsIDB4MkIyRTM3NTUsIDB4QUJFQ0I4REIsCisweDVDNEExNjI5LCAweDgzN0NDNEY3LCAweDNFNzMyQjBBLCAweDgwM0NFMzAzLAorMHg3MTg2NUQ4RCwgMHgzNDY2NjVBQiwgMHg1OEJGODA5QiwgMHgxMDA2MjZBQSwKKzB4OTQ0NkFCMTMsIDB4RDUzQURDREEsIDB4NzVDMEJGQ0QsIDB4OTU4NTMzMDQsCisweEY0NzU4RTg3LCAweEQ2QjY0NTE3LCAweDEzMjkzRDBELCAweEVDOTM2OEZCLAorMHhENDQ5QTJDQywgMHhBQTE3QjBCRSwgMHg5RDBCODVDMCwgMHg3N0JFRUQxNiwKKzB4NzY5OUNBRTcsIDB4Qzc3NkQxMEQsIDB4OTYyRDQ4Q0UsIDB4ODM4RDAwQkUsCisweDI3OUFFQkY5LCAweDIyRUY4MzdCLCAweDU4RTQ2REFELCAweEI1NkI2MzA1LAorMHgzMjMyRDU4QiwgMHgxNjc5NjlEQiwgMHg1QjYzRjVCNSwgMHg3RTgyQjE3NSwKKzB4MDVEREI0MDIsIDB4NUFCMjlCQkEsIDB4RjNCNjI3RDUsIDB4OTcxNjhDODUsCisweEFEOUVFMDIyLCAweDQ4RjBDRUVBLCAweDg0MTA0QzIyLCAweDY5MEZDQzE5LAorMHhDQTJGMjQ3NCwgMHg3NkY5NTUzOSwgMHg5RkQyQjk4NywgMHg3OUVGQzU1NywKKzB4Q0VFNURBNEQsIDB4MjdFQjk4RjYsIDB4QTA2Mjg5MTYsIDB4OEUwNTYxNEYsCisweDhBQzg5MDI2LCAweDc3MDUxMzVFLCAweDNGN0U0MkI4LCAweDdCQ0Q3NzNCLAorMHhGOThCOTc0MSwgMHhDQjhBNTE0RSwgMHg5Mjk4MjIwRCwgMHg1NjY1RkEzQSwKKzB4RTY2QTFGRjcsIDB4QUM0RUNCNzEsIDB4QTdFNTZGRUYsIDB4OUQxRUY3RjgsCisweDIzNTY2QjY0LCAweEI0RkU4MjJFLCAweDFBQTUzMjA4LCAweEY0NTQ1RTVELAorMHhFQTg2Qzg3OSwgMHgxOEY2QjdDMiwgMHhFMTBBMTdBQywgMHhCRDM3MDExRiwKKzB4RkJERjgxQjgsIDB4QTk3OEE0RUIsIDB4RDQyNDM3QTcsIDB4NDc0RTZBNDEsCisweEY4ODg1MjQ4LCAweEY3NTBCQUE5LCAweEQyMzhFQTYyLCAweEQ2OUJBNzRELAorMHgyNjZFQzZCRiwgMHhFN0VERTA3NywgMHhFOEYwQTMwMywgMHg4QjU2QTk2RCwKKzB4NDEzODA5ODAsIDB4RERGMEIxNkMsIDB4MDBFODM1OTQsIDB4QTUwM0VCRjUsCisweDk2MEEyNThFLCAweDQ5OTgyN0JELCAweDZDOEU2RjdCLCAweDE2NkM4NDVELAorMHhDODQyQzkzNCwgMHhCQUVGQzY5OSwgMHhEOTg0NjIxMywgMHg4MzJFQzE5QiwKKzB4MUVBRDc1OTksIDB4MjIxRTdFRTksIDB4ODE3NkEzMTMsIDB4QjI4RDhFMzksCisweEJBQzI5QTk2LCAweEI5NjRGOTFGLCAweDNGMjY4MTUwLCAweEQ0QkI3MDExLAorMHgzNDdFQzQ0NSwgMHg3RkRDOUU4MiwgMHhFQjcwRjRDOSwgMHhBNkYzOEVCRiwKKzB4Mzk4Q0YxMzcsIDB4RDdGODhDRjUsIDB4Q0JERENCM0YsIDB4QTBEQUZBNzQsCisweEQyOUQzMEFELCAweDgyMkI2OTE5LCAweENFMDU5OTQ5LCAweDNBOTQ2MTgzLAorMHhERTRDNTcyRCwgMHhEMUU2RDg0NCwgMHhDNDNDN0RBQywgMHhEQkJFRUREMCwKKzB4QTY1NkRGNkQsIDB4NDU0QzIyQTksIDB4OUZBNDg3OTAsIDB4NjlCMDQ1MzEsCisweDk5QkIzMDVGLCAweDgwNTAwRjcxLCAweEZFMjM2M0MyLCAweEI2N0Y1MzhGLAorMHgzMDJFQzBDMywgMHg0QTZFMzQ1OCwgMHg1N0U0Q0ZENCwgMHhFNjVDREFFQiwKKzB4RjMxQUJCMzEsIDB4NjJERjk4QUMsIDB4ODk0QUU3ODEsIDB4QjE1ODhBQjEsCisweDQ1RDVDQzNFLCAweDM1MjBGNUIwLCAweEM3MkQwQ0I3LCAweEExRDZDQkY5LAorMHg3NDJGRkE2MywgMHhBMEE1MjI0RiwgMHg1RUExQzg1QSwgMHhCODFFOUY3NywKKzB4MzFENzZDNEYsIDB4NTI1MjU3RjUsIDB4QkZGODUwMDksIDB4MjEyNUIyNzAsCisweDE2RTQ3RTZFLCAweDkxMjhCOTgxLCAweDBENUZCRTM5LCAweEY2N0E0MThDLAorMHhDRjNDNzFDQiwgMHhBQzA0QUJFMSwgMHg5QjU1MEFBRiwgMHhCNTA3N0YxOCwKKzB4RkI3QzVFQzAsIDB4NjQ3ODREQjQsIDB4MUU2NjhCNDgsIDB4ODQ2NTk4MzYsCisweDYwNDQ1N0JGLCAweEY2RjY5QzhELCAweDM5NDMwMURDLCAweEVEMDIxMUJELAorMHg4QkFDMUEzQSwgMHhCQjc1MkZEMiwgMHg3OEI4QzAzNiwgMHhCQ0I5OEU4QSwKKzB4MzNDNTk1REUsIDB4QjNGM0M1RjgsIDB4Njk4NjY2QUMsIDB4QTFGNDJEN0EsCisweDU3NTFBQ0M4LCAweEMwNjk1NzVCLCAweDM1RDUwRjk5LCAweEIyOTRCRjM4LAorMHg4MkE0QTMzMSwgMHgwNTE0Nzc1MSwgMHhDQUUxOEMxMiwgMHg5RTg5QUFGMSwKKzB4MzUzMUMzNzIsIDB4QjIxMTRBODgsIDB4NDE3OTcyMDEsIDB4REREREVDMTAsCisweDAxMTg1RjJBLCAweERFRDUwQ0RDLCAweDcyMTU2QkFELCAweDg4RjNEQjk0LAorMHg1MDQ1MERERiwgMHg2QjFFN0FCRiwgMHgzRDMxNzcwOCwgMHhGREZGNUExNSwKKzB4REM4QjE2OTcsIDB4Q0MyMjQ4RkQsIDB4RDkxOTYyNzIsIDB4NDQ0NTE5NUQsCisweDU0RDkwMjgxLCAweDdBODkxQzlELCAweDY5RkY5OEQ1LCAweEFERTZENzRCLAorMHgyNkQyNzk3MywgMHgwRjE0NzM0RiwgMHgzRjk1N0ZDOCwgMHg4MTJBQzg3NCwKKzB4RURDMEY5QjQsIDB4RDMxRDZENzUsIDB4N0EyNjA4QzMsIDB4RDg5OTg0QjEsCisweEY1ODEwODFBLCAweEVEQjlERjZGLCAweDE2RUNDMTkxLCAweDZCOTQ1NzI0LAorMHgxQkNFODI2OSwgMHgwMkU2REI2OCwgMHg1NjM2MjU0MSwgMHg5RDI0N0NGNCwKKzB4QTUyNjVFNzIsIDB4MkM4Qjk0MTMsIDB4MTE1N0RCNEIsIDB4MzE0NUNGQjIsCisweEZCREVCQ0Y1LCAweDEwNDJCMTE3LCAweDI4NERBRTE4LCAweDEwNTc1QzIxLAorMHgxRERFNTc4RSwgMHg4MEY1OUVERSwgMHhDQUI1MUMwNCwgMHhCNTk0QkRBOCwKKzB4MDhBQ0VGODUsIDB4MDhDOEQ0QzcsIDB4NzMwNEQ0MzMsIDB4RTg3RDNBODgsCisweDMxQ0NGRUQ4LCAweDFEOEU3MUU1LCAweEM1QTJGMDJDLCAweEFDQkYzQjVFLAorMHhBQTE2MUJDQSwgMHhBMTBCRTU3NywgMHhGOUNFNDFEMiwgMHgyQjg2RjAzMSwKKzB4M0Q0QThEMjMsIDB4RUQ5MjZERTQsIDB4Mzg0NEUyMUYsIDB4RkU1N0JDRDAsCisweDM2REMzMDlELCAweDE3MTM3NDA5LCAweDlGNkE4NTA3LCAweDE0Q0YxMkVCLAorMHhBNzcwQUZCNSwgMHg3QzZEQTJFNCwgMHg4NTZCNDhCOCwgMHgyRUEyMzVERiwKKzB4NTVCRDExNjQsIDB4NUJEOUZGMEMsIDB4NTIyOEM1NTIsIDB4OUU3MTlBRkEsCisweDNFQzM3MDNCLCAweEUwNkE5NEYzLCAweDI5NkZGMEQ5LCAweEU0NjhEOUM5LAorMHhEMkExNUNEQywgMHg2QzRFQUFBMiwgMHgyQUYzQjhCRiwgMHg2QjZFREM3OCwKKzB4NDJCNzg5NzIsIDB4NEM5N0E2NkMsIDB4MTYxQzMwQkYsIDB4Q0QyODE2REMsCisweDQzMUJEQTE3LCAweEQ5NjUzMDIyLCAweDY3RDk1RTM5LCAweEJDQjE4MzQyLAorMHgyMjc5ODJFNywgMHgyM0M1QjExQiwgMHg1MTQ0MjBBQiwgMHgwODlGM0E1QywKKzB4MkIyRjgyNDQsIDB4MkYyQTgwQzgsIDB4QjBBOTA1NTgsIDB4NzVCQUEyNDMsCisweEUyRkM0RjYyLCAweEVCMEE2MTA0LCAweEI3RjIyMUIyLCAweDRFQ0Q3OURGLAorMHhCM0UwOEI4QiwgMHhCQTI1RTFDQiwgMHhEMzlGMzQzMSwgMHhCNTAyMDJGRSwKKzB4NzhGMTVFQ0UsIDB4RUZGNjFFQ0YsIDB4QjNDRERENTAsIDB4M0ZEMDY0QTgsCisweDk2QjAyOEJDLCAweEIyOURENEUxLCAweDdFOUVDNjI5LCAweEM0MDdGNEQxLAorMHg4QzIxNzg1QiwgMHhFMTE3NjdCQSwgMHhDRkU2REUyNiwgMHgwREE5OEUyMiwKKzB4MzNBQzU2NzAsIDB4MEZEQkMxNzUsIDB4RjExRjhFRjUsIDB4NjA2Mzg4NDMsCisweDhCNjdFNTVBLCAweDNGMjdGNzVCLCAweDY2OTFGQjk4LCAweDYzNUEzNUE5LAorMHhCMzE3NDU5QywgMHhFNzQxOUMwMSwgMHg4QkFCMjhENywgMHhFMzQ3RDc5MSwKKzB4RUZDMDE5QTAsIDB4NDUwMDkwNDEsIDB4QTZERUIzRTgsIDB4NkY3Mzc5RkYsCisweDBGRjUwMzkwLCAweDgxMEJFRTc4LCAweEFEMTM3MTZCLCAweEE3REJEN0FCLAorMHhFRjQzOUQ0QiwgMHhEREE3NDRBNSwgMHgzMUVEREU4RCwgMHhBODVCNzFGMiwKKzB4REY0MzlDNzAsIDB4QTdFM0RBOTQsIDB4NTI1RUQ0NTMsIDB4M0Q5MTNDMzIsCisweEQxMDRDRTYxLCAweDQyRjVGRkVELCAweDE0Qzc2MjVBLCAweDRFNUIzMTRCLAorMHhBN0VBRDFFRCwgMHhGQTAxRDU5NSwgMHhFNjdCQ0YwNiwgMHhFNjM2ODVFMiwKKzB4M0EzMkU5RDMsIDB4Mzc0QzI1RjAsIDB4QThFOEE0MUQsIDB4QTQwM0FFRjUsCisweDkwMUExOTRDLCAweDE3NjA1QkM5LCAweDg1MjJERDEyLCAweDI3MDk2QkFBLAorMHgwMTc0MzRCNywgMHg5OUM4RDJEQSwgMHg3Rjk2QjA2OCwgMHg4NTIxQ0QwOSwKKzB4NTI5QjQ2RDYsIDB4NDc4NTI4MTAsIDB4MDIxQkM4QkYsIDB4OTNDOTgzMjksCisweDZGRTczQTc4LCAweDQ0REI2OUE5LCAweEM4MzlENDkwLCAweENBQzQyQUZFLAorMHhDRjFFQ0NGNCwgMHg2RjJFNUY0NCwgMHg3OTVDODIxOSwgMHhBMDZDNjY3QiwKKzB4ODA0MTFGMzEsIDB4QjA5OTI2RTEsIDB4QzYyQjZDMTgsIDB4NzdDNkU2REQsCisweDc2MjJGQzA3LCAweDAyMTYyREIyLCAweDNFQTMxMzM0LCAweDZDQzAyQjRBLAorMHhBQTZCODFDMywgMHg0NDI0QTlBNSwgMHgyNkJEMkVGMywgMHgzMzQ4OTZENiwKKzB4QURERDI3MTEsIDB4NzYwMzU3NTcsIDB4ODBBQTMyOEUsIDB4MkYzOUMwNkUsCisweDM1NzUyMENCLCAweEY2MkJERjQ2LCAweEM1OTM0M0M0LCAweDdDQTRDQUUyLAorMHg4OUIwM0VGMywgMHgyNTFBNzg1QiwgMHhBNDc1NUJCOSwgMHgyNjJENDc4RCwKKzB4NDYyRTYyNTIsIDB4NkI1RjZCRUQsIDB4Q0E0NkU3N0IsIDB4QTJDRjA4QUQsCisweDU2MUUxOUVBLCAweEJGMzFBQTE1LCAweEQzNzZGNDRDLCAweENDMzMyMTUwLAorMHg4QzBBRUU0MiwgMHhDMDZENUY5MSwgMHhEQURGODYxMywgMHhCRTBGQTIyQywKKzB4RjUwQUU0ODIsIDB4RTM2MTU1MDEsIDB4RUNDOEQ1QUEsIDB4NThBN0ZEM0UsCisweEQ1OUI4Q0M5LCAweDA5REIwOTg3LCAweEYxRDk3NTNELCAweDlDNzlFMjBFLAorMHg5QTIyMkFFQSwgMHhDNEU1ODkxNCwgMHg2NzEyRTBBMiwgMHg4Q0Q1QzgwRSwKKzB4RUFCOEFBNTYsIDB4REJGQThEOUMsIDB4MzUxNUJEMjEsIDB4QjY1QjlFMEMsCisweEYwRDI3RkVFLCAweEUzMzg3MUMxLCAweEVFOEZFNTJGLCAweDAyQUNDQjNGLAorMHhFOTE5NzI3NywgMHhCN0I3MDc3MCwgMHhBMjZFMzU4MSwgMHg4MjQ4MUU3RiwKKzB4MDA1QUY5OUYsIDB4OEI5NzBCNEIsIDB4RUM3NEI2NjIsIDB4MkYyMUM1QTMsCisweDA0OURCQTgzLCAweDQ5NUIzRTFCLCAweDExMjIzNEI4LCAweDk1QjQyQTVGLAorMHgyQzhGQTgzMywgMHg2RDcwNkUzMCwgMHgyQUFBRUMwOSwgMHhERTdDMzM3NywKKzB4MDZDRTlENDYsIDB4NzU3NEVBQUIsIDB4RkNCMUEwOEQsIDB4NDYyQUZCNkMsCisweDE5Mjg0N0IyLCAweENDMTQ5QUMzLCAweDQyNzgzNENFLCAweEU5MDE4MEEwLAorMHg5NDZFNTI2RSwgMHg2MDE4QkU0RSwgMHgyMDQ0MkY1MiwgMHgxRDM5RkEwNSwKKzB4MzVGNjkwQUQsIDB4MjlEQjNBNTMsIDB4NjM2MDE1OEMsIDB4M0VDODE1RjgsCisweERFRDY1MEFGLCAweEZBMTY4QjM3LCAweDIzM0Y4QTNELCAweDI0NTAwOUNGLAorMHg3MUJCMjIzNywgMHg0OTg5QTAxQywgMHhENThBRTRGMSwgMHg2MkM5OUVBMCwKKzB4NDhFOTA1NkUsIDB4N0UxQTc4NkQsIDB4QkY2Q0JBQUIsIDB4MjI2NjlBNkIsCisweDU3ODU3NTkwLCAweEU0NTU4Q0UzLCAweEJDNkM2M0VDLCAweDZBRTAyQTYxLAorMHhBMkFCRkJCQiwgMHhEMkIyRkU5MCwgMHhERjhCREI0MywgMHhFQzJENTlBQywKKzB4N0I2QUZEQzMsIDB4NkIwMDFENUYsIDB4M0RGRUUwOEYsIDB4QjlBNTk3RDYsCisweDA5REVBQzY4LCAweEU0MkQ5RTczLCAweDJFMzM1MDdDLCAweDY1MjVGMDUxLAorMHgwRDcxNDNDNiwgMHgwMUREMTE1QiwgMHg5NDE4MDI3OSwgMHgyOEZDNjBENywKKzB4QzA5MDA2MDMsIDB4RUQ0RkJFNTMsIDB4RkMwNjc3QkQsIDB4N0RBMkE4NzgsCisweEE4RDBFQzczLCAweEY2QTA5QjJBLCAweDI0QTEyOUVFLCAweDE2OUJDQTJGLAorMHhFMEJBRTUyNiwgMHg1QzhFMkZDQiwgMHhBMjE4RUZGQSwgMHg4NDJCNjFGQiwKKzB4ODdCODYwQ0QsIDB4MTA2RTlCODYsIDB4OTMwNjg1RjAsIDB4QzVBNzIxMDksCisweEZCOTc3QkQ1LCAweDlEM0I0QUM2LCAweERBMzc4RkUwLCAweDBBQUY3NDdCLAorMHgwNDA4RDUwRCwgMHg0ODg3ODVCOSwgMHg4MUFFOTcxRCwgMHgxMkFERkVGMywKKzB4RjBCNjQxMjgsIDB4M0Q0QzkwQkIsIDB4Qzk5NEFBQTEsIDB4Qjg1NDQwMEUsCisweDkwMUFFM0RELCAweDdBNEEwREU3LCAweDE4RTA3NDU2LCAweDIwQzM4QkNELAorMHg5NDQ0MTk3NiwgMHhFMkU0MTlDMiwgMHhEQkQzQzkyRiwgMHg0REQ2Mzg0MSwKKzB4RTI5OTQ5NTksIDB4RjQxRjE5NkQsIDB4MDgzNTQzMUEsIDB4OTNBMkU5Q0YsCisweEIwMUZBQkVELCAweEQwMTM1NTM1LCAweEVCQ0VBMThELCAweEM0RjgzQTFCLAorMHg1RDcyODQ1QywgMHgwNDMzNUUzQSwgMHg2OEM0Qzk4NywgMHg3NzE3ODcxMCwKKzB4QzUyOTNBOUEsIDB4NDRFNDBBRTEsIDB4Q0U0NTRGREUsIDB4NzFERTg5QjcsCisweEEzNzNEOUQzLCAweDZEMTlFNDgzLCAweDgxMjg5NkQ2LCAweEMzMjMxQzE0LAorMHhFOTYwQUJBNCwgMHhCN0ZCNkY4MywgMHgxRjdDNEVCOCwgMHhEMTBEQkU2OSwKKzB4ODU3NUNGNkUsIDB4QzAzQjE1RDUsIDB4NEQ3RjRFRjMsIDB4RjA2MTVGMzEsCisweDM0RTIxNzYyLCAweDIyRDVBN0ExLCAweDcyOUZBM0Y4LCAweDJFMTA1MEZCLAorMHg4QTlGNDZEQywgMHg1MzVFQjVBNywgMHhEMTQzNTYwRSwgMHhGOEVDM0E0QiwKKzB4MjI0OUZEMDYsIDB4RThFMkFCMDgsIDB4MUU3MzQxMjcsIDB4QkE1QjYzNUEsCisweEQ4RjQxOURCLCAweDBCNTIwMEQwLCAweDgxMTAzMDRGLCAweDM0OTdEQTgwLAorMHgzNUNBNzFDRCwgMHgwRkQ4MjI3RSwgMHgwODZDNzRFMiwgMHhBQjY4QTFBRiwKKzB4RTNCRDU3RUMsIDB4ODNCNDJEMjksIDB4M0MyRDY3MkQsIDB4MDVEODVDRUQsCisweDY0RjA0OTI2LCAweDkxMzY0QTEyLCAweDdGQzczMzQ5LCAweEVCQTFGQzc3LAorMHhFQ0UwRDIwRCwgMHhCMUREREI5QiwgMHhFQjZCNDkyQiwgMHgwRkMwMkJCNiwKKzB4NTYyMDFENzYsIDB4RUQyMEY3OUUsIDB4RkM2MDM0RkIsIDB4NkE1MzlGMUQsCisweDUyMEZFQ0JGLCAweDRFM0FFQ0Y2LCAweDc2QjAxQzc0LCAweEVGQzQyMUQ0LAorMHg4MkFDOTg5QSwgMHg0MDdBNzdDRCwgMHg2RDI4N0JGRSwgMHgyNjYxNzQyNSwKKzB4RUEyMzE2QzMsIDB4ODYxNjU1NEUsIDB4OUY0QzQ1MzUsIDB4ODhDMEM2QzEsCisweEVBQzRGMEY3LCAweDMyQzdERDkzLCAweDQxRDlDMzdFLCAweDJBOUNCQjJFLAorMHgwNTkxQkFFRiwgMHgyQkU0M0YyMSwgMHg1RTA2RUU0RCwgMHhERERGNTUyNSwKKzB4RUMxMzdEQkUsIDB4RjBBQTI5NUMsIDB4RjJDOUZERTIsIDB4NURGOUQ2OTMsCisweDEwQTZDQUMwLCAweEM2ODQ2RDA5LCAweEYxRERBQkYzLCAweEQ1NkY4QkJDLAorMHhBQTVEQ0U5RCwgMHg2RjU5MDA0RiwgMHhCOEEwMzVCQywgMHg2MUY0NzI4MiwKKzB4Qzg5REFDOUUsIDB4RkM3RTVCM0QsIDB4NEM1NDA2REQsIDB4NTRDRkQxNDcsCisweEJCNDRBQjJBLCAweDc5MTI2OUMwLCAweDhDRjY2QjRELCAweEQwMUEzMTkwLAorMHg2MzZGNDVDQSwgMHhCMzJGQzIwOSwgMHhDQjhCOUY0OSwgMHhGNDZENzRCOSwKKzB4NUFGQzlCRDAsIDB4QzRDNzE2QzEsIDB4Rjk4QzU0RjMsIDB4MzZBRkYwMTMsCisweEI0RDZEOTBCLCAweDVGMTI5OUI2LCAweEEzQkZDRkE0LCAweEVBMzM2QUFELAorMHhDQ0Q0NDNEQSwgMHg3NENBNDBCNCwgMHgzMUVGMTYxNCwgMHgzNkQzRkZFRSwKKzB4ODc2QUUyNTIsIDB4QzhENjJFOUYsIDB4NjQyNEYzOTcsIDB4MUY3MzBGMkQsCisweEIyMEZEQTUzLCAweEZDRkVFNjBGLCAweDY3NkE2MUMzLCAweDI2QzVFMTQzLAorMHhDMjAxNTczRSwgMHg0QThDNDZCRSwgMHhFRjg3RDBBOSwgMHhFMDdFODBCNCwKKzB4MzRGMjAxMDksIDB4OEI5MzZBNzAsIDB4OUY4RTAzMDUsIDB4RjMyOTdDQTAsCisweDRFN0JGMEU5LCAweDBGMzc0QkI5LCAweENFNzhBMDFFLCAweDVGRTI2REQ4LAorMHhBMzgyNkFDRiwgMHgzMjFGNjlBQiwgMHg0NDFBRjE0RSwgMHg4QUMxOUNGNywKKzB4NEJGRDFBRDYsIDB4NTk1MUFCRDEsIDB4MDk4QzE3RjAsIDB4QTlCNzVGNzYsCisweEE0NjI1NTFCLCAweDZCNzAzQTEyLCAweEVEQ0I1N0IyLCAweDhDRDRDOTMzLAorMHhEMzM4RDNEOCwgMHhFMzQzRkMyNCwgMHg5Q0RENTJFQiwgMHgxN0E0MTk0MiwKKzB4NjNBOEVGNTAsIDB4MjE1QkIxMUEsIDB4RTFFMjVDQjYsIDB4QjYyQzBBODgsCisweEU1OENERUMzLCAweEMwRTYzODlBLCAweDJCN0JFRTU1LCAweEEzRkNCRDA3LAorMHg3Q0Q0NTFGRSwgMHhCMDZGNjcyNCwgMHg1Njc1QTdFQSwgMHgxNDFENTJGQywKKzB4MDVFODZFOUIsIDB4NTNENzVDM0EsIDB4RTc5OUFBMkEsIDB4RTQ3NDM4NEMsCisweDhDODVFNkU2LCAweEE0NzdBOEQ3LCAweEExRTZBQjBDLCAweDkwMzNFN0NELAorMHgyRjU1RDUwNCwgMHg0REFFODFGQiwgMHhCRDIyOUE2NCwgMHg4NjI3NjVDOSwKKzB4NUI2QTg1RjAsIDB4OTVBMzkzMjgsIDB4Mzg4MjZDRkIsIDB4QkY3REVCQTQsCisweDQyRUZBQjYyLCAweDJEMEJCQTYwLCAweEIwNjczMUFGLCAweDE2RDRDNEIwLAorMHhDQTRCOTI2NCwgMHgzREYyNEFFMiwgMHhGRUQ5Mzg0OCwgMHg3Q0IzM0IwOCwKKzB4QUM5Q0FFOUYsIDB4QTBGODBCNjEsIDB4QTY2Q0Y3MTMsIDB4OTM2NDg2NUYsCisweERGQTFFMEIzLCAweEZFNkRGMzNGLCAweDgwMzlBNjEyLCAweDExOUY2MEJGLAorMHhDRUVERTMwOSwgMHhEMjgzMTZBOCwgMHhDRDYxRDJGNSwgMHgzQ0JFQjAxNSwKKzB4ODVDMEJGNTEsIDB4NkVEQkJDMTUsIDB4NzlGM0QyMDcsIDB4NDg1RUU0RkEsCisweENFQzMwMkVBLCAweDU5RDhCOTJELCAweDUxQzFGQjM2LCAweEY0RkU4QjcxLAorMHgyREJENTcxOCwgMHg4NDAyNDA0MCwgMHhGREQ2NTkwRiwgMHhBMUNFOUNDOSwKKzB4QzRBRUFCNzIsIDB4MEEyRkU4QkYsIDB4MjhDMzM2MTgsIDB4QkE0RTE1RkIsCisweEE5QzcyODE5LCAweEEzRUU0NUQ3LCAweEQyREM1MkYxLCAweDNGQzg0QTJFLAorMHgxQzlERjczRSwgMHg2MzJGOUJERSwgMHg3RTlGQkQyMCwgMHgwRDY4OUI3OSwKKzB4OTFFOEQ1QzAsIDB4NkVFNzk1MkMsIDB4OTA1RjE5MkUsIDB4MkQ3OUU3MTIsCisweDg2NzBBN0EyLCAweDFEQkZDNEQ5LCAweDY0NjM0NDI5LCAweEU2MzYwNDNCLAorMHg2NDNDNkIwRiwgMHg1MEFGMzI3QiwgMHgwRTczNEQ2MSwgMHgyRDdENkU0NiwKKzB4Qjg3N0RDRDYsIDB4N0NDRjRGMUEsIDB4REY0RDhDRjgsIDB4MEU3RkE3OEUsCisweDBDQkM0RUMyLCAweEFFOUI0QTIyLCAweDRGMDJENDlDLCAweDQ4RjA5QzQzLAorMHg1MDMxQjFBMCwgMHhEQ0I4QTFGQywgMHg5MUM3MzU5OSwgMHhDRjAwQTY0RCwKKzB4REZDRTU2MUUsIDB4OEIxODE1N0QsIDB4RTFFRDZBODEsIDB4Q0Y5NEVGMzYsCisweEI0MTJDRTFBLCAweDYwMkUyMDc2LCAweDcxNkIwRjNGLCAweEFERUIzMkMwLAorMHhENEUxNjA5NCwgMHhFQzk1RDQxRiwgMHg3NTg1ODc2NywgMHg0MzhBRDFBMSwKKzB4RTYxQzU1MjcsIDB4MEQ3MUZCQjIsIDB4MkE5OUQwNzAsIDB4NUMwMTg4MjYsCisweENDQ0MyN0ZELCAweDA1Mzg4M0Q5LCAweEYxRDMwRUY1LCAweDY3NkFEMzhBLAorMHhERjgxQUIyOCwgMHgyMjU3RkI5RCwgMHgzNzMzMTNBRSwgMHg2N0UxRkU4QSwKKzB4RjRGNjZCMDIsIDB4QUZGOEM3RkEsIDB4M0I2MEQ5NEQsIDB4RDQ0RDBGRTIsCisweDVGQ0RGRTRCLCAweEM2MzAxMEI2LCAweDA2Q0ZDQ0Y0LCAweDA5RDhERDg1LAorMHhBQjc5RjJCRSwgMHhENUMwQzQ5OCwgMHg3MzY0RTRGRCwgMHhCMjk1Q0VERiwKKzB4REI4OUEwNjgsIDB4NTlBNkEwQzcsIDB4MEM4MjMyMDcsIDB4NzM4MEZDRkUsCisweDZFMzNDNEI5LCAweDA3NDRFNEYyLCAweEY2NjNCQjMzLCAweDlFRTUxMkNFLAorMHg4NzBFRDM1QiwgMHhCNDUwMjY1NCwgMHgzNjdDRDRGRCwgMHg1RDQyMzhEOSwKKzB4RUFCMkI4NkUsIDB4NkU4QUREQUEsIDB4RjA4MEVERDYsIDB4MURDOTBGNDYsCisweEIxRkM5MTI3LCAweDYzNzcxMzkyLCAweDk2NzI5QkY2LCAweEQxOEUxNDEzLAorMHg1RDg1OTM4RCwgMHhCOENFRDM0OSwgMHhGOUI4ODZDMSwgMHhDQTQ4NjU2MiwKKzB4QkFBOUVEN0EsIDB4MDQ5NzE4RDgsIDB4N0NGOEU2N0EsIDB4MTcwMjg0M0MsCisweDZEQ0RDMzRFLCAweDkzQzUxRjgzLCAweDI0MTVBNEYzLCAweEE4RDc3QjNBLAorMHgwRkI4MjNFOCwgMHg0MjRGMDNDMywgMHg5Q0FBNTAzQywgMHg3QUE1NDMzRiwKKzB4M0JERDc0RkUsIDB4OTlEMzMzMkUsIDB4MUU2MjIzMUIsIDB4OTBBNEU1OTUsCisweDdFREE5NzRELCAweDQzRTJDRDE0LCAweDI3REI5RDlGLCAweDU2MUY1Q0M2LAorMHhBNzdFQUJBNiwgMHg5Nzg2N0I0OCwgMHhBRDY1MzNDRSwgMHhFQjcyNkNGNCwKKzB4NTg1N0IyMTcsIDB4MkQ3REExMEIsIDB4RDkzOUMyMEUsIDB4ODFGMUYwNzMsCisweEY0MkRFQUYyLCAweDNBRDc3ODBFLCAweDg4Qzc3NjYxLCAweEQyRTgxOUIyLAorMHhGODcyRjU4MSwgMHg5OTlGMEM1QSwgMHgzODg3QUJBNCwgMHgyN0Y5NUI2RCwKKzB4OTkxRDk0NTgsIDB4OUQxQkIxMzEsIDB4NkVDQzUyOTgsIDB4OUU5QTdCMjYsCisweDZFNjVGMjcxLCAweEU5MEZBMDRDLCAweDdCNjkyQUEwLCAweDg3ODk0M0Q1LAorMHg5MjQ4OTVFNSwgMHgwNDFCQzczQSwgMHg0NDhFMjhCMiwgMHg2MUQyMkQxRiwKKzB4RTc5Njk3NzMsIDB4QkM4RTU5ODAsIDB4OUExOTg4NTIsIDB4Qjk0NDE1QzksCisweEEwMjM3NEJBLCAweDM0MEJENUYzLCAweDI3RjJBMEZGLCAweDM5QkRCMzNGLAorMHhDQzA0MkJDRiwgMHg4M0Q2QzEzNSwgMHg5QzdBOEQ4RSwgMHgwNTgyM0MyMywKKzB4MkQ3QTNGOTEsIDB4RTc5MkJDQ0EsIDB4QTJEODIxNzcsIDB4NzNDODJFN0UsCisweEJFQkM5NjEzLCAweDlGNTk2Q0IwLCAweDZFNzg0QUE3LCAweDFCN0JEQTlGLAorMHg4NDYzOTFGNywgMHg4NTJBRDA3MCwgMHhGODMxRThDQSwgMHgxNkE3ODIyMywKKzB4RjY4RjUyNTAsIDB4RTI1NTQ0OTMsIDB4RDM4RjJBRkIsIDB4NzY0QkE3QTgsCisweDNDQUVGQzU1LCAweDZFOUI5MDM3LCAweEQ4N0Q0ODZFLCAweDczNTJBRUE5LAorMHgxMTk4N0VFMCwgMHhERjdFODREQSwgMHgyODM4RTczNiwgMHhBOEM3QkFDMiwKKzB4RjQ5RTIxRUUsIDB4RkFEMTA2RTksIDB4NzM2M0FDNkYsIDB4NUU5OTc0Q0IsCisweEJBMDA4QkIwLCAweEFGNURCM0ZDLCAweDdBQzNDRkQ3LCAweDJENTVFREM2LAorMHgyQzFDOUFENywgMHg2QTNBQTQ5NCwgMHg1RjBFMEEzQSwgMHgzNzQyMkJGQSwKKzB4ODNCNEQ1OTQsIDB4QjdFQ0NGNjYsIDB4ODJGQ0NERDAsIDB4OEVDQkZENzksCisweDY2NEI5MzQxLCAweDAyRjE3OEEyLCAweDIwOTVDOEUwLCAweEZDNUYxN0I3LAorMHgxODEwQkE5QiwgMHg5NjRFNENEMSwgMHhGQkFFRDgwOCwgMHhERUU4Nzc5NiwKKzB4NjNERTRGNjksIDB4Qzk5Mjc1REQsIDB4NjUyNDIzMDQsIDB4N0FCNUMyOEIsCisweDAxQkI3QTNCLCAweEM4NUQ3NzE2LCAweDMyQUZCOUEzLCAweDJFRDJDQkIxLAorMHhCMTk0MjE4RiwgMHgyMUZFNTYwRCwgMHhDQjQ1MDNBNSwgMHg1Q0UwNDY0RCwKKzB4QzRBRTlBM0MsIDB4MDYxNTMwQ0IsIDB4RURBMzhFNkIsIDB4NDAyOUQzRTYsCisweEIwQzIwMzM2LCAweEEzNzgyNUMwLCAweEM2OEY4QjM3LCAweDk0MDVBRDNCLAorMHg4QjFBOEY5OSwgMHhBNzYxREU4QiwgMHg2ODNCMzI1OSwgMHhBMTU0QzU1NCwKKzB4NkJEODM1QzksIDB4NkRFQUUzNUEsIDB4QkVBRTZENDksIDB4MjFEOEIwNzQsCisweDQ2QzAxQjMxLCAweEJFOUIzQTE2LCAweDFENjExRUFBLCAweDQyM0FCNzRDLAorMHg5MzFGNUFGNSwgMHhCQjlFMjg5QSwgMHhBNDEwMTEzMiwgMHg0QThCRTBENywKKzB4MzMwN0U0QjIsIDB4REU3OERCNUUsIDB4MzQ3RUI1Q0UsIDB4MTNFRUU5OTksCisweDJDMkQ3OTU1LCAweEJBODkzRUJBLCAweDVERkMyRUMxLCAweEU3REQ3QTVGLAorMHg1RTFDNjREOCwgMHg0NTUyRTQ0NywgMHgxODM3RDhFNCwgMHg5NzExODM2QiwKKzB4MzIxOUY4OTMsIDB4MDQzOTJDODQsIDB4M0U5NDg0OEMsIDB4MTVFNUY0ODEsCisweDBFQzU4ODE5LCAweDczNDFENDU4LCAweDRBRTYzNzExLCAweDg1QzFGRDFGLAorMHg5N0I1OEJENywgMHhCMDU1MEVCRSwgMHhCOTEwODc0MywgMHg2RjUzQjM4NiwKKzB4N0E3M0YzMUIsIDB4RTA3Q0Y4QjksIDB4NjFGRjI3QzgsIDB4MDZBOUE4QjQsCisweEVCMEYyQkI5LCAweDQ2RDI3NUZCLCAweENGMzlCNDc0LCAweEMzNEYzQjZELAorMHg1MkYyRjExOSwgMHhEODc5NjNCRiwgMHhDNjBCRjE2QywgMHg3Nzk3RDBBRCwKKzB4N0VBNERCRjAsIDB4RDIxNDA5QzcsIDB4RjY3OEE5MjcsIDB4NjM4RTY3Q0QsCisweDkzMjYxQUVELCAweEVBOUIyNUZFLCAweDFFQkNBRkRDLCAweDU4MENDODI5LAorMHg1OEQxREExQSwgMHg2NTg4ODFGOCwgMHhDNDhEQjY4MiwgMHhENDJFOENCNCwKKzB4MURGMzNENzQsIDB4MzFDMDRGNjgsIDB4N0Q4NzFFMjksIDB4QUUxMUZENzIsCisweEQ3RThGOEY2LCAweDUzMEQ5RDlDLCAweDU4MEEwNzE1LCAweDBGMTdCMUEzLAorMHhCODYzRjQyRiwgMHhBNkE0REMwOCwgMHg4Mjc3M0U3NiwgMHg5MzU0QjMwOSwKKzB4RTE3RDA3NzAsIDB4MDRFNERFNUIsIDB4NzEyRUEzOTYsIDB4NDlEMzdCNTUsCisweEFFNDEwOUJBLCAweDAzODYyREM5LCAweDdCQ0Y2MUQyLCAweDQzQ0EyMDE3LAorMHgyM0JERDUwRiwgMHg3NDU3NzQ1OSwgMHg0RThGNEUyMywgMHhCRjkyNEMxQSwKKzB4RTRFQzcwQ0UsIDB4MzdGQkVDNjYsIDB4QTZEQTg5MzUsIDB4RTExRjQwOTAsCisweDVDOEY5RUUzLCAweDE5RDE2N0VDLCAweDlFRTRGMkM1LCAweDY0QTgxRTZDLAorMHhCMzU2NDJCQiwgMHg4MjA4M0EwMSwgMHgwMDFDQTFGNiwgMHhBQTY5QzdFOCwKKzB4Njg1RjI0RDksIDB4RTY4NjhFMzEsIDB4MzhBREQ4RjAsIDB4QTJGREQ0NEUsCisweEVFMEM0OTFELCAweEM2MEIxRTlBLCAweEY3QTg5MjY4LCAweEZENzg0RjM1LAorMHhDNkI3MzM1QywgMHg3NUVGQ0VDMSwgMHhFMkQ5RjdDRiwgMHhFMUMzNjRGOCwKKzB4N0NDNjNCMkMsIDB4QzE3OUUyQUQsIDB4NTZDMTkzQTUsIDB4NTEzNEZCNjksCisweDM1MDU4QkI1LCAweDM2RjRCQ0Q1LCAweERGNEEwOEMyLCAweDE0QUEyMzMwLAorMHg3NjBDOENEOCwgMHgyQzU2MjM5NCwgMHgwQkVCNjY5QiwgMHgyMzAxOTczQSwKKzB4QUY1QzRGRjIsIDB4MUM3NzBBQUIsIDB4MjVERDIwODcsIDB4NzMyQUFEQzQsCisweDU5MDU0OTU4LCAweDU5RERDQkU0LCAweDc0Q0ZDOEE4LCAweDdDMDE1MDE2LAorMHgzMkEwMjc2RSwgMHg4RjFDMkU5MywgMHgwQ0U5MUY3MSwgMHgwNTVDMzA3QSwKKzB4NDM1RDk2N0UsIDB4RjRDMzM3MDQsIDB4NUJERjJBRDcsIDB4ODg1NTA5OUMsCisweDMwN0IyNzM2LCAweEJCNkIxOUNCLCAweDYyNjM0OUQzLCAweDhGNTJBQkZBLAorMHgyNTFBMUVENiwgMHhFMDU4N0JDMCwgMHgxMjgzMTQwOCwgMHhEQTgzQ0FCRiwKKzB4QUIyQzdERkQsIDB4NkJDRjAyNzEsIDB4NzIwNThERjAsIDB4MTdBRkMxREQsCisweEZGQzUyQzMwLCAweDU1MTQwMUUwLCAweDlFRUQ1NERGLCAweDE0RTk1MUU0LAorMHgxNDYyNEIzRiwgMHg0QzI0NjUwQiwgMHg1QTY1Rjg2QiwgMHhFOTRGNjE0MywKKzB4REM3Q0U5Q0YsIDB4OTRENUQ4RjMsIDB4MDkzQjBBMDQsIDB4MjIwOThEMDEsCisweEVERjA5RTdDLCAweDE2NUVEQjBGLCAweEQwOUNBNzc0LCAweEI5NkFBMTQxLAorMHhCNTc0NTk3OCwgMHg5RDgyMDQzNCwgMHg0MkIwRTAyNiwgMHg5NjkzOEEyNSwKKzB4NzJFODYzNEIsIDB4QkUzNkVDMDIsIDB4NDJGM0Y3NEIsIDB4MzU4RkE2MjEsCisweEJENDUxNDg0LCAweEI0M0E3NUQxLCAweEIwQTU3RjkxLCAweDcwMUE3QzgyLAorMHg0ODRCM0Y0NiwgMHgwNDdGNzhBRCwgMHg2NUY3MzcxQywgMHhFQUM4QTk1NCwKKzB4RTU5RjYzNTQsIDB4M0VFRUZCNEUsIDB4RjEzMTk1NEIsIDB4MUMwMEJBQzIsCisweEUzODk3NjM3LCAweDVGRUM4M0FCLCAweDU4Q0ZBMkM0LCAweDFGNEMwQTZBLAorMHg5Nzk1NkJDNiwgMHg2M0QxMUQ3RCwgMHhCNDYxNzlEMCwgMHgxMTAzOUE3NSwKKzB4MUI1MEUwODgsIDB4NjhFOTQ3NkIsIDB4QUE2OERCNTUsIDB4OEE0QTA1MUUsCisweEVGQTBEREY1LCAweDA1QTJBNjc0LCAweEZGRTAzRTcyLCAweEM1QTAyOTVDLAorMHg2RkQ0RDgzNCwgMHg4RTQyQkI5NCwgMHhGM0RGRDg4RSwgMHhCQTY5MUFEMiwKKzB4MzQ1ODQ3M0UsIDB4NjI2OUEzNDgsIDB4NzI5NjJGQjYsIDB4ODZENTA2NEIsCisweDhBMTUzNzQwLCAweDU0QUM5N0Q4LCAweEVEMkNFMDU3LCAweDY4MjAwNDc0LAorMHhCQkE4RTE5RCwgMHhCRkREMDhGMywgMHhCMERGNzZEMSwgMHg2MkYyOTY0OSwKKzB4NUFCNzcwMzAsIDB4MUVFOUEwMEUsIDB4N0RBQjFDOTAsIDB4QUI2MDhGRkQsCisweDg1MDZBODUzLCAweDc1QjkzMzlCLCAweDFBRTBDQ0JBLCAweEZCNjBCQjc5LAorMHg4NjUwRjkyRiwgMHg0ODE5RTFGNywgMHgwQTcwNDVBOCwgMHhCNUJDRTVGMSwKKzB4NzdBOThCMjcsIDB4MDNERTIxRTQsIDB4M0ZFM0YxMzIsIDB4MTA2ODI3RUMsCisweEQ0REMxNDY5LCAweEFBQzgyRjlCLCAweDFENTk1M0ExLCAweDgwMzRCMzY5LAorMHhENDQxMkI2RiwgMHg5MEZCOUYyNSwgMHgxNDI3OTA3MCwgMHg2RDk4QUYxQywKKzB4M0QyODZGMzcsIDB4ODMyNEE3MzIsIDB4NTgxMjNFNEUsIDB4RUIwNTEwMzIsCisweEMxNUNENTU3LCAweEVCODJERTk5LCAweDYyMTM0MzRFLCAweDM5RjBGQzlDLAorMHg1RUJGRTFDNSwgMHg4Q0VCRjQ3MCwgMHhGRjdEOEQ4QSwgMHg3NDBBNkEzRSwKKzB4NzIwRDA4MEMsIDB4QjczQjc0RkEsIDB4NTE3M0Y5NkUsIDB4OUZDMDE3OTQsCisweERBQkYxQzgxLCAweENBODEzMjk1LCAweEJFQTJEQjhELCAweDRDN0UwQ0U0LAorMHg4MDUxQkE2NywgMHhFNjMzOTlFMiwgMHg4M0ExNUVFNCwgMHg0N0Y0QTcxOCwKKzB4RDgyNDZFNkEsIDB4MEI0Rjg3QkUsIDB4MDMxNjQ4QjgsIDB4OTlFM0UzRTYsCisweDRBQkNDNjRGLCAweDUyNzY4MTgxLCAweEU3MDgzNzJCLCAweDJEMEIxRDJDLAorMHg0REY1MjQwMiwgMHgzODlCRTlGNiwgMHhERTJGMzIzMiwgMHg1RDQzRDc0RSwKKzB4RDM3QkI4OTgsIDB4RTcyNzI2NDUsIDB4OUI1NDMyREEsIDB4OUQ3QTk0NzMsCisweEE2OTYyOEE1LCAweDU4MzU1NUE3LCAweDI1NUIwOEJELCAweEFENjhFQUUzLAorMHgxQTc5OTgyRCwgMHhBQ0UwOTcyNiwgMHgxNUU1NzZBRCwgMHgyNjBFQjQwNiwKKzB4QTc0NDBCNDYsIDB4NjZCNkQzMTcsIDB4QkU2RUNBM0IsIDB4M0FERUExQzEsCisweEQ4MDM5OUMzLCAweDBFRjE5OEQwLCAweEZBRUUyMDEwLCAweEVGMkU4RTU2LAorMHg1QjZDQzQwMiwgMHgzRkQyN0JFMiwgMHg5NzBBQUI1RiwgMHg2MThDMTdDNiwKKzB4N0Y1MDIyRkIsIDB4NTUyRkMxRkEsIDB4NUREODI5ODQsIDB4MDk3Njk1MzksCisweDk4ODEyRDFGLCAweEJEOEIyNTM5LCAweEQ3OEFEOUE2LCAweDFDRTQxRDA3LAorMHgyNzJBMEFCNywgMHg1Q0I3RTEwMSwgMHg2RjQyRDU2QSwgMHgwMDFEOTMwRSwKKzB4M0MxN0MzMDUsIDB4MzBBQUUzNTQsIDB4MkE0QUFCRTAsIDB4OTIyQkNCOTQsCisweDczRjM0QzFDLCAweEUwN0UxNTAxLCAweENCNTVBM0UxLCAweDBDREMzNjY5LAorMHhEOUMwN0RFNywgMHgyREFCODJCRiwgMHg5NjNFQUNBQSwgMHg5QjA1RTBGMSwKKzB4RTJEQTBFRkEsIDB4MDYxM0JGRTUsIDB4REZCNjA1RTksIDB4NURDQ0E4RkQsCisweDZENDMzODczLCAweDgxQTlCNEM1LCAweEQxRDFDQjE0LCAweDlCNkE5OTA2LAorMHhDMTA0NzY3QywgMHgzMDEwMUQzNywgMHgxODZGQkI3OSwgMHg4Rjk1RDQ4OCwKKzB4QTMwOTRGNDMsIDB4N0YxN0M5ODEsIDB4RkQ5MkIzRkUsIDB4QURBQjNBQjUsCisweDIwRDE0MDZDLCAweDk0NjJDOEU3LCAweDVENjQ4MTlELCAweEIzRTg1MTk2LAorMHg2N0I4NTRGRSwgMHg3RDAzOUZDNiwgMHhBRDk4QTg1RSwgMHhGNjcyRTA0MSwKKzB4MzBGQTE5QTksIDB4NEEyNzZFQjgsIDB4QjcwNDFEMkUsIDB4NTdCQjIxRTIsCisweDRFMjUxNjY3LCAweDE1QzU0MDFFLCAweERBQjU5NDMxLCAweEQ2QzZGRDFGLAorMHgxNzI2RUI3MCwgMHg5MDBGNEU4NCwgMHhEMzI3REUzMywgMHg3QTBBRTA0QiwKKzB4NzZCMTE3NEUsIDB4RkQ1NDdCOTQsIDB4MzcwODMyREMsIDB4RERFNjVDREQsCisweDc0NjcyQzAyLCAweDE2NDcwM0ZFLCAweDM0Q0FEMzFGLCAweDNFNjkyREVELAorMHg0QkMzOEZBNSwgMHgxNDNGOTlFNSwgMHg2MUJCNjQwRSwgMHhCOTU3QkM4RCwKKzB4QzlERDlFMzUsIDB4MkI1Q0IzMTAsIDB4QURENkVBRDAsIDB4OTE5ODFENDYsCisweEVEODAzRDU3LCAweDYxRDc3MzdDLCAweDkyRDNBQzNFLCAweDM2QTAzNENCLAorMHhFMTM5NURDNSwgMHg1RjIwNzBGOCwgMHhDNUVFOUY4QSwgMHg3MDU0NkI4OCwKKzB4QzlFQTIzMEMsIDB4NThEQzMwNzMsIDB4NTdDQkJFQjcsIDB4QTBCNzhDRkUsCisweDBCM0ZFNzVCLCAweDA3QURBQ0NELCAweEMyOTJDMzM4LCAweEQ3MENEN0U1LAorMHg3MjlEOEY0RSwgMHgyMThGQTA0MSwgMHgxMEVDMTE5OSwgMHhBQzFFQzUxRCwKKzB4NURFQ0M4RDEsIDB4QkEzNjIzMEEsIDB4QkM0MUY1QTUsIDB4NzU4NjQ4OTYsCisweEI0NDAzRDRBLCAweEZFRUU4RjQ0LCAweDhEOTRBMjU2LCAweDYyQkEwMTE1LAorMHgzQTU3MEM2MSwgMHg5MjIxQzU4MywgMHhEMjk4MUE2QiwgMHhGRDhBQUY1QSwKKzB4MkExMDJENTksIDB4NjQwODNCREQsIDB4QkQxQUFERTYsIDB4N0U2RDFFOTksCisweDIwNTY4QTZELCAweDhERkE3MDRCLCAweDg3RDI3MTIyLCAweDJFRkRBQjdELAorMHhGM0FGOUQzOSwgMHhEOERFRDBCMiwgMHgyRDRCMzRCOSwgMHgxMkYzRTMyQywKKzB4QTZCQ0JFNjUsIDB4NjgwMDI5QTEsIDB4MDk0QjA3QjMsIDB4REE1OTE4RUQsCisweEY3RDBBODZELCAweDFBN0UxOEM4LCAweDkyODVBOTdGLCAweDIwNDAyODJDLAorMHg1QjEzMzUzMSwgMHhBNDgyMzdBQywgMHgzNTU3QkMxQiwgMHg3RTZFRDc3QiwKKzB4NDM2MjM0QzcsIDB4OUIyMDk0REUsIDB4NUQ5Njc1OTMsIDB4ODg2N0QxQzQsCisweDg4RUMzOTQ4LCAweEU3Rjg0QUQ0LCAweDE4NzFCM0U2LCAweEU4RTk5MkM2LAorMHhBMTZEQzJGOCwgMHgwREZERjU5MCwgMHg5QjU2MjM4RCwgMHgzMjkwMTdGNSwKKzB4QkY5QkQ0MDksIDB4NjhCRDlCMUMsIDB4NDAzNkM0RkYsIDB4M0JGNkQ5M0MsCisweEFFMTAwNjAyLCAweDkwQjQzNTA4LCAweEE4NUI0MDEzLCAweDJDNjZFQTU0LAorMHgyMjdEMzJENywgMHgwQkE1MjZEMSwgMHgwNzUyMTNCOCwgMHgxQTNERUQwNywKKzB4RDQ1OERGRkQsIDB4REM4QUNENDMsIDB4QUM3ODA5QUIsIDB4MkQyNTQwOEEsCisweEQ4RjBDODg3LCAweEFEOENEMzBELCAweDQwNTRGNjFFLCAweEE5RjBDQ0EzLAorMHhCRkVCRDMxRCwgMHg2RDJCQUIxRSwgMHhGOEU0MkQ4QiwgMHg2Qzk0QTRFNCwKKzB4MTE1OEQyQTMsIDB4OTNGNDRFRkUsIDB4OEFEMDVBMjUsIDB4OEMyMjlEMzIsCisweEIyMTNENzZFLCAweERGRTYzODIyLCAweDU2MTk4NkVDLCAweDgwNkNBMDgyLAorMHg2REIzQkY4RCwgMHgxRTg1MEQzMCwgMHg4RjdBNDRDMCwgMHg3NUJCMzMyOCwKKzB4ODZDN0JFMTIsIDB4REU1QzQ0QkQsIDB4REY0RDA0OEUsIDB4OTY4NzEyQzMsCisweEIxQjQxQ0Y4LCAweENDMTk0RkU5LCAweERBMkUxQThELCAweDcyQTA4NjYyLAorMHg1QUJBMjUzNiwgMHgyMjNFMjAxMywgMHhBNUE5MjNBNSwgMHg3NTY1QjVERCwKKzB4QkNBMEEyQjAsIDB4MEMyOTg2NEIsIDB4QUFEOENCODcsIDB4RTRDN0U1NTksCisweDc3RTE5RTUxLCAweDE5NEU1NEVELCAweDU0REQxQjU0LCAweDBGQUQzN0E3LAorMHgwRUY2QjBFMywgMHgwRTNBMkZDOCwgMHhBMDA2Mzk5NSwgMHhFMTdBRTIwRSwKKzB4REMxMUI3RjgsIDB4ODVGMUE3NkQsIDB4RDk3ODU4RDQsIDB4Qjc2M0U0OUMsCisweEI1QkU3RUM0LCAweDNDRTkyNEM0LCAweDQyNDYwMTlELCAweEQzM0RCQjI3LAorMHg3Mzc4NjNBNywgMHgzMkMyNkJERCwgMHg3MTQ4OTdBMywgMHgzNjA5MTAxOCwKKzB4RjI2QkM5OTAsIDB4RERCNjQwQjAsIDB4NDQ4RjVCMTIsIDB4RDdBNUVCNEIsCisweDU2MTRFRUE0LCAweENBNDkxMkZCLCAweDAxMUY5RDZDLCAweEE0RkM5MEFCLAorMHg5RkI0OTgyRCwgMHgyMEFEMTQ2RiwgMHg0QjdBQjc0RSwgMHgxMDdBOTQxMSwKKzB4NzFEQkE5MEEsIDB4RDUxMEUzRDIsIDB4MjQ4RDBEMzUsIDB4QjY2NjIyOUUsCisweDYxRUUxRUVBLCAweDcwMjAzMUI1LCAweDM2OTkyQTdCLCAweEM5MEMwOENCLAorMHg2NDc4OTk1QSwgMHhFNkMyQkE3QSwgMHg4QTkxNzlBQywgMHhDOEVFMjk1NiwKKzB4MjdCMDQyQzgsIDB4NDhEQjgxRDksIDB4QUEzOUYyQ0IsIDB4NUU0RDVGM0MsCisweDI0RkZENkI5LCAweDVCNTYyQzJGLCAweDAwRkQzM0I2LCAweDQzNUY1RjUyLAorMHhGMzkyRkZDMSwgMHgwRTkyN0M0MCwgMHg1NTA4Q0JBQiwgMHg5NzZBQTU2NywKKzB4QTEzRTdDNTIsIDB4NTMyMTA5RTksIDB4MTZCOTAyMUYsIDB4NjBDNjE1QTEsCisweDFEMjNDMjU4LCAweEZENzgzMTQ3LCAweDYzNjAwRkIxLCAweEFBQTI0NUYwLAorMHg5QjNEQzFFMSwgMHg3QjI3MEQwRCwgMHg1QjE2MzJDRSwgMHg4Qjg3MUY3RiwKKzB4QzUzNUVGRjgsIDB4NzMxMDlDNkEsIDB4RUI4M0QwMkQsIDB4RjdBRTc2RkIsCisweDJFMzlFNTAyLCAweEE0MTI4MjE2LCAweEY5MEQ1N0U1LCAweEZGMEM0NjVFLAorMHgwMjAwODAyOSwgMHhFNUNCQkExRiwgMHg0MjgwRkEzQywgMHhDREJENzVDOCwKKzB4Q0I0QUYzNDIsIDB4MTc2OTVBNEUsIDB4QUE2MTYyQjUsIDB4ODY2MEE2NzksCisweEQxQTg3MDFDLCAweDQ3Njk0Q0E3LCAweERBOEQ0M0ZELCAweDQ0QTRCQzFCLAorMHhBQjM0QjlBQSwgMHhFNTU1NjNERCwgMHgwOEQ0MTQyQiwgMHg4MTE5N0FDOCwKKzB4OTk3QjFEQzIsIDB4MkU3Q0M1MEEsIDB4N0EzMjZBMjEsIDB4QTc2NDE5REIsCisweEVBOEI1NDI4LCAweDY1NzI5MTQwLCAweDA1MURBRjY2LCAweDg4NzFCQ0E5LAorMHhBMTc1RTVCRiwgMHg2MDMxMEM5OCwgMHhCN0RFODkyOSwgMHgzNUUyNDU5RSwKKzB4MDhFQjQ1NDcsIDB4OTA0RDdCMkIsIDB4MjkzODJDQzQsIDB4Q0VDODY2NEUsCisweDFFOEM5QzJDLCAweDNCOTQyMTM0LCAweDlDRUM1RDU1LCAweERBNTQ4Mzc2LAorMHgyRTRFRkQ2MSwgMHgyNkY2NUYwOSwgMHg1QTNERDdDQSwgMHgyRkQ0RTU4RCwKKzB4NkI3MUI4QzIsIDB4MTMxODkxMTUsIDB4MkI1NTQyQkEsIDB4MUNFODVDMkMsCisweDVCOUZFMDlELCAweDY4NzA0QkZFLCAweEIxNTMxM0I5LCAweDNFRjI3MjlFLAorMHg1ODNFQ0MzMSwgMHhBM0RFRDhDQSwgMHhGQ0QyN0MzRCwgMHg5MDREQUIzOSwKKzB4RkUxMDY5QTQsIDB4RTk5QTU3QkEsIDB4MTEyRUI4MEMsIDB4RTE0ODNDNzQsCisweDhBMjdCMEQ3LCAweEE1OEY3MzI1LCAweDdDRDA1MEExLCAweDYyNkQ0RjNFLAorMHg1MTY0MzY1NywgMHhBOTY3RkM1OSwgMHg1QkFDQkMwQiwgMHgyQ0YzRTQ1OSwKKzB4N0Q4OTg4RDksIDB4NTM5MTNERjgsIDB4MjM4MUE2RkMsIDB4NjRENkQ0NDEsCisweDQ4QUU5MTAxLCAweDE4NUQ5NTM5LCAweDFCMDQ0QUVDLCAweEI1QUJDRURELAorMHhGQThFQ0E1MiwgMHg4Q0NERDE0MiwgMHg5NkZENDQ0MiwgMHhEODY1RkVERiwKKzB4Q0U0RUUyRkEsIDB4QTUxNjBBRTksIDB4QzkxQjJCM0EsIDB4Rjk5M0Y0NUYsCisweDE1MDkxMzJDLCAweDkyMEVDQzVGLCAweEQ4MTNEREMxLCAweDgzNEI2OEU0LAorMHhENUU4NzZBMCwgMHg2MURFMEU0MSwgMHg0QzE0MzkxMywgMHhDNzI5Mzk4NSwKKzB4MTdFMjI2RTcsIDB4Mzg4MzA5MjcsIDB4REM2MDRERjIsIDB4Nzk5RDE0MzAsCisweDg0NjU4NUFCLCAweEU1RDIxRTM4LCAweDYzODFEMTM2LCAweDFCNjA2MzNCLAorMHgyM0I3QUUxNCwgMHg1NTRFNTNDQywgMHg1ODA3QTIxMCwgMHgzMDU2MDg2NiwKKzB4MTJGNzlFNjIsIDB4RTI3QjVENDUsIDB4Mzg4OUMxRTUsIDB4NDdGODQ1RkYsCisweEZGRDlERTk4LCAweEIxMEUwOUQyLCAweDRBMTg0QTcyLCAweDA4M0QyOTcxLAorMHg4QUI3NDc4RCwgMHg5MjM4MDM3NywgMHg1N0E3MjRFQywgMHhCQkJENUNBNiwKKzB4RTJGQjlEMzIsIDB4QUI2QURGQzYsIDB4MzkxNkRFRDQsIDB4NEUxOTQzOEYsCisweEUyMUUxNUNGLCAweDZBRjRCQ0M5LCAweDhEMDg5MjRBLCAweDE2NjJCQUE5LAorMHgzMDY0QUQyNywgMHhCODZEN0VFNCwgMHg4ODYyNEM2MiwgMHgxQTBCRjNFNywKKzB4RjNFNEEyODcsIDB4Njc4N0YwMDYsIDB4MDEzNzVENEIsIDB4OTk4QkIzOEYsCisweDZENjY5QTI5LCAweEQ3NjBCMDkzLCAweEM0NzY4ODUzLCAweEYwNDExMDBGLAorMHgzNURFMTBERCwgMHhFMDZDOEJCOCwgMHgyQzc5QTkwMiwgMHg2MDYwMERBRCwKKzB4NkUxMUNGNUMsIDB4MTg3Nzg3NzcsIDB4N0NDRTQwNkMsIDB4RTU0QUYyRUEsCisweDc0NzJDNDc1LCAweDczREJFRTdFLCAweEU1MzNEQzQwLCAweEIwNzQwN0RELAorMHhGNkFDQThEMywgMHhFNzFCRDdEMSwgMHg0QkQzNTE0RCwgMHhDNUMzNjJDQSwKKzB4MDY5MEU1QTEsIDB4MEZGREM4RDgsIDB4NTgxODg2NDUsIDB4ODYzNjQxM0MsCisweDM0MTJBMDMzLCAweEFGNEZDMzQwLCAweEE1REZFQUI4LCAweEI4NzI3MkUzLAorMHhBNEE5MjE5RiwgMHgyOTY5NkU5MCwgMHgzNUQyRjYyNywgMHg4Nzk0REJENywKKzB4NUQyRDg3RjgsIDB4RkE3MzU1OUQsIDB4N0QyMkY0NDAsIDB4RjUwMTk3RTksCisweEVCNzRCODI5LCAweDhGOTY0OUNGLCAweDE2RjQ3RDMwLCAweDVDN0Q5ODcwLAorMHgzNkZGNkMwQiwgMHgzMTNBOTJFRCwgMHgzMDNCMzY1NCwgMHhFM0UzM0NDQSwKKzB4MDJDMjZFQ0MsIDB4MjY5NDk5MjAsIDB4NDQ0NURGMjAsIDB4MDFGREJDOTgsCisweDQ5MTM4QzZGLCAweDFCNTU1NUUyLCAweDEyMkI0NUQyLCAweDRCMkUwMjAyLAorMHg3QjYwMTRENCwgMHhGQUUwQ0QwOSwgMHg3N0UxNjVBMCwgMHhGQkU3Njk4MCwKKzB4RjU4MDhCRDMsIDB4RkQxMTBFNUUsIDB4OTc0NTBFMTEsIDB4Mjk3RjlCMUYsCisweDYwN0EyQzQxLCAweEUzODRERkM5LCAweDI1RDlBOERDLCAweEY5MTlEOTU1LAorMHg1RTAyNTk5MywgMHhDQzMxODg0NywgMHg5NzE3RDJENSwgMHg0OEYwREQxRiwKKzB4NkNDNEE4RUIsIDB4OUJEMEY0RTEsIDB4NTA2RjJBOTMsIDB4MThCODc0OEUsCisweDE2RkZCQTQ4LCAweDU1MkU0OTU1LCAweEI5NjNGNjRGLCAweEExQTM0QUM4LAorMHg2MkU5NUNDNywgMHg0RDg3RUE4OSwgMHgyMUU4QzAzMSwgMHhDMUYwRUQwNywKKzB4MjhCN0JCMjIsIDB4MEI4MzhEMDQsIDB4NjM2MUI0NDAsIDB4QTY1MzUyMUMsCisweDkyREEzRjc4LCAweDQyNDFDRkVELCAweEZBRkNCRDQxLCAweDNFRkFCNkJDLAorMHgyNUYzMDYwNywgMHg0MUJCNzBEQSwgMHg5RkYzNDQwQSwgMHgyNTAyMDM5RSwKKzB4MzgxM0VDODIsIDB4QzZBNEZENkIsIDB4Rjg1MzdDOEMsIDB4MDk4RUQ0OUYsCisweEUwQTBCRDZFLCAweDZCQTJGMkIzLCAweEMzNUM5RDlELCAweDEyNTZFNjZBLAorMHg3OTBCMjQ5MCwgMHhENUM2OTg4OSwgMHgzOUU3MTJGRSwgMHhDRjczREUwQiwKKzB4NDFCM0I2MTQsIDB4NzQ1QUJENzMsIDB4NjU0Qzc5RDgsIDB4NUIxNTkyM0QsCisweDhDMTVGMjE4LCAweDU4NUNDQ0YwLCAweDYyNEY3QjQ0LCAweDc2QkRERkRCLAorMHg5NkYyNkI1MiwgMHhFMTMwNThBMSwgMHgwODZDOTUwRSwgMHgyOTUxOURFQSwKKzB4QTQyQ0ZFMDQsIDB4MEQ3QTE5MEIsIDB4RDA2NzhDNkEsIDB4QUJCNzg2NzksCisweEJBNDhBMkU0LCAweDVGM0RBMTBBLCAweDExRjA0MTgzLCAweEFDNzIwQTNGLAorMHg2QTgwNzc4MSwgMHg2RjE0NkJGQiwgMHhFOEE2NzkzNCwgMHg1NDU3ODgzNCwKKzB4QUE2MEM4RjAsIDB4MjA2MUExRTYsIDB4OUU4Nzc5OUIsIDB4NjhEOTFGODYsCisweDg5NzRGNTQwLCAweEIxQzNGMTAxLCAweDk5QzIxRTU2LCAweEI1N0JBNzNGLAorMHg4QjJEQUEzRSwgMHhGMUUyRDI0RSwgMHg0OEY3RDRFRSwgMHg3MDM5RkRCMywKKzB4QzY2NkVFREMsIDB4MjUxRjk3MkUsIDB4NEQ1M0Y2QkYsIDB4NkNDNzNFRTcsCisweENCMDdGN0I5LCAweDY5RUNCOENBLCAweDM2M0ZEODBDLCAweDNCNTg3QUIzLAorMHg3MzhDMUU1QywgMHg1QzlDMUQ5MiwgMHhFN0I1MjM5NiwgMHhFREU2MzI0QiwKKzB4RkU1QjUwNDUsIDB4QzkwRDhCM0UsIDB4MzcxQTAxMjgsIDB4RjJDOERDRjgsCisweDVCNjQ4Q0I1LCAweDEyRjhFOEZGLCAweDVGRTRCQTcxLCAweEI5MjVDRkJFLAorMHg3NDE2RTE0RiwgMHg3NjQ4OUZGRSwgMHgxRjRERTM2NywgMHhBNDAwRjAzOSwKKzB4NjYzOTBFODMsIDB4MUFFNzlDRUMsIDB4REI1NzNFOTgsIDB4QjYwMjFGMjksCisweEQwMTYxNUU1LCAweDAyQTIyODFGLCAweEU4NTAxOUMxLCAweDAyN0JCNDFGLAorMHg4RDkxNzdDMywgMHg3OTAyNkU3OCwgMHhGMTU4QjYyMywgMHhCRUZGNTg1OCwKKzB4N0I2MzUxOEUsIDB4OEY0MkMwOEMsIDB4QjM4ODIyN0QsIDB4OTQwRDYwN0EsCisweEE0Qzc5NTQxLCAweDk4MDBDQzkxLCAweEEzNTZCNTM1LCAweDI4NUJBQkI5LAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4RTQxMUU1MjAsIDB4QTAwMjQ1MjgsIDB4NDQyQjQ0MjgsIDB4OTYwNzAwMDksCisweDQ2MTA2MjQ2LCAweDhGRkIyNTIyLCAweEQ0MDI3NTA0LCAweDAwMDlBRkY1LAorMHgwMDAwMEZCMywgMHgwMDIwMDAwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MTZENDkzNTcsCisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFOTQ3RkZDLCAweEUxMTRENTk0LAorMHgxRTEzRDQ5NCwgMHg2NzUyMUU0QywgMHhENDk0RDY5MywgMHgzNzQwMjc2OSwKKzB4NjI1MjhGMDYsIDB4NzIwMUQ2OTIsIDB4NjA2MDI1MjIsIDB4MjYwMEM5M0YsCisweEQ3OTA2MTUyLCAweDI1MTI2MTFELCAweDI2NEI2NjUyLCAweDI1NjI0NzBCLAorMHgwMDA5QjAwRCwgMHhFNjAwOTVBQywgMHhDODQwNjBFMiwgMHgyRjAyOEYwMywKKzB4OEZGOTM2NTIsIDB4N0YwNDc2MDEsIDB4QTA1QTRGMjYsIDB4NEYyMjZFRjYsCisweDQxMEJEMTg1LCAweEQ0ODUwMDA5LCAweDAwMDk0NDBCLCAweDQ1MEJENTg0LAorMHhENzg0MDAwOSwgMHhEMjg0RTFGRiwgMHgyNzEyNjExRCwgMHhENDgzNTAyOSwKKzB4RTFGRkNCMDEsIDB4MTIwOUU1MDEsIDB4MTIxMTIyMTIsIDB4RTcyMDI0NTIsCisweDQ3MThENTdGLCAweDI1NzJEMjdGLCAweEQxN0ZFNzAwLCAweEQ2ODBENDdGLAorMHhFMjAxMjI3MCwgMHgyNDcwMjE3MiwgMHhENjdFMjYyMCwgMHgyNjQxRTRGRiwKKzB4RDU3REU2MDAsIDB4NjY2REUxMDQsIDB4NzYwMTYwNjMsIDB4NDAwMDYyNkQsCisweDhGRjgzMjEyLCAweEQ1NzkwNTQ1LCAweDI1MjBFMjAxLCAweEQyNzlENzc4LAorMHgyNzEwRTEwMCwgMHhFNTgwMjIxMiwgMHg2NTVDNjYxMywgMHg2NjZERDQ3NiwKKzB4NzYwNDY3NjMsIDB4Mzc0QzYyNkQsIDB4OEZGODMyNTMsIDB4RDQ3MzI3MTIsCisweEQ1NzNFMTAxLCAweEQ2NzMyNDEwLCAweDI1NDJFNDAwLCAweEUwM0FFNTAxLAorMHhEMjcyRDc3MSwgMHhFMDM5MDY1NCwgMHgyNzExMDY1NCwgMHgwMDBCNEYyNiwKKzB4N0ZDODIyMTEsIDB4RDc2RkQxNkUsIDB4REM3MERCNkYsIDB4RDI3MURFNzAsCisweEQ1NzJENDcxLCAweDFGMTJENjcyLCAweDFGNzY3MTBDLCAweDFGQjg3N0ZDLAorMHgxRkVBMUZDOSwgMHg3MjA0MUYyQiwgMHhERTZGREM2RSwgMHgxRjEzRUIxMCwKKzB4MUY1MTFGNDQsIDB4MUY3NzFGNjUsIDB4RDg2QzFGMkMsIDB4REQ2REQ5NkMsCisweEQyNkRFQTAwLCAweDg5MDAzQTIyLCAweEQxNTg3QTAxLCAweDg4MDE2MDEwLAorMHg1NkY5OEIwMywgMHg0MjE4RTIwMSwgMHhEMTY4MjYyMiwgMHgwMDA5NDEwQiwKKzB4NDQwQkQ0NjcsIDB4RDU2NzAwMDksIDB4MDAwOTQ1MEIsIDB4NjAxMEQxNEMsCisweDhCMTA4ODAxLCAweEU2NTBEMTRCLCAweDQ2MTg2MjEyLCAweDhCMDgzMjY2LAorMHg1NkZBRDE0NywgMHgyMTIwRTIwMCwgMHhDQjAxNjA2MiwgMHgyNjAyQTAwMywKKzB4NzIwMTI3MTAsIDB4NjA4MjIxMjIsIDB4ODkwOTg4MDEsIDB4RTJDOEQxNUEsCisweDYyMkM2NjEyLCAweDg5MDMzNjI2LCAweDYwMTBEMTU4LCAweDhCQzg4ODAxLAorMHg1MUY3Njc5MiwgMHgyMTcyNTJGNiwgMHhENjU1NTE5MSwgMHg1NUZCMjIxMiwKKzB4NTJGQzY0NjIsIDB4NTU2MTI1NDIsIDB4MjI1MkU0MDAsIDB4NjE0MzY2NDMsCisweDA1REU2MDEzLCAweDM2Q0M0NjA4LCAweDAyREUyNjUyLCAweEM5MDM2MDIxLAorMHg4QjAyODgwMSwgMHg3MjAxNjJFMiwgMHg3NDAxMkUyMiwgMHgzNkIzNjY0QywKKzB4NzEwNDhGRUUsIDB4NjZDMkQxNDcsIDB4NDUyODY1MTIsIDB4MjY1QjQ1MTgsCisweDYwODIyQzYyLCAweDg5MDE4ODAxLCAweDAwMDlBMTY4LCAweDYyNzJENzQyLAorMHg4QjEzMjIyOCwgMHhENzI2RDU0MSwgMHg2NTUyRDQ0MSwgMHg1MTQzNjY3MiwKKzB4MzE2QzM2NUMsIDB4Mjc2MjI2NjgsIDB4MTQxMzhEMDUsIDB4NjI2MkQ2M0QsCisweEIxQTU3MjAxLCAweEQ2MUUyNjIyLCAweDI2MjJFMjAwLCAweDUyOTE2NjkyLAorMHg4QjAxMzYyMCwgMHgwMDA5QTE0NCwgMHg2MDYxQTA2RSwgMHgwMDFDMDAxQywKKzB4MDAxRDQwMjAsIDB4MDAwMEIzOEUsIDB4RkZGRjAwMDAsIDB4MTIzNDAwMDAsCisweDAwMUUxMDE1LCAweDAwMjAxMjc4LCAweDAwMjAxOEEwLCAweDAwMjAxOTIyLAorMHgwMDIwMTI4QywgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywKKzB4MDAyMDM5N0MsIDB4MDAyMDM1MTQsIDB4MDAyMDM5ODQsIDB4MDAyMDM5OTAsCisweDAwMjAzOTlDLCAweDAwMjAzOUY4LCAweDAwMjAzOUZDLCAweDAwMjAzOUE0LAorMHgwMDIwMzlBNSwgMHgwMDIwMzlBOCwgMHgwMDExNzcwMCwgMHgwMDIwM0ExMiwKKzB4MDAyMDM1NzgsIDB4MDAxMTQyRDgsIDB4MDAyMDNBMTQsIDB4MDAyMDNBMTYsCisweDAwMUMzRDMwLCAweDAwMTE3NzE4LCAweDAwMUMzRDAwLCAweDAwMUMxMDAwLAorMHgwMDFDMzZGOCwgMHgwMDExNzczNCwgMHgwMDFDMzY4NCwgMHgwMDExNzcxMCwKKzB4MDAxQzM1MjAsIDB4MDAxMTc2MDAsIDB4MDAxMTc3NDAsIDB4MDAxQzEwMjgsCisweDAwMjAzNThDLCAweDAwMjAzOUFDLCAweDdGRkZGRkZGLCAweDAwMjAxNzM0LAorMHgwMDIwMzJCRSwgMHgwMDIwMjJFOCwgMHgwMDIwM0RDMCwgMHgwMDIwMzlGQSwKKzB4MDAyMDM1ODQsIDB4MDAyMDM5RUMsIDB4MDAxQzNEMkMsIDB4MDAxQzM2QjAsCisweDAwMjAzNTFDLCAweDAwMTE3NzVDLCAweDg4MDFDOTBGLCAweEEwQ0Y4OTAxLAorMHhEMTdDMDAwOSwgMHgzNjIwNjIxMiwgMHhENDdCODkwNCwgMHgyNDIxRTIwMCwKKzB4MjE2MkEwQ0MsIDB4NjIxMUQxNzksIDB4ODkwMTIyMjgsIDB4MDAwOUEwQzMsCisweEUyMDJENzc1LCAweDc1MDE2NTcxLCAweDMxMjM2MTVELCAweDI3NTE4RDAyLAorMHgwMDA5QTBCQywgMHhEMjcyNTVGMiwgMHg2MjIyNjA1MiwgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEYxOTg4MEEsIDB4NTJGMzFGMkQsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDhDOTBGLCAweEEwQTc4OTAxLCAweDYwNjMwMDA5LAorMHg1MUYyNTVGOCwgMHhFNzAxQ0IwMSwgMHgyNTAyRDI2MywgMHhFMTAwMjE3MiwKKzB4MjIxMUQ1NjQsIDB4NzQwMTY0NTIsIDB4MjU0MkEwOTgsIDB4OEIzRjg4MDUsCisweDYwMjI1MkYzLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMTY4ODAyLAorMHhFNUZGRDQ1RCwgMHg2NTVENjc0MiwgMHg4QjEwMjc1OCwgMHg2MjcyRDc1QiwKKzB4OEIwQzMyNjAsIDB4NTVGMjU3RjgsIDB4Mjc2MkUxMDEsIDB4RDU1MjI1MTIsCisweEQ3NTdFNDAwLCAweDYyNzIyNTQxLCAweEEwNzc3MjAxLCAweDUyRjMyNzIyLAorMHg0MDE5NjAyMiwgMHg0MDA5NDAwOSwgMHg4ODA1QzkwRiwgMHgzMUIzOEI2RSwKKzB4RDU1MDhCNkMsIDB4NjE1MjU3RjQsIDB4NzEwMUUyNDAsIDB4NjQ3MjI1MTIsCisweDFGNEREMTRELCAweDQyMTgyNDE5LCAweDhCMDMzNDIwLCAweDYyNjJENjRCLAorMHgyNjIyNzIwMSwgMHhFMjAwRDY0MCwgMHgyNjIxQjBBQSwgMHgwMDA5QTA1NiwKKzB4MzEyM0UyMjAsIDB4ODgwMzhCNTIsIDB4NTJGMzhCMUUsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDNDOTBGLCAweEQ3NDE4QjE2LCAweDY0NzI1MUY0LAorMHg3NDAxRDIzRCwgMHg2NTEyMjc0MiwgMHgxRjVERTY0MCwgMHg0NjE4MjUyOSwKKzB4OEIwMzM1NjAsIDB4NjI2MkQ2M0IsIDB4MjYyMjcyMDEsIDB4RTIwMEQ2MkUsCisweDI2MjFCMDg2LCAweDAwMDlBMDEwLCAweEQ3MzhEMTM3LCAweEQyMkE2NDEyLAorMHhFNTAwNzQwMSwgMHgyMTQyM0E3NiwgMHgyMjUxOEYwNiwgMHhFQTAwRDYzNCwKKzB4NzIwMTYyNjIsIDB4MjYyMkIwNzQsIDB4MkZCMkQ1MzIsIDB4OTU0MDY2NTIsCisweEQ0MzA1QkYxLCAweDM2MjA1MjQxLCAweDYwNjE4OTEwLCAweDhCMDFDODAzLAorMHgyQjIyRTIwMSwgMHg4RkY1NDUxMCwgMHg1N0YxNTY2NCwgMHg2MjcyRTFGMCwKKzB4NDEyODQxMTgsIDB4MjcyMjIyMUIsIDB4NkJGMkEwMDgsIDB4NkJGMkEwMDYsCisweEUyMDBENjE1LCAweEQxMTUyNjIxLCAweDIxMjFFMjAwLCAweEUyMDI1NkY1LAorMHg0MjE4NjY2MiwgMHgyNjI4NDIyOCwgMHgxRjZEOEQwQywgMHhENjFGRDExRSwKKzB4NDYwQjY1MTEsIDB4MjAwODY0NUQsIDB4NTdGNTg5MDQsIDB4NjI3MkQxMUMsCisweDI3MjIyMjE5LCAweEQxMUJFMjAxLCAweDY2MTIyODIyLCAweDhCMDEyNjY4LAorMHgwMDA5QUUxNywgMHg0NTBCRDUxOCwgMHhEMTE4MDAwOSwgMHhBRTEwRTYwMCwKKzB4MDdEMTIxNjAsIDB4MDAyMDNBMEMsIDB4MDAyMDNBMTAsIDB4MDAyMDNBMTgsCisweDAwMUMzREMwLCAweDAwMTE3NzJDLCAweDAwMUMzQjg4LCAweDAwMjAzOUY0LAorMHgwMDExNzczQywgMHgwMDExNzc0NCwgMHgwMDAwRjAwMCwgMHgwMDExNzc2NCwKKzB4MDAxMTc3NDgsIDB4MDAxMTc3NjgsIDB4MDAxMTc3NkMsIDB4MDFGRkZGRkYsCisweDAwMTE3NzRDLCAweDAwMjAzNTg0LCAweDAwMTE0MkQ4LCAweDAwMTE0Nzc0LAorMHhGREZGRkZGRiwgMHgwMDIwM0RDMCwgMHgwMDIwMjQ2QywgMHgwMDIwMzlGQSwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEQxMUY3RkY0LCAweDYyMTJERTFGLCAweDY3RTI1NDExLCAweEQ0MUUxRjQxLAorMHgxRjcyMkYyMiwgMHg2NzQzRDUxRCwgMHg3Nzk0RDIxRCwgMHg1QTQyNTg0MSwKKzB4NkM3MjY5NDIsIDB4NkQyMjVCMTYsIDB4RTYwMDYwNTIsIDB4MjUwMkNCMjAsCisweDc2MDFFNTQwLCAweDMyNTM2MjZELCAweDYyRjI4QkZCLCAweDIxMjI1NUYxLAorMHg1NUYyMTE1MSwgMHgyRTUyRDYxMywgMHgxNEEyMTQ4MSwgMHhENDEyMjQ5MiwKKzB4MTFCNjI3QzIsIDB4Njc0MjI2RDIsIDB4RDkxMURBMTAsIDB4MkE3MkU4MDEsCisweDFBOEM0OTBCLCAweDQyMThFMjAxLCAweDdGMEMxQTJDLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHgwMDAwNjhGNiwKKzB4MDAxQzNCOUMsIDB4MDAxQzNEOTgsIDB4MDAxQzM3MDAsIDB4MDAxQzM1MDAsCisweDAwMUM1OTYwLCAweDAwMUM4OTYwLCAweDAwMjAzNThDLCAweDAwMUMzRDAwLAorMHgwMDIwMTYxMCwgMHgyRjk2MkY4NiwgMHgyRkM2MkZBNiwgMHgyRkU2MkZENiwKKzB4NEYxMjRGMjIsIDB4N0Y4ODRGMDIsIDB4RTAxOERFQjIsIDB4RDRCMjYxRTAsCisweDYxRTMwRjE0LCAweDYyMTA3MTAxLCAweDQ0MEJFMDFDLCAweDIwMDgwRjI0LAorMHg4RjEyNkQwMywgMHhENEFEMUYwOCwgMHg2NzQwRERBRCwgMHg2NTdDRDRBRCwKKzB4NDcwQkQ3QUQsIDB4RDJBRDAwMDksIDB4NjIxQzYxMjAsIDB4NDYwODY2MjMsCisweDM2Mjg0NjA4LCAweDNENkM0NjA4LCAweEUwMUMxRkQ4LCAweEU1ODAwNEZDLAorMHg2MDRDNjZFMiwgMHgzMDUwNjU1QywgMHgyRDYyOEYxNywgMHgwMUZDRTAxOCwKKzB4REVBM0U1MDAsIDB4NjQxQ0EwMDgsIDB4Njc1MzY1NUQsIDB4NjA3MDM3RUMsCisweDMxREM2MTUzLCAweDgwMTQ3NTAxLCAweDMyNDM2MjVELCAweEQ0OUQ4QkY0LAorMHhFMjAwRDU5RCwgMHhBMjdGMjQyMSwgMHgyMDA4MjUyMSwgMHhFMDE4OEIxMywKKzB4RTUwMDAxRkMsIDB4QTAwOURFOTYsIDB4NjU1RDY0MUMsIDB4MzJFQzYyNTMsCisweDYyNTM2NzIyLCAweDMyREM2NjcyLCAweDc1MDQxMjYxLCAweDMyNDM2MjVELAorMHhBMjY5OEJGMywgMHg4ODAxMkQxMCwgMHhFMDE4OEIxNiwgMHhFNDAwMDFGQywKKzB4NjcxQzJENDAsIDB4NjI0RERFOEEsIDB4OEIwMTMyNzMsIDB4MDAwOUEyNUMsCisweDZERTM2NDRELCAweDdEMDQ2MjQzLCAweDMyRUM2NjQzLCAweDY1MjIzNkRDLAorMHg3NDA4NjE2MiwgMHgyNTEyQUZFRiwgMHg4QjE5ODgwNCwgMHgwMUZDRTAxOCwKKzB4MkQ3MEU3MDAsIDB4MUZENTZEMUMsIDB4NjI3RERFN0QsIDB4OEIwMTMyRDMsCisweDAwMDlBMjQyLCAweDYxNzM2NzdELCAweDMxRUM2NUUzLCAweDc1MDQ2NDEyLAorMHgzNjVDNjY3MywgMHg2MTQyNjI2MiwgMHgyMTI5NzcwOCwgMHgyNDEyQUZFRCwKKzB4OEIxOTg4MDUsIDB4MDFGQ0UwMTgsIDB4MkQ3MEU3MDAsIDB4MUZENDZEMUMsCisweDYyN0RERTZGLCAweDhCMDEzMkQzLCAweDAwMDlBMjI2LCAweDYxNzM2NzdELAorMHgzMUVDNjVFMywgMHg3NTA0NjQxMiwgMHgzNjVDNjY3MywgMHg2MTQyNjI2MiwKKzB4MjEyQjc3MDgsIDB4MjQxMkFGRUQsIDB4OEI1OTg4MzEsIDB4NjFFNkRFNjcsCisweDYxRTMxRjE5LCAweDY0RTI3MTA0LCAweDFGNEE2MjE2LCAweDFGMkI2NDE2LAorMHg3NUU0NjUxMywgMHg2NjUzNjcxMiwgMHgxRjRDNzYwNCwgMHg2NDUyMUY3RCwKKzB4RDc1RjZFNjYsIDB4MjdFMEQyNUYsIDB4REU1RjYwNjIsIDB4QzkwMTMyNDUsCisweDY1NjIyRTAwLCAweDQ2MDkwNjBBLCAweDQ2MDlEMTVDLCAweDQ2MDk0NTA5LAorMHgyMTUwMUY0RSwgMHhCMkIwNjQ2RCwgMHg2MjBEMUY2RiwgMHg4QjAxMjIyOCwKKzB4MDAwOUExRUEsIDB4RDc1NkRFNTUsIDB4NjYxQzYxRTAsIDB4NjQxMEQxNTAsCisweDQ3MEI2NTRDLCAweDdGRkM1NEZGLCAweDJGRTI1RUZFLCAweDUxRkU3RkZDLAorMHgyRjEyRTA0MCwgMHg1NUZCRDE0RiwgMHg1N0ZENTZGQywgMHgwNEZFNDEwQiwKKzB4RDI0RDdGMDgsIDB4RTExQzY0MEQsIDB4MUQ0MTJEMTAsIDB4RDQ0QjY1MjIsCisweDY3NDIxRDUyLCAweDFENzNERTRBLCAweEQyNEE2NUUyLCAweDY3MjIxRDU0LAorMHgxRDc1RDI0OSwgMHhEMjQ5NkUyMiwgMHg2NjIyMURFNiwgMHgxRDY3QTFCQywKKzB4ODkwMTg4MzAsIDB4MDAwOUEwOEUsIDB4RTM0MEQ1MzgsIDB4MzNGQzYxNTYsCisweDIzMTI2NDU2LCAweDcxMDQ2MTUzLCAweDY3NTIxMzQxLCAweDEzNzI2NDE2LAorMHg3RUU0NkUxMywgMHg2NUU2NjIxMiwgMHg2NkUzRDczMSwgMHgxMzI0NkVFMiwKKzB4NzYwNDI3RTAsIDB4NjA2MkQyMkYsIDB4MzI1NURFMkYsIDB4MkUwMEM5MDEsCisweDA2MEE2RTYyLCAweEQxMkQ0NjA5LCAweDRFMDk0NjA5LCAweDEzNDM0NjA5LAorMHg2NDZEMjFFMCwgMHhCMjUwMUY1RSwgMHg2MjBEMUY2RiwgMHg4QjAxMjIyOCwKKzB4MDAwOUExOEEsIDB4REUyNUQ1MjIsIDB4NjFFMDY0NTAsIDB4RDcyNDY1NEMsCisweDQ3MEI1NEZGLCAweDdGRkM2NjFDLCAweDA2RkVFMDU0LCAweDdGRkMyRjYyLAorMHhFRTQwMDFGRSwgMHgyRjEyM0VGQywgMHg1NUUyRDEyNSwgMHg1N0U0NTZFMywKKzB4NjRFMjQxMEIsIDB4RDIxQzdGMDgsIDB4RTExQzY0MEQsIDB4MUQ0MTJEMTAsCisweEQ2MUE2NTIyLCAweDY3NjIxRDUyLCAweDFENzNERTE5LCAweEQyMTk2RUUyLAorMHg2MjIyMURFNCwgMHhEMjE4MUQyNSwgMHgxRDI2NjIyMiwgMHg2MjIyRDIxNywKKzB4MUQyN0ExNUEsIDB4MDAxMTc4MDAsIDB4MDAyMDJBMTgsIDB4MDAyMDM5OTYsCisweDAwMjAzNUJDLCAweDAwMjAzQTdDLCAweDAwMjAxOEQwLCAweDAwMjAzOTk1LAorMHgwMDExNzgwNCwgMHgwMDIwM0ExNCwgMHgwMDIwM0ExNiwgMHgwMDExNzgxMCwKKzB4MDAyMDM5OTEsIDB4MTA2MjRERDMsIDB4MDAyMDM5OTIsIDB4MDAyMDM5OTMsCisweDAwMTE0QUE0LCAweDAwMjAwRjY4LCAweDAwMUM1ODY0LCAweDAwMUM2ODY0LAorMHgwMDFDNzg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywgMHgwMDFDNzlCQywKKzB4MDAyMDBGQzAsIDB4OEIwNDg4MzMsIDB4NDcwQkQ3QTIsIDB4QTEyM0VFMDAsCisweDg4MjgyREUwLCAweEEwRDM4OTAxLCAweERFOUYwMDA5LCAweDYyRTFFMTQzLAorMHgzMjE2RTA1NCwgMHgwRkU2OEYwMiwgMHgyRTIxRTI0MCwgMHg2MjJENjJFMSwKKzB4OEIwMTMyMTcsIDB4MDAwOUEwQkMsIDB4RTUwMTg1RTEsIDB4OEIwMTMwNTYsCisweDAwMDlBMEI2LCAweDJEMTBFMTAxLCAweDY0RTFCMTExLCAweDA2RkVFMDU0LAorMHg2MjYxRTE0MywgMHgzNTE3NjUyRCwgMHhFNjQwODk0NSwgMHg4QjBDMzU2MywKKzB4RTA1OEU0MUEsIDB4RTUwMDBGNDUsIDB4NzJDMEUwNUMsIDB4NjAyMzBGNTUsCisweDY3MDNDOTA3LCAweEEwMTRFMDYwLCAweDY2NTMwRjc1LCAweDQ2MjE0NjIxLAorMHg0NjIxNDYyMSwgMHg0NTIxNDYyMSwgMHhFMDU4NzYxOCwgMHgwRjY1NDUyMSwKKzB4RTAwMzQ1MjEsIDB4RTA1QzI1MDksIDB4RTAwNzBGNTUsIDB4RTA2MDIyMDksCisweEU4NTQwRjI1LCAweDg1ODIzOEZDLCAweDY0MEQ2NUYzLCAweDE4NDRCMTcwLAorMHhERDdBODU4NCwgMHg4NTg2NkMwRCwgMHg2MTBENEMwOCwgMHg0MTA4NjBDMywKKzB4RTAwRjBFRkUsIDB4MTgxNTREMEIsIDB4MkUyOTYyMDcsIDB4NjY4MjYwQzMsCisweDg1NjIwRkU2LCAweDREMEI1MTg1LCAweDJFMEI2MDBELCAweDU0ODQ2MEMzLAorMHhCMTNDMEZFNiwgMHhFMDU0NjVGMywgMHhFNTQwMEVGRSwgMHhFMDZDNjJFMSwKKzB4MzY1MzY2MkQsIDB4MEY2NjhENDEsIDB4QzkwMzYwMjMsIDB4NDAwMDQwMDgsCisweDYxMDM2NDAzLCAweEQ5NjVFMDcwLCAweDBGNDZFNUZGLCAweEUwNzQ2NTVDLAorMHg2MDUzMEY5NiwgMHg2MjYzNDkwQiwgMHg0MjIxNDIyMSwgMHg0MjIxNDIyMSwKKzB4NDIwMDY3MjMsIDB4NDIwMDMyN0MsIDB4NkMwNzQ2MjEsIDB4NDYyMUUwNTQsCisweDYwNjMwOUZFLCAweDQwMDhDOTAzLCAweDc5MDYzMEZDLCAweDZBMDM2RDJELAorMHg2NUYzRTgwMCwgMHg2NEQzQjEyNCwgMHhFMDcwNkVBMiwgMHgyQUUyMkVDOSwKKzB4MDFGRTY2OTQsIDB4NjY2Q0UwNzQsIDB4NDcwQjA3RkUsIDB4MkUwQjYwNjMsCisweDY1RjMyQUUyLCAweEIwRkE2NEQzLCAweDYyOEQ3ODAxLCAweDMyRTNFRTA2LAorMHg3RDAxOEZFNywgMHgwRUZFRTA1NCwgMHhFMDU0NjJFMSwgMHg0MjAwMDZGRSwKKzB4NzYwQzg1NjEsIDB4NzAxQjMwMkMsIDB4RTQwMDYxMDMsIDB4RTcwNDY1RjMsCisweDY4NjY3NDAxLCAweDM5NzM2OTRELCAweDhGRjkyNTgyLCAweDY1RjM3NTA0LAorMHg2NDFEQjBERCwgMHgwRUZFRTA1NCwgMHg2NEUxQjA5QywgMHgwMDA5QTA1NCwKKzB4RDQzQjU2RjgsIDB4RUEwMUQyM0IsIDB4MjZBMDQyMEIsIDB4MDAwOUEwNEMsCisweDA2RkNFMDFDLCAweDg4Mjk2MDZDLCAweDVDRjg4QjA4LCAweEUyMDBENjM2LAorMHg1MjYxMkMyMCwgMHg2NDJEQjA0QiwgMHgwMDA5QTAzRSwgMHg2NjZDRTY4MSwKKzB4OEIwNDMwNjAsIDB4NDIwQkQyMzEsIDB4QTAzNTU0RjgsIDB4RTY4MjAwMDksCisweDMwNjA2NjZDLCAweEQyMkU4QjA0LCAweDU0Rjg0MjBCLCAweDAwMDlBMDJDLAorMHg2NjZDRTY4MywgMHg4QjBBMzA2MCwgMHhEQTI3NTVGOCwgMHgyNTkwRTkwMCwKKzB4RDgyODU1QTEsIDB4Mjg1MkQ2MjgsIDB4QTAxRDUyQTIsIDB4RTY5MjI2MjAsCisweDMwNjA2NjZDLCAweEQyMjA4QjA4LCAweDVDMjFEODI0LCAweDZDQ0M1MkY4LAorMHgyOEMxRTYwMCwgMHgyMjYwQTAxMCwgMHg2NjZDRTY5MywgMHg4QjA2MzA2MCwKKzB4RDYxRjU5RjgsIDB4RTIwMUVBMDAsIDB4QTAwNTI5QTAsIDB4RDYxNjI2MjEsCisweEQyMURENDFDLCAweDY1NjI0MjBCLCAweDRGMDY3Rjc4LCAweDRGMjY0RjE2LAorMHg2REY2NkVGNiwgMHg2QUY2NkNGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwKKzB4RTI0MDYxNEQsIDB4ODkzMjMxMjMsIDB4MzEyN0UyMUYsIDB4OEIyN0Q3MTMsCisweEQ0MDY2MTRELCAweEUwMDE3MUUwLCAweDU2NzE0NDBCLCAweDI2NTk2NTA3LAorMHgxNzYxQTAyNSwgMHgwMDIwMEZCQywgMHgwMDExNzgwNCwgMHgwMDIwMzQ3MCwKKzB4MDAyMDNBOUMsIDB4MDAyMDE4QzAsIDB4MDAxMTc4MDAsIDB4MDAxMTVGMDAsCisweDAwMTE2MDU4LCAweDAwMjAzOTdDLCAweDAwMjAzOTkwLCAweDAwMjAzQTFBLAorMHgwMDIwM0ExNiwgMHgwMDIwM0FCNCwgMHgwMDIwMThEMCwgMHgwMDFDMzcwNCwKKzB4RTAwMUQ0OTAsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsIDB4NEYyNjI3NjIsCisweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTEyLAorMHhENzg5MzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDI4NiwgMHg0MjBCNzFFMCwKKzB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyODIsIDB4RTAwMTQyMEIsCisweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LAorMHg2MjUyRDU3RSwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDU3QTQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4QTAwMTAwMDksCisweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTczNDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywgMHgyRkU2MDAwOSwKKzB4N0ZGQzRGMjIsIDB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsIDB4RTI4MEQ2NkQsCisweDU0RTExNjE1LCAweDE2NDY0MjE4LCAweDQyMjg1NUUyLCAweDU3RTMxNjU3LAorMHgxNjc4NkVGMiwgMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwgMHg2RUY2QUZDRSwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkM1M0RENjIsIDB4NkU0M0JGRDYsCisweDJERTJCRkJCLCAweDAwMDlCRkQyLCAweDJDMTI1MUQ1LCAweDFDNDE1NEQ2LAorMHgxQzUyNTVENywgMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4NjE2MzZDRjYsIDB4QTAwNEU2MDAsIDB4NjI1NjQxMDksIDB4MjQyMjc2MDEsCisweDM2MTI3NDA0LCAweDAwMEI4QkY5LCAweEQ2NTMwMDA5LCAweDg1NjJFNTAwLAorMHhBMDBCNjc0RCwgMHg2NTVENjEwRCwgMHg0MDAwNjA1MywgMHgzMDVDRDQ0RiwKKzB4MDI0RDQwMDgsIDB4MzI3MDYyMkQsIDB4NzUwMTg5MDUsIDB4MzIxMzYyNUQsCisweDAwMEI4QkYxLCAweDAwMEJFMDAwLCAweDJGRTZFMDAxLCAweDU0NDE2NzQzLAorMHg0RTA4RUU3RiwgMHg0RTI4RDI0NiwgMHgyNUU5NjU0MywgMHg2MDQzNkUyMSwKKzB4OUU3NTYyRUQsIDB4NDUyOUM5MDMsIDB4RTYwMDMyRTMsIDB4OEQ0NTYxMDMsCisweDIxMTg0NTA5LCAweEQyM0Y4QjA1LCAweDAwMkM2MDUzLCAweEEwOEFDOTNGLAorMHg2MDEzNjYwMywgMHg4QjI2ODgwMSwgMHg4ODBDNjA1MywgMHhENTNBOEIwNCwKKzB4QzkzRjg0NTMsIDB4NjYwM0EwN0YsIDB4OEIwNDg4MDgsIDB4ODRFMkRFMzYsCisweEEwNzhDOTNGLCAweDg4MEQ2NjAzLCAweDhCMDNENjMzLCAweEM5M0Y4NDYxLAorMHg2NjAzQTA3MSwgMHg4ODA5NjI2MCwgMHg2MjJDOEYwOSwgMHhFMDE0REUyQywKKzB4NjU1QzA1RUMsIDB4NjAyMzMyNTgsIDB4QTA2NEM5M0YsIDB4NjAyMzY2MDMsCisweEEwNjBDOTNGLCAweDg4MDI2NjAzLCAweEUwMDc4QjVELCAweDYwNDMyNTA5LAorMHg4OTA1QzgxMCwgMHg2MDUzRDIyNSwgMHhDOTNGMDAyQywgMHg2NjAzQTA1MywKKzB4NjA1M0RFMjMsIDB4QzkzRjAwRUMsIDB4NjYwM0EwNEQsIDB4ODgwMTYwMTMsCisweDYwNTM4QjE5LCAweDhCMDQ4ODBDLCAweDg0MjNEMjFFLCAweEEwNDJDOTNGLAorMHg4ODA4NjYwMywgMHhENTFCOEIwNCwgMHhDOTNGODQ1MiwgMHg2NjAzQTAzQiwKKzB4RDYxODg4MEQsIDB4ODQ2MThCMDMsIDB4QTAzNEM5M0YsIDB4NjA2MDY2MDMsCisweEEwMzBDOTNGLCAweDg4MDI2NjAzLCAweEUwMDc4QjJELCAweDYwNDMyNTA5LAorMHg4OTIzQzgxMCwgMHg2MDUzREUxMCwgMHhDOTNGMDBFQywgMHg2NjAzQTAyMywKKzB4MDAwMDBCQjgsIDB4MDAyMDM0NzAsIDB4MDAxQzM3MDQsIDB4MDAxQzM3M0MsCisweDAwMUMzNzAwLCAweDAwMUMzNzBDLCAweDAwMTE0MDAwLCAweDAwMTE0MDA4LAorMHgwMDExNDJEOCwgMHgwMDExNDJFNCwgMHgwMDExNDJFOCwgMHgwMDExNDJGNSwKKzB4MDAxMTQyRUQsIDB4MDAxMTQyRkQsIDB4MDAxMTQzMDksIDB4NjA1M0QyMDksCisweEM5M0YwMDJDLCAweDYwMTM2NjAzLCAweDhCMDM4ODAyLCAweEM4MTA2MDQzLAorMHg3NjAyODkwMCwgMHhDOTNGNjA2MywgMHg0MDAwNDAxOCwgMHgxNzQxMjQwQiwKKzB4NkVGNjAwMEIsIDB4MDAxMTQzMDEsIDB4MDAwOUExNkUsIDB4MkZFNjJGRDYsCisweEREOTQ0RjIyLCAweEEwMDQ5RUIyLCAweEQ0OTMwMDA5LCAweDQyMEJEMjkzLAorMHg2MkQyNjVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjhGRDQ5MCwKKzB4NTVEMTQyMEIsIDB4MjJFODUyRDEsIDB4QTAwNDhCRjgsIDB4RDQ4RDAwMDksCisweDQyMEJEMjhBLCAweDUyRDI1NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LAorMHhEMjg2RDQ4OSwgMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywgMHhBMDA0OEJGOCwKKzB4RDQ4NjAwMDksIDB4NDIwQkQyODEsIDB4NTJENDU1RDQsIDB4OEJGODIyRTgsCisweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RTYzNkM3MywgMHg2RDUzQjAxQSwgMHg2NEQzNTdGNCwgMHhCMDVGNjVFMywKKzB4QjA3NTY2QzMsIDB4QjBBNDAwMDksIDB4QjBBODAwMDksIDB4QjBBQzAwMDksCisweEIwQUMwMDA5LCAweEIwQUYwMDA5LCAweEIwMzE1NEY1LCAweDZDQ0Q2QzAzLAorMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgzNDEyRDE3MCwKKzB4RDY3MDA1MjksIDB4MjY1MEQ3NzAsIDB4Mjc0MjAwMEIsIDB4MDAwOUEwMTgsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2QzczLCAweDZENTNCRkVFLAorMHg2NEQzNTdGNCwgMHhCMDMzNjVFMywgMHhCMDhENjZDMywgMHhCMDBGNTRGNSwKKzB4NkNDRDZDMDMsIDB4NEYyNjYwQzMsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsCisweEU1MDNEMTYyLCAweEQ3NjNENDYyLCAweDIxNTI0NTE4LCAweDI0NzIwMDBCLAorMHhENDVGRDE1RSwgMHgyMTYyRTYwMCwgMHgyNDYyMDAwQiwgMHhCRjczNEYyMiwKKzB4QkY3M0U0MEEsIDB4RDI1QzAwMDksIDB4NDExOEUxMDQsIDB4RTQwQUU1MDAsCisweEJGNjkyMjEyLCAweEQ3NTkyMjUyLCAweENCMjA2MDcyLCAweDAwMEI0RjI2LAorMHg0RjIyMjcwMiwgMHg0MTBCRDE1NiwgMHhENTU2RTQwMCwgMHg0RjI2NDUyQiwKKzB4RDE1NTJGRTYsIDB4NjYxMjZFNjMsIDB4OTIxMDQ0MTgsIDB4NDQwODQ1MjgsCisweDQ1MDAyNjI5LCAweDI2NUI0NDA4LCAweDI2NEI0NDAwLCAweDIxNjI0NzA4LAorMHhEMTRFNDcwOCwgMHgyMTcyMjdFQiwgMHg2RUY2MDAwQiwgMHgxRkZGMDNGMCwKKzB4NEYyMjJGRTYsIDB4RTEwMURFNEEsIDB4QkYzREU0MEEsIDB4NjdFMzJFMTIsCisweEU1MDA3NzZDLCAweEUyMDRFMTMwLCAweDI3NTJFNDBBLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3MjIyNzEyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgxNzVBQkYxOCwgMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwKKzB4RDIzNDZFRjYsIDB4RTQ0MUUxMDEsIDB4MDAwQjIyMTIsIDB4RDEzMjIyNDIsCisweEU2MDVENDMyLCAweDAwMEIyMTYyLCAweDAwMEIyNDYyLCAweEQyMzAwMDA5LAorMHhFNDBBRTYwMSwgMHgyMjYyQUYwMCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4NkM0M0RCMkIsIDB4RUQwMDYwQjIsIDB4MkIwMkNCMDMsCisweEM5MDM2MEIyLCAweDZFMDNBMDA4LCAweDg5MDczREMyLCAweEU0NjQ2MEIyLAorMHhCMDdDQzkwMywgMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4RjA0M0RDMiwKKzB4RDQyMTJGRTEsIDB4NDYwQkQ2MjEsIDB4NjJGMTAwMDksIDB4NjAyMzYyMkQsCisweDg5RkZDODAxLCAweDdGMDQ2MDIzLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHgwMDFDM0I4OCwgMHgwMDIwM0FDOCwgMHgwMDIwMThEMCwKKzB4MDAyMDNBRDAsIDB4MDAyMDNBRDgsIDB4MDAyMDNBRTAsIDB4MDAyMDNBRTgsCisweDAwMjVFNzIwLCAweDAwMjAzREJDLCAweDAwMjAzOTgwLCAweDAwMUM1OTY4LAorMHgwMDFDM0I0MCwgMHgwMDBGODAwMCwgMHgwMDFENDAwNCwgMHgwMDFDMzUwMCwKKzB4MDAyMDE1RTQsIDB4MDAyMDE2MTAsIDB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsCisweDAwMUM1ODMwLCAweDAwMUM2MjY4LCAweDAwMUM1OUE0LCAweDAwMUM2MzlDLAorMHgwMDFDNTgxQywgMHgwMDFDNTg2MCwgMHgwMDIwM0FGMCwgMHgwMDIwMThDMCwKKzB4OEYwMTQ0MTEsIDB4NjA0MzYwNEIsIDB4MDAwOTAwMEIsIDB4NTY1MUQ1MkIsCisweDQ2Mjg2MDUyLCAweDMwNkMwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHhCRkYxNEYwMiwgMHg2QjAzNkU0MywgMHhERDI1REMyNCwKKzB4MDAwOUJGRUMsIDB4M0MwNTMwQjgsIDB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksCisweDAyMEEzRDY1LCAweDQyMDk0MjA5LCAweDMyRTI0MjA5LCAweDRGMDY4QkYwLAorMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgyRkM2NkJGNiwKKzB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsIDB4QkZDRjRGMDIsIDB4NkMwMzZFNDMsCisweEJGQ0JERDEzLCAweDMwQzgwMDA5LCAweDA2MEEzRDA1LCAweDQ2MDk0NjA5LAorMHgzNkUyNDYwMSwgMHg0RjA2OEJGNSwgMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwKKzB4NkNGNjAwMEIsIDB4NEYyMjJGRTYsIDB4RTEwMkRFMEIsIDB4RTQwM0U1MDAsCisweEJGQjkyRTEyLCAweEU2MDYyRTUyLCAweEU3MDA0NjE4LCAweDJFNjJFNDAzLAorMHg0RjI2MkU3MiwgMHg2RUY2QUZCMCwgMHgwMDA5MDAwQiwgMHgwMDFDMTA0MCwKKzB4Q0NDQ0NDQ0QsIDB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3Rjk4LAorMHg2NDUzRTcxMCwgMHg2QjUzNDcyOCwgMHhFRTFBRENCQywgMHg2MTUzNjU1RCwKKzB4MzE1QzQxMDgsIDB4NzUwMTQxMDgsIDB4NjA0MzMxN0MsIDB4MEYxNjY2NUQsCisweEVEMDA2MEIzLCAweDIxQjEzNkUzLCAweDgxMTI4MTExLCAweDExRDI4MTEzLAorMHgxMUQ0MTFEMywgMHg3NDA0OEZFQSwgMHhEOEIxNjdGMiwgMHgxODcxRDlCMSwKKzB4NThGMTI4NzIsIDB4MTk4MUQxQjAsIDB4NTlGMjI5ODIsIDB4NURGNDVBRjMsCisweDU0RjY1RUY1LCAweDIxOTIxMTkxLCAweDExQTIxMUEzLCAweDExRDQxMUQ1LAorMHgxMUU2MTFFNywgMHgxMTQ4MTE0OSwgMHhEQUE4NTVGNywgMHg1N0Y4RUUwMCwKKzB4NTJGOUREQTcsIDB4NjRFM0Q2QTcsIDB4MkE1MjFBNTEsIDB4RDhBN0Q5QTYsCisweDJENzJFQUVGLCAweDZBQUMyNjIyLCAweDZERTM2RUVELCAweDYxRTM0RDA4LAorMHg0MTA4M0RFQywgMHgzMUVDNEQwOCwgMHg2MEIzM0Q5QywgMHgyREIxNDEwOCwKKzB4RTA1MDgxRDEsIDB4RTc5RjQxMDgsIDB4NDEwODQwMDgsIDB4ODFEMjY3N0MsCisweDMxOEM2MEIzLCAweDM0NzJFMjAwLCAweDFERDI4MUQzLCAweEQ0OTMxRDEzLAorMHgxRDI0OEQwMSwgMHg2NUQzRDQ4RiwgMHg3RTAxQjBCMiwgMHgzNEEyNjRFRCwKKzB4REE4QzhCREEsIDB4NjhBMjJGRDIsIDB4NDgyOUREOTEsIDB4NjRBMjJEODIsCisweDY5NEQ3REZDLCAweDJEOTJEMjg2LCAweDRFMjk2RTIyLCAweDJERTI3RDBDLAorMHg2QUQzNjgyMiwgMHhENzg0NjE4RCwgMHg2RDcyMkExNiwgMHhENTgzRDQ4OSwKKzB4NUU3MjI0RDIsIDB4MTRFMkQ2ODgsIDB4RUUwMDUxNzQsIDB4NTg3NjE0MTQsCisweDE0ODZEMTg2LCAweEU3MTA1OTc4LCAweDYyNTIxNDk4LCAweDE0MkE2NUUzLAorMHg2NEUzMjZFMiwgMHg2NDRERTYwMCwgMHg0ODA4Njg0MywgMHg0ODA4Mzg0QywKKzB4NjA1MzM4MUMsIDB4MjhCMTBDODYsIDB4NjBCMzA5Q0UsIDB4NjA1MzgxOTEsCisweDYwNDMwQUNFLCAweDYwNTM4MUEyLCAweDYwQjMwRENFLCAweDYwNTM4MUQzLAorMHg3NDAxMDhDRSwgMHgwOUNFMTg4MiwgMHgxOUUzNjI0RCwgMHgzMjczMEFDRSwKKzB4OEZFMDFBNjQsIDB4RDk2QTc1MDQsIDB4NkM5MkUwMDMsIDB4MkNCMTQwMTgsCisweERBNkY2RDkyLCAweEUwNTA4MUQxLCAweDQwMDg2RTkyLCAweDYxOTI4MUUyLAorMHg4MTEzNjBCMywgMHhFNjAwNjQ5MiwgMHg2NzkyMTQ0MiwgMHgxN0EzRDQ2OCwKKzB4RTFGRjY4OTIsIDB4RTcwMzE4NjQsIDB4NDYwODY1NjMsIDB4NzUwMTM2NEMsCisweDY2NUQyNjEyLCAweDhCRjgzNjczLCAweEUwMDNEQzVBLCAweDQwMTg2REMyLAorMHg2RUMyMkRCMSwgMHg4MUUxRDI1RiwgMHhFRTAwNjFDMiwgMHg2NEMyMTExMiwKKzB4MTQyM0UwMjQsIDB4RDQ1QjY1QzIsIDB4NjdDMjE1RTQsIDB4ODE3MkU1ODAsCisweDY2RTM2OEMyLCAweDY1NUM4MTgzLCAweDY5NjM2NjZELCAweDZBNkQ3NjA0LAorMHgzQTUzMzk0QywgMHgyOUUyOEZGOCwgMHhEQzU0REI1MywgMHg3NDA0MjRCMiwKKzB4N0Y2ODI0QzIsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweDYxNDI2OEY2LCAweEM4MDM2MDExLCAweEU1MDA4RjAzLAorMHgzNDIwRDIzQywgMHg2MDExOEIwNiwgMHg4ODAyQzkwMywgMHhEMjM5OEIwNiwKKzB4OEIwMzM0MjAsIDB4NjUxMzU2MTIsIDB4MjQyMjUyNjQsIDB4NjA1MzAwMEIsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDYyNTM2RTUzLCAweDZENDNFNTUwLAorMHg0NTA4RTQwMCwgMHhFMTAxQTAwMSwgMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwKKzB4NjA1MzgxMjMsIDB4NTZFMjgxMjIsIDB4OEJGNTM2MjAsIDB4MTZFNEQyMzgsCisweEU2MTQ2NEYzLCAweDY1RTM0MjBCLCAweEU0RkM2NUUxLCAweDJFNTEyNTQ5LAorMHg2NUYzNjFGMSwgMHgyRjExMjE0OSwgMHhEMTMxNTREMSwgMHhFNjE0NDEwQiwKKzB4NjA3MTU3RDEsIDB4MjcwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDY2NTM2RTUzLAorMHg2RDQzRTVGQywgMHgyMDU5NjA2MSwgMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwKKzB4MTJFNDhCMDYsIDB4MzFFMDUxRTIsIDB4NTJEMThCMDQsIDB4MUUyMkEwMDIsCisweDU2NjRBRkYwLCAweDY0RjNEMjFFLCAweDQyMEJFNjE0LCAweDY3RTE2NUUzLAorMHgyNzE5RTFGQywgMHg2N0YxMkU3MSwgMHgyNzE5NTREMSwgMHg2NUYzRDExOCwKKzB4NDEwQkU2MTQsIDB4NTJEMTJGNzEsIDB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsCisweDRGMjY3RjE0LCAweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMjAzOUFDLAorMHgwMDIwMzU3QywgMHgwMDIwMzU4NCwgMHgwMDIwMzU4QywgMHgwMDIwMzVCNCwKKzB4MDAyMDM5OTgsIDB4MDAyMDM5QTAsIDB4MDAxMDAyMDgsIDB4MDAxMDE0QzAsCisweDAwMUUyMTBDLCAweDAwMUMzRDAwLCAweDAwMjAzOUVDLCAweDAwMTAwMEM4LAorMHgwMDExNzg4MCwgMHgwMDExNzc4MCwgMHgwMDA0MDAyMCwgMHgwMDI2QzQwMSwKKzB4MDAyMDBENDIsIDB4NEYyMjJGRTYsIDB4REU0MjYyNEMsIDB4NDIwMDQyMDgsCisweDNFMkNBMDA1LCAweEQ0NDA1MjUyLCAweEJGNjk1NjI0LCAweDY1RTIyRTYyLAorMHgzNTIwNTJFMSwgMHhENjNEOEJGNiwgMHg0RjI2MjYyMiwgMHg2RUY2MDAwQiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4REMzOTRGMjIsIDB4NTJDMURCMzksCisweDM2MjA2NkMyLCAweDYwNjE4OTFDLCAweDg4MDFDOTAzLCAweERFMzQ4OTE4LAorMHhCRjM4REQzNSwgMHg2NTAzNjRFMywgMHg2NkIyODUwMywgMHgzMjYyNjIwRCwKKzB4RDQzMjg5MDcsIDB4MDAwOUJGNzYsIDB4NEQwQkQ0MzEsIDB4QUZFNjAwMDksCisweEJGM0QwMDA5LCAweEQ0MkY2NEUzLCAweDAwMDk0RDBCLCAweDAwMDlBRkRGLAorMHgyMjYyRDIyRCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REQyOURDMjgsIDB4NkU0MzYwQzIsCisweDA0REU0MDA4LCAweEU2MTREMTI3LCAweDY1RTM0MTBCLCAweEQxMjdENzI2LAorMHg1NUUyMjdFMiwgMHgzNUUwNTI1NCwgMHgyMTIyOEYwNCwgMHg0MDA4NjBDMiwKKzB4MTIyMjAyREUsIDB4NjA1MzY1QzIsIDB4NzUwMTQwMDgsIDB4MERFNjA2REUsCisweEM5MEY2MDUzLCAweDYwNjMyQzAyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHg4NTQzNkNGNiwgMHg2NTBENTY0MywgMHg2MjJENjI2MiwgMHgzNTI3NzIwNCwKKzB4RTEwMDhGMEMsIDB4MjI2ODk2MEMsIDB4RDYxNThCMDMsIDB4NzIwMTUyNjEsCisweEQ2MTMxNjIxLCAweDYyNjJFMTAxLCAweDI2MjI3MjAxLCAweDYwMTMwMDBCLAorMHgwMDAwMDFGRiwgMHgwMDIwMzU4QywgMHgwMDIwMzU4NCwgMHgwMDFDM0QwMCwKKzB4MDAyMDM1QjQsIDB4MDAyMDM5N0MsIDB4MDAyMDE4QzAsIDB4MDAyMDM1N0MsCisweDAwMjAzQjE4LCAweDAwMjAzQjFDLCAweDAwMUMzRDI4LCAweDAwMjAzOUVDLAorMHgwMDIwMzlBQywgMHgwMDIwMEQ0MiwgMHgwMDIwMzlGMCwgMHgwMDIwMzlGNCwKKzB4MDAxMTc3NTQsIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGRjg0RjIyLCAweDZDMjJEMjQxLCAweEM4MDM2MEMzLCAweERFNDA4OTZFLAorMHhEQTQxREI0MCwgMHg1MkIxRDk0MSwgMHgzNjIwNjZCMiwgMHg2MDYxODk0NSwKKzB4ODgwMUM5MDMsIDB4REQzQjg5NDEsIDB4NDIwQkQyM0QsIDB4NjUwMzY0RDMsCisweDYwQTEyRjAyLCAweDg5MzI4ODAxLCAweDg1MTQ1MTUzLCAweDg4NDA2MDBDLAorMHgxRjExOEYwQywgMHhENTM3NjE5MSwgMHg2NDFENDUwQiwgMHg4QjI2MjAwOCwKKzB4RDczNTY2OTEsIDB4NjQ2RDQ3MEIsIDB4OEIyMDIwMDgsIDB4NDIwQkQyMzMsCisweDUxRjE1NEYxLCAweEM4MjA4NTExLCAweEQxMzE4OTA0LCAweDAyMUVFMDUwLAorMHgwMTI2NzIwMSwgMHg0MjBCRDIyRiwgMHgyMDA4NjRGMiwgMHg2NEQzODkwNywKKzB4NEQwQkREMkQsIDB4RDEyRDY1RjIsIDB4QUZDNEU2MDEsIDB4RDIyQzIxNjIsCisweDQyMEI2NUYyLCAweEQ3MkI2NEUzLCAweEFGQkNFNjAxLCAweEQyMjYyNzYyLAorMHg0MjBCNjVGMiwgMHhBRkI2NjREMywgMHhERTI3MDAwOSwgMHhEQTI4REQyNywKKzB4NTJEMURCMjgsIDB4MzYyMDY2RDIsIDB4NjA2MTg5MTgsIDB4ODgwMUM5MDMsCisweEQ0MjI4OTE0LCAweDQ1MEJENTE2LCAweDU2MDMwMDA5LCAweDhGMDQzNkUwLAorMHhFMjAxNjUwMywgMHhBRkVDMkEyMCwgMHhENDFGMkI1MiwgMHg0MjBCRDIxNiwKKzB4RDcxODAwMDksIDB4NDExOEUxMDEsIDB4MjcxMkFGRTMsIDB4QzgwNDYwQzMsCisweEQyMUE4OTAyLCAweDAwMDk0MjBCLCAweDRGMjY3RjA4LCAweDZERjY2RUY2LAorMHg2QkY2NkNGNiwgMHgwMDBCNkFGNiwgMHgwMDAwNjlGNiwgMHgwMDFFMjEwMCwKKzB4MDAyMDM1OEMsIDB4MDAyMDM1ODQsIDB4MDAyMDNBMTQsIDB4MDAxMTQyRDgsCisweDAwMjAxNEE2LCAweDAwMTE1RUEyLCAweDAwMTE0Nzc0LCAweDAwMjAwRDhBLAorMHgwMDIwMzUxQywgMHgwMDIwMTZDMiwgMHgwMDIwMTREMCwgMHgwMDFFMjEyQywKKzB4MDAyMDE1MzQsIDB4MDAxQzNEMzAsIDB4MDAxMTc4ODAsIDB4MDAyMDM1N0MsCisweDAwMjAzOTlDLCAweDAwMjAzOTk4LCAweDAwMjAzNUI0LCAweDAwMjAwNjQ0LAorMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwgMHgwMDAwMTI2NiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsIDB4MDAwOTAwMEIsCisweDAwMDkwMDBCLCAweDAwMDkwMDBCLCAweEUwMDAwMDBCLCAweEUwMDAwMDBCLAorMHgwMDA5MDAwQiwgMHhFNEZERDU5RCwgMHhENjlENjE1MiwgMHgyNTEyMjE0OSwKKzB4NzQwMTYwNTIsIDB4MjUwMkNCMDEsIDB4RDE5QTY3NTIsIDB4MjU3MjI3NDksCisweEM4NDA2MDEwLCAweDYwNjI4OTAyLCAweDI2MDJDQjA0LCAweEUxRjc2NDYyLAorMHgyNjQyMjQxOSwgMHhFNzAxNjA2MiwgMHgyNjAyQzlDRiwgMHhFNTAyNjA2MiwKKzB4MjYwMkNCMTAsIDB4NDcxODYwNjIsIDB4MjYwMkNCMDMsIDB4MDAwQjE2NTIsCisweEQ1OEQxNjczLCAweEQyOEVENzhELCAweEUxMDBENDhFLCAweDI1MTFFNjAwLAorMHgyMjEwMjcxMSwgMHgyNDYxQUZDRSwgMHhEMjhCNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI4NzY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjgzLAorMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3RiwKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI3QTY2NEMsCisweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNzY2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyNzIsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjZFLCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLAorMHhENjY5NjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4NjI0QzYwMEMsIDB4NDIwMEQ2NjQsIDB4NjAyMDMyNkMsCisweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLCAweDY0NENEMTYwLAorMHg2MjQwMzQxQywgMHg2MDJDMDAwQiwgMHg2NDRDRDE1RSwgMHg2MjQwMzQxQywKKzB4NjAyQzAwMEIsIDB4NEYyMjJGRTYsIDB4NjQ1QzZFNDMsIDB4MzQ2N0U2MEEsCisweEJGRUI4OTE0LCAweDY0MEMwMDA5LCAweDg4MDE2MEVDLCAweEUwMEY4QjAyLAorMHgyNDA5QTAwMiwgMHg0NDA5NDQwOSwgMHhFNjBBNjI0QywgMHg4OTA1MzI2MywKKzB4NjQ0Q0JGRTIsIDB4NjAyMzYyMEMsIDB4OEIwMEM4ODAsIDB4NjAyM0UyMDAsCisweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDYwNjJENjRCLCAweDhCMDM4ODAxLAorMHgwMDA5QjI1NiwgMHgwMDA5QTAwMywgMHhFNjQwRDI0OCwgMHhENjQ4MjI2MCwKKzB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsIDB4RDY0MzRGMjIsIDB4ODgwMjYwNjIsCisweEIyOUY4QjAxLCAweEQ2NDIwMDA5LCAweDRGMjZFMjAwLCAweDI2MjIwMDBCLAorMHhENDNFRDUzRCwgMHhFNzAxRTEwMCwgMHgwMDBCMjUxMiwgMHhEMjNCMjQ3MCwKKzB4MDAwQkU2MDQsIDB4NEYyMjIyNjAsIDB4RDEzQkQ0M0EsIDB4MDAwOTQxMEIsCisweEUxRkRENTNBLCAweEQyM0E2NjUwLCAweEU3MDAyNjE5LCAweDRGMjYyNTYwLAorMHgyMjcwMDAwQiwgMHhENTM3NEYyMiwgMHg2MTUyRDIzNywgMHg2MTFERDczNywKKzB4NjQ1MjI1MTIsIDB4MjQyQkU2RkYsIDB4RDQzNTI1NDIsIDB4NjY2REQyMkUsCisweDI3NjI0MjBCLCAweEUxRkJENTJELCAweDI3MTk2NzUwLCAweDAwMEI0RjI2LAorMHg0RjIyMjU3MCwgMHhEMTI4RDQyRiwgMHgwMDA5NDEwQiwgMHhFN0Y3RDUyNywKKzB4MjY3OTY2NTAsIDB4MDAwQjRGMjYsIDB4RDUyNDI1NjAsIDB4NjI1MDk0MjUsCisweDAwMEIyMjQ5LCAweEQ1MjEyNTIwLCAweDYyNTBFNEJGLCAweDAwMEIyMjQ5LAorMHg0RjIyMjUyMCwgMHg4NTIyRDIyNCwgMHgyMDA4NjAwRCwgMHg4ODAxODkxMSwKKzB4ODgwMzg5NDQsIDB4ODgwNTg5NDYsIDB4ODgwNjg5NDgsIDB4ODgwODg5NEUsCisweDg4MDk4OTU0LCAweDg4MEE4OTVBLCAweDg4MEI4OTYwLCAweEEwNkQ4OTY2LAorMHhCMDZGMDAwOSwgMHhBMDZBMDAwOSwgMHhGRjdGNjAwQywgMHgwMDFFMjE0OCwKKzB4MDAxRTExMDgsIDB4MDAxRTEwMDAsIDB4MDAyMDNBNEMsIDB4MDAyMDNBNEUsCisweDAwMjAzQTZELCAweDAwMjAzQTMwLCAweDAwMUUxMDNGLCAweDAwMUUxMDVGLAorMHgwMDFFMTAyRiwgMHgwMDFFMTA5MCwgMHgwMDIwM0E1NCwgMHgwMDFFMTAwQiwKKzB4MDAyMDNBNTAsIDB4MDAyMDNCMjAsIDB4MDAyMDE4QzAsIDB4MDAxRTEwMjgsCisweDAwMjAzQTZDLCAweDAwMUQ0MDIwLCAweDk4NzYwMDAwLCAweDAwMUMxMDAwLAorMHgwMDIwM0IyQywgMHgwMDIwM0IzQywgMHgwMDIwM0EyNCwgMHgwMDA5QjA0QywKKzB4NjAwQ0EwMzUsIDB4MDAwOUIwNTUsIDB4NjAwQ0EwMzEsIDB4NjI2MEQ2ODQsCisweDhCMkIyMjI4LCAweDAwMDlCMDYxLCAweDYwMENBMDI5LCAweDYyNjBENjgwLAorMHg4QjIzMjIyOCwgMHgwMDA5QjA2OSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY3QywKKzB4OEIxQjIyMjgsIDB4MDAwOUIwQzcsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2NzgsCisweDhCMTMyMjI4LCAweDAwMDlCMENELCAweDYwMENBMDExLCAweDYyNjBENjc0LAorMHg4QjBCMjIyOCwgMHgwMDA5QjEyNSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3MCwKKzB4OEIwMzIyMjgsIDB4MDAwOUIxM0QsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsCisweDAwMDkwMDBCLCAweEQyNkNEMTZCLCAweEQ1NkM4NDEyLCAweDQwMDBDOTBGLAorMHhENzZCMDEyRCwgMHhFNDAzRDY2QiwgMHhFMjBGNjExQywgMHgyNTQwRTAwMSwKKzB4MjUyMDI3MTIsIDB4MjYwMjAwMEIsIDB4RTYwMUQyNjIsIDB4MzA2Njg1MjMsCisweEUwMDA4RDA1LCAweEQ2NjNEMjYwLCAweEUwMDE4MTIyLCAweDAwMEIyNjAyLAorMHhEMjVDMDAwOSwgMHg2MDBEODUyMywgMHg4OTA1MjAwOCwgMHg4QjBBODgwMSwKKzB4NjA2MEQ2NUQsIDB4MjYwMENCMDEsIDB4RDQ1N0Q2NUEsIDB4RTAwMUUxMDEsCisweDAwMEIyNjEyLCAweDAwMEI4MTQyLCAweEQxNTJFMDAwLCAweDg1MTNFNTAxLAorMHg2NDBENDUxOCwgMHg2NjAzMzQ1MywgMHhFMDAwOEQwNSwgMHhENTUxRDI1MywKKzB4MjI2MEUwMDEsIDB4MDAwQjI1MDIsIDB4NEYyMjAwMDksIDB4ODUxM0QxNDksCisweDY0NTM2NTBELCAweDYyNDk0NDE5LCAweDIyN0Q2NzJFLCAweDg4MDE2MDJDLAorMHg4ODAyODkwOSwgMHg4ODAzODkxMCwgMHg4ODA2ODkxQSwgMHg4ODA3ODkzNSwKKzB4QTA0Qzg5M0IsIDB4RDU0NjAwMDksIDB4NjY1MkQ3NDYsIDB4Mjc2MkQ0NDYsCisweDYyMkM2MjYxLCAweDI0MjFBMDM4LCAweDIyMjg2MjVDLCAweEQ0NDM4QjNGLAorMHg2NjQyRDU0MCwgMHgyNTYyRDQ0MCwgMHgyNDAxODU2MSwgMHg2MjAzQTAyQywKKzB4MjAwODYwNUMsIDB4ODgxMDg5MDcsIDB4ODgyMDg5MDgsIDB4ODgzMDg5MDksCisweEEwMkM4OTBBLCAweEQyM0EwMDA5LCAweDYyMjJBMDA4LCAweEEwMDVEMjM5LAorMHhEMjM5NjIyMiwgMHg2MjIyQTAwMiwgMHg2MjYyRDYzOCwgMHhENDMyRDUzMSwKKzB4NjYyMTI1MjIsIDB4QTAwRjYyNkMsIDB4RDYzNTI0MjEsIDB4NjI2MUQ1MkQsCisweDYyMkNENDJELCAweEEwMDcyNTYyLCAweEQ2MzIyNDIxLCAweDg1NjFENTI5LAorMHgyNTYyRDQyOSwgMHg2MjAzMjQwMSwgMHg2NjJEODUxNSwgMHgzNjE3NjEwRCwKKzB4NjUwMzhGMDEsIDB4QjBDQjI0NTEsIDB4QTAwMTAwMDksIDB4RTAwMEUwMDEsCisweDAwMEI0RjI2LCAweEQ2MTkwMDA5LCAweEQ0MjdFMTAxLCAweDY1NDEyNjEwLAorMHhEMTE4RDcxNywgMHhFMjBGNjU1RCwgMHgyNzUyRTAwMSwgMHgwMDBCMjYyMCwKKzB4MkZFNjIxMDIsIDB4RDIwRjRGMjIsIDB4NjQwQzg1MjMsIDB4OEIwODI0NDgsCisweEQ1MTFENjFELCAweDI2MjFFMjAwLCAweDk0MEY4NDUxLCAweEEwNDgyMDQ5LAorMHhERTBEODA1MSwgMHhDODQwNjBFMCwgMHhFMjAxOEQzMiwgMHg4OTQ0MzQyNywKKzB4RDIxNkQ2MTUsIDB4MjY0MTQyMEIsIDB4MDAwOUEwMzAsIDB4MDAwMEZGN0YsCisweDAwMjAzQTZELCAweDAwMjAzQTI0LCAweDAwMjAzQTMwLCAweDAwMUUxMTAwLAorMHgwMDFFMTAwQywgMHgwMDIwM0E1MCwgMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwKKzB4MDAyMDNBNTgsIDB4MDAyMDNBMzgsIDB4MDAyMDNBM0MsIDB4MDAyMDNBNDAsCisweDAwMjAzQTVDLCAweDAwMjAzQTYwLCAweDAwMjAzQTY0LCAweDAwMjAzQTY4LAorMHgwMDIwM0UyMCwgMHgwMDIwM0UyQSwgMHgwMDIwM0E0QSwgMHgwMDIwMjdGMiwKKzB4ODkxMjM0MjcsIDB4RDI5NEQ2OTMsIDB4MjY0MTQyMEIsIDB4Q0I4MDg0RTEsCisweDgwRTFCMEY1LCAweEQ2OTE2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDYwLAorMHhENjhGMjYwMCwgMHhBMDAxRTAwMSwgMHhFMDAwMjYwMiwgMHgwMDBCNEYyNiwKKzB4RDY4QzZFRjYsIDB4Qzg4MDYwNjAsIDB4RDI4Njg5MTksIDB4ODgwMTYwMjEsCisweEQyODk4QjE1LCAweDg1MjRFNTAxLCAweDg5MTAzMDU2LCAweEUyMDNEMTg3LAorMHgyMTIwRDQ4NywgMHhFMDBCNjU0MSwgMHgwNjU2NjU1RCwgMHhFNDBGRDU4NSwKKzB4MjE0MEU3MDIsIDB4RDc3RTI1NzEsIDB4MDAwQkUwMDEsIDB4MDAwQjI3MDIsCisweDJGRTZFMDAwLCAweERFODA0RjIyLCAweEM4ODA4NEUxLCAweEQ1N0E4OTJDLAorMHgyMDA4ODU1NCwgMHg2MTAzOEYyOCwgMHg4NTUzRDc3QywgMHg2NDAzNjY3MiwKKzB4ODU2NjY1MEMsIDB4MzUyMDYyMEMsIDB4RDY3OThCMUUsIDB4NjUxQ0Q3NzQsCisweDI2NTE2NDRDLCAweDYwRTAyNzQxLCAweDg5MDRDODQwLCAweDQyMEJEMjc1LAorMHhBMDAzMDAwOSwgMHhEMjY4MDAwOSwgMHgwMDA5NDIwQiwgMHgwMDA5QjA5RiwKKzB4RTIwMUQxNjcsIDB4NjBFMDIxMjIsIDB4Q0IwNEQ0NjQsIDB4NjA0MDJFMDAsCisweDI0MDBDOTNGLCAweDYwMjNBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHhEQTYyMkZFNiwgMHg2NkExRTI0MCwKKzB4MzYyMkRDNUUsIDB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsCisweDRFMjEyQTYxLCAweERCNjFENDYwLCAweEU3MDBBMDBGLCAweDc3MDE2MkIyLAorMHg3MTAyNjEyMywgMHg2NjIxMkIxMiwgMHg3MTAyNjIxMywgMHg2MTIxMkIxMiwKKzB4NjUxRDY2NkQsIDB4MzU2QzQ1MjgsIDB4NjI3QzI0NTIsIDB4OEJFRDMyRTMsCisweEM5MDM2MEQzLCAweDhCMTA4ODAzLCAweDYxNzM2N0IyLCAweDJCMTI3MTAyLAorMHg3MTAyNkUxMywgMHgyQjEyNjU3MSwgMHg2NTVENkRFMSwgMHg0MjI4NjJERCwKKzB4MzI1Q0UxMDcsIDB4QTAwQzJDMTAsIDB4ODgwMjI0MjIsIDB4QTAwMzhCMDEsCisweDg4MDFFMjAzLCAweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY1NUQ2NTYxLAorMHhFNjBGMjQ1MiwgMHg2N0ExMkM2MCwgMHg4QjA1Mjc3OCwgMHhERDM4REM0NCwKKzB4RUIwMUVBMDAsIDB4MkRCMjJDQTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDZBRjYwMDBCLCAweDJGRTYyRkQ2LCAweEUyNDBERDM2LCAweDM2MjI2NkQxLAorMHg2MjYzODkwMCwgMHgzNjc4NjcyQywgMHg3NzAzREUzOCwgMHg0NzIxMkQ2MSwKKzB4NjRFMkQ2MzUsIDB4QTAwRTQ3MjEsIDB4NjU2MkUxMDAsIDB4NjI1MzcxMDEsCisweDc0MDEyNDUwLCAweDI0MjA0MjE5LCAweDQ1Mjk3NDAxLCAweDc0MDEyNDUwLAorMHgyNDUwNDUxOSwgMHg2MjFDNzQwMSwgMHg4QkVFMzI3MywgMHg2NkUyNDIwMCwKKzB4NDIwMDYxRDEsIDB4MjExODM2MkMsIDB4MkU2MjhGMDYsIDB4REQxQ0Q3MjgsCisweEU1MDFFNDAwLCAweDJENTIyNzQyLCAweDAwMEI2RUY2LCAweDJGRDY2REY2LAorMHg0RjIyMkZFNiwgMHhFRDBBRUUwMSwgMHg2NEUzQkM4NiwgMHhCQzhCNjRFMywKKzB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4QkM4RUVFMDEsIDB4NjRFMzY0RTMsCisweDdFMDFCQzkzLCAweDMyRDc2MkVDLCAweDRGMjY4QkY3LCAweDAwMEI2RUY2LAorMHhEMTE4NkRGNiwgMHhENDE4OTIwRCwgMHg3MjEyMjEyMiwgMHgyNDIyRDYxNywKKzB4RDcxNzcyMDQsIDB4NzIyMDI2MjIsIDB4MjcyMkQxMTYsIDB4MDAwQjcyMzAsCisweDEzN0EyMTIyLCAweDAwMjAzQTRBLCAweDAwMjAyOEZFLCAweDAwMUUxMDE1LAorMHgwMDIwM0E1MCwgMHgwMDFFMTAwMSwgMHgwMDIwM0EyNCwgMHgwMDFFMTEwMCwKKzB4MDAyMDNBNEUsIDB4MDAyMDNBM0MsIDB4MDAxRTEwMDAsIDB4MDAyMDNBNDAsCisweDAwMjAzQTRDLCAweDAwMjAyN0YyLCAweDAwMUUxMDBDLCAweDAwMjAzQTM4LAorMHgwMDIwM0E1NCwgMHgwMDIwM0E1OCwgMHgwMDIwM0E1QywgMHgwMDIwM0E2MCwKKzB4MDAyMDNBNjQsIDB4MDAyMDNBNjgsIDB4NEYyMjJGRTYsIDB4RDY3MDdGRkMsCisweDg4MDE2MDYwLCAweEUyMDE4OTUxLCAweDI2MjBCRkJCLCAweEQ1NkVEMTZELAorMHhERTZFNjAxMCwgMHg2NEUzNjU1MiwgMHg3NDAyQzg0MCwgMHg4RDIyRDE2QywKKzB4RDI2Qzc1MDIsIDB4RTYwMUQ3NkMsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NjM3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1NjIsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweEEwMjA3MTAyLCAweEQyNUUwMDA5LCAweEU2MDFENzVCLCAweEU3MDQyNzIyLAorMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDUyNzQwMiwKKzB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsCisweDgxRTQ2MDdDLCAweEU0MTdENTUzLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLAorMHg4RkY5MjE3MSwgMHg5Mjg5NzEwMiwgMHhEMjQ2MkUyMSwgMHg1RTIzRDc0RSwKKzB4NjRGMjJGRTIsIDB4NjA0MzY1RjIsIDB4MjcwMEM5ODAsIDB4Qzk2MDYwNDMsCisweDgwNzE2MTAzLCAweEM5MDM2MDQzLCAweDgwNzI0NTE5LCAweDY1RjI2MDVDLAorMHg4MTcyNjZGMiwgMHg0NjE5NDYyOSwgMHg2MDZDNDUyOSwgMHg0MDE4NjQ1QywKKzB4ODE3MzMwNEMsIDB4MjExODVFMjMsIDB4NjRGMjJGRTIsIDB4NkU0QzYyRjIsCisweDYwMkM0MjE5LCAweDY2RjI2MkYyLCAweDQ2Mjk0MDE4LCAweDQ2MTkzMEVDLAorMHg0MjI5ODE3NCwgMHg2NTJDNjA2QywgMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywKKzB4MDAwOUJDOTcsIDB4MjIyODYyMEMsIDB4QTAwQTg5MDgsIDB4NjAxMzAwMDksCisweDhCMDM4ODQwLCAweDAwMDlCMDA5LCAweDAwMDlBMDAzLCAweEUyMDJENjJGLAorMHg3RjA0MjYyMiwgMHgwMDBCNEYyNiwgMHg0RjIyNkVGNiwgMHg4NTUyRDUyQSwKKzB4ODgzMDYwMEQsIDB4ODgzMTg5MDMsIDB4QTAzNDg5MjMsIDB4ODU1NTAwMDksCisweEQ0MjhENzI3LCAweDg1NTMyNzAxLCAweDYxMERENjI3LCAweDI0MTI0MTE4LAorMHg0NjBCRDQyNiwgMHhENzIzMDAwOSwgMHhEMjI2RDQyNSwgMHg2NTcyNDIwQiwKKzB4RTIzMEQxMjAsIDB4NDIyODY3MTIsIDB4MjcyOUU2MjAsIDB4Mzc2MDQ2MjgsCisweEQ2MjE4QjAzLCAweEEwMTZFMjAwLCAweEQ2MUYyNjIyLCAweEEwMTJFMjAyLAorMHhEMTE4MjYyMiwgMHg2MjEyRTUzMCwgMHhFNjIwNDUyOCwgMHg0NjI4MjI1OSwKKzB4ODkwODMyNjAsIDB4RDQxQUQxMTksIDB4RTYwMUQ1MTMsIDB4MjE2MDQ1MEIsCisweDQ3MkJENzE4LCAweDRGMjY0RjI2LCAweDAwMDkwMDBCLCAweDAwMDAwNjBBLAorMHgwMDIwM0E2QywgMHgwMDFFMTAwMCwgMHgwMDIwM0E1OCwgMHgwMDIwM0UyMCwKKzB4MDAyMDNFMkMsIDB4MDAyMDNEQzQsIDB4MDAyMDNBNDAsIDB4MDAyMDNERjQsCisweDAwMjAzREYyLCAweDAwMjAzREM2LCAweDAwMjAzQTI0LCAweDAwMjAzQTUwLAorMHgwMDIwM0EzQywgMHgwMDIwM0EzOCwgMHgwMDIwMThDMCwgMHgwMDIwM0I0OCwKKzB4MDAyMDNCNEMsIDB4MDAyMDE4RDAsIDB4MDAyMDNBNTQsIDB4MDAxRTEwMEIsCisweDAwMjAzQjYwLCAweDAwMTE0MDA0LCAweDRGMjIyRkU2LCAweDg0RTlERTg2LAorMHgyNDQ4NjQwQywgMHhCMTdCODkwMSwgMHhEMjg0MDAwOSwgMHgyNjY4NjYyMCwKKzB4NjBFMDg5MDIsIDB4MkUwMEM5QkYsIDB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsCisweDJGRTYwMDA5LCAweERFN0U0RjIyLCAweDYwRTBENjdFLCAweENCQzBENDdFLAorMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwKKzB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY3ODYxNkQsIDB4RTUwMEEwMDQsCisweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELCAweEQyNzQ4QkY4LAorMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjI2MEQ2NkUsIDB4ODk0MDIyMjgsCisweEQ1NjVFMTAwLCAweDYwNTAyNjEwLCAweENCNDBENDZCLCAweDI1MDA0NDBCLAorMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywgMHg3MTA0NjEyQywgMHgyRjExQTAwNiwKKzB4RDQ2NkQ2NUUsIDB4REQ2NjY3NjAsIDB4NjU3QzREMEIsIDB4RTIzQzZEMUQsCisweDhCMDMzRDI3LCAweEQyNjRENDYzLCAweDAwMDk0MjBCLCAweDREMjE0RDIxLAorMHhBMDA1RDc2MiwgMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwKKzB4MzVEMzY1NEQsIDB4RDc1RThCRjcsIDB4NkU3MkUwMDMsIDB4ODFFMTQwMTgsCisweDZFNzI2MEYxLCAweDgxRTI3MDBDLCAweEQ0NUE2MTcyLCAweERENUE4MTEzLAorMHg2NTcyNEQwQiwgMHhENjRBRDI1OSwgMHgyMjEyRTEwMSwgMHhDOTNGNjA2MCwKKzB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweEQyNTI0RjIyLCAweDZCNDM2RTczLCAweDQyMEI2QzUzLAorMHgyMDA4NkQ2MywgMHg2NDAzOEQxQywgMHhFNTBFRDEzQywgMHgzMjUyNjIxMCwKKzB4NjBDMzg5MTYsIDB4ODA0MTI0QjAsIDB4ODE0MTYwRDMsIDB4QTAwN0U1MDAsCisweDY1NUQ2MUJDLCAweDAwRUM2MDUzLCAweDM2NEM2NjUzLCAweDgwNjQ3NTAxLAorMHgzMjEzNjI1RCwgMHhENjMwOEJGNSwgMHhDOUJGNjA2MCwgMHgyNjAwQTAwOCwKKzB4RDIzOUQ0NDAsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDJGOTYyRjg2LAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFMTAwN0ZDNCwKKzB4NjUxM0VDRkYsIDB4NkIxMzZDQ0QsIDB4REUzNEQ3MzMsIDB4RURGRjY0RjMsCisweEQ4MzNFQTA0LCAweDYwNTM2NTVDLCAweDAyN0Q0MDAwLCAweDMyQzA2MjJELAorMHg2NjAzOEQwRCwgMHgwOUVENjA2MywgMHgyNDkxMDI3RCwgMHgyNDIxNzQwMiwKKzB4Njk4MjAyRUQsIDB4MzkyODYyMkQsIDB4NzQwMjI4OTIsIDB4NzUwMTcxMDQsCisweDYwNjM2MjVDLCAweDA3RDUzMkEyLCAweDBFQjU4RkU0LCAweDI0NDg2NDFDLAorMHhFNjgwODkwNSwgMHg2N0YzRTVDNSwgMHhCRjhGNjY2QywgMHg3RjNDNjU1QywKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweEQxMUM2OEY2LCAweDYwMTJEMjFDLCAweENCMjBFNDA1LCAweDIxMDJFNTAwLAorMHgwMDBCMjI0MiwgMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywgMHgwMDIwMzk5NiwKKzB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsIDB4MDAxRTEwRkMsCisweDAwMjAwNjQ0LCAweDAwMjAzOTlDLCAweDAwMjAyQTU2LCAweDAwMjAzQjY0LAorMHgwMDIwMThEMCwgMHgwMDIwM0I4MCwgMHgwMDIwMThDMCwgMHgwMDExNzg4QywKKzB4MDAyMDM5OTgsIDB4MDAyMDM1N0MsIDB4MDAyMDE1MzQsIDB4MDAxRTIxMzAsCisweDAwMjAyQTE4LCAweDAwMjAzQjg4LCAweDAwMjAzOUZDLCAweDAwMjAzQTA0LAorMHgwMDIwM0RDMCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHhENTY0RDE2MywKKzB4RTQwMEQ3NjQsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsIDB4RDU2MjI3MjIsCisweDk2NjlENzYyLCAweDE1NDEyNTcyLCAweDk2NjYxNTYyLCAweEU2MDExNTY1LAorMHhENTVGMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsIDB4Njc2MzI1NzIsCisweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LCAweEUyMTkyNTIyLAorMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTIyMjU0MiwKKzB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LCAweDAwMDk0MjJCLAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhDODIwNjA0MywgMHg2RTQzOEQwMiwKKzB4MDAwOUJFODUsIDB4QzgxMDYwRTMsIDB4QkU4Mjg5MDEsIDB4NjBFMzAwMDksCisweDg5MDFDODQwLCAweDAwMDlCRUE0LCAweEM4MDE2MEUzLCAweEREM0Q4OTM4LAorMHhDODAyNjBEMCwgMHgyRjAwOEQwMywgMHg0NjBCRDYzQiwgMHg2MEYwMDAwOSwKKzB4ODkwMkM4MDQsIDB4NDYwQkQ2MzksIDB4NjJGMDAwMDksIDB4Qzg4MDYwMjMsCisweDYwRDA4OTAyLCAweDJEMDBDOTdGLCAweEM4MDE2MDIzLCAweEQ2MzQ4OTA2LAorMHgwMDA5NDYwQiwgMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwgMHg4OTAyQzgwOCwKKzB4NDYwQkQ2MzAsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsIDB4NDIwQkQyMkUsCisweEQ1MkUwMDA5LCAweDg4MDI2MDUyLCAweEQyMkQ4QjAzLCAweEEwMDVFNjA0LAorMHg4ODAxMjI2MCwgMHhEMjJBOEIwMiwgMHgyMjYwRTYwMSwgMHgyNTIyRTIwMCwKKzB4Qzg4MDYwRTMsIDB4RDIyNzg5MkQsIDB4NjBFMzZFMjAsIDB4ODkwMkM4ODAsCisweDQyMEJEMjI1LCAweDYwRTMwMDA5LCAweDg5MDJDODQwLCAweDQyMEJEMjIzLAorMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMSwgMHg2MEUzMDAwOSwKKzB4ODkwREM4MDQsIDB4REQyMEQxMUYsIDB4MDAwOTQxMEIsIDB4MDAwOUJGMTEsCisweDAwMDlCRjRDLCAweEQ1MUVENDFELCAweDI0NzBFNzA4LCAweDI1RDJCRjg1LAorMHhDODA4NjBFMywgMHhEMjFCODkwNSwgMHg0RjI2N0YwNCwgMHg0MjJCNkVGNiwKKzB4N0YwNDZERjYsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MDAxQzU4MUMsCisweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLCAweDAwMDQwMDIxLAorMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwgMHgwMDIwMUE0NiwgMHgwMDIwMUE2OCwKKzB4MDAyMDIwQzgsIDB4MDAyMDFBODAsIDB4MDAyMDFBOEUsIDB4MDAyMDNBNTAsCisweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxQUZBLCAweDAwMjAxQjA2LAorMHgwMDIwMUE5NiwgMHgwMDIwMUFCNCwgMHgxMjM0NTY3OCwgMHgwMDFFMTAwMCwKKzB4MDAxMEYxMDAsIDB4MDAyMDFBRTIsIDB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsCisweEQ2QTYyNDUwLCAweDM0NkM2NDRDLCAweDI0NTAwMDBCLCAweDY0NENENkE0LAorMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwgMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwKKzB4NDIwMDYwMTksIDB4NjcwRTYxNEMsIDB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsCisweDMyNENDOTBGLCAweDIyMDAwMDBCLCAweDQyMDg2MjVDLCAweDQyMDA0MjA4LAorMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwgMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwKKzB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsCisweDI3Mjk0NjE5LCAweDZFNTM2MjY5LCAweDY3MkU2NTczLCAweDQyMjEyMjdELAorMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwKKzB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsIDB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsCisweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLCAweEQyODQ4QjdCLAorMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywKKzB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRkE0LCAweEJGQTFFNDAxLCAweEU2MDJFNTA2LCAweDYwNjM0NjE4LAorMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwgMHhFNDAxODVGMiwgMHhCRkFCNjU0MywKKzB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsCisweDYwNTM3NTZDLCAweDgwRjhCRjgwLCAweEJGODJFNDAyLCAweDg0RjhFNTEyLAorMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwgMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywKKzB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsCisweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLCAweEUwMTA2NTVDLAorMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwKKzB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsIDB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsCisweEJGNzFFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLCAweEU1RkZFNjQwLAorMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwgMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwKKzB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsIDB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsCisweEU1MDFFNDA0LCAweEJGNTdFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwKKzB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsIDB4MjY2ODY2MjEsCisweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LCAweEU0MDFCRjFDLAorMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwKKzB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsCisweEJGMjk2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLCAweDY1RjBFNjQwLAorMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywgMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwKKzB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsIDB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsCisweEU2NDBFNTAwLCAweEJGMEZFNDAyLCAweEU2NDBFNTAwLCAweEJGMTZFNDAyLAorMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUU1RTQwMywgMHhFNTEzODBGOCwKKzB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsIDB4QkVFNzcwODUsIDB4RTUwMDY1MDMsCisweEJFRThFNjQwLCAweEU1MDBFNDAzLCAweEJFRjVFNjQwLCAweEU1MDBFNDAzLAorMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwKKzB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsIDB4RTQwRjg0RkMsIDB4QkVDRDcwODMsCisweEU1MDE2NTAzLCAweEJFQ0VFNjQwLCAweEU1MDFFNDA0LCAweEJFREJFNjQwLAorMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwKKzB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMkYsIDB4MDAxRTEwODAsCisweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLCAweDAwMjAzQTRBLAorMHgwMDIwM0E0QywgMHgwMDIwM0E0RSwgMHhEMjFERDExQywgMHg2NjIwNjAxMCwKKzB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsCisweDc3MDE2MjJDLCAweDY0MjMyMTcwLCAweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LAorMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwKKzB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsCisweEQ2MERENDBCLCAweDY1NUM2NTQwLCAweDQ3MDg2NzUzLCAweDM3NTg0NzA4LAorMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwKKzB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsIDB4MDAyMDM5OTUsCisweDAwMjAzOTk0LCAweDAwMjAzOTk2LCAweDAwMjAzNUJDLCAweDdGRkM0RjIyLAorMHhFNjgwRDFBOCwgMHg2NjZDNjIxMiwgMHhEMkE3MkYyMiwgMHg2N0YzNjU2MywKKzB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsIDB4RTY4MDAwMDksCisweEQyQTE2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQwLCAweEU2ODA2NDczLAorMHhEMjlENjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MywgMHgyRjg2NjQ3MywKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZDMDRGMjIsCisweERCOTdEMjk2LCAweDcyMDEyRjIyLCAweEQxOTYxRjIxLCAweDY2MTI1MjExLAorMHg4QjAxMzYyMCwgMHgwMDA5QTBGOSwgMHhDOTAzNjA2MSwgMHg4QjAxODgwMSwKKzB4MDAwOUEwRjMsIDB4RDI5MERDOEYsIDB4NjRDMzQyMEIsIDB4NjUwM0QxOEYsCisweDYwMTExRjAyLCAweDhCMDQ4ODAxLCAweDQyMEJEMjhELCAweEFGRTQ2NEMzLAorMHg1NDUzMDAwOSwgMHg4NDRDRUU4NCwgMHg4OTAxMzBFMCwgMHgwMDA5QTBDMywKKzB4NjYxMEQxODgsIDB4NjAyMzYyNkMsIDB4OEI3MTg4MDEsIDB4NjIxMEQxODYsCisweDg5NjYyMjI4LCAweERBODZEMjg1LCAweEUwMDM2MTIyLCAweDY0MjIxMTEyLAorMHg0MDE4RDg4MSwgMHhERDgzRTUwMCwgMHg4MTQxNjdBMywgMHg3NzA0Mjg1MCwKKzB4NjQ3MjY2QTIsIDB4NkVEM0Q1ODAsIDB4MUY0NTdFMDQsIDB4NjU1MjFGNTYsCisweDY0RTM2OEQyLCAweDFGODg3NEY4LCAweDY4NDM2OUUyLCAweDFGNjM3ODk0LAorMHgxRjk5MUY3NCwgMHg2MjgyNjE0MiwgMHhENzc5RDk3OCwgMHgxRjJCRDY3OSwKKzB4Njc3MjYyOTIsIDB4MUYxQTYwNjIsIDB4MjYwMkNCMjAsIDB4RDE3NkU2MDAsCisweEU1NDAxRjU3LCAweDFGN0QxRjJDLCAweDc2MDExRjFFLCAweDMyNTM2MjZELAorMHg1MUYzOEJGQiwgMHg1MkY1NTVGNCwgMHgyNTIyMkExMiwgMHg1NUY3NTdGNiwKKzB4Mjc1MjVBRjgsIDB4NURGOTJEQTIsIDB4MkVEMjUxRkIsIDB4RDU2QjVFRkEsCisweDU0RkMyNEUyLCAweDI4MTI1N0ZELCAweEQxNjBEODY5LCAweDI1NzIyOTQyLAorMHg2OTEyNjc4MiwgMHgxOTc0RDg2NiwgMHhERDY2NkExMiwgMHg1NkZFNjBBMSwKKzB4MkEwMUNCMDEsIDB4REE2NDY0MTIsIDB4RTkwMTI4NDIsIDB4NEEwQjJENDIsCisweDUyRkUyNjkyLCAweEQ2NjFFRTAxLCAweDIyRTI0RTE4LCAweDcyMDE2MjYyLAorMHg2MEIyMjYyMiwgMHhDQjAxRDE0RiwgMHgyQjAyRTIwMiwgMHgyMTIwQTAzRiwKKzB4OEIzQzIyMjgsIDB4RTYwMUQ1NUEsIDB4MjE2MEU3MDAsIDB4RTAxQzI1NzIsCisweEM4MDEwMDRDLCAweEQ4NTc4QjBDLCAweDFGOEZEMjU3LCAweEU2MDAyODIyLAorMHg3NjAxRTU3RCwgMHgzMjUzNjI2QywgMHg1NkZGOEJGQiwgMHgyNjIyRDI1MywKKzB4RTJGRTY5QjIsIDB4MkI5MjI5MjksIDB4MEE0Q0UwMUUsIDB4RTAxRjY1RjIsCisweDAxNEMyNUEwLCAweDc0MTA1N0YxLCAweEVBMDYyNzEwLCAweERENENFNjAwLAorMHg4NDQ2REU0QywgMHgyRDAwNzYwMSwgMHg2OTZDNjg0NCwgMHgyRTgwMzlBMywKKzB4OEZGNjdFMDEsIDB4REU0ODdEMDEsIDB4MkVBMEVBOTQsIDB4RTEwMDdFMDEsCisweDdFMEYyRTEwLCAweEQxMkZFMjA1LCAweDY0MTAyRTIwLCAweDYwMjM2MjRDLAorMHg4OTA4ODgwMSwgMHg1NUYyRDIyQSwgMHg2NEMzNDIwQiwgMHhFRTAxRDEzMiwKKzB4QUYxQTRFMTgsIDB4NTVGMjIxRTIsIDB4ODU1M0QxM0MsIDB4NjIwRDY2MTIsCisweDg5MDYzMjYyLCAweEQ2M0JENDNBLCAweEU4MDE0NjBCLCAweEFGMENENzNBLAorMHhEOTFGMjc4MiwgMHg2NEMzNDkwQiwgMHhFRTAxRDEyNywgMHhEQTM4RDQzNywKKzB4NEEwQjRFMTgsIDB4QUYwMDIxRTIsIDB4N0Y0MDAwMDksIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHg4NTQ2N0ZGNCwgMHgyRjAxRTY4MSwgMHg2NjZDODU0NywgMHg4NTQ4ODFGMSwKKzB4ODFGMkQyMDksIDB4NjdGMzg1NDIsIDB4ODU0MzgxRjMsIDB4ODFGNEU0MEMsCisweDY1NjM2MDUzLCAweDQyMEI4MUY1LCAweDdGMEM3NTQwLCAweDAwMEI0RjI2LAorMHgwMDAwMDAwOSwgMHgwMDFDM0Q5QywgMHgwMDIwMjNGQywgMHgwMDExNzc5QSwKKzB4MDAxQzM2RjgsIDB4MDAyMDM1QjQsIDB4MDAyMDE0QTYsIDB4MDAyMDNBMTYsCisweDAwMjAxNEQwLCAweDAwMjAzOUE1LCAweDAwMjAzOUE0LCAweDAwMjAzOUEwLAorMHgwMDFDM0I5QywgMHgwMDFDMzcwNCwgMHgwMDFDM0Q5OCwgMHgwMDFDM0JCNCwKKzB4MDAxQzU5NjAsIDB4MDAxQzM1MDAsIDB4MDAxQzNEMzAsIDB4MDAxQzg5NjAsCisweDAwMjAzNThDLCAweDAwMUMzRDAwLCAweDAwMjAxNjEwLCAweDAwMTE3NzMwLAorMHgwMDIwMzlBOCwgMHgwMDFDNTgyQywgMHgyMDAwQTAwMCwgMHgwMDAwQTAwMCwKKzB4MDAxMTc3OEMsIDB4MDAxMTc3OTIsIDB4MDAxMTc3ODgsIDB4MDAyMDM5N0MsCisweDAwMjAzNTdDLCAweDAwMjAxNTM0LCAweDAwMUUyMTMwLCAweDAwMjAzREEwLAorMHgwMDIwMThDMCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4RDE5QjdGRUMsIDB4MkYxMkUwMDAsIDB4NjEwM0Q0OUEsCisweDFGNDI4MUYyLCAweEREOUFEQTk5LCAweEQ2OUE2ODEzLCAweEUwMDE0ODA4LAorMHg0NjBCREU5OSwgMHgzOEVDNDgwMCwgMHg2NUEyMUYwMywgMHgzNTIwNTJBMSwKKzB4QTIzRThCMDEsIDB4NjA1MTAwMDksIDB4ODgwMUM5MDMsIDB4QTIzODhCMDEsCisweDUyNTMwMDA5LCAweDMyRTBERTkxLCAweEQ5OTE4QjEwLCAweDY0QTM0OTBCLAorMHg0QjBCREI5MCwgMHhERTkwNjQwMywgMHhENzkxRDY5MCwgMHhFQzAxRDU5MSwKKzB4MkUwMkUxMDAsIDB4MjcxMDI2QzAsIDB4MjUwMkFGREYsIDB4QzgwMTg1NTEsCisweEExNTc4QjAxLCAweDYyNTEwMDA5LCAweDQyMDA2MjJELCAweDVFNTMzNjZBLAorMHg4NUUyMjI2RCwgMHhDOTAzNjQyQywgMHg4NUUzNjYwMywgMHg2MDUzNjUwRCwKKzB4NDAyMTQwMjEsIDB4NDUwMEM5M0YsIDB4MzIyQTY3MDMsIDB4NjA1MzI1MkQsCisweEM5MDFEMTdGLCAweDYwMTA2QzAzLCAweDg4MDFEOTdGLCAweERCN0Y4QjA1LAorMHgyMTIwRTIwMCwgMHhDQjAxNjBCMiwgMHhEMTdEMkIwMiwgMHg4ODAxNjAxMSwKKzB4NjVBMjhCMEEsIDB4OEQwNDI0NDgsIDB4OUI5RTYyNTEsIDB4QTAwMzIyQjksCisweDkxOUIyNTIxLCAweDI1MjEyMjFCLCAweDM3QjNFQjEwLCAweDI0NDg4OTVFLAorMHhENDczOEIwNywgMHgyMjI4NjI0MSwgMHg2MDYzODkwMywgMHhBMDU3ODFGOCwKKzB4RDU3MDY0NzMsIDB4NDYwODQ2MDgsIDB4ODVFMjYyNzMsIDB4NDYwMDZCNTAsCisweDM2MkM0MjAwLCAweDJCQjhDOTEwLCAweDhGMUY2NDYzLCAweDI2Njg2NjAzLAorMHhEMjY5ODkxMSwgMHgwNjJENjA0MywgMHg0MTE5NjE2RCwgMHg2QjBFNjAxOSwKKzB4ODFGODIwQkQsIDB4ODgwMTYwQzMsIDB4NjQ2QzhGMkMsIDB4ODgwRjYwNzMsCisweEEwMjc4QjFCLCAweEQyNjEwMDA5LCAweDA1MkQ2MDQzLCAweDQxMTk2MTVELAorMHg2NzBFNjAxOSwgMHg2NDVDMjA3RCwgMHg4MUY4QTAxQywgMHg4OTBGMjY2OCwKKzB4NjA0M0QyNUIsIDB4NkI1RDA1MkQsIDB4NjBCOTRCMTksIDB4MjAxRDYxMEUsCisweDYwQzM4MUY4LCAweDhGMEQ4ODAxLCAweDY0NzM2NDVDLCAweEVDMDBBMDBBLAorMHg2MDQzRDI1NCwgMHg2MjVEMDUyRCwgMHg2MDI5NDIxOSwgMHgyMDdENjcwRSwKKzB4ODFGODY0NUMsIDB4ODgwMjg1RjgsIDB4ODVFMTg5MEEsIDB4OEQwN0M4MjAsCisweEU2REM2MjAzLCAweDYwMjMyMjY5LCAweDgxRTFBMDAyLCAweDY0NENFNEZGLAorMHg2MjEwRDE0OSwgMHg4OTAxMjIyOCwgMHg2NDRDRTRGRiwgMHg2NTRERUJGRiwKKzB4MzVCMDZCQkMsIDB4REIzNjhCMkIsIDB4NjRBMzRCMEIsIDB4NDEwQkQxMzUsCisweDU0MDM2NDAzLCAweDg1NDQ2RTAzLCAweEM5NDhEQjQwLCAweERDNDA4ODA4LAorMHhCRUFDOEIwMSwgMHg2NEIzRTUwMiwgMHg2NUUzNEMwQiwgMHhEQjNERUMwMSwKKzB4RDEzRDJEQzIsIDB4NjIxMjYwQjIsIDB4NzIwMTcwMDEsIDB4MjEyMjg4MDUsCisweDJCMDI4RjA4LCAweDY2NkNFNjgwLCAweDY1NjNEMjM4LCAweDc1NDlFNzAwLAorMHg2NDczNDIwQiwgMHhBMDMwRDQzNiwgMHg3RkZGMDAwOSwgMHg4NUUyODAwMCwKKzB4MjBCOUVCRkMsIDB4NjEwMzgxRTIsIDB4OTQyQTg1RTMsIDB4NjIwMzIwNDksCisweDQ1MDg4NUY4LCAweDgxRTIyMDFCLCAweEM5MDE2MEMzLCAweDQwMDg0MDE4LAorMHg0MDA4NDAwOCwgMHg0MDAwMjI1QiwgMHg2MDIzMjIwQiwgMHg4NUU0ODFFMywKKzB4NDExOEUxMDgsIDB4ODFFNDIwMUIsIDB4RTQwMjYyQTIsIDB4MjBCOTg1MjEsCisweDY3QTI4MTIxLCAweENCMDE2MDcxLCAweDg1RjgyNzAxLCAweDg5MDMzMDQyLAorMHhFQ0U3ODVFMiwgMHg4MUUyMjBDOSwgMHg0OTBCRDQxRSwgMHhBMDNCMDAwOSwKKzB4N0UwMzAwMDksIDB4MDAxQzNEMzAsIDB4MDAyMDNEQUMsIDB4MDAyMDM1OEMsCisweDAwMUUyMTJDLCAweDAwMjAzNDcwLCAweDAwMUMzRDAwLCAweDAwMTE3NzgwLAorMHgwMDIwMTRBNiwgMHgwMDIwMTY3MCwgMHgwMDExNzcwQywgMHgwMDIwMzlBNCwKKzB4MDAyMDM5QTUsIDB4MDAyMDM5QTAsIDB4MDAyMDE4QzAsIDB4MDAxQzM2RjgsCisweDAwMjAzQTFBLCAweDAwMjAzREJDLCAweDAwMjAzQkEwLCAweDAwMjAzQzIwLAorMHgwMDIwM0NBMCwgMHgwMDIwM0QyMCwgMHgwMDIwMzk5MCwgMHgwMDIwMzU4NCwKKzB4MDAyMDE0RDAsIDB4MDAyMDNBMUMsIDB4MDAyMDNBMjAsIDB4MDAyMDIzRkMsCisweDAwMjAzREE0LCAweDAwMjAzREE4LCAweDYwMjI2MkYyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4QjBCODgwQSwgMHg2MEUyREU4QywgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEIwMzg4MDgsIDB4Q0IwMTYwQTIsIDB4MjgwMkEwMDYsCisweDY1RTJERTg3LCAweDJFNTI3NTAxLCAweDI4NjI2NkEyLCAweDUyRjM2NkYyLAorMHgyNjIyQUU4MywgMHhEMjgzODU1MSwgMHhERTgzQzgwMiwgMHhBMDk1OEIwMSwKKzB4NDIwQjAwMDksIDB4NEUwQjY0QTMsIDB4NUUwMzY0MDMsIDB4ODVFNDY1MDMsCisweDQ5MThFOTA4LCAweEQ3N0QyMDlCLCAweEUwNEM4MUU0LCAweERDN0MwQjdFLAorMHg3QjAxRDk3QywgMHg2MUMyMDdCNiwgMHg3MTAxNjY5MCwgMHg4RDA2MjY2OCwKKzB4RDQ3OTJDMTIsIDB4NDIwQkQyNzksIDB4QTA3MEVCMDEsIDB4NjI1MTJEQjIsCisweDRCMThFQjBGLCAweDIyQjlFMTAyLCAweDMyMTA0MTE4LCAweDg1NTE4QjBGLAorMHgyMDI5RTJGQywgMHg2MDUxODE1MSwgMHhDQjAxNzJFMCwgMHg4NUUxMjUwMSwKKzB4MjAyOTk0QTMsIDB4ODVFNDgxRTEsIDB4QTA1MjIwNDksIDB4Njc1MTgxRTQsCisweDQ3MTk2NzdELCAweDY2N0U2Nzc5LCAweDc3MDEyNzZELCAweDY5MDM2MDdDLAorMHg4ODAxNDkxOCwgMHgyNTkxOEYzRSwgMHg2QjEyRDE2MSwgMHgyMUIyN0IwMSwKKzB4NjYwRDg1RTMsIDB4NDAyMTYwNjMsIDB4QzkzRjQwMjEsIDB4NkMwMzQ2MDAsCisweDI2MkQzMjJBLCAweEM4MDE2MDYzLCAweERCNUVEMTVELCAweDk2N0Q4OTAxLAorMHhFNjAwMkM2QiwgMHg2NjZDNjdDRCwgMHg0MDAwNjA2MywgMHg2MjJEMDIxRCwKKzB4OEQwRTMyNzAsIDB4NjA0MzY0MDMsIDB4RTlGRjAyMUQsIDB4OEIwMTMyOTAsCisweDAxQzVBMDA3LCAweDYyNkM3NjAxLCAweDMyOTJFOTA0LCAweDY0NkM4QkVCLAorMHg2MDQzNDQwMCwgMHhEMTUwMDRCRCwgMHgwQjQ1NzQwMSwgMHg2NjlENjkxMSwKKzB4ODkwNzM2NzAsIDB4NjAyRDYyMTEsIDB4ODkwMzg4RkYsIDB4RTIwMURCNEIsCisweDJCMjAyMUMxLCAweEVDRkM4NTUxLCAweDgxNTEyMEM5LCAweENCMDE2MDUxLAorMHhEQzQ3MjUwMSwgMHg2NEEzNEMwQiwgMHg1MUYzNjZGMiwgMHg4NUVGMjYxMiwKKzB4NTRGMkQyNDQsIDB4NjUwRDQyMEIsIDB4MDAwOUFERTcsIDB4RTUwMERDNDIsCisweDQyMEIyQzUyLCAweDRFMEI2NEEzLCAweDU0MDM2NDAzLCAweDg1NDQ2RTAzLAorMHg2NzAzRTkwOCwgMHg2NTAzNDkxOCwgMHgyNzk5ODU0MSwgMHhEQjMyMzc5MCwKKzB4OEYwQkQ5MzIsIDB4NjAxMzYxMEQsIDB4OEIwN0M4MjAsIDB4Qzk0ODYwNTMsCisweDhCMDM4ODA4LCAweEU1MDFCRDRCLCAweDAwMDlBMDA1LCAweDIxMjhEMjMzLAorMHhCRDQ0ODkwMSwgMHg2NEIzRTUwMCwgMHg0OTBCNjVFMywgMHhBREJDRUMwMSwKKzB4ODVGMjJEQzIsIDB4NzAwMUVFMDQsIDB4MzFFNzYxMEQsIDB4OEQwMjgxRjIsCisweEFEQTk3QTA4LCAweDdGMTQwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHhGN0ZGNjhGNiwgMHgyRkU2ODAwMCwKKzB4RDIyMzRGMjIsIDB4NjBFMzZFMjIsIDB4OEQwMkM4NDAsIDB4QkJFNTIyRTIsCisweEUyNDAwMDA5LCAweDJFMjg0MjE4LCAweEJCRjA4OTAxLCAweDYwRTMwMDA5LAorMHg4OTA1QzgxMCwgMHhEMjFDRDQxQiwgMHgwMDA5NDIwQiwgMHgwMDA5QkJFRiwKKzB4QzgwNTYwRTMsIDB4QkQ2RDg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsCisweEFCRUM0RjI2LCAweDRGMjY2RUY2LCAweDZFRjYwMDBCLCAweDAwMUMzRDNDLAorMHgwMDExNzc2MCwgMHgwMDIwMTRBNiwgMHgwMDIwMTY3MCwgMHgwMDIwMzUxQywKKzB4MDAyMDNEQzAsIDB4MDAyMDM5OTAsIDB4MDAyMDM1ODQsIDB4MDAyMDE0RDAsCisweDAwMjAzOUZDLCAweDAwMjAzQTA0LCAweDAwMjAzOUY4LCAweDAwMjAzOUZBLAorMHgwMDIwMTUzNCwgMHgwMDIwMThEMCwgMHgwMDIwM0ExQywgMHgwMDAwODAwMCwKKzB4MDAxQzM1MTAsIDB4MDAyMDNEQjQsIDB4MDAyMDE4QzAsIDB4ODkwMTRGMjIsCisweDYxMUI2MDBCLCAweDYxMUJCMDBBLCAweDAwMEI0RjI2LCAweDYwMEI2MDBCLAorMHg2MTFCQTAwNCwgMHg4REYxMjEwNywgMHg4QkY4NDAxMSwgMHg2MjBEMkYyNiwKKzB4OEYzRTMwMjAsIDB4NDAxODAwMTksIDB4OEIwQjMwMTYsIDB4MzEwNDMxMDQsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDQxMjQ2MkY2LAorMHg2MDFDMDAwQiwgMHg0MTI5NjIxOSwgMHgyMDA4NDAxOCwgMHgzMTA0ODkyNiwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDYxMTkzMTA0LAorMHgzMjA0MjIxRCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwKKzB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsCisweDIxMkQzMjA0LCAweDYwMTk2MkY2LCAweDQwMjQwMDBCLCAweDAwMEJFMDAwLAorMHg2MjEzNjJGNiwgMHg0MTI5NDIyOCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4NjAyRDQyMjQsIDB4NjJGNjAwMEIsCisweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLCAweDEyMTQxNjE4LAorMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwKKzB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsCisweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LCAweDAwMjAzNDlBLAorMHgwMDIwMzQ1MCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4MDAwQjQwMjgsCisweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywKKzB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDI3MDczNzIsCisweDNEMjA2Njc1LCAweDU1NEUyMDNELCAweDIwMkM0QzRDLCAweDZFNDk2NzdBLAorMHg0RTQ5NzI3NCwgMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwgMHg2MTc2NkU0OSwKKzB4MjA2NDY5NkMsIDB4NzI2NTczNzUsIDB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsCisweDAwMjE0NDQ5LCAweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLAorMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwgMHgyMDNBMzA1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMyNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMzUxLCAweDAwMDAwMDIwLCAweDIwM0EzNDUxLCAweDAwMDAwMDIwLAorMHgyQjQzNDc0MSwgMHg3MzY5NkY0RSwgMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywKKzB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsIDB4NkYyMDZDNjksIDB4Njk3NDIwNkUsCisweDBEMEE2NTZELCAweDAwMDAwMDAwLCAweDAwMDAwMDcyLCAweDAwMjA1MjIwLAorMHg2MjczNTU3NiwgMHg3NDczNzI1RiwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM3NTczNUYsIDB4NjQ2RTY1NzAsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsCisweDczNjU3MjVGLCAweDAwMEEwRDZELCAweDAwMDAwMDQ0LCAweDQ0Mzg3NTcwLAorMHg3MjYzNzM2NSwgMHg2Rjc0NzA2OSwgMHgzRDU4NDU3MiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwNDcsIDB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsCisweDQ5Njc3QTIwLCAweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELAorMHg2NTRDNzI0NSwgMHgwMDAwMDA2RSwgMHgyMDc0NkY0RSwgMHg3NTZGNkU2NSwKKzB4NDkyMDY4NjcsIDB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsIDB4MDAwMDAwMDAsCisweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLAorMHgwMjAwMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsCisweDAwMDMwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwKKzB4MDIwMDAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMTBGMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsIDB4MDAwMDAwNTksIDB4NzMyMDQxNDIsCisweDAwM0Q3MTY1LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwKKzB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsIDB4ODIwNTA3MDAsCisweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDMwNDA1LAorMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwgMHgwNDAwMDAwNCwKKzB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsIDB4NDAwMjgyMDUsCisweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLCAweDAwMDA0MDAyLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4NjYyMUQyQTgsIDB4MjAwODYwNkQsIDB4QTFCMThCMDEsIDB4ODgxMDAwMDksCisweDg4MTE4OTIyLCAweDg4MTI4OTIwLCAweDg4MTM4OTFFLCAweDg4MjE4OTFDLAorMHg4ODIyODkxQSwgMHg4ODNBODkxOCwgMHg4ODNCODkxNiwgMHhFNjQ0ODkxNCwKKzB4MzA2MDQ2MDgsIDB4RTY0ODg5MTAsIDB4MzA2MDQ2MDgsIDB4RTY1ODg5MEMsCisweDMwNjA0NjA4LCAweDk2M0Q4OTA4LCAweDg5MDUzMDYwLCAweDMwNjA5NjNCLAorMHg5NjM5ODkwMiwgMHg4QjAxMzA2MCwgMHhFMDEwMDAwQiwgMHg4QjAxODgyMCwKKzB4RTAyMDAwMEIsIDB4ODkyQjg4MzcsIDB4ODkyOTg4MzIsIDB4ODkyNzg4MzUsCisweDg5MjU4ODM2LCAweDg5MjM4ODMwLCAweDg5MjE4ODM4LCAweDg5MUY4ODM5LAorMHg4OTFEODgzNCwgMHg4OTFCODgzMywgMHg0NjA4RTY0QywgMHg4OTE3MzA2MCwKKzB4MzA2MDk2MUIsIDB4OTYxOTg5MTQsIDB4ODkxMTMwNjAsIDB4MzA2MDk2MTcsCisweDk2MTU4OTBFLCAweDg5MEIzMDYwLCAweDMwNjA5NjEzLCAweDk2MTE4OTA4LAorMHg4OTA1MzA2MCwgMHgzMDYwOTYwRiwgMHg5NjBEODkwMiwgMHg4QjBDMzA2MCwKKzB4RTAzMDAwMEIsIDB4MDUxMDAxNjUsIDB4MDIzMDBBMTAsIDB4MDQzMDAzMzAsCisweDA2MzAwNTMwLCAweDBCMzAwQTMwLCAweDg4NDAwQzMwLCAweEExNDI4QjAxLAorMHg4ODQxMDAwOSwgMHhBMTNFOEIwMSwgMHg4ODQzMDAwOSwgMHhBMTNBOEIwMSwKKzB4ODg0ODAwMDksIDB4QTEzNjhCMDEsIDB4ODg0QTAwMDksIDB4QTEzMjhCMDEsCisweDg4NEIwMDA5LCAweEExMkU4QjAxLCAweDg4NEMwMDA5LCAweEExMkE4QjAxLAorMHhFNjgwMDAwOSwgMHgzMDYwNjY2QywgMHhBMTI0OEIwMSwgMHhFNjgxMDAwOSwKKzB4MzA2MDY2NkMsIDB4QTExRThCMDEsIDB4RTY4MjAwMDksIDB4MzA2MDY2NkMsCisweEExMTg4QjAxLCAweEU2ODMwMDA5LCAweDMwNjA2NjZDLCAweEExMTI4QjAxLAorMHhFNjg0MDAwOSwgMHgzMDYwNjY2QywgMHhBMTBDOEIwMSwgMHhFNjg1MDAwOSwKKzB4MzA2MDY2NkMsIDB4QTEwNjhCMDEsIDB4RTY4NjAwMDksIDB4MzA2MDY2NkMsCisweEExMDA4QjAxLCAweEU2ODcwMDA5LCAweDMwNjA2NjZDLCAweEEwRkE4QjAxLAorMHhFNjg4MDAwOSwgMHgzMDYwNjY2QywgMHhBMEY0OEIwMSwgMHhFNjg5MDAwOSwKKzB4MzA2MDY2NkMsIDB4QTBFRThCMDEsIDB4RTY4QTAwMDksIDB4MzA2MDY2NkMsCisweEEwRTg4QjAxLCAweEU2OEIwMDA5LCAweDMwNjA2NjZDLCAweEEwRTI4QjAxLAorMHhFNjhDMDAwOSwgMHgzMDYwNjY2QywgMHhBMERDOEIwMSwgMHhFNjhEMDAwOSwKKzB4MzA2MDY2NkMsIDB4QTBENjhCMDEsIDB4RTY4RTAwMDksIDB4MzA2MDY2NkMsCisweEEwRDA4QjAxLCAweEU2OEYwMDA5LCAweDMwNjA2NjZDLCAweEEwQ0E4QjAxLAorMHhFNjkwMDAwOSwgMHgzMDYwNjY2QywgMHhBMEM0OEIwMSwgMHhFNjkxMDAwOSwKKzB4MzA2MDY2NkMsIDB4QTBCRThCMDEsIDB4RTZGODAwMDksIDB4MzA2MDY2NkMsCisweEEwQjg4QjAxLCAweEU2RjkwMDA5LCAweDMwNjA2NjZDLCAweEEwQjI4QjAxLAorMHhFNkZBMDAwOSwgMHgzMDYwNjY2QywgMHhBMEFDOEIwMSwgMHhFNkZCMDAwOSwKKzB4MzA2MDY2NkMsIDB4QTBBNjhCMDEsIDB4RTZGQzAwMDksIDB4MzA2MDY2NkMsCisweEEwQTA4QjAxLCAweEU2RkQwMDA5LCAweDMwNjA2NjZDLCAweEEwOUE4QjAxLAorMHhFNkZFMDAwOSwgMHgzMDYwNjY2QywgMHhBMDk0OEIwMSwgMHhFNkZGMDAwOSwKKzB4MzA2MDY2NkMsIDB4QTA4RThCMDEsIDB4RTZEMDAwMDksIDB4MzA2MDY2NkMsCisweEEwODg4QjAxLCAweEU2RDEwMDA5LCAweDMwNjA2NjZDLCAweEEwODI4QjAxLAorMHhFNkQyMDAwOSwgMHgzMDYwNjY2QywgMHhBMDdDOEIwMSwgMHhFNkQzMDAwOSwKKzB4MzA2MDY2NkMsIDB4RTZENDg5NzcsIDB4MzA2MDY2NkMsIDB4RTZENTg5NzMsCisweDMwNjA2NjZDLCAweEU2RDY4OTZGLCAweDMwNjA2NjZDLCAweEU2RDc4OTZCLAorMHgzMDYwNjY2QywgMHhFNkQ4ODk2NywgMHgzMDYwNjY2QywgMHhBMDAzODk2MywKKzB4MDAwMDAwMDksIDB4MDAxMTQwMDAsIDB4NjY2Q0U2RDksIDB4ODk1QTMwNjAsCisweDY2NkNFNkRBLCAweDg5NTYzMDYwLCAweDY2NkNFNkRCLCAweDg5NTIzMDYwLAorMHg2NjZDRTZEQywgMHg4OTRFMzA2MCwgMHg2NjZDRTZERCwgMHg4OTRBMzA2MCwKKzB4NjY2Q0U2RjAsIDB4ODk0NjMwNjAsIDB4NjY2Q0U2RjEsIDB4ODk0MjMwNjAsCisweDY2NkNFNkYyLCAweDg5M0UzMDYwLCAweDY2NkNFNkYzLCAweDg5M0EzMDYwLAorMHg2NjZDRTZGNCwgMHg4OTM2MzA2MCwgMHg2NjZDRTZGNSwgMHg4OTMyMzA2MCwKKzB4NjY2Q0U2RjYsIDB4ODkyRTMwNjAsIDB4NjY2Q0U2RjcsIDB4ODkyQTMwNjAsCisweDQ2MDhFNjUwLCAweDg5MjYzMDYwLCAweDMwNjA5NjlBLCAweDk2OTg4OTIzLAorMHg4OTIwMzA2MCwgMHgzMDYwOTY5NiwgMHg5Njk0ODkxRCwgMHg4OTFBMzA2MCwKKzB4MzA2MDk2OTIsIDB4OTY5MDg5MTcsIDB4ODkxNDMwNjAsIDB4MzA2MDk2OEUsCisweDk2OEM4OTExLCAweDg5MEUzMDYwLCAweDMwNjA5NjhBLCAweDk2ODg4OTBCLAorMHg4OTA4MzA2MCwgMHgzMDYwOTY4NiwgMHg5Njg0ODkwNSwgMHg4OTAyMzA2MCwKKzB4MzA2MDk2ODIsIDB4MDAwQjhCMDEsIDB4RTBGRkUwNDAsIDB4NjAwQzAwMEIsCisweEUwMDAwMDBCLCAweDYyNDNEMTU3LCAweEU0MDI4NTEyLCAweDY2MkQ2NzBELAorMHhFNTAwQTAwRSwgMHg2MDUzNjU1RCwgMHgzMDVDNDAwMCwgMHg0MDA4RDE1MiwKKzB4NjIyRDAyMUQsIDB4OEIwMjMyNjAsIDB4QTAwNDcxMDgsIDB4NzUwMTA0MUMsCisweDMyNzM2MjVELCAweDYwNDM4QkVFLCAweEM5MEEwMDBCLCAweDY3NEM3NkZFLAorMHgwMjVDNjA2QywgMHgzNzIzNjIyQywgMHgyMDA4ODkwNiwgMHg3MEZGODkwMiwKKzB4NjYwM0FGRjYsIDB4RTAwMDAwMEIsIDB4MDAwOTAwMEIsIDB4NEYxMjRGMjIsCisweDMyNjA1MkYyLCAweDM0NTA4OTEwLCAweDM0NzA4OTBFLCAweDM3NTA4OTBELAorMHgzMjY4ODkwQSwgMHgwNDI3MzQ1OCwgMHg2MDczMzc1OCwgMHg0NDBCRDQzQiwKKzB4MzA2QzAxMUEsIDB4NjIwM0EwMDEsIDB4NEYxNjYyNjMsIDB4MDAwQjRGMjYsCisweDJGRTY2MDIzLCAweDRGMTI0RjIyLCAweDZFNDM0RjAyLCAweDYxNEM1NEY0LAorMHgyRjE2NDExOCwgMHg2NjZDNjc3QywgMHg2NEVDNjU1QywgMHg0NjE4NDcxOCwKKzB4QkZEMzQ1MTgsIDB4NjUwMzQ0MTgsIDB4NjA1MzdGMDQsIDB4Qzk4MEU3MDIsCisweDZFMDM0NzE4LCAweDM3RUQ0NzI4LCAweDYyNTk0NTE5LCAweDAxMEE2NTJFLAorMHgzMTJDMjI1RCwgMHg0RjA2NjAxQywgMHg0RjI2NEYxNiwgMHg2RUY2MDAwQiwKKzB4MDM0MDAyNDAsIDB4MDU0MDA0NDAsIDB4MDc0MDA2NDAsIDB4MDk0MDA4NDAsCisweDExNDAwQjQwLCAweDBBNDAxMjQwLCAweDRGMjIwQTUwLCAweDYxNEM4NDUxLAorMHgzMTI3NjIwQywgMHhBMDBDODkwMSwgMHg4NDUyRTQwMCwgMHgzMTI3NjIwQywKKzB4QTAwNjg5MDEsIDB4ODQ1M0U0MDEsIDB4MzEyNzYyMEMsIDB4RTQwMzhEMDEsCisweDYyNjNFNDAyLCAweDYwNDM3MjAxLCAweDY3N0MwNzJDLCAweDYyNTMyRjc2LAorMHgwNzJDNzIwMSwgMHgwNTVDMDY2QywgMHg2NjZDNjc3QywgMHhCRkE4NjU1QywKKzB4N0YwNDY0MTMsIDB4MDAwQjRGMjYsIDB4NjA1QzYwMEMsIDB4OEYwNjg4MDEsCisweDYwNkM2MjQzLCAweDhCMDE4ODAxLCAweDcyMEFBMDAxLCAweDAwMEI3MkY2LAorMHgwMDAwNjAyMywgMHgwMDExNDAwMCwgMHgwMDExNDAwOCwgMHgwMDIwMzM3NCwKKzB4RTA0MEQ2OTAsIDB4MDU2RTYxNEMsIDB4OTI3NEQ3OEYsIDB4MzUyQzM1N0MsCisweEU0MDBFNzE4LCAweDYyNkM2NjUwLCAweDg5MDQzMTIwLCAweDYyNEM3NDAxLAorMHg4RkY3MzI3MywgMHgwMDBCNzUwMSwgMHhFMkZGNjA0MywgMHg2MjJDNjQ0QywKKzB4ODkwRDM0MjAsIDB4ODgwMTYwNUMsIDB4OTY1RDhCMDMsIDB4QTAwNTM0NkMsCisweDYyNDM2MjQzLCAweDMyNEM0MjA4LCAweDMyNkM5NjU3LCAweDYwMjMwMDBCLAorMHg2MDQzMDAwQiwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4OTI0OTdGRjQsIDB4NkI1MzM1MjYsIDB4MDAyOTY5NDMsCisweEUxM0ZDQTAxLCAweDZFMDNFQUZGLCAweDZBQUMyRjEwLCAweDZENDNFQzAwLAorMHg2MkQwRTgwOCwgMHgzNEEwNjQyQywgMHhCRkNFODkzOSwgMHgzQjAwNjVFMywKKzB4NkNDQzhGMEEsIDB4NDIwMDYyQzMsIDB4MzYyQzY2OTMsIDB4MUZDMTg0NjEsCisweDQxMDk2MTBDLCAweDJGMTBBMDJELCAweDg5MUMyQ0M4LCAweDY1RTM2NEQwLAorMHg2NDRDQkZCQiwgMHg4OTE2M0IwMiwgMHg3MEZGNjBDMywgMHgwNDlDNDAwMCwKKzB4NjQ0QzY1RTMsIDB4MUYwMkJGQjEsIDB4OEQxQTMwQjIsIDB4NTZGMjFGQzEsCisweDM1NkM2NTkzLCAweEM5MDM4NDUxLCAweDg5MTIyMDA4LCAweDY2MEM4NDUxLAorMHhBMDBFNDYwOSwgMHg3QzAxMkY2MCwgMHgzMjgzNjJDQywgMHg4RkM4N0QwMiwKKzB4QTAwNjFGMjEsIDB4MDYyNTAwMDksIDB4MTJDMDA4RkMsIDB4NjJDQzA5QjQsCisweDUwRjExRjIxLCAweDhCMTI4ODA4LCAweDdDRkY2Q0NDLCAweDYwQzM0QzAwLAorMHg2NUUzMDQ5QywgMHg2NDRDQkY4OSwgMHg4QjA4M0IwNiwgMHg4NDkxMzlDQywKKzB4MjAwOEM5MDMsIDB4ODQ5MTg5MDMsIDB4NDIwOTYyMEMsIDB4NjBGMDJGMjAsCisweDRGMjY3RjBDLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LAorMHg2OEY2MDAwQiwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4OTI3MjdGRkMsIDB4MzQyNkUxMDAsIDB4NkI0MzY5NTMsCisweDJGMTI2NjZDLCAweENBMDEwMDI5LCAweDhEMDMyNjY4LCAweEUyRjA2RTAzLAorMHgyRjIyNjIyQywgMHg2QUFDRUFGRiwgMHg2QzkzRUQwMCwgMHg2NkMwRTgwOCwKKzB4MzRBMDY0NkMsIDB4QkY1MDg5MTMsIDB4M0IwMDY1RTMsIDB4NkREQzhCMEEsCisweDM5REM0RDAwLCAweEM5MDM4NDkxLCAweDhCMDgyMDA4LCAweENCMEY2MEYyLAorMHgyRjAyQTAwNSwgMHg2MkRDN0QwMSwgMHg4RkU4MzI4MywgMHg2MEYyN0MwMiwKKzB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsCisweDY4RjYwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg0RjAyNEYxMiwgMHgzRjNDOTMzMiwgMHg0MzA4RTM1QiwKKzB4NjA1MzMzRkMsIDB4ODAzNDEzNTEsIDB4RTc2MDYwNjMsIDB4ODAzODEzNjIsCisweDQ3MDhFMDEyLCAweEUwM0Y4MTM2LCAweEQxMTIzN0ZDLCAweDI3MDA4MTM4LAorMHg4MDc4ODA3NCwgMHhFOTE2NjA1MywgMHg2MDYzODAxMiwgMHgyMTQxNDkxOCwKKzB4NkI5MzgwMTMsIDB4RURGRjZBQjQsIDB4NkFBQzYxQjAsIDB4NkMxQzRBMTgsCisweDY4QzgyQ0FCLCAweDZEREQ2ODhELCAweDIzNDIzOEQwLCAweDhCMTMxMzk4LAorMHhEMjA3RDQwNiwgMHgwMDA5NDIwQiwgMHg0MzJCRDMwNiwgMHgwOUI0MDAwOSwKKzB4MDAwMEZFMTAsIDB4MDAxMTQyRDgsIDB4MDAwREREMDAsIDB4MDAxMTYwQjAsCisweDAwMjAxOEMwLCAweDAwMTE1RTg4LCAweDM0MjI5MkUzLCAweDhGMDJFMTAwLAorMHhBMTYxNjU5MywgMHg5MkREMDAwOSwgMHgzNTJDRTdGRiwgMHhFRTA0Njc3QywKKzB4NjIyQzYyNTAsIDB4ODkwNDMyNzAsIDB4NjIxQzcxMDEsIDB4OEZGNzMyRTMsCisweEU4RkM3NTAxLCAweDM0ODg2ODhDLCAweDlBQ0JFMDY0LCAweDQwMDg2ODkzLAorMHgwRjQ0MzhBQywgMHg2NjFDNjU4MywgMHg2NDRDQkUxOCwgMHg2NEUzNkUwQywKKzB4NjVFMzc0MDEsIDB4NDUwODY2NDMsIDB4MzVFQzQ2MDgsIDB4NDUwODM2NEMsCisweDQ1MDA0NjA4LCAweDM2OUM0NjAwLCAweDYxQTM5QUI1LCAweEUwNjU2NzYzLAorMHg0MDA4MzdBQywgMHg2MjYzNzExNCwgMHgzMjFDMEY3NiwgMHg5NEFCNzAwNCwKKzB4NjE0MzBGMjYsIDB4MzU5QzYyNjMsIDB4NzAwNDMyNEMsIDB4MEYyNjcxMTQsCisweDcwMDQzNjFDLCAweDBGNjY2NzUzLCAweDcwMDQzN0FDLCAweDdBMTQwRjc2LAorMHgzN0FDNjc1MywgMHg2NjUzNzAwNCwgMHgzNjRDMEY3NiwgMHg3NDE0NzAwNCwKKzB4MzU0QzBGNjYsIDB4MEY1NjcwMDQsIDB4Mzk1Qzk1OEYsIDB4RUQwMDZBOTMsCisweDZCRDNFOTU2LCAweEVDMDU0OTA4LCAweDQwMDhFMDY1LCAweDYwQjMwMkZFLAorMHg2NDRDMDQyQywgMHg2MEUzMkY0NiwgMHhFMDZBMDdBQywgMHgwMUZFNDAwOCwKKzB4MDYxQzYwQjMsIDB4MDU4QzYwRTMsIDB4NDAwOEUwNjUsIDB4Njc3QzAxRkMsCisweDY1NUM2NjZDLCAweDY0MUNCREVELCAweDdGMDQ2NDAzLCAweDYwRDM2RERDLAorMHhFMDY2MEY0NCwgMHgwNEZFNDAwOCwgMHgwNTRDNjBCMywgMHgyRjU2NjU1QywKKzB4MDdBQzYwRTMsIDB4NDAwOEUwNkIsIDB4NjBCMzAxRkUsIDB4NjBFMzA2MUMsCisweEUwNjUwNThDLCAweDAxRkM0MDA4LCAweDY2NkM2NzdDLCAweEJERDA2NTVDLAorMHg2NDAzNjQxQywgMHg2NUYzN0YwNCwgMHg2MEQzNzUxMCwgMHhFMDY1MDU0NCwKKzB4MDdGRTQwMDgsIDB4MDU3QzYwQzMsIDB4MkY1NjY1NUMsIDB4MDdBQzYwRTMsCisweDQwMDhFMDZBLCAweDYwQzMwMUZFLCAweDYwRTMwNjFDLCAweEUwNjUwNThDLAorMHgwMUZDNDAwOCwgMHg2NjZDNjc3QywgMHhCREIyNjU1QywgMHg2NDAzNjQxQywKKzB4NjFGMzdGMDQsIDB4NjBEMzcxMjAsIDB4RTA2NjAxNDQsIDB4MDJGRTQwMDgsCisweDA1MkM2MEMzLCAweDJGNTY2NTVDLCAweDA3QUM2MEUzLCAweDQwMDhFMDZCLAorMHg2MEMzMDFGRSwgMHg2MEUzMDYxQywgMHhFMDY1MDU4QywgMHgwMUZDNDAwOCwKKzB4NjY2QzY3N0MsIDB4QkQ5NDY1NUMsIDB4NjUwMzY0MUMsIDB4NjRGMzdGMDQsCisweDYwRDMzNDlDLCAweEUwNjcwNDU0LCAweDA3RkU0MDA4LCAweDA1N0M2MEIzLAorMHgyRjU2NjU1QywgMHgwN0FDNjBFMywgMHg0MDA4RTA2QywgMHhBMDA1MDFGRSwKKzB4MEJCODYwQjMsIDB4MDNDMjAxM0UsIDB4MDEzRjA0NjIsIDB4NjBFMzA2MUMsCisweEUwNjUwNThDLCAweDAxRkM0MDA4LCAweDY2NkM2NzdDLCAweEJENzA2NTVDLAorMHg2MjAzNjQxQywgMHhFMUI4N0YwNCwgMHg2NEYzNjExQywgMHg2MEQzMzQxQywKKzB4RTA2ODA0MjQsIDB4MDVGRTQwMDgsIDB4MDc1QzYwQjMsIDB4MkY3NjY3N0MsCisweDA3QUM2MEUzLCAweDQwMDhFMDZELCAweDYwQjMwMUZFLCAweDYwRTMwNjFDLAorMHhFMDY1MDU4QywgMHgwMkZDNDAwOCwgMHg2NjZDNjc3QywgMHhCRDUwNjU1QywKKzB4NjcwMzY0MkMsIDB4RTJDMDdGMDQsIDB4NjZGMzYyMkMsIDB4NjBEMzM2MkMsCisweEUwNjcwNjc0LCAweDA3RkU0MDA4LCAweDAyN0M2MEMzLCAweDJGMjY2MjJDLAorMHgwN0FDNjBFMywgMHg0MDA4RTA2QywgMHg2MEMzMDJGRSwgMHg2MEUzMDYyQywKKzB4RTA2NTA1OEMsIDB4MDJGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkQzMDY1NUMsCisweDYyMDM2NDJDLCAweEU3Qzg3RjA0LCAweDY2RjM2NzdDLCAweDYwRDMzNjdDLAorMHhFMDY4MDYyNCwgMHgwNkZFNDAwOCwgMHgwMjZDNjBDMywgMHgyRjI2NjIyQywKKzB4MDdBQzYwRTMsIDB4NDAwOEUwNkQsIDB4NjBDMzAyRkUsIDB4NjBFMzA2MkMsCisweEUwNjUwNThDLCAweDAyRkM0MDA4LCAweDY2NkM2NzdDLCAweEJEMTA2NTVDLAorMHg2MTAzNjQyQywgMHg2NjkzN0YwNCwgMHg2MkYzNzYwOCwgMHg2MEQzMzI2QywKKzB4MDIxNDdEMDEsIDB4RTYwNTYyREMsIDB4N0MwMTMyNjMsIDB4N0IwMThEMDIsCisweDAwMDlBRUZBLCAweDAwMDlBMTdCLCAweEU3RkY5QkQ1LCAweDY3N0MzNUJDLAorMHg2MjUwRUUwOCwgMHgzMjcwNjIyQywgMHg3MTAxODkwNCwgMHgzMkUzNjIxQywKKzB4NzUwMThGRjcsIDB4REREODlDQzgsIDB4M0Q0NTM0QzgsIDB4NDAwOEUwNjQsCisweDRFMDkwRTBBLCAweDBGRTQ2NTkzLCAweDcwMjQzNUJDLCAweDY0RUM2NjFDLAorMHgwRjU2QkNCNCwgMHg2NEUzNkUwQywgMHg2NUUzNzQwMSwgMHg0NTA4NjI0MywKKzB4MzVFQzQyMDgsIDB4NDUwODMyNEMsIDB4NDUwMDQyMDgsIDB4MzI5QzQyMDAsCisweDYxQjM3QjBDLCAweDM4QkM2ODIzLCAweDcxMTRFMDZFLCAweDQwMDg2QjIzLAorMHg5MUEyM0IxQywgMHg3MDA0MEY4NiwgMHg2ODIzNjQxMywgMHgwRkI2MzU5QywKKzB4NzAwNDM4MUMsIDB4MEY4Njc0MTQsIDB4NzAwNDM0MkMsIDB4Njc1Mzk4OTYsCisweDBGNDY2MjUzLCAweDcwMDQzNzhDLCAweDZCNTM3ODE0LCAweDcxMTQzMjFDLAorMHgzQjhDMEY3NiwgMHgzNTFDNzAwNCwgMHgwRkI2OTc4OSwgMHgzOTdDNzAwNCwKKzB4NzAwNDBGMjYsIDB4RUQwMDY4OTMsIDB4MEY1NkVDMDUsIDB4NkFEM0U5NTYsCisweEUwNkU0OTA4LCAweDAyRkU0MDA4LCAweDAxMkM2MEEzLCAweDJGMTY2MTFDLAorMHgwNzhDNjBFMywgMHg0MDA4RTA3MywgMHg2MEEzMDRGRSwgMHhFMDZFMDY0QywKKzB4MEJGRTQwMDgsIDB4MDVCQzYwRTMsIDB4NDAwOEUwNjUsIDB4Njc3QzAxRkMsCisweDY1NUM2NjZDLCAweDY0MUNCQzg1LCAweDdGMDQ2NDAzLCAweDYwRDM2RERDLAorMHhFMDZGMEY0NCwgMHgwNEZFNDAwOCwgMHgwNTRDNjBBMywgMHgyRjU2NjU1QywKKzB4MDc4QzYwRTMsIDB4NDAwOEUwNzQsIDB4NjBBMzBCRkUsIDB4RTA2RTA2QkMsCisweDBCRkU0MDA4LCAweDA1QkM2MEUzLCAweDQwMDhFMDY1LCAweDY3N0MwMUZDLAorMHg2NTVDNjY2QywgMHg2NDFDQkM2NSwgMHg3RjA0NjQwMywgMHg3NTEwNjVGMywKKzB4MDU0NDYwRDMsIDB4NDAwOEUwNkUsIDB4NjBDMzA3RkUsIDB4NjU1QzA1N0MsCisweDYwRTMyRjU2LCAweEUwNzMwNzhDLCAweDBCRkU0MDA4LCAweDA2QkM2MEMzLAorMHg0MDA4RTA2RSwgMHg2MEUzMDFGRSwgMHhFMDY1MDUxQywgMHgwQkZDNDAwOCwKKzB4NjY2QzY3N0MsIDB4QkM0NDY1NUMsIDB4NjEwMzY0QkMsIDB4NkJGMzdGMDQsCisweDYwRDM3QjIwLCAweEUwNkYwQjE0LCAweDAxRkU0MDA4LCAweDA0MUM2MEMzLAorMHgyRjQ2NjQ0QywgMHgwNzhDNjBFMywgMHg0MDA4RTA3NCwgMHg2MEMzMDFGRSwKKzB4RTA2RTA2MUMsIDB4MEJGRTQwMDgsIDB4MDVCQzYwRTMsIDB4NDAwOEUwNjUsCisweEEwMDUwMUZDLCAweDAxMzY2NzdDLCAweDAyODIxMkMwLCAweDAxMzcwMTQyLAorMHg2NTVDNjY2QywgMHg2NDFDQkMxRCwgMHg3RjA0NjIwMywgMHgzNDlDNjRGMywKKzB4MDQyNDYwRDMsIDB4NDAwOEUwNzAsIDB4NjBBMzA0RkUsIDB4NjU1QzA1NEMsCisweDYwRTMyRjU2LCAweEUwNzUwNzhDLCAweDBCRkU0MDA4LCAweDA2QkM2MEEzLAorMHg0MDA4RTA2RSwgMHg2MEUzMDFGRSwgMHhFMDY1MDUxQywgMHgwQkZDNDAwOCwKKzB4NjY2QzY3N0MsIDB4QkJGQzY1NUMsIDB4NjEwMzY0QkMsIDB4RUJCODdGMDQsCisweDY1RjM2QkJDLCAweDYwRDMzNUJDLCAweEUwNzEwNTE0LCAweDA3RkU0MDA4LAorMHgwNDdDNjBBMywgMHgyRjQ2NjQ0QywgMHgwNzhDNjBFMywgMHg0MDA4RTA3NiwKKzB4NjBBMzBCRkUsIDB4RTA2RTA2QkMsIDB4MDFGRTQwMDgsIDB4MDUxQzYwRTMsCisweDQwMDhFMDY1LCAweDY3N0MwQkZDLCAweDY1NUM2NjZDLCAweDY0QkNCQkQ5LAorMHg3RjA0NjEwMywgMHg2MjJDRTJDMCwgMHgzQjJDNkJGMywgMHgwQjE0NjBEMywKKzB4NDAwOEUwNzAsIDB4NjBDMzAyRkUsIDB4Njc3QzA3MkMsIDB4NjBFMzJGNzYsCisweEUwNzUwNzhDLCAweDAyRkU0MDA4LCAweDA2MkM2MEMzLCAweDQwMDhFMDZFLAorMHg2MEUzMDJGRSwgMHhFMDY1MDUyQywgMHgwMkZDNDAwOCwgMHg2NjZDNjc3QywKKzB4QkJCNjY1NUMsIDB4NjcwMzY0MkMsIDB4RUJDODdGMDQsIDB4NjZGMzZCQkMsCisweDYwRDMzNkJDLCAweEUwNzEwNjc0LCAweDA2RkU0MDA4LCAweDAyNkM2MEMzLAorMHgyRjI2NjIyQywgMHgwNzhDNjBFMywgMHg0MDA4RTA3NiwgMHg2MEMzMDJGRSwKKzB4RTA2RTA2MkMsIDB4MDJGRTQwMDgsIDB4MDUyQzYwRTMsIDB4NDAwOEUwNjUsCisweDY3N0MwMkZDLCAweDY1NUM2NjZDLCAweDY0MkNCQjkzLCAweDdGMDQ2MTAzLAorMHg3MjA4NjI5MywgMHgzNjJDNjZGMywgMHg3RDAxNjBEMywgMHg2MkRDMDYxNCwKKzB4MzI2M0U2MDUsIDB4OEQwMjdDMDEsIDB4QUVFMjdBMDEsIDB4NkVGMzAwMDksCisweEUyQjA2OEYzLCAweDZBRjNFMDVBLCAweDM4OUM3RTE4LCAweDY5RjM2MjJDLAorMHg3QTA4NDAwOCwgMHg2N0YzNkRGMywgMHgzOTJDNjFGMywgMHg2Q0EzMEZFNiwKKzB4NzcyMDdEMTAsIDB4RTQwMDcxMjgsIDB4RUIwNTY1RjMsIDB4NjA0QzY2NTQsCisweDY2RDQ2MjZDLCAweDJFNjA0MjIxLCAweDA0OEM2Njc0LCAweDYyNkMyQzIwLAorMHgwOTQ0NDIyMSwgMHgyMTIwNzAwMSwgMHgzMkIzNjIwQywgMHg3MTAxNjQwMywKKzB4OEZFQjdFMDEsIDB4RTA1QTdDMDEsIDB4NkVGMzQwMDgsIDB4N0UzMDBCRkUsCisweEVDMTlFRDAwLCAweDY2QjM2NUEzLCAweEJCN0U2NERDLCAweDYyREM3RDAxLAorMHgyRTAwMzJDMywgMHg3RTAxOEZGNiwgMHg2NjZDRTZCMCwgMHg2QkYzNkVGMywKKzB4N0IyODNFNkMsIDB4RUM0Q0EwMTAsIDB4Q0NDQ0NDQ0QsIDB4NjREMzZEREMsCisweDY0NEM3NEY0LCAweEJCNjg2NUIzLCAweDY3RjM2NkUzLCAweDc3MzA2NTAzLAorMHgwNzU0NjBEMywgMHg2MkRDN0QwMSwgMHg4QkVGMzJDMywgMHg3QjMwNkJGMywKKzB4NjFCMzY3QjMsIDB4RUQ4MDY0QjMsIDB4NzEwMjc3MDEsIDB4NkREQzc0MDMsCisweERDMzdFNTAwLCAweDYwNUNERTM3LCAweDA5MUMwODRDLCAweDBBN0M2NjhDLAorMHg2OTlDNDYyOCwgMHg0OTI4NDYxOCwgMHgwNUJDNkFBQywgMHg0QTE4MjY5QiwKKzB4NzAwNDY4MDMsIDB4NjU1QzI2QUIsIDB4NjIwQzM4Q0MsIDB4MzhFQzI2NUIsCisweDI4NjIzMkQzLCAweDY1MDM4RkU3LCAweDY0NENFNEI4LCAweDNDNEM2Q0YzLAorMHg2RUYzNzQwOCwgMHhFMkIwRTY1OCwgMHgzRTRDNkFGMywgMHg3NDA4NkJGMywKKzB4NDYwODYxRjMsIDB4NjIyQzY4RjMsIDB4N0EwODY5RjMsIDB4MzE0QzdCMTgsCisweDM4NkM2NEYzLCAweDZEQTMzOTJDLCAweDc0Mjg2N0IzLCAweDY2QzRFNTAwLAorMHg2MjZDNjA1QywgMHg0MjIxNjZFNCwgMHg2NjE0Mjc2MCwgMHgyRDIwMDU4QywKKzB4NDIyMTYyNkMsIDB4NzAwMTA5NTQsIDB4NjIwQzI0MjAsIDB4MzI2M0U2MDUsCisweDc0MDE2NTAzLCAweDhGRUE3NzAxLCAweEUwNUU3RDAxLCAweDAyRkQ0MDA4LAorMHg2RDJERTlEMCwgMHg2OTlDN0QwNywgMHhFRTAwQTAwQiwgMHg2NkIzNjVBMywKKzB4NjRFQ0JBRkIsIDB4NjIwMzY3RjMsIDB4NjBFQzM3OUMsIDB4NzAwMTA3MjQsCisweDYyRUM2RTAzLCAweDhCRjEzMkQzLCAweDQwMDhFMDVGLCAweEVBQjAwOEZELAorMHg2REYzNkFBQywgMHg2QkYzNkM4RCwgMHg3QzBEM0RBQywgMHg3QjI4QTAxMiwKKzB4MDAwMEEyODAsIDB4MDAxQkMwMDAsIDB4NjRFMzZFRUMsIDB4NjQ0Qzc0RjQsCisweEJBREE2NUIzLCAweDYyRjM2NkQzLCAweDMyOUM2MTAzLCAweDdFMDE2MEUzLAorMHg2MkVDMDIxNCwgMHg4QkVGMzJDMywgMHgzRDlDNkRGMywgMHg2N0QzNkVEMywKKzB4RUM4MDYxRDMsIDB4NzcwMjdFMDEsIDB4NkNDQzcxMDMsIDB4REJCOUU0MDAsCisweDYwNENEQUI5LCAweDA2N0MwNDFDLCAweDA4RUM2NTRDLCAweDY2NkM0NTI4LAorMHg0NjI4NDUxOCwgMHgwOURDNjg4QywgMHg0ODE4MjU2QiwgMHg3MDA0NjYwMywKKzB4Njk5QzI1OEIsIDB4NjIwQzM2QkMsIDB4MzZBQzI1OUIsIDB4MjY1MjMyQzMsCisweDY0MDM4RkU3LCAweDQwMDhFMDY0LCAweDcwRTAwN0ZDLCAweDcwNkMwQ0ZDLAorMHgwRjg2NjhDQywgMHgwREZDNzA5OCwgMHg2QURDNzA2QywgMHg3MDhDMEZBNiwKKzB4OUJCRjBFRkUsIDB4RTI1NDNFQjIsIDB4Njk3Q0UxMDAsIDB4NDIwODhGMDIsCisweDAwMDlBMTYzLCAweDQwMDhFMDYzLCAweDZFRjMwNUZFLCAweDNFMkM5NkIzLAorMHg2NEUzMzU2QywgMHhFREZGRTcwMywgMHgzMkQwNjI1MCwgMHg2MjJDOEQwNywKKzB4NjgxQzcxMDEsIDB4MjQyMDM4NzMsIDB4OEZGNTc1MDUsIDB4RTA2NDc0MDEsCisweDBBRkM0MDA4LCAweDY0QUM2NUUzLCAweDY2MUNCQTE4LCAweEUwNjM2NzBDLAorMHg2MjczNDAwOCwgMHg0MjA4MEJGRSwgMHg3NzAxMzI3QywgMHgzQTJDNkFCMywKKzB4NDgwODY4NzMsIDB4OTQ4RjZFQTMsIDB4M0U0QzM4N0MsIDB4M0I4Qzc0RkYsCisweDM4MjgzQTRDLCAweEVDMDAzQjRDLCAweDYwODNERDg4LCAweDY1NUMwNUVDLAorMHhFMDY1MkY1NiwgMHg2N0IwNDAwOCwgMHg2NUEwNjZFNCwgMHg2NzdDMDFGQywKKzB4NjU1QzY2NkMsIDB4NjQxQ0JBMUQsIDB4N0MwMTdGMDQsIDB4RTQwNDYyQ0MsCisweDJEMDAzMjQzLCAweDdEMDE4RkU5LCAweEUwNjNFNTU0LCAweDY3RjM0NTA4LAorMHgzNzVDNDAwOCwgMHg5NjY4MDVGRSwgMHgzNTZDRURGRiwgMHg2RERDNjQ3MywKKzB4RUUwNEUxMDAsIDB4NjY2QzY2NTAsIDB4ODkwNjM2RDAsIDB4NjIxQzcxMDEsCisweDI0NjAzMkUzLCAweDhGRjU3NTA1LCAweEUwNjQ3NDAxLCAweDAyRkM0MDA4LAorMHg2NDJDNjU3MywgMHg2NjFDQjlDQSwgMHg2RTIzNjIwQywgMHhFMDYzNEUwOCwKKzB4NzIwMTNFMkMsIDB4MEJGRTQwMDgsIDB4NDcwODY3MjMsIDB4NkFCMzM3MkMsCisweDY4NzMzQUVDLCAweDZFQTMzOEU4LCAweDNFMUM5MTQwLCAweDNCN0M3MUZGLAorMHgzQjFDM0ExQywgMHgwRjk2NzA0QywgMHhFQzAwRTkwNCwgMHg2MDgzREQ2MCwKKzB4NjQ0QzA0RUMsIDB4RTA2NTJGNDYsIDB4NjdCMDQwMDgsIDB4NjVBMDY2RTQsCisweDY3N0MwMUZDLCAweDY1NUM2NjZDLCAweDY0MUNCOUNCLCAweDdDMDE3RjA0LAorMHgzMjkzNjJDQywgMHg4RkVBMkQwMCwgMHhFMDc2N0QwMSwgMHgwOUZFNDAwOCwKKzB4NzBCNEU0NTQsIDB4NjdGMzQ0MDgsIDB4Mzc0QzA1RkUsIDB4RURGRjk2MTcsCisweDM1NkM2NDczLCAweEUxMDA2RERDLCAweDY2NTBFRTA0LCAweDM2RDA2NjZDLAorMHg3MTAxODkwNiwgMHgzMkUzNjIxQywgMHg3NTA5MjQ2MCwgMHg3NDAxOEZGNSwKKzB4RTA2NEEwMDYsIDB4MDVCQTBCQjgsIDB4MDVDOTA1QkIsIDB4MDVERDA1Q0EsCisweDY1NzM0MDA4LCAweDY2MUMwN0ZDLCAweDY0N0NCOTcwLCAweDY2MjM2MjBDLAorMHg0NjA4RTA2MywgMHg0NjAwNDAwOCwgMHgzNjJDMEJGRSwgMHg2ODIzNzIwMSwKKzB4M0E2QzZBQjMsIDB4NDgwMDQ4MDgsIDB4OTE2NzZFQTMsIDB4M0UxQzM4MkMsCisweDNCOEM3MUZGLCAweDM4NjgzQTFDLCAweEVDMDAzQjFDLCAweDYwODNERDM1LAorMHg2NDRDMDRFQywgMHhFMDY1MkY0NiwgMHg2N0IwNDAwOCwgMHg2NUEwNjZFNCwKKzB4Njc3QzAxRkMsIDB4NjU1QzY2NkMsIDB4NjQxQ0I5NzMsIDB4N0MwMTdGMDQsCisweEU1MDg2MkNDLCAweDJEMDAzMjUzLCAweDdEMDE4RkU5LCAweDQwMDhFMDYzLAorMHgwNUZFRTY1NCwgMHg2NEYzNDYwOCwgMHhFQ0ZGOTc0MSwgMHgzNTdDMzQ2QywKKzB4RUUwMDZDQ0MsIDB4NjI1MEVEMDQsIDB4MzJDMDYyMkMsIDB4N0UwMTg5MDYsCisweDM4RDM2OEVDLCAweDc1MDkyNDIwLCAweDc0MDE4RkY1LCAweDQwMDhFMDc3LAorMHg3MDA0MDVGRSwgMHg2NDkzMDZGRSwgMHhFQTU0QjlBNywgMHg2NUYzNEEwOCwKKzB4NjQwQzM1QUMsIDB4NjZFQ0I5MUEsIDB4NjYxMzYxMEMsIDB4NDYwOEUwNjMsCisweDQ2MDA0MDA4LCAweDM2MUMwQkZFLCAweDY4MTM3MTAxLCAweDNBNkM2QUIzLAorMHg0ODAwNDgwOCwgMHg5MjEzNkVBMywgMHgzRTJDMzgxQywgMHgzQjhDNzJGRiwKKzB4Mzg2ODNBMkMsIDB4RUMwMDNCMkMsIDB4RTA3N0REMEIsIDB4MDVGRTQwMDgsCisweDA2RkU3MDA0LCAweDY0OTNCOTgxLCAweDAwMDlBMDEwLCAweDA2MDEwNURFLAorMHgwMDAwMDYwMiwgMHgwMDAwQjI4MCwgMHgwMDFCQzAwMCwgMHgwMDExNDJFNCwKKzB4MDAxMTQyRTgsIDB4MDAxMTQyRUQsIDB4MDAxMTQyRjUsIDB4NjA4MzY0MDMsCisweDY3N0MwN0VDLCAweDY3QjAyRjc2LCAweDY1QTA2NkU0LCAweDY2NkM2NzdDLAorMHhCOTA2NjU1QywgMHg3RjA0NjQ0QywgMHg2MUNDN0MwMSwgMHgzMTIzRTIwOCwKKzB4OEZEMjJEMDAsIDB4QTBGQzdEMDEsIDB4RTA2MzAwMDksIDB4MDVGRTQwMDgsCisweDk2RDA2N0YzLCAweDM1NkMzNzJDLCAweEVFRkY2NDczLCAweDMyRTA2MjUwLAorMHg2MjJDOEQwOCwgMHg2ODFDNzEwMSwgMHgzODYzRTYwOCwgMHg3NTA1MjQyMCwKKzB4NzQwMThGRjQsIDB4NDAwOEUwNjQsIDB4NjU3MzAyRkMsIDB4QjhCNTY0MkMsCisweDY1MEM2NjFDLCAweDQwMDhFMDYzLCAweDBCRkU2MjUzLCAweDMyNUM0MjA4LAorMHg2QUIzNzUwMSwgMHg2ODUzM0EyQywgMHg2RUEzNDgwOCwgMHgzODVDOTRBQywKKzB4NzRGRjNFNEMsIDB4M0E0QzNCOEMsIDB4M0I0QzM4MjgsIDB4REQ5NkVDMDAsCisweDA2RUM2MDgzLCAweDJGNjY2NjZDLCAweDQwMDhFMDY1LCAweDY2RTQ2N0IwLAorMHgwMUZDNjVBMCwgMHg2NjZDNjc3QywgMHhCOEJBNjU1QywgMHg3RjA0NjQxQywKKzB4NjJDQzdDMDEsIDB4MzI0M0U0MDQsIDB4OEZFOTJEMDAsIDB4RTU1NDdEMDEsCisweDQ1MDhFMDYzLCAweDQwMDg2N0YzLCAweDA1RkUzNzVDLCAweEVFRkY5Njg1LAorMHg2NDczMzU2QywgMHhFMTAwNkVFQywgMHg2NjZDNjY1MCwgMHg4OTA3MzZFMCwKKzB4NjIxQzcxMDEsIDB4MzI4M0U4MDgsIDB4NzUwOTI0NjAsIDB4NzQwMThGRjQsCisweDQwMDhFMDY0LCAweDY1NzMwQUZDLCAweEI4Njc2NEFDLCAweDYyMEM2NjFDLAorMHhFMDYzNjYyMywgMHg0MDA4NDYwOCwgMHgwQkZFNDYwMCwgMHg3MjAxMzYyQywKKzB4NkFCMzY4MjMsIDB4NDgwODNBNkMsIDB4NkVBMzQ4MDAsIDB4MzgyQzkxNUUsCisweDcxRkYzRTFDLCAweDNBMUMzQjhDLCAweDNCMUMzODY4LCAweERENkZFQzAwLAorMHgwNEVDNjA4MywgMHgyRjQ2NjQ0QywgMHg0MDA4RTA2NSwgMHg2NkU0NjdCMCwKKzB4MDFGQzY1QTAsIDB4NjY2QzY3N0MsIDB4Qjg2QTY1NUMsIDB4N0YwNDY0MUMsCisweDYyQ0M3QzAxLCAweDMyNTNFNTA4LCAweDhGRTkyRDAwLCAweEUwNjM3RDAxLAorMHhFNjU0NDAwOCwgMHg0NjA4MDVGRSwgMHg5NzM4NjRGMywgMHgzNDZDRUNGRiwKKzB4NkNDQzM1N0MsIDB4RUQwOEVFMDAsIDB4NjY2QzY2NTAsIDB4ODkwNjM2QzAsCisweDYyRUM3RTAxLCAweDI0NjAzMkQzLCAweDhGRjU3NTA5LCAweEUwNzc3NDAxLAorMHgwNUZFNDAwOCwgMHgwNkZFNzAwNCwgMHhCODlFNjQ5MywgMHg0ODA4RTg1NCwKKzB4MzU4QzY1RjMsIDB4QjgxMTY0MEMsIDB4NjEwQzY2RUMsIDB4RTA2MzY2MTMsCisweDQwMDg0NjA4LCAweDBCRkU0NjAwLCAweDcxMDEzNjFDLCAweDZBQjM2ODEzLAorMHg0ODA4M0E2QywgMHg2RUEzNDgwMCwgMHgzODFDOTIwQSwgMHg3MkZGM0UyQywKKzB4QTAwNjNCOEMsIDB4MDUwMjNBMkMsIDB4MDUyQTA1MDMsIDB4MDU3MjA1MkIsCisweDM4NjgwNTczLCAweEVDMDAzQjJDLCAweEUwNzdERDQxLCAweDA1RkU0MDA4LAorMHgwNkZFNzAwNCwgMHg2NDkzQjg3MSwgMHg2MDgzNjQwMywgMHg2NzdDMDdFQywKKzB4NjdCMDJGNzYsIDB4NjVBMDY2RTQsIDB4NjY2QzY3N0MsIDB4QjgwODY1NUMsCisweDdGMDQ2NDRDLCAweDYxQ0M3QzAxLCAweDMxMjNFMjA4LCAweDhGRTQyRDAwLAorMHhEMzM0N0QwMSwgMHgwMDA5NDMwQiwgMHhFMDc5NjIwQywgMHgwRjI0NDAwOCwKKzB4ODgzMDYwMjMsIDB4QTI0RDhCMDEsIDB4ODg0MDAwMDksIDB4QTI0OThCMDEsCisweDIyMjgwMDA5LCAweEEyNDU4QjAxLCAweEU1RkYwMDA5LCAweDY1NUNENDJBLAorMHhFMDNBRTYwMSwgMHg4RjA0MzI1MCwgMHhFMDc5MDQ2NCwgMHg0MDA4RTIxMCwKKzB4RTA1QjBGMjQsIDB4MDVGRTQwMDgsIDB4MzU2Njk2M0IsIDB4QTE0OThCMDEsCisweDYwMjMwMDA5LCAweDY0MENDQjAxLCAweDZFMjNCODQyLCAweEUxMTg2NjBDLAorMHg4OTBGMzYxMywgMHg0MDA4RTA2MywgMHgwNEZFNDYwOCwgMHg5NzI5NDYwOCwKKzB4NDYwMDcwRTAsIDB4MDVGRTM0N0MsIDB4MzQ2Q0I4NUMsIDB4RTA2MDYyMDMsCisweDBGMjQ0MDA4LCAweENCMDI2MEUzLCAweDY0MENCODJBLCAweEUxMTg2NjBDLAorMHg4OTBGMzYxMywgMHg0MDA4RTA2MywgMHgwNEZFNDYwOCwgMHg5MTExNDYwOCwKKzB4NDYwMDcwRTAsIDB4MDVGRTM0MUMsIDB4MzQ2Q0I4NDQsIDB4RTA2MTYyMDMsCisweDBGMjQ0MDA4LCAweENCMDU2MEUzLCAweDY0MENCODEyLCAweEEwMEQ2NjBDLAorMHgwOUI0RTA3QSwgMHgwMDAwMDY0RCwgMHgwMDExNDJGRCwgMHgwMDExNDMwMSwKKzB4MDAxMTQzMDksIDB4MDAxMTQ0MDAsIDB4MDAxMTQyRDgsIDB4NDAwOEUxMTgsCisweDhGMDQzNjEzLCAweEUwNjEwRjY0LCAweEEwMTA0MDA4LCAweEUwN0EwREZDLAorMHgwNkZDNDAwOCwgMHg2MjZDNzBBNCwgMHgwNEZFNDIwOCwgMHg5N0I0NDIwOCwKKzB4NDIwMDcwRTAsIDB4MDVGRTM0N0MsIDB4MzQyQ0I4MTQsIDB4RTA3OTZEMDMsCisweDAwRkM0MDA4LCAweENCMDdEQjhFLCAweDQzMEJEMzhFLCAweDYxMEM2NDBDLAorMHg0MDA4RTA3QSwgMHg3MDlDMEYxNCwgMHhFNjE4MDJGQywgMHg4RDFDMzE2MywKKzB4RTA1RDY4MkMsIDB4MDFGQzQwMDgsIDB4MDlGQzcwRkMsIDB4MDRGRTcwRkMsCisweEQzODU2NjFDLCAweDY1OUM0MzBCLCAweEUwN0E2NTAzLCAweDAxRkM0MDA4LAorMHg2MTFDNzBBNCwgMHgwNEZFNDEwOCwgMHg5Nzg2NDEwOCwgMHgzNDdDNDEwMCwKKzB4NDMwQkQzN0UsIDB4QTAwMzM0MUMsIDB4RTA2MTZDMDMsIDB4MENGQzQwMDgsCisweEU1MDBENjdCLCAweDY0MEQ4NTYyLCAweDQwMDhFMDVCLCAweDBBRkVBMDM2LAorMHg2MDUzNjU1QywgMHgzMDVDNDAwMCwgMHg0MDA4RDY3NiwgMHg2MjJEMDI2RCwKKzB4OEYyQTMyQTAsIDB4RDM3NDZFMDMsIDB4NjRBRDQzMEIsIDB4MjIyODYyMEQsCisweEQ2NzI4OTI3LCAweDA2NkM2MEUzLCAweDQwMDhFMDYwLCAweDQ2MDAwMkZDLAorMHgzRTY3NkUyQywgMHg2MjYzOEIwMCwgMHg0MDA4RTA2MCwgMHgwRjI0Mzg2NywKKzB4NjI2MzhEMDMsIDB4NDAwOEUwNjEsIDB4RTA2MTAyRkMsIDB4NDAwODYxREMsCisweDBGMjQzMTY3LCAweDhGMDE2ODJDLCAweDYyNjM2MkQzLCAweDM0Njc2NENDLAorMHg2RDIzOEQwMSwgMHhBMDA0NjZDMywgMHg3NTAxNkM2MywgMHgzMjQzNjI1QywKKzB4RTA2MDhCQzYsIDB4MDdGQzQwMDgsIDB4NjE3Q0U0MDAsIDB4RTkwNEQ1NUMsCisweDY2NkM2NjUwLCAweDhCMDEzNjE3LCAweDY2NzM2NzdDLCAweDYyNEM3NDAxLAorMHgyNTYwMzI5MywgMHg3NTAxOEZGNCwgMHhFMDNBRDY1NiwgMHhFNDAwMDU2QywKKzB4OEQwMTI1NTgsIDB4RTIwMjYyNDMsIDB4NDAwOEUwNjEsIDB4Njc4MzBFRkMsCisweDNFMjgzODI4LCAweDkxMTlFNTAwLCAweDYwNTM2NTVDLCAweDNBMTAwMkJDLAorMHg2MjJDOEQwQiwgMHgzQTYwOTYxMywgMHgzMjc3ODkwNywgMHhFMDYxOEIwMiwKKzB4MDJGQzQwMDgsIDB4QTAxRDYwNTMsIDB4MjU1ODBCMjQsIDB4MzI4Nzg5MDgsCisweDYyODM4QjAwLCAweEEwMTU2MDUzLCAweDA2NEQwQjI0LCAweDA5OUUwOTZDLAorMHg4RjA4MzI3NywgMHhFMDdCNjYyMywgMHgwRjE2NDAwOCwgMHgwMkZDNzA5OCwKKzB4MDFGRTcwNjgsIDB4NjI2QzY2MkMsIDB4MzI4NzYwNTMsIDB4MEI2NDhGMDIsCisweDY0NjMzNkU4LCAweDYyNUM3NTAxLCAweDhCQ0QzMjkzLCAweEUwMTRENjM1LAorMHhFNDAwMDY0NCwgMHhENTM0NjFEQywgMHg2MjUwRTcwOCwgMHgzMjE3NjIyQywKKzB4NkREQzhCMDEsIDB4NzQwMTYyRDMsIDB4MzY3MzY2NEMsIDB4OEZGNDI1MjAsCisweEU0MDA3NTAxLCAweEQ1MkQ2MUNDLCAweDYyMkM2MjUwLCAweDhCMDEzMjE3LAorMHg2MkMzNkNDQywgMHg2NjRDNzQwMSwgMHgyNTIwMzY3MywgMHg3NTAxOEZGNCwKKzB4MDAwOUEwRUMsIDB4NDAwOEUwNzksIDB4NjQyQzAyRkMsIDB4NDMwQkQzMTksCisweDY2MEM2RTQzLCAweDM2NTNFNTE4LCAweEUwNjM4OTEwLCAweDQ2MDg0MDA4LAorMHg0NjA4MDRGRSwgMHg3MEUwOTcyMiwgMHgzNDdDNDYwMCwgMHhEMzEzMDVGRSwKKzB4MzQ2QzQzMEIsIDB4RTA2MjYyMDMsIDB4MEYyNDQwMDgsIDB4Q0IwNjYwRTMsCisweDQzMEJEMzBDLCAweDY2MEM2NDAzLCAweDM2NTNFNTE4LCAweEUwNjM4OTI4LAorMHg0NjA4NDAwOCwgMHg0NjA4MDRGRSwgMHg3MEUwOTcwOCwgMHgzNDdDNDYwMCwKKzB4RDMwNjA1RkUsIDB4MzQ2QzQzMEIsIDB4NkMwM0EwMUQsIDB4MDAwMDA2NEQsCisweDAwMTE0MkU4LCAweDAwMTE0OEUwLCAweDAwMTE0OEJBLCAweDAwMTE0OTM0LAorMHgwMDExNDAwMCwgMHgwMDExNDAwOCwgMHgwMDExNDc3NCwgMHgwMDExNDAxMSwKKzB4MDAxMTQyRTQsIDB4MDAxMTQyRDgsIDB4MDAxMTQyRUQsIDB4MDAxMTQyRjUsCisweDQwMDhFMDYyLCAweDYwRTMwQ0ZDLCAweEQzOUNDQjA4LCAweDY0MDM0MzBCLAorMHhFMDdBNjEwQywgMHg0MDA4RTYxOCwgMHg4RDFDMzE2MywgMHhFMDVEMEYxNCwKKzB4MDdGQzQwMDgsIDB4MDlGQzcwRkMsIDB4MDRGRTcwRkMsIDB4RDM5NDY2N0MsCisweDY1OUM0MzBCLCAweEUwN0E2NTAzLCAweDAxRkM0MDA4LCAweDYxMUM3MEE0LAorMHgwNEZFNDEwOCwgMHg5RDc0NDEwOCwgMHgzNERDNDEwMCwgMHg0MzBCRDM4RCwKKzB4QTAwMzM0MUMsIDB4RTA2MjZEMDMsIDB4MERGQzQwMDgsIDB4RTUwMEQ2OEEsCisweDY0MEQ4NTYyLCAweDQwMDhFMDVCLCAweDAxRkVBMDJDLCAweDYwNTM2NTVDLAorMHgzMDVDNDAwMCwgMHg0MDA4RDY4NSwgMHg2MjJEMDI2RCwgMHg4RjIwMzIxMCwKKzB4RDM4MzZFMDMsIDB4NjQxRDQzMEIsIDB4MjIyODYyMEQsIDB4RDY4MTg5MUQsCisweDA2NkM2MEUzLCAweDQwMDhFMDYyLCAweDQ2MDAwMkZDLCAweDMxNjc2MTJDLAorMHg2MjYzOEIwMCwgMHg2NENDRTA2MiwgMHgzNDY3NDAwOCwgMHg4RjAxMEYyNCwKKzB4NjI2MzYyQzMsIDB4MzU2NzY1REMsIDB4NkMyMzhEMDEsIDB4QTAwNDY2RDMsCisweDc1MDE2RDYzLCAweDMyNDM2MjVDLCAweEUwNjI4QkQwLCAweDA3RkM0MDA4LAorMHg2MTdDRTQwMCwgMHhFOTA0RDU3MCwgMHg2MjJDNjI1MCwgMHg4QjAxMzIxNywKKzB4NjI3MzY3N0MsIDB4NjY0Qzc0MDEsIDB4MjUyMDM2OTMsIDB4NzUwMThGRjQsCisweDYxQ0NFNDAwLCAweEU3MDhENTY5LCAweDY2NkM2NjUwLCAweDhCMDEzNjE3LAorMHg2NkMzNkNDQywgMHg2MjRDNzQwMSwgMHgyNTYwMzI3MywgMHg3NTAxOEZGNCwKKzB4NjFEQ0U0MDAsIDB4NjY1MEQ1NjIsIDB4MzYxNzY2NkMsIDB4NkREQzhCMDEsCisweDc0MDE2NkQzLCAweDMyNzM2MjRDLCAweDhGRjQyNTYwLCAweEEwMDU3NTAxLAorMHgwNjREMDAwOSwgMHhFMjAwRDY1QiwgMHgwNjI0RTAzQSwgMHhFMDNBRDY1OSwKKzB4MjIyODAyNkMsIDB4RTAzOTg5NEIsIDB4MjIyODAyNkMsIDB4RTA1Qjg5NDcsCisweDBFRkU0MDA4LCAweDNFNjY5NjkwLCAweEUwNzk4OTQxLCAweDAwRkM0MDA4LAorMHg4RDAyM0U2NiwgMHhDQjAyNjQwQywgMHhEMzQ0NjQwQywgMHgwMDA5NDMwQiwKKzB4RTA1QzY2MEMsIDB4MDdGQzQwMDgsIDB4NDYwODcwMUMsIDB4NjE3QzA1RkUsCisweDk3N0E0NjA4LCAweDM1N0M0NjAwLCAweDY2MTMzNTZDLCAweDQzMEJEMzQ2LAorMHhENTQ0NjRFMywgMHg2MjAzMjAwOCwgMHgwMDI5MTUwRiwgMHg2NjAzQ0EwMSwKKzB4MjY2OEUwM0IsIDB4MDU2NDhEMjAsIDB4QzhGMDYwMjMsIDB4RDUzRjg5MDksCisweDc2RkY2NjUwLCAweDg0NTEyNTYwLCAweDgwNTE3MEZGLCAweDcwRkY4NDUyLAorMHg2MDIzODA1MiwgMHg4OTBGQzgwRiwgMHg2MjYwRDYzOSwgMHgyNjIwNzIwMSwKKzB4NzAwMTg0NjEsIDB4ODQ2MjgwNjEsIDB4QTAwNTcwMDEsIDB4RDYzMTgwNjIsCisweEUwM0JFMjAwLCAweDE2MkYwNjI0LCAweDQwMDhFMDVCLCAweDk2NDMwMkZFLAorMHg4QjY1MzI2NiwgMHhENzJCRDQyOCwgMHhENTJFNjA0MCwgMHg0MDI4QzkzRiwKKzB4NDAwODQwMDgsIDB4NTA3MjYyMDMsIDB4QzgwMkQxMkIsIDB4RTYwNDg5MUEsCisweDQ2Mjg0NjE4LCAweDI1MjIyMjZCLCAweEUyMDg2MDQwLCAweDY1MDNDOTNGLAorMHg2NjAzNDUwOCwgMHg0NTAwNDUwOCwgMHg0NjI4NDIxOCwgMHg2MjYzMjUyQiwKKzB4NDIwODQyMDgsIDB4MjUyQjQyMDAsIDB4NDIxOEUyMDgsIDB4MjUyQjQyMjgsCisweDIxNTJBMDYyLCAweDQ2MThFNjE0LCAweDIyNkI0NjI4LCAweDYwNDAyNTIyLAorMHhDOTNGRTQyOCwgMHg0NTA4NjUwMywgMHg0NTA4NDAyOCwgMHg0NTAwNDAwOCwKKzB4NDAwODQ0MTgsIDB4MjU0QkU3MjgsIDB4NDcxODQwMDAsIDB4NDcyODI1MEIsCisweEQ0MTIyNTdCLCAweDIxNTJBMDQ0LCAweDA2NEQwOUI0LCAweDAwMTE0OEUwLAorMHgwMDExNDhCQSwgMHgwMDExNDkzNCwgMHgwMDExNDAwMCwgMHgwMDExNDAwOCwKKzB4MDAxMTQ3NzQsIDB4MDAxMTQwMTEsIDB4MDAxMTQyRkQsIDB4MDAxMTQzMDEsCisweDAwMTE0MzA5LCAweDAwMTE0MkQ4LCAweDAwMTE0QTI0LCAweDAwMTE0MkY1LAorMHgwMDExNDJFRCwgMHgwMDFDMzY5NCwgMHgwMDFDM0JCNCwgMHgwMDExNDJFOCwKKzB4RTIxNEQ0MjksIDB4NDIxODYwNDAsIDB4NDAyOEM5M0YsIDB4NDAwODQwMDgsCisweEQ2MjY0MjI4LCAweDI2MDIyMDJCLCAweEU3Mjg2MDQwLCAweDY1MDNDOTNGLAorMHg0NTA4NDUwOCwgMHg0NTAwNDAyOCwgMHg0MDA4NDcxOCwgMHg0MDA4MjU3QiwKKzB4NDAwMEU3MjgsIDB4MjUwQjQ3MTgsIDB4RDIxRDQ3MjgsIDB4MjI1MjI1N0IsCisweEQ3MUM2MjQwLCAweDA3MjRFMDQ0LCAweDNGM0M5MzJDLCAweDRGMTY0RjA2LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4MkZFNjY4RjYsIDB4NjI0M0QxMTQsIDB4RTQwMjg1MTIsIDB4NkUyRDY3MEQsCisweEU1MDBBMDBGLCAweDYwNTM2NTVELCAweDMwNUM0MDAwLCAweDQwMDhEMTBGLAorMHg2MjJEMDIxRCwgMHg4QjAzMzJFMCwgMHgwNDFDNzEwOCwgMHg2NDRDQTAwNCwKKzB4NjI1RDc1MDEsIDB4OEJFRDMyNzMsIDB4NDYxOEU2MDIsIDB4NjA0RDI0NjksCisweDZFRjYwMDBCLCAweDAwMDAwMUYwLCAweDAwMTE0MkU4LCAweDAwMUMzNjk0LAorMHgwMDFDM0JCNCwgMHgwMDExNDJEOCwgMHgwMDExNDAwMCwgMHgwMDExNDAwOCwKKzB4RDc2NkQ1NjUsIDB4NjI3MjUxNTEsIDB4MzIxQ0UzNDAsIDB4NTE1MjI3MjIsCisweDMzN0M1MjcxLCAweDE3MjEzMjFDLCAweDUyNzI1MTUzLCAweDMyMUM2NDRDLAorMHgxNzIyRDE1RiwgMHg2NjEyNTI1NSwgMHgyMTYyMzYyQywgMHgzMTZDNTE3MywKKzB4NjE1MjE3MTMsIDB4RDY1QjUyNzQsIDB4MTcyNDMyMUMsIDB4NTI3NTUxNTQsCisweDE3MjUzMjFDLCAweDUyNzY1MTU4LCAweDE3MjYzMjFDLCAweDUxNzc2MjYyLAorMHgxNzE3MzEyQywgMHg1MTc4NTI2MSwgMHgxNzE4MzEyQywgMHg1MTc5NTI2MiwKKzB4MTcxOTMxMkMsIDB4NTE3QTUyNjMsIDB4MTcxQTMxMkMsIDB4NTE3QjUyNjQsCisweDE3MUIzMTJDLCAweDUxN0M1MjY1LCAweDE3MUMzMTJDLCAweDUxN0Q1MjY2LAorMHgxNzFEMzEyQywgMHg1MTdFNTI2NywgMHgxNzFFMzEyQywgMHg1MjdGNTE2OCwKKzB4MzIxQ0Q2NDUsIDB4NjI2MjE3MkYsIDB4NzY5NDYxMzIsIDB4MjMxMjMxMkMsCisweDUyMzE2MTYyLCAweDMyMUNENjQxLCAweDUxNUMxMzIxLCAweDM1MUM1NTMyLAorMHg2MTYyMTM1MiwgMHg0MTI5NTIzNSwgMHgxMzI1MzIxQywgMHg1NjM2NTU2MSwKKzB4MzY1QzQ1MjksIDB4MTM2NkU1MzgsIDB4NTUzMTI0NTAsIDB4NzEwNDYxNDMsCisweDY2NzIyMTUyLCAweDc1MDg2NTQzLCAweDU2NzEyNTYyLCAweDc1MEM2NTQzLAorMHg1NjcyMjU2MiwgMHg3NTEwNjU0MywgMHg1Njc1MjU2MiwgMHg3NTE0NjU0MywKKzB4NTY3MzI1NjIsIDB4NzUxODY1NDMsIDB4NTY3NjI1NjIsIDB4NzUxQzY1NDMsCisweDU2MzIyNTYyLCAweDc1MjA2NTQzLCAweDY2MzIyNTYyLCAweDc1MjQ2NTQzLAorMHg1Njc0MjU2MiwgMHg3NTI4NjU0MywgMHg1NjM0MjU2MiwgMHg3NTJDNjU0MywKKzB4NTUzMzI1NjIsIDB4NzIzMDYyNDMsIDB4NTUzNTIyNTIsIDB4NzIzNDYyNDMsCisweDU2MzYyMjUyLCAweDI0NjI3NDM4LCAweDEzNDFFNDAwLCAweDE3NDEyNzQyLAorMHgxNzQ1MTc0MiwgMHgxNzQ2MTc0MywgMHgyMzQyMTM0MiwgMHgxMzQ0MTc0NCwKKzB4MTM0NTEzNDMsIDB4MTM0NjAwMEIsIDB4RDUxMEUxMjQsIDB4NTE1NzI0MTAsCisweDUyNTgxNDExLCAweDU3NTkxNDIyLCAweDUxNUExNDczLCAweDUyNUIxNDE0LAorMHg1NzVDMTQyNSwgMHg1MjVEMTQ3NiwgMHgxNDI3RTcwMCwgMHgxNDY4NTY1RSwKKzB4MTQ2OTU2NUYsIDB4MTU3ODE1NzcsIDB4MTU3QTE1NzksIDB4MTU3QzE1N0IsCisweDE1N0UxNTdELCAweDE1N0YwMDBCLCAweDAwMUMzNjlDLCAweDAwMjAzNTFDLAorMHgwMDIwMzU3OCwgMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwKKzB4NkU3MjYxNTcsIDB4MjE2NzZFNjksIDB4Njk2ODU0MjAsIDB4NkY2NDIwNzMsCisweDY1NkM2NzZFLCAweDc0NkY2RTIwLCAweDY1NjU2MjIwLCAweDYxNjMyMDZFLAorMHg3MjYyNjk2QywgMHg2NDY1NzQ2MSwgMHgwMDAwMDAwQSwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworY29uc3QgdTMyX3QgemNGd0J1ZkltYWdlU2l6ZT04Mzk2ODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3c3BpdS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZndzcGl1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhN2ZmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3c3BpdS5jCkBAIC0wLDAgKzEsNjU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU1BJW109eworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhCMDE4N0ZGQywgMHhFNjAwMDAwOSwKKzB4OTQzREQ1MjAsIDB4Qzg0MDYwNTIsIDB4MkYwMjhGMDMsIDB4OEZGOTM2NDIsCisweEQ0MUQ3NjAxLCAweDRFMEJERTFELCAweEQ0MUQwMDA5LCAweDAwMDk0RTBCLAorMHg0RTBCRDQxQywgMHg3RjA0MDAwOSwgMHhBMDIxNEYyNiwgMHg0RjIyNkVGNiwKKzB4RTIwNUQxMTksIDB4MjEyMkU0MDAsIDB4OTIyMjIxNDIsIDB4OEJGRDQyMTAsCisweDQ1MEJENTE2LCAweEQ2MTYwMDA5LCAweDAwMDk0NjBCLCAweEU1RkZENzE1LAorMHgyNzUyNjU1RCwgMHhFMUZGRDcxNCwgMHhENDE0NTA3OSwgMHgxNzA5Q0IwMSwKKzB4MTcxMTI3MTIsIDB4MjQxMkUxMDEsIDB4NEYyNkQ0MTEsIDB4MjQxMDAwMEIsCisweERFMTFERDEwLCAweDAwMDk0RDBCLCAweDAwMDk0RTBCLCAweDAwMDlBRkZBLAorMHgwM0U4MjcxMCwgMHgwMDFDMDAxQywgMHgwMDExNjU5NCwgMHgwMDExNEVCRSwKKzB4MDAxMTY1QTQsIDB4MDAxMTY1QkMsIDB4MDAxRDQwMDQsIDB4MDAxMTRGQTAsCisweDAwMTE0Mzc4LCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDExNjRGQywgMHgwMDExNDcwMCwgMHgwMDExNTg5QywgMHgyRkE2MkY5NiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZDODRGMjIsIDB4RDI4REREOEMsCisweDYxRDM2MEQwLCAweDgwRjQ3MTAxLCAweDQyMEI2MDEwLCAweDIwMDg4MEY4LAorMHg2RTAzOEYxMCwgMHhEQjg5RDQ4OCwgMHhENDg5NkE0MCwgMHg0QjBCREM4OSwKKzB4NjdDMDY1QUMsIDB4Njk3Q0RFODgsIDB4NDEwODYxOTMsIDB4MzE5ODQxMDgsCisweDNFMUM0MTA4LCAweDY2RDI4NEY4LCAweDIwMDg2MDBDLCAweDJFNjI4RjEzLAorMHhFNDAwODRGNCwgMHhEQTgxNjcwQywgMHgzMjczNjI0RCwgMHhBMEQzOEIwMSwKKzB4NjQ0RDAwMDksIDB4MzVBQzY1NDMsIDB4Njk0MzY2NTIsIDB4MzlFQzZCNjIsCisweEFGRjExOUIxLCAweDg4MDE3NDA0LCAweDg0RjQ4QjE1LCAweDJFNzBFNzAwLAorMHhEQTc2NkUwQywgMHgzMkUzNjI3RCwgMHhBMEM0OEIwMSwgMHg2NzdEMDAwOSwKKzB4NkM3MzY2QTMsIDB4NjU3Mzc2MDQsIDB4MzU2QzNDQUMsIDB4NkQ1MjY0QzIsCisweEFGRUY3NzA4LCAweEUyQjAyNEQyLCAweDMwMjA2MjJDLCAweDg0RjQ4QjMwLAorMHg2NTBDRUMwMCwgMHhEQTY5MUY1MywgMHg1NUYzRTkwNCwgMHgzMjUzNjJDRCwKKzB4QTBBODhCMDEsIDB4NkNDRDAwMDksIDB4NjdDMzZFQTMsIDB4NkJDMzdFMDQsCisweDNCRUMzN0FDLCAweDZFQjI2RDcyLCAweERCNjJENDYxLCAweDAwMDk0QjBCLAorMHg0MTBCRDE2MSwgMHhENDYxNjREMywgMHgwMDA5NEIwQiwgMHg0NTBCRDU1RSwKKzB4RDQ1RjY0RTMsIDB4MDAwOTRCMEIsIDB4NjFEM0U2MDAsIDB4MzE2QzY2NkQsCisweDY0NkQ3NjAxLCAweDIxRTAzNDkzLCAweDRFMTk4RkY3LCAweDdDMDhBRkQ1LAorMHg2MjJDRTJCMSwgMHg4QjExMzAyMCwgMHhENTUyRDQ1NiwgMHhEQTU2REM0RiwKKzB4MDAwOTQ1MEIsIDB4NEEwQkU0MDAsIDB4RDc1NDY3QzIsIDB4NDcwQkRCNTIsCisweDRCMEIwMDA5LCAweEU5MDBFNDAzLCAweDJFOTBBMDZELCAweDYyMkNFMkIyLAorMHg4OTY4MzAyMCwgMHg2MjJDRTJCMywgMHg4QjFEMzAyMCwgMHhEQTQ1RDQ0QywKKzB4NEEwQkQ5NDIsIDB4NjU5NjAwMDksIDB4Njc5MkQ0NEEsIDB4MUY3NEREM0IsCisweDFGNUQ0RDBCLCAweEQ2MzlENDQ4LCAweDQ2MEJEQjQ4LCAweDU1RjQ1NUY0LAorMHg0QjBCRDkzNiwgMHhENDQ2NTRGRCwgMHg0OTBCNjUwMywgMHg1REY1MUYwNSwKKzB4MUVEMUVDMDQsIDB4MkVDMEEwNDcsIDB4NjIyQ0UyQjQsIDB4OEIzRTMwMjAsCisweERBMzRENDQwLCAweDRBMEJERDMxLCAweDg0RjQwMDA5LCAweDYwMEM2Q0QyLAorMHgxRjA3MkYwMiwgMHgxRkM2QzkwMywgMHhFNjAwMUYwOCwgMHhENzNBRTAzMCwKKzB4NkNGMkRCM0EsIDB4MUY3OTBGNjUsIDB4QTAyMTFGQkEsIDB4NTFGNkU5MDQsCisweDZENjM2NjZELCAweDRDMTUzNkVDLCAweEQyMzUzRDFDLCAweDFGNkI4RjA1LAorMHg4OTAyM0M5MywgMHhBMDAyNjREMywgMHhFNTA0NTVGOCwgMHg0MjBCNjREMywKKzB4NUJGQjAwMDksIDB4RDYxOTU0RkEsIDB4NDYwQjY1RDMsIDB4NTRGOTFCMDEsCisweERBMTY1NUIxLCAweDdDRkM0QTBCLCAweDA2RkRFMDMwLCAweDBGNjU3NjA0LAorMHg2MjZENTVGNywgMHg4QkRBMzI1MywgMHhBMDA0ODRGNCwgMHhENDI1MkUwMCwKKzB4NDIwQkQyMEUsIDB4N0YzODY1RDIsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDY5RjYwMDBCLCAweEU2MDA2MTYzLCAweDQxMDlBMDA0LAorMHg3NjAxNjI1NiwgMHg3NDA0MjQyMiwgMHg4QkY5MzYxMiwgMHgwMDA5MDAwQiwKKzB4MDAxMTc4MDAsIDB4MDAxMTVGRjAsIDB4MDAxMTY0RjYsIDB4MDAxMTRGMkMsCisweDAwMTE2NUMwLCAweDAwMTE2NEY1LCAweDAwMTE2MTFDLCAweDAwMTE3ODA0LAorMHgwMDExNjVFMCwgMHgwMDExNEVCRSwgMHgwMDExNEYwMiwgMHgwMDExNjVGNCwKKzB4MDAxMTY1RkMsIDB4MDAxMTY2MDAsIDB4MDAxMTRCRjAsIDB4MDAxMTQ4RkMsCisweDAwMTE2NjE4LCAweDAwMTE2NjM0LCAweDAwMTE2NjQwLCAweDAwMTE0RTU2LAorMHgwMDExNjY0QywgMHgwMDExNjY1OCwgMHgwMDExNjY3QywgMHgwMDExNjY3MCwKKzB4MDAxMTRCQzQsIDB4MDAxMTY2ODgsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3RkQ4LCAweDY0NTNFMTEwLAorMHg2QzUzNDEyOCwgMHg2NTVERUUwQSwgMHg0NjA4NjY1MywgMHg0NjA4MzY1QywKKzB4MzYxQzc1MDEsIDB4Njc1RDYwNDMsIDB4NjBDMzBGNjYsIDB4MzdFM0VEMDAsCisweDgxNjEyNkMxLCAweDgxNjM4MTYyLCAweDE2RDMxNkQyLCAweDhGRUExNkQ0LAorMHg2OEYyNzQwNCwgMHhEQUIzRDlCMiwgMHgyOTgyMTk4MSwgMHhEMUIyNTlGMSwKKzB4MkE5MjFBOTEsIDB4NUJGMzVBRjIsIDB4NUVGNTVERjQsIDB4MTFBMTU0RjYsCisweDExQjMyMUEyLCAweDExRDUxMUIyLCAweDExRTcxMUQ0LCAweDExNDkxMUU2LAorMHg1NUY3MTE0OCwgMHhFRTAwREJBOSwgMHhEREE5NTdGOCwgMHhENkE5NTJGOSwKKzB4MUI1MTY0RTMsIDB4REJBODJCNTIsIDB4RUFCOEQ4QTgsIDB4MkQ3MkU5NDUsCisweDZBQUMyNjIyLCAweDZFRUQ0OTA4LCAweDREMDg2REUzLCAweDNERUM2MUUzLAorMHg0RDA4NDEwOCwgMHgzREJDMzFFQywgMHg0MTA4NjBDMywgMHg4MUQxMkRDMSwKKzB4NDEwOEUwNTAsIDB4NDEwODQwMDgsIDB4NjBDMzgxRDIsIDB4RTUwMDMxOEMsCisweDgxRDMzNEEyLCAweDFEMTMxREQyLCAweDhEMDFENDk0LCAweEQ0OTExRDU0LAorMHhCMDgxNjVEMywgMHg2NEVEN0UwMSwgMHg4QkRDMzQ5MiwgMHhEQjk0RDE4RCwKKzB4RDI4QjY4MTIsIDB4MUI4MTQ4MjksIDB4MkZEMjY0MTIsIDB4MkI5MjY5NEQsCisweEQ5OEE2NzIyLCAweDFCNzM0NzI5LCAweEQ3ODc2ODIyLCAweDFCQTI2QThELAorMHhEMjhDNkI3MiwgMHgyMkIyRDU4NiwgMHhFMDAzNUQ3MiwgMHg1RTc0MTJEMiwKKzB4MTJFNDQwMTgsIDB4RDY4ODUxNzYsIDB4NTQ3ODEyMTYsIDB4MTI0OEUxRkYsCisweEQ0ODU2NzkyLCAweDY4NTIxMjdBLCAweDI4QzFFNzAzLCAweDgxOTE2OTUyLAorMHg2QTUyRTA1MCwgMHg4MUEyNDAwOCwgMHg2MEMzNkI1MiwgMHg2RDUyODFCMywKKzB4NkU1MjFERDIsIDB4NjI1MjFFNjMsIDB4MTI2NEU2MDAsIDB4NDYwODY1NjMsCisweDc1MDEzNjRDLCAweDY2NUQyNjEyLCAweDhCRjgzNjczLCAweEUwMDNENDcxLAorMHg0MDE4NjU0MiwgMHg2NzQyMjVDMSwgMHg4MTcxRDI3NCwgMHhFRTAwNjg0MiwKKzB4Njk0MjE4ODIsIDB4MTkyM0UwMjQsIDB4RTU4MDZBNDIsIDB4NkI0MjFBRTQsCisweDgxQjI2NkUzLCAweEQ0NkQ2QzQyLCAweDY1NUM4MUMzLCAweDZENjM2NjZELAorMHg2MTZENzYwNCwgMHgzMTUzM0Q0QywgMHgyREUyOEZGOCwgMHhENTY5RDI2OCwKKzB4NzQwNDI0MjIsIDB4N0YyODI0NTIsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDY2NDI2OEY2LCAweEM4MDM2MDYxLAorMHhFNTAwOEQwNCwgMHhDOTAzNjA2MSwgMHg4QjAzODgwMiwgMHg2NTYzNTI2MiwKKzB4MjQxMjUxMjQsIDB4NjA1MzAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsCisweDYyNTM2RTUzLCAweDZENDNFNTUwLCAweDQ1MDhFNDAwLCAweEUxMDFBMDAxLAorMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwgMHg2MDUzODEyMywgMHg1NkUyODEyMiwKKzB4OEJGNTM2MjAsIDB4MTZFNEQyNTAsIDB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsCisweEU0RkM2NUUxLCAweDJFNTEyNTQ5LCAweDY1RjM2MUYxLCAweDJGMTEyMTQ5LAorMHhEMTQ5NTREMSwgMHhFNjE0NDEwQiwgMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwKKzB4N0YxNDFERTEsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsCisweDdGRUM0RjIyLCAweDY2NTM2RTUzLCAweDZENDNFNUZDLCAweDIwNTk2MDYxLAorMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwgMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwKKzB4NTJEMThCMDQsIDB4MUUyMkEwMDIsIDB4NTY2NEFGRjAsIDB4NjRGM0QyMzYsCisweDQyMEJFNjE0LCAweDY3RTE2NUUzLCAweDI3MTlFMUZDLCAweDY3RjEyRTcxLAorMHgyNzE5NTREMSwgMHg2NUYzRDEzMCwgMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwKKzB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsIDB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsCisweDJGRTY2REY2LCAweDYyNEM0RjIyLCAweDQyMDhERTFCLCAweEEwMDU0MjAwLAorMHg1MjUyM0UyQywgMHg1NjI0RDQxNywgMHgyRTYyQkY4RSwgMHg1MkUxNjVFMiwKKzB4OEJGNjM1MjAsIDB4MjYyMkQ2MUIsIDB4MDAwQjRGMjYsIDB4MkZCNjZFRjYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweERCMUNEQzEwLCAweDY2QzI1MkMxLAorMHg4OTQwMzYyMCwgMHhDOTAzNjA2MSwgMHg4OTNDODgwMSwgMHhERDE4REUwQiwKKzB4NjRFM0JGNjMsIDB4ODUwMzY1MDMsIDB4NjIwRDY2QjIsIDB4ODkyQjMyNjIsCisweEJGOUJENDAzLCAweEQ0MTMwMDA5LCAweDAwMDk0RDBCLCAweDAwMDlBRkU2LAorMHgwMDExNjBEQywgMHgwMDExNjBFNCwgMHgwMDExNjBFQywgMHgwMDExNjExNCwKKzB4MDAxMTY0RjgsIDB4MDAxMTY1MDAsIDB4MDAxMDAwQzgsIDB4MDAxMDE2ODAsCisweDAwMUUyMTA4LCAweDAwMUMzRDAwLCAweDAwMTE3ODgwLCAweDAwMTE3NzgwLAorMHgwMDA0MDAyMCwgMHgwMDI2QzQwMSwgMHgwMDExNDJGOCwgMHgwMDExNjREQywKKzB4MDAxMTRFQkUsIDB4MDAxMTY2OUMsIDB4NjRFM0JGM0UsIDB4NEQwQkQ0MDYsCisweEFGQkIwMDA5LCAweEQyMDUwMDA5LCAweDRGMjYyMjYyLCAweDZERjY2RUY2LAorMHgwMDBCNkNGNiwgMHgwMDAwNkJGNiwgMHgwMDExNjZBMCwgMHgwMDFDM0QyOCwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEQyM0M3RkZDLCAweEM4MDM2MDIyLCAweDJGMDE4RjNELCAweDAwMDlBMDYxLAorMHhDOTAzNjA2MSwgMHg4OTNCODgwMSwgMHhEMjM4RDgzNywgMHg0MjBCRDkzOCwKKzB4RTQwMDY0ODMsIDB4NkEwMzZEMDMsIDB4NUMwMjQ5MEIsIDB4RDIzNkRCMzUsCisweDU2RDM4NUQyLCAweDY1MEQ2NDIyLCAweDRCMEJFNzQwLCAweEQxMzI2RTAzLAorMHg2NDEyNkVFRCwgMHgyMTQyMzRFQywgMHgzREMwNURENCwgMHg4NUQyOEJFRiwKKzB4NzBGRjU2RDMsIDB4RTc0MDY1MEQsIDB4NkMwMzRCMEIsIDB4NDkwQkRCMkEsCisweDY2QjJFNDAzLCAweDM2Q0M2Q0NELCAweEU3MDBEOTI4LCAweDJCNjJFNUM4LAorMHg2NDczRTY1MCwgMHg0OTBCREMyNiwgMHg2NDgzNjU1QywgMHg2NUEzNEMwQiwKKzB4RUUwMUQxMjQsIDB4RDExQzIxRTIsIDB4NjYxMjUyMTEsIDB4OEJCRjM2MjAsCisweEREMjJERTIxLCAweERDMjNEQjIyLCAweDY1RDI1MkQxLCAweDg5MTgzNTIwLAorMHhDOTAzNjA1MSwgMHg4OTE0ODgwMSwgMHhEMTE0RDQxQywgMHgwMDA5NDEwQiwKKzB4MzZFMDU2MDMsIDB4NjUwMzhGMDQsIDB4MkIyMEUyMDEsIDB4MkM1MkFGRUMsCisweEQyMTNENDE5LCAweDAwMDk0MjBCLCAweEUxMDFENjE4LCAweEFGRTM0MTE4LAorMHg2MEYxMjYxMiwgMHg4OTAyQzgwNCwgMHg0MjBCRDIxNSwgMHg3RjA0MDAwOSwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDAwMDA2OEY2LCAweDAwMUUyMTAwLCAweDAwMTE2MEU0LCAweDAwMTE0NTNBLAorMHgwMDExNEJGMCwgMHgwMDExNEUwQywgMHgwMDExNjcxNCwgMHgwMDExNTlCMCwKKzB4MDAxMTQ1NTgsIDB4MDAxRTIxMkMsIDB4MDAxMTc4ODAsIDB4MDAxMTYwREMsCisweDAwMTE2NEZDLCAweDAwMTE2NEY4LCAweDAwMTE2MTE0LCAweDAwMUMzRDMwLAorMHgwMDExNDBDQywgMHhENkMyRDVDMSwgMHgyNjIyNjI1MiwgMHhDODAxNjA2MCwKKzB4MDAwQjhCRkEsIDB4MkZFNjAwMDksIDB4QkZGMzRGMjIsIDB4RDJCRDAwMDksCisweEU0MDVFMTAwLCAweDIyNDAyMjEyLCAweDY0MjJERUI4LCAweEU3MDBENUI4LAorMHgyNTcyMUU0MiwgMHhDOThGODQ1MSwgMHhDOUYwQ0IxMCwgMHg4MDUxQ0IwMiwKKzB4Q0IwMjYwNTAsIDB4NjI1MjI1MDAsIDB4MkUyMkJGREMsIDB4RDZCMjUwRTQsCisweDRGMjYyNjAyLCAweDZFRjYwMDBCLCAweDRGMjIyRkQ2LCAweDAwMDlCRkRCLAorMHg2MjBDRERBRSwgMHg2MEQwMkQyMiwgMHg4OTA2QzgwMSwgMHgwMDA5QkZEMywKKzB4MkQyMjYyMEMsIDB4QzgwMTYwRDAsIDB4NEYyNjhCRjgsIDB4NkRGNjAwMEIsCisweDRGMjIyRkU2LCAweDZFNDNCRkU4LCAweEUxMDBEMkEyLCAweDIyRTAyMjEyLAorMHg2NDIyRDU5RSwgMHhFNjAwREU5RSwgMHgyRTYyMTU0MiwgMHhDOUYwODRFMSwKKzB4ODBFMUNCMDEsIDB4Q0IwMjYwRTAsIDB4NjdFMjJFMDAsIDB4NEYyNjI1NzIsCisweDZFRjZBRkE4LCAweEU0MDZBRkU0LCAweEU0MDRBRkUyLCAweEJGRjk0RjIyLAorMHhFNEM3MDAwOSwgMHg2NDRDQkZEQywgMHg0RjI2QUZGNiwgMHhFNDA2QUZEOCwKKzB4RTQwNEFGRDYsIDB4NEYyMjJGRTYsIDB4NkU0M0JGRjgsIDB4RDU4REQyOEQsCisweEU0MDFFMTAwLCAweDIyMTI2MEUzLCAweDgwNTEyMjQwLCAweDY2MjJEMTg3LAorMHhFNzAwREU4NywgMHgyRTcyMTE2MiwgMHhDOUYwODRFMSwgMHg4MEUxQ0IwMiwKKzB4Q0IwMjYwRTAsIDB4NjJFMjJFMDAsIDB4MjEyMkJGN0MsIDB4QUZERjRGMjYsCisweDJGRDY2RUY2LCAweDRGMjIyRkU2LCAweEJGQ0I2RDUzLCAweEJGOUI2RTQzLAorMHhEMjdDMDAwOSwgMHgyMkUwNjFEMywgMHg2MDIyREU3RCwgMHg0MTE4MjFFOSwKKzB4MjAxQkM5RkYsIDB4MjIwMkQ1NzcsIDB4RDY3Njg0NTMsIDB4NjBEMzgwNTEsCisweEQ0NzI4MDUzLCAweEQxNzI2NzYyLCAweDE0NzJFRDAwLCAweDg0MTEyMUQyLAorMHhDQjA0QzlGMCwgMHg2MDEwODAxMSwgMHgyMTAwQ0IwMiwgMHhCRjUxNjIxMiwKKzB4NEYyNjI0MjIsIDB4QUZBNzZFRjYsIDB4NjU0MzZERjYsIDB4QUZEMEU0RDgsCisweDY1NDM2NDRDLCAweEFGQ0NFNEQ4LCAweDJGQzY2NDRDLCAweDJGRTYyRkQ2LAorMHg2RTUzNEYyMiwgMHhCRjY3NkQ0MywgMHhENzYyNkM2MywgMHgyN0QwRDI2NCwKKzB4NjFFMzYwNzIsIDB4NDExODIxMjksIDB4MjAxQkM5RkYsIDB4MjcwMkQ0NUQsCisweEQxNUI4NDQzLCAweDYwRTM4MDQxLCAweERFNTg4MDQzLCAweEU2MDA2NDcyLAorMHgyMTYyMUU0MiwgMHg2NURDODQxMSwgMHg2MEMzNjIwMywgMHg0MDA4QzkwNywKKzB4NjcwMzQwMDgsIDB4RTI5RjYwMjMsIDB4NjIyQ0M5OEYsIDB4MzUyMDIwN0IsCisweDgwMTE4RDE4LCAweDdDMDQ4NDExLCAweDYwQzM2NjAzLCAweDYyMDNDOTBGLAorMHhDOUYwNjA2MywgMHg4MDExMjAyQiwgMHg4ODBCNjA1MywgMHg4NDExOEIxNCwKKzB4QzkwRjY2MDMsIDB4QzkwRjcwMDEsIDB4NjA2MzYyMDMsIDB4MjAyQkM5RjAsCisweDgwMTFBMDBBLCAweDdDMDE4NDExLCAweDYwQzM2NjAzLCAweDYyMDNDOTBGLAorMHhDOUYwNjA2MywgMHg4MDExMjAyQiwgMHhDQjAyNjAxMCwgMHg2MjEyMjEwMCwKKzB4MkUyMkJFRjAsIDB4RDYzQzUwRTQsIDB4NEYyNjI2MDIsIDB4NkRGNjZFRjYsCisweDZDRjYwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDZDNjM0RjIyLAorMHg2RTQzNkQ1MywgMHg2QjczQkYzNiwgMHgwMDA5QkYwNiwgMHg2MUQzRDIzMSwKKzB4REUzMzIyRTAsIDB4MjFFOTYwMjIsIDB4QzlGRjQxMTgsIDB4RDQyRDIwMUIsCisweDg0NDMyMjAyLCAweDgwNDFENzJGLCAweDgwNDM2MEQzLCAweDY2MjJENDI3LAorMHgxNDYyRDEyNywgMHgxNEMzMjdDMiwgMHgyMUMyRUMwMCwgMHg3QjA0ODQxMSwKKzB4NjBCMzZEMDMsIDB4NjUwM0M5MEYsIDB4QzlGMDYwRDMsIDB4ODAxMTIwNUIsCisweENCMDI2MDEwLCAweDYyMTIyMTAwLCAweDRGMjYyNDIyLCAweDZERjY2RUY2LAorMHhBRUFGNkNGNiwgMHgyRkI2NkJGNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NkM1MzZENjMsIDB4QkVGRDZFNDMsIDB4QkVDRDZCNzMsIDB4RDIxNTAwMDksCisweDIyRTA2MUMzLCAweDYwMjJERTE2LCAweDQxMTgyMUU5LCAweDIwMUJDOUZGLAorMHgyMjAyRDExMCwgMHhENjBGODQxMywgMHg2MEMzODAxMSwgMHhERTBCODAxMywKKzB4RDQwQjY3NjIsIDB4RUMwMDZCQkQsIDB4MUVCNTFFNzIsIDB4ODQ0MTI0QzIsCisweEM5RjA0QjIxLCAweDgwNDFDQjA0LCAweEUxNDA2MDQwLCAweDI0MDBDQjA2LAorMHhFNTAwNjI0MiwgMHg0QjIxMkUyMiwgMHg0MTI4QTAxNCwgMHgwMDFEMTIwMCwKKzB4MDAxMTY1MjgsIDB4MDAxMTY1MzAsIDB4MDAxMTY1MzgsIDB4MDAxMTY1NDQsCisweDAwRkZGRkZGLCAweDAwMTE2NTM0LCAweDYwNTM2NTVELCAweDA2REU0MDA4LAorMHgyMTYyNzUwMSwgMHgzMkIzNjI1RCwgMHg0RjI2OEJGNiwgMHg2REY2NkVGNiwKKzB4QUU1RjZDRjYsIDB4NEYyMjZCRjYsIDB4QkY3MzY3N0MsIDB4QUVCMzY0NEMsCisweDRGMjI0RjI2LCAweEJGQTY2NzdELCAweEFFQUQ2NDRDLCAweDRGMjI0RjI2LAorMHhFNTAwRTQ5RiwgMHhCRjA4RTYwMywgMHg0RjI2NjQ0QywgMHg2MDBDMDAwQiwKKzB4RTQ5RjRGMjIsIDB4RTYwM0U1MDAsIDB4NjQ0Q0JFRkYsIDB4NEYyNjQwMTksCisweDYwMEQwMDBCLCAweDY1NDM2NjVDLCAweEU0MDNBRUY3LCAweDY1NDM2NjVDLAorMHhFNDBCQUVGMywgMHhEMTc1RDY3NCwgMHg2MDQzNjI2MiwgMHhDODAxMjEyMiwKKzB4OEYwMTYwMTAsIDB4QzlFRkNCMTAsIDB4NjIxMjIxMDAsIDB4MjYyMjAwMEIsCisweDRGMjIyRkU2LCAweEUwMDA0RjEzLCAweEJFMkM0MDFFLCAweEQ1NkM2RTQzLAorMHgyNTIyNjIwQywgMHhFNDAxQkZFNiwgMHg2MDYzRDY2OSwgMHg2MEVDQ0Y4MCwKKzB4ODkwNzIwMDgsIDB4ODkwOTg4MDEsIDB4ODkwRDg4MDIsIDB4ODkxMTg4MDMsCisweDAwMDlBMDEzLCAweEM5RTM2MDYwLCAweDI2MDBBMDBGLCAweENCMTA2MDYwLAorMHhDQjA0QzlGNywgMHgyNjAwQTAwOSwgMHhDQjEwNjA2MCwgMHhDQjA4QzlGQiwKKzB4MjYwMEEwMDMsIDB4Q0IxQzYwNjAsIDB4RDU1OTI2MDAsIDB4QkU2MTYyNTIsCisweEU0MDA2NDJDLCAweDRGMjY0RjE3LCAweDZFRjZBRkJDLCAweDJGOTYyRjg2LAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2MEMzNkM3QywKKzB4NkE2Mzg4MDIsIDB4Njk1MzhGMDksIDB4NjU0MzYyOTAsIDB4NjYyQ0U0QUYsCisweEJFRjdFNzAxLCAweEEwMEE2NDRDLCAweDJDQzgwMDA5LCAweDg4MDE4OTAxLAorMHg2NTQzOEIwNSwgMHhFNjAwRTRBRiwgMHhCRUVCRTcwMSwgMHhCREQxNjQ0QywKKzB4RUQwMTAwMDksIDB4REU0M0VCQUYsIDB4RTgwMEEwMkMsIDB4MDAwOUJERjQsCisweDYwQzNEMTQxLCAweDg4MDJFMjAwLCAweEQ1NDAyMTIyLCAweDIxQjA4RDA2LAorMHg4OTA4MkNDOCwgMHg4OTBBODgwMSwgMHgwMDA5QTAwQywgMHgwMDlDNjBEMywKKzB4QTAwN0Q2MzksIDB4RDIzODgwNjEsIDB4QTAwMzYwODMsIDB4RDIzNjgwMjEsCisweDgwMjE2MEQzLCAweEQxMzU2NDEyLCAweDFFNDJFNjAwLCAweDg0NTEyMTYyLAorMHhDOUYwN0QwMSwgMHg4MDUxQ0IwMiwgMHhDQjAyNjA1MCwgMHg2NzEyMjUwMCwKKzB4MkU3MkJEQTAsIDB4OEJEMTNEQTIsIDB4MDAwOUJERjYsIDB4MDAwOUJEQTMsCisweDYyMENENjI3LCAweDRGMjYyNjIyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwgMHhFNzAyQUY5OCwgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4M0YzQzkzMzEsCisweDBGNTY5MDMwLCAweEU4RkY3MEZDLCAweDY4OEMwRjQ2LCAweEU5MDBBMDQ5LAorMHg0MDE4RTAxMCwgMHhFNTA0MDRGRSwgMHhCRjMzMzQ5QywgMHg4OEZGNkE0MywKKzB4OTAxRjg5M0UsIDB4RTExMDBDRkUsIDB4NDExODNDOTgsIDB4OEIwMzNDMTYsCisweDY0QTNCRTFCLCAweDAwMDlBMDMxLCAweDQwMThFMDEwLCAweEVEMDAwQkZFLAorMHhBMDA3M0JDQywgMHg2NEQzNkVGMywgMHhCRjFGMzRCQywgMHgyRTAwRTUwMSwKKzB4N0UwMTdEMDEsIDB4OEJGNjNEQzIsIDB4NjRBM0JFMDcsIDB4QTAxQUVEMDAsCisweEVGRjg2RUYzLCAweDAwMDAxMDA0LCAweDAwMUQxMjA0LCAweDAwMTE2NTJDLAorMHgwMDExNjU0NCwgMHgwMDFEMTIwMCwgMHgwMDExNjUzMCwgMHgwMDExNjUyOCwKKzB4NjY2QzY2RTAsIDB4ODkwNDM2ODAsIDB4MzVCQzY1RDMsIDB4QkU1MUU3MDEsCisweDdEMDFFNDAyLCAweDNEQzI3RTAxLCAweEUxMTA4QkYyLCAweDM5MUM0MTE4LAorMHg5MDU0NzkwNCwgMHgzOTEyMDFGRSwgMHg5MzUxOEJCMiwgMHg0RjI2M0YzQywKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsCisweDY3NkQ2MjUzLCAweDY2MjM2NTQzLCAweEU0MDJBRUMzLCAweDJGQTYyRjk2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg2OTdENEYyMiwgMHg0QTIxNkE5MywKKzB4NEEwODRBMjEsIDB4NkM0MzZENjMsIDB4QTAwODZCNzMsIDB4NjRDMzZFNTMsCisweDY2OTM2NUQzLCAweDZCQkRCRkU0LCAweDNEQUMzQ0JDLCAweDZFRUYzRUI4LAorMHg4QkY0MkVFOCwgMHg0RjI2RTAwMCwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4MDAwQjZBRjYsIDB4MkZBNjY5RjYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweEVDMDA0RjIyLCAweDZCNTM2RUMzLCAweEEwMDY2RDQzLCAweDY0RDNFQTAxLAorMHg2NUEzQkVBOCwgMHg3RDAxM0MwQywgMHgzRUIyN0UwMSwgMHg2MEMzOEJGNywKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4MDAwQjZCRjYsIDB4MTAwNDZBRjYsCisweDAwMDAxMDA4LCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwgMHg2NDRDQkZGMiwKKzB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4RTUwMDZDRjYsCisweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLCAweEFGRTM4QkZBLAorMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywgMHg2MDQzRUUwQSwKKzB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksIDB4RTYzMEU2MzcsCisweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLCAweDAwMEI4MDI4LAorMHg0RjIyNkVGNiwgMHhCRkU0N0ZFQywgMHhCRkQ4NjVGMywgMHg3RjE0NjRGMywKKzB4MDAwQjRGMjYsIDB4NEYyMkUwMDAsIDB4QkZEQTdGRUMsIDB4NjRGMzY1RjMsCisweDc0MDZCRkNELCAweDRGMjY3RjE0LCAweEUwMDAwMDBCLCAweDRGMjIyRkU2LAorMHg2MjUzN0ZFQywgMHg2NUYzNkU0MywgMHg2NDIzQkZDQiwgMHg2NEUzQkZCRiwKKzB4NjRGM0JGQkQsIDB4QkZCQUQ0MDMsIDB4N0YxNDAwMDksIDB4MDAwQjRGMjYsCisweDAwMDA2RUY2LCAweDAwMTE2NkE0LCAweEU0RkREMjlBLCAweEQ3OUE2MTIyLAorMHgyMjEyMjE0OSwgMHg3NDAxNjAyMiwgMHgyMjAyQ0IwMSwgMHhENTk3NjYyMiwKKzB4MjI2MjI2NDksIDB4Qzg0MDYwNzAsIDB4NjA1Mjg5MDIsIDB4MjUwMkNCMDQsCisweEUxRjc2NDUyLCAweDI1NDIyNDE5LCAweEU3MDE2MDUyLCAweDI1MDJDOUNGLAorMHhFNjAyNjA1MiwgMHgyNTAyQ0IwMywgMHgxNTYyNDcxOCwgMHgxNTczMDAwQiwKKzB4RDc4Q0Q1OEIsIDB4RDQ4REQyOEMsIDB4RTYwMEUxMDAsIDB4MjcxMTI1MTEsCisweEFGRDEyMjEwLCAweDY2NEMyNDYxLCAweDQ2MDBEMjg5LCAweDYwNjAzNjJDLAorMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI4NSwgMHg2NjUwMzUyQywKKzB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI4MjY2NEMsIDB4MzYyQzQ2MDAsCisweENCMTA2MDYwLCAweDI2MDAwMDBCLCAweEQyN0U2NTRDLCAweDM1MkM0NTAwLAorMHhFMUVGNjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI3OCwKKzB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsIDB4NDUwMEQyNzQsCisweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLCAweEQyNzE2NjRDLAorMHgzNjJDNDYwMCwgMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjZENjU0QywKKzB4MzUyQzQ1MDAsIDB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjI0QzI1NjAsCisweDQyMDBENjY3LCAweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLAorMHg2MDBDMDAwQiwgMHhENjYzNjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwKKzB4NDAyMTQwMjEsIDB4MDAwQjQwMjEsIDB4RDE1RjYwMEMsIDB4MzQxQzY0NEMsCisweDAwMEI2MjQwLCAweEQxNUQ2MDJDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLAorMHgyRkU2NjAyQywgMHg2RTQzNEYyMiwgMHhFNjBBNjQ1QywgMHg4OTE0MzQ2NywKKzB4MDAwOUJGRUIsIDB4NjBFQzY0MEMsIDB4OEIwMjg4MDEsIDB4QTAwMkUwMEYsCisweDQ0MDkyNDA5LCAweDYyNEM0NDA5LCAweDMyNjNFNjBBLCAweEJGRTI4OTA1LAorMHg2MjBDNjQ0QywgMHhDODgwNjAyMywgMHhFMjAwOEIwMCwgMHg0RjI2NjAyMywKKzB4NkVGNjAwMEIsIDB4RDY0QTRGMjIsIDB4ODgwMTYwNjIsIDB4QjI0NThCMDMsCisweEEwMDMwMDA5LCAweEQyNDcwMDA5LCAweDIyNjBFNjQwLCAweEUyMDBENjQ2LAorMHgwMDBCNEYyNiwgMHg0RjIyMjYyMiwgMHg2MDYyRDY0MSwgMHg4QjAxODgwMiwKKzB4MDAwOUIyOEUsIDB4RTIwMEQ2NDAsIDB4MDAwQjRGMjYsIDB4RDUzQzI2MjIsCisweEUxMDBENDNDLCAweDI1MTJFNzAxLCAweDI0NzAwMDBCLCAweEU2MDREMjM5LAorMHgyMjYwMDAwQiwgMHhENDM5NEYyMiwgMHg0MTBCRDEzOSwgMHhENTM5MDAwOSwKKzB4NjY1MEUxRkQsIDB4MjYxOUQyMzgsIDB4MjU2MEU3MDAsIDB4MDAwQjRGMjYsCisweDRGMjIyMjcwLCAweEQxMzJENDM1LCAweDAwMDk0MTBCLCAweEU3RkJENTMxLAorMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwgMHg0RjIyMjU2MCwgMHhEMTJDRDQzMCwKKzB4MDAwOTQxMEIsIDB4RTdGN0Q1MkIsIDB4MjY3OTY2NTAsIDB4MDAwQjRGMjYsCisweEQ1MjgyNTYwLCAweDYyNTA5NDJELCAweDAwMEIyMjQ5LCAweEQ1MjUyNTIwLAorMHg2MjUwRTRCRiwgMHgwMDBCMjI0OSwgMHg0RjIyMjUyMCwgMHg4NTIyRDIyNSwKKzB4MjAwODYwMEQsIDB4ODgwMTg5MTEsIDB4ODgwMzg5MTMsIDB4ODgwNTg5MTUsCisweDg4MDY4OTQyLCAweDg4MDg4OTQ4LCAweDg4MDk4OTRFLCAweDg4MEE4OTU0LAorMHg4ODBCODk1QSwgMHhBMDY3ODk2MCwgMHhCMDY5MDAwOSwgMHhBMDY0MDAwOSwKKzB4QjA3NzYwMEMsIDB4QTA2MDAwMDksIDB4QjA4MDYwMEMsIDB4QTA1QzAwMDksCisweEZGN0Y2MDBDLCAweDAwMUUyMTQ4LCAweDAwMUUxMDAwLCAweDAwMUUxMTA4LAorMHgwMDExNjU3MCwgMHgwMDExNjU3MiwgMHgwMDExNjU5MSwgMHgwMDExNjU1NCwKKzB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMkYsIDB4MDAxRTEwOTAsCisweDAwMTE2NTc4LCAweDAwMUUxMDBCLCAweDAwMTE2NTc0LCAweDAwMTE2NkE4LAorMHgwMDExNEVCRSwgMHgwMDFFMTAyOCwgMHgwMDExNjU5MCwgMHgwMDExNjZCNCwKKzB4MDAxMTY2QzQsIDB4MDAxMTY1NDgsIDB4NjI2MEQ2ODQsIDB4OEIyQjIyMjgsCisweDAwMDlCMDYxLCAweDYwMENBMDI5LCAweDYyNjBENjgwLCAweDhCMjMyMjI4LAorMHgwMDA5QjA2OSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY3QywgMHg4QjFCMjIyOCwKKzB4MDAwOUIwQzcsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2NzgsIDB4OEIxMzIyMjgsCisweDAwMDlCMENELCAweDYwMENBMDExLCAweDYyNjBENjc0LCAweDhCMEIyMjI4LAorMHgwMDA5QjEyNSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3MCwgMHg4QjAzMjIyOCwKKzB4MDAwOUIxM0QsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsCisweEQyNkNEMTZCLCAweEQ1NkM4NDEyLCAweDQwMDBDOTBGLCAweEQ3NkIwMTJELAorMHhFNDAzRDY2QiwgMHhFMjBGNjExQywgMHgyNTQwRTAwMSwgMHgyNTIwMjcxMiwKKzB4MjYwMjAwMEIsIDB4RTYwMUQyNjIsIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDUsCisweEQ2NjNEMjYwLCAweEUwMDE4MTIyLCAweDAwMEIyNjAyLCAweEQyNUMwMDA5LAorMHg2MDBEODUyMywgMHg4OTA1MjAwOCwgMHg4QjBBODgwMSwgMHg2MDYwRDY1RCwKKzB4MjYwMENCMDEsIDB4RDQ1N0Q2NUEsIDB4RTAwMUUxMDEsIDB4MDAwQjI2MTIsCisweDAwMEI4MTQyLCAweEQxNTJFMDAwLCAweDg1MTNFNTAxLCAweDY0MEQ0NTE4LAorMHg2NjAzMzQ1MywgMHhFMDAwOEQwNSwgMHhENTUxRDI1MywgMHgyMjYwRTAwMSwKKzB4MDAwQjI1MDIsIDB4NEYyMjAwMDksIDB4ODUxM0QxNDksIDB4NjQ1MzY1MEQsCisweDYyNDk0NDE5LCAweDIyN0Q2NzJFLCAweDg4MDE2MDJDLCAweDg4MDI4OTA5LAorMHg4ODAzODkxMCwgMHg4ODA2ODkxQSwgMHg4ODA3ODkzNSwgMHhBMDRDODkzQiwKKzB4RDU0NjAwMDksIDB4NjY1MkQ3NDYsIDB4Mjc2MkQ0NDYsIDB4NjIyQzYyNjEsCisweDI0MjFBMDM4LCAweDIyMjg2MjVDLCAweEQ0NDM4QjNGLCAweDY2NDJENTQwLAorMHgyNTYyRDQ0MCwgMHgyNDAxODU2MSwgMHg2MjAzQTAyQywgMHgyMDA4NjA1QywKKzB4ODgxMDg5MDcsIDB4ODgyMDg5MDgsIDB4ODgzMDg5MDksIDB4QTAyQzg5MEEsCisweEQyM0EwMDA5LCAweDYyMjJBMDA4LCAweEEwMDVEMjM5LCAweEQyMzk2MjIyLAorMHg2MjIyQTAwMiwgMHg2MjYyRDYzOCwgMHhENDMyRDUzMSwgMHg2NjIxMjUyMiwKKzB4QTAwRjYyNkMsIDB4RDYzNTI0MjEsIDB4NjI2MUQ1MkQsIDB4NjIyQ0Q0MkQsCisweEEwMDcyNTYyLCAweEQ2MzIyNDIxLCAweDg1NjFENTI5LCAweDI1NjJENDI5LAorMHg2MjAzMjQwMSwgMHg2NjJEODUxNSwgMHgzNjE3NjEwRCwgMHg2NTAzOEYwMSwKKzB4QjBDQjI0NTEsIDB4QTAwMTAwMDksIDB4RTAwMEUwMDEsIDB4MDAwQjRGMjYsCisweEQ2MTkwMDA5LCAweEQ0MjdFMTAxLCAweDY1NDEyNjEwLCAweEQxMThENzE3LAorMHhFMjBGNjU1RCwgMHgyNzUyRTAwMSwgMHgwMDBCMjYyMCwgMHgyRkU2MjEwMiwKKzB4RDIwRjRGMjIsIDB4NjQwQzg1MjMsIDB4OEIwODI0NDgsIDB4RDUxMUQ2MUQsCisweDI2MjFFMjAwLCAweDk0MEY4NDUxLCAweEEwNDgyMDQ5LCAweERFMEQ4MDUxLAorMHhDODQwNjBFMCwgMHhFMjAxOEQzMiwgMHg4OTQ0MzQyNywgMHhEMjE2RDYxNSwKKzB4MjY0MTQyMEIsIDB4MDAwOUEwMzAsIDB4MDAwMEZGN0YsIDB4MDAxMTY1OTEsCisweDAwMTE2NTQ4LCAweDAwMTE2NTU0LCAweDAwMUUxMTAwLCAweDAwMUUxMDBDLAorMHgwMDExNjU3NCwgMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwgMHgwMDExNjU3QywKKzB4MDAxMTY1NUMsIDB4MDAxMTY1NjAsIDB4MDAxMTY1NjQsIDB4MDAxMTY1ODAsCisweDAwMTE2NTg0LCAweDAwMTE2NTg4LCAweDAwMTE2NThDLCAweDAwMTE2Nzc0LAorMHgwMDExNjc3RSwgMHgwMDExNjU2RSwgMHgwMDExNURDQSwgMHg4OTEyMzQyNywKKzB4RDI5NEQ2OTMsIDB4MjY0MTQyMEIsIDB4Q0I4MDg0RTEsIDB4ODBFMUIwRjUsCisweEQ2OTE2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDYwLCAweEQ2OEYyNjAwLAorMHhBMDAxRTAwMSwgMHhFMDAwMjYwMiwgMHgwMDBCNEYyNiwgMHhENjhDNkVGNiwKKzB4Qzg4MDYwNjAsIDB4RDI4Njg5MTksIDB4ODgwMTYwMjEsIDB4RDI4OThCMTUsCisweDg1MjRFNTAxLCAweDg5MTAzMDU2LCAweEUyMDNEMTg3LCAweDIxMjBENDg3LAorMHhFMDBCNjU0MSwgMHgwNjU2NjU1RCwgMHhFNDBGRDU4NSwgMHgyMTQwRTcwMiwKKzB4RDc3RTI1NzEsIDB4MDAwQkUwMDEsIDB4MDAwQjI3MDIsIDB4MkZFNkUwMDAsCisweERFODA0RjIyLCAweEM4ODA4NEUxLCAweEQ1N0E4OTJDLCAweDIwMDg4NTU0LAorMHg2MTAzOEYyOCwgMHg4NTUzRDc3QywgMHg2NDAzNjY3MiwgMHg4NTY2NjUwQywKKzB4MzUyMDYyMEMsIDB4RDY3OThCMUUsIDB4NjUxQ0Q3NzQsIDB4MjY1MTY0NEMsCisweDYwRTAyNzQxLCAweDg5MDRDODQwLCAweDQyMEJEMjc1LCAweEEwMDMwMDA5LAorMHhEMjY4MDAwOSwgMHgwMDA5NDIwQiwgMHgwMDA5QjA5RiwgMHhFMjAxRDE2NywKKzB4NjBFMDIxMjIsIDB4Q0IwNEQ0NjQsIDB4NjA0MDJFMDAsIDB4MjQwMEM5M0YsCisweDYwMjNBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHhEQTYyMkZFNiwgMHg2NkExRTI0MCwgMHgzNjIyREM1RSwKKzB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsCisweERCNjFENDYwLCAweEU3MDBBMDBGLCAweDc3MDE2MkIyLCAweDcxMDI2MTIzLAorMHg2NjIxMkIxMiwgMHg3MTAyNjIxMywgMHg2MTIxMkIxMiwgMHg2NTFENjY2RCwKKzB4MzU2QzQ1MjgsIDB4NjI3QzI0NTIsIDB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsCisweDhCMTA4ODAzLCAweDYxNzM2N0IyLCAweDJCMTI3MTAyLCAweDcxMDI2RTEzLAorMHgyQjEyNjU3MSwgMHg2NTVENkRFMSwgMHg0MjI4NjJERCwgMHgzMjVDRTEwNywKKzB4QTAwQzJDMTAsIDB4ODgwMjI0MjIsIDB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsCisweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY1NUQ2NTYxLCAweEU2MEYyNDUyLAorMHg2N0ExMkM2MCwgMHg4QjA1Mjc3OCwgMHhERDM4REM0NCwgMHhFQjAxRUEwMCwKKzB4MkRCMjJDQTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsCisweDJGRTYyRkQ2LCAweEUyNDBERDM2LCAweDM2MjI2NkQxLCAweDYyNjM4OTAwLAorMHgzNjc4NjcyQywgMHg3NzAzREUzOCwgMHg0NzIxMkQ2MSwgMHg2NEUyRDYzNSwKKzB4QTAwRTQ3MjEsIDB4NjU2MkUxMDAsIDB4NjI1MzcxMDEsIDB4NzQwMTI0NTAsCisweDI0MjA0MjE5LCAweDQ1Mjk3NDAxLCAweDc0MDEyNDUwLCAweDI0NTA0NTE5LAorMHg2MjFDNzQwMSwgMHg4QkVFMzI3MywgMHg2NkUyNDIwMCwgMHg0MjAwNjFEMSwKKzB4MjExODM2MkMsIDB4MkU2MjhGMDYsIDB4REQxQ0Q3MjgsIDB4RTUwMUU0MDAsCisweDJENTIyNzQyLCAweDAwMEI2RUY2LCAweDJGRDY2REY2LCAweDRGMjIyRkU2LAorMHhFRDBBRUUwMSwgMHg2NEUzQkM5NywgMHhCQzlDNjRFMywgMHg2MkVDN0UwMSwKKzB4OEJGNzMyRDcsIDB4QkM5RkVFMDEsIDB4NjRFMzY0RTMsIDB4N0UwMUJDQTQsCisweDMyRDc2MkVDLCAweDRGMjY4QkY3LCAweDAwMEI2RUY2LCAweEQxMTg2REY2LAorMHhENDE4OTIwRCwgMHg3MjEyMjEyMiwgMHgyNDIyRDYxNywgMHhENzE3NzIwNCwKKzB4NzIyMDI2MjIsIDB4MjcyMkQxMTYsIDB4MDAwQjcyMzAsIDB4MTM3QTIxMjIsCisweDAwMTE2NTZFLCAweDAwMTE1RUQ2LCAweDAwMUUxMDE1LCAweDAwMTE2NTc0LAorMHgwMDFFMTAwMSwgMHgwMDExNjU0OCwgMHgwMDFFMTEwMCwgMHgwMDExNjU3MiwKKzB4MDAxMTY1NjAsIDB4MDAxRTEwMDAsIDB4MDAxMTY1NjQsIDB4MDAxMTY1NzAsCisweDAwMTE1RENBLCAweDAwMUUxMDBDLCAweDAwMTE2NTVDLCAweDAwMTE2NTc4LAorMHgwMDExNjU3QywgMHgwMDExNjU4MCwgMHgwMDExNjU4NCwgMHgwMDExNjU4OCwKKzB4MDAxMTY1OEMsIDB4NEYyMjJGRTYsIDB4RDY1MDdGRkMsIDB4ODgwMTYwNjAsCisweEUyMDE4OTUxLCAweDI2MjBCRkJCLCAweEQ1NEVEMTRELCAweERFNEU2MDEwLAorMHg2NEUzNjU1MiwgMHg3NDAyQzg0MCwgMHg4RDIyRDE0QywgMHhEMjRDNzUwMiwKKzB4RTYwMUQ3NEMsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsCisweDhGRjkzMjczLCAweEQ0NDM3NDAyLCAweDYyNDJFNjAxLCAweDY0MEQ4NTI4LAorMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywgMHhFNDE3RDU0MiwKKzB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsIDB4QTAyMDcxMDIsCisweEQyM0UwMDA5LCAweEU2MDFENzNCLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LAorMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDMyNzQwMiwgMHg2MjQyRTYwMSwKKzB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsCisweEU0MTdENTMzLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLAorMHg5MjRBNzEwMiwgMHhEMjI2MkUyMSwgMHg1RTIzRDcyRSwgMHg2NEYyMkZFMiwKKzB4NjA0MzY1RjIsIDB4MjcwMEM5ODAsIDB4Qzk2MDYwNDMsIDB4ODA3MTYxMDMsCisweEM5MDM2MDQzLCAweDgwNzI0NTE5LCAweDY1RjI2MDVDLCAweDgxNzI2NkYyLAorMHg0NjE5NDYyOSwgMHg2MDZDNDUyOSwgMHg0MDE4NjQ1QywgMHg4MTczMzA0QywKKzB4MjExODVFMjMsIDB4NjRGMjJGRTIsIDB4NkU0QzYyRjIsIDB4NjAyQzQyMTksCisweDY2RjI2MkYyLCAweDQ2Mjk0MDE4LCAweDQ2MTkzMEVDLCAweDQyMjk4MTc0LAorMHg2NTJDNjA2QywgMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywgMHgwMDA5QkM5RCwKKzB4MjIyODYyMEMsIDB4QTAwQTg5MDgsIDB4NjAxMzAwMDksIDB4OEIwMzg4NDAsCisweDAwMDlCMDA5LCAweDAwMDlBMDAzLCAweEUyMDJENjBGLCAweDdGMDQyNjIyLAorMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwgMHgwNjBBMDAwOSwgMHgwMDExNjU5MCwKKzB4MDAxRTEwMDAsIDB4MDAxMTY1N0MsIDB4MDAxMTY3NzQsIDB4MDAxMTY3ODAsCisweDAwMTE2NzE4LCAweDAwMTE2NTY0LCAweDAwMTE2NzQ4LCAweDAwMTE2NzQ2LAorMHgwMDExNjcxQSwgMHgwMDExNjU0OCwgMHgwMDExNjU3NCwgMHg0RjIyMkZFNiwKKzB4ODRFOURFOEUsIDB4MjQ0ODY0MEMsIDB4QjE4Qjg5MDEsIDB4RDI4QzAwMDksCisweDI2Njg2NjIwLCAweDYwRTA4OTAyLCAweDJFMDBDOUJGLCAweDAwMEI0RjI2LAorMHgwMDBCNkVGNiwgMHgyRkU2MDAwOSwgMHhERTg2NEYyMiwgMHg2MEUwRDY4NiwKKzB4Q0JDMEQ0ODYsIDB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsCisweDcwMDE0MDIxLCAweDY2MDNBMDAyLCAweDY2MDM0MDA5LCAweEQ2ODA2MTZELAorMHhFNTAwQTAwNCwgMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwKKzB4RDI3QzhCRjgsIDB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsIDB4NEYyNjgwRTIsCisweDZFRjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweDYyNjBENjc2LAorMHg4OTQwMjIyOCwgMHhENTZERTEwMCwgMHg2MDUwMjYxMCwgMHhDQjQwRDQ3MywKKzB4MjUwMDQ0MEIsIDB4OEQwNTIwMDgsIDB4NjJFMDZFMDMsIDB4NzEwNDYxMkMsCisweDJGMTFBMDA2LCAweEQ0NkVENjY2LCAweERENkU2NzYwLCAweDY1N0M0RDBCLAorMHhFMjNDNkQxRCwgMHg4QjAzM0QyNywgMHhEMjZDRDQ2QiwgMHgwMDA5NDIwQiwKKzB4NEQyMTREMjEsIDB4QTAwNUQ3NkEsIDB4NjZFNkU0MDAsIDB4MzU3QzQ1MDgsCisweDc0MDEyNTYyLCAweDM1RDM2NTRELCAweEQ3NjY4QkY3LCAweDZFNzJFMDAzLAorMHg4MUUxNDAxOCwgMHg2RTcyNjBGMSwgMHg4MUUyNzAwQywgMHhENDYyNjE3MiwKKzB4REQ2MjgxMTMsIDB4NjU3MjREMEIsIDB4RDY1MkQyNjEsIDB4MjIxMkUxMDEsCisweEM5M0Y2MDYwLCAweDdGMDQyNjAwLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEMjVBNEYyMiwgMHg2QjQzNkU3MywKKzB4NDIwQjZDNTMsIDB4MjAwODZENjMsIDB4NjEwMzhGMDgsIDB4RDI0RkQ0NTYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDIxQjA2MEMzLAorMHg2MEQzODAxMSwgMHhFNTAwODExMSwgMHg2NEJDQTAwNywgMHg2MDUzNjU1RCwKKzB4NjY1MzAwRUMsIDB4NzUwMTM2MUMsIDB4NjI1RDgwNjQsIDB4OEJGNTMyNDMsCisweDYwNjBENjM2LCAweDI2MDBDOUJGLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHg3RkM0NEYyMiwgMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwKKzB4NDUyOTcyMDIsIDB4NjA2MzIyNTEsIDB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsCisweDY1NUM2NjZDLCAweEU0MDhCRkJDLCAweDRGMjY3RjNDLCAweDAwMDkwMDBCLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RTEwMDdGQzQsIDB4NjUxM0VDRkYsIDB4NkIxMzZDQ0QsIDB4REUzNEQ3MzMsCisweEVERkY2NEYzLCAweEQ4MzNFQTA0LCAweDYwNTM2NTVDLCAweDAyN0Q0MDAwLAorMHgzMkMwNjIyRCwgMHg2NjAzOEQwRCwgMHgwOUVENjA2MywgMHgyNDkxMDI3RCwKKzB4MjQyMTc0MDIsIDB4Njk4MjAyRUQsIDB4MzkyODYyMkQsIDB4NzQwMjI4OTIsCisweDc1MDE3MTA0LCAweDYwNjM2MjVDLCAweDA3RDUzMkEyLCAweDBFQjU4RkU0LAorMHgyNDQ4NjQxQywgMHhFNjgwODkwNSwgMHg2N0YzRTVDNSwgMHhCRjdGNjY2QywKKzB4N0YzQzY1NUMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweEQxMUM2OEY2LCAweDYwMTJEMjFDLCAweENCMjBFNDA1LAorMHgyMTAyRTUwMCwgMHgwMDBCMjI0MiwgMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywKKzB4MDAxMTY0RjYsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsCisweDAwMUUxMEZDLCAweDAwMTE0MENDLCAweDAwMTE2NEZDLCAweDAwMTE2MDJFLAorMHgwMDExNjZEMCwgMHgwMDExNEYyQywgMHgwMDExNjZFQywgMHgwMDExNEVCRSwKKzB4MDAxMTc4OEMsIDB4MDAxMTY0RjgsIDB4MDAxMTYwREMsIDB4MDAxMTQ1QkMsCisweDAwMUUyMTMwLCAweDAwMTE1RkYwLCAweDAwMTE2NkY0LCAweDAwMTE2NTEwLAorMHgwMDExNjUxOCwgMHgwMDExNjcxMCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwKKzB4RDU2NUQxNjQsIDB4RTQwMEQ3NjUsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsCisweEQ1NjMyNzIyLCAweDk2NjlENzYzLCAweDE1NDEyNTcyLCAweDk2NjYxNTYyLAorMHhFNjAxMTU2NSwgMHhENTYwMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsCisweDY3NjMyNTcyLCAweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LAorMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LAorMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhDODIwNjA0MywKKzB4NkU0MzhEMDIsIDB4MDAwOUJFNzUsIDB4QzgxMDYwRTMsIDB4QkU3Mjg5MDEsCisweDYwRTMwMDA5LCAweDg5MDFDODQwLCAweDAwMDlCRTk0LCAweEM4MDE2MEUzLAorMHhERDNFODkzOCwgMHhDODAyNjBEMCwgMHgyRjAwOEQwMywgMHg0NjBCRDYzQywKKzB4NjBGMDAwMDksIDB4ODkwMkM4MDQsIDB4NDYwQkQ2M0EsIDB4NjJGMDAwMDksCisweEM4ODA2MDIzLCAweDYwRDA4OTAyLCAweDJEMDBDOTdGLCAweEM4MDE2MDIzLAorMHhENjM1ODkwNiwgMHgwMDA5NDYwQiwgMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwKKzB4ODkwMkM4MDgsIDB4NDYwQkQ2MzEsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsCisweDQyMEJEMjJGLCAweEQ1MkYwMDA5LCAweDg4MDI2MDUyLCAweEQyMkU4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjJCOEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDYyODg5MkUsIDB4NjBFMzZFNjAsCisweDg5MDJDODgwLCAweDQyMEJEMjI2LCAweDYwRTMwMDA5LCAweDg5MDJDODQwLAorMHg0MjBCRDIyNCwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMiwKKzB4NjBFMzAwMDksIDB4ODkwRUM4MDQsIDB4NDEwQkQxMjAsIDB4QkYxMjAwMDksCisweEJGNEQwMDA5LCAweEQ1MUUwMDA5LCAweDYwNTBENDFFLCAweEM5MDhENzFFLAorMHhCRjg0MjUwMCwgMHg2MEUzMjQ3MiwgMHg4OTA1QzgwOCwgMHg3RjA0RDIxQiwKKzB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsCisweDAwMDA2REY2LCAweDAwMUM1ODFDLCAweEEwMDBBMDAwLCAweDAwMUQwMTAwLAorMHgwMDFENDAwMCwgMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwKKzB4MDAxMTUwQzQsIDB4MDAxMTUwRTYsIDB4MDAxMTU3MjQsIDB4MDAxMTUwRkUsCisweDAwMTE1MTBDLCAweDAwMTE2NTc0LCAweDAwMUUxMDBCLCAweDAwMUUxMDI4LAorMHgwMDExNTE2MiwgMHgwMDExNTE2RSwgMHgwMDExNTExNCwgMHgwMDExNTEzMiwKKzB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsIDB4MTIzNDU2NzgsIDB4MDAxMTUxNEEsCisweDY0NENENkE3LCAweDAwMEIzNDZDLCAweEQ2QTYyNDUwLCAweDM0NkM2NDRDLAorMHgyNDUwMDAwQiwgMHg2NDRDRDZBNCwgMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwKKzB4NDIwODYxNkQsIDB4NDIwODQxMTksIDB4NDIwMDYwMTksIDB4NjcwRTYxNEMsCisweEQ0OUUzMjFDLCAweDQyMDAyMDdELCAweDMyNENDOTBGLCAweDIyMDAwMDBCLAorMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwKKzB4MDAwQjMyNEMsIDB4MkZFNjIyNjAsIDB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsCisweDY3MTAzMTRDLCAweEUyOUY2NjZELCAweDI3Mjk0NjE5LCAweDZFNTM2MjY5LAorMHg2NzJFNjU3MywgMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywKKzB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsCisweDIxNTAyNTdCLCAweDAwMEI0RjE2LCAweDRGMjI2RUY2LCAweEQyODU3RkU4LAorMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywKKzB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsIDB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsCisweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRkE0LCAweEJGQTFFNDAxLAorMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwKKzB4RTQwMTg1RjIsIDB4QkZBQjY1NDMsIDB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsCisweDY2MDNCRkIxLCAweEU0MDI2NUYwLCAweDYwNTM3NTZDLCAweDgwRjhCRjgwLAorMHhCRjgyRTQwMiwgMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwKKzB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsIDB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsCisweDY2MDNFNDAyLCAweEU1MDBCRjhDLCAweEU0MDI4NUY2LCAweEJGOTI2NjAzLAorMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywgMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwKKzB4RTQwRUJGNjMsIDB4MDVGQ0UwMTAsIDB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsCisweEJGNjRFNDAzLCAweEU1MDBFNjQwLCAweEJGNzFFNDAzLCAweEU1MDBFNjQwLAorMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwKKzB4RTQwRjBGNTQsIDB4RTUwNEJGNDksIDB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsCisweEU1MDE3NTg0LCAweEJGNEFFNjQwLCAweEU1MDFFNDA0LCAweEJGNTdFNjQwLAorMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwKKzB4MDAwQjRGMjYsIDB4NEYyMjAwMDksIDB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsCisweEQyNDE4QjcxLCAweDI2Njg2NjIxLCAweEQyNDA4QjZELCAweDI2Njg2NjIxLAorMHhFNTBGOEI2OSwgMHhFNDAxQkYxQywgMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGMUUsIDB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsCisweEJGMUM2NTQzLCAweEU0MDFFNjQwLCAweEJGMjk2NTQzLCAweEU0MDFFNjQwLAorMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywKKzB4RTQwMjgwRjQsIDB4RTUxMkJGMDEsIDB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsCisweEU2NDA2NTAzLCAweEJGMDJFNDAyLCAweEU2NDBFNTAwLCAweEJGMEZFNDAyLAorMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywKKzB4QkVFNUU0MDMsIDB4RTUxMzgwRjgsIDB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsCisweEJFRTc3MDg1LCAweEU1MDA2NTAzLCAweEJFRThFNjQwLCAweEU1MDBFNDAzLAorMHhCRUY1RTY0MCwgMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywKKzB4NjA1MzY1NUMsIDB4QkVDQkU0MDQsIDB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsCisweEU0MEY4NEZDLCAweEJFQ0Q3MDgzLCAweEU1MDE2NTAzLCAweEJFQ0VFNjQwLAorMHhFNTAxRTQwNCwgMHhCRURCRTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwKKzB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksCisweDAwMUUxMDJGLCAweDAwMUUxMDgwLCAweDAwMUUxMDkwLCAweDAwMUUxMDNGLAorMHgwMDFFMTAzRSwgMHgwMDExNjU2RSwgMHgwMDExNjU3MCwgMHgwMDExNjU3MiwKKzB4RDIxREQxMUMsIDB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsCisweEU1MDA4RDEzLCAweDY3MTA2MjEwLCAweDc3MDE2MjJDLCAweDY0MjMyMTcwLAorMHhENjE2NjAxMCwgMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwKKzB4NzIwMUQ1MTMsIDB4NDQwODI2MjAsIDB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsCisweDI1NTg2NTEwLCAweEU2MDA4RDEzLCAweEQ2MERENDBCLCAweDY1NUM2NTQwLAorMHg0NzA4Njc1MywgMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwKKzB4MzY3QzYwNDAsIDB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsCisweDAwMDA2MDYzLCAweDAwMTE2NEY1LCAweDAwMTE2NEY0LCAweDAwMTE2NEY2LAorMHgwMDExNjExQywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsIDB4NTMyMDUzNTUsIDB4NDYyMDQ5NTAsCisweDAwMDAzQTU3LCAweDIwNzQ2MzRGLCAweDMyMjAzMjIwLCAweDIwMzczMDMwLAorMHgzMzNBMzgzMSwgMHgzNjM0M0EzMiwgMHgwMDAwMDAwMCwgMHgwMDAwMEQwQSwKKzB4NDI3MDczNzIsIDB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsCisweDZFNDk2NzdBLCAweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELAorMHg1MjUwNDU0NSwgMHg1NzIwNEQ0RiwgMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywKKzB4MDAzRDcyNjQsIDB4NkM2MTc2MjAsIDB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsCisweDVBMjA1NzQ2LCAweDRENDM1RjRELCAweDRDNDY1RjQ0LCAweDVGNDg1MzQxLAorMHg1MzQxNTI0NSwgMHgwMDBBMEQ0NSwgMHg1QTIwNTc0NiwgMHg0RDQzNUY0RCwKKzB4NEM0NjVGNDQsIDB4NUY0ODUzNDEsIDB4NTM0QjQ4NDMsIDB4MEEwRDRENTUsCisweDAwMDAwMDAwLCAweDJENDk1MDUzLCAweDcyNjQ2NDYxLCAweDAwMDAwMDNELAorMHgyRDQ5NTA1MywgMHg2NzZFNjU2QywgMHgwMDNENjg3NCwgMHgyRDQ5NTA1MywKKzB4NzM2QjY4NjMsIDB4MDAzRDZENzUsIDB4NUEyMDU3NDYsIDB4NEQ0MzVGNEQsCisweDRDNDY1RjQ0LCAweDVGNDg1MzQxLCAweDQ0NDE0NTUyLCAweDAwMDAwQTBELAorMHg2MTIwMjA3MiwgMHgzRDcyNjQ2NCwgMHgwMDAwMDAwMCwgMHg3MjIwMjAyMCwKKzB4NzU0MjcwNzMsIDB4MDAwMDNENjYsIDB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsCisweDZENkQ2RjYzLCAweDNENjQ2RTYxLCAweDAwMDAwMDAwLCAweDAwMDAwMDcyLAorMHgwMDIwNTIyMCwgMHgwMDAwMEQwQSwgMHg2MjczNTU3NiwgMHg3NDczNzI1RiwKKzB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM3NTczNUYsIDB4NjQ2RTY1NzAsCisweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNjU3MjVGLCAweDAwMEEwRDZELAorMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwgMHg0OTY3N0EyMCwKKzB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsIDB4NjU0QzcyNDUsCisweDAwMDAwMDZFLCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LCAweDQ5MjA2ODY3LAorMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAyRTAyMDksIDB4ODAwMDAxMDEsCisweDAwMDQwOUZBLCAweDAwRkYwNDAwLCAweDA1MDcwMDAwLCAweDAyMDAwMjAxLAorMHg4MjA1MDcwMCwgMHgwMDAyMDAwMiwgMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwKKzB4NDAwMjA0MDUsIDB4MDIwOTAwMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsCisweDA0MDAwMDA0LCAweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMDQwLAorMHg0MDAyODIwNSwgMHgwNTA3MDAwMCwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwKKzB4MDAwMDQwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIH07CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNQSVNpemU9MTAxNTY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3UuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzdjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3UuYwpAQCAtMCwwICsxLDEwMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTk0N0ZGQywgMHhFMTE0RDU5NCwKKzB4MUUxM0Q0OTQsIDB4Njc1MjFFNEMsIDB4RDQ5NEQ2OTMsIDB4Mzc0MDI3NjksCisweDYyNTI4RjA2LCAweDcyMDFENjkyLCAweDYwNjAyNTIyLCAweDI2MDBDOTNGLAorMHhENzkwNjE1MiwgMHgyNTEyNjExRCwgMHgyNjRCNjY1MiwgMHgyNTYyNDcwQiwKKzB4MDAwOUIwMTcsIDB4RTYwMDk1QUMsIDB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsCisweDhGRjkzNjUyLCAweEQ0ODg3NjAxLCAweDRFMEJERTg4LCAweEQ0ODgwMDA5LAorMHgwMDA5NEUwQiwgMHg0RTBCRDQ4NywgMHg3RjA0MDAwOSwgMHhBMDUyNEYyNiwKKzB4NEYyMjZFRjYsIDB4NDEwQkQxODQsIDB4RDQ4NDAwMDksIDB4MDAwOTQ0MEIsCisweDQ1MEJENTgzLCAweEQ3ODMwMDA5LCAweEQyODNFMUZGLCAweDI3MTI2MTFELAorMHhENDgyNTAyOSwgMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwKKzB4RTcyMDI0NTIsIDB4NDcxOEQ1N0UsIDB4MjU3MkQyN0UsIDB4RDE3RUU3MDAsCisweEQ2N0ZENDdFLCAweEUyMDEyMjcwLCAweDI0NzAyMTcyLCAweEQ2N0QyNjIwLAorMHgyNjQxRTRGRiwgMHhENTdDRTYwMCwgMHg2NjZERTEwNCwgMHg3NjAxNjA2MywKKzB4NDAwMDYyNkQsIDB4OEZGODMyMTIsIDB4RDU3ODA1NDUsIDB4MjUyMEUyMDEsCisweEQyNzhENzc3LCAweEU0ODBFMTAwLCAweDIyMTIyNzEwLCAweDY2MTNENTc2LAorMHg2NjZENjQ0QywgMHg3NjA0Njc2MywgMHgzNzVDNjI2RCwgMHg4RkY4MzI0MywKKzB4RDU3MjI3MTIsIDB4RDI3M0Q3NzIsIDB4RTQwMEUxMDEsIDB4MjcxMDI1MTEsCisweDAwMEI0RjI2LCAweDdGQ0MyMjQyLCAweEQxNzBENTZGLCAweEQyNzFEQjcwLAorMHgxRjUxRDQ3MSwgMHhENjcxNzUwOCwgMHgxRjEyRDc3MSwgMHgxRjU1NzEwQywKKzB4MUZCOTc1RkMsIDB4NzIwNDFGMkEsIDB4MUYxM0VCMTAsIDB4MUY1NjFGNDQsCisweDFGNzgxRjY3LCAweEQ4NkIxRjJCLCAweERENkNEOTZCLCAweERDNkNFQTAwLAorMHhEMjZEREU2QywgMHg4OTAwM0EyMiwgMHhEMTVEN0EwMSwgMHg4ODAxNjAxMCwKKzB4NTZGODhCMDMsIDB4NDIxOEUyMDEsIDB4RDE2ODI2MjIsIDB4MDAwOTQxMEIsCisweDQ0MEJENDY3LCAweEQ1NjcwMDA5LCAweDAwMDk0NTBCLCAweDYwMTBEMTUwLAorMHg4QjEwODgwMSwgMHhFNjUwRDE0RiwgMHg0NjE4NjIxMiwgMHg4QjA4MzI2NiwKKzB4NTZGOUQxNEIsIDB4MjEyMEUyMDAsIDB4Q0IwMTYwNjIsIDB4MjYwMkEwMDMsCisweDcyMDEyNzEwLCAweDYwODIyMTIyLCAweDg5MDk4ODAxLCAweEUyQzhEMTVBLAorMHg2MjJDNjYxMiwgMHg4OTAzMzYyNiwgMHg2MDEwRDE1OCwgMHg4QkM4ODgwMSwKKzB4NTFGNjY3OTIsIDB4MjE3MjUyRjUsIDB4RDY1NTUxOTEsIDB4NTVGQTIyMTIsCisweDUyRkI2NDYyLCAweDU1NjEyNTQyLCAweDIyNTJFNDAwLCAweDYxNDM2NjQzLAorMHgwNURFNjAxMywgMHgzNkNDNDYwOCwgMHgwN0RFMjY1MiwgMHhDOTAzNjA3MSwKKzB4OEIwMjg4MDEsIDB4NzIwMTYyRTIsIDB4NzQwMTJFMjIsIDB4MzZCMzY2NEMsCisweDcxMDQ4RkVFLCAweDY2QzJEMTQ3LCAweDQ1Mjg2NTEyLCAweDI2NUI0NTE4LAorMHg2MDgyMkM2MiwgMHg4OTAxODgwMSwgMHgwMDA5QTE2OCwgMHg2MjcyRDc0MiwKKzB4OEIxMzIyMjgsIDB4RDQyQkQ3NDEsIDB4Njc3MkQ1NDEsIDB4NTE1MzYyNDIsCisweDMxMkMzMjdDLCAweDI0MjIyMjI4LCAweDE1MTM4RDA1LCAweDYyNjJENjNELAorMHhCMTYyNzIwMSwgMHhENjIzMjYyMiwgMHgyNjIyRTIwMCwgMHg1MjkxNjY5MiwKKzB4OEIwMTM2MjAsIDB4MDAwOUExNDQsIDB4NjA2MUEwNkUsIDB4MDAxQzAwMUMsCisweDAwMUQ0MDIwLCAweDAwMDBCMzhFLCAweEZGRkYwMDAwLCAweDEyMzQwMDAwLAorMHgwMDFFMTAxNSwgMHgwMDIwMTI3NCwgMHgwMDIwMzlGNCwgMHgwMDIwMThBMiwKKzB4MDAyMDNBMDAsIDB4MDAyMDNBMTgsIDB4MDAyMDE4NjAsIDB4MDAyMDE5NkMsCisweDAwMjAxMjg4LCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMzhGNCwgMHgwMDIwMzQ4QywgMHgwMDIwMzhGQywgMHgwMDIwMzkwOCwKKzB4MDAyMDM5MTQsIDB4MDAyMDM5NzAsIDB4MDAyMDM5NzQsIDB4MDAyMDM5MUMsCisweDAwMjAzOTFELCAweDAwMjAzOTIwLCAweDAwMTE3NzAwLCAweDAwMjAzOThDLAorMHgwMDIwMzk4QSwgMHgwMDIwMzRGMCwgMHgwMDExNzcxMCwgMHgwMDFDM0QzMCwKKzB4MDAxQzM2RjgsIDB4MDAxMTc3MzQsIDB4MDAxQzM2ODQsIDB4MDAxQzNEMDAsCisweDAwMUMxMDAwLCAweDAwMUMxMDI4LCAweDAwMjAzNTA0LCAweDAwMjAzOTI0LAorMHgwMDExNzYwMCwgMHgwMDExNzc0MCwgMHg3RkZGRkZGRiwgMHgwMDIwMTczMCwKKzB4MDAyMDMzMkEsIDB4MDAyMDIzMzQsIDB4MDAyMDNEQTQsIDB4MDAyMDM5NzIsCisweDAwMjAzNEZDLCAweDAwMjAzOTY0LCAweDAwMUMzRDJDLCAweDAwMUMzNkIwLAorMHgwMDIwMzQ5NCwgMHgwMDExNzc1QywgMHg4ODAxQzkwRiwgMHhBMENGODkwMSwKKzB4RDE5NjAwMDksIDB4MzYyMDYyMTIsIDB4RDQ5NTg5MDQsIDB4MjQyMUUyMDAsCisweDIxNjJBMENDLCAweDYyMTFEMTkzLCAweDg5MDEyMjI4LCAweDAwMDlBMEMzLAorMHhFMjAyRDc4RiwgMHg3NTAxNjU3MSwgMHgzMTIzNjE1RCwgMHgyNzUxOEQwMiwKKzB4MDAwOUEwQkMsIDB4RDI4QzU3RjIsIDB4NjIyMjYwNzIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhGMTk4ODBBLCAweDUyRjMxRjJDLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODA4QzkwRiwgMHhBMEE3ODkwMSwgMHg2MDYzMDAwOSwKKzB4Q0IwMTU0RjcsIDB4RDI3RTU1RjIsIDB4RTcwMTI0MDIsIDB4RDQ3RkUxMDAsCisweDIyMTEyNTcyLCAweDcyMDE2MjQyLCAweDI0MjJBMDk4LCAweDhCM0Y4ODA1LAorMHg2MDIyNTJGMywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwgMHg4QjE2ODgwMiwKKzB4RTRGRkQ1NzcsIDB4NjQ0RDY3NTIsIDB4OEIxMDI3NDgsIDB4NjI3MkQ3NzUsCisweDhCMEMzMjYwLCAweDUxRjI1NUY3LCAweEQyNkRFNzAxLCAweDIxNzIyNTYyLAorMHhENTcxRTEwMCwgMHg2NDUyMjIxMSwgMHhBMDc3NzQwMSwgMHg1MkYzMjU0MiwKKzB4NDAxOTYwMjIsIDB4NDAwOTQwMDksIDB4ODgwNUM5MEYsIDB4MzFCMzhCNkUsCisweEQyNkE4QjZDLCAweDY3MjI1NEY0LCAweDc3MDFENTY5LCAweDYxNDIyMjcyLAorMHgxRjFDRTY0MCwgMHg0NjE4MjE1OSwgMHg4QjAzMzE2MCwgMHg2MjYyRDY2NSwKKzB4MjYyMjcyMDEsIDB4RTIwMEQ2NUEsIDB4MjYyMUIwNjcsIDB4MDAwOUEwNTYsCisweDMxMjNFMjIwLCAweDg4MDM4QjUyLCAweDUyRjM4QjFFLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODAzQzkwRiwgMHhEMjVCOEIxNiwgMHg2NzIyNTRGNCwKKzB4NzcwMUQ1NTcsIDB4NjE0MjIyNzIsIDB4MUYxQ0U2NDAsIDB4NDYxODIxNTksCisweDhCMDMzMTYwLCAweDYyNjJENjU1LCAweDI2MjI3MjAxLCAweEUyMDBENjQ4LAorMHgyNjIxQjA0MywgMHgwMDA5QTAxMCwgMHhENDUyRDU1MSwgMHhEMjQ0Njc1MiwKKzB4RTEwMDc3MDEsIDB4MjU3MjNBNDYsIDB4MjIxMThGMDYsIDB4RUEwMEQ2NEUsCisweDcyMDE2MjYyLCAweDI2MjJCMDMxLCAweDJGQjJENTRDLCAweDk1NzM2NjUyLAorMHhENDRBNUJGMSwgMHgzNjIwNTI0MSwgMHg2MDYxODkxMCwgMHg4QjAxQzgwMywKKzB4MkIyMkUyMDEsIDB4OEZGNTQ1MTAsIDB4NTdGMTU2NjQsIDB4NjI3MkUxRjAsCisweDQxMjg0MTE4LCAweDI3MjIyMjFCLCAweDZCRjJBMDA4LCAweDZCRjJBMDA2LAorMHhFMjAwRDYyRiwgMHhEMTJGMjYyMSwgMHgyMTIxRTIwMCwgMHhEMTNDRTIwMSwKKzB4NjYxMjI4MjIsIDB4OEIwMTI2NjgsIDB4MDAwOUFFMkIsIDB4NDUwQkQ1MzksCisweEQxMzkwMDA5LCAweEFFMjRFNjAwLCAweDJGODYyMTYwLCAweDJGQTYyRjk2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY0NEYyMiwgMHhERTM0RDEzMywKKzB4NTQxMTYyMTIsIDB4MUY0MTY3RTIsIDB4MkYyMkQ0MzIsIDB4RDUzMjFGNzIsCisweEQyMzI2NzQzLCAweDU4NDE3Nzk0LCAweDY5NDI1QTQyLCAweDVCMTY2QzcyLAorMHg2MDUyNkQyMiwgMHhDQjIwRTYwMCwgMHhFNTQwMjUwMiwgMHg2MjZENzYwMSwKKzB4OEJGQjMyNTMsIDB4NTVGMTYyRjIsIDB4MTE1MTIxMjIsIDB4RDYyODU1RjIsCisweDE0ODEyRTUyLCAweDI0OTIxNEEyLCAweDI3QzJENDI2LCAweDI2RDIxMUI2LAorMHhEQTI1Njc0MiwgMHhFODAxRDkyNSwgMHg0OTBCMkE3MiwgMHhFMjAxMUE4QywKKzB4MUEyQzQyMTgsIDB4NEYyNjdGMEMsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDAwMDAwN0QxLCAweDAwMjAzOTg0LAorMHgwMDIwMzk4OCwgMHgwMDIwMzk4RSwgMHgwMDFDM0RDMCwgMHgwMDExNzcyQywKKzB4MDAxQzNCODgsIDB4MDAyMDM5NkMsIDB4MDAxMTc3M0MsIDB4MDAxMTc3NDQsCisweDAwMDBGMDAwLCAweDAwMTE3NzY0LCAweDAwMTE3NzQ4LCAweDAwMTE3NzY4LAorMHgwMDExNzc2QywgMHgwMUZGRkZGRiwgMHgwMDExNzc0QywgMHgwMDIwMzRGQywKKzB4MDAyMDNEQTQsIDB4MDAyMDI0RjgsIDB4MDAyMDM5NzIsIDB4MDAxQzNCOUMsCisweDAwMUMzRDk4LCAweDAwMUMzNzAwLCAweDAwMUMzNTAwLCAweDAwMUM1OTYwLAorMHgwMDFDODk2MCwgMHgwMDIwMzUwNCwgMHgwMDFDM0QwMCwgMHgwMDIwMTYwQywKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERFOTU3RkFDLCAweDYxRTBFMDE0LCAweDBGMTRENDk0LCAweDcxMDE2MUUzLAorMHhFMDE4NjIxMCwgMHhEMjkyMEYyNCwgMHgwMDA5NDIwQiwgMHg0NTBCRDU5MSwKKzB4MjAwODAwMDksIDB4OEYxMjZEMDMsIDB4RDI4RjFGMDcsIDB4NjcyMEQ0OEYsCisweDY1N0NERDhGLCAweDQ3MEJENzhGLCAweEQxOEYwMDA5LCAweDYxOUM2OTEwLAorMHg0NjA4NjYxMywgMHgzNjE4NDYwOCwgMHgzRDZDNDYwOCwgMHhFMDE4MUZENywKKzB4RTU4MDA0RkMsIDB4NjA0QzY2RTIsIDB4MzA1MDY1NUMsIDB4MkQ2MjhGMTUsCisweDAxRkNFMDE0LCAweERFODVFNTAwLCAweDY0MUNBMDA4LCAweDY3NTM2NTVELAorMHg2MDcwMzdFQywgMHgzOURDNjk1MywgMHg4MDk0NzUwMSwgMHgzMjQzNjI1RCwKKzB4RDY3RjhCRjQsIDB4QTM0RUUyMDAsIDB4MjAwODI2MjEsIDB4RTAxNDhCMTMsCisweEU0MDAwMUZDLCAweEEwMDlERTc5LCAweDY0NEQ2NzFDLCAweDM1RUM2NTQzLAorMHg2OTQzNjY1MiwgMHgzOURDNjI2MiwgMHg3NDA0MTkyMSwgMHgzMjczNjI0RCwKKzB4QTMzODhCRjMsIDB4ODgwMTJEMTAsIDB4RTAxNDhCMTcsIDB4RTcwMDAxRkMsCisweDZEMUMyRDcwLCAweERFNkQxRkQ0LCAweDMyRDM2MjdELCAweEEzMkE4QjAxLAorMHg2NzdEMDAwOSwgMHg2NjczNjVFMywgMHg2MTczNzUwNCwgMHgzMTVDMzZFQywKKzB4NjkxMjY0NjIsIDB4QUZFRjc3MDgsIDB4ODgwNDI0OTIsIDB4RTAxNDhCMTgsCisweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTYwLCAweDhCMDEzMjczLAorMHgwMDA5QTMxMSwgMHg2OTQzNjQ0RCwgMHgzOUVDNjJFMywgMHg3MjA0NjU5MiwKKzB4M0QyQzZENDMsIDB4NjE1MjY2RDIsIDB4MjE2OTc0MDgsIDB4MjUxMkFGRUQsCisweDhCMTg4ODA1LCAweDAxRkNFMDE0LCAweDJENDBFNDAwLCAweERFNTM2NzFDLAorMHgzMjczNjI0RCwgMHhBMkY2OEIwMSwgMHg2NDREMDAwOSwgMHg2MkUzNjk0MywKKzB4NjU5MjM5RUMsIDB4NkQ0MzcyMDQsIDB4NjZEMjNEMkMsIDB4NzQwODYxNTIsCisweEFGRUQyMTZCLCAweDg4MzEyNTEyLCAweEQ0NEE4QjNBLCAweDYxNDZEOTRBLAorMHg3NTA0NjU0MywgMHg2NzU2NjQ0MiwgMHg2RTUzMUY0OCwgMHg2NTUyN0UwNCwKKzB4N0VFNDYyRTIsIDB4N0UwNDY0RTIsIDB4NkVFMjFGRTksIDB4NUVGOTI5RTAsCisweDdFMDREOTQyLCAweDFGRUE2MEUyLCAweDI5MDBDOTAxLCAweEQ5NDA2RUUyLAorMHgyOUUwNEUwOSwgMHgyRjU2MkYyNiwgMHg1NkZBRDkzRSwgMHg2NTEzNDkwQiwKKzB4RDEzRDdGMDgsIDB4RTcxQzZFMEQsIDB4MURFMTJENzAsIDB4REUzQjY5MTIsCisweDY0RTIxRDkyLCAweDFENDNEMTNBLCAweEQyM0E2NTEyLCAweDY3MjIxRDU0LAorMHgxRDc1RDIzOSwgMHgxRDY2NjYyMiwgMHg2MjYyRDYzOCwgMHgxRDI3QTJBQiwKKzB4OEIzOTg4MzAsIDB4NjU5NkQ5MkIsIDB4Njc5MjY2OTYsIDB4NjE5Njc5MDQsCisweDc0RTQ2NDkzLCAweDZFNDM2OTkyLCAweDFGOUI3RTA0LCAweDFGRUM2NDQyLAorMHhEOTI1NkVFMiwgMHg1RUZDMjlFMCwgMHg3RTA0RDkyNCwgMHgxRkVENjBFMiwKKzB4MjkwMEM5MDEsIDB4RDkyMjZFRTIsIDB4MjlFMDRFMDksIDB4NTlGQzdGRkMsCisweERFMjcyRjkyLCAweDJGMTY0RTBCLCAweEQ0MUY3RjA4LCAweEUyMUM2MTBELAorMHgxRDExMkQyMCwgMHhEMjIwNjQ0MiwgMHhENDFDMUQ0MiwgMHgxRDUzNjU0MiwKKzB4Njc1MkQ1MUIsIDB4RDcxQjFENzQsIDB4MUQxNTYxNzIsIDB4MUQ2NjY2MjIsCisweDYyNjJENjFBLCAweDFEMjdBMjZGLCAweDhCMzU4ODMzLCAweDQ5MEJEOTE5LAorMHhBMjY4RUUwMCwgMHgwMDAwMkRFMCwgMHgwMDExNzgwMCwgMHgwMDIwM0ExQywKKzB4MDAyMDE4QTIsIDB4MDAyMDJBQUMsIDB4MDAyMDM5MEUsIDB4MDAyMDNBMjAsCisweDAwMjAzNTM0LCAweDAwMjAxOEVFLCAweDAwMjAzOTBELCAweDAwMTE3ODA0LAorMHgwMDIwMzk4QywgMHgwMDExNzgxMCwgMHgwMDIwMzkwOSwgMHgwMDIwMzkwQSwKKzB4MDAyMDM5MEIsIDB4MDAyMDBGNjQsIDB4MDAxQzU4NjQsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMEZCQywgMHgwMDIwMEZCOCwgMHg4OTAxODgyOCwgMHgwMDA5QTBDMCwKKzB4RTY0M0RFQjUsIDB4MzI2NjYyRTEsIDB4MUZFRThGMDIsIDB4MkUyMUUyNDAsCisweDYyMkQ2MkUxLCAweDhCMDEzMjY3LCAweDAwMDlBMEFBLCAweEU1MDE4NUUxLAorMHg4QjAxMzA1NiwgMHgwMDA5QTBBNCwgMHgyRDEwRTEwMSwgMHg2NEUxQjIyNSwKKzB4RTY0MzU3RkUsIDB4NjUyRDYyNzEsIDB4ODk0NDM1NjcsIDB4MzU2M0U2NDAsCisweEU2MDA4QjA1LCAweDBGNjVFMDQwLCAweEEwMEZFMTFBLCAweDYxNTM3MkMwLAorMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwgMHg0NTIxNDEyMSwgMHg0NTIxNDUyMSwKKzB4QzkwMzYwNTMsIDB4RTA0MDY2MDMsIDB4NzExODBGNjUsIDB4MjIwOUUwMDcsCisweDBGMjVFMDNDLCAweEUwNDQ2NDFELCAweEIyQTM2NUYzLCAweEUzM0MwRjQ2LAorMHg4NTMyMzNGQywgMHg2MjBEREU5NSwgMHg0MjA4NjAzMSwgMHg2MDIzNjEwRCwKKzB4MTMyM0U5NDQsIDB4MDZGRTQxMDgsIDB4RTAwRjM5RkMsIDB4MTMxNDRFMEIsCisweDY3MDc1RDkxLCAweDYwRDMyNjc5LCAweDBGNjY1NEZFLCAweDUxOTI4NTQyLAorMHg2MDBENEUwQiwgMHg2MEQzMjYwQiwgMHgwRjY2NjQ5MiwgMHg2NUYzQjIzNywKKzB4Njk2MTU2RkUsIDB4RTY0MDY1OUQsIDB4ODkzODM1NjMsIDB4RDc4MzU5RkUsCisweDc5MDY2NTkxLCAweEM5MDM2MDUzLCAweDQwMDA0MDA4LCAweDYxMDM2MjAzLAorMHgwRjI2RTA1MCwgMHg0NzBCRTBGRiwgMHg2QzA3NjAwQywgMHg2NjAzNjA1RCwKKzB4NDYyMTQ2MjEsIDB4NDYyMTQ2MjEsIDB4NDIwMDYyNjMsIDB4NDIwMDMyNkMsCisweDQwMjE0MDIxLCAweDQwMDhDOTAzLCAweDZEMkQzMEZDLCAweEU4MDA2QTAzLAorMHhCMjU3NjVGMywgMHg2RUEyNjREMywgMHgyRUM5RTA1MCwgMHg2Njk0MkFFMiwKKzB4RDc2RTAxRkUsIDB4NjA2QzQ3MEIsIDB4MkFFMjJFMEIsIDB4NjREMzY1RjMsCisweDc4MDFCMUZELCAweEVFMDY2MjhELCAweDhGRTkzMkUzLCAweDVFRkU3RDAxLAorMHg2MUUxRTQwMCwgMHg0MTAwODVFMSwgMHg2NkUzMzEwQywgMHg3NjBDNzExQiwKKzB4RTcwNDY1RjMsIDB4Njg2Njc0MDEsIDB4M0E3MzZBNEQsIDB4OEZGOTI1ODIsCisweDY1RjM3NTA0LCAweDY0MURCMUUzLCAweDY0RTFCMUE0LCAweDAwMDlBMTdCLAorMHhENDVCNTZGNywgMHhFQzAxRDI1QiwgMHgyNkMwNDIwQiwgMHgwMDA5QTE3MywKKzB4MDZGQ0UwMTgsIDB4ODgyOTYwNkMsIDB4NThGNzhCMDgsIDB4RTQwMEQyNTIsCisweDY2MjIyODQwLCAweDY0NkRCMTcxLCAweDAwMDlBMTY1LCAweDY2NkNFNjgxLAorMHg4OTAxMzA2MCwgMHgwMDA5QTBBQywgMHhENTUwRDE0RiwgMHg2MjEyNkE1NiwKKzB4MjEyMjMyQUMsIDB4NTQxMTZDNTYsIDB4MzRDQzYyNTMsIDB4NjQ1MjExNDEsCisweDcyMDg1ODEyLCAweEQ0NEEzODRDLCAweDY4MjIxMTgyLCAweDVBMTM2QzQyLAorMHgzQUNDM0M4QywgMHgxMUEzMjRDMiwgMHg2QzIyNzJFQywgMHg3MjEwNTgxNCwKKzB4MTE4NDM4Q0MsIDB4NUExNTY4MjIsIDB4MTFBNTNBOEMsIDB4NkEyMjcyMTAsCisweEQ2NDA1ODE2LCAweDExODYzOEFDLCAweDUyMTc2QzYyLCAweDExMjczMkNDLAorMHg1QTE4NTg2MSwgMHgxMUE4M0E4QywgMHg1QzE5NUE2MiwgMHgxMUM5M0NBQywKKzB4NTIxQTVDNjMsIDB4MTEyQTMyQ0MsIDB4NUExQjU4NjQsIDB4MTFBQjNBOEMsCisweDVDMUM1QTY1LCAweDExQ0MzQ0FDLCAweDUyMUQ1QzY2LCAweDExMkQzMkNDLAorMHg1QTFFNTg2NywgMHgxMUFFM0E4QywgMHg1NjFGNUE2OCwgMHgzNkFDRTg0MCwKKzB4MTE2RkRBMkQsIDB4NkNBMjM4MUMsIDB4N0E5NDY2ODIsIDB4Mjg2MjM2Q0MsCisweDVDODE2MkEyLCAweDE4QzEzQzJDLCAweDYyQTI3QTQ0LCAweDM2MkM1NjgyLAorMHhENjI2MTg2MiwgMHg1QTg1NjI2MiwgMHgzQTJDNDIyOSwgMHg3NjA0MThBNSwKKzB4NTY4NjYyNjIsIDB4MzYyQzQyMjksIDB4NTZGNzE4NjYsIDB4MjYyMEUyMzgsCisweDE2QzE1QzgxLCAweDE2MjI2MjEyLCAweEUyMDA1QzExLCAweDU1MTIxNkMzLAorMHg1NTE1MTY1NCwgMHg1NTEzMTY1NSwgMHg1NTE2MTY1NiwgMHg1NTgyMTY1NywKKzB4NjU4MjE2NTgsIDB4NTUxNDE2NTksIDB4NTU4NDE2NUEsIDB4NTU4MzE2NUIsCisweDU1ODUxNjVDLCAweDU1ODYxNjVELCAweDE4MjExNjVFLCAweDExMjEyMTIyLAorMHgxMTI1MTEyMiwgMHgxMTI2MTEyMywgMHgyODIyMTgyMiwgMHgxODI0MTEyNCwKKzB4MTgyNTE4MjMsIDB4MTgyNkEwQzcsIDB4MDAxMTc4MDQsIDB4MDAyMDMzRTgsCisweDAwMjAzQTQwLCAweDAwMjAxOEEyLCAweDAwMjAzNDk0LCAweDAwMUMzNkEwLAorMHgwMDIwMzRGMCwgMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwKKzB4NjY2Q0U2ODIsIDB4OEIyMDMwNjAsIDB4RUEyNDU2RjcsIDB4MjZBMEQxOTQsCisweDE2QzE1QzE3LCAweDE2MjI1MjE4LCAweDE2ODM1ODE5LCAweDE2QTQ1QTFBLAorMHgxNkM1NUMxQiwgMHgxNjI2NTIxQywgMHhFMjAwNTgxRCwgMHg1NTFFMTY4NywKKzB4NTUxRjE2NTgsIDB4MTEyNzE2NTksIDB4MTEyOTExMjgsIDB4MTEyQjExMkEsCisweDExMkQxMTJDLCAweEEwOEUxMTJFLCAweEU2ODMxMTJGLCAweDMwNjA2NjZDLAorMHg1MkY3OEIwQiwgMHhFQTAwRDg4MywgMHg2NTgyMjJBMCwgMHg3ODA0REM4MiwKKzB4NjI4MjJDNTIsIDB4QTA3RUQ2ODEsIDB4RTY5MDI2MjAsIDB4MzA2MDY2NkMsCisweERBN0Y4QjA2LCAweDAwMDk0QTBCLCAweEUyMDA1NkY3LCAweDI2MjBBMDczLAorMHg2NjZDRTY5MSwgMHg4QjEwMzA2MCwgMHg2MjIyRDI3NiwgMHgyMjI4NjIyQywKKzB4RDI3ODg5MDQsIDB4MDAwOTQyMEIsIDB4MDAwOUEwMDMsIDB4NDIwQkQyNzYsCisweDU2RjcwMDA5LCAweEEwNUVFMjAwLCAweEU2OTIyNjIwLCAweDMwNjA2NjZDLAorMHhFMDE4ODk1MSwgMHhFNkIwMEJGQywgMHg2NjZDNjJCQywgMHg4QjJBMzI2MCwKKzB4MDJGQ0UwMTQsIDB4NjgyQ0VBMDAsIDB4NjJBREU5MDQsIDB4ODk0QTMyODMsCisweDZBQURERDY0LCAweDNDREM2Q0EzLCAweDdEMDQ2RUMyLCAweERCNjhENDY3LAorMHgzMkRDNjJBMywgMHg0QjBCREM2NywgMHg0QzBCNkQyMiwgMHhENDY2NjRFMywKKzB4MDAwOTRCMEIsIDB4NjREMzRDMEIsIDB4NEIwQkQ0NjQsIDB4RTYwMDAwMDksCisweDY2NkQ2QkUzLCAweDc2MDEzQjZDLCAweDMyOTM2MjZELCAweDhGRjcyQkQwLAorMHhBRkRBNEQxOSwgMHhFNkI1N0EwOCwgMHgzMjYwNjY2QywgMHhENDVDOEIxMywKKzB4NEIwQkRCNTcsIDB4RDI1QjAwMDksIDB4NjAyMkRCNUIsIDB4Q0IyMEU2RkYsCisweDIyMDI2NjZELCAweERCNTkyQjYyLCAweEUwMTRFMjAwLCAweDU2RjcyQjIwLAorMHhBMDEwMDJGQywgMHhENDU2MjYyMCwgMHg2NTQyRDI1NiwgMHg0MjBCRDQ1NiwKKzB4QTAwODAwMDksIDB4REI1MjAwMDksIDB4NTJCMUU2MDAsIDB4NjIyQ0RCNTMsCisweDUyRjcyQjIxLCAweDdGNTQyMjYwLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwgMHhFMjQwNjE0RCwKKzB4ODkxNDMxMjMsIDB4MzEyN0UyMUYsIDB4OEIwOUQ3NDksIDB4RDQ0OTYxNEQsCisweEUwMDE3MUUwLCAweDU2NzE0NDBCLCAweDI2NTk2NTA3LCAweDE3NjFBMDA3LAorMHhFMDAxRDQ0NCwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywgMHg0RjI2Mjc2MiwKKzB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTIsCisweEQ3M0IzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjNBLCAweDQyMEI3MUUwLAorMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDIzNiwgMHhFMDAxNDIwQiwKKzB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksIDB4NDYyODQ2MTgsCisweDYyNTJENTMxLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTJENDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhBMDAxMDAwOSwKKzB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MjY0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LAorMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDYyMCwKKzB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsCisweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkNFLAorMHgwMDIwMzQ5NCwgMHgwMDExNzgwNCwgMHgwMDIwMzhGNCwgMHgwMDIwMzkwOCwKKzB4MDAyMDA1MEEsIDB4MDAyMDEwMDgsIDB4MDAyMDEwMkUsIDB4MDAyMDNBNTgsCisweDAwMjAxOEEyLCAweDAwMjAxOEU2LCAweDAwMjAzQTZDLCAweDAwMjAzQTc0LAorMHgwMDIwM0E3OCwgMHgwMDFDMzUwMCwgMHgwMDFDMTAwMCwgMHgwMDIwMzk4QSwKKzB4MDAxMTc4MDAsIDB4MDAyMDE4RUUsIDB4MDAyMDNBOEMsIDB4MDAyMDM5OTAsCisweDAwMUMzNzA0LCAweDAwMjAzM0U4LCAweDAwMUMzNzNDLCAweDAwMUMzNzAwLAorMHgwMDFDMzcwQywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQxMCwKKzB4NkU0M0JGQTQsIDB4MkRFMkJGODksIDB4MDAwOUJGQTAsIDB4MkMxMjUxRDUsCisweDFDNDE1NEQ2LCAweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwKKzB4MjQyMjc2MDEsIDB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4MDAwMDAwMDksCisweDAwMUMzNzBDLCAweDAwMDlBMTZFLCAweDJGRTYyRkQ2LCAweEREOTQ0RjIyLAorMHhBMDA0OUVCMiwgMHhENDkzMDAwOSwgMHg0MjBCRDI5MywgMHg2MkQyNjVEMiwKKzB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4RkQ0OTAsIDB4NTVEMTQyMEIsCisweDIyRTg1MkQxLCAweEEwMDQ4QkY4LCAweEQ0OEQwMDA5LCAweDQyMEJEMjhBLAorMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjg2RDQ4OSwKKzB4NTVEMzQyMEIsIDB4MjJFODUyRDMsIDB4QTAwNDhCRjgsIDB4RDQ4NjAwMDksCisweDQyMEJEMjgxLCAweDUyRDQ1NUQ0LCAweDhCRjgyMkU4LCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywKKzB4NkQ1M0IwMUEsIDB4NjREMzU3RjQsIDB4QjA1RjY1RTMsIDB4QjA3NTY2QzMsCisweEIwQTQwMDA5LCAweEIwQTgwMDA5LCAweEIwQUMwMDA5LCAweEIwQUMwMDA5LAorMHhCMEFGMDAwOSwgMHhCMDMxNTRGNSwgMHg2Q0NENkMwMywgMHg0RjI2NjBDMywKKzB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MzQxMkQxNzAsIDB4RDY3MDA1MjksCisweDI2NTBENzcwLCAweDI3NDIwMDBCLCAweDAwMDlBMDE4LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywgMHg2RDUzQkZFRSwgMHg2NEQzNTdGNCwKKzB4QjAzMzY1RTMsIDB4QjA4RDY2QzMsIDB4QjAwRjU0RjUsIDB4NkNDRDZDMDMsCisweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweEU1MDNEMTYyLAorMHhENzYzRDQ2MiwgMHgyMTUyNDUxOCwgMHgyNDcyMDAwQiwgMHhENDVGRDE1RSwKKzB4MjE2MkU2MDAsIDB4MjQ2MjAwMEIsIDB4QkY3MzRGMjIsIDB4QkY3M0U0MEEsCisweEQyNUMwMDA5LCAweDQxMThFMTA0LCAweEU0MEFFNTAwLCAweEJGNjkyMjEyLAorMHhENzU5MjI1MiwgMHhDQjIwNjA3MiwgMHgwMDBCNEYyNiwgMHg0RjIyMjcwMiwKKzB4NDEwQkQxNTYsIDB4RDU1NkU0MDAsIDB4NEYyNjQ1MkIsIDB4RDE1NTJGRTYsCisweDY2MTI2RTYzLCAweDkyMTA0NDE4LCAweDQ0MDg0NTI4LCAweDQ1MDAyNjI5LAorMHgyNjVCNDQwOCwgMHgyNjRCNDQwMCwgMHgyMTYyNDcwOCwgMHhEMTRFNDcwOCwKKzB4MjE3MjI3RUIsIDB4NkVGNjAwMEIsIDB4MUZGRjAzRjAsIDB4NEYyMjJGRTYsCisweEUxMDFERTRBLCAweEJGM0RFNDBBLCAweDY3RTMyRTEyLCAweEU1MDA3NzZDLAorMHhFMjA0RTEzMCwgMHgyNzUyRTQwQSwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3MjIyNzEyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4MTc1QUJGMTgsIDB4MkU2MkU2MDAsIDB4MDAwQjRGMjYsIDB4RDIzNDZFRjYsCisweEU0NDFFMTAxLCAweDAwMEIyMjEyLCAweEQxMzIyMjQyLCAweEU2MDVENDMyLAorMHgwMDBCMjE2MiwgMHgwMDBCMjQ2MiwgMHhEMjMwMDAwOSwgMHhFNDBBRTYwMSwKKzB4MjI2MkFGMDAsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDZDNDNEQjJCLCAweEVEMDA2MEIyLCAweDJCMDJDQjAzLCAweEM5MDM2MEIyLAorMHg2RTAzQTAwOCwgMHg4OTA3M0RDMiwgMHhFNDY0NjBCMiwgMHhCMDdDQzkwMywKKzB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEYwNDNEQzIsIDB4RDQyMTJGRTEsCisweDQ2MEJENjIxLCAweDYyRjEwMDA5LCAweDYwMjM2MjJELCAweDg5RkZDODAxLAorMHg3RjA0NjAyMywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwKKzB4MDAxQzNCODgsIDB4MDAyMDNBQTAsIDB4MDAyMDE4RUUsIDB4MDAyMDNBQTgsCisweDAwMjAzQUIwLCAweDAwMjAzQUI4LCAweDAwMjAzQUMwLCAweDAwMjVFNzIwLAorMHgwMDIwM0RBMCwgMHgwMDIwMzhGOCwgMHgwMDFDNTk2OCwgMHgwMDFDM0I0MCwKKzB4MDAwRjgwMDAsIDB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsIDB4MDAyMDE1RTAsCisweDAwMjAxNjBDLCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLCAweDAwMUM1ODMwLAorMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywgMHgwMDFDNTgxQywKKzB4MDAxQzU4NjAsIDB4MDAyMDNBQzgsIDB4MDAyMDE4QTIsIDB4OEYwMTQ0MTEsCisweDYwNDM2MDRCLCAweDAwMDkwMDBCLCAweDU2NTFENTJCLCAweDQ2Mjg2MDUyLAorMHgzMDZDMDAwQiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwKKzB4QkZGMTRGMDIsIDB4NkIwMzZFNDMsIDB4REQyNURDMjQsIDB4MDAwOUJGRUMsCisweDNDMDUzMEI4LCAweDQ2MDkwNjBBLCAweDQ2MDE0NjA5LCAweDAyMEEzRDY1LAorMHg0MjA5NDIwOSwgMHgzMkUyNDIwOSwgMHg0RjA2OEJGMCwgMHg0RjI2NEYxNiwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MkZDNjZCRjYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweEJGQ0Y0RjAyLCAweDZDMDM2RTQzLCAweEJGQ0JERDEzLAorMHgzMEM4MDAwOSwgMHgwNjBBM0QwNSwgMHg0NjA5NDYwOSwgMHgzNkUyNDYwMSwKKzB4NEYwNjhCRjUsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDJERTBCLCAweEU0MDNFNTAwLCAweEJGQjkyRTEyLAorMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywgMHg0RjI2MkU3MiwKKzB4NkVGNkFGQjAsIDB4MDAwOTAwMEIsIDB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsCisweDEwNjI0REQzLCAweDAwMUQ0MDA0LCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFNTAwN0Y5OCwgMHg2NDUzRTcxMCwKKzB4NkI1MzQ3MjgsIDB4RUUxQURDQkMsIDB4NjE1MzY1NUQsIDB4MzE1QzQxMDgsCisweDc1MDE0MTA4LCAweDYwNDMzMTdDLCAweDBGMTY2NjVELCAweEVEMDA2MEIzLAorMHgyMUIxMzZFMywgMHg4MTEyODExMSwgMHgxMUQyODExMywgMHgxMUQ0MTFEMywKKzB4NzQwNDhGRUEsIDB4RDhCMTY3RjIsIDB4MTg3MUQ5QjEsIDB4NThGMTI4NzIsCisweDE5ODFEMUIwLCAweDU5RjIyOTgyLCAweDVERjQ1QUYzLCAweDU0RjY1RUY1LAorMHgyMTkyMTE5MSwgMHgxMUEyMTFBMywgMHgxMUQ0MTFENSwgMHgxMUU2MTFFNywKKzB4MTE0ODExNDksIDB4REFBODU1RjcsIDB4NTdGOEVFMDAsIDB4NTJGOUREQTcsCisweDY0RTNENkE3LCAweDJBNTIxQTUxLCAweEQ4QTdEOUE2LCAweDJENzI5QUQ1LAorMHg2RUVEMjYyMiwgMHg0RDA4NkRFMywgMHgzREVDNjFFMywgMHg0RDA4NDEwOCwKKzB4M0Q5QzMxRUMsIDB4NDEwODYwQjMsIDB4ODFEMTJEQjEsIDB4NDEwOEUwNTAsCisweDQwMDhFN0I3LCAweDY3N0M0MTA4LCAweDYwQjM4MUQyLCAweEUyMDAzMThDLAorMHg4MUQzMzQ3MiwgMHgxRDEzMUREMiwgMHg4RDAxRDQ5MywgMHhENDkwMUQyNCwKKzB4QjBCMzY1RDMsIDB4NjRFRDdFMDEsIDB4OEJEQTM0QTIsIDB4MkZEMkRBOEMsCisweEREOTI2OEEyLCAweDJEODI0ODI5LCAweDdERkM2NEEyLCAweEQyODc2OTRELAorMHg2RTIyMkQ5MiwgMHg3RDBDNEUyOSwgMHg2ODIyMkRFMiwgMHg2MThENkFEMywKKzB4MkExNkQ3ODQsIDB4RDQ4QTZENzIsIDB4MjREMkQ1ODMsIDB4RDY4OTVFNzIsCisweDUxNzQxNEUyLCAweDE0MTRFRTAwLCAweEQxODc1ODc2LCAweDU5NzgxNDg2LAorMHgxNDk4RTcxMCwgMHg2NUUzNjI1MiwgMHgyNkUyMTQyQSwgMHhFNjAwNjRFMywKKzB4Njg0MzY0NEQsIDB4Mzg0QzQ4MDgsIDB4MzgxQzQ4MDgsIDB4MEM4NjYwNTMsCisweDA5Q0UyOEIxLCAweDgxOTE2MEIzLCAweDBBQ0U2MDUzLCAweDgxQTI2MDQzLAorMHgwRENFNjA1MywgMHg4MUQzNjBCMywgMHgwOENFNjA1MywgMHgxODgyNzQwMSwKKzB4NjI0RDA5Q0UsIDB4MEFDRTE5RTMsIDB4MUE2NDMyNzMsIDB4NzUwNDhGRTAsCisweEUwMDNEOTZBLCAweDQwMTg2QzkyLCAweDZEOTIyQ0IxLCAweDgxRDFEQTZGLAorMHg2RTkyRTA1MCwgMHg4MUUyNDAwOCwgMHg2MEIzNjE5MiwgMHg2NDkyODExMywKKzB4MTQ0MkU2MDAsIDB4RDQ2OTY3OTIsIDB4Njg5MjE3QTMsIDB4MTg2NEUxRkYsCisweDY1NjNFNzAzLCAweDM2NEM0NjA4LCAweDI2MTI3NTAxLCAweDM2NzM2NjVELAorMHhEQzVCOEJGOCwgMHg2REMyRTAwMywgMHgyREIxNDAxOCwgMHhEMjYwNkVDMiwKKzB4NjFDMjgxRTEsIDB4MTExMkVFMDAsIDB4RTAyNDY0QzIsIDB4NjVDMjE0MjMsCisweDE1RTRENDVCLCAweEU1ODA2N0MyLCAweDY4QzI4MTcyLCAweDgxODM2NkUzLAorMHg2NjZENjU1QywgMHg3NjA0Njk2MywgMHgzOTRDNkE2RCwgMHg4RkY4M0E1MywKKzB4REI1NDI5RTIsIDB4MjRCMkRDNTQsIDB4MjRDMjc0MDQsIDB4NEYyNjdGNjgsCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLAorMHg2MDExNjE0MiwgMHg4RjAzQzgwMywgMHhEMjNERTUwMCwgMHg4QjA2MzQyMCwKKzB4QzkwMzYwMTEsIDB4OEIwNjg4MDIsIDB4MzQyMEQyMzksIDB4NTYxMjhCMDMsCisweDUyNjQ2NTEzLCAweDAwMEIyNDIyLCAweDAxMTM2MDUzLCAweDJGRTYyRkQ2LAorMHg3RkVDNEYyMiwgMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwgMHg0NTA4RTQwMCwKKzB4RTEwMUEwMDEsIDB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsIDB4NjA1MzgxMjMsCisweDU2RTI4MTIyLCAweDhCRjUzNjIwLCAweDE2RTREMjM4LCAweEU2MTQ2NEYzLAorMHg2NUUzNDIwQiwgMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwgMHg2NUYzNjFGMSwKKzB4MkYxMTIxNDksIDB4RDEzMTU0RDEsIDB4RTYxNDQxMEIsIDB4NjA3MTU3RDEsCisweDI3MDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywgMHg2RDQzRTVGQywKKzB4MjA1OTYwNjEsIDB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsIDB4MTJFNDhCMDYsCisweDMxRTA1MUUyLCAweDUyRDE4QjA0LCAweDFFMjJBMDAyLCAweDU2NjRBRkYwLAorMHg2NEYzRDIxRSwgMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywgMHgyNzE5RTFGQywKKzB4NjdGMTJFNzEsIDB4MjcxOTU0RDEsIDB4NjVGM0QxMTgsIDB4NDEwQkU2MTQsCisweDUyRDEyRjcxLCAweENCMDE2MDIxLCAweDFERTEyMjAxLCAweDRGMjY3RjE0LAorMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDIwMzkyNCwgMHgwMDIwMzRGNCwKKzB4MDAyMDM0RkMsIDB4MDAyMDM1MDQsIDB4MDAyMDM1MkMsIDB4MDAyMDM5MTAsCisweDAwMjAzOTE4LCAweDAwMTAwMjA4LCAweDAwMTAxN0MwLCAweDAwMUUyMTBDLAorMHgwMDFDM0QwMCwgMHgwMDIwMzk2NCwgMHgwMDEwMDBDOCwgMHgwMDExNzg4MCwKKzB4MDAxMTc3ODAsIDB4MDAwNDAwMjAsIDB4MDAyNkM0MDEsIDB4MDAyMDBFRDYsCisweDRGMjIyRkU2LCAweERFNDI2MjRDLCAweDQyMDA0MjA4LCAweDNFMkNBMDA1LAorMHhENDQwNTI1MiwgMHhCRjY5NTYyNCwgMHg2NUUyMkU2MiwgMHgzNTIwNTJFMSwKKzB4RDYzRDhCRjYsIDB4NEYyNjI2MjIsIDB4NkVGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweERDMzk0RjIyLCAweDUyQzFEQjM5LCAweDM2MjA2NkMyLAorMHg2MDYxODkxQywgMHg4ODAxQzkwMywgMHhERTM0ODkxOCwgMHhCRjM3REQzNSwKKzB4NjUwMzY0RTMsIDB4NjZCMjg1MDMsIDB4MzI2MjYyMEQsIDB4RDQzMjg5MDcsCisweDAwMDlCRjc2LCAweDREMEJENDMxLCAweEFGRTYwMDA5LCAweEJGM0QwMDA5LAorMHhENDJGNjRFMywgMHgwMDA5NEQwQiwgMHgwMDA5QUZERiwgMHgyMjYyRDIyRCwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEREMjlEQzI4LCAweDZFNDM2MEMyLCAweDA0REU0MDA4LAorMHhFNjE0RDEyNywgMHg2NUUzNDEwQiwgMHhEMTI3RDcyNiwgMHg1NUUyMjdFMiwKKzB4MzVFMDUyNTQsIDB4MjEyMjhGMDQsIDB4NDAwODYwQzIsIDB4MTIyMjAyREUsCisweDYwNTM2NUMyLCAweDc1MDE0MDA4LCAweDBERTYwNkRFLCAweEM5MEY2MDUzLAorMHg2MDYzMkMwMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHg4NTQzNkNGNiwKKzB4NjUwRDU2NDMsIDB4NjIyRDYyNjIsIDB4MzUyNzcyMDQsIDB4RTEwMDhGMEMsCisweDIyNjg5NjBDLCAweEQ2MTU4QjAzLCAweDcyMDE1MjYxLCAweEQ2MTMxNjIxLAorMHg2MjYyRTEwMSwgMHgyNjIyNzIwMSwgMHg2MDEzMDAwQiwgMHgwMDAwMDFGRiwKKzB4MDAyMDM1MDQsIDB4MDAyMDM0RkMsIDB4MDAxQzNEMDAsIDB4MDAyMDM1MkMsCisweDAwMjAzOEY0LCAweDAwMjAxOEEyLCAweDAwMjAzNEY0LCAweDAwMjAzQUYwLAorMHgwMDIwM0FGNCwgMHgwMDFDM0QyOCwgMHgwMDIwMzk2NCwgMHgwMDIwMzkyNCwKKzB4MDAyMDBFRDYsIDB4MDAyMDM5NjgsIDB4MDAyMDM5NkMsIDB4MDAxMTc3NTQsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjg0RjIyLCAweDYwMjJEMjM3LAorMHg4RDU4QzgwMywgMHhERTM2MkYwMSwgMHhEQjM3REMzNiwgMHg2NkMyNTJDMSwKKzB4ODkyRjM2MjAsIDB4QzkwMzYwNjEsIDB4ODkyQjg4MDEsIDB4RDIzM0REMzEsCisweDY0RDM0MjBCLCAweDFGMDE2NTAzLCAweDg4MDE2MEIxLCAweEQyMzA4QjA0LAorMHg2NEQzNDIwQiwgMHgwMDA5QUZFQSwgMHg4NTYxNTY1MywgMHg4OTA0QzgyMCwKKzB4RTA1MEQ3MkMsIDB4NzIwMTAyN0UsIDB4RDIyQjA3MjYsIDB4NjQ1MzQyMEIsCisweDg5MDcyMDA4LCAweDU1RjFEMTI2LCAweDY0RDM0MTBCLCAweEU2MDFENzI3LAorMHgyNzYyQUZENCwgMHg1NUYxRDIyNiwgMHg2NEUzNDIwQiwgMHhFNjAxRDEyNSwKKzB4MjE2MkFGQ0MsIDB4REQyNURFMjQsIDB4REMyNkRCMjUsIDB4NjZEMjUyRDEsCisweDg5MTgzNjIwLCAweEM5MDM2MDYxLCAweDg5MTQ4ODAxLCAweEQxMTdENDFGLAorMHgwMDA5NDEwQiwgMHgzNkUwNTYwMywgMHg2NTAzOEYwNCwgMHgyQjIwRTIwMSwKKzB4MkM1MkFGRUMsIDB4RDcxMkQ0MUMsIDB4MDAwOTQ3MEIsIDB4RTYwMUQxMTUsCisweEFGRTM0NjE4LCAweDYwRjEyMTYyLCAweDg5MDdDODA0LCAweDdGMDhEMjE3LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHg0RjI2N0YwOCwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MDAwMDZCRjYsIDB4MDAxRTIxMDAsCisweDAwMjAzNTA0LCAweDAwMjAzNEZDLCAweDAwMjAzOThDLCAweDAwMjAxNEEwLAorMHgwMDIwMTRDQywgMHgwMDIwMzQ5NCwgMHgwMDIwMTZCRSwgMHgwMDFFMjEyQywKKzB4MDAyMDE1MzAsIDB4MDAxQzNEMzAsIDB4MDAxMTc4ODAsIDB4MDAyMDM0RjQsCisweDAwMjAzOTE0LCAweDAwMjAzOTEwLCAweDAwMjAzNTJDLCAweDAwMjAwNjEwLAorMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwgMHgwMDAwMTI2NiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LAorMHg2NDRDQkZGMiwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4RTUwMDZDRjYsIDB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsIDB4MjIyODYyNjAsCisweEFGRTM4QkZBLCAweDJGRTYwMDA5LCAweDc1MDc2MjUzLCAweEUxMDg2NzUzLAorMHg2MDQzRUUwQSwgMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwgMHg4RDAxNDQwOSwKKzB4RTYzMEU2MzcsIDB4NDExMDM2NUMsIDB4OEZGMjI3NjAsIDB4RTAwMDc3RkYsCisweDAwMEI4MDI4LCAweDAwMEI2RUY2LCAweDAwMEJFMDAwLCAweDJGRTZFMDAwLAorMHg3RkVDNEYyMiwgMHg2RTQzNjI1MywgMHhCRkRDNjVGMywgMHhCRkQwNjQyMywKKzB4QkZDRTY0RTMsIDB4RDQwMzY0RjMsIDB4MDAwOUJGQ0IsIDB4NEYyNjdGMTQsCisweDZFRjYwMDBCLCAweDAwMjAzQUY4LCAweEU0RkREMjlGLCAweEQ3OUY2MTIyLAorMHgyMjEyMjE0OSwgMHg3NDAxNjAyMiwgMHgyMjAyQ0IwMSwgMHhENTlDNjYyMiwKKzB4MjI2MjI2NDksIDB4Qzg0MDYwNzAsIDB4NjA1Mjg5MDIsIDB4MjUwMkNCMDQsCisweEUxRjc2NDUyLCAweDI1NDIyNDE5LCAweEU3MDE2MDUyLCAweDI1MDJDQjQwLAorMHhFNjAyNjA1MiwgMHgyNTAyQzlDRiwgMHg0NzE4NjA1MiwgMHgyNTAyQ0IxMCwKKzB4Q0IwMzYwNTIsIDB4MTU2MjI1MDIsIDB4MTU3MzAwMEIsIDB4RDc4RUQ1OEQsCisweEQ0OEZEMjhFLCAweEU2MDBFMTAwLCAweDI3MTEyNTExLCAweEFGQ0IyMjEwLAorMHg2NjRDMjQ2MSwgMHg0NjAwRDI4QiwgMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwKKzB4NjU0QzI2MDAsIDB4NDUwMEQyODcsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsCisweDI1NjAwMDBCLCAweEQyODQ2NjRDLCAweDM2MkM0NjAwLCAweENCMTA2MDYwLAorMHgyNjAwMDAwQiwgMHhEMjgwNjU0QywgMHgzNTJDNDUwMCwgMHhFMUVGNjY1MCwKKzB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyN0EsIDB4NjA2MDM2MkMsCisweDAwMEJDQjA4LCAweDY1NEMyNjAwLCAweDQ1MDBEMjc2LCAweDY2NTAzNTJDLAorMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwgMHhEMjczNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI2RjY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDYyNEMyNTYwLCAweDQyMDBENjY5LAorMHg2MDIwMzI2QywgMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwKKzB4RDY2NTYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsIDB4NDAyMTQwMjEsCisweDAwMEI0MDIxLCAweEQxNjE2MDBDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLAorMHhEMTVGNjAyQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwgMHgyRkU2NjAyQywKKzB4NkU0MzRGMjIsIDB4RTYwQTY0NUMsIDB4ODkxNDM0NjcsIDB4MDAwOUJGRUIsCisweDYwRUM2NDBDLCAweDhCMDI4ODAxLCAweEEwMDJFMDBGLCAweDQ0MDkyNDA5LAorMHg2MjRDNDQwOSwgMHgzMjYzRTYwQSwgMHhCRkUyODkwNSwgMHg2MjBDNjQ0QywKKzB4Qzg4MDYwMjMsIDB4RTIwMDhCMDAsIDB4NEYyNjYwMjMsIDB4NkVGNjAwMEIsCisweEQ2NEM0RjIyLCAweDg4MDE2MDYyLCAweEIyNTc4QjAzLCAweEEwMDMwMDA5LAorMHhEMjQ5MDAwOSwgMHgyMjYwRTY0MCwgMHhFMjAwRDY0OCwgMHgwMDBCNEYyNiwKKzB4NEYyMjI2MjIsIDB4NjA2MkQ2NDMsIDB4OEIwMTg4MDIsIDB4MDAwOUIyQTAsCisweEUyMDBENjQyLCAweDAwMEI0RjI2LCAweEQ1M0UyNjIyLCAweEUxMDBENDNFLAorMHgyNTEyRTcwMSwgMHgyNDcwMDAwQiwgMHhFNjA0RDIzQiwgMHgyMjYwMDAwQiwKKzB4RDQzQjRGMjIsIDB4NDEwQkQxM0IsIDB4RDUzQjAwMDksIDB4NjY1MEUxRkQsCisweDI2MTlEMjNBLCAweDI1NjBFNzAwLCAweDAwMEI0RjI2LCAweDRGMjIyMjcwLAorMHhEMjM4RDUzNywgMHhENzM4NjE1MiwgMHgyNTEyNjExRCwgMHhFNkZGNjQ1MiwKKzB4MjU0MjI0MkIsIDB4RDIyRkQ0MzUsIDB4NDIwQjY2NkQsIDB4RDUyRTI3NjIsCisweDY3NTBFMUZCLCAweDRGMjYyNzE5LCAweDI1NzAwMDBCLCAweEQ0MzA0RjIyLAorMHg0MTBCRDEyOCwgMHhENTI4MDAwOSwgMHg2NjUwRTdGNywgMHg0RjI2MjY3OSwKKzB4MjU2MDAwMEIsIDB4OTQyNUQ1MjQsIDB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsCisweEU0QkZENTIxLCAweDIyNDk2MjUwLCAweDI1MjAwMDBCLCAweEQyMjU0RjIyLAorMHg2MDBEODUyMiwgMHg4OTExMjAwOCwgMHg4OTQ1ODgwMSwgMHg4OTQ3ODgwMywKKzB4ODk0OTg4MDUsIDB4ODk0Rjg4MDYsIDB4ODk1NTg4MDgsIDB4ODk1Qjg4MDksCisweDg5NjE4ODBBLCAweDg5Njc4ODBCLCAweDAwMDlBMDZFLCAweDAwMDlCMDcwLAorMHg2MDBDQTA2QiwgMHgwMDAwRkY3RiwgMHgwMDFFMjE0OCwgMHgwMDFFMTAwMCwKKzB4MDAxRTExMDgsIDB4MDAyMDM5QzQsIDB4MDAyMDM5QzYsIDB4MDAyMDM5RTUsCisweDAwMjAzOUE4LCAweDAwMUUxMDNGLCAweDAwMUUxMDVGLCAweDAwMUUxMDJGLAorMHgwMDFFMTA5MCwgMHgwMDIwMzlDQywgMHgwMDFFMTAwQiwgMHgwMDIwMzlDOCwKKzB4MDAyMDNBRkMsIDB4MDAyMDE4QTIsIDB4MDAxRTEwMjgsIDB4MDAyMDM5RTQsCisweDAwMUQ0MDIwLCAweDk4NzYwMDAwLCAweDAwMUMxMDAwLCAweDAwMjAzQjA4LAorMHgwMDIwM0IxOCwgMHgwMDIwMzk5QywgMHgwMDA5QjA0QywgMHg2MDBDQTAzNSwKKzB4MDAwOUIwNTUsIDB4NjAwQ0EwMzEsIDB4NjI2MEQ2ODQsIDB4OEIyQjIyMjgsCisweDAwMDlCMDYxLCAweDYwMENBMDI5LCAweDYyNjBENjgwLCAweDhCMjMyMjI4LAorMHgwMDA5QjA2OSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY3QywgMHg4QjFCMjIyOCwKKzB4MDAwOUIwQzcsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2NzgsIDB4OEIxMzIyMjgsCisweDAwMDlCMENELCAweDYwMENBMDExLCAweDYyNjBENjc0LCAweDhCMEIyMjI4LAorMHgwMDA5QjEyNSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3MCwgMHg4QjAzMjIyOCwKKzB4MDAwOUIxM0QsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsCisweEQyNkNEMTZCLCAweEQ1NkM4NDEyLCAweDQwMDBDOTBGLCAweEQ3NkIwMTJELAorMHhFNDAzRDY2QiwgMHhFMjBGNjExQywgMHgyNTQwRTAwMSwgMHgyNTIwMjcxMiwKKzB4MjYwMjAwMEIsIDB4RTYwMUQyNjIsIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDUsCisweEQ2NjNEMjYwLCAweEUwMDE4MTIyLCAweDAwMEIyNjAyLCAweEQyNUMwMDA5LAorMHg2MDBEODUyMywgMHg4OTA1MjAwOCwgMHg4QjBBODgwMSwgMHg2MDYwRDY1RCwKKzB4MjYwMENCMDEsIDB4RDQ1N0Q2NUEsIDB4RTAwMUUxMDEsIDB4MDAwQjI2MTIsCisweDAwMEI4MTQyLCAweEQxNTJFMDAwLCAweDg1MTNFNTAxLCAweDY0MEQ0NTE4LAorMHg2NjAzMzQ1MywgMHhFMDAwOEQwNSwgMHhENTUxRDI1MywgMHgyMjYwRTAwMSwKKzB4MDAwQjI1MDIsIDB4NEYyMjAwMDksIDB4ODUxM0QxNDksIDB4NjQ1MzY1MEQsCisweDYyNDk0NDE5LCAweDIyN0Q2NzJFLCAweDg4MDE2MDJDLCAweDg4MDI4OTA5LAorMHg4ODAzODkxMCwgMHg4ODA2ODkxQSwgMHg4ODA3ODkzNSwgMHhBMDRDODkzQiwKKzB4RDU0NjAwMDksIDB4NjY1MkQ3NDYsIDB4Mjc2MkQ0NDYsIDB4NjIyQzYyNjEsCisweDI0MjFBMDM4LCAweDIyMjg2MjVDLCAweEQ0NDM4QjNGLCAweDY2NDJENTQwLAorMHgyNTYyRDQ0MCwgMHgyNDAxODU2MSwgMHg2MjAzQTAyQywgMHgyMDA4NjA1QywKKzB4ODgxMDg5MDcsIDB4ODgyMDg5MDgsIDB4ODgzMDg5MDksIDB4QTAyQzg5MEEsCisweEQyM0EwMDA5LCAweDYyMjJBMDA4LCAweEEwMDVEMjM5LCAweEQyMzk2MjIyLAorMHg2MjIyQTAwMiwgMHg2MjYyRDYzOCwgMHhENDMyRDUzMSwgMHg2NjIxMjUyMiwKKzB4QTAwRjYyNkMsIDB4RDYzNTI0MjEsIDB4NjI2MUQ1MkQsIDB4NjIyQ0Q0MkQsCisweEEwMDcyNTYyLCAweEQ2MzIyNDIxLCAweDg1NjFENTI5LCAweDI1NjJENDI5LAorMHg2MjAzMjQwMSwgMHg2NjJEODUxNSwgMHgzNjE3NjEwRCwgMHg2NTAzOEYwMSwKKzB4QjBDQjI0NTEsIDB4QTAwMTAwMDksIDB4RTAwMEUwMDEsIDB4MDAwQjRGMjYsCisweEQ2MTkwMDA5LCAweEQ0MjdFMTAxLCAweDY1NDEyNjEwLCAweEQxMThENzE3LAorMHhFMjBGNjU1RCwgMHgyNzUyRTAwMSwgMHgwMDBCMjYyMCwgMHgyRkU2MjEwMiwKKzB4RDIwRjRGMjIsIDB4NjQwQzg1MjMsIDB4OEIwODI0NDgsIDB4RDUxMUQ2MUQsCisweDI2MjFFMjAwLCAweDk0MEY4NDUxLCAweEEwNDgyMDQ5LCAweERFMEQ4MDUxLAorMHhDODQwNjBFMCwgMHhFMjAxOEQzMiwgMHg4OTQ0MzQyNywgMHhEMjE2RDYxNSwKKzB4MjY0MTQyMEIsIDB4MDAwOUEwMzAsIDB4MDAwMEZGN0YsIDB4MDAyMDM5RTUsCisweDAwMjAzOTlDLCAweDAwMjAzOUE4LCAweDAwMUUxMTAwLCAweDAwMUUxMDBDLAorMHgwMDIwMzlDOCwgMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwgMHgwMDIwMzlEMCwKKzB4MDAyMDM5QjAsIDB4MDAyMDM5QjQsIDB4MDAyMDM5QjgsIDB4MDAyMDM5RDQsCisweDAwMjAzOUQ4LCAweDAwMjAzOURDLCAweDAwMjAzOUUwLCAweDAwMjAzRTA0LAorMHgwMDIwM0UwRSwgMHgwMDIwMzlDMiwgMHgwMDIwMjg4NiwgMHg4OTEyMzQyNywKKzB4RDI5NEQ2OTMsIDB4MjY0MTQyMEIsIDB4Q0I4MDg0RTEsIDB4ODBFMUIwRjUsCisweEQ2OTE2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDYwLCAweEQ2OEYyNjAwLAorMHhBMDAxRTAwMSwgMHhFMDAwMjYwMiwgMHgwMDBCNEYyNiwgMHhENjhDNkVGNiwKKzB4Qzg4MDYwNjAsIDB4RDI4Njg5MTksIDB4ODgwMTYwMjEsIDB4RDI4OThCMTUsCisweDg1MjRFNTAxLCAweDg5MTAzMDU2LCAweEUyMDNEMTg3LCAweDIxMjBENDg3LAorMHhFMDBCNjU0MSwgMHgwNjU2NjU1RCwgMHhFNDBGRDU4NSwgMHgyMTQwRTcwMiwKKzB4RDc3RTI1NzEsIDB4MDAwQkUwMDEsIDB4MDAwQjI3MDIsIDB4MkZFNkUwMDAsCisweERFODA0RjIyLCAweEM4ODA4NEUxLCAweEQ1N0E4OTJDLCAweDIwMDg4NTU0LAorMHg2MTAzOEYyOCwgMHg4NTUzRDc3QywgMHg2NDAzNjY3MiwgMHg4NTY2NjUwQywKKzB4MzUyMDYyMEMsIDB4RDY3OThCMUUsIDB4NjUxQ0Q3NzQsIDB4MjY1MTY0NEMsCisweDYwRTAyNzQxLCAweDg5MDRDODQwLCAweDQyMEJEMjc1LCAweEEwMDMwMDA5LAorMHhEMjY4MDAwOSwgMHgwMDA5NDIwQiwgMHgwMDA5QjA5RiwgMHhFMjAxRDE2NywKKzB4NjBFMDIxMjIsIDB4Q0IwNEQ0NjQsIDB4NjA0MDJFMDAsIDB4MjQwMEM5M0YsCisweDYwMjNBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHhEQTYyMkZFNiwgMHg2NkExRTI0MCwgMHgzNjIyREM1RSwKKzB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsCisweERCNjFENDYwLCAweEU3MDBBMDBGLCAweDc3MDE2MkIyLCAweDcxMDI2MTIzLAorMHg2NjIxMkIxMiwgMHg3MTAyNjIxMywgMHg2MTIxMkIxMiwgMHg2NTFENjY2RCwKKzB4MzU2QzQ1MjgsIDB4NjI3QzI0NTIsIDB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsCisweDhCMTA4ODAzLCAweDYxNzM2N0IyLCAweDJCMTI3MTAyLCAweDcxMDI2RTEzLAorMHgyQjEyNjU3MSwgMHg2NTVENkRFMSwgMHg0MjI4NjJERCwgMHgzMjVDRTEwNywKKzB4QTAwQzJDMTAsIDB4ODgwMjI0MjIsIDB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsCisweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY1NUQ2NTYxLCAweEU2MEYyNDUyLAorMHg2N0ExMkM2MCwgMHg4QjA1Mjc3OCwgMHhERDM4REM0NCwgMHhFQjAxRUEwMCwKKzB4MkRCMjJDQTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsCisweDJGRTYyRkQ2LCAweEUyNDBERDM2LCAweDM2MjI2NkQxLCAweDYyNjM4OTAwLAorMHgzNjc4NjcyQywgMHg3NzAzREUzOCwgMHg0NzIxMkQ2MSwgMHg2NEUyRDYzNSwKKzB4QTAwRTQ3MjEsIDB4NjU2MkUxMDAsIDB4NjI1MzcxMDEsIDB4NzQwMTI0NTAsCisweDI0MjA0MjE5LCAweDQ1Mjk3NDAxLCAweDc0MDEyNDUwLCAweDI0NTA0NTE5LAorMHg2MjFDNzQwMSwgMHg4QkVFMzI3MywgMHg2NkUyNDIwMCwgMHg0MjAwNjFEMSwKKzB4MjExODM2MkMsIDB4MkU2MjhGMDYsIDB4REQxQ0Q3MjgsIDB4RTUwMUU0MDAsCisweDJENTIyNzQyLCAweDAwMEI2RUY2LCAweDJGRDY2REY2LCAweDRGMjIyRkU2LAorMHhFRDBBRUUwMSwgMHg2NEUzQkM4NSwgMHhCQzhBNjRFMywgMHg2MkVDN0UwMSwKKzB4OEJGNzMyRDcsIDB4QkM4REVFMDEsIDB4NjRFMzY0RTMsIDB4N0UwMUJDOTIsCisweDMyRDc2MkVDLCAweDRGMjY4QkY3LCAweDAwMEI2RUY2LCAweEQxMTg2REY2LAorMHhENDE4OTIwRCwgMHg3MjEyMjEyMiwgMHgyNDIyRDYxNywgMHhENzE3NzIwNCwKKzB4NzIyMDI2MjIsIDB4MjcyMkQxMTYsIDB4MDAwQjcyMzAsIDB4MTM3QTIxMjIsCisweDAwMjAzOUMyLCAweDAwMjAyOTkyLCAweDAwMUUxMDE1LCAweDAwMjAzOUM4LAorMHgwMDFFMTAwMSwgMHgwMDIwMzk5QywgMHgwMDFFMTEwMCwgMHgwMDIwMzlDNiwKKzB4MDAyMDM5QjQsIDB4MDAxRTEwMDAsIDB4MDAyMDM5QjgsIDB4MDAyMDM5QzQsCisweDAwMjAyODg2LCAweDAwMUUxMDBDLCAweDAwMjAzOUIwLCAweDAwMjAzOUNDLAorMHgwMDIwMzlEMCwgMHgwMDIwMzlENCwgMHgwMDIwMzlEOCwgMHgwMDIwMzlEQywKKzB4MDAyMDM5RTAsIDB4NEYyMjJGRTYsIDB4RDY3MDdGRkMsIDB4ODgwMTYwNjAsCisweEUyMDE4OTUxLCAweDI2MjBCRkJCLCAweEQ1NkVEMTZELCAweERFNkU2MDEwLAorMHg2NEUzNjU1MiwgMHg3NDAyQzg0MCwgMHg4RDIyRDE2QywgMHhEMjZDNzUwMiwKKzB4RTYwMUQ3NkMsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsCisweDhGRjkzMjczLCAweEQ0NjM3NDAyLCAweDYyNDJFNjAxLCAweDY0MEQ4NTI4LAorMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywgMHhFNDE3RDU2MiwKKzB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsIDB4QTAyMDcxMDIsCisweEQyNUUwMDA5LCAweEU2MDFENzVCLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LAorMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDUyNzQwMiwgMHg2MjQyRTYwMSwKKzB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsCisweEU0MTdENTUzLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLAorMHg5Mjg5NzEwMiwgMHhEMjQ2MkUyMSwgMHg1RTIzRDc0RSwgMHg2NEYyMkZFMiwKKzB4NjA0MzY1RjIsIDB4MjcwMEM5ODAsIDB4Qzk2MDYwNDMsIDB4ODA3MTYxMDMsCisweEM5MDM2MDQzLCAweDgwNzI0NTE5LCAweDY1RjI2MDVDLCAweDgxNzI2NkYyLAorMHg0NjE5NDYyOSwgMHg2MDZDNDUyOSwgMHg0MDE4NjQ1QywgMHg4MTczMzA0QywKKzB4MjExODVFMjMsIDB4NjRGMjJGRTIsIDB4NkU0QzYyRjIsIDB4NjAyQzQyMTksCisweDY2RjI2MkYyLCAweDQ2Mjk0MDE4LCAweDQ2MTkzMEVDLCAweDQyMjk4MTc0LAorMHg2NTJDNjA2QywgMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywgMHgwMDA5QkM5NiwKKzB4MjIyODYyMEMsIDB4QTAwQTg5MDgsIDB4NjAxMzAwMDksIDB4OEIwMzg4NDAsCisweDAwMDlCMDA5LCAweDAwMDlBMDAzLCAweEUyMDJENjJGLCAweDdGMDQyNjIyLAorMHgwMDBCNEYyNiwgMHg0RjIyNkVGNiwgMHg4NTUyRDUyQSwgMHg4ODMwNjAwRCwKKzB4ODgzMTg5MDMsIDB4QTAzNDg5MjMsIDB4ODU1NTAwMDksIDB4RDQyOEQ3MjcsCisweDg1NTMyNzAxLCAweDYxMERENjI3LCAweDI0MTI0MTE4LCAweDQ2MEJENDI2LAorMHhENzIzMDAwOSwgMHhEMjI2RDQyNSwgMHg2NTcyNDIwQiwgMHhFMjMwRDEyMCwKKzB4NDIyODY3MTIsIDB4MjcyOUU2MjAsIDB4Mzc2MDQ2MjgsIDB4RDYyMThCMDMsCisweEEwMTZFMjAwLCAweEQ2MUYyNjIyLCAweEEwMTJFMjAyLCAweEQxMTgyNjIyLAorMHg2MjEyRTUzMCwgMHhFNjIwNDUyOCwgMHg0NjI4MjI1OSwgMHg4OTA4MzI2MCwKKzB4RDQxQUQxMTksIDB4RTYwMUQ1MTMsIDB4MjE2MDQ1MEIsIDB4NDcyQkQ3MTgsCisweDRGMjY0RjI2LCAweDAwMDkwMDBCLCAweDAwMDAwNjBBLCAweDAwMjAzOUU0LAorMHgwMDFFMTAwMCwgMHgwMDIwMzlEMCwgMHgwMDIwM0UwNCwgMHgwMDIwM0UxMCwKKzB4MDAyMDNEQTgsIDB4MDAyMDM5QjgsIDB4MDAyMDNERDgsIDB4MDAyMDNERDYsCisweDAwMjAzREFBLCAweDAwMjAzOTlDLCAweDAwMjAzOUM4LCAweDAwMjAzOUI0LAorMHgwMDIwMzlCMCwgMHgwMDIwMThBMiwgMHgwMDIwM0IyNCwgMHgwMDIwM0IyOCwKKzB4MDAyMDE4RUUsIDB4MDAyMDM5Q0MsIDB4MDAxRTEwMEIsIDB4MDAyMDNCM0MsCisweDAwMTE0MDA0LCAweDRGMjIyRkU2LCAweERFOTY3RkZDLCAweDIwMDg4NEU5LAorMHgyRjAwOEQwNiwgMHhENjk1RDQ5NCwgMHgwMDA5NDYwQiwgMHg2NEYwQjE5QSwKKzB4NjYyMEQyOTMsIDB4ODkwMjI2NjgsIDB4QzlCRjYwRTAsIDB4N0YwNDJFMDAsCisweDAwMEI0RjI2LCAweDAwMEI2RUY2LCAweDJGRTYwMDA5LCAweERFOEQ0RjIyLAorMHg2MEUwRDY4RCwgMHhDQkMwRDQ4RCwgMHg2MjYwMkUwMCwgMHhDODAzNjAyQywKKzB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsIDB4NjYwMzQwMDksCisweEQ2ODc2MTZELCAweEU1MDBBMDA0LCAweDc1MDE2MjYyLCAweDc0MDQyNDIyLAorMHgzMjEzNjI1RCwgMHhEMjgzOEJGOCwgMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwKKzB4NEYyNjgwRTIsIDB4NkVGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDYyNjBENjdELCAweDg5NDQyMjI4LCAweEQ1NzJFMTAwLCAweDYwNTAyNjEwLAorMHhDQjQwRDQ3QSwgMHgyNTAwNDQwQiwgMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywKKzB4NzEwNDYxMkMsIDB4MkYxMUEwMDYsIDB4RDQ3NUQ2NkQsIDB4REQ3NTY3NjAsCisweDY1N0M0RDBCLCAweEUyM0M2RDFELCAweDhCMDMzRDI3LCAweEQyNjdENDcyLAorMHgwMDA5NDIwQiwgMHg0RDIxNEQyMSwgMHhBMDA1RDc3MCwgMHg2NkU2RTQwMCwKKzB4MzU3QzQ1MDgsIDB4NzQwMTI1NjIsIDB4MzVEMzY1NEQsIDB4RDc2QzhCRjcsCisweDYxNzJFMDAzLCAweDgxMTE0MDE4LCAweDZFNzI2MEYxLCAweDgxRTI3MDBDLAorMHhENDY4NjE3MiwgMHhERDY4ODExMywgMHg0RDBCREU2OCwgMHhFMjAxNjU3MiwKKzB4RDQ2NzJFMjIsIDB4NDIwQkQyNTUsIDB4RDY1NjAwMDksIDB4QzkzRjYwNjAsCisweDdGMDQyNjAwLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEMjVGNEYyMiwgMHg2QjQzNkU3MywgMHg0MjBCNkM1MywKKzB4MjAwODZENjMsIDB4NjQwMzhEMUMsIDB4RTUwRUQxNDksIDB4MzI1MjYyMTAsCisweDYwQzM4OTE2LCAweDgwNDEyNEIwLCAweDgxNDE2MEQzLCAweEEwMDdFNTAwLAorMHg2NTVENjFCQywgMHgwMEVDNjA1MywgMHgzNjRDNjY1MywgMHg4MDY0NzUwMSwKKzB4MzIxMzYyNUQsIDB4RDYzQjhCRjUsIDB4QzlCRjYwNjAsIDB4MjYwMEEwMDgsCisweEQyM0FENDRELCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHg3RkM0NEYyMiwKKzB4NzIwMjYyRjMsIDB4MjI1MTJGNDEsIDB4NDUyOTcyMDIsIDB4NjA2MzIyNTEsCisweEU1QzRFNjgyLCAweDY3RjM4MTIxLCAweDY1NUM2NjZDLCAweEU0MDhCRkI2LAorMHg0RjI2N0YzQywgMHgwMDA5MDAwQiwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTEwMDdGQzQsIDB4NjUxM0VDRkYsCisweDZCMTM2Q0NELCAweERFMzZENzM1LCAweEVERkY2NEYzLCAweEQ4MzVFQTA0LAorMHg2MDUzNjU1QywgMHgwMjdENDAwMCwgMHgzMkMwNjIyRCwgMHg2NjAzOEQwRCwKKzB4MDlFRDYwNjMsIDB4MjQ5MTAyN0QsIDB4MjQyMTc0MDIsIDB4Njk4MjAyRUQsCisweDM5Mjg2MjJELCAweDc0MDIyODkyLCAweDc1MDE3MTA0LCAweDYwNjM2MjVDLAorMHgwN0Q1MzJBMiwgMHgwRUI1OEZFNCwgMHgyNDQ4NjQxQywgMHhFNjgwODkwNSwKKzB4NjdGM0U1QzUsIDB4QkY3OTY2NkMsIDB4N0YzQzY1NUMsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweEQxMUU2OEY2LAorMHg2MDEyRDIxRSwgMHhDQjIwRTQwNSwgMHgyMTAyRTUwMCwgMHgwMDBCMjI0MiwKKzB4MDAwMDIyNTIsIDB4MDAxRTEwMTcsIDB4MDAyMDNCNDAsIDB4MDAyMDE4QTIsCisweDAwMjAzOTBFLCAweDAwMUUxMDE1LCAweDAwMUUxMEJGLCAweDAwMTE3ODAwLAorMHgwMDFFMTBGQywgMHgwMDIwMDYxMCwgMHgwMDIwMzkxNCwgMHgwMDIwMkFFQSwKKzB4MDAyMDNCNDQsIDB4MDAyMDE4RUUsIDB4MDAyMDNCNjAsIDB4MDAxMTc4OEMsCisweDAwMjAzOTEwLCAweDAwMjAzNEY0LCAweDAwMjAxNTMwLCAweDAwMUUyMTMwLAorMHgwMDIwM0I2OCwgMHgwMDIwMkFBQywgMHgwMDIwM0I2QywgMHgwMDIwMzk3NCwKKzB4MDAyMDM5N0MsIDB4MDAyMDNEQTQsIDB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsCisweEQ1NjREMTYzLCAweEU0MDBENzY0LCAweDIxNDJFMjBGLCAweDE3NDExMTU0LAorMHhENTYyMjcyMiwgMHg5NjY5RDc2MiwgMHgxNTQxMjU3MiwgMHg5NjY2MTU2MiwKKzB4RTYwMTE1NjUsIDB4RDU1RjExNjUsIDB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NjIyNTQyLCAweDc2MDFFNzI3LAorMHg2NzYzMjU3MiwgMHgyNTYyNzc5NywgMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwKKzB4RTIxOTI1MjIsIDB4RTI3MDI1MjIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1MjIyNTQyLCAweDI1MjJFMjBDLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwKKzB4MDAwOTQyMkIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4QzgyMDYwNDMsCisweDZFNDM4RDAyLCAweDAwMDlCRTY3LCAweEM4MTA2MEUzLCAweEJFNjQ4OTAxLAorMHg2MEUzMDAwOSwgMHg4OTAxQzg0MCwgMHgwMDA5QkU4NiwgMHhDODAxNjBFMywKKzB4REQzRDg5MzgsIDB4QzgwMjYwRDAsIDB4MkYwMDhEMDMsIDB4NDYwQkQ2M0IsCisweDYwRjAwMDA5LCAweDg5MDJDODA0LCAweDQ2MEJENjM5LCAweDYyRjAwMDA5LAorMHhDODgwNjAyMywgMHg2MEQwODkwMiwgMHgyRDAwQzk3RiwgMHhDODAxNjAyMywKKzB4RDYzNDg5MDYsIDB4MDAwOTQ2MEIsIDB4MDAwOUEwMDcsIDB4NTE2MzA2MDEsCisweDg5MDJDODA4LCAweDQ2MEJENjMwLCAweDYwRjAwMDA5LCAweDg5MDJDODEwLAorMHg0MjBCRDIyRSwgMHhENTJFMDAwOSwgMHg4ODAyNjA1MiwgMHhEMjJEOEIwMywKKzB4QTAwNUU2MDQsIDB4ODgwMTIyNjAsIDB4RDIyQThCMDIsIDB4MjI2MEU2MDEsCisweDI1MjJFMjAwLCAweEM4ODA2MEUzLCAweEQyMjc4OTJELCAweDYwRTM2RTIwLAorMHg4OTAyQzg4MCwgMHg0MjBCRDIyNSwgMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwKKzB4NDIwQkQyMjMsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4NDIwQkQyMjEsCisweDYwRTMwMDA5LCAweDg5MERDODA0LCAweEREMjBEMTFGLCAweDAwMDk0MTBCLAorMHgwMDA5QkYwRCwgMHgwMDA5QkY0QywgMHhENTFFRDQxRCwgMHgyNDcwRTcwOCwKKzB4MjVEMkJGODUsIDB4QzgwODYwRTMsIDB4RDIxQjg5MDUsIDB4NEYyNjdGMDQsCisweDQyMkI2RUY2LCAweDdGMDQ2REY2LCAweDZFRjY0RjI2LCAweDZERjYwMDBCLAorMHgwMDFDNTgxQywgMHhBMDAwQTAwMCwgMHgwMDFEMDEwMCwgMHgwMDFENDAwMCwKKzB4MDAwNDAwMjEsIDB4MDAxQzU4OUMsIDB4MDAxRTEwMjEsIDB4MDAyMDFBOTAsCisweDAwMjAxQUIyLCAweDAwMjAyMTE0LCAweDAwMjAxQUNBLCAweDAwMjAxQUQ4LAorMHgwMDIwMzlDOCwgMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwgMHgwMDIwMUI0NCwKKzB4MDAyMDFCNTAsIDB4MDAyMDFBRTAsIDB4MDAyMDFBRkUsIDB4MTIzNDU2NzgsCisweDAwMUUxMDAwLCAweDAwMTBGMTAwLCAweDAwMjAxQjJDLCAweDY0NENENkE3LAorMHgwMDBCMzQ2QywgMHhENkE2MjQ1MCwgMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwKKzB4NjQ0Q0Q2QTQsIDB4MDAwQjM0NkMsIDB4NjI1QzI0NTAsIDB4NDIwODYxNkQsCisweDQyMDg0MTE5LCAweDQyMDA2MDE5LCAweDY3MEU2MTRDLCAweEQ0OUUzMjFDLAorMHg0MjAwMjA3RCwgMHgzMjRDQzkwRiwgMHgyMjAwMDAwQiwgMHg0MjA4NjI1QywKKzB4NDIwMDQyMDgsIDB4MzI0QzY0NEMsIDB4NDIwMEQ0OTgsIDB4MDAwQjMyNEMsCisweDJGRTYyMjYwLCAweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLAorMHhFMjlGNjY2RCwgMHgyNzI5NDYxOSwgMHg2RTUzNjI2OSwgMHg2NzJFNjU3MywKKzB4NDIyMTIyN0QsIDB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsCisweDM0RTg0NjA4LCAweDY0NEM0NjAwLCAweDA3MUEwNDY3LCAweDIxNTAyNTdCLAorMHgwMDBCNEYxNiwgMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwKKzB4RDI4NDhCN0IsIDB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsCisweEU1MEY4QjczLCAweEU0MDFCRkEyLCAweEJGQTRFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkZBNCwgMHhCRkExRTQwMSwgMHhFNjAyRTUwNiwKKzB4NjA2MzQ2MTgsIDB4ODFGMkU0MDEsIDB4NjU0M0JGOUYsIDB4RTQwMTg1RjIsCisweEJGQUI2NTQzLCAweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLAorMHhFNDAyNjVGMCwgMHg2MDUzNzU2QywgMHg4MEY4QkY4MCwgMHhCRjgyRTQwMiwKKzB4ODRGOEU1MTIsIDB4NzA5MEU0MDIsIDB4NjUwM0JGODIsIDB4NDYxOEU2MDIsCisweDgxRjY2MDYzLCAweEJGODBFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLAorMHhFNTAwQkY4QywgMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwKKzB4RTAxMDY1NUMsIDB4QkY2MUU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjMsCisweDA1RkNFMDEwLCAweEJGNjNFNDBFLCAweEU1MDA3NTg1LCAweEJGNjRFNDAzLAorMHhFNTAwRTY0MCwgMHhCRjcxRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywKKzB4RTVGRkU2NDAsIDB4RTAxNDY1NUMsIDB4QkY0N0U0MDQsIDB4RTQwRjBGNTQsCisweEU1MDRCRjQ5LCAweDA1RkNFMDE0LCAweEJGNDlFNDBGLCAweEU1MDE3NTg0LAorMHhCRjRBRTY0MCwgMHhFNTAxRTQwNCwgMHhCRjU3RTY0MCwgMHhFNTAxRTQwNCwKKzB4RTQwNEU2NDAsIDB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsCisweDRGMjIwMDA5LCAweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLAorMHgyNjY4NjYyMSwgMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwKKzB4RTQwMUJGMUMsIDB4QkYxRUU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRjFFLCAweEJGMUJFNDAxLCAweEU0MDFFNTA2LCAweEJGMUM2NTQzLAorMHhFNDAxRTY0MCwgMHhCRjI5NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywKKzB4NjVGMEU2NDAsIDB4NzU2Q0U0MDIsIDB4QkVGRjYwNTMsIDB4RTQwMjgwRjQsCisweEU1MTJCRjAxLCAweEU0MDI4NEY0LCAweEJGMDE3MDkwLCAweEU2NDA2NTAzLAorMHhCRjAyRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjBGRTQwMiwgMHhFNjQwRTUwMCwKKzB4QkYxNkU0MDIsIDB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFNUU0MDMsCisweEU1MTM4MEY4LCAweEU0MEVCRUU3LCAweEU0MEU4NEY4LCAweEJFRTc3MDg1LAorMHhFNTAwNjUwMywgMHhCRUU4RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY1RTY0MCwKKzB4RTUwMEU0MDMsIDB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsCisweEJFQ0JFNDA0LCAweEU0MEY4MEZDLCAweEU1MDRCRUNELCAweEU0MEY4NEZDLAorMHhCRUNENzA4MywgMHhFNTAxNjUwMywgMHhCRUNFRTY0MCwgMHhFNTAxRTQwNCwKKzB4QkVEQkU2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsCisweDdGMTA0RjI2LCAweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDJGLAorMHgwMDFFMTA4MCwgMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwKKzB4MDAyMDM5QzIsIDB4MDAyMDM5QzQsIDB4MDAyMDM5QzYsIDB4RDIxREQxMUMsCisweDY2MjA2MDEwLCAweDY3NkM3MDAxLCAweDM3MDBDOTBGLCAweEU1MDA4RDEzLAorMHg2NzEwNjIxMCwgMHg3NzAxNjIyQywgMHg2NDIzMjE3MCwgMHhENjE2NjAxMCwKKzB4NDQwODQ0MDgsIDB4MzQyOEM5MEYsIDB4NjI2MDIxMDAsIDB4NzIwMUQ1MTMsCisweDQ0MDgyNjIwLCAweDAwMEIzNTRDLCAweEQxMEY2MDUzLCAweDI1NTg2NTEwLAorMHhFNjAwOEQxMywgMHhENjBERDQwQiwgMHg2NTVDNjU0MCwgMHg0NzA4Njc1MywKKzB4Mzc1ODQ3MDgsIDB4NDcwODY1NDAsIDB4MjQ1MDc1MDEsIDB4MzY3QzYwNDAsCisweDI0MDBDOTBGLCAweDcyRkY2MjEwLCAweDAwMEIyMTIwLCAweDAwMDA2MDYzLAorMHgwMDIwMzkwRCwgMHgwMDIwMzkwQywgMHgwMDIwMzkwRSwgMHgwMDIwMzUzNCwKKzB4N0ZGQzRGMjIsIDB4RTY4MEQxOUYsIDB4NjY2QzYyMTIsIDB4RDI5RTJGMjIsCisweDY3RjM2NTYzLCAweDQyMEI3NTQyLCAweDdGMDRFNDA0LCAweDAwMEI0RjI2LAorMHhFNjgwMDAwOSwgMHhEMjk4NjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MCwKKzB4RTY4MDY0NzMsIDB4RDI5NDY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDMsCisweDJGODY2NDczLCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkNDNEYyMiwgMHhEQzhFRDI4RCwgMHg3MjAxMUYyMSwgMHhEQjhEMUYyMiwKKzB4RDE4RURFOEQsIDB4NjYxMjUyMTEsIDB4OEIwMTM2MjAsIDB4MDAwOUEwRTUsCisweEM5MDM2MDYxLCAweDhCMDE4ODAxLCAweDAwMDlBMERGLCAweEQyODhENDg3LAorMHhFRDg0NDIwQiwgMHgyRjAyNTUwMywgMHgzMEQwODQ1QywgMHhBMEI4ODkwMSwKKzB4RDE4NDAwMDksIDB4NjI2QzY2MTAsIDB4ODgwMTYwMjMsIDB4RDE4MjhCNjgsCisweDYyMTAxRkMzLCAweDg5NUIyMjI4LCAweEUwMDNENDgwLCAweDQwMTg2NzQyLAorMHg2ODQyMTc3MiwgMHhENTdFRTkwMCwgMHg4MTgxNkRCMywgMHg3RDA0MjE5MCwKKzB4NjdEMjZBQjIsIDB4NjRFMjY4NTIsIDB4MUY0OTFGNTcsIDB4NzQwNDY0RTMsCisweDFGQTQ2NTQyLCAweDY1NDMxRjVBLCAweDYyNTI3NUY4LCAweDFGNzYxRkQ1LAorMHg2RDUzMUYyQiwgMHhEQTc0RDc3MywgMHg3RDk0RDI3NCwgMHg2OEQyMUY4OCwKKzB4NkFBMjY5NzIsIDB4RDE3MjYwMjIsIDB4MjIwMkNCMjAsIDB4RTE0MDFGMUMsCisweDc2MDFFNjAwLCAweDMyMTM2MjZELCAweDU2RjQ4QkZCLCAweDUyRjY1MUY1LAorMHgyMTIyMkI2MiwgMHg1MkY4NTFGNywgMHgyMTIyNTZGOSwgMHgyRTYyNTFGQSwKKzB4NTFGQjI0MTIsIDB4MkQ4MjI1MTIsIDB4RDk2NjI3OTIsIDB4MjlBMkRENUYsCisweDZBRDJEOTY1LCAweEQ5NjQ2ODkyLCAweDY4RDIxQTg0LCAweDYwODFEQTYzLAorMHgyODAxQ0IwMSwgMHhEODYyNjZEMiwgMHgyQTYyMjk2MiwgMHhFRDAxNUFGQywKKzB4MkFEMjQ4MEIsIDB4MkFEMjREMTgsIDB4NjJEMkRENUUsIDB4MkQyMjcyMDEsCisweEQxNTA1NkYzLCAweEUyMDI2MDYyLCAweDI2MDJDQjAxLCAweDIxMjBBMDNELAorMHg4QjNBMjIyOCwgMHhFNDAxREQ1OCwgMHgyMTQwRTYwMCwgMHhFMDFDMkQ2MiwKKzB4QzgwMTAwNUMsIDB4RDQ1NThCMEEsIDB4RTYwMEQ3NTUsIDB4RUQ3RDI0NzIsCisweDYyNkM3NjAxLCAweDhCRkIzMkQzLCAweDI0RDJERDUyLCAweEUyRkU2OEMyLAorMHgyQzgyMjgyOSwgMHgwOTVDRTAxRSwgMHhFMDFGNURGMSwgMHgwQTVDMkQ5MCwKKzB4NzUxMDUxRjIsIDB4RUQwNjIxQTAsIDB4RDc0QkU2MDAsIDB4ODQ1NkQ0NEIsCisweDI3MDA3NjAxLCAweDY5NkM2ODU0LCAweDI0ODAzOUQzLCAweDhGRjY3NDAxLAorMHhEQTQ3NzcwMSwgMHgyQTEwRTE5NCwgMHhFMjAwN0EwMSwgMHg3QTBGMkEyMCwKKzB4RDEzMEU4MDUsIDB4NjYxMDJBODAsIDB4NjAyMzYyNkMsIDB4ODkwODg4MDEsCisweEQyNDBENDJBLCAweDQyMEI2NUYyLCAweEQxMzFFRDAxLCAweEFGMzA0RDE4LAorMHg2NUYyMjFEMiwgMHg4NTUzRDQzQywgMHg2MjBENjY0MiwgMHg4OTA3MzI2MiwKKzB4RDEzQkQ0M0EsIDB4MDAwOTQxMEIsIDB4RTYwMUQ3M0EsIDB4Mjc2MkFGMUEsCisweEQxMzRENDFFLCAweDQxMEI2NUYyLCAweEQxMjVFRDAxLCAweEQ2MzdENDM2LAorMHg0NjBCNEQxOCwgMHhBRjBEMjFEMiwgMHg3RjM0MDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsCisweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLAorMHg4MUYyRDIwOSwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywKKzB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsCisweDAwMDAwMDA5LCAweDAwMUMzRDlDLCAweDAwMjAyNDVDLCAweDAwMTE3NzlBLAorMHgwMDFDMzZGOCwgMHgwMDFDM0I5QywgMHgwMDFDMzcwNCwgMHgwMDIwMzUyQywKKzB4MDAyMDE0QTAsIDB4MDAyMDM5MUQsIDB4MDAyMDM5MUMsIDB4MDAyMDM5MTgsCisweDAwMUMzRDk4LCAweDAwMUMzQkI0LCAweDAwMUM1OTYwLCAweDAwMUMzNTAwLAorMHgwMDFDM0QzMCwgMHgwMDFDODk2MCwgMHgwMDIwMzUwNCwgMHgwMDFDM0QwMCwKKzB4MDAyMDE2MEMsIDB4MDAxMTc3MzAsIDB4MDAyMDM5MjAsIDB4MDAxQzU4MkMsCisweDIwMDBBMDAwLCAweDAwMDBBMDAwLCAweDAwMTE3NzhDLCAweDAwMTE3NzkyLAorMHgwMDExNzc4OCwgMHgwMDIwMTRDQywgMHgwMDIwMzhGNCwgMHgwMDIwMzRGNCwKKzB4MDAyMDE1MzAsIDB4MDAxRTIxMzAsIDB4MDAyMDNEODQsIDB4MDAyMDE4QTIsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEMTlCN0ZFQywgMHgyRjEyRTAwMCwgMHg2MTAzRDQ5QSwgMHgxRjQyODFGMiwKKzB4REQ5QURBOTksIDB4RDY5QTY4MTMsIDB4RTAwMTQ4MDgsIDB4NDYwQkRFOTksCisweDM4RUM0ODAwLCAweDY1QTIxRjAzLCAweDM1MjA1MkExLCAweEEyM0U4QjAxLAorMHg2MDUxMDAwOSwgMHg4ODAxQzkwMywgMHhBMjM4OEIwMSwgMHg1MjUzMDAwOSwKKzB4MzJFMERFOTEsIDB4RDk5MThCMTAsIDB4NjRBMzQ5MEIsIDB4NEIwQkRCOTAsCisweERFOTA2NDAzLCAweEQ3OTFENjkwLCAweEVDMDFENTkxLCAweDJFMDJFMTAwLAorMHgyNzEwMjZDMCwgMHgyNTAyQUZERiwgMHhDODAxODU1MSwgMHhBMTU3OEIwMSwKKzB4NjI1MTAwMDksIDB4NDIwMDYyMkQsIDB4NUU1MzM2NkEsIDB4ODVFMjIyNkQsCisweEM5MDM2NDJDLCAweDg1RTM2NjAzLCAweDYwNTM2NTBELCAweDQwMjE0MDIxLAorMHg0NTAwQzkzRiwgMHgzMjJBNjcwMywgMHg2MDUzMjUyRCwgMHhDOTAxRDE3RiwKKzB4NjAxMDZDMDMsIDB4ODgwMUQ5N0YsIDB4REI3RjhCMDUsIDB4MjEyMEUyMDAsCisweENCMDE2MEIyLCAweEQxN0QyQjAyLCAweDg4MDE2MDExLCAweDY1QTI4QjBBLAorMHg4RDA0MjQ0OCwgMHg5QjlFNjI1MSwgMHhBMDAzMjJCOSwgMHg5MTlCMjUyMSwKKzB4MjUyMTIyMUIsIDB4MzdCM0VCMTAsIDB4MjQ0ODg5NUUsIDB4RDQ3MzhCMDcsCisweDIyMjg2MjQxLCAweDYwNjM4OTAzLCAweEEwNTc4MUY4LCAweEQ1NzA2NDczLAorMHg0NjA4NDYwOCwgMHg4NUUyNjI3MywgMHg0NjAwNkI1MCwgMHgzNjJDNDIwMCwKKzB4MkJCOEM5MTAsIDB4OEYxRjY0NjMsIDB4MjY2ODY2MDMsIDB4RDI2OTg5MTEsCisweDA2MkQ2MDQzLCAweDQxMTk2MTZELCAweDZCMEU2MDE5LCAweDgxRjgyMEJELAorMHg4ODAxNjBDMywgMHg2NDZDOEYyQywgMHg4ODBGNjA3MywgMHhBMDI3OEIxQiwKKzB4RDI2MTAwMDksIDB4MDUyRDYwNDMsIDB4NDExOTYxNUQsIDB4NjcwRTYwMTksCisweDY0NUMyMDdELCAweDgxRjhBMDFDLCAweDg5MEYyNjY4LCAweDYwNDNEMjVCLAorMHg2QjVEMDUyRCwgMHg2MEI5NEIxOSwgMHgyMDFENjEwRSwgMHg2MEMzODFGOCwKKzB4OEYwRDg4MDEsIDB4NjQ3MzY0NUMsIDB4RUMwMEEwMEEsIDB4NjA0M0QyNTQsCisweDYyNUQwNTJELCAweDYwMjk0MjE5LCAweDIwN0Q2NzBFLCAweDgxRjg2NDVDLAorMHg4ODAyODVGOCwgMHg4NUUxODkwQSwgMHg4RDA3QzgyMCwgMHhFNkRDNjIwMywKKzB4NjAyMzIyNjksIDB4ODFFMUEwMDIsIDB4NjQ0Q0U0RkYsIDB4NjIxMEQxNDksCisweDg5MDEyMjI4LCAweDY0NENFNEZGLCAweDY1NERFQkZGLCAweDM1QjA2QkJDLAorMHhEQjM2OEIyQiwgMHg2NEEzNEIwQiwgMHg0MTBCRDEzNSwgMHg1NDAzNjQwMywKKzB4ODU0NDZFMDMsIDB4Qzk0OERCNDAsIDB4REM0MDg4MDgsIDB4QkVBRThCMDEsCisweDY0QjNFNTAyLCAweDY1RTM0QzBCLCAweERCM0RFQzAxLCAweEQxM0QyREMyLAorMHg2MjEyNjBCMiwgMHg3MjAxNzAwMSwgMHgyMTIyODgwNSwgMHgyQjAyOEYwOCwKKzB4NjY2Q0U2ODAsIDB4NjU2M0QyMzgsIDB4NzU0OUU3MDAsIDB4NjQ3MzQyMEIsCisweEEwMzBENDM2LCAweDdGRkYwMDA5LCAweDg1RTI4MDAwLCAweDIwQjlFQkZDLAorMHg2MTAzODFFMiwgMHg5NDJBODVFMywgMHg2MjAzMjA0OSwgMHg0NTA4ODVGOCwKKzB4ODFFMjIwMUIsIDB4QzkwMTYwQzMsIDB4NDAwODQwMTgsIDB4NDAwODQwMDgsCisweDQwMDAyMjVCLCAweDYwMjMyMjBCLCAweDg1RTQ4MUUzLCAweDQxMThFMTA4LAorMHg4MUU0MjAxQiwgMHhFNDAyNjJBMiwgMHgyMEI5ODUyMSwgMHg2N0EyODEyMSwKKzB4Q0IwMTYwNzEsIDB4ODVGODI3MDEsIDB4ODkwMzMwNDIsIDB4RUNFNzg1RTIsCisweDgxRTIyMEM5LCAweDQ5MEJENDFFLCAweEEwM0IwMDA5LCAweDdFMDMwMDA5LAorMHgwMDFDM0QzMCwgMHgwMDIwM0Q5MCwgMHgwMDIwMzUwNCwgMHgwMDFFMjEyQywKKzB4MDAyMDMzRTgsIDB4MDAxQzNEMDAsIDB4MDAxMTc3ODAsIDB4MDAyMDE0QTAsCisweDAwMjAxNjZDLCAweDAwMTE3NzBDLCAweDAwMjAzOTFDLCAweDAwMjAzOTFELAorMHgwMDIwMzkxOCwgMHgwMDIwMThBMiwgMHgwMDFDMzZGOCwgMHgwMDIwMzk5MCwKKzB4MDAyMDNEQTAsIDB4MDAyMDNCODQsIDB4MDAyMDNDMDQsIDB4MDAyMDNDODQsCisweDAwMjAzRDA0LCAweDAwMjAzOTA4LCAweDAwMjAzNEZDLCAweDAwMjAxNENDLAorMHgwMDIwMzk5NCwgMHgwMDIwMzk5OCwgMHgwMDIwMjQ1QywgMHgwMDIwM0Q4OCwKKzB4MDAyMDNEOEMsIDB4NjAyMjYyRjIsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksCisweDhCMEI4ODBBLCAweDYwRTJERThDLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LAorMHg4QjAzODgwOCwgMHhDQjAxNjBBMiwgMHgyODAyQTAwNiwgMHg2NUUyREU4NywKKzB4MkU1Mjc1MDEsIDB4Mjg2MjY2QTIsIDB4NTJGMzY2RjIsIDB4MjYyMkFFODMsCisweEQyODM4NTUxLCAweERFODNDODAyLCAweEEwOTU4QjAxLCAweDQyMEIwMDA5LAorMHg0RTBCNjRBMywgMHg1RTAzNjQwMywgMHg4NUU0NjUwMywgMHg0OTE4RTkwOCwKKzB4RDc3RDIwOUIsIDB4RTA0QzgxRTQsIDB4REM3QzBCN0UsIDB4N0IwMUQ5N0MsCisweDYxQzIwN0I2LCAweDcxMDE2NjkwLCAweDhEMDYyNjY4LCAweEQ0NzkyQzEyLAorMHg0MjBCRDI3OSwgMHhBMDcwRUIwMSwgMHg2MjUxMkRCMiwgMHg0QjE4RUIwRiwKKzB4MjJCOUUxMDIsIDB4MzIxMDQxMTgsIDB4ODU1MThCMEYsIDB4MjAyOUUyRkMsCisweDYwNTE4MTUxLCAweENCMDE3MkUwLCAweDg1RTEyNTAxLCAweDIwMjk5NEEzLAorMHg4NUU0ODFFMSwgMHhBMDUyMjA0OSwgMHg2NzUxODFFNCwgMHg0NzE5Njc3RCwKKzB4NjY3RTY3NzksIDB4NzcwMTI3NkQsIDB4NjkwMzYwN0MsIDB4ODgwMTQ5MTgsCisweDI1OTE4RjNFLCAweDZCMTJEMTYxLCAweDIxQjI3QjAxLCAweDY2MEQ4NUUzLAorMHg0MDIxNjA2MywgMHhDOTNGNDAyMSwgMHg2QzAzNDYwMCwgMHgyNjJEMzIyQSwKKzB4QzgwMTYwNjMsIDB4REI1RUQxNUQsIDB4OTY3RDg5MDEsIDB4RTYwMDJDNkIsCisweDY2NkM2N0NELCAweDQwMDA2MDYzLCAweDYyMkQwMjFELCAweDhEMEUzMjcwLAorMHg2MDQzNjQwMywgMHhFOUZGMDIxRCwgMHg4QjAxMzI5MCwgMHgwMUM1QTAwNywKKzB4NjI2Qzc2MDEsIDB4MzI5MkU5MDQsIDB4NjQ2QzhCRUIsIDB4NjA0MzQ0MDAsCisweEQxNTAwNEJELCAweDBCNDU3NDAxLCAweDY2OUQ2OTExLCAweDg5MDczNjcwLAorMHg2MDJENjIxMSwgMHg4OTAzODhGRiwgMHhFMjAxREI0QiwgMHgyQjIwMjFDMSwKKzB4RUNGQzg1NTEsIDB4ODE1MTIwQzksIDB4Q0IwMTYwNTEsIDB4REM0NzI1MDEsCisweDY0QTM0QzBCLCAweDUxRjM2NkYyLCAweDg1RUYyNjEyLCAweDU0RjJEMjQ0LAorMHg2NTBENDIwQiwgMHgwMDA5QURFNywgMHhFNTAwREM0MiwgMHg0MjBCMkM1MiwKKzB4NEUwQjY0QTMsIDB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsIDB4NjcwM0U5MDgsCisweDY1MDM0OTE4LCAweDI3OTk4NTQxLCAweERCMzIzNzkwLCAweDhGMEJEOTMyLAorMHg2MDEzNjEwRCwgMHg4QjA3QzgyMCwgMHhDOTQ4NjA1MywgMHg4QjAzODgwOCwKKzB4RTUwMUJENEQsIDB4MDAwOUEwMDUsIDB4MjEyOEQyMzMsIDB4QkQ0Njg5MDEsCisweDY0QjNFNTAwLCAweDQ5MEI2NUUzLCAweEFEQkNFQzAxLCAweDg1RjIyREMyLAorMHg3MDAxRUUwNCwgMHgzMUU3NjEwRCwgMHg4RDAyODFGMiwgMHhBREE5N0EwOCwKKzB4N0YxNDAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweEY3RkY2OEY2LCAweDJGRTY4MDAwLCAweEQyMjM0RjIyLAorMHg2MEUzNkUyMiwgMHg4RDAyQzg0MCwgMHhCQkY5MjJFMiwgMHhFMjQwMDAwOSwKKzB4MkUyODQyMTgsIDB4QkMwNDg5MDEsIDB4NjBFMzAwMDksIDB4ODkwNUM4MTAsCisweEQyMUNENDFCLCAweDAwMDk0MjBCLCAweDAwMDlCQzAzLCAweEM4MDU2MEUzLAorMHhCRDZEODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHhBQzAwNEYyNiwKKzB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsIDB4MDAxQzNEM0MsIDB4MDAxMTc3NjAsCisweDAwMjAxNEEwLCAweDAwMjAxNjZDLCAweDAwMjAzNDk0LCAweDAwMjAzREE0LAorMHgwMDIwMzkwOCwgMHgwMDIwMzRGQywgMHgwMDIwMTRDQywgMHgwMDIwMzk3NCwKKzB4MDAyMDM5N0MsIDB4MDAyMDM5NzAsIDB4MDAyMDM5NzIsIDB4MDAyMDE1MzAsCisweDAwMjAxOEVFLCAweDAwMjAzOTk0LCAweDAwMDA4MDAwLCAweDAwMUMzNTEwLAorMHgwMDIwM0Q5OCwgMHgwMDIwMThBMiwgMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwKKzB4MUExQzFFMjAsIDB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsIDB4MjYyODJBMkMsCisweDNBM0MzRTQwLCAweDZDNjI1NjQ4LCAweDQxMTEyRjI2LCAweEUyMjA4RjE4LAorMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywKKzB4MDAwOTAwMDksIDB4MDAyMDM0MTIsIDB4MDAyMDMzQzgsIDB4MDAwQkUwMDAsCisweDQwMDA2MkY2LCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAxODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMjg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLAorMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwgMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwKKzB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsCisweDYyRjYwMDBCLCAweDQwMDVDOTAzLCAweDAwMEI0MDA1LCAweEM5MDE2MkY2LAorMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwgMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywKKzB4MjA2Qzc1NEEsIDB4MzIyMDMxMjAsIDB4MjAzODMwMzAsIDB4MzIzQTMxMzIsCisweDM0MzMzQTM4LCAweDAwMDAwMDAwLCAweDAwMDAwRDBBLCAweDAwMDAwMDQzLAorMHg0MjcwNzM3MiwgMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywKKzB4NkU0OTY3N0EsIDB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsCisweDYxNzY2RTQ5LCAweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LCAweDIwNzI2RjIwLAorMHgyMDc5NjU2QiwgMHgwMDIxNDQ0OSwgMHg1MjUwNDU0NSwgMHg1NzIwNEQ0RiwKKzB4NjU3NDY5NzIsIDB4NjQ2MTIwMkMsIDB4MDAzRDcyNjQsIDB4NkM2MTc2MjAsCisweDAwMDAwMDNELCAweDAwMDAwQTBELCAweDQzNUY0RDVBLCAweDQ2NUY0NDRELAorMHg0QzQ0NUY1NywgMHg0OTRFNDk1RiwgMHgwMDAwMDA1NCwgMHg2RTZCNkU1NSwKKzB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsIDB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsCisweDIwM0EzMDUxLCAweDAwMDAwMDIwLCAweDIwM0EzMTUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsIDB4MkI0MzQ3NDEsIDB4NzM2OTZGNEUsCisweDYxNDMyMDY1LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLAorMHg2RjIwNkM2OSwgMHg2OTc0MjA2RSwgMHgwRDBBNjU2RCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsIDB4MDAwMDBEMEEsIDB4NjI3MzU1NzYsCisweDc0NzM3MjVGLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNzU3MzVGLAorMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3MzY1NzI1RiwKKzB4MDAwQTBENkQsIDB4MDAwMDAwNDQsIDB4NDQzODc1NzAsIDB4NzI2MzczNjUsCisweDZGNzQ3MDY5LCAweDNENTg0NTcyLCAweDAwMDAwMDAwLCAweDAwMDAwMDQ3LAorMHgwMDAwMDA0MiwgMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwKKzB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsCisweDY1NEM3MjQ1LCAweDAwMDAwMDZFLCAweDAwMDAwMDQ5LCAweDIwNzQ2RjRFLAorMHg3NTZGNkU2NSwgMHg0OTIwNjg2NywgMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsCisweDAwMDIwMTBBLCAweDAyMDAwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwKKzB4MDAwMjAxMEEsIDB4MDAwMzAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LAorMHgwMTBCMDEwQSwgMHgwMjAwMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsCisweDAxMEIwMTBBLCAweDAxMEYwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwKKzB4NzMyMDQxNDIsIDB4MDAzRDcxNjUsIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLAorMHgwMDA0MDlGQSwgMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwKKzB4ODIwNTA3MDAsIDB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsCisweDQwMDMwNDA1LCAweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLAorMHgwNDAwMDAwNCwgMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwKKzB4NDAwMjgyMDUsIDB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsCisweDAwMDA0MDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0xNTkzNjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jLmRydl9iYV9yZXNlbmQgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3UuYy5kcnZfYmFfcmVzZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNWJjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3UuYy5kcnZfYmFfcmVzZW5kCkBAIC0wLDAgKzEsNzQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REUyOTdGRkMsIDB4RTExNEQ3MjksCisweDFFMTNENDI5LCAweDFFNEM0NzBCLCAweDAwMDlCMDE4LCAweEEwMDM5NTQ1LAorMHgzNjUyRTYwMCwgMHg3NjAxOEQwNCwgMHhDODQwNjBFMiwgMHgyRjAyOERGOSwKKzB4REUyM0Q0MjIsIDB4MDAwOTRFMEIsIDB4NEUwQkQ0MjIsIDB4RDQyMjAwMDksCisweDAwMDk0RTBCLCAweDRGMjY3RjA0LCAweDZFRjZBMDI0LCAweEQxMUY0RjIyLAorMHgwMDA5NDEwQiwgMHg0NDBCRDQxRSwgMHhENTFFMDAwOSwgMHgwMDA5NDUwQiwKKzB4RTFGRkQ3MUQsIDB4RDIxRDYxMUQsIDB4NTAyOTI3MTIsIDB4Q0IwMUQ0MUMsCisweEU1MDFFMUZGLCAweDIyMTIxMjA5LCAweDI0NTIxMjExLCAweEQ2MUFENTE5LAorMHhFMjAwOTcxNCwgMHhENDE5MjU3MiwgMHhENjE5MjYyMCwgMHg0RjI2MjQyMiwKKzB4MjYyMjAwMEIsIDB4REQxOERDMTcsIDB4NEMwQkRFMTgsIDB4NEQwQjAwMDksCisweDRFMEIwMDA5LCAweEFGRjgwMDA5LCAweDI3MTAwMDA5LCAweDAwMDAwNjQwLAorMHgwMDFDMDAxQywgMHgwMDIwMEJDNCwgMHgwMDAwQjM4RSwgMHgwMDIwMjlGOCwKKzB4MDAyMDBGNzIsIDB4MDAyMDJBMDQsIDB4MDAyMDJBMUMsIDB4MDAyMDBGMjAsCisweDAwMjAxMDU2LCAweDAwMjAwQzFDLCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LAorMHgwMDFFMjEyQywgMHgwMDIwMjk5NCwgMHgwMDIwMjUzMCwgMHgwMDIwMjk5QywKKzB4MDAyMDI5QTgsIDB4MDAyMDBFNTAsIDB4MDAyMDIzRTYsIDB4MDAyMDE5MjAsCisweDJGQzYyRjk2LCAweDJGRTYyRkQ2LCAweDdGOTA0RjIyLCAweEUwMjBERThELAorMHhENDhENjFFMCwgMHg2MUUzMEYxNCwgMHg2MjEwNzEwMSwgMHhFMDI0RDc4QiwKKzB4MEYyNDQ3MEIsIDB4NDUwQkQ1OEEsIDB4MjAwODAwMDksIDB4OEYxMTZEMDMsCisweEREODgxRjBBLCAweDY3RDBENDg4LCAweDQxMEJEMTg4LCAweEQyODg2NTdDLAorMHg2OTIwREQ4OCwgMHg2NkMzNkM5QywgMHg0NjA4NDYwOCwgMHg0NjA4MzZDOCwKKzB4MUZEQTNENkMsIDB4MDRGQ0UwMjQsIDB4NjZFMkU1ODAsIDB4NjU1QzYwNEMsCisweDhGMTYzMDUwLCAweEUwMjAyRDYyLCAweEU1MDAwMUZDLCAweERFN0U2NDFDLAorMHgzMjQzNjI1RCwgMHhBMzJDOEIwMSwgMHg2NTVEMDAwOSwgMHgzNkVDNjY1MywKKzB4RTAyQzY3NjAsIDB4Njk1MzBGNzQsIDB4MzlEQzYwN0UsIDB4QUZFRjgwOTQsCisweDIwMDg3NTAxLCAweEUwMjA4QjE0LCAweEU1MDAwMUZDLCAweEEwMEFERTcyLAorMHg2NTVENjQxQywgMHgzOUVDNjk1MywgMHg2NzUzNkM5MiwgMHgzN0RDNjJDMiwKKzB4NzUwNDE3MjEsIDB4NjI1RDFGMkMsIDB4OEJGMjMyNDMsIDB4MkQxMEEzMDksCisweDhCMTc4ODAxLCAweDAxRkNFMDIwLCAweDJENzBFNzAwLCAweDFGRDc2RDFDLAorMHg2MjdEREU2NSwgMHg4QjAxMzJEMywgMHgwMDA5QTJGQiwgMHg2NUUzNjc3RCwKKzB4NzUwNDY2NzMsIDB4MzZFQzZDNzMsIDB4NjQ2MjNDNUMsIDB4NzcwODY5QzIsCisweDI0OTJBRkVGLCAweDhCMTg4ODA0LCAweDAxRkNFMDIwLCAweDJENDBFNDAwLAorMHhERTU5NjcxQywgMHgzMjczNjI0RCwgMHhBMkUyOEIwMSwgMHg2NDREMDAwOSwKKzB4NkNFMzZENDMsIDB4NjVEMjNERUMsIDB4NjE0MzdDMDQsIDB4NjIxMjMxQ0MsCisweDc0MDg2OTUyLCAweEFGRUQyOTI5LCAweDg4MDUyNTkyLCAweEUwMjA4QjE4LAorMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU0QiwgMHg4QjAxMzI3MywKKzB4MDAwOUEyQzcsIDB4Njk0MzY0NEQsIDB4MzlFQzYxRTMsIDB4NzEwNDY1OTIsCisweDNDMUM2QzQzLCAweDZENTI2MkMyLCAweDJEMkI3NDA4LCAweDI1RDJBRkVELAorMHg4QjFCODgzMSwgMHhEOTQyRDI0MSwgMHg3MjA0NjQyMiwgMHg3MjA0NjYyMiwKKzB4NzIwNDY3MjIsIDB4NzJFODZDMjIsIDB4MUYyRTFGNEQsIDB4NzIwNDY0MjIsCisweDcyMDQ2RTIyLCAweDY1MjIyOUUwLCAweDI5NTBEOTNBLCAweERFM0EyRkM2LAorMHg1NUZFNEUwQiwgMHhFMjAwN0YwNCwgMHgyRDIwQTI5QiwgMHg4QjFEODgzMCwKKzB4REUzM0QyMzIsIDB4NzIwNDY1MjIsIDB4NzIwNDYxMjIsIDB4NzIwNDY3MjIsCisweDcyRTg2OTIyLCAweDcyMDQ2NDIyLCAweDcyMDQ2QzIyLCAweDZFMjIyRUMwLAorMHgxRjlGRDYyQywgMHg3RkZDMjZFMCwgMHgwOUZFRTA0MCwgMHgyRjkyREMyQiwKKzB4NjYxMzRDMEIsIDB4RTIwMDdGMDQsIDB4MkQyMEEyN0IsIDB4ODkwMTg4MjgsCisweDAwMDlBMTA5LCAweEUxNDNERTIwLCAweEUwNDA2MkUxLCAweDM2MTc2NjJELAorMHgwRkU2OEYwMywgMHg2NjAzMDJGRSwgMHgzNjE3MjIwMSwgMHhBMEYzOEIwMSwKKzB4RTA0MDAwMDksIDB4RTUwMTA0RkUsIDB4MzA1Njg1NDEsIDB4QTBFQjhCMDEsCisweEUwNDAwMDA5LCAweDA5RkVFNzAxLCAweEIyNjEyRDcwLCAweEUwNDA2NDkxLAorMHhFMTQzMENGRSwgMHhFMDY4NjJDMSwgMHgzNTE3NjUyRCwgMHgwRjU2OEQ2OCwKKzB4MzU2M0U2NDAsIDB4RTYwMDhCMjQsIDB4MEY2NUUwNDgsIDB4QTAyRUUxMUEsCisweDAwMDA3MkMwLCAweDAwMTE3ODAwLCAweDAwMjAyQTIwLCAweDAwMjAwRjcyLAorMHgwMDIwMUZEQywgMHgwMDIwMjlCMCwgMHgwMDIwMkEyNCwgMHgwMDIwMEZCQywKKzB4MDAyMDI5QUYsIDB4MDAyMDI1RDQsIDB4MDAxMTc4MDQsIDB4MDAxMTc4MTAsCisweDAwMjAyOUFDLCAweDAwMjAyOUFELCAweDAwMjAwOTQ4LCAweDAwMjAwOTk0LAorMHg0MTIxNjE1MywgMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwgMHg0NTIxNDUyMSwKKzB4NjA1MzQ1MjEsIDB4NjYwM0M5MDMsIDB4MEY2NUUwNDgsIDB4RTAwNzcxMTgsCisweEUwNDQyMjA5LCAweDY0MUQwRjI1LCAweDY1RjNFMDRDLCAweDBGNDZCMjkxLAorMHgwRUZERTA0OCwgMHgwREZERTA0NCwgMHg2MURENjdFRCwgMHg0MTA4NDcwOCwKKzB4MEYxNkUwNTAsIDB4REQ5NDYwNzMsIDB4NEQwQjA2RkUsIDB4NkUwN0UwMEYsCisweDYwNzMyNkU5LCAweEUwNDAwRjY2LCAweDY1RjMwQ0ZFLCAweDY5MEQ4NUMyLAorMHgwMUZFRTA1MCwgMHg2MDkzNEQwQiwgMHg2MDczMjYwQiwgMHhFMDRDMEY2NiwKKzB4MDRGRUIyNTYsIDB4MDdGRUUwNDAsIDB4NjI3MUUwNjgsIDB4MEY1NjY1MkQsCisweDM1NjNFNjQwLCAweEVEMDA4OTU0LCAweDBGRDVFMDY0LCAweEM5MDM2MDIzLAorMHg0MDAwNDAwOCwgMHg2MTAzNjkwMywgMHgwRjk2RTA1NCwgMHhERTdFRTA1OCwKKzB4MEZGNkVDRkYsIDB4RTA2QzZDQ0MsIDB4NjBDMzBGRTYsIDB4NjI1MzRFMEIsCisweDQyMjE0MjIxLCAweDQyMjE0MjIxLCAweDQyMDA2NzIzLCAweDYxMDczMjdDLAorMHg0MjAwRTA1QywgMHgwRjE2NDUyMSwgMHg0NTIxRTA0MCwgMHg2MDUzMENGRSwKKzB4NDAwOEM5MDMsIDB4N0MwNjMwRkMsIDB4NkUwMzFGQzYsIDB4MUZENTZEMkQsCisweDFGMDRBMDFFLCAweDBGRDZFMDYwLCAweDA1RkVFMDU4LCAweDY0RDNCMjMxLAorMHg2MkUyRTA1QywgMHhFMDU0MDlGRSwgMHgyRTIyMjI5OSwgMHg2NEQzNjFDNCwKKzB4MDFGRTY2MUMsIDB4MDdGRUUwNkMsIDB4NjA2MzQ3MEIsIDB4RTA1ODIyMEIsCisweEIyMDUwNUZFLCAweEUwNjQyRTIyLCAweDdEMDEwMkZELCAweDBGMjU3MjAxLAorMHgwMkZERTA2NCwgMHgzMjYyRTYwNiwgMHhFMDQwOEJEQywgMHg2MjYxMDZGRSwKKzB4MDVGRUUwNDAsIDB4ODU1MTQyMDAsIDB4MzAyQzc1MEMsIDB4NjEwMzcwMUIsCisweDY0RjNFNjAwLCAweEU3MDRBMDA0LCAweDc2MDE2MjU2LCAweDc0MDQyNDIyLAorMHgzMjczNjI2RCwgMHg2NUYzOEJGOCwgMHg2NDFEQjFFMiwgMHgwNkZFRTA0MCwKKzB4NjQ2MUIxOUUsIDB4MDAwOUExNzUsIDB4RDc0REQ0NEMsIDB4NDcwQkUyMDEsCisweEExNkUyRDIwLCAweDg4MjkwMDA5LCAweERFNEE4QjA3LCAweDJEMjBFMjAwLAorMHhCMTZENjZFMiwgMHhBMTY0NjQ2RCwgMHhFMjgxMDAwOSwgMHgzMDIwNjIyQywKKzB4QTBBNzhCMDEsIDB4RTAyNDAwMDksIDB4NjI2QzA2RkMsIDB4NjY2Q0U2ODIsCisweDhCMjEzMjYwLCAweEU0MjQ1MkZBLCAweEQ0M0YyMjQwLCAweDEyNjE1NjQ3LAorMHgxMjYyNTY0OCwgMHgxMjYzNTY0OSwgMHgxMjY0NTY0QSwgMHgxMjY1NTY0QiwKKzB4MTI2NjU2NEMsIDB4MTI2NzU2NEQsIDB4MTI2ODU2NEUsIDB4MTI2OTU2NEYsCisweDE0MjdFMjAwLCAweDE0MjkxNDI4LCAweDE0MkIxNDJBLCAweDE0MkQxNDJDLAorMHgxNDJGMTQyRSwgMHgxRjZDQTEzNSwgMHg2NjZDRTY4MywgMHg4QjA3MzI2MCwKKzB4RTYwMDUyRkEsIDB4RDIyQjIyNjAsIDB4NjIyMkQ2MkMsIDB4MjYyMkExMjksCisweDY2NkNFNjkwLCAweDhCMTgzMjYwLCAweEU2MDA1MkZBLCAweEQyMjgyMjYwLAorMHg2MDIyRTYwNSwgMHgyMjAyQ0IyMCwgMHgyMjYyRDIyNiwgMHgyMjYyRTYwMCwKKzB4NDYwQkQ2MjUsIDB4RDIyNTAwMDksIDB4MDAwOTQyMEIsIDB4RTYwMUQyMjQsCisweEQyMjQyMjYyLCAweEExMEM0NjE4LCAweEU2QjAyMjYyLCAweDMyNjA2NjZDLAorMHhENTE4OEIyMiwgMHhEMjE2RDQyMCwgMHg3NTA0NkQ1MiwgMHg2RTUyNDIwQiwKKzB4NDIwQkQyMUUsIDB4RDQxRTY0RDMsIDB4NDUwQkQ1MTEsIDB4RDIxQjAwMDksCisweDY0RTM0MjBCLCAweEQ2MEVENDFCLCAweDAwMDk0NjBCLCAweEU2MDBFNTA0LAorMHgzMjUzNjI2RCwgMHhBMEVDOEIwMSwgMHg2NjZEMDAwOSwgMHgzMjZDNjJEMywKKzB4MjJFMDc2MDEsIDB4NEUxOUFGRjQsIDB4RDIxNEQ0MTMsIDB4RDQxNDY1NDIsCisweDAwMDk0MjBCLCAweDAwMDlBMERELCAweDAwMjAyNDhDLCAweDAwMjAyQTQ0LAorMHgwMDIwMEY3MiwgMHgwMDExNzgwNCwgMHgwMDIwMjUzOCwgMHgwMDIwMjk5NCwKKzB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4MDAyMDEwNTYsIDB4MDAyMDBDMUMsCisweDAwMUUyMTJDLCAweDAwMUMzRDMwLCAweDAwMjAyQTVDLCAweDAwMjAwRkI0LAorMHgwMDIwMkE3MCwgMHgwMDIwMkE3OCwgMHgwMDExNzgwMCwgMHgwMDIwMEZCQywKKzB4MDAyMDJBN0MsIDB4RDZBRUQ0QUQsIDB4NjI2MkUwNDAsIDB4NzYwNDY1NDIsCisweDI0NTIzNTJDLCAweDYyNjI2NTYzLCAweDc1MDQ1NjQxLCAweDE0NjEzNjJDLAorMHg2MjUyNjY1MywgMHg3NjA4NTU0MiwgMHgxNDUyMzUyQywgMHg1NTQzNjI2MiwKKzB4MzUyQzc2RUMsIDB4NjU2MzE0NTMsIDB4NTY0NDYyNjIsIDB4MzYyQzc1MTAsCisweDY2NTMxNDY0LCAweDU1NDU2MjUyLCAweDM1MkM3NjEwLCAweDY1NjIxNDU1LAorMHhENjlDNTI0NiwgMHgxNDI2MzI1QywgMHg1NTQ3NjI2MiwgMHgzNTJDNzYwNCwKKzB4NjI2MjE0NTcsIDB4NzYwNDU1NDgsIDB4MTQ1ODM1MkMsIDB4NjI2MjY1NjMsCisweDc1MDQ1NjQ5LCAweDE0NjkzNjJDLCAweDU2NEE2MjUyLCAweDM2MkM3NTA0LAorMHg2NjUzMTQ2QSwgMHg1NTRCNjI1MiwgMHgzNTJDNzYwNCwgMHg2MjYyMTQ1QiwKKzB4NzYwNDU1NEMsIDB4MTQ1QzM1MkMsIDB4NjI2MjY1NjMsIDB4NzUwNDU2NEQsCisweDE0NkQzNjJDLCAweDYyNTI2NjUzLCAweDc2MDQ1NTRFLCAweDE0NUUzNTJDLAorMHg1MjRGNjU2MiwgMHgzMjVDRDY4NCwgMHg2MjYyMTQyRiwgMHg3Njk0MDU0RSwKKzB4MDQ1NjM1MkMsIDB4NjI2M0UwNDQsIDB4MDU0RTY2NjIsIDB4MzU2QzcyNDQsCisweEUwNDgwNDU2LCAweDA1NEU2NjIyLCAweEQ2N0MzNTZDLCAweDYyNjIwNDU2LAorMHgwNTRFRTA1NCwgMHgzNTJDNDIyOSwgMHg3NjA0MDQ1NiwgMHhFMDU4NjI2MiwKKzB4NDIyOTA2NEUsIDB4NTJGQTM2MkMsIDB4RTYzODA0NjYsIDB4RTA0NDIyNjAsCisweEUwNDgwNjRFLCAweDY2NDIxMjYxLCAweDU2NDExMjYyLCAweDU2NDIxMjYzLAorMHg1NjQ1MTI2NCwgMHg1NjQzMTI2NSwgMHg1NjQ2MTI2NiwgMHgwNjRFMTI2NywKKzB4MTI2OEUwNDAsIDB4RTA1MDA2NEUsIDB4NTY0NDEyNjksIDB4MDY0RTEyNkEsCisweDEyNkJFMDRDLCAweEUwNTQwNjRFLCAweDA2NEUxMjZDLCAweDEyNkRFMDU4LAorMHhFMDQ0MDY0RSwgMHhFMjAwMTI2RSwgMHhFMDQ4MDQyNiwgMHgxNDIxMjQyMiwKKzB4MTQyNTE0MjIsIDB4MTQyNjE0MjMsIDB4RTA0MDA0MjYsIDB4RTA1MDA0MjYsCisweDA0MjYxNDI0LCAweDA0MjZFMDRDLCAweDA0MjZFMDU0LCAweDA0MjZFMDU4LAorMHg3RjcwMUY2QywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2OUY2MDAwQiwKKzB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTcsIDB4ODkwODMxMjcsCisweEQ1NTBENDRGLCAweDQ1MEJFMDAxLCAweDY3MDc2NjQyLCAweEEwMEMyNjc5LAorMHhFMjNGMjQ2MiwgMHg4OTA4MzEyNywgMHhENjRBRDc0OSwgMHhFMDAxNzFFMCwKKzB4NTU3MTQ2MEIsIDB4MjUyOTYyMDcsIDB4NEYyNjE3NTEsIDB4MDAwOTAwMEIsCisweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTE1LCAweDg5MDczMTI3LAorMHhEMjQwRDQzRiwgMHg0MjBCNjY0MiwgMHgyNjBCRTAwMSwgMHgyNDYyQTAwQiwKKzB4MzEyN0UyM0YsIDB4RDczQTg5MDcsIDB4NTU3MUQ2M0EsIDB4NDYwQjcxRTAsCisweDI1MEJFMDAxLCAweDRGMjYxNzUxLCAweDAwMDkwMDBCLCAweDQ2MThFNjQwLAorMHhENTM1NDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhFNjgwMDAwOSwKKzB4NDYyODQ2MTgsIDB4NjI1MkQ1MzAsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsCisweEUyMDBBMDAxLCAweDMyNDI3MjAxLCAweDAwMEI4QkZDLCAweEU2ODAwMDA5LAorMHg0NjI4NDYxOCwgMHg2MjUyRDUyOSwgMHg4QkZDMjI2OCwgMHgwMDA5MDAwQiwKKzB4NEYyMjJGRTYsIDB4NkU1MzdGRkMsIDB4MkY0MkJGRjEsIDB4RDYyNDYxRTIsCisweDE2MTVFMjgwLCAweDQyMTg1NEUxLCAweDU1RTIxNjQ2LCAweDE2NTc0MjI4LAorMHg2RUYyNTdFMywgMHgyRTJCMTY3OCwgMHg3RjA0MjZFMiwgMHhBRkNFNEYyNiwKKzB4MkZDNjZFRjYsIDB4MkZFNjJGRDYsIDB4REQxOTRGMjIsIDB4QkZENjZDNTMsCisweEJGQkI2RTQzLCAweEJGRDIyREUyLCAweDUxRDUwMDA5LCAweDU0RDYyQzEyLAorMHg1NUQ3MUM0MSwgMHg1NkQ4MUM1MiwgMHg0RjI2MUM2MywgMHg2REY2NkVGNiwKKzB4NkNGNjAwMEIsIDB4RTYwMDYxNjMsIDB4NDEwOUEwMDQsIDB4NzYwMTYyNTYsCisweDc0MDQyNDIyLCAweDhCRjkzNjEyLCAweDAwMDkwMDBCLCAweDAwMjAyNTM4LAorMHgwMDFDMzZBMCwgMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwKKzB4MDAxQzM3MDQsIDB4MDAyMDI0OEMsIDB4MDAxQzM3M0MsIDB4MDAxQzM3MDAsCisweDAwMUMzNzBDLCAweDAwMDlBMTA5LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RTYzNkQ3MywgMHg2QzUzQjAxNiwgMHg2NEMzNTdGNCwgMHhCMDI5NjVFMywKKzB4QjAzRDY2RDMsIDB4QjA2RDAwMDksIDB4QjA3MTAwMDksIDB4QjA3NTAwMDksCisweEIwOEEwMDA5LCAweEIwOEQwMDA5LCAweDRGMjYwMDA5LCAweDZERjY2RUY2LAorMHg2Q0Y2QTBCNCwgMHgzNDEyRDE5MCwgMHhENjkwMDUyOSwgMHgyNjUwRDc5MCwKKzB4Mjc0MjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZENzMsCisweDZDNTNCRkYwLCAweDY0QzM1N0Y0LCAweDY2RDM2NUUzLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHhEMTg3MkZFNiwgMHg2NjEyNkU2MywgMHg5MkJDNDQxOCwKKzB4NDQwODQ1MjgsIDB4NDUwMDI2MjksIDB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsCisweDIxNjI0NzA4LCAweEQxODA0NzA4LCAweDIxNzIyN0VCLCAweDZFRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAxREU3RCwgMHhCRkFCRTQwQSwgMHg2MkUzMkUxMiwKKzB4RTEwMDcyNkMsIDB4MjIxMkU0MDEsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweDIyNDIyMjEyLCAweEU1MDNFNzMwLCAweDIyMTJFNDBBLCAweDIyMTIyMjEyLAorMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjI3MjIyMTIsIDB4MjIxMjIyNTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweEJGODUyMjEyLCAweEU2MDAxMjFBLCAweDRGMjYyRTYyLAorMHg2RUY2MDAwQiwgMHhFMTAxRDI2NiwgMHgyMjEyRTQ0MSwgMHgyMjQyMDAwQiwKKzB4RDQ2NUQxNjQsIDB4MjE2MkU2MDUsIDB4MjQ2MjAwMEIsIDB4RDI2NEQ1NjMsCisweDg4MDE2MDUwLCAweEQ0NjM4QjA3LCAweDYwNDA5NjY4LCAweDhCMDk4ODAxLAorMHhBMDA3OTY2NSwgMHhFNjAwMDAwOSwgMHgyMjYyRDQ1RSwgMHg4ODAxNjA0MCwKKzB4RTYwNDhCMDAsIDB4QUY1REU0MEEsIDB4RDI1QjIyNjIsIDB4RTQwQUU2MDEsCisweDIyNjJBRjU4LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweERDNTc0RjIyLAorMHg2MEMyRUQwMCwgMHhDQjAxRUI2NCwgMHg2MEMyMkMwMiwgMHhBMDA4QzkwMSwKKzB4M0RCMjZFMDMsIDB4NjBDMjg5MDcsIDB4QzkwMUU0MEEsIDB4NkUwM0JGNDIsCisweDJFRTg3RDAxLCAweDNEQjI4QkY1LCAweEQ0NEQ4QjAzLCAweDQyMEJEMjRELAorMHhFNDBBMDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2QUYzMiwKKzB4OEYwMTQ0MTEsIDB4NjA0MzYwNEIsIDB4MDAwOTAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEVEMDBEQzQwLCAweEVCNjQ2MEMyLAorMHgyQzAyQ0IwMiwgMHgyRjAyNjBDMiwgMHhBMDA5QzkwMiwgMHgzREIzNkUwMywKKzB4NjBDMjg5MDgsIDB4MkYwMkU0MEEsIDB4QkYxM0M5MDIsIDB4N0QwMTZFMDMsCisweDhCRjQyRUU4LCAweDhCMEIzREIzLCAweEQyMzZENDM3LCAweDRGMjY3RjA0LAorMHg2REY2NkVGNiwgMHg0MjJCNkNGNiwgMHgxRkZGNkJGNiwgMHgwM0M0MDM0MCwKKzB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4RDUyRjZCRjYsCisweDYwNTI1NjUxLCAweDAwMEI0NjI4LCAweDJGQjYzMDZDLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg0RjAyNEYxMiwgMHg2RTQzQkZGMSwgMHhEQzI4NkIwMywKKzB4QkZFQ0REMjgsIDB4MzBCODAwMDksIDB4MDYwQTNDMDUsIDB4NDYwOTQ2MDksCisweDNENjU0NjAxLCAweDQyMDkwMjBBLCAweDQyMDk0MjA5LCAweDhCRjAzMkUyLAorMHg0RjE2NEYwNiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwKKzB4NEYyMjJGRTYsIDB4RTEwMkRFMUMsIDB4RTQwM0U1MDAsIDB4QkZENDJFMTIsCisweEU2MDYyRTUyLCAweEU3MDA0NjE4LCAweDJFNjJFNDAzLCAweDRGMjYyRTcyLAorMHg2RUY2QUZDQiwgMHgwMDA5MDAwQiwgMHgwMDI1RTcyMCwgMHgwMDIwMkMzQywKKzB4MDAyMDI5OTgsIDB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU4MzAsCisweDAwMUM2MjY4LCAweDAwMUM1OUE0LCAweDAwMUM2MzlDLCAweDAwMjAyOUFELAorMHgwMDFDNTgwNCwgMHgwMDIwMjlBQywgMHgwMDFDNTgxQywgMHgwMDFDNTg2MCwKKzB4MDAyMDJBOTAsIDB4MDAyMDBGNzIsIDB4MDAyMDJBQTgsIDB4MDAxQzEwNDAsCisweENDQ0NDQ0NELCAweDEwNjI0REQzLCAweDAwMUQ0MDA0LCAweDJGOTYyRjg2LAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFNDAwN0ZFMCwKKzB4NDUyOEU1MTAsIDB4Njc0MzZDNDMsIDB4RTEwOEEwMEYsIDB4NjA0MzY0NEQsCisweDBGNTY0MDA4LCAweEVFMDA2MEMzLCAweDgxNTEyNUMxLCAweDgxNTM4MTUyLAorMHgxNTczMTVFMiwgMHg3NTE0MTVFNCwgMHg2MjRENzQwMSwgMHg4QkVEMzIxMywKKzB4REE3MjUxRjEsIDB4MUExMTU0RjIsIDB4RDE3MTJBMTIsIDB4NTZGNDU1RjMsCisweDU4RjY1N0Y1LCAweDIxNDIxMTQxLCAweDExNTIxMTUzLCAweDExNjQxMTY1LAorMHgxMTc2MTE3NywgMHgxMTg4MTE4OSwgMHhEOTZBNkRGMiwgMHhEQjZBNTJGNywKKzB4MjlEMjE5RDEsIDB4MkIyMjFCMjEsIDB4RDg2OEVCNDUsIDB4RTlCOEVBNTAsCisweDRBMDg0QjA4LCAweEEwMjA2OTlDLCAweDZFRURFRTAwLCAweDYxRTM2REUzLAorMHg0MTA4NEQwOCwgMHgzMUVDM0RFQywgMHg0MTA4NEQwOCwgMHg2MEMzM0Q4QywKKzB4RDc1RjQxMDgsIDB4ODFEMTJEQzEsIDB4NDEwODYwQTMsIDB4NjBDMzgxRDIsCisweEUyMDAzMTdDLCAweDgxRDMzNDkyLCAweDFEMTMxREQyLCAweDhEMDFENDU2LAorMHhENDUyMUQyNCwgMHg2NUQzQjAzQywgMHg2NEVEN0UwMSwgMHg4QkRDMzRCMiwKKzB4REI1NEQxNEUsIDB4RDI0RjY1MTIsIDB4MUI1MTQ1MjksIDB4RDE0QzY0MTIsCisweDJCNzI2NzRELCAweEQ2NTA2NzIyLCAweDFCNzM0NzI5LCAweDJGRDI2OTIyLAorMHgxQjgyNjg5RCwgMHgyNjkyNjkxMiwgMHgxNkEyNUExMiwgMHhEQTQ2NUIxNCwKKzB4NUMxNjE2QjQsIDB4NUQxODE2QzYsIDB4NkVBMjE2RDgsIDB4N0YyMDE2RUEsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHg2NjQyNjhGNiwgMHhDODAzNjA2MSwgMHhFNTAwOEQwNCwgMHhDOTAzNjA2MSwKKzB4OEIwMzg4MDIsIDB4NjU2MzUyNjIsIDB4MjQxMjUxMjQsIDB4NjA1MzAwMEIsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDYyNTM2RTUzLCAweDZENDNFNTUwLAorMHg0NTA4RTQwMCwgMHhFMTAxQTAwMSwgMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwKKzB4NjA1MzgxMjMsIDB4NTZFMjgxMjIsIDB4OEJGNTM2MjAsIDB4MTZFNEQyMkYsCisweEU2MTQ2NEYzLCAweDY1RTM0MjBCLCAweEU0RkM2NUUxLCAweDJFNTEyNTQ5LAorMHg2NUYzNjFGMSwgMHgyRjExMjE0OSwgMHhEMTI4NTREMSwgMHhFNjE0NDEwQiwKKzB4NjA3MTU3RDEsIDB4MjcwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDY2NTM2RTUzLAorMHg2RDQzRTVGQywgMHgyMDU5NjA2MSwgMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwKKzB4MTJFNDhCMDYsIDB4MzFFMDUxRTIsIDB4NTJEMThCMDQsIDB4MUUyMkEwMDIsCisweDU2NjRBRkYwLCAweDY0RjNEMjE1LCAweDQyMEJFNjE0LCAweDY3RTE2NUUzLAorMHgyNzE5RTFGQywgMHg2N0YxMkU3MSwgMHgyNzE5NTREMSwgMHg2NUYzRDEwRiwKKzB4NDEwQkU2MTQsIDB4NTJEMTJGNzEsIDB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsCisweDRGMjY3RjE0LCAweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMjAyNTlDLAorMHgwMDIwMjVBNCwgMHgwMDIwMjU5NCwgMHgwMDIwMjVDQywgMHgwMDEwMDBBMCwKKzB4MDAxMDE2NDAsIDB4MDAxRTIxMDgsIDB4MDAxQzNEMDAsIDB4MDAyMDA5MDQsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweDYwMjJEMjI1LAorMHg4RDM1QzgwMywgMHhERTI0MkYwMSwgMHhEQjI1REMyNCwgMHhFRDAxQTAxNiwKKzB4QzkwMzYwNjEsIDB4ODkxNTg4MDEsIDB4RDEyMkQ0MjAsIDB4MDAwOTQxMEIsCisweDY1MDM1NjAzLCAweEM4MjA4NTYxLCAweEUwNTA4OTAzLCAweDcyMDEwMkJFLAorMHhEMjFEMEIyNiwgMHg2NEUzNDIwQiwgMHgyMUQyRDExQywgMHg2NkMyNTJDMSwKKzB4OEJFNTM2MjAsIDB4REQxQUVFMDEsIDB4NEUxOEEwMEUsIDB4QzkwMzYwNjEsCisweDg5MEQ4ODAxLCAweEQ3MTNENDE2LCAweDQ3MEJEQjE2LCAweEQ0MTYwMDA5LAorMHg2NTAzNEIwQiwgMHgyMUUyRDExMSwgMHg2NkQyNTJEMSwgMHg4QkVEMzYyMCwKKzB4QzgwNDYwRjEsIDB4RDIxMTg5MDcsIDB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsCisweDQyMkI2Q0Y2LCAweDdGMDQ2QkY2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHgwMDFFMjEwMCwgMHgwMDIwMjVBNCwgMHgwMDIwMjU5QywKKzB4MDAyMDI1MzgsIDB4MDAyMDBENDIsIDB4MDAyMDBEQzQsIDB4MDAxQzNEMzAsCisweDAwMjAyNTk0LCAweDAwMjAwRDYwLCAweDAwMjAyNUNDLCAweDAwMjAwMTAwLAorMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwgMHgwMDAwMTI2NiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4RDYyQTdGRkMsIDB4MjY0MjY0NEMsCisweEM4MjA1MDY2LCAweDJGMDI4REZDLCAweDdGMDQwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwKKzB4NjQ0Q0JGRUEsIDB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweEEwMDE2Q0Y2LCAweDc2MDE2NjQzLCAweDIyMjg2MjYwLCAweDM2NDg4QkZCLAorMHg2NTYzQUZFNCwgMHg2MjUzMkZFNiwgMHg2NzUzNzUwNywgMHhFRTBBRTEwOCwKKzB4QzkwRjYwNDMsIDB4MzBFMjQ0MDksIDB4NDQwOTY1MDMsIDB4RTYzNzhEMDEsCisweDM2NUNFNjMwLCAweDI3NjA0MTEwLCAweDc3RkY4RkYyLCAweDgwMjhFMDAwLAorMHg2RUY2MDAwQiwgMHhFMDAwMDAwQiwgMHhFMDAwMDAwQiwgMHg0RjIyMkZFNiwKKzB4NjI1MzdGRUMsIDB4NjVGMzZFNDMsIDB4NjQyM0JGREMsIDB4NjRFM0JGRDEsCisweDY0RjNCRkNGLCAweEJGQ0NENDA0LCAweDdGMTQwMDA5LCAweDAwMEI0RjI2LAorMHgwMDAwNkVGNiwgMHgwMDFDMDAwNCwgMHgwMDIwMkFDNCwgMHhFMTEwRDVBMSwKKzB4RTY0MDYwNTAsIDB4MjUwMEM5RkQsIDB4RTBGRjc1RTksIDB4ODA1MTY0NTMsCisweDgwNTM4MDUyLCAweDgwNTY4MDU1LCAweDI1MTA3NUVGLCAweEUxRUY2MjUwLAorMHgyMjE5RTAwMSwgMHhFNzIwMjUyMCwgMHgyNDYwODA1MiwgMHgyNTcwMDAwQiwKKzB4RTRGREQ1OTUsIDB4RTcwMjYxNTIsIDB4MjUxMjIxNDksIDB4NzQwMTYwNTIsCisweDI1MDJDQjAxLCAweEQxOTE2NjUyLCAweDI1NjIyNjQ5LCAweDkyQzQ2MDEyLAorMHgyMTAyQ0IwOCwgMHhDOUNGNjAxMiwgMHg2MDEyMjEwMiwgMHgyMTAyQ0IwMywKKzB4MDAwQjExNzIsIDB4NEYyMjExMjMsIDB4RDc4QUQ1ODksIDB4RDQ4QkQyOEEsCisweEU2MDBFMTAwLCAweDI3MTEyNTExLCAweEJGQkYyMjEwLCAweEFGRDcyNDYxLAorMHg2NjRDNEYyNiwgMHg0NjAwRDI4NiwgMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwKKzB4NjU0QzI2MDAsIDB4NDUwMEQyODIsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsCisweDI1NjAwMDBCLCAweEQyN0Y2NjRDLCAweDM2MkM0NjAwLCAweENCMTA2MDYwLAorMHgyNjAwMDAwQiwgMHhEMjdCNjU0QywgMHgzNTJDNDUwMCwgMHhFMUVGNjY1MCwKKzB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyNzUsIDB4NjA2MDM2MkMsCisweDAwMEJDQjA4LCAweDY1NEMyNjAwLCAweDQ1MDBEMjcxLCAweDY2NTAzNTJDLAorMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwgMHhEMjZFNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI2QTY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDYyNEMyNTYwLCAweDQyMDBENjY0LAorMHg2MDIwMzI2QywgMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwKKzB4RDY2MDYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsIDB4NDAyMTQwMjEsCisweDAwMEI0MDIxLCAweDY0NEM2MDBDLCAweDc0RkZEMTVCLCAweDYyNDAzNDFDLAorMHg2MDJDMDAwQiwgMHg2NDRDRDE1OSwgMHg2MjQwMzQxQywgMHg2MDJDMDAwQiwKKzB4NEYyMjJGRTYsIDB4RTYwQTY1NUMsIDB4OEQxNTM1NjcsIDB4QkZFQTZFNDMsCisweDY0MEM2NDUzLCAweDg4MDE2MEVDLCAweEUwMEY4QjAyLCAweDI0MDlBMDAyLAorMHg0NDA5NDQwOSwgMHhFNjBBNjI0QywgMHg4OTA1MzI2MywgMHg2NDRDQkZFMiwKKzB4NjAyMzYyMEMsIDB4OEIwMEM4ODAsIDB4NjAyM0UyMDAsIDB4MDAwQjRGMjYsCisweDRGMjI2RUY2LCAweDYwNjJENjQ2LCAweDhCMDM4ODAxLCAweDAwMDlCMjQxLAorMHgwMDA5QTAwMywgMHhFNjQwRDI0MywgMHhENjQzMjI2MCwgMHg0RjI2RTIwMCwKKzB4MjYyMjAwMEIsIDB4RDYzRTRGMjIsIDB4ODgwMjYwNjIsIDB4QjI4QjhCMDEsCisweEQ2M0QwMDA5LCAweDRGMjZFMjAwLCAweDI2MjIwMDBCLCAweEQ0MzlENTM4LAorMHhFNzAxRTEwMCwgMHgwMDBCMjUxMiwgMHgwRkZGMjQ3MCwgMHhFNjA0RDIzNSwKKzB4MjI2MDAwMEIsIDB4RDQzNTRGMjIsIDB4NDEwQkQxMzUsIDB4RDUyNTAwMDksCisweDY2NTBFMUZELCAweDI2MTlEMjMzLCAweDI1NjBFNzAwLCAweDAwMEI0RjI2LAorMHg0RjIyMjI3MCwgMHhEMTJFRDQzMCwgMHgwMDA5NDEwQiwgMHhFN0ZCRDUxRCwKKzB4MjY3OTY2NTAsIDB4MDAwQjRGMjYsIDB4NEYyMjI1NjAsIDB4RDEyOEQ0MkIsCisweDAwMDk0MTBCLCAweEU3RjdENTE3LCAweDI2Nzk2NjUwLCAweDAwMEI0RjI2LAorMHhENTE0MjU2MCwgMHg2MjUwOTQyNSwgMHgwMDBCMjI0OSwgMHhENTExMjUyMCwKKzB4NjI1MEU0QkYsIDB4MDAwQjIyNDksIDB4NEYyMjI1MjAsIDB4ODUyMkQyMjAsCisweDIwMDg2MDBELCAweDg4MDE4OTExLCAweDg4MDM4OTNDLCAweDg4MDU4OTNFLAorMHg4ODA2ODk0MCwgMHg4ODA4ODk0NiwgMHg4ODA5ODk0QywgMHg4ODBBODk1MiwKKzB4ODgwQjg5NTgsIDB4QTA2NTg5NUUsIDB4QjA2NzAwMDksIDB4QTA2MjAwMDksCisweEZGN0Y2MDBDLCAweDAwMUUxMDI4LCAweDAwMUUyMTQ4LCAweDAwMUUxMTA4LAorMHgwMDIwMjlEQywgMHgwMDIwMjlERSwgMHgwMDIwMjlFOSwgMHgwMDIwMjlDMCwKKzB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMzAsIDB4MDAxRTEwOTAsCisweDAwMjAyOUU0LCAweDAwMUUxMDBCLCAweDAwMjAyOUUwLCAweDAwMjAyQUM4LAorMHgwMDIwMEY3MiwgMHgwMDIwMjlFOCwgMHgwMDIwMkFENCwgMHgwMDIwMkFFNCwKKzB4MDAyMDI5QjQsIDB4MDAwOUIwNEMsIDB4NjAwQ0EwMzUsIDB4MDAwOUIwNTYsCisweDYwMENBMDMxLCAweDYyNjBENjdDLCAweDhCMkIyMjI4LCAweDAwMDlCMDYyLAorMHg2MDBDQTAyOSwgMHg2MjYwRDY3OCwgMHg4QjIzMjIyOCwgMHgwMDA5QjA2QSwKKzB4NjAwQ0EwMjEsIDB4NjI2MEQ2NzQsIDB4OEIxQjIyMjgsIDB4MDAwOUIwQjQsCisweDYwMENBMDE5LCAweDYyNjBENjcwLCAweDhCMTMyMjI4LCAweDAwMDlCMEJBLAorMHg2MDBDQTAxMSwgMHg2MjYwRDY2QywgMHg4QjBCMjIyOCwgMHgwMDA5QjExQSwKKzB4NjAwQ0EwMDksIDB4NjI2MEQ2NjgsIDB4OEIwMzIyMjgsIDB4MDAwOUIxMzIsCisweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEQyNjREMTYzLAorMHhENTY0ODQxMiwgMHg0MDAwQzkwRiwgMHhENzYzMDEyRCwgMHg2MTFDRTQwMywKKzB4RDY2MkUyMEYsIDB4MjcxMjI1NDAsIDB4RTAwMTI1MjAsIDB4MjYwMjAwMEIsCisweEU2MDFEMjVBLCAweDMwNjY4NTIzLCAweEUwMDA4RDA2LCAweEUwMDBEMjU4LAorMHg4MTIyRDY1QSwgMHgyNjAyRTAwMSwgMHgwMDA5MDAwQiwgMHg4NTIzRDI1MywKKzB4MjAwODYwMEQsIDB4ODgwMTg5MDUsIDB4RDY1NThCMEEsIDB4Q0IwMTYwNjAsCisweEQ2NTIyNjAwLCAweEUxMDFENDRFLCAweDI2MTJFMDAxLCAweDgxNDIwMDBCLAorMHhFMDAwMDAwQiwgMHhFNTAxRDE0OSwgMHg0NTE4ODUxMywgMHgzNDUzNjQwRCwKKzB4OEQwNTY2MDMsIDB4RDI0QkUwMDAsIDB4RTAwMUQ1NDgsIDB4MjUwMjIyNjAsCisweDAwMDkwMDBCLCAweEQxNDE0RjIyLCAweDY1MEQ4NTEzLCAweDQ0MTk2NDUzLAorMHg2NzJFNjI0OSwgMHg2MDJDMjI3RCwgMHg4OTA5ODgwMSwgMHg4OTBDODgwMiwKKzB4ODkxMDg4MDMsIDB4ODkyNjg4MDYsIDB4ODkyOTg4MDcsIDB4MDAwOUEwMzgsCisweEQ2M0VENTNELCAweEEwMjdFMjEyLCAweDYyNUMyNjUyLCAweDhCMkYyMjI4LAorMHhBMDFFRDYzQiwgMHg2MDVDNjI2MiwgMHg4OTA1MjAwOCwgMHg4OTA4ODgxMCwKKzB4ODkwQjg4MjAsIDB4MDAwOUEwMjQsIDB4RDYzNEQ0MzYsIDB4QTAxM0UyMDQsCisweEQ3MzUyNjQyLCAweEUyMENENjMxLCAweDI2NzJBMDBFLCAweEQ2MkZENTMzLAorMHhBMDA5RTIxOCwgMHhENDMyMjY1MiwgMHhFMjBBRDYyQywgMHgyNjQyQTAwNCwKKzB4RDYyQUQyMzAsIDB4RTIyRTI2MjIsIDB4RDQyRjg1MTUsIDB4MzI3NzY3MEQsCisweDhGMDEyNDIxLCAweDI0NTE2NTAzLCAweDAwMDlCMERCLCAweEUwMDFBMDAxLAorMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwgMHhFMTAxRDYxQSwgMHgyNjEwRDQyNywKKzB4RDcxOTY1NDEsIDB4NjU1REQxMTksIDB4RTAwMUUyMEYsIDB4MjYyMDI3NTIsCisweDIxMDIwMDBCLCAweDRGMjIyRkU2LCAweDg1MjNEMjEwLCAweDI0NDg2NDBDLAorMHhENjFFOEIwOCwgMHhFMjAwRDUxMiwgMHg4NDUxMjYyMSwgMHgyMDQ5OTQxMiwKKzB4ODA1MUEwNTAsIDB4NjBFMERFMEUsIDB4OEQzNUM4NDAsIDB4MzQyN0UyMDEsCisweEQxMTY4OTRDLCAweDQyMEJEMjE2LCAweEQ1MTYyMTQxLCAweENCMDQ2MDUyLAorMHgyNTAyQTAzNSwgMHgwMDAwRkY3RiwgMHgwMDIwMjlFOSwgMHgwMDIwMjlCNCwKKzB4MDAyMDI5QzAsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsIDB4MDAyMDI5RTAsCisweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMjAyQzQwLCAweDAwMjAyOUM4LAorMHgwMDIwMjlEMCwgMHgwMDIwMkNBRSwgMHgwMDIwMkNCMiwgMHgwMDIwMkNCRSwKKzB4MDAyMDJDRDYsIDB4MDAyMDJDRTAsIDB4MDAyMDI5Q0MsIDB4MDAyMDI5REEsCisweDAwMjAxREI2LCAweDAwMUUxMTA4LCAweDg5MTczNDI3LCAweEQ3OTREMjkzLAorMHgyMjQxNDcwQiwgMHhFNUZCRDY5MywgMHgyMTU5NjE2MiwgMHg4NEUxMjYxMiwKKzB4QjBGRkNCODAsIDB4NjBFMDgwRTEsIDB4Q0IwNEQ2OEYsIDB4NjA2MDJFMDAsCisweDI2MDBDOTNGLCAweEUwMDFENjhELCAweDI2MDJBMDAxLCAweDRGMjZFMDAwLAorMHg2RUY2MDAwQiwgMHg2MDYwRDY4QSwgMHg4OTE5Qzg4MCwgMHg2MDIxRDI4MywKKzB4OEIxNTg4MDEsIDB4RTUwMUQyODcsIDB4MzA1Njg1MjQsIDB4RDE4Njg5MTAsCisweEQ0ODZFMjAzLCAweDY1NDEyMTIwLCAweDY1NURFMDBCLCAweEQ1ODQwNjU2LAorMHhFNzAyRTQwRiwgMHgyNTcxMjE0MCwgMHhFMDAxRDc3QywgMHgyNzAyMDAwQiwKKzB4RTAwMDAwMEIsIDB4NEYyMjJGRTYsIDB4ODRFMURFN0UsIDB4ODkzNEM4ODAsCisweDg1NTRENTc4LCAweDhGMzAyMDA4LCAweEQ3N0I2MTAzLCAweDY2NzI4NTUzLAorMHg2NTBDNjQwMywgMHg2MjBDODU2NiwgMHg4QjI2MzUyMCwgMHhENzczRDY3NywKKzB4NjQ0QzY1MUMsIDB4Mjc0MTI2NTEsIDB4Qzg0MDYwRTAsIDB4RDI3NDg5MDcsCisweDAwMDk0MjBCLCAweDYwNjJENjY3LCAweEEwMDhDQjA0LCAweEQxNjQyNjAyLAorMHgwMDA5NDEwQiwgMHhFNUZCRDY2MywgMHgyNDU5NjQ2MiwgMHhCMEExMjY0MiwKKzB4RDU2MjAwMDksIDB4MjUyMkUyMDEsIDB4RDc1RjYwRTAsIDB4MkUwMENCMDQsCisweEM5M0Y2MDcwLCAweEEwMDEyNzAwLCAweEUwMDA2MDIzLCAweDAwMEI0RjI2LAorMHgyRkE2NkVGNiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhFMjQwREE1QywKKzB4REM1OTY2QTEsIDB4MzEyMzYxNkQsIDB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsCisweDRFMjEzNkQ4LCAweDRFMjEyQTYxLCAweERCNUJENDVBLCAweEU3MDBBMDBGLAorMHg3NzAxNjZCMiwgMHg3MTAyNjE2MywgMHg2NTYxMkIxMiwgMHg3MTAyNjYxMywKKzB4NjI2MTJCMTIsIDB4NjIyRDY1NUQsIDB4MzI1QzQyMjgsIDB4NjI3QzI0MjIsCisweDhCRUQzMkUzLCAweEM5MDM2MEQzLCAweDhCMTA4ODAzLCAweEVEMDc2RUIyLAorMHg3MTAyNjFFMywgMHg2NzEzMkIxMiwgMHg2MkUxNzEwMiwgMHg2NTcxMkIxMiwKKzB4NjU1RDYyMkQsIDB4MzUyQzQ1MjgsIDB4QTAwQzJDRDAsIDB4ODgwMjI0NTIsCisweEEwMDM4QjAxLCAweDg4MDFFMjAzLCAweEUyMDE4QjA1LCAweDY2QjIyQzIwLAorMHg2NzdENjc2MSwgMHhFQjBGMjQ3MiwgMHg2REExMkNCMCwgMHg4QjA1MkREOCwKKzB4RDQzMkQyM0UsIDB4RTEwMUVFMDAsIDB4MjQxMjIyRTIsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLCAweDJGRTYyRkQ2LCAweEUyNDBERDMwLAorMHg2MTZENjZEMSwgMHg4OTAwMzEyMywgMHg2NzJDNjI2MywgMHhERTMyMzY3OCwKKzB4MkQ2MTc3MDMsIDB4RDYyRjQ3MjEsIDB4NDcyMTY0RTIsIDB4RTEwMEEwMEUsCisweDcxMDE2NTYyLCAweDI0NTA2MjUzLCAweDQyMTk3NDAxLCAweDc0MDEyNDIwLAorMHgyNDUwNDUyOSwgMHg0NTE5NzQwMSwgMHg3NDAxMjQ1MCwgMHgzMjczNjIxQywKKzB4NDIwMDhCRUUsIDB4NjREMTY2RTIsIDB4MzYyQzQyMDAsIDB4OEYwNjI0NDgsCisweEREMjIyRTYyLCAweEU1MDBERTE1LCAweDJENTJFNzAxLCAweDZFRjYyRTcyLAorMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHhFRTAxNEYyMiwgMHhFRDBBQTAwNSwKKzB4NjRFM0JDOTcsIDB4NjRFM0JDOUQsIDB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsCisweEVFMDFBMDA1LCAweDY0RTNCQzlFLCAweDY0RTNCQ0E0LCAweDYyRUM3RTAxLAorMHg4QkY3MzJENywgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgwMDIwMjlEQSwKKzB4MDAyMDFFQzIsIDB4MDAxRTExMDgsIDB4MDAxRTEwMTUsIDB4MDAyMDI5RTAsCisweDAwMUUxMDAxLCAweDAwMjAyOUI0LCAweDAwMUUxMTAwLCAweDAwMjAyOURFLAorMHgwMDIwMjlDQywgMHgwMDFFMTAwMCwgMHgwMDIwMjlEMCwgMHgwMDIwMjlEQywKKzB4MDAyMDFEQjYsIDB4MDAxRTEwMEMsIDB4MDAyMDI5QzgsIDB4MDAyMDI5RTQsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweDYwNjBENjRDLCAweDg5NDg4ODAxLAorMHhFMTAxRDQ0QiwgMHhENzRCODU0OCwgMHg2NTBEMjYxMCwgMHg0NTE5NjA3MCwKKzB4NjY1OURENDksIDB4NjFEMzYyNkUsIDB4Qzg0MDI2MkQsIDB4NzQwMjcxMDIsCisweDhEMUFENzQ2LCAweEQyNDY2NjZDLCAweEU1MDFERTQ2LCAweEEwMDQyRTIyLAorMHg2MjQ1RUUwNCwgMHgyMTIxNzUwMSwgMHg2MjVDNzEwMiwgMHg4QkY4MzJFMywKKzB4ODFENDYwNjMsIDB4RDU0MEU2MDEsIDB4NjI2Q0U0MTcsIDB4ODkxRTMyNDMsCisweDc2MDE2MjU1LCAweEFGRjgyNzIxLCAweEQyM0M3NzAyLCAweEU1MDFERTM5LAorMHhBMDA0MkUyMiwgMHg2MjQ1RUUwNCwgMHgyMTIxNzUwMSwgMHg2MjVDNzEwMiwKKzB4OEJGODMyRTMsIDB4ODFENDYwNjMsIDB4RDUzNUU2MDEsIDB4RTQxN0EwMDQsCisweDc2MDE2MjU1LCAweDc3MDIyNzIxLCAweDMyNDM2MjZDLCAweDkyNEI4QkY4LAorMHhENDMwMkQyMSwgMHg2MTQyRDczMCwgMHg2NUYyMkYxMiwgMHg2MDUzNkRGMiwKKzB4MjcwMEM5ODAsIDB4Qzk2MDYwNTMsIDB4ODA3MTYxMDMsIDB4NkVGMjYwNTMsCisweEM5MDM2NUYyLCAweDQ1Mjk0RDE5LCAweDYwREM4MDcyLCAweDgxNzI0NTE5LAorMHg2MDVDNEUyOSwgMHg0MDE4NjJFQywgMHg4MTczMzAyQywgMHgyMTE4NkQ0MiwKKzB4NkVGMjJGRDIsIDB4NjZGMjYyRjIsIDB4NDYyOTQyMTksIDB4NjZGMjY1NkMsCisweDY0RUM2MDJDLCAweDQ2Mjk0MDE4LCAweDQ2MTkzMDRDLCAweDYwNkM4MTc0LAorMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywgMHgwMDA5QkNCRiwgMHgyMjI4NjIwQywKKzB4QTAwQTg5MDgsIDB4NjAxMzAwMDksIDB4OEIwMzg4NDAsIDB4MDAwOUIwMEEsCisweDAwMDlBMDAzLCAweEUyMDJENjExLCAweDdGMDQyNjIyLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgwMDA5MDAwQiwgMHgwMDAwMDYwQSwgMHgwMDIwMjlFOCwKKzB4MDAyMDJDNDAsIDB4MDAxRTEwMDAsIDB4MDAyMDJDRDYsIDB4MDAyMDJDRTIsCisweDAwMjAyQzUyLCAweDAwMjAyOUQwLCAweDAwMjAyQzgyLCAweDAwMjAyQzgwLAorMHgwMDIwMkM1NCwgMHgwMDFFMTAwQywgMHgwMDIwMjlCNCwgMHgwMDIwMjlFMCwKKzB4NEYyMjJGRTYsIDB4REU5MDdGRkMsIDB4MjAwODg0RTksIDB4MkYwMDhEMDYsCisweEQ2OEZENDhFLCAweDAwMDk0NjBCLCAweDY0RjBCMTQ2LCAweDY2MjBEMjhELAorMHg4OTAyMjY2OCwgMHhDOUJGNjBFMCwgMHg3RjA0MkUwMCwgMHgwMDBCNEYyNiwKKzB4MDAwQjZFRjYsIDB4MkZFNjAwMDksIDB4REU4NzRGMjIsIDB4NjBFMEQ2ODcsCisweENCQzBENDg3LCAweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LAorMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjgxNjE2RCwKKzB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsCisweEQyN0Q4QkY4LCAweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLAorMHg2RUY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhEQzcyN0ZGQywKKzB4ODRDMkQyNzYsIDB4Q0I0MERENzYsIDB4ODBDMjQyMEIsIDB4OEQwNDIwMDgsCisweDYyRTA2RTAzLCAweEEwMDY2NDJDLCAweEQ2NkE3NDA0LCAweDYxNjBENDcxLAorMHg0NzBCRDc3MSwgMHg2NDRENjUxQywgMHg0NTIxNjU0MywgMHhBMDA0NDUyMSwKKzB4NjJFNkU2MDAsIDB4MkYyMjc2MDEsIDB4NjI2RDJEMjIsIDB4OEJGODMyNTMsCisweEM5MDM2MDQzLCAweDg5MTIyMDA4LCAweDg5MDU4ODAzLCAweDg5MDY4ODAyLAorMHg4OTA3ODgwMSwgMHgwMDA5QTAwOCwgMHhBMDA1RTAwNywgMHhFMDAzODBEOCwKKzB4ODBEOEEwMDIsIDB4ODBEOEUwMDEsIDB4MkYyMjYyRTIsIDB4RTAwRjJEMjIsCisweDgwRDhENjVFLCAweENCMDg2MDYwLCAweDYwQzAyNjAwLCAweDJDMDBDOTNGLAorMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDI1NjRGMjIsIDB4NkU0MzZENzMsIDB4NDIwQjZCNTMsCisweDIwMDg2QzYzLCAweDY0MDM4RjA4LCAweEQyNDVENDUyLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHgyNEUwNjBCMywgMHg2MEMzODA0MSwKKzB4QTAwNzgxNDEsIDB4NjU1REU1MDAsIDB4MDBEQzYwNTMsIDB4MzI0QzYyNTMsCisweDgwMjQ3NTAxLCAweDZFRUM2MjVELCAweDhCRjQzMkUzLCAweDYwNjBENjM2LAorMHgyNjAwQzlCRiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwKKzB4N0ZDNDRGMjIsIDB4NzIwMjYyRjMsIDB4MjI1MTJGNDEsIDB4NDUyOTcyMDIsCisweDYwNjMyMjUxLCAweEU1QzRFNjgyLCAweDY3RjM4MTIxLCAweDY1NUM2NjZDLAorMHhFNDA4QkZCQywgMHg0RjI2N0YzQywgMHgwMDA5MDAwQiwgMHhEMjM3RDEzNiwKKzB4RTQwNTYwMTIsIDB4RTUwMENCMjAsIDB4MjI0MjIxMDIsIDB4MjI1MjAwMEIsCisweEQ1MzREMTMzLCAweEU0MDBENzM0LCAweDIxNDJFMjBGLCAweDE3NDExMTU0LAorMHhENTMyMjcyMiwgMHg5NjM1RDczMiwgMHgxNTQxMjU3MiwgMHg5NjMyMTU2MiwKKzB4RTYwMTE1NjUsIDB4RDUyRjExNjUsIDB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NjIyNTQyLCAweDc2MDFFNzI3LAorMHg2NzYzMjU3MiwgMHgyNTYyNzc5NywgMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwKKzB4RTIxOTI1MjIsIDB4RTI3MDI1MjIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1MjIyNTQyLCAweDI1MjJFMjBDLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwKKzB4MDAwOTQyMkIsIDB4NTE2MzA2MDEsIDB4MDAxRTEwMTcsIDB4MDAyMDJBRjAsCisweDAwMjAwRjcyLCAweDAwMjAyOUIwLCAweDAwMUUxMDE1LCAweDAwMUUxMEJGLAorMHgwMDExNzgwMCwgMHgwMDFFMTBGQywgMHgwMDIwMDEwMCwgMHgwMDIwMjAxQSwKKzB4MDAxRTEwRjgsIDB4MDAyMDJBRjQsIDB4MDAyMDBGQkMsIDB4MDAxRTEwQUUsCisweDAwMjAxRkRDLCAweDAwMjAyQjEwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LAorMHgwMDFDNTgxQywgMHhBMDAwQTAwMCwgMHgwMDFEMDEwMCwgMHgwMDFENDAwMCwKKzB4MDAwNDAwMjEsIDB4MDAxQzU4OUMsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweEM4MjA2MDQzLCAweDZFNDM4RDAyLCAweDAwMDlCRUJCLCAweEM4MTA2MEUzLAorMHhCRUI4ODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAxQzg0MCwgMHgwMDA5QkVEQSwKKzB4QzgwMTYwRTMsIDB4REQzNzg5MzYsIDB4QzgwMjYwRDAsIDB4MkYwMDhEMDMsCisweDQ2MEJENjM1LCAweDYwRjAwMDA5LCAweDg5MDJDODA0LCAweDQ2MEJENjMzLAorMHg2MkYwMDAwOSwgMHhDODgwNjAyMywgMHg2MEQwODkwMiwgMHgyRDAwQzk3RiwKKzB4QzgwMTYwMjMsIDB4RDYyRTg5MDQsIDB4MDAwOTQ2MEIsIDB4MDAwOUEwMDUsCisweDg5MDJDODA4LCAweDQ2MEJENjJCLCAweDYwRjAwMDA5LCAweDg5MDJDODEwLAorMHg0MjBCRDIyOSwgMHhENTI5MDAwOSwgMHg4ODAyNjA1MiwgMHhEMjI4OEIwMywKKzB4QTAwNUU2MDQsIDB4ODgwMTIyNjAsIDB4RDIyNThCMDIsIDB4MjI2MEU2MDEsCisweDI1MjJFMjAwLCAweEM4ODA2MEUzLCAweEQ2MjI4OTJFLCAweDYwRTM2RTYwLAorMHg4OTAyQzg4MCwgMHg0MjBCRDIyMCwgMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwKKzB4NDIwQkQyMUUsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4NDIwQkQyMUMsCisweDYwRTMwMDA5LCAweDg5MEVDODA0LCAweDQxMEJEMTFBLCAweEJGMTUwMDA5LAorMHhCRjFEMDAwOSwgMHhENTE4MDAwOSwgMHg2MDUwRDQxOCwgMHhDOTA4RDcxOCwKKzB4QkY1NDI1MDAsIDB4NjBFMzI0NzIsIDB4ODkwNUM4MDgsIDB4N0YwNEQyMTUsCisweDZFRjY0RjI2LCAweDZERjY0MjJCLCAweDRGMjY3RjA0LCAweDAwMEI2RUY2LAorMHgwMDAwNkRGNiwgMHgwMDFFMTAyMSwgMHgwMDIwMTE4MiwgMHgwMDIwMTFBNCwKKzB4MDAyMDE3QjAsIDB4MDAyMDExQkMsIDB4MDAyMDExQ0MsIDB4MDAyMDI5RTAsCisweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxMjIyLCAweDAwMjAxMjJFLAorMHgwMDIwMTFENCwgMHgwMDIwMTFGMiwgMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwKKzB4MTIzNDU2NzgsIDB4MDAyMDEyMEEsIDB4RDZBODY0NEMsIDB4MzQ2Qzc0RkYsCisweDI0NTAwMDBCLCAweDY0NENENkE2LCAweDAwMEIzNDZDLCAweEQ2QTUyNDUwLAorMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwgMHg2MTZENjI1QywgMHg0MTE5NDIwOCwKKzB4NjAxOTQyMDgsIDB4NjQ0QzQyMDAsIDB4MzI0QzY3MEUsIDB4MjA3REQxOUUsCisweEM5MEY0MjAwLCAweDAwMEIzMjFDLCAweDY3NjMyMjAwLCAweDQyMDg2MjVDLAorMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywgMHg0MjAwRDE5OCwgMHgwMDBCMzIxQywKKzB4MkZFNjIyNzAsIDB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsCisweDI3MjlFMjlGLCAweDY1NzM2RTUzLCAweDQ3MTk2NzZELCAweDY3MkU2Mjc5LAorMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwKKzB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsIDB4MEUxQTA0NjcsIDB4MjE1MDI1RUIsCisweDAwMEI0RjE2LCAweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLAorMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwKKzB4RTUwRjhCNzMsIDB4RTQwMUJGQTAsIDB4QkZBM0U1MDEsIDB4RTU4NkU0MDAsCisweEU0MDA2NTVDLCAweDJGNTBCRkEzLCAweEJGQTBFNDAxLCAweEU2MDJFNTA2LAorMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwgMHg2NTQzQkY5RSwgMHhFNDAxODVGMiwKKzB4QkZBQTY1NDMsIDB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsCisweEU0MDI2NUYwLCAweDYwNTM3NTZDLCAweDgwRjhCRjdFLCAweEJGODFFNDAyLAorMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwgMHg2NTAzQkY4MSwgMHg0NjE4RTYwMiwKKzB4ODFGNjYwNjMsIDB4QkY3RkU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsCisweEU1MDBCRjhCLCAweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLAorMHhFMDEwNjU1QywgMHhCRjVGRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MiwKKzB4MDVGQ0UwMTAsIDB4QkY2MkU0MEUsIDB4RTUwMDc1ODUsIDB4QkY2M0U0MDMsCisweEU1MDBFNjQwLCAweEJGNzBFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLAorMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywgMHhCRjQ1RTQwNCwgMHhFNDBGMEY1NCwKKzB4RTUwNEJGNDgsIDB4MDVGQ0UwMTQsIDB4QkY0OEU0MEYsIDB4RTUwMTc1ODQsCisweEJGNDlFNjQwLCAweEU1MDFFNDA0LCAweEJGNTZFNjQwLCAweEU1MDFFNDA0LAorMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwKKzB4NEYyMjAwMDksIDB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsCisweDI2Njg2NjIxLCAweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LAorMHhFNDAxQkYxQSwgMHhCRjFERTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGMUQsIDB4QkYxQUU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQjY1NDMsCisweEU0MDFFNjQwLCAweEJGMjg2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLAorMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwgMHhCRUZENjA1MywgMHhFNDAyODBGNCwKKzB4RTUxMkJGMDAsIDB4RTQwMjg0RjQsIDB4QkYwMDcwOTAsIDB4RTY0MDY1MDMsCisweEJGMDFFNDAyLCAweEU2NDBFNTAwLCAweEJGMEVFNDAyLCAweEU2NDBFNTAwLAorMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUUzRTQwMywKKzB4RTUxMzgwRjgsIDB4RTQwRUJFRTYsIDB4RTQwRTg0RjgsIDB4QkVFNjcwODUsCisweEU1MDA2NTAzLCAweEJFRTdFNjQwLCAweEU1MDBFNDAzLCAweEJFRjRFNjQwLAorMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywKKzB4QkVDOUU0MDQsIDB4RTQwRjgwRkMsIDB4RTUwNEJFQ0MsIDB4RTQwRjg0RkMsCisweEJFQ0M3MDgzLCAweEU1MDE2NTAzLCAweEJFQ0RFNjQwLCAweEU1MDFFNDA0LAorMHhCRURBRTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwKKzB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMzAsCisweDAwMUUxMDgwLCAweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLAorMHgwMDIwMjlEQSwgMHgwMDIwMjlEQywgMHgwMDIwMjlERSwgMHhEMjFERDExQywKKzB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsCisweDY3MTA2MjEwLCAweDc3MDE2MjJDLCAweDY0MjMyMTcwLCAweEQ2MTY2MDEwLAorMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywKKzB4NDQwODI2MjAsIDB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsCisweEU2MDA4RDEzLCAweEQ2MERENDBCLCAweDY1NUM2NTQwLCAweDQ3MDg2NzUzLAorMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwKKzB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsCisweDAwMjAyOUFGLCAweDAwMjAyOUFFLCAweDAwMjAyOUIwLCAweDAwMjAyNUQ0LAorMHg3RkZDNEYyMiwgMHhFNjgwRDE5RCwgMHg2NjZDNjIxMiwgMHhEMjlDMkYyMiwKKzB4NjdGMzY1NjMsIDB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsCisweEU2ODAwMDA5LCAweEQyOTY2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQwLAorMHhFNjgwNjQ3MywgMHhEMjkyNjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MywKKzB4MkZCNjY0NzMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NEQxOEVEMDEsCisweERCOEREQzhDLCAweDY1QzI1MkMxLCAweDg5MjAzNTIwLCAweEM5MDM2MDUxLAorMHg4OTFDODgwMSwgMHhEMTg5REU4NywgMHg2NEUzNDEwQiwgMHg4NTAzNjUwMywKKzB4NjcwRDY2QjIsIDB4ODkwNzM3NjIsIDB4RDI4NkQ0ODUsIDB4MDAwOTQyMEIsCisweEU3MDFEMTg1LCAweDIxNzJBRkU2LCAweERFODQ2NEUzLCAweDAwMDk0RTBCLAorMHhENDg0RDY4MywgMHg0MTBCRDE4NCwgMHhBRkRCMjZEMiwgMHg0RjI2MDAwOSwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4NEYyMjZCRjYsIDB4ODU0NjdGRjQsCisweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLCAweDgxRjJEMjcwLAorMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywgMHg2NTYzNjA1MywKKzB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsIDB4MkY4NjAwMDksCisweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjQ0RjIyLAorMHhEQzZFRTIwMCwgMHgyRjIxQTEzNiwgMHhERDZENkExMywgMHhFMDAxNEEwOCwKKzB4NEQwQkQ5NkMsIDB4M0E5QzRBMDAsIDB4MUY5MTc5MzAsIDB4NjZDMjFGMDIsCisweDM2MjA1MkMxLCAweEExMjE4QjAxLCAweDYwNjEwMDA5LCAweDg4MDFDOTAzLAorMHhBMTFCOEIwMSwgMHg4NTYxMDAwOSwgMHg4OTc3QzgwMSwgMHg4NUQyNUQ2MywKKzB4QzkwMzY2MDMsIDB4ODVEMzY0MDMsIDB4NjA1MzY1MEQsIDB4NDAyMTQwMjEsCisweDQ1MDBDOTNGLCAweDMyMkE2MTAzLCAweDYwNTMyNTJELCAweEM5MDFFMjEwLAorMHhEOTU1MzEyMywgMHg2RTAzOEQyMSwgMHg0NDA4RDc1NywgMHg0NDA4NjU3MCwKKzB4NDQwMDYyMTMsIDB4MjU1ODQyMDAsIDB4MzQyQzhGMEUsIDB4NjA0M0QyNTMsCisweDYwRTMwNzJELCAweDRCMTk2QjdELCAweDY1OEU2OEI5LCAweDI4NUQ4ODAxLAorMHg2QjdDOEYwQiwgMHg2QjEzQTAwOSwgMHg2MDQzRDI0RCwgMHg2MUVEMEUyRCwKKzB4NjgxOTQxMTksIDB4Mjg3RDY3OEUsIDB4RDE0QTZCRUMsIDB4MjIyODYyMTIsCisweEVCRkY4OTAxLCAweEVFRkY2QkJDLCAweDZFRUM2NUJELCAweDhCMEYzNUUwLAorMHg0RDBCREQzNiwgMHg1NDAzNjRDMywgMHhCRjc2RTUwMiwgMHhENDQyNkQwMywKKzB4NDEwQkQxMzYsIDB4RDc0MTY1RDMsIDB4RDQ0MUVFMDEsIDB4MjdFMkEwMUQsCisweDI2RTlFRUZDLCAweDgxRDI2MDYzLCAweDkxNEU4NUQzLCAweDgxRDMyMDE5LAorMHg0NTA4ODVEMiwgMHg4MUQyMjA4QiwgMHhFMjA4ODVEMywgMHg4MUQzMjA1QiwKKzB4NDIxODg1RDQsIDB4ODFENDIwMkIsIDB4ODU0MTY0QzIsIDB4ODE0MTIwRTksCisweEQ0MzQ2NUMyLCAweENCMDE2MDUxLCAweDQ5MEIyNTAxLCAweDYwQzIwMDA5LAorMHg1MkYyNTZGMSwgMHgyQTAyQ0IwMSwgMHgyNjIyQUY3OSwgMHg0MjBCRDIxQiwKKzB4NUUwMzY0QzMsIDB4ODVFMTZEMDMsIDB4NjA1MzY1MEQsIDB4ODk3QkM4MjAsCisweDYyMTBEMTI5LCAweDhCMTEyMjI4LCAweEQ3Mjc4NUVGLCAweDQyMjE2MjBELAorMHg0MjIxNDIyMSwgMHhFNTAxRDYyNSwgMHgyNzUwNDIyMSwgMHhENzI1RDkyNCwKKzB4MjYyMUQ0MjUsIDB4Mjk2MEU2MDAsIDB4MjQ2MTI3NjIsIDB4ODUyMTYyQzIsCisweDhCNDNDODAyLCAweEQ5MTJENzFFLCAweEUwMDE2MjcwLCAweDYxMkM0OTBCLAorMHg2NjkyRDkxQywgMHhBMDNFMjYwQiwgMHg3RTAzMjk2MiwgMHgwMDFDM0Q5QywKKzB4MDAyMDFBM0MsIDB4MDAyMDI1Q0MsIDB4MDAyMDI5OTQsIDB4MDAyMDBENDIsCisweDAwMjAyNTk0LCAweDAwMjAwREM0LCAweDAwMUUyMTMwLCAweDAwMjAwRDYwLAorMHgwMDFDM0QzMCwgMHgwMDIwMkMyOCwgMHgwMDIwMEY3MiwgMHgwMDIwMjVBNCwKKzB4MDAyMDI0OEMsIDB4MDAxQzNEMDAsIDB4MDAyMDJDM0MsIDB4MDAyMDJCMjgsCisweDAwMjAyQkE4LCAweDAwMjAyOUE4LCAweDAwMjAyNTlDLCAweDAwMUUyMTJDLAorMHgwMDIwMkMyQywgMHgwMDIwMkMzMCwgMHgwMDIwMkQxMCwgMHgwMDIwMjlFRSwKKzB4MDAyMDI5RUMsIDB4MDAyMDI5RjAsIDB4MDAyMDI5RjQsIDB4RTA0Q0QxMzksCisweDcyMDEwMjFFLCAweEQ5MzgwMTI2LCAweDYyOTBENDM4LCAweDcyMDE2NTQxLAorMHgyOTIwNzUwMSwgMHg4NUUxMjQ1MSwgMHg0NjE4RTY0MCwgMHg4OTFEMjA2OCwKKzB4RDkzNEQ3MzMsIDB4NjY1RDYxNzEsIDB4NjU5MkQ3MzMsIDB4NjQxRDQ3MEIsCisweEUyMDBERTMyLCAweDJFMjBBMDEyLCAweEU5MDg4NUU0LCAweDQ5MTg2MjAzLAorMHgzMjkwMjI5OSwgMHhFNTAxOEIwNCwgMHg2NEUzQkVCNywgMHgwMDA5QTAwNiwKKzB4MjU5OEQ5MkIsIDB4RTUwMDg5MDIsIDB4NjRFM0JFQUYsIDB4RDIyQUQ0MjksCisweDY1RDM0MjBCLCAweEVFMDFENzI5LCAweDI3RTJBRUQ5LCAweDdDMDg2MkYxLAorMHgyRjIxNzIwMSwgMHhFRTA0NjJGMSwgMHgzMUU3NjEyRCwgMHhBRUMzODkwMSwKKzB4N0YwQzAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweDJGRTY2OEY2LCAweEQyMUQ0RjIyLCAweDYwRTM2RTIyLAorMHg4RDAyQzg0MCwgMHhCRTMzMjJFMiwgMHhFMjQwMDAwOSwgMHgyRTI4NDIxOCwKKzB4QkUzRTg5MDEsIDB4NjBFMzAwMDksIDB4ODkwNUM4MTAsIDB4RDIxNkQ0MTUsCisweDAwMDk0MjBCLCAweDAwMDlCRTNELCAweEM4MDU2MEUzLCAweEJFOEU4OTAxLAorMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHhBRTNBNEYyNiwgMHg0RjI2NkVGNiwKKzB4NkVGNjAwMEIsIDB4MDAyMDI1MzgsIDB4MDAyMDI5RUMsIDB4MDAyMDI5RjQsCisweDAwMjAyOUVFLCAweDAwMjAyOUYwLCAweDAwMjAxQUEwLCAweDAwMjAyRDEwLAorMHgwMDAwODAwMCwgMHgwMDIwMjU5QywgMHgwMDIwMEQ2MCwgMHgwMDFFMjEyQywKKzB4MDAxQzM1MTAsIDB4MDAyMDJDMzQsIDB4MDAyMDBGNzIsIDB4MDgwQTBDMEUsCisweDAwMDIwNDA2LCAweDFBMUMxRTIwLCAweDEyMTQxNjE4LCAweDJFMzAzMjM0LAorMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwKKzB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsCisweDQxMkIzMTJDLCAweDAwMDkwMDA5LCAweDAwMjAyNEI2LCAweDAwMjAyNDZDLAorMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsCisweDQwMDU0MDA1LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTA3LAorMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwKKzB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwgMHg0NjIwNTM1NSwKKzB4MDAwMDNBNTcsIDB4MjA3OTYxNEQsIDB4MzIyMDMwMzMsIDB4MjAzNzMwMzAsCisweDMzM0EzMjMxLCAweDM4MzEzQTM3LCAweDAwMDAwMDAwLCAweDAwMDAwRDBBLAorMHgwMDAwMDA0MywgMHg0MjcwNzM3MiwgMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwKKzB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsIDB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsCisweDAwMDAwMDNELCAweDYxNzY2RTQ5LCAweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LAorMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwgMHgwMDIxNDQ0OSwgMHg1MjUwNDU0NSwKKzB4NTcyMDRENEYsIDB4NjU3NDY5NzIsIDB4NjQ2MTIwMkMsIDB4MDAzRDcyNjQsCisweDZDNjE3NjIwLCAweDAwMDAwMDNELCAweDAwMDAwQTBELCAweDZFNkI2RTU1LAorMHgyMDZFNzc2RiwgMHg2RDZENkY2MywgMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwKKzB4NjE0Mzc3NDgsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjYyMDIwNkUsCisweDBBNkM2OTYxLCAweDAwMDAwMDBELCAweDczNjk2RjRFLCAweDYxNDMyMDY1LAorMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwgMHgyMTIxNkM2OSwKKzB4MDAwMDBEMEEsIDB4MDAwMDBEMEEsIDB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsCisweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNzU3MzVGLCAweDY0NkU2NTcwLAorMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwKKzB4MDAwMDAwNDIsIDB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsCisweDQ5Njc3QTIwLCAweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELAorMHgyMDc0NkY0RSwgMHg3NTZGNkU2NSwgMHg0OTIwNjg2NywgMHg0MjIwNTE0RSwKKzB4MEEwRDY2NzUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsCisweDAxMDkwMTA4LCAweDAwMDIwMTBBLCAweDAwMDMwMDAyLCAweDAyMDIwMjAxLAorMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjA4MDIwNywgMHgwMjBBMDIwOSwKKzB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwKKzB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsIDB4MDAwMzAwMDIsIDB4MDIwMjAyMDEsCisweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDgwMjA3LCAweDAyMEEwMjA5LAorMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwMjA1MjIwLCAweDAwMDAwMDQ2LAorMHgwMDAwMDA1OSwgMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwgMHgwMDAwMDAwMCwKKzB4MDIwMDAxMTIsIDB4NDBGRkZGRkYsIDB4OTE3MDBDRjMsIDB4MjAxMDQ4OTAsCisweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDIwMCwgMHgwMDAyODIwNSwKKzB4MDUwNzAwMDIsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDEwMDQwMDMsCisweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLCAweDAwRkYwNDAwLAorMHgwNTA3MDAwMCwgMHgwMDQwMDIwMSwgMHg4MjA1MDcwMCwgMHgwMDAwNDAwMiwKKzB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsIDB4MDMwNDAxMDAsCisweDAzMEMwNDA5LCAweDAwNzkwMDVBLCAweDAwNDEwMDQ0LCAweDAzMTgwMDUzLAorMHgwMDUzMDA1NSwgMHgwMDMyMDA0MiwgMHgwMDMwMDAyRSwgMHgwMDU3MDAyMCwKKzB4MDA0MTAwNEMsIDB4MDAwMDAwNEUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwNzA5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTExNTQwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1XzJrLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfMmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGUyY2FjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1XzJrLmMKQEAgLTAsMCArMSwxMDE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5NDdGRkMsIDB4RTExNEQ1OTQsCisweDFFMTNENDk0LCAweDY3NTIxRTRDLCAweEQ0OTRENjkzLCAweDM3NDAyNzY5LAorMHg2MjUyOEYwNiwgMHg3MjAxRDY5MiwgMHg2MDYwMjUyMiwgMHgyNjAwQzkzRiwKKzB4RDc5MDYxNTIsIDB4MjUxMjYxMUQsIDB4MjY0QjY2NTIsIDB4MjU2MjQ3MEIsCisweDAwMDlCMDE3LCAweEU2MDA5NUFDLCAweEM4NDA2MEUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY1MiwgMHhENDg4NzYwMSwgMHg0RTBCREU4OCwgMHhENDg4MDAwOSwKKzB4MDAwOTRFMEIsIDB4NEUwQkQ0ODcsIDB4N0YwNDAwMDksIDB4QTA1MjRGMjYsCisweDRGMjI2RUY2LCAweDQxMEJEMTg0LCAweEQ0ODQwMDA5LCAweDAwMDk0NDBCLAorMHg0NTBCRDU4MywgMHhENzgzMDAwOSwgMHhEMjgzRTFGRiwgMHgyNzEyNjExRCwKKzB4RDQ4MjUwMjksIDB4RTFGRkNCMDEsIDB4MTIwOUU1MDEsIDB4MTIxMTIyMTIsCisweEU3MjAyNDUyLCAweDQ3MThENTdFLCAweDI1NzJEMjdFLCAweEQxN0VFNzAwLAorMHhENjdGRDQ3RSwgMHhFMjAxMjI3MCwgMHgyNDcwMjE3MiwgMHhENjdEMjYyMCwKKzB4MjY0MUU0RkYsIDB4RDU3Q0U2MDAsIDB4NjY2REUxMDQsIDB4NzYwMTYwNjMsCisweDQwMDA2MjZELCAweDhGRjgzMjEyLCAweEQ1NzgwNTQ1LCAweDI1MjBFMjAxLAorMHhEMjc4RDc3NywgMHhFNDgwRTEwMCwgMHgyMjEyMjcxMCwgMHg2NjEzRDU3NiwKKzB4NjY2RDY0NEMsIDB4NzYwNDY3NjMsIDB4Mzc1QzYyNkQsIDB4OEZGODMyNDMsCisweEQ1NzIyNzEyLCAweEQyNzNENzcyLCAweEU0MDBFMTAxLCAweDI3MTAyNTExLAorMHgwMDBCNEYyNiwgMHg3RkNDMjI0MiwgMHhEMTcwRDU2RiwgMHhEMjcxREI3MCwKKzB4MUY1MUQ0NzEsIDB4RDY3MTc1MDgsIDB4MUYxMkQ3NzEsIDB4MUY1NTcxMEMsCisweDFGQjk3NUZDLCAweDcyMDQxRjJBLCAweDFGMTNFQjEwLCAweDFGNTYxRjQ0LAorMHgxRjc4MUY2NywgMHhEODZCMUYyQiwgMHhERDZDRDk2QiwgMHhEQzZDRUEwMCwKKzB4RDI2RERFNkMsIDB4ODkwMDNBMjIsIDB4RDE1RDdBMDEsIDB4ODgwMTYwMTAsCisweDU2Rjg4QjAzLCAweDQyMThFMjAxLCAweEQxNjgyNjIyLCAweDAwMDk0MTBCLAorMHg0NDBCRDQ2NywgMHhENTY3MDAwOSwgMHgwMDA5NDUwQiwgMHg2MDEwRDE1MCwKKzB4OEIxMDg4MDEsIDB4RTY1MEQxNEYsIDB4NDYxODYyMTIsIDB4OEIwODMyNjYsCisweDU2RjlEMTRCLCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAzLAorMHg3MjAxMjcxMCwgMHg2MDgyMjEyMiwgMHg4OTA5ODgwMSwgMHhFMkM4RDE1QSwKKzB4NjIyQzY2MTIsIDB4ODkwMzM2MjYsIDB4NjAxMEQxNTgsIDB4OEJDODg4MDEsCisweDUxRjY2NzkyLCAweDIxNzI1MkY1LCAweEQ2NTU1MTkxLCAweDU1RkEyMjEyLAorMHg1MkZCNjQ2MiwgMHg1NTYxMjU0MiwgMHgyMjUyRTQwMCwgMHg2MTQzNjY0MywKKzB4MDVERTYwMTMsIDB4MzZDQzQ2MDgsIDB4MDdERTI2NTIsIDB4QzkwMzYwNzEsCisweDhCMDI4ODAxLCAweDcyMDE2MkUyLCAweDc0MDEyRTIyLCAweDM2QjM2NjRDLAorMHg3MTA0OEZFRSwgMHg2NkMyRDE0NywgMHg0NTI4NjUxMiwgMHgyNjVCNDUxOCwKKzB4NjA4MjJDNjIsIDB4ODkwMTg4MDEsIDB4MDAwOUExNjgsIDB4NjI3MkQ3NDIsCisweDhCMTMyMjI4LCAweEQ0MkJENzQxLCAweDY3NzJENTQxLCAweDUxNTM2MjQyLAorMHgzMTJDMzI3QywgMHgyNDIyMjIyOCwgMHgxNTEzOEQwNSwgMHg2MjYyRDYzRCwKKzB4QjE2MjcyMDEsIDB4RDYyMzI2MjIsIDB4MjYyMkUyMDAsIDB4NTI5MTY2OTIsCisweDhCMDEzNjIwLCAweDAwMDlBMTQ0LCAweDYwNjFBMDZFLCAweDAwMUMwMDFDLAorMHgwMDFENDAyMCwgMHgwMDAwQjM4RSwgMHhGRkZGMDAwMCwgMHgxMjM0MDAwMCwKKzB4MDAxRTEwMTUsIDB4MDAyMDEyNzQsIDB4MDAyMDM5RUMsIDB4MDAyMDE4QTIsCisweDAwMjAzOUY4LCAweDAwMjAzQTEwLCAweDAwMjAxODYwLCAweDAwMjAxOTY0LAorMHgwMDIwMTI4OCwgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywKKzB4MDAyMDM4RUMsIDB4MDAyMDM0ODQsIDB4MDAyMDM4RjQsIDB4MDAyMDM5MDAsCisweDAwMjAzOTBDLCAweDAwMjAzOTY4LCAweDAwMjAzOTZDLCAweDAwMjAzOTE0LAorMHgwMDIwMzkxNSwgMHgwMDIwMzkxOCwgMHgwMDExNzcwMCwgMHgwMDIwMzk4NCwKKzB4MDAyMDM5ODIsIDB4MDAyMDM0RTgsIDB4MDAxMTc3MTAsIDB4MDAxQzNEMzAsCisweDAwMUMzNkY4LCAweDAwMTE3NzM0LCAweDAwMUMzNjg0LCAweDAwMUMzRDAwLAorMHgwMDFDMTAwMCwgMHgwMDFDMTAyOCwgMHgwMDIwMzRGQywgMHgwMDIwMzkxQywKKzB4MDAxMTc2MDAsIDB4MDAxMTc3NDAsIDB4N0ZGRkZGRkYsIDB4MDAyMDE3MzAsCisweDAwMjAzMzIyLCAweDAwMjAyMzJDLCAweDAwMjAzRDlDLCAweDAwMjAzOTZBLAorMHgwMDIwMzRGNCwgMHgwMDIwMzk1QywgMHgwMDFDM0QyQywgMHgwMDFDMzZCMCwKKzB4MDAyMDM0OEMsIDB4MDAxMTc3NUMsIDB4ODgwMUM5MEYsIDB4QTBDRjg5MDEsCisweEQxOTYwMDA5LCAweDM2MjA2MjEyLCAweEQ0OTU4OTA0LCAweDI0MjFFMjAwLAorMHgyMTYyQTBDQywgMHg2MjExRDE5MywgMHg4OTAxMjIyOCwgMHgwMDA5QTBDMywKKzB4RTIwMkQ3OEYsIDB4NzUwMTY1NzEsIDB4MzEyMzYxNUQsIDB4Mjc1MThEMDIsCisweDAwMDlBMEJDLCAweEQyOEM1N0YyLCAweDYyMjI2MDcyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4RjE5ODgwQSwgMHg1MkYzMUYyQywgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwOEM5MEYsIDB4QTBBNzg5MDEsIDB4NjA2MzAwMDksCisweENCMDE1NEY3LCAweEQyN0U1NUYyLCAweEU3MDEyNDAyLCAweEQ0N0ZFMTAwLAorMHgyMjExMjU3MiwgMHg3MjAxNjI0MiwgMHgyNDIyQTA5OCwgMHg4QjNGODgwNSwKKzB4NjAyMjUyRjMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIxNjg4MDIsCisweEU0RkZENTc3LCAweDY0NEQ2NzUyLCAweDhCMTAyNzQ4LCAweDYyNzJENzc1LAorMHg4QjBDMzI2MCwgMHg1MUYyNTVGNywgMHhEMjZERTcwMSwgMHgyMTcyMjU2MiwKKzB4RDU3MUUxMDAsIDB4NjQ1MjIyMTEsIDB4QTA3Nzc0MDEsIDB4NTJGMzI1NDIsCisweDQwMTk2MDIyLCAweDQwMDk0MDA5LCAweDg4MDVDOTBGLCAweDMxQjM4QjZFLAorMHhEMjZBOEI2QywgMHg2NzIyNTRGNCwgMHg3NzAxRDU2OSwgMHg2MTQyMjI3MiwKKzB4MUYxQ0U2NDAsIDB4NDYxODIxNTksIDB4OEIwMzMxNjAsIDB4NjI2MkQ2NjUsCisweDI2MjI3MjAxLCAweEUyMDBENjVBLCAweDI2MjFCMDY3LCAweDAwMDlBMDU2LAorMHgzMTIzRTIyMCwgMHg4ODAzOEI1MiwgMHg1MkYzOEIxRSwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwM0M5MEYsIDB4RDI1QjhCMTYsIDB4NjcyMjU0RjQsCisweDc3MDFENTU3LCAweDYxNDIyMjcyLCAweDFGMUNFNjQwLCAweDQ2MTgyMTU5LAorMHg4QjAzMzE2MCwgMHg2MjYyRDY1NSwgMHgyNjIyNzIwMSwgMHhFMjAwRDY0OCwKKzB4MjYyMUIwNDMsIDB4MDAwOUEwMTAsIDB4RDQ1MkQ1NTEsIDB4RDI0NDY3NTIsCisweEUxMDA3NzAxLCAweDI1NzIzQTQ2LCAweDIyMTE4RjA2LCAweEVBMDBENjRFLAorMHg3MjAxNjI2MiwgMHgyNjIyQjAzMSwgMHgyRkIyRDU0QywgMHg5NTczNjY1MiwKKzB4RDQ0QTVCRjEsIDB4MzYyMDUyNDEsIDB4NjA2MTg5MTAsIDB4OEIwMUM4MDMsCisweDJCMjJFMjAxLCAweDhGRjU0NTEwLCAweDU3RjE1NjY0LCAweDYyNzJFMUYwLAorMHg0MTI4NDExOCwgMHgyNzIyMjIxQiwgMHg2QkYyQTAwOCwgMHg2QkYyQTAwNiwKKzB4RTIwMEQ2MkYsIDB4RDEyRjI2MjEsIDB4MjEyMUUyMDAsIDB4RDEzQ0UyMDEsCisweDY2MTIyODIyLCAweDhCMDEyNjY4LCAweDAwMDlBRTJCLCAweDQ1MEJENTM5LAorMHhEMTM5MDAwOSwgMHhBRTI0RTYwMCwgMHgyRjg2MjE2MCwgMHgyRkE2MkY5NiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGNDRGMjIsIDB4REUzNEQxMzMsCisweDU0MTE2MjEyLCAweDFGNDE2N0UyLCAweDJGMjJENDMyLCAweEQ1MzIxRjcyLAorMHhEMjMyNjc0MywgMHg1ODQxNzc5NCwgMHg2OTQyNUE0MiwgMHg1QjE2NkM3MiwKKzB4NjA1MjZEMjIsIDB4Q0IyMEU2MDAsIDB4RTU0MDI1MDIsIDB4NjI2RDc2MDEsCisweDhCRkIzMjUzLCAweDU1RjE2MkYyLCAweDExNTEyMTIyLCAweEQ2Mjg1NUYyLAorMHgxNDgxMkU1MiwgMHgyNDkyMTRBMiwgMHgyN0MyRDQyNiwgMHgyNkQyMTFCNiwKKzB4REEyNTY3NDIsIDB4RTgwMUQ5MjUsIDB4NDkwQjJBNzIsIDB4RTIwMTFBOEMsCisweDFBMkM0MjE4LCAweDRGMjY3RjBDLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwgMHgwMDAwMDdEMSwgMHgwMDIwMzk3QywKKzB4MDAyMDM5ODAsIDB4MDAyMDM5ODYsIDB4MDAxQzNEQzAsIDB4MDAxMTc3MkMsCisweDAwMUMzQjg4LCAweDAwMjAzOTY0LCAweDAwMTE3NzNDLCAweDAwMTE3NzQ0LAorMHgwMDAwRjAwMCwgMHgwMDExNzc2NCwgMHgwMDExNzc0OCwgMHgwMDExNzc2OCwKKzB4MDAxMTc3NkMsIDB4MDFGRkZGRkYsIDB4MDAxMTc3NEMsIDB4MDAyMDM0RjQsCisweDAwMjAzRDlDLCAweDAwMjAyNEYwLCAweDAwMjAzOTZBLCAweDAwMUMzQjlDLAorMHgwMDFDM0Q5OCwgMHgwMDFDMzcwMCwgMHgwMDFDMzUwMCwgMHgwMDFDNTk2MCwKKzB4MDAxQzg5NjAsIDB4MDAyMDM0RkMsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MEMsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhERTk1N0ZBQywgMHg2MUUwRTAxNCwgMHgwRjE0RDQ5NCwgMHg3MTAxNjFFMywKKzB4RTAxODYyMTAsIDB4RDI5MjBGMjQsIDB4MDAwOTQyMEIsIDB4NDUwQkQ1OTEsCisweDIwMDgwMDA5LCAweDhGMTI2RDAzLCAweEQyOEYxRjA3LCAweDY3MjBENDhGLAorMHg2NTdDREQ4RiwgMHg0NzBCRDc4RiwgMHhEMThGMDAwOSwgMHg2MTlDNjkxMCwKKzB4NDYwODY2MTMsIDB4MzYxODQ2MDgsIDB4M0Q2QzQ2MDgsIDB4RTAxODFGRDcsCisweEU1ODAwNEZDLCAweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjE1LAorMHgwMUZDRTAxNCwgMHhERTg1RTUwMCwgMHg2NDFDQTAwOCwgMHg2NzUzNjU1RCwKKzB4NjA3MDM3RUMsIDB4MzlEQzY5NTMsIDB4ODA5NDc1MDEsIDB4MzI0MzYyNUQsCisweEQ2N0Y4QkY0LCAweEEzNEVFMjAwLCAweDIwMDgyNjIxLCAweEUwMTQ4QjEzLAorMHhFNDAwMDFGQywgMHhBMDA5REU3OSwgMHg2NDRENjcxQywgMHgzNUVDNjU0MywKKzB4Njk0MzY2NTIsIDB4MzlEQzYyNjIsIDB4NzQwNDE5MjEsIDB4MzI3MzYyNEQsCisweEEzMzg4QkYzLCAweDg4MDEyRDEwLCAweEUwMTQ4QjE3LCAweEU3MDAwMUZDLAorMHg2RDFDMkQ3MCwgMHhERTZEMUZENCwgMHgzMkQzNjI3RCwgMHhBMzJBOEIwMSwKKzB4Njc3RDAwMDksIDB4NjY3MzY1RTMsIDB4NjE3Mzc1MDQsIDB4MzE1QzM2RUMsCisweDY5MTI2NDYyLCAweEFGRUY3NzA4LCAweDg4MDQyNDkyLCAweEUwMTQ4QjE4LAorMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU2MCwgMHg4QjAxMzI3MywKKzB4MDAwOUEzMTEsIDB4Njk0MzY0NEQsIDB4MzlFQzYyRTMsIDB4NzIwNDY1OTIsCisweDNEMkM2RDQzLCAweDYxNTI2NkQyLCAweDIxNjk3NDA4LCAweDI1MTJBRkVELAorMHg4QjE4ODgwNSwgMHgwMUZDRTAxNCwgMHgyRDQwRTQwMCwgMHhERTUzNjcxQywKKzB4MzI3MzYyNEQsIDB4QTJGNjhCMDEsIDB4NjQ0RDAwMDksIDB4NjJFMzY5NDMsCisweDY1OTIzOUVDLCAweDZENDM3MjA0LCAweDY2RDIzRDJDLCAweDc0MDg2MTUyLAorMHhBRkVEMjE2QiwgMHg4ODMxMjUxMiwgMHhENDRBOEIzQSwgMHg2MTQ2RDk0QSwKKzB4NzUwNDY1NDMsIDB4Njc1NjY0NDIsIDB4NkU1MzFGNDgsIDB4NjU1MjdFMDQsCisweDdFRTQ2MkUyLCAweDdFMDQ2NEUyLCAweDZFRTIxRkU5LCAweDVFRjkyOUUwLAorMHg3RTA0RDk0MiwgMHgxRkVBNjBFMiwgMHgyOTAwQzkwMSwgMHhEOTQwNkVFMiwKKzB4MjlFMDRFMDksIDB4MkY1NjJGMjYsIDB4NTZGQUQ5M0UsIDB4NjUxMzQ5MEIsCisweEQxM0Q3RjA4LCAweEU3MUM2RTBELCAweDFERTEyRDcwLCAweERFM0I2OTEyLAorMHg2NEUyMUQ5MiwgMHgxRDQzRDEzQSwgMHhEMjNBNjUxMiwgMHg2NzIyMUQ1NCwKKzB4MUQ3NUQyMzksIDB4MUQ2NjY2MjIsIDB4NjI2MkQ2MzgsIDB4MUQyN0EyQUIsCisweDhCMzk4ODMwLCAweDY1OTZEOTJCLCAweDY3OTI2Njk2LCAweDYxOTY3OTA0LAorMHg3NEU0NjQ5MywgMHg2RTQzNjk5MiwgMHgxRjlCN0UwNCwgMHgxRkVDNjQ0MiwKKzB4RDkyNTZFRTIsIDB4NUVGQzI5RTAsIDB4N0UwNEQ5MjQsIDB4MUZFRDYwRTIsCisweDI5MDBDOTAxLCAweEQ5MjI2RUUyLCAweDI5RTA0RTA5LCAweDU5RkM3RkZDLAorMHhERTI3MkY5MiwgMHgyRjE2NEUwQiwgMHhENDFGN0YwOCwgMHhFMjFDNjEwRCwKKzB4MUQxMTJEMjAsIDB4RDIyMDY0NDIsIDB4RDQxQzFENDIsIDB4MUQ1MzY1NDIsCisweDY3NTJENTFCLCAweEQ3MUIxRDc0LCAweDFEMTU2MTcyLCAweDFENjY2NjIyLAorMHg2MjYyRDYxQSwgMHgxRDI3QTI2RiwgMHg4QjM1ODgzMywgMHg0OTBCRDkxOSwKKzB4QTI2OEVFMDAsIDB4MDAwMDJERTAsIDB4MDAxMTc4MDAsIDB4MDAyMDNBMTQsCisweDAwMjAxOEEyLCAweDAwMjAyQUE0LCAweDAwMjAzOTA2LCAweDAwMjAzQTE4LAorMHgwMDIwMzUyQywgMHgwMDIwMThFRSwgMHgwMDIwMzkwNSwgMHgwMDExNzgwNCwKKzB4MDAyMDM5ODQsIDB4MDAxMTc4MTAsIDB4MDAyMDM5MDEsIDB4MDAyMDM5MDIsCisweDAwMjAzOTAzLCAweDAwMjAwRjY0LCAweDAwMUM1ODY0LCAweDAwMUM2ODY0LAorMHgwMDFDNzg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywgMHgwMDFDNzlCQywKKzB4MDAyMDBGQkMsIDB4MDAyMDBGQjgsIDB4ODkwMTg4MjgsIDB4MDAwOUEwQzAsCisweEU2NDNERUI1LCAweDMyNjY2MkUxLCAweDFGRUU4RjAyLCAweDJFMjFFMjQwLAorMHg2MjJENjJFMSwgMHg4QjAxMzI2NywgMHgwMDA5QTBBQSwgMHhFNTAxODVFMSwKKzB4OEIwMTMwNTYsIDB4MDAwOUEwQTQsIDB4MkQxMEUxMDEsIDB4NjRFMUIyMjUsCisweEU2NDM1N0ZFLCAweDY1MkQ2MjcxLCAweDg5NDQzNTY3LCAweDM1NjNFNjQwLAorMHhFNjAwOEIwNSwgMHgwRjY1RTA0MCwgMHhBMDBGRTExQSwgMHg2MTUzNzJDMCwKKzB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsIDB4NDUyMTQxMjEsIDB4NDUyMTQ1MjEsCisweEM5MDM2MDUzLCAweEUwNDA2NjAzLCAweDcxMTgwRjY1LCAweDIyMDlFMDA3LAorMHgwRjI1RTAzQywgMHhFMDQ0NjQxRCwgMHhCMkEzNjVGMywgMHhFMzNDMEY0NiwKKzB4ODUzMjMzRkMsIDB4NjIwRERFOTUsIDB4NDIwODYwMzEsIDB4NjAyMzYxMEQsCisweDEzMjNFOTQ0LCAweDA2RkU0MTA4LCAweEUwMEYzOUZDLCAweDEzMTQ0RTBCLAorMHg2NzA3NUQ5MSwgMHg2MEQzMjY3OSwgMHgwRjY2NTRGRSwgMHg1MTkyODU0MiwKKzB4NjAwRDRFMEIsIDB4NjBEMzI2MEIsIDB4MEY2NjY0OTIsIDB4NjVGM0IyMzcsCisweDY5NjE1NkZFLCAweEU2NDA2NTlELCAweDg5MzgzNTYzLCAweEQ3ODM1OUZFLAorMHg3OTA2NjU5MSwgMHhDOTAzNjA1MywgMHg0MDAwNDAwOCwgMHg2MTAzNjIwMywKKzB4MEYyNkUwNTAsIDB4NDcwQkUwRkYsIDB4NkMwNzYwMEMsIDB4NjYwMzYwNUQsCisweDQ2MjE0NjIxLCAweDQ2MjE0NjIxLCAweDQyMDA2MjYzLCAweDQyMDAzMjZDLAorMHg0MDIxNDAyMSwgMHg0MDA4QzkwMywgMHg2RDJEMzBGQywgMHhFODAwNkEwMywKKzB4QjI1NzY1RjMsIDB4NkVBMjY0RDMsIDB4MkVDOUUwNTAsIDB4NjY5NDJBRTIsCisweEQ3NkUwMUZFLCAweDYwNkM0NzBCLCAweDJBRTIyRTBCLCAweDY0RDM2NUYzLAorMHg3ODAxQjFGRCwgMHhFRTA2NjI4RCwgMHg4RkU5MzJFMywgMHg1RUZFN0QwMSwKKzB4NjFFMUU0MDAsIDB4NDEwMDg1RTEsIDB4NjZFMzMxMEMsIDB4NzYwQzcxMUIsCisweEU3MDQ2NUYzLCAweDY4NjY3NDAxLCAweDNBNzM2QTRELCAweDhGRjkyNTgyLAorMHg2NUYzNzUwNCwgMHg2NDFEQjFFMywgMHg2NEUxQjFBNCwgMHgwMDA5QTE3QiwKKzB4RDQ1QjU2RjcsIDB4RUMwMUQyNUIsIDB4MjZDMDQyMEIsIDB4MDAwOUExNzMsCisweDA2RkNFMDE4LCAweDg4Mjk2MDZDLCAweDU4Rjc4QjA4LCAweEU0MDBEMjUyLAorMHg2NjIyMjg0MCwgMHg2NDZEQjE3MSwgMHgwMDA5QTE2NSwgMHg2NjZDRTY4MSwKKzB4ODkwMTMwNjAsIDB4MDAwOUEwQUMsIDB4RDU1MEQxNEYsIDB4NjIxMjZBNTYsCisweDIxMjIzMkFDLCAweDU0MTE2QzU2LCAweDM0Q0M2MjUzLCAweDY0NTIxMTQxLAorMHg3MjA4NTgxMiwgMHhENDRBMzg0QywgMHg2ODIyMTE4MiwgMHg1QTEzNkM0MiwKKzB4M0FDQzNDOEMsIDB4MTFBMzI0QzIsIDB4NkMyMjcyRUMsIDB4NzIxMDU4MTQsCisweDExODQzOENDLCAweDVBMTU2ODIyLCAweDExQTUzQThDLCAweDZBMjI3MjEwLAorMHhENjQwNTgxNiwgMHgxMTg2MzhBQywgMHg1MjE3NkM2MiwgMHgxMTI3MzJDQywKKzB4NUExODU4NjEsIDB4MTFBODNBOEMsIDB4NUMxOTVBNjIsIDB4MTFDOTNDQUMsCisweDUyMUE1QzYzLCAweDExMkEzMkNDLCAweDVBMUI1ODY0LCAweDExQUIzQThDLAorMHg1QzFDNUE2NSwgMHgxMUNDM0NBQywgMHg1MjFENUM2NiwgMHgxMTJEMzJDQywKKzB4NUExRTU4NjcsIDB4MTFBRTNBOEMsIDB4NTYxRjVBNjgsIDB4MzZBQ0U4NDAsCisweDExNkZEQTJELCAweDZDQTIzODFDLCAweDdBOTQ2NjgyLCAweDI4NjIzNkNDLAorMHg1QzgxNjJBMiwgMHgxOEMxM0MyQywgMHg2MkEyN0E0NCwgMHgzNjJDNTY4MiwKKzB4RDYyNjE4NjIsIDB4NUE4NTYyNjIsIDB4M0EyQzQyMjksIDB4NzYwNDE4QTUsCisweDU2ODY2MjYyLCAweDM2MkM0MjI5LCAweDU2RjcxODY2LCAweDI2MjBFMjM4LAorMHgxNkMxNUM4MSwgMHgxNjIyNjIxMiwgMHhFMjAwNUMxMSwgMHg1NTEyMTZDMywKKzB4NTUxNTE2NTQsIDB4NTUxMzE2NTUsIDB4NTUxNjE2NTYsIDB4NTU4MjE2NTcsCisweDY1ODIxNjU4LCAweDU1MTQxNjU5LCAweDU1ODQxNjVBLCAweDU1ODMxNjVCLAorMHg1NTg1MTY1QywgMHg1NTg2MTY1RCwgMHgxODIxMTY1RSwgMHgxMTIxMjEyMiwKKzB4MTEyNTExMjIsIDB4MTEyNjExMjMsIDB4MjgyMjE4MjIsIDB4MTgyNDExMjQsCisweDE4MjUxODIzLCAweDE4MjZBMEM3LCAweDAwMTE3ODA0LCAweDAwMjAzM0UwLAorMHgwMDIwM0EzOCwgMHgwMDIwMThBMiwgMHgwMDIwMzQ4QywgMHgwMDFDMzZBMCwKKzB4MDAyMDM0RTgsIDB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsCisweDY2NkNFNjgyLCAweDhCMjAzMDYwLCAweEVBMjQ1NkY3LCAweDI2QTBEMTk0LAorMHgxNkMxNUMxNywgMHgxNjIyNTIxOCwgMHgxNjgzNTgxOSwgMHgxNkE0NUExQSwKKzB4MTZDNTVDMUIsIDB4MTYyNjUyMUMsIDB4RTIwMDU4MUQsIDB4NTUxRTE2ODcsCisweDU1MUYxNjU4LCAweDExMjcxNjU5LCAweDExMjkxMTI4LCAweDExMkIxMTJBLAorMHgxMTJEMTEyQywgMHhBMDhFMTEyRSwgMHhFNjgzMTEyRiwgMHgzMDYwNjY2QywKKzB4NTJGNzhCMEIsIDB4RUEwMEQ4ODMsIDB4NjU4MjIyQTAsIDB4NzgwNERDODIsCisweDYyODIyQzUyLCAweEEwN0VENjgxLCAweEU2OTAyNjIwLCAweDMwNjA2NjZDLAorMHhEQTdGOEIwNiwgMHgwMDA5NEEwQiwgMHhFMjAwNTZGNywgMHgyNjIwQTA3MywKKzB4NjY2Q0U2OTEsIDB4OEIxMDMwNjAsIDB4NjIyMkQyNzYsIDB4MjIyODYyMkMsCisweEQyNzg4OTA0LCAweDAwMDk0MjBCLCAweDAwMDlBMDAzLCAweDQyMEJEMjc2LAorMHg1NkY3MDAwOSwgMHhBMDVFRTIwMCwgMHhFNjkyMjYyMCwgMHgzMDYwNjY2QywKKzB4RTAxODg5NTEsIDB4RTZCMDBCRkMsIDB4NjY2QzYyQkMsIDB4OEIyQTMyNjAsCisweDAyRkNFMDE0LCAweDY4MkNFQTAwLCAweDYyQURFOTA0LCAweDg5NEEzMjgzLAorMHg2QUFEREQ2NCwgMHgzQ0RDNkNBMywgMHg3RDA0NkVDMiwgMHhEQjY4RDQ2NywKKzB4MzJEQzYyQTMsIDB4NEIwQkRDNjcsIDB4NEMwQjZEMjIsIDB4RDQ2NjY0RTMsCisweDAwMDk0QjBCLCAweDY0RDM0QzBCLCAweDRCMEJENDY0LCAweEU2MDAwMDA5LAorMHg2NjZENkJFMywgMHg3NjAxM0I2QywgMHgzMjkzNjI2RCwgMHg4RkY3MkJEMCwKKzB4QUZEQTREMTksIDB4RTZCNTdBMDgsIDB4MzI2MDY2NkMsIDB4RDQ1QzhCMTMsCisweDRCMEJEQjU3LCAweEQyNUIwMDA5LCAweDYwMjJEQjVCLCAweENCMjBFNkZGLAorMHgyMjAyNjY2RCwgMHhEQjU5MkI2MiwgMHhFMDE0RTIwMCwgMHg1NkY3MkIyMCwKKzB4QTAxMDAyRkMsIDB4RDQ1NjI2MjAsIDB4NjU0MkQyNTYsIDB4NDIwQkQ0NTYsCisweEEwMDgwMDA5LCAweERCNTIwMDA5LCAweDUyQjFFNjAwLCAweDYyMkNEQjUzLAorMHg1MkY3MkIyMSwgMHg3RjU0MjI2MCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsIDB4RTI0MDYxNEQsCisweDg5MTQzMTIzLCAweDMxMjdFMjFGLCAweDhCMDlENzQ5LCAweEQ0NDk2MTRELAorMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywgMHgxNzYxQTAwNywKKzB4RTAwMUQ0NDQsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsIDB4NEYyNjI3NjIsCisweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTEyLAorMHhENzNCMzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDIzQSwgMHg0MjBCNzFFMCwKKzB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyMzYsIDB4RTAwMTQyMEIsCisweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LAorMHg2MjUyRDUzMSwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUyRDQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4QTAwMTAwMDksCisweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTI2NDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywgMHgyRkU2MDAwOSwKKzB4N0ZGQzRGMjIsIDB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsIDB4RTI4MEQ2MjAsCisweDU0RTExNjE1LCAweDE2NDY0MjE4LCAweDQyMjg1NUUyLCAweDU3RTMxNjU3LAorMHgxNjc4NkVGMiwgMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwgMHg2RUY2QUZDRSwKKzB4MDAyMDM0OEMsIDB4MDAxMTc4MDQsIDB4MDAyMDM4RUMsIDB4MDAyMDM5MDAsCisweDAwMjAwNTBBLCAweDAwMjAxMDA4LCAweDAwMjAxMDJFLCAweDAwMjAzQTUwLAorMHgwMDIwMThBMiwgMHgwMDIwMThFNiwgMHgwMDIwM0E2NCwgMHgwMDIwM0E2QywKKzB4MDAyMDNBNzAsIDB4MDAxQzM1MDAsIDB4MDAxQzEwMDAsIDB4MDAyMDM5ODIsCisweDAwMTE3ODAwLCAweDAwMjAxOEVFLCAweDAwMjAzQTg0LCAweDAwMjAzOTg4LAorMHgwMDFDMzcwNCwgMHgwMDIwMzNFMCwgMHgwMDFDMzczQywgMHgwMDFDMzcwMCwKKzB4MDAxQzM3MEMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkM1M0REMTAsCisweDZFNDNCRkE0LCAweDJERTJCRjg5LCAweDAwMDlCRkEwLCAweDJDMTI1MUQ1LAorMHgxQzQxNTRENiwgMHgxQzUyNTVENywgMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4NjE2MzZDRjYsIDB4QTAwNEU2MDAsIDB4NjI1NjQxMDksCisweDI0MjI3NjAxLCAweDM2MTI3NDA0LCAweDAwMEI4QkY5LCAweDAwMDAwMDA5LAorMHgwMDFDMzcwQywgMHgwMDA5QTE2RSwgMHgyRkU2MkZENiwgMHhERDk0NEYyMiwKKzB4QTAwNDlFQjIsIDB4RDQ5MzAwMDksIDB4NDIwQkQyOTMsIDB4NjJEMjY1RDIsCisweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyOEZENDkwLCAweDU1RDE0MjBCLAorMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwgMHhENDhEMDAwOSwgMHg0MjBCRDI4QSwKKzB4NTJEMjU1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4NkQ0ODksCisweDU1RDM0MjBCLCAweDIyRTg1MkQzLCAweEEwMDQ4QkY4LCAweEQ0ODYwMDA5LAorMHg0MjBCRDI4MSwgMHg1MkQ0NTVENCwgMHg4QkY4MjJFOCwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsCisweDZENTNCMDFBLCAweDY0RDM1N0Y0LCAweEIwNUY2NUUzLCAweEIwNzU2NkMzLAorMHhCMEE0MDAwOSwgMHhCMEE4MDAwOSwgMHhCMEFDMDAwOSwgMHhCMEFDMDAwOSwKKzB4QjBBRjAwMDksIDB4QjAzMTU0RjUsIDB4NkNDRDZDMDMsIDB4NEYyNjYwQzMsCisweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDM0MTJEMTcwLCAweEQ2NzAwNTI5LAorMHgyNjUwRDc3MCwgMHgyNzQyMDAwQiwgMHgwMDA5QTAxOCwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsIDB4NkQ1M0JGRUUsIDB4NjREMzU3RjQsCisweEIwMzM2NUUzLCAweEIwOEQ2NkMzLCAweEIwMEY1NEY1LCAweDZDQ0Q2QzAzLAorMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHhFNTAzRDE2MiwKKzB4RDc2M0Q0NjIsIDB4MjE1MjQ1MTgsIDB4MjQ3MjAwMEIsIDB4RDQ1RkQxNUUsCisweDIxNjJFNjAwLCAweDI0NjIwMDBCLCAweEJGNzM0RjIyLCAweEJGNzNFNDBBLAorMHhEMjVDMDAwOSwgMHg0MTE4RTEwNCwgMHhFNDBBRTUwMCwgMHhCRjY5MjIxMiwKKzB4RDc1OTIyNTIsIDB4Q0IyMDYwNzIsIDB4MDAwQjRGMjYsIDB4NEYyMjI3MDIsCisweDQxMEJEMTU2LCAweEQ1NTZFNDAwLCAweDRGMjY0NTJCLCAweEQxNTUyRkU2LAorMHg2NjEyNkU2MywgMHg5MjEwNDQxOCwgMHg0NDA4NDUyOCwgMHg0NTAwMjYyOSwKKzB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsIDB4MjE2MjQ3MDgsIDB4RDE0RTQ3MDgsCisweDIxNzIyN0VCLCAweDZFRjYwMDBCLCAweDFGRkYwM0YwLCAweDRGMjIyRkU2LAorMHhFMTAxREU0QSwgMHhCRjNERTQwQSwgMHg2N0UzMkUxMiwgMHhFNTAwNzc2QywKKzB4RTIwNEUxMzAsIDB4Mjc1MkU0MEEsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzIyMjcxMiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDE3NUFCRjE4LCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LCAweEQyMzQ2RUY2LAorMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMyMjI0MiwgMHhFNjA1RDQzMiwKKzB4MDAwQjIxNjIsIDB4MDAwQjI0NjIsIDB4RDIzMDAwMDksIDB4RTQwQUU2MDEsCisweDIyNjJBRjAwLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2QzQzREIyQiwgMHhFRDAwNjBCMiwgMHgyQjAyQ0IwMywgMHhDOTAzNjBCMiwKKzB4NkUwM0EwMDgsIDB4ODkwNzNEQzIsIDB4RTQ2NDYwQjIsIDB4QjA3Q0M5MDMsCisweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhGMDQzREMyLCAweEQ0MjEyRkUxLAorMHg0NjBCRDYyMSwgMHg2MkYxMDAwOSwgMHg2MDIzNjIyRCwgMHg4OUZGQzgwMSwKKzB4N0YwNDYwMjMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDAwMUMzQjg4LCAweDAwMjAzQTk4LCAweDAwMjAxOEVFLCAweDAwMjAzQUEwLAorMHgwMDIwM0FBOCwgMHgwMDIwM0FCMCwgMHgwMDIwM0FCOCwgMHgwMDI1RTcyMCwKKzB4MDAyMDNEOTgsIDB4MDAyMDM4RjAsIDB4MDAxQzU5NjgsIDB4MDAxQzNCNDAsCisweDAwMEY4MDAwLCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLCAweDAwMjAxNUUwLAorMHgwMDIwMTYwQywgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgzMCwKKzB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsIDB4MDAxQzU4MUMsCisweDAwMUM1ODYwLCAweDAwMjAzQUMwLCAweDAwMjAxOEEyLCAweDhGMDE0NDExLAorMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHg1NjUxRDUyQiwgMHg0NjI4NjA1MiwKKzB4MzA2QzAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsCisweEJGRjE0RjAyLCAweDZCMDM2RTQzLCAweEREMjVEQzI0LCAweDAwMDlCRkVDLAorMHgzQzA1MzBCOCwgMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwgMHgwMjBBM0Q2NSwKKzB4NDIwOTQyMDksIDB4MzJFMjQyMDksIDB4NEYwNjhCRjAsIDB4NEYyNjRGMTYsCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDJGQzY2QkY2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHhCRkNGNEYwMiwgMHg2QzAzNkU0MywgMHhCRkNCREQxMywKKzB4MzBDODAwMDksIDB4MDYwQTNEMDUsIDB4NDYwOTQ2MDksIDB4MzZFMjQ2MDEsCisweDRGMDY4QkY1LCAweDRGMjY0RjE2LCAweDZERjY2RUY2LCAweDZDRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAyREUwQiwgMHhFNDAzRTUwMCwgMHhCRkI5MkUxMiwKKzB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsCisweDZFRjZBRkIwLCAweDAwMDkwMDBCLCAweDAwMUMxMDQwLCAweENDQ0NDQ0NELAorMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGOTgsIDB4NjQ1M0U3MTAsCisweDZCNTM0NzI4LCAweEVFMUFEQ0JDLCAweDYxNTM2NTVELCAweDMxNUM0MTA4LAorMHg3NTAxNDEwOCwgMHg2MDQzMzE3QywgMHgwRjE2NjY1RCwgMHhFRDAwNjBCMywKKzB4MjFCMTM2RTMsIDB4ODExMjgxMTEsIDB4MTFEMjgxMTMsIDB4MTFENDExRDMsCisweDc0MDQ4RkVBLCAweEQ4QjE2N0YyLCAweDE4NzFEOUIxLCAweDU4RjEyODcyLAorMHgxOTgxRDFCMCwgMHg1OUYyMjk4MiwgMHg1REY0NUFGMywgMHg1NEY2NUVGNSwKKzB4MjE5MjExOTEsIDB4MTFBMjExQTMsIDB4MTFENDExRDUsIDB4MTFFNjExRTcsCisweDExNDgxMTQ5LCAweERBQTg1NUY3LCAweDU3RjhFRTAwLCAweDUyRjlEREE3LAorMHg2NEUzRDZBNywgMHgyQTUyMUE1MSwgMHhEOEE3RDlBNiwgMHgyRDcyOUFENSwKKzB4NkVFRDI2MjIsIDB4NEQwODZERTMsIDB4M0RFQzYxRTMsIDB4NEQwODQxMDgsCisweDNEOUMzMUVDLCAweDQxMDg2MEIzLCAweDgxRDEyREIxLCAweDQxMDhFMDUwLAorMHg0MDA4RTdCNywgMHg2NzdDNDEwOCwgMHg2MEIzODFEMiwgMHhFMjAwMzE4QywKKzB4ODFEMzM0NzIsIDB4MUQxMzFERDIsIDB4OEQwMUQ0OTMsIDB4RDQ5MDFEMjQsCisweEIwQjM2NUQzLCAweDY0RUQ3RTAxLCAweDhCREEzNEEyLCAweDJGRDJEQThDLAorMHhERDkyNjhBMiwgMHgyRDgyNDgyOSwgMHg3REZDNjRBMiwgMHhEMjg3Njk0RCwKKzB4NkUyMjJEOTIsIDB4N0QwQzRFMjksIDB4NjgyMjJERTIsIDB4NjE4RDZBRDMsCisweDJBMTZENzg0LCAweEQ0OEE2RDcyLCAweDI0RDJENTgzLCAweEQ2ODk1RTcyLAorMHg1MTc0MTRFMiwgMHgxNDE0RUUwMCwgMHhEMTg3NTg3NiwgMHg1OTc4MTQ4NiwKKzB4MTQ5OEU3MTAsIDB4NjVFMzYyNTIsIDB4MjZFMjE0MkEsIDB4RTYwMDY0RTMsCisweDY4NDM2NDRELCAweDM4NEM0ODA4LCAweDM4MUM0ODA4LCAweDBDODY2MDUzLAorMHgwOUNFMjhCMSwgMHg4MTkxNjBCMywgMHgwQUNFNjA1MywgMHg4MUEyNjA0MywKKzB4MERDRTYwNTMsIDB4ODFEMzYwQjMsIDB4MDhDRTYwNTMsIDB4MTg4Mjc0MDEsCisweDYyNEQwOUNFLCAweDBBQ0UxOUUzLCAweDFBNjQzMjczLCAweDc1MDQ4RkUwLAorMHhFMDAzRDk2QSwgMHg0MDE4NkM5MiwgMHg2RDkyMkNCMSwgMHg4MUQxREE2RiwKKzB4NkU5MkUwNTAsIDB4ODFFMjQwMDgsIDB4NjBCMzYxOTIsIDB4NjQ5MjgxMTMsCisweDE0NDJFNjAwLCAweEQ0Njk2NzkyLCAweDY4OTIxN0EzLCAweDE4NjRFMUZGLAorMHg2NTYzRTcwMywgMHgzNjRDNDYwOCwgMHgyNjEyNzUwMSwgMHgzNjczNjY1RCwKKzB4REM1QjhCRjgsIDB4NkRDMkUwMDMsIDB4MkRCMTQwMTgsIDB4RDI2MDZFQzIsCisweDYxQzI4MUUxLCAweDExMTJFRTAwLCAweEUwMjQ2NEMyLCAweDY1QzIxNDIzLAorMHgxNUU0RDQ1QiwgMHhFNTgwNjdDMiwgMHg2OEMyODE3MiwgMHg4MTgzNjZFMywKKzB4NjY2RDY1NUMsIDB4NzYwNDY5NjMsIDB4Mzk0QzZBNkQsIDB4OEZGODNBNTMsCisweERCNTQyOUUyLCAweDI0QjJEQzU0LCAweDI0QzI3NDA0LCAweDRGMjY3RjY4LAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwKKzB4NjAxMTYxNDIsIDB4OEYwM0M4MDMsIDB4RDIzREU1MDAsIDB4OEIwNjM0MjAsCisweEM5MDM2MDExLCAweDhCMDY4ODAyLCAweDM0MjBEMjM5LCAweDU2MTI4QjAzLAorMHg1MjY0NjUxMywgMHgwMDBCMjQyMiwgMHgwMTEzNjA1MywgMHgyRkU2MkZENiwKKzB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsIDB4NDUwOEU0MDAsCisweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLCAweDYwNTM4MTIzLAorMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIzOCwgMHhFNjE0NjRGMywKKzB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksIDB4NjVGMzYxRjEsCisweDJGMTEyMTQ5LCAweEQxMzE1NEQxLCAweEU2MTQ0MTBCLCAweDYwNzE1N0QxLAorMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsIDB4NkQ0M0U1RkMsCisweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLCAweDEyRTQ4QjA2LAorMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwgMHg1NjY0QUZGMCwKKzB4NjRGM0QyMUUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsIDB4MjcxOUUxRkMsCisweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTE4LCAweDQxMEJFNjE0LAorMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwgMHg0RjI2N0YxNCwKKzB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDM5MUMsIDB4MDAyMDM0RUMsCisweDAwMjAzNEY0LCAweDAwMjAzNEZDLCAweDAwMjAzNTI0LCAweDAwMjAzOTA4LAorMHgwMDIwMzkxMCwgMHgwMDEwMDIwOCwgMHgwMDEwMTdDMCwgMHgwMDFFMjEwQywKKzB4MDAxQzNEMDAsIDB4MDAyMDM5NUMsIDB4MDAxMDAwQzgsIDB4MDAxMTc4ODAsCisweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLCAweDAwMjAwRUQ2LAorMHg0RjIyMkZFNiwgMHhERTQyNjI0QywgMHg0MjAwNDIwOCwgMHgzRTJDQTAwNSwKKzB4RDQ0MDUyNTIsIDB4QkY2OTU2MjQsIDB4NjVFMjJFNjIsIDB4MzUyMDUyRTEsCisweEQ2M0Q4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEQzM5NEYyMiwgMHg1MkMxREIzOSwgMHgzNjIwNjZDMiwKKzB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUzNDg5MTgsIDB4QkYzN0REMzUsCisweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELCAweEQ0MzI4OTA3LAorMHgwMDA5QkY3NiwgMHg0RDBCRDQzMSwgMHhBRkU2MDAwOSwgMHhCRjNEMDAwOSwKKzB4RDQyRjY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsIDB4MjI2MkQyMkQsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhERDI5REMyOCwgMHg2RTQzNjBDMiwgMHgwNERFNDAwOCwKKzB4RTYxNEQxMjcsIDB4NjVFMzQxMEIsIDB4RDEyN0Q3MjYsIDB4NTVFMjI3RTIsCisweDM1RTA1MjU0LCAweDIxMjI4RjA0LCAweDQwMDg2MEMyLCAweDEyMjIwMkRFLAorMHg2MDUzNjVDMiwgMHg3NTAxNDAwOCwgMHgwREU2MDZERSwgMHhDOTBGNjA1MywKKzB4NjA2MzJDMDIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4ODU0MzZDRjYsCisweDY1MEQ1NjQzLCAweDYyMkQ2MjYyLCAweDM1Mjc3MjA0LCAweEUxMDA4RjBDLAorMHgyMjY4OTYwQywgMHhENjE1OEIwMywgMHg3MjAxNTI2MSwgMHhENjEzMTYyMSwKKzB4NjI2MkUxMDEsIDB4MjYyMjcyMDEsIDB4NjAxMzAwMEIsIDB4MDAwMDAxRkYsCisweDAwMjAzNEZDLCAweDAwMjAzNEY0LCAweDAwMUMzRDAwLCAweDAwMjAzNTI0LAorMHgwMDIwMzhFQywgMHgwMDIwMThBMiwgMHgwMDIwMzRFQywgMHgwMDIwM0FFOCwKKzB4MDAyMDNBRUMsIDB4MDAxQzNEMjgsIDB4MDAyMDM5NUMsIDB4MDAyMDM5MUMsCisweDAwMjAwRUQ2LCAweDAwMjAzOTYwLCAweDAwMjAzOTY0LCAweDAwMTE3NzU0LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY4NEYyMiwgMHg2MDIyRDIzNywKKzB4OEQ1OEM4MDMsIDB4REUzNjJGMDEsIDB4REIzN0RDMzYsIDB4NjZDMjUyQzEsCisweDg5MkYzNjIwLCAweEM5MDM2MDYxLCAweDg5MkI4ODAxLCAweEQyMzNERDMxLAorMHg2NEQzNDIwQiwgMHgxRjAxNjUwMywgMHg4ODAxNjBCMSwgMHhEMjMwOEIwNCwKKzB4NjREMzQyMEIsIDB4MDAwOUFGRUEsIDB4ODU2MTU2NTMsIDB4ODkwNEM4MjAsCisweEUwNTBENzJDLCAweDcyMDEwMjdFLCAweEQyMkIwNzI2LCAweDY0NTM0MjBCLAorMHg4OTA3MjAwOCwgMHg1NUYxRDEyNiwgMHg2NEQzNDEwQiwgMHhFNjAxRDcyNywKKzB4Mjc2MkFGRDQsIDB4NTVGMUQyMjYsIDB4NjRFMzQyMEIsIDB4RTYwMUQxMjUsCisweDIxNjJBRkNDLCAweEREMjVERTI0LCAweERDMjZEQjI1LCAweDY2RDI1MkQxLAorMHg4OTE4MzYyMCwgMHhDOTAzNjA2MSwgMHg4OTE0ODgwMSwgMHhEMTE3RDQxRiwKKzB4MDAwOTQxMEIsIDB4MzZFMDU2MDMsIDB4NjUwMzhGMDQsIDB4MkIyMEUyMDEsCisweDJDNTJBRkVDLCAweEQ3MTJENDFDLCAweDAwMDk0NzBCLCAweEU2MDFEMTE1LAorMHhBRkUzNDYxOCwgMHg2MEYxMjE2MiwgMHg4OTA3QzgwNCwgMHg3RjA4RDIxNywKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4NEYyNjdGMDgsCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDAwMDA2QkY2LCAweDAwMUUyMTAwLAorMHgwMDIwMzRGQywgMHgwMDIwMzRGNCwgMHgwMDIwMzk4NCwgMHgwMDIwMTRBMCwKKzB4MDAyMDE0Q0MsIDB4MDAyMDM0OEMsIDB4MDAyMDE2QkUsIDB4MDAxRTIxMkMsCisweDAwMjAxNTMwLCAweDAwMUMzRDMwLCAweDAwMTE3ODgwLCAweDAwMjAzNEVDLAorMHgwMDIwMzkwQywgMHgwMDIwMzkwOCwgMHgwMDIwMzUyNCwgMHgwMDIwMDYxMCwKKzB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsCisweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwKKzB4NjQ0Q0JGRjIsIDB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweEU1MDA2Q0Y2LCAweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLAorMHhBRkUzOEJGQSwgMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywKKzB4NjA0M0VFMEEsIDB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksCisweEU2MzBFNjM3LCAweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLAorMHgwMDBCODAyOCwgMHgwMDBCNkVGNiwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwKKzB4N0ZFQzRGMjIsIDB4NkU0MzYyNTMsIDB4QkZEQzY1RjMsIDB4QkZEMDY0MjMsCisweEJGQ0U2NEUzLCAweEQ0MDM2NEYzLCAweDAwMDlCRkNCLCAweDRGMjY3RjE0LAorMHg2RUY2MDAwQiwgMHgwMDIwM0FGMCwgMHhFNEZERDI5RCwgMHhENzlENjEyMiwKKzB4MjIxMjIxNDksIDB4NzQwMTYwMjIsIDB4MjIwMkNCMDEsIDB4RDU5QTY2MjIsCisweDIyNjIyNjQ5LCAweEM4NDA2MDcwLCAweDYwNTI4OTAyLCAweDI1MDJDQjA0LAorMHhFNjAxNjA1MiwgMHgyNTAyQ0IwOCwgMHhFNDAyNjA1MiwgMHgyNTAyQzlDRiwKKzB4NDYxODYwNTIsIDB4MjUwMkNCMTAsIDB4Q0IwMzYwNTIsIDB4MTU0MjI1MDIsCisweDE1NjMwMDBCLCAweEQ3OEVENThELCAweEQ0OEZEMjhFLCAweEU2MDBFMTAwLAorMHgyNzExMjUxMSwgMHhBRkNGMjIxMCwgMHg2NjRDMjQ2MSwgMHg0NjAwRDI4QiwKKzB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsIDB4NjU0QzI2MDAsIDB4NDUwMEQyODcsCisweDY2NTAzNTJDLCAweDI2MTlFMUVGLCAweDI1NjAwMDBCLCAweEQyODQ2NjRDLAorMHgzNjJDNDYwMCwgMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjgwNjU0QywKKzB4MzUyQzQ1MDAsIDB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsCisweDQ2MDBEMjdBLCAweDYwNjAzNjJDLCAweDAwMEJDQjA4LCAweDY1NEMyNjAwLAorMHg0NTAwRDI3NiwgMHg2NjUwMzUyQywgMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwKKzB4RDI3MzY2NEMsIDB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsCisweEQyNkY2NTRDLCAweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LAorMHg2MjRDMjU2MCwgMHg0MjAwRDY2OSwgMHg2MDIwMzI2QywgMHg0MDIxQzkwOCwKKzB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsIDB4RDY2NTYyNEMsIDB4MzI2QzQyMDAsCisweEM5MDg2MDIwLCAweDQwMjE0MDIxLCAweDAwMEI0MDIxLCAweEQxNjE2MDBDLAorMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwgMHhEMTVGNjAyQywgMHgzNDFDNjQ0QywKKzB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsIDB4NkU0MzRGMjIsIDB4RTYwQTY0NUMsCisweDg5MTQzNDY3LCAweDAwMDlCRkVCLCAweDYwRUM2NDBDLCAweDhCMDI4ODAxLAorMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwgMHg2MjRDNDQwOSwgMHgzMjYzRTYwQSwKKzB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsIDB4Qzg4MDYwMjMsIDB4RTIwMDhCMDAsCisweDRGMjY2MDIzLCAweDZFRjYwMDBCLCAweEQ2NEM0RjIyLCAweDg4MDE2MDYyLAorMHhCMjU3OEIwMywgMHhBMDAzMDAwOSwgMHhEMjQ5MDAwOSwgMHgyMjYwRTY0MCwKKzB4RTIwMEQ2NDgsIDB4MDAwQjRGMjYsIDB4NEYyMjI2MjIsIDB4NjA2MkQ2NDMsCisweDhCMDE4ODAyLCAweDAwMDlCMkEwLCAweEUyMDBENjQyLCAweDAwMEI0RjI2LAorMHhENTNFMjYyMiwgMHhFMTAwRDQzRSwgMHgyNTEyRTcwMSwgMHgyNDcwMDAwQiwKKzB4RTYwNEQyM0IsIDB4MjI2MDAwMEIsIDB4RDQzQjRGMjIsIDB4NDEwQkQxM0IsCisweEQ1M0IwMDA5LCAweDY2NTBFMUZELCAweDI2MTlEMjNBLCAweDI1NjBFNzAwLAorMHgwMDBCNEYyNiwgMHg0RjIyMjI3MCwgMHhEMjM4RDUzNywgMHhENzM4NjE1MiwKKzB4MjUxMjYxMUQsIDB4RTZGRjY0NTIsIDB4MjU0MjI0MkIsIDB4RDIyRkQ0MzUsCisweDQyMEI2NjZELCAweEQ1MkUyNzYyLCAweDY3NTBFMUZCLCAweDRGMjYyNzE5LAorMHgyNTcwMDAwQiwgMHhENDMwNEYyMiwgMHg0MTBCRDEyOCwgMHhENTI4MDAwOSwKKzB4NjY1MEU3RjcsIDB4NEYyNjI2NzksIDB4MjU2MDAwMEIsIDB4OTQyNUQ1MjQsCisweDIyNDk2MjUwLCAweDI1MjAwMDBCLCAweEU0QkZENTIxLCAweDIyNDk2MjUwLAorMHgyNTIwMDAwQiwgMHhEMjI1NEYyMiwgMHg2MDBEODUyMiwgMHg4OTExMjAwOCwKKzB4ODk0NTg4MDEsIDB4ODk0Nzg4MDMsIDB4ODk0OTg4MDUsIDB4ODk0Rjg4MDYsCisweDg5NTU4ODA4LCAweDg5NUI4ODA5LCAweDg5NjE4ODBBLCAweDg5Njc4ODBCLAorMHgwMDA5QTA2RSwgMHgwMDA5QjA3MCwgMHg2MDBDQTA2QiwgMHgwMDAwRkY3RiwKKzB4MDAxRTIxNDgsIDB4MDAxRTEwMDAsIDB4MDAxRTExMDgsIDB4MDAyMDM5QkMsCisweDAwMjAzOUJFLCAweDAwMjAzOURELCAweDAwMjAzOUEwLCAweDAwMUUxMDNGLAorMHgwMDFFMTA1RiwgMHgwMDFFMTAyRiwgMHgwMDFFMTA5MCwgMHgwMDIwMzlDNCwKKzB4MDAxRTEwMEIsIDB4MDAyMDM5QzAsIDB4MDAyMDNBRjQsIDB4MDAyMDE4QTIsCisweDAwMUUxMDI4LCAweDAwMjAzOURDLCAweDAwMUQ0MDIwLCAweDk4NzYwMDAwLAorMHgwMDFDMTAwMCwgMHgwMDIwM0IwMCwgMHgwMDIwM0IxMCwgMHgwMDIwMzk5NCwKKzB4MDAwOUIwNEMsIDB4NjAwQ0EwMzUsIDB4MDAwOUIwNTUsIDB4NjAwQ0EwMzEsCisweDYyNjBENjg0LCAweDhCMkIyMjI4LCAweDAwMDlCMDYxLCAweDYwMENBMDI5LAorMHg2MjYwRDY4MCwgMHg4QjIzMjIyOCwgMHgwMDA5QjA2OSwgMHg2MDBDQTAyMSwKKzB4NjI2MEQ2N0MsIDB4OEIxQjIyMjgsIDB4MDAwOUIwQzcsIDB4NjAwQ0EwMTksCisweDYyNjBENjc4LCAweDhCMTMyMjI4LCAweDAwMDlCMENELCAweDYwMENBMDExLAorMHg2MjYwRDY3NCwgMHg4QjBCMjIyOCwgMHgwMDA5QjEyNSwgMHg2MDBDQTAwOSwKKzB4NjI2MEQ2NzAsIDB4OEIwMzIyMjgsIDB4MDAwOUIxM0QsIDB4NjAwQ0EwMDEsCisweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEQyNkNEMTZCLCAweEQ1NkM4NDEyLAorMHg0MDAwQzkwRiwgMHhENzZCMDEyRCwgMHhFNDAzRDY2QiwgMHhFMjBGNjExQywKKzB4MjU0MEUwMDEsIDB4MjUyMDI3MTIsIDB4MjYwMjAwMEIsIDB4RTYwMUQyNjIsCisweDMwNjY4NTIzLCAweEUwMDA4RDA1LCAweEQ2NjNEMjYwLCAweEUwMDE4MTIyLAorMHgwMDBCMjYwMiwgMHhEMjVDMDAwOSwgMHg2MDBEODUyMywgMHg4OTA1MjAwOCwKKzB4OEIwQTg4MDEsIDB4NjA2MEQ2NUQsIDB4MjYwMENCMDEsIDB4RDQ1N0Q2NUEsCisweEUwMDFFMTAxLCAweDAwMEIyNjEyLCAweDAwMEI4MTQyLCAweEQxNTJFMDAwLAorMHg4NTEzRTUwMSwgMHg2NDBENDUxOCwgMHg2NjAzMzQ1MywgMHhFMDAwOEQwNSwKKzB4RDU1MUQyNTMsIDB4MjI2MEUwMDEsIDB4MDAwQjI1MDIsIDB4NEYyMjAwMDksCisweDg1MTNEMTQ5LCAweDY0NTM2NTBELCAweDYyNDk0NDE5LCAweDIyN0Q2NzJFLAorMHg4ODAxNjAyQywgMHg4ODAyODkwOSwgMHg4ODAzODkxMCwgMHg4ODA2ODkxQSwKKzB4ODgwNzg5MzUsIDB4QTA0Qzg5M0IsIDB4RDU0NjAwMDksIDB4NjY1MkQ3NDYsCisweDI3NjJENDQ2LCAweDYyMkM2MjYxLCAweDI0MjFBMDM4LCAweDIyMjg2MjVDLAorMHhENDQzOEIzRiwgMHg2NjQyRDU0MCwgMHgyNTYyRDQ0MCwgMHgyNDAxODU2MSwKKzB4NjIwM0EwMkMsIDB4MjAwODYwNUMsIDB4ODgxMDg5MDcsIDB4ODgyMDg5MDgsCisweDg4MzA4OTA5LCAweEEwMkM4OTBBLCAweEQyM0EwMDA5LCAweDYyMjJBMDA4LAorMHhBMDA1RDIzOSwgMHhEMjM5NjIyMiwgMHg2MjIyQTAwMiwgMHg2MjYyRDYzOCwKKzB4RDQzMkQ1MzEsIDB4NjYyMTI1MjIsIDB4QTAwRjYyNkMsIDB4RDYzNTI0MjEsCisweDYyNjFENTJELCAweDYyMkNENDJELCAweEEwMDcyNTYyLCAweEQ2MzIyNDIxLAorMHg4NTYxRDUyOSwgMHgyNTYyRDQyOSwgMHg2MjAzMjQwMSwgMHg2NjJEODUxNSwKKzB4MzYxNzYxMEQsIDB4NjUwMzhGMDEsIDB4QjBDQjI0NTEsIDB4QTAwMTAwMDksCisweEUwMDBFMDAxLCAweDAwMEI0RjI2LCAweEQ2MTkwMDA5LCAweEQ0MjdFMTAxLAorMHg2NTQxMjYxMCwgMHhEMTE4RDcxNywgMHhFMjBGNjU1RCwgMHgyNzUyRTAwMSwKKzB4MDAwQjI2MjAsIDB4MkZFNjIxMDIsIDB4RDIwRjRGMjIsIDB4NjQwQzg1MjMsCisweDhCMDgyNDQ4LCAweEQ1MTFENjFELCAweDI2MjFFMjAwLCAweDk0MEY4NDUxLAorMHhBMDQ4MjA0OSwgMHhERTBEODA1MSwgMHhDODQwNjBFMCwgMHhFMjAxOEQzMiwKKzB4ODk0NDM0MjcsIDB4RDIxNkQ2MTUsIDB4MjY0MTQyMEIsIDB4MDAwOUEwMzAsCisweDAwMDBGRjdGLCAweDAwMjAzOURELCAweDAwMjAzOTk0LCAweDAwMjAzOUEwLAorMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywgMHgwMDIwMzlDMCwgMHgwMDFFMTAwMCwKKzB4MDAxRTEwMDEsIDB4MDAyMDM5QzgsIDB4MDAyMDM5QTgsIDB4MDAyMDM5QUMsCisweDAwMjAzOUIwLCAweDAwMjAzOUNDLCAweDAwMjAzOUQwLCAweDAwMjAzOUQ0LAorMHgwMDIwMzlEOCwgMHgwMDIwM0RGQywgMHgwMDIwM0UwNiwgMHgwMDIwMzlCQSwKKzB4MDAyMDI4N0UsIDB4ODkxMjM0MjcsIDB4RDI5NEQ2OTMsIDB4MjY0MTQyMEIsCisweENCODA4NEUxLCAweDgwRTFCMEY1LCAweEQ2OTE2MEUwLCAweDJFMDBDQjA0LAorMHhDOTNGNjA2MCwgMHhENjhGMjYwMCwgMHhBMDAxRTAwMSwgMHhFMDAwMjYwMiwKKzB4MDAwQjRGMjYsIDB4RDY4QzZFRjYsIDB4Qzg4MDYwNjAsIDB4RDI4Njg5MTksCisweDg4MDE2MDIxLCAweEQyODk4QjE1LCAweDg1MjRFNTAxLCAweDg5MTAzMDU2LAorMHhFMjAzRDE4NywgMHgyMTIwRDQ4NywgMHhFMDBCNjU0MSwgMHgwNjU2NjU1RCwKKzB4RTQwRkQ1ODUsIDB4MjE0MEU3MDIsIDB4RDc3RTI1NzEsIDB4MDAwQkUwMDEsCisweDAwMEIyNzAyLCAweDJGRTZFMDAwLCAweERFODA0RjIyLCAweEM4ODA4NEUxLAorMHhENTdBODkyQywgMHgyMDA4ODU1NCwgMHg2MTAzOEYyOCwgMHg4NTUzRDc3QywKKzB4NjQwMzY2NzIsIDB4ODU2NjY1MEMsIDB4MzUyMDYyMEMsIDB4RDY3OThCMUUsCisweDY1MUNENzc0LCAweDI2NTE2NDRDLCAweDYwRTAyNzQxLCAweDg5MDRDODQwLAorMHg0MjBCRDI3NSwgMHhBMDAzMDAwOSwgMHhEMjY4MDAwOSwgMHgwMDA5NDIwQiwKKzB4MDAwOUIwOUYsIDB4RTIwMUQxNjcsIDB4NjBFMDIxMjIsIDB4Q0IwNEQ0NjQsCisweDYwNDAyRTAwLCAweDI0MDBDOTNGLCAweDYwMjNBMDAxLCAweDRGMjZFMDAwLAorMHg2RUY2MDAwQiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHhEQTYyMkZFNiwKKzB4NjZBMUUyNDAsIDB4MzYyMkRDNUUsIDB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsCisweDRFMjEzNkQ4LCAweDRFMjEyQTYxLCAweERCNjFENDYwLCAweEU3MDBBMDBGLAorMHg3NzAxNjJCMiwgMHg3MTAyNjEyMywgMHg2NjIxMkIxMiwgMHg3MTAyNjIxMywKKzB4NjEyMTJCMTIsIDB4NjUxRDY2NkQsIDB4MzU2QzQ1MjgsIDB4NjI3QzI0NTIsCisweDhCRUQzMkUzLCAweEM5MDM2MEQzLCAweDhCMTA4ODAzLCAweDYxNzM2N0IyLAorMHgyQjEyNzEwMiwgMHg3MTAyNkUxMywgMHgyQjEyNjU3MSwgMHg2NTVENkRFMSwKKzB4NDIyODYyREQsIDB4MzI1Q0UxMDcsIDB4QTAwQzJDMTAsIDB4ODgwMjI0MjIsCisweEEwMDM4QjAxLCAweDg4MDFFMjAzLCAweEUyMDE4QjA1LCAweDY2QjIyQzIwLAorMHg2NTVENjU2MSwgMHhFNjBGMjQ1MiwgMHg2N0ExMkM2MCwgMHg4QjA1Mjc3OCwKKzB4REQzOERDNDQsIDB4RUIwMUVBMDAsIDB4MkRCMjJDQTIsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLCAweDJGRTYyRkQ2LCAweEUyNDBERDM2LAorMHgzNjIyNjZEMSwgMHg2MjYzODkwMCwgMHgzNjc4NjcyQywgMHg3NzAzREUzOCwKKzB4NDcyMTJENjEsIDB4NjRFMkQ2MzUsIDB4QTAwRTQ3MjEsIDB4NjU2MkUxMDAsCisweDYyNTM3MTAxLCAweDc0MDEyNDUwLCAweDI0MjA0MjE5LCAweDQ1Mjk3NDAxLAorMHg3NDAxMjQ1MCwgMHgyNDUwNDUxOSwgMHg2MjFDNzQwMSwgMHg4QkVFMzI3MywKKzB4NjZFMjQyMDAsIDB4NDIwMDYxRDEsIDB4MjExODM2MkMsIDB4MkU2MjhGMDYsCisweEREMUNENzI4LCAweEU1MDFFNDAwLCAweDJENTIyNzQyLCAweDAwMEI2RUY2LAorMHgyRkQ2NkRGNiwgMHg0RjIyMkZFNiwgMHhFRDBBRUUwMSwgMHg2NEUzQkM4NSwKKzB4QkM4QTY0RTMsIDB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4QkM4REVFMDEsCisweDY0RTM2NEUzLCAweDdFMDFCQzkyLCAweDMyRDc2MkVDLCAweDRGMjY4QkY3LAorMHgwMDBCNkVGNiwgMHhEMTE4NkRGNiwgMHhENDE4OTIwRCwgMHg3MjEyMjEyMiwKKzB4MjQyMkQ2MTcsIDB4RDcxNzcyMDQsIDB4NzIyMDI2MjIsIDB4MjcyMkQxMTYsCisweDAwMEI3MjMwLCAweDEzN0EyMTIyLCAweDAwMjAzOUJBLCAweDAwMjAyOThBLAorMHgwMDFFMTAxNSwgMHgwMDIwMzlDMCwgMHgwMDFFMTAwMSwgMHgwMDIwMzk5NCwKKzB4MDAxRTExMDAsIDB4MDAyMDM5QkUsIDB4MDAyMDM5QUMsIDB4MDAxRTEwMDAsCisweDAwMjAzOUIwLCAweDAwMjAzOUJDLCAweDAwMjAyODdFLCAweDAwMUUxMDBDLAorMHgwMDIwMzlBOCwgMHgwMDIwMzlDNCwgMHgwMDIwMzlDOCwgMHgwMDIwMzlDQywKKzB4MDAyMDM5RDAsIDB4MDAyMDM5RDQsIDB4MDAyMDM5RDgsIDB4NEYyMjJGRTYsCisweEQ2NzA3RkZDLCAweDg4MDE2MDYwLCAweEUyMDE4OTUxLCAweDI2MjBCRkJCLAorMHhENTZFRDE2RCwgMHhERTZFNjAxMCwgMHg2NEUzNjU1MiwgMHg3NDAyQzg0MCwKKzB4OEQyMkQxNkMsIDB4RDI2Qzc1MDIsIDB4RTYwMUQ3NkMsIDB4RTcwNDI3MjIsCisweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NjM3NDAyLAorMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwKKzB4ODFFNDYwN0MsIDB4RTQxN0Q1NjIsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsCisweDhGRjkyMTcxLCAweEEwMjA3MTAyLCAweEQyNUUwMDA5LCAweEU2MDFENzVCLAorMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywKKzB4RDQ1Mjc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksCisweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTUzLCAweDY3NTU3NjAxLAorMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHg5Mjg5NzEwMiwgMHhEMjQ2MkUyMSwKKzB4NUUyM0Q3NEUsIDB4NjRGMjJGRTIsIDB4NjA0MzY1RjIsIDB4MjcwMEM5ODAsCisweEM5NjA2MDQzLCAweDgwNzE2MTAzLCAweEM5MDM2MDQzLCAweDgwNzI0NTE5LAorMHg2NUYyNjA1QywgMHg4MTcyNjZGMiwgMHg0NjE5NDYyOSwgMHg2MDZDNDUyOSwKKzB4NDAxODY0NUMsIDB4ODE3MzMwNEMsIDB4MjExODVFMjMsIDB4NjRGMjJGRTIsCisweDZFNEM2MkYyLCAweDYwMkM0MjE5LCAweDY2RjI2MkYyLCAweDQ2Mjk0MDE4LAorMHg0NjE5MzBFQywgMHg0MjI5ODE3NCwgMHg2NTJDNjA2QywgMHgzMDVDNDAxOCwKKzB4ODE3NThGMDcsIDB4MDAwOUJDOTYsIDB4MjIyODYyMEMsIDB4QTAwQTg5MDgsCisweDYwMTMwMDA5LCAweDhCMDM4ODQwLCAweDAwMDlCMDA5LCAweDAwMDlBMDAzLAorMHhFMjAyRDYyRiwgMHg3RjA0MjYyMiwgMHgwMDBCNEYyNiwgMHg0RjIyNkVGNiwKKzB4ODU1MkQ1MkEsIDB4ODgzMDYwMEQsIDB4ODgzMTg5MDMsIDB4QTAzNDg5MjMsCisweDg1NTUwMDA5LCAweEQ0MjhENzI3LCAweDg1NTMyNzAxLCAweDYxMERENjI3LAorMHgyNDEyNDExOCwgMHg0NjBCRDQyNiwgMHhENzIzMDAwOSwgMHhEMjI2RDQyNSwKKzB4NjU3MjQyMEIsIDB4RTIzMEQxMjAsIDB4NDIyODY3MTIsIDB4MjcyOUU2MjAsCisweDM3NjA0NjI4LCAweEQ2MjE4QjAzLCAweEEwMTZFMjAwLCAweEQ2MUYyNjIyLAorMHhBMDEyRTIwMiwgMHhEMTE4MjYyMiwgMHg2MjEyRTUzMCwgMHhFNjIwNDUyOCwKKzB4NDYyODIyNTksIDB4ODkwODMyNjAsIDB4RDQxQUQxMTksIDB4RTYwMUQ1MTMsCisweDIxNjA0NTBCLCAweDQ3MkJENzE4LCAweDRGMjY0RjI2LCAweDAwMDkwMDBCLAorMHgwMDAwMDYwQSwgMHgwMDIwMzlEQywgMHgwMDFFMTAwMCwgMHgwMDIwMzlDOCwKKzB4MDAyMDNERkMsIDB4MDAyMDNFMDgsIDB4MDAyMDNEQTAsIDB4MDAyMDM5QjAsCisweDAwMjAzREQwLCAweDAwMjAzRENFLCAweDAwMjAzREEyLCAweDAwMjAzOTk0LAorMHgwMDIwMzlDMCwgMHgwMDIwMzlBQywgMHgwMDIwMzlBOCwgMHgwMDIwMThBMiwKKzB4MDAyMDNCMUMsIDB4MDAyMDNCMjAsIDB4MDAyMDE4RUUsIDB4MDAyMDM5QzQsCisweDAwMUUxMDBCLCAweDAwMjAzQjM0LCAweDAwMTE0MDA0LCAweDRGMjIyRkU2LAorMHhERTk2N0ZGQywgMHgyMDA4ODRFOSwgMHgyRjAwOEQwNiwgMHhENjk1RDQ5NCwKKzB4MDAwOTQ2MEIsIDB4NjRGMEIxOUEsIDB4NjYyMEQyOTMsIDB4ODkwMjI2NjgsCisweEM5QkY2MEUwLCAweDdGMDQyRTAwLCAweDAwMEI0RjI2LCAweDAwMEI2RUY2LAorMHgyRkU2MDAwOSwgMHhERThENEYyMiwgMHg2MEUwRDY4RCwgMHhDQkMwRDQ4RCwKKzB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsCisweDY2MDNBMDAyLCAweDY2MDM0MDA5LCAweEQ2ODc2MTZELCAweEU1MDBBMDA0LAorMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwgMHhEMjgzOEJGOCwKKzB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsIDB4NEYyNjgwRTIsIDB4NkVGNjAwMEIsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweDYyNjBENjdELCAweDg5NDQyMjI4LAorMHhENTcyRTEwMCwgMHg2MDUwMjYxMCwgMHhDQjQwRDQ3QSwgMHgyNTAwNDQwQiwKKzB4OEQwNTIwMDgsIDB4NjJFMDZFMDMsIDB4NzEwNDYxMkMsIDB4MkYxMUEwMDYsCisweEQ0NzVENjZELCAweERENzU2NzYwLCAweDY1N0M0RDBCLCAweEUyM0M2RDFELAorMHg4QjAzM0QyNywgMHhEMjY3RDQ3MiwgMHgwMDA5NDIwQiwgMHg0RDIxNEQyMSwKKzB4QTAwNUQ3NzAsIDB4NjZFNkU0MDAsIDB4MzU3QzQ1MDgsIDB4NzQwMTI1NjIsCisweDM1RDM2NTRELCAweEQ3NkM4QkY3LCAweDYxNzJFMDAzLCAweDgxMTE0MDE4LAorMHg2RTcyNjBGMSwgMHg4MUUyNzAwQywgMHhENDY4NjE3MiwgMHhERDY4ODExMywKKzB4NEQwQkRFNjgsIDB4RTIwMTY1NzIsIDB4RDQ2NzJFMjIsIDB4NDIwQkQyNTUsCisweEQ2NTYwMDA5LCAweEM5M0Y2MDYwLCAweDdGMDQyNjAwLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEMjVGNEYyMiwKKzB4NkI0MzZFNzMsIDB4NDIwQjZDNTMsIDB4MjAwODZENjMsIDB4NjQwMzhEMUMsCisweEU1MEVEMTQ5LCAweDMyNTI2MjEwLCAweDYwQzM4OTE2LCAweDgwNDEyNEIwLAorMHg4MTQxNjBEMywgMHhBMDA3RTUwMCwgMHg2NTVENjFCQywgMHgwMEVDNjA1MywKKzB4MzY0QzY2NTMsIDB4ODA2NDc1MDEsIDB4MzIxMzYyNUQsIDB4RDYzQjhCRjUsCisweEM5QkY2MDYwLCAweDI2MDBBMDA4LCAweEQyM0FENDRELCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjAwMEIsIDB4N0ZDNDRGMjIsIDB4NzIwMjYyRjMsIDB4MjI1MTJGNDEsCisweDQ1Mjk3MjAyLCAweDYwNjMyMjUxLCAweEU1QzRFNjgyLCAweDY3RjM4MTIxLAorMHg2NTVDNjY2QywgMHhFNDA4QkZCNiwgMHg0RjI2N0YzQywgMHgwMDA5MDAwQiwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEUxMDA3RkM0LCAweDY1MTNFQ0ZGLCAweDZCMTM2Q0NELCAweERFMzZENzM1LAorMHhFREZGNjRGMywgMHhEODM1RUEwNCwgMHg2MDUzNjU1QywgMHgwMjdENDAwMCwKKzB4MzJDMDYyMkQsIDB4NjYwMzhEMEQsIDB4MDlFRDYwNjMsIDB4MjQ5MTAyN0QsCisweDI0MjE3NDAyLCAweDY5ODIwMkVELCAweDM5Mjg2MjJELCAweDc0MDIyODkyLAorMHg3NTAxNzEwNCwgMHg2MDYzNjI1QywgMHgwN0Q1MzJBMiwgMHgwRUI1OEZFNCwKKzB4MjQ0ODY0MUMsIDB4RTY4MDg5MDUsIDB4NjdGM0U1QzUsIDB4QkY3OTY2NkMsCisweDdGM0M2NTVDLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHhEMTFFNjhGNiwgMHg2MDEyRDIxRSwgMHhDQjIwRTQwNSwKKzB4MjEwMkU1MDAsIDB4MDAwQjIyNDIsIDB4MDAwMDIyNTIsIDB4MDAxRTEwMTcsCisweDAwMjAzQjM4LCAweDAwMjAxOEEyLCAweDAwMjAzOTA2LCAweDAwMUUxMDE1LAorMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwgMHgwMDFFMTBGQywgMHgwMDIwMDYxMCwKKzB4MDAyMDM5MEMsIDB4MDAyMDJBRTIsIDB4MDAyMDNCM0MsIDB4MDAyMDE4RUUsCisweDAwMjAzQjU4LCAweDAwMTE3ODhDLCAweDAwMjAzOTA4LCAweDAwMjAzNEVDLAorMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwgMHgwMDIwM0I2MCwgMHgwMDIwMkFBNCwKKzB4MDAyMDNCNjQsIDB4MDAyMDM5NkMsIDB4MDAyMDM5NzQsIDB4MDAyMDNEOUMsCisweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweEQ1NjREMTYzLCAweEU0MDBENzY0LAorMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwgMHhENTYyMjcyMiwgMHg5NjY5RDc2MiwKKzB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsIDB4RTYwMTE1NjUsIDB4RDU1RjExNjUsCisweDY2NkNFNkY4LCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywgMHg2NzYzMjU3MiwgMHgyNTYyNzc5NywKKzB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsIDB4RTIxOTI1MjIsIDB4RTI3MDI1MjIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1MjIyNTQyLCAweDI1MjJFMjBDLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MDAwQjE1NEEsIDB4RTIwODExNDUsIDB4MDAwOTQyMkIsIDB4MkZFNjJGRDYsCisweDdGRkM0RjIyLCAweEM4MjA2MDQzLCAweDZFNDM4RDAyLCAweDAwMDlCRTY3LAorMHhDODEwNjBFMywgMHhCRTY0ODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAxQzg0MCwKKzB4MDAwOUJFODYsIDB4QzgwMTYwRTMsIDB4REQzRDg5MzgsIDB4QzgwMjYwRDAsCisweDJGMDA4RDAzLCAweDQ2MEJENjNCLCAweDYwRjAwMDA5LCAweDg5MDJDODA0LAorMHg0NjBCRDYzOSwgMHg2MkYwMDAwOSwgMHhDODgwNjAyMywgMHg2MEQwODkwMiwKKzB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsIDB4RDYzNDg5MDYsIDB4MDAwOTQ2MEIsCisweDAwMDlBMDA3LCAweDUxNjMwNjAxLCAweDg5MDJDODA4LCAweDQ2MEJENjMwLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwgMHg0MjBCRDIyRSwgMHhENTJFMDAwOSwKKzB4ODgwMjYwNTIsIDB4RDIyRDhCMDMsIDB4QTAwNUU2MDQsIDB4ODgwMTIyNjAsCisweEQyMkE4QjAyLCAweDIyNjBFNjAxLCAweDI1MjJFMjAwLCAweEM4ODA2MEUzLAorMHhEMjI3ODkyRCwgMHg2MEUzNkUyMCwgMHg4OTAyQzg4MCwgMHg0MjBCRDIyNSwKKzB4NjBFMzAwMDksIDB4ODkwMkM4NDAsIDB4NDIwQkQyMjMsIDB4NjBFMzAwMDksCisweDg5MDJDODAyLCAweDQyMEJEMjIxLCAweDYwRTMwMDA5LCAweDg5MERDODA0LAorMHhERDIwRDExRiwgMHgwMDA5NDEwQiwgMHgwMDA5QkYwRCwgMHgwMDA5QkY0QywKKzB4RDUxRUQ0MUQsIDB4MjQ3MEU3MDgsIDB4MjVEMkJGODUsIDB4QzgwODYwRTMsCisweEQyMUI4OTA1LCAweDRGMjY3RjA0LCAweDQyMkI2RUY2LCAweDdGMDQ2REY2LAorMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgwMDFDNTgxQywgMHhBMDAwQTAwMCwKKzB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsIDB4MDAwNDAwMjEsIDB4MDAxQzU4OUMsCisweDAwMUUxMDIxLCAweDAwMjAxQTg4LCAweDAwMjAxQUFBLCAweDAwMjAyMTBDLAorMHgwMDIwMUFDMiwgMHgwMDIwMUFEMCwgMHgwMDIwMzlDMCwgMHgwMDFFMTAwQiwKKzB4MDAxRTEwMjgsIDB4MDAyMDFCM0MsIDB4MDAyMDFCNDgsIDB4MDAyMDFBRDgsCisweDAwMjAxQUY2LCAweDEyMzQ1Njc4LCAweDAwMUUxMDAwLCAweDAwMTBGMTAwLAorMHgwMDIwMUIyNCwgMHg2NDRDRDZBNywgMHgwMDBCMzQ2QywgMHhENkE2MjQ1MCwKKzB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTQsIDB4MDAwQjM0NkMsCisweDYyNUMyNDUwLCAweDQyMDg2MTZELCAweDQyMDg0MTE5LCAweDQyMDA2MDE5LAorMHg2NzBFNjE0QywgMHhENDlFMzIxQywgMHg0MjAwMjA3RCwgMHgzMjRDQzkwRiwKKzB4MjIwMDAwMEIsIDB4NDIwODYyNUMsIDB4NDIwMDQyMDgsIDB4MzI0QzY0NEMsCisweDQyMDBENDk4LCAweDAwMEIzMjRDLCAweDJGRTYyMjYwLCAweDYxNEM0RjEyLAorMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywgMHhFMjlGNjY2RCwgMHgyNzI5NDYxOSwKKzB4NkU1MzYyNjksIDB4NjcyRTY1NzMsIDB4NDIyMTIyN0QsIDB4NDIyMTQyMjEsCisweDc2MDE2NjJDLCAweEU0MDE0NjA4LCAweDM0RTg0NjA4LCAweDY0NEM0NjAwLAorMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwgMHgwMDBCNEYxNiwgMHg0RjIyNkVGNiwKKzB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsIDB4RDI4NDhCN0IsIDB4MjY2ODY2MjEsCisweEQyODM4Qjc3LCAweDI2Njg2NjIxLCAweEU1MEY4QjczLCAweEU0MDFCRkEyLAorMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywgMHgyRjUwQkZBNCwKKzB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsIDB4NjA2MzQ2MTgsIDB4ODFGMkU0MDEsCisweDY1NDNCRjlGLCAweEU0MDE4NUYyLCAweEJGQUI2NTQzLCAweDg1RjI2NjAzLAorMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwgMHhFNDAyNjVGMCwgMHg2MDUzNzU2QywKKzB4ODBGOEJGODAsIDB4QkY4MkU0MDIsIDB4ODRGOEU1MTIsIDB4NzA5MEU0MDIsCisweDY1MDNCRjgyLCAweDQ2MThFNjAyLCAweDgxRjY2MDYzLCAweEJGODBFNDAyLAorMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwgMHhFNTAwQkY4QywgMHhFNDAyODVGNiwKKzB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsIDB4RTAxMDY1NUMsIDB4QkY2MUU0MDMsCisweEU1MTMwRjU0LCAweEU0MEVCRjYzLCAweDA1RkNFMDEwLCAweEJGNjNFNDBFLAorMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywgMHhFNTAwRTY0MCwgMHhCRjcxRTQwMywKKzB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsIDB4RTVGRkU2NDAsIDB4RTAxNDY1NUMsCisweEJGNDdFNDA0LCAweEU0MEYwRjU0LCAweEU1MDRCRjQ5LCAweDA1RkNFMDE0LAorMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwgMHhCRjRBRTY0MCwgMHhFNTAxRTQwNCwKKzB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUY1QzdGMTgsCisweDdGMTg0RjI2LCAweDAwMEI0RjI2LCAweDRGMjIwMDA5LCAweEQyNDI3RkYwLAorMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwgMHgyNjY4NjYyMSwgMHhEMjQwOEI2RCwKKzB4MjY2ODY2MjEsIDB4RTUwRjhCNjksIDB4RTQwMUJGMUMsIDB4QkYxRUU1MDEsCisweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRjFFLCAweEJGMUJFNDAxLAorMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywgMHhFNDAxRTY0MCwgMHhCRjI5NjU0MywKKzB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsIDB4NjVGMEU2NDAsIDB4NzU2Q0U0MDIsCisweEJFRkY2MDUzLCAweEU0MDI4MEY0LCAweEU1MTJCRjAxLCAweEU0MDI4NEY0LAorMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywgMHhCRjAyRTQwMiwgMHhFNjQwRTUwMCwKKzB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYxNkU0MDIsIDB4RTVGRUU1MDAsCisweDYwNTM2NTVDLCAweEJFRTVFNDAzLCAweEU1MTM4MEY4LCAweEU0MEVCRUU3LAorMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwgMHhFNTAwNjUwMywgMHhCRUU4RTY0MCwKKzB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGQ0U2NDAsCisweEU1RkZFNDAzLCAweDYwNTM2NTVDLCAweEJFQ0JFNDA0LCAweEU0MEY4MEZDLAorMHhFNTA0QkVDRCwgMHhFNDBGODRGQywgMHhCRUNENzA4MywgMHhFNTAxNjUwMywKKzB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsIDB4QkVEQkU2NDAsIDB4RTUwMUU0MDQsCisweEU0MDRFNjQwLCAweEFFRTA3RjEwLCAweDdGMTA0RjI2LCAweDAwMEI0RjI2LAorMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwgMHgwMDFFMTA4MCwgMHgwMDFFMTA5MCwKKzB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsIDB4MDAyMDM5QkEsIDB4MDAyMDM5QkMsCisweDAwMjAzOUJFLCAweEQyMUREMTFDLCAweDY2MjA2MDEwLCAweDY3NkM3MDAxLAorMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywgMHg2NzEwNjIxMCwgMHg3NzAxNjIyQywKKzB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsIDB4NDQwODQ0MDgsIDB4MzQyOEM5MEYsCisweDYyNjAyMTAwLCAweDcyMDFENTEzLCAweDQ0MDgyNjIwLCAweDAwMEIzNTRDLAorMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwgMHhFNjAwOEQxMywgMHhENjBERDQwQiwKKzB4NjU1QzY1NDAsIDB4NDcwODY3NTMsIDB4Mzc1ODQ3MDgsIDB4NDcwODY1NDAsCisweDI0NTA3NTAxLCAweDM2N0M2MDQwLCAweDI0MDBDOTBGLCAweDcyRkY2MjEwLAorMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywgMHgwMDIwMzkwNSwgMHgwMDIwMzkwNCwKKzB4MDAyMDM5MDYsIDB4MDAyMDM1MkMsIDB4N0ZGQzRGMjIsIDB4RTY4MEQxOUYsCisweDY2NkM2MjEyLCAweEQyOUUyRjIyLCAweDY3RjM2NTYzLCAweDQyMEI3NTQyLAorMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwgMHhFNjgwMDAwOSwgMHhEMjk4NjY2QywKKzB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsIDB4RTY4MDY0NzMsIDB4RDI5NDY2NkMsCisweEU3MDA2NTYzLCAweDQyMkI3NTQzLCAweDJGODY2NDczLCAweDJGQTYyRjk2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkNDNEYyMiwgMHhEQzhFRDI4RCwKKzB4NzIwMTFGMjEsIDB4REI4RDFGMjIsIDB4RDE4RURFOEQsIDB4NjYxMjUyMTEsCisweDhCMDEzNjIwLCAweDAwMDlBMEU1LCAweEM5MDM2MDYxLCAweDhCMDE4ODAxLAorMHgwMDA5QTBERiwgMHhEMjg4RDQ4NywgMHhFRDg0NDIwQiwgMHgyRjAyNTUwMywKKzB4MzBEMDg0NUMsIDB4QTBCODg5MDEsIDB4RDE4NDAwMDksIDB4NjI2QzY2MTAsCisweDg4MDE2MDIzLCAweEQxODI4QjY4LCAweDYyMTAxRkMzLCAweDg5NUIyMjI4LAorMHhFMDAzRDQ4MCwgMHg0MDE4Njc0MiwgMHg2ODQyMTc3MiwgMHhENTdFRTkwMCwKKzB4ODE4MTZEQjMsIDB4N0QwNDIxOTAsIDB4NjdEMjZBQjIsIDB4NjRFMjY4NTIsCisweDFGNDkxRjU3LCAweDc0MDQ2NEUzLCAweDFGQTQ2NTQyLCAweDY1NDMxRjVBLAorMHg2MjUyNzVGOCwgMHgxRjc2MUZENSwgMHg2RDUzMUYyQiwgMHhEQTc0RDc3MywKKzB4N0Q5NEQyNzQsIDB4NjhEMjFGODgsIDB4NkFBMjY5NzIsIDB4RDE3MjYwMjIsCisweDIyMDJDQjIwLCAweEUxNDAxRjFDLCAweDc2MDFFNjAwLCAweDMyMTM2MjZELAorMHg1NkY0OEJGQiwgMHg1MkY2NTFGNSwgMHgyMTIyMkI2MiwgMHg1MkY4NTFGNywKKzB4MjEyMjU2RjksIDB4MkU2MjUxRkEsIDB4NTFGQjI0MTIsIDB4MkQ4MjI1MTIsCisweEQ5NjYyNzkyLCAweDI5QTJERDVGLCAweDZBRDJEOTY1LCAweEQ5NjQ2ODkyLAorMHg2OEQyMUE4NCwgMHg2MDgxREE2MywgMHgyODAxQ0IwMSwgMHhEODYyNjZEMiwKKzB4MkE2MjI5NjIsIDB4RUQwMTVBRkMsIDB4MkFEMjQ4MEIsIDB4MkFEMjREMTgsCisweDYyRDJERDVFLCAweDJEMjI3MjAxLCAweEQxNTA1NkYzLCAweEUyMDI2MDYyLAorMHgyNjAyQ0IwMSwgMHgyMTIwQTAzRCwgMHg4QjNBMjIyOCwgMHhFNDAxREQ1OCwKKzB4MjE0MEU2MDAsIDB4RTAxQzJENjIsIDB4QzgwMTAwNUMsIDB4RDQ1NThCMEEsCisweEU2MDBENzU1LCAweEVEN0QyNDcyLCAweDYyNkM3NjAxLCAweDhCRkIzMkQzLAorMHgyNEQyREQ1MiwgMHhFMkZFNjhDMiwgMHgyQzgyMjgyOSwgMHgwOTVDRTAxRSwKKzB4RTAxRjVERjEsIDB4MEE1QzJEOTAsIDB4NzUxMDUxRjIsIDB4RUQwNjIxQTAsCisweEQ3NEJFNjAwLCAweDg0NTZENDRCLCAweDI3MDA3NjAxLCAweDY5NkM2ODU0LAorMHgyNDgwMzlEMywgMHg4RkY2NzQwMSwgMHhEQTQ3NzcwMSwgMHgyQTEwRTE5NCwKKzB4RTIwMDdBMDEsIDB4N0EwRjJBMjAsIDB4RDEzMEU4MDUsIDB4NjYxMDJBODAsCisweDYwMjM2MjZDLCAweDg5MDg4ODAxLCAweEQyNDBENDJBLCAweDQyMEI2NUYyLAorMHhEMTMxRUQwMSwgMHhBRjMwNEQxOCwgMHg2NUYyMjFEMiwgMHg4NTUzRDQzQywKKzB4NjIwRDY2NDIsIDB4ODkwNzMyNjIsIDB4RDEzQkQ0M0EsIDB4MDAwOTQxMEIsCisweEU2MDFENzNBLCAweDI3NjJBRjFBLCAweEQxMzRENDFFLCAweDQxMEI2NUYyLAorMHhEMTI1RUQwMSwgMHhENjM3RDQzNiwgMHg0NjBCNEQxOCwgMHhBRjBEMjFEMiwKKzB4N0YzNDAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweDRGMjI2OEY2LCAweDg1NDY3RkY0LCAweDJGMDFFNjgxLAorMHg2NjZDODU0NywgMHg4NTQ4ODFGMSwgMHg4MUYyRDIwOSwgMHg2N0YzODU0MiwKKzB4ODU0MzgxRjMsIDB4ODFGNEU0MEMsIDB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsCisweDdGMEM3NTQwLCAweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUMzRDlDLAorMHgwMDIwMjQ1NCwgMHgwMDExNzc5QSwgMHgwMDFDMzZGOCwgMHgwMDFDM0I5QywKKzB4MDAxQzM3MDQsIDB4MDAyMDM1MjQsIDB4MDAyMDE0QTAsIDB4MDAyMDM5MTUsCisweDAwMjAzOTE0LCAweDAwMjAzOTEwLCAweDAwMUMzRDk4LCAweDAwMUMzQkI0LAorMHgwMDFDNTk2MCwgMHgwMDFDMzUwMCwgMHgwMDFDM0QzMCwgMHgwMDFDODk2MCwKKzB4MDAyMDM0RkMsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MEMsIDB4MDAxMTc3MzAsCisweDAwMjAzOTE4LCAweDAwMUM1ODJDLCAweDIwMDBBMDAwLCAweDAwMDBBMDAwLAorMHgwMDExNzc4QywgMHgwMDExNzc5MiwgMHgwMDExNzc4OCwgMHgwMDIwMTRDQywKKzB4MDAyMDM4RUMsIDB4MDAyMDM0RUMsIDB4MDAyMDE1MzAsIDB4MDAxRTIxMzAsCisweDAwMjAzRDdDLCAweDAwMjAxOEEyLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhEMTlCN0ZFQywgMHgyRjEyRTAwMCwKKzB4NjEwM0Q0OUEsIDB4MUY0MjgxRjIsIDB4REQ5QURBOTksIDB4RDY5QTY4MTMsCisweEUwMDE0ODA4LCAweDQ2MEJERTk5LCAweDM4RUM0ODAwLCAweDY1QTIxRjAzLAorMHgzNTIwNTJBMSwgMHhBMjNFOEIwMSwgMHg2MDUxMDAwOSwgMHg4ODAxQzkwMywKKzB4QTIzODhCMDEsIDB4NTI1MzAwMDksIDB4MzJFMERFOTEsIDB4RDk5MThCMTAsCisweDY0QTM0OTBCLCAweDRCMEJEQjkwLCAweERFOTA2NDAzLCAweEQ3OTFENjkwLAorMHhFQzAxRDU5MSwgMHgyRTAyRTEwMCwgMHgyNzEwMjZDMCwgMHgyNTAyQUZERiwKKzB4QzgwMTg1NTEsIDB4QTE1NzhCMDEsIDB4NjI1MTAwMDksIDB4NDIwMDYyMkQsCisweDVFNTMzNjZBLCAweDg1RTIyMjZELCAweEM5MDM2NDJDLCAweDg1RTM2NjAzLAorMHg2MDUzNjUwRCwgMHg0MDIxNDAyMSwgMHg0NTAwQzkzRiwgMHgzMjJBNjcwMywKKzB4NjA1MzI1MkQsIDB4QzkwMUQxN0YsIDB4NjAxMDZDMDMsIDB4ODgwMUQ5N0YsCisweERCN0Y4QjA1LCAweDIxMjBFMjAwLCAweENCMDE2MEIyLCAweEQxN0QyQjAyLAorMHg4ODAxNjAxMSwgMHg2NUEyOEIwQSwgMHg4RDA0MjQ0OCwgMHg5QjlFNjI1MSwKKzB4QTAwMzIyQjksIDB4OTE5QjI1MjEsIDB4MjUyMTIyMUIsIDB4MzdCM0VCMTAsCisweDI0NDg4OTVFLCAweEQ0NzM4QjA3LCAweDIyMjg2MjQxLCAweDYwNjM4OTAzLAorMHhBMDU3ODFGOCwgMHhENTcwNjQ3MywgMHg0NjA4NDYwOCwgMHg4NUUyNjI3MywKKzB4NDYwMDZCNTAsIDB4MzYyQzQyMDAsIDB4MkJCOEM5MTAsIDB4OEYxRjY0NjMsCisweDI2Njg2NjAzLCAweEQyNjk4OTExLCAweDA2MkQ2MDQzLCAweDQxMTk2MTZELAorMHg2QjBFNjAxOSwgMHg4MUY4MjBCRCwgMHg4ODAxNjBDMywgMHg2NDZDOEYyQywKKzB4ODgwRjYwNzMsIDB4QTAyNzhCMUIsIDB4RDI2MTAwMDksIDB4MDUyRDYwNDMsCisweDQxMTk2MTVELCAweDY3MEU2MDE5LCAweDY0NUMyMDdELCAweDgxRjhBMDFDLAorMHg4OTBGMjY2OCwgMHg2MDQzRDI1QiwgMHg2QjVEMDUyRCwgMHg2MEI5NEIxOSwKKzB4MjAxRDYxMEUsIDB4NjBDMzgxRjgsIDB4OEYwRDg4MDEsIDB4NjQ3MzY0NUMsCisweEVDMDBBMDBBLCAweDYwNDNEMjU0LCAweDYyNUQwNTJELCAweDYwMjk0MjE5LAorMHgyMDdENjcwRSwgMHg4MUY4NjQ1QywgMHg4ODAyODVGOCwgMHg4NUUxODkwQSwKKzB4OEQwN0M4MjAsIDB4RTZEQzYyMDMsIDB4NjAyMzIyNjksIDB4ODFFMUEwMDIsCisweDY0NENFNEZGLCAweDYyMTBEMTQ5LCAweDg5MDEyMjI4LCAweDY0NENFNEZGLAorMHg2NTRERUJGRiwgMHgzNUIwNkJCQywgMHhEQjM2OEIyQiwgMHg2NEEzNEIwQiwKKzB4NDEwQkQxMzUsIDB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsIDB4Qzk0OERCNDAsCisweERDNDA4ODA4LCAweEJFQUU4QjAxLCAweDY0QjNFNTAyLCAweDY1RTM0QzBCLAorMHhEQjNERUMwMSwgMHhEMTNEMkRDMiwgMHg2MjEyNjBCMiwgMHg3MjAxNzAwMSwKKzB4MjEyMjg4MDUsIDB4MkIwMjhGMDgsIDB4NjY2Q0U2ODAsIDB4NjU2M0QyMzgsCisweDc1NDlFNzAwLCAweDY0NzM0MjBCLCAweEEwMzBENDM2LCAweDdGRkYwMDA5LAorMHg4NUUyODAwMCwgMHgyMEI5RUJGQywgMHg2MTAzODFFMiwgMHg5NDJBODVFMywKKzB4NjIwMzIwNDksIDB4NDUwODg1RjgsIDB4ODFFMjIwMUIsIDB4QzkwMTYwQzMsCisweDQwMDg0MDE4LCAweDQwMDg0MDA4LCAweDQwMDAyMjVCLCAweDYwMjMyMjBCLAorMHg4NUU0ODFFMywgMHg0MTE4RTEwOCwgMHg4MUU0MjAxQiwgMHhFNDAyNjJBMiwKKzB4MjBCOTg1MjEsIDB4NjdBMjgxMjEsIDB4Q0IwMTYwNzEsIDB4ODVGODI3MDEsCisweDg5MDMzMDQyLCAweEVDRTc4NUUyLCAweDgxRTIyMEM5LCAweDQ5MEJENDFFLAorMHhBMDNCMDAwOSwgMHg3RTAzMDAwOSwgMHgwMDFDM0QzMCwgMHgwMDIwM0Q4OCwKKzB4MDAyMDM0RkMsIDB4MDAxRTIxMkMsIDB4MDAyMDMzRTAsIDB4MDAxQzNEMDAsCisweDAwMTE3NzgwLCAweDAwMjAxNEEwLCAweDAwMjAxNjZDLCAweDAwMTE3NzBDLAorMHgwMDIwMzkxNCwgMHgwMDIwMzkxNSwgMHgwMDIwMzkxMCwgMHgwMDIwMThBMiwKKzB4MDAxQzM2RjgsIDB4MDAyMDM5ODgsIDB4MDAyMDNEOTgsIDB4MDAyMDNCN0MsCisweDAwMjAzQkZDLCAweDAwMjAzQzdDLCAweDAwMjAzQ0ZDLCAweDAwMjAzOTAwLAorMHgwMDIwMzRGNCwgMHgwMDIwMTRDQywgMHgwMDIwMzk4QywgMHgwMDIwMzk5MCwKKzB4MDAyMDI0NTQsIDB4MDAyMDNEODAsIDB4MDAyMDNEODQsIDB4NjAyMjYyRjIsCisweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMEI4ODBBLCAweDYwRTJERThDLAorMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwgMHg4QjAzODgwOCwgMHhDQjAxNjBBMiwKKzB4MjgwMkEwMDYsIDB4NjVFMkRFODcsIDB4MkU1Mjc1MDEsIDB4Mjg2MjY2QTIsCisweDUyRjM2NkYyLCAweDI2MjJBRTgzLCAweEQyODM4NTUxLCAweERFODNDODAyLAorMHhBMDk1OEIwMSwgMHg0MjBCMDAwOSwgMHg0RTBCNjRBMywgMHg1RTAzNjQwMywKKzB4ODVFNDY1MDMsIDB4NDkxOEU5MDgsIDB4RDc3RDIwOUIsIDB4RTA0QzgxRTQsCisweERDN0MwQjdFLCAweDdCMDFEOTdDLCAweDYxQzIwN0I2LCAweDcxMDE2NjkwLAorMHg4RDA2MjY2OCwgMHhENDc5MkMxMiwgMHg0MjBCRDI3OSwgMHhBMDcwRUIwMSwKKzB4NjI1MTJEQjIsIDB4NEIxOEVCMEYsIDB4MjJCOUUxMDIsIDB4MzIxMDQxMTgsCisweDg1NTE4QjBGLCAweDIwMjlFMkZDLCAweDYwNTE4MTUxLCAweENCMDE3MkUwLAorMHg4NUUxMjUwMSwgMHgyMDI5OTRBMywgMHg4NUU0ODFFMSwgMHhBMDUyMjA0OSwKKzB4Njc1MTgxRTQsIDB4NDcxOTY3N0QsIDB4NjY3RTY3NzksIDB4NzcwMTI3NkQsCisweDY5MDM2MDdDLCAweDg4MDE0OTE4LCAweDI1OTE4RjNFLCAweDZCMTJEMTYxLAorMHgyMUIyN0IwMSwgMHg2NjBEODVFMywgMHg0MDIxNjA2MywgMHhDOTNGNDAyMSwKKzB4NkMwMzQ2MDAsIDB4MjYyRDMyMkEsIDB4QzgwMTYwNjMsIDB4REI1RUQxNUQsCisweDk2N0Q4OTAxLCAweEU2MDAyQzZCLCAweDY2NkM2N0NELCAweDQwMDA2MDYzLAorMHg2MjJEMDIxRCwgMHg4RDBFMzI3MCwgMHg2MDQzNjQwMywgMHhFOUZGMDIxRCwKKzB4OEIwMTMyOTAsIDB4MDFDNUEwMDcsIDB4NjI2Qzc2MDEsIDB4MzI5MkU5MDQsCisweDY0NkM4QkVCLCAweDYwNDM0NDAwLCAweEQxNTAwNEJELCAweDBCNDU3NDAxLAorMHg2NjlENjkxMSwgMHg4OTA3MzY3MCwgMHg2MDJENjIxMSwgMHg4OTAzODhGRiwKKzB4RTIwMURCNEIsIDB4MkIyMDIxQzEsIDB4RUNGQzg1NTEsIDB4ODE1MTIwQzksCisweENCMDE2MDUxLCAweERDNDcyNTAxLCAweDY0QTM0QzBCLCAweDUxRjM2NkYyLAorMHg4NUVGMjYxMiwgMHg1NEYyRDI0NCwgMHg2NTBENDIwQiwgMHgwMDA5QURFNywKKzB4RTUwMERDNDIsIDB4NDIwQjJDNTIsIDB4NEUwQjY0QTMsIDB4NTQwMzY0MDMsCisweDg1NDQ2RTAzLCAweDY3MDNFOTA4LCAweDY1MDM0OTE4LCAweDI3OTk4NTQxLAorMHhEQjMyMzc5MCwgMHg4RjBCRDkzMiwgMHg2MDEzNjEwRCwgMHg4QjA3QzgyMCwKKzB4Qzk0ODYwNTMsIDB4OEIwMzg4MDgsIDB4RTUwMUJENEQsIDB4MDAwOUEwMDUsCisweDIxMjhEMjMzLCAweEJENDY4OTAxLCAweDY0QjNFNTAwLCAweDQ5MEI2NUUzLAorMHhBREJDRUMwMSwgMHg4NUYyMkRDMiwgMHg3MDAxRUUwNCwgMHgzMUU3NjEwRCwKKzB4OEQwMjgxRjIsIDB4QURBOTdBMDgsIDB4N0YxNDAwMDksIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweEY3RkY2OEY2LAorMHgyRkU2ODAwMCwgMHhEMjIzNEYyMiwgMHg2MEUzNkUyMiwgMHg4RDAyQzg0MCwKKzB4QkJGOTIyRTIsIDB4RTI0MDAwMDksIDB4MkUyODQyMTgsIDB4QkMwNDg5MDEsCisweDYwRTMwMDA5LCAweDg5MDVDODEwLCAweEQyMUNENDFCLCAweDAwMDk0MjBCLAorMHgwMDA5QkMwMywgMHhDODA1NjBFMywgMHhCRDZEODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwMkM4MDIsIDB4QUMwMDRGMjYsIDB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsCisweDAwMUMzRDNDLCAweDAwMTE3NzYwLCAweDAwMjAxNEEwLCAweDAwMjAxNjZDLAorMHgwMDIwMzQ4QywgMHgwMDIwM0Q5QywgMHgwMDIwMzkwMCwgMHgwMDIwMzRGNCwKKzB4MDAyMDE0Q0MsIDB4MDAyMDM5NkMsIDB4MDAyMDM5NzQsIDB4MDAyMDM5NjgsCisweDAwMjAzOTZBLCAweDAwMjAxNTMwLCAweDAwMjAxOEVFLCAweDAwMjAzOThDLAorMHgwMDAwODAwMCwgMHgwMDFDMzUxMCwgMHgwMDIwM0Q5MCwgMHgwMDIwMThBMiwKKzB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsIDB4MTIxNDE2MTgsCisweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLCAweDZDNjI1NjQ4LAorMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwKKzB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksIDB4MDAyMDM0MEEsCisweDAwMjAzM0MwLCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMjg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwKKzB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTAzLAorMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwKKzB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsIDB4MjA2Qzc1NEEsIDB4MzIyMDMxMjAsCisweDIwMzgzMDMwLCAweDMyM0EzMTMyLCAweDMyMzEzQTM3LCAweDAwMDAwMDAwLAorMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywgMHg0MjcwNzM3MiwgMHgzRDIwNjY3NSwKKzB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsIDB4NEU0OTcyNzQsCisweDZENzU0RTUxLCAweDAwMDAwMDNELCAweDYxNzY2RTQ5LCAweDIwNjQ2OTZDLAorMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwgMHgwMDIxNDQ0OSwKKzB4NTI1MDQ1NDUsIDB4NTcyMDRENEYsIDB4NjU3NDY5NzIsIDB4NjQ2MTIwMkMsCisweDAwM0Q3MjY0LCAweDZDNjE3NjIwLCAweDAwMDAwMDNELCAweDAwMDAwQTBELAorMHg0MzVGNEQ1QSwgMHg0NjVGNDQ0RCwgMHg0QzQ0NUY1NywgMHg0OTRFNDk1RiwKKzB4MDAwMDAwNTQsIDB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsCisweDNENjQ2RTYxLCAweDAwMDAwMDAwLCAweDIwM0EzMDUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsCisweDJCNDM0NzQxLCAweDczNjk2RjRFLCAweDYxNDMyMDY1LCAweDcyNjI2OTZDLAorMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwgMHg2RjIwNkM2OSwgMHg2OTc0MjA2RSwKKzB4MEQwQTY1NkQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsCisweDAwMDAwRDBBLCAweDYyNzM1NTc2LCAweDc0NzM3MjVGLCAweDAwMDAwQTBELAorMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwKKzB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsIDB4MDAwQTBENkQsIDB4MDAwMDAwNDQsCisweDQ0Mzg3NTcwLCAweDcyNjM3MzY1LCAweDZGNzQ3MDY5LCAweDNENTg0NTcyLAorMHgwMDAwMDAwMCwgMHgwMDAwMDA0NywgMHgwMDAwMDA0MiwgMHg3Mjc0NkU0OSwKKzB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsIDB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsCisweDc1NEU1MTRFLCAweDAwMDAzRDZELCAweDY1NEM3MjQ1LCAweDAwMDAwMDZFLAorMHgwMDAwMDA0OSwgMHgyMDc0NkY0RSwgMHg3NTZGNkU2NSwgMHg0OTIwNjg2NywKKzB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwRkYsCisweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsCisweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLCAweDAyMDAwMDAzLAorMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwKKzB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMDAwMDBGRiwKKzB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsIDB4MDAwMzAwMDMsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELAorMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwgMHgwMjAwMDEwRiwKKzB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsCisweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsCisweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLCAweDAxMEYwMTBGLAorMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwKKzB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMDIwNTIyMCwKKzB4MDAwMDAwNDYsIDB4MDAwMDAwNTksIDB4NzMyMDQxNDIsIDB4MDAzRDcxNjUsCisweDQ5NTQ0MTIwLCAweDAwMDAyMDRELCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwgMHgwMEZGMDQwMCwKKzB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsIDB4ODIwNTA3MDAsIDB4MDAwMjAwMDIsCisweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDMwNDA1LCAweDAyMDkwMTAwLAorMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwgMHgwNDAwMDAwNCwgMHgwMDAwMDBGRiwKKzB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsIDB4NDAwMjgyMDUsIDB4MDUwNzAwMDAsCisweDAwNDAwMzgzLCAweDA0MDUwNzAxLCAweDAwMDA0MDAyLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0xNTkyODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9CQS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X0JBLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NDE1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9CQS5jCkBAIC0wLDAgKzEsODc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5MTdGRkMsIDB4RTExNEQ3OTEsCisweDFFMTNENDkxLCAweDFFNEM0NzBCLCAweDAwMDlCMDE3LCAweDk1QzJFNjAwLAorMHhDODQwNjBFMiwgMHgyRjAyOEYwMywgMHg4RkY5MzY1MiwgMHhENDhCNzYwMSwKKzB4NEUwQkRFOEIsIDB4RDQ4QjAwMDksIDB4MDAwOTRFMEIsIDB4NEUwQkQ0OEEsCisweDdGMDQwMDA5LCAweEEwNDc0RjI2LCAweDRGMjI2RUY2LCAweDQxMEJEMTg3LAorMHhENDg3MDAwOSwgMHgwMDA5NDQwQiwgMHg0NTBCRDU4NiwgMHhENzg2MDAwOSwKKzB4NjExREUxRkYsIDB4RDE4NTI3MTIsIDB4NjAxMkUyRkYsIDB4Q0IwMUQ0ODQsCisweDcxREMyMTAyLCAweDcxMDQyMTIyLCAweDIxMjJFNTAxLCAweEQ1ODEyNDUyLAorMHhEMjgxOTc5MiwgMHhFNzAwMjU3MiwgMHhENDgxRDE4MCwgMHgyMjcwRDY4MSwKKzB4MjE3MkUyMDEsIDB4MjYyMDI0NzAsIDB4RTRGRkQ2N0YsIDB4RTYwMDI2NDEsCisweEUxMDRENTdFLCAweDYwNjM2NjZELCAweDYyNkQ3NjAxLCAweDMyMTI0MDAwLAorMHgwNTQ1OEZGOCwgMHhFNTAxRDI3QSwgMHhEMTdBMjI1MCwgMHhENTdCRDQ3QSwKKzB4RTcwMEU2MDAsIDB4MjU3MjI0NzAsIDB4MTE2MjIxNjIsIDB4MTE2OTExNjYsCisweDRGMjYxMTZBLCAweDExNkUwMDBCLCAweEQxNzU3RkM0LCAweDJGMTJEODc1LAorMHhENDc2RDE3NSwgMHhENTc3RDY3NiwgMHgxRjg3RDc3NywgMHhEOTc3NzhGQywKKzB4MUYxQkQyNzcsIDB4MUY0MTcxMDQsIDB4MUY2NDc0MDQsIDB4MUY4ODc2MDQsCisweDcxRjQxRjFDLCAweDFGNDJFOEM4LCAweDFGNjUxRjUzLCAweDFGOTkxRjc2LAorMHgxRjFEMUYyQSwgMHhERDZGNjg4QywgMHhEQTcwREU2RiwgMHhEQzcxREI3MCwKKzB4MDAwOTRBMEIsIDB4MDAwOTRCMEIsIDB4MDAwOTRDMEIsIDB4NjAxMEQxNUUsCisweDhCMEY4ODAxLCAweEU5NTBEMTVELCAweDQ5MTg2MjEyLCAweDhCMDczMjk2LAorMHg1NkZBRDE1OSwgMHgyMTIwRTIwMCwgMHhDQjAxNjA2MiwgMHgyNjAyQTAwMiwKKzB4MjEyMjcyMDEsIDB4ODgwMTYwRDIsIDB4RDE2Mzg5MDcsIDB4MzI4NjYyMTIsCisweEQxNjI4OTAzLCAweDg4MDE2MDEwLCAweDY0RTI4QkRBLCAweDUyRjc1MUY4LAorMHg1NUUxMjE0MiwgMHgyMjUyRDE1RSwgMHg2NjEyNTRGQiwgMHgyNDYyNTlGQywKKzB4Mjk3MjU3MTEsIDB4ODgwMTYwRDIsIDB4NjZFMjhCNTMsIDB4MzYyMDUyRTEsCisweDYwNjE4OTRDLCAweDg4MDFDOTBGLCAweEQxNTY4QjQ4LCAweDM2MjA2MjEyLAorMHhBMDQzODkwMywgMHgyNzEwMjE2MiwgMHhENTUzMEZBMCwgMHg2NjUxRTcxMCwKKzB4NjI2RDc2MDEsIDB4OEYzQzMyNzMsIDB4NjVGMjI1NjEsIDB4Njk1MjUxRjIsCisweDU0RjM1OUYxLCAweDY3OTI1MkY0LCAweDYxNDI2NTEyLCAweDU2RjY2OTIyLAorMHg2NDIyNTJGNSwgMHhDQjIwNjA2MiwgMHhFNjAwMjYwMiwgMHg3NjAxMUYxRSwKKzB4NjI2REUxMTAsIDB4MzIxMzQxMTgsIDB4NTFGRThGRjgsIDB4MjY3MjU2RjEsCisweDU2RjQ1N0YyLCAweDU1RjMyNzUyLCAweDI1MTI1N0Y1LCAweDI3NDIyNjkyLAorMHg1MUY5NjlFMiwgMHgyMTkyRDQzRCwgMHhFOTAxNjFGMiwgMHgyMTkyNDQwQiwKKzB4NDkxODY1RjIsIDB4RDkzODI1OTIsIDB4RTIwMEQ1MzksIDB4NjI1MTI5MjEsCisweDcyMDE1NEZELCAweDYyMkQyNTIxLCAweDI0MjJBMDAzLCAweEUyMDBEOTMyLAorMHhFOTAxMjkyMSwgMHgyRDkyRDEyQywgMHgyNjY4NjYxMiwgMHhBRjZGOEIwMSwKKzB4RDYzMDAwMDksIDB4MDAwOTQ2MEIsIDB4RTcwMEQxMjgsIDB4MjE3MEFGNjgsCisweDAwMUMwMDFDLCAweDAwMjAwRjdDLCAweDAwMDBCMzhFLCAweDAwMjAzMjJDLAorMHgwMDIwMTQ1RSwgMHgwMDIwMzIzOCwgMHgwMDIwMzI1MCwgMHgwMDIwMTQxQywKKzB4MDAyMDE1MUMsIDB4MDAyMDBGQTAsIDB4MDAxQzM1MTAsIDB4MDAxQzM2NDgsCisweDAwMUUyMTJDLCAweDAwMjAzMTg4LCAweDAwMjAyRDI0LCAweDAwMjAzMTkwLAorMHgwMDIwMzE5QywgMHgwMDIwMzFBOCwgMHgwMDIwMzFCOCwgMHgwMDIwMzFCQywKKzB4MDAyMDMxQjAsIDB4MDAxMTc3MDgsIDB4MDAyMDMxQjEsIDB4MDAyMDMxQjQsCisweDAwMUMzRDMwLCAweDAwMTE3NzE4LCAweDAwMTE3NzM0LCAweDAwMUMzQjlDLAorMHgwMDFDMzcwNCwgMHgwMDFDM0Q5OCwgMHgwMDFDMzUwMCwgMHgwMDFDM0QwMCwKKzB4MDAxQzM2RjgsIDB4MDAxQzEwMjgsIDB4MDAyMDJEOTgsIDB4MDAyMDEzMjgsCisweDAwMjAyQzA0LCAweDAwMjAxRTE4LCAweDAwMjAzNEJDLCAweDAwMjAzMUJBLAorMHgwMDIwMkQ5MCwgMHgwMDIwMzFDQywgMHgwMDIwMzFEMCwgMHgwMDIwMTI3NiwKKzB4MDAyMDMxRDIsIDB4MDAyMDFGRDAsIDB4MkZCNjJGOTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweERFOTQ3RjhDLCAweDYxRTBFMDI0LCAweDBGMTRENDkzLAorMHg3MTAxNjFFMywgMHhENzkyNjIxMCwgMHg0NzBCRTAyOCwgMHhENTkxMEYyNCwKKzB4MDAwOTQ1MEIsIDB4NkQwMzIwMDgsIDB4MUYwQjhGMTEsIDB4RDQ4RkRDOEUsCisweEREOEY2N0MwLCAweDY1N0M0RDBCLCAweEREOEZEMThFLCAweDZCOUM2OTEwLAorMHg0MjA4NjJCMywgMHgzMkI4NDIwOCwgMHgzRDJDNDIwOCwgMHhFMDI4MUZEQiwKKzB4RTU4MDA0RkMsIDB4NjA0QzY2RTIsIDB4MzA1MDY1NUMsIDB4MkQ2MjhGMTMsCisweDAxRkNFMDI0LCAweDY0MUNFNTAwLCAweDYyNURERTg0LCAweDhCMDEzMjQzLAorMHgwMDA5QTMzRCwgMHg2NzUzNjU1RCwgMHg2MDcwMzdFQywgMHgzOURDNjk1MywKKzB4QUZGMjc1MDEsIDB4MjAwODgwOTQsIDB4RTAyNDhCMTMsIDB4RTUwMDAxRkMsCisweEEwMDlERTdBLCAweDY1NUQ2NDFDLCAweDMyRUM2MjUzLCAweDZDNTM2QjIyLAorMHgzQ0RDNjdCMiwgMHg3NTA0MUM3MSwgMHgzMjQzNjI1RCwgMHhBMzFFOEJGMywKKzB4ODgwMTJEMTAsIDB4RTAyNDhCMTYsIDB4RTQwMDAxRkMsIDB4NjcxQzJENDAsCisweDYyNERERTZFLCAweDhCMDEzMjczLCAweDAwMDlBMzExLCAweDZDRTM2NDRELAorMHg3QzA0Njk0MywgMHgzOUVDNkI0MywgMHg2NTkyM0JDQywgMHg3NDA4NkRCMiwKKzB4MjVEMkFGRUYsIDB4OEIxOTg4MDQsIDB4MDFGQ0UwMjQsIDB4MkQ3MEU3MDAsCisweDFGRDg2RDFDLCAweDYyN0RERTYxLCAweDhCMDEzMkQzLCAweDAwMDlBMkY3LAorMHg2QjczNjc3RCwgMHgzQkVDNjFFMywgMHg3MTA0NjRCMiwgMHgzQzFDNkM3MywKKzB4Njk0MjY1QzIsIDB4Mjk1OTc3MDgsIDB4MjQ5MkFGRUQsIDB4OEIxODg4MDUsCisweDAxRkNFMDI0LCAweDJENDBFNDAwLCAweERFNTQ2NzFDLCAweDMyNzM2MjRELAorMHhBMkRDOEIwMSwgMHg2NDREMDAwOSwgMHg2QkUzNkQ0MywgMHg2NUQyM0RFQywKKzB4NjE0MzdCMDQsIDB4NkMxMjMxQkMsIDB4NzQwODY5NTIsIDB4QUZFRDI5Q0IsCisweDg4MzEyNTkyLCAweERFNEE4QjIwLCAweDY1RTZEQjRBLCAweDYxRTZEQzRBLAorMHg2N0UyRDk0QSwgMHg2MkUyN0UwNCwgMHgxRkVDN0VFOCwgMHg3RTA0NjRFMiwKKzB4NkVFMjFGRUQsIDB4NUJGRDJCRTAsIDB4NjBCMjdCMDQsIDB4QzkwMTFGQkUsCisweDZCQjIyQzAwLCAweDI5QjA0QjA5LCAweERDNDEyRjI2LCAweDY2MTM0QzBCLAorMHhFMjAwN0YwNCwgMHgyRDIwQTJBQiwgMHg4QjIxODgzMCwgMHhEOTM5REUzOCwKKzB4RTA2NDY1RTYsIDB4NzIwNDYyRTMsIDB4NjcyNjY2RTIsIDB4NkUyM0RDMzYsCisweDYyMjI3RUU4LCAweDZCRTI2MUU2LCAweDI5QjAxRkVGLCAweDdFMDQwRjE2LAorMHhDOTAxNjBFMiwgMHg2RUUyMkMwMCwgMHg0RTA5REMzMCwgMHgyRjI2MkNFMCwKKzB4RDEzMEUwNjgsIDB4MDRGRTQxMEIsIDB4RTIwMDdGMDQsIDB4MkQyMEEyODcsCisweDhCMDU4ODMzLCAweDRFMEJERTJDLCAweEUxMDAwMDA5LCAweDJEMTBBMjdGLAorMHg4OTAxODgyOCwgMHgwMDA5QTEwNiwgMHhFMTQzREUyMCwgMHhFMDQwNjJFMSwKKzB4MzIxNzYyMkQsIDB4MEZFNjhGMDQsIDB4NjAyM0UyNDAsIDB4MjYyMTA2RkUsCisweDhCMDEzMjE3LCAweDAwMDlBMEVGLCAweDAyRkVFMDQwLCAweDg1MjFFNDAxLAorMHg4QjAxMzA0NiwgMHgwMDA5QTBFNywgMHhFNTAxRTA0MCwgMHgyRDUwMDdGRSwKKzB4NjQ3MUIyNjUsIDB4MDlGRUUwNDAsIDB4NjI5MUUxNDMsIDB4NjUyREUwNjgsCisweDhENkIzNTE3LCAweEU2NDAwRjU2LCAweDhCMjczNTYzLCAweEUwNDhFNjAwLAorMHhFMTFBMEY2NSwgMHg3MkMwQTAzMSwgMHgwMDExNzgwMCwgMHgwMDIwMzI1NCwKKzB4MDAyMDE0NUUsIDB4MDAyMDI1ODgsIDB4MDAyMDMxQTIsIDB4MDAyMDMyNTgsCisweDAwMjAxNEFBLCAweDAwMjAzMUExLCAweDAwMjAyREM4LCAweDAwMTE3ODA0LAorMHgwMDExNzgxMCwgMHgwMDIwMzE5RCwgMHgwMDIwMzE5RSwgMHgwMDIwMzE5RiwKKzB4MDAyMDBDMkMsIDB4MDAyMDBDODAsIDB4MDAyMDBDN0MsIDB4NDEyMTYxNTMsCisweDQxMjE0MTIxLCAweDQxMjE0MTIxLCAweDQ1MjE0NTIxLCAweDYwNTM0NTIxLAorMHg2NjAzQzkwMywgMHgwRjY1RTA0OCwgMHhFMDA3NzExOCwgMHhFMDQ0MjIwOSwKKzB4NjQxRDBGMjUsIDB4NjVGM0UwNEMsIDB4MEY0NkIyOEMsIDB4MDRGREUwNDgsCisweDBCRkRFMDQ0LCAweDYxQkQ2NzRELCAweDQxMDg0NzA4LCAweDBGMTZFMDUwLAorMHhEMjlCNjA3MywgMHg0MjBCMDlGRSwgMHg2QzA3RTAwRiwgMHg2MDczMjlDOSwKKzB4RTA0MDBGOTYsIDB4NjVGMzBFRkUsIDB4NkQwRDg1RTIsIDB4MDFGRUUwNTAsCisweDYwRDM0MjBCLCAweDYwNzMyOTBCLCAweEUwNEMwRjk2LCAweDA0RkVCMjUxLAorMHgwNkZFRTA0MCwgMHg2MjYxRTA2OCwgMHgwRjU2NjUyRCwgMHgzNTYzRTY0MCwKKzB4RTAwMDg5NEUsIDB4NjAyMzgxRjgsIDB4NDAwOEM5MDMsIDB4NkIwMzQwMDAsCisweEUwNTQ2MTAzLCAweEUwNTgwRkI2LCAweEVDRkZERDg1LCAweDZDQ0MwRkY2LAorMHgwRkQ2RTA2QywgMHg0RDBCNjBDMywgMHg0MjIxNjI1MywgMHg0MjIxNDIyMSwKKzB4NjQyMzQyMjEsIDB4MzI0QzQyMDAsIDB4RTA1QzZFMDcsIDB4NDUyMTQyMDAsCisweEUwNDAwRkU2LCAweDBCRkU0NTIxLCAweEM5MDM2MDUzLCAweDMwRkM0MDA4LAorMHg2RDAzN0IwNiwgMHg4NUY4MUYwNSwgMHg2QzJEMUZCNywgMHgxRkM2NkUwMywKKzB4MEZDNkUwNjAsIDB4MDVGRUUwNTgsIDB4NjRDM0IyMkMsIDB4MzNGQ0UzNTQsCisweDU2MzI2MkQyLCAweDIyNjk2MTMyLCAweDY3QjQyRDIyLCAweDQ5MEI1OTM2LAorMHgyMjBCNjA3QywgMHgwNUZFRTA1OCwgMHg2NEMzMkQyMiwgMHg3RTAxQjIwMSwKKzB4RTcwNjYyRUQsIDB4OEZFMzMyNzMsIDB4RTA0MDdDMDEsIDB4NjI2MTA2RkUsCisweDA2RkVFMDQwLCAweDg1NjE0MjAwLCAweDMwMkM3NjBDLCAweDYxMDM3MDFCLAorMHg2NEYzRTUwMCwgMHg3NTAxRTcwNCwgMHg2QjVENjk2NiwgMHgyNDkyM0I3MywKKzB4NzQwNDhGRjksIDB4QjFFNDY1RjMsIDB4RTA0MDY0MUQsIDB4QjFBMzA2RkUsCisweEExN0M2NDYxLCAweEQ0NTcwMDA5LCAweEUyMDFENzU3LCAweDJEMjA0NzBCLAorMHgwMDA5QTE3NSwgMHg4QjA3ODgyOSwgMHhFQzAwREU1NCwgMHg2MUUyMkRDMCwKKzB4NjQxREIxNzUsIDB4MDAwOUExNkIsIDB4NjIyQ0UyODEsIDB4OEIwMTMwMjAsCisweDAwMDlBMEI2LCAweDA2RkNFMDI4LCAweEU2ODI2MjZDLCAweDMyNjA2NjZDLAorMHg1NkZCOEIyMCwgMHgyNjEwRTEyNCwgMHg1MjE3RDE0OSwgMHg1MjE4MTYyMSwKKzB4NTIxOTE2MjIsIDB4NTIxQTE2MjMsIDB4NTUxQjE2MjQsIDB4MTY1NUUyMDAsCisweDE2NTY1NTFDLCAweDE2NTc1NTFELCAweDE2NTg1NTFFLCAweDE2NTk1NTFGLAorMHgxMTI4MTEyNywgMHgxMTJBMTEyOSwgMHgxMTJDMTEyQiwgMHgxMTJFMTEyRCwKKzB4MTEyRkExM0QsIDB4NjY2Q0U2ODMsIDB4OEIwQjMyNjAsIDB4RDYzNzUyRkIsCisweDIyNTBFNTAwLCAweEQyMzc2NTYyLCAweDIyNTI3NjA0LCAweEQ2MzY2MjYyLAorMHgyNjIwQTEyRCwgMHg2NjZDRTY5MCwgMHg4QjAzMzI2MCwgMHgwMDA5QjFDNywKKzB4MDAwOUEwMTEsIDB4NjY2Q0U2OTEsIDB4OEIxMDMyNjAsIDB4NjI1MkQ1MkIsCisweDIyMjg2MjJDLCAweEQyMkQ4OTA0LCAweDAwMDk0MjBCLCAweDAwMDlBMDAzLAorMHg0MjBCRDIyQiwgMHg1NkZCMDAwOSwgMHhBMTEwRTIwMCwgMHhFNkIwMjYyMCwKKzB4MzI2MDY2NkMsIDB4RTAyNDhCMzQsIDB4RTA3MDAyRkMsIDB4MEYxNjYxMkMsCisweEVCMDRFQzAwLCAweDAxRkVFMDcwLCAweDMyMTM2MkNELCAweEEwRkU4QjAxLAorMHhEMjFBMDAwOSwgMHg2REMzNkNDRCwgMHg3MjA0M0QyQywgMHgzMTJDNjFDMywKKzB4NkQxMjZFRDIsIDB4RDExNEQ0MUIsIDB4MDAwOTQxMEIsIDB4NDEwQkQxMUEsCisweEQ0MUE2NEUzLCAweDQyMEJEMjEwLCAweEQyMTcwMDA5LCAweDY0RDM0MjBCLAorMHhENjBERDQxNywgMHgwMDA5NDYwQiwgMHg2MUUzRTYwMCwgMHgzMTZDNjY2RCwKKzB4NjI2RDc2MDEsIDB4MjFEMDMyQjMsIDB4NEQxOThGRjcsIDB4N0MwOEFGRDIsCisweEQyMTFENDEwLCAweEQ0MTE2NTQyLCAweDAwMDk0MjBCLCAweDAwMDlBMENGLAorMHgwMDIwMkM4MCwgMHgwMDIwMzI3OCwgMHgwMDIwMTQ1RSwgMHgwMDExNzgwNCwKKzB4MDAyMDJEMkMsIDB4MDAyMDMxODgsIDB4MDAyMDMxOUMsIDB4MDAyMDBDQkEsCisweDAwMjAwQ0UwLCAweDAwMjAzMjkwLCAweDAwMjAxNEEyLCAweDAwMjAzMkE0LAorMHgwMDIwMzJBQywgMHgwMDExNzgwMCwgMHgwMDIwMTRBQSwgMHgwMDIwMzJCMCwKKzB4RDVCNUQxQjQsIDB4NjI1MkUwNDAsIDB4NzUwNDY2MTIsIDB4MjE2MjM2MkMsCisweDU2MTE2MjU2LCAweDExNjEzNjJDLCAweDYyNTI2NjUzLCAweDc2MDg1NTEyLAorMHgxMTUyMzUyQywgMHg1NTEzNjI2MiwgMHgzNTJDNzZFQywgMHg2NTYzMTE1MywKKzB4NTYxNDYyNjIsIDB4MzYyQzc1MTAsIDB4NjY1MzExNjQsIDB4NTUxNTYyNTIsCisweDM1MkM3NjEwLCAweDYyNjIxMTU1LCAweDM2MkM1NjE2LCAweEQ2QTMxMTY2LAorMHg1NTE3NjI2MiwgMHgzNTJDNzYwNCwgMHg2MjY2MTE1NywgMHgzNTJDNTUxOCwKKzB4NjU2MzExNTgsIDB4NTYxOTYyNjIsIDB4MzYyQzc1MDQsIDB4NjI1NjExNjksCisweDM2MkM1NjFBLCAweDYyNTYxMTZBLCAweDM2MkM1NjFCLCAweDY2NTMxMTZCLAorMHg1NTFDNjI1MiwgMHgzNTJDNzYwNCwgMHg2MjY2MTE1QywgMHgzNTJDNTUxRCwKKzB4NjI2MzExNUQsIDB4NTUxRTY2NjIsIDB4MzU2QzcyMDQsIDB4NjYyMjExNUUsCisweEQ1OEY1MjFGLCAweDExMkYzMjZDLCAweDA2MUU2MjUyLCAweDM2MkM3NTk0LAorMHhFMDQ0MDE2NiwgMHg2MjUyNjY1MywgMHg3NjQ0MDUxRSwgMHgwMTU2MzUyQywKKzB4NjI2MkUwNDgsIDB4MzYyQzA2MUUsIDB4RDY4NjAxNjYsIDB4NjI2MkUwNTQsCisweDQyMjkwNTFFLCAweDAxNTYzNTJDLCAweDYyNjI3NjA0LCAweDA2MUVFMDU4LAorMHgzNjJDNDIyOSwgMHg1NkZCMDE2NiwgMHgyNjIwRTIzOCwgMHgwMjFFRTA0NCwKKzB4MTYyMUUwNDgsIDB4MTYyMjYyMTIsIDB4MTYyMzUyMTEsIDB4RTIwMDU1MTIsCisweDU1MTUxNjU0LCAweDU1MTMxNjU1LCAweDU1MTYxNjU2LCAweDA1MUUxNjU3LAorMHgxNjU4RTA0MCwgMHhFMDUwMDUxRSwgMHg1NTE0MTY1OSwgMHgwNTFFMTY1QSwKKzB4MTY1QkUwNEMsIDB4RTA1NDA1MUUsIDB4MDUxRTE2NUMsIDB4MTY1REUwNTgsCisweEUwNDQwNTFFLCAweDAxMjYxNjVFLCAweDIxMjJFMDQ4LCAweDExMjIxMTIxLAorMHgxMTIzMTEyNSwgMHgwMTI2MTEyNiwgMHgwMTI2RTA0MCwgMHgxMTI0RTA1MCwKKzB4RTA0QzAxMjYsIDB4RTA1NDAxMjYsIDB4RTA1ODAxMjYsIDB4N0Y3NDAxMjYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDAwMEI2QkY2LCAweDRGMjI2OUY2LAorMHhFMjQwNjE0RCwgMHg4OTE0MzEyMywgMHgzMTI3RTIxRiwgMHg4QjA5RDc1QSwKKzB4RDQ1QTYxNEQsIDB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsCisweDE3NjFBMDA3LCAweEUwMDFENDU1LCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LAorMHg0RjI2Mjc2MiwgMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwKKzB4RTIxRjg5MTIsIDB4RDc0QzMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyNEIsCisweDQyMEI3MUUwLCAweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjQ3LAorMHhFMDAxNDIwQiwgMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwKKzB4NDYyODQ2MTgsIDB4NjI1MkQ1NDIsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsCisweDQ2MThFNjgwLCAweEQ1M0U0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLAorMHhBMDAxMDAwOSwgMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwKKzB4NDYxOEU2ODAsIDB4RDUzNzQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjhCRkMsCisweDJGRTYwMDA5LCAweDdGRkM0RjIyLCAweEJGRjE2RTUzLCAweDYxRTIyRjQyLAorMHhFMjgwRDYzMSwgMHg1NEUxMTYxNSwgMHgxNjQ2NDIxOCwgMHg0MjI4NTVFMiwKKzB4NTdFMzE2NTcsIDB4MTY3ODZFRjIsIDB4MjZFMjJFMkIsIDB4NEYyNjdGMDQsCisweDZFRjZBRkNFLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZDNTNERDI2LAorMHg2RTQzQkZENiwgMHgyREUyQkZCQiwgMHgwMDA5QkZEMiwgMHgyQzEyNTFENSwKKzB4MUM0MTU0RDYsIDB4MUM1MjU1RDcsIDB4MUM2MzU2RDgsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweDYxNjM2Q0Y2LCAweEEwMDRFNjAwLCAweDYyNTY0MTA5LAorMHgyNDIyNzYwMSwgMHgzNjEyNzQwNCwgMHgwMDBCOEJGOSwgMHg0RjIyMDAwOSwKKzB4RDExN0Q0MTYsIDB4MDAwOTQxMEIsIDB4RDQxN0QyMTYsIDB4RTUwNTYwMjIsCisweDIyMDJDQjIwLCAweEQ1MTUyNDUyLCAweDQ1MEJFNzAwLCAweEQ3MTQyNDcyLAorMHgwMDA5NDcwQiwgMHhFNjAxRDExMywgMHgyMTYyRDIxMywgMHg0RjI2NDYxOCwKKzB4MjI2MjAwMEIsIDB4MDAyMDJEMkMsIDB4MDAxQzM2QTAsIDB4MDAxQzNDQTAsCisweDAwMUMzNkY0LCAweDAwMUMzQjg4LCAweDAwMUMzNzA0LCAweDAwMjAyQzgwLAorMHgwMDFDMzczQywgMHgwMDFDMzcwMCwgMHgwMDFDMzcwQywgMHgwMDIwMzJDNCwKKzB4MDAyMDE0NUUsIDB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4MDAyMDE0RDQsCisweDAwMjAwRkEwLCAweDAwMUUyMTJDLCAweDAwMUMzRDMwLCAweDAwMDlBMUE5LAorMHgyRkU2MkZENiwgMHhERDhGNEYyMiwgMHhBMDA0OUVBNywgMHhENDhFMDAwOSwKKzB4NDIwQkQyOEUsIDB4NjJEMjY1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsCisweEQyOEFENDhCLCAweDU1RDE0MjBCLCAweDIyRTg1MkQxLCAweEEwMDQ4QkY4LAorMHhENDg4MDAwOSwgMHg0MjBCRDI4NSwgMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwKKzB4MDAwOUEwMDQsIDB4RDI4MUQ0ODQsIDB4NTVEMzQyMEIsIDB4MjJFODUyRDMsCisweEEwMDQ4QkY4LCAweEQ0ODEwMDA5LCAweDQyMEJEMjdDLCAweDUyRDQ1NUQ0LAorMHg4QkY4MjJFOCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkU2MzZENzMsIDB4NkM1M0IwMTgsIDB4NjRDMzU3RjQsCisweEIwNTQ2NUUzLCAweEIwNkE2NkQzLCAweEIwOUEwMDA5LCAweEIwOUUwMDA5LAorMHhCMEEyMDAwOSwgMHhCMEJFMDAwOSwgMHhCMEMxMDAwOSwgMHhCMTI0MDAwOSwKKzB4NEYyNjAwMDksIDB4NkRGNjZFRjYsIDB4NkNGNkEwMjMsIDB4MzQxMkQxNkMsCisweEQ2NkMwNTI5LCAweDI2NTBENzZDLCAweDI3NDIwMDBCLCAweDAwMDlBMDE0LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkQ3MywgMHg2QzUzQkZFRSwKKzB4NjRDMzU3RjQsIDB4QjAyQTY1RTMsIDB4QjEwNjY2RDMsIDB4NEYyNjAwMDksCisweDZERjY2RUY2LCAweDZDRjZBMDA1LCAweEU2MDNEMjYwLCAweDAwMEI0NjE4LAorMHhEMjVFMjI2MiwgMHgwMDBCRTYwMCwgMHg0RjIyMjI2MiwgMHhFNDBBQkY3RSwKKzB4MDAwOUJGN0UsIDB4RTEwNEQyNUEsIDB4RTUwMDQxMTgsIDB4MjIxMkU0MEEsCisweDIyNTJCRjc0LCAweDYwNzJENzU3LCAweDRGMjZDQjIwLCAweDI3MDIwMDBCLAorMHhEMTU1NEYyMiwgMHhFNDAwNDEwQiwgMHg0NTJCRDU1NCwgMHgyRkU2NEYyNiwKKzB4NkU2M0QxNTMsIDB4NDQxODY2MTIsIDB4NDUyODkyMTAsIDB4MjYyOTQ0MDgsCisweDQ0MDg0NTAwLCAweDQ0MDAyNjVCLCAweDQ3MDgyNjRCLCAweDQ3MDgyMTYyLAorMHgyN0VCRDE0QywgMHgwMDBCMjE3MiwgMHgwM0YwNkVGNiwgMHgyRkU2MUZGRiwKKzB4REU0OTRGMjIsIDB4RTQwQUUxMDEsIDB4MkUxMkJGNDgsIDB4NzI2QzYyRTMsCisweEU0MDFFMTAwLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHhFNzMwMjI0MiwgMHhFNDBBRTUwMywgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweDIyNTIyMjcyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjEyMjIxMiwgMHgxMjFBQkYyMiwgMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwKKzB4RDIzMjZFRjYsIDB4RTQ0MUUxMDEsIDB4MDAwQjIyMTIsIDB4RDEzMDIyNDIsCisweEU2MDVENDMwLCAweDAwMEIyMTYyLCAweEQ1MkYyNDYyLCAweDYwNTBEMjJGLAorMHg4QjBFODgwMSwgMHg2MDQwRDQyRSwgMHg4QjA3ODgwMSwgMHg5NjI2RDUyRCwKKzB4ODgwMTYwNTAsIDB4OTYyMzhCMEMsIDB4MDAwOUEwMEEsIDB4QTAwNzk2MjEsCisweEU2MDAwMDA5LCAweDIyNjJENDI2LCAweDg4MDE2MDQwLCAweEU2MDQ4QjAwLAorMHhBRUYzRTQwQSwgMHhEMjI0MjI2MiwgMHhFNDBBRTYwMSwgMHgyMjYyQUVFRSwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4REMyMDRGMjIsIDB4NjBDMkVEMDAsCisweENCMDFFQjY0LCAweDYwQzIyQzAyLCAweEEwNDFDOTAxLCAweDAzQzQ2RTAzLAorMHgwMzQwMDNENCwgMHgwMDFDM0I4OCwgMHgwMDIwMzJDOCwgMHgwMDIwMTRBQSwKKzB4MDAyMDMyRDAsIDB4MDAyMDMyRDgsIDB4MDAyMDMyRTAsIDB4MDAyMDMyRTgsCisweDAwMjVFNzIwLCAweDAwMjAzNEI4LCAweDAwMjAzMThDLCAweDAwMUM1OTY4LAorMHgwMDFENDAwNCwgMHgwMDFDMzUwMCwgMHgwMDIwMTI0QSwgMHgwMDIwMTI3NiwKKzB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU4MzAsIDB4MDAxQzYyNjgsCisweDAwMUM1OUE0LCAweDAwMUM2MzlDLCAweDAwMjAzMTlFLCAweDAwMUM1ODA0LAorMHgwMDIwMzE5RCwgMHgwMDIwMzE5RiwgMHgwMDFDNTgxQywgMHgwMDFDNTg2MCwKKzB4ODkwNzNEQjIsIDB4RTQwQTYwQzIsIDB4QkU5RkM5MDEsIDB4N0QwMTZFMDMsCisweDhCRjUyRUU4LCAweDhCMDMzREIyLCAweEQyM0VENDNELCAweDAwMDk0MjBCLAorMHg0RjI2RTQwQSwgMHg2REY2NkVGNiwgMHhBRThGNkNGNiwgMHg0NDExNkJGNiwKKzB4NjA0QjhGMDEsIDB4MDAwQjYwNDMsIDB4MkZCNjAwMDksIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweERDMzQ3RkZDLCAweDYwQzJFRDAwLCAweENCMDJFQjY0LAorMHg2MEMyMkMwMiwgMHhDOTAyMkYwMiwgMHg2RTAzQTAwOSwgMHg4OTA4M0RCMywKKzB4RTQwQTYwQzIsIDB4QzkwMjJGMDIsIDB4NkUwM0JFNzAsIDB4MkVFODdEMDEsCisweDNEQjM4QkY0LCAweEQ0Mjk4QjA4LCAweDdGMDREMjI2LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwKKzB4MDAwQjZDRjYsIDB4RDUyMjZCRjYsIDB4NjA1MjU2NTEsIDB4MDAwQjQ2MjgsCisweDJGQjYzMDZDLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDRGMDI0RjEyLAorMHg2RTQzQkZGMSwgMHhEQzFCNkIwMywgMHhCRkVDREQxQiwgMHgzMEI4MDAwOSwKKzB4MDYwQTNDMDUsIDB4NDYwOTQ2MDksIDB4M0Q2NTQ2MDEsIDB4NDIwOTAyMEEsCisweDQyMDk0MjA5LCAweDhCRjAzMkUyLCAweDRGMTY0RjA2LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHg0RjIyMkZFNiwgMHhFMTAyREUwRiwKKzB4RTQwM0U1MDAsIDB4QkZENDJFMTIsIDB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsCisweDJFNjJFNDAzLCAweDRGMjYyRTcyLCAweDZFRjZBRkNCLCAweDAwMDkwMDBCLAorMHgwMDIwMzJGMCwgMHgwMDIwMTQ1RSwgMHgwMDFDNTg2MCwgMHgwMDIwMzMwOCwKKzB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsIDB4MTA2MjRERDMsIDB4MDAxRDQwMDQsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhFNTAwN0ZEOCwgMHg2NDUzRTExMCwgMHg2QzUzNDEyOCwgMHg2NTVERUUwQSwKKzB4NDYwODY2NTMsIDB4NDYwODM2NUMsIDB4MzYxQzc1MDEsIDB4Njc1RDYwNDMsCisweDYwQzMwRjY2LCAweDM3RTNFRDAwLCAweDgxNjEyNkMxLCAweDgxNjM4MTYyLAorMHgxNkQzMTZEMiwgMHg4RkVBMTZENCwgMHg2OEYyNzQwNCwgMHhEQUIzRDlCMiwKKzB4Mjk4MjE5ODEsIDB4RDFCMjU5RjEsIDB4MkE5MjFBOTEsIDB4NUJGMzVBRjIsCisweDVFRjU1REY0LCAweDExQTE1NEY2LCAweDExQjMyMUEyLCAweDExRDUxMUIyLAorMHgxMUU3MTFENCwgMHgxMTQ5MTFFNiwgMHg1NUY3MTE0OCwgMHhFRTAwREJBOSwKKzB4RERBOTU3RjgsIDB4RDZBOTUyRjksIDB4MUI1MTY0RTMsIDB4REJBODJCNTIsCisweEVBQjhEOEE4LCAweDJENzJFOTQ1LCAweDZBQUMyNjIyLCAweDZFRUQ0OTA4LAorMHg0RDA4NkRFMywgMHgzREVDNjFFMywgMHg0RDA4NDEwOCwgMHgzREJDMzFFQywKKzB4NDEwODYwQzMsIDB4ODFEMTJEQzEsIDB4NDEwOEUwNTAsIDB4NDEwODQwMDgsCisweDYwQzM4MUQyLCAweEU1MDAzMThDLCAweDgxRDMzNEEyLCAweDFEMTMxREQyLAorMHg4RDAxRDQ5NCwgMHhENDkxMUQ1NCwgMHhCMDgxNjVEMywgMHg2NEVEN0UwMSwKKzB4OEJEQzM0OTIsIDB4REI5NEQxOEQsIDB4RDI4QjY4MTIsIDB4MUI4MTQ4MjksCisweDJGRDI2NDEyLCAweDJCOTI2OTRELCAweEQ5OEE2NzIyLCAweDFCNzM0NzI5LAorMHhENzg3NjgyMiwgMHgxQkEyNkE4RCwgMHhEMjhDNkI3MiwgMHgyMkIyRDU4NiwKKzB4RTAwMzVENzIsIDB4NUU3NDEyRDIsIDB4MTJFNDQwMTgsIDB4RDY4ODUxNzYsCisweDU0NzgxMjE2LCAweDEyNDhFMUZGLCAweEQ0ODU2NzkyLCAweDY4NTIxMjdBLAorMHgyOEMxRTcwMywgMHg4MTkxNjk1MiwgMHg2QTUyRTA1MCwgMHg4MUEyNDAwOCwKKzB4NjBDMzZCNTIsIDB4NkQ1MjgxQjMsIDB4NkU1MjFERDIsIDB4NjI1MjFFNjMsCisweDEyNjRFNjAwLCAweDQ2MDg2NTYzLCAweDc1MDEzNjRDLCAweDY2NUQyNjEyLAorMHg4QkY4MzY3MywgMHhFMDAzRDQ3MSwgMHg0MDE4NjU0MiwgMHg2NzQyMjVDMSwKKzB4ODE3MUQyNzQsIDB4RUUwMDY4NDIsIDB4Njk0MjE4ODIsIDB4MTkyM0UwMjQsCisweEU1ODA2QTQyLCAweDZCNDIxQUU0LCAweDgxQjI2NkUzLCAweEQ0NkQ2QzQyLAorMHg2NTVDODFDMywgMHg2RDYzNjY2RCwgMHg2MTZENzYwNCwgMHgzMTUzM0Q0QywKKzB4MkRFMjhGRjgsIDB4RDU2OUQyNjgsIDB4NzQwNDI0MjIsIDB4N0YyODI0NTIsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHg2NjQyNjhGNiwgMHhDODAzNjA2MSwgMHhFNTAwOEQwNCwgMHhDOTAzNjA2MSwKKzB4OEIwMzg4MDIsIDB4NjU2MzUyNjIsIDB4MjQxMjUxMjQsIDB4NjA1MzAwMEIsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDYyNTM2RTUzLCAweDZENDNFNTUwLAorMHg0NTA4RTQwMCwgMHhFMTAxQTAwMSwgMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwKKzB4NjA1MzgxMjMsIDB4NTZFMjgxMjIsIDB4OEJGNTM2MjAsIDB4MTZFNEQyNTAsCisweEU2MTQ2NEYzLCAweDY1RTM0MjBCLCAweEU0RkM2NUUxLCAweDJFNTEyNTQ5LAorMHg2NUYzNjFGMSwgMHgyRjExMjE0OSwgMHhEMTQ5NTREMSwgMHhFNjE0NDEwQiwKKzB4NjA3MTU3RDEsIDB4MjcwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDY2NTM2RTUzLAorMHg2RDQzRTVGQywgMHgyMDU5NjA2MSwgMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwKKzB4MTJFNDhCMDYsIDB4MzFFMDUxRTIsIDB4NTJEMThCMDQsIDB4MUUyMkEwMDIsCisweDU2NjRBRkYwLCAweDY0RjNEMjM2LCAweDQyMEJFNjE0LCAweDY3RTE2NUUzLAorMHgyNzE5RTFGQywgMHg2N0YxMkU3MSwgMHgyNzE5NTREMSwgMHg2NUYzRDEzMCwKKzB4NDEwQkU2MTQsIDB4NTJEMTJGNzEsIDB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsCisweDRGMjY3RjE0LCAweDAwMEI2RUY2LCAweDJGRTY2REY2LCAweDYyNEM0RjIyLAorMHg0MjA4REUxQiwgMHhBMDA1NDIwMCwgMHg1MjUyM0UyQywgMHg1NjI0RDQxNywKKzB4MkU2MkJGOEUsIDB4NTJFMTY1RTIsIDB4OEJGNjM1MjAsIDB4MjYyMkQ2MUIsCisweDAwMEI0RjI2LCAweDJGQjY2RUY2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEQjFDREMxMCwgMHg2NkMyNTJDMSwgMHg4OTQwMzYyMCwgMHhDOTAzNjA2MSwKKzB4ODkzQzg4MDEsIDB4REQxOERFMEIsIDB4NjRFM0JGNjMsIDB4ODUwMzY1MDMsCisweDYyMEQ2NkIyLCAweDg5MkIzMjYyLCAweEJGOUJENDAzLCAweEQ0MTMwMDA5LAorMHgwMDA5NEQwQiwgMHgwMDA5QUZFNiwgMHgwMDIwMkQ4OCwgMHgwMDIwMkQ5MCwKKzB4MDAyMDJEOTgsIDB4MDAyMDJEQzAsIDB4MDAyMDMxQTQsIDB4MDAyMDMxQUMsCisweDAwMTAwMEM4LCAweDAwMTAxNjgwLCAweDAwMUUyMTA4LCAweDAwMUMzRDAwLAorMHgwMDExNzg4MCwgMHgwMDExNzc4MCwgMHgwMDA0MDAyMCwgMHgwMDI2QzQwMSwKKzB4MDAyMDBCMjYsIDB4MDAyMDMxODgsIDB4MDAyMDE0NUUsIDB4MDAyMDMzMjQsCisweDY0RTNCRjNFLCAweDREMEJENDA2LCAweEFGQkIwMDA5LCAweEQyMDUwMDA5LAorMHg0RjI2MjI2MiwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgwMDAwNkJGNiwKKzB4MDAyMDMzMjgsIDB4MDAxQzNEMjgsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGRkM0RjIyLCAweDYwMjJEMjJCLCAweDhENDFDODAzLCAweERFMkEyRjAxLAorMHhEQjJCREMyQSwgMHhFRDAxQTAxNywgMHhDOTAzNjA1MSwgMHg4OTE2ODgwMSwKKzB4RDEyOEQ0MjYsIDB4MDAwOTQxMEIsIDB4NjEwMzU1MDMsIDB4QzgyMDg1NTEsCisweEUwNTA4OTAzLCAweDcyMDEwMkJFLCAweEQyMjMwQjI2LCAweDQyMEI2NEUzLAorMHhENjIyNjUxMywgMHg1MkMxMjZEMiwgMHgzNTIwNjVDMiwgMHhERTIwOEJFNCwKKzB4REIyMUREMjAsIDB4NTJEMURDMjEsIDB4MzUyMDY1RDIsIDB4NjA1MTg5MTgsCisweDg4MDFDOTAzLCAweEQ0MUI4OTE0LCAweDQ2MEJENjE2LCAweDU3MDMwMDA5LAorMHg4RjA0MzdFMCwgMHhFMjAxNjUwMywgMHhBRkVDMkIyMCwgMHhENDE4MkM1MiwKKzB4NDIwQkQyMTgsIDB4RDYxMTAwMDksIDB4NDExOEUxMDEsIDB4MjYxMkFGRTMsCisweEM4MDQ2MEYxLCAweEQyMTQ4OTA3LCAweDRGMjY3RjA0LCAweDZERjY2RUY2LAorMHg0MjJCNkNGNiwgMHg3RjA0NkJGNiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjAwMEIsIDB4MDAxRTIxMDAsIDB4MDAyMDJEOTgsIDB4MDAyMDJEOTAsCisweDAwMjAyRDJDLCAweDAwMjAxMTYyLCAweDAwMjAxMUU0LCAweDAwMUMzRDMwLAorMHgwMDExNzg4MCwgMHgwMDIwMkQ4OCwgMHgwMDIwMzFBOCwgMHgwMDIwMzFBNCwKKzB4MDAyMDJEQzAsIDB4MDAyMDExODAsIDB4MDAyMDAzMDgsIDB4RTYwMUQyMDMsCisweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LCAweDAwMUMxMDEwLAorMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsIDB4NjQ0Q0JGRjIsCisweDhCRjkzRUMyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweEU1MDA2Q0Y2LAorMHg2NjQzQTAwMiwgMHg3NjAxNzUwMSwgMHgyMjI4NjI2MCwgMHhBRkUzOEJGQSwKKzB4MkZFNjAwMDksIDB4NzUwNzYyNTMsIDB4RTEwODY3NTMsIDB4NjA0M0VFMEEsCisweDQ0MDlDOTBGLCAweDY1MDMzMEUyLCAweDhEMDE0NDA5LCAweEU2MzBFNjM3LAorMHg0MTEwMzY1QywgMHg4RkYyMjc2MCwgMHhFMDAwNzdGRiwgMHgwMDBCODAyOCwKKzB4MDAwQjZFRjYsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDAsIDB4N0ZFQzRGMjIsCisweDZFNDM2MjUzLCAweEJGREM2NUYzLCAweEJGRDA2NDIzLCAweEJGQ0U2NEUzLAorMHhENDAzNjRGMywgMHgwMDA5QkZDQiwgMHg0RjI2N0YxNCwgMHg2RUY2MDAwQiwKKzB4MDAyMDMzMkMsIDB4RTRGREQyOUEsIDB4RDc5QTYxMjIsIDB4MjIxMjIxNDksCisweDc0MDE2MDIyLCAweDIyMDJDQjAxLCAweEQ1OTc2NjIyLCAweDIyNjIyNjQ5LAorMHhDODQwNjA3MCwgMHg2MDUyODkwMiwgMHgyNTAyQ0IwNCwgMHhFMUY3NjQ1MiwKKzB4MjU0MjI0MTksIDB4RTcwMTYwNTIsIDB4MjUwMkM5Q0YsIDB4RTYwMjYwNTIsCisweDI1MDJDQjAzLCAweDE1NjI0NzE4LCAweDE1NzMwMDBCLCAweEQ3OENENThCLAorMHhENDhERDI4QywgMHhFNjAwRTEwMCwgMHgyNzExMjUxMSwgMHhBRkQxMjIxMCwKKzB4NjY0QzI0NjEsIDB4NDYwMEQyODksIDB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsCisweDY1NEMyNjAwLCAweDQ1MDBEMjg1LCAweDY2NTAzNTJDLCAweDI2MTlFMUVGLAorMHgyNTYwMDAwQiwgMHhEMjgyNjY0QywgMHgzNjJDNDYwMCwgMHhDQjEwNjA2MCwKKzB4MjYwMDAwMEIsIDB4RDI3RTY1NEMsIDB4MzUyQzQ1MDAsIDB4RTFFRjY2NTAsCisweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjc4LCAweDYwNjAzNjJDLAorMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3NCwgMHg2NjUwMzUyQywKKzB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsIDB4RDI3MTY2NEMsIDB4MzYyQzQ2MDAsCisweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkQ2NTRDLCAweDM1MkM0NTAwLAorMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2MjRDMjU2MCwgMHg0MjAwRDY2NywKKzB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsCisweEQ2NjM2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHhEMTVGNjAwQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwKKzB4RDE1RDYwMkMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsCisweDZFNDM0RjIyLCAweEU2MEE2NDVDLCAweDg5MTQzNDY3LCAweDAwMDlCRkVCLAorMHg2MEVDNjQwQywgMHg4QjAyODgwMSwgMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwKKzB4NjI0QzQ0MDksIDB4MzI2M0U2MEEsIDB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsCisweEM4ODA2MDIzLCAweEUyMDA4QjAwLCAweDRGMjY2MDIzLCAweDZFRjYwMDBCLAorMHhENjRBNEYyMiwgMHg4ODAxNjA2MiwgMHhCMjQ1OEIwMywgMHhBMDAzMDAwOSwKKzB4RDI0NzAwMDksIDB4MjI2MEU2NDAsIDB4RTIwMEQ2NDYsIDB4MDAwQjRGMjYsCisweDRGMjIyNjIyLCAweDYwNjJENjQxLCAweDhCMDE4ODAyLCAweDAwMDlCMjhFLAorMHhFMjAwRDY0MCwgMHgwMDBCNEYyNiwgMHhENTNDMjYyMiwgMHhFMTAwRDQzQywKKzB4MjUxMkU3MDEsIDB4MjQ3MDAwMEIsIDB4RTYwNEQyMzksIDB4MjI2MDAwMEIsCisweEQ0Mzk0RjIyLCAweDQxMEJEMTM5LCAweEQ1MzkwMDA5LCAweDY2NTBFMUZELAorMHgyNjE5RDIzOCwgMHgyNTYwRTcwMCwgMHgwMDBCNEYyNiwgMHg0RjIyMjI3MCwKKzB4RDEzMkQ0MzUsIDB4MDAwOTQxMEIsIDB4RTdGQkQ1MzEsIDB4MjY3OTY2NTAsCisweDAwMEI0RjI2LCAweDRGMjIyNTYwLCAweEQxMkNENDMwLCAweDAwMDk0MTBCLAorMHhFN0Y3RDUyQiwgMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwgMHhENTI4MjU2MCwKKzB4NjI1MDk0MkQsIDB4MDAwQjIyNDksIDB4RDUyNTI1MjAsIDB4NjI1MEU0QkYsCisweDAwMEIyMjQ5LCAweDRGMjIyNTIwLCAweDg1MjJEMjI1LCAweDIwMDg2MDBELAorMHg4ODAxODkxMSwgMHg4ODAzODkxMywgMHg4ODA1ODkxNSwgMHg4ODA2ODk0MiwKKzB4ODgwODg5NDgsIDB4ODgwOTg5NEUsIDB4ODgwQTg5NTQsIDB4ODgwQjg5NUEsCisweEEwNjc4OTYwLCAweEIwNjkwMDA5LCAweEEwNjQwMDA5LCAweEIwNzc2MDBDLAorMHhBMDYwMDAwOSwgMHhCMDgwNjAwQywgMHhBMDVDMDAwOSwgMHhGRjdGNjAwQywKKzB4MDAxRTIxNDgsIDB4MDAxRTEwMDAsIDB4MDAxRTExMDgsIDB4MDAyMDMxRkMsCisweDAwMjAzMUZFLCAweDAwMjAzMjFELCAweDAwMjAzMUUwLCAweDAwMUUxMDNGLAorMHgwMDFFMTA1RiwgMHgwMDFFMTAyRiwgMHgwMDFFMTA5MCwgMHgwMDIwMzIwNCwKKzB4MDAxRTEwMEIsIDB4MDAyMDMyMDAsIDB4MDAyMDMzMzAsIDB4MDAyMDE0NUUsCisweDAwMUUxMDI4LCAweDAwMjAzMjFDLCAweDAwMjAzMzNDLCAweDAwMjAzMzRDLAorMHgwMDIwMzFENCwgMHg2MjYwRDY4NCwgMHg4QjJCMjIyOCwgMHgwMDA5QjA2MSwKKzB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsIDB4OEIyMzIyMjgsIDB4MDAwOUIwNjksCisweDYwMENBMDIxLCAweDYyNjBENjdDLCAweDhCMUIyMjI4LCAweDAwMDlCMEM3LAorMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwgMHg4QjEzMjIyOCwgMHgwMDA5QjBDRCwKKzB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsIDB4OEIwQjIyMjgsIDB4MDAwOUIxMjUsCisweDYwMENBMDA5LCAweDYyNjBENjcwLCAweDhCMDMyMjI4LCAweDAwMDlCMTNELAorMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwgMHhEMjZDRDE2QiwKKzB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsIDB4RDc2QjAxMkQsIDB4RTQwM0Q2NkIsCisweEUyMEY2MTFDLCAweDI1NDBFMDAxLCAweDI1MjAyNzEyLCAweDI2MDIwMDBCLAorMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNSwgMHhENjYzRDI2MCwKKzB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsIDB4RDI1QzAwMDksIDB4NjAwRDg1MjMsCisweDg5MDUyMDA4LCAweDhCMEE4ODAxLCAweDYwNjBENjVELCAweDI2MDBDQjAxLAorMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwgMHgwMDBCMjYxMiwgMHgwMDBCODE0MiwKKzB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsIDB4NjQwRDQ1MTgsIDB4NjYwMzM0NTMsCisweEUwMDA4RDA1LCAweEQ1NTFEMjUzLCAweDIyNjBFMDAxLCAweDAwMEIyNTAyLAorMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwgMHg2NDUzNjUwRCwgMHg2MjQ5NDQxOSwKKzB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsIDB4ODgwMjg5MDksIDB4ODgwMzg5MTAsCisweDg4MDY4OTFBLCAweDg4MDc4OTM1LCAweEEwNEM4OTNCLCAweEQ1NDYwMDA5LAorMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwgMHg2MjJDNjI2MSwgMHgyNDIxQTAzOCwKKzB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsIDB4NjY0MkQ1NDAsIDB4MjU2MkQ0NDAsCisweDI0MDE4NTYxLCAweDYyMDNBMDJDLCAweDIwMDg2MDVDLCAweDg4MTA4OTA3LAorMHg4ODIwODkwOCwgMHg4ODMwODkwOSwgMHhBMDJDODkwQSwgMHhEMjNBMDAwOSwKKzB4NjIyMkEwMDgsIDB4QTAwNUQyMzksIDB4RDIzOTYyMjIsIDB4NjIyMkEwMDIsCisweDYyNjJENjM4LCAweEQ0MzJENTMxLCAweDY2MjEyNTIyLCAweEEwMEY2MjZDLAorMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwgMHg2MjJDRDQyRCwgMHhBMDA3MjU2MiwKKzB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksIDB4MjU2MkQ0MjksIDB4NjIwMzI0MDEsCisweDY2MkQ4NTE1LCAweDM2MTc2MTBELCAweDY1MDM4RjAxLCAweEIwQ0IyNDUxLAorMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwgMHgwMDBCNEYyNiwgMHhENjE5MDAwOSwKKzB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsIDB4RDExOEQ3MTcsIDB4RTIwRjY1NUQsCisweDI3NTJFMDAxLCAweDAwMEIyNjIwLCAweDJGRTYyMTAyLCAweEQyMEY0RjIyLAorMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwgMHhENTExRDYxRCwgMHgyNjIxRTIwMCwKKzB4OTQwRjg0NTEsIDB4QTA0ODIwNDksIDB4REUwRDgwNTEsIDB4Qzg0MDYwRTAsCisweEUyMDE4RDMyLCAweDg5NDQzNDI3LCAweEQyMTZENjE1LCAweDI2NDE0MjBCLAorMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwgMHgwMDIwMzIxRCwgMHgwMDIwMzFENCwKKzB4MDAyMDMxRTAsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsIDB4MDAyMDMyMDAsCisweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMjAzMjA4LCAweDAwMjAzMUU4LAorMHgwMDIwMzFFQywgMHgwMDIwMzFGMCwgMHgwMDIwMzIwQywgMHgwMDIwMzIxMCwKKzB4MDAyMDMyMTQsIDB4MDAyMDMyMTgsIDB4MDAyMDM1MUMsIDB4MDAyMDM1MjYsCisweDAwMjAzMUZBLCAweDAwMjAyMzYyLCAweDg5MTIzNDI3LCAweEQyOTRENjkzLAorMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwgMHg4MEUxQjBGNSwgMHhENjkxNjBFMCwKKzB4MkUwMENCMDQsIDB4QzkzRjYwNjAsIDB4RDY4RjI2MDAsIDB4QTAwMUUwMDEsCisweEUwMDAyNjAyLCAweDAwMEI0RjI2LCAweEQ2OEM2RUY2LCAweEM4ODA2MDYwLAorMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwgMHhEMjg5OEIxNSwgMHg4NTI0RTUwMSwKKzB4ODkxMDMwNTYsIDB4RTIwM0QxODcsIDB4MjEyMEQ0ODcsIDB4RTAwQjY1NDEsCisweDA2NTY2NTVELCAweEU0MEZENTg1LCAweDIxNDBFNzAyLCAweEQ3N0UyNTcxLAorMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwgMHgyRkU2RTAwMCwgMHhERTgwNEYyMiwKKzB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsIDB4MjAwODg1NTQsIDB4NjEwMzhGMjgsCisweDg1NTNENzdDLCAweDY0MDM2NjcyLCAweDg1NjY2NTBDLCAweDM1MjA2MjBDLAorMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwgMHgyNjUxNjQ0QywgMHg2MEUwMjc0MSwKKzB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsIDB4QTAwMzAwMDksIDB4RDI2ODAwMDksCisweDAwMDk0MjBCLCAweDAwMDlCMDlGLCAweEUyMDFEMTY3LCAweDYwRTAyMTIyLAorMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwgMHgyNDAwQzkzRiwgMHg2MDIzQTAwMSwKKzB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweERBNjIyRkU2LCAweDY2QTFFMjQwLCAweDM2MjJEQzVFLCAweDYyNjM4OTAwLAorMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwgMHhEQjYxRDQ2MCwKKzB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsIDB4NzEwMjYxMjMsIDB4NjYyMTJCMTIsCisweDcxMDI2MjEzLCAweDYxMjEyQjEyLCAweDY1MUQ2NjZELCAweDM1NkM0NTI4LAorMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywgMHhDOTAzNjBEMywgMHg4QjEwODgwMywKKzB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsIDB4NzEwMjZFMTMsIDB4MkIxMjY1NzEsCisweDY1NUQ2REUxLCAweDQyMjg2MkRELCAweDMyNUNFMTA3LCAweEEwMEMyQzEwLAorMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywgMHhFMjAxOEIwNSwKKzB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsIDB4RTYwRjI0NTIsIDB4NjdBMTJDNjAsCisweDhCMDUyNzc4LCAweEREMzhEQzQ0LCAweEVCMDFFQTAwLCAweDJEQjIyQ0EyLAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwgMHgyRkU2MkZENiwKKzB4RTI0MEREMzYsIDB4MzYyMjY2RDEsIDB4NjI2Mzg5MDAsIDB4MzY3ODY3MkMsCisweDc3MDNERTM4LCAweDQ3MjEyRDYxLCAweDY0RTJENjM1LCAweEEwMEU0NzIxLAorMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwgMHg3NDAxMjQ1MCwgMHgyNDIwNDIxOSwKKzB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsIDB4MjQ1MDQ1MTksIDB4NjIxQzc0MDEsCisweDhCRUUzMjczLCAweDY2RTI0MjAwLCAweDQyMDA2MUQxLCAweDIxMTgzNjJDLAorMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwgMHhFNTAxRTQwMCwgMHgyRDUyMjc0MiwKKzB4MDAwQjZFRjYsIDB4MkZENjZERjYsIDB4NEYyMjJGRTYsIDB4RUQwQUVFMDEsCisweDY0RTNCQzk3LCAweEJDOUM2NEUzLCAweDYyRUM3RTAxLCAweDhCRjczMkQ3LAorMHhCQzlGRUUwMSwgMHg2NEUzNjRFMywgMHg3RTAxQkNBNCwgMHgzMkQ3NjJFQywKKzB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsIDB4RDExODZERjYsIDB4RDQxODkyMEQsCisweDcyMTIyMTIyLCAweDI0MjJENjE3LCAweEQ3MTc3MjA0LCAweDcyMjAyNjIyLAorMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwgMHgxMzdBMjEyMiwgMHgwMDIwMzFGQSwKKzB4MDAyMDI0NkUsIDB4MDAxRTEwMTUsIDB4MDAyMDMyMDAsIDB4MDAxRTEwMDEsCisweDAwMjAzMUQ0LCAweDAwMUUxMTAwLCAweDAwMjAzMUZFLCAweDAwMjAzMUVDLAorMHgwMDFFMTAwMCwgMHgwMDIwMzFGMCwgMHgwMDIwMzFGQywgMHgwMDIwMjM2MiwKKzB4MDAxRTEwMEMsIDB4MDAyMDMxRTgsIDB4MDAyMDMyMDQsIDB4MDAyMDMyMDgsCisweDAwMjAzMjBDLCAweDAwMjAzMjEwLCAweDAwMjAzMjE0LCAweDAwMjAzMjE4LAorMHg0RjIyMkZFNiwgMHhENjUwN0ZGQywgMHg4ODAxNjA2MCwgMHhFMjAxODk1MSwKKzB4MjYyMEJGQkIsIDB4RDU0RUQxNEQsIDB4REU0RTYwMTAsIDB4NjRFMzY1NTIsCisweDc0MDJDODQwLCAweDhEMjJEMTRDLCAweEQyNEM3NTAyLCAweEU2MDFENzRDLAorMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywKKzB4RDQ0Mzc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksCisweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTQyLCAweDY3NTU3NjAxLAorMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHhBMDIwNzEwMiwgMHhEMjNFMDAwOSwKKzB4RTYwMUQ3M0IsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsCisweDhGRjkzMjczLCAweEQ0MzI3NDAyLCAweDYyNDJFNjAxLCAweDY0MEQ4NTI4LAorMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywgMHhFNDE3RDUzMywKKzB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsIDB4OTI0QTcxMDIsCisweEQyMjYyRTIxLCAweDVFMjNENzJFLCAweDY0RjIyRkUyLCAweDYwNDM2NUYyLAorMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywgMHg4MDcxNjEwMywgMHhDOTAzNjA0MywKKzB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsIDB4ODE3MjY2RjIsIDB4NDYxOTQ2MjksCisweDYwNkM0NTI5LCAweDQwMTg2NDVDLCAweDgxNzMzMDRDLCAweDIxMTg1RTIzLAorMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwgMHg2MDJDNDIxOSwgMHg2NkYyNjJGMiwKKzB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsIDB4NDIyOTgxNzQsIDB4NjUyQzYwNkMsCisweDMwNUM0MDE4LCAweDgxNzU4RjA3LCAweDAwMDlCQzlELCAweDIyMjg2MjBDLAorMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwgMHgwMDA5QjAwOSwKKzB4MDAwOUEwMDMsIDB4RTIwMkQ2MEYsIDB4N0YwNDI2MjIsIDB4MDAwQjRGMjYsCisweDAwMEI2RUY2LCAweDA2MEEwMDA5LCAweDAwMjAzMjFDLCAweDAwMUUxMDAwLAorMHgwMDIwMzIwOCwgMHgwMDIwMzUxQywgMHgwMDIwMzUyOCwgMHgwMDIwMzRDMCwKKzB4MDAyMDMxRjAsIDB4MDAyMDM0RjAsIDB4MDAyMDM0RUUsIDB4MDAyMDM0QzIsCisweDAwMjAzMUQ0LCAweDAwMjAzMjAwLCAweDRGMjIyRkU2LCAweERFOTM3RkZDLAorMHgyMDA4ODRFOSwgMHgyRjAwOEQwNiwgMHhENjkyRDQ5MSwgMHgwMDA5NDYwQiwKKzB4NjRGMEIxOTQsIDB4NjYyMEQyOTAsIDB4ODkwMjI2NjgsIDB4QzlCRjYwRTAsCisweDdGMDQyRTAwLCAweDAwMEI0RjI2LCAweDAwMEI2RUY2LCAweDJGRTYwMDA5LAorMHhERThBNEYyMiwgMHg2MEUwRDY4QSwgMHhDQkMwRDQ4QSwgMHg2MjYwMkUwMCwKKzB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsCisweDY2MDM0MDA5LCAweEQ2ODQ2MTZELCAweEU1MDBBMDA0LCAweDc1MDE2MjYyLAorMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwgMHhEMjgwOEJGOCwgMHgwMDA5NDIwQiwKKzB4QzlCRjg0RTIsIDB4NEYyNjgwRTIsIDB4NkVGNjAwMEIsIDB4MkZFNjJGRDYsCisweDdGRkM0RjIyLCAweDYyNjBENjdBLCAweDg5NDQyMjI4LCAweEQ1NkZFMTAwLAorMHg2MDUwMjYxMCwgMHhDQjQwRDQ3NywgMHgyNTAwNDQwQiwgMHg4RDA1MjAwOCwKKzB4NjJFMDZFMDMsIDB4NzEwNDYxMkMsIDB4MkYxMUEwMDYsIDB4RDQ3MkQ2NkEsCisweERENzI2NzYwLCAweDY1N0M0RDBCLCAweEUyM0M2RDFELCAweDhCMDMzRDI3LAorMHhEMjY0RDQ2RiwgMHgwMDA5NDIwQiwgMHg0RDIxNEQyMSwgMHhBMDA1RDc2RCwKKzB4NjZFNkU0MDAsIDB4MzU3QzQ1MDgsIDB4NzQwMTI1NjIsIDB4MzVEMzY1NEQsCisweEQ3Njk4QkY3LCAweDYxNzJFMDAzLCAweDgxMTE0MDE4LCAweDZFNzI2MEYxLAorMHg4MUUyNzAwQywgMHhENDY1NjE3MiwgMHhERDY1ODExMywgMHg0RDBCREU2NSwKKzB4RTIwMTY1NzIsIDB4RDQ2NDJFMjIsIDB4NDIwQkQyNTIsIDB4RDY1MzAwMDksCisweEM5M0Y2MDYwLCAweDdGMDQyNjAwLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEMjVDNEYyMiwgMHg2QjQzNkU3MywKKzB4NDIwQjZDNTMsIDB4MjAwODZENjMsIDB4NjEwMzhGMDgsIDB4RDI0NUQ0NTgsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDIxQjA2MEMzLAorMHg2MEQzODAxMSwgMHhFNTAwODExMSwgMHg2NEJDQTAwNywgMHg2MDUzNjU1RCwKKzB4NjY1MzAwRUMsIDB4NzUwMTM2MUMsIDB4NjI1RDgwNjQsIDB4OEJGNTMyNDMsCisweDYwNjBENjM2LCAweDI2MDBDOUJGLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHg3RkM0NEYyMiwgMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwKKzB4NDUyOTcyMDIsIDB4NjA2MzIyNTEsIDB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsCisweDY1NUM2NjZDLCAweEU0MDhCRkJDLCAweDRGMjY3RjNDLCAweDAwMDkwMDBCLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RTEwMDdGQzQsIDB4NjUxM0VDRkYsIDB4NkIxMzZDQ0QsIDB4REUzNkQ3MzUsCisweEVERkY2NEYzLCAweEQ4MzVFQTA0LCAweDYwNTM2NTVDLCAweDAyN0Q0MDAwLAorMHgzMkMwNjIyRCwgMHg2NjAzOEQwRCwgMHgwOUVENjA2MywgMHgyNDkxMDI3RCwKKzB4MjQyMTc0MDIsIDB4Njk4MjAyRUQsIDB4MzkyODYyMkQsIDB4NzQwMjI4OTIsCisweDc1MDE3MTA0LCAweDYwNjM2MjVDLCAweDA3RDUzMkEyLCAweDBFQjU4RkU0LAorMHgyNDQ4NjQxQywgMHhFNjgwODkwNSwgMHg2N0YzRTVDNSwgMHhCRjdGNjY2QywKKzB4N0YzQzY1NUMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweEQxMUU2OEY2LCAweDYwMTJEMjFFLCAweENCMjBFNDA1LAorMHgyMTAyRTUwMCwgMHgwMDBCMjI0MiwgMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywKKzB4MDAyMDMzNTgsIDB4MDAyMDE0NUUsIDB4MDAyMDMxQTIsIDB4MDAxRTEwMTUsCisweDAwMUUxMEJGLCAweDAwMTE3ODAwLCAweDAwMUUxMEZDLCAweDAwMjAwMzA4LAorMHgwMDIwMzFBOCwgMHgwMDIwMjVDNiwgMHgwMDIwMzM1QywgMHgwMDIwMTRBQSwKKzB4MDAyMDMzNzgsIDB4MDAxMTc4OEMsIDB4MDAyMDMxQTQsIDB4MDAyMDJEODgsCisweDAwMjAxMUU0LCAweDAwMUUyMTMwLCAweDAwMjAzMzgwLCAweDAwMjAyNTg4LAorMHgwMDIwMzM4NCwgMHgwMDIwMzFCQywgMHgwMDIwMzFDNCwgMHgwMDIwMzRCQywKKzB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4RDU2NUQxNjQsIDB4RTQwMEQ3NjUsCisweDIxNDJFMjBGLCAweDE3NDExMTU0LCAweEQ1NjMyNzIyLCAweDk2NjlENzYzLAorMHgxNTQxMjU3MiwgMHg5NjY2MTU2MiwgMHhFNjAxMTU2NSwgMHhENTYwMTE2NSwKKzB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NjIyNTQyLCAweDc2MDFFNzI3LCAweDY3NjMyNTcyLCAweDI1NjI3Nzk3LAorMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwgMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwgMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4QzgyMDYwNDMsIDB4NkU0MzhEMDIsIDB4MDAwOUJFNkQsCisweEM4MTA2MEUzLCAweEJFNkE4OTAxLCAweDYwRTMwMDA5LCAweDg5MDFDODQwLAorMHgwMDA5QkU4QywgMHhDODAxNjBFMywgMHhERDNFODkzOCwgMHhDODAyNjBEMCwKKzB4MkYwMDhEMDMsIDB4NDYwQkQ2M0MsIDB4NjBGMDAwMDksIDB4ODkwMkM4MDQsCisweDQ2MEJENjNBLCAweDYyRjAwMDA5LCAweEM4ODA2MDIzLCAweDYwRDA4OTAyLAorMHgyRDAwQzk3RiwgMHhDODAxNjAyMywgMHhENjM1ODkwNiwgMHgwMDA5NDYwQiwKKzB4MDAwOUEwMDcsIDB4NTE2MzA2MDEsIDB4ODkwMkM4MDgsIDB4NDYwQkQ2MzEsCisweDYwRjAwMDA5LCAweDg5MDJDODEwLCAweDQyMEJEMjJGLCAweEQ1MkYwMDA5LAorMHg4ODAyNjA1MiwgMHhEMjJFOEIwMywgMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwKKzB4RDIyQjhCMDIsIDB4MjI2MEU2MDEsIDB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsCisweEQ2Mjg4OTJFLCAweDYwRTM2RTYwLCAweDg5MDJDODgwLCAweDQyMEJEMjI2LAorMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwgMHg0MjBCRDIyNCwgMHg2MEUzMDAwOSwKKzB4ODkwMkM4MDIsIDB4NDIwQkQyMjIsIDB4NjBFMzAwMDksIDB4ODkwRUM4MDQsCisweDQxMEJEMTIwLCAweEJGMEUwMDA5LCAweEJGNEQwMDA5LCAweEQ1MUUwMDA5LAorMHg2MDUwRDQxRSwgMHhDOTA4RDcxRSwgMHhCRjg0MjUwMCwgMHg2MEUzMjQ3MiwKKzB4ODkwNUM4MDgsIDB4N0YwNEQyMUIsIDB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsCisweDRGMjY3RjA0LCAweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMUM1ODFDLAorMHhBMDAwQTAwMCwgMHgwMDFEMDEwMCwgMHgwMDFENDAwMCwgMHgwMDA0MDAyMSwKKzB4MDAxQzU4OUMsIDB4MDAxRTEwMjEsIDB4MDAyMDE2NDAsIDB4MDAyMDE2NjIsCisweDAwMjAxQ0EwLCAweDAwMjAxNjdBLCAweDAwMjAxNjg4LCAweDAwMjAzMjAwLAorMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwgMHgwMDIwMTZERSwgMHgwMDIwMTZFQSwKKzB4MDAyMDE2OTAsIDB4MDAyMDE2QUUsIDB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsCisweDEyMzQ1Njc4LCAweDAwMjAxNkM2LCAweDY0NENENkE3LCAweDAwMEIzNDZDLAorMHhENkE2MjQ1MCwgMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwgMHg2NDRDRDZBNCwKKzB4MDAwQjM0NkMsIDB4NjI1QzI0NTAsIDB4NDIwODYxNkQsIDB4NDIwODQxMTksCisweDQyMDA2MDE5LCAweDY3MEU2MTRDLCAweEQ0OUUzMjFDLCAweDQyMDAyMDdELAorMHgzMjRDQzkwRiwgMHgyMjAwMDAwQiwgMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwKKzB4MzI0QzY0NEMsIDB4NDIwMEQ0OTgsIDB4MDAwQjMyNEMsIDB4MkZFNjIyNjAsCisweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLCAweEUyOUY2NjZELAorMHgyNzI5NDYxOSwgMHg2RTUzNjI2OSwgMHg2NzJFNjU3MywgMHg0MjIxMjI3RCwKKzB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsCisweDY0NEM0NjAwLCAweDA3MUEwNDY3LCAweDIxNTAyNTdCLCAweDAwMEI0RjE2LAorMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwKKzB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsCisweEU0MDFCRkEyLCAweEJGQTRFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkZBNCwgMHhCRkExRTQwMSwgMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwKKzB4ODFGMkU0MDEsIDB4NjU0M0JGOUYsIDB4RTQwMTg1RjIsIDB4QkZBQjY1NDMsCisweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLCAweEU0MDI2NUYwLAorMHg2MDUzNzU2QywgMHg4MEY4QkY4MCwgMHhCRjgyRTQwMiwgMHg4NEY4RTUxMiwKKzB4NzA5MEU0MDIsIDB4NjUwM0JGODIsIDB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsCisweEJGODBFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLCAweEU1MDBCRjhDLAorMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywKKzB4QkY2MUU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjMsIDB4MDVGQ0UwMTAsCisweEJGNjNFNDBFLCAweEU1MDA3NTg1LCAweEJGNjRFNDAzLCAweEU1MDBFNjQwLAorMHhCRjcxRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwKKzB4RTAxNDY1NUMsIDB4QkY0N0U0MDQsIDB4RTQwRjBGNTQsIDB4RTUwNEJGNDksCisweDA1RkNFMDE0LCAweEJGNDlFNDBGLCAweEU1MDE3NTg0LCAweEJGNEFFNjQwLAorMHhFNTAxRTQwNCwgMHhCRjU3RTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwKKzB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsIDB4NEYyMjAwMDksCisweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLCAweDI2Njg2NjIxLAorMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwgMHhFNDAxQkYxQywKKzB4QkYxRUU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGMUUsCisweEJGMUJFNDAxLCAweEU0MDFFNTA2LCAweEJGMUM2NTQzLCAweEU0MDFFNjQwLAorMHhCRjI5NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwKKzB4NzU2Q0U0MDIsIDB4QkVGRjYwNTMsIDB4RTQwMjgwRjQsIDB4RTUxMkJGMDEsCisweEU0MDI4NEY0LCAweEJGMDE3MDkwLCAweEU2NDA2NTAzLCAweEJGMDJFNDAyLAorMHhFNjQwRTUwMCwgMHhCRjBGRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwKKzB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFNUU0MDMsIDB4RTUxMzgwRjgsCisweEU0MEVCRUU3LCAweEU0MEU4NEY4LCAweEJFRTc3MDg1LCAweEU1MDA2NTAzLAorMHhCRUU4RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY1RTY0MCwgMHhFNTAwRTQwMywKKzB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsIDB4QkVDQkU0MDQsCisweEU0MEY4MEZDLCAweEU1MDRCRUNELCAweEU0MEY4NEZDLCAweEJFQ0Q3MDgzLAorMHhFNTAxNjUwMywgMHhCRUNFRTY0MCwgMHhFNTAxRTQwNCwgMHhCRURCRTY0MCwKKzB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsCisweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDJGLCAweDAwMUUxMDgwLAorMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwgMHgwMDIwMzFGQSwKKzB4MDAyMDMxRkMsIDB4MDAyMDMxRkUsIDB4RDIxREQxMUMsIDB4NjYyMDYwMTAsCisweDY3NkM3MDAxLCAweDM3MDBDOTBGLCAweEU1MDA4RDEzLCAweDY3MTA2MjEwLAorMHg3NzAxNjIyQywgMHg2NDIzMjE3MCwgMHhENjE2NjAxMCwgMHg0NDA4NDQwOCwKKzB4MzQyOEM5MEYsIDB4NjI2MDIxMDAsIDB4NzIwMUQ1MTMsIDB4NDQwODI2MjAsCisweDAwMEIzNTRDLCAweEQxMEY2MDUzLCAweDI1NTg2NTEwLCAweEU2MDA4RDEzLAorMHhENjBERDQwQiwgMHg2NTVDNjU0MCwgMHg0NzA4Njc1MywgMHgzNzU4NDcwOCwKKzB4NDcwODY1NDAsIDB4MjQ1MDc1MDEsIDB4MzY3QzYwNDAsIDB4MjQwMEM5MEYsCisweDcyRkY2MjEwLCAweDAwMEIyMTIwLCAweDAwMDA2MDYzLCAweDAwMjAzMUExLAorMHgwMDIwMzFBMCwgMHgwMDIwMzFBMiwgMHgwMDIwMkRDOCwgMHg3RkZDNEYyMiwKKzB4RTY4MEQxOUQsIDB4NjY2QzYyMTIsIDB4RDI5QzJGMjIsIDB4NjdGMzY1NjMsCisweDQyMEI3NTQyLCAweDdGMDRFNDA0LCAweDAwMEI0RjI2LCAweEU2ODAwMDA5LAorMHhEMjk2NjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MCwgMHhFNjgwNjQ3MywKKzB4RDI5MjY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDMsIDB4MkY4NjY0NzMsCisweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjQ0RjIyLAorMHhERDhDRDI4QiwgMHg3MjAxMUYyMSwgMHhEQjhCMUYyMiwgMHg2QUYyRTg0MCwKKzB4NTIxMUQxOEEsIDB4MzYyMDY2MTIsIDB4QTBBNzhCMDEsIDB4NjA2MTAwMDksCisweDg4MDFDOTAzLCAweEEwQTE4QjAxLCAweEQ5ODQwMDA5LCAweDQyMEJEMjg0LAorMHg1NTAzNjQ5MywgMHg4NDVDNkEwMywgMHgzMEUwRUU4NCwgMHhEMTgxOEI3OSwKKzB4NjA2QzY2MTAsIDB4OEIzRDg4MDEsIDB4NjIxMEQxN0YsIDB4ODkyRjIyMjgsCisweEQ1N0VFNzAxLCAweDY0NTIyQjcyLCAweDE0NDJFMDAzLCAweEQ1N0M2MjUyLAorMHhFNjAwNDAxOCwgMHgyMTYwODEyMSwgMHhEMTdBNjQ1MywgMHg2RTUyNzQwNCwKKzB4NjAxMjY3NDIsIDB4Q0IyMERDNzgsIDB4NzYwMTIxMDIsIDB4MzI4MzYyNkQsCisweDI1RTI4QkZCLCAweDI0NzJERTcxLCAweDYyRTI2N0MyLCAweDEyNzREMTczLAorMHg2MDQxNjRFMiwgMHgyNDAxQ0IwMSwgMHhFRTAwNjZFMiwgMHhEQzcwMkM2MiwKKzB4RUMwMTJDNjIsIDB4MkRDMjQxMEIsIDB4NEMxOEVDMDEsIDB4MkJFMjJEQzIsCisweEQ3NjRERTZDLCAweEQxNkM2MEUyLCAweENCMDFFMjAyLCAweDI3MjAyRTAyLAorMHgyMTIyQTAyRiwgMHg4QjJDMjAwOCwgMHhFNzAxREU2OCwgMHhENDY2RUMwMCwKKzB4MjE3MEQyNjQsIDB4RUUwMTJFQzIsIDB4NjEyMjI0RTIsIDB4MjE2OUU2RkUsCisweEUwMUUyMjEyLCAweDU0RjEwQzVDLCAweDI0QzBFMDFGLCAweDU2RjIwMjVDLAorMHgyNjIwNzUxMCwgMHhENzVFRTYwMCwgMHhFRTA2RDQ1RSwgMHg3NjAxODQ1NiwKKzB4NkM1NDI3MDAsIDB4MzFFMzYxNkMsIDB4NzQwMTI0QzAsIDB4NzcwMThGRjYsCisweEU0OTREMjU5LCAweDcyMDEyMjQwLCAweDIyNTBFNTAwLCAweEU2MDU3MjBGLAorMHhEMjU2MjI2MCwgMHg2NUEzNjQ5MywgMHhFRTAxNDIwQiwgMHhBRjZGNEUxOCwKKzB4MkZBMjJERTIsIDB4RDQ1MjY1RjIsIDB4NjY0Mjg1NTMsIDB4MzI2MjYyMEQsCisweEQ0NTA4OTA3LCAweDQxMEJEMTUwLCAweEQ3NTAwMDA5LCAweEFGNTdFNjAxLAorMHhENDNBMjc2MiwgMHhERDM3RDE0OSwgMHg2NUYyNDEwQiwgMHhENDRDRUUwMSwKKzB4NEUxOEQ2NEMsIDB4MkRFMjQ2MEIsIDB4MDAwOUFGNEEsIDB4N0YwQzJGQTIsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHg0RjIyNjhGNiwgMHg4NTQ2N0ZGNCwgMHgyRjAxRTY4MSwgMHg2NjZDODU0NywKKzB4ODU0ODgxRjEsIDB4ODFGMkQyMjUsIDB4NjdGMzg1NDIsIDB4ODU0MzgxRjMsCisweDgxRjRFNDBDLCAweDY1NjM2MDUzLCAweDQyMEI4MUY1LCAweDdGMEM3NTQwLAorMHgwMDBCNEYyNiwgMHgyRjg2MDAwOSwgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4RTgwMEQxMUEsIDB4RDQzMjJGMTIsCisweDFGNDE2MTgzLCAweDZBMTNEQjIwLCAweDRBMDhENjMwLCAweERFMjBFMDAxLAorMHg0QTAwNDYwQiwgMHgxRjAyM0FFQywgMHg1MkIxNjZCMiwgMHg4QjAxMzYyMCwKKzB4MDAwOUExOUIsIDB4QzkwMzYwNjEsIDB4OEIwMTg4MDEsIDB4MDAwOUExOTUsCisweERFMjc1MjYzLCAweDhCNEYzMkUwLCAweDQyMEJEMjBELCAweERFMjU2NEIzLAorMHhENzBERDUwRSwgMHhFRDAxREMwQiwgMHgyRTAyRTEwMCwgMHgyN0QwMjUwMiwKKzB4QUZFMTJDMTAsIDB4MDAwMDJFMTYsIDB4MDAxQzNEOUMsIDB4MDAyMDFGNDAsCisweDAwMTE3NzlBLCAweDAwMUMzRDMwLCAweDAwMUQwMTA0LCAweDAwMjAyREMwLAorMHgwMDIwMTE2MiwgMHgwMDIwMzFCMSwgMHgwMDIwMzFCMCwgMHgwMDIwMzFBQywKKzB4MDAxQzNCOUMsIDB4MDAxQzM1MDAsIDB4MDAyMDJEOTgsIDB4MDAyMDEyNzYsCisweDAwMUMzRDAwLCAweDAwMUMzNkY4LCAweDAwMTE3NzA4LCAweDAwMjAzMUI0LAorMHgwMDExNzc4QywgMHgwMDExNzc5MiwgMHgwMDExNzc4OCwgMHgwMDIwMTE4MCwKKzB4MDAyMDMxODgsIDB4MDAyMDJEODgsIDB4MDAyMDExRTQsIDB4MDAxRTIxMzAsCisweDAwMjAzNDlDLCAweDAwMjAxNDVFLCAweDAwMjAzNEE4LCAweDAwMjAyQzgwLAorMHgwMDExNzc4MCwgMHgwMDExNzcwQywgMHhDODAxODU2MSwgMHg1QzYzODk3QSwKKzB4NjYwMzg1QzIsIDB4NjQwM0M5MDMsIDB4NjUwRDg1QzMsIDB4NDAyMTYwNTMsCisweEM5M0Y0MDIxLCAweDZFMDM0NTAwLCAweDI1MkQzMjJBLCAweEUyMTA2MDUzLAorMHgzRTIzQzkwMSwgMHg2RDAzOEQyMywgMHg0NDA4RDc5RCwgMHg0NDA4NjU3MCwKKzB4NDQwMDYyRTMsIDB4MjU1ODQyMDAsIDB4MzQyQzhGMEYsIDB4NjA0M0QyOTksCisweDY5N0QwNzJELCAweDYwOTk0OTE5LCAweDIwMUQ2MTBFLCAweDYwRDM4MUY2LAorMHg4RjBDODgwMSwgMHhBMDBBNjk3QywgMHhEMjkzNjlFMywgMHgwNTJENjA0MywKKzB4NDIxOTYyNUQsIDB4NjcwRTYwMjksIDB4ODFGNjIwN0QsIDB4RDE4RjY5NUMsCisweDIyMjg2MjEwLCAweEU5RkY4OTAxLCAweEVFRkY2OTlDLCAweDZFRUM2NTlELAorMHg4QjBGMzVFMCwgMHg0QzBCREM4QSwgMHg1NDAzNjRCMywgMHhCRjIwRTUwMiwKKzB4RDQ4ODZFMDMsIDB4NDEwQkQxODgsIDB4RDc4ODY1RTMsIDB4RDQ4OEVEMDEsCisweDI3RDJBMDFFLCAweDI2RTlFRUZDLCAweDgxQzI2MDYzLCAweDk3QzU4NUMzLAorMHg2MjAzMjA3OSwgMHg0NTA4ODVGNiwgMHg2MDYzMjYwQiwgMHg4MUMyMjUyQiwKKzB4ODFDMzYwNTMsIDB4RTEwODg1QzQsIDB4MjAxQjQxMTgsIDB4NjJCMjgxQzQsCisweDIwRTk4NTIxLCAweDY0QjI4MTIxLCAweENCMDE2MDQxLCAweEQ0NzkyNDAxLAorMHg0NTBCRDU3OSwgMHg2MEIyMDAwOSwgMHg1N0YyNjZGMiwgMHgyQTAyQ0IwMSwKKzB4MjY3MkFGMjIsIDB4RDI2RTg1NjEsIDB4OEYwMkM4MDIsIDB4QTA5RjY0QjMsCisweDQyMEIwMDA5LCAweERDNzEwMDA5LCAweDVFMDM2NTAzLCAweDA3Q0VFMDRDLAorMHg3NzAxREQ2RiwgMHg2Q0QyMEM3NiwgMHg3QzAxRDY2NCwgMHg2RDYwMkRDMiwKKzB4ODkwNjJERDgsIDB4RDI2NEQ0NjMsIDB4RUQwMTQyMEIsIDB4QTA3RUQ3NjMsCisweDYyNTEyN0QyLCAweDQxMThFMTBGLCAweDIyMTlFNDAyLCAweDMyNDA0NDE4LAorMHg4NTUxOEIxMSwgMHgyMEQ5RURGQywgMHg2MDUxODE1MSwgMHhDQjAxN0RFMywKKzB4ODVFMTI1MDEsIDB4MjBEOUQ2NUYsIDB4NDYwQjgxRTEsIDB4NkNGMjY0QjMsCisweEEwNjQ1N0YyLCAweDZENTEyQzcyLCAweDREMTk2RERELCAweDY2REU2REQ5LAorMHg3RDAxMkQ2RCwgMHg2MTAzNjBEQywgMHg4ODAxNDExOCwgMHgyNTExOEY0NSwKKzB4NjQ2MkQ2NTMsIDB4MjY0Mjc0MDEsIDB4NjYwRDg1RTMsIDB4NDAyMTYwNjMsCisweEM5M0Y0MDIxLCAweDZEMDM0NjAwLCAweDI2MkQzMjJBLCAweEM4MDE2MDYzLAorMHhEQzRFRDE0RCwgMHg5NjRBODkwMSwgMHhFNjAwMkQ2QiwgMHgwRjY0RTAxMCwKKzB4RTAxMDY0REQsIDB4NjA3QzA3RkMsIDB4MDIxRDQwMDAsIDB4MzI0MDYyMkQsCisweDY2MDM4RDEyLCAweDAyMUQ2MDYzLCAweDMyNzBFN0ZGLCAweEEwMEI4QjAxLAorMHhFMDEwMDFENSwgMHhFNjA0MDJGQywgMHgwRjI0NzIwMSwgMHgzMjYyNjIyQywKKzB4MDZGQzhCRTcsIDB4NDYwMDY2NkMsIDB4MDFDRDYwNjMsIDB4MEMxNTcxMDEsCisweDY3MTFEMTNCLCAweDNDNDA2QzdELCAweDYyMTE4OTA3LCAweDg4RkY2MDJELAorMHgyMUQxODkwMywgMHhFMjAxREQzNywgMHg4NTUxMkQyMCwgMHgyMEQ5RURGQywKKzB4NjA1MTgxNTEsIDB4Q0IwMUQyMkYsIDB4NDIwQjY0QjMsIDB4RTAxMDI1MDEsCisweEQ0MzEwMkZDLCAweEUwMDE2MTJDLCAweDY3RjI0NDBCLCAweDg1RUYyNzAyLAorMHg1NEYxRDIyRSwgMHg2NTBENDIwQiwgMHgwMDA5QUU3RSwgMHg4MDAwN0UwMywKKzB4MDAwOTQyMEIsIDB4NkUwMzU0MDMsIDB4RUQwODg1NDQsIDB4MjBEOTREMTgsCisweDhCMDMzMEQwLCAweEU1MDFCRTNELCAweDAwMDlBMDA3LCAweEREMjQ4NTQxLAorMHgyMkQ4NjIwRCwgMHhCRTM0ODkwMSwgMHhENDEyRTUwMCwgMHg0MjBCRDIxMiwKKzB4RDcxMjY1RTMsIDB4QUU1RkVEMDEsIDB4NzgwMTI3RDIsIDB4RUUwNDYxOEQsCisweDhEMDIzMUU3LCAweEFFNEU3QjA4LCAweDdGMTQwMDA5LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHgwMDAwNjhGNiwKKzB4MDAyMDM0QjgsIDB4MDAyMDMzOUMsIDB4MDAyMDM0MUMsIDB4MDAyMDMxOUMsCisweDAwMjAxMTYyLCAweDAwMjAyRDkwLCAweDAwMjAxMTgwLCAweDAwMUUyMTJDLAorMHgwMDIwMzRBMCwgMHgwMDIwMzRBNCwgMHgwMDIwMTQ1RSwgMHgwMDIwMkQyQywKKzB4MDAyMDM0QkMsIDB4MDAyMDExRTQsIDB4MDAyMDMxQkMsIDB4MDAyMDMxQzQsCisweDAwMjAzMUI4LCAweDAwMjAzMUJBLCAweDAwMjAyQzgwLCAweDAwMjAxNEFBLAorMHgwMDAwODAwMCwgMHg0RjIyMkZFNiwgMHg2RTIyRDIxMiwgMHhDODQwNjBFMywKKzB4MjJFMjhEMDIsIDB4MDAwOUJDRkEsIDB4NDIxOEUyNDAsIDB4ODkwMTJFMjgsCisweDAwMDlCRDA1LCAweEM4MTA2MEUzLCAweEQ0MEI4OTA1LCAweDQyMEJEMjBCLAorMHhCRDA0MDAwOSwgMHg2MEUzMDAwOSwgMHg4OTAxQzgwNSwgMHgwMDA5QkRFQiwKKzB4QzgwMjYwRTMsIDB4NEYyNjg5MDIsIDB4NkVGNkFEMDEsIDB4MDAwQjRGMjYsCisweDAwMDA2RUY2LCAweDAwMUMzNTEwLCAweDAwMjAzNEIwLCAweDAwMjAxNDVFLAorMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwKKzB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsCisweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLCAweDMyMUNEMjA0LAorMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwgMHgwMDIwMkNBQSwKKzB4MDAyMDJDNjAsIDB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAyODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDAwMEI0MDI4LAorMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsCisweDAwMEI0MDA1LCAweEM5MDE2MkY2LCAweDAwMEI0MDA1LCAweDAwMDA2MkY2LAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDU0NEYwRDBBLAorMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywgMHgyMDZDNzU0QSwgMHgzMjIwMzUzMiwKKzB4MjAzNzMwMzAsIDB4MzEzQTMxMzIsIDB4MzczMjNBMzIsIDB4MDAwMDAwMDAsCisweDAwMDAwRDBBLCAweDAwMDAwMDQzLCAweDQyNzA3MzcyLCAweDNEMjA2Njc1LAorMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwKKzB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsIDB4NjE3NjZFNDksIDB4MjA2NDY5NkMsCisweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLCAweDAwMjE0NDQ5LAorMHg1MjUwNDU0NSwgMHg1NzIwNEQ0RiwgMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywKKzB4MDAzRDcyNjQsIDB4NkM2MTc2MjAsIDB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsCisweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLCAweDNENjQ2RTYxLAorMHgwMDAwMDAwMCwgMHgwMDBBMEQ1MiwgMHgyMDNBMzA1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMyNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMzUxLCAweDAwMDAwMDIwLCAweDIwM0EzNDUxLCAweDAwMDAwMDIwLAorMHg2MTQzNzc0OCwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2NjIwMjA2RSwKKzB4MEE2QzY5NjEsIDB4MDAwMDAwMEQsIDB4NzM2OTZGNEUsIDB4NjE0MzIwNjUsCisweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLCAweDIxMjE2QzY5LAorMHgwMDAwMEQwQSwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwgMHgwMDAwMEQwQSwKKzB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsCisweDczNzU3MzVGLCAweDY0NkU2NTcwLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LAorMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwgMHgwMDAwMDA0MiwgMHg3Mjc0NkU0OSwKKzB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsIDB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsCisweDc1NEU1MTRFLCAweDAwMDAzRDZELCAweDY1NEM3MjQ1LCAweDAwMDAwMDZFLAorMHgwMDAwMDA0OSwgMHgyMDc0NkY0RSwgMHg3NTZGNkU2NSwgMHg0OTIwNjg2NywKKzB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwRkYsCisweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsCisweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLCAweDAyMDAwMDAzLAorMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwKKzB4MDIwNDAyMDMsIDB4MDIwQzAyMDcsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsIDB4MDIwMDAwRkYsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwMjA1MjIwLAorMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwKKzB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLCAweDAwRkYwNDAwLAorMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwgMHgwMDAyMDAwMiwKKzB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMjA0MDUsIDB4MDIwOTAwMDAsCisweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LCAweDAwMDAwMEZGLAorMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwgMHgwNTA3MDAwMCwKKzB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTEzNjU2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X0ZCNTBfbWRrLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfRkI1MF9tZGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE3MzZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X0ZCNTBfbWRrLmMKQEAgLTAsMCArMSw3MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhEMjI4N0ZGQywgMHgwMDA5NDIwQiwKKzB4MDAwOUIwMTksIDB4OTQ0NkQ1MjYsIDB4RTYwMEEwMDMsIDB4OEQwNDM2NDIsCisweDYwNTI3NjAxLCAweDhERjlDODQwLCAweEQ0MjIyRjAyLCAweDRFMEJERTIyLAorMHhENDIyMDAwOSwgMHgwMDA5NEUwQiwgMHg0RTBCRDQyMSwgMHg3RjA0MDAwOSwKKzB4QTAyNTRGMjYsIDB4NEYyMjZFRjYsIDB4NDEwQkQxMUUsIDB4RDQxRTAwMDksCisweDAwMDk0NDBCLCAweDQ1MEJENTFELCAweEQ3MUQwMDA5LCAweDYxMURFMUZGLAorMHgyNzEyRDIxQywgMHhENDFDNTAyOSwgMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwKKzB4MTIxMTIyMTIsIDB4RDUxOTI0NTIsIDB4RDYxOTk3MTYsIDB4RTcwMDI1NzIsCisweDI2NzBEMjE4LCAweDIyNzJENjE4LCAweDRGMjZFMjAxLCAweDI2MjIwMDBCLAorMHhERDE3REMxNiwgMHg0QzBCREUxNywgMHg0RDBCMDAwOSwgMHg0RTBCMDAwOSwKKzB4QUZGODAwMDksIDB4MjcxMDAwMDksIDB4MDAwMDA2NDAsIDB4MDAyMDA5NUEsCisweDAwMUMwMDFDLCAweDAwMjAyOTQwLCAweDAwMjAwRTJBLCAweDAwMjAyOTRDLAorMHgwMDIwMjk2NCwgMHgwMDIwMENGMCwgMHgwMDIwMEYyNiwgMHgwMDIwMDlDNCwKKzB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsIDB4MDAyMDI4RUMsCisweDAwMjAyODUwLCAweDAwMjAyOEY0LCAweDAwMjAyOTAwLCAweDAwMjAwQkVDLAorMHgwMDIwMUZENCwgMHgwMDIwMTdCOCwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REVBMTdGQTQsIDB4NjFFMEUwMUMsIDB4N0QwMTZERTMsIDB4NjFEMDBGMTQsCisweEQ1OUZENDlFLCAweDQ1MEJFMDIwLCAweEUwMjAwRjE0LCAweEU3ODAwNEZDLAorMHg2MDRDNjZFMiwgMHg3RDdGNjc3QywgMHgxRjY5MzA3MCwgMHgyRDYyOEYxNywKKzB4MDFGQ0UwMUMsIDB4NjQxQ0U1MDAsIDB4RDc5N0RFOTYsIDB4MzI0MzYyNUQsCisweEEyMUE4QjAxLCAweDY1NUQwMDA5LCAweDMxRUM2MTUzLCAweEUwMjg2QzEwLAorMHg2RDUzMEZDNCwgMHgzRDdDNjJDRSwgMHhBRkVGMkQyMCwgMHgyMDA4NzUwMSwKKzB4RTAxQzhCMTUsIDB4RTUwMDAxRkMsIDB4RDc4QkRFOEEsIDB4NjQxQ0EwMEEsCisweDZDNTM2NTVELCAweDY2QzIzQ0VDLCAweDY2NjI2MjUzLCAweDIyNjIzMjdDLAorMHgxRjY5NzUwNCwgMHgzMjQzNjI1RCwgMHhBMUY2OEJGMiwgMHg4ODAxMkQxMCwKKzB4RTAxQzhCMTYsIDB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFN0QsCisweDhCMDEzMjczLCAweDAwMDlBMUU5LCAweDYyRTM2NDRELCAweDcyMDQ2RDQzLAorMHgzREVDNjE0MywgMHg2NUQyMzEyQywgMHg3NDA4NkMxMiwgMHgyNUMyQUZFRiwKKzB4OEIxODg4MDQsIDB4MDFGQ0UwMUMsIDB4MkQ0MEU0MDAsIDB4REU3MTY3MUMsCisweDMyNzM2MjRELCAweEExRDA4QjAxLCAweDY0NEQwMDA5LCAweDYyRTM2RDQzLAorMHg2NUQyM0RFQywgMHg2MTQzNzIwNCwgMHg2NjEyMzEyQywgMHg3NDA4NkM1MiwKKzB4QUZFRDJDNjksIDB4ODgwNTI1QzIsIDB4RTAxQzhCMTgsIDB4RTQwMDAxRkMsCisweDY3MUMyRDQwLCAweDYyNERERTYzLCAweDhCMDEzMjczLCAweDAwMDlBMUI1LAorMHg2QzQzNjQ0RCwgMHgzQ0VDNjJFMywgMHg3MjA0NjVDMiwgMHgzRDJDNkQ0MywKKzB4NjE1MjY2RDIsIDB4MjE2Qjc0MDgsIDB4MjUxMkFGRUQsIDB4OEIxMzg4MzAsCisweEUyMDBERTU4LCAweDY0RTIyRDIwLCAweDhCMDQyNDQ4LCAweDQyMEJEMjU3LAorMHhBMTlBMDAwOSwgMHg1NUUxMDAwOSwgMHg1N0UzNTZFMiwgMHhERDU0NUNFNCwKKzB4MkZDNjREMEIsIDB4N0YwNEExOTEsIDB4ODkwMTg4MjgsIDB4MDAwOUEwRUEsCisweEUxNDNERTRDLCAweDYyMkQ2MkUxLCAweDhGMDMzMjE3LCAweDU2RkIxRkVCLAorMHgyNjIxRTI0MCwgMHg4QjAxMzIxNywgMHgwMDA5QTBENSwgMHhFMTAxNUVGQiwKKzB4MzAxNjg1RTEsIDB4QTBDRThCMDEsIDB4RTQwMTAwMDksIDB4MkQ0MDU1RkIsCisweDY0NTFCMTc5LCAweEUxNDM1N0ZCLCAweEUwNTQ2MjcxLCAweDM1MTc2NTJELAorMHgwRjU2OEQ0MSwgMHgzNTYzRTY0MCwgMHhFNjAwOEIwNSwgMHgwRjY1RTAzNCwKKzB4QTAwRkUxMUEsIDB4NjE1MzcyQzAsIDB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsCisweDQ1MjE0MTIxLCAweDQ1MjE0NTIxLCAweEM5MDM2MDUzLCAweEUwMzQ2NjAzLAorMHg3MTE4MEY2NSwgMHgyMjA5RTAwNywgMHg2NDFERTAzMCwgMHgwRjI1NjVGMywKKzB4MUY0RUIxRjEsIDB4MDRGREUwMzQsIDB4Njc0REUwMzAsIDB4NDcwODBDRkQsCisweDYwNzM2MUNELCAweDQxMDhEMjJCLCAweEUwMEYwQ0ZFLCAweDFGMUY0MjBCLAorMHgyQ0Q5NkQwNywgMHg1RUZCNjA3MywgMHg4NUUyMEZDNiwgMHg0MjBCNTFGRiwKKzB4MkMwQjYwMEQsIDB4NTRGRTYwNzMsIDB4QjFCQjBGQzYsIDB4RTA1NDY1RjMsCisweDY1MkQ2MkUxLCAweEU2NDAwRjU2LCAweDg5NjIzNTYzLCAweEUwNTBFMTAwLAorMHg2MDIzMEYxNSwgMHg0MDA4QzkwMywgMHg2RDAzNDAwMCwgMHhFMDQwNjEwMywKKzB4RTA0NDBGRDYsIDB4RDIxN0VFRkYsIDB4NkVFQzBGRjYsIDB4MEYyNkUwNTgsCisweDYwRTM0MjBCLCAweDQyMjE2MjUzLCAweDQyMjE0MjIxLCAweDY2MjM0MjIxLAorMHgzMjZDNDIwMCwgMHg0NTIxNDIwMCwgMHhFMDQ4NjcwNywgMHgwRjc2NDUyMSwKKzB4QzkwMzYwNTMsIDB4NDAwODVDRkIsIDB4N0MwNjMwRkMsIDB4NkUwMzZEMkQsCisweDFGRDUxRkM2LCAweDFGMDRBMDJFLCAweDAwMTE3RDAwLCAweDAwMjAyOTY4LAorMHgwMDIwMEUyQSwgMHgwMDExN0QwNCwgMHgwMDExN0Q4NCwgMHgwMDIwMDcwMCwKKzB4MDAyMDA3NEMsIDB4MDAyMDIwMzQsIDB4MEZENkUwNEMsIDB4MDVGRUUwNDQsCisweDY0RDNCMTg5LCAweDY0RTJFMDQ4LCAweEUwNDAwNkZFLCAweDJFNDIyNDY5LAorMHgwMUZFNjdDNCwgMHg2NjdDRTA1OCwgMHg0MjBCMDJGRSwgMHgyNDBCNjA2MywKKzB4MDVGRUUwNDQsIDB4QjE1RDJFNDIsIDB4RTA1MDY0RDMsIDB4N0QwMTAxRkQsCisweDBGMTU3MTAxLCAweDAyRkRFMDUwLCAweDMyNjJFNjA2LCAweDU2RkI4QkRDLAorMHg1NUZCNjI2MSwgMHg4NTUxNDIwMCwgMHgzMDJDNzUwQywgMHg2MTAzNzAxQiwKKzB4NjRGM0U2MDAsIDB4RTcwNEEwMDQsIDB4NzYwMTYyNTYsIDB4NzQwNDI0MjIsCisweDMyNzM2MjZELCAweDY1RjM4QkY4LCAweDY0MURCMTNDLCAweEIwRDI1NkZCLAorMHhBMEFBNjQ2MSwgMHhENDg4MDAwOSwgMHhFMjAxRDU4OCwgMHgyRDIwNDUwQiwKKzB4MDAwOUEwQTMsIDB4OEIwNzg4MjksIDB4RTIwMERFODUsIDB4NjZFMjJEMjAsCisweDY0NkRCMEExLCAweDAwMDlBMDk5LCAweDYyMkNFMjgxLCAweDhCM0QzMDIwLAorMHhENjgwRTczOCwgMHhFMDQ0MkQ3MCwgMHhFMDQ4MEM2RSwgMHg2RTYyMURDMSwKKzB4NTE2MTFERTIsIDB4NTQ2MjFEMTMsIDB4NTU2NTFENDQsIDB4NTc2MzFENTUsCisweDVDNjYxRDc2LCAweDBFNkUxREM3LCAweDFERThFMDQwLCAweEUwNTAwMTZFLAorMHg1NDY0MUQxOSwgMHgwNTZFMUQ0QSwgMHgxRDVCRTA0QywgMHhFMDU0MDc2RSwKKzB4MEM2RTFEN0MsIDB4MURDREUwNTgsIDB4RTA0NDAyNkUsIDB4RUQwMDFEMkUsCisweEUwNDgwNkQ2LCAweDE2RDEyNkQyLCAweDE2RDUxNkQyLCAweDE2RDYxNkQzLAorMHhFMDQwMDZENiwgMHhFMDUwMDZENiwgMHgwNkQ2MTZENCwgMHgwNkQ2RTA0QywKKzB4MDZENkUwNTQsIDB4MDZENkUwNTgsIDB4MUYyOUEwNTcsIDB4NjIyQ0UyODIsCisweDg5MzEzMDIwLCAweDA1RkNFMDIwLCAweDYyNUNFNjgzLCAweDMyNjA2NjZDLAorMHhENjVEOEIwNywgMHgyNjUwRTUwMCwgMHg1MjYxNzY4MCwgMHhBMDQ0RDY1QiwKKzB4RTY5MDI2MjIsIDB4MzI2MDY2NkMsIDB4RDI1NzhCMTYsIDB4RTUwMEQ2NTgsCisweDYwNjIyMjUwLCAweENCMjBEMjU3LCAweEU2MDUyNjAyLCAweEQ2NTYyMjYyLAorMHgyMjUyNDYwQiwgMHg0MjBCRDI1NSwgMHhEMjU1MDAwOSwgMHgyMjYyRTYwMSwKKzB4NDYxOEQyNTQsIDB4MjI2MkEwMjksIDB4RDI1NEQ0NTMsIDB4RDQ1NDY1NDIsCisweDAwMDk0MjBCLCAweDAwMDlBMDIxLCAweEU1MjRENjQ3LCAweEQ1NDUyNjUwLAorMHgxNjIxNTI1NywgMHgxNjIyNTI1OCwgMHgxNjIzNTI1OSwgMHgxNjI0NTI1QSwKKzB4MTYyNTUyNUIsIDB4MTYyNjUyNUMsIDB4MTYyNzUyNUQsIDB4MTYyODUyNUUsCisweDFGMjk1MjVGLCAweEUyMDAxNjI5LCAweDE1MjgxNTI3LCAweDE1MkExNTI5LAorMHgxNTJDMTUyQiwgMHgxNTJFMTUyRCwgMHg3RjVDMTUyRiwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4NEYyMjZDRjYsIDB4RTI0MDYxNEQsIDB4ODkxNzMxMjMsCisweDMxMjdFMjFGLCAweEQ0M0I4OTA4LCAweEUwMDFENTNCLCAweDY2NDI0NTBCLAorMHgyNjc5NjcwNywgMHgyNDYyQTAwQywgMHgzMTI3RTIzRiwgMHhENzM1ODkwOCwKKzB4NzFFMEQ2MzUsIDB4NDYwQkUwMDEsIDB4NjIwNzU1NzEsIDB4MTc1MTI1MjksCisweDAwMEI0RjI2LCAweDRGMjIwMDA5LCAweEUyNDA2MTRELCAweDg5MTUzMTIzLAorMHgzMTI3RTIxRiwgMHhENDJCODkwNywgMHg2NjQyRDIyQiwgMHhFMDAxNDIwQiwKKzB4QTAwQjI2MEIsIDB4RTIzRjI0NjIsIDB4ODkwNzMxMjcsIDB4RDYyNkQ3MjUsCisweDcxRTA1NTcxLCAweEUwMDE0NjBCLCAweDE3NTEyNTBCLCAweDAwMEI0RjI2LAorMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwgMHg2MjUyRDUyMCwgMHg4OUZDMjI2OCwKKzB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsIDB4RDUxQzQ2MjgsIDB4MjI2ODYyNTIsCisweDAwMEI4OUZDLCAweEEwMDEwMDA5LCAweDcyMDFFMjAwLCAweDhCRkMzMjQyLAorMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwgMHhENTE1NDYyOCwgMHgyMjY4NjI1MiwKKzB4MDAwQjhCRkMsIDB4MDAwMDAwMDksIDB4MDAyMDI5NkMsIDB4MDAyMDBFMkEsCisweDAwMTE3RDA0LCAweDAwMjAyODU4LCAweDAwMTE3RDgwLCAweDAwMjAyOEVDLAorMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHgwMDIwMEYyNiwgMHgwMDIwMDlDNCwKKzB4MDAxRTIxMkMsIDB4MDAxQzNEMjgsIDB4MDAxMTdEMDAsIDB4MDAyMDBFOEEsCisweDAwMjAyOTg0LCAweDAwMUMzNzA0LCAweDAwMjAyMDM0LCAweDAwMUMzNzNDLAorMHgwMDFDMzcwMCwgMHg0RjIyMkZFNiwgMHg2RTUzN0ZGQywgMHgyRjQyQkZDQSwKKzB4RDYxNTYxRTIsIDB4MTYxNUUyODAsIDB4NDIxODU0RTEsIDB4NTVFMjE2NDYsCisweDE2NTc0MjI4LCAweDZFRjI1N0UzLCAweDJFMkIxNjc4LCAweDdGMDQyNkUyLAorMHhBRkE3NEYyNiwgMHgyRkM2NkVGNiwgMHgyRkU2MkZENiwgMHhERDBBNEYyMiwKKzB4QkZBRjZDNTMsIDB4QkY5NDZFNDMsIDB4QkZBQjJERTIsIDB4NTFENTAwMDksCisweDU0RDYyQzEyLCAweDU1RDcxQzQxLCAweDU2RDgxQzUyLCAweDRGMjYxQzYzLAorMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgwMDFDMzcwQywgMHgwMDA5QTBGOCwKKzB4RDE5QjRGMjIsIDB4RDQ5QjkyOTksIDB4MjEyMkIwMEQsIDB4OTc5NUU2MDUsCisweEIwMjI5NTk1LCAweEIwMzY2NDYzLCAweEIwM0EwMDA5LCAweEIwM0QwMDA5LAorMHhBMDZDMDAwOSwgMHg0RjEyNEYyNiwgMHhEMTkzNEYwMiwgMHg5NDg3MzE0NSwKKzB4NDYwOTA2MEEsIDB4NDYwOTQ2MDksIDB4MDAyOTM2NDYsIDB4RDc4Q0Q1OEYsCisweDI1MDBDQTAxLCAweDRGMDYyNzYyLCAweDRGMTYwMDBCLCAweEJGRUE0RjIyLAorMHhCMDIzMDAwOSwgMHhBMDUyMDAwOSwgMHgyRkU2NEYyNiwgMHg2RTYzRDE4OCwKKzB4NDQxODY2MTIsIDB4NDUyODkyNkQsIDB4MjYyOTQ0MDgsIDB4NDQwODQ1MDAsCisweDQ0MDAyNjVCLCAweDQ3MDgyNjRCLCAweDQ3MDgyMTYyLCAweDI3RUJEMTgxLAorMHgwMDBCMjE3MiwgMHhEMTgwNkVGNiwgMHhFNjAzRDQ4MCwgMHgwMDBCMjE2MiwKKzB4RDI3RjI0NjIsIDB4RTQwQTk2NTYsIDB4MjI2MkFGQjAsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweERDN0I0RjIyLCAweDJDMjJFMjAxLCAweEJGQTVFNDBBLAorMHg2MEMyN0M0NCwgMHhDQjAxRUQwMCwgMHg2MEMyMkMwMiwgMHhDOTAxRUI2NCwKKzB4NkUwM0EwMDgsIDB4ODkwNzNEQjIsIDB4RTQwMTYwQzIsIDB4QkY5NUM5MDEsCisweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhCMDMzREIyLCAweEQyNkZENDZFLAorMHgwMDA5NDIwQiwgMHg0RjI2RTQwQSwgMHg2REY2NkVGNiwgMHhBRjg1NkNGNiwKKzB4NDQxMTZCRjYsIDB4NjA0QjhGMDEsIDB4MDAwQjYwNDMsIDB4MkY4NjAwMDksCisweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2REEzRUEwMCwgMHhEQzYyNkJBMywgMHg5OTE0RTg2NCwgMHg4QjRFMkJCOCwKKzB4M0FFM0VFMEEsIDB4NjBDMjg5NEIsIDB4Q0IwMkVEMDAsIDB4NjJDMjJDMDIsCisweDJGMDI2MEMyLCAweEEwMTBDOTAyLCAweDA5NkM2RTAzLCAweDVCQjQ1Mjg4LAorMHgxRkZGMDlCNCwgMHgwMUZGMDNDNCwgMHg4OTA4M0Q4MywgMHhFNDY0NjBDMiwKKzB4QzkwMjJGMDIsIDB4NkUwM0JGNTIsIDB4MkVFODdEMDEsIDB4RDE1MThCRjQsCisweDU0QzFENTUxLCAweDY2NTI2NDEyLCAweDYyNjlFRTAxLCAweDQyMjA2MjJGLAorMHg2MjJGNDIxOSwgMHg0RTE4MjI5OSwgMHg4RDAzMjJFOCwgMHhFNEZGNjQyMywKKzB4MzQyODIyOUEsIDB4NjU3MkQ3NDksIDB4NjIyRjYyNTksIDB4NDIxOTQyMjAsCisweDIyOTk2MjJGLCAweDhEMDMyMkU4LCAweEU2RkY2NjIzLCAweDM2MjgyMjlBLAorMHgzNDY4QkZBNywgMHgzMEUyRUUwMiwgMHhBRkI3ODkwMSwgMHhEMjQwRUIwMSwKKzB4NkVFQ0VFRTYsIDB4QkYyMUU0MEEsIDB4QUZBRjIyRTIsIDB4RUUwQTdBMDEsCisweDg5MDEzQUUzLCAweDhCMDMzRDgzLCAweEQyMzRENDNBLCAweDAwMDk0MjBCLAorMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwKKzB4NjhGNjAwMEIsIDB4NTY1MUQ1MzQsIDB4NDYyODYwNTIsIDB4MzA2QzAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDRGMTI0RjIyLCAweEJGRjE0RjAyLAorMHg2QjAzNkU0MywgMHhERDFDREMyRCwgMHgwMDA5QkZFQywgMHgzQzA1MzBCOCwKKzB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksIDB4MDIwQTNENjUsIDB4NDIwOTQyMDksCisweDMyRTI0MjA5LCAweDRGMDY4QkYwLCAweDRGMjY0RjE2LCAweDZERjY2RUY2LAorMHgwMDBCNkNGNiwgMHgyRkU2NkJGNiwgMHhERTIxNEYyMiwgMHhFNTAwRTEwMiwKKzB4MkUxMkU0MDMsIDB4MkU1MkJGRDQsIDB4NDYxOEU2MDYsIDB4RTQwM0U3MDAsCisweDJFNzIyRTYyLCAweEFGQ0I0RjI2LCAweDRGMjI2RUY2LCAweDAwMDlCRkVCLAorMHhFNkU2RDIxMywgMHhFNDBBNjY2QywgMHgyMjYyQkZDMiwgMHg0RjI2QUZFMywKKzB4MDAyMDI4RjAsIDB4MDAyNENERTAsIDB4MTA2MjRERDMsIDB4MDAyMDJBRjAsCisweDAwMUM1ODE0LCAweDAwMUM1OUQwLCAweDAwMUM1OUE0LCAweDAwMUM2MzlDLAorMHgwMDFDNTgwNCwgMHgwMDFDNTgxQywgMHgwMDIwMjk5OCwgMHgwMDIwMEUyQSwKKzB4MDAxQzU4NjAsIDB4MDAxQzY4NjQsIDB4MDAxQzU5QkMsIDB4MDAxQzY5QkMsCisweDAwMUM5NDdDLCAweDAwMjAyOUIwLCAweDAwMUMxMDQwLCAweENDQ0NDQ0NELAorMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4RTQwMDdGRTQsIDB4NDUyOEU1MTAsIDB4Njc0MzZDNDMsCisweEUxMDdBMDBGLCAweDYwNDM2NDRELCAweDBGNTY0MDA4LCAweEVFMDA2MEMzLAorMHg4MTUxMjVDMSwgMHg4MTUzODE1MiwgMHgxNTczMTVFMiwgMHg3NTE0MTVFNCwKKzB4NjI0RDc0MDEsIDB4OEJFRDMyMTMsIDB4REE2RjUxRjEsIDB4MUExMTU0RjIsCisweEQxNkUyQTEyLCAweDU3RjQ1NUYzLCAweDZERjI1OEY1LCAweDExNDFEOTZDLAorMHgxMTUzMjE0MiwgMHgxMTc1MTE1MiwgMHgxMTg3MTE3NCwgMHg1MkY2MTE4NiwKKzB4MTlEMUQ2NjgsIDB4RDg2ODI5RDIsIDB4REE2OEU5NTAsIDB4MTYyMUVCQjQsCisweDZCQkMyNjIyLCAweEEwMjE0OTA4LCAweDZFRURFRTAwLCAweDYxRTM2REUzLAorMHg0MTA4NEQwOCwgMHgzMUVDM0RFQywgMHg0MTA4NEQwOCwgMHg2MEMzM0Q4QywKKzB4RTc5MDQxMDgsIDB4ODFEMTJEQzEsIDB4NDEwODYwOTMsIDB4ODFEMjY3N0MsCisweDMxQUM2MEMzLCAweDM0NzJFMjAwLCAweDFERDI4MUQzLCAweEQ0NTUxRDEzLAorMHgxRDI0OEQwMSwgMHhCMDNBRDQ1MCwgMHg3RTAxNjVEMywgMHgzNEIyNjRFRCwKKzB4RDE0RDhCREIsIDB4NjUxMkRCNTIsIDB4NDUyOUQyNEQsIDB4NjQxMjFCNTEsCisweDY3NEREMTRBLCAweDY3MjIyQjcyLCAweDQ3MjlENjRFLCAweDY5MjIxQjczLAorMHg2ODlEMkZEMiwgMHg2OTEyMUI4MiwgMHg1QTEyMjY5MiwgMHg1QjE0MTZBMiwKKzB4MTZCNERBNDQsIDB4MTZDNjVDMTYsIDB4MTZFQTZFQTIsIDB4NEYyNjdGMUMsCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLAorMHg2MDYxNjY0MiwgMHg4RDA0QzgwMywgMHg2MDYxRTUwMCwgMHg4ODAyQzkwMywKKzB4NTI2MjhCMDMsIDB4NTEyNDY1NjMsIDB4MDAwQjI0MTIsIDB4MkZENjYwNTMsCisweDRGMjIyRkU2LCAweDZFNTM3RkVDLCAweEU1NTA2MjUzLCAweEU0MDA2RDQzLAorMHhBMDAxNDUwOCwgMHg1MjI0RTEwMSwgMHgyMjExNjA0MywgMHg4MTIzODEyMSwKKzB4ODEyMjYwNTMsIDB4MzYyMDU2RTIsIDB4RDIyRjhCRjUsIDB4NjRGMzE2RTQsCisweDQyMEJFNjE0LCAweDY1RTE2NUUzLCAweDI1NDlFNEZDLCAweDYxRjEyRTUxLAorMHgyMTQ5NjVGMywgMHg1NEQxMkYxMSwgMHg0MTBCRDEyNywgMHg1N0QxRTYxNCwKKzB4Q0IwMTYwNzEsIDB4MURFMTI3MDEsIDB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsCisweDJGRDY2REY2LCAweDRGMjIyRkU2LCAweDZFNTM3RkVDLCAweEU1RkM2NjUzLAorMHg2MDYxNkQ0MywgMHhDQjAxMjA1OSwgMHg1MkUyMjYwMSwgMHg4QjA2MzI2MCwKKzB4NTFFMjEyRTQsIDB4OEIwNDMxRTAsIDB4QTAwMjUyRDEsIDB4QUZGMDFFMjIsCisweEQyMTU1NjY0LCAweEU2MTQ2NEYzLCAweDY1RTM0MjBCLCAweEUxRkM2N0UxLAorMHgyRTcxMjcxOSwgMHg1NEQxNjdGMSwgMHhEMTBGMjcxOSwgMHhFNjE0NjVGMywKKzB4MkY3MTQxMEIsIDB4NjAyMTUyRDEsIDB4MjIwMUNCMDEsIDB4N0YxNDFERTEsCisweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDAwMjAyOEJDLCAweDAwMjAyOEM0LAorMHgwMDIwMjhCNCwgMHgwMDIwMjhFNCwgMHgwMDEwMDA4QywgMHgwMDEwMEVDMCwKKzB4MDAxRTIxMDgsIDB4MDAxQzNEMDAsIDB4MDAyMDIxOTQsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweEQ2MzE0RjIyLCAweDYwRDM2RDYyLCAweDg5NERDODAzLAorMHhEQjMwREMyRiwgMHgwMDA5QTAyQywgMHhDOTAzNjA2MSwgMHg4OTJCODgwMSwKKzB4RDIyREQ0MkIsIDB4MDAwOTQyMEIsIDB4NjUwMzU2MDMsIDB4QzgyMDg1NjEsCisweEUwNTA4OTAzLCAweDcyMDEwMkJFLCAweDg1NjIwQjI2LCAweDQwMDA2MDBELAorMHg0MDAwMzY2QSwgMHg0MDAwNDYyNCwgMHgyMDZENDYyNCwgMHhENDIzQzkwMywKKzB4NDAwODZFMDMsIDB4RDEyMjQwMDAsIDB4MzQwQzQxMEIsIDB4NjFFM0Q1MjEsCisweEQ3MjFFMDAxLCAweDQ1MEJEMjIxLCAweDY0RTM3RTMwLCAweDI3MDI0MjBCLAorMHg2NkMyNTJDMSwgMHg4QkNGMzYyMCwgMHg0RTE4RUUwMSwgMHhBMDExREIxQywKKzB4NjA2MUVDNzUsIDB4ODgwMUM5MDMsIDB4RDQxOTg5MTAsIDB4NDYwQkQ2MTIsCisweEQ0MTgwMDA5LCAweDQ3MEJENzE4LCAweEQyMTM2NTAzLCAweDY0QzNEMTEzLAorMHgyMkUyNDEwQiwgMHg2NkIyNTJCMSwgMHg4QkVBMzYyMCwgMHhDODA0NjBEMywKKzB4RDIxMjg5MDYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDAwMUUyMTAwLAorMHgwMDIwMjhCQywgMHgwMDIwMjg1OCwgMHgwMDIwMEFFMCwgMHgwMDIwMjhDNCwKKzB4MDAyMDBCNjIsIDB4MDAyMDIwMzQsIDB4MDAxQzNEMzAsIDB4MDAyMDBERjAsCisweDAwMjAyOEI0LCAweDAwMjAyOEU0LCAweDAwMjAwQUZFLCAweDAwMjAwMEY4LAorMHhFNjAxRDIzNywgMHgxMjY1RDUzNywgMHgwMDBCMjI1MiwgMHhENjM2MTI2NiwKKzB4ODgwMTYwNjIsIDB4RTEwMThCNjIsIDB4RDUzNDI2MTIsIDB4NTQ1MUQxMzQsCisweEUwNDA2MjEyLCAweDIxMjIzMjRDLCAweDU0MTE1NzUyLCAweDExNDEzNDdDLAorMHg1NzEyNTQ1MywgMHgxMTcyMzc0QywgMHg1MjEzNTc1NSwgMHgxMTIzMzI3QywKKzB4NTYxNDY0NTIsIDB4MTE2NDM2NEMsIDB4NTQxNTU3NTQsIDB4MTE0NTM0N0MsCisweDU2MTY1NDU4LCAweDExNjYzNjRDLCAweDY3NjJENjI2LCAweDMyN0M1MjE3LAorMHg1NzYxMTEyNywgMHgzMjdDNTIxOCwgMHg1NzYyMTEyOCwgMHgzMjdDNTIxOSwKKzB4NTc2MzExMjksIDB4MzQ3QzU0MUEsIDB4NTc2NDExNEEsIDB4MzQ3QzU0MUIsCisweDU3NjUxMTRCLCAweDM0N0M1NDFDLCAweDUyNjYxMTRDLCAweDM3MkM1NzFELAorMHg1MjY3MTE3RCwgMHgzNDJDNTQxRSwgMHg1MjY4MTE0RSwgMHgzNjJDNTYxRiwKKzB4RDYxNTExNkYsIDB4MDQxRTYyNjIsIDB4MzQyQzc2OTQsIDB4RTA0NDAxNDYsCisweDA2MUU2MjYyLCAweDAxNjYzNjJDLCAweDUyNUNFMDQ4LCAweEQ2MEYwNTFFLAorMHgwMTU2MzUyQywgMHhFMDU0NjI2MiwgMHg0MjI5MDUxRSwgMHgwMTU2MzUyQywKKzB4RTA1ODU1NjEsIDB4NDUyOTA2MUUsIDB4MDE2NjM2NUMsIDB4MDAwOTAwMEIsCisweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMUMxMDI4LCAweDAwMUMzNjlDLAorMHgwMDIwMjg1OCwgMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwKKzB4RDYyRjdGRkMsIDB4MjY0MjY0NEMsIDB4QzgyMDUwNjYsIDB4MkYwMjhERkMsCisweDdGMDQwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZENDM2QzUzLAorMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwgMHg2NDRDQkZFQSwgMHg4QkY5M0VDMiwKKzB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4QTAwMTZDRjYsIDB4NzYwMTY2NDMsCisweDIyMjg2MjYwLCAweDM2NDg4QkZCLCAweDY1NjNBRkU0LCAweDJGQjYyRjk2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFQzFDRUQwOCwgMHhEQjE5NkU1MywKKzB4NjFDM0U5MEEsIDB4NjA0MzRCMEIsIDB4MzA5MkM5MEYsIDB4NjYwMzhEMDIsCisweDc2MzBBMDAxLCAweDREMTA3NjM3LCAweDdFMDEyRTYwLCAweDdDRkM4RkYxLAorMHg4MDU4RTAwMCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHgwMDBCNkJGNiwKKzB4MDAwQjY5RjYsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDAsIDB4N0ZFQzRGMjIsCisweDZFNDM2MjUzLCAweEJGRDE2NUYzLCAweEJGQzY2NDIzLCAweEJGQzQ2NEUzLAorMHhENDA1NjRGMywgMHgwMDA5QkZDMSwgMHg0RjI2N0YxNCwgMHg2RUY2MDAwQiwKKzB4MDAxQzAwMDQsIDB4MDAyMDIwRjQsIDB4MDAyMDI5Q0MsIDB4RTExMEQ1OUMsCisweEU2NDA2MDUwLCAweDI1MDBDOUZELCAweEUwRkY3NUU5LCAweDgwNTE2NDUzLAorMHg4MDUzODA1MiwgMHg4MDU2ODA1NSwgMHgyNTEwNzVFRiwgMHhFMUVGNjI1MCwKKzB4MjIxOUUwMDEsIDB4RTcyMDI1MjAsIDB4MjQ2MDgwNTIsIDB4MjU3MDAwMEIsCisweEU0RkRENTkwLCAweEU3MDI2MTUyLCAweDI1MTIyMTQ5LCAweDc0MDE2MDUyLAorMHgyNTAyQ0IwMSwgMHhEMThDNjY1MiwgMHgyNTYyMjY0OSwgMHg5MkMyNjAxMiwKKzB4MjEwMkNCMDgsIDB4QzlDRjYwMTIsIDB4NjAxMjIxMDIsIDB4MjEwMkNCMDMsCisweDAwMEIxMTcyLCAweDRGMjIxMTIzLCAweEUxMDBENDg0LCAweEQyODVENzg0LAorMHhENTg1MjQxMCwgMHgyNzExRDQ4NSwgMHgyMjExRTcwMCwgMHhCRkJEMjUxMSwKKzB4RDU4MzI0NzEsIDB4MjU2MEU2MDAsIDB4NEYyNkFGRDIsIDB4RDI4MTY2NEMsCisweDM2MkM0NjAwLCAweENCMTA2MDYwLCAweDI2MDAwMDBCLCAweEQyN0Q2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUVGNjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyNzksIDB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjc1LCAweDY2NTAzNTJDLCAweDI2MTlFMUVGLCAweDI1NjAwMDBCLAorMHhEMjcwNjY0QywgMHgzNjJDNDYwMCwgMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwKKzB4RDI2QzY1NEMsIDB4MzUyQzQ1MDAsIDB4RTFGNzY2NTAsIDB4MDAwQjI2MTksCisweDY2NEMyNTYwLCAweDQ2MDBEMjY4LCAweDYwNjAzNjJDLCAweDAwMEJDQjA4LAorMHg2NTRDMjYwMCwgMHg0NTAwRDI2NCwgMHg2NjUwMzUyQywgMHgyNjE5RTFGNywKKzB4MjU2MDAwMEIsIDB4RDY1RjYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsCisweDQwMjE0MDIxLCAweDAwMEI0MDIxLCAweDYyNEM2MDBDLCAweDQyMDBENjVBLAorMHg2MDIwMzI2QywgMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwKKzB4RDE1NjY0NEMsIDB4MzQxQzc0RkYsIDB4MDAwQjYyNDAsIDB4RDE1NDYwMkMsCisweDM0MUM2NDRDLCAweDAwMEI2MjQwLCAweDJGRTY2MDJDLCAweDY1NUM0RjIyLAorMHgzNTY3RTYwQSwgMHg2RTQzOEQxNSwgMHg2NDUzQkZFQSwgMHg2MEVDNjQwQywKKzB4OEIwMjg4MDEsIDB4QTAwMkUwMEYsIDB4NDQwOTI0MDksIDB4NjI0QzQ0MDksCisweDMyNjNFNjBBLCAweEJGRTI4OTA1LCAweDYyMEM2NDRDLCAweEM4ODA2MDIzLAorMHhFMjAwOEIwMCwgMHg0RjI2NjAyMywgMHg2RUY2MDAwQiwgMHhENjQxNEYyMiwKKzB4ODgwMTYwNjIsIDB4QjIyMjhCMDMsIDB4QTAwMzAwMDksIDB4RDIzRTAwMDksCisweDIyNjBFNjQwLCAweEUyMDBENjNELCAweDAwMEI0RjI2LCAweDRGMjIyNjIyLAorMHg2MDYyRDYzOCwgMHg4QjAxODgwMiwgMHgwMDA5QjI2QywgMHhFMjAwRDYzNywKKzB4MDAwQjRGMjYsIDB4MEZGRjI2MjIsIDB4RDQzM0Q1MzIsIDB4RTcwMUUxMDAsCisweDAwMEIyNTEyLCAweEQyMzAyNDcwLCAweDAwMEJFNjA0LCAweEQ1MjAyMjYwLAorMHg2MTUwRTRGRCwgMHgyMTQ5RDYyRSwgMHgyNTEwRTcwMCwgMHgyNjcwMDAwQiwKKzB4RTRGQkQ1MUIsIDB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RTRGN0Q1MTgsCisweDIyNDk2MjUwLCAweDI1MjAwMDBCLCAweEQyMjY0RjIyLCAweDYwMEQ4NTIyLAorMHg4OTExMjAwOCwgMHg4OTEzODgwMSwgMHg4OTE1ODgwMywgMHg4OTE3ODgwNSwKKzB4ODk0MTg4MDYsIDB4ODk0Nzg4MDgsIDB4ODk0RDg4MDksIDB4ODk1Mzg4MEEsCisweDg5NTk4ODBCLCAweDAwMDlBMDYwLCAweDAwMDlCMDYyLCAweDYwMENBMDVELAorMHgwMDA5QjA3MCwgMHg2MDBDQTA1OSwgMHgwMDA5QjA3QSwgMHg2MDBDQTA1NSwKKzB4NjI2MEQ2MDYsIDB4OEI0RjIyMjgsIDB4MDAwOUIwODYsIDB4NjAwQ0EwNEQsCisweDAwMUUxMDI4LCAweDAwMUUyMTQ4LCAweDAwMUUxMTA4LCAweDAwMjAyOTNELAorMHgwMDIwMjkyQywgMHgwMDIwMjkyRSwgMHgwMDIwMjkzMCwgMHgwMDIwMjkxMCwKKzB4MDAxRTEwMDgsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMzAsCisweDAwMUUxMDkwLCAweDAwMjAyOTM4LCAweDAwMUUxMDBCLCAweDAwMjAyOTM0LAorMHgwMDIwMjkzQywgMHgwMDIwMjkwNCwgMHg2MjYwRDY4NywgMHg4QjIzMjIyOCwKKzB4MDAwOUIwNkEsIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2ODMsIDB4OEIxQjIyMjgsCisweDAwMDlCMEI0LCAweDYwMENBMDE5LCAweDYyNjBENjdGLCAweDhCMTMyMjI4LAorMHgwMDA5QjBCQSwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3QiwgMHg4QjBCMjIyOCwKKzB4MDAwOUIxMUUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzcsIDB4OEIwMzIyMjgsCisweDAwMDlCMTM2LCAweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLAorMHhEMjczRDE3MiwgMHhENTczODQxMiwgMHg0MDAwQzkwRiwgMHhENzcyMDEyRCwKKzB4NjExQ0U0MDMsIDB4RDY3MUUyMEYsIDB4MjcxMjI1NDAsIDB4RTAwMTI1MjAsCisweDI2MDIwMDBCLCAweEU2MDFEMjY5LCAweDMwNjY4NTIzLCAweEUwMDA4RDA2LAorMHhFMDAwRDI2NywgMHg4MTIyRDY2OSwgMHgyNjAyRTAwMSwgMHgwMDA5MDAwQiwKKzB4ODUyM0QyNjIsIDB4MjAwODYwMEQsIDB4ODgwMTg5MDUsIDB4RDY2NDhCMEEsCisweENCMDE2MDYwLCAweEQ2NjEyNjAwLCAweEUxMDFENDVELCAweDI2MTJFMDAxLAorMHg4MTQyMDAwQiwgMHhFMDAwMDAwQiwgMHhFNTAxRDE1OCwgMHg0NTE4ODUxMywKKzB4MzQ1MzY0MEQsIDB4OEQwNTY2MDMsIDB4RDI1QUUwMDAsIDB4RTAwMUQ1NTcsCisweDI1MDIyMjYwLCAweDAwMDkwMDBCLCAweEQxNTA0RjIyLCAweDY1MEQ4NTEzLAorMHg0NDE5NjQ1MywgMHg2NzJFNjI0OSwgMHg2MDJDMjI3RCwgMHg4OTA5ODgwMSwKKzB4ODkwQzg4MDIsIDB4ODkxMDg4MDMsIDB4ODkyNjg4MDYsIDB4ODkyOTg4MDcsCisweDAwMDlBMDM4LCAweEQ2NERENTRDLCAweEEwMjdFMjEyLCAweDYyNUMyNjUyLAorMHg4QjJGMjIyOCwgMHhBMDFFRDY0QSwgMHg2MDVDNjI2MiwgMHg4OTA1MjAwOCwKKzB4ODkwODg4MTAsIDB4ODkwQjg4MjAsIDB4MDAwOUEwMjQsIDB4RDY0M0Q0NDUsCisweEEwMTNFMjA0LCAweEQ3NDQyNjQyLCAweEUyMENENjQwLCAweDI2NzJBMDBFLAorMHhENjNFRDU0MiwgMHhBMDA5RTIxOCwgMHhENDQxMjY1MiwgMHhFMjBBRDYzQiwKKzB4MjY0MkEwMDQsIDB4RDYzOUQyM0YsIDB4RTIyRTI2MjIsIDB4RDQzRTg1MTUsCisweDMyNzc2NzBELCAweDhGMDEyNDIxLCAweDI0NTE2NTAzLCAweDAwMDlCMERGLAorMHhFMDAxQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwgMHhFMTAxRDYyOSwKKzB4MjYxMEQ0MzYsIDB4RDcyODY1NDEsIDB4NjU1REQxMjgsIDB4RTAwMUUyMEYsCisweDI2MjAyNzUyLCAweDIxMDIwMDBCLCAweDRGMjIyRkU2LCAweDg1MjNEMjFGLAorMHgyNDQ4NjQwQywgMHhENjJEOEIwOCwgMHhFMjAwRDUyMSwgMHg4NDUxMjYyMSwKKzB4MjA0OTk0MzAsIDB4ODA1MUEwMjYsIDB4NjBFMERFMUQsIDB4OEQwQkM4NDAsCisweDM0MjdFMjAxLCAweEQxMjU4OTIyLCAweDQyMEJEMjI1LCAweEQ1MjUyMTQxLAorMHhDQjA0NjA1MiwgMHgyNTAyQTAwQiwgMHg4OTE3MzQyNywgMHhENzIyRDIxRiwKKzB4MjI0MTQ3MEIsIDB4RTVGQkQ2MUYsIDB4MjE1OTYxNjIsIDB4ODRFMTI2MTIsCisweEIxMkRDQjgwLCAweDYwRTA4MEUxLCAweENCMDRENjFDLCAweDYwNjAyRTAwLAorMHgyNjAwQzkzRiwgMHhFMDAxRDYwOSwgMHgyNjAyQTAwMSwgMHg0RjI2RTAwMCwKKzB4NkVGNjAwMEIsIDB4MDAwMEZGN0YsIDB4MDAyMDI5M0QsIDB4MDAyMDI5MDQsCisweDAwMjAyOTEwLCAweDAwMUUxMTAwLCAweDAwMUUxMDBDLCAweDAwMjAyOTM0LAorMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwgMHgwMDIwMkFGNCwgMHgwMDIwMjkxOCwKKzB4MDAyMDI5MjAsIDB4MDAyMDJCNjIsIDB4MDAyMDJCNjYsIDB4MDAyMDJCNzIsCisweDAwMjAyQjhBLCAweDAwMjAyQjk0LCAweDAwMjAyOTFDLCAweDAwMjAyOTJBLAorMHgwMDIwMUFCNiwgMHgwMDFFMTEwOCwgMHgwMDIwMUJDMiwgMHgwMDFFMTAxNSwKKzB4NjA2MEQ2OTYsIDB4ODkxOUM4ODAsIDB4NjAyMUQyOTUsIDB4OEIxNTg4MDEsCisweEU1MDFEMjk0LCAweDMwNTY4NTI0LCAweEQxOTM4OTEwLCAweEQ0OTNFMjAzLAorMHg2NTQxMjEyMCwgMHg2NTVERTAwQiwgMHhENTkxMDY1NiwgMHhFNzAyRTQwRiwKKzB4MjU3MTIxNDAsIDB4RTAwMUQ3OEYsIDB4MjcwMjAwMEIsIDB4RTAwMDAwMEIsCisweDRGMjIyRkU2LCAweDg0RTFERThDLCAweDg5MzRDODgwLCAweDg1NTRENTg1LAorMHg4RjMwMjAwOCwgMHhENzg5NjEwMywgMHg2NjcyODU1MywgMHg2NTBDNjQwMywKKzB4NjIwQzg1NjYsIDB4OEIyNjM1MjAsIDB4RDc4MEQ2ODUsIDB4NjQ0QzY1MUMsCisweDI3NDEyNjUxLCAweEM4NDA2MEUwLCAweEQyODI4OTA3LCAweDAwMDk0MjBCLAorMHg2MDYyRDY4MSwgMHhBMDA4Q0IwNCwgMHhEMTgwMjYwMiwgMHgwMDA5NDEwQiwKKzB4RTVGQkQ2N0QsIDB4MjQ1OTY0NjIsIDB4QjBBMTI2NDIsIDB4RDU3NTAwMDksCisweDI1MjJFMjAxLCAweEQ3N0E2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDcwLAorMHhBMDAxMjcwMCwgMHhFMDAwNjAyMywgMHgwMDBCNEYyNiwgMHgyRkE2NkVGNiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4RTI0MERBNjksIDB4REM2NjY2QTEsCisweDMxMjM2MTZELCAweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LAorMHg0RTIxMkE2MSwgMHhEQjZDRDQ2QiwgMHhFNzAwQTAwRiwgMHg3NzAxNjZCMiwKKzB4NzEwMjYxNjMsIDB4NjU2MTJCMTIsIDB4NzEwMjY2MTMsIDB4NjI2MTJCMTIsCisweDYyMkQ2NTVELCAweDMyNUM0MjI4LCAweDYyN0MyNDIyLCAweDhCRUQzMkUzLAorMHhDOTAzNjBEMywgMHg4QjEwODgwMywgMHhFRDA3NkVCMiwgMHg3MTAyNjFFMywKKzB4NjcxMzJCMTIsIDB4NjJFMTcxMDIsIDB4NjU3MTJCMTIsIDB4NjU1RDYyMkQsCisweDM1MkM0NTI4LCAweEEwMEMyQ0QwLCAweDg4MDIyNDUyLCAweEEwMDM4QjAxLAorMHg4ODAxRTIwMywgMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NzdENjc2MSwKKzB4RUIwRjI0NzIsIDB4NkRBMTJDQjAsIDB4OEIwNTJERDgsIDB4RDQ0NUQyNEYsCisweEUxMDFFRTAwLCAweDI0MTIyMkUyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2QUY2MDAwQiwgMHgyRkU2MkZENiwgMHhFMjQwREQzRCwgMHg2MTZENjZEMSwKKzB4ODkwMDMxMjMsIDB4NjcyQzYyNjMsIDB4REU0MzM2NzgsIDB4MkQ2MTc3MDMsCisweEQ2NDA0NzIxLCAweDQ3MjE2NEUyLCAweEUxMDBBMDBFLCAweDcxMDE2NTYyLAorMHgyNDUwNjI1MywgMHg0MjE5NzQwMSwgMHg3NDAxMjQyMCwgMHgyNDUwNDUyOSwKKzB4NDUxOTc0MDEsIDB4NzQwMTI0NTAsIDB4MzI3MzYyMUMsIDB4NDIwMDhCRUUsCisweDY0RDE2NkUyLCAweDM2MkM0MjAwLCAweDhGMDYyNDQ4LCAweEREMzMyRTYyLAorMHhFNTAwREUyOCwgMHgyRDUyRTcwMSwgMHg2RUY2MkU3MiwgMHg2REY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4RUUwMTRGMjIsIDB4RUQwQUEwMDUsIDB4NjRFM0JDQjYsCisweDY0RTNCQ0JDLCAweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweEVFMDFBMDA1LAorMHg2NEUzQkNCRCwgMHg2NEUzQkNDMywgMHg2MkVDN0UwMSwgMHg4QkY3MzJENywKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDYwNjBENjFGLCAweDg5NzU4ODAxLCAweEUxMDFENDFFLCAweEQ3MTI4NTQ4LAorMHg2NTBEMjYxMCwgMHg0NTE5NjA3MCwgMHg2NjU5REQxQiwgMHg2MUQzNjI2RSwKKzB4Qzg0MDI2MkQsIDB4NzQwMjcxMDIsIDB4OEQ0N0Q3MTgsIDB4RDIxODY2NkMsCisweEU1MDFERTBBLCAweEEwMzEyRTIyLCAweDAwMDBFRTA0LCAweDAwMUUxMDAxLAorMHgwMDIwMjkyQSwgMHgwMDIwMjkwNCwgMHgwMDFFMTEwMCwgMHgwMDIwMjkyRSwKKzB4MDAyMDI5MUMsIDB4MDAyMDI5MzQsIDB4MDAxRTEwMDAsIDB4MDAyMDI5MjAsCisweDAwMjAyOTJDLCAweDAwMjAxQUI2LCAweDAwMUUxMTA4LCAweDAwMjAxQkMyLAorMHgwMDFFMTAxNSwgMHgwMDFFMTAwQywgMHgwMDIwMjkxOCwgMHgwMDIwMjkzOCwKKzB4MDAyMDI5M0MsIDB4MDAyMDJBRjQsIDB4MDAyMDJCOEEsIDB4MDAyMDJCOTYsCisweDAwMjAyQjA2LCAweDc1MDE2MjQ1LCAweDcxMDIyMTIxLCAweDMyRTM2MjVDLAorMHg2MDYzOEJGOCwgMHhFNjAxODFENCwgMHhFNDE3RDUzOCwgMHgzMjQzNjI2QywKKzB4NjI1NTg5MUUsIDB4MjcyMTc2MDEsIDB4NzcwMkFGRjgsIDB4REUzNUQyMzQsCisweDJFMjJFNTAxLCAweEVFMDRBMDA0LCAweDc1MDE2MjQ1LCAweDcxMDIyMTIxLAorMHgzMkUzNjI1QywgMHg2MDYzOEJGOCwgMHhFNjAxODFENCwgMHhBMDA0RDUyRSwKKzB4NjI1NUU0MTcsIDB4MjcyMTc2MDEsIDB4NjI2Qzc3MDIsIDB4OEJGODMyNDMsCisweDJEMjE5MjRCLCAweEQ3MkFENDI5LCAweDJGMTI2MTQyLCAweDZERjI2NUYyLAorMHhDOTgwNjA1MywgMHg2MDUzMjcwMCwgMHg2MTAzQzk2MCwgMHg2MDUzODA3MSwKKzB4NjVGMjZFRjIsIDB4NEQxOUM5MDMsIDB4ODA3MjQ1MjksIDB4NDUxOTYwREMsCisweDRFMjk4MTcyLCAweDYyRUM2MDVDLCAweDMwMkM0MDE4LCAweDZENDI4MTczLAorMHgyRkQyMjExOCwgMHg2MkYyNkVGMiwgMHg0MjE5NjZGMiwgMHg2NTZDNDYyOSwKKzB4NjAyQzY2RjIsIDB4NDAxODY0RUMsIDB4MzA0QzQ2MjksIDB4ODE3NDQ2MTksCisweDQwMTg2MDZDLCAweDhGMDczMDVDLCAweEJDQjU4MTc1LCAweDYyMEMwMDA5LAorMHg4OTA4MjIyOCwgMHgwMDA5QTAwQSwgMHg4ODQwNjAxMywgMHhCMDBBOEIwMywKKzB4QTAwMzAwMDksIDB4RDYwQjAwMDksIDB4MjYyMkUyMDIsIDB4NEYyNjdGMDQsCisweDAwMEI2RUY2LCAweDAwMEI2REY2LCAweDA2MEEwMDA5LCAweDAwMjAyQjM2LAorMHgwMDIwMkIzNCwgMHgwMDIwMjkyMCwgMHgwMDIwMkIwOCwgMHgwMDFFMTAwQywKKzB4MDAyMDI5MDQsIDB4MDAyMDI5MzQsIDB4N0ZGQzRGMjIsIDB4NjYyMEQyN0UsCisweDhEMDgyNjY4LCAweEQ0N0QyRjYwLCAweDQyMEJEMjdELCAweDY0RjAwMDA5LAorMHhBMDkwN0YwNCwgMHg3RjA0NEYyNiwgMHgwMDBCNEYyNiwgMHgwMDBCMDAwOSwKKzB4MkZFNjAwMDksIDB4REU3NzRGMjIsIDB4NjBFMEQ2NzcsIDB4Q0JDMEQ0NzcsCisweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LCAweDcwMDE0MDIxLAorMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjcxNjE2RCwgMHhFNTAwQTAwNCwKKzB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsIDB4RDE2RDhCRjgsCisweDAwMDk0MTBCLCAweEU0MDFENjZDLCAweDg0RTIyNjQxLCAweDgwRTJDOUJGLAorMHgwMDBCNEYyNiwgMHgyRkU2NkVGNiwgMHhENTY4N0ZGQywgMHg2MjUwREU2MSwKKzB4NjQyQzg0RTIsIDB4Q0I0MDc0MDQsIDB4ODBFMjYxNEQsIDB4NDQyMTY0MTMsCisweEQ3NjM0NDIxLCAweEU2MDBBMDA0LCAweDc2MDE2MjU2LCAweDI3MjIyRjIyLAorMHgzMjQzNjI2RCwgMHg2MDEzOEJGOCwgMHgyMDA4QzkwMywgMHg4ODAzODkxMiwKKzB4ODgwMjg5MDUsIDB4ODgwMTg5MDYsIDB4QTAwODg5MDcsIDB4RTAwNzAwMDksCisweDgwNzhBMDA1LCAweEEwMDJFMDAzLCAweEUwMDE4MDc4LCAweDYyNTI4MDc4LAorMHgyNzIyMkYyMiwgMHhENjUwRTAwRiwgMHg2MDYxODA3OCwgMHg4QjAxODgwMSwKKzB4MjYyMUUyMDAsIDB4NjA2MEQ2NEYsIDB4MjYwMENCMDgsIDB4QzkzRjYwRTAsCisweDdGMDQyRTAwLCAweDZFRjYwMDBCLCAweDYwMjFEMjQ3LCAweDhEMTg4ODAxLAorMHhEMjQ2NjE0MywgMHgyMjEwNjA1MywgMHg2MDYzODAyMSwgMHhENDQ2ODEyMSwKKzB4RTUwMEEwMDcsIDB4MDI3QzYwNUQsIDB4MzY0QzY2MDMsIDB4MjYyMDcwMDEsCisweDYyNUQ2NTAzLCAweDMyMTM2MTFDLCAweEQ2NDA4QkY0LCAweEM5QkY2MDYwLAorMHgwMDBCMjYwMCwgMHgyRkQ2MDAwOSwgMHg0RjIyMkZFNiwgMHg2MDQzN0ZGQywKKzB4OEQwMkM4MjAsIDB4QkY2QTZFNDMsIDB4NjBFMzAwMDksIDB4ODkwMUM4MTAsCisweDAwMDlCRjY3LCAweEM4NDA2MEUzLCAweEJGOEM4OTAxLCAweDYwRTMwMDA5LAorMHg4OTI5QzgwMSwgMHg2MEQwREQzMiwgMHg4RDAzQzgwMiwgMHhENjMxMkYwMCwKKzB4MDAwOTQ2MEIsIDB4QzgwNDYwRjAsIDB4RDYyRjg5MDIsIDB4MDAwOTQ2MEIsCisweDYwMjM2MkYwLCAweDg5MDJDODgwLCAweEM5N0Y2MEQwLCAweDYwMjMyRDAwLAorMHg4OTAyQzgwMSwgMHg0MjBCRDIyOSwgMHhENTI5MDAwOSwgMHg4ODAyNjA1MiwKKzB4RDIyODhCMDMsIDB4QTAwNUU2MDQsIDB4ODgwMTIyNjAsIDB4RDIyNThCMDIsCisweDIyNjBFNjAxLCAweDI1MjJFMjAwLCAweEM4ODA2MEUzLCAweEQyMjI4OTE2LAorMHg2MEUzNkUyMCwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMCwgMHg2MEUzMDAwOSwKKzB4ODkwMkM4MDQsIDB4NDIwQkQyMUUsIDB4NjBFMzAwMDksIDB4ODkwNUM4MDgsCisweDdGMDREMjFDLCAweDZFRjY0RjI2LCAweDZERjY0MjJCLCAweDRGMjY3RjA0LAorMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDFFMTAyMCwgMHgwMDIwMjlEMCwKKzB4MDAyMDBFMkEsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTdEMDAsCisweDAwMUUxMEZDLCAweDAwMjAwMEY4LCAweDAwMjAyOTMwLCAweDAwMTE3RDgwLAorMHgwMDFFMTBGOCwgMHgwMDFFMTBBRSwgMHgwMDExN0Q4NCwgMHgwMDFFMTAxNywKKzB4MDAxRTEwMjEsIDB4MDAyMDEwNUMsIDB4MDAyMDEwN0UsIDB4MDAyMDE2MDgsCisweDAwMjAyOTM0LCAweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxMEFFLAorMHgwMDIwMTBDMCwgMHgwMDIwMTBDQywgMHhENkE4NjQ0QywgMHgzNDZDNzRGRiwKKzB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTYsIDB4MDAwQjM0NkMsIDB4RDZBNTI0NTAsCisweDM0NkM2NDRDLCAweDI0NTAwMDBCLCAweDYxNkQ2MjVDLCAweDQxMTk0MjA4LAorMHg2MDE5NDIwOCwgMHg2NDRDNDIwMCwgMHgzMjRDNjcwRSwgMHgyMDdERDE5RSwKKzB4QzkwRjQyMDAsIDB4MDAwQjMyMUMsIDB4Njc2MzIyMDAsIDB4NDIwODYyNUMsCisweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBEMTk4LCAweDAwMEIzMjFDLAorMHgyRkU2MjI3MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywKKzB4MjcyOUUyOUYsIDB4NjU3MzZFNTMsIDB4NDcxOTY3NkQsIDB4NjcyRTYyNzksCisweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LAorMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwRTFBMDQ2NywgMHgyMTUwMjVFQiwKKzB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsCisweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLAorMHhFNTBGOEI3MywgMHhFNDAxQkZBMCwgMHhCRkEzRTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGQTMsIDB4QkZBMEU0MDEsIDB4RTYwMkU1MDYsCisweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlFLCAweEU0MDE4NUYyLAorMHhCRkFBNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwKKzB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGN0UsIDB4QkY4MUU0MDIsCisweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgxLCAweDQ2MThFNjAyLAorMHg4MUY2NjA2MywgMHhCRjdGRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwKKzB4RTUwMEJGOEIsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsCisweEUwMTA2NTVDLCAweEJGNUZFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYyLAorMHgwNUZDRTAxMCwgMHhCRjYyRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjYzRTQwMywKKzB4RTUwMEU2NDAsIDB4QkY3MEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsCisweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDVFNDA0LCAweEU0MEYwRjU0LAorMHhFNTA0QkY0OCwgMHgwNUZDRTAxNCwgMHhCRjQ4RTQwRiwgMHhFNTAxNzU4NCwKKzB4QkY0OUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1NkU2NDAsIDB4RTUwMUU0MDQsCisweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LAorMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwKKzB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksCisweEU0MDFCRjFBLCAweEJGMURFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkYxRCwgMHhCRjFBRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFCNjU0MywKKzB4RTQwMUU2NDAsIDB4QkYyODY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsCisweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkQ2MDUzLCAweEU0MDI4MEY0LAorMHhFNTEyQkYwMCwgMHhFNDAyODRGNCwgMHhCRjAwNzA5MCwgMHhFNjQwNjUwMywKKzB4QkYwMUU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRUU0MDIsIDB4RTY0MEU1MDAsCisweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTNFNDAzLAorMHhFNTEzODBGOCwgMHhFNDBFQkVFNiwgMHhFNDBFODRGOCwgMHhCRUU2NzA4NSwKKzB4RTUwMDY1MDMsIDB4QkVFN0U2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNEU2NDAsCisweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLAorMHhCRUM5RTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDQywgMHhFNDBGODRGQywKKzB4QkVDQzcwODMsIDB4RTUwMTY1MDMsIDB4QkVDREU2NDAsIDB4RTUwMUU0MDQsCisweEJFREFFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLAorMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAzMCwKKzB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsCisweDAwMjAyOTJBLCAweDAwMjAyOTJDLCAweDAwMjAyOTJFLCAweDAwMDkwMDBCLAorMHg2NjZDRTY4MCwgMHg2NTYzRDJBMCwgMHg3NTQwRTcwMCwgMHg2NDczNDIyQiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NEMxOEVDMDEsCisweERBOUJEQjlBLCAweDY1QjI1MkIxLCAweDg5MjIzNTIwLCAweEM5MDM2MDUxLAorMHg4OTFFODgwMSwgMHhEMTk3REU5NSwgMHg2NEUzNDEwQiwgMHg4NTAzNjUwMywKKzB4NjcwRDY2QTIsIDB4REQ5NDM3NjIsIDB4RDQ5NDg5MEEsIDB4NDIwQkQyOTQsCisweEQxOTQwMDA5LCAweEU3MDFENDk0LCAweDIxNzI0RDBCLCAweDAwMDlBRkUyLAorMHg0MjBCRDI5MiwgMHhENjkyNjRFMywgMHg0RDBCRDQ5MiwgMHhBRkQ5MjZDMiwKKzB4NEYyNjAwMDksIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsCisweDdGRjQ0RjIyLCAweEU2ODE4NTQ2LCAweDg1NDcyRjAxLCAweDgxRjE2NjZDLAorMHhEMjdEODU0OCwgMHg4NTQyODFGMiwgMHg4MUYzNjdGMywgMHhFNDBDODU0MywKKzB4NjA1MzgxRjQsIDB4ODFGNTY1NjMsIDB4NzU0MDQyMEIsIDB4NEYyNjdGMEMsCisweDAwMDkwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhFMjAwN0ZFQywgMHhBMENCREI3QiwgMHg2QTEzMkYyMSwKKzB4NEEwOEQyN0EsIDB4REU3QUUwMDEsIDB4NEEwMDQyMEIsIDB4N0UzMDNBRUMsCisweDFGMDIxRkUxLCAweDY2QjJERDc3LCAweDM2MjA1MkIxLCAweEEwQjU4QjAxLAorMHg2MDYxMDAwOSwgMHg4ODAxQzkwMywgMHhBMEFGOEIwMSwgMHg4NTYxMDAwOSwKKzB4ODk3NEM4MDEsIDB4RUUxMDUxNjMsIDB4REM2Mzg1MTIsIDB4QzkwMzY2MDMsCisweDg1MTM2NDAzLCAweDQwMjE2MDBELCAweEM5M0Y0MDIxLCAweDhEMjAzMEUzLAorMHhENzY5NjUwMywgMHg2MjcwNDQwOCwgMHg0NDAwNDQwOCwgMHgyMjI4NDUwMCwKKzB4MzQ1QzhGMEMsIDB4NjA0M0QyNjUsIDB4NjI1RDA1MkQsIDB4NjAyOTQyMTksCisweDIwN0Q2NzBFLCAweDYwNUM4MUY2LCAweDgxRjhBMDBCLCAweDYwNDNEMjYwLAorMHg2ODVEMDUyRCwgMHg2MDg5NDgxOSwgMHgyMDlENjkwRSwgMHg2MDVDODFGNiwKKzB4RDc1QzgxRjgsIDB4MjIyODYyNzIsIDB4RTBGRjg5MDIsIDB4ODFGODYwMEMsCisweEVFRkY4NUY4LCAweDZFRUM2NTBELCAweDhCMEYzNUUwLCAweDRFMEJERTQ1LAorMHg1NDAzNjRCMywgMHhCRjdCRTUwMiwgMHhENDUzNjgwMywgMHg0MTBCRDE0NywKKzB4RDc1MjY1ODMsIDB4RDQ1MkU5MDEsIDB4Mjc5MkEwMjAsIDB4MjZFOUVFRkMsCisweDgxMTI2MDYzLCAweDk0NkU4NTEzLCAweDgxMTMyMDQ5LCAweDQ1MDg4NTEyLAorMHg2MjAzNjk1MywgMHhFNTA4ODVGNiwgMHg4MTEyMjAyQiwgMHg0NTE4ODUxMywKKzB4ODExMzIwOUIsIDB4RDQ0Nzg1MTQsIDB4ODExNDIwNUIsIDB4ODUxMTYxQjIsCisweDgxMTEyMEU5LCAweDYwMjE2MkIyLCAweDIyMDFDQjAxLCAweDAwMDk0QzBCLAorMHg1NkYxNjBCMiwgMHhDQjAxNTJGMiwgMHhBRjdDMkEwMiwgMHg4NTYxMjYyMiwKKzB4QzgwMkRDM0EsIDB4RDkzOEQyMjcsIDB4OEQwRkQ4MkMsIDB4NDIwQjY0QjMsCisweDY1MDMwMDA5LCAweDQ4MEI2NDkzLCAweEU4MDE1RTAzLCAweDg1RUYyQzgyLAorMHg2NTBERDYzNSwgMHg2NEQzNDYwQiwgMHgwMDA5QUY2NSwgMHgwMDA5NDIwQiwKKzB4NkUwMzU0MDMsIDB4RTUwODg1NDQsIDB4NDUxODYxMDMsIDB4MzE1MDIxNTksCisweEJGMjU4QjAzLCAweEEwMDdFNTAxLCAweDg1NDEwMDA5LCAweDYyMERENTJCLAorMHg4OTAxMjI1OCwgMHhFNTAwQkYxQywgMHg0ODBCNjQ5MywgMHhENDI4NjVFMywKKzB4RTgwMUQ2MTEsIDB4MkM4MjQ2MEIsIDB4MDAwOUFGNDUsIDB4N0IwODYyRjEsCisweDJGMjE3MjAxLCAweEVFMDM2MkYxLCAweDMxRTc2MTJELCAweEFGMkU4OTAxLAorMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RkUwMzY4RjYsIDB4MDAyMDE4QjgsIDB4MDAyMDI4RTQsCisweDAwMjAyOEVDLCAweDAwMjAwQUUwLCAweDAwMjAwRTJBLCAweDAwMjAyOEI0LAorMHgwMDIwMEI2MiwgMHgwMDFFMjEzMCwgMHgwMDIwMkFENCwgMHgwMDIwMEFGRSwKKzB4MDAxQzNEMzAsIDB4MDAyMDJBRDgsIDB4MDAyMDI4QzQsIDB4MDAyMDIwMzQsCisweDAwMUMzRDAwLCAweDAwMjAyQUU0LCAweDAwMjAyQUYwLCAweDAwMjAyOUQ0LAorMHgwMDIwMkE1NCwgMHgwMDIwMjkwMCwgMHgwMDIwMjhCQywgMHgwMDFFMjEyQywKKzB4MDAyMDJBREMsIDB4MDAyMDJBRTAsIDB4MDAyMDBFOEEsIDB4MDAwMDgwMDAsCisweDAwMjAyQUVDLCAweDRGMjIyRkU2LCAweDZFMjJEMjBELCAweEM4NDA2MEUzLAorMHgyMkUyOEQwMiwgMHgwMDA5QkU3QSwgMHg0MjE4RTI0MCwgMHg4OTAxMkUyOCwKKzB4MDAwOUJFNzYsIDB4QzgwNTYwRTMsIDB4QkVDQjg5MDEsIDB4NjBFMzAwMDksCisweDg5MDJDODAyLCAweEFFNzM0RjI2LCAweDRGMjY2RUY2LCAweDZFRjYwMDBCLAorMHgwMDFDMzUxMCwgMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwKKzB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsCisweDZDNjI1NjQ4LCAweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLAorMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwKKzB4MDAyMDIwNUUsIDB4MDAyMDIwMTQsIDB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMjg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLAorMHgwMDBCNDAyOCwgMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwKKzB4NjJGNjAwMEIsIDB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTAzLCAweDAwMEI0MDA1LCAweEM5MDE2MkY2LCAweDAwMEI0MDA1LAorMHgwMDAwNjJGNiwgMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwKKzB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsCisweDZDNjI1NjQ4LCAweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLAorMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwKKzB4MDAyMDIxMUUsIDB4MDAyMDIwRDQsIDB4MDAwQkUwMDAsIDB4NDAwMTYyRjYsCisweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDYyRjYwMDBCLAorMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDE5NDAwMSwKKzB4NjJGNjAwMEIsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsCisweDQwMjk0MDAxLCAweDYyRjYwMDBCLCAweDQwMDE0MDAxLCAweDQwMTk0MDAxLAorMHgwMDBCNDAyOSwgMHg0MDA0NjJGNiwgMHg0MDA0NDAwNCwgMHhDOTBGNDAwNCwKKzB4NjJGNjAwMEIsIDB4NDAwNDQwMDQsIDB4QzkwNzQwMDQsIDB4NjJGNjAwMEIsCisweDQwMDQ0MDA0LCAweDAwMEJDOTAzLCAweDQwMDQ2MkY2LCAweDAwMEJDOTAxLAorMHgwMDAwNjJGNiwgMHgzNjIyRTIxOCwgMHg2NzQzOEYxMiwgMHgwMDA5QTAwNCwKKzB4NzZGRjYyNTQsIDB4NzQwMTI0MjAsIDB4QzgwMzYwNTMsIDB4NjA0MzhCRjgsCisweDg5MDJDODAzLCAweDQyMkJEMjJCLCAweEQyMkIwMDA5LCAweDAwMDk0MjJCLAorMHgyRkU2NjQ3MywgMHg4RDRBMzQ1MCwgMHgyNzc4Njc2MywgMHg2MjQzODk0NywKKzB4MjI3QjIyNUIsIDB4QzkwMTYwMjMsIDB4OEQyMDM0NTIsIDB4MkVFODZFMDMsCisweDYwMjM4QjE1LCAweDhCMDhDODAzLCAweDQ3MDk2NjQzLCAweDQ3MTA2MjU2LAorMHg4RkZCMjYyMiwgMHhBMDMyNzYwNCwgMHg0NzAxMDAwOSwgMHg2MTQzNjY3MywKKzB4NDYxMDYyNTUsIDB4OEZGQjIxMjEsIDB4QTAyODcxMDIsIDB4NjY0MzAwMDksCisweDQ3MTA2MjU0LCAweDhGRkIyNjIwLCAweEEwMjA3NjAxLCAweDYxNDMwMDA5LAorMHgyRUU4MzU3QywgMHg4RjE1MzE3QywgMHg2MDIzNjY1MywgMHg4QjA3QzgwMywKKzB4NzZGQzQ3MDksIDB4NDcxMDYyNjIsIDB4MjEyNjhGRkIsIDB4MDAwOUEwMEYsCisweDY1NjM0NzAxLCAweDc1RkU2NjczLCAweDQ2MTA2MjUxLCAweDIxMjU4RkZCLAorMHgwMDA5QTAwNSwgMHg2MjYwNzZGRiwgMHg4RkZCNDcxMCwgMHg2MDQzMjEyNCwKKzB4NkVGNjAwMEIsIDB4MDAyMDIzMDYsIDB4MDAyMDI3QjIsIDB4RTIxRTJGRTYsCisweDY3NjMzNjI2LCAweDhEMUI2MTUzLCAweDNFMTA2RTQzLCAweDNFMTI4OTE2LAorMHg2NUUzODkwOCwgMHgzNjcyRTYwMCwgMHg2MjE0ODkxMCwgMHgyNTIwNzYwMSwKKzB4NzUwMUFGRjksIDB4MzE3QzY0RTMsIDB4NjUxMzM0N0MsIDB4RTYwMEEwMDQsCisweDYyNTA3NUZGLCAweDI0MjQ3NjAxLCAweDhCRjkzNjcyLCAweDYwRTNBMDExLAorMHg4OTA4MzFFMiwgMHgzMjdDNjIxMywgMHg4QjA0MzJFNiwgMHg2NTEzNjRFMywKKzB4QTAwODY2NzMsIDB4RDI4RjZFRjYsIDB4NjUxMzY0RTMsIDB4NDIyQjY2NzMsCisweDAwMEI2RUY2LCAweEUyMDQ2RUY2LCAweDY3NDMzNjIyLCAweDhGMTAzNTZDLAorMHhBMDA0MzQ2QywgMHg3NUZGMDAwOSwgMHg3NkZGNjI1MCwgMHg2MDUzMjQyNCwKKzB4OEJGOEM4MDMsIDB4QzgwMzYwNDMsIDB4QTEwNTg5MDEsIDB4QTI3NzAwMDksCisweEEyOTkwMDA5LCAweDJGQjYwMDA5LCAweDJGRDYyRkM2LCAweDdGRTQyRkU2LAorMHg2QzYzNjA0MywgMHg2NjUyMUY2MiwgMHhDOTAzNzUwNCwgMHgxRjUxNkU1MywKKzB4NDUwODY1MDMsIDB4RTFGQzZENDMsIDB4MkQxOTQ1MDAsIDB4MUY3MzI1NTgsCisweDFGNjUxRjQ0LCAweDJGRDI4RDBCLCAweDg4MDg2MDUzLCAweDg4MTA4OTIzLAorMHg4ODE4ODk1QiwgMHhBMDg5OEIwMSwgMHhBMEJEMDAwOSwgMHg2MjYzMDAwOSwKKzB4MkQyMkU2MDAsIDB4N0NGQzdEMDQsIDB4RUIxMEEwMEQsIDB4RTYwMDY0RTYsCisweDdDRjA2NUU2LCAweDYyRTI2MUU2LCAweDFENTEyRDQyLCAweDFEMjMxRDEyLAorMHg3RTA0N0QxMCwgMHgzQ0IyMUZFMSwgMHgxRjY1ODlGMCwgMHgyRkQyMUZDMiwKKzB4QTBBMTFGRTYsIDB4NjREMjFGRDQsIDB4NDQyODYyNjMsIDB4NDQyOTQ0MTgsCisweDQyMTg0NDE5LCAweDQ2MjkyNDJCLCAweDJENDI0NjE5LCAweDY1NjM3RDA0LAorMHhBMDIxN0NGRCwgMHg2N0U2RUIxMCwgMHg2MkU2N0NGMCwgMHg2NEU2NjY3MywKKzB4MjU2QjQ2MTgsIDB4MkQ1MjYxRTIsIDB4NjUyMzQ3MjksIDB4NDUxODQ3MTksCisweDQyMjkyNzVCLCAweDQyMTkxRDcxLCAweDQ3MTg2NzQzLCAweDQ0MjkyMjdCLAorMHg0NDE5NjcxMywgMHgyNDdCNDcxOCwgMHgxRDQzMUQyMiwgMHg0MTE5NDEyOSwKKzB4NjUxMzdEMTAsIDB4MUZFMTdFMDQsIDB4ODlEQzNDQjIsIDB4MUZFNjdFRkYsCisweDFGQzIxRjU1LCAweEEwNjcyRkQyLCAweDZDRjIxRkQ0LCAweDY2QzI1N0Y1LAorMHg0NjI4NjI3MywgMHg0MjI4NDYyOSwgMHgyQzYyMjYyQiwgMHg3QzA0NURGMiwKKzB4N0RGRTQ3MjksIDB4QTAxQ0VCMTAsIDB4NjVFNjVFRjEsIDB4NjZFNjYyNzMsCisweDQ3Mjg2NzUzLCAweDY3NjMyMjdCLCAweDQ1Mjk2MUU2LCAweDI1N0I0NzI4LAorMHgyQzIyNjRFNiwgMHg2NTEzMUM1MSwgMHg0NTI4NDYyOSwgMHgxQzYyMjY1QiwKKzB4NDEyOTY2NDMsIDB4MjE2QjQ2MjgsIDB4NDQyOTFDMTMsIDB4Njc0MzdDMTAsCisweDNEQjI3REYwLCAweDFGRDI4OUUxLCAweDdFRkVBMDM0LCAweDUxRjU2Q0YyLAorMHg2MjEzNjZDMiwgMHg0MjI4NDYxOCwgMHg0MjE4NDYxOSwgMHgyQzYyMjYyQiwKKzB4N0MwNDVERjIsIDB4N0RGRjQxMTksIDB4QTAxRkVCMTAsIDB4NjVFNjVFRjEsCisweDY0RTY3REYwLCAweDQyMjg2MjUzLCAweDQyMTg2N0U2LCAweDY2RTYyMTJCLAorMHg2MTQzMkMxMiwgMHg0NTE5NDEyOCwgMHgyNTFCNDExOCwgMHg2NTczMUM1MSwKKzB4NDQxOTQ1MjgsIDB4MjQ1QjQ1MTgsIDB4NjQ2MzFDNDIsIDB4NDcxOTQ0MjgsCisweDI3NEI0NDE4LCAweDQ2MTkxQzczLCAweDYxNjM3QzEwLCAweDg5REUzREIyLAorMHg3RUZEMUZEMiwgMHgxRkM0MUZFNiwgMHg1REYyRTcwNCwgMHhBMDBENUVGNiwKKzB4NjJFNDUxRjQsIDB4NjZFNDdERkMsIDB4NjVFNDY0RTQsIDB4NzEwMTIxMjAsCisweDcxMDEyMTYwLCAweDcxMDEyMTQwLCAweDcxMDEyMTUwLCAweDg5RjAzRDcyLAorMHg2NkQzNTdGMywgMHg2NDEzNjVFMywgMHg2RUY2N0YxQywgMHg2Q0Y2NkRGNiwKKzB4NkJGNkExOTAsIDB4MDAyMDIxOTQsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDYwNDM3RkU0LCAweDZDNjNDOTAzLCAweDY2MDMxRjYyLCAweDQ2MDg3NUZDLAorMHg2MTUyNkU0MywgMHg0NjAwRTJGQywgMHgyNjY4MkUyOSwgMHgxRjQ0MUY3MywKKzB4MUY1MTZENTMsIDB4OEQwQjFGMTUsIDB4NjA2MzJGRTIsIDB4ODkxRjg4MDgsCisweDg5NTM4ODEwLCAweDhCMDE4ODE4LCAweDAwMDlBMDgxLCAweDAwMDlBMEI5LAorMHhFQjEwQTAwRCwgMHg1MkQzN0RGMCwgMHg1NEQxNTZEMiwgMHgyRTE2NjVEMiwKKzB4MkU2NjJFMjYsIDB4MkU0MjdFRkMsIDB4MUZEMTYxNTMsIDB4M0NCMjdDRjAsCisweDdEMDQ4OUYwLCAweDFGMTUxRkQ2LCAweDJGRTIxRkMyLCAweDFGRTRBMEExLAorMHg2MjEzNjZFMiwgMHg0MjI5NDYxOSwgMHg0MjE5NDYxOCwgMHgyRTYyMjYyQiwKKzB4N0NGRjQxMTgsIDB4RUIxMEEwMjEsIDB4NTREMzdERjAsIDB4NjI0MzU3RDIsCisweDQyMTk0MjI5LCAweDU1RDEyMTJCLCAweDJFMTY2NkQyLCAweDQxMjk2MTczLAorMHg0MTE5NDQxOCwgMHgyRTQ2MjQxQiwgMHg0NDI5NjQ1MywgMHg0NDE5NDcxOCwKKzB4MkU3NjI3NEIsIDB4NDcyOTY3NjMsIDB4NDcxOTQ1MTgsIDB4MjU3QjdFRkMsCisweDQ2MTgyRTUyLCAweDFGRDE2MTYzLCAweDNDQjI3Q0YwLCAweDdEMDM4OURDLAorMHgxRjE1MUZENiwgMHgyRkUyMUZDMiwgMHgxRkU0QTA2QiwgMHg1N0Y1NkVGMiwKKzB4NjI3MzY2RTIsIDB4NDYyODQ2MjksIDB4MjYyQjQyMjksIDB4MkU2MjVDRjIsCisweDdDRkU0NzI4LCAweEEwMUJFQjEwLCAweDdERjA1REYxLCAweDU1RDI1MUQzLAorMHg0NjI5NjYxMywgMHg1NEQxMjc2QiwgMHgyRTc2NjJEMiwgMHg0MTI4Njc1MywKKzB4MjE3QjQ3MjksIDB4NjE0MzJFMTYsIDB4NDEyOTQ1MjgsIDB4MkU1NjI1MUIsCisweDQ0Mjg2NTIzLCAweDI0NUI0NTI5LCAweDQyMjgyRTQ2LCAweDdDRjA2NzIzLAorMHg4OUUyM0NCMiwgMHgxRkQ2N0QwMiwgMHhBMDNBMUZDMiwgMHg2N0YyMUZFNCwKKzB4NjU3MjUxRjUsIDB4NDUyOTYyMTMsIDB4NDUyODQ1MTksIDB4NDIxOTQ1MTgsCisweDVDRjIyNTJCLCAweDQxMjgyNzUyLCAweDdDRkQ0MTE4LCAweEEwMjJFQjEwLAorMHg3REYwNURGMSwgMHg1NEQyNTZEMywgMHg0NTE5NjU2MywgMHg1MkQxNDYyOCwKKzB4NDYxODIxNUIsIDB4NkVEMjY1NDMsIDB4NDUxOTI3MTYsIDB4MjY1QjQ0MjgsCisweDY1NDM2MTYzLCAweDQ1MTg2NDIzLCAweDQyMjg0NDE5LCAweDQyMTgyNTRCLAorMHgyNzE2NjRFMywgMHg0NDE5NjYyMywgMHgyNjRCMjc1NiwgMHg0RTI4Mjc2NiwKKzB4NjFFMzRFMTgsIDB4M0NCMjdDRjAsIDB4N0QwMTg5REIsIDB4MUZDMjFGRDYsCisweEU3MDQxRjc0LCAweDUxRjQ1REYyLCAweDVFRjZBMDBELCAweDg0RTI3RUZDLAorMHg2MjAzNjRFMCwgMHg3REZDODRFMSwgMHg4NEUzNjUwMywgMHgyMTY0NjYwMywKKzB4MjE1NDIxMjQsIDB4M0Q3MjIxNDQsIDB4NTdGMzg5RjAsIDB4NjQxMzY2RDMsCisweDdGMUM2NUUzLCAweDZERjY2RUY2LCAweEEwOUQ2Q0Y2LCAweDJGODY2QkY2LAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg2MTQzNzRFMCwKKzB4NkE2MzY4NzMsIDB4NkI1NkU5MjAsIDB4NkM1NjdBRTAsIDB4NkQ1NjcxMjAsCisweDZFNTYzQTkyLCAweDY0NTY2NzU2LCAweDYyNTY2NjU2LCAweDExQzEyMUIyLAorMHgxMUUzMTFEMiwgMHgxMTQ1MTE3NCwgMHg4REVDMTE2NiwgMHg3MTIwMTEyNywKKzB4NjYxM0EwMDQsIDB4N0FGRjYyNTQsIDB4NzYwMTI2MjAsIDB4OEJGOTJBQTgsCisweDZFRjY2MDgzLCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHgyRjg2NjhGNiwgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4NkE2MzY4NzMsIDB4NzVFMEU5MjAsIDB4NTY1NjUyNTcsIDB4NTc1NDUxNTUsCisweDVENTI1RTUzLCAweDZCNTI1QzUxLCAweDI0NjYyNDI2LCAweDI0NzYyNDE2LAorMHg3QUUwMjRFNiwgMHgyNEM2MjRENiwgMHg4REVDM0E5MiwgMHg2NkEzMjRCNiwKKzB4NkVGNjY3ODMsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4QTA0MzY5RjYsCisweDJGRTY2OEY2LCAweEM4MDQ2MDYzLCAweDhEMDQ2RTYzLCAweDYyMTY2MTUzLAorMHgyNDIyN0VGQywgMHg2MEUzNzQwNCwgMHg4OTA4QzgxOCwgMHg3MTA0NjUxMywKKzB4NjI1MjY2MTYsIDB4MjQyMjdFRjgsIDB4QUZGNDE0NjEsIDB4RTIwNDc0MDgsCisweDY1MTMzRTIyLCAweDY2RTM4RDAyLCAweDZFRjZBMDFDLCAweDZFRjZBRjg3LAorMHhDODA0NjA2MywgMHg2MTYzOEQwNCwgMHg2MjUyNzVGQywgMHgyNDI2NzFGQywKKzB4QzgxODYwMTMsIDB4NzVGODg5MDYsIDB4NjY1MjUyNTEsIDB4MjQ2NjI0MjYsCisweDcxRjhBRkY2LCAweDMxMjJFMjA0LCAweDY2MTM4RjAyLCAweDAwMDlBRkExLAorMHgwMDA5QTAwQSwgMHgwMDA5QTAwNCwgMHg3NkZGNjI1NCwgMHg3NDAxMjQyMCwKKzB4OEJGOTI2NjgsIDB4NjA3MzAwMEIsIDB4MDAwOUEwMDQsIDB4NjI1MDc1RkYsCisweDI0MjQ3NkZGLCAweDhCRjkyNjY4LCAweDYwNzMwMDBCLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHg1NDRGMEQwQSwgMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywgMHgyMDcyNjE0RCwKKzB4MzIyMDMyMzIsIDB4MjAzNzMwMzAsIDB4MzUzQTM3MzEsIDB4MzczMzNBMzIsCisweDAwMDAwMDAwLCAweDAwMDAwRDBBLCAweDAwMDAwMDQzLCAweDYxNzY2RTQ5LAorMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwKKzB4MDAyMTQ0NDksIDB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsCisweDNENjQ2RTYxLCAweDAwMDAwMDAwLCAweDYxNDM3NzQ4LCAweDcyNjI2OTZDLAorMHg2RjY5NzQ2MSwgMHg2NjIwMjA2RSwgMHgwQTZDNjk2MSwgMHgwMDAwMDAwRCwKKzB4NzM2OTZGNEUsIDB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsCisweDYxNjYyMDZFLCAweDIxMjE2QzY5LCAweDAwMDAwRDBBLCAweDAwMDAwRDBBLAorMHgwMDAwMDA0MiwgMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwKKzB4MDAwMjAxMEEsIDB4MDAwMzAwMDIsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDgwMjA3LCAweDAyMEEwMjA5LCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LAorMHgwMTBCMDEwQSwgMHgwMDAzMDAwMiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwODAyMDcsIDB4MDIwQTAyMDksIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsCisweDAwMDAwMDU5LCAweDczMjA0MTQyLCAweDAwM0Q3MTY1LCAweDAwMDAwMDc0LAorMHgwMDAwMDAwMCwgMHgwMjAwMDExMiwgMHg0MEZGRkZGRiwgMHgxMjIxMEFDRSwKKzB4MjAxMDQ4OTAsIDB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsCisweDA0MDAwMDA0LCAweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMjAwLAorMHgwMDAyODIwNSwgMHgwNTA3MDAwMiwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwKKzB4MDEwMDQwMDMsIDB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsCisweDAwRkYwNDAwLCAweDA1MDcwMDAwLCAweDAwNDAwMjAxLCAweDgyMDUwNzAwLAorMHgwMDAwNDAwMiwgMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAzMDQwNSwKKzB4MDMwNDAxMDAsIDB4MDMwQzA0MDksIDB4MDA3OTAwNUEsIDB4MDA0MTAwNDQsCisweDAzMTgwMDUzLCAweDAwNTMwMDU1LCAweDAwMzIwMDQyLCAweDAwMzAwMDJFLAorMHgwMDU3MDAyMCwgMHgwMDQxMDA0QywgMHgwMDAwMDA0RSwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDA3MDksIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIH07CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTEyMDQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfT1RVU19SQy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X09UVVNfUkMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODlkM2UwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X09UVVNfUkMuYwpAQCAtMCwwICsxLDcxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFMjg3RkZDLCAweEUxMTRENzI4LAorMHgxRTEzRDQyOCwgMHgxRTRDNDcwQiwgMHgwMDA5QjAxOCwgMHhBMDAzOTU0MywKKzB4MzY1MkU2MDAsIDB4NzYwMThEMDQsIDB4Qzg0MDYwRTIsIDB4MkYwMjhERjksCisweERFMjJENDIxLCAweDAwMDk0RTBCLCAweDRFMEJENDIxLCAweEQ0MjEwMDA5LAorMHgwMDA5NEUwQiwgMHg0RjI2N0YwNCwgMHg2RUY2QTAyMiwgMHhEMTFFNEYyMiwKKzB4MDAwOTQxMEIsIDB4NDQwQkQ0MUQsIDB4RDUxRDAwMDksIDB4MDAwOTQ1MEIsCisweEUxRkZENzFDLCAweEQyMUM2MTFELCAweDUwMjkyNzEyLCAweENCMDFFMUZGLAorMHhENjFCRDQxQSwgMHgyMjEyMTIwOSwgMHhFNTAxMTIxMSwgMHgyNDUyRTIwMCwKKzB4RDUxODI2MjIsIDB4OTcwRkQ2MTgsIDB4NEYyNjI1NzIsIDB4MjYyMDAwMEIsCisweEREMTdEQzE2LCAweDRDMEJERTE3LCAweDREMEIwMDA5LCAweDRFMEIwMDA5LAorMHhBRkY4MDAwOSwgMHgyNzEwMDAwOSwgMHgwMDAwMDY0MCwgMHgwMDFDMDAxQywKKzB4MDAyMDA4RUEsIDB4MDAwMEIzOEUsIDB4MDAyMDI4REMsIDB4MDAyMDBEQTYsCisweDAwMjAyOEU4LCAweDAwMjAyOTAwLCAweDAwMjAwQzZDLCAweDAwMjAwRUEyLAorMHgwMDIwMDk0MCwgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywKKzB4MDAyMDI4OTQsIDB4MDAyMDI4OEMsIDB4MDAyMDI3RjAsIDB4MDAyMDBCNjgsCisweDAwMjAxRjc0LCAweDAwMjAxNzM0LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhERUExN0ZBNCwgMHg2MUUwRTAxQywgMHg3RDAxNkRFMywgMHg2MUQwMEYxNCwKKzB4RDU5RkQ0OUUsIDB4NDUwQkUwMjAsIDB4RTAyMDBGMTQsIDB4RTc4MDA0RkMsCisweDYwNEM2NkUyLCAweDdEN0Y2NzdDLCAweDFGNjkzMDcwLCAweDJENjI4RjE3LAorMHgwMUZDRTAxQywgMHg2NDFDRTUwMCwgMHhENzk3REU5NiwgMHgzMjQzNjI1RCwKKzB4QTIxQThCMDEsIDB4NjU1RDAwMDksIDB4MzFFQzYxNTMsIDB4RTAyODZDMTAsCisweDZENTMwRkM0LCAweDNEN0M2MkNFLCAweEFGRUYyRDIwLCAweDIwMDg3NTAxLAorMHhFMDFDOEIxNSwgMHhFNTAwMDFGQywgMHhENzhCREU4QSwgMHg2NDFDQTAwQSwKKzB4NkM1MzY1NUQsIDB4NjZDMjNDRUMsIDB4NjY2MjYyNTMsIDB4MjI2MjMyN0MsCisweDFGNjk3NTA0LCAweDMyNDM2MjVELCAweEExRjY4QkYyLCAweDg4MDEyRDEwLAorMHhFMDFDOEIxNiwgMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU3RCwKKzB4OEIwMTMyNzMsIDB4MDAwOUExRTksIDB4NjJFMzY0NEQsIDB4NzIwNDZENDMsCisweDNERUM2MTQzLCAweDY1RDIzMTJDLCAweDc0MDg2QzEyLCAweDI1QzJBRkVGLAorMHg4QjE4ODgwNCwgMHgwMUZDRTAxQywgMHgyRDQwRTQwMCwgMHhERTcxNjcxQywKKzB4MzI3MzYyNEQsIDB4QTFEMDhCMDEsIDB4NjQ0RDAwMDksIDB4NjJFMzZENDMsCisweDY1RDIzREVDLCAweDYxNDM3MjA0LCAweDY2MTIzMTJDLCAweDc0MDg2QzUyLAorMHhBRkVEMkM2OSwgMHg4ODA1MjVDMiwgMHhFMDFDOEIxOCwgMHhFNDAwMDFGQywKKzB4NjcxQzJENDAsIDB4NjI0RERFNjMsIDB4OEIwMTMyNzMsIDB4MDAwOUExQjUsCisweDZDNDM2NDRELCAweDNDRUM2MkUzLCAweDcyMDQ2NUMyLCAweDNEMkM2RDQzLAorMHg2MTUyNjZEMiwgMHgyMTZCNzQwOCwgMHgyNTEyQUZFRCwgMHg4QjEzODgzMCwKKzB4RTIwMERFNTgsIDB4NjRFMjJEMjAsIDB4OEIwNDI0NDgsIDB4NDIwQkQyNTcsCisweEExOUEwMDA5LCAweDU1RTEwMDA5LCAweDU3RTM1NkUyLCAweERENTQ1Q0U0LAorMHgyRkM2NEQwQiwgMHg3RjA0QTE5MSwgMHg4OTAxODgyOCwgMHgwMDA5QTBFQSwKKzB4RTE0M0RFNEMsIDB4NjIyRDYyRTEsIDB4OEYwMzMyMTcsIDB4NTZGQjFGRUIsCisweDI2MjFFMjQwLCAweDhCMDEzMjE3LCAweDAwMDlBMEQ1LCAweEUxMDE1RUZCLAorMHgzMDE2ODVFMSwgMHhBMENFOEIwMSwgMHhFNDAxMDAwOSwgMHgyRDQwNTVGQiwKKzB4NjQ1MUIxNzksIDB4RTE0MzU3RkIsIDB4RTA1NDYyNzEsIDB4MzUxNzY1MkQsCisweDBGNTY4RDQxLCAweDM1NjNFNjQwLCAweEU2MDA4QjA1LCAweDBGNjVFMDM0LAorMHhBMDBGRTExQSwgMHg2MTUzNzJDMCwgMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwKKzB4NDUyMTQxMjEsIDB4NDUyMTQ1MjEsIDB4QzkwMzYwNTMsIDB4RTAzNDY2MDMsCisweDcxMTgwRjY1LCAweDIyMDlFMDA3LCAweDY0MURFMDMwLCAweDBGMjU2NUYzLAorMHgxRjRFQjFGMSwgMHgwNEZERTAzNCwgMHg2NzRERTAzMCwgMHg0NzA4MENGRCwKKzB4NjA3MzYxQ0QsIDB4NDEwOEQyMkIsIDB4RTAwRjBDRkUsIDB4MUYxRjQyMEIsCisweDJDRDk2RDA3LCAweDVFRkI2MDczLCAweDg1RTIwRkM2LCAweDQyMEI1MUZGLAorMHgyQzBCNjAwRCwgMHg1NEZFNjA3MywgMHhCMUJCMEZDNiwgMHhFMDU0NjVGMywKKzB4NjUyRDYyRTEsIDB4RTY0MDBGNTYsIDB4ODk2MjM1NjMsIDB4RTA1MEUxMDAsCisweDYwMjMwRjE1LCAweDQwMDhDOTAzLCAweDZEMDM0MDAwLCAweEUwNDA2MTAzLAorMHhFMDQ0MEZENiwgMHhEMjE3RUVGRiwgMHg2RUVDMEZGNiwgMHgwRjI2RTA1OCwKKzB4NjBFMzQyMEIsIDB4NDIyMTYyNTMsIDB4NDIyMTQyMjEsIDB4NjYyMzQyMjEsCisweDMyNkM0MjAwLCAweDQ1MjE0MjAwLCAweEUwNDg2NzA3LCAweDBGNzY0NTIxLAorMHhDOTAzNjA1MywgMHg0MDA4NUNGQiwgMHg3QzA2MzBGQywgMHg2RTAzNkQyRCwKKzB4MUZENTFGQzYsIDB4MUYwNEEwMkUsIDB4MDAxMTdEMDAsIDB4MDAyMDI5MDQsCisweDAwMjAwREE2LCAweDAwMTE3RDA0LCAweDAwMTE3RDg0LCAweDAwMjAwNzAwLAorMHgwMDIwMDc0QywgMHgwMDIwMUZENCwgMHgwRkQ2RTA0QywgMHgwNUZFRTA0NCwKKzB4NjREM0IxODksIDB4NjRFMkUwNDgsIDB4RTA0MDA2RkUsIDB4MkU0MjI0NjksCisweDAxRkU2N0M0LCAweDY2N0NFMDU4LCAweDQyMEIwMkZFLCAweDI0MEI2MDYzLAorMHgwNUZFRTA0NCwgMHhCMTVEMkU0MiwgMHhFMDUwNjREMywgMHg3RDAxMDFGRCwKKzB4MEYxNTcxMDEsIDB4MDJGREUwNTAsIDB4MzI2MkU2MDYsIDB4NTZGQjhCREMsCisweDU1RkI2MjYxLCAweDg1NTE0MjAwLCAweDMwMkM3NTBDLCAweDYxMDM3MDFCLAorMHg2NEYzRTYwMCwgMHhFNzA0QTAwNCwgMHg3NjAxNjI1NiwgMHg3NDA0MjQyMiwKKzB4MzI3MzYyNkQsIDB4NjVGMzhCRjgsIDB4NjQxREIxM0MsIDB4QjBEMjU2RkIsCisweEEwQUE2NDYxLCAweEQ0ODgwMDA5LCAweEUyMDFENTg4LCAweDJEMjA0NTBCLAorMHgwMDA5QTBBMywgMHg4QjA3ODgyOSwgMHhFMjAwREU4NSwgMHg2NkUyMkQyMCwKKzB4NjQ2REIwQTEsIDB4MDAwOUEwOTksIDB4NjIyQ0UyODEsIDB4OEIzRDMwMjAsCisweEQ2ODBFNzM4LCAweEUwNDQyRDcwLCAweEUwNDgwQzZFLCAweDZFNjIxREMxLAorMHg1MTYxMURFMiwgMHg1NDYyMUQxMywgMHg1NTY1MUQ0NCwgMHg1NzYzMUQ1NSwKKzB4NUM2NjFENzYsIDB4MEU2RTFEQzcsIDB4MURFOEUwNDAsIDB4RTA1MDAxNkUsCisweDU0NjQxRDE5LCAweDA1NkUxRDRBLCAweDFENUJFMDRDLCAweEUwNTQwNzZFLAorMHgwQzZFMUQ3QywgMHgxRENERTA1OCwgMHhFMDQ0MDI2RSwgMHhFRDAwMUQyRSwKKzB4RTA0ODA2RDYsIDB4MTZEMTI2RDIsIDB4MTZENTE2RDIsIDB4MTZENjE2RDMsCisweEUwNDAwNkQ2LCAweEUwNTAwNkQ2LCAweDA2RDYxNkQ0LCAweDA2RDZFMDRDLAorMHgwNkQ2RTA1NCwgMHgwNkQ2RTA1OCwgMHgxRjI5QTA1NywgMHg2MjJDRTI4MiwKKzB4ODkzMTMwMjAsIDB4MDVGQ0UwMjAsIDB4NjI1Q0U2ODMsIDB4MzI2MDY2NkMsCisweEQ2NUQ4QjA3LCAweDI2NTBFNTAwLCAweDUyNjE3NjgwLCAweEEwNDRENjVCLAorMHhFNjkwMjYyMiwgMHgzMjYwNjY2QywgMHhEMjU3OEIxNiwgMHhFNTAwRDY1OCwKKzB4NjA2MjIyNTAsIDB4Q0IyMEQyNTcsIDB4RTYwNTI2MDIsIDB4RDY1NjIyNjIsCisweDIyNTI0NjBCLCAweDQyMEJEMjU1LCAweEQyNTUwMDA5LCAweDIyNjJFNjAxLAorMHg0NjE4RDI1NCwgMHgyMjYyQTAyOSwgMHhEMjU0RDQ1MywgMHhENDU0NjU0MiwKKzB4MDAwOTQyMEIsIDB4MDAwOUEwMjEsIDB4RTUyNEQ2NDcsIDB4RDU0NTI2NTAsCisweDE2MjE1MjU3LCAweDE2MjI1MjU4LCAweDE2MjM1MjU5LCAweDE2MjQ1MjVBLAorMHgxNjI1NTI1QiwgMHgxNjI2NTI1QywgMHgxNjI3NTI1RCwgMHgxNjI4NTI1RSwKKzB4MUYyOTUyNUYsIDB4RTIwMDE2MjksIDB4MTUyODE1MjcsIDB4MTUyQTE1MjksCisweDE1MkMxNTJCLCAweDE1MkUxNTJELCAweDdGNUMxNTJGLCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHg0RjIyNkNGNiwgMHhFMjQwNjE0RCwgMHg4OTE3MzEyMywKKzB4MzEyN0UyMUYsIDB4RDQzQjg5MDgsIDB4RTAwMUQ1M0IsIDB4NjY0MjQ1MEIsCisweDI2Nzk2NzA3LCAweDI0NjJBMDBDLCAweDMxMjdFMjNGLCAweEQ3MzU4OTA4LAorMHg3MUUwRDYzNSwgMHg0NjBCRTAwMSwgMHg2MjA3NTU3MSwgMHgxNzUxMjUyOSwKKzB4MDAwQjRGMjYsIDB4NEYyMjAwMDksIDB4RTI0MDYxNEQsIDB4ODkxNTMxMjMsCisweDMxMjdFMjFGLCAweEQ0MkI4OTA3LCAweDY2NDJEMjJCLCAweEUwMDE0MjBCLAorMHhBMDBCMjYwQiwgMHhFMjNGMjQ2MiwgMHg4OTA3MzEyNywgMHhENjI2RDcyNSwKKzB4NzFFMDU1NzEsIDB4RTAwMTQ2MEIsIDB4MTc1MTI1MEIsIDB4MDAwQjRGMjYsCisweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LCAweDYyNTJENTIwLCAweDg5RkMyMjY4LAorMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwgMHhENTFDNDYyOCwgMHgyMjY4NjI1MiwKKzB4MDAwQjg5RkMsIDB4QTAwMTAwMDksIDB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsCisweDAwMDkwMDBCLCAweDQ2MThFNjgwLCAweEQ1MTU0NjI4LCAweDIyNjg2MjUyLAorMHgwMDBCOEJGQywgMHgwMDAwMDAwOSwgMHgwMDIwMjkwOCwgMHgwMDIwMERBNiwKKzB4MDAxMTdEMDQsIDB4MDAyMDI3RjgsIDB4MDAxMTdEODAsIDB4MDAyMDI4OEMsCisweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweDAwMjAwRUEyLCAweDAwMjAwOTQwLAorMHgwMDFFMjEyQywgMHgwMDFDM0QyOCwgMHgwMDExN0QwMCwgMHgwMDIwMEUwNiwKKzB4MDAyMDI5MjAsIDB4MDAxQzM3MDQsIDB4MDAyMDFGRDQsIDB4MDAxQzM3M0MsCisweDAwMUMzNzAwLCAweDRGMjIyRkU2LCAweDZFNTM3RkZDLCAweDJGNDJCRkNBLAorMHhENjE1NjFFMiwgMHgxNjE1RTI4MCwgMHg0MjE4NTRFMSwgMHg1NUUyMTY0NiwKKzB4MTY1NzQyMjgsIDB4NkVGMjU3RTMsIDB4MkUyQjE2NzgsIDB4N0YwNDI2RTIsCisweEFGQTc0RjI2LCAweDJGQzY2RUY2LCAweDJGRTYyRkQ2LCAweEREMEE0RjIyLAorMHhCRkFGNkM1MywgMHhCRjk0NkU0MywgMHhCRkFCMkRFMiwgMHg1MUQ1MDAwOSwKKzB4NTRENjJDMTIsIDB4NTVENzFDNDEsIDB4NTZEODFDNTIsIDB4NEYyNjFDNjMsCisweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDAwMUMzNzBDLCAweDAwMDlBMEMwLAorMHhEMTdCNEYyMiwgMHhENDdCOTJCNiwgMHgyMTIyQjAwRCwgMHg5N0IyRTYwNSwKKzB4QjAyMjk1QjIsIDB4QjAzNjY0NjMsIDB4QjAzNjAwMDksIDB4QjAzOTAwMDksCisweEEwNjgwMDA5LCAweDRGMTI0RjI2LCAweEQxNzM0RjAyLCAweDk0QTQzMTQ1LAorMHg0NjA5MDYwQSwgMHg0NjA5NDYwOSwgMHgwMDI5MzY0NiwgMHhENzZDRDU2RiwKKzB4MjUwMENBMDEsIDB4NEYwNjI3NjIsIDB4NEYxNjAwMEIsIDB4QkZFQTRGMjIsCisweEIwMUYwMDA5LCAweEEwNEUwMDA5LCAweDJGRTY0RjI2LCAweDZFNjNEMTY4LAorMHg0NDE4NjYxMiwgMHg0NTI4OTI4QSwgMHgyNjI5NDQwOCwgMHg0NDA4NDUwMCwKKzB4NDQwMDI2NUIsIDB4NDcwODI2NEIsIDB4NDcwODIxNjIsIDB4MjdFQkQxNjEsCisweDAwMEIyMTcyLCAweDAwMEI2RUY2LCAweEQyNUYwMDA5LCAweEU0MEE5Njc3LAorMHgyMjYyQUZCNCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzVCNEYyMiwKKzB4MkMyMkUyMDEsIDB4QkZBOUU0MEEsIDB4NjBDMjdDNDQsIDB4Q0IwMUVEMDAsCisweDYwQzIyQzAyLCAweEM5MDFFQjY0LCAweDZFMDNBMDA4LCAweDg5MDczREIyLAorMHhFNDAxNjBDMiwgMHhCRjk5QzkwMSwgMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwKKzB4OEIwMzNEQjIsIDB4RDI0RkQ0NEUsIDB4MDAwOTQyMEIsIDB4NEYyNkU0MEEsCisweDZERjY2RUY2LCAweEFGODk2Q0Y2LCAweDQ0MTE2QkY2LCAweDYwNEI4RjAxLAorMHgwMDBCNjA0MywgMHgyRkI2MDAwOSwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REM0NTdGRkMsIDB4NjBDMkVEMDAsIDB4Q0IwMkVCNjQsIDB4NjBDMjJDMDIsCisweEM5MDIyRjAyLCAweDZFMDNBMDA5LCAweDg5MDgzREIzLCAweEU0NjQ2MEMyLAorMHhDOTAyMkYwMiwgMHg2RTAzQkY2QSwgMHgyRUU4N0QwMSwgMHhENzNCOEJGNCwKKzB4NjE3MjUxQzEsIDB4REUzQkRDM0EsIDB4RDIzQ0QxM0IsIDB4NjRDMjNEQjMsCisweDY1MTI2NEUyLCAweDY1MjI4RjA5LCAweEQyMzJENDM5LCAweDRGMjY3RjA0LAorMHg2REY2NkVGNiwgMHg0MjJCNkNGNiwgMHg3RjA0NkJGNiwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4NTY1MUQ1MzIsIDB4NDYyODYwNTIsCisweDMwNkMwMDBCLCAweDUyODgwOTZDLCAweDA5QjQ1QkI0LCAweDAzQzQxRkZGLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwgMHhCRkVCNEYwMiwKKzB4NkIwMzZFNDMsIDB4REQxOERDMjgsIDB4MDAwOUJGRTYsIDB4M0MwNTMwQjgsCisweDQ2MDkwNjBBLCAweDQ2MDE0NjA5LCAweDAyMEEzRDY1LCAweDQyMDk0MjA5LAorMHgzMkUyNDIwOSwgMHg0RjA2OEJGMCwgMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwKKzB4MDAwQjZDRjYsIDB4MkZFNjZCRjYsIDB4REUxQzRGMjIsIDB4RTUwMEUxMDIsCisweDJFMTJFNDAzLCAweDJFNTJCRkQ0LCAweDQ2MThFNjA2LCAweEU0MDNFNzAwLAorMHgyRTcyMkU2MiwgMHhBRkNCNEYyNiwgMHgwMDBCNkVGNiwgMHgwMDAwMDAwOSwKKzB4MDAyMDI4OTAsIDB4MDAyNENERTAsIDB4MTA2MjRERDMsIDB4MDAyMDJBOEMsCisweDAwMUM1ODE0LCAweDAwMUM1OUQwLCAweDAwMUM1ODA0LCAweDAwMUM1ODFDLAorMHgwMDIwMjkzNCwgMHgwMDIwMERBNiwgMHgwMDFDNTg2MCwgMHgwMDFDNjg2NCwKKzB4MDAxQzc4NjQsIDB4MDAxQzU5QkMsIDB4MDAxQzY5QkMsIDB4MDAxQzc5QkMsCisweDAwMjAyOTRDLCAweDAwMUMxMDQwLCAweENDQ0NDQ0NELCAweDAwMUQ0MDA0LAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RTQwMDdGRTQsIDB4NDUyOEU1MTAsIDB4Njc0MzZDNDMsIDB4RTEwN0EwMEYsCisweDYwNDM2NDRELCAweDBGNTY0MDA4LCAweEVFMDA2MEMzLCAweDgxNTEyNUMxLAorMHg4MTUzODE1MiwgMHgxNTczMTVFMiwgMHg3NTE0MTVFNCwgMHg2MjRENzQwMSwKKzB4OEJFRDMyMTMsIDB4REE2RjUxRjEsIDB4MUExMTU0RjIsIDB4RDE2RTJBMTIsCisweDU3RjQ1NUYzLCAweDZERjI1OEY1LCAweDExNDFEOTZDLCAweDExNTMyMTQyLAorMHgxMTc1MTE1MiwgMHgxMTg3MTE3NCwgMHg1MkY2MTE4NiwgMHgxOUQxRDY2OCwKKzB4RDg2ODI5RDIsIDB4REE2OEU5NTAsIDB4MTYyMUVCQjQsIDB4NkJCQzI2MjIsCisweEEwMjE0OTA4LCAweDZFRURFRTAwLCAweDYxRTM2REUzLCAweDQxMDg0RDA4LAorMHgzMUVDM0RFQywgMHg0MTA4NEQwOCwgMHg2MEMzM0Q4QywgMHhFNzkwNDEwOCwKKzB4ODFEMTJEQzEsIDB4NDEwODYwOTMsIDB4ODFEMjY3N0MsIDB4MzFBQzYwQzMsCisweDM0NzJFMjAwLCAweDFERDI4MUQzLCAweEQ0NTUxRDEzLCAweDFEMjQ4RDAxLAorMHhCMDNBRDQ1MCwgMHg3RTAxNjVEMywgMHgzNEIyNjRFRCwgMHhEMTREOEJEQiwKKzB4NjUxMkRCNTIsIDB4NDUyOUQyNEQsIDB4NjQxMjFCNTEsIDB4Njc0REQxNEEsCisweDY3MjIyQjcyLCAweDQ3MjlENjRFLCAweDY5MjIxQjczLCAweDY4OUQyRkQyLAorMHg2OTEyMUI4MiwgMHg1QTEyMjY5MiwgMHg1QjE0MTZBMiwgMHgxNkI0REE0NCwKKzB4MTZDNjVDMTYsIDB4MTZFQTZFQTIsIDB4NEYyNjdGMUMsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDYwNjE2NjQyLAorMHg4RDA0QzgwMywgMHg2MDYxRTUwMCwgMHg4ODAyQzkwMywgMHg1MjYyOEIwMywKKzB4NTEyNDY1NjMsIDB4MDAwQjI0MTIsIDB4MkZENjYwNTMsIDB4NEYyMjJGRTYsCisweDZFNTM3RkVDLCAweEU1NTA2MjUzLCAweEU0MDA2RDQzLCAweEEwMDE0NTA4LAorMHg1MjI0RTEwMSwgMHgyMjExNjA0MywgMHg4MTIzODEyMSwgMHg4MTIyNjA1MywKKzB4MzYyMDU2RTIsIDB4RDIyRjhCRjUsIDB4NjRGMzE2RTQsIDB4NDIwQkU2MTQsCisweDY1RTE2NUUzLCAweDI1NDlFNEZDLCAweDYxRjEyRTUxLCAweDIxNDk2NUYzLAorMHg1NEQxMkYxMSwgMHg0MTBCRDEyNywgMHg1N0QxRTYxNCwgMHhDQjAxNjA3MSwKKzB4MURFMTI3MDEsIDB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsCisweDRGMjIyRkU2LCAweDZFNTM3RkVDLCAweEU1RkM2NjUzLCAweDYwNjE2RDQzLAorMHhDQjAxMjA1OSwgMHg1MkUyMjYwMSwgMHg4QjA2MzI2MCwgMHg1MUUyMTJFNCwKKzB4OEIwNDMxRTAsIDB4QTAwMjUyRDEsIDB4QUZGMDFFMjIsIDB4RDIxNTU2NjQsCisweEU2MTQ2NEYzLCAweDY1RTM0MjBCLCAweEUxRkM2N0UxLCAweDJFNzEyNzE5LAorMHg1NEQxNjdGMSwgMHhEMTBGMjcxOSwgMHhFNjE0NjVGMywgMHgyRjcxNDEwQiwKKzB4NjAyMTUyRDEsIDB4MjIwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDAwMjAyODVDLCAweDAwMjAyODY0LCAweDAwMjAyODU0LAorMHgwMDIwMjg4NCwgMHgwMDEwMDA4QywgMHgwMDEwMEVDMCwgMHgwMDFFMjEwOCwKKzB4MDAxQzNEMDAsIDB4MDAyMDIxMzQsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweEQ2MzE0RjIyLCAweDYwRDM2RDYyLCAweDg5NERDODAzLCAweERCMzBEQzJGLAorMHgwMDA5QTAyQywgMHhDOTAzNjA2MSwgMHg4OTJCODgwMSwgMHhEMjJERDQyQiwKKzB4MDAwOTQyMEIsIDB4NjUwMzU2MDMsIDB4QzgyMDg1NjEsIDB4RTA1MDg5MDMsCisweDcyMDEwMkJFLCAweDg1NjIwQjI2LCAweDQwMDA2MDBELCAweDQwMDAzNjZBLAorMHg0MDAwNDYyNCwgMHgyMDZENDYyNCwgMHhENDIzQzkwMywgMHg0MDA4NkUwMywKKzB4RDEyMjQwMDAsIDB4MzQwQzQxMEIsIDB4NjFFM0Q1MjEsIDB4RDcyMUUwMDEsCisweDQ1MEJEMjIxLCAweDY0RTM3RTMwLCAweDI3MDI0MjBCLCAweDY2QzI1MkMxLAorMHg4QkNGMzYyMCwgMHg0RTE4RUUwMSwgMHhBMDExREIxQywgMHg2MDYxRUM3NSwKKzB4ODgwMUM5MDMsIDB4RDQxOTg5MTAsIDB4NDYwQkQ2MTIsIDB4RDQxODAwMDksCisweDQ3MEJENzE4LCAweEQyMTM2NTAzLCAweDY0QzNEMTEzLCAweDIyRTI0MTBCLAorMHg2NkIyNTJCMSwgMHg4QkVBMzYyMCwgMHhDODA0NjBEMywgMHhEMjEyODkwNiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDAwMUUyMTAwLCAweDAwMjAyODVDLAorMHgwMDIwMjdGOCwgMHgwMDIwMEE1QywgMHgwMDIwMjg2NCwgMHgwMDIwMEFERSwKKzB4MDAyMDFGRDQsIDB4MDAxQzNEMzAsIDB4MDAyMDBENkMsIDB4MDAyMDI4NTQsCisweDAwMjAyODg0LCAweDAwMjAwQTdBLCAweDAwMjAwMEY4LCAweEU2MDFEMjM3LAorMHgxMjY1RDUzNywgMHgwMDBCMjI1MiwgMHhENjM2MTI2NiwgMHg4ODAxNjA2MiwKKzB4RTEwMThCNjIsIDB4RDUzNDI2MTIsIDB4NTQ1MUQxMzQsIDB4RTA0MDYyMTIsCisweDIxMjIzMjRDLCAweDU0MTE1NzUyLCAweDExNDEzNDdDLCAweDU3MTI1NDUzLAorMHgxMTcyMzc0QywgMHg1MjEzNTc1NSwgMHgxMTIzMzI3QywgMHg1NjE0NjQ1MiwKKzB4MTE2NDM2NEMsIDB4NTQxNTU3NTQsIDB4MTE0NTM0N0MsIDB4NTYxNjU0NTgsCisweDExNjYzNjRDLCAweDY3NjJENjI2LCAweDMyN0M1MjE3LCAweDU3NjExMTI3LAorMHgzMjdDNTIxOCwgMHg1NzYyMTEyOCwgMHgzMjdDNTIxOSwgMHg1NzYzMTEyOSwKKzB4MzQ3QzU0MUEsIDB4NTc2NDExNEEsIDB4MzQ3QzU0MUIsIDB4NTc2NTExNEIsCisweDM0N0M1NDFDLCAweDUyNjYxMTRDLCAweDM3MkM1NzFELCAweDUyNjcxMTdELAorMHgzNDJDNTQxRSwgMHg1MjY4MTE0RSwgMHgzNjJDNTYxRiwgMHhENjE1MTE2RiwKKzB4MDQxRTYyNjIsIDB4MzQyQzc2OTQsIDB4RTA0NDAxNDYsIDB4MDYxRTYyNjIsCisweDAxNjYzNjJDLCAweDUyNUNFMDQ4LCAweEQ2MEYwNTFFLCAweDAxNTYzNTJDLAorMHhFMDU0NjI2MiwgMHg0MjI5MDUxRSwgMHgwMTU2MzUyQywgMHhFMDU4NTU2MSwKKzB4NDUyOTA2MUUsIDB4MDE2NjM2NUMsIDB4MDAwOTAwMEIsIDB4MDAxQzEwMTAsCisweDAwMDBDMzRGLCAweDAwMUMxMDI4LCAweDAwMUMzNjlDLCAweDAwMjAyN0Y4LAorMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwgMHhENjJGN0ZGQywKKzB4MjY0MjY0NEMsIDB4QzgyMDUwNjYsIDB4MkYwMjhERkMsIDB4N0YwNDAwMEIsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LAorMHg3RTAxNjRENCwgMHg2NDRDQkZFQSwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4QTAwMTZDRjYsIDB4NzYwMTY2NDMsIDB4MjIyODYyNjAsCisweDM2NDg4QkZCLCAweDY1NjNBRkU0LCAweDJGQjYyRjk2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhFQzFDRUQwOCwgMHhEQjE5NkU1MywgMHg2MUMzRTkwQSwKKzB4NjA0MzRCMEIsIDB4MzA5MkM5MEYsIDB4NjYwMzhEMDIsIDB4NzYzMEEwMDEsCisweDREMTA3NjM3LCAweDdFMDEyRTYwLCAweDdDRkM4RkYxLCAweDgwNThFMDAwLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHgwMDBCNkJGNiwgMHgwMDBCNjlGNiwKKzB4MDAwQkUwMDAsIDB4MkZFNkUwMDAsIDB4N0ZFQzRGMjIsIDB4NkU0MzYyNTMsCisweEJGRDE2NUYzLCAweEJGQzY2NDIzLCAweEJGQzQ2NEUzLCAweEQ0MDU2NEYzLAorMHgwMDA5QkZDMSwgMHg0RjI2N0YxNCwgMHg2RUY2MDAwQiwgMHgwMDFDMDAwNCwKKzB4MDAyMDIwOTQsIDB4MDAyMDI5NjgsIDB4RTExMEQ1OUMsIDB4RTY0MDYwNTAsCisweDI1MDBDOUZELCAweEUwRkY3NUU5LCAweDgwNTE2NDUzLCAweDgwNTM4MDUyLAorMHg4MDU2ODA1NSwgMHgyNTEwNzVFRiwgMHhFMUVGNjI1MCwgMHgyMjE5RTAwMSwKKzB4RTcyMDI1MjAsIDB4MjQ2MDgwNTIsIDB4MjU3MDAwMEIsIDB4RTRGREQ1OTAsCisweEU3MDI2MTUyLCAweDI1MTIyMTQ5LCAweDc0MDE2MDUyLCAweDI1MDJDQjAxLAorMHhEMThDNjY1MiwgMHgyNTYyMjY0OSwgMHg5MkMyNjAxMiwgMHgyMTAyQ0IwOCwKKzB4QzlDRjYwMTIsIDB4NjAxMjIxMDIsIDB4MjEwMkNCMDMsIDB4MDAwQjExNzIsCisweDRGMjIxMTIzLCAweEUxMDBENDg0LCAweEQyODVENzg0LCAweEQ1ODUyNDEwLAorMHgyNzExRDQ4NSwgMHgyMjExRTcwMCwgMHhCRkJEMjUxMSwgMHhENTgzMjQ3MSwKKzB4MjU2MEU2MDAsIDB4NEYyNkFGRDIsIDB4RDI4MTY2NEMsIDB4MzYyQzQ2MDAsCisweENCMTA2MDYwLCAweDI2MDAwMDBCLCAweEQyN0Q2NTRDLCAweDM1MkM0NTAwLAorMHhFMUVGNjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI3OSwKKzB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsIDB4NjU0QzI2MDAsIDB4NDUwMEQyNzUsCisweDY2NTAzNTJDLCAweDI2MTlFMUVGLCAweDI1NjAwMDBCLCAweEQyNzA2NjRDLAorMHgzNjJDNDYwMCwgMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjZDNjU0QywKKzB4MzUyQzQ1MDAsIDB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsCisweDQ2MDBEMjY4LCAweDYwNjAzNjJDLCAweDAwMEJDQjA4LCAweDY1NEMyNjAwLAorMHg0NTAwRDI2NCwgMHg2NjUwMzUyQywgMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwKKzB4RDY1RjYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsIDB4NDAyMTQwMjEsCisweDAwMEI0MDIxLCAweDYyNEM2MDBDLCAweDQyMDBENjVBLCAweDYwMjAzMjZDLAorMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwgMHhEMTU2NjQ0QywKKzB4MzQxQzc0RkYsIDB4MDAwQjYyNDAsIDB4RDE1NDYwMkMsIDB4MzQxQzY0NEMsCisweDAwMEI2MjQwLCAweDJGRTY2MDJDLCAweDY1NUM0RjIyLCAweDM1NjdFNjBBLAorMHg2RTQzOEQxNSwgMHg2NDUzQkZFQSwgMHg2MEVDNjQwQywgMHg4QjAyODgwMSwKKzB4QTAwMkUwMEYsIDB4NDQwOTI0MDksIDB4NjI0QzQ0MDksIDB4MzI2M0U2MEEsCisweEJGRTI4OTA1LCAweDYyMEM2NDRDLCAweEM4ODA2MDIzLCAweEUyMDA4QjAwLAorMHg0RjI2NjAyMywgMHg2RUY2MDAwQiwgMHhENjQxNEYyMiwgMHg4ODAxNjA2MiwKKzB4QjIyMjhCMDMsIDB4QTAwMzAwMDksIDB4RDIzRTAwMDksIDB4MjI2MEU2NDAsCisweEUyMDBENjNELCAweDAwMEI0RjI2LCAweDRGMjIyNjIyLCAweDYwNjJENjM4LAorMHg4QjAxODgwMiwgMHgwMDA5QjI2QywgMHhFMjAwRDYzNywgMHgwMDBCNEYyNiwKKzB4MEZGRjI2MjIsIDB4RDQzM0Q1MzIsIDB4RTcwMUUxMDAsIDB4MDAwQjI1MTIsCisweEQyMzAyNDcwLCAweDAwMEJFNjA0LCAweEQ1MjAyMjYwLCAweDYxNTBFNEZELAorMHgyMTQ5RDYyRSwgMHgyNTEwRTcwMCwgMHgyNjcwMDAwQiwgMHhFNEZCRDUxQiwKKzB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RTRGN0Q1MTgsIDB4MjI0OTYyNTAsCisweDI1MjAwMDBCLCAweEQyMjY0RjIyLCAweDYwMEQ4NTIyLCAweDg5MTEyMDA4LAorMHg4OTEzODgwMSwgMHg4OTE1ODgwMywgMHg4OTE3ODgwNSwgMHg4OTQxODgwNiwKKzB4ODk0Nzg4MDgsIDB4ODk0RDg4MDksIDB4ODk1Mzg4MEEsIDB4ODk1OTg4MEIsCisweDAwMDlBMDYwLCAweDAwMDlCMDYyLCAweDYwMENBMDVELCAweDAwMDlCMDcwLAorMHg2MDBDQTA1OSwgMHgwMDA5QjA3QSwgMHg2MDBDQTA1NSwgMHg2MjYwRDYwNiwKKzB4OEI0RjIyMjgsIDB4MDAwOUIwODYsIDB4NjAwQ0EwNEQsIDB4MDAxRTEwMjgsCisweDAwMUUyMTQ4LCAweDAwMUUxMTA4LCAweDAwMjAyOEQ5LCAweDAwMjAyOEM4LAorMHgwMDIwMjhDQSwgMHgwMDIwMjhDQywgMHgwMDIwMjhBQywgMHgwMDFFMTAwOCwKKzB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMzAsIDB4MDAxRTEwOTAsCisweDAwMjAyOEQ0LCAweDAwMUUxMDBCLCAweDAwMjAyOEQwLCAweDAwMjAyOEQ4LAorMHgwMDIwMjhBMCwgMHg2MjYwRDY4NywgMHg4QjIzMjIyOCwgMHgwMDA5QjA2QSwKKzB4NjAwQ0EwMjEsIDB4NjI2MEQ2ODMsIDB4OEIxQjIyMjgsIDB4MDAwOUIwQjQsCisweDYwMENBMDE5LCAweDYyNjBENjdGLCAweDhCMTMyMjI4LCAweDAwMDlCMEJBLAorMHg2MDBDQTAxMSwgMHg2MjYwRDY3QiwgMHg4QjBCMjIyOCwgMHgwMDA5QjExRSwKKzB4NjAwQ0EwMDksIDB4NjI2MEQ2NzcsIDB4OEIwMzIyMjgsIDB4MDAwOUIxMzYsCisweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEQyNzNEMTcyLAorMHhENTczODQxMiwgMHg0MDAwQzkwRiwgMHhENzcyMDEyRCwgMHg2MTFDRTQwMywKKzB4RDY3MUUyMEYsIDB4MjcxMjI1NDAsIDB4RTAwMTI1MjAsIDB4MjYwMjAwMEIsCisweEU2MDFEMjY5LCAweDMwNjY4NTIzLCAweEUwMDA4RDA2LCAweEUwMDBEMjY3LAorMHg4MTIyRDY2OSwgMHgyNjAyRTAwMSwgMHgwMDA5MDAwQiwgMHg4NTIzRDI2MiwKKzB4MjAwODYwMEQsIDB4ODgwMTg5MDUsIDB4RDY2NDhCMEEsIDB4Q0IwMTYwNjAsCisweEQ2NjEyNjAwLCAweEUxMDFENDVELCAweDI2MTJFMDAxLCAweDgxNDIwMDBCLAorMHhFMDAwMDAwQiwgMHhFNTAxRDE1OCwgMHg0NTE4ODUxMywgMHgzNDUzNjQwRCwKKzB4OEQwNTY2MDMsIDB4RDI1QUUwMDAsIDB4RTAwMUQ1NTcsIDB4MjUwMjIyNjAsCisweDAwMDkwMDBCLCAweEQxNTA0RjIyLCAweDY1MEQ4NTEzLCAweDQ0MTk2NDUzLAorMHg2NzJFNjI0OSwgMHg2MDJDMjI3RCwgMHg4OTA5ODgwMSwgMHg4OTBDODgwMiwKKzB4ODkxMDg4MDMsIDB4ODkyNjg4MDYsIDB4ODkyOTg4MDcsIDB4MDAwOUEwMzgsCisweEQ2NERENTRDLCAweEEwMjdFMjEyLCAweDYyNUMyNjUyLCAweDhCMkYyMjI4LAorMHhBMDFFRDY0QSwgMHg2MDVDNjI2MiwgMHg4OTA1MjAwOCwgMHg4OTA4ODgxMCwKKzB4ODkwQjg4MjAsIDB4MDAwOUEwMjQsIDB4RDY0M0Q0NDUsIDB4QTAxM0UyMDQsCisweEQ3NDQyNjQyLCAweEUyMENENjQwLCAweDI2NzJBMDBFLCAweEQ2M0VENTQyLAorMHhBMDA5RTIxOCwgMHhENDQxMjY1MiwgMHhFMjBBRDYzQiwgMHgyNjQyQTAwNCwKKzB4RDYzOUQyM0YsIDB4RTIyRTI2MjIsIDB4RDQzRTg1MTUsIDB4MzI3NzY3MEQsCisweDhGMDEyNDIxLCAweDI0NTE2NTAzLCAweDAwMDlCMERGLCAweEUwMDFBMDAxLAorMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwgMHhFMTAxRDYyOSwgMHgyNjEwRDQzNiwKKzB4RDcyODY1NDEsIDB4NjU1REQxMjgsIDB4RTAwMUUyMEYsIDB4MjYyMDI3NTIsCisweDIxMDIwMDBCLCAweDRGMjIyRkU2LCAweDg1MjNEMjFGLCAweDI0NDg2NDBDLAorMHhENjJEOEIwOCwgMHhFMjAwRDUyMSwgMHg4NDUxMjYyMSwgMHgyMDQ5OTQzMCwKKzB4ODA1MUEwMjYsIDB4NjBFMERFMUQsIDB4OEQwQkM4NDAsIDB4MzQyN0UyMDEsCisweEQxMjU4OTIyLCAweDQyMEJEMjI1LCAweEQ1MjUyMTQxLCAweENCMDQ2MDUyLAorMHgyNTAyQTAwQiwgMHg4OTE3MzQyNywgMHhENzIyRDIxRiwgMHgyMjQxNDcwQiwKKzB4RTVGQkQ2MUYsIDB4MjE1OTYxNjIsIDB4ODRFMTI2MTIsIDB4QjEyRENCODAsCisweDYwRTA4MEUxLCAweENCMDRENjFDLCAweDYwNjAyRTAwLCAweDI2MDBDOTNGLAorMHhFMDAxRDYwOSwgMHgyNjAyQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwKKzB4MDAwMEZGN0YsIDB4MDAyMDI4RDksIDB4MDAyMDI4QTAsIDB4MDAyMDI4QUMsCisweDAwMUUxMTAwLCAweDAwMUUxMDBDLCAweDAwMjAyOEQwLCAweDAwMUUxMDAwLAorMHgwMDFFMTAwMSwgMHgwMDIwMkE5MCwgMHgwMDIwMjhCNCwgMHgwMDIwMjhCQywKKzB4MDAyMDJBRkUsIDB4MDAyMDJCMDIsIDB4MDAyMDJCMEUsIDB4MDAyMDJCMjYsCisweDAwMjAyQjMwLCAweDAwMjAyOEI4LCAweDAwMjAyOEM2LCAweDAwMjAxQTMyLAorMHgwMDFFMTEwOCwgMHgwMDIwMUIzRSwgMHgwMDFFMTAxNSwgMHg2MDYwRDY5NiwKKzB4ODkxOUM4ODAsIDB4NjAyMUQyOTUsIDB4OEIxNTg4MDEsIDB4RTUwMUQyOTQsCisweDMwNTY4NTI0LCAweEQxOTM4OTEwLCAweEQ0OTNFMjAzLCAweDY1NDEyMTIwLAorMHg2NTVERTAwQiwgMHhENTkxMDY1NiwgMHhFNzAyRTQwRiwgMHgyNTcxMjE0MCwKKzB4RTAwMUQ3OEYsIDB4MjcwMjAwMEIsIDB4RTAwMDAwMEIsIDB4NEYyMjJGRTYsCisweDg0RTFERThDLCAweDg5MzRDODgwLCAweDg1NTRENTg1LCAweDhGMzAyMDA4LAorMHhENzg5NjEwMywgMHg2NjcyODU1MywgMHg2NTBDNjQwMywgMHg2MjBDODU2NiwKKzB4OEIyNjM1MjAsIDB4RDc4MEQ2ODUsIDB4NjQ0QzY1MUMsIDB4Mjc0MTI2NTEsCisweEM4NDA2MEUwLCAweEQyODI4OTA3LCAweDAwMDk0MjBCLCAweDYwNjJENjgxLAorMHhBMDA4Q0IwNCwgMHhEMTgwMjYwMiwgMHgwMDA5NDEwQiwgMHhFNUZCRDY3RCwKKzB4MjQ1OTY0NjIsIDB4QjBBMTI2NDIsIDB4RDU3NTAwMDksIDB4MjUyMkUyMDEsCisweEQ3N0E2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDcwLCAweEEwMDEyNzAwLAorMHhFMDAwNjAyMywgMHgwMDBCNEYyNiwgMHgyRkE2NkVGNiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RTI0MERBNjksIDB4REM2NjY2QTEsIDB4MzEyMzYxNkQsCisweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LCAweDRFMjEyQTYxLAorMHhEQjZDRDQ2QiwgMHhFNzAwQTAwRiwgMHg3NzAxNjZCMiwgMHg3MTAyNjE2MywKKzB4NjU2MTJCMTIsIDB4NzEwMjY2MTMsIDB4NjI2MTJCMTIsIDB4NjIyRDY1NUQsCisweDMyNUM0MjI4LCAweDYyN0MyNDIyLCAweDhCRUQzMkUzLCAweEM5MDM2MEQzLAorMHg4QjEwODgwMywgMHhFRDA3NkVCMiwgMHg3MTAyNjFFMywgMHg2NzEzMkIxMiwKKzB4NjJFMTcxMDIsIDB4NjU3MTJCMTIsIDB4NjU1RDYyMkQsIDB4MzUyQzQ1MjgsCisweEEwMEMyQ0QwLCAweDg4MDIyNDUyLCAweEEwMDM4QjAxLCAweDg4MDFFMjAzLAorMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NzdENjc2MSwgMHhFQjBGMjQ3MiwKKzB4NkRBMTJDQjAsIDB4OEIwNTJERDgsIDB4RDQ0NUQyNEYsIDB4RTEwMUVFMDAsCisweDI0MTIyMkUyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLAorMHgyRkU2MkZENiwgMHhFMjQwREQzRCwgMHg2MTZENjZEMSwgMHg4OTAwMzEyMywKKzB4NjcyQzYyNjMsIDB4REU0MzM2NzgsIDB4MkQ2MTc3MDMsIDB4RDY0MDQ3MjEsCisweDQ3MjE2NEUyLCAweEUxMDBBMDBFLCAweDcxMDE2NTYyLCAweDI0NTA2MjUzLAorMHg0MjE5NzQwMSwgMHg3NDAxMjQyMCwgMHgyNDUwNDUyOSwgMHg0NTE5NzQwMSwKKzB4NzQwMTI0NTAsIDB4MzI3MzYyMUMsIDB4NDIwMDhCRUUsIDB4NjREMTY2RTIsCisweDM2MkM0MjAwLCAweDhGMDYyNDQ4LCAweEREMzMyRTYyLCAweEU1MDBERTI4LAorMHgyRDUyRTcwMSwgMHg2RUY2MkU3MiwgMHg2REY2MDAwQiwgMHgyRkU2MkZENiwKKzB4RUUwMTRGMjIsIDB4RUQwQUEwMDUsIDB4NjRFM0JDQjYsIDB4NjRFM0JDQkMsCisweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweEVFMDFBMDA1LCAweDY0RTNCQ0JELAorMHg2NEUzQkNDMywgMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjA2MEQ2MUYsCisweDg5NzU4ODAxLCAweEUxMDFENDFFLCAweEQ3MTI4NTQ4LCAweDY1MEQyNjEwLAorMHg0NTE5NjA3MCwgMHg2NjU5REQxQiwgMHg2MUQzNjI2RSwgMHhDODQwMjYyRCwKKzB4NzQwMjcxMDIsIDB4OEQ0N0Q3MTgsIDB4RDIxODY2NkMsIDB4RTUwMURFMEEsCisweEEwMzEyRTIyLCAweDAwMDBFRTA0LCAweDAwMUUxMDAxLCAweDAwMjAyOEM2LAorMHgwMDIwMjhBMCwgMHgwMDFFMTEwMCwgMHgwMDIwMjhDQSwgMHgwMDIwMjhCOCwKKzB4MDAyMDI4RDAsIDB4MDAxRTEwMDAsIDB4MDAyMDI4QkMsIDB4MDAyMDI4QzgsCisweDAwMjAxQTMyLCAweDAwMUUxMTA4LCAweDAwMjAxQjNFLCAweDAwMUUxMDE1LAorMHgwMDFFMTAwQywgMHgwMDIwMjhCNCwgMHgwMDIwMjhENCwgMHgwMDIwMjhEOCwKKzB4MDAyMDJBOTAsIDB4MDAyMDJCMjYsIDB4MDAyMDJCMzIsIDB4MDAyMDJBQTIsCisweDc1MDE2MjQ1LCAweDcxMDIyMTIxLCAweDMyRTM2MjVDLCAweDYwNjM4QkY4LAorMHhFNjAxODFENCwgMHhFNDE3RDUzOCwgMHgzMjQzNjI2QywgMHg2MjU1ODkxRSwKKzB4MjcyMTc2MDEsIDB4NzcwMkFGRjgsIDB4REUzNUQyMzQsIDB4MkUyMkU1MDEsCisweEVFMDRBMDA0LCAweDc1MDE2MjQ1LCAweDcxMDIyMTIxLCAweDMyRTM2MjVDLAorMHg2MDYzOEJGOCwgMHhFNjAxODFENCwgMHhBMDA0RDUyRSwgMHg2MjU1RTQxNywKKzB4MjcyMTc2MDEsIDB4NjI2Qzc3MDIsIDB4OEJGODMyNDMsIDB4MkQyMTkyNEIsCisweEQ3MkFENDI5LCAweDJGMTI2MTQyLCAweDZERjI2NUYyLCAweEM5ODA2MDUzLAorMHg2MDUzMjcwMCwgMHg2MTAzQzk2MCwgMHg2MDUzODA3MSwgMHg2NUYyNkVGMiwKKzB4NEQxOUM5MDMsIDB4ODA3MjQ1MjksIDB4NDUxOTYwREMsIDB4NEUyOTgxNzIsCisweDYyRUM2MDVDLCAweDMwMkM0MDE4LCAweDZENDI4MTczLCAweDJGRDIyMTE4LAorMHg2MkYyNkVGMiwgMHg0MjE5NjZGMiwgMHg2NTZDNDYyOSwgMHg2MDJDNjZGMiwKKzB4NDAxODY0RUMsIDB4MzA0QzQ2MjksIDB4ODE3NDQ2MTksIDB4NDAxODYwNkMsCisweDhGMDczMDVDLCAweEJDQjU4MTc1LCAweDYyMEMwMDA5LCAweDg5MDgyMjI4LAorMHgwMDA5QTAwQSwgMHg4ODQwNjAxMywgMHhCMDBBOEIwMywgMHhBMDAzMDAwOSwKKzB4RDYwQjAwMDksIDB4MjYyMkUyMDIsIDB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsCisweDAwMEI2REY2LCAweDA2MEEwMDA5LCAweDAwMjAyQUQyLCAweDAwMjAyQUQwLAorMHgwMDIwMjhCQywgMHgwMDIwMkFBNCwgMHgwMDFFMTAwQywgMHgwMDIwMjhBMCwKKzB4MDAyMDI4RDAsIDB4N0ZGQzRGMjIsIDB4NjYyMEQyN0UsIDB4OEQwODI2NjgsCisweEQ0N0QyRjYwLCAweDQyMEJEMjdELCAweDY0RjAwMDA5LCAweEEwOTA3RjA0LAorMHg3RjA0NEYyNiwgMHgwMDBCNEYyNiwgMHgwMDBCMDAwOSwgMHgyRkU2MDAwOSwKKzB4REU3NzRGMjIsIDB4NjBFMEQ2NzcsIDB4Q0JDMEQ0NzcsIDB4NjI2MDJFMDAsCisweEM4MDM2MDJDLCAweDQwMjE4OTA0LCAweDcwMDE0MDIxLCAweDY2MDNBMDAyLAorMHg2NjAzNDAwOSwgMHhENjcxNjE2RCwgMHhFNTAwQTAwNCwgMHg3NTAxNjI2MiwKKzB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsIDB4RDE2RDhCRjgsIDB4MDAwOTQxMEIsCisweEU0MDFENjZDLCAweDg0RTIyNjQxLCAweDgwRTJDOUJGLCAweDAwMEI0RjI2LAorMHgyRkU2NkVGNiwgMHhENTY4N0ZGQywgMHg2MjUwREU2MSwgMHg2NDJDODRFMiwKKzB4Q0I0MDc0MDQsIDB4ODBFMjYxNEQsIDB4NDQyMTY0MTMsIDB4RDc2MzQ0MjEsCisweEU2MDBBMDA0LCAweDc2MDE2MjU2LCAweDI3MjIyRjIyLCAweDMyNDM2MjZELAorMHg2MDEzOEJGOCwgMHgyMDA4QzkwMywgMHg4ODAzODkxMiwgMHg4ODAyODkwNSwKKzB4ODgwMTg5MDYsIDB4QTAwODg5MDcsIDB4RTAwNzAwMDksIDB4ODA3OEEwMDUsCisweEEwMDJFMDAzLCAweEUwMDE4MDc4LCAweDYyNTI4MDc4LCAweDI3MjIyRjIyLAorMHhENjUwRTAwRiwgMHg2MDYxODA3OCwgMHg4QjAxODgwMSwgMHgyNjIxRTIwMCwKKzB4NjA2MEQ2NEYsIDB4MjYwMENCMDgsIDB4QzkzRjYwRTAsIDB4N0YwNDJFMDAsCisweDZFRjYwMDBCLCAweDYwMjFEMjQ3LCAweDhEMTg4ODAxLCAweEQyNDY2MTQzLAorMHgyMjEwNjA1MywgMHg2MDYzODAyMSwgMHhENDQ2ODEyMSwgMHhFNTAwQTAwNywKKzB4MDI3QzYwNUQsIDB4MzY0QzY2MDMsIDB4MjYyMDcwMDEsIDB4NjI1RDY1MDMsCisweDMyMTM2MTFDLCAweEQ2NDA4QkY0LCAweEM5QkY2MDYwLCAweDAwMEIyNjAwLAorMHgyRkQ2MDAwOSwgMHg0RjIyMkZFNiwgMHg2MDQzN0ZGQywgMHg4RDAyQzgyMCwKKzB4QkY2QTZFNDMsIDB4NjBFMzAwMDksIDB4ODkwMUM4MTAsIDB4MDAwOUJGNjcsCisweEM4NDA2MEUzLCAweEJGOEM4OTAxLCAweDYwRTMwMDA5LCAweDg5MjlDODAxLAorMHg2MEQwREQzMiwgMHg4RDAzQzgwMiwgMHhENjMxMkYwMCwgMHgwMDA5NDYwQiwKKzB4QzgwNDYwRjAsIDB4RDYyRjg5MDIsIDB4MDAwOTQ2MEIsIDB4NjAyMzYyRjAsCisweDg5MDJDODgwLCAweEM5N0Y2MEQwLCAweDYwMjMyRDAwLCAweDg5MDJDODAxLAorMHg0MjBCRDIyOSwgMHhENTI5MDAwOSwgMHg4ODAyNjA1MiwgMHhEMjI4OEIwMywKKzB4QTAwNUU2MDQsIDB4ODgwMTIyNjAsIDB4RDIyNThCMDIsIDB4MjI2MEU2MDEsCisweDI1MjJFMjAwLCAweEM4ODA2MEUzLCAweEQyMjI4OTE2LCAweDYwRTM2RTIwLAorMHg4OTAyQzgwMiwgMHg0MjBCRDIyMCwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwNCwKKzB4NDIwQkQyMUUsIDB4NjBFMzAwMDksIDB4ODkwNUM4MDgsIDB4N0YwNEQyMUMsCisweDZFRjY0RjI2LCAweDZERjY0MjJCLCAweDRGMjY3RjA0LCAweDAwMEI2RUY2LAorMHgwMDAwNkRGNiwgMHgwMDFFMTAyMCwgMHgwMDIwMjk2QywgMHgwMDIwMERBNiwKKzB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTdEMDAsIDB4MDAxRTEwRkMsCisweDAwMjAwMEY4LCAweDAwMjAyOENDLCAweDAwMTE3RDgwLCAweDAwMUUxMEY4LAorMHgwMDFFMTBBRSwgMHgwMDExN0Q4NCwgMHgwMDFFMTAxNywgMHgwMDFFMTAyMSwKKzB4MDAyMDBGRDgsIDB4MDAyMDBGRkEsIDB4MDAyMDE1ODQsIDB4MDAyMDI4RDAsCisweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxMDJBLCAweDAwMjAxMDNDLAorMHgwMDIwMTA0OCwgMHhENkE4NjQ0QywgMHgzNDZDNzRGRiwgMHgyNDUwMDAwQiwKKzB4NjQ0Q0Q2QTYsIDB4MDAwQjM0NkMsIDB4RDZBNTI0NTAsIDB4MzQ2QzY0NEMsCisweDI0NTAwMDBCLCAweDYxNkQ2MjVDLCAweDQxMTk0MjA4LCAweDYwMTk0MjA4LAorMHg2NDRDNDIwMCwgMHgzMjRDNjcwRSwgMHgyMDdERDE5RSwgMHhDOTBGNDIwMCwKKzB4MDAwQjMyMUMsIDB4Njc2MzIyMDAsIDB4NDIwODYyNUMsIDB4NDIwMDQyMDgsCisweDMyNEM2NDRDLCAweDQyMDBEMTk4LCAweDAwMEIzMjFDLCAweDJGRTYyMjcwLAorMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywgMHgyNzI5RTI5RiwKKzB4NjU3MzZFNTMsIDB4NDcxOTY3NkQsIDB4NjcyRTYyNzksIDB4NDIyMTIyN0QsCisweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LCAweDM0RTg0NjA4LAorMHg2NDRDNDYwMCwgMHgwRTFBMDQ2NywgMHgyMTUwMjVFQiwgMHgwMDBCNEYxNiwKKzB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsIDB4RDI4NDhCN0IsCisweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLCAweEU1MEY4QjczLAorMHhFNDAxQkZBMCwgMHhCRkEzRTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGQTMsIDB4QkZBMEU0MDEsIDB4RTYwMkU1MDYsIDB4NjA2MzQ2MTgsCisweDgxRjJFNDAxLCAweDY1NDNCRjlFLCAweEU0MDE4NUYyLCAweEJGQUE2NTQzLAorMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwgMHhFNDAyNjVGMCwKKzB4NjA1Mzc1NkMsIDB4ODBGOEJGN0UsIDB4QkY4MUU0MDIsIDB4ODRGOEU1MTIsCisweDcwOTBFNDAyLCAweDY1MDNCRjgxLCAweDQ2MThFNjAyLCAweDgxRjY2MDYzLAorMHhCRjdGRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwgMHhFNTAwQkY4QiwKKzB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsIDB4RTAxMDY1NUMsCisweEJGNUZFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYyLCAweDA1RkNFMDEwLAorMHhCRjYyRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjYzRTQwMywgMHhFNTAwRTY0MCwKKzB4QkY3MEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsIDB4RTVGRkU2NDAsCisweEUwMTQ2NTVDLCAweEJGNDVFNDA0LCAweEU0MEYwRjU0LCAweEU1MDRCRjQ4LAorMHgwNUZDRTAxNCwgMHhCRjQ4RTQwRiwgMHhFNTAxNzU4NCwgMHhCRjQ5RTY0MCwKKzB4RTUwMUU0MDQsIDB4QkY1NkU2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsCisweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LCAweDRGMjIwMDA5LAorMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwgMHgyNjY4NjYyMSwKKzB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksIDB4RTQwMUJGMUEsCisweEJGMURFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRjFELAorMHhCRjFBRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFCNjU0MywgMHhFNDAxRTY0MCwKKzB4QkYyODY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsIDB4NjVGMEU2NDAsCisweDc1NkNFNDAyLCAweEJFRkQ2MDUzLCAweEU0MDI4MEY0LCAweEU1MTJCRjAwLAorMHhFNDAyODRGNCwgMHhCRjAwNzA5MCwgMHhFNjQwNjUwMywgMHhCRjAxRTQwMiwKKzB4RTY0MEU1MDAsIDB4QkYwRUU0MDIsIDB4RTY0MEU1MDAsIDB4QkYxNkU0MDIsCisweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTNFNDAzLCAweEU1MTM4MEY4LAorMHhFNDBFQkVFNiwgMHhFNDBFODRGOCwgMHhCRUU2NzA4NSwgMHhFNTAwNjUwMywKKzB4QkVFN0U2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNEU2NDAsIDB4RTUwMEU0MDMsCisweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLCAweEJFQzlFNDA0LAorMHhFNDBGODBGQywgMHhFNTA0QkVDQywgMHhFNDBGODRGQywgMHhCRUNDNzA4MywKKzB4RTUwMTY1MDMsIDB4QkVDREU2NDAsIDB4RTUwMUU0MDQsIDB4QkVEQUU2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLCAweDdGMTA0RjI2LAorMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAzMCwgMHgwMDFFMTA4MCwKKzB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsIDB4MDAyMDI4QzYsCisweDAwMjAyOEM4LCAweDAwMjAyOENBLCAweDAwMDkwMDBCLCAweDY2NkNFNjgwLAorMHg2NTYzRDJBOCwgMHg3NTQwRTcwMCwgMHg2NDczNDIyQiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NEMxOEVDMDEsIDB4REFBM0RCQTIsCisweDY1QjI1MkIxLCAweDg5MjIzNTIwLCAweEM5MDM2MDUxLCAweDg5MUU4ODAxLAorMHhEMTlGREU5RCwgMHg2NEUzNDEwQiwgMHg4NTAzNjUwMywgMHg2NzBENjZBMiwKKzB4REQ5QzM3NjIsIDB4RDQ5Qzg5MEEsIDB4NDIwQkQyOUMsIDB4RDE5QzAwMDksCisweEU3MDFENDlDLCAweDIxNzI0RDBCLCAweDAwMDlBRkUyLCAweDQyMEJEMjlBLAorMHhENjlBNjRFMywgMHg0RDBCRDQ5QSwgMHhBRkQ5MjZDMiwgMHg0RjI2MDAwOSwKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsIDB4N0ZGNDRGMjIsCisweEU2ODE4NTQ2LCAweDg1NDcyRjAxLCAweDgxRjE2NjZDLCAweEQyODU4NTQ4LAorMHg4NTQyODFGMiwgMHg4MUYzNjdGMywgMHhFNDBDODU0MywgMHg2MDUzODFGNCwKKzB4ODFGNTY1NjMsIDB4NzU0MDQyMEIsIDB4NEYyNjdGMEMsIDB4MDAwOTAwMEIsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEQzg0N0ZGMCwgMHhFODAwQTBERCwgMHhEMjgzNkIxMywgMHhFMDAxNEIwOCwKKzB4NEIwMDQyMEIsIDB4MUYwM0RFODEsIDB4M0JFQzg1RjIsIDB4MkY4MjdFMzAsCisweDFGRTI2ODAzLCAweDY2QzJERDdFLCAweDM2MjA1MkMxLCAweEEwQzM4QjAxLAorMHg2MDYxMDAwOSwgMHg4ODAxQzkwMywgMHhBMEJEOEIwMSwgMHg4NTYxMDAwOSwKKzB4ODk2NUM4MDEsIDB4RUUxMDUxNjMsIDB4REE2QTg1MTIsIDB4QzkwMzY2MDMsCisweDg1MTM2NDAzLCAweDQwMjE2MDBELCAweEM5M0Y0MDIxLCAweDhEMUMzMEUzLAorMHhENzcwNjUwMywgMHg2MjcwNDQwOCwgMHg0NDAwNDQwOCwgMHgyMjI4NDUwMCwKKzB4MzQ1QzhGMEEsIDB4NjA0M0QyNkMsIDB4Njk3RDA3MkQsIDB4Njg5OTQ5MTksCisweDY5N0M2RThFLCAweDI4RURBMDA5LCAweDYwNDNEMjY4LCAweDY5N0QwNzJELAorMHg2ODk5NDkxOSwgMHg2OTdDNkU4RSwgMHhFRUZGMjhFRCwgMHg2RUVDNjI5RCwKKzB4OEIwRjMyRTAsIDB4NDEwQkQxNTIsIDB4NTQwMzY0QzMsIDB4QkY4NUU1MDIsCisweEQ0NUY2RTAzLCAweDQ2MEJENjU0LCAweEQ3NUU2NUUzLCAweEQ0NUVFRTAxLAorMHgyN0UyQTAxRCwgMHgyNkU5RUVGQywgMHg4MTEyNjA2MywgMHg5Nzg4ODUxMywKKzB4MjA3OTQyMDgsIDB4ODUxMjgxMTMsIDB4ODExMjIwOEIsIDB4MjAyQjg1MTMsCisweDg1MTQ4MTEzLCAweDQyMThFMjA4LCAweDgxMTQyMDJCLCAweDg1NDE2NEMyLAorMHg4MTQxMjBFOSwgMHhENDUxNjVDMiwgMHhDQjAxNjA1MSwgMHg0QTBCMjUwMSwKKzB4NjBDMjAwMDksIDB4NTJGMzU2RjIsIDB4MkIwMkNCMDEsIDB4MjYyMkFGOEIsCisweEQyMzc4NTYxLCAweDhEMkVDODAyLCAweDQyMEI2NEMzLCAweEQ2NDgwMDA5LAorMHg1RTAzNjUwMywgMHgwNzZFRTA0QywgMHg3NzAxRDE0NiwgMHg2MDEyMDY3NiwKKzB4OEIwNTg4MDEsIDB4RUEwQzg1RTEsIDB4MjBBQjRBMTgsIDB4ODFFMUEwMDcsCisweDg4MDI2MDEyLCAweDg1RTE4QjAzLCAweDIwQTlFQURGLCAweDg1NTE4MUUxLAorMHgyMEE5RUFGQywgMHg2MDUxODE1MSwgMHhDQjAxREEyOCwgMHg0QTBCNjRDMywKKzB4NTZGMjI1MDEsIDB4RDczODUxRjMsIDB4ODVFRjI2MTIsIDB4NDcwQjY0RDMsCisweEFGNTg2NTBELCAweDQyMEIwMDA5LCAweDU0MDMwMDA5LCAweDg1NDQ2RTAzLAorMHg0QTE4RUEwOCwgMHgzMEEwMjBBOSwgMHg4QjAzREExQSwgMHhFNTAxQkYxNiwKKzB4MDAwOUEwMDcsIDB4RDYyRDg1NDEsIDB4MjI2ODYyMEQsIDB4QkYwRDg5MDEsCisweEQ0MjNFNTAwLCAweDQyMEJEMjE4LCAweEQ3MjI2NUUzLCAweEVFMDFENDI4LAorMHgyN0UyNEEwQiwgMHgwMDA5QUYzNywgMHg2OEYyNjA4MywgMHg3ODAxODFGMiwKKzB4NjE4RDdDMDgsIDB4MzFFN0VFMDMsIDB4QUYxRDg5MDEsIDB4N0YxMDAwMDksCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHhGRTAzNjhGNiwgMHgwMDIwMTgzNCwgMHgwMDIwMjg4NCwgMHgwMDIwMjg4QywKKzB4MDAyMDBBNUMsIDB4MDAyMDBEQTYsIDB4MDAyMDI4NTQsIDB4MDAyMDBBREUsCisweDAwMUUyMTMwLCAweDAwMjAyQTcwLCAweDAwMjAwQTdBLCAweDAwMUMzRDMwLAorMHgwMDIwMkE3NCwgMHgwMDIwMjg2NCwgMHgwMDIwMUZENCwgMHgwMDFDM0QwMCwKKzB4MDAyMDJBODAsIDB4MDAyMDJBOEMsIDB4MDAyMDI5NzAsIDB4MDAyMDI5RjAsCisweDAwMjAyODVDLCAweDAwMUUyMTJDLCAweDAwMjAyQTc4LCAweDAwMjAyQTdDLAorMHgwMDIwMjdGOCwgMHgwMDIwMjdGNCwgMHgwMDIwMEUwNiwgMHgwMDAwODAwMCwKKzB4MDAyMDJBODgsIDB4NEYyMjJGRTYsIDB4NkUyMkQyMEQsIDB4Qzg0MDYwRTMsCisweDIyRTI4RDAyLCAweDAwMDlCRTY4LCAweDQyMThFMjQwLCAweDg5MDEyRTI4LAorMHgwMDA5QkU2NCwgMHhDODA1NjBFMywgMHhCRUI5ODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwMkM4MDIsIDB4QUU2MTRGMjYsIDB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsCisweDAwMUMzNTEwLCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMUZGRSwgMHgwMDIwMUZCNCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsCisweDAwMDA2MkY2LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMjBCRSwgMHgwMDIwMjA3NCwgMHgwMDBCRTAwMCwgMHg0MDAxNjJGNiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NjJGNjAwMEIsCisweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMTk0MDAxLAorMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwKKzB4NDAyOTQwMDEsIDB4NjJGNjAwMEIsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDAwMEI0MDI5LCAweDQwMDQ2MkY2LCAweDQwMDQ0MDA0LCAweEM5MEY0MDA0LAorMHg2MkY2MDAwQiwgMHg0MDA0NDAwNCwgMHhDOTA3NDAwNCwgMHg2MkY2MDAwQiwKKzB4NDAwNDQwMDQsIDB4MDAwQkM5MDMsIDB4NDAwNDYyRjYsIDB4MDAwQkM5MDEsCisweDAwMDA2MkY2LCAweDM2MjJFMjE4LCAweDY3NDM4RjEyLCAweDAwMDlBMDA0LAorMHg3NkZGNjI1NCwgMHg3NDAxMjQyMCwgMHhDODAzNjA1MywgMHg2MDQzOEJGOCwKKzB4ODkwMkM4MDMsIDB4NDIyQkQyMkIsIDB4RDIyQjAwMDksIDB4MDAwOTQyMkIsCisweDJGRTY2NDczLCAweDhENEEzNDUwLCAweDI3Nzg2NzYzLCAweDYyNDM4OTQ3LAorMHgyMjdCMjI1QiwgMHhDOTAxNjAyMywgMHg4RDIwMzQ1MiwgMHgyRUU4NkUwMywKKzB4NjAyMzhCMTUsIDB4OEIwOEM4MDMsIDB4NDcwOTY2NDMsIDB4NDcxMDYyNTYsCisweDhGRkIyNjIyLCAweEEwMzI3NjA0LCAweDQ3MDEwMDA5LCAweDYxNDM2NjczLAorMHg0NjEwNjI1NSwgMHg4RkZCMjEyMSwgMHhBMDI4NzEwMiwgMHg2NjQzMDAwOSwKKzB4NDcxMDYyNTQsIDB4OEZGQjI2MjAsIDB4QTAyMDc2MDEsIDB4NjE0MzAwMDksCisweDJFRTgzNTdDLCAweDhGMTUzMTdDLCAweDYwMjM2NjUzLCAweDhCMDdDODAzLAorMHg3NkZDNDcwOSwgMHg0NzEwNjI2MiwgMHgyMTI2OEZGQiwgMHgwMDA5QTAwRiwKKzB4NjU2MzQ3MDEsIDB4NzVGRTY2NzMsIDB4NDYxMDYyNTEsIDB4MjEyNThGRkIsCisweDAwMDlBMDA1LCAweDYyNjA3NkZGLCAweDhGRkI0NzEwLCAweDYwNDMyMTI0LAorMHg2RUY2MDAwQiwgMHgwMDIwMjJBNiwgMHgwMDIwMjc1MiwgMHhFMjFFMkZFNiwKKzB4Njc2MzM2MjYsIDB4OEQxQjYxNTMsIDB4M0UxMDZFNDMsIDB4M0UxMjg5MTYsCisweDY1RTM4OTA4LCAweDM2NzJFNjAwLCAweDYyMTQ4OTEwLCAweDI1MjA3NjAxLAorMHg3NTAxQUZGOSwgMHgzMTdDNjRFMywgMHg2NTEzMzQ3QywgMHhFNjAwQTAwNCwKKzB4NjI1MDc1RkYsIDB4MjQyNDc2MDEsIDB4OEJGOTM2NzIsIDB4NjBFM0EwMTEsCisweDg5MDgzMUUyLCAweDMyN0M2MjEzLCAweDhCMDQzMkU2LCAweDY1MTM2NEUzLAorMHhBMDA4NjY3MywgMHhEMjhGNkVGNiwgMHg2NTEzNjRFMywgMHg0MjJCNjY3MywKKzB4MDAwQjZFRjYsIDB4RTIwNDZFRjYsIDB4Njc0MzM2MjIsIDB4OEYxMDM1NkMsCisweEEwMDQzNDZDLCAweDc1RkYwMDA5LCAweDc2RkY2MjUwLCAweDYwNTMyNDI0LAorMHg4QkY4QzgwMywgMHhDODAzNjA0MywgMHhBMTA1ODkwMSwgMHhBMjc3MDAwOSwKKzB4QTI5OTAwMDksIDB4MkZCNjAwMDksIDB4MkZENjJGQzYsIDB4N0ZFNDJGRTYsCisweDZDNjM2MDQzLCAweDY2NTIxRjYyLCAweEM5MDM3NTA0LCAweDFGNTE2RTUzLAorMHg0NTA4NjUwMywgMHhFMUZDNkQ0MywgMHgyRDE5NDUwMCwgMHgxRjczMjU1OCwKKzB4MUY2NTFGNDQsIDB4MkZEMjhEMEIsIDB4ODgwODYwNTMsIDB4ODgxMDg5MjMsCisweDg4MTg4OTVCLCAweEEwODk4QjAxLCAweEEwQkQwMDA5LCAweDYyNjMwMDA5LAorMHgyRDIyRTYwMCwgMHg3Q0ZDN0QwNCwgMHhFQjEwQTAwRCwgMHhFNjAwNjRFNiwKKzB4N0NGMDY1RTYsIDB4NjJFMjYxRTYsIDB4MUQ1MTJENDIsIDB4MUQyMzFEMTIsCisweDdFMDQ3RDEwLCAweDNDQjIxRkUxLCAweDFGNjU4OUYwLCAweDJGRDIxRkMyLAorMHhBMEExMUZFNiwgMHg2NEQyMUZENCwgMHg0NDI4NjI2MywgMHg0NDI5NDQxOCwKKzB4NDIxODQ0MTksIDB4NDYyOTI0MkIsIDB4MkQ0MjQ2MTksIDB4NjU2MzdEMDQsCisweEEwMjE3Q0ZELCAweDY3RTZFQjEwLCAweDYyRTY3Q0YwLCAweDY0RTY2NjczLAorMHgyNTZCNDYxOCwgMHgyRDUyNjFFMiwgMHg2NTIzNDcyOSwgMHg0NTE4NDcxOSwKKzB4NDIyOTI3NUIsIDB4NDIxOTFENzEsIDB4NDcxODY3NDMsIDB4NDQyOTIyN0IsCisweDQ0MTk2NzEzLCAweDI0N0I0NzE4LCAweDFENDMxRDIyLCAweDQxMTk0MTI5LAorMHg2NTEzN0QxMCwgMHgxRkUxN0UwNCwgMHg4OURDM0NCMiwgMHgxRkU2N0VGRiwKKzB4MUZDMjFGNTUsIDB4QTA2NzJGRDIsIDB4NkNGMjFGRDQsIDB4NjZDMjU3RjUsCisweDQ2Mjg2MjczLCAweDQyMjg0NjI5LCAweDJDNjIyNjJCLCAweDdDMDQ1REYyLAorMHg3REZFNDcyOSwgMHhBMDFDRUIxMCwgMHg2NUU2NUVGMSwgMHg2NkU2NjI3MywKKzB4NDcyODY3NTMsIDB4Njc2MzIyN0IsIDB4NDUyOTYxRTYsIDB4MjU3QjQ3MjgsCisweDJDMjI2NEU2LCAweDY1MTMxQzUxLCAweDQ1Mjg0NjI5LCAweDFDNjIyNjVCLAorMHg0MTI5NjY0MywgMHgyMTZCNDYyOCwgMHg0NDI5MUMxMywgMHg2NzQzN0MxMCwKKzB4M0RCMjdERjAsIDB4MUZEMjg5RTEsIDB4N0VGRUEwMzQsIDB4NTFGNTZDRjIsCisweDYyMTM2NkMyLCAweDQyMjg0NjE4LCAweDQyMTg0NjE5LCAweDJDNjIyNjJCLAorMHg3QzA0NURGMiwgMHg3REZGNDExOSwgMHhBMDFGRUIxMCwgMHg2NUU2NUVGMSwKKzB4NjRFNjdERjAsIDB4NDIyODYyNTMsIDB4NDIxODY3RTYsIDB4NjZFNjIxMkIsCisweDYxNDMyQzEyLCAweDQ1MTk0MTI4LCAweDI1MUI0MTE4LCAweDY1NzMxQzUxLAorMHg0NDE5NDUyOCwgMHgyNDVCNDUxOCwgMHg2NDYzMUM0MiwgMHg0NzE5NDQyOCwKKzB4Mjc0QjQ0MTgsIDB4NDYxOTFDNzMsIDB4NjE2MzdDMTAsIDB4ODlERTNEQjIsCisweDdFRkQxRkQyLCAweDFGQzQxRkU2LCAweDVERjJFNzA0LCAweEEwMEQ1RUY2LAorMHg2MkU0NTFGNCwgMHg2NkU0N0RGQywgMHg2NUU0NjRFNCwgMHg3MTAxMjEyMCwKKzB4NzEwMTIxNjAsIDB4NzEwMTIxNDAsIDB4NzEwMTIxNTAsIDB4ODlGMDNENzIsCisweDY2RDM1N0YzLCAweDY0MTM2NUUzLCAweDZFRjY3RjFDLCAweDZDRjY2REY2LAorMHg2QkY2QTE5MCwgMHgwMDIwMjEzNCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4NjA0MzdGRTQsIDB4NkM2M0M5MDMsIDB4NjYwMzFGNjIsIDB4NDYwODc1RkMsCisweDYxNTI2RTQzLCAweDQ2MDBFMkZDLCAweDI2NjgyRTI5LCAweDFGNDQxRjczLAorMHgxRjUxNkQ1MywgMHg4RDBCMUYxNSwgMHg2MDYzMkZFMiwgMHg4OTFGODgwOCwKKzB4ODk1Mzg4MTAsIDB4OEIwMTg4MTgsIDB4MDAwOUEwODEsIDB4MDAwOUEwQjksCisweEVCMTBBMDBELCAweDUyRDM3REYwLCAweDU0RDE1NkQyLCAweDJFMTY2NUQyLAorMHgyRTY2MkUyNiwgMHgyRTQyN0VGQywgMHgxRkQxNjE1MywgMHgzQ0IyN0NGMCwKKzB4N0QwNDg5RjAsIDB4MUYxNTFGRDYsIDB4MkZFMjFGQzIsIDB4MUZFNEEwQTEsCisweDYyMTM2NkUyLCAweDQyMjk0NjE5LCAweDQyMTk0NjE4LCAweDJFNjIyNjJCLAorMHg3Q0ZGNDExOCwgMHhFQjEwQTAyMSwgMHg1NEQzN0RGMCwgMHg2MjQzNTdEMiwKKzB4NDIxOTQyMjksIDB4NTVEMTIxMkIsIDB4MkUxNjY2RDIsIDB4NDEyOTYxNzMsCisweDQxMTk0NDE4LCAweDJFNDYyNDFCLCAweDQ0Mjk2NDUzLCAweDQ0MTk0NzE4LAorMHgyRTc2Mjc0QiwgMHg0NzI5Njc2MywgMHg0NzE5NDUxOCwgMHgyNTdCN0VGQywKKzB4NDYxODJFNTIsIDB4MUZEMTYxNjMsIDB4M0NCMjdDRjAsIDB4N0QwMzg5REMsCisweDFGMTUxRkQ2LCAweDJGRTIxRkMyLCAweDFGRTRBMDZCLCAweDU3RjU2RUYyLAorMHg2MjczNjZFMiwgMHg0NjI4NDYyOSwgMHgyNjJCNDIyOSwgMHgyRTYyNUNGMiwKKzB4N0NGRTQ3MjgsIDB4QTAxQkVCMTAsIDB4N0RGMDVERjEsIDB4NTVEMjUxRDMsCisweDQ2Mjk2NjEzLCAweDU0RDEyNzZCLCAweDJFNzY2MkQyLCAweDQxMjg2NzUzLAorMHgyMTdCNDcyOSwgMHg2MTQzMkUxNiwgMHg0MTI5NDUyOCwgMHgyRTU2MjUxQiwKKzB4NDQyODY1MjMsIDB4MjQ1QjQ1MjksIDB4NDIyODJFNDYsIDB4N0NGMDY3MjMsCisweDg5RTIzQ0IyLCAweDFGRDY3RDAyLCAweEEwM0ExRkMyLCAweDY3RjIxRkU0LAorMHg2NTcyNTFGNSwgMHg0NTI5NjIxMywgMHg0NTI4NDUxOSwgMHg0MjE5NDUxOCwKKzB4NUNGMjI1MkIsIDB4NDEyODI3NTIsIDB4N0NGRDQxMTgsIDB4QTAyMkVCMTAsCisweDdERjA1REYxLCAweDU0RDI1NkQzLCAweDQ1MTk2NTYzLCAweDUyRDE0NjI4LAorMHg0NjE4MjE1QiwgMHg2RUQyNjU0MywgMHg0NTE5MjcxNiwgMHgyNjVCNDQyOCwKKzB4NjU0MzYxNjMsIDB4NDUxODY0MjMsIDB4NDIyODQ0MTksIDB4NDIxODI1NEIsCisweDI3MTY2NEUzLCAweDQ0MTk2NjIzLCAweDI2NEIyNzU2LCAweDRFMjgyNzY2LAorMHg2MUUzNEUxOCwgMHgzQ0IyN0NGMCwgMHg3RDAxODlEQiwgMHgxRkMyMUZENiwKKzB4RTcwNDFGNzQsIDB4NTFGNDVERjIsIDB4NUVGNkEwMEQsIDB4ODRFMjdFRkMsCisweDYyMDM2NEUwLCAweDdERkM4NEUxLCAweDg0RTM2NTAzLCAweDIxNjQ2NjAzLAorMHgyMTU0MjEyNCwgMHgzRDcyMjE0NCwgMHg1N0YzODlGMCwgMHg2NDEzNjZEMywKKzB4N0YxQzY1RTMsIDB4NkRGNjZFRjYsIDB4QTA5RDZDRjYsIDB4MkY4NjZCRjYsCisweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDYxNDM3NEUwLAorMHg2QTYzNjg3MywgMHg2QjU2RTkyMCwgMHg2QzU2N0FFMCwgMHg2RDU2NzEyMCwKKzB4NkU1NjNBOTIsIDB4NjQ1NjY3NTYsIDB4NjI1NjY2NTYsIDB4MTFDMTIxQjIsCisweDExRTMxMUQyLCAweDExNDUxMTc0LCAweDhERUMxMTY2LCAweDcxMjAxMTI3LAorMHg2NjEzQTAwNCwgMHg3QUZGNjI1NCwgMHg3NjAxMjYyMCwgMHg4QkY5MkFBOCwKKzB4NkVGNjYwODMsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDJGODY2OEY2LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg2QTYzNjg3MywgMHg3NUUwRTkyMCwgMHg1NjU2NTI1NywgMHg1NzU0NTE1NSwKKzB4NUQ1MjVFNTMsIDB4NkI1MjVDNTEsIDB4MjQ2NjI0MjYsIDB4MjQ3NjI0MTYsCisweDdBRTAyNEU2LCAweDI0QzYyNEQ2LCAweDhERUMzQTkyLCAweDY2QTMyNEI2LAorMHg2RUY2Njc4MywgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHhBMDQzNjlGNiwKKzB4MkZFNjY4RjYsIDB4QzgwNDYwNjMsIDB4OEQwNDZFNjMsIDB4NjIxNjYxNTMsCisweDI0MjI3RUZDLCAweDYwRTM3NDA0LCAweDg5MDhDODE4LCAweDcxMDQ2NTEzLAorMHg2MjUyNjYxNiwgMHgyNDIyN0VGOCwgMHhBRkY0MTQ2MSwgMHhFMjA0NzQwOCwKKzB4NjUxMzNFMjIsIDB4NjZFMzhEMDIsIDB4NkVGNkEwMUMsIDB4NkVGNkFGODcsCisweEM4MDQ2MDYzLCAweDYxNjM4RDA0LCAweDYyNTI3NUZDLCAweDI0MjY3MUZDLAorMHhDODE4NjAxMywgMHg3NUY4ODkwNiwgMHg2NjUyNTI1MSwgMHgyNDY2MjQyNiwKKzB4NzFGOEFGRjYsIDB4MzEyMkUyMDQsIDB4NjYxMzhGMDIsIDB4MDAwOUFGQTEsCisweDAwMDlBMDBBLCAweDAwMDlBMDA0LCAweDc2RkY2MjU0LCAweDc0MDEyNDIwLAorMHg4QkY5MjY2OCwgMHg2MDczMDAwQiwgMHgwMDA5QTAwNCwgMHg2MjUwNzVGRiwKKzB4MjQyNDc2RkYsIDB4OEJGOTI2NjgsIDB4NjA3MzAwMEIsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsCisweDQ2MjA1MzU1LCAweDAwMDAzQTU3LCAweDIwNzI2MTRELCAweDMyMjAzMjMyLAorMHgyMDM3MzAzMCwgMHgzNTNBMzQzMSwgMHgzMzM1M0EzNCwgMHgwMDAwMDAwMCwKKzB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsIDB4NjE3NjZFNDksIDB4MjA2NDY5NkMsCisweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLCAweDAwMjE0NDQ5LAorMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywgMHgzRDY0NkU2MSwKKzB4MDAwMDAwMDAsIDB4NjE0Mzc3NDgsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsCisweDY2MjAyMDZFLCAweDBBNkM2OTYxLCAweDAwMDAwMDBELCAweDczNjk2RjRFLAorMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwKKzB4MjEyMTZDNjksIDB4MDAwMDBEMEEsIDB4MDAwMDBEMEEsIDB4MDAwMDAwNDIsCisweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLAorMHgwMDAzMDAwMiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwODAyMDcsIDB4MDIwQTAyMDksIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAwMDMwMDAyLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjA4MDIwNywgMHgwMjBBMDIwOSwgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwKKzB4NzMyMDQxNDIsIDB4MDAzRDcxNjUsIDB4MDAwMDAwNzQsIDB4MDAwMDAwMDAsCisweDAyMDAwMTEyLCAweDQwRkZGRkZGLCAweDEyMjEwQUNFLCAweDIwMTA0ODkwLAorMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwgMHgwNDAwMDAwNCwKKzB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAyMDAsIDB4MDAwMjgyMDUsCisweDA1MDcwMDAyLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLCAweDAxMDA0MDAzLAorMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwgMHgwMEZGMDQwMCwKKzB4MDUwNzAwMDAsIDB4MDA0MDAyMDEsIDB4ODIwNTA3MDAsIDB4MDAwMDQwMDIsCisweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDMwNDA1LCAweDAzMDQwMTAwLAorMHgwMzBDMDQwOSwgMHgwMDc5MDA1QSwgMHgwMDQxMDA0NCwgMHgwMzE4MDA1MywKKzB4MDA1MzAwNTUsIDB4MDAzMjAwNDIsIDB4MDAzMDAwMkUsIDB4MDA1NzAwMjAsCisweDAwNDEwMDRDLCAweDAwMDAwMDRFLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDcwOSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0xMTEwNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV90eHN0cmVhbS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X3R4c3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3N2NiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV90eHN0cmVhbS5jCkBAIC0wLDAgKzEsMTAxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFOTQ3RkZDLCAweEUxMTRENTk0LAorMHgxRTEzRDQ5NCwgMHg2NzUyMUU0QywgMHhENDk0RDY5MywgMHgzNzQwMjc2OSwKKzB4NjI1MjhGMDYsIDB4NzIwMUQ2OTIsIDB4NjA2MDI1MjIsIDB4MjYwMEM5M0YsCisweEQ3OTA2MTUyLCAweDI1MTI2MTFELCAweDI2NEI2NjUyLCAweDI1NjI0NzBCLAorMHgwMDA5QjAxNywgMHhFNjAwOTVBQywgMHhDODQwNjBFMiwgMHgyRjAyOEYwMywKKzB4OEZGOTM2NTIsIDB4RDQ4ODc2MDEsIDB4NEUwQkRFODgsIDB4RDQ4ODAwMDksCisweDAwMDk0RTBCLCAweDRFMEJENDg3LCAweDdGMDQwMDA5LCAweEEwNTI0RjI2LAorMHg0RjIyNkVGNiwgMHg0MTBCRDE4NCwgMHhENDg0MDAwOSwgMHgwMDA5NDQwQiwKKzB4NDUwQkQ1ODMsIDB4RDc4MzAwMDksIDB4RDI4M0UxRkYsIDB4MjcxMjYxMUQsCisweEQ0ODI1MDI5LCAweEUxRkZDQjAxLCAweDEyMDlFNTAxLCAweDEyMTEyMjEyLAorMHhFNzIwMjQ1MiwgMHg0NzE4RDU3RSwgMHgyNTcyRDI3RSwgMHhEMTdFRTcwMCwKKzB4RDY3RkQ0N0UsIDB4RTIwMTIyNzAsIDB4MjQ3MDIxNzIsIDB4RDY3RDI2MjAsCisweDI2NDFFNEZGLCAweEQ1N0NFNjAwLCAweDY2NkRFMTA0LCAweDc2MDE2MDYzLAorMHg0MDAwNjI2RCwgMHg4RkY4MzIxMiwgMHhENTc4MDU0NSwgMHgyNTIwRTIwMSwKKzB4RDI3OEQ3NzcsIDB4RTQ4MEUxMDAsIDB4MjIxMjI3MTAsIDB4NjYxM0Q1NzYsCisweDY2NkQ2NDRDLCAweDc2MDQ2NzYzLCAweDM3NUM2MjZELCAweDhGRjgzMjQzLAorMHhENTcyMjcxMiwgMHhEMjczRDc3MiwgMHhFNDAwRTEwMSwgMHgyNzEwMjUxMSwKKzB4MDAwQjRGMjYsIDB4N0ZDQzIyNDIsIDB4RDE3MEQ1NkYsIDB4RDI3MURCNzAsCisweDFGNTFENDcxLCAweEQ2NzE3NTA4LCAweDFGMTJENzcxLCAweDFGNTU3MTBDLAorMHgxRkI5NzVGQywgMHg3MjA0MUYyQSwgMHgxRjEzRUIxMCwgMHgxRjU2MUY0NCwKKzB4MUY3ODFGNjcsIDB4RDg2QjFGMkIsIDB4REQ2Q0Q5NkIsIDB4REM2Q0VBMDAsCisweEQyNkRERTZDLCAweDg5MDAzQTIyLCAweEQxNUQ3QTAxLCAweDg4MDE2MDEwLAorMHg1NkY4OEIwMywgMHg0MjE4RTIwMSwgMHhEMTY4MjYyMiwgMHgwMDA5NDEwQiwKKzB4NDQwQkQ0NjcsIDB4RDU2NzAwMDksIDB4MDAwOTQ1MEIsIDB4NjAxMEQxNTAsCisweDhCMTA4ODAxLCAweEU2NTBEMTRGLCAweDQ2MTg2MjEyLCAweDhCMDgzMjY2LAorMHg1NkY5RDE0QiwgMHgyMTIwRTIwMCwgMHhDQjAxNjA2MiwgMHgyNjAyQTAwMywKKzB4NzIwMTI3MTAsIDB4NjA4MjIxMjIsIDB4ODkwOTg4MDEsIDB4RTJDOEQxNUEsCisweDYyMkM2NjEyLCAweDg5MDMzNjI2LCAweDYwMTBEMTU4LCAweDhCQzg4ODAxLAorMHg1MUY2Njc5MiwgMHgyMTcyNTJGNSwgMHhENjU1NTE5MSwgMHg1NUZBMjIxMiwKKzB4NTJGQjY0NjIsIDB4NTU2MTI1NDIsIDB4MjI1MkU0MDAsIDB4NjE0MzY2NDMsCisweDA1REU2MDEzLCAweDM2Q0M0NjA4LCAweDA3REUyNjUyLCAweEM5MDM2MDcxLAorMHg4QjAyODgwMSwgMHg3MjAxNjJFMiwgMHg3NDAxMkUyMiwgMHgzNkIzNjY0QywKKzB4NzEwNDhGRUUsIDB4NjZDMkQxNDcsIDB4NDUyODY1MTIsIDB4MjY1QjQ1MTgsCisweDYwODIyQzYyLCAweDg5MDE4ODAxLCAweDAwMDlBMTY4LCAweDYyNzJENzQyLAorMHg4QjEzMjIyOCwgMHhENDJCRDc0MSwgMHg2NzcyRDU0MSwgMHg1MTUzNjI0MiwKKzB4MzEyQzMyN0MsIDB4MjQyMjIyMjgsIDB4MTUxMzhEMDUsIDB4NjI2MkQ2M0QsCisweEIxNjI3MjAxLCAweEQ2MjMyNjIyLCAweDI2MjJFMjAwLCAweDUyOTE2NjkyLAorMHg4QjAxMzYyMCwgMHgwMDA5QTE0NCwgMHg2MDYxQTA2RSwgMHgwMDFDMDAxQywKKzB4MDAxRDQwMjAsIDB4MDAwMEIzOEUsIDB4RkZGRjAwMDAsIDB4MTIzNDAwMDAsCisweDAwMUUxMDE1LCAweDAwMjAxMjc0LCAweDAwMjAzOUY0LCAweDAwMjAxOEEyLAorMHgwMDIwM0EwMCwgMHgwMDIwM0ExOCwgMHgwMDIwMTg2MCwgMHgwMDIwMTk2QywKKzB4MDAyMDEyODgsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMjAzOEY0LCAweDAwMjAzNDhDLCAweDAwMjAzOEZDLCAweDAwMjAzOTA4LAorMHgwMDIwMzkxNCwgMHgwMDIwMzk3MCwgMHgwMDIwMzk3NCwgMHgwMDIwMzkxQywKKzB4MDAyMDM5MUQsIDB4MDAyMDM5MjAsIDB4MDAxMTc3MDAsIDB4MDAyMDM5OEMsCisweDAwMjAzOThBLCAweDAwMjAzNEYwLCAweDAwMTE3NzEwLCAweDAwMUMzRDMwLAorMHgwMDFDMzZGOCwgMHgwMDExNzczNCwgMHgwMDFDMzY4NCwgMHgwMDFDM0QwMCwKKzB4MDAxQzEwMDAsIDB4MDAxQzEwMjgsIDB4MDAyMDM1MDQsIDB4MDAyMDM5MjQsCisweDAwMTE3NjAwLCAweDAwMTE3NzQwLCAweDdGRkZGRkZGLCAweDAwMjAxNzMwLAorMHgwMDIwMzMyQSwgMHgwMDIwMjMzNCwgMHgwMDIwM0RBNCwgMHgwMDIwMzk3MiwKKzB4MDAyMDM0RkMsIDB4MDAyMDM5NjQsIDB4MDAxQzNEMkMsIDB4MDAxQzM2QjAsCisweDAwMjAzNDk0LCAweDAwMTE3NzVDLCAweDg4MDFDOTBGLCAweEEwQ0Y4OTAxLAorMHhEMTk2MDAwOSwgMHgzNjIwNjIxMiwgMHhENDk1ODkwNCwgMHgyNDIxRTIwMCwKKzB4MjE2MkEwQ0MsIDB4NjIxMUQxOTMsIDB4ODkwMTIyMjgsIDB4MDAwOUEwQzMsCisweEUyMDJENzhGLCAweDc1MDE2NTcxLCAweDMxMjM2MTVELCAweDI3NTE4RDAyLAorMHgwMDA5QTBCQywgMHhEMjhDNTdGMiwgMHg2MjIyNjA3MiwgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEYxOTg4MEEsIDB4NTJGMzFGMkMsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDhDOTBGLCAweEEwQTc4OTAxLCAweDYwNjMwMDA5LAorMHhDQjAxNTRGNywgMHhEMjdFNTVGMiwgMHhFNzAxMjQwMiwgMHhENDdGRTEwMCwKKzB4MjIxMTI1NzIsIDB4NzIwMTYyNDIsIDB4MjQyMkEwOTgsIDB4OEIzRjg4MDUsCisweDYwMjI1MkYzLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMTY4ODAyLAorMHhFNEZGRDU3NywgMHg2NDRENjc1MiwgMHg4QjEwMjc0OCwgMHg2MjcyRDc3NSwKKzB4OEIwQzMyNjAsIDB4NTFGMjU1RjcsIDB4RDI2REU3MDEsIDB4MjE3MjI1NjIsCisweEQ1NzFFMTAwLCAweDY0NTIyMjExLCAweEEwNzc3NDAxLCAweDUyRjMyNTQyLAorMHg0MDE5NjAyMiwgMHg0MDA5NDAwOSwgMHg4ODA1QzkwRiwgMHgzMUIzOEI2RSwKKzB4RDI2QThCNkMsIDB4NjcyMjU0RjQsIDB4NzcwMUQ1NjksIDB4NjE0MjIyNzIsCisweDFGMUNFNjQwLCAweDQ2MTgyMTU5LCAweDhCMDMzMTYwLCAweDYyNjJENjY1LAorMHgyNjIyNzIwMSwgMHhFMjAwRDY1QSwgMHgyNjIxQjA2NywgMHgwMDA5QTA1NiwKKzB4MzEyM0UyMjAsIDB4ODgwMzhCNTIsIDB4NTJGMzhCMUUsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDNDOTBGLCAweEQyNUI4QjE2LCAweDY3MjI1NEY0LAorMHg3NzAxRDU1NywgMHg2MTQyMjI3MiwgMHgxRjFDRTY0MCwgMHg0NjE4MjE1OSwKKzB4OEIwMzMxNjAsIDB4NjI2MkQ2NTUsIDB4MjYyMjcyMDEsIDB4RTIwMEQ2NDgsCisweDI2MjFCMDQzLCAweDAwMDlBMDEwLCAweEQ0NTJENTUxLCAweEQyNDQ2NzUyLAorMHhFMTAwNzcwMSwgMHgyNTcyM0E0NiwgMHgyMjExOEYwNiwgMHhFQTAwRDY0RSwKKzB4NzIwMTYyNjIsIDB4MjYyMkIwMzEsIDB4MkZCMkQ1NEMsIDB4OTU3MzY2NTIsCisweEQ0NEE1QkYxLCAweDM2MjA1MjQxLCAweDYwNjE4OTEwLCAweDhCMDFDODAzLAorMHgyQjIyRTIwMSwgMHg4RkY1NDUxMCwgMHg1N0YxNTY2NCwgMHg2MjcyRTFGMCwKKzB4NDEyODQxMTgsIDB4MjcyMjIyMUIsIDB4NkJGMkEwMDgsIDB4NkJGMkEwMDYsCisweEUyMDBENjJGLCAweEQxMkYyNjIxLCAweDIxMjFFMjAwLCAweEQxM0NFMjAxLAorMHg2NjEyMjgyMiwgMHg4QjAxMjY2OCwgMHgwMDA5QUUyQiwgMHg0NTBCRDUzOSwKKzB4RDEzOTAwMDksIDB4QUUyNEU2MDAsIDB4MkY4NjIxNjAsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjQ0RjIyLCAweERFMzREMTMzLAorMHg1NDExNjIxMiwgMHgxRjQxNjdFMiwgMHgyRjIyRDQzMiwgMHhENTMyMUY3MiwKKzB4RDIzMjY3NDMsIDB4NTg0MTc3OTQsIDB4Njk0MjVBNDIsIDB4NUIxNjZDNzIsCisweDYwNTI2RDIyLCAweENCMjBFNjAwLCAweEU1NDAyNTAyLCAweDYyNkQ3NjAxLAorMHg4QkZCMzI1MywgMHg1NUYxNjJGMiwgMHgxMTUxMjEyMiwgMHhENjI4NTVGMiwKKzB4MTQ4MTJFNTIsIDB4MjQ5MjE0QTIsIDB4MjdDMkQ0MjYsIDB4MjZEMjExQjYsCisweERBMjU2NzQyLCAweEU4MDFEOTI1LCAweDQ5MEIyQTcyLCAweEUyMDExQThDLAorMHgxQTJDNDIxOCwgMHg0RjI2N0YwQywgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4MDAwMDA3RDEsIDB4MDAyMDM5ODQsCisweDAwMjAzOTg4LCAweDAwMjAzOThFLCAweDAwMUMzREMwLCAweDAwMTE3NzJDLAorMHgwMDFDM0I4OCwgMHgwMDIwMzk2QywgMHgwMDExNzczQywgMHgwMDExNzc0NCwKKzB4MDAwMEYwMDAsIDB4MDAxMTc3NjQsIDB4MDAxMTc3NDgsIDB4MDAxMTc3NjgsCisweDAwMTE3NzZDLCAweDAxRkZGRkZGLCAweDAwMTE3NzRDLCAweDAwMjAzNEZDLAorMHgwMDIwM0RBNCwgMHgwMDIwMjRGOCwgMHgwMDIwMzk3MiwgMHgwMDFDM0I5QywKKzB4MDAxQzNEOTgsIDB4MDAxQzM3MDAsIDB4MDAxQzM1MDAsIDB4MDAxQzU5NjAsCisweDAwMUM4OTYwLCAweDAwMjAzNTA0LCAweDAwMUMzRDAwLCAweDAwMjAxNjBDLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REU5NTdGQUMsIDB4NjFFMEUwMTQsIDB4MEYxNEQ0OTQsIDB4NzEwMTYxRTMsCisweEUwMTg2MjEwLCAweEQyOTIwRjI0LCAweDAwMDk0MjBCLCAweDQ1MEJENTkxLAorMHgyMDA4MDAwOSwgMHg4RjEyNkQwMywgMHhEMjhGMUYwNywgMHg2NzIwRDQ4RiwKKzB4NjU3Q0REOEYsIDB4NDcwQkQ3OEYsIDB4RDE4RjAwMDksIDB4NjE5QzY5MTAsCisweDQ2MDg2NjEzLCAweDM2MTg0NjA4LCAweDNENkM0NjA4LCAweEUwMTgxRkQ3LAorMHhFNTgwMDRGQywgMHg2MDRDNjZFMiwgMHgzMDUwNjU1QywgMHgyRDYyOEYxNSwKKzB4MDFGQ0UwMTQsIDB4REU4NUU1MDAsIDB4NjQxQ0EwMDgsIDB4Njc1MzY1NUQsCisweDYwNzAzN0VDLCAweDM5REM2OTUzLCAweDgwOTQ3NTAxLCAweDMyNDM2MjVELAorMHhENjdGOEJGNCwgMHhBMzRFRTIwMCwgMHgyMDA4MjYyMSwgMHhFMDE0OEIxMywKKzB4RTQwMDAxRkMsIDB4QTAwOURFNzksIDB4NjQ0RDY3MUMsIDB4MzVFQzY1NDMsCisweDY5NDM2NjUyLCAweDM5REM2MjYyLCAweDc0MDQxOTIxLCAweDMyNzM2MjRELAorMHhBMzM4OEJGMywgMHg4ODAxMkQxMCwgMHhFMDE0OEIxNywgMHhFNzAwMDFGQywKKzB4NkQxQzJENzAsIDB4REU2RDFGRDQsIDB4MzJEMzYyN0QsIDB4QTMyQThCMDEsCisweDY3N0QwMDA5LCAweDY2NzM2NUUzLCAweDYxNzM3NTA0LCAweDMxNUMzNkVDLAorMHg2OTEyNjQ2MiwgMHhBRkVGNzcwOCwgMHg4ODA0MjQ5MiwgMHhFMDE0OEIxOCwKKzB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFNjAsIDB4OEIwMTMyNzMsCisweDAwMDlBMzExLCAweDY5NDM2NDRELCAweDM5RUM2MkUzLCAweDcyMDQ2NTkyLAorMHgzRDJDNkQ0MywgMHg2MTUyNjZEMiwgMHgyMTY5NzQwOCwgMHgyNTEyQUZFRCwKKzB4OEIxODg4MDUsIDB4MDFGQ0UwMTQsIDB4MkQ0MEU0MDAsIDB4REU1MzY3MUMsCisweDMyNzM2MjRELCAweEEyRjY4QjAxLCAweDY0NEQwMDA5LCAweDYyRTM2OTQzLAorMHg2NTkyMzlFQywgMHg2RDQzNzIwNCwgMHg2NkQyM0QyQywgMHg3NDA4NjE1MiwKKzB4QUZFRDIxNkIsIDB4ODgzMTI1MTIsIDB4RDQ0QThCM0EsIDB4NjE0NkQ5NEEsCisweDc1MDQ2NTQzLCAweDY3NTY2NDQyLCAweDZFNTMxRjQ4LCAweDY1NTI3RTA0LAorMHg3RUU0NjJFMiwgMHg3RTA0NjRFMiwgMHg2RUUyMUZFOSwgMHg1RUY5MjlFMCwKKzB4N0UwNEQ5NDIsIDB4MUZFQTYwRTIsIDB4MjkwMEM5MDEsIDB4RDk0MDZFRTIsCisweDI5RTA0RTA5LCAweDJGNTYyRjI2LCAweDU2RkFEOTNFLCAweDY1MTM0OTBCLAorMHhEMTNEN0YwOCwgMHhFNzFDNkUwRCwgMHgxREUxMkQ3MCwgMHhERTNCNjkxMiwKKzB4NjRFMjFEOTIsIDB4MUQ0M0QxM0EsIDB4RDIzQTY1MTIsIDB4NjcyMjFENTQsCisweDFENzVEMjM5LCAweDFENjY2NjIyLCAweDYyNjJENjM4LCAweDFEMjdBMkFCLAorMHg4QjM5ODgzMCwgMHg2NTk2RDkyQiwgMHg2NzkyNjY5NiwgMHg2MTk2NzkwNCwKKzB4NzRFNDY0OTMsIDB4NkU0MzY5OTIsIDB4MUY5QjdFMDQsIDB4MUZFQzY0NDIsCisweEQ5MjU2RUUyLCAweDVFRkMyOUUwLCAweDdFMDREOTI0LCAweDFGRUQ2MEUyLAorMHgyOTAwQzkwMSwgMHhEOTIyNkVFMiwgMHgyOUUwNEUwOSwgMHg1OUZDN0ZGQywKKzB4REUyNzJGOTIsIDB4MkYxNjRFMEIsIDB4RDQxRjdGMDgsIDB4RTIxQzYxMEQsCisweDFEMTEyRDIwLCAweEQyMjA2NDQyLCAweEQ0MUMxRDQyLCAweDFENTM2NTQyLAorMHg2NzUyRDUxQiwgMHhENzFCMUQ3NCwgMHgxRDE1NjE3MiwgMHgxRDY2NjYyMiwKKzB4NjI2MkQ2MUEsIDB4MUQyN0EyNkYsIDB4OEIzNTg4MzMsIDB4NDkwQkQ5MTksCisweEEyNjhFRTAwLCAweDAwMDAyREUwLCAweDAwMTE3ODAwLCAweDAwMjAzQTFDLAorMHgwMDIwMThBMiwgMHgwMDIwMkFBQywgMHgwMDIwMzkwRSwgMHgwMDIwM0EyMCwKKzB4MDAyMDM1MzQsIDB4MDAyMDE4RUUsIDB4MDAyMDM5MEQsIDB4MDAxMTc4MDQsCisweDAwMjAzOThDLCAweDAwMTE3ODEwLCAweDAwMjAzOTA5LCAweDAwMjAzOTBBLAorMHgwMDIwMzkwQiwgMHgwMDIwMEY2NCwgMHgwMDFDNTg2NCwgMHgwMDFDNjg2NCwKKzB4MDAxQzc4NjQsIDB4MDAxQzU5QkMsIDB4MDAxQzY5QkMsIDB4MDAxQzc5QkMsCisweDAwMjAwRkJDLCAweDAwMjAwRkI4LCAweDg5MDE4ODI4LCAweDAwMDlBMEMwLAorMHhFNjQzREVCNSwgMHgzMjY2NjJFMSwgMHgxRkVFOEYwMiwgMHgyRTIxRTI0MCwKKzB4NjIyRDYyRTEsIDB4OEIwMTMyNjcsIDB4MDAwOUEwQUEsIDB4RTUwMTg1RTEsCisweDhCMDEzMDU2LCAweDAwMDlBMEE0LCAweDJEMTBFMTAxLCAweDY0RTFCMjI1LAorMHhFNjQzNTdGRSwgMHg2NTJENjI3MSwgMHg4OTQ0MzU2NywgMHgzNTYzRTY0MCwKKzB4RTYwMDhCMDUsIDB4MEY2NUUwNDAsIDB4QTAwRkUxMUEsIDB4NjE1MzcyQzAsCisweDQxMjE0MTIxLCAweDQxMjE0MTIxLCAweDQ1MjE0MTIxLCAweDQ1MjE0NTIxLAorMHhDOTAzNjA1MywgMHhFMDQwNjYwMywgMHg3MTE4MEY2NSwgMHgyMjA5RTAwNywKKzB4MEYyNUUwM0MsIDB4RTA0NDY0MUQsIDB4QjJBMzY1RjMsIDB4RTMzQzBGNDYsCisweDg1MzIzM0ZDLCAweDYyMERERTk1LCAweDQyMDg2MDMxLCAweDYwMjM2MTBELAorMHgxMzIzRTk0NCwgMHgwNkZFNDEwOCwgMHhFMDBGMzlGQywgMHgxMzE0NEUwQiwKKzB4NjcwNzVEOTEsIDB4NjBEMzI2NzksIDB4MEY2NjU0RkUsIDB4NTE5Mjg1NDIsCisweDYwMEQ0RTBCLCAweDYwRDMyNjBCLCAweDBGNjY2NDkyLCAweDY1RjNCMjM3LAorMHg2OTYxNTZGRSwgMHhFNjQwNjU5RCwgMHg4OTM4MzU2MywgMHhENzgzNTlGRSwKKzB4NzkwNjY1OTEsIDB4QzkwMzYwNTMsIDB4NDAwMDQwMDgsIDB4NjEwMzYyMDMsCisweDBGMjZFMDUwLCAweDQ3MEJFMEZGLCAweDZDMDc2MDBDLCAweDY2MDM2MDVELAorMHg0NjIxNDYyMSwgMHg0NjIxNDYyMSwgMHg0MjAwNjI2MywgMHg0MjAwMzI2QywKKzB4NDAyMTQwMjEsIDB4NDAwOEM5MDMsIDB4NkQyRDMwRkMsIDB4RTgwMDZBMDMsCisweEIyNTc2NUYzLCAweDZFQTI2NEQzLCAweDJFQzlFMDUwLCAweDY2OTQyQUUyLAorMHhENzZFMDFGRSwgMHg2MDZDNDcwQiwgMHgyQUUyMkUwQiwgMHg2NEQzNjVGMywKKzB4NzgwMUIxRkQsIDB4RUUwNjYyOEQsIDB4OEZFOTMyRTMsIDB4NUVGRTdEMDEsCisweDYxRTFFNDAwLCAweDQxMDA4NUUxLCAweDY2RTMzMTBDLCAweDc2MEM3MTFCLAorMHhFNzA0NjVGMywgMHg2ODY2NzQwMSwgMHgzQTczNkE0RCwgMHg4RkY5MjU4MiwKKzB4NjVGMzc1MDQsIDB4NjQxREIxRTMsIDB4NjRFMUIxQTQsIDB4MDAwOUExN0IsCisweEQ0NUI1NkY3LCAweEVDMDFEMjVCLCAweDI2QzA0MjBCLCAweDAwMDlBMTczLAorMHgwNkZDRTAxOCwgMHg4ODI5NjA2QywgMHg1OEY3OEIwOCwgMHhFNDAwRDI1MiwKKzB4NjYyMjI4NDAsIDB4NjQ2REIxNzEsIDB4MDAwOUExNjUsIDB4NjY2Q0U2ODEsCisweDg5MDEzMDYwLCAweDAwMDlBMEFDLCAweEQ1NTBEMTRGLCAweDYyMTI2QTU2LAorMHgyMTIyMzJBQywgMHg1NDExNkM1NiwgMHgzNENDNjI1MywgMHg2NDUyMTE0MSwKKzB4NzIwODU4MTIsIDB4RDQ0QTM4NEMsIDB4NjgyMjExODIsIDB4NUExMzZDNDIsCisweDNBQ0MzQzhDLCAweDExQTMyNEMyLCAweDZDMjI3MkVDLCAweDcyMTA1ODE0LAorMHgxMTg0MzhDQywgMHg1QTE1NjgyMiwgMHgxMUE1M0E4QywgMHg2QTIyNzIxMCwKKzB4RDY0MDU4MTYsIDB4MTE4NjM4QUMsIDB4NTIxNzZDNjIsIDB4MTEyNzMyQ0MsCisweDVBMTg1ODYxLCAweDExQTgzQThDLCAweDVDMTk1QTYyLCAweDExQzkzQ0FDLAorMHg1MjFBNUM2MywgMHgxMTJBMzJDQywgMHg1QTFCNTg2NCwgMHgxMUFCM0E4QywKKzB4NUMxQzVBNjUsIDB4MTFDQzNDQUMsIDB4NTIxRDVDNjYsIDB4MTEyRDMyQ0MsCisweDVBMUU1ODY3LCAweDExQUUzQThDLCAweDU2MUY1QTY4LCAweDM2QUNFODQwLAorMHgxMTZGREEyRCwgMHg2Q0EyMzgxQywgMHg3QTk0NjY4MiwgMHgyODYyMzZDQywKKzB4NUM4MTYyQTIsIDB4MThDMTNDMkMsIDB4NjJBMjdBNDQsIDB4MzYyQzU2ODIsCisweEQ2MjYxODYyLCAweDVBODU2MjYyLCAweDNBMkM0MjI5LCAweDc2MDQxOEE1LAorMHg1Njg2NjI2MiwgMHgzNjJDNDIyOSwgMHg1NkY3MTg2NiwgMHgyNjIwRTIzOCwKKzB4MTZDMTVDODEsIDB4MTYyMjYyMTIsIDB4RTIwMDVDMTEsIDB4NTUxMjE2QzMsCisweDU1MTUxNjU0LCAweDU1MTMxNjU1LCAweDU1MTYxNjU2LCAweDU1ODIxNjU3LAorMHg2NTgyMTY1OCwgMHg1NTE0MTY1OSwgMHg1NTg0MTY1QSwgMHg1NTgzMTY1QiwKKzB4NTU4NTE2NUMsIDB4NTU4NjE2NUQsIDB4MTgyMTE2NUUsIDB4MTEyMTIxMjIsCisweDExMjUxMTIyLCAweDExMjYxMTIzLCAweDI4MjIxODIyLCAweDE4MjQxMTI0LAorMHgxODI1MTgyMywgMHgxODI2QTBDNywgMHgwMDExNzgwNCwgMHgwMDIwMzNFOCwKKzB4MDAyMDNBNDAsIDB4MDAyMDE4QTIsIDB4MDAyMDM0OTQsIDB4MDAxQzM2QTAsCisweDAwMjAzNEYwLCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHg2NjZDRTY4MiwgMHg4QjIwMzA2MCwgMHhFQTI0NTZGNywgMHgyNkEwRDE5NCwKKzB4MTZDMTVDMTcsIDB4MTYyMjUyMTgsIDB4MTY4MzU4MTksIDB4MTZBNDVBMUEsCisweDE2QzU1QzFCLCAweDE2MjY1MjFDLCAweEUyMDA1ODFELCAweDU1MUUxNjg3LAorMHg1NTFGMTY1OCwgMHgxMTI3MTY1OSwgMHgxMTI5MTEyOCwgMHgxMTJCMTEyQSwKKzB4MTEyRDExMkMsIDB4QTA4RTExMkUsIDB4RTY4MzExMkYsIDB4MzA2MDY2NkMsCisweDUyRjc4QjBCLCAweEVBMDBEODgzLCAweDY1ODIyMkEwLCAweDc4MDREQzgyLAorMHg2MjgyMkM1MiwgMHhBMDdFRDY4MSwgMHhFNjkwMjYyMCwgMHgzMDYwNjY2QywKKzB4REE3RjhCMDYsIDB4MDAwOTRBMEIsIDB4RTIwMDU2RjcsIDB4MjYyMEEwNzMsCisweDY2NkNFNjkxLCAweDhCMTAzMDYwLCAweDYyMjJEMjc2LCAweDIyMjg2MjJDLAorMHhEMjc4ODkwNCwgMHgwMDA5NDIwQiwgMHgwMDA5QTAwMywgMHg0MjBCRDI3NiwKKzB4NTZGNzAwMDksIDB4QTA1RUUyMDAsIDB4RTY5MjI2MjAsIDB4MzA2MDY2NkMsCisweEUwMTg4OTUxLCAweEU2QjAwQkZDLCAweDY2NkM2MkJDLCAweDhCMkEzMjYwLAorMHgwMkZDRTAxNCwgMHg2ODJDRUEwMCwgMHg2MkFERTkwNCwgMHg4OTRBMzI4MywKKzB4NkFBRERENjQsIDB4M0NEQzZDQTMsIDB4N0QwNDZFQzIsIDB4REI2OEQ0NjcsCisweDMyREM2MkEzLCAweDRCMEJEQzY3LCAweDRDMEI2RDIyLCAweEQ0NjY2NEUzLAorMHgwMDA5NEIwQiwgMHg2NEQzNEMwQiwgMHg0QjBCRDQ2NCwgMHhFNjAwMDAwOSwKKzB4NjY2RDZCRTMsIDB4NzYwMTNCNkMsIDB4MzI5MzYyNkQsIDB4OEZGNzJCRDAsCisweEFGREE0RDE5LCAweEU2QjU3QTA4LCAweDMyNjA2NjZDLCAweEQ0NUM4QjEzLAorMHg0QjBCREI1NywgMHhEMjVCMDAwOSwgMHg2MDIyREI1QiwgMHhDQjIwRTZGRiwKKzB4MjIwMjY2NkQsIDB4REI1OTJCNjIsIDB4RTAxNEUyMDAsIDB4NTZGNzJCMjAsCisweEEwMTAwMkZDLCAweEQ0NTYyNjIwLCAweDY1NDJEMjU2LCAweDQyMEJENDU2LAorMHhBMDA4MDAwOSwgMHhEQjUyMDAwOSwgMHg1MkIxRTYwMCwgMHg2MjJDREI1MywKKzB4NTJGNzJCMjEsIDB4N0Y1NDIyNjAsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LCAweEUyNDA2MTRELAorMHg4OTE0MzEyMywgMHgzMTI3RTIxRiwgMHg4QjA5RDc0OSwgMHhENDQ5NjE0RCwKKzB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsIDB4MTc2MUEwMDcsCisweEUwMDFENDQ0LCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LCAweDRGMjYyNzYyLAorMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxMiwKKzB4RDczQjMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyM0EsIDB4NDIwQjcxRTAsCisweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjM2LCAweEUwMDE0MjBCLAorMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwKKzB4NjI1MkQ1MzEsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MkQ0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEEwMDEwMDA5LAorMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUyNjQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjhCRkMsIDB4MkZFNjAwMDksCisweDdGRkM0RjIyLCAweEJGRjE2RTUzLCAweDYxRTIyRjQyLCAweEUyODBENjIwLAorMHg1NEUxMTYxNSwgMHgxNjQ2NDIxOCwgMHg0MjI4NTVFMiwgMHg1N0UzMTY1NywKKzB4MTY3ODZFRjIsIDB4MjZFMjJFMkIsIDB4NEYyNjdGMDQsIDB4NkVGNkFGQ0UsCisweDAwMjAzNDk0LCAweDAwMTE3ODA0LCAweDAwMjAzOEY0LCAweDAwMjAzOTA4LAorMHgwMDIwMDUwQSwgMHgwMDIwMTAwOCwgMHgwMDIwMTAyRSwgMHgwMDIwM0E1OCwKKzB4MDAyMDE4QTIsIDB4MDAyMDE4RTYsIDB4MDAyMDNBNkMsIDB4MDAyMDNBNzQsCisweDAwMjAzQTc4LCAweDAwMUMzNTAwLCAweDAwMUMxMDAwLCAweDAwMjAzOThBLAorMHgwMDExNzgwMCwgMHgwMDIwMThFRSwgMHgwMDIwM0E4QywgMHgwMDIwMzk5MCwKKzB4MDAxQzM3MDQsIDB4MDAyMDMzRTgsIDB4MDAxQzM3M0MsIDB4MDAxQzM3MDAsCisweDAwMUMzNzBDLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZDNTNERDEwLAorMHg2RTQzQkZBNCwgMHgyREUyQkY4OSwgMHgwMDA5QkZBMCwgMHgyQzEyNTFENSwKKzB4MUM0MTU0RDYsIDB4MUM1MjU1RDcsIDB4MUM2MzU2RDgsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweDYxNjM2Q0Y2LCAweEEwMDRFNjAwLCAweDYyNTY0MTA5LAorMHgyNDIyNzYwMSwgMHgzNjEyNzQwNCwgMHgwMDBCOEJGOSwgMHgwMDAwMDAwOSwKKzB4MDAxQzM3MEMsIDB4MDAwOUExNkUsIDB4MkZFNjJGRDYsIDB4REQ5NDRGMjIsCisweEEwMDQ5RUIyLCAweEQ0OTMwMDA5LCAweDQyMEJEMjkzLCAweDYyRDI2NUQyLAorMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjhGRDQ5MCwgMHg1NUQxNDIwQiwKKzB4MjJFODUyRDEsIDB4QTAwNDhCRjgsIDB4RDQ4RDAwMDksIDB4NDIwQkQyOEEsCisweDUyRDI1NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyODZENDg5LAorMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywgMHhBMDA0OEJGOCwgMHhENDg2MDAwOSwKKzB4NDIwQkQyODEsIDB4NTJENDU1RDQsIDB4OEJGODIyRTgsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2QzczLAorMHg2RDUzQjAxQSwgMHg2NEQzNTdGNCwgMHhCMDVGNjVFMywgMHhCMDc1NjZDMywKKzB4QjBBNDAwMDksIDB4QjBBODAwMDksIDB4QjBBQzAwMDksIDB4QjBBQzAwMDksCisweEIwQUYwMDA5LCAweEIwMzE1NEY1LCAweDZDQ0Q2QzAzLCAweDRGMjY2MEMzLAorMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgzNDEyRDE3MCwgMHhENjcwMDUyOSwKKzB4MjY1MEQ3NzAsIDB4Mjc0MjAwMEIsIDB4MDAwOUEwMTgsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZFNjM2QzczLCAweDZENTNCRkVFLCAweDY0RDM1N0Y0LAorMHhCMDMzNjVFMywgMHhCMDhENjZDMywgMHhCMDBGNTRGNSwgMHg2Q0NENkMwMywKKzB4NEYyNjYwQzMsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4RTUwM0QxNjIsCisweEQ3NjNENDYyLCAweDIxNTI0NTE4LCAweDI0NzIwMDBCLCAweEQ0NUZEMTVFLAorMHgyMTYyRTYwMCwgMHgyNDYyMDAwQiwgMHhCRjczNEYyMiwgMHhCRjczRTQwQSwKKzB4RDI1QzAwMDksIDB4NDExOEUxMDQsIDB4RTQwQUU1MDAsIDB4QkY2OTIyMTIsCisweEQ3NTkyMjUyLCAweENCMjA2MDcyLCAweDAwMEI0RjI2LCAweDRGMjIyNzAyLAorMHg0MTBCRDE1NiwgMHhENTU2RTQwMCwgMHg0RjI2NDUyQiwgMHhEMTU1MkZFNiwKKzB4NjYxMjZFNjMsIDB4OTIxMDQ0MTgsIDB4NDQwODQ1MjgsIDB4NDUwMDI2MjksCisweDI2NUI0NDA4LCAweDI2NEI0NDAwLCAweDIxNjI0NzA4LCAweEQxNEU0NzA4LAorMHgyMTcyMjdFQiwgMHg2RUY2MDAwQiwgMHgxRkZGMDNGMCwgMHg0RjIyMkZFNiwKKzB4RTEwMURFNEEsIDB4QkYzREU0MEEsIDB4NjdFMzJFMTIsIDB4RTUwMDc3NkMsCisweEUyMDRFMTMwLCAweDI3NTJFNDBBLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4MjcyMjI3MTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgxNzVBQkYxOCwgMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwgMHhEMjM0NkVGNiwKKzB4RTQ0MUUxMDEsIDB4MDAwQjIyMTIsIDB4RDEzMjIyNDIsIDB4RTYwNUQ0MzIsCisweDAwMEIyMTYyLCAweDAwMEIyNDYyLCAweEQyMzAwMDA5LCAweEU0MEFFNjAxLAorMHgyMjYyQUYwMCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NkM0M0RCMkIsIDB4RUQwMDYwQjIsIDB4MkIwMkNCMDMsIDB4QzkwMzYwQjIsCisweDZFMDNBMDA4LCAweDg5MDczREMyLCAweEU0NjQ2MEIyLCAweEIwN0NDOTAzLAorMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4RjA0M0RDMiwgMHhENDIxMkZFMSwKKzB4NDYwQkQ2MjEsIDB4NjJGMTAwMDksIDB4NjAyMzYyMkQsIDB4ODlGRkM4MDEsCisweDdGMDQ2MDIzLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgwMDFDM0I4OCwgMHgwMDIwM0FBMCwgMHgwMDIwMThFRSwgMHgwMDIwM0FBOCwKKzB4MDAyMDNBQjAsIDB4MDAyMDNBQjgsIDB4MDAyMDNBQzAsIDB4MDAyNUU3MjAsCisweDAwMjAzREEwLCAweDAwMjAzOEY4LCAweDAwMUM1OTY4LCAweDAwMUMzQjQwLAorMHgwMDBGODAwMCwgMHgwMDFENDAwNCwgMHgwMDFDMzUwMCwgMHgwMDIwMTVFMCwKKzB4MDAyMDE2MEMsIDB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU4MzAsCisweDAwMUM2MjY4LCAweDAwMUM1OUE0LCAweDAwMUM2MzlDLCAweDAwMUM1ODFDLAorMHgwMDFDNTg2MCwgMHgwMDIwM0FDOCwgMHgwMDIwMThBMiwgMHg4RjAxNDQxMSwKKzB4NjA0MzYwNEIsIDB4MDAwOTAwMEIsIDB4NTY1MUQ1MkIsIDB4NDYyODYwNTIsCisweDMwNkMwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDRGMTI0RjIyLAorMHhCRkYxNEYwMiwgMHg2QjAzNkU0MywgMHhERDI1REMyNCwgMHgwMDA5QkZFQywKKzB4M0MwNTMwQjgsIDB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksIDB4MDIwQTNENjUsCisweDQyMDk0MjA5LCAweDMyRTI0MjA5LCAweDRGMDY4QkYwLCAweDRGMjY0RjE2LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgyRkM2NkJGNiwgMHgyRkU2MkZENiwKKzB4NEYxMjRGMjIsIDB4QkZDRjRGMDIsIDB4NkMwMzZFNDMsIDB4QkZDQkREMTMsCisweDMwQzgwMDA5LCAweDA2MEEzRDA1LCAweDQ2MDk0NjA5LCAweDM2RTI0NjAxLAorMHg0RjA2OEJGNSwgMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwKKzB4NEYyMjJGRTYsIDB4RTEwMkRFMEIsIDB4RTQwM0U1MDAsIDB4QkZCOTJFMTIsCisweEU2MDYyRTUyLCAweEU3MDA0NjE4LCAweDJFNjJFNDAzLCAweDRGMjYyRTcyLAorMHg2RUY2QUZCMCwgMHgwMDA5MDAwQiwgMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwKKzB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3Rjk4LCAweDY0NTNFNzEwLAorMHg2QjUzNDcyOCwgMHhFRTFBRENCQywgMHg2MTUzNjU1RCwgMHgzMTVDNDEwOCwKKzB4NzUwMTQxMDgsIDB4NjA0MzMxN0MsIDB4MEYxNjY2NUQsIDB4RUQwMDYwQjMsCisweDIxQjEzNkUzLCAweDgxMTI4MTExLCAweDExRDI4MTEzLCAweDExRDQxMUQzLAorMHg3NDA0OEZFQSwgMHhEOEIxNjdGMiwgMHgxODcxRDlCMSwgMHg1OEYxMjg3MiwKKzB4MTk4MUQxQjAsIDB4NTlGMjI5ODIsIDB4NURGNDVBRjMsIDB4NTRGNjVFRjUsCisweDIxOTIxMTkxLCAweDExQTIxMUEzLCAweDExRDQxMUQ1LCAweDExRTYxMUU3LAorMHgxMTQ4MTE0OSwgMHhEQUE4NTVGNywgMHg1N0Y4RUUwMCwgMHg1MkY5RERBNywKKzB4NjRFM0Q2QTcsIDB4MkE1MjFBNTEsIDB4RDhBN0Q5QTYsIDB4MkQ3MjlBRDUsCisweDZFRUQyNjIyLCAweDREMDg2REUzLCAweDNERUM2MUUzLCAweDREMDg0MTA4LAorMHgzRDlDMzFFQywgMHg0MTA4NjBCMywgMHg4MUQxMkRCMSwgMHg0MTA4RTA1MCwKKzB4NDAwOEU3QjcsIDB4Njc3QzQxMDgsIDB4NjBCMzgxRDIsIDB4RTIwMDMxOEMsCisweDgxRDMzNDcyLCAweDFEMTMxREQyLCAweDhEMDFENDkzLCAweEQ0OTAxRDI0LAorMHhCMEIzNjVEMywgMHg2NEVEN0UwMSwgMHg4QkRBMzRBMiwgMHgyRkQyREE4QywKKzB4REQ5MjY4QTIsIDB4MkQ4MjQ4MjksIDB4N0RGQzY0QTIsIDB4RDI4NzY5NEQsCisweDZFMjIyRDkyLCAweDdEMEM0RTI5LCAweDY4MjIyREUyLCAweDYxOEQ2QUQzLAorMHgyQTE2RDc4NCwgMHhENDhBNkQ3MiwgMHgyNEQyRDU4MywgMHhENjg5NUU3MiwKKzB4NTE3NDE0RTIsIDB4MTQxNEVFMDAsIDB4RDE4NzU4NzYsIDB4NTk3ODE0ODYsCisweDE0OThFNzEwLCAweDY1RTM2MjUyLCAweDI2RTIxNDJBLCAweEU2MDA2NEUzLAorMHg2ODQzNjQ0RCwgMHgzODRDNDgwOCwgMHgzODFDNDgwOCwgMHgwQzg2NjA1MywKKzB4MDlDRTI4QjEsIDB4ODE5MTYwQjMsIDB4MEFDRTYwNTMsIDB4ODFBMjYwNDMsCisweDBEQ0U2MDUzLCAweDgxRDM2MEIzLCAweDA4Q0U2MDUzLCAweDE4ODI3NDAxLAorMHg2MjREMDlDRSwgMHgwQUNFMTlFMywgMHgxQTY0MzI3MywgMHg3NTA0OEZFMCwKKzB4RTAwM0Q5NkEsIDB4NDAxODZDOTIsIDB4NkQ5MjJDQjEsIDB4ODFEMURBNkYsCisweDZFOTJFMDUwLCAweDgxRTI0MDA4LCAweDYwQjM2MTkyLCAweDY0OTI4MTEzLAorMHgxNDQyRTYwMCwgMHhENDY5Njc5MiwgMHg2ODkyMTdBMywgMHgxODY0RTFGRiwKKzB4NjU2M0U3MDMsIDB4MzY0QzQ2MDgsIDB4MjYxMjc1MDEsIDB4MzY3MzY2NUQsCisweERDNUI4QkY4LCAweDZEQzJFMDAzLCAweDJEQjE0MDE4LCAweEQyNjA2RUMyLAorMHg2MUMyODFFMSwgMHgxMTEyRUUwMCwgMHhFMDI0NjRDMiwgMHg2NUMyMTQyMywKKzB4MTVFNEQ0NUIsIDB4RTU4MDY3QzIsIDB4NjhDMjgxNzIsIDB4ODE4MzY2RTMsCisweDY2NkQ2NTVDLCAweDc2MDQ2OTYzLCAweDM5NEM2QTZELCAweDhGRjgzQTUzLAorMHhEQjU0MjlFMiwgMHgyNEIyREM1NCwgMHgyNEMyNzQwNCwgMHg0RjI2N0Y2OCwKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsCisweDYwMTE2MTQyLCAweDhGMDNDODAzLCAweEQyM0RFNTAwLCAweDhCMDYzNDIwLAorMHhDOTAzNjAxMSwgMHg4QjA2ODgwMiwgMHgzNDIwRDIzOSwgMHg1NjEyOEIwMywKKzB4NTI2NDY1MTMsIDB4MDAwQjI0MjIsIDB4MDExMzYwNTMsIDB4MkZFNjJGRDYsCisweDdGRUM0RjIyLCAweDYyNTM2RTUzLCAweDZENDNFNTUwLCAweDQ1MDhFNDAwLAorMHhFMTAxQTAwMSwgMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwgMHg2MDUzODEyMywKKzB4NTZFMjgxMjIsIDB4OEJGNTM2MjAsIDB4MTZFNEQyMzgsIDB4RTYxNDY0RjMsCisweDY1RTM0MjBCLCAweEU0RkM2NUUxLCAweDJFNTEyNTQ5LCAweDY1RjM2MUYxLAorMHgyRjExMjE0OSwgMHhEMTMxNTREMSwgMHhFNjE0NDEwQiwgMHg2MDcxNTdEMSwKKzB4MjcwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDY2NTM2RTUzLCAweDZENDNFNUZDLAorMHgyMDU5NjA2MSwgMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwgMHgxMkU0OEIwNiwKKzB4MzFFMDUxRTIsIDB4NTJEMThCMDQsIDB4MUUyMkEwMDIsIDB4NTY2NEFGRjAsCisweDY0RjNEMjFFLCAweDQyMEJFNjE0LCAweDY3RTE2NUUzLCAweDI3MTlFMUZDLAorMHg2N0YxMkU3MSwgMHgyNzE5NTREMSwgMHg2NUYzRDExOCwgMHg0MTBCRTYxNCwKKzB4NTJEMTJGNzEsIDB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsIDB4NEYyNjdGMTQsCisweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMjAzOTI0LCAweDAwMjAzNEY0LAorMHgwMDIwMzRGQywgMHgwMDIwMzUwNCwgMHgwMDIwMzUyQywgMHgwMDIwMzkxMCwKKzB4MDAyMDM5MTgsIDB4MDAxMDAyMDgsIDB4MDAxMDE3QzAsIDB4MDAxRTIxMEMsCisweDAwMUMzRDAwLCAweDAwMjAzOTY0LCAweDAwMTAwMEM4LCAweDAwMTE3ODgwLAorMHgwMDExNzc4MCwgMHgwMDA0MDAyMCwgMHgwMDI2QzQwMSwgMHgwMDIwMEVENiwKKzB4NEYyMjJGRTYsIDB4REU0MjYyNEMsIDB4NDIwMDQyMDgsIDB4M0UyQ0EwMDUsCisweEQ0NDA1MjUyLCAweEJGNjk1NjI0LCAweDY1RTIyRTYyLCAweDM1MjA1MkUxLAorMHhENjNEOEJGNiwgMHg0RjI2MjYyMiwgMHg2RUY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4REMzOTRGMjIsIDB4NTJDMURCMzksIDB4MzYyMDY2QzIsCisweDYwNjE4OTFDLCAweDg4MDFDOTAzLCAweERFMzQ4OTE4LCAweEJGMzdERDM1LAorMHg2NTAzNjRFMywgMHg2NkIyODUwMywgMHgzMjYyNjIwRCwgMHhENDMyODkwNywKKzB4MDAwOUJGNzYsIDB4NEQwQkQ0MzEsIDB4QUZFNjAwMDksIDB4QkYzRDAwMDksCisweEQ0MkY2NEUzLCAweDAwMDk0RDBCLCAweDAwMDlBRkRGLCAweDIyNjJEMjJELAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4REQyOURDMjgsIDB4NkU0MzYwQzIsIDB4MDRERTQwMDgsCisweEU2MTREMTI3LCAweDY1RTM0MTBCLCAweEQxMjdENzI2LCAweDU1RTIyN0UyLAorMHgzNUUwNTI1NCwgMHgyMTIyOEYwNCwgMHg0MDA4NjBDMiwgMHgxMjIyMDJERSwKKzB4NjA1MzY1QzIsIDB4NzUwMTQwMDgsIDB4MERFNjA2REUsIDB4QzkwRjYwNTMsCisweDYwNjMyQzAyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweDg1NDM2Q0Y2LAorMHg2NTBENTY0MywgMHg2MjJENjI2MiwgMHgzNTI3NzIwNCwgMHhFMTAwOEYwQywKKzB4MjI2ODk2MEMsIDB4RDYxNThCMDMsIDB4NzIwMTUyNjEsIDB4RDYxMzE2MjEsCisweDYyNjJFMTAxLCAweDI2MjI3MjAxLCAweDYwMTMwMDBCLCAweDAwMDAwMUZGLAorMHgwMDIwMzUwNCwgMHgwMDIwMzRGQywgMHgwMDFDM0QwMCwgMHgwMDIwMzUyQywKKzB4MDAyMDM4RjQsIDB4MDAyMDE4QTIsIDB4MDAyMDM0RjQsIDB4MDAyMDNBRjAsCisweDAwMjAzQUY0LCAweDAwMUMzRDI4LCAweDAwMjAzOTY0LCAweDAwMjAzOTI0LAorMHgwMDIwMEVENiwgMHgwMDIwMzk2OCwgMHgwMDIwMzk2QywgMHgwMDExNzc1NCwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGODRGMjIsIDB4NjAyMkQyMzcsCisweDhENThDODAzLCAweERFMzYyRjAxLCAweERCMzdEQzM2LCAweDY2QzI1MkMxLAorMHg4OTJGMzYyMCwgMHhDOTAzNjA2MSwgMHg4OTJCODgwMSwgMHhEMjMzREQzMSwKKzB4NjREMzQyMEIsIDB4MUYwMTY1MDMsIDB4ODgwMTYwQjEsIDB4RDIzMDhCMDQsCisweDY0RDM0MjBCLCAweDAwMDlBRkVBLCAweDg1NjE1NjUzLCAweDg5MDRDODIwLAorMHhFMDUwRDcyQywgMHg3MjAxMDI3RSwgMHhEMjJCMDcyNiwgMHg2NDUzNDIwQiwKKzB4ODkwNzIwMDgsIDB4NTVGMUQxMjYsIDB4NjREMzQxMEIsIDB4RTYwMUQ3MjcsCisweDI3NjJBRkQ0LCAweDU1RjFEMjI2LCAweDY0RTM0MjBCLCAweEU2MDFEMTI1LAorMHgyMTYyQUZDQywgMHhERDI1REUyNCwgMHhEQzI2REIyNSwgMHg2NkQyNTJEMSwKKzB4ODkxODM2MjAsIDB4QzkwMzYwNjEsIDB4ODkxNDg4MDEsIDB4RDExN0Q0MUYsCisweDAwMDk0MTBCLCAweDM2RTA1NjAzLCAweDY1MDM4RjA0LCAweDJCMjBFMjAxLAorMHgyQzUyQUZFQywgMHhENzEyRDQxQywgMHgwMDA5NDcwQiwgMHhFNjAxRDExNSwKKzB4QUZFMzQ2MTgsIDB4NjBGMTIxNjIsIDB4ODkwN0M4MDQsIDB4N0YwOEQyMTcsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDRGMjY3RjA4LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgwMDAwNkJGNiwgMHgwMDFFMjEwMCwKKzB4MDAyMDM1MDQsIDB4MDAyMDM0RkMsIDB4MDAyMDM5OEMsIDB4MDAyMDE0QTAsCisweDAwMjAxNENDLCAweDAwMjAzNDk0LCAweDAwMjAxNkJFLCAweDAwMUUyMTJDLAorMHgwMDIwMTUzMCwgMHgwMDFDM0QzMCwgMHgwMDExNzg4MCwgMHgwMDIwMzRGNCwKKzB4MDAyMDM5MTQsIDB4MDAyMDM5MTAsIDB4MDAyMDM1MkMsIDB4MDAyMDA2MTAsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsCisweDY0NENCRkYyLCAweDhCRjkzRUMyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHhFNTAwNkNGNiwgMHg2NjQzQTAwMiwgMHg3NjAxNzUwMSwgMHgyMjI4NjI2MCwKKzB4QUZFMzhCRkEsIDB4MkZFNjAwMDksIDB4NzUwNzYyNTMsIDB4RTEwODY3NTMsCisweDYwNDNFRTBBLCAweDQ0MDlDOTBGLCAweDY1MDMzMEUyLCAweDhEMDE0NDA5LAorMHhFNjMwRTYzNywgMHg0MTEwMzY1QywgMHg4RkYyMjc2MCwgMHhFMDAwNzdGRiwKKzB4MDAwQjgwMjgsIDB4MDAwQjZFRjYsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDAsCisweDdGRUM0RjIyLCAweDZFNDM2MjUzLCAweEJGREM2NUYzLCAweEJGRDA2NDIzLAorMHhCRkNFNjRFMywgMHhENDAzNjRGMywgMHgwMDA5QkZDQiwgMHg0RjI2N0YxNCwKKzB4NkVGNjAwMEIsIDB4MDAyMDNBRjgsIDB4RTRGREQyOUYsIDB4RDc5RjYxMjIsCisweDIyMTIyMTQ5LCAweDc0MDE2MDIyLCAweDIyMDJDQjAxLCAweEQ1OUM2NjIyLAorMHgyMjYyMjY0OSwgMHhDODQwNjA3MCwgMHg2MDUyODkwMiwgMHgyNTAyQ0IwNCwKKzB4RTFGNzY0NTIsIDB4MjU0MjI0MTksIDB4RTcwMTYwNTIsIDB4MjUwMkNCNDAsCisweEU2MDI2MDUyLCAweDI1MDJDOUNGLCAweDQ3MTg2MDUyLCAweDI1MDJDQjEwLAorMHhDQjAzNjA1MiwgMHgxNTYyMjUwMiwgMHgxNTczMDAwQiwgMHhENzhFRDU4RCwKKzB4RDQ4RkQyOEUsIDB4RTYwMEUxMDAsIDB4MjcxMTI1MTEsIDB4QUZDQjIyMTAsCisweDY2NEMyNDYxLCAweDQ2MDBEMjhCLCAweDYwNjAzNjJDLCAweDAwMEJDQjEwLAorMHg2NTRDMjYwMCwgMHg0NTAwRDI4NywgMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwKKzB4MjU2MDAwMEIsIDB4RDI4NDY2NEMsIDB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsCisweDI2MDAwMDBCLCAweEQyODA2NTRDLCAweDM1MkM0NTAwLCAweEUxRUY2NjUwLAorMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI3QSwgMHg2MDYwMzYyQywKKzB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsIDB4NDUwMEQyNzYsIDB4NjY1MDM1MkMsCisweDI2MTlFMUY3LCAweDI1NjAwMDBCLCAweEQyNzM2NjRDLCAweDM2MkM0NjAwLAorMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjZGNjU0QywgMHgzNTJDNDUwMCwKKzB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjI0QzI1NjAsIDB4NDIwMEQ2NjksCisweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLAorMHhENjY1NjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4RDE2MTYwMEMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsCisweEQxNUY2MDJDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLCAweDJGRTY2MDJDLAorMHg2RTQzNEYyMiwgMHhFNjBBNjQ1QywgMHg4OTE0MzQ2NywgMHgwMDA5QkZFQiwKKzB4NjBFQzY0MEMsIDB4OEIwMjg4MDEsIDB4QTAwMkUwMEYsIDB4NDQwOTI0MDksCisweDYyNEM0NDA5LCAweDMyNjNFNjBBLCAweEJGRTI4OTA1LCAweDYyMEM2NDRDLAorMHhDODgwNjAyMywgMHhFMjAwOEIwMCwgMHg0RjI2NjAyMywgMHg2RUY2MDAwQiwKKzB4RDY0QzRGMjIsIDB4ODgwMTYwNjIsIDB4QjI1NzhCMDMsIDB4QTAwMzAwMDksCisweEQyNDkwMDA5LCAweDIyNjBFNjQwLCAweEUyMDBENjQ4LCAweDAwMEI0RjI2LAorMHg0RjIyMjYyMiwgMHg2MDYyRDY0MywgMHg4QjAxODgwMiwgMHgwMDA5QjJBMCwKKzB4RTIwMEQ2NDIsIDB4MDAwQjRGMjYsIDB4RDUzRTI2MjIsIDB4RTEwMEQ0M0UsCisweDI1MTJFNzAxLCAweDI0NzAwMDBCLCAweEU2MDREMjNCLCAweDIyNjAwMDBCLAorMHhENDNCNEYyMiwgMHg0MTBCRDEzQiwgMHhENTNCMDAwOSwgMHg2NjUwRTFGRCwKKzB4MjYxOUQyM0EsIDB4MjU2MEU3MDAsIDB4MDAwQjRGMjYsIDB4NEYyMjIyNzAsCisweEQyMzhENTM3LCAweEQ3Mzg2MTUyLCAweDI1MTI2MTFELCAweEU2RkY2NDUyLAorMHgyNTQyMjQyQiwgMHhEMjJGRDQzNSwgMHg0MjBCNjY2RCwgMHhENTJFMjc2MiwKKzB4Njc1MEUxRkIsIDB4NEYyNjI3MTksIDB4MjU3MDAwMEIsIDB4RDQzMDRGMjIsCisweDQxMEJEMTI4LCAweEQ1MjgwMDA5LCAweDY2NTBFN0Y3LCAweDRGMjYyNjc5LAorMHgyNTYwMDAwQiwgMHg5NDI1RDUyNCwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwKKzB4RTRCRkQ1MjEsIDB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RDIyNTRGMjIsCisweDYwMEQ4NTIyLCAweDg5MTEyMDA4LCAweDg5NDU4ODAxLCAweDg5NDc4ODAzLAorMHg4OTQ5ODgwNSwgMHg4OTRGODgwNiwgMHg4OTU1ODgwOCwgMHg4OTVCODgwOSwKKzB4ODk2MTg4MEEsIDB4ODk2Nzg4MEIsIDB4MDAwOUEwNkUsIDB4MDAwOUIwNzAsCisweDYwMENBMDZCLCAweDAwMDBGRjdGLCAweDAwMUUyMTQ4LCAweDAwMUUxMDAwLAorMHgwMDFFMTEwOCwgMHgwMDIwMzlDNCwgMHgwMDIwMzlDNiwgMHgwMDIwMzlFNSwKKzB4MDAyMDM5QTgsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMkYsCisweDAwMUUxMDkwLCAweDAwMjAzOUNDLCAweDAwMUUxMDBCLCAweDAwMjAzOUM4LAorMHgwMDIwM0FGQywgMHgwMDIwMThBMiwgMHgwMDFFMTAyOCwgMHgwMDIwMzlFNCwKKzB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsIDB4MDAxQzEwMDAsIDB4MDAyMDNCMDgsCisweDAwMjAzQjE4LCAweDAwMjAzOTlDLCAweDAwMDlCMDRDLCAweDYwMENBMDM1LAorMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwgMHg2MjYwRDY4NCwgMHg4QjJCMjIyOCwKKzB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsIDB4OEIyMzIyMjgsCisweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLCAweDhCMUIyMjI4LAorMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwgMHg4QjEzMjIyOCwKKzB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsIDB4OEIwQjIyMjgsCisweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLCAweDhCMDMyMjI4LAorMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwKKzB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsIDB4RDc2QjAxMkQsCisweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLCAweDI1MjAyNzEyLAorMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNSwKKzB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsIDB4RDI1QzAwMDksCisweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLCAweDYwNjBENjVELAorMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwgMHgwMDBCMjYxMiwKKzB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsIDB4NjQwRDQ1MTgsCisweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLCAweDIyNjBFMDAxLAorMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwgMHg2NDUzNjUwRCwKKzB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsIDB4ODgwMjg5MDksCisweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LCAweEEwNEM4OTNCLAorMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwgMHg2MjJDNjI2MSwKKzB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsIDB4NjY0MkQ1NDAsCisweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLCAweDIwMDg2MDVDLAorMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwgMHhBMDJDODkwQSwKKzB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksIDB4RDIzOTYyMjIsCisweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLCAweDY2MjEyNTIyLAorMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwgMHg2MjJDRDQyRCwKKzB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksIDB4MjU2MkQ0MjksCisweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELCAweDY1MDM4RjAxLAorMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwgMHgwMDBCNEYyNiwKKzB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsIDB4RDExOEQ3MTcsCisweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLCAweDJGRTYyMTAyLAorMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwgMHhENTExRDYxRCwKKzB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksIDB4REUwRDgwNTEsCisweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LCAweEQyMTZENjE1LAorMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwgMHgwMDIwMzlFNSwKKzB4MDAyMDM5OUMsIDB4MDAyMDM5QTgsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsCisweDAwMjAzOUM4LCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMjAzOUQwLAorMHgwMDIwMzlCMCwgMHgwMDIwMzlCNCwgMHgwMDIwMzlCOCwgMHgwMDIwMzlENCwKKzB4MDAyMDM5RDgsIDB4MDAyMDM5REMsIDB4MDAyMDM5RTAsIDB4MDAyMDNFMDQsCisweDAwMjAzRTBFLCAweDAwMjAzOUMyLCAweDAwMjAyODg2LCAweDg5MTIzNDI3LAorMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwgMHg4MEUxQjBGNSwKKzB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsIDB4RDY4RjI2MDAsCisweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LCAweEQ2OEM2RUY2LAorMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwgMHhEMjg5OEIxNSwKKzB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsIDB4MjEyMEQ0ODcsCisweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LCAweDIxNDBFNzAyLAorMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwgMHgyRkU2RTAwMCwKKzB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsIDB4MjAwODg1NTQsCisweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLCAweDg1NjY2NTBDLAorMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwgMHgyNjUxNjQ0QywKKzB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsIDB4QTAwMzAwMDksCisweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLCAweEUyMDFEMTY3LAorMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwgMHgyNDAwQzkzRiwKKzB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLCAweDM2MjJEQzVFLAorMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwKKzB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsIDB4NzEwMjYxMjMsCisweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLCAweDY1MUQ2NjZELAorMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywgMHhDOTAzNjBEMywKKzB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsIDB4NzEwMjZFMTMsCisweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELCAweDMyNUNFMTA3LAorMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywKKzB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsIDB4RTYwRjI0NTIsCisweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LCAweEVCMDFFQTAwLAorMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsIDB4NjI2Mzg5MDAsCisweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLCAweDY0RTJENjM1LAorMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwgMHg3NDAxMjQ1MCwKKzB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsIDB4MjQ1MDQ1MTksCisweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLCAweDQyMDA2MUQxLAorMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwgMHhFNTAxRTQwMCwKKzB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsIDB4NEYyMjJGRTYsCisweEVEMEFFRTAxLCAweDY0RTNCQzg1LCAweEJDOEE2NEUzLCAweDYyRUM3RTAxLAorMHg4QkY3MzJENywgMHhCQzhERUUwMSwgMHg2NEUzNjRFMywgMHg3RTAxQkM5MiwKKzB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsIDB4RDExODZERjYsCisweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LCAweEQ3MTc3MjA0LAorMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwgMHgxMzdBMjEyMiwKKzB4MDAyMDM5QzIsIDB4MDAyMDI5OTIsIDB4MDAxRTEwMTUsIDB4MDAyMDM5QzgsCisweDAwMUUxMDAxLCAweDAwMjAzOTlDLCAweDAwMUUxMTAwLCAweDAwMjAzOUM2LAorMHgwMDIwMzlCNCwgMHgwMDFFMTAwMCwgMHgwMDIwMzlCOCwgMHgwMDIwMzlDNCwKKzB4MDAyMDI4ODYsIDB4MDAxRTEwMEMsIDB4MDAyMDM5QjAsIDB4MDAyMDM5Q0MsCisweDAwMjAzOUQwLCAweDAwMjAzOUQ0LCAweDAwMjAzOUQ4LCAweDAwMjAzOURDLAorMHgwMDIwMzlFMCwgMHg0RjIyMkZFNiwgMHhENjcwN0ZGQywgMHg4ODAxNjA2MCwKKzB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU2RUQxNkQsIDB4REU2RTYwMTAsCisweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTZDLCAweEQyNkM3NTAyLAorMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwKKzB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsCisweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTYyLAorMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHhBMDIwNzEwMiwKKzB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NTI3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweDkyODk3MTAyLCAweEQyNDYyRTIxLCAweDVFMjNENzRFLCAweDY0RjIyRkUyLAorMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywgMHg4MDcxNjEwMywKKzB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsIDB4ODE3MjY2RjIsCisweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLCAweDgxNzMzMDRDLAorMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwgMHg2MDJDNDIxOSwKKzB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsIDB4NDIyOTgxNzQsCisweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LCAweDAwMDlCQzk2LAorMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwKKzB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MkYsIDB4N0YwNDI2MjIsCisweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDg1NTJENTJBLCAweDg4MzA2MDBELAorMHg4ODMxODkwMywgMHhBMDM0ODkyMywgMHg4NTU1MDAwOSwgMHhENDI4RDcyNywKKzB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsIDB4MjQxMjQxMTgsIDB4NDYwQkQ0MjYsCisweEQ3MjMwMDA5LCAweEQyMjZENDI1LCAweDY1NzI0MjBCLCAweEUyMzBEMTIwLAorMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwgMHgzNzYwNDYyOCwgMHhENjIxOEIwMywKKzB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsIDB4QTAxMkUyMDIsIDB4RDExODI2MjIsCisweDYyMTJFNTMwLCAweEU2MjA0NTI4LCAweDQ2MjgyMjU5LCAweDg5MDgzMjYwLAorMHhENDFBRDExOSwgMHhFNjAxRDUxMywgMHgyMTYwNDUwQiwgMHg0NzJCRDcxOCwKKzB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsIDB4MDAwMDA2MEEsIDB4MDAyMDM5RTQsCisweDAwMUUxMDAwLCAweDAwMjAzOUQwLCAweDAwMjAzRTA0LCAweDAwMjAzRTEwLAorMHgwMDIwM0RBOCwgMHgwMDIwMzlCOCwgMHgwMDIwM0REOCwgMHgwMDIwM0RENiwKKzB4MDAyMDNEQUEsIDB4MDAyMDM5OUMsIDB4MDAyMDM5QzgsIDB4MDAyMDM5QjQsCisweDAwMjAzOUIwLCAweDAwMjAxOEEyLCAweDAwMjAzQjI0LCAweDAwMjAzQjI4LAorMHgwMDIwMThFRSwgMHgwMDIwMzlDQywgMHgwMDFFMTAwQiwgMHgwMDIwM0IzQywKKzB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsIDB4REU5NjdGRkMsIDB4MjAwODg0RTksCisweDJGMDA4RDA2LCAweEQ2OTVENDk0LCAweDAwMDk0NjBCLCAweDY0RjBCMTlBLAorMHg2NjIwRDI5MywgMHg4OTAyMjY2OCwgMHhDOUJGNjBFMCwgMHg3RjA0MkUwMCwKKzB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsIDB4MkZFNjAwMDksIDB4REU4RDRGMjIsCisweDYwRTBENjhELCAweENCQzBENDhELCAweDYyNjAyRTAwLCAweEM4MDM2MDJDLAorMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwKKzB4RDY4NzYxNkQsIDB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsCisweDMyMTM2MjVELCAweEQyODM4QkY4LCAweDAwMDk0MjBCLCAweEM5QkY4NEUyLAorMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NjI2MEQ2N0QsIDB4ODk0NDIyMjgsIDB4RDU3MkUxMDAsIDB4NjA1MDI2MTAsCisweENCNDBENDdBLCAweDI1MDA0NDBCLCAweDhEMDUyMDA4LCAweDYyRTA2RTAzLAorMHg3MTA0NjEyQywgMHgyRjExQTAwNiwgMHhENDc1RDY2RCwgMHhERDc1Njc2MCwKKzB4NjU3QzREMEIsIDB4RTIzQzZEMUQsIDB4OEIwMzNEMjcsIDB4RDI2N0Q0NzIsCisweDAwMDk0MjBCLCAweDREMjE0RDIxLCAweEEwMDVENzcwLCAweDY2RTZFNDAwLAorMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwgMHgzNUQzNjU0RCwgMHhENzZDOEJGNywKKzB4NjE3MkUwMDMsIDB4ODExMTQwMTgsIDB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsCisweEQ0Njg2MTcyLCAweERENjg4MTEzLCAweDREMEJERTY4LCAweEUyMDE2NTcyLAorMHhENDY3MkUyMiwgMHg0MjBCRDI1NSwgMHhENjU2MDAwOSwgMHhDOTNGNjA2MCwKKzB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweEQyNUY0RjIyLCAweDZCNDM2RTczLCAweDQyMEI2QzUzLAorMHgyMDA4NkQ2MywgMHg2NDAzOEQxQywgMHhFNTBFRDE0OSwgMHgzMjUyNjIxMCwKKzB4NjBDMzg5MTYsIDB4ODA0MTI0QjAsIDB4ODE0MTYwRDMsIDB4QTAwN0U1MDAsCisweDY1NUQ2MUJDLCAweDAwRUM2MDUzLCAweDM2NEM2NjUzLCAweDgwNjQ3NTAxLAorMHgzMjEzNjI1RCwgMHhENjNCOEJGNSwgMHhDOUJGNjA2MCwgMHgyNjAwQTAwOCwKKzB4RDIzQUQ0NEQsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDdGQzQ0RjIyLAorMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwgMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwKKzB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsIDB4NjU1QzY2NkMsIDB4RTQwOEJGQjYsCisweDRGMjY3RjNDLCAweDAwMDkwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwKKzB4NkIxMzZDQ0QsIDB4REUzNkQ3MzUsIDB4RURGRjY0RjMsIDB4RDgzNUVBMDQsCisweDYwNTM2NTVDLCAweDAyN0Q0MDAwLCAweDMyQzA2MjJELCAweDY2MDM4RDBELAorMHgwOUVENjA2MywgMHgyNDkxMDI3RCwgMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwKKzB4MzkyODYyMkQsIDB4NzQwMjI4OTIsIDB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsCisweDA3RDUzMkEyLCAweDBFQjU4RkU0LCAweDI0NDg2NDFDLCAweEU2ODA4OTA1LAorMHg2N0YzRTVDNSwgMHhCRjc5NjY2QywgMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RDExRTY4RjYsCisweDYwMTJEMjFFLCAweENCMjBFNDA1LCAweDIxMDJFNTAwLCAweDAwMEIyMjQyLAorMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywgMHgwMDIwM0I0MCwgMHgwMDIwMThBMiwKKzB4MDAyMDM5MEUsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsCisweDAwMUUxMEZDLCAweDAwMjAwNjEwLCAweDAwMjAzOTE0LCAweDAwMjAyQUVBLAorMHgwMDIwM0I0NCwgMHgwMDIwMThFRSwgMHgwMDIwM0I2MCwgMHgwMDExNzg4QywKKzB4MDAyMDM5MTAsIDB4MDAyMDM0RjQsIDB4MDAyMDE1MzAsIDB4MDAxRTIxMzAsCisweDAwMjAzQjY4LCAweDAwMjAyQUFDLCAweDAwMjAzQjZDLCAweDAwMjAzOTc0LAorMHgwMDIwMzk3QywgMHgwMDIwM0RBNCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwKKzB4RDU2NEQxNjMsIDB4RTQwMEQ3NjQsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsCisweEQ1NjIyNzIyLCAweDk2NjlENzYyLCAweDE1NDEyNTcyLCAweDk2NjYxNTYyLAorMHhFNjAxMTU2NSwgMHhENTVGMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsCisweDY3NjMyNTcyLCAweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LAorMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LAorMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhDODIwNjA0MywKKzB4NkU0MzhEMDIsIDB4MDAwOUJFNjcsIDB4QzgxMDYwRTMsIDB4QkU2NDg5MDEsCisweDYwRTMwMDA5LCAweDg5MDFDODQwLCAweDAwMDlCRTg2LCAweEM4MDE2MEUzLAorMHhERDNEODkzOCwgMHhDODAyNjBEMCwgMHgyRjAwOEQwMywgMHg0NjBCRDYzQiwKKzB4NjBGMDAwMDksIDB4ODkwMkM4MDQsIDB4NDYwQkQ2MzksIDB4NjJGMDAwMDksCisweEM4ODA2MDIzLCAweDYwRDA4OTAyLCAweDJEMDBDOTdGLCAweEM4MDE2MDIzLAorMHhENjM0ODkwNiwgMHgwMDA5NDYwQiwgMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwKKzB4ODkwMkM4MDgsIDB4NDYwQkQ2MzAsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsCisweDQyMEJEMjJFLCAweEQ1MkUwMDA5LCAweDg4MDI2MDUyLCAweEQyMkQ4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjJBOEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDIyNzg5MkQsIDB4NjBFMzZFMjAsCisweDg5MDJDODgwLCAweDQyMEJEMjI1LCAweDYwRTMwMDA5LCAweDg5MDJDODQwLAorMHg0MjBCRDIyMywgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMSwKKzB4NjBFMzAwMDksIDB4ODkwREM4MDQsIDB4REQyMEQxMUYsIDB4MDAwOTQxMEIsCisweDAwMDlCRjBELCAweDAwMDlCRjRDLCAweEQ1MUVENDFELCAweDI0NzBFNzA4LAorMHgyNUQyQkY4NSwgMHhDODA4NjBFMywgMHhEMjFCODkwNSwgMHg0RjI2N0YwNCwKKzB4NDIyQjZFRjYsIDB4N0YwNDZERjYsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDAwMUM1ODFDLCAweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLAorMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwgMHgwMDIwMUE5MCwKKzB4MDAyMDFBQjIsIDB4MDAyMDIxMTQsIDB4MDAyMDFBQ0EsIDB4MDAyMDFBRDgsCisweDAwMjAzOUM4LCAweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxQjQ0LAorMHgwMDIwMUI1MCwgMHgwMDIwMUFFMCwgMHgwMDIwMUFGRSwgMHgxMjM0NTY3OCwKKzB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsIDB4MDAyMDFCMkMsIDB4NjQ0Q0Q2QTcsCisweDAwMEIzNDZDLCAweEQ2QTYyNDUwLCAweDM0NkM2NDRDLCAweDI0NTAwMDBCLAorMHg2NDRDRDZBNCwgMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwgMHg0MjA4NjE2RCwKKzB4NDIwODQxMTksIDB4NDIwMDYwMTksIDB4NjcwRTYxNEMsIDB4RDQ5RTMyMUMsCisweDQyMDAyMDdELCAweDMyNENDOTBGLCAweDIyMDAwMDBCLCAweDQyMDg2MjVDLAorMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwgMHgwMDBCMzI0QywKKzB4MkZFNjIyNjAsIDB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsCisweEUyOUY2NjZELCAweDI3Mjk0NjE5LCAweDZFNTM2MjY5LCAweDY3MkU2NTczLAorMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwKKzB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsIDB4MjE1MDI1N0IsCisweDAwMEI0RjE2LCAweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLAorMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwKKzB4RTUwRjhCNzMsIDB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsIDB4RTU4NkU0MDAsCisweEU0MDA2NTVDLCAweDJGNTBCRkE0LCAweEJGQTFFNDAxLCAweEU2MDJFNTA2LAorMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwgMHhFNDAxODVGMiwKKzB4QkZBQjY1NDMsIDB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsCisweEU0MDI2NUYwLCAweDYwNTM3NTZDLCAweDgwRjhCRjgwLCAweEJGODJFNDAyLAorMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwgMHg0NjE4RTYwMiwKKzB4ODFGNjYwNjMsIDB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsCisweEU1MDBCRjhDLCAweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLAorMHhFMDEwNjU1QywgMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MywKKzB4MDVGQ0UwMTAsIDB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsIDB4QkY2NEU0MDMsCisweEU1MDBFNjQwLCAweEJGNzFFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLAorMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwgMHhFNDBGMEY1NCwKKzB4RTUwNEJGNDksIDB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsIDB4RTUwMTc1ODQsCisweEJGNEFFNjQwLCAweEU1MDFFNDA0LCAweEJGNTdFNjQwLCAweEU1MDFFNDA0LAorMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwKKzB4NEYyMjAwMDksIDB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsCisweDI2Njg2NjIxLCAweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LAorMHhFNDAxQkYxQywgMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGMUUsIDB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQzY1NDMsCisweEU0MDFFNjQwLCAweEJGMjk2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLAorMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywgMHhFNDAyODBGNCwKKzB4RTUxMkJGMDEsIDB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsIDB4RTY0MDY1MDMsCisweEJGMDJFNDAyLCAweEU2NDBFNTAwLCAweEJGMEZFNDAyLCAweEU2NDBFNTAwLAorMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUU1RTQwMywKKzB4RTUxMzgwRjgsIDB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsIDB4QkVFNzcwODUsCisweEU1MDA2NTAzLCAweEJFRThFNjQwLCAweEU1MDBFNDAzLCAweEJFRjVFNjQwLAorMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywKKzB4QkVDQkU0MDQsIDB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsIDB4RTQwRjg0RkMsCisweEJFQ0Q3MDgzLCAweEU1MDE2NTAzLCAweEJFQ0VFNjQwLCAweEU1MDFFNDA0LAorMHhCRURCRTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwKKzB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMkYsCisweDAwMUUxMDgwLCAweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLAorMHgwMDIwMzlDMiwgMHgwMDIwMzlDNCwgMHgwMDIwMzlDNiwgMHhEMjFERDExQywKKzB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsCisweDY3MTA2MjEwLCAweDc3MDE2MjJDLCAweDY0MjMyMTcwLCAweEQ2MTY2MDEwLAorMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywKKzB4NDQwODI2MjAsIDB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsCisweEU2MDA4RDEzLCAweEQ2MERENDBCLCAweDY1NUM2NTQwLCAweDQ3MDg2NzUzLAorMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwKKzB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsCisweDAwMjAzOTBELCAweDAwMjAzOTBDLCAweDAwMjAzOTBFLCAweDAwMjAzNTM0LAorMHg3RkZDNEYyMiwgMHhFNjgwRDE5RiwgMHg2NjZDNjIxMiwgMHhEMjlFMkYyMiwKKzB4NjdGMzY1NjMsIDB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsCisweEU2ODAwMDA5LCAweEQyOTg2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQwLAorMHhFNjgwNjQ3MywgMHhEMjk0NjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MywKKzB4MkY4NjY0NzMsIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGQ0M0RjIyLCAweERDOEVEMjhELCAweDcyMDExRjIxLCAweERCOEQxRjIyLAorMHhEMThFREU4RCwgMHg2NjEyNTIxMSwgMHg4QjAxMzYyMCwgMHgwMDA5QTBFNSwKKzB4QzkwMzYwNjEsIDB4OEIwMTg4MDEsIDB4MDAwOUEwREYsIDB4RDI4OEQ0ODcsCisweEVEODQ0MjBCLCAweDJGMDI1NTAzLCAweDMwRDA4NDVDLCAweEEwQjg4OTAxLAorMHhEMTg0MDAwOSwgMHg2MjZDNjYxMCwgMHg4ODAxNjAyMywgMHhEMTgyOEI2OCwKKzB4NjIxMDFGQzMsIDB4ODk1QjIyMjgsIDB4RTAwM0Q0ODAsIDB4NDAxODY3NDIsCisweDY4NDIxNzcyLCAweEQ1N0VFOTAwLCAweDgxODE2REIzLCAweDdEMDQyMTkwLAorMHg2N0QyNkFCMiwgMHg2NEUyNjg1MiwgMHgxRjQ5MUY1NywgMHg3NDA0NjRFMywKKzB4MUZBNDY1NDIsIDB4NjU0MzFGNUEsIDB4NjI1Mjc1RjgsIDB4MUY3NjFGRDUsCisweDZENTMxRjJCLCAweERBNzRENzczLCAweDdEOTREMjc0LCAweDY4RDIxRjg4LAorMHg2QUEyNjk3MiwgMHhEMTcyNjAyMiwgMHgyMjAyQ0IyMCwgMHhFMTQwMUYxQywKKzB4NzYwMUU2MDAsIDB4MzIxMzYyNkQsIDB4NTZGNDhCRkIsIDB4NTJGNjUxRjUsCisweDIxMjIyQjYyLCAweDUyRjg1MUY3LCAweDIxMjI1NkY5LCAweDJFNjI1MUZBLAorMHg1MUZCMjQxMiwgMHgyRDgyMjUxMiwgMHhEOTY2Mjc5MiwgMHgyOUEyREQ1RiwKKzB4NkFEMkQ5NjUsIDB4RDk2NDY4OTIsIDB4NjhEMjFBODQsIDB4NjA4MURBNjMsCisweDI4MDFDQjAxLCAweEQ4NjI2NkQyLCAweDJBNjIyOTYyLCAweEVEMDE1QUZDLAorMHgyQUQyNDgwQiwgMHgyQUQyNEQxOCwgMHg2MkQyREQ1RSwgMHgyRDIyNzIwMSwKKzB4RDE1MDU2RjMsIDB4RTIwMjYwNjIsIDB4MjYwMkNCMDEsIDB4MjEyMEEwM0QsCisweDhCM0EyMjI4LCAweEU0MDFERDU4LCAweDIxNDBFNjAwLCAweEUwMUMyRDYyLAorMHhDODAxMDA1QywgMHhENDU1OEIwQSwgMHhFNjAwRDc1NSwgMHhFRDdEMjQ3MiwKKzB4NjI2Qzc2MDEsIDB4OEJGQjMyRDMsIDB4MjREMkRENTIsIDB4RTJGRTY4QzIsCisweDJDODIyODI5LCAweDA5NUNFMDFFLCAweEUwMUY1REYxLCAweDBBNUMyRDkwLAorMHg3NTEwNTFGMiwgMHhFRDA2MjFBMCwgMHhENzRCRTYwMCwgMHg4NDU2RDQ0QiwKKzB4MjcwMDc2MDEsIDB4Njk2QzY4NTQsIDB4MjQ4MDM5RDMsIDB4OEZGNjc0MDEsCisweERBNDc3NzAxLCAweDJBMTBFMTk0LCAweEUyMDA3QTAxLCAweDdBMEYyQTIwLAorMHhEMTMwRTgwNSwgMHg2NjEwMkE4MCwgMHg2MDIzNjI2QywgMHg4OTA4ODgwMSwKKzB4RDI0MEQ0MkEsIDB4NDIwQjY1RjIsIDB4RDEzMUVEMDEsIDB4QUYzMDREMTgsCisweDY1RjIyMUQyLCAweDg1NTNENDNDLCAweDYyMEQ2NjQyLCAweDg5MDczMjYyLAorMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwgMHhFNjAxRDczQSwgMHgyNzYyQUYxQSwKKzB4RDEzNEQ0MUUsIDB4NDEwQjY1RjIsIDB4RDEyNUVEMDEsIDB4RDYzN0Q0MzYsCisweDQ2MEI0RDE4LCAweEFGMEQyMUQyLCAweDdGMzQwMDA5LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwKKzB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsCisweDgxRjJEMjA5LCAweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLAorMHg2NTYzNjA1MywgMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwKKzB4MDAwMDAwMDksIDB4MDAxQzNEOUMsIDB4MDAyMDI0NUMsIDB4MDAxMTc3OUEsCisweDAwMUMzNkY4LCAweDAwMUMzQjlDLCAweDAwMUMzNzA0LCAweDAwMjAzNTJDLAorMHgwMDIwMTRBMCwgMHgwMDIwMzkxRCwgMHgwMDIwMzkxQywgMHgwMDIwMzkxOCwKKzB4MDAxQzNEOTgsIDB4MDAxQzNCQjQsIDB4MDAxQzU5NjAsIDB4MDAxQzM1MDAsCisweDAwMUMzRDMwLCAweDAwMUM4OTYwLCAweDAwMjAzNTA0LCAweDAwMUMzRDAwLAorMHgwMDIwMTYwQywgMHgwMDExNzczMCwgMHgwMDIwMzkyMCwgMHgwMDFDNTgyQywKKzB4MjAwMEEwMDAsIDB4MDAwMEEwMDAsIDB4MDAxMTc3OEMsIDB4MDAxMTc3OTIsCisweDAwMTE3Nzg4LCAweDAwMjAxNENDLCAweDAwMjAzOEY0LCAweDAwMjAzNEY0LAorMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwgMHgwMDIwM0Q4NCwgMHgwMDIwMThBMiwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEQxOUI3RkVDLCAweDJGMTJFMDAwLCAweDYxMDNENDlBLCAweDFGNDI4MUYyLAorMHhERDlBREE5OSwgMHhENjlBNjgxMywgMHhFMDAxNDgwOCwgMHg0NjBCREU5OSwKKzB4MzhFQzQ4MDAsIDB4NjVBMjFGMDMsIDB4MzUyMDUyQTEsIDB4QTIzRThCMDEsCisweDYwNTEwMDA5LCAweDg4MDFDOTAzLCAweEEyMzg4QjAxLCAweDUyNTMwMDA5LAorMHgzMkUwREU5MSwgMHhEOTkxOEIxMCwgMHg2NEEzNDkwQiwgMHg0QjBCREI5MCwKKzB4REU5MDY0MDMsIDB4RDc5MUQ2OTAsIDB4RUMwMUQ1OTEsIDB4MkUwMkUxMDAsCisweDI3MTAyNkMwLCAweDI1MDJBRkRGLCAweEM4MDE4NTUxLCAweEExNTc4QjAxLAorMHg2MjUxMDAwOSwgMHg0MjAwNjIyRCwgMHg1RTUzMzY2QSwgMHg4NUUyMjI2RCwKKzB4QzkwMzY0MkMsIDB4ODVFMzY2MDMsIDB4NjA1MzY1MEQsIDB4NDAyMTQwMjEsCisweDQ1MDBDOTNGLCAweDMyMkE2NzAzLCAweDYwNTMyNTJELCAweEM5MDFEMTdGLAorMHg2MDEwNkMwMywgMHg4ODAxRDk3RiwgMHhEQjdGOEIwNSwgMHgyMTIwRTIwMCwKKzB4Q0IwMTYwQjIsIDB4RDE3RDJCMDIsIDB4ODgwMTYwMTEsIDB4NjVBMjhCMEEsCisweDhEMDQyNDQ4LCAweDlCOUU2MjUxLCAweEEwMDMyMkI5LCAweDkxOUIyNTIxLAorMHgyNTIxMjIxQiwgMHgzN0IzRUIxMCwgMHgyNDQ4ODk1RSwgMHhENDczOEIwNywKKzB4MjIyODYyNDEsIDB4NjA2Mzg5MDMsIDB4QTA1NzgxRjgsIDB4RDU3MDY0NzMsCisweDQ2MDg0NjA4LCAweDg1RTI2MjczLCAweDQ2MDA2QjUwLCAweDM2MkM0MjAwLAorMHgyQkI4QzkxMCwgMHg4RjFGNjQ2MywgMHgyNjY4NjYwMywgMHhEMjY5ODkxMSwKKzB4MDYyRDYwNDMsIDB4NDExOTYxNkQsIDB4NkIwRTYwMTksIDB4ODFGODIwQkQsCisweDg4MDE2MEMzLCAweDY0NkM4RjJDLCAweDg4MEY2MDczLCAweEEwMjc4QjFCLAorMHhEMjYxMDAwOSwgMHgwNTJENjA0MywgMHg0MTE5NjE1RCwgMHg2NzBFNjAxOSwKKzB4NjQ1QzIwN0QsIDB4ODFGOEEwMUMsIDB4ODkwRjI2NjgsIDB4NjA0M0QyNUIsCisweDZCNUQwNTJELCAweDYwQjk0QjE5LCAweDIwMUQ2MTBFLCAweDYwQzM4MUY4LAorMHg4RjBEODgwMSwgMHg2NDczNjQ1QywgMHhFQzAwQTAwQSwgMHg2MDQzRDI1NCwKKzB4NjI1RDA1MkQsIDB4NjAyOTQyMTksIDB4MjA3RDY3MEUsIDB4ODFGODY0NUMsCisweDg4MDI4NUY4LCAweDg1RTE4OTBBLCAweDhEMDdDODIwLCAweEU2REM2MjAzLAorMHg2MDIzMjI2OSwgMHg4MUUxQTAwMiwgMHg2NDRDRTRGRiwgMHg2MjEwRDE0OSwKKzB4ODkwMTIyMjgsIDB4NjQ0Q0U0RkYsIDB4NjU0REVCRkYsIDB4MzVCMDZCQkMsCisweERCMzY4QjJCLCAweDY0QTM0QjBCLCAweDQxMEJEMTM1LCAweDU0MDM2NDAzLAorMHg4NTQ0NkUwMywgMHhDOTQ4REI0MCwgMHhEQzQwODgwOCwgMHhCRUFFOEIwMSwKKzB4NjRCM0U1MDIsIDB4NjVFMzRDMEIsIDB4REIzREVDMDEsIDB4RDEzRDJEQzIsCisweDYyMTI2MEIyLCAweDcyMDE3MDAxLCAweDIxMjI4ODA1LCAweDJCMDI4RjA4LAorMHg2NjZDRTY4MCwgMHg2NTYzRDIzOCwgMHg3NTQ5RTcwMCwgMHg2NDczNDIwQiwKKzB4QTAzMEQ0MzYsIDB4N0ZGRjAwMDksIDB4ODVFMjgwMDAsIDB4MjBCOUVCRkMsCisweDYxMDM4MUUyLCAweDk0MkE4NUUzLCAweDYyMDMyMDQ5LCAweDQ1MDg4NUY4LAorMHg4MUUyMjAxQiwgMHhDOTAxNjBDMywgMHg0MDA4NDAxOCwgMHg0MDA4NDAwOCwKKzB4NDAwMDIyNUIsIDB4NjAyMzIyMEIsIDB4ODVFNDgxRTMsIDB4NDExOEUxMDgsCisweDgxRTQyMDFCLCAweEU0MDI2MkEyLCAweDIwQjk4NTIxLCAweDY3QTI4MTIxLAorMHhDQjAxNjA3MSwgMHg4NUY4MjcwMSwgMHg4OTAzMzA0MiwgMHhFQ0U3ODVFMiwKKzB4ODFFMjIwQzksIDB4NDkwQkQ0MUUsIDB4QTAzQjAwMDksIDB4N0UwMzAwMDksCisweDAwMUMzRDMwLCAweDAwMjAzRDkwLCAweDAwMjAzNTA0LCAweDAwMUUyMTJDLAorMHgwMDIwMzNFOCwgMHgwMDFDM0QwMCwgMHgwMDExNzc4MCwgMHgwMDIwMTRBMCwKKzB4MDAyMDE2NkMsIDB4MDAxMTc3MEMsIDB4MDAyMDM5MUMsIDB4MDAyMDM5MUQsCisweDAwMjAzOTE4LCAweDAwMjAxOEEyLCAweDAwMUMzNkY4LCAweDAwMjAzOTkwLAorMHgwMDIwM0RBMCwgMHgwMDIwM0I4NCwgMHgwMDIwM0MwNCwgMHgwMDIwM0M4NCwKKzB4MDAyMDNEMDQsIDB4MDAyMDM5MDgsIDB4MDAyMDM0RkMsIDB4MDAyMDE0Q0MsCisweDAwMjAzOTk0LCAweDAwMjAzOTk4LCAweDAwMjAyNDVDLCAweDAwMjAzRDg4LAorMHgwMDIwM0Q4QywgMHg2MDIyNjJGMiwgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwKKzB4OEIwQjg4MEEsIDB4NjBFMkRFOEMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksCisweDhCMDM4ODA4LCAweENCMDE2MEEyLCAweDI4MDJBMDA2LCAweDY1RTJERTg3LAorMHgyRTUyNzUwMSwgMHgyODYyNjZBMiwgMHg1MkYzNjZGMiwgMHgyNjIyQUU4MywKKzB4RDI4Mzg1NTEsIDB4REU4M0M4MDIsIDB4QTA5NThCMDEsIDB4NDIwQjAwMDksCisweDRFMEI2NEEzLCAweDVFMDM2NDAzLCAweDg1RTQ2NTAzLCAweDQ5MThFOTA4LAorMHhENzdEMjA5QiwgMHhFMDRDODFFNCwgMHhEQzdDMEI3RSwgMHg3QjAxRDk3QywKKzB4NjFDMjA3QjYsIDB4NzEwMTY2OTAsIDB4OEQwNjI2NjgsIDB4RDQ3OTJDMTIsCisweDQyMEJEMjc5LCAweEEwNzBFQjAxLCAweDYyNTEyREIyLCAweDRCMThFQjBGLAorMHgyMkI5RTEwMiwgMHgzMjEwNDExOCwgMHg4NTUxOEIwRiwgMHgyMDI5RTJGQywKKzB4NjA1MTgxNTEsIDB4Q0IwMTcyRTAsIDB4ODVFMTI1MDEsIDB4MjAyOTk0QTMsCisweDg1RTQ4MUUxLCAweEEwNTIyMDQ5LCAweDY3NTE4MUU0LCAweDQ3MTk2NzdELAorMHg2NjdFNjc3OSwgMHg3NzAxMjc2RCwgMHg2OTAzNjA3QywgMHg4ODAxNDkxOCwKKzB4MjU5MThGM0UsIDB4NkIxMkQxNjEsIDB4MjFCMjdCMDEsIDB4NjYwRDg1RTMsCisweDQwMjE2MDYzLCAweEM5M0Y0MDIxLCAweDZDMDM0NjAwLCAweDI2MkQzMjJBLAorMHhDODAxNjA2MywgMHhEQjVFRDE1RCwgMHg5NjdEODkwMSwgMHhFNjAwMkM2QiwKKzB4NjY2QzY3Q0QsIDB4NDAwMDYwNjMsIDB4NjIyRDAyMUQsIDB4OEQwRTMyNzAsCisweDYwNDM2NDAzLCAweEU5RkYwMjFELCAweDhCMDEzMjkwLCAweDAxQzVBMDA3LAorMHg2MjZDNzYwMSwgMHgzMjkyRTkwNCwgMHg2NDZDOEJFQiwgMHg2MDQzNDQwMCwKKzB4RDE1MDA0QkQsIDB4MEI0NTc0MDEsIDB4NjY5RDY5MTEsIDB4ODkwNzM2NzAsCisweDYwMkQ2MjExLCAweDg5MDM4OEZGLCAweEUyMDFEQjRCLCAweDJCMjAyMUMxLAorMHhFQ0ZDODU1MSwgMHg4MTUxMjBDOSwgMHhDQjAxNjA1MSwgMHhEQzQ3MjUwMSwKKzB4NjRBMzRDMEIsIDB4NTFGMzY2RjIsIDB4ODVFRjI2MTIsIDB4NTRGMkQyNDQsCisweDY1MEQ0MjBCLCAweDAwMDlBREU3LCAweEU1MDBEQzQyLCAweDQyMEIyQzUyLAorMHg0RTBCNjRBMywgMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywgMHg2NzAzRTkwOCwKKzB4NjUwMzQ5MTgsIDB4Mjc5OTg1NDEsIDB4REIzMjM3OTAsIDB4OEYwQkQ5MzIsCisweDYwMTM2MTBELCAweDhCMDdDODIwLCAweEM5NDg2MDUzLCAweDhCMDM4ODA4LAorMHhFNTAxQkQ0RCwgMHgwMDA5QTAwNSwgMHgyMTI4RDIzMywgMHhCRDQ2ODkwMSwKKzB4NjRCM0U1MDAsIDB4NDkwQjY1RTMsIDB4QURCQ0VDMDEsIDB4ODVGMjJEQzIsCisweDcwMDFFRTA0LCAweDMxRTc2MTBELCAweDhEMDI4MUYyLCAweEFEQTk3QTA4LAorMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RjdGRjY4RjYsIDB4MkZFNjgwMDAsIDB4RDIyMzRGMjIsCisweDYwRTM2RTIyLCAweDhEMDJDODQwLCAweEJCRjkyMkUyLCAweEUyNDAwMDA5LAorMHgyRTI4NDIxOCwgMHhCQzA0ODkwMSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgxMCwKKzB4RDIxQ0Q0MUIsIDB4MDAwOTQyMEIsIDB4MDAwOUJDMDMsIDB4QzgwNTYwRTMsCisweEJENkQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweEFDMDA0RjI2LAorMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwgMHgwMDFDM0QzQywgMHgwMDExNzc2MCwKKzB4MDAyMDE0QTAsIDB4MDAyMDE2NkMsIDB4MDAyMDM0OTQsIDB4MDAyMDNEQTQsCisweDAwMjAzOTA4LCAweDAwMjAzNEZDLCAweDAwMjAxNENDLCAweDAwMjAzOTc0LAorMHgwMDIwMzk3QywgMHgwMDIwMzk3MCwgMHgwMDIwMzk3MiwgMHgwMDIwMTUzMCwKKzB4MDAyMDE4RUUsIDB4MDAyMDM5OTQsIDB4MDAwMDgwMDAsIDB4MDAxQzM1MTAsCisweDAwMjAzRDk4LCAweDAwMjAxOEEyLCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LAorMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywKKzB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsCisweDg5MEIzMTIzLCAweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLAorMHgwMDA5MDAwOSwgMHgwMDIwMzQxMiwgMHgwMDIwMzNDOCwgMHgwMDBCRTAwMCwKKzB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LAorMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwKKzB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsCisweDAwMEI0MDA1LCAweDAwMDA2MkY2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDU0NEYwRDBBLCAweDQ2MjA1MzU1LCAweDAwMDAzQTU3LAorMHgyMDZDNzU0QSwgMHgzMjIwMzEyMCwgMHgyMDM4MzAzMCwgMHgzMjNBMzEzMiwKKzB4MzQzMzNBMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsCisweDQyNzA3MzcyLCAweDNEMjA2Njc1LCAweDU1NEUyMDNELCAweDIwMkM0QzRDLAorMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwgMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwKKzB4NjE3NjZFNDksIDB4MjA2NDY5NkMsIDB4NzI2NTczNzUsIDB4MjA3MjZGMjAsCisweDIwNzk2NTZCLCAweDAwMjE0NDQ5LCAweDUyNTA0NTQ1LCAweDU3MjA0RDRGLAorMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywgMHgwMDNENzI2NCwgMHg2QzYxNzYyMCwKKzB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsIDB4NDM1RjRENUEsIDB4NDY1RjQ0NEQsCisweDRDNDQ1RjU3LCAweDQ5NEU0OTVGLCAweDAwMDAwMDU0LCAweDZFNkI2RTU1LAorMHgyMDZFNzc2RiwgMHg2RDZENkY2MywgMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwKKzB4MjAzQTMwNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMjUxLCAweDAwMDAwMDIwLCAweDIwM0EzMzUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzQ1MSwgMHgwMDAwMDAyMCwgMHgyQjQzNDc0MSwgMHg3MzY5NkY0RSwKKzB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsCisweDZGMjA2QzY5LCAweDY5NzQyMDZFLCAweDBEMEE2NTZELCAweDAwMDAwMDAwLAorMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwgMHgwMDAwMEQwQSwgMHg2MjczNTU3NiwKKzB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM3NTczNUYsCisweDY0NkU2NTcwLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNjU3MjVGLAorMHgwMDBBMEQ2RCwgMHgwMDAwMDA0NCwgMHg0NDM4NzU3MCwgMHg3MjYzNzM2NSwKKzB4NkY3NDcwNjksIDB4M0Q1ODQ1NzIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNDcsCisweDAwMDAwMDQyLCAweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLAorMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwKKzB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsIDB4MDAwMDAwNDksIDB4MjA3NDZGNEUsCisweDc1NkY2RTY1LCAweDQ5MjA2ODY3LCAweDQyMjA1MTRFLCAweDBBMEQ2Njc1LAorMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwKKzB4MDAwMjAxMEEsIDB4MDIwMDAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LAorMHgwMDAyMDEwQSwgMHgwMDAzMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsCisweDAxMEIwMTBBLCAweDAyMDAwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwKKzB4MDEwQjAxMEEsIDB4MDEwRjAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwMjA1MjIwLCAweDAwMDAwMDQ2LCAweDAwMDAwMDU5LAorMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwgMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAyRTAyMDksIDB4ODAwMDAxMDEsCisweDAwMDQwOUZBLCAweDAwRkYwNDAwLCAweDA1MDcwMDAwLCAweDAyMDAwMjAxLAorMHg4MjA1MDcwMCwgMHgwMDAyMDAwMiwgMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwKKzB4NDAwMzA0MDUsIDB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsCisweDA0MDAwMDA0LCAweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMDQwLAorMHg0MDAyODIwNSwgMHgwNTA3MDAwMCwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwKKzB4MDAwMDQwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTE1OTM2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1aW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1aW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODBmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3Vpbml0LmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4N0ZGQzRGMjIsIDB4RDY5NUQ0OTQsIDB4MDAwOTQ2MEIsCisweEQ0OTRFNTcwLCAweDQ1MThCMDFFLCAweDg5MDQyMDA4LCAweEQ2OTBENDkyLAorMHg0NjJCN0YwNCwgMHhCMDEyNEYyNiwgMHhEMjkwMDAwOSwgMHg0MjBCRDQ5MCwKKzB4RTYwMDAwMDksIDB4OTQ5QUQ1OEYsIDB4Qzg0MDYwNTIsIDB4MkYwMjhGMDMsCisweDhGRjkzNjQyLCAweDdGMDQ3NjAxLCAweDAwMEI0RjI2LCAweEQyOEEwMDA5LAorMHgwMDA5NDIyQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhENjg3N0ZFQywKKzB4NjI2MDYxRjMsIDB4MkYyMDg0NjEsIDB4ODQ2MjgwRjEsIDB4ODBGMjcxMTAsCisweDZENDM4NDYzLCAweDg0NjQ4MEYzLCAweDgwRjQ2NDEzLCAweDZDNTM4NDY1LAorMHg4NDY2ODBGNSwgMHg4MEY2RTUwMCwgMHhENzdEODQ2NywgMHg4NDY4ODBGNywKKzB4ODBGOEVFMDQsIDB4ODBGOTg0NjksIDB4ODBGQTg0NkEsIDB4ODBGQjg0NkIsCisweDgwRkM4NDZDLCAweDgwRkQ4NDZELCAweDgwRkU4NDZFLCAweDgwRkY4NDZGLAorMHg2NjUzNjU1QywgMHg3NTAxMzY3QywgMHg2NjVDNjI2MCwgMHgyNDIwMzZFMywKKzB4NzQwMThGRjYsIDB4NjZGMzJGMTYsIDB4RTcxMDc2MDQsIDB4QjAwRDY1QzMsCisweDZFMDM2NEQzLCAweEQ0NkI3RjA0LCAweDQyMEJEMjZCLCAweDYwRTM2NTAzLAorMHg0RjI2N0YxNCwgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4M0YzQzkzM0EsIDB4NDEwOEUxNDEsCisweDMxRkNFMjAwLCAweDExNzMzNTI2LCAweDIxNTIxMTYyLCAweDExNDE4RDAyLAorMHhFMEZGQTA5OCwgMHg0QTE4RUEwMSwgMHgyNjIwNjZGMywgMHgzMkEyNzIwMSwKKzB4NzYwMThGRkIsIDB4NkJFM0VFMDAsIDB4RTA0NDZDRjMsIDB4MDBGRTQwMDgsCisweDQ1MEJENTU2LCAweDY2MDM2MUIzLCAweDQwMDhFMDQzLCAweDZEQzAwNEZFLAorMHgwMTRDNjA2MywgMHgzMUVDM0VEQywgMHg2MEUzNkUxQywgMHg3QjAxMDdGQywKKzB4MkM3MDNCQTIsIDB4OEZFODBGRDQsIDB4RTA0MjdDMDEsIDB4RUIwMDQwMDgsCisweDcwRkMwN0ZFLCAweDZFQjM2Q0IzLCAweEEwMjAwQUZFLCAweDI3MTBFREZGLAorMHg3QzAxRkVFMCwgMHg2MEMzNkNDQywgMHg2NTcwMDJGQywgMHg2QkJDM0IyQywKKzB4MDFGQzYwQjMsIDB4MEYxNDYwQzMsIDB4MEYyNDYwQjMsIDB4MDRGQzYwQzMsCisweDM0MkM3RTAxLCAweDAxRkM2MDRDLCAweDI1MUE2MkQzLCAweEQ0M0MyMjVBLAorMHgyNzUwNjAyQywgMHgwNjRFNDAwOCwgMHgyRDZBNEQxOSwgMHgzRUEyNzcwMSwKKzB4NjZENzhCREYsIDB4NDAxOEUwMDEsIDB4MEY2NDY1NjMsIDB4NzAwMTQ1MTksCisweDBGNTQ0NjI5LCAweDBGNjQ3MDAxLCAweDcwMDE0NjE5LCAweDkwNDIwRjY0LAorMHhFMDQ1MEVGRSwgMHhFQTAxNDAwOCwgMHhFMDQ2MEZGNiwgMHg0QTE4NDAwOCwKKzB4RUQwMDY3RjMsIDB4MEZGNjM3QUMsIDB4MEZGNjcwMDQsIDB4RTM0NUUxMDQsCisweDdDMDE0MzA4LCAweDZDQ0MzM0ZDLCAweDYwQzM2NDMyLCAweDU1MzEwMjRDLAorMHg2QkJDM0IyQywgMHgwNDVDNjBCMywgMHg2MEMzNUEzMiwgMHg2MEIzMEE0NCwKKzB4NjBDMzBGMjQsIDB4NkE3MDA2RkMsIDB4NjA2QzM2MkMsIDB4NjZFMDA1RkMsCisweDZBNUM2NEFDLCAweDYyNkMyNEFBLCAweDg5MDUzNDIwLCAweDREMDg0RDA4LAorMHhDQjA0NjBEMywgMHg2MDBCQTAwNiwgMHg3RDAxNDExMCwgMHg4RkQ2NzcwMSwKKzB4RTAwMDdFMDEsIDB4M0YzQzkzMDgsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDAwMEI2QkY2LCAweDAxMzg2QUY2LCAweDAwMDAwMTIwLCAweDAwMjAwRDU0LAorMHgwMDIwMDJCRSwgMHgwMDEwMjgwMCwgMHgwMDIwMEQ2NCwgMHgwMDEwRjAwQSwKKzB4MDAxMEYwMDAsIDB4MDAxQzAwMUMsIDB4MDAxMDMyNTIsIDB4MDAyMDBEQTAsCisweDAwMTBGRkZDLCAweDAwMjAwRDdDLCAweDAwMjAwMzJDLCAweDAwMjAwMzcwLAorMHgwMDIwMDk1NCwgMHgwMDA5MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsIDB4NjQ0Q0JGRjIsCisweDhCRjkzRUMyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweEU1MDA2Q0Y2LAorMHg2NjQzQTAwMiwgMHg3NjAxNzUwMSwgMHgyMjI4NjI2MCwgMHhBRkUzOEJGQSwKKzB4MkZFNjAwMDksIDB4NzUwNzYyNTMsIDB4RTEwODY3NTMsIDB4NjA0M0VFMEEsCisweDQ0MDlDOTBGLCAweDY1MDMzMEUyLCAweDhEMDE0NDA5LCAweEU2MzBFNjM3LAorMHg0MTEwMzY1QywgMHg4RkYyMjc2MCwgMHhFMDAwNzdGRiwgMHgwMDBCODAyOCwKKzB4NEYyMjZFRjYsIDB4QkZFNDdGRUMsIDB4QkZEODY1RjMsIDB4N0YxNDY0RjMsCisweDAwMEI0RjI2LCAweDRGMjJFMDAwLCAweEJGREE3RkVDLCAweDY0RjM2NUYzLAorMHg3NDA2QkZDRCwgMHg0RjI2N0YxNCwgMHhFMDAwMDAwQiwgMHg0RjIyMkZFNiwKKzB4NjI1MzdGRUMsIDB4NjVGMzZFNDMsIDB4NjQyM0JGQ0IsIDB4NjRFM0JGQkYsCisweDY0RjNCRkJELCAweEJGQkFENDAzLCAweDdGMTQwMDA5LCAweDAwMEI0RjI2LAorMHgwMDAwNkVGNiwgMHgwMDIwMERCMCwgMHg4OTAwNDAxMSwgMHg0MTExNjAwQiwKKzB4NEYyMjg5MDYsIDB4NjExQkIwMDQsIDB4MDAwQjRGMjYsIDB4MDAwOTYwMEIsCisweDYyMEQyRjI2LCAweDhGNDEzMDIwLCAweDQwMTgwMDE5LCAweDhCMEQzMDE2LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwKKzB4ODkwMDYyRjYsIDB4NDExOTMxMEMsIDB4NjAxMzAwMEIsIDB4NDEyOTYyMTksCisweDIwMDg0MDE4LCAweDMxMDQ4OTI3LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4NjExOTMxMDQsIDB4MzIwNDIyMUQsIDB4MzIwNDMyMDQsCisweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LAorMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHg4OTAwMzIwNCwgMHg0MjI5MzIwQywKKzB4MDAwQjYwMjMsIDB4RTAwMDYyRjYsIDB4NjJGNjAwMEIsIDB4NDIyODYyMTMsCisweDQyMjQ0MTI5LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LAorMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwKKzB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsCisweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LAorMHg4OTAwMzEwNCwgMHg2MDEzMzEwQywgMHg2MkY2MDAwQiwgMHgyRjI2MkYxNiwKKzB4NTFGNTUyRjMsIDB4NTJGMjIxMjksIDB4NTJGNDEyMTAsIDB4MjEyOTUxRjYsCisweDEyMTE1MkYyLCAweDAwMEI2MkY2LCAweDAwMDA2MUY2LCAweDUxRjMyRjE2LAorMHgzMTAwNTBGMSwgMHg1MUY0OEIwMiwgMHgzMTAwNTBGMiwgMHgwMDBCMDAyOSwKKzB4MDAwMDYxRjYsIDB4NTFGMzJGMTYsIDB4MzEwMDUwRjEsIDB4NTFGNDhCMDYsCisweDMxMDA1MEYyLCAweENBMDEwMDI5LCAweDYxRjYwMDBCLCAweDAwMEJFMDAxLAorMHgwMDAwNjFGNiwgMHg1MEYwMDAwQiwgMHgyRjI2MkYxNiwgMHhFMTAwNTJGMiwKKzB4MTIwMDEyMTEsIDB4MDAwQjYyRjYsIDB4MDAwMDYxRjYsIDB4MkYxNjJGMDYsCisweDhCMjY0MTE1LCAweDMxMDNFMDQwLCAweDJGMjY4OTJCLCAweDUyRjYyRjM2LAorMHhFMDIwNTNGNSwgMHg4QjA1MzEwMywgMHhFMzAwNjIzMywgMHg4OTA5MzEwMCwKKzB4MzEwOEEwMDIsIDB4OEIwRjIzMzgsIDB4RDAwNjRGMjIsIDB4NjAyMzQwMEIsCisweDRGMjY2MjAzLCAweDExMjE1MUY0LCAweDYzRjYxMTMwLCAweDYxRjY2MkY2LAorMHg2MEY2MDAwQiwgMHgwMDIwMDdGNCwgMHg0MTAwQzcwOSwgMHgwMTIzMDExRCwKKzB4NTFGMjAwMDksIDB4MTEwMTUwRjQsIDB4MTEwMDUwRjMsIDB4MDAwQjYxRjYsCisweDUxRjI2MEY2LCAweDExMDFFMDAwLCAweDYxRjYxMTAwLCAweDYwRjYwMDBCLAorMHgwMTMwMDAwMCwgMHgwMTI4MDEyQywgMHgwMTIwMDEyNCwgMHgwMTE4MDExQywKKzB4MDEwNjAxMEEsIDB4MDBGRTAxMDIsIDB4MDBFMjAwRTYsIDB4MDBEQTAwREUsCisweDAwQ0MwMEQwLCAweDAwQzQwMEM4LCAweDAwQTgwMEFDLCAweDAwQTAwMEE0LAorMHgwMDhDMDA5MCwgMHgwMDg0MDA4OCwgMHgwMDY2MDA2QSwgMHgwMDVFMDA2MiwKKzB4NDIyNDQzMDAsIDB4NDIyNDQzMDAsIDB4NDIyNDQzMDAsIDB4NDMyODYxMzMsCisweDQzMDg0MzE4LCAweDQyMjg0MzA4LCAweDQyMDg0MjE4LCAweDQxMDk0MjA4LAorMHhBRkFGNDEwOSwgMHg0MzAwMjIxQiwgMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwKKzB4NjEzMzQyMjQsIDB4NDMxODQzMjgsIDB4NDIxODQyMjgsIDB4QUZBMTQxMTksCisweDQzMDAyMjFCLCAweDQzMDA0MjI0LCAweDQzMDA0MjI0LCAweDYxMzM0MjI0LAorMHg0MzA4NDMyOCwgMHg0MjI4NDMwOCwgMHg0MjA4NDIwOCwgMHg0MTA5NDExOSwKKzB4QUY4RjQxMDksIDB4NDMwMDIyMUIsIDB4NDMwMDQyMjQsIDB4NDMwMDQyMjQsCisweDYxMzM0MjI0LCAweDIxMkQ0MzI4LCAweDYyMTNBRjg0LCAweDQyMjQ0MzAwLAorMHg0MjI0NDMwMCwgMHg0MjI0NDMwMCwgMHg0MzE4NjEzMywgMHg0MzA4NDMwOCwKKzB4NDIwODQyMTgsIDB4NDEyOTQyMDgsIDB4NDEwOTQxMDksIDB4MjIxQkFGNzIsCisweDQyMjQ0MzAwLCAweDQyMjQ0MzAwLCAweDQyMjQ0MzAwLCAweDQzMTg2MTMzLAorMHg0MTI5NDIxOCwgMHhBRjY1NDExOSwgMHg0MzAwMjIxQiwgMHg0MzAwNDIyNCwKKzB4NDMwMDQyMjQsIDB4NDMwMDQyMjQsIDB4NDMwMDQyMjQsIDB4NDMwMDQyMjQsCisweDQzMDA0MjI0LCAweDQyMjRBRjU2LCAweDJGMTYyRjA2LCAweDhCMjY0MTE1LAorMHgzMTAzRTA0MCwgMHgyRjI2ODkyQiwgMHg1MkY2MkYzNiwgMHhFMDIwNTNGNSwKKzB4OEIwNTMxMDMsIDB4RTIwMDYzMjMsIDB4ODkwOTMxMDAsIDB4MzEwOEEwMDIsCisweDhCMEYyMjI4LCAweEQwMDY0RjIyLCAweDYwMzM0MDBCLCAweDRGMjY2MzAzLAorMHgxMTIxNTFGNCwgMHg2M0Y2MTEzMCwgMHg2MUY2NjJGNiwgMHg2MEY2MDAwQiwKKzB4MDAyMDA4QjQsIDB4NDEwMEM3MDksIDB4MDEyMzAxMUQsIDB4NTFGMjAwMDksCisweDExMDE1MEY0LCAweDExMDA1MEYzLCAweDAwMEI2MUY2LCAweDUxRjI2MEY2LAorMHgxMTAxRTAwMCwgMHg2MUY2MTEwMCwgMHg2MEY2MDAwQiwgMHgwMTJFMDAwMCwKKzB4MDEyNjAxMkEsIDB4MDExRTAxMjIsIDB4MDExNjAxMUEsIDB4MDEwNDAxMDgsCisweDAwRkMwMTAwLCAweDAwRTAwMEU0LCAweDAwRDgwMERDLCAweDAwQ0MwMEQwLAorMHgwMEM0MDBDOCwgMHgwMEE4MDBBQywgMHgwMEEwMDBBNCwgMHgwMDhDMDA5MCwKKzB4MDA4NDAwODgsIDB4MDA2NjAwNkEsIDB4MDA1RTAwNjIsIDB4NDMyNTQyMDEsCisweDQzMjU0MjAxLCAweDQzMjU0MjAxLCAweDQyMjk2MTIzLCAweDQyMDk0MjE5LAorMHg0MzI5NDIwOSwgMHg0MzA5NDMxOSwgMHg0MTA4NDMwOSwgMHhBRkFGNDEwOCwKKzB4NDIwMTIzMUIsIDB4NDIwMTQzMjUsIDB4NDIwMTQzMjUsIDB4NjEyMzQzMjUsCisweDQyMTk0MjI5LCAweDQzMTk0MzI5LCAweEFGQTE0MTE4LCAweDQyMDEyMzFCLAorMHg0MjAxNDMyNSwgMHg0MjAxNDMyNSwgMHg2MTIzNDMyNSwgMHg0MjA5NDIyOSwKKzB4NDMyOTQyMDksIDB4NDMwOTQzMDksIDB4NDEwODQxMTgsIDB4QUY4RjQxMDgsCisweDQyMDEyMzFCLCAweDQyMDE0MzI1LCAweDQyMDE0MzI1LCAweDYxMjM0MzI1LAorMHhBRjg1NDIyOSwgMHg0MjAxMjMxRCwgMHg0MjAxNDMyNSwgMHg0MjAxNDMyNSwKKzB4NjEyMzQzMjUsIDB4NDIwOTQyMTksIDB4NDMxOTQyMDksIDB4NDMwOTQzMDksCisweDQxMDg0MTI4LCAweEFGNzM0MTA4LCAweDQyMDEyMzFCLCAweDQyMDE0MzI1LAorMHg0MjAxNDMyNSwgMHg2MTIzNDMyNSwgMHg0MzE5NDIxOSwgMHg0MTE4NDEyOCwKKzB4MjMxQkFGNjYsIDB4NDMyNTQyMDEsIDB4NDMyNTQyMDEsIDB4NDMyNTQyMDEsCisweDQzMjU0MjAxLCAweDQzMjU0MjAxLCAweDQzMjU0MjAxLCAweEFGNTc0MjAxLAorMHgwMDAwNDMyNSwgMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwKKzB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsCisweDZDNjI1NjQ4LCAweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLAorMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwKKzB4MDAyMDA4MUUsIDB4MDAyMDA3RDQsIDB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMjg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLAorMHgwMDBCNDAyOCwgMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwKKzB4NjJGNjAwMEIsIDB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTAzLCAweDAwMEI0MDA1LCAweEM5MDE2MkY2LCAweDAwMEI0MDA1LAorMHgwMDAwNjJGNiwgMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwKKzB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsCisweDZDNjI1NjQ4LCAweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLAorMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwKKzB4MDAyMDA4REUsIDB4MDAyMDA4OTQsIDB4MDAwQkUwMDAsIDB4NDAwMTYyRjYsCisweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDYyRjYwMDBCLAorMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDE5NDAwMSwKKzB4NjJGNjAwMEIsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsCisweDQwMjk0MDAxLCAweDYyRjYwMDBCLCAweDQwMDE0MDAxLCAweDQwMTk0MDAxLAorMHgwMDBCNDAyOSwgMHg0MDA0NjJGNiwgMHg0MDA0NDAwNCwgMHhDOTBGNDAwNCwKKzB4NjJGNjAwMEIsIDB4NDAwNDQwMDQsIDB4QzkwNzQwMDQsIDB4NjJGNjAwMEIsCisweDQwMDQ0MDA0LCAweDAwMEJDOTAzLCAweDQwMDQ2MkY2LCAweDAwMEJDOTAxLAorMHgwMDAwNjJGNiwgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhFRTBFNjEyQywKKzB4OTkwOTUxQkEsIDB4MDc2REM0MTksIDB4NzA2QUY0OEYsIDB4RTk2M0E1MzUsCisweDlFNjQ5NUEzLCAweDBFREI4ODMyLCAweDc5RENCOEE0LCAweEUwRDVFOTFFLAorMHg5N0QyRDk4OCwgMHgwOUI2NEMyQiwgMHg3RUIxN0NCRCwgMHhFN0I4MkQwNywKKzB4OTBCRjFEOTEsIDB4MURCNzEwNjQsIDB4NkFCMDIwRjIsIDB4RjNCOTcxNDgsCisweDg0QkU0MURFLCAweDFBREFENDdELCAweDZERERFNEVCLCAweEY0RDRCNTUxLAorMHg4M0QzODVDNywgMHgxMzZDOTg1NiwgMHg2NDZCQThDMCwgMHhGRDYyRjk3QSwKKzB4OEE2NUM5RUMsIDB4MTQwMTVDNEYsIDB4NjMwNjZDRDksIDB4RkEwRjNENjMsCisweDhEMDgwREY1LCAweDNCNkUyMEM4LCAweDRDNjkxMDVFLCAweEQ1NjA0MUU0LAorMHhBMjY3NzE3MiwgMHgzQzAzRTREMSwgMHg0QjA0RDQ0NywgMHhEMjBEODVGRCwKKzB4QTUwQUI1NkIsIDB4MzVCNUE4RkEsIDB4NDJCMjk4NkMsIDB4REJCQkM5RDYsCisweEFDQkNGOTQwLCAweDMyRDg2Q0UzLCAweDQ1REY1Qzc1LCAweERDRDYwRENGLAorMHhBQkQxM0Q1OSwgMHgyNkQ5MzBBQywgMHg1MURFMDAzQSwgMHhDOEQ3NTE4MCwKKzB4QkZEMDYxMTYsIDB4MjFCNEY0QjUsIDB4NTZCM0M0MjMsIDB4Q0ZCQTk1OTksCisweEI4QkRBNTBGLCAweDI4MDJCODlFLCAweDVGMDU4ODA4LCAweEM2MENEOUIyLAorMHhCMTBCRTkyNCwgMHgyRjZGN0M4NywgMHg1ODY4NEMxMSwgMHhDMTYxMURBQiwKKzB4QjY2NjJEM0QsIDB4NzZEQzQxOTAsIDB4MDFEQjcxMDYsIDB4OThEMjIwQkMsCisweEVGRDUxMDJBLCAweDcxQjE4NTg5LCAweDA2QjZCNTFGLCAweDlGQkZFNEE1LAorMHhFOEI4RDQzMywgMHg3ODA3QzlBMiwgMHgwRjAwRjkzNCwgMHg5NjA5QTg4RSwKKzB4RTEwRTk4MTgsIDB4N0Y2QTBEQkIsIDB4MDg2RDNEMkQsIDB4OTE2NDZDOTcsCisweEU2NjM1QzAxLCAweDZCNkI1MUY0LCAweDFDNkM2MTYyLCAweDg1NjUzMEQ4LAorMHhGMjYyMDA0RSwgMHg2QzA2OTVFRCwgMHgxQjAxQTU3QiwgMHg4MjA4RjRDMSwKKzB4RjUwRkM0NTcsIDB4NjVCMEQ5QzYsIDB4MTJCN0U5NTAsIDB4OEJCRUI4RUEsCisweEZDQjk4ODdDLCAweDYyREQxRERGLCAweDE1REEyRDQ5LCAweDhDRDM3Q0YzLAorMHhGQkQ0NEM2NSwgMHg0REIyNjE1OCwgMHgzQUI1NTFDRSwgMHhBM0JDMDA3NCwKKzB4RDRCQjMwRTIsIDB4NEFERkE1NDEsIDB4M0REODk1RDcsIDB4QTREMUM0NkQsCisweEQzRDZGNEZCLCAweDQzNjlFOTZBLCAweDM0NkVEOUZDLCAweEFENjc4ODQ2LAorMHhEQTYwQjhEMCwgMHg0NDA0MkQ3MywgMHgzMzAzMURFNSwgMHhBQTBBNEM1RiwKKzB4REQwRDdDQzksIDB4NTAwNTcxM0MsIDB4MjcwMjQxQUEsIDB4QkUwQjEwMTAsCisweEM5MEMyMDg2LCAweDU3NjhCNTI1LCAweDIwNkY4NUIzLCAweEI5NjZENDA5LAorMHhDRTYxRTQ5RiwgMHg1RURFRjkwRSwgMHgyOUQ5Qzk5OCwgMHhCMEQwOTgyMiwKKzB4QzdEN0E4QjQsIDB4NTlCMzNEMTcsIDB4MkVCNDBEODEsIDB4QjdCRDVDM0IsCisweEMwQkE2Q0FELCAweEVEQjg4MzIwLCAweDlBQkZCM0I2LCAweDAzQjZFMjBDLAorMHg3NEIxRDI5QSwgMHhFQUQ1NDczOSwgMHg5REQyNzdBRiwgMHgwNERCMjYxNSwKKzB4NzNEQzE2ODMsIDB4RTM2MzBCMTIsIDB4OTQ2NDNCODQsIDB4MEQ2RDZBM0UsCisweDdBNkE1QUE4LCAweEU0MEVDRjBCLCAweDkzMDlGRjlELCAweDBBMDBBRTI3LAorMHg3RDA3OUVCMSwgMHhGMDBGOTM0NCwgMHg4NzA4QTNEMiwgMHgxRTAxRjI2OCwKKzB4NjkwNkMyRkUsIDB4Rjc2MjU3NUQsIDB4ODA2NTY3Q0IsIDB4MTk2QzM2NzEsCisweDZFNkIwNkU3LCAweEZFRDQxQjc2LCAweDg5RDMyQkUwLCAweDEwREE3QTVBLAorMHg2N0RENEFDQywgMHhGOUI5REY2RiwgMHg4RUJFRUZGOSwgMHgxN0I3QkU0MywKKzB4NjBCMDhFRDUsIDB4RDZENkEzRTgsIDB4QTFEMTkzN0UsIDB4MzhEOEMyQzQsCisweDRGREZGMjUyLCAweEQxQkI2N0YxLCAweEE2QkM1NzY3LCAweDNGQjUwNkRELAorMHg0OEIyMzY0QiwgMHhEODBEMkJEQSwgMHhBRjBBMUI0QywgMHgzNjAzNEFGNiwKKzB4NDEwNDdBNjAsIDB4REY2MEVGQzMsIDB4QTg2N0RGNTUsIDB4MzE2RThFRUYsCisweDQ2NjlCRTc5LCAweENCNjFCMzhDLCAweEJDNjY4MzFBLCAweDI1NkZEMkEwLAorMHg1MjY4RTIzNiwgMHhDQzBDNzc5NSwgMHhCQjBCNDcwMywgMHgyMjAyMTZCOSwKKzB4NTUwNTI2MkYsIDB4QzVCQTNCQkUsIDB4QjJCRDBCMjgsIDB4MkJCNDVBOTIsCisweDVDQjM2QTA0LCAweEMyRDdGRkE3LCAweEI1RDBDRjMxLCAweDJDRDk5RThCLAorMHg1QkRFQUUxRCwgMHg5QjY0QzJCMCwgMHhFQzYzRjIyNiwgMHg3NTZBQTM5QywKKzB4MDI2RDkzMEEsIDB4OUMwOTA2QTksIDB4RUIwRTM2M0YsIDB4NzIwNzY3ODUsCisweDA1MDA1NzEzLCAweDk1QkY0QTgyLCAweEUyQjg3QTE0LCAweDdCQjEyQkFFLAorMHgwQ0I2MUIzOCwgMHg5MkQyOEU5QiwgMHhFNUQ1QkUwRCwgMHg3Q0RDRUZCNywKKzB4MEJEQkRGMjEsIDB4ODZEM0QyRDQsIDB4RjFENEUyNDIsIDB4NjhEREIzRjgsCisweDFGREE4MzZFLCAweDgxQkUxNkNELCAweEY2QjkyNjVCLCAweDZGQjA3N0UxLAorMHgxOEI3NDc3NywgMHg4ODA4NUFFNiwgMHhGRjBGNkE3MCwgMHg2NjA2M0JDQSwKKzB4MTEwMTBCNUMsIDB4OEY2NTlFRkYsIDB4Rjg2MkFFNjksIDB4NjE2QkZGRDMsCisweDE2NkNDRjQ1LCAweEEwMEFFMjc4LCAweEQ3MEREMkVFLCAweDRFMDQ4MzU0LAorMHgzOTAzQjNDMiwgMHhBNzY3MjY2MSwgMHhEMDYwMTZGNywgMHg0OTY5NDc0RCwKKzB4M0U2RTc3REIsIDB4QUVEMTZBNEEsIDB4RDlENjVBREMsIDB4NDBERjBCNjYsCisweDM3RDgzQkYwLCAweEE5QkNBRTUzLCAweERFQkI5RUM1LCAweDQ3QjJDRjdGLAorMHgzMEI1RkZFOSwgMHhCREJERjIxQywgMHhDQUJBQzI4QSwgMHg1M0IzOTMzMCwKKzB4MjRCNEEzQTYsIDB4QkFEMDM2MDUsIDB4Q0RENzA2OTMsIDB4NTRERTU3MjksCisweDIzRDk2N0JGLCAweEIzNjY3QTJFLCAweEM0NjE0QUI4LCAweDVENjgxQjAyLAorMHgyQTZGMkI5NCwgMHhCNDBCQkUzNywgMHhDMzBDOEVBMSwgMHg1QTA1REYxQiwKKzB4MkQwMkVGOEQsIDB4NTQ0RjBEMEEsIDB4NTAyMDUzNTUsIDB4MjAzMTJENDgsCisweDAwM0E1NzQ2LCAweDcyNjM2NTY0LCAweDY5NzQ3MDc5LCAweDY1MjA2RTZGLAorMHg3MjZGNzI3MiwgMHgwQTBEMjEyMSwgMHgwMDAwMDAwMCwgMHg2NTY0NjY3QSwKKzB4NzA3OTcyNjMsIDB4NjU3MjVGNzQsIDB4NjE2Qzc1NjcsIDB4Nzk3MjZGNzQsCisweDYyNjE3NDVGLCAweDcyMjA2NTZDLCAweDIwM0Q3NDY1LCAweDAwMDAwMDAwLAorMHg0NTQ4NTQ0MSwgMHgzODczMTY1MiwgMHg4OUFDRkY5MSwgMHhFRTU1RDE3OCwKKzB4RUUwMDBEMEEsIH07CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MzUwODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocG1haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocG1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTY1YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwbWFpbi5jCkBAIC0wLDAgKzEsNDY0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisjaW5jbHVkZSAiaHBhbmkuaCIKKyNpbmNsdWRlICJocHVzYi5oIgorI2luY2x1ZGUgIm90dXMuaW5pIgorCitleHRlcm4gY29uc3QgdTMyX3QgemNGd0ltYWdlW107CitleHRlcm4gY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0RLRndJbWFnZVtdOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjREtGd0ltYWdlU2l6ZTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTUElbXTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTUElTaXplOworCisjaWZkZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCitleHRlcm4gY29uc3QgdTMyX3QgemNGd0J1ZkltYWdlW107CitleHRlcm4gY29uc3QgdTMyX3QgemNGd0J1ZkltYWdlU2l6ZTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y1AyRndJbWFnZVtdOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjUDJGd0ltYWdlU2l6ZTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgemZJbml0Q21kUXVldWUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmSXNzdWVDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbiwKKyAgICAgICAgdTE2X3Qgc3JjLCB1OF90KiBidWYpOworZXh0ZXJuIHZvaWQgemZJZGxSc3AoemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdTE2X3QgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTE2X3QgemZGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZVc2JJbml0KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZkZpcm13YXJlRG93bmxvYWQoemRldl90KiBkZXYsIHUzMl90KiBmdywgdTMyX3QgbGVuLCB1MzJfdCBvZmZzZXQpOworZXh0ZXJuIHUxNl90IHpmRmlybXdhcmVEb3dubG9hZE5vdEp1bXAoemRldl90KiBkZXYsIHUzMl90KiBmdywgdTMyX3QgbGVuLCB1MzJfdCBvZmZzZXQpOworZXh0ZXJuIHZvaWQgemZVc2JGcmVlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZkN3bUlzRXh0Q2hhbkJ1c3kodTMyX3QgY3RsQnVzeSwgdTMyX3QgZXh0QnVzeSk7CitleHRlcm4gdm9pZCB6ZkNvcmVDd21CdXN5KHpkZXZfdCogZGV2LCB1MTZfdCBidXN5KTsKKworLyogUHJvdG90eXBlcyAqLwordm9pZCB6ZkluaXRSZih6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5KTsKK3ZvaWQgemZJbml0UGh5KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCk7Cit2b2lkIHpmSW5pdE1hYyh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZTZXRQb3dlckNhbFRhYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwgdThfdCBleHRPZmZzZXQpOwordm9pZCB6ZkluaXRQb3dlckNhbCh6ZGV2X3QqIGRldik7CisKKyNpZmRlZiBaTV9EUlZfSU5JVF9VU0JfTU9ERQordm9pZCB6ZkluaXRVc2JNb2RlKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmSHBVc2JSZXNldCh6ZGV2X3QqIGRldik7CisjZW5kaWYKKworLyogQmFuayAwIDEgMiAzIDUgNiA3ICovCit2b2lkIHpmU2V0UmZSZWdzKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpOworLyogQmFuayA0ICovCit2b2lkIHpmU2V0QmFuazRBbmRQb3dlclRhYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwKKyAgICAgICAgdThfdCBleHRPZmZzZXQpOworLyogR2V0IHBhcmFtIGZvciB0dXJub2ZmZHluICovCit2b2lkIHpmR2V0SHdUdXJuT2ZmZHluUGFyYW0oemRldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsIHU4X3QgZXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSk7CisKK3ZvaWQgemZTZWxBZGNDbGsoemRldl90KiBkZXYsIHU4X3QgYnc0MCwgdTMyX3QgZnJlcXVlbmN5KTsKK3UzMl90IHpmSHBFY2hvQ29tbWFuZCh6ZGV2X3QqIGRldiwgdTMyX3QgdmFsdWUpOworCisKKworI2RlZmluZSB6bV9ocF9wcml2KHgpICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPngpCitzdHJ1Y3QgenNIcFByaXYgemdIcFByaXY7CisKKyNkZWZpbmUgWk1fRklSTVdBUkVfV0xBTl9BRERSICAgICAgICAgICAweDIwMDAwMAorI2RlZmluZSBaTV9GSVJNV0FSRV9TUElfQUREUiAgICAgIDB4MTE0MDAwCisvKiAwOiByZWFsIGNoaXAgICAgIDE6IEZQR0EgdGVzdCAqLworI2RlZmluZSBaTV9GUEdBX1BIWSAgMAorCisjZGVmaW5lIHJlZ193cml0ZShhZGRyLCB2YWwpIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgYWRkcisweDFiYzAwMCwgdmFsKQorI2RlZmluZSB6bV9taW4oQSwgQikgKChBPkIpPyBCOkEpCisKKworLyoqKioqKioqKioqKioqKioqKioqIEludGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkhwSW5pdCh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5KQoreworICAgIHUxNl90IHJldDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBJbml0aWFsaXphIEhBTCBQbHVzIHByaXZhdGUgdmFyaWFibGVzICovCisgICAgd2QtPmhwUHJpdmF0ZSA9ICZ6Z0hwUHJpdjsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsQ2FwYWJpbGl0eSA9IFpNX0hQX0NBUF8xMU47CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5ID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3Qnc0MCA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0V4dE9mZnNldCA9IDA7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmRpc2FibGVEZnNDaCA9IDA7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmxlZE1vZGVbMF0gPSAxOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVsxXSA9IDE7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5zdHJvbmdSU1NJID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnJ4U3Ryb25nUlNTSSA9IDA7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnNsb3RUeXBlID0gMTsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmFnZ1BrdE51bSA9IDB4MTAwMDBhOworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5lZXByb21JbWFnZUluZGV4ID0gMDsKKworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5lZXByb21JbWFnZVJkUmVxICAgICA9IDA7CisjaWZkZWYgWk1fT1RVU19SWF9TVFJFQU1fTU9ERQorICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+cmVtYWluQnVmID0gTlVMTDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnVzYlJ4UmVtYWluTGVuID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnVzYlJ4UGt0TGVuID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnVzYlJ4UGFkTGVuID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnVzYlJ4VHJhbnNmZXJMZW4gPSAwOworI2VuZGlmCisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmVuYWJsZUJCSGVhdnlDbGlwID0gMTsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3QkJIZWF2eUNsaXAgICAgID0gMTsgLy8gZm9yY2UgZW5hYmxlIDgxMDcKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmRvQkJIZWF2eUNsaXAgICAgID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnNldFZhbHVlSGVhdnlDbGlwID0gMDsKKworCisgICAgLyogSW5pdGlhbGl6ZSBkcml2ZXIgY29yZSAqLworICAgIHpmSW5pdENtZFF1ZXVlKGRldik7CisKKyAgICAvKiBJbml0aWFsaXplIFVTQiAqLworICAgIHpmVXNiSW5pdChkZXYpOworCisjaWYgWk1fU1dfTE9PUF9CQUNLICE9IDEKKworICAgIC8qIFRPRE8gOiBbRG93bmxvYWQgRlddICovCisgICAgaWYgKHdkLT5tb2RlTURLRW5hYmxlKQorICAgIHsKKyAgICAgICAgLyogZG93bmxvYWQgdGhlIE1ESyBmaXJtd2FyZSAqLworICAgICAgICBpZiAoKHJldCA9IHpmRmlybXdhcmVEb3dubG9hZChkZXYsICh1MzJfdCopemNES0Z3SW1hZ2UsCisgICAgICAgICAgICAgICAgKHUzMl90KXpjREtGd0ltYWdlU2l6ZSwgWk1fRklSTVdBUkVfV0xBTl9BRERSKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVE9ETyA6IGV4Y2VwdGlvbiBoYW5kbGluZyAqLworICAgICAgICAgICAgLy9yZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgICAgIC8qIGRvbndsb2FkIHRoZSBub3JtYWwgZnJpbXdhcmUgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjRndJbWFnZSwKKyAgICAgICAgICAgICAgICAodTMyX3QpemNGd0ltYWdlU2l6ZSwgWk1fRklSTVdBUkVfV0xBTl9BRERSKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVE9ETyA6IGV4Y2VwdGlvbiBoYW5kbGluZyAqLworICAgICAgICAgICAgLy9yZXR1cm4gMTsKKyAgICAgICAgfQorICAgICNlbHNlCisKKyAgICAgICAgLy8gMS1QSCBmdzogUmVhZE1hYygpIHN0b3JlIHNvbWUgZ2xvYmFsIHZhcmlhYmxlCisgICAgICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkTm90SnVtcChkZXYsICh1MzJfdCopemNGd0J1ZkltYWdlLAorICAgICAgICAgICAgICAgICh1MzJfdCl6Y0Z3QnVmSW1hZ2VTaXplLCAweDEwMjgwMCkpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIERiZ1ByaW50KCJEbCB6Y0Z3QnVmSW1hZ2UgZmFpbGVkISIpOworICAgICAgICB9CisKKyAgICAgICAgemZ3U2xlZXAoZGV2LCAxMDAwKTsKKworICAgICAgICBpZiAoKHJldCA9IHpmRmlybXdhcmVEb3dubG9hZChkZXYsICh1MzJfdCopemNGd0ltYWdlLAorICAgICAgICAgICAgICAgICh1MzJfdCl6Y0Z3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpKSAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBEYmdQcmludCgiRGwgemNGd0J1ZkltYWdlIGZhaWxlZCEiKTsKKyAgICAgICAgfQorICAgICNlbmRpZgorICAgIH0KKyNlbmRpZgorCisjaWZkZWYgWk1fRFJWX0lOSVRfVVNCX01PREUKKyAgICAvKiBJbml0IFVTQiBNb2RlICovCisgICAgemZJbml0VXNiTW9kZShkZXYpOworCisgICAgLyogRG8gdGhlIFVTQiBSZXNldCAqLworICAgIHpmSHBVc2JSZXNldChkZXYpOworI2VuZGlmCisKKy8qIFJlZ2lzdGVyIHNldHRpbmcgKi8KKy8qIFpNX0RSSVZFUl9NT0RFTF9UWVBFX01ESworICogIDE9PmZvciBNREssIGRpc2FibGUgaW5pdCBSRiwgUEhZLCBhbmQgTUFDLAorICogIDA9Pm5vcm1hbCBpbml0CisgKi8KKy8vI2lmICgoWk1fU1dfTE9PUF9CQUNLICE9IDEpICYmIChaTV9EUklWRVJfTU9ERUxfVFlQRV9NREsgIT0xKSkKKyNpZiBaTV9TV19MT09QX0JBQ0sgIT0gMQorICAgIGlmKCF3ZC0+bW9kZU1ES0VuYWJsZSkKKyAgICB7CisgICAgICAgIC8qIEluaXQgTUFDICovCisgICAgICAgIHpmSW5pdE1hYyhkZXYpOworCisgICAgI2lmIFpNX0ZXX0xPT1BfQkFDSyAhPSAxCisgICAgICAgIC8qIEluaXQgUEhZICovCisgICAgICAgIHpmSW5pdFBoeShkZXYsIGZyZXF1ZW5jeSwgMCk7CisKKyAgICAgICAgLyogSW5pdCBSRiAqLworICAgICAgICB6ZkluaXRSZihkZXYsIGZyZXF1ZW5jeSk7CisKKyAgICAgICAgI2lmIFpNX0ZQR0FfUEhZID09IDAKKyAgICAgICAgLyogQnJpbmdVcCBpc3N1ZSAqLworICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHg5ODAwKzB4MWJjMDAwLCAweDEwMDAwMDA3KTsKKyAgICAgICAgLy96ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICAjZW5kaWYKKworICAgICNlbmRpZiAvKiBlbmQgb2YgWk1fRldfTE9PUF9CQUNLICE9IDEgKi8KKyAgICB9CisjZW5kaWYgLyogZW5kIG9mICgoWk1fU1dfTE9PUF9CQUNLICE9IDEpICYmIChaTV9EUklWRVJfTU9ERUxfVFlQRV9NREsgIT0xKSkgKi8KKworICAgIHpmSHBFY2hvQ29tbWFuZChkZXYsIDB4QUFCQkNDREQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKwordTE2X3QgemZIcFJlaW5pdCh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5KQoreworICAgIHUxNl90IHJldDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJlSW5pdCA9IDE7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnN0cm9uZ1JTU0kgPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+cnhTdHJvbmdSU1NJID0gMDsKKworI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKKyAgICBpZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yZW1haW5CdWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnJlbWFpbkJ1ZiwgMCk7CisgICAgfQorICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+cmVtYWluQnVmID0gTlVMTDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnVzYlJ4UmVtYWluTGVuID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnVzYlJ4UGt0TGVuID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnVzYlJ4UGFkTGVuID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnVzYlJ4VHJhbnNmZXJMZW4gPSAwOworI2VuZGlmCisKKyAgICB6ZkluaXRDbWRRdWV1ZShkZXYpOworICAgIHpmQ29yZVJlaW5pdChkZXYpOworCisgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAvKiBEb3dubG9hZCBmaXJtd2FyZSAqLworICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0Z3SW1hZ2UsCisgICAgICAgICAgICAodTMyX3QpemNGd0ltYWdlU2l6ZSwgWk1fRklSTVdBUkVfV0xBTl9BRERSKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBleGNlcHRpb24gaGFuZGxpbmcgKi8KKyAgICAgICAgLy9yZXR1cm4gMTsKKyAgICB9CisgICAgI2Vsc2UKKyAgICBpZiAoKHJldCA9IHpmRmlybXdhcmVEb3dubG9hZChkZXYsICh1MzJfdCopemNQMkZ3SW1hZ2UsCisgICAgICAgICAgICAodTMyX3QpemNQMkZ3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IGV4Y2VwdGlvbiBoYW5kbGluZyAqLworICAgICAgICAvL3JldHVybiAxOworICAgIH0KKyAgICAjZW5kaWYKKworI2lmZGVmIFpNX0RSVl9JTklUX1VTQl9NT0RFCisgICAgLyogSW5pdCBVU0IgTW9kZSAqLworICAgIHpmSW5pdFVzYk1vZGUoZGV2KTsKKworICAgIC8qIERvIHRoZSBVU0IgUmVzZXQgKi8KKyAgICB6ZkhwVXNiUmVzZXQoZGV2KTsKKyNlbmRpZgorCisgICAgLyogSW5pdCBNQUMgKi8KKyAgICB6ZkluaXRNYWMoZGV2KTsKKworICAgIC8qIEluaXQgUEhZICovCisgICAgemZJbml0UGh5KGRldiwgZnJlcXVlbmN5LCAwKTsKKyAgICAvKiBJbml0IFJGICovCisgICAgemZJbml0UmYoZGV2LCBmcmVxdWVuY3kpOworCisgICAgI2lmIFpNX0ZQR0FfUEhZID09IDAKKyAgICAvKiBCcmluZ1VwIGlzc3VlICovCisgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4OTgwMCsweDFiYzAwMCwgMHgxMDAwMDAwNyk7CisgICAgLy96ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICNlbmRpZgorCisgICAgemZIcEVjaG9Db21tYW5kKGRldiwgMHhBQUJCQ0NERCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit1MTZfdCB6ZkhwUmVsZWFzZSh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBGcmVlIFVTQiByZXNvdXJjZSAqLworICAgIHpmVXNiRnJlZShkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE1ESyBtb2RlIHNldHRpbmcgZm9yIGRvbnRSZXRyYW5zbWl0ICovCit2b2lkIHpmSHBDb25maWdGTSh6ZGV2X3QqIGRldiwgdTMyX3QgUnhNYXhTaXplLCB1MzJfdCBEb250UmV0cmFuc21pdCkKK3sKKyAgICB1MzJfdCBjbWRbM107CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gOCB8IChaTV9DTURfQ09ORklHIDw8IDgpOworICAgIGNtZFsxXSA9IFJ4TWF4U2l6ZTsgICAgICAgICAgLyogemdSeE1heFNpemUgKi8KKyAgICBjbWRbMl0gPSBEb250UmV0cmFuc21pdDsgICAgIC8qIHpnRG9udFJldHJhbnNtaXQgKi8KKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIDApOworfQorCitjb25zdCB1OF90IHpjWHBkVG9QZFsxNl0gPQoreworIC8qIDB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LCAweDgsIDB4OSwgMHhBLCAweEIsIDB4QywgMHhELCAweEUsIDB4RiAqLworICAgIDB4MiwgMHgyLCAweDIsIDB4MSwgMHgyLCAweDIsIDB4NiwgMHgyLCAweDIsIDB4MywgMHg3LCAweDIsIDB4QiwgMHgyLCAweDIsIDB4MgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqIFJGIGFuZCBQSFkgKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgemZJbml0UGh5KHpkZXZfdCogZGV2LCAgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDApCit7CisgICAgdTE2X3QgaSwgaiwgazsKKyAgICB1MTZfdCBlbnRyaWVzOworICAgIHUxNl90IG1vZGVzSW5kZXggPSAwOworICAgIHUxNl90IGZyZXFJbmRleCA9IDA7CisgICAgdTMyX3QgdG1wLCB0bXAxOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworICAgIHUzMl90IGVlcHJvbUJvYXJkRGF0YVsxNV1bNl0gPSB7CisgICAgLyogUmVnaXN0ZXIgICBBLTIwICAgICAgICBBLTIwLzQwICAgICBHLTIwLzQwICAgICBHLTIwICAgICAgICBHLVR1cmJvICAgICovCisgICAgICAgIHsweDk5NjQsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweDk5NjAsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweGI5NjAsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweDk4NDQsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweDk4NTAsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweDk4MzQsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweDk4MjgsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweGM4NjQsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweDk4NDgsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweGI4NDgsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweGEyMGMsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweGMyMGMsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweDk5MjAsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweGI5MjAsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgICAgIHsweGEyNTgsICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMH0sCisgICAgfTsKKworICAgIC8qICMxIFNhdmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgUklGUyByZWdpc3RlciBzZXR0aW5ncyAqLworICAgIC8vKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pc0luaXRpYWxQaHkrKzsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIGluZGljZXMgZm9yIHRoZSBuZXh0IHNldCBvZiByZWdpc3RlciBhcnJheSB3cml0ZXMKKyAgICAgKiBQSFkgbW9kZSBpcyBzdGF0aWMyMCAvIDIwNDAKKyAgICAgKiBGcmVxdWVuY3kgaXMgMi40R0h6IChCKSAvIDVHSHogKEEpCisgICAgICovCisgICAgaWYgKCBmcmVxdWVuY3kgPiBaTV9DSF9HXzE0ICkKKyAgICB7CisgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgZnJlcUluZGV4ICA9IDE7CisgICAgICAgIGlmIChidzQwKQorICAgICAgICB7CisgICAgICAgICAgICBtb2Rlc0luZGV4ID0gMjsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImluaXQgYXI1NDE2TW9kZXMgaW4gMjogQS0yMC80MCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbW9kZXNJbmRleCA9IDE7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJpbml0IGFyNTQxNk1vZGVzIGluIDE6IEEtMjAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgZnJlcUluZGV4ICA9IDI7CisgICAgICAgIGlmIChidzQwKQorICAgICAgICB7CisgICAgICAgICAgICBtb2Rlc0luZGV4ID0gMzsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImluaXQgYXI1NDE2TW9kZXMgaW4gMzogRy0yMC80MCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbW9kZXNJbmRleCA9IDQ7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJpbml0IGFyNTQxNk1vZGVzIGluIDQ6IEctMjAiKTsKKyAgICAgICAgfQorICAgIH0KKworCisjaWYgWk1fRlBHQV9QSFkgPT0gMQorICAgIC8qIFN0YXJ0aW5nIEV4dGVybmFsIEhhaW5hbiBSZWdpc3RlciBJbml0aWFsaXphdGlvbiAqLworICAgIC8qIFRPRE86ICovCisKKyAgICB6ZndTbGVlcChkZXYsIDEwKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKlNldCBjb3JyZWN0IEJhc2ViYW5kIHRvIGFuYWxvZyBzaGlmdCBzZXR0aW5nIHRvIGFjY2VzcyBhbmFsb2cgY2hpcHMuCisgICAgICovCisgICAgLy9yZWdfd3JpdGUoUEhZX0JBU0UsIDB4MDAwMDAwMDcpOworLy8gICAgcmVnX3dyaXRlKDB4OTgwMCwgMHgwMDAwMDAwNyk7CisKKyAgICAvKgorICAgICAqIFdyaXRlIGFkZGFjIHNoaWZ0cworICAgICAqLworICAgICAvLyBkbyB0aGlzIGluIGZpcm13YXJlCisKKworCisgICAgLyogWmVyb2l6ZSBib2FyZCBkYXRhICovCisgICAgZm9yIChqPTA7IGo8MTU7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaz0xOyBrPD00OyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcHJvbUJvYXJkRGF0YVtqXVtrXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgIC8qCisgICAgICogUmVnaXN0ZXIgc2V0dGluZyBieSBtb2RlCisgICAgICovCisKKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNk1vZGVzKSAvIHNpemVvZigqYXI1NDE2TW9kZXMpOworICAgIHptX21zZzFfc2NhbihaTV9MVl8yLCAiTW9kZXMgcmVnaXN0ZXIgc2V0dGluZyBlbnRyaWVzPSIsIGVudHJpZXMpOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisjaWYgMAorICAgICAgICBpZiAoICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdOb3RGaXJzdEluaXQgJiYgKGFyNTQxNk1vZGVzW2ldWzBdID09IDB4YTI3YykgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGb3JjZSBkaXNhYmxlIENSNjcxIGJpdDIwIC8gNzgyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIFRoZSBidWcgaGFzIHRvIGRvIHdpdGggdGhlIHBvbGFyaXR5IG9mIHRoZSBwZGFkYyBvZmZzZXQgY2FsaWJyYXRpb24uICBUaGVyZSAqLworICAgICAgICAgICAgLyogaXMgYW4gaW5pdGlhbCBjYWxpYnJhdGlvbiB0aGF0IGlzIE9LLCBhbmQgdGhlcmUgaXMgYSBjb250aW51b3VzICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBjYWxpYnJhdGlvbiB0aGF0IHVwZGF0ZXMgdGhlIHBkZGFjIHdpdGggdGhlIHdyb25nIHBvbGFyaXR5LiAgRm9ydHVuYXRlbHkgICAgKi8KKyAgICAgICAgICAgIC8qIHRoZSBzZWNvbmQgbG9vcCBjYW4gYmUgZGlzYWJsZWQgd2l0aCBhIGJpdCBjYWxsZWQgZW5fcGRfZGNfb2Zmc2V0X3Roci4gICAgICAqLworCisgICAgICAgICAgICByZWdfd3JpdGUoYXI1NDE2TW9kZXNbaV1bMF0sIChhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XSYgMHhmZmVmZmZmZikgKTsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdOb3RGaXJzdEluaXQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2VuZGlmCisgICAgICAgICAgICAvKiBGaXJzdFRpbWUgSW5pdCBvciBub3QgMHhhMjdjKENSNjcxKSAqLworICAgICAgICAgICAgcmVnX3dyaXRlKGFyNTQxNk1vZGVzW2ldWzBdLCBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XSk7CisvLyAgICAgICAgfQorICAgICAgICAvKiBJbml0aWFsaXplIGJvYXJkIGRhdGEgKi8KKyAgICAgICAgZm9yIChqPTA7IGo8MTU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyNTQxNk1vZGVzW2ldWzBdID09IGVlcHJvbUJvYXJkRGF0YVtqXVswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGs9MTsgazw9NDsgaysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tQm9hcmREYXRhW2pdW2tdID0gYXI1NDE2TW9kZXNbaV1ba107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qICMxIFNhdmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgUklGUyByZWdpc3RlciBzZXR0aW5ncyAqLworICAgICAgICAvL2lmKCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlzSW5pdGlhbFBoeSA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGFyNTQxNk1vZGVzW2ldWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMHg5ODUwIDoKKyAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0RGVzaXJlZFNpZ1NpemUgICAgICAgICAgID0gYXI1NDE2TW9kZXNbaV1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg5ODVjIDoKKyAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0QUdDICAgICAgICAgICAgICAgICAgICAgID0gYXI1NDE2TW9kZXNbaV1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg5ODYwIDoKKyAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0QWdjQ29udHJvbCAgICAgICAgICAgICAgID0gYXI1NDE2TW9kZXNbaV1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg5OTE4IDoKKyAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0U2VhcmNoU3RhcnREZWxheSAgICAgICAgID0gYXI1NDE2TW9kZXNbaV1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg5OWVjIDoKKyAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0UklGU1NlYXJjaFBhcmFtcyAgICAgICAgID0gYXI1NDE2TW9kZXNbaV1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHhhMzg4IDoKKyAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0RmFzdENoYW5uZWxDaGFuZ2VDb250cm9sID0gYXI1NDE2TW9kZXNbaV1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmIDAKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyoKKyAgICAgKiBDb21tb24gUmVnaXN0ZXIgc2V0dGluZworICAgICAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2Q29tbW9uKSAvIHNpemVvZigqYXI1NDE2Q29tbW9uKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2Q29tbW9uW2ldWzBdLCBhcjU0MTZDb21tb25baV1bMV0pOworICAgIH0KKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyoKKyAgICAgKiBSRiBHYWluIHNldHRpbmcgYnkgZnJlcUluZGV4CisgICAgICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCQl9SZkdhaW4pIC8gc2l6ZW9mKCphcjU0MTZCQl9SZkdhaW4pOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCQl9SZkdhaW5baV1bMF0sIGFyNTQxNkJCX1JmR2FpbltpXVtmcmVxSW5kZXhdKTsKKyAgICB9CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIC8qCisgICAgICogTW92ZWQgYXI1NDE2SW5pdENoYWluTWFzaygpIGhlcmUgdG8gZW5zdXJlIHRoZSBzd2FwIGJpdCBpcyBzZXQgYmVmb3JlCisgICAgICogdGhlIHBkYWRjIHRhYmxlIGlzIHdyaXR0ZW4uICBTd2FwIG11c3Qgb2NjdXIgYmVmb3JlIGFueSByYWRpbyBkZXBlbmRlbnQKKyAgICAgKiByZXBsaWNhdGVkIHJlZ2lzdGVyIGFjY2Vzcy4gIFRoZSBwZGFkYyBjdXJ2ZSBhZGRyZXNzaW5nIGluIHBhcnRpY3VsYXIKKyAgICAgKiBkZXBlbmRzIG9uIHRoZSBjb25zaXN0ZW50IHNldHRpbmcgb2YgdGhlIHN3YXAgYml0LgorICAgICAqLworICAgIC8vYXI1NDE2SW5pdENoYWluTWFzayhwRGV2KTsKKworICAgIC8qIFNldHVwIHRoZSB0cmFuc21pdCBwb3dlciB2YWx1ZXMuICovCisgICAgLy8gVE9ETworI2VuZGlmCisKKyAgICAvKiBVcGRhdGUgNUcgYm9hcmQgZGF0YSAqLworICAgIC8vQW50IGNvbnRyb2wgY29tbW9uCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0NCoyLzRdOworICAgIGVlcHJvbUJvYXJkRGF0YVswXVsxXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMF1bMl0gPSB0bXA7CisgICAgLy9BbnQgY29udHJvbCBjaGFpbiAwCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0MCoyLzRdOworICAgIGVlcHJvbUJvYXJkRGF0YVsxXVsxXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMV1bMl0gPSB0bXA7CisgICAgLy9BbnQgY29udHJvbCBjaGFpbiAyCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0MioyLzRdOworICAgIGVlcHJvbUJvYXJkRGF0YVsyXVsxXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMl1bMl0gPSB0bXA7CisgICAgLy9Td1NldHRsZQorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4N2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzFdICY9ICh+KCh1MzJfdCkweDNmODApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bMV0gfD0gKHRtcCA8PCA3KTsKKyNpZiAwCisgICAgLy9zd1NldHRsZUh0NDAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTU4KjIvNF07CisgICAgdG1wID0gKHRtcCkgJiAweDdmOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVsyXSAmPSAofigodTMyX3QpMHgzZjgwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzJdIHw9ICh0bXAgPDwgNyk7CisjZW5kaWYKKyAgICAvL2FkY0Rlc2lyZWQsIHBkYURlc2lyZWQKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQ4KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAyNCk7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNGEqMi80XTsKKyAgICB0bXAxID0gdG1wMSAmIDB4ZmY7CisgICAgdG1wID0gdG1wICsgKHRtcDE8PDgpOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVsxXSAmPSAofigodTMyX3QpMHhmZmZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzFdIHw9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bMl0gJj0gKH4oKHUzMl90KTB4ZmZmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVsyXSB8PSB0bXA7CisgICAgLy9UeEVuZFRvWHBhT2ZmLCBUeEZyYW1lVG9YcGFPbgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNGEqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4ZmY7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNGMqMi80XTsKKyAgICB0bXAxID0gKHRtcDEgPj4gOCkgJiAweGZmOworICAgIHRtcCA9ICh0bXA8PDI0KSArICh0bXA8PDE2KSArICh0bXAxPDw4KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzVdWzFdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVs1XVsyXSA9IHRtcDsKKyAgICAvL1R4RW5hVG9SeE9tCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0YyoyLzRdICYgMHhmZjsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bMV0gJj0gKH4oKHUzMl90KTB4ZmYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzFdIHw9ICh0bXA8PDE2KTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bMl0gJj0gKH4oKHUzMl90KTB4ZmYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzJdIHw9ICh0bXA8PDE2KTsKKyAgICAvL1RocmVzaDYyCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0YyoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHg3ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbN11bMV0gJj0gKH4oKHUzMl90KTB4N2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbN11bMV0gfD0gKHRtcDw8MTIpOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVsyXSAmPSAofigodTMyX3QpMHg3ZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVsyXSB8PSAodG1wPDwxMik7CisgICAgLy9UeFJ4QXR0ZW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzhdWzFdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzhdWzFdIHw9ICh0bXA8PDEyKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bMl0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bMl0gfD0gKHRtcDw8MTIpOworICAgIC8vVHhSeEF0dGVuIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQ4KjIvNF0gJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVs5XVsxXSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs5XVsxXSB8PSAodG1wPDwxMik7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzJdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzJdIHw9ICh0bXA8PDEyKTsKKyAgICAvL1R4UnhNYXJnaW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDgqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMV0gfD0gKHRtcDw8MTgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMl0gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsyXSB8PSAodG1wPDwxOCk7CisgICAgLy9UeFJ4TWFyZ2luIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQ4KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMV0gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsxXSB8PSAodG1wPDwxOCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsyXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzJdIHw9ICh0bXA8PDE4KTsKKyAgICAvL2lxQ2FsbCBjaGFpbl8wLCBpcUNhbGxRIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRlKjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAyNCkgJiAweDNmOworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTUwKjIvNF07CisgICAgdG1wMSA9ICh0bXAxID4+IDgpICYgMHgxZjsKKyAgICB0bXAgID0gKHRtcDw8NSkgKyB0bXAxOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bMV0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVsxXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzJdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bMl0gfD0gKHRtcCk7CisgICAgLy9pcUNhbGwgY2hhaW5fMiwgaXFDYWxsUSBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1MCoyLzRdOworICAgIHRtcCA9IHRtcCAmIDB4M2Y7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTAqMi80XTsKKyAgICB0bXAxID0gKHRtcDEgPj4gMTYpICYgMHgxZjsKKyAgICB0bXAgID0gKHRtcDw8NSkgKyB0bXAxOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bMV0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVsxXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzJdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bMl0gfD0gKHRtcCk7CisgICAgLy9ic3dfTWFyZ2luIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTU2KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweGY7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsxXSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsxXSB8PSAodG1wIDw8IDEwKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzJdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzJdIHw9ICh0bXAgPDwgMTApOworICAgIC8veHBkIGdhaW4gbWFzaworICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNGUqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHhmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bMV0gJj0gKH4oKHUzMl90KTB4ZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzFdIHw9ICh6Y1hwZFRvUGRbdG1wXSA8PCAxNik7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVsyXSAmPSAofigodTMyX3QpMHhmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bMl0gfD0gKHpjWHBkVG9QZFt0bXBdIDw8IDE2KTsKKyNpZiAwCisgICAgLy9ic3dfQXR0ZW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTYqMi80XTsKKyAgICB0bXAgPSAodG1wKSAmIDB4MWY7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsxXSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMV0gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsyXSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMl0gfD0gKHRtcCk7CisgICAgLy9ic3dfTWFyZ2luIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTU2KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAyNCkgJiAweGY7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsxXSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsxXSB8PSAodG1wIDw8IDEwKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzJdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzJdIHw9ICh0bXAgPDwgMTApOworICAgIC8vYnN3X0F0dGVuIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTU2KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiA4KSAmIDB4MWY7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsxXSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMV0gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsyXSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gfD0gKHRtcCk7CisjZW5kaWYKKworICAgIC8qIFVwZGF0ZSAyLjRHIGJvYXJkIGRhdGEgKi8KKyAgICAvL0FudCBjb250cm9sIGNvbW1vbgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzAqMi80XTsKKyAgICB0bXAgPSB0bXAgPj4gMjQ7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzIqMi80XTsKKyAgICB0bXAgPSB0bXAgKyAodG1wMSA8PCA4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMF1bM10gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzBdWzRdID0gdG1wOworICAgIC8vQW50IGNvbnRyb2wgY2hhaW4gMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNmMqMi80XTsKKyAgICB0bXAgPSB0bXAgPj4gMjQ7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNmUqMi80XTsKKyAgICB0bXAgPSB0bXAgKyAodG1wMSA8PCA4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMV1bM10gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzFdWzRdID0gdG1wOworICAgIC8vQW50IGNvbnRyb2wgY2hhaW4gMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNmUqMi80XTsKKyAgICB0bXAgPSB0bXAgPj4gMjQ7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzAqMi80XTsKKyAgICB0bXAgPSB0bXAgKyAodG1wMSA8PCA4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMl1bM10gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzJdWzRdID0gdG1wOworICAgIC8vU3dTZXR0bGUKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc0KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiA4KSAmIDB4N2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzRdICY9ICh+KCh1MzJfdCkweDNmODApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bNF0gfD0gKHRtcCA8PCA3KTsKKyNpZiAwCisgICAgLy9zd1NldHRsZUh0NDAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTg0KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAyNCkgJiAweDdmOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVszXSAmPSAofigodTMyX3QpMHgzZjgwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzNdIHw9ICh0bXAgPDwgNyk7CisjZW5kaWYKKyAgICAvL2FkY0Rlc2lyZWQsIHBkYURlc2lyZWQKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc2KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweGZmOworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc2KjIvNF07CisgICAgdG1wMSA9IHRtcDEgPj4gMjQ7CisgICAgdG1wID0gdG1wICsgKHRtcDE8PDgpOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVszXSAmPSAofigodTMyX3QpMHhmZmZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzNdIHw9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bNF0gJj0gKH4oKHUzMl90KTB4ZmZmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVs0XSB8PSB0bXA7CisgICAgLy9UeEVuZFRvWHBhT2ZmLCBUeEZyYW1lVG9YcGFPbgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzgqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4ZmY7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2EqMi80XTsKKyAgICB0bXAxID0gdG1wMSAmIDB4ZmY7CisgICAgdG1wID0gKHRtcCA8PCAyNCkgKyAodG1wIDw8IDE2KSArICh0bXAxIDw8IDgpICsgdG1wMTsKKyAgICBlZXByb21Cb2FyZERhdGFbNV1bM10gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzVdWzRdID0gdG1wOworICAgIC8vVHhFbmFUb1J4T20KKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc4KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAyNCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzNdICY9ICh+KCh1MzJfdCkweGZmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVszXSB8PSAodG1wPDwxNik7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzRdICY9ICh+KCh1MzJfdCkweGZmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVs0XSB8PSAodG1wPDwxNik7CisgICAgLy9UaHJlc2g2MgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2EqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHg3ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbN11bM10gJj0gKH4oKHUzMl90KTB4N2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbN11bM10gfD0gKHRtcDw8MTIpOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVs0XSAmPSAofigodTMyX3QpMHg3ZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVs0XSB8PSAodG1wPDwxMik7CisgICAgLy9UeFJ4QXR0ZW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzhdWzNdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzhdWzNdIHw9ICh0bXA8PDEyKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bNF0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bNF0gfD0gKHRtcDw8MTIpOworICAgIC8vVHhSeEF0dGVuIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc0KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAyNCkgJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVs5XVszXSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs5XVszXSB8PSAodG1wPDwxMik7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzRdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzRdIHw9ICh0bXA8PDEyKTsKKyAgICAvL1R4UnhNYXJnaW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzYqMi80XTsKKyAgICB0bXAgPSAodG1wKSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVszXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzNdIHw9ICh0bXA8PDE4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzRdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bNF0gfD0gKHRtcDw8MTgpOworICAgIC8vVHhSeE1hcmdpbiBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bM10gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSB8PSAodG1wPDwxOCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVs0XSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdIHw9ICh0bXA8PDE4KTsKKyAgICAvL2lxQ2FsbCBjaGFpbl8wLCBpcUNhbGxRIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTdjKjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweDNmOworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTdlKjIvNF07CisgICAgdG1wMSA9ICh0bXAxKSAmIDB4MWY7CisgICAgdG1wICA9ICh0bXA8PDUpICsgdG1wMTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzNdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bM10gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVs0XSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzRdIHw9ICh0bXApOworICAgIC8vaXFDYWxsIGNoYWluXzIsIGlxQ2FsbFEgY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2MqMi80XTsKKyAgICB0bXAgPSAodG1wPj4yNCkgJiAweDNmOworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTdlKjIvNF07CisgICAgdG1wMSA9ICh0bXAxID4+IDgpICYgMHgxZjsKKyAgICB0bXAgID0gKHRtcDw8NSkgKyB0bXAxOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bM10gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVszXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzRdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bNF0gfD0gKHRtcCk7CisgICAgLy94cGQgZ2FpbiBtYXNrCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3YyoyLzRdOworICAgIHRtcCA9IHRtcCAmIDB4ZjsKKyAgICBEYmdQcmludCgieHBkPTB4JXgsIHBkPTB4JXhcbiIsIHRtcCwgemNYcGRUb1BkW3RtcF0pOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bM10gJj0gKH4oKHUzMl90KTB4ZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzNdIHw9ICh6Y1hwZFRvUGRbdG1wXSA8PCAxNik7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVs0XSAmPSAofigodTMyX3QpMHhmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bNF0gfD0gKHpjWHBkVG9QZFt0bXBdIDw8IDE2KTsKKyNpZiAwCisgICAgLy9ic3dfTWFyZ2luIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTg0KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiA4KSAmIDB4ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzNdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzNdIHw9ICh0bXAgPDwgMTApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bNF0gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bNF0gfD0gKHRtcCA8PCAxMCk7CisgICAgLy9ic3dfQXR0ZW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxODIqMi80XTsKKyAgICB0bXAgPSAodG1wPj4yNCkgJiAweDFmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzNdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bNF0gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzRdIHw9ICh0bXApOworICAgIC8vYnN3X01hcmdpbiBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE4NCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHhmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bM10gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bM10gfD0gKHRtcCA8PCAxMCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVs0XSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVs0XSB8PSAodG1wIDw8IDEwKTsKKyAgICAvL2Jzd19BdHRlbiBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE4NCoyLzRdOworICAgIHRtcCA9ICh0bXApICYgMHgxZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzNdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVs0XSB8PSAodG1wKTsKKyNlbmRpZgorCisjaWYgMAorICAgIGZvciAoaj0wOyBqPDE0OyBqKyspCisgICAgeworICAgICAgICBEYmdQcmludCgiJTA0eCwgJTA4eCwgJTA4eCwgJTA4eCwgJTA4eFxuIiwgZWVwcm9tQm9hcmREYXRhW2pdWzBdLCBlZXByb21Cb2FyZERhdGFbal1bMV0sIGVlcHJvbUJvYXJkRGF0YVtqXVsyXSwgZWVwcm9tQm9hcmREYXRhW2pdWzNdLCBlZXByb21Cb2FyZERhdGFbal1bNF0pOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKChocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTEwKjIvNF0mMHhmZikgPT0gMHg4MCkgLy9GRU0gVFlQRQorICAgIHsKKyAgICAgICAgLyogVXBkYXRlIGJvYXJkIGRhdGEgdG8gcmVnaXN0ZXJzICovCisgICAgICAgIGZvciAoaj0wOyBqPDE1OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ193cml0ZShlZXByb21Cb2FyZERhdGFbal1bMF0sIGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XSk7CisKKyAgICAgICAgICAgIC8qICMxIFNhdmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgUklGUyByZWdpc3RlciBzZXR0aW5ncyAqLworICAgICAgICAgICAgLy9pZiggKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pc0luaXRpYWxQaHkgPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKGVlcHJvbUJvYXJkRGF0YVtqXVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5ODUwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdERlc2lyZWRTaWdTaXplICAgICAgICAgICA9IGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4OTg1YyA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBR0MgICAgICAgICAgICAgICAgICAgICAgPSBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDk4NjAgOgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0QWdjQ29udHJvbCAgICAgICAgICAgICAgID0gZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5OTE4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdFNlYXJjaFN0YXJ0RGVsYXkgICAgICAgICA9IGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4OTllYyA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRSSUZTU2VhcmNoUGFyYW1zICAgICAgICAgPSBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweGEzODggOgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0RmFzdENoYW5uZWxDaGFuZ2VDb250cm9sID0gZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gLyogaWYgKChocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTEwKjIvNF0mMHhmZikgPT0gMHg4MCkgLy9GRU0gVFlQRSAqLworCisKKyAgICAvKiBCcmluZ3VwIGlzc3VlIDogZm9yY2UgdHggZ2FpbiAqLworICAgIC8vcmVnX3dyaXRlKDB4YTI1OCwgMHgwY2M2NTM4MSk7CisgICAgLy9yZWdfd3JpdGUoMHhhMjc0LCAweDBhMWE3YzE1KTsKKyAgICB6ZkluaXRQb3dlckNhbChkZXYpOworCisgICAgaWYoZnJlcXVlbmN5ID4gWk1fQ0hfR18xNCkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZDQwMTQsIDB4NTE0Myk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZDQwMTQsIDB4NTE2Myk7CisgICAgfQorCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworCit2b2lkIHpmSW5pdFJmKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpCit7CisgICAgdTMyX3QgY21kWzhdOworICAgIHUxNl90IHJldDsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfZXhwOworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9tYW47CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpOworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzEoIiBpbml0UmYgZnJlcXVlbmN5ID0gIiwgZnJlcXVlbmN5KTsKKworICAgIGlmIChmcmVxdWVuY3kgPT0gMCkKKyAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IDI0MTI7CisgICAgfQorCisgICAgLyogQmFuayAwIDEgMiAzIDUgNiA3ICovCisgICAgemZTZXRSZlJlZ3MoZGV2LCBmcmVxdWVuY3kpOworICAgIC8qIEJhbmsgNCAqLworICAgIHpmU2V0QmFuazRBbmRQb3dlclRhYmxlKGRldiwgZnJlcXVlbmN5LCAwLCAwKTsKKworICAgIC8qIHN0cm9lIGZyZXF1ZW5jeSAqLworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPSAodTE2X3QpZnJlcXVlbmN5OworCisgICAgemZHZXRId1R1cm5PZmZkeW5QYXJhbShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3ksIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSk7CisKKyAgICAvKiByZWxhdGVkIGZ1bmN0aW9ucyAqLworICAgIGZyZXF1ZW5jeSA9IGZyZXF1ZW5jeSoxMDAwOworICAgIGNtZFswXSA9IDI4IHwgKFpNX0NNRF9SRl9JTklUIDw8IDgpOworICAgIGNtZFsxXSA9IGZyZXF1ZW5jeTsKKyAgICBjbWRbMl0gPSAwOy8vKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od19EWU5BTUlDX0hUMjA0MF9FTjsKKyAgICBjbWRbM10gPSAxOy8vKCh3ZC0+RXh0T2Zmc2V0IDw8IDIpIHwgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od19IVF9FTkFCTEUpOworICAgIGNtZFs0XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX2V4cDsKKyAgICBjbWRbNV0gPSBkZWx0YV9zbG9wZV9jb2VmZl9tYW47CisgICAgY21kWzZdID0gZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2k7CisgICAgY21kWzddID0gZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2k7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAzMiwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCAwKTsKKworICAgIC8vIGRlbGF5IHRlbXBvcmFyaWx5LCB3YWl0IGZvciBuZXcgUEhZIGFuZCBSRgorICAgIHpmd1NsZWVwKGRldiwgMTAwMCk7Cit9CisKK2ludCB0bihpbnQgZXhwKQoreworICAgIGludCBpOworCWludCB0bXAgPSAxOworICAgIGZvcihpPTA7IGk8ZXhwOyBpKyspCisgICAgICAgIHRtcCA9IHRtcCoyOworCisgICAgcmV0dXJuIHRtcDsKK30KKworLyppbnQgemZGbG9vcihkb3VibGUgaW5kYXRhKQoreworICAgaWYoaW5kYXRhPDApCisJICAgcmV0dXJuIChpbnQpaW5kYXRhLTE7CisgICBlbHNlCisJICAgcmV0dXJuIChpbnQpaW5kYXRhOworfQorKi8KK3UzMl90IHJldmVyc2VfYml0cyh1MzJfdCBjaGFuX3NlbCkKK3sKKwkvKiByZXZlcnNlX2JpdHMgKi8KKyAgICB1MzJfdCBjaGFuc2VsID0gMDsKKwl1OF90IGk7CisKKwlmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIGNoYW5zZWwgfD0gKChjaGFuX3NlbD4+KDctaSkgJiAweDEpIDw8IGkpOworCXJldHVybiBjaGFuc2VsOworfQorCisvKiBCYW5rIDAgMSAyIDMgNSA2IDcgKi8KK3ZvaWQgemZTZXRSZlJlZ3MoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSkKK3sKKyAgICB1MTZfdCBlbnRyaWVzOworICAgIHUxNl90IGZyZXFJbmRleCA9IDA7CisgICAgdTE2X3QgaTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBmcmVxdWVuY3kgPiBaTV9DSF9HXzE0ICkKKyAgICB7CisgICAgICAgIC8qIDVHICovCisgICAgICAgIGZyZXFJbmRleCA9IDE7CisgICAgICAgIHptX21zZzBfc2NhbihaTV9MVl8yLCAiU2V0IHRvIDVHSHoiKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiAyLjRHICovCisgICAgICAgIGZyZXFJbmRleCA9IDI7CisgICAgICAgIHptX21zZzBfc2NhbihaTV9MVl8yLCAiU2V0IHRvIDIuNEdIeiIpOworICAgIH0KKworI2lmIDEKKyAgICBlbnRyaWVzID0gc2l6ZW9mKG90dXNCYW5rKSAvIHNpemVvZigqb3R1c0JhbmspOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShvdHVzQmFua1tpXVswXSwgb3R1c0JhbmtbaV1bZnJlcUluZGV4XSk7CisgICAgfQorI2Vsc2UKKyAgICAvKiBCYW5rMCAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazApIC8gc2l6ZW9mKCphcjU0MTZCYW5rMCk7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbmswW2ldWzBdLCBhcjU0MTZCYW5rMFtpXVsxXSk7CisgICAgfQorICAgIC8qIEJhbmsxICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rMSkgLyBzaXplb2YoKmFyNTQxNkJhbmsxKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazFbaV1bMF0sIGFyNTQxNkJhbmsxW2ldWzFdKTsKKyAgICB9CisgICAgLyogQmFuazIgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbmsyKSAvIHNpemVvZigqYXI1NDE2QmFuazIpOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rMltpXVswXSwgYXI1NDE2QmFuazJbaV1bMV0pOworICAgIH0KKyAgICAvKiBCYW5rMyAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazMpIC8gc2l6ZW9mKCphcjU0MTZCYW5rMyk7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbmszW2ldWzBdLCBhcjU0MTZCYW5rM1tpXVtmcmVxSW5kZXhdKTsKKyAgICB9CisgICAgLyogQmFuazUgKi8KKyAgICByZWdfd3JpdGUgKDB4OThiMCwgIDB4MDAwMDAwMTMpOworICAgIHJlZ193cml0ZSAoMHg5OGU0LCAgMHgwMDAwMDAwMik7CisgICAgLyogQmFuazYgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbms2KSAvIHNpemVvZigqYXI1NDE2QmFuazYpOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rNltpXVswXSwgYXI1NDE2QmFuazZbaV1bZnJlcUluZGV4XSk7CisgICAgfQorICAgIC8qIEJhbms3ICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rNykgLyBzaXplb2YoKmFyNTQxNkJhbms3KTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazdbaV1bMF0sIGFyNTQxNkJhbms3W2ldWzFdKTsKKyAgICB9CisjZW5kaWYKKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKy8qIEJhbmsgNCAqLwordm9pZCB6ZlNldEJhbms0QW5kUG93ZXJUYWJsZSh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0KQoreworICAgIHUzMl90IGNodXAgPSAxOworCXUzMl90IGJtb2RlX0xGX3N5bnRoX2ZyZXEgPSAwOworCXUzMl90IGFtb2RlX3JlZnNlbF8xID0gMDsKKwl1MzJfdCBhbW9kZV9yZWZzZWxfMCA9IDE7CisJdTMyX3QgYWRkcjIgPSAxOworCXUzMl90IGFkZHIxID0gMDsKKwl1MzJfdCBhZGRyMCA9IDA7CisKKwl1MzJfdCBkMTsKKwl1MzJfdCBkMDsKKwl1MzJfdCB0bXBfMDsKKwl1MzJfdCB0bXBfMTsKKwl1MzJfdCBkYXRhMDsKKwl1MzJfdCBkYXRhMTsKKworCXU4X3QgY2hhbnNlbDsKKwl1OF90IGNoYW5fc2VsOworCXUzMl90IHRlbXBfY2hhbl9zZWw7CisKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisKKyAgICAvKiBpZiBlbmFibGUgODAyLjExaCwgbmVlZCB0byByZWNvcmQgY3VyZW50IGNoYW5uZWwgaW5kZXggaW4gY2hhbm5lbCBhcnJheSAqLworICAgIGlmICh3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4ID0gaTsKKyAgICB9CisKKwlpZiAoYnc0MCA9PSAxKQorCXsKKyAgICAgICAgaWYgKGV4dE9mZnNldCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgKz0gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgLT0gMTA7CisgICAgICAgIH0KKworCX0KKworCisJaWYgKCBmcmVxdWVuY3kgPiAzMDAwICkKKwl7CisJICAgIGlmICggZnJlcXVlbmN5ICUgMTAgKQorCSAgICB7CisJICAgICAgICAvKiA1TSAqLworICAgICAgICAgICAgY2hhbl9zZWwgPSAodThfdCkoKGZyZXF1ZW5jeSAtIDQ4MDApLzUpOworICAgICAgICAgICAgY2hhbl9zZWwgPSAodThfdCkoY2hhbl9zZWwgJiAweGZmKTsKKyAgICAgICAgICAgIGNoYW5zZWwgID0gKHU4X3QpcmV2ZXJzZV9iaXRzKGNoYW5fc2VsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEwTSA6IGltcHJvdmUgVHggRVZNICovCisgICAgICAgICAgICBjaGFuX3NlbCA9ICh1OF90KSgoZnJlcXVlbmN5IC0gNDgwMCkvMTApOworICAgICAgICAgICAgY2hhbl9zZWwgPSAodThfdCkoY2hhbl9zZWwgJiAweGZmKTw8MTsKKyAgICAgICAgICAgIGNoYW5zZWwgID0gKHU4X3QpcmV2ZXJzZV9iaXRzKGNoYW5fc2VsKTsKKworCSAgICAgICAgYW1vZGVfcmVmc2VsXzEgPSAxOworCSAgICAgICAgYW1vZGVfcmVmc2VsXzAgPSAwOworICAgICAgICB9CisJfQorCWVsc2UKKwl7CisgICAgICAgIC8vdGVtcF9jaGFuX3NlbCA9ICgoKGZyZXF1ZW5jeSAtIDY3MikqMikgLSAzMDQwKS8xMDsKKyAgICAgICAgaWYgKGZyZXF1ZW5jeSA9PSAyNDg0KQorICAgICAgICB7CisgICAJICAgICAgICB0ZW1wX2NoYW5fc2VsID0gMTAgKyAoZnJlcXVlbmN5IC0gMjI3NCkvNSA7CisgICAJICAgICAgICBibW9kZV9MRl9zeW50aF9mcmVxID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBfY2hhbl9zZWwgPSAxNiArIChmcmVxdWVuY3kgLSAyMjcyKS81IDsKKyAgICAgICAgICAgIGJtb2RlX0xGX3N5bnRoX2ZyZXEgPSAwOworICAgICAgICB9CisgICAgICAgIGNoYW5fc2VsID0gKHU4X3QpKHRlbXBfY2hhbl9zZWwgPDwgMikgJiAweGZmOworICAgICAgICBjaGFuc2VsICA9ICh1OF90KXJldmVyc2VfYml0cyhjaGFuX3NlbCk7CisJfQorCisJZDEgICA9IGNoYW5zZWw7ICAgLy8jIDggYml0cyBvZiBjaGFuCisJZDAgICA9IGFkZHIwPDw3IHwgYWRkcjE8PDYgfCBhZGRyMjw8NQorCQkJfCBhbW9kZV9yZWZzZWxfMDw8MyB8IGFtb2RlX3JlZnNlbF8xPDwyCisJCQl8IGJtb2RlX0xGX3N5bnRoX2ZyZXE8PDEgfCBjaHVwOworCisgICAgdG1wXzAgPSBkMCAmIDB4MWY7ICAvLyMgNS0xCisgICAgdG1wXzEgPSBkMSAmIDB4MWY7ICAvLyMgNS0xCisgICAgZGF0YTAgPSB0bXBfMTw8NSB8IHRtcF8wOworCisgICAgdG1wXzAgPSBkMD4+NSAmIDB4NzsgIC8vIyA4LTYKKyAgICB0bXBfMSA9IGQxPj41ICYgMHg3OyAgLy8jIDgtNgorICAgIGRhdGExID0gdG1wXzE8PDUgfCB0bXBfMDsKKworICAgIC8qIEJhbms0ICovCisJcmVnX3dyaXRlICgweDk4MDArKDB4MmM8PDIpLCBkYXRhMCk7CisJcmVnX3dyaXRlICgweDk4MDArKDB4M2E8PDIpLCBkYXRhMSk7CisJLy96bV9kZWJ1Z19tc2cxKCIweDk4MDArKDB4MmM8PDIgPSAgIiwgZGF0YTApOworCS8vem1fZGVidWdfbXNnMSgiMHg5ODAwKygweDNhPDwyID0gICIsIGRhdGExKTsKKworCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHpmd1NsZWVwKGRldiwgMTApOworCisgICAgcmV0dXJuOworfQorCisKK3N0cnVjdCB6c1BoeUZyZXFQYXJhCit7CisgICAgdTMyX3QgY29lZmZfZXhwOworICAgIHUzMl90IGNvZWZmX21hbjsKKyAgICB1MzJfdCBjb2VmZl9leHBfc2hnaTsKKyAgICB1MzJfdCBjb2VmZl9tYW5fc2hnaTsKK307CisKK3N0cnVjdCB6c1BoeUZyZXFUYWJsZQoreworICAgIHUzMl90IGZyZXF1ZW5jeTsKKyAgICBzdHJ1Y3QgenNQaHlGcmVxUGFyYSBGcGdhRHluYW1pY0hUOworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIEZwZ2FTdGF0aWNIVDsKKyAgICBzdHJ1Y3QgenNQaHlGcmVxUGFyYSBDaGlwU1QyME1oejsKKyAgICBzdHJ1Y3QgenNQaHlGcmVxUGFyYSBDaGlwMjA0ME1oejsKKyAgICBzdHJ1Y3QgenNQaHlGcmVxUGFyYSBDaGlwMjA0MEV4dEFib3ZlOworfTsKKworY29uc3Qgc3RydWN0IHpzUGh5RnJlcVRhYmxlIHpnUGh5RnJlcUNvZWZmW10gPQoreworLypJbmRleCAgIGZyZXEgIEZQR0EgRFlOQU1JQ19IVDIwNDBfRU4gIEZQR0EgU1RBVElDX0hUMjAgICAgUmVhbCBDaGlwIHN0YXRpYzIwTUh6ICAgICBSZWFsIENoaXAgMjA0ME1IeiAgIFJlYWwgQ2hpcCAyMDQwTWh6ICAqLworICAgICAgIC8qIGZjbGsgPSAgICAgICAgIDEwLjggICAgICAgICAgICAgICAgMjEuNiAgICAgICAgICAgICAgICAgIDQwICAgICAgICAgICAgICAgICAgZXh0IGJlbG93IDQwICAgICAgIGV4dCBhYm92ZSA0MCAgICAgICAqLworLyogIDAgKi8gezI0MTIsIHs1LCAyMzQ3NiwgNSwgMjExMjh9LCB7NCwgMjM0NzYsIDQsIDIxMTI4fSwgezMsIDIxNzM3LCAzLCAxOTU2M30sIHszLCAyMTgyNywgMywgMTk2NDR9LCB7MywgMjE2NDcsIDMsIDE5NDgyfX0sCisvKiAgMSAqLyB7MjQxNywgezUsIDIzNDI3LCA1LCAyMTA4NH0sIHs0LCAyMzQyNywgNCwgMjEwODR9LCB7MywgMjE2OTIsIDMsIDE5NTIzfSwgezMsIDIxNzgyLCAzLCAxOTYwNH0sIHszLCAyMTYwMiwgMywgMTk0NDJ9fSwKKy8qICAyICovIHsyNDIyLCB7NSwgMjMzNzksIDUsIDIxMDQxfSwgezQsIDIzMzc5LCA0LCAyMTA0MX0sIHszLCAyMTY0NywgMywgMTk0ODJ9LCB7MywgMjE3MzcsIDMsIDE5NTYzfSwgezMsIDIxNTU4LCAzLCAxOTQwMn19LAorLyogIDMgKi8gezI0MjcsIHs1LCAyMzMzMCwgNSwgMjA5OTd9LCB7NCwgMjMzMzAsIDQsIDIwOTk3fSwgezMsIDIxNjAyLCAzLCAxOTQ0Mn0sIHszLCAyMTY5MiwgMywgMTk1MjN9LCB7MywgMjE1MTQsIDMsIDE5MzYyfX0sCisvKiAgNCAqLyB7MjQzMiwgezUsIDIzMjgzLCA1LCAyMDk1NH0sIHs0LCAyMzI4MywgNCwgMjA5NTR9LCB7MywgMjE1NTgsIDMsIDE5NDAyfSwgezMsIDIxNjQ3LCAzLCAxOTQ4Mn0sIHszLCAyMTQ3MCwgMywgMTkzMjN9fSwKKy8qICA1ICovIHsyNDM3LCB7NSwgMjMyMzUsIDUsIDIwOTExfSwgezQsIDIzMjM1LCA0LCAyMDkxMX0sIHszLCAyMTUxNCwgMywgMTkzNjJ9LCB7MywgMjE2MDIsIDMsIDE5NDQyfSwgezMsIDIxNDI2LCAzLCAxOTI4M319LAorLyogIDYgKi8gezI0NDIsIHs1LCAyMzE4NywgNSwgMjA4Njh9LCB7NCwgMjMxODcsIDQsIDIwODY4fSwgezMsIDIxNDcwLCAzLCAxOTMyM30sIHszLCAyMTU1OCwgMywgMTk0MDJ9LCB7MywgMjEzODIsIDMsIDE5MjQ0fX0sCisvKiAgNyAqLyB7MjQ0NywgezUsIDIzMTQwLCA1LCAyMDgyNn0sIHs0LCAyMzE0MCwgNCwgMjA4MjZ9LCB7MywgMjE0MjYsIDMsIDE5MjgzfSwgezMsIDIxNTE0LCAzLCAxOTM2Mn0sIHszLCAyMTMzOSwgMywgMTkyMDV9fSwKKy8qICA4ICovIHsyNDUyLCB7NSwgMjMwOTMsIDUsIDIwNzgzfSwgezQsIDIzMDkzLCA0LCAyMDc4M30sIHszLCAyMTM4MiwgMywgMTkyNDR9LCB7MywgMjE0NzAsIDMsIDE5MzIzfSwgezMsIDIxMjk1LCAzLCAxOTE2Nn19LAorLyogIDkgKi8gezI0NTcsIHs1LCAyMzA0NiwgNSwgMjA3NDF9LCB7NCwgMjMwNDYsIDQsIDIwNzQxfSwgezMsIDIxMzM5LCAzLCAxOTIwNX0sIHszLCAyMTQyNiwgMywgMTkyODN9LCB7MywgMjEyNTIsIDMsIDE5MTI3fX0sCisvKiAxMCAqLyB7MjQ2MiwgezUsIDIyOTk5LCA1LCAyMDY5OX0sIHs0LCAyMjk5OSwgNCwgMjA2OTl9LCB7MywgMjEyOTUsIDMsIDE5MTY2fSwgezMsIDIxMzgyLCAzLCAxOTI0NH0sIHszLCAyMTIwOSwgMywgMTkwODh9fSwKKy8qIDExICovIHsyNDY3LCB7NSwgMjI5NTIsIDUsIDIwNjU3fSwgezQsIDIyOTUyLCA0LCAyMDY1N30sIHszLCAyMTI1MiwgMywgMTkxMjd9LCB7MywgMjEzMzksIDMsIDE5MjA1fSwgezMsIDIxMTY2LCAzLCAxOTA1MH19LAorLyogMTIgKi8gezI0NzIsIHs1LCAyMjkwNiwgNSwgMjA2MTV9LCB7NCwgMjI5MDYsIDQsIDIwNjE1fSwgezMsIDIxMjA5LCAzLCAxOTA4OH0sIHszLCAyMTI5NSwgMywgMTkxNjZ9LCB7MywgMjExMjQsIDMsIDE5MDExfX0sCisvKiAxMyAqLyB7MjQ4NCwgezUsIDIyNzk1LCA1LCAyMDUxNn0sIHs0LCAyMjc5NSwgNCwgMjA1MTZ9LCB7MywgMjExMDcsIDMsIDE4OTk2fSwgezMsIDIxMTkyLCAzLCAxOTA3M30sIHszLCAyMTAyMiwgMywgMTg5MjB9fSwKKy8qIDE0ICovIHs0OTIwLCB7NiwgMjMwMTgsIDYsIDIwNzE2fSwgezUsIDIzMDE4LCA1LCAyMDcxNn0sIHs0LCAyMTMxMywgNCwgMTkxODF9LCB7NCwgMjEzNTYsIDQsIDE5MjIwfSwgezQsIDIxMjY5LCA0LCAxOTE0Mn19LAorLyogMTUgKi8gezQ5NDAsIHs2LCAyMjkyNCwgNiwgMjA2MzJ9LCB7NSwgMjI5MjQsIDUsIDIwNjMyfSwgezQsIDIxMjI2LCA0LCAxOTEwNH0sIHs0LCAyMTI2OSwgNCwgMTkxNDJ9LCB7NCwgMjExODMsIDQsIDE5MDY1fX0sCisvKiAxNiAqLyB7NDk2MCwgezYsIDIyODMyLCA2LCAyMDU0OX0sIHs1LCAyMjgzMiwgNSwgMjA1NDl9LCB7NCwgMjExNDEsIDQsIDE5MDI3fSwgezQsIDIxMTgzLCA0LCAxOTA2NX0sIHs0LCAyMTA5OCwgNCwgMTg5ODh9fSwKKy8qIDE3ICovIHs0OTgwLCB7NiwgMjI3NDAsIDYsIDIwNDY2fSwgezUsIDIyNzQwLCA1LCAyMDQ2Nn0sIHs0LCAyMTA1NiwgNCwgMTg5NTB9LCB7NCwgMjEwOTgsIDQsIDE4OTg4fSwgezQsIDIxMDE0LCA0LCAxODkxMn19LAorLyogMTggKi8gezUwNDAsIHs2LCAyMjQ2OSwgNiwgMjAyMjN9LCB7NSwgMjI0NjksIDUsIDIwMjIzfSwgezQsIDIwODA1LCA0LCAxODcyNX0sIHs0LCAyMDg0NiwgNCwgMTg3NjJ9LCB7NCwgMjA3NjQsIDQsIDE4Njg3fX0sCisvKiAxOSAqLyB7NTA2MCwgezYsIDIyMzgxLCA2LCAyMDE0M30sIHs1LCAyMjM4MSwgNSwgMjAxNDN9LCB7NCwgMjA3MjMsIDQsIDE4NjUxfSwgezQsIDIwNzY0LCA0LCAxODY4N30sIHs0LCAyMDY4MiwgNCwgMTg2MTR9fSwKKy8qIDIwICovIHs1MDgwLCB7NiwgMjIyOTMsIDYsIDIwMDYzfSwgezUsIDIyMjkzLCA1LCAyMDA2M30sIHs0LCAyMDY0MSwgNCwgMTg1Nzd9LCB7NCwgMjA2ODIsIDQsIDE4NjE0fSwgezQsIDIwNjAxLCA0LCAxODU0MX19LAorLyogMjEgKi8gezUxODAsIHs2LCAyMTg2MiwgNiwgMTk2NzZ9LCB7NSwgMjE4NjIsIDUsIDE5Njc2fSwgezQsIDIwMjQzLCA0LCAxODIxOX0sIHs0LCAyMDI4MiwgNCwgMTgyNTR9LCB7NCwgMjAyMDQsIDQsIDE4MTgzfX0sCisvKiAyMiAqLyB7NTIwMCwgezYsIDIxNzc4LCA2LCAxOTYwMH0sIHs1LCAyMTc3OCwgNSwgMTk2MDB9LCB7NCwgMjAxNjUsIDQsIDE4MTQ4fSwgezQsIDIwMjA0LCA0LCAxODE4M30sIHs0LCAyMDEyNiwgNCwgMTgxMTR9fSwKKy8qIDIzICovIHs1MjIwLCB7NiwgMjE2OTUsIDYsIDE5NTI1fSwgezUsIDIxNjk1LCA1LCAxOTUyNX0sIHs0LCAyMDA4OCwgNCwgMTgwNzl9LCB7NCwgMjAxMjYsIDQsIDE4MTE0fSwgezQsIDIwMDQ5LCA0LCAxODA0NH19LAorLyogMjQgKi8gezUyNDAsIHs2LCAyMTYxMiwgNiwgMTk0NTF9LCB7NSwgMjE2MTIsIDUsIDE5NDUxfSwgezQsIDIwMDExLCA0LCAxODAxMH0sIHs0LCAyMDA0OSwgNCwgMTgwNDR9LCB7NCwgMTk5NzMsIDQsIDE3OTc2fX0sCisvKiAyNSAqLyB7NTI2MCwgezYsIDIxNTMwLCA2LCAxOTM3N30sIHs1LCAyMTUzMCwgNSwgMTkzNzd9LCB7NCwgMTk5MzUsIDQsIDE3OTQxfSwgezQsIDE5OTczLCA0LCAxNzk3Nn0sIHs0LCAxOTg5NywgNCwgMTc5MDd9fSwKKy8qIDI2ICovIHs1MjgwLCB7NiwgMjE0NDgsIDYsIDE5MzAzfSwgezUsIDIxNDQ4LCA1LCAxOTMwM30sIHs0LCAxOTg1OSwgNCwgMTc4NzN9LCB7NCwgMTk4OTcsIDQsIDE3OTA3fSwgezQsIDE5ODIyLCA0LCAxNzg0MH19LAorLyogMjcgKi8gezUzMDAsIHs2LCAyMTM2NywgNiwgMTkyMzB9LCB7NSwgMjEzNjcsIDUsIDE5MjMwfSwgezQsIDE5Nzg0LCA0LCAxNzgwNn0sIHs0LCAxOTgyMiwgNCwgMTc4NDB9LCB7NCwgMTk3NDcsIDQsIDE3NzcyfX0sCisvKiAyOCAqLyB7NTMyMCwgezYsIDIxMjg3LCA2LCAxOTE1OH0sIHs1LCAyMTI4NywgNSwgMTkxNTh9LCB7NCwgMTk3MTAsIDQsIDE3NzM5fSwgezQsIDE5NzQ3LCA0LCAxNzc3Mn0sIHs0LCAxOTY3MywgNCwgMTc3MDZ9fSwKKy8qIDI5ICovIHs1NTAwLCB7NiwgMjA1OTAsIDYsIDE4NTMxfSwgezUsIDIwNTkwLCA1LCAxODUzMX0sIHs0LCAxOTA2NSwgNCwgMTcxNTl9LCB7NCwgMTkxMDAsIDQsIDE3MTkwfSwgezQsIDE5MDMwLCA0LCAxNzEyN319LAorLyogMzAgKi8gezU1MjAsIHs2LCAyMDUxNiwgNiwgMTg0NjR9LCB7NSwgMjA1MTYsIDUsIDE4NDY0fSwgezQsIDE4OTk2LCA0LCAxNzA5Nn0sIHs0LCAxOTAzMCwgNCwgMTcxMjd9LCB7NCwgMTg5NjIsIDQsIDE3MDY1fX0sCisvKiAzMSAqLyB7NTU0MCwgezYsIDIwNDQyLCA2LCAxODM5N30sIHs1LCAyMDQ0MiwgNSwgMTgzOTd9LCB7NCwgMTg5MjcsIDQsIDE3MDM1fSwgezQsIDE4OTYyLCA0LCAxNzA2NX0sIHs0LCAxODg5MywgNCwgMTcwMDR9fSwKKy8qIDMyICovIHs1NTYwLCB7NiwgMjAzNjgsIDYsIDE4MzMxfSwgezUsIDIwMzY4LCA1LCAxODMzMX0sIHs0LCAxODg1OSwgNCwgMTY5NzN9LCB7NCwgMTg4OTMsIDQsIDE3MDA0fSwgezQsIDE4ODI1LCA0LCAxNjk0M319LAorLyogMzMgKi8gezU1ODAsIHs2LCAyMDI5NSwgNiwgMTgyNjZ9LCB7NSwgMjAyOTUsIDUsIDE4MjY2fSwgezQsIDE4NzkyLCA0LCAxNjkxM30sIHs0LCAxODgyNSwgNCwgMTY5NDN9LCB7NCwgMTg3NTgsIDQsIDE2ODgyfX0sCisvKiAzNCAqLyB7NTYwMCwgezYsIDIwMjIzLCA2LCAxODIwMH0sIHs1LCAyMDIyMywgNSwgMTgyMDB9LCB7NCwgMTg3MjUsIDQsIDE2ODUyfSwgezQsIDE4NzU4LCA0LCAxNjg4Mn0sIHs0LCAxODY5MSwgNCwgMTY4MjJ9fSwKKy8qIDM1ICovIHs1NjIwLCB7NiwgMjAxNTEsIDYsIDE4MTM2fSwgezUsIDIwMTUxLCA1LCAxODEzNn0sIHs0LCAxODY1OCwgNCwgMTY3OTJ9LCB7NCwgMTg2OTEsIDQsIDE2ODIyfSwgezQsIDE4NjI1LCA0LCAxNjc2Mn19LAorLyogMzYgKi8gezU2NDAsIHs2LCAyMDA3OSwgNiwgMTgwNzF9LCB7NSwgMjAwNzksIDUsIDE4MDcxfSwgezQsIDE4NTkyLCA0LCAxNjczM30sIHs0LCAxODYyNSwgNCwgMTY3NjJ9LCB7NCwgMTg1NTksIDQsIDE2NzAzfX0sCisvKiAzNyAqLyB7NTY2MCwgezYsIDIwMDA4LCA2LCAxODAwN30sIHs1LCAyMDAwOCwgNSwgMTgwMDd9LCB7NCwgMTg1MjYsIDQsIDE2NjczfSwgezQsIDE4NTU5LCA0LCAxNjcwM30sIHs0LCAxODQ5MywgNCwgMTY2NDR9fSwKKy8qIDM4ICovIHs1NjgwLCB7NiwgMTk5MzgsIDYsIDE3OTQ0fSwgezUsIDE5OTM4LCA1LCAxNzk0NH0sIHs0LCAxODQ2MSwgNCwgMTY2MTV9LCB7NCwgMTg0OTMsIDQsIDE2NjQ0fSwgezQsIDE4NDI4LCA0LCAxNjU4Nn19LAorLyogMzkgKi8gezU3MDAsIHs2LCAxOTg2OCwgNiwgMTc4ODF9LCB7NSwgMTk4NjgsIDUsIDE3ODgxfSwgezQsIDE4Mzk2LCA0LCAxNjU1Nn0sIHs0LCAxODQyOCwgNCwgMTY1ODZ9LCB7NCwgMTgzNjQsIDQsIDE2NTI3fX0sCisvKiA0MCAqLyB7NTc0NSwgezYsIDE5NzEyLCA2LCAxNzc0MX0sIHs1LCAxOTcxMiwgNSwgMTc3NDF9LCB7NCwgMTgyNTIsIDQsIDE2NDI3fSwgezQsIDE4Mjg0LCA0LCAxNjQ1NX0sIHs0LCAxODIyMCwgNCwgMTYzOTh9fSwKKy8qIDQxICovIHs1NzY1LCB7NiwgMTk2NDQsIDYsIDE3Njc5fSwgezUsIDE5NjQ0LCA1LCAxNzY3OX0sIHs0LCAxODE4OSwgNSwgMzI3NDB9LCB7NCwgMTgyMjAsIDQsIDE2Mzk4fSwgezQsIDE4MTU3LCA1LCAzMjY4M319LAorLyogNDIgKi8gezU3ODUsIHs2LCAxOTU3NiwgNiwgMTc2MTh9LCB7NSwgMTk1NzYsIDUsIDE3NjE4fSwgezQsIDE4MTI2LCA1LCAzMjYyNn0sIHs0LCAxODE1NywgNSwgMzI2ODN9LCB7NCwgMTgwOTQsIDUsIDMyNTcwfX0sCisvKiA0MyAqLyB7NTgwNSwgezYsIDE5NTA4LCA2LCAxNzU1OH0sIHs1LCAxOTUwOCwgNSwgMTc1NTh9LCB7NCwgMTgwNjMsIDUsIDMyNTE0fSwgezQsIDE4MDk0LCA1LCAzMjU3MH0sIHs0LCAxODAzMiwgNSwgMzI0NTh9fSwKKy8qIDQ0ICovIHs1ODI1LCB7NiwgMTk0NDEsIDYsIDE3NDk3fSwgezUsIDE5NDQxLCA1LCAxNzQ5N30sIHs0LCAxODAwMSwgNSwgMzI0MDJ9LCB7NCwgMTgwMzIsIDUsIDMyNDU4fSwgezQsIDE3OTcwLCA1LCAzMjM0N319LAorLyogNDUgKi8gezUxNzAsIHs2LCAyMTkwNCwgNiwgMTk3MTR9LCB7NSwgMjE5MDQsIDUsIDE5NzE0fSwgezQsIDIwMjgyLCA0LCAxODI1NH0sIHs0LCAyMDMyMSwgNCwgMTgyODl9LCB7NCwgMjAyNDMsIDQsIDE4MjE5fX0sCisvKiA0NiAqLyB7NTE5MCwgezYsIDIxODIwLCA2LCAxOTYzOH0sIHs1LCAyMTgyMCwgNSwgMTk2Mzh9LCB7NCwgMjAyMDQsIDQsIDE4MTgzfSwgezQsIDIwMjQzLCA0LCAxODIxOX0sIHs0LCAyMDE2NSwgNCwgMTgxNDh9fSwKKy8qIDQ3ICovIHs1MjEwLCB7NiwgMjE3MzYsIDYsIDE5NTYzfSwgezUsIDIxNzM2LCA1LCAxOTU2M30sIHs0LCAyMDEyNiwgNCwgMTgxMTR9LCB7NCwgMjAxNjUsIDQsIDE4MTQ4fSwgezQsIDIwMDg4LCA0LCAxODA3OX19LAorLyogNDggKi8gezUyMzAsIHs2LCAyMTY1MywgNiwgMTk0ODh9LCB7NSwgMjE2NTMsIDUsIDE5NDg4fSwgezQsIDIwMDQ5LCA0LCAxODA0NH0sIHs0LCAyMDA4OCwgNCwgMTgwNzl9LCB7NCwgMjAwMTEsIDQsIDE4MDEwfX0KK307CisvKiB0byByZWR1Y2Ugc2VhcmNoIHRpbWUsIHBsZWFzZSBtb2RpZnkgdGhpcyBkZWZpbmUgaWYgeW91IGFkZCBvciBkZWxldGUgY2hhbm5lbCBpbiB0YWJsZSAqLworI2RlZmluZSBGaXJzdDVHQ2hhbm5lbEluZGV4IDE0CisKK3ZvaWQgemZHZXRId1R1cm5PZmZkeW5QYXJhbSh6ZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwgdThfdCBleHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpKQoreworICAgIC8qIEdldCBwYXJhbSBmb3IgdHVybm9mZmR5biAqLworICAgIHUxNl90IGksIGFycmF5U2l6ZTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgYXJyYXlTaXplID0gc2l6ZW9mKHpnUGh5RnJlcUNvZWZmKS9zaXplb2Yoc3RydWN0IHpzUGh5RnJlcVRhYmxlKTsKKyAgICBpZiAoZnJlcXVlbmN5IDwgMzAwMCkKKyAgICB7CisgICAgICAgIC8qIDIuNEdIeiBDaGFubmVsICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGaXJzdDVHQ2hhbm5lbEluZGV4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgPT0gemdQaHlGcmVxQ29lZmZbaV0uZnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBGaXJzdDVHQ2hhbm5lbEluZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMCwgIlVuc3VwcG9ydGVkIDIuNEcgZnJlcXVlbmN5ID0gIiwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiA1R0h6IENoYW5uZWwgKi8KKyAgICAgICAgZm9yIChpID0gRmlyc3Q1R0NoYW5uZWxJbmRleDsgaSA8IGFycmF5U2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZnJlcXVlbmN5ID09IHpnUGh5RnJlcUNvZWZmW2ldLmZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgYXJyYXlTaXplKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMCwgIlVuc3VwcG9ydGVkIDVHIGZyZXF1ZW5jeSA9ICIsIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGUEdBIERZTkFNSUNfSFQyMDQwX0VOICAgICAgICBmY2xrID0gMTAuOCAgKi8KKyAgICAvKiBGUEdBIFNUQVRJQ19IVDIwXyAgICAgICAgICAgICBmY2xrID0gMjEuNiAgKi8KKyAgICAvKiBSZWFsIENoaXAgICAgICAgICAgICAgICAgICAgICBmY2xrID0gNDAgICAgKi8KKyAgICAjaWYgWk1fRlBHQV9QSFkgPT0gMQorICAgIC8vZmNsayA9IDEwLjg7CisgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cCA9IHpnUGh5RnJlcUNvZWZmW2ldLkZwZ2FEeW5hbWljSFQuY29lZmZfZXhwOworICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW4gPSB6Z1BoeUZyZXFDb2VmZltpXS5GcGdhRHluYW1pY0hULmNvZWZmX21hbjsKKyAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5GcGdhRHluYW1pY0hULmNvZWZmX2V4cF9zaGdpOworICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkZwZ2FEeW5hbWljSFQuY29lZmZfbWFuX3NoZ2k7CisgICAgI2Vsc2UKKyAgICAvL2ZjbGsgPSA0MDsKKyAgICBpZiAoYnc0MCkKKyAgICB7CisgICAgICAgIC8qIGh0MjA0MCAqLworICAgICAgICBpZiAoZXh0T2Zmc2V0ID09IDEpIHsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHAgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwMjA0MEV4dEFib3ZlLmNvZWZmX2V4cDsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW4gPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwMjA0MEV4dEFib3ZlLmNvZWZmX21hbjsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwRXh0QWJvdmUuY29lZmZfZXhwX3NoZ2k7CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwMjA0MEV4dEFib3ZlLmNvZWZmX21hbl9zaGdpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cCA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwTWh6LmNvZWZmX2V4cDsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW4gPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwMjA0ME1oei5jb2VmZl9tYW47CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwMjA0ME1oei5jb2VmZl9leHBfc2hnaTsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwTWh6LmNvZWZmX21hbl9zaGdpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIHN0YXRpYyAyMCAqLworICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcFNUMjBNaHouY29lZmZfZXhwOworICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcFNUMjBNaHouY29lZmZfbWFuOworICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwU1QyME1oei5jb2VmZl9leHBfc2hnaTsKKyAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcFNUMjBNaHouY29lZmZfbWFuX3NoZ2k7CisgICAgfQorICAgICNlbmRpZgorfQorCisvKiBNYWluIHJvdXRpbiBmcmVxdWVuY3kgc2V0dGluZyBmdW5jdGlvbiAqLworLyogSWYgMi40Ry81RyBzd2l0Y2gsIFBIWSBuZWVkIHJlc2V0dGluZyBCQiBhbmQgUkYgZm9yIGJhbmQgc3dpdGNoICovCisvKiBEbyB0aGUgc2V0dGluZyBzd2l0Y2ggaW4gemZTZW5kRnJlcXVlbmN5Q21kKCkgKi8KK3ZvaWQgemZIcFNldEZyZXF1ZW5jeUV4KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwKKyAgICAgICAgdThfdCBleHRPZmZzZXQsIHU4X3QgaW5pdFJGKQoreworICAgIHUzMl90IGNtZFs5XTsKKyAgICB1MzJfdCBjbWRCWzNdOworICAgIHUxNl90IHJldDsKKyAgICB1OF90IG9sZF9iYW5kOworICAgIHU4X3QgbmV3X2JhbmQ7CisgICAgdTMyX3QgY2hlY2tMb29wQ291bnQ7CisgICAgdTMyX3QgdG1wVmFsdWU7CisKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfZXhwOworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9tYW47CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpOworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMSwgIkZyZXF1ZW5jeSA9ICIsIGZyZXF1ZW5jeSk7CisgICAgem1fbXNnMV9zY2FuKFpNX0xWXzEsICJidzQwID0gIiwgYnc0MCk7CisgICAgem1fbXNnMV9zY2FuKFpNX0xWXzEsICJleHRPZmZzZXQgPSAiLCBleHRPZmZzZXQpOworCisgICAgaWYgKCBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxICkKKyAgICB7CisgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICBpbml0UkYgPSAyOworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJ6ZkhwU2V0RnJlcXVlbmN5RXg6IERvIENvbGRSZXNldCAiKTsKKyAgICB9CisgICAgaWYgKCBocFByaXYtPmlzU2l0ZVN1cnZleSA9PSAyICkKKyAgICB7CisgICAgICAgIC8qIHdhaXQgdGltZSBmb3IgQUdDIGFuZCBub2lzZSBjYWxpYnJhdGlvbiA6IG5vdCBpbiBzaXRlc3VydmV5IGFuZCBjb25uZWN0ZWQgKi8KKyAgICAgICAgY2hlY2tMb29wQ291bnQgPSAyMDAwOyAvKiAyMDAwKjEwMCA9IDIwMG1zICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIHdhaXQgdGltZSBmb3IgQUdDIGFuZCBub2lzZSBjYWxpYnJhdGlvbiA6IGluIHNpdGVzdXJ2ZXkgKi8KKyAgICAgICAgY2hlY2tMb29wQ291bnQgPSAxMDAwOyAvKiAxMDAwKjEwMCA9IDEwMG1zICovCisgICAgfQorCisgICAgaHBQcml2LT5sYXRlc3RGcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgaHBQcml2LT5sYXRlc3RCdzQwID0gYnc0MDsKKyAgICBocFByaXYtPmxhdGVzdEV4dE9mZnNldCA9IGV4dE9mZnNldDsKKworICAgIGlmICgoaHBQcml2LT5kb3QxMU1vZGUgPT0gWk1fSEFMXzgwMjExX01PREVfSUJTU19HRU5FUkFMKSB8fAorICAgICAgICAoaHBQcml2LT5kb3QxMU1vZGUgPT0gWk1fSEFMXzgwMjExX01PREVfSUJTU19XUEEyUFNLKSkKKyAgICB7CisgICAgICAgIGlmICggZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3b3JrYXJvdW5kIGZvciAxMWcgQWQgSG9jIGJlYWNvbiBkaXN0cmlidXRpb24gKi8KKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzBfQ1csIDB4N2YwMDA3KTsKKyAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9BQzBfQUlGUywgMHgxYzA0OTAxYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBSEIsIERBQywgQURDIGNsb2NrIHNlbGVjdGlvbiBieSBzdGF0aWMyMC9odDIwNDAgKi8KKyAgICB6ZlNlbEFkY0NsayhkZXYsIGJ3NDAsIGZyZXF1ZW5jeSk7CisKKyAgICAvKiBjbGVhciBiYl9oZWF2eV9jbGlwX2VuYWJsZSAqLworICAgIHJlZ193cml0ZSgweDk5ZTAsIDB4MjAwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyogU2V0IENUUy9SVFMgcmF0ZSAqLworICAgIGlmICggZnJlcXVlbmN5ID4gWk1fQ0hfR18xNCApCisgICAgeworICAgICAgICAvL3pmSHBTZXRSVFNDVFNSYXRlKGRldiwgMHgxMGIwMTBiKTsgIC8qIE9GRE0gNk0gKi8KKwkgICAgbmV3X2JhbmQgPSAxOworCX0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3pmSHBTZXRSVFNDVFNSYXRlKGRldiwgMHgzMDAwMyk7ICAvKiBDQ0sgMTFNICovCisgICAgICAgIG5ld19iYW5kID0gMDsKKyAgICB9CisKKyAgICBpZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA+IFpNX0NIX0dfMTQpCisgICAgICAgIG9sZF9iYW5kID0gMTsKKyAgICBlbHNlCisgICAgICAgIG9sZF9iYW5kID0gMDsKKworICAgIC8vV29ya2Fyb3VuZCBmb3IgMi40R0h6IG9ubHkgZGV2aWNlCisgICAgaWYgKChocFByaXYtPk9wRmxhZ3MgJiAweDEpID09IDApCisgICAgeworICAgICAgICBpZiAoKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPT0gWk1fQ0hfR18xKSAmJiAoZnJlcXVlbmN5ID09IFpNX0NIX0dfMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZvcmNlIHRvIGRvIGJhbmQgc3dpdGNoaW5nICovCisgICAgICAgICAgICBvbGRfYmFuZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBOb3RpZnkgY2hhbm5lbCBzd2l0Y2ggdG8gZmlybXdhcmUgKi8KKyAgICAvKiBUWC9SWCBtdXN0IGJlIHN0b3BwZWQgYnkgbm93ICovCisgICAgY21kWzBdID0gMCB8IChaTV9DTURfRlJFUV9TVFJBVCA8PCA4KTsKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIDApOworCisgICAgaWYgKChpbml0UkYgIT0gMCkgfHwgKG5ld19iYW5kICE9IG9sZF9iYW5kKQorICAgICAgICAgICAgfHwgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdCdzQwICE9IGJ3NDApKQorICAgIHsKKyAgICAgICAgLyogYmFuZCBzd2l0Y2ggKi8KKyAgICAgICAgem1fbXNnMF9zY2FuKFpNX0xWXzEsICI9PT09PWJhbmQgc3dpdGNoPT09PT0iKTsKKworICAgICAgICBpZiAoaW5pdFJGID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NvbGQgcmVzZXQgQkIvQUREQQorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkNDAwNCwgMHg4MDApOworICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgICAgIHptX21zZzBfc2NhbihaTV9MVl8xLCAiRG8gY29sZCByZXNldCBCQi9BRERBIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1dhcm0gcmVzZXQgQkIvQUREQQorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkNDAwNCwgMHg0MDApOworICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlc2V0IHdvcmthcm91bmQgc3RhdGUgdG8gZGVmYXVsdCAqLworICAgICAgICBocFByaXYtPnJ4U3Ryb25nUlNTSSA9IDA7CisgICAgICAgIGhwUHJpdi0+c3Ryb25nUlNTSSA9IDA7CisKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkNDAwNCwgMHgwKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgICAgICB6ZkluaXRQaHkoZGV2LCBmcmVxdWVuY3ksIGJ3NDApOworCisvLyAgICAgICAgemZpQ2hlY2tSaWZzKGRldik7CisKKyAgICAgICAgLyogQmFuayAwIDEgMiAzIDUgNiA3ICovCisgICAgICAgIHpmU2V0UmZSZWdzKGRldiwgZnJlcXVlbmN5KTsKKyAgICAgICAgLyogQmFuayA0ICovCisgICAgICAgIHpmU2V0QmFuazRBbmRQb3dlclRhYmxlKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQpOworCisgICAgICAgIGNtZFswXSA9IDMyIHwgKFpNX0NNRF9SRl9JTklUIDw8IDgpOworICAgIH0KKyAgICBlbHNlIC8vKChuZXdfYmFuZCA9PSBvbGRfYmFuZCkgJiYgIWluaXRSRikKKyAgICB7CisgICAgICAgLyogc2FtZSBiYW5kICovCisKKyAgICAgICAvKiBGb3JjZSBkaXNhYmxlIENSNjcxIGJpdDIwIC8gNzgyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAvKiBUaGUgYnVnIGhhcyB0byBkbyB3aXRoIHRoZSBwb2xhcml0eSBvZiB0aGUgcGRhZGMgb2Zmc2V0IGNhbGlicmF0aW9uLiAgVGhlcmUgKi8KKyAgICAgICAvKiBpcyBhbiBpbml0aWFsIGNhbGlicmF0aW9uIHRoYXQgaXMgT0ssIGFuZCB0aGVyZSBpcyBhIGNvbnRpbnVvdXMgICAgICAgICAgICAgKi8KKyAgICAgICAvKiBjYWxpYnJhdGlvbiB0aGF0IHVwZGF0ZXMgdGhlIHBkZGFjIHdpdGggdGhlIHdyb25nIHBvbGFyaXR5LiAgRm9ydHVuYXRlbHkgICAgKi8KKyAgICAgICAvKiB0aGUgc2Vjb25kIGxvb3AgY2FuIGJlIGRpc2FibGVkIHdpdGggYSBiaXQgY2FsbGVkIGVuX3BkX2RjX29mZnNldF90aHIuICAgICAgKi8KKyNpZiAwCisgICAgICAgIGNtZEJbMF0gPSA4IHwgKFpNX0NNRF9CSVRBTkQgPDwgOCk7OworICAgICAgICBjbWRCWzFdID0gKDB4YTI3YyArIDB4MWJjMDAwKTsKKyAgICAgICAgY21kQlsyXSA9IDB4ZmZlZmZmZmY7CisgICAgICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWRCLCAxMiwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCAwKTsKKyNlbmRpZgorCisgICAgICAgLyogQmFuayA0ICovCisgICAgICAgemZTZXRCYW5rNEFuZFBvd2VyVGFibGUoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCk7CisKKworICAgICAgICBjbWRbMF0gPSAzMiB8IChaTV9DTURfRlJFUVVFTkNZIDw8IDgpOworICAgIH0KKworICAgIC8qIENvbXBhdGliaWxpdHkgZm9yIG5ldyBsYXlvdXQgVUI4MyAqLworICAgIC8qIFNldHRpbmcgY29kZSBhdCBDUjEgaGVyZSBtb3ZlIGZyb20gdGhlIGZ1bmM6emZId0hURW5hYmxlKCkgaW4gZmlybXdhcmUgKi8KKyAgICBpZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxDYXBhYmlsaXR5ICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKQorICAgIHsKKyAgICAgICAgLyogVUI4MyA6IG9uZSBzdHJlYW0gKi8KKyAgICAgICAgdG1wVmFsdWUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBVQjgxLCBVQjgyIDogdHdvIHN0cmVhbSAqLworICAgICAgICB0bXBWYWx1ZSA9IDB4MTAwOworICAgIH0KKworICAgIGlmICgxKSAvL2lmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3X0hUX0VOQUJMRSA9PSAxKQorCXsKKyAgICAgICAgaWYgKGJ3NDAgPT0gMSkKKwkJeworCQkJaWYgKGV4dE9mZnNldCA9PSAxKSB7CisgICAgICAgICAgICAJcmVnX3dyaXRlKDB4OTgwNCwgdG1wVmFsdWUgfCAweDJkNCk7IC8vM2Q0IGZvciByZWFsCisJCQl9CisJCQllbHNlIHsKKwkJCQlyZWdfd3JpdGUoMHg5ODA0LCB0bXBWYWx1ZSB8IDB4MmM0KTsgICAvLzNjNCBmb3IgcmVhbAorCQkJfQorCQkJLy8jIER5biBIVDIwNDAuUmVmZXIgdG8gUmVnIDEuCisgICAgICAgICAgICAvLyNbM106c2luZ2xlIGxlbmd0aCAoNHVzKSAxc3QgSFQgbG9uZyB0cmFpbmluZyBzeW1ib2w7IHVzZSBXYWxzaCBzcGF0aWFsIHNwcmVhZGluZyBmb3IgMiBjaGFpbnMgMiBzdHJlYW1zIFRYCisgICAgICAgICAgICAvLyNbY106YWxsb3cgc2hvcnQgR0kgZm9yIEhUNDAgcGFja2V0czsgZW5hYmxlIEhUIGRldGVjdGlvbi4KKyAgICAgICAgICAgIC8vI1s0XTplbmFibGUgMjAvNDAgTUh6IGNoYW5uZWwgZGV0ZWN0aW9uLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKwkgICAgeworICAgICAgICAgICAgcmVnX3dyaXRlKDB4OTgwNCwgdG1wVmFsdWUgfCAweDI0MCk7CisJCSAgICAvLyMgU3RhdGljIEhUMjAKKyAgICAgICAgICAgIC8vI1szXTpzaW5nbGUgbGVuZ3RoICg0dXMpIDFzdCBIVCBsb25nIHRyYWluaW5nIHN5bWJvbDsgdXNlIFdhbHNoIHNwYXRpYWwgc3ByZWFkaW5nIGZvciAyIGNoYWlucyAyIHN0cmVhbXMgVFgKKyAgICAgICAgICAgIC8vI1s0XTpPdHVzIGRvbid0IGFsbG93IHNob3J0IEdJIGZvciBIVDIwIHBhY2tldHMgeWV0OyBlbmFibGUgSFQgZGV0ZWN0aW9uLgorICAgICAgICAgICAgLy8jWzBdOmRpc2FibGUgMjAvNDAgTUh6IGNoYW5uZWwgZGV0ZWN0aW9uLgorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKwl7CisgICAgICAgIHJlZ193cml0ZSgweDk4MDQsIDB4MCk7CisJCS8vIyBMZWdhY3k7IyBEaXJlY3QgTWFwcGluZyBmb3IgZWFjaCBjaGFpbi4KKyAgICAgICAgLy8jQmUgbW9kaWZpZWQgYnkgT2xpZ28gdG8gYWRkIGR5bmFuaWMgZm9yIGxlZ2FjeS4KKyAgICAgICAgaWYgKGJ3NDAgPT0gMSkKKwkJeworICAgICAgICAgICAgcmVnX3dyaXRlKDB4OTgwNCwgMHg0KTsgICAgIC8vIyBEeW4gTGVnYWN5IC5SZWZlciB0byByZWcgMS4KKyAgICAgICAgfQorICAgICAgICBlbHNlCisJCXsKKyAgICAgICAgICAgIHJlZ193cml0ZSgweDk4MDQsIDB4MCk7ICAgIC8vIyBTdGF0aWMgTGVnYWN5CisgICAgICAgIH0KKwl9CisJemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKwkvKiBlbmQgb2YgdWI4MyBjb21wYXRpYmlsaXR5ICovCisKKyAgICAvKiBTZXQgUG93ZXIsIFRQQywgR2FpbiB0YWJsZS4uLiAqLworCXpmU2V0UG93ZXJDYWxUYWJsZShkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0KTsKKworCisgICAgLyogc3RvcmUgZnJlcXVlbmN5ICovCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA9ICh1MTZfdClmcmVxdWVuY3k7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0J3NDAgPSBidzQwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdFeHRPZmZzZXQgPSBleHRPZmZzZXQ7CisKKyAgICB6ZkdldEh3VHVybk9mZmR5blBhcmFtKGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kpOworCisgICAgLyogcmVsYXRlZCBmdW5jdGlvbnMgKi8KKyAgICBmcmVxdWVuY3kgPSBmcmVxdWVuY3kqMTAwMDsKKyAgICAvKiBsZW5bMzZdIDogdHlwZVsweDMwXSA6IHNlcVs/XSAqLworLy8gICAgY21kWzBdID0gMjggfCAoWk1fQ01EX0ZSRVFVRU5DWSA8PCA4KTsKKyAgICBjbWRbMV0gPSBmcmVxdWVuY3k7CisgICAgY21kWzJdID0gYnc0MDsvLygoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdfRFlOQU1JQ19IVDIwNDBfRU47CisgICAgY21kWzNdID0gKGV4dE9mZnNldDw8Mil8MHgxOy8vKCh3ZC0+RXh0T2Zmc2V0IDw8IDIpIHwgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od19IVF9FTkFCTEUpOworICAgIGNtZFs0XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX2V4cDsKKyAgICBjbWRbNV0gPSBkZWx0YV9zbG9wZV9jb2VmZl9tYW47CisgICAgY21kWzZdID0gZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2k7CisgICAgY21kWzddID0gZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2k7CisgICAgY21kWzhdID0gY2hlY2tMb29wQ291bnQ7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAzNiwgWk1fQ01EX1NFVF9GUkVRVUVOQ1ksIDApOworCisgICAgLy8gZGVsYXkgdGVtcG9yYXJpbHksIHdhaXQgZm9yIG5ldyBQSFkgYW5kIFJGCisgICAgLy96ZndTbGVlcChkZXYsIDEwMDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKiBLZXkgKioqKioqKioqKioqKioqKioqKiovCisKK3UxNl90IHpmSHBSZXNldEtleUNhY2hlKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgaTsKKyAgICB1MzJfdCBrZXlbNF0gPSB7MCwgMCwgMCwgMH07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIGZvcihpPTA7aTw0O2krKykKKyAgICB7CisgICAgICAgIHpmSHBTZXREZWZhdWx0S2V5KGRldiwgaSwgWk1fV0VQNjQsIGtleSwgTlVMTCk7CisgICAgfQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19ST0xMX0NBTExfVEJMX0wsIDB4MDApOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19ST0xMX0NBTExfVEJMX0gsIDB4MDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICBocFByaXYtPmNhbVJvbGxDYWxsVGFibGUgPSAodTY0X3QpIDA7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTZXRLZXkgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFNldCBrZXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogISBwbGVhc2UgdXNlIHpmQ29yZVNldEtleSgpIGluIDgwMjExQ29yZSBmb3IgU2V0S2V5ICovCit1MzJfdCB6ZkhwU2V0S2V5KHpkZXZfdCogZGV2LCB1OF90IHVzZXIsIHU4X3Qga2V5SWQsIHU4X3QgdHlwZSwKKyAgICAgICAgdTE2X3QqIG1hYywgdTMyX3QqIGtleSkKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworI2lmIDAgICAvKiByZW1vdmUgdG8gemZDb3JlU2V0S2V5KCkgKi8KKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZysrOworICAgIHptX2RlYnVnX21zZzEoIiAgIHpmSHBTZXRLZXkrKysrICIsIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICBjbWRbMF0gPSAweDAwMDAyODFDOworICAgIGNtZFsxXSA9ICgodTMyX3Qpa2V5SWQ8PDE2KSArICh1MzJfdCl1c2VyOworICAgIGNtZFsyXSA9ICgodTMyX3QpbWFjWzBdPDwxNikgKyAodTMyX3QpdHlwZTsKKyAgICBjbWRbM10gPSAoKHUzMl90KW1hY1syXTw8MTYpICsgKCh1MzJfdCltYWNbMV0pOworCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgY21kWzQraV0gPSBrZXlbaV07CisgICAgfQorCisgICAgaWYgKHVzZXIgPCA2NCkKKyAgICB7CisgICAgICAgIGhwUHJpdi0+Y2FtUm9sbENhbGxUYWJsZSB8PSAoKHU2NF90KSAxKSA8PCB1c2VyOworICAgIH0KKworICAgIC8vcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMzIsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMzIsIFpNX0NNRF9TRVRfS0VZLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKK3UzMl90IHpmSHBTZXRBcFBhaXJ3aXNlS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogc3RhTWFjQWRkciwgdThfdCB0eXBlLAorICAgICAgICB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5LCB1MTZfdCBzdGFBaWQpCit7CisgICAgaWYgKChzdGFBaWQhPTApICYmIChzdGFBaWQ8NjQpKQorICAgIHsKKyAgICAgICAgemZIcFNldEtleShkZXYsIChzdGFBaWQtMSksIDAsIHR5cGUsIHN0YU1hY0FkZHIsIGtleSk7CisgICAgICAgICAgICAgICAgaWYgKCh0eXBlID09IFpNX1RLSVApCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgIHx8ICh0eXBlID09IFpNX0NFTkMpCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICApCisgICAgICAgICAgICB6ZkhwU2V0S2V5KGRldiwgKHN0YUFpZC0xKSwgMSwgdHlwZSwgc3RhTWFjQWRkciwgbWljS2V5KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCit1MzJfdCB6ZkhwU2V0QXBHcm91cEtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFwTWFjQWRkciwgdThfdCB0eXBlLAorICAgICAgICB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5LCB1MTZfdCB2YXBJZCkKK3sKKyAgICB6ZkhwU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCAtIDEgLSB2YXBJZCwgMCwgdHlwZSwgYXBNYWNBZGRyLCBrZXkpOwkvLyA2RDE4IG1vZGlmeSBmcm9tIDAgdG8gMSA/PworICAgICAgICAgICAgaWYgKCh0eXBlID09IFpNX1RLSVApCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgIHx8ICh0eXBlID09IFpNX0NFTkMpCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICApCisgICAgICAgIHpmSHBTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUIC0gMSAtIHZhcElkLCAxLCB0eXBlLCBhcE1hY0FkZHIsIG1pY0tleSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmSHBTZXREZWZhdWx0S2V5KHpkZXZfdCogZGV2LCB1OF90IGtleUlkLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpCit7CisgICAgdTE2X3QgbWFjQWRkclszXSA9IHswLCAwLCAwfTsKKworICAgICNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIGlmICggaHBQcml2LT5kb3QxMU1vZGUgPT0gWk1fSEFMXzgwMjExX01PREVfSUJTU19XUEEyUFNLICkKKyAgICB7IC8qIElmIG5vdCB3cGEycHNrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAvKiBCZWNhdXNlIHRoZSBidWcgb2YgY2hpcCAsIGRlZmF1bHRrZXkgc2hvdWxkIGZvbGxvdyB0aGUga2V5IG1hcCBydWxlIGluIHJlZ2lzdGVyIDcwMCAqLworICAgICAgICBpZiAoIGtleUlkID09IDAgKQorICAgICAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDAsIHR5cGUsIG1hY0FkZHIsIGtleSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHpmSHBTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUlkLCAxLCB0eXBlLCBtYWNBZGRyLCBrZXkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHpmSHBTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUlkLCAwLCB0eXBlLCBtYWNBZGRyLCBrZXkpOworICAgICNlbHNlCisgICAgICAgIHpmSHBTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUlkLCAwLCB0eXBlLCBtYWNBZGRyLCBrZXkpOworICAgICNlbmRpZgorICAgICAgICAgICAgaWYgKCh0eXBlID09IFpNX1RLSVApCisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgfHwgKHR5cGUgPT0gWk1fQ0VOQykKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICkKKyAgICB7CisgICAgICAgIHpmSHBTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUlkLCAxLCB0eXBlLCBtYWNBZGRyLCBtaWNLZXkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZkhwU2V0UGVyVXNlcktleSh6ZGV2X3QqIGRldiwgdThfdCB1c2VyLCB1OF90IGtleUlkLCB1OF90KiBtYWMsIHU4X3QgdHlwZSwgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSkKK3sKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIGlmICggaHBQcml2LT5kb3QxMU1vZGUgPT0gWk1fSEFMXzgwMjExX01PREVfSUJTU19XUEEyUFNLICkKKyAgICB7IC8qIElmIG5vdCB3cGEycHNrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgIGlmKGtleUlkKQorICAgICAgICB7ICAvKiBTZXQgR3JvdXAgS2V5ICovCisgICAgICAgICAgICB6ZkhwU2V0S2V5KGRldiwgdXNlciwgMSwgdHlwZSwgKHUxNl90ICopbWFjLCBrZXkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoa2V5SWQgPT0gMCkKKyAgICAgICAgeyAgLyogU2V0IFBhaXJ3aXNlIEtleSAqLworICAgICAgICAgICAgemZIcFNldEtleShkZXYsIHVzZXIsIDAsIHR5cGUsICh1MTZfdCAqKW1hYywga2V5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZkhwU2V0S2V5KGRldiwgdXNlciwga2V5SWQsIHR5cGUsICh1MTZfdCAqKW1hYywga2V5KTsKKyAgICB9CisjZWxzZQorICAgIHpmSHBTZXRLZXkoZGV2LCB1c2VyLCBrZXlJZCwgdHlwZSwgKHUxNl90ICopbWFjLCBrZXkpOworI2VuZGlmCisKKyAgICAgICAgICAgIGlmICgodHlwZSA9PSBaTV9US0lQKQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICB8fCAodHlwZSA9PSBaTV9DRU5DKQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgKQorICAgIHsKKyAgICAgICAgemZIcFNldEtleShkZXYsIHVzZXIsIGtleUlkICsgMSwgdHlwZSwgKHUxNl90ICopbWFjLCBtaWNLZXkpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmSHBSZW1vdmVLZXkgICAgICAgICAgICAgICAqLworLyogICAgICBSZW1vdmUga2V5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSHBSZW1vdmVLZXkoemRldl90KiBkZXYsIHUxNl90IHVzZXIpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldCA9IDA7CisKKyAgICBjbWRbMF0gPSAweDAwMDAyOTA0OworICAgIGNtZFsxXSA9ICh1MzJfdCl1c2VyOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqIERNQSAqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSHBTdGFydFJlY3YoemRldl90KiBkZXYpCit7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2QzMCwgMHgxMDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZIcFN0b3BSZWN2KHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKiBNQUMgKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmSW5pdE1hYyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBBQ0sgZXh0ZW5zaW9uIHJlZ2lzdGVyICovCisgICAgLy8gamhsZWUgdGVtcCA6IGNoYW5nZSB2YWx1ZSAweDJjIC0+IDB4NDAKKyAgICAvLyBob25kYSByZXNvbHZlIHNob3J0IHByZWFtYmxlIHByb2JsZW0gOiAweDQwIC0+IDB4NzUKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUNLX0VYVEVOU0lPTiwgMHg0MCk7IC8vIDB4MjggLT4gMHgyYyA2NTIyOnlmbGVlCisKKyAgICAvKiBUeFEwLzEvMi8zIFJldHJ5IE1BWD0yID0+IHRyYW5zbWl0IDMgdGltZXMgYW5kIGRlZ3JhZGUgcmF0ZSBmb3IgcmV0cnkgKi8KKyAgICAvKiBQQjQyIEFQIGNyYXNoIGlzc3VlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBXb3JrYXJvdW5kIHRoZSBjcmFzaCBpc3N1ZSBieSBDVFMvUlRTLCBzZXQgcmV0cnkgbWF4IHRvIHplcm8gZm9yICAgICAgKi8KKyAgICAvKiAgIHdvcmthcm91bmQgdHggdW5kZXJydW4gd2hpY2ggZW5hYmxlIENUUy9SVFMgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUkVUUllfTUFYLCAwKTsgLy8gMHgxMTExMSA9PiAwCisKKyAgICAvKiB1c2UgaGFyZHdhcmUgTUlDIGNoZWNrICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1NOSUZGRVIsIDB4MjAwMDAwMCk7CisKKyAgICAvKiBTZXQgUnggdGhyZXNob2xkIHRvIDE2MDAgKi8KKyNpZiBaTV9MQVJHRVBBWUxPQURfVEVTVCA9PSAxCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JYX1RIUkVTSE9MRCwgMHhjNDAwMCk7CisjZWxzZQorICAgICNpZm5kZWYgWk1fRElTQUJMRV9BTVNEVThLX1NVUFBPUlQKKyAgICAvKiBUaGUgbWF4aW11bSBBLU1TRFUgbGVuZ3RoIGlzIDM4MzkvNzkzNSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SWF9USFJFU0hPTEQsIDB4YzFmODApOworICAgICNlbHNlCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JYX1RIUkVTSE9MRCwgMHhjMGY4MCk7CisgICAgI2VuZGlmCisjZW5kaWYKKworICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0RZTkFNSUNfU0lGU19BQ0ssIDB4MTBBKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlhfUEVfREVMQVksIDB4NzApOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCAweGExNDQwMDApOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19TTE9UX1RJTUUsIDk8PDEwKTsKKworICAgIC8qIENGLUVORCBtb2RlICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2IyYywgMHgxOTAwMDAwMCk7CisKKyAgICAvL05BViBwcm90ZWN0cyBBQ0sgb25seSAoaW4gVFhPUCkKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjM4LCAweDIwMSk7CisKKworICAgIC8qIFNldCBCZWFjb24gUEhZIENUUkwncyBUUEMgdG8gMHg3LCBUQTE9MSAqLworICAgIC8qIE9UVVMgc2V0IEFNIHRvIDB4MSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fSFQxLCAweDgwMDAxNzApOworCisgICAgLyogVE9ETyA6IHdlcCBiYWNrb2ZmIHByb3RlY3Rpb24gMHg2M2MgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkFDS09GRl9QUk9URUNULCAweDEwNSk7CisKKyAgICAvKiBBR0cgdGVzdCBjb2RlKi8KKyAgICAvKiBBZ2dyZWdhdGlvbiBNQVggbnVtYmVyIGFuZCB0aW1lb3V0ICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2I5YywgMHgxMDAwMGEpOworICAgIC8qIEZpbHRlciBhbnkgY29udHJvbCBmcmFtZXMsIEJBUiBpcyBiaXQgMjQgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjhjLCAweDA1MDBmZmZmKTsKKyAgICAvKiBFbmFibGUgZGVhZ2dyZWdhdG9yICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2M0MCwgMHgxKTsKKworICAgIC8qIEJhc2ljIHJhdGUgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkFTSUNfUkFURSwgMHgxNTBmKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFOREFUT1JZX1JBVEUsIDB4MTUwZik7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JUU19DVFNfUkFURSwgMHgxMGIwMWJiKTsKKworICAgIC8qIE1JTU8gcmVzcG9zbmUgY29udHJvbCAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsIDB4NDAwM0MxRSk7LyogYml0IDI2fjI4ICBvdHVzLUFNICovCisKKyAgICAvKiBFbmFibGUgTEVEMCBhbmQgTEVEMSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZDAxMDAsIDB4Myk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkMDEwNCwgMHgzKTsKKworICAgIC8qIHN3aXRjaCBNQUMgdG8gT1RVUyBpbnRlcmZhY2UgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjAwLCAweDMpOworCisgICAgLyogUlhNQUMgQS1NUERVIGxlbmd0aCB0aHJlc2hvbGQgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYzUwLCAweGZmZmYpOworCisJLyogUGh5IHJlZ2lzdGVyIHJlYWQgdGltZW91dCAqLworCXpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2ODAsIDB4ZjAwMDA4KTsKKworCS8qIERpc2FibGUgUnggVGltZU91dCA6IHdvcmthcm91bmQgZm9yIEJCLgorCSAqICBPVFVTIHdvdWxkIGludGVycnVwdCB0aGUgcnggZnJhbWUgdGhhdCBzZW50IGJ5IE9XTCBUeFVuZGVyUnVuCisJICogIGJlY2F1c2UgT1RVUyByeCB0aW1lb3V0IGJlaGF2aW9yLCB0aGVuIE9UVVMgd291bGQgbm90IGFjayB0aGUgQkEgZm9yCisJICogIHRoaXMgQU1QRFUgZnJvbSBPV0wuCisJICogIEZpeCBieSBQZXJyeSBId2FuZy4gIDIwMDcvMDUvMTAuCisJICogIDB4MWMzNjJjIDogUnggdGltZW91dCB2YWx1ZSA6IGJpdCAyN34xNgorCSAqLworCXpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2MmMsIDB4MCk7CisKKyAgICAvL1NldCBVU0IgUnggc3RyZWFtIG1vZGUgTUFYIHBhY2tldCBudW1iZXIgdG8gMgorICAgIC8vICAgIE1heCBwYWNrZXQgbnVtYmVyID0gKjB4MWUxMTEwICsgMQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZTExMTAsIDB4NCk7CisgICAgLy9TZXQgVVNCIFJ4IHN0cmVhbSBtb2RlIHRpbWVvdXQgdG8gMTB1cworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZTExMTQsIDB4ODApOworCisgICAgLy9TZXQgQ1BVIGNsb2NrIGZyZXF1ZW5jeSB0byA4OC84ME1IegorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDQwMDgsIDB4NzMpOworCisgICAgLy9TZXQgV0xBTiBETUEgaW50ZXJydXB0IG1vZGUgOiBnZW5lcmF0ZSBpbnQgcGVyIHBhY2tldAorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNkN2MsIDB4MTEwMDExKTsKKworICAgIC8qIDc4MDcgKi8KKyAgICAvKiBlbmFibGUgZnVuYyA6IFJlc2V0IEZJRk8xIGFuZCBGSUZPMiB3aGVuIHF1ZXVlLWdudCBpcyBsb3cgKi8KKyAgICAvKiAweDFjM2JiMCBCaXQyICovCisgICAgLyogRGlzYWJsZSBTd1Jlc2V0IGluIGZpcm13YXJlIGZvciBUeEhhbmcsIGVuYWJsZSByZXNldCBGSUZPIGZ1bmMuICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiMCwgMHg0KTsKKworICAgIC8qIERpc2FibGVzIHRoZSBDRl9FTkQgZnJhbWUgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfVFhPUF9OT1RfRU5PVUdIX0lORElDQVRJT04sIDB4MTQxRTBGNDgpOworCisJLyogRGlzYWJsZSB0aGUgU1cgRGVjcnlwdCovCisJemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY3OCwgMHg3MCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyogU2V0IFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIFNUQSBkZWZhdWx0LiAqLworICAgIHpmVXBkYXRlRGVmYXVsdFFvc1BhcmFtZXRlcihkZXYsIDApOworCisgICAgLy96ZlNlbEFkY0NsayhkZXYsIDApOworCisgICAgcmV0dXJuOworfQorCisKK3UxNl90IHpmSHBTZXRTbmlmZmVyTW9kZSh6ZGV2X3QqIGRldiwgdTE2X3Qgb24pCit7CisgICAgaWYgKG9uICE9IDApCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU05JRkZFUiwgMHgyMDAwMDAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1NOSUZGRVIsIDB4MjAwMDAwMCk7CisgICAgfQorICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKKwordTE2X3QgemZIcFNldEFwU3RhTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKyAgICBocFByaXYtPmRvdDExTW9kZSA9IG1vZGU7CisKKyAgICBzd2l0Y2gobW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fSEFMXzgwMjExX01PREVfQVA6CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNzAwLCAweDBmMDAwMGExKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNjNDAsIDB4MSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0hBTF84MDIxMV9NT0RFX1NUQToKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM3MDAsIDB4MGYwMDAwMDIpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2M0MCwgMHgxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSEFMXzgwMjExX01PREVfSUJTU19HRU5FUkFMOgorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzcwMCwgMHgwZjAwMDAwMCk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYzQwLCAweDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0s6CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNzAwLCAweDBmMDAwMGUwKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNjNDAsIDB4NDEpOyAgICAgICAvLyBmb3IgbXVsdGlwbGUgKCA+IDIgKSBzdGF0aW9ucyBJQlNTIG5ldHdvcmsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgfQorCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworc2tpcDoKKyAgICByZXR1cm4gMDsKK30KKworCit1MTZfdCB6ZkhwU2V0QnNzaWQoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkU3JjKQoreworICAgIHUzMl90ICBhZGRyZXNzOworICAgIHUxNl90ICpic3NpZCA9ICh1MTZfdCAqKWJzc2lkU3JjOworCisgICAgYWRkcmVzcyA9IGJzc2lkWzBdICsgKCgodTMyX3QpYnNzaWRbMV0pIDw8IDE2KTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjE4LCBhZGRyZXNzKTsKKworICAgIGFkZHJlc3MgPSAodTMyX3QpYnNzaWRbMl07CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzYxQywgYWRkcmVzcyk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZIcFVwZGF0ZVFvc1BhcmFtZXRlciAgICAgICovCisvKiAgICAgIFVwZGF0ZSBUeFFzIENXTUlOLCBDV01BWCwgQUlGUyBhbmQgVFhPUC4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBjd21pblRibCA6IENXTUlOIHBhcmFtZXRlciBmb3IgVHhRcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgY3dtYXhUYmwgOiBDV01BWCBwYXJhbWV0ZXIgZm9yIFR4UXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFpZnNUYmw6IEFJRlMgcGFyYW1ldGVyIGZvciBUeFFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0eG9wVGJsIDogVFhPUCBwYXJhbWV0ZXIgZm9yIFR4UXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordThfdCB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKHpkZXZfdCogZGV2LCB1MTZfdCogY3dtaW5UYmwsIHUxNl90KiBjd21heFRibCwKKyAgICAgICAgdTE2X3QqIGFpZnNUYmwsIHUxNl90KiB0eG9wVGJsKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJ6ZkhhbFVwZGF0ZVFvc1BhcmFtZXRlcigpIik7CisKKyAgICAvKiBOb3RlIDogRG8gbm90IGNoYW5nZSBjd21pbiBmb3IgUTAgaW4gQWQgSG9jIG1vZGUgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgIG90aGVyd2lzZSBkcml2ZXIgd2lsbCBmYWlsIGluIFdpZmkgYmVhY29uIGRpc3RyaWJ1dGlvbiAqLworICAgIGlmIChocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9TVEEpCisgICAgeworI2lmIDAgLy9SZXN0b3JlIENXbWluIHRvIGltcHJvdmUgZG93biBsaW5rIHRocm91Z2hwdXQKKyAgICAgICAgLy9jaGVhdGluZyBpbiBCRSB0cmFmZmljCisgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vY2hlYXRpbmcgaW4gQkUgdHJhZmZpYworICAgICAgICAgICAgY3dtaW5UYmxbMF0gPSA3Oy8vMTU7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBjd21heFRibFswXSA9IDEyNzsvLzEwMjM7CisgICAgICAgIGFpZnNUYmxbMF0gPSAyKjkrMTA7Ly8zICogOSArIDEwOworICAgIH0KKworICAgIC8qIENXTUlOIGFuZCBDV01BWCAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzBfQ1csIGN3bWluVGJsWzBdCisgICAgICAgICAgICArICgodTMyX3QpY3dtYXhUYmxbMF08PDE2KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9DVywgY3dtaW5UYmxbMV0KKyAgICAgICAgICAgICsgKCh1MzJfdCljd21heFRibFsxXTw8MTYpKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMyX0NXLCBjd21pblRibFsyXQorICAgICAgICAgICAgKyAoKHUzMl90KWN3bWF4VGJsWzJdPDwxNikpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzNfQ1csIGN3bWluVGJsWzNdCisgICAgICAgICAgICArICgodTMyX3QpY3dtYXhUYmxbM108PDE2KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDNF9DVywgY3dtaW5UYmxbNF0KKyAgICAgICAgICAgICsgKCh1MzJfdCljd21heFRibFs0XTw8MTYpKTsKKworICAgIC8qIEFJRlMgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9BSUZTLCBhaWZzVGJsWzBdCisgICAgICAgICAgICArKCh1MzJfdClhaWZzVGJsWzBdPDwxMikrKCh1MzJfdClhaWZzVGJsWzBdPDwyNCkpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzNfQUMyX0FJRlMsIChhaWZzVGJsWzBdPj44KQorICAgICAgICAgICAgKygodTMyX3QpYWlmc1RibFswXTw8NCkrKCh1MzJfdClhaWZzVGJsWzBdPDwxNikpOworCisgICAgLyogVFhPUCAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX1RYT1AsIHR4b3BUYmxbMF0KKyAgICAgICAgICAgICsgKCh1MzJfdCl0eG9wVGJsWzFdPDwxNikpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzNfQUMyX1RYT1AsIHR4b3BUYmxbMl0KKyAgICAgICAgICAgICsgKCh1MzJfdCl0eG9wVGJsWzNdPDwxNikpOworCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIGhwUHJpdi0+dHhvcFswXSA9IHR4b3BUYmxbMF07CisgICAgaHBQcml2LT50eG9wWzFdID0gdHhvcFRibFsxXTsKKyAgICBocFByaXYtPnR4b3BbMl0gPSB0eG9wVGJsWzJdOworICAgIGhwUHJpdi0+dHhvcFszXSA9IHR4b3BUYmxbM107CisgICAgaHBQcml2LT5jd21pblswXSA9IGN3bWluVGJsWzBdOworICAgIGhwUHJpdi0+Y3dtYXhbMF0gPSBjd21heFRibFswXTsKKyAgICBocFByaXYtPmN3bWluWzFdID0gY3dtaW5UYmxbMV07CisgICAgaHBQcml2LT5jd21heFsxXSA9IGN3bWF4VGJsWzFdOworCisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCB6ZkhwU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbikKK3sKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJTZXQgQVRJTSB3aW5kb3cgdG8gIiwgYXRpbVdpbik7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FUSU1fV0lORE9XLCBhdGltV2luKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisKK3ZvaWQgemZIcFNldEJhc2ljUmF0ZVNldCh6ZGV2X3QqIGRldiwgdTE2X3QgYlJhdGVCYXNpYywgdTE2X3QgZ1JhdGVCYXNpYykKK3sKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkFTSUNfUkFURSwgYlJhdGVCYXNpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh1MTZfdClnUmF0ZUJhc2ljPDw4KSk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworCisvKiBIVDQwIHNlbmQgYnkgT0ZETSA2TSAgICAqLworLyogb3RoZXJ3aXNlIHVzZSByZWcgMHg2MzggKi8KK3ZvaWQgemZIcFNldFJUU0NUU1JhdGUoemRldl90KiBkZXYsIHUzMl90IHJhdGUpCit7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JUU19DVFNfUkFURSwgcmF0ZSk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKwordm9pZCB6ZkhwU2V0TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUxNl90IG1hY0FkZHJJZCkKK3sKKyAgICBpZiAobWFjQWRkcklkID09IDApCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFDX0FERFJfTCwKKyAgICAgICAgICAgICAgICAoKCh1MzJfdCltYWNBZGRyWzFdKTw8MTYpIHwgbWFjQWRkclswXSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQUNfQUREUl9ILCBtYWNBZGRyWzJdKTsKKyAgICB9CisgICAgZWxzZSBpZiAobWFjQWRkcklkIDw9IDcpCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUNLX1RBQkxFKygobWFjQWRkcklkLTEpKjgpLAorICAgICAgICAgICAgICAgIG1hY0FkZHJbMF0gKyAoKHUzMl90KW1hY0FkZHJbMV08PDE2KSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQ0tfVEFCTEUrKChtYWNBZGRySWQtMSkqOCkrNCwKKyAgICAgICAgICAgICAgICBtYWNBZGRyWzJdKTsKKyAgICB9CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKwordm9pZCB6ZkhwU2V0TXVsdGljYXN0TGlzdCh6ZGV2X3QqIGRldiwgdThfdCBzaXplLCB1OF90KiBwTGlzdCwgdThfdCBiQWxsTXVsdGljYXN0KQoreworICAgIHN0cnVjdCB6c011bHRpY2FzdEFkZHIqIHBNYWNMaXN0ID0gKHN0cnVjdCB6c011bHRpY2FzdEFkZHIqKSBwTGlzdDsKKyAgICB1OF90ICAgaTsKKyAgICB1MzJfdCAgdmFsdWU7CisgICAgdTMyX3QgIHN3UmVnTXVsSGFzaFZhbHVlSCwgc3dSZWdNdWxIYXNoVmFsdWVMOworCisgICAgc3dSZWdNdWxIYXNoVmFsdWVIID0gMHg4MDAwMDAwMDsKKyAgICBzd1JlZ011bEhhc2hWYWx1ZUwgPSAwOworCisgICAgaWYgKCBiQWxsTXVsdGljYXN0ICkKKyAgICB7CisgICAgICAgIHN3UmVnTXVsSGFzaFZhbHVlSCA9IHN3UmVnTXVsSGFzaFZhbHVlTCA9IH4wOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoaT0wOyBpPHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWUgPSBwTWFjTGlzdFtpXS5hZGRyWzVdID4+IDI7CisKKyAgICAgICAgICAgIGlmICggdmFsdWUgPCAzMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dSZWdNdWxIYXNoVmFsdWVMIHw9ICgxIDw8IHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd1JlZ011bEhhc2hWYWx1ZUggfD0gKDEgPDwgKHZhbHVlLTMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfR1JPVVBfSEFTSF9UQkxfTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd1JlZ011bEhhc2hWYWx1ZUwpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19HUk9VUF9IQVNIX1RCTF9ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3UmVnTXVsSGFzaFZhbHVlSCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiBCZWFjb24gKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmSHBFbmFibGVCZWFjb24oemRldl90KiBkZXYsIHUxNl90IG1vZGUsIHUxNl90IGJjbkludGVydmFsLCB1MTZfdCBkdGltLCB1OF90IGVuYWJsZUF0aW0pCit7CisgICAgdTMyX3QgIHZhbHVlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQmVhY29uIFJlYWR5ICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9DVFJMLCAwKTsKKyAgICAvKiBCZWFjb24gRE1BIGJ1ZmZlciBhZGRyZXNzICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9BRERSLCBaTV9CRUFDT05fQlVGRkVSX0FERFJFU1MpOworCisgICAgdmFsdWUgPSBiY25JbnRlcnZhbDsKKworICAgIHZhbHVlIHw9ICgoKHUzMl90KSBkdGltKSA8PCAxNik7CisKKyAgICBpZiAobW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKworICAgICAgICB2YWx1ZSB8PSAweDEwMDAwMDA7CisgICAgfQorICAgIGVsc2UgaWYgKG1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgIHsKKyAgICAgICAgdmFsdWUgfD0gMHgyMDAwMDAwOworCisJCWlmICggZW5hYmxlQXRpbSApCisJCXsKKwkJCXZhbHVlIHw9IDB4NDAwMDAwMDsKKwkJfQorCQkoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlic3NCY25FbmFibGVkID0gMTsKKyAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pYnNzQmNuSW50ZXJ2YWwgPSB2YWx1ZTsKKyAgICB9CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1BSRVRCVFQsIChiY25JbnRlcnZhbC02KTw8MTYpOworCisgICAgLyogQmVhY29uIHBlcmlvZCBhbmQgYmVhY29uIGVuYWJsZSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUEVSSU9ELCB2YWx1ZSk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKwordm9pZCB6ZkhwRGlzYWJsZUJlYWNvbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlic3NCY25FbmFibGVkID0gMDsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUEVSSU9ELCAwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBMZWRDdHJsKHpkZXZfdCogZGV2LCB1MTZfdCBsZWRJZCwgdThfdCBtb2RlKQoreworICAgIHUxNl90IHN0YXRlOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiTEVEIElEPSIsIGxlZElkKTsKKyAgICAvL3ptX2RlYnVnX21zZzEoIkxFRCBtb2RlPSIsIG1vZGUpOworICAgIGlmIChsZWRJZCA8IDIpCisgICAgeworICAgICAgICBpZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5sZWRNb2RlW2xlZElkXSAhPSBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmxlZE1vZGVbbGVkSWRdID0gbW9kZTsKKworICAgICAgICAgICAgc3RhdGUgPSAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmxlZE1vZGVbMF0KKyAgICAgICAgICAgICAgICAgICAgfCAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5sZWRNb2RlWzFdPDwxKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZDAxMDQsIHN0YXRlKTsKKyAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlVwZGF0ZSBMRUQiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmSHBSZXNldFR4UnggICAgICAgICAgICAgICAqLworLyogICAgICBSZXNldCBUeCBhbmQgUnggRGVzYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2hhby1XZW4gWWFuZyAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4zICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSHBVc2JSZXNldCh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0ID0gMDsKKworICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gUmVzZXQgVHggYW5kIFJ4Iik7CisKKyAgICBjbWRbMF0gPSAgMCB8IChaTV9DTURfUkVTRVQgPDwgOCk7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA0LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKK3UxNl90IHpmSHBES1Jlc2V0KHpkZXZfdCogZGV2LCB1OF90IGZsYWcpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldCA9IDA7CisKKyAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIFJlc2V0IFR4IGFuZCBSeCIpOworCisgICAgY21kWzBdID0gIDQgfCAoWk1fQ01EX0RLUkVTRVQgPDwgOCk7CisgICAgY21kWzFdID0gZmxhZzsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZIcEN3bVVwZGF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICAvL3UzMl90IGNtZFszXTsKKyAgICAvL3UxNl90IHJldDsKKyAgICAvLworICAgIC8vY21kWzBdID0gMHgwMDAwMDAwODsKKyAgICAvL2NtZFsxXSA9IDB4MWMzNmU4OworICAgIC8vY21kWzJdID0gMHgxYzM2ZWM7CisgICAgLy8KKyAgICAvL3JldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9DV01fUkVBRCwgMCk7CisgICAgLy9yZXR1cm4gcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6ZkNvcmVDd21CdXN5KGRldiwgemZDd21Jc0V4dENoYW5CdXN5KGhwUHJpdi0+Y3RsQnVzeSwgaHBQcml2LT5leHRCdXN5KSk7CisKKyAgICBocFByaXYtPmN0bEJ1c3kgPSAwOworICAgIGhwUHJpdi0+ZXh0QnVzeSA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKwordTMyX3QgemZIcEFuaVVwZGF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbNV07CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAxMDsKKyAgICBjbWRbMV0gPSAweDFjMzZlODsKKyAgICBjbWRbMl0gPSAweDFjMzZlYzsKKyAgICBjbWRbM10gPSAweDFjM2NiNDsKKyAgICBjbWRbNF0gPSAweDFjM2NiODsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDIwLCBaTV9BTklfUkVBRCwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFVwZGF0ZSBCZWFjb24gUlNTSSBpbiBBTkkKKyAqLwordTMyX3QgemZIcEFuaVVwZGF0ZVJzc2koemRldl90KiBkZXYsIHU4X3QgcnNzaSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgaHBQcml2LT5zdGF0cy5hc3Rfbm9kZXN0YXRzLm5zX2F2Z2Jyc3NpID0gcnNzaTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUICAgKDB4MTQwMCArICgweDEwNjw8MSkpCisjZGVmaW5lIFpNX1NFRVBST01fUkVHRE9NQUlOX09GRlNFVCAgICgweDE0MDAgKyAoMHgxMDQ8PDEpKQorI2RlZmluZSBaTV9TRUVQUk9NX1ZFUklTT05fT0ZGU0VUICAgKDB4MTQwMCArICgweDEwMjw8MSkpCisjZGVmaW5lIFpNX1NFRVBST01fSEFSRFdBUkVfVFlQRV9PRkZTRVQgICAoMHgxMzc0KQorI2RlZmluZSBaTV9TRUVQUk9NX0hXX0hFQVZZX0NMSVAgICAgICAgICAgKDB4MTYxYykKKwordTMyX3QgemZIcEdldE1hY0FkZHJlc3MoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgY21kWzddOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMDAgfCAyNDsKKyAgICBjbWRbMV0gPSBaTV9TRUVQUk9NX01BQ19BRERSRVNTX09GRlNFVDsKKyAgICBjbWRbMl0gPSBaTV9TRUVQUk9NX01BQ19BRERSRVNTX09GRlNFVCs0OworICAgIGNtZFszXSA9IFpNX1NFRVBST01fUkVHRE9NQUlOX09GRlNFVDsKKyAgICBjbWRbNF0gPSBaTV9TRUVQUk9NX1ZFUklTT05fT0ZGU0VUOworICAgIGNtZFs1XSA9IFpNX1NFRVBST01fSEFSRFdBUkVfVFlQRV9PRkZTRVQ7CisgICAgY21kWzZdID0gWk1fU0VFUFJPTV9IV19IRUFWWV9DTElQOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMjgsIFpNX01BQ19SRUFELCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCit1MzJfdCB6ZkhwR2V0VHJhbnNtaXRQb3dlcih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYqICAgIGhwUHJpdiAgPSB3ZC0+aHBQcml2YXRlOworICAgIHUxNl90ICAgICAgICAgICAgICAgdHBjICAgICA9IDA7CisKKyAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8IDMwMDApIHsKKyAgICAgICAgdHBjID0gaHBQcml2LT50UG93MngyZ1swXSAmIDB4M2Y7CisgICAgICAgIHdkLT5tYXhUeFBvd2VyMiAmPSAweDNmOworICAgICAgICB0cGMgPSAodHBjID4gd2QtPm1heFR4UG93ZXIyKT8gd2QtPm1heFR4UG93ZXIyIDogdHBjOworICAgIH0gZWxzZSB7CisgICAgICAgIHRwYyA9IGhwUHJpdi0+dFBvdzJ4NWdbMF0gJiAweDNmOworICAgICAgICB3ZC0+bWF4VHhQb3dlcjUgJj0gMHgzZjsKKyAgICAgICAgdHBjID0gKHRwYyA+IHdkLT5tYXhUeFBvd2VyNSk/IHdkLT5tYXhUeFBvd2VyNSA6IHRwYzsKKyAgICB9CisKKyAgICByZXR1cm4gdHBjOworfQorCit1OF90IHpmSHBHZXRNaW5UeFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogICAgaHBQcml2ICA9IHdkLT5ocFByaXZhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgIHRwYyAgICAgPSAwOworCisgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICAgICAgaWYod2QtPkJhbmRXaWR0aDQwKQorICAgICAgICB7CisgICAgICAgICAgICAvLzQwTQorICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdIdDQwWzddJjB4M2YpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8yME0KKyAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnSHQyMFs3XSYweDNmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZih3ZC0+QmFuZFdpZHRoNDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vNDBNCisgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z0h0NDBbN10mMHgzZik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLzIwTQorICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdIdDIwWzddJjB4M2YpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRwYzsKK30KKwordThfdCB6ZkhwR2V0TWF4VHhQb3dlcih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYqICAgIGhwUHJpdiAgPSB3ZC0+aHBQcml2YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICB0cGMgICAgID0gMDsKKworICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDwgMzAwMCkKKyAgICB7CisgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeENja1swXSYweDNmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdHBjID0oaHBQcml2LT50UG93Mng1Z1swXSYweDNmKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHBjOworfQorCit1MzJfdCB6ZkhwTG9hZEVFUFJPTUZyb21GVyh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbMTZdOworICAgIHUzMl90IHJldD0wLCBpLCBqOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGkgPSAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmVlcHJvbUltYWdlUmRSZXE7CisKKyAgICBjbWRbMF0gPSBaTV9IQUxfTUFYX0VFUFJPTV9QUlEqNDsKKworICAgIGZvciAoaj0wOyBqPFpNX0hBTF9NQVhfRUVQUk9NX1BSUTsgaisrKQorICAgIHsKKyAgICAgICAgY21kW2orMV0gPSAweDEwMDAgKyAoKChpKlpNX0hBTF9NQVhfRUVQUk9NX1BSUSkgKyBqKSo0KTsKKyAgICB9CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAoWk1fSEFMX01BWF9FRVBST01fUFJRKzEpKjQsIFpNX0VFUFJPTV9SRUFELCAwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgemZIcEhlYXJ0QmVhdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKyAgICB1OF90IHBvbGx1dGVkID0gMDsKKyAgICB1OF90IGFja1RwYzsKKworICAgIC8qIFdvcmthcm91bmQgOiBNYWtlIE9UVVMgZmlyZSBtb3JlIGJlYWNvbiBpbiBhZCBob2MgbW9kZSBpbiAyLjRHSHogKi8KKyAgICBpZiAoaHBQcml2LT5pYnNzQmNuRW5hYmxlZCAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+dGljayAlIDEwKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgod2QtPnRpY2sgJSA0MCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUEVSSU9ELCBocFByaXYtPmlic3NCY25JbnRlcnZhbC0xKTsKKyAgICAgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BFUklPRCwgaHBQcml2LT5pYnNzQmNuSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCh3ZC0+dGljayAmIDB4M2YpID09IDB4MjUpCisgICAgeworICAgICAgICAvKiBXb3JrYXJvdW5kIGZvciBiZWFjb24gc3R1Y2sgYWZ0ZXIgU1cgcmVzZXQgKi8KKyAgICAgICAgaWYgKGhwUHJpdi0+aWJzc0JjbkVuYWJsZWQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9BRERSLCBaTV9CRUFDT05fQlVGRkVSX0FERFJFU1MpOworICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy9EYmdQcmludCgiaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFPSVkIiwgaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFKTsKKyAgICAgICAgLy9EYmdQcmludCgid2QtPnN0YS5hdmdTaXplT2ZSZWNlaXZlUGFja2V0cz0lZCIsIHdkLT5zdGEuYXZnU2l6ZU9mUmVjZWl2ZVBhY2tldHMpOworICAgICAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgJiYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkgLy8xMW4gbW9kZQorICAgICAgICAgICAgJiYgKHdkLT5CYW5kV2lkdGg0MCA9PSAxKSAvLzQwTUh6IG1vZGUKKyAgICAgICAgICAgICYmICh3ZC0+c3RhLmVuYWJsZURydkJBID09MCkgLy9NYXJ2ZWwgQVAKKyAgICAgICAgICAgICYmIChocFByaXYtPmFnZ01heER1cmF0aW9uQkUgPiAyMDAwKSAvL0JFIFRYT1AgPiAybXMKKyAgICAgICAgICAgICYmICh3ZC0+c3RhLmF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzID4gMTQyMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiOWMsIDB4ODAwMGEpOworICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2I5YywgaHBQcml2LT5hZ2dQa3ROdW0pOworICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT5keW5hbWljU0lGU0VuYWJsZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKSAvLzExbiBtb2RlCisgICAgICAgICAgICAgICAgJiYgKHdkLT5CYW5kV2lkdGg0MCA9PSAwKSAvLzIwTUh6IG1vZGUKKyAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5lbmFibGVEcnZCQSA9PTApKSAvL01hcnZlbCBBUAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTgsIDB4NTE0NDAwMCk7CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTgsIDB4QTE0NDAwMCk7CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkgLy8xMW4gbW9kZQorICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLmF0aE93bEFwID09IDEpKSAvL0F0aGVyb3MgQVAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT5yZXRyYW5zbWlzc2lvbkV2ZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGhwUHJpdi0+bGF0ZXN0U0lGUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdFNJRlMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIDB4ODE0NDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RTSUZTID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCAweGExNDQwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0U0lGUyA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgMHhjMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdFNJRlMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIDB4YTE0NDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0U0lGUyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgMHhhMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiIyMjIyMgQ29ycmVjdCBUeCByZXRyYW5zbWlzc2lvbiBpc3N1ZSAjIyMjIywgIiwgaHBQcml2LT5sYXRlc3RTSUZTKTsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yZXRyYW5zbWlzc2lvbkV2ZW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RTSUZTID0gMDsKKyAgICAgICAgICAgICAgICBocFByaXYtPnJldHJhbnNtaXNzaW9uRXZlbnQgPSAwOworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTgsIDB4QTE0NDAwMCk7CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCh3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPT0gRkFMU0UpICYmICh3ZC0+c3RhLmJDaGFubmVsU2NhbiA9PSBGQUxTRSkpCisgICAgICAgIHsKKyNkZWZpbmUgWk1fU0lHTkFMX1RIUkVTSE9MRCAgNjYKKyAgICAgICAgaWYgKCggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICYmICh3ZC0+U2lnbmFsU3RyZW5ndGggPiBaTV9TSUdOQUxfVEhSRVNIT0xEKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBzdGF0ZSBoYW5kbGUsIGFsd2F5cyByZXdyaXRlIHJlZ2lzdGVyIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAvL2lmIChocFByaXYtPnN0cm9uZ1JTU0kgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnN0cm9uZ1JTU0kgPSAxOworICAgICAgICAgICAgICAgIC8qIFN0cm9uZyBSU1NJLCBzZXQgQUNLIHRvIG9uZSBUeCBzdHJlYW0gYW5kIGxvd2VyIFR4IHBvd2VyIDdkYm0gKi8KKyAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjID4gKDE0KzEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFja1RwYyA9IGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyAtIDE0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhY2tUcGMgPSAxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChhY2tUcGMpIDw8IDIwKSB8ICgweDE8PDI2KSk7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChhY2tUcGMpIDw8IDUgKSB8ICgweDE8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhY2tUcGMpIDw8IDIxKSB8ICgweDE8PDI3KSAgKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHN0YXRlIGhhbmRsZSwgYWx3YXlzIHJld3JpdGUgcmVnaXN0ZXIgc2V0dGluZyAqLworICAgICAgICAgICAgICAgIC8vaWYgKGhwUHJpdi0+c3Ryb25nUlNTSSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+c3Ryb25nUlNTSSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSAmIFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIwKSB8ICgweDE8PDI2KSk7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDUgKSB8ICgweDE8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgMjEpIHwgKDB4MTw8MjcpICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCAyMCkgfCAoMHg1PDwyNikpOworICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCA1ICkgfCAoMHg1PDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIxKSB8ICgweDU8PDI3KSAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisjdW5kZWYgWk1fU0lHTkFMX1RIUkVTSE9MRAorICAgICAgICB9CisKKyAgICAgICAgaWYgKChocFByaXYtPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPnN0YS5iU2NoZWR1bGVTY2FuID09IEZBTFNFKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UpKQorICAgICAgICAgICAgeworICAgICNkZWZpbmUgWk1fUlhfU0lHTkFMX1RIUkVTSE9MRF9IICA3MQorICAgICNkZWZpbmUgWk1fUlhfU0lHTkFMX1RIUkVTSE9MRF9MICA2NgorICAgICAgICAgICAgICAgIHU4X3QgcnhTaWduYWxUaHJlc2hvbGRIID0gWk1fUlhfU0lHTkFMX1RIUkVTSE9MRF9IOworICAgICAgICAgICAgICAgIHU4X3QgcnhTaWduYWxUaHJlc2hvbGRMID0gWk1fUlhfU0lHTkFMX1RIUkVTSE9MRF9MOworICAgICN1bmRlZiBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0gKKyAgICAjdW5kZWYgWk1fUlhfU0lHTkFMX1RIUkVTSE9MRF9MCisKKyAgICAgICAgICAgICAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+U2lnbmFsU3RyZW5ndGggPiByeFNpZ25hbFRocmVzaG9sZEgpCisgICAgICAgICAgICAgICAgICAgICkvLyYmIChocFByaXYtPnJ4U3Ryb25nUlNTSSA9PSAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+cnhTdHJvbmdSU1NJID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1OTY0LCAweDEyMjApOworICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5NjAsIDB4OTAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM2OTYwLCAweDkwMCk7CisgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNzk2MCwgMHg5MDApOworICAgICAgICAgICAgICAgICAgICBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5MDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4OWI0OSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDA5MDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+U2lnbmFsU3RyZW5ndGggPiByeFNpZ25hbFRocmVzaG9sZEwpCisgICAgICAgICAgICAgICAgICAgICkvLyYmIChocFByaXYtPnJ4U3Ryb25nUlNTSSA9PSAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vRG8gbm90aGluZyB0byBwcmV2ZW50IGZyZXF1ZW50bHkgUnggc3dpdGNoaW5nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBzdGF0ZSBoYW5kbGUsIGFsd2F5cyByZXdyaXRlIHJlZ2lzdGVyIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgLy9pZiAoaHBQcml2LT5yeFN0cm9uZ1JTU0kgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yeFN0cm9uZ1JTU0kgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1OTY0LCAweDExMjApOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1OTYwLCAweDliNDApOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM2OTYwLCAweDliNDApOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM3OTYwLCAweDliNDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTEwKjIvNF0mMHhmZikgPT0gMHg4MCkgLy9GRU0gVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDliNDkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDA5MDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDliNDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHBQcml2LT51c2JBY1NlbmRCeXRlc1szXSA+IChocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzBdKjIpKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QLCBocFByaXYtPnR4b3BbM10pOworICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMl0gPiAoaHBQcml2LT51c2JBY1NlbmRCeXRlc1swXSoyKSkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9BQzBfVFhPUCwgaHBQcml2LT50eG9wWzJdKTsKKyAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzFdID4gKGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMF0qMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzBfQ1csIGhwUHJpdi0+Y3dtaW5bMV0rKCh1MzJfdClocFByaXYtPmN3bWF4WzFdPDwxNikpOworICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhwUHJpdi0+c2xvdFR5cGUgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuZW5hYmxlRHJ2QkEgPT0wKSAvL01hcnZlbCBBUAorICAgICAgICAgICAgICAgICAgICYmIChocFByaXYtPmFnZ01heER1cmF0aW9uQkUgPiAyMDAwKSkgLy9CRSBUWE9QID4gMm1zCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMwX0NXLCAoaHBQcml2LT5jd21pblswXS8yKSsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMF08PDE2KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzBfQ1csIGhwUHJpdi0+Y3dtaW5bMF0rKCh1MzJfdClocFByaXYtPmN3bWF4WzBdPDwxNikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ29tcGVuc2F0aW9uIGZvciAyMHVzIHNsb3QgdGltZSAqLworICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgNTgrKCh1MzJfdClocFByaXYtPmN3bWF4WzBdPDwxNikpOworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzBfQ1csIGhwUHJpdi0+Y3dtaW5bMF0rKCh1MzJfdClocFByaXYtPmN3bWF4WzBdPDwxNikpOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIChaTV9TV19US0lQX0VOQ1JZX0VOfFpNX1NXX1dFUF9FTkNSWV9FTikpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9BQzBfVFhPUCwgaHBQcml2LT50eG9wWzBdKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9BQzBfVFhPUCwgMHgzMCk7CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaHBQcml2LT51c2JBY1NlbmRCeXRlc1szXSA9IDA7CisgICAgICAgIGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMl0gPSAwOworICAgICAgICBocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzFdID0gMDsKKyAgICAgICAgaHBQcml2LT51c2JBY1NlbmRCeXRlc1swXSA9IDA7CisgICAgfQorCisgICAgaWYgKHBvbGx1dGVkID09IDEpCisgICAgeworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyAqICAweDFkNDAwOCA6IEFIQiwgREFDLCBBREMgY2xvY2sgc2VsZWN0aW9uCisgKiAgICAgICAgICAgICBiaXQxfjAgIEFIQl9DTEsgOiBBSEIgY2xvY2sgc2VsZWN0aW9uLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAgOiBPU0MgNDBNSHo7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSA6IDIwTUh6IGluIEEgbW9kZSwgMjJNSHogaW4gRyBtb2RlOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgOiA0ME1IeiBpbiBBIG1vZGUsIDQ0TUh6IGluIEcgbW9kZTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIDogODBNSHogaW4gQSBtb2RlLCA4OE1IeiBpbiBHIG1vZGUuCisgKiAgICAgICAgICAgICBiaXQzfjIgIENMS19TRUwgOiBTZWxlY3QgdGhlIGNsb2NrIHNvdXJjZSBvZiBjbGsxNjAgaW4gQUREQUMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMCA6IFBMTCBkaXZpZGVyJ3Mgb3V0cHV0OworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEgOiBQTEwgZGl2aWRlcidzIG91dHB1dCBkaXZpZGVkIGJ5IDI7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCA6IFBMTCBkaXZpZGVyJ3Mgb3V0cHV0IGRpdmlkZWQgYnkgNDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIDogUkVGQ0xLIGZyb20gWFRBTE9TQ1BBRC4KKyAqLwordm9pZCB6ZlNlbEFkY0Nsayh6ZGV2X3QqIGRldiwgdThfdCBidzQwLCB1MzJfdCBmcmVxdWVuY3kpCit7CisgICAgaWYoYnc0MCA9PSAxKQorICAgIHsKKyAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQ0MDA4LCAweDczKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0RZTkFNSUNfU0lGU19BQ0ssIDB4MTBBKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQ0MDA4LCAweDcwKTsKKyAgICAgICAgaWYgKCBmcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19EWU5BTUlDX1NJRlNfQUNLLCAweDEwNSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRFlOQU1JQ19TSUZTX0FDSywgMHgxMDQpOworICAgICAgICB9CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorfQorCit1MzJfdCB6ZkhwRWNob0NvbW1hbmQoemRldl90KiBkZXYsIHUzMl90IHZhbHVlKQoreworICAgIHUzMl90IGNtZFsyXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDA4MDA0OworICAgIGNtZFsxXSA9IHZhbHVlOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fQ01EX0VDSE8sIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBaTV9EUlZfSU5JVF9VU0JfTU9ERQorCisjZGVmaW5lIFpNX1VTQl9VU19TVFJFQU1fTU9ERSAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgWk1fVVNCX1VTX1BBQ0tFVF9NT0RFICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBaTV9VU0JfRFNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFpNX1VTQl9VU19FTkFCTEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworI2RlZmluZSBaTV9VU0JfUlhfU1RSRUFNXzRLICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFpNX1VTQl9SWF9TVFJFQU1fOEsgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgWk1fVVNCX1JYX1NUUkVBTV8xNksgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBaTV9VU0JfUlhfU1RSRUFNXzMySyAgICAgICAgICAgICAgICAweDAwMDAwMDMwCisKKyNkZWZpbmUgWk1fVVNCX1RYX1NUUkVBTV9NT0RFICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorCisjZGVmaW5lIFpNX1VTQl9NT0RFX0NUUkxfUkVHICAgICAgICAgICAgICAgIDB4MDAxRTExMDgKKwordm9pZCB6ZkluaXRVc2JNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IG1vZGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogVE9ETzogU2V0IFVTQiBtb2RlIGJ5IHJlYWRpbmcgcmVnaXN0ZXJ5ICovCisgICAgbW9kZSA9IFpNX1VTQl9EU19FTkFCTEUgfCBaTV9VU0JfVVNfRU5BQkxFIHwgWk1fVVNCX1VTX1BBQ0tFVF9NT0RFOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9VU0JfTU9ERV9DVFJMX1JFRywgbW9kZSk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKyNlbmRpZgorCit2b2lkIHpmRHVtcEVlcEJhbmRFZGdlcyhzdHJ1Y3QgYXI1NDE2RWVwcm9tKiBlZXByb21JbWFnZSk7Cit2b2lkIHpmUHJpbnRUYXJnZXRQb3dlcjJHKHU4X3QqIHRQb3cyeENjaywgdThfdCogdFBvdzJ4MmcsIHU4X3QqIHRQb3cyeDJnSHQyMCwgdThfdCogdFBvdzJ4MmdIdDQwKTsKK3ZvaWQgemZQcmludFRhcmdldFBvd2VyNUcodThfdCogdFBvdzJ4NWcsIHU4X3QqIHRQb3cyeDVnSHQyMCwgdThfdCogdFBvdzJ4NWdIdDQwKTsKKworCitzMzJfdCB6ZkludGVycG9sYXRlRnVuYyhzMzJfdCB4LCBzMzJfdCB4MSwgczMyX3QgeTEsIHMzMl90IHgyLCBzMzJfdCB5MikKK3sKKyAgICBzMzJfdCB5OworCisgICAgaWYgKHkyID09IHkxKQorICAgIHsKKyAgICAgICAgeSA9IHkxOworICAgIH0KKyAgICBlbHNlIGlmICh4ID09IHgxKQorICAgIHsKKyAgICAgICAgeSA9IHkxOworICAgIH0KKyAgICBlbHNlIGlmICh4ID09IHgyKQorICAgIHsKKyAgICAgICAgeSA9IHkyOworICAgIH0KKyAgICBlbHNlIGlmICh4MiAhPSB4MSkKKyAgICB7CisgICAgICAgIHkgPSB5MSArICgoKHkyLXkxKSAqICh4LXgxKSkvKHgyLXgxKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHkgPSB5MTsKKyAgICB9CisKKyAgICByZXR1cm4geTsKK30KKworLy8jZGVmaW5lIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworLy8jZGVmaW5lIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworCisvKiB0aGUgdHggcG93ZXIgb2Zmc2V0IHdvcmthcm91bmQgZm9yIEFSVCB2cyBORElTL01ESyAqLworI2RlZmluZSBIQUxUWF9QT1dFUl9PRkZTRVQgICAgICAwCisKK3U4X3QgemZJbnRlcnBvbGF0ZUZ1bmNYKHU4X3QgeCwgdThfdCB4MSwgdThfdCB5MSwgdThfdCB4MiwgdThfdCB5MikKK3sKKyAgICBzMzJfdCB5OworICAgIHMzMl90IGluYzsKKworICAgICNkZWZpbmUgWk1fTVVMVElQTElFUiAgIDgKKyAgICB5ID0gemZJbnRlcnBvbGF0ZUZ1bmMoKHMzMl90KXg8PFpNX01VTFRJUExJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzMzJfdCl4MTw8Wk1fTVVMVElQTElFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHMzMl90KXkxPDxaTV9NVUxUSVBMSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoczMyX3QpeDI8PFpNX01VTFRJUExJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzMzJfdCl5Mjw8Wk1fTVVMVElQTElFUik7CisKKyAgICBpbmMgPSAoeSAmICgxPDwoWk1fTVVMVElQTElFUi0xKSkpID4+IChaTV9NVUxUSVBMSUVSLTEpOworICAgIHkgPSAoeSA+PiBaTV9NVUxUSVBMSUVSKSArIGluYzsKKyAgICAjdW5kZWYgWk1fTVVMVElQTElFUgorCisgICAgcmV0dXJuICh1OF90KXk7Cit9CisKK3U4X3QgemZHZXRJbnRlcnBvbGF0ZWRWYWx1ZSh1OF90IHgsIHU4X3QqIHhfYXJyYXksIHU4X3QqIHlfYXJyYXkpCit7CisgICAgczMyX3QgeTsKKyAgICB1MTZfdCB4SW5kZXg7CisKKyAgICBpZiAoeCA8PSB4X2FycmF5WzFdKQorICAgIHsKKyAgICAgICAgeEluZGV4ID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoeCA8PSB4X2FycmF5WzJdKQorICAgIHsKKyAgICAgICAgeEluZGV4ID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoeCA8PSB4X2FycmF5WzNdKQorICAgIHsKKyAgICAgICAgeEluZGV4ID0gMjsKKyAgICB9CisgICAgZWxzZSAvLyh4ID4geF9hcnJheVszXSkKKyAgICB7CisgICAgICAgIHhJbmRleCA9IDM7CisgICAgfQorCisgICAgeSA9IHpmSW50ZXJwb2xhdGVGdW5jWCh4LAorICAgICAgICAgICAgeF9hcnJheVt4SW5kZXhdLAorICAgICAgICAgICAgeV9hcnJheVt4SW5kZXhdLAorICAgICAgICAgICAgeF9hcnJheVt4SW5kZXgrMV0sCisgICAgICAgICAgICB5X2FycmF5W3hJbmRleCsxXSk7CisKKyAgICByZXR1cm4gKHU4X3QpeTsKK30KKwordThfdCB6ZkZpbmRGcmVxSW5kZXgodThfdCBmLCB1OF90KiBmQXJyYXksIHU4X3QgZkFycmF5U2l6ZSkKK3sKKyAgICB1OF90IGk7CisjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoImY9JWQgIiwgZik7CisgICAgZm9yIChpPTA7IGk8ZkFycmF5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiVkICIsIGZBcnJheVtpXSk7CisgICAgfQorICAgIERiZ1ByaW50KCJcbiIpOworI2VuZGlmCisgICAgaT1mQXJyYXlTaXplLTI7CisgICAgd2hpbGUoMSkKKyAgICB7CisgICAgICAgIGlmIChmID49IGZBcnJheVtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorfQorCisKKworCit2b2lkIHpmSW5pdFBvd2VyQ2FsKHpkZXZfdCogZGV2KQoreworICAgIC8vUHJvZ3JhbSBQSFkgVHggcG93ZXIgcmVsYXRpdmVzIHJlZ2lzdGVycworI2RlZmluZSB6bV93cml0ZV9waHlfcmVnKGNyLCB2YWwpIHJlZ193cml0ZSgoY3IqNCkrMHg5ODAwLCB2YWwpCisKKyAgICB6bV93cml0ZV9waHlfcmVnKDc5LCAweDdmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDc3LCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDc4LCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDY1MywgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg2NTQsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzM5LCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDc0MCwgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3NTUsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzU2LCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDc1NywgMHgzZjNmM2YzZik7CisKKyN1bmRlZiB6bV93cml0ZV9waHlfcmVnCit9CisKKworCit2b2lkIHpmUHJpbnRUcCh1OF90KiBwd3IwLCB1OF90KiB2cGQwLCB1OF90KiBwd3IxLCB1OF90KiB2cGQxKQoreworICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgicHdyMCA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgcHdyMFswXSwgcHdyMFsxXSwgcHdyMFsyXSwgcHdyMFszXSwgcHdyMFs0XSk7CisgICAgRGJnUHJpbnQoInZwZDAgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHZwZDBbMF0sIHZwZDBbMV0sIHZwZDBbMl0sIHZwZDBbM10sIHZwZDBbNF0pOworICAgIERiZ1ByaW50KCJwd3IxIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCBwd3IxWzBdLCBwd3IxWzFdLCBwd3IxWzJdLCBwd3IxWzNdLCBwd3IxWzRdKTsKKyAgICBEYmdQcmludCgidnBkMSA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgdnBkMVswXSwgdnBkMVsxXSwgdnBkMVsyXSwgdnBkMVszXSwgdnBkMVs0XSk7CisgICAgI2VuZGlmCit9CisKKworLyoKKyAqIFRvIGZpbmQgQ1RMIGluZGV4KDB+MjMpCisgKiByZXR1cm4gMjQoQVI1NDE2X05VTV9DVExTKT0+bm8gZGVzaXJlZCBpbmRleCBmb3VuZAorICovCit1OF90IHpmRmluZEN0bEVkZ2VzSW5kZXgoemRldl90KiBkZXYsIHU4X3QgZGVzaXJlZF9DdGxJbmRleCkKK3sKKyAgICB1OF90IGk7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY7CisgICAgc3RydWN0IGFyNTQxNkVlcHJvbSogZWVwcm9tSW1hZ2U7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgZWVwcm9tSW1hZ2UgPSAoc3RydWN0IGFyNTQxNkVlcHJvbSopJihocFByaXYtPmVlcHJvbUltYWdlWygxMDI0KzUxMikvNF0pOworCisgICAgLy9mb3IgKGkgPSAwOyAoaSA8IEFSNTQxNl9OVU1fQ1RMUykgJiYgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2ldOyBpKyspCisgICAgZm9yIChpID0gMDsgaSA8IEFSNTQxNl9OVU1fQ1RMUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoZGVzaXJlZF9DdGxJbmRleCA9PSBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZmJpbjJmcmVxCisgKgorICogR2V0IGNoYW5uZWwgdmFsdWUgZnJvbSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaGVsZCBpbiBlZXByb20KKyAqIFJFVFVSTlM6IHRoZSBmcmVxdWVuY3kgaW4gTUh6CisgKi8KK3UzMl90CitmYmluMmZyZXEodThfdCBmYmluLCB1OF90IGlzMkdIeikKK3sKKyAgICAvKgorICAgICAqIFJlc2VydmVkIHZhbHVlIDB4RkYgcHJvdmlkZXMgYW4gZW1wdHkgZGVmaW5pdGlvbiBib3RoIGFzCisgICAgICogYW4gZmJpbiBhbmQgYXMgYSBmcmVxdWVuY3kgLSBkbyBub3QgY29udmVydAorICAgICAqLworICAgIGlmIChmYmluID09IEFSNTQxNl9CQ0hBTl9VTlVTRUQpIHsKKyAgICAgICAgcmV0dXJuIGZiaW47CisgICAgfQorCisgICAgcmV0dXJuICh1MzJfdCkoKGlzMkdIej09MSkgPyAoMjMwMCArIGZiaW4pIDogKDQ4MDAgKyA1ICogZmJpbikpOworfQorCisKK3U4X3QgemZHZXRNYXhFZGdlUG93ZXIoemRldl90KiBkZXYsIENBTF9DVExfRURHRVMgKnBDdGxFZGdlcywgdTMyX3QgZnJlcSkKK3sKKyAgICB1OF90IGk7CisgICAgdThfdCBtYXhFZGdlUG93ZXI7CisgICAgdThfdCBpczJHSHo7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY7CisgICAgc3RydWN0IGFyNTQxNkVlcHJvbSogZWVwcm9tSW1hZ2U7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgZWVwcm9tSW1hZ2UgPSAoc3RydWN0IGFyNTQxNkVlcHJvbSopJihocFByaXYtPmVlcHJvbUltYWdlWygxMDI0KzUxMikvNF0pOworCisgICAgaWYoZnJlcSA+IFpNX0NIX0dfMTQpCisgICAgICAgIGlzMkdIeiA9IDA7CisgICAgZWxzZQorICAgICAgICBpczJHSHogPSAxOworCisgICAgbWF4RWRnZVBvd2VyID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworCisgICAgLyogR2V0IHRoZSBlZGdlIHBvd2VyICovCisgICAgZm9yIChpID0gMDsgKGkgPCBBUjU0MTZfTlVNX0JBTkRfRURHRVMpICYmIChwQ3RsRWRnZXNbaV0uYkNoYW5uZWwgIT0gQVI1NDE2X0JDSEFOX1VOVVNFRCkgOyBpKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGVyZSdzIGFuIGV4YWN0IGNoYW5uZWwgbWF0Y2ggb3IgYW4gaW5iYW5kIGZsYWcgc2V0CisgICAgICAgICAqIG9uIHRoZSBsb3dlciBjaGFubmVsIHVzZSB0aGUgZ2l2ZW4gcmRFZGdlUG93ZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChmcmVxID09IGZiaW4yZnJlcShwQ3RsRWRnZXNbaV0uYkNoYW5uZWwsIGlzMkdIeikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heEVkZ2VQb3dlciA9IHBDdGxFZGdlc1tpXS50UG93ZXI7CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJ6ZkdldE1heEVkZ2VQb3dlciBpbmRleCBpID0gJWQgXG4iLCBpKSk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChpID4gMCkgJiYgKGZyZXEgPCBmYmluMmZyZXEocEN0bEVkZ2VzW2ldLmJDaGFubmVsLCBpczJHSHopKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZiaW4yZnJlcShwQ3RsRWRnZXNbaSAtIDFdLmJDaGFubmVsLCBpczJHSHopIDwgZnJlcSAmJiBwQ3RsRWRnZXNbaSAtIDFdLmZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF4RWRnZVBvd2VyID0gcEN0bEVkZ2VzW2kgLSAxXS50UG93ZXI7CisgICAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgICAgIHptX2RiZygoInpmR2V0TWF4RWRnZVBvd2VyIGluZGV4IGktMSA9ICVkIFxuIiwgaS0xKSk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBMZWF2ZSBsb29wIC0gbm8gbW9yZSBhZmZlY3RpbmcgZWRnZXMgcG9zc2libGUgaW4gdGhpcyBtb25vdG9uaWMgaW5jcmVhc2luZyBsaXN0ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYoIGkgPT0gQVI1NDE2X05VTV9CQU5EX0VER0VTICkKKyAgICB7CisgICAgICAgIGlmIChmcmVxID4gZmJpbjJmcmVxKHBDdGxFZGdlc1tpIC0gMV0uYkNoYW5uZWwsIGlzMkdIeikgJiYgcEN0bEVkZ2VzW2kgLSAxXS5mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBtYXhFZGdlUG93ZXIgPSBwQ3RsRWRnZXNbaSAtIDFdLnRQb3dlcjsKKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoInpmR2V0TWF4RWRnZVBvd2VyIGluZGV4PT5pLTEgPSAlZCBcbiIsIGktMSkpOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bV9hc3NlcnQobWF4RWRnZVBvd2VyID4gMCk7CisKKyAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgIGlmICggbWF4RWRnZVBvd2VyID09IEFSNTQxNl9NQVhfUkFURV9QT1dFUiApCisgICAgeworICAgICAgICB6bV9kYmcoKCJ6ZkdldE1heEVkZ2VQb3dlciA9ICVkICEhIVxuIiwgQVI1NDE2X01BWF9SQVRFX1BPV0VSKSk7CisgICAgfQorICAjZW5kaWYKKyAgICByZXR1cm4gbWF4RWRnZVBvd2VyOworfQorCit1MzJfdCB6ZkFkanVzdEhUNDBGcmVxT2Zmc2V0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwgdThfdCBleHRPZmZzZXQpCit7CisgICAgdTMyX3QgbmV3RnJlcSA9IGZyZXF1ZW5jeTsKKworCWlmIChidzQwID09IDEpCisJeworICAgICAgICBpZiAoZXh0T2Zmc2V0ID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld0ZyZXEgKz0gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBuZXdGcmVxIC09IDEwOworICAgICAgICB9CisJfQorCXJldHVybiBuZXdGcmVxOworfQorCit1MzJfdCB6ZkhwQ2hlY2tEb0hlYXZ5Q2xpcCh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcSwgQ0FMX0NUTF9FREdFUyAqcEN0bEVkZ2VzLCB1OF90IGJ3NDApCit7CisgICAgdTMyX3QgcmV0ID0gMDsKKyAgICB1OF90IGk7CisgICAgdThfdCBpczJHSHo7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgaWYoZnJlcSA+IFpNX0NIX0dfMTQpCisgICAgICAgIGlzMkdIeiA9IDA7CisgICAgZWxzZQorICAgICAgICBpczJHSHogPSAxOworCisgICAgLyogSFQ0MCBmb3JjZSBlbmFibGUgaGVhdnkgY2xpcCAqLworICAgIGlmIChidzQwKQorICAgIHsKKyAgICAgICAgcmV0IHw9IDB4ZjA7CisgICAgfQorI2lmIDEKKyAgICAvKiBIVDIwIDogZnJlcXVlbmN5IGJhbmRlZGdlICovCisgICAgZm9yIChpID0gMDsgKGkgPCBBUjU0MTZfTlVNX0JBTkRfRURHRVMpICYmIChwQ3RsRWRnZXNbaV0uYkNoYW5uZWwgIT0gQVI1NDE2X0JDSEFOX1VOVVNFRCkgOyBpKyspCisgICAgeworICAgICAgICBpZiAoZnJlcSA9PSBmYmluMmZyZXEocEN0bEVkZ2VzW2ldLmJDaGFubmVsLCBpczJHSHopKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEN0bEVkZ2VzW2ldLmZsYWcgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgfD0gMHhmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByZXQ7Cit9CisKKwordm9pZCB6ZlNldFBvd2VyQ2FsVGFibGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLCB1OF90IGV4dE9mZnNldCkKK3sKKyAgICBzdHJ1Y3QgYXI1NDE2RWVwcm9tKiBlZXByb21JbWFnZTsKKyAgICB1OF90IHB3cjBbNV07CisgICAgdThfdCBwd3IxWzVdOworICAgIHU4X3QgdnBkMFs1XTsKKyAgICB1OF90IHZwZDFbNV07CisgICAgdThfdCB2cGRfY2hhaW4xWzEyOF07CisgICAgdThfdCB2cGRfY2hhaW4zWzEyOF07CisgICAgdTE2X3QgYm91bmRhcnkxID0gMTg7IC8vQ1IgNjY3CisgICAgdTE2X3QgcG93ZXJUeE1heCA9IDYzOyAvL0NSIDc5CisgICAgdThfdCBpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2OworICAgIHU4X3QgZmJpbjsKKyAgICB1OF90IGluZGV4LCBtYXgyZ0luZGV4LCBtYXg1Z0luZGV4OworICAgIHU4X3QgY2hhaW4wcHdyUGRnMFs1XTsKKyAgICB1OF90IGNoYWluMHZwZFBkZzBbNV07CisgICAgdThfdCBjaGFpbjBwd3JQZGcxWzVdOworICAgIHU4X3QgY2hhaW4wdnBkUGRnMVs1XTsKKyAgICB1OF90IGNoYWluMnB3clBkZzBbNV07CisgICAgdThfdCBjaGFpbjJ2cGRQZGcwWzVdOworICAgIHU4X3QgY2hhaW4ycHdyUGRnMVs1XTsKKyAgICB1OF90IGNoYWluMnZwZFBkZzFbNV07CisgICAgdThfdCBmYmluQXJyYXlbOF07CisKKyAgICAvKiA0IENUTCAqLworICAgIHU4X3QgY3RsX2k7CisgICAgdThfdCBkZXNpcmVkX0N0bEluZGV4OworCisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyQ0NLID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworICAgIHU4X3QgY3RsRWRnZXNNYXhQb3dlcjJHID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworICAgIHU4X3QgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyNUcgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyNUdIVDIwID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworICAgIHU4X3QgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKworICAgIHU4X3QgY3RsT2Zmc2V0OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIGVlcHJvbUltYWdlID0gKHN0cnVjdCBhcjU0MTZFZXByb20qKSYoaHBQcml2LT5lZXByb21JbWFnZVsoMTAyNCs1MTIpLzRdKTsKKworICAgIC8vIENoZWNrIHRoZSB0b3RhbCBieXRlcyBvZiB0aGUgRUVQUk9NIHN0cnVjdHVyZSB0byBzZWUgdGhlIGRvbmdsZSBoYXZlIGJlZW4gY2FsaWJyYXRlZCBvciBub3QuCisgICAgaWYgKGVlcHJvbUltYWdlLT5iYXNlRWVwSGVhZGVyLmxlbmd0aCA9PSAweGZmZmYpCisgICAgeworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgIHptX2RiZygoIldhcm5pbmchIFRoaXMgZG9uZ2xlIG5vdCBiZWVuIGNhbGlicmF0ZWRcbiIpKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoIi0tLS0temZTZXRQb3dlckNhbFRhYmxlIDogZnJlcXVlbmN5PSVkLS0tLS1cbiIsIGZyZXF1ZW5jeSk7CisgICAgI2VuZGlmCisgICAgLyogVE9ETyA6IDEuIGJvdW5kYXJ5MSBhbmQgcG93ZXJUeE1heCBzaG91bGQgYmUgcmVmZXJlZCB0byBDUjY2NyBhbmQgQ1I3OSAqLworICAgIC8qICAgICAgICAgICBpbiBvdHVzLmluaSBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAvKiAyLiBJbnRlcnBvbGF0ZSBwd3IgYW5kIHZwZCB0ZXN0IHBvaW50cyBmcm9tIGZyZXF1ZW5jeSAqLworICAgIERiZ1ByaW50KCJjYWxGcmVxUGllcjVHIDogJWQsICVkLCAlZCwgJWQgLCVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1swXSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzFdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbMl0qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1szXSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzRdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbNV0qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1s2XSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzddKjUrNDgwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIERiZ1ByaW50KCJjYWxGcmVxUGllcjJHIDogJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHWzBdKzIzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHWzFdKzIzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHWzJdKzIzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHWzNdKzIzMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAjZW5kaWYKKyAgICBpZiAoZnJlcXVlbmN5IDwgMzAwMCkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2ldID09IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWF4MmdJbmRleCA9IGk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIm1heDJnSW5kZXggOiAlZFxuIiwgbWF4MmdJbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmYmluID0gKHU4X3QpKGZyZXF1ZW5jeSAtIDIzMDApOworICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyRywgbWF4MmdJbmRleCk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjJHIGluZGV4IDogJWRcbiIsIGluZGV4KTsKKyAgICAgICAgRGJnUHJpbnQoImNoYWluIDAgaW5kZXhcbiIpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgemZQcmludFRwKCZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0ucHdyUGRnWzBdWzBdLAorICAgICAgICAgICAgICAgICAgJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS52cGRQZGdbMF1bMF0sCisgICAgICAgICAgICAgICAgICAmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnB3clBkZ1sxXVswXSwKKyAgICAgICAgICAgICAgICAgICZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0udnBkUGRnWzFdWzBdCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCJjaGFpbiAwIGluZGV4KzFcbiIpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgemZQcmludFRwKCZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS5wd3JQZGdbMF1bMF0sCisgICAgICAgICAgICAgICAgICAmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0udnBkUGRnWzBdWzBdLAorICAgICAgICAgICAgICAgICAgJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnB3clBkZ1sxXVswXSwKKyAgICAgICAgICAgICAgICAgICZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS52cGRQZGdbMV1bMF0KKyAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFpbjBwd3JQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnB3clBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnB3clBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4wdnBkUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS52cGRQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS52cGRQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMHB3clBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0ucHdyUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0ucHdyUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjB2cGRQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnZwZFBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnZwZFBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBjaGFpbjJwd3JQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXhdLnB3clBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4KzFdLnB3clBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4ydnBkUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4XS52cGRQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleCsxXS52cGRQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMnB3clBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleF0ucHdyUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXgrMV0ucHdyUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjJ2cGRQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXhdLnZwZFBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4KzFdLnZwZFBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2ldID09IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWF4NWdJbmRleCA9IGk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIm1heDVnSW5kZXggOiAlZFxuIiwgbWF4NWdJbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmYmluID0gKHU4X3QpKChmcmVxdWVuY3kgLSA0ODAwKS81KTsKKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoZmJpbiwgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUcsIG1heDVnSW5kZXgpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCI1RyBpbmRleCA6ICVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2hhaW4wcHdyUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4XS5wd3JQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleCsxXS5wd3JQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMHZwZFBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleF0udnBkUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXgrMV0udnBkUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjBwd3JQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXhdLnB3clBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4KzFdLnB3clBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4wdnBkUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4XS52cGRQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleCsxXS52cGRQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgY2hhaW4ycHdyUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4XS5wd3JQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleCsxXS5wd3JQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMnZwZFBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleF0udnBkUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXgrMV0udnBkUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjJwd3JQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXhdLnB3clBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4KzFdLnB3clBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4ydnBkUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4XS52cGRQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleCsxXS52cGRQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKiBDaGFpbiAxICovCisgICAgLyogR2V0IHB3ciBhbmQgdnBkIHRlc3QgcG9pbnRzIGZyb20gZnJlcXVlbmN5ICovCisgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgIHsKKyAgICAgICAgcHdyMFtpXSA9IGNoYWluMHB3clBkZzBbaV0+PjE7CisgICAgICAgIHZwZDBbaV0gPSBjaGFpbjB2cGRQZGcwW2ldOworICAgICAgICBwd3IxW2ldID0gY2hhaW4wcHdyUGRnMVtpXT4+MTsKKyAgICAgICAgdnBkMVtpXSA9IGNoYWluMHZwZFBkZzFbaV07CisgICAgfQorICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgiVGVzdCBQb2ludHNcbiIpOworICAgIERiZ1ByaW50KCJwd3IwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCBwd3IwWzBdLCBwd3IwWzFdLCBwd3IwWzJdLCBwd3IwWzNdLCBwd3IwWzRdKTsKKyAgICBEYmdQcmludCgidnBkMCA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgdnBkMFswXSwgdnBkMFsxXSwgdnBkMFsyXSwgdnBkMFszXSwgdnBkMFs0XSk7CisgICAgRGJnUHJpbnQoInB3cjEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjFbMF0sIHB3cjFbMV0sIHB3cjFbMl0sIHB3cjFbM10sIHB3cjFbNF0pOworICAgIERiZ1ByaW50KCJ2cGQxIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQxWzBdLCB2cGQxWzFdLCB2cGQxWzJdLCB2cGQxWzNdLCB2cGQxWzRdKTsKKyAgICAjZW5kaWYKKyAgICAvKiBHZW5lcmF0ZSB0aGUgdnBkIGFycmF5cyAqLworICAgIGZvciAoaT0wOyBpPGJvdW5kYXJ5MSsxKzY7IGkrKykKKyAgICB7CisgICAgICAgIHZwZF9jaGFpbjFbaV0gPSB6ZkdldEludGVycG9sYXRlZFZhbHVlKGksICZwd3IwWzBdLCAmdnBkMFswXSk7CisgICAgfQorICAgIGZvciAoOyBpPHBvd2VyVHhNYXgrMSs2KzY7IGkrKykKKyAgICB7CisgICAgICAgIHZwZF9jaGFpbjFbaV0gPSB6ZkdldEludGVycG9sYXRlZFZhbHVlKGktNi02LCAmcHdyMVswXSwgJnZwZDFbMF0pOworICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoInZwZF9jaGFpbjFcbiIpOworICAgIGZvciAoaT0wOyBpPHBvd2VyVHhNYXgrMSs2KzY7IGkrPTEwKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiVkLCAlZCwgJWQsICVkICwlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgICAgIHZwZF9jaGFpbjFbaSswXSwgdnBkX2NoYWluMVtpKzFdLCB2cGRfY2hhaW4xW2krMl0sIHZwZF9jaGFpbjFbaSszXSwgdnBkX2NoYWluMVtpKzRdLAorICAgICAgICAgICAgICAgIHZwZF9jaGFpbjFbaSs1XSwgdnBkX2NoYWluMVtpKzZdLCB2cGRfY2hhaW4xW2krN10sIHZwZF9jaGFpbjFbaSs4XSwgdnBkX2NoYWluMVtpKzldKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgLyogV3JpdGUgUEhZIHJlZ3MgNjcyLTcwMyAqLworICAgIGZvciAoaT0wOyBpPDEyODsgaSs9NCkKKyAgICB7CisgICAgICAgIHUzMl90IHJlZ0FkZHIgPSAweDk4MDAgKyAoNjcyICogNCk7CisgICAgICAgIHUzMl90IHZhbDsKKworICAgICAgICB2YWwgPSAoKHUzMl90KXZwZF9jaGFpbjFbaSszXTw8MjQpIHwKKyAgICAgICAgICAgICAgICAoKHUzMl90KXZwZF9jaGFpbjFbaSsyXTw8MTYpIHwKKyAgICAgICAgICAgICAgICAoKHUzMl90KXZwZF9jaGFpbjFbaSsxXTw8OCkgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluMVtpXSk7CisKKyAgICAgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgcmVnX3dyaXRlKHJlZ0FkZHIgKyBpLCB2YWwpOyAgLyogQ1I2NzIgKi8KKyAgICAgICAgI2VuZGlmCisgICAgfQorCisgICAgLyogQ2hhaW4gMiAqLworICAgIC8qIEdldCBwd3IgYW5kIHZwZCB0ZXN0IHBvaW50cyBmcm9tIGZyZXF1ZW5jeSAqLworICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICB7CisgICAgICAgIHB3cjBbaV0gPSBjaGFpbjJwd3JQZGcwW2ldPj4xOworICAgICAgICB2cGQwW2ldID0gY2hhaW4ydnBkUGRnMFtpXTsKKyAgICAgICAgcHdyMVtpXSA9IGNoYWluMnB3clBkZzFbaV0+PjE7CisgICAgICAgIHZwZDFbaV0gPSBjaGFpbjJ2cGRQZGcxW2ldOworICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoIlRlc3QgUG9pbnRzXG4iKTsKKyAgICBEYmdQcmludCgicHdyMCA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgcHdyMFswXSwgcHdyMFsxXSwgcHdyMFsyXSwgcHdyMFszXSwgcHdyMFs0XSk7CisgICAgRGJnUHJpbnQoInZwZDAgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHZwZDBbMF0sIHZwZDBbMV0sIHZwZDBbMl0sIHZwZDBbM10sIHZwZDBbNF0pOworICAgIERiZ1ByaW50KCJwd3IxIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCBwd3IxWzBdLCBwd3IxWzFdLCBwd3IxWzJdLCBwd3IxWzNdLCBwd3IxWzRdKTsKKyAgICBEYmdQcmludCgidnBkMSA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgdnBkMVswXSwgdnBkMVsxXSwgdnBkMVsyXSwgdnBkMVszXSwgdnBkMVs0XSk7CisgICAgI2VuZGlmCisgICAgLyogR2VuZXJhdGUgdGhlIHZwZCBhcnJheXMgKi8KKyAgICBmb3IgKGk9MDsgaTxib3VuZGFyeTErMSs2OyBpKyspCisgICAgeworICAgICAgICB2cGRfY2hhaW4zW2ldID0gemZHZXRJbnRlcnBvbGF0ZWRWYWx1ZShpLCAmcHdyMFswXSwgJnZwZDBbMF0pOworICAgIH0KKyAgICBmb3IgKDsgaTxwb3dlclR4TWF4KzErNis2OyBpKyspCisgICAgeworICAgICAgICB2cGRfY2hhaW4zW2ldID0gemZHZXRJbnRlcnBvbGF0ZWRWYWx1ZShpLTYtNiwgJnB3cjFbMF0sICZ2cGQxWzBdKTsKKyAgICB9CisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJ2cGRfY2hhaW4zXG4iKTsKKyAgICBmb3IgKGk9MDsgaTxwb3dlclR4TWF4KzErNis2OyBpKz0xMCkKKyAgICB7CisgICAgICAgIERiZ1ByaW50KCIlZCwgJWQsICVkLCAlZCAsJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgICAgICB2cGRfY2hhaW4zW2krMF0sIHZwZF9jaGFpbjNbaSsxXSwgdnBkX2NoYWluM1tpKzJdLCB2cGRfY2hhaW4zW2krM10sIHZwZF9jaGFpbjNbaSs0XSwKKyAgICAgICAgICAgICAgICB2cGRfY2hhaW4zW2krNV0sIHZwZF9jaGFpbjNbaSs2XSwgdnBkX2NoYWluM1tpKzddLCB2cGRfY2hhaW4zW2krOF0sIHZwZF9jaGFpbjNbaSs5XSk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyogV3JpdGUgUEhZIHJlZ3MgNjcyLTcwMyArIDB4MTAwMCAqLworICAgIGZvciAoaT0wOyBpPDEyODsgaSs9NCkKKyAgICB7CisgICAgICAgIHUzMl90IHJlZ0FkZHIgPSAweDk4MDAgKyAoNjcyICogNCkgKyAweDEwMDA7CisgICAgICAgIHUzMl90IHZhbDsKKworICAgICAgICB2YWwgPSAoKHUzMl90KXZwZF9jaGFpbjNbaSszXTw8MjQpIHwKKyAgICAgICAgICAgICAgICAoKHUzMl90KXZwZF9jaGFpbjNbaSsyXTw8MTYpIHwKKyAgICAgICAgICAgICAgICAoKHUzMl90KXZwZF9jaGFpbjNbaSsxXTw8OCkgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluM1tpXSk7CisKKyAgICAgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgcmVnX3dyaXRlKHJlZ0FkZHIgKyBpLCB2YWwpOyAgLyogQ1I2NzIgKi8KKyAgICAgICAgI2VuZGlmCisgICAgfQorCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIC8qIDMuIEdlbmVyYXRlIHRhcmdldCBwb3dlciB0YWJsZSAqLworICAgIGlmIChmcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2ldLmJDaGFubmVsICE9IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmJpbkFycmF5W2ldID0gZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoZmJpbiwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiQ0NLIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4Q2NrW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlckNja1tpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlckNja1tpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXJDY2tbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlckNja1tpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHW2ldLmJDaGFubmVsICE9IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmJpbkFycmF5W2ldID0gZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCIyRyBpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaW5kZXhdLnRQb3cyeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDIwW2ldLmJDaGFubmVsICE9IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmJpbkFycmF5W2ldID0gZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDIwW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoZmJpbiwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiMkcgSFQyMCBpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaW5kZXhdLnRQb3cyeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDIwW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUNDBbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUNDBbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleCggKHU4X3QpemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZiaW4sIGJ3NDAsIGV4dE9mZnNldCksIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjJHIEhUNDAgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goCisgICAgICAgICAgICAgICAgICAgICh1OF90KXpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoZGV2LCBmYmluLCBidzQwLCBleHRPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUNDBbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUNDBbaW5kZXhdLnRQb3cyeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDQwW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUNDBbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICB6ZlByaW50VGFyZ2V0UG93ZXIyRyhocFByaXYtPnRQb3cyeENjaywKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogNUcgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjVHIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUMjBbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUMjBbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCI1RyBIVDIwIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDIwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUMjBbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQ0MFtpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQ0MFtpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KCh1OF90KXpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoZGV2LCBmYmluLCBidzQwLCBleHRPZmZzZXQpLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCI1RyBIVDQwIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDQwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKAorICAgICAgICAgICAgICAgICAgICAodThfdCl6ZkFkanVzdEhUNDBGcmVxT2Zmc2V0KGRldiwgZmJpbiwgYnc0MCwgZXh0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQ0MFtpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgemZQcmludFRhcmdldFBvd2VyNUcoCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1ZywKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQyMCwKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQ0MCk7CisgICAgfQorCisKKworICAgIC8qIDQuIENUTCAqLworICAgIC8qCisgICAgICogNC4xIEdldCB0aGUgYmFuZGVkZ2VzIHR4IHBvd2VyIGJ5IGZyZXF1ZW5jeQorICAgICAqICAgICAgMi40RyB3ZSBnZXQgY3RsRWRnZXNNYXhQb3dlckNDSworICAgICAqICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHCisgICAgICogICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDIwCisgICAgICogICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDQwCisgICAgICogICAgICA1RyB3ZSBnZXQgICBjdGxFZGdlc01heFBvd2VyNUcKKyAgICAgKiAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAKKyAgICAgKiAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAKKyAgICAgKiA0LjIgVXBkYXRlICgzLikgdGFyZ2V0IHBvd2VyIHRhYmxlIGJ5IDQuMQorICAgICAqIDQuMyBUeCBwb3dlciBvZmZzZXQgZm9yIEFSVCAtIE5ESVMvTURLCisgICAgICogNC40IFdyaXRlIE1BQyByZWcgMHg2OTQgZm9yIEFDSydzIFRQQworICAgICAqCisgICAgICovCisKKyAgICAvL3pmRHVtcEVlcEJhbmRFZGdlcyhlZXByb21JbWFnZSk7CisKKyAgICAvKiBnZXQgdGhlIGNmZyBmcm9tIEVlcHJvbTogcmVnaW9uQ29kZSA9PiBSZWd1bGF0b3J5RG9tYWluIDogMHgxMC1GRkMgIDB4MzAtZXUgMHg0MC1qYXAgKi8KKyAgICBkZXNpcmVkX0N0bEluZGV4ID0gemZIcEdldFJlZ3VsYXRvcnlEb21haW4oZGV2KTsKKyAgICBpZiAoKGRlc2lyZWRfQ3RsSW5kZXggPT0gMHgzMCkgfHwgKGRlc2lyZWRfQ3RsSW5kZXggPT0gMHg0MCkgfHwgKGRlc2lyZWRfQ3RsSW5kZXggPT0gMHgwKSkKKyAgICB7CisgICAgICAgIC8qIHNraXAgQ1RMIGFuZCBoZWF2eSBjbGlwICovCisgICAgICAgIGhwUHJpdi0+ZW5hYmxlQkJIZWF2eUNsaXAgPSAwOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgIHptX2RiZygoIlJlZ3VsYXRvcnlEb21haW4gPSAwLCBza2lwIENUTCBhbmQgaGVhdnkgY2xpcFxuIikpOworICAgICAgICAjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaHBQcml2LT5lbmFibGVCQkhlYXZ5Q2xpcCA9IDE7CisKKyAgICAgICAgaWYgKGRlc2lyZWRfQ3RsSW5kZXggPT0gMHhmZikKKyAgICAgICAgeworICAgICAgICAgICAgLyogZGVzaXJlZCBpbmRleCBub3QgZm91bmQgKi8KKyAgICAgICAgICAgIGRlc2lyZWRfQ3RsSW5kZXggPSAweDEwOworICAgICAgICB9CisKKyAgICAgICAgLyogZmlyc3QgcGFydCA6IDIuNEcgKi8KKyAgICAgICAgaWYgKGZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHIC0gQ1RMXzExQiAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMTFCKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyQ0NLID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJDVExfMTFCIGN0bF9pID0gJWRcbiIsIGN0bF9pKSk7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogMi40RyAtIENUTF8xMUcgKi8KKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzExRyk7CisgICAgICAgICAgICBpZihjdGxfaTxBUjU0MTZfTlVNX0NUTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJDVExfMTFHIGN0bF9pID0gJWRcbiIsIGN0bF9pKSk7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogMi40RyAtIENUTF8yR0hUMjAgKi8KKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzJHSFQyMCk7CisgICAgICAgICAgICBpZihjdGxfaTxBUjU0MTZfTlVNX0NUTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIG5vIGRhdGEgaW4gRWVwcm9tLCByZXBsYWNlIGJ5IG5vcm1hbCAyRyAqLworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAgPSBjdGxFZGdlc01heFBvd2VyMkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJDVExfMkdIVDIwIGN0bF9pID0gJWRcbiIsIGN0bF9pKSk7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogMi40RyAtIENUTF8yR0hUNDAgKi8KKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzJHSFQ0MCk7CisgICAgICAgICAgICBpZihjdGxfaTxBUjU0MTZfTlVNX0NUTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIG5vIGRhdGEgaW4gRWVwcm9tLCByZXBsYWNlIGJ5IG5vcm1hbCAyRyAqLworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAgPSBjdGxFZGdlc01heFBvd2VyMkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJDVExfMkdIVDQwIGN0bF9pID0gJWRcbiIsIGN0bF9pKSk7CisgICAgICAgICAgICAjZW5kaWYKKworCisgICAgICAgICAgICAvKiA3YTE3IDogICovCisgICAgICAgICAgICAvKiBNYXggcG93ZXIgKGRCbSkgZm9yIGNoYW5uZWwgcmFuZ2Ugd2hlbiB1c2luZyBERlMgZGVmaW5lIGJ5IG1hZHdpZmkqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8d2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoemZIcElzRGZzQ2hhbm5lbChkZXYsICh1MTZfdClmcmVxdWVuY3kpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJmcmVxdWVuY3kgdXNlIERGUyAgLS0gIiwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXJDQ0sgICAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXJDQ0ssIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkcgICAgICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyMkcsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDIwICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyMkdIVDIwLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEFwcGx5IGN0bCBtb2RlIHRvIGNvcnJlY3QgdGFyZ2V0IHBvd2VyIHNldCAqLworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY3RsRWRnZXNNYXhQb3dlckNDSyAgICA9ICIsIGN0bEVkZ2VzTWF4UG93ZXJDQ0spOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY3RsRWRnZXNNYXhQb3dlcjJHICAgICA9ICIsIGN0bEVkZ2VzTWF4UG93ZXIyRyk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyMkdIVDIwID0gIiwgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyMkdIVDQwID0gIiwgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeENja1tpXSA9IHptX21pbihocFByaXYtPnRQb3cyeENja1tpXSwgY3RsRWRnZXNNYXhQb3dlckNDSykgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnMjRIZWF2eUNsaXBPZmZzZXQgPSAwOworICAgICAgICAgICAgaWYgKGhwUHJpdi0+ZW5hYmxlQkJIZWF2eUNsaXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsT2Zmc2V0ID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxPZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKGZyZXF1ZW5jeSA9PSAyNDEyKSB8fCAoZnJlcXVlbmN5ID09IDI0NjIpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ1tpXSwgY3RsRWRnZXNNYXhQb3dlcjJHLWN0bE9mZnNldCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyRykgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT50UG93MngyZ1tpXSA+IChjdGxFZGdlc01heFBvd2VyMkctY3RsT2Zmc2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnMjRIZWF2eUNsaXBPZmZzZXQgPSBocFByaXYtPnRQb3cyeDJnW2ldIC0gKGN0bEVkZ2VzTWF4UG93ZXIyRy1jdGxPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ1tpXSwgY3RsRWRnZXNNYXhQb3dlcjJHKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgoZnJlcXVlbmN5ID09IDI0MTIpIHx8IChmcmVxdWVuY3kgPT0gMjQ2MikpICYmIChpPj0zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdIdDIwW2ldLCBjdGxFZGdlc01heFBvd2VyMkdIVDIwLWN0bE9mZnNldCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdIdDIwW2ldLCBjdGxFZGdlc01heFBvd2VyMkdIVDIwKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChmcmVxdWVuY3kgPT0gMjQxMikgJiYgKGk+PTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ0h0NDBbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAtY3RsT2Zmc2V0KSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZyZXF1ZW5jeSA9PSAyNDYyKSAmJiAoaT49MykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSwgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MC0oY3RsT2Zmc2V0KjIpKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ0h0NDBbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDApICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHIC0gQ1RMXzExQSAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMTFBKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUcgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8xMUEgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiA1RyAtIENUTF81R0hUMjAgKi8KKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzVHSFQyMCk7CisgICAgICAgICAgICBpZihjdGxfaTxBUjU0MTZfTlVNX0NUTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIG5vIGRhdGEgaW4gRWVwcm9tLCByZXBsYWNlIGJ5IG5vcm1hbCA1RyAqLworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAgPSBjdGxFZGdlc01heFBvd2VyNUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJDVExfNUdIVDIwIGN0bF9pID0gJWRcbiIsIGN0bF9pKSk7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogNUcgLSBDVExfNUdIVDQwICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF81R0hUNDApOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkFkanVzdEhUNDBGcmVxT2Zmc2V0KGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB3b3JrYXJvdW5kIGZvciBubyBkYXRhIGluIEVlcHJvbSwgcmVwbGFjZSBieSBub3JtYWwgNUcgKi8KKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDQwID0gY3RsRWRnZXNNYXhQb3dlcjVHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiQ1RMXzVHSFQ0MCBjdGxfaSA9ICVkXG4iLCBjdGxfaSkpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIDdhMTcgOiAgKi8KKyAgICAgICAgICAgIC8qIE1heCBwb3dlciAoZEJtKSBmb3IgY2hhbm5lbCByYW5nZSB3aGVuIHVzaW5nIERGUyBkZWZpbmUgYnkgbWFkd2lmaSovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh6ZkhwSXNEZnNDaGFubmVsKGRldiwgKHUxNl90KWZyZXF1ZW5jeSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImZyZXF1ZW5jeSB1c2UgREZTICAtLSAiLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHICAgICAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlcjVHLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qIEFwcGx5IGN0bCBtb2RlIHRvIGNvcnJlY3QgdGFyZ2V0IHBvd2VyIHNldCAqLworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY3RsRWRnZXNNYXhQb3dlcjVHICAgICA9ICIsIGN0bEVkZ2VzTWF4UG93ZXI1Ryk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyNUdIVDIwID0gIiwgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyNUdIVDQwID0gIiwgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4NWdbaV0sIGN0bEVkZ2VzTWF4UG93ZXI1RykgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0MjBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93Mng1Z0h0MjBbaV0sIGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjApICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDQwW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4NWdIdDQwW2ldLCBjdGxFZGdlc01heFBvd2VyNUdIVDQwKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LyogZW5kIG9mIGJhbmRlZGdlcyBvZiA1RyAqLworICAgIH0vKiBlbmQgb2YgIGlmICgoZGVzaXJlZF9DdGxJbmRleCA9IHpmSHBHZXRSZWd1bGF0b3J5RG9tYWluKGRldikpID09IDApICovCisKKyAgICAvKiB3b3JrYXJvdW5kICovCisgICAgLyogNS4gQkIgaGVhdnkgY2xpcCAqLworICAgIC8qICAgIG9ubHkgMi40RyBkbyBoZWF2eSBjbGlwICovCisgICAgaWYgKGhwUHJpdi0+ZW5hYmxlQkJIZWF2eUNsaXAgJiYgaHBQcml2LT5od0JCSGVhdnlDbGlwICYmIChmcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkpCisgICAgeworICAgICAgICBpZiAoZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzExRyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8xMUEpOworICAgICAgICB9CisKKyAgICAgICAgaHBQcml2LT5zZXRWYWx1ZUhlYXZ5Q2xpcCA9IHpmSHBDaGVja0RvSGVhdnlDbGlwKGRldiwgZnJlcXVlbmN5LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sIGJ3NDApOworCisgICAgICAgIGlmIChocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPmRvQkJIZWF2eUNsaXAgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT5kb0JCSGVhdnlDbGlwID0gMDsKKyAgICAgICAgfQorICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgIHptX2RiZygoInpmSHBDaGVja0RvSGVhdnlDbGlwIHJldCA9ICUwMngsIGRvQkJIZWF2eUNsaXAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgaHBQcml2LT5zZXRWYWx1ZUhlYXZ5Q2xpcCwgaHBQcml2LT5kb0JCSGVhdnlDbGlwKSk7CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGlmIChocFByaXYtPmRvQkJIZWF2eUNsaXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwICYgMHhmMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFswXSAtPSAxOworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwWzFdIC09IDE7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDBbMl0gLT0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXAgJiAweGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbMF0gKz0gMTsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMFsxXSArPSAxOworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwWzJdICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaHBQcml2LT5kb0JCSGVhdnlDbGlwID0gMDsKKyAgICAgICAgaHBQcml2LT5zZXRWYWx1ZUhlYXZ5Q2xpcCA9IDA7CisgICAgfQorCisgICAgLyogRmluYWwgOiB3cml0ZSBNQUMgcmVnaXN0ZXIgZm9yIHNvbWUgY3RybCBmcmFtZSBUeCBwb3dlciAqLworICAgIC8qIGZpcnN0IHBhcnQgOiAyLjRHICovCisgICAgaWYgKGZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgIHsKKyAgICAgICAgLyogV3JpdGUgTUFDIHJlZyAweDY5NCBmb3IgQUNLJ3MgVFBDICovCisgICAgICAgIC8qIFdyaXRlIE1BQyByZWcgMHhiYjQgUlRTIGFuZCBTRi1DVFMgZnJhbWUgcG93ZXIgY29udHJvbCAqLworICAgICAgICAvKiBBbHdheXMgdXNlIHR3byBzdHJlYW0gZm9yIGxvdyBsZWdhY3kgcmF0ZSAqLworICAgICAgICAjaWYgMAorICAgICAgICAvL2lmIChocFByaXYtPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pCisgICAgICAgIC8veworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpIDw8IDIwKSB8ICgweDE8PDI2KSk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZikgPDwgNSApIHwgKDB4MTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaHBQcml2LT50UG93MngyZ1swXSYweDNmKSA8PCAyMSkgfCAoMHgxPDwyNykgICk7CisgICAgICAgIC8vfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2lmIDEKKyAgICAgICAgLy9lbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZikgPDwgMjApIHwgKDB4NTw8MjYpKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT50UG93MngyZ1swXSYweDNmKSA8PCA1ICkgfCAoMHg1PDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpIDw8IDIxKSB8ICgweDU8PDI3KSAgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjID0gaHBQcml2LT50UG93MngyZ1swXTsKKyAgICAJfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgICAgICB6ZlByaW50VGFyZ2V0UG93ZXIyRyhocFByaXYtPnRQb3cyeENjaywKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogV3JpdGUgTUFDIHJlZyAweDY5NCBmb3IgQUNLJ3MgVFBDICovCisgICAgICAgIC8qIFdyaXRlIE1BQyByZWcgMHhiYjQgUlRTIGFuZCBTRi1DVFMgZnJhbWUgcG93ZXIgY29udHJvbCAqLworICAgICAgICAvKiBBbHdheXMgdXNlIHR3byBzdHJlYW0gZm9yIGxvdyBsZWdhY3kgcmF0ZSAqLworICAgICAgICBpZiAoaHBQcml2LT5oYWxDYXBhYmlsaXR5ICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKQorICAgICAgICB7CisgICAgICAgICAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpIDw8IDIwKSB8ICgweDE8PDI2KSk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZikgPDwgNSApIHwgKDB4MTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKSA8PCAyMSkgfCAoMHgxPDwyNykgICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZikgPDwgMjApIHwgKDB4NTw8MjYpKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKSA8PCA1ICkgfCAoMHg1PDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpIDw8IDIxKSB8ICgweDU8PDI3KSAgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjID0gaHBQcml2LT50UG93MngyZ1swXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgICAgICB6ZlByaW50VGFyZ2V0UG93ZXI1RygKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDIwLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDQwKTsKKyAgICB9LyogZW5kIG9mIGJhbmRlZGdlcyBvZiA1RyAqLworCit9CisKK3ZvaWQgemZEdW1wRWVwQmFuZEVkZ2VzKHN0cnVjdCBhcjU0MTZFZXByb20qIGVlcHJvbUltYWdlKQoreworICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICB1OF90IGksIGosIGs7CisKKyNpZiAwCisgICAgem1fZGJnKCgiXG4gPT09IEJhbmRFZGdlcyBpbmRleCBkdW1wID09PT0gXG4iKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVI1NDE2X05VTV9DVExTOyBpKyspCisgICAgeworICAgICAgICB6bV9kYmcoKCIlMDJ4ICIsIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpXSkpOworICAgIH0KKworICAgIHptX2RiZygoIlxuID09PSBCYW5kRWRnZXMgZGF0YSBkdW1wID09PT0gXG4iKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVI1NDE2X05VTV9DVExTOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBBUjU0MTZfTlVNX0JBTkRfRURHRVM7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90ICpwZGF0YSA9ICh1OF90KikmKGVlcHJvbUltYWdlLT5jdGxEYXRhW2ldLmN0bEVkZ2VzW2pdW2tdKTsKKyAgICAgICAgICAgICAgICB6bV9kYmcoKCIoJTAyeCAlMDJ4KSIsIHBkYXRhWzBdLCBwZGF0YVsxXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem1fZGJnKCgiXG4iKSk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHptX2RiZygoIlxuID09PSBCYW5kRWRnZXMgaW5kZXggZHVtcCA9PT09IFxuIikpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNDsgaSs9OCkKKyAgICB7CisgICAgICAgIHptX2RiZygoIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCIsCisgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSswXSwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krMV0sIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzJdLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSszXSwKKyAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzRdLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSs1XSwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krNl0sIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzddCisgICAgICAgICAgICAgICApKTsKKyAgICB9CisKKyAgICB6bV9kYmcoKCJcbiA9PT0gQmFuZEVkZ2VzIGRhdGEgZHVtcCA9PT09IFxuIikpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSNTQxNl9OVU1fQ1RMUzsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdThfdCAqcGRhdGEgPSAodThfdCopJihlZXByb21JbWFnZS0+Y3RsRGF0YVtpXS5jdGxFZGdlc1tqXSk7CisgICAgICAgICAgICB6bV9kYmcoKCIoJTAzZCAlMDJ4KSAoJTAzZCAlMDJ4KSAoJTAzZCAlMDJ4KSAoJTAzZCAlMDJ4KSBcbiIsCisgICAgICAgICAgICAgICAgICAgcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisgICAgICAgICAgICAgICAgICAgcGRhdGFbNF0sIHBkYXRhWzVdLCBwZGF0YVs2XSwgcGRhdGFbN10KKyAgICAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgICAgIHptX2RiZygoIiglMDNkICUwMngpICglMDNkICUwMngpICglMDNkICUwMngpICglMDNkICUwMngpIFxuIiwKKyAgICAgICAgICAgICAgICAgICBwZGF0YVs4XSwgcGRhdGFbOV0sIHBkYXRhWzEwXSwgcGRhdGFbMTFdLAorICAgICAgICAgICAgICAgICAgIHBkYXRhWzEyXSwgcGRhdGFbMTNdLCBwZGF0YVsxNF0sIHBkYXRhWzE1XQorICAgICAgICAgICAgICAgICAgICkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgI2VuZGlmCit9CisKK3ZvaWQgemZQcmludFRhcmdldFBvd2VyMkcodThfdCogdFBvdzJ4Q2NrLCB1OF90KiB0UG93MngyZywgdThfdCogdFBvdzJ4MmdIdDIwLCB1OF90KiB0UG93MngyZ0h0NDApCit7CisgICAgLy8jaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJ0YXJnZXRQd3IgQ0NLIDogJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93MnhDY2tbMF0sCisgICAgICAgICAgICB0UG93MnhDY2tbMV0sCisgICAgICAgICAgICB0UG93MnhDY2tbMl0sCisgICAgICAgICAgICB0UG93MnhDY2tbM10KKyAgICAgICAgICAgICk7CisgICAgRGJnUHJpbnQoInRhcmdldFB3ciAyRyA6ICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgdFBvdzJ4MmdbMF0sCisgICAgICAgICAgICB0UG93MngyZ1sxXSwKKyAgICAgICAgICAgIHRQb3cyeDJnWzJdLAorICAgICAgICAgICAgdFBvdzJ4MmdbM10KKyAgICAgICAgICAgICk7CisgICAgRGJnUHJpbnQoInRhcmdldFB3ciAyR0hUMjAgOiAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93MngyZ0h0MjBbMF0sCisgICAgICAgICAgICB0UG93MngyZ0h0MjBbMV0sCisgICAgICAgICAgICB0UG93MngyZ0h0MjBbMl0sCisgICAgICAgICAgICB0UG93MngyZ0h0MjBbM10sCisgICAgICAgICAgICB0UG93MngyZ0h0MjBbNF0sCisgICAgICAgICAgICB0UG93MngyZ0h0MjBbNV0sCisgICAgICAgICAgICB0UG93MngyZ0h0MjBbNl0sCisgICAgICAgICAgICB0UG93MngyZ0h0MjBbN10KKyAgICAgICAgICAgICk7CisgICAgRGJnUHJpbnQoInRhcmdldFB3ciAyR0hUNDAgOiAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93MngyZ0h0NDBbMF0sCisgICAgICAgICAgICB0UG93MngyZ0h0NDBbMV0sCisgICAgICAgICAgICB0UG93MngyZ0h0NDBbMl0sCisgICAgICAgICAgICB0UG93MngyZ0h0NDBbM10sCisgICAgICAgICAgICB0UG93MngyZ0h0NDBbNF0sCisgICAgICAgICAgICB0UG93MngyZ0h0NDBbNV0sCisgICAgICAgICAgICB0UG93MngyZ0h0NDBbNl0sCisgICAgICAgICAgICB0UG93MngyZ0h0NDBbN10KKyAgICAgICAgICAgICk7CisgICAgI2VuZGlmCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmUHJpbnRUYXJnZXRQb3dlcjVHKHU4X3QqIHRQb3cyeDVnLCB1OF90KiB0UG93Mng1Z0h0MjAsIHU4X3QqIHRQb3cyeDVnSHQ0MCkKK3sKKyAgICAvLyNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoInRhcmdldFB3ciA1RyA6ICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgdFBvdzJ4NWdbMF0sCisgICAgICAgICAgICB0UG93Mng1Z1sxXSwKKyAgICAgICAgICAgIHRQb3cyeDVnWzJdLAorICAgICAgICAgICAgdFBvdzJ4NWdbM10KKyAgICAgICAgICAgICk7CisgICAgRGJnUHJpbnQoInRhcmdldFB3ciA1R0hUMjAgOiAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93Mng1Z0h0MjBbMF0sCisgICAgICAgICAgICB0UG93Mng1Z0h0MjBbMV0sCisgICAgICAgICAgICB0UG93Mng1Z0h0MjBbMl0sCisgICAgICAgICAgICB0UG93Mng1Z0h0MjBbM10sCisgICAgICAgICAgICB0UG93Mng1Z0h0MjBbNF0sCisgICAgICAgICAgICB0UG93Mng1Z0h0MjBbNV0sCisgICAgICAgICAgICB0UG93Mng1Z0h0MjBbNl0sCisgICAgICAgICAgICB0UG93Mng1Z0h0MjBbN10KKyAgICAgICAgICAgICk7CisgICAgRGJnUHJpbnQoInRhcmdldFB3ciA1R0hUNDAgOiAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93Mng1Z0h0NDBbMF0sCisgICAgICAgICAgICB0UG93Mng1Z0h0NDBbMV0sCisgICAgICAgICAgICB0UG93Mng1Z0h0NDBbMl0sCisgICAgICAgICAgICB0UG93Mng1Z0h0NDBbM10sCisgICAgICAgICAgICB0UG93Mng1Z0h0NDBbNF0sCisgICAgICAgICAgICB0UG93Mng1Z0h0NDBbNV0sCisgICAgICAgICAgICB0UG93Mng1Z0h0NDBbNl0sCisgICAgICAgICAgICB0UG93Mng1Z0h0NDBbN10KKyAgICAgICAgICAgICk7CisgICAgI2VuZGlmCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmSHBQb3dlclNhdmVTZXRNb2RlKHpkZXZfdCogZGV2LCB1OF90IHN0YU1vZGUsIHU4X3QgcHNNb2RlLCB1MTZfdCBiY25JbnRlcnZhbCkKK3sKKyAgICBpZiAoIHN0YU1vZGUgPT0gMCApCisgICAgeworICAgICAgICBpZiAoIHBzTW9kZSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVHVybiBvZmYgcHJlLVRCVFQgaW50ZXJydXB0CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUFJFVEJUVCwgMCk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BFUklPRCwgMCk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVHVybiBvbiBwcmUtVEJUVCBpbnRlcnJ1cHQKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19QUkVUQlRULCAoYmNuSW50ZXJ2YWwtNik8PDE2KTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUEVSSU9ELCBiY25JbnRlcnZhbCk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmSHBQb3dlclNhdmVTZXRTdGF0ZSh6ZGV2X3QqIGRldiwgdThfdCBwc1N0YXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKwkvL0RiZ1ByaW50KCJJTlRPIHpmSHBQb3dlclNhdmVTZXRTdGF0ZSIpOworCisgICAgaWYgKCBwc1N0YXRlID09IDAgKSAvL3Bvd2VyIHVwCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ6ZkhwUG93ZXJTYXZlU2V0U3RhdGUgV2FrZSB1cCBmcm9tIFBTXG4iKTsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTgyQywgMHgwMDAwYTAwMCk7IC8vd2FrZSB1cCBBRERBQworICAgICAgICByZWdfd3JpdGUoMHg5ODA4LCAweDApOyAgICAgICAgLy9lbmFibGUgYWxsIGFnYyBnYWluIGFuZCBvZmZzZXQgdXBkYXRlcyB0byBhMgorICAgICAgICAvLyMgYmFuayAzCisgICAgICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDExZyAqLworICAgICAgICAgICAgLy9yZWdfd3JpdGUgKDB4OThmMCwgIDB4MDFjMDAwMTgpOworICAgICAgICAgICAgcmVnX3dyaXRlICgweDk4ZjAsICAweDAxYzIwMDk4KTsvL3N5bl9vbitSWF9PTgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogMTFhICovCisgICAgICAgICAgICAvL3JlZ193cml0ZSAoMHg5OGYwLCAgMHgwMTQwMDAxOCk7CisgICAgICAgICAgICByZWdfd3JpdGUgKDB4OThmMCwgIDB4MDE0MjAwOTgpOy8vc3luX29uK1JYX09OCisgICAgICAgIH0KKworICAgICAgICAvLy8vI2JhbmsgNQorICAgICAgICAvL3JlZ193cml0ZSgweDk4YjAsICAweDAwMDAwMDEzKTsKKyAgICAgICAgLy9yZWdfd3JpdGUoMHg5OGU0LCAgMHgwMDAwMDAwMik7CisKKworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KKyAgICBlbHNlIC8vcG93ZXIgZG93bgorICAgIHsKKyAgICAgICAgLy9EYmdQcmludCgiemZIcFBvd2VyU2F2ZVNldFN0YXRlIEdvIHRvIFBTXG4iKTsKKyAgICAgICAgLy9yZWdfd3JpdGUoMHg5ODJDLCAweGEwMDBhMDAwKTsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTgwOCwgMHg4MDAwMDAwKTsgICAgLy9kaXNhYmxlIGFsbCBhZ2MgZ2FpbiBhbmQgb2Zmc2V0IHVwZGF0ZXMgdG8gYTIKKyAgICAgICAgcmVnX3dyaXRlKDB4OTgyQywgMHhhMDAwYTAwMCk7ICAgLy9wb3dlciBkb3duIEFEREFDCisgICAgICAgIC8vIyBiYW5rIDMKKyAgICAgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMTFnICovCisgICAgICAgICAgICByZWdfd3JpdGUgKDB4OThmMCwgIDB4MDBjMDAwMTgpOy8vc3luX29mZitSWF9vZmYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDExYSAqLworICAgICAgICAgICAgcmVnX3dyaXRlICgweDk4ZjAsICAweDAwNDAwMDE4KTsvL3N5bl9vZmYrUlhfb2ZmCisgICAgICAgIH0KKworICAgICAgICAvLy8vI2JhbmsgNQorICAgICAgICAvL3JlZ193cml0ZSgweDk4YjAsICAweDAwMGUwMDEzKTsKKyAgICAgICAgLy9yZWdfd3JpdGUoMHg5OGU0LCAgMHgwMDAxODAwMik7CisKKworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KK30KKwordm9pZCB6ZkhwU2V0QWdnUGt0TnVtKHpkZXZfdCogZGV2LCB1MzJfdCBudW0pCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIG51bSA9IChudW0gPDwgMTYpIHwgKDB4YSk7CisKKyAgICBocFByaXYtPmFnZ1BrdE51bSA9IG51bTsKKworICAgIC8vYWdncmVnYXRpb24gbnVtYmVyIHdpbGwgYmUgdXBkYXRlIGluIEhBTCBoZWFydCBiZWF0CisgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjljLCBudW0pOworICAgIC8vemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKwordm9pZCB6ZkhwU2V0TVBEVURlbnNpdHkoemRldl90KiBkZXYsIHU4X3QgZGVuc2l0eSkKK3sKKyAgICB1MzJfdCB2YWx1ZTsKKworICAgIGlmIChkZW5zaXR5ID4gWk1fTVBEVV9ERU5TSVRZXzhVUykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBEZWZhdWx0IHZhbHVlIGluIHRoaXMgcmVnaXN0ZXIgKi8KKyAgICB2YWx1ZSA9IDB4MTQwQTAwIHwgZGVuc2l0eTsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYTAsIHZhbHVlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkhwU2V0U2xvdFRpbWUoemRldl90KiBkZXYsIHU4X3QgdHlwZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgaWYgKHR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIC8vbm9ybWFsIHNsb3QgPSAyMHVzCisgICAgICAgIGhwUHJpdi0+c2xvdFR5cGUgPSAwOworICAgIH0KKyAgICBlbHNlIC8vaWYgKHR5cGUgPT0gMSkKKyAgICB7CisgICAgICAgIC8vc2hvcnQgc2xvdCA9IDl1cworICAgICAgICBocFByaXYtPnNsb3RUeXBlID0gMTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZIcFNldFNsb3RUaW1lUmVnaXN0ZXIoemRldl90KiBkZXYsIHU4X3QgdHlwZSkKK3sKKyAgICBpZih0eXBlID09IDApCisgICAgeworICAgICAgICAvL25vcm1hbCBzbG90ID0gMjB1cworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU0xPVF9USU1FLCAyMDw8MTApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3Nob3J0IHNsb3QgPSA5dXMKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1NMT1RfVElNRSwgOTw8MTApOworICAgIH0KK30KKwordm9pZCB6ZkhwU2V0Umlmcyh6ZGV2X3QqIGRldiwgdThfdCBodF9lbmFibGUsIHU4X3QgaHQyMDQwLCB1OF90IGdfbW9kZSkKK3sKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM2Mzg4LCAweDBjMDAwMDAwKTsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5ZWMsIDB4MGNjODBjYWEpOworCisgICAgaWYgKGh0X2VuYWJsZSkKKyAgICB7CisgICAgICAgIGlmIChodDIwNDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5MTgsIDQwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5MTgsIDIwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnX21vZGUpCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1ODUwLCAweGVjMDhiNGUyKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTg1YywgMHgzMTNhNWQ1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU4NTAsIDB4ZWRlOGI0ZTApOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1ODVjLCAweDMxMzk2MDVlKTsKKyAgICB9CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkhwQmVnaW5TaXRlU3VydmV5KHpkZXZfdCogZGV2LCB1OF90IHN0YXR1cykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIGlmICggc3RhdHVzID09IDEgKQorICAgIHsgLy8gQ29ubmVjdGVkCisgICAgICAgIGhwUHJpdi0+aXNTaXRlU3VydmV5ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLy8gTm90IGNvbm5lY3RlZAorICAgICAgICBocFByaXYtPmlzU2l0ZVN1cnZleSA9IDA7CisgICAgfQorCisgICAgLyogcmVzZXQgd29ya2Fyb3VuZCBzdGF0ZSB0byBkZWZhdWx0ICovCisvLyAgICBpZiAoaHBQcml2LT5yeFN0cm9uZ1JTU0kgPT0gMSkKKyAgICB7CisgICAgICAgIGhwUHJpdi0+cnhTdHJvbmdSU1NJID0gMDsKKyAgICAgICAgaWYgKChocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTEwKjIvNF0mMHhmZikgPT0gMHg4MCkgLy9GRU0gVFlQRQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4OWI0OSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHgwOTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4OWI0MCk7CisgICAgICAgIH0KKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9CisvLyAgICBpZiAoaHBQcml2LT5zdHJvbmdSU1NJID09IDEpCisgICAgeworICAgICAgICBocFByaXYtPnN0cm9uZ1JTU0kgPSAwOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCAyMCkgfCAoMHg1PDwyNikpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCA1ICkgfCAoMHg1PDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCAyMSkgfCAoMHg1PDwyNykgICk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorfQorCit2b2lkIHpmSHBGaW5pc2hTaXRlU3VydmV5KHpkZXZfdCogZGV2LCB1OF90IHN0YXR1cykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICggc3RhdHVzID09IDEgKQorICAgIHsKKyAgICAgICAgaHBQcml2LT5pc1NpdGVTdXJ2ZXkgPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBocFByaXYtPmlzU2l0ZVN1cnZleSA9IDA7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3UxNl90IHpmRndSZXRyeSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldCA9IDA7CisKKyAgICBjbWRbMF0gPSA0IHwgKDB4OTIgPDwgOCk7CisgICAgY21kWzFdID0gKGVuYWJsZSA9PSAxKSA/IDB4MDEgOiAweDAwOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCit1MTZfdCB6ZkhwRW5hYmxlSHdSZXRyeSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCByZXQ7CisKKyAgICByZXQgPSB6ZkZ3UmV0cnkoZGV2LCAwKTsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiMjgsIDB4MzMzMzMpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorCit1MTZfdCB6ZkhwRGlzYWJsZUh3UmV0cnkoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgcmV0OworCisgICAgcmV0ID0gemZGd1JldHJ5KGRldiwgMSk7CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjI4LCAweDAwMDAwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogRG93bmxvYWQgU1BJIEZ3ICovCisjZGVmaW5lIFpNX0ZJUk1XQVJFX1dMQU4gICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9GSVJNV0FSRV9TUElfRkxBU0ggICAgICAgICAgIDEKKworCit1MTZfdCB6ZkhwRmlybXdhcmVEb3dubG9hZCh6ZGV2X3QqIGRldiwgdThfdCBmd1R5cGUpCit7CisgICAgdTE2X3QgcmV0ID0gWk1fU1VDQ0VTUzsKKworICAgIGlmIChmd1R5cGUgPT0gWk1fRklSTVdBUkVfV0xBTikKKyAgICB7CisgICAgICAgIHJldCA9IHpmRmlybXdhcmVEb3dubG9hZChkZXYsICh1MzJfdCopemNGd0ltYWdlLAorICAgICAgICAgICAgICAgICh1MzJfdCl6Y0Z3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpOworICAgIH0KKyAgICBlbHNlIGlmIChmd1R5cGUgPT0gWk1fRklSTVdBUkVfU1BJX0ZMQVNIKQorICAgIHsKKyAgICAgICAgcmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0Z3SW1hZ2VTUEksCisgICAgICAgICAgICAgICAgKHUzMl90KXpjRndJbWFnZVNQSVNpemUsIFpNX0ZJUk1XQVJFX1NQSV9BRERSKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiVW5rbm93biBmaXJtd2FyZSB0eXBlID0gIiwgZndUeXBlKTsKKyAgICAgICAgcmV0ID0gWk1fRVJSX0ZJUk1XQVJFX1dST05HX1RZUEU7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyogRW5hYmxlIHNvZnR3YXJlIGRlY3J5cHRpb24gKi8KK3ZvaWQgemZIcFNXRGVjcnlwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgdTMyX3QgdmFsdWUgPSAweDcwOworCisgICAgLyogQml0IDQgZm9yIGVuYWJsZSBzb2Z0d2FyZSBkZWNyeXB0aW9uICovCisgICAgaWYgKGVuYWJsZSA9PSAxKQorICAgIHsKKyAgICAgICAgdmFsdWUgPSAweDc4OworICAgIH0KKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2NzgsIHZhbHVlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisvKiBFbmFibGUgc29mdHdhcmUgZW5jcnlwdGlvbiAqLwordm9pZCB6ZkhwU1dFbmNyeXB0KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICAvKiBCZWNhdXNlIGVuY3J5cHRpb24gYnkgc29mdHdhcmUgb3IgaGFyZHdhcmUgaXMganVkZ2VkIGJ5IGRyaXZlciBpbiBPdHVzLAorICAgICAgIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaW4gdGhlIEhBTCBsYXllci4KKyAgICAgKi8KK30KKwordTMyX3QgemZIcENhcGFiaWxpdHkoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICByZXR1cm4gaHBQcml2LT5oYWxDYXBhYmlsaXR5OworfQorCit2b2lkIHpmSHBTZXRSb2xsQ2FsbFRhYmxlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgaWYgKGhwUHJpdi0+Y2FtUm9sbENhbGxUYWJsZSAhPSAodTY0X3QpIDApCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9MLCAodTMyX3QpKGhwUHJpdi0+Y2FtUm9sbENhbGxUYWJsZSAmIDB4ZmZmZmZmZmYpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfSCwgKHUzMl90KSgoaHBQcml2LT5jYW1Sb2xsQ2FsbFRhYmxlID4+IDMyKSAmIDB4ZmZmZmZmZmYpKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9Cit9CisKK3ZvaWQgemZIcFNldFRUU0lGU1RpbWUoemRldl90KiBkZXYsIHU4X3Qgc2lmc190aW1lKQoreworICAgIHUzMl90IHJlZ192YWx1ZSA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc2lmc190aW1lICY9IDB4M2Y7CisgICAgcmVnX3ZhbHVlID0gMHgxNDQwMGIgfCAoKCh1MzJfdClzaWZzX3RpbWUpPDwyNCk7CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgcmVnX3ZhbHVlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisvKiAjMyBFbmFibGUgUklGUyBmdW5jdGlvbiBpZiB0aGUgUklGUyBwYXR0ZXJuIG1hdGNoZWQgISAqLwordm9pZCB6ZkhwRW5hYmxlUmlmcyh6ZGV2X3QqIGRldiwgdThfdCBtb2RlMjRnLCB1OF90IG1vZGVIdCwgdThfdCBtb2RlSHQyMDQwKQoreworCisgICAgLyogIyBFbmFibGUgUmVzZXQgVERPTUFJTgorICAgICAqICRyZGRhdGEgPSAmJHBoeXJlZ19yZWFkKDB4OTgwMCsoNzM4PDwyKSk7CisgICAgICogJHdyZGF0YSA9ICRyZGRhdGEgfCAoMHgxIDw8IDI2KSB8ICgweDEgPDwgMjcpOworICAgICAqICYkcGh5cmVnX3dyaXRlKDB4OTgwMCsoNzM4PDwyKSwgJHdyZGF0YSk7CisgICAgICovCisgICAgcmVnX3dyaXRlICgweDk4MDArKDczODw8MiksIDB4MDgwMDAwMDAgfCAoMHgxIDw8IDI2KSB8ICgweDEgPDwgMjcpKTsKKyAgICAvL3JlZ193cml0ZSAoMHg5ODAwKyg3Mzg8PDIpLCAweDA4MDAwMDAwIHwgKDB4MSA8PCAyNikpOworCisgICAgLyogIyByZWcgMTIzOiBoZWF2eSBjbGlwIGZhY3RvciwgeHIgLyBSSUZTIHNlYXJjaCBwYXJhbWV0ZXJzICovCisgICAgcmVnX3dyaXRlICgweDk5ZWMsIDB4MGNjODBjYWEpOworCisgICAgLyogIyBSZWR1Y2UgU2VhcmNoIFN0YXJ0IERlbGF5IGZvciBSSUZTICAgICovCisgICAgaWYgKG1vZGVIdCA9PSAxKSAvKiAoJEhUX0VOQUJMRSA9PSAxKSAqLworICAgIHsKKyAgICAgICAgaWYgKG1vZGVIdDIwNDAgPT0gMHgxKSAvKiAoJERZTkFNSUNfSFQyMDQwX0VOID09IDB4MSkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmVnX3dyaXRlKDB4OTgwMCsoNzA8PDIpLCA0MCk7Lyo0MCovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODAwKyg3MDw8MiksIDIwKTsKKyAgICAgICAgICAgIGlmKG1vZGUyNGcgPT0gMHgwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qICRyZGRhdGEgPSAmJHBoeXJlZ19yZWFkKDB4OTgwMCsoMjQ8PDIpKTsjMHg5ODYwOzB4MWM1ODYwCisgICAgICAgICAgICAgICAgICokd3JkYXRhID0gKCRyZGRhdGEgJiAweGZmZmZmZmM3KSB8ICgweDQgPDwgMyk7CisgICAgICAgICAgICAgICAgICogJiRwaHlyZWdfd3JpdGUoMHg5ODAwKygyNDw8MiksICR3cmRhdGEpOworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJlZ193cml0ZSgweDk4MDArKDI0PDwyKSwgKDB4MDAwNGRkMTAgJiAweGZmZmZmZmM3KSB8ICgweDQgPDwgMykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1vZGUyNGcgPT0gMHgxKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTg1MCwgMHhlY2U4YjRlNCk7LypvcmcqLworICAgICAgICAvL3JlZ193cml0ZSgweDk4NTAsIDB4ZWNlOGI0ZTIpOworICAgICAgICByZWdfd3JpdGUoMHg5ODVjLCAweDMxM2E1ZDVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTg1MCwgMHhlZGU4YjRlNCk7CisgICAgICAgIHJlZ193cml0ZSgweDk4NWMsIDB4MzEzOTYwNWUpOworICAgIH0KKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICByZXR1cm47Cit9CisKKy8qICM0IERpc2FibGUgUklGUyBmdW5jdGlvbiBpZiB0aGUgUklGUyB0aW1lciBpcyB0aW1lb3V0ICEgKi8KK3ZvaWQgemZIcERpc2FibGVSaWZzKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIERpc2FibGUgUklGUyBmdW5jdGlvbiBpcyB0byBzdG9yZSB0aGVzZSBIVyByZWdpc3RlciBpbml0aWFsIHZhbHVlIHdoaWxlIHRoZSBkZXZpY2UgcGx1Zy1pbiBhbmQKKyAgICAgICByZS13cml0ZSB0byB0aGVzZSByZWdpc3RlciBpZiB0aGUgUklGUyBmdW5jdGlvbiBpcyBkaXNhYmxlZCAgKi8KKworICAgIC8vIHJlZyA6IDk4NTAKKyAgICByZWdfd3JpdGUoMHg5ODUwLCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXREZXNpcmVkU2lnU2l6ZSk7CisKKyAgICAvLyByZWcgOiA5ODVjCisgICAgcmVnX3dyaXRlKDB4OTg1YywgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0QUdDKTsKKworICAgIC8vIHJlZyA6IDk4NjAKKyAgICByZWdfd3JpdGUoMHg5ODAwKygyNDw8MiksICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEFnY0NvbnRyb2wpOworCisgICAgLy8gcmVnIDogOTkxOAorICAgIHJlZ193cml0ZSgweDk4MDArKDcwPDwyKSwgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0U2VhcmNoU3RhcnREZWxheSk7CisKKyAgICAvLyByZWcgOiA5OTFjCisgICAgcmVnX3dyaXRlICgweDk5ZWMsICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdFJJRlNTZWFyY2hQYXJhbXMpOworCisgICAgLy8gcmVnIDogYTM4OAorICAgIHJlZ193cml0ZSAoMHg5ODAwKyg3Mzg8PDIpLCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRGYXN0Q2hhbm5lbENoYW5nZUNvbnRyb2wpOworCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmZWJhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5jCkBAIC0wLDAgKzEsMjQ4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaHByZWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBSZWd1bGF0b3J5IFRhYmxlIGFuZCByZWxhdGVkIGZ1bmN0aW9uLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorI2luY2x1ZGUgImhwYW5pLmgiCisjaW5jbHVkZSAiaHByZWcuaCIKKyNpbmNsdWRlICJocHVzYi5oIgorCisvKiB1c2VkIHRocm91Z2hvdXQgdGhpcyBmaWxlLi4uICovCisjZGVmaW5lCU4oYSkJKHNpemVvZiAoYSkgLyBzaXplb2YgKGFbMF0pKQorCisjZGVmaW5lIEhBTF9NT0RFXzExQV9UVVJCTwlIQUxfTU9ERV8xMDhBCisjZGVmaW5lIEhBTF9NT0RFXzExR19UVVJCTwlIQUxfTU9ERV8xMDhHCisKKyNpZiAwCitlbnVtIHsKKyAgICAvKiB0ZXN0IGdyb3VwcyAqLworCUZDQwkgICAgICAgPSAweDEwLAorCU1LSwkgICAgICAgPSAweDQwLAorCUVUU0kJICAgPSAweDMwLAorICAgIFNEX05PX0NUTCAgPSAweGUwLAorCU5PX0NUTAkgICA9IDB4ZmYsCisgICAgLyogdGVzdCBtb2RlcyAqLworICAgIENUTF9NT0RFX00gPSAweDBmLAorICAgIENUTF8xMUEgICAgPSAwLAorCUNUTF8xMUIJICAgPSAxLAorCUNUTF8xMUcJICAgPSAyLAorCUNUTF9UVVJCTyAgPSAzLAorCUNUTF8xMDhHICAgPSA0LAorICAgIENUTF8yR0hUMjAgPSA1LAorICAgIENUTF81R0hUMjAgPSA2LAorICAgIENUTF8yR0hUNDAgPSA3LAorICAgIENUTF81R0hUNDAgPSA4Cit9OworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFyZSBmbGFncyBmb3IgZGlmZmVyZW50IHJlcXVpcmVtZW50cyBwZXIgcmVnIGRvbWFpbi4KKyAqIFRoZXNlIHJlcXVpcmVtZW50cyBhcmUgZWl0aGVyIGluaGVyZXRlZCBmcm9tIHRoZSByZWcgZG9tYWluIHBhaXIgb3IKKyAqIGZyb20gdGhlIHVuaXRhcnkgcmVnIGRvbWFpbiBpZiB0aGUgcmVnIGRvbWFpbiBwYWlyIGZsYWdzIHZhbHVlIGlzCisgKiAwCisgKi8KKworZW51bSB7CisJTk9fUkVRCQkJPSAweDAwMDAwMDAwLAorCURJU0FMTE9XX0FESE9DXzExQQk9IDB4MDAwMDAwMDEsCisJRElTQUxMT1dfQURIT0NfMTFBX1RVUkIJPSAweDAwMDAwMDAyLAorCU5FRURfTkZDCQk9IDB4MDAwMDAwMDQsCisKKwlBREhPQ19QRVJfMTFECQk9IDB4MDAwMDAwMDgsICAvKiBTdGFydCBBZC1Ib2MgbW9kZSAqLworCUFESE9DX05PXzExQQkJPSAweDAwMDAwMDEwLAorCisJUFVCTElDX1NBRkVUWV9ET01BSU4JPSAweDAwMDAwMDIwLCAJLyogcHVibGljIHNhZmV0eSBkb21haW4gKi8KKwlMSU1JVF9GUkFNRV80TVMgCT0gMHgwMDAwMDA0MCwgCS8qIDRtc2VjIGxpbWl0IG9uIHRoZSBmcmFtZSBsZW5ndGggKi8KK307CisKKyNkZWZpbmUgTUtLNUdIWl9GTEFHMSAoRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQyB8IExJTUlUX0ZSQU1FXzRNUykKKyNkZWZpbmUgTUtLNUdIWl9GTEFHMiAoRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIgfCBORUVEX05GQ3wgTElNSVRfRlJBTUVfNE1TKQorCit0eXBlZGVmIGVudW0geworCURGU19VTklOSVRfRE9NQUlOCT0gMCwJLyogVW5pbml0aWFsaXplZCBkZnMgZG9tYWluICovCisJREZTX0ZDQ19ET01BSU4JCT0gMSwJLyogRkNDMyBkZnMgZG9tYWluICovCisJREZTX0VUU0lfRE9NQUlOCQk9IDIsCS8qIEVUU0kgZGZzIGRvbWFpbiAqLworfSBIQUxfREZTX0RPTUFJTjsKKworLyoKKyAqIFVzZWQgdG8gc2V0IHRoZSBSZWdEb21haW4gYml0bWFzayB3aGljaCBjaG9vc2VzIHdoaWNoIGZyZXF1ZW5jeQorICogYmFuZCBzcGVjcyBhcmUgdXNlZC4KKyAqLworCisjZGVmaW5lIEJNTEVOIDIJCS8qIFVzZSAyIDY0IGJpdCB1aW50IGZvciBjaGFubmVsIGJpdG1hc2sKKwkJCSAgIE5COiBNdXN0IGFncmVlIHdpdGggbWFjcm8gYmVsb3cgKEJNKSAqLworI2RlZmluZSBCTVpFUk8geyh1NjRfdCkgMCwgKHU2NF90KSAwfQkvKiBCTUxFTiB6ZXJvcyAqLworCisjaWYgMAorCisjZGVmaW5lIEJNKF9mYSwgX2ZiLCBfZmMsIF9mZCwgX2ZlLCBfZmYsIF9mZywgX2ZoLCBfZmksIF9maiwgX2ZrLCBfZmwpIFwKKyAgICAgIHsoKCgoX2ZhID49IDApICYmIChfZmEgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mYSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mYiA+PSAwKSAmJiAoX2ZiIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmIpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmMgPj0gMCkgJiYgKF9mYyA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZjKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZkID49IDApICYmIChfZmQgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mZCkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZSA+PSAwKSAmJiAoX2ZlIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmUpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmYgPj0gMCkgJiYgKF9mZiA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZmKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZnID49IDApICYmIChfZmcgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mZykgOiAodTY0X3QpIDApIHwgXAorCSgoKF9maCA+PSAwKSAmJiAoX2ZoIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmgpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmkgPj0gMCkgJiYgKF9maSA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZqID49IDApICYmIChfZmogPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9maikgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mayA+PSAwKSAmJiAoX2ZrIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmspIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmwgPj0gMCkgJiYgKF9mbCA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZsKSA6ICh1NjRfdCkgMCkgfCBcCisJICAgICAgICgoKChfZmEgPiA2MykgJiYgKF9mYSA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmEgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZiID4gNjMpICYmIChfZmIgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZiIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mYyA+IDYzKSAmJiAoX2ZjIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mYyAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmQgPiA2MykgJiYgKF9mZCA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmQgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZlID4gNjMpICYmIChfZmUgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZlIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZiA+IDYzKSAmJiAoX2ZmIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZiAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmcgPiA2MykgJiYgKF9mZyA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmcgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZoID4gNjMpICYmIChfZmggPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZoIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9maSA+IDYzKSAmJiAoX2ZpIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9maSAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmogPiA2MykgJiYgKF9maiA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmogLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZrID4gNjMpICYmIChfZmsgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZrIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mbCA+IDYzKSAmJiAoX2ZsIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mbCAtIDY0KSkgOiAodTY0X3QpIDApKSl9CisKKyNlbHNlCisKKyNkZWZpbmUgQk0oX2ZhLCBfZmIsIF9mYywgX2ZkLCBfZmUsIF9mZiwgX2ZnLCBfZmgsIF9maSwgX2ZqLCBfZmssIF9mbCkgXAorICAgICAgeygoKChfZmEgPj0gMCkgJiYgKF9mYSA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mYSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mYiA+PSAwKSAmJiAoX2ZiIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZiJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZjID49IDApICYmIChfZmMgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmMmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmQgPj0gMCkgJiYgKF9mZCA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZCYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZSA+PSAwKSAmJiAoX2ZlIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZlJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZmID49IDApICYmIChfZmYgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmYmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmcgPj0gMCkgJiYgKF9mZyA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZyYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9maCA+PSAwKSAmJiAoX2ZoIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZoJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZpID49IDApICYmIChfZmkgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmogPj0gMCkgJiYgKF9maiA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9maiYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mayA+PSAwKSAmJiAoX2ZrIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZrJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZsID49IDApICYmIChfZmwgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmwmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkgICAgICAgKCgoKF9mYSA+IDYzKSAmJiAoX2ZhIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmEgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZiID4gNjMpICYmIChfZmIgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mYiAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmMgPiA2MykgJiYgKF9mYyA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZjIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZCA+IDYzKSAmJiAoX2ZkIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmQgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZlID4gNjMpICYmIChfZmUgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mZSAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmYgPiA2MykgJiYgKF9mZiA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZmIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZyA+IDYzKSAmJiAoX2ZnIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmcgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZoID4gNjMpICYmIChfZmggPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9maCAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmkgPiA2MykgJiYgKF9maSA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZpIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9maiA+IDYzKSAmJiAoX2ZqIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmogLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZrID4gNjMpICYmIChfZmsgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mayAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmwgPiA2MykgJiYgKF9mbCA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZsIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkpKX0KKworI2VuZGlmCisKKy8qIE1hc2sgdG8gY2hlY2sgd2hldGhlciBhIGRvbWFpbiBpcyBhIG11bHRpZG9tYWluIG9yIGEgc2luZ2xlCisgICBkb21haW4gKi8KKworI2RlZmluZSBNVUxUSV9ET01BSU5fTUFTSyAweEZGMDAKKworCisvKgorICogVGhlIGZvbGxvd2luZyBkZXNjcmliZSB0aGUgYml0IG1hc2tzIGZvciBkaWZmZXJlbnQgcGFzc2l2ZSBzY2FuCisgKiBjYXBhYmlsaXR5L3JlcXVpcmVtZW50cyBwZXIgcmVnZG9tYWluLgorICovCisjZGVmaW5lCU5PX1BTQ0FOCTB4MFVMTAorI2RlZmluZQlQU0NBTl9GQ0MJMHgwMDAwMDAwMDAwMDAwMDAxVUxMCisjZGVmaW5lCVBTQ0FOX0ZDQ19UCTB4MDAwMDAwMDAwMDAwMDAwMlVMTAorI2RlZmluZQlQU0NBTl9FVFNJCTB4MDAwMDAwMDAwMDAwMDAwNFVMTAorI2RlZmluZQlQU0NBTl9NS0sxCTB4MDAwMDAwMDAwMDAwMDAwOFVMTAorI2RlZmluZQlQU0NBTl9NS0syCTB4MDAwMDAwMDAwMDAwMDAxMFVMTAorI2RlZmluZQlQU0NBTl9NS0tBCTB4MDAwMDAwMDAwMDAwMDAyMFVMTAorI2RlZmluZQlQU0NBTl9NS0tBX0cJMHgwMDAwMDAwMDAwMDAwMDQwVUxMCisjZGVmaW5lCVBTQ0FOX0VUU0lBCTB4MDAwMDAwMDAwMDAwMDA4MFVMTAorI2RlZmluZQlQU0NBTl9FVFNJQgkweDAwMDAwMDAwMDAwMDAxMDBVTEwKKyNkZWZpbmUJUFNDQU5fRVRTSUMJMHgwMDAwMDAwMDAwMDAwMjAwVUxMCisjZGVmaW5lCVBTQ0FOX1dXUgkweDAwMDAwMDAwMDAwMDA0MDBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLQTEJMHgwMDAwMDAwMDAwMDAwODAwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0ExX0cJMHgwMDAwMDAwMDAwMDAxMDAwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0EyCTB4MDAwMDAwMDAwMDAwMjAwMFVMTAorI2RlZmluZQlQU0NBTl9NS0tBMl9HCTB4MDAwMDAwMDAwMDAwNDAwMFVMTAorI2RlZmluZQlQU0NBTl9NS0szCTB4MDAwMDAwMDAwMDAwODAwMFVMTAorI2RlZmluZQlQU0NBTl9ERUZFUgkweDdGRkZGRkZGRkZGRkZGRkZVTEwKKyNkZWZpbmUJSVNfRUNNX0NIQU4JMHg4MDAwMDAwMDAwMDAwMDAwVUxMCisKKy8qCisgKiBUSEUgZm9sbG93aW5nIHRhYmxlIGlzIHRoZSBtYXBwaW5nIG9mIHJlZ2RvbWFpbiBwYWlycyBzcGVjaWZpZWQgYnkKKyAqIGFuIDggYml0IHJlZ2RvbWFpbiB2YWx1ZSB0byB0aGUgaW5kaXZpZHVhbCB1bml0YXJ5IHJlZyBkb21haW5zCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgcmVnX2Rtbl9wYWlyX21hcHBpbmcgeworCXUxNl90IHJlZ0RtbkVudW07CS8qIDE2IGJpdCByZWcgZG9tYWluIHBhaXIgKi8KKwl1MTZfdCByZWdEbW41R0h6OwkvKiA1R0h6IHJlZyBkb21haW4gKi8KKwl1MTZfdCByZWdEbW4yR0h6OwkvKiAyR0h6IHJlZyBkb21haW4gKi8KKwl1MzJfdCBmbGFnczVHSHo7CQkvKiBSZXF1aXJlbWVudHMgZmxhZ3MgKEFkSG9jCisJCQkJCSAgIGRpc2FsbG93LCBub2lzZSBmbG9vciBjYWwgbmVlZGVkLAorCQkJCQkgICBldGMpICovCisJdTMyX3QgZmxhZ3MyR0h6OwkJLyogUmVxdWlyZW1lbnRzIGZsYWdzIChBZEhvYworCQkJCQkgICBkaXNhbGxvdywgbm9pc2UgZmxvb3IgY2FsIG5lZWRlZCwKKwkJCQkJICAgZXRjKSAqLworCXU2NF90IHBzY2FuTWFzazsJCS8qIFBhc3NpdmUgU2NhbiBmbGFncyB3aGljaAorCQkJCQkgICBjYW4gb3ZlcnJpZGUgdW5pdGFyeSBkb21haW4KKwkJCQkJICAgcGFzc2l2ZSBzY2FuIGZsYWdzLiAgVGhpcworCQkJCQkgICB2YWx1ZSBpcyB1c2VkIGFzIGEgbWFzayBvbgorCQkJCQkgICB0aGUgdW5pdGFyeSBmbGFncyovCisJdTE2X3Qgc2luZ2xlQ0M7CQkvKiBDb3VudHJ5IGNvZGUgb2Ygc2luZ2xlIGNvdW50cnkgaWYKKwkJCQkJICAgYSBvbmUtb24tb25lIG1hcHBpbmcgZXhpc3RzICovCit9ICBSRUdfRE1OX1BBSVJfTUFQUElORzsKKworc3RhdGljIFJFR19ETU5fUEFJUl9NQVBQSU5HIHJlZ0RvbWFpblBhaXJzW10gPSB7CisJe05PX0VOVU1SRCwJICAgIEZDQzIsCURFQlVHX1JFR19ETU4sICBOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7TlVMTDFfV09STEQsCU5VTEwxLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7TlVMTDFfRVRTSUIsCU5VTEwxLAkJRVRTSUIsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7TlVMTDFfRVRTSUMsCU5VTEwxLAkJRVRTSUMsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKworCXtGQ0MyX0ZDQ0EsICAgICBGQ0MyLAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0MyX1dPUkxELCAgICBGQ0MyLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDMl9FVFNJQywJRkNDMiwJCUVUU0lDLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzNfRkNDQSwgICAgIEZDQzMsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzNfV09STEQsICAgIEZDQzMsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0M0X0ZDQ0EsICAgICBGQ0M0LAkJRkNDQSwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzVfRkNDQSwgICAgIEZDQzUsCQlGQ0NBLAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDNl9GQ0NBLCAgICAgRkNDNiwJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDNl9XT1JMRCwgICAgRkNDNiwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisKKwl7RVRTSTFfV09STEQsCUVUU0kxLAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtFVFNJMl9XT1JMRCwJRVRTSTIsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0VUU0kzX1dPUkxELAlFVFNJMywJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RVRTSTRfV09STEQsCUVUU0k0LAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtFVFNJNV9XT1JMRCwJRVRTSTUsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0VUU0k2X1dPUkxELAlFVFNJNiwJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKworCXtFVFNJM19FVFNJQSwJRVRTSTMsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZSQU5DRV9SRVMsCUVUU0kzLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKworCXtGQ0MxX1dPUkxELAlGQ0MxLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDMV9GQ0NBLCAgICAgRkNDMSwJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMMV9XT1JMRCwJQVBMMSwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDJfV09STEQsCUFQTDIsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwzX1dPUkxELAlBUEwzLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMNF9XT1JMRCwJQVBMNCwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDVfV09STEQsCUFQTDUsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEw2X1dPUkxELAlBUEw2LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMOF9XT1JMRCwJQVBMOCwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDlfV09STEQsCUFQTDksCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe0FQTDNfRkNDQSwgICAgIEFQTDMsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDFfRVRTSUMsCUFQTDEsCQlFVFNJQywJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwyX0VUU0lDLAlBUEwyLAkJRVRTSUMsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMMl9GQ0NBLAkJQVBMMiwJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMMl9BUExELCAgICAgQVBMMiwJCUFQTEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDB9LAorCXtBUEw3X0ZDQ0EsCQlBUEw3LAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe01LSzFfTUtLQSwgICAgIE1LSzEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBLCBDVFJZX0pBUEFOIH0sCisJe01LSzFfTUtLQiwgICAgIE1LSzEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMSB9LAorCXtNS0sxX0ZDQ0EsICAgICBNS0sxLAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxLCBDVFJZX0pBUEFOMiB9LAorCXtNS0sxX01LS0ExLCAgICBNS0sxLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFONCB9LAorCXtNS0sxX01LS0EyLCAgICBNS0sxLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFONSB9LAorCXtNS0sxX01LS0MsICAgICBNS0sxLAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxLCBDVFJZX0pBUEFONiB9LAorCisJLyogTUtLMiAqLworCXtNS0syX01LS0EsICAgICBNS0syLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0syIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjMgfSwKKworCS8qIE1LSzMgKi8KKwl7TUtLM19NS0tBLCAgICAgTUtLMywJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4yNSB9LAorCXtNS0szX01LS0IsICAgICBNS0szLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFONyB9LAorCXtNS0szX01LS0ExLCAgICBNS0szLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU4yNiB9LAorCXtNS0szX01LS0EyLCAgICBNS0szLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU44IH0sCisJe01LSzNfTUtLQywgICAgIE1LSzMsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOOSB9LAorCXtNS0szX0ZDQ0EsICAgICBNS0szLAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjI3IH0sCisKKwkvKiBNS0s0ICovCisJe01LSzRfTUtLQiwgICAgIE1LSzQsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMTAgfSwKKwl7TUtLNF9NS0tBMSwgICAgTUtLNCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjI4IH0sCisJe01LSzRfTUtLQTIsICAgIE1LSzQsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzMgfFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjExIH0sCisJe01LSzRfTUtLQywgICAgIE1LSzQsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzMsIENUUllfSkFQQU4xMiB9LAorCXtNS0s0X0ZDQ0EsICAgICBNS0s0LAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjI5IH0sCisJe01LSzRfTUtLQSwgICAgIE1LSzQsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBLCBDVFJZX0pBUEFOMzYgfSwKKworCS8qIE1LSzUgKi8KKwl7TUtLNV9NS0tCLCAgICAgTUtLNSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xMyB9LAorCXtNS0s1X01LS0EyLCAgICBNS0s1LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFOMTQgfSwKKwl7TUtLNV9NS0tDLCAgICAgTUtLNSwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjE1IH0sCisKKwkvKiBNS0s2ICovCisJe01LSzZfTUtLQiwgICAgIE1LSzYsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMTYgfSwKKwl7TUtLNl9NS0tBMiwgICAgTUtLNiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjE3IH0sCisJe01LSzZfTUtLQywgICAgIE1LSzYsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEsIENUUllfSkFQQU4xOCB9LAorCXtNS0s2X01LS0ExLCAgICBNS0s2LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU4zMCB9LAorCXtNS0s2X0ZDQ0EsICAgICBNS0s2LAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjMxIH0sCisKKwkvKiBNS0s3ICovCisJe01LSzdfTUtLQiwgICAgIE1LSzcsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjE5IH0sCisJe01LSzdfTUtLQSwgICAgIE1LSzcsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFOMjAgfSwKKwl7TUtLN19NS0tDLCAgICAgTUtLNywJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMsIENUUllfSkFQQU4yMSB9LAorCXtNS0s3X01LS0ExLCAgICBNS0s3LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU4zMiB9LAorCXtNS0s3X0ZDQ0EsICAgICBNS0s3LAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjMzIH0sCisKKwkvKiBNS0s4ICovCisJe01LSzhfTUtLQiwgICAgIE1LSzgsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjIyIH0sCisJe01LSzhfTUtLQTIsICAgIE1LSzgsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFOMjMgfSwKKwl7TUtLOF9NS0tDLCAgICAgTUtLOCwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgLCBDVFJZX0pBUEFOMjQgfSwKKworICAgCS8qIE1LSzkgKi8KKwl7TUtLOV9NS0tBLCAgICAgTUtLOSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4zNCB9LAorCXtNS0s5X0ZDQ0EsICAgICBNS0s5LAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjM3IH0sCisJe01LSzlfTUtLQTEsICAgIE1LSzksCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjM4IH0sCisJe01LSzlfTUtLQywgICAgIE1LSzksCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzkgfSwKKwl7TUtLOV9NS0tBMiwJTUtLOSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU40MCB9LAorCisJLyogTUtLMTAgKi8KKwl7TUtLMTBfTUtLQSwJTUtLMTAsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzUgfSwKKwl7TUtLMTBfRkNDQSwJTUtLMTAsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONDEgfSwKKwl7TUtLMTBfTUtLQTEsCU1LSzEwLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU40MiB9LAorCXtNS0sxMF9NS0tDLAlNS0sxMCwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU40MyB9LAorCXtNS0sxMF9NS0tBMiwJTUtLMTAsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFONDQgfSwKKworCS8qIE1LSzExICovCisJe01LSzExX01LS0EsCU1LSzExLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjQ1IH0sCisJe01LSzExX0ZDQ0EsCU1LSzExLAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjQ2IH0sCisJe01LSzExX01LS0ExLAlNS0sxMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFONDcgfSwKKwl7TUtLMTFfTUtLQywJTUtLMTEsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONDggfSwKKwl7TUtLMTFfTUtLQTIsCU1LSzExLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjQ5IH0sCisKKwkvKiBNS0sxMiAqLworCXtNS0sxMl9NS0tBLAlNS0sxMiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU41MCB9LAorCXtNS0sxMl9GQ0NBLAlNS0sxMiwJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU41MSB9LAorCXtNS0sxMl9NS0tBMSwJTUtLMTIsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjUyIH0sCisJe01LSzEyX01LS0MsCU1LSzEyLAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjUzIH0sCisJe01LSzEyX01LS0EyLAlNS0sxMiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU41NCB9LAorCisKKwkvKiBUaGVzZSBhcmUgc3VwZXIgZG9tYWlucyAqLworCXtXT1IwX1dPUkxELAlXT1IwX1dPUkxELAlXT1IwX1dPUkxELAlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SMV9XT1JMRCwJV09SMV9XT1JMRCwJV09SMV9XT1JMRCwJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SMl9XT1JMRCwJV09SMl9XT1JMRCwJV09SMl9XT1JMRCwJRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SM19XT1JMRCwJV09SM19XT1JMRCwJV09SM19XT1JMRCwJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjRfV09STEQsCVdPUjRfV09STEQsCVdPUjRfV09STEQsCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjVfRVRTSUMsCVdPUjVfRVRTSUMsCVdPUjVfRVRTSUMsCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjAxX1dPUkxELAlXT1IwMV9XT1JMRCwJV09SMDFfV09STEQsCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1IwMl9XT1JMRCwJV09SMDJfV09STEQsCVdPUjAyX1dPUkxELAlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RVUxX1dPUkxELAkgICAgRVUxX1dPUkxELAlFVTFfV09STEQsCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1I5X1dPUkxELAlXT1I5X1dPUkxELAlXT1I5X1dPUkxELAlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1JBX1dPUkxELAlXT1JBX1dPUkxELAlXT1JBX1dPUkxELAlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorfTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdGFibGUgaXMgdGhlIG1hc3RlciBsaXN0IGZvciBhbGwgZGlmZmVyZW50IGZyZXFldW5jeQorICogYmFuZHMgd2l0aCB0aGUgY29tcGxldGUgbWF0cml4IG9mIGFsbCBwb3NzaWJsZSBmbGFncyBhbmQgc2V0dGluZ3MKKyAqIGZvciBlYWNoIGJhbmQgaWYgaXQgaXMgdXNlZCBpbiBBTlkgcmVnIGRvbWFpbi4KKyAqLworCisjZGVmaW5lIERFRl9SRUdETU4JCUZDQzFfRkNDQQorI2RlZmluZQlERUZfRE1OXzUJCUZDQzEKKyNkZWZpbmUJREVGX0RNTl8yCQlGQ0NBCisjZGVmaW5lCUNPVU5UUllfRVJEX0ZMQUcgICAgICAgIDB4ODAwMAorI2RlZmluZSBXT1JMRFdJREVfUk9BTUlOR19GTEFHICAweDQwMDAKKyNkZWZpbmUJU1VQRVJfRE9NQUlOX01BU0sJMHgwZmZmCisjZGVmaW5lCUNPVU5UUllfQ09ERV9NQVNLCTB4MDNmZgorI2RlZmluZSBDRl9JTlRFUkZFUkVOQ0UJCShDSEFOTkVMX0NXX0lOVCB8IENIQU5ORUxfUkFEQVJfSU5UKQorI2RlZmluZSBDSEFOTkVMXzE0CQkoMjQ4NCkJLyogODAyLjExZyBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCBvbiBjaGFubmVsIDE0ICovCisjZGVmaW5lIElTXzExR19DSDE0KF9jaCxfY2YpIFwKKwkoKChfY2gpID09IENIQU5ORUxfMTQpICYmICgoX2NmKSA9PSBDSEFOTkVMX0cpKQorCisjZGVmaW5lCVlFUwlUUlVFCisjZGVmaW5lCU5PCUZBTFNFCisKK2VudW0geworCUNUUllfREVCVUcJPSAweDFmZiwJCS8qIGRlYnVnIGNvdW50cnkgY29kZSAqLworCUNUUllfREVGQVVMVAk9IDAJCQkvKiBkZWZhdWx0IGNvdW50cnkgY29kZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUhBTF9DVFJZX0NPREUJY291bnRyeUNvZGU7CisJSEFMX1JFR19ET01BSU4JcmVnRG1uRW51bTsKKwljb25zdCBjaGFyKgkJaXNvTmFtZTsKKwljb25zdCBjaGFyKgkJbmFtZTsKKwlIQUxfQk9PTAkJYWxsb3cxMWc7CisJSEFMX0JPT0wJCWFsbG93MTFhVHVyYm87CisJSEFMX0JPT0wJCWFsbG93MTFnVHVyYm87CisgICAgSEFMX0JPT0wgICAgICAgIGFsbG93MTFuYTsgICAgICAvKiBIVC00MCBhbGxvd2VkIGluIDVHSHo/ICovCisgICAgSEFMX0JPT0wgICAgICAgIGFsbG93MTFuZzsgICAgICAvKiBIVC00MCBhbGxvd2VkIGluIDJHSHo/ICovCisJdTE2X3QJCW91dGRvb3JDaGFuU3RhcnQ7Cit9IENPVU5UUllfQ09ERV9UT19FTlVNX1JEOworCitzdGF0aWMgQ09VTlRSWV9DT0RFX1RPX0VOVU1fUkQgYWxsQ291bnRyaWVzW10gPSB7CisgICAge0NUUllfREVCVUcsICAgICAgIE5PX0VOVU1SRCwgICAgICJEQiIsICJERUJVRyIsICAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfREVGQVVMVCwgICAgIERFRl9SRUdETU4sICAgICJOQSIsICJOT19DT1VOVFJZX1NFVCIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQUxCQU5JQSwgICAgIE5VTEwxX1dPUkxELCAgICJBTCIsICJBTEJBTklBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQUxHRVJJQSwgICAgIE5VTEwxX1dPUkxELCAgICJEWiIsICJBTEdFUklBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQVJHRU5USU5BLCAgIEFQTDNfV09STEQsICAgICJBUiIsICJBUkdFTlRJTkEiLCAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfQVJNRU5JQSwgICAgIEVUU0k0X1dPUkxELCAgICJBTSIsICJBUk1FTklBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQVVTVFJBTElBLCAgIEZDQzZfV09STEQsICAgICJBVSIsICJBVVNUUkFMSUEiLCAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQVVTVFJJQSwgICAgIEVUU0kyX1dPUkxELCAgICJBVCIsICJBVVNUUklBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQVpFUkJBSUpBTiwgIEVUU0k0X1dPUkxELCAgICJBWiIsICJBWkVSQkFJSkFOIiwgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQkFIUkFJTiwgICAgIEFQTDZfV09STEQsICAgICJCSCIsICJCQUhSQUlOIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQkVMQVJVUywgICAgIEVUU0kxX1dPUkxELCAgICJCWSIsICJCRUxBUlVTIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQkVMR0lVTSwgICAgIEVUU0kxX1dPUkxELCAgICJCRSIsICJCRUxHSVVNIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQkVMSVpFLCAgICAgIEFQTDFfRVRTSUMsICAgICJCWiIsICJCRUxJWkUiLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQk9MSVZJQSwgICAgIEFQTDFfRVRTSUMsICAgICJCTyIsICJCT0xWSUEiLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQlJBWklMLCAgICAgIEZDQzNfV09STEQsICAgICJCUiIsICJCUkFaSUwiLCAgICAgICAgIE5PLCAgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfQlJVTkVJX0RBUlVTU0FMQU0sQVBMMV9XT1JMRCwiQk4iLCAiQlJVTkVJIERBUlVTU0FMQU0iLCBZRVMsIFlFUywgWUVTLCAgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CVUxHQVJJQSwgICAgRVRTSTZfV09STEQsICAgIkJHIiwgIkJVTEdBUklBIiwgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9DQU5BREEsICAgICAgRkNDNl9GQ0NBLCAgICAgIkNBIiwgIkNBTkFEQSIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9DSElMRSwgICAgICAgQVBMNl9XT1JMRCwgICAgIkNMIiwgIkNISUxFIiwgICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9DSElOQSwgICAgICAgQVBMMV9XT1JMRCwgICAgIkNOIiwgIkNISU5BIiwgICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9DT0xPTUJJQSwgICAgRkNDMV9GQ0NBLCAgICAgIkNPIiwgIkNPTE9NQklBIiwgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9DT1NUQV9SSUNBLCAgRkNDMV9XT1JMRCwgICAgIkNSIiwgIkNPU1RBIFJJQ0EiLCAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9DUk9BVElBLCAgICAgRVRTSTNfV09STEQsICAgIkhSIiwgIkNST0FUSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9DWVBSVVMsICAgICAgRVRTSTNfV09STEQsICAgIkNZIiwgIkNZUFJVUyIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9DWkVDSCwgICAgICAgRVRTSTNfV09STEQsICAgIkNaIiwgIkNaRUNIIFJFUFVCTElDIiwgWUVTLCBOTywgWUVTLCAgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ERU5NQVJLLCAgICAgRVRTSTFfV09STEQsICAgIkRLIiwgIkRFTk1BUksiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ET01JTklDQU5fUkVQVUJMSUMsRkNDMV9GQ0NBLCJETyIsICJET01JTklDQU4gUkVQVUJMSUMiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0VDVUFET1IsICAgICBGQ0MxX1dPUkxELCAgICAiRUMiLCAiRUNVQURPUiIsICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0VHWVBULCAgICAgICBFVFNJM19XT1JMRCwgICAiRUciLCAiRUdZUFQiLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0VMX1NBTFZBRE9SLCBGQ0MxX1dPUkxELCAgICAiU1YiLCAiRUwgU0FMVkFET1IiLCAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0VTVE9OSUEsICAgICBFVFNJMV9XT1JMRCwgICAiRUUiLCAiRVNUT05JQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0ZJTkxBTkQsICAgICBFVFNJMV9XT1JMRCwgICAiRkkiLCAiRklOTEFORCIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0ZSQU5DRSwgICAgICBFVFNJMV9XT1JMRCwgICAiRlIiLCAiRlJBTkNFIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0ZSQU5DRTIsICAgICBFVFNJM19XT1JMRCwgICAiRjIiLCAiRlJBTkNFX1JFUyIsICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0dFT1JHSUEsICAgICBFVFNJNF9XT1JMRCwgICAiR0UiLCAiR0VPUkdJQSIsICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0dFUk1BTlksICAgICBFVFNJMV9XT1JMRCwgICAiREUiLCAiR0VSTUFOWSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0dSRUVDRSwgICAgICBFVFNJMV9XT1JMRCwgICAiR1IiLCAiR1JFRUNFIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0dVQVRFTUFMQSwgICBGQ0MxX0ZDQ0EsICAgICAiR1QiLCAiR1VBVEVNQUxBIiwgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0hPTkRVUkFTLCAgICBOVUxMMV9XT1JMRCwgICAiSE4iLCAiSE9ORFVSQVMiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0hPTkdfS09ORywgICBGQ0MyX1dPUkxELCAgICAiSEsiLCAiSE9ORyBLT05HIiwgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0hVTkdBUlksICAgICBFVFNJNF9XT1JMRCwgICAiSFUiLCAiSFVOR0FSWSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0lDRUxBTkQsICAgICBFVFNJMV9XT1JMRCwgICAiSVMiLCAiSUNFTEFORCIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0lORElBLCAgICAgICBBUEw2X1dPUkxELCAgICAiSU4iLCAiSU5ESUEiLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0lORE9ORVNJQSwgICBBUEwxX1dPUkxELCAgICAiSUQiLCAiSU5ET05FU0lBIiwgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0lSQU4sICAgICAgICBBUEwxX1dPUkxELCAgICAiSVIiLCAiSVJBTiIsICAgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0lSRUxBTkQsICAgICBFVFNJMV9XT1JMRCwgICAiSUUiLCAiSVJFTEFORCIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0lTUkFFTCwgICAgICBFVFNJM19XT1JMRCwgICAiSUwiLCAiSVNSQUVMIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0lTUkFFTDIsICAgICBOVUxMMV9FVFNJQiwgICAiSVNSIiwiSVNSQUVMX1JFUyIsICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0lUQUxZLCAgICAgICBFVFNJMV9XT1JMRCwgICAiSVQiLCAiSVRBTFkiLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0pBTUFJQ0EsICAgICBFVFNJMV9XT1JMRCwgICAiSk0iLCAiSkFNQUlDQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOLCAgICAgICBNS0sxX01LS0EsICAgICAiSlAiLCAiSkFQQU4iLCAgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMSwgICAgICBNS0sxX01LS0IsICAgICAiSjEiLCAiSkFQQU4xIiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMiwgICAgICBNS0sxX0ZDQ0EsICAgICAiSjIiLCAiSkFQQU4yIiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMywgICAgICBNS0syX01LS0EsICAgICAiSjMiLCAiSkFQQU4zIiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONCwgICAgICBNS0sxX01LS0ExLCAgICAiSjQiLCAiSkFQQU40IiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONSwgICAgICBNS0sxX01LS0EyLCAgICAiSjUiLCAiSkFQQU41IiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONiwgICAgICBNS0sxX01LS0MsICAgICAiSjYiLCAiSkFQQU42IiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONywgICAgICBNS0szX01LS0IsICAgICAiSjciLCAiSkFQQU43IiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOOCwgICAgICBNS0szX01LS0EyLCAgICAiSjgiLCAiSkFQQU44IiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOOSwgICAgICBNS0szX01LS0MsICAgICAiSjkiLCAiSkFQQU45IiwgICAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTAsICAgICBNS0s0X01LS0IsICAgICAiSjEwIiwgIkpBUEFOMTAiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTEsICAgICBNS0s0X01LS0EyLCAgICAiSjExIiwgIkpBUEFOMTEiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTIsICAgICBNS0s0X01LS0MsICAgICAiSjEyIiwgIkpBUEFOMTIiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTMsICAgICBNS0s1X01LS0IsICAgICAiSjEzIiwgIkpBUEFOMTMiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTQsICAgICBNS0s1X01LS0EyLCAgICAiSjE0IiwgIkpBUEFOMTQiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTUsICAgICBNS0s1X01LS0MsICAgICAiSjE1IiwgIkpBUEFOMTUiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTYsICAgICBNS0s2X01LS0IsICAgICAiSjE2IiwgIkpBUEFOMTYiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTcsICAgICBNS0s2X01LS0EyLCAgICAiSjE3IiwgIkpBUEFOMTciLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTgsICAgICBNS0s2X01LS0MsICAgICAiSjE4IiwgIkpBUEFOMTgiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMTksICAgICBNS0s3X01LS0IsICAgICAiSjE5IiwgIkpBUEFOMTkiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjAsICAgICBNS0s3X01LS0EsICAgICAiSjIwIiwgIkpBUEFOMjAiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjEsICAgICBNS0s3X01LS0MsICAgICAiSjIxIiwgIkpBUEFOMjEiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjIsICAgICBNS0s4X01LS0IsICAgICAiSjIyIiwgIkpBUEFOMjIiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjMsICAgICBNS0s4X01LS0EyLCAgICAiSjIzIiwgIkpBUEFOMjMiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjQsICAgICBNS0s4X01LS0MsICAgICAiSjI0IiwgIkpBUEFOMjQiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjUsICAgICBNS0szX01LS0EsICAgICAiSjI1IiwgIkpBUEFOMjUiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjYsICAgICBNS0szX01LS0ExLCAgICAiSjI2IiwgIkpBUEFOMjYiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjcsICAgICBNS0szX0ZDQ0EsICAgICAiSjI3IiwgIkpBUEFOMjciLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjgsICAgICBNS0s0X01LS0ExLCAgICAiSjI4IiwgIkpBUEFOMjgiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMjksICAgICBNS0s0X0ZDQ0EsICAgICAiSjI5IiwgIkpBUEFOMjkiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzAsICAgICBNS0s2X01LS0ExLCAgICAiSjMwIiwgIkpBUEFOMzAiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzEsICAgICBNS0s2X0ZDQ0EsICAgICAiSjMxIiwgIkpBUEFOMzEiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzIsICAgICBNS0s3X01LS0ExLCAgICAiSjMyIiwgIkpBUEFOMzIiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzMsICAgICBNS0s3X0ZDQ0EsICAgICAiSjMzIiwgIkpBUEFOMzMiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzQsICAgICBNS0s5X01LS0EsICAgICAiSjM0IiwgIkpBUEFOMzQiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzUsICAgICBNS0sxMF9NS0tBLCAgICAiSjM1IiwgIkpBUEFOMzUiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzYsICAgICBNS0s0X01LS0EsICAgICAiSjM2IiwgIkpBUEFOMzYiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzcsICAgICBNS0s5X0ZDQ0EsICAgICAiSjM3IiwgIkpBUEFOMzciLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzgsICAgICBNS0s5X01LS0ExLCAgICAiSjM4IiwgIkpBUEFOMzgiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFOMzksICAgICBNS0s5X01LS0MsICAgICAiSjM5IiwgIkpBUEFOMzkiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDAsICAgICBNS0sxMF9NS0tBMiwgICAiSjQwIiwgIkpBUEFONDAiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDEsICAgICBNS0sxMF9GQ0NBLCAgICAiSjQxIiwgIkpBUEFONDEiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDIsICAgICBNS0sxMF9NS0tBMSwgICAiSjQyIiwgIkpBUEFONDIiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDMsICAgICBNS0sxMF9NS0tDLCAgICAiSjQzIiwgIkpBUEFONDMiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDQsICAgICBNS0sxMF9NS0tBMiwgICAiSjQ0IiwgIkpBUEFONDQiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDUsICAgICBNS0sxMV9NS0tBLCAgICAiSjQ1IiwgIkpBUEFONDUiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDYsICAgICBNS0sxMV9GQ0NBLCAgICAiSjQ2IiwgIkpBUEFONDYiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDcsICAgICBNS0sxMV9NS0tBMSwgICAiSjQ3IiwgIkpBUEFONDciLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDgsICAgICBNS0sxMV9NS0tDLCAgICAiSjQ4IiwgIkpBUEFONDgiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONDksICAgICBNS0sxMV9NS0tBMiwgICAiSjQ5IiwgIkpBUEFONDkiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONTAsICAgICBNS0sxMl9NS0tBLCAgICAiSjUwIiwgIkpBUEFONTAiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONTEsICAgICBNS0sxMl9GQ0NBLCAgICAiSjUxIiwgIkpBUEFONTEiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONTIsICAgICBNS0sxMl9NS0tBMSwgICAiSjUyIiwgIkpBUEFONTIiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONTMsICAgICBNS0sxMl9NS0tDLCAgICAiSjUzIiwgIkpBUEFONTMiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pBUEFONTQsICAgICBNS0sxMl9NS0tBMiwgICAiSjU0IiwgIkpBUEFONTQiLCAgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0pPUkRBTiwgICAgICBFVFNJMl9XT1JMRCwgICAiSk8iLCAiSk9SREFOIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0tBWkFLSFNUQU4sICBOVUxMMV9XT1JMRCwgICAiS1oiLCAiS0FaQUtIU1RBTiIsICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0tPUkVBX05PUlRILCBBUEw5X1dPUkxELCAgICAiS1AiLCAiTk9SVEggS09SRUEiLCAgICBZRVMsIE5PLCAgTk8sICBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0tPUkVBX1JPQywgICBBUEw5X1dPUkxELCAgICAiS1IiLCAiS09SRUEgUkVQVUJMSUMiLCBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0tPUkVBX1JPQzIsICBBUEwyX0FQTEQsICAgICAiSzIiLCAiS09SRUEgUkVQVUJMSUMyIixZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0tPUkVBX1JPQzMsICBBUEw5X1dPUkxELCAgICAiSzMiLCAiS09SRUEgUkVQVUJMSUMzIixZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0tVV0FJVCwgICAgICBOVUxMMV9XT1JMRCwgICAiS1ciLCAiS1VXQUlUIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0xBVFZJQSwgICAgICBFVFNJMV9XT1JMRCwgICAiTFYiLCAiTEFUVklBIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0xFQkFOT04sICAgICBOVUxMMV9XT1JMRCwgICAiTEIiLCAiTEVCQU5PTiIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0xJRUNIVEVOU1RFSU4sRVRTSTFfV09STEQsICAiTEkiLCAiTElFQ0hURU5TVEVJTiIsICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0xJVEhVQU5JQSwgICBFVFNJMV9XT1JMRCwgICAiTFQiLCAiTElUSFVBTklBIiwgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0xVWEVNQk9VUkcsICBFVFNJMV9XT1JMRCwgICAiTFUiLCAiTFVYRU1CT1VSRyIsICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX01BQ0FVLCAgICAgICBGQ0MyX1dPUkxELCAgICAiTU8iLCAiTUFDQVUiLCAgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX01BQ0VET05JQSwgICBOVUxMMV9XT1JMRCwgICAiTUsiLCAiTUFDRURPTklBIiwgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX01BTEFZU0lBLCAgICBBUEw4X1dPUkxELCAgICAiTVkiLCAiTUFMQVlTSUEiLCAgICAgICBOTywgIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX01BTFRBLCAgICAgICBFVFNJMV9XT1JMRCwgICAiTVQiLCAiTUFMVEEiLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX01FWElDTywgICAgICBGQ0MxX0ZDQ0EsICAgICAiTVgiLCAiTUVYSUNPIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX01PTkFDTywgICAgICBFVFNJNF9XT1JMRCwgICAiTUMiLCAiTU9OQUNPIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX01PUk9DQ08sICAgICBOVUxMMV9XT1JMRCwgICAiTUEiLCAiTU9ST0NDTyIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX05FVEhFUkxBTkRTLCBFVFNJMV9XT1JMRCwgICAiTkwiLCAiTkVUSEVSTEFORFMiLCAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX05FVEhFUkxBTkRTX0FOVCwgRVRTSTFfV09STEQsICJBTiIsICJORVRIRVJMQU5EUy1BTlRJTExFUyIsIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTkVXX1pFQUxBTkQsIEZDQzJfRVRTSUMsICAgICJOWiIsICJORVcgWkVBTEFORCIsICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTk9SV0FZLCAgICAgIEVUU0kxX1dPUkxELCAgICJOTyIsICJOT1JXQVkiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfT01BTiwgICAgICAgIEFQTDZfV09STEQsICAgICJPTSIsICJPTUFOIiwgICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUEFLSVNUQU4sICAgIE5VTEwxX1dPUkxELCAgICJQSyIsICJQQUtJU1RBTiIsICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUEFOQU1BLCAgICAgIEZDQzFfRkNDQSwgICAgICJQQSIsICJQQU5BTUEiLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUEVSVSwgICAgICAgIEFQTDFfV09STEQsICAgICJQRSIsICJQRVJVIiwgICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUEhJTElQUElORVMsIEFQTDFfV09STEQsICAgICJQSCIsICJQSElMSVBQSU5FUyIsICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUE9MQU5ELCAgICAgIEVUU0kxX1dPUkxELCAgICJQTCIsICJQT0xBTkQiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUE9SVFVHQUwsICAgIEVUU0kxX1dPUkxELCAgICJQVCIsICJQT1JUVUdBTCIsICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUFVFUlRPX1JJQ08sIEZDQzFfRkNDQSwgICAgICJQUiIsICJQVUVSVE8gUklDTyIsICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUUFUQVIsICAgICAgIE5VTEwxX1dPUkxELCAgICJRQSIsICJRQVRBUiIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUk9NQU5JQSwgICAgIE5VTEwxX1dPUkxELCAgICJSTyIsICJST01BTklBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfUlVTU0lBLCAgICAgIE5VTEwxX1dPUkxELCAgICJSVSIsICJSVVNTSUEiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU0FVRElfQVJBQklBLE5VTEwxX1dPUkxELCAgICJTQSIsICJTQVVESSBBUkFCSUEiLCAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU0VSQklBX01PTlQsIEVUU0kxX1dPUkxELCAgICJDUyIsICJTRVJCSUEgJiBNT05URU5FR1JPIiwgWUVTLCBOTywgIFlFUywgWUVTLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU0lOR0FQT1JFLCAgIEFQTDZfV09STEQsICAgICJTRyIsICJTSU5HQVBPUkUiLCAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU0xPVkFLSUEsICAgIEVUU0kxX1dPUkxELCAgICJTSyIsICJTTE9WQUsgUkVQVUJMSUMiLFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU0xPVkVOSUEsICAgIEVUU0kxX1dPUkxELCAgICJTSSIsICJTTE9WRU5JQSIsICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU09VVEhfQUZSSUNBLEZDQzNfV09STEQsICAgICJaQSIsICJTT1VUSCBBRlJJQ0EiLCAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU1BBSU4sICAgICAgIEVUU0kxX1dPUkxELCAgICJFUyIsICJTUEFJTiIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU1JJTEFOS0EsICAgIEZDQzNfV09STEQsICAgICJMSyIsICJTUkkgTEFOS0EiLCAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU1dFREVOLCAgICAgIEVUU0kxX1dPUkxELCAgICJTRSIsICJTV0VERU4iLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU1dJVFpFUkxBTkQsIEVUU0kxX1dPUkxELCAgICJDSCIsICJTV0lUWkVSTEFORCIsICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfU1lSSUEsICAgICAgIE5VTEwxX1dPUkxELCAgICJTWSIsICJTWVJJQSIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVEFJV0FOLCAgICAgIEFQTDNfRkNDQSwgICAgICJUVyIsICJUQUlXQU4iLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVEhBSUxBTkQsICAgIE5VTEwxX1dPUkxELCAgICJUSCIsICJUSEFJTEFORCIsICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVFJJTklEQURfWV9UT0JBR08sRVRTSTRfV09STEQsIlRUIiwgIlRSSU5JREFEICYgVE9CQUdPIiwgWUVTLCBOTywgWUVTLCBOTywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVFVOSVNJQSwgICAgIEVUU0kzX1dPUkxELCAgICJUTiIsICJUVU5JU0lBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVFVSS0VZLCAgICAgIEVUU0kzX1dPUkxELCAgICJUUiIsICJUVVJLRVkiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVUtSQUlORSwgICAgIE5VTEwxX1dPUkxELCAgICJVQSIsICJVS1JBSU5FIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVUFFLCAgICAgICAgIE5VTEwxX1dPUkxELCAgICJBRSIsICJVTklURUQgQVJBQiBFTUlSQVRFUyIsIFlFUywgTk8sIFlFUywgTk8sIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1VOSVRFRF9LSU5HRE9NLCBFVFNJMV9XT1JMRCwiR0IiLCAiVU5JVEVEIEtJTkdET00iLCBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1VOSVRFRF9TVEFURVMsIEZDQzNfRkNDQSwgICAiVVMiLCAiVU5JVEVEIFNUQVRFUyIsICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNTgyNSB9LAorICAgIHtDVFJZX1VOSVRFRF9TVEFURVNfRkNDNDksIEZDQzRfRkNDQSwgICAiUFMiLCAiVU5JVEVEIFNUQVRFUyAoUFVCTElDIFNBRkVUWSkiLCAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9VUlVHVUFZLCAgICAgRkNDMV9XT1JMRCwgICAgIlVZIiwgIlVSVUdVQVkiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9VWkJFS0lTVEFOLCAgRkNDM19GQ0NBLCAgICAgIlVaIiwgIlVaQkVLSVNUQU4iLCAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9WRU5FWlVFTEEsICAgQVBMMl9FVFNJQywgICAgIlZFIiwgIlZFTkVaVUVMQSIsICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9WSUVUX05BTSwgICAgTlVMTDFfV09STEQsICAgIlZOIiwgIlZJRVQgTkFNIiwgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ZRU1FTiwgICAgICAgTlVMTDFfV09STEQsICAgIllFIiwgIllFTUVOIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9aSU1CQUJXRSwgICAgTlVMTDFfV09STEQsICAgIlpXIiwgIlpJTUJBQldFIiwgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUmVnRG1uRnJlcUJhbmQgeworCXUxNl90CWxvd0NoYW5uZWw7CS8qIExvdyBjaGFubmVsIGNlbnRlciBpbiBNSHogKi8KKwl1MTZfdAloaWdoQ2hhbm5lbDsJLyogSGlnaCBDaGFubmVsIGNlbnRlciBpbiBNSHogKi8KKwl1OF90CXBvd2VyRGZzOwkvKiBNYXggcG93ZXIgKGRCbSkgZm9yIGNoYW5uZWwKKwkJCQkJICAgcmFuZ2Ugd2hlbiB1c2luZyBERlMgKi8KKwl1OF90CWFudGVubmFNYXg7CS8qIE1heCBhbGxvd2VkIGFudGVubmEgZ2FpbiAqLworCXU4X3QJY2hhbm5lbEJXOwkvKiBCYW5kd2lkdGggb2YgdGhlIGNoYW5uZWwgKi8KKwl1OF90CWNoYW5uZWxTZXA7CS8qIENoYW5uZWwgc2VwYXJhdGlvbiB3aXRoaW4KKwkJCQkJICAgdGhlIGJhbmQgKi8KKwl1NjRfdAl1c2VEZnM7CQkvKiBVc2UgREZTIGluIHRoZSBSZWdEb21haW4KKwkJCQkJICAgaWYgY29ycmVzcG9uZGluZyBiaXQgaXMgc2V0ICovCisJdTY0X3QJdXNlUGFzc1NjYW47CS8qIFVzZSBQYXNzaXZlIFNjYW4gaW4gdGhlIFJlZ0RvbWFpbgorCQkJCQkgICBpZiBjb3JyZXNwb25kaW5nIGJpdCBpcyBzZXQgKi8KKwl1OF90CXJlZ0NsYXNzSWQ7CS8qIFJlZ3VsYXRvcnkgY2xhc3MgaWQgKi8KKwl1OF90CXVzZUV4dENoYW5EZnM7CS8qIFJlZ3VsYXRvcnkgY2xhc3MgaWQgKi8KK30gUkVHX0RNTl9GUkVRX0JBTkQ7CisKKy8qIEJpdCBtYXNrcyBmb3IgREZTIHBlciByZWdkb21haW4gKi8KKworZW51bSB7CisJTk9fREZTICAgPSAweDAwMDAwMDAwMDAwMDAwMDBVTEwsCisJREZTX0ZDQzMgPSAweDAwMDAwMDAwMDAwMDAwMDFVTEwsCisJREZTX0VUU0kgPSAweDAwMDAwMDAwMDAwMDAwMDJVTEwsCisJREZTX01LSzQgPSAweDAwMDAwMDAwMDAwMDAwMDRVTEwsCit9OworCisvKiBUaGUgdGFibGUgb2YgZnJlcXVlbmN5IGJhbmRzIGlzIGluZGV4ZWQgYnkgYSBiaXRtYXNrLiAgVGhlIG9yZGVyaW5nCisgKiBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZW51bSBiZWxvdy4gIFdoZW4gYWRkaW5nIGEgbmV3CisgKiBmcmVxdWVuY3kgYmFuZCwgYmUgc3VyZSB0byBtYXRjaCB0aGUgbG9jYXRpb24gaW4gdGhlIGVudW0gd2l0aCB0aGUKKyAqIGNvbW1lbnRzCisgKi8KKworLyoKKyAqIDVHSHogMTFBIGNoYW5uZWwgdGFncworICovCisKK2VudW0geworCUYxXzQ5MTVfNDkyNSwKKwlGMV80OTM1XzQ5NDUsCisJRjFfNDkyMF80OTgwLAorCUYxXzQ5NDJfNDk4NywKKwlGMV80OTQ1XzQ5ODUsCisJRjFfNDk1MF80OTgwLAorCUYxXzUwMzVfNTA0MCwKKwlGMV81MDQwXzUwODAsCisJRjFfNTA1NV81MDU1LAorCisJRjFfNTEyMF81MjQwLAorCisJRjFfNTE3MF81MjMwLAorCUYyXzUxNzBfNTIzMCwKKworCUYxXzUxODBfNTI0MCwKKwlGMl81MTgwXzUyNDAsCisJRjNfNTE4MF81MjQwLAorCUY0XzUxODBfNTI0MCwKKwlGNV81MTgwXzUyNDAsCisJRjZfNTE4MF81MjQwLAorCUY3XzUxODBfNTI0MCwKKworCUYxXzUxODBfNTMyMCwKKworCUYxXzUyNDBfNTI4MCwKKworCUYxXzUyNjBfNTI4MCwKKworCUYxXzUyNjBfNTMyMCwKKwlGMl81MjYwXzUzMjAsCisJRjNfNTI2MF81MzIwLAorCUY0XzUyNjBfNTMyMCwKKwlGNV81MjYwXzUzMjAsCisJRjZfNTI2MF81MzIwLAorCUY3XzUyNjBfNTMyMCwKKworCUYxXzUyNjBfNTcwMCwKKworCUYxXzUyODBfNTMyMCwKKworICAgIEYxXzU1MDBfNTU4MCwKKworCUYxXzU1MDBfNTYyMCwKKworCUYxXzU1MDBfNTcwMCwKKwlGMl81NTAwXzU3MDAsCisJRjNfNTUwMF81NzAwLAorCUY0XzU1MDBfNTcwMCwKKworICAgIEYxXzU2NjBfNTcwMCwKKworCUYxXzU3NDVfNTgwNSwKKwlGMl81NzQ1XzU4MDUsCisJRjNfNTc0NV81ODA1LAorCisJRjFfNTc0NV81ODI1LAorCUYyXzU3NDVfNTgyNSwKKwlGM181NzQ1XzU4MjUsCisJRjRfNTc0NV81ODI1LAorCUY1XzU3NDVfNTgyNSwKKwlGNl81NzQ1XzU4MjUsCisKKwlXMV80OTIwXzQ5ODAsCisJVzFfNTA0MF81MDgwLAorCVcxXzUxNzBfNTIzMCwKKwlXMV81MTgwXzUyNDAsCisJVzFfNTI2MF81MzIwLAorCVcxXzU3NDVfNTgyNSwKKwlXMV81NTAwXzU3MDAsCisJVzJfNTI2MF81MzIwLAorICAgICAgICBXMl81MTgwXzUyNDAsCisJVzJfNTgyNV81ODI1LAorfTsKKworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjVHaHpGcmVxW10gPSB7CisJeyA0OTE1LCA0OTI1LCAyMywgMCwgMTAsIDUsIE5PX0RGUywgUFNDQU5fTUtLMiwgMTYsIDAgfSwJCS8qIEYxXzQ5MTVfNDkyNSAqLworCXsgNDkzNSwgNDk0NSwgMjMsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDE2LCAwIH0sCQkvKiBGMV80OTM1XzQ5NDUgKi8KKwl7IDQ5MjAsIDQ5ODAsIDIzLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fTUtLMiwgNywgMCB9LAkJLyogRjFfNDkyMF80OTgwICovCisJeyA0OTQyLCA0OTg3LCAyNywgNiwgNSwgIDUsIERGU19GQ0MzLCBQU0NBTl9GQ0MsIDAsIDAgfSwJCS8qIEYxXzQ5NDJfNDk4NyAqLworCXsgNDk0NSwgNDk4NSwgMzAsIDYsIDEwLCA1LCBERlNfRkNDMywgUFNDQU5fRkNDLCAwLCAwIH0sCQkvKiBGMV80OTQ1XzQ5ODUgKi8KKwl7IDQ5NTAsIDQ5ODAsIDMzLCA2LCAyMCwgNSwgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgMCwgMCB9LAkJLyogRjFfNDk1MF80OTgwICovCisJeyA1MDM1LCA1MDQwLCAyMywgMCwgMTAsIDUsIE5PX0RGUywgUFNDQU5fTUtLMiwgMTIsIDAgfSwJCS8qIEYxXzUwMzVfNTA0MCAqLworCXsgNTA0MCwgNTA4MCwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9NS0syLCAyLCAwIH0sCQkvKiBGMV81MDQwXzUwODAgKi8KKwl7IDUwNTUsIDUwNTUsIDIzLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxMiwgMCB9LAkJLyogRjFfNTA1NV81MDU1ICovCisKKwl7IDUxMjAsIDUyNDAsIDUsICA2LCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkvKiBGMV81MTIwXzUyNDAgKi8KKworCXsgNTE3MCwgNTIzMCwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMiwgMSwgMCB9LAkvKiBGMV81MTcwXzUyMzAgKi8KKwl7IDUxNzAsIDUyMzAsIDIwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzIsIDEsIDAgfSwJLyogRjJfNTE3MF81MjMwICovCisKKwl7IDUxODAsIDUyNDAsIDE1LCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGMV81MTgwXzUyNDAgKi8KKwl7IDUxODAsIDUyNDAsIDE3LCA2LCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDLCAxLCAwIH0sCQkJCS8qIEYyXzUxODBfNTI0MCAqLworCXsgNTE4MCwgNTI0MCwgMTgsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYzXzUxODBfNTI0MCAqLworCXsgNTE4MCwgNTI0MCwgMjAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEY0XzUxODBfNTI0MCAqLworCXsgNTE4MCwgNTI0MCwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEY1XzUxODBfNTI0MCAqLworCXsgNTE4MCwgNTI0MCwgMjMsIDYsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MsIDAsIDAgfSwJCQkJLyogRjZfNTE4MF81MjQwICovCisgIHsgNTE4MCwgNTI0MCwgMjMsIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCB9LCAgICAgICAgICAgLyogRjdfNTE4MF81MjQwICovCisKKwl7IDUxODAsIDUzMjAsIDIwLCA2LCAyMCwgMjAsIERGU19FVFNJLCBQU0NBTl9FVFNJLCAwLCAwIH0sCQkJLyogRjFfNTE4MF81MzIwICovCisKKwl7IDUyNDAsIDUyODAsIDIzLCAwLCAyMCwgMjAsIERGU19GQ0MzLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYxXzUyNDBfNTI4MCAqLworCisJeyA1MjYwLCA1MjgwLCAyMywgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYxXzUyNjBfNTI4MCAqLworCisJeyA1MjYwLCA1MzIwLCAxOCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYxXzUyNjBfNTMyMCAqLworCisJeyA1MjYwLCA1MzIwLCAyMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJIHwgREZTX01LSzQsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0kgfCBQU0NBTl9NS0szICwgMCwgMCB9LAorCQkJCQkJCQkJCQkvKiBGMl81MjYwXzUzMjAgKi8KKworCXsgNTI2MCwgNTMyMCwgMjAsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDLCAyLCAwIH0sCS8qIEYzXzUyNjBfNTMyMCAqLworCXsgNTI2MCwgNTMyMCwgMjMsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDLCAyLCAwIH0sCS8qIEY0XzUyNjBfNTMyMCAqLworCXsgNTI2MCwgNTMyMCwgMjMsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDLCAwLCAwIH0sCS8qIEY1XzUyNjBfNTMyMCAqLworCXsgNTI2MCwgNTMyMCwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGNl81MjYwXzUzMjAgKi8KKwl7IDUyNjAsIDUzMjAsIDE3LCA2LCAyMCwgMjAsIERGU19FVFNJLCBQU0NBTl9FVFNJLCAwLCAwIH0sCQkJCS8qIEY3XzUyNjBfNTMyMCAqLworCisJeyA1MjYwLCA1NzAwLCA1LCAgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBOT19QU0NBTiwgMCwgMCB9LAkJLyogRjFfNTI2MF81NzAwICovCisKKwl7IDUyODAsIDUzMjAsIDE3LCA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQywgMCwgMCB9LAkvKiBGMV81MjgwXzUzMjAgKi8KKworICAgIHsgNTUwMCwgNTU4MCwgMjMsIDYsIDIwLCAyMCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgMH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRjFfNTUwMF81NTgwICovCisKKwl7IDU1MDAsIDU2MjAsIDMwLCA2LCAyMCwgMjAsIERGU19FVFNJLCBQU0NBTl9FVFNJLCAwLCAwIH0sCQkJCS8qIEYxXzU1MDBfNTYyMCAqLworCisJeyA1NTAwLCA1NzAwLCAyMCwgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDQsIDAgfSwJCS8qIEYxXzU1MDBfNTcwMCAqLworCXsgNTUwMCwgNTcwMCwgMjcsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGMl81NTAwXzU3MDAgKi8KKwl7IDU1MDAsIDU3MDAsIDMwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjNfNTUwMF81NzAwICovCisJeyA1NTAwLCA1NzAwLCAyMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJIHwgREZTX01LSzQsIFBTQ0FOX01LSzMgfCBQU0NBTl9GQ0MsIDAsIDAgfSwKKwkJCQkJCQkJCQkJLyogRjRfNTUwMF81NzAwICovCisKKyAgICB7IDU2NjAsIDU3MDAsIDIzLCA2LCAyMCwgMjAsIERGU19GQ0MzLCBQU0NBTl9GQ0MsIDB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEYxXzU2NjBfNTcwMCAqLworCisJeyA1NzQ1LCA1ODA1LCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEYxXzU3NDVfNTgwNSAqLworCXsgNTc0NSwgNTgwNSwgMzAsIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGMl81NzQ1XzU4MDUgKi8KKwl7IDU3NDUsIDU4MDUsIDMwLCA2LCAyMCwgMjAsIERGU19FVFNJLCBQU0NBTl9FVFNJLCAwLCAwIH0sCQkJCS8qIEYzXzU3NDVfNTgwNSAqLworCXsgNTc0NSwgNTgyNSwgNSwgIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGMV81NzQ1XzU4MjUgKi8KKwl7IDU3NDUsIDU4MjUsIDE3LCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjJfNTc0NV81ODI1ICovCisJeyA1NzQ1LCA1ODI1LCAyMCwgMCwgMjAsIDIwLCBERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjNfNTc0NV81ODI1ICovCisJeyA1NzQ1LCA1ODI1LCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEY0XzU3NDVfNTgyNSAqLworCXsgNTc0NSwgNTgyNSwgMzAsIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMywgMCB9LAkJCS8qIEY1XzU3NDVfNTgyNSAqLworCXsgNTc0NSwgNTgyNSwgMzAsIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGNl81NzQ1XzU4MjUgKi8KKworCS8qCisJICogQmVsb3cgYXJlIHRoZSB3b3JsZCByb2FtaW5nIGNoYW5uZWxzCisJICogQWxsIFdXUiBkb21haW5zIGhhdmUgbm8gcG93ZXIgbGltaXQsIGluc3RlYWQgdXNlIHRoZSBjYXJkJ3MgQ1RMCisJICogb3IgbWF4IHBvd2VyIHNldHRpbmdzLgorCSAqLworCXsgNDkyMCwgNDk4MCwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9XV1IsIDAsIDAgfSwJCQkJLyogVzFfNDkyMF80OTgwICovCisJeyA1MDQwLCA1MDgwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX1dXUiwgMCB9LAkJCQkvKiBXMV81MDQwXzUwODAgKi8KKwl7IDUxNzAsIDUyMzAsIDMwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMCB9LAkJLyogVzFfNTE3MF81MjMwICovCisJeyA1MTgwLCA1MjQwLCAzMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDAgfSwJCS8qIFcxXzUxODBfNTI0MCAqLworCXsgNTI2MCwgNTMyMCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwLCAwIH0sCQkvKiBXMV81MjYwXzUzMjAgKi8KKwl7IDU3NDUsIDU4MjUsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwLCAwIH0sCQkJCS8qIFcxXzU3NDVfNTgyNSAqLworCXsgNTUwMCwgNTcwMCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwLCAwIH0sCQkvKiBXMV81NTAwXzU3MDAgKi8KKwl7IDUyNjAsIDUzMjAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sICAwLCAwIH0sCQkJCS8qIFcyXzUyNjBfNTMyMCAqLworCXsgNTE4MCwgNTI0MCwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgIDAsIDAgfSwJCQkJLyogVzJfNTE4MF81MjQwICovCisJeyA1ODI1LCA1ODI1LCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX1dXUiwgMCwgMCB9LAkJCQkvKiBXMl81ODI1XzU4MjUgKi8KK307CisvKgorICogNUdIeiBUdXJibyAoZHluYW1pYyAmIHN0YXRpYykgdGFncworICovCisKK2VudW0geworCVQxXzUxMzBfNTIxMCwKKwlUMV81MjUwXzUzMzAsCisJVDFfNTM3MF81NDkwLAorCVQxXzU1MzBfNTY1MCwKKworCVQxXzUxNTBfNTE5MCwKKwlUMV81MjMwXzUzMTAsCisJVDFfNTM1MF81NDcwLAorCVQxXzU1MTBfNTY3MCwKKworCVQxXzUyMDBfNTI0MCwKKwlUMl81MjAwXzUyNDAsCisJVDFfNTIxMF81MjEwLAorCVQyXzUyMTBfNTIxMCwKKworCVQxXzUyODBfNTI4MCwKKwlUMl81MjgwXzUyODAsCisJVDFfNTI1MF81MjUwLAorCVQxXzUyOTBfNTI5MCwKKwlUMV81MjUwXzUyOTAsCisJVDJfNTI1MF81MjkwLAorCisJVDFfNTU0MF81NjYwLAorCVQxXzU3NjBfNTgwMCwKKwlUMl81NzYwXzU4MDAsCisKKwlUMV81NzY1XzU4MDUsCisKKwlXVDFfNTIxMF81MjUwLAorCVdUMV81MjkwXzUyOTAsCisJV1QxXzU1NDBfNTY2MCwKKwlXVDFfNTc2MF81ODAwLAorfTsKKworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjVHaHpUdXJib0ZyZXFbXSA9IHsKKwl7IDUxMzAsIDUyMTAsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81MTMwXzUyMTAgKi8KKwl7IDUyNTAsIDUzMzAsIDUsICA2LCA0MCwgNDAsIERGU19GQ0MzLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUyNTBfNTMzMCAqLworCXsgNTM3MCwgNTQ5MCwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUzNzBfNTQ5MCAqLworCXsgNTUzMCwgNTY1MCwgNSwgIDYsIDQwLCA0MCwgREZTX0ZDQzMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTUzMF81NjUwICovCisKKwl7IDUxNTAsIDUxOTAsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81MTUwXzUxOTAgKi8KKwl7IDUyMzAsIDUzMTAsIDUsICA2LCA0MCwgNDAsIERGU19GQ0MzLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUyMzBfNTMxMCAqLworCXsgNTM1MCwgNTQ3MCwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUzNTBfNTQ3MCAqLworCXsgNTUxMCwgNTY3MCwgNSwgIDYsIDQwLCA0MCwgREZTX0ZDQzMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTUxMF81NjcwICovCisKKwl7IDUyMDAsIDUyNDAsIDE3LCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81MjAwXzUyNDAgKi8KKwl7IDUyMDAsIDUyNDAsIDIzLCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMl81MjAwXzUyNDAgKi8KKwl7IDUyMTAsIDUyMTAsIDE3LCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81MjEwXzUyMTAgKi8KKwl7IDUyMTAsIDUyMTAsIDIzLCAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMl81MjEwXzUyMTAgKi8KKworCXsgNTI4MCwgNTI4MCwgMjMsIDYsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDFfNTI4MF81MjgwICovCisJeyA1MjgwLCA1MjgwLCAyMCwgNiwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMl81MjgwXzUyODAgKi8KKwl7IDUyNTAsIDUyNTAsIDE3LCAwLCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQxXzUyNTBfNTI1MCAqLworCXsgNTI5MCwgNTI5MCwgMjAsIDAsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDFfNTI5MF81MjkwICovCisJeyA1MjUwLCA1MjkwLCAyMCwgMCwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMV81MjUwXzUyOTAgKi8KKwl7IDUyNTAsIDUyOTAsIDIzLCA2LCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQyXzUyNTBfNTI5MCAqLworCisJeyA1NTQwLCA1NjYwLCAyMCwgNiwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMV81NTQwXzU2NjAgKi8KKwl7IDU3NjAsIDU4MDAsIDIwLCAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81NzYwXzU4MDAgKi8KKwl7IDU3NjAsIDU4MDAsIDMwLCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMl81NzYwXzU4MDAgKi8KKworCXsgNTc2NSwgNTgwNSwgMzAsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzU3NjVfNTgwNSAqLworCisJLyoKKwkgKiBCZWxvdyBhcmUgdGhlIFdXUiBmcmVxdWVuY2llcworCSAqLworCisJeyA1MjEwLCA1MjUwLCAxNSwgMCwgNDAsIDQwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDB9LCAvKiBXVDFfNTIxMF81MjUwICovCisJeyA1MjkwLCA1MjkwLCAxOCwgMCwgNDAsIDQwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDB9LCAvKiBXVDFfNTI5MF81MjkwICovCisJeyA1NTQwLCA1NjYwLCAyMCwgMCwgNDAsIDQwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDB9LCAvKiBXVDFfNTU0MF81NjYwICovCisJeyA1NzYwLCA1ODAwLCAyMCwgMCwgNDAsIDQwLCBOT19ERlMsIFBTQ0FOX1dXUiwgMCwgMH0sCS8qIFdUMV81NzYwXzU4MDAgKi8KK307CisKKy8qCisgKiAyR0h6IDExYiBjaGFubmVsIHRhZ3MKKyAqLworZW51bSB7CisJRjFfMjMxMl8yMzcyLAorCUYyXzIzMTJfMjM3MiwKKworCUYxXzI0MTJfMjQ3MiwKKwlGMl8yNDEyXzI0NzIsCisJRjNfMjQxMl8yNDcyLAorCisJRjFfMjQxMl8yNDYyLAorCUYyXzI0MTJfMjQ2MiwKKworCUYxXzI0MzJfMjQ0MiwKKworCUYxXzI0NTdfMjQ3MiwKKworCUYxXzI0NjdfMjQ3MiwKKworCUYxXzI0ODRfMjQ4NCwKKwlGMl8yNDg0XzI0ODQsCisKKwlGMV8yNTEyXzI3MzIsCisKKwlXMV8yMzEyXzIzNzIsCisJVzFfMjQxMl8yNDEyLAorCVcxXzI0MTdfMjQzMiwKKwlXMV8yNDM3XzI0NDIsCisJVzFfMjQ0N18yNDU3LAorCVcxXzI0NjJfMjQ2MiwKKwlXMV8yNDY3XzI0NjcsCisJVzJfMjQ2N18yNDY3LAorCVcxXzI0NzJfMjQ3MiwKKwlXMl8yNDcyXzI0NzIsCisJVzFfMjQ4NF8yNDg0LAorCVcyXzI0ODRfMjQ4NCwKK307CisKK3N0YXRpYyBSRUdfRE1OX0ZSRVFfQkFORCByZWdEbW4yR2h6RnJlcVtdID0geworCXsgMjMxMiwgMjM3MiwgNSwgIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjMxMl8yMzcyICovCisJeyAyMzEyLCAyMzcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMl8yMzEyXzIzNzIgKi8KKworCXsgMjQxMiwgMjQ3MiwgNSwgIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjQxMl8yNDcyICovCisJeyAyNDEyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQSwgMCwgMH0sCS8qIEYyXzI0MTJfMjQ3MiAqLworCXsgMjQxMiwgMjQ3MiwgMzAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjNfMjQxMl8yNDcyICovCisKKwl7IDI0MTIsIDI0NjIsIDI3LCA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI0MTJfMjQ2MiAqLworCXsgMjQxMiwgMjQ2MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EsIDAsIDB9LAkvKiBGMl8yNDEyXzI0NjIgKi8KKwl7IDI0MzIsIDI0NDIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI0MzJfMjQ0MiAqLworCisJeyAyNDU3LCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yNDU3XzI0NzIgKi8KKworCXsgMjQ2NywgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQSwgMCwgMH0sIC8qIEYxXzI0NjdfMjQ3MiAqLworCisJeyAyNDg0LCAyNDg0LCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yNDg0XzI0ODQgKi8KKwl7IDI0ODQsIDI0ODQsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMiwgMCwgMH0sCS8qIEYyXzI0ODRfMjQ4NCAqLworCisJeyAyNTEyLCAyNzMyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yNTEyXzI3MzIgKi8KKworCS8qCisJICogV1dSIGhhdmUgcG93ZXJzIG9wZW5lZCB1cCB0byAyMGRCbS4gIExpbWl0cyBzaG91bGQgb2Z0ZW4gY29tZSBmcm9tIENUTC9NYXggcG93ZXJzCisJICovCisKKwl7IDIzMTIsIDIzNzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFcxXzIzMTJfMjM3MiAqLworCXsgMjQxMiwgMjQxMiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVzFfMjQxMl8yNDEyICovCisJeyAyNDE3LCAyNDMyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXMV8yNDE3XzI0MzIgKi8KKwl7IDI0MzcsIDI0NDIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFcxXzI0MzdfMjQ0MiAqLworCXsgMjQ0NywgMjQ1NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVzFfMjQ0N18yNDU3ICovCisJeyAyNDYyLCAyNDYyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXMV8yNDYyXzI0NjIgKi8KKwl7IDI0NjcsIDI0NjcsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9XV1IgfCBJU19FQ01fQ0hBTiwgMCwgMH0sIC8qIFcxXzI0NjdfMjQ2NyAqLworCXsgMjQ2NywgMjQ2NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOIHwgSVNfRUNNX0NIQU4sIDAsIDB9LAkvKiBXMl8yNDY3XzI0NjcgKi8KKwl7IDI0NzIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9XV1IgfCBJU19FQ01fQ0hBTiwgMCwgMH0sIC8qIFcxXzI0NzJfMjQ3MiAqLworCXsgMjQ3MiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOIHwgSVNfRUNNX0NIQU4sIDAsIDB9LAkvKiBXMl8yNDcyXzI0NzIgKi8KKwl7IDI0ODQsIDI0ODQsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9XV1IgfCBJU19FQ01fQ0hBTiwgMCwgMH0sIC8qIFcxXzI0ODRfMjQ4NCAqLworCXsgMjQ4NCwgMjQ4NCwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOIHwgSVNfRUNNX0NIQU4sIDAsIDB9LAkvKiBXMl8yNDg0XzI0ODQgKi8KK307CisKKworLyoKKyAqIDJHSHogMTFnIGNoYW5uZWwgdGFncworICovCisKK2VudW0geworCUcxXzIzMTJfMjM3MiwKKwlHMl8yMzEyXzIzNzIsCisKKwlHMV8yNDEyXzI0NzIsCisJRzJfMjQxMl8yNDcyLAorCUczXzI0MTJfMjQ3MiwKKworCUcxXzI0MTJfMjQ2MiwKKwlHMl8yNDEyXzI0NjIsCisKKwlHMV8yNDMyXzI0NDIsCisKKwlHMV8yNDU3XzI0NzIsCisKKwlHMV8yNTEyXzI3MzIsCisKKwlHMV8yNDY3XzI0NzIgLAorCisJV0cxXzIzMTJfMjM3MiwKKwlXRzFfMjQxMl8yNDEyLAorCVdHMV8yNDE3XzI0MzIsCisJV0cxXzI0MzdfMjQ0MiwKKwlXRzFfMjQ0N18yNDU3LAorCVdHMV8yNDYyXzI0NjIsCisJV0cxXzI0NjdfMjQ2NywKKwlXRzJfMjQ2N18yNDY3LAorCVdHMV8yNDcyXzI0NzIsCisJV0cyXzI0NzJfMjQ3MiwKKworfTsKK3N0YXRpYyBSRUdfRE1OX0ZSRVFfQkFORCByZWdEbW4yR2h6MTFnRnJlcVtdID0geworCXsgMjMxMiwgMjM3MiwgNSwgIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzFfMjMxMl8yMzcyICovCisJeyAyMzEyLCAyMzcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMl8yMzEyXzIzNzIgKi8KKworCXsgMjQxMiwgMjQ3MiwgNSwgIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzFfMjQxMl8yNDcyICovCisJeyAyNDEyLCAyNDcyLCAyMCwgMCwgMjAsIDUsICBOT19ERlMsIFBTQ0FOX01LS0FfRywgMCwgMH0sCS8qIEcyXzI0MTJfMjQ3MiAqLworCXsgMjQxMiwgMjQ3MiwgMzAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzNfMjQxMl8yNDcyICovCisKKwl7IDI0MTIsIDI0NjIsIDI3LCA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcxXzI0MTJfMjQ2MiAqLworCXsgMjQxMiwgMjQ2MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0FfRywgMCwgMH0sCS8qIEcyXzI0MTJfMjQ2MiAqLworCXsgMjQzMiwgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzFfMjQzMl8yNDQyICovCisKKwl7IDI0NTcsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcxXzI0NTdfMjQ3MiAqLworCisJeyAyNTEyLCAyNzMyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yNTEyXzI3MzIgKi8KKworCXsgMjQ2NywgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQSwgMCwgMCB9LCAvKiBHMV8yNDY3XzI0NzIgKi8KKworCS8qCisJICogV1dSIG9wZW4gdXAgdGhlIHBvd2VyIHRvIDIwZEJtCisJICovCisKKwl7IDIzMTIsIDIzNzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFdHMV8yMzEyXzIzNzIgKi8KKwl7IDI0MTIsIDI0MTIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFdHMV8yNDEyXzI0MTIgKi8KKwl7IDI0MTcsIDI0MzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFdHMV8yNDE3XzI0MzIgKi8KKwl7IDI0MzcsIDI0NDIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFdHMV8yNDM3XzI0NDIgKi8KKwl7IDI0NDcsIDI0NTcsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFdHMV8yNDQ3XzI0NTcgKi8KKwl7IDI0NjIsIDI0NjIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFdHMV8yNDYyXzI0NjIgKi8KKwl7IDI0NjcsIDI0NjcsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9XV1IgfCBJU19FQ01fQ0hBTiwgMCwgMH0sIC8qIFdHMV8yNDY3XzI0NjcgKi8KKwl7IDI0NjcsIDI0NjcsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiB8IElTX0VDTV9DSEFOLCAwLCAwfSwJLyogV0cyXzI0NjdfMjQ2NyAqLworCXsgMjQ3MiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogV0cxXzI0NzJfMjQ3MiAqLworCXsgMjQ3MiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOIHwgSVNfRUNNX0NIQU4sIDAsIDB9LAkvKiBXRzJfMjQ3Ml8yNDcyICovCit9OworLyoKKyAqIDJHSHogRHluYW1pYyB0dXJibyB0YWdzCisgKi8KKworZW51bSB7CisJVDFfMjMxMl8yMzcyLAorCVQxXzI0MzdfMjQzNywKKwlUMl8yNDM3XzI0MzcsCisJVDNfMjQzN18yNDM3LAorCVQxXzI1MTJfMjczMgorfTsKKworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjJHaHoxMWdUdXJib0ZyZXFbXSA9IHsKKwl7IDIzMTIsIDIzNzIsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgLyogVDFfMjMxMl8yMzcyICovCisJeyAyNDM3LCAyNDM3LCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgIC8qIFQxXzI0MzdfMjQzNyAqLworCXsgMjQzNywgMjQzNywgMjAsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAvKiBUMl8yNDM3XzI0MzcgKi8KKwl7IDI0MzcsIDI0MzcsIDE4LCA2LCA0MCwgNDAsIE5PX0RGUywgUFNDQU5fV1dSLCAwLCAwfSwgLyogVDNfMjQzN18yNDM3ICovCisJeyAyNTEyLCAyNzMyLCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgIC8qIFQxXzI1MTJfMjczMiAqLworfTsKKworCisKKy8qCisgKiAyR0h6IDExbiBmcmVxdWVuY3kgdGFncworICovCitlbnVtIHsKKyAgICBORzFfMjQyMl8yNDUyLAorICAgIE5HMl8yNDIyXzI0NTIsCisgICAgTkczXzI0MjJfMjQ1MiwKKworICAgIE5HX0RFTU9fQUxMX0NIQU5ORUxTLAorfTsKKworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjJHaHoxMW5nRnJlcVtdID0geworICAgIHsgMjQyMiwgMjQ1MiwgMjAsIDAsIDQwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgICAgLyogTkcxXzI0MjJfMjQ1MiAqLworICAgIHsgMjQyMiwgMjQ1MiwgMjcsIDAsIDQwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgICAgLyogTkcyXzI0MjJfMjQ1MiAqLworICAgIHsgMjQyMiwgMjQ1MiwgMzAsIDAsIDQwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgICAgLyogTkczXzI0MjJfMjQ1MiAqLworCisJeyAyMzEyLCAyNzMyLCAyNywgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgICAvKiBOR19ERU1PX0FMTF9DSEFOTkVMUyAqLworfTsKKworCisvKgorICogNUdIeiAxMW4gZnJlcXVlbmN5IHRhZ3MKKyAqLworZW51bSB7CisgICAgTkExXzUxOTBfNTIzMCwKKyAgICBOQTJfNTE5MF81MjMwLAorICAgIE5BM181MTkwXzUyMzAsCisgICAgTkE0XzUxOTBfNTIzMCwKKyAgICBOQTVfNTE5MF81MjMwLAorCisgICAgTkExXzUyNzBfNTI3MCwKKworICAgIE5BMV81MjcwXzUzMTAsCisgICAgTkEyXzUyNzBfNTMxMCwKKyAgICBOQTNfNTI3MF81MzEwLAorICAgIE5BNF81MjcwXzUzMTAsCisKKyAgICBOQTFfNTMxMF81MzEwLAorCisgICAgTkExXzU1MTBfNTYzMCwKKworICAgIE5BMV81NTEwXzU2NzAsCisgICAgTkEyXzU1MTBfNTY3MCwKKyAgICBOQTNfNTUxMF81NjcwLAorCisgICAgTkExXzU3NTVfNTc5NSwKKyAgICBOQTJfNTc1NV81Nzk1LAorICAgIE5BM181NzU1XzU3OTUsCisgICAgTkE0XzU3NTVfNTc5NSwKKyAgICBOQTVfNTc1NV81Nzk1LAorCisgICAgTkExXzU3OTVfNTc5NSwKKworICAgIE5BX0RFTU9fQUxMX0NIQU5ORUxTLAorfTsKKworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjVHaHoxMW5hRnJlcVtdID0geworICAgIC8qCisgICAgICogVG9EbzogVGhpcyB0YWJsZSBuZWVkcyB0byBiZSBjb21wbGV0ZWx5IHBvcHVsYXRlZCB3aXRoIDVHSHogMTFuIHByb3BlcnRpZXMKKyAgICAgKi8KKwl7IDUxOTAsIDUyMzAsIDE1LCAgMCwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BMV81MTkwXzUyMzAgKi8KKwl7IDUxOTAsIDUyMzAsIDE3LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogTkEyXzUxOTBfNTIzMCAqLworCXsgNTE5MCwgNTIzMCwgMTgsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkEzXzUxOTBfNTIzMCAqLworCXsgNTE5MCwgNTIzMCwgMjAsICAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBOQTRfNTE5MF81MjMwICovCisJeyA1MTkwLCA1MjMwLCAyMywgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTVfNTE5MF81MjMwICovCisKKwl7IDUyNzAsIDUyNzAsIDIzLCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkExXzUyNzBfNTI3MCAqLworCisJeyA1MjcwLCA1MzEwLCAxOCwgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BMV81MjcwXzUzMTAgKi8KKwl7IDUyNzAsIDUzMTAsIDIwLCAgMCwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSXxERlNfTUtLNCwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkEyXzUyNzBfNTMxMCAqLworCXsgNTI3MCwgNTMxMCwgMjMsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTNfNTI3MF81MzEwICovCisJeyA1MjcwLCA1MzEwLCAzMCwgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BNF81MjcwXzUzMTAgKi8KKworCXsgNTMxMCwgNTMxMCwgMTcsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTFfNTMxMF81MzEwICovCisKKwl7IDU1MTAsIDU2MzAsIDMwLCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkExXzU1MTBfNTYzMCAqLworCisJeyA1NTEwLCA1NjcwLCAyMCwgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0l8REZTX01LSzQsIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BMV81NTEwXzU2NzAgKi8KKwl7IDU1MTAsIDU2NzAsIDI3LCAgMCwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkEyXzU1MTBfNTY3MCAqLworCXsgNTUxMCwgNTY3MCwgMzAsICA2LCA0MCwgNDAsIERGU19GQ0MzLCBOT19QU0NBTiwgMCwgMX0sICAgLyogTkEzXzU1MTBfNTY3MCAqLworCisJeyA1NzU1LCA1Nzk1LCAxNywgIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTFfNTc1NV81Nzk1ICovCisJeyA1NzU1LCA1Nzk1LCAyMCwgIDYsIDQwLCA0MCwgREZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BMl81NzU1XzU3OTUgKi8KKwl7IDU3NTUsIDU3OTUsIDIzLCAgMCwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BM181NzU1XzU3OTUgKi8KKwl7IDU3NTUsIDU3OTUsIDMwLCAgMCwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogTkE0XzU3NTVfNTc5NSAqLworCXsgNTc1NSwgNTc5NSwgMzAsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkE1XzU3NTVfNTc5NSAqLworCisJeyA1Nzk1LCA1Nzk1LCAzMCwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTFfNTc5NV81Nzk1ICovCisKKyAgICB7IDQ5MjAsIDYxMDAsIDMwLCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogTkFfREVNT19BTExfQ0hBTk5FTFMgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHJlZ0RvbWFpbiB7CisJdTE2X3QgcmVnRG1uRW51bTsJLyogdmFsdWUgZnJvbSBFbnVtUmQgdGFibGUgKi8KKwl1OF90IGNvbmZvcm1hbmNlVGVzdExpbWl0OworCXU2NF90IGRmc01hc2s7CS8qIERGUyBiaXRtYXNrIGZvciA1R2h6IHRhYmxlcyAqLworCXU2NF90IHBzY2FuOwkvKiBCaXRtYXNrIGZvciBwYXNzaXZlIHNjYW4gKi8KKwl1MzJfdCBmbGFnczsJLyogUmVxdWlyZW1lbnQgZmxhZ3MgKEFkSG9jIGRpc2FsbG93LCBub2lzZQorCQkJCSAgIGZsb29yIGNhbCBuZWVkZWQsIGV0YykgKi8KKwl1NjRfdCBjaGFuMTFhW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIGNoYW5uZWwvYmFuZAorCQkJCSAgIHNlbGVjdGlvbiAqLworCXU2NF90IGNoYW4xMWFfdHVyYm9bQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJICAgc2VsZWN0aW9uICovCisJdTY0X3QgY2hhbjExYV9keW5fdHVyYm9bQk1MRU5dOyAvKiAxMjggYml0IGJpdG1hc2sgZm9yIGNoYW5uZWwvYmFuZAorCQkJCQkgICAgICAgc2VsZWN0aW9uICovCisJdTY0X3QgY2hhbjExYltCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQKKwkJCQkgICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFnW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIGNoYW5uZWwvYmFuZAorCQkJCSAgIHNlbGVjdGlvbiAqLworCXU2NF90IGNoYW4xMWdfdHVyYm9bQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJCSAgc2VsZWN0aW9uICovCisJdTY0X3QgY2hhbjExbmdbQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgMTFuIGluIDJHSHogKi8KKwl1NjRfdCBjaGFuMTFuYVtCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciAxMW4gaW4gNUdIeiAqLworfSBSRUdfRE9NQUlOOworCitzdGF0aWMgUkVHX0RPTUFJTiByZWdEb21haW5zW10gPSB7CisKKwl7REVCVUdfUkVHX0RNTiwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEYxXzUxMjBfNTI0MCwgRjFfNTI2MF81NzAwLCBGMV81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MTMwXzUyMTAsIFQxXzUyNTBfNTMzMCwgVDFfNTM3MF81NDkwLCBUMV81NTMwXzU2NTAsIFQxXzUxNTBfNTE5MCwgVDFfNTIzMF81MzEwLCBUMV81MzUwXzU0NzAsIFQxXzU1MTBfNTY3MCwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjAwXzUyNDAsIFQxXzUyODBfNTI4MCwgVDFfNTU0MF81NjYwLCBUMV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEYxXzIzMTJfMjM3MiwgRjFfMjQxMl8yNDcyLCBGMV8yNDg0XzI0ODQsIEYxXzI1MTJfMjczMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzFfMjMxMl8yMzcyLCBHMV8yNDEyXzI0NzIsIEcxXzI1MTJfMjczMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzIzMTJfMjM3MiwgVDFfMjQzN18yNDM3LCBUMV8yNTEyXzI3MzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShOR19ERU1PX0FMTF9DSEFOTkVMUywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oTkFfREVNT19BTExfQ0hBTk5FTFMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDEsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjRfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEwyLCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEYxXzU3NDVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkEzXzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMMywgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEYxXzUyODBfNTMyMCwgRjJfNTc0NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMV81MzEwXzUzMTAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMNCwgRVRTSSwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGNF81MTgwXzUyNDAsICBGM181NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEw1LCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEYyXzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkExXzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMNiwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0ZDQ19UIHwgUFNDQU5fRkNDICwgTk9fUkVRLAorCSBCTShGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjNfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfNTIxMF81MjEwLCBUMV81MjUwXzUyOTAsIFQxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCBOQTJfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMNywgRkNDLCBOT19ERlMsIFBTQ0FOX0ZDQ19UIHwgUFNDQU5fRkNDICwgTk9fUkVRLAorCSBCTShGN181MjYwXzUzMjAsIEY0XzU1MDBfNTcwMCwgRjNfNTc0NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkExXzUzMTBfNTMxMCwgTkEyXzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKwl7QVBMOCwgRVRTSSwgTk9fREZTLCBOT19QU0NBTiwgRElTQUxMT1dfQURIT0NfMTFBfERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNl81MjYwXzUzMjAsIEY0XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTI3MF81MzEwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDksIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUF8RElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzUxODBfNTMyMCwgRjFfNTUwMF81NjIwLCBGM181NzQ1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCBOQTFfNTUxMF81NjMwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtFVFNJMSwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShXMl81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjJfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgTkEyXzU1MTBfNTY3MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0VUU0kyLCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYzXzUxODBfNTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkEzXzUxOTBfNTIzMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RVRTSTMsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oVzJfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtFVFNJNCwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGM181MTgwXzUyNDAsIEYxXzUyNjBfNTMyMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTNfNTE5MF81MjMwLCBOQTFfNTI3MF81MzEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0VUU0k1LCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzUxODBfNTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkExXzUxOTBfNTIzMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RVRTSTYsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjVfNTE4MF81MjQwLCBGMV81MjYwXzUyODAsIEYzXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNV81MTkwXzUyMzAsIE5BMV81MjcwXzUyNzAsIE5BM181NTEwXzU2NzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtGQ0MxLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjJfNTE4MF81MjQwLCBGNF81MjYwXzUzMjAsIEY1XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMTBfNTIxMCwgVDJfNTI1MF81MjkwLCBUMl81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjAwXzUyNDAsIFQxXzUyODBfNTI4MCwgVDFfNTc2NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTJfNTE5MF81MjMwLCBOQTNfNTI3MF81MzEwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RkNDMiwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEY2XzUxODBfNTI0MCwgRjVfNTI2MF81MzIwLCBGNl81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTSgtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfNTIwMF81MjQwLCBUMV81MjgwXzUyODAsIFQxXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE1XzUxOTBfNTIzMCwgTkEzXzUyNzBfNTMxMCwgTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0ZDQzMsIEZDQywgREZTX0ZDQzMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0ZDQ19ULCBOT19SRVEsCisJIEJNKEYyXzUxODBfNTI0MCwgRjNfNTI2MF81MzIwLCBGMV81NTAwXzU3MDAsIEY1XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIxMF81MjEwLCBUMV81MjUwXzUyNTAsIFQxXzUyOTBfNTI5MCwgVDJfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjAwXzUyNDAsIFQyXzUyODBfNTI4MCwgVDFfNTU0MF81NjYwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTJfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCBOQTNfNTUxMF81NjcwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtGQ0M0LCBGQ0MsIERGU19GQ0MzLCBQU0NBTl9GQ0MgfCBQU0NBTl9GQ0NfVCwgTk9fUkVRLAorCSBCTShGMV80OTQyXzQ5ODcsIEYxXzQ5NDVfNDk4NSwgRjFfNDk1MF80OTgwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtGQ0M1LCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjJfNTE4MF81MjQwLCBGNV81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkEyXzUxOTBfNTIzMCwgTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworICAgIHtGQ0M2LCBGQ0MsIERGU19GQ0MzLCBQU0NBTl9GQ0MsIE5PX1JFUSwKKwkgQk0oRjdfNTE4MF81MjQwLCBGNV81MjYwXzUzMjAsIEYxXzU1MDBfNTU4MCwgRjFfNTY2MF81NzAwLCBGNl81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzUyMDBfNTI0MCwgVDFfNTI4MF81MjgwLCBUMV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKyAgICAgQk1aRVJPLAorICAgICBCTVpFUk8sCisJIEJNKE5BNV81MTkwXzUyMzAsIE5BNV81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7TUtLMSwgTUtLLCBOT19ERlMsIFBTQ0FOX01LSzEsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV81MTcwXzUyMzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7TUtLMiwgTUtLLCBOT19ERlMsIFBTQ0FOX01LSzIsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwgRjFfNDkyMF80OTgwLCBGMV81MDM1XzUwNDAsIEYxXzUwNTVfNTA1NSwgRjFfNTA0MF81MDgwLCBGMV81MTcwXzUyMzAsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwkvKiBVTkktMSBldmVuICovCisJe01LSzMsIE1LSywgTk9fREZTLCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjRfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCS8qIFVOSS0xIGV2ZW4gKyBVTkktMiAqLworCXtNS0s0LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCS8qIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICovCisJe01LSzUsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjRfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgTkExXzU1MTBfNTY3MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJLyogVU5JLTEgb2RkICsgZXZlbiAqLworCXtNS0s2LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0sxLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjJfNTE3MF81MjMwLCBGNF81MTgwXzUyNDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwkvKiBVTkktMSBvZGQgKyBVTkktMSBldmVuICsgVU5JLTIgKi8KKwl7TUtLNywgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjJfNTE3MF81MjMwLCBGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwkvKiBVTkktMSBvZGQgKyBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCAqLworCXtNS0s4LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyAsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMl81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGNF81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BMV81NTEwXzU2NzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworICAgIC8qIFVOSS0xIGV2ZW4gKyA0LjkgR0haICovCisgICAge01LSzksIE1LSywgTk9fREZTLCBOT19QU0NBTiwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisgICAgIEJNKEYxXzQ5MTVfNDkyNSwgRjFfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwgRjFfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEY0XzUxODBfNTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworICAgIC8qIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOSBHSFogKi8KKwl7TUtLMTAsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwgRjFfNDkyMF80OTgwLCBGMV81MDM1XzUwNDAsIEYxXzUwNTVfNTA1NSwgRjFfNTA0MF81MDgwLCBGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJLyogVU5JLTEgZXZlbiArIFVOSS0yICsgNC45IEdIWiArIG1pZC1iYW5kICovCisJe01LSzExLCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNDkxNV80OTI1LCBGMV80OTM1XzQ5NDUsIEYxXzQ5MjBfNDk4MCwgRjFfNTAzNV81MDQwLCBGMV81MDU1XzUwNTUsIEYxXzUwNDBfNTA4MCwgRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY0XzU1MDBfNTcwMCwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwkvKiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyA0LjkgR0haICsgbWlkLWJhbmQgKi8KKwl7TUtLMTIsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwgRjFfNDkyMF80OTgwLCBGMV81MDM1XzUwNDAsIEYxXzUwNTVfNTA1NSwgRjFfNTA0MF81MDgwLCBGMV81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGNF81NTAwXzU3MDAsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwkvKiBEZWZpbmVkIGhlcmUgdG8gdXNlIHdoZW4gMkcgY2hhbm5lbHMgYXJlIGF1dGhvcmlzZWQgZm9yIGNvdW50cnkgSzIgKi8KKwl7QVBMRCwgTk9fQ1RMLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYyXzIzMTJfMjM3MixGMl8yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzJfMjMxMl8yMzcyLEcyXzI0MTJfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtFVFNJQSwgTk9fQ1RMLCBOT19ERlMsIFBTQ0FOX0VUU0lBLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjFfMjQ1N18yNDcyLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcxXzI0NTdfMjQ3MiwtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl8yNDM3XzI0MzcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0VUU0lCLCBFVFNJLCBOT19ERlMsIFBTQ0FOX0VUU0lCLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjFfMjQzMl8yNDQyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcxXzI0MzJfMjQ0MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl8yNDM3XzI0MzcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0VUU0lDLCBFVFNJLCBOT19ERlMsIFBTQ0FOX0VUU0lDLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjNfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEczXzI0MTJfMjQ3MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl8yNDM3XzI0MzcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0ZDQ0EsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMV8yNDEyXzI0NjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzFfMjQxMl8yNDYyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShORzJfMjQyMl8yNDUyLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVST30sCisKKwl7TUtLQSwgTUtLLCBOT19ERlMsIFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0cgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0cgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMl8yNDEyXzI0NjIsIEYxXzI0NjdfMjQ3MiwgRjJfMjQ4NF8yNDg0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzJfMjQxMl8yNDYyLCBHMV8yNDY3XzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfMjQzN18yNDM3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKE5HMV8yNDIyXzI0NTIsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPfSwKKworCXtNS0tDLCBNS0ssIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjJfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcyXzI0MTJfMjQ3MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl8yNDM3XzI0MzcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oTkcxXzI0MjJfMjQ1MiwtMSwtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVST30sCisKKwl7V09STEQsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjJfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcyXzI0MTJfMjQ3MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl8yNDM3XzI0MzcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oTkcxXzI0MjJfMjQ1MiwtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk99LAorCisJe1dPUjBfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MixXMV8yNDcyXzI0NzIsVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgVzFfMjQ4NF8yNDg0LCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLFdHMV8yNDcyXzI0NzIsV0cxXzI0MTdfMjQzMixXRzFfMjQ0N18yNDU3LFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjAxX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfUEVSXzExRCwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzUxNzBfNTIzMCwgVzFfNTc0NV81ODI1LCBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLCBXMV8yNDM3XzI0NDIsIFcxXzI0NjJfMjQ2MiwgVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMiwgV0cxXzI0MzdfMjQ0MiwgV0cxXzI0NjJfMjQ2MiwgV0cxXzI0MTdfMjQzMiwgV0cxXzI0NDdfMjQ1NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1IwMl9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLFcxXzUxNzBfNTIzMCxXMV81NzQ1XzU4MjUsVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLCBXMV8yNDcyXzI0NzIsVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsIFdHMV8yNDcyXzI0NzIsV0cxXzI0MTdfMjQzMiwgV0cxXzI0NDdfMjQ1NywgV0cxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RVUxX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfUEVSXzExRCwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsVzFfNTE3MF81MjMwLFcxXzU3NDVfNTgyNSxXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsIFcyXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzJfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MiwgV0cyXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLCBXRzFfMjQ0N18yNDU3LCBXRzJfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1IxX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsVzFfMjQ3Ml8yNDcyLFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIFcxXzI0ODRfMjQ4NCwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MixXRzFfMjQ3Ml8yNDcyLFdHMV8yNDE3XzI0MzIsV0cxXzI0NDdfMjQ1NyxXRzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1IyX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MixXMV8yNDcyXzI0NzIsVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgVzFfMjQ4NF8yNDg0LCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLFdHMV8yNDcyXzI0NzIsV0cxXzI0MTdfMjQzMixXRzFfMjQ0N18yNDU3LFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjNfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLFcxXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MixXRzFfMjQ3Ml8yNDcyLFdHMV8yNDE3XzI0MzIsV0cxXzI0NDdfMjQ1NyxXRzFfMjQ2N18yNDY3LC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjRfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMsIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBCTShXMl81MjYwXzUzMjAsIFcyXzUxODBfNTI0MCwgRjJfNTc0NV81ODA1LCBXMl81ODI1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLCBXMV8yNDE3XzI0MzIsVzFfMjQ0N18yNDU3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsIFdHMV8yNDE3XzI0MzIsV0cxXzI0NDdfMjQ1NywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjVfRVRTSUMsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzJfNTE4MF81MjQwLCBGNl81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLCBXMV8yNDM3XzI0NDIsIFcxXzI0NjJfMjQ2MiwgVzJfMjQ3Ml8yNDcyLCBXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzJfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLCBXRzFfMjQzN18yNDQyLCBXRzFfMjQ2Ml8yNDYyLCBXRzFfMjQ3Ml8yNDcyLCBXRzFfMjQxN18yNDMyLCBXRzFfMjQ0N18yNDU3LCBXRzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1I5X1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTc0NV81ODI1LCBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMiwgVzFfMjQzN18yNDQyLCBXMV8yNDYyXzI0NjIsIFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsIFdHMV8yNDM3XzI0NDIsIFdHMV8yNDYyXzI0NjIsIFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SQV9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLCBXMV8yNDM3XzI0NDIsIFcxXzI0NjJfMjQ2MiwgVzFfMjQ3Ml8yNDcyLCBXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLCBXRzFfMjQzN18yNDQyLCBXRzFfMjQ2Ml8yNDYyLCBXRzFfMjQ3Ml8yNDcyLCBXRzFfMjQxN18yNDMyLCBXRzFfMjQ0N18yNDU3LCBXRzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtOVUxMMSwgTk9fQ1RMLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKK307CisKK3N0cnVjdCBjbW9kZSB7CisJdTE2X3QJbW9kZTsKKwl1MzJfdAlmbGFnczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21vZGUgbW9kZXNbXSA9IHsKKwl7IEhBTF9NT0RFX1RVUkJPLAlDSEFOTkVMX1NUfSwJLyogVFVSQk8gbWVhbnMgMTFhIFN0YXRpYyBUdXJibyAqLworCXsgSEFMX01PREVfMTFBLAkJQ0hBTk5FTF9BfSwKKwl7IEhBTF9NT0RFXzExQiwJCUNIQU5ORUxfQn0sCisJeyBIQUxfTU9ERV8xMUcsCQlDSEFOTkVMX0d9LAorCXsgSEFMX01PREVfMTFHX1RVUkJPLAlDSEFOTkVMXzEwOEd9LAorCXsgSEFMX01PREVfMTFBX1RVUkJPLAlDSEFOTkVMXzEwOEF9LAorCXsgSEFMX01PREVfMTFOQSwJQ0hBTk5FTF9BX0hUNDB9LAorCXsgSEFMX01PREVfMTFOQSwJQ0hBTk5FTF9BX0hUMjB9LAorCXsgSEFMX01PREVfMTFORywJQ0hBTk5FTF9HX0hUNDB9LAorCXsgSEFMX01PREVfMTFORywJQ0hBTk5FTF9HX0hUMjB9LAorfTsKKworLyoKKyAqIFJldHVybiB0aGUgV2lyZWxlc3MgTW9kZSBSZWd1bGF0b3J5IERvbWFpbiBiYXNlZAorICogb24gdGhlIGNvdW50cnkgY29kZSBhbmQgdGhlIHdpcmVsZXNzIG1vZGUuCisgKi8KK3U4X3QgR2V0V21SRCh1MTZfdCByZWdpb25Db2RlLCB1MTZfdCBjaGFubmVsRmxhZywgUkVHX0RPTUFJTiAqcmQpCit7CisJczE2X3QgaSwgZm91bmQsIHJlZ0RtbjsKKwl1NjRfdCBmbGFncz1OT19SRVE7CisJUkVHX0RNTl9QQUlSX01BUFBJTkcgKnJlZ1BhaXI9TlVMTDsKKworCWZvciAoaT0wLCBmb3VuZD0wOyAoaTxOKHJlZ0RvbWFpblBhaXJzKSkmJighZm91bmQpOyBpKyspCisJeworCQlpZiAocmVnRG9tYWluUGFpcnNbaV0ucmVnRG1uRW51bSA9PSByZWdpb25Db2RlKQorCQl7CisJCQlyZWdQYWlyID0gJnJlZ0RvbWFpblBhaXJzW2ldOworCQkJZm91bmQgPSAxOworCQl9CisJfQorCWlmICghZm91bmQpCisJeworCQl6bV9kZWJ1Z19tc2cxKCJGYWlsZWQgdG8gZmluZCByZWcgZG9tYWluIHBhaXIgIiwgcmVnaW9uQ29kZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoY2hhbm5lbEZsYWcgJiBaTV9SRUdfRkxBR19DSEFOTkVMXzJHSFopCisJeworCQlyZWdEbW4gPSByZWdQYWlyLT5yZWdEbW4yR0h6OworCQlmbGFncyA9IHJlZ1BhaXItPmZsYWdzMkdIejsKKwl9CisgICAgZWxzZQorCXsKKwkJcmVnRG1uID0gcmVnUGFpci0+cmVnRG1uNUdIejsKKwkJZmxhZ3MgPSByZWdQYWlyLT5mbGFnczVHSHo7CisJfQorCisJLyoKKwkgKiBXZSBlaXRoZXIgc3RhcnRlZCB3aXRoIGEgdW5pdGFyeSByZWcgZG9tYWluIG9yIHdlJ3ZlIGZvdW5kIHRoZQorCSAqIHVuaXRhcnkgcmVnIGRvbWFpbiBvZiB0aGUgcGFpcgorCSAqLworCisJZm9yIChpPTA7aTxOKHJlZ0RvbWFpbnMpOyBpKyspCisJeworCQlpZiAocmVnRG9tYWluc1tpXS5yZWdEbW5FbnVtID09IHJlZ0RtbikKKwkJeworCQkJaWYgKHJkICE9IE5VTEwpCisJCQl7CisJCQkJemZNZW1vcnlDb3B5KCh1OF90ICopcmQsICh1OF90ICopJnJlZ0RvbWFpbnNbaV0sCisJCQkJCSAgc2l6ZW9mKFJFR19ET01BSU4pKTsKKwkJCX0KKwkJfQorCX0KKwlyZC0+cHNjYW4gJj0gcmVnUGFpci0+cHNjYW5NYXNrOworICAgIHJkLT5mbGFncyA9ICh1MzJfdClmbGFnczsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFRlc3QgdG8gc2VlIGlmIHRoZSBiaXRtYXNrIGFycmF5IGlzIGFsbCB6ZXJvcworICovCit1OF90IGlzQ2hhbkJpdE1hc2taZXJvKHU2NF90ICpiaXRtYXNrKQoreworCXUxNl90IGk7CisKKwlmb3IgKGk9MDsgaTxCTUxFTjsgaSsrKSB7CisJCWlmIChiaXRtYXNrW2ldICE9IDApCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCit1OF90IElTX0JJVF9TRVQodTMyX3QgYml0LCB1NjRfdCAqYml0bWFzaykKK3sKKwl1MzJfdCBieXRlT2Zmc2V0LCBiaXRudW07CisJdTY0X3QgdmFsOworCisJYnl0ZU9mZnNldCA9IGJpdC82NDsKKwliaXRudW0gPSBiaXQgLSBieXRlT2Zmc2V0KjY0OworCXZhbCA9ICgodTY0X3QpIDEpIDw8IGJpdG51bTsKKwlpZiAoYml0bWFza1tieXRlT2Zmc2V0XSAmIHZhbCkKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7Cit9CisKKwordm9pZCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCB1MTZfdCByZWdpb25Db2RlLCB1MTZfdCBjX2xvLCB1MTZfdCBjX2hpKQoreworCVJFR19ET01BSU4gcmQ1R0h6LCByZDJHSHo7CisJY29uc3Qgc3RydWN0IGNtb2RlICpjbTsKKwlzMTZfdCBuZXh0PTAsYjsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKwlpZiAoIUdldFdtUkQocmVnaW9uQ29kZSwgflpNX1JFR19GTEFHX0NIQU5ORUxfMkdIWiwgJnJkNUdIeikpCisJeworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjb3VsZG4ndCBmaW5kIHVuaXRhcnkgNUdIeiByZWcgZG9tYWluIGZvciBSZWdpb24gQ29kZSAiLCByZWdpb25Db2RlKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIUdldFdtUkQocmVnaW9uQ29kZSwgWk1fUkVHX0ZMQUdfQ0hBTk5FTF8yR0haLCAmcmQyR0h6KSkKKwl7CisgICAgICAgIHptX2RlYnVnX21zZzEoImNvdWxkbid0IGZpbmQgdW5pdGFyeSAyR0h6IHJlZyBkb21haW4gZm9yIFJlZ2lvbiBDb2RlICIsIHJlZ2lvbkNvZGUpOworCQlyZXR1cm47CisJfQorICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGUgPT0gcmVnaW9uQ29kZSkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzEoImN1cnJlbnQgcmVnaW9uIGNvZGUgaXMgdGhlIHNhbWUgd2l0aCBSZWdpb24gQ29kZSAiLCByZWdpb25Db2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGUgPSByZWdpb25Db2RlOworICAgIH0KKworICAgIG5leHQgPSAwOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCWZvciAoY20gPSBtb2RlczsgY20gPCAmbW9kZXNbTihtb2RlcyldOyBjbSsrKQorCXsKKwkJdTE2X3QgYzsKKwkJdTY0X3QgKmNoYW5uZWxCTT1OVUxMOworCQlSRUdfRE9NQUlOICpyZD1OVUxMOworCQlSRUdfRE1OX0ZSRVFfQkFORCAqZmJhbmQ9TlVMTCwqZnJlcXM9TlVMTDsKKworCQlzd2l0Y2ggKGNtLT5tb2RlKQorCQl7CisJCWNhc2UgSEFMX01PREVfVFVSQk86CisJCSAgICAvL3dlIGRvbid0IGhhdmUgdHVyYm8gbW9kZSBzbyB3ZSBkaXNhYmxlIGl0CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEhBTF9NT0RFX1RVUkJPIik7CisgICAgICAgICAgICBjaGFubmVsQk0gPSBOVUxMOworCQkJLy9yZCA9ICZyZDVHSHo7CisJCQkvL2NoYW5uZWxCTSA9IHJkLT5jaGFuMTFhX3R1cmJvOworCQkJLy9mcmVxcyA9ICZyZWdEbW41R2h6VHVyYm9GcmVxWzBdOworCQkJLy9jdGwgPSByZC0+Y29uZm9ybWFuY2VUZXN0TGltaXQgfCBDVExfVFVSQk87CisJCQlicmVhazsKKwkJY2FzZSBIQUxfTU9ERV8xMUE6CisJCSAgICBpZiAoKGhwUHJpdi0+T3BGbGFncyAmIDB4MSkgIT0gMCkKKwkJICAgIHsKKyAgICAJCQlyZCA9ICZyZDVHSHo7CisgICAgCQkJY2hhbm5lbEJNID0gcmQtPmNoYW4xMWE7CisgICAgCQkJZnJlcXMgPSAmcmVnRG1uNUdoekZyZXFbMF07CisgICAgCQkJY19sbyA9IDQ5MjA7IC8vZnJvbSBjaGFubmVsIDE4NAorICAgIAkJCWNfaGkgPSA1ODI1OyAvL3RvICAgY2hhbm5lbCAxNjUKKyAgICAJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdDsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIkNXWSAtIEhBTF9NT0RFXzExQSwgY2hhbm5lbEJNID0gMHgiLCAqY2hhbm5lbEJNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vY2hhbm5lbEJNID0gTlVMTDsKKyAgICAgICAgICAgIH0KKwkJCWJyZWFrOworCQljYXNlIEhBTF9NT0RFXzExQjoKKwkJICAgIC8vRGlzYWJsZSAxMUIgbW9kZSBiZWNhdXNlIGl0IG9ubHkgaGFzIGRpZmZlcmVuY2Ugd2l0aCAxMUcgaW4gUG93ZXJERlMgRGF0YSwKKwkJICAgIC8vYW5kIHdlIGRvbid0IHVzZSB0aGlzIG5vdy4KKwkJCS8vem1fZGVidWdfbXNnMCgiQ1dZIC0gSEFMX01PREVfMTFCIik7CisJCQljaGFubmVsQk0gPSBOVUxMOworCQkJLy9yZCA9ICZyZDJHSHo7CisJCQkvL2NoYW5uZWxCTSA9IHJkLT5jaGFuMTFiOworCQkJLy9mcmVxcyA9ICZyZWdEbW4yR2h6RnJlcVswXTsKKwkJCS8vY3RsID0gcmQtPmNvbmZvcm1hbmNlVGVzdExpbWl0IHwgQ1RMXzExQjsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigiQ1dZIC0gSEFMX01PREVfMTFCLCBjaGFubmVsQk0gPSAweCIsICpjaGFubmVsQk0pOworCQkJYnJlYWs7CisJCWNhc2UgSEFMX01PREVfMTFHOgorCQkgICAgaWYgKChocFByaXYtPk9wRmxhZ3MgJiAweDIpICE9IDApCisJCSAgICB7CisgICAgCQkJcmQgPSAmcmQyR0h6OworICAgIAkJCWNoYW5uZWxCTSA9IHJkLT5jaGFuMTFnOworICAgIAkJCWZyZXFzID0gJnJlZ0RtbjJHaHoxMWdGcmVxWzBdOworICAgIAkJCWNfbG8gPSAyNDEyOyAvL2Zyb20gY2hhbm5lbCAgMQorICAgIAkJCS8vY19oaSA9IDI0NjI7IC8vdG8gICBjaGFubmVsIDExCisgICAgICAgICAgICAgICAgY19oaSA9IDI0NzI7IC8vdG8gICBjaGFubmVsIDEzCisgICAgCQkJLy9jdGwgPSByZC0+Y29uZm9ybWFuY2VUZXN0TGltaXQgfCBDVExfMTFHOworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigiQ1dZIC0gSEFMX01PREVfMTFHLCBjaGFubmVsQk0gPSAweCIsICpjaGFubmVsQk0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9jaGFubmVsQk0gPSBOVUxMOworICAgICAgICAgICAgfQorCQkJYnJlYWs7CisJCWNhc2UgSEFMX01PREVfMTFHX1RVUkJPOgorCQkgICAgLy93ZSBkb24ndCBoYXZlIHR1cmJvIG1vZGUgc28gd2UgZGlzYWJsZSBpdAorICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBIQUxfTU9ERV8xMUdfVFVSQk8iKTsKKyAgICAgICAgICAgIGNoYW5uZWxCTSA9IE5VTEw7CisJCQkvL3JkID0gJnJkMkdIejsKKwkJCS8vY2hhbm5lbEJNID0gcmQtPmNoYW4xMWdfdHVyYm87CisJCQkvL2ZyZXFzID0gJnJlZ0RtbjJHaHoxMWdUdXJib0ZyZXFbMF07CisJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdCB8IENUTF8xMDhHOworCQkJYnJlYWs7CisJCWNhc2UgSEFMX01PREVfMTFBX1RVUkJPOgorCQkgICAgLy93ZSBkb24ndCBoYXZlIHR1cmJvIG1vZGUgc28gd2UgZGlzYWJsZSBpdAorICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBIQUxfTU9ERV8xMUFfVFVSQk8iKTsKKyAgICAgICAgICAgIGNoYW5uZWxCTSA9IE5VTEw7CisJCQkvL3JkID0gJnJkNUdIejsKKwkJCS8vY2hhbm5lbEJNID0gcmQtPmNoYW4xMWFfZHluX3R1cmJvOworCQkJLy9mcmVxcyA9ICZyZWdEbW41R2h6VHVyYm9GcmVxWzBdOworCQkJLy9jdGwgPSByZC0+Y29uZm9ybWFuY2VUZXN0TGltaXQgfCBDVExfMTA4RzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiVW5rb253biBIQUwgbW9kZSAiLCBjbS0+bW9kZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2hhbm5lbEJNID09IE5VTEwpCisJCXsKKwkJICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gY2hhbm5lbEJNIGlzIE5VTEwiKTsKKwkJICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpc0NoYW5CaXRNYXNrWmVybyhjaGFubmVsQk0pKQorICAgICAgICB7CisJICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEJpdE1hc2sgaXMgWmVybyIpOworCSAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBSQVk6SXMgaXQgb2s/PworICAgICAgICBpZiAoZnJlcXMgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKwkJZm9yIChiPTA7Yjw2NCpCTUxFTjsgYisrKQorCQl7CisJCQlpZiAoSVNfQklUX1NFVChiLGNoYW5uZWxCTSkpCisJCQl7CisJCQkJZmJhbmQgPSAmZnJlcXNbYl07CisKKwkJCQkvL3ptX2RlYnVnX21zZzEoIkNXWSAtIGxvd0NoYW5uZWwgPSAiLCBmYmFuZC0+bG93Q2hhbm5lbCk7CisJCQkJLy96bV9kZWJ1Z19tc2cxKCJDV1kgLSBoaWdoQ2hhbm5lbCA9ICIsIGZiYW5kLT5oaWdoQ2hhbm5lbCk7CisJCQkJLy96bV9kZWJ1Z19tc2cxKCJDV1kgLSBjaGFubmVsU2VwID0gIiwgZmJhbmQtPmNoYW5uZWxTZXApOworCQkJCWZvciAoYz1mYmFuZC0+bG93Q2hhbm5lbDsgYyA8PSBmYmFuZC0+aGlnaENoYW5uZWw7CisJCQkJICAgICBjICs9IGZiYW5kLT5jaGFubmVsU2VwKQorCQkJCXsKKwkJCQkJWk1fSEFMX0NIQU5ORUwgaWN2OworCisgICAgICAgICAgICAgICAgICAgIC8vRGlzYWJsZSBhbGwgREZTIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKChocFByaXYtPmRpc2FibGVEZnNDaD09MCkgfHwgKCEoZmJhbmQtPnVzZURmcyAmIHJkLT5kZnNNYXNrKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmYmFuZC0+Y2hhbm5lbEJXIDwgMjAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBUZW1wb3JhcnkgZGlzY2FyZCBjaGFubmVsIHRoYXQgQlcgPCAyME1IeiAoNSBvciAxME1IeikgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgT3VyIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBpbXBsZW1udCBpdCAhISEgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlpZiAoKGMgPj0gY19sbykgJiYgKGMgPD0gY19oaSkpCisJCQkJCXsKKwkJCQkJICAgIGljdi5jaGFubmVsID0gYzsKKwkJCQkJICAgIGljdi5jaGFubmVsRmxhZ3MgPSBjbS0+ZmxhZ3M7CisJCQkJCSAgICBpY3YubWF4UmVnVHhQb3dlciA9IGZiYW5kLT5wb3dlckRmczsKKwkJCQkJICAgIGlmIChmYmFuZC0+dXNlUGFzc1NjYW4gJiByZC0+cHNjYW4pCisJCQkJCSAgICAJaWN2LmNoYW5uZWxGbGFncyB8PSBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkU7CisJCQkJCSAgICBlbHNlCisJCQkJCSAgICAJaWN2LmNoYW5uZWxGbGFncyAmPSB+Wk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFOworCQkJCQkgICAgaWYgKGZiYW5kLT51c2VEZnMgJiByZC0+ZGZzTWFzaykKKwkJCQkJICAgIAlpY3YucHJpdkZsYWdzID0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlM7CisJCQkJCSAgICBlbHNlCisJCQkJCSAgICAJaWN2LnByaXZGbGFncyA9IDA7CisKKwkJCQkJICAgIC8qIEZvciBub3cgZGlzYWJsZSByYWRhciBmb3IgRkNDMyAqLworCQkJCQkgICAgaWYgKGZiYW5kLT51c2VEZnMgJiByZC0+ZGZzTWFzayAmIERGU19GQ0MzKQorCQkJCQkgICAgeworCQkJCQkgICAgCWljdi5wcml2RmxhZ3MgJj0gflpNX1JFR19GTEFHX0NIQU5ORUxfREZTOworCQkJCQkgICAgCWljdi5wcml2RmxhZ3MgfD0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlNfQ0xFQVI7CisJCQkJCSAgICB9CisKKwkJCQkJICAgIGlmKHJkLT5mbGFncyAmIExJTUlUX0ZSQU1FXzRNUykKKwkJCQkJICAgIAlpY3YucHJpdkZsYWdzIHw9IFpNX1JFR19GTEFHX0NIQU5ORUxfREZTX0NMRUFSOworCisJCQkJCSAgICBpY3YubWluVHhQb3dlciA9IDA7CisJCQkJCSAgICBpY3YubWF4VHhQb3dlciA9IDA7CisKKyAgICAgICAgCQkJICAgIHptX2Fzc2VydChuZXh0IDwgNjApOworCisJCQkJCSAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtuZXh0KytdID0gaWN2OworCQkJCSAgICB9CisJCQkJfQorCQkJfQorCQl9CisJfQorCX0KKwl3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCA9IG5leHQ7CisKKyAgICAjaWYgMAorICAgIHsKKyAgICAgICAgLyogZGVidWcgcHJpbnQgKi8KKyAgICAgICAgdTMyX3QgaTsKKyAgICAgICAgRGJnUHJpbnQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgIERiZ1ByaW50KCJ6ZkhwR2V0UmVndWxhdGlvblRhYmxlIHByaW50IGFsbCBjaGFubmVsIGluZm8gcmVnaW5jb2RlID0gMHgleFxuIiwgd2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlKTsKKyAgICAgICAgRGJnUHJpbnQoImluZGV4ICBjaGFubmVsICBjaGFubmVsRmxhZ3MgICBtYXhSZWdUeFBvd2VyICBwcml2RmxhZ3MgIHVzZURGU1xuIik7CisKKyAgICAgICAgZm9yIChpPTA7IGk8d2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgRGJnUHJpbnQoIiUwMmQgICAgICAgJWQgICAgICAgICAlMDR4ICAgICAgICAgICAlMDJkICAgICAgICAleCAgICAgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWxGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyLAorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLnByaXZGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5wcml2RmxhZ3MgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0RGUyk7CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZGlmCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZSh6ZGV2X3QqIGRldiwgdTE2X3QgcmVnaW9uQ29kZSkKK3sKKyAgICB1MTZfdCBjX2xvID0gMjAwMCwgY19oaSA9IDYwMDA7IC8vZGVmYXVsdCBjaGFubmVsIGlzIGFsbCBlbmFibGUKKyAgICB1OF90IGlzb05hbWVbM10gPSB7J04nLCAnQScsIDB9OworCisgICAgemZDb3JlU2V0SXNvTmFtZShkZXYsIGlzb05hbWUpOworCisgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZShkZXYsIHJlZ2lvbkNvZGUsIGNfbG8sIGNfaGkpOworfQorCit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tQ291bnRyeSh6ZGV2X3QqIGRldiwgdTE2X3QgQ291bnRyeUNvZGUpCit7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBjX2xvID0gMjAwMCwgY19oaSA9IDYwMDA7IC8vZGVmYXVsdCBjaGFubmVsIGlzIGFsbCBlbmFibGUKKyAgICB1MTZfdCBSZWdEb21haW47CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpID0gMDsgaSA8IE4oYWxsQ291bnRyaWVzKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKENvdW50cnlDb2RlID09IGFsbENvdW50cmllc1tpXS5jb3VudHJ5Q29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgUmVnRG9tYWluID0gYWxsQ291bnRyaWVzW2ldLnJlZ0RtbkVudW07CisKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIEFDVSBjb3VudHJ5IGNvZGUgZnJvbSBFRVBST00KKyAgICAgICAgICAgIHpmQ29yZVNldElzb05hbWUoZGV2LCAodThfdCopYWxsQ291bnRyaWVzW2ldLmlzb05hbWUpOworCisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZ19zKCJDV1kgLSBDb3VudHJ5IE5hbWUgPSAiLCBhbGxDb3VudHJpZXNbaV0ubmFtZSk7CisKKyAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGUgIT0gUmVnRG9tYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gQ2hhbmdlIHJlZ3VsYXRvcnkgdGFibGUiKTsKKworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGUoZGV2LCBSZWdEb21haW4sIGNfbG8sIGNfaGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHptX2RlYnVnX21zZzEoIkludmFsaWQgQ291bnRyeUNvZGUgPSAiLCBDb3VudHJ5Q29kZSk7Cit9CisKK3U4X3QgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21JU08oemRldl90KiBkZXYsIHU4X3QgKmNvdW50cnlJbmZvLCB1OF90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IFJlZ0RvbWFpbjsKKyAgICB1MTZfdCBjX2xvID0gMjAwMCwgY19oaSA9IDYwMDA7IC8vZGVmYXVsdCBjaGFubmVsIGlzIGFsbCBlbmFibGUKKyAgICAvL3U4X3Qgc3RyTGVuID0gMjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoY291bnRyeUluZm9bNF0gIT0gMHgyMCkKKyAgICB7IC8vIHdpdGggKEkpbmRvb3IvKE8pdXRkb29yIGluZm8KKyAgICAgICAgLy9zdHJMZW4gPSAzOworICAgIH0KKyAgICAvL3ptX2RlYnVnX21zZ19zKCJEZXNpcmVkIGlzbyBuYW1lID0gIiwgaXNvTmFtZSk7CisgICAgZm9yIChpID0gMDsgaSA8IE4oYWxsQ291bnRyaWVzKTsgaSsrKQorICAgIHsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2dfcygiQ3VycmVudCBpc28gbmFtZSA9ICIsIGFsbENvdW50cmllc1tpXS5pc29OYW1lKTsKKyAgICAgICAgaWYgKHpmTWVtb3J5SXNFcXVhbCgodThfdCAqKWFsbENvdW50cmllc1tpXS5pc29OYW1lLCAodThfdCAqKSZjb3VudHJ5SW5mb1syXSwgbGVuZ3RoLTEpKQorICAgICAgICB7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCJTZXQgY3VycmVudCBpc28gbmFtZSA9ICVzXG4iLCBhbGxDb3VudHJpZXNbaV0uaXNvTmFtZSk7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoImlzbyBuYW1lIGhpdCEhIik7CisKKyAgICAgICAgICAgIFJlZ0RvbWFpbiA9IGFsbENvdW50cmllc1tpXS5yZWdEbW5FbnVtOworCisgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlICE9IFJlZ0RvbWFpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlKGRldiwgUmVnRG9tYWluLCBjX2xvLCBjX2hpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy93aGlsZSAoaW5kZXggPCAoY291bnRyeUluZm9bMV0rMikpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICBpZiAoY291bnRyeUluZm9baW5kZXhdIDw9IDE0KQorICAgICAgICAgICAgLy8gIHsKKyAgICAgICAgICAgIC8vICAgICAgICAvKiBjYWxjdWxhdGUgMi40R0h6IGxvdyBib3VuZGFyeSBjaGFubmVsIGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgLy8gICAgICAgIGNoID0gY291bnRyeUluZm9baW5kZXhdOworICAgICAgICAgICAgLy8gICAgICAgIGlmICggY2ggPT0gMTQgKQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2xvID0gWk1fQ0hfR18xNDsKKyAgICAgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfbG8gPSBaTV9DSF9HXzEgKyAoY2ggLSAxKSAqIDU7CisgICAgICAgICAgICAvLyAgICAgICAgLyogY2FsY3VsYXRlIDIuNEdIeiBoaWdoIGJvdW5kYXJ5IGNoYW5uZWwgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAvLyAgICAgICAgY2ggPSBjb3VudHJ5SW5mb1tpbmRleF0gKyBjb3VudHJ5SW5mb1tpbmRleCArIDFdIC0gMTsKKyAgICAgICAgICAgIC8vICAgICAgICBpZiAoIGNoID09IDE0ICkKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19oaSA9IFpNX0NIX0dfMTQ7CisgICAgICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2hpID0gWk1fQ0hfR18xICsgKGNoIC0gMSkgKiA1OworICAgICAgICAgICAgLy8gIH0KKyAgICAgICAgICAgIC8vICBlbHNlCisgICAgICAgICAgICAvLyAgeworICAgICAgICAgICAgLy8gICAgICAgIC8qIGNhbGN1bGF0ZSA1R0h6IGxvdyBib3VuZGFyeSBjaGFubmVsIGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgLy8gICAgICAgIGNoID0gY291bnRyeUluZm9baW5kZXhdOworICAgICAgICAgICAgLy8gICAgICAgIGlmICggKGNoID49IDE4NCkmJihjaCA8PSAxOTYpICkKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19sbyA9IDQwMDAgKyBjaCo1OworICAgICAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19sbyA9IDUwMDAgKyBjaCo1OworICAgICAgICAgICAgLy8gICAgICAgIC8qIGNhbGN1bGF0ZSA1R0h6IGhpZ2ggYm91bmRhcnkgY2hhbm5lbCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIC8vICAgICAgICBjaCA9IGNvdW50cnlJbmZvW2luZGV4XSArIGNvdW50cnlJbmZvW2luZGV4ICsgMV0gLSAxOworICAgICAgICAgICAgLy8gICAgICAgIGlmICggKGNoID49IDE4NCkmJihjaCA8PSAxOTYpICkKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19oaSA9IDQwMDAgKyBjaCo1OworICAgICAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19oaSA9IDUwMDAgKyBjaCo1OworICAgICAgICAgICAgLy8gIH0KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgemZIcEdldFJlZ3VsYXRpb25UYWJsZShkZXYsIFJlZ0RvbWFpbiwgY19sbywgY19oaSk7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gIGluZGV4Kz0zOworICAgICAgICAgICAgLy99CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIC8vem1fZGVidWdfbXNnX3MoIkludmFsaWQgaXNvIG5hbWUgPSAiLCAmY291bnRyeUluZm9bMl0pOworICAgIHJldHVybiAxOworfQorCitjb25zdCBjaGFyKiB6ZkhwR2V0aXNvTmFtZWZyb21yZWdpb25Db2RlKHpkZXZfdCogZGV2LCB1MTZfdCByZWdpb25Db2RlKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTihhbGxDb3VudHJpZXMpOyBpKyspCisgICAgeworICAgICAgICBpZiAoYWxsQ291bnRyaWVzW2ldLnJlZ0RtbkVudW0gPT0gcmVnaW9uQ29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFsbENvdW50cmllc1tpXS5pc29OYW1lOworICAgICAgICB9CisgICAgfQorICAgIC8qIG5vIG1hdGNoaW5nIGl0ZW0sIHJldHVybiBkZWZhdWx0ICovCisgICAgcmV0dXJuIGFsbENvdW50cmllc1swXS5pc29OYW1lOworfQorCit1MTZfdCB6ZkhwR2V0UmVnaW9uQ29kZUZyb21Jc29OYW1lKHpkZXZfdCogZGV2LCB1OF90ICpjb3VudHJ5SXNvTmFtZSkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHJlZ2lvbkNvZGU7CisKKyAgICAvKiBpZiBubyBtYXRjaGluZyBpdGVtLCByZXR1cm4gZGVmYXVsdCAqLworICAgIHJlZ2lvbkNvZGUgPSBERUZfUkVHRE1OOworCisgICAgZm9yIChpID0gMDsgaSA8IE4oYWxsQ291bnRyaWVzKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHpmTWVtb3J5SXNFcXVhbCgodThfdCAqKWFsbENvdW50cmllc1tpXS5pc29OYW1lLCBjb3VudHJ5SXNvTmFtZSwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lvbkNvZGUgPSBhbGxDb3VudHJpZXNbaV0ucmVnRG1uRW51bTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlZ2lvbkNvZGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkhwRGVsZXRlQWxsb3dDaGFubmVsICAgICAgKi8KKy8qICAgICAgRGVsZXRlIEFsbG93IENoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2ICA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZyZXEgOiBmcmVxdWVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDaGFvLVdlbiBZYW5nICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjMgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZIcERlbGV0ZUFsbG93Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1MTZfdCBpLCBiYW5kSW5kZXggPSAwOworICAgIHUxNl90IGRmczVHQmFuZFtdWzJdID0ge3s1MTUwLCA1MjQwfSwgezUyNjAsIDUzNTB9LCB7NTQ1MCwgNTcwMH0sIHs1NzI1LCA1ODI1fX07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgLyogRmluZCB3aGljaCBiYW5kIGRvZXMgdGhpcyBmcmVxdWVuY3kgYmVsb25nICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgoZnJlcSA+PSBkZnM1R0JhbmRbaV1bMF0pICYmIChmcmVxIDw9IGRmczVHQmFuZFtpXVsxXSkpCisgICAgICAgICAgICBiYW5kSW5kZXggPSBpICsgMTsKKyAgICB9CisKKyAgICBpZiAoYmFuZEluZGV4ID09IDApCisgICAgeworICAgICAgICAvKiAyLjRHLCBkb24ndCBjYXJlICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiYW5kSW5kZXgtLTsKKyAgICB9CisgICAgLyogU2V0IGFsbCBjaGFubmVscyBpbiB0aGlzIGJhbmQgdG8gcGFzc2l2ZSBzY2FuICovCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPj0gZGZzNUdCYW5kW2JhbmRJbmRleF1bMF0pICYmCisgICAgICAgICAgICAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA8PSBkZnM1R0JhbmRbYmFuZEluZGV4XVsxXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIGNoYW5uZWwgaXMgbm90IHBhc3NpdmUsIHNldCBpdCB0byBiZSBwYXNzaXZlIGFuZCBtYXJrIGl0ICovCisgICAgICAgICAgICBpZiAoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWxGbGFncyAmCisgICAgICAgICAgICAgICAgICAgIFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIChaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgfCBaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZIcEFkZEFsbG93Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1MTZfdCBpLCBqLCBhcnJheUluZGV4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCBpID09IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250KQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtqXS5jaGFubmVsID4gZnJlcSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiQ1dZIC0gYWRkIGZyZXF1ZW5jeSA9ICIsIGZyZXEpOworICAgICAgICAvL3ptX2RlYnVnX21zZzEoIkNXWSAtIGNoYW5uZWwgYXJyYXkgaW5kZXggPSAiLCBqKTsKKworICAgICAgICBhcnJheUluZGV4ID0gajsKKworICAgICAgICBpZiAoYXJyYXlJbmRleCA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaiA+IGFycmF5SW5kZXg7IGotLSkKKyAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtqXSA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ogLSAxXTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFthcnJheUluZGV4XS5jaGFubmVsID0gZnJlcTsKKworICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCsrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkhwSXNEZnNDaGFubmVsTkNTKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKQoreworICAgIHU4X3QgZmxhZyA9IFpNX1JFR19GTEFHX0NIQU5ORUxfREZTOworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJERlM6ZnJlcT0lZCwgY2hhbj0lZCIsIGZyZXEsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwpOworICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxKQorICAgICAgICB7CisgICAgICAgICAgICBmbGFnID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ucHJpdkZsYWdzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKGZsYWcgJiAoWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlN8Wk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlNfQ0xFQVIpKTsKK30KKwordTE2X3QgemZIcElzRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1OF90IGZsYWcgPSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGUzsKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJERlM6ZnJlcT0lZCwgY2hhbj0lZCIsIGZyZXEsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwpOworICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxKQorICAgICAgICB7CisgICAgICAgICAgICBmbGFnID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ucHJpdkZsYWdzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIChmbGFnICYgKFpNX1JFR19GTEFHX0NIQU5ORUxfREZTfFpNX1JFR19GTEFHX0NIQU5ORUxfREZTX0NMRUFSKSk7Cit9CisKK3UxNl90IHpmSHBJc0FsbG93ZWRDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKQoreworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkhwRmluZEZpcnN0Tm9uRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgYUJhbmQpCit7CisgICAgdTE2X3QgY2hhbiA9IDI0MTI7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5wcml2RmxhZ3MgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0RGUykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFCYW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYW4gPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPCAzMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbiA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gY2hhbjsKK30KKworCisvKiBwb3J0aW5nIGZyb20gQUNVICovCisvKiBzYXZlIFJlZ3VsYXRvcnlEb21haW4gaW4gaHByaXYgKi8KK3U4X3QgemZIcEdldFJlZ3VsYXRvcnlEb21haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoICh3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGUpCisgICAgeworICAgICAgICBjYXNlIE5PX0VOVU1SRDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkNDMV9GQ0NBOgorICAgICAgICBjYXNlIEZDQzFfV09STEQ6CisgICAgICAgIGNhc2UgRkNDNF9GQ0NBOgorICAgICAgICBjYXNlIEZDQzVfRkNDQToKKyAgICAgICAgY2FzZSBGQ0MyX1dPUkxEOgorICAgICAgICBjYXNlIEZDQzJfRVRTSUM6CisgICAgICAgIGNhc2UgRkNDM19GQ0NBOgorICAgICAgICBjYXNlIEZDQzNfV09STEQ6CisgICAgICAgIGNhc2UgRkNDMToKKyAgICAgICAgY2FzZSBGQ0MyOgorICAgICAgICBjYXNlIEZDQzM6CisgICAgICAgIGNhc2UgRkNDNDoKKyAgICAgICAgY2FzZSBGQ0M1OgorICAgICAgICBjYXNlIEZDQ0E6CisgICAgICAgICAgICByZXR1cm4gMHgxMDsvL1dHX0FNRVJJQ0FTIERPVDExX1JFR19ET01BSU5fRkNDICBVbml0ZWQgU3RhdGVzCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZDQzJfRkNDQToKKyAgICAgICAgICAgIHJldHVybiAweDIwOy8vRE9UMTFfUkVHX0RPTUFJTl9ET0MgIENhbmFkYQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFVFNJMV9XT1JMRDoKKyAgICAgICAgY2FzZSBFVFNJM19FVFNJQToKKyAgICAgICAgY2FzZSBFVFNJMl9XT1JMRDoKKyAgICAgICAgY2FzZSBFVFNJM19XT1JMRDoKKyAgICAgICAgY2FzZSBFVFNJNF9XT1JMRDoKKyAgICAgICAgY2FzZSBFVFNJNF9FVFNJQzoKKyAgICAgICAgY2FzZSBFVFNJNV9XT1JMRDoKKyAgICAgICAgY2FzZSBFVFNJNl9XT1JMRDoKKyAgICAgICAgY2FzZSBFVFNJX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEVUU0kxOgorICAgICAgICBjYXNlIEVUU0kyOgorICAgICAgICBjYXNlIEVUU0kzOgorICAgICAgICBjYXNlIEVUU0k0OgorICAgICAgICBjYXNlIEVUU0k1OgorICAgICAgICBjYXNlIEVUU0k2OgorICAgICAgICBjYXNlIEVUU0lBOgorICAgICAgICBjYXNlIEVUU0lCOgorICAgICAgICBjYXNlIEVUU0lDOgorICAgICAgICAgICAgcmV0dXJuIDB4MzA7Ly9XR19FTUVBIERPVDExX1JFR19ET01BSU5fRVRTSSAgTW9zdCBvZiBFdXJvcGUKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtLMV9NS0tBOgorICAgICAgICBjYXNlIE1LSzFfTUtLQjoKKyAgICAgICAgY2FzZSBNS0syX01LS0E6CisgICAgICAgIGNhc2UgTUtLMV9GQ0NBOgorICAgICAgICBjYXNlIE1LSzFfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLMV9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0sxX01LS0M6CisgICAgICAgIGNhc2UgTUtLM19NS0tCOgorICAgICAgICBjYXNlIE1LSzNfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLM19NS0tDOgorICAgICAgICBjYXNlIE1LSzRfTUtLQjoKKyAgICAgICAgY2FzZSBNS0s0X01LS0EyOgorICAgICAgICBjYXNlIE1LSzRfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s1X01LS0I6CisgICAgICAgIGNhc2UgTUtLNV9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0s1X01LS0M6CisgICAgICAgIGNhc2UgTUtLNl9NS0tCOgorICAgICAgICBjYXNlIE1LSzZfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLNl9NS0tDOgorICAgICAgICBjYXNlIE1LSzdfTUtLQjoKKyAgICAgICAgY2FzZSBNS0s3X01LS0E6CisgICAgICAgIGNhc2UgTUtLN19NS0tDOgorICAgICAgICBjYXNlIE1LSzhfTUtLQjoKKyAgICAgICAgY2FzZSBNS0s4X01LS0EyOgorICAgICAgICBjYXNlIE1LSzhfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s2X01LS0ExOgorICAgICAgICBjYXNlIE1LSzZfRkNDQToKKyAgICAgICAgY2FzZSBNS0s3X01LS0ExOgorICAgICAgICBjYXNlIE1LSzdfRkNDQToKKyAgICAgICAgY2FzZSBNS0s5X0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLOV9NS0tBMToKKyAgICAgICAgY2FzZSBNS0s5X01LS0M6CisgICAgICAgIGNhc2UgTUtLOV9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0sxMF9GQ0NBOgorICAgICAgICBjYXNlIE1LSzEwX01LS0ExOgorICAgICAgICBjYXNlIE1LSzEwX01LS0M6CisgICAgICAgIGNhc2UgTUtLMTBfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLMTFfTUtLQToKKyAgICAgICAgY2FzZSBNS0sxMV9GQ0NBOgorICAgICAgICBjYXNlIE1LSzExX01LS0ExOgorICAgICAgICBjYXNlIE1LSzExX01LS0M6CisgICAgICAgIGNhc2UgTUtLMTFfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLMTJfTUtLQToKKyAgICAgICAgY2FzZSBNS0sxMl9GQ0NBOgorICAgICAgICBjYXNlIE1LSzEyX01LS0ExOgorICAgICAgICBjYXNlIE1LSzEyX01LS0M6CisgICAgICAgIGNhc2UgTUtLMTJfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLM19NS0tBOgorICAgICAgICBjYXNlIE1LSzNfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLM19GQ0NBOgorICAgICAgICBjYXNlIE1LSzRfTUtLQToKKyAgICAgICAgY2FzZSBNS0s0X01LS0ExOgorICAgICAgICBjYXNlIE1LSzRfRkNDQToKKyAgICAgICAgY2FzZSBNS0s5X01LS0E6CisgICAgICAgIGNhc2UgTUtLMTBfTUtLQToKKyAgICAgICAgY2FzZSBNS0sxOgorICAgICAgICBjYXNlIE1LSzI6CisgICAgICAgIGNhc2UgTUtLMzoKKyAgICAgICAgY2FzZSBNS0s0OgorICAgICAgICBjYXNlIE1LSzU6CisgICAgICAgIGNhc2UgTUtLNjoKKyAgICAgICAgY2FzZSBNS0s3OgorICAgICAgICBjYXNlIE1LSzg6CisgICAgICAgIGNhc2UgTUtLOToKKyAgICAgICAgY2FzZSBNS0sxMDoKKyAgICAgICAgY2FzZSBNS0sxMToKKyAgICAgICAgY2FzZSBNS0sxMjoKKyAgICAgICAgY2FzZSBNS0tBOgorICAgICAgICBjYXNlIE1LS0M6CisgICAgICAgICAgICByZXR1cm4gMHg0MDsvL1dHX0pBUEFOIERPVDExX1JFR19ET01BSU5fTUtLICBKYXBhbgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMHhGRjsvLyBEaWRuJ3QgaW5wdXQgUmVnRG1uIGJ5IG1lYW4gdG8gZGlzdGluZ3Vpc2ggYnkgY3VzdG9tZXIKKworfQorCisKK3ZvaWQgemZIcERpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisgICAgaHBQcml2LT5kaXNhYmxlRGZzQ2ggPSBkaXNhYmxlRmxhZzsKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHByZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGM3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHByZWcuaApAQCAtMCwwICsxLDUyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiBocHJlZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFJlZ3VsYXRvcnkgVGFibGUgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0hQUkVHX0gKKyNkZWZpbmUgX0hQUkVHX0gKKwordHlwZWRlZiB1MTZfdCBIQUxfQ1RSWV9DT0RFOwkJLyogY291bnRyeSBjb2RlICovCit0eXBlZGVmIHUxNl90IEhBTF9SRUdfRE9NQUlOOwkJLyogcmVndWxhdG9yeSBkb21haW4gY29kZSAqLwordHlwZWRlZiBlbnVtIHsKKwlBSF9GQUxTRSA9IDAsCQkvKiBOQjogbG90cyBvZiBjb2RlIGFzc3VtZXMgZmFsc2UgaXMgemVybyAqLworCUFIX1RSVUUgID0gMSwKK30gSEFMX0JPT0w7CisKKworLyoKKyAqIENvdW50cnkvUmVnaW9uIENvZGVzIGZyb20gTVMgV0lOTkxTLkgKKyAqIE51bWJlcmluZyBmcm9tIElTTyAzMTY2CisgKi8KK2VudW0gQ291bnRyeUNvZGUgeworICAgIENUUllfQUxCQU5JQSAgICAgICAgICAgICAgPSA4LCAgICAgICAvKiBBbGJhbmlhICovCisgICAgQ1RSWV9BTEdFUklBICAgICAgICAgICAgICA9IDEyLCAgICAgIC8qIEFsZ2VyaWEgKi8KKyAgICBDVFJZX0FSR0VOVElOQSAgICAgICAgICAgID0gMzIsICAgICAgLyogQXJnZW50aW5hICovCisgICAgQ1RSWV9BUk1FTklBICAgICAgICAgICAgICA9IDUxLCAgICAgIC8qIEFybWVuaWEgKi8KKyAgICBDVFJZX0FVU1RSQUxJQSAgICAgICAgICAgID0gMzYsICAgICAgLyogQXVzdHJhbGlhICovCisgICAgQ1RSWV9BVVNUUklBICAgICAgICAgICAgICA9IDQwLCAgICAgIC8qIEF1c3RyaWEgKi8KKyAgICBDVFJZX0FaRVJCQUlKQU4gICAgICAgICAgID0gMzEsICAgICAgLyogQXplcmJhaWphbiAqLworICAgIENUUllfQkFIUkFJTiAgICAgICAgICAgICAgPSA0OCwgICAgICAvKiBCYWhyYWluICovCisgICAgQ1RSWV9CRUxBUlVTICAgICAgICAgICAgICA9IDExMiwgICAgIC8qIEJlbGFydXMgKi8KKyAgICBDVFJZX0JFTEdJVU0gICAgICAgICAgICAgID0gNTYsICAgICAgLyogQmVsZ2l1bSAqLworICAgIENUUllfQkVMSVpFICAgICAgICAgICAgICAgPSA4NCwgICAgICAvKiBCZWxpemUgKi8KKyAgICBDVFJZX0JPTElWSUEgICAgICAgICAgICAgID0gNjgsICAgICAgLyogQm9saXZpYSAqLworICAgIENUUllfQk9TTklBICAgICAgICAgICAgICAgPSA3MCwgICAgICAvKiBCb3NuaWEgKi8KKyAgICBDVFJZX0JSQVpJTCAgICAgICAgICAgICAgID0gNzYsICAgICAgLyogQnJhemlsICovCisgICAgQ1RSWV9CUlVORUlfREFSVVNTQUxBTSAgICA9IDk2LCAgICAgIC8qIEJydW5laSBEYXJ1c3NhbGFtICovCisgICAgQ1RSWV9CVUxHQVJJQSAgICAgICAgICAgICA9IDEwMCwgICAgIC8qIEJ1bGdhcmlhICovCisgICAgQ1RSWV9DQU5BREEgICAgICAgICAgICAgICA9IDEyNCwgICAgIC8qIENhbmFkYSAqLworICAgIENUUllfQ0hJTEUgICAgICAgICAgICAgICAgPSAxNTIsICAgICAvKiBDaGlsZSAqLworICAgIENUUllfQ0hJTkEgICAgICAgICAgICAgICAgPSAxNTYsICAgICAvKiBQZW9wbGUncyBSZXB1YmxpYyBvZiBDaGluYSAqLworICAgIENUUllfQ09MT01CSUEgICAgICAgICAgICAgPSAxNzAsICAgICAvKiBDb2xvbWJpYSAqLworICAgIENUUllfQ09TVEFfUklDQSAgICAgICAgICAgPSAxODgsICAgICAvKiBDb3N0YSBSaWNhICovCisgICAgQ1RSWV9DUk9BVElBICAgICAgICAgICAgICA9IDE5MSwgICAgIC8qIENyb2F0aWEgKi8KKyAgICBDVFJZX0NZUFJVUyAgICAgICAgICAgICAgID0gMTk2LCAgICAgLyogQ3lwcnVzICovCisgICAgQ1RSWV9DWkVDSCAgICAgICAgICAgICAgICA9IDIwMywgICAgIC8qIEN6ZWNoIFJlcHVibGljICovCisgICAgQ1RSWV9ERU5NQVJLICAgICAgICAgICAgICA9IDIwOCwgICAgIC8qIERlbm1hcmsgKi8KKyAgICBDVFJZX0RPTUlOSUNBTl9SRVBVQkxJQyAgID0gMjE0LCAgICAgLyogRG9taW5pY2FuIFJlcHVibGljICovCisgICAgQ1RSWV9FQ1VBRE9SICAgICAgICAgICAgICA9IDIxOCwgICAgIC8qIEVjdWFkb3IgKi8KKyAgICBDVFJZX0VHWVBUICAgICAgICAgICAgICAgID0gODE4LCAgICAgLyogRWd5cHQgKi8KKyAgICBDVFJZX0VMX1NBTFZBRE9SICAgICAgICAgID0gMjIyLCAgICAgLyogRWwgU2FsdmFkb3IgKi8KKyAgICBDVFJZX0VTVE9OSUEgICAgICAgICAgICAgID0gMjMzLCAgICAgLyogRXN0b25pYSAqLworICAgIENUUllfRkFFUk9FX0lTTEFORFMgICAgICAgPSAyMzQsICAgICAvKiBGYWVyb2UgSXNsYW5kcyAqLworICAgIENUUllfRklOTEFORCAgICAgICAgICAgICAgPSAyNDYsICAgICAvKiBGaW5sYW5kICovCisgICAgQ1RSWV9GUkFOQ0UgICAgICAgICAgICAgICA9IDI1MCwgICAgIC8qIEZyYW5jZSAqLworICAgIENUUllfRlJBTkNFMiAgICAgICAgICAgICAgPSAyNTUsICAgICAvKiBGcmFuY2UyICovCisgICAgQ1RSWV9HRU9SR0lBICAgICAgICAgICAgICA9IDI2OCwgICAgIC8qIEdlb3JnaWEgKi8KKyAgICBDVFJZX0dFUk1BTlkgICAgICAgICAgICAgID0gMjc2LCAgICAgLyogR2VybWFueSAqLworICAgIENUUllfR1JFRUNFICAgICAgICAgICAgICAgPSAzMDAsICAgICAvKiBHcmVlY2UgKi8KKyAgICBDVFJZX0dVQVRFTUFMQSAgICAgICAgICAgID0gMzIwLCAgICAgLyogR3VhdGVtYWxhICovCisgICAgQ1RSWV9IT05EVVJBUyAgICAgICAgICAgICA9IDM0MCwgICAgIC8qIEhvbmR1cmFzICovCisgICAgQ1RSWV9IT05HX0tPTkcgICAgICAgICAgICA9IDM0NCwgICAgIC8qIEhvbmcgS29uZyBTLkEuUi4sIFAuUi5DLiAqLworICAgIENUUllfSFVOR0FSWSAgICAgICAgICAgICAgPSAzNDgsICAgICAvKiBIdW5nYXJ5ICovCisgICAgQ1RSWV9JQ0VMQU5EICAgICAgICAgICAgICA9IDM1MiwgICAgIC8qIEljZWxhbmQgKi8KKyAgICBDVFJZX0lORElBICAgICAgICAgICAgICAgID0gMzU2LCAgICAgLyogSW5kaWEgKi8KKyAgICBDVFJZX0lORE9ORVNJQSAgICAgICAgICAgID0gMzYwLCAgICAgLyogSW5kb25lc2lhICovCisgICAgQ1RSWV9JUkFOICAgICAgICAgICAgICAgICA9IDM2NCwgICAgIC8qIElyYW4gKi8KKyAgICBDVFJZX0lSQVEgICAgICAgICAgICAgICAgID0gMzY4LCAgICAgLyogSXJhcSAqLworICAgIENUUllfSVJFTEFORCAgICAgICAgICAgICAgPSAzNzIsICAgICAvKiBJcmVsYW5kICovCisgICAgQ1RSWV9JU1JBRUwgICAgICAgICAgICAgICA9IDM3NiwgICAgIC8qIElzcmFlbCAqLworICAgIENUUllfSVNSQUVMMiAgICAgICAgICAgICAgPSAzNzcsICAgICAvKiBJc3JhZWwyICovCisgICAgQ1RSWV9JVEFMWSAgICAgICAgICAgICAgICA9IDM4MCwgICAgIC8qIEl0YWx5ICovCisgICAgQ1RSWV9KQU1BSUNBICAgICAgICAgICAgICA9IDM4OCwgICAgIC8qIEphbWFpY2EgKi8KKyAgICBDVFJZX0pBUEFOICAgICAgICAgICAgICAgID0gMzkyLCAgICAgLyogSmFwYW4gKi8KKyAgICBDVFJZX0pBUEFOMSAgICAgICAgICAgICAgID0gMzkzLCAgICAgLyogSmFwYW4gKEpQMSkgKi8KKyAgICBDVFJZX0pBUEFOMiAgICAgICAgICAgICAgID0gMzk0LCAgICAgLyogSmFwYW4gKEpQMCkgKi8KKyAgICBDVFJZX0pBUEFOMyAgICAgICAgICAgICAgID0gMzk1LCAgICAgLyogSmFwYW4gKEpQMS0xKSAqLworICAgIENUUllfSkFQQU40ICAgICAgICAgICAgICAgPSAzOTYsICAgICAvKiBKYXBhbiAoSkUxKSAqLworICAgIENUUllfSkFQQU41ICAgICAgICAgICAgICAgPSAzOTcsICAgICAvKiBKYXBhbiAoSkUyKSAqLworICAgIENUUllfSkFQQU42ICAgICAgICAgICAgICAgPSAzOTksICAgICAvKiBKYXBhbiAoSlA2KSAqLworCisgICAgQ1RSWV9KQVBBTjcJICAgICAgICAgICAgICA9IDQwMDcsICAgIC8qIEphcGFuIChKNykgKi8KKyAgICBDVFJZX0pBUEFOOAkgICAgICAgICAgICAgID0gNDAwOCwgICAgLyogSmFwYW4gKEo4KSAqLworICAgIENUUllfSkFQQU45ICAgICAgICAgICAgICAgPSA0MDA5LCAgICAvKiBKYXBhbiAoSjkpICovCisKKyAgICBDVFJZX0pBUEFOMTAgICAgICAgICAgICAgID0gNDAxMCwgICAgLyogSmFwYW4gKEoxMCkgKi8KKyAgICBDVFJZX0pBUEFOMTEgICAgICAgICAgICAgID0gNDAxMSwgICAgLyogSmFwYW4gKEoxMSkgKi8KKyAgICBDVFJZX0pBUEFOMTIgICAgICAgICAgICAgID0gNDAxMiwgICAgLyogSmFwYW4gKEoxMikgKi8KKworICAgIENUUllfSkFQQU4xMyAgICAgICAgICAgICAgPSA0MDEzLCAgICAvKiBKYXBhbiAoSjEzKSAqLworICAgIENUUllfSkFQQU4xNCAgICAgICAgICAgICAgPSA0MDE0LCAgICAvKiBKYXBhbiAoSjE0KSAqLworICAgIENUUllfSkFQQU4xNSAgICAgICAgICAgICAgPSA0MDE1LCAgICAvKiBKYXBhbiAoSjE1KSAqLworCisgICAgQ1RSWV9KQVBBTjE2ICAgICAgICAgICAgICA9IDQwMTYsICAgIC8qIEphcGFuIChKMTYpICovCisgICAgQ1RSWV9KQVBBTjE3ICAgICAgICAgICAgICA9IDQwMTcsICAgIC8qIEphcGFuIChKMTcpICovCisgICAgQ1RSWV9KQVBBTjE4ICAgICAgICAgICAgICA9IDQwMTgsICAgIC8qIEphcGFuIChKMTgpICovCisKKyAgICBDVFJZX0pBUEFOMTkgICAgICAgICAgICAgID0gNDAxOSwgICAgLyogSmFwYW4gKEoxOSkgKi8KKyAgICBDVFJZX0pBUEFOMjAgICAgICAgICAgICAgID0gNDAyMCwgICAgLyogSmFwYW4gKEoyMCkgKi8KKyAgICBDVFJZX0pBUEFOMjEgICAgICAgICAgICAgID0gNDAyMSwgICAgLyogSmFwYW4gKEoyMSkgKi8KKworICAgIENUUllfSkFQQU4yMiAgICAgICAgICAgICAgPSA0MDIyLCAgICAvKiBKYXBhbiAoSjIyKSAqLworICAgIENUUllfSkFQQU4yMyAgICAgICAgICAgICAgPSA0MDIzLCAgICAvKiBKYXBhbiAoSjIzKSAqLworICAgIENUUllfSkFQQU4yNCAgICAgICAgICAgICAgPSA0MDI0LCAgICAvKiBKYXBhbiAoSjI0KSAqLworCisgICAgQ1RSWV9KQVBBTjI1ICAgICAgICAgICAgICA9IDQwMjUsICAgIC8qIEphcGFuIChKMjUpICovCisgICAgQ1RSWV9KQVBBTjI2ICAgICAgICAgICAgICA9IDQwMjYsICAgIC8qIEphcGFuIChKMjYpICovCisgICAgQ1RSWV9KQVBBTjI3ICAgICAgICAgICAgICA9IDQwMjcsICAgIC8qIEphcGFuIChKMjcpICovCisKKyAgICBDVFJZX0pBUEFOMjggICAgICAgICAgICAgID0gNDAyOCwgICAgLyogSmFwYW4gKEoyOCkgKi8KKyAgICBDVFJZX0pBUEFOMjkgICAgICAgICAgICAgID0gNDAyOSwgICAgLyogSmFwYW4gKEoyOSkgKi8KKyAgICBDVFJZX0pBUEFOMzAgICAgICAgICAgICAgID0gNDAzMCwgICAgLyogSmFwYW4gKEozMCkgKi8KKworICAgIENUUllfSkFQQU4zMSAgICAgICAgICAgICAgPSA0MDMxLCAgICAvKiBKYXBhbiAoSjMxKSAqLworICAgIENUUllfSkFQQU4zMiAgICAgICAgICAgICAgPSA0MDMyLCAgICAvKiBKYXBhbiAoSjMyKSAqLworICAgIENUUllfSkFQQU4zMyAgICAgICAgICAgICAgPSA0MDMzLCAgICAvKiBKYXBhbiAoSjMzKSAqLworCisgICAgQ1RSWV9KQVBBTjM0ICAgICAgICAgICAgICA9IDQwMzQsICAgIC8qIEphcGFuIChKMzQpICovCisgICAgQ1RSWV9KQVBBTjM1ICAgICAgICAgICAgICA9IDQwMzUsICAgIC8qIEphcGFuIChKMzUpICovCisgICAgQ1RSWV9KQVBBTjM2ICAgICAgICAgICAgICA9IDQwMzYsICAgIC8qIEphcGFuIChKMzYpICovCisKKyAgICBDVFJZX0pBUEFOMzcgICAgICAgICAgICAgID0gNDAzNywgICAgLyogSmFwYW4gKEozNykgKi8KKyAgICBDVFJZX0pBUEFOMzggICAgICAgICAgICAgID0gNDAzOCwgICAgLyogSmFwYW4gKEozOCkgKi8KKyAgICBDVFJZX0pBUEFOMzkgICAgICAgICAgICAgID0gNDAzOSwgICAgLyogSmFwYW4gKEozOSkgKi8KKworICAgIENUUllfSkFQQU40MCAgICAgICAgICAgICAgPSA0MDQwLCAgICAvKiBKYXBhbiAoSjQwKSAqLworICAgIENUUllfSkFQQU40MSAgICAgICAgICAgICAgPSA0MDQxLCAgICAvKiBKYXBhbiAoSjQxKSAqLworICAgIENUUllfSkFQQU40MiAgICAgICAgICAgICAgPSA0MDQyLCAgICAvKiBKYXBhbiAoSjQyKSAqLworICAgIENUUllfSkFQQU40MyAgICAgICAgICAgICAgPSA0MDQzLCAgICAvKiBKYXBhbiAoSjQzKSAqLworICAgIENUUllfSkFQQU40NCAgICAgICAgICAgICAgPSA0MDQ0LCAgICAvKiBKYXBhbiAoSjQ0KSAqLworICAgIENUUllfSkFQQU40NSAgICAgICAgICAgICAgPSA0MDQ1LCAgICAvKiBKYXBhbiAoSjQ1KSAqLworICAgIENUUllfSkFQQU40NiAgICAgICAgICAgICAgPSA0MDQ2LCAgICAvKiBKYXBhbiAoSjQ2KSAqLworICAgIENUUllfSkFQQU40NyAgICAgICAgICAgICAgPSA0MDQ3LCAgICAvKiBKYXBhbiAoSjQ3KSAqLworICAgIENUUllfSkFQQU40OCAgICAgICAgICAgICAgPSA0MDQ4LCAgICAvKiBKYXBhbiAoSjQ4KSAqLworICAgIENUUllfSkFQQU40OSAgICAgICAgICAgICAgPSA0MDQ5LCAgICAvKiBKYXBhbiAoSjQ5KSAqLworCisgICAgQ1RSWV9KQVBBTjUwICAgICAgICAgICAgICA9IDQwNTAsICAgIC8qIEphcGFuIChKNTApICovCisgICAgQ1RSWV9KQVBBTjUxICAgICAgICAgICAgICA9IDQwNTEsICAgIC8qIEphcGFuIChKNTEpICovCisgICAgQ1RSWV9KQVBBTjUyICAgICAgICAgICAgICA9IDQwNTIsICAgIC8qIEphcGFuIChKNTIpICovCisgICAgQ1RSWV9KQVBBTjUzICAgICAgICAgICAgICA9IDQwNTMsICAgIC8qIEphcGFuIChKNTMpICovCisgICAgQ1RSWV9KQVBBTjU0ICAgICAgICAgICAgICA9IDQwNTQsICAgIC8qIEphcGFuIChKNTQpICovCisKKyAgICBDVFJZX0pPUkRBTiAgICAgICAgICAgICAgID0gNDAwLCAgICAgLyogSm9yZGFuICovCisgICAgQ1RSWV9LQVpBS0hTVEFOICAgICAgICAgICA9IDM5OCwgICAgIC8qIEthemFraHN0YW4gKi8KKyAgICBDVFJZX0tFTllBICAgICAgICAgICAgICAgID0gNDA0LCAgICAgLyogS2VueWEgKi8KKyAgICBDVFJZX0tPUkVBX05PUlRIICAgICAgICAgID0gNDA4LCAgICAgLyogTm9ydGggS29yZWEgKi8KKyAgICBDVFJZX0tPUkVBX1JPQyAgICAgICAgICAgID0gNDEwLCAgICAgLyogU291dGggS29yZWEgKi8KKyAgICBDVFJZX0tPUkVBX1JPQzIgICAgICAgICAgID0gNDExLCAgICAgLyogU291dGggS29yZWEgKi8KKyAgICBDVFJZX0tPUkVBX1JPQzMgICAgICAgICAgID0gNDEyLCAgICAgLyogU291dGggS29yZWEgKi8KKyAgICBDVFJZX0tVV0FJVCAgICAgICAgICAgICAgID0gNDE0LCAgICAgLyogS3V3YWl0ICovCisgICAgQ1RSWV9MQVRWSUEgICAgICAgICAgICAgICA9IDQyOCwgICAgIC8qIExhdHZpYSAqLworICAgIENUUllfTEVCQU5PTiAgICAgICAgICAgICAgPSA0MjIsICAgICAvKiBMZWJhbm9uICovCisgICAgQ1RSWV9MSUJZQSAgICAgICAgICAgICAgICA9IDQzNCwgICAgIC8qIExpYnlhICovCisgICAgQ1RSWV9MSUVDSFRFTlNURUlOICAgICAgICA9IDQzOCwgICAgIC8qIExpZWNodGVuc3RlaW4gKi8KKyAgICBDVFJZX0xJVEhVQU5JQSAgICAgICAgICAgID0gNDQwLCAgICAgLyogTGl0aHVhbmlhICovCisgICAgQ1RSWV9MVVhFTUJPVVJHICAgICAgICAgICA9IDQ0MiwgICAgIC8qIEx1eGVtYm91cmcgKi8KKyAgICBDVFJZX01BQ0FVICAgICAgICAgICAgICAgID0gNDQ2LCAgICAgLyogTWFjYXUgKi8KKyAgICBDVFJZX01BQ0VET05JQSAgICAgICAgICAgID0gODA3LCAgICAgLyogdGhlIEZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEgKi8KKyAgICBDVFJZX01BTEFZU0lBICAgICAgICAgICAgID0gNDU4LCAgICAgLyogTWFsYXlzaWEgKi8KKyAgICBDVFJZX01BTFRBCSAgICAgICAgICAgICAgPSA0NzAsICAgICAvKiBNYWx0YSAqLworICAgIENUUllfTUVYSUNPICAgICAgICAgICAgICAgPSA0ODQsICAgICAvKiBNZXhpY28gKi8KKyAgICBDVFJZX01PTkFDTyAgICAgICAgICAgICAgID0gNDkyLCAgICAgLyogUHJpbmNpcGFsaXR5IG9mIE1vbmFjbyAqLworICAgIENUUllfTU9ST0NDTyAgICAgICAgICAgICAgPSA1MDQsICAgICAvKiBNb3JvY2NvICovCisgICAgQ1RSWV9ORVRIRVJMQU5EUyAgICAgICAgICA9IDUyOCwgICAgIC8qIE5ldGhlcmxhbmRzICovCisgICAgQ1RSWV9ORVRIRVJMQU5EU19BTlQgICAgICA9IDUzMCwgICAgIC8qIE5ldGhlcmxhbmRzLUFudGVsbGlzICovCisgICAgQ1RSWV9ORVdfWkVBTEFORCAgICAgICAgICA9IDU1NCwgICAgIC8qIE5ldyBaZWFsYW5kICovCisgICAgQ1RSWV9OSUNBUkFHVUEgICAgICAgICAgICA9IDU1OCwgICAgIC8qIE5pY2FyYWd1YSAqLworICAgIENUUllfTk9SV0FZICAgICAgICAgICAgICAgPSA1NzgsICAgICAvKiBOb3J3YXkgKi8KKyAgICBDVFJZX09NQU4gICAgICAgICAgICAgICAgID0gNTEyLCAgICAgLyogT21hbiAqLworICAgIENUUllfUEFLSVNUQU4gICAgICAgICAgICAgPSA1ODYsICAgICAvKiBJc2xhbWljIFJlcHVibGljIG9mIFBha2lzdGFuICovCisgICAgQ1RSWV9QQU5BTUEgICAgICAgICAgICAgICA9IDU5MSwgICAgIC8qIFBhbmFtYSAqLworICAgIENUUllfUEFSQUdVQVkgICAgICAgICAgICAgPSA2MDAsICAgICAvKiBQYXJhZ3VheSAqLworICAgIENUUllfUEVSVSAgICAgICAgICAgICAgICAgPSA2MDQsICAgICAvKiBQZXJ1ICovCisgICAgQ1RSWV9QSElMSVBQSU5FUyAgICAgICAgICA9IDYwOCwgICAgIC8qIFJlcHVibGljIG9mIHRoZSBQaGlsaXBwaW5lcyAqLworICAgIENUUllfUE9MQU5EICAgICAgICAgICAgICAgPSA2MTYsICAgICAvKiBQb2xhbmQgKi8KKyAgICBDVFJZX1BPUlRVR0FMICAgICAgICAgICAgID0gNjIwLCAgICAgLyogUG9ydHVnYWwgKi8KKyAgICBDVFJZX1BVRVJUT19SSUNPICAgICAgICAgID0gNjMwLCAgICAgLyogUHVlcnRvIFJpY28gKi8KKyAgICBDVFJZX1FBVEFSICAgICAgICAgICAgICAgID0gNjM0LCAgICAgLyogUWF0YXIgKi8KKyAgICBDVFJZX1JPTUFOSUEgICAgICAgICAgICAgID0gNjQyLCAgICAgLyogUm9tYW5pYSAqLworICAgIENUUllfUlVTU0lBICAgICAgICAgICAgICAgPSA2NDMsICAgICAvKiBSdXNzaWEgKi8KKyAgICBDVFJZX1NBVURJX0FSQUJJQSAgICAgICAgID0gNjgyLCAgICAgLyogU2F1ZGkgQXJhYmlhICovCisgICAgQ1RSWV9TRVJCSUFfTU9OVCAgICAgICAgICA9IDg5MSwgICAgIC8qIFNlcmJpYSBhbmQgTW9udGVuZWdybyAqLworICAgIENUUllfU0lOR0FQT1JFICAgICAgICAgICAgPSA3MDIsICAgICAvKiBTaW5nYXBvcmUgKi8KKyAgICBDVFJZX1NMT1ZBS0lBICAgICAgICAgICAgID0gNzAzLCAgICAgLyogU2xvdmFrIFJlcHVibGljICovCisgICAgQ1RSWV9TTE9WRU5JQSAgICAgICAgICAgICA9IDcwNSwgICAgIC8qIFNsb3ZlbmlhICovCisgICAgQ1RSWV9TT1VUSF9BRlJJQ0EgICAgICAgICA9IDcxMCwgICAgIC8qIFNvdXRoIEFmcmljYSAqLworICAgIENUUllfU1BBSU4gICAgICAgICAgICAgICAgPSA3MjQsICAgICAvKiBTcGFpbiAqLworICAgIENUUllfU1JJTEFOS0EgICAgICAgICAgICAgPSAxNDQsICAgICAvKiBTcmlsYW5rYSAqLworICAgIENUUllfU1dFREVOICAgICAgICAgICAgICAgPSA3NTIsICAgICAvKiBTd2VkZW4gKi8KKyAgICBDVFJZX1NXSVRaRVJMQU5EICAgICAgICAgID0gNzU2LCAgICAgLyogU3dpdHplcmxhbmQgKi8KKyAgICBDVFJZX1NZUklBICAgICAgICAgICAgICAgID0gNzYwLCAgICAgLyogU3lyaWEgKi8KKyAgICBDVFJZX1RBSVdBTiAgICAgICAgICAgICAgID0gMTU4LCAgICAgLyogVGFpd2FuICovCisgICAgQ1RSWV9USEFJTEFORCAgICAgICAgICAgICA9IDc2NCwgICAgIC8qIFRoYWlsYW5kICovCisgICAgQ1RSWV9UUklOSURBRF9ZX1RPQkFHTyAgICA9IDc4MCwgICAgIC8qIFRyaW5pZGFkIHkgVG9iYWdvICovCisgICAgQ1RSWV9UVU5JU0lBICAgICAgICAgICAgICA9IDc4OCwgICAgIC8qIFR1bmlzaWEgKi8KKyAgICBDVFJZX1RVUktFWSAgICAgICAgICAgICAgID0gNzkyLCAgICAgLyogVHVya2V5ICovCisgICAgQ1RSWV9VQUUgICAgICAgICAgICAgICAgICA9IDc4NCwgICAgIC8qIFUuQS5FLiAqLworICAgIENUUllfVUtSQUlORSAgICAgICAgICAgICAgPSA4MDQsICAgICAvKiBVa3JhaW5lICovCisgICAgQ1RSWV9VTklURURfS0lOR0RPTSAgICAgICA9IDgyNiwgICAgIC8qIFVuaXRlZCBLaW5nZG9tICovCisgICAgQ1RSWV9VTklURURfU1RBVEVTICAgICAgICA9IDg0MCwgICAgIC8qIFVuaXRlZCBTdGF0ZXMgKi8KKyAgICBDVFJZX1VOSVRFRF9TVEFURVNfRkNDNDkgID0gODQyLCAgICAgLyogVW5pdGVkIFN0YXRlcyAoUHVibGljIFNhZmV0eSkqLworICAgIENUUllfVVJVR1VBWSAgICAgICAgICAgICAgPSA4NTgsICAgICAvKiBVcnVndWF5ICovCisgICAgQ1RSWV9VWkJFS0lTVEFOICAgICAgICAgICA9IDg2MCwgICAgIC8qIFV6YmVraXN0YW4gKi8KKyAgICBDVFJZX1ZFTkVaVUVMQSAgICAgICAgICAgID0gODYyLCAgICAgLyogVmVuZXp1ZWxhICovCisgICAgQ1RSWV9WSUVUX05BTSAgICAgICAgICAgICA9IDcwNCwgICAgIC8qIFZpZXQgTmFtICovCisgICAgQ1RSWV9ZRU1FTiAgICAgICAgICAgICAgICA9IDg4NywgICAgIC8qIFllbWVuICovCisgICAgQ1RSWV9aSU1CQUJXRSAgICAgICAgICAgICA9IDcxNiAgICAgIC8qIFppbWJhYndlICovCit9OworCisvKiBFbnVtZXJhdGVkIFJlZ3VsYXRvcnkgRG9tYWluIEluZm9ybWF0aW9uIDggYml0IHZhbHVlcyBpbmRpY2F0ZSB0aGF0CisgKiB0aGUgcmVnZG9tYWluIGlzIHJlYWxseSBhIHBhaXIgb2YgdW5pdGFyeSByZWdkb21haW5zLiAgMTIgYml0IHZhbHVlcworICogYXJlIHRoZSByZWFsIHVuaXRhcnkgcmVnZG9tYWlucyBhbmQgYXJlIHRoZSBvbmx5IG9uZXMgd2hpY2ggaGF2ZSB0aGUKKyAqIGZyZXF1ZW5jeSBiaXRtYXNrcyBhbmQgZmxhZ3Mgc2V0LgorICovCitlbnVtIEVudW1SZCB7CisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIHJlZ3VsYXRvcnkgZG9tYWluIGRlZmluaXRpb25zIGFyZQorCSAqIGZvdW5kIGluIHRoZSBFRVBST00uIEVhY2ggcmVndWxhdG9yeSBkb21haW4KKwkgKiBjYW4gb3BlcmF0ZSBpbiBlaXRoZXIgYSA1R0h6IG9yIDIuNEdIeiB3aXJlbGVzcyBtb2RlIG9yCisJICogYm90aCA1R0h6IGFuZCAyLjRHSHogd2lyZWxlc3MgbW9kZXMuCisJICogSW4gZ2VuZXJhbCwgdGhlIHZhbHVlIGhvbGRzIG5vIHNwZWNpYWwKKwkgKiBtZWFuaW5nIGFuZCBpcyB1c2VkIHRvIGRlY29kZSBpbnRvIGVpdGhlciBzcGVjaWZpYworCSAqIDIuNEdIeiBvciA1R0h6IHdpcmVsZXNzIG1vZGUgZm9yIHRoYXQgcGFydGljdWxhcgorCSAqIHJlZ3VsYXRvcnkgZG9tYWluLgorCSAqLworCU5PX0VOVU1SRAk9IDB4MDAsCisJTlVMTDFfV09STEQJPSAweDAzLAkJLyogRm9yIDExYi1vbmx5IGNvdW50cmllcyAobm8gMTFhIGFsbG93ZWQpICovCisJTlVMTDFfRVRTSUIJPSAweDA3LAkJLyogSXNyYWVsICovCisJTlVMTDFfRVRTSUMJPSAweDA4LAorCUZDQzFfRkNDQQk9IDB4MTAsCQkvKiBVU0EgKi8KKwlGQ0MxX1dPUkxECT0gMHgxMSwJCS8qIEhvbmcgS29uZyAqLworCUZDQzRfRkNDQQk9IDB4MTIsCQkvKiBVU0EgLSBQdWJsaWMgU2FmZXR5ICovCisJRkNDNV9GQ0NBCT0gMHgxMywJCS8qIFVTQSAtIHdpdGggbm8gREZTIChVTklJLTEgKyBVTklJLTMgb25seSkgKi8KKyAgRkNDNl9GQ0NBICAgICAgID0gMHgxNCwgICAgICAgICAvKiBDYW5hZGEgKi8KKworCUZDQzJfRkNDQQk9IDB4MjAsCQkvKiBDYW5hZGEgKi8KKwlGQ0MyX1dPUkxECT0gMHgyMSwJCS8qIEF1c3RyYWxpYSAmIEhLICovCisJRkNDMl9FVFNJQwk9IDB4MjIsCisgIEZDQzZfV09STEQgICAgICA9IDB4MjMsICAgICAgICAgLyogQXVzdHJhbGlhICovCisKKwlGUkFOQ0VfUkVTCT0gMHgzMSwJCS8qIExlZ2FjeSBGcmFuY2UgZm9yIE9FTSAqLworCUZDQzNfRkNDQQk9IDB4M0EsCQkvKiBVU0EgJiBDYW5hZGEgdy81NDcwIGJhbmQsIDExaCwgREZTIGVuYWJsZWQgKi8KKwlGQ0MzX1dPUkxECT0gMHgzQiwJCS8qIFVTQSAmIENhbmFkYSB3LzU0NzAgYmFuZCwgMTFoLCBERlMgZW5hYmxlZCAqLworCisJRVRTSTFfV09STEQJPSAweDM3LAorCUVUU0kzX0VUU0lBCT0gMHgzMiwJCS8qIEZyYW5jZSAob3B0aW9uYWwpICovCisJRVRTSTJfV09STEQJPSAweDM1LAkJLyogSHVuZ2FyeSAmIG90aGVycyAqLworCUVUU0kzX1dPUkxECT0gMHgzNiwJCS8qIEZyYW5jZSAmIG90aGVycyAqLworCUVUU0k0X1dPUkxECT0gMHgzMCwKKwlFVFNJNF9FVFNJQwk9IDB4MzgsCisJRVRTSTVfV09STEQJPSAweDM5LAorCUVUU0k2X1dPUkxECT0gMHgzNCwJCS8qIEJ1bGdhcmlhICovCisJRVRTSV9SRVNFUlZFRAk9IDB4MzMsCQkvKiBSZXNlcnZlZCAoRG8gbm90IHVzZWQpICovCisKKwlNS0sxX01LS0EJPSAweDQwLAkJLyogSmFwYW4gKEpQMSkgKi8KKwlNS0sxX01LS0IJPSAweDQxLAkJLyogSmFwYW4gKEpQMCkgKi8KKwlBUEw0X1dPUkxECT0gMHg0MiwJCS8qIFNpbmdhcG9yZSAqLworCU1LSzJfTUtLQQk9IDB4NDMsCQkvKiBKYXBhbiB3aXRoIDQuOUcgY2hhbm5lbHMgKi8KKwlBUExfUkVTRVJWRUQJPSAweDQ0LAkJLyogUmVzZXJ2ZWQgKERvIG5vdCB1c2VkKSAgKi8KKwlBUEwyX1dPUkxECT0gMHg0NSwJCS8qIEtvcmVhICovCisJQVBMMl9BUExDCT0gMHg0NiwKKwlBUEwzX1dPUkxECT0gMHg0NywKKwlNS0sxX0ZDQ0EJPSAweDQ4LAkJLyogSmFwYW4gKEpQMS0xKSAqLworCUFQTDJfQVBMRAk9IDB4NDksCQkvKiBLb3JlYSB3aXRoIDIuM0cgY2hhbm5lbHMgKi8KKwlNS0sxX01LS0ExCT0gMHg0QSwJCS8qIEphcGFuIChKRTEpICovCisJTUtLMV9NS0tBMgk9IDB4NEIsCQkvKiBKYXBhbiAoSkUyKSAqLworCU1LSzFfTUtLQwk9IDB4NEMsCQkvKiBKYXBhbiAoTUtLMV9NS0tBLGV4Y2VwdCBDaDE0KSAqLworCisJQVBMM19GQ0NBICAgPSAweDUwLAorCUFQTDFfV09STEQJPSAweDUyLAkJLyogTGF0aW4gQW1lcmljYSAqLworCUFQTDFfRkNDQQk9IDB4NTMsCisJQVBMMV9BUExBCT0gMHg1NCwKKwlBUEwxX0VUU0lDCT0gMHg1NSwKKwlBUEwyX0VUU0lDCT0gMHg1NiwJCS8qIFZlbmV6dWVsYSAqLworCUFQTDJfRkNDQSAgID0gMHg1NywgCS8qIG5ldyBMYXRpbiBBbWVyaWNhICovCisJQVBMNV9XT1JMRAk9IDB4NTgsCQkvKiBDaGlsZSAqLworCUFQTDZfV09STEQJPSAweDVCLAkJLyogU2luZ2Fwb3JlICovCisJQVBMN19GQ0NBICAgPSAweDVDLCAgICAgLyogVGFpd2FuIDUuNDcgQmFuZCAqLworCUFQTDhfV09STEQgID0gMHg1RCwgICAgIC8qIE1hbGF5c2lhIDVHSHogKi8KKwlBUEw5X1dPUkxEICA9IDB4NUUsICAgICAvKiBLb3JlYSA1R0h6ICovCisKKwkvKgorCSAqIFdvcmxkIG1vZGUgU0tVcworCSAqLworCVdPUjBfV09STEQJPSAweDYwLAkJLyogV29ybGQwIChXTzAgU0tVKSAqLworCVdPUjFfV09STEQJPSAweDYxLAkJLyogV29ybGQxIChXTzEgU0tVKSAqLworCVdPUjJfV09STEQJPSAweDYyLAkJLyogV29ybGQyIChXTzIgU0tVKSAqLworCVdPUjNfV09STEQJPSAweDYzLAkJLyogV29ybGQzIChXTzMgU0tVKSAqLworCVdPUjRfV09STEQJPSAweDY0LAkJLyogV29ybGQ0IChXTzQgU0tVKSAqLworCVdPUjVfRVRTSUMJPSAweDY1LAkJLyogV29ybGQ1IChXTzUgU0tVKSAqLworCisJV09SMDFfV09STEQJPSAweDY2LAkJLyogV29ybGQwLTEgKFdXMC0xIFNLVSkgKi8KKwlXT1IwMl9XT1JMRAk9IDB4NjcsCQkvKiBXb3JsZDAtMiAoV1cwLTIgU0tVKSAqLworCUVVMV9XT1JMRAk9IDB4NjgsCQkvKiBTYW1lIGFzIFdvcmxkMC0yIChXVzAtMiBTS1UpLCBleGNlcHQgYWN0aXZlIHNjYW4gY2gxLTEzLiBObyBjaDE0ICovCisKKwlXT1I5X1dPUkxECT0gMHg2OSwJCS8qIFdvcmxkOSAoV085IFNLVSkgKi8KKwlXT1JBX1dPUkxECT0gMHg2QSwJCS8qIFdvcmxkQSAoV09BIFNLVSkgKi8KKworCU1LSzNfTUtLQgk9IDB4ODAsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQiAqLworCU1LSzNfTUtLQTIJPSAweDgxLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIE1LS0EyICovCisJTUtLM19NS0tDCT0gMHg4MiwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tDICovCisKKwlNS0s0X01LS0IJPSAweDgzLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQiAqLworCU1LSzRfTUtLQTIJPSAweDg0LAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQTIgKi8KKwlNS0s0X01LS0MJPSAweDg1LAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQyAqLworCisJTUtLNV9NS0tCCT0gMHg4NiwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQiAqLworCU1LSzVfTUtLQTIJPSAweDg3LAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tBMiAqLworCU1LSzVfTUtLQwk9IDB4ODgsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0MgKi8KKworCU1LSzZfTUtLQgk9IDB4ODksCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkIE1LS0IgKi8KKwlNS0s2X01LS0EyCT0gMHg4QSwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBNS0tBMiAqLworCU1LSzZfTUtLQwk9IDB4OEIsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgTUtLQyAqLworCisJTUtLN19NS0tCCT0gMHg4QywJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1LS0IgKi8KKwlNS0s3X01LS0EJPSAweDhELAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTUtLQTIgKi8KKwlNS0s3X01LS0MJPSAweDhFLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTUtLQyAqLworCisJTUtLOF9NS0tCCT0gMHg4RiwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQiAqLworCU1LSzhfTUtLQTIJPSAweDkwLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tBMiAqLworCU1LSzhfTUtLQwk9IDB4OTEsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0MgKi8KKworCU1LSzZfTUtLQTEgICAgICA9IDB4RjgsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIE1LS0ExICovCisJTUtLNl9GQ0NBICAgICAgID0gMHhGOSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgRkNDQSAqLworCU1LSzdfTUtLQTEgICAgICA9IDB4RkEsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTUtLQTEgKi8KKwlNS0s3X0ZDQ0EgICAgICAgPSAweEZCLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIEZDQ0EgKi8KKwlNS0s5X0ZDQ0EgICAgICAgPSAweEZDLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBGQ0NBICovCisJTUtLOV9NS0tBMSAgICAgID0gMHhGRCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgNC45R0h6ICsgTUtLQTEgKi8KKwlNS0s5X01LS0MgICAgICAgPSAweEZFLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tDICovCisJTUtLOV9NS0tBMiAgICAgID0gMHhGRiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgNC45R0h6ICsgTUtLQTIgKi8KKworCU1LSzEwX0ZDQ0EgICAgICA9IDB4RDAsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgRkNDQSAqLworCU1LSzEwX01LS0ExICAgICA9IDB4RDEsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgTUtLQTEgKi8KKwlNS0sxMF9NS0tDICAgICAgPSAweEQyLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiArIE1LS0MgKi8KKwlNS0sxMF9NS0tBMiAgICAgPSAweEQzLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiArIE1LS0EyICovCisKKwlNS0sxMV9NS0tBICAgICAgPSAweEQ0LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tBICovCisJTUtLMTFfRkNDQSAgICAgID0gMHhENSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgRkNDQSAqLworCU1LSzExX01LS0ExICAgICA9IDB4RDYsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0ExICovCisJTUtLMTFfTUtLQyAgICAgID0gMHhENywgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQyAqLworCU1LSzExX01LS0EyICAgICA9IDB4RDgsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0EyICovCisKKwlNS0sxMl9NS0tBICAgICAgPSAweEQ5LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tBICovCisJTUtLMTJfRkNDQSAgICAgID0gMHhEQSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgRkNDQSAqLworCU1LSzEyX01LS0ExICAgICA9IDB4REIsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0ExICovCisJTUtLMTJfTUtLQyAgICAgID0gMHhEQywgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQyAqLworCU1LSzEyX01LS0EyICAgICA9IDB4REQsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0EyICovCisKKwkvKiBGb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIHVzZWQgb25seSBieSBzL3cgdG8gbWFwIG9sZAorIAkgKiBKYXBhbiBTS1VzLgorCSAqLworCU1LSzNfTUtLQSAgICAgICA9IDB4RjAsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIE1LS0EgKi8KKwlNS0szX01LS0ExICAgICAgPSAweEYxLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tBMSAqLworCU1LSzNfRkNDQSAgICAgICA9IDB4RjIsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIEZDQ0EgKi8KKwlNS0s0X01LS0EgICAgICAgPSAweEYzLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1LS0EgKi8KKwlNS0s0X01LS0ExICAgICAgPSAweEY0LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1LS0ExICovCisJTUtLNF9GQ0NBICAgICAgID0gMHhGNSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBGQ0NBICovCisJTUtLOV9NS0tBICAgICAgID0gMHhGNiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgNC45R0h6ICsgTUtLQSovCisJTUtLMTBfTUtLQSAgICAgID0gMHhGNywgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjlHSHogKyBNS0tBICovCisKKwkvKgorCSAqIFJlZ3VsYXRvciBkb21haW5zIGVuZGluZyBpbiBhIG51bWJlciAoZS5nLiBBUEwxLAorCSAqIE1LMSwgRVRTSTQsIGV0YykgYXBwbHkgdG8gNUdIeiBjaGFubmVsIGFuZCBwb3dlcgorCSAqIGluZm9ybWF0aW9uLiAgUmVndWxhdG9yIGRvbWFpbnMgZW5kaW5nIGluIGEgbGV0dGVyCisJICogKGUuZy4gQVBMQSwgRkNDQSwgZXRjKSBhcHBseSB0byAyLjRHSHogY2hhbm5lbCBhbmQKKwkgKiBwb3dlciBpbmZvcm1hdGlvbi4KKwkgKi8KKwlBUEwxCQk9IDB4MDE1MCwJLyogTEFUICYgQXNpYSAqLworCUFQTDIJCT0gMHgwMjUwLAkvKiBMQVQgJiBBc2lhICovCisJQVBMMwkJPSAweDAzNTAsCS8qIFRhaXdhbiAqLworCUFQTDQJCT0gMHgwNDUwLAkvKiBKb3JkYW4gKi8KKwlBUEw1CQk9IDB4MDU1MCwJLyogQ2hpbGUgKi8KKwlBUEw2CQk9IDB4MDY1MCwJLyogU2luZ2Fwb3JlICovCisJQVBMNwkJPSAweDA3NTAsCS8qIFRhaXdhbiBNaWRkbGUgKi8KKwlBUEw4CQk9IDB4MDg1MCwJLyogTWFsYXlzaWEgKi8KKwlBUEw5CQk9IDB4MDk1MCwJLyogS29yZWEgKFNvdXRoKSBST0MgMyAqLworCisJRVRTSTEJCT0gMHgwMTMwLAkvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJMgkJPSAweDAyMzAsCS8qIEV1cm9wZSAmIG90aGVycyAqLworCUVUU0kzCQk9IDB4MDMzMCwJLyogRXVyb3BlICYgb3RoZXJzICovCisJRVRTSTQJCT0gMHgwNDMwLAkvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJNQkJPSAweDA1MzAsCS8qIEV1cm9wZSAmIG90aGVycyAqLworCUVUU0k2CQk9IDB4MDYzMCwJLyogRXVyb3BlICYgb3RoZXJzICovCisJRVRTSUEJCT0gMHgwQTMwLAkvKiBGcmFuY2UgKi8KKwlFVFNJQgkJPSAweDBCMzAsCS8qIElzcmFlbCAqLworCUVUU0lDCQk9IDB4MEMzMCwJLyogTGF0aW4gQW1lcmljYSAqLworCisJRkNDMQkJPSAweDAxMTAsCS8qIFVTICYgb3RoZXJzICovCisJRkNDMgkJPSAweDAxMjAsCS8qIENhbmFkYSwgQXVzdHJhbGlhICYgTmV3IFplYWxhbmQgKi8KKwlGQ0MzCQk9IDB4MDE2MCwJLyogVVMgdy9uZXcgbWlkZGxlIGJhbmQgJiBERlMgKi8KKwlGQ0M0CQk9IDB4MDE2NSwJLyogVVMgUHVibGljIFNhZmV0eSAqLworCUZDQzUJCT0gMHgwNTEwLAkvKiBVUyBubyBERlMgKi8KKyAgICBGQ0M2ICAgID0gMHgwNjEwLCAvKiBDYW5hZGEgJiBBdXN0cmFsaWEgKi8KKworCUZDQ0EJCT0gMHgwQTEwLAorCisJQVBMRAkJPSAweDBENTAsCS8qIFNvdXRoIEtvcmVhICovCisKKwlNS0sxCQk9IDB4MDE0MCwJLyogSmFwYW4gKFVOSS0xIG9kZCkqLworCU1LSzIJCT0gMHgwMjQwLAkvKiBKYXBhbiAoNC45IEdIeiArIFVOSS0xIG9kZCkgKi8KKwlNS0szCQk9IDB4MDM0MCwJLyogSmFwYW4gKFVOSS0xIGV2ZW4pICovCisJTUtLNAkJPSAweDA0NDAsCS8qIEphcGFuIChVTkktMSBldmVuICsgVU5JLTIpICovCisJTUtLNQkJPSAweDA1NDAsCS8qIEphcGFuIChVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCkgKi8KKwlNS0s2CQk9IDB4MDY0MCwJLyogSmFwYW4gKFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4pICovCisJTUtLNwkJPSAweDA3NDAsCS8qIEphcGFuIChVTkktMSBvZGQgKyBVTkktMSBldmVuICsgVU5JLTIgKi8KKwlNS0s4CQk9IDB4MDg0MCwJLyogSmFwYW4gKFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kKSAqLworCU1LSzkJCT0gMHgwOTQwLCAgIC8qIEphcGFuIChVTkktMSBldmVuICsgNC45IEdIWikgKi8KKwlNS0sxMAkJPSAweDBCNDAsICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOSBHSFopICovCisJTUtLMTEJCT0gMHgxMTQwLCAgIC8qIEphcGFuIChVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIDQuOSBHSFopICovCisJTUtLMTIJCT0gMHgxMjQwLCAgIC8qIEphcGFuIChVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBtaWQtYmFuZCArIDQuOSBHSFopICovCisJTUtLQQkJPSAweDBBNDAsCS8qIEphcGFuICovCisJTUtLQwkJPSAweDBBNTAsCisKKwlOVUxMMQkJPSAweDAxOTgsCisJV09STEQJCT0gMHgwMTk5LAorCURFQlVHX1JFR19ETU4JPSAweDAxZmYsCit9OworCisvKiBjaGFubmVsRmxhZ3MgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DV19JTlQJMHgwMDAyCS8qIENXIGludGVyZmVyZW5jZSBkZXRlY3RlZCBvbiBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfVFVSQk8JMHgwMDEwCS8qIFR1cmJvIENoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DQ0sJICAgIDB4MDAyMAkvKiBDQ0sgY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX09GRE0JMHgwMDQwCS8qIE9GRE0gY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMXzJHSFoJMHgwMDgwCS8qIDIgR0h6IHNwZWN0cnVtIGNoYW5uZWwuICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfNUdIWgkweDAxMDAJLyogNSBHSHogc3BlY3RydW0gY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUJMHgwMjAwCS8qIE9ubHkgcGFzc2l2ZSBzY2FuIGFsbG93ZWQgaW4gdGhlIGNoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9EWU4JICAgIDB4MDQwMAkvKiBkeW5hbWljIENDSy1PRkRNIGNoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9YUgkgICAgMHgwODAwCS8qIFhSIGNoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EgCTB4MTAwMAkvKiBDaGFubmVsIGJ5IENTQShDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfU1RVUkJPCTB4MjAwMAkvKiBTdGF0aWMgdHVyYm8sIG5vIDExYS1vbmx5IHVzYWdlICovCisjZGVmaW5lIFpNX1JFR19GTEFHX0NIQU5ORUxfSEFMRiAgICAweDQwMDAgCS8qIEhhbGYgcmF0ZSBjaGFubmVsICovCisjZGVmaW5lIFpNX1JFR19GTEFHX0NIQU5ORUxfUVVBUlRFUiAweDgwMDAgCS8qIFF1YXJ0ZXIgcmF0ZSBjaGFubmVsICovCisKKy8qIGNoYW5uZWxGbGFncyAqLworI2RlZmluZSBDSEFOTkVMX0NXX0lOVCAgMHgwMDAyICAvKiBDVyBpbnRlcmZlcmVuY2UgZGV0ZWN0ZWQgb24gY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX1RVUkJPICAgMHgwMDEwICAvKiBUdXJibyBDaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfQ0NLIDB4MDAyMCAgLyogQ0NLIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9PRkRNICAgIDB4MDA0MCAgLyogT0ZETSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfMkdIWiAgICAweDAwODAgIC8qIDIgR0h6IHNwZWN0cnVtIGNoYW5uZWwuICovCisjZGVmaW5lIENIQU5ORUxfNUdIWiAgICAweDAxMDAgIC8qIDUgR0h6IHNwZWN0cnVtIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9QQVNTSVZFIDB4MDIwMCAgLyogT25seSBwYXNzaXZlIHNjYW4gYWxsb3dlZCBpbiB0aGUgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX0RZTiAweDA0MDAgIC8qIGR5bmFtaWMgQ0NLLU9GRE0gY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX1hSICAweDA4MDAgIC8qIFhSIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9TVFVSQk8gIDB4MjAwMCAgLyogU3RhdGljIHR1cmJvLCBubyAxMWEtb25seSB1c2FnZSAqLworI2RlZmluZSBDSEFOTkVMX0hBTEYgICAgMHg0MDAwICAvKiBIYWxmIHJhdGUgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX1FVQVJURVIgMHg4MDAwICAvKiBRdWFydGVyIHJhdGUgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX0hUMjAgICAgMHgxMDAwMCAvKiBIVDIwIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9IVDQwICAgIDB4MjAwMDAgLyogSFQ0MCBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfSFQ0MFUgCTB4NDAwMDAgLyogY29udHJvbCBjaGFubmVsIGNhbiBiZSB1cHBlciBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfSFQ0MEwgCTB4ODAwMDAgLyogY29udHJvbCBjaGFubmVsIGNhbiBiZSBsb3dlciBjaGFubmVsICovCisKKy8qIHByaXZGbGFncyAqLworI2RlZmluZSBaTV9SRUdfRkxBR19DSEFOTkVMX0lOVEVSRkVSRU5DRSAgIAkweDAxIC8qIFNvZnR3YXJlIHVzZTogY2hhbm5lbCBpbnRlcmZlcmVuY2UKKwkJCQkgICAgICAgIHVzZWQgZm9yIGFzIEFSIGFzIHdlbGwgYXMgUkFEQVIKKwkJCQkgICAgICAgIGludGVyZmVyZW5jZSBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlMJCTB4MDIgLyogREZTIHJlcXVpcmVkIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF80TVNfTElNSVQJMHgwNCAvKiA0bXNlYyBwYWNrZXQgbGltaXQgb24gdGhpcyBjaGFubmVsICovCisjZGVmaW5lIFpNX1JFR19GTEFHX0NIQU5ORUxfREZTX0NMRUFSICAgICAgIDB4MDggLyogaWYgY2hhbm5lbCBoYXMgYmVlbiBjaGVja2VkIGZvciBERlMgKi8KKworI2RlZmluZSBDSEFOTkVMX0EgICAoQ0hBTk5FTF81R0hafENIQU5ORUxfT0ZETSkKKyNkZWZpbmUgQ0hBTk5FTF9CICAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX0NDSykKKyNkZWZpbmUgQ0hBTk5FTF9QVVJFRyAgIChDSEFOTkVMXzJHSFp8Q0hBTk5FTF9PRkRNKQorI2lmZGVmIG5vdGRlZgorI2RlZmluZSBDSEFOTkVMX0cgICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfRFlOKQorI2Vsc2UKKyNkZWZpbmUgQ0hBTk5FTF9HICAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX09GRE0pCisjZW5kaWYKKyNkZWZpbmUgQ0hBTk5FTF9UICAgKENIQU5ORUxfNUdIWnxDSEFOTkVMX09GRE18Q0hBTk5FTF9UVVJCTykKKyNkZWZpbmUgQ0hBTk5FTF9TVCAgKENIQU5ORUxfVHxDSEFOTkVMX1NUVVJCTykKKyNkZWZpbmUgQ0hBTk5FTF8xMDhHICAgIChDSEFOTkVMXzJHSFp8Q0hBTk5FTF9PRkRNfENIQU5ORUxfVFVSQk8pCisjZGVmaW5lIENIQU5ORUxfMTA4QSAgICBDSEFOTkVMX1QKKyNkZWZpbmUgQ0hBTk5FTF9YICAgKENIQU5ORUxfNUdIWnxDSEFOTkVMX09GRE18Q0hBTk5FTF9YUikKKyNkZWZpbmUgQ0hBTk5FTF9HX0hUICAgICAgKENIQU5ORUxfMkdIWiB8IENIQU5ORUxfT0ZETSB8IENIQU5ORUxfSFQyMCkKKyNkZWZpbmUgQ0hBTk5FTF9BX0hUICAgICAgKENIQU5ORUxfNUdIWiB8IENIQU5ORUxfT0ZETSB8IENIQU5ORUxfSFQyMCkKKworI2RlZmluZSBDSEFOTkVMX0dfSFQyMCAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX0hUMjApCisjZGVmaW5lIENIQU5ORUxfQV9IVDIwICAoQ0hBTk5FTF81R0hafENIQU5ORUxfSFQyMCkKKyNkZWZpbmUgQ0hBTk5FTF9HX0hUNDAgIChDSEFOTkVMXzJHSFp8Q0hBTk5FTF9IVDIwfENIQU5ORUxfSFQ0MCkKKyNkZWZpbmUgQ0hBTk5FTF9BX0hUNDAgIChDSEFOTkVMXzVHSFp8Q0hBTk5FTF9IVDIwfENIQU5ORUxfSFQ0MCkKKyNkZWZpbmUgQ0hBTk5FTF9BTEwgXAorICAgIChDSEFOTkVMX09GRE18Q0hBTk5FTF9DQ0t8IENIQU5ORUxfMkdIWiB8IENIQU5ORUxfNUdIWiB8IENIQU5ORUxfVFVSQk8gfCBDSEFOTkVMX0hUMjAgfCBDSEFOTkVMX0hUNDApCisjZGVmaW5lIENIQU5ORUxfQUxMX05PVFVSQk8gICAgIChDSEFOTkVMX0FMTCAmfiBDSEFOTkVMX1RVUkJPKQorCitlbnVtIHsKKyAgICBIQUxfTU9ERV8xMUEgICAgPSAweDAwMSwgICAgICAgIC8qIDExYSBjaGFubmVscyAqLworICAgIEhBTF9NT0RFX1RVUkJPICA9IDB4MDAyLCAgICAgICAgLyogMTFhIHR1cmJvLW9ubHkgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV8xMUIgICAgPSAweDAwNCwgICAgICAgIC8qIDExYiBjaGFubmVscyAqLworICAgIEhBTF9NT0RFX1BVUkVHICA9IDB4MDA4LCAgICAgICAgLyogMTFnIGNoYW5uZWxzIChPRkRNIG9ubHkpICovCisjaWZkZWYgbm90ZGVmCisgICAgSEFMX01PREVfMTFHICAgID0gMHgwMTAsICAgICAgICAvKiAxMWcgY2hhbm5lbHMgKE9GRE0vQ0NLKSAqLworI2Vsc2UKKyAgICBIQUxfTU9ERV8xMUcgICAgPSAweDAwOCwgICAgICAgIC8qIFhYWCBoaXN0b3JpY2FsICovCisjZW5kaWYKKyAgICBIQUxfTU9ERV8xMDhHICAgPSAweDAyMCwgICAgICAgIC8qIDExYStUdXJibyBjaGFubmVscyAqLworICAgIEhBTF9NT0RFXzEwOEEgICA9IDB4MDQwLCAgICAgICAgLyogMTFnK1R1cmJvIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfWFIgICAgID0gMHgxMDAsICAgICAgICAvKiBYUiBjaGFubmVscyAqLworICAgIEhBTF9NT0RFXzExQV9IQUxGX1JBVEUgPSAweDIwMCwgICAgIC8qIDExQSBoYWxmIHJhdGUgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV8xMUFfUVVBUlRFUl9SQVRFID0gMHg0MDAsICAvKiAxMUEgcXVhcnRlciByYXRlIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTFORyAgID0gMHg0MDAwLCAgICAgICAgICAgLyogMTFuZyBjaGFubmVscyAqLworICAgIEhBTF9NT0RFXzExTkEgICA9IDB4ODAwMCwgICAgICAgICAgIC8qIDExbmEgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV9BTEwgICAgPSAweGZmZmYKK307CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9IUFJFR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBydy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjdkNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcncuYwpAQCAtMCwwICsxLDE1NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorI2luY2x1ZGUgImhwYW5pLmgiCisjaW5jbHVkZSAiaHB1c2IuaCIKKyNpbmNsdWRlICJocHJlZy5oIgorI2luY2x1ZGUgIi4uLzgwMjExY29yZS9yYXRlY3RybC5oIgorCitleHRlcm4gdm9pZCB6ZklkbENtZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKKworZXh0ZXJuIHZvaWQgemZDb3JlQ3dtQnVzeSh6ZGV2X3QqIGRldiwgdTE2X3QgYnVzeSk7Cit1MTZfdCB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK3UxNl90IHpmRmx1c2hEZWxheVdyaXRlKHpkZXZfdCogZGV2KTsKKworLy8jZGVmaW5lIHptX2hwX3ByaXYoeCkgc3RydWN0IHpzSHBQcml2KiBocFByaXY9emdXbGFuRGV2LmhwUHJpdmF0ZTsKKwordm9pZCB6ZkluaXRDbWRRdWV1ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kikod2QtPmhwUHJpdmF0ZSk7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyNpZmRlZiBaTV9YUF9VU0JfTVVMVENNRAorICAgIGhwUHJpdi0+Y21kVGFpbCA9IGhwUHJpdi0+Y21kSGVhZCA9IGhwUHJpdi0+Y21kU2VuZCA9IDA7CisjZWxzZQorICAgIGhwUHJpdi0+Y21kVGFpbCA9IGhwUHJpdi0+Y21kSGVhZCA9IDA7CisjZW5kaWYKKyAgICBocFByaXYtPmNtZFBlbmRpbmcgPSAwOworICAgIGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50ID0gMDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit1MTZfdCB6ZlB1dENtZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuLCB1MTZfdCBzcmMsIHU4X3QqIGJ1ZikKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICAvKiBNYWtlIHN1cmUgY29tbWFuZCBsZW5ndGggPCBaTV9NQVhfQ01EX1NJWkUgKi8KKyAgICB6bV9hc3NlcnQoY21kTGVuIDw9IFpNX01BWF9DTURfU0laRSk7CisgICAgLyogTWFrZSBzdXJlIGNvbW1hbmQgcXVldWUgbm90IGZ1bGwgKi8KKyAgICAvL3ptX2Fzc2VydCgoKGhwUHJpdi0+Y21kVGFpbCsxKSAmIChaTV9DTURfUVVFVUVfU0laRS0xKSkgIT0gaHBQcml2LT5jbWRIZWFkKTsKKyAgICBpZiAoKChocFByaXYtPmNtZFRhaWwrMSkgJiAoWk1fQ01EX1FVRVVFX1NJWkUtMSkpID09IGhwUHJpdi0+Y21kSGVhZCApIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ01EIHF1ZXVlIGZ1bGwhISIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRUYWlsXS5jbWRMZW4gPSBjbWRMZW47CisgICAgaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kVGFpbF0uc3JjID0gc3JjOworICAgIGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZFRhaWxdLmJ1ZiA9IGJ1ZjsKKyAgICBmb3IgKGk9MDsgaTwoY21kTGVuPj4yKTsgaSsrKQorICAgIHsKKyAgICAgICAgaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kVGFpbF0uY21kW2ldID0gY21kW2ldOworICAgIH0KKworICAgIGhwUHJpdi0+Y21kVGFpbCA9IChocFByaXYtPmNtZFRhaWwrMSkgJiAoWk1fQ01EX1FVRVVFX1NJWkUtMSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZHZXRDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90KiBjbWRMZW4sIHUxNl90KiBzcmMsIHU4X3QqKiBidWYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgaWYgKGhwUHJpdi0+Y21kVGFpbCA9PSBocFByaXYtPmNtZEhlYWQpCisgICAgeworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisKKyAgICAqY21kTGVuID0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kSGVhZF0uY21kTGVuOworICAgICpzcmMgPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRIZWFkXS5zcmM7CisgICAgKmJ1ZiA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZEhlYWRdLmJ1ZjsKKyAgICBmb3IgKGk9MDsgaTwoKCpjbWRMZW4pPj4yKTsgaSsrKQorICAgIHsKKyAgICAgICAgY21kW2ldID0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kSGVhZF0uY21kW2ldOworICAgIH0KKworICAgIGhwUHJpdi0+Y21kSGVhZCA9IChocFByaXYtPmNtZEhlYWQrMSkgJiAoWk1fQ01EX1FVRVVFX1NJWkUtMSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIFpNX1hQX1VTQl9NVUxUQ01ECit2b2lkIHpmU2VuZENtZEV4KHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IG5jbWRbWk1fTUFYX0NNRF9TSVpFLzRdOworICAgIHUxNl90IG5jbWRMZW4gPSAwOworICAgIHUxNl90IGNtZEZsYWcgPSAwOworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKGhwUHJpdi0+Y21kUGVuZGluZyA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKGhwUHJpdi0+Y21kVGFpbCAhPSBocFByaXYtPmNtZFNlbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNtZEZsYWcgPSAxOworICAgICAgICAgICAgLyogR2V0IHF1ZXVlaW5nIGNvbW1hbmQgKi8KKyAgICAgICAgICAgIG5jbWRMZW49IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZFNlbmRdLmNtZExlbjsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPChuY21kTGVuPj4yKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jbWRbaV0gPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRTZW5kXS5jbWRbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBocFByaXYtPmNtZFNlbmQgPSAoaHBQcml2LT5jbWRTZW5kKzEpICYgKFpNX0NNRF9RVUVVRV9TSVpFLTEpOworCisgICAgICAgICAgICBocFByaXYtPmNtZFBlbmRpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoY21kRmxhZyA9PSAxKSkKKyAgICB7CisgICAgICAgIHpmSWRsQ21kKGRldiwgbmNtZCwgbmNtZExlbik7CisgICAgfQorfQorCit2b2lkIHpmaVNlbmRDbWRDb21wKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaHBQcml2LT5jbWRQZW5kaW5nID0gMDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZTZW5kQ21kRXgoZGV2KTsKK30KKyNlbmRpZgorCit1MTZfdCB6Zklzc3VlQ21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4sIHUxNl90IHNyYywgdThfdCogYnVmKQoreworICAgIHUxNl90IGNtZEZsYWcgPSAwOworICAgIHUxNl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMSwgImNtZExlbj0iLCBjbWRMZW4pOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworI2lmZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgcmV0ID0gemZQdXRDbWQoZGV2LCBjbWQsIGNtZExlbiwgc3JjLCBidWYpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocmV0ICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICB6ZlNlbmRDbWRFeChkZXYpOworI2Vsc2UKKyAgICBpZiAoaHBQcml2LT5jbWRQZW5kaW5nID09IDApCisgICAgeworICAgICAgICBocFByaXYtPmNtZFBlbmRpbmcgPSAxOworICAgICAgICBjbWRGbGFnID0gMTsKKyAgICB9CisgICAgcmV0ID0gemZQdXRDbWQoZGV2LCBjbWQsIGNtZExlbiwgc3JjLCBidWYpOworCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChyZXQgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChjbWRGbGFnID09IDEpCisgICAgeworICAgICAgICB6ZklkbENtZChkZXYsIGNtZCwgY21kTGVuKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZklkbFJzcCh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKQoreworICAgIHUzMl90IGNtZFtaTV9NQVhfQ01EX1NJWkUvNF07CisgICAgdTE2X3QgY21kTGVuOworICAgIHUxNl90IHNyYzsKKyAgICB1OF90KiBidWY7CisgICAgdTMyX3QgbmNtZFtaTV9NQVhfQ01EX1NJWkUvNF07CisgICAgdTE2X3QgbmNtZExlbiA9IDA7CisgICAgdTE2X3QgcmV0OworICAgIHUxNl90IGNtZEZsYWcgPSAwOworICAgIHUxNl90IGk7CisgICAgczMyX3QgbmY7CisgICAgczMyX3Qgbm9pc2VmbG9vcls0XTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldCA9IHpmR2V0Q21kKGRldiwgY21kLCAmY21kTGVuLCAmc3JjLCAmYnVmKTsKKyAgICAjaWYgMAorICAgIHptX2Fzc2VydChyZXQgPT0gMCk7CisgICAgI2Vsc2UKKyAgICBpZiAocmV0ICE9IDApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFcnJvciBJZGxSc3AgYmVjYXVzZSBub25lIGNtZCEhXG4iKTsKKyAgICAgICAgI2lmbmRlZiBaTV9YUF9VU0JfTVVMVENNRAorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm47CisgICAgICAgICNlbmRpZgorICAgIH0KKyAgICAjZW5kaWYKKyNpZmRlZiBaTV9YUF9VU0JfTVVMVENNRAorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisjZWxzZQorICAgIGlmIChocFByaXYtPmNtZFRhaWwgIT0gaHBQcml2LT5jbWRIZWFkKQorICAgIHsKKyAgICAgICAgY21kRmxhZyA9IDE7CisgICAgICAgIC8qIEdldCBxdWV1ZWluZyBjb21tYW5kICovCisgICAgICAgIG5jbWRMZW49IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZEhlYWRdLmNtZExlbjsKKyAgICAgICAgZm9yIChpPTA7IGk8KG5jbWRMZW4+PjIpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jbWRbaV0gPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRIZWFkXS5jbWRbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaHBQcml2LT5jbWRQZW5kaW5nID0gMDsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKGNtZEZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIHpmSWRsQ21kKGRldiwgbmNtZCwgbmNtZExlbik7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNyYyA9PSBaTV9PSURfUkVBRCkKKyAgICB7CisgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JFRyhkZXYsIDB4MTE3NzJjLCByc3BbMV0pOworICAgICAgICB6ZndEYmdSZWFkUmVnRG9uZShkZXYsIGNtZFsxXSwgcnNwWzFdKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9GTEFTSF9DSEtTVU0pCisgICAgeworICAgICAgICB6ZndEYmdHZXRGbGFzaENoa1N1bURvbmUoZGV2LCByc3ArMSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfRkxBU0hfUkVBRCkKKyAgICB7CisgICAgICAgIHUzMl90ICBkYXRhbGVuOworICAgICAgICB1MTZfdCBpOworCisgICAgICAgIGRhdGFsZW4gPSAocnNwWzBdICYgMjU1KTsKKworICAgICAgICB6ZndEYmdSZWFkRmxhc2hEb25lKGRldiwgY21kWzFdLCByc3ArMSwgZGF0YWxlbik7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfRkxBU0hfUFJPR1JBTSkKKyAgICB7CisgICAgICAgIC8qIE5vbiBkbyAqLworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX1dSSVRFKQorICAgIHsKKyAgICAgICAgemZ3RGJnV3JpdGVSZWdEb25lKGRldiwgY21kWzFdLCBjbWRbMl0pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX1RBTExZKQorICAgIHsKKwkJemZDb2xsZWN0SFdUYWxseShkZXYsIHJzcCwgMCk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfVEFMTFlfQVBEKQorICAgIHsKKwkJemZDb2xsZWN0SFdUYWxseShkZXYsIHJzcCwgMSk7CisgICAgICAgIHpmd0RiZ1JlYWRUYWxseURvbmUoZGV2KTsKKyNpZmRlZiBaTV9FTkFCTEVfQkFfUkFURUNUUkwKKyAgICAgICAgemZSYXRlQ3RybEFnZ3JTdGEoZGV2KTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX0RLVFhfU1RBVFVTKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgic3JjID0gem1fT0lEX0RLVFhfU1RBVFVTIik7CisgICAgICAgIHpmd0RiZ1F1ZXJ5SHdUeEJ1c3lEb25lKGRldiwgcnNwWzFdKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0NNRF9TRVRfRlJFUVVFTkNZKQorICAgIHsKKworLy8jaWZkZWYgWk1fT1RVU19FTkFCTEVfUkVUUllfRlJFUV9DSEFOR0UKKyNpZiAwCisgICAgem1fZGVidWdfbXNnMSgiUmV0cnkgU2V0IEZyZXF1ZW5jeSA9ICIsIHJzcFsxXSk7CisKKyAgICAjaWYgMQorICAgIC8vIFJlYWQgdGhlIE5vaXNlIEZsb29yIHZhbHVlICEKKyAgICBuZiA9ICgocnNwWzJdPj4xOSkgJiAweDFmZik7CisgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgeworICAgICAgICBub2lzZWZsb29yWzBdID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbm9pc2VmbG9vclswXSA9IG5mOworICAgIH0KKworICAgIHptX2RlYnVnX21zZzEoIk5vaXNlIEZsb29yWzFdID0gIiwgbm9pc2VmbG9vclswXSk7CisKKyAgICBuZiA9ICgocnNwWzNdPj4xOSkgJiAweDFmZik7CisgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgeworICAgICAgICBub2lzZWZsb29yWzFdID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbm9pc2VmbG9vclsxXSA9IG5mOworICAgIH0KKworICAgIHptX2RlYnVnX21zZzEoIk5vaXNlIEZsb29yWzJdID0gIiwgbm9pc2VmbG9vclsxXSk7CisgICAgem1fZGVidWdfbXNnMSgiSXMgU2l0ZSBTdXJ2ZXkgPSAiLCBocFByaXYtPmlzU2l0ZVN1cnZleSk7CisgICAgI2VuZGlmCisKKyAgICAgICAgaWYgKCAocnNwWzFdICYmIGhwUHJpdi0+ZnJlcVJldHJ5Q291bnRlciA9PSAwKSB8fAorICAgICAgICAgICAgICgoKG5vaXNlZmxvb3JbMF0+LTYwKXx8KG5vaXNlZmxvb3JbMV0+LTYwKSkgJiYgaHBQcml2LT5mcmVxUmV0cnlDb3VudGVyPT0wKSB8fAorICAgICAgICAgICAgICgoYWJzKG5vaXNlZmxvb3JbMF0tbm9pc2VmbG9vclsxXSk+PTkpICYmIGhwUHJpdi0+ZnJlcVJldHJ5Q291bnRlcj09MCkgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJSZXRyeSB0byBpc3N1ZSB0aGUgZnJlcXVlbmN5IGNoYW5nZSBjb21tYW5kIik7CisKKyAgICAgICAgICAgIGlmICggaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNvbGQgUmVzZXQiKTsKKworICAgICAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGhwUHJpdi0+bGF0ZXN0RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0Qnc0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKworICAgICAgICAgICAgICAgIGlmICggaHBQcml2LT5pc1NpdGVTdXJ2ZXkgIT0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPmZyZXFSZXRyeUNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwU2V0RnJlcXVlbmN5RXgoZGV2LCBocFByaXYtPmxhdGVzdEZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEJ3NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RFeHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKworLyogcmV0OiBCaXQwOiBBR0MgY2FsaWJyYXRpb24gICAwPT5maW5pc2ggIDE9PnVuZmluaXNoICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQml0MTogTm9pc2UgY2FsaWJyYXRpb24gMD0+ZmluaXNoICAxPT51bmZpbmlzaCAgICAgICAgICAgICAgICovCisvKiAgICAgIEJpdDI6IE5vaXNlIGNhbGlicmF0aW9uIGZpbmlzaCwgYnV0IE5GIHZhbHVlIHVuZXhjZXB0ZWQgPT4gMSAqLworICAgICAgICBpZiAoIChyc3BbMV0gJiAweDEpIHx8IChyc3BbMV0gJiAweDQpICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiU2V0IEZyZXF1ZW5jeSBmYWlsIDogcmV0ID0gIiwgcnNwWzFdKTsKKworICAgICAgICAgICAgLyogMS4gQUdDIENhbGlicmF0aW9uIGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIDIuIE5vaXNlIENhbGlicmF0aW9uIGZpbmlzaCBidXQgZXJyb3IgTm9pc2VGbG9vciB2YWx1ZSAgICovCisgICAgICAgICAgICAvKiAgICAgIGFuZCBub3QgaW4gc2l0ZXN1cnZleSwgdHJ5IG1vcmUgdHdpY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBocFByaXYtPmlzU2l0ZVN1cnZleSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA8IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29sZCByZXNldCAqLworICAgICAgICAgICAgICAgICAgICB6ZkhwU2V0RnJlcXVlbmN5RXgoZGV2LCBocFByaXYtPmxhdGVzdEZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RCdzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlcisrOworICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJSZXRyeSB0byBpc3N1ZSB0aGUgZnJlcXVlbmN5IGNoYW5nZSBjb21tYW5kKGNvbGQgcmVzZXQpIGNvdW50ZXIgPSAiLCBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGYWlsIDogd2Ugd291bGQgbm90IGFjY2VwdCB0aGlzIHJlc3VsdCEgKi8KKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiXG5cblxuXG4gIEZhaWwgdHdpY2UgY29sZCByZXNldCBcblxuXG5cbiIpOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5Q29tcGxldGUoZGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaW4gc2l0ZXN1cnZleSwgY29sZHJlc2V0IGluIG5leHQgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAxOworICAgICAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5Q29tcGxldGUoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyc3BbMV0gJiAweDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIlNldCBGcmVxdWVuY3kgZmFpbCAyIDogcmV0ID0gIiwgcnNwWzFdKTsKKworICAgICAgICAgICAgLyogTm9pc2UgQ2FsaWJyYXRpb24gdW4tZmluaXNoICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAgICBhbmQgbm90IGluIHNpdGVzdXJ2ZXksIHRyeSBtb3JlIG9uY2UgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBocFByaXYtPmlzU2l0ZVN1cnZleSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA8IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29sZCByZXNldCAqLworICAgICAgICAgICAgICAgICAgICB6ZkhwU2V0RnJlcXVlbmN5RXgoZGV2LCBocFByaXYtPmxhdGVzdEZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RCdzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlcisrOworICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCIyIFJldHJ5IHRvIGlzc3VlIHRoZSBmcmVxdWVuY3kgY2hhbmdlIGNvbW1hbmQoY29sZCByZXNldCkgY291bnRlciA9ICIsIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZhaWwgOiB3ZSB3b3VsZCBub3QgYWNjZXB0IHRoaXMgcmVzdWx0ISAqLworICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJcblxuXG5cbiAgMiBGYWlsIHR3aWNlIGNvbGQgcmVzZXQgXG5cblxuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeUNvbXBsZXRlKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGluIHNpdGVzdXJ2ZXksIHNraXAgdGhpcyBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgICAgICBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxID0gMDsKKyAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeUNvbXBsZXRlKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9lbHNlIGlmIChyc3BbMV0gJiAweDQpCisgICAgICAgIC8veworICAgICAgICAvLyAgICB6bV9kZWJ1Z19tc2cxKCJTZXQgRnJlcXVlbmN5IGZhaWwgMyA6IHJldCA9ICIsIHJzcFsxXSk7CisgICAgICAgIC8vICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICAvLyAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAvLyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZShkZXYpOworICAgICAgICAvL30KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL2hwUHJpdi0+ZnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cyKCIgcmV0dXJuIGNvbXBsZXRlLCByZXQgPSAiLCByc3BbMV0pOworCisgICAgICAgICAgICAvKiBzZXQgYmJfaGVhdnlfY2xpcF9lbmFibGUgKi8KKyAgICAgICAgICAgIGlmIChocFByaXYtPmVuYWJsZUJCSGVhdnlDbGlwICYmIGhwUHJpdi0+aHdCQkhlYXZ5Q2xpcCAmJgorICAgICAgICAgICAgICAgIGhwUHJpdi0+ZG9CQkhlYXZ5Q2xpcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1MzJfdCBzZXRWYWx1ZSA9IDB4MjAwOworCisgICAgICAgICAgICAgICAgc2V0VmFsdWUgfD0gaHBQcml2LT5zZXRWYWx1ZUhlYXZ5Q2xpcDsKKworICAgICAgICAgICAgICAgIC8vem1fZGJnKCgiRG8gaGVhdnkgY2xpcCBzZXRWYWx1ZSA9ICVkXG4iLCBzZXRWYWx1ZSkpOworCisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDk5ZTArMHgxYmMwMDAsIHNldFZhbHVlKTsKKyAgICAgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxID0gMDsKKyAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgCSAgICB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZShkZXYpOworICAgIAl9CisKKyAgICAgICAgI2lmIDEKKyAgICAgICAgLy8gUmVhZCB0aGUgTm9pc2UgRmxvb3IgdmFsdWUgIQorICAgICAgICBuZiA9ICgocnNwWzJdPj4xOSkgJiAweDFmZik7CisgICAgICAgIGlmICgobmYgJiAweDEwMCkgIT0gMHgwKQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzBdID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMF0gPSBuZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3JbMV0gPSAiLCBub2lzZWZsb29yWzBdKTsKKworICAgICAgICBuZiA9ICgocnNwWzNdPj4xOSkgJiAweDFmZik7CisgICAgICAgIGlmICgobmYgJiAweDEwMCkgIT0gMHgwKQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzFdID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMV0gPSBuZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3JbMl0gPSAiLCBub2lzZWZsb29yWzFdKTsKKworICAgICAgICBuZiA9ICgocnNwWzVdPj4yMykgJiAweDFmZik7CisgICAgICAgIGlmICgobmYgJiAweDEwMCkgIT0gMHgwKQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzJdID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMl0gPSBuZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3IgZXh0WzFdID0gIiwgbm9pc2VmbG9vclsyXSk7CisKKyAgICAgICAgbmYgPSAoKHJzcFs2XT4+MjMpICYgMHgxZmYpOworICAgICAgICBpZiAoKG5mICYgMHgxMDApICE9IDB4MCkKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclszXSA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzNdID0gbmY7CisgICAgICAgIH0KKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoIk5vaXNlIEZsb29yIGV4dFsyXSA9ICIsIG5vaXNlZmxvb3JbM10pOworCisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiSXMgU2l0ZSBTdXJ2ZXkgPSAiLCBocFByaXYtPmlzU2l0ZVN1cnZleSk7CisgICAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fQ01EX1NFVF9LRVkpCisgICAgeworICAgICAgICB6ZkNvcmVTZXRLZXlDb21wbGV0ZShkZXYpOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fQ1dNX1JFQUQpCisgICAgeworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJDV00gcnNwWzFdPSIsIHJzcFsxXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIkNXTSByc3BbMl09IiwgcnNwWzJdKTsKKyAgICAgICAgemZDb3JlQ3dtQnVzeShkZXYsIHpmQ3dtSXNFeHRDaGFuQnVzeShyc3BbMV0sIHJzcFsyXSkpOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fTUFDX1JFQUQpCisgICAgeworICAgICAgICAvKiByc3BbMV0gPSBaTV9TRUVQUk9NX01BQ19BRERSRVNTX09GRlNFVDsgICAqLworICAgICAgICAvKiByc3BbMl0gPSBaTV9TRUVQUk9NX01BQ19BRERSRVNTX09GRlNFVCs0OyAqLworICAgICAgICAvKiByc3BbM10gPSBaTV9TRUVQUk9NX1JFR0RPTUFJTl9PRkZTRVQ7ICAgICAqLworICAgICAgICAvKiByc3BbNF0gPSBaTV9TRUVQUk9NX1ZFUklTT05fT0ZGU0VUOyAgICAgICAqLworICAgICAgICAvKiByc3BbNV0gPSBaTV9TRUVQUk9NX0hBUkRXQVJFX1RZUEVfT0ZGU0VUOyAqLworICAgICAgICAvKiByc3BbNl0gPSBaTV9TRUVQUk9NX0hXX0hFQVZZX0NMSVA7ICAgICAgICAqLworCisgICAgICAgIHU4X3QgYWRkcls2XSwgQ0NTLCBXV1I7CisgICAgICAgIHUxNl90IENvdW50cnlEb21haW5Db2RlOworCisgICAgICAgIC8qIEJCIGhlYXZ5IGNsaXAgKi8KKyAgICAgICAgLy9ocFByaXYtPmVlcHJvbUhlYXZ5Q2xpcEZsYWcgPSAodThfdCkoKHJzcFs2XT4+MjQpICYgMHhmZik7IC8vIGZvcmNlIGVuYWJsZSA4MTA3CisgICAgICAgIC8vem1fbXNnMl9tbShaTV9MVl8wLCAiZWVwcm9tSGVhdnlDbGlwRmxhZyIsIGhwUHJpdi0+ZWVwcm9tSGVhdnlDbGlwRmxhZyk7CisgICAgICAgICNpZiAwCisgICAgICAgIGlmIChocFByaXYtPmh3QkJIZWF2eUNsaXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgImVuYWJsZSBCQiBIZWF2eSBDbGlwIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJOb3QgZW5hYmxlIEJCIEhlYXZ5IENsaXAiKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiTUFDIHJzcFsxXT0iLCByc3BbMV0pOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJNQUMgcnNwWzJdPSIsIHJzcFsyXSk7CisKKyAgICAgICAgYWRkclswXSA9ICh1OF90KShyc3BbMV0gJiAweGZmKTsKKyAgICAgICAgYWRkclsxXSA9ICh1OF90KSgocnNwWzFdPj44KSAmIDB4ZmYpOworICAgICAgICBhZGRyWzJdID0gKHU4X3QpKChyc3BbMV0+PjE2KSAmIDB4ZmYpOworICAgICAgICBhZGRyWzNdID0gKHU4X3QpKChyc3BbMV0+PjI0KSAmIDB4ZmYpOworICAgICAgICBhZGRyWzRdID0gKHU4X3QpKHJzcFsyXSAmIDB4ZmYpOworICAgICAgICBhZGRyWzVdID0gKHU4X3QpKChyc3BbMl0+PjgpICYgMHhmZik7CisvKiNpZmRlZiBaTV9GQjUwCisgICAgICAgIGFkZHJbMF0gPSAodThfdCkoMCAmIDB4ZmYpOworICAgICAgICBhZGRyWzFdID0gKHU4X3QpKDMgJiAweGZmKTsKKyAgICAgICAgYWRkclsyXSA9ICh1OF90KSgxMjcgJiAweGZmKTsKKyAgICAgICAgYWRkclszXSA9ICh1OF90KSgwICYgMHhmZik7CisgICAgICAgIGFkZHJbNF0gPSAodThfdCkoOSAmIDB4ZmYpOworICAgICAgICBhZGRyWzVdID0gKHU4X3QpKDExICYgMHhmZik7CisjZW5kaWYqLworCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQUNfQUREUl9MLAorICAgICAgICAgICAgICAgICgoKCh1MzJfdClhZGRyWzNdKTw8MjQpIHwgKCgodTMyX3QpYWRkclsyXSk8PDE2KSB8ICgoKHUzMl90KWFkZHJbMV0pPDw4KSB8IGFkZHJbMF0pKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0gsCisgICAgICAgICAgICAgICAgKCgoKHUzMl90KWFkZHJbNV0pPDw4KSB8IGFkZHJbNF0pKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgICAgICB3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMF0gPSAodTE2X3QpKHJzcFs1XSYweGZmZmYpOworICAgICAgICB3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMV0gPSAodTE2X3QpKHJzcFs1XT4+MTYpOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJsZWRNb2RlWzBdPSIsIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVswXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgImxlZE1vZGVbMV09Iiwgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzFdKTsKKworICAgICAgICAvKiBSZWd1bGF0b3J5IFJlbGF0ZWQgU2V0dGluZyAqLworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJSZWdEb21haW4gcnNwPSIsIHJzcFszXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIk9wRmxhZ3MrRWVwTWlzYz0iLCByc3BbNF0pOworICAgICAgICBocFByaXYtPk9wRmxhZ3MgPSAodThfdCkoKHJzcFs0XT4+MTYpICYgMHhmZik7CisgICAgICAgIGlmICgocnNwWzJdID4+IDI0KSA9PSAweDEpIC8vVHggbWFzayA9PSAweDEKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiT1RVUyAxeDIiKTsKKyAgICAgICAgICAgIGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSB8PSBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJPVFVTIDJ4MiIpOworICAgICAgICB9CisgICAgICAgIGlmIChocFByaXYtPk9wRmxhZ3MgJiAweDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSB8PSBaTV9IUF9DQVBfNUc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhwUHJpdi0+T3BGbGFncyAmIDB4MikKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT5oYWxDYXBhYmlsaXR5IHw9IFpNX0hQX0NBUF8yRzsKKyAgICAgICAgfQorCisKKyAgICAgICAgQ0NTID0gKHU4X3QpKChyc3BbM10gJiAweDgwMDApID4+IDE1KTsKKyAgICAgICAgV1dSID0gKHU4X3QpKChyc3BbM10gJiAweDQwMDApID4+IDE0KTsKKyAgICAgICAgQ291bnRyeURvbWFpbkNvZGUgPSAodTE2X3QpKHJzcFszXSAmIDB4M0ZGRik7CisKKyAgICAgICAgaWYgKHJzcFszXSAhPSAweGZmZmZmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ0NTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gR2V0IFJlZ3VsYXRpb24gVGFibGUgZnJvbSBDb3VudHJ5IENvZGUiKTsKKyAgICAgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUNvdW50cnkoZGV2LCBDb3VudHJ5RG9tYWluQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBHZXQgUmVndWxhdGlvbiBUYWJsZSBmcm9tIFJlZyBEb21haW4iKTsKKyAgICAgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBDb3VudHJ5RG9tYWluQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoV1dSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gRW5hYmxlIDgwMi4xMWQiKTsKKyAgICAgICAgICAgICAgICAvKiBiZWxvdyBsaW5lIHNoYWxsIGJlIHVubWFya2VkIGFmdGVyIEEgYmFuZCBpcyByZWFkeSAqLworICAgICAgICAgICAgICAgIC8vemZpV2xhblNldERvdDExRE1vZGUoZGV2LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZShkZXYsIE5PX0VOVU1SRCk7CisgICAgICAgIH0KKworICAgICAgICB6ZkNvcmVNYWNBZGRyZXNzTm90aWZ5KGRldiwgYWRkcik7CisKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0VFUFJPTV9SRUFEKQorICAgIHsKKyNpZiAwCisgICAgICAgIHU4X3QgYWRkcls2XSwgQ0NTLCBXV1I7CisgICAgICAgIHUxNl90IENvdW50cnlEb21haW5Db2RlOworI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPFpNX0hBTF9NQVhfRUVQUk9NX1BSUTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaHBQcml2LT5lZXByb21JbWFnZUluZGV4IDwgMTAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPmVlcHJvbUltYWdlW2hwUHJpdi0+ZWVwcm9tSW1hZ2VJbmRleCsrXSA9IHJzcFtpKzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhwUHJpdi0+ZWVwcm9tSW1hZ2VJbmRleCA9PSAoWk1fSEFMX01BWF9FRVBST01fUkVRKlpNX0hBTF9NQVhfRUVQUk9NX1BSUSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZiAwCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwxMDI0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiaW5kZXg9IiwgaSk7CisgICAgICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiZWVwcm9tSW1hZ2U9IiwgaHBQcml2LT5lZXByb21JbWFnZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIk1BQyBbMV09IiwgaHBQcml2LT5lZXByb21JbWFnZVsweDIwYy80XSk7CisgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJNQUMgWzJdPSIsIGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMTAvNF0pOworI2lmIDAKKyAgICAgICAgICAgIGFkZHJbMF0gPSAodThfdCkoaHBQcml2LT5lZXByb21JbWFnZVsweDIwYy80XSAmIDB4ZmYpOworICAgICAgICAgICAgYWRkclsxXSA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIwYy80XT4+OCkgJiAweGZmKTsKKyAgICAgICAgICAgIGFkZHJbMl0gPSAodThfdCkoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMGMvNF0+PjE2KSAmIDB4ZmYpOworICAgICAgICAgICAgYWRkclszXSA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIwYy80XT4+MjQpICYgMHhmZik7CisgICAgICAgICAgICBhZGRyWzRdID0gKHU4X3QpKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMTAvNF0gJiAweGZmKTsKKyAgICAgICAgICAgIGFkZHJbNV0gPSAodThfdCkoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMTAvNF0+PjgpICYgMHhmZik7CisKKyAgICAgICAgICAgIHpmQ29yZU1hY0FkZHJlc3NOb3RpZnkoZGV2LCBhZGRyKTsKKworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0wsCisgICAgICAgICAgICAgICAgICAgICgoKCh1MzJfdClhZGRyWzNdKTw8MjQpIHwgKCgodTMyX3QpYWRkclsyXSk8PDE2KSB8ICgoKHUzMl90KWFkZHJbMV0pPDw4KSB8IGFkZHJbMF0pKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQUNfQUREUl9ILAorICAgICAgICAgICAgICAgICAgICAoKCgodTMyX3QpYWRkcls1XSk8PDgpIHwgYWRkcls0XSkpOworICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgICAgICAgICAgLyogUmVndWxhdG9yeSBSZWxhdGVkIFNldHRpbmcgKi8KKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIlJlZ0RvbWFpbiA9IiwgaHBQcml2LT5lZXByb21JbWFnZVsweDIwOC80XSk7CisgICAgICAgICAgICBDQ1MgPSAodThfdCkoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMDgvNF0gJiAweDgwMDApID4+IDE1KTsKKyAgICAgICAgICAgIFdXUiA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIwOC80XSAmIDB4NDAwMCkgPj4gMTQpOworICAgICAgICAgICAgLyogYmVsb3cgbGluZSBzaGFsbCBiZSB1bm1hcmtlZCBhZnRlciBBIGJhbmQgaXMgcmVhZHkgKi8KKyAgICAgICAgICAgIC8vQ291bnRyeURvbWFpbkNvZGUgPSAodTE2X3QpKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMDgvNF0gJiAweDNGRkYpOworICAgICAgICAgICAgQ291bnRyeURvbWFpbkNvZGUgPSA4OworICAgICAgICAgICAgaWYgKENDUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEdldCBSZWd1bGF0aW9uIFRhYmxlIGZyb20gQ291bnRyeSBDb2RlIik7CisgICAgICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21Db3VudHJ5KGRldiwgQ291bnRyeURvbWFpbkNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gR2V0IFJlZ3VsYXRpb24gVGFibGUgZnJvbSBSZWcgRG9tYWluIik7CisgICAgICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKGRldiwgQ291bnRyeURvbWFpbkNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFdXUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEVuYWJsZSA4MDIuMTFkIik7CisgICAgICAgICAgICAgICAgLyogYmVsb3cgbGluZSBzaGFsbCBiZSB1bm1hcmtlZCBhZnRlciBBIGJhbmQgaXMgcmVhZHkgKi8KKyAgICAgICAgICAgICAgICAvL3pmaVdsYW5TZXREb3QxMURNb2RlKGRldiwgMSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHpmQ29yZUhhbEluaXRDb21wbGV0ZShkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT5lZXByb21JbWFnZVJkUmVxKys7CisgICAgICAgICAgICB6ZkhwTG9hZEVFUFJPTUZyb21GVyhkZXYpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9FRVBST01fV1JJVEUpCisgICAgeworICAgICAgICB6ZndEYmdXcml0ZUVlcHJvbURvbmUoZGV2LCBjbWRbMV0sIGNtZFsyXSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9BTklfUkVBRCkKKyAgICB7CisgICAgICAgIHUzMl90IGN5Y2xlVGltZSwgY3RsQ2xlYXI7CisKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiQU5JIHJzcFsxXT0iLCByc3BbMV0pOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJBTkkgcnNwWzJdPSIsIHJzcFsyXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIkFOSSByc3BbM109IiwgcnNwWzNdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiQU5JIHJzcFs0XT0iLCByc3BbNF0pOworCisgICAgICAgIGhwUHJpdi0+Y3RsQnVzeSArPSByc3BbMV07CisgICAgICAgIGhwUHJpdi0+ZXh0QnVzeSArPSByc3BbMl07CisKKyAgICAgICAgY3ljbGVUaW1lID0gMTAwMDAwOyAvLzEwMCBtaW5pc2Vjb25kcworCisgICAgICAgIGlmIChjeWNsZVRpbWUgPiByc3BbMV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0bENsZWFyID0gKGN5Y2xlVGltZSAtIHJzcFsxXSkgLyAxMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdGxDbGVhciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdkLT5hbmlFbmFibGUpCisgICAgICAgICAgICB6ZkhwQW5pQXJQb2xsKGRldiwgY3RsQ2xlYXIsIHJzcFszXSwgcnNwWzRdKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0NNRF9FQ0hPKQorICAgIHsKKyAgICAgICAgaWYgKCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJlSW5pdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQ29yZUhhbEluaXRDb21wbGV0ZShkZXYpOworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSZUluaXQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZIcExvYWRFRVBST01Gcm9tRlcoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX0ZXX0RMX0lOSVQpCisgICAgeworICAgICAgICB6ZndEYmdEb3dubG9hZEZ3SW5pdERvbmUoZGV2KTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZldyaXRlUmVnSW50ZXJuYWxSZWcgICAgICAgKi8KKy8qICAgICAgV3JpdGUgb24gY2hpcCBpbnRlcm5hbCByZWdpc3RlciBpbW1lZGlhdGVseS4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YWwgOiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmV3JpdGVSZWdJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHUzMl90IGNtZFszXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMTA4OworICAgIGNtZFsxXSA9IGFkZHI7CisgICAgY21kWzJdID0gdmFsOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcgICAgICovCisvKiAgICAgIFdyaXRlIG9uIGNoaXAgaW50ZXJuYWwgcmVnaXN0ZXIsIHdyaXRlIG9wZXJhdGlvbiBtYXkgYmUgICAgICAgICAqLworLyogICAgICBwb3N0cG9uZWQgdG8gZm9ybSBhIG11bHRpcGxlIHdyaXRlIGNvbW1hbmQuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhbCA6IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBjb21tYW5kIGJlZW4gcG9zdHBvbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAxIDogY29tbWFuZHMgYmVlbiBleGVjdXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKiBlbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIFN0b3JlIGNvbW1hbmQgdG8gZ2xvYmFsIGJ1ZmZlciAqLworICAgIGhwUHJpdi0+Y21kLmRlbGF5V2NtZEFkZHJbaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnRdID0gYWRkcjsKKyAgICBocFByaXYtPmNtZC5kZWxheVdjbWRWYWxbaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQrK10gPSB2YWw7CisKKyAgICAvKiBJZiBwZW5kaW5nIGNvbW1hbmQgcmVhY2ggc2l6ZSBsaW1pdCAqLworICAgIGlmICgoaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQpID49ICgoWk1fTUFYX0NNRF9TSVpFIC0gNCkgPj4gMykpCisgICAgeworICAgICAgICBjbWRbMF0gPSAweDAwMDAwMTAwICsgKGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50PDwzKTsKKworICAgICAgICAvKiBjb3B5IGNvbW1hbmQgdG8gY21kIGJ1ZmZlciAqLworICAgICAgICBmb3IgKGk9MDsgaTxocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjbWRbMSsoaTw8MSldID0gaHBQcml2LT5jbWQuZGVsYXlXY21kQWRkcltpXTsKKyAgICAgICAgICAgIGNtZFsyKyhpPDwxKV0gPSBocFByaXYtPmNtZC5kZWxheVdjbWRWYWxbaV07CisgICAgICAgIH0KKyAgICAgICAgLyogcmVzZXQgcGVuZGluZyBjb21tYW5kICovCisgICAgICAgIGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50ID0gMDsKKworICAgICAgICAvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgLyogaXNzdWUgd3JpdGUgY29tbWFuZCAqLworICAgICAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA0KyhpPDwzKSwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUgICAgICAgICAgICovCisvKiAgICAgIEZsdXNoIHBlbmRpbmcgd3JpdGUgY29tbWFuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBubyBwZW5kaW5nIGNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAxIDogY29tbWFuZHMgYmVlbiBleGVjdXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIGVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogSWYgdGhlcmUgaXMgcGVuZGluZyBjb21tYW5kICovCisgICAgaWYgKGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50ID4gMCkKKyAgICB7CisgICAgICAgIGNtZFswXSA9IDB4MDAwMDAxMDAgKyAoaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQ8PDMpOworCisgICAgICAgIC8qIGNvcHkgY29tbWFuZCB0byBjbWQgYnVmZmVyICovCisgICAgICAgIGZvciAoaT0wOyBpPGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNtZFsxKyhpPDwxKV0gPSBocFByaXYtPmNtZC5kZWxheVdjbWRBZGRyW2ldOworICAgICAgICAgICAgY21kWzIrKGk8PDEpXSA9IGhwUHJpdi0+Y21kLmRlbGF5V2NtZFZhbFtpXTsKKyAgICAgICAgfQorICAgICAgICAvKiByZXNldCBwZW5kaW5nIGNvbW1hbmQgKi8KKyAgICAgICAgaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQgPSAwOworCisgICAgICAgIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiBpc3N1ZSB3cml0ZSBjb21tYW5kICovCisgICAgICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQrKGk8PDMpLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisKK3UzMl90IHpmaURiZ0RlbGF5V3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKwl6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIGFkZHIsIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmaURiZ0ZsdXNoRGVsYXlXcml0ZSh6ZGV2X3QqIGRldikKK3sKKwl6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnV3JpdGVSZWcgICAgICAgICAgICAgICovCisvKiAgICAgIFdyaXRlIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFsIDogdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHUzMl90IGNtZFszXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMTA4OworICAgIGNtZFsxXSA9IGFkZHI7CisgICAgY21kWzJdID0gdmFsOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9XUklURSwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdXcml0ZUZsYXNoICAgICAgICAgICAgKi8KKy8qICAgICAgV3JpdGUgZmxhc2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YWwgOiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWWpzdW5nICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDIgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ1dyaXRlRmxhc2goemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICB1MzJfdCBjbWRbM107CisgICAgdTE2X3QgcmV0OworCisgICAgLy9jbWRbMF0gPSAweDAwMDBCMDA4OworCS8qIGxlblswXSA6IHR5cGVbMHhCMF0gOiBzZXFbP10gKi8KKyAgICBjbWRbMF0gPSA4IHwgKFpNX0NNRF9XRkxBU0ggPDwgOCk7CisgICAgY21kWzFdID0gYWRkcjsKKyAgICBjbWRbMl0gPSB2YWw7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX1dSSVRFLCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnV3JpdGVFZXByb20gICAgICAgICAgICAqLworLyogICAgICBXcml0ZSBFRVBST00uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YWwgOiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA2ICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ1dyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgdTMyX3QgY21kWzNdOworICAgIHUxNl90IHJldDsKKworICAgIC8vY21kWzBdID0gMHgwMDAwQjAwODsKKwkvKiBsZW5bMF0gOiB0eXBlWzB4QjBdIDogc2VxWz9dICovCisgICAgY21kWzBdID0gOCB8IChaTV9DTURfV1JFRVBST00gPDwgOCk7CisgICAgY21kWzFdID0gYWRkcjsKKyAgICBjbWRbMl0gPSB2YWw7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fRUVQUk9NX1dSSVRFLCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnQmxvY2tXcml0ZUVlcHJvbSAgICAgICovCisvKiAgICAgIEJsb2NrIFdyaXRlIEVlcHJvbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcC5zOiBub3csaXQgd2lsbCB3cml0ZSAxNiBieXRlcyByZWdpc3RlciBkYXRhIHBlciBibG9jayAoTj00KSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBpbnB1dCBkYXRhIGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA2ICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vI2RlZmluZSBOICAgICAgIGJ1Zmxlbi80CisvLyNkZWZpbmUgU0laRSAgICAoMipOKzEpCisKK3UzMl90IHpmaURiZ0Jsb2NrV3JpdGVFZXByb20oemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiBidWYpCit7CisgICAgdTMyX3QgY21kWzldOyAgLy8yTisxCisgICAgdTE2X3QgcmV0LGk7CisKKyAgICAvL2NtZFswXSA9IDB4MDAwMEIwMDg7CisJICAvKiBsZW5bMF0gOiB0eXBlWzB4QjBdIDogc2VxWz9dICovCisKKyAgICAvL2NtZFswXSA9ICg4Kk4pIHwgKFpNX0NNRF9XRkxBU0ggPDwgOCk7CisgICAgY21kWzBdID0gMzIgfCAoWk1fQ01EX1dSRUVQUk9NIDw8IDgpOyAgICAvLzhOCisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspICAgLy8gaTxOCisgICAgeworICAgICAgICBjbWRbKDIqaSkrMV0gPSBhZGRyKyg0KmkpOworICAgICAgICBjbWRbKDIqaSkrMl0gPSAqKGJ1ZitpKTsKKyAgICB9CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAzNiwgWk1fRUVQUk9NX1dSSVRFLCAwKTsgICAgLy84Tis0CisKKyAgICAvLyBhZGRlZCBmb3IgRUVQUk9NVXBkYXRlLCB3YWl0IGEgbW9tZW50IGZvciBwcmV2ZW50IGNtZCBxdWV1ZSBmdWxsIQorICAgIC8vemZ3U2xlZXAoZGV2LCAxKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworLyogd3JpdGUgRUVQUk9NIHdpdGggd3JsZW4gOiB3cmxlbiBtdXN0IGJlIDQqbiAqLworLyogY29tbWFuZCBmb3JtYXQgOiBjbWRfaW5mbyg0KSArIGFkZHIoNCkgKyBlZXByb20od3JsZW4pICovCit1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tX3YyKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmLCB1MzJfdCB3cmxlbikKK3sKKyAgICB1MzJfdCBjbWRbMTZdOworICAgIHUxNl90IHJldCxpOworCisJICAvKiBsZW5bMF0gOiB0eXBlWzB4QjBdIDogc2VxWz9dICovCisJICAvKiBsZW4gPSBhZGRyKDQpICsgZWVwcm9tX2Jsb2NrKHdybGVuKSAqLworICAgIGNtZFswXSA9ICh3cmxlbis0KSB8IChaTV9DTURfTUVNX1dSRUVQUk9NIDw8IDgpOworICAgIGNtZFsxXSA9IGFkZHI7CisKKyAgICBmb3IgKGk9MDsgaTwod3JsZW4vNCk7IGkrKykgICAvLyBpPHdybGVuLzQKKyAgICB7CisgICAgICAgIGNtZFsyK2ldID0gKihidWYraSk7CisgICAgfQorICAgIC8qIGNtZF9pbmZvKDQpICsgYWRkcig0KSArIGVlcHJvbSh3cmxlbikgKi8KKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAodTE2X3QpKHdybGVuKzgpLCBaTV9FRVBST01fV1JJVEUsIDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRGJnT3BlbkVlcHJvbSAgICAgICAgICAgICovCisvKiAgICAgIE9wZW4gRUVQUk9NLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDYgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZEYmdPcGVuRWVwcm9tKHpkZXZfdCogZGV2KQoreworICAgIC8vIHVubG9jayBFRVBST00KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDAwLCAweDEyMzQ1Njc4KTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDA0LCAweDU1YWEwMGZmKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDA4LCAweDEzNTc5YWNlKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDE0LCAweDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkRiZ0Nsb3NlRWVwcm9tICAgICAgICAgICAgKi8KKy8qICAgICAgQ2xvc2UgRUVQUk9NLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDUgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZEYmdDbG9zZUVlcHJvbSh6ZGV2X3QqIGRldikKK3sKKyAgICAvLyBsb2NrIEVFUFJPTQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDAsIDB4ODc2NTQzMjEpOworICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQwNCwgMHhmZmZmZmZmZik7CisgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDA4LCAweGZmZmZmZmZmKTsKKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MTQsIDB4MTAwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlTZXJpYWxseVdyaXRlRWVwcm9tICAgICAgKi8KKy8qICAgICAgV3JpdGUgRUVQUk9NIFNlcmlhbGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBzdGFydCBhZGRyZXNzIG9mIHdyaXRpbmcgRUVQUk9NICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBpbnB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmbGVuIDogc2l6ZSBvZiBpbnB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgIChsZW5ndGggb2YgZGF0YSB3cml0ZSBpbnRvIEVFUFJPTSkgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpU2VyaWFsbHlXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIGJ1ZiwgdTMyX3QgYnVmbGVuKQoreworICAgIHUzMl90IGNvdW50OworICAgIHUxNl90IGkscmV0LGJsb2Nrc2l6ZTsKKyAgICB1OF90ICB0ZW1wWzJdOworCisgICAgLy8gcGVyIDQgYnl0ZXMgPSAxIGNvdW50CisgICAgY291bnQgPSBidWZsZW4vNDsKKworICAgIC8vIE9wZW4gRUVQUk9NCisgICAgemZEYmdPcGVuRWVwcm9tKGRldik7CisKKyAgICAvLyBXcml0ZSBFRVBST00KKyAgICBmb3IgKGk9MDsgaTxjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHpmd1dyaXRlRWVwcm9tKGRldiwgKGFkZHIrKDQqaSkpLCAqKGJ1ZitpKSwgMCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIGZhaWxlZCwgQ2xvc2UgRUVQUk9NCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJ6ZndXcml0ZUVlcHJvbSBmYWlsZWQgXG4iKTsKKyAgICAgICAgICAgIHpmRGJnQ2xvc2VFZXByb20oZGV2KTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2xvc2UgRUVQUk9NCisgICAgemZEYmdDbG9zZUVlcHJvbShkZXYpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisjaWYgMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVNlcmlhbGx5QmxvY2tXcml0ZUVlcHJvbSAqLworLyogICAgICAgQmxvY2sgV3JpdGUgRUVQUk9NIFNlcmlhbGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgKEJsb2NrV3JpdGU6IHBlciAxNmJ5dGVzIHdyaXRlIEVFUFJPTSBvbmNlKSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBpbnB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmbGVuIDogYWNjZXNzIGRhdGEgc2l6ZSBvZiBidWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA1ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlTZXJpYWxseUJsb2NrV3JpdGVFZXByb20oemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiBidWYsIHUzMl90IGJ1ZmxlbikKK3sKKyAgICB1MzJfdCBjb3VudDsKKyAgICB1MTZfdCBpLHJldCxibG9ja3NpemU7CisgICAgdThfdCAgdGVtcFsyXTsKKworICAgIC8vIHBlciA0IGJ5dGVzID0gMSBjb3VudAorICAgIGNvdW50ID0gYnVmbGVuLzQ7CisKKyAgICAvLyBPcGVuIEVFUFJPTQorICAgIHpmRGJnT3BlbkVlcHJvbShkZXYpOworCisgICAgLy8gV3JpdGUgRUVQUk9NCisgICAgLy8gRUVQUk9NIFdyaXRlIHN0YXJ0IGFkZHJlc3MgZnJvbTogMHgxMDAwIT8KKyAgICAvLyBwZXIgMTZieXRlcyhOPTQpIGJsb2NrIHdyaXRlIEVFUFJPTSBvbmNlCisgICAgZm9yIChpPTA7IGk8KGNvdW50LzQpOyBpKyspICAgLy8gY291bnQvTgorICAgIHsKKyAgICAgICAgLy96ZmlEYmdCbG9ja1dyaXRlRWVwcm9tKGRldiwgKGFkZHIrKDQqTippKSksIGJ1ZisoTippKSk7CisgICAgICAgIC8vemZpRGJnQmxvY2tXcml0ZUVlcHJvbShkZXYsIChhZGRyKygxNippKSksIGJ1ZisoNCppKSk7CisgICAgICAgIGlmICh6ZndCbG9ja1dyaXRlRWVwcm9tKGRldiwgKGFkZHIrKDE2KmkpKSwgYnVmKyg0KmkpLCAwKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJ6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tIGZhaWxlZCBcbiIpOworICAgICAgICAgICAgLy8gQ2xvc2UgRUVQUk9NCisgICAgICAgICAgICB6ZkRiZ0Nsb3NlRWVwcm9tKGRldik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENsb3NlIEVFUFJPTQorICAgIHpmRGJnQ2xvc2VFZXByb20oZGV2KTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdEdW1wRWVwcm9tICAgICAgICAgICAgKi8KKy8qICAgICAgRHVtcCBFRVBST00uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBzdGFydCBhZGRyZXNzIG9mIGR1bXBpbmcgRUVQUk9NICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkYXRhbGVuIDogIGxlbmd0aCBvZiBhY2Nlc3MgRUVQUk9NIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiAgcG9pbnQgb2YgYnVmZmVyLCB0aGUgYnVmZmVyIHNhdmVkIGR1bXAgZGF0YSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDYgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ0R1bXBFZXByb20oemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IGRhdGFsZW4sIHUzMl90KiBidWYpCit7CisgICAgdTMyX3QgY291bnQ7CisgICAgdTE2X3QgaSxyZXQ7CisKKyAgICBjb3VudCA9IGRhdGFsZW4vNDsKKworICAgIC8vIG92ZXIgRUVQUk9NIGxlbmd0aAorICAgIGlmKGRhdGFsZW4gPiAweDIwMDApCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPGNvdW50OyBpKyspCisgICAgeworICAgICAgICBidWZbaV0gPSB6ZndSZWFkRWVwcm9tKGRldiwgYWRkcisoNCppKSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdSZWFkUmVnICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUmVhZCByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnUmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkcikKK3sKKyAgICB1MzJfdCBjbWRbMl07CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAwNDsKKyAgICBjbWRbMV0gPSBhZGRyOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX1JFQUQsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1JlYWRUYWxseSAgICAgICAgICAgICAqLworLyogICAgICBSZWFkIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ1JlYWRUYWxseSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbMV07CisgICAgdTE2X3QgcmV0OworCXptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworCWlmICggKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSZUluaXQgKQorCXsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJLyogbGVuWzBdIDogdHlwZVsweDgxXSA6IHNlcVs/XSAqLworICAgIGNtZFswXSA9IDAgfCAoWk1fQ01EX1RBTExZIDw8IDgpOworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQsIFpNX09JRF9UQUxMWSwgMCk7CisKKwkvKiBsZW5bMF0gOiB0eXBlWzB4ODJdIDogc2VxWz9dICovCisgICAgY21kWzBdID0gMCB8IChaTV9DTURfVEFMTFlfQVBEIDw8IDgpOworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQsIFpNX09JRF9UQUxMWV9BUEQsIDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworCit1MzJfdCB6ZmlEYmdTZXRJRlN5bnRoZXNpemVyKHpkZXZfdCogZGV2LCB1MzJfdCB2YWx1ZSkKK3sKKyAgICB1MzJfdCBjbWRbMl07CisgICAgdTE2X3QgcmV0OworCisJLyogbGVuWzRdIDogdHlwZVsweDMyXSA6IHNlcVs/XSAqLworICAgIGNtZFswXSA9IDB4NCB8IChaTV9PSURfU1lOVEggPDwgOCk7CisgICAgY21kWzFdID0gdmFsdWU7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfU1lOVEgsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKK3UzMl90IHpmaURiZ1F1ZXJ5SHdUeEJ1c3koemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgY21kWzFdOworICAgIHUxNl90IHJldDsKKworCS8qIGxlbls0XSA6IHR5cGVbMHhDMF0gOiBzZXFbP10gKi8KKwljbWRbMF0gPSAwIHwgKFpNX0NNRF9ES1RYX1NUQVRVUyA8PCA4KTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQsIFpNX09JRF9ES1RYX1NUQVRVUywgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy9QYXVsKysKKyNpZiAwCit1MTZfdCB6ZkhwQmxvY2tFcmFzZUZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDA0IHwgKFpNX0NNRF9GTEFTSF9FUkFTRSA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZiAwCit1MTZfdCB6ZmlEYmdQcm9ncmFtRmxhc2goemRldl90ICpkZXYsIHUzMl90IG9mZnNldCwgdTMyX3QgbGVuLCB1MzJfdCAqZGF0YSkKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0OworICAgIHUxNl90IGk7CisKKworICAgIGNtZFswXSA9IChaTV9DTURfRkxBU0hfUFJPRyA8PCA4KSB8ICgobGVuKzgpICYgMHhmZik7CisgICAgY21kWzFdID0gb2Zmc2V0OworICAgIGNtZFsyXSA9IGxlbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAobGVuID4+IDIpOyBpKyspCisgICAgeworICAgICAgICAgY21kWzMraV0gPSBkYXRhW2ldOworICAgIH0KKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9PSURfRkxBU0hfUFJPR1JBTSwgTlVMTCk7CisKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdDaGlwRXJhc2VGbGFzaCAgICAgICAgKi8KKy8qICAgICAgQ2hpcCBFcmFzZSBGbGFzaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgQXRoZXJvcyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDkgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZmlEYmdDaGlwRXJhc2VGbGFzaCh6ZGV2X3QgKmRldikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAwMCB8IChaTV9DTURfRkxBU0hfRVJBU0UgPDwgOCk7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA0LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnR2V0Rmxhc2hDaGVja1N1bSAgICAgICovCisvKiAgICAgIEdldCBGbGFzaENoZWNrU3VtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogU3RhcnQgYWRkcmVzcyBvZiBnZXRjaGtzdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbGVuIDogdG90YWwgbGVudGggb2YgY2FsY3VsYXRlIGdldGNoa3N1bSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgQXRoZXJvcyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDggICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdHZXRGbGFzaENoZWNrU3VtKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCBsZW4pCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUzMl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMDggfCAoWk1fQ01EX0ZMQVNIX0NIS1NVTSA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworICAgIGNtZFsyXSA9IGxlbjsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9PSURfRkxBU0hfQ0hLU1VNLCBOVUxMKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdSZWFkRmxhc2ggICAgICAgICAgICAgKi8KKy8qICAgICAgUmVhZCBGbGFzaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBTdGFydCBhZGRyZXNzIG9mIHJlYWQgZmxhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBsZW4gOiB0b3RhbCBsZW50aCBvZiByZWFkIGZsYXNoIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBBdGhlcm9zIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wOSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ1JlYWRGbGFzaCh6ZGV2X3QgKmRldiwgdTMyX3QgYWRkciwgdTMyX3QgbGVuKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MzJfdCByZXQ7CisKKyAgICBjbWRbMF0gPSBsZW4gfCAoWk1fQ01EX0ZMQVNIX1JFQUQgPDwgOCk7CisgICAgY21kWzFdID0gYWRkcjsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9GTEFTSF9SRUFELCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRG93bmxvYWRGd1NldCAgICAgICAgICAgICovCisvKiAgICAgIEJlZm9yZSBEb3dubG9hZCBGVywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDb21tYW5kIEZXIHRvIFNvZnR3YXJlIHJlc2V0IGFuZCBjbG9zZSB3YXRjaCBkb2cgY29udHJvbC4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgQXRoZXJvcyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDkgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEb3dubG9hZEZ3U2V0KHpkZXZfdCAqZGV2KQoreworLy9zb2Z0d2FyZXJlc2V0CisvL2Nsb3NlIHdhdGNoIGRvZworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MzJfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDA4IHwgKFpNX0NNRF9GV19ETF9JTklUIDw8IDgpOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9GV19ETF9JTklULCBOVUxMKTsKKworICAgIHJldHVybiByZXQ7Cit9CisvL1BhdWwtLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHB1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjc2ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwdXNiLmMKQEAgLTAsMCArMSwxNTg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB1ZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFVTQiBkZXNjcmlwdG9yIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisjaW5jbHVkZSAiaHBhbmkuaCIKKyNpbmNsdWRlICJocHVzYi5oIgorCitleHRlcm4gdm9pZCB6ZndVc2JDbWQoemRldl90KiBkZXYsIHU4X3QgZW5kcHQsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbik7CisKK2V4dGVybiB2b2lkIHpmSWRsUnNwKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pOworZXh0ZXJuIHUxNl90IHpmRGVsYXlXcml0ZUludGVybmFsUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHUxNl90IHpmRmx1c2hEZWxheVdyaXRlKHpkZXZfdCogZGV2KTsKKworCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9UWF9JTkRFWCAgIDEKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1JYX0lOREVYICAgMgorI2RlZmluZSBVU0JfRU5EUE9JTlRfSU5UX0lOREVYICAzCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9DTURfSU5ERVggIDQKKwordm9pZCB6ZklkbENtZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKQoreworI2lmIFpNX1NXX0xPT1BfQkFDSyAhPSAxCisgICAgemZ3VXNiQ21kKGRldiwgVVNCX0VORFBPSU5UX0NNRF9JTkRFWCwgY21kLCBjbWRMZW4pOworI2VuZGlmCisKKyAgICByZXR1cm47Cit9CisKKworLyogemZBZGp1c3RDdHJsU2V0dGluZzogZml0IE9VVFMgZm9ybWF0ICovCisvKiAgICAgY29udmVydCBNSU1PMiB0byBPVVRTICAgICAgICAgICAgICovCit2b2lkIHpmQWRqdXN0Q3RybFNldHRpbmcoemRldl90KiBkZXYsIHUxNl90KiBoZWFkZXIsIHpidWZfdCogYnVmKQoreworICAgIC8qIE1JTU8yID0+IE9VVFMgRkItNTAgKi8KKyAgICAvKiBsZW5ndGggbm90IGNoYW5nZSwgb25seSBtb2RpZnkgZm9ybWF0ICovCisKKyAgICB1MzJfdCBvbGRNVDsKKwl1MzJfdCBvbGRNQ1M7CisKKyAgICB1MzJfdCBwaHlDdHJsOworICAgIHUzMl90IG9sZFBoeUN0cmw7CisKKyAgICB1MTZfdCB0cGMgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgIC8qIG1tICovCisgICAgaWYgKGhlYWRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgb2xkUGh5Q3RybCA9IHptd19idWZfcmVhZGgoZGV2LCBidWYsIDQpIHwgKCh1MzJfdCl6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCA2KSA8PCAxNik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG9sZFBoeUN0cmwgPSBoZWFkZXJbMl0gfCAoKHUzMl90KWhlYWRlclszXSA8PDE2KTsKKyAgICB9CisKKwlwaHlDdHJsID0gMDsKKworCisJLyogTVQgOiBCaXRbMX4wXSAqLworCW9sZE1UID0gb2xkUGh5Q3RybCYweDM7CisJcGh5Q3RybCB8PSBvbGRNVDsKKyAgICBpZiAoIG9sZE1UID09IDB4MyApICAgLyogREwtT0ZETSAoRHVwbGljYXRlIExlZ2FjeSBPRkRNKSAqLworCQlwaHlDdHJsIHw9IDB4MTsKKworCisJLyogUFQgOiBCaXRbMl0gICAgSFQgUFQ6IDAgTWl4ZWQgbW9kZSAgICAxIEdyZWVuIGZpZWxkICovCisJcGh5Q3RybCB8PSAob2xkUGh5Q3RybCYweDQpOworCisJLyogQmFuZHdpZHRoIGNvbnRyb2wgOiBCaXRbNH4zXSAqLworCWlmICggb2xkUGh5Q3RybCYweDgwMDAwMCApICAgIC8qIEJpdDIzIDogNDBNICovCisJeworCQkjaWYgMAorCQlpZiAob2xkTVQgPT0gMHgzKSAgICAgICAgICAgICAvKiBETC1PRkRNICovCisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDM8PDMpOyAgIC8qIDQwTSBkdXBsaWNhdGUgKi8KKwkJZWxzZQorCQkJcGh5Q3RybCB8PSAoMHgyPDwzKTsgICAvKiA0ME0gc2hhcmVkICovCisJCSNlbHNlCisJCWlmIChvbGRNVCA9PSAweDIgJiYgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0J3NDApCisJCXsKKwkJCXBoeUN0cmwgfD0gKDB4Mjw8Myk7ICAgLyogNDBNIHNoYXJlZCAqLworCQl9CisJCSNlbmRpZgorCX0KKwllbHNlIHsKKyAgICAgICAgb2xkUGh5Q3RybCAmPSB+MHg4MDAwMDAwMDsKKyAgICB9CisKKwkvKiBNQ1MgOiBCaXRbMjR+MThdICovCisJb2xkTUNTID0gKG9sZFBoeUN0cmwmMHg3ZjAwMDApPj4xNjsgIC8qIEJpdFsyMn4xNl0gKi8KKwlwaHlDdHJsIHw9IChvbGRNQ1M8PDE4KTsKKworCS8qIFNob3J0IEdJIDogQml0WzMxXSovCisgICAgcGh5Q3RybCB8PSAob2xkUGh5Q3RybCYweDgwMDAwMDAwKTsKKworCS8qIEFNIDogQW50ZW5uYSBtYXNrICovCisJLy9pZiAoKG9sZE1UID09IDIpICYmIChvbGRNQ1MgPiA3KSkKKwlpZiAoaHBQcml2LT5oYWxDYXBhYmlsaXR5ICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKQorCXsKKwkgICAgcGh5Q3RybCB8PSAoMHgxPDwxNSk7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIEhUICAgICAgICAgICAgICAgICAgICAgVHggMiBjaGFpbiAqLworCSAgICAvKiBPRkRNIDZNLzlNLzEyTS8xOE0vMjRNIFR4IDIgY2hhaW4gKi8KKwkgICAgLyogT0ZETSAzNk0vNDhNLzU0TS8gICAgICBUeCAxIGNoYWluICovCisJICAgIC8qIENDSyAgICAgICAgICAgICAgICAgICAgVHggMiBjaGFpbiAqLworCSAgICBpZiAoKG9sZE1UID09IDIpIHx8IChvbGRNVCA9PSAzKSkKKwkgICAgeworCSAgICAgICAgcGh5Q3RybCB8PSAoMHg1PDwxNSk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAob2xkTVQgPT0gMSkKKwkgICAgeworCSAgICAgICAgaWYgKChvbGRNQ1MgPT0gMHhiKSB8fCAob2xkTUNTID09IDB4ZikgfHwKKwkgICAgICAgICAgICAob2xkTUNTID09IDB4YSkgfHwgKG9sZE1DUyA9PSAweGUpIHx8CisJICAgICAgICAgICAgKG9sZE1DUyA9PSAweDkpKSAgICAgICAgICAgICAgICAgICAgICAgLy82TS85TS8xMk0vMThNLzI0TQorCSAgICAgICAgeworCSAgICAgICAgICAgIHBoeUN0cmwgfD0gKDB4NTw8MTUpOworCSAgICAgICAgfQorCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCSAgICAgICAgICAgIHBoeUN0cmwgfD0gKDB4MTw8MTUpOworCSAgICAgICAgfQorCSAgICB9CisJICAgIGVsc2UgLy8ob2xkTVQ9PTApCisJICAgIHsKKwkgICAgICAgIHBoeUN0cmwgfD0gKDB4NTw8MTUpOworCSAgICB9CisJfQorCS8vZWxzZQorCS8vICAgIHBoeUN0cmwgfD0gKDB4MTw8MTUpOworCisJLyogVFBDICovCisJLyogVE9ETyA6IGFjY2VsZXJhdGluZyB0aGVzZSBjb2RlICovCisJaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPCAzMDAwKQorCXsKKyAgICAgICAgaWYgKG9sZE1UID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyAqLworICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4Q2NrW29sZE1DU10mMHgzZik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2xkTVQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT0ZETSAqLworICAgICAgICAgICAgaWYgKG9sZE1DUyA9PSAweGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdbM10mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHg4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnWzJdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4ZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1sxXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9sZE1DUyA9PSAweDkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKChocFByaXYtPnRQb3cyeDJnWzBdLWhwUHJpdi0+dFBvdzJ4MmcyNEhlYXZ5Q2xpcE9mZnNldCkmMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2xkTVQgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBvbGRQaHlDdHJsJjB4ODAwMDAwICkgICAgLyogQml0MjMgOiA0ME0gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBIVCA0MCAqLworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnSHQ0MFtvbGRNQ1MmMHg3XSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBIVCAyMCAqLworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnSHQyMFtvbGRNQ1MmMHg3XSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvLzVHSHoKKyAgICB7CisgICAgICAgIGlmIChvbGRNVCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBPRkRNICovCisgICAgICAgICAgICBpZiAob2xkTUNTID09IDB4YykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z1szXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9sZE1DUyA9PSAweDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbMl0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHhkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnWzFdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9sZE1UID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggb2xkUGh5Q3RybCYweDgwMDAwMCApICAgIC8qIEJpdDIzIDogNDBNICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSFQgNDAgKi8KKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z0h0NDBbb2xkTUNTJjB4N10mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSFQgMjAgKi8KKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z0h0MjBbb2xkTUNTJjB4N10mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUeCBwb3dlciBhZGp1c3QgZm9yIEhUNDAgKi8KKwkvKiBIVDQwICAgKzFkQm0gKi8KKwlpZiAoKG9sZE1UPT0yKSAmJiAob2xkUGh5Q3RybCYweDgwMDAwMCkgKQorCXsKKwkgICAgdHBjICs9IDI7CisJfQorCXRwYyAmPSAweDNmOworCisgICAgLyogRXZsIGZvcmNlIHR4IFRQQyAqLworICAgIGlmKHdkLT5mb3JjZVR4VFBDKQorICAgIHsKKyAgICAgICAgdHBjID0gKHUxNl90KSh3ZC0+Zm9yY2VUeFRQQyAmIDB4M2YpOworICAgIH0KKworICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDwgMzAwMCkgeworICAgICAgICB3ZC0+bWF4VHhQb3dlcjIgJj0gMHgzZjsKKyAgICAgICAgdHBjID0gKHRwYyA+IHdkLT5tYXhUeFBvd2VyMik/IHdkLT5tYXhUeFBvd2VyMiA6IHRwYzsKKyAgICB9IGVsc2UgeworICAgICAgICB3ZC0+bWF4VHhQb3dlcjUgJj0gMHgzZjsKKyAgICAgICAgdHBjID0gKHRwYyA+IHdkLT5tYXhUeFBvd2VyNSk/IHdkLT5tYXhUeFBvd2VyNSA6IHRwYzsKKyAgICB9CisKKworI2RlZmluZSBaTV9NSU5fVFBDICAgICA1CisjZGVmaW5lIFpNX1RQQ19PRkZTRVQgIDUKKyNkZWZpbmUgWk1fU0lHTkFMX1RIUkVTSE9MRCAgNTYKKyAgICBpZiAoKHdkLT5zdGEuYlNjaGVkdWxlU2NhbiA9PSBGQUxTRSkgJiYgKHdkLT5zdGEuYkNoYW5uZWxTY2FuID09IEZBTFNFKSkKKyAgICB7CisgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgICAgICYmICh3ZC0+U2lnbmFsU3RyZW5ndGggPiBaTV9TSUdOQUxfVEhSRVNIT0xEKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRwYyA+ICgoWk1fTUlOX1RQQytaTV9UUENfT0ZGU0VUKSoyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgLT0gKFpNX1RQQ19PRkZTRVQqMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0cGMgPiAoWk1fTUlOX1RQQyoyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoWk1fTUlOX1RQQyoyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyN1bmRlZiBaTV9NSU5fVFBDCisjdW5kZWYgWk1fVFBDX09GRlNFVAorI3VuZGVmIFpNX1NJR05BTF9USFJFU0hPTEQKKworICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgcGh5Q3RybCB8PSAodHBjICYgMHgzZikgPDwgOTsKKyAgICAjZW5kaWYKKworICAgIC8qIFNldCBiaXRzWzg6Nl1CRi1NQ1MgZm9yIGhlYXZ5IGNsaXAgKi8KKyAgICBpZiAoKHBoeUN0cmwmMHgzKSA9PSAyKQorCXsKKwkgICAgcGh5Q3RybCB8PSAoKHBoeUN0cmwgPj4gMTIpICYgMHgxYzApOworICAgIH0KKworCS8qIFBIWSBjb250cm9sICovCisgICAgaWYgKGhlYWRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIDQsICh1MTZfdCkgKHBoeUN0cmwmMHhmZmZmKSk7CisgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAodTE2X3QpIChwaHlDdHJsPj4xNikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgaGVhZGVyWzJdID0gKHUxNl90KSAocGh5Q3RybCYweGZmZmYpOworICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgaGVhZGVyWzNdID0gKHUxNl90KSAocGh5Q3RybD4+MTYpOworICAgIH0KKworCXptX21zZzJfdHgoWk1fTFZfMiwgIm9sZCBwaHkgY3RybCA9ICIsIG9sZFBoeUN0cmwpOworICAgIHptX21zZzJfdHgoWk1fTFZfMiwgIm5ldyBwaHkgY3RybCA9ICIsIHBoeUN0cmwpOworCS8vRGJnUHJpbnQoIm9sZCBwaHkgY3RybCA9JTA4eCBcbiIsIG9sZFBoeUN0cmwpOworICAgIC8vRGJnUHJpbnQoIm5ldyBwaHkgY3RybCA9JTA4eCBcbiIsIHBoeUN0cmwpOworfQorCisKKyNkZWZpbmUgRVhUUkFfSU5GT19MRU4gICAgICAyNCAgICAvL1JTU0koNykgKyBFVk0oMTIpICsgUEhZKDEpICsgTUFDU3RhdHVzKDQpCit1MTZfdCB6ZkhwU2VuZCh6ZGV2X3QqIGRldiwgdTE2X3QqIGhlYWRlciwgdTE2X3QgaGVhZGVyTGVuLAorICAgICAgICAgICAgICAgIHUxNl90KiBzbmFwLCB1MTZfdCBzbmFwTGVuLAorICAgICAgICAgICAgICAgIHUxNl90KiB0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgIHUxNl90IGJ1ZlR5cGUsIHU4X3QgYWMsIHU4X3Qga2V5SWR4KQoreworI2lmIFpNX1NXX0xPT1BfQkFDSyA9PSAxCisgICAgemJ1Zl90ICpyeGJ1ZjsKKyAgICB1OF90ICpwdVJ4QnVmOworICAgIHU4X3QgKnBIZHI7CisJICAgdThfdCAqcHNuYXA7CisJICAgdTE2X3QgcGxjcGxlbiA9IDEyOworICAgIHUxNl90IGk7CisgICAJdTE2X3Qgc3dscE9mZnNldDsKKyNlbmRpZiAvKiAjaWYgWk1fU1dfTE9PUF9CQUNLID09IDEgKi8KKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHptX21zZzFfdHgoWk1fTFZfMSwgInpmSHBTZW5kKCksIGxlbiA9ICIsIDEyICsgaGVhZGVyTGVuLTggKyBzbmFwTGVuICsgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgKyA0ICsgOCk7CisKKwkvKiBBZGp1c3QgY3RybCBzZXR0aW5nIDogNk4xNCB5anN1bmcgKi8KKyAgICB6ZkFkanVzdEN0cmxTZXR0aW5nKGRldiwgaGVhZGVyLCBidWYpOworCisjaWYgWk1fU1dfTE9PUF9CQUNLICE9IDEKKyAgICBocFByaXYtPnVzYlNlbmRCeXRlcyArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBocFByaXYtPnVzYkFjU2VuZEJ5dGVzW2FjJjB4M10gKz0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTdWJtaXQgVVNCIE91dCBVcmIgKi8KKyAgICB6ZndVc2JTZW5kKGRldiwgVVNCX0VORFBPSU5UX1RYX0lOREVYLCAodThfdCAqKWhlYWRlciwgaGVhZGVyTGVuLAorICAgICAgICAgICAgICAgICAgKHU4X3QgKilzbmFwLCBzbmFwTGVuLCAodThfdCAqKXRhaWwsIHRhaWxMZW4sIGJ1Ziwgb2Zmc2V0KTsKKyNlbmRpZgorCisjaWYgWk1fU1dfTE9PUF9CQUNLID09IDEKKworICAgIHJ4YnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBwbGNwbGVuICsgaGVhZGVyTGVuLTggKyBzbmFwTGVuICsgKHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLW9mZnNldCkgKyA0ICsgRVhUUkFfSU5GT19MRU4pOworICAgIHBIZHIgPSAodThfdCAqKSBoZWFkZXIrODsKKyAgIAlwc25hcCA9ICh1OF90ICopIHNuYXA7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIHNvZnR3YXJlIGxvb3AgYmFjayAqLworICAgIC8qIENvcHkgV0xBTiBoZWFkZXIgYW5kIHBhY2tldCBidWZmZXIgKi8KKyAgIAlzd2xwT2Zmc2V0ID0gcGxjcGxlbjsKKworICAgIGZvcihpID0gMDsgaSA8IGhlYWRlckxlbi04OyBpKyspCisgICAgeworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIHJ4YnVmLCBzd2xwT2Zmc2V0K2ksIHBIZHJbaV0pOworICAgIH0KKworICAgCXN3bHBPZmZzZXQgKz0gaGVhZGVyTGVuLTg7CisKKyAgICAvKiBDb3B5IFNOQVAgaGVhZGVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgc25hcExlbjsgaSsrKQorICAgIHsKKwkJICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCByeGJ1Ziwgc3dscE9mZnNldCtpLCBwc25hcFtpXSk7CisgICAgfQorCisJICAgc3dscE9mZnNldCArPSBzbmFwTGVuOworCisgICAgLyogQ29weSBib2R5IGZyb20gdHggYnVmIHRvIHJ4YnVmICovCisgICAgZm9yKGkgPSAwOyBpIDwgKHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLW9mZnNldCk7IGkrKykKKyAgICB7CisgICAgICAgIHU4X3QgdmFsdWUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpK29mZnNldCk7CisgICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgcnhidWYsIHN3bHBPZmZzZXQraSwgdmFsdWUpOworICAgIH0KKworCSAgIC8qIHRvdGFsIGxlbmd0aCA9IFBMQ1AgKyAgICAgICAgIE1hY0hlYWRlciAgICAgICArIFBheWxvYWQgICArIEZDUyArIFJYc3RhdHVzICovCisJICAgLyogICAgICAgICAgICAgICAgIDEyICArICBoZWFkZXJMZW4tOCAgKyBzbmFwTGVuICsgYnVmIGxlbmd0aCArIDQgICsgOCAgICAgICAgKi8KKyAgIAl6ZndTZXRCdWZTZXRTaXplKGRldiwgcnhidWYsIHN3bHBPZmZzZXQgKyAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Ziktb2Zmc2V0KSArIDQgKyBFWFRSQV9JTkZPX0xFTiApOworCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCisJICAgLy96ZndEdW1wQnVmKGRldiwgcnhidWYpOworCSAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy96ZkNvcmVSZWN2KGRldiwgcnhidWYpOworCisjZW5kaWYgLyogI2lmIFpNX1NXX0xPT1BfQkFDSyAqLworCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKKy8qIFJlcG9ydCBtb25pdGVyIEhhbCByeCBpbmZvcm1hdGlvbiBhYm91dCByc3NpLCBldm0sIGJhbmR3aWR0aCwgU0cgZXRjICovCit2b2lkIHpmSHBRdWVyeU1vbkhhbFJ4SW5mbyh6ZGV2X3QqIGRldiwgdThfdCAqbW9uSGFsUnhJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6Zk1lbW9yeUNvcHkobW9uSGFsUnhJbmZvLAorICAgICAgICAgICAgICAgICh1OF90KikmKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvKSwKKyAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzSGFsUnhJbmZvKSk7Cit9CisKKwordThfdCB6ZklzRGF0YUZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGZyYW1lVHlwZTsKKyAgICB1OF90IG1wZHVJbmQ7CisKKyAgICBtcGR1SW5kID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZiktMSk7CisKKyAgICAvKiBzaW5sZ2Ugb3IgRmlyc3QgKi8KKyAgICBpZiAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwIHx8IChtcGR1SW5kICYgMHgzMCkgPT0gMHgyMCkKKyAgICB7CisgICAgICAgIGZyYW1lVHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgfQorCisgICAgaWYoKGZyYW1lVHlwZSAmIDB4ZikgPT0gWk1fV0xBTl9EQVRBX0ZSQU1FKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZmNDb252ZXJ0UmF0ZU9GRE0oemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIC8vIFdoYXQncyB0aGUgZGVmYXVsdCB2YWx1ZT8/CisgICAgdTMyX3QgTUNTID0gMDsKKworICAgIHN3aXRjaCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSYgMHhmKQorICAgIHsKKyAgICAgICAgY2FzZSAweGI6CisgICAgICAgICAgICBNQ1MgPSAweDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGY6CisgICAgICAgICAgICBNQ1MgPSAweDU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGE6CisgICAgICAgICAgICBNQ1MgPSAweDY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGU6CisgICAgICAgICAgICBNQ1MgPSAweDc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDk6CisgICAgICAgICAgICBNQ1MgPSAweDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGQ6CisgICAgICAgICAgICBNQ1MgPSAweDk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDg6CisgICAgICAgICAgICBNQ1MgPSAweGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGM6CisgICAgICAgICAgICBNQ1MgPSAweGI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE1DUzsKK30KKwordTE2X3QgemZIcEdldFBheWxvYWRMZW4oemRldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IHBsY3BIZHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeE1DUywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeEJXLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4U0cKKyAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICB1OF90IG1vZHVsYXRpb24sbXBkdUluZDsKKyAgICB1MTZfdCBsb3csIGhpZ2gsIG1zYjsKKyAgICBzMTZfdCBwYXlsb2FkTGVuID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tMSk7CisgICAgbW9kdWxhdGlvbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSkpICYgMHgzOworICAgICpyeE1UID0gbW9kdWxhdGlvbjsKKworICAgIC8vem1fZGVidWdfbXNnMSgiIG1vZHVsYXRpb249ICIsIG1vZHVsYXRpb24pOworICAgIHN3aXRjaCAobW9kdWxhdGlvbikgeworICAgIGNhc2UgMDogLyogQ0NLIE1vZGUgKi8KKyAgICAgICAgbG93ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMik7CisgICAgICAgIGhpZ2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAzKTsKKyAgICAgICAgcGF5bG9hZExlbiA9IChsb3cgfCBoaWdoIDw8IDgpIC0gNDsKKyAgICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvKQorICAgICAgICB7CisgICAgICAgICAgICAqcnhNQ1MgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICpyeEJXICA9IDA7CisgICAgICAgICAgICAqcnhTRyAgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTogLyogTGVnYWN5LU9GRE0gbW9kZSAqLworICAgICAgICBsb3cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA1OworICAgICAgICBoaWdoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMSk7CisgICAgICAgIG1zYiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDIpICYgMHgxOworICAgICAgICBwYXlsb2FkTGVuID0gKGxvdyB8IChoaWdoIDw8IDMpIHwgKG1zYiA8PCAxMSkpIC0gNDsKKyAgICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvKQorICAgICAgICB7CisgICAgICAgICAgICAqcnhNQ1MgPSB6ZmNDb252ZXJ0UmF0ZU9GRE0oZGV2LCBidWYpOworICAgICAgICAgICAgKnJ4QlcgID0gMDsKKyAgICAgICAgICAgICpyeFNHICA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiBIVCBPRkRNIG1vZGUgKi8KKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJhZ2dyZWdhdGlvbj0gIiwgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDYpID4+IDMpICYweDEgKTsKKyAgICAgICAgaWYgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCB8fCAobXBkdUluZCAmIDB4MzApID09IDB4MTApICAgIC8vc2luZ2xlIG9yIGxhc3QgbXBkdQorICAgICAgICAgICAgcGF5bG9hZExlbiA9IGxlbiAtIDI0IC0gNCAtIHBsY3BIZHJMZW47ICAvLyAtIHJ4U3RhdHVzIC0gZmNzCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcGF5bG9hZExlbiA9IGxlbiAtIDQgLSA0IC0gcGxjcEhkckxlbjsgIC8vIC0gcnhTdGF0dXMgLSBmY3MKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMSgiZmlyc3Qgb3IgbWlkZGxlIG1wZHUsIHBsY3BIZHJMZW49ICIsIHBsY3BIZHJMZW4pOworICAgICAgICB9CisgICAgICAgIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgKnJ4TUNTID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMykgJiAweDdmOworICAgICAgICAgICAgKnJ4QlcgID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMpID4+IDcpICYgMHgxOworICAgICAgICAgICAgKnJ4U0cgID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDYpID4+IDcpICYgMHgxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworCisgICAgfQorICAgIC8qIHJldHVybiB0aGUgcGF5bG9hZCBsZW5ndGggLSBGQ1MgKi8KKyAgICBpZiAocGF5bG9hZExlbiA8IDApIHBheWxvYWRMZW4gPSAwOworICAgIHJldHVybiBwYXlsb2FkTGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpVXNiUmVjdiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBVU0IgSU4gVHJhbnNmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldjogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFpNX0lOVF9VU0VfRVAyICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkUgICAxMgorCisjaWYgWk1fSU5UX1VTRV9FUDIgPT0gMQordm9pZCB6ZmlVc2JSZWdJbih6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKKyNlbmRpZgorCisjaWZkZWYgWk1fT1RVU19SWF9TVFJFQU1fTU9ERQordm9pZCB6ZmlVc2JSZWN2UGVyUGt0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKKyNlbHNlCit2b2lkIHpmaVVzYlJlY3YoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQorI2VuZGlmCit7CisKKworI2lmIFpNX0ZXX0xPT1BfQkFDSyAhPSAxCisgICAgdThfdCBtcGR1SW5kOworICAgIHUxNl90IHBsY3BIZHJMZW47CisgICAgdTE2X3QgY3JjUGx1c1J4U3RhdHVzTGVuOworICAgIHUxNl90IGxlbiwgcGF5bG9hZExlbj0wOworICAgIHUxNl90IGk7IC8vQ1dZYW5nKCspCisgICAgc3RydWN0IHpzQWRkaXRpb25JbmZvIGFkZEluZm87CisgICAgdTMyX3QgICAgICAgICAgICAgICByeE1UOworICAgIHUzMl90ICAgICAgICAgICAgICAgcnhNQ1M7CisgICAgdTMyX3QgICAgICAgICAgICAgICByeEJXOworICAgIHUzMl90ICAgICAgICAgICAgICAgcnhTRzsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIC8vem1fbXNnMF9yeChaTV9MVl8wLCAiemZpVXNiUmVjdigpIik7CisKKyNpZiBaTV9JTlRfVVNFX0VQMiA9PSAxCisKKyAgICBmb3IgKGk9MDsgaTwoWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkU+PjEpOyBpKyspCisgICAgeworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgaSoyKSAhPSAweGZmZmYpCisgICAgICAgIAlicmVhazsKKyAgICB9CisKKyAgICBpZiAoaT09KFpNX0lOVF9VU0VfRVAyX0hFQURFUl9TSVpFPj4xKSkKKyAgICB7CisgICAgICAgIHUzMl90ICAgICAgICAgICAgICAgcnNwW1pNX1VTQl9NQVhfRVBJTlRfQlVGRkVSLzRdOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgIHJzcExlbjsKKyAgICAgICAgdTMyX3QgICAgICAgICAgICAgICByc3BpOworICAgICAgICB1OF90KiAgICAgICAgICAgICAgIHBkc3QgPSAodThfdCopcnNwOworCisgICAgICAgIC8qIEludGVycnVwdCBSc3AgKi8KKyAgICAgICAgcnNwTGVuID0gKHUxNl90KSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS1aTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRTsKKworICAgICAgICBpZiAocnNwTGVuID4gNjApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkdldCBlcnJvciBsZW4gYnkgRVAyID0gXG4iLCByc3BMZW4pOworICAgICAgICAgICAgLyogZnJlZSBVU0IgYnVmICovCisJICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCSAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHJzcGk9MDsgcnNwaTxyc3BMZW47IHJzcGkrKykKKyAgICAgICAgeworICAgICAgICAJKnBkc3QgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCByc3BpK1pNX0lOVF9VU0VfRVAyX0hFQURFUl9TSVpFKTsKKyAgICAgICAgCXBkc3QrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vaWYgKGFkYXB0ZXItPnpmY2JVc2JSZWdJbikKKyAgICAgICAgLy8gICAgYWRhcHRlci0+emZjYlVzYlJlZ0luKGFkYXB0ZXIsIHJzcCwgcnNwTGVuKTsKKyAgICAgICAgemZpVXNiUmVnSW4oZGV2LCByc3AsIHJzcExlbik7CisKKwkgICAgICAvKiBmcmVlIFVTQiBidWYgKi8KKwkgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKwkgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIGVuZCBvZiAjaWYgWk1fSU5UX1VTRV9FUDIgPT0gMSAqLworCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfTVBEVShkZXYsIGJ1Zik7CisKKyAgICBpZiAod2QtPnN3U25pZmZlcikKKyAgICB7CisgICAgICAgIC8qIGFpcm9wZWVrOiBSZXBvcnQgZXZlcnl0aGluZyB1cCAqLworICAgICAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBidWYsIE5VTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVhZCB0aGUgbGFzdCBieXRlICovCisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgbXBkdUluZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbi0xKTsKKworICAgIC8qIEZpcnN0IE1QRFUgKi8KKyAgICBpZigobXBkdUluZCAmIDB4MzApID09IDB4MjApCisgICAgeworICAgICAgICB1MTZfdCBkdXJhdGlvbjsKKyAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDM2KSA9PSAwKSAvL0FDID0gQkUKKyAgICAgICAgeworICAgICAgICAgICAgZHVyYXRpb24gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgICAgICAgICBpZiAoZHVyYXRpb24gPiBocFByaXYtPmFnZ01heER1cmF0aW9uQkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFID0gZHVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSA+IDEwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9EYmdQcmludCgiYWdnTWF4RHVyYXRpb25CRT0lZCIsIGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSk7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiAxCisgICAgLyogRmlyc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmKCgobXBkdUluZCAmIDB4MzApID09IDB4MDApIHx8ICgobXBkdUluZCAmIDB4MzApID09IDB4MjApKQorICAgIC8vaWYgKChtcGR1SW5kICYgMHgxMCkgPT0gMHgwMCkKKyAgICB7CisgICAgICAgIHBsY3BIZHJMZW4gPSAxMjsgICAgICAgIC8vIFBMQ1AgaGVhZGVyIGxlbmd0aAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkgPT0gd2QtPm1hY0FkZHJbMF0gJiYKKyAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYpID09IHdkLT5tYWNBZGRyWzFdICYmCisgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KSA9PSB3ZC0+bWFjQWRkclsyXSkgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpID09IHdkLT5tYWNBZGRyWzBdICYmCisgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KSA9PSB3ZC0+bWFjQWRkclsxXSAmJgorICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCkgPT0gd2QtPm1hY0FkZHJbMl0peworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDEyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBMYXN0IE1QRFUgb3IgU2luZ2xlIE1QRFUgKi8KKyAgICBpZiAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwIHx8IChtcGR1SW5kICYgMHgzMCkgPT0gMHgxMCkKKyAgICB7CisgICAgICAgIGNyY1BsdXNSeFN0YXR1c0xlbiA9IEVYVFJBX0lORk9fTEVOICsgNDsgICAgIC8vIEV4dHJhIGJ5dGVzICsgRkNTCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNyY1BsdXNSeFN0YXR1c0xlbiA9IDQgKyA0OyAgICAgLy8gRXh0cmEgNCBieXRlcyArIEZDUworICAgIH0KKyNlbHNlCisgICAgcGxjcEhkckxlbiA9IDEyOworICAgIGNyY1BsdXNSeFN0YXR1c0xlbiA9IEVYVFJBX0lORk9fTEVOICsgNDsgICAgIC8vIEV4dHJhIGJ5dGVzICsgRkNTCisjZW5kaWYKKworICAgIGlmIChsZW4gPCAocGxjcEhkckxlbisxMCtjcmNQbHVzUnhTdGF0dXNMZW4pKQorICAgIHsKKyAgICAgICAgem1fbXNnMV9yeChaTV9MVl8wLCAiSW52YWxpZCBSeCBsZW5ndGg9IiwgbGVuKTsKKyAgICAgICAgLy96ZndEdW1wQnVmKGRldiwgYnVmKTsKKworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGRpc3BsYXkgUlNTSSBjb21iaW5lZCAqLworICAgIC8qCisgICAgICogonqid6J3oneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3onOid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneieworICAgICAqIKJ4IFBMQ1AgSGVhZGVyIKJ4ICBNUERVICCieCBSU1NJIKJ4ICBFVk0gonggUEhZIEVyciCieCAgTUFDIFN0YXR1cyCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6Jxoneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3oneid6J3onQKKyAgICAgKiCieCAgICAgMTIgICAgICCieCAgICBuICAgonggIDcgICCieCAgMTIgIKJ4ICAgIDEgICAgonggICAgICA0ICAgICAgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneicqJ3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICoJUlNTSSBmaWxlZCAoRnJvbSBCQiBhbmQgTUFDIGp1c3QgcGFzcyB0aGVtIHRvIGhvc3QpCisgICAgICogICBCeXRlMTogUlNTSSBmb3IgYW50ZW5uYSAwLgorICAgICAqICAgQnl0ZTI6IFJTU0kgZm9yIGFudGVubmEgMS4KKyAgICAgKiAgIEJ5dGUzOiBSU1NJIGZvciBhbnRlbm5hIDIuCisgICAgICogICBCeXRlNDogUlNTSSBmb3IgYW50ZW5uYSAwIGV4dGVuc2lvbi4KKyAgICAgKiAgIEJ5dGU1OiBSU1NJIGZvciBhbnRlbm5hIDEgZXh0ZW5zaW9uLgorICAgICAqICAgQnl0ZTY6IFJTU0kgZm9yIGFudGVubmEgMiBleHRlbnNpb24uCisgICAgICogICBCeXRlNzogUlNTSSBmb3IgYW50ZW5uYSBjb21iaW5lZC4KKyAgICAgKi8KKworICAgIC8vem1fZGVidWdfbXNnMSgiIHJlY3YgUlNTSSA9ICIsIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSktMTcpKTsKKworICAgIHBheWxvYWRMZW4gPSB6ZkhwR2V0UGF5bG9hZExlbihkZXYsIGJ1ZiwgbGVuLCBwbGNwSGRyTGVuLCAmcnhNVCwgJnJ4TUNTLCAmcnhCVywgJnJ4U0cpOworCisgICAgLyogSGFsIFJ4IGluZm8gKi8KKyAgICAvKiBGaXJzdCBNUERVIG9yIFNpbmdsZSBNUERVICovCisgICAgaWYoKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCkgfHwgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgyMCkpCisgICAgeworICAgICAgICBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8gJiYgemZJc0RhdGFGcmFtZShkZXYsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeERhdGFNVCAgID0gcnhNVDsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeERhdGFNQ1MgID0gcnhNQ1M7CisgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhEYXRhQlcgICA9IHJ4Qlc7CisgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhEYXRhU0cgICA9IHJ4U0c7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHBsY3BIZHJMZW4gKyBwYXlsb2FkTGVuKSA+IGxlbikgeworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzAsICJJbnZhbGlkIHBheWxvYWQgbGVuZ3RoPSIsIHBheWxvYWRMZW4pOworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vU3RvcmUgUnggVGFpbCBJbmZvbWF0aW9uIGJlZm9yZSBSZW1vdmUtLUNXWWFuZygrKQorCisjaWYgMAorICAgIGZvciAoaSA9IDA7IGkgPCBjcmNQbHVzUnhTdGF0dXNMZW4tNDsgaSsrKQorICAgIHsKKyAgICAgICBhZGRJbmZvLlRhaWwuQnl0ZVtpXSA9CisgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4gLSBjcmNQbHVzUnhTdGF0dXNMZW4gKyA0ICsgaSk7CisgICAgfQorI2Vsc2UKKy8qCisqIEJyaWVmIGZvcm1hdCBvZiBPVVRTIGNoaXAKKyogonqid6J3oneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3onOid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneieworKiCieCBQTENQIEhlYWRlciCieCAgTVBEVSAgonggUlNTSSCieCAgRVZNIKJ4IFBIWSBFcnIgonggIE1BQyBTdGF0dXMgongKKyogonWid6J3oneid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3onGid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6J3oneidAorKiCieCAgICAgMTIgICAgICCieCAgICBuICAgonggIDcgICCieCAgMTIgIKJ4ICAgIDEgICAgonggICAgICA0ICAgICAgongKKyogonyid6J3oneid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3onKid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6J3oneifQorKiBSU1NJOgorKiAgICAgICBCeXRlIDEgIGFudGVubmEgMAorKiAgICAgICBCeXRlIDIgIGFudGVubmEgMQorKiAgICAgICBCeXRlIDMgIGFudGVubmEgMgorKiAgICAgICBCeXRlIDQgIGFudGVubmEgMCBleHRlbnNpb24KKyogICAgICAgQnl0ZSA1ICBhbnRlbm5hIDEgZXh0ZW5zaW9uCisqICAgICAgIEJ5dGUgNiAgYW50ZW5uYSAyIGV4dGVuc2lvbgorKiAgICAgICBCeXRlIDcgIGFudGVubmEgY29tYmluZWQKKyogRVZNOgorKiAgICAgICBCeXRlIDEgIFN0cmVhbSAwIHBpbG90IDAKKyogICAgICAgQnl0ZSAyICBTdHJlYW0gMCBwaWxvdCAxCisqICAgICAgIEJ5dGUgMyAgU3RyZWFtIDAgcGlsb3QgMgorKiAgICAgICBCeXRlIDQgIFN0cmVhbSAwIHBpbG90IDMKKyogICAgICAgQnl0ZSA1ICBTdHJlYW0gMCBwaWxvdCA0CisqICAgICAgIEJ5dGUgNiAgU3RyZWFtIDAgcGlsb3QgNQorKiAgICAgICBCeXRlIDcgIFN0cmVhbSAxIHBpbG90IDAKKyogICAgICAgQnl0ZSA4ICBTdHJlYW0gMSBwaWxvdCAxCisqICAgICAgIEJ5dGUgOSAgU3RyZWFtIDEgcGlsb3QgMgorKiAgICAgICBCeXRlIDEwIFN0cmVhbSAxIHBpbG90IDMKKyogICAgICAgQnl0ZSAxMSBTdHJlYW0gMSBwaWxvdCA0CisqICAgICAgIEJ5dGUgMTIgU3RyZWFtIDEgcGlsb3QgNQorKi8KKworICAgIC8qIEZpbGwgdGhlIFRhaWwgaW5mb3JtYXRpb24gKi8KKyAgICAvKiBMYXN0IE1QRFUgb3IgU2luZ2xlIE1QRFUgKi8KKyAgICBpZiAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwIHx8IChtcGR1SW5kICYgMHgzMCkgPT0gMHgxMCkKKyAgICB7CisjZGVmaW5lIFpNX1JYX1JTU0lfQ09NUEVOU0FUSU9OICAgICAyNworICAgICAgICB1OF90IHptX3J4X3Jzc2lfY29tcGVuc2F0aW9uID0gWk1fUlhfUlNTSV9DT01QRU5TQVRJT047CisKKyAgICAJLyogUlNTSSBpbmZvcm1hdGlvbiAqLworICAgICAgICBhZGRJbmZvLlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDEgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLAorICAgICAgICAgICAgICAgIChsZW4tMSkgLSAxNykgKyAoKGhwUHJpdi0+cnhTdHJvbmdSU1NJID09IDEpP3ptX3J4X3Jzc2lfY29tcGVuc2F0aW9uOjApOworI3VuZGVmIFpNX1JYX1JTU0lfQ09NUEVOU0FUSU9OCisKKyAgICAgIC8qIEVWTSAqLworCisgICAgICAvKiBUT0RPOiBmb3IgUkQvQkIgZGVidWcgbWVzc2FnZSAqLworICAgICAgLyogc2F2ZSBjdXJyZW50IHJ4IGh3IGluZm9tcmF0aW9uLCByZXBvcnQgdG8gRHJ2Q29yZS9BcHBsaWNhdGlvbiAqLworICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvICYmIHpmSXNEYXRhRnJhbWUoZGV2LCBidWYpKQorICAgICAgeworICAgICAgICAgICAgdThfdCB0cnNzaTsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDc7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnNzaSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSkgLSAyMyArIGkpOworCSAgICAgICAgICAgIGlmICh0cnNzaSYweDgwKQorCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJzc2kgPSAoKH4oKHU4X3QpdHJzc2kpICYgMHg3ZikgKyAxKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJW2ldID0gdHJzc2k7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocnhNVD09MikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvL2lmIChyeEJXKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAJICBmb3IgKGk9MDsgaTwxMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1baV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKGxlbi0xKSAtIDE2ICsgaSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLwkgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIC8vICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1baV0gPQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAobGVuLTEpIC0gMTYgKyBpKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgIH0KKworICAgICAgICAgICNpZiAwCisgICAgICAgICAgLyogcHJpbnQgKi8KKyAgICAgICAgICAgIHptX2RiZygoIk1UKCVkKSBNQ1MoJWQpIEJXKCVkKSBTRyglZCkgUlNTSTolZCwlZCwlZCwlZCwlZCwlZCwlZCBFVk06KCVkLCVkLCVkLCVkLCVkLCVkKSglZCwlZCwlZCwlZCwlZCwlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHJ4TVQsCisgICAgICAgICAgICAgICAgICAgICAgIHJ4TUNTLAorICAgICAgICAgICAgICAgICAgICAgICByeEJXLAorICAgICAgICAgICAgICAgICAgICAgICByeFNHLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVs2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzZdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bN10sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzldLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bMTBdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bMTFdCisgICAgICAgICAgICAgICAgICAgICAgICkpOworICAgICAgICAgICNlbmRpZgorICAgICAgfSAvKiBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8gJiYgemZJc0RhdGFGcmFtZShkZXYsIGJ1ZikpICovCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogTWlkIG9yIEZpcnN0IGFnZ3JlZ2F0ZSBmcmFtZSB3aXRob3V0IHBoeSByeCBpbmZvcm1hdGlvbiAqLworICAgICAgICBhZGRJbmZvLlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDEgPSAwOworICAgIH0KKworICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMiA9IDA7CisgICAgYWRkSW5mby5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgzID0gMDsKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5ICAgPSAwOworCisgICAgYWRkSW5mby5UYWlsLkRhdGEuU0FJbmRleCAgICAgICAgICAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4gLSA0KTsKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5EQUluZGV4ICAgICAgICAgICA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIDMpOworICAgIGFkZEluZm8uVGFpbC5EYXRhLkVycm9ySW5kaWNhdGlvbiAgID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuIC0gMik7CisgICAgYWRkSW5mby5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgICAgICAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4gLSAxKTsKKworI2VuZGlmCisgICAgLyogUmVtb3ZlIENSQyBhbmQgUnggU3RhdHVzICovCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgKGxlbi1jcmNQbHVzUnhTdGF0dXNMZW4pKTsKKyAgICAvL3pmd0J1ZlNldFNpemUoZGV2LCBidWYsIHBheWxvYWRMZW4gKyBwbGNwSGRyTGVuKTsgICAgLyogcGF5bG9hZExlbiArIFBMQ1AgMTIgLSBGQ1MgNCovCisKKyAgICAvL1N0b3JlIFBMQ1AgSGVhZGVyIEluZm9tYXRpb24gYmVmb3JlIFJlbW92ZS0tQ1dZYW5nKCspCisgICAgaWYgKHBsY3BIZHJMZW4gIT0gMCkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGNwSGRyTGVuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZEluZm8uUGxjcEhlYWRlcltpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFkZEluZm8uUGxjcEhlYWRlclswXSA9IDA7CisgICAgfQorICAgIC8qIFJlbW92ZSBQTENQIGhlYWRlciAqLworICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIHBsY3BIZHJMZW4pOworCisgICAgLyogaGFuZGxlIDgwMi4xMSBmcmFtZSAqLworICAgIHpmQ29yZVJlY3YoZGV2LCBidWYsICZhZGRJbmZvKTsKKworI2Vsc2UKKyAgICAvKiBGaXJtd2FyZSBsb29wYmFjazogUnggZnJhbWUgPSBUeCBmcmFtZSAgICAgICAqLworICAgIC8qIGNvbnZlcnQgUnggZnJhbWUgdG8gZml0IHJlY2VpdmUgZnJhbWUgZm9ybWF0ICovCisgICAgemJ1Zl90ICpuZXdfYnVmOworICAgIHU4X3QgICAgY3RybF9vZmZzZXQgPSA4OworICAgIHU4X3QgICAgUExDUF9MZW4gPSAxMjsKKyAgICB1OF90ICAgIGRhdGE7CisgICAgdThfdCAgICBpOworCisKKyAgICAvKiBUeDogIHwgY3RybF9zZXR0aW5nIHwgTWFjIGhkciB8IGRhdGEgfCAqLworICAgIC8qICAgICAgICAgICAgOCAgICAgICAgICAgIDI0ICAgICAgIHggICAgICovCisKKyAgICAvKiBSeDogICAgICAgICAgfCBQTENQIHwgTWFjIGhkciB8IGRhdGEgfCBGQ1MgfCBSeHN0YXR1cyB8ICovCisgICAgLyogICAgICAgICAgICAgICAgIDEyICAgICAgMjQgICAgICAgIHggICAgIDQgICAgICAgOCAgICAgICAqLworCisgICAgLyogbmV3IGFsbG9jYXRlIGEgcnggZm9ybWF0IHNpemUgYnVmICovCisgICAgbmV3X2J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZiktOCsxMis0K0VYVFJBX0lORk9fTEVOKTsKKworICAgIGZvciAoaT0wOyBpPHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLWN0cmxfb2Zmc2V0OyBpKyspCisgICAgeworICAgICAgICBkYXRhID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgY3RybF9vZmZzZXQraSk7CisgICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgbmV3X2J1ZiwgUExDUF9MZW4raSwgZGF0YSk7CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIG5ld19idWYsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLTgrMTIrNCtFWFRSQV9JTkZPX0xFTik7CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgIC8qIHJlY2VpdmUgdGhlIG5ld19idWYgKi8KKyAgICAvL3pmQ29yZVJlY3YoZGV2LCBuZXdfYnVmKTsKKworI2VuZGlmCisKK30KKworI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKK3ZvaWQgemZpVXNiUmVjdih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCit7CisgICAgdTE2X3QgaW5kZXggPSAwOworICAgIHUxNl90IGNoa0lkeDsKKyAgICB1MzJfdCBzdGF0dXMgPSAwOworICAgIHUxNl90IGlpOworICAgIHpidWZfdCAqbmV3QnVmOworICAgIHpidWZfdCAqcnhCdWZQb29sWzhdOworICAgIHUxNl90IHJ4QnVmUG9vbEluZGV4ID0gMDsKKyAgICBzdHJ1Y3QgenNIcFByaXYgKmhhbFByaXY7CisgICAgdThfdCAqc3JjQnVmUHRyOworICAgIHUzMl90IGJ1ZmZlckxlbmd0aDsKKyAgICB1MTZfdCB1c2JSeFJlbWFpbkxlbjsKKyAgICB1MTZfdCB1c2JSeFBrdExlbjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhhbFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworICAgIHNyY0J1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIGJ1Zik7CisKKyAgICBidWZmZXJMZW5ndGggPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIFplcm8gTGVuZ3RoIFRyYW5zZmVyICovCisgICAgaWYgKCFidWZmZXJMZW5ndGgpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVzYlJ4UmVtYWluTGVuID0gaGFsUHJpdi0+dXNiUnhSZW1haW5MZW47CisgICAgdXNiUnhQa3RMZW4gPSBoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuOworCisgICAgLyogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbnkgZGF0YSBpbiB0aGUgbGFzdCB0cmFuc2ZlciAqLworICAgIGlmICh1c2JSeFJlbWFpbkxlbiAhPSAwICkKKyAgICB7CisgICAgICAgIHpidWZfdCAqcmVtYWluQnVmUHRyID0gaGFsUHJpdi0+cmVtYWluQnVmOworICAgICAgICB1OF90KiBCdWZQdHIgPSBOVUxMOworCisgICAgICAgIGlmICggcmVtYWluQnVmUHRyICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBCdWZQdHIgPSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCByZW1haW5CdWZQdHIpOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSB1c2JSeFJlbWFpbkxlbjsKKyAgICAgICAgdXNiUnhSZW1haW5MZW4gLT0gaGFsUHJpdi0+dXNiUnhQYWRMZW47CisKKyAgICAgICAgLyogIENvcHkgZGF0YSAqLworICAgICAgICBpZiAoIEJ1ZlB0ciAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3TWVtb3J5Q29weSgmKEJ1ZlB0clt1c2JSeFBrdExlbl0pLCBzcmNCdWZQdHIsIHVzYlJ4UmVtYWluTGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHVzYlJ4UGt0TGVuICs9IHVzYlJ4UmVtYWluTGVuOworICAgICAgICBoYWxQcml2LT51c2JSeFJlbWFpbkxlbiA9IDA7CisKKyAgICAgICAgaWYgKCByZW1haW5CdWZQdHIgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCByZW1haW5CdWZQdHIsIHVzYlJ4UGt0TGVuKTsKKyAgICAgICAgICAgIHJ4QnVmUG9vbFtyeEJ1ZlBvb2xJbmRleCsrXSA9IHJlbWFpbkJ1ZlB0cjsKKyAgICAgICAgfQorICAgICAgICBoYWxQcml2LT5yZW1haW5CdWYgPSBOVUxMOworICAgIH0KKworICAgIC8vem1fZGVidWdfbXNnMSgibGVuZ3RoOiAlZFxuIiwgKGludClwVXNiUnhUcmFuc2Zlci0+cFJ4VXJiLT5VcmJCdWxrT3JJbnRlcnJ1cHRUcmFuc2Zlci5UcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CisKKyAgICBidWZmZXJMZW5ndGggPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKy8vcHJpbnRrKCJidWZmZXJMZW5ndGggJWRcbiIsIGJ1ZmZlckxlbmd0aCk7CisgICAgd2hpbGUoaW5kZXggPCBidWZmZXJMZW5ndGgpCisgICAgeworICAgICAgICB1MTZfdCBwa3RMZW47CisgICAgICAgIHUxNl90IHBrdFRhZzsKKyAgICAgICAgLy91OF90ICpwdHIgPSAodThfdCopKChzdHJ1Y3QgenNCdWZmZXIqKXBVc2JSeFRyYW5zZmVyLT5idWYpLT5kYXRhOworICAgICAgICB1OF90ICpwdHIgPSBzcmNCdWZQdHI7CisKKyAgICAgICAgLyogUmV0cmlldmUgcGFja2V0IGxlbmd0aCBhbmQgdGFnICovCisgICAgICAgIHBrdExlbiA9IHB0cltpbmRleF0gKyAocHRyW2luZGV4KzFdIDw8IDgpOworICAgICAgICBwa3RUYWcgPSBwdHJbaW5kZXgrMl0gKyAocHRyW2luZGV4KzNdIDw8IDgpOworCisgICAgICAgIGlmIChwa3RUYWcgPT0gWk1fVVNCX1NUUkVBTV9NT0RFX1RBRykKKyAgICAgICAgeworICAgICAgICAgICAgdTE2X3QgcGFkTGVuOworCisgICAgICAgICAgICB6bV9hc3NlcnQocGt0TGVuIDwgWk1fV0xBTl9NQVhfUlhfU0laRSk7CisKKyAgICAgICAgICAgIC8vcHJpbnRrKCJHZXQgYSBwYWNrZXQsIHBrdExlbjogMHglMDR4XG4iLCBwa3RMZW4pOworICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgIC8qIER1bXAgZGF0YSAqLworICAgICAgICAgICAgZm9yIChpaSA9IGluZGV4OyBpaSA8IHBrdF9sZW4rNDspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGJnUHJpbnQoIjB4JTAyeCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoYWRhcHRlciwgcFVzYlJ4VHJhbnNmZXItPmJ1ZiwgaWkpICYgMHhmZikpOworCisgICAgICAgICAgICAgICAgaWYgKCgrK2lpICUgMTYpID09IDApCisgICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCJcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBEYmdQcmludCgiXG4iKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiBDYWxjdWF0ZSB0aGUgcGFkZGluZyBsZW5ndGgsIGluIHRoZSBjdXJyZW50IGRlc2lnbiwKKyAgICAgICAgICAgICAgIHRoZSBsZW5ndGggc2hvdWxkIGJlIHBhZGRlZCB0byA0IGJ5dGUgYm91bmRyYXkuICovCisgICAgICAgICAgICBwYWRMZW4gPSBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTiAtIChwa3RMZW4gJiAweDMpOworCisgICAgICAgICAgICBpZihwYWRMZW4gPT0gWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU4pCisgICAgICAgICAgICAgICAgcGFkTGVuID0gMDsKKworICAgICAgICAgICAgY2hrSWR4ID0gaW5kZXg7CisgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU4gKyBwa3RMZW4gKyBwYWRMZW47CisKKyAgICAgICAgICAgIGlmIChjaGtJZHggPiBaTV9NQVhfVVNCX0lOX1RSQU5TRkVSX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY2hrSWR4IGlzIHRvbyBsYXJnZSwgY2hrSWR4OiAlZFxuIiwgY2hrSWR4KTsKKyAgICAgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluZGV4ID4gWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vc3RydWN0IHpzQnVmZmVyKiBCdWZQdHI7CisgICAgICAgICAgICAgICAgLy9zdHJ1Y3QgenNCdWZmZXIqIFVzYkJ1ZlB0cjsKKyAgICAgICAgICAgICAgICB1OF90ICpCdWZQdHI7CisgICAgICAgICAgICAgICAgdThfdCAqVXNiQnVmUHRyOworCisgICAgICAgICAgICAgICAgaGFsUHJpdi0+dXNiUnhSZW1haW5MZW4gPSBpbmRleCAtIFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRTsgLy8gLSBwYWRMZW47CisgICAgICAgICAgICAgICAgaGFsUHJpdi0+dXNiUnhUcmFuc2ZlckxlbiA9IFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSAtCisgICAgICAgICAgICAgICAgICAgICAgICBjaGtJZHggLSBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTjsKKyAgICAgICAgICAgICAgICBoYWxQcml2LT51c2JSeFBhZExlbiA9IHBhZExlbjsKKyAgICAgICAgICAgICAgICAvL2NoZWNrX2luZGV4ID0gaW5kZXg7CisKKyAgICAgICAgICAgICAgICBpZiAoaGFsUHJpdi0+dXNiUnhUcmFuc2ZlckxlbiA+IFpNX1dMQU5fTUFYX1JYX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjaGVja19sZW4gaXMgdG9vIGxhcmdlLCBjaGtfbGVuOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCisgICAgICAgICAgICAgICAgbmV3QnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBaTV9XTEFOX01BWF9SWF9TSVpFKTsKKworICAgICAgICAgICAgICAgIGlmICggbmV3QnVmICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnVmUHRyID0gem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgbmV3QnVmKTsKKyAgICAgICAgICAgICAgICAgICAgVXNiQnVmUHRyID0gc3JjQnVmUHRyOworCisgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICB6ZndNZW1vcnlDb3B5KEJ1ZlB0ciwgJihVc2JCdWZQdHJbY2hrSWR4K1pNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOXSksIGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW4pOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlY29yZCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaGFsUHJpdi0+cmVtYWluQnVmID0gbmV3QnVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90KiBCdWZQdHI7CisgICAgICAgICAgICAgICAgdThfdCogVXNiQnVmUHRyOworCisgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCisgICAgICAgICAgICAgICAgbmV3QnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBaTV9XTEFOX01BWF9SWF9TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIG5ld0J1ZiAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIG5ld0J1Zik7CisgICAgICAgICAgICAgICAgICAgIFVzYkJ1ZlB0ciA9IHNyY0J1ZlB0cjsKKworICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgemZ3TWVtb3J5Q29weShCdWZQdHIsICYoVXNiQnVmUHRyW2Noa0lkeCtaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTl0pLCBwa3RMZW4pOworCisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBuZXdCdWYsIHBrdExlbik7CisgICAgICAgICAgICAgICAgICAgIHJ4QnVmUG9vbFtyeEJ1ZlBvb2xJbmRleCsrXSA9IG5ld0J1ZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdTE2X3QgaTsKKworICAgICAgICAgICAgICAgIERiZ1ByaW50KCJDYW4ndCBmaW5kIHRhZywgcGt0X2xlbjogMHglMDR4LCB0YWc6IDB4JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdExlbiwgcGt0VGFnKTsKKworICAgICAgICAgICAgICAgICNpZiAwCisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCIlMDJ4ICIsIGJ1Zi0+ZGF0YVtpbmRleC0xNitpXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpICYgMHhmKSA9PSAweGYpCisgICAgICAgICAgICAgICAgICAgICAgICBEYmdQcmludCgiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgYnVmZmVyICovCisgICAgLy96ZndCdWZGcmVlKGFkYXB0ZXIsIHBVc2JSeFRyYW5zZmVyLT5idWYsIDApOworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCisgICAgZm9yKGlpID0gMDsgaWkgPCByeEJ1ZlBvb2xJbmRleDsgaWkrKykKKyAgICB7CisgICAgICAgIHpmaVVzYlJlY3ZQZXJQa3QoZGV2LCByeEJ1ZlBvb2xbaWldKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmVXNiSW5pdCAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBJbml0aWFsaXplIFVTQiByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlVzYkluaXQoemRldl90KiBkZXYpCit7CisgICAgLyogSW5pdGlhbGl6ZSBSeCAmIElOVCBlbmRwb2ludCBmb3IgcmVjZWl2aW5nIGRhdGEgJiBpbnRlcnJ1cHQgKi8KKyAgICB6ZndVc2JFbmFibGVSeEVwdChkZXYsIFVTQl9FTkRQT0lOVF9SWF9JTkRFWCk7CisgICAgemZ3VXNiRW5hYmxlSW50RXB0KGRldiwgVVNCX0VORFBPSU5UX0lOVF9JTkRFWCk7CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmVXNiRnJlZSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcmVlIFBDSSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlVzYkZyZWUoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzSHBQcml2ICpoYWxQcml2OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaGFsUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCisgICAgaWYgKCBoYWxQcml2LT5yZW1haW5CdWYgIT0gTlVMTCApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgaGFsUHJpdi0+cmVtYWluQnVmLCAwKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkhwU2VuZEJlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IGxlbikKK3sKKyAgICB1MzJfdCBodywgbHc7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBXcml0ZSB0byBiZWFjb24gYnVmZmVyIChaTV9CRUFDT05fQlVGRkVSX0FERFJFU1MpICovCisgICAgZm9yIChpID0gMDsgaTxsZW47IGkrPTQpCisgICAgeworICAgICAgICBsdyA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIGkpOworICAgICAgICBodyA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIGkrMik7CisKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9CRUFDT05fQlVGRkVSX0FERFJFU1MraSwgKGh3PDwxNikrbHcpOworICAgIH0KKworICAgIC8qIEJlYWNvbiBQQ0xQIGhlYWRlciAqLworICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5IDwgMzAwMCkKKyAgICB7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QTENQLCAoKGxlbis0KTw8KDMrMTYpKSsweDA0MDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BMQ1AsICgobGVuKzQpPDwoMTYpKSsweDAwMWIpOworICAgIH0KKworICAgIC8qIEJlYWNvbiBsZW5ndGggKGluY2x1ZGUgQ1JDMzIpICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9MRU5HVEgsIGxlbis0KTsKKworICAgIC8qIEJlYWNvbiBSZWFkeSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fQ1RSTCwgMSk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIC8qIEZyZWUgYmVhY29uIGJ1ZiAqLworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCisgICAgcmV0dXJuOworfQorCisKKyNkZWZpbmUgWk1fU1RBVFVTX1RYX0NPTVAgICAgICAgMHgwMAorI2RlZmluZSBaTV9TVEFUVVNfUkVUUllfQ09NUCAgICAweDAxCisjZGVmaW5lIFpNX1NUQVRVU19UWF9GQUlMRUQgICAgIDB4MDIKK3ZvaWQgemZpVXNiUmVnSW4oemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbikKK3sKKyAgICAvL3U4X3QgbGVuLCB0eXBlLCBpOworICAgIHU4X3QgdHlwZTsKKyAgICB1OF90ICp1OHJzcDsKKyAgICB1MTZfdCBzdGF0dXM7CisgICAgdTMyX3QgYml0bWFwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMywgInpmaVVzYlJlZ0luKCkiKTsKKworICAgIHU4cnNwID0gKHU4X3QgKilyc3A7CisKKyAgICAvL2xlbiA9ICp1OHJzcDsKKyAgICB0eXBlID0gKih1OHJzcCsxKTsKKyAgICB1OHJzcCA9IHU4cnNwKzQ7CisKKworICAgIC8qIEludGVycnVwdCBldmVudCAqLworICAgIGlmICgodHlwZSAmIDB4QzApID09IDB4QzApCisgICAgeworICAgICAgICBpZiAodHlwZSA9PSAweEMwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkNvcmVFdmVudChkZXYsIDAsIHU4cnNwKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDMSkKKyAgICAgICAgeworI2lmIDAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1MTZfdCBpOworICAgICAgICAgICAgICAgIERiZ1ByaW50KCJyc3BMZW49JWRcbiIsIHJzcExlbik7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8KHJzcExlbi80KTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGJnUHJpbnQoInJzcFslZF09MHglbHhcbiIsIGksIHJzcFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBzdGF0dXMgPSAodTE2X3QpKHJzcFszXSA+PiAxNik7CisKKyAgICAgICAgICAgIC8vLy82Nzg5CisgICAgICAgICAgICByc3BbOF0gPSByc3BbOF0gPj4gMiB8IChyc3BbOV0gJiAweDEpIDw8IDY7CisgICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBVFVTX1JFVFJZX0NPTVAgOgorICAgICAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgMSwgdThyc3ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBaTV9TVEFUVVNfVFhfRkFJTEVEIDoKKyAgICAgICAgICAgICAgICB6ZkNvcmVFdmVudChkZXYsIDIsIHU4cnNwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBVFVTX1RYX0NPTVAgOgorICAgICAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgMywgdThyc3ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDMikKKyAgICAgICAgeworICAgICAgICAgICAgemZCZWFjb25DZmdJbnRlcnJ1cHQoZGV2LCB1OHJzcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEMzKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkVuZE9mQXRpbVdpbmRvd0ludGVycnVwdChkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDNCkKKyAgICAgICAgeworI2lmIDAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1MTZfdCBpOworICAgICAgICAgICAgICAgIERiZ1ByaW50KCIweEMyOnJzcExlbj0lZFxuIiwgcnNwTGVuKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwocnNwTGVuLzQpOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEYmdQcmludCgiMHhDMjpyc3BbJWRdPTB4JWx4XG4iLCBpLCByc3BbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgYml0bWFwID0gKHJzcFsxXSA+PiAxNikgKyAoKHJzcFsyXSAmIDB4RkZGRikgPDwgMTYgKTsKKyAgICAgICAgICAgIC8vemZCYXdDb3JlKGRldiwgKHUxNl90KXJzcFsxXSAmIDB4RkZGRiwgYml0bWFwLCAodTE2X3QpKHJzcFsyXSA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHUxNl90IGk7CisjaWYgMAorCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwocnNwTGVuLzQpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBEYmdQcmludCgiMHhDNTpyc3BbJWRdPTB4JWx4XG4iLCBpLCByc3BbaV0pOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBmb3IgKGk9MTsgaTwocnNwTGVuLzQpOyBpKyspIHsKKyAgICAgICAgICAgICAgICB1OHJzcCA9ICh1OF90ICopKHJzcCtpKTsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCIweEM1OnJzcFslZF09MHglbHhcbiIsIGksICgodTMyX3QqKXU4cnNwKVswXSk7CisgICAgICAgICAgICAgICAgemZDb3JlRXZlbnQoZGV2LCA0LCB1OHJzcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM2KQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJcblxuIFdhdGNoRG9nIGludGVycnVwdCEhISA6IDB4QzYgXG5cbiIpOworICAgICAgICAgICAgaWYgKHdkLT56ZmNiSHdXYXRjaERvZ05vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT56ZmNiSHdXYXRjaERvZ05vdGlmeShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDOCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9QWlNXX0FEQVBURVIgYWRhcHRlcjsKKworICAgICAgICAgICAgLy8gZm9yIFNQSSBmbGFzaCBwcm9ncmFtIGNoayBGbGFnCisgICAgICAgICAgICB6ZndEYmdQcm9ncmFtZUZsYXNoQ2hrRG9uZShkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDOSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiIyMjIyMgVHggcmV0cmFuc21pc3Npb24gNSB0aW1lcyBldmVudCAjIyMjIyIpOworCisgICAgICAgICAgICAvKiBjb3JyZWN0IHR4IHJldHJhbnNtaXNzaW9uIGlzc3VlICovCisgICAgICAgICAgICBocFByaXYtPnJldHJhbnNtaXNzaW9uRXZlbnQgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSWRsUnNwKGRldiwgcnNwLCByc3BMZW4pOworICAgIH0KK30KKworCisjZGVmaW5lIFpNX1BST0dSQU1fUkFNX0FERFIgICAgIDB4MjAwMDAwIC8vMHgxMDAwIC8vMHg3MDAwMDAKKyNkZWZpbmUgRklSTVdBUkVfRE9XTkxPQUQgICAgICAgMHgzMAorI2RlZmluZSBGSVJNV0FSRV9ET1dOTE9BRF9DT01QICAweDMxCisjZGVmaW5lIEZJUk1XQVJFX0NPTkZJUk0gICAgICAgIDB4MzIKKwordTE2X3QgemZGaXJtd2FyZURvd25sb2FkKHpkZXZfdCogZGV2LCB1MzJfdCogZncsIHUzMl90IGxlbiwgdTMyX3Qgb2Zmc2V0KQoreworICAgIHUxNl90IHJldCA9IFpNX1NVQ0NFU1M7CisgICAgdTMyX3QgdUNvZGVPZnN0ID0gb2Zmc2V0OworICAgIHU4X3QgKmltYWdlLCAqcHRyOworICAgIHUzMl90IHJlc3VsdDsKKworICAgIGltYWdlID0gKHU4X3QqKSBmdzsKKyAgICBwdHIgPSBpbWFnZTsKKworICAgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgICAgdTMyX3QgdHJhbnNsZW4gPSAobGVuID4gNDA5NikgPyA0MDk2IDogbGVuOworCisgICAgICAgIHJlc3VsdCA9IHpmd1VzYlN1Ym1pdENvbnRyb2woZGV2LCBGSVJNV0FSRV9ET1dOTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2X3QpICh1Q29kZU9mc3QgPj4gOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW1hZ2UsIHRyYW5zbGVuKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IFpNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfaW5pdChaTV9MVl8wLCAiRklSTVdBUkVfRE9XTkxPQUQgZmFpbGVkIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgbGVuIC09IHRyYW5zbGVuOworICAgICAgICBpbWFnZSArPSB0cmFuc2xlbjsKKyAgICAgICAgdUNvZGVPZnN0ICs9IHRyYW5zbGVuOyAvLyBpbiBXb3JkICgxNiBiaXQpCisKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisKKyAgICAvKiBJZiBkb3dubG9hZCBmaXJtd2FyZSBzdWNjZXNzLCBpc3N1ZSBhIGNvbW1hbmQgdG8gZmlybXdhcmUgKi8KKyAgICBpZiAocmV0ID09IDApCisgICAgeworICAgICAgICByZXN1bHQgPSB6ZndVc2JTdWJtaXRDb250cm9sKGRldiwgRklSTVdBUkVfRE9XTkxPQURfQ09NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMLCAwKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IFpNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfaW5pdChaTV9MVl8wLCAiRklSTVdBUkVfRE9XTkxPQURfQ09NUCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiAwCisgICAgLyogUENJIGNvZGUgKi8KKyAgICAvKiBXYWl0IGZvciBmaXJtd2FyZSByZWFkeSAqLworICAgIHJlc3VsdCA9IHpmd1VzYlN1Ym1pdENvbnRyb2woZGV2LCBGSVJNV0FSRV9DT05GSVJNLCBVU0JfRElSX0lOIHwgMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgIDAsIDAsICZyZXRfdmFsdWUsIHNpemVvZihyZXRfdmFsdWUpLCBIWik7CisKKyAgICBpZiAocmVzdWx0ICE9IDApCisgICAgeworICAgICAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgIkNhbid0IHJlY2VpdmUgZmlybXdhcmUgcmVhZHk6ICIsIHJlc3VsdCk7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorI2VuZGlmCisKK2V4aXQ6CisKKyAgICByZXR1cm4gcmV0OworCit9CisKK3UxNl90IHpmRmlybXdhcmVEb3dubG9hZE5vdEp1bXAoemRldl90KiBkZXYsIHUzMl90KiBmdywgdTMyX3QgbGVuLCB1MzJfdCBvZmZzZXQpCit7CisgICAgdTE2X3QgcmV0ID0gWk1fU1VDQ0VTUzsKKyAgICB1MzJfdCB1Q29kZU9mc3QgPSBvZmZzZXQ7CisgICAgdThfdCAqaW1hZ2UsICpwdHI7CisgICAgdTMyX3QgcmVzdWx0OworCisgICAgaW1hZ2UgPSAodThfdCopIGZ3OworICAgIHB0ciA9IGltYWdlOworCisgICAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgICB1MzJfdCB0cmFuc2xlbiA9IChsZW4gPiA0MDk2KSA/IDQwOTYgOiBsZW47CisKKyAgICAgICAgcmVzdWx0ID0gemZ3VXNiU3VibWl0Q29udHJvbChkZXYsIEZJUk1XQVJFX0RPV05MT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MTZfdCkgKHVDb2RlT2ZzdCA+PiA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbWFnZSwgdHJhbnNsZW4pOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJGSVJNV0FSRV9ET1dOTE9BRCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBsZW4gLT0gdHJhbnNsZW47CisgICAgICAgIGltYWdlICs9IHRyYW5zbGVuOworICAgICAgICB1Q29kZU9mc3QgKz0gdHJhbnNsZW47IC8vIGluIFdvcmQgKDE2IGJpdCkKKworICAgICAgICByZXN1bHQgPSAwOworICAgIH0KKworZXhpdDoKKworICAgIHJldHVybiByZXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmSWRsR2V0RnJlZVR4ZENvdW50ICAgICAgICAqLworLyogICAgICBHZXQgZnJlZSBQQ0kgUENJIFR4RCBjb3VudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZIcEdldEZyZWVUeGRDb3VudCh6ZGV2X3QqIGRldikKK3sKKyAgICByZXR1cm4gemZ3VXNiR2V0RnJlZVR4UVNpemUoZGV2KTsKK30KKwordTMyX3QgemZIcEdldE1heFR4ZENvdW50KHpkZXZfdCogZGV2KQoreworICAgIC8vcmV0dXJuIDg7CisgICAgcmV0dXJuIHpmd1VzYkdldE1heFR4UVNpemUoZGV2KTsKK30KKwordm9pZCB6ZmlVc2JSZWdPdXRDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICByZXR1cm47Cit9CisKK2V4dGVybiB2b2lkIHpmUHVzaFZ0eHEoemRldl90KiBkZXYpOworCit2b2lkIHpmaVVzYk91dENvbXBsZXRlKHpkZXZfdCogZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCBzdGF0dXMsIHU4X3QgKmhkcikgeworI2lmbmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICBpZiAoYnVmKSB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKyNlbHNlCisgICAgI2lmZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICAvL1NpbXBseSBmcmVlIHRoZSBidWYgc2luY2UgQkEgcmV0cmFuc21pc3Npb24gaXMgZG9uZSBpbiB0aGUgZmlybXdhcmUKKyAgICBpZiAoYnVmKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICAjZWxzZQorICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICNpZmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04KKyAgICAvL1NpbXBseSBmcmVlIHRoZSBidWYgc2luY2UgQkEgcmV0cmFuc21pc3Npb24gaXMgZG9uZSBpbiB0aGUgZmlybXdhcmUKKyAgICBpZiAoYnVmKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorICAgICNlbHNlCisgICAgdThfdCBhZ2c7CisgICAgdTE2X3QgZnJhbWVUeXBlOworCisgICAgaWYoIWhkciAmJiBidWYpIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8vem1fZGVidWdfbXNnMCgiYnVmIEZyZWUgZHVlIHRvIGhkciA9PSBOVUxMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihoZHIgJiYgYnVmKSB7CisgICAgICAgIGZyYW1lVHlwZSA9IGhkcls4XSAmIDB4ZjsKKyAgICAgICAgYWdnID0gKHU4X3QpKGhkclsyXSA+PiA1ICkgJiAweDE7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiQUdHPSIsIGFnZyk7CisKKyAgICAgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChhZ2cpIHsKKyAgICAgICAgICAgICAgICAvL2RlbGV0ZSBidWYgaW4gYmEgZmFpbCBxdWV1ZT8/CisgICAgICAgICAgICAgICAgLy9ub3QgZ2FubmEgaGFwcGVuPworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoYWdnKSB7CisgICAgICAgICAgICAgICAgLy9kb24ndCBkbyBhbnl0aGluZworICAgICAgICAgICAgICAgIC8vemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKworICAgIGlmICh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB8fAorICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYgd2QtPnN0YS5FbmFibGVIVCkgfHwKKyAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisgICAgICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAwKTsKKyAgICB9CisgICAgI2VuZGlmCisjZW5kaWYKKworICAgIHJldHVybjsKKworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHB1c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTBjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHB1c2IuaApAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiB1ZF9kZWZzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFVTQiBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0hQVVNCX0gKKyNkZWZpbmUgX0hQVVNCX0gKKworI2RlZmluZSBaTV9PVFVTX0VOQUJMRV9SRVRSWV9GUkVRX0NIQU5HRQorI2RlZmluZSBaTV9CRUFDT05fQlVGRkVSX0FERFJFU1MgICAgICAgICAgICAweDExNzkwMAorCisjZGVmaW5lIFpNX01BWF9DTURfU0laRSAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFpNX0hBTF9NQVhfRUVQUk9NX1JFUSAgICAgICAgICAgICAgIDUxMAorI2RlZmluZSBaTV9IQUxfTUFYX0VFUFJPTV9QUlEgICAgICAgICAgICAgICAyCisKKy8qIEZvciBVU0IgU1RSRUFNIG1vZGUgKi8KKyNpZmRlZiBaTV9ESVNBQkxFX0FNU0RVOEtfU1VQUE9SVAorI2RlZmluZSBaTV9NQVhfVVNCX0lOX1RSQU5TRkVSX1NJWkUgICAgICAgICA0MDk2CisjZWxzZQorI2RlZmluZSBaTV9NQVhfVVNCX0lOX1RSQU5TRkVSX1NJWkUgICAgICAgICA4MTkyCisjZW5kaWYKKyNkZWZpbmUgWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU4gICAgICAgICAgNAorI2RlZmluZSBaTV9VU0JfU1RSRUFNX01PREVfVEFHICAgICAgICAgICAgICAweDRlMDAKKyNkZWZpbmUgWk1fVVNCX01BWF9FUElOVF9CVUZGRVIgICAgICAgICAgICAgNjQKKworc3RydWN0IHpzQ21kUQoreworICAgIHUxNl90IHNyYzsKKyAgICB1MTZfdCBjbWRMZW47CisgICAgdThfdCogYnVmOworICAgIHUzMl90IGNtZFtaTV9NQVhfQ01EX1NJWkUvNF07Cit9OworCitzdHJ1Y3QgenNDb21tYW5kCit7CisgICAgdTE2X3QgZGVsYXlXY21kQ291bnQ7CisgICAgdTMyX3QgZGVsYXlXY21kQWRkclsoWk1fQ01EX1FVRVVFX1NJWkUtNCkvNF07CisgICAgdTMyX3QgZGVsYXlXY21kVmFsWyhaTV9DTURfUVVFVUVfU0laRS00KS80XTsKK307CisKK3N0cnVjdCB6c0hhbFJ4SW5mbworeworICAgIHUzMl90IGN1cnJlbnRSU1NJWzddOyAgICAgICAvKiBSU1NJIGNvbWJpbmVkICovCisgICAgdTMyX3QgY3VycmVudFJ4RVZNWzE0XTsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhTVQ7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YU1DUzsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhQlc7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YVNHOworfTsKKworc3RydWN0IHpzSHBQcml2Cit7CisgICAgdTE2X3QgaHdGcmVxdWVuY3k7CisgICAgdThfdCAgaHdCdzQwOworICAgIHU4X3QgIGh3RXh0T2Zmc2V0OworCisgICAgdThfdCAgZGlzYWJsZURmc0NoOworCisgICAgdTMyX3QgaGFsQ2FwYWJpbGl0eTsKKworICAgIC8qIEZvcnR1bmF0ZWx5IHRoZSBzZWNvbmQgbG9vcCBjYW4gYmUgZGlzYWJsZWQgd2l0aCBhIGJpdCAqLworICAgIC8qIGNhbGxlZCBlbl9wZF9kY19vZmZzZXRfdGhyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHU4X3QgaHdOb3RGaXJzdEluaXQ7CisKKyAgICAvKiBjb21tYW5kIHF1ZXVlICovCisgICAgdTE2X3QgICAgICAgICAgICAgICBjbWRIZWFkOworICAgIHUxNl90ICAgICAgICAgICAgICAgY21kVGFpbDsKKyNpZmRlZiBaTV9YUF9VU0JfTVVMVENNRAorICAgIHUxNl90ICAgICAgICAgICAgICAgY21kU2VuZDsgIC8vIFVzZWQgZm9yIE11bHQgc2VuZCBVU0IgY21kCisjZW5kaWYKKyAgICBzdHJ1Y3QgenNDbWRRICAgICAgIGNtZFFbWk1fQ01EX1FVRVVFX1NJWkVdOworICAgIHUxNl90ICAgICAgICAgICAgICAgY21kUGVuZGluZzsKKyAgICBzdHJ1Y3QgenNDb21tYW5kICAgIGNtZDsgLyogYnVmZmVyIGZvciBkZWxheWVkIGNvbW1hbmRzICovCisgICAgdThfdCAgICAgICAgICAgICAgICBsZWRNb2RlWzJdOworICAgIHUzMl90ICAgICAgICAgICAgICAgY3RsQnVzeTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgIGV4dEJ1c3k7CisKKyAgICAvKgorICAgICAqIEFOSSAmIFJhZGFyIHN1cHBvcnQuCisgICAgICovCisgICAgdTMyX3QgICBwcm9jUGh5RXJyOyAgICAgICAgIC8qIFByb2Nlc3MgUGh5IGVycnMgKi8KKyAgICB1OF90IGhhc0h3UGh5Q291bnRlcnM7ICAgLyogSGFyZHdhcmUgaGFzIHBoeSBjb3VudGVycyAqLworICAgIHUzMl90ICAgYW5pUGVyaW9kOyAgICAgICAgICAvKiBhbmkgdXBkYXRlIGxpc3QgcGVyaW9kICovCisgICAgc3RydWN0IHpzQW5pU3RhdHMgICBzdGF0czsgICAgICAvKiB2YXJpb3VzIHN0YXRpc3RpY3MgKi8KKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAgICpjdXJhbmk7ICAgIC8qIGNhY2hlZCBsYXN0IHJlZmVyZW5jZSAqLworICAgIHN0cnVjdCB6c0FuaVN0YXRlICAgYW5pWzUwXTsgICAvKiBwZXItY2hhbm5lbCBzdGF0ZSAqLworCisgICAgLyoKKyAgICAgKiBBbmkgdGFibGVzIHRoYXQgY2hhbmdlIGJldHdlZW4gdGhlIDU0MTYgYW5kIDUzMTIuCisgICAgICogVGhlc2UgZ2V0IHNldCBhdCBhdHRhY2ggdGltZS4KKyAgICAgKiBYWFggZG9uJ3QgYmVsb25nIGhlcmUKKyAgICAgKiBYWFggbmVlZCBiZXR0ZXIgZXhwbGFuYXRpb24KKyAgICAgKi8KKyAgICBzMzJfdCAgICAgdG90YWxTaXplRGVzaXJlZFs1XTsKKyAgICBzMzJfdCAgICAgY29hcnNlSGlnaFs1XTsKKyAgICBzMzJfdCAgICAgY29hcnNlTG93WzVdOworICAgIHMzMl90ICAgICBmaXJwd3JbNV07CisKKyAgICAvKgorICAgICAqIEFOSSByZWxhdGVkIFBIWSByZWdpc3RlciB2YWx1ZS4KKyAgICAgKi8KKyAgICB1MzJfdCByZWdQSFlEZXNpcmVkU1o7CisgICAgdTMyX3QgcmVnUEhZRmluZFNpZzsKKyAgICB1MzJfdCByZWdQSFlBZ2NDdGwxOworICAgIHUzMl90IHJlZ1BIWVNmY29ycjsKKyAgICB1MzJfdCByZWdQSFlTZmNvcnJMb3c7CisgICAgdTMyX3QgcmVnUEhZVGltaW5nNTsKKyAgICB1MzJfdCByZWdQSFlDY2tEZXRlY3Q7CisKKyAgICB1MzJfdCBlZXByb21JbWFnZVsxMDI0XTsKKyAgICB1MzJfdCBlZXByb21JbWFnZUluZGV4OworICAgIHUzMl90IGVlcHJvbUltYWdlUmRSZXE7CisKKyAgICB1OF90ICBoYWxSZUluaXQ7CisKKyAgICB1OF90ICBPcEZsYWdzOworCisgICAgdThfdCB0UG93MnhDY2tbNF07CisgICAgdThfdCB0UG93MngyZ1s0XTsKKyAgICB1OF90IHRQb3cyeDJnMjRIZWF2eUNsaXBPZmZzZXQ7CisgICAgdThfdCB0UG93MngyZ0h0MjBbOF07CisgICAgdThfdCB0UG93MngyZ0h0NDBbOF07CisgICAgdThfdCB0UG93Mng1Z1s0XTsKKyAgICB1OF90IHRQb3cyeDVnSHQyMFs4XTsKKyAgICB1OF90IHRQb3cyeDVnSHQ0MFs4XTsKKworICAgIC8qIGh3QkJIZWF2eUNsaXAgOiB1c2VkIGNvbXBhdGliaWxpdHkgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgMCA6IGRvbmdsZSBub3Qgc3VwcG9ydC4gICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAhMDogc3VwcG9ydCBoZWF2eSBjbGlwLiAgICAgICAgICAqLworICAgIHU4X3QgaHdCQkhlYXZ5Q2xpcDsKKyAgICB1OF90IGVuYWJsZUJCSGVhdnlDbGlwOyAvKiAwPT5mb3JjZSBkaXNhYmxlIDE9PmVuYWJsZSAqLworICAgIHU4X3QgZG9CQkhlYXZ5Q2xpcDsgICAgIC8qIHNldCAxIGlmIGhlYXZ5IGNsaXAgbmVlZCBieSBlYWNoIGZyZXF1ZW5jeSBzd2l0Y2ggKi8KKyAgICB1MzJfdCBzZXRWYWx1ZUhlYXZ5Q2xpcDsgLyogc2F2ZSBzZXR0aW5nIHZhbHVlIGZvciBoZWF2eSBjbGlwIHdoZW4gY29tcGxldGVkIHJvdXRpbmUgKi8KKworICAgIC8qCisgICAgICogUnhkYXRhIFJTU0ksIEVWTSwgUmF0ZSBldGMuLi4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgenNIYWxSeEluZm8gaGFsUnhJbmZvOworCisgICAgdTMyX3QgdXNiU2VuZEJ5dGVzOworICAgIHUzMl90IHVzYkFjU2VuZEJ5dGVzWzRdOworCisgICAgdTE2X3QgYWdnTWF4RHVyYXRpb25CRTsKKyAgICB1MzJfdCBhZ2dQa3ROdW07CisKKyAgICB1MTZfdCB0eG9wWzRdOworICAgIHUxNl90IGN3bWluWzRdOworICAgIHUxNl90IGN3bWF4WzRdOworICAgIHU4X3QgIHN0cm9uZ1JTU0k7CisgICAgdThfdCAgcnhTdHJvbmdSU1NJOworCisgICAgdThfdCAgc2xvdFR5cGU7ICAvLzAtPjIwdXMsIDE9Pjl1cworCisjaWZkZWYgWk1fT1RVU19SWF9TVFJFQU1fTU9ERQorICAgIHUxNl90IHVzYlJ4UmVtYWluTGVuOworICAgIHUxNl90IHVzYlJ4UGt0TGVuOworICAgIHUxNl90IHVzYlJ4UGFkTGVuOworICAgIHUxNl90IHVzYlJ4VHJhbnNmZXJMZW47CisgICAgemJ1Zl90ICAqcmVtYWluQnVmOworI2VuZGlmCisKKyAgICB1OF90ICAgIGRvdDExTW9kZTsKKworICAgIHU4X3QgICAgaWJzc0JjbkVuYWJsZWQ7CisgICAgdTMyX3QgICBpYnNzQmNuSW50ZXJ2YWw7CisKKyAgICAvLyBGb3IgcmUtaXNzdWUgdGhlIGZyZXF1ZW5jeSBjaGFuZ2UgY29tbWFuZAorICAgIHUzMl90ICAgbGF0ZXN0RnJlcXVlbmN5OworICAgIHU4X3QgICAgbGF0ZXN0Qnc0MDsKKyAgICB1OF90ICAgIGxhdGVzdEV4dE9mZnNldDsKKyAgICB1OF90ICAgIGZyZXFSZXRyeUNvdW50ZXI7CisKKyAgICB1OF90ICAgIHJlY29yZEZyZXFSZXRyeUNvdW50ZXI7CisgICAgdThfdCAgICBpc1NpdGVTdXJ2ZXk7CisgICAgdThfdCAgICBjb2xkUmVzZXROZWVkRnJlcTsKKworICAgIHU2NF90ICAgY2FtUm9sbENhbGxUYWJsZTsKKyAgICB1OF90ICAgIGN1cnJlbnRBY2tSdHNUcGM7CisKKyAgICAvKiAjMSBTYXZlIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSByZWxhdGVkIFJJRlMgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKyAgICAvL3UzMl90ICAgaXNJbml0aWFsUGh5OworICAgIHUzMl90ICAgaW5pdERlc2lyZWRTaWdTaXplOworICAgIHUzMl90ICAgaW5pdEFHQzsKKyAgICB1MzJfdCAgIGluaXRBZ2NDb250cm9sOworICAgIHUzMl90ICAgaW5pdFNlYXJjaFN0YXJ0RGVsYXk7CisgICAgdTMyX3QgICBpbml0UklGU1NlYXJjaFBhcmFtczsKKyAgICB1MzJfdCAgIGluaXRGYXN0Q2hhbm5lbENoYW5nZUNvbnRyb2w7CisKKyAgICAvKiBEeW5hbWljIFNJRlMgZm9yIHJldHJhbnNtaXNzaW9uIGV2ZW50ICovCisgICAgdThfdCAgICByZXRyYW5zbWlzc2lvbkV2ZW50OworICAgIHU4X3QgICAgbGF0ZXN0U0lGUzsKK307CisKK2V4dGVybiB1MzJfdCB6ZkhwTG9hZEVFUFJPTUZyb21GVyh6ZGV2X3QqIGRldik7CisKKwordHlwZWRlZiB1OF90IEFfVUlOVDg7Cit0eXBlZGVmIHM4X3QgQV9JTlQ4OwordHlwZWRlZiB1MTZfdCBBX1VJTlQxNjsKK3R5cGVkZWYgdTMyX3QgQV9VSU5UMzI7CisjZGVmaW5lIF9fQVRUUklCX1BBQ0sKKworI3ByYWdtYSBwYWNrIChwdXNoLCAxKQorCisjZGVmaW5lIEFSNTQxNl9FRVBfVkVSICAgICAgICAgICAgICAgMHhFCisjZGVmaW5lIEFSNTQxNl9FRVBfVkVSX01JTk9SX01BU0sgICAgMHhGRkYKKyNkZWZpbmUgQVI1NDE2X0VFUF9OT19CQUNLX1ZFUiAgICAgICAweDEKKyNkZWZpbmUgQVI1NDE2X0VFUF9NSU5PUl9WRVJfMiAgICAgICAweDIgIC8vIEFkZHMgbW9kYWwgcGFyYW1zIHR4RnJhbWVUb1BhT24sIHR4RnJhbWV0b0RhdGFTdGFydCwgaHQ0MFBvd2VySW5jCisjZGVmaW5lIEFSNTQxNl9FRVBfTUlOT1JfVkVSXzMgICAgICAgMHgzICAvLyBBZGRzIG1vZGFsIHBhcmFtcyBic3dBdHRlbiwgYnN3TWFyZ2luLCBzd1NldHRsZSBhbmQgYmFzZSBPcEZsYWdzIGZvciBIVDIwLzQwIERpc2FibGUKKworLy8gMTYtYml0IG9mZnNldCBsb2NhdGlvbiBzdGFydCBvZiBjYWxpYnJhdGlvbiBzdHJ1Y3QKKyNkZWZpbmUgQVI1NDE2X0VFUF9TVEFSVF9MT0MgICAgICAgICAyNTYKKyNkZWZpbmUgQVI1NDE2X05VTV81R19DQUxfUElFUlMgICAgICA4CisjZGVmaW5lIEFSNTQxNl9OVU1fMkdfQ0FMX1BJRVJTICAgICAgNAorI2RlZmluZSBBUjU0MTZfTlVNXzVHXzIwX1RBUkdFVF9QT1dFUlMgIDgKKyNkZWZpbmUgQVI1NDE2X05VTV81R180MF9UQVJHRVRfUE9XRVJTICA4CisjZGVmaW5lIEFSNTQxNl9OVU1fMkdfQ0NLX1RBUkdFVF9QT1dFUlMgMworI2RlZmluZSBBUjU0MTZfTlVNXzJHXzIwX1RBUkdFVF9QT1dFUlMgIDQKKyNkZWZpbmUgQVI1NDE2X05VTV8yR180MF9UQVJHRVRfUE9XRVJTICA0CisjZGVmaW5lIEFSNTQxNl9OVU1fQ1RMUyAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgQVI1NDE2X05VTV9CQU5EX0VER0VTICAgICAgICA4CisjZGVmaW5lIEFSNTQxNl9OVU1fUERfR0FJTlMgICAgICAgICAgNAorI2RlZmluZSBBUjU0MTZfUERfR0FJTlNfSU5fTUFTSyAgICAgIDQKKyNkZWZpbmUgQVI1NDE2X1BEX0dBSU5fSUNFUFRTICAgICAgICA1CisjZGVmaW5lIEFSNTQxNl9FRVBST01fTU9EQUxfU1BVUlMgICAgNQorI2RlZmluZSBBUjU0MTZfTUFYX1JBVEVfUE9XRVIgICAgICAgIDYzCisjZGVmaW5lIEFSNTQxNl9OVU1fUERBRENfVkFMVUVTICAgICAgMTI4CisjZGVmaW5lIEFSNTQxNl9OVU1fUkFURVMgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQVI1NDE2X0JDSEFOX1VOVVNFRCAgICAgICAgICAweEZGCisjZGVmaW5lIEFSNTQxNl9NQVhfUFdSX1JBTkdFX0lOX0hBTEZfREIgNjQKKyNkZWZpbmUgQVI1NDE2X09QRkxBR1NfMTFBICAgICAgICAgICAweDAxCisjZGVmaW5lIEFSNTQxNl9PUEZMQUdTXzExRyAgICAgICAgICAgMHgwMgorI2RlZmluZSBBUjU0MTZfT1BGTEFHU181R19IVDQwICAgICAgIDB4MDQKKyNkZWZpbmUgQVI1NDE2X09QRkxBR1NfMkdfSFQ0MCAgICAgICAweDA4CisjZGVmaW5lIEFSNTQxNl9PUEZMQUdTXzVHX0hUMjAgICAgICAgMHgxMAorI2RlZmluZSBBUjU0MTZfT1BGTEFHU18yR19IVDIwICAgICAgIDB4MjAKKyNkZWZpbmUgQVI1NDE2X0VFUE1JU0NfQklHX0VORElBTiAgICAweDAxCisjZGVmaW5lIEZSRVEyRkJJTih4LHkpICgoeSkgPyAoKHgpIC0gMjMwMCkgOiAoKCh4KSAtIDQ4MDApIC8gNSkpCisjZGVmaW5lIEFSNTQxNl9NQVhfQ0hBSU5TICAgICAgICAgICAgMgorI2RlZmluZSBBUjU0MTZfQU5UXzE2UyAgICAgICAgICAgICAgIDI1CisKKyNkZWZpbmUgQVI1NDE2X05VTV9BTlRfQ0hBSU5fRklFTERTICAgICA3CisjZGVmaW5lIEFSNTQxNl9OVU1fQU5UX0NPTU1PTl9GSUVMRFMgICAgNAorI2RlZmluZSBBUjU0MTZfU0laRV9BTlRfQ0hBSU5fRklFTEQgICAgIDMKKyNkZWZpbmUgQVI1NDE2X1NJWkVfQU5UX0NPTU1PTl9GSUVMRCAgICA0CisjZGVmaW5lIEFSNTQxNl9BTlRfQ0hBSU5fTUFTSyAgICAgICAgICAgMHg3CisjZGVmaW5lIEFSNTQxNl9BTlRfQ09NTU9OX01BU0sgICAgICAgICAgMHhmCisjZGVmaW5lIEFSNTQxNl9DSEFJTl8wX0lEWCAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjU0MTZfQ0hBSU5fMV9JRFggICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVI1NDE2X0NIQUlOXzJfSURYICAgICAgICAgICAgICAyCisKKworLyogQ2FwYWJpbGl0aWVzIEVudW0gKi8KK3R5cGVkZWYgZW51bSB7CisgICAgRUVQQ0FQX0NPTVBSRVNTX0RJUyAgPSAweDAwMDEsCisgICAgRUVQQ0FQX0FFU19ESVMgICAgICAgPSAweDAwMDIsCisgICAgRUVQQ0FQX0ZBU1RGUkFNRV9ESVMgPSAweDAwMDQsCisgICAgRUVQQ0FQX0JVUlNUX0RJUyAgICAgPSAweDAwMDgsCisgICAgRUVQQ0FQX01BWFFDVV9NICAgICAgPSAweDAxRjAsCisgICAgRUVQQ0FQX01BWFFDVV9TICAgICAgPSA0LAorICAgIEVFUENBUF9IRUFWWV9DTElQX0VOID0gMHgwMjAwLAorICAgIEVFUENBUF9LQ19FTlRSSUVTX00gID0gMHhGMDAwLAorICAgIEVFUENBUF9LQ19FTlRSSUVTX1MgID0gMTIsCit9IEVFUFJPTV9DQVBBQklMSVRJRVM7CisKK3R5cGVkZWYgZW51bSBBcjU0MTZfUmF0ZXMgeworICAgIHJhdGU2bWIsICByYXRlOW1iLCAgcmF0ZTEybWIsIHJhdGUxOG1iLAorICAgIHJhdGUyNG1iLCByYXRlMzZtYiwgcmF0ZTQ4bWIsIHJhdGU1NG1iLAorICAgIHJhdGUxbCwgICByYXRlMmwsICAgcmF0ZTJzLCAgIHJhdGU1XzVsLAorICAgIHJhdGU1XzVzLCByYXRlMTFsLCAgcmF0ZTExcywgIHJhdGVYciwKKyAgICByYXRlSHQyMF8wLCByYXRlSHQyMF8xLCByYXRlSHQyMF8yLCByYXRlSHQyMF8zLAorICAgIHJhdGVIdDIwXzQsIHJhdGVIdDIwXzUsIHJhdGVIdDIwXzYsIHJhdGVIdDIwXzcsCisgICAgcmF0ZUh0NDBfMCwgcmF0ZUh0NDBfMSwgcmF0ZUh0NDBfMiwgcmF0ZUh0NDBfMywKKyAgICByYXRlSHQ0MF80LCByYXRlSHQ0MF81LCByYXRlSHQ0MF82LCByYXRlSHQ0MF83LAorICAgIHJhdGVEdXBDY2ssIHJhdGVEdXBPZmRtLCByYXRlRXh0Q2NrLCByYXRlRXh0T2ZkbSwKKyAgICBBcjU0MTZSYXRlU2l6ZQorfSBBUjU0MTZfUkFURVM7CisKK3R5cGVkZWYgc3RydWN0IGVlcEZsYWdzIHsKKyAgICBBX1VJTlQ4ICBvcEZsYWdzOworICAgIEFfVUlOVDggIGVlcE1pc2M7Cit9IF9fQVRUUklCX1BBQ0sgRUVQX0ZMQUdTOworCisjZGVmaW5lIEFSNTQxNl9DSEVDS1NVTV9MT0NBVElPTiAoQVI1NDE2X0VFUF9TVEFSVF9MT0MgKyAxKQordHlwZWRlZiBzdHJ1Y3QgQmFzZUVlcEhlYWRlciB7CisgICAgQV9VSU5UMTYgIGxlbmd0aDsKKyAgICBBX1VJTlQxNiAgY2hlY2tzdW07CisgICAgQV9VSU5UMTYgIHZlcnNpb247CisgICAgRUVQX0ZMQUdTIG9wQ2FwRmxhZ3M7CisgICAgQV9VSU5UMTYgIHJlZ0RtblsyXTsKKyAgICBBX1VJTlQ4ICAgbWFjQWRkcls2XTsKKyAgICBBX1VJTlQ4ICAgcnhNYXNrOworICAgIEFfVUlOVDggICB0eE1hc2s7CisgICAgQV9VSU5UMTYgIHJmU2lsZW50OworICAgIEFfVUlOVDE2ICBibHVlVG9vdGhPcHRpb25zOworICAgIEFfVUlOVDE2ICBkZXZpY2VDYXA7CisgICAgQV9VSU5UMzIgIGJpbkJ1aWxkTnVtYmVyOworICAgIEFfVUlOVDggICBkZXZpY2VUeXBlOworICAgIEFfVUlOVDggICBmdXR1cmVCYXNlWzMzXTsKK30gX19BVFRSSUJfUEFDSyBCQVNFX0VFUF9IRUFERVI7IC8vIDY0IEIKKwordHlwZWRlZiBzdHJ1Y3Qgc3B1ckNoYW5TdHJ1Y3QgeworICAgIEFfVUlOVDE2IHNwdXJDaGFuOworICAgIEFfVUlOVDggIHNwdXJSYW5nZUxvdzsKKyAgICBBX1VJTlQ4ICBzcHVyUmFuZ2VIaWdoOworfSBfX0FUVFJJQl9QQUNLIFNQVVJfQ0hBTjsKKwordHlwZWRlZiBzdHJ1Y3QgTW9kYWxFZXBIZWFkZXIgeworICAgIEFfVUlOVDMyICBhbnRDdHJsQ2hhaW5bQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAvLyAxMgorICAgIEFfVUlOVDMyICBhbnRDdHJsQ29tbW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0CisgICAgQV9JTlQ4ICAgIGFudGVubmFHYWluQ2hbQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgIC8vIDMKKyAgICBBX1VJTlQ4ICAgc3dpdGNoU2V0dGxpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB0eFJ4QXR0ZW5DaFtBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgICAvLyAzCisgICAgQV9VSU5UOCAgIHJ4VHhNYXJnaW5DaFtBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgIC8vIDMKKyAgICBBX0lOVDggICAgYWRjRGVzaXJlZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfSU5UOCAgICBwZ2FEZXNpcmVkU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHhsbmFHYWluQ2hbQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAgIC8vIDMKKyAgICBBX1VJTlQ4ICAgdHhFbmRUb1hwYU9mZjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB0eEVuZFRvUnhPbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHR4RnJhbWVUb1hwYU9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgdGhyZXNoNjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfSU5UOCAgICBub2lzZUZsb29yVGhyZXNoQ2hbQVI1NDE2X01BWF9DSEFJTlNdOyAvLyAzCisgICAgQV9VSU5UOCAgIHhwZEdhaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgeHBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfSU5UOCAgICBpcUNhbElDaFtBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgICAgICAvLyAxCisgICAgQV9JTlQ4ICAgIGlxQ2FsUUNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgcGRHYWluT3ZlcmxhcDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBvYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIGRiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgeHBhQmlhc0x2bDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBwd3JEZWNyZWFzZUZvcjJDaGFpbjsgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHB3ckRlY3JlYXNlRm9yM0NoYWluOyAgICAgICAgICAgICAgICAgIC8vIDEgLT4gNDggQgorICAgIEFfVUlOVDggICB0eEZyYW1lVG9EYXRhU3RhcnQ7ICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHR4RnJhbWVUb1BhT247ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgaHQ0MFBvd2VySW5jRm9yUGRhZGM7ICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBic3dBdHRlbltBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgICAgICAvLyAzCisgICAgQV9VSU5UOCAgIGJzd01hcmdpbltBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgICAgIC8vIDMKKyAgICBBX1VJTlQ4ICAgc3dTZXR0bGVIdDQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBmdXR1cmVNb2RhbFsyMl07ICAgICAgICAgICAgICAgICAgICAgICAvLworICAgIFNQVVJfQ0hBTiBzcHVyQ2hhbnNbQVI1NDE2X0VFUFJPTV9NT0RBTF9TUFVSU107ICAvLyAyMCBCCit9IF9fQVRUUklCX1BBQ0sgTU9EQUxfRUVQX0hFQURFUjsgICAgICAgICAgICAgICAgICAgIC8vID09IDEwMCBCCisKK3R5cGVkZWYgc3RydWN0IGNhbERhdGFQZXJGcmVxIHsKKyAgICBBX1VJTlQ4IHB3clBkZ1tBUjU0MTZfTlVNX1BEX0dBSU5TXVtBUjU0MTZfUERfR0FJTl9JQ0VQVFNdOworICAgIEFfVUlOVDggdnBkUGRnW0FSNTQxNl9OVU1fUERfR0FJTlNdW0FSNTQxNl9QRF9HQUlOX0lDRVBUU107Cit9IF9fQVRUUklCX1BBQ0sgQ0FMX0RBVEFfUEVSX0ZSRVE7CisKK3R5cGVkZWYgc3RydWN0IENhbFRhcmdldFBvd2VyTGVnYWN5IHsKKyAgICBBX1VJTlQ4ICBiQ2hhbm5lbDsKKyAgICBBX1VJTlQ4ICB0UG93MnhbNF07Cit9IF9fQVRUUklCX1BBQ0sgQ0FMX1RBUkdFVF9QT1dFUl9MRUc7CisKK3R5cGVkZWYgc3RydWN0IENhbFRhcmdldFBvd2VySHQgeworICAgIEFfVUlOVDggIGJDaGFubmVsOworICAgIEFfVUlOVDggIHRQb3cyeFs4XTsKK30gX19BVFRSSUJfUEFDSyBDQUxfVEFSR0VUX1BPV0VSX0hUOworCisjaWYgZGVmaW5lZChBUkNIX0JJR19FTkRJQU4pIHx8IGRlZmluZWQoQklHX0VORElBTikKK3R5cGVkZWYgc3RydWN0IENhbEN0bEVkZ2VzIHsKKyAgICBBX1VJTlQ4ICBiQ2hhbm5lbDsKKyAgICBBX1VJTlQ4ICBmbGFnICAgOjIsCisgICAgICAgICAgICAgdFBvd2VyIDo2OworfSBfX0FUVFJJQl9QQUNLIENBTF9DVExfRURHRVM7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgQ2FsQ3RsRWRnZXMgeworICAgIEFfVUlOVDggIGJDaGFubmVsOworICAgIEFfVUlOVDggIHRQb3dlciA6NiwKKyAgICAgICAgICAgICBmbGFnICAgOjI7Cit9IF9fQVRUUklCX1BBQ0sgQ0FMX0NUTF9FREdFUzsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBDYWxDdGxEYXRhIHsKKyAgICBDQUxfQ1RMX0VER0VTICBjdGxFZGdlc1tBUjU0MTZfTUFYX0NIQUlOU11bQVI1NDE2X05VTV9CQU5EX0VER0VTXTsKK30gX19BVFRSSUJfUEFDSyBDQUxfQ1RMX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IGFyNTQxNkVlcHJvbSB7CisgICAgQkFTRV9FRVBfSEVBREVSICAgIGJhc2VFZXBIZWFkZXI7ICAgICAgICAgLy8gNjQgQgorICAgIEFfVUlOVDggICBjdXN0RGF0YVs2NF07ICAgICAgICAgICAgICAgICAgIC8vIDY0IEIKKyAgICBNT0RBTF9FRVBfSEVBREVSICAgbW9kYWxIZWFkZXJbMl07ICAgICAgICAvLyAyMDAgQgorICAgIEFfVUlOVDggICAgICAgICAgICBjYWxGcmVxUGllcjVHW0FSNTQxNl9OVU1fNUdfQ0FMX1BJRVJTXTsKKyAgICBBX1VJTlQ4ICAgICAgICAgICAgY2FsRnJlcVBpZXIyR1tBUjU0MTZfTlVNXzJHX0NBTF9QSUVSU107CisgICAgQ0FMX0RBVEFfUEVSX0ZSRVEgIGNhbFBpZXJEYXRhNUdbQVI1NDE2X01BWF9DSEFJTlNdW0FSNTQxNl9OVU1fNUdfQ0FMX1BJRVJTXTsKKyAgICBDQUxfREFUQV9QRVJfRlJFUSAgY2FsUGllckRhdGEyR1tBUjU0MTZfTUFYX0NIQUlOU11bQVI1NDE2X05VTV8yR19DQUxfUElFUlNdOworICAgIENBTF9UQVJHRVRfUE9XRVJfTEVHIGNhbFRhcmdldFBvd2VyNUdbQVI1NDE2X05VTV81R18yMF9UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0hUICBjYWxUYXJnZXRQb3dlcjVHSFQyMFtBUjU0MTZfTlVNXzVHXzIwX1RBUkdFVF9QT1dFUlNdOworICAgIENBTF9UQVJHRVRfUE9XRVJfSFQgIGNhbFRhcmdldFBvd2VyNUdIVDQwW0FSNTQxNl9OVU1fNUdfNDBfVEFSR0VUX1BPV0VSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9MRUcgY2FsVGFyZ2V0UG93ZXJDY2tbQVI1NDE2X05VTV8yR19DQ0tfVEFSR0VUX1BPV0VSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9MRUcgY2FsVGFyZ2V0UG93ZXIyR1tBUjU0MTZfTlVNXzJHXzIwX1RBUkdFVF9QT1dFUlNdOworICAgIENBTF9UQVJHRVRfUE9XRVJfSFQgIGNhbFRhcmdldFBvd2VyMkdIVDIwW0FSNTQxNl9OVU1fMkdfMjBfVEFSR0VUX1BPV0VSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9IVCAgY2FsVGFyZ2V0UG93ZXIyR0hUNDBbQVI1NDE2X05VTV8yR180MF9UQVJHRVRfUE9XRVJTXTsKKyAgICBBX1VJTlQ4ICAgICAgICAgICAgY3RsSW5kZXhbQVI1NDE2X05VTV9DVExTXTsKKyAgICBDQUxfQ1RMX0RBVEEgICAgICAgY3RsRGF0YVtBUjU0MTZfTlVNX0NUTFNdOworICAgIEFfVUlOVDggICAgICAgICAgICBwYWRkaW5nOworfSBfX0FUVFJJQl9QQUNLIEFSNTQxNl9FRVBST007CisKKyNwcmFnbWEgcGFjayAocG9wKQorCit0eXBlZGVmIGVudW0gQ29uZm9ybWFuY2VUZXN0TGltaXRzIHsKKyAgICBGQ0MgICAgICAgID0gMHgxMCwKKyAgICBNS0sgICAgICAgID0gMHg0MCwKKyAgICBFVFNJICAgICAgID0gMHgzMCwKKyAgICBTRF9OT19DVEwgID0gMHhFMCwKKyAgICBOT19DVEwgICAgID0gMHhGRiwKKyAgICBDVExfTU9ERV9NID0gMHhGLAorICAgIENUTF8xMUEgICAgPSAwLAorICAgIENUTF8xMUIgICAgPSAxLAorICAgIENUTF8xMUcgICAgPSAyLAorICAgIENUTF9UVVJCTyAgPSAzLAorICAgIENUTF8xMDhHICAgPSA0LAorICAgIENUTF8yR0hUMjAgPSA1LAorICAgIENUTF81R0hUMjAgPSA2LAorICAgIENUTF8yR0hUNDAgPSA3LAorICAgIENUTF81R0hUNDAgPSA4LAorfSBBVEhfQ1RMUzsKKworI2VuZGlmIC8qICNpZm5kZWYgX0hQVVNCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9vdHVzLmluaSBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9vdHVzLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGVmZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL290dXMuaW5pCkBAIC0wLDAgKzEsNDE0IEBACisvKiA4NjAyIDogdXBkYXRlIG1pc21hdGNoIHJlZ2lzdGVyIGJldHdlZW4gTkRJUyBhbmQgQVJUICovCitzdGF0aWMgY29uc3QgdTMyX3QgYXI1NDE2TW9kZXNbXVs2XSA9IHsKKy8qIFJlZ2lzdGVyICAgQS0yMCAgICAgICAgQS0yMC80MCAgICAgRy0yMC80MCAgICAgRy0yMCAgICAgICAgRy1UdXJibyAgICAqLworICAgICB7MHg5ODAwLCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAwfSwKKyAgICAgezB4OTgwNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDNjNCwgMHgwMDAwMDNjNCwgMHgwMDAwMDMwMCwgMH0sCisgICAgIHsweDk4MDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5ODBjLCAweGFkODQ4ZTE5LCAweGFkODQ4ZTE5LCAweGFkODQ4ZTE5LCAweGFkODQ4ZTE5LCAwfSwKKyAgICAgezB4OTgxMCwgMHg3ZDE0ZTAwMCwgMHg3ZDE0ZTAwMCwgMHg3ZDE0ZTAwMCwgMHg3ZDE0ZTAwMCwgMH0sCisgICAgIHsweDk4MTQsIDB4OWMwYTlmNmIsIDB4OWMwYTlmNmIsIDB4OWMwYTlmNmIsIDB4OWMwYTlmNmIsIDB9LAorICAgICB7MHg5ODE4LCAweDAwMDAwMDkwLCAweDAwMDAwMDkwLCAweDAwMDAwMDkwLCAweDAwMDAwMDkwLCAwfSwKKyAgICAgezB4OTgxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk4MjAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB9LAorICAgICB7MHg5ODI0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAwfSwKKyAgICAgezB4OTgyOCwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMH0sCisgICAgIHsweDk4MmMsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB9LAorICAgICB7MHg5ODMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTgzNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMH0sCisgICAgIHsweDk4MzgsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB9LAorICAgICB7MHg5ODNjLCAweDAwMjAwNDAwLCAweDAwMjAwNDAwLCAweDAwMjAwNDAwLCAweDAwMjAwNDAwLCAwfSwKKyAgICAgezB4OTg0MCwgMHgyMDZhMDAyZSwgMHgyMDZhMDAyZSwgMHgyMDZhMDAyZSwgMHgyMDZhMDAyZSwgMH0sCisgICAgIHsweDk4NDQsIDB4MTM3MjE2MWUsIDB4MTM3MjFjMWUsIDB4MTM3MjFjMjQsIDB4MTM3MjE2YTQsIDB9LAorICAgICB7MHg5ODQ4LCAweDAwMWE2YTY1LCAweDAwMWE2YTY1LCAweDAwMTk3YTY4LCAweDAwMTk3YTY4LCAwfSwKKyAgICAgezB4OTg0YywgMHgxMjg0MjMzYywgMHgxMjg0MjMzYywgMHgxMjg0MjMzYywgMHgxMjg0MjMzYywgMH0sCisgICAgIHsweDk4NTAsIDB4NmM0OGI0ZTQsIDB4NmM0OGI0ZTQsIDB4NmM0OGIwZTQsIDB4NmM0OGIwZTQsIDB9LAorICAgICB7MHg5ODU0LCAweDAwMDAwODU5LCAweDAwMDAwODU5LCAweDAwMDAwODU5LCAweDAwMDAwODU5LCAwfSwKKyAgICAgezB4OTg1OCwgMHg3ZWM4MGQyZSwgMHg3ZWM4MGQyZSwgMHg3ZWM4MGQyZSwgMHg3ZWM4MGQyZSwgMH0sCisgICAgIHsweDk4NWMsIDB4MzEzOTVjNWUsIDB4MzEzOTVjNWUsIDB4MzEzOTVjNWUsIDB4MzEzOTVjNWUsIDB9LAorICAgICB7MHg5ODYwLCAweDAwMDRkZDEwLCAweDAwMDRkZDEwLCAweDAwMDRkZDIwLCAweDAwMDRkZDIwLCAwfSwKKyAgICAgezB4OTg2OCwgMHg0MDlhNDE5MCwgMHg0MDlhNDE5MCwgMHg0MDlhNDE5MCwgMHg0MDlhNDE5MCwgMH0sCisgICAgIHsweDk4NmMsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB9LAorICAgICB7MHg5OTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTkwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5MDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTkxNCwgMHgwMDAwMDdkMCwgMHgwMDAwMDdkMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDg5OCwgMH0sCisgICAgIHsweDk5MTgsIDB4MDAwMDAxMTgsIDB4MDAwMDAyMzAsIDB4MDAwMDAyNjgsIDB4MDAwMDAxMzQsIDB9LAorICAgICB7MHg5OTFjLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAwfSwKKyAgICAgezB4OTkyMCwgMHgwNTEwMDgxYywgMHgwNTEwMDgxYywgMHgwNTEwMDAxYywgMHgwNTEwMDAxYywgMH0sCisgICAgIHsweDk5MjQsIDB4ZDAwNThhMTUsIDB4ZDAwNThhMTUsIDB4ZDAwNThhMTUsIDB4ZDAwNThhMTUsIDB9LAorICAgICB7MHg5OTI4LCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAwfSwKKyAgICAgezB4OTkyYywgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMH0sCisgICAgIHsweDk5MzQsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHg5OTM4LCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4OTkzYywgMHgwMDAwMDA3ZiwgMHgwMDAwMDA3ZiwgMHgwMDAwMDA3ZiwgMHgwMDAwMDA3ZiwgMH0sCisgICAgIHsweDk5NDQsIDB4ZGZiODEwMjAsIDB4ZGZiODEwMjAsIDB4ZGZiODEwMjAsIDB4ZGZiODEwMjAsIDB9LAorICAgICB7MHg5OTQ4LCAweDkyODBiMjEyLCAweDkyODBiMjEyLCAweDkyODBiMjEyLCAweDkyODBiMjEyLCAwfSwKKyAgICAgezB4OTk0YywgMHgwMDAyMDAyOCwgMHgwMDAyMDAyOCwgMHgwMDAyMDAyOCwgMHgwMDAyMDAyOCwgMH0sCisgICAgIHsweDk5NTQsIDB4NWQ1MGUxODgsIDB4NWQ1MGUxODgsIDB4NWQ1MGUxODgsIDB4NWQ1MGUxODgsIDB9LAorICAgICB7MHg5OTU4LCAweDAwMDgxZmZmLCAweDAwMDgxZmZmLCAweDAwMDgxZmZmLCAweDAwMDgxZmZmLCAwfSwKKyAgICAgezB4OTk2MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMH0sCisgICAgIHsweDk5NjQsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB9LAorICAgICB7MHg5OTcwLCAweDE5MGZiNTE1LCAweDE5MGZiNTE1LCAweDE5MGZiNTE1LCAweDE5MGZiNTE1LCAwfSwKKyAgICAgezB4OTk3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5NzgsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB9LAorICAgICB7MHg5OTdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5OTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTlhNCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMH0sCisgICAgIHsweDk5YTgsIDB4MDAxZmZmMDAsIDB4MDAxZmZmMDAsIDB4MDAxZmZmMDAsIDB4MDAxZmZmMDAsIDB9LAorICAgICB7MHg5OWFjLCAweDAwNmYwMGM0LCAweDAwNmYwMGM0LCAweDAwNmYwMGM0LCAweDAwNmYwMGM0LCAwfSwKKyAgICAgezB4OTliMCwgMHgwMzA1MTAwMCwgMHgwMzA1MTAwMCwgMHgwMzA1MTAwMCwgMHgwMzA1MTAwMCwgMH0sCisgICAgIHsweDk5YjQsIDB4MDAwMDA4MjAsIDB4MDAwMDA4MjAsIDB4MDAwMDA4MjAsIDB4MDAwMDA4MjAsIDB9LAorICAgICB7MHg5OWMwLCAweDAzODkxOWJlLCAweDAzODkxOWJlLCAweDAzODkxOWJlLCAweDAzODkxOWJlLCAwfSwKKyAgICAgezB4OTljNCwgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMH0sCisgICAgIHsweDk5YzgsIDB4NjBmNjUzMmMsIDB4NjBmNjUzMmMsIDB4NjBmNjUzMmMsIDB4NjBmNjUzMmMsIDB9LAorICAgICB7MHg5OWNjLCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAwfSwKKyAgICAgezB4OTlkMCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMH0sCisgICAgIHsweDk5ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTlkYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ZTAsIDB4MDAwMDAyMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDAyMDAsIDB9LAorICAgICB7MHg5OWU0LCAweDY0NjQ2NDY0LCAweDY0NjQ2NDY0LCAweDY0NjQ2NDY0LCAweDY0NjQ2NDY0LCAwfSwKKyAgICAgezB4OTllOCwgMHgzYzc4Nzg3OCwgMHgzYzc4Nzg3OCwgMHgzYzc4Nzg3OCwgMHgzYzc4Nzg3OCwgMH0sCisgICAgIHsweDk5ZWMsIDB4MDAwMDAwYWEsIDB4MDAwMDAwYWEsIDB4MDAwMDAwYWEsIDB4MDAwMDAwYWEsIDB9LAorICAgICB7MHg5OWYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTlmYywgMHgwMDAwMTA0MiwgMHgwMDAwMTA0MiwgMHgwMDAwMTA0MiwgMHgwMDAwMTA0MiwgMH0sCisgICAgIHsweDlhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YTA0LCAweDAwMDAwMDQwLCAweDAwMDAwMDQwLCAweDAwMDAwMDQwLCAweDAwMDAwMDQwLCAwfSwKKyAgICAgezB4OWEwOCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCwgMH0sCisgICAgIHsweDlhMGMsIDB4MDAwMDAxYTEsIDB4MDAwMDAxYTEsIDB4MDAwMDAxNDEsIDB4MDAwMDAxNDEsIDB9LAorICAgICB7MHg5YTEwLCAweDAwMDAwMWUxLCAweDAwMDAwMWUxLCAweDAwMDAwMTgxLCAweDAwMDAwMTgxLCAwfSwKKyAgICAgezB4OWExNCwgMHgwMDAwMDAyMSwgMHgwMDAwMDAyMSwgMHgwMDAwMDFjMSwgMHgwMDAwMDFjMSwgMH0sCisgICAgIHsweDlhMTgsIDB4MDAwMDAwNjEsIDB4MDAwMDAwNjEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB9LAorICAgICB7MHg5YTFjLCAweDAwMDAwMTY4LCAweDAwMDAwMTY4LCAweDAwMDAwMDQxLCAweDAwMDAwMDQxLCAwfSwKKyAgICAgezB4OWEyMCwgMHgwMDAwMDFhOCwgMHgwMDAwMDFhOCwgMHgwMDAwMDFhOCwgMHgwMDAwMDFhOCwgMH0sCisgICAgIHsweDlhMjQsIDB4MDAwMDAxZTgsIDB4MDAwMDAxZTgsIDB4MDAwMDAxZTgsIDB4MDAwMDAxZTgsIDB9LAorICAgICB7MHg5YTI4LCAweDAwMDAwMDI4LCAweDAwMDAwMDI4LCAweDAwMDAwMDI4LCAweDAwMDAwMDI4LCAwfSwKKyAgICAgezB4OWEyYywgMHgwMDAwMDA2OCwgMHgwMDAwMDA2OCwgMHgwMDAwMDA2OCwgMHgwMDAwMDA2OCwgMH0sCisgICAgIHsweDlhMzAsIDB4MDAwMDAxODksIDB4MDAwMDAxODksIDB4MDAwMDAwYTgsIDB4MDAwMDAwYTgsIDB9LAorICAgICB7MHg5YTM0LCAweDAwMDAwMWM5LCAweDAwMDAwMWM5LCAweDAwMDAwMTY5LCAweDAwMDAwMTY5LCAwfSwKKyAgICAgezB4OWEzOCwgMHgwMDAwMDAwOSwgMHgwMDAwMDAwOSwgMHgwMDAwMDFhOSwgMHgwMDAwMDFhOSwgMH0sCisgICAgIHsweDlhM2MsIDB4MDAwMDAwNDksIDB4MDAwMDAwNDksIDB4MDAwMDAxZTksIDB4MDAwMDAxZTksIDB9LAorICAgICB7MHg5YTQwLCAweDAwMDAwMDg5LCAweDAwMDAwMDg5LCAweDAwMDAwMDI5LCAweDAwMDAwMDI5LCAwfSwKKyAgICAgezB4OWE0NCwgMHgwMDAwMDE3MCwgMHgwMDAwMDE3MCwgMHgwMDAwMDA2OSwgMHgwMDAwMDA2OSwgMH0sCisgICAgIHsweDlhNDgsIDB4MDAwMDAxYjAsIDB4MDAwMDAxYjAsIDB4MDAwMDAxOTAsIDB4MDAwMDAxOTAsIDB9LAorICAgICB7MHg5YTRjLCAweDAwMDAwMWYwLCAweDAwMDAwMWYwLCAweDAwMDAwMWQwLCAweDAwMDAwMWQwLCAwfSwKKyAgICAgezB4OWE1MCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMH0sCisgICAgIHsweDlhNTQsIDB4MDAwMDAwNzAsIDB4MDAwMDAwNzAsIDB4MDAwMDAwNTAsIDB4MDAwMDAwNTAsIDB9LAorICAgICB7MHg5YTU4LCAweDAwMDAwMTkxLCAweDAwMDAwMTkxLCAweDAwMDAwMDkwLCAweDAwMDAwMDkwLCAwfSwKKyAgICAgezB4OWE1YywgMHgwMDAwMDFkMSwgMHgwMDAwMDFkMSwgMHgwMDAwMDE1MSwgMHgwMDAwMDE1MSwgMH0sCisgICAgIHsweDlhNjAsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMTEsIDB4MDAwMDAxOTEsIDB4MDAwMDAxOTEsIDB9LAorICAgICB7MHg5YTY0LCAweDAwMDAwMDUxLCAweDAwMDAwMDUxLCAweDAwMDAwMWQxLCAweDAwMDAwMWQxLCAwfSwKKyAgICAgezB4OWE2OCwgMHgwMDAwMDA5MSwgMHgwMDAwMDA5MSwgMHgwMDAwMDAxMSwgMHgwMDAwMDAxMSwgMH0sCisgICAgIHsweDlhNmMsIDB4MDAwMDAxYjgsIDB4MDAwMDAxYjgsIDB4MDAwMDAwNTEsIDB4MDAwMDAwNTEsIDB9LAorICAgICB7MHg5YTcwLCAweDAwMDAwMWY4LCAweDAwMDAwMWY4LCAweDAwMDAwMTk4LCAweDAwMDAwMTk4LCAwfSwKKyAgICAgezB4OWE3NCwgMHgwMDAwMDAzOCwgMHgwMDAwMDAzOCwgMHgwMDAwMDFkOCwgMHgwMDAwMDFkOCwgMH0sCisgICAgIHsweDlhNzgsIDB4MDAwMDAwNzgsIDB4MDAwMDAwNzgsIDB4MDAwMDAwMTgsIDB4MDAwMDAwMTgsIDB9LAorICAgICB7MHg5YTdjLCAweDAwMDAwMTk5LCAweDAwMDAwMTk5LCAweDAwMDAwMDU4LCAweDAwMDAwMDU4LCAwfSwKKyAgICAgezB4OWE4MCwgMHgwMDAwMDFkOSwgMHgwMDAwMDFkOSwgMHgwMDAwMDA5OCwgMHgwMDAwMDA5OCwgMH0sCisgICAgIHsweDlhODQsIDB4MDAwMDAwMTksIDB4MDAwMDAwMTksIDB4MDAwMDAxNTksIDB4MDAwMDAxNTksIDB9LAorICAgICB7MHg5YTg4LCAweDAwMDAwMDU5LCAweDAwMDAwMDU5LCAweDAwMDAwMTk5LCAweDAwMDAwMTk5LCAwfSwKKyAgICAgezB4OWE4YywgMHgwMDAwMDA5OSwgMHgwMDAwMDA5OSwgMHgwMDAwMDFkOSwgMHgwMDAwMDFkOSwgMH0sCisgICAgIHsweDlhOTAsIDB4MDAwMDAwZDksIDB4MDAwMDAwZDksIDB4MDAwMDAwMTksIDB4MDAwMDAwMTksIDB9LAorICAgICB7MHg5YTk0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMDU5LCAweDAwMDAwMDU5LCAwfSwKKyAgICAgezB4OWE5OCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDA5OSwgMHgwMDAwMDA5OSwgMH0sCisgICAgIHsweDlhOWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZDksIDB4MDAwMDAwZDksIDB9LAorICAgICB7MHg5YWEwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFhNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWFjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFiMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYjQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWI4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFiYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYzAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWM0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFjOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhY2MsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWQwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFkNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZDgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWRjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFlMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWU4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFlYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZjAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWY0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFmOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZmMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWIwNCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMH0sCisgICAgIHsweDliMDgsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDIsIDB9LAorICAgICB7MHg5YjBjLCAweDAwMDAwMDAzLCAweDAwMDAwMDAzLCAweDAwMDAwMDAzLCAweDAwMDAwMDAzLCAwfSwKKyAgICAgezB4OWIxMCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMH0sCisgICAgIHsweDliMTQsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDUsIDB9LAorICAgICB7MHg5YjE4LCAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAwfSwKKyAgICAgezB4OWIxYywgMHgwMDAwMDAwOSwgMHgwMDAwMDAwOSwgMHgwMDAwMDAwOSwgMHgwMDAwMDAwOSwgMH0sCisgICAgIHsweDliMjAsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMGEsIDB9LAorICAgICB7MHg5YjI0LCAweDAwMDAwMDBiLCAweDAwMDAwMDBiLCAweDAwMDAwMDBiLCAweDAwMDAwMDBiLCAwfSwKKyAgICAgezB4OWIyOCwgMHgwMDAwMDAwYywgMHgwMDAwMDAwYywgMHgwMDAwMDAwYywgMHgwMDAwMDAwYywgMH0sCisgICAgIHsweDliMmMsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB9LAorICAgICB7MHg5YjMwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAwfSwKKyAgICAgezB4OWIzNCwgMHgwMDAwMDAxMSwgMHgwMDAwMDAxMSwgMHgwMDAwMDAxMSwgMHgwMDAwMDAxMSwgMH0sCisgICAgIHsweDliMzgsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMTIsIDB9LAorICAgICB7MHg5YjNjLCAweDAwMDAwMDEzLCAweDAwMDAwMDEzLCAweDAwMDAwMDEzLCAweDAwMDAwMDEzLCAwfSwKKyAgICAgezB4OWI0MCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMH0sCisgICAgIHsweDliNDQsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMTUsIDB9LAorICAgICB7MHg5YjQ4LCAweDAwMDAwMDE4LCAweDAwMDAwMDE4LCAweDAwMDAwMDE4LCAweDAwMDAwMDE4LCAwfSwKKyAgICAgezB4OWI0YywgMHgwMDAwMDAxOSwgMHgwMDAwMDAxOSwgMHgwMDAwMDAxOSwgMHgwMDAwMDAxOSwgMH0sCisgICAgIHsweDliNTAsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB9LAorICAgICB7MHg5YjU0LCAweDAwMDAwMDFiLCAweDAwMDAwMDFiLCAweDAwMDAwMDFiLCAweDAwMDAwMDFiLCAwfSwKKyAgICAgezB4OWI1OCwgMHgwMDAwMDAxYywgMHgwMDAwMDAxYywgMHgwMDAwMDAxYywgMHgwMDAwMDAxYywgMH0sCisgICAgIHsweDliNWMsIDB4MDAwMDAwMWQsIDB4MDAwMDAwMWQsIDB4MDAwMDAwMWQsIDB4MDAwMDAwMWQsIDB9LAorICAgICB7MHg5YjYwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAweDAwMDAwMDIwLCAwfSwKKyAgICAgezB4OWI2NCwgMHgwMDAwMDAyMSwgMHgwMDAwMDAyMSwgMHgwMDAwMDAyMSwgMHgwMDAwMDAyMSwgMH0sCisgICAgIHsweDliNjgsIDB4MDAwMDAwMjIsIDB4MDAwMDAwMjIsIDB4MDAwMDAwMjIsIDB4MDAwMDAwMjIsIDB9LAorICAgICB7MHg5YjZjLCAweDAwMDAwMDIzLCAweDAwMDAwMDIzLCAweDAwMDAwMDIzLCAweDAwMDAwMDIzLCAwfSwKKyAgICAgezB4OWI3MCwgMHgwMDAwMDAyNCwgMHgwMDAwMDAyNCwgMHgwMDAwMDAyNCwgMHgwMDAwMDAyNCwgMH0sCisgICAgIHsweDliNzQsIDB4MDAwMDAwMjUsIDB4MDAwMDAwMjUsIDB4MDAwMDAwMjUsIDB4MDAwMDAwMjUsIDB9LAorICAgICB7MHg5Yjc4LCAweDAwMDAwMDI4LCAweDAwMDAwMDI4LCAweDAwMDAwMDI4LCAweDAwMDAwMDI4LCAwfSwKKyAgICAgezB4OWI3YywgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMH0sCisgICAgIHsweDliODAsIDB4MDAwMDAwMmEsIDB4MDAwMDAwMmEsIDB4MDAwMDAwMmEsIDB4MDAwMDAwMmEsIDB9LAorICAgICB7MHg5Yjg0LCAweDAwMDAwMDJiLCAweDAwMDAwMDJiLCAweDAwMDAwMDJiLCAweDAwMDAwMDJiLCAwfSwKKyAgICAgezB4OWI4OCwgMHgwMDAwMDAyYywgMHgwMDAwMDAyYywgMHgwMDAwMDAyYywgMHgwMDAwMDAyYywgMH0sCisgICAgIHsweDliOGMsIDB4MDAwMDAwMmQsIDB4MDAwMDAwMmQsIDB4MDAwMDAwMmQsIDB4MDAwMDAwMmQsIDB9LAorICAgICB7MHg5YjkwLCAweDAwMDAwMDMwLCAweDAwMDAwMDMwLCAweDAwMDAwMDMwLCAweDAwMDAwMDMwLCAwfSwKKyAgICAgezB4OWI5NCwgMHgwMDAwMDAzMSwgMHgwMDAwMDAzMSwgMHgwMDAwMDAzMSwgMHgwMDAwMDAzMSwgMH0sCisgICAgIHsweDliOTgsIDB4MDAwMDAwMzIsIDB4MDAwMDAwMzIsIDB4MDAwMDAwMzIsIDB4MDAwMDAwMzIsIDB9LAorICAgICB7MHg5YjljLCAweDAwMDAwMDMzLCAweDAwMDAwMDMzLCAweDAwMDAwMDMzLCAweDAwMDAwMDMzLCAwfSwKKyAgICAgezB4OWJhMCwgMHgwMDAwMDAzNCwgMHgwMDAwMDAzNCwgMHgwMDAwMDAzNCwgMHgwMDAwMDAzNCwgMH0sCisgICAgIHsweDliYTQsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmE4LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJhYywgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYjAsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmI0LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJiOCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYmMsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmMwLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJjNCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYzgsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmNjLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJkMCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZDQsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmQ4LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJkYywgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZTAsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmU0LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJlOCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZWMsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmYwLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJmNCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZjgsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB9LAorICAgICB7MHg5YmZjLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAwfSwKKyAgICAgezB4OWMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5Y2YwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWNmNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5Y2ZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTIwMCwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwZSwgMHgwMDAwMDAwZSwgMH0sCisgICAgIHsweGEyMDQsIDB4MDAwMDA0NDAsIDB4MDAwMDA0NDAsIDB4MDAwMDA0NDAsIDB4MDAwMDA0NDAsIDB9LAorICAgICB7MHhhMjA4LCAweGQ2YmU0Nzg4LCAweGQ2YmU0Nzg4LCAweGQwM2U0Nzg4LCAweGQwM2U0Nzg4LCAwfSwKKyAgICAgezB4YTIwYywgMHgwMTJlODE2MCwgMHgwMTJlODE2MCwgMHgwMTJhODE2MCwgMHgwMTJhODE2MCwgMH0sCisgICAgIHsweGEyMTAsIDB4NDA4MDYzMzMsIDB4NDA4MDYzMzMsIDB4NDA4MDYzMzMsIDB4NDA4MDYzMzMsIDB9LAorICAgICB7MHhhMjE0LCAweDAwMTA2YzEwLCAweDAwMTA2YzEwLCAweDAwMTA2YzEwLCAweDAwMTA2YzEwLCAwfSwKKyAgICAgezB4YTIxOCwgMHgwMDljNDA2MCwgMHgwMDljNDA2MCwgMHgwMDljNDA2MCwgMHgwMDljNDA2MCwgMH0sCisgICAgIHsweGEyMWMsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB9LAorICAgICB7MHhhMjIwLCAweDAxODgzMGM2LCAweDAxODgzMGM2LCAweDAxODgzMGM2LCAweDAxODgzMGM2LCAwfSwKKyAgICAgezB4YTIyNCwgMHgwMDAwMDQwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDQwMCwgMH0sCisgICAgIHsweGEyMjgsIDB4MDAwMDA5YjUsIDB4MDAwMDA5YjUsIDB4MDAwMDA5YjUsIDB4MDAwMDA5YjUsIDB9LAorICAgICB7MHhhMjJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTIzMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMH0sCisgICAgIHsweGEyMzQsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhMjM4LCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4YTIzYywgMHgxM2M4ODlhZiwgMHgxM2M4ODlhZiwgMHgxM2M4ODlhZiwgMHgxM2M4ODlhZiwgMH0sCisgICAgIHsweGEyNDAsIDB4Mzg0OTBhMjAsIDB4Mzg0OTBhMjAsIDB4Mzg0OTBhMjAsIDB4Mzg0OTBhMjAsIDB9LAorICAgICB7MHhhMjQ0LCAweDAwMDA3YmI2LCAweDAwMDA3YmI2LCAweDAwMDA3YmI2LCAweDAwMDA3YmI2LCAwfSwKKyAgICAgezB4YTI0OCwgMHgwZmZmM2ZmYywgMHgwZmZmM2ZmYywgMHgwZmZmM2ZmYywgMHgwZmZmM2ZmYywgMH0sCisgICAgIHsweGEyNGMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB9LAorICAgICB7MHhhMjUwLCAweDAwMDBhMDAwLCAweDAwMDBhMDAwLCAweDAwMDBhMDAwLCAweDAwMDBhMDAwLCAwfSwKKyAgICAgezB4YTI1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEyNTgsIDB4MGNjNzUzODAsIDB4MGNjNzUzODAsIDB4MGNjNzUzODAsIDB4MGNjNzUzODAsIDB9LAorICAgICB7MHhhMjVjLCAweDBmMGYwZjAxLCAweDBmMGYwZjAxLCAweDBmMGYwZjAxLCAweDBmMGYwZjAxLCAwfSwKKyAgICAgezB4YTI2MCwgMHhkZmE5MWYwMSwgMHhkZmE5MWYwMSwgMHhkZmE5MWYwMSwgMHhkZmE5MWYwMSwgMH0sCisgICAgIHsweGEyNjQsIDB4MDA0MThhMTEsIDB4MDA0MThhMTEsIDB4MDA0MThhMTEsIDB4MDA0MThhMTEsIDB9LAorICAgICB7MHhhMjY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTI2YywgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMH0sCisgICAgIHsweGEyNzQsIDB4MGExYTljYWEsIDB4MGExYTljYWEsIDB4MGExYTdjYWEsIDB4MGExYTdjYWEsIDB9LAorICAgICB7MHhhMjc4LCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAwfSwKKyAgICAgezB4YTI3YywgMHgwNTE3MDFjZSwgMHgwNTE3MDFjZSwgMHgwNTE3MDFjZSwgMHgwNTE3MDFjZSwgMH0sCisgICAgIHsweGEzMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB9LAorICAgICB7MHhhMzA0LCAweDMwMDMyNjAyLCAweDMwMDMyNjAyLCAweDJlMDMyNDAyLCAweDJlMDMyNDAyLCAwfSwKKyAgICAgezB4YTMwOCwgMHg0ODA3M2UwNiwgMHg0ODA3M2UwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNiwgMH0sCisgICAgIHsweGEzMGMsIDB4NTYwYjRjMGEsIDB4NTYwYjRjMGEsIDB4NjIxYTU0MGIsIDB4NjIxYTU0MGIsIDB9LAorICAgICB7MHhhMzEwLCAweDY0MWE2MDBmLCAweDY0MWE2MDBmLCAweDc2NGY2YzFiLCAweDc2NGY2YzFiLCAwfSwKKyAgICAgezB4YTMxNCwgMHg3YTRmNmUxYiwgMHg3YTRmNmUxYiwgMHg4NDViN2E1YSwgMHg4NDViN2E1YSwgMH0sCisgICAgIHsweGEzMTgsIDB4OGM1YjdlNWEsIDB4OGM1YjdlNWEsIDB4OTUwZjhjY2YsIDB4OTUwZjhjY2YsIDB9LAorICAgICB7MHhhMzFjLCAweDlkMGY5NmNmLCAweDlkMGY5NmNmLCAweGE1Y2Y5YjRmLCAweGE1Y2Y5YjRmLCAwfSwKKyAgICAgezB4YTMyMCwgMHhiNTFmYTY5ZiwgMHhiNTFmYTY5ZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZiwgMH0sCisgICAgIHsweGEzMjQsIDB4Y2IzZmJkMDcsIDB4Y2IzZmJjYmYsIDB4ZDFmZmM5M2YsIDB4ZDFmZmM5M2YsIDB9LAorICAgICB7MHhhMzI4LCAweDAwMDBkN2JmLCAweDAwMDBkN2JmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTMzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTM0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzNDgsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB9LAorICAgICB7MHhhMzRjLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAwfSwKKyAgICAgezB4YTM1MCwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMH0sCisgICAgIHsweGEzNTQsIDB4MDAwM2ZmZmYsIDB4MDAwM2ZmZmYsIDB4MDAwM2ZmZmYsIDB4MDAwM2ZmZmYsIDB9LAorICAgICB7MHhhMzU4LCAweDc5YThhYTFmLCAweDc5YThhYTFmLCAweDc5YThhYTFmLCAweDc5YThhYTFmLCAwfSwKKyAgICAgezB4YTM4OCwgMHgwODAwMDAwMCwgMHgwODAwMDAwMCwgMHgwODAwMDAwMCwgMHgwODAwMDAwMCwgMH0sCisgICAgIHsweGEzOGMsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhMzkwLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4YTM5NCwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMH0sCisgICAgIHsweGEzOTgsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2UsIDB9LAorICAgICB7MHhhMzljLCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAwfSwKKyAgICAgezB4YTNhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2E4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2I0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2MwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2NjLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4YTNkMCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEzZDQsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhM2Q4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNkYywgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMH0sCisgICAgIHsweGEzZTAsIDB4MDAwMDAwYzAsIDB4MDAwMDAwYzAsIDB4MDAwMDAwYzAsIDB4MDAwMDAwYzAsIDB9LAorICAgICB7MHhhODQ4LCAweDAwMTgwYTY1LCAweDAwMTgwYTY1LCAweDAwMTgwYTY4LCAweDAwMTgwYTY4LCAwfSwKKyAgICAgezB4YTkyMCwgMHgwNTEwMDAxYywgMHgwNTEwMDAxYywgMHgwNTEwMDAxYywgMHgwNTEwMDAxYywgMH0sCisgICAgIHsweGE5NjAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB9LAorICAgICB7MHhiMjBjLCAweDAxMmU4MTYwLCAweDAxMmU4MTYwLCAweDAxMmE4MTYwLCAweDAxMmE4MTYwLCAwfSwKKyAgICAgezB4YjI2YywgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMH0sCisgICAgIHsweGI4NDgsIDB4MDAxODBhNjUsIDB4MDAxODBhNjUsIDB4MDAxODBhNjgsIDB4MDAxODBhNjgsIDB9LAorICAgICB7MHhiOTIwLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAwfSwKKyAgICAgezB4Yjk2MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMH0sCisgICAgIHsweGMyMGMsIDB4MDEyZTgxNjAsIDB4MDEyZTgxNjAsIDB4MDEyYTgxNjAsIDB4MDEyYTgxNjAsIDB9LAorICAgICB7MHhjMjZjLCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAwfSwKKyAgICAgLy97MHhjODY0LCAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAwfSwKKyAgICAgezB4Yzg2NCwgMHgwMDAxYzYwMCwgMHgwMDAxYzYwMCwgMHgwMDAxYzYwMCwgMHgwMDAxYzYwMCwgMH0sCisgICAgIHsweGM5NWMsIDB4MDA0YjZhOGUsIDB4MDA0YjZhOGUsIDB4MDA0YjZhOGUsIDB4MDA0YjZhOGUsIDB9LAorICAgICB7MHhjOTY4LCAweDAwMDAwM2NlLCAweDAwMDAwM2NlLCAweDAwMDAwM2NlLCAweDAwMDAwM2NlLCAwfSwKKyAgICAgezB4YzliYywgMHgwMDE4MTQwMCwgMHgwMDE4MTQwMCwgMHgwMDE4MTQwMCwgMHgwMDE4MTQwMCwgMH0sCisgICAgIHsweGQyNzAsIDB4MDA4MjA4MjAsIDB4MDA4MjA4MjAsIDB4MDA4MjA4MjAsIDB4MDA4MjA4MjAsIDB9LAorICAgICB7MHhkMzVjLCAweDA2NmM0MjBmLCAweDA2NmM0MjBmLCAweDA2NmM0MjBmLCAweDA2NmM0MjBmLCAwfSwKKyAgICAgezB4ZDM2MCwgMHgwZjI4MjIwNywgMHgwZjI4MjIwNywgMHgwZjI4MjIwNywgMHgwZjI4MjIwNywgMH0sCisgICAgIHsweGQzNjQsIDB4MTc2MDE2ODUsIDB4MTc2MDE2ODUsIDB4MTc2MDE2ODUsIDB4MTc2MDE2ODUsIDB9LAorICAgICB7MHhkMzY4LCAweDFmODAxMTA0LCAweDFmODAxMTA0LCAweDFmODAxMTA0LCAweDFmODAxMTA0LCAwfSwKKyAgICAgezB4ZDM2YywgMHgzN2EwMGMwMywgMHgzN2EwMGMwMywgMHgzN2EwMGMwMywgMHgzN2EwMGMwMywgMH0sCisgICAgIHsweGQzNzAsIDB4M2ZjNDA4ODMsIDB4M2ZjNDA4ODMsIDB4M2ZjNDA4ODMsIDB4M2ZjNDA4ODMsIDB9LAorICAgICB7MHhkMzc0LCAweDU3YzAwODAzLCAweDU3YzAwODAzLCAweDU3YzAwODAzLCAweDU3YzAwODAzLCAwfSwKKyAgICAgezB4ZDM3OCwgMHg1ZmQ4MDY4MiwgMHg1ZmQ4MDY4MiwgMHg1ZmQ4MDY4MiwgMHg1ZmQ4MDY4MiwgMH0sCisgICAgIHsweGQzN2MsIDB4N2ZlMDA0ODIsIDB4N2ZlMDA0ODIsIDB4N2ZlMDA0ODIsIDB4N2ZlMDA0ODIsIDB9LAorICAgICB7MHhkMzgwLCAweDdmM2M3YmJhLCAweDdmM2M3YmJhLCAweDdmM2M3YmJhLCAweDdmM2M3YmJhLCAwfSwKKyAgICAgezB4ZDM4NCwgMHhmMzMwN2ZmMCwgMHhmMzMwN2ZmMCwgMHhmMzMwN2ZmMCwgMHhmMzMwN2ZmMCwgMH0KK307CisKKworc3RhdGljIGNvbnN0IHUzMl90IG90dXNCYW5rW11bM10gPSB7CisgICAgIC8vIyBiYW5rIDAKKyAgICAgezB4OThiMCwgIDB4MWU1Nzk1ZTUsICAweDFlNTc5NWU1fSwKKyAgICAgezB4OThlMCwgIDB4MDIwMDgwMjAsICAweDAyMDA4MDIwfSwKKyAgICAgLy8jIGJhbmsgMQorICAgICB7MHg5OGIwLCAgMHgwMjEwODQyMSwgIDB4MDIxMDg0MjF9LAorICAgICB7MHg5OGVjLCAgMHgwMDAwMDAwOCwgIDB4MDAwMDAwMDh9LAorICAgICAvLyMgYmFuayAyCisgICAgIHsweDk4YjAsICAweDBlNzNmZjE3LCAgMHgwZTczZmYxN30sCisgICAgIHsweDk4ZTAsICAweDAwMDAwNDIwLCAgMHgwMDAwMDQyMH0sCisgICAgIC8vIyBiYW5rIDMKKyAgICAgezB4OThmMCwgIDB4MDE0MDAwMTgsICAweDAxYzAwMDE4fSwKKyAgICAgLy8jIGJhbmsgNAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDFhMSwgIDB4MDAwMDAxYTF9LAorICAgICB7MHg5OGU4LCAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDF9LAorICAgICAvLyMgYmFuayA1CisgICAgIHsweDk4YjAsICAweDAwMDAwMDEzLCAgMHgwMDAwMDAxM30sCisgICAgIHsweDk4ZTQsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMn0sCisgICAgIC8vIyBiYW5rIDYKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMDAsICAweDAwMDAwMDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMDAsICAweDAwMDAwMDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMDAsICAweDAwMDAwMDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMDAsICAweDAwMDAwMDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMDAsICAweDAwMDAwMDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDQwMDAsICAweDAwMDA0MDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDZjMDAsICAweDAwMDA2YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDJjMDAsICAweDAwMDAyYzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDQ4MDAsICAweDAwMDA0ODAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDQwMDAsICAweDAwMDA0MDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDYwMDAsICAweDAwMDA2MDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDEwMDAsICAweDAwMDAxMDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDQwMDAsICAweDAwMDA0MDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDdjMDAsICAweDAwMDA3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDdjMDAsICAweDAwMDA3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDdjMDAsICAweDAwMDA3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDdjMDAsICAweDAwMDA3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDdjMDAsICAweDAwMDA3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwODdjMDAsICAweDAwMDg3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDdjMDAsICAweDAwMDA3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDU0MDAsICAweDAwMDA1NDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDBjMDAsICAweDAwMDAwYzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDE4MDAsICAweDAwMDAxODAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDdjMDAsICAweDAwMDA3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDZjMDAsICAweDAwMDA2YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDZjMDAsICAweDAwMDA2YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDdjMDAsICAweDAwMDA3YzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDJjMDAsICAweDAwMDAyYzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDNjMDAsICAweDAwMDAzYzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDM4MDAsICAweDAwMDAzODAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDFjMDAsICAweDAwMDAxYzAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDA4MDAsICAweDAwMDAwODAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDA0MDgsICAweDAwMDAwNDA4fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDRjMTUsICAweDAwMDA0YzE1fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDQxODgsICAweDAwMDA0MTg4fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDIwMWUsICAweDAwMDAyMDFlfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMTA0MDgsICAweDAwMDEwNDA4fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDA4MDEsICAweDAwMDAwODAxfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDBjMDgsICAweDAwMDAwYzA4fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDE4MWUsICAweDAwMDAxODFlfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDEwMTYsICAweDAwMDAxMDE2fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDI4MDAsICAweDAwMDAyODAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDQwMTAsICAweDAwMDA0MDEwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDA4MWMsICAweDAwMDAwODFjfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAxMTUsICAweDAwMDAwMTE1fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMTUsICAweDAwMDAwMDE1fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwNjYsICAweDAwMDAwMDY2fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMWMsICAweDAwMDAwMDFjfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMDAsICAweDAwMDAwMDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMDQsICAweDAwMDAwMDA0fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMTUsICAweDAwMDAwMDE1fSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMWYsICAweDAwMDAwMDFmfSwKKyAgICAgezB4OThlMCwgIDB4MDAwMDAwMDAsICAweDAwMDAwNDAwfSwKKyAgICAgLy8jIGJhbmsgNworICAgICB7MHg5OGIwLCAgMHgwMDAwMDBhMCwgIDB4MDAwMDAwYTB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDA0MCwgIDB4MDAwMDAwNDB9LAorICAgICB7MHg5OGYwLCAgMHgwMDAwMDAxYywgIDB4MDAwMDAwMWN9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1YzFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2lvY3RsLmMKQEAgLTAsMCArMSwyOTEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBpb2N0bC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbiByZWxhdGVkIGZ1bmN0b25zLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInVzYmRydi5oIgorCisjZGVmaW5lIFpEX0lPQ1RMX1dQQQkJCSAgICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQorI2RlZmluZSBaRF9JT0NUTF9QQVJBTQkJCSAgICAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBaRF9JT0NUTF9HRVRXUEFJRQkJICAgIChTSU9DREVWUFJJVkFURSArIDMpCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fSU9DVExfQ0VOQyAgICAgICAgICAgICAgIChTSU9DREVWUFJJVkFURSArIDQpCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaRF9QQVJBTV9ST0FNSU5HCQkgICAgMHgwMDAxCisjZGVmaW5lIFpEX1BBUkFNX1BSSVZBQ1kJCSAgICAweDAwMDIKKyNkZWZpbmUgWkRfUEFSQU1fV1BBCQkJICAgIDB4MDAwMworI2RlZmluZSBaRF9QQVJBTV9DT1VOVEVSTUVBU1VSRVMJMHgwMDA0CisjZGVmaW5lIFpEX1BBUkFNX0RST1BVTkVOQ1JZUFRFRAkweDAwMDUKKyNkZWZpbmUgWkRfUEFSQU1fQVVUSF9BTEdTCQkgICAgMHgwMDA2CisjZGVmaW5lIFpEX1BBUkFNX1dQU19GSUxURVIJCSAgICAweDAwMDcKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFA4MDIxMV9QQUNLRVRfQ0VOQ0ZMQUcJCTB4MDAwMQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgUDgwMjExX1BBQ0tFVF9TRVRLRVkgICAgIAkweDAwMDMKKworI2RlZmluZSBaRF9DTURfU0VUX0VOQ1JZUFRfS0VZCQkweDAwMDEKKyNkZWZpbmUgWkRfQ01EX1NFVF9NTE1FCQkJICAgIDB4MDAwMgorI2RlZmluZSBaRF9DTURfU0NBTl9SRVEJCQkgICAgMHgwMDAzCisjZGVmaW5lIFpEX0NNRF9TRVRfR0VORVJJQ19FTEVNRU5UCTB4MDAwNAorI2RlZmluZSBaRF9DTURfR0VUX1RTQwkJCSAgICAweDAwMDUKKworI2RlZmluZSBaRF9DUllQVF9BTEdfTkFNRV9MRU4JCTE2CisjZGVmaW5lIFpEX01BWF9LRVlfU0laRQkJCSAgICAzMgorI2RlZmluZSBaRF9NQVhfR0VORVJJQ19TSVpFCQkgICAgNjQKKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCitleHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QqIGRldik7CisKK3N0YXRpYyBjb25zdCB1MzJfdCBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbXSA9Cit7CisvL0V2ZW4gZWxlbWVudCBmb3IgQ2hhbm5lbCBOdW1iZXIsIE9kZCBmb3IgRnJlcXVlbmN5CisgICAgMzYsNTE4MCwKKyAgICA0MCw1MjAwLAorICAgIDQ0LDUyMjAsCisgICAgNDgsNTI0MCwKKyAgICA1Miw1MjYwLAorICAgIDU2LDUyODAsCisgICAgNjAsNTMwMCwKKyAgICA2NCw1MzIwLAorICAgIDEwMCw1NTAwLAorICAgIDEwNCw1NTIwLAorICAgIDEwOCw1NTQwLAorICAgIDExMiw1NTYwLAorICAgIDExNiw1NTgwLAorICAgIDEyMCw1NjAwLAorICAgIDEyNCw1NjIwLAorICAgIDEyOCw1NjQwLAorICAgIDEzMiw1NjYwLAorICAgIDEzNiw1NjgwLAorICAgIDE0MCw1NzAwLAorLy8KKyAgICAxODQsNDkyMCwKKyAgICAxODgsNDk0MCwKKyAgICAxOTIsNDk2MCwKKyAgICAxOTYsNDk4MCwKKyAgICA4LDUwNDAsCisgICAgMTIsNTA2MCwKKyAgICAxNiw1MDgwLAorICAgIDM0LDUxNzAsCisgICAgMzgsNTE5MCwKKyAgICA0Miw1MjEwLAorICAgIDQ2LDUyMzAsCisvLworICAgIDE0OSw1NzQ1LAorICAgIDE1Myw1NzY1LAorICAgIDE1Nyw1Nzg1LAorICAgIDE2MSw1ODA1LAorICAgIDE2NSw1ODI1CisvLworfTsKKworaW50IHVzYmRydl9mcmVxMmNoYW4odTMyX3QgZnJlcSkKK3sKKyAgICAvKiAyLjRHIEh6ICovCisgICAgaWYgKGZyZXEgPiAyNDAwICYmIGZyZXEgPCAzMDAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoZnJlcS0yNDEyKS81KSArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHUxNl90IGlpOworICAgICAgICB1MTZfdCBudW1fY2hhbiA9IHNpemVvZihjaGFubmVsX2ZyZXF1ZW5jeV8xMUEpL3NpemVvZih1MzJfdCk7CisKKyAgICAgICAgZm9yKGlpID0gMTsgaWkgPCBudW1fY2hhbjsgaWkgKz0gMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoYW5uZWxfZnJlcXVlbmN5XzExQVtpaV0gPT0gZnJlcSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhbm5lbF9mcmVxdWVuY3lfMTFBW2lpLTFdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZfY2hhbjJmcmVxKGludCBjaGFuKQoreworICAgIGludCBmcmVxOworCisgICAgLyogSWYgY2hhbm5lbCBudW1iZXIgaXMgb3V0IG9mIHJhbmdlICovCisgICAgaWYgKGNoYW4gPiAxNjUgfHwgY2hhbiA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiAyLjRHIGJhbmQgKi8KKyAgICBpZiAoY2hhbiA+PSAxICYmIGNoYW4gPD0gMTMpCisgICAgeworICAgICAgICBmcmVxID0gKDI0MTIgKyAoY2hhbiAtIDEpICogNSk7CisgICAgICAgIHJldHVybiBmcmVxOworICAgIH0KKyAgICBlbHNlIGlmIChjaGFuID49IDM2ICYmIGNoYW4gPD0gMTY1KQorICAgIHsKKyAgICAgICAgdTE2X3QgaWk7CisgICAgICAgIHUxNl90IG51bV9jaGFuID0gc2l6ZW9mKGNoYW5uZWxfZnJlcXVlbmN5XzExQSkvc2l6ZW9mKHUzMl90KTsKKworICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IG51bV9jaGFuOyBpaSArPSAyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbF9mcmVxdWVuY3lfMTFBW2lpXSA9PSBjaGFuKQorICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbaWkrMV07CisgICAgICAgIH0KKworICAgICAgICAvKiBDYW4ndCBmaW5kIGRlc2lyZWQgZnJlcXVlbmN5ICovCisgICAgICAgIGlmIChpaSA9PSBudW1fY2hhbikKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIENhbid0IGZpbmQgZGVpc3JlZCBmcmVxdWVuY3kgKi8KKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCB1c2JkcnZfaW9jdGxfc2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpCit7CisjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisgICAgLy9zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgY2hhciBlc3NpZGJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKyAgICBpbnQgaTsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgbWVtc2V0KGVzc2lkYnVmLCAwLCBzaXplb2YoZXNzaWRidWYpKTsKKworICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2X2lvY3RsX3NldGVzc2lkXG4iKTsKKworICAgIC8vcHJpbnRrKCJzc2lkbGVuPSVkXG4iLCBlcnEtPmxlbmd0aCk7IC8vZm9yIGFueSwgaXQgaXMgMS4KKyAgICBpZiAoZXJxLT5mbGFncykgeworICAgICAgICBpZiAoZXJxLT5sZW5ndGggPiAoSVdfRVNTSURfTUFYX1NJWkUrMSkpCisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihlc3NpZGJ1ZiwgZXJxLT5wb2ludGVyLCBlcnEtPmxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICB9CisKKyAgICAvL3pkX0Rpc2Fzb2NBbGwoMik7CisgICAgLy93YWl0X21zKDEwMCk7CisKKyAgICBwcmludGsoS0VSTl9FUlIgImVzc2lkYnVmOiAiKTsKKworICAgIGZvcihpID0gMDsgaSA8IGVycS0+bGVuZ3RoOyBpKyspCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIiUwMnggIiwgZXNzaWRidWZbaV0pOworICAgIH0KKworICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgIGVzc2lkYnVmW2VycS0+bGVuZ3RoXSA9ICdcMCc7CisgICAgLy9tZW1jcHkobWFjcC0+d2Qud3Muc3NpZCwgZXNzaWRidWYsIGVycS0+bGVuZ3RoKTsKKyAgICAvL21hY3AtPndkLndzLnNzaWRMZW4gPSBzdHJsZW4oZXNzaWRidWYpKzI7CisgICAgLy9tYWNwLT53ZC53cy5zc2lkWzFdID0gc3RybGVuKGVzc2lkYnVmKTsgLy8gVXBkYXRlIHNzaWQgbGVuZ3RoCisKKyAgICB6ZmlXbGFuU2V0U1NJRChkZXYsIGVzc2lkYnVmLCBlcnEtPmxlbmd0aCk7CisjaWYgMAorICAgIHByaW50ayhLRVJOX0VSUiAibWFjcC0+d2Qud3Muc3NpZDogIik7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBtYWNwLT53ZC53cy5zc2lkTGVuOyBpKyspCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIiUwMnggIiwgbWFjcC0+d2Qud3Muc3NpZFtpXSk7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworI2VuZGlmCisgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZfaW9jdGxfZ2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpCit7CisgICAgIC8vc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgICB1OF90IGVzc2lkYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworICAgICB1OF90IGxlbjsKKyAgICAgdThfdCBpOworCisKKyAgICAgLy9sZW4gPSBtYWNwLT53ZC53cy5zc2lkTGVuOworICAgICAvL21lbWNweShlc3NpZGJ1ZiwgbWFjcC0+d2Qud3Muc3NpZCwgbWFjcC0+d2Qud3Muc3NpZExlbik7CisgICAgIHpmaVdsYW5RdWVyeVNTSUQoZGV2LCBlc3NpZGJ1ZiwgJmxlbik7CisKKyAgICAgZXNzaWRidWZbbGVuXSA9IDA7CisKKyAgICAgcHJpbnRrKEtFUk5fRVJSICJFU1NJRDogIik7CisKKyAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgIHsKKyAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJWMiLCBlc3NpZGJ1ZltpXSk7CisgICAgIH0KKworICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisKKyAgICAgZXJxLT5mbGFncz0gMTsKKyAgICAgZXJxLT5sZW5ndGggPSBzdHJsZW4oZXNzaWRidWYpICsgMTsKKworICAgICBpZiAoZXJxLT5wb2ludGVyKQorICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihlcnEtPnBvaW50ZXIsIGVzc2lkYnVmLCBlcnEtPmxlbmd0aCkpCisgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgcmV0dXJuIDA7Cit9CisKKworaW50IHVzYmRydl9pb2N0bF9zZXRydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCit7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisvKgorICogRW5jb2RlIGEgV1BBIG9yIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50IGFzIGEgY3VzdG9tCisgKiBlbGVtZW50IHVzaW5nIHRoZSBob3N0YXAgZm9ybWF0LgorICovCit1MzIgZW5jb2RlX2llKHZvaWQgKmJ1ZiwgdTMyIGJ1ZnNpemUsIGNvbnN0IHU4ICppZSwgdTMyIGllbGVuLCBjb25zdCB1OCAqbGVhZGVyLCB1MzIgbGVhZGVyX2xlbikKK3sKKyAgICB1OCAqcDsKKyAgICB1MzIgaTsKKworICAgIGlmIChidWZzaXplIDwgbGVhZGVyX2xlbikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcCA9IGJ1ZjsKKyAgICBtZW1jcHkocCwgbGVhZGVyLCBsZWFkZXJfbGVuKTsKKyAgICBidWZzaXplIC09IGxlYWRlcl9sZW47CisgICAgcCArPSBsZWFkZXJfbGVuOworICAgIGZvciAoaSA9IDA7IGkgPCBpZWxlbiAmJiBidWZzaXplID4gMjsgaSsrKQorICAgICAgICBwICs9IHNwcmludGYocCwgIiUwMngiLCBpZVtpXSk7CisgICAgcmV0dXJuIChpID09IGllbGVuID8gcCAtICh1OCAqKWJ1ZiA6IDApOworfQorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSVJFTEVTU19FWFQgPiAxNCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIHNjYW4gZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBjYXJkIHRvIGEgY2FyZCBpbmRlcGVuZGVudAorICogZm9ybWF0IHRoYXQgdGhlIFdpcmVsZXNzIFRvb2xzIHdpbGwgdW5kZXJzdGFuZAorICovCitjaGFyICp1c2JkcnZfdHJhbnNsYXRlX3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBjaGFyICpjdXJyZW50X2V2LAorICAgICAgICBjaGFyICplbmRfYnVmLCBzdHJ1Y3QgenNCc3NJbmZvICpsaXN0KQoreworICAgIHN0cnVjdCBpd19ldmVudCBpd2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYnVmZmVyICovCisgICAgdTE2X3QgY2FwYWJpbGl0aWVzOworICAgIGNoYXIgKmN1cnJlbnRfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgcmF0ZXMgKi8KKyAgICBjaGFyICpsYXN0X2V2OworICAgIGludCBpOworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisgICAgY2hhciAgICBidWZbNjQqMiArIDMwXTsKKyNlbmRpZgorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KKyAgICBpd2UuY21kID0gU0lPQ0dJV0FQOworICAgIGl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIG1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGxpc3QtPmJzc2lkLCBFVEhfQUxFTik7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KAorCWluZm8sCisJY3VycmVudF9ldiwKKwllbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogT3RoZXIgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgZ2l2ZSB0aGVtICovCisKKy8qIEFkZCB0aGUgRVNTSUQgKi8KKyAgICBpd2UudS5kYXRhLmxlbmd0aCA9IGxpc3QtPnNzaWRbMV07CisgICAgaWYoaXdlLnUuZGF0YS5sZW5ndGggPiAzMikKKyAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAzMjsKKyAgICBpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworICAgIGl3ZS51LmRhdGEuZmxhZ3MgPSAxOworICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludCgKKwlpbmZvLAorCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICZsaXN0LT5zc2lkWzJdKTsKKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBBZGQgbW9kZSAqLworICAgIGl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKyAgICBjYXBhYmlsaXRpZXMgPSAobGlzdC0+Y2FwYWJpbGl0eVsxXSA8PCA4KSArIGxpc3QtPmNhcGFiaWxpdHlbMF07CisgICAgaWYoY2FwYWJpbGl0aWVzICYgKDB4MDEgfCAweDAyKSkKKyAgICB7CisgICAgICAgIGlmKGNhcGFiaWxpdGllcyAmIDB4MDEpCisgICAgICAgICAgICBpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgICAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoCisJCWluZm8sCisJCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKyAgICB9CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogQWRkIGZyZXF1ZW5jeSAqLworICAgIGl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKyAgICBpd2UudS5mcmVxLm0gPSBsaXN0LT5jaGFubmVsOworLyogQ2hhbm5lbCBmcmVxdWVuY3kgaW4gS0h6ICovCisgICAgaWYgKGl3ZS51LmZyZXEubSA+IDE0KQorICAgIHsKKyAgICAgICAgaWYgKCgxODQgPD0gaXdlLnUuZnJlcS5tKSAmJiAoaXdlLnUuZnJlcS5tPD0xOTYpKQorICAgICAgICAgICAgICBpd2UudS5mcmVxLm0gPSA0MDAwICsgaXdlLnUuZnJlcS5tICogNTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpd2UudS5mcmVxLm0gPSA1MDAwICsgaXdlLnUuZnJlcS5tICogNTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGl3ZS51LmZyZXEubSA9PSAxNCkKKyAgICAgICAgICAgICAgaXdlLnUuZnJlcS5tID0gMjQ4NDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpd2UudS5mcmVxLm0gPSAyNDEyICsgKGl3ZS51LmZyZXEubSAtIDEpICogNTsKKyAgICB9CisgICAgaXdlLnUuZnJlcS5lID0gNjsKKyAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoCisJaW5mbywKKyAgICAJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKyAgICBpd2UuY21kID0gSVdFVlFVQUw7CisjaWYgV0lSRUxFU1NfRVhUID4gMTgKKyAgICBpd2UudS5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfVVBEQVRFRCB8IElXX1FVQUxfTEVWRUxfVVBEQVRFRAorICAgICAgICAgICAgICAgICAgICAgICAgfElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKKyNlbmRpZgorICAgIGl3ZS51LnF1YWwubGV2ZWwgPSBsaXN0LT5zaWduYWxTdHJlbmd0aDsKKyAgICBpd2UudS5xdWFsLm5vaXNlID0gMDsKKyAgICBpd2UudS5xdWFsLnF1YWwgPSBsaXN0LT5zaWduYWxRdWFsaXR5OworICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudCgKKwlpbmZvLAorCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisKKyAgICBpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKyAgICBpZihjYXBhYmlsaXRpZXMgJiAweDEwKQorICAgICAgICBpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisgICAgZWxzZQorICAgICAgICBpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCisgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAwOworICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludCgKKwlpbmZvLAorCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGxpc3QtPnNzaWQpOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIFJhdGUgOiBzdHVmZmluZyBtdWx0aXBsZSB2YWx1ZXMgaW4gYSBzaW5nbGUgZXZlbnQgcmVxdWlyZSBhIGJpdAorICogbW9yZSBvZiBtYWdpYyAqLworICAgIGN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKyAgICBpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisvKiBUaG9zZSB0d28gZmxhZ3MgYXJlIGlnbm9yZWQuLi4gKi8KKyAgICBpd2UudS5iaXRyYXRlLmZpeGVkID0gaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisKKyAgICBmb3IoaSA9IDAgOyBpIDwgbGlzdC0+c3VwcG9ydGVkUmF0ZXNbMV0gOyBpKyspCisgICAgeworLyogQml0IHJhdGUgZ2l2ZW4gaW4gNTAwIGtiL3MgdW5pdHMgKCsgMHg4MCkgKi8KKyAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICgobGlzdC0+c3VwcG9ydGVkUmF0ZXNbaSsyXSAmIDB4N2YpICogNTAwMDAwKTsKKy8qIEFkZCBuZXcgdmFsdWUgdG8gZXZlbnQgKi8KKyAgICAgICAgY3VycmVudF92YWwgPSBpd2Vfc3RyZWFtX2FkZF92YWx1ZSgKKwkJaW5mbywKKwkJY3VycmVudF9ldiwgY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisKKyAgICAgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICAgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF92YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgICAgICB9CisKKyAgICAgICAgbGFzdF9ldiA9IGN1cnJlbnRfdmFsOworICAgIH0KKworICAgIGZvciAoaSA9IDAgOyBpIDwgbGlzdC0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gOyBpKyspCisgICAgeworLyogQml0IHJhdGUgZ2l2ZW4gaW4gNTAwIGtiL3MgdW5pdHMgKCsgMHg4MCkgKi8KKyAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICgobGlzdC0+ZXh0U3VwcG9ydGVkUmF0ZXNbaSsyXSAmIDB4N2YpICogNTAwMDAwKTsKKy8qIEFkZCBuZXcgdmFsdWUgdG8gZXZlbnQgKi8KKyAgICAgICAgY3VycmVudF92YWwgPSBpd2Vfc3RyZWFtX2FkZF92YWx1ZSgKKwkJaW5mbywKKwkJY3VycmVudF9ldiwgY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisKKyAgICAgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICAgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF92YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgICAgICB9CisKKyAgICAgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisgICAgfQorCisvKiBDaGVjayBpZiB3ZSBhZGRlZCBhbnkgZXZlbnQgKi8KKyAgICBpZigoY3VycmVudF92YWwgLSBjdXJyZW50X2V2KSA+IElXX0VWX0xDUF9MRU4pCisgICAgICAgIGN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKyNpZiBXSVJFTEVTU19FWFQgPiAxNAorI2RlZmluZSBJRUVFODAyMTFfRUxFTUlEX1JTTiAweDMwCisgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICBpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiYmNuX2ludD0lZCIsIChsaXN0LT5iZWFjb25JbnRlcnZhbFsxXSA8PCA4KSArIGxpc3QtPmJlYWNvbkludGVydmFsWzBdKTsKKyAgICBpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludCgKKwkJaW5mbywKKwkJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgYnVmKTsKKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisgICAgaWYgKGxpc3QtPndwYUllWzFdICE9IDApCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByc25fbGVhZGVyW10gPSAicnNuX2llPSI7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHdwYV9sZWFkZXJbXSA9ICJ3cGFfaWU9IjsKKworICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgICAgICBpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgaWYgKGxpc3QtPndwYUllWzBdID09IElFRUU4MDIxMV9FTEVNSURfUlNOKQorICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBlbmNvZGVfaWUoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICBsaXN0LT53cGFJZSwgbGlzdC0+d3BhSWVbMV0rMiwKKyAgICAgICAgICAgICAgICByc25fbGVhZGVyLCBzaXplb2YocnNuX2xlYWRlciktMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gZW5jb2RlX2llKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgbGlzdC0+d3BhSWUsIGxpc3QtPndwYUllWzFdKzIsCisgICAgICAgICAgICAgICAgd3BhX2xlYWRlciwgc2l6ZW9mKHdwYV9sZWFkZXIpLTEpOworCisgICAgICAgIGlmIChpd2UudS5kYXRhLmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCQlpbmZvLAorCQljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBidWYpOworCisgICAgICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgICAgICB9CisKKyAgICAgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisgICAgfQorICAgIGlmIChsaXN0LT5yc25JZVsxXSAhPSAwKQorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcnNuX2xlYWRlcltdID0gInJzbl9pZT0iOworICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgICAgICBpd2UuY21kID0gSVdFVkNVU1RPTTsKKworICAgICAgICBpZiAobGlzdC0+cnNuSWVbMF0gPT0gSUVFRTgwMjExX0VMRU1JRF9SU04pCisgICAgICAgIHsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gZW5jb2RlX2llKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgbGlzdC0+cnNuSWUsIGxpc3QtPnJzbkllWzFdKzIsCisgICAgICAgICAgICAgICAgcnNuX2xlYWRlciwgc2l6ZW9mKHJzbl9sZWFkZXIpLTEpOworICAgICAgICAgICAgaWYgKGl3ZS51LmRhdGEubGVuZ3RoICE9IDApCisgICAgICAgICAgICAgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCQkJaW5mbywKKwkJCWN1cnJlbnRfZXYsIGVuZF9idWYsICAmaXdlLCBidWYpOworCisgICAgICAgICAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKy8qIFRoZSBvdGhlciBkYXRhIGluIHRoZSBzY2FuIHJlc3VsdCBhcmUgbm90IHJlYWxseQorICogaW50ZXJlc3RpbmcsIHNvIGZvciBub3cgZHJvcCBpdCAqLworICAgIHJldHVybiBjdXJyZW50X2V2OworfQorCitpbnQgdXNiZHJ2d2V4dF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICAvL3N0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIHN0cmNweSh3cnEtPm5hbWUsICJJRUVFIDgwMi4xMS1NSU1PIik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKyAgICB1MzJfdCBGcmVxS0h6OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGZyZXEtPmUgPiAxKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChmcmVxLT5lID09IDEpCisgICAgeworICAgICAgICBGcmVxS0h6ID0gKGZyZXEtPm0gLyAxMDAwMDApOworCisgICAgICAgIGlmIChGcmVxS0h6ID4gNDAwMDAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEZyZXFLSHogPiA1ODI1MDAwKQorICAgICAgICAgICAgICAgIEZyZXFLSHogPSA1ODI1MDAwOworICAgICAgICAgICAgZWxzZSBpZiAoRnJlcUtIeiA8IDQ5MjAwMDApCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9IDQ5MjAwMDA7CisgICAgICAgICAgICBlbHNlIGlmIChGcmVxS0h6IDwgNTAwMDAwMCkKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gKCgoRnJlcUtIeiAtIDQwMDAwMDApIC8gNTAwMCkgKiA1MDAwKSArIDQwMDAwMDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9ICgoKEZyZXFLSHogLSA1MDAwMDAwKSAvIDUwMDApICogNTAwMCkgKyA1MDAwMDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEZyZXFLSHogPiAyNDg0MDAwKQorICAgICAgICAgICAgICAgIEZyZXFLSHogPSAyNDg0MDAwOworICAgICAgICAgICAgZWxzZSBpZiAoRnJlcUtIeiA8IDI0MTIwMDApCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9IDI0MTIwMDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9ICgoKEZyZXFLSHogLSAyNDEyMDAwKSAvIDUwMDApICogNTAwMCkgKyAyNDEyMDAwOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRnJlcUtIeiA9IHVzYmRydl9jaGFuMmZyZXEoZnJlcS0+bSk7CisKKyAgICAgICAgaWYgKEZyZXFLSHogIT0gLTEpCisgICAgICAgICAgICBGcmVxS0h6ICo9IDEwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEZyZXFLSHogPSAyNDEyMDAwOworICAgIH0KKworICAgIC8vcHJpbnRrKCJmcmVxLT5tOiAlZCwgZnJlcS0+ZTogJWRcbiIsIGZyZXEtPm0sIGZyZXEtPmUpOworICAgIC8vcHJpbnRrKCJGcmVxS0h6OiAlZFxuIiwgRnJlcUtIeik7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkID09IDEpCisgICAgeworICAgICAgICB6ZmlXbGFuU2V0RnJlcXVlbmN5KGRldiwgRnJlcUtIeiwgMCk7IC8vIEltbWVkaWF0ZQorICAgICAgICAvL3U4X3Qgd3BhaWVMZW4sd3BhaWVbNTBdOworICAgICAgICAvL3pmaVdsYW5RdWVyeVdwYUllKGRldiwgd3BhaWUsICZ3cGFpZUxlbik7CisgICAgICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisgICAgICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgLy9pZiAod3BhaWVMZW4gPiAyKQorICAgICAgICAvLyAgICB6ZmlXbGFuU2V0V3BhSWUoZGV2LCB3cGFpZSwgd3BhaWVMZW4pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmcmVxLT5tID0gemZpV2xhblF1ZXJ5RnJlcXVlbmN5KGRldik7CisgICAgZnJlcS0+ZSA9IDM7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QgV2xhbk1vZGU7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2god3JxLT5tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBJV19NT0RFX01BU1RFUjoKKyAgICAgICAgICAgIFdsYW5Nb2RlID0gWk1fTU9ERV9BUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX01PREVfSU5GUkE6CisgICAgICAgICAgICBXbGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJV19NT0RFX0FESE9DOgorICAgICAgICAgICAgV2xhbk1vZGUgPSBaTV9NT0RFX0lCU1M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFdsYW5Nb2RlID0gWk1fTU9ERV9JQlNTOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgemZpV2xhblNldFdsYW5Nb2RlKGRldixXbGFuTW9kZSk7CisgICAgemZpV2xhbkRpc2FibGUoZGV2LCAxKTsKKyAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgc3dpdGNoKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikpCisgICAgeworICAgICAgICBjYXNlIFpNX01PREVfQVA6CisgICAgICAgICAgICAqbW9kZSA9IElXX01PREVfTUFTVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fTU9ERV9JTkZSQVNUUlVDVFVSRToKKyAgICAgICAgICAgICptb2RlID0gSVdfTU9ERV9JTkZSQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX01PREVfSUJTUzoKKyAgICAgICAgICAgICptb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqc2VucywgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnNlbnMsIGNoYXIgKmV4dHJhKQoreworCXNlbnMtPnZhbHVlID0gMDsKKwlzZW5zLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworICAgIGludCBpLCB2YWw7CisgICAgLy9pbnQgbnVtX2JhbmRfYTsKKyAgICB1MTZfdCBjaGFubmVsc1s2MF07CisgICAgdTE2X3QgY2hhbm5lbF9udW07CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDkKKyAgICByYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworLy8gWFhYIHdoYXQgYWJvdXQgbWluL21heF9wbXAsIG1pbi9tYXhfcG10LCBldGMuCisjZW5kaWYKKworI2lmIFdJUkVMRVNTX0VYVCA+IDEwCisgICAgcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisgICAgcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTM7CisKKyAgICByYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworICAgIHJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworICAgIHJhbmdlLT5taW5fcmV0cnkgPSAwOworICAgIHJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7CisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lSRUxFU1NfRVhUID4gMTAgKi8KKworICAgIGNoYW5uZWxfbnVtID0gemZpV2xhblF1ZXJ5QWxsb3dDaGFubmVscyhkZXYsIGNoYW5uZWxzKTsKKworICAgIC8qIEd1cmFudGVlIHJlcG9ydGVkIGNoYW5uZWwgbnVtYmVycyBpcyBsZXNzIG9yIGVxdWFsIHRvIElXX01BWF9GUkVRVUVOQ0lFUyAqLworICAgIGlmIChjaGFubmVsX251bSA+IElXX01BWF9GUkVRVUVOQ0lFUykKKyAgICAgICAgY2hhbm5lbF9udW0gPSBJV19NQVhfRlJFUVVFTkNJRVM7CisKKyAgICB2YWwgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxfbnVtOyBpKyspCisgICAgeworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmkgPSB1c2JkcnZfZnJlcTJjaGFuKGNoYW5uZWxzW2ldKTsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5tID0gY2hhbm5lbHNbaV07CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uZSA9IDY7CisgICAgICAgIHZhbCsrOworICAgIH0KKworICAgIHJhbmdlLT5udW1fY2hhbm5lbHMgPSBjaGFubmVsX251bTsKKyAgICByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IGNoYW5uZWxfbnVtOworCisjaWYgMAorICAgIHJhbmdlLT5udW1fY2hhbm5lbHMgPSAxNDsgLy8gT25seSAyLjRHCisKKy8qIFhYWCBuZWVkIHRvIGZpbHRlciBhZ2FpbnN0IHRoZSByZWd1bGF0b3J5IGRvbWFpbiAmfCBhY3RpdmUgc2V0ICovCisgICAgdmFsID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDE0OyBpKyspIC8vIEIsRyBCYW5kcworICAgIHsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5pID0gaTsKKyAgICAgICAgaWYgKGkgPT0gMTQpCisgICAgICAgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0ubSA9IDI0ODQwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5tID0gKDI0MTIrKGktMSkqNSkqMTAwMDsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5lID0gMzsKKyAgICAgICAgdmFsKys7CisgICAgfQorCisgICAgbnVtX2JhbmRfYSA9IChJV19NQVhfRlJFUVVFTkNJRVMgLSB2YWwpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9iYW5kX2E7IGkrKykgLy8gQSBCYW5kcworICAgIHsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5pID0gY2hhbm5lbF9mcmVxdWVuY3lfMTFBWzIgKiBpXTsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5tID0gY2hhbm5lbF9mcmVxdWVuY3lfMTFBWzIgKiBpICsgMV0gKiAxMDAwOworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmUgPSAzOworICAgICAgICB2YWwrKzsKKyAgICB9CisgICAgLy8gTUlNTyBSYXRlIE5vdCBEZWZpbmVkIE5vdworICAgIC8vRm9yIDgwMi4xMWEsIHRoZXJlIGFyZSB0b28gbW9yZSBmcmVxdWVuY3kuIFdlIGNhbid0IHJldHVybiB0aGVtIGFsbAorICAgIHJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworI2VuZGlmCisKKy8qIE1heCBvZiAvcHJvYy9uZXQvd2lyZWxlc3MgKi8KKyAgICByYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLy8/PyAgICAgICAgICAgICAgICAgIC8vOTI7CisgICAgcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMTU0OyAvLz8/CisgICAgcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMTU0OyAvLz8/CisgICAgcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMzsgLy8/PworCisvLyBYWFggdGhlc2UgbmVlZCB0byBiZSBuc2Qtc3BlY2lmaWMhCisgICAgcmFuZ2UtPm1pbl9ydHMgPSAwOworICAgIHJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKyAgICByYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisgICAgcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKKyAgICByYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDQvKk5VTV9XRVBLRVlTKi87IC8vPz8KKyAgICByYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsgLy8/PworCisgICAgcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OyAvLz8/ICAgICAgICAgICAgICAgLy9XRVAgS2V5IEVuY29kaW5nIFNpemUKKyAgICByYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOy8vPz8KKworLy8gWFhYIHdoYXQgYWJvdXQgbnVtX2JpdHJhdGVzL3Rocm91Z2hwdXQ/CisgICAgcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDA7IC8vPz8KKworLyogZXN0aW1hdGVkIG1heCB0aHJvdWdocHV0ICovCisvLyBYWFggbmVlZCB0byBjYXAgaXQgaWYgd2UncmUgcnVubmluZyBhdCB+Mk1icHMuLgorCisgICAgcmFuZ2UtPnRocm91Z2hwdXQgPSAzMDAwMDAwMDA7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IHNvY2thZGRyICpNYWNBZGRyLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICAgICAgemZpV2xhblNldE1hY0FkZHJlc3MoZGV2LCh1MTZfdCAqKSZNYWNBZGRyLT5zYV9kYXRhWzBdKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TVEEgTW9kZQorICAgICAgICB6ZmlXbGFuU2V0QnNzaWQoZGV2LCZNYWNBZGRyLT5zYV9kYXRhWzBdKTsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICB7CisgICAgICAgIC8vdThfdCB3cGFpZUxlbix3cGFpZVs4MF07CisgICAgICAgIC8vemZpV2xhblF1ZXJ5V3BhSWUoZGV2LCB3cGFpZSwgJndwYWllTGVuKTsKKyAgICAgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAvL2lmICh3cGFpZUxlbiA+IDIpCisgICAgICAgIC8vICAgIHpmaVdsYW5TZXRXcGFJZShkZXYsIHdwYWllLCB3cGFpZUxlbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyICpNYWNBZGRyLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgICAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzKGRldiwgJk1hY0FkZHItPnNhX2RhdGFbMF0pOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NUQSBNb2RlCisgICAgeworICAgICAgICBpZiAobWFjcC0+YWRhcHRlclN0YXRlID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQorICAgICAgICB7CisgICAgICAgICAgICB6ZmlXbGFuUXVlcnlCc3NpZChkZXYsICZNYWNBZGRyLT5zYV9kYXRhWzBdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgemVyb19hZGRyWzZdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisgICAgICAgICAgICBtZW1jcHkoJk1hY0FkZHItPnNhX2RhdGFbMF0sIHplcm9fYWRkciwgc2l6ZW9mKHplcm9fYWRkcikpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2l3YXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAgICAvL0Rvbid0IGtub3cgaG93IHRvIGRvIHlldC0tQ1dZYW5nKCspCisgICAgcmV0dXJuIDA7CisKK30KKworaW50IHVzYmRydndleHRfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBwcmludGsoIkNXWSAtIHVzYmRydndleHRfc2l3c2NhblxuIik7CisKKyAgICB6ZmlXbGFuU2NhbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICBjaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7CisgICAgY2hhciAqZW5kX2J1ZjsKKyAgICBpbnQgaTsKKyAgICAvL3N0cnVjdCB6c0Jzc0xpc3QgQnNzTGlzdDsKKyAgICBzdHJ1Y3QgenNCc3NMaXN0VjEgKnBCc3NMaXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHpzQnNzTGlzdFYxKSwgR0ZQX0tFUk5FTCk7CisgICAgLy9Cc3NMaXN0ID0gd2QtPnN0YS5wQnNzTGlzdDsKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoZGF0YS0+bGVuZ3RoID09IDApCisgICAgeworICAgICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIGRhdGEtPmxlbmd0aDsKKyAgICB9CisKKyAgICBwcmludGsoImdpd3NjYW4gLSBSZXBvcnQgU2NhbiBSZXN1bHRzXG4iKTsKKyAgICAvL3ByaW50aygiZ2l3c2NhbiAtIEJzc0xpc3QgU3JldWN0dXJlIExlbiA6ICVkXG4iLCBzaXplb2YoQnNzTGlzdCkpOworICAgIC8vcHJpbnRrKCJnaXdzY2FuIC0gQnNzTGlzdCBDb3VudCA6ICVkXG4iLCB3ZC0+c3RhLnBCc3NMaXN0LT5ic3NDb3VudCk7CisgICAgLy9wcmludGsoImdpd3NjYW4gLSBVcGRhdGVCc3NMaXN0IENvdW50IDogJWRcbiIsIHdkLT5zdGEucFVwZGF0ZUJzc0xpc3QtPmJzc0NvdW50KTsKKyAgICB6ZmlXbGFuUXVlcnlCc3NMaXN0VjEoZGV2LCBwQnNzTGlzdCk7CisgICAgLy96ZmlXbGFuUXVlcnlCc3NMaXN0KGRldiwgJkJzc0xpc3QpOworCisvKiBSZWFkIGFuZCBwYXJzZSBhbGwgZW50cmllcyAqLworICAgIHByaW50aygiZ2l3c2NhbiAtIHBCc3NMaXN0LT5ic3NDb3VudCA6ICVkXG4iLCBwQnNzTGlzdC0+YnNzQ291bnQpOworICAgIC8vcHJpbnRrKCJnaXdzY2FuIC0gQnNzTGlzdC5ic3NDb3VudCA6ICVkXG4iLCBCc3NMaXN0LmJzc0NvdW50KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwQnNzTGlzdC0+YnNzQ291bnQ7IGkrKykKKyAgICB7CisvKiBUcmFuc2xhdGUgdG8gV0UgZm9ybWF0IHRoaXMgZW50cnkgKi8KKyAgICAgICAgLy9jdXJyZW50X2V2ID0gdXNiZHJ2X3RyYW5zbGF0ZV9zY2FuKGRldiwgaW5mbywgY3VycmVudF9ldiwKKyAgICAgICAgLy8gICAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCAmcEJzc0xpc3QtPmJzc0luZm9baV0pOworICAgICAgICBjdXJyZW50X2V2ID0gdXNiZHJ2X3RyYW5zbGF0ZV9zY2FuKGRldiwgaW5mbywgY3VycmVudF9ldiwKKyAgICAgICAgICAgIGVuZF9idWYsICZwQnNzTGlzdC0+YnNzSW5mb1tpXSk7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNgorICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBlbmRfYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBrZnJlZShwQnNzTGlzdCk7CisgICAgICAgICAgICBkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKy8qIExlbmd0aCBvZiBkYXRhICovCisgICAgZGF0YS0+bGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7CisgICAgZGF0YS0+ZmxhZ3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvZG8gKi8KKworICAgIGtmcmVlKHBCc3NMaXN0KTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXNzaWQsIGNoYXIgKmV4dHJhKQoreworICAgIGNoYXIgRXNzaWRCdWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoZXNzaWQtPmZsYWdzID09IDEpCisgICAgeworICAgICAgICBpZiAoZXNzaWQtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSsxKSkKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZFc3NpZEJ1ZiwgZXNzaWQtPnBvaW50ZXIsIGVzc2lkLT5sZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgRXNzaWRCdWZbZXNzaWQtPmxlbmd0aF0gPSAnXDAnOworICAgICAgICAvL3ByaW50aygic2l3ZXNzaWQgLSBTZXQgRXNzaWQgOiAlc1xuIixFc3NpZEJ1Zik7CisgICAgICAgIC8vcHJpbnRrKCJzaXdlc3NpZCAtIEVzc2lkIExlbiA6ICVkXG4iLGVzc2lkLT5sZW5ndGgpOworICAgICAgICAvL3ByaW50aygic2l3ZXNzaWQgLSBFc3NpZCBGbGFnIDogJXhcbiIsZXNzaWQtPmZsYWdzKTsKKyAgICAgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB6ZmlXbGFuU2V0U1NJRChkZXYsIEVzc2lkQnVmLCBzdHJsZW4oRXNzaWRCdWYpKTsKKyAgICAgICAgICAgIHpmaVdsYW5TZXRGcmVxdWVuY3koZGV2LCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3koZGV2KSwgRkFMU0UpOworICAgICAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIHpmaVdsYW5RdWVyeUVuY3J5TW9kZShkZXYpKTsKKyAgICAgICAgICAgIC8vdThfdCB3cGFpZUxlbix3cGFpZVs1MF07CisgICAgICAgICAgICAvL3pmaVdsYW5RdWVyeVdwYUllKGRldiwgd3BhaWUsICZ3cGFpZUxlbik7CisgICAgICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAgICAgLy9pZiAod3BhaWVMZW4gPiAyKQorICAgICAgICAgICAgLy8gICAgemZpV2xhblNldFdwYUllKGRldiwgd3BhaWUsIHdwYWllTGVuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXNzaWQsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1OF90IEVzc2lkTGVuOworICAgIGNoYXIgRXNzaWRCdWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisgICAgaW50IHNzaWRfbGVuOworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgemZpV2xhblF1ZXJ5U1NJRChkZXYsICZFc3NpZEJ1ZlswXSwgJkVzc2lkTGVuKTsKKworICAgIC8qIENvbnZlcnQgdHlwZSBmcm9tIHVuc2lnbmVkIGNoYXIgdG8gY2hhciAqLworICAgIHNzaWRfbGVuID0gKGludClFc3NpZExlbjsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgZXNzaWQgbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gSVdfRVNTSURfTUFYX1NJWkUgKi8KKyAgICBpZiAoc3NpZF9sZW4gPiBJV19FU1NJRF9NQVhfU0laRSkKKyAgICAgICAgc3NpZF9sZW4gPSBJV19FU1NJRF9NQVhfU0laRTsKKworICAgIEVzc2lkQnVmW3NzaWRfbGVuXSA9ICdcMCc7CisKKyAgICBlc3NpZC0+ZmxhZ3MgPSAxOworICAgIGVzc2lkLT5sZW5ndGggPSBzdHJsZW4oRXNzaWRCdWYpOworCisgICAgbWVtY3B5KGV4dHJhLCBFc3NpZEJ1ZiwgZXNzaWQtPmxlbmd0aCk7CisgICAgLy8gd2lyZWxlc3MuYyBpbiBLZXJuZWwgd291bGQgaGFuZGxlIGNvcHlfdG9fdXNlciAtLSBsaW5lIDY3OQorICAgIC8qaWYgKGVzc2lkLT5wb2ludGVyKQorICAgIHsKKyAgICAgICAgaWYgKCBjb3B5X3RvX3VzZXIoZXNzaWQtPnBvaW50ZXIsIEVzc2lkQnVmLCBlc3NpZC0+bGVuZ3RoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiZ2l3ZXNzaWQgLSBjb3B5X3RvX3VzZXIgRmFpbFxuIik7CisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgfQorICAgIH0qLworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKyAgICAvL0V4aXN0IGJ1dCBqdW5rLS1DV1lhbmcoKykKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1OF90IEVzc2lkTGVuOworICAgIGNoYXIgRXNzaWRCdWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgemZpV2xhblF1ZXJ5U1NJRChkZXYsICZFc3NpZEJ1ZlswXSwgJkVzc2lkTGVuKTsKKyAgICBFc3NpZEJ1ZltFc3NpZExlbl0gPSAwOworCisgICAgZGF0YS0+ZmxhZ3MgPSAxOworICAgIGRhdGEtPmxlbmd0aCA9IHN0cmxlbihFc3NpZEJ1Zik7CisKKyAgICBtZW1jcHkobmlja25hbWUsIEVzc2lkQnVmLCBkYXRhLT5sZW5ndGgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIC8vQXJyYXkgdG8gRGVmaW5lIFJhdGUgTnVtYmVyIHRoYXQgU2VuZCB0byBEcml2ZXIKKyAgICB1MTZfdCB6Y0luZGV4dG9SYXRlQkdbMTZdID0gezEwMDAsIDIwMDAsIDU1MDAsIDExMDAwLCAwLCAwLCAwLCAwLCA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwgMTIwMDAsIDYwMDAsIDU0MDAwLCAzNjAwMCwgMTgwMDAsIDkwMDB9OworICAgIHUxNl90IHpjUmF0ZVRvTUNTW10gPSB7MHhmZiwgMCwgMSwgMiwgMywgMHhiLCAweGYsIDB4YSwgMHhlLCAweDksIDB4ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OCwgMHhjfTsKKyAgICB1OF90IGksUmF0ZUluZGV4ID0gNDsKKyAgICB1MTZfdCBSYXRlS2JwczsKKworICAgIC8vcHJpbnRrKCJmcnEtPmRpc2FibGVkIDogMHgleFxuIixmcnEtPmRpc2FibGVkKTsKKyAgICAvL3ByaW50aygiZnJxLT52YWx1ZSA6IDB4JXhcbiIsZnJxLT52YWx1ZSk7CisKKyAgICBSYXRlS2JwcyA9IGZycS0+dmFsdWUgLyAxMDAwOworICAgIC8vcHJpbnRrKCJSYXRlS2JwcyA6ICVkXG4iLCBSYXRlS2Jwcyk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBpZiAoUmF0ZUticHMgPT0gemNJbmRleHRvUmF0ZUJHW2ldKQorICAgICAgICAgICAgUmF0ZUluZGV4ID0gaTsKKyAgICB9CisgICAgaWYgKHpjSW5kZXh0b1JhdGVCR1tSYXRlSW5kZXhdID09IDApCisgICAgICAgIFJhdGVJbmRleCA9IDB4ZmY7CisgICAgLy9wcmludGsoIlJhdGVJbmRleCA6ICV4XG4iLCBSYXRlSW5kZXgpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorICAgICAgICBpZiAoUmF0ZUluZGV4ID09IHpjUmF0ZVRvTUNTW2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgLy9wcmludGsoIkluZGV4IDogJXhcbiIsIGkpOworICAgIGlmIChSYXRlS2JwcyA9PSA2NTAwMCkKKyAgICB7CisgICAgICAgIFJhdGVJbmRleCA9IDIwOworICAgICAgICBwcmludGsoIlJhdGVJbmRleCA6ICVkXG4iLCBSYXRlSW5kZXgpOworICAgIH0KKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkID09IDEpCisgICAgeworICAgICAgICB6ZmlXbGFuU2V0VHhSYXRlKGRldiwgaSk7CisgICAgICAgIC8vemZpV2xhbkRpc2FibGUoZGV2KTsKKyAgICAgICAgLy96ZmlXbGFuRW5hYmxlKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgZnJxLT5maXhlZCA9IDA7CisgICAgZnJxLT5kaXNhYmxlZCA9IDA7CisgICAgZnJxLT52YWx1ZSA9IHpmaVdsYW5RdWVyeVJ4UmF0ZShkZXYpICogMTAwMDsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIGludCB2YWwgPSBydHMtPnZhbHVlOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChydHMtPmRpc2FibGVkKQorICAgICAgICB2YWwgPSAyMzQ3OworCisgICAgaWYgKCh2YWwgPCAwKSB8fCAodmFsID4gMjM0NykpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgemZpV2xhblNldFJ0c1RocmVzaG9sZChkZXYsdmFsKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgcnRzLT52YWx1ZSA9IHpmaVdsYW5RdWVyeVJ0c1RocmVzaG9sZChkZXYpOworICAgIHJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA+PSAyMzQ3KTsKKyAgICBydHMtPmZpeGVkID0gMTsKKworICAgIHJldHVybiAwOworCit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBmcmFnVGhyZXNob2xkOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChmcmFnLT5kaXNhYmxlZCkKKyAgICAgICAgZnJhZ1RocmVzaG9sZCA9IDA7CisgICAgZWxzZQorICAgICAgICBmcmFnVGhyZXNob2xkID0gZnJhZy0+dmFsdWU7CisKKyAgICB6ZmlXbGFuU2V0RnJhZ1RocmVzaG9sZChkZXYsZnJhZ1RocmVzaG9sZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNiB2YWw7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgdmFsID0gemZpV2xhblF1ZXJ5RnJhZ1RocmVzaG9sZChkZXYpOworCisgICAgZnJhZy0+dmFsdWUgPSB2YWw7CisKKyAgICBmcmFnLT5kaXNhYmxlZCA9ICh2YWwgPj0gMjM0Nik7CisgICAgZnJhZy0+Zml4ZWQgPSAxOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3dHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisgICAgLy9Ob3Qgc3VwcG9ydCB5ZXQtLUNXWW5nKCspCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vTm90IHN1cHBvcnQgeWV0LS1DV1luZygrKQorCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICAvL0RvIG5vdGhpbmctLUNXWWFuZygrKQorCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICAvL0RvIG5vdGhpbmctLUNXWWFuZygrKQorCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICBpbnQgaSwgV2VwU3RhdGUgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICgoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgPT0gMCkKKyAgICB7CisgICAgICAgIGtleUluZm8ua2V5ID0ga2V5OworICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IGVycS0+bGVuZ3RoOworICAgICAgICBrZXlJbmZvLmtleUluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAgICAgaWYgKGtleUluZm8ua2V5SW5kZXggPj0gNCkKKyAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXggPSAwOworICAgICAgICBrZXlJbmZvLmZsYWcgPSBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWTsKKworICAgICAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisgICAgICAgIFdlcFN0YXRlID0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHpmaVdsYW5SZW1vdmVLZXkoZGV2LCAwLCBpKTsKKyAgICAgICAgV2VwU3RhdGUgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgLy96ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fTk9fV0VQKTsKKyAgICB9CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkID09IDEpCisgICAgeworICAgICAgICB6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgV2VwU3RhdGUpOworICAgICAgICB6ZmlXbGFuU2V0RnJlcXVlbmN5KGRldiwgemZpV2xhblF1ZXJ5RnJlcXVlbmN5KGRldiksIEZBTFNFKTsKKyAgICAgICAgLy96ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgemZpV2xhblF1ZXJ5RW5jcnlNb2RlKGRldikpOworICAgICAgICAvL3U4X3Qgd3BhaWVMZW4sd3BhaWVbNTBdOworICAgICAgICAvL3pmaVdsYW5RdWVyeVdwYUllKGRldiwgd3BhaWUsICZ3cGFpZUxlbik7CisgICAgICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisgICAgICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgLy9pZiAod3BhaWVMZW4gPiAyKQorICAgICAgICAvLyAgICB6ZmlXbGFuU2V0V3BhSWUoZGV2LCB3cGFpZSwgd3BhaWVMZW4pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1OF90IEVuY3J5cHRpb25Nb2RlOworICAgIHU4X3Qga2V5TGVuID0gMDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBFbmNyeXB0aW9uTW9kZSA9IHpmaVdsYW5RdWVyeUVuY3J5TW9kZShkZXYpOworCisgICAgaWYgKEVuY3J5cHRpb25Nb2RlKQorICAgIHsKKyAgICAgICAgZXJxLT5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworICAgIH0KKworLyogV2UgY2FuJ3QgcmV0dXJuIHRoZSBrZXksIHNvIHNldCB0aGUgcHJvcGVyIGZsYWcgYW5kIHJldHVybiB6ZXJvICovCisgICAgZXJxLT5mbGFncyB8PSBJV19FTkNPREVfTk9LRVk7CisgICAgbWVtc2V0KGtleSwgMCwgMTYpOworCisvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisgICAgc3dpdGNoKEVuY3J5cHRpb25Nb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgICAgIGtleUxlbiA9IDU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9XRVAxMjg6CisgICAgICAgICAgICBrZXlMZW4gPSAxMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgIGtleUxlbiA9IDI5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICAgICAga2V5TGVuID0gMTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAga2V5TGVuID0gMzI7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICBrZXlMZW4gPSAzMjsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgY2FzZSBaTV9OT19XRVA6CisgICAgICAgICAgICBrZXlMZW4gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAga2V5TGVuID0gMDsKKyAgICAgICAgICAgIHByaW50aygiVW5rbm93biBFbmNyeU1vZGVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisgICAgZXJxLT5sZW5ndGggPSBrZXlMZW47CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QgUFNNb2RlOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChmcnEtPmRpc2FibGVkKQorICAgICAgICBQU01vZGUgPSBaTV9TVEFfUFNfTk9ORTsKKyAgICBlbHNlCisgICAgICAgIFBTTW9kZSA9IFpNX1NUQV9QU19NQVg7CisKKyAgICB6ZmlXbGFuU2V0UG93ZXJTYXZlTW9kZShkZXYsUFNNb2RlKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIGlmICh6ZmlXbGFuUXVlcnlQb3dlclNhdmVNb2RlKGRldikgPT0gWk1fU1RBX1BTX05PTkUpCisgICAgICAgIGZycS0+ZGlzYWJsZWQgPSAxOworICAgIGVsc2UKKyAgICAgICAgZnJxLT5kaXNhYmxlZCA9IDA7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIHJldHVybiAwOworfQorCisvL2ludCB1c2JkcnZ3ZXh0X3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisvLwkJICAgCSB2b2lkICp3LCBjaGFyICpleHRyYSkKKy8veworLy8Jc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gZGV2LT5tbF9wcml2OworLy8Jc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2ljOworLy8Jc3RydWN0IGllZWU4MDIxMV9yc25wYXJtcyAqcnNuID0gJnZhcC0+aXZfYnNzLT5uaV9yc247CisvLwlpbnQgKmkgPSAoaW50ICopIGV4dHJhOworLy8JaW50IHBhcmFtID0gaVswXTsJCS8qIHBhcmFtZXRlciBpZCBpcyAxc3QgKi8KKy8vCWludCB2YWx1ZSA9IGlbMV07CQkvKiBOQjogbW9zdCB2YWx1ZXMgYXJlIFRZUEVfSU5UICovCisvLwlpbnQgcmV0diA9IDA7CisvLwlpbnQgaiwgY2FwczsKKy8vCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRvciAqYXV0aDsKKy8vCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfYWNsYXRvciAqYWNsOworLy8KKy8vCXN3aXRjaCAocGFyYW0pIHsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0FVVEhNT0RFOgorLy8JCXN3aXRjaCAodmFsdWUpIHsKKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX1dQQToJLyogV1BBICovCisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF84MDIxWDoJLyogODAyLjF4ICovCisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9PUEVOOgkvKiBvcGVuICovCisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9TSEFSRUQ6CS8qIHNoYXJlZC1rZXkgKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX0FVVE86CS8qIGF1dG8gKi8KKy8vCQkJYXV0aCA9IGllZWU4MDIxMV9hdXRoZW50aWNhdG9yX2dldCh2YWx1ZSk7CisvLwkJCWlmIChhdXRoID09IE5VTEwpCisvLwkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJYnJlYWs7CisvLwkJZGVmYXVsdDoKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJfQorLy8JCXN3aXRjaCAodmFsdWUpIHsKKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX1dQQToJLyogV1BBIHcvIDgwMi4xeCAqLworLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1BSSVZBQ1k7CisvLwkJCXZhbHVlID0gSUVFRTgwMjExX0FVVEhfODAyMVg7CisvLwkJCWJyZWFrOworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfT1BFTjoJLyogb3BlbiAqLworLy8JCQl2YXAtPml2X2ZsYWdzICY9IH4oSUVFRTgwMjExX0ZfV1BBfElFRUU4MDIxMV9GX1BSSVZBQ1kpOworLy8JCQlicmVhazsKKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX1NIQVJFRDoJLyogc2hhcmVkLWtleSAqLworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfQVVUTzoJLyogYXV0byAqLworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfODAyMVg6CS8qIDgwMi4xeCAqLworLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9XUEE7CisvLwkJCS8qIGJvdGggcmVxdWlyZSBhIGtleSBzbyBtYXJrIHRoZSBQUklWQUNZIGNhcGFiaWxpdHkgKi8KKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9QUklWQUNZOworLy8JCQlicmVhazsKKy8vCQl9CisvLwkJLyogTkI6IGF1dGhlbnRpY2F0b3IgYXR0YWNoL2RldGFjaCBoYXBwZW5zIG9uIHN0YXRlIGNoYW5nZSAqLworLy8JCXZhcC0+aXZfYnNzLT5uaV9hdXRobW9kZSA9IHZhbHVlOworLy8JCS8qIFhYWCBtaXhlZC9tb2RlL3VzYWdlPyAqLworLy8JCXZhcC0+aXZfYXV0aCA9IGF1dGg7CisvLwkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1BST1RNT0RFOgorLy8JCWlmICh2YWx1ZSA+IElFRUU4MDIxMV9QUk9UX1JUU0NUUykKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJaWMtPmljX3Byb3Rtb2RlID0gdmFsdWU7CisvLwkJLyogTkI6IGlmIG5vdCBvcGVyYXRpbmcgaW4gMTFnIHRoaXMgY2FuIHdhaXQgKi8KKy8vCQlpZiAoaWMtPmljX2Jzc2NoYW4gIT0gSUVFRTgwMjExX0NIQU5fQU5ZQyAmJgorLy8JCSAgICBJRUVFODAyMTFfSVNfQ0hBTl9BTllHKGljLT5pY19ic3NjaGFuKSkKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX01DQVNUQ0lQSEVSOgorLy8JCWlmICgodmFwLT5pdl9jYXBzICYgY2lwaGVyMmNhcCh2YWx1ZSkpID09IDAgJiYKKy8vCQkgICAgIWllZWU4MDIxMV9jcnlwdG9fYXZhaWxhYmxlKHZhbHVlKSkKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJcnNuLT5yc25fbWNhc3RjaXBoZXIgPSB2YWx1ZTsKKy8vCQlpZiAodmFwLT5pdl9mbGFncyAmIElFRUU4MDIxMV9GX1dQQSkKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX01DQVNUS0VZTEVOOgorLy8JCWlmICghKDAgPCB2YWx1ZSAmJiB2YWx1ZSA8IElFRUU4MDIxMV9LRVlCVUZfU0laRSkpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCS8qIFhYWCBubyB3YXkgdG8gdmVyaWZ5IGRyaXZlciBjYXBhYmlsaXR5ICovCisvLwkJcnNuLT5yc25fbWNhc3RrZXlsZW4gPSB2YWx1ZTsKKy8vCQlpZiAodmFwLT5pdl9mbGFncyAmIElFRUU4MDIxMV9GX1dQQSkKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1VDQVNUQ0lQSEVSUzoKKy8vCQkvKgorLy8JCSAqIENvbnZlcnQgY2lwaGVyIHNldCB0byBlcXVpdmFsZW50IGNhcGFiaWxpdGllcy4KKy8vCQkgKiBOQjogdGhpcyBsb2dpYyBpbnRlbnRpb25hbGx5IGlnbm9yZXMgdW5rbm93biBhbmQKKy8vCQkgKiB1bnN1cHBvcnRlZCBjaXBoZXJzIHNvIGZvbGtzIGNhbiBzcGVjaWZ5IDB4ZmYgb3IKKy8vCQkgKiBzaW1pbGFyIGFuZCBnZXQgYWxsIGF2YWlsYWJsZSBjaXBoZXJzLgorLy8JCSAqLworLy8JCWNhcHMgPSAwOworLy8JCWZvciAoaiA9IDE7IGogPCAzMjsgaisrKQkvKiBOQjogc2tpcCBXRVAgKi8KKy8vCQkJaWYgKCh2YWx1ZSAmICgxPDxqKSkgJiYKKy8vCQkJICAgICgodmFwLT5pdl9jYXBzICYgY2lwaGVyMmNhcChqKSkgfHwKKy8vCQkJICAgICBpZWVlODAyMTFfY3J5cHRvX2F2YWlsYWJsZShqKSkpCisvLwkJCQljYXBzIHw9IDE8PGo7CisvLwkJaWYgKGNhcHMgPT0gMCkJCQkvKiBub3RoaW5nIGF2YWlsYWJsZSAqLworLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkvKiBYWFggdmVyaWZ5IGNpcGhlcnMgb2sgZm9yIHVuaWNhc3QgdXNlPyAqLworLy8JCS8qIFhYWCBkaXNhbGxvdyBpZiBydW5uaW5nIGFzIGl0J2xsIGhhdmUgbm8gZWZmZWN0ICovCisvLwkJcnNuLT5yc25fdWNhc3RjaXBoZXJzZXQgPSBjYXBzOworLy8JCWlmICh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fVUNBU1RDSVBIRVI6CisvLwkJaWYgKChyc24tPnJzbl91Y2FzdGNpcGhlcnNldCAmIGNpcGhlcjJjYXAodmFsdWUpKSA9PSAwKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlyc24tPnJzbl91Y2FzdGNpcGhlciA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fVUNBU1RLRVlMRU46CisvLwkJaWYgKCEoMCA8IHZhbHVlICYmIHZhbHVlIDwgSUVFRTgwMjExX0tFWUJVRl9TSVpFKSkKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJLyogWFhYIG5vIHdheSB0byB2ZXJpZnkgZHJpdmVyIGNhcGFiaWxpdHkgKi8KKy8vCQlyc24tPnJzbl91Y2FzdGtleWxlbiA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fS0VZTUdUQUxHUzoKKy8vCQkvKiBYWFggY2hlY2sgKi8KKy8vCQlyc24tPnJzbl9rZXltZ210c2V0ID0gdmFsdWU7CisvLwkJaWYgKHZhcC0+aXZfZmxhZ3MgJiBJRUVFODAyMTFfRl9XUEEpCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9SU05DQVBTOgorLy8JCS8qIFhYWCBjaGVjayAqLworLy8JCXJzbi0+cnNuX2NhcHMgPSB2YWx1ZTsKKy8vCQlpZiAodmFwLT5pdl9mbGFncyAmIElFRUU4MDIxMV9GX1dQQSkKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1dQQToKKy8vCQlpZiAodmFsdWUgPiAzKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkvKiBYWFggdmVyaWZ5IGNpcGhlcnMgYXZhaWxhYmxlICovCisvLwkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfV1BBOworLy8JCXN3aXRjaCAodmFsdWUpIHsKKy8vCQljYXNlIDE6CisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfV1BBMTsKKy8vCQkJYnJlYWs7CisvLwkJY2FzZSAyOgorLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1dQQTI7CisvLwkJCWJyZWFrOworLy8JCWNhc2UgMzoKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9XUEExIHwgSUVFRTgwMjExX0ZfV1BBMjsKKy8vCQkJYnJlYWs7CisvLwkJfQorLy8JCXJldHYgPSBFTkVUUkVTRVQ7CQkvKiBYWFg/ICovCisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNSU5HOgorLy8JCWlmICghKElFRUU4MDIxMV9ST0FNSU5HX0RFVklDRSA8PSB2YWx1ZSAmJgorLy8JCSAgICB2YWx1ZSA8PSBJRUVFODAyMTFfUk9BTUlOR19NQU5VQUwpKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlpYy0+aWNfcm9hbWluZyA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUFJJVkFDWToKKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJLyogWFhYIGNoZWNrIGZvciBrZXkgc3RhdGU/ICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfUFJJVkFDWTsKKy8vCQl9IGVsc2UKKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfUFJJVkFDWTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0RST1BVTkVOQ1JZUFRFRDoKKy8vCQlpZiAodmFsdWUpCisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfRFJPUFVORU5DOworLy8JCWVsc2UKKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfRFJPUFVORU5DOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQ09VTlRFUk1FQVNVUkVTOgorLy8JCWlmICh2YWx1ZSkgeworLy8JCQlpZiAoKHZhcC0+aXZfZmxhZ3MgJiBJRUVFODAyMTFfRl9XUEEpID09IDApCisvLwkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9DT1VOVEVSTTsKKy8vCQl9IGVsc2UKKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfQ09VTlRFUk07CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9EUklWRVJfQ0FQUzoKKy8vCQl2YXAtPml2X2NhcHMgPSB2YWx1ZTsJCS8qIE5COiBmb3IgdGVzdGluZyAqLworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fTUFDQ01EOgorLy8JCWFjbCA9IHZhcC0+aXZfYWNsOworLy8JCXN3aXRjaCAodmFsdWUpIHsKKy8vCQljYXNlIElFRUU4MDIxMV9NQUNDTURfUE9MSUNZX09QRU46CisvLwkJY2FzZSBJRUVFODAyMTFfTUFDQ01EX1BPTElDWV9BTExPVzoKKy8vCQljYXNlIElFRUU4MDIxMV9NQUNDTURfUE9MSUNZX0RFTlk6CisvLwkJCWlmIChhY2wgPT0gTlVMTCkgeworLy8JCQkJYWNsID0gaWVlZTgwMjExX2FjbGF0b3JfZ2V0KCJtYWMiKTsKKy8vCQkJCWlmIChhY2wgPT0gTlVMTCB8fCAhYWNsLT5pYWNfYXR0YWNoKHZhcCkpCisvLwkJCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJCQl2YXAtPml2X2FjbCA9IGFjbDsKKy8vCQkJfQorLy8JCQlhY2wtPmlhY19zZXRwb2xpY3kodmFwLCB2YWx1ZSk7CisvLwkJCWJyZWFrOworLy8JCWNhc2UgSUVFRTgwMjExX01BQ0NNRF9GTFVTSDoKKy8vCQkJaWYgKGFjbCAhPSBOVUxMKQorLy8JCQkJYWNsLT5pYWNfZmx1c2godmFwKTsKKy8vCQkJLyogTkI6IHNpbGVudGx5IGlnbm9yZSB3aGVuIG5vdCBpbiB1c2UgKi8KKy8vCQkJYnJlYWs7CisvLwkJY2FzZSBJRUVFODAyMTFfTUFDQ01EX0RFVEFDSDoKKy8vCQkJaWYgKGFjbCAhPSBOVUxMKSB7CisvLwkJCQl2YXAtPml2X2FjbCA9IE5VTEw7CisvLwkJCQlhY2wtPmlhY19kZXRhY2godmFwKTsKKy8vCQkJfQorLy8JCQlicmVhazsKKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9XTU06CisvLwkJaWYgKGljLT5pY19jYXBzICYgSUVFRTgwMjExX0NfV01FKXsKKy8vCQkJaWYgKHZhbHVlKSB7CisvLwkJCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1dNRTsKKy8vCQkJCXZhcC0+aXZfaWMtPmljX2ZsYWdzIHw9IElFRUU4MDIxMV9GX1dNRTsgLyogWFhYIG5lZWRlZCBieSBpY19yZXNldCAqLworLy8JCQl9CisvLwkJCWVsc2UgeworLy8JCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfV01FOworLy8JCQkJdmFwLT5pdl9pYy0+aWNfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX1dNRTsgLyogWFhYIG5lZWRlZCBieSBpY19yZXNldCAqLworLy8JCQl9CisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CS8qIFJlbmVnb3RpYXRlIGZvciBjYXBhYmlsaXRpZXMgKi8KKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ISURFU1NJRDoKKy8vCQlpZiAodmFsdWUpCisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfSElERVNTSUQ7CisvLwkJZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9ISURFU1NJRDsKKy8vCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQVBCUklER0U6CisvLwkJaWYgKHZhbHVlID09IDApCisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfTk9CUklER0U7CisvLwkJZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9OT0JSSURHRTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0lOQUNUOgorLy8JCXZhcC0+aXZfaW5hY3RfcnVuID0gdmFsdWUgLyBJRUVFODAyMTFfSU5BQ1RfV0FJVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0lOQUNUX0FVVEg6CisvLwkJdmFwLT5pdl9pbmFjdF9hdXRoID0gdmFsdWUgLyBJRUVFODAyMTFfSU5BQ1RfV0FJVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0lOQUNUX0lOSVQ6CisvLwkJdmFwLT5pdl9pbmFjdF9pbml0ID0gdmFsdWUgLyBJRUVFODAyMTFfSU5BQ1RfV0FJVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0FCT0xUOgorLy8JCWNhcHMgPSAwOworLy8JCS8qCisvLwkJICogTWFwIGFib2x0IHNldHRpbmdzIHRvIGNhcGFiaWxpdHkgYml0czsKKy8vCQkgKiB0aGlzIGFsc28gc3RyaXBzIHVua25vd24vdW53YW50ZWQgYml0cy4KKy8vCQkgKi8KKy8vCQlpZiAodmFsdWUgJiBJRUVFODAyMTFfQUJPTFRfVFVSQk9fUFJJTUUpCisvLwkJCWNhcHMgfD0gSUVFRTgwMjExX0FUSENfVFVSQk9QOworLy8JCWlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9DT01QUkVTU0lPTikKKy8vCQkJY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19DT01QOworLy8JCWlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9GQVNUX0ZSQU1FKQorLy8JCQljYXBzIHw9IElFRUU4MDIxMV9BVEhDX0ZGOworLy8JCWlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9YUikKKy8vCQkJY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19YUjsKKy8vCQlpZiAodmFsdWUgJiBJRUVFODAyMTFfQUJPTFRfQVIpCisvLwkJCWNhcHMgfD0gSUVFRTgwMjExX0FUSENfQVI7CisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX0JVUlNUKQorLy8JCQljYXBzIHw9IElFRUU4MDIxMV9BVEhDX0JVUlNUOworLy8gICAgICAgIGlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9XTUVfRUxFKQorLy8gICAgICAgICAgICBjYXBzIHw9IElFRUU4MDIxMV9BVEhDX1dNRTsKKy8vCQkvKiB2ZXJpZnkgcmVxdWVzdGVkIGNhcGFiaWxpdGllcyBhcmUgc3VwcG9ydGVkICovCisvLwkJaWYgKChjYXBzICYgaWMtPmljX2F0aF9jYXApICE9IGNhcHMpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCWlmICh2YXAtPml2X2F0aF9jYXAgIT0gY2FwcykgeworLy8JCQlpZiAoKHZhcC0+aXZfYXRoX2NhcCBeIGNhcHMpICYgSUVFRTgwMjExX0FUSENfVFVSQk9QKSB7CisvLwkJCQlpZiAoaWVlZTgwMjExX3NldF90dXJibyhkZXYsICBjYXBzICYgSUVFRTgwMjExX0FUSENfVFVSQk9QKSkKKy8vCQkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJCWllZWU4MDIxMV9zY2FuX2ZsdXNoKGljKTsKKy8vCQkJfQorLy8JCQl2YXAtPml2X2F0aF9jYXAgPSBjYXBzOworLy8JCQlpYy0+aWNfYXRoY2Fwc2V0dXAodmFwLT5pdl9pYywgdmFwLT5pdl9hdGhfY2FwKTsKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9EVElNX1BFUklPRDoKKy8vCQlpZiAodmFwLT5pdl9vcG1vZGUgIT0gSUVFRTgwMjExX01fSE9TVEFQICYmCisvLwkJICAgIHZhcC0+aXZfb3Btb2RlICE9IElFRUU4MDIxMV9NX0lCU1MpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCWlmIChJRUVFODAyMTFfRFRJTV9NSU4gPD0gdmFsdWUgJiYKKy8vCQkgICAgdmFsdWUgPD0gSUVFRTgwMjExX0RUSU1fTUFYKSB7CisvLwkJCXZhcC0+aXZfZHRpbV9wZXJpb2QgPSB2YWx1ZTsKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsJCS8qIHJlcXVpcmVzIHJlc3RhcnQgKi8KKy8vCQl9IGVsc2UKKy8vCQkJcmV0diA9IEVJTlZBTDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0JFQUNPTl9JTlRFUlZBTDoKKy8vCQlpZiAodmFwLT5pdl9vcG1vZGUgIT0gSUVFRTgwMjExX01fSE9TVEFQICYmCisvLwkJICAgIHZhcC0+aXZfb3Btb2RlICE9IElFRUU4MDIxMV9NX0lCU1MpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCWlmIChJRUVFODAyMTFfQklOVFZBTF9NSU4gPD0gdmFsdWUgJiYKKy8vCQkgICAgdmFsdWUgPD0gSUVFRTgwMjExX0JJTlRWQUxfTUFYKSB7CisvLwkJCWljLT5pY19saW50dmFsID0gdmFsdWU7CQkvKiBYWFggbXVsdGktYnNzICovCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CQkvKiByZXF1aXJlcyByZXN0YXJ0ICovCisvLwkJfSBlbHNlCisvLwkJCXJldHYgPSBFSU5WQUw7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ET1RIOgorLy8JCWlmICh2YWx1ZSkgeworLy8JCQlpYy0+aWNfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfRE9USDsKKy8vCQl9CisvLwkJZWxzZQorLy8JCQlpYy0+aWNfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX0RPVEg7CisvLwkJcmV0diA9IEVORVRSRVNFVDsJLyogWFhYOiBuZWVkIHNvbWV0aGluZyB0aGlzIGRyYXN0aWM/ICovCisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9QV1JUQVJHRVQ6CisvLwkJaWMtPmljX2N1cmNoYW5tYXhwd3IgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0dFTlJFQVNTT0M6CisvLwkJSUVFRTgwMjExX1NFTkRfTUdNVCh2YXAtPml2X2JzcywgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JFQVNTT0NfUkVRLCAwKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0NPTVBSRVNTSU9OOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfQ09NUCwgdmFsdWUpOworLy8JCWJyZWFrOworLy8gICAgY2FzZSBJRUVFODAyMTFfUEFSQU1fV01NX0FHR1JNT0RFOgorLy8gICAgICAgIHJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfV01FLCB2YWx1ZSk7CisvLyAgICAgICAgYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9GRjoKKy8vCQlyZXR2ID0gaWVlZTgwMjExX3NldGF0aGNhcCh2YXAsIElFRUU4MDIxMV9BVEhDX0ZGLCB2YWx1ZSk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9UVVJCTzoKKy8vCQlyZXR2ID0gaWVlZTgwMjExX3NldGF0aGNhcCh2YXAsIElFRUU4MDIxMV9BVEhDX1RVUkJPUCwgdmFsdWUpOworLy8JCWlmIChyZXR2ID09IEVORVRSRVNFVCkgeworLy8JCQlpZihpZWVlODAyMTFfc2V0X3R1cmJvKGRldix2YWx1ZSkpCisvLwkJCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJCWllZWU4MDIxMV9zY2FuX2ZsdXNoKGljKTsKKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9YUjoKKy8vCQlyZXR2ID0gaWVlZTgwMjExX3NldGF0aGNhcCh2YXAsIElFRUU4MDIxMV9BVEhDX1hSLCB2YWx1ZSk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9CVVJTVDoKKy8vCQlyZXR2ID0gaWVlZTgwMjExX3NldGF0aGNhcCh2YXAsIElFRUU4MDIxMV9BVEhDX0JVUlNULCB2YWx1ZSk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9BUjoKKy8vCQlyZXR2ID0gaWVlZTgwMjExX3NldGF0aGNhcCh2YXAsIElFRUU4MDIxMV9BVEhDX0FSLCB2YWx1ZSk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9QVVJFRzoKKy8vCQlpZiAodmFsdWUpCisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfUFVSRUc7CisvLwkJZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9QVVJFRzsKKy8vCQkvKiBOQjogcmVzZXQgb25seSBpZiB3ZSdyZSBvcGVyYXRpbmcgb24gYW4gMTFnIGNoYW5uZWwgKi8KKy8vCQlpZiAoaWMtPmljX2Jzc2NoYW4gIT0gSUVFRTgwMjExX0NIQU5fQU5ZQyAmJgorLy8JCSAgICBJRUVFODAyMTFfSVNfQ0hBTl9BTllHKGljLT5pY19ic3NjaGFuKSkKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1dEUzoKKy8vCQlpZiAodmFsdWUpCisvLwkJCXZhcC0+aXZfZmxhZ3NfZXh0IHw9IElFRUU4MDIxMV9GRVhUX1dEUzsKKy8vCQllbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3NfZXh0ICY9IH5JRUVFODAyMTFfRkVYVF9XRFM7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9CR1NDQU46CisvLwkJaWYgKHZhbHVlKSB7CisvLwkJCWlmICgodmFwLT5pdl9jYXBzICYgSUVFRTgwMjExX0NfQkdTQ0FOKSA9PSAwKQorLy8JCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfQkdTQ0FOOworLy8JCX0gZWxzZSB7CisvLwkJCS8qIFhYWCByYWNleT8gKi8KKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfQkdTQ0FOOworLy8JCQlpZWVlODAyMTFfY2FuY2VsX3NjYW4odmFwKTsJLyogYW55dGhpbmcgY3VycmVudCAqLworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0JHU0NBTl9JRExFOgorLy8JCWlmICh2YWx1ZSA+PSBJRUVFODAyMTFfQkdTQ0FOX0lETEVfTUlOKQorLy8JCQl2YXAtPml2X2Jnc2NhbmlkbGUgPSB2YWx1ZSpIWi8xMDAwOworLy8JCWVsc2UKKy8vCQkJcmV0diA9IEVJTlZBTDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0JHU0NBTl9JTlRFUlZBTDoKKy8vCQlpZiAodmFsdWUgPj0gSUVFRTgwMjExX0JHU0NBTl9JTlRWQUxfTUlOKQorLy8JCQl2YXAtPml2X2Jnc2NhbmludHZsID0gdmFsdWUqSFo7CisvLwkJZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fTUNBU1RfUkFURToKKy8vCQkvKiB1bml0cyBhcmUgaW4gS0lMT2JpdHMgcGVyIHNlY29uZCAqLworLy8JCWlmICh2YWx1ZSA+PSAyNTYgJiYgdmFsdWUgPD0gNTQwMDApCisvLwkJCXZhcC0+aXZfbWNhc3RfcmF0ZSA9IHZhbHVlOworLy8JCWVsc2UKKy8vCQkJcmV0diA9IEVJTlZBTDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0NPVkVSQUdFX0NMQVNTOgorLy8JCWlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IElFRUU4MDIxMV9DT1ZFUkFHRV9DTEFTU19NQVgpIHsKKy8vCQkJaWMtPmljX2NvdmVyYWdlY2xhc3MgPSB2YWx1ZTsKKy8vCQkJaWYgKElTX1VQX0FVVE8odmFwKSkKKy8vCQkJCWllZWU4MDIxMV9uZXdfc3RhdGUodmFwLCBJRUVFODAyMTFfU19TQ0FOLCAwKTsKKy8vCQkJcmV0diA9IDA7CisvLwkJfQorLy8JCWVsc2UKKy8vCQkJcmV0diA9IEVJTlZBTDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0NPVU5UUllfSUU6CisvLwkJaWYgKHZhbHVlKQorLy8JCQlpYy0+aWNfZmxhZ3NfZXh0IHw9IElFRUU4MDIxMV9GRVhUX0NPVU5UUllJRTsKKy8vCQllbHNlCisvLwkJCWljLT5pY19mbGFnc19leHQgJj0gfklFRUU4MDIxMV9GRVhUX0NPVU5UUllJRTsKKy8vCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUkVHQ0xBU1M6CisvLwkJaWYgKHZhbHVlKQorLy8JCQlpYy0+aWNfZmxhZ3NfZXh0IHw9IElFRUU4MDIxMV9GRVhUX1JFR0NMQVNTOworLy8JCWVsc2UKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCAmPSB+SUVFRTgwMjExX0ZFWFRfUkVHQ0xBU1M7CisvLwkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1NDQU5WQUxJRDoKKy8vCQl2YXAtPml2X3NjYW52YWxpZCA9IHZhbHVlKkhaOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SU1NJXzExQToKKy8vCQl2YXAtPml2X3JvYW0ucnNzaTExYSA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SU1NJXzExQjoKKy8vCQl2YXAtPml2X3JvYW0ucnNzaTExYk9ubHkgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1fUlNTSV8xMUc6CisvLwkJdmFwLT5pdl9yb2FtLnJzc2kxMWIgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1fUkFURV8xMUE6CisvLwkJdmFwLT5pdl9yb2FtLnJhdGUxMWEgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1fUkFURV8xMUI6CisvLwkJdmFwLT5pdl9yb2FtLnJhdGUxMWJPbmx5ID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNX1JBVEVfMTFHOgorLy8JCXZhcC0+aXZfcm9hbS5yYXRlMTFiID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9VQVBTRElORk86CisvLwkJaWYgKHZhcC0+aXZfb3Btb2RlID09IElFRUU4MDIxMV9NX0hPU1RBUCkgeworLy8JCQlpZiAoaWMtPmljX2NhcHMgJiBJRUVFODAyMTFfQ19VQVBTRCkgeworLy8JCQkJaWYgKHZhbHVlKQorLy8JCQkJCUlFRUU4MDIxMV9WQVBfVUFQU0RfRU5BQkxFKHZhcCk7CisvLwkJCQllbHNlCisvLwkJCQkJSUVFRTgwMjExX1ZBUF9VQVBTRF9ESVNBQkxFKHZhcCk7CisvLwkJCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCQl9CisvLwkJfQorLy8JCWVsc2UgaWYgKHZhcC0+aXZfb3Btb2RlID09IElFRUU4MDIxMV9NX1NUQSkgeworLy8JCQl2YXAtPml2X3VhcHNkaW5mbyA9IHZhbHVlOworLy8JCQlJRUVFODAyMTFfVkFQX1VBUFNEX0VOQUJMRSh2YXApOworLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1NMRUVQOgorLy8JCS8qIFhYWDogRm9yY2VkIHNsZWVwIGZvciB0ZXN0aW5nLiBEb2VzIG5vdCBhY3R1YWxseSBwbGFjZSB0aGUKKy8vCQkgKiAgICAgIEhXIGluIHNsZWVwIG1vZGUgeWV0LiB0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIFNUQXMuCisvLwkJICovCisvLwkJaWYgKHZhbHVlKSB7CisvLwkJCS8qIGdvdG8gc2xlZXAgKi8KKy8vCQkJSUVFRTgwMjExX1ZBUF9HT1RPU0xFRVAodmFwKTsKKy8vCQl9CisvLwkJZWxzZSB7CisvLwkJCS8qIHdha2V1cCAqLworLy8JCQlJRUVFODAyMTFfVkFQX1dBS0VVUCh2YXApOworLy8JCX0KKy8vCQlpZWVlODAyMTFfc2VuZF9udWxsZGF0YShpZWVlODAyMTFfcmVmX25vZGUodmFwLT5pdl9ic3MpKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1FPU05VTEw6CisvLwkJLyogRm9yY2UgYSBRb1MgTnVsbCBmb3IgdGVzdGluZy4gKi8KKy8vCQlpZWVlODAyMTFfc2VuZF9xb3NudWxsZGF0YSh2YXAtPml2X2JzcywgdmFsdWUpOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUFNQT0xMOgorLy8JCS8qIEZvcmNlIGEgUFMtUE9MTCBmb3IgdGVzdGluZy4gKi8KKy8vCQlpZWVlODAyMTFfc2VuZF9wc3BvbGwodmFwLT5pdl9ic3MpOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fRU9TUERST1A6CisvLwkJaWYgKHZhcC0+aXZfb3Btb2RlID09IElFRUU4MDIxMV9NX0hPU1RBUCkgeworLy8JCQlpZiAodmFsdWUpIElFRUU4MDIxMV9WQVBfRU9TUERST1BfRU5BQkxFKHZhcCk7CisvLwkJCWVsc2UgSUVFRTgwMjExX1ZBUF9FT1NQRFJPUF9ESVNBQkxFKHZhcCk7CisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fTUFSS0RGUzoKKy8vCQlpZiAodmFsdWUpCisvLwkJCWljLT5pY19mbGFnc19leHQgfD0gSUVFRTgwMjExX0ZFWFRfTUFSS0RGUzsKKy8vCQllbHNlCisvLwkJCWljLT5pY19mbGFnc19leHQgJj0gfklFRUU4MDIxMV9GRVhUX01BUktERlM7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9DSEFOQlc6CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCQljYXNlIDA6CisvLwkJCQlpYy0+aWNfY2hhbmJ3ZmxhZyA9IDA7CisvLwkJCQlicmVhazsKKy8vCQkJY2FzZSAxOgorLy8JCQkJaWMtPmljX2NoYW5id2ZsYWcgPSBJRUVFODAyMTFfQ0hBTl9IQUxGOworLy8JCQkJYnJlYWs7CisvLwkJCWNhc2UgMjoKKy8vCQkJCWljLT5pY19jaGFuYndmbGFnID0gSUVFRTgwMjExX0NIQU5fUVVBUlRFUjsKKy8vCQkJCWJyZWFrOworLy8JCQlkZWZhdWx0OgorLy8JCQkJcmV0diA9IEVJTlZBTDsKKy8vCQkJCWJyZWFrOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1NIT1JUUFJFQU1CTEU6CisvLwkJaWYgKHZhbHVlKSB7CisvLwkJCWljLT5pY19jYXBzIHw9IElFRUU4MDIxMV9DX1NIUFJFQU1CTEU7CisvLwkJfSBlbHNlIHsKKy8vCQkJaWMtPmljX2NhcHMgJj0gfklFRUU4MDIxMV9DX1NIUFJFQU1CTEU7CisvLwkJfQorLy8JCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwlkZWZhdWx0OgorLy8JCXJldHYgPSBFT1BOT1RTVVBQOworLy8JCWJyZWFrOworLy8JfQorLy8JLyogWFhYIHNob3VsZCBhbnkgb2YgdGhlc2UgY2F1c2UgYSByZXNjYW4/ICovCisvLwlpZiAocmV0diA9PSBFTkVUUkVTRVQpCisvLwkJcmV0diA9IElTX1VQX0FVVE8odmFwKSA/IGllZWU4MDIxMV9vcGVuKHZhcC0+aXZfZGV2KSA6IDA7CisvLwlyZXR1cm4gLXJldHY7CisvL30KKworaW50IHVzYmRydndleHRfc2V0bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9nZXRtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl2b2lkICp3LCBjaGFyICpleHRyYSkKK3sKKwkvL3N0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcG9pbnQgKndyaSA9IChzdHJ1Y3QgaXdfcG9pbnQgKilleHRyYTsKKwljaGFyIG1vZGVbOF07CisKKyAgICBzdHJjcHkobW9kZSwiMTFnIik7CisJcmV0dXJuIChjb3B5X3RvX3VzZXIod3JpLT5wb2ludGVyLCBtb2RlLCA2KSA/IC1FRkFVTFQgOiAwKTsKK30KKworaW50IHpmTG54UHJpdmF0ZUlvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ZGFwX2lvY3RsKiB6ZHJlcSkKK3sKKwkvL3ZvaWQqIHJlZ3AgPSBtYWNwLT5yZWdwOworCXUxNl90IGNtZDsKKwkvL3UzMl90IHRlbXA7CisJdTMyX3QqIHA7CisJdTMyX3QgaTsKKworCWNtZCA9IHpkcmVxLT5jbWQ7CisJc3dpdGNoKGNtZCkKKwl7CisJY2FzZSBaTV9JT0NUTF9SRUdfUkVBRDoKKwkJemZpRGJnUmVhZFJlZyhkZXYsIHpkcmVxLT5hZGRyKTsKKwkJYnJlYWs7CisKKwljYXNlIFpNX0lPQ1RMX1JFR19XUklURToKKwkJemZpRGJnV3JpdGVSZWcoZGV2LCB6ZHJlcS0+YWRkciwgemRyZXEtPnZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIFpNX0lPQ1RMX01FTV9SRUFEOgorCQlwID0gKHUzMl90ICopIGJ1c190b192aXJ0KHpkcmVxLT5hZGRyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInVzYmRydjogcmVhZCBtZW1vcnkgYWRkcjogMHglMDh4IHZhbHVlOiAweCUwOHhcbiIsIHpkcmVxLT5hZGRyLCAqcCk7CisJCWJyZWFrOworCisJY2FzZSBaTV9JT0NUTF9NRU1fV1JJVEU6CisJCXAgPSAodTMyX3QgKikgYnVzX3RvX3ZpcnQoemRyZXEtPmFkZHIpOworCQkqcCA9IHpkcmVxLT52YWx1ZTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInVzYmRydjogd3JpdGUgdmFsdWU6IDB4JTA4eCB0byBtZW1vcnkgYWRkcjogMHglMDh4XG4iLCB6ZHJlcS0+dmFsdWUsIHpkcmVxLT5hZGRyKTsKKwkJYnJlYWs7CisKKwljYXNlIFpNX0lPQ1RMX1RBTExZIDoKKwkJemZpV2xhblNob3dUYWxseShkZXYpOworCQlpZiAoemRyZXEtPmFkZHIpCisJCQl6ZmlXbGFuUmVzZXRUYWxseShkZXYpOworCQlicmVhazsKKworCWNhc2UgWk1fSU9DVExfVEVTVCA6CisgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiWk1fSU9DVExfVEVTVDpsZW49JWRcbiIsIHpkcmVxLT5hZGRyKTsKKyAgICAgICAgICAgIC8vemZpV2xhblJlYWRSZWcoZGV2LCAweDEwZjQwMCk7CisgICAgICAgICAgICAvL3pmaVdsYW5SZWFkUmVnKGRldiwgMHgxMGY0MDQpOworICAgICAgICAgICAgcHJpbnRrKCJJT0NUTCBURVNUXG4iKTsKKyAgICAgICAgICAgICNpZiAxCisgICAgICAgICAgICAvL3ByaW50IHBhY2tldAorICAgICAgICAgICAgZm9yIChpPTA7IGk8emRyZXEtPmFkZHI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGkmMHg3KSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGsoIiUwMlggIiwgKHVuc2lnbmVkIGNoYXIpemRyZXEtPmRhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgI2VuZGlmCisKKworICAgICAgICAgICAgI2lmIDAgLy9Gb3IgVGVzdD8/IDEgdG8gMCBieSBDV1lhbmcoLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBza19idWZmKiBzOworCisgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiAqLworICAgICAgICAgICAgcyA9IGFsbG9jX3NrYigyMDAwLCBHRlBfQVRPTUlDKTsKKworICAgICAgICAgICAgLyogQ29weSBkYXRhIHRvIHNrYiAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8emRyZXEtPmFkZHI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLT5kYXRhW2ldID0gemRyZXEtPmRhdGFbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5sZW4gPSB6ZHJlcS0+YWRkcjsKKworICAgICAgICAgICAgLyogQ2FsbCB6ZklkbFJlY3YoKSAqLworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgcywgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgYnJlYWs7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBaRENPTkZJRyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGNhc2UgWk1fSU9DVExfRlJBRyA6CisgICAgICAgICAgICB6ZmlXbGFuU2V0RnJhZ1RocmVzaG9sZChkZXYsIHpkcmVxLT5hZGRyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSU9DVExfUlRTIDoKKyAgICAgICAgICAgIHpmaVdsYW5TZXRSdHNUaHJlc2hvbGQoZGV2LCB6ZHJlcS0+YWRkcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0lPQ1RMX1NDQU4gOgorICAgICAgICAgICAgemZpV2xhblNjYW4oZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSU9DVExfS0VZIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90IGtleVsyOV07CisgICAgICAgICAgICAgICAgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvOworICAgICAgICAgICAgICAgIHUzMl90IGk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2V5W2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTx6ZHJlcS0+YWRkcjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2V5W2ldID0gemRyZXEtPmRhdGFbaV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpbnRrKCJrZXkgbGVuPSVkLCBrZXk9JTAyeCUwMnglMDJ4JTAyeCUwMnguLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB6ZHJlcS0+YWRkciwga2V5WzBdLCBrZXlbMV0sIGtleVsyXSwga2V5WzNdLCBrZXlbNF0pOworCisgICAgICAgICAgICAgICAga2V5SW5mby5rZXlMZW5ndGggPSB6ZHJlcS0+YWRkcjsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgPSAwOworICAgICAgICAgICAgICAgIGtleUluZm8ua2V5ID0ga2V5OworICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRLZXkoZGV2LCBrZXlJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSU9DVExfUkFURSA6CisgICAgICAgICAgICB6ZmlXbGFuU2V0VHhSYXRlKGRldiwgemRyZXEtPmFkZHIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUgOgorICAgICAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIHpkcmVxLT5hZGRyKTsKKworICAgICAgICAgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICAgICAgICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvL0NXWWFuZygrKQorICAgICAgICBjYXNlIFpNX0lPQ1RMX1NJR05BTF9TVFJFTkdUSCA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCBidWZmZXJbMl07CisgICAgICAgICAgICAgICAgemZpV2xhblF1ZXJ5U2lnbmFsSW5mbyhkZXYsICZidWZmZXJbMF0pOworICAgICAgICAgICAgICAgIHByaW50aygiQ3VycmVudCBTaWduYWwgU3RyZW5ndGggOiAlMDJkXG4iLCBidWZmZXJbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgIGNhc2UgWk1fSU9DVExfU0lHTkFMX1FVQUxJVFkgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHU4X3QgYnVmZmVyWzJdOworICAgICAgICAgICAgICAgIHpmaVdsYW5RdWVyeVNpZ25hbEluZm8oZGV2LCAmYnVmZmVyWzBdKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIkN1cnJlbnQgU2lnbmFsIFF1YWxpdHkgOiAlMDJkXG4iLCBidWZmZXJbMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKwljYXNlIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFOgorCQlpZiAoemRyZXEtPmFkZHIgPT0gMSkKKwkJCXpmaVdsYW5TZXRXbGFuTW9kZShkZXYsIFpNX01PREVfUFNFVURPKTsKKwkJZWxzZQorCQkJemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSk7CisKKwkJemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKwkJemZpV2xhbkVuYWJsZShkZXYpOworCisJCWJyZWFrOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBaRENPTkZJRyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlkZWZhdWx0IDoKKwkJcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnY6IGVycm9yIGNvbW1hbmQgPSAleFxuIiwgY21kKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZfd3BhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gKnpkcGFybSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1OF90IGJjX2FkZHJbNl0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKyAgICB1OF90IG1hY19hZGRyWzgwXTsKKyAgICBzdHJ1Y3QgenNLZXlJbmZvIGtleUluZm87CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IHZhcElkID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHpkcGFybS0+Y21kKQorICAgIHsKKyAgICAgICAgY2FzZSBaRF9DTURfU0VUX0VOQ1JZUFRfS0VZOgorCisgICAgICAgICAgICAvKiBTZXQgdXAga2V5IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IHpkcGFybS0+dS5jcnlwdC5rZXlfbGVuOworICAgICAgICAgICAga2V5SW5mby5rZXlJbmRleCA9IHpkcGFybS0+dS5jcnlwdC5pZHg7CisgICAgICAgICAgICBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0FQKSAvLyBBUCBNb2RlCisgICAgICAgICAgICAgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQVVUSEVOVElDQVRPUjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgPSAwOworICAgICAgICAgICAga2V5SW5mby5rZXkgPSB6ZHBhcm0tPnUuY3J5cHQua2V5OworICAgICAgICAgICAga2V5SW5mby5pbml0SXYgPSB6ZHBhcm0tPnUuY3J5cHQuc2VxOworICAgICAgICAgICAga2V5SW5mby5tYWNBZGRyID0gKHUxNl90ICopemRwYXJtLT5zdGFfYWRkcjsKKworICAgICAgICAgICAgLyogSWRlbnRpZnkgdGhlIE1BQyBhZGRyZXNzIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICBpZiAobWVtY21wKHpkcGFybS0+c3RhX2FkZHIsIGJjX2FkZHIsIHNpemVvZihiY19hZGRyKSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgfD0gWk1fS0VZX0ZMQUdfR0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2V5SW5mby5mbGFnIHw9IFpNX0tFWV9GTEFHX1BLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXN0cmNtcCh6ZHBhcm0tPnUuY3J5cHQuYWxnLCAiTk9ORSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vdThfdCB6ZXJvX21hY1tdPXswLDAsMCwwLDAsMH07CisKKyAgICAgICAgICAgICAgICAvKiBTZXQga2V5IGxlbmd0aCB0byB6ZXJvICovCisgICAgICAgICAgICAgICAga2V5SW5mby5rZXlMZW5ndGggPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHpkcGFybS0+c3RhX2FkZHJbMF0gJiAxKS8vZGVsIGdyb3VwIGtleQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAobWFjcC0+Y2FyZFNldHRpbmcuV1BBSWVMZW49PTApCisgICAgICAgICAgICAgICAgICAgIC8vey8vODAyLjF4IGR5bmFtaWMgV0VQCisgICAgICAgICAgICAgICAgICAgIC8vICAgIG1EeW5LZXlNb2RlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbUtleUZvcm1hdFswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIG1Qcml2YWN5SW52b2tlZFswXT1GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbUNhcFswXSAmPSB+Q0FQX1BSSVZBQ1k7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIG1hY3AtPmNhcmRTZXR0aW5nLkVuY3J5T25PZmZbMF09MDsKKyAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgICAgIC8vbVdwYUJjS2V5TGVuID0gbUdrSW5zdGFsbGVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAobWVtY21wKHplcm9fbWFjLHpkcGFybS0+c3RhX2FkZHIsIDYpPT0wKQorICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGU9MDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbUtleUZvcm1hdFswXT0wOworICAgICAgICAgICAgICAgICAgICAvLyAgICBwU2V0dGluZy0+RHluS2V5TW9kZT0wOworICAgICAgICAgICAgICAgICAgICAvLyAgICBwU2V0dGluZy0+RW5jcnlNb2RlWzBdPTA7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIG1EeW5LZXlNb2RlPTA7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiU2V0IEVuY3J5cHRpb24gVHlwZSBOT05FXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh6ZHBhcm0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9US0lQKTsKKyAgICAgICAgICAgICAgICAvL0xpbnV4IFN1cHBsaWNhbnQgd2lsbCBpbnZlcnNlIFR4L1J4IGtleQorICAgICAgICAgICAgICAgIC8vU28gd2UgaW52ZXJzZSBpdCBiYWNrIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgLy96Zk1lbW9yeUNvcHkoJnRlbXBbMF0sICZrZXlJbmZvLmtleVsxNl0sIDgpOworICAgICAgICAgICAgICAgIC8vemZNZW1vcnlDb3B5KCZrZXlJbmZvLmtleVsxNl0sIGtleUluZm8ua2V5WzI0XSwgOCk7CisgICAgICAgICAgICAgICAgLy96Zk1lbW9yeUNvcHkoJmtleUluZm8ua2V5WzI0XSwgJnRlbXBbMF0sIDgpOworICAgICAgICAgICAgICAgIC8vdThfdCB0ZW1wOworICAgICAgICAgICAgICAgIC8vaW50IGs7CisgICAgICAgICAgICAgICAgLy9mb3IgKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgIC8vICAgIHRlbXAgPSBrZXlJbmZvLmtleVsxNiArIGtdOworICAgICAgICAgICAgICAgIC8vICAgIGtleUluZm8ua2V5WzE2ICsga10gPSBrZXlJbmZvLmtleVsyNCArIGtdOworICAgICAgICAgICAgICAgIC8vICAgIGtleUluZm8ua2V5WzI0ICsga10gPSB0ZW1wOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIC8vQ2FtRW5jcnlUeXBlID0gWk1fVEtJUDsKKyAgICAgICAgICAgICAgICAvLy8vaWYgKGlkeCA9PSAwKQorICAgICAgICAgICAgICAgIC8vey8vIFBhaXJ3aXNlIGtleQorICAgICAgICAgICAgICAgIC8vICAgIG1LZXlGb3JtYXRbMF0gPSBDYW1FbmNyeVR5cGU7CisgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGUgPSBwU2V0dGluZy0+RHluS2V5TW9kZSA9IERZTl9LRVlfVEtJUDsKKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoemRwYXJtLT51LmNyeXB0LmFsZywgIkNDTVAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fQUVTKTsKKyAgICAgICAgICAgICAgICAvL0NhbUVuY3J5VHlwZSA9IFpNX0FFUzsKKyAgICAgICAgICAgICAgICAvLy8vaWYgKGlkeCA9PSAwKQorICAgICAgICAgICAgICAgIC8vey8vIFBhaXJ3aXNlIGtleQorICAgICAgICAgICAgICAgIC8vICAgIG1LZXlGb3JtYXRbMF0gPSBDYW1FbmNyeVR5cGU7CisgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGUgPSBwU2V0dGluZy0+RHluS2V5TW9kZSA9IERZTl9LRVlfQUVTOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh6ZHBhcm0tPnUuY3J5cHQuYWxnLCAiV0VQIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDUpCisgICAgICAgICAgICAgICAgeyAvLyBXRVAgNjQKKyAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX1dFUDY0KTsKKyAgICAgICAgICAgICAgICAvLyAgICBDYW1FbmNyeVR5cGUgPSBaTV9XRVA2NDsKKyAgICAgICAgICAgICAgICAvLyAgICB0bXBEeW5LZXlNb2RlPURZTl9LRVlfV0VQNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDEzKQorICAgICAgICAgICAgICAgIHsvL2tleWxlbj0xMywgV0VQIDEyOAorICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fV0VQMTI4KTsKKyAgICAgICAgICAgICAgICAvLyAgICBDYW1FbmNyeVR5cGUgPSBaTV9XRVAxMjg7CisgICAgICAgICAgICAgICAgLy8gICAgdG1wRHluS2V5TW9kZT1EWU5fS0VZX1dFUDEyODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX1dFUDI1Nik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRm9yIER5bmFtaWMgV0VQIGtleSAoTm9uLVdQQSBSYWRpdXMpLCB0aGUga2V5IElEIHJhbmdlOiAwLTMKKyAgICAgICAgICAgICAgICAvLyBJbiBXUEEvUlNOIG1vZGUsIHRoZSBrZXkgSUQgcmFuZ2U6IDEtMywgdXN1YWxseSwgYSBicm9hZGNhc3Qga2V5LgorICAgICAgICAgICAgICAgIC8vIEZvciBXRVAga2V5IHNldHRpbmc6IHdlIHNldCBtRHluS2V5TW9kZSBhbmQgbUtleUZvcm1hdCBpbiBmb2xsb3dpbmcgY2FzZToKKyAgICAgICAgICAgICAgICAvLyAgIDEuIEZvciA4MDIuMXggZHluYW1pY2FsbHkgZ2VuZXJhdGVkIFdFUCBrZXkgbWV0aG9kLgorICAgICAgICAgICAgICAgIC8vICAgMi4gRm9yIFdQQS9SU04gbW9kZSwgYnV0IGtleSBpZCA9PSAwLiAoQnV0IHRoaXMgaXMgYW4gaW1wb3NzaWJsZSBjYXNlKQorICAgICAgICAgICAgICAgIC8vIFNvLCBvbmx5IGNoZWNrIGNhc2UgMS4KKyAgICAgICAgICAgICAgICAvL2lmIChtYWNwLT5jYXJkU2V0dGluZy5XUEFJZUxlbj09MCkKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICBtS2V5Rm9ybWF0WzBdID0gQ2FtRW5jcnlUeXBlOworICAgICAgICAgICAgICAgIC8vICAgIG1EeW5LZXlNb2RlID0gcFNldHRpbmctPkR5bktleU1vZGUgPSB0bXBEeW5LZXlNb2RlOworICAgICAgICAgICAgICAgIC8vICAgIG1Qcml2YWN5SW52b2tlZFswXT1UUlVFOworICAgICAgICAgICAgICAgIC8vICAgIG1DYXBbMF0gfD0gQ0FQX1BSSVZBQ1k7CisgICAgICAgICAgICAgICAgLy8gICAgbWFjcC0+Y2FyZFNldHRpbmcuRW5jcnlPbk9mZlswXT0xOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEVU1QIGtleSBjb250ZXh0ICovCisvLyNpZmRlZiBXUEFfREVCVUcKKyAgICAgICAgICAgIGlmIChrZXlJbmZvLmtleUxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlpOworICAgICAgICAgICAgICAgIHByaW50aygiT3R1czogS2V5IENvbnRleHQ6XG4iKTsKKyAgICAgICAgICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IGtleUluZm8ua2V5TGVuZ3RoOykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiMHglMDJ4ICIsIGtleUluZm8ua2V5W2lpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCgrK2lpICUgMTYpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgIH0KKy8vI2VuZGlmCisKKyAgICAgICAgICAgIC8qIFNldCBlbmNyeXB0IG1vZGUgKi8KKyAgICAgICAgICAgIC8vemZpV2xhblNldEVuY3J5TW9kZShkZXYsIENhbUVuY3J5VHlwZSk7CisgICAgICAgICAgICB2YXBJZCA9IHpmTG54R2V0VmFwSWQoZGV2KTsKKyAgICAgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgICAgICAgICAga2V5SW5mby52YXBJZCA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2V5SW5mby52YXBJZCA9IHZhcElkICsgMTsKKyAgICAgICAgICAgIGtleUluZm8udmFwQWRkclswXSA9IGtleUluZm8ubWFjQWRkclswXTsKKyAgICAgICAgICAgIGtleUluZm8udmFwQWRkclsxXSA9IGtleUluZm8ubWFjQWRkclsxXTsKKyAgICAgICAgICAgIGtleUluZm8udmFwQWRkclsyXSA9IGtleUluZm8ubWFjQWRkclsyXTsKKworICAgICAgICAgICAgemZpV2xhblNldEtleShkZXYsIGtleUluZm8pOworCisgICAgICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgICAgICAvL3pmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWkRfQ01EX1NFVF9NTE1FOgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfd3BhX2lvY3RsOiBaRF9DTURfU0VUX01MTUVcbiIpOworCisgICAgICAgICAgICAvKiBUcmFuc2xhdGUgU1RBJ3MgYWRkcmVzcyAqLworICAgICAgICAgICAgc3ByaW50ZihtYWNfYWRkciwgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgemRwYXJtLT5zdGFfYWRkclswXSwgemRwYXJtLT5zdGFfYWRkclsxXSwKKyAgICAgICAgICAgICAgICB6ZHBhcm0tPnN0YV9hZGRyWzJdLCB6ZHBhcm0tPnN0YV9hZGRyWzNdLCB6ZHBhcm0tPnN0YV9hZGRyWzRdLCB6ZHBhcm0tPnN0YV9hZGRyWzVdKTsKKworICAgICAgICAgICAgc3dpdGNoKHpkcGFybS0+dS5tbG1lLmNtZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1MTUVfU1RBX0RFQVVUSDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgLS0tLS0tLUNhbGwgemZpV2xhbkRlYXV0aCwgcmVhc29uOiVkXG4iLHpkcGFybS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoemZpV2xhbkRlYXV0aChkZXYsICh1MTZfdCopIHpkcGFybS0+c3RhX2FkZHIsIHpkcGFybS0+dS5tbG1lLnJlYXNvbl9jb2RlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBkZWF1dGhlbmNhdGUgU1RBOiAlc1xuIiwgbWFjX2FkZHIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkRlYXV0aGVudGljYXRlIFNUQTogJXMgd2l0aCByZWFzb24gY29kZTogJWRcbiIsIG1hY19hZGRyLCB6ZHBhcm0tPnUubWxtZS5yZWFzb25fY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNTE1FX1NUQV9ESVNBU1NPQzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgLS0tLS0tLUNhbGwgemZpV2xhbkRlYXV0aCwgcmVhc29uOiVkXG4iLHpkcGFybS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoemZpV2xhbkRlYXV0aChkZXYsICh1MTZfdCopIHpkcGFybS0+c3RhX2FkZHIsIHpkcGFybS0+dS5tbG1lLnJlYXNvbl9jb2RlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBkaXNhc3NvY2lhdGUgU1RBOiAlc1xuIiwgbWFjX2FkZHIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkRpc2Fzc29jaWF0ZSBTVEE6ICVzIHdpdGggcmVhc29uIGNvZGU6ICVkXG4iLCBtYWNfYWRkciwgemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiTUxNRSBjb21tYW5kOiAweCUwNHggbm90IHN1cHBvcnRcbiIsIHpkcGFybS0+dS5tbG1lLmNtZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpEX0NNRF9TQ0FOX1JFUToKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2X3dwYV9pb2N0bDogWkRfQ01EX1NDQU5fUkVRXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWkRfQ01EX1NFVF9HRU5FUklDX0VMRU1FTlQ6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydl93cGFfaW9jdGw6IFpEX0NNRF9TRVRfR0VORVJJQ19FTEVNRU5UXG4iKTsKKworICAgICAgICAgICAgLyogQ29weSB0aGUgV1BBIElFICovCisgICAgICAgICAgICAvL3ptX21zZzFfbW0oWk1fTFZfMCwgIkNXWSAtIHdwYWllIExlbmd0aCA6ICIsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid3BhaWUgTGVuZ3RoIDogJWRcbiIsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuKTsKKyAgICAgICAgICAgIGlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V3BhSWUoZGV2LCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmRhdGEsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYWNwLT5zdXBMZW4gPSB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbjsKKyAgICAgICAgICAgICAgICBtZW1jcHkobWFjcC0+c3VwSWUsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgemZpV2xhblNldFdwYVN1cHBvcnQoZGV2LCAxKTsKKyAgICAgICAgICAgIC8vemZpV2xhblNldFdwYUllKGRldiwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5kYXRhLCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlpOworICAgICAgICAgICAgICAgIHU4X3QgbGVuID0gemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW47CisgICAgICAgICAgICAgICAgdThfdCAqd3BhaWUgPSAodThfdCAqKXpkcGFybS0+dS5nZW5lcmljX2VsZW0uZGF0YTsKKworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPmFwLndwYUxlbjogJWRcbiIsIGxlbik7CisKKyAgICAgICAgICAgICAgICAvKiBEVU1QIFdQQSBJRSAqLworICAgICAgICAgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgbGVuOykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIHdwYWllW2lpXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKCsraWkgJSAxNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworICAgICAgICAgICAgfQorCisvLyAgICAgICAgICAgICNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyAgICAgICAgICAgIC8vaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgLy97Ly8gVXBkYXRlIEJlYWNvbiBGSUZPIGluIHRoZSBuZXh0IFRCVFQuCisgICAgICAgICAgICAvLyAgICBtZW1jcHkoJm1XUEFJZSwgcFNldHRpbmctPldQQUllLCBwU2V0dGluZy0+V1BBSWVMZW4pOworICAgICAgICAgICAgLy8gICAgcHJpbnRrKEtFUk5fRVJSICJDb3B5IFdQQSBJRSBpbnRvIG1XUEFJZVxuIik7CisgICAgICAgICAgICAvL30KKy8vICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKworLy8gICAgICAgICNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyAgICAgICAgY2FzZSBaRF9DTURfR0VUX1RTQzoKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2X3dwYV9pb2N0bDogWkRfQ01EX0dFVF9UU0NcbiIpOworICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2X3dwYV9pb2N0bCBkZWZhdWx0OiAweCUwNHhcbiIsIHpkcGFybS0+Y21kKTsKKyAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKK2ludCB1c2JkcnZfY2VuY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgenlkYXNfY2VuY19wYXJhbSAqemRwYXJtKQoreworICAgIC8vc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1MTZfdCBhcElkOworICAgIHU4X3QgYmNfYWRkcls2XSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworICAgIGludCByZXQgPSAwOworICAgIGludCBpaTsKKworICAgIC8qIEdldCB0aGUgQVAgSWQgKi8KKyAgICBhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworCisgICAgaWYgKGFwSWQgPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgYXBJZCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwSWQgPSBhcElkKzE7CisgICAgfQorCisgICAgc3dpdGNoICh6ZHBhcm0tPmNtZCkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQ01EX0NFTkNfU0VUQ0VOQzoKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWk1fQ01EX0NFTkNfU0VUQ0VOQ1xuIik7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImxlbmd0aDogJWRcbiIsIHpkcGFybS0+bGVuKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAicG9saWN5OiAlZFxuIiwgemRwYXJtLT51LmluZm8uY2VuY19wb2xpY3kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fQ01EX0NFTkNfU0VUS0VZOgorICAgICAgICAgICAgLy9yZXQgPSB3YWlfaW9jdGxfc2V0a2V5KHZhcCwgaW9jdGxfbXNnKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWk1fQ01EX0NFTkNfU0VUS0VZXG4iKTsKKworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJNQUMgYWRkcmVzcz0gIik7CisgICAgICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IDY7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgemRwYXJtLT51LmNyeXB0LnN0YV9hZGRyW2lpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiS2V5IEluZGV4OiAlZFxuIiwgemRwYXJtLT51LmNyeXB0LmtleWlkKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRW5jcnlwdGlvbiBrZXk9ICIpOworICAgICAgICAgICAgZm9yKGlpID0gMDsgaWkgPCAxNjsgaWkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCB6ZHBhcm0tPnUuY3J5cHQua2V5W2lpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiTUlDIGtleT0gIik7CisgICAgICAgICAgICBmb3IoaWkgPSAxNjsgaWkgPCBaTV9DRU5DX0tFWV9TSVpFOyBpaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIHpkcGFybS0+dS5jcnlwdC5rZXlbaWldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICAgICAgICAgLyogU2V0IHVwIGtleSBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAga2V5SW5mby5rZXlMZW5ndGggPSBaTV9DRU5DX0tFWV9TSVpFOworICAgICAgICAgICAga2V5SW5mby5rZXlJbmRleCA9IHpkcGFybS0+dS5jcnlwdC5rZXlpZDsKKyAgICAgICAgICAgIGtleUluZm8uZmxhZyA9IFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgfCBaTV9LRVlfRkxBR19DRU5DOworICAgICAgICAgICAga2V5SW5mby5rZXkgPSB6ZHBhcm0tPnUuY3J5cHQua2V5OworICAgICAgICAgICAga2V5SW5mby5tYWNBZGRyID0gKHUxNl90ICopemRwYXJtLT51LmNyeXB0LnN0YV9hZGRyOworCisgICAgICAgICAgICAvKiBJZGVudGlmeSB0aGUgTUFDIGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGlmIChtZW1jbXAoemRwYXJtLT51LmNyeXB0LnN0YV9hZGRyLCBiY19hZGRyLCBzaXplb2YoYmNfYWRkcikpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2V5SW5mby5mbGFnIHw9IFpNX0tFWV9GTEFHX0dLOworICAgICAgICAgICAgICAgIGtleUluZm8udmFwSWQgPSBhcElkOworICAgICAgICAgICAgICAgIG1lbWNweShrZXlJbmZvLnZhcEFkZHIsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgfD0gWk1fS0VZX0ZMQUdfUEs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpmaVdsYW5TZXRLZXkoZGV2LCBrZXlJbmZvKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fQ01EX0NFTkNfUkVLRVk6CisgICAgICAgICAgICAvL3JldCA9IHdhaV9pb2N0bF9yZWtleSh2YXAsIGlvY3RsX21zZyk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlpNX0NNRF9DRU5DX1JFS0VZXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIC8vaWYgKHJldHYgPT0gRU5FVFJFU0VUKQorICAgIC8vICAgIHJldHYgPSBJU19VUF9BVVRPKHZhcCkgPyBpZWVlODAyMTFfb3Blbih2YXAtPml2X2RldikgOiAwOworCisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IHVzYmRydl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKy8vICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcDsKKy8vICAgIHZvaWQgKnJlZ3A7CisgICAgc3RydWN0IHpkYXBfaW9jdGwgemRyZXE7CisgICAgc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopaWZyOworICAgIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gemRwYXJtOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGludCBlcnIgPSAwOworICAgIGludCBjaGFuZ2VkID0gMDsKKworLy8gICAgcmVncCA9IG1hY3AtPnJlZ3A7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICAgICAgICAgIGNhc2UgU0lPQ0dJV05BTUU6CisgICAgICAgICAgICBzdHJjcHkod3JxLT51Lm5hbWUsICJJRUVFIDgwMi4xMS1EUyIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSU9DR0lXQVA6CisgICAgICAgICAgICBlcnIgPSB1c2JkcnZ3ZXh0X2dpd2FwKGRldiwgTlVMTCwgJndycS0+dS5hcF9hZGRyLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBTSU9DU0lXQVA6CisgICAgICAgICAgICBlcnIgPSB1c2JkcnZ3ZXh0X3Npd2FwKGRldiwgTlVMTCwgJndycS0+dS5hcF9hZGRyLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBTSU9DR0lXTU9ERToKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfZ2l3bW9kZShkZXYsIE5VTEwsICZ3cnEtPnUubW9kZSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgU0lPQ1NJV0VTU0lEOgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDV1kgLSB1c2JkcnZ3ZXh0X3Npd2Vzc2lkXG4iKTsKKyAgICAgICAgICAgIC8vZXJyID0gdXNiZHJ2X2lvY3RsX3NldGVzc2lkKGRldiwgJndycS0+dS5lc3NpZCk7CisgICAgICAgICAgICBlcnIgPSB1c2JkcnZ3ZXh0X3Npd2Vzc2lkKGRldiwgTlVMTCwgJndycS0+dS5lc3NpZCwgTlVMTCk7CisKKyAgICAgICAgICAgIGlmICghIGVycikKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBTSU9DR0lXRVNTSUQ6CisgICAgICAgICAgICBlcnIgPSB1c2JkcnZ3ZXh0X2dpd2Vzc2lkKGRldiwgTlVMTCwgJndycS0+dS5lc3NpZCwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgU0lPQ1NJV1JUUzoKKworICAgICAgICAgICAgZXJyID0gdXNiZHJ2X2lvY3RsX3NldHJ0cyhkZXYsICZ3cnEtPnUucnRzKTsKKyAgICAgICAgICAgIGlmICghIGVycikKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKwkJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDI6IC8qIHNldF9hdXRoICovCisJCXsKKwkJCS8vcHJpbnRrKCJDV1kgLSBTSU9DSVdGSVJTVFBSSVYgKyAweDIgKHNldF9hdXRoKVxuIik7CisJCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJeworCQkJCWVyciA9IC1FUEVSTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXsKKwkJCQlpbnQgdmFsID0gKiggKGludCAqKSB3cnEtPnUubmFtZSApOworCQkJCWlmICgodmFsIDwgMCkgfHwgKHZhbCA+IDIpKQorCQkJCXsKKwkJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCB2YWwpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisJCQkJCWVyciA9IDA7CisJCQkJCWNoYW5nZWQgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDM6IC8qIGdldF9hdXRoICovCisJCXsKKwkJICAgIGludCBBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9PUEVOOworCisJCQkvL3ByaW50aygiQ1dZIC0gU0lPQ0lXRklSU1RQUklWICsgMHgzIChnZXRfYXV0aClcbiIpOworCisJCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwkJCXsKKwkJCQl3cnEtPnUuZGF0YS5mbGFncyA9IDE7CisKKwkJCQlBdXRoTW9kZSA9IHpmaVdsYW5RdWVyeUF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIDApOworCQkJCWlmIChBdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfT1BFTikKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDEyOworCisJCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgIm9wZW4gc3lzdGVtIiwgMTIpKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChBdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDExOworCisJCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgInNoYXJlZCBrZXkiLCAxMSkpCisJCQkJCXsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9BVVRPKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTA7CisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAiYXV0byBtb2RlIiwgMTApKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQl9CisJCX0KKwkJCWJyZWFrOworCisKKyAgICAgICAgY2FzZSBaREFQSU9DVEw6ICAgIC8vZGVidWcgY29tbWFuZAorICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZ6ZHJlcSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mICh6ZHJlcSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2OiBjb3B5X2Zyb21fdXNlciBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fREVCVUcgInVzYmRydjogY21kPSUyeCwgcmVnPTB4JTA0bHgsIHZhbHVlPTB4JTA4bHhcbiIsCisgICAgICAgICAgICAvLyAgICAgICAgemRyZXEuY21kLCB6ZHJlcS5hZGRyLCB6ZHJlcS52YWx1ZSk7CisKKwkJCXpmTG54UHJpdmF0ZUlvY3RsKGRldiwgJnpkcmVxKTsKKworICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWkRfSU9DVExfV1BBOgorICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZ6ZHBhcm0sIGlmci0+aWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgYXRocl93bGFuX3BhcmFtKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnY6IGNvcHlfZnJvbV91c2VyIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNiZHJ2X3dwYV9pb2N0bChkZXYsICZ6ZHBhcm0pOworICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWkRfSU9DVExfUEFSQU06CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCAqcDsKKyAgICAgICAgICAgIGludCBvcDsKKyAgICAgICAgICAgIGludCBhcmc7CisKKyAgICAgICAgICAgIC8qIFBvaW50IHRvIHRoZSBuYW1lIGZpZWxkIGFuZCByZXRyaWV2ZSB0aGUKKyAgICAgICAgICAgICAqIG9wIGFuZCBhcmcgZWxlbWVudHMuICAgICAgICAgICovCisgICAgICAgICAgICBwID0gKGludCAqKXdycS0+dS5uYW1lOworICAgICAgICAgICAgb3AgPSAqcCsrOworICAgICAgICAgICAgYXJnID0gKnA7CisKKyAgICAgICAgICAgIGlmKG9wID09IFpEX1BBUkFNX1JPQU1JTkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIqKioqKioqKioqKioqIFpEX1BBUkFNX1JPQU1JTkc6ICVkXG4iLCBhcmcpOworICAgICAgICAgICAgICAgIC8vbWFjcC0+Y2FyZFNldHRpbmcuYXBfc2Nhbj0oVTgpYXJnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fUFJJVkFDWSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlpEX0lPQ1RMX1BSSVZBQ1k6ICIpOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvbiB0aGUgcHJpdmFjeSBpbnZva2UgZmxhZyAqLworICAgICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgbUNhcFswXSB8PSBDQVBfUFJJVkFDWTsKKyAgICAgICAgICAgICAgICAvLyAgICBtYWNwLT5jYXJkU2V0dGluZy5FbmNyeU9uT2ZmWzBdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbmFibGVcbiIpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgbUNhcFswXSAmPSB+Q0FQX1BSSVZBQ1k7CisgICAgICAgICAgICAgICAgLy8gICAgbWFjcC0+Y2FyZFNldHRpbmcuRW5jcnlPbk9mZlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZGlzYWJsZVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NoYW5nZWQ9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG9wID09IFpEX1BBUkFNX1dQQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlpEX1BBUkFNX1dQQTogIik7CisKKyAgICAgICAgICAgICAgICBpZihhcmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVuYWJsZVxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgIT0gWk1fTU9ERV9BUCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJTdGF0aW9uIE1vZGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZmlXbGFuUXVlcnlXcGFJZShkZXYsICh1OF90ICopJndwYUllLCAmd3BhbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJ3cGFJZSA6ICUyeCwlMngsJTJ4XG4iLCB3cGFJZVsyMV0sIHdwYUllWzIyXSwgd3BhSWVbMjNdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJyc25JZSA6ICUyeCwlMngsJTJ4XG4iLCB3cGFJZVsxN10sIHdwYUllWzE4XSwgd3BhSWVbMTldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWFjcC0+c3VwSWVbMjFdID09IDB4NTApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzIyXSA9PSAweGYyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsyM10gPT0gMHgyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBUFNLXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBUFNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQVBTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgWk1fQVVUSF9NT0RFX1dQQVBTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgobWFjcC0+c3VwSWVbMjFdID09IDB4NTApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMjJdID09IDB4ZjIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMjNdID09IDB4MSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIFpNX0FVVEhfTU9ERV9XUEEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKG1hY3AtPnN1cEllWzE3XSA9PSAweGYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMThdID09IDB4YWMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMTldID09IDB4MikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0tcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEEyUFNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIFpNX0FVVEhfTU9ERV9XUEEyUFNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChtYWNwLT5zdXBJZVsxN10gPT0gMHhmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzE4XSA9PSAweGFjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzE5XSA9PSAweDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEEyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEEyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCBaTV9BVVRIX01PREVfV1BBMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hY3AtPnN1cEllWzIxXSA9PSAweDUwKSB8fCAobWFjcC0+c3VwSWVbMjJdID09IDB4ZjIpKS8vV1BBIG9yIFdQQVBTSworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYWNwLT5zdXBJZVsxMV0gPT0gMHgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1RLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdlcFN0YXR1cyhkZXYsIFpNX0VOQ1JZUFRJT05fVEtJUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFU1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3Mud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9BRVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXZXBTdGF0dXMoZGV2LCBaTV9FTkNSWVBUSU9OX0FFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYWNwLT5zdXBJZVsxN10gPT0gMHhmKSB8fCAobWFjcC0+c3VwSWVbMThdID09IDB4YWMpKSAvL1dQQTIgb3IgV1BBMlBTSworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYWNwLT5zdXBJZVsxM10gPT0gMHgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1RLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdlcFN0YXR1cyhkZXYsIFpNX0VOQ1JZUFRJT05fVEtJUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFU1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3Mud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9BRVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXZXBTdGF0dXMoZGV2LCBaTV9FTkNSWVBUSU9OX0FFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXcGFTdXBwb3J0KGRldiwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBXUEEgcmVsYXRlZCB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkaXNhYmxlXG4iKTsKKworICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V3BhU3VwcG9ydChkZXYsIDApOworICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgWk1fQVVUSF9NT0RFX09QRU4pOworICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgWk1fRU5DUllQVElPTl9XRVBfRElTQUJMRUQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIE5vdyB3ZSBvbmx5IHNldCB0aGUgbGVuZ3RoIGluIHRoZSBXUEEgSUUKKyAgICAgICAgICAgICAgICAgICAgICogZmllbGQgdG8gemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLy9tYWNwLT5jYXJkU2V0dGluZy5XUEFJZVsxXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fQ09VTlRFUk1FQVNVUkVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiPT09PT09PT09PT09PT09PVpEX1BBUkFNX0NPVU5URVJNRUFTVVJFUzogIik7CisKKyAgICAgICAgICAgICAgICBpZihhcmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1Db3VudGVyTWVhc3VyZVN0YXRlPTE7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW5hYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ291bnRlck1lYXN1cmVTdGF0ZT0wOworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImRpc2FibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG9wID09IFpEX1BBUkFNX0RST1BVTkVOQ1JZUFRFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlpEX1BBUkFNX0RST1BVTkVOQ1JZUFRFRDogIik7CisKKyAgICAgICAgICAgICAgICBpZihhcmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVuYWJsZVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZGlzYWJsZVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fQVVUSF9BTEdTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfUEFSQU1fQVVUSF9BTEdTOiAiKTsKKworICAgICAgICAgICAgICAgIGlmKGFyZyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJPUEVOX1NZU1RFTVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiU0hBUkVEX0tFWVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fV1BTX0ZJTFRFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlpEX1BBUkFNX1dQU19GSUxURVI6ICIpOworCisgICAgICAgICAgICAgICAgaWYoYXJnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ291bnRlck1lYXN1cmVTdGF0ZT0xOworICAgICAgICAgICAgICAgICAgICBtYWNwLT5mb3J3YXJkTWdtdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW5hYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ291bnRlck1lYXN1cmVTdGF0ZT0wOworICAgICAgICAgICAgICAgICAgICBtYWNwLT5mb3J3YXJkTWdtdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZGlzYWJsZVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9JT0NUTF9HRVRXUEFJRToKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSByZXFfd3BhaWU7CisgICAgICAgICAgICB1MTZfdCBhcElkLCBpLCBqOworCisgICAgICAgICAgICAvKiBHZXQgdGhlIEFQIElkICovCisgICAgICAgICAgICBhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworCisgICAgICAgICAgICBpZiAoYXBJZCA9PSAweGZmZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBJZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBJZCA9IGFwSWQrMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZyZXFfd3BhaWUsIGlmci0+aWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllKSkpeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2OiBjb3B5X2Zyb21fdXNlciBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IFpNX09BTF9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBJRUVFODAyMTFfQUREUl9MRU47IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkcltqXSAhPSByZXFfd3BhaWUud3BhX21hY2FkZHJbal0pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gNikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA8IFpNX09BTF9NQVhfU1RBX1NVUFBPUlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9wcmludGsoIlpEX0lPQ1RMX0dFVFdQQUlFIC0gc3RhIGluZGV4ID0gJWRcbiIsIGkpOworICAgICAgICAgICAgICAgIG1lbWNweShyZXFfd3BhaWUud3BhX2llLCBtYWNwLT5zdGF3cGFpZVtpXS53cGFfaWUsIElFRUU4MDIxMV9NQVhfSUVfU0laRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnJlcV93cGFpZSwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFyZXFfd3BhaWUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGNhc2UgWk1fSU9DVExfQ0VOQzoKKyAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmbWFjcC0+emRfd3BhX3JlcSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydjogY29weV9mcm9tX3VzZXIgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2JkcnZfY2VuY19pb2N0bChkZXYsIChzdHJ1Y3QgenlkYXNfY2VuY19wYXJhbSAqKSZtYWNwLT56ZF93cGFfcmVxKTsKKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9kdC5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYjk3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9kdC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogb2FsX2R0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBkYXRhIHR5cGUgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9PQUxfRFRfSAorI2RlZmluZSBfT0FMX0RUX0gKKworLyogUGxlYXNlIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGZvciBidWZmZXIgdHlwZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZmlsZSAqLworLyogUGxlYXNlIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGZvciBkZXZpY2UgdHlwZSBoZXJlICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKK3R5cGVkZWYgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgdTY0X3Q7Cit0eXBlZGVmICAgICB1bnNpZ25lZCBpbnQgICAgICAgIHUzMl90OwordHlwZWRlZiAgICAgdW5zaWduZWQgc2hvcnQgICAgICB1MTZfdDsKK3R5cGVkZWYgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgdThfdDsKK3R5cGVkZWYgICAgIGxvbmcgbG9uZyAgICAgICAgICAgczY0X3Q7Cit0eXBlZGVmICAgICBsb25nICAgICAgICAgICAgICAgIHMzMl90OwordHlwZWRlZiAgICAgc2hvcnQgICAgICAgICAgICAgICBzMTZfdDsKK3R5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgczhfdDsKKworI2lmbmRlZiAgICAgVFJVRQorI2RlZmluZSAgICAgVFJVRSAgICAgICAgICAgICAgICAoMT09MSkKKyNlbmRpZgorCisjaWZuZGVmICAgICBGQUxTRQorI2RlZmluZSAgICAgRkFMU0UgICAgICAgICAgICAgICAoMT09MCkKKyNlbmRpZgorCisjaWZuZGVmICAgICBOVUxMCisjZGVmaW5lICAgICBOVUxMICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKiBQbGVhc2UgaW5jbHVkZSBoZWFkZXIgZmlsZXMgZm9yIGJ1ZmZlciB0eXBlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmaWxlICovCit0eXBlZGVmICAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgIHpidWZfdDsKKworLyogUGxlYXNlIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGZvciBkZXZpY2UgdHlwZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZmlsZSAqLwordHlwZWRlZiAgICAgc3RydWN0IG5ldF9kZXZpY2UgICB6ZGV2X3Q7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9PQUxfRFRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9tYXJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4ZTRiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9tYXJjLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogb2FsX21hcmMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3YXJwcGVyIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9PQUxfTUFSQ19ICisjZGVmaW5lIF9PQUxfTUFSQ19ICisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2RlZmluZSBaTV9PU19MSU5VWF9GVU5DCisKKy8qKioqKiBDcml0aWNhbCBzZWN0aW9uICoqKioqLworLyogRGVjbGFyZSBmb3IgY3JpdGljYWwgc2VjdGlvbiAqLworI2lmbmRlZiBaTV9IQUxQTFVTX0xPQ0sKKyNkZWZpbmUgem13X2dldF93bGFuX2RldihkZXYpICAgIHN0cnVjdCB6c1dsYW5EZXYgKndkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSAoKCgoc3RydWN0IHVzYmRydl9wcml2YXRlKilkZXYtPnByaXYpLT53ZCkpCisKKyNkZWZpbmUgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKSB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKy8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyNkZWZpbmUgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCYoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKikoZGV2LT5wcml2KSktPmNzX2xvY2spLCBpcnFGbGFnKTsKKworLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLworI2RlZmluZSB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpIFwKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopKGRldi0+cHJpdikpLT5jc19sb2NrKSwgaXJxRmxhZyk7CisjZWxzZQorI2RlZmluZSB6bXdfZ2V0X3dsYW5fZGV2KGRldikgICAgc3RydWN0IHpzV2xhbkRldiAqd2QgPSB6ZndHZXRXbGFuRGV2KGRldik7CisKKy8qIERlY2xhcmUgZm9yIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyNkZWZpbmUgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKQorCisvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisjZGVmaW5lIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldikgXAorICAgICAgICB6ZndFbnRlckNyaXRpY2FsU2VjdGlvbihkZXYpOworCisvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisjZGVmaW5lIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldikgXAorICAgICAgICB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbihkZXYpOworI2VuZGlmCisKKy8qKioqKiBCeXRlIG9yZGVyIGNvbnZlcnRpbmcgKioqKiovCisjaWZkZWYgWk1fQ09ORklHX0JJR19FTkRJQU4KKyNkZWZpbmUgem13X2NwdV90b19sZTMyKHYpICAgICgoKHYgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmMDAwMCkgPj4gOCkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMGZmMDApIDw8IDgpICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwMDAwMGZmKSA8PCAyNCkpCisKKyNkZWZpbmUgem13X2xlMzJfdG9fY3B1KHYpICAgICgoKHYgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmMDAwMCkgPj4gOCkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMGZmMDApIDw8IDgpICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwMDAwMGZmKSA8PCAyNCkpCisKKyNkZWZpbmUgem13X2NwdV90b19sZTE2KHYpICAgICgoKHYgJiAweGZmMDApID4+IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZikgPDwgOCkpCisKKyNkZWZpbmUgem13X2xlMTZfdG9fY3B1KHYpICAgICgoKHYgJiAweGZmMDApID4+IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZikgPDwgOCkpCisjZWxzZQorI2RlZmluZSB6bXdfY3B1X3RvX2xlMzIodikgICAgKHYpCisjZGVmaW5lIHptd19sZTMyX3RvX2NwdSh2KSAgICAodikKKyNkZWZpbmUgem13X2NwdV90b19sZTE2KHYpICAgICh2KQorI2RlZmluZSB6bXdfbGUxNl90b19jcHUodikgICAgKHYpCisjZW5kaWYKKworLyoqKioqIEJ1ZmZlciBhY2Nlc3MgKioqKiovCisvKiBDYWxsZWQgdG8gcmVhZC93cml0ZSBidWZmZXIgKi8KKyNpZm5kZWYgWk1fSEFMUExVU19MT0NLCisKKyNkZWZpbmUgem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkKKyNkZWZpbmUgem13X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KSB6bXdfY3B1X3RvX2xlMTYoKih1MTZfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KSkKKyNkZWZpbmUgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KSA9IHZhbHVlCisjZGVmaW5lIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSAqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gem13X2NwdV90b19sZTE2KHZhbHVlKQorI2RlZmluZSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBidWYpICh1OF90KikoYnVmLT5kYXRhKQorCisjZWxzZQorCisjZGVmaW5lIHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgemZ3QnVmUmVhZEJ5dGUoZGV2LCBidWYsIG9mZnNldCkKKyNkZWZpbmUgem13X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KSB6ZndCdWZSZWFkSGFsZldvcmQoZGV2LCBidWYsIG9mZnNldCkKKyNkZWZpbmUgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHpmd0J1ZldyaXRlQnl0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKKyNkZWZpbmUgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHpmd0J1ZldyaXRlSGFsZldvcmQoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisjZGVmaW5lIHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIGJ1ZikgemZ3R2V0QnVmZmVyKGRldiwgYnVmKQorCisjZW5kaWYKKworLyoqKioqIERlYnVnIG1lc3NhZ2UgKioqKiovCisjaWYgMAorI2RlZmluZSB6bV9kZWJ1Z19tc2cwKG1zZykgcHJpbnRrKCIlczolc1xuIiwgX19GVU5DVElPTl9fLCBtc2cpOworI2RlZmluZSB6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJWxkXG4iLCBfX0ZVTkNUSU9OX18sIFwKKyAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkgcHJpbnRrKCIlczolcyVseGhcbiIsIF9fRlVOQ1RJT05fXywgXAorICAgICAgICBtc2csICh1MzJfdCl2YWwpOworI2RlZmluZSB6bV9kZWJ1Z19tc2dfcyhtc2csIHZhbCkgcHJpbnRrKCIlczolcyVzXG4iLCBfX0ZVTkNUSU9OX18sIFwKKyAgICAgICAgbXNnLCB2YWwpOworI2RlZmluZSB6bV9kZWJ1Z19tc2dfcChtc2csIHZhbDEsIHZhbDIpIHByaW50aygiJXM6JXMlMDFsZC4lMDJsZFxuIiwgX19GVU5DVElPTl9fLCBcCisgICAgICAgIG1zZywgKHZhbDEvdmFsMiksICgoKHZhbDEqMTAwKS92YWwyKSUxMDApKTsKKyNkZWZpbmUgem1fZGJnKFMpIHByaW50ayBTCisjZWxzZQorI2RlZmluZSB6bV9kZWJ1Z19tc2cwKG1zZykKKyNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkKKyNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkKKyNkZWZpbmUgem1fZGVidWdfbXNnX3MobXNnLCB2YWwpCisjZGVmaW5lIHptX2RlYnVnX21zZ19wKG1zZywgdmFsMSwgdmFsMikKKyNkZWZpbmUgem1fZGJnKFMpCisjZW5kaWYKKworI2RlZmluZSB6bV9hc3NlcnQoZXhwcikgaWYoIShleHByKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKCAiQXRoZW9ycyBBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLCAgIFwKKyAgICAgICAgI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworI2RlZmluZSBEYmdQcmludCBwcmludGsKKworI2VuZGlmIC8qICNpZm5kZWYgX09BTF9NQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlMDcwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5jCkBAIC0wLDAgKzEsMTE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiB1c2JkcnYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgbmV0d29yayBpbnRlcmZhY2UgdXAvZG93biByZWxhdGVkIGZ1bmN0aW9ucy4qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHNyYy91c2JkcnYuYyAqLworCisjZGVmaW5lIFpNX1BJQlNTX01PREUgICAwCisjZGVmaW5lIFpNX0FQX01PREUgICAgICAwCisjZGVmaW5lIFpNX0NIQU5ORUwgICAgICAxMQorI2RlZmluZSBaTV9XRVBfTU9NRSAgICAgMAorI2RlZmluZSBaTV9TSEFSRV9BVVRIICAgMAorI2RlZmluZSBaTV9ESVNBQkxFX1hNSVQgMAorCisjaW5jbHVkZSAidXNiZHJ2LmgiCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAiODAyMTFjb3JlL3B1Yl96ZmkuaCIKKworI2luY2x1ZGUgImxpbnV4L25ldGxpbmsuaCIKKyNpbmNsdWRlICJsaW51eC9ydG5ldGxpbmsuaCIKKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCisjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisjaW5jbHVkZSAiYXRocl9jb21tb24uaCIKKyNlbmRpZgorCitleHRlcm4gdm9pZCB6ZkR1bXBEZXNjcmlwdG9yKHpkZXZfdCogZGV2LCB1MTZfdCB0eXBlKTsKKy8vZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcik7CisKKy8vIElTUiBoYW5kbGVyCitpcnFyZXR1cm5fdCB1c2JkcnZfaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKKy8vIE5ldHdvcmsgRGV2aWNlIGludGVyZmFjZSByZWxhdGVkIGZ1bmN0aW9uCitpbnQgdXNiZHJ2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgdXNiZHJ2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICopOworaW50IHVzYmRydl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CitpbnQgdXNiZHJ2X3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKiwgdm9pZCAqKTsKK2ludCB1c2JkcnZfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgdXNiZHJ2X3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp1c2JkcnZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworCisvL3dpcmVsZXNzIGV4dGVuc2lvbiBoZWxwZXIgZnVuY3Rpb25zCitpbnQgdXNiZHJ2X2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKTsKK2ludCB1c2JkcnZfaW9jdGxfZ2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpOworaW50IHVzYmRydl9pb2N0bF9zZXRydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpOworLyogV2lyZWxlc3MgRXh0ZW5zaW9uIEhhbmRsZXIgZnVuY3Rpb25zICovCitpbnQgdXNiZHJ2d2V4dF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8qIGluZm8sCisgICAgICAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSk7CitpbnQgemZMbnhQcml2YXRlSW9jdGwoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwLCBzdHJ1Y3QgemRhcF9pb2N0bCAqemRyZXEpOworCit2b2lkIHpmTG54MTBtc1RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworaW50IHpmVW5yZWdpc3Rlcldkc0RldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB3ZHNJZCk7CitpbnQgemZSZWdpc3Rlcldkc0RldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB3ZHNJZCk7CitpbnQgemZXZHNPcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHpmV2RzQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgemZMbnhWYXBPcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHpmTG54VmFwQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgemZMbnhWYXBYbWl0RnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgemZMbnhSZWdpc3RlclZhcERldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB2YXBJZCk7CitpbnQgdXNiZHJ2X3dwYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXRocl93bGFuX3BhcmFtICp6ZHBhcm0pOworZXh0ZXJuIHUxNl90IHpmTG54R2V0VmFwSWQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmTG54Q2hlY2tUeEJ1ZmZlckNudCh6ZGV2X3QgKmRldik7CitleHRlcm4gVXNiVHhRX3QgKnpmTG54R2V0VXNiVHhCdWZmZXIoemRldl90ICpkZXYpOworCitleHRlcm4gdTE2X3QgemZMbnhBdXRoTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkcik7CitleHRlcm4gdTE2X3QgemZMbnhBc29jTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwgdTE2X3QgYm9keVNpemUsIHUxNl90IHBvcnQpOworZXh0ZXJuIHUxNl90IHpmTG54RGlzQXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CitleHRlcm4gdTE2X3QgemZMbnhBcENvbm5lY3ROb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpOworZXh0ZXJuIHZvaWQgemZMbnhDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90KiBic3NpZCk7CitleHRlcm4gdm9pZCB6ZkxueFNjYW5Ob3RpZnkoemRldl90KiBkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQqIHJlc3VsdCk7CitleHRlcm4gdm9pZCB6ZkxueFN0YXRpc3RpY3NOb3RpZnkoemRldl90KiBkZXYsIHN0cnVjdCB6c1N0YXN0aWNzKiByZXN1bHQpOworZXh0ZXJuIHZvaWQgemZMbnhNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3Qgc3RhdHVzKTsKK2V4dGVybiB2b2lkIHpmTG54QXBNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1Zik7CitleHRlcm4gdm9pZCB6ZkxueElic3NQYXJ0bmVyTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpOworZXh0ZXJuIHZvaWQgemZMbnhNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKK2V4dGVybiB2b2lkIHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworZXh0ZXJuIHZvaWQgemZMbnhSZWN2RXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CitleHRlcm4gdm9pZCB6ZkxueFJlc3RvcmVCdWZEYXRhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKK2V4dGVybiB1MTZfdCB6ZkxueENlbmNBc29jTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwgdTE2X3QgYm9keVNpemUsIHUxNl90IHBvcnQpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK2V4dGVybiB2b2lkIHpmTG54V2F0Y2hEb2dOb3RpZnkoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZMbnhSZWN2ODAyMTEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOworZXh0ZXJuIHU4X3QgemZMbnhDcmVhdGVUaHJlYWQoemRldl90ICpkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgUCBVIEIgTCBJIEMgICBEIEEgVCBBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKiBEZWZpbml0aW9uIG9mIFdpcmVsZXNzIEV4dGVuc2lvbiAqLworCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisvL3dpcmVsZXNzIGV4dGVuc2lvbiBoZWxwZXIgZnVuY3Rpb25zCitleHRlcm4gaW50IHVzYmRydl9pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSk7CitleHRlcm4gaW50IHVzYmRydl9pb2N0bF9zZXRydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpOworLyogV2lyZWxlc3MgRXh0ZW5zaW9uIEhhbmRsZXIgZnVuY3Rpb25zICovCitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcGFyYW0gKnNlbnMsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKk1hY0FkZHIsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKk1hY0FkZHIsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICplc3NpZCwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXNzaWQsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCSAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCSAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXd0eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3cmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkgICAgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworLyoKKyAqIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycworICovCisKK3N0cnVjdCBpd19wcml2X2FyZ3MgdXNiZHJ2X3ByaXZhdGVfYXJnc1tdID0geworLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDAsIDAsIDAsICJsaXN0X2JzcyIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHgxLCAwLCAwLCAiY2FyZF9yZXNldCIgfSwKKyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4MiwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfYXV0aCIgfSwgIC8qIDAgLSBvcGVuLCAxIC0gc2hhcmVkIGtleSAqLworICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHgzLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEyLCAiZ2V0X2F1dGgiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4NCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfcHJlYW1ibGUiIH0sICAvKiAwIC0gbG9uZywgMSAtIHNob3J0ICovCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4NSwgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCA2LCAiZ2V0X3ByZWFtYmxlIiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDYsIDAsIDAsICJjbnQiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4NywgMCwgMCwgInJlZ3MiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4OCwgMCwgMCwgInByb2JlIiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDksIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZGJnX2ZsYWciIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4QSwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJjb25uZWN0IiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweEIsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0X21hY19tb2RlIiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweEMsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTIsICJnZXRfbWFjX21vZGUiIH0sCit9OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKK3N0YXRpYyBpd19oYW5kbGVyIHVzYmRydndleHRfaGFuZGxlcltdID0geworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXduYW1lLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTkFNRSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdmcmVxLCAgICAgICAgICAgICAgICAvKiBTSU9DU0lXRlJFUSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd2ZyZXEsICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdGUkVRICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3bW9kZSwgICAgICAgICAgICAgICAgLyogU0lPQ1NJV01PREUgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdtb2RlLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTU9ERSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3NlbnMsICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3c2VucywgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogbm90IHVzZWQgKi8gICAgICAgICAgICAgICAvKiBTSU9DU0lXUkFOR0UgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdyYW5nZSwgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkFOR0UgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogbm90IHVzZWQgKi8gICAgICAgICAgICAgICAvKiBTSU9DU0lXUFJJViAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBrZXJuZWwgY29kZSAqLyAgICAgICAgICAgIC8qIFNJT0NHSVdQUklWICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qIG5vdCB1c2VkICovICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NUQVRTICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qIGtlcm5lbCBjb2RlICovICAgICAgICAgICAgLyogU0lPQ0dJV1NUQVRTICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd2FwLCAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd2FwLCAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBUCAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2l3YXBsaXN0LCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KKyNpZiBXSVJFTEVTU19FWFQgPiAxMworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3NjYW4sICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTQ0FOICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3c2NhbiwgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NDQU4gKi8KKyNlbHNlIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qIG51bGwgKi8gICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogbnVsbCAqLyAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0NBTiAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3ZXNzaWQsICAgICAgICAgICAgICAgLyogU0lPQ1NJV0VTU0lEICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3ZXNzaWQsICAgICAgICAgICAgICAgLyogU0lPQ0dJV0VTU0lEICovCisKKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXduaWNrbiwgICAgICAgICAgICAgICAvKiBTSU9DU0lXTklDS04gKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXduaWNrbiwgICAgICAgICAgICAgICAvKiBTSU9DR0lXTklDS04gKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3JhdGUsICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3cmF0ZSwgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdydHMsICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUlRTICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3cnRzLCAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JUUyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd2ZyYWcsICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdGUkFHICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3ZnJhZywgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0ZSQUcgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXd0eHBvdywgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXd0eHBvdywgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdyZXRyeSwgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdyZXRyeSwgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdlbmNvZGUsICAgICAgICAgICAgICAvKiBTSU9DU0lXRU5DT0RFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3ZW5jb2RlLCAgICAgICAgICAgICAgLyogU0lPQ0dJV0VOQ09ERSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3Bvd2VyLCAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQT1dFUiAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3Bvd2VyLCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAqLworfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgdXNiZHJ2X3ByaXZhdGVfaGFuZGxlcltdID0KK3sKKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldHBhcmFtLAkJLyogU0lPQ1dGSVJTVFBSSVYrMCAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2V0cGFyYW0sCQkvKiBTSU9DV0ZJUlNUUFJJVisxICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXRrZXksCQkgICAgLyogU0lPQ1dGSVJTVFBSSVYrMiAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0d21tcGFyYW1zLAkvKiBTSU9DV0ZJUlNUUFJJViszICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9kZWxrZXksCQkgICAgLyogU0lPQ1dGSVJTVFBSSVYrNCAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2V0d21tcGFyYW1zLAkvKiBTSU9DV0ZJUlNUUFJJVis1ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXRtbG1lLAkJLyogU0lPQ1dGSVJTVFBSSVYrNiAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2V0Y2hhbmluZm8sCS8qIFNJT0NXRklSU1RQUklWKzcgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldG9wdGllLAkJLyogU0lPQ1dGSVJTVFBSSVYrOCAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2V0b3B0aWUsCQkvKiBTSU9DV0ZJUlNUUFJJVis5ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9hZGRtYWMsCQkgICAgLyogU0lPQ1dGSVJTVFBSSVYrMTAgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldHNjYW5yZXN1bHRzLAkvKiBTSU9DV0ZJUlNUUFJJVisxMSAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZGVsbWFjLAkJICAgIC8qIFNJT0NXRklSU1RQUklWKzEyICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRjaGFubGlzdCwJLyogU0lPQ1dGSVJTVFBSSVYrMTMgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldGNoYW5saXN0LAkvKiBTSU9DV0ZJUlNUUFJJVisxNCAqLworCS8vKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1dGSVJTVFBSSVYrMTUgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2NoYW5zd2l0Y2gsCSAgICAvKiBTSU9DV0ZJUlNUUFJJVisxNiAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0bW9kZSwJCS8qIFNJT0NXRklSU1RQUklWKzE3ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRtb2RlLAkJLyogU0lPQ1dGSVJTVFBSSVYrMTggKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgIC8qIFNJT0NJV0ZJUlNUUFJJViAqLworfTsKKworc3RhdGljIHN0cnVjdCBpd19oYW5kbGVyX2RlZiBwODAyMTF3ZXh0X2hhbmRsZXJfZGVmID0geworICAgIC5udW1fc3RhbmRhcmQgPSBzaXplb2YodXNiZHJ2d2V4dF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKyAgICAubnVtX3ByaXZhdGUgPSBzaXplb2YodXNiZHJ2X3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorICAgIC5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKHVzYmRydl9wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKyAgICAuc3RhbmRhcmQgPSB1c2JkcnZ3ZXh0X2hhbmRsZXIsCisgICAgLnByaXZhdGUgPSAoaXdfaGFuZGxlciAqKSB1c2JkcnZfcHJpdmF0ZV9oYW5kbGVyLAorICAgIC5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSB1c2JkcnZfcHJpdmF0ZV9hcmdzCit9OworI2VuZGlmCisKKy8qIFdEUyAqLworLy9zdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07CisvL3ZvaWQgemZJbml0V2RzU3RydWN0KHZvaWQpOworCisvKiBWQVAgKi8KK3N0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKK3ZvaWQgemZMbnhJbml0VmFwU3RydWN0KHZvaWQpOworCisKKy8qKgorICogdXNiZHJ2X2ludHIgLSBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGlycTogdGhlIElSUSBudW1iZXIKKyAqIEBkZXZfaW5zdDogdGhlIG5ldF9kZXZpY2Ugc3RydWN0CisgKiBAcmVnczogcmVnaXN0ZXJzICh1bnVzZWQpCisgKgorICogVGhpcyByb3V0aW5lIGlzIHRoZSBJU1IgZm9yIHRoZSB1c2JkcnYgYm9hcmQuIEl0IHNlcnZpY2VzCisgKiB0aGUgUlggJiBUWCBxdWV1ZXMgJiBzdGFydHMgdGhlIFJVIGlmIGl0IGhhcyBzdG9wcGVkIGR1ZQorICogdG8gbm8gcmVzb3VyY2VzLgorICovCitpcnFyZXR1cm5fdCB1c2JkcnZfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3A7CisKKyAgICBkZXYgPSBkZXZfaW5zdDsKKyAgICBtYWNwID0gZGV2LT5tbF9wcml2OworCisKKyAgICAvKiBSZWFkIHJlZ2lzdGVyIGVycm9yLCBjYXJkIG1heSBiZSB1bnBsdWdlZCAqLworICAgIGlmICgwKS8vKGludHJfc3RhdHVzID09IC0xKQorICAgICAgICByZXR1cm4gSVJRX05PTkU7CisKKyAgICAvKiB0aGUgZGV2aWNlIGlzIGNsb3NlZCwgZG9uJ3QgY29udGludWUgb3IgZWxzZSBiYWQgdGhpbmdzIG1heSBoYXBwZW4uICovCisgICAgaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKyAgICAgICAgcmV0dXJuIElSUV9OT05FOworICAgIH0KKworICAgIGlmIChtYWNwLT5kcml2ZXJfaXNvbGF0ZWQpIHsKKyAgICAgICAgcmV0dXJuIElSUV9OT05FOworICAgIH0KKworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKKyAgICAvL3pmaUlzclBjaShkZXYpOworI2VuZGlmCisKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCB1c2JkcnZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICBpbnQgcmMgPSAwOworICAgIHUxNl90IHNpemU7CisgICAgdm9pZCogbWVtOworICAgIC8vdW5zaWduZWQgY2hhciBhZGRyWzZdOworICAgIHN0cnVjdCB6c0NiRnVuY1RibCBjYkZ1bmNUYmw7CisKKyAgICBwcmludGsoIkVudGVyIG9wZW4oKVxuIik7CisKKy8vI2lmbmRlZiBDT05GSUdfU01QCisvLyAgICByZWFkX2xvY2soJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKy8vI2VuZGlmCisgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkgeworICAgICAgICByYyA9IC1FQlVTWTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHNpemUgPSB6ZmlHbG9iYWxEYXRhU2l6ZShkZXYpOworICAgIGlmICgobWVtID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJjID0gLUVCVVNZOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIG1hY3AtPndkID0gbWVtOworCisgICAgbWVtc2V0KCZjYkZ1bmNUYmwsIDAsIHNpemVvZihzdHJ1Y3QgenNDYkZ1bmNUYmwpKTsKKyAgICBjYkZ1bmNUYmwuemZjYkF1dGhOb3RpZnkgPSB6ZkxueEF1dGhOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JBdXRoTm90aWZ5ID0gemZMbnhBdXRoTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiQXNvY05vdGlmeSA9IHpmTG54QXNvY05vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYkRpc0Fzb2NOb3RpZnkgPSB6ZkxueERpc0Fzb2NOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JBcENvbm5lY3ROb3RpZnkgPSB6ZkxueEFwQ29ubmVjdE5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYkNvbm5lY3ROb3RpZnkgPSB6ZkxueENvbm5lY3ROb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JTY2FuTm90aWZ5ID0gemZMbnhTY2FuTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiTWljRmFpbHVyZU5vdGlmeSA9IHpmTG54TWljRmFpbHVyZU5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYkFwTWljRmFpbHVyZU5vdGlmeSA9IHpmTG54QXBNaWNGYWlsdXJlTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiSWJzc1BhcnRuZXJOb3RpZnkgPSB6ZkxueElic3NQYXJ0bmVyTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiTWFjQWRkcmVzc05vdGlmeSA9IHpmTG54TWFjQWRkcmVzc05vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYlNlbmRDb21wbGV0ZUluZGljYXRpb24gPSB6ZkxueFNlbmRDb21wbGV0ZUluZGljYXRpb247CisgICAgY2JGdW5jVGJsLnpmY2JSZWN2RXRoID0gemZMbnhSZWN2RXRoOworICAgIGNiRnVuY1RibC56ZmNiUmVjdjgwMjExID0gemZMbnhSZWN2ODAyMTE7CisgICAgY2JGdW5jVGJsLnpmY2JSZXN0b3JlQnVmRGF0YSA9IHpmTG54UmVzdG9yZUJ1ZkRhdGE7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICBjYkZ1bmNUYmwuemZjYkNlbmNBc29jTm90aWZ5ID0gemZMbnhDZW5jQXNvY05vdGlmeTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgY2JGdW5jVGJsLnpmY2JId1dhdGNoRG9nTm90aWZ5ID0gemZMbnhXYXRjaERvZ05vdGlmeTsKKyAgICB6ZmlXbGFuT3BlbihkZXYsICZjYkZ1bmNUYmwpOworCisjaWYgMAorICAgIHsKKyAgICAgICAgLy91MTZfdCBtYWNbM10gPSB7MHgxMzAwLCAweGI2ZDQsIDB4NWFhZn07CisgICAgICAgIHUxNl90IG1hY1szXSA9IHsweDgwMDAsIDB4MDBhYiwgMHgwMDAwfTsKKyAgICAgICAgLy96ZmlXbGFuU2V0TWFjQWRkcmVzcyhkZXYsIG1hYyk7CisgICAgfQorICAgIC8qIE1BQyBhZGRyZXNzICovCisgICAgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyhkZXYsIGFkZHIpOworICAgIGRldi0+ZGV2X2FkZHJbMF0gPSBhZGRyWzBdOworICAgIGRldi0+ZGV2X2FkZHJbMV0gPSBhZGRyWzFdOworICAgIGRldi0+ZGV2X2FkZHJbMl0gPSBhZGRyWzJdOworICAgIGRldi0+ZGV2X2FkZHJbM10gPSBhZGRyWzNdOworICAgIGRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOworICAgIGRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOworI2VuZGlmCisgICAgLy96ZndNYWNBZGRyZXNzTm90aWZ5KCkgd2lsbCBiZSBjYWxsZWQgdG8gc2V0dXAgZGV2LT5kZXZfYWRkcltdCisKKyAgICB6ZkxueENyZWF0ZVRocmVhZChkZXYpOworCisgICAgbW9kX3RpbWVyKCYobWFjcC0+aGJUaW1lcjEwbXMpLCBqaWZmaWVzICsgKDEqSFopLzEwMCk7ICAgLy8xMCBtcworCisgICAgbmV0aWZfY2Fycmllcl9vbihkZXYpOworCisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworI2lmIFpNX0FQX01PREUgPT0gMQorICAgIHpmaVdsYW5TZXRXbGFuTW9kZShkZXYsIFpNX01PREVfQVApOworICAgIHpmaVdsYW5TZXRCYXNpY1JhdGUoZGV2LCAweGYsIDAsIDApOworICAgIHpmaVdsYW5TZXRTU0lEKGRldiwgIk9UVVNfQ1dZIiwgOCk7CisgICAgemZpV2xhblNldER0aW1Db3VudChkZXYsIDMpOworCisgICNpZiBaTV9XRVBfTU9NRSA9PSAxCisgICAgeworICAgICAgICB1OF90IGtleVsxNl0gPSB7MHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHg5MH07CisgICAgICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKworICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IDU7CisgICAgICAgIGtleUluZm8ua2V5SW5kZXggPSAwOworICAgICAgICBrZXlJbmZvLmZsYWcgPSAwOworICAgICAgICBrZXlJbmZvLmtleSA9IGtleTsKKyAgICAgICAgemZpV2xhblNldEtleShkZXYsIGtleUluZm8pOworCisgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9XRVA2NCk7CisgICAgfQorCisgICAgI2lmIFpNX1NIQVJFX0FVVEggPT0gMQorICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCAxKTsKKyAgICAjZW5kaWYgLy8jaWYgWk1fU0hBUkVfQVVUSCA9PSAxCisgICNlbmRpZiAvLyNpZiBaTV9XRVBfTU9NRSA9PSAxCisKKyNlbGlmIFpNX1BJQlNTX01PREUgPT0gMQorICAgIHpmaVdsYW5TZXRXbGFuTW9kZShkZXYsIFpNX01PREVfUFNFVURPKTsKKyNlbHNlCisgICAgemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSk7CisjZW5kaWYKKyAgICAvL3pmaVdsYW5TZXRDaGFubmVsKGRldiwgWk1fQ0hBTk5FTCwgRkFMU0UpOworICAgIHpmaVdsYW5TZXRGcmVxdWVuY3koZGV2LCAyNDYyMDAwLCBGQUxTRSk7CisgICAgemZpV2xhblNldFJ0c1RocmVzaG9sZChkZXYsIDMyNzY3KTsKKyAgICB6ZmlXbGFuU2V0RnJhZ1RocmVzaG9sZChkZXYsIDApOworCisgICAgemZpV2xhbkVuYWJsZShkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICBtYWNwLT5uZXRsaW5rX3NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfVVNFUlNPQ0ssIDEsIE5VTEwsIFRISVNfTU9EVUxFKTsKKworICAgIGlmIChtYWNwLT5uZXRsaW5rX3NrID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbid0IGNyZWF0ZSBORVRMSU5LIHNvY2tldFxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICBtYWNwLT5EZXZpY2VPcGVuZWQgPSAxOworZXhpdDoKKy8vI2lmbmRlZiBDT05GSUdfU01QCisvLyAgICByZWFkX3VubG9jaygmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworLy8jZW5kaWYKKyAgICAvL3pmUmVnaXN0ZXJXZHNEZXYoZGV2LCAwKTsKKyAgICAvL3pmTG54UmVnaXN0ZXJWYXBEZXYoZGV2LCAwKTsKKworICAgIHJldHVybiByYzsKK30KKworCisKKworLyoqCisgKiB1c2JkcnZfZ2V0X3N0YXRzIC0gZ2V0IGRyaXZlciBzdGF0aXN0aWNzCisgKiBAZGV2OiBhZGFwdGVyJ3MgbmV0X2RldmljZSBzdHJ1Y3QKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIE9TIHdhbnRzIHRoZSBhZGFwdGVyJ3Mgc3RhdHMgcmV0dXJuZWQuCisgKiBJdCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXRfZGV2aWNlX3N0YXRzIHN0dWN0dXJlIGZvciB0aGUgZGV2aWNlLgorICogSWYgdGhlIHN0YXRpc3RpY3MgYXJlIGN1cnJlbnRseSBiZWluZyB1cGRhdGVkLCB0aGVuIHRoZXkgbWlnaHQgYmUgaW5jb3JyZWN0CisgKiBmb3IgYSBzaG9ydCB3aGlsZS4gSG93ZXZlciwgc2luY2UgdGhpcyBjYW5ub3QgYWN0dWFsbHkgY2F1c2UgZGFtYWdlLCBubworICogbG9ja2luZyBpcyB1c2VkLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogdXNiZHJ2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMudHhfZXJyb3JzID0KKyAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArCisgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CisKKyAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X2Vycm9ycyA9CisgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycyArCisgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzICsKKyAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOworCisKKyAgICByZXR1cm4gJihtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzKTsKK30KKworCisvKioKKyAqIHVzYmRydl9zZXRfbWFjIC0gc2V0IHRoZSBNQUMgYWRkcmVzcworICogQGRldjogYWRhcHRlcidzIG5ldF9kZXZpY2Ugc3RydWN0CisgKiBAYWRkcjogdGhlIG5ldyBhZGRyZXNzCisgKgorICogVGhpcyByb3V0aW5lIHNldHMgdGhlIGV0aGVybmV0IGFkZHJlc3Mgb2YgdGhlIGJvYXJkCisgKiBSZXR1cm5zOgorICogMCAgLSBpZiBzdWNjZXNzZnVsCisgKiAtMSAtIG90aGVyd2lzZQorICovCisKK2ludCB1c2JkcnZfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcDsKKyAgICBpbnQgcmMgPSAtMTsKKworICAgIG1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgcmVhZF9sb2NrKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisKKyAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICByYyA9IDA7CisKKworZXhpdDoKKyAgICByZWFkX3VubG9jaygmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworICAgIHJldHVybiByYzsKK30KKworCisKK3ZvaWQKK3VzYmRydl9pc29sYXRlX2RyaXZlcihzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApCit7CisjaWZuZGVmIENPTkZJR19TTVAKKyAgICB3cml0ZV9sb2NrX2lycSgmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworI2VuZGlmCisgICAgbWFjcC0+ZHJpdmVyX2lzb2xhdGVkID0gVFJVRTsKKyNpZm5kZWYgQ09ORklHX1NNUAorICAgIHdyaXRlX3VubG9ja19pcnEoJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKyNlbmRpZgorCisgICAgaWYgKG5ldGlmX3J1bm5pbmcobWFjcC0+ZGV2aWNlKSkKKyAgICB7CisgICAgICAgIG5ldGlmX2NhcnJpZXJfb2ZmKG1hY3AtPmRldmljZSk7CisgICAgICAgIG5ldGlmX3N0b3BfcXVldWUobWFjcC0+ZGV2aWNlKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgVkxBTl9TSVpFICAgCTQKK2ludCB1c2JkcnZfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKyAgICBpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiAoRVRIX0RBVEFfTEVOICsgVkxBTl9TSVpFKSkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgZGV2LT5tdHUgPSBuZXdfbXR1OworICAgIHJldHVybiAwOworfQorCit2b2lkIHpmTG54VW5saW5rQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApOworCitpbnQgdXNiZHJ2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CitleHRlcm4gdm9pZCB6ZkhwTGVkQ3RybChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTZfdCBsZWRJZCwgdThfdCBtb2RlKTsKKworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIHByaW50ayhLRVJOX0RFQlVHICJ1c2JkcnZfY2xvc2VcbiIpOworCisgICAgbmV0aWZfY2Fycmllcl9vZmYobWFjcC0+ZGV2aWNlKTsKKworICAgIGRlbF90aW1lcl9zeW5jKCZtYWNwLT5oYlRpbWVyMTBtcyk7CisKKyAgICBwcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2X25ldGlmX2NhcnJpZXJfb2ZmXG4iKTsKKworICAgIHVzYmRydl9pc29sYXRlX2RyaXZlcihtYWNwKTsKKworICAgIHByaW50ayhLRVJOX0RFQlVHICJ1c2JkcnZfaXNvbGF0ZV9kcml2ZXJcbiIpOworCisgICAgbmV0aWZfY2Fycmllcl9vZmYobWFjcC0+ZGV2aWNlKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIC8qIENFTkMgKi8KKyAgICBpZiAobWFjcC0+bmV0bGlua19zayAhPSBOVUxMKQorICAgIHsKKyAgICAvLyAgICBzb2NrX3JlbGVhc2UobWFjcC0+bmV0bGlua19zayk7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2IGNsb3NlIG5ldGxpbmsgc29ja2V0XG4iKTsKKyAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKKyAgICAvL2ZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworI2VuZGlmCisKKyAgICAvKiBUdXJuIG9mZiBMRUQgKi8KKyAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisKKyAgICAvKiBEZWxheSBmb3IgYSB3aGlsZSAqLworICAgIG1kZWxheSgxMCk7CisKKyAgICAvKiBjbGVhciBXUEEvUlNOIElFICovCisgICAgbWFjcC0+c3VwSWVbMV0gPSAwOworCisgICAgLyogc2V0IHRoZSBpc29sYXRlIGZsYWcgdG8gZmFsc2UsIHNvIHVzYmRydl9vcGVuIGNhbiBiZSBjYWxsZWQgKi8KKyAgICBtYWNwLT5kcml2ZXJfaXNvbGF0ZWQgPSBGQUxTRTsKKworICAgIHpmaVdsYW5DbG9zZShkZXYpOworICAgIGtmcmVlKG1hY3AtPndkKTsKKworICAgIHpmTG54VW5saW5rQWxsVXJicyhtYWNwKTsKKworICAgIHJldHVybiAwOworfQorCisKKworCitpbnQgdXNiZHJ2X3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgbm90aWZ5X3N0b3AgPSBGQUxTRTsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyNpZiAwCisgICAgLyogVGVzdCBjb2RlICovCisgICAgeworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiogczsKKworICAgICAgICBzID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgOCwgMCwgR0ZQX0FUT01JQyk7CisgICAgICAgIHNrYl9wdXNoKHMsIDgpOworICAgICAgICBzLT5kYXRhWzBdID0gJ3onOworICAgICAgICBzLT5kYXRhWzFdID0gJ3knOworICAgICAgICBzLT5kYXRhWzJdID0gJ2QnOworICAgICAgICBzLT5kYXRhWzNdID0gJ2EnOworICAgICAgICBzLT5kYXRhWzRdID0gJ3MnOworICAgICAgICBwcmludGsoImxlbjE9JWQsIGxlbjI9JWQiLCBza2ItPmxlbiwgcy0+bGVuKTsKKyAgICAgICAgbmV0bGlua19icm9hZGNhc3QocnRubCwgcywgMCwgUlRNR1JQX0xJTkssIEdGUF9BVE9NSUMpOworICAgIH0KKyNlbmRpZgorCisjaWYgWk1fRElTQUJMRV9YTUlUCisgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKyNlbHNlCisgICAgemZpVHhTZW5kRXRoKGRldiwgc2tiLCAwKTsKKyNlbmRpZgorICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisKKyAgICAvL2Rldl9rZnJlZV9za2JfaXJxKHNrYik7CisKKyAgICBpZiAobm90aWZ5X3N0b3ApIHsKKyAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKyAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKworCit2b2lkIHVzYmRydl9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCisgICAgaWYgKCEoZGV2LT5mbGFncyAmIElGRl9VUCkpCisgICAgICAgIHJldHVybjsKKworICAgICAgICByZXR1cm47CisKK30KKworCisKKy8qKgorICogdXNiZHJ2X2NsZWFyX3N0cnVjdHMgLSBmcmVlIHJlc291cmNlcworCisgKiBAZGV2OiBhZGFwdGVyJ3MgbmV0X2RldmljZSBzdHJ1Y3QKKyAqCisgKiBGcmVlIGFsbCBkZXZpY2Ugc3BlY2lmaWMgc3RydWN0cywgdW5tYXAgaS9vIGFkZHJlc3MsIGV0Yy4KKyAqLwordm9pZCB1c2JkcnZfY2xlYXJfc3RydWN0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworCisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorICAgIGlvdW5tYXAobWFjcC0+cmVncCk7CisKKyAgICBwY2lfcmVsZWFzZV9yZWdpb25zKG1hY3AtPnBkZXYpOworICAgIHBjaV9kaXNhYmxlX2RldmljZShtYWNwLT5wZGV2KTsKKyAgICBwY2lfc2V0X2RydmRhdGEobWFjcC0+cGRldiwgTlVMTCk7CisjZW5kaWYKKworICAgIGtmcmVlKG1hY3ApOworCisgICAga2ZyZWUoZGV2KTsKKworfQorCit2b2lkIHVzYmRydl9yZW1vdmUxKHN0cnVjdCBwY2lfZGV2ICpwY2lkKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwOworCisgICAgaWYgKCEoZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHBjaV9nZXRfZHJ2ZGF0YShwY2lkKSkpCisgICAgICAgIHJldHVybjsKKworICAgIG1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIHVzYmRydl9jbGVhcl9zdHJ1Y3RzKGRldik7Cit9CisKKwordm9pZCB6ZkxueDEwbXNUaW1lcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIG1vZF90aW1lcigmKG1hY3AtPmhiVGltZXIxMG1zKSwgamlmZmllcyArICgxKkhaKS8xMDApOyAgIC8vMTAgbXMKKyAgICB6ZmlIZWFydEJlYXQoZGV2KTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZMbnhJbml0VmFwU3RydWN0KHZvaWQpCit7CisgICAgdTE2X3QgaTsKKworICAgIGZvciAoaT0wOyBpPFpNX1ZBUF9QT1JUX05VTUJFUjsgaSsrKQorICAgIHsKKyAgICAgICAgdmFwW2ldLmRldiA9IE5VTEw7CisgICAgICAgIHZhcFtpXS5vcGVuRmxhZyA9IDA7CisgICAgfQorfQorCitpbnQgemZMbnhWYXBPcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdTE2X3QgdmFwSWQ7CisKKyAgICB2YXBJZCA9IHpmTG54R2V0VmFwSWQoZGV2KTsKKworICAgIGlmICh2YXBbdmFwSWRdLm9wZW5GbGFnID09IDApCisgICAgeworICAgICAgICB2YXBbdmFwSWRdLm9wZW5GbGFnID0gMTsKKyAgICAJcHJpbnRrKCJ6ZkxueFZhcE9wZW4gOiBkZXZpY2UgbmFtZT0lcywgdmFwIElEPSVkXG4iLCBkZXYtPm5hbWUsIHZhcElkKTsKKyAgICAJemZpV2xhblNldFNTSUQoZGV2LCAidmFwMSIsIDQpOworICAgIAl6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50aygiVkFQIG9wZW5lZCBlcnJvciA6IHZhcCBJRD0lZFxuIiwgdmFwSWQpOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworaW50IHpmTG54VmFwQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB1MTZfdCB2YXBJZDsKKworICAgIHZhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworCisgICAgaWYgKHZhcElkICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGlmICh2YXBbdmFwSWRdLm9wZW5GbGFnID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiemZMbnhWYXBDbG9zZTogZGV2aWNlIG5hbWU9JXMsIHZhcCBJRD0lZFxuIiwgZGV2LT5uYW1lLCB2YXBJZCk7CisKKyAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAgICAgICAgIHZhcFt2YXBJZF0ub3BlbkZsYWcgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJWQVAgcG9ydCB3YXMgbm90IG9wZW5lZCA6IHZhcCBJRD0lZFxuIiwgdmFwSWQpOworICAgICAgICB9CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgemZMbnhWYXBYbWl0RnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgbm90aWZ5X3N0b3AgPSBGQUxTRTsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgdmFwSWQ7CisKKyAgICB2YXBJZCA9IHpmTG54R2V0VmFwSWQoZGV2KTsKKyAgICAvL3ByaW50aygiemZMbnhWYXBYbWl0RnJhbWU6IHZhcCBJRD0lZFxuIiwgdmFwSWQpOworICAgIC8vcHJpbnRrKCJ6ZkxueFZhcFhtaXRGcmFtZSgpLCBza2I9JWx4aFxuIiwgKHUzMl90KXNrYik7CisKKyAgICBpZiAodmFwSWQgPj0gWk1fVkFQX1BPUlRfTlVNQkVSKQorICAgIHsKKyAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2lmIDEKKyAgICBpZiAodmFwW3ZhcElkXS5vcGVuRmxhZyA9PSAwKQorICAgIHsKKyAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisKKworICAgIHpmaVR4U2VuZEV0aChkZXYsIHNrYiwgMHgxKTsKKworICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisKKyAgICAvL2Rldl9rZnJlZV9za2JfaXJxKHNrYik7CisKKyAgICBpZiAobm90aWZ5X3N0b3ApIHsKKyAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKyAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgemZMbnhSZWdpc3RlclZhcERldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB2YXBJZCkKK3sKKyAgICAvKiBBbGxvY2F0ZSBuZXQgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIHZhcFt2YXBJZF0uZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisgICAgcHJpbnRrKCJSZWdpc3RlciB2YXAgZGV2PSV4XG4iLCAodTMyX3QpdmFwW3ZhcElkXS5kZXYpOworCisgICAgaWYodmFwW3ZhcElkXS5kZXYgPT0gTlVMTCkgeworICAgICAgICBwcmludGsoImFsbG9jX2V0aGVyZGV2IGZhaWxcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICAvKiBTZXR1cCB0aGUgZGVmYXVsdCBzZXR0aW5ncyAqLworICAgIGV0aGVyX3NldHVwKHZhcFt2YXBJZF0uZGV2KTsKKworICAgIC8qIE1BQyBhZGRyZXNzICovCisgICAgbWVtY3B5KHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkciwgcGFyZW50RGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisgICAgdmFwW3ZhcElkXS5kZXYtPmlycSA9IHBhcmVudERldi0+aXJxOworICAgIHZhcFt2YXBJZF0uZGV2LT5iYXNlX2FkZHIgPSBwYXJlbnREZXYtPmJhc2VfYWRkcjsKKyAgICB2YXBbdmFwSWRdLmRldi0+bWVtX3N0YXJ0ID0gcGFyZW50RGV2LT5tZW1fc3RhcnQ7CisgICAgdmFwW3ZhcElkXS5kZXYtPm1lbV9lbmQgPSBwYXJlbnREZXYtPm1lbV9lbmQ7CisgICAgdmFwW3ZhcElkXS5kZXYtPm1sX3ByaXYgPSBwYXJlbnREZXYtPm1sX3ByaXY7CisKKyAgICAvL2Rldi0+aGFyZF9zdGFydF94bWl0ID0gJnpkMTIxMl93ZHNfeG1pdF9mcmFtZTsKKyAgICB2YXBbdmFwSWRdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJnpmTG54VmFwWG1pdEZyYW1lOworICAgIHZhcFt2YXBJZF0uZGV2LT5vcGVuID0gJnpmTG54VmFwT3BlbjsKKyAgICB2YXBbdmFwSWRdLmRldi0+c3RvcCA9ICZ6ZkxueFZhcENsb3NlOworICAgIHZhcFt2YXBJZF0uZGV2LT5nZXRfc3RhdHMgPSAmdXNiZHJ2X2dldF9zdGF0czsKKyAgICB2YXBbdmFwSWRdLmRldi0+Y2hhbmdlX210dSA9ICZ1c2JkcnZfY2hhbmdlX210dTsKKyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyAgICB2YXBbdmFwSWRdLmRldi0+ZG9faW9jdGwgPSB1c2JkcnZfaW9jdGw7CisjZWxzZQorICAgIHZhcFt2YXBJZF0uZGV2LT5kb19pb2N0bCA9IE5VTEw7CisjZW5kaWYKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCisgICAgdmFwW3ZhcElkXS5kZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHJbMF0gPSBwYXJlbnREZXYtPmRldl9hZGRyWzBdOworICAgIHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkclsxXSA9IHBhcmVudERldi0+ZGV2X2FkZHJbMV07CisgICAgdmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyWzJdID0gcGFyZW50RGV2LT5kZXZfYWRkclsyXTsKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHJbM10gPSBwYXJlbnREZXYtPmRldl9hZGRyWzNdOworICAgIHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkcls0XSA9IHBhcmVudERldi0+ZGV2X2FkZHJbNF07CisgICAgdmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyWzVdID0gcGFyZW50RGV2LT5kZXZfYWRkcls1XSArICh2YXBJZCsxKTsKKworICAgIC8qIFN0b3AgdGhlIG5ldHdvcmsgcXVldWUgZmlyc3QgKi8KKyAgICBuZXRpZl9zdG9wX3F1ZXVlKHZhcFt2YXBJZF0uZGV2KTsKKworICAgIHNwcmludGYodmFwW3ZhcElkXS5kZXYtPm5hbWUsICJ2YXAlZCIsIHZhcElkKTsKKyAgICBwcmludGsoIlJlZ2lzdGVyIFZBUCBkZXYgc3VjY2VzcyA6ICVzXG4iLCB2YXBbdmFwSWRdLmRldi0+bmFtZSk7CisKKyAgICBpZihyZWdpc3Rlcl9uZXRkZXZpY2UodmFwW3ZhcElkXS5kZXYpICE9IDApIHsKKyAgICAgICAgcHJpbnRrKCJyZWdpc3RlciBWQVAgZGV2aWNlIGZhaWxcbiIpOworICAgICAgICB2YXBbdmFwSWRdLmRldiA9IE5VTEw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgemZMbnhVbnJlZ2lzdGVyVmFwRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHZhcElkKQoreworICAgIGludCByZXQgPSAwOworCisgICAgcHJpbnRrKCJVbnJlZ2lzdGVyIFZBUCBkZXYgOiAlc1xuIiwgdmFwW3ZhcElkXS5kZXYtPm5hbWUpOworCisgICAgaWYodmFwW3ZhcElkXS5kZXYgIT0gTlVMTCkgeworICAgICAgICBwcmludGsoIlVucmVnaXN0ZXIgdmFwIGRldj0leFxuIiwgKHUzMl90KXZhcFt2YXBJZF0uZGV2KTsKKyAgICAgICAgLy8KKyAgICAgICAgLy91bnJlZ2lzdGVyX25ldGRldmljZSh3ZHNbd2RzSWRdLmRldik7CisgICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2KHZhcFt2YXBJZF0uZGV2KTsKKworICAgICAgICBwcmludGsoIlZBUCB1bnJlZ2lzdGVyX25ldGRldmljZVxuIik7CisgICAgICAgIHZhcFt2YXBJZF0uZGV2ID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50aygidW5yZWdpc3RlciBWQVAgZGV2aWNlOiAlZCBmYWlsXG4iLCB2YXBJZCk7CisgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworCisKKyMgIGRlZmluZSBTVUJNSVRfVVJCKHUsZikgICAgICAgdXNiX3N1Ym1pdF91cmIodSxmKQorIyAgZGVmaW5lIFVTQl9BTExPQ19VUkIodSxmKSAgICB1c2JfYWxsb2NfdXJiKHUsZikKKworLy9leHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKKworZXh0ZXJuIGludCB1c2JkcnZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiZHJ2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiZHJ2X3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHVzYmRydl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKK2V4dGVybiB2b2lkIHVzYmRydl9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHVzYmRydl9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogdXNiZHJ2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiZHJ2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK2V4dGVybiBVc2JUeFFfdCAqemZMbnhHZXRVc2JUeEJ1ZmZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworaW50IHpmTG54QWxsb2NBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCkKK3sKKyAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gbWFjcC0+aW50ZXJmYWNlOworICAgIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2MgPSAmaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdOworCisgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKyAgICBpbnQgaTsKKworICAgIC8qIGRlc2NyaXB0b3IgbWF0Y2hlcywgbGV0J3MgZmluZCB0aGUgZW5kcG9pbnRzIG5lZWRlZCAqLworICAgIC8qIGNoZWNrIG91dCB0aGUgZW5kcG9pbnRzICovCisgICAgZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKQorICAgIHsKKyAgICAgICAgZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKyAgICAgICAgaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApICYmCisgICAgICAgICAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2UgZm91bmQgYSBidWxrIGluIGVuZHBvaW50ICovCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImJ1bGsgaW46IHdNYXhQYWNrZXRTaXplID0gJXhcbiIsIGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSA9PSAweDAwKSAmJgorICAgICAgICAgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIGZvdW5kIGEgYnVsayBvdXQgZW5kcG9pbnQgKi8KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiYnVsayBvdXQ6IHdNYXhQYWNrZXRTaXplID0gJXhcbiIsIGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApICYmCisgICAgICAgICAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2UgZm91bmQgYSBpbnRlcnJ1cHQgaW4gZW5kcG9pbnQgKi8KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0IGluOiB3TWF4UGFja2V0U2l6ZSA9ICV4XG4iLCBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0IGluOiBpbnRfaW50ZXJ2YWwgPSAlZFxuIiwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDB4MDApICYmCisgICAgICAgICAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2UgZm91bmQgYSBpbnRlcnJ1cHQgb3V0IGVuZHBvaW50ICovCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImludGVycnVwdCBvdXQ6IHdNYXhQYWNrZXRTaXplID0gJXhcbiIsIGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQgb3V0OiBpbnRfaW50ZXJ2YWwgPSAlZFxuIiwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhbGwgVHggVVJCcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfVFhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgbWFjcC0+V2xhblR4RGF0YVVyYltpXSA9IFVTQl9BTExPQ19VUkIoMCwgR0ZQX0tFUk5FTCk7CisKKyAgICAgICAgaWYgKG1hY3AtPldsYW5UeERhdGFVcmJbaV0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgIC8qIEZyZWUgYWxsIHVyYnMgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPldsYW5UeERhdGFVcmJbal0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFsbCBSeCBVUkJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9SWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICBtYWNwLT5XbGFuUnhEYXRhVXJiW2ldID0gVVNCX0FMTE9DX1VSQigwLCBHRlBfS0VSTkVMKTsKKworICAgICAgICBpZiAobWFjcC0+V2xhblJ4RGF0YVVyYltpXSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgLyogRnJlZSBhbGwgdXJicyAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2JfZnJlZV91cmIobWFjcC0+V2xhblJ4RGF0YVVyYltqXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBaTV9NQVhfVFhfVVJCX05VTTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5XbGFuVHhEYXRhVXJiW2pdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBSZWdpc3RlciBSZWFkL1dyaXRlIFVTQiAqLworICAgIG1hY3AtPlJlZ091dFVyYiA9IFVTQl9BTExPQ19VUkIoMCwgR0ZQX0tFUk5FTCk7CisgICAgbWFjcC0+UmVnSW5VcmIgPSBVU0JfQUxMT0NfVVJCKDAsIEdGUF9LRVJORUwpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgemZMbnhGcmVlQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApCit7CisgICAgaW50IGk7CisKKyAgICAvKiBGcmVlIGFsbCBUeCBVUkJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9UWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICBpZiAobWFjcC0+V2xhblR4RGF0YVVyYltpXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB1c2JfZnJlZV91cmIobWFjcC0+V2xhblR4RGF0YVVyYltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIGFsbCBSeCBVUkJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9SWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICBpZiAobWFjcC0+V2xhblJ4RGF0YVVyYltpXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB1c2JfZnJlZV91cmIobWFjcC0+V2xhblJ4RGF0YVVyYltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIFVTQiBSZWdpc3RlciBSZWFkL1dyaXRlIFVSQiAqLworICAgIHVzYl9mcmVlX3VyYihtYWNwLT5SZWdPdXRVcmIpOworICAgIHVzYl9mcmVlX3VyYihtYWNwLT5SZWdJblVyYik7Cit9CisKK3ZvaWQgemZMbnhVbmxpbmtBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFVubGluayBhbGwgVHggVVJCcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfVFhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPldsYW5UeERhdGFVcmJbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNiX3VubGlua191cmIobWFjcC0+V2xhblR4RGF0YVVyYltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVbmxpbmsgYWxsIFJ4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5XbGFuUnhEYXRhVXJiW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYl91bmxpbmtfdXJiKG1hY3AtPldsYW5SeERhdGFVcmJbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVW5saW5rIFVTQiBSZWdpc3RlciBSZWFkL1dyaXRlIFVSQiAqLworICAgIHVzYl91bmxpbmtfdXJiKG1hY3AtPlJlZ091dFVyYik7CisKKyAgICB1c2JfdW5saW5rX3VyYihtYWNwLT5SZWdJblVyYik7Cit9CisKK3U4X3QgemZMbnhJbml0U2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKQoreworICAgIC8vdW5zaWduZWQgY2hhciBhZGRyWzZdOworCisgICAgLy9pbml0X01VVEVYKCZtYWNwLT5wc19zZW0pOworICAgIC8vaW5pdF9NVVRFWCgmbWFjcC0+cmVnX3NlbSk7CisgICAgLy9pbml0X01VVEVYKCZtYWNwLT5iY25fc2VtKTsKKyAgICAvL2luaXRfTVVURVgoJm1hY3AtPmNvbmZpZ19zZW0pOworCisgICAgc3Bpbl9sb2NrX2luaXQoJihtYWNwLT5jc19sb2NrKSk7CisjaWYgMAorICAgIC8qIE1BQyBhZGRyZXNzICovCisgICAgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyhkZXYsIGFkZHIpOworICAgIGRldi0+ZGV2X2FkZHJbMF0gPSBhZGRyWzBdOworICAgIGRldi0+ZGV2X2FkZHJbMV0gPSBhZGRyWzFdOworICAgIGRldi0+ZGV2X2FkZHJbMl0gPSBhZGRyWzJdOworICAgIGRldi0+ZGV2X2FkZHJbM10gPSBhZGRyWzNdOworICAgIGRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOworICAgIGRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOworI2VuZGlmCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZwODAyMTF3ZXh0X2hhbmRsZXJfZGVmOworI2VuZGlmCisKKyAgICBkZXYtPm9wZW4gPSB1c2JkcnZfb3BlbjsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHVzYmRydl94bWl0X2ZyYW1lOworICAgIGRldi0+c3RvcCA9IHVzYmRydl9jbG9zZTsKKyAgICBkZXYtPmNoYW5nZV9tdHUgPSAmdXNiZHJ2X2NoYW5nZV9tdHU7CisgICAgZGV2LT5nZXRfc3RhdHMgPSB1c2JkcnZfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdXNiZHJ2X3NldF9tdWx0aTsKKyAgICBkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHVzYmRydl9zZXRfbWFjOworICAgIGRldi0+ZG9faW9jdGwgPSB1c2JkcnZfaW9jdGw7CisKKyAgICBkZXYtPmZsYWdzIHw9IElGRl9NVUxUSUNBU1Q7CisKKyAgICBkZXYtPmRldl9hZGRyWzBdID0gMHgwMDsKKyAgICBkZXYtPmRldl9hZGRyWzFdID0gMHgwMzsKKyAgICBkZXYtPmRldl9hZGRyWzJdID0gMHg3ZjsKKyAgICBkZXYtPmRldl9hZGRyWzNdID0gMHgxMTsKKyAgICBkZXYtPmRldl9hZGRyWzRdID0gMHgyMjsKKyAgICBkZXYtPmRldl9hZGRyWzVdID0gMHgzMzsKKworICAgIC8qIEluaXRpYWxpemUgSGVhcnQgQmVhdCB0aW1lciAqLworICAgIGluaXRfdGltZXIoJm1hY3AtPmhiVGltZXIxMG1zKTsKKyAgICBtYWNwLT5oYlRpbWVyMTBtcy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworICAgIG1hY3AtPmhiVGltZXIxMG1zLmZ1bmN0aW9uID0gKHZvaWQgKikmemZMbngxMG1zVGltZXI7CisKKyAgICAvKiBJbml0aWFsaXplIFdEUyBhbmQgVkFQIGRhdGEgc3RydWN0dXJlICovCisgICAgLy96ZkluaXRXZHNTdHJ1Y3QoKTsKKyAgICB6ZkxueEluaXRWYXBTdHJ1Y3QoKTsKKworICAgIHJldHVybiAxOworfQorCit1OF90IHpmTG54Q2xlYXJTdHJ1Y3RzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdTE2X3QgaWk7CisgICAgdTE2X3QgVHhRQ250OworCisgICAgVHhRQ250ID0gemZMbnhDaGVja1R4QnVmZmVyQ250KGRldik7CisKKyAgICBwcmludGsoS0VSTl9FUlIgIlR4UUNudDogJWRcbiIsIFR4UUNudCk7CisKKyAgICBmb3IoaWkgPSAwOyBpaSA8IFR4UUNudDsgaWkrKykKKyAgICB7CisgICAgICAgIFVzYlR4UV90ICpUeFEgPSB6ZkxueEdldFVzYlR4QnVmZmVyKGRldik7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkZXZfa2ZyZWVfc2tiX2FueVxuIik7CisgICAgICAgIC8qIEZyZWUgYnVmZmVyICovCisgICAgICAgIGRldl9rZnJlZV9za2JfYW55KFR4US0+YnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExYjNiMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB1c2JkcnYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgbmV0d29yayBpbnRlcmZhY2UgdXAvZG93biByZWxhdGVkIGRlZmluaXRpb24qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1VTQkRSVl9ICisjZGVmaW5lIF9VU0JEUlZfSAorCisjZGVmaW5lIFdMQU5fVVNCICAgIDAKKyNkZWZpbmUgV0xBTl9QQ0kgICAgMQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSAiemRjb21wYXQuaCIKKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgIm9hbF9tYXJjLmgiCisjaW5jbHVkZSAiODAyMTFjb3JlL3B1Yl96ZmkuaCIKKy8vI2luY2x1ZGUgInB1Yl96ZncuaCIKKyNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3VzYi5oIgorCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisvKiBQbGVhc2UgaW5jbHVkZSBoZWFkZXIgZmlsZXMgZm9yIGRldmljZSB0eXBlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmaWxlICovCisjZGVmaW5lIHVyYl90ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXJiCisKKyNkZWZpbmUgdXNiX2NvbXBsZXRlX3QgICAgICAgICAgICAgIHVzYl9jb21wbGV0ZV90CisjZGVmaW5lIHBpcGVfdCAgICAgICAgICAgICAgICAgICAgICB1MzJfdAorCisvKiBVU0IgRW5kcG9pbnQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBVU0JfV0xBTl9UWF9QSVBFICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFVTQl9XTEFOX1JYX1BJUEUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVVNCX1JFR19JTl9QSVBFICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBVU0JfUkVHX09VVF9QSVBFICAgICAgICAgICAgICAgICAgICA0CisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjZW5kaWYKKworI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorI2luY2x1ZGUgImF0aHJfY29tbW9uLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgkJRGVzY3JpcHRvciBEYXRhIFN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGRyaXZlcl9zdGF0cyB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOworfTsKKworI2RlZmluZSBaTV9NQVhfUlhfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICA4MTkyCisKKyNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQorI2RlZmluZSBaTV9NQVhfVFhfQUdHUkVHQVRFX05VTSAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1VTQl9UWF9CVUZfU0laRSAgICAgICAgICAgICAgICAgIDgwOTYKKyNkZWZpbmUgWk1fTUFYX1RYX1VSQl9OVU0gICAgICAgICAgICAgICAgICAgNAorI2Vsc2UKKyNkZWZpbmUgWk1fVVNCX1RYX0JVRl9TSVpFICAgICAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBaTV9NQVhfVFhfVVJCX05VTSAgICAgICAgICAgICAgICAgICA4CisjZW5kaWYKKyNkZWZpbmUgWk1fVVNCX1JFR19NQVhfQlVGX1NJWkUgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fTUFYX1JYX1VSQl9OVU0gICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgWk1fTUFYX1RYX0JVRl9OVU0gICAgICAgICAgICAgICAgICAgMTI4CisKK3R5cGVkZWYgc3RydWN0IFVzYlR4UQoreworICAgIHpidWZfdCAqYnVmOworICAgIHU4X3QgaGRyWzgwXTsKKyAgICB1MTZfdCBoZHJsZW47CisgICAgdThfdCBzbmFwWzhdOworICAgIHUxNl90IHNuYXBMZW47CisgICAgdThfdCB0YWlsWzE2XTsKKyAgICB1MTZfdCB0YWlsTGVuOworICAgIHUxNl90IG9mZnNldDsKK30gVXNiVHhRX3Q7CisKKworc3RydWN0IHpkYXBfaW9jdGwgeworCXUxNl90IGNtZDsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCB0byBydW4gKi8KKwl1MzJfdCBhZGRyOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdTMyX3QgdmFsdWU7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworCXU4X3QJZGF0YVsweDEwMF07Cit9OworCisjZGVmaW5lIFpNX09BTF9NQVhfU1RBX1NVUFBPUlQgMTYKKworc3RydWN0IHVzYmRydl9wcml2YXRlCit7CisJLy9saW51eCB1c2VkCisJc3RydWN0IG5ldF9kZXZpY2UgCSpkZXZpY2U7CisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorCXN0cnVjdCBwY2lfZGV2IAkJKnBkZXY7CisjZW5kaWYKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgICAgKmludGVyZmFjZTsKKyNlbmRpZgorCXN0cnVjdCBkcml2ZXJfc3RhdHMgZHJ2X3N0YXRzOworCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKwlpbnQJICAgICAgICAgICAgICAgIHVzaW5nX2RhYzsKKwl1OF90CQkJcmV2X2lkOwkJLyogYWRhcHRlciBQQ0kgcmV2aXNpb24gSUQgKi8KKwlyd2xvY2tfdCAJCWlzb2xhdGVfbG9jazsKKyAgICBzcGlubG9ja190ICAgICAgY3NfbG9jazsKKwlpbnQgCQkJZHJpdmVyX2lzb2xhdGVkOworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKKwl2b2lkCQkJKnJlZ3A7CisjZW5kaWYKKworICAgICAgICAvKiB0aW1lciBmb3IgaGVhcnQgYmVhdCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGhiVGltZXIxMG1zOworCisJLyogRm9yIGRyaXZlciBjb3JlICovCisJdm9pZCogd2Q7CisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCisJdThfdCAgICAgICAgICAgICAgICAgICAgdHhVc2JCdWZbWk1fTUFYX1RYX1VSQl9OVU1dW1pNX1VTQl9UWF9CVUZfU0laRV07CisJdThfdCAgICAgICAgICAgICAgICAgICAgcmVnVXNiUmVhZEJ1ZltaTV9VU0JfUkVHX01BWF9CVUZfU0laRV07CisJdThfdCAgICAgICAgICAgICAgICAgICAgcmVnVXNiV3JpdGVCdWZbWk1fVVNCX1JFR19NQVhfQlVGX1NJWkVdOworCXVyYl90CQkJKldsYW5UeERhdGFVcmJbWk1fTUFYX1RYX1VSQl9OVU1dOworCXVyYl90CQkJKldsYW5SeERhdGFVcmJbWk1fTUFYX1JYX1VSQl9OVU1dOworCXVyYl90CQkJKlJlZ091dFVyYjsKKwl1cmJfdAkJCSpSZWdJblVyYjsKKwlVc2JUeFFfdCAgICAgICAgICAgICAgICBVc2JUeEJ1ZlFbWk1fTUFYX1RYX0JVRl9OVU1dOworCXpidWZfdCAgICAgICAgICAgICAgICAgICpVc2JSeEJ1ZlFbWk1fTUFYX1JYX1VSQl9OVU1dOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeEJ1ZkhlYWQ7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4QnVmVGFpbDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhCdWZDbnQ7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4VXJiSGVhZDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhVcmJUYWlsOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeFVyYkNudDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgUnhCdWZIZWFkOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBSeEJ1ZlRhaWw7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFJ4QnVmQ250OworI2VuZGlmCisKKyNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQorICAgICAgICB6YnVmX3QgICAgICAgICAgICAgICAgICAqcmVhbWluX2J1ZjsKKyNlbmRpZgorCisjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisgICAgICAgIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gIGF0aHJfd3BhX3JlcTsKKyNlbmRpZgorICAgICAgICBzdHJ1Y3Qgc29jayAgICAgICAgICAgICAqbmV0bGlua19zazsKKyAgICAgICAgdThfdCAgICAgICAgICAgIERldmljZU9wZW5lZDsgLy9DV1lhbmcoKykKKyAgICAgICAgdThfdCAgICAgICAgICAgIHN1cEllWzUwXTsKKyAgICAgICAgdThfdCAgICAgICAgICAgIHN1cExlbjsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSBzdGF3cGFpZVtaTV9PQUxfTUFYX1NUQV9TVVBQT1JUXTsKKyAgICAgICAgdThfdCAgICAgICAgICAgIGZvcndhcmRNZ210OworCisgICAgICAgIHN0cnVjdCB6ZkNiVXNiRnVuY1RibCB1c2JDYkZ1bmN0aW9uczsKKworICAgICAgICAvKiBGb3Iga2V2ZW50ZCAqLworICAgICAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBmbGFnczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAga2V2ZW50X2ZsYWdzOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBrZXZlbnRfcmVhZHk7CisKKyAgICAgICAgc3RydWN0IHNlbWFwaG9yZSAgICAgICAgaW9jdGxfc2VtOworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICBrZXZlbnQ7CisgICAgICAgIHdhaXRfcXVldWVfaGVhZF90ICAgICAgIHdhaXRfcXVldWVfZXZlbnQ7CisjaWZkZWYgWk1fSEFMUExVU19MT0NLCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGhhbF9pcnFGbGFnOworI2VuZGlmCisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJTdGF0ZTsKK307CisKKy8qIFdEUyAqLworI2RlZmluZSBaTV9XRFNfUE9SVF9OVU1CRVIgIDYKKworc3RydWN0IHpzV2RzU3RydWN0Cit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICB1MTZfdCBvcGVuRmxhZzsKK307CisKKy8qIFZBUCAqLworI2RlZmluZSBaTV9WQVBfUE9SVF9OVU1CRVIgIDcKKworc3RydWN0IHpzVmFwU3RydWN0Cit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICB1MTZfdCBvcGVuRmxhZzsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgWk1fSU9DVExfUkVHX1JFQUQJCQkweDAxCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19XUklURQkJCTB4MDIKKyNkZWZpbmUgWk1fSU9DVExfTUVNX0RVTVAJCQkweDAzCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19EVU1QCQkJMHgwNQorI2RlZmluZSBaTV9JT0NUTF9UWERfRFVNUCAJCQkweDA2CisjZGVmaW5lIFpNX0lPQ1RMX1JYRF9EVU1QIAkJCTB4MDcKKyNkZWZpbmUgWk1fSU9DVExfTUVNX1JFQUQJCQkweDBCCisjZGVmaW5lIFpNX0lPQ1RMX01FTV9XUklURQkJCTB4MEMKKyNkZWZpbmUgWk1fSU9DVExfRE1BX1RFU1QgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgWk1fSU9DVExfUkVHX1RFU1QgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgWk1fSU9DVExfVEVTVCAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgWk1fSU9DVExfVEFMTFkgICAgICAgICAgICAgIDB4ODEgLy9DV1lhbmcoKykKKyNkZWZpbmUgWk1fSU9DVExfUlRTICAgICAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgWk1fSU9DVExfTUlYX01PREUgICAgICAgICAgIDB4QTEKKyNkZWZpbmUgWk1fSU9DVExfRlJBRyAgICAgICAgICAgICAgIDB4QTIKKyNkZWZpbmUgWk1fSU9DVExfU0NBTiAgICAgICAgICAgICAgIDB4QTMKKyNkZWZpbmUgWk1fSU9DVExfS0VZICAgICAgICAgICAgICAgIDB4QTQKKyNkZWZpbmUgWk1fSU9DVExfUkFURSAgICAgICAgICAgICAgIDB4QTUKKyNkZWZpbmUgWk1fSU9DVExfRU5DUllQVElPTl9NT0RFICAgIDB4QTYKKyNkZWZpbmUgWk1fSU9DVExfR0VUX1RYQ05UICAgICAgICAgIDB4QTcKKyNkZWZpbmUgWk1fSU9DVExfR0VUX0RFQUdHX0NOVCAgICAgIDB4QTgKKyNkZWZpbmUgWk1fSU9DVExfRFVSQVRJT05fTU9ERSAgICAgIDB4QTkKKyNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19LRVkgICAgICAgIDB4QUEKKyNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19NT0RFICAgICAgIDB4QUIKKyNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RIICAgIDB4QUMgLy9DV1lhbmcoKykKKyNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1FVQUxJVFkgICAgIDB4QUQgLy9DV1lhbmcoKykKKyNkZWZpbmUgWk1fSU9DVExfU0VUX1BJQlNTX01PREUgICAgIDB4QUUKKworI2RlZmluZQlaREFQSU9DVEwJCQkJU0lPQ0RFVlBSSVZBVEUKKworZW51bSBkZXZTdGF0ZSB7CisgICAgT3BlbmVkLAorICAgIEVuYWJsZWQsCisgICAgRGlzYWJsZWQsCisgICAgQ2xvc2VkCit9OworCisjZW5kaWYJLyogX1VTQkRSVl9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNDk2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2J1Zi5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX2J1Zi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIGJ1ZmZlciBtYW5hZ2VtZW50ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKworCisvKiBDYWxsZWQgdG8gYWxsb2NhdGUgYnVmZmVyLCBtdXN0IHJldHVybiBhIGNvbnRpbnVlIGJ1ZmZlciBzcGFjZSAqLworemJ1Zl90KiB6ZndCdWZBbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuKQoreworICAgIHpidWZfdCogYnVmOworCisgICAgLyogQWxsb2NhdGUgU0tCIGZvciBwYWNrZXQqLworICAgIGJ1ZiA9IGRldl9hbGxvY19za2IobGVuKTsKKworICAgIHJldHVybiBidWY7Cit9CisKKworLyogQ2FsbGVkIHRvIGZyZWUgYnVmZmVyLCByZXBsYWNlIGJlbG93IDMgZnVuY3Rpb25zICovCit2b2lkIHpmd0J1ZkZyZWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBzdGF0dXMpCit7CisgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKK30KKworLyogQ2FsbGVkIHRvIGFkanVzdCBidWZmZXIgc2l6ZSBhbmQgaGVhZCBwb2ludGVyICovCit1MTZfdCB6ZndCdWZSZW1vdmVIZWFkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc2l6ZSkKK3sKKyAgICAvL3ptX2Fzc2VydChidWYtPmxlbiA+IHNpemUpOworCisgICAgYnVmLT5kYXRhICs9IHNpemU7CisgICAgYnVmLT5sZW4gLT0gc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworCisKKworLyogcmV0dXJuIHRhaWwgaWYgaGVhZD09TlVMTCwgY2FsbGVkIHRvIGNoYWluIG11bHRpcGxlIGJ1ZmZlciB0b2dldGhlciAqLworLyogVXNlZCB0byBjaGFpbiBSeCBidWZmZXIgdG8gZm9ybSBhIGZyYW1lLiBpZiB0aGUgcHJlcGFyZWQgUnggYnVmZmVyICAqLworLyogaXMgZ3JlYXRlciB0aGFuIGFuIGV0aGVybmV0IGZyYW1lKDE1MTgrMzIgYnl0ZSksIHRoZW4gdGhpcyBmdW5jdGlvbiAgICAqLworLyogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIGhlYWQ9TlVMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordTE2X3QgemZ3QnVmQ2hhaW4oemRldl90KiBkZXYsIHpidWZfdCoqIGhlYWQsIHpidWZfdCogdGFpbCkKK3sKKworICAgICpoZWFkID0gdGFpbDsKKyAgICByZXR1cm4gMDsKK30KKworCisvKiBDYWxsZWQgd2hlbiBkb2luZyBpbmZyYS1ic3MgZm9yd2FyZGluZyAqLwordTE2X3QgemZ3QnVmQ29weSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjKQoreworICAgIG1lbWNweShkc3QtPmRhdGEsIHNyYy0+ZGF0YSwgc3JjLT5sZW4pOworICAgIGRzdC0+dGFpbCA9IGRzdC0+ZGF0YTsKKyAgICBza2JfcHV0KGRzdCwgc3JjLT5sZW4pOworICAgIHJldHVybiAwOworfQorCisKKy8qIENhbGxlZCB0byBhZGp1c3QgYnVmZmVyIHNpemUgYW5kIHRhaWwgcG9pbnRlciAqLwordTE2X3QgemZ3QnVmU2V0U2l6ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpCit7CisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisgICAgYnVmLT50YWlsID0gMDsKKyAgICBidWYtPmxlbiA9IDA7CisjZWxzZQorICAgIGJ1Zi0+dGFpbCA9IGJ1Zi0+ZGF0YTsKKyAgICBidWYtPmxlbiA9IDA7CisjZW5kaWYKKworICAgIHNrYl9wdXQoYnVmLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZ3QnVmR2V0U2l6ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+bGVuOworfQorCit2b2lkIHpmd0NvcHlCdWZDb250ZXh0KHpkZXZfdCogZGV2LCB6YnVmX3QqIHNvdXJjZSwgemJ1Zl90KiBkc3QpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2RiZy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9kYmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzc2M2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9kYmcuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX2RiZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIGRlYnVnIGZ1bmN0aW9ucyAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCit2b2lkIHpmd0R1bXBCdWYoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IgKGk9MDsgaTxidWYtPmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCIlMDJ4ICIsICooKCh1OF90KilidWYtPmRhdGEpK2kpKTsKKyAgICAgICAgaWYgKChpJjB4Zik9PTB4ZikKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIHByaW50aygiXG4iKTsKK30KKworCit2b2lkIHpmd0RiZ1JlYWRSZWdEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgcHJpbnRrKCJSZWFkIGFkZHI6JXggPSAleFxuIiwgYWRkciwgdmFsKTsKK30KKwordm9pZCB6ZndEYmdXcml0ZVJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICBwcmludGsoIldyaXRlIGFkZHI6JXggPSAleFxuIiwgYWRkciwgdmFsKTsKK30KKwordm9pZCB6ZndEYmdSZWFkVGFsbHlEb25lKHpkZXZfdCogZGV2KQoreworICAgIC8vcHJpbnRrKCJSZWFkIFRhbGwgRG9uZVxuIik7Cit9CisKK3ZvaWQgemZ3RGJnV3JpdGVFZXByb21Eb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7Cit9CisKK3ZvaWQgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoemRldl90KiBkZXYsIHUzMl90IHZhbCkKK3sKK30KKworLy9Gb3IgRXZsICsrCit2b2lkIHpmd0RiZ1JlYWRGbGFzaERvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiByc3BkYXRhLCB1MzJfdCBkYXRhbGVuKQoreworICAgIHByaW50aygiUmVhZCBGbGFzaCBhZGRyOiV4IGxlbmd0aDoleFxuIiwgYWRkciwgZGF0YWxlbik7Cit9CisKK3ZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaERvbmUoemRldl90KiBkZXYpCit7CisgICAgcHJpbnRrKCJQcm9ncmFtIEZsYXNoIERvbmVcbiIpOworfQorCit2b2lkIHpmd0RiZ1Byb2dyYW1lRmxhc2hDaGtEb25lKHpkZXZfdCogZGV2KQoreworICAgIHByaW50aygiUHJvZ3JhbSBGbGFzaCBEb25lXG4iKTsKK30KKwordm9pZCB6ZndEYmdHZXRGbGFzaENoa1N1bURvbmUoemRldl90KiBkZXYsIHUzMl90KiByc3BkYXRhKQoreworICAgIHByaW50aygiR2V0IEZsYXNoIENoa1N1bSBEb25lXG4iKTsKK30KKwordm9pZCB6ZndEYmdEb3dubG9hZEZ3SW5pdERvbmUoemRldl90KiBkZXYpCit7CisgICAgcHJpbnRrKCJEb3dubG9hZCBGVyBJbml0IERvbmVcbiIpOworfQorLy9Gb3IgRXZsIC0tCisKKy8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2V2LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2V2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2Yjc4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9ldi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIGV2ZW50cyAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCisKKy8qKioqKiBNYW5hZ2VtZW50ICoqKioqLwordTE2X3QgemZMbnhBdXRoTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkcikKK3sKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZMbnhBc29jTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwgdTE2X3QgYm9keVNpemUsIHUxNl90IHBvcnQpCit7CisvLyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOworICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOworICAgIHUxNl90IGksIGo7CisKKyAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBtYWNBZGRyLCBFVEhfQUxFTik7CisgICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiam9pbl9ldmVudCBvZiBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgeworICAgICAgICBmb3IoaiA9IDA7IGogPCBJRUVFODAyMTFfQUREUl9MRU47IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkcltqXSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIChtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkcltqXSAhPSBhZGRyW2pdKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCkKKyAgICB7CisgICAgICAgIC8vcHJpbnRrKCJ6ZndBc29jTm90aWZ5IC0gc3RvcmUgd3BhIGllIGluIG1hY3AsIGluZGV4ID0gJWRcbiIsIGkpOworICAgICAgICBtZW1jcHkobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX21hY2FkZHIsIG1hY0FkZHIsIElFRUU4MDIxMV9BRERSX0xFTik7CisgICAgICAgIG1lbWNweShtYWNwLT5zdGF3cGFpZVtpXS53cGFfaWUsIGJvZHksIGJvZHlTaXplKTsKKyAgICB9CisgICAgLy9pZihtYWNwLT5jYXJkU2V0dGluZy5Cc3NUeXBlID09IElORlJBU1RSVUNUVVJFX0JTUykgeworICAgIC8vICAgICAgICAgICAgLy93aXJlbGVzc19zZW5kX2V2ZW50KG1hY3AtPmRldmljZSwgU0lPQ0dJV1NDQU4sICZ3cmVxLCBOVUxMKTsKKyAgICAvLyAgICB3aXJlbGVzc19zZW5kX2V2ZW50KG1hY3AtPmRldmljZSwgU0lPQ0dJV0FQLCAmd3JlcSwgTlVMTCk7CisgICAgLy99CisjaWYgV0lSRUxFU1NfRVhUID49IDE1CisgICAgLy9lbHNlIGlmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gQVBfQlNTKSB7CisvLyAgICAgICAgaWYgKHBvcnQgPT0gMCkKKy8vICAgICAgICB7CisgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgZWxzZQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgVkFQIGRldmljZSBpcyB2YWxpZCAqLworLy8gICAgICAgICAgICBpZiAodmFwW3BvcnRdLmRldiAhPSBOVUxMKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHZhcFtwb3J0XS5kZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgZWxzZQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbicgZmluZCBhIHZhbGlkIFZBUCBkZXZpY2UsIHBvcnQ6ICVkXG4iLCBwb3J0KTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKyAgICAvL30KKyNlbmRpZgorLy8jZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisKKy8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgU1RBIGlzIGRpc2Fzc29jaWF0ZWQgZnJvbSBBUCAqLworLyogQVAgbW9kZSBvbmx5ICovCit1MTZfdCB6ZkxueERpc0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOworICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOworCisgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOworICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInpmd0Rpc0Fzb2NOb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCisKKyAgICByZXR1cm4gMDsKK30KKworLyogTm90aWZpY2F0aW9uIHRoYXQgYSBTVEEgaXMgY29ubmVjdCB0byBBUCAqLworLyogQVAgbW9kZSBvbmx5ICovCit1MTZfdCB6ZkxueEFwQ29ubmVjdE5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisgICAgdThfdCAqYWRkciA9ICh1OF90ICopIG1hY0FkZHI7CisKKyAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBtYWNBZGRyLCBFVEhfQUxFTik7CisgICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiemZ3QXBDb25uZWN0Tm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKworCisgICAgcmV0dXJuIDA7Cit9CisKKworCit2b2lkIHpmTG54Q29ubmVjdE5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCB1MTZfdCogYnNzaWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOworICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBic3NpZDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAoYnNzaWQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCkKKyAgICAgICAgICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgYnNzaWQsIEVUSF9BTEVOKTsKKyAgICAgICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworICAgICAgICBpZiAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQorICAgICAgICB7CisjaWZkZWYgWk1fQ09ORklHX0JJR19FTkRJQU4KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJDb25uZWN0ZWQgdG8gQVAsIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgIGFkZHJbMV0sIGFkZHJbMF0sIGFkZHJbM10sIGFkZHJbMl0sIGFkZHJbNV0sIGFkZHJbNF0pOworI2Vsc2UKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJDb25uZWN0ZWQgdG8gQVAsIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworI2VuZGlmCisKKyAgICAgICAgICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQUJMRUQpIHx8CisgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fRElTQUJMRUQpIHx8CisJICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9SRVNFVCkgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9SRVNFVCkgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RFQVVUSCkgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RJU0FTT0MpIHx8CisJICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9CRUFDT05fTUlTUykgfHwKKyAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9OT1RfRk9VTkQpIHx8CisJICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9USU1FT1VUKSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkRpc2Nvbm5lY3Rpb24gTm90aWZ5XG4iKTsKKworICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgICAgICB9CisKKwkvKiBTYXZlIHRoZSBjb25uZWN0ZWQgc3RhdHVzICovCisJbWFjcC0+YWRhcHRlclN0YXRlID0gc3RhdHVzOworCisgICAgICAgIGlmKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgeworICAgICAgICAvLyAgICAgICAgICAgIC8vd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdTQ0FOLCAmd3JlcSwgTlVMTCk7CisgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JlcSwgTlVMTCk7CisgICAgICAgIH0KKyNpZiBXSVJFTEVTU19FWFQgPj0gMTUKKyAgICAgICAgZWxzZSBpZih6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIHsKKyAgICAgICAgICAgIC8vaWYgKHBvcnQgPT0gMCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgLyogQ2hlY2sgd2hldGhlciB0aGUgVkFQIGRldmljZSBpcyB2YWxpZCAqLworICAgICAgICAgICAgLy8gICAgaWYgKHZhcFtwb3J0XS5kZXYgIT0gTlVMTCkKKyAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHZhcFtwb3J0XS5kZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAvLyAgICBlbHNlCisgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4nIGZpbmQgYSB2YWxpZCBWQVAgZGV2aWNlLCBwb3J0OiAlZFxuIiwgcG9ydCk7CisgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAvL30KKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIC8vcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZMbnhTY2FuTm90aWZ5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTY2FuUmVzdWx0KiByZXN1bHQpCit7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmTG54U3RhdGlzdGljc05vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU3Rhc3RpY3MqIHJlc3VsdCkKK3sKKyAgICByZXR1cm47Cit9CisKKy8vdm9pZCB6ZndNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtZXNzYWdlLCB1MTZfdCBldmVudCkKK3ZvaWQgemZMbnhNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3Qgc3RhdHVzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICp0YWcgPSAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uIjsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJY2hhciBidWZbMTI4XTsKKworCS8qIFRPRE86IG5lZWRlZCBwYXJhbWV0ZXJzOiBjb3VudCwgdHlwZSwgc3JjIGFkZHJlc3MgKi8KKwkvL3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyglc2Nhc3QgYWRkcj0lcykiLCB0YWcsCisJLy8gICAgKHN0YXR1cyA9PSBaTV9NSUNfR1JPVVBfRVJST1IpID8gICJicm9hZCIgOiAidW5pIiwKKwkvLyAgICBldGhlcl9zcHJpbnRmKCh1OF90ICopYWRkcikpOworCisJaWYgKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKwl7CisJCXN0cmNweShidWYsIHRhZyk7CisJfQorCisJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7Cit9CisKKwordm9pZCB6ZkxueEFwTWljRmFpbHVyZU5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogYWRkciwgemJ1Zl90KiBidWYpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOworCisgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgYWRkciwgRVRIX0FMRU4pOworICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInpmd0FwTWljRmFpbHVyZU5vdGlmeSgpLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisKKyAgICByZXR1cm47Cit9CisKKy8vIHN0YXR1cyA9IDAgID0+IHBhcnRuZXIgbG9zdAorLy8gICAgICAgID0gMSAgPT4gcGFydG5lciBhbGl2ZQorLy92b2lkIHpmd0lic3NQYXJ0bmVyTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90IHN0YXR1cykKK3ZvaWQgemZMbnhJYnNzUGFydG5lck5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgKmV2ZW50KQoreworfQorCit2b2lkIHpmTG54TWFjQWRkcmVzc05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICBkZXYtPmRldl9hZGRyWzBdID0gYWRkclswXTsKKyAgICBkZXYtPmRldl9hZGRyWzFdID0gYWRkclsxXTsKKyAgICBkZXYtPmRldl9hZGRyWzJdID0gYWRkclsyXTsKKyAgICBkZXYtPmRldl9hZGRyWzNdID0gYWRkclszXTsKKyAgICBkZXYtPmRldl9hZGRyWzRdID0gYWRkcls0XTsKKyAgICBkZXYtPmRldl9hZGRyWzVdID0gYWRkcls1XTsKK30KKwordm9pZCB6ZkxueFNlbmRDb21wbGV0ZUluZGljYXRpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworfQorCisKK3ZvaWQgemZMbnhSZXN0b3JlQnVmRGF0YSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpIHsKKworfQorLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODFiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21lbS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfbWVtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50ICovCisvKiBDYWxsZWQgdG8gYWxsb2NhdGUgdW5jYWNoZWQgbWVtb3J5LCBhbGxvY2F0ZWQgbWVtb3J5IG11c3QgICAgKi8KKy8qIGluIDQtYnl0ZSBib3VuZGFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordm9pZCogemZ3TWVtQWxsb2NhdGUoemRldl90KiBkZXYsIHUzMl90IHNpemUpCit7CisgICAgdm9pZCogbWVtID0gTlVMTDsKKyAgICBtZW0gPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworICAgIHJldHVybiBtZW07Cit9CisKKworLyogQ2FsbGVkIHRvIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLwordm9pZCB6ZndNZW1GcmVlKHpkZXZfdCogZGV2LCB2b2lkKiBtZW0sIHUzMl90IHNpemUpCit7CisgICAga2ZyZWUobWVtKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZ3TWVtb3J5Q29weSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQoreworICAgIC8vdTE2X3QgaTsKKworICAgIG1lbWNweShkc3QsIHNyYywgbGVuZ3RoKTsKKyAgICAvL2ZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisgICAgLy97CisgICAgLy8gICAgZHN0W2ldID0gc3JjW2ldOworICAgIC8vfQorICAgIHJldHVybjsKK30KKwordm9pZCB6ZndaZXJvTWVtb3J5KHU4X3QqIHZhLCB1MTZfdCBsZW5ndGgpCit7CisgICAgLy91MTZfdCBpOworICAgIG1lbXNldCh2YSwgMCwgbGVuZ3RoKTsKKyAgICAvL2ZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisgICAgLy97CisgICAgLy8gICAgdmFbaV0gPSAwOworICAgIC8vfQorICAgIHJldHVybjsKK30KKwordm9pZCB6ZndNZW1vcnlNb3ZlKHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpCit7CisgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworICAgIHJldHVybjsKK30KKwordThfdCB6ZndNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKQoreworICAgIC8vdTE2X3QgaTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gbWVtY21wKG0xLCBtMiwgbGVuZ3RoKTsKKworICAgIHJldHVybiAoKHJldD09MCk/VFJVRTpGQUxTRSk7CisgICAgLy9mb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIC8veworICAgIC8vICAgIGlmICggbTFbaV0gIT0gbTJbaV0gKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIC8vICAgIH0KKyAgICAvL30KKworICAgIC8vcmV0dXJuIFRSVUU7Cit9CisKKy8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9taXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc5MThiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9taXMuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9taXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBtaXNjIGZ1bmN0aW9ucyAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworLy9leHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOworZXh0ZXJuIHN0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKK2V4dGVybiB1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KTsKKworLyogU2ltcGx5IHJldHVybiAweGZmZmYgaWYgVkFQIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgKi8KK3UxNl90IHpmd0dldFZhcElkKHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiB6ZkxueEdldFZhcElkKGRldik7Cit9CisKK3ZvaWQgemZ3U2xlZXAoemRldl90KiBkZXYsIHUzMl90IG1zKQoreworICAgIGlmIChpbl9pbnRlcnJ1cHQoKSA9PSAwKQorICAgIHsKKyAgICAgICAgbWRlbGF5KG1zKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlpOworICAgICAgICBpbnQgaXRlciA9IDEwMDAwMCAqIG1zOworCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGl0ZXI7IGlpKyspCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgfQorfQorCisjaWZkZWYgWk1fSEFMUExVU19MT0NLCithc21saW5rYWdlIHN0cnVjdCB6c1dsYW5EZXYgKnpmd0dldFdsYW5EZXYoemRldl90KiBkZXYpCit7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXJldHVybiBtYWNwLT53ZDsKK30KKworYXNtbGlua2FnZSB2b2lkIHpmd0VudGVyQ3JpdGljYWxTZWN0aW9uKHpkZXZfdCogZGV2KQoreworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgbWFjcC0+aGFsX2lycUZsYWcpOworfQorCithc21saW5rYWdlIHZvaWQgemZ3TGVhdmVDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpCit7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIG1hY3AtPmhhbF9pcnFGbGFnKTsKK30KKworYXNtbGlua2FnZSB1OF90IHpmd0J1ZlJlYWRCeXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHJldHVybiAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCk7Cit9CisKK2FzbWxpbmthZ2UgdTE2X3QgemZ3QnVmUmVhZEhhbGZXb3JkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHJldHVybiB6bXdfY3B1X3RvX2xlMTYoKih1MTZfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KSk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgdmFsdWUpCit7CisgICAgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWU7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUhhbGZXb3JkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCB2YWx1ZSkKK3sKKyAgICAqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gem13X2NwdV90b19sZTE2KHZhbHVlKTsKK30KKworYXNtbGlua2FnZSB1OF90ICp6ZndHZXRCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHJldHVybiAodThfdCopKGJ1Zi0+ZGF0YSk7Cit9CisjZW5kaWYKKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3BrdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYjAwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3BrdC5jCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX3BrdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHBhY2tldCBoYW5kbGluZyAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCisKKworLy9leHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOworZXh0ZXJuIHN0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKKworCisvKioqKiogUnggKioqKiovCit2b2lkIHpmTG54UmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHUxNl90IGZyYW1lVHlwZTsKKyAgICB1MTZfdCBmcmFtZUN0cmw7CisgICAgdTE2X3QgZnJhbWVTdWJ0eXBlOworICAgIHpidWZfdCAqc2tiMTsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvL2ZyYW1lQ3RybCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIDApOworICAgIGZyYW1lQ3RybCA9ICoodThfdCopKCh1OF90KilidWYtPmRhdGEpOworICAgIGZyYW1lVHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjsKKyAgICBmcmFtZVN1YnR5cGUgPSBmcmFtZUN0cmwgJiAweGYwOworCisgICAgaWYgKChmcmFtZVR5cGUgPT0gMHgwKSAmJiAobWFjcC0+Zm9yd2FyZE1nbXQpKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChmcmFtZVN1YnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCZWFjb24gKi8KKyAgICAgICAgICAgIGNhc2UgMHg4MCA6CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgMHg1MCA6CisgICAgICAgICAgICAgICAgc2tiMSA9IHNrYl9jb3B5KGJ1ZiwgR0ZQX0FUT01JQyk7CisgICAgICAgICAgICAgICAgaWYoc2tiMSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2tiMS0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgICAgICBza2IxLT5tYWNfaGVhZGVyID0gc2tiMS0+ZGF0YTsKKwkgICAgICAgICAgICBza2IxLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCSAgICAgICAgICAgIHNrYjEtPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwkgICAgICAgICAgICBza2IxLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoMHgwMDE5KTsgIC8qIEVUSF9QXzgwMjExX1JBVyAqLworICAgIAkgICAgICAgICAgICBuZXRpZl9yeChza2IxKTsKKwkgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICByZXR1cm47Cit9CisKKyNkZWZpbmUgWk1fQVZPSURfVURQX0xBUkdFX1BBQ0tFVF9GQUlMCit2b2lkIHpmTG54UmVjdkV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworI2lmZGVmIFpNX0FWT0lEX1VEUF9MQVJHRV9QQUNLRVRfRkFJTAorICAgIHpidWZfdCAqbmV3X2J1ZjsKKworICAgIC8vbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoMjA0OCk7CisgICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoYnVmLT5sZW4pOworCisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisgICAgbmV3X2J1Zi0+dGFpbCA9IDA7CisgICAgbmV3X2J1Zi0+bGVuID0gMDsKKyNlbHNlCisgICAgbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7CisgICAgbmV3X2J1Zi0+bGVuID0gMDsKKyNlbmRpZgorCisgICAgc2tiX3B1dChuZXdfYnVmLCBidWYtPmxlbik7CisgICAgbWVtY3B5KG5ld19idWYtPmRhdGEsIGJ1Zi0+ZGF0YSwgYnVmLT5sZW4pOworCisgICAgLyogRnJlZSBidWZmZXIgKi8KKyAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworCisgICAgaWYgKHBvcnQgPT0gMCkKKyAgICB7CisgICAgICAgIG5ld19idWYtPmRldiA9IGRldjsKKyAgICAgICAgbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCBkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBWQVAgKi8KKyAgICAgICAgaWYgKHZhcFswXS5kZXYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3X2J1Zi0+ZGV2ID0gdmFwWzBdLmRldjsKKyAgICAgICAgICAgIG5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgdmFwWzBdLmRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBuZXdfYnVmLT5kZXYgPSBkZXY7CisgICAgICAgICAgICBuZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIGRldik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuZXdfYnVmLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKyAgICBzd2l0Y2gobmV0aWZfcngobmV3X2J1ZikpCisjZWxzZQorICAgIGlmIChwb3J0ID09IDApCisgICAgeworICAgICAgICBidWYtPmRldiA9IGRldjsKKyAgICAgICAgYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVkFQICovCisgICAgICAgIGlmICh2YXBbMF0uZGV2ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi0+ZGV2ID0gdmFwWzBdLmRldjsKKyAgICAgICAgICAgIGJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIHZhcFswXS5kZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLT5kZXYgPSBkZXY7CisgICAgICAgICAgICBidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCBkZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKyAgICBzd2l0Y2gobmV0aWZfcngoYnVmKSkKKyNlbmRpZgorICAgIHsKKyAgICBjYXNlIE5FVF9SWF9CQUQ6CisgICAgY2FzZSBORVRfUlhfRFJPUDoKKyAgICBjYXNlIE5FVF9SWF9DTl9NT0Q6CisgICAgY2FzZSBORVRfUlhfQ05fSElHSDoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfcGFja2V0cysrOworICAgICAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9ieXRlcyArPSBidWYtPmxlbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4OGQwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfc2VjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgQ0VOQy4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworZXh0ZXJuIGludCB6ZkxueENlbmNTZW5kTXNnKHN0cnVjdCBzb2NrICpuZXRsaW5rX3NrLCB1X2ludDhfdCAqbXNnLCBpbnQgbGVuKTsKKwordTE2X3QgemZMbnhDZW5jQXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHU4X3QqIGJvZHksIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKilkZXYtPnByaXY7CisgICAgc3RydWN0IHp5ZGFzX2NlbmNfc3RhX2luZm8gY2VuY19pbmZvOworICAgIC8vc3RydWN0IHNvY2sgKm5ldGxpbmtfc2s7CisgICAgdThfdCBpZV9sZW47CisgICAgaW50IGlpOworCisgICAgLyogQ3JlYXRlIE5FVExJTksgc29ja2V0ICovCisgICAgLy9uZXRsaW5rX3NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfVVNFUlNPQ0ssIE5VTEwpOworCisgICAgaWYgKG1hY3AtPm5ldGxpbmtfc2sgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiTkVUTElOSyBTb2NrZXQgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1zZXQoJmNlbmNfaW5mbywgMCwgc2l6ZW9mKGNlbmNfaW5mbykpOworCisgICAgLy9tZW1jcHkoY2VuY19pbmZvLmdzbiwgdmFwLT5pdl9jZW5jbXNrX2tleXMud2tfdHhpdiwgWk1fQ0VOQ19JVl9MRU4pOworICAgIHpmaVdsYW5RdWVyeUdTTihkZXYsIGNlbmNfaW5mby5nc24sIHBvcnQpOworICAgIGNlbmNfaW5mby5kYXRhbGVuICs9IFpNX0NFTkNfSVZfTEVOOworICAgIGllX2xlbiA9IGJvZHlbMV0gKyAyOworICAgIG1lbWNweShjZW5jX2luZm8ud2llLCBib2R5LCBpZV9sZW4pOworICAgIGNlbmNfaW5mby5kYXRhbGVuICs9IGllX2xlbjsKKworICAgIG1lbWNweShjZW5jX2luZm8uc3RhX21hYywgbWFjQWRkciwgNik7CisgICAgY2VuY19pbmZvLm1zZ190eXBlID0gWk1fQ0VOQ19XQUlfUkVRVUVTVDsKKyAgICBjZW5jX2luZm8uZGF0YWxlbiArPSA2ICsgMjsKKworICAgIHByaW50ayhLRVJOX0VSUiAiPT09PT0gemZ3Q2VuY1NlbmRNc2csIGJvZHlTaXplOiAlZCA9PT09PVxuIiwgYm9keVNpemUpOworCisgICAgZm9yKGlpID0gMDsgaWkgPCBib2R5U2l6ZTsgaWkrKykKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJTAyeCAiLCBib2R5W2lpXSk7CisKKyAgICAgICAgaWYgKChpaSAmIDB4ZikgPT0gMHhmKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6ZkxueENlbmNTZW5kTXNnKG1hY3AtPm5ldGxpbmtfc2ssICh1OF90ICopJmNlbmNfaW5mbywgY2VuY19pbmZvLmRhdGFsZW4rNCk7CisKKyAgICAvKiBDbG9zZSBORVRMSU5LIHNvY2tldCAqLworICAgIC8vc29ja19yZWxlYXNlKG5ldGxpbmtfc2spOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCit1OF90IHpmd0NlbmNIYW5kbGVCZWFjb25Qcm9icmVzcG9uKHpkZXZfdCogZGV2LCB1OF90ICpwV0lFYywKKyAgICAgICAgdThfdCAqcFBlZXJTU0lEYywgdThfdCAqcFBlZXJBZGRyYykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZndHZXRQa3RFbmNFeGVtcHRpb25BY3Rpb25UeXBlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICByZXR1cm4gWk1fRU5DUllQVElPTl9FWEVNUFRfTk9fRVhFTVBUSU9OOworfQorCit2b2lkIGNvcHlUb0ludFR4QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDtpKyspCisgICAgeworICAgICAgICAvL3ptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQraSwgc3JjW2ldKTsKKyAgICAgICAgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQraSkgPSBzcmNbaV07CisgICAgfQorfQorCit1MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAiQ1dZIC0gYWRkIHdwYWllIGNvbnRlbnQgTGVuZ3RoIDogIiwgbWFjcC0+c3VwSWVbMV0pOworICAgIGlmIChtYWNwLT5zdXBJZVsxXSAhPSAwKQorICAgIHsKKyAgICAgICAgY29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIG1hY3AtPnN1cEllLCBvZmZzZXQsIG1hY3AtPnN1cEllWzFdKzIpOworICAgICAgICAvL21lbWNweShidWYtPmRhdGFbb2Zmc2V0XSwgbWFjcC0+c3VwSWUsIG1hY3AtPnN1cEllWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKG1hY3AtPnN1cEllWzFdKzIpOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDc2ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF91c2IuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBVU0IgbWFuYWdlbWVudCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgemZMbnhJbml0VXNiVHhRKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmTG54SW5pdFVzYlJ4USh6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZMbnhTdWJtaXRSZWdJblVyYih6ZGV2X3QgKmRldik7Cit1MzJfdCB6ZkxueFVzYk91dCh6ZGV2X3QqIGRldiwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sCisgICAgICAgIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpOwordTMyX3QgemZMbnhVc2JXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKKwordm9pZCB6ZndVc2JSZWdpc3RlckNhbGxCYWNrKHpkZXZfdCogZGV2LCBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgKnpmVXNiRnVuYykgeworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWN2ID0gemZVc2JGdW5jLT56ZmNiVXNiUmVjdjsKKyAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVnSW4gPSB6ZlVzYkZ1bmMtPnpmY2JVc2JSZWdJbjsKKyAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUgPSB6ZlVzYkZ1bmMtPnpmY2JVc2JPdXRDb21wbGV0ZTsKKworICAgIHJldHVybjsKK30KKwordTMyX3QgemZ3VXNiR2V0RnJlZVR4UVNpemUoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUzMl90ICAgICAgICBmcmVlVHhRU2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIGZyZWVUeFFTaXplID0gWk1fTUFYX1RYX0JVRl9OVU0gLSBtYWNwLT5UeEJ1ZkNudDsKKworICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIHJldHVybiBmcmVlVHhRU2l6ZTsKK30KKwordTMyX3QgemZ3VXNiR2V0TWF4VHhRU2l6ZSh6ZGV2X3QqIGRldikKK3sKKyAgICByZXR1cm4gWk1fTUFYX1RYX0JVRl9OVU07Cit9CisKK3UzMl90IHpmd1VzYkVuYWJsZUludEVwdCh6ZGV2X3QgKmRldiwgdThfdCBlbmRwdCkKK3sKKyAgICAvKiBJbml0aWFsaXplIFVTQiBUeFEgKi8KKyAgICB6ZkxueEluaXRVc2JUeFEoZGV2KTsKKworICAgIC8qIEluaXRpYWxpemUgVVNCIFJ4USAqLworICAgIHpmTG54SW5pdFVzYlJ4UShkZXYpOworCisgICAgLyogSW5pdGlhbGl6ZSBVU0IgUmVnaXN0ZXIgSW4gVVJCICovCisgICAgLy96ZndVc2JTdWJtaXRSZWdJbihkZXYpOworICAgIC8qIEluaXRpYWxpemUgVVNCIFJlZ2lzdGVyIEluIFVSQiAqLworICAgIHpmTG54U3VibWl0UmVnSW5VcmIoZGV2KTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgemZ3VXNiRW5hYmxlUnhFcHQoemRldl90KiBkZXYsIHU4X3QgZW5kcHQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2woemRldl90KiBkZXYsIHU4X3QgcmVxLCB1MTZfdCB2YWx1ZSwgdTE2X3QgaW5kZXgsIHZvaWQgKmRhdGEsIHUzMl90IHNpemUpCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgdTMyX3QgcmV0ID0gMDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdThfdCogYnVmOworCisgICAgaWYgKHNpemUgPiAwKQorICAgIHsKKyAgICAgICAgYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgKHU4X3QqKWRhdGEsIHNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBidWYgPSBOVUxMOworICAgIH0KKworI2lmIDAKKyAgICBwcmludGsoS0VSTl9FUlIgInJlcSA9IDB4JTAyeFxuIiwgcmVxKTsKKyAgICBwcmludGsoS0VSTl9FUlIgInZhbHVlID0gMHglMDR4XG4iLCB2YWx1ZSk7CisgICAgcHJpbnRrKEtFUk5fRVJSICJpbmRleCA9IDB4JTA0eFxuIiwgaW5kZXgpOworICAgIHByaW50ayhLRVJOX0VSUiAiZGF0YSA9IDB4JWx4XG4iLCAodTMyX3QpIGRhdGEpOworICAgIHByaW50ayhLRVJOX0VSUiAic2l6ZSA9ICVsZFxuIiwgc2l6ZSk7CisjZW5kaWYKKworICAgIHJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhtYWNwLT51ZGV2LCB1c2Jfc25kY3RybHBpcGUobWFjcC0+dWRldiwgMCksCisgICAgICAgICAgICByZXEsIFVTQl9ESVJfT1VUIHwgMHg0MCwgdmFsdWUsIGluZGV4LCBidWYsIHNpemUsIEhaKTsKKworICAgIGlmIChyZXN1bHQgPCAwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJ6ZndVc2JTdWJtaXRDb250cm9sKCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwgcmVzdWx0KTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICB9CisgICAga2ZyZWUoYnVmKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgemZ3VXNiQ21kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUzMl90IHJldDsKKworICAgIC8vTVBVc2JDb21tYW5kKGRldiwgZW5kcHQsIGNtZCwgY21kTGVuKTsKKyAgICByZXQgPSB6ZkxueFVzYldyaXRlUmVnKGRldiwgY21kLCBjbWRMZW4pOworCisgICAgLyogaWYgemZMbnhVc2JXcml0ZVJlZygpIHJldHVybiBlcnJvciwgZnJlZSBhbmQgYWxsb2NhdGUgdXJiLCByZXNlbmQgYWdhaW4gKi8KKyAgICBpZiAocmV0ICE9IDApCisgICAgeworICAgICAgICB1c2JfZnJlZV91cmIobWFjcC0+UmVnT3V0VXJiKTsKKyAgICAgICAgbWFjcC0+UmVnT3V0VXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgcmV0ID0gemZMbnhVc2JXcml0ZVJlZyhkZXYsIGNtZCwgY21kTGVuKTsKKyAgICB9Cit9CisKK3UzMl90IHpmd1VzYlNlbmQoemRldl90KiBkZXYsIHU4X3QgZW5kcHQsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAorICAgICAgICAgICAgICAgIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdTMyX3Qgc3RhdHVzOworCisjaWZkZWYgWk1fQ09ORklHX0JJR19FTkRJQU4KKyAgICB1MzJfdCBpaSA9IDA7CisgICAgdTE2X3QgKnBjID0gTlVMTDsKKworICAgIHBjID0gKHUxNl90ICopaGRyOworICAgIGZvcihpaT0wOyBpaTwoaGRybGVuPj4xKTsgaWkrKykKKyAgICB7CisgICAgICAgIHBjW2lpXSA9IGNwdV90b19sZTE2KHBjW2lpXSk7CisgICAgfQorCisgICAgcGMgPSAodTE2X3QgKilzbmFwOworICAgIGZvcihpaT0wOyBpaTwoc25hcExlbj4+MSk7IGlpKyspCisgICAgeworICAgICAgICBwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOworICAgIH0KKworICAgIHBjID0gKHUxNl90ICopdGFpbDsKKyAgICBmb3IoaWk9MDsgaWk8KHRhaWxMZW4+PjEpOyBpaSsrKQorICAgIHsKKyAgICAgICAgcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXR1cyA9IHpmTG54VXNiT3V0KGRldiwgaGRyLCBoZHJsZW4sIHNuYXAsIHNuYXBMZW4sIHRhaWwsIHRhaWxMZW4sIGJ1Ziwgb2Zmc2V0KTsKKyAgICBpZiAoIHN0YXR1cyA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKy8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93d3JhcC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3dyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI1ZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3dyYXAuYwpAQCAtMCwwICsxLDExMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogd3dyYXAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogUGxlYXNlIGluY2x1ZGUgeW91ciBoZWFkZXIgZmlsZXMgaGVyZSAqLworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKK2V4dGVybiB2b2lkIHpmaVJlY3Y4MDIxMSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CitleHRlcm4gdm9pZCB6ZkNvcmVSZWN2KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKK2V4dGVybiB2b2lkIHpmSWRsQ2hrUnNwKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pOworZXh0ZXJuIHZvaWQgemZJZGxSc3AoemRldl90KiBkZXYsIHUzMl90ICpyc3AsIHUxNl90IHJzcExlbik7CisKKworCisvL2V4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07CitleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOworCit1MzJfdCB6ZkxueFVzYlN1Ym1pdFR4RGF0YSh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkxueFVzYkluKHpkZXZfdCogZGV2LCB1cmJfdCAqdXJiLCB6YnVmX3QgKmJ1Zik7Cit1MzJfdCB6ZkxueFN1Ym1pdFJlZ0luVXJiKHpkZXZfdCAqZGV2KTsKK3UzMl90IHpmTG54VXNiU3VibWl0QnVsa1VyYih1cmJfdCAqdXJiLCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiLCB1MTZfdCBlcG51bSwgdTE2X3QgZGlyZWN0aW9uLAorICAgICAgICB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBidWZmZXJfbGVuZ3RoLCB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCk7Cit1MzJfdCB6ZkxueFVzYlN1Ym1pdEludFVyYih1cmJfdCAqdXJiLCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiLCB1MTZfdCBlcG51bSwgdTE2X3QgZGlyZWN0aW9uLAorICAgICAgICB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBidWZmZXJfbGVuZ3RoLCB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCwKKyAgICAgICAgdTMyX3QgaW50ZXJ2YWwpOworCit1MTZfdCB6ZkxueEdldEZyZWVUeFVyYih6ZGV2X3QgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgaWR4OworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIC8vaWR4ID0gKChtYWNwLT5UeFVyYlRhaWwgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKKworICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5UeFVyYkhlYWQpCisgICAgaWYgKG1hY3AtPlR4VXJiQ250ICE9IDApCisgICAgeworICAgICAgICBpZHggPSBtYWNwLT5UeFVyYlRhaWw7CisgICAgICAgIG1hY3AtPlR4VXJiVGFpbCA9ICgobWFjcC0+VHhVcmJUYWlsICsgMSkgJiAoWk1fTUFYX1RYX1VSQl9OVU0gLSAxKSk7CisgICAgICAgIG1hY3AtPlR4VXJiQ250LS07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJtYWNwLT5UeFVyYkNudDogJWRcbiIsIG1hY3AtPlR4VXJiQ250KTsKKyAgICAgICAgaWR4ID0gMHhmZmZmOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiBpZHg7Cit9CisKK3ZvaWQgemZMbnhQdXRUeFVyYih6ZGV2X3QgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgaWR4OworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIGlkeCA9ICgobWFjcC0+VHhVcmJIZWFkICsgMSkgJiAoWk1fTUFYX1RYX1VSQl9OVU0gLSAxKSk7CisKKyAgICAvL2lmIChpZHggIT0gbWFjcC0+VHhVcmJUYWlsKQorICAgIGlmIChtYWNwLT5UeFVyYkNudCA8IFpNX01BWF9UWF9VUkJfTlVNKQorICAgIHsKKyAgICAgICAgbWFjcC0+VHhVcmJIZWFkID0gaWR4OworICAgICAgICBtYWNwLT5UeFVyYkNudCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGsoIlVzYlR4VXJiUSBpbmNvbnNpc3RlbnQ6IFR4VXJiSGVhZDogJWQsIFR4VXJiVGFpbDogJWRcbiIsCisgICAgICAgICAgICAgICAgbWFjcC0+VHhVcmJIZWFkLCBtYWNwLT5UeFVyYlRhaWwpOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworfQorCit1MTZfdCB6ZkxueENoZWNrVHhCdWZmZXJDbnQoemRldl90ICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IFR4QnVmQ250OworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIFR4QnVmQ250ID0gbWFjcC0+VHhCdWZDbnQ7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICByZXR1cm4gVHhCdWZDbnQ7Cit9CisKK1VzYlR4UV90ICp6ZkxueEdldFVzYlR4QnVmZmVyKHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgVXNiVHhRX3QgKlR4UTsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBpZHggPSAoKG1hY3AtPlR4QnVmSGVhZCsxKSAmIChaTV9NQVhfVFhfQlVGX05VTSAtIDEpKTsKKworICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5UeEJ1ZlRhaWwpCisgICAgaWYgKG1hY3AtPlR4QnVmQ250ID4gMCkKKyAgICB7CisgICAgICAgIC8vcHJpbnRrKCJDV1kgLSB6ZndHZXRVc2JUeEJ1ZmZlciAsbWFjcC0+VHhCdWZDbnQgPSAlZFxuIiwgbWFjcC0+VHhCdWZDbnQpOworICAgICAgICBUeFEgPSAoVXNiVHhRX3QgKikmKG1hY3AtPlVzYlR4QnVmUVttYWNwLT5UeEJ1ZkhlYWRdKTsKKyAgICAgICAgbWFjcC0+VHhCdWZIZWFkID0gKChtYWNwLT5UeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CisgICAgICAgIG1hY3AtPlR4QnVmQ250LS07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5UeEJ1ZkhlYWQgIT0gbWFjcC0+VHhCdWZUYWlsKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInpmd0dldFVzYlR4QnVmIFVzYlR4QnVmUSBpbmNvbnNpc3RlbnQ6IFR4QnVmSGVhZDogJWQsIFR4QnVmVGFpbDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG1hY3AtPlR4QnVmSGVhZCwgbWFjcC0+VHhCdWZUYWlsKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICByZXR1cm4gVHhROworfQorCit1MTZfdCB6ZkxueFB1dFVzYlR4QnVmZmVyKHpkZXZfdCAqZGV2LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwKKyAgICAgICAgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwKKyAgICAgICAgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgaWR4OworICAgIFVzYlR4UV90ICpUeFE7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgaWR4ID0gKChtYWNwLT5UeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CisKKyAgICAvKiBGb3IgVHggZGVidWcgKi8KKyAgICAvL3ptX2Fzc2VydChtYWNwLT5UeEJ1ZkNudCA+PSAwKTsgLy8gZGVsZXRlZCBiZWNhdXNlIG9mIGFsd2F5cyB0cnVlCisKKyAgICAvL2lmIChpZHggIT0gbWFjcC0+VHhCdWZIZWFkKQorICAgIGlmIChtYWNwLT5UeEJ1ZkNudCA8IFpNX01BWF9UWF9CVUZfTlVNKQorICAgIHsKKyAgICAgICAgLy9wcmludGsoIkNXWSAtIHpmd1B1dFVzYlR4QnVmZmVyICxtYWNwLT5UeEJ1ZkNudCA9ICVkXG4iLCBtYWNwLT5UeEJ1ZkNudCk7CisgICAgICAgIFR4USA9IChVc2JUeFFfdCAqKSYobWFjcC0+VXNiVHhCdWZRW21hY3AtPlR4QnVmVGFpbF0pOworICAgICAgICBtZW1jcHkoVHhRLT5oZHIsIGhkciwgaGRybGVuKTsKKyAgICAgICAgVHhRLT5oZHJsZW4gPSBoZHJsZW47CisgICAgICAgIG1lbWNweShUeFEtPnNuYXAsIHNuYXAsIHNuYXBMZW4pOworICAgICAgICBUeFEtPnNuYXBMZW4gPSBzbmFwTGVuOworICAgICAgICBtZW1jcHkoVHhRLT50YWlsLCB0YWlsLCB0YWlsTGVuKTsKKyAgICAgICAgVHhRLT50YWlsTGVuID0gdGFpbExlbjsKKyAgICAgICAgVHhRLT5idWYgPSBidWY7CisgICAgICAgIFR4US0+b2Zmc2V0ID0gb2Zmc2V0OworCisgICAgICAgIG1hY3AtPlR4QnVmVGFpbCA9ICgobWFjcC0+VHhCdWZUYWlsKzEpICYgKFpNX01BWF9UWF9CVUZfTlVNIC0gMSkpOworICAgICAgICBtYWNwLT5UeEJ1ZkNudCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgInpmTG54UHV0VXNiVHhCdWZmZXIgVXNiVHhCdWZRIGluY29uc2lzdGVudDogVHhCdWZIZWFkOiAlZCwgVHhCdWZUYWlsOiAlZCwgVHhCdWZDbnQ6ICVkXG4iLAorICAgICAgICAgICAgbWFjcC0+VHhCdWZIZWFkLCBtYWNwLT5UeEJ1ZlRhaWwsIG1hY3AtPlR4QnVmQ250KTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3pidWZfdCAqemZMbnhHZXRVc2JSeEJ1ZmZlcih6ZGV2X3QgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgLy91MTZfdCBpZHg7CisgICAgemJ1Zl90ICpidWY7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgLy9pZHggPSAoKG1hY3AtPlJ4QnVmSGVhZCsxKSAmIChaTV9NQVhfUlhfVVJCX05VTSAtIDEpKTsKKworICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5SeEJ1ZlRhaWwpCisgICAgaWYgKG1hY3AtPlJ4QnVmQ250ICE9IDApCisgICAgeworICAgICAgICBidWYgPSBtYWNwLT5Vc2JSeEJ1ZlFbbWFjcC0+UnhCdWZIZWFkXTsKKyAgICAgICAgbWFjcC0+UnhCdWZIZWFkID0gKChtYWNwLT5SeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1JYX1VSQl9OVU0gLSAxKSk7CisgICAgICAgIG1hY3AtPlJ4QnVmQ250LS07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50aygiUnhCdWZRIGluY29uc2lzdGVudDogUnhCdWZIZWFkOiAlZCwgUnhCdWZUYWlsOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQsIG1hY3AtPlJ4QnVmVGFpbCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICByZXR1cm4gYnVmOworfQorCit1MzJfdCB6ZkxueFB1dFVzYlJ4QnVmZmVyKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgaWR4OworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIGlkeCA9ICgobWFjcC0+UnhCdWZUYWlsKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOworCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlJ4QnVmSGVhZCkKKyAgICBpZiAobWFjcC0+UnhCdWZDbnQgIT0gWk1fTUFYX1JYX1VSQl9OVU0pCisgICAgeworICAgICAgICBtYWNwLT5Vc2JSeEJ1ZlFbbWFjcC0+UnhCdWZUYWlsXSA9IGJ1ZjsKKyAgICAgICAgbWFjcC0+UnhCdWZUYWlsID0gaWR4OworICAgICAgICBtYWNwLT5SeEJ1ZkNudCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGsoIlJ4QnVmUSBpbmNvbnNpc3RlbnQ6IFJ4QnVmSGVhZDogJWQsIFJ4QnVmVGFpbDogJWRcbiIsCisgICAgICAgICAgICAgICAgbWFjcC0+UnhCdWZIZWFkLCBtYWNwLT5SeEJ1ZlRhaWwpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkxueFVzYkRhdGFPdXRfY2FsbGJhY2sodXJiX3QgKnVyYikKK3sKKyAgICB6ZGV2X3QqIGRldiA9IHVyYi0+Y29udGV4dDsKKyAgICAvL1VzYlR4UV90ICpUeERhdGE7CisKKyAgICAvKiBHaXZlIHRoZSB1cmIgYmFjayAqLworICAgIHpmTG54UHV0VHhVcmIoZGV2KTsKKworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYW55IHBlbmRpbmcgYnVmZmVyIG5lZWRlZCAqLworICAgIC8qIHRvIGJlIHNlbnQgKi8KKyAgICBpZiAoemZMbnhDaGVja1R4QnVmZmVyQ250KGRldikgIT0gMCkKKyAgICB7CisgICAgICAgIC8vVHhEYXRhID0gemZ3R2V0VXNiVHhCdWZmZXIoZGV2KTsKKworICAgICAgICAvL2lmIChUeERhdGEgPT0gTlVMTCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHByaW50aygiR2V0IGEgTlVMTCBidWZmZXIgZnJvbSB6ZndHZXRVc2JUeEJ1ZmZlclxuIik7CisgICAgICAgIC8vICAgIHJldHVybjsKKyAgICAgICAgLy99CisgICAgICAgIC8vZWxzZQorICAgICAgICAvL3sKKyAgICAgICAgICAgIHpmTG54VXNiU3VibWl0VHhEYXRhKGRldik7CisgICAgICAgIC8vfQorICAgIH0KK30KKwordm9pZCB6ZkxueFVzYkRhdGFJbl9jYWxsYmFjayh1cmJfdCAqdXJiKQoreworICAgIHpkZXZfdCogZGV2ID0gdXJiLT5jb250ZXh0OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB6YnVmX3QgKmJ1ZjsKKyAgICB6YnVmX3QgKm5ld19idWY7CisgICAgaW50IHN0YXR1czsKKworI2lmIFpNX1VTQl9TVFJFQU1fTU9ERSA9PSAxCisgICAgc3RhdGljIGludCByZW1haW5fbGVuID0gMCwgY2hlY2tfcGFkID0gMCwgY2hlY2tfbGVuID0gMDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGludCBjaGtfaWR4OworICAgIHUxNl90IHBrdF9sZW47CisgICAgdTE2X3QgcGt0X3RhZzsKKyAgICB1MTZfdCBpaTsKKyAgICB6YnVmX3QgKnJ4QnVmUG9vbFs4XTsKKyAgICB1MTZfdCByeEJ1ZlBvb2xJbmRleCA9IDA7CisjZW5kaWYKKworICAgIC8qIENoZWNrIHN0YXR1cyBmb3IgVVJCICovCisgICAgaWYgKHVyYi0+c3RhdHVzICE9IDApeworICAgICAgICBwcmludGsoInpmTG54VXNiRGF0YUluX2NhbGxiYWNrKCkgOiBzdGF0dXM9MHgleFxuIiwgdXJiLT5zdGF0dXMpOworICAgICAgICBpZiAoKHVyYi0+c3RhdHVzICE9IC1FTk9FTlQpICYmICh1cmItPnN0YXR1cyAhPSAtRUNPTk5SRVNFVCkKKyAgICAgICAgICAgICYmICh1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBJUEUpeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBJUEUiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FUFJPVE8peworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBST1RPIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJ1cmItPnN0YXR1czogMHglMDh4XG4iLCB1cmItPnN0YXR1cyk7CisKKyAgICAgICAgLyogRGVxdWV1ZSBza2IgYnVmZmVyICovCisgICAgICAgIGJ1ZiA9IHpmTG54R2V0VXNiUnhCdWZmZXIoZGV2KTsKKyAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKKyAgICAgICAgI2lmIDAKKyAgICAgICAgLyogRW5xdWV1ZSBza2IgYnVmZmVyICovCisgICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBidWYpOworCisgICAgICAgIC8qIFN1Ym1pdCBhIFJ4IHVyYiAqLworICAgICAgICB6ZkxueFVzYkluKGRldiwgdXJiLCBidWYpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiR2V0IGFuIFVSQiB3aG9zZSBsZW5ndGggaXMgemVybyIpOworICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICB9CisKKyAgICAvKiBEZXF1ZXVlIHNrYiBidWZmZXIgKi8KKyAgICBidWYgPSB6ZkxueEdldFVzYlJ4QnVmZmVyKGRldik7CisKKyAgICAvL3pmd0J1ZlNldFNpemUoZGV2LCBidWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisgICAgYnVmLT50YWlsID0gMDsKKyAgICBidWYtPmxlbiA9IDA7CisjZWxzZQorICAgIGJ1Zi0+dGFpbCA9IGJ1Zi0+ZGF0YTsKKyAgICBidWYtPmxlbiA9IDA7CisjZW5kaWYKKworICAgIGlmICgoYnVmLT50YWlsICsgdXJiLT5hY3R1YWxfbGVuZ3RoKSA+IGJ1Zi0+ZW5kKQorICAgICAgICBCVUcoKTsKKworICAgIHNrYl9wdXQoYnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisjaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKKyAgICBpZiAocmVtYWluX2xlbiAhPSAwKQorICAgIHsKKyAgICAgICAgemJ1Zl90ICpyZW1haW5fYnVmID0gbWFjcC0+cmVhbWluX2J1ZjsKKworICAgICAgICBpbmRleCA9IHJlbWFpbl9sZW47CisgICAgICAgIHJlbWFpbl9sZW4gLT0gY2hlY2tfcGFkOworCisgICAgICAgIC8qICBDb3B5IGRhdGEgKi8KKyAgICAgICAgbWVtY3B5KCYocmVtYWluX2J1Zi0+ZGF0YVtjaGVja19sZW5dKSwgYnVmLT5kYXRhLCByZW1haW5fbGVuKTsKKyAgICAgICAgY2hlY2tfbGVuICs9IHJlbWFpbl9sZW47CisgICAgICAgIHJlbWFpbl9sZW4gPSAwOworCisgICAgICAgIHJ4QnVmUG9vbFtyeEJ1ZlBvb2xJbmRleCsrXSA9IHJlbWFpbl9idWY7CisgICAgfQorCisgICAgd2hpbGUoaW5kZXggPCB1cmItPmFjdHVhbF9sZW5ndGgpCisgICAgeworICAgICAgICBwa3RfbGVuID0gYnVmLT5kYXRhW2luZGV4XSArIChidWYtPmRhdGFbaW5kZXgrMV0gPDwgOCk7CisgICAgICAgIHBrdF90YWcgPSBidWYtPmRhdGFbaW5kZXgrMl0gKyAoYnVmLT5kYXRhW2luZGV4KzNdIDw8IDgpOworCisgICAgICAgIGlmIChwa3RfdGFnID09IDB4NGUwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBhZF9sZW47CisKKyAgICAgICAgICAgIC8vcHJpbnRrKCJHZXQgYSBwYWNrZXQsIGluZGV4OiAlZCwgcGt0X2xlbjogMHglMDR4XG4iLCBpbmRleCwgcGt0X2xlbik7CisgICAgICAgICAgICAjaWYgMAorICAgICAgICAgICAgLyogRHVtcCBkYXRhICovCisgICAgICAgICAgICBmb3IgKGlpID0gaW5kZXg7IGlpIDwgcGt0X2xlbis0OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIiUwMnggIiwgKGJ1Zi0+ZGF0YVtpaV0gJiAweGZmKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKCsraWkgJSAxNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgcGFkX2xlbiA9IDQgLSAocGt0X2xlbiAmIDB4Myk7CisKKyAgICAgICAgICAgIGlmKHBhZF9sZW4gPT0gNCkKKyAgICAgICAgICAgICAgICBwYWRfbGVuID0gMDsKKworICAgICAgICAgICAgY2hrX2lkeCA9IGluZGV4OworICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDQgKyBwa3RfbGVuICsgcGFkX2xlbjsKKworICAgICAgICAgICAgaWYgKGluZGV4ID4gWk1fTUFYX1JYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbWFpbl9sZW4gPSBpbmRleCAtIFpNX01BWF9SWF9CVUZGRVJfU0laRTsgLy8gLSBwYWRfbGVuOworICAgICAgICAgICAgICAgIGNoZWNrX2xlbiA9IFpNX01BWF9SWF9CVUZGRVJfU0laRSAtIGNoa19pZHggLSA0OworICAgICAgICAgICAgICAgIGNoZWNrX3BhZCA9IHBhZF9sZW47CisKKyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAvL25ld19idWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisgICAgICAgICAgICAgICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKworICAgICAgICAgICAgICAgIC8qIFNldCBza2IgYnVmZmVyIGxlbmd0aCAqLworICAgICAgICAgICAgI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSAwOworICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IDA7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSBuZXdfYnVmLT5kYXRhOworICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IDA7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIHNrYl9wdXQobmV3X2J1ZiwgcGt0X2xlbik7CisKKyAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkobmV3X2J1Zi0+ZGF0YSwgJihidWYtPmRhdGFbY2hrX2lkeCs0XSksIGNoZWNrX2xlbik7CisKKyAgICAgICAgICAgICAgICAvKiBSZWNvcmQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgICAgICAgICAgbWFjcC0+cmVhbWluX2J1ZiA9IG5ld19idWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICNpZmRlZiBaTV9ET05UX0NPUFlfUlhfQlVGRkVSCisgICAgICAgICAgICAgICAgaWYgKHJ4QnVmUG9vbEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdfYnVmID0gc2tiX2Nsb25lKGJ1ZiwgR0ZQX0FUT01JQyk7CisKKyAgICAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+ZGF0YSA9ICYoYnVmLT5kYXRhW2Noa19pZHgrNF0pOworICAgICAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSBwa3RfbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworCisgICAgICAgICAgICAgICAgLyogU2V0IHNrYiBidWZmZXIgbGVuZ3RoICovCisgICAgICAgICAgICAjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IDA7CisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7CisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgc2tiX3B1dChuZXdfYnVmLCBwa3RfbGVuKTsKKworICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG1lbWNweShuZXdfYnVmLT5kYXRhLCAmKGJ1Zi0+ZGF0YVtjaGtfaWR4KzRdKSwgcGt0X2xlbik7CisKKyAgICAgICAgI2lmZGVmIFpNX0RPTlRfQ09QWV9SWF9CVUZGRVIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIHJ4QnVmUG9vbFtyeEJ1ZlBvb2xJbmRleCsrXSA9IG5ld19idWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgdGFnLCBwa3RfbGVuOiAweCUwNHgsIHRhZzogMHglMDR4XG4iLCBwa3RfbGVuLCBwa3RfdGFnKTsKKworICAgICAgICAgICAgLyogRnJlZSBidWZmZXIgKi8KKyAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CisKKyAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworICAgICAgICAgICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKworICAgICAgICAgICAgLyogRW5xdWV1ZSBza2IgYnVmZmVyICovCisgICAgICAgICAgICB6ZkxueFB1dFVzYlJ4QnVmZmVyKGRldiwgbmV3X2J1Zik7CisKKyAgICAgICAgICAgIC8qIFN1Ym1pdCBhIFJ4IHVyYiAqLworICAgICAgICAgICAgemZMbnhVc2JJbihkZXYsIHVyYiwgbmV3X2J1Zik7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgYnVmZmVyICovCisgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKKyNlbmRpZgorCisgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCisgICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKworICAgIC8qIEVucXVldWUgc2tiIGJ1ZmZlciAqLworICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBuZXdfYnVmKTsKKworICAgIC8qIFN1Ym1pdCBhIFJ4IHVyYiAqLworICAgIHpmTG54VXNiSW4oZGV2LCB1cmIsIG5ld19idWYpOworCisjaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKKyAgICBmb3IoaWkgPSAwOyBpaSA8IHJ4QnVmUG9vbEluZGV4OyBpaSsrKQorICAgIHsKKyAgICAgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YoZGV2LCByeEJ1ZlBvb2xbaWldKTsKKyAgICB9CisjZWxzZQorICAgIC8qIHBhc3MgZGF0YSB0byB1cHBlciBsYXllciAqLworICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWN2KGRldiwgYnVmKTsKKyNlbmRpZgorfQorCit2b2lkIHpmTG54VXNiUmVnT3V0X2NhbGxiYWNrKHVyYl90ICp1cmIpCit7CisgICAgLy9kZXZfdCogZGV2ID0gdXJiLT5jb250ZXh0OworCisgICAgLy9wcmludGsoS0VSTl9FUlIgInpmd1VzYlJlZ091dF9jYWxsYmFja1xuIik7Cit9CisKK3ZvaWQgemZMbnhVc2JSZWdJbl9jYWxsYmFjayh1cmJfdCAqdXJiKQoreworICAgIHpkZXZfdCogZGV2ID0gdXJiLT5jb250ZXh0OworICAgIHUzMl90IHJzcFs2NC80XTsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIENoZWNrIHN0YXR1cyBmb3IgVVJCICovCisgICAgaWYgKHVyYi0+c3RhdHVzICE9IDApeworICAgICAgICBwcmludGsoInpmTG54VXNiUmVnSW5fY2FsbGJhY2soKSA6IHN0YXR1cz0weCV4XG4iLCB1cmItPnN0YXR1cyk7CisgICAgICAgIGlmICgodXJiLT5zdGF0dXMgIT0gLUVOT0VOVCkgJiYgKHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKQorICAgICAgICAgICAgJiYgKHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FUElQRSl7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUElQRSIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTyl7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUFJPVE8iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgInVyYi0+c3RhdHVzOiAweCUwOHhcbiIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiR2V0IGFuIFVSQiB3aG9zZSBsZW5ndGggaXMgemVybyIpOworICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICB9CisKKyAgICAvKiBDb3B5IGRhdGEgaW50byByZXNwb25lIGJ1ZmZlciAqLworICAgIG1lbWNweShyc3AsIG1hY3AtPnJlZ1VzYlJlYWRCdWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKyAgICAvKiBOb3RpZnkgdG8gdXBwZXIgbGF5ZXIgKi8KKyAgICAvL3pmSWRsQ2hrUnNwKGRldiwgcnNwLCAodTE2X3QpdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKyAgICAvL3pmaVVzYlJlZ0luKGRldiwgcnNwLCAodTE2X3QpdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKyAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVnSW4oZGV2LCByc3AsICh1MTZfdCl1cmItPmFjdHVhbF9sZW5ndGgpOworCisgICAgLyogSXNzdWUgYW5vdGhlciBVU0IgSU4gVVJCICovCisgICAgemZMbnhTdWJtaXRSZWdJblVyYihkZXYpOworfQorCit1MzJfdCB6ZkxueFN1Ym1pdFJlZ0luVXJiKHpkZXZfdCAqZGV2KQoreworICAgIHUzMl90IHJldDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvKiBTdWJtaXQgYSByeCB1cmIgKi8KKyAgICAvL3JldCA9IHpmTG54VXNiU3VibWl0QnVsa1VyYihtYWNwLT5SZWdJblVyYiwgbWFjcC0+dWRldiwKKyAgICAvLyAgICAgICAgVVNCX1JFR19JTl9QSVBFLCBVU0JfRElSX0lOLCBtYWNwLT5yZWdVc2JSZWFkQnVmLAorICAgIC8vICAgICAgICBaTV9VU0JfUkVHX01BWF9CVUZfU0laRSwgemZMbnhVc2JSZWdJbl9jYWxsYmFjaywgZGV2KTsKKyAgICAvL0NXWWFuZygtKQorICAgIC8vaWYgKHJldCAhPSAwKQorICAgIC8vICAgIHByaW50aygiemZ3VXNiU3VibWl0QnVsa1VyYiBmYWlsLCBzdGF0dXM6IDB4JTA4eFxuIiwgKGludClyZXQpOworCisgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRJbnRVcmIobWFjcC0+UmVnSW5VcmIsIG1hY3AtPnVkZXYsCisgICAgICAgICAgICBVU0JfUkVHX0lOX1BJUEUsIFVTQl9ESVJfSU4sIG1hY3AtPnJlZ1VzYlJlYWRCdWYsCisgICAgICAgICAgICBaTV9VU0JfUkVHX01BWF9CVUZfU0laRSwgemZMbnhVc2JSZWdJbl9jYWxsYmFjaywgZGV2LCAxKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3UzMl90IHpmTG54VXNiU3VibWl0VHhEYXRhKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGk7CisgICAgdTMyX3QgcmV0OworICAgIHUxNl90IGZyZWVUeFVyYjsKKyAgICB1OF90ICpwdVR4QnVmID0gTlVMTDsKKyAgICBVc2JUeFFfdCAqVHhEYXRhOworICAgIGludCBsZW4gPSAwOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQorICAgIHU4X3QgICAgICAgICAgICAgICBpaTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgdXNiVHhBZ2dDbnQ7CisgICAgdTE2X3QgICAgICAgICAgICAgICpwVXNiVHhIZHI7CisgICAgVXNiVHhRX3QgICAgICAgICAgICpUeFFQb29sW1pNX01BWF9UWF9BR0dSRUdBVEVfTlVNXTsKKyNlbmRpZgorCisgICAgLyogRmlyc3QgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGZyZWUgVVJCICovCisgICAgZnJlZVR4VXJiID0gemZMbnhHZXRGcmVlVHhVcmIoZGV2KTsKKworICAgIC8qIElmIHRoZXJlIGlzIG5vIGFueSBmcmVlIFR4IFVyYiAqLworICAgIGlmIChmcmVlVHhVcmIgPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIkNhbid0IGdldCBmcmVlIFR4IFVyYlxuIik7CisgICAgICAgIC8vcHJpbnRrKCJDV1kgLSBDYW4ndCBnZXQgZnJlZSBUeCBVcmJcbiIpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisgICAgdXNiVHhBZ2dDbnQgPSB6ZkxueENoZWNrVHhCdWZmZXJDbnQoZGV2KTsKKworICAgIGlmICh1c2JUeEFnZ0NudCA+PSBaTV9NQVhfVFhfQUdHUkVHQVRFX05VTSkKKyAgICB7CisgICAgICAgdXNiVHhBZ2dDbnQgPSBaTV9NQVhfVFhfQUdHUkVHQVRFX05VTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICB1c2JUeEFnZ0NudCA9IDE7CisgICAgfQorCisgICAgLy9wcmludGsoInVzYlR4QWdnQ250OiAlZFxuIiwgdXNiVHhBZ2dDbnQpOworI2VuZGlmCisKKyNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQorICAgIGZvcihpaSA9IDA7IGlpIDwgdXNiVHhBZ2dDbnQ7IGlpKyspCisgICAgeworI2VuZGlmCisgICAgLyogRGVxdWV1ZSB0aGUgcGFja2V0IGZyb20gVXNiVHhCdWZRICovCisgICAgVHhEYXRhID0gemZMbnhHZXRVc2JUeEJ1ZmZlcihkZXYpOworICAgIGlmIChUeERhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIEdpdmUgdGhlIHVyYiBiYWNrICovCisgICAgICAgIHpmTG54UHV0VHhVcmIoZGV2KTsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisKKyAgICAvKiBQb2ludCB0byB0aGUgZnJlZVR4VXJiIGJ1ZmZlciAqLworICAgIHB1VHhCdWYgPSBtYWNwLT50eFVzYkJ1ZltmcmVlVHhVcmJdOworCisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICBwdVR4QnVmICs9IG9mZnNldDsKKyAgICBwVXNiVHhIZHIgPSAodTE2X3QgKilwdVR4QnVmOworCisgICAgLyogQWRkIHRoZSBwYWNrZXQgbGVuZ3RoIGFuZCB0YWcgaW5mb3JtYXRpb24gKi8KKyAgICAqcFVzYlR4SGRyKysgPSBUeERhdGEtPmhkcmxlbiArIFR4RGF0YS0+c25hcExlbiArCisgICAgICAgICAgICAgKFR4RGF0YS0+YnVmLT5sZW4gLSBUeERhdGEtPm9mZnNldCkgKyAgVHhEYXRhLT50YWlsTGVuOworCisgICAgKnBVc2JUeEhkcisrID0gMHg2OTdlOworCisgICAgcHVUeEJ1ZiArPSA0OworI2VuZGlmIC8vICNpZmRlZiBaTV9VU0JfVFhfU1RSRUFNX01PREUKKworICAgIC8qIENvcHkgV0xBTiBoZWFkZXIgYW5kIHBhY2tldCBidWZmZXIgaW50byBVU0IgYnVmZmVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5oZHJsZW47IGkrKykKKyAgICB7CisgICAgICAgICpwdVR4QnVmKysgPSBUeERhdGEtPmhkcltpXTsKKyAgICB9CisKKyAgICAvKiBDb3B5IFNOQVAgaGVhZGVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5zbmFwTGVuOyBpKyspCisgICAgeworICAgICAgICAqcHVUeEJ1ZisrID0gVHhEYXRhLT5zbmFwW2ldOworICAgIH0KKworICAgIC8qIENvcHkgcGFja2V0IGJ1ZmZlciAqLworICAgIGZvcihpID0gMDsgaSA8IFR4RGF0YS0+YnVmLT5sZW4gLSBUeERhdGEtPm9mZnNldDsgaSsrKQorICAgIHsKKyAgICAJLy8qcHVUeEJ1ZisrID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIFR4RGF0YS0+YnVmLCBpKTsKKyAgICAJKnB1VHhCdWYrKyA9ICoodThfdCopKCh1OF90KilUeERhdGEtPmJ1Zi0+ZGF0YStpK1R4RGF0YS0+b2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKiBDb3B5IHRhaWwgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPnRhaWxMZW47IGkrKykKKyAgICB7CisgICAgICAgICpwdVR4QnVmKysgPSBUeERhdGEtPnRhaWxbaV07CisgICAgfQorCisgICAgbGVuID0gVHhEYXRhLT5oZHJsZW4rVHhEYXRhLT5zbmFwTGVuK1R4RGF0YS0+YnVmLT5sZW4rVHhEYXRhLT50YWlsTGVuLVR4RGF0YS0+b2Zmc2V0OworCisgICAgI2lmIDAKKyAgICBpZiAoVHhEYXRhLT5oZHJsZW4gIT0gMCkKKyAgICB7CisgICAgICAgIHB1VHhCdWYgPSBtYWNwLT50eFVzYkJ1ZltmcmVlVHhVcmJdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiJTAyeCAiLCBwdVR4QnVmW2ldKTsKKyAgICAgICAgICAgIGlmIChpICUgMTYgPT0gMTUpCisgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICB9CisgICAgICAgIHByaW50aygiXG4iKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgI2lmIDAKKyAgICAvKiBGb3IgZGVidWcgcHVycG9zZSAqLworICAgIGlmKFR4RGF0YS0+aGRyWzldICYgMHg0MCkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICB1MTZfdCBjdHJsTGVuID0gVHhEYXRhLT5oZHJbMF0gKyAoVHhEYXRhLT5oZHJbMV0gPDwgOCk7CisKKyAgICAgICAgaWYgKGN0cmxMZW4gIT0gbGVuICsgNCkKKyAgICAgICAgeworICAgICAgICAvKiBEdW1wIGNvbnRyb2wgc2V0dGluZyAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIFR4RGF0YS0+aGRyW2ldKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjdHJMZW46ICVkLCBoZHJMZW46ICVkLCBzbmFwTGVuOiAlZFxuIiwgY3RybExlbiwgVHhEYXRhLT5oZHJsZW4sIFR4RGF0YS0+c25hcExlbik7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiYnVmTGVuOiAlZCwgdGFpbExlbjogJWQsIGxlbjogJWRcbiIsIFR4RGF0YS0+YnVmLT5sZW4sIFR4RGF0YS0+dGFpbExlbiwgbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisgICAgLy8gQWRkIHRoZSBMZW5ndGggYW5kIFRhZworICAgIGxlbiArPSA0OworCisgICAgLy9wcmludGsoIiVkIHBhY2tldCwgbGVuZ3RoOiAlZFxuIiwgaWkrMSwgbGVuKTsKKworICAgIGlmIChpaSA8IChaTV9NQVhfVFhfQUdHUkVHQVRFX05VTS0xKSkKKyAgICB7CisgICAgICAgIC8qIFBhZCB0aGUgYnVmZmVyIHRvIGZpcm13YXJlIGRlc2NyaXB0b3IgYm91bmRhcnkgKi8KKyAgICAgICAgb2Zmc2V0ICs9ICgoKGxlbi0xKSAvIDQpICsgMSkgKiA0OworICAgIH0KKworICAgIGlmIChpaSA9PSAoWk1fTUFYX1RYX0FHR1JFR0FURV9OVU0tMSkpCisgICAgeworICAgICAgICBsZW4gKz0gb2Zmc2V0OworICAgIH0KKworICAgIFR4UVBvb2xbaWldID0gVHhEYXRhOworCisgICAgLy9EYmdQcmludCgiJWQgcGFja2V0LCBvZmZzZXQ6ICVkXG4iLCBpaSsxLCBwVXNiVHhUcmFuc2Zlci0+b2Zmc2V0KTsKKworICAgIC8qIGZyZWUgcGFja2V0ICovCisgICAgLy96ZkJ1ZkZyZWUoZGV2LCB0eERhdGEtPmJ1Zik7CisgICAgfQorI2VuZGlmCisgICAgLy9wcmludGsoIkNXWSAtIGNhbGwgemZ3VXNiU3VibWl0QnVsa1VyYigpLCBsZW4gPSAweCVkXG4iLCBsZW4pOworICAgIC8qIFN1Ym1pdCBhIHR4IHVyYiAqLworICAgIHJldCA9IHpmTG54VXNiU3VibWl0QnVsa1VyYihtYWNwLT5XbGFuVHhEYXRhVXJiW2ZyZWVUeFVyYl0sIG1hY3AtPnVkZXYsCisgICAgICAgICAgICBVU0JfV0xBTl9UWF9QSVBFLCBVU0JfRElSX09VVCwgbWFjcC0+dHhVc2JCdWZbZnJlZVR4VXJiXSwKKyAgICAgICAgICAgIGxlbiwgemZMbnhVc2JEYXRhT3V0X2NhbGxiYWNrLCBkZXYpOworICAgIC8vQ1dZYW5nKC0pCisgICAgLy9pZiAocmV0ICE9IDApCisgICAgLy8gICAgcHJpbnRrKCJ6ZndVc2JTdWJtaXRCdWxrVXJiIGZhaWwsIHN0YXR1czogMHglMDh4XG4iLCAoaW50KXJldCk7CisKKyAgICAvKiBmcmVlIHBhY2tldCAqLworICAgIC8vZGV2X2tmcmVlX3NrYl9hbnkoVHhEYXRhLT5idWYpOworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisgICAgZm9yKGlpID0gMDsgaWkgPCB1c2JUeEFnZ0NudDsgaWkrKykKKyAgICAgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlKGRldiwgVHhRUG9vbFtpaV0tPmJ1ZiwgMSwgVHhRUG9vbFtpaV0tPmhkcik7CisjZWxzZQorICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZShkZXYsIFR4RGF0YS0+YnVmLCAxLCBUeERhdGEtPmhkcik7CisjZW5kaWYKKworICAgIHJldHVybiByZXQ7Cit9CisKKworCit1MzJfdCB6ZkxueFVzYkluKHpkZXZfdCogZGV2LCB1cmJfdCAqdXJiLCB6YnVmX3QgKmJ1ZikKK3sKKyAgICB1MzJfdCByZXQ7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLyogU3VibWl0IGEgcnggdXJiICovCisgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRCdWxrVXJiKHVyYiwgbWFjcC0+dWRldiwgVVNCX1dMQU5fUlhfUElQRSwKKyAgICAgICAgICAgIFVTQl9ESVJfSU4sIGJ1Zi0+ZGF0YSwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgemZMbnhVc2JEYXRhSW5fY2FsbGJhY2ssIGRldik7CisgICAgLy9DV1lhbmcoLSkKKyAgICAvL2lmIChyZXQgIT0gMCkKKyAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3UzMl90IHpmTG54VXNiV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTMyX3QgcmV0OworCisjaWZkZWYgWk1fQ09ORklHX0JJR19FTkRJQU4KKyAgICBpbnQgaWkgPSAwOworCisgICAgZm9yKGlpPTA7IGlpPChjbWRMZW4+PjIpOyBpaSsrKQorCWNtZFtpaV0gPSBjcHVfdG9fbGUzMihjbWRbaWldKTsKKyNlbmRpZgorCisgICAgbWVtY3B5KG1hY3AtPnJlZ1VzYldyaXRlQnVmLCBjbWQsIGNtZExlbik7CisKKyAgICAvKiBJc3N1ZSBhbiBVU0IgT3V0IHRyYW5zZmVyICovCisgICAgLyogU3VibWl0IGEgdHggdXJiICovCisgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRJbnRVcmIobWFjcC0+UmVnT3V0VXJiLCBtYWNwLT51ZGV2LAorICAgICAgICAgICAgVVNCX1JFR19PVVRfUElQRSwgVVNCX0RJUl9PVVQsIG1hY3AtPnJlZ1VzYldyaXRlQnVmLAorICAgICAgICAgICAgY21kTGVuLCB6ZkxueFVzYlJlZ091dF9jYWxsYmFjaywgZGV2LCAxKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKwordTMyX3QgemZMbnhVc2JPdXQoemRldl90KiBkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAorICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHUzMl90IHJldDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvKiBDaGVjayBsZW5ndGggb2YgdGFpbCBidWZmZXIgKi8KKyAgICAvL3ptX2Fzc2VydCgodGFpbExlbiA8PSAxNikpOworCisgICAgLyogRW5xdWV1ZSB0aGUgcGFja2V0IGludG8gVXNiVHhCdWZRICovCisgICAgaWYgKHpmTG54UHV0VXNiVHhCdWZmZXIoZGV2LCBoZHIsIGhkcmxlbiwgc25hcCwgc25hcExlbiwgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQpID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIGZyZWUgcGFja2V0ICovCisgICAgICAgIC8vcHJpbnRrKCJDV1kgLSB6ZndQdXRVc2JUeEJ1ZmZlciBFcnJvciwgZnJlZSBwYWNrZXRcbiIpOworICAgICAgICAvL2Rldl9rZnJlZV9za2JfYW55KGJ1Zik7CisgICAgICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZShkZXYsIGJ1ZiwgMCwgaGRyKTsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisKKyAgICAvL3JldHVybiAwOworICAgIC8vcHJpbnRrKCJDV1kgLSBjYWxsIHpmd1VzYlN1Ym1pdFR4RGF0YSgpXG4iKTsKKyAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdFR4RGF0YShkZXYpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgemZMbnhJbml0VXNiVHhRKHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIHByaW50ayhLRVJOX0VSUiAiemZ3SW5pdFVzYlR4UVxuIik7CisKKyAgICAvKiBaZXJvIG1lbW9yeSBmb3IgVXNiVHhCdWZRICovCisgICAgbWVtc2V0KG1hY3AtPlVzYlR4QnVmUSwgMCwgc2l6ZW9mKFVzYlR4UV90KSAqIFpNX01BWF9UWF9VUkJfTlVNKTsKKworICAgIG1hY3AtPlR4QnVmSGVhZCA9IDA7CisgICAgbWFjcC0+VHhCdWZUYWlsID0gMDsKKyAgICBtYWNwLT5UeFVyYkhlYWQgPSAwOworICAgIG1hY3AtPlR4VXJiVGFpbCA9IDA7CisgICAgbWFjcC0+VHhVcmJDbnQgPSBaTV9NQVhfVFhfVVJCX05VTTsKK30KKwordm9pZCB6ZkxueEluaXRVc2JSeFEoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKyAgICB6YnVmX3QgKmJ1ZjsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvKiBaZXJvIG1lbW9yeSBmb3IgVXNiUnhCdWZRICovCisgICAgbWVtc2V0KG1hY3AtPlVzYlJ4QnVmUSwgMCwgc2l6ZW9mKHpidWZfdCAqKSAqIFpNX01BWF9SWF9VUkJfTlVNKTsKKworICAgIG1hY3AtPlJ4QnVmSGVhZCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIC8vYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworICAgICAgICBidWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisgICAgICAgIG1hY3AtPlVzYlJ4QnVmUVtpXSA9IGJ1ZjsKKyAgICB9CisKKyAgICAvL21hY3AtPlJ4QnVmVGFpbCA9IFpNX01BWF9SWF9VUkJfTlVNIC0gMTsKKyAgICBtYWNwLT5SeEJ1ZlRhaWwgPSAwOworCisgICAgLyogU3VibWl0IGFsbCBSeCB1cmJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9SWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICB6ZkxueFB1dFVzYlJ4QnVmZmVyKGRldiwgbWFjcC0+VXNiUnhCdWZRW2ldKTsKKyAgICAgICAgemZMbnhVc2JJbihkZXYsIG1hY3AtPldsYW5SeERhdGFVcmJbaV0sIG1hY3AtPlVzYlJ4QnVmUVtpXSk7CisgICAgfQorfQorCisKKwordTMyX3QgemZMbnhVc2JTdWJtaXRCdWxrVXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCisgICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0KQoreworICAgIHUzMl90IHJldDsKKworICAgIGlmKGRpcmVjdGlvbiA9PSBVU0JfRElSX09VVCkKKyAgICB7CisgICAgICAgIHVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdXNiLCB1c2Jfc25kYnVsa3BpcGUodXNiLCBlcG51bSksCisgICAgICAgICAgICAgICAgdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCk7CisKKyAgICAgICAgdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdXNiLCB1c2JfcmN2YnVsa3BpcGUodXNiLCBlcG51bSksCisgICAgICAgICAgICAgICAgdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCk7CisgICAgfQorCisgICAgaWYgKGVwbnVtID09IDQpCisgICAgeworICAgICAgICBpZiAodXJiLT5oY3ByaXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcHJpbnRrKCJDV1kgLSB1cmItPmhjcHJpdiBzZXQgYnkgdW5rbm93biByZWFzb24sIHJlc2V0IGl0XG4iKTsKKyAgICAgICAgICAgIC8vdXJiLT5oY3ByaXYgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKyAgICBpZiAoKGVwbnVtID09IDQpICYgKHJldCAhPSAwKSkKKyAgICB7CisgICAgICAgIC8vcHJpbnRrKCJDV1kgLSByZXQgPSAleFxuIiwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZMbnhVc2JTdWJtaXRJbnRVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKKyAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQsCisgICAgICAgIHUzMl90IGludGVydmFsKQoreworICAgIHUzMl90IHJldDsKKworICAgIGlmKGRpcmVjdGlvbiA9PSBVU0JfRElSX09VVCkKKyAgICB7CisgICAgICAgIHVzYl9maWxsX2ludF91cmIodXJiLCB1c2IsIHVzYl9zbmRidWxrcGlwZSh1c2IsIGVwbnVtKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0LCBpbnRlcnZhbCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVzYl9maWxsX2ludF91cmIodXJiLCB1c2IsIHVzYl9yY3ZidWxrcGlwZSh1c2IsIGVwbnVtKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0LCBpbnRlcnZhbCk7CisgICAgfQorCisgICAgcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworaW50IHpmTG54Q2VuY1NlbmRNc2coc3RydWN0IHNvY2sgKm5ldGxpbmtfc2ssIHVfaW50OF90ICptc2csIGludCBsZW4pCit7CisjZGVmaW5lIENPTU1UWVBFX0dST1VQICAgOAorI2RlZmluZSBXQUlfS19NU0cgICAgICAgIDB4MTEKKworCWludCByZXQgPSAtMTsKKwlpbnQgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpvbGRfdGFpbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCWNoYXIgKnBvcyA9IE5VTEw7CisKKwlzaXplID0gTkxNU0dfU1BBQ0UobGVuKTsKKwlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQyk7CisKKwlpZihza2IgPT0gTlVMTCkKKwl7CisJCXByaW50aygiZGV2X2FsbG9jX3NrYiBmYWlsdXJlIFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlvbGRfdGFpbCA9IHNrYi0+dGFpbDsKKworCS8qzO7QtMr9vt2xqM/gudjQxc+iKi8KKwlubGggPSBOTE1TR19QVVQoc2tiLCAwLCAwLCBXQUlfS19NU0csIHNpemUtc2l6ZW9mKCpubGgpKTsKKwlwb3MgPSBOTE1TR19EQVRBKG5saCk7CisJbWVtc2V0KHBvcywgMCwgbGVuKTsKKworCS8qtKvK5LW908O7p7/VvOS1xMr9vt0qLworCW1lbWNweShwb3MsIG1zZywgIGxlbik7CisJLyq8xsvjvq25/dfWvdq21MbkuvO1xMr9vt3KtbzKs6S2yCovCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBvbGRfdGFpbDsKKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gQ09NTVRZUEVfR1JPVVA7CisJbmV0bGlua19icm9hZGNhc3QobmV0bGlua19zaywgc2tiLCAwLCBDT01NVFlQRV9HUk9VUCwgR0ZQX0FUT01JQyk7CisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0Oworbmxtc2dfZmFpbHVyZTogLypOTE1TR19QVVQgyqew3KOs1PKzt8/6zNe909fWu7q05iovCisgIAlpZihza2IpCisgICAgCQlrZnJlZV9za2Ioc2tiKTsKKwlnb3RvIG91dDsKKworI3VuZGVmIENPTU1UWVBFX0dST1VQCisjdW5kZWYgV0FJX0tfTVNHCit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisvKiBTaW1wbHkgcmV0dXJuIDB4ZmZmZiBpZiBWQVAgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCAqLwordTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yIChpPTA7IGk8Wk1fVkFQX1BPUlRfTlVNQkVSOyBpKyspCisgICAgeworICAgICAgICBpZiAodmFwW2ldLmRldiA9PSBkZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UzMl90IHpmd1JlYWRSZWcoemRldl90KiBkZXYsIHUzMl90IG9mZnNldCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworI2lmbmRlZiBJTklUX1dPUksKKyNkZWZpbmUgd29ya19zdHJ1Y3QgdHFfc3RydWN0CisKKyNkZWZpbmUgc2NoZWR1bGVfd29yayhhKSAgc2NoZWR1bGVfdGFzayhhKQorCisjZGVmaW5lIGZsdXNoX3NjaGVkdWxlZF93b3JrICBmbHVzaF9zY2hlZHVsZWRfdGFza3MKKyNkZWZpbmUgSU5JVF9XT1JLKF93cSwgX3JvdXRpbmUsIF9kYXRhKSAgSU5JVF9UUVVFVUUoX3dxLCBfcm91dGluZSwgX2RhdGEpCisjZGVmaW5lIFBSRVBBUkVfV09SSyhfd3EsIF9yb3V0aW5lLCBfZGF0YSkgIFBSRVBBUkVfVFFVRVVFKF93cSwgX3JvdXRpbmUsIF9kYXRhKQorI2VuZGlmCisKKyNkZWZpbmUgS0VWRU5UX1dBVENIRE9HICAgICAgICAweDAwMDAwMDAxCisKK3UzMl90IHNtcF9rZXZlbnRfTG9jayA9IDA7CisKK3ZvaWQga2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPQorICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSwga2V2ZW50KTsKKyAgICB6ZGV2X3QgKmRldiA9IG1hY3AtPmRldmljZTsKKworICAgIGlmIChtYWNwID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikmc21wX2tldmVudF9Mb2NrKSkKKyAgICB7CisgICAgICAgIC8vc2NoZWR1bGVfd29yaygmbWFjcC0+a2V2ZW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRvd24oJm1hY3AtPmlvY3RsX3NlbSk7CisKKyAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtFVkVOVF9XQVRDSERPRywgJm1hY3AtPmtldmVudF9mbGFncykpCisgICAgeworICAgIGV4dGVybiB1MTZfdCB6ZkhwU3RhcnRSZWN2KHpkZXZfdCAqZGV2KTsKKyAgICAgICAgLy96ZmlId1dhdGNoRG9nUmVpbml0KGRldik7CisgICAgICAgIHByaW50aygoIlxuICoqKioqKioqKioqKiBIdyB3YXRjaERvZyBvY2N1ciEhICoqKioqKioqKioqKioqIFxuIikpOworICAgICAgICB6ZmlXbGFuU3VzcGVuZChkZXYpOworICAgICAgICB6ZmlXbGFuUmVzdW1lKGRldiwwKTsKKyAgICAgICAgemZIcFN0YXJ0UmVjdihkZXYpOworICAgIH0KKworICAgIGNsZWFyX2JpdCgwLCAodm9pZCAqKSZzbXBfa2V2ZW50X0xvY2spOworICAgIHVwKCZtYWNwLT5pb2N0bF9zZW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICB6ZkxueENyZWF0ZVRocmVhZCAgICAgICAgICAgICovCisvKiAgICAgIENyZWF0ZSBhIFRocmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFsd2F5cyAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjMgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmTG54Q3JlYXRlVGhyZWFkKHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIENyZWF0ZSBNdXRleCBhbmQga2V2ZW50ZCAqLworICAgIElOSVRfV09SSygmbWFjcC0+a2V2ZW50LCBrZXZlbnQpOworICAgIGluaXRfTVVURVgoJm1hY3AtPmlvY3RsX3NlbSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgemZMbnhTaWduYWxUaHJlYWQgICAgICAgICAgICAqLworLyogICAgICBTaWduYWwgVGhyZWFkIHdpdGggRmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZmxhZyA6IHNpZ25hbCB0aHJlYWQgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMyAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMbnhTaWduYWxUaHJlYWQoemRldl90ICpkZXYsIGludCBmbGFnKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChtYWNwID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGsoIm1hY3AgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoMCAmJiBtYWNwLT5rZXZlbnRfcmVhZHkgIT0gMSkKKyAgICB7CisgICAgICAgIHByaW50aygiS2V2ZW50IG5vdCByZWFkeVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXRfYml0KGZsYWcsICZtYWNwLT5rZXZlbnRfZmxhZ3MpOworCisgICAgaWYgKCFzY2hlZHVsZV93b3JrKCZtYWNwLT5rZXZlbnQpKQorICAgIHsKKyAgICAgICAgLy9GYWlscyBpcyBOb3JtYWwKKyAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgInNjaGVkdWxlX3Rhc2sgZmFpbGVkLCBmbGFnID0gJXhcbiIsIGZsYWcpOworICAgIH0KK30KKworLyogTm90aWZ5IHdyYXBwZXIgdG9kbyByZWRvd25sb2FkIGZpcm13YXJlIGFuZCByZWluaXQgcHJvY2VkdXJlIHdoZW4gKi8KKy8qIGhhcmR3YXJlIHdhdGNoZG9nIG9jY3VyIDogemZpSHdXYXRjaERvZ1JlaW5pdCgpICovCit2b2lkIHpmTG54V2F0Y2hEb2dOb3RpZnkoemRldl90KiBkZXYpCit7CisgICAgemZMbnhTaWduYWxUaHJlYWQoZGV2LCBLRVZFTlRfV0FUQ0hET0cpOworfQorCisvKiBRdWVyeSBEdXJhbnRpb24gb2YgQWN0aXZlIFNjYW4gKi8KK3ZvaWQgemZ3R2V0QWN0aXZlU2NhbkR1cih6ZGV2X3QqIGRldiwgdThfdCogRHVyKQoreworICAgICpEdXIgPSAzMDsgLy8gZGVmYXVsdCAzMCBtcworfQorCit2b2lkIHpmd0dldFNob3daZXJvTGVuZ3RoU1NJRCh6ZGV2X3QqIGRldiwgdThfdCogRHVyKQoreworICAgICpEdXIgPSAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZGNvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemRjb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNmNDAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemRjb21wYXQuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB6ZGNvbXBhdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb24gZGVmaW50aW9uIGZvciBjb21wYXRpYmlsaXR5LiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1pEQ09NUEFUX0gKKyNkZWZpbmUgX1pEQ09NUEFUX0gKKworCisjaWZuZGVmIERFQ0xBUkVfVEFTS0xFVAorI2RlZmluZSB0YXNrbGV0X3NjaGVkdWxlKGEpICAgc2NoZWR1bGVfdGFzayhhKQorI2VuZGlmCisKKyN1bmRlZiBuZXRkZXZpY2VfdAordHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZSBuZXRkZXZpY2VfdDsKKworI2lmZGVmIFdJUkVMRVNTX0VYVAorI2lmIChXSVJFTEVTU19FWFQgPCAxMykKK3N0cnVjdCBpd19yZXF1ZXN0X2luZm8KK3sKKyAgICAgICAgX191MTYgICAgICAgICAgIGNtZDsgICAgICAgICAgICAvKiBXaXJlbGVzcyBFeHRlbnNpb24gY29tbWFuZCAqLworICAgICAgICBfX3UxNiAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIE1vcmUgdG8gY29tZSA7LSkgKi8KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIElSUV9OT05FCit0eXBlZGVmIHZvaWQgaXJxcmV0dXJuX3Q7CisjZGVmaW5lIElSUV9OT05FCisjZGVmaW5lIElSUV9IQU5ETEVECisjZGVmaW5lIElSUV9SRVRWQUwoeCkKKyNlbmRpZgorCisjaWZuZGVmIGluX2F0b21pYworI2RlZmluZSBpbl9hdG9taWMoKSAgMAorI2VuZGlmCisKKyNkZWZpbmUgVVNCX1FVRVVFX0JVTEsgMAorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMWQyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHpkdXNiLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBwbHVnIGFuZCBwbGF5IGhhbmRsaW5nIGZvciBVU0IgZGV2aWNlIGRyaXZlciovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIE1PRFZFUlNJT05TCisjaW5jbHVkZSA8bGludXgvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKyNpbmNsdWRlICJ6ZHVzYi5oIgorCitpbnQgemZMbnhBbGxvY0FsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKTsKK3ZvaWQgemZMbnhGcmVlQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApOwordm9pZCB6ZkxueFVubGlua0FsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKTsKKworTU9EVUxFX0FVVEhPUigiQXRoZXJvcyBDb21tdW5pY2F0aW9ucyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdGhlcm9zIDgwMi4xMW4gV2lyZWxlc3MgTEFOIGFkYXB0ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJPdHVzIjsKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHpkMTIyMV9pZHMgW10gPSB7CisJeyBVU0JfREVWSUNFKFZFTkRPUl9BVEhSLCBQUk9EVUNUX0FSOTE3MCkgfSwKKyAgICAgICAgeyBVU0JfREVWSUNFKFZFTkRPUl9ETElOSywgUFJPRFVDVF9EV0ExNjBBKSB9LAorCXsgVVNCX0RFVklDRSgweDA4NDYsIDB4OTAxMCkgfSwKKwl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgemQxMjIxX2lkcyk7CisKK2V4dGVybiB1OF90IHpmTG54SW5pdFNldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCk7CitleHRlcm4gaW50IHVzYmRydl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB1OF90IHpmTG54Q2xlYXJTdHJ1Y3RzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB6Zldkc0Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB6ZlVucmVnaXN0ZXJXZHNEZXYoc3RydWN0IG5ldF9kZXZpY2UqIHBhcmVudERldiwgdTE2X3Qgd2RzSWQpOworZXh0ZXJuIGludCB6ZkxueFZhcENsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB6ZkxueFVucmVnaXN0ZXJWYXBEZXYoc3RydWN0IG5ldF9kZXZpY2UqIHBhcmVudERldiwgdTE2X3QgdmFwSWQpOworCisvKiBXRFMgKi8KK2V4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07CisKKy8qIFZBUCAqLworZXh0ZXJuIHN0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKKworc3RhdGljIGludCB6ZkxueFByb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworICAgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBOVUxMOworICAgIGludCB2ZW5kb3JfaWQsIHByb2R1Y3RfaWQ7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICB1c2JfZ2V0X2RldihkZXYpOworCisgICAgdmVuZG9yX2lkID0gZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yOworICAgIHByb2R1Y3RfaWQgPSBkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0OworCisjaWZkZWYgSE1BQ19ERUJVRworICAgIHByaW50ayhLRVJOX05PVElDRSAidmVuZG9yX2lkID0gJTA0eFxuIiwgdmVuZG9yX2lkKTsKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgInByb2R1Y3RfaWQgPSAlMDR4XG4iLCBwcm9kdWN0X2lkKTsKKworICAgIGlmIChkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIlVTQiAyLjAgSG9zdFxuIik7CisgICAgZWxzZQorICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIlVTQiAxLjEgSG9zdFxuIik7CisjZW5kaWYKKworICAgIGlmICghKG1hY3AgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUpLCBHRlBfS0VSTkVMKSkpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIm91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkZXZpY2Ugc3RydWN0dXJlXG4iKTsKKyAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIFplcm8gdGhlIG1lbW9yeSAqLworICAgIG1lbXNldChtYWNwLCAwLCBzaXplb2Yoc3RydWN0IHVzYmRydl9wcml2YXRlKSk7CisKKyAgICBuZXQgPSBhbGxvY19ldGhlcmRldigwKTsKKworICAgIGlmIChuZXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiemZMbnhQcm9iZTogTm90IGFibGUgdG8gYWxsb2MgZXRoZXJkZXYgc3RydWN0XG4iKTsKKyAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBmYWlsMTsKKyAgICB9CisKKyAgICBzdHJjcHkobmV0LT5uYW1lLCAiYXRoJWQiKTsKKworICAgIG5ldC0+bWxfcHJpdiA9IG1hY3A7ICAgLy9rZXJuZWwgMi42CisgICAgbWFjcC0+dWRldiA9IGRldjsKKyAgICBtYWNwLT5kZXZpY2UgPSBuZXQ7CisKKyAgICAvKiBzZXQgdXAgdGhlIGVuZHBvaW50IGluZm9ybWF0aW9uICovCisgICAgLyogY2hlY2sgb3V0IHRoZSBlbmRwb2ludHMgKi8KKyAgICBtYWNwLT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisKKyAgICAvL2luaXRfd2FpdHF1ZXVlX2hlYWQoJm1hY3AtPnJlZ1NldF93YWl0KTsKKyAgICAvL2luaXRfd2FpdHF1ZXVlX2hlYWQoJm1hY3AtPmlvcndSc3Bfd2FpdCk7CisgICAgLy9pbml0X3dhaXRxdWV1ZV9oZWFkKCZtYWNwLT50ZXJtX3dhaXQpOworCisgICAgaWYgKCF6ZkxueEFsbG9jQWxsVXJicyhtYWNwKSkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZmFpbDI7CisgICAgfQorCisgICAgaWYgKCF6ZkxueEluaXRTZXR1cChuZXQsIG1hY3ApKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gLUVJTzsKKyAgICAgICAgZ290byBmYWlsMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIG1hY3ApOworICAgICAgICBTRVRfTkVUREVWX0RFVihuZXQsICZpbnRlcmZhY2UtPmRldik7CisKKyAgICAgICAgaWYgKHJlZ2lzdGVyX25ldGRldihuZXQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuZXRpZl9jYXJyaWVyX29mZihuZXQpOworICAgIGdvdG8gZG9uZTsKKworZmFpbDM6CisgICAgemZMbnhGcmVlQWxsVXJicyhtYWNwKTsKK2ZhaWwyOgorICAgIGZyZWVfbmV0ZGV2KG5ldCk7ICAvL2tlcm5lbCAyLjYKK2ZhaWwxOgorICAgIGtmcmVlKG1hY3ApOworCitmYWlsOgorICAgIHVzYl9wdXRfZGV2KGRldik7CisgICAgbWFjcCA9IE5VTEw7CisKK2RvbmU6CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgemZMbnhEaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiemZMbnhEaXNjb25uZWN0XG4iKTsKKworICAgIGlmICghbWFjcCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAidW5yZWdpc3RlcmluZyBub24tZXhpc3RhbnQgZGV2aWNlXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtYWNwLT5kcml2ZXJfaXNvbGF0ZWQpCisgICAgeworICAgICAgICBpZiAobWFjcC0+ZGV2aWNlLT5mbGFncyAmIElGRl9VUCkKKyAgICAgICAgICAgIHVzYmRydl9jbG9zZShtYWNwLT5kZXZpY2UpOworICAgIH0KKworI2lmIDAKKyAgICAvKiBDbG9zZSBXRFMgKi8KKyAgICAvL3pmV2RzQ2xvc2Uod2RzWzBdLmRldik7CisgICAgLyogVW5yZWdpc3RlciBXRFMgKi8KKyAgICAvL3pmVW5yZWdpc3Rlcldkc0RldihtYWNwLT5kZXZpY2UsIDApOworCisgICAgLyogQ2xvc2UgVkFQICovCisgICAgemZMbnhWYXBDbG9zZSh2YXBbMF0uZGV2KTsKKyAgICAvKiBVbnJlZ2lzdGVyIFZBUCAqLworICAgIHpmTG54VW5yZWdpc3RlclZhcERldihtYWNwLT5kZXZpY2UsIDApOworI2VuZGlmCisKKyAgICB6ZkxueENsZWFyU3RydWN0cyhtYWNwLT5kZXZpY2UpOworCisgICAgdW5yZWdpc3Rlcl9uZXRkZXYobWFjcC0+ZGV2aWNlKTsKKworICAgIHVzYl9wdXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisKKyAgICAvL3ByaW50ayhLRVJOX0VSUiAiMy4gemZMbnhVbmxpbmtBbGxVcmJzXG4iKTsKKyAgICAvL3pmTG54VW5saW5rQWxsVXJicyhtYWNwKTsKKworICAgIC8qIEZyZWUgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICBmcmVlX25ldGRldihtYWNwLT5kZXZpY2UpOworCisgICAgemZMbnhGcmVlQWxsVXJicyhtYWNwKTsKKyAgICAvL3pmTG54Q2xlYXJTdHJ1Y3RzKG1hY3AtPmRldmljZSk7CisgICAga2ZyZWUobWFjcCk7CisgICAgbWFjcCA9IE5VTEw7CisKKyAgICB1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB6ZDEyMjFfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgPSBkcml2ZXJfbmFtZSwKKwkucHJvYmUgICAgICAgID0gemZMbnhQcm9iZSwKKwkuZGlzY29ubmVjdCAgID0gemZMbnhEaXNjb25uZWN0LAorCS5pZF90YWJsZSAgICAgPSB6ZDEyMjFfaWRzLAorfTsKKworaW50IF9faW5pdCB6ZkxueElpbml0KHZvaWQpCit7CisgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyAtIHZlcnNpb24gJXNcbiIsICBEUklWRVJfTkFNRSwgVkVSU0lPTklEKTsKKyAgICByZXR1cm4gdXNiX3JlZ2lzdGVyKCZ6ZDEyMjFfZHJpdmVyKTsKK30KKwordm9pZCBfX2V4aXQgemZMbnhFeGl0KHZvaWQpCit7CisgICAgdXNiX2RlcmVnaXN0ZXIoJnpkMTIyMV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh6ZkxueElpbml0KTsKK21vZHVsZV9leGl0KHpmTG54RXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZkYzIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB6ZHVzYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIFVTQiBkZXZpY2UgZHJpdmVyICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1pEVVNCX0gKKyNkZWZpbmUgX1pEVVNCX0gKKworI2lmbmRlZiBEUklWRVJfTkFNRQorI2RlZmluZSBEUklWRVJfTkFNRSAgICAgICAgICAgICAiYXJ1c2IiCisjZW5kaWYKKworI2RlZmluZSBWRVJTSU9OSUQgICAgICAgICAgICAgICAiMC4wLjAuOTk5IgorCisvKiBEZWZpbmUgdGhlc2UgdmFsdWVzIHRvIG1hdGNoIHlvdXIgZGV2aWNlICovCisjZGVmaW5lIFZFTkRPUl9BVEhSICAgICAgICAgICAgIDB4MENGMyAgLy9BdGhlcm9zCisjZGVmaW5lIFBST0RVQ1RfQVI5MTcwICAgICAgICAgIDB4OTE3MAorCisjZGVmaW5lIFZFTkRPUl9ETElOSyAgICAgICAgICAgIDB4MDdEMSAgLy9EbGluaworI2RlZmluZSBQUk9EVUNUX0RXQTE2MEEgICAgICAgICAweDNDMTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YjMwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvS2NvbmZpZwpAQCAtMCwwICsxLDI3OCBAQAorY29uZmlnIFBBTkVMCisJdHJpc3RhdGUgIlBhcmFsbGVsIHBvcnQgTENEL0tleXBhZCBQYW5lbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gSEQ0NDc4MCBvciBLUy0wMDc0IExDRCBjb25uZWN0ZWQgdG8geW91cgorCSAgcGFyYWxsZWwgcG9ydC4gVGhpcyBkcml2ZXIgYWxzbyBmZWF0dXJlcyA0IGFuZCA2LWtleSBrZXlwYWRzLiBUaGUgTENECisJICBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIC9kZXYvbGNkIGNoYXIgZGV2aWNlICgxMCwgMTU2KSwgYW5kIHRoZQorCSAga2V5cGFkIHRocm91Z2ggL2Rldi9rZXlwYWQgKDEwLCAxODUpLiBCb3RoIHJlcXVpcmUgbWlzYyBkZXZpY2UgdG8gYmUKKwkgIGVuYWJsZWQuIFRoaXMgY29kZSBjYW4gZWl0aGVyIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCBvciBsaW5rZWQgaW50bworCSAgdGhlIGtlcm5lbCBhbmQgc3RhcnRlZCBhdCBib290LiBJZiB5b3UgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IGFsbCB0aGlzCisJICBpcyBhYm91dCwgc2F5IE4uCisKK2NvbmZpZyBQQU5FTF9QQVJQT1JUCisJaW50ICJEZWZhdWx0IHBhcmFsbGVsIHBvcnQgbnVtYmVyICgwPUxQVDEpIgorCWRlcGVuZHMgb24gUEFORUwKKwlyYW5nZSAwIDI1NQorCWRlZmF1bHQgIjAiCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIHBhcmFsbGVsIHBvcnQgdGhlIHBhbmVsIGlzIGNvbm5lY3RlZCB0by4gT25lCisJICBkcml2ZXIgaW5zdGFuY2Ugb25seSBzdXBwb3J0cyBvbmUgcGFyYWxsZWwgcG9ydCwgc28gaWYgeW91ciBrZXlwYWQKKwkgIGFuZCBMQ0QgYXJlIGNvbm5lY3RlZCB0byB0d28gc2VwYXJhdGUgcG9ydHMsIHlvdSBoYXZlIHRvIHN0YXJ0IHR3bworCSAgbW9kdWxlcyB3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMuIE51bWJlcmluZyBzdGFydHMgd2l0aCAnMCcgZm9yIExQVDEsCisJICBhbmQgc28gb24uCisKK2NvbmZpZyBQQU5FTF9QUk9GSUxFCisJaW50ICJEZWZhdWx0IHBhbmVsIHByb2ZpbGUgKDAtNSwgMD1jdXN0b20pIgorCWRlcGVuZHMgb24gUEFORUwKKwlyYW5nZSAwIDUKKwlkZWZhdWx0ICI1IgorCS0tLWhlbHAtLS0KKwkgIFRvIGVhc2UgY29uZmlndXJhdGlvbiwgdGhlIGRyaXZlciBzdXBwb3J0cyBkaWZmZXJlbnQgY29uZmlndXJhdGlvbgorCSAgcHJvZmlsZXMgZm9yIHBhc3QgYW5kIHJlY2VudCB3aXJpbmdzLiBUaGVzZSBwcm9maWxlcyBjYW4gYWxzbyBiZQorCSAgdXNlZCB0byBkZWZpbmUgYW4gYXBwcm94aW1hdGl2ZSBjb25maWd1cmF0aW9uLCBjb21wbGV0ZWQgYnkgYSBmZXcKKwkgIG90aGVyIG9wdGlvbnMuIEhlcmUgYXJlIHRoZSBwcm9maWxlcyA6CisKKwkgICAgMCA9IGN1c3RvbSAoc2VlIGZ1cnRoZXIpCisJICAgIDEgPSAyeDE2IHBhcmFsbGVsIExDRCwgb2xkIGtleXBhZAorCSAgICAyID0gMngxNiBzZXJpYWwgTENEIChLUy0wMDc0KSwgbmV3IGtleXBhZAorCSAgICAzID0gMngxNiBwYXJhbGxlbCBMQ0QgKEhhbnRyb25peCksIG5vIGtleXBhZAorCSAgICA0ID0gMngxNiBwYXJhbGxlbCBMQ0QgKE5leGNvbSBOU0ExMDQ1KSB3aXRoIE5leGNvbSdzIGtleXBhZAorCSAgICA1ID0gMng0MCBwYXJhbGxlbCBMQ0QgKG9sZCBvbmUpLCB3aXRoIG9sZCBrZXlwYWQKKworCSAgQ3VzdG9tIGNvbmZpZ3VyYXRpb25zIGFsbG93IHlvdSB0byBkZWZpbmUgaG93IHlvdXIgZGlzcGxheSBpcworCSAgd2lyZWQgdG8gdGhlIHBhcmFsbGVsIHBvcnQsIGFuZCBob3cgaXQgd29ya3MuIFRoaXMgaXMgb25seSBpbnRlbmRlZAorCSAgZm9yIGV4cGVydHMuCisKK2NvbmZpZyBQQU5FTF9LRVlQQUQKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiCisJaW50ICJLZXlwYWQgdHlwZSAoMD1ub25lLCAxPW9sZCA2IGtleXMsIDI9bmV3IDYga2V5cywgMz1OZXhjb20gNCBrZXlzKSIKKwlyYW5nZSAwIDQKKwlkZWZhdWx0IDAKKwktLS1oZWxwLS0tCisJICBUaGlzIGVuYWJsZXMgYW5kIGNvbmZpZ3VyZXMgYSBrZXlwYWQgY29ubmVjdGVkIHRvIHRoZSBwYXJhbGxlbCBwb3J0LgorCSAgVGhlIGtleXMgd2lsbCBiZSByZWFkIGZyb20gY2hhcmFjdGVyIGRldmljZSAxMCwxODUuIFZhbGlkIHZhbHVlcyBhcmUgOgorCisJICAgIDAgOiBkbyBub3QgZW5hYmxlIHRoaXMgZHJpdmVyCisJICAgIDEgOiBvbGQgNiBrZXlzIGtleXBhZAorCSAgICAyIDogbmV3IDYga2V5cyBrZXlwYWQsIGFzIHVzZWQgb24gdGhlIHNlcnZlciBhdCB3d3cuYW50LWNvbXB1dGluZy5jb20KKwkgICAgMyA6IE5leGNvbSBOU0ExMDQ1J3MgNCBrZXlzIGtleXBhZAorCisJICBOZXcgcHJvZmlsZXMgY2FuIGJlIGRlc2NyaWJlZCBpbiB0aGUgZHJpdmVyIHNvdXJjZS4gVGhlIGRyaXZlciBhbHNvCisJICBzdXBwb3J0cyBzaW11bHRhbmVvdXMga2V5cyBwcmVzc2VkIHdoZW4gdGhlIGtleXBhZCBzdXBwb3J0cyB0aGVtLgorCitjb25maWcgUEFORUxfTENECisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIgorCWludCAiTENEIHR5cGUgKDA9bm9uZSwgMT1jdXN0b20sIDI9b2xkIC8vLCAzPWtzMDA3NCwgND1oYW50cm9uaXgsIDU9TmV4Y29tKSIKKwlyYW5nZSAwIDUKKwlkZWZhdWx0IDAKKwktLS1oZWxwLS0tCisJICAgVGhpcyBlbmFibGVzIGFuZCBjb25maWd1cmVzIGFuIExDRCBjb25uZWN0ZWQgdG8gdGhlIHBhcmFsbGVsIHBvcnQuCisJICAgVGhlIGRyaXZlciBpbmNsdWRlcyBhbiBpbnRlcnByZXRlciBmb3IgZXNjYXBlIGNvZGVzIHN0YXJ0aW5nIHdpdGgKKwkgICAnXGVbTCcgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHRoZSBMQ0QsIGFuZCBhIGZldyBBTlNJIGNvZGVzLiBUaGUKKwkgICBkcml2ZXIgd2lsbCBiZSByZWdpc3RlcmVkIGFzIGNoYXJhY3RlciBkZXZpY2UgMTAsMTU2LCB1c3VhbGx5CisJICAgdW5kZXIgdGhlIG5hbWUgJy9kZXYvbGNkJy4gVGhlcmUgYXJlIGEgdG90YWwgb2YgNiBzdXBwb3J0ZWQgdHlwZXMgOgorCisJICAgICAwIDogZG8gbm90IGVuYWJsZSB0aGUgZHJpdmVyCisJICAgICAxIDogY3VzdG9tIGNvbmZpZ3VyYXRpb24gYW5kIHdpcmluZyAoc2VlIGZ1cnRoZXIpCisJICAgICAyIDogMngxNiAmIDJ4NDAgcGFyYWxsZWwgTENEIChvbGQgd2lyaW5nKQorCSAgICAgMyA6IDJ4MTYgc2VyaWFsIExDRCAoS1MtMDA3NCBiYXNlZCkKKwkgICAgIDQgOiAyeDE2IHBhcmFsbGVsIExDRCAoSGFudHJvbml4IHdpcmluZykKKwkgICAgIDUgOiAyeDE2IHBhcmFsbGVsIExDRCAoTmV4Y29tIHdpcmluZykKKworCSAgIFdoZW4gdHlwZSAnMScgaXMgc3BlY2lmaWVkLCBvdGhlciBvcHRpb25zIHdpbGwgYXBwZWFyIHRvIGNvbmZpZ3VyZQorCSAgIG1vcmUgcHJlY2lzZSBhc3BlY3RzICh3aXJpbmcsIGRpbWVuc2lvbnMsIHByb3RvY29sLCAuLi4pLiBQbGVhc2Ugbm90ZQorCSAgIHRoYXQgdGhvc2UgdmFsdWVzIGNoYW5nZWQgZnJvbSB0aGUgMi40IGRyaXZlciBmb3IgYmV0dGVyIGNvbnNpc3RlbmN5LgorCitjb25maWcgUEFORUxfTENEX0hFSUdIVAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiTnVtYmVyIG9mIGxpbmVzIG9uIHRoZSBMQ0QgKDEtMikiCisJcmFuZ2UgMSAyCisJZGVmYXVsdCAyCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHZpc2libGUgY2hhcmFjdGVyIGxpbmVzIG9uIHRoZSBMQ0QgaW4gY3VzdG9tIHByb2ZpbGUuCisJICBJdCBjYW4gZWl0aGVyIGJlIDEgb3IgMi4KKworY29uZmlnIFBBTkVMX0xDRF9XSURUSAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiTnVtYmVyIG9mIGNoYXJhY3RlcnMgcGVyIGxpbmUgb24gdGhlIExDRCAoMS00MCkiCisJcmFuZ2UgMSA0MAorCWRlZmF1bHQgNDAKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwZXIgbGluZSBvbiB0aGUgTENEIGluIGN1c3RvbSBwcm9maWxlLgorCSAgQ29tbW9uIHZhbHVlcyBhcmUgMTYsMjAsMjQsNDAuCisKK2NvbmZpZyBQQU5FTF9MQ0RfQldJRFRICisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisJaW50ICJJbnRlcm5hbCBMQ0QgbGluZSB3aWR0aCAoMS00MCwgNDAgYnkgZGVmYXVsdCkiCisJcmFuZ2UgMSA0MAorCWRlZmF1bHQgNDAKKwktLS1oZWxwLS0tCisJICBNb3N0IExDRHMgdXNlIGEgc3RhbmRhcmQgY29udHJvbGxlciB3aGljaCBzdXBwb3J0cyBoYXJkd2FyZSBsaW5lcyBvZiA0MAorCSAgY2hhcmFjdGVycywgYWx0aG91Z2ggc29tZXRpbWVzIG9ubHkgMTYsIDIwIG9yIDI0IG9mIHRoZW0gYXJlIHJlYWxseSB3aXJlZAorCSAgdG8gdGhlIHRlcm1pbmFsLiBUaGlzIHJlc3VsdHMgaW4gc29tZSBub24tdmlzaWJsZSBidXQgYWRyZXNzYWJsZSBjaGFyYWN0ZXJzLAorCSAgYW5kIGlzIHRoZSBjYXNlIGZvciBtb3N0IHBhcmFsbGVsIExDRHMuIE90aGVyIExDRHMsIGFuZCBzb21lIHNlcmlhbCBvbmVzLAorCSAgaG93ZXZlciwgdXNlIHRoZSBzYW1lIGxpbmUgd2lkdGggaW50ZXJuYWxseSBhcyB3aGF0IGlzIHZpc2libGUuIFRoZSBLUzAwNzQKKwkgIGZvciBleGFtcGxlLCB1c2VzIDE2IGNoYXJhY3RlcnMgcGVyIGxpbmUgZm9yIDE2IHZpc2libGUgY2hhcmFjdGVycyBwZXIgbGluZS4KKworCSAgVGhpcyBvcHRpb24gbGV0cyB5b3UgY29uZmlndXJlIHRoZSB2YWx1ZSB1c2VkIGJ5IHlvdXIgTENEIGluICdjdXN0b20nIHByb2ZpbGUuCisJICBJZiB5b3UgZG9uJ3Qga25vdywgcHV0ICc0MCcgaGVyZS4KKworY29uZmlnIFBBTkVMX0xDRF9IV0lEVEgKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIKKwlpbnQgIkhhcmR3YXJlIExDRCBsaW5lIHdpZHRoICgxLTY0LCA2NCBieSBkZWZhdWx0KSIKKwlyYW5nZSAxIDY0CisJZGVmYXVsdCA2NAorCS0tLWhlbHAtLS0KKwkgIE1vc3QgTENEcyB1c2UgYSBzaW5nbGUgYWRkcmVzcyBiaXQgdG8gZGlmZmVyZW50aWF0ZSBsaW5lIDAgYW5kIGxpbmUgMS4gU2luY2UKKwkgIHNvbWUgb2YgdGhlbSBuZWVkIHRvIGJlIGFibGUgdG8gYWRkcmVzcyA0MCBjaGFycyB3aXRoIHRoZSBsb3dlciBiaXRzLCB0aGV5CisJICBvZnRlbiB1c2UgdGhlIGltbWVkaWF0ZWx5IHN1cGVyaW9yIHBvd2VyIG9mIDIsIHdoaWNoIGlzIDY0LCB0byBhZGRyZXNzIHRoZQorCSAgbmV4dCBsaW5lLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHlvdXIgTENEIHVzZXMsIGluIGRvdWJ0IGxldCAxNiBoZXJlIGZvciBhIDJ4MTYsIGFuZAorCSAgNjQgaGVyZSBmb3IgYSAyeDQwLgorCitjb25maWcgUEFORUxfTENEX0NIQVJTRVQKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIKKwlpbnQgIkxDRCBjaGFyYWN0ZXIgc2V0ICgwPW5vcm1hbCwgMT1LUzAwNzQpIgorCXJhbmdlIDAgMQorCWRlZmF1bHQgMAorCS0tLWhlbHAtLS0KKwkgIFNvbWUgY29udHJvbGxlcnMgc3VjaCBhcyB0aGUgS1MwMDc0IHVzZSBhIHNvbWV3aGF0IHN0cmFuZ2UgY2hhcmFjdGVyIHNldAorCSAgd2hlcmUgbWFueSBzeW1ib2xzIGFyZSBhdCB1bnVzdWFsIHBsYWNlcy4gVGhlIGRyaXZlciBrbm93cyBob3cgdG8gbWFwCisJICAnc3RhbmRhcmQnIEFTQ0lJIGNoYXJhY3RlcnMgdG8gdGhlIGNoYXJhY3RlciBzZXRzIHVzZWQgYnkgdGhlc2UgY29udHJvbGxlcnMuCisJICBWYWxpZCB2YWx1ZXMgYXJlIDoKKworCSAgICAgMCA6IG5vcm1hbCAodW50cmFuc2xhdGVkKSBjaGFyYWN0ZXIgc2V0CisJICAgICAxIDogS1MwMDc0IGNoYXJhY3RlciBzZXQKKworCSAgSWYgeW91IGRvbid0IGtub3csIHVzZSB0aGUgbm9ybWFsIG9uZSAoMCkuCisKK2NvbmZpZyBQQU5FTF9MQ0RfUFJPVE8KKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIKKwlpbnQgIkxDRCBjb21tdW5pY2F0aW9uIG1vZGUgKDA9cGFyYWxsZWwgOCBiaXRzLCAxPXNlcmlhbCkiCisJcmFuZ2UgMCAxCisJZGVmYXVsdCAwCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgbm93IHN1cHBvcnRzIGFueSBzZXJpYWwgb3IgcGFyYWxsZWwgTENEIHdpcmVkIHRvIGEgcGFyYWxsZWwKKwkgIHBvcnQuIEJ1dCBiZWZvcmUgYXNzaWduaW5nIHNpZ25hbHMsIHRoZSBkcml2ZXIgbmVlZHMgdG8ga25vdyBpZiBpdCB3aWxsCisJICBiZSBkcml2aW5nIGEgc2VyaWFsIExDRCBvciBhIHBhcmFsbGVsIG9uZS4gU2VyaWFsIExDRHMgb25seSB1c2UgMiB3aXJlcworCSAgKFNEQS9TQ0wpLCB3aGlsZSBwYXJhbGxlbCBvbmVzIHVzZSAyIG9yIDMgd2lyZXMgZm9yIHRoZSBjb250cm9sIHNpZ25hbHMKKwkgIChFLCBSUywgc29tZXRpbWVzIFJXKSwgYW5kIDQgb3IgOCBmb3IgdGhlIGRhdGEuIFVzZSAwIGhlcmUgZm9yIGEgOCBiaXRzCisJICBwYXJhbGxlbCBMQ0QsIGFuZCAxIGZvciBhIHNlcmlhbCBMQ0QuCisKK2NvbmZpZyBQQU5FTF9MQ0RfUElOX0UKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIgJiYgUEFORUxfTENEX1BST1RPPSIwIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIEUgc2lnbmFsICgtMTcuLi4xNykgIgorCXJhbmdlIC0xNyAxNworCWRlZmF1bHQgMTQKKwktLS1oZWxwLS0tCisJICBUaGlzIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbCBwb3J0IHBpbiB0byB3aGljaCB0aGUgTENEICdFJworCSAgc2lnbmFsIGhhcyBiZWVuIGNvbm5lY3RlZC4gSXQgY2FuIGJlIDoKKworCSAgICAgICAgICAwIDogbm8gY29ubmVjdGlvbiAoZWc6IGNvbm5lY3RlZCB0byBncm91bmQpCisJICAgICAgMS4uMTcgOiBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYW55IG9mIHRoZXNlIHBpbnMgb24gdGhlIERCMjUgcGx1ZworCSAgICAtMS4uLTE3IDogY29ubmVjdGVkIHRvIHRoZSBzYW1lIHBpbiB0aHJvdWdoIGFuIGludmVydGVyIChlZzogdHJhbnNpc3RvcikuCisKKwkgIERlZmF1bHQgZm9yIHRoZSAnRScgcGluIGluIGN1c3RvbSBwcm9maWxlIGlzICcxNCcgKEFVVE9GRUVEKS4KKworY29uZmlnIFBBTkVMX0xDRF9QSU5fUlMKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIgJiYgUEFORUxfTENEX1BST1RPPSIwIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIFJTIHNpZ25hbCAoLTE3Li4uMTcpICIKKwlyYW5nZSAtMTcgMTcKKwlkZWZhdWx0IDE3CisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIExDRCAnUlMnCisJICBzaWduYWwgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdSUycgcGluIGluIGN1c3RvbSBwcm9maWxlIGlzICcxNycgKFNFTEVDVCBJTikuCisKK2NvbmZpZyBQQU5FTF9MQ0RfUElOX1JXCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiICYmIFBBTkVMX0xDRF9QUk9UTz0iMCIKKyAgICAgICAgaW50ICJQYXJhbGxlbCBwb3J0IHBpbiBudW1iZXIgJiBwb2xhcml0eSBjb25uZWN0ZWQgdG8gdGhlIExDRCBSVyBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAxNgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsIHBvcnQgcGluIHRvIHdoaWNoIHRoZSBMQ0QgJ1JXJworCSAgc2lnbmFsIGhhcyBiZWVuIGNvbm5lY3RlZC4gSXQgY2FuIGJlIDoKKworCSAgICAgICAgICAwIDogbm8gY29ubmVjdGlvbiAoZWc6IGNvbm5lY3RlZCB0byBncm91bmQpCisJICAgICAgMS4uMTcgOiBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYW55IG9mIHRoZXNlIHBpbnMgb24gdGhlIERCMjUgcGx1ZworCSAgICAtMS4uLTE3IDogY29ubmVjdGVkIHRvIHRoZSBzYW1lIHBpbiB0aHJvdWdoIGFuIGludmVydGVyIChlZzogdHJhbnNpc3RvcikuCisKKwkgIERlZmF1bHQgZm9yIHRoZSAnUlcnIHBpbiBpbiBjdXN0b20gcHJvZmlsZSBpcyAnMTYnIChJTklUKS4KKworY29uZmlnIFBBTkVMX0xDRF9QSU5fU0NMCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiICYmIFBBTkVMX0xDRF9QUk9UTyE9IjAiCisgICAgICAgIGludCAiUGFyYWxsZWwgcG9ydCBwaW4gbnVtYmVyICYgcG9sYXJpdHkgY29ubmVjdGVkIHRvIHRoZSBMQ0QgU0NMIHNpZ25hbCAoLTE3Li4uMTcpICIKKwlyYW5nZSAtMTcgMTcKKwlkZWZhdWx0IDEKKwktLS1oZWxwLS0tCisJICBUaGlzIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbCBwb3J0IHBpbiB0byB3aGljaCB0aGUgc2VyaWFsCisJICBMQ0QgJ1NDTCcgc2lnbmFsIGhhcyBiZWVuIGNvbm5lY3RlZC4gSXQgY2FuIGJlIDoKKworCSAgICAgICAgICAwIDogbm8gY29ubmVjdGlvbiAoZWc6IGNvbm5lY3RlZCB0byBncm91bmQpCisJICAgICAgMS4uMTcgOiBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYW55IG9mIHRoZXNlIHBpbnMgb24gdGhlIERCMjUgcGx1ZworCSAgICAtMS4uLTE3IDogY29ubmVjdGVkIHRvIHRoZSBzYW1lIHBpbiB0aHJvdWdoIGFuIGludmVydGVyIChlZzogdHJhbnNpc3RvcikuCisKKwkgIERlZmF1bHQgZm9yIHRoZSAnU0NMJyBwaW4gaW4gY3VzdG9tIHByb2ZpbGUgaXMgJzEnIChTVFJPQkUpLgorCitjb25maWcgUEFORUxfTENEX1BJTl9TREEKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIgJiYgUEFORUxfTENEX1BST1RPIT0iMCIKKyAgICAgICAgaW50ICJQYXJhbGxlbCBwb3J0IHBpbiBudW1iZXIgJiBwb2xhcml0eSBjb25uZWN0ZWQgdG8gdGhlIExDRCBTREEgc2lnbmFsICgtMTcuLi4xNykgIgorCXJhbmdlIC0xNyAxNworCWRlZmF1bHQgMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsIHBvcnQgcGluIHRvIHdoaWNoIHRoZSBzZXJpYWwKKwkgIExDRCAnU0RBJyBzaWduYWwgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdTREEnIHBpbiBpbiBjdXN0b20gcHJvZmlsZSBpcyAnMicgKEQwKS4KKworY29uZmlnIFBBTkVMX0xDRF9QSU5fQkwKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIKKyAgICAgICAgaW50ICJQYXJhbGxlbCBwb3J0IHBpbiBudW1iZXIgJiBwb2xhcml0eSBjb25uZWN0ZWQgdG8gdGhlIExDRCBiYWNrbGlnaHQgc2lnbmFsICgtMTcuLi4xNykgIgorCXJhbmdlIC0xNyAxNworCWRlZmF1bHQgMAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsIHBvcnQgcGluIHRvIHdoaWNoIHRoZSBMQ0QgJ0JMJyBzaWduYWwKKyAgICAgICAgICBoYXMgYmVlbiBjb25uZWN0ZWQuIEl0IGNhbiBiZSA6CisKKwkgICAgICAgICAgMCA6IG5vIGNvbm5lY3Rpb24gKGVnOiBjb25uZWN0ZWQgdG8gZ3JvdW5kKQorCSAgICAgIDEuLjE3IDogZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFueSBvZiB0aGVzZSBwaW5zIG9uIHRoZSBEQjI1IHBsdWcKKwkgICAgLTEuLi0xNyA6IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwaW4gdGhyb3VnaCBhbiBpbnZlcnRlciAoZWc6IHRyYW5zaXN0b3IpLgorCisJICBEZWZhdWx0IGZvciB0aGUgJ0JMJyBwaW4gaW4gY3VzdG9tIHByb2ZpbGUgaXMgJzAnICh1bmNvbnRyb2xsZWQpLgorCitjb25maWcgUEFORUxfQ0hBTkdFX01FU1NBR0UKKwlkZXBlbmRzIG9uIFBBTkVMCisJYm9vbCAiQ2hhbmdlIExDRCBpbml0aWFsaXphdGlvbiBtZXNzYWdlID8iCisJZGVmYXVsdCAibiIKKwktLS1oZWxwLS0tCisJICBUaGlzIGFsbG93cyB5b3UgdG8gcmVwbGFjZSB0aGUgYm9vdCBtZXNzYWdlIGluZGljYXRpbmcgdGhlIGtlcm5lbCB2ZXJzaW9uCisJICBhbmQgdGhlIGRyaXZlciB2ZXJzaW9uIHdpdGggYSBjdXN0b20gbWVzc2FnZS4gVGhpcyBpcyB1c2VmdWwgb24gYXBwbGlhbmNlcworCSAgd2hlcmUgYSBzaW1wbGUgJ1N0YXJ0aW5nIHN5c3RlbScgbWVzc2FnZSBjYW4gYmUgZW5vdWdoIHRvIHN0b3AgYSBjdXN0b21lcgorCSAgZnJvbSB3b3JyeWluZy4KKworCSAgSWYgeW91IHNheSAnWScgaGVyZSwgeW91J2xsIGJlIGFibGUgdG8gY2hvb3NlIGEgbWVzc2FnZSB5b3Vyc2VsZi4gT3RoZXJ3aXNlLAorCSAgc2F5ICdOJyBhbmQga2VlcCB0aGUgZGVmYXVsdCBtZXNzYWdlIHdpdGggdGhlIHZlcnNpb24uCisKK2NvbmZpZyBQQU5FTF9CT09UX01FU1NBR0UKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX0NIQU5HRV9NRVNTQUdFPSJ5IgorCXN0cmluZyAiTmV3IGluaXRpYWxpemF0aW9uIG1lc3NhZ2UiCisJZGVmYXVsdCAiIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWxsb3dzIHlvdSB0byByZXBsYWNlIHRoZSBib290IG1lc3NhZ2UgaW5kaWNhdGluZyB0aGUga2VybmVsIHZlcnNpb24KKwkgIGFuZCB0aGUgZHJpdmVyIHZlcnNpb24gd2l0aCBhIGN1c3RvbSBtZXNzYWdlLiBUaGlzIGlzIHVzZWZ1bCBvbiBhcHBsaWFuY2VzCisJICB3aGVyZSBhIHNpbXBsZSAnU3RhcnRpbmcgc3lzdGVtJyBtZXNzYWdlIGNhbiBiZSBlbm91Z2ggdG8gc3RvcCBhIGN1c3RvbWVyCisJICBmcm9tIHdvcnJ5aW5nLgorCisJICBBbiBlbXB0eSBtZXNzYWdlIHdpbGwgb25seSBjbGVhciB0aGUgZGlzcGxheSBhdCBkcml2ZXIgaW5pdCB0aW1lLiBBbnkgb3RoZXIKKwkgIHByaW50ZigpLWZvcm1hdHRlZCBtZXNzYWdlIGlzIHZhbGlkIHdpdGggbmV3bGluZSBhbmQgZXNjYXBlIGNvZGVzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2MyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX1BBTkVMKQkJKz0gcGFuZWwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGJlNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL1RPRE8KQEAgLTAsMCArMSw5IEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcworCS0gTGluZGVudAorCS0gcmV2aWV3IG1ham9yL21pbm9yIHVzYWdlcworCS0gcmV2aWV3IHVzZXJzcGFjZSBhcGkKKwktIHNlZSBpZiBhbGwgb2YgdGhpcyBjb3VsZCBiZSBlYXNpZXIgZG9uZSBpbiB1c2Vyc3BhY2UgaW5zdGVhZC4KKworUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQKK1dpbGx5IFRhcnJlYXUgPHdpbGx5QG1ldGEteC5vcmc+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvbGNkLXBhbmVsLWNncmFtLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9sY2QtcGFuZWwtY2dyYW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2VlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvbGNkLXBhbmVsLWNncmFtLnR4dApAQCAtMCwwICsxLDI0IEBACitTb21lIExDRHMgYWxsb3cgeW91IHRvIGRlZmluZSB1cCB0byA4IGNoYXJhY3RlcnMsIG1hcHBlZCB0byBBU0NJSQorY2hhcmFjdGVycyAwIHRvIDcuIFRoZSBlc2NhcGUgY29kZSB0byBkZWZpbmUgYSBuZXcgY2hhcmFjdGVyIGlzCisnXGVbTEcnIGZvbGxvd2VkIGJ5IG9uZSBkaWdpdCBmcm9tIDAgdG8gNywgcmVwcmVzZW50aW5nIHRoZSBjaGFyYWN0ZXIKK251bWJlciwgYW5kIHVwIHRvIDggY291cGxlcyBvZiBoZXggZGlnaXRzIHRlcm1pbmF0ZWQgYnkgYSBzZW1pLWNvbG9uCisoJzsnKS4gRWFjaCBjb3VwbGUgb2YgZGlnaXRzIHJlcHJlc2VudHMgYSBsaW5lLCB3aXRoIDEtYml0cyBmb3IgZWFjaAoraWxsdW1pbmF0ZWQgcGl4ZWwgd2l0aCBMU0Igb24gdGhlIHJpZ2h0LiBMaW5lcyBhcmUgbnVtYmVycmVkIGZyb20gdGhlCit0b3Agb2YgdGhlIGNoYXJhY3RlciB0byB0aGUgYm90dG9tLiBPbiBhIDV4NyBtYXRyaXgsIG9ubHkgdGhlIDUgbG93ZXIKK2JpdHMgb2YgdGhlIDcgZmlyc3QgYnl0ZXMgYXJlIHVzZWQgZm9yIGVhY2ggY2hhcmFjdGVyLiBJZiB0aGUgc3RyaW5nCitpcyBpbmNvbXBsZXRlLCBvbmx5IGNvbXBsZXRlIGxpbmVzIHdpbGwgYmUgcmVkZWZpbmVkLiBIZXJlIGFyZSBzb21lCitleGFtcGxlcyA6CisKKyAgcHJpbnRmICJcZVtMRzAwMTAxMDEwNTBEMUYwQzA0OyIgID0+IDAgPSBbZW50ZXJdCisgIHByaW50ZiAiXGVbTEcxMDQwRTFGMDAwMDAwMDAwMDsiICA9PiAxID0gW3VwXQorICBwcmludGYgIlxlW0xHMjAwMDAwMDAwMUYwRTA0MDA7IiAgPT4gMiA9IFtkb3duXQorICBwcmludGYgIlxlW0xHMzA0MEUxRjAwMUYwRTA0MDA7IiAgPT4gMyA9IFt1cC1kb3duXQorICBwcmludGYgIlxlW0xHNDAwMDIwNjBFMUUwRTA2MDI7IiAgPT4gNCA9IFtsZWZ0XQorICBwcmludGYgIlxlW0xHNTAwMDgwQzBFMEYwRTBDMDg7IiAgPT4gNSA9IFtyaWdodF0KKyAgcHJpbnRmICJcZVtMRzYwMDE2MDUxNTE2MTQxNDAwOyIgID0+IDYgPSAiSVAiCisKKyAgcHJpbnRmICJcZVtMRzAwMTAzMDcxRjFGMDcwMzAxOyIgID0+IGJpZyBzcGVha2VyCisgIHByaW50ZiAiXGVbTEcwMDAwMjA2MUUxRTA2MDIwMDsiICA9PiBzbWFsbCBzcGVha2VyCisKK1dpbGx5CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmZTI2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jCkBAIC0wLDAgKzEsMjE5MyBAQAorLyoKKyAqIEZyb250IHBhbmVsIGRyaXZlciBmb3IgTGludXgKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA4LCBXaWxseSBUYXJyZWF1IDx3QDF3dC5ldT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgY29kZSBkcml2ZXMgYW4gTENEIG1vZHVsZSAoL2Rldi9sY2QpLCBhbmQgYSBrZXlwYWQgKC9kZXYva2V5cGFkKQorICogY29ubmVjdGVkIHRvIGEgcGFyYWxsZWwgcHJpbnRlciBwb3J0LgorICoKKyAqIFRoZSBMQ0QgbW9kdWxlIG1heSBlaXRoZXIgYmUgYW4gSEQ0NDc4MC1saWtlIDgtYml0IHBhcmFsbGVsIExDRCwgb3IgYSAxLWJpdAorICogc2VyaWFsIG1vZHVsZSBjb21wYXRpYmxlIHdpdGggU2Ftc3VuZydzIEtTMDA3NC4gVGhlIHBpbnMgbWF5IGJlIGNvbm5lY3RlZCBpbgorICogYW55IGNvbWJpbmF0aW9uLCBldmVyeXRoaW5nIGlzIHByb2dyYW1tYWJsZS4KKyAqCisgKiBUaGUga2V5cGFkIGNvbnNpc3RzIGluIGEgbWF0cml4IG9mIHB1c2ggYnV0dG9ucyBjb25uZWN0aW5nIGlucHV0IHBpbnMgdG8KKyAqIGRhdGEgb3V0cHV0IHBpbnMgb3IgdG8gdGhlIGdyb3VuZC4gVGhlIGNvbWJpbmF0aW9ucyBoYXZlIHRvIGJlIGhhcmQtY29kZWQKKyAqIGluIHRoZSBkcml2ZXIsIHRob3VnaCBzZXZlcmFsIHByb2ZpbGVzIGV4aXN0IGFuZCBhZGRpbmcgbmV3IG9uZXMgaXMgZWFzeS4KKyAqCisgKiBTZXZlcmFsIHByb2ZpbGVzIGFyZSBwcm92aWRlZCBmb3IgY29tbW9ubHkgZm91bmQgTENEK2tleXBhZCBtb2R1bGVzIG9uIHRoZQorICogbWFya2V0LCBzdWNoIGFzIHRob3NlIGZvdW5kIGluIE5leGNvbSdzIGFwcGxpYW5jZXMuCisgKgorICogRklYTUU6CisgKiAgICAgIC0gdGhlIGluaXRpYWxpemF0aW9uL2RlaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBpcyB2ZXJ5IGRpcnR5IGFuZCBzaG91bGQKKyAqICAgICAgICBiZSByZXdyaXR0ZW4uIEl0IG1heSBldmVuIGJlIGJ1Z2d5LgorICoKKyAqIFRPRE86CisgKgktIGRvY3VtZW50IDI0IGtleXMga2V5Ym9hcmQgKDMgcm93cyBvZiA4IGNvbHMsIDMyIGRpb2RlcyArIDIgaW5wdXRzKQorICogICAgICAtIG1ha2UgdGhlIExDRCBhIHBhcnQgb2YgYSB2aXJ0dWFsIHNjcmVlbiBvZiBWeCpWeQorICoJLSBtYWtlIHRoZSBpbnB1dHMgbGlzdCBzbXAtc2FmZQorICogICAgICAtIGNoYW5nZSB0aGUga2V5Ym9hcmQgdG8gYSBkb3VibGUgbWFwcGluZyA6IHNpZ25hbHMgLT4ga2V5X2lkIC0+IHZhbHVlcworICogICAgICAgIHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjaGFuZ2UgdmFsdWVzIHdpdGhvdXQga25vd2luZyBzaWduYWxzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c3JlbGVhc2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgTENEX01JTk9SCQkxNTYKKyNkZWZpbmUgS0VZUEFEX01JTk9SCQkxODUKKworI2RlZmluZSBQQU5FTF9WRVJTSU9OCQkiMC45LjUiCisKKyNkZWZpbmUgTENEX01BWEJZVEVTCQkyNTYJLyogbWF4IGJ1cnN0IHdyaXRlICovCisKKyNkZWZpbmUgS0VZUEFEX0JVRkZFUgkJNjQKKyNkZWZpbmUgSU5QVVRfUE9MTF9USU1FCQkoSFovNTApCS8qIHBvbGwgdGhlIGtleWJvYXJkIHRoaXMgZXZlcnkgc2Vjb25kICovCisjZGVmaW5lIEtFWVBBRF9SRVBfU1RBUlQJKDEwKQkvKiBhIGtleSBzdGFydHMgdG8gcmVwZWF0IGFmdGVyIHRoaXMgdGltZXMgSU5QVVRfUE9MTF9USU1FICovCisjZGVmaW5lIEtFWVBBRF9SRVBfREVMQVkJKDIpCS8qIGEga2V5IHJlcGVhdHMgdGhpcyB0aW1lcyBJTlBVVF9QT0xMX1RJTUUgKi8KKworI2RlZmluZSBGTEFTSF9MSUdIVF9URU1QTwkoMjAwKQkvKiBrZWVwIHRoZSBsaWdodCBvbiB0aGlzIHRpbWVzIElOUFVUX1BPTExfVElNRSBmb3IgZWFjaCBmbGFzaCAqLworCisvKiBjb252ZXJ0cyBhbiByX3N0cigpIGlucHV0IHRvIGFuIGFjdGl2ZSBoaWdoLCBiaXRzIHN0cmluZyA6IDAwMEJBT1NFICovCisjZGVmaW5lIFBOTF9QSU5QVVQoYSkJCSgoKCh1bnNpZ25lZCBjaGFyKShhKSkgXiAweDdGKSA+PiAzKQorCisjZGVmaW5lIFBOTF9QQlVTWQkJMHg4MAkvKiBpbnZlcnRlZCBpbnB1dCwgYWN0aXZlIGxvdyAqLworI2RlZmluZSBQTkxfUEFDSwkJMHg0MAkvKiBkaXJlY3QgaW5wdXQsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgUE5MX1BPVVRQQQkJMHgyMAkvKiBkaXJlY3QgaW5wdXQsIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIFBOTF9QU0VMRUNECQkweDEwCS8qIGRpcmVjdCBpbnB1dCwgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgUE5MX1BFUlJPUlAJCTB4MDgJLyogZGlyZWN0IGlucHV0LCBhY3RpdmUgbG93ICovCisKKyNkZWZpbmUgUE5MX1BCSURJUgkJMHgyMAkvKiBiaS1kaXJlY3Rpb25hbCBwb3J0cyAqLworI2RlZmluZSBQTkxfUElOVEVOCQkweDEwCS8qIGhpZ2ggdG8gcmVhZCBkYXRhIGluIG9yLWVkIHdpdGggZGF0YSBvdXQgKi8KKyNkZWZpbmUgUE5MX1BTRUxFQ1AJCTB4MDgJLyogaW52ZXJ0ZWQgb3V0cHV0LCBhY3RpdmUgbG93ICovCisjZGVmaW5lIFBOTF9QSU5JVFAJCTB4MDQJLyogZGlyZWN0IG91dHB1dCwgYWN0aXZlIGxvdyAqLworI2RlZmluZSBQTkxfUEFVVE9MRgkJMHgwMgkvKiBpbnZlcnRlZCBvdXRwdXQsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgUE5MX1BTVFJPQkUJCTB4MDEJLyogaW52ZXJ0ZWQgb3V0cHV0ICovCisKKyNkZWZpbmUgUE5MX1BEMAkJCTB4MDEKKyNkZWZpbmUgUE5MX1BEMQkJCTB4MDIKKyNkZWZpbmUgUE5MX1BEMgkJCTB4MDQKKyNkZWZpbmUgUE5MX1BEMwkJCTB4MDgKKyNkZWZpbmUgUE5MX1BENAkJCTB4MTAKKyNkZWZpbmUgUE5MX1BENQkJCTB4MjAKKyNkZWZpbmUgUE5MX1BENgkJCTB4NDAKKyNkZWZpbmUgUE5MX1BENwkJCTB4ODAKKworI2RlZmluZSBQSU5fTk9ORQkJMAorI2RlZmluZSBQSU5fU1RST0JFCQkxCisjZGVmaW5lIFBJTl9EMAkJCTIKKyNkZWZpbmUgUElOX0QxCQkJMworI2RlZmluZSBQSU5fRDIJCQk0CisjZGVmaW5lIFBJTl9EMwkJCTUKKyNkZWZpbmUgUElOX0Q0CQkJNgorI2RlZmluZSBQSU5fRDUJCQk3CisjZGVmaW5lIFBJTl9ENgkJCTgKKyNkZWZpbmUgUElOX0Q3CQkJOQorI2RlZmluZSBQSU5fQVVUT0xGCQkxNAorI2RlZmluZSBQSU5fSU5JVFAJCTE2CisjZGVmaW5lIFBJTl9TRUxFQ1AJCTE3CisjZGVmaW5lIFBJTl9OT1RfU0VUCQkxMjcKKworI2RlZmluZSBMQ0RfRkxBR19TCQkweDAwMDEKKyNkZWZpbmUgTENEX0ZMQUdfSUQJCTB4MDAwMgorI2RlZmluZSBMQ0RfRkxBR19CCQkweDAwMDQJLyogYmxpbmsgb24gKi8KKyNkZWZpbmUgTENEX0ZMQUdfQwkJMHgwMDA4CS8qIGN1cnNvciBvbiAqLworI2RlZmluZSBMQ0RfRkxBR19ECQkweDAwMTAJLyogZGlzcGxheSBvbiAqLworI2RlZmluZSBMQ0RfRkxBR19GCQkweDAwMjAJLyogbGFyZ2UgZm9udCBtb2RlICovCisjZGVmaW5lIExDRF9GTEFHX04JCTB4MDA0MAkvKiAyLXJvd3MgbW9kZSAqLworI2RlZmluZSBMQ0RfRkxBR19MCQkweDAwODAJLyogYmFja2xpZ2h0IGVuYWJsZWQgKi8KKworI2RlZmluZSBMQ0RfRVNDQVBFX0xFTgkJMjQJLyogMjQgY2hhcnMgbWF4IGZvciBhbiBMQ0QgZXNjYXBlIGNvbW1hbmQgKi8KKyNkZWZpbmUgTENEX0VTQ0FQRV9DSEFSCTI3CS8qIHVzZSBjaGFyIDI3IGZvciBlc2NhcGUgY29tbWFuZCAqLworCisvKiBtYWNyb3MgdG8gc2ltcGxpZnkgdXNlIG9mIHRoZSBwYXJhbGxlbCBwb3J0ICovCisjZGVmaW5lIHJfY3RyKHgpICAgICAgICAocGFycG9ydF9yZWFkX2NvbnRyb2woKHgpLT5wb3J0KSkKKyNkZWZpbmUgcl9kdHIoeCkgICAgICAgIChwYXJwb3J0X3JlYWRfZGF0YSgoeCktPnBvcnQpKQorI2RlZmluZSByX3N0cih4KSAgICAgICAgKHBhcnBvcnRfcmVhZF9zdGF0dXMoKHgpLT5wb3J0KSkKKyNkZWZpbmUgd19jdHIoeCwgeSkgICAgIGRvIHsgcGFycG9ydF93cml0ZV9jb250cm9sKCh4KS0+cG9ydCwgKHkpKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgd19kdHIoeCwgeSkgICAgIGRvIHsgcGFycG9ydF93cml0ZV9kYXRhKCh4KS0+cG9ydCwgKHkpKTsgfSB3aGlsZSAoMCkKKworLyogdGhpcyBkZWZpbmVzIHdoaWNoIGJpdHMgYXJlIHRvIGJlIHVzZWQgYW5kIHdoaWNoIG9uZXMgdG8gYmUgaWdub3JlZCAqLworc3RhdGljIF9fdTggc2Nhbl9tYXNrX287CS8qIGxvZ2ljYWwgb3Igb2YgdGhlIG91dHB1dCBiaXRzIGludm9sdmVkIGluIHRoZSBzY2FuIG1hdHJpeCAqLworc3RhdGljIF9fdTggc2Nhbl9tYXNrX2k7CS8qIGxvZ2ljYWwgb3Igb2YgdGhlIGlucHV0IGJpdHMgaW52b2x2ZWQgaW4gdGhlIHNjYW4gbWF0cml4ICovCisKK3R5cGVkZWYgX191NjQgcG1hc2tfdDsKKworZW51bSBpbnB1dF90eXBlIHsKKwlJTlBVVF9UWVBFX1NURCwKKwlJTlBVVF9UWVBFX0tCRCwKK307CisKK2VudW0gaW5wdXRfc3RhdGUgeworCUlOUFVUX1NUX0xPVywKKwlJTlBVVF9TVF9SSVNJTkcsCisJSU5QVVRfU1RfSElHSCwKKwlJTlBVVF9TVF9GQUxMSU5HLAorfTsKKworc3RydWN0IGxvZ2ljYWxfaW5wdXQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlwbWFza190IG1hc2s7CisJcG1hc2tfdCB2YWx1ZTsKKwllbnVtIGlucHV0X3R5cGUgdHlwZTsKKwllbnVtIGlucHV0X3N0YXRlIHN0YXRlOworCV9fdTggcmlzZV90aW1lLCBmYWxsX3RpbWU7CisJX191OCByaXNlX3RpbWVyLCBmYWxsX3RpbWVyLCBoaWdoX3RpbWVyOworCisJdW5pb24geworCQlzdHJ1Y3QgewkvKiB0aGlzIHN0cnVjdHVyZSBpcyB2YWxpZCB3aGVuIHR5cGUgPT0gSU5QVVRfVFlQRV9TVEQgKi8KKwkJCXZvaWQgKCpwcmVzc19mY3QpIChpbnQpOworCQkJdm9pZCAoKnJlbGVhc2VfZmN0KSAoaW50KTsKKwkJCWludCBwcmVzc19kYXRhOworCQkJaW50IHJlbGVhc2VfZGF0YTsKKwkJfSBzdGQ7CisJCXN0cnVjdCB7CS8qIHRoaXMgc3RydWN0dXJlIGlzIHZhbGlkIHdoZW4gdHlwZSA9PSBJTlBVVF9UWVBFX0tCRCAqLworCQkJLyogc3RyaW5ncyBjYW4gYmUgZnVsbC1sZW5ndGggKGllLiBub24gbnVsbC10ZXJtaW5hdGVkKSAqLworCQkJY2hhciBwcmVzc19zdHJbc2l6ZW9mKHZvaWQgKikgKyBzaXplb2YoaW50KV07CisJCQljaGFyIHJlcGVhdF9zdHJbc2l6ZW9mKHZvaWQgKikgKyBzaXplb2YoaW50KV07CisJCQljaGFyIHJlbGVhc2Vfc3RyW3NpemVvZih2b2lkICopICsgc2l6ZW9mKGludCldOworCQl9IGtiZDsKKwl9IHU7Cit9OworCitMSVNUX0hFQUQobG9naWNhbF9pbnB1dHMpOwkvKiBsaXN0IG9mIGFsbCBkZWZpbmVkIGxvZ2ljYWwgaW5wdXRzICovCisKKy8qIHBoeXNpY2FsIGNvbnRhY3RzIGhpc3RvcnkKKyAqIFBoeXNpY2FsIGNvbnRhY3RzIGFyZSBhIDQ1IGJpdHMgc3RyaW5nIG9mIDkgZ3JvdXBzIG9mIDUgYml0cyBlYWNoLgorICogVGhlIDggbG93ZXIgZ3JvdXBzIGNvcnJlc3BvbmQgdG8gb3V0cHV0IGJpdHMgMCB0byA3LCBhbmQgdGhlIDl0aCBncm91cAorICogY29ycmVzcG9uZHMgdG8gdGhlIGdyb3VuZC4KKyAqIFdpdGhpbiBlYWNoIGdyb3VwLCBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgcmVhZCBvbiB0aGUgcG9ydCA6CisgKiBCQVBTRSAoYnVzeT00LCBhY2s9MywgcGFwZXIgZW1wdHk9Miwgc2VsZWN0PTEsIGVycm9yPTApLgorICogU28sIGVhY2ggX191NjQgKG9yIHBtYXNrX3QpIGlzIHJlcHJlc2VudGVkIGxpa2UgdGhpcyA6CisgKiAwMDAwMDAwMDAwMDAwMDAwMDAwQkFQU0VCQVBTRUJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0VCQVBTRUJBUFNFCisgKiA8LS0tLS11bnVzZWQtLS0tLS0+PGduZD48ZDA3PjxkMDY+PGQwNT48ZDA0PjxkMDM+PGQwMj48ZDAxPjxkMDA+CisgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfcmVhZDsJLyogd2hhdCBoYXMganVzdCBiZWVuIHJlYWQgZnJvbSB0aGUgSS9PIHBvcnRzICovCitzdGF0aWMgcG1hc2tfdCBwaHlzX3JlYWRfcHJldjsJLyogcHJldmlvdXMgcGh5c19yZWFkICovCitzdGF0aWMgcG1hc2tfdCBwaHlzX2N1cnI7CS8qIHN0YWJpbGl6ZWQgcGh5c19yZWFkIChwaHlzX3JlYWR8cGh5c19yZWFkX3ByZXYpICovCitzdGF0aWMgcG1hc2tfdCBwaHlzX3ByZXY7CS8qIHByZXZpb3VzIHBoeXNfY3VyciAqLworc3RhdGljIGNoYXIgaW5wdXRzX3N0YWJsZTsJLyogMCBtZWFucyB0aGF0IGF0IGxlYXN0IG9uZSBsb2dpY2FsIHNpZ25hbCBuZWVkcyBiZSBjb21wdXRlZCAqLworCisvKiB0aGVzZSB2YXJpYWJsZXMgYXJlIHNwZWNpZmljIHRvIHRoZSBrZXlwYWQgKi8KK3N0YXRpYyBjaGFyIGtleXBhZF9idWZmZXJbS0VZUEFEX0JVRkZFUl07CitzdGF0aWMgaW50IGtleXBhZF9idWZsZW47CitzdGF0aWMgaW50IGtleXBhZF9zdGFydDsKK3N0YXRpYyBjaGFyIGtleXByZXNzZWQ7CitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3Qga2V5cGFkX3JlYWRfd2FpdDsKKworLyogbGNkLXNwZWNpZmljIHZhcmlhYmxlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IGxjZF9mbGFnczsJLyogY29udGFpbnMgdGhlIExDRCBjb25maWcgc3RhdGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCBsY2RfYWRkcl94OwkvKiBjb250YWlucyB0aGUgTENEIFggb2Zmc2V0ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgbGNkX2FkZHJfeTsJLyogY29udGFpbnMgdGhlIExDRCBZIG9mZnNldCAqLworc3RhdGljIGNoYXIgbGNkX2VzY2FwZVtMQ0RfRVNDQVBFX0xFTiArIDFdOwkvKiBjdXJyZW50IGVzY2FwZSBzZXF1ZW5jZSwgMCB0ZXJtaW5hdGVkICovCitzdGF0aWMgaW50IGxjZF9lc2NhcGVfbGVuID0gLTE7CS8qIG5vdCBpbiBlc2NhcGUgc3RhdGUuID49MCA9IGVzY2FwZSBjbWQgbGVuICovCisKKy8qCisgKiBCaXQgbWFza3MgdG8gY29udmVydCBMQ0Qgc2lnbmFscyB0byBwYXJhbGxlbCBwb3J0IG91dHB1dHMuCisgKiBfZF8gYXJlIHZhbHVlcyBmb3IgZGF0YSBwb3J0LCBfY18gYXJlIGZvciBjb250cm9sIHBvcnQuCisgKiBbMF0gPSBzaWduYWwgT0ZGLCBbMV0gPSBzaWduYWwgT04sIFsyXSA9IG1hc2sKKyAqLworI2RlZmluZSBCSVRfQ0xSCQkwCisjZGVmaW5lIEJJVF9TRVQJCTEKKyNkZWZpbmUgQklUX01TSwkJMgorI2RlZmluZSBCSVRfU1RBVEVTCTMKKy8qCisgKiBvbmUgZW50cnkgZm9yIGVhY2ggYml0IG9uIHRoZSBMQ0QKKyAqLworI2RlZmluZSBMQ0RfQklUX0UJMAorI2RlZmluZSBMQ0RfQklUX1JTCTEKKyNkZWZpbmUgTENEX0JJVF9SVwkyCisjZGVmaW5lIExDRF9CSVRfQkwJMworI2RlZmluZSBMQ0RfQklUX0NMCTQKKyNkZWZpbmUgTENEX0JJVF9EQQk1CisjZGVmaW5lIExDRF9CSVRTCTYKKworLyoKKyAqIGVhY2ggYml0IGNhbiBiZSBlaXRoZXIgY29ubmVjdGVkIHRvIGEgREFUQSBvciBDVFJMIHBvcnQKKyAqLworI2RlZmluZSBMQ0RfUE9SVF9DCTAKKyNkZWZpbmUgTENEX1BPUlRfRAkxCisjZGVmaW5lIExDRF9QT1JUUwkyCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxjZF9iaXRzW0xDRF9QT1JUU11bTENEX0JJVFNdW0JJVF9TVEFURVNdOworCisvKgorICogTENEIHByb3RvY29scworICovCisjZGVmaW5lIExDRF9QUk9UT19QQVJBTExFTCAgICAgIDAKKyNkZWZpbmUgTENEX1BST1RPX1NFUklBTCAgICAgICAgMQorCisvKgorICogTENEIGNoYXJhY3RlciBzZXRzCisgKi8KKyNkZWZpbmUgTENEX0NIQVJTRVRfTk9STUFMICAgICAgMAorI2RlZmluZSBMQ0RfQ0hBUlNFVF9LUzAwNzQgICAgICAxCisKKy8qCisgKiBMQ0QgdHlwZXMKKyAqLworI2RlZmluZSBMQ0RfVFlQRV9OT05FCQkwCisjZGVmaW5lIExDRF9UWVBFX09MRAkJMQorI2RlZmluZSBMQ0RfVFlQRV9LUzAwNzQJCTIKKyNkZWZpbmUgTENEX1RZUEVfSEFOVFJPTklYCTMKKyNkZWZpbmUgTENEX1RZUEVfTkVYQ09NCQk0CisjZGVmaW5lIExDRF9UWVBFX0NVU1RPTQkJNQorCisvKgorICoga2V5cGFkIHR5cGVzCisgKi8KKyNkZWZpbmUgS0VZUEFEX1RZUEVfTk9ORQkwCisjZGVmaW5lIEtFWVBBRF9UWVBFX09MRAkJMQorI2RlZmluZSBLRVlQQURfVFlQRV9ORVcJCTIKKyNkZWZpbmUgS0VZUEFEX1RZUEVfTkVYQ09NCTMKKworLyoKKyAqIHBhbmVsIHByb2ZpbGVzCisgKi8KKyNkZWZpbmUgUEFORUxfUFJPRklMRV9DVVNUT00JMAorI2RlZmluZSBQQU5FTF9QUk9GSUxFX09MRAkxCisjZGVmaW5lIFBBTkVMX1BST0ZJTEVfTkVXCTIKKyNkZWZpbmUgUEFORUxfUFJPRklMRV9IQU5UUk9OSVgJMworI2RlZmluZSBQQU5FTF9QUk9GSUxFX05FWENPTQk0CisjZGVmaW5lIFBBTkVMX1BST0ZJTEVfTEFSR0UJNQorCisvKgorICogQ29uc3RydWN0IGN1c3RvbSBjb25maWcgZnJvbSB0aGUga2VybmVsJ3MgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIERFRkFVTFRfUFJPRklMRSAgICAgICAgIFBBTkVMX1BST0ZJTEVfTEFSR0UKKyNkZWZpbmUgREVGQVVMVF9QQVJQT1JUICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0xDRCAgICAgICAgICAgICBMQ0RfVFlQRV9PTEQKKyNkZWZpbmUgREVGQVVMVF9LRVlQQUQgICAgICAgICAgS0VZUEFEX1RZUEVfT0xECisjZGVmaW5lIERFRkFVTFRfTENEX1dJRFRIICAgICAgIDQwCisjZGVmaW5lIERFRkFVTFRfTENEX0JXSURUSCAgICAgIDQwCisjZGVmaW5lIERFRkFVTFRfTENEX0hXSURUSCAgICAgIDY0CisjZGVmaW5lIERFRkFVTFRfTENEX0hFSUdIVCAgICAgIDIKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUFJPVE8gICAgICAgTENEX1BST1RPX1BBUkFMTEVMCisKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX0UgICAgICAgUElOX0FVVE9MRgorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fUlMgICAgICBQSU5fU0VMRUNQCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9SVyAgICAgIFBJTl9JTklUUAorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fU0NMICAgICBQSU5fU1RST0JFCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9TREEgICAgIFBJTl9EMAorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fQkwgICAgICBQSU5fTk9UX1NFVAorI2RlZmluZSBERUZBVUxUX0xDRF9DSEFSU0VUICAgICBMQ0RfQ0hBUlNFVF9OT1JNQUwKKworI2lmZGVmIENPTkZJR19QQU5FTF9QUk9GSUxFCisjdW5kZWYgREVGQVVMVF9QUk9GSUxFCisjZGVmaW5lIERFRkFVTFRfUFJPRklMRSBDT05GSUdfUEFORUxfUFJPRklMRQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfUEFSUE9SVAorI3VuZGVmIERFRkFVTFRfUEFSUE9SVAorI2RlZmluZSBERUZBVUxUX1BBUlBPUlQgQ09ORklHX1BBTkVMX1BBUlBPUlQKKyNlbmRpZgorCisjaWYgREVGQVVMVF9QUk9GSUxFID09IDAJLyogY3VzdG9tICovCisjaWZkZWYgQ09ORklHX1BBTkVMX0tFWVBBRAorI3VuZGVmIERFRkFVTFRfS0VZUEFECisjZGVmaW5lIERFRkFVTFRfS0VZUEFEIENPTkZJR19QQU5FTF9LRVlQQUQKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRAorI3VuZGVmIERFRkFVTFRfTENECisjZGVmaW5lIERFRkFVTFRfTENEIENPTkZJR19QQU5FTF9MQ0QKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9XSURUSAorI3VuZGVmIERFRkFVTFRfTENEX1dJRFRICisjZGVmaW5lIERFRkFVTFRfTENEX1dJRFRIIENPTkZJR19QQU5FTF9MQ0RfV0lEVEgKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9CV0lEVEgKKyN1bmRlZiBERUZBVUxUX0xDRF9CV0lEVEgKKyNkZWZpbmUgREVGQVVMVF9MQ0RfQldJRFRIIENPTkZJR19QQU5FTF9MQ0RfQldJRFRICisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfSFdJRFRICisjdW5kZWYgREVGQVVMVF9MQ0RfSFdJRFRICisjZGVmaW5lIERFRkFVTFRfTENEX0hXSURUSCBDT05GSUdfUEFORUxfTENEX0hXSURUSAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX0hFSUdIVAorI3VuZGVmIERFRkFVTFRfTENEX0hFSUdIVAorI2RlZmluZSBERUZBVUxUX0xDRF9IRUlHSFQgQ09ORklHX1BBTkVMX0xDRF9IRUlHSFQKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QUk9UTworI3VuZGVmIERFRkFVTFRfTENEX1BST1RPCisjZGVmaW5lIERFRkFVTFRfTENEX1BST1RPIENPTkZJR19QQU5FTF9MQ0RfUFJPVE8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QSU5fRQorI3VuZGVmIERFRkFVTFRfTENEX1BJTl9FCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9FIENPTkZJR19QQU5FTF9MQ0RfUElOX0UKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QSU5fUlMKKyN1bmRlZiBERUZBVUxUX0xDRF9QSU5fUlMKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1JTIENPTkZJR19QQU5FTF9MQ0RfUElOX1JTCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfUElOX1JXCisjdW5kZWYgREVGQVVMVF9MQ0RfUElOX1JXCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9SVyBDT05GSUdfUEFORUxfTENEX1BJTl9SVworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9TQ0wKKyN1bmRlZiBERUZBVUxUX0xDRF9QSU5fU0NMCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9TQ0wgQ09ORklHX1BBTkVMX0xDRF9QSU5fU0NMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfUElOX1NEQQorI3VuZGVmIERFRkFVTFRfTENEX1BJTl9TREEKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1NEQSBDT05GSUdfUEFORUxfTENEX1BJTl9TREEKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QSU5fQkwKKyN1bmRlZiBERUZBVUxUX0xDRF9QSU5fQkwKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX0JMIENPTkZJR19QQU5FTF9MQ0RfUElOX0JMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfQ0hBUlNFVAorI3VuZGVmIERFRkFVTFRfTENEX0NIQVJTRVQKKyNkZWZpbmUgREVGQVVMVF9MQ0RfQ0hBUlNFVAorI2VuZGlmCisKKyNlbmRpZiAvKiBERUZBVUxUX1BST0ZJTEUgPT0gMCAqLworCisvKiBnbG9iYWwgdmFyaWFibGVzICovCitzdGF0aWMgaW50IGtleXBhZF9vcGVuX2NudDsJLyogI3RpbWVzIG9wZW5lZCAqLworc3RhdGljIGludCBsY2Rfb3Blbl9jbnQ7CS8qICN0aW1lcyBvcGVuZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFyZGV2aWNlICpwcHJ0OworCitzdGF0aWMgaW50IGxjZF9pbml0aWFsaXplZDsKK3N0YXRpYyBpbnQga2V5cGFkX2luaXRpYWxpemVkOworCitzdGF0aWMgaW50IGxpZ2h0X3RlbXBvOworCitzdGF0aWMgY2hhciBsY2RfbXVzdF9jbGVhcjsKK3N0YXRpYyBjaGFyIGxjZF9sZWZ0X3NoaWZ0Oworc3RhdGljIGNoYXIgaW5pdF9pbl9wcm9ncmVzczsKKworc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfY21kKSAoaW50KTsKK3N0YXRpYyB2b2lkICgqbGNkX3dyaXRlX2RhdGEpIChpbnQpOworc3RhdGljIHZvaWQgKCpsY2RfY2xlYXJfZmFzdCkgKHZvaWQpOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBwcnRfbG9jayk7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIHBhcmFsbGVsIHBvcnQgTENEL0tleXBhZCBkcml2ZXIiKTsKKworc3RhdGljIGludCBwYXJwb3J0ID0gLTE7Cittb2R1bGVfcGFyYW0ocGFycG9ydCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGFycG9ydCwgIlBhcmFsbGVsIHBvcnQgaW5kZXggKDA9bHB0MSwgMT1scHQyLCAuLi4pIik7CisKK3N0YXRpYyBpbnQgbGNkX2hlaWdodCA9IC0xOworbW9kdWxlX3BhcmFtKGxjZF9oZWlnaHQsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9oZWlnaHQsICJOdW1iZXIgb2YgbGluZXMgb24gdGhlIExDRCIpOworCitzdGF0aWMgaW50IGxjZF93aWR0aCA9IC0xOworbW9kdWxlX3BhcmFtKGxjZF93aWR0aCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX3dpZHRoLCAiTnVtYmVyIG9mIGNvbHVtbnMgb24gdGhlIExDRCIpOworCitzdGF0aWMgaW50IGxjZF9id2lkdGggPSAtMTsJLyogaW50ZXJuYWwgYnVmZmVyIHdpZHRoICh1c3VhbGx5IDQwKSAqLworbW9kdWxlX3BhcmFtKGxjZF9id2lkdGgsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9id2lkdGgsICJJbnRlcm5hbCBMQ0QgbGluZSB3aWR0aCAoNDApIik7CisKK3N0YXRpYyBpbnQgbGNkX2h3aWR0aCA9IC0xOwkvKiBoYXJkd2FyZSBidWZmZXIgd2lkdGggKHVzdWFsbHkgNjQpICovCittb2R1bGVfcGFyYW0obGNkX2h3aWR0aCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2h3aWR0aCwgIkxDRCBsaW5lIGhhcmR3YXJlIGFkZHJlc3MgKDY0KSIpOworCitzdGF0aWMgaW50IGxjZF9lbmFibGVkID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX2VuYWJsZWQsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9lbmFibGVkLCAiRGVwcmVjYXRlZCBvcHRpb24sIHVzZSBsY2RfdHlwZSBpbnN0ZWFkIik7CisKK3N0YXRpYyBpbnQga2V5cGFkX2VuYWJsZWQgPSAtMTsKK21vZHVsZV9wYXJhbShrZXlwYWRfZW5hYmxlZCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0Moa2V5cGFkX2VuYWJsZWQsICJEZXByZWNhdGVkIG9wdGlvbiwgdXNlIGtleXBhZF90eXBlIGluc3RlYWQiKTsKKworc3RhdGljIGludCBsY2RfdHlwZSA9IC0xOworbW9kdWxlX3BhcmFtKGxjZF90eXBlLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfdHlwZSwKKwkJICJMQ0QgdHlwZTogMD1ub25lLCAxPW9sZCAvLywgMj1zZXJpYWwga3MwMDc0LCAzPWhhbnRyb25peCAvLywgND1uZXhjb20gLy8sIDU9Y29tcGlsZWQtaW4iKTsKKworc3RhdGljIGludCBsY2RfcHJvdG8gPSAtMTsKK21vZHVsZV9wYXJhbShsY2RfcHJvdG8sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9wcm90bywgIkxDRCBjb21tdW5pY2F0aW9uOiAwPXBhcmFsbGVsICgvLyksIDE9c2VyaWFsIik7CisKK3N0YXRpYyBpbnQgbGNkX2NoYXJzZXQgPSAtMTsKK21vZHVsZV9wYXJhbShsY2RfY2hhcnNldCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2NoYXJzZXQsICJMQ0QgY2hhcmFjdGVyIHNldDogMD1zdGFuZGFyZCwgMT1LUzAwNzQiKTsKKworc3RhdGljIGludCBrZXlwYWRfdHlwZSA9IC0xOworbW9kdWxlX3BhcmFtKGtleXBhZF90eXBlLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhrZXlwYWRfdHlwZSwKKwkJICJLZXlwYWQgdHlwZTogMD1ub25lLCAxPW9sZCA2IGtleXMsIDI9bmV3IDYrMSBrZXlzLCAzPW5leGNvbSA0IGtleXMiKTsKKworc3RhdGljIGludCBwcm9maWxlID0gREVGQVVMVF9QUk9GSUxFOworbW9kdWxlX3BhcmFtKHByb2ZpbGUsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByb2ZpbGUsCisJCSAiMT0xNngyIG9sZCBrcDsgMj1zZXJpYWwgMTZ4MiwgbmV3IGtwOyAzPTE2eDIgaGFudHJvbml4OyA0PTE2eDIgbmV4Y29tOyBkZWZhdWx0PTQweDIsIG9sZCBrcCIpOworCisvKgorICogVGhlc2UgYXJlIHRoZSBwYXJhbGxlbCBwb3J0IHBpbnMgdGhlIExDRCBjb250cm9sIHNpZ25hbHMgYXJlIGNvbm5lY3RlZCB0by4KKyAqIFNldCB0aGlzIHRvIDAgaWYgdGhlIHNpZ25hbCBpcyBub3QgdXNlZC4gU2V0IGl0IHRvIGl0cyBvcHBvc2l0ZSB2YWx1ZQorICogKG5lZ2F0aXZlKSBpZiB0aGUgc2lnbmFsIGlzIG5lZ2F0ZWQuIC1NQVhJTlQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZQorICogcGluIGhhcyBub3QgYmVlbiBleHBsaWNpdGx5IHNwZWNpZmllZC4KKyAqCisgKiBXQVJOSU5HISBubyBjaGVjayB3aWxsIGJlIHBlcmZvcm1lZCBhYm91dCBjb2xsaXNpb25zIHdpdGgga2V5cGFkICEKKyAqLworCitzdGF0aWMgaW50IGxjZF9lX3BpbiAgPSBQSU5fTk9UX1NFVDsKK21vZHVsZV9wYXJhbShsY2RfZV9waW4sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9lX3BpbiwKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdFJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisKK3N0YXRpYyBpbnQgbGNkX3JzX3BpbiA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9yc19waW4sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9yc19waW4sCisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnUlMnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKworc3RhdGljIGludCBsY2RfcndfcGluID0gUElOX05PVF9TRVQ7Cittb2R1bGVfcGFyYW0obGNkX3J3X3BpbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX3J3X3BpbiwKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdSVycgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCitzdGF0aWMgaW50IGxjZF9ibF9waW4gPSBQSU5fTk9UX1NFVDsKK21vZHVsZV9wYXJhbShsY2RfYmxfcGluLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfYmxfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgYmFja2xpZ2h0LCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCitzdGF0aWMgaW50IGxjZF9kYV9waW4gPSBQSU5fTk9UX1NFVDsKK21vZHVsZV9wYXJhbShsY2RfZGFfcGluLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfZGFfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTREEnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKworc3RhdGljIGludCBsY2RfY2xfcGluID0gUElOX05PVF9TRVQ7Cittb2R1bGVfcGFyYW0obGNkX2NsX3BpbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2NsX3BpbiwKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gc2VyaWFsIExDRCAnU0NMJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpsY2RfY2hhcl9jb252OworCisvKiBmb3Igc29tZSBMQ0QgZHJpdmVycyAoa3MwMDc0KSB3ZSBuZWVkIGEgY2hhcnNldCBjb252ZXJzaW9uIHRhYmxlLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGNkX2NoYXJfY29udl9rczAwNzRbMjU2XSA9IHsKKwkvKiAgICAgICAgICAwfDggICAxfDkgICAyfEEgICAzfEIgICA0fEMgICA1fEQgICA2fEUgICA3fEYgKi8KKwkvKiAweDAwICovIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJLyogMHgwOCAqLyAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAorCS8qIDB4MTAgKi8gMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKwkvKiAweDE4ICovIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCisJLyogMHgyMCAqLyAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweGEyLCAweDI1LCAweDI2LCAweDI3LAorCS8qIDB4MjggKi8gMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwKKwkvKiAweDMwICovIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisJLyogMHgzOCAqLyAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLAorCS8qIDB4NDAgKi8gMHhhMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywKKwkvKiAweDQ4ICovIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsCisJLyogMHg1MCAqLyAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LAorCS8qIDB4NTggKi8gMHg1OCwgMHg1OSwgMHg1YSwgMHhmYSwgMHhmYiwgMHhmYywgMHgxZCwgMHhjNCwKKwkvKiAweDYwICovIDB4OTYsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCisJLyogMHg2OCAqLyAweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLAorCS8qIDB4NzAgKi8gMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywKKwkvKiAweDc4ICovIDB4NzgsIDB4NzksIDB4N2EsIDB4ZmQsIDB4ZmUsIDB4ZmYsIDB4Y2UsIDB4MjAsCisJLyogMHg4MCAqLyAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorCS8qIDB4ODggKi8gMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwKKwkvKiAweDkwICovIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsCisJLyogMHg5OCAqLyAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLAorCS8qIDB4QTAgKi8gMHgyMCwgMHg0MCwgMHhiMSwgMHhhMSwgMHgyNCwgMHhhMywgMHhmZSwgMHg1ZiwKKwkvKiAweEE4ICovIDB4MjIsIDB4YzgsIDB4NjEsIDB4MTQsIDB4OTcsIDB4MmQsIDB4YWQsIDB4OTYsCisJLyogMHhCMCAqLyAweDgwLCAweDhjLCAweDgyLCAweDgzLCAweDI3LCAweDhmLCAweDg2LCAweGRkLAorCS8qIDB4QjggKi8gMHgyYywgMHg4MSwgMHg2ZiwgMHgxNSwgMHg4YiwgMHg4YSwgMHg4NCwgMHg2MCwKKwkvKiAweEMwICovIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4NWIsIDB4NWIsIDB4YWUsIDB4YmMsIDB4YTksCisJLyogMHhDOCAqLyAweGM1LCAweGJmLCAweGM2LCAweGYxLCAweGUzLCAweGUzLCAweGUzLCAweGUzLAorCS8qIDB4RDAgKi8gMHg0NCwgMHg1ZCwgMHhhOCwgMHhlNCwgMHhlYywgMHhlYywgMHg1YywgMHg3OCwKKwkvKiAweEQ4ICovIDB4YWIsIDB4YTYsIDB4ZTUsIDB4NWUsIDB4NWUsIDB4ZTYsIDB4YWEsIDB4YmUsCisJLyogMHhFMCAqLyAweDdmLCAweGU3LCAweGFmLCAweDdiLCAweDdiLCAweGFmLCAweGJkLCAweGM4LAorCS8qIDB4RTggKi8gMHhhNCwgMHhhNSwgMHhjNywgMHhmNiwgMHhhNywgMHhlOCwgMHg2OSwgMHg2OSwKKwkvKiAweEYwICovIDB4ZWQsIDB4N2QsIDB4YTgsIDB4ZTQsIDB4ZWMsIDB4NWMsIDB4NWMsIDB4MjUsCisJLyogMHhGOCAqLyAweGFjLCAweGE2LCAweGVhLCAweGVmLCAweDdlLCAweGViLCAweGIyLCAweDc5LAorfTsKKworY2hhciBvbGRfa2V5cGFkX3Byb2ZpbGVbXVs0XVs5XSA9IHsKKwl7IlMwIiwgIkxlZnRcbiIsICJMZWZ0XG4iLCAiIn0sCisJeyJTMSIsICJEb3duXG4iLCAiRG93blxuIiwgIiJ9LAorCXsiUzIiLCAiVXBcbiIsICJVcFxuIiwgIiJ9LAorCXsiUzMiLCAiUmlnaHRcbiIsICJSaWdodFxuIiwgIiJ9LAorCXsiUzQiLCAiRXNjXG4iLCAiRXNjXG4iLCAiIn0sCisJeyJTNSIsICJSZXRcbiIsICJSZXRcbiIsICIifSwKKwl7IiIsICIiLCAiIiwgIiJ9Cit9OworCisvKiBzaWduYWxzLCBwcmVzcywgcmVwZWF0LCByZWxlYXNlICovCitjaGFyIG5ld19rZXlwYWRfcHJvZmlsZVtdWzRdWzldID0geworCXsiUzAiLCAiTGVmdFxuIiwgIkxlZnRcbiIsICIifSwKKwl7IlMxIiwgIkRvd25cbiIsICJEb3duXG4iLCAiIn0sCisJeyJTMiIsICJVcFxuIiwgIlVwXG4iLCAiIn0sCisJeyJTMyIsICJSaWdodFxuIiwgIlJpZ2h0XG4iLCAiIn0sCisJeyJTNHM1IiwgIiIsICJFc2NcbiIsICJFc2NcbiJ9LAorCXsiczRTNSIsICIiLCAiUmV0XG4iLCAiUmV0XG4ifSwKKwl7IlM0UzUiLCAiSGVscFxuIiwgIiIsICIifSwKKwkvKiBhZGQgbmV3IHNpZ25hbHMgYWJvdmUgdGhpcyBsaW5lICovCisJeyIiLCAiIiwgIiIsICIifQorfTsKKworLyogc2lnbmFscywgcHJlc3MsIHJlcGVhdCwgcmVsZWFzZSAqLworY2hhciBuZXhjb21fa2V5cGFkX3Byb2ZpbGVbXVs0XVs5XSA9IHsKKwl7ImEtcC1lLSIsICJEb3duXG4iLCAiRG93blxuIiwgIiJ9LAorCXsiYS1wLUUtIiwgIlJldFxuIiwgIlJldFxuIiwgIiJ9LAorCXsiYS1QLUUtIiwgIkVzY1xuIiwgIkVzY1xuIiwgIiJ9LAorCXsiYS1QLWUtIiwgIlVwXG4iLCAiVXBcbiIsICIifSwKKwkvKiBhZGQgbmV3IHNpZ25hbHMgYWJvdmUgdGhpcyBsaW5lICovCisJeyIiLCAiIiwgIiIsICIifQorfTsKKworc3RhdGljIGNoYXIgKCprZXlwYWRfcHJvZmlsZSlbNF1bOV0gPSBvbGRfa2V5cGFkX3Byb2ZpbGU7CisKKy8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gYSBiaXQgYXJyYXkgY29udGFpbmluZyBzaWduYWxzIHN0YXRlcyAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBlOwkvKiBwYXJhbGxlbCBMQ0QgRSAgIChkYXRhIGxhdGNoIG9uIGZhbGxpbmcgZWRnZSkgKi8KKwl1bnNpZ25lZCBjaGFyIHJzOwkvKiBwYXJhbGxlbCBMQ0QgUlMgICgwID0gY21kLCAxID0gZGF0YSkgKi8KKwl1bnNpZ25lZCBjaGFyIHJ3OwkvKiBwYXJhbGxlbCBMQ0QgUi9XICgwID0gVywgMSA9IFIpICovCisJdW5zaWduZWQgY2hhciBibDsJLyogcGFyYWxsZWwgTENEIGJhY2tsaWdodCAoMCA9IG9mZiwgMSA9IG9uKSAqLworCXVuc2lnbmVkIGNoYXIgY2w7CS8qIHNlcmlhbCBMQ0QgY2xvY2sgKGxhdGNoIG9uIHJpc2luZyBlZGdlKSAqLworCXVuc2lnbmVkIGNoYXIgZGE7CS8qIHNlcmlhbCBMQ0QgZGF0YSAqLworfSBiaXRzOworCitzdGF0aWMgdm9pZCBpbml0X3NjYW5fdGltZXIodm9pZCk7CisKKy8qIHNldHMgZGF0YSBwb3J0IGJpdHMgYWNjb3JkaW5nIHRvIGN1cnJlbnQgc2lnbmFscyB2YWx1ZXMgKi8KK3N0YXRpYyBpbnQgc2V0X2RhdGFfYml0cyh2b2lkKQoreworCWludCB2YWwsIGJpdDsKKworCXZhbCA9IHJfZHRyKHBwcnQpOworCWZvciAoYml0ID0gMDsgYml0IDwgTENEX0JJVFM7IGJpdCsrKQorCQl2YWwgJj0gbGNkX2JpdHNbTENEX1BPUlRfRF1bYml0XVtCSVRfTVNLXTsKKworCXZhbCB8PSBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0VdW2JpdHMuZV0KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX1JTXVtiaXRzLnJzXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfUlddW2JpdHMucnddCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9CTF1bYml0cy5ibF0KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0NMXVtiaXRzLmNsXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfREFdW2JpdHMuZGFdOworCisJd19kdHIocHBydCwgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBzZXRzIGN0cmwgcG9ydCBiaXRzIGFjY29yZGluZyB0byBjdXJyZW50IHNpZ25hbHMgdmFsdWVzICovCitzdGF0aWMgaW50IHNldF9jdHJsX2JpdHModm9pZCkKK3sKKwlpbnQgdmFsLCBiaXQ7CisKKwl2YWwgPSByX2N0cihwcHJ0KTsKKwlmb3IgKGJpdCA9IDA7IGJpdCA8IExDRF9CSVRTOyBiaXQrKykKKwkJdmFsICY9IGxjZF9iaXRzW0xDRF9QT1JUX0NdW2JpdF1bQklUX01TS107CisKKwl2YWwgfD0gbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9FXVtiaXRzLmVdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9SU11bYml0cy5yc10KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX1JXXVtiaXRzLnJ3XQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfQkxdW2JpdHMuYmxdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9DTF1bYml0cy5jbF0KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0RBXVtiaXRzLmRhXTsKKworCXdfY3RyKHBwcnQsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworLyogc2V0cyBjdHJsICYgZGF0YSBwb3J0IGJpdHMgYWNjb3JkaW5nIHRvIGN1cnJlbnQgc2lnbmFscyB2YWx1ZXMgKi8KK3N0YXRpYyB2b2lkIHNldF9iaXRzKHZvaWQpCit7CisJc2V0X2RhdGFfYml0cygpOworCXNldF9jdHJsX2JpdHMoKTsKK30KKworLyoKKyAqIENvbnZlcnRzIGEgcGFyYWxsZWwgcG9ydCBwaW4gKGZyb20gLTI1IHRvIDI1KSB0byBkYXRhIGFuZCBjb250cm9sIHBvcnRzCisgKiBtYXNrcywgYW5kIGRhdGEgYW5kIGNvbnRyb2wgcG9ydCBiaXRzLiBUaGUgc2lnbmFsIHdpbGwgYmUgY29uc2lkZXJlZAorICogdW5jb25uZWN0ZWQgaWYgaXQncyBvbiBwaW4gMCBvciBhbiBpbnZhbGlkIHBpbiAoPC0yNSBvciA+MjUpLgorICoKKyAqIFJlc3VsdCB3aWxsIGJlIHVzZWQgdGhpcyB3YXkgOgorICogICBvdXQoZHBvcnQsIGluKGRwb3J0KSAmIGRfdmFsWzJdIHwgZF92YWxbc2lnbmFsX3N0YXRlXSkKKyAqICAgb3V0KGNwb3J0LCBpbihjcG9ydCkgJiBjX3ZhbFsyXSB8IGNfdmFsW3NpZ25hbF9zdGF0ZV0pCisgKi8KK3ZvaWQgcGluX3RvX2JpdHMoaW50IHBpbiwgdW5zaWduZWQgY2hhciAqZF92YWwsIHVuc2lnbmVkIGNoYXIgKmNfdmFsKQoreworCWludCBkX2JpdCwgY19iaXQsIGludjsKKworCWRfdmFsWzBdID0gY192YWxbMF0gPSBkX3ZhbFsxXSA9IGNfdmFsWzFdID0gMDsKKwlkX3ZhbFsyXSA9IGNfdmFsWzJdID0gMHhGRjsKKworCWlmIChwaW4gPT0gMCkKKwkJcmV0dXJuOworCisJaW52ID0gKHBpbiA8IDApOworCWlmIChpbnYpCisJCXBpbiA9IC1waW47CisKKwlkX2JpdCA9IGNfYml0ID0gMDsKKworCXN3aXRjaCAocGluKSB7CisJY2FzZSBQSU5fU1RST0JFOgkvKiBzdHJvYmUsIGludmVydGVkICovCisJCWNfYml0ID0gUE5MX1BTVFJPQkU7CisJCWludiA9ICFpbnY7CisJCWJyZWFrOworCWNhc2UgUElOX0QwLi4uUElOX0Q3OgkvKiBEMCAtIEQ3ID0gMiAtIDkgKi8KKwkJZF9iaXQgPSAxIDw8IChwaW4gLSAyKTsKKwkJYnJlYWs7CisJY2FzZSBQSU5fQVVUT0xGOgkvKiBhdXRvZmVlZCwgaW52ZXJ0ZWQgKi8KKwkJY19iaXQgPSBQTkxfUEFVVE9MRjsKKwkJaW52ID0gIWludjsKKwkJYnJlYWs7CisJY2FzZSBQSU5fSU5JVFA6CS8qIGluaXQsIGRpcmVjdCAqLworCQljX2JpdCA9IFBOTF9QSU5JVFA7CisJCWJyZWFrOworCWNhc2UgUElOX1NFTEVDUDoJLyogc2VsZWN0X2luLCBpbnZlcnRlZCAqLworCQljX2JpdCA9IFBOTF9QU0VMRUNQOworCQlpbnYgPSAhaW52OworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogdW5rbm93biBwaW4sIGlnbm9yZSAqLworCQlicmVhazsKKwl9CisKKwlpZiAoY19iaXQpIHsKKwkJY192YWxbMl0gJj0gfmNfYml0OworCQljX3ZhbFshaW52XSA9IGNfYml0OworCX0gZWxzZSBpZiAoZF9iaXQpIHsKKwkJZF92YWxbMl0gJj0gfmRfYml0OworCQlkX3ZhbFshaW52XSA9IGRfYml0OworCX0KK30KKworLyogc2xlZXBzIHRoYXQgbWFueSBtaWxsaXNlY29uZHMgd2l0aCBhIHJlc2NoZWR1bGUgKi8KK3N0YXRpYyB2b2lkIGxvbmdfc2xlZXAoaW50IG1zKQoreworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQltZGVsYXkobXMpOworCWVsc2UgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dCgobXMgKiBIWiArIDk5OSkgLyAxMDAwKTsKKwl9Cit9CisKKy8qIHNlbmQgYSBzZXJpYWwgYnl0ZSB0byB0aGUgTENEIHBhbmVsLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nIGlmIG5lZWRlZC4gKi8KK3N0YXRpYyB2b2lkIGxjZF9zZW5kX3NlcmlhbChpbnQgYnl0ZSkKK3sKKwlpbnQgYml0OworCisJLyogdGhlIGRhdGEgYml0IGlzIHNldCBvbiBEMCwgYW5kIHRoZSBjbG9jayBvbiBTVFJPQkUuCisJICogTENEIHJlYWRzIEQwIG9uIFNUUk9CRSdzIHJpc2luZyBlZGdlLgorCSAqLworCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJYml0cy5jbCA9IEJJVF9DTFI7CS8qIENMSyBsb3cgKi8KKwkJc2V0X2JpdHMoKTsKKwkJYml0cy5kYSA9IGJ5dGUgJiAxOworCQlzZXRfYml0cygpOworCQl1ZGVsYXkoMik7CS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyIHVzIGJlZm9yZSBDTEsgdXAgKi8KKwkJYml0cy5jbCA9IEJJVF9TRVQ7CS8qIENMSyBoaWdoICovCisJCXNldF9iaXRzKCk7CisJCXVkZWxheSgxKTsJLyogbWFpbnRhaW4gdGhlIHN0cm9iZSBkdXJpbmcgMSB1cyAqLworCQlieXRlID4+PSAxOworCX0KK30KKworLyogdHVybiB0aGUgYmFja2xpZ2h0IG9uIG9yIG9mZiAqLworc3RhdGljIHZvaWQgbGNkX2JhY2tsaWdodChpbnQgb24pCit7CisJaWYgKGxjZF9ibF9waW4gPT0gUElOX05PTkUpCisJCXJldHVybjsKKworCS8qIFRoZSBiYWNrbGlnaHQgaXMgYWN0aXZhdGVkIGJ5IHNldGluZyB0aGUgQVVUT0ZFRUQgbGluZSB0byArNVYgICovCisJc3Bpbl9sb2NrKCZwcHJ0X2xvY2spOworCWJpdHMuYmwgPSBvbjsKKwlzZXRfYml0cygpOworCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOworfQorCisvKiBzZW5kIGEgY29tbWFuZCB0byB0aGUgTENEIHBhbmVsIGluIHNlcmlhbCBtb2RlICovCitzdGF0aWMgdm9pZCBsY2Rfd3JpdGVfY21kX3MoaW50IGNtZCkKK3sKKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJbGNkX3NlbmRfc2VyaWFsKDB4MUYpOwkvKiBSL1c9VywgUlM9MCAqLworCWxjZF9zZW5kX3NlcmlhbChjbWQgJiAweDBGKTsKKwlsY2Rfc2VuZF9zZXJpYWwoKGNtZCA+PiA0KSAmIDB4MEYpOworCXVkZWxheSg0MCk7CQkvKiB0aGUgc2hvcnRlc3QgY29tbWFuZCB0YWtlcyBhdCBsZWFzdCA0MCB1cyAqLworCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOworfQorCisvKiBzZW5kIGRhdGEgdG8gdGhlIExDRCBwYW5lbCBpbiBzZXJpYWwgbW9kZSAqLworc3RhdGljIHZvaWQgbGNkX3dyaXRlX2RhdGFfcyhpbnQgZGF0YSkKK3sKKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJbGNkX3NlbmRfc2VyaWFsKDB4NUYpOwkvKiBSL1c9VywgUlM9MSAqLworCWxjZF9zZW5kX3NlcmlhbChkYXRhICYgMHgwRik7CisJbGNkX3NlbmRfc2VyaWFsKChkYXRhID4+IDQpICYgMHgwRik7CisJdWRlbGF5KDQwKTsJCS8qIHRoZSBzaG9ydGVzdCBkYXRhIHRha2VzIGF0IGxlYXN0IDQwIHVzICovCisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKKy8qIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBMQ0QgcGFuZWwgaW4gOCBiaXRzIHBhcmFsbGVsIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGxjZF93cml0ZV9jbWRfcDgoaW50IGNtZCkKK3sKKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJLyogcHJlc2VudCB0aGUgZGF0YSB0byB0aGUgZGF0YSBwb3J0ICovCisJd19kdHIocHBydCwgY21kKTsKKwl1ZGVsYXkoMjApOwkJLyogbWFpbnRhaW4gdGhlIGRhdGEgZHVyaW5nIDIwIHVzIGJlZm9yZSB0aGUgc3Ryb2JlICovCisKKwliaXRzLmUgPSBCSVRfU0VUOworCWJpdHMucnMgPSBCSVRfQ0xSOworCWJpdHMucncgPSBCSVRfQ0xSOworCXNldF9jdHJsX2JpdHMoKTsKKworCXVkZWxheSg0MCk7CQkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyA0MCB1cyAqLworCisJYml0cy5lID0gQklUX0NMUjsKKwlzZXRfY3RybF9iaXRzKCk7CisKKwl1ZGVsYXkoMTIwKTsJCS8qIHRoZSBzaG9ydGVzdCBjb21tYW5kIHRha2VzIGF0IGxlYXN0IDEyMCB1cyAqLworCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOworfQorCisvKiBzZW5kIGRhdGEgdG8gdGhlIExDRCBwYW5lbCBpbiA4IGJpdHMgcGFyYWxsZWwgbW9kZSAqLworc3RhdGljIHZvaWQgbGNkX3dyaXRlX2RhdGFfcDgoaW50IGRhdGEpCit7CisJc3Bpbl9sb2NrKCZwcHJ0X2xvY2spOworCS8qIHByZXNlbnQgdGhlIGRhdGEgdG8gdGhlIGRhdGEgcG9ydCAqLworCXdfZHRyKHBwcnQsIGRhdGEpOworCXVkZWxheSgyMCk7CQkvKiBtYWludGFpbiB0aGUgZGF0YSBkdXJpbmcgMjAgdXMgYmVmb3JlIHRoZSBzdHJvYmUgKi8KKworCWJpdHMuZSA9IEJJVF9TRVQ7CisJYml0cy5ycyA9IEJJVF9TRVQ7CisJYml0cy5ydyA9IEJJVF9DTFI7CisJc2V0X2N0cmxfYml0cygpOworCisJdWRlbGF5KDQwKTsJCS8qIG1haW50YWluIHRoZSBzdHJvYmUgZHVyaW5nIDQwIHVzICovCisKKwliaXRzLmUgPSBCSVRfQ0xSOworCXNldF9jdHJsX2JpdHMoKTsKKworCXVkZWxheSg0NSk7CQkvKiB0aGUgc2hvcnRlc3QgZGF0YSB0YWtlcyBhdCBsZWFzdCA0NSB1cyAqLworCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBsY2RfZ290b3h5KHZvaWQpCit7CisJbGNkX3dyaXRlX2NtZCgweDgwCS8qIHNldCBERFJBTSBhZGRyZXNzICovCisJCSAgICAgIHwgKGxjZF9hZGRyX3kgPyBsY2RfaHdpZHRoIDogMCkKKwkJICAgICAgLyogd2UgZm9yY2UgdGhlIGN1cnNvciB0byBzdGF5IGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgaWYgaXQgd2FudHMgdG8gZ28gZmFydGhlciAqLworCQkgICAgICB8ICgobGNkX2FkZHJfeCA8IGxjZF9id2lkdGgpID8gbGNkX2FkZHJfeCAmCisJCQkgKGxjZF9od2lkdGggLSAxKSA6IGxjZF9id2lkdGggLSAxKSk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZF9wcmludChjaGFyIGMpCit7CisJaWYgKGxjZF9hZGRyX3ggPCBsY2RfYndpZHRoKSB7CisJCWlmIChsY2RfY2hhcl9jb252ICE9IE5VTEwpCisJCQljID0gbGNkX2NoYXJfY29udlsodW5zaWduZWQgY2hhciljXTsKKwkJbGNkX3dyaXRlX2RhdGEoYyk7CisJCWxjZF9hZGRyX3grKzsKKwl9CisJLyogcHJldmVudHMgdGhlIGN1cnNvciBmcm9tIHdyYXBwaW5nIG9udG8gdGhlIG5leHQgbGluZSAqLworCWlmIChsY2RfYWRkcl94ID09IGxjZF9id2lkdGgpCisJCWxjZF9nb3RveHkoKTsKK30KKworLyogZmlsbHMgdGhlIGRpc3BsYXkgd2l0aCBzcGFjZXMgYW5kIHJlc2V0cyBYL1kgKi8KK3N0YXRpYyB2b2lkIGxjZF9jbGVhcl9mYXN0X3Modm9pZCkKK3sKKwlpbnQgcG9zOworCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwlsY2RfZ290b3h5KCk7CisKKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJZm9yIChwb3MgPSAwOyBwb3MgPCBsY2RfaGVpZ2h0ICogbGNkX2h3aWR0aDsgcG9zKyspIHsKKwkJbGNkX3NlbmRfc2VyaWFsKDB4NUYpOwkvKiBSL1c9VywgUlM9MSAqLworCQlsY2Rfc2VuZF9zZXJpYWwoJyAnICYgMHgwRik7CisJCWxjZF9zZW5kX3NlcmlhbCgoJyAnID4+IDQpICYgMHgwRik7CisJCXVkZWxheSg0MCk7CS8qIHRoZSBzaG9ydGVzdCBkYXRhIHRha2VzIGF0IGxlYXN0IDQwIHVzICovCisJfQorCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOworCisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCWxjZF9nb3RveHkoKTsKK30KKworLyogZmlsbHMgdGhlIGRpc3BsYXkgd2l0aCBzcGFjZXMgYW5kIHJlc2V0cyBYL1kgKi8KK3N0YXRpYyB2b2lkIGxjZF9jbGVhcl9mYXN0X3A4KHZvaWQpCit7CisJaW50IHBvczsKKwlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJbGNkX2dvdG94eSgpOworCisJc3Bpbl9sb2NrKCZwcHJ0X2xvY2spOworCWZvciAocG9zID0gMDsgcG9zIDwgbGNkX2hlaWdodCAqIGxjZF9od2lkdGg7IHBvcysrKSB7CisJCS8qIHByZXNlbnQgdGhlIGRhdGEgdG8gdGhlIGRhdGEgcG9ydCAqLworCQl3X2R0cihwcHJ0LCAnICcpOworCQl1ZGVsYXkoMjApOwkvKiBtYWludGFpbiB0aGUgZGF0YSBkdXJpbmcgMjAgdXMgYmVmb3JlIHRoZSBzdHJvYmUgKi8KKworCQliaXRzLmUgPSBCSVRfU0VUOworCQliaXRzLnJzID0gQklUX1NFVDsKKwkJYml0cy5ydyA9IEJJVF9DTFI7CisJCXNldF9jdHJsX2JpdHMoKTsKKworCQl1ZGVsYXkoNDApOwkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyA0MCB1cyAqLworCisJCWJpdHMuZSA9IEJJVF9DTFI7CisJCXNldF9jdHJsX2JpdHMoKTsKKworCQl1ZGVsYXkoNDUpOwkvKiB0aGUgc2hvcnRlc3QgZGF0YSB0YWtlcyBhdCBsZWFzdCA0NSB1cyAqLworCX0KKwlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKKworCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwlsY2RfZ290b3h5KCk7Cit9CisKKy8qIGNsZWFycyB0aGUgZGlzcGxheSBhbmQgcmVzZXRzIFgvWSAqLworc3RhdGljIHZvaWQgbGNkX2NsZWFyX2Rpc3BsYXkodm9pZCkKK3sKKwlsY2Rfd3JpdGVfY21kKDB4MDEpOwkvKiBjbGVhciBkaXNwbGF5ICovCisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCS8qIHdlIG11c3Qgd2FpdCBhIGZldyBtaWxsaXNlY29uZHMgKDE1KSAqLworCWxvbmdfc2xlZXAoMTUpOworfQorCitzdGF0aWMgdm9pZCBsY2RfaW5pdF9kaXNwbGF5KHZvaWQpCit7CisKKwlsY2RfZmxhZ3MgPSAoKGxjZF9oZWlnaHQgPiAxKSA/IExDRF9GTEFHX04gOiAwKQorCSAgICB8IExDRF9GTEFHX0QgfCBMQ0RfRkxBR19DIHwgTENEX0ZMQUdfQjsKKworCWxvbmdfc2xlZXAoMjApOwkJLyogd2FpdCAyMCBtcyBhZnRlciBwb3dlci11cCBmb3IgdGhlIHBhcmFub2lkICovCisKKwlsY2Rfd3JpdGVfY21kKDB4MzApOwkvKiA4Yml0cywgMSBsaW5lLCBzbWFsbCBmb250cyAqLworCWxvbmdfc2xlZXAoMTApOworCWxjZF93cml0ZV9jbWQoMHgzMCk7CS8qIDhiaXRzLCAxIGxpbmUsIHNtYWxsIGZvbnRzICovCisJbG9uZ19zbGVlcCgxMCk7CisJbGNkX3dyaXRlX2NtZCgweDMwKTsJLyogOGJpdHMsIDEgbGluZSwgc21hbGwgZm9udHMgKi8KKwlsb25nX3NsZWVwKDEwKTsKKworCWxjZF93cml0ZV9jbWQoMHgzMAkvKiBzZXQgZm9udCBoZWlnaHQgYW5kIGxpbmVzIG51bWJlciAqLworCQkgICAgICB8ICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfRikgPyA0IDogMCkKKwkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX04pID8gOCA6IDApCisJICAgICk7CisJbG9uZ19zbGVlcCgxMCk7CisKKwlsY2Rfd3JpdGVfY21kKDB4MDgpOwkvKiBkaXNwbGF5IG9mZiwgY3Vyc29yIG9mZiwgYmxpbmsgb2ZmICovCisJbG9uZ19zbGVlcCgxMCk7CisKKwlsY2Rfd3JpdGVfY21kKDB4MDgJLyogc2V0IGRpc3BsYXkgbW9kZSAqLworCQkgICAgICB8ICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfRCkgPyA0IDogMCkKKwkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0MpID8gMiA6IDApCisJCSAgICAgIHwgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19CKSA/IDEgOiAwKQorCSAgICApOworCisJbGNkX2JhY2tsaWdodCgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTCkgPyAxIDogMCk7CisKKwlsb25nX3NsZWVwKDEwKTsKKworCWxjZF93cml0ZV9jbWQoMHgwNik7CS8qIGVudHJ5IG1vZGUgc2V0IDogaW5jcmVtZW50LCBjdXJzb3Igc2hpZnRpbmcgKi8KKworCWxjZF9jbGVhcl9kaXNwbGF5KCk7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZpbGUgb3BlcmF0aW9uIGZ1bmN0aW9uIGZvciB1c2VyIGFjY2VzcyB0byAvZGV2L2xjZAorICogVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgdGhlIGtlcm5lbCwgYnkKKyAqIHNldHRpbmcgZmlsZSBhbmQgcHBvcyB0byBOVUxMLgorICoKKyAqLworCitzdGF0aWMgc3NpemVfdCBsY2Rfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCWNvbnN0IGNoYXIgKnRtcCA9IGJ1ZjsKKwljaGFyIGM7CisKKwlmb3IgKDsgY291bnQtLSA+IDA7IChwcG9zID8gKCpwcG9zKSsrIDogMCksICsrdG1wKSB7CisJCWlmICghaW5faW50ZXJydXB0KCkgJiYgKCgoY291bnQgKyAxKSAmIDB4MWYpID09IDApKQorCQkJc2NoZWR1bGUoKTsJLyogbGV0J3MgYmUgYSBsaXR0bGUgbmljZSB3aXRoIG90aGVyIHByb2Nlc3NlcyB0aGF0IG5lZWQgc29tZSBDUFUgKi8KKworCQlpZiAocHBvcyA9PSBOVUxMICYmIGZpbGUgPT0gTlVMTCkKKwkJCWMgPSAqdG1wOwkvKiBsZXQncyBub3QgdXNlIGdldF91c2VyKCkgZnJvbSB0aGUga2VybmVsICEgKi8KKwkJZWxzZSBpZiAoZ2V0X3VzZXIoYywgdG1wKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIGZpcnN0LCB3ZSdsbCB0ZXN0IGlmIHdlJ3JlIGluIGVzY2FwZSBtb2RlICovCisJCWlmICgoYyAhPSAnXG4nKSAmJiBsY2RfZXNjYXBlX2xlbiA+PSAwKSB7CS8qIHllcywgbGV0J3MgYWRkIHRoaXMgY2hhciB0byB0aGUgYnVmZmVyICovCisJCQlsY2RfZXNjYXBlW2xjZF9lc2NhcGVfbGVuKytdID0gYzsKKwkJCWxjZF9lc2NhcGVbbGNkX2VzY2FwZV9sZW5dID0gMDsKKwkJfSBlbHNlIHsKKwkJCWxjZF9lc2NhcGVfbGVuID0gLTE7CS8qIGFib3J0cyBhbnkgcHJldmlvdXMgZXNjYXBlIHNlcXVlbmNlICovCisKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSBMQ0RfRVNDQVBFX0NIQVI6CS8qIHN0YXJ0IG9mIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLworCQkJCWxjZF9lc2NhcGVfbGVuID0gMDsKKwkJCQlsY2RfZXNjYXBlW2xjZF9lc2NhcGVfbGVuXSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlICdcYic6CS8qIGdvIGJhY2sgb25lIGNoYXIgYW5kIGNsZWFyIGl0ICovCisJCQkJaWYgKGxjZF9hZGRyX3ggPiAwKSB7CisJCQkJCWlmIChsY2RfYWRkcl94IDwgbGNkX2J3aWR0aCkJLyogY2hlY2sgaWYgd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKwkJCQkJCWxjZF93cml0ZV9jbWQoMHgxMCk7CS8qIGJhY2sgb25lIGNoYXIgKi8KKwkJCQkJbGNkX2FkZHJfeC0tOworCQkJCX0KKwkJCQlsY2Rfd3JpdGVfZGF0YSgnICcpOwkvKiByZXBsYWNlIHdpdGggYSBzcGFjZSAqLworCQkJCWxjZF93cml0ZV9jbWQoMHgxMCk7CS8qIGJhY2sgb25lIGNoYXIgYWdhaW4gKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgJ1wwMTQnOgkvKiBxdWlja2x5IGNsZWFyIHRoZSBkaXNwbGF5ICovCisJCQkJbGNkX2NsZWFyX2Zhc3QoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xuJzoJLyogZmx1c2ggdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCBsaW5lIGFuZCBnbyB0byB0aGUKKwkJCQkJICAgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUgKi8KKwkJCQlmb3IgKDsgbGNkX2FkZHJfeCA8IGxjZF9id2lkdGg7IGxjZF9hZGRyX3grKykKKwkJCQkJbGNkX3dyaXRlX2RhdGEoJyAnKTsKKwkJCQlsY2RfYWRkcl94ID0gMDsKKwkJCQlsY2RfYWRkcl95ID0gKGxjZF9hZGRyX3kgKyAxKSAlIGxjZF9oZWlnaHQ7CisJCQkJbGNkX2dvdG94eSgpOworCQkJCWJyZWFrOworCQkJY2FzZSAnXHInOgkvKiBnbyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzYW1lIGxpbmUgKi8KKwkJCQlsY2RfYWRkcl94ID0gMDsKKwkJCQlsY2RfZ290b3h5KCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdcdCc6CS8qIHByaW50IGEgc3BhY2UgaW5zdGVhZCBvZiB0aGUgdGFiICovCisJCQkJbGNkX3ByaW50KCcgJyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgkvKiBzaW1wbHkgcHJpbnQgdGhpcyBjaGFyICovCisJCQkJbGNkX3ByaW50KGMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogbm93IHdlJ2xsIHNlZSBpZiB3ZSdyZSBpbiBhbiBlc2NhcGUgbW9kZSBhbmQgaWYgdGhlIGN1cnJlbnQKKwkJICAgZXNjYXBlIHNlcXVlbmNlIGNhbiBiZSB1bmRlcnN0b29kLgorCQkgKi8KKwkJaWYgKGxjZF9lc2NhcGVfbGVuID49IDIpIHsJLyogbWluaW1hbCBsZW5ndGggZm9yIGFuIGVzY2FwZSBjb21tYW5kICovCisJCQlpbnQgcHJvY2Vzc2VkID0gMDsJLyogMSBtZWFucyB0aGUgY29tbWFuZCBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KKworCQkJaWYgKCFzdHJjbXAobGNkX2VzY2FwZSwgIlsySiIpKSB7CS8qIENsZWFyIHRoZSBkaXNwbGF5ICovCisJCQkJbGNkX2NsZWFyX2Zhc3QoKTsJLyogY2xlYXIgZGlzcGxheSAqLworCQkJCXByb2Nlc3NlZCA9IDE7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAobGNkX2VzY2FwZSwgIltIIikpIHsJLyogQ3Vyc29yIHRvIGhvbWUgKi8KKwkJCQlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJCQkJbGNkX2dvdG94eSgpOworCQkJCXByb2Nlc3NlZCA9IDE7CisJCQl9CisJCQkvKiBjb2RlcyBzdGFydGluZyB3aXRoIF5bW0wgKi8KKwkJCWVsc2UgaWYgKChsY2RfZXNjYXBlX2xlbiA+PSAzKSAmJgorCQkJCSAobGNkX2VzY2FwZVswXSA9PSAnWycpICYmIChsY2RfZXNjYXBlWzFdID09ICdMJykpIHsJLyogTENEIHNwZWNpYWwgY29kZXMgKi8KKworCQkJCWNoYXIgKmVzYyA9IGxjZF9lc2NhcGUgKyAyOworCQkJCWludCBvbGRmbGFncyA9IGxjZF9mbGFnczsKKworCQkJCS8qIGNoZWNrIGZvciBkaXNwbGF5IG1vZGUgZmxhZ3MgKi8KKwkJCQlzd2l0Y2ggKCplc2MpIHsKKwkJCQljYXNlICdEJzoJLyogRGlzcGxheSBPTiAqLworCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfRDsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnZCc6CS8qIERpc3BsYXkgT0ZGICovCisJCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfRDsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnQyc6CS8qIEN1cnNvciBPTiAqLworCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfQzsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnYyc6CS8qIEN1cnNvciBPRkYgKi8KKwkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19DOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdCJzoJLyogQmxpbmsgT04gKi8KKwkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0I7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2InOgkvKiBCbGluayBPRkYgKi8KKwkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19COworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICcrJzoJLyogQmFjayBsaWdodCBPTiAqLworCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfTDsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnLSc6CS8qIEJhY2sgbGlnaHQgT0ZGICovCisJCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfTDsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKic6CS8qIGZsYXNoIGJhY2sgbGlnaHQgdXNpbmcgdGhlIGtleXBhZCB0aW1lciAqLworCQkJCQlpZiAoc2Nhbl90aW1lci5mdW5jdGlvbiAhPSBOVUxMKSB7CisJCQkJCQlpZiAobGlnaHRfdGVtcG8gPT0gMAorCQkJCQkJICAgICYmICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTCkKKwkJCQkJCQk9PSAwKSkKKwkJCQkJCQlsY2RfYmFja2xpZ2h0KDEpOworCQkJCQkJbGlnaHRfdGVtcG8gPSBGTEFTSF9MSUdIVF9URU1QTzsKKwkJCQkJfQorCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdmJzoJLyogU21hbGwgRm9udCAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX0Y7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0YnOgkvKiBMYXJnZSBGb250ICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19GOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICduJzoJLyogT25lIExpbmUgKi8KKwkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19OOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdOJzoJLyogVHdvIExpbmVzICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19OOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ2wnOgkvKiBTaGlmdCBDdXJzb3IgTGVmdCAqLworCQkJCQlpZiAobGNkX2FkZHJfeCA+IDApIHsKKwkJCQkJCWlmIChsY2RfYWRkcl94IDwgbGNkX2J3aWR0aCkKKwkJCQkJCQlsY2Rfd3JpdGVfY21kKDB4MTApOwkvKiBiYWNrIG9uZSBjaGFyIGlmIG5vdCBhdCBlbmQgb2YgbGluZSAqLworCQkJCQkJbGNkX2FkZHJfeC0tOworCQkJCQl9CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAncic6CS8qIHNoaWZ0IGN1cnNvciByaWdodCAqLworCQkJCQlpZiAobGNkX2FkZHJfeCA8IGxjZF93aWR0aCkgeworCQkJCQkJaWYgKGxjZF9hZGRyX3ggPCAobGNkX2J3aWR0aCAtIDEpKQorCQkJCQkJCWxjZF93cml0ZV9jbWQoMHgxNCk7CS8qIGFsbG93IHRoZSBjdXJzb3IgdG8gcGFzcyB0aGUgZW5kIG9mIHRoZSBsaW5lICovCisJCQkJCQlsY2RfYWRkcl94Kys7CisJCQkJCX0KKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdMJzoJLyogc2hpZnQgZGlzcGxheSBsZWZ0ICovCisJCQkJCWxjZF9sZWZ0X3NoaWZ0Kys7CisJCQkJCWxjZF93cml0ZV9jbWQoMHgxOCk7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnUic6CS8qIHNoaWZ0IGRpc3BsYXkgcmlnaHQgKi8KKwkJCQkJbGNkX2xlZnRfc2hpZnQtLTsKKwkJCQkJbGNkX3dyaXRlX2NtZCgweDFDKTsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdrJzp7CS8qIGtpbGwgZW5kIG9mIGxpbmUgKi8KKwkJCQkJCWludCB4OworCQkJCQkJZm9yICh4ID0gbGNkX2FkZHJfeDsgeCA8IGxjZF9id2lkdGg7IHgrKykKKwkJCQkJCQlsY2Rfd3JpdGVfZGF0YSgnICcpOworCQkJCQkJbGNkX2dvdG94eSgpOwkvKiByZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJY2FzZSAnSSc6CS8qIHJlaW5pdGlhbGl6ZSBkaXNwbGF5ICovCisJCQkJCWxjZF9pbml0X2Rpc3BsYXkoKTsKKwkJCQkJbGNkX2xlZnRfc2hpZnQgPSAwOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ0cnOgkvKiBHZW5lcmF0b3IgOiBMR2N4eHh4eC4uLnh4OyAqLyAgeworCQkJCQkJLyogbXVzdCBoYXZlIDxjPiBiZXR3ZWVuICcwJyBhbmQgJzcnLCByZXByZXNlbnRpbmcgdGhlIG51bWVyaWNhbAorCQkJCQkJICogQVNDSUkgY29kZSBvZiB0aGUgcmVkZWZpbmVkIGNoYXJhY3RlciwgYW5kIDx4eC4uLnh4PiBhIHNlcXVlbmNlCisJCQkJCQkgKiBvZiAxNiBoZXggZGlnaXRzIHJlcHJlc2VudGluZyA4IGJ5dGVzIGZvciBlYWNoIGNoYXJhY3Rlci4gTW9zdAorCQkJCQkJICogTENEcyB3aWxsIG9ubHkgdXNlIDUgbG93ZXIgYml0cyBvZiB0aGUgNyBmaXJzdCBieXRlcy4KKwkJCQkJCSAqLworCisJCQkJCQl1bnNpZ25lZCBjaGFyIGNnYnl0ZXNbOF07CisJCQkJCQl1bnNpZ25lZCBjaGFyIGNnYWRkcjsKKwkJCQkJCWludCBjZ29mZnNldDsKKwkJCQkJCWludCBzaGlmdDsKKwkJCQkJCWNoYXIgdmFsdWU7CisJCQkJCQlpbnQgYWRkcjsKKworCQkJCQkJaWYgKHN0cmNocihlc2MsICc7JykgPT0gTlVMTCkKKwkJCQkJCQlicmVhazsKKworCQkJCQkJZXNjKys7CisKKwkJCQkJCWNnYWRkciA9ICooZXNjKyspIC0gJzAnOworCQkJCQkJaWYgKGNnYWRkciA+IDcpIHsKKwkJCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQljZ29mZnNldCA9IDA7CisJCQkJCQlzaGlmdCA9IDA7CisJCQkJCQl2YWx1ZSA9IDA7CisJCQkJCQl3aGlsZSAoKmVzYyAmJiBjZ29mZnNldCA8IDgpIHsKKwkJCQkJCQlzaGlmdCBePSA0OworCQkJCQkJCWlmICgqZXNjID49ICcwJyAmJiAqZXNjIDw9ICc5JykKKwkJCQkJCQkJdmFsdWUgfD0gKCplc2MgLSAnMCcpIDw8IHNoaWZ0OworCQkJCQkJCWVsc2UgaWYgKCplc2MgPj0gJ0EnICYmICplc2MgPD0gJ1onKQorCQkJCQkJCQl2YWx1ZSB8PSAoKmVzYyAtICdBJyArIDEwKSA8PCBzaGlmdDsKKwkJCQkJCQllbHNlIGlmICgqZXNjID49ICdhJyAmJiAqZXNjIDw9ICd6JykKKwkJCQkJCQkJdmFsdWUgfD0gKCplc2MgLSAnYScgKyAxMCkgPDwgc2hpZnQ7CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCWVzYysrOworCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoc2hpZnQgPT0gMCkgeworCQkJCQkJCQljZ2J5dGVzW2Nnb2Zmc2V0KytdID0gdmFsdWU7CisJCQkJCQkJCXZhbHVlID0gMDsKKwkJCQkJCQl9CisKKwkJCQkJCQllc2MrKzsKKwkJCQkJCX0KKworCQkJCQkJbGNkX3dyaXRlX2NtZCgweDQwIHwgKGNnYWRkciAqIDgpKTsKKwkJCQkJCWZvciAoYWRkciA9IDA7IGFkZHIgPCBjZ29mZnNldDsgYWRkcisrKQorCQkJCQkJCWxjZF93cml0ZV9kYXRhKGNnYnl0ZXNbYWRkcl0pOworCisJCQkJCQlsY2RfZ290b3h5KCk7CS8qIGVuc3VyZXMgdGhhdCB3ZSBzdG9wIHdyaXRpbmcgdG8gQ0dSQU0gKi8KKwkJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWNhc2UgJ3gnOgkvKiBnb3RveHkgOiBMeFhYWFt5WVlZXTsgKi8KKwkJCQljYXNlICd5JzoJLyogZ290b3h5IDogTHlZWVlbeFhYWF07ICovCisJCQkJCWlmIChzdHJjaHIoZXNjLCAnOycpID09IE5VTEwpCisJCQkJCQlicmVhazsKKworCQkJCQl3aGlsZSAoKmVzYykgeworCQkJCQkJaWYgKCplc2MgPT0gJ3gnKSB7CisJCQkJCQkJZXNjKys7CisJCQkJCQkJbGNkX2FkZHJfeCA9IDA7CisJCQkJCQkJd2hpbGUgKGlzZGlnaXQoKmVzYykpIHsKKwkJCQkJCQkJbGNkX2FkZHJfeCA9CisJCQkJCQkJCSAgICBsY2RfYWRkcl94ICoKKwkJCQkJCQkJICAgIDEwICsgKCplc2MgLQorCQkJCQkJCQkJICAnMCcpOworCQkJCQkJCQllc2MrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKCplc2MgPT0gJ3knKSB7CisJCQkJCQkJZXNjKys7CisJCQkJCQkJbGNkX2FkZHJfeSA9IDA7CisJCQkJCQkJd2hpbGUgKGlzZGlnaXQoKmVzYykpIHsKKwkJCQkJCQkJbGNkX2FkZHJfeSA9CisJCQkJCQkJCSAgICBsY2RfYWRkcl95ICoKKwkJCQkJCQkJICAgIDEwICsgKCplc2MgLQorCQkJCQkJCQkJICAnMCcpOworCQkJCQkJCQllc2MrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWxjZF9nb3RveHkoKTsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQkvKiBlbmQgb2Ygc3dpdGNoICovCisKKwkJCQkvKiBDaGVjayB3ZXRoZXIgb25lIGZsYWcgd2FzIGNoYW5nZWQgKi8KKwkJCQlpZiAob2xkZmxhZ3MgIT0gbGNkX2ZsYWdzKSB7CisJCQkJCS8qIGNoZWNrIHdldGhlciBvbmUgb2YgQixDLEQgZmxhZ3Mgd2FzIGNoYW5nZWQgKi8KKwkJCQkJaWYgKChvbGRmbGFncyBeIGxjZF9mbGFncykgJgorCQkJCQkgICAgKExDRF9GTEFHX0IgfCBMQ0RfRkxBR19DIHwgTENEX0ZMQUdfRCkpCisJCQkJCQkvKiBzZXQgZGlzcGxheSBtb2RlICovCisJCQkJCQlsY2Rfd3JpdGVfY21kKDB4MDggfAorCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfRCkgPyA0IDogMCkgfAorCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfQykgPyAyIDogMCkgfAorCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfQikgPyAxIDogMCkpOworCQkJCQkvKiBjaGVjayB3ZXRoZXIgb25lIG9mIEYsTiBmbGFncyB3YXMgY2hhbmdlZCAqLworCQkJCQllbHNlIGlmICgob2xkZmxhZ3MgXiBsY2RfZmxhZ3MpICYKKwkJCQkJCSAoTENEX0ZMQUdfRiB8IExDRF9GTEFHX04pKQorCQkJCQkJbGNkX3dyaXRlX2NtZCgweDMwIHwKKwkJCQkJCQkgICAgICAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0YpID8gNCA6IDApIHwKKwkJCQkJCQkgICAgICAoKGxjZF9mbGFncyAmIExDRF9GTEFHX04pID8gOCA6IDApKTsKKwkJCQkJLyogY2hlY2sgd2V0aGVyIEwgZmxhZyB3YXMgY2hhbmdlZCAqLworCQkJCQllbHNlIGlmICgob2xkZmxhZ3MgXiBsY2RfZmxhZ3MpICYKKwkJCQkJCSAoTENEX0ZMQUdfTCkpIHsKKwkJCQkJCWlmIChsY2RfZmxhZ3MgJiAoTENEX0ZMQUdfTCkpCisJCQkJCQkJbGNkX2JhY2tsaWdodCgxKTsKKwkJCQkJCWVsc2UgaWYgKGxpZ2h0X3RlbXBvID09IDApCS8qIHN3aXRjaCBvZmYgdGhlIGxpZ2h0IG9ubHkgd2hlbiB0aGUgdGVtcG8gbGlnaHRpbmcgaXMgZ29uZSAqLworCQkJCQkJCWxjZF9iYWNrbGlnaHQoMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qIExDRCBzcGVjaWFsIGVzY2FwZSBjb2RlcyAqLworCQkJLyogZmx1c2ggdGhlIGVzY2FwZSBzZXF1ZW5jZSBpZiBpdCdzIGJlZW4gcHJvY2Vzc2VkIG9yIGlmIGl0IGlzCisJCQkgICBnZXR0aW5nIHRvbyBsb25nLiAqLworCQkJaWYgKHByb2Nlc3NlZCB8fCAobGNkX2VzY2FwZV9sZW4gPj0gTENEX0VTQ0FQRV9MRU4pKQorCQkJCWxjZF9lc2NhcGVfbGVuID0gLTE7CisJCX0JCS8qIGVzY2FwZSBjb2RlcyAqLworCX0KKworCXJldHVybiB0bXAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgbGNkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGxjZF9vcGVuX2NudCkKKwkJcmV0dXJuIC1FQlVTWTsJLyogb3BlbiBvbmx5IG9uY2UgYXQgYSB0aW1lICovCisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkJLyogZGV2aWNlIGlzIHdyaXRlLW9ubHkgKi8KKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChsY2RfbXVzdF9jbGVhcikgeworCQlsY2RfY2xlYXJfZGlzcGxheSgpOworCQlsY2RfbXVzdF9jbGVhciA9IDA7CisJfQorCWxjZF9vcGVuX2NudCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxjZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWxjZF9vcGVuX2NudC0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsY2RfZm9wcyA9IHsKKwkud3JpdGUgICA9IGxjZF93cml0ZSwKKwkub3BlbiAgICA9IGxjZF9vcGVuLAorCS5yZWxlYXNlID0gbGNkX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbGNkX2RldiA9IHsKKwlMQ0RfTUlOT1IsCisJImxjZCIsCisJJmxjZF9mb3BzCit9OworCisvKiBwdWJsaWMgZnVuY3Rpb24gdXNhYmxlIGZyb20gdGhlIGtlcm5lbCBmb3IgYW55IHB1cnBvc2UgKi8KK3ZvaWQgcGFuZWxfbGNkX3ByaW50KGNoYXIgKnMpCit7CisJaWYgKGxjZF9lbmFibGVkICYmIGxjZF9pbml0aWFsaXplZCkKKwkJbGNkX3dyaXRlKE5VTEwsIHMsIHN0cmxlbihzKSwgTlVMTCk7Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIExDRCBkcml2ZXIgKi8KK3ZvaWQgbGNkX2luaXQodm9pZCkKK3sKKwlzd2l0Y2ggKGxjZF90eXBlKSB7CisJY2FzZSBMQ0RfVFlQRV9PTEQ6CS8qIHBhcmFsbGVsIG1vZGUsIDggYml0cyAqLworCQlpZiAobGNkX3Byb3RvIDwgMCkKKwkJCWxjZF9wcm90byA9IExDRF9QUk9UT19QQVJBTExFTDsKKwkJaWYgKGxjZF9jaGFyc2V0IDwgMCkKKwkJCWxjZF9jaGFyc2V0ID0gTENEX0NIQVJTRVRfTk9STUFMOworCQlpZiAobGNkX2VfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2VfcGluID0gUElOX1NUUk9CRTsKKwkJaWYgKGxjZF9yc19waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfcnNfcGluID0gUElOX0FVVE9MRjsKKworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDQwOworCQlpZiAobGNkX2J3aWR0aCA8IDApCisJCQlsY2RfYndpZHRoID0gNDA7CisJCWlmIChsY2RfaHdpZHRoIDwgMCkKKwkJCWxjZF9od2lkdGggPSA2NDsKKwkJaWYgKGxjZF9oZWlnaHQgPCAwKQorCQkJbGNkX2hlaWdodCA9IDI7CisJCWJyZWFrOworCWNhc2UgTENEX1RZUEVfS1MwMDc0OgkvKiBzZXJpYWwgbW9kZSwga3MwMDc0ICovCisJCWlmIChsY2RfcHJvdG8gPCAwKQorCQkJbGNkX3Byb3RvID0gTENEX1BST1RPX1NFUklBTDsKKwkJaWYgKGxjZF9jaGFyc2V0IDwgMCkKKwkJCWxjZF9jaGFyc2V0ID0gTENEX0NIQVJTRVRfS1MwMDc0OworCQlpZiAobGNkX2JsX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9ibF9waW4gPSBQSU5fQVVUT0xGOworCQlpZiAobGNkX2NsX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9jbF9waW4gPSBQSU5fU1RST0JFOworCQlpZiAobGNkX2RhX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9kYV9waW4gPSBQSU5fRDA7CisKKwkJaWYgKGxjZF93aWR0aCA8IDApCisJCQlsY2Rfd2lkdGggPSAxNjsKKwkJaWYgKGxjZF9id2lkdGggPCAwKQorCQkJbGNkX2J3aWR0aCA9IDQwOworCQlpZiAobGNkX2h3aWR0aCA8IDApCisJCQlsY2RfaHdpZHRoID0gMTY7CisJCWlmIChsY2RfaGVpZ2h0IDwgMCkKKwkJCWxjZF9oZWlnaHQgPSAyOworCQlicmVhazsKKwljYXNlIExDRF9UWVBFX05FWENPTToJLyogcGFyYWxsZWwgbW9kZSwgOCBiaXRzLCBnZW5lcmljICovCisJCWlmIChsY2RfcHJvdG8gPCAwKQorCQkJbGNkX3Byb3RvID0gTENEX1BST1RPX1BBUkFMTEVMOworCQlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQkJbGNkX2NoYXJzZXQgPSBMQ0RfQ0hBUlNFVF9OT1JNQUw7CisJCWlmIChsY2RfZV9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfZV9waW4gPSBQSU5fQVVUT0xGOworCQlpZiAobGNkX3JzX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9yc19waW4gPSBQSU5fU0VMRUNQOworCQlpZiAobGNkX3J3X3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9yd19waW4gPSBQSU5fSU5JVFA7CisKKwkJaWYgKGxjZF93aWR0aCA8IDApCisJCQlsY2Rfd2lkdGggPSAxNjsKKwkJaWYgKGxjZF9id2lkdGggPCAwKQorCQkJbGNkX2J3aWR0aCA9IDQwOworCQlpZiAobGNkX2h3aWR0aCA8IDApCisJCQlsY2RfaHdpZHRoID0gNjQ7CisJCWlmIChsY2RfaGVpZ2h0IDwgMCkKKwkJCWxjZF9oZWlnaHQgPSAyOworCQlicmVhazsKKwljYXNlIExDRF9UWVBFX0NVU1RPTToJLyogY3VzdG9tZXItZGVmaW5lZCAqLworCQlpZiAobGNkX3Byb3RvIDwgMCkKKwkJCWxjZF9wcm90byA9IERFRkFVTFRfTENEX1BST1RPOworCQlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQkJbGNkX2NoYXJzZXQgPSBERUZBVUxUX0xDRF9DSEFSU0VUOworCQkvKiBkZWZhdWx0IGdlb21ldHJ5IHdpbGwgYmUgc2V0IGxhdGVyICovCisJCWJyZWFrOworCWNhc2UgTENEX1RZUEVfSEFOVFJPTklYOgkvKiBwYXJhbGxlbCBtb2RlLCA4IGJpdHMsIGhhbnRyb25peC1saWtlICovCisJZGVmYXVsdDoKKwkJaWYgKGxjZF9wcm90byA8IDApCisJCQlsY2RfcHJvdG8gPSBMQ0RfUFJPVE9fUEFSQUxMRUw7CisJCWlmIChsY2RfY2hhcnNldCA8IDApCisJCQlsY2RfY2hhcnNldCA9IExDRF9DSEFSU0VUX05PUk1BTDsKKwkJaWYgKGxjZF9lX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9lX3BpbiA9IFBJTl9TVFJPQkU7CisJCWlmIChsY2RfcnNfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX3JzX3BpbiA9IFBJTl9TRUxFQ1A7CisKKwkJaWYgKGxjZF93aWR0aCA8IDApCisJCQlsY2Rfd2lkdGggPSAxNjsKKwkJaWYgKGxjZF9id2lkdGggPCAwKQorCQkJbGNkX2J3aWR0aCA9IDQwOworCQlpZiAobGNkX2h3aWR0aCA8IDApCisJCQlsY2RfaHdpZHRoID0gNjQ7CisJCWlmIChsY2RfaGVpZ2h0IDwgMCkKKwkJCWxjZF9oZWlnaHQgPSAyOworCQlicmVhazsKKwl9CisKKwkvKiB0aGlzIGlzIHVzZWQgdG8gY2F0Y2ggd3JvbmcgYW5kIGRlZmF1bHQgdmFsdWVzICovCisJaWYgKGxjZF93aWR0aCA8PSAwKQorCQlsY2Rfd2lkdGggPSBERUZBVUxUX0xDRF9XSURUSDsKKwlpZiAobGNkX2J3aWR0aCA8PSAwKQorCQlsY2RfYndpZHRoID0gREVGQVVMVF9MQ0RfQldJRFRIOworCWlmIChsY2RfaHdpZHRoIDw9IDApCisJCWxjZF9od2lkdGggPSBERUZBVUxUX0xDRF9IV0lEVEg7CisJaWYgKGxjZF9oZWlnaHQgPD0gMCkKKwkJbGNkX2hlaWdodCA9IERFRkFVTFRfTENEX0hFSUdIVDsKKworCWlmIChsY2RfcHJvdG8gPT0gTENEX1BST1RPX1NFUklBTCkgewkvKiBTRVJJQUwgKi8KKwkJbGNkX3dyaXRlX2NtZCA9IGxjZF93cml0ZV9jbWRfczsKKwkJbGNkX3dyaXRlX2RhdGEgPSBsY2Rfd3JpdGVfZGF0YV9zOworCQlsY2RfY2xlYXJfZmFzdCA9IGxjZF9jbGVhcl9mYXN0X3M7CisKKwkJaWYgKGxjZF9jbF9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfY2xfcGluID0gREVGQVVMVF9MQ0RfUElOX1NDTDsKKwkJaWYgKGxjZF9kYV9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfZGFfcGluID0gREVGQVVMVF9MQ0RfUElOX1NEQTsKKworCX0gZWxzZSB7CQkvKiBQQVJBTExFTCAqLworCQlsY2Rfd3JpdGVfY21kID0gbGNkX3dyaXRlX2NtZF9wODsKKwkJbGNkX3dyaXRlX2RhdGEgPSBsY2Rfd3JpdGVfZGF0YV9wODsKKwkJbGNkX2NsZWFyX2Zhc3QgPSBsY2RfY2xlYXJfZmFzdF9wODsKKworCQlpZiAobGNkX2VfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2VfcGluID0gREVGQVVMVF9MQ0RfUElOX0U7CisJCWlmIChsY2RfcnNfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX3JzX3BpbiA9IERFRkFVTFRfTENEX1BJTl9SUzsKKwkJaWYgKGxjZF9yd19waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfcndfcGluID0gREVGQVVMVF9MQ0RfUElOX1JXOworCX0KKworCWlmIChsY2RfYmxfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfYmxfcGluID0gREVGQVVMVF9MQ0RfUElOX0JMOworCisJaWYgKGxjZF9lX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX2VfcGluID0gUElOX05PTkU7CisJaWYgKGxjZF9yc19waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9yc19waW4gPSBQSU5fTk9ORTsKKwlpZiAobGNkX3J3X3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX3J3X3BpbiA9IFBJTl9OT05FOworCWlmIChsY2RfYmxfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfYmxfcGluID0gUElOX05PTkU7CisJaWYgKGxjZF9jbF9waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9jbF9waW4gPSBQSU5fTk9ORTsKKwlpZiAobGNkX2RhX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX2RhX3BpbiA9IFBJTl9OT05FOworCisJaWYgKGxjZF9jaGFyc2V0IDwgMCkKKwkJbGNkX2NoYXJzZXQgPSBERUZBVUxUX0xDRF9DSEFSU0VUOworCisJaWYgKGxjZF9jaGFyc2V0ID09IExDRF9DSEFSU0VUX0tTMDA3NCkKKwkJbGNkX2NoYXJfY29udiA9IGxjZF9jaGFyX2NvbnZfa3MwMDc0OworCWVsc2UKKwkJbGNkX2NoYXJfY29udiA9IE5VTEw7CisKKwlpZiAobGNkX2JsX3BpbiAhPSBQSU5fTk9ORSkKKwkJaW5pdF9zY2FuX3RpbWVyKCk7CisKKwlwaW5fdG9fYml0cyhsY2RfZV9waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfRV0sCisJCSAgICBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0VdKTsKKwlwaW5fdG9fYml0cyhsY2RfcnNfcGluLCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX1JTXSwKKwkJICAgIGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfUlNdKTsKKwlwaW5fdG9fYml0cyhsY2RfcndfcGluLCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX1JXXSwKKwkJICAgIGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfUlddKTsKKwlwaW5fdG9fYml0cyhsY2RfYmxfcGluLCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0JMXSwKKwkJICAgIGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfQkxdKTsKKwlwaW5fdG9fYml0cyhsY2RfY2xfcGluLCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0NMXSwKKwkJICAgIGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfQ0xdKTsKKwlwaW5fdG9fYml0cyhsY2RfZGFfcGluLCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0RBXSwKKwkJICAgIGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfREFdKTsKKworCS8qIGJlZm9yZSB0aGlzIGxpbmUsIHdlIG11c3QgTk9UIHNlbmQgYW55dGhpbmcgdG8gdGhlIGRpc3BsYXkuCisJICogU2luY2UgbGNkX2luaXRfZGlzcGxheSgpIG5lZWRzIHRvIHdyaXRlIGRhdGEsIHdlIGhhdmUgdG8KKwkgKiBlbmFibGUgbWFyayB0aGUgTENEIGluaXRpYWxpemVkIGp1c3QgYmVmb3JlLgorCSAqLworCWxjZF9pbml0aWFsaXplZCA9IDE7CisJbGNkX2luaXRfZGlzcGxheSgpOworCisJLyogZGlzcGxheSBhIHNob3J0IG1lc3NhZ2UgKi8KKyNpZmRlZiBDT05GSUdfUEFORUxfQ0hBTkdFX01FU1NBR0UKKyNpZmRlZiBDT05GSUdfUEFORUxfQk9PVF9NRVNTQUdFCisJcGFuZWxfbGNkX3ByaW50KCJceDFiW0xjXHgxYltMYlx4MWJbTCoiIENPTkZJR19QQU5FTF9CT09UX01FU1NBR0UpOworI2VuZGlmCisjZWxzZQorCXBhbmVsX2xjZF9wcmludCgiXHgxYltMY1x4MWJbTGJceDFiW0wqTGludXgtIiBVVFNfUkVMRUFTRSAiXG5QYW5lbC0iCisJCQlQQU5FTF9WRVJTSU9OKTsKKyNlbmRpZgorCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwlsY2RfbXVzdF9jbGVhciA9IDE7CS8qIGNsZWFyIHRoZSBkaXNwbGF5IG9uIHRoZSBuZXh0IGRldmljZSBvcGVuaW5nICovCisJbGNkX2dvdG94eSgpOworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBmaWxlIG9wZXJhdGlvbiBmdW5jdGlvbiBmb3IgdXNlciBhY2Nlc3MgdG8gL2Rldi9rZXlwYWQKKyAqLworCitzdGF0aWMgc3NpemVfdCBrZXlwYWRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwl1bnNpZ25lZCBpID0gKnBwb3M7CisJY2hhciAqdG1wID0gYnVmOworCisJaWYgKGtleXBhZF9idWZsZW4gPT0gMCkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZrZXlwYWRfcmVhZF93YWl0KTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwl9CisKKwlmb3IgKDsgY291bnQtLSA+IDAgJiYgKGtleXBhZF9idWZsZW4gPiAwKTsgKytpLCArK3RtcCwgLS1rZXlwYWRfYnVmbGVuKSB7CisJCXB1dF91c2VyKGtleXBhZF9idWZmZXJba2V5cGFkX3N0YXJ0XSwgdG1wKTsKKwkJa2V5cGFkX3N0YXJ0ID0gKGtleXBhZF9zdGFydCArIDEpICUgS0VZUEFEX0JVRkZFUjsKKwl9CisJKnBwb3MgPSBpOworCisJcmV0dXJuIHRtcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBrZXlwYWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKworCWlmIChrZXlwYWRfb3Blbl9jbnQpCisJCXJldHVybiAtRUJVU1k7CS8qIG9wZW4gb25seSBvbmNlIGF0IGEgdGltZSAqLworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQkvKiBkZXZpY2UgaXMgcmVhZC1vbmx5ICovCisJCXJldHVybiAtRVBFUk07CisKKwlrZXlwYWRfYnVmbGVuID0gMDsJLyogZmx1c2ggdGhlIGJ1ZmZlciBvbiBvcGVuaW5nICovCisJa2V5cGFkX29wZW5fY250Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga2V5cGFkX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJa2V5cGFkX29wZW5fY250LS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGtleXBhZF9mb3BzID0geworCS5yZWFkICAgID0ga2V5cGFkX3JlYWQsCQkvKiByZWFkICovCisJLm9wZW4gICAgPSBrZXlwYWRfb3BlbiwJCS8qIG9wZW4gKi8KKwkucmVsZWFzZSA9IGtleXBhZF9yZWxlYXNlLAkvKiBjbG9zZSAqLworfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGtleXBhZF9kZXYgPSB7CisJS0VZUEFEX01JTk9SLAorCSJrZXlwYWQiLAorCSZrZXlwYWRfZm9wcworfTsKKworc3RhdGljIHZvaWQga2V5cGFkX3NlbmRfa2V5KGNoYXIgKnN0cmluZywgaW50IG1heF9sZW4pCit7CisJaWYgKGluaXRfaW5fcHJvZ3Jlc3MpCisJCXJldHVybjsKKworCS8qIHNlbmQgdGhlIGtleSB0byB0aGUgZGV2aWNlIG9ubHkgaWYgYSBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGl0LiAqLworCWlmIChrZXlwYWRfb3Blbl9jbnQgPiAwKSB7CisJCXdoaWxlIChtYXhfbGVuLS0gJiYga2V5cGFkX2J1ZmxlbiA8IEtFWVBBRF9CVUZGRVIgJiYgKnN0cmluZykgeworCQkJa2V5cGFkX2J1ZmZlclsoa2V5cGFkX3N0YXJ0ICsga2V5cGFkX2J1ZmxlbisrKSAlCisJCQkJICAgICAgS0VZUEFEX0JVRkZFUl0gPSAqc3RyaW5nKys7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZrZXlwYWRfcmVhZF93YWl0KTsKKwl9Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gc2NhbnMgYWxsIHRoZSBiaXRzIGludm9sdmluZyBhdCBsZWFzdCBvbmUgbG9naWNhbCBzaWduYWwsIGFuZCBwdXRzIHRoZQorICogcmVzdWx0cyBpbiB0aGUgYml0ZmllbGQgInBoeXNfcmVhZCIgKG9uZSBiaXQgcGVyIGVzdGFibGlzaGVkIGNvbnRhY3QpLCBhbmQgc2V0cworICogInBoeXNfcmVhZF9wcmV2IiB0byAicGh5c19yZWFkIi4KKyAqCisgKiBOb3RlOiB0byBkZWJvdW5jZSBpbnB1dCBzaWduYWxzLCB3ZSB3aWxsIG9ubHkgY29uc2lkZXIgYXMgc3dpdGNoZWQgYSBzaWduYWwgd2hpY2ggaXMKKyAqIHN0YWJsZSBhY3Jvc3MgMiBtZWFzdXJlcy4gU2lnbmFscyB3aGljaCBhcmUgZGlmZmVyZW50IGJldHdlZW4gdHdvIHJlYWRzIHdpbGwgYmUga2VwdAorICogYXMgdGhleSBwcmV2aW91c2x5IHdlcmUgaW4gdGhlaXIgbG9naWNhbCBmb3JtIChwaHlzX3ByZXYpLiBBIHNpZ25hbCB3aGljaCBoYXMganVzdAorICogc3dpdGNoZWQgd2lsbCBoYXZlIGEgMSBpbiAocGh5c19yZWFkIF4gcGh5c19yZWFkX3ByZXYpLgorICovCitzdGF0aWMgdm9pZCBwaHlzX3NjYW5fY29udGFjdHModm9pZCkKK3sKKwlpbnQgYml0LCBiaXR2YWw7CisJY2hhciBvbGR2YWw7CisJY2hhciBiaXRtYXNrOworCWNoYXIgZ25kbWFzazsKKworCXBoeXNfcHJldiA9IHBoeXNfY3VycjsKKwlwaHlzX3JlYWRfcHJldiA9IHBoeXNfcmVhZDsKKwlwaHlzX3JlYWQgPSAwOwkJLyogZmx1c2ggYWxsIHNpZ25hbHMgKi8KKworCW9sZHZhbCA9IHJfZHRyKHBwcnQpIHwgc2Nhbl9tYXNrX287CS8qIGtlZXAgdHJhY2sgb2Ygb2xkIHZhbHVlLCB3aXRoIGFsbCBvdXRwdXRzIGRpc2FibGVkICovCisJd19kdHIocHBydCwgb2xkdmFsICYgfnNjYW5fbWFza19vKTsJLyogYWN0aXZhdGUgYWxsIGtleWJvYXJkIG91dHB1dHMgKGFjdGl2ZSBsb3cpICovCisJYml0bWFzayA9IFBOTF9QSU5QVVQocl9zdHIocHBydCkpICYgc2Nhbl9tYXNrX2k7CS8qIHdpbGwgaGF2ZSBhIDEgZm9yIGVhY2ggYml0IHNldCB0byBnbmQgKi8KKwl3X2R0cihwcHJ0LCBvbGR2YWwpOwkvKiBkaXNhYmxlIGFsbCBtYXRyaXggc2lnbmFscyAqLworCisJLyogbm93IHRoYXQgYWxsIG91dHB1dHMgYXJlIGNsZWFyZWQsIHRoZSBvbmx5IGFjdGl2ZSBpbnB1dCBiaXRzIGFyZQorCSAqIGRpcmVjdGx5IGNvbm5lY3RlZCB0byB0aGUgZ3JvdW5kCisJICovCisJZ25kbWFzayA9IFBOTF9QSU5QVVQocl9zdHIocHBydCkpICYgc2Nhbl9tYXNrX2k7CS8qIDEgZm9yIGVhY2ggZ3JvdW5kZWQgaW5wdXQgKi8KKworCXBoeXNfcmVhZCB8PSAocG1hc2tfdCkgZ25kbWFzayA8PCA0MDsJLyogZ3JvdW5kZWQgaW5wdXRzIGFyZSBzaWduYWxzIDQwLTQ0ICovCisKKwlpZiAoYml0bWFzayAhPSBnbmRtYXNrKSB7CisJCS8qIHNpbmNlIGNsZWFyaW5nIHRoZSBvdXRwdXRzIGNoYW5nZWQgc29tZSBpbnB1dHMsIHdlIGtub3cgdGhhdCBzb21lCisJCSAqIGlucHV0IHNpZ25hbHMgYXJlIGN1cnJlbnRseSB0aWVkIHRvIHNvbWUgb3V0cHV0cy4gU28gd2UnbGwgc2NhbiB0aGVtLgorCQkgKi8KKwkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgeworCQkJYml0dmFsID0gMSA8PCBiaXQ7CisKKwkJCWlmICghKHNjYW5fbWFza19vICYgYml0dmFsKSkJLyogc2tpcCB1bnVzZWQgYml0cyAqLworCQkJCWNvbnRpbnVlOworCisJCQl3X2R0cihwcHJ0LCBvbGR2YWwgJiB+Yml0dmFsKTsJLyogZW5hYmxlIHRoaXMgb3V0cHV0ICovCisJCQliaXRtYXNrID0gUE5MX1BJTlBVVChyX3N0cihwcHJ0KSkgJiB+Z25kbWFzazsKKwkJCXBoeXNfcmVhZCB8PSAocG1hc2tfdCkgYml0bWFzayA8PCAoNSAqIGJpdCk7CisJCX0KKwkJd19kdHIocHBydCwgb2xkdmFsKTsJLyogZGlzYWJsZSBhbGwgb3V0cHV0cyAqLworCX0KKwkvKiB0aGlzIGlzIGVhc3k6IHVzZSBvbGQgYml0cyB3aGVuIHRoZXkgYXJlIGZsYXBwaW5nLCB1c2UgbmV3IG9uZXMgd2hlbiBzdGFibGUgKi8KKwlwaHlzX2N1cnIgPQorCSAgICAocGh5c19wcmV2ICYgKHBoeXNfcmVhZCBeIHBoeXNfcmVhZF9wcmV2KSkgfCAocGh5c19yZWFkICYKKwkJCQkJCQkgIH4ocGh5c19yZWFkIF4KKwkJCQkJCQkgICAgcGh5c19yZWFkX3ByZXYpKTsKK30KKworc3RhdGljIHZvaWQgcGFuZWxfcHJvY2Vzc19pbnB1dHModm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOworCXN0cnVjdCBsb2dpY2FsX2lucHV0ICppbnB1dDsKKworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiZW50ZXJpbmcgcGFuZWxfcHJvY2Vzc19pbnB1dHMgd2l0aCBwcD0lMDE2THggJiBwYz0lMDE2THhcbiIsCisJICAgICAgIHBoeXNfcHJldiwgcGh5c19jdXJyKTsKKyNlbmRpZgorCisJa2V5cHJlc3NlZCA9IDA7CisJaW5wdXRzX3N0YWJsZSA9IDE7CisJbGlzdF9mb3JfZWFjaChpdGVtLCAmbG9naWNhbF9pbnB1dHMpIHsKKwkJaW5wdXQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBsb2dpY2FsX2lucHV0LCBsaXN0KTsKKworCQlzd2l0Y2ggKGlucHV0LT5zdGF0ZSkgeworCQljYXNlIElOUFVUX1NUX0xPVzoKKwkJCWlmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spICE9IGlucHV0LT52YWx1ZSkKKwkJCQlicmVhazsKKwkJCS8qIGlmIGFsbCBuZWVkZWQgb25lcyB3ZXJlIGFscmVhZHkgc2V0IHByZXZpb3VzbHksIHRoaXMgbWVhbnMgdGhhdAorCQkJICogdGhpcyBsb2dpY2FsIHNpZ25hbCBoYXMgYmVlbiBhY3RpdmF0ZWQgYnkgdGhlIHJlbGVhc2luZyBvZgorCQkJICogYW5vdGhlciBjb21iaW5lZCBzaWduYWwsIHNvIHdlIGRvbid0IHdhbnQgdG8gbWF0Y2guCisJCQkgKiBlZzogQUIgLShyZWxlYXNlIEIpLT4gQSAtKHJlbGVhc2UgQSktPiAwIDogZG9uJ3QgbWF0Y2ggQS4KKwkJCSAqLworCQkJaWYgKChwaHlzX3ByZXYgJiBpbnB1dC0+bWFzaykgPT0gaW5wdXQtPnZhbHVlKQorCQkJCWJyZWFrOworCQkJaW5wdXQtPnJpc2VfdGltZXIgPSAwOworCQkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfUklTSU5HOworCQkJLyogbm8gYnJlYWsgaGVyZSwgZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSU5QVVRfU1RfUklTSU5HOgorCQkJaWYgKChwaHlzX2N1cnIgJiBpbnB1dC0+bWFzaykgIT0gaW5wdXQtPnZhbHVlKSB7CisJCQkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfTE9XOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGlucHV0LT5yaXNlX3RpbWVyIDwgaW5wdXQtPnJpc2VfdGltZSkgeworCQkJCWlucHV0c19zdGFibGUgPSAwOworCQkJCWlucHV0LT5yaXNlX3RpbWVyKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpbnB1dC0+aGlnaF90aW1lciA9IDA7CisJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9ISUdIOworCQkJLyogbm8gYnJlYWsgaGVyZSwgZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSU5QVVRfU1RfSElHSDoKKyNpZiAwCisJCQkvKiBGSVhNRToKKwkJCSAqIHRoaXMgaXMgYW4gaW52YWxpZCB0ZXN0LiBJdCB0cmllcyB0byBjYXRjaCB0cmFuc2l0aW9ucyBmcm9tIHNpbmdsZS1rZXkKKwkJCSAqIHRvIG11bHRpcGxlLWtleSwgYnV0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGNvbnRhY3RzIHBvbGFyaXR5LgorCQkJICogVGhlIG9ubHkgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gaXMgdG8gcGFyc2Uga2V5cyBmcm9tIHRoZSBtb3N0IGNvbXBsZXgKKwkJCSAqIHRvIHRoZSBzaW1wbGVzdCBjb21iaW5hdGlvbnMsIGFuZCBtYXJrIHRoZW0gYXMgJ2NhdWdodCcgb25jZSBhIGNvbWJpbmF0aW9uCisJCQkgKiBtYXRjaGVzLCB0aGVuIHVubWF0Y2ggaXQgZm9yIGFsbCBvdGhlciBvbmVzLgorCQkJICovCisKKwkJCS8qIHRyeSB0byBjYXRjaCBkYW5nZXJvdXMgdHJhbnNpdGlvbnMgY2FzZXMgOgorCQkJICogc29tZW9uZSBhZGRzIGEgYml0LCBzbyB0aGlzIHNpZ25hbCB3YXMgYSBmYWxzZQorCQkJICogcG9zaXRpdmUgcmVzdWx0aW5nIGZyb20gYSB0cmFuc2l0aW9uLiBXZSBzaG91bGQgaW52YWxpZGF0ZQorCQkJICogdGhlIHNpZ25hbCBpbW1lZGlhdGVseSBhbmQgbm90IGNhbGwgdGhlIHJlbGVhc2UgZnVuY3Rpb24uCisJCQkgKiBlZzogMCAtKHByZXNzIEEpLT4gQSAtKHByZXNzIEIpLT4gQUIgOiBkb24ndCBtYXRjaCBBJ3MgcmVsZWFzZS4KKwkJCSAqLworCQkJaWYgKCgocGh5c19wcmV2ICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkKKwkJCSAgICAmJiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA+IGlucHV0LT52YWx1ZSkpIHsKKwkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CS8qIGludmFsaWRhdGUgKi8KKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpIHsKKwkJCQlpZiAoKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfU1REKQorCQkJCSAgICAmJiAoaW5wdXQtPmhpZ2hfdGltZXIgPT0gMCkpIHsKKwkJCQkJaW5wdXQtPmhpZ2hfdGltZXIrKzsKKwkJCQkJaWYgKGlucHV0LT51LnN0ZC5wcmVzc19mY3QgIT0gTlVMTCkKKwkJCQkJCWlucHV0LT51LnN0ZC5wcmVzc19mY3QoaW5wdXQtPnUuCisJCQkJCQkJCSAgICAgICBzdGQuCisJCQkJCQkJCSAgICAgICBwcmVzc19kYXRhKTsKKwkJCQl9IGVsc2UgaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfS0JEKSB7CisJCQkJCWtleXByZXNzZWQgPSAxOwkvKiB3aWxsIHR1cm4gb24gdGhlIGxpZ2h0ICovCisKKwkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyID09IDApIHsKKwkJCQkJCWlmIChpbnB1dC0+dS5rYmQucHJlc3Nfc3RyWzBdKQorCQkJCQkJCWtleXBhZF9zZW5kX2tleShpbnB1dC0+CisJCQkJCQkJCQl1LmtiZC4KKwkJCQkJCQkJCXByZXNzX3N0ciwKKwkJCQkJCQkJCXNpemVvZgorCQkJCQkJCQkJKGlucHV0LT4KKwkJCQkJCQkJCSB1LmtiZC4KKwkJCQkJCQkJCSBwcmVzc19zdHIpKTsKKwkJCQkJfQorCisJCQkJCWlmIChpbnB1dC0+dS5rYmQucmVwZWF0X3N0clswXSkgeworCQkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyID49CisJCQkJCQkgICAgS0VZUEFEX1JFUF9TVEFSVCkgeworCQkJCQkJCWlucHV0LT5oaWdoX3RpbWVyIC09CisJCQkJCQkJICAgIEtFWVBBRF9SRVBfREVMQVk7CisJCQkJCQkJa2V5cGFkX3NlbmRfa2V5KGlucHV0LT4KKwkJCQkJCQkJCXUua2JkLgorCQkJCQkJCQkJcmVwZWF0X3N0ciwKKwkJCQkJCQkJCXNpemVvZgorCQkJCQkJCQkJKGlucHV0LT4KKwkJCQkJCQkJCSB1LmtiZC4KKwkJCQkJCQkJCSByZXBlYXRfc3RyKSk7CisJCQkJCQl9CisJCQkJCQlpbnB1dHNfc3RhYmxlID0gMDsJLyogd2Ugd2lsbCBuZWVkIHRvIGNvbWUgYmFjayBoZXJlIHNvb24gKi8KKwkJCQkJfQorCisJCQkJCWlmIChpbnB1dC0+aGlnaF90aW1lciA8IDI1NSkKKwkJCQkJCWlucHV0LT5oaWdoX3RpbWVyKys7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBlbHNlIHNpZ25hbCBmYWxsaW5nIGRvd24uIExldCdzIGZhbGwgdGhyb3VnaC4gKi8KKwkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9GQUxMSU5HOworCQkJCWlucHV0LT5mYWxsX3RpbWVyID0gMDsKKwkJCX0KKwkJCS8qIG5vIGJyZWFrIGhlcmUsIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElOUFVUX1NUX0ZBTExJTkc6CisjaWYgMAorCQkJLyogRklYTUUgISEhIHNhbWUgY29tbWVudCBhcyBhYm92ZSAqLworCQkJaWYgKCgocGh5c19wcmV2ICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkKKwkJCSAgICAmJiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA+IGlucHV0LT52YWx1ZSkpIHsKKwkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CS8qIGludmFsaWRhdGUgKi8KKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpIHsKKwkJCQlpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKKwkJCQkJa2V5cHJlc3NlZCA9IDE7CS8qIHdpbGwgdHVybiBvbiB0aGUgbGlnaHQgKi8KKworCQkJCQlpZiAoaW5wdXQtPnUua2JkLnJlcGVhdF9zdHJbMF0pIHsKKwkJCQkJCWlmIChpbnB1dC0+aGlnaF90aW1lciA+PSBLRVlQQURfUkVQX1NUQVJUKQorCQkJCQkJCWlucHV0LT5oaWdoX3RpbWVyIC09IEtFWVBBRF9SRVBfREVMQVk7CisJCQkJCQlrZXlwYWRfc2VuZF9rZXkoaW5wdXQtPnUua2JkLnJlcGVhdF9zdHIsCisJCQkJCQkJCXNpemVvZihpbnB1dC0+dS5rYmQucmVwZWF0X3N0cikpOworCQkJCQkJaW5wdXRzX3N0YWJsZSA9IDA7CS8qIHdlIHdpbGwgbmVlZCB0byBjb21lIGJhY2sgaGVyZSBzb29uICovCisJCQkJCX0KKworCQkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPCAyNTUpCisJCQkJCQlpbnB1dC0+aGlnaF90aW1lcisrOworCQkJCX0KKwkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9ISUdIOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChpbnB1dC0+ZmFsbF90aW1lciA+PSBpbnB1dC0+ZmFsbF90aW1lKSB7CisJCQkJLyogY2FsbCByZWxlYXNlIGV2ZW50ICovCisJCQkJaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfU1REKSB7CisJCQkJCWlmIChpbnB1dC0+dS5zdGQucmVsZWFzZV9mY3QgIT0gTlVMTCkKKwkJCQkJCWlucHV0LT51LnN0ZC5yZWxlYXNlX2ZjdChpbnB1dC0+dS5zdGQucmVsZWFzZV9kYXRhKTsKKworCQkJCX0gZWxzZSBpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKKwkJCQkJaWYgKGlucHV0LT51LmtiZC5yZWxlYXNlX3N0clswXSkKKwkJCQkJCWtleXBhZF9zZW5kX2tleShpbnB1dC0+dS5rYmQucmVsZWFzZV9zdHIsCisJCQkJCQkJCXNpemVvZihpbnB1dC0+dS5rYmQucmVsZWFzZV9zdHIpKTsKKwkJCQl9CisKKwkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWlucHV0LT5mYWxsX3RpbWVyKys7CisJCQkJaW5wdXRzX3N0YWJsZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhbmVsX3NjYW5fdGltZXIodm9pZCkKK3sKKwlpZiAoa2V5cGFkX2VuYWJsZWQgJiYga2V5cGFkX2luaXRpYWxpemVkKSB7CisJCWlmIChzcGluX3RyeWxvY2soJnBwcnRfbG9jaykpIHsKKwkJCXBoeXNfc2Nhbl9jb250YWN0cygpOworCQkJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7CS8qIG5vIG5lZWQgZm9yIHRoZSBwYXJwb3J0IGFueW1vcmUgKi8KKwkJfQorCisJCWlmICghaW5wdXRzX3N0YWJsZSB8fCBwaHlzX2N1cnIgIT0gcGh5c19wcmV2KQorCQkJcGFuZWxfcHJvY2Vzc19pbnB1dHMoKTsKKwl9CisKKwlpZiAobGNkX2VuYWJsZWQgJiYgbGNkX2luaXRpYWxpemVkKSB7CisJCWlmIChrZXlwcmVzc2VkKSB7CisJCQlpZiAobGlnaHRfdGVtcG8gPT0gMCAmJiAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0wpID09IDApKQorCQkJCWxjZF9iYWNrbGlnaHQoMSk7CisJCQlsaWdodF90ZW1wbyA9IEZMQVNIX0xJR0hUX1RFTVBPOworCQl9IGVsc2UgaWYgKGxpZ2h0X3RlbXBvID4gMCkgeworCQkJbGlnaHRfdGVtcG8tLTsKKwkJCWlmIChsaWdodF90ZW1wbyA9PSAwICYmICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTCkgPT0gMCkpCisJCQkJbGNkX2JhY2tsaWdodCgwKTsKKwkJfQorCX0KKworCW1vZF90aW1lcigmc2Nhbl90aW1lciwgamlmZmllcyArIElOUFVUX1BPTExfVElNRSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc2Nhbl90aW1lcih2b2lkKQoreworCWlmIChzY2FuX3RpbWVyLmZ1bmN0aW9uICE9IE5VTEwpCisJCXJldHVybjsJCS8qIGFscmVhZHkgc3RhcnRlZCAqLworCisJaW5pdF90aW1lcigmc2Nhbl90aW1lcik7CisJc2Nhbl90aW1lci5leHBpcmVzID0gamlmZmllcyArIElOUFVUX1BPTExfVElNRTsKKwlzY2FuX3RpbWVyLmRhdGEgPSAwOworCXNjYW5fdGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSZwYW5lbF9zY2FuX3RpbWVyOworCWFkZF90aW1lcigmc2Nhbl90aW1lcik7Cit9CisKKy8qIGNvbnZlcnRzIGEgbmFtZSBvZiB0aGUgZm9ybSAiKHtCYkFhUHBTc0VlfXswMTIzNDU2Ny19KSoiIHRvIGEgc2VyaWVzIG9mIGJpdHMuCisgKiBpZiA8b21hc2s+IG9yIDxpbWFzaz4gYXJlIG5vbi1udWxsLCB0aGV5IHdpbGwgYmUgb3InZWQgd2l0aCB0aGUgYml0cyBjb3JyZXNwb25kaW5nCisgKiB0byBvdXQgYW5kIGluIGJpdHMgcmVzcGVjdGl2ZWx5LgorICogcmV0dXJucyAxIGlmIG9rLCAwIGlmIGVycm9yIChpbiB3aGljaCBjYXNlLCBub3RoaW5nIGlzIHdyaXR0ZW4pLgorICovCitzdGF0aWMgaW50IGlucHV0X25hbWUybWFzayhjaGFyICpuYW1lLCBwbWFza190ICptYXNrLCBwbWFza190ICp2YWx1ZSwKKwkJCSAgIGNoYXIgKmltYXNrLCBjaGFyICpvbWFzaykKK3sKKwlzdGF0aWMgY2hhciBzaWd0YWJbMTBdID0gIkVlU3NQcEFhQmIiOworCWNoYXIgaW0sIG9tOworCXBtYXNrX3QgbSwgdjsKKworCW9tID0gaW0gPSBtID0gdiA9IDBVTEw7CisJd2hpbGUgKCpuYW1lKSB7CisJCWludCBpbiwgb3V0LCBiaXQsIG5lZzsKKwkJZm9yIChpbiA9IDA7IChpbiA8IHNpemVvZihzaWd0YWIpKSAmJiAoc2lndGFiW2luXSAhPSAqbmFtZSk7IGluKyspCisJCQk7CisJCWlmIChpbiA+PSBzaXplb2Yoc2lndGFiKSkKKwkJCXJldHVybiAwOwkvKiBpbnB1dCBuYW1lIG5vdCBmb3VuZCAqLworCQluZWcgPSAoaW4gJiAxKTsJLyogb2RkIChsb3dlcikgbmFtZXMgYXJlIG5lZ2F0ZWQgKi8KKwkJaW4gPj49IDE7CisJCWltIHw9ICgxIDw8IGluKTsKKworCQluYW1lKys7CisJCWlmIChpc2RpZ2l0KCpuYW1lKSkgeworCQkJb3V0ID0gKm5hbWUgLSAnMCc7CisJCQlvbSB8PSAoMSA8PCBvdXQpOworCQl9IGVsc2UgaWYgKCpuYW1lID09ICctJykKKwkJCW91dCA9IDg7CisJCWVsc2UKKwkJCXJldHVybiAwOwkvKiB1bmtub3duIGJpdCBuYW1lICovCisKKwkJYml0ID0gKG91dCAqIDUpICsgaW47CisKKwkJbSB8PSAxVUxMIDw8IGJpdDsKKwkJaWYgKCFuZWcpCisJCQl2IHw9IDFVTEwgPDwgYml0OworCQluYW1lKys7CisJfQorCSptYXNrID0gbTsKKwkqdmFsdWUgPSB2OworCWlmIChpbWFzaykKKwkJKmltYXNrIHw9IGltOworCWlmIChvbWFzaykKKwkJKm9tYXNrIHw9IG9tOworCXJldHVybiAxOworfQorCisvKiB0cmllcyB0byBiaW5kIGEga2V5IHRvIHRoZSBzaWduYWwgbmFtZSA8bmFtZT4uIFRoZSBrZXkgd2lsbCBzZW5kIHRoZQorICogc3RyaW5ncyA8cHJlc3M+LCA8cmVwZWF0PiwgPHJlbGVhc2U+IGZvciB0aGVzZSByZXNwZWN0aXZlIGV2ZW50cy4KKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBrZXkgaWYgb2ssIE5VTEwgaWYgdGhlIGtleSBjb3VsZCBub3QgYmUgYm91bmQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9naWNhbF9pbnB1dCAqcGFuZWxfYmluZF9rZXkoY2hhciAqbmFtZSwgY2hhciAqcHJlc3MsCisJCQkJCSAgICBjaGFyICpyZXBlYXQsIGNoYXIgKnJlbGVhc2UpCit7CisJc3RydWN0IGxvZ2ljYWxfaW5wdXQgKmtleTsKKworCWtleSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2dpY2FsX2lucHV0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrZXkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwYW5lbDogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKHN0cnVjdCBsb2dpY2FsX2lucHV0KSk7CisJaWYgKCFpbnB1dF9uYW1lMm1hc2sobmFtZSwgJmtleS0+bWFzaywgJmtleS0+dmFsdWUsICZzY2FuX21hc2tfaSwKKwkJCSAgICAgJnNjYW5fbWFza19vKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlrZXktPnR5cGUgPSBJTlBVVF9UWVBFX0tCRDsKKwlrZXktPnN0YXRlID0gSU5QVVRfU1RfTE9XOworCWtleS0+cmlzZV90aW1lID0gMTsKKwlrZXktPmZhbGxfdGltZSA9IDE7CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgImJpbmQ6IDwlcz4gOiBtPSUwMTZMeCB2PSUwMTZMeFxuIiwgbmFtZSwga2V5LT5tYXNrLAorCSAgICAgICBrZXktPnZhbHVlKTsKKyNlbmRpZgorCXN0cm5jcHkoa2V5LT51LmtiZC5wcmVzc19zdHIsIHByZXNzLCBzaXplb2Yoa2V5LT51LmtiZC5wcmVzc19zdHIpKTsKKwlzdHJuY3B5KGtleS0+dS5rYmQucmVwZWF0X3N0ciwgcmVwZWF0LCBzaXplb2Yoa2V5LT51LmtiZC5yZXBlYXRfc3RyKSk7CisJc3RybmNweShrZXktPnUua2JkLnJlbGVhc2Vfc3RyLCByZWxlYXNlLAorCQlzaXplb2Yoa2V5LT51LmtiZC5yZWxlYXNlX3N0cikpOworCWxpc3RfYWRkKCZrZXktPmxpc3QsICZsb2dpY2FsX2lucHV0cyk7CisJcmV0dXJuIGtleTsKK30KKworI2lmIDAKKy8qIHRyaWVzIHRvIGJpbmQgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgc2lnbmFsIG5hbWUgPG5hbWU+LiBUaGUgZnVuY3Rpb24KKyAqIDxwcmVzc19mY3Q+IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIDxwcmVzc19kYXRhPiBhcmcgd2hlbiB0aGUgc2lnbmFsIGlzCisgKiBhY3RpdmF0ZWQsIGFuZCBzbyBvbiBmb3IgPHJlbGVhc2VfZmN0Pi88cmVsZWFzZV9kYXRhPgorICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgbmV3IHNpZ25hbCBpZiBvaywgTlVMTCBpZiB0aGUgc2lnbmFsIGNvdWxkIG5vdCBiZSBib3VuZC4KKyAqLworc3RhdGljIHN0cnVjdCBsb2dpY2FsX2lucHV0ICpwYW5lbF9iaW5kX2NhbGxiYWNrKGNoYXIgKm5hbWUsCisJCQkJCQkgdm9pZCAoKnByZXNzX2ZjdCkgKGludCksCisJCQkJCQkgaW50IHByZXNzX2RhdGEsCisJCQkJCQkgdm9pZCAoKnJlbGVhc2VfZmN0KSAoaW50KSwKKwkJCQkJCSBpbnQgcmVsZWFzZV9kYXRhKQoreworCXN0cnVjdCBsb2dpY2FsX2lucHV0ICpjYWxsYmFjazsKKworCWNhbGxiYWNrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvZ2ljYWxfaW5wdXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbGxiYWNrKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGFuZWw6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChjYWxsYmFjaywgMCwgc2l6ZW9mKHN0cnVjdCBsb2dpY2FsX2lucHV0KSk7CisJaWYgKCFpbnB1dF9uYW1lMm1hc2sobmFtZSwgJmNhbGxiYWNrLT5tYXNrLCAmY2FsbGJhY2stPnZhbHVlLAorCQkJICAgICAmc2Nhbl9tYXNrX2ksICZzY2FuX21hc2tfbykpCisJCXJldHVybiBOVUxMOworCisJY2FsbGJhY2stPnR5cGUgPSBJTlBVVF9UWVBFX1NURDsKKwljYWxsYmFjay0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CisJY2FsbGJhY2stPnJpc2VfdGltZSA9IDE7CisJY2FsbGJhY2stPmZhbGxfdGltZSA9IDE7CisJY2FsbGJhY2stPnUuc3RkLnByZXNzX2ZjdCA9IHByZXNzX2ZjdDsKKwljYWxsYmFjay0+dS5zdGQucHJlc3NfZGF0YSA9IHByZXNzX2RhdGE7CisJY2FsbGJhY2stPnUuc3RkLnJlbGVhc2VfZmN0ID0gcmVsZWFzZV9mY3Q7CisJY2FsbGJhY2stPnUuc3RkLnJlbGVhc2VfZGF0YSA9IHJlbGVhc2VfZGF0YTsKKwlsaXN0X2FkZCgmY2FsbGJhY2stPmxpc3QsICZsb2dpY2FsX2lucHV0cyk7CisJcmV0dXJuIGNhbGxiYWNrOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGtleXBhZF9pbml0KHZvaWQpCit7CisJaW50IGtleW51bTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZrZXlwYWRfcmVhZF93YWl0KTsKKwlrZXlwYWRfYnVmbGVuID0gMDsJLyogZmx1c2hlcyBhbnkgZXZlbnR1YWwgbm9pc3kga2V5c3Ryb2tlICovCisKKwkvKiBMZXQncyBjcmVhdGUgYWxsIGtub3duIGtleXMgKi8KKworCWZvciAoa2V5bnVtID0gMDsga2V5cGFkX3Byb2ZpbGVba2V5bnVtXVswXVswXTsga2V5bnVtKyspIHsKKwkJcGFuZWxfYmluZF9rZXkoa2V5cGFkX3Byb2ZpbGVba2V5bnVtXVswXSwKKwkJCSAgICAgICBrZXlwYWRfcHJvZmlsZVtrZXludW1dWzFdLAorCQkJICAgICAgIGtleXBhZF9wcm9maWxlW2tleW51bV1bMl0sCisJCQkgICAgICAga2V5cGFkX3Byb2ZpbGVba2V5bnVtXVszXSk7CisJfQorCisJaW5pdF9zY2FuX3RpbWVyKCk7CisJa2V5cGFkX2luaXRpYWxpemVkID0gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGV2aWNlIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHBhbmVsX25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJCQkgICAgdm9pZCAqdW51c2VkKQoreworCWlmIChsY2RfZW5hYmxlZCAmJiBsY2RfaW5pdGlhbGl6ZWQpIHsKKwkJc3dpdGNoIChjb2RlKSB7CisJCWNhc2UgU1lTX0RPV046CisJCQlwYW5lbF9sY2RfcHJpbnQKKwkJCSAgICAoIlx4MGNSZWxvYWRpbmdcblN5c3RlbS4uLlx4MWJbTGNceDFiW0xiXHgxYltMKyIpOworCQkJYnJlYWs7CisJCWNhc2UgU1lTX0hBTFQ6CisJCQlwYW5lbF9sY2RfcHJpbnQKKwkJCSAgICAoIlx4MGNTeXN0ZW0gSGFsdGVkLlx4MWJbTGNceDFiW0xiXHgxYltMKyIpOworCQkJYnJlYWs7CisJCWNhc2UgU1lTX1BPV0VSX09GRjoKKwkJCXBhbmVsX2xjZF9wcmludCgiXHgwY1Bvd2VyIG9mZi5ceDFiW0xjXHgxYltMYlx4MWJbTCsiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhbmVsX25vdGlmaWVyID0geworCXBhbmVsX25vdGlmeV9zeXMsCisJTlVMTCwKKwkwCit9OworCitzdGF0aWMgdm9pZCBwYW5lbF9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJaWYgKHBvcnQtPm51bWJlciAhPSBwYXJwb3J0KQorCQlyZXR1cm47CisKKwlpZiAocHBydCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJwYW5lbF9hdHRhY2goKTogcG9ydC0+bnVtYmVyPSVkIHBhcnBvcnQ9JWQsIGFscmVhZHkgcmVnaXN0ZXJlZCAhXG4iLAorCQkgICAgICAgcG9ydC0+bnVtYmVyLCBwYXJwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCXBwcnQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwb3J0LCAicGFuZWwiLCBOVUxMLCBOVUxMLAkvKiBwZiwga2YgKi8KKwkJCQkgICAgICAgTlVMTCwKKwkJCQkgICAgICAgLypQQVJQT1JUX0RFVl9FWENMICovCisJCQkJICAgICAgIDAsICh2b2lkICopJnBwcnQpOworCisJaWYgKHBhcnBvcnRfY2xhaW0ocHBydCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiUGFuZWw6IGNvdWxkIG5vdCBjbGFpbSBhY2Nlc3MgdG8gcGFycG9ydCVkLiBBYm9ydGluZy5cbiIsCisJCSAgICAgICBwYXJwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCS8qIG11c3QgaW5pdCBMQ0QgZmlyc3QsIGp1c3QgaW4gY2FzZSBhbiBJUlEgZnJvbSB0aGUga2V5cGFkIGlzIGdlbmVyYXRlZCBhdCBrZXlwYWQgaW5pdCAqLworCWlmIChsY2RfZW5hYmxlZCkgeworCQlsY2RfaW5pdCgpOworCQltaXNjX3JlZ2lzdGVyKCZsY2RfZGV2KTsKKwl9CisKKwlpZiAoa2V5cGFkX2VuYWJsZWQpIHsKKwkJa2V5cGFkX2luaXQoKTsKKwkJbWlzY19yZWdpc3Rlcigma2V5cGFkX2Rldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBwYW5lbF9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJaWYgKHBvcnQtPm51bWJlciAhPSBwYXJwb3J0KQorCQlyZXR1cm47CisKKwlpZiAoIXBwcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicGFuZWxfZGV0YWNoKCk6IHBvcnQtPm51bWJlcj0lZCBwYXJwb3J0PSVkLCBub3RoaW5nIHRvIHVucmVnaXN0ZXIuXG4iLAorCQkgICAgICAgcG9ydC0+bnVtYmVyLCBwYXJwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChrZXlwYWRfZW5hYmxlZCAmJiBrZXlwYWRfaW5pdGlhbGl6ZWQpCisJCW1pc2NfZGVyZWdpc3Rlcigma2V5cGFkX2Rldik7CisKKwlpZiAobGNkX2VuYWJsZWQgJiYgbGNkX2luaXRpYWxpemVkKQorCQltaXNjX2RlcmVnaXN0ZXIoJmxjZF9kZXYpOworCisJcGFycG9ydF9yZWxlYXNlKHBwcnQpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHBydCk7CisJcHBydCA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgcGFuZWxfZHJpdmVyID0geworCS5uYW1lID0gInBhbmVsIiwKKwkuYXR0YWNoID0gcGFuZWxfYXR0YWNoLAorCS5kZXRhY2ggPSBwYW5lbF9kZXRhY2gsCit9OworCisvKiBpbml0IGZ1bmN0aW9uICovCitpbnQgcGFuZWxfaW5pdCh2b2lkKQoreworCS8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCWtleXBhZF90eXBlID0ga2V5cGFkX2VuYWJsZWQ7CisKKwlpZiAobGNkX3R5cGUgPCAwKQorCQlsY2RfdHlwZSA9IGxjZF9lbmFibGVkOworCisJaWYgKHBhcnBvcnQgPCAwKQorCQlwYXJwb3J0ID0gREVGQVVMVF9QQVJQT1JUOworCisJLyogdGFrZSBjYXJlIG9mIGFuIGV2ZW50dWFsIHByb2ZpbGUgKi8KKwlzd2l0Y2ggKHByb2ZpbGUpIHsKKwljYXNlIFBBTkVMX1BST0ZJTEVfQ1VTVE9NOgkvKiBjdXN0b20gcHJvZmlsZSAqLworCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQorCQkJa2V5cGFkX3R5cGUgPSBERUZBVUxUX0tFWVBBRDsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gREVGQVVMVF9MQ0Q7CisJCWJyZWFrOworCWNhc2UgUEFORUxfUFJPRklMRV9PTEQ6CS8qIDggYml0cywgMioxNiwgb2xkIGtleXBhZCAqLworCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQorCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9PTEQ7CisJCWlmIChsY2RfdHlwZSA8IDApCisJCQlsY2RfdHlwZSA9IExDRF9UWVBFX09MRDsKKwkJaWYgKGxjZF93aWR0aCA8IDApCisJCQlsY2Rfd2lkdGggPSAxNjsKKwkJaWYgKGxjZF9od2lkdGggPCAwKQorCQkJbGNkX2h3aWR0aCA9IDE2OworCQlicmVhazsKKwljYXNlIFBBTkVMX1BST0ZJTEVfTkVXOgkvKiBzZXJpYWwsIDIqMTYsIG5ldyBrZXlwYWQgKi8KKwkJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJCWtleXBhZF90eXBlID0gS0VZUEFEX1RZUEVfTkVXOworCQlpZiAobGNkX3R5cGUgPCAwKQorCQkJbGNkX3R5cGUgPSBMQ0RfVFlQRV9LUzAwNzQ7CisJCWJyZWFrOworCWNhc2UgUEFORUxfUFJPRklMRV9IQU5UUk9OSVg6CS8qIDggYml0cywgMioxNiBoYW50cm9uaXgtbGlrZSwgbm8ga2V5cGFkICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IEtFWVBBRF9UWVBFX05PTkU7CisJCWlmIChsY2RfdHlwZSA8IDApCisJCQlsY2RfdHlwZSA9IExDRF9UWVBFX0hBTlRST05JWDsKKwkJYnJlYWs7CisJY2FzZSBQQU5FTF9QUk9GSUxFX05FWENPTToJLyogZ2VuZXJpYyA4IGJpdHMsIDIqMTYsIG5leGNvbSBrZXlwYWQsIGVnLiBOZXhjb20uICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IEtFWVBBRF9UWVBFX05FWENPTTsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gTENEX1RZUEVfTkVYQ09NOworCQlicmVhazsKKwljYXNlIFBBTkVMX1BST0ZJTEVfTEFSR0U6CS8qIDggYml0cywgMio0MCwgb2xkIGtleXBhZCAqLworCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQorCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9PTEQ7CisJCWlmIChsY2RfdHlwZSA8IDApCisJCQlsY2RfdHlwZSA9IExDRF9UWVBFX09MRDsKKwkJYnJlYWs7CisJfQorCisJbGNkX2VuYWJsZWQgPSAobGNkX3R5cGUgPiAwKTsKKwlrZXlwYWRfZW5hYmxlZCA9IChrZXlwYWRfdHlwZSA+IDApOworCisJc3dpdGNoIChrZXlwYWRfdHlwZSkgeworCWNhc2UgS0VZUEFEX1RZUEVfT0xEOgorCQlrZXlwYWRfcHJvZmlsZSA9IG9sZF9rZXlwYWRfcHJvZmlsZTsKKwkJYnJlYWs7CisJY2FzZSBLRVlQQURfVFlQRV9ORVc6CisJCWtleXBhZF9wcm9maWxlID0gbmV3X2tleXBhZF9wcm9maWxlOworCQlicmVhazsKKwljYXNlIEtFWVBBRF9UWVBFX05FWENPTToKKwkJa2V5cGFkX3Byb2ZpbGUgPSBuZXhjb21fa2V5cGFkX3Byb2ZpbGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWtleXBhZF9wcm9maWxlID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJLyogdGVsbHMgdmFyaW91cyBzdWJzeXN0ZW1zIGFib3V0IHRoZSBmYWN0IHRoYXQgd2UgYXJlIGluaXRpYWxpemluZyAqLworCWluaXRfaW5fcHJvZ3Jlc3MgPSAxOworCisJaWYgKHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZwYW5lbF9kcml2ZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIlBhbmVsOiBjb3VsZCBub3QgcmVnaXN0ZXIgd2l0aCBwYXJwb3J0LiBBYm9ydGluZy5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIWxjZF9lbmFibGVkICYmICFrZXlwYWRfZW5hYmxlZCkgeworCQkvKiBubyBkZXZpY2UgZW5hYmxlZCwgbGV0J3MgcmVsZWFzZSB0aGUgcGFycG9ydCAqLworCQlpZiAocHBydCkgeworCQkJcGFycG9ydF9yZWxlYXNlKHBwcnQpOworCQkJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcHJ0KTsKKwkJfQorCQlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZwYW5lbF9kcml2ZXIpOworCQlwcmludGsoS0VSTl9FUlIgIlBhbmVsIGRyaXZlciB2ZXJzaW9uICIgUEFORUxfVkVSU0lPTgorCQkgICAgICAgIiBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBhbmVsX25vdGlmaWVyKTsKKworCWlmIChwcHJ0KQorCQlwcmludGsoS0VSTl9JTkZPICJQYW5lbCBkcml2ZXIgdmVyc2lvbiAiIFBBTkVMX1ZFUlNJT04KKwkJICAgICAgICIgcmVnaXN0ZXJlZCBvbiBwYXJwb3J0JWQgKGlvPTB4JWx4KS5cbiIsIHBhcnBvcnQsCisJCSAgICAgICBwcHJ0LT5wb3J0LT5iYXNlKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIlBhbmVsIGRyaXZlciB2ZXJzaW9uICIgUEFORUxfVkVSU0lPTgorCQkgICAgICAgIiBub3QgeWV0IHJlZ2lzdGVyZWRcbiIpOworCS8qIHRlbGxzIHZhcmlvdXMgc3Vic3lzdGVtcyBhYm91dCB0aGUgZmFjdCB0aGF0IGluaXRpYWxpemF0aW9uIGlzIGZpbmlzaGVkICovCisJaW5pdF9pbl9wcm9ncmVzcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBhbmVsX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBhbmVsX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBhbmVsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBhbmVsX25vdGlmaWVyKTsKKworCWlmIChzY2FuX3RpbWVyLmZ1bmN0aW9uICE9IE5VTEwpCisJCWRlbF90aW1lcigmc2Nhbl90aW1lcik7CisKKwlpZiAoa2V5cGFkX2VuYWJsZWQpCisJCW1pc2NfZGVyZWdpc3Rlcigma2V5cGFkX2Rldik7CisKKwlpZiAobGNkX2VuYWJsZWQpIHsKKwkJcGFuZWxfbGNkX3ByaW50KCJceDBjTENEIGRyaXZlciAiIFBBTkVMX1ZFUlNJT04KKwkJCQkiXG51bmxvYWRlZC5ceDFiW0xjXHgxYltMYlx4MWJbTC0iKTsKKwkJbWlzY19kZXJlZ2lzdGVyKCZsY2RfZGV2KTsKKwl9CisKKwkvKiBUT0RPOiBmcmVlIGFsbCBpbnB1dCBzaWduYWxzICovCisKKwlwYXJwb3J0X3JlbGVhc2UocHBydCk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcHJ0KTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZwYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwYW5lbF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChwYW5lbF9jbGVhbnVwX21vZHVsZSk7CitNT0RVTEVfQVVUSE9SKCJXaWxseSBUYXJyZWF1Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FCmluZGV4IGY2NWU5NzkuLjg0MmFmZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUKQEAgLTEsNSArMSwxMiBAQAogVE9ETzoKLQktIGZpeCB0cmFuc21pdCBvdmVyZmxvd3MKKwktIFJ4IGJsb2NrIHNpemUgaXMgbGltaXRlZCB0byA8IDIwNDgsIGhhcmR3YXJlIGJ1Zz8KKwktIEdyb3VwIHNpemUgaXMgbGltaXRlZCB0byA8IHBhZ2Ugc2l6ZSwga2VybmVsIGFsbG9jL21tYXAgQVBJIGlzc3VlcworCS0gZml4L3dvcmthcm91bmQgY2FjaGUgaXNzdWVzIGluIGNpcmN1bGFyIGJ1ZmZlciBoZWFkZXIKKwktIHRlc3Qgd2hldGhlciBUeCBpcyB0cmFuc21pdHRpbmcgZGF0YSBmcm9tIHByb3ZpZGVkIGJ1ZmZlcnMKKwktIGhhbmRsZSBkZXZpY2UgdW5wbHVnIGNhc2UKKwktIGhhbmRsZSB0ZW1wZXJhdHVyZSBhYm92ZSB0aHJlc2hvbGQKKwktIHVzZSBidXMgYWRkcmVzcyBpbnN0ZWFkIG9mIHBoeXNpY2FsIGFkZHJlc3MgZm9yIERNQQorCS0gc3VwcG9ydCBmb3Igc25hcHNob3QgbW9kZQogCS0gYXVkaXQgdXNlcnNwYWNlIGludGVyZmFjZXMKIAktIGdldCByZXNlcnZlZCBtYWpvci9taW5vciBpZiBuZWVkZWQKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCmluZGV4IDBlMTEzZjkuLmVjMzQzZWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCkBAIC0xMjYsOSArMTI2LDExIEBACiAjZGVmaW5lIEZQR0FfSU5UX1RYX0FDUV9ET05FCQkoMHgxIDw8IDEpCiAjZGVmaW5lIEZQR0FfSU5UX1JYX0FDUV9ET05FCQkoMHgxKQogCi0jZGVmaW5lIEZQR0FfUlhfQURDX0NUTF9SRUcJCTB4MjE0Ci0jZGVmaW5lIEZQR0FfUlhfQURDX0NUTF9DT05UX0NBUAkoMHgwKQotI2RlZmluZSBGUEdBX1JYX0FEQ19DVExfU05BUF9DQVAJKDB4MSkKKyNkZWZpbmUgRlBHQV9SWF9DVExfUkVHCQkJMHgyMTQKKyNkZWZpbmUgRlBHQV9SWF9DVExfRklGT19GTFVTSCAgICAgIAkoMHgxIDw8IDkpCisjZGVmaW5lIEZQR0FfUlhfQ1RMX1NZTlRIX0RBVEEJCSgweDEgPDwgOCkKKyNkZWZpbmUgRlBHQV9SWF9DVExfQ09OVF9DQVAJCSgweDAgPDwgMSkKKyNkZWZpbmUgRlBHQV9SWF9DVExfU05BUF9DQVAJCSgweDEgPDwgMSkKIAogI2RlZmluZSBGUEdBX1JYX0FSTV9SRUcJCQkweDIxQwogCkBAIC0yOTksNiArMzAxLDE0IEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoZGlyLCBTX0lSVVNSfFNfSVJHUlAsIHNob3dfZGlyZWN0aW9uLCBOVUxMKTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKHVuc2lnbmVkIGxvbmcgYnl0ZXMpCit7CisJaWYgKGJ5dGVzICUgUEFHRV9TSVpFID09IDApCisJCXJldHVybiBieXRlcyAvIFBBR0VfU0laRTsKKwllbHNlCisJCXJldHVybiAoYnl0ZXMgLyBQQUdFX1NJWkUpICsgMTsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19tbWFwX3NpemUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTMwOSwxMCArMzE5LDggQEAKIAl1bnNpZ25lZCBsb25nIGhlYWRlcl9wYWdlczsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX2dyb3VwX3BhZ2VzOwogCi0JLyogRklYTUU6IFdlIGRvIG5vdCBoYXZlIHRvIGFkZCAxLCBpZiBncm91cF9zaXplIGEgbXVsdGlwbGUgb2YKLQkgICBQQUdFX1NJWkUuICovCi0JZ3JvdXBfcGFnZXMgPSAoY2hhbm5lbC0+Z3JvdXBfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOwotCWhlYWRlcl9wYWdlcyA9IChjaGFubmVsLT5oZWFkZXJfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOworCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAJdG90YWxfZ3JvdXBfcGFnZXMgPSBncm91cF9wYWdlcyAqIGNoYW5uZWwtPmdyb3VwX2NvdW50OwogCiAJbW1hcF9zaXplID0gKGhlYWRlcl9wYWdlcyArIHRvdGFsX2dyb3VwX3BhZ2VzKSAqIFBBR0VfU0laRTsKQEAgLTM1MCw4ICszNTgsOCBAQAogCXVuc2lnbmVkIGxvbmcgZ3JvdXBfcGFnZXM7CiAJdW5zaWduZWQgbG9uZyBoZWFkZXJfcGFnZXM7CiAKLQlncm91cF9wYWdlcyA9IChjaGFubmVsLT5ncm91cF9zaXplIC8gUEFHRV9TSVpFKSArIDE7Ci0JaGVhZGVyX3BhZ2VzID0gKGNoYW5uZWwtPmhlYWRlcl9zaXplIC8gUEFHRV9TSVpFKSArIDE7CisJZ3JvdXBfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+Z3JvdXBfc2l6ZSk7CisJaGVhZGVyX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmhlYWRlcl9zaXplKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5ncm91cF9jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBwb2NoX2dyb3VwX2luZm8gKmdyb3VwOwpAQCAtMzg0LDE4ICszOTIsNDUgQEAKIAkJZ3JvdXAtPnVzZXJfb2Zmc2V0ID0KIAkJCShoZWFkZXJfcGFnZXMgKyAoaSAqIGdyb3VwX3BhZ2VzKSkgKiBQQUdFX1NJWkU7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVsZDogdXNlcl9vZmZzZXQ6IDB4JWx4IGRtYTogMHgleFxuIiwgaSwKLQkJICAgICAgIGdyb3VwLT51c2VyX29mZnNldCwgZ3JvdXAtPmRtYV9hZGRyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVsZDogdXNlcl9vZmZzZXQ6IDB4JWx4XG4iLCBpLAorCQkgICAgICAgZ3JvdXAtPnVzZXJfb2Zmc2V0KTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2hhbm5lbF9sYXRjaF9hdHRyKHN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWwpCitzdGF0aWMgaW50IGNoYW5uZWxfbGF0Y2hfYXR0cihzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsKQogewogCWNoYW5uZWwtPmdyb3VwX2NvdW50ID0gYXRvbWljX3JlYWQoJmNoYW5uZWwtPnN5c19ncm91cF9jb3VudCk7CiAJY2hhbm5lbC0+Z3JvdXBfc2l6ZSA9IGF0b21pY19yZWFkKCZjaGFubmVsLT5zeXNfZ3JvdXBfc2l6ZSk7CiAJY2hhbm5lbC0+YmxvY2tfc2l6ZSA9IGF0b21pY19yZWFkKCZjaGFubmVsLT5zeXNfYmxvY2tfc2l6ZSk7CisKKwlpZiAoY2hhbm5lbC0+Z3JvdXBfY291bnQgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnZhbGlkIGdyb3VwIGNvdW50ICVsdSIsCisJCSAgICAgICBjaGFubmVsLT5ncm91cF9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFubmVsLT5ncm91cF9zaXplID09IDAgfHwKKwkgICAgY2hhbm5lbC0+Z3JvdXBfc2l6ZSA8IGNoYW5uZWwtPmJsb2NrX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCBncm91cCBzaXplICVsdSIsCisJCSAgICAgICBjaGFubmVsLT5ncm91cF9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW5uZWwtPmJsb2NrX3NpemUgPT0gMCB8fCAoY2hhbm5lbC0+YmxvY2tfc2l6ZSAlIDgpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCBibG9jayBzaXplICVsdSIsCisJCSAgICAgICBjaGFubmVsLT5ibG9ja19zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW5uZWwtPmdyb3VwX3NpemUgJSBjaGFubmVsLT5ibG9ja19zaXplICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgImdyb3VwIHNpemUgc2hvdWxkIGJlIG11bHRpcGxlIG9mIGJsb2NrIHNpemUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC00MzIsNyArNDY3LDEwIEBACiAJfQogCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiYmxvY2tfc2l6ZSwgZ3JvdXBfc2l6ZSwgZ3JvdXBfY291bnRcbiIpOwotCWlvd3JpdGUzMihjaGFubmVsLT5ibG9ja19zaXplLCBmcGdhICsgYmxvY2tfc2l6ZV9yZWcpOworCS8qCisJICogQmxvY2sgc2l6ZSBpcyByZXByZXNlbnRlZCBpbiBuby4gb2YgNjQgYml0IHRyYW5zZmVycy4KKwkgKi8KKwlpb3dyaXRlMzIoY2hhbm5lbC0+YmxvY2tfc2l6ZSAvIDgsIGZwZ2EgKyBibG9ja19zaXplX3JlZyk7CiAJaW93cml0ZTMyKGNoYW5uZWwtPmdyb3VwX3NpemUgLyBjaGFubmVsLT5ibG9ja19zaXplLAogCQkgIGZwZ2EgKyBibG9ja19jb3VudF9yZWcpOwogCWlvd3JpdGUzMihjaGFubmVsLT5ncm91cF9jb3VudCwgZnBnYSArIGdyb3VwX2NvdW50X3JlZyk7CkBAIC00NDcsMjcgKzQ4NSwzMCBAQAogCS8qIFRoZSBETUEgYWRkcmVzcyBwYWdlIHJlZ2lzdGVyIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBSWCBhbmQKIAkgKiBUWCBjaGFubmVscywgc28gYWNxdWlyZSBsb2NrLgogCSAqLwotCXNwaW5fbG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewogCQlwYWdlID0gaSAvIDMyOwogCQlncm91cF9pbl9wYWdlID0gaSAlIDMyOwogCiAJCWdyb3VwX3JlZyA9IGdyb3VwX3JlZ3NfYmFzZSArIChncm91cF9pbl9wYWdlICogNCk7CiAKKwkJc3Bpbl9sb2NrKGNoYW5uZWwtPmlvbWVtX2xvY2spOwogCQlpb3dyaXRlMzIocGFnZSwgZnBnYSArIEZQR0FfRE1BX0FEUl9QQUdFX1JFRyk7CiAJCWlvd3JpdGUzMihjaGFubmVsLT5ncm91cHNbaV0uZG1hX2FkZHIsIGZwZ2EgKyBncm91cF9yZWcpOworCQlzcGluX3VubG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAl9CisKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewogCQlwYWdlID0gaSAvIDMyOwogCQlncm91cF9pbl9wYWdlID0gaSAlIDMyOwogCiAJCWdyb3VwX3JlZyA9IGdyb3VwX3JlZ3NfYmFzZSArIChncm91cF9pbl9wYWdlICogNCk7CiAKKwkJc3Bpbl9sb2NrKGNoYW5uZWwtPmlvbWVtX2xvY2spOwogCQlpb3dyaXRlMzIocGFnZSwgZnBnYSArIEZQR0FfRE1BX0FEUl9QQUdFX1JFRyk7CiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlbGQ6IHJlYWQgZG1hX2FkZHI6IDB4JXhcbiIsIGksCiAJCSAgICAgICBpb3JlYWQzMihmcGdhICsgZ3JvdXBfcmVnKSk7CisJCXNwaW5fdW5sb2NrKGNoYW5uZWwtPmlvbWVtX2xvY2spOwogCX0KLQlzcGluX3VubG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAogfQogCkBAIC01MzgsNyArNTc5LDkgQEAKIAogCXByaW50ayhLRVJOX1dBUk5JTkcgImNoYW5uZWxfbGF0Y2hfYXR0clxuIik7CiAKLQljaGFubmVsX2xhdGNoX2F0dHIoY2hhbm5lbCk7CisJcmV0ID0gY2hhbm5lbF9sYXRjaF9hdHRyKGNoYW5uZWwpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBvdXQ7CiAKIAljaGFubmVsLT50cmFuc2ZlciA9IDA7CiAKQEAgLTc4MSw2ICs4MjQsMTEgQEAKIAkJaW93cml0ZTMyKEZQR0FfVFhfQ1RMX0ZJRk9fRkxVU0gKIAkJCSAgfCBGUEdBX1RYX0NUTF9PVVRQVVRfQ0FSREJVUywKIAkJCSAgZnBnYSArIEZQR0FfVFhfQ1RMX1JFRyk7CisJfSBlbHNlIHsKKwkJLyogRmx1c2ggUlggRklGTyBhbmQgb3V0cHV0IGRhdGEgdG8gY2FyZGJ1cy4gKi8KKwkJaW93cml0ZTMyKEZQR0FfUlhfQ1RMX0NPTlRfQ0FQCisJCQkgIHwgRlBHQV9SWF9DVExfRklGT19GTFVTSCwKKwkJCSAgZnBnYSArIEZQR0FfUlhfQ1RMX1JFRyk7CiAJfQogCiAJYXRvbWljX2luYygmY2hhbm5lbC0+aW5pdGVkKTsKQEAgLTg0Nyw4ICs4OTUsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlncm91cF9wYWdlcyA9IChjaGFubmVsLT5ncm91cF9zaXplIC8gUEFHRV9TSVpFKSArIDE7Ci0JaGVhZGVyX3BhZ2VzID0gKGNoYW5uZWwtPmhlYWRlcl9zaXplIC8gUEFHRV9TSVpFKSArIDE7CisJZ3JvdXBfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+Z3JvdXBfc2l6ZSk7CisJaGVhZGVyX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmhlYWRlcl9zaXplKTsKIAl0b3RhbF9ncm91cF9wYWdlcyA9IGdyb3VwX3BhZ2VzICogY2hhbm5lbC0+Z3JvdXBfY291bnQ7CiAKIAlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwpAQCAtOTAzLDE0ICs5NTEsNyBAQAogCXNwaW5fbG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewotCQlpZiAoY2hhbm5lbC0+ZGlyID09IENIQU5ORUxfRElSX1JYCi0JCSAgICAmJiBjaGFubmVsLT5oZWFkZXItPmdyb3VwX29mZnNldHNbaV0gPT0gLTEpIHsKLQkJCXNwaW5fdW5sb2NrX2lycSgmY2hhbm5lbC0+Z3JvdXBfb2Zmc2V0c19sb2NrKTsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJaWYgKGNoYW5uZWwtPmRpciA9PSBDSEFOTkVMX0RJUl9UWAotCQkgICAgJiYgY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9vZmZzZXRzW2ldICE9IC0xKSB7CisJCWlmIChjaGFubmVsLT5oZWFkZXItPmdyb3VwX29mZnNldHNbaV0gIT0gLTEpIHsKIAkJCXNwaW5fdW5sb2NrX2lycSgmY2hhbm5lbC0+Z3JvdXBfb2Zmc2V0c19sb2NrKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xMDU4LDEwICsxMDk5LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBncm91cHNfZG9uZTsgaSsrKSB7CiAJCWogPSAocHJldl90cmFuc2ZlciArIGkpICUgY2hhbm5lbC0+Z3JvdXBfY291bnQ7Ci0JCWlmIChjaGFubmVsLT5kaXIgPT0gQ0hBTk5FTF9ESVJfUlgpCi0JCQlncm91cF9vZmZzZXRzW2pdID0gLTE7Ci0JCWVsc2UKLQkJCWdyb3VwX29mZnNldHNbal0gPSBncm91cHNbal0udXNlcl9vZmZzZXQ7CisJCWdyb3VwX29mZnNldHNbal0gPSBncm91cHNbal0udXNlcl9vZmZzZXQ7CiAJfQogCiAJc3Bpbl91bmxvY2soJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CkBAIC0xMjgzLDcgKzEzMjEsNyBAQAogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcG9jaF9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCi0JCQkgIGRldi0+YnVzX2lkLCBwb2NoX2Rldik7CisJCQkgIGRldl9uYW1lKGRldiksIHBvY2hfZGV2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiZXJyb3IgcmVxdWVzdGluZyBJUlEgJXVcbiIsIHBkZXYtPmlycSk7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xMzUwLDEyICsxMzg4LDEyIEBACiAJdW5zaWduZWQgaW50IG1pbm9yID0gTUlOT1IocG9jaF9kZXYtPmNkZXYuZGV2KTsKIAl1bnNpZ25lZCBpbnQgaWQgPSBtaW5vciAvIHBvY2hfZGV2LT5uY2hhbm5lbHM7CiAKLQkvKiBGSVhNRTogdW5tYXAgZnBnYV9pb21lbSBhbmQgYnJpZGdlX2lvbWVtICovCi0KIAlwb2NoX2NsYXNzX2Rldl91bnJlZ2lzdGVyKHBvY2hfZGV2LCBpZCk7CiAJY2Rldl9kZWwoJnBvY2hfZGV2LT5jZGV2KTsKIAlpZHJfcmVtb3ZlKCZwb2NoX2lkcywgaWQpOwogCWZyZWVfaXJxKHBkZXYtPmlycSwgcG9jaF9kZXYpOworCWlvdW5tYXAocG9jaF9kZXYtPmZwZ2FfaW9tZW0pOworCWlvdW5tYXAocG9jaF9kZXYtPmJyaWRnZV9pb21lbSk7CiAJdWlvX3VucmVnaXN0ZXJfZGV2aWNlKHVpbyk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI1ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvS2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKK2NvbmZpZyBVU0JfUlNQSQorCXRyaXN0YXRlICJQcmluY2V0b24gSW5zdHJ1bWVudHMgVVNCIGNhbWVyYSBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVVNCICYmIEJST0tFTgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgUHJpbmNldG9uIEluc3RydW1lbnRzIFVTQiBjYW1lcmEgZGV2aWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdhZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX1VTQl9SU1BJKQkJKz0gcnNwaXVzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYzMzZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvVE9ETwpAQCAtMCwwICsxLDIyIEBACitUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFByaW5jZXRvbiBJbnN0cnVtZW50cyBVU0IgY2FtZXJhLgorCitJdCBuZWVkcyBsb3RzIG9mIHdvcmsgdG8gZ2V0IGl0IGludG8gdGhlIG1haW4gZHJpdmVycy91c2IvIHN1YmRpcmVjdG9yeToKKworQW55IHBhdGNoZXMgdG8gZG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhbmdlcyBhcmUgZ3JlYXRseSBhcHByZWNpYXRlZDoKKworCS0gbWFrZSBjaGVja3BhdGNoLnBsIGNsZWFuCisJLSBjb2Rpbmcgc3R5bGUgZml4dXBzICh0eXBlZGVmcywgZXRjLikKKwktIGdldCBpdCB0byBidWlsZCBwcm9wZXJseQorCS0gYXVkaXQgaW9jdGxzCisJLSByZW1vdmUgaW9jdGxzIGlmIHBvc3NpYmxlCisJLSBhc3NpZ24gcHJvcGVyIG1pbm9yIG51bWJlcgorCS0gcmVtb3ZlIGRiZygpIG1hY3JvCisJLSBsb3RzIG9mIGdlbmVyYWwgY2xlYW51cHMKKwktIHJldmlldyBsb2NraW5nCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG86CisJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KK2FuZCBDQzoKKwlKdWRkIE1vbnRnb21lcnkgPGp1ZGRAanBpbG90Lm9yZz4KKwlKZWZmIEZyb250eiA8amVmZi5mcm9udHpAZ21haWwuY29tPgorYXMgdGhleSBoYXZlIHRoaXMgZGV2aWNlIGFuZCBjYW4gdGVzdCBhbnkgbmVlZGVkIGNoYW5nZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyODFkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL3JzcGl1c2IuYwpAQCAtMCwwICsxLDg4NyBAQAorLyoKKyAqIHJzcGl1c2IuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBQcmluY2V0b24gSW5zdHJ1bWVudHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlICJyc3BpdXNiLmgiCisKKyNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCitzdGF0aWMgaW50IGRlYnVnID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGRlYnVnOworI2VuZGlmCisvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KKyN1bmRlZiBkYmcKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisKKy8qIFZlcnNpb24gSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIlYxLjAuMSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgIlByaW5jZXRvbiBJbnN0cnVtZW50cyIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgICAgIlBJIFVTQjIuMCBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCIKKworLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZXMgKi8KKyNkZWZpbmUgVkVORE9SX0lEICAgMHgwQkQ3CisjZGVmaW5lIFNUMTMzX1BJRCAgIDB4QTAxMAorI2RlZmluZSBQSVhJU19QSUQgICAweEEwMjYKKworLyogR2V0IGEgbWlub3IgcmFuZ2UgZm9yIHlvdXIgZGV2aWNlcyBmcm9tIHRoZSB1c2IgbWFpbnRhaW5lciAqLworI2lmZGVmIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMKKyNkZWZpbmUgUElVU0JfTUlOT1JfQkFTRSAgICAwCisjZWxzZQorI2RlZmluZSBQSVVTQl9NSU5PUl9CQVNFICAgIDE5MgorI2VuZGlmCisKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoZGlzY29ubmVjdF9zZW0pOworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZiAqLworc3RydWN0IGRldmljZV9leHRlbnNpb24geworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkvKiBzYXZlIG9mZiB0aGUgdXNiIGRldmljZSBwb2ludGVyICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsJLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwl1bnNpZ25lZCBjaGFyIG1pbm9yOwkvKiB0aGUgc3RhcnRpbmcgbWlub3IgbnVtYmVyIGZvciB0aGlzIGRldmljZSAqLworCXNpemVfdCBidWxrX2luX3NpemVfcmV0dXJuZWQ7CisJaW50IGJ1bGtfaW5fYnl0ZV90cms7CisJc3RydWN0IHVyYiAqKipQaXhlbFVyYjsKKwlpbnQgZnJhbWVJZHg7CisJaW50IHVyYklkeDsKKwl1bnNpZ25lZCBpbnQgKm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQ7CisJaW50IG9wZW47CQkvKiBpZiB0aGUgcG9ydCBpcyBvcGVuIG9yIG5vdCAqLworCWludCBwcmVzZW50OwkJLyogaWYgdGhlIGRldmljZSBpcyBub3QgZGlzY29ubmVjdGVkICovCisJaW50IHVzZXJCdWZNYXBwZWQ7CS8qIGhhcyB0aGUgdXNlciBidWZmZXIgYmVlbiBtYXBwZWQ/ICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICoqc2dsOwkvKiBzY2F0dGVyLWdhdGhlciBsaXN0IGZvciB1c2VyIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCAqc2dFbnRyaWVzOworCXN0cnVjdCBrcmVmIGtyZWY7CisJaW50IGdvdFBpeGVsRGF0YTsKKwlpbnQgcGVuZGluZ1dyaXRlOworCWNoYXIgKipwZW5kZWRQaXhlbFVyYnM7CisJaW50IGlhbWE7CQkvKlBJWElTIG9yIFNUMTMzICovCisJaW50IG51bV9mcmFtZXM7CQkvKiB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IHdpbGwgZml0IGluIHRoZSB1c2VyIGJ1ZmZlciAqLworCWludCBhY3RpdmVfZnJhbWU7CisJdW5zaWduZWQgbG9uZyBmcmFtZVNpemU7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJLy9GWDIgc3BlY2lmaWMgZW5kcG9pbnRzCisJdW5zaWduZWQgaW50IGhFUFs4XTsKK307CisjZGVmaW5lIHRvX3BpX2RldihkKSBjb250YWluZXJfb2YoIGQsIHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uLCBrcmVmICkKKworc3RhdGljIGludCBNYXBVc2VyQnVmZmVyKHN0cnVjdCBpb2N0bF9zdHJ1Y3QgKiwgc3RydWN0IGRldmljZV9leHRlbnNpb24gKik7CitzdGF0aWMgaW50IFVuTWFwVXNlckJ1ZmZlcihzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqKTsKK3N0YXRpYyBpbnQgcGl1c2JfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHBpdXNiX291dHB1dChzdHJ1Y3QgaW9jdGxfc3RydWN0ICosIHVuc2lnbmVkIGNoYXIgKiwgaW50LCBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqKTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwaXVzYl9kcml2ZXI7CisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwaV9kZXZpY2VfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRShWRU5ET1JfSUQsIFNUMTMzX1BJRCl9LAorCXtVU0JfREVWSUNFKFZFTkRPUl9JRCwgUElYSVNfUElEKX0sCisJezAsIH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHBpX2RldmljZV90YWJsZSk7CisKK3N0YXRpYyBpbnQgbGFzdEVyciA9IDA7CitzdGF0aWMgaW50IGVyckNudCA9IDA7CisKK3N0YXRpYyB2b2lkIHBpdXNiX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ID0gdG9fcGlfZGV2KGtyZWYpOworCisJZGV2X2RiZygmcGR4LT51ZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCXVzYl9wdXRfZGV2KHBkeC0+dWRldik7CisJa2ZyZWUocGR4KTsKK30KKworc3RhdGljIGludCBwaXVzYl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHggPSBOVUxMOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJaW50IHN1Ym1pbm9yOworCWludCByZXR2YWwgPSAwOworCisJZGJnKCJQaXVzYl9PcGVuKCkiKTsKKwlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZwaXVzYl9kcml2ZXIsIHN1Ym1pbm9yKTsKKwlpZiAoIWludGVyZmFjZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9ub19kZXZpY2U7CisJfQorCisJcGR4ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWlmICghcGR4KSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9ub19kZXZpY2U7CisJfQorCWRiZygiQWx0ZXJuYXRlIFNldHRpbmcgPSAlZCIsIGludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcpOworCisJcGR4LT5mcmFtZUlkeCA9IHBkeC0+dXJiSWR4ID0gMDsKKwlwZHgtPmdvdFBpeGVsRGF0YSA9IDA7CisJcGR4LT5wZW5kaW5nV3JpdGUgPSAwOworCXBkeC0+ZnJhbWVTaXplID0gMDsKKwlwZHgtPm51bV9mcmFtZXMgPSAwOworCXBkeC0+YWN0aXZlX2ZyYW1lID0gMDsKKwlwZHgtPmJ1bGtfaW5fYnl0ZV90cmsgPSAwOworCXBkeC0+dXNlckJ1Zk1hcHBlZCA9IDA7CisJcGR4LT5wZW5kZWRQaXhlbFVyYnMgPSBOVUxMOworCXBkeC0+c2dFbnRyaWVzID0gTlVMTDsKKwlwZHgtPnNnbCA9IE5VTEw7CisJcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkID0gTlVMTDsKKwlwZHgtPlBpeGVsVXJiID0gTlVMTDsKKwlwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZCA9IDA7CisJLyogaW5jcmVtZW50IG91ciB1c2FnZSBjb3VudCBmb3IgdGhlIGRldmljZSAqLworCWtyZWZfZ2V0KCZwZHgtPmtyZWYpOworCS8qIHNhdmUgb3VyIG9iamVjdCBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGR4OworICAgICAgZXhpdF9ub19kZXZpY2U6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBwaXVzYl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHg7CisJaW50IHJldHZhbCA9IDA7CisKKwlkYmcoIlBpdXNiX1JlbGVhc2UoKSIpOworCXBkeCA9IChzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAocGR4ID09IE5VTEwpIHsKKwkJZGJnKCIlcyAtIG9iamVjdCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogZGVjcmVtZW50IHRoZSBjb3VudCBvbiBvdXIgZGV2aWNlICovCisJa3JlZl9wdXQoJnBkeC0+a3JlZiwgcGl1c2JfZGVsZXRlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXBpdXNiX2lvY3RsCisgKi8KK3N0YXRpYyBpbnQgcGl1c2JfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4OworCWNoYXIgZHVtbXlDdGxCdWZbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCXVuc2lnbmVkIGxvbmcgZGV2UkIgPSAwOworCWludCBpID0gMDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgaW9jdGxfc3RydWN0IGN0cmw7CisJdW5zaWduZWQgY2hhciAqdUJ1ZjsKKwlpbnQgbnVtYnl0ZXMgPSAwOworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xEYXRhID0gMDsKKworCXBkeCA9IChzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoIXBkeC0+cHJlc2VudCkgeworCQlkYmcoIk5vIERldmljZSBQcmVzZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIGZpbGwgaW4geW91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgaGVyZSAqLworCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQorCQllcnIgPSAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSk7CisJZWxzZSBpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpCisJCWVyciA9ICFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGR4LT51ZGV2LT5kZXYsICJyZXR1cm4gd2l0aCBlcnJvciA9ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBJVVNCX0dFVFZORENNRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCWluZm8oImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisJCWRiZygiJXMgJXhcbiIsICJHZXQgVmVuZG9yIENvbW1hbmQgPSAiLCBjdHJsLmNtZCk7CisJCXJldHZhbCA9CisJCSAgICB1c2JfY29udHJvbF9tc2cocGR4LT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUocGR4LT51ZGV2LCAwKSwKKwkJCQkgICAgY3RybC5jbWQsIFVTQl9ESVJfSU4sIDAsIDAsICZkZXZSQiwKKwkJCQkgICAgY3RybC5udW1ieXRlcywgSFogKiAxMCk7CisJCWlmIChjdHJsLmNtZCA9PSAweEYxKSB7CisJCQlkYmcoIkZXIFZlcnNpb24gcmV0dXJuZWQgZnJvbSBIVyA9ICVsZC4lbGQiLAorCQkJICAgIChkZXZSQiA+PiA4KSwgKGRldlJCICYgMHhGRikpOworCQl9CisJCXJldHVybiBkZXZSQjsKKwljYXNlIFBJVVNCX1NFVFZORENNRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCWluZm8oImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisvLyAgICAgICAgICAgIGRiZyggIiVzICV4IiwgIlNldCBWZW5kb3IgQ29tbWFuZCA9ICIsY3RybC5jbWQgKTsKKwkJY29udHJvbERhdGEgPSBjdHJsLnBEYXRhWzBdOworCQljb250cm9sRGF0YSB8PSAoY3RybC5wRGF0YVsxXSA8PCA4KTsKKy8vICAgICAgICAgICAgZGJnKCAiJXMgJWQiLCAiVmVuZG9yIERhdGEgPSIsY29udHJvbERhdGEgKTsKKwkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHBkeC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKHBkeC0+dWRldiwgMCksIGN0cmwuY21kLCAoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IpLAkvKiB8IFVTQl9SRUNJUF9FTkRQT0lOVCksICovCisJCQkJCSBjb250cm9sRGF0YSwKKwkJCQkJIDAsCisJCQkJCSAmZHVtbXlDdGxCdWYsIGN0cmwubnVtYnl0ZXMsIEhaICogMTApOworCQlyZXR1cm4gcmV0dmFsOworCQlicmVhazsKKwljYXNlIFBJVVNCX0lTSElHSFNQRUVEOgorCQlyZXR1cm4gKChwZHgtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSA/IDEgOiAwKTsKKwkJYnJlYWs7CisJY2FzZSBQSVVTQl9XUklURVBJUEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY3RybCwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBXUklURV9EVU1NWSBmYWlsZWRcbiIpOworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY3RybC5wRGF0YSwgY3RybC5udW1ieXRlcykpIHsKKwkJCWRiZygiY2FuJ3QgYWNjZXNzIHBEYXRhIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwaXVzYl9vdXRwdXQoJmN0cmwsIGN0cmwucERhdGEgLyp1QnVmICovICwgY3RybC5udW1ieXRlcywgcGR4KTsKKwkJcmV0dXJuIGN0cmwubnVtYnl0ZXM7CisJCWJyZWFrOworCWNhc2UgUElVU0JfVVNFUkJVRkZFUjoKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCWluZm8oImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisJCXJldHVybiBNYXBVc2VyQnVmZmVyKChzdHJ1Y3QgaW9jdGxfc3RydWN0ICopICYgY3RybCwgcGR4KTsKKwkJYnJlYWs7CisJY2FzZSBQSVVTQl9VTk1BUF9VU0VSQlVGRkVSOgorCQlVbk1hcFVzZXJCdWZmZXIocGR4KTsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgUElVU0JfUkVBRFBJUEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlzd2l0Y2ggKGN0cmwuZW5kcG9pbnQpIHsKKwkJY2FzZSAwOgkvL1NUMTMzIFBpeGVsIERhdGEgb3IgUElYSVMgSU8KKwkJCWlmIChwZHgtPmlhbWEgPT0gUElYSVNfUElEKSB7CisJCQkJdW5zaWduZWQgaW50IG51bVRvUmVhZCA9IDA7CisJCQkJdW5zaWduZWQgaW50IHRvdGFsUmVhZCA9IDA7CisJCQkJdUJ1ZiA9IGttYWxsb2MoY3RybC5udW1ieXRlcywgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCF1QnVmKSB7CisJCQkJCWRiZygiQWxsb2MgZm9yIHVCdWYgZmFpbGVkIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQludW1ieXRlcyA9IGN0cmwubnVtYnl0ZXM7CisJCQkJbnVtVG9SZWFkID0gbnVtYnl0ZXM7CisJCQkJZGJnKCJudW1ieXRlcyB0byByZWFkID0gJWQiLCBudW1ieXRlcyk7CisJCQkJZGJnKCJlbmRwb2ludCAjICVkIiwgY3RybC5lbmRwb2ludCk7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHVCdWYsIGN0cmwucERhdGEsIG51bWJ5dGVzKSkKKwkJCQkJZGJnKCJjb3B5aW5nIGN0cmwucERhdGEgdG8gZHVtbXlCdWYgZmFpbGVkIik7CisJCQkJZG8geworCQkJCQlpID0gdXNiX2J1bGtfbXNnKHBkeC0+dWRldiwgcGR4LT5oRVBbY3RybC5lbmRwb2ludF0sICh1QnVmICsgdG90YWxSZWFkKSwgKG51bVRvUmVhZCA+IDY0KSA/IDY0IDogbnVtVG9SZWFkLCAmbnVtYnl0ZXMsIEhaICogMTApOwkvL0VQMCBjYW4gb25seSBoYW5kbGUgNjQgYnl0ZXMgYXQgYSB0aW1lCisJCQkJCWlmIChpKSB7CisJCQkJCQlkYmcoIkNNRCA9ICVzLCBBZGRyZXNzID0gMHglMDJYIiwgKCh1QnVmWzNdID09IDB4MDIpID8gIldSSVRFIiA6ICJSRUFEIiksIHVCdWZbMV0pOworCQkJCQkJZGJnKCJOdW1iZXIgb2YgYnl0ZXMgQXR0ZW1wdGVkIHRvIHJlYWQgPSAlZCIsIChpbnQpY3RybC5udW1ieXRlcyk7CisJCQkJCQlkYmcoIkJsb2NraW5nIFJlYWRJL08gRmFpbGVkIHdpdGggc3RhdHVzICVkIiwgaSk7CisJCQkJCQlrZnJlZSh1QnVmKTsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWRiZygiUGl4aXMgRVAwIFJlYWQgJWQgYnl0ZXMiLAorCQkJCQkJICAgIG51bWJ5dGVzKTsKKwkJCQkJCXRvdGFsUmVhZCArPSBudW1ieXRlczsKKwkJCQkJCW51bVRvUmVhZCAtPSBudW1ieXRlczsKKwkJCQkJfQorCQkJCX0KKwkJCQl3aGlsZSAobnVtVG9SZWFkKTsKKwkJCQltZW1jcHkoY3RybC5wRGF0YSwgdUJ1ZiwgdG90YWxSZWFkKTsKKwkJCQlkYmcoIlRvdGFsIEJ5dGVzIFJlYWQgZnJvbSBQSVhJUyBFUDAgPSAlZCIsCisJCQkJICAgIHRvdGFsUmVhZCk7CisJCQkJY3RybC5udW1ieXRlcyA9IHRvdGFsUmVhZDsKKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgICgoc3RydWN0IGlvY3RsX3N0cnVjdCAqKSBhcmcsICZjdHJsLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCQkJZGJnKCJjb3B5X3RvX3VzZXIgZmFpbGVkIGluIElPUkIiKTsKKwkJCQlrZnJlZSh1QnVmKTsKKwkJCQlyZXR1cm4gY3RybC5udW1ieXRlczsKKwkJCX0gZWxzZQkvL1NUMTMzIFBpeGVsIERhdGEKKwkJCXsKKwkJCQlpZiAoIXBkeC0+Z290UGl4ZWxEYXRhKQorCQkJCQlyZXR1cm4gMDsKKwkJCQllbHNlIHsKKwkJCQkJcGR4LT5nb3RQaXhlbERhdGEgPSAwOworCQkJCQljdHJsLm51bWJ5dGVzID0KKwkJCQkJICAgIHBkeC0+YnVsa19pbl9zaXplX3JldHVybmVkOworCQkJCQlwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZCAtPQorCQkJCQkgICAgcGR4LT5mcmFtZVNpemU7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbcGR4LT5hY3RpdmVfZnJhbWVdOyBpKyspCisJCQkJCQlTZXRQYWdlRGlydHkocGR4LT5zZ2xbcGR4LT5hY3RpdmVfZnJhbWVdW2ldLnBhZ2VfbGluayk7CisJCQkJCXBkeC0+YWN0aXZlX2ZyYW1lID0KKwkJCQkJICAgICgocGR4LT5hY3RpdmVfZnJhbWUgKworCQkJCQkgICAgICAxKSAlIHBkeC0+bnVtX2ZyYW1lcyk7CisJCQkJCXJldHVybiBjdHJsLm51bWJ5dGVzOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CS8vU1QxMzNJTworCQljYXNlIDQ6CS8vUElYSVMgSU8KKwkJCXVCdWYgPSBrbWFsbG9jKGN0cmwubnVtYnl0ZXMsIEdGUF9LRVJORUwpOworCQkJaWYgKCF1QnVmKSB7CisJCQkJZGJnKCJBbGxvYyBmb3IgdUJ1ZiBmYWlsZWQiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW51bWJ5dGVzID0gY3RybC5udW1ieXRlczsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmcoICJudW1ieXRlcyB0byByZWFkID0gJWQiLCBudW1ieXRlcyApOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHVCdWYsIGN0cmwucERhdGEsIG51bWJ5dGVzKSkKKwkJCQlkYmcoImNvcHlpbmcgY3RybC5wRGF0YSB0byBkdW1teUJ1ZiBmYWlsZWQiKTsKKwkJCWkgPSB1c2JfYnVsa19tc2cocGR4LT51ZGV2LCBwZHgtPmhFUFtjdHJsLmVuZHBvaW50XSwKKwkJCQkJIHVCdWYsIG51bWJ5dGVzLCAmbnVtYnl0ZXMsIEhaICogMTApOworCQkJaWYgKGkpIHsKKwkJCQlkYmcoIkJsb2NraW5nIFJlYWRJL08gRmFpbGVkIHdpdGggc3RhdHVzICVkIiwKKwkJCQkgICAgaSk7CisJCQkJa2ZyZWUodUJ1Zik7CisJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIHsKKwkJCQljdHJsLm51bWJ5dGVzID0gbnVtYnl0ZXM7CisJCQkJbWVtY3B5KGN0cmwucERhdGEsIHVCdWYsIG51bWJ5dGVzKTsKKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgICgoc3RydWN0IGlvY3RsX3N0cnVjdCAqKSBhcmcsICZjdHJsLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCQkJZGJnKCJjb3B5X3RvX3VzZXIgZmFpbGVkIGluIElPUkIiKTsKKwkJCQlrZnJlZSh1QnVmKTsKKwkJCQlyZXR1cm4gY3RybC5udW1ieXRlczsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMjoJLy9QSVhJUyBQaW5nCisJCWNhc2UgMzoJLy9QSVhJUyBQb25nCisJCQlpZiAoIXBkeC0+Z290UGl4ZWxEYXRhKQorCQkJCXJldHVybiAwOworCQkJZWxzZSB7CisJCQkJcGR4LT5nb3RQaXhlbERhdGEgPSAwOworCQkJCWN0cmwubnVtYnl0ZXMgPSBwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZDsKKwkJCQlwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZCAtPSBwZHgtPmZyYW1lU2l6ZTsKKwkJCQlmb3IgKGkgPSAwOworCQkJCSAgICAgaSA8CisJCQkJICAgICBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbcGR4LT4KKwkJCQkJCQkJIGFjdGl2ZV9mcmFtZV07CisJCQkJICAgICBpKyspCisJCQkJCVNldFBhZ2VEaXJ0eShwZHgtPnNnbFtwZHgtPmFjdGl2ZV9mcmFtZV1baV0ucGFnZV9saW5rKTsKKwkJCQlwZHgtPmFjdGl2ZV9mcmFtZSA9CisJCQkJICAgICgocGR4LT5hY3RpdmVfZnJhbWUgKyAxKSAlIHBkeC0+bnVtX2ZyYW1lcyk7CisJCQkJcmV0dXJuIGN0cmwubnVtYnl0ZXM7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFBJVVNCX1dIQVRDQU1FUkE6CisJCXJldHVybiBwZHgtPmlhbWE7CisJY2FzZSBQSVVTQl9TRVRGUkFNRVNJWkU6CisJCWRiZygiUElVU0JfU0VURlJBTUVTSVpFIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlwZHgtPmZyYW1lU2l6ZSA9IGN0cmwubnVtYnl0ZXM7CisJCXBkeC0+bnVtX2ZyYW1lcyA9IGN0cmwubnVtRnJhbWVzOworCQlpZiAoIXBkeC0+c2dsKQorCQkJcGR4LT5zZ2wgPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCAqKSAqCisJCQkJICAgIHBkeC0+bnVtX2ZyYW1lcywgR0ZQX0tFUk5FTCk7CisJCWlmICghcGR4LT5zZ0VudHJpZXMpCisJCQlwZHgtPnNnRW50cmllcyA9CisJCQkgICAga21hbGxvYyhzaXplb2YodW5zaWduZWQgaW50KSAqIHBkeC0+bnVtX2ZyYW1lcywKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcGR4LT5QaXhlbFVyYikKKwkJCXBkeC0+UGl4ZWxVcmIgPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1cmIgKiopICogcGR4LT5udW1fZnJhbWVzLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQpCisJCQlwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQgPQorCQkJICAgIHZtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBwZHgtPm51bV9mcmFtZXMpOworCQlpZiAoIXBkeC0+cGVuZGVkUGl4ZWxVcmJzKQorCQkJcGR4LT5wZW5kZWRQaXhlbFVyYnMgPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBwZHgtPm51bV9mcmFtZXMsCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlkYmcoIiVzXG4iLCAiTm8gSU9DVEwgZm91bmQiKTsKKwkJYnJlYWs7CisKKwl9CisJLyogcmV0dXJuIHRoYXQgd2UgZGlkIG5vdCB1bmRlcnN0YW5kIHRoaXMgaW9jdGwgY2FsbCAqLworCWRiZygiUmV0dXJuaW5nIC1FTk9UVFkiKTsKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIHZvaWQgcGl1c2Jfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmIChzdGF0dXMgJiYgIShzdGF0dXMgPT0gLUVOT0VOVCB8fCBzdGF0dXMgPT0gLUVDT05OUkVTRVQpKQorCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LAorCQkJIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkJX19mdW5jX18sIHN0YXR1cyk7CisKKwlwZHgtPnBlbmRpbmdXcml0ZSA9IDA7CisJdXNiX2J1ZmZlcl9mcmVlKHVyYi0+ZGV2LCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT50cmFuc2Zlcl9kbWEpOworfQorCitpbnQgcGl1c2Jfb3V0cHV0KHN0cnVjdCBpb2N0bF9zdHJ1Y3QgKiBpbywgdW5zaWduZWQgY2hhciAqdUJ1ZiwgaW50IGxlbiwKKwkJIHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHgpCit7CisJc3RydWN0IHVyYiAqdXJiID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBjaGFyICprYnVmID0gTlVMTDsKKworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVyYiAhPSBOVUxMKSB7CisJCWtidWYgPQorCQkgICAgdXNiX2J1ZmZlcl9hbGxvYyhwZHgtPnVkZXYsIGxlbiwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgICZ1cmItPnRyYW5zZmVyX2RtYSk7CisJCWlmICgha2J1ZikgeworCQkJaW5mbygiYnVmZmVyX2FsbG9jIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1jcHkoa2J1ZiwgdUJ1ZiwgbGVuKTsKKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwZHgtPnVkZXYsIHBkeC0+aEVQW2lvLT5lbmRwb2ludF0sIGtidWYsCisJCQkJICBsZW4sIHBpdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2ssIHBkeCk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkeC0+dWRldi0+ZGV2LAorCQkJCSJXUklURSBFUlJPUjpzdWJtaXQgdXJiIGVycm9yID0gJWRcbiIsIGVycik7CisJCX0KKwkJcGR4LT5wZW5kaW5nV3JpdGUgPSAxOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwl9CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBVbk1hcFVzZXJCdWZmZXIoc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IGsgPSAwOworCXVuc2lnbmVkIGludCBlcEFkZHI7CisJZm9yIChrID0gMDsgayA8IHBkeC0+bnVtX2ZyYW1lczsgaysrKSB7CisJCWRiZygiS2lsbGluZyBVcmJzIGZvciBGcmFtZSAlZCIsIGspOworCQlmb3IgKGkgPSAwOyBpIDwgcGR4LT5zZ0VudHJpZXNba107IGkrKykgeworCQkJdXNiX2tpbGxfdXJiKHBkeC0+UGl4ZWxVcmJba11baV0pOworCQkJdXNiX2ZyZWVfdXJiKHBkeC0+UGl4ZWxVcmJba11baV0pOworCQkJcGR4LT5wZW5kZWRQaXhlbFVyYnNba11baV0gPSAwOworCQl9CisJCWRiZygiVXJiIGVycm9yIGNvdW50ID0gJWQiLCBlcnJDbnQpOworCQllcnJDbnQgPSAwOworCQlkYmcoIlVyYnMgZnJlZSdkIGFuZCBLaWxsZWQgZm9yIEZyYW1lICVkIiwgayk7CisJfQorCisJZm9yIChrID0gMDsgayA8IHBkeC0+bnVtX2ZyYW1lczsgaysrKSB7CisJCWlmIChwZHgtPmlhbWEgPT0gUElYSVNfUElEKQkvL2lmIHNvLCB3aGljaCBFUCBzaG91bGQgd2UgbWFwIHRoaXMgZnJhbWUgdG8KKwkJeworCQkJaWYgKGsgJSAyKQkvL2NoZWNrIHRvIHNlZSBpZiB0aGlzIHNob3VsZCB1c2UgRVA0KFBPTkcpCisJCQl7CisJCQkJZXBBZGRyID0gcGR4LT5oRVBbM107CS8vUE9ORywgb2RkIGZyYW1lcworCQkJfSBlbHNlIHsKKwkJCQllcEFkZHIgPSBwZHgtPmhFUFsyXTsJLy9QSU5HLCBldmVuIGZyYW1lcyBhbmQgemVybworCQkJfQorCQl9IGVsc2UJCS8vU1QxMzMgb25seSBoYXMgMSBlbmRwb2ludCBmb3IgUGl4ZWwgZGF0YSB0cmFuc2ZlcgorCQl7CisJCQllcEFkZHIgPSBwZHgtPmhFUFswXTsKKwkJfQorCQl1c2JfYnVmZmVyX3VubWFwX3NnKHBkeC0+dWRldiwgZXBBZGRyLCBwZHgtPnNnbFtrXSwKKwkJCQkgICAgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2tdKTsKKwkJZm9yIChpID0gMDsgaSA8IHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtrXTsgaSsrKSB7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGR4LT5zZ2xba11baV0ucGFnZV9saW5rKTsKKwkJfQorCQlrZnJlZShwZHgtPnNnbFtrXSk7CisJCWtmcmVlKHBkeC0+UGl4ZWxVcmJba10pOworCQlrZnJlZShwZHgtPnBlbmRlZFBpeGVsVXJic1trXSk7CisJCXBkeC0+c2dsW2tdID0gTlVMTDsKKwkJcGR4LT5QaXhlbFVyYltrXSA9IE5VTEw7CisJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW2tdID0gTlVMTDsKKwl9CisJa2ZyZWUocGR4LT5zZ0VudHJpZXMpOworCXZmcmVlKHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZCk7CisJcGR4LT5zZ0VudHJpZXMgPSBOVUxMOworCXBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZCA9IE5VTEw7CisJa2ZyZWUocGR4LT5zZ2wpOworCWtmcmVlKHBkeC0+cGVuZGVkUGl4ZWxVcmJzKTsKKwlrZnJlZShwZHgtPlBpeGVsVXJiKTsKKwlwZHgtPnNnbCA9IE5VTEw7CisJcGR4LT5wZW5kZWRQaXhlbFVyYnMgPSBOVUxMOworCXBkeC0+UGl4ZWxVcmIgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwaXVzYl9yZWFkUElYRUxfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ID0gdXJiLT5jb250ZXh0OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKworCWlmIChzdGF0dXMgJiYgIShzdGF0dXMgPT0gLUVOT0VOVCB8fCBzdGF0dXMgPT0gLUVDT05OUkVTRVQpKSB7CisJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sCisJCSAgICBzdGF0dXMpOworCQlkYmcoIkVycm9yIGluIHJlYWQgRVAyIGNhbGxiYWNrIik7CisJCWRiZygiRnJhbWVJbmRleCA9ICVkIiwgcGR4LT5mcmFtZUlkeCk7CisJCWRiZygiQnl0ZXMgcmVjZWl2ZWQgYmVmb3JlIHByb2JsZW0gb2NjdXJyZWQgPSAlZCIsCisJCSAgICBwZHgtPmJ1bGtfaW5fYnl0ZV90cmspOworCQlkYmcoIlVyYiBJZHggPSAlZCIsIHBkeC0+dXJiSWR4KTsKKwkJcGR4LT5wZW5kZWRQaXhlbFVyYnNbcGR4LT5mcmFtZUlkeF1bcGR4LT51cmJJZHhdID0gMDsKKwl9IGVsc2UgeworCQlwZHgtPmJ1bGtfaW5fYnl0ZV90cmsgKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCQl7CisJCQlpID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsJLy9yZXN1Ym1pdCB0aGUgVVJCCisJCQlpZiAoaSkgeworCQkJCWVyckNudCsrOworCQkJCWlmIChpICE9IGxhc3RFcnIpIHsKKwkJCQkJZGJnKCJzdWJtaXQgdXJiIGluIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWQiLCBpKTsKKwkJCQkJbGFzdEVyciA9IGk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwZHgtPnVyYklkeCsrOwkvL3BvaW50IHRvIG5leHQgVVJCIHdoZW4gd2UgY2FsbGJhY2sKKwkJCQlpZiAocGR4LT5idWxrX2luX2J5dGVfdHJrID49IHBkeC0+ZnJhbWVTaXplKSB7CisJCQkJCXBkeC0+YnVsa19pbl9zaXplX3JldHVybmVkID0KKwkJCQkJICAgIHBkeC0+YnVsa19pbl9ieXRlX3RyazsKKwkJCQkJcGR4LT5idWxrX2luX2J5dGVfdHJrID0gMDsKKwkJCQkJcGR4LT5nb3RQaXhlbERhdGEgPSAxOworCQkJCQlwZHgtPmZyYW1lSWR4ID0KKwkJCQkJICAgICgocGR4LT5mcmFtZUlkeCArCisJCQkJCSAgICAgIDEpICUgcGR4LT5udW1fZnJhbWVzKTsKKwkJCQkJcGR4LT51cmJJZHggPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyogTWFwVXNlckJ1ZmZlcigKKwlpbnB1dHM6CisJc3RydWN0IGlvY3RsX3N0cnVjdCAqaW8gLSBzdHJ1Y3R1cmUgY29udGFpbmluZyB1c2VyIGFkZHJlc3MsIGZyYW1lICMsIGFuZCBzaXplCisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCAtIHRoZSBQSVVTQiBkZXZpY2UgZXh0ZW5zaW9uCisJcmV0dXJuczoKKwlpbnQgLSBzdGF0dXMgb2YgdGhlIHRhc2sKKwlOb3RlczoKKwlNYXBVc2VyQnVmZmVyIG1hcHMgYSBidWZmZXIgcGFzc2VkIGRvd24gdGhyb3VnaCBhbiBpb2N0bC4gIFRoZSB1c2VyIGJ1ZmZlciBpcyBQYWdlIEFsaWduZWQgYnkgdGhlIGFwcAorCWFuZCB0aGVuIHBhc3NlZCBkb3duLiAgVGhlIGZ1bmN0aW9uIGdldF9mcmVlX3BhZ2VzKC4uLikgZG9lcyB0aGUgYWN0dWFsIG1hcHBpbmcgb2YgdGhlIGJ1ZmZlciBmcm9tIHVzZXIgc3BhY2UgdG8KKwlrZXJuZWwgc3BhY2UuICBGcm9tIHRoZXJlIGEgc2NhdHRlcmxpc3QgaXMgY3JlYXRlZCBmcm9tIGFsbCB0aGUgcGFnZXMuICBUaGUgbmV4dCBmdW5jdGlvbiBjYWxsZWQgaXMgdG8gdXNiX2J1ZmZlcl9tYXBfc2cKKwl3aGljaCBhbGxvY2F0ZWQgRE1BIGFkZHJlc3NlcyBmb3IgZWFjaCBwYWdlLCBldmVuIGNvYWxlc2NpbmcgdGhlbSBpZiBwb3NzaWJsZS4gIFRoZSBETUEgYWRkcmVzcyBpcyBwbGFjZWQgaW4gdGhlIHNjYXR0ZXJsaXN0CisJc3RydWN0dXJlLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBETUEgYWRkcmVzc2VzLiAgVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQKKwl0aGUgdXNlciBidWZmZXIgdXNlcy4gIFdlIHRoZW4gYnVpbGQgYW4gVVJCIGZvciBlYWNoIERNQSBhZGRyZXNzIGFuZCB0aGVuIHN1Ym1pdCB0aGVtLgorKi8KKy8vaW50IE1hcFVzZXJCdWZmZXIoIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHVuc2lnbmVkIGxvbmcgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgZnJhbWVJbmZvLCBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ICkKK3N0YXRpYyBpbnQgTWFwVXNlckJ1ZmZlcihzdHJ1Y3QgaW9jdGxfc3RydWN0ICppbywgc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCkKK3sKKwl1bnNpZ25lZCBsb25nIHVhZGRyOworCXVuc2lnbmVkIGxvbmcgbnVtYnl0ZXM7CisJaW50IGZyYW1lSW5mbzsJCS8vd2hpY2ggZnJhbWUgd2UncmUgbWFwcGluZworCXVuc2lnbmVkIGludCBlcEFkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOworCWludCBpID0gMDsKKwlpbnQgayA9IDA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHBhZ2UgKiptYXBsaXN0X3A7CisJaW50IG51bVBhZ2VzUmVxdWlyZWQ7CisJZnJhbWVJbmZvID0gaW8tPm51bUZyYW1lczsKKwl1YWRkciA9ICh1bnNpZ25lZCBsb25nKWlvLT5wRGF0YTsKKwludW1ieXRlcyA9IGlvLT5udW1ieXRlczsKKworCWlmIChwZHgtPmlhbWEgPT0gUElYSVNfUElEKQkvL2lmIHNvLCB3aGljaCBFUCBzaG91bGQgd2UgbWFwIHRoaXMgZnJhbWUgdG8KKwl7CisJCWlmIChmcmFtZUluZm8gJSAyKQkvL2NoZWNrIHRvIHNlZSBpZiB0aGlzIHNob3VsZCB1c2UgRVA0KFBPTkcpCisJCXsKKwkJCWVwQWRkciA9IHBkeC0+aEVQWzNdOwkvL1BPTkcsIG9kZCBmcmFtZXMKKwkJfSBlbHNlIHsKKwkJCWVwQWRkciA9IHBkeC0+aEVQWzJdOwkvL1BJTkcsIGV2ZW4gZnJhbWVzIGFuZCB6ZXJvCisJCX0KKwkJZGJnKCJQaXhpcyBGcmFtZSAjJWQ6IEVQPSVkIiwgZnJhbWVJbmZvLAorCQkgICAgKGVwQWRkciA9PSBwZHgtPmhFUFsyXSkgPyAyIDogNCk7CisJfSBlbHNlCQkJLy9TVDEzMyBvbmx5IGhhcyAxIGVuZHBvaW50IGZvciBQaXhlbCBkYXRhIHRyYW5zZmVyCisJeworCQllcEFkZHIgPSBwZHgtPmhFUFswXTsKKwkJZGJnKCJTVDEzMyBGcmFtZSAjJWQ6IEVQPTIiLCBmcmFtZUluZm8pOworCX0KKwljb3VudCA9IG51bWJ5dGVzOworCWRiZygiVXNlckFkZHJlc3MgPSAweCUwOGxYIiwgdWFkZHIpOworCWRiZygibnVtYnl0ZXMgPSAlZCIsIChpbnQpbnVtYnl0ZXMpOworCS8vbnVtYmVyIG9mIHBhZ2VzIHRvIG1hcCB0aGUgZW50aXJlIHVzZXIgc3BhY2UgRE1BIGJ1ZmZlcgorCW51bVBhZ2VzUmVxdWlyZWQgPQorCSAgICAoKHVhZGRyICYgflBBR0VfTUFTSykgKyBjb3VudCArIH5QQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7CisJZGJnKCJOdW1iZXIgb2YgcGFnZXMgbmVlZGVkID0gJWQiLCBudW1QYWdlc1JlcXVpcmVkKTsKKwltYXBsaXN0X3AgPSB2bWFsbG9jKG51bVBhZ2VzUmVxdWlyZWQgKiBzaXplb2Yoc3RydWN0IHBhZ2UpKTsJLy8sIEdGUF9BVE9NSUMpOworCWlmICghbWFwbGlzdF9wKSB7CisJCWRiZygiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBtYXBsaXN0X3AiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8vbWFwIHRoZSB1c2VyIGJ1ZmZlciB0byBrZXJuZWwgbWVtb3J5CisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXSA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCAodWFkZHIgJiBQQUdFX01BU0spLCBudW1QYWdlc1JlcXVpcmVkLCBXUklURSwgMCwJLy9Eb24ndCBGb3JjZQorCQkJCQkJCQltYXBsaXN0X3AsCisJCQkJCQkJCU5VTEwpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWRiZygiTnVtYmVyIG9mIHBhZ2VzIG1hcHBlZCA9ICVkIiwKKwkgICAgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10pOworCWZvciAoaSA9IDA7IGkgPCBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXTsgaSsrKQorCQlmbHVzaF9kY2FjaGVfcGFnZShtYXBsaXN0X3BbaV0pOworCWlmICghcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10pIHsKKwkJZGJnKCJnZXRfdXNlcl9wYWdlcygpIGZhaWxlZCIpOworCQl2ZnJlZShtYXBsaXN0X3ApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy9uZWVkIHRvIGNyZWF0ZSBhIHNjYXR0ZXJsaXN0IHRoYXQgc3BhbnMgZWFjaCBmcmFtZSB0aGF0IGNhbiBmaXQgaW50byB0aGUgbWFwcGVkIGJ1ZmZlcgorCXBkeC0+c2dsW2ZyYW1lSW5mb10gPQorCSAgICBrbWFsbG9jKChwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXSAqCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBkeC0+c2dsW2ZyYW1lSW5mb10pIHsKKwkJdmZyZWUobWFwbGlzdF9wKTsKKwkJZGJnKCJjYW4ndCBhbGxvY2F0ZSBtZW0gZm9yIHNnbCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5wYWdlX2xpbmsgPSBtYXBsaXN0X3BbMF07CisJcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5vZmZzZXQgPSB1YWRkciAmIH5QQUdFX01BU0s7CisJaWYgKHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtmcmFtZUluZm9dID4gMSkgeworCQlwZHgtPnNnbFtmcmFtZUluZm9dWzBdLmxlbmd0aCA9CisJCSAgICBQQUdFX1NJWkUgLSBwZHgtPnNnbFtmcmFtZUluZm9dWzBdLm9mZnNldDsKKwkJY291bnQgLT0gcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5sZW5ndGg7CisJCWZvciAoayA9IDE7IGsgPCBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXTsgaysrKSB7CisJCQlwZHgtPnNnbFtmcmFtZUluZm9dW2tdLm9mZnNldCA9IDA7CisJCQlwZHgtPnNnbFtmcmFtZUluZm9dW2tdLnBhZ2VfbGluayA9IG1hcGxpc3RfcFtrXTsKKwkJCXBkeC0+c2dsW2ZyYW1lSW5mb11ba10ubGVuZ3RoID0KKwkJCSAgICAoY291bnQgPCBQQUdFX1NJWkUpID8gY291bnQgOiBQQUdFX1NJWkU7CisJCQljb3VudCAtPSBQQUdFX1NJWkU7CS8vZXhhbXBsZSBoYWQgUEFHRV9TSVpFIGhlcmU7CisJCX0KKwl9IGVsc2UgeworCQlwZHgtPnNnbFtmcmFtZUluZm9dWzBdLmxlbmd0aCA9IGNvdW50OworCX0KKwlwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dID0KKwkgICAgdXNiX2J1ZmZlcl9tYXBfc2cocGR4LT51ZGV2LCBlcEFkZHIsIHBkeC0+c2dsW2ZyYW1lSW5mb10sCisJCQkgICAgICBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXSk7CisJZGJnKCJudW1iZXIgb2Ygc2dFbnRyaWVzID0gJWQiLCBwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dKTsKKwlwZHgtPnVzZXJCdWZNYXBwZWQgPSAxOworCXZmcmVlKG1hcGxpc3RfcCk7CisJLy9DcmVhdGUgYW5kIFNlbmQgdGhlIFVSQidzIGZvciBlYWNoIHMvZyBlbnRyeQorCXBkeC0+UGl4ZWxVcmJbZnJhbWVJbmZvXSA9CisJICAgIGttYWxsb2MocGR4LT5zZ0VudHJpZXNbZnJhbWVJbmZvXSAqIHNpemVvZihzdHJ1Y3QgdXJiICopLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb10pIHsKKwkJZGJnKCJDYW4ndCBBbGxvY2F0ZSBNZW1vcnkgZm9yIFVyYiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHBkeC0+c2dFbnRyaWVzW2ZyYW1lSW5mb107IGkrKykgeworCQlwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11baV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwkvLzAgYmVjYXVzZSB3ZSdyZSB1c2luZyBCVUxLIHRyYW5zZmVycworCQl1c2JfZmlsbF9idWxrX3VyYihwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11baV0sCisJCQkJICBwZHgtPnVkZXYsCisJCQkJICBlcEFkZHIsCisJCQkJICAoZG1hX2FkZHJfdCAqKSBzZ19kbWFfYWRkcmVzcygmcGR4LT4KKwkJCQkJCQkJc2dsW2ZyYW1lSW5mb10KKwkJCQkJCQkJW2ldKSwKKwkJCQkgIHNnX2RtYV9sZW4oJnBkeC0+c2dsW2ZyYW1lSW5mb11baV0pLAorCQkJCSAgcGl1c2JfcmVhZFBJWEVMX2NhbGxiYWNrLCAodm9pZCAqKXBkeCk7CisJCXBkeC0+UGl4ZWxVcmJbZnJhbWVJbmZvXVtpXS0+dHJhbnNmZXJfZG1hID0KKwkJICAgIHNnX2RtYV9hZGRyZXNzKCZwZHgtPnNnbFtmcmFtZUluZm9dW2ldKTsKKwkJcGR4LT5QaXhlbFVyYltmcmFtZUluZm9dW2ldLT50cmFuc2Zlcl9mbGFncyA9CisJCSAgICBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCB8IFVSQl9OT19JTlRFUlJVUFQ7CisJfQorCXBkeC0+UGl4ZWxVcmJbZnJhbWVJbmZvXVstLWldLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX05PX0lOVEVSUlVQVDsJLy9vbmx5IGludGVycnVwdCB3aGVuIGxhc3QgVVJCIGNvbXBsZXRlcworCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW2ZyYW1lSW5mb10gPQorCSAgICBrbWFsbG9jKChwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dICogc2l6ZW9mKGNoYXIpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZHgtPnBlbmRlZFBpeGVsVXJic1tmcmFtZUluZm9dKQorCQlkYmcoIkNhbid0IGFsbG9jYXRlIE1lbW9yeSBmb3IgcGVuZGVkUGl4ZWxVcmJzIik7CisJZm9yIChpID0gMDsgaSA8IHBkeC0+c2dFbnRyaWVzW2ZyYW1lSW5mb107IGkrKykgeworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11baV0sIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyKSB7CisJCQlkYmcoIiVzICVkXG4iLCAic3VibWl0IHVyYiBlcnJvciA9IiwgZXJyKTsKKwkJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW2ZyYW1lSW5mb11baV0gPSAwOworCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlCisJCQlwZHgtPnBlbmRlZFBpeGVsVXJic1tmcmFtZUluZm9dW2ldID0gMTs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwaXVzYl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5pb2N0bCA9IHBpdXNiX2lvY3RsLAorCS5vcGVuID0gcGl1c2Jfb3BlbiwKKwkucmVsZWFzZSA9IHBpdXNiX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgcGl1c2JfY2xhc3MgPSB7CisJLm5hbWUgPSAidXNiL3JzcGl1c2IlZCIsCisJLmZvcHMgPSAmcGl1c2JfZm9wcywKKwkubWlub3JfYmFzZSA9IFBJVVNCX01JTk9SX0JBU0UsCit9OworCisvKioKKyAqCXBpdXNiX3Byb2JlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIGEgbmV3IGRldmljZSBpcyBjb25uZWN0ZWQgdGhhdCBpdCB0aGlua3MKKyAqCXRoaXMgZHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgcGl1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IGk7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgIiVzIC0gTG9va2luZyBmb3IgUEkgVVNCIEhhcmR3YXJlIiwgX19mdW5jX18pOworCisJcGR4ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZV9leHRlbnNpb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAocGR4ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJa3JlZl9pbml0KCZwZHgtPmtyZWYpOworCXBkeC0+dWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisJcGR4LT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisJaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisKKwkvKiBTZWUgaWYgdGhlIGRldmljZSBvZmZlcmVkIHVzIG1hdGNoZXMgd2hhdCB3ZSBjYW4gYWNjZXB0ICovCisJaWYgKChwZHgtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgIT0gVkVORE9SX0lEKQorCSAgICB8fCAoKHBkeC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0gUElYSVNfUElEKQorCQkmJiAocGR4LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCAhPSBTVDEzM19QSUQpKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcGR4LT5pYW1hID0gcGR4LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdDsKKworCWlmIChkZWJ1ZykgeworCQlpZiAocGR4LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBQSVhJU19QSUQpCisJCQlkYmcoIlBJVVNCOlBpeGlzIENhbWVyYSBGb3VuZCIpOworCQllbHNlCisJCQlkYmcoIlBJVVNCOlNUMTMzIFVTQiBDb250cm9sbGVyIEZvdW5kIik7CisJCWlmIChwZHgtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQkJZGJnKCJIaWdoc3BlZWQoVVNCMi4wKSBEZXZpY2UgQXR0YWNoZWQiKTsKKwkJZWxzZQorCQkJZGJnKCJMb3dzcGVlZCAoVVNCMS4xKSBEZXZpY2UgQXR0YWNoZWQiKTsKKworCQlkYmcoIk51bUVuZHBvaW50cyBpbiBDb25maWd1cmF0aW9uOiAlZCIsCisJCSAgICBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKwkJaWYgKGRlYnVnKSB7CisJCQlkYmcoIkVuZHBvaW50WyVkXS0+YkRlc2NyaXB0b3JUeXBlID0gJWQiLCBpLAorCQkJICAgIGVuZHBvaW50LT5iRGVzY3JpcHRvclR5cGUpOworCQkJZGJnKCJFbmRwb2ludFslZF0tPmJFbmRwb2ludEFkZHJlc3MgPSAweCUwMlgiLCBpLAorCQkJICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJCWRiZygiRW5kcG9pbnRbJWRdLT5iYm1BdHRyaWJ1dGVzID0gJWQiLCBpLAorCQkJICAgIGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMpOworCQkJZGJnKCJFbmRwb2ludFslZF0tPk1heFBhY2tldFNpemUgPSAlZFxuIiwgaSwKKwkJCSAgICBlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQl9CisJCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQkgICAgVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworCQkJaWYgKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKKwkJCQlwZHgtPmhFUFtpXSA9CisJCQkJICAgIHVzYl9yY3ZidWxrcGlwZShwZHgtPnVkZXYsCisJCQkJCQkgICAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCQkJZWxzZQorCQkJCXBkeC0+aEVQW2ldID0KKwkJCQkgICAgdXNiX3NuZGJ1bGtwaXBlKHBkeC0+dWRldiwKKwkJCQkJCSAgICBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CisJCX0KKwl9CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIHBkeCk7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZwaXVzYl9jbGFzcyk7CisJaWYgKHJldHZhbCkgeworCQllcnIoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKwlwZHgtPnByZXNlbnQgPSAxOworCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCXBkeC0+bWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkYmcoIlBJIFVTQjIuMCBkZXZpY2Ugbm93IGF0dGFjaGVkIHRvIHBpdXNiLSVkIiwgcGR4LT5taW5vcik7CisJcmV0dXJuIDA7CisKKyAgICAgIGVycm9yOgorCWlmIChwZHgpCisJCWtyZWZfcHV0KCZwZHgtPmtyZWYsIHBpdXNiX2RlbGV0ZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglwaXVzYl9kaXNjb25uZWN0CisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0uCisgKgorICoJVGhpcyByb3V0aW5lIGd1YXJhbnRlZXMgdGhhdCB0aGUgZHJpdmVyIHdpbGwgbm90IHN1Ym1pdCBhbnkgbW9yZSB1cmJzCisgKglieSBjbGVhcmluZyBwZHgtPnVkZXYuICBJdCBpcyBhbHNvIHN1cHBvc2VkIHRvIHRlcm1pbmF0ZSBhbnkgY3VycmVudGx5CisgKglhY3RpdmUgdXJicy4gIFVuZm9ydHVuYXRlbHksIHVzYl9idWxrX21zZygpLCB1c2VkIGluIHBpdXNiX3JlYWQoKSwgZG9lcworICoJbm90IHByb3ZpZGUgYW55IHdheSB0byBkbyB0aGlzLiAgQnV0IGF0IGxlYXN0IHdlIGNhbiBjYW5jZWwgYW4gYWN0aXZlCisgKgl3cml0ZS4KKyAqLworc3RhdGljIHZvaWQgcGl1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHg7CisJaW50IG1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKKwlsb2NrX2tlcm5lbCgpOworCXBkeCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJLyogZ2l2ZSBiYWNrIG91ciBtaW5vciAqLworCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZwaXVzYl9jbGFzcyk7CisJdW5sb2NrX2tlcm5lbCgpOworCS8qIHByZXZlbnQgZGV2aWNlIHJlYWQsIHdyaXRlIGFuZCBpb2N0bCAqLworCXBkeC0+cHJlc2VudCA9IDA7CisJa3JlZl9wdXQoJnBkeC0+a3JlZiwgcGl1c2JfZGVsZXRlKTsKKwlkYmcoIlBJIFVTQjIuMCBkZXZpY2UgIyVkIG5vdyBkaXNjb25uZWN0ZWRcbiIsIG1pbm9yKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHBpdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzdWIiLAorCS5wcm9iZSA9IHBpdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gcGl1c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBwaV9kZXZpY2VfdGFibGUsCit9OworCisvKioKKyAqCXBpdXNiX2luaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgcGl1c2JfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmcGl1c2JfZHJpdmVyKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiBLQlVJTERfTU9ETkFNRQorCQkgICAgICAgIjogdXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6JXM6ICVzXG4iLCBEUklWRVJfREVTQywKKwkgICAgICAgRFJJVkVSX1ZFUlNJT04pOworCXJldHVybiAwOworfQorCisvKioKKyAqCXBpdXNiX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHBpdXNiX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmcGl1c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGl1c2JfaW5pdCk7Cittb2R1bGVfZXhpdChwaXVzYl9leGl0KTsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL3JzcGl1c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL3JzcGl1c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVjZDJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvcnNwaXVzYi5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX19SU1BJVVNCX0gKKyNkZWZpbmUgX19SU1BJVVNCX0gKKworI2RlZmluZSBQSVVTQl9NQUdJQwkJJ20nCisjZGVmaW5lIFBJVVNCX0lPQ1RMX0JBU0UJMTkyCisjZGVmaW5lIFBJVVNCX0dFVFZORENNRAkJX0lPUihQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDEsIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIFBJVVNCX1NFVFZORENNRAkJX0lPVyhQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDIsIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIFBJVVNCX1dSSVRFUElQRQkJX0lPVyhQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDMsIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIFBJVVNCX1JFQURQSVBFCQlfSU9SKFBJVVNCX01BR0lDLCBQSVVTQl9JT0NUTF9CQVNFICsgNCwgc3RydWN0IGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgUElVU0JfU0VURlJBTUVTSVpFCV9JT1coUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyA1LCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9XSEFUQ0FNRVJBCV9JTyhQSVVTQl9NQUdJQywgIFBJVVNCX0lPQ1RMX0JBU0UgKyA2KQorI2RlZmluZSBQSVVTQl9VU0VSQlVGRkVSCV9JT1coUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyA3LCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9JU0hJR0hTUEVFRAlfSU8oUElVU0JfTUFHSUMsICBQSVVTQl9JT0NUTF9CQVNFICsgOCkKKyNkZWZpbmUgUElVU0JfVU5NQVBfVVNFUkJVRkZFUglfSU9XKFBJVVNCX01BR0lDLCBQSVVTQl9JT0NUTF9CQVNFICsgOSwgc3RydWN0IGlvY3RsX3N0cnVjdCkKKworc3RydWN0IGlvY3RsX3N0cnVjdCB7CisJdW5zaWduZWQgY2hhciBjbWQ7CisJdW5zaWduZWQgbG9uZyBudW1ieXRlczsKKwl1bnNpZ25lZCBjaGFyIGRpcjsJLy8xPW91dDswPWluCisJaW50IGVuZHBvaW50OworCWludCBudW1GcmFtZXM7CisJdW5zaWduZWQgY2hhciAqcERhdGE7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzOGYyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jCkBAIC0wLDAgKzEsMTM3NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICAyODcwX21haW5fZGV2LmMKKworICAgIEFic3RyYWN0OgorICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyByZWNvcmQgd2hldGhlciB0aGUgY2FyZCBpbiB0aGUgY2FyZCBsaXN0IGlzIHVzZWQgaW4gdGhlIGNhcmQgZmlsZQorZXh0ZXJuIFVJTlQ4ICBNQ19DYXJkVXNlZFtdOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisKK2V4dGVybiBJTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKKwkJCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOworCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3ltYm9sICYgTWFjcm8gRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBSVDI4NjBfSU5UX1JYX0RMWQkJCQkoMTw8MCkJCS8vIGJpdCAwCisjZGVmaW5lIFJUMjg2MF9JTlRfVFhfRExZCQkJCSgxPDwxKQkJLy8gYml0IDEKKyNkZWZpbmUgUlQyODYwX0lOVF9SWF9ET05FCQkJCSgxPDwyKQkJLy8gYml0IDIKKyNkZWZpbmUgUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUJCQkoMTw8MykJCS8vIGJpdCAzCisjZGVmaW5lIFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FCQkJKDE8PDQpCQkvLyBiaXQgNAorI2RlZmluZSBSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORQkJCSgxPDw1KQkJLy8gYml0IDUKKyNkZWZpbmUgUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUJCQkoMTw8NikJCS8vIGJpdCA2CisjZGVmaW5lIFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORQkJKDE8PDcpCQkvLyBiaXQgNworI2RlZmluZSBSVDI4NjBfSU5UX01HTVRfRE9ORQkJCSgxPDw4KQkJLy8gYml0IDgKKworI2RlZmluZSBJTlRfUlgJCQlSVDI4NjBfSU5UX1JYX0RPTkUKKworI2RlZmluZSBJTlRfQUMwX0RMWQkJKFJUMjg2MF9JTlRfQUMwX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCisjZGVmaW5lIElOVF9BQzFfRExZCQkoUlQyODYwX0lOVF9BQzFfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKKyNkZWZpbmUgSU5UX0FDMl9ETFkJCShSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQorI2RlZmluZSBJTlRfQUMzX0RMWQkJKFJUMjg2MF9JTlRfQUMzX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCisjZGVmaW5lIElOVF9IQ0NBX0RMWSAJKFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQorI2RlZmluZSBJTlRfTUdNVF9ETFkJUlQyODYwX0lOVF9NR01UX0RPTkUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCk7CitzdGF0aWMgVk9JRCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCk7Cit2b2lkIGluaXRfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOworc3RhdGljIHZvaWQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKK3N0YXRpYyBpbnQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZSh2b2lkKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcnQyODYwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHJ0Mjg2MF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworI2VuZGlmIC8vIENPTkZJR19QTSAvLworI2VuZGlmCisKKworLy8KKy8vIFJhbGluayBQQ0kgZGV2aWNlIHRhYmxlLCBpbmNsdWRlIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMKKy8vCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnQyODYwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0KK3sKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0lfREVWSUNFX0lEKX0sCQkvL1JUMjg2MDIuNEcKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjc5MF9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKFZFTl9BV1RfUENJX1ZFTkRPUl9JRCwgVkVOX0FXVF9QQ0llX0RFVklDRV9JRCl9LAorICAgIHswLH0JCS8vIHRlcm1pbmF0ZSBsaXN0Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnQyODYwX3BjaV90YmwpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIE1PRFVMRV9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOworI2VuZGlmCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8KKy8vIE91ciBQQ0kgZHJpdmVyIHN0cnVjdHVyZQorLy8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydDI4NjBfZHJpdmVyID0KK3sKKyAgICBuYW1lOiAgICAgICAicnQyODYwIiwKKyAgICBpZF90YWJsZTogICBydDI4NjBfcGNpX3RibCwKKyAgICBwcm9iZTogICAgICBydDI4NjBfaW5pdF9vbmUsCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA0MTIKKyAgICByZW1vdmU6ICAgICBfX2RldmV4aXRfcChydDI4NjBfcmVtb3ZlX29uZSksCisjZWxzZQorICAgIHJlbW92ZTogICAgIF9fZGV2ZXhpdChydDI4NjBfcmVtb3ZlX29uZSksCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZmRlZiBDT05GSUdfUE0KKwlzdXNwZW5kOglydDI4NjBfc3VzcGVuZCwKKwlyZXN1bWU6CQlydDI4NjBfcmVzdW1lLAorI2VuZGlmCisjZW5kaWYKK307CisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZmRlZiBDT05GSUdfUE0KKworVk9JRCBSVDI4NjBSZWplY3RQZW5kaW5nUGFja2V0cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBjbGVhciBQUyBwYWNrZXRzCisJLy8gY2xlYXIgVHhTdyBwYWNrZXRzCit9CisKK3N0YXRpYyBpbnQgcnQyODYwX3N1c3BlbmQoCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpTlVMTDsKKwlJTlQzMiByZXR2YWw7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOworCisJaWYgKG5ldF9kZXYgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCisJCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLworCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLworCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCisJCXsKKwkJCS8vIGF2b2lkIHVzZXJzIGRvIHN1c3BlbmQgYWZ0ZXIgaW50ZXJmYWNlIGlzIGRvd24KKworCQkJLy8gc3RvcCBpbnRlcmZhY2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKworCQkJLy8gbWFyayBkZXZpY2UgYXMgcmVtb3ZlZCBmcm9tIHN5c3RlbSBhbmQgdGhlcmVmb3JlIG5vIGxvbmdlciBhdmFpbGFibGUKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkJCS8vIG1hcmsgaGFsdCBmbGFnCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJCS8vIHRha2UgZG93biB0aGUgZGV2aWNlCisJCQlydDI4eHhfY2xvc2UoKFBORVRfREVWKW5ldF9kZXYpOworCisJCQlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOworCQl9CisJfQorCisJLy8gcmVmZXJlbmNlIHRvIGh0dHA6Ly92b3ZvMjAwMC5jb20vdHlwZS1sYWIvbGludXgva2VybmVsLWFwaS9saW51eC1rZXJuZWwtYXBpLmh0bWwKKwkvLyBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQKKwkvLyBwY2lfY2hvb3NlX3N0YXRlKCk6IENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAorCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSwgMSk7CisJLy8gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKKwlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKKwkvLyBkaXNhYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgdXNlCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCisJcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9zdXNwZW5kKClcbiIpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJ0Mjg2MF9yZXN1bWUoCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOworCUlOVDMyIHJldHZhbDsKKworCisJLy8gc2V0IHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKKwkvLyBQQ0kgaGFzIDQgcG93ZXIgc3RhdGVzLCBETyAobm9ybWFsKSB+IEQzKGxlc3MgcG93ZXIpCisJLy8gaW4gaW5jbHVkZS9saW51eC9wY2kuaCwgeW91IGNhbiBmaW5kIHRoYXQKKwkvLyAjZGVmaW5lIFBDSV9EMCAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDApCisJLy8gI2RlZmluZSBQQ0lfRDEgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQorCS8vICNkZWZpbmUgUENJX0QyICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMikKKwkvLyAjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDMpCisJLy8gI2RlZmluZSBQQ0lfRDNjb2xkICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA0KQorCS8vICNkZWZpbmUgUENJX1VOS05PV04gICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNSkKKwkvLyAjZGVmaW5lIFBDSV9QT1dFUl9FUlJPUiAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIC0xKQorCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKworCS8vIHJlc3RvcmUgdGhlIHNhdmVkIHN0YXRlIG9mIGEgUENJIGRldmljZQorCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCisJLy8gaW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlcgorCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKwl7CisJCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7CisJCXJldHVybiAwOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3Jlc3VtZSgpXG4iKSk7CisKKwlpZiAobmV0X2RldiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOworCX0KKwllbHNlCisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwlpZiAocEFkICE9IE5VTEwpCisJeworCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCisJCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLworCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLworCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCisJCXsKKwkJCS8vIG1hcmsgZGV2aWNlIGFzIGF0dGFjaGVkIGZyb20gc3lzdGVtIGFuZCByZXN0YXJ0IGlmIG5lZWRlZAorCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKKworCQkJaWYgKHJ0Mjh4eF9vcGVuKChQTkVUX0RFViluZXRfZGV2KSAhPSAwKQorCQkJeworCQkJCS8vIG9wZW4gZmFpbAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKKwkJCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7CisKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwkJCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCXJldHVybiAwOworfQorI2VuZGlmIC8vIENPTkZJR19QTSAvLworI2VuZGlmCisKKworc3RhdGljIElOVCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKFZPSUQpCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKKyNlbHNlCisgICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcnQyODYwX2RyaXZlcik7CisjZW5kaWYKK30KKworCisvLworLy8gRHJpdmVyIG1vZHVsZSB1bmxvYWQgZnVuY3Rpb24KKy8vCitzdGF0aWMgVk9JRCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKFZPSUQpCit7CisgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocnQyODYwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSk7CisKKworc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX2luaXRfb25lICgKKyAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgICpwY2lfZGV2LAorICAgIElOICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCkKK3sKKyAgICBJTlQgcmM7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9pbml0X29uZVxuIikpOworCisgICAgLy8gd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZQorICAgIGlmIChwY2lfZW5hYmxlX2RldmljZSAocGNpX2RldikpCisgICAgeworICAgICAgICByYyA9IC1FSU87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gcnQyODYwX3Byb2JlKHBjaV9kZXYsIGVudCk7CisgICAgfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfaW5pdF9vbmVcbiIpKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIFZPSUQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKAorICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgKnBjaV9kZXYpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKyAgICBSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVtb3ZlX29uZVxuIikpOworCisJaWYgKHBBZCAhPSBOVUxMKQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKChwQWQtPk1DX1Jvd0lEID49IDApICYmIChwQWQtPk1DX1Jvd0lEIDw9IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCisJCQlNQ19DYXJkVXNlZFtwQWQtPk1DX1Jvd0lEXSA9IDA7IC8vIG5vdCBjbGVhciBNQUMgYWRkcmVzcworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisKKworCisJCS8vIFVucmVnaXN0ZXIgbmV0d29yayBkZXZpY2UKKwkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CisKKwkJLy8gVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcworCQlpb3VubWFwKChjaGFyICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOworCisJCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCisJCS8vIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbgorCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gVW5yZWdpc3RlciBuZXR3b3JrIGRldmljZQorCQl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKKworCQkvLyBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzCisJCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7CisKKwkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOworCX0KKworCS8vIEZyZWUgcHJlLWFsbG9jYXRlZCBuZXRfZGV2aWNlIG1lbW9yeQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKKyNlbHNlCisJa2ZyZWUobmV0X2Rldik7CisjZW5kaWYKK30KKworLy8KKy8vIFBDSSBkZXZpY2UgcHJvYmUgJiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorLy8KK3N0YXRpYyBJTlQgX19kZXZpbml0ICAgcnQyODYwX3Byb2JlKAorICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAgKnBjaV9kZXYsCisgICAgSU4gIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KQoreworCVBSVE1QX0FEQVBURVIgcEFkOworICAgIElOVCBydiA9IDA7CisKKyAgICBydiA9IChJTlQpcnQyOHh4X3Byb2JlKCh2b2lkICopcGNpX2RldiwgKHZvaWQgKillbnQsIDAsICZwQWQpOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSk7CisJcmV0dXJuIHJ2OworfQorCisKK3ZvaWQgaW5pdF90aHJlYWRfdGFzayhJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgbWdtdF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2ssIGFjMF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2ssIGFjMV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIGFjMl9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2ssIGFjM19kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzaywgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworfQorCit2b2lkIGtpbGxfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7Cit9CisKKworc3RhdGljIHZvaWQgcnQyODYwX2ludF9lbmFibGUoUFJUTVBfQURBUFRFUiBwQWQsIHVuc2lnbmVkIGludCBtb2RlKQoreworCXUzMiByZWdWYWx1ZTsKKworCXBBZC0+aW50X2Rpc2FibGVfbWFzayAmPSB+KG1vZGUpOworCXJlZ1ZhbHVlID0gcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDE6ZW5hYmxlCisKKwlpZiAocmVnVmFsdWUgIT0gMCkKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Cit9CisKKworc3RhdGljIHZvaWQgcnQyODYwX2ludF9kaXNhYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1MzIgcmVnVmFsdWU7CisKKwlwQWQtPmludF9kaXNhYmxlX21hc2sgfD0gbW9kZTsKKwlyZWdWYWx1ZSA9IAlwQWQtPmludF9lbmFibGVfcmVnICYgfihwQWQtPmludF9kaXNhYmxlX21hc2spOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcmVnVmFsdWUpOyAgICAgLy8gMDogZGlzYWJsZQorCisJaWYgKHJlZ1ZhbHVlID09IDApCisJeworCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOworCX0KK30KKworc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLk1nbXREbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfTUdNVF9ETFk7CisKKwlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7CisKKwkvLyBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCBubyBhbnkKKwkvLyBidWcgcmVwb3J0IG91dHB1dAorCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKKwkgKi8KKwlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9NR01UX0RMWSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX01HTVRfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisJQk9PTEVBTgliUmVzY2hlZHVsZSA9IDA7CisJUE9TX0NPT0tJRSBwT2JqOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXBBZC0+aW50X3BlbmRpbmcgJj0gfihJTlRfUlgpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCWJSZXNjaGVkdWxlID0gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgMCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKKwkgKi8KKwlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9SWCB8fCBiUmVzY2hlZHVsZSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFJ4SU5UIGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfUlgpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisJUE9TX0NPT0tJRSBwT2JqOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXBBZC0+aW50X3BlbmRpbmcgJj0gfihGaWZvU3RhRnVsbEludCk7CisJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKKwkgKi8KKwlpZiAocEFkLT5pbnRfcGVuZGluZyAmIEZpZm9TdGFGdWxsSW50KQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgUnhJTlQgYWdhaW4gKi8KKworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKyAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkhjY2FEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfSENDQV9ETFk7CisKKwlSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfSENDQV9ETFkpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9IQ0NBX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjM0RtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzNfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDM19ETFkpIHx8IGJSZXNjaGVkdWxlKQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzNfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKKyAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7CisJUE9TX0NPT0tJRSBwT2JqOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuQWMyRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMl9ETFk7CisKKwliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzJfRExZKSB8fCBiUmVzY2hlZHVsZSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMyX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjMURtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzFfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMV9ETFkpIHx8IGJSZXNjaGVkdWxlKQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzFfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKKyAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7CisJUE9TX0NPT0tJRSBwT2JqOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuQWMwRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMF9ETFk7CisKKwliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKKwkgKi8KKwlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMwX0RMWSkgfHwgYlJlc2NoZWR1bGUpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMF9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCisKK2ludCBwcmludF9pbnRfY291bnQ7CisKK0lSUV9IQU5ETEVfVFlQRQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkKK3J0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQorI2Vsc2UKK3J0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKworCS8qIE5vdGUgMDMzMTIwMDg6IHdlIGNhbiBub3QgcmV0dXJuIGhlcmUgYmVmb3JlCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7CisJCU9yIGtlcm5lbCB3aWxsIHBhbmljIGFmdGVyIGlmY29uZmlnIHJhMCBkb3duIHNvbWV0aW1lcyAqLworCisKKwkvLworCS8vIEluaXRhbCB0aGUgSW50ZXJydXB0IHNvdXJjZS4KKwkvLworCUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7CisvLwlNY3VJbnRTb3VyY2Uud29yZCA9IDB4MDAwMDAwMDBMOworCisJLy8KKwkvLyBHZXQgdGhlIGludGVycnVwdCBzb3VyY2VzICYgc2F2ZWQgdG8gbG9jYWwgdmFyaWFibGUKKwkvLworCS8vUlRNUF9JT19SRUFEMzIocEFkLCB3aGVyZSwgJk1jdUludFNvdXJjZS53b3JkKTsKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsICwgTWN1SW50U291cmNlLndvcmQpOworCisJLy8KKwkvLyBGbGFnIGZPUF9TVEFUVVNfRE9aRSBPbiwgbWVhbnMgQVNJQyBwdXQgdG8gc2xlZXAsIGVsYXNlIG1lYW5zIEFTSUNLIFdha2VVcAorCS8vIEFuZCBhdCB0aGUgc2FtZSB0aW1lLCBjbG9jayBtYXliZSB0dXJuZWQgb2ZmIHRoYXQgc2F5IHRoZXJlIGlzIG5vIERNQSBzZXJ2aWNlLgorCS8vIHdoZW4gQVNJQyBnZXQgdG8gc2xlZXAuCisJLy8gVG8gcHJldmVudCBzeXN0ZW0gaGFuZyBvbiBwb3dlciBzYXZpbmcuCisJLy8gV2UgbmVlZCB0byBjaGVjayBpdCBiZWZvcmUgaGFuZGxlIHRoZSBJTlRfU09VUkNFX0NTUiwgQVNJQyBtdXN0IGJlIHdha2UgdXAuCisJLy8KKwkvLyBSVDI2NjEgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2Fubm90IGJlIHJlYWQgYW5kIHdyaXR0ZW4uCisJLy8gUlQyODYwID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuLgorCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOyAvLyB3cml0ZSAxIHRvIGNsZWFyCisJfQorCisJLy8gRG8gbm90aGluZyBpZiBSZXNldCBpbiBwcm9ncmVzcworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwl7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgICAgICByZXR1cm4gIElSUV9IQU5ETEVEOworI2Vsc2UKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisJfQorCisJLy8KKwkvLyBIYW5kbGUgaW50ZXJydXB0LCB3YWxrIHRocm91Z2ggYWxsIGJpdHMKKwkvLyBTaG91bGQgc3RhcnQgZnJvbSBoaWdoZXN0IHByaW9yaXR5IGludGVycnVwdAorCS8vIFRoZSBwcmlvcml0eSBjYW4gYmUgYWRqdXN0IGJ5IGFsdGVyaW5nIHByb2Nlc3NpbmcgaWYgc3RhdGVtZW50CisJLy8KKworICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCisJLy8gSWYgcmVxdWlyZWQgc3BpbmxvY2ssIGVhY2ggaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBoYXMgdG8gYWNxdWlyZQorCS8vIGFuZCByZWxlYXNlIGl0c2VsZi4KKwkvLworCisJLy8gRG8gbm90aGluZyBpZiBOSUMgZG9lc24ndCBleGlzdAorCWlmIChJbnRTb3VyY2Uud29yZCA9PSAweGZmZmZmZmZmKQorCXsKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgICAgICByZXR1cm4gIElSUV9IQU5ETEVEOworI2Vsc2UKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgVHhDb2hlcmVudCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlR4Q29oZXJlbnQ8PDxcbiIpKTsKKwkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBSeENvaGVyZW50KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+UnhDb2hlcmVudDw8PFxuIikpOworCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIEZpZm9TdGFGdWxsSW50KQorCXsKKyNpZiAxCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgRmlmb1N0YUZ1bGxJbnQpID09IDApCisJCXsKKwkJCS8qIG1hc2sgRmlmb1N0YUZ1bGxJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBGaWZvU3RhRnVsbEludDsKKyNlbHNlCisJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworI2VuZGlmCisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX01HTVRfRExZKQorCXsKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfTUdNVF9ETFkpID09MCApCisJCXsKKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9NR01UX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX01HTVRfRExZIDsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfUlgpCisJeworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9SWCkgPT0gMCkKKwkJeworCQkJLyogbWFzayBSeElOVCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX1JYKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfUlg7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0hDQ0FfRExZKQorCXsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9IQ0NBX0RMWSkgPT0gMCkKKwkJeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9IQ0NBX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0hDQ0FfRExZOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzNfRExZKQorCXsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzNfRExZKSA9PSAwKQorCQl7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDM19ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDM19ETFk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMl9ETFkpCisJeworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMl9ETFkpID09IDApCisJCXsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMyX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMyX0RMWTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMxX0RMWSkKKwl7CisKKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMxX0RMWTsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzFfRExZKSA9PSAwKQorCQl7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMV9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQl9CisKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMwX0RMWSkKKwl7CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMF9ETFk7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMwX0RMWSkgPT0gMCkKKwkJeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzBfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJfQorCisJfQorCisgICAgaWYgKEludFNvdXJjZS53b3JkICYgUHJlVEJUVEludCkKKwl7CisJCVJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KHBBZCk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgVEJUVEludCkKKwl7CisJCVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KHBBZCk7CisJfQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoSW50U291cmNlLndvcmQgJiBBdXRvV2FrZXVwSW50KQorCQkJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQocEFkKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAgcmV0dXJuICBJUlFfSEFORExFRDsKKyNlbmRpZgorCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2hlY2sgdGhlIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUNoZWNrIG9rCisJRkFMU0UJCQkJQ2hlY2sgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCisJSU4gdm9pZCAqX2Rldl9wKQoreworCS8qIGFsd2F5cyBUUlVFICovCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorICAgICpuZXRfZGV2CQkJUG9pbnQgdG8gdGhlIG5ldCBkZXZpY2UKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJSW5pdCBvaworCUZBTFNFCQkJCUluaXQgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhOZXREZXZJbml0KAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSAoc3RydWN0IHBjaV9kZXYgKilfZGV2X3A7CisgICAgY29uc3QgQ0hBUgkqcHJpbnRfbmFtZTsKKyAgICBVTE9ORwljc3JfYWRkcjsKKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIHByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX25hbWUocGNpX2RldikgOiAicnQyODYwIjsKKyNlbHNlCisgICAgcHJpbnRfbmFtZSA9IHBjaV9kZXYgPyBwY2lfZGV2LT5zbG90X25hbWUgOiAicnQyODYwIjsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCW5ldF9kZXYtPmJhc2VfYWRkciA9IDA7CisJbmV0X2Rldi0+aXJxID0gMDsKKworICAgIGlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBjaV9kZXYsIHByaW50X25hbWUpKQorICAgICAgICBnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisKKyAgICAvLyBpbnRlcnJ1cHQgSVJRIG51bWJlcgorICAgIG5ldF9kZXYtPmlycSA9IHBjaV9kZXYtPmlycTsKKworICAgIC8vIG1hcCBwaHlzaWNhbCBhZGRyZXNzIHRvIHZpcnR1YWwgYWRkcmVzcyBmb3IgYWNjZXNzaW5nIHJlZ2lzdGVyCisgICAgY3NyX2FkZHIgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkJCQkJCQkJcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7CisKKyAgICBpZiAoIWNzcl9hZGRyKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJKCJpb3JlbWFwIGZhaWxlZCBmb3IgZGV2aWNlICVzLCByZWdpb24gMHglbFggQCAweCVsWFxuIiwKKwkJCQlwcmludF9uYW1lLCAoVUxPTkcpcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSwKKwkJCQkoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApKSk7CisgICAgICAgIGdvdG8gZXJyX291dF9mcmVlX3JlczsKKyAgICB9CisKKyAgICAvLyBTYXZlIENTUiB2aXJ0dWFsIGFkZHJlc3MgYW5kIGlycSB0byBkZXZpY2Ugc3RydWN0dXJlCisgICAgbmV0X2Rldi0+YmFzZV9hZGRyID0gY3NyX2FkZHI7CisgICAgcEFkLT5DU1JCYXNlQWRkcmVzcyA9IChQVUNIQVIpbmV0X2Rldi0+YmFzZV9hZGRyOworCisgICAgLy8gU2V0IERNQSBtYXN0ZXIKKyAgICBwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworICAgIG5ldF9kZXYtPnByaXZfZmxhZ3MgPSBJTlRfTUFJTjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBhdCAweCVseCwgVkEgMHglbHgsIElSUSAlZC4gXG4iLAorICAgICAgICAJbmV0X2Rldi0+bmFtZSwgKFVMT05HKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKKwkJCShVTE9ORyljc3JfYWRkciwgcGNpX2Rldi0+aXJxKSk7CisJcmV0dXJuIFRSVUU7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitlcnJfb3V0X2ZyZWVfcmVzOgorICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2Rldik7CitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCS8qIGZyZWUgbmV0ZGV2IGluIGNhbGxlciwgbm90IGhlcmUgKi8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDb25maWcgb2sKKwlGQUxTRQkJCQlDb25maWcgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAorCUlOIElOVDMyCQkJCWFyZ2MpCit7CisJLyogbm8gdXNlICovCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBEaXNhYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4WFhETUFEaXNhYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyAgICAgR2xvQ2ZnOworCisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJR2xvQ2ZnLndvcmQgJj0gMHhmZjA7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBFbmFibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUMjhYWERNQUVuYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworCWludCBpID0gMDsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpIDwyMDApOworCisJUlRNUHVzZWNEZWxheSg1MCk7CisKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKKwlHbG9DZmcuZmllbGQuV1BETUFCdXJzdFNJWkUgPSAyOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBXcml0ZSBCZWFjb24gYnVmZmVyIHRvIEFzaWMuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKKwlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCisJSU4gSU5UCQkJCWFwaWR4LAorCUlOIFVMT05HCQkJRnJhbWVMZW4sCisJSU4gVUxPTkcJCQlVcGRhdGVQb3MpCit7CisJVUxPTkcJCQkJQ2FwSW5mb1BvcyA9IDA7CisJVUNIQVIgIAkJCSpwdHIsICpwdHJfdXBkYXRlLCAqcHRyX2NhcGluZm87CisJVUlOVCAgCQkJaTsKKwlCT09MRUFOCQkJYkJjblJlcSA9IEZBTFNFOworCVVDSEFSCQkJYmNuX2lkeCA9IDA7CisKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCkgOiBObyB2YWxpZCBJbnRlcmZhY2UgYmUgZm91bmQuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiQmNuUmVxID09IEZBTFNFKQorCXsKKwkJLyogd2hlbiB0aGUgcmEgaW50ZXJmYWNlIGlzIGRvd24sIGRvIG5vdCBzZW5kIGl0cyBiZWFjb24gZnJhbWUgKi8KKwkJLyogY2xlYXIgYWxsIHplcm8gKi8KKwkJZm9yKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIDB4MDApOworCX0KKwllbHNlCisJeworCQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QV0lFbmRpYW5DaGFuZ2UocHRyLCBUWVBFX1RYV0kpOworI2VuZGlmCisJCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCQl7CisJCQlVSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdwdHIpOworCQkJcHRyICs9IDQ7CisJCX0KKworCQkvLyBVcGRhdGUgQ2FwYWJpbGl0eUluZm8gaW4gQmVhY29uCisJCWZvciAoaSA9IENhcEluZm9Qb3M7IGkgPCAoQ2FwSW5mb1BvcysyKTsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgKnB0cl9jYXBpbmZvKTsKKwkJCXB0cl9jYXBpbmZvICsrOworCQl9CisKKwkJaWYgKEZyYW1lTGVuID4gVXBkYXRlUG9zKQorCQl7CisJCQlmb3IgKGk9IFVwZGF0ZVBvczsgaTwgKEZyYW1lTGVuKTsgaSsrKQorCQkJeworCQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCAqcHRyX3VwZGF0ZSk7CisJCQkJcHRyX3VwZGF0ZSArKzsKKwkJCX0KKwkJfQorCisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKK30KKworVk9JRCBSVE1QRmluZEhvc3RQQ0lEZXYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKwkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgVUNIQVIJCUxldmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKwkJTWF4IDogbGltaXQgSG9zdCBQQ0kgYW5kIFJhbGluayBQQ0llIGRldmljZSdzIExJTksgQ09OVFJPTCBmaWVsZCdzIHZhbHVlLgorCQlCZWNhdXNlIG5vdyBmcmVxdWVudGx5IHNldCBvdXIgZGV2aWNlIHRvIG1vZGUgMSBvciBtb2RlIDMgd2lsbCBjYXVzZSBwcm9ibGVtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJVVNIT1JUCQlNYXgpCit7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgcnQyODYwX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOworICAgIGlmIChuZXRfZGV2ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7CisJfQorCWVsc2UKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCWlmIChwQWQgIT0gTlVMTCkKKwl7CisJICAgIC8vIHN0b3AgaW50ZXJmYWNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworCisJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCisJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkJLy8gbWFyayBoYWx0IGZsYWcKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJLy8gdGFrZSBkb3duIHRoZSBkZXZpY2UKKwkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKKwkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKKwl9CisgICAgcmV0dXJuOworfQorCisvKgorICogaW52YWlsZCBvciB3cml0ZWJhY2sgY2FjaGUKKyAqIGFuZCBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKQoreworCVBSVE1QX0FEQVBURVIgcEFkOworCVBPU19DT09LSUUgcE9iajsKKworCS8qCisJCS0tLS0tLSBQb3J0aW5nIEluZm9ybWF0aW9uIC0tLS0tLQorCQk+IEZvciBUeCBBbGxvYzoKKwkJCW1nbXQgcGFja2V0cyA9PiBzZF9pZHggPSAwCisJCQlTd0lkeDogcEFkLT5NZ210UmluZy5UeENwdUlkeAorCQkJcFR4RCA6IHBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKworCQkJZGF0YSBwYWNrZXRzID0+IHNkX2lkeCA9IDEKKwkgCQlUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAorCSAJCVF1ZUlkeDogcFR4QmxrLT5RdWVJZHgKKwkgCQlwVHhEICA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCisJIAk+IEZvciBSeCBBbGxvYzoKKwkgCQlzZF9pZHggPSAtMQorCSovCisKKwlwQWQgPSAoUFJUTVBfQURBUFRFUiloYW5kbGU7CisJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJaWYgKHNkX2lkeCA9PSAxKQorCXsKKwkJUFRYX0JMSwkJcFR4QmxrOworCQlwVHhCbGsgPSAoUFRYX0JMSylwdHI7CisJCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1ZkxlbiwgZGlyZWN0aW9uKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwl9CisKK30KKwordm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJUFJUTVBfQURBUFRFUiBwQWQ7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcEFkPShQUlRNUF9BREFQVEVSKWhhbmRsZTsKKwlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwlwY2lfdW5tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ0ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnCkBAIC0wLDAgKzEsNSBAQAorY29uZmlnIFJUMjg2MAorCXRyaXN0YXRlICJSYWxpbmsgMjg2MCB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOXzgwMjExCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDI4NjAgd2lyZWxlc3MgY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjIyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKK29iai0kKENPTkZJR19SVDI4NjApCSs9IHJ0Mjg2MHN0YS5vCisKKyMgVE9ETzogYWxsIG9mIHRoZXNlIHNob3VsZCBiZSByZW1vdmVkCitFWFRSQV9DRkxBR1MgKz0gLURMSU5VWCAtREFHR1JFR0FUSU9OX1NVUFBPUlQgLURQSUdHWUJBQ0tfU1VQUE9SVCAtRFdNTV9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURSVDI4NjAKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19TVEFfU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1EREJHCitFWFRSQV9DRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisKK3J0Mjg2MHN0YS1vYmpzIDo9CVwKKwljb21tb24vbWQ1Lm8JCVwKKwljb21tb24vbWxtZS5vCQlcCisJY29tbW9uL3J0bXBfd2VwLm8JXAorCWNvbW1vbi9hY3Rpb24ubwkJXAorCWNvbW1vbi9jbW1fZGF0YS5vCVwKKwljb21tb24vcnRtcF9pbml0Lm8JXAorCWNvbW1vbi9ydG1wX3RraXAubwlcCisJY29tbW9uL2NtbV9zeW5jLm8JXAorCWNvbW1vbi9lZXByb20ubwkJXAorCWNvbW1vbi9jbW1fc2FuaXR5Lm8JXAorCWNvbW1vbi9jbW1faW5mby5vCVwKKwljb21tb24vY21tX3dwYS5vCVwKKwljb21tb24vZGZzLm8JCVwKKwljb21tb24vc3BlY3RydW0ubwlcCisJc3RhL2Fzc29jLm8JCVwKKwlzdGEvYWlyb25ldC5vCQlcCisJc3RhL2F1dGgubwkJXAorCXN0YS9hdXRoX3JzcC5vCQlcCisJc3RhL3N5bmMubwkJXAorCXN0YS9zYW5pdHkubwkJXAorCXN0YS9ydG1wX2RhdGEubwkJXAorCXN0YS9jb25uZWN0Lm8JCVwKKwlzdGEvd3BhLm8JCVwKKwlydF9saW51eC5vCQlcCisJcnRfcHJvZmlsZS5vCQlcCisJcnRfbWFpbl9kZXYubwkJXAorCXN0YV9pb2N0bC5vCQlcCisJY29tbW9uL2JhX2FjdGlvbi5vCVwKKwljb21tb24vMjg2MF9ydG1wX2luaXQubwlcCisJMjg2MF9tYWluX2Rldi5vCQlcCisJY29tbW9uL2NtbV9kYXRhXzI4NjAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzBiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8KQEAgLTAsMCArMSwxNyBAQAorSSdtIGhlc2l0YW50IHRvIGFkZCBhIFRPRE8gZmlsZSBoZXJlLCBhcyB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVycyB3b3VsZAorcmVhbGx5IGhhdmUgcGVvcGxlIGhlbHAgdGhlbSBvdXQgb24gdGhlICJjbGVhbiIgcnQyODYwIGRyaXZlciB0aGF0IGNhbgorYmUgZm91bmQgYXQgdGhlIHJ0Mjg2MC5zZi5uZXQgc2l0ZS4KKworQnV0LCBpZiB5b3Ugd2lzaCB0byBjbGVhbiB1cCB0aGlzIGRyaXZlciBpbnN0ZWFkLCBoZXJlJ3MgYSBzaG9ydCBsaXN0IG9mCit0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUgdG8gZ2V0IGl0IGludG8gYSBtb3JlIG1lcmdhYmxlIHNoYXBlOgorCitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbgorCS0gc3BhcnNlIGNsZWFuCisJLSBwb3J0IHRvIGluLWtlcm5lbCA4MDIxMSBzdGFjaworCS0gcmVtb3ZlIHJlYWRpbmcgZnJvbSAvZXRjLyBjb25maWcgZmlsZXMKKwktIHJldmlldyBieSB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVyIGNvbW11bml0eQorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBvciBjb21wbGFpbnRzIGFib3V0IHRoaXMgZHJpdmVyIHRvIEdyZWcKK0tyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgZG9uJ3QgYm90aGVyIHRoZSB1cHN0cmVhbSB3aXJlbGVzcwora2VybmVsIGRldmVsb3BlcnMgYWJvdXQgaXQsIHRoZXkgd2FudCBub3RoaW5nIHRvIGRvIHdpdGggaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDdiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhaXJvbmV0LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAorKi8KKworI2lmbmRlZglfX0FJUk9ORVRfSF9fCisjZGVmaW5lCV9fQUlST05FVF9IX18KKworLy8gTWVhc3VyZW1lbnQgVHlwZSBkZWZpbml0aW9uCisjZGVmaW5lCU1TUk5fVFlQRV9VTlVTRUQJCQkJMAorI2RlZmluZQlNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUQkJMQorI2RlZmluZQlNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEJCTIKKyNkZWZpbmUJTVNSTl9UWVBFX0JFQUNPTl9SRVEJCQkzCisjZGVmaW5lCU1TUk5fVFlQRV9GUkFNRV9SRVEJCQkJNAorCisvLyBTY2FuIE1vZGUgaW4gQmVhY29uIFJlcXVlc3QKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfUEFTU0lWRQkJCTAKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQUNUSVZFCQkJMQorI2RlZmluZQlNU1JOX1NDQU5fTU9ERV9CRUFDT05fVEFCTEUJCTIKKworLy8gUEhZIHR5cGUgZGVmaW5pdGlvbiBmb3IgQWlyb25ldCBiZWFjb24gcmVwb3J0LCBDQ1ggMiB0YWJsZSAzNi05CisjZGVmaW5lCVBIWV9GSAkJCQkJCQkxCisjZGVmaW5lCVBIWV9EU1MJCQkJCQkJMgorI2RlZmluZQlQSFlfVU5VU0VECQkJCQkJMworI2RlZmluZQlQSFlfT0ZETQkJCQkJCTQKKyNkZWZpbmUJUEhZX0hSX0RTUwkJCQkJCTUKKyNkZWZpbmUJUEhZX0VSUAkJCQkJCQk2CisKKy8vIFJQSSB0YWJsZSBpbiBkQm0KKyNkZWZpbmUJUlBJXzAJCQkwCQkJLy8JUG93ZXIgPD0gLTg3CisjZGVmaW5lCVJQSV8xCQkJMQkJCS8vCS04NyA8IFBvd2VyIDw9IC04MgorI2RlZmluZQlSUElfMgkJCTIJCQkvLwktODIgPCBQb3dlciA8PSAtNzcKKyNkZWZpbmUJUlBJXzMJCQkzCQkJLy8JLTc3IDwgUG93ZXIgPD0gLTcyCisjZGVmaW5lCVJQSV80CQkJNAkJCS8vCS03MiA8IFBvd2VyIDw9IC02NworI2RlZmluZQlSUElfNQkJCTUJCQkvLwktNjcgPCBQb3dlciA8PSAtNjIKKyNkZWZpbmUJUlBJXzYJCQk2CQkJLy8JLTYyIDwgUG93ZXIgPD0gLTU3CisjZGVmaW5lCVJQSV83CQkJNwkJCS8vCS01NyA8IFBvd2VyCisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBkZWZpbmV0aW9ucworI2RlZmluZQlBSVJPTkVUX0lBUFBfVFlQRQkJCQkJMHgzMgorI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUCQkweDAxCisjZGVmaW5lCUFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVAkJCTB4ODEKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBkZXRhaWwgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfUkVRVUVTVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTY2FuTW9kZTsJCQkvLyBVc2Ugb25seSBpbiBiZWFjb24gcmVxdWVzdCwgb3RoZXIgcmVxdWVzdHMgZGlkIG5vdCB1c2UgdGhpcyBmaWVsZAorCVVTSE9SVAlEdXJhdGlvbjsKK30JTUVBU1VSRU1FTlRfUkVRVUVTVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUOworCisvLyBCZWFjb24gTWVhc3VyZW1lbnQgUmVwb3J0CisvLyBBbGwgdGhlc2UgZmllbGQgbWlnaHQgY2hhbmdlIHRvIFVDSEFSLCBiZWNhdXNlIHdlIGRpZG4ndCBkbyBhbnl0aGluZyB0byB0aGVzZSByZXBvcnQuCisvLyBXZSBjb3B5IGFsbCB0aGVzZSBiZWFjb25zIGFuZCByZXBvcnQgdG8gQ0NYIDIgQVAuCit0eXBlZGVmCXN0cnVjdAlfQkVBQ09OX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJUGh5VHlwZTsJCQkvLyBEZWZpbmlhdGlvbiBpcyBsaXN0ZWQgYWJvdmUgdGFibGUgMzYtOQorCVVDSEFSCVJ4UG93ZXI7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUGFyZW50VFNGWzRdOworCVVDSEFSCVRhcmdldFRTRls4XTsKKwlVU0hPUlQJQmVhY29uSW50ZXJ2YWw7CisJVVNIT1JUCUNhcGFiaWxpdHlJbmZvOworfQlCRUFDT05fUkVQT1JULCAqUEJFQUNPTl9SRVBPUlQ7CisKKy8vIEZyYW1lIE1lYXN1cmVtZW50IFJlcG9ydCAoT3B0aW9uYWwpCit0eXBlZGVmCXN0cnVjdAlfRlJBTUVfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglUQTsKKwlVQ0hBUglCU1NJRFs2XTsKKwlVQ0hBUglSU1NJOworCVVDSEFSCUNvdW50OworfQlGUkFNRV9SRVBPUlQsICpQRlJBTUVfUkVQT1JUOworCisjcHJhZ21hIHBhY2soMSkKKy8vIENoYW5uZWwgTG9hZCBSZXBvcnQKK3R5cGVkZWYJc3RydWN0CV9DSEFOTkVMX0xPQURfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglDQ0FCdXN5OworfQlDSEFOTkVMX0xPQURfUkVQT1JULCAqUENIQU5ORUxfTE9BRF9SRVBPUlQ7CisjcHJhZ21hIHBhY2soKQorCisvLyBOb3NpZSBIaXN0b2dyYW0gUmVwb3J0Cit0eXBlZGVmCXN0cnVjdAlfTk9JU0VfSElTVF9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCURlbnNpdHlbOF07Cit9CU5PSVNFX0hJU1RfUkVQT1JULCAqUE5PSVNFX0hJU1RfUkVQT1JUOworCisvLyBSYWRpbyBNYW5hZ2VtZW50IENhcGFiaWxpdHkgZWxlbWVudAordHlwZWRlZglzdHJ1Y3QJX1JBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWQl7CisJVUNIQVIJRWlkOwkJCQkvLyBUT0RPOiBXaHkgdGhlIEVpZCBpcyAxIGJ5dGUsIG5vdCBub3JtYWwgMiBieXRlcz8/PworCVVDSEFSCUxlbmd0aDsKKwlVQ0hBUglBaXJvbmV0T3VpWzNdOwkJLy8gQUlyb25ldCBPVUkgKDAwIDQwIDk2KQorCVVDSEFSCVR5cGU7CQkJCS8vIFR5cGUgLyBWZXJzaW9uCisJVVNIT1JUCVN0YXR1czsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCit9CVJBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWSwgKlBSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFk7CisKKy8vIE1lYXN1cmVtZW50IE1vZGUgQml0IGRlZmluaXRpb24KK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9NT0RFCXsKKwlVQ0hBUglSc3ZkOjQ7CisJVUNIQVIJUmVwb3J0OjE7CisJVUNIQVIJTm90VXNlZDoxOworCVVDSEFSCUVuYWJsZToxOworCVVDSEFSCVBhcmFsbGVsOjE7Cit9CU1FQVNVUkVNRU5UX01PREUsICpQTUVBU1VSRU1FTlRfTU9ERTsKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAl7CisJVVNIT1JUCQkJCUVpZDsKKwlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKKwlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgorCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKKwlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCit9CU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQ7CisKKy8vIE1lYXN1cmVtZW50IFJlcG9ydCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXsKKwlVU0hPUlQJCQkJRWlkOworCVVTSE9SVAkJCQlMZW5ndGg7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAorCVVTSE9SVAkJCQlUb2tlbjsJCQkJLy8gbm9uLXplcm8gdW5pcXVlIHRva2VuCisJVUNIQVIJCQkJTW9kZTsJCQkJLy8gTWVhc3VyZW1lbnQgTW9kZQorCVVDSEFSCQkJCVR5cGU7CQkJCS8vIE1lYXN1cmVtZW50IHR5cGUKK30JTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQ7CisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBGcmFtZSBIZWFkZXIsIE5ldHdvcmsgYnl0ZSBvcmRlciB1c2VkCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9JQVBQX0hFQURFUiB7CisJVUNIQVIJQ2lzY29TbmFwSGVhZGVyWzhdOwkvLyA4IGJ5dGVzIENpc2NvIHNuYXAgaGVhZGVyCisJVVNIT1JUCUxlbmd0aDsJCQkJLy8gSUFQUCBJRCAmIGxlbmd0aCwgcmVtZW1iZXIgdG8gc3dhcDE2IGluIExFIHN5c3RlbQorCVVDSEFSCVR5cGU7CQkJCS8vIElBUFAgdHlwZQorCVVDSEFSCVN1YlR5cGU7CQkJLy8gSUFQUCBzdWJ0eXBlCisJVUNIQVIJREFbNl07CQkJCS8vIERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJVUNIQVIJU0FbNl07CQkJCS8vIFNvdXJjZSBNQUMgYWRkcmVzcworCVVTSE9SVAlUb2tlbjsJCQkJLy8gRGlhbG9nIHRva2VuLCBubyBuZWVkIHRvIHN3YXAxNiBzaW5jZSBpdCBpcyBmb3IgeW9rZW4gdXNhZ2Ugb25seQorfQlBSVJPTkVUX0lBUFBfSEVBREVSLCAqUEFJUk9ORVRfSUFQUF9IRUFERVI7CisKKy8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcXVlc3QgZnJhbWUKK3R5cGVkZWYJc3RydWN0CV9BSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCisJVUNIQVIJCQkJRGVsYXk7CQkJLy8gQWN0aXZhdGlvbiBEZWxheQorCVVDSEFSCQkJCU9mZnNldDsJCQkvLyBNZWFzdXJlbWVudCBvZmZzZXQKK30JQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRTsKKworLy8gUmFkaW8gTWVhc3VyZW1lbnQgUmVwb3J0IGZyYW1lCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVBPUlRfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCit9CUFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FOworCisvLyBTYXZlZCBlbGVtZW50IHJlcXVlc3QgYWN0aW9ucyB3aGljaCB3aWxsIHNhdmVkIGluIFN0YUNmZy4KK3R5cGVkZWYJc3RydWN0CV9STV9SRVFVRVNUX0FDVElPTgl7CisJTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UCVJlcUVsZW07CQkvLyBTYXZlZCByZXF1ZXN0IGVsZW1lbnQKKwlNRUFTVVJFTUVOVF9SRVFVRVNUCQkJTWVhc3VyZW1lbnQ7CS8vIFNhdmVkIG1lYXN1cmVtZW50IHdpdGhpbiB0aGUgcmVxdWVzdCBlbGVtZW50Cit9CVJNX1JFUVVFU1RfQUNUSU9OLCAqUFJNX1JFUVVFU1RfQUNUSU9OOworCisvLyBDQ1ggYWRtaW5pc3RyYXRpb24gY29udHJvbAordHlwZWRlZgl1bmlvbglfQ0NYX0NPTlRST0wJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRW5hYmxlOjE7CQkJLy8gRW5hYmxlIENDWDIKKwkJVUlOVDMyCQlMZWFwRW5hYmxlOjE7CQkvLyBFbmFibGUgTEVBUCBhdCBDQ1gyCisJCVVJTlQzMgkJUk1FbmFibGU6MTsJCQkvLyBSYWRpbyBNZWFzdXJlbWVudCBFbmFibGUKKwkJVUlOVDMyCQlEQ1JNRW5hYmxlOjE7CQkvLyBOb24gc2VydmluZyBjaGFubmVsIFJhZGlvIE1lYXN1cmVtZW50IGVuYWJsZQorCQlVSU5UMzIJCVFPU0VuYWJsZToxOwkJLy8gRW5hYmxlIFFPUyBmb3IgQ0NYIDIuMCBzdXBwb3J0CisJCVVJTlQzMgkJRmFzdFJvYW1FbmFibGU6MTsJLy8gRW5hYmxlIGZhc3Qgcm9hbWluZworCQlVSU5UMzIJCVJzdmQ6MjsJCQkJLy8gTm90IHVzZWQKKwkJVUlOVDMyCQlkQm1Ub1JvYW06ODsJCS8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCQlVSU5UMzIJCVR1TGltaXQ6MTY7CQkJLy8gTGltaXQgZm9yIGRpZmZlcmVudCBjaGFubmVsIHNjYW4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNDWF9DT05UUk9MLCAqUENDWF9DT05UUk9MOworCisjZW5kaWYJLy8gX19BSVJPTkVUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmRiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2FwLmgKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDA5LTA2LTIwMDIgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAxMi0yMi0yMDA0ICAgIG1vZGlmaWVkIGZvciBSVDI1NjEvMjY2MS4gbWVyZ2Ugd2l0aCBTVEEgZHJpdmVyCisqLworI2lmbmRlZiBfX0FQX0hfXworI2RlZmluZSBfX0FQX0hfXworCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBSVE1QLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgICAgRnVuY3Rpb24gUHJvdG90eXBlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBhcF9kYXRhLmMKKworQk9PTEVBTiBBUEJyaWRnZVRvV2lyZWxlc3NTdGEoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOICBVTE9ORyAgICAgICAgICAgZnJvbXdkc2lkeCk7CisKK0JPT0xFQU4gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lECUFQU2VuZFBhY2tldHMoCisJSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAorCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpOworCitORElTX1NUQVRVUyBBUFNlbmRQYWNrZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworCitORElTX1NUQVRVUyBBUEhhcmRUcmFuc21pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBBUFJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK05ESVNfU1RBVFVTIEFQQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOCVVDSEFSCQkJV2NpZCk7CisKK0JPT0xFQU4gQVBDaGVja0NsYXNzMkNsYXNzM0Vycm9yKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKKworVk9JRCBBUEhhbmRsZVJ4UHNQb2xsKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBBZGRyLAorCUlOCVVTSE9SVAkJCUFpZCwKKyAgICBJTglCT09MRUFOCQkJaXNBY3RpdmUpOworCitWT0lEICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSk7CisKK1ZPSUQgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEaXIsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBGcm9tUnhEb25lSW50KTsKKworLy8gYXBfYXNzb2MuYworCitWT0lEIEFQQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgIEFQUGVlckFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJSZWFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJEaXNhc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNYnNzS2lja091dFN0YXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIGFwaWR4LAorCUlOIFVTSE9SVCBSZWFzb24pOworCitWT0lEIEFQTWxtZUtpY2tPdXRTdGEoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBTdGFBZGRyLAorCUlOIFVDSEFSIFdjaWQsCisJSU4gVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgQVBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBDbHMzZXJyQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIAlVTE9ORyBXY2lkLAorICAgIElOCVBIRUFERVJfODAyXzExCXBIZWFkZXIpOworCisKK1VTSE9SVCBBUEJ1aWxkQXNzb2NpYXRpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisgICAgSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorICAgIElOIFVDSEFSICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorICAgIElOIFVDSEFSICAqUlNOLAorICAgIElOIFVDSEFSICAqcFJTTkxlbiwKKyAgICBJTiBCT09MRUFOIGJXbW1DYXBhYmxlLAorICAgIElOIFVMT05HICBSYWxpbmtJZSwKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisgICAgSU4gRVhUX0NBUF9JTkZPX0VMRU1FTlQgRXh0Q2FwSW5mbywKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCSBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVTSE9SVCAqcEFpZCk7CisKKy8vIGFwX2F1dGguYworCit2b2lkIEFQQXV0aFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBUE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gCVVMT05HIFdjaWQsCisgICAgSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlcik7CisKKy8vIGFwX2F1dGhyc3AuYworCitWT0lEIEFQQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCisgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQUGVlckF1dGhBdEF1dGhSc3BJZGxlQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckRlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gIFVTSE9SVCBBbGcsCisgICAgSU4gIFVTSE9SVCBTZXEsCisgICAgSU4gIFVTSE9SVCBTdGF0dXNDb2RlKTsKKworLy8gYXBfY29ubmVjdC5jCisKK0JPT0xFQU4gQmVhY29uVHJhbnNtaXRSZXF1aXJlZCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBJTlQJCQkJYXBpZHgpOworCitWT0lEIEFQTWFrZUJzc0JlYWNvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgpOworCitWT0lEICBBUFVwZGF0ZUJlYWNvbkZyYW1lKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCk7CisKK1ZPSUQgQVBNYWtlQWxsQnNzQmVhY29uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgQVBVcGRhdGVBbGxCZWFjb25GcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKKworLy8gYXBfc3luYy5jCisKK1ZPSUQgQVBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBUEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlclByb2JlUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJCZWFjb25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuQ25jbEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFwU2l0ZVN1cnZleSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgU3VwcG9ydFJhdGUoCisJSU4gUFVDSEFSIFN1cFJhdGUsCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBQVUNIQVIgRXh0UmF0ZSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCU9VVCBQVUNIQVIgKlJhdGVzLAorCU9VVCBQVUNIQVIgUmF0ZXNMZW4sCisJT1VUIFBVQ0hBUiBwTWF4U3VwcG9ydFJhdGUpOworCisKK0JPT0xFQU4gQXBTY2FuUnVubmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEFQT3ZlcmxhcHBpbmdCU1NTY2FuKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGFwX3dwYS5jCisKK1ZPSUQgQVBXcGFTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCisvLyBhcF9tbG1lLmMKKworVk9JRCBBUE1sbWVQZXJpb2RpY0V4ZWMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7CisKK1ZPSUQgQVBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7CisKK1ZPSUQgQVBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVBRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gQVBNc2dUeXBlU3Vic3QoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCisgICAgT1VUIElOVCAqTWFjaGluZSwKKyAgICBPVVQgSU5UICpNc2dUeXBlKTsKKworVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitWT0lEIFJUTVBTZXRQaWdneUJhY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQk9PTEVBTgkJCWJQaWdneUJhY2spOworCitWT0lEIEFQQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLyBhcC5jCisKK1ZPSUQgQVBTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBDaGFubmVsKTsKKworTkRJU19TVEFUVVMgQVBJbml0aWFsaXplKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUFNodXRkb3duKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKKworVk9JRCBBUFN0YXJ0VXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBDbGVhbnVwUHNRdWV1ZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFFVRVVFX0hFQURFUiAgIHBRdWV1ZSk7CisKK1ZPSUQgTWFjVGFibGVSZXNldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAorCUlOCVVDSEFSCQkJYXBpZHgsCisJSU4gQk9PTEVBTglDbGVhbkFsbCk7CisKK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUxvb2t1cCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBNYWNUYWJsZU1haW50ZW5hbmNlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUlOVDMyIE1hY1RhYmxlQXNzb2NTdGFOdW1HZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitNQUNfVEFCTEVfRU5UUlkgKkFQU3NQc0lucXVpcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKyAgICBPVVQgU1NUICAgICAgICAgICAgICpTc3QsCisgICAgT1VUIFVTSE9SVCAgICAgICAgICAqQWlkLAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgKlBzTW9kZSwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICpSYXRlKTsKKworQk9PTEVBTiBBUFBzSW5kaWNhdGUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKwlJTiBVTE9ORyBXY2lkLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgUHNtKTsKKworVk9JRCBBcExvZ0V2ZW50KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVVNIT1JUICAgICAgICAgICBFdmVudCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQVBVcGRhdGVPcGVyYXRpb25Nb2RlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBUFVwZGF0ZUNhcGFiaWxpdHlBbmRFcnBJZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gQXBDaGVja0FjY2Vzc0NvbnRyb2xMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIgICAgICAgICBBcGlkeCk7CisKK1ZPSUQgQXBVcGRhdGVBY2Nlc3NDb250cm9sTGlzdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIEFwaWR4KTsKKworVk9JRCBBcEVucXVldWVOdWxsRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUiAgICAgICAgIFR4UmF0ZSwKKwlJTiBVQ0hBUiAgICAgICAgIFBJRCwKKwlJTiBVQ0hBUiAgICAgICAgIGFwaWR4LAorICAgIElOIEJPT0xFQU4gICAgICAgYlFvc051bGwsCisgICAgSU4gQk9PTEVBTiAgICAgICBiRU9TUCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIE9sZFVQKTsKKworVk9JRCBBcFNlbmRGcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFZPSUQgICAgICAgICAgIHBCdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgICAgICBMZW5ndGgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBQSUQpOworCitWT0lEIEFwRW5xdWV1ZUFja0ZyYW1lKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICBUeFJhdGUsCisJSU4gVUNIQVIgICAgICAgICBhcGlkeCk7CisKK1VDSEFSIEFQQXV0b1NlbGVjdENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBPcHRpbWFsKTsKKworLy8gYXBfc2FuaXR5LmMKKworCitCT09MRUFOIFBlZXJBc3NvY1JlcUNtbVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGlzUmVzc29jLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnRlcnZhbCwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVDSEFSICpwU3NpZExlbiwKKyAgICBPVVQgY2hhciAqU3NpZCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKlJTTiwKKyAgICBPVVQgVUNIQVIgKnBSU05MZW4sCisgICAgT1VUIEJPT0xFQU4gKnBiV21tQ2FwYWJsZSwKKyAgICBPVVQgVUxPTkcgICpwUmFsaW5rSWUsCisjaWZkZWYgRE9UMTFOX0RSQUZUMworICAgIE9VVCBFWFRfQ0FQX0lORk9fRUxFTUVOVAkqcEV4dENhcEluZm8sCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJEZWF1dGhSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIEFQUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMSwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpBbGcsCisgICAgT1VUIFVTSE9SVCAqU2VxLAorICAgIE9VVCBVU0hPUlQgKlN0YXR1cywKKyAgICBDSEFSICpDaGxnVGV4dCk7CisKK0JPT0xFQU4gQVBQZWVyUHJvYmVSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpTc2lkTGVuKTsKKworQk9PTEVBTiBBUFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKlNzaWRMZW4sCisgICAgT1VUIFVDSEFSICpCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKkJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKkNoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKlRpbWVzdGFtcCwKKyAgICBPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqUmF0ZUxlbiwKKyAgICBPVVQgQk9PTEVBTiAqRXh0ZW5kZWRSYXRlSWVFeGlzdCwKKyAgICBPVVQgVUNIQVIgKkVycCk7CisKKy8vIGFwX2luZm8uYworCisjaWZkZWYgV0lOX05ESVMKK05ESVNfU1RBVFVTIEFQUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKyAgICBJTiAgTkRJU19PSUQgICAgT2lkLAorICAgIElOICBQVk9JRCAgICAgICBwSW5mb3JtYXRpb25CdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoLAorICAgIE9VVCBQVUxPTkcgICAgICBwQnl0ZXNXcml0dGVuLAorICAgIE9VVCBQVUxPTkcgICAgICBwQnl0ZXNOZWVkZWQpOworCitORElTX1NUQVRVUyBBUFNldEluZm9ybWF0aW9uKAorICAgIElOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorICAgIElOICBORElTX09JRCAgICBPaWQsCisgICAgSU4gIFBWT0lEICAgICAgIHBJbmZvcm1hdGlvbkJ1ZmZlciwKKyAgICBJTiAgVUxPTkcgICAgICAgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgsCisgICAgT1VUIFBVTE9ORyAgICAgIHBCeXRlc1JlYWQsCisgICAgT1VUIFBVTE9ORyAgICAgIHBCeXRlc05lZWRlZCk7CisjZW5kaWYKKworCisvLyA9PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIFJUTVAuaCA9PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjZW5kaWYgIC8vIF9fQVBfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTViOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCkBAIC0wLDAgKzEsMTI5NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljaGxpc3QuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgIDIwMDctMTItMTkgICAgY3JlYXRlZAorKi8KKworI2lmbmRlZiBfX0NITElTVF9IX18KKyNkZWZpbmUgX19DSExJU1RfSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJydG1wX2RlZi5oIgorCisKKyNkZWZpbmUgT0RPUgkJCTAKKyNkZWZpbmUgSURPUgkJCTEKKyNkZWZpbmUgQk9USAkJCTIKKworI2RlZmluZSBCQU5EXzVHICAgICAgICAgMAorI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQorI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7CisJVUNIQVIgRmlyc3RDaGFubmVsOworCVVDSEFSIE51bU9mQ2g7CisJQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KKwlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKKwlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KK30gQ0hfREVTUCwgKlBDSF9ERVNQOworCit0eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKKwlVQ0hBUiBDb3VudFJlZ1szXTsKKwlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2CisJQ0hfREVTUCBDaERlc3BbMTBdOworfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOworCitzdGF0aWMgQ0hfUkVHSU9OIENoUmVnaW9uW10gPQoreworCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKKwkJCSJBRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFyZ2VudGluYQorCQkJIkFSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFydWJhCisJCQkiQVciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBdXN0cmFsaWEKKwkJCSJBVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEF1c3RyaWEKKwkJCSJBVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhaGFtYXMKKwkJCSJCUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhcmJhZG9zCisJCQkiQkIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZXJtdWRhCisJCQkiQk0iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCcmF6aWwKKwkJCSJCUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZWxnaXVtCisJCQkiQkUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJ1bGdhcmlhCisJCQkiQkciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2FuYWRhCisJCQkiQ0EiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDYXltYW4gSXNMYW5kcworCQkJIktZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2hpbGUKKwkJCSJDTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENoaW5hCisJCQkiQ04iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENvbG9tYmlhCisJCQkiQ08iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ29zdGEgUmljYQorCQkJIkNSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ3lwcnVzCisJCQkiQ1kiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDemVjaF9SZXB1YmxpYworCQkJIkNaIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEZW5tYXJrCisJCQkiREsiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKKwkJCSJETyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCisJCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRXF1YWRvcgorCQkJIkVDIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEVsIFNhbHZhZG9yCisJCQkiU1YiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEZpbmxhbmQKKwkJCSJGSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRnJhbmNlCisJCQkiRlIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR2VybWFueQorCQkJIkRFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBHcmVlY2UKKwkJCSJHUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhbQorCQkJIkdVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhdGVtYWxhCisJCQkiR1QiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSGFpdGkKKwkJCSJIVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIb25kdXJhcworCQkJIkhOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEhvbmcgS29uZworCQkJIkhLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEh1bmdhcnkKKwkJCSJIVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJY2VsYW5kCisJCQkiSVMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEluZGlhCisJCQkiSU4iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSW5kb25lc2lhCisJCQkiSUQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXJlbGFuZAorCQkJIklFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXNyYWVsCisJCQkiSUwiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgICAzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MworCQkJCXsgNCwgCTYsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggNH45CisJCQkJeyAxMCwgCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEl0YWx5CisJCQkiSVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKYXBhbgorCQkJIkpQIiwKKwkJCUpBUCwKKwkJCXsKKwkJCQl7IDEsICAgMTQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xNAorCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKb3JkYW4KKwkJCSJKTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAxNDksIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExhdHZpYQorCQkJIkxWIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTGllY2h0ZW5zdGVpbgorCQkJIkxJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExpdGh1YW5pYQorCQkJIkxUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTHV4ZW1idXJnCisJCQkiTFUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNYWxheXNpYQorCQkJIk1ZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWFsdGEKKwkJCSJNVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1hcm9jY28KKwkJCSJNQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNZXhpY28KKwkJCSJNWCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAzMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTmV0aGVybGFuZHMKKwkJCSJOTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5ldyBaZWFsYW5kCisJCQkiTloiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5vcndheQorCQkJIk5PIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUGVydQorCQkJIlBFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvcnR1Z2FsCisJCQkiUFQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvbGFuZAorCQkJIlBMIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBSb21hbmlhCisJCQkiUk8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFJ1c3NpYQorCQkJIlJVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNhdWRpIEFyYWJpYQorCQkJIlNBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNlcmJpYV9hbmRfTW9udGVuZWdybworCQkJIkNTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTaW5nYXBvcmUKKwkJCSJTRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92YWtpYQorCQkJIlNLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92ZW5pYQorCQkJIlNJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNvdXRoIEFmcmljYQorCQkJIlpBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTb3V0aCBLb3JlYQorCQkJIktSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsICA4LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xMjgKKwkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3BhaW4KKwkJCSJFUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3dlZGVuCisJCQkiU0UiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFN3aXR6ZXJsYW5kCisJCQkiQ0giLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBUYWl3YW4KKwkJCSJUVyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVHVya2V5CisJCQkiVFIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVLCisJCQkiR0IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVrcmFpbmUKKwkJCSJVQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX0FyYWJfRW1pcmF0ZXMKKwkJCSJBRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX1N0YXRlcworCQkJIlVTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjQsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFZlbmV6dWVsYQorCQkJIlZFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIERlZmF1bHQKKwkJCSIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCit9OworCitzdGF0aWMgaW5saW5lIFBDSF9SRUdJT04gR2V0Q2hSZWdpb24oCisJSU4gUFVDSEFSIENudHJ5Q29kZSkKK3sKKwlJTlQgbG9vcCA9IDA7CisJUENIX1JFR0lPTiBwQ2hSZWdpb24gPSBOVUxMOworCisJd2hpbGUgKHN0cmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgIiIpICE9IDApCisJeworCQlpZiAoc3RybmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgQ250cnlDb2RlLCAyKSA9PSAwKQorCQl7CisJCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJCQlicmVhazsKKwkJfQorCQlsb29wKys7CisJfQorCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJcmV0dXJuIHBDaFJlZ2lvbjsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENoQmFuZENoZWNrKAorCUlOIFVDSEFSIFBoeU1vZGUsCisJT1VUIFBVQ0hBUiBwQ2hUeXBlKQoreworCXN3aXRjaChQaHlNb2RlKQorCXsKKwkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EXzVHOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EX0JPVEg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnBDaFR5cGUgPSBCQU5EXzI0RzsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSBVQ0hBUiBGaWxsQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBDSF9ERVNQIHBDaERlc3AsCisJSU4gVUNIQVIgT2Zmc2V0LAorCUlOIFVDSEFSIGluY3JlbWVudCkKK3sKKwlJTlQgaSwgaiwgbDsKKwlVQ0hBUiBjaGFubmVsOworCisJaiA9IE9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgcENoRGVzcC0+TnVtT2ZDaDsgaSsrKQorCXsKKwkJY2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCWZvciAobD0wOyBsPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGwrKykKKwkJeworCQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2xdLkNoYW5uZWwpCisJCQl7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlciA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyMiA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGwgPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKKwkJCWNvbnRpbnVlOworCisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uQ2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uTWF4VHhQd3IgPSBwQ2hEZXNwLT5NYXhUeFB3cjsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5EZnNSZXEgPSBwQ2hEZXNwLT5EZnNSZXE7CisJCWorKzsKKwl9CisJcEFkLT5DaGFubmVsTGlzdE51bSA9IGo7CisKKwlyZXR1cm4gajsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENyZWF0ZUNoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQQ0hfUkVHSU9OIHBDaFJlZ2lvbiwKKwlJTiBVQ0hBUiBHZW9ncmFwaHkpCit7CisJSU5UIGk7CisJVUNIQVIgb2Zmc2V0ID0gMDsKKwlQQ0hfREVTUCBwQ2hEZXNwOworCVVDSEFSIENoVHlwZTsKKwlVQ0hBUiBpbmNyZW1lbnQ7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCisJZm9yIChpPTA7IGk8MTA7IGkrKykKKwl7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpCisgICAgICAgIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDE7CisJCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOworICAgICAgICB9CisJfQorfQorCitzdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRDaGFubmVsTGlzdEV4KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBDSF9SRUdJT04gcENoUmVnOworCisJcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKK30KKworc3RhdGljIGlubGluZSBWT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEJ1ZiwKKwlPVVQJUFVMT05HIHBCdWZMZW4pCit7CisJSU5UIGk7CisJVUxPTkcgVG1wTGVuOworCVBDSF9SRUdJT04gcENoUmVnaW9uOworCVBDSF9ERVNQIHBDaERlc3A7CisJVUNIQVIgQ2hUeXBlOworCisJcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKwkqcEJ1ZkxlbiA9IDA7CisKKwlmb3IgKGk9MDsgaTwxMDsgaSsrKQorCXsKKwkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKKwkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKKwkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocEJ1ZiArICpwQnVmTGVuLAkJJlRtcExlbiwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5OdW1PZkNoLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5NYXhUeFB3ciwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJKnBCdWZMZW4gKz0gVG1wTGVuOworCQl9CisJfQorfQorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQorCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGlubGluZSBVQ0hBUiBHZXRFeHRDaCgKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIFVDSEFSIERpcmVjdGlvbikKK3sKKwlDSEFSIEV4dENoOworCisJaWYgKERpcmVjdGlvbiA9PSBFWFRDSEFfQUJPVkUpCisJCUV4dENoID0gQ2hhbm5lbCArIDQ7CisJZWxzZQorCQlFeHRDaCA9IChDaGFubmVsIC0gNCkgPiAwID8gKENoYW5uZWwgLSA0KSA6IDA7CisKKwlyZXR1cm4gRXh0Q2g7Cit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vVUNIQVIgQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07CisJVUNIQVIgQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPT0gQldfNDApKQorCXsKKwkJaWYgKENoYW5uZWwgPiAxNCkKKwkJeworCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkgfHwgKENoYW5uZWwgPT0gNTIpIHx8IChDaGFubmVsID09IDYwKSB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkgfHwKKwkJCSAgICAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpIHx8IChDaGFubmVsID09IDE1NykpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCX0KKwkJCWVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkgfHwgKENoYW5uZWwgPT0gNTYpIHx8IChDaGFubmVsID09IDY0KSB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikgfHwKKwkJCQkJKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpIHx8IChDaGFubmVsID09IDEzNikgfHwgKENoYW5uZWwgPT0gMTUzKSB8fCAoQ2hhbm5lbCA9PSAxNjEpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlVQ0hBUiBFeHRDaDsKKwkJCQlVQ0hBUiBEaXIgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJCWJyZWFrOworCisJCQkJRGlyID0gKERpciA9PSBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDogRVhUQ0hBX0FCT1ZFOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRGlyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfSB3aGlsZShGQUxTRSk7CisKKwkJCWlmIChDaGFubmVsID09IDE0KQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCQkvL3BBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfTk9ORTsJLy8gV2UgZGlkbid0IHNldCB0aGUgRXh0Q2ggYXMgTk9ORSBkdWUgdG8gaXQnbGwgc2V0IGluIFJUTVBTZXRIVCgpCisJCQl9CisjaWYgMAorCQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCisJCQl7CisJCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQorCQkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQkJaWYgKENoYW5uZWwgPD0gNCkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChDaGFubmVsID49IDgpCisJCQkJCXsKKwkJCQkJCWlmICgoQ2hhbm5lbE51bSAtIENoYW5uZWwpIDwgNCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCisJCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCisJCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQorCQkJCQlpZiAoQ2hhbm5lbCA8PSA1KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA9PSA2KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJCQllbHNlIGlmIChDaGFubmVsID49IDcpCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCQlpZiAoQ2hhbm5lbCA8PSA4KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSAxMCkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoJLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworCit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fU2V0Q2VuQ2goCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IDE0KQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKK3N0YXRpYyBpbmxpbmUgVUlOVDggR2V0Q3VudHJ5TWF4VHhQd3IoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIDB4ZmY7CisJZWxzZQorCQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3cjsKK30KKyNlbmRpZiAvLyBfX0NITElTVF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2ZjMwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKQEAgLTAsMCArMSw5MjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJMjg2MF9ydG1wX2luaXQuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQorICAgIEphbiBMZWUgIDIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVTE9ORwkJCVJpbmdCYXNlUGFIaWdoOworCVVMT05HCQkJUmluZ0Jhc2VQYUxvdzsKKwlQVk9JRAkJCVJpbmdCYXNlVmE7CisJSU5UCQkJCWluZGV4LCBudW07CisJUFRYRF9TVFJVQwkJcFR4RDsKKwlQUlhEX1NUUlVDCQlwUnhEOworCVVMT05HCQkJRXJyb3JWYWx1ZSA9IDA7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVBSVE1QX0RNQUJVRglwRG1hQnVmOworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7CisJZG8KKwl7CisJCS8vCisJCS8vIEFsbG9jYXRlIGFsbCByaW5nIGRlc2NyaXB0b3JzLCBpbmNsdWRlIFR4RCwgUnhELCBNZ210RC4KKwkJLy8gQWx0aG91Z2ggZWFjaCBzaXplIGlzIGRpZmZlcmVudCwgdG8gcHJldmVudCBjYWNoZWxpbmUgYW5kIGFsaWdubWVudAorCQkvLyBpc3N1ZSwgSSBpbnRlbnRpb25hbCBzZXQgdGhlbSBhbGwgdG8gNjQgYnl0ZXMuCisJCS8vCisJCWZvciAobnVtPTA7IG51bTxOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJCXsKKwkJCVVMT05HICBCdWZCYXNlUGFIaWdoOworCQkJVUxPTkcgIEJ1ZkJhc2VQYUxvdzsKKwkJCVBWT0lEICBCdWZCYXNlVmE7CisKKwkJCS8vCisJCQkvLyBBbGxvY2F0ZSBUeCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgKDUgVFggcmluZ3MgPSA0IEFDcyArIDEgSENDQSkKKwkJCS8vCisJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJCVJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCisJCQkJcEFkLAorCQkJCW51bSwKKwkJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSA9PSBOVUxMKQorCQkJeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUpOworCisJCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCQkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhOworCisJCQkvLworCQkJLy8gQWxsb2NhdGUgYWxsIDFzdCBUWEJ1ZidzIG1lbW9yeSBmb3IgdGhpcyBUeFJpbmcKKwkJCS8vCisJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOworCQkJUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCisJCQkJcEFkLAorCQkJCW51bSwKKwkJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsCisJCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSA9PSBOVUxMKQorCQkJeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUpOworCisJCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCQlCdWZCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCQkJQnVmQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKKwkJCUJ1ZkJhc2VWYSAgICAgPSBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhOworCisJCQkvLworCQkJLy8gSW5pdGlhbGl6ZSBUeCBSaW5nIERlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQkJLy8KKwkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbbnVtXTsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFRYX1JJTkdfU0laRTsgaW5kZXgrKykKKwkJCXsKKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJCQkvLyBJbml0IFR4IFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7CisJCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOworCisJCQkJLy8gU2V0dXAgVHggQnVmZmVyIHNpemUgJiBhZGRyZXNzLiBvbmx5IDgwMi4xMSBoZWFkZXIgd2lsbCBzdG9yZSBpbiB0aGlzIHNwYWNlCisJCQkJcERtYUJ1ZiA9ICZwVHhSaW5nLT5DZWxsW2luZGV4XS5EbWFCdWY7CisJCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCQlwRG1hQnVmLT5BbGxvY1ZhID0gQnVmQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFIaWdoKTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFMb3cpOworCisJCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKKwkJCQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQkJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcworCQkJCXBUeEQtPkRNQURPTkUgPSAxOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKKworCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCBUeEJ1ZiBhZGRyZXNzCisJCQkJQnVmQmFzZVBhTG93ICs9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQkJQnVmQmFzZVZhID0gKFBVQ0hBUikgQnVmQmFzZVZhICsgVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UmluZ1slZF06IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgbnVtLCBpbmRleCkpOworCQl9CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTKQorCQkJYnJlYWs7CisKKwkJLy8KKwkJLy8gQWxsb2NhdGUgTUdNVCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIKKwkJLy8KKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplID0gTUdNVF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAorCQkJcEFkLAorCQkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJRkFMU0UsCisJCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKworCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKworCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOworCisJCS8vCisJCS8vIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKKwkJLy8KKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUdNVF9SSU5HX1NJWkU7IGluZGV4KyspCisJCXsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQkJLy8gSW5pdCBNR01UIFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFRYRF9TSVpFOworCisJCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRAorCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQlwVHhELT5ETUFET05FID0gMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBubyBwcmUtYWxsb2NhdGVkIGJ1ZmZlciByZXF1aXJlZCBpbiBNZ210UmluZyBmb3Igc2NhdHRlci1nYXRoZXIgY2FzZQorCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1HTVQgUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpbmRleCkpOworCisJCS8vCisJCS8vIEFsbG9jYXRlIFJYIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSBleGNlcHQgVHggcmluZyB3aGljaCBhbGxvY2F0ZWQgZWFyaWxlcgorCQkvLworCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplID0gUlhfUklOR19TSVpFICogUlhEX1NJWkU7CisJCVJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJCQlwQWQsCisJCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJRkFMU0UsCisJCQkmcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsCisJCQkmcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworCisJCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUpOworCisKKwkJcHJpbnRrKCJSWCBERVNDICVwICBzaXplID0gJWxkXG4iLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSk7CisKKwkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgorCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7CisJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvLworCQkvLyBJbml0aWFsaXplIFJ4IFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQkvLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBSWF9SSU5HX1NJWkU7IGluZGV4KyspCisJCXsKKwkJCS8vIEluaXQgUlggUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzCisJCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBSWERfU0laRTsKKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlUGFMb3cgKz0gUlhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFJYRF9TSVpFOworCisJCQkvLyBTZXR1cCBSeCBhc3NvY2lhdGVkIEJ1ZmZlciBzaXplICYgYWxsb2NhdGUgc2hhcmUgbWVtb3J5CisJCQlwRG1hQnVmID0gJnBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1ZjsKKwkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFJYX0JVRkZFUl9BR0dSRVNJWkU7CisJCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAorCQkJCXBBZCwKKwkJCQlwRG1hQnVmLT5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBEbWFCdWYtPkFsbG9jVmEsCisJCQkJJnBEbWFCdWYtPkFsbG9jUGEpOworCisJCQkvKiBrZWVwIGFsbG9jYXRlZCByeCBwYWNrZXQgKi8KKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKworCQkJLy8gRXJyb3IgaGFuZGxpbmcKKwkJCWlmIChwRG1hQnVmLT5BbGxvY1ZhID09IE5VTEwpCisJCQl7CisJCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKKwkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgUnhSaW5nJ3MgMXN0IGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwRG1hQnVmLT5BbGxvY1ZhLCBwRG1hQnVmLT5BbGxvY1NpemUpOworCisJCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAorCQkJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJcFJ4RC0+U0RQMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBEbWFCdWYtPkFsbG9jUGEpOworCQkJcFJ4RC0+RERPTkUgPSAwOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7CisjZW5kaWYKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4IFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKKworCX0Jd2hpbGUgKEZBTFNFKTsKKworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQkvLyBMb2cgZXJyb3IgaW5mb3JhbXRpb24KKwkJTmRpc1dyaXRlRXJyb3JMb2dFbnRyeSgKKwkJCXBBZC0+QWRhcHRlckhhbmRsZSwKKwkJCU5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTLAorCQkJMSwKKwkJCUVycm9yVmFsdWUpOworCX0KKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCisJCWluIFJUTVBfQURBUFRFUiBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisJaW50IGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOworCisJLy8gSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsYXRlZCBzb2Z0d2FyZSBxdWV1ZXMKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldKTsKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10pOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKKworCS8vIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyCisJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKKworCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgorCQlmb3IgKGk9MDsgaTxOVU1fT0ZfVFhfUklORzsgaSsrKQorCQl7CisJCQlwQWQtPlR4UmluZ1tpXS5UeFN3RnJlZUlkeCA9IDA7CisJCQlwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCA9IDA7CisJCX0KKworCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKKwlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKKworCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCAgICAgICA9IDA7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcy4gQ2FsbCBhZnRlciByZXN0IERNQS4gU28gcmVzZXQgVFhfQ1RYX0lEWCB0byB6ZXJvLgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJpbmdDbGVhblVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmluZ1R5cGUpCit7CisJUFRYRF9TVFJVQwkJcFR4RDsKKwlQUlhEX1NUUlVDCQlwUnhEOworCVBRVUVVRV9FTlRSWQlwRW50cnk7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJaW50CQkJCWk7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBSaW5nQ2xlYW5VcChSaW5nSWR4PSVkLCBQZW5kaW5nLU5ESVM9JWxkKVxuIiwgUmluZ1R5cGUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOworCXN3aXRjaCAoUmluZ1R5cGUpCisJeworCQljYXNlIFFJRF9BQ19CSzoKKwkJY2FzZSBRSURfQUNfQkU6CisJCWNhc2UgUUlEX0FDX1ZJOgorCQljYXNlIFFJRF9BQ19WTzoKKwkJY2FzZSBRSURfSENDQToKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUmluZ1R5cGVdOworCisJCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAorCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIC8vIFdlIGhhdmUgdG8gc2NhbiBhbGwgVFggcmluZworCQkJeworCQkJCXBUeEQgID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJCX0KKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKKwkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAorCQkJCWlmIChwUGFja2V0KQorCQkJCXsKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQkJfQorCQkJfQorCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUmluZ1R5cGUgKiAweDEwLCAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0uSGVhZCAhPSBOVUxMKQorCQkJeworCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdKTsKKwkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKKwkJCX0KKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfTUdNVDoKKwkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0CisJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwkJCWZvciAoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisKKwkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCS8vIHJsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKKwkJCQlpZiAocFBhY2tldCkKKwkJCQl7CisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQl9CisJCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0OworCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJfQorCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQl9CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwQWQtPk1nbXRSaW5nLlR4RG1hSWR4KTsKKwkJCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OworCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfUlg6CisJCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAorCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKworCQkJZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJcFJ4RCAgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQkJCXBSeEQtPkRET05FID0gMCA7CisJCQl9CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKwkJCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gcEFkLT5SeFJpbmcuUnhEbWFJZHg7CisJCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9ICgocEFkLT5SeFJpbmcuUnhEbWFJZHggPT0gMCkgPyAoUlhfUklOR19TSVpFLTEpIDogKHBBZC0+UnhSaW5nLlJ4RG1hSWR4LTEpKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCisJSU4gUFZPSUQJaGFuZGxlLAorCU9VVAlQVk9JRAkqcHBBZCkKK3sKKwlQUENJX0RFViBwY2lfZGV2OworCWRtYV9hZGRyX3QJKnBoeV9hZGRyOworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBoYW5kbGU7CisKKwlwY2lfZGV2ID0gcE9iai0+cGNpX2RldjsKKwlwaHlfYWRkciA9ICZwT2JqLT5wQWRfcGE7CisKKwkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsgLy9wY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YoUlRNUF9BREFQVEVSKSwgcGh5X2FkZHIpOworCisJaWYgKCpwcEFkKQorCXsKKwkJTmRpc1plcm9NZW1vcnkoKnBwQWQsIHNpemVvZihSVE1QX0FEQVBURVIpKTsKKwkJKChQUlRNUF9BREFQVEVSKSpwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0gZWxzZSB7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQorCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKwordm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCit2b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCit2b2lkIFJUTVBfRnJlZVJ4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCisJSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworCit2b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIGNvbW1vbiBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICovCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCit7CisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpUENJX0FMTE9DX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOworfQorCitWT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisJaW50IGluZGV4LCBudW0gLCBqOworCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKKwlQVFhEX1NUUlVDCSAgcFR4RDsKKwlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7CisJdW5zaWduZWQgaW50ICBJcnFGbGFnczsKKworCVBPU19DT09LSUUgcE9iaiA9KFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKworCS8vIEZyZWUgVHhTd1F1ZXVlIFBhY2tldAorCWZvciAoaW5kZXg9MDsgaW5kZXggPE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCXsKKwkJUFFVRVVFX0VOVFJZIHBFbnRyeTsKKwkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCVBRVUVVRV9IRUFERVIgICBwUXVldWU7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbaW5kZXhdOworCQl3aGlsZSAocFF1ZXVlLT5IZWFkKQorCQl7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwl9CisKKwkvLyBGcmVlIFR4IFJpbmcgUGFja2V0CisJZm9yIChpbmRleD0wO2luZGV4PCBOVU1fT0ZfVFhfUklORztpbmRleCsrKQorCXsKKwkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tpbmRleF07CisKKwkJZm9yIChqPTA7IGo8IFRYX1JJTkdfU0laRTsgaisrKQorCQl7CisJCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW2pdLkFsbG9jVmEpOworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KQorCQkJeworICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KQorCQkJeworICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCX0KKwl9CisKKwlmb3IgKGluZGV4ID0gUlhfUklOR19TSVpFIC0gMSA7IGluZGV4ID49IDA7IGluZGV4LS0pCisJeworCQlpZiAoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1ZhKSAmJiAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQpKQorCQl7CisJCQlQQ0lfVU5NQVBfU0lOR0xFKHBPYmotPnBjaV9kZXYsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1BhLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCX0KKwlOZGlzWmVyb01lbW9yeShwQWQtPlJ4UmluZy5DZWxsLCBSWF9SSU5HX1NJWkUgKiBzaXplb2YoUlRNUF9ETUFDQikpOworCisJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhKQorICAgIHsKKyAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworICAgIH0KKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKKworCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQorCXsKKwkJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCX0KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcsIHNpemVvZihSVE1QX0RNQUJVRikpOworCisJZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJeworICAgIAlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSkKKwkgICAgeworCSAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCSAgICB9CisJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4QnVmU3BhY2VbbnVtXSwgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7CisKKyAgICAJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEpCisJICAgIHsKKwkgICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkgICAgfQorCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeERlc2NSaW5nW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOworCX0KKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICogTm90ZXM6CisgKiAgICAgQ2FjaGVkIGlzIGlnbm9yZWQ6IGFsd2F5cyBjYWNoZWQgbWVtb3J5CisgKi8KK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBORElTX1BBQ0tFVCBwa3Q7CisKKwlwa3QgPSBSVFBLVF9UT19PU1BLVChERVZfQUxMT0NfU0tCKExlbmd0aCkpOworCisJaWYgKHBrdCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwl9CisKKwlpZiAocGt0KSB7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocGt0LCBQS1RTUkNfTkRJUyk7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgUlRQS1RfVE9fT1NQS1QocGt0KS0+ZGF0YTsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKlZpcnR1YWxBZGRyZXNzLCBMZW5ndGgsIC0xLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0gZWxzZSB7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IChORElTX1BIWVNJQ0FMX0FERFJFU1MpIE5VTEw7CisJfQorCisJcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKK30KKworCitWT0lEIEludmFsaWRfUmVtYWluaW5nX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkgVUxPTkcgVmlydHVhbEFkZHJlc3MpCit7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzczsKKworCVBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKHZvaWQgKikoVmlydHVhbEFkZHJlc3MrMTYwMCksIFJYX0JVRkZFUl9OT1JNU0laRS0xNjAwLCAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKK30KKworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpCit7CisJUFJYRF9TVFJVQwkJCQlwUnhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlQUlhEX1NUUlVDCQkJCXBEZXN0UnhEOworCVJYRF9TVFJVQwkJCQlSeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQJCQlwUnhQYWNrZXQgPSBOVUxMOworCVBORElTX1BBQ0tFVAkJCXBOZXdQYWNrZXQ7CisJUFZPSUQJCQkJCUFsbG9jVmE7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTCUFsbG9jUGE7CisJQk9PTEVBTgkJCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7CisKKwlpZiAoKnBSeFBlbmRpbmcgPT0gMCkKKwl7CisJCS8vIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKworCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpCisJCXsKKwkJCS8vIG5vIG1vcmUgcnggcGFja2V0cworCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8vIGdldCByeCBwZW5kaW5nIGNvdW50CisJCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQorCQkJKnBSeFBlbmRpbmcgPSBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCQllbHNlCisJCQkqcFJ4UGVuZGluZwk9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4ICsgUlhfUklOR19TSVpFIC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7CisKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJcERlc3RSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKKwlSeEQgPSAqcERlc3RSeEQ7CisJcFJ4RCA9ICZSeEQ7CisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7CisjZWxzZQorCS8vIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yCisJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5BbGxvY1ZhOworI2VuZGlmCisKKwlpZiAocFJ4RC0+RERPTkUgPT0gMCkKKwl7CisJCSpwUnhQZW5kaW5nID0gMDsKKwkJLy8gRE1BSW5keCBoYWQgZG9uZSBidXQgRERPTkUgYml0IG5vdCByZWFkeQorCQliUmVzY2hlZHVsZSA9IFRSVUU7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCS8vIHJldHVybiByeCBkZXNjcmlwdG9yCisJTmRpc01vdmVNZW1vcnkocFNhdmVSeEQsIHBSeEQsIFJYRF9TSVpFKTsKKworCXBOZXdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfQUdHUkVTSVpFLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKKworCWlmIChwTmV3UGFja2V0KQorCXsKKwkJLy8gdW5tYXAgdGhlIHJ4IGJ1ZmZlcgorCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jUGEsCisJCQkJCSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwUnhQYWNrZXQgPSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5wTmRpc1BhY2tldDsKKworCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplCT0gUlhfQlVGRkVSX0FHR1JFU0laRTsKKwkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0ucE5kaXNQYWNrZXQJCT0gKFBORElTX1BBQ0tFVCkgcE5ld1BhY2tldDsKKwkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jVmEJPSBBbGxvY1ZhOworCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NQYQk9IEFsbG9jUGE7CisJCS8qIHVwZGF0ZSBTRFAwIHRvIG5ldyBidWZmZXIgb2YgcnggcGFja2V0ICovCisJCXBSeEQtPlNEUDAgPSBBbGxvY1BhOworCX0KKwllbHNlCisJeworCQkvL3ByaW50aygiTm8gUnggQnVmZmVyXG4iKTsKKwkJcFJ4UGFja2V0ID0gTlVMTDsKKwkJYlJlc2NoZWR1bGUgPSBUUlVFOworCX0KKworCXBSeEQtPkRET05FID0gMDsKKworCS8vIGhhZCBoYW5kbGVkIG9uZSByeCBwYWNrZXQKKwkqcFJ4UGVuZGluZyA9ICpwUnhQZW5kaW5nIC0gMTsKKworCS8vIHVwZGF0ZSByeCBkZXNjcmlwdG9yIGFuZCBraWNrIHJ4CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4RCwgVFlQRV9SWEQpOworCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0UnhELCAoUFVDSEFSKXBSeEQsIEZBTFNFLCBUWVBFX1JYRCk7CisjZW5kaWYKKwlJTkNfUklOR19JTkRFWChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCwgUlhfUklOR19TSVpFKTsKKworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID09IDApID8gKFJYX1JJTkdfU0laRS0xKSA6IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeC0xKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7CisKK2RvbmU6CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOworCSpwYlJlc2NoZWR1bGUgPSBiUmVzY2hlZHVsZTsKKwlyZXR1cm4gcFJ4UGFja2V0OworfQorLyogRW5kIG9mIDI4NjBfcnRtcF9pbml0LmMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmY1MzBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMKQEAgLTAsMCArMSwxMDMxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKYW4gTGVlCQkyMDA2CSAgCWNyZWF0ZWQgZm9yIHJ0Mjg2MAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJhY3Rpb24uaCIKKworCitzdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NPQ19JRExFCisgICAgICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICBtbG1lX2Rpc2Fzc29jX3JlcV9hY3Rpb24KKyAgICAgICAgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgIHBlZXJfZGlzYXNzb2NfYWN0aW9uCisgICAgICAgIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICBkcm9wCisgICAgICAgIE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICBkcm9wCisgICAgICAgIE1UMl9DTFMzRVJSICAgICAgICAgICAgICBjbHMzZXJyX2FjdGlvbgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopVHJhbnMsIE1BWF9BQ1RfU1RBVEUsIE1BWF9BQ1RfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFDVF9JRExFLCBBQ1RfTUFDSElORV9CQVNFKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyU3BlY3RydW1BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclFPU0FjdGlvbik7CisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVJlc2VydmVkQWN0aW9uKTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRExTQWN0aW9uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfSFRfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVySFRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFEREJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9QVUJMSUNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHVibGljQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1JNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJNQWN0aW9uKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVFPU0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRExTQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9BQ1RfSU5WQUxJRCwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSW52YWxpZEFjdGlvbik7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgTWxtZUFEREJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAqcEluZm87CisJVUNIQVIgICAgICAgICAgIEFkZHJbNl07CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9BRERCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlCQV9PUklfRU5UUlkJCQkqcEJBRW50cnkgPSBOVUxMOworCisJcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopRWxlbS0+TXNnOworCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpOworCisJaWYoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKQorCXsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCQkvLyAxLiBmaW5kIGVudHJ5CisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCQlpZiAoSWR4ID09IDApCisJCXsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEluZm8tPnBBZGRyKTsKKworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gQUREQkFfUkVROworCQlGcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOworCQlGcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKKwkJRnJhbWUuQmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7CisJCUZyYW1lLkJhUGFybS5CdWZTaXplID0gcEluZm8tPkJhQnVmU2l6ZTsKKwkJRnJhbWUuVG9rZW4gPSBwSW5mby0+VG9rZW47CisJCUZyYW1lLlRpbWVPdXRWYWx1ZSA9IHBJbmZvLT5UaW1lT3V0VmFsdWU7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuRnJhZ051bSA9IDA7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsKKworCQkqKFVTSE9SVCAqKSgmRnJhbWUuQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pKTsKKwkJRnJhbWUuVGltZU91dFZhbHVlID0gY3B1MmxlMTYoRnJhbWUuVGltZU91dFZhbHVlKTsKKwkJRnJhbWUuQmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYoRnJhbWUuQmFTdGFydFNlcS53b3JkKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9BRERCQV9SRVEpLCAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIHNlbmQgREVMQkEgYW5kIGRlbGV0ZSBCYUVudHJ5IGlmIGFueQorICAgIFBhcmFtZXRyczoKKyAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lREVMQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUFVDSEFSCQkgICBwT3V0QnVmZmVyMiA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9ERUxCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlGUkFNRV9CQVIJRnJhbWVCYXI7CisKKwlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKKwlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisKKwlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIFNFTkQgQkFSIChTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIuKQorCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEluZm8tPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuQUNLUG9saWN5ID0gSU1NRURfQkE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5NVElEID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwJICAmRnJhbWVCYXIsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlciBcbiIpKTsKKworCQkvLyBTRU5EIERFTEJBIEZSQU1FCisJCUZyYW1lTGVuID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCWVsc2UKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5WYWxpZEFzRGxzKQorCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkcik7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gREVMQkE7CisJCUZyYW1lLkRlbGJhUGFybS5Jbml0aWF0b3IgPSBwSW5mby0+SW5pdGlhdG9yOworCQlGcmFtZS5EZWxiYVBhcm0uVElEID0gcEluZm8tPlRJRDsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IDM5OyAvLyBUaW1lIE91dAorCQkqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5EZWxiYVBhcm0pKTsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IGNwdTJsZTE2KEZyYW1lLlJlYXNvbkNvZGUpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpLCAgICAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gMyBERUxCQSBzZW50LiBJbml0aWF0b3IoJWQpXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisgICAgCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBNbG1lUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworVk9JRCBNbG1lRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCS8vUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMQorfQorCitWT0lEIFBlZXJRT1NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIFBlZXJETFNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgQUNUSU9OX0RMU19SRVFVRVNUOgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVBlZXJEbHNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCisJCWNhc2UgQUNUSU9OX0RMU19SRVNQT05TRToKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlQZWVyRGxzUnNwQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKworCQljYXNlIEFDVElPTl9ETFNfVEVBUkRPV046CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJUGVlckRsc1RlYXJEb3duQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKwl9Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFEREJBX1JFUToKKwkJCVBlZXJBZGRCQVJlcUFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBBRERCQV9SRVNQOgorCQkJUGVlckFkZEJBUnNwQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIERFTEJBOgorCQkJUGVlckRlbEJBQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCX0KK30KKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFN0YVB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3MyMDQwQ29leGlzdCkKK3sKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0OworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKworCUJzc0NvZXhpc3Qud29yZCA9IEJzczIwNDBDb2V4aXN0OworCS8vIEFQIGFza3MgU3RhdGlvbiB0byByZXR1cm4gYSAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZS4gIFNvIHdlIGZpcnN0IHN0YXJ0cyBhIHNjYW4sIHRoZW4gc2VuZCBiYWNrIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lCisJaWYgKChCc3NDb2V4aXN0LmZpZWxkLkluZm9SZXEgPT0gMSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKSkpCisJeworCQkvLyBDbGVhciByZWNvcmQgZmlyc3QuICBBZnRlciBzY2FuICwgd2lsbCB1cGRhdGUgdGhvc2UgYml0IGFuZCBzZW5kIGJhY2sgdG8gdHJhbnNtaXRlci4KKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW5mb1JlcSA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkludG9sZXJhbnQ0MCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEgPSAwOworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl8yMDQwX0JTU19DT0VYSVNUKTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwl9Cit9CisKKworLyoKK0Rlc2NyaXB0aW9uIDogQnVpbGQgSW50b2xlcmFudCBDaGFubmVsIFJlcnBvdCBmcm9tIFRyaWdnZXIgZXZlbnQgdGFibGUuCityZXR1cm4gOiBob3cgbWFueSBieXRlcyBjb3BpZWQuCisqLworVUxPTkcgQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBQVUNIQVIgIHBEZXN0KQoreworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVMT05HCQkJUmVhZE9mZnNldCA9IDA7CisJVUNIQVIJCQlpOworCVVDSEFSCQkJTGFzdFJlZ0NsYXNzID0gMHhmZjsKKwlQVUNIQVIJCQlwTGVuOworCisJZm9yICggaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9PSBUUlVFKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzcyA9PSBMYXN0UmVnQ2xhc3MpCisJCQl7CisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQpID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ2hhbm5lbDsKKwkJCQkqcExlbisrOworCQkJCVJlYWRPZmZzZXQrKzsKKwkJCQlGcmFtZUxlbisrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUOyAgLy8gSUUKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDEpID0gMjsJLy8gTGVuID0gUmVnQ2xhc3MgYnl0ZSArIGNoYW5uZWwgYnl0ZS4KKwkJCQlwTGVuID0gcERlc3QgKyBSZWFkT2Zmc2V0ICsgMTsKKwkJCQlMYXN0UmVnQ2xhc3MgPSBwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLlJlZ0NsYXNzOworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMikgPSBMYXN0UmVnQ2xhc3M7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAzKSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7CisJCQkJRnJhbWVMZW4gKz0gNDsKKwkJCQlSZWFkT2Zmc2V0ICs9IDQ7CisJCQl9CisKKwkJfQorCX0KKwlyZXR1cm4gRnJhbWVMZW47Cit9CisKKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCAyMC80MCBCU1MgQ29leGlzdGVuY2UgQWN0aW9uIGZyYW1lIElmIG9uZSB0cmlnZ2VyIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyovCitWT0lEIFNlbmQyMDQwQ29leGlzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlVTE9ORwkJCUludG9sZXJhbnRDaGFSZXBMZW47CisKKwlJbnRvbGVyYW50Q2hhUmVwTGVuID0gMDsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9QVUJMSUM7CisJRnJhbWUuQWN0aW9uID0gQUNUSU9OX0JTU18yMDQwX0NPRVhJU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAorCQkJCSAgRU5EX09GX0FSR1MpOworCisJKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKKwlGcmFtZUxlbisrOworCisJaWYgKGJBZGRJbnRvbGVyYW50Q2hhID09IFRSVUUpCisJCUludG9sZXJhbnRDaGFSZXBMZW4gPSBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKHBBZCwgcE91dEJ1ZmZlciArIEZyYW1lTGVuKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiArIEludG9sZXJhbnRDaGFSZXBMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCBCU1NDb2V4aXN0MjA0MCA9IDB4JXggKSAgXG4iLCBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkKSk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJQWZ0ZXIgc2NhbiwgVXBkYXRlIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBJRSBhbmQgc2VuZCBvdXQuCisJQWNjb3JkaW5nIHRvIDgwMi4xMW4gRDMuMDMgMTEuMTQuMTAKKworCVBhcmFtZXRlcnM6CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpCit7CisJQlNTXzIwNDBfQ09FWElTVF9JRQlPbGRWYWx1ZTsKKworCU9sZFZhbHVlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkOworCWlmICgocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID4gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKSkKKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSA9IDE7CisKKwkvLyBOZWVkIHRvIGNoZWNrICEhISEKKwkvLyBIb3cgU1RBIHdpbGwgc2V0IEludG9sZXJhbnQ0MCBpZiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIE5vdyB3ZSBkb24ndCBzZXQgdGhpcyBiaXQgZmlyc3QuISEhISEKKwkvLyBTbyBPbmx5IGNoZWNrIEJTUzIwV2lkdGhSZXEgY2hhbmdlLgorCWlmIChPbGRWYWx1ZS5maWVsZC5CU1MyMFdpZHRoUmVxICE9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEpCisJeworCQlTZW5kMjA0MENvZXhpc3RBY3Rpb24ocEFkLCBXY2lkLCBiQWRkSW50b2xlcmFudENoYSk7CisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpCit7CisJVUNIQVIJCWk7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChOZXdDaGFubmVsID4gNykgJiYgKFNlY29uZGFyeSA9PSAxKSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChOZXdDaGFubmVsIDwgNSkgJiYgKFNlY29uZGFyeSA9PSAzKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gMC4gQ2hlY2sgaWYgbmV3IGNoYW5uZWwgaXMgaW4gdGhlIGNoYW5uZWxsaXN0LgorCWZvciAoaSA9IDA7aSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisKK1ZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQoreworCVVDSEFSCQlCQlBWYWx1ZSA9IDA7CisJVUxPTkcJCU1BQ1ZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTUEVDVFJVTSAtIENoYW5uZWxTd2l0Y2hBY3Rpb24oTmV3Q2hhbm5lbCA9ICVkICwgU2Vjb25kYXJ5ID0gJWQpICBcbiIsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkpOworCisJaWYgKENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjayhwQWQsIFdjaWQsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDIwLgorCWlmIChTZWNvbmRhcnkgPT0gMCkKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEyME1IeiAgICEhISBcbiIgKSk7CisJfQorCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDQwIEFuZCBTdGF0aW9uIHN1cHBvcnRzIEJXID0gNDAuCisJZWxzZSBpZiAoKChTZWNvbmRhcnkgPT0gMSkgfHwgKFNlY29uZGFyeSA9PSAzKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IDEpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisKKwkJaWYgKFNlY29uZGFyeSA9PSAxKQorCQl7CisJCQkvLyBTZWNvbmRhcnkgYWJvdmUuCisJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlICY9IDB4ZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgTUFDVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MTgpOworCQkJQkJQVmFsdWV8PSAoMHgxMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gU2Vjb25kYXJ5IGJlbG93LgorCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAmPSAweGZlOworCQkJTUFDVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlfD0gKDB4MTApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MjApOworCQkJQkJQVmFsdWV8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwkJfQorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFBlZXJQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUOgkvLyBGb3JtYXQgZGVmaW5lZCBpbiBJRUVFIDcuNC43YS4xIGluIDExbiBEcmFmMy4wMworCQkJeworCQkJCS8vVUNIQVIJQnNzQ29leGlzdDsKKwkJCQlCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQJCSpwQ29leGlzdEluZm87CisJCQkJQlNTXzIwNDBfQ09FWElTVF9JRSAJCQkqcEJzc0NvZXhpc3RJZTsKKwkJCQlCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVAkqcEludG9sZXJhbnRSZXBvcnQgPSBOVUxMOworCisJCQkJaWYgKEVsZW0tPk1zZ0xlbiA8PSAoTEVOR1RIXzgwMl8xMSArIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKSApCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBGcmFtZSBsZW5ndGggdG9vIHNob3J0ISBsZW4gPSAlbGQhXG4iLCBFbGVtLT5Nc2dMZW4pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFDVElPTiAtIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBNYW5hZ2VtZW50IGFjdGlvbi0tLS0+IFxuIikpOworCQkJCWhleF9kdW1wKCJDb2V4aXN0ZW5jZU1nbXRGcmFtZSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCisJCQkJcENvZXhpc3RJbmZvID0gKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07CisJCQkJLy9oZXhfZHVtcCgiQ29leGlzdEluZm8iLCAoUFVDSEFSKXBDb2V4aXN0SW5mbywgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOworCQkJCWlmIChFbGVtLT5Nc2dMZW4gPj0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSArIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpKQorCQkJCXsKKwkJCQkJcEludG9sZXJhbnRSZXBvcnQgPSAoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQgKikoKFBVQ0hBUilwQ29leGlzdEluZm8gKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSk7CisJCQkJfQorCQkJCS8vaGV4X2R1bXAoIkludG9sZXJhbnRSZXBvcnQgIiwgKFBVQ0hBUilwSW50b2xlcmFudFJlcG9ydCwgc2l6ZW9mKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUKSk7CisKKwkJCQlwQnNzQ29leGlzdEllID0gKEJTU18yMDQwX0NPRVhJU1RfSUUgKikoJnBDb2V4aXN0SW5mby0+QnNzQ29leGlzdEllKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCQkJeworCQkJCQkJU3RhUHVibGljQWN0aW9uKHBBZCwgcENvZXhpc3RJbmZvKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJfQorCQkJYnJlYWs7CisJfQorCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCit9CisKKworc3RhdGljIFZPSUQgUmVzZXJ2ZWRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSIENhdGVnb3J5OworCisJaWYgKEVsZW0tPk1zZ0xlbiA8PSBMRU5HVEhfODAyXzExKQorCXsKKwkJcmV0dXJuOworCX0KKworCUNhdGVnb3J5ID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7CisJaGV4X2R1bXAoIlJlc2VydmVkIEFjdGlvbiBGcmFtZSIsICZFbGVtLT5Nc2dbMF0sIEVsZW0tPk1zZ0xlbik7Cit9CisKK1ZPSUQgUGVlclJNQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCXJldHVybjsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIFZPSUQgcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW47CisJRlJBTUVfSFRfSU5GTwlIVElORk9mcmFtZSwgKnBGcmFtZTsKKwlVQ0hBUiAgIAkJKnBBZGRyOworCisKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCBSQQorCXBGcmFtZSA9IChGUkFNRV9IVF9JTkZPICopICZFbGVtLT5Nc2dbMF07CisJcEFkZHIgPSBwRnJhbWUtPkhkci5BZGRyMjsKKworCU5kaXNaZXJvTWVtb3J5KCZIVElORk9mcmFtZSwgc2l6ZW9mKEZSQU1FX0hUX0lORk8pKTsKKwkvLyAyLTEuIFByZXBhcmUgQUREQkEgUmVzcG9uc2UgZnJhbWUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUhUSU5GT2ZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJSFRJTkZPZnJhbWUuQWN0aW9uID0gSFRfSU5GT19FWENIQU5HRTsKKwlIVElORk9mcmFtZS5IVF9JbmZvLlJlcXVlc3QgPSAwOworCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OworCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGgJID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJCSZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfSFRfSU5GTyksCSZIVElORk9mcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgIFdjaWQsCisJSU4gVUNIQVIgYXBpZHgpCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgCU5TdGF0dXM7CisJRlJBTUVfQUNUSU9OX0hEUglGcmFtZTsKKwlVTE9ORwkJCUZyYW1lTGVuOworCVBVQ0hBUgkJCXBBZGRyMTsKKworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmROb3RpZnlCV0FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCQlwQWRkcjEgPSAmQlJPQURDQVNUX0FERFJbMF07CisJZWxzZQorCQlwQWRkcjEgPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHI7CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZGRyMSwgcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkLCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQpOworCisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKKwlGcmFtZS5BY3Rpb24gPSBOT1RJRllfQldfQUNUSU9OOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKworCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKKwlGcmFtZUxlbisrOworCisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUIC0gU2VuZE5vdGlmeUJXQWN0aW9uKE5vdGlmeUJXPSAlZCkhXG4iLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGgpKTsKKworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCitWT0lEIFBlZXJIVEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgTk9USUZZX0JXX0FDVElPTjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgTm90aWZ5IENoYW5uZWwgYmFuZHdpZHRoIGFjdGlvbi0tLS0+IFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJaWYocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQl7CisJCQkJLy8gTm90ZSwgdGhpcyBpcyB0byBwYXRjaCBESVItMTM1MyBBUC4gV2hlbiB0aGUgQVAgc2V0IHRvIFdlcCwgaXQgd2lsbCB1c2UgbGVnYWN5IG1vZGUuIEJ1dCBBUCBzdGlsbCBrZWVwcworCQkJCS8vIHNlbmRpbmcgQldfTm90aWZ5IEFjdGlvbiBmcmFtZSwgYW5kIGNhdXNlIHVzIHRvIGxpbmt1cCBhbmQgbGlua2Rvd24uCisJCQkJLy8gSW4gbGVnYWN5IG1vZGUsIGRvbid0IG5lZWQgdG8gcGFyc2UgSFQgYWN0aW9uIGZyYW1lLgorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC1JZ25vcmUgSFQgTm90aWZ5IENoYW5uZWwgQlcgd2hlbiBsaW5rIGFzIGxlZ2FjeSBtb2RlLiBCVyA9ICVkLS0tPiBcbiIsCisJCQkJCQkJCUVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdICkpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQlpZiAoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gPT0gMCkJLy8gNy40LjguMi4gaWYgdmFsdWUgaXMgMSwga2VlcCB0aGUgc2FtZSBhcyBzdXBwb3J0ZWQgY2hhbm5lbCBiYW5kd2lkdGguCisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCisJCQlicmVhazsKKwkJY2FzZSBTTVBTX0FDVElPTjoKKwkJCS8vIDcuMy4xLjI1CisgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOworCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCQl9CisJCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKKwkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KKwkJCWJyZWFrOworCisJCWNhc2UgU0VUUENPX0FDVElPTjoKKwkJCWJyZWFrOworCQljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgorCQkJYnJlYWs7CisJCWNhc2UgSFRfSU5GT19FWENIQU5HRToKKwkJCXsKKwkJCQlIVF9JTkZPUk1BVElPTl9PQ1RFVAkqcEhUX2luZm87CisKKwkJCQlwSFRfaW5mbyA9IChIVF9JTkZPUk1BVElPTl9PQ1RFVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07CisgICAgCQkJCS8vIDcuNC44LjEwCisgICAgCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgSW5mb3JtYXRpb24gRXhjaGFuZ2UgYWN0aW9uLS0tLT4gXG4iKSk7CisgICAgCQkJCWlmIChwSFRfaW5mby0+UmVxdWVzdCkKKyAgICAJCQkJeworICAgIAkJCQkJcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24ocEFkLCBFbGVtKTsKKyAgICAJCQkJfQorCQkJfQorICAgIAkJCWJyZWFrOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE9SSUJBVGltZXJUaW1lb3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5OworCUlOVAkJCWksIHRvdGFsOworCVVDSEFSCQkJVElEOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCXRvdGFsID0gcEFkLT5NYWNUYWIuU2l6ZSAqIE5VTV9PRl9USUQ7CisKKwlmb3IgKGkgPSAxOyAoKGkgPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSAmJiAodG90YWwgPiAwKSkgOyBpKyspCisJeworCQlpZiAgKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkXTsKKwkJCVRJRCA9IHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLlRJRDsKKworCQkJQVNTRVJUKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7CisJCX0KKwkJdG90YWwgLS07CisJfQorfQorCisKK1ZPSUQgU2VuZFJlZnJlc2hCQVIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpCit7CisJRlJBTUVfQkFSCQlGcmFtZUJhcjsKKwlVTE9ORwkJCUZyYW1lTGVuOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVTSE9SVAkJCVNlcXVlbmNlOworCVVDSEFSCQkJaSwgVElEOworCVVTSE9SVAkJCWlkeDsKKwlCQV9PUklfRU5UUlkJKnBCQUVudHJ5OworCisJZm9yIChpID0gMDsgaSA8TlVNX09GX1RJRDsgaSsrKQorCXsKKwkJaWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtpXTsKKwkJaWYgKGlkeCA9PSAwKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpZHhdOworCisJCWlmICAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlUSUQgPSBwQkFFbnRyeS0+VElEOworCisJCQlBU1NFUlQocEJBRW50cnktPldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7CisKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlTZXF1ZW5jZSA9IHBFbnRyeS0+VHhTZXFbVElEXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEVudHJ5LT5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgorCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBTZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IFRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCWlmICgxKQkvLyBOb3cgd2UgYWx3YXlzIHNlbmQgQkFSLgorCQkJeworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJfQorCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpCit7CisgICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisgICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CisKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKK30KKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSkKK3sKKwlOZGlzWmVyb01lbW9yeShwQ250bEJhciwgc2l6ZW9mKEZSQU1FX0JBUikpOworCXBDbnRsQmFyLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQ250bEJhci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQkxPQ0tfQUNLX1JFUTsKKyAgIAlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5BQ0tQb2xpY3kgPSAwOworCisKKwlwQ250bEJhci0+RHVyYXRpb24gPSAxNiArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzEsIHNpemVvZihGUkFNRV9CQSkpOworCisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjEsIHBEQSk7CisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjIsIHBTQSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlIGludG8gdGhlIGFjdGlvbiBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gY2F0ZWdvcnkgY29kZSBvZiB0aGUgZnJhbWUuCisJCTQuIGFjdGlvbiBjb2RlIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnNlcnRBY3RGaWVsZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDYXRlZ29yeSwKKwlJTiBVSU5UOCBBY3RDb2RlKQoreworCVVMT05HIFRlbXBMZW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZSgJcEZyYW1lQnVmLAkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkmQWN0Q29kZSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzODc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisKKyNpZm5kZWYJX19BQ1RJT05fSF9fCisjZGVmaW5lCV9fQUNUSU9OX0hfXworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19IVF9JTkZPX09DVEVUCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlc2VydmVkOjU7CisJVUNIQVIgCVNUQV9DaGFubmVsX1dpZHRoOjE7CisJVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKKwlVQ0hBUglSZXF1ZXN0OjE7CisjZWxzZQorCVVDSEFSCVJlcXVlc3Q6MTsKKwlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCVVDSEFSIAlTVEFfQ2hhbm5lbF9XaWR0aDoxOworCVVDSEFSCVJlc2VydmVkOjU7CisjZW5kaWYKK30gSFRfSU5GT1JNQVRJT05fT0NURVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTworeworCUhFQURFUl84MDJfMTEgICAJCUhkcjsKKwlVQ0hBUgkJCQkJQ2F0ZWdvcnk7CisJVUNIQVIJCQkJCUFjdGlvbjsKKwlIVF9JTkZPUk1BVElPTl9PQ1RFVAlIVF9JbmZvOworfSAgIEZSQU1FX0hUX0lORk8sICpQRlJBTUVfSFRfSU5GTzsKKworI2VuZGlmIC8qIF9fQUNUSU9OX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYmFfYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0N2FlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC0wLDAgKzEsMTgwMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworCisjZGVmaW5lIEJBX09SSV9JTklUX1NFUQkJKHBFbnRyeS0+VHhTZXFbVElEXSkgLy8xCQkJLy8gaW5pdGFsIHNlcXVlbmNlIG51bWJlciBvZiBCQSBzZXNzaW9uCisKKyNkZWZpbmUgT1JJX1NFU1NJT05fTUFYX1JFVFJZCTgKKyNkZWZpbmUgT1JJX0JBX1NFU1NJT05fVElNRU9VVAkoMjAwMCkJLy8gbXMKKyNkZWZpbmUgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUCSgxMDAwKQkvLyBtcworCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKyNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKworI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQorCitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7CisKKworQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKKwkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOworCitCQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7CisKK1ZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitCVUlMRF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpOworCisjZGVmaW5lIEFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKF9wQWQsIF9tcGR1X2JsaykJXAorCQkJQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoX3BBZCwgX21wZHVfYmxrKTsKKworVk9JRCBCQV9NYXhXaW5TaXplUmVhc2lnbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnlQZWVyLAorCU9VVCBVQ0hBUgkJCSpwV2luU2l6ZSkKK3sKKwlVQ0hBUiBNYXhTaXplOworCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKQorCQl7CisJCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkJTWF4U2l6ZSA9IDc7IC8vIGZvciBub24tb3BlbiBtb2RlCisJCQllbHNlCisJCQkJTWF4U2l6ZSA9IDEzOworCQl9CisJCWVsc2UKKwkJCU1heFNpemUgPSAzMTsKKwl9CisJZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKKwl7CisJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQllbHNlCisJCQlNYXhTaXplID0gMTM7CisJfQorCWVsc2UKKwkJTWF4U2l6ZSA9IDc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKKwkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCisJaWYgKCgqcFdpblNpemUpID4gTWF4U2l6ZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiByZWFzc2lnbiBtYXggd2luIHNpemUgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQkqcFdpblNpemUsIE1heFNpemUpKTsKKworCQkqcFdpblNpemUgPSBNYXhTaXplOworCX0KK30KKwordm9pZCBBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCQkJCQkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSptcGR1KQoreworCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCisJcFBhY2tldCA9IG1wZHUtPnBQYWNrZXQ7CisKKwlpZiAobXBkdS0+YkFNU0RVKQorCXsKKwkJQVNTRVJUKDApOworCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKKwkJLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworLyoKKyAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCit7CisKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICoqcHBTY2FuID0gJmxpc3QtPm5leHQ7CisKKwl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKQorCXsKKwkJaWYgKFNFUV9TTUFMTEVSKCgqcHBTY2FuKS0+U2VxdWVuY2UsIG1wZHUtPlNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQlwcFNjYW4gPSAmKCpwcFNjYW4pLT5uZXh0OworCQl9CisJCWVsc2UgaWYgKCgqcHBTY2FuKS0+U2VxdWVuY2UgPT0gbXBkdS0+U2VxdWVuY2UpCisJCXsKKwkJCS8qIGdpdmUgdXAgdGhpcyBkdXBsaWNhdGVkIGZyYW1lICovCisJCQlyZXR1cm4oRkFMU0UpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogZmluZCBwb3NpdGlvbiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltcGR1LT5uZXh0ID0gKnBwU2NhbjsKKwkqcHBTY2FuID0gbXBkdTsKKwlsaXN0LT5xbGVuKys7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQoreworCWxpc3QtPnFsZW4rKzsKKwltcGR1X2Jsay0+bmV4dCA9IGxpc3QtPm5leHQ7CisJbGlzdC0+bmV4dCA9IG1wZHVfYmxrOworfQorCisvKgorICogY2FsbGVyIGxvY2sgY3JpdGljYWwgc2VjdGlvbiBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICogYmFfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrID0gTlVMTDsKKworCUFTU0VSVChsaXN0KTsKKworCQlpZiAobGlzdC0+cWxlbikKKwkJeworCQkJbGlzdC0+cWxlbi0tOworCQkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OworCQkJaWYgKG1wZHVfYmxrKQorCQkJeworCQkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCQltcGR1X2Jsay0+bmV4dCA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gbXBkdV9ibGs7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3sKKwlyZXR1cm4oYmFfZGVxdWV1ZShsaXN0KSk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCisJeworCUFTU0VSVChsaXN0KTsKKworCQlyZXR1cm4obGlzdC0+bmV4dCk7CisJfQorCisKKy8qCisgKiBmcmVlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkFfVEFCTEUgICAgICAgICpUYWI7CisJUEJBX1JFQ19FTlRSWSAgIHBCQUVudHJ5OworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCWludCBpOworCisJVGFiID0gJnBBZC0+QkFUYWJsZTsKKworCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSAmVGFiLT5CQVJlY0VudHJ5W2ldOworCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCisJCXsKKwkJCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwkJCXsKKwkJCQlBU1NFUlQobXBkdV9ibGstPnBQYWNrZXQpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJCX0KKwkJfQorCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwkvKiBJSS4gZnJlZSBtZW1vcnkgb2YgcmVvcmRlcmluZyBtcGR1IHRhYmxlICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworfQorCisKKworLyoKKyAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pCit7CisJaW50ICAgICBpOworCVBVQ0hBUiAgbWVtOworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OworCisJLyogYWxsb2NhdGUgc3BpbmxvY2sgKi8KKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCisJLyogaW5pdGlhbGl6ZSBmcmVlbGlzdCAqLworCWZyZWVsaXN0ID0gJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdDsKKwlmcmVlbGlzdC0+bmV4dCA9IE5VTEw7CisJZnJlZWxpc3QtPnFsZW4gPSAwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgJWQgbWVtb3J5IGZvciBCQSByZW9yZGVyaW5nXG4iLCAoVUlOVDMyKShudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSkpOworCisJLyogYWxsb2NhdGUgbnVtYmVyIG9mIG1wZHVfYmxrIG1lbW9yeSAqLworCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbWVtLCAobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpOworCisJcEFkLT5tcGR1X2Jsa19wb29sLm1lbSA9IG1lbTsKKworCWlmIChtZW0gPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgQkEgUmVvcmRlcmluZ1xuIikpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLworCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCXsKKwkJLyogZ2V0IG1wZHVfYmxrICovCisJCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOworCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCisJCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOworCQkvKiBuZXh0IG1wZHVfYmxrICovCisJCW1lbSArPSBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSk7CisJCS8qIGluc2VydCBtcGR1X2JsayBpbnRvIGZyZWVsaXN0ICovCisJCWJhX2VucXVldWUoZnJlZWxpc3QsIG1wZHVfYmxrKTsKKwl9CisKKwlyZXR1cm4oVFJVRSk7Cit9CisKKy8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKworc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW1wZHVfYmxrID0gYmFfZGVxdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0KTsKKwlpZiAobXBkdV9ibGspCisJeworLy8JCWJsa19jb3VudCsrOworCQkvKiByZXNldCBtcGR1X2JsayAqLworCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCXJldHVybiBtcGR1X2JsazsKK30KKworc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCit7CisJQVNTRVJUKG1wZHVfYmxrKTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKy8vCWJsa19jb3VudC0tOworCWJhX2VucXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCwgbXBkdV9ibGspOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKK30KKworCitzdGF0aWMgVVNIT1JUIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoCisJCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFN0YXJ0U2VxKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCVVTSE9SVCAgTGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpCisJCXsKKwkJCS8qIGZpbmQgaW4tb3JkZXIgZnJhbWUgKi8KKwkJaWYgKCFTRVFfU1RFUE9ORShtcGR1X2Jsay0+U2VxdWVuY2UsIFN0YXJ0U2VxLCBNQVhTRVEpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCS8qIG1vdmUgdG8gbmV4dCBzZXF1ZW5jZSAqLworCQkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKKwkJLyogZnJlZSBtcGR1X2JsayAqLworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCXJldHVybiBMYXN0SW5kU2VxOworfQorCitzdGF0aWMgdm9pZCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcSgKKwkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU2VxdWVuY2UpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQorCQl7CisJCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKSB8fCBTRVFfU01BTExFUihtcGR1X2Jsay0+U2VxdWVuY2UsIFNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKKwkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCQkvKiBmcmVlIG1wZHVfYmxrICovCisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQl9CisJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKAorCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkgICBQQkFfUkVDX0VOVFJZICAgICAgIHBCQUVudHJ5KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwl7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCisJCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCX0KKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworLy9zdGF0aWMKK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAorCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKKworeworCVVTSE9SVCBTZXF1ZW5jZTsKKworLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCisvLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAorLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKKy8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCisJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQorCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCisJCSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAorCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKwkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJfQorCWVsc2UKKwlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCisJCSYmIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkKKwkgICApCisJCXsKKy8vCQlwcmludGsoInRpbWVvdXRbJWRdICglbHgtJWx4ID0gJWQgPiAlZCk6ICV4LCAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisvLwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKy8vCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpOworICAgIAkJLy8KKwkJLy8gZm9yY2UgTGFzdEluZFNlcSB0byBzaGlmdCB0byBMYXN0SW5kU2VxKzEKKyAgICAJCS8vCisgICAgCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSsxKSAmIE1BWFNFUTsKKyAgICAJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKyAgICAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKyAgICAJCS8vCisgICAgCQkvLyBpbmRpY2F0ZSBpbi1vcmRlciBtcGR1cworICAgIAkJLy8KKyAgICAJCVNlcXVlbmNlID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisgICAgCQlpZiAoU2VxdWVuY2UgIT0gUkVTRVRfUkNWX1NFUSkKKyAgICAJCXsKKyAgICAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworICAgIAkJfQorCisJCS8vcHJpbnRrKCIleCwgZmx1c2ggb25lIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCisJfQorI2lmIDAKKwllbHNlIGlmICgKKwkJCSAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKSAmJgorCQkJICAocEJBRW50cnktPmxpc3QucWxlbiA+IDEpKQorCQkJKQorCQl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCVseC0lbHggPSAlZCA+ICVkKTogJXhcbiAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisJCQkgICAoaW50KSgobG9uZykgTm93MzIgLSAobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAorCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCQkJfQorI2VuZGlmCit9CisKKworLyoKKyAqIGdlbmVyYXRlIEFEREJBIHJlcXVlc3QgdG8KKyAqIHNldCB1cCBCQSBhZ3JlZW1lbnQKKyAqLworVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQkJCSAgSU4gVUNIQVIgICAgICAgICAgICBUSUQsCisJCQkJCSAgSU4gVVNIT1JUICAgICAgICAgICBUaW1lT3V0LAorCQkJCQkgIElOIFVMT05HICAgICAgICAgICAgRGVsYXlUaW1lLAorCQkJCQkgIElOIEJPT0xFQU4gICAgICAgICAgaXNGb3JjZWQpCisKK3sKKwkvL01MTUVfQUREQkFfUkVRX1NUUlVDVAlBZGRiYVJlcTsKKwlCQV9PUklfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOworCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgIT0gVFJVRSkgICYmICAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCQlyZXR1cm47CisKKwkvLyBpZiB0aGlzIGVudHJ5IGlzIGxpbWl0ZWQgdG8gdXNlIGxlZ2FjeSB0eCBtb2RlLCBpdCBkb2Vzbid0IGdlbmVyYXRlIEJBLgorCWlmIChSVE1QU3RhRml4ZWRUeE1vZGUocEFkLCBwRW50cnkpICE9IEZJWEVEX1RYTU9ERV9IVCkKKwkJcmV0dXJuOworCisJaWYgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxUSUQpKSAmJiAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCXsKKwkJLy8gdHJ5IGFnYWluIGFmdGVyIDMgc2VjcworCQlEZWxheVRpbWUgPSAzMDAwOworLy8JCXByaW50aygiRGVDbGluZSBCQSBmcm9tIFBlZXJcbiIpOworLy8JCXJldHVybjsKKwl9CisKKworCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJeworCQkvLyBhbGxvY2F0ZSBhIEJBIHNlc3Npb24KKwkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOworCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwl9CisKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQorCXsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXSA9IElkeDsKKworCS8vIEluaXRpYWxpemUgQkEgc2Vzc2lvbgorCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9XYWl0UmVzOworCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CisJcEJBRW50cnktPkJBV2luU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CisJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROworCXBCQUVudHJ5LT5Ub2tlbiA9IDE7CS8vICgyMDA4LTAxLTIxKSBKYW4gTGVlIHJlY29tbWVuZHMgaXQgLSB0aGlzIHRva2VuIGNhbid0IGJlIDAKKwlwQkFFbnRyeS0+VElEID0gVElEOworCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBUaW1lT3V0OworCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKworCWlmICghKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxUSUQpKSkKKwl7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPk9SSUJBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpLCBwQkFFbnRyeSwgRkFMU0UpOworCX0KKwllbHNlCisJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJLy8gc2V0IHRpbWVyIHRvIHNlbmQgQUREQkEgcmVxdWVzdAorCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIERlbGF5VGltZSk7Cit9CisKK1ZPSUQgQkFPcmlTZXNzaW9uQWRkKAorCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCUlOIFBGUkFNRV9BRERCQV9SU1AgcEZyYW1lKQoreworCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKwlVQ0hBUiAgICAgICAgIFRJRDsKKwlVU0hPUlQgICAgICAgIElkeDsKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKKwlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7CisKKwlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CisJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCisJeworCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOworCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOworCisJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7CisJCS8vIHJlc2V0IHNlcXVlbmNlIG51bWJlcgorCQlwQkFFbnRyeS0+U2VxdWVuY2UgPSBCQV9PUklfSU5JVF9TRVE7CisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5UWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJCXBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUgPSAwOwkvL3BGcmFtZS0+VGltZU91dFZhbHVlOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLCBfX0ZVTkNUSU9OX18sIHBFbnRyeS0+VFhCQWJpdG1hcCwKKwkJCQkJCQkJIHBCQUVudHJ5LT5CQVdpblNpemUsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpKTsKKworCQkvLyBTRU5EIEJBUiA7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gQkFPcmlTZXNzaW9uQWRkKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOwkvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQkFFbnRyeS0+U2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBCQUVudHJ5LT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksICAgICAgJkZyYW1lQmFyLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcjIpOworCisKKwkJaWYgKHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpCisJCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKTsgLy8gaW4gbVNlYworCX0KK30KKworQk9PTEVBTiBCQVJlY1Nlc3Npb25BZGQoCisJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQkJCSAgIElOIFBGUkFNRV9BRERCQV9SRVEgcEZyYW1lKQoreworCUJBX1JFQ19FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgU3RhdHVzID0gVFJVRTsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OworCVVDSEFSICAgICAgICAgICAgICAgICAgIFRJRDsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCQVdpblNpemU7CisJLy9VSU5UMzIgICAgICAgICAgICAgICAgICBWYWx1ZTsKKwkvL1VJTlQgICAgICAgICAgICAgICAgICAgIG9mZnNldDsKKworCisJQVNTRVJUKHBFbnRyeSk7CisKKwkvLyBmaW5kIFRJRAorCVRJRCA9IHBGcmFtZS0+QmFQYXJtLlRJRDsKKworCUJBV2luU2l6ZSA9IG1pbigoKFVDSEFSKXBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisKKwkvLyBJbnRlbCBwYXRjaAorCWlmIChCQVdpblNpemUgPT0gMCkKKwl7CisJCUJBV2luU2l6ZSA9IDY0OworCX0KKworCUlkeCA9IHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXTsKKworCisJaWYgKElkeCA9PSAwKQorCXsKKwkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NSZWNFbnRyeShwQWQsICZJZHgpOworCX0KKwllbHNlCisJeworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzKCVsZCk6IElkeCA9ICVkLCBCQVdpblNpemUocmVxICVkKSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgSWR4LAorCQkJCQkJCSBwRnJhbWUtPkJhUGFybS5CdWZTaXplLCBCQVdpblNpemUpKTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAocEJBRW50cnkgIT0gTlVMTCkKKwl7CisJCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOworCisJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X0hhbmRsZVJlczsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9IEJBV2luU2l6ZTsKKwkJcEJBRW50cnktPldjaWQgPSBwRW50cnktPkFpZDsKKwkJcEJBRW50cnktPlRJRCA9IFRJRDsKKwkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9BY2NlcHQ7CisJCS8vIGluaXRpYWwgc2VxdWVuY2UgbnVtYmVyCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsgLy9wRnJhbWUtPkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXE7CisKKwkJcHJpbnRrKCJTdGFydCBTZXEgPSAlMDh4XG4iLCAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKTsKKworCQlpZiAocEVudHJ5LT5SWEJBYml0bWFwICYgKDE8PFRJRCkpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+UkVDQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KSwgcEJBRW50cnksIFRSVUUpOworCQl9CisKKyNpZiAwCS8vIGZvciBkZWJ1Z2dpbmcKKwkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKTsKKyNlbmRpZgorCisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5SWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0gPSBJZHg7CisKKwkJcEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJj0gfigxPDxUSUQpOworCisJCS8vIFNldCBCQSBzZXNzaW9uIG1hc2sgaW4gV0NJRCB0YWJsZS4KKwkJUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKKwkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKKwl9CisJZWxzZQorCXsKKwkJU3RhdHVzID0gRkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKKwkJCQlQUklOVF9NQUMocEVudHJ5LT5BZGRyKSwgVElEKSk7CisJfQorCXJldHVybihTdGF0dXMpOworfQorCisKK0JBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKKwl7CisJCXByaW50aygiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAorCQkJTUFYX0JBUkVDSV9TRVNTSU9OKTsKKwkJZ290byBkb25lOworCX0KKworCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQorCWZvciAoaT0xOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQrKzsKKwkJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X1VTRUQ7CisJCQkqSWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlyZXR1cm4gcEJBRW50cnk7Cit9CisKK0JBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgPj0gKE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwl7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXTsKKwkJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKys7CisJCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfVVNFRDsKKwkJCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKwkJCSpJZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2RvbmU6CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCXJldHVybiBwQkFFbnRyeTsKK30KKworCitWT0lEIEJBVGFibGVGcmVlT3JpRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKwkJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CisKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJIAlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpICkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJfQorCisJCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yICE9IDApOworCisJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKKworCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwkJcEJBRW50cnktPlRva2VuID0gMDsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKworCitWT0lEIEJBVGFibGVGcmVlUmVjRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCAhPSAwKTsKKworCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgLT0gMTsKKworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJfQorfQorCisKK1ZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlLAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJGb3JjZVNlbmQpCit7CisJVUxPTkcgICAgICAgICAgIElkeCA9IDA7CisJQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeTsKKwlCT09MRUFOICAgICAgICAgQ2FuY2VsbGVkOworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgorCS8vCisJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQU9yaVdjaWRBcnJheVtUSURdOworCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQorCXsKKwkJaWYgKGJGb3JjZVNlbmQgPT0gVFJVRSkKKwkJeworCQkJLy8gZm9yY2Ugc2VuZCBzcGVjaWZpZWQgVElEIERlbEJBCisJCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IFRJRDsKKwkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7CisjaWYgMQorCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKKworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKKwkvLworCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgorCS8vCisJaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkKKwl7CisJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOworCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7CisKKwkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKKwkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKKyNpZiAxCisJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKyNlbmRpZgorCX0KKwlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgSWR4KTsKKworCWlmIChiUGFzc2l2ZSkKKwl7CisJCS8vQkFPcmlTZXNzaW9uU2V0VXAocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgVElELCAwLCAxMDAwMCwgVFJVRSk7CisJfQorfQorCitWT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSkKK3sKKwlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KKwkvLworCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX0ZVTkNUSU9OX18sIFdjaWQsIFRJRCkpOworCisKKwlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgUkVDX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzKSk7CisJLy8KKwkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KKwkvLworCWlmICgoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKKwl7CisJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOworCQlCT09MRUFOIAkJCQlDYW5jZWxsZWQ7CisJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkvL1VMT05HICAgb2Zmc2V0OworCQkvL1VJTlQzMiAgVkFMVUU7CisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJLy8KKwkJLy8gMS4gU2VuZCBERUxCQSBBY3Rpb24gRnJhbWUKKwkJLy8KKwkJaWYgKGJQYXNzaXZlID09IEZBTFNFKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IFRJRDsKKwkJCURlbGJhUmVxLkluaXRpYXRvciA9IFJFQ0lQSUVOVDsKKyNpZiAxCisJCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQkJa2ZyZWUoRWxlbSk7CisjZWxzZQorCQkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkRlbGJhUmVxKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKyNlbmRpZgorCQl9CisKKworCQkvLworCQkvLyAyLiBGcmVlIHJlc291cmNlIG9mIEJBIHNlc3Npb24KKwkJLy8KKwkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPSAwOworCQkvLyBFcmFzZSBCaXRtYXAgZmxhZyBhdCBzb2Z0d2FyZSBtYWN0YWJsZQorCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLlJYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpKSk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXSA9IDA7CisKKwkJUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhwQWQsIFdjaWQsIFRJRCk7CisKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJfQorCisJQkFUYWJsZUZyZWVSZWNFbnRyeShwQWQsIElkeCk7Cit9CisKK1ZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSIFdjaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxOVU1fT0ZfVElEOyBpKyspCisJeworCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFLCBGQUxTRSk7CisJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgV2NpZCwgaSwgRkFMU0UpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9PUklfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJUFJUTVBfQURBUFRFUiAgIHBBZDsKKworCWlmIChwQkFFbnRyeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CisKKwlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykgJiYgKHBCQUVudHJ5LT5Ub2tlbiA8IE9SSV9TRVNTSU9OX01BWF9SRVRSWSkpCisJeworCQlNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICAgQWRkYmFSZXE7CisKKwkJTmRpc1plcm9NZW1vcnkoJkFkZGJhUmVxLCBzaXplb2YoQWRkYmFSZXEpKTsKKwkJQ09QWV9NQUNfQUREUihBZGRiYVJlcS5wQWRkciwgcEVudHJ5LT5BZGRyKTsKKwkJQWRkYmFSZXEuV2NpZCA9IChVQ0hBUikocEVudHJ5LT5BaWQpOworCQlBZGRiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOworCQlBZGRiYVJlcS5CYUJ1ZlNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OworCQlBZGRiYVJlcS5UaW1lT3V0VmFsdWUgPSAwOworCQlBZGRiYVJlcS5Ub2tlbiA9IHBCQUVudHJ5LT5Ub2tlbjsKKwkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIHNpemVvZihNTE1FX0FEREJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkFkZGJhUmVxKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIE9yaSBTZXNzaW9uIFRpbWVvdXQoJWQpIDogU2VuZCBBREQgQkEgYWdhaW5cbiIsIHBCQUVudHJ5LT5Ub2tlbikpOworCisJCXBCQUVudHJ5LT5Ub2tlbisrOworCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBPUklfQkFfU0VTU0lPTl9USU1FT1VUKTsKKwl9CisJZWxzZQorCXsKKwkJQkFUYWJsZUZyZWVPcmlFbnRyeShwQWQsIHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0pOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCQVJlY1Nlc3Npb25JZGxlVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gKEJBX1JFQ19FTlRSWSAqKUZ1bmN0aW9uQ29udGV4dDsKKwlQUlRNUF9BREFQVEVSICAgcEFkOworCVVMT05HICAgICAgICAgICBOb3czMjsKKworCWlmIChwQkFFbnRyeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9BY2NlcHQpKQorCXsKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCisJCWlmIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgKyBSRUNfQkFfU0VTU0lPTl9JRExFX1RJTUVPVVQpKSkKKwkJeworCQkJcEFkID0gcEJBRW50cnktPnBBZGFwdGVyOworCQkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkJcHJpbnRrKCIlbGQ6IFJFQyBCQSBzZXNzaW9uIFRpbWVvdXRcbiIsIE5vdzMyKTsKKwkJfQorCX0KK30KKworCitWT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvLwk3LjQuNC4xCisJLy9VTE9ORwlJZHg7CisJVUNIQVIgICBTdGF0dXMgPSAxOworCVVDSEFSICAgcEFkZHJbNl07CisJRlJBTUVfQUREQkFfUlNQIEFERGZyYW1lOworCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVBGUkFNRV9BRERCQV9SRVEgIHBBZGRyZXFGcmFtZSA9IE5VTEw7CisJLy9VQ0hBUgkJQnVmU2l6ZTsKKwlVTE9ORyAgICAgICBGcmFtZUxlbjsKKwlQVUxPTkcgICAgICBwdGVtcDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiAoV2NpZCA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7CisKKwkvL2hleF9kdW1wKCJBZGRCQVJlcSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCS8vQUREQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyQWRkQkFSZXFBY3Rpb24tLS0tPiBcbiIpKTsKKwlwdGVtcCA9IChQVUxPTkcpRWxlbS0+TXNnOworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VNVSwgKCIlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHhcbiIsICoocHRlbXApLCAqKHB0ZW1wKzEpLCAqKHB0ZW1wKzIpLCAqKHB0ZW1wKzMpLCAqKHB0ZW1wKzQpLCAqKHB0ZW1wKzUpLCAqKHB0ZW1wKzYpLCAqKHB0ZW1wKzcpLCAqKHB0ZW1wKzgpKSk7CisKKwlpZiAoUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIHBBZGRyKSkKKwl7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID09IEZBTFNFKSAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkKKwkJeworCQkJcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOworCQkJcHJpbnRrKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpOworCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwQWRkcmVxRnJhbWUpKQorCQkJCVN0YXR1cyA9IDA7CisJCQllbHNlCisJCQkJU3RhdHVzID0gMzg7IC8vIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzCisJCX0KKwkJZWxzZQorCQl7CisJCQlTdGF0dXMgPSAzNzsgLy8gdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuCisJCX0KKwl9CisKKwlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzQ0xJKQorCQlBU1NFUlQocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5Tc3QgPT0gU1NUX0FTU09DKTsKKworCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSk7CisJLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlZhbGlkQXNEbHMpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCUFERGZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CisJQUREZnJhbWUuQWN0aW9uID0gQUREQkFfUkVTUDsKKwlBRERmcmFtZS5Ub2tlbiA9IHBBZGRyZXFGcmFtZS0+VG9rZW47CisJLy8gV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4KKwlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOworCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOworCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CisJQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKKwlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCisJeworCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OworCX0KKwlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOworCisJKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSk7CisJQUREZnJhbWUuU3RhdHVzQ29kZSA9IGNwdTJsZTE2KEFERGZyYW1lLlN0YXR1c0NvZGUpOworCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEFERGZyYW1lLlRpbWVPdXRWYWx1ZSk7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSwgICZBRERmcmFtZSwKKwkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAorCQkJCQkJCSAgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKK30KKworCitWT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvL1VDSEFSCQlJZHgsIGk7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKKwkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OworCisJLy9BRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7CisKKwkvL2hleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCWlmIChQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlwRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkoJkVsZW0tPk1zZ1swXSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRcdCBTdGF0dXNDb2RlID0gJWRcbiIsIHBGcmFtZS0+U3RhdHVzQ29kZSkpOworCQlzd2l0Y2ggKHBGcmFtZS0+U3RhdHVzQ29kZSkKKwkJeworCQkJY2FzZSAwOgorCQkJCS8vIEkgd2FudCBhIEJBc2Vzc2lvbiB3aXRoIHRoaXMgcGVlciBhcyBhbiBvcmlnaW5hdG9yLgorCQkJCUJBT3JpU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwRnJhbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvLyBjaGVjayBzdGF0dXMgPT0gVVNFRCA/Pz8KKwkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsIHBGcmFtZS0+QmFQYXJtLlRJRCwgVFJVRSwgRkFMU0UpOworCQkJCWJyZWFrOworCQl9CisJCS8vIFJjdiBEZWNsaW5lIFN0YXR1c0NvZGUKKwkJaWYgKChwRnJhbWUtPlN0YXR1c0NvZGUgPT0gMzcpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgICAgICAgICB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIFNUQV9UR05fV0lGSV9PTihwQWQpICYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICApCisJCXsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9IDE8PHBGcmFtZS0+QmFQYXJtLlRJRDsKKwkJfQorCX0KK30KKworVk9JRCBQZWVyRGVsQkFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJLy9VQ0hBUgkJCQlJZHg7CisJLy9QVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEZSQU1FX0RFTEJBX1JFUSAgICBwRGVsRnJhbWUgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA9PT5cbiIsIF9fRlVOQ1RJT05fXykpOworCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gT1JJR0lOQVRPUlxuIikpOworCQkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IFJFQ0lQSUVOVCwgUmVhc29uID0gJWRcbiIsICBwRGVsRnJhbWUtPlJlYXNvbkNvZGUpKTsKKwkJCS8vaGV4X2R1bXAoIkRlbEJBIEZyYW1lIiwgcERlbEZyYW1lLCBFbGVtLT5Nc2dMZW4pOworCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJfQorCX0KK30KKworCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKKwkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCisJCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCit7CisJUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7CisJUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKKwkvL0JPT0xFQU4gCVJlc3VsdDsKKwlVTE9ORyAgIElkeDsKKwkvL1VDSEFSCU51bVJ4UGt0OworCVVDSEFSCVRJRDsvLywgaTsKKworCVRJRCA9IChVQ0hBUilwRnJhbWUtPkJBUkNvbnRyb2wuVElEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7CisJLy9oZXhfZHVtcCgiQkFSIiwgKFBDSEFSKSBwRnJhbWUsIE1zZ0xlbik7CisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSAmJiAoVElEIDwgOCkpCisJCXsKKwkJLy8gaWYgdGhpcyByZWNlaXZpbmcgcGFja2V0IGlzIGZyb20gU0EgdGhhdCBpcyBpbiBvdXIgT3JpRW50cnkuIFNpbmNlIFdDSUQgPDkgaGFzIGRpcmVjdCBtYXBwaW5nLiBubyBuZWVkIHNlYXJjaC4KKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQl9CisJCWVsc2UKKwkJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxICkpOworCisJaWYgKFNFUV9TTUFMTEVSKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIE1BWFNFUSkpCisJeworCQkvL3ByaW50aygiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IChwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPT0gMCkgPyBNQVhTRVEgOihwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgLTEpOworCX0KKwkvL2JhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCBQU01QIEFjdGlvbiBmcmFtZSBJZiBQU01QIG1vZGUgc3dpdGNoZXMuCisqLworVk9JRCBTZW5kUFNNUEFjdGlvbigKKwkJCQkgICBJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJCQkJICAgSU4gVUNIQVIJCQkJV2NpZCwKKwkJCQkgICBJTiBVQ0hBUgkJCQlQc21wKQoreworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwkvL1VMT05HICAgICAgICAgICBJZHg7CisJRlJBTUVfUFNNUF9BQ1RJT04gICBGcmFtZTsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW47CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUZyYW1lLkFjdGlvbiA9IFNNUFNfQUNUSU9OOworCXN3aXRjaCAoUHNtcCkKKwl7CisJCWNhc2UgTU1QU19FTkFCTEU6CisJCQlGcmFtZS5Qc21wID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE1NUFNfRFlOQU1JQzoKKwkJCUZyYW1lLlBzbXAgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgTU1QU19TVEFUSUM6CisJCQlGcmFtZS5Qc21wID0gMTsKKwkJCWJyZWFrOworCX0KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfUFNNUF9BQ1RJT04pLCAgICAgICZGcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSFQgLSBTZW5kUFNNUEFjdGlvbiggJWQgKSAgXG4iLCBGcmFtZS5Qc21wKSk7Cit9CisKKworI2RlZmluZSBSQURJT19NRUFTVVJFTUVOVF9SRVFVRVNUX0FDVElPTgkwCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRAoreworCVVDSEFSCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUglDaGFubmVsTnVtYmVyOworCVVTSE9SVAlSYW5kb21JbnRlcnZhbDsKKwlVU0hPUlQJTWVhc3VyZW1lbnREdXJhdGlvbjsKKwlVQ0hBUglNZWFzdXJlbWVudE1vZGU7CisJVUNIQVIgICBCU1NJRFtNQUNfQUREUl9MRU5dOworCVVDSEFSCVJlcG9ydGluZ0NvbmRpdGlvbjsKKwlVQ0hBUglUaHJlc2hvbGQ7CisJVUNIQVIgICBTU0lESUVbMl07CQkJLy8gMiBieXRlCit9IEJFQUNPTl9SRVFVRVNUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQKK3sKKwlVQ0hBUglJRDsKKwlVQ0hBUglMZW5ndGg7CisJVUNIQVIJVG9rZW47CisJVUNIQVIJUmVxdWVzdE1vZGU7CisJVUNIQVIJVHlwZTsKK30gTUVBU1VSRU1FTlRfUkVROworCisKKworCit2b2lkIGNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBrdDsKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisKKwkvLyAxLiBnZXQgODAyLjMgSGVhZGVyCisJLy8gMi4gcmVtb3ZlIExMQworCS8vIAkJYS4gcG9pbnRlciBwUnhCbGstPnBEYXRhIHRvIHBheWxvYWQKKwkvLyAgICAgIGIuIG1vZGlmeSBwUnhCbGstPkRhdGFTaXplCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT50YWlsID0gUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSArIFJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIsIGlmIG5lY2Vzc2FyeQorCS8vCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIExJTlVYCisJCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworI2VuZGlmCisjaWZkZWYgVUNPUworCQkJTmRpc01vdmVNZW1vcnkobmV0X3BrdF9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIElORElDQVRFX0xFR0FDWV9PUl9BTVNEVShfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpCQlcCisJZG8JCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9BTVNEVSkpCQkJCQkJXAorICAgIAl7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJCUluZGljYXRlX0FNU0RVX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJZWxzZSBpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRUFQKSkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQlJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWVsc2UJCQkJCQkJCQkJCQkJCQlcCisgICAgCXsJCQkJCQkJCQkJCQkJCQkJXAorICAgIAkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwl9IHdoaWxlICgwKTsKKworCisKK3N0YXRpYyBWT0lEIGJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisJVUlOVDE2CVNlcXVlbmNlID0gKFVJTlQxNikgcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKworCW1wZHVfYmxrID0gYmFfbXBkdV9ibGtfYWxsb2MocEFkKTsKKwlpZiAobXBkdV9ibGsgIT0gTlVMTCkKKwl7CisJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJCW1wZHVfYmxrLT5TZXF1ZW5jZSA9IFNlcXVlbmNlOworCisJCW1wZHVfYmxrLT5iQU1TRFUgPSBSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKKworCQljb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisgICAgICAgIC8vCisJCS8vIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcmVvcmRlcmluZyBwYWNrZXQgdG8gcmVjb3JkCisJCS8vIHdoaWNoIEJTUyBpdCBjb21lIGZyb20KKwkJLy8KKwkJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJbXBkdV9ibGstPnBQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCQlpZiAoYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZCgmcEJBRW50cnktPmxpc3QsIG1wZHVfYmxrKSA9PSBGQUxTRSkKKwkJeworCQkJLy8gaGFkIGJlZW4gYWxyZWFkeSB3aXRoaW4gcmVvcmRlcmluZyBsaXN0CisJCQkvLyBkb24ndCBpbmRpY2F0ZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCX0KKworCQlBU1NFUlQoKDA8PSBwQkFFbnRyeS0+bGlzdC5xbGVuKSAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPD0gcEJBRW50cnktPkJBV2luU2l6ZSkpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl9CisJZWxzZQorCXsKKyNpZiAwCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkOiVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBibGtfY291bnQsIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKKyNlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CisjZW5kaWYKKwkJLyoKKwkJICogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkgKiBhbmQgcmVjZXZpbmcgbXBkdSB0byB1cHBlciBsYXllcgorCQkgKiBtYWtlIHRjcC9pcCB0byB0YWtlIGNhcmUgcmVvcmRlcmluZyBtZWNoYW5pc20KKwkJICovCisJCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGUgdGhpcyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgcHV0IGl0IGludG8gcmVvcmRlcmluZyBidWZmZXIKKworCVBhcmFtZXRyczoKKwkJcFJ4QmxrICAgICAgICAgOiBjYXJyeSBuZWNlc3NhcnkgcGFja2V0IGluZm8gODAyLjExIGZvcm1hdAorCQlGcm9tV2hpY2hCU1NJRCA6IHRoZSBwYWNrZXQgcmVjZWl2ZWQgZnJvbSB3aGljaCBCU1MKKworCVJldHVybgk6CisJCQkgIG5vbmUKKworCU5vdGUgICAgOgorCSAgICAgICAgICB0aGUgcGFja2V0IHF1ZXVlZCBpbnRvIHJlb3JkZXJpbmcgYnVmZmVyIG5lZWQgdG8gY292ZXIgdG8gODAyLjMgZm9ybWF0CisJCQkgIG9yIHByZV9BTVNEVSBmb3JtYXQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVU0hPUlQJCQkJSWR4OworCVBCQV9SRUNfRU5UUlkJCXBCQUVudHJ5ID0gTlVMTDsKKwlVSU5UMTYJCQkJU2VxdWVuY2UgPSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOworCVVMT05HCQkJCU5vdzMyOworCVVDSEFSCQkJCVdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOworCVVDSEFSCQkJCVRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKKworCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSAmJiAgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpCisJeworI2lmIDAgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKwkJc3RhdGljIGludCBlcnJfc2l6ZTsKKworCQllcnJfc2l6ZSsrOworCQlpZiAoZXJyX3NpemUgPiAyMCkgeworCQkJIHByaW50aygiQU1QRFUgRGF0YVNpemUgPSAlZFxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJCQkgaGV4X2R1bXAoIjgwMi4xMSBIZWFkZXIiLCAoVUNIQVIgKilwUnhCbGstPnBIZWFkZXIsIDI0KTsKKwkJCSBoZXhfZHVtcCgiUGF5bG9hZCIsIHBSeEJsay0+cERhdGEsIDY0KTsKKwkJCSBlcnJfc2l6ZSA9IDA7CisJCX0KKyNlbmRpZgorCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisKKyNpZiAwIC8vIHRlc3QKKwkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KKwlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwlyZXR1cm47CisjZW5kaWYKKworCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCWlmIChJZHggPT0gMCkKKwkJeworCQkJLyogUmVjIEJBIFNlc3Npb24gaGFkIGJlZW4gdG9ybiBkb3duICovCisJCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCX0KKwllbHNlCisJeworCQkvLyBpbXBvc3NpYmxlICEhIQorCQlBU1NFUlQoMCk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQocEJBRW50cnkpOworCisJLy8gdXBkYXRlIGxhc3QgcnggdGltZQorCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKKworCXBCQUVudHJ5LT5yY3ZTZXEgPSBTZXF1ZW5jZTsKKworCisJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKworCS8vCisJLy8gUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZQorCS8vCisJaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpCisJeworCQlBU1NFUlQoKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgPT0gTlVMTCkpOworCisJCS8vIHJlc2V0IHJjdiBzZXF1ZW5jZSBvZiBCQSBzZXNzaW9uCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKworCisJLy8KKwkvLyBJLiBDaGVjayBpZiBpbiBvcmRlci4KKwkvLworCWlmIChTRVFfU1RFUE9ORShTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCQlVU0hPUlQgIExhc3RJbmRTZXE7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisgCQlMYXN0SW5kU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChMYXN0SW5kU2VxICE9IFJFU0VUX1JDVl9TRVEpCisJCXsKKwkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gTGFzdEluZFNlcTsKKwkJfQorCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwl9CisJLy8KKwkvLyBJSS4gRHJvcCBEdXBsaWNhdGVkIFBhY2tldAorCS8vCisJZWxzZSBpZiAoU2VxdWVuY2UgPT0gcEJBRW50cnktPkxhc3RJbmRTZXEpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElJSS4gRHJvcCBPbGQgUmVjZWl2ZWQgUGFja2V0CisJLy8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElWLiBSZWNlaXZlIFNlcXVlbmNlIHdpdGhpbiBXaW5kb3cgU2l6ZQorCS8vCisJZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsICgoKHBCQUVudHJ5LT5MYXN0SW5kU2VxK3BCQUVudHJ5LT5CQVdpblNpemUrMSkpICYgTUFYU0VRKSwgTUFYU0VRKSkKKwl7CisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorCS8vCisJLy8gVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlcgorCS8vCisJZWxzZQorCXsKKyNpZiAwCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisjZWxzZQorCQlMT05HIFdpblN0YXJ0U2VxLCBUbXBTZXE7CisKKworCQlUbXBTZXEgPSBTZXF1ZW5jZSAtIChwQkFFbnRyeS0+QkFXaW5TaXplKSAtMTsKKwkJaWYgKFRtcFNlcSA8IDApCisJCXsKKwkJCVRtcFNlcSA9IChNQVhTRVErMSkgKyBUbXBTZXE7CisJCX0KKwkJV2luU3RhcnRTZXEgPSAoVG1wU2VxKzEpICYgTUFYU0VROworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBXaW5TdGFydFNlcSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gV2luU3RhcnRTZXE7IC8vVG1wU2VxOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJVG1wU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChUbXBTZXEgIT0gUkVTRVRfUkNWX1NFUSkKKwkJeworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBUbXBTZXE7CisJCX0KKyNlbmRpZgorCX0KK30KKworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzU0OTAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpAQCAtMCwwICsxLDM0NjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKKworVUNIQVIJU05BUF84MDJfMUhbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKK1VDSEFSCVNOQVBfQlJJREdFX1RVTk5FTFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4Zjh9OworLy8gQWRkIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZSBmb3IgQ0NYMiBzdXBwb3J0CitVQ0hBUglTTkFQX0FJUk9ORVRbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwfTsKK1VDSEFSCUNLSVBfTExDX1NOQVBbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKK1VDSEFSCUVBUE9MX0xMQ19TTkFQW109IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDhlfTsKK1VDSEFSCUVBUE9MW10gPSB7MHg4OCwgMHg4ZX07CitVQ0hBUiAgIFRQSURbXSA9IHsweDgxLCAweDAwfTsgLyogVkxBTiByZWxhdGVkICovCisKK1VDSEFSCUlQWFtdID0gezB4ODEsIDB4Mzd9OworVUNIQVIJQVBQTEVfVEFMS1tdID0gezB4ODAsIDB4ZjN9OworVUNIQVIJUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKKwkgMCwgLyogUkFURV8xICovCTEsIC8qIFJBVEVfMiAqLyAJMiwgLyogUkFURV81XzUgKi8JMywgLyogUkFURV8xMSAqLwkvLyBzZWUgQkJQIHNwZWMKKwkxMSwgLyogUkFURV82ICovICAgMTUsIC8qIFJBVEVfOSAqLyAgICAxMCwgLyogUkFURV8xMiAqLyAgIDE0LCAvKiBSQVRFXzE4ICovCS8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKwkgOSwgLyogUkFURV8yNCAqLyAgMTMsIC8qIFJBVEVfMzYgKi8JOCwgLyogUkFURV80OCAqLyAgIDEyICAvKiBSQVRFXzU0ICovIH07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKworVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7CisJUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKKwlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQorCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5CisJUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKK307CisKK1VDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1sxMl0gPSB7CisJMCwgIDAsCTAsICAwLAorCTAsICAxLAkyLCAgMywJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKKwk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKK307CitVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0geworCVJBVEVfNiwgIFJBVEVfOSwJUkFURV8xMiwgIFJBVEVfMTgsCisJUkFURV8yNCwgIFJBVEVfMzYsCVJBVEVfNDgsICBSQVRFXzU0LAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMworCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNworfTsKKworY2hhciogICBNQ1NUb01icHNbXSA9IHsiMU1icHMiLCIyTWJwcyIsIjUuNU1icHMiLCIxMU1icHMiLCIwNk1icHMiLCIwOU1icHMiLCIxMk1icHMiLCIxOE1icHMiLCIyNE1icHMiLCIzNk1icHMiLCI0OE1icHMiLCI1NE1icHMiLCJNTS0wIiwiTU0tMSIsIk1NLTIiLCJNTS0zIiwiTU0tNCIsIk1NLTUiLCJNTS02IiwiTU0tNyIsIk1NLTgiLCJNTS05IiwiTU0tMTAiLCJNTS0xMSIsIk1NLTEyIiwiTU0tMTMiLCJNTS0xNCIsIk1NLTE1IiwiTU0tMzIiLCJlZTEiLCJlZTIiLCJlZTMifTsKKworVUNIQVIgZGVmYXVsdF9jd21pbltdPXtDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTEsIENXX01JTl9JTl9CSVRTLTJ9OworVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bXT17Myw3LDIsMn07CisKK1VDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF0gPSB7UUlEX0FDX0JFLCBRSURfQUNfQkssIFFJRF9BQ19CSywgUUlEX0FDX0JFLCBRSURfQUNfVkksIFFJRF9BQ19WSSwgUUlEX0FDX1ZPLCBRSURfQUNfVk99OworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBUEkgZm9yIE1MTUUgdG8gdHJhbnNtaXQgbWFuYWdlbWVudCBmcmFtZSB0byBBUCAoQlNTIE1vZGUpCisJb3Igc3RhdGlvbiAoSUJTUyBNb2RlKQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJUG9pbnRlciB0byB0aGUgb3V0Z29pbmcgODAyLjExIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVJTlQJCQlMZW5ndGgpCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgIAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSAJCUZyZWVOdW07CisjaWZkZWYgUlQyODYwCisJdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUNIQVIJCQlJcnFTdGF0ZTsKKwlVQ0hBUgkJCXJ0bXBId0hkcltUWElORk9fU0laRSArIFRYV0lfU0laRV07IC8vUlRNUF9IV19IRFJfTEVOXTsKKworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJUXVlSWR4PTM7CisKKwkvLyAyODYwQyB1c2UgVHggUmluZworCisJSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKKyNpZmRlZiBSVDI4NjAKKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSAmJiAoIUlycVN0YXRlKSkKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCisJCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCX0KKworCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeSgmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpKTsKKwkJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgKFBVQ0hBUikmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBwRGF0YSwgTGVuZ3RoKTsKKwkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIk1pbmlwb3J0TU1SZXF1ZXN0IChlcnJvcjo6IGNhbid0IGFsbG9jYXRlIE5ESVMgUEFDS0VUKVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOworCisKKwkJCVN0YXR1cyA9IE1sbWVIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCisJCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworI2lmZGVmIFJUMjg2MAorCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJaWYgKChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgJiYgKCFJcnFTdGF0ZSkpCisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisjaWZkZWYgUlQyODYwCitORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdFVubG9jaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVSU5UCQkJTGVuZ3RoKQoreworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCU5ESVNfU1RBVFVTICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSBGcmVlTnVtOworCVRYV0lfU1RSVUMJCVRYV0k7CisJVUxPTkcJU1dfVFhfSURYOworCVBUWERfU1RSVUMJCXBUeEQ7CisKKwlRdWVJZHggPSAzOworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCQkvLyAyODYwQyB1c2UgVHggUmluZworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCQlTV19UWF9JRFggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCQlTV19UWF9JRFggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OworCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKKwkJfQorCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoJlRYV0ksIFRYV0lfU0laRSk7CisJCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIChQVUNIQVIpJlRYV0ksIFRYV0lfU0laRSwgcERhdGEsIExlbmd0aCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBNZ210UmluZ1xuIiwgUXVlSWR4KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworCisJcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIHRyYW5zbWl0IGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBCdWZmZXIgCVBvaW50ZXIgdG8JbWVtb3J5IG9mIG91dGdvaW5nIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIFJUMjg2MAorCWlmICggcEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDAgKQorCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCWVsc2UKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCit9CisKKworI2lmZGVmIFJUMjg2MAorTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKwlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOworCVVMT05HCQkJU3JjQnVmUEE7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlVTE9ORwkJCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlVTE9ORwkgRnJlZU51bTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwl7CisJCS8vIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKwkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7CisKKwlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJaWYgKEZyZWVOdW0gPT0gMCkKKwl7CisJCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisjZWxzZQorICAgIHBEZXN0VHhEICA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKyAgICBUeEQgPSAqcERlc3RUeEQ7CisgICAgcFR4RCA9ICZUeEQ7CisgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKworCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KQorCXsKKwkJcHJpbnRrKCJNbG1lSGFyZFRyYW5zbWl0IEVycm9yXG4iKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXBGaXJzdFR4V0kJPShQVFhXSV9TVFJVQylwU3JjQnVmVkE7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYV0lfU0laRSk7CisJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCisJeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJfQorCWVsc2UKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJfQorCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgorCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkpCisJeworCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CisJfQorCisJLy8gVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuCisJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkgLy8gMTFBIGJhbmQKKwkJTWxtZVJhdGUgPSBSQVRFXzY7CisKKwkvLworCS8vIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpCisJLy8gU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQKKwkvLyBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4KKwkvLworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkKKyAgICB7CisgICAgCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SRVEpIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKKyAgICAJeworICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOworICAgIAl9CisgICAgCWVsc2UKKyAgICAJeworICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOworICAgIAl9CisgICAgfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOworCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKKwl7CisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKKwlpZiAocEFkLT5TZXF1ZW5jZSA+IDB4ZmZmKQorCQlwQWQtPlNlcXVlbmNlID0gMDsKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcl84MDJfMTEsIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJLy8gT25seSBiZWFjb24gdXNlIE5zZXE9VFJVRS4gU28gaGVyZSB3ZSB1c2UgTnNlcT1GQUxTRS4KKwlpZiAocE1hY0VudHJ5ID09IE5VTEwpCisJeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKKwkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksCisJCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKKwkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOworCX0KKworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcEZpcnN0VHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCVNyY0J1ZlBBID0gUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7CisKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fRURDQSk7CisJcFR4RC0+TGFzdFNlYzAgPSAxOworCXBUeEQtPkxhc3RTZWMxID0gMTsKKwlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47CisJcFR4RC0+U0RMZW4xID0gMDsKKwlwVHhELT5TRFB0cjAgPSBTcmNCdWZQQTsKKwlwVHhELT5ETUFET05FID0gMDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisgICAJLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgorCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCoweDEwLCAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJUXVlSWR4LAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOworCUJPT0xFQU4gCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwRmlyc3RUeFdJID0gKFBUWFdJX1NUUlVDKShwU3JjQnVmVkEgKyAgVFhJTkZPX1NJWkUpOworCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOyAvL1RYV0lfU0laRSk7CisKKwlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwl9CisJZWxzZQorCXsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KKwlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAorCQlNbG1lUmF0ZSA9IFJBVEVfNjsKKworCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKKwkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQorCXsKKwkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkpCisJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAwOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8KKwkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQorCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0CisJLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCisJLy8KKwkvLyBwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IDA7IC8vIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9DTlRMKSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgorCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSkKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCWVsc2UKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7CisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQorCQl7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOworCWlmIChwQWQtPlNlcXVlbmNlID4weGZmZikKKwkJcEFkLT5TZXF1ZW5jZSA9IDA7CisKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCisJCTAsIFJFU0VSVkVEX1dDSUQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwKKwkJCQkJcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJCQkoVUNIQVIpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAorCQkJCQlJRlNfQkFDS09GRiwgRkFMU0UsICZwTWFjRW50cnktPk1heEhUUGh5TW9kZSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBGaXJzdFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYKKworCS8vIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LgorCUhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisKKwkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU5ldyBEZVF1ZXVlIFByb2NlZHVyZXMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBERVFVRVVFX0xPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKSAJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoYkludENvbnRleHQgPT0gRkFMU0UpCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soKGxvY2spLCBJcnFGbGFncyk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBERVFVRVVFX1VOTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwlcCisJCQl9d2hpbGUoMCkKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlUeCBQYXRoIGRlc2lnbiBhbGdvcml0aG06CisJCUJhc2ljYWxseSwgd2UgZGl2aWRlIHRoZSBwYWNrZXRzIGludG8gZm91ciB0eXBlcywgQnJvYWRjYXN0L011bHRpY2FzdCwgMTFOIFJhdGUoQU1QRFUsIEFNU0RVLCBOb3JtYWwpLCBCL0cgUmF0ZShBUkFMSU5LLCBOb3JtYWwpLAorCQlTcGVjaWZpYyBQYWNrZXQgVHlwZS4gRm9sbG93aW5nIHNob3cgdGhlIGNsYXNzaWZpY2F0aW9uIHJ1bGUgYW5kIHBvbGljeSBmb3IgZWFjaCBraW5kcyBvZiBwYWNrZXRzLgorCQkJCUNsYXNzaWZpY2F0aW9uIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6ICgqYWRkcjEgJiAweDAxKSA9PSAweDAxCisJCQkJCVNwZWNpZmljIDogYkRIQ1BGcmFtZSwgYkFSUEZyYW1lLCBiRUFQT0xGcmFtZSwgZXRjLgorCQkJCQkxMU4gUmF0ZSA6IElmIHBlZXIgc3VwcG9ydCBIVAorCQkJCQkJCQkoMSkuQU1QRFUgIC0tIElmIFRYQkEgaXMgbmVnb3RpYXRlZC4KKwkJCQkJCQkJKDIpLkFNU0RVICAtLSBJZiBBTVNEVSBpcyBjYXBhYmxlIGZvciBib3RoIHBlZXIgYW5kIG91cnNlbGYuCisJCQkJCQkJCQkJCSopLiBBTVNEVSBjYW4gZW1iZWRkZWQgaW4gYSBBTVBEVSwgYnV0IG5vdyB3ZSBkaWRuJ3Qgc3VwcG9ydCBpdC4KKwkJCQkJCQkJKDMpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgMTFuIHJhdGUuCisKKwkJCQkJQi9HIFJhdGUgOiBJZiBwZWVyIGlzIGIvZyBvbmx5LgorCQkJCQkJCQkoMSkuQVJBTElOSy0tIElmIGJvdGggb2YgcGVlci91cyBzdXBwcm90IFJhbGluayBwcm9wcmlldGFyeSBBZ2dyZWdhdGlvbiBhbmQgdGhlIFR4UmF0ZSBpcyBsYXJnZSB0aGFuIFJBVEVfNgorCQkJCQkJCQkoMikuTm9ybWFsIC0tIE90aGVyIHBhY2tldHMgd2hpY2ggc2VuZCBhcyBiL2cgcmF0ZS4KKwkJCQkJRnJhZ21lbnQ6CisJCQkJCQkJCVRoZSBwYWNrZXQgbXVzdCBiZSB1bmljYXN0LCBOT1QgQS1SQUxJTkssIE5PVCBBLU1TRFUsIE5PVCAxMW4sIHRoZW4gY2FuIGNvbnNpZGVyIGFib3V0IGZyYWdtZW50LgorCisJCQkJQ2xhc3NpZmllZCBQYWNrZXQgSGFuZGxlIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6CisJCQkJCQkJCU5vIEFDSywgCQkvL3BUeEJsay0+YkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQkJCQkJCU5vIFdNTSwgCQkvL3BUeEJsay0+YldNTSA9IEZBTFNFOworCQkJCQkJCQlObyBwaWdneWJhY2ssICAgLy9wVHhCbGstPmJQaWdneUJhY2sgPSBGQUxTRTsKKwkJCQkJCQkJRm9yY2UgTG93UmF0ZSwgIC8vcFR4QmxrLT5iRm9yY2VMb3dSYXRlID0gVFJVRTsKKwkJCQkJU3BlY2lmaWMgOglCYXNpY2FsbHksIGZvciBzcGVjaWZpYyBwYWNrZXQsIHdlIHNob3VsZCBoYW5kbGUgaXQgc3BlY2lmaWNhbGx5LCBidXQgbm93IGFsbCBzcGVjaWZpYyBwYWNrZXRzIGFyZSB1c2UKKwkJCQkJCQkJCXRoZSBzYW1lIHBvbGljeSB0byBoYW5kbGUgaXQuCisJCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7CisKKwkJCQkJMTFOIFJhdGUgOgorCQkJCQkJCQlObyBwaWdneWJhY2ssCS8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7CisKKwkJCQkJCQkJKDEpLkFNU0RVCisJCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOworCQkJCQkJCQkoMikuQU1QRFUKKwkJCQkJCQkJCXBUeEJsay0+YldNTSA9IFRSVUU7CisJCQkJCQkJCSgzKS5Ob3JtYWwKKworCQkJCQlCL0cgUmF0ZSA6CisJCQkJCQkJCSgxKS5BUkFMSU5LCisKKwkJCQkJCQkJKDIpLk5vcm1hbAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBVQ0hBUiBUeFBrdENsYXNzaWZpY2F0aW9uKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlVQ0hBUgkJCVR4RnJhbWVUeXBlID0gVFhfVU5LT1dOX0ZSQU1FOworCVVDSEFSCQkJV2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCWJIVFJhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCXsJLy8gSGFuZGxlIGZvciBSQSBpcyBCcm9hZGNhc3QvTXVsdGljYXN0IEFkZHJlc3MuCisJCXJldHVybiBUWF9NQ0FTVF9GUkFNRTsKKwl9CisKKwkvLyBIYW5kbGUgZm9yIHVuaWNhc3QgcGFja2V0cworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdOworCWlmIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkKKwl7CS8vIEl0J3MgYSBzcGVjaWZpYyBwYWNrZXQgbmVlZCB0byBmb3JjZSBsb3cgcmF0ZSwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZQorCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoSVNfSFRfUkFURShwTWFjRW50cnkpKQorCXsJLy8gaXQncyBhIDExbiBjYXBhYmxlIHBhY2tldAorCisJCS8vIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uCisJCS8vIAlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQorCQliSFRSYXRlID0gVFJVRTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSB8fCAocE1hY0VudHJ5LT5Qc01vZGUgPT0gUFdSX1NBVkUpKQorCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQllbHNlIGlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKwkJZWxzZSBpZigocE1hY0VudHJ5LT5UWEJBYml0bWFwICYgKDE8PChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0gMCkKKwkJCXJldHVybiBUWF9BTVBEVV9GUkFNRTsKKwkJZWxzZSBpZihDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCisJCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7CisJCWVsc2UKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCisJCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgorCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgorCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQorCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KKwkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJCX0KKwl9CisKKwkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgorCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQorCQlUeEZyYW1lVHlwZSA9IFRYX0ZSQUdfRlJBTUU7CisKKwlyZXR1cm4gVHhGcmFtZVR5cGU7Cit9CisKKworQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLICpwVHhCbGspCit7CisJUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOworCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7CisKKwlwUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCisJcFR4QmxrLT5XY2lkCSAJIAkJPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlwVHhCbGstPmFwaWR4CQkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KTsKKwlwVHhCbGstPlVzZXJQcmlvcml0eSAJCT0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkJLy8gQVNJQyBkZXRlcm1pbmUgRnJhbWUgR2FwCisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwVHhCbGstPnBQYWNrZXQpKQorCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCisJLy8gRGVmYXVsdCB0byBjbGVhciB0aGlzIGZsYWcKKwlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOworCisKKwlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9IE5VTEw7CisJCXsKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCQlQVUNIQVIgcERBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkJaWYgKCgoKnBEQSAmIDB4MDEpID09IDB4MDEpICYmICgqcERBICE9IDB4ZmYpKQorCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisJCX0KKworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwkvLyBBY2tSZXF1aXJlZCA9IEZBTFNFLCB3aGVuIGJyb2FkY2FzdCBwYWNrZXQgaW4gQWRob2MgbW9kZS4KKwkJLy9UWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTG93UmF0ZSk7CisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisJCX0KKworCX0KKwllbHNlCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BUeEJsay0+V2NpZF07CisJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBUeEJsay0+cE1hY0VudHJ5LT5IVFBoeU1vZGU7CisKKwkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKworCQkvLyBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKKwkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJCWVsc2UKKwkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCisJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXsKKworCQkJCS8vIElmIHN1cHBvcnQgV01NLCBlbmFibGUgaXQuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpCisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkKKwkJeworCQkJaWYgKCAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHx8CisgICAgICAgICAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKQorCQkJewkvLyBTcGVjaWZpYyBwYWNrZXQsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUsIG5lZWQgZm9yY2UgbG93IHJhdGUuCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJLy8gTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8KKwkJCQlpZiAoSVNfSFRfU1RBKHBUeEJsay0+cE1hY0VudHJ5KSAmJgorCQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpICYmCisJCQkJCSgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkpCisJCQkJeworCQkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoIChJU19IVF9SQVRFKHBNYWNFbnRyeSkgPT0gRkFMU0UpICYmCisJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkKKwkJCXsJLy8gQ3VycmVudGx5IHBpZ2d5LWJhY2sgb25seSBzdXBwb3J0IHdoZW4gcGVlciBpcyBvcGVyYXRlIGluIGIvZyBtb2RlLgorCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJCXsKKwkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKwkJCX0KKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCisJCQl7CisJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU1fVUFQU0RfRU9TUCk7CisJCQl9CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCQl9CisJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfRlJBR19GUkFNRSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQl9CisKKwkJcE1hY0VudHJ5LT5EZWJ1Z1R4Q291bnQrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitCT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCisJLy9wcmludGsoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKworCWlmIChSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KSA9PSBNQ0FTVF9XQ0lEKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0RIQ1AocFBhY2tldCkgfHwKKwkJUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpIHx8CisJCVJUTVBfR0VUX1BBQ0tFVF9XQUkocFBhY2tldCkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgJiYKKwkJKChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk+IChSWF9CVUZGRVJfQUdHUkVTSVpFIC0gMTAwKSkpCisJewkvLyBGb3IgQU1TRFUsIGFsbG93IHRoZSBwYWNrZXRzIHdpdGggdG90YWwgbGVuZ3RoIDwgbWF4LWFtc2R1IHNpemUKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmCisJCShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpCisJewkvLyBGb3IgUkFMSU5LLUFnZ3JlZ2F0aW9uLCBhbGxvdyB0d28gZnJhbWVzIGluIG9uZSBiYXRjaC4KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVG8gZG8gdGhlIGVucXVldWUgb3BlcmF0aW9uIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBpdGVtIG9mIHdhaXRpbmcKKwkJbGlzdC4gSWYgYSBudW1iZXIgb2YgYXZhaWxhYmxlIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgY291bGQgbWVldAorCQl0aGUgcmVxdWVzdCBvZiBleHRyYWN0ZWQgaXRlbSwgdGhlIGV4dHJhY3RlZCBpdGVtIHdpbGwgYmUgZnJhZ21lbnRlZAorCQlpbnRvIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUERlUXVldWVQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4gICAgICAgICBiSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRSWR4LCAvKiBCdWxrT3V0UGlwZUlkICovCisJSU4gIFVDSEFSICAgICAgICAgICBNYXhfVHhfUGFja2V0cykKK3sKKwlQUVVFVUVfRU5UUlkgICAgcEVudHJ5ID0gTlVMTDsKKwlQTkRJU19QQUNLRVQgCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVUNIQVIgICAgICAgICAgIENvdW50PTA7CisJUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107CisJVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKKwlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7CisJVFhfQkxLCQkJVHhCbGs7CisJVFhfQkxLCQkJKnBUeEJsazsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCUJPT0xFQU4JCQlmaXJzdFJvdW5kOworCVJ0bXBEaWFnU3RydWN0CSpwRGlhZ1N0cnVjdCA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisjZW5kaWYKKworCisJaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpCisJeworCQlzUUlkeCA9IDA7CisJCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KKwl9CisJZWxzZQorCXsKKwkJc1FJZHggPSBlUUlkeCA9IFFJZHg7CisJfQorCisJZm9yIChRdWVJZHg9c1FJZHg7IFF1ZUlkeCA8PSBlUUlkeDsgUXVlSWR4KyspCisJeworCQlDb3VudD0wOworCisJCVJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJZmlyc3RSb3VuZCA9ICgoUXVlSWR4ID09IDApID8gVFJVRSA6IEZBTFNFKTsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQl3aGlsZSAoMSkKKwkJeworCQkJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJCQl7CisJCQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKENvdW50ID49IE1heF9UeF9QYWNrZXRzKQorCQkJCWJyZWFrOworCisJCQlERVFVRVVFX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkKKwkJCXsKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQorCQkJCQlwRGlhZ1N0cnVjdC0+VHhTV1F1ZUNudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdWzBdKys7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKyNpZmRlZiBSVDI4NjAKKwkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCQkJaWYgKGZpcnN0Um91bmQgPT0gVFJVRSkKKwkJCXsKKwkJCQlVQ0hBUgl0eERlc2NOdW1MZXZlbCwgdHhTd1FOdW1MZXZlbDsKKworCQkJCXR4RGVzY051bUxldmVsID0gKFRYX1JJTkdfU0laRSAtIEZyZWVOdW1iZXJbUXVlSWR4XSk7IC8vIE51bWJlciBvZiBvY2N1cGllZCBodyBkZXNjLgorCQkJCXR4RGVzY051bUxldmVsID0gKCh0eERlc2NOdW1MZXZlbCA8PTE1KSA/IHR4RGVzY051bUxldmVsIDogMTUpOworCQkJCXBEaWFnU3RydWN0LT5UeERlc2NDbnRbcERpYWdTdHJ1Y3QtPkFycmF5Q3VySWR4XVt0eERlc2NOdW1MZXZlbF0rKzsKKworCQkJCXR4U3dRTnVtTGV2ZWwgPSAoKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDw9NykgPyBwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA6IDgpOworCQkJCXBEaWFnU3RydWN0LT5UeFNXUXVlQ250W3BEaWFnU3RydWN0LT5BcnJheUN1cklkeF1bdHhTd1FOdW1MZXZlbF0rKzsKKworCQkJCWZpcnN0Um91bmQgPSBGQUxTRTsKKwkJCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQkJaWYgKEZyZWVOdW1iZXJbUXVlSWR4XSA8PSA1KQorCQkJeworCQkJCS8vIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMKKwkJCQlSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRdWVJZHgpOworCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQkJLy8gcHJvYmUgdGhlIFF1ZXVlIEhlYWQKKwkJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdOworCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQl7CisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsayA9ICZUeEJsazsKKwkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7CisJCQlwVHhCbGstPlF1ZUlkeCA9IFF1ZUlkeDsKKworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCisJCQkvLyBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuCisJCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7CisJCQlpZiAoIWhhc1R4RGVzYykKKwkJCXsKKwkJCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQrKzsKKworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUeFBrdENsYXNzaWZpY2F0aW9uKHBBZCwgcFBhY2tldCk7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKKwkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7CisJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCXsKKwkJCQkvLyBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbQorCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLCBwVHhCbGstPlR4RnJhbWVUeXBlKSkKKwkJCQl7CisJCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkb3sKKwkJCQkJaWYoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgorCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOworCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsKKwkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CisJCQkJCUFTU0VSVChwRW50cnkpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJfXdoaWxlKDEpOworCisJCQkJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAxKQorCQkJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCQkJfQorCisKKwkJCUNvdW50ICs9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKKworCQkJCS8vIERvIEhhcmRUcmFuc21pdCBub3cuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCVN0YXR1cyA9IFNUQUhhcmRUcmFuc21pdChwQWQsIHBUeEJsaywgUXVlSWR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkvLyBzdGF0aWMgcmF0ZSBhbHNvIG5lZWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKCkgZnVuY3Rpb24uCisJCQkvL2lmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKQorCQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQl9CisKKwkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwkJaWYgKChwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XS5Td1R4UXVldWVCbG9ja0ZsYWcgPT0gVFJVRSkKKwkJCSYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA8IDEpKQorCQl7CisJCQlyZWxlYXNlTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdKTsKKwkJfQorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisJfQorCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUmF0ZQkJCVRyYW5zbWl0IHJhdGUKKwkJU2l6ZQkJCUZyYW1lIHNpemUgaW4gdW5pdHMgb2YgYnl0ZQorCisJUmV0dXJuIFZhbHVlOgorCQlEdXJhdGlvbiBudW1iZXIgaW4gdW5pdHMgb2YgdXNlYworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVU0hPUlQJUlRNUENhbGNEdXJhdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJhdGUsCisJSU4JVUxPTkcJCQlTaXplKQoreworCVVMT05HCUR1cmF0aW9uID0gMDsKKworCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIC8vIENDSworCXsKKwkJaWYgKChSYXRlID4gUkFURV8xKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkpCisJCQlEdXJhdGlvbiA9IDk2OwkvLyA3MisyNCBwcmVhbWJsZStwbGNwCisJCWVsc2UKKwkJCUR1cmF0aW9uID0gMTkyOyAvLyAxNDQrNDggcHJlYW1ibGUrcGxjcAorCisJCUR1cmF0aW9uICs9IChVU0hPUlQpKChTaXplIDw8IDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJaWYgKChTaXplIDw8IDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQorCQkJRHVyYXRpb24gKys7CisJfQorCWVsc2UgaWYgKFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkvLyBPRkRNIHJhdGVzCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwkJRHVyYXRpb24gKz0gNCAqIChVU0hPUlQpKCgxMSArIFNpemUgKiA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CisJCWlmICgoMTEgKyBTaXplICogNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCisJCQlEdXJhdGlvbiArPSA0OworCX0KKwllbHNlCS8vbWltbyByYXRlCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwl9CisKKwlyZXR1cm4gKFVTSE9SVClEdXJhdGlvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeFdJCQlQb2ludGVyIHRvIGhlYWQgb2YgZWFjaCBNUERVIHRvIEhXLgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgISEhCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBPdXRUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlDRkFDSywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKK3sKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOworCVRYV0lfU1RSVUMgCQlUeFdJOworCVBUWFdJX1NUUlVDIAlwVHhXSTsKKworCWlmIChXQ0lEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXBNYWMgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXQ0lEXTsKKworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCU5kaXNaZXJvTWVtb3J5KCZUeFdJLCBUWFdJX1NJWkUpOworCXBUeFdJID0gJlR4V0k7CisKKwlwVHhXSS0+RlJBRz0gRlJBRzsKKworCXBUeFdJLT5DRkFDSyA9IENGQUNLOworCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOworCXBUeFdJLT5BTVBEVSA9IEFNUERVOworCXBUeFdJLT5BQ0sgPSBBY2s7CisJcFR4V0ktPnR4b3A9IFR4b3Btb2RlOworCisJcFR4V0ktPk5TRVEgPSBOU2VxOworCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKKworCWlmKCBCQVNpemUgPjcgKQorCQlCQVNpemUgPTc7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gV0NJRDsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOworCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCXBUeFdJLT5DRkFDSyA9IENmQWNrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBNYWMpCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKKwkJeworCQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQorCQkJeworCQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCQlwVHhXSS0+TUlNT3BzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQorCQkJeworCQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCisJCQkJeworCQkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7CisJCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjLT5NcGR1RGVuc2l0eTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7CisJTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworfQorCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQoreworCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0OworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJCUJBU2l6ZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBUeFdJKTsKKworCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OworCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeShwVHhXSSwgVFhXSV9TSVpFKTsKKworCXBUeFdJLT5GUkFHCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJcFR4V0ktPkFDSwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJcFR4V0ktPnR4b3AJCT0gcFR4QmxrLT5GcmFtZUdhcDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCWlmIChwTWFjRW50cnkgJiYKKwkJKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkocE1hY0VudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpKQorCQlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IEJTU0lEX1dDSUQ7CisJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlwVHhXSS0+V2lyZWxlc3NDbGlJRAkJPSBwVHhCbGstPldjaWQ7CisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4V0ktPkNGQUNLCQkJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCXBUeFdJLT5BTVBEVQk9ICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgPyBUUlVFIDogRkFMU0UpOworCisJLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOworCWlmKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkKKwl7CisJCVVDSEFSCQlSQUJBT3JpSWR4ID0gMDsJLy9UaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LgorCisJCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworCQlCQVNpemUgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtSQUJBT3JpSWR4XS5CQVdpblNpemU7CisJfQorCisJcFR4V0ktPlR4QkYgPSBwVHJhbnNtaXQtPmZpZWxkLlR4QkY7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwTWFjRW50cnkpCisJeworCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQorCQkJeworCQkJCXBUeFdJLT5NQ1MgPSA3OworCQkJCXBUeFdJLT5NSU1PcHMgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHBNYWNFbnRyeS0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWNFbnRyeS0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjRW50cnktPk1wZHVEZW5zaXR5OworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJCXsKKwkJCXBBZC0+RGlhZ1N0cnVjdC5UeERhdGFDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XSsrOworCQkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwkJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisJLy8gZm9yIHJhdGUgYWRhcGF0aW9uCisJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKK30KKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspCit7CisJUEhUVFJBTlNNSVRfU0VUVElORwlwVHJhbnNtaXQ7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisKKwkvLworCS8vIHVwZGF0ZSBUWFdJCisJLy8KKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKworCWlmIChwTWFjRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoKQorCXsKKwkJcFR4V0ktPnR4b3AgPSBJRlNfSFRUWE9QOworCisJCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCQlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKworCQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCisJCS8vIHNldCBQSUQgZm9yIFR4UmF0ZVN3aXRjaGluZworCQlwVHhXSS0+UGFja2V0SWQgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwVHhXSS0+QU1QRFUgPSAoKHBNYWNFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPT0gMCkgPyBUUlVFOiBGQUxTRSk7CisJcFR4V0ktPk1JTU9wcyA9IDA7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCisJeworCQkvLyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAoKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJCXsKKwkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQlwVHhXSS0+TUlNT3BzID0gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERCR19ESUFHTk9TRQorCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJeworCQlwQWQtPkRpYWdTdHJ1Y3QuVHhEYXRhQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF0rKzsKKwkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwl9CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYRF9TVFJVQwkJcFR4RCwKKwlJTglCT09MRUFOIAkJYldJViwKKwlJTglVQ0hBUgkJCVF1ZXVlU0VMKQoreworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCisJcFR4RC0+V0lWCT0gKGJXSVYpID8gMTogMDsKKwlwVHhELT5RU0VMPSAoUXVldWVTRUwpOworCWlmIChwQWQtPmJHZW5PbmVIQ0NBID09IFRSVUUpCisJCXBUeEQtPlFTRUw9IEZJRk9fSENDQTsKKwlwVHhELT5ETUFET05FID0gMDsKK30KKworCisvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtCisvLyAxLiBNRUFESUFfQ09OTkVDVEVECisvLyAyLiBBR0dSRUdBVElPTl9JTl9VU0VECisvLyAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkCisvLyA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBQcmV2QWRkcjEsCisJSU4JUFVDSEFSCQkJcDgwMjNoZHIpCit7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUKKwlpZiAoKHA4MDIzaGRyWzEyXSA9PSAweDg4KSAmJiAocDgwMjNoZHJbMTNdID09IDB4OGUpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgbXVsdGljYXN0L2Jyb2FkY2FzdCBmcmFtZQorCWlmIChwODAyM2hkclswXSAmIDB4MDEpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChJTkZSQV9PTihwQWQpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKSAvLyB1bmljYXN0IHRvIHNhbWUgU1RBCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCSAgIENoZWNrIHRoZSBNU0RVIEFnZ3JlZ2F0aW9uIHBvbGljeQorCTEuSFQgYWdncmVnYXRpb24gaXMgQS1NU0RVCisJMi5sZWdhYWN5IHJhdGUgYWdncmVnYXRpb24gaXMgc29mdHdhcmUgYWdncmVnYXRpb24gYnkgUmFsaW5rLgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUGVlcklzQWdncmVPbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORwkJICAgVHhSYXRlLAorCUlOCVBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KQoreworCVVMT05HCUFGbGFncyA9IChmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQgfCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKKworCWlmIChwTWFjRW50cnkgIT0gTlVMTCAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIEFGbGFncykpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCQl7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoVHhSYXRlID49IFJBVEVfNiAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlICYmICghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKKwkJewkvLyBsZWdhY3kgIFJhbGluayBBZ2dyZWdhdGlvbiBzdXBwb3J0CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgYW5kIGZpbmUgdGhlIHBhY2tldCB3YWl0aW5nIGluIFNXIHF1ZXVlIHdpdGggaGlnaGVzdCBwcmlvcml0eQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlwUXVldWUJCVBvaW50ZXIgdG8gV2FpdGluZyBRdWV1ZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworUFFVRVVFX0hFQURFUglSVE1QQ2hlY2tUeFN3UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBVQ0hBUgkJCXBRdWVJZHgpCit7CisKKwlVTE9ORwlOdW1iZXI7CisKKwlOdW1iZXIgPSBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLk51bWJlcjsKKworCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19WSTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfQkU7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX0JLOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0hDQ0E7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7CisJfQorCisJLy8gTm8gcGFja2V0IHBlbmRpbmcgaW4gVHggU3cgcXVldWUKKwkqcFF1ZUlkeCA9IFFJRF9BQ19CSzsKKworCXJldHVybiAoTlVMTCk7Cit9CisKKworI2lmZGVmIFJUMjg2MAorQk9PTEVBTiAgUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJUXVlSWR4KQoreworCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKKwlQVFhEX1NUUlVDCSAgcFR4RDsKKyNpZmRlZglSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworI2VuZGlmCisJUE5ESVNfUEFDS0VUICBwUGFja2V0OworCVVDSEFSCUZSRUUgPSAwOworCVRYRF9TVFJVQwlUeEQsICpwT3JpVHhEOworCS8vVUxPTkcJCUlycUZsYWdzOworCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOworCisKKwlBU1NFUlQoUXVlSWR4IDwgTlVNX09GX1RYX1JJTkcpOworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYsICZwVHhSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBUeFJpbmctPlR4U3dGcmVlSWR4ICE9IHBUeFJpbmctPlR4RG1hSWR4KQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOworCisJCWlmICgoQVRFX09OKHBBZCkpICYmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpKQorCQl7CisJCQlpZiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkKKwkJCXsKKwkJCQlwQWQtPmF0ZS5UeERvbmVDb3VudCsrOworCQkJCS8vcEFkLT5hdGUuUmVwZWF0Kys7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCisJCQkJLyogYWx3YXlzIHVzZSBRSURfQUNfQkUgYW5kIEZJRk9fRURDQSAqLworCQkJCUFTU0VSVChwQWQtPmF0ZS5RSUQgPT0gMCk7CisJCQkJcEFkLT5hdGUuVHhBYzArKzsKKworCQkJCUZSRUUrKzsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOworCQkJCXBPcmlUeEQgPSBwVHhEOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKKwkJCQlwVHhEID0gJlR4RDsKKyNlbHNlCisJCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOworCQkgICAgICAgIHBPcmlUeEQgPSBwRGVzdFR4RCA7CisJCSAgICAgICAgVHhEID0gKnBEZXN0VHhEOworCQkgICAgICAgIHBUeEQgPSAmVHhEOworCQkgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkJcFR4RC0+RE1BRE9ORSA9IDA7CisKKwkJCQlwSGVhZGVyODAyMTEgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5EbWFCdWYuQWxsb2NWYSArIHNpemVvZihUWFdJX1NUUlVDKTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyODAyMTEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKwkJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcjgwMjExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJCQkJaWYgICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSAmJiAocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuVHhEb25lQ291bnQgPCBwQWQtPmF0ZS5UeENvdW50KSkKKwkJCQl7CisJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOworCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOworCQkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJCQkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJCQlnb3RvIGtpY2tfb3V0OworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5hdGUuVHhTdGF0dXMgPT0gMSkvKiBvciAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSA/Pz8gKi8gJiYgKHBBZC0+YXRlLlR4RG9uZUNvdW50ID09IHBBZC0+YXRlLlR4Q291bnQpKS8vPD09PT09PT09PT09PT09PT09PT09PT09PVBFVEVSCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImFsbCBUeCBpcyBkb25lXG4iKSk7CisJCQkJCS8vIFR4IHN0YXR1cyBlbnRlcnMgaWRsZSBtb2RlLgorCQkJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisJCQkJfQorCQkJCWVsc2UgaWYgKCEocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCS8qIG5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3MgdGhlIFN0b3AgVFggYm90dG9uLiAqLworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIm5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3NlZCB0aGUgU3RvcCBUWCBib3R0b21cbiIpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWQtPmF0ZS5Nb2RlID0gMHglMDJ4XG4iLCBwQWQtPmF0ZS5Nb2RlKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwoInBUeFJpbmctPlR4U3dGcmVlSWR4ID0gJWRcbiIsIHBUeFJpbmctPlR4U3dGcmVlSWR4KSk7CisgIAkJCQl9CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZWxzZQorICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAJCSpwRGVzdFR4RCA9IFR4RDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KKwkJLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKKwkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworCisJCS8qIE5vdGUgOiBJZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSwgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlLiAqLworCQlGUkVFKys7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgICAgICAgICBwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKwkJcE9yaVR4RCA9IHBUeEQ7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOworCQlwVHhEID0gJlR4RDsKKyNlbHNlCisgICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKyAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKKyAgICAgICAgVHhEID0gKnBEZXN0VHhEOworICAgICAgICBwVHhEID0gJlR4RDsKKyAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKworCQlwVHhELT5ETUFET05FID0gMDsKKworCisjaWZkZWYgUkFMSU5LX0FURQorCQkvKiBFeGVjdXRpb24gb2YgdGhpcyBibG9jayBpcyBub3QgYWxsb3dlZCB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCQlpZiAoIShBVEVfT04ocEFkKSkpCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCXsKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorCQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfNVZUKHBQYWNrZXQpKQorCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZWxzZQorI2VuZGlmIC8vIENPTkZJR181VlRfRU5IQU5DRSAvLworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCUFTU0VSVChwUGFja2V0ID09IE5VTEwpOworCQkJaWYgKHBQYWNrZXQpCisJCQl7CisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisJCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF81VlQocFBhY2tldCkpCisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIDE2LCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQllbHNlCisjZW5kaWYgLy8gQ09ORklHXzVWVF9FTkhBTkNFIC8vCisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQl9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICAocFR4RC0+U0RMZW4xICsgcFR4RC0+U0RMZW4wKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUXVlSWR4XSArKzsKKwkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhTd0ZyZWVJZHgsIFRYX1JJTkdfU0laRSk7CisJCS8qIGdldCB0eF90ZHhfaWR4IGFnYWluICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYgLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAqcERlc3RUeEQgPSBUeEQ7CisjZWxzZQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQora2lja19vdXQ6CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLworCQkvLyBBVEVfVFhDT05UIG1vZGUgYWxzbyBuZWVkIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLCBzbyBsZXQgaXQgaW4uCisJCS8vIEFURV9TVE9QIG11c3QgYmUgY2hhbmdlZCBub3QgdG8gYmUgMHhmZgorCQkvLyB0byBwcmV2ZW50IGl0IGZyb20gcnVubmluZyBpbnRvIHRoaXMgYmxvY2suCisJCS8vCisJCWlmICgocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkpCisJCXsKKwkJCS8vIFR4RG9uZUNvdW50KysgaGFzIGJlZW4gZG9uZSBpZiBRQSBpcyB1c2VkLgorCQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gRkFMU0UpCisJCQl7CisJCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKKwkJCX0KKwkJCWlmICgoKHBBZC0+YXRlLlR4Q291bnQgLSBwQWQtPmF0ZS5UeERvbmVDb3VudCArIDEpID49IFRYX1JJTkdfU0laRSkpCisJCQl7CisJCQkJLyogTm90ZSA6IFdlIGluY3JlYXNlIFR4Q3B1SWR4IGhlcmUsIG5vdCBUeFN3RnJlZUlkeCAhICovCisJCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTi8vPD09PT09PT09PT09PT09PT09PT09PT09PT09UEVURVIKKwkJCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHhdLkFsbG9jVmEpOworCQkJCXBPcmlUeEQgPSBwVHhEOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKKwkJCQlwVHhEID0gJlR4RDsKKyNlbHNlCisJCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeF0uQWxsb2NWYSk7CisJCSAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKKwkJICAgICAgICBUeEQgPSAqcERlc3RUeEQ7CisJCSAgICAgICAgcFR4RCA9ICZUeEQ7CisJCSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCQlwVHhELT5ETUFET05FID0gMDsKKyNpZm5kZWYgUlRfQklHX0VORElBTi8vPD09PT09PT09PT09PT09PT09PT09PT09PT09UEVURVIKKyAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZWxzZQorICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAJCSpwRGVzdFR4RCA9IFR4RDsKKyNlbmRpZgorCQkJCS8vIGtpY2sgVHgtUmluZy4KKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQkJfQorCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCX0KKworCisJcmV0dXJuICBiUmVzY2hlZHVsZTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFRYIFJpbmdzIERNQSBEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKQoreworICAgIHVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7CisKKwkvLyBNYWtlIHN1cmUgVHggcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5IY2NhRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0hDQ0EpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOworCisJLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisJLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisKKwlyZXR1cm4gIGJSZXNjaGVkdWxlOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIE1HTVQgcmluZyBETUEgZG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYRF9TVFJVQwkgcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwlVQ0hBUglGUkVFID0gMDsKKwlQUlRNUF9NR01UX1JJTkcgcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX01HTVREVFhfSURYLCAmcE1nbXRSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBNZ210UmluZy0+VHhTd0ZyZWVJZHghPSBwTWdtdFJpbmctPlR4RG1hSWR4KQorCXsKKwkJRlJFRSsrOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBNZ210UmluZy0+Q2VsbFtwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKyAgICAgICAgVHhEID0gKnBEZXN0VHhEOworICAgICAgICBwVHhEID0gJlR4RDsKKwkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZWxzZQorCQlwVHhEID0gKFBUWERfU1RSVUMpIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7CisjZW5kaWYKKwkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7CisKKworCQlpZiAocFBhY2tldCkKKwkJeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OworCQlpZiAocFBhY2tldCkKKwkJeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJSU5DX1JJTkdfSU5ERVgocE1nbXRSaW5nLT5UeFN3RnJlZUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorICAgICAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICAgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgVFJVRSwgVFlQRV9UWEQpOworI2VuZGlmCisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUFyZ3VtZW50czoKKwkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlci4gRGVxdWV1ZSBhbGwgcG93ZXIgc2FmZSBkZWxheWVkIGJyYW9kY2FzdCBmcmFtZXMgYWZ0ZXIgYmVhY29uLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCXsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJeworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKKwkJfQorCX0KKworCit9CisKK1ZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHICwgJkdsb0NmZy53b3JkKTsKKworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCVJUTVBFbmFibGVSeFR4KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQgXG4iKSk7Cit9CisKKworVk9JRCBEQkdQUklOVF9UWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpCit7CisJVUlOVDMyCQlBYzBCYXNlOworCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7CisJaW50CQkJaTsKKwlQVUxPTkcJcHRlbXA7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAiICApKTsKKwlzd2l0Y2ggKFF1ZUlkeCkKKwl7CisJCWNhc2UgUUlEX0FDX0JFOgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjAsICZBYzBCYXNlKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDAsICZBYzBTd0lkeCk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwLCAmQWMwSHdJZHgpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBRSURfQUNfQkUgREVTQ1JJUFRPUiAgXG4gIiAgKSk7CisJCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCisJCQl7CisJCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7CisJCQl9CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKKwkJCWJyZWFrOworCQljYXNlIFFJRF9BQ19CSzoKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIxLCAmQWMwQmFzZSk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgxLCAmQWMwU3dJZHgpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMSwgJkFjMEh3SWR4KTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX0JLIERFU0NSSVBUT1IgIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfQUNfVkk6CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMiwgJkFjMEJhc2UpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMiwgJkFjMFN3SWR4KTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDIsICZBYzBId0lkeCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WSSBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WSV0uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfQUNfVk86CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMywgJkFjMEJhc2UpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMywgJkFjMFN3SWR4KTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDMsICZBYzBId0lkeCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WTyBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfTUdNVDoKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFI1LCAmQWMwQmFzZSk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFg1LCAmQWMwU3dJZHgpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYNSwgJkFjMEh3SWR4KTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgQWxsIFFJRF9NR01UICBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCisJCQl7CisJCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7CisJCQl9CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVF9FUlIoKCJEQkdQUklOVF9UWF9SSU5HKFJpbmcgJWQpIG5vdCBzdXBwb3J0ZWRcbiIsIFF1ZUlkeCkpOworCQkJYnJlYWs7CisJfQorCUFDMGZyZWVJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUeFJpbmclZCwgVFhfRFRYX0lEWD0lZCwgVFhfQ1RYX0lEWD0lZFxuIiwgUXVlSWR4LCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgCVR4U3dGcmVlSWR4WyVkXSIsIEFDMGZyZWVJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIJcGVuZGluZy1ORElTPSVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50KSk7CisKKworfQorCisKK1ZPSUQgREJHUFJJTlRfUlhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQpCit7CisJVUlOVDMyCQlBYzBCYXNlOworCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7CisJaW50CQkJaTsKKwlVSU5UMzIJKnB0ZW1wOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIiAgKSk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9CQVNFX1BUUiwgJkFjMEJhc2UpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfQ1JYX0lEWCwgJkFjMFN3SWR4KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZBYzBId0lkeCk7CisJQUMwZnJlZUlkeCA9IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBSWCBEU1AgIFxuICIgICkpOworCWZvciAoaT0wO2k8UlhfUklOR19TSVpFO2krKykKKwl7CisJCXB0ZW1wID0gKFVJTlQzMiAqKXBBZC0+UnhSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4eDogJTA4eDogJTA4eDogJTA4eFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeFJpbmcsIFJYX0RSWF9JRFg9JWQsIFJYX0NSWF9JRFg9JWQgXG4iLCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgCVJ4U3dSZWFkSWR4IFslZF09IiwgQUMwZnJlZUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglwZW5kaW5nLU5ESVM9JWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU5OSU5HLCBzdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwkvLworCS8vIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZAorCS8vIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikKKwkvLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCisJLy8gc2V0IEJCUF9SNjYgdG8gMHgzMC8weDQwIHdoZW4gc2Nhbm5pbmcgKEFzaWNTd2l0Y2hDaGFubmVsIHdpbGwgc2V0IFI2NiBhY2NvcmRpbmcgdG8gY2hhbm5lbCB3aGVuIHNjYW5uaW5nKQorCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU4gZG9uZSwgcmVzdW1lIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Cit9CisKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlVU0hPUlQgCQkJUGF5bG9hZFNpemU7CisJVVNIT1JUIAkJCVN1YkZyYW1lU2l6ZTsKKwlQSEVBREVSXzgwMl8zIAlwQU1TRFVzdWJoZWFkZXI7CisJVUlOVAkJCW5NU0RVOworICAgIFVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCisJUFVDSEFSCQkJcFBheWxvYWQsIHBEQSwgcFNBLCBwUmVtb3ZlZExMQ1NOQVA7CisJUE5ESVNfUEFDS0VUCXBDbG9uZVBhY2tldDsKKworCisKKwluTVNEVSA9IDA7CisKKwl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpCisJeworCisJCW5NU0RVKys7CisKKwkJcEFNU0RVc3ViaGVhZGVyID0gKFBIRUFERVJfODAyXzMpcERhdGE7CisJCVBheWxvYWRTaXplID0gcEFNU0RVc3ViaGVhZGVyLT5PY3RldFsxXSArIChwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzBdPDw4KTsKKwkJU3ViRnJhbWVTaXplID0gUGF5bG9hZFNpemUgKyBMRU5HVEhfODAyXzM7CisKKworCQlpZiAoKERhdGFTaXplIDwgU3ViRnJhbWVTaXplKSB8fCAoUGF5bG9hZFNpemUgPiAxNTE4ICkpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKKwkJcERBID0gcERhdGE7CisJCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOworCisJCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCisgICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCisJCXsKKwkJICAgIC8vIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uCisJCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkgICBtZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJICAgRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7CisJCSAgIFdwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7CisJCSAgIGtmcmVlKEVsZW0pOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCSAgICAgICAgCWlmIChwUmVtb3ZlZExMQ1NOQVApCisJICAgICAgICAJeworCSAgICAJCQlwUGF5bG9hZCAtPSBMRU5HVEhfODAyXzM7CisJICAgIAkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKKwkgICAgCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwgTEVOR1RIXzgwMl8zKTsKKwkgICAgICAgIAl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlwQ2xvbmVQYWNrZXQgPSBDbG9uZVBhY2tldChwQWQsIHBQYWNrZXQsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7CisJCWlmIChwQ2xvbmVQYWNrZXQpCisJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwQ2xvbmVQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKworCisJCS8vIEEtTVNEVSBoYXMgcGFkZGluZyB0byBtdWx0aXBsZSBvZiA0IGluY2x1ZGluZyBzdWJmcmFtZSBoZWFkZXIuCisJCS8vIGFsaWduIFN1YkZyYW1lU2l6ZSB1cCB0byBtdWx0aXBsZSBvZiA0CisJCVN1YkZyYW1lU2l6ZSA9IChTdWJGcmFtZVNpemUrMykmKH4weDMpOworCisKKwkJaWYgKFN1YkZyYW1lU2l6ZSA+IDE1MjggfHwgU3ViRnJhbWVTaXplIDwgMzIpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKERhdGFTaXplID4gU3ViRnJhbWVTaXplKQorCQl7CisJCQlwRGF0YSArPSBTdWJGcmFtZVNpemU7CisJCQlEYXRhU2l6ZSAtPSBTdWJGcmFtZVNpemU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBlbmQgb2YgQS1NU0RVCisJCQlEYXRhU2l6ZSA9IDA7CisJCX0KKwl9CisKKwkvLyBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIG5NU0RVOworfQorCisKK1VJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUFVDSEFSCQkJcERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUlOVAkJCW5NU0RVID0gMDsKKworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFBhY2tldCwgcERhdGEsIERhdGFTaXplKTsKKworCXJldHVybiBuTVNEVTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUxvb2sgdXAgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBNQUMgdGFibGUuIFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZC4KKwlSZXR1cm46CisJCXBFbnRyeSAtIHBvaW50ZXIgdG8gdGhlIE1BQyBlbnRyeTsgTlVMTCBpcyBub3QgZm91bmQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJUFVDSEFSIHBBZGRyKQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCQkJcEFkZHIsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlJTiBCT09MRUFOCUNsZWFuQWxsKQoreworCVVDSEFSIEhhc2hJZHg7CisJaW50IGksIEZpcnN0V2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJRmlyc3RXY2lkID0gMTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJRmlyc3RXY2lkID0gMjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWZvciAoaSA9IEZpcnN0V2NpZDsgaTwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgICAvLyBza2lwIGVudHJ5IzAgc28gdGhhdCAiZW50cnkgaW5kZXggPT0gQUlEIiBmb3IgZmFzdCBsb29rdXAKKwl7CisJCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5CisJCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaT09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzRGxzID09IEZBTFNFKQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQorCQkJeworCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7CisJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChhcGlkeCA+PSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKQorCQkJeworCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IFRSVUU7CisJCQkJcEVudHJ5LT5pc0NhY2hlZCA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CisJCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IEZBTFNFOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOworCQkJcEVudHJ5LT5wQWQgPSBwQWQ7CisJCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKworCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOworCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0RscykKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQllbHNlCisJCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OworCisJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisjaWZkZWYgUlQyODYwCisJCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgcEVudHJ5LT5hcGlkeCwgKFVDSEFSKWkpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX05FR09USUFUSU5HOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKKwkJCQkocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQorCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCWVsc2UKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQllbHNlCisjZW5kaWYgLy9RT1NfRExTX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlwRW50cnktPlBNS0lEX0NhY2hlSWR4ID0gRU5UUllfTk9UX0ZPVU5EOworCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBBZGRyKTsKKwkJCXBFbnRyeS0+U3N0ID0gU1NUX05PVF9BVVRIOworCQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBBU19OT1RfQVVUSDsKKwkJCXBFbnRyeS0+QWlkID0gKFVTSE9SVClpOyAgLy8wOworCQkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IDA7CisJCQlwRW50cnktPlBzTW9kZSA9IFBXUl9BQ1RJVkU7CisJCQlwRW50cnktPlBzUUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEVudHJ5LT5Qc1F1ZXVlKTsKKworCisJCQlwQWQtPk1hY1RhYi5TaXplICsrOworCQkJLy8gQWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCisJCQlSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSk7CisKKworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydEVudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIsaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCisJaWYgKHBFbnRyeSkKKwl7CisJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJeworCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCX0KKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXJldHVybiBwRW50cnk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpCit7CisJVVNIT1JUIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnksICpwUHJldkVudHJ5LCAqcFByb2JlRW50cnk7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisKKwlpZiAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorIAkJfHwgcEVudHJ5LT5WYWxpZEFzRGxzCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCSkpCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKworCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQorCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCB3Y2lkKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKKwkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgcEVudHJ5LT5BaWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCXBQcmV2RW50cnkgPSBOVUxMOworCQkJcFByb2JlRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJQVNTRVJUKHBQcm9iZUVudHJ5KTsKKworCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJZG8KKwkJCXsKKwkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCXsKKwkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkvLyBub3QgZm91bmQgISEhCisJCQlBU1NFUlQocFByb2JlRW50cnkgIT0gTlVMTCk7CisKKwkJCVJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJTUzAsIHdjaWQpOworCisKKwkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworCQl9CisKKworICAgCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQlwQWQtPk1hY1RhYi5TaXplIC0tOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fRlVOQ1RJT05fXywgd2NpZCk7CisJCX0KKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy9SZXNldCBvcGVyYXRpbmcgbW9kZSB3aGVuIG5vIFN0YS4KKwlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAwKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gMDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwIC8qcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKi8sIChBTExOX1NFVFBST1RFQ1QpLCBUUlVFLCAwIC8qcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiovKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXNldCB0aGUgZW50aXJlIE1BQyB0YWJsZS4gQWxsIHBhY2tldHMgcGVuZGluZyBpbgorCQl0aGUgcG93ZXItc2F2aW5nIHF1ZXVlcyBhcmUgZnJlZWQgaGVyZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1hY1RhYmxlUmVzZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgIHBBZCkKK3sKKwlpbnQgICAgICAgICBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVSZXNldFxuIikpOworCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworI2lmZGVmIFJUMjg2MAorCQlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIGkpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpCisJICAgeworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID0gRkFMU0U7CisKKworCisKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBpKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKKwlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKKwlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKKwlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAorCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCit7CisJQ09QWV9NQUNfQUREUihBc3NvY1JlcS0+QWRkciwgcEFkZHIpOworCS8vIEFkZCBtYXNrIHRvIHN1cHBvcnQgODAyLjExYiBtb2RlIG9ubHkKKwlBc3NvY1JlcS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87IC8vIG5vdCBjZi1wb2xsYWJsZSwgbm90IGNmLXBvbGwtcmVxdWVzdAorCUFzc29jUmVxLT5UaW1lb3V0ID0gVGltZW91dDsKKwlBc3NvY1JlcS0+TGlzdGVuSW50diA9IExpc3RlbkludHY7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKKwlJTiBQVUNIQVIgcEFkZHIsCisJSU4gVVNIT1JUIFJlYXNvbikKK3sKKwlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7CisJRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgdGhlIG91dCBnb2luZyBmcmFtZSwgaWYgdGhpcyBpcyBhbiBESENQIG9yIEFSUCBkYXRhZ3JhbQorCXdpbGwgYmUgZHVwbGljYXRlIGFub3RoZXIgZnJhbWUgYXQgbG93IGRhdGEgcmF0ZSB0cmFuc21pdC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwUGFja2V0IAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJVG8gYmUgZHVwbGljYXRlIGF0IExvdyBkYXRhIHJhdGUgdHJhbnNtaXQuICgxbWIpCisJCUZBTFNFCQlEbyBub3RoaW5nLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJCU1BQyBoZWFkZXIgKyBJUCBIZWFkZXIgKyBVRFAgSGVhZGVyCisJCSAgMTQgQnl0ZXMJICAyMCBCeXRlcworCisJCVVEUCBIZWFkZXIKKwkJMDB8MDF8MDJ8MDN8MDR8MDV8MDZ8MDd8MDh8MDl8MTB8MTF8MTJ8MTN8MTR8MTV8CisJCQkJCQlTb3VyY2UgUG9ydAorCQkxNnwxN3wxOHwxOXwyMHwyMXwyMnwyM3wyNHwyNXwyNnwyN3wyOHwyOXwzMHwzMXwKKwkJCQkJRGVzdGluYXRpb24gUG9ydAorCisJCXBvcnQgMHg0MyBtZWFucyBCb290c3RyYXAgUHJvdG9jb2wsIHNlcnZlci4KKwkJUG9ydCAweDQ0IG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgY2xpZW50LgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitCT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKKwlVTE9ORwkJCU51bWJlck9mQnl0ZXNSZWFkID0gMDsKKwlVTE9ORwkJCUN1cnJlbnRPZmZzZXQgPSAwOworCVBWT0lECQkJcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKKwlVSU5UCQkJTmRpc0J1ZmZlckxlbmd0aDsKKwlQVUNIQVIJCQlwU3JjOworCVVTSE9SVAkJCVByb3RvY29sOworCVVDSEFSCQkJQnl0ZU9mZnNldDM2ID0gMDsKKwlVQ0hBUgkJCUJ5dGVPZmZzZXQzOCA9IDA7CisJQk9PTEVBTiAJCVJlYWRGaXJzdFBhcm0gPSBUUlVFOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sIChQVUNIQVIgKikmcFZpcnR1YWxBZGRyZXNzLCAmTmRpc0J1ZmZlckxlbmd0aCk7CisKKwlOdW1iZXJPZkJ5dGVzUmVhZCArPSBOZGlzQnVmZmVyTGVuZ3RoOworCXBTcmMgPSAoUFVDSEFSKSBwVmlydHVhbEFkZHJlc3M7CisJUHJvdG9jb2wgPSAqKHBTcmMgKyAxMikgKiAyNTYgKyAqKHBTcmMgKyAxMyk7CisKKwkvLworCS8vIENoZWNrIERIQ1AgJiBCT09UUCBwcm90b2NvbAorCS8vCisJd2hpbGUgKE51bWJlck9mQnl0ZXNSZWFkIDw9IFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGgpCisJeworCQlpZiAoKE51bWJlck9mQnl0ZXNSZWFkID49IDM1KSAmJiAoUmVhZEZpcnN0UGFybSA9PSBUUlVFKSkKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM1IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzYgPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCVJlYWRGaXJzdFBhcm0gPSBGQUxTRTsKKwkJfQorCisJCWlmIChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNykKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM3IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzggPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCS8vRW5kIG9mIFJlYWQKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBDaGVjayBmb3IgREhDUCAmIEJPT1RQIHByb3RvY29sCisJaWYgKChCeXRlT2Zmc2V0MzYgIT0gMHg0NCkgfHwgKEJ5dGVPZmZzZXQzOCAhPSAweDQzKSkKKwkJeworCQkvLworCQkvLyAyMDU0IChoZXggMDgwNikgZm9yIEFSUCBkYXRhZ3JhbXMKKwkJLy8gaWYgdGhpcyBwYWNrZXQgaXMgbm90IEFSUCBkYXRhZ3JhbXMsIHRoZW4gZG8gbm90aGluZworCQkvLyBBUlAgZGF0YWdyYW1zIHdpbGwgYWxzbyBiZSBkdXBsaWNhdGUgYXQgMW1iIGJyb2FkY2FzdCBmcmFtZXMKKwkJLy8KKwkJaWYgKFByb3RvY29sICE9IDB4MDgwNiApCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCXJldHVybiBUUlVFOworfQorCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVVTSE9SVAlUeXBlTGVuOworCVVDSEFSCUJ5dGUwLCBCeXRlMTsKKwlQVUNIQVIJcFNyY0J1ZjsKKwlVSU5UMzIJcGt0TGVuOworCVVJTlQxNiAJc3JjUG9ydCwgZHN0UG9ydDsKKwlCT09MRUFOCXN0YXR1cyA9IFRSVUU7CisKKworCXBTcmNCdWYgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcGt0TGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwlBU1NFUlQocFNyY0J1Zik7CisKKwlSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMocFBhY2tldCwgMCk7CisKKwkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKKwlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpICsgcFNyY0J1ZlsxM107CisKKwlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgorCisJaWYgKFR5cGVMZW4gPD0gMTUwMCkKKwl7CS8vIDgwMi4zLCA4MDIuMyBMTEMKKwkJLyoKKwkJCURlc3RNQUMoNikgKyBTcmNNQUMoNikgKyBMZW5naHQoMikgKworCQkJRFNBUCgxKSArIFNTQVAoMSkgKyBDb250cm9sKDEpICsKKwkJCWlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KKwkJCQk9PiArIFNOQVAgKDUsIE9yaWdpbmF0aW9uSUQoMykgKyBldGhlclR5cGUoMikpCisJCSovCisJCWlmIChwU3JjQnVmWzBdID09IDB4QUEgJiYgcFNyY0J1ZlsxXSA9PSAweEFBICYmIHBTcmNCdWZbMl0gPT0gMHgwMykKKwkJeworCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCA2LCAmQnl0ZTAsICZCeXRlMSk7CisJCQlSVE1QX1NFVF9QQUNLRVRfTExDU05BUChwUGFja2V0LCAxKTsKKwkJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQlwU3JjQnVmICs9IDg7IC8vIFNraXAgdGhpcyBMTEMvU05BUCBoZWFkZXIKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vSXQganVzdCBoYXMgMy1ieXRlIExMQyBoZWFkZXIsIG1heWJlIGEgbGVnYWN5IGV0aGVyIHR5cGUgZnJhbWUuIHdlIGRpZG4ndCBoYW5kbGUgaXQuCisJCX0KKwl9CisKKwkvLyBJZiBpdCdzIGEgVkxBTiBwYWNrZXQsIGdldCB0aGUgcmVhbCBUeXBlL0xlbmd0aCBmaWVsZC4KKwlpZiAoVHlwZUxlbiA9PSAweDgxMDApCisJeworCQkvKiAweDgxMDAgbWVhbnMgVkxBTiBwYWNrZXRzICovCisKKwkJLyogRGVzdC4gTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKKwkJICAgU291cmNlIE1BQyBBZGRyZXNzICg2LWJ5dGVzKSArCisJCSAgIExlbmd0aC9UeXBlID0gODAyLjFRIFRhZyBUeXBlICgyLWJ5dGUpICsKKwkJICAgVGFnIENvbnRyb2wgSW5mb3JtYXRpb24gKDItYnl0ZXMpICsKKwkJICAgTGVuZ3RoIC8gVHlwZSAoMi1ieXRlcykgKworCQkgICBkYXRhIHBheWxvYWQgKDAtbiBieXRlcykgKworCQkgICBQYWQgKDAtcCBieXRlcykgKworCQkgICBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoNC1ieXRlcykgKi8KKworCQlSVE1QX1NFVF9QQUNLRVRfVkxBTihwUGFja2V0LCAxKTsKKwkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCAyLCAmQnl0ZTAsICZCeXRlMSk7CisJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisKKwkJcFNyY0J1ZiArPSA0OyAvLyBTa2lwIHRoZSBWTEFOIEhlYWRlci4KKwl9CisKKwlzd2l0Y2ggKFR5cGVMZW4pCisJeworCQljYXNlIDB4MDgwMDoKKwkJCXsKKwkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CisJCQkJaWYgKCoocFNyY0J1ZiArIDkpID09IDB4MTEpCisJCQkJewkvLyB1ZHAgcGFja2V0CisJCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsJLy8gMTQgZm9yIGV0aGVybmV0IGhlYWRlciwgMjAgZm9yIElQIGhlYWRlcgorCisJCQkJCXBTcmNCdWYgKz0gMjA7CS8vIFNraXAgdGhlIElQIGhlYWRlcgorCQkJCQlzcmNQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopcFNyY0J1ZikpOworCQkJCQlkc3RQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopKHBTcmNCdWYgKzIpKSk7CisKKwkJCQkJaWYgKChzcmNQb3J0PT0weDQ0ICYmIGRzdFBvcnQ9PTB4NDMpIHx8IChzcmNQb3J0PT0weDQzICYmIGRzdFBvcnQ9PTB4NDQpKQorCQkJCQl7CS8vSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0CisJCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MDgwNjoKKwkJCXsKKwkJCQkvL0FSUCBQYWNrZXQuCisJCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDg4OGU6CisJCQl7CisJCQkJLy8gRUFQT0wgUGFja2V0LgorCQkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gRkFMU0U7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKKworCitWT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKKwkJeworCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7CisJQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKKwlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOworCisJaWYgKHJzc2kwICE9IDApCisJeworCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOworCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOworCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOworCX0KKworCWlmIChyc3NpMSAhPSAwKQorCXsKKwkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKKwkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKKwkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKKwl9CisKKwlpZiAocnNzaTIgIT0gMCkKKwl7CisJCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7CisJCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOworCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOworCX0KK30KKworCisKKy8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKworCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKKwkvLyAyLiByZW1vdmUgTExDCisJLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAorCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikKKwl7CisKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKworCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkvLworCS8vIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseQorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKy8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKK1ZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwl7CisJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCisJCXsKKwkJCS8vIGhhbmRsZSBBLU1TRFUKKwkJCUluZGljYXRlX0FNU0RVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJfQorfQorCisKK1ZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisJVUlOVDE2CQkJTXNkdTJTaXplOworCVVJTlQxNiAJCQlQYXlsb2FkMVNpemUsIFBheWxvYWQyU2l6ZTsKKwlQVUNIQVIgCQkJcERhdGEyOworCVBORElTX1BBQ0tFVAlwUGFja2V0MiA9IE5VTEw7CisKKworCisJTXNkdTJTaXplID0gKihwUnhCbGstPnBEYXRhKSArICgqKHBSeEJsay0+cERhdGErMSkgPDwgOCk7CisKKwlpZiAoKE1zZHUyU2l6ZSA8PSAxNTM2KSAmJiAoTXNkdTJTaXplIDwgcFJ4QmxrLT5EYXRhU2l6ZSkpCisJeworCQkvKiBza2lwIHR3byBieXRlIE1TRFUyIGxlbiAqLworCQlwUnhCbGstPnBEYXRhICs9IDI7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKKwl9CisJZWxzZQorCXsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCS8vIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZQorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ICsrOworCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7CisJUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOworCisJcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlwUGFja2V0MiA9IGR1cGxpY2F0ZV9wa3QocEFkLCAocERhdGEyLUxFTkdUSF84MDJfMyksIExFTkdUSF84MDJfMywgcERhdGEyLCBQYXlsb2FkMlNpemUsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmICghcFBhY2tldDIpCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJLy8gdXBkYXRlIHBheWxvYWQgc2l6ZSBvZiAxc3QgcGFja2V0CisJcFJ4QmxrLT5EYXRhU2l6ZSA9IFBheWxvYWQxU2l6ZTsKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocFBhY2tldDIpCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCisJewkJCQkJCQkJXAorCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCisJCV9mcmFnRnJhbWUuU2VxdWVuY2UgPSAwOwlcCisJCV9mcmFnRnJhbWUuTGFzdEZyYWcgPSAwOwlcCisJCV9mcmFnRnJhbWUuRmxhZ3MgPSAwOwkJXAorCX0KKworCitQTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVQ0hBUgkJCSpwRnJhZ0J1ZmZlciA9IE5VTEw7CisJQk9PTEVBTiAJCWJSZWFzc0RvbmUgPSBGQUxTRTsKKwlVQ0hBUgkJCUhlYWRlclJvb20gPSAwOworCisKKwlBU1NFUlQocEhlYWRlcik7CisKKwlIZWFkZXJSb29tID0gcERhdGEgLSAoVUNIQVIgKilwSGVhZGVyOworCisJLy8gUmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cworCWlmIChwSGVhZGVyLT5GcmFnID09IDApCQkvLyBGcmFnLiBOdW1iZXIgaXMgMCA6IEZpcnN0IGZyYWcgb3Igb25seSBvbmUgcGt0CisJeworCQkvLyB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKKwkJeworCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOworCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsCSBwSGVhZGVyLCBwQWQtPkZyYWdGcmFtZS5SeFNpemUpOworCQkJcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UgPSBwSGVhZGVyLT5TZXF1ZW5jZTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gU2hvdWxkIGJlIDAKKwkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9PSAwKTsKKwkJCWdvdG8gZG9uZTsJLy8gZW5kIG9mIHByb2Nlc3NpbmcgdGhpcyBmcmFtZQorCQl9CisJfQorCWVsc2UJLy9NaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQKKwl7CisJCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8CisJCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCisJCXsKKwkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOworCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJfQorCQllbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpCisJCXsKKwkJCS8vIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7CisJCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQl9CisKKyAgICAgICAgLy8KKwkJLy8gQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LgorCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuCisJCS8vCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwgcEhlYWRlci0+U2VxdWVuY2UsIHBIZWFkZXItPkZyYWcpKTsKKwkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCX0KKworCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSByZS1hc3NlbWJseSBidWZmZXIKKwkJTmRpc01vdmVNZW1vcnkoKHBGcmFnQnVmZmVyICsgcEFkLT5GcmFnRnJhbWUuUnhTaXplKSwgcERhdGEsIERhdGFTaXplKTsKKwkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICArPSBEYXRhU2l6ZTsKKwkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyCisKKwkJLy8gTGFzdCBmcmFnbWVudAorCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCisJCXsKKwkJCWJSZWFzc0RvbmUgPSBUUlVFOworCQl9CisJfQorCitkb25lOgorCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyByZXR1cm4gZGVmcmFnbWVudGVkIHBhY2tldCBpZiBwYWNrZXQgaXMgcmVhc3NlbWJsZWQgY29tcGxldGVseQorCS8vIG90aGVyd2lzZSByZXR1cm4gTlVMTAorCWlmIChiUmVhc3NEb25lKQorCXsKKwkJUE5ESVNfUEFDS0VUIHBOZXdGcmFnUGFja2V0OworCisJCS8vIGFsbG9jYXRlIGEgbmV3IHBhY2tldCBidWZmZXIgZm9yIGZyYWdtZW50CisJCXBOZXdGcmFnUGFja2V0ID0gUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCQlpZiAocE5ld0ZyYWdQYWNrZXQpCisJCXsKKwkJCS8vIHVwZGF0ZSBSeEJsaworCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OworCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKKwkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOworCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CisJCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcFJldFBhY2tldDsKK30KKworCitWT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJVUlOVAkJCW5NU0RVOworCisJdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisJbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKK30KKworVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocEVudHJ5ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9Cit9CisKKyNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCitWT0lEIFJlU3luY0JlYWNvblRpbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisKKwlVSU5UMzIgIE9mZnNldDsKKworCisJT2Zmc2V0ID0gKHBBZC0+VGJ0dFRpY2tDb3VudCkgJSAoQkNOX1RCVFRfT0ZGU0VUKTsKKworCXBBZC0+VGJ0dFRpY2tDb3VudCsrOworCisJLy8KKwkvLyBUaGUgdXBkYXRlZCBCZWFjb25JbnRlcnZhbCBWYWx1ZSB3aWxsIGFmZmVjdCBCZWFjb24gSW50ZXJ2YWwgYWZ0ZXIgdHdvIFRCVFQKKwkvLyBiZWFjYXN1ZSB0aGUgb3JpZ2luYWwgQmVhY29uSW50ZXJ2YWwgaGFkIGJlZW4gbG9hZGVkIGludG8gbmV4dCBUQlRUX1RJTUVSCisJLy8KKwlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMikpCisJeworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDEgOwkvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgPSA2NHVzCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCX0KKwllbHNlCisJeworCQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMSkpCisJCXsKKwkJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDE0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMKQEAgLTAsMCArMSwxMjQwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qCisgICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFBDSS1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgorCWluIG90aGVyIGZpbGVzLgorCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitleHRlcm4gUlRNUF9SRl9SRUdTIFJGMjg1MFJlZ1RhYmxlW107CitleHRlcm4gVUNIQVIJTlVNX09GXzI4NTBfQ0hOTDsKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCisJVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOworCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKKwlQVFhEX1NUUlVDCQlwVHhEOworCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisJVVNIT1JUCQkJaHdIZWFkZXJMZW47CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCisJLy8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCisJeworCQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJfQorCWVsc2UKKwl7CisJCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisKKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4RC0+TGFzdFNlYzAgPSAwOworCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworCVJldFR4SWR4ID0gVHhJZHg7CisJLy8KKwkvLyBVcGRhdGUgVHggaW5kZXgKKwkvLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworfQorCisKK1VTSE9SVCBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKworCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKKwlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVVTSE9SVAkJCWh3SGVhZGVyTGVuOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQorCS8vCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisKKwlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKKworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkvLworCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKKwkvLworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCVR4RCA9ICpwRGVzdFR4RDsKKwlwVHhEID0gJlR4RDsKKyNlbmRpZgorCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKKworCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSksIFRZUEVfVFhXSSk7CisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCVJldFR4SWR4ID0gVHhJZHg7CisJLy8KKwkvLyBVcGRhdGUgVHggaW5kZXgKKwkvLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworfQorCisKK1VTSE9SVCBSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFtZU51bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJQk9PTEVBTiBiSXNMYXN0OworCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKKwlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVVTSE9SVAkJCWh3SGRyTGVuOworCVVJTlQzMgkJCWZpcnN0RE1BTGVuOworCisJYklzTGFzdCA9ICgoZnJhbWVOdW0gPT0gKHBUeEJsay0+VG90YWxGcmFtZU51bSAtIDEpKSA/IDEgOiAwKTsKKworCS8vCisJLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OworCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKworCWlmIChmcmFtZU51bSA9PSAwKQorCXsKKwkJLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpCisJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCwgNCkrTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOworCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKKwkJZWxzZQorCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7CisJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJCWZpcnN0RE1BTGVuID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbjsKKwl9CisJZWxzZQorCXsKKwkJZmlyc3RETUFMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisJfQorCisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgZmlyc3RETUFMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisjZWxzZQorCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJVHhEID0gKnBEZXN0VHhEOworCXBUeEQgPSAmVHhEOworI2VuZGlmCisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IGZpcnN0RE1BTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJaWYgKGZyYW1lTnVtID09IDApCisJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKworCWlmIChmcmFtZU51bSAhPSAwKQorCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUpLCBUWVBFX1RYV0kpOworCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwlSZXRUeElkeCA9IFR4SWR4OworCS8vCisJLy8gVXBkYXRlIFR4IGluZGV4CisJLy8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKKworfQorCisKK1ZPSUQgUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVTSE9SVAkJCXRvdGFsTVBEVVNpemUsCisJSU4JVVNIT1JUCQkJRmlyc3RUeElkeCkKK3sKKworCVBUWFdJX1NUUlVDCQlwVHhXSTsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCisJLy8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlwVHhXSSA9IChQVFhXSV9TVFJVQykgcFR4UmluZy0+Q2VsbFtGaXJzdFR4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCit9CisKKworVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlMYXN0VHhJZHgpCit7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCisJLy8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07CisKKwkvLworCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKKwkvLworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtMYXN0VHhJZHhdLkFsbG9jVmE7CisJVHhEID0gKnBEZXN0VHhEOworCXBUeEQgPSAmVHhEOworI2VuZGlmCisKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKK30KKworCitVU0hPUlQJUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFnTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKwlVQ0hBUgkJCSpwRE1BSGVhZGVyQnVmVkE7CisJVVNIT1JUCQkJVHhJZHgsIFJldFR4SWR4OworCVBUWERfU1RSVUMJCXBUeEQ7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKKyAgICBUWERfU1RSVUMgICAgICAgVHhEOworI2VuZGlmCisJVUlOVDMyCQkJQnVmQmFzZVBhTG93OworCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKKwlVU0hPUlQJCQlod0hlYWRlckxlbjsKKwlVSU5UMzIJCQlmaXJzdERNQUxlbjsKKworCS8vCisJLy8gR2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OworCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKworCS8vCisJLy8gQ29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCS8vCisJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCWZpcnN0RE1BTGVuID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsKKwlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7CisKKworCS8vCisJLy8gQnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisjZWxzZQorCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJVHhEID0gKnBEZXN0VHhEOworCXBUeEQgPSAmVHhEOworI2VuZGlmCisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJaWYgKGZyYWdOdW0gPT0gcFR4QmxrLT5Ub3RhbEZyYWdOdW0pCisJeworCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwl9CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhELT5MYXN0U2VjMCA9IDA7CisJcFR4RC0+TGFzdFNlYzEgPSAxOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFKSwgVFlQRV9UWFdJKTsKKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJUmV0VHhJZHggPSBUeElkeDsKKwlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwkvLworCS8vIFVwZGF0ZSBUeCBpbmRleAorCS8vCisJSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7CisJcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKKworCSpGcmVlTnVtYmVyIC09IDE7CisKKwlyZXR1cm4gUmV0VHhJZHg7CisKK30KKworLyoKKwlNdXN0IGJlIHJ1biBpbiBJbnRlcnJ1cHQgY29udGV4dAorCVRoaXMgZnVuY3Rpb24gaGFuZGxlIFBDSSBzcGVjaWZpYyBUeERlc2MgYW5kIGNwdSBpbmRleCB1cGRhdGUgYW5kIGtpY2sgdGhlIHBhY2tldCBvdXQuCisgKi8KK2ludCBSdG1wUENJTWdtdEtpY2tPdXQoCisJSU4gUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOIFVDSEFSIAkJCVF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAorCUlOIFVJTlQgCQkJU3JjQnVmTGVuKQoreworCVBUWERfU1RSVUMJCXBUeEQ7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKKyAgICBUWERfU1RSVUMgICAgICAgVHhEOworI2VuZGlmCisJVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworICAgIFR4RCA9ICpwRGVzdFR4RDsKKyAgICBwVHhEID0gJlR4RDsKKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyNlbHNlCisJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworI2VuZGlmCisKKwlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKwlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX01HTVQpOworCXBUeEQtPkxhc3RTZWMwID0gMTsKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisJcFR4RC0+RE1BRE9ORSA9IDA7CisJcFR4RC0+U0RMZW4xID0gMDsKKwlwVHhELT5TRFB0cjAgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuLCAwLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7CisjZW5kaWYKKworCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvLyBJbmNyZWFzZSBUWF9DVFhfSURYLCBidXQgd3JpdGUgdG8gcmVnaXN0ZXIgbGF0ZXIuCisJSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVENUWF9JRFgsICBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKKworCUFyZ3VtZW50czoKKwkJcFJ4RAkJUG9pbnRlciB0byB0aGUgUnggZGVzY3JpcHRvcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTIAlObyBlcnIKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBSVE1QQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglQSEVBREVSXzgwMl8xMQkJcEhlYWRlciwKKwlJTglQUlhXSV9TVFJVQyAJCXBSeFdJLAorCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAJcFJ4RCkKK3sKKwlQQ0lQSEVSX0tFWSBwV3BhS2V5OworCUlOVCBkQm07CisKKwkvLyBQaHkgZXJyb3JzICYgQ1JDIGVycm9ycworCWlmICgvKihwUnhELT5QaHlFcnIpIHx8Ki8gKHBSeEQtPkNyYykpCisJeworCQkvLyBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLgorCQlkQm0gPSAoSU5UKSAocFJ4V0ktPlJTU0kwKSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCWlmIChkQm0gPD0gLTg3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVswXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTgyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsxXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTc3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsyXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTcyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVszXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTY3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs0XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTYyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs1XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs2XSArPSAxOworCQllbHNlIGlmIChkQm0gPiAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzddICs9IDE7CisKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIEFkZCBSeCBzaXplIHRvIGNoYW5uZWwgbG9hZCBjb3VudGVyLCB3ZSBzaG91bGQgaWdub3JlIGVycm9yIGNvdW50cworCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICs9IChwUnhELT5TREwwICsgMTQpOworCisJLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKKwlpZiAocEhlYWRlciAhPSBOVUxMKQorCXsKKwkJaWYgKHBIZWFkZXItPkZDLlRvRHMpCisJCXsKKwkJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCX0KKworCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQorCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KKwkvLyBpZiAocFJ4RC0+VTJNID09IDApCisJLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQorCWlmIChwUnhELT5DaXBoZXJFcnIpCisJeworCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCisJCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIG9rIGJ1dCBNSUNFcnIgIikpO30KKwkJZWxzZSBpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDEpCisJCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIEVyciAiKSk7fQorCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMykKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoInBSeEQgRVJST1I6IEtleSBub3QgdmFsaWQgIikpOworCisgICAgICAgIGlmICgoKHBSeEQtPkNpcGhlckVyciAmIDEpID09IDEpICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCisgICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgJWQgKGxlbj0lZCwgTWNhc3Q9JWQsIE15QnNzPSVkLCBXY2lkPSVkLCBLZXlJZD0lZClcbiIsCisJCQlwUnhELT5DaXBoZXJFcnIsCisJCQlwUnhELT5TREwwLAorCQkJcFJ4RC0+TWNhc3QgfCBwUnhELT5CY2FzdCwKKwkJCXBSeEQtPk15QnNzLAorCQkJcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCisJCQlwUnhXSS0+S2V5SW5kZXgpKTsKKworCQkvLworCQkvLyBNSUMgRXJyb3IKKwkJLy8KKwkJaWYgKHBSeEQtPkNpcGhlckVyciA9PSAyKQorCQl7CisJCQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF07CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKyAgICAgICAgICAgICAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChwQWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFS0VZKSA/IFRSVUU6RkFMU0UpOworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCSAgICBSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKKworICAgICAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMikgPT0gMikgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19NSUNfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7CisJCX0KKworCQlpZiAocEhlYWRlciA9PSBOVUxMKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gcG93ZXIgc2F2ZSBtb2RlLgorCQlCb3RoIFJhZGlvT2ZmIGFuZCAuMTEgcG93ZXIgc2F2ZSBmdW5jdGlvbiBuZWVkcyB0byBjYWxsIHRoaXMgcm91dGluZS4KKwlJbnB1dDoKKwkJTGV2ZWwgPSBHVUlSQURJT19PRkYgIDogR1VJIFJhZGlvIE9mZiBtb2RlCisJCUxldmVsID0gRE9UMTFQT1dFUlNBVkUgIDogODAyLjExIHBvd2VyIHNhdmUgbW9kZQorCQlMZXZlbCA9IFJUTVBfSEFMVCAgOiBXaGVuIERpc2FibGUgZGV2aWNlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gVUNIQVIgICAgICAgICAgICBMZXZlbCwKKwlJTiBVU0hPUlQgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXApCit7CisJV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7CisJVUNIQVIJCWksIHRlbXBCQlBfUjMgPSAwOworCUJPT0xFQU4JCWJyYyA9IEZBTFNFLCBDYW5jZWxsZWQ7CisgICAgVUlOVDMyCQlUYlRUVGltZSA9IDA7CisJVUlOVDMyCQlQc1BvbGxUaW1lID0gMCwgTUFDVmFsdWU7CisgICAgVUxPTkcJCUJlYWNvblBlcmlvZFRpbWU7CisgICAgVUlOVDMyCQlSeERtYUlkeCwgUnhDcHVJZHg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gVHhDcHVJZHggPSAlZCwgVHhEbWFJZHggPSAlZC4gUnhDcHVJZHggPSAlZCwgUnhEbWFJZHggPSAlZC5cbiIsIHBBZC0+VHhSaW5nWzBdLlR4Q3B1SWR4LCBwQWQtPlR4UmluZ1swXS5UeERtYUlkeCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgsIHBBZC0+UnhSaW5nLlJ4RG1hSWR4KSk7CisKKyAgICAvLyBDaGVjayBSeCBETUEgYnVzeSBzdGF0dXMsIGlmIG1vcmUgdGhhbiBoYWxmIGlzIG9jY3VwaWVkLCBnaXZlIHVwIHRoaXMgcmFkaW8gb2ZmLgorCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCAsICZSeERtYUlkeCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYICwgJlJ4Q3B1SWR4KTsKKwlpZiAoKFJ4RG1hSWR4ID4gUnhDcHVJZHgpICYmICgoUnhEbWFJZHggLSBSeENwdUlkeCkgPiBSWF9SSU5HX1NJWkUvMykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4xLiBSeERtYUlkeCA9ICVkICwgIFJ4Q3B1SWR4ID0gJWQuIFxuIiwgUnhEbWFJZHgsIFJ4Q3B1SWR4KSk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAoKFJ4Q3B1SWR4ID49IFJ4RG1hSWR4KSAmJiAoKFJ4Q3B1SWR4IC0gUnhEbWFJZHgpIDwgUlhfUklOR19TSVpFLzMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gcmV0dXJuMi4gIFJ4Q3B1SWR4ID0gJWQuIFJ4RG1hSWR4ID0gJWQgLCAgXG4iLCBSeENwdUlkeCwgUnhEbWFJZHgpKTsKKwkJcmV0dXJuOworCX0KKworICAgIC8vIE9uY2UgZ28gaW50byB0aGlzIGZ1bmN0aW9uLCBkaXNhYmxlIHR4IGJlY2F1c2UgZG9uJ3Qgd2FudCB0b28gbWFueSBwYWNrZXRzIGluIHF1ZXVlIHRvIHByZXZlbnQgSFcgc3RvcHMuCisJcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gVFJVRTsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisJeworCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOworCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7CisKKwkgICAgaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKQorCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRCVFRfVElNRVIsICZUYlRUVGltZSk7CisJCQlUYlRUVGltZSAmPSAweDFmZmZmOworCQkJLy8gMDAuIGNoZWNrIGlmIG5lZWQgdG8gZG8gc2xlZXAgaW4gdGhpcyBEVElNIHBlcmlvZC4gICBJZiBuZXh0IGJlYWNvbiB3aWxsIGFycml2ZSB3aXRoaW4gMzBtcyAsIC4uLmRvZXNuJ3QgbmVjZXNzYXJpbHkgc2xlZXAuCisJCQkvLyBUYlRUVGltZSB1aW50ID0gNjR1cywgTEVBRF9USU1FIHVuaXQgPSAxMDI0dXMsIFBzUG9sbFRpbWUgdW5pdCA9IDFtcworCSAgICAgICAgaWYgICgoKDY0KlRiVFRUaW1lKSA8KChMRUFEX1RJTUUqMTAyNCkgKyA0MDAwMCkpICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRiVFRUaW1lID0gMHgleCAsIGdpdmUgdXAgdGhpcyBzbGVlcC4gXG4iLCBUYlRUVGltZSkpOworCSAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCSAgICAgICAgICAgIHBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlQc1BvbGxUaW1lID0gKDY0KlRiVFRUaW1lLSBMRUFEX1RJTUUqMTAyNCkvMTAwMDsKKwkJCQlQc1BvbGxUaW1lIC09IDM7CisKKwkgICAgICAgICAgICBCZWFjb25QZXJpb2RUaW1lID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKjEwMi8xMDA7CisJCQkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPiAwKQorCQkJCQlQc1BvbGxUaW1lICs9ICgoVGJ0dE51bVRvTmV4dFdha2VVcCAtMSkgKiBCZWFjb25QZXJpb2RUaW1lKTsKKworCSAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gVFJVRTsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgUHNQb2xsVGltZSk7CisJCQl9CisJCX0KKwl9CisKKyAgICAvLyAwLiBEaXNhYmxlIFR4IERNQS4KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisKKwkvLyAxLiBXYWl0IERNQSBub3QgYnVzeQorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCWlmICgoRG1hQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAmJiAoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCQlSVE1QdXNlY0RlbGF5KDIwKTsKKwkJaSsrOworCX13aGlsZShpIDwgNTApOworCisJaWYgKGkgPj0gNTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJETUEga2VlcHMgYnVzeS4gIHJldHVybiBvbiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgKClcbiIpKTsKKwkJcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwkJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgRG1hQ2ZnLndvcmQpOworCQlyZXR1cm47CisJfQorCisgICAgUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCisgICAgLy8gU2V0IHRvIDFSLgorICAgIHRlbXBCQlBfUjMgPSAocEFkLT5TdGFDZmcuQkJQUjMgJiAweEU3KTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCB0ZW1wQkJQX1IzKTsKKworCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgorCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwl7CisJCS8vIE11c3QgdXNpbmcgNDBNSHouCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJfQorCWVsc2UKKwl7CisJCS8vIE11c3QgdXNpbmcgMjBNSHouCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwl9CisKKyAgICAvLyBXaGVuIFBDSSBjbG9jayBpcyBvZmYsIGRvbid0IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHQuCisJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBBdXRvV2FrZXVwSW50KTsKKworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKwkvLyBEaXNhYmxlIE1BQyBSeAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMICwgJk1BQ1ZhbHVlKTsKKwlNQUNWYWx1ZSAmPSAweGY3OworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCAsIE1BQ1ZhbHVlKTsKKworCS8vICAyLiBTZW5kIFNsZWVwIGNvbW1hbmQKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCB1bml0OjQwdXMuCisJLy8gIDItMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKKwkvLyBTdGF0dXMgPSAxIDogc3VjY2VzcywgU3RhdHVzID0gMiwgYWxyZWFkeSBzbGVlcCwgU3RhdHVzID0gMywgTWF5YmUgTUFDIGlzIGJ1c3kgc28gY2FuJ3QgZmluaXNoIHRoaXMgdGFzay4KKwlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7CisKKyAgICBpZiAoYnJjID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgLy8gdHJ5IGFnYWluCisgICAgCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgUG93ZXJTYWZlQ0lELCAweGZmLCAweDAwKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgdW5pdDo0MHVzLgorICAgIAkvL1JUTVB1c2VjRGVsYXkoMjAwKTsKKyAgICAJYnJjID0gQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclNhZmVDSUQpOworICAgIH0KKworCS8vICAzLiBBZnRlciAweDMwIGNvbW1hbmQgaXMgb2ssIHNlbmQgcmFkaW8gb2ZmIGNvbW1hbmQuIGxvd2J5dGUgPSAwIGZvciBwb3dlciBzYWZlLgorCS8vIElmIDB4MzAgY29tbWFuZCBpcyBub3Qgb2sgdGhpcyB0aW1lLCB3ZSBjYW4gaWdub3JlIDB4MzUgY29tbWFuZC4gSXQgd2lsbCBtYWtlIHN1cmUgbm90IGNhdXNlIGZpcm13YXJlJ3IgcHJvYmxlbS4KKwlpZiAoKExldmVsID09IERPVDExUE9XRVJTQVZFKSAmJiAoYnJjID09IFRSVUUpKQorCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDM1LCBQb3dlclJhZGlvT2ZmQ0lELCAwLCAweDAwKTsJLy8gbG93Ynl0ZSA9IDAgbWVhbnMgdG8gZG8gcG93ZXIgc2FmZSwgTk9UIHR1cm4gb2ZmIHJhZGlvLgorCSAJLy8gIDMtMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKKwkgCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7CisJfQorCWVsc2UgaWYgKGJyYyA9PSBUUlVFKQorCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDM1LCBQb3dlclJhZGlvT2ZmQ0lELCAxLCAweDAwKTsJLy8gbG93Ynl0ZSA9IDAgbWVhbnMgdG8gZG8gcG93ZXIgc2FmZSwgTk9UIHR1cm4gb2ZmIHJhZGlvLgorCSAJLy8gIDMtMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKKwkgCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7CisJfQorCisgICAgLy8gV2FpdCBETUEgbm90IGJ1c3kKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlpZiAoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKQorCQkJYnJlYWs7CisJCVJUTVB1c2VjRGVsYXkoMjApOworCQlpKys7CisJfXdoaWxlKGkgPCA1MCk7CisKKwlpZiAoaSA+PSA1MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBSeCBrZWVwcyBidXN5LiAgb24gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmICgpXG4iKSk7CisJfQorCS8vIGRpc2FibGUgRE1BIFJ4LgorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlEbWFDZmcuZmllbGQuRW5hYmxlUnhETUEgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisJfQorCisJaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKQorCXsKKwkJQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKKwkJLy9SVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgOTApOworCisJCS8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KKwkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKKwkJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOworCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCQkvLyAxLiBTZXQgYXV0byB3YWtlIHVwIHRpbWVyLgorCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisJCUF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7CisJCUF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gTEVBRF9USU1FOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisJfQorCisJLy8gIDQtMS4gSWYgaXQncyB0byBkaXNhYmxlIG91ciBkZXZpY2UuIE5lZWQgdG8gcmVzdG9yZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCisJaWYgKExldmVsID09IFJUTVBfSEFMVCkKKwl7CisJCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQorCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAxKTsKKwl9CisJLy8gIDQuIFNldCBQQ0kgY29uZmlndXJhdGlvbiBTcGFjZSBMaW5rIENvbXRyb2wgZmllbGRzLiAgT25seSBSYWRpbyBPZmYgbmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uCisJZWxzZQorCXsKKwkJaWYgKChicmMgPT0gVFJVRSkgJiYgKGkgPCA1MCkpCisJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOworCX0KKworICAgIHBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gd2FrZSB1cCBtb2RlIGZyb20gcG93ZXIgc2F2ZSBtb2RlLgorCQlCb3RoIFJhZGlvT24gYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgorCUlucHV0OgorCQlMZXZlbCA9IEdVSVJBRElPX09GRiA6IGNhbGwgdGhpcyBmdW5jdGlvbiBpcyBmcm9tIFJhZGlvIE9mZiB0byBSYWRpbyBPbi4gIE5lZWQgdG8gcmVzdG9yZSBQQ0kgaG9zdCB2YWx1ZS4KKwkJTGV2ZWwgPSBvdGhlciB2YWx1ZSA6IG5vcm1hbCB3YWtlIHVwIGZ1bmN0aW9uLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgTGV2ZWwpCit7CisgICAgV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7CisJQk9PTEVBTgkJCQlDYW5jZWxsZWQsIGJydiA9IFRSVUU7CisgICAgVUlOVDMyCQkJICAgIE1BQ1ZhbHVlOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwl7CisJICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKKwkJaWYgKChMZXZlbCA9PSBHVUlSQURJT19PRkYpIHx8IChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4UGNpQXNpY1JhZGlvT24gKClcbiIpKTsKKwkJCS8vIDEuIFNldCBQQ0kgTGluayBDb250cm9sIGluIENvbmZpZ3VyYXRpb24gU3BhY2UuCisJCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOworCQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKKwkJfQorCX0KKworICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCisJLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDApOworCisJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCisJYnJ2ID0gQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOworICAgIGlmIChicnYpCisgICAgeworICAgIAkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgKERFTEFZSU5UTUFTS3xSeElOVCkpOworICAgIAlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKKworICAgIAkvLyAzLiBFbmFibGUgVHggRE1BLgorICAgIAlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisgICAgCURtYUNmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisgICAgICAgIERtYUNmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CisgICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKKworICAgICAgICAvLyBFYWJsZSBNQUMgUngKKyAgICAJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwgLCAmTUFDVmFsdWUpOworICAgIAlNQUNWYWx1ZSB8PSAweDg7CisgICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCAsIE1BQ1ZhbHVlKTsKKworICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKKyAgICAJaWYgKExldmVsID09IEdVSV9JRExFX1BPV0VSX1NBVkUpCisgICAgCXsKKyAgICAJCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgorICAgIAkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisgICAgCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisgICAgCQl7CisgICAgCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKyAgICAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisgICAgCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgIAkJfQorICAgIAkJZWxzZQorICAgIAkJeworICAgIAkJCS8vIE11c3QgdXNpbmcgMjBNSHouCisgICAgCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisgICAgCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgCQl9CisgICAgCX0KKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworfQorCitWT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpCit7CisgICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKKworICAgIGlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3YWtpbmcgdXAgbm93IVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOworCisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICB7CisgICAgICAgIC8vIFN1cHBvcnQgUENJZSBBZHZhbmNlIFBvd2VyIFNhdmUKKyAgICAJaWYgKGJGcm9tVHggPT0gVFJVRSkKKyAgICAJeworICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisgICAgCQlSVE1QdXNlY0RlbGF5KDMwMDApOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PUFzaWNGb3JjZVdha2V1cD09PWJGcm9tVHhcbiIpKTsKKyAgICAJfQorCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworICAgICAgICBpZiAoUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBET1QxMVBPV0VSU0FWRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgorICAgICAgICAJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisgICAgICAgIAkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisgICAgICAgIAl7CisgICAgICAgIAkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKyAgICAgICAgCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisgICAgICAgIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAJfQorICAgICAgICAJZWxzZQorICAgICAgICAJeworICAgICAgICAJCS8vIE11c3QgdXNpbmcgMjBNSHouCisgICAgICAgIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisgICAgICAgIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gUENJLCAyODYwLVBDSWUKKyAgICAgICAgQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCAweGZmLCAweDAwLCAweDAwKTsKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgIH0KKworICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT09PT09UlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwXG4iKSk7Cit9CisKK1ZPSUQgUlQyOHh4UGNpU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCit7CisgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwl7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQlyZXR1cm47CisJfQorICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisgICAgeworICAgIAlVTE9ORwlOb3cgPSAwOworICAgICAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid2FraW5nIHVwIG5vdyFcbiIpKTsKKyAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJLy8gSWYgbGFzdCBzZW5kIE5VTEwgZnJhbSB0aW1lIGlzIHRvbyBjbG9zZSB0byB0aGlzIHJlY2VpdmluZyBiZWFjb24gKHdpdGhpbiA4bXMpLCBkb24ndCBnbyB0byBzbGVlcCBmb3IgdGhpcyBEVE0uCisJCS8vIEJlY2F1c2UgU29tZSBBUCBjYW4ndCBxdWV1aW5nIG91dGdvaW5nIGZyYW1lcyBpbW1lZGlhdGVseS4KKwkJaWYgKCgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyA4KSA+PSBOb3cpICYmIChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSA8PSBOb3cpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3cgPSAlbHUsIExhc3RTZW5kTlVMTHBzbVRpbWU9JWx1IDogIFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1LiBcbiIsIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKKwkJCXJldHVybjsKKwkJfQorCQllbHNlIGlmICgocEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA+IDApICYmICgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpID49IE5vdykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHU6IFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1ID4gMCBcbiIsIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsICBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7CisJCQlyZXR1cm47CisJCX0KKworICAgICAgICBSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBET1QxMVBPV0VSU0FWRSwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7CisgICAgICAgIC8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KKyAgICAgICAgaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKKyAgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXAgPSAxOworCisgICAgICAgIEF1dG9XYWtldXBDZmcud29yZCA9IDA7CisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKyAgICAgICAgQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOworICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOworICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7CisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKyAgICAgICAgQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAwKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgNDB1cy4KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tICVzLCBUYnR0TnVtVG9OZXh0V2FrZVVwPSVkIFxuIiwgX19GVU5DVElPTl9fLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSk7CisgICAgfQorICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKK30KKworVk9JRCBQc1BvbGxXYWtlRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlBzUG9sbFdha2VFeGVjIFxuIikpOworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKyAgICBpZiAocEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcpCisgICAgeworCSAgICBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOworICAgIH0KKyAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitWT0lEICBSYWRpb09uRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCVdQRE1BX0dMT19DRkdfU1RSVUMJRG1hQ2ZnOworCUJPT0xFQU4JCQkJQ2FuY2VsbGVkOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIGZPUF9TVEFUVVNfRE9aRSA9PSBUUlVFOyBcbiIpKTsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gU0NBTl9JTl9QUk9HUkVTUzsgXG4iKSk7CisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOworCQlyZXR1cm47CisJfQorICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKwl7CisJCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworICAgICAgICBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCQkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOworCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KKwkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOworCisJCS8vIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4gU28gd2hlbiBiYWNrIHRvIGNsb2NrIG9uLCBlbmFibGUgaW50ZXJydXB0LgorCQlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKKworCQkvLyAzLiBFbmFibGUgVHggRE1BLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCURtYUNmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKKworCQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KKwkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkJeworCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIE11c3QgdXNpbmcgMjBNSHouCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQl9CisKKwkJLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJCS8vIFNldCBMRUQKKwkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7CisKKyAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKQorICAgICAgICB7CisgICAgCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7CisgICAgICAgIH0KKwl9CisJZWxzZQorCXsKKwkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKKwl9Cit9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyAgICBpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorICAgCQlyZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PlxuIiwgX19GVU5DVElPTl9fKSk7CisKKyAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwKKyAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkpKQorICAgIHsKKyAgICAJTklDUmVzZXRGcm9tRXJyb3IocEFkKTsKKworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7CisgICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKyAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworICAgIAkvLyBFbmFibGUgVHgvUngKKyAgICAJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworICAgIAkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZworICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkgICAgLy8gU2V0IExFRAorCSAgICBSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpKQorICAgIHsKKyAgICAgICAgQk9PTEVBTgkJQ2FuY2VsbGVkOworCisgICAgCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisKKyAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworICAgIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOworICAgIAlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKyAgICB9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9CisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworICAgIFdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworCVVJTlQzMglpOworCisgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorICAgIAlyZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PlxuIiwgX19GVU5DVElPTl9fKSk7CisKKwkvLyBTZXQgTEVECisJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCS8vIFNldCBSYWRpbyBvZmYgZmxhZworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorICAgIHsKKyAgICAJQk9PTEVBTgkJQ2FuY2VsbGVkOworICAgIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworICAgIAl9CisKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICAgICAgeworICAgICAgICAgICAgQk9PTEVBTiBDYW5jZWxsZWQ7CisgICAgICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworCSAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzCisgICAgICAgIGlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKyAgICAgICAgUlRNUHVzZWNEZWxheSgxMDAwMCk7CisgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIC8vIENsZWFuIHVwIG9sZCBic3MgdGFibGUKKyAgICAgICAgQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworICAgIH0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIERpc2FibGUgVHgvUnggRE1BCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkgICAvLyBkaXNhYmxlIERNQQorCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CSAgIC8vIGFib3J0IGFsbCBUWCByaW5ncworCisKKwkvLyBNQUNfU1lTX0NUUkwgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMCk7CisKKwkvLyBQV1JfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDApOworCisJLy8gVFhfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiAyMG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgMCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gTXVzdCB1c2luZyAyME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9d2hpbGUgKGkrKyA8IDEwMCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFkZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYwpAQCAtMCwwICsxLDM0MTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitJTlQJU2hvd19TU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4QnVyc3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UHJlYW1ibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NoYW5uZWxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfUlRTVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2hvd19IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NvdW50cnlDb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitJTlQJU2hvd19BdXRoTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2hvd19wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MsIFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQ1tdID0geworCXsiU1NJRCIsCQkJCQlTaG93X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCVNob3dfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTaG93X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2hvd19UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTaG93X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNob3dfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJU2hvd19CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCVNob3dfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJU2hvd19GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkJCQlTaG93X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkJCQlTaG93X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkJCQlTaG93X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkJCVNob3dfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkJCVNob3dfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCQlTaG93X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIFNob3dfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAlTaG93X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAlTaG93X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIFNob3dfSHRBdXRvQmFfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeyJDb3VudHJ5UmVnaW9uIiwJCQlTaG93X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJDb3VudHJ5Q29kZSIsCQkJCVNob3dfQ291bnRyeUNvZGVfUHJvY30sCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQlTaG93X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQlTaG93X0lFRUU4MDIxMUhfUHJvY30sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgeyJOZXR3b3JrVHlwZSIsCQkJCVNob3dfTmV0d29ya1R5cGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeyJBdXRoTW9kZSIsCQkJCVNob3dfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJU2hvd19FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJU2hvd19LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQlTaG93X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCVNob3dfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJU2hvd19LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCVNob3dfV1BBUFNLX1Byb2N9LAorCXtOVUxMLCBOVUxMfQorfTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgRHJpdmVyIHZlcnNpb24uCisKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24uCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyByZWdpb247CisKKwlyZWdpb24gPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAorCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgcmVnaW9uOworCX0KKwllbHNlIGlmIChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHJlZ2lvbjsKKworCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpIHJlZ2lvbjsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjpwYXJhbWV0ZXJzIG91dCBvZiByYW5nZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKKwlCdWlsZENoYW5uZWxMaXN0KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcJV2lyZWxlc3NNb2RlOworCUlOVAkJc3VjY2VzcyA9IFRSVUU7CisKKwlXaXJlbGVzc01vZGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJSU5UIE1heFBoeU1vZGUgPSBQSFlfMTFHOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCWlmIChXaXJlbGVzc01vZGUgPD0gTWF4UGh5TW9kZSkKKwkJeworCQkJUlRNUFNldFBoeU1vZGUocEFkLCBXaXJlbGVzc01vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKFdpcmVsZXNzTW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkvLyBTZXQgQWRob2NNb2RlIHJhdGVzCisJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQl7CisJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdWNjZXNzID0gRkFMU0U7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBpdCBpcyBuZWVkZWQgdG8gc2V0IFNTSUQgdG8gdGFrZSBlZmZlY3QKKwlpZiAoc3VjY2VzcyA9PSBUUlVFKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjooPSVsZClcbiIsIFdpcmVsZXNzTW9kZSkpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENoYW5uZWwKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAJSU5UCQlzdWNjZXNzID0gVFJVRTsKKwlVQ0hBUglDaGFubmVsOworCisJQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCS8vIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyB2YWxpZAorCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgQ2hhbm5lbCkgPT0gVFJVRSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworCisJCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJCQkJeworCQkJCQlOX1NldENlbkNoKHBBZCk7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCwgY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJc3VjY2VzcyA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXN1Y2Nlc3MgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWlmIChzdWNjZXNzID09IFRSVUUpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9DaGFubmVsX1Byb2M6OihDaGFubmVsPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNob3J0IFNsb3QgVGltZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgU2hvcnRTbG90OworCisJU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaG9ydFNsb3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU2hvcnRTbG90X1Byb2M6OihTaG9ydFNsb3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4IHBvd2VyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVHhQb3dlcjsKKwlJTlQgICBzdWNjZXNzID0gRkFMU0U7CisKKwlUeFBvd2VyID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChUeFBvd2VyIDw9IDEwMCkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBUeFBvd2VyOworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlzdWNjZXNzID0gVFJVRTsKKwl9CisJZWxzZQorCQlzdWNjZXNzID0gRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQb3dlcl9Qcm9jOjooVHhQb3dlclBlcmNlbnRhZ2U9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCAxMUIvMTFHIFByb3RlY3Rpb24KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSkKKwl7CisJCWNhc2UgMDogLy9BVVRPCisJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDogIC8vSW52YWxpZCBhcmd1bWVudAorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JHUHJvdGVjdGlvbl9Qcm9jOjooQkdQcm90ZWN0aW9uPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4UHJlYW1ibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlSVF84MDJfMTFfUFJFQU1CTEUJUHJlYW1ibGU7CisKKwlQcmVhbWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworCXN3aXRjaCAoUHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86CisJCQkvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworCQkJLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKwkJCXJldHVybiBGQUxTRTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQcmVhbWJsZV9Qcm9jOjooVHhQcmVhbWJsZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUlRTIFRocmVzaG9sZAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKworCVJ0c1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZigoUnRzVGhyZXNoID4gMCkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkpCisJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwllbHNlIGlmIChSdHNUaHJlc2ggPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1JUU1RocmVzaG9sZF9Qcm9jOjooUlRTVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRnJhZ21lbnQgVGhyZXNob2xkCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICAgICBGcmFnVGhyZXNoOworCisJRnJhZ1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCXsKKwkJLy9JbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKKwkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJfQorCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCisJeworCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCisJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVCkoRnJhZ1RocmVzaCAtIDEpOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID09IE1BWF9GUkFHX1RIUkVTSE9MRCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYzo6KEZyYWdUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4QnVyc3QKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBUeEJ1cnN0OworCisJVHhCdXJzdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFR4QnVyc3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOworCWVsc2UgaWYgKFR4QnVyc3QgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4QnVyc3RfUHJvYzo6KFR4QnVyc3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBUeEJ1cnN0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBhZ2dyZTsKKworCWFnZ3JlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChhZ2dyZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChhZ2dyZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jOjooQUdHUkU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBJRUVFODAyMTFILgorICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyAxIHdoZW4gbmVlZHMgcmFkYXIgZGV0ZWN0aW9uLCBvdGhlcndpc2UgMAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVMT05HIGllZWU4MDIxMWg7CisKKwlpZWVlODAyMTFoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChpZWVlODAyMTFoID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKKwllbHNlIGlmIChpZWVlODAyMTFoID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JRUVFODAyMTFIX1Byb2M6OihJRUVFODAyMTFIPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRm9yIERlYnVnIGluZm9ybWF0aW9uCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0RlYnVnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfRGVidWdfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7CisKKyAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IFJUX0RFQlVHX0xPVUQpCisgICAgICAgIFJURGVidWdMZXZlbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0RlYnVnX1Byb2MoUlREZWJ1Z0xldmVsID0gJWxkKVxuIiwgUlREZWJ1Z0xldmVsKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCitJTlQJU2hvd19EZXNjSW5mb19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyNpZmRlZiBSVDI4NjAKKwlJTlQgaSwgUXVlSWR4PTA7CisJUFJUMjhYWF9SWERfU1RSVUMgcFJ4RDsKKyAgICBQVFhEX1NUUlVDIHBUeEQ7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07CisJUFJUTVBfTUdNVF9SSU5HCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCVBSVE1QX1JYX1JJTkcJcFJ4UmluZyA9ICZwQWQtPlJ4UmluZzsKKworCWZvcihpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCXsKKwkgICAgcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7CisJICAgIHByaW50aygiRGVzYyAjJWRcbiIsaSk7CisJICAgIGhleF9kdW1wKCJUeCBEZXNjcmlwdG9yIiwgKGNoYXIgKilwVHhELCAxNik7CisJICAgIHByaW50aygicFR4RC0+RE1BRE9ORSA9ICV4XG4iLCBwVHhELT5ETUFET05FKTsKKwl9CisJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWZvcihpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCisJeworCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOworCSAgICBwcmludGsoIkRlc2MgIyVkXG4iLGkpOworCSAgICBoZXhfZHVtcCgiTWdtdCBEZXNjcmlwdG9yIiwgKGNoYXIgKilwVHhELCAxNik7CisJICAgIHByaW50aygicE1nbXQtPkRNQURPTkUgPSAleFxuIiwgcFR4RC0+RE1BRE9ORSk7CisJfQorCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlmb3IoaT0wO2k8UlhfUklOR19TSVpFO2krKykKKwl7CisJICAgIHBSeEQgPSAoUFJUMjhYWF9SWERfU1RSVUMpIHBSeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKKwkgICAgcHJpbnRrKCJEZXNjICMlZFxuIixpKTsKKwkgICAgaGV4X2R1bXAoIlJ4IERlc2NyaXB0b3IiLCAoY2hhciAqKXBSeEQsIDE2KTsKKwkJcHJpbnRrKCJwUnhELT5ERE9ORSA9ICV4XG4iLCBwUnhELT5ERE9ORSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVzZXQgc3RhdGlzdGljcyBjb3VudGVyCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICBhcmcKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PlNldF9SZXNldFN0YXRDb3VudGVyX1Byb2NcbiIpKTsKKworCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycworCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCisgICAgSU4gIENIQVIgKnBJblB1dFN0ciwKKyAgICBJTiAgVUNIQVIgc3RyTGVuKQoreworICAgIFVDSEFSIGk9MDsKKworICAgIGZvciAoaT0wOyBpPHN0ckxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChwSW5QdXRTdHJbaV0gPCAweDIxKSB8fAorICAgICAgICAgICAgKHBJblB1dFN0cltpXSA+IDB4N0UpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIFdQQSBLZXkgcHJvY2VzcworCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBCdWYJCQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVUNDRVNTCQkJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIExPTkcgICAgICAgICAgICBSYXRlcykKK3sKKyAgICBORElTXzgwMl8xMV9SQVRFUyBhcnlSYXRlczsKKworICAgIG1lbXNldCgmYXJ5UmF0ZXMsIDB4MDAsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgIHN3aXRjaCAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBQSFlfMTFBOiAvLyBBIG9ubHkKKyAgICAgICAgICAgIHN3aXRjaCAoUmF0ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSA2MDAwMDAwOiAvLzZNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwYzsgLy8gNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDkwMDAwMDA6IC8vOU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTIwMDAwMDA6IC8vMTJNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxODsgLy8gMTJNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxODAwMDAwMDogLy8xOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI0MDAwMDAwOiAvLzI0TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MzA7IC8vIDI0TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzYwMDAwMDA6IC8vMzZNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg0ODsgLy8gMzZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0ODAwMDAwMDogLy80OE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDYwOyAvLyA0OE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU182OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU0MDAwMDAwOiAvLzU0TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgLTE6IC8vQXV0bworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNYnBzCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHg0ODsgLy8gMzZNYnBzCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzNdID0gMHgzMDsgLy8gMjRNYnBzCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgyNDsgLy8gMThNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzVdID0gMHgxODsgLy8gMTJNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgxMjsgLy8gOU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbN10gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEhZXzExQkdfTUlYRUQ6IC8vIEIvRyBNaXhlZAorICAgICAgICBjYXNlIFBIWV8xMUI6IC8vIEIgb25seQorICAgICAgICBjYXNlIFBIWV8xMUFCR19NSVhFRDogLy8gQS9CL0cgTWl4ZWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN3aXRjaCAoUmF0ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxMDAwMDAwOiAvLzFNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwMjsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIwMDAwMDA6IC8vMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDA0OworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTAwMDAwMDogLy81LjVNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwYjsgLy8gNS41TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTEwMDAwMDA6IC8vMTFNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxNjsgLy8gMTFNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2MDAwMDAwOiAvLzZNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwYzsgLy8gNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDkwMDAwMDA6IC8vOU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTIwMDAwMDA6IC8vMTJNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxODsgLy8gMTJNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxODAwMDAwMDogLy8xOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI0MDAwMDAwOiAvLzI0TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MzA7IC8vIDI0TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzYwMDAwMDA6IC8vMzZNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg0ODsgLy8gMzZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0ODAwMDAwMDogLy80OE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDYwOyAvLyA0OE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU182OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU0MDAwMDAwOiAvLzU0TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgLTE6IC8vQXV0bworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKyAgICAgICAgICAgICAgICAgICAgeyAvL0IgT25seQorICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHgwYjsgLy8gNS41TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDA0OyAvLyAyTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDAyOyAvLyAxTWJwcworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeyAvLyhCL0cpIE1peGVkIG9yIChBL0IvRykgTWl4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4NjA7IC8vIDQ4TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzNdID0gMHgzMDsgLy8gMjRNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s0XSA9IDB4MTY7IC8vIDExTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDBiOyAvLyA1LjVNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s2XSA9IDB4MDQ7IC8vIDJNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MDI7IC8vIDFNYnBzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgUlRNUFNldERlc2lyZWRSYXRlcyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKyAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSwKKyAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKKyAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKyAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSApKTsKKyAgICAvLyBDaGFuZ2luZyBEZXNpcmVkUmF0ZSBtYXkgYWZmZWN0IHRoZSBNQVggVFggcmF0ZSB3ZSB1c2VkIHRvIFRYIGZyYW1lcyBvdXQKKyAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworfQorCitORElTX1NUQVRVUyBSVE1QV1BBUmVtb3ZlS2V5UHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVk9JRAkJCXBCdWYpCit7CisJUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgcEtleTsKKwlVTE9ORwkJCQkJS2V5SWR4OworCU5ESVNfU1RBVFVTIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJQk9PTEVBTiAJYlR4S2V5OyAJCS8vIFNldCB0aGUga2V5IGFzIHRyYW5zbWl0IGtleQorCUJPT0xFQU4gCWJQYWlyd2lzZTsJCS8vIEluZGljYXRlIHRoZSBrZXkgaXMgcGFpcndpc2Uga2V5CisJQk9PTEVBTiAJYktleVJTQzsJCS8vIGluZGljYXRlIHRoZSByZWNlaXZlICBTQyBzZXQgYnkgS2V5UlNDIHZhbHVlLgorCQkJCQkJCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgc2V0IGJ5IHRoZSBOSUMuCisJQk9PTEVBTiAJYkF1dGhlbnRpY2F0b3I7IC8vIGluZGljYXRlIGtleSBpcyBzZXQgYnkgYXV0aGVudGljYXRvci4KKwlJTlQgCQlpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLS0+IFJUTVBXUEFSZW1vdmVLZXlQcm9jXG4iKSk7CisKKwlwS2V5ID0gKFBORElTXzgwMl8xMV9SRU1PVkVfS0VZKSBwQnVmOworCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHhmZjsKKwkvLyBCaXQgMzEgb2YgQWRkLWtleSwgVHggS2V5CisJYlR4S2V5CQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAzMCBvZiBBZGQta2V5IFBhaXJ3aXNlS2V5CisJYlBhaXJ3aXNlCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg0MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDI5IG9mIEFkZC1rZXkgS2V5UlNDCisJYktleVJTQyAJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDIwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMjggb2YgQWRkLWtleSBBdXRoZW50aWNhdG9yCisJYkF1dGhlbnRpY2F0b3IgPSAocEtleS0+S2V5SW5kZXggJiAweDEwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKworCS8vIDEuIElmIGJUeCBpcyBUUlVFLCByZXR1cm4gZmFpbHVyZSBpbmZvcm1hdGlvbgorCWlmIChiVHhLZXkgPT0gVFJVRSkKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkvLyAyLiBDaGVjayBQYWlyd2lzZSBLZXkKKwlpZiAoYlBhaXJ3aXNlKQorCXsKKwkJLy8gYS4gSWYgQlNTSUQgaXMgYnJvYWRjYXN0LCByZW1vdmUgYWxsIHBhaXJ3aXNlIGtleXMuCisJCS8vIGIuIElmIG5vdCBicm9hZGNhc3QsIHJlbW92ZSB0aGUgcGFpcndpc2Ugc3BlY2lmaWVkIGJ5IEJTU0lECisJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5Cc3NJZCwgcEtleS0+QlNTSUQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVkKVxuIiwgaSkpOworCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiA9IDA7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgKFVDSEFSKWkpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLy8gMy4gR3JvdXAgS2V5CisJZWxzZQorCXsKKwkJLy8gYS4gSWYgQlNTSUQgaXMgYnJvYWRjYXN0LCByZW1vdmUgYWxsIGdyb3VwIGtleXMgaW5kZXhlZAorCQkvLyBiLiBJZiBCU1NJRCBtYXRjaGVkLCBkZWxldGUgdGhlIGdyb3VwIGtleSBpbmRleGVkLgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVLZXlQcm9jKEtleUlkeD0lbGQpXG4iLCBLZXlJZHgpKTsKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpS2V5SWR4KTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gKFN0YXR1cyk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlbW92ZSBBbGwgV1BBIEtleXMKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBXUEFSZW1vdmVBbGxLZXlzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCisJVUNIQVIgCWk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVBbGxLZXlzKEF1dGhNb2RlPSVkLCBXZXBTdGF0dXM9JWQpXG4iLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisKKwkvLyBGb3IgV0VQL0NLSVAsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIKKwkvLyBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQlyZXR1cm47CisKKwkvLyBGb3IgV1BBLU5vbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIKKwkvLyBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXJldHVybjsKKworCS8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIEJTU0lEX1dDSUQpOworCisJLy8gc2V0IGFsbCBzaGFyZWQga2V5IG1vZGUgYXMgbm8tc2VjdXJpdHkuCisJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKyAgICB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicmVtb3ZlICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnXSwgaSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisKKwkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaSk7CisJfQorCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hhbmdlIE5JQyBQSFkgbW9kZS4gUmUtYXNzb2NpYXRpb24gbWF5IGJlIG5lY2Vzc2FyeS4gcG9zc2libGUgc2V0dGluZ3MKKwkJaW5jbHVkZSAtIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfMTFBLCBhbmQgUEhZXzExQUJHX01JWEVECisKKwlBcmd1bWVudHM6CisJCXBBZCAtIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcGh5bW9kZSAgLQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldFBoeU1vZGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUxPTkcgcGh5bW9kZSkKK3sKKwlJTlQgaTsKKwkvLyB0aGUgc2VsZWN0ZWQgcGh5bW9kZSBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgUkYgSUMgZW5jb2RlZCBpbiBFMlBST00KKworCS8vIGlmIG5vIGNoYW5nZSwgZG8gbm90aGluZworCS8qIGJ1ZyBmaXgKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBwaHltb2RlKQorCQlyZXR1cm47CisgICAgKi8KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gKFVDSEFSKXBoeW1vZGU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBTZXRQaHlNb2RlIDogUGh5TW9kZT0lZCwgY2hhbm5lbD0lZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJQnVpbGRDaGFubmVsTGlzdEV4KHBBZCk7CisjZWxzZQorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBzYW5pdHkgY2hlY2sgdXNlciBzZXR0aW5nCisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IEZpcnN0Q2hhbm5lbChwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU2V0UGh5TW9kZTogY2hhbm5lbCBpcyBvdXQgb2YgcmFuZ2UsIHVzZSBmaXJzdCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCX0KKworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCXN3aXRjaCAocGh5bW9kZSkgeworCQljYXNlIFBIWV8xMUI6CisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4ODI7CSAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDg0OwkgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg4QjsJICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHg5NjsJICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA0OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCisJCQlicmVhazsKKworCQljYXNlIFBIWV8xMUc6CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMU5fMl80RzoKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzRdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDI0OwkgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NDg7CSAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVswXSAgPSAweDBDOwkgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMV0gID0gMHgxODsJICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsyXSAgPSAweDMwOwkgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzNdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gNDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMjsJICAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSA0OwkgICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDExOyAgICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMjI7ICAgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDEyOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdICA9IDE4OyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdICA9IDI0OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSAgPSAzNjsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOF0gID0gNDg7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzldICA9IDcyOyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMF0gPSA5NjsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMTFdID0gMTA4OyAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlicmVhazsKKworCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQljYXNlIFBIWV8xMU5fNUc6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4OEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDEyOwkgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg5ODsJICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDI0OwkgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzRdICA9IDB4YjA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs2XSAgPSAweDYwOwkgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzddICA9IDB4NmM7CSAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gODsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gMDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdICA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSAgPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07IC8vIFRoaXMgTU9ERSBpcyBvbmx5IEZZSS4gbm90IHVzZQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworfQorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsbGVyIGVuc3VyZXMgd2UgaGFzIDgwMi4xMW4gc3VwcG9ydC4KKwkJQ2FsbHMgYXQgc2V0dGluZyBIVCBmcm9tIEFQL1NUQVNldGluZm9ybWF0aW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCAtIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcGh5bW9kZSAgLQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0SFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JT0lEX1NFVF9IVF9QSFlNT0RFICpwSFRQaHlNb2RlKQoreworCS8vVUxPTkcJKnBtY3M7CisJVUlOVDMyCVZhbHVlID0gMDsKKwlVQ0hBUglCQlBWYWx1ZSA9IDA7CisJVUNIQVIJQkJQM1ZhbHVlID0gMDsKKwlVQ0hBUglSeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogSFRfbW9kZSglZCksIEV4dE9mZnNldCglZCksIE1DUyglZCksIEJXKCVkKSwgU1RCQyglZCksIFNIT1JUR0koJWQpXG4iLAorCQkJCQkJCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCQkJCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+U0hPUlRHSSkpOworCisJLy8gRG9uJ3QgemVybyBzdXBwb3J0ZWRIeVBoeSBzdHJ1Y3R1cmUuCisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQpKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCBzaXplb2YocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5KSk7CisKKyAgIAlpZiAocEFkLT5Db21tb25DZmcuYlJkZykKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDE7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDA7CisJfQorCisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSAzOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IgPSAzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogUnhCQVdpbkxpbWl0ID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKKworCS8vIE1pbW8gcG93ZXIgc2F2ZSwgQS1NU0RVIHNpemUsCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogQU1zZHVTaXplID0gJWQsIE1pbW9QcyA9ICVkLCBNcGR1RGVuc2l0eSA9ICVkLCBNYXhSQW1wZHVGYWN0b3IgPSAlZFxuIiwKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5LAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IpKTsKKworCWlmKHBIVFBoeU1vZGUtPkh0TW9kZSA9PSBIVE1PREVfR0YpCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGID0gMTsKKwl9CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAwOworCisJLy8gRGVjaWRlIFJ4IE1DU1NldAorCXN3aXRjaCAoUnhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4MDA7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7CisJCQlicmVhazsKKworCQljYXNlIDM6IC8vIDMqMworCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOworCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweGZmOworCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9ICAweGZmOworCQkJYnJlYWs7CisJfQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkgJiYgKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKSApCisJeworCQlwSFRQaHlNb2RlLT5CVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50ID0gMTsKKwl9CisKKwlpZihwSFRQaHlNb2RlLT5CVyA9PSBCV180MCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7IC8vIE1DUyAzMgorCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IDE7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DQ0ttb2RlaW40MCA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKT8gKEVYVENIQV9CRUxPVyk6IEVYVENIQV9BQk9WRTsKKwkJLy8gU2V0IFJlZ3NpdGVyIGZvciBleHRlbnNpb24gY2hhbm5lbCBwb3NpdGlvbi4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQM1ZhbHVlKTsKKwkJaWYgKChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKKwkJeworCQkJVmFsdWUgfD0gMHgxOworCQkJQkJQM1ZhbHVlIHw9ICgweDIwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQorCQl7CisJCQlWYWx1ZSAmPSAweGZlOworCQkJQkJQM1ZhbHVlICY9ICh+MHgyMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQl9CisKKwkJLy8gVHVybiBvbiBCQlAgNDBNSHogbW9kZSBub3cgb25seSBhcyBBUCAuCisJCS8vIFN0YSBjYW4gdHVybiBvbiBCQlAgNDBNSHogYWZ0ZXIgY29ubmVjdGlvbiB3aXRoIDQwTUh6IEFQLiBTdGEgb25seSBicm9hZGNhc3QgNDBNSHogY2FwYWJpbGl0eSBiZWZvcmUgY29ubmVjdGlvbi4KKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8IElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQorCQkJKQorCQl7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQM1ZhbHVlKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IEVYVENIQV9OT05FOworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCS8vIFR1cm4gb24gQkJQIDIwTUh6IG1vZGUgYnkgcmVxdWVzdCBoZXJlLgorCQl7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCX0KKwl9CisKKwlpZihwSFRQaHlNb2RlLT5TVEJDID09IFNUQkNfVVNFKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDID0gMTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAwOworCX0KKworCisJaWYocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOworCX0KKworCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKKwlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQ29udHJvbENoYW4gPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCS8vIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLgorCisJLy8gRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbgorCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDY7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSAxMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7CisJfQorCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVJUTVBTZXRJbmRpdmlkdWFsSFQocEFkLCAwKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCVBSVF9IVF9QSFlfSU5GTwkJcERlc2lyZWRfaHRfcGh5ID0gTlVMTDsKKwlVQ0hBUglUeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtOworCVVDSEFSCURlc2lyZWRNY3MJPSBNQ1NfQVVUTzsKKworCWRvCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBEZXNpcmVkX2h0X3BoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQkJRGVzaXJlZE1jcyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworCQkJLy9wQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChEZXNpcmVkTWNzID09IE1DU19BVVRPKSA/IFRSVUUgOiBGQUxTRTsKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0gd2hpbGUgKEZBTFNFKTsKKworCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOworCQlyZXR1cm47CisJfQorCVJUTVBaZXJvTWVtb3J5KHBEZXNpcmVkX2h0X3BoeSwgc2l6ZW9mKFJUX0hUX1BIWV9JTkZPKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOworCS8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MKKwlpZiAoKFR4U3RyZWFtID09IDEpICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsIERlc2lyZWRNY3MpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU183OworCX0KKworCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV18yMCkgJiYgKERlc2lyZWRNY3MgPT0gTUNTXzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTXzMyIGlzIG9ubHkgc3VwcG9ydGVkIGluIDQwLU1IeiwgcmVzZXQgaXQgYXMgTUNTXzBcbiIpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU18wOworCX0KKworCXBEZXNpcmVkX2h0X3BoeS0+Ykh0RW5hYmxlID0gVFJVRTsKKworCS8vIERlY2lkZSBkZXNpcmVkIFR4IE1DUworCXN3aXRjaCAoVHhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzcpCisJCQl7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDE8PERlc2lyZWRNY3M7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4MDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAyKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQkvKiBNQ1MwIH4gTUNTMjMsIDMgYnl0ZXMgKi8KKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzIzKQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAzKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCWlmKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfNDApCisJeworCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTyB8fCBEZXNpcmVkTWNzID09IE1DU18zMikKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzRdID0gMHgxOworCX0KKworCS8vIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcKKyAgICBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKyAgICAgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworICAgIGVsc2UKKwkgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIGFwaWR4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVVwZGF0ZSBIVCBJRSBmcm9tIG91ciBjYXBhYmlsaXR5LgorCisJQXJndW1lbnRzOgorCQlTZW5kIGFsbCBIVCBJRSBpbiBiZWFjb24vcHJvYmUgcnNwL2Fzc29jIHJzcC9hY3Rpb24gZnJhbWUuCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFVwZGF0ZUhUSUUoCisJSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCisJSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAorCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykKK3sKKwlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCVJUTVBaZXJvTWVtb3J5KHBBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwUnRIdC0+Q2hhbm5lbFdpZHRoOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzID0gcFJ0SHQtPk1pbW9QczsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGID0gcFJ0SHQtPkdGOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gcFJ0SHQtPlNob3J0R0lmb3IyMDsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IHBSdEh0LT5TaG9ydEdJZm9yNDA7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMgPSBwUnRIdC0+VHhTVEJDOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDID0gcFJ0SHQtPlJ4U1RCQzsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSA9IHBSdEh0LT5BbXNkdVNpemU7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwUnRIdC0+TWF4UkFtcGR1RmFjdG9yOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBwUnRIdC0+TXBkdURlbnNpdHk7CisKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldCA7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoID0gcFJ0SHQtPlJlY29tV2lkdGg7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBwUnRIdC0+Tm9uR2ZQcmVzZW50OworCQlSVE1QTW92ZU1lbW9yeShwQWRkSHRJbmZvLT5NQ1NTZXQsIC8qcFJ0SHQtPk1DU1NldCovcE1jc1NldCwgNCk7IC8vIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUuCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTiAJVUNIQVIJCSAJS2V5SWR4LAorCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCisJSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworCVVJTlQzMgkJV0NJREF0dHJpID0gMDsKKwlVU0hPUlQJCW9mZnNldDsKKwlVQ0hBUgkJSVZFSVYgPSAwOworCVVTSE9SVAkJV2NpZCA9IDA7CisKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChCc3NJZHggPiBCU1MwKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIDEuCUluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLgorCQkJLy8gMi4JSW4gSW5mcmEgbW9kZSwgdGhlIEFJRDoxIE1VU1QgYmUgd2NpZCBvZiBpbmZyYSBTVEEuCisJCQkvLwkJCQkJICAgdGhlIEFJRDoyfiBhc3NpZ24gdG8gbWVzaCBsaW5rIGVudHJ5LgorCQkJaWYgKHBFbnRyeSAmJiBBREhPQ19PTihwQWQpKQorCQkJCVdjaWQgPSBwRW50cnktPkFpZDsKKwkJCWVsc2UgaWYgKHBFbnRyeSAmJiBJTkZSQV9PTihwQWQpKQorCQkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOworCQkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlXY2lkID0gQlNTSURfV0NJRDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlXY2lkID0gTUNBU1RfV0NJRDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZQorCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZEFzTWVzaCkKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgUEFJUldJU0VLRVlUQUJMRTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJZWxzZSBpZiAoKHBFbnRyeSkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykgJiYKKwkJCQkJKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8CisJCQkJIAkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKKwkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSB8fAorCQkJCSAJKENpcGhlckFsZyA9PSBDSVBIRVJfTk9ORSkpKQorCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQllbHNlCisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFNIQVJFREtFWVRBQkxFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCisJLy8gVXBkYXRlIElWL0VJViB0YWJsZQorCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdjaWQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKworCS8vIFdQQSBtb2RlCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCXsKKwkJLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIGlzIDAgZm9yIHBhaXJ3aXNlIGtleQorCQlJVkVJViA9IChLZXlJZHggPDw2KSB8IDB4MjA7CisJfQorCWVsc2UKKwl7CisJCS8vIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuCisJCUlWRUlWID0gKEtleUlkeCA8PCA2KTsKKwl9CisKKwkvLyBGb3Iga2V5IGluZGV4IGFuZCBleHQgSVYgYml0LCBzbyBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbihvZmZzZXQrMykuCisjaWZkZWYgUlQyODYwCisJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQrMywgSVZFSVYpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5OiBXQ0lEICMlZCwgS2V5SW5kZXggIyVkLCBBbGc9JXNcbiIsV2NpZCwgS2V5SWR4LCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIglXQ0lEQXR0cmkgPSAweCV4IFxuIiwgIFdDSURBdHRyaSkpOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUGFyc2UgZW5jcnlwdGlvbiB0eXBlCitBcmd1bWVudHM6CisgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0NIQVIgKkdldEVuY3J5cHRUeXBlKENIQVIgZW5jKQoreworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisgICAgICAgIHJldHVybiAiTk9ORSI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorICAgIAlyZXR1cm4gIldFUCI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCXJldHVybiAiVEtJUCI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCXJldHVybiAiQUVTIjsKKwlpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCkKKyAgICAJcmV0dXJuICJUS0lQQUVTIjsKKyAgICBlbHNlCisgICAgCXJldHVybiAiVU5LTk9XIjsKK30KKworQ0hBUiAqR2V0QXV0aE1vZGUoQ0hBUiBhdXRoKQoreworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKyAgICAJcmV0dXJuICJPUEVOIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKyAgICAJcmV0dXJuICJTSEFSRUQiOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKKyAgICAJcmV0dXJuICJBVVRPV0VQIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAJcmV0dXJuICJXUEEiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgIAlyZXR1cm4gIldQQVBTSyI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgIAlyZXR1cm4gIldQQU5PTkUiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAJcmV0dXJuICJXUEEyIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgCXJldHVybiAiV1BBMlBTSyI7CisJaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikKKyAgICAJcmV0dXJuICJXUEExV1BBMiI7CisJaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKKyAgICAJcmV0dXJuICJXUEExUFNLV1BBMlBTSyI7CisKKyAgICAJcmV0dXJuICJVTktOT1ciOworfQorCisjaWYgMSAvLyNpZm5kZWYgVUNPUworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgc2l0ZSBzdXJ2ZXkgcmVzdWx0cworCUFyZ3VtZW50czoKKwkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAJCTEuKSBVSSBuZWVkcyB0byB3YWl0IDQgc2Vjb25kcyBhZnRlciBpc3N1ZSBhIHNpdGUgc3VydmV5IGNvbW1hbmQKKyAgICAgICAgCQkyLikgaXdwcml2IHJhMCBnZXRfc2l0ZV9zdXJ2ZXkKKyAgICAgICAgCQkzLikgVUkgbmVlZHMgdG8gcHJlcGFyZSBhdCBsZWFzdCA0MDk2Ynl0ZXMgdG8gZ2V0IHRoZSByZXN1bHRzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjZGVmaW5lCUxJTkVfTEVOCSg0KzMzKzIwKzgrMTArOSs3KzMpCS8vIENoYW5uZWwrU1NJRCtCc3NpZCtXZXBTdGF0dXMrQXV0aE1vZGUrU2lnbmFsK1dpcmVzc01vZGUrTmV0d29ya1R5cGUKK1ZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCSptc2c7CisJSU5UIAkJaT0wOworCUlOVAkJCVdhaXRDbnQ7CisJSU5UIAkJU3RhdHVzPTA7CisJQ0hBUgkJU3NpZFtNQVhfTEVOX09GX1NTSUQgKzFdOworICAgIElOVCAgICAgICAgIFJzc2kgPSAwLCBtYXhfbGVuID0gTElORV9MRU47CisJVUlOVCAgICAgICAgUnNzaV9RdWFsaXR5ID0gMDsKKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgd2lyZWxlc3NfbW9kZTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJm1zZywgc2l6ZW9mKENIQVIpKigoTUFYX0xFTl9PRl9CU1NfVEFCTEUpKm1heF9sZW4pKTsKKworCWlmIChtc2cgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkgLSBtc2cgbWVtb3J5IGFsbG9jIGZhaWwuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQobXNnLCAwICwoTUFYX0xFTl9PRl9CU1NfVEFCTEUpKm1heF9sZW4gKTsKKwltZW1zZXQoU3NpZCwgMCAsKE1BWF9MRU5fT0ZfU1NJRCArMSkpOworCXNwcmludGYobXNnLCIlcyIsIlxuIik7CisJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNHMlLTMzcyUtMjBzJS04cyUtMTBzJS05cyUtN3MlLTNzXG4iLAorCSAgICAiQ2giLCAiU1NJRCIsICJCU1NJRCIsICJFbmMiLCAiQXV0aCIsICJTaWdhbmwoJSkiLCAiVy1Nb2RlIiwgIiBOVCIpOworCisJV2FpdENudCA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwl3aGlsZSAoKFNjYW5SdW5uaW5nKHBBZGFwdGVyKSA9PSBUUlVFKSAmJiAoV2FpdENudCsrIDwgMjAwKSkKKwkJT1NfV0FJVCg1MDApOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJZm9yKGk9MDsgaTxwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA7aSsrKQorCXsKKwkJaWYoIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw9PTApCisJCQlicmVhazsKKworCQlpZigoc3RybGVuKG1zZykrbWF4X2xlbiApID49IElXX1NDQU5fTUFYX0RBVEEpCisJCQlicmVhazsKKworCQkvL0NoYW5uZWwKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsKTsKKwkJLy9TU0lECisJCW1lbWNweShTc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJU3NpZFtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuXSA9ICdcMCc7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTMzcyIsIFNzaWQpOworCQkvL0JTU0lECisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgICIsCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFswXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzFdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMl0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFszXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzRdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNV0pOworCQkvL0VuY3J5cHRpb24gVHlwZQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS04cyIsR2V0RW5jcnlwdFR5cGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzKSk7CisJCS8vQXV0aGVudGljYXRpb24gTW9kZQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBzIiwgIlVOS05PVyIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLEdldEF1dGhNb2RlKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF1dGhNb2RlKSk7CisJCS8vIFJzc2kKKwkJUnNzaSA9IChJTlQpcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaTsKKwkJaWYgKFJzc2kgPj0gLTUwKQorCQkJUnNzaV9RdWFsaXR5ID0gMTAwOworCQllbHNlIGlmIChSc3NpID49IC04MCkgICAgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgyNCArICgoUnNzaSArIDgwKSAqIDI2KS8xMCk7CisJCWVsc2UgaWYgKFJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisJCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoKChSc3NpICsgOTApICogMjYpLzEwKTsKKwkJZWxzZSAgICAvLyA8IC04NCBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IDA7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTlkIiwgUnNzaV9RdWFsaXR5KTsKKwkJLy8gV2lyZWxlc3MgTW9kZQorCQl3aXJlbGVzc19tb2RlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRkggfHwKKwkJCXdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMURTKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01X04pCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEvbiIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZyIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjRfTikKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nL24iKTsKKwkJZWxzZQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAidW5rbm93Iik7CisJCS8vTmV0d29yayBUeXBlCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBBZCIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgSW4iKTsKKworICAgICAgICBzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiXG4iKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIHdycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKwlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKW1zZyk7Cit9CisKKworI2RlZmluZQlNQUNfTElORV9MRU4JKDE0KzQrNCsxMCsxMCsxMCs2KzYpCS8vIEFkZHIrYWlkK3BzbStkYXRhdGltZStyeGJ5dGUrdHhieXRlK2N1cnJlbnQgdHggcmF0ZStsYXN0IHR4IHJhdGUKK1ZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gc3RydWN0IGl3cmVxICp3cnEpCit7CisJSU5UIGk7CisJUlRfODAyXzExX01BQ19UQUJMRSBNYWNUYWI7CisJY2hhciAqbXNnOworCisJTWFjVGFiLk51bSA9IDA7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIoTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFkZHIsICZwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFpZCA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Qc20gPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlBzTW9kZTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5NaW1vUHMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLk1tcHNNb2RlOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBGaWxsIGluIFJTU0kgcGVyIGVudHJ5CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTAgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTEgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTE7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTIgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTI7CisKKwkJCS8vIHRoZSBjb25uZWN0ZWQgdGltZSBwZXIgZW50cnkKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Db25uZWN0ZWRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5TdGFDb25uZWN0VGltZTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTUNTID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5CVyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLkJXOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TaG9ydEdJID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU1RCQyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLnJzdiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLnJzdjsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTU9ERSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS53b3JkOworCisJCQlNYWNUYWIuTnVtICs9IDE7CisJCX0KKwl9CisJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1hY1RhYiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwl9CisKKwltc2cgPSAoQ0hBUiAqKSBrbWFsbG9jKHNpemVvZihDSEFSKSooTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSwgTUVNX0FMTE9DX0ZMQUcpOworCW1lbXNldChtc2csIDAgLE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiApOworCXNwcmludGYobXNnLCIlcyIsIlxuIik7CisJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTRzJS00cyUtNHMlLTEwcyUtMTBzJS0xMHMlLTZzJS02c1xuIiwKKwkJIk1BQyIsICJBSUQiLCAiUFNNIiwgIkxEVCIsICJSeEIiLCAiVHhCIiwiQ1R4UiIsICJMVHhSIik7CisKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJaWYoKHN0cmxlbihtc2cpK01BQ19MSU5FX0xFTiApID49IChNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pICkKKwkJCQlicmVhazsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggICIsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPkFpZCk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5MYXN0RGF0YVBhY2tldFRpbWUqLyk7IC8vIFRvRG8KKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudCovKTsgLy8gVG9EbworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFR4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZCIsUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQ3VyclR4UmF0ZV0pOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNmRcbiIsMC8qUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTGFzdFR4UmF0ZV0qLyk7IC8vIFRvRG8KKwkJfQorCX0KKwkvLyBmb3IgY29tcGF0aWJsZSB3aXRoIG9sZCBBUEkganVzdCBkbyB0aGUgcHJpbnRrIHRvIGNvbnNvbGUKKwkvL3dycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCS8vaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyIsIG1zZykpOworCX0KKworCWtmcmVlKG1zZyk7Cit9CisjZW5kaWYgLy8gVUNPUyAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2V0X0JBU2V0dXBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCB0aWQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKy8qCisJVGhlIEJBU2V0dXAgaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KKyovCisJLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisKKwlpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiAxNSkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4XG4iLCBtYWNbMF0sIG1hY1sxXSwKKwkJCQltYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7CisKKwkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisgICAgCWlmIChwRW50cnkpIHsKKyAgICAgICAgCXByaW50aygiXG5TZXR1cCBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKwkgICAgICAgIEJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCB0aWQsIDAsIDEwMCwgVFJVRSk7CisgICAgCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9CQURlY2xpbmVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgYkJBRGVjbGluZTsKKworCWJCQURlY2xpbmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGJCQURlY2xpbmUgPT0gMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKwl9CisJZWxzZSBpZiAoYkJBRGVjbGluZSA9PSAxKQorCXsKKwkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JBRGVjbGluZV9Qcm9jOjooQkFEZWNsaW5lPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworLyoKKwlUaGUgQkFPcmlUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiBOVU1fT0ZfVElEKQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkgICAgcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKKwkgICAgICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkgICAgaWYgKHBFbnRyeSkgeworCSAgICAgICAgcHJpbnRrKCJcblRlYXIgZG93biBPcmkgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7CisgICAgICAgIEJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UsIFRSVUUpOworCSAgICB9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfQkFSZWNUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworLyoKKwlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiBOVU1fT0ZfVElEKQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKKwkJICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkJaWYgKHBFbnRyeSkgeworCQkgICAgcHJpbnRrKCJcblRlYXIgZG93biBSZWMgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7CisJCSAgICBCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFKTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgSHRCdzsKKworCUh0QncgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChIdEJ3ID09IEJXXzQwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7CisJZWxzZSBpZiAoSHRCdyA9PSBCV18yMCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QndfUHJvYzo6KEh0Qnc9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIEh0TWNzLCBNY3NfdG1wOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIEJPT0xFQU4gYkF1dG9SYXRlID0gRkFMU0U7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlNY3NfdG1wID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChNY3NfdG1wIDw9IDE1IHx8IE1jc190bXAgPT0gMzIpCisJCUh0TWNzID0gTWNzX3RtcDsKKwllbHNlCisJCUh0TWNzID0gTUNTX0FVVE87CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBIdE1jczsKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoSHRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRTpGQUxTRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihIdE1jcz0lZCwgYkF1dG9UeFJhdGVTd2l0Y2ggPSAlZClcbiIsCisJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUywgcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpKTsKKworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKSB8fAorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPCBNT0RFX0hUTUlYKSkKKwkJeworCSAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKKwkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSAzKSAmJgorCSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spKQorCQkJeworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAoTE9ORykgKFJhdGVJZFRvTWJwc1tIdE1jc10gKiAxMDAwMDAwKSk7CisJCQl9CisJICAgICAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCisJCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDcpICYmCisJICAgICAgICAgICAgCShwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9PRkRNKSkKKwkJCXsKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3MrNF0gKiAxMDAwMDAwKSk7CisJCQl9CisJCQllbHNlCisJCQkJYkF1dG9SYXRlID0gVFJVRTsKKworCQkJaWYgKGJBdXRvUmF0ZSkKKwkJCXsKKwkgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CisJCQl9CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlKSk7CisJCX0KKyAgICAgICAgaWYgKEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlTZXRDb21tb25IVChwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBIdEdpOworCisJSHRHaSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoIEh0R2kgPT0gR0lfNDAwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwllbHNlIGlmICggSHRHaSA9PSBHSV84MDAgKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0R2lfUHJvYzo6KFNob3J0R0k9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgU2l6ZTsKKworCVNpemUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFNpemUgPD0wIHx8IFNpemUgPj02NCkKKwl7CisJCVNpemUgPSA4OworCX0KKwlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IFNpemUtMTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfSHRUeEJBU2l6ZSA6OihUeEJBU2l6ZT0gJWQpXG4iLCBTaXplKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKKwllbHNlIGlmICggVmFsdWUgPT0gSFRNT0RFX01NICkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE9wTW9kZV9Qcm9jOjooSHRPcE1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpKTsKKworCXJldHVybiBUUlVFOworCit9CisKK0lOVAlTZXRfSHRTdGJjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gU1RCQ19VU0UpCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJZWxzZSBpZiAoIFZhbHVlID09IFNUQkNfTk9ORSApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU3RiY19Qcm9jOjooSHRTdGJjPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRIdGNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKyAgICAgICAgCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRIdGNfUHJvYzo6KEh0SHRjPSVkKVxuIixwQWQtPkhUQ0VuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0RXh0Y2hhX1Byb2M6OihIdEV4dGNoYT0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OworCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1wZHVEZW5zaXR5X1Byb2M6OihIdE1wZHVEZW5zaXR5PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisKKwlpZiAoVmFsdWUgPj0xICYmIFZhbHVlIDw9IDY0KQorCXsKKwkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJfQorCWVsc2UKKwl7CisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCX0KKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCYVdpblNpemVfUHJvYzo6KEh0QmFXaW5TaXplPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisJeworCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisgICAgICAgIAlwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKKwl9CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFJkZ19Qcm9jOjooSHRSZGc9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJSZGcpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKwl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRMaW5rQWRhcHRfUHJvYzo6KEh0TGlua0FkYXB0PSVkKVxuIixwQWQtPmJMaW5rQWRhcHQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PSAxICkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QW1zZHVfUHJvYzo6KEh0QW1zZHU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRBdXRvQmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKyAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QXV0b0JhX1Byb2M6OihIdEF1dG9CYT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCisJcmV0dXJuIFRSVUU7CisKK30KKworSU5UCVNldF9IdFByb3RlY3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKKyAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRQcm90ZWN0X1Byb2M6OihIdFByb3RlY3Q9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgbW9kZTsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworLyoKKwlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgbW9kZSB2YWx1ZS4KKyovCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgbW9kZSB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisgICAJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJbW9kZSA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmIChtb2RlID4gTU1QU19FTkFCTEUpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCBtb2RlKTsKKworCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkJaWYgKHBFbnRyeSkgeworCQkgICAgcHJpbnRrKCJcblNlbmRQU01QQWN0aW9uIE1JUFMgbW9kZSA9ICVkXG4iLCBtb2RlKTsKKwkJICAgIFNlbmRQU01QQWN0aW9uKHBBZCwgcEVudHJ5LT5BaWQsIG1vZGUpOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCisKK30KKworSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPD0zICYmIFZhbHVlID49IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOworCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gMzsKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNSU1PUFNtb2RlX1Byb2M6OihNSU1PUFMgbW9kZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IEZBTFNFOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VTaG9ydEdJX1Byb2M6OihGb3JjZVNob3J0R0k9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisKK0lOVAlTZXRfRm9yY2VHRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IEZBTFNFOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VHRl9Qcm9jOjooRm9yY2VHRj0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TWltb1BzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWltb1BzX1Byb2M6OihIdE1pbW9Qcz0lZClcbiIscEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNldENvbW1vbkhUKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU9JRF9TRVRfSFRfUEhZTU9ERQkJU2V0SFQ7CisKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpCisJCXJldHVybiBGQUxTRTsKKworCVNldEhULlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCVNldEhULlRyYW5zbWl0Tm8gPSAoKFVDSEFSKXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgpOworCVNldEhULkh0TW9kZSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworCVNldEhULkV4dE9mZnNldCA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCVNldEhULk1DUyA9IE1DU19BVVRPOworCVNldEhULkJXID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKwlTZXRIVC5TVEJDID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOworCVNldEhULlNIT1JUR0kgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisKKwlSVE1QU2V0SFQocEFkLCAmU2V0SFQpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTZXRfRml4ZWRUeE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKwlpZiAoc3RyY21wKGFyZywgIk9GRE0iKSA9PSAwIHx8IHN0cmNtcChhcmcsICJvZmRtIikgPT0gMCkKKwl7CisJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX09GRE07CisJfQorCWVsc2UgaWYgKHN0cmNtcChhcmcsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChhcmcsICJjY2siKSA9PSAwKQorCXsKKyAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfQ0NLOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9GaXhlZFR4TW9kZV9Qcm9jOjooRml4ZWRUeE1vZGU9JWQpXG4iLCBmaXhfdHhfbW9kZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorSU5UCVNldF9PcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBSVDI4NjAKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorI2VuZGlmIC8vIFJUMjg2MCAvLworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuIG5vdCBzd2l0Y2ggb3BlcmF0ZSBtb2RlIG9uIGludGVyZmFjZSB1cCAhISBcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5PcE1vZGUgPSBPUE1PREVfQVA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X09wTW9kZV9Qcm9jOjooT3BNb2RlPSVzKVxuIiwgcEFkLT5PcE1vZGUgPT0gMSA/ICJBUCBNb2RlIiA6ICJTVEEgTW9kZSIpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCisgICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpCit7CisJc3dpdGNoKGF1dGhNb2RlKQorCXsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOgorCQkJcmV0dXJuICJPUEVOIjsKKyAgICAgICAgZGVmYXVsdDoKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisJCQlyZXR1cm4gIldQQVBTSyI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOgorCQkJcmV0dXJuICJTSEFSRUQiOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKKwkJCXJldHVybiAiV1BBIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorCQkJcmV0dXJuICJXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgorCQkJcmV0dXJuICJXUEEyUFNLIjsKKyAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKwkJCXJldHVybiAiV1BBUFNLV1BBMlBTSyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6CisJCQlyZXR1cm4gIldQQTFXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorCQkJcmV0dXJuICJXUEFOT05FIjsKKwl9Cit9CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKKyAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSkKK3sKKwlzd2l0Y2goZW5jcnlNb2RlKQorCXsKKwkgICAgZGVmYXVsdDoKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlyZXR1cm4gIk5PTkUiOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJcmV0dXJuICJXRVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCQlyZXR1cm4gIlRLSVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlyZXR1cm4gIkFFUyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKwkJCXJldHVybiAiVEtJUEFFUyI7CisJfQorfQorCitJTlQgUlRNUFNob3dDZmdWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTmFtZSwKKwlJTglQVUNIQVIJCQlwQnVmKQoreworCUlOVAlTdGF0dXMgPSAwOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCisJeworCQlpZiAoIXN0cmNtcChwTmFtZSwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSkpCisJCXsKKwkJCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPnNob3dfcHJvYyhwQWQsIHBCdWYpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsgIC8vRXhpdCBmb3IgbG9vcC4KKwkJfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7CisJCXNwcmludGYocEJ1ZiwgIlxuIik7CisJCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQorCQkJc3ByaW50ZihwQnVmLCAiJXMlc1xuIiwgcEJ1ZiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7CisJfQorCisJcmV0dXJuIFN0YXR1czsKK30KKworSU5UCVNob3dfU1NJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIiKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQSIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUciKTsKKwkJCWJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDIuNEciKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUcvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9OIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl81RzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCA1RyIpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCitJTlQJU2hvd19UeEJ1cnN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0U2hvcnQiKTsKKwkJCWJyZWFrOworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgorCQkJc3ByaW50ZihwQnVmLCAiXHRMb25nIik7CisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QXV0byIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglbHUpIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWx1IiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKQorCXsKKwkJY2FzZSAxOiAvL0Fsd2F5cyBPbgorCQkJc3ByaW50ZihwQnVmLCAiXHRPTiIpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLy9BbHdheXMgT0ZGCisJCQlzcHJpbnRmKHBCdWYsICJcdE9GRiIpOworCQkJYnJlYWs7CisJCWNhc2UgMDogLy9BVVRPCisJCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNob3dfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJeworCQlzcHJpbnRmKHBCdWYsICJcdDQwIE1IeiIpOworCX0KKwllbHNlCisJeworICAgICAgICBzcHJpbnRmKHBCdWYsICJcdDIwIE1IeiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpCisJeworCQljYXNlIEdJXzQwMDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0lfNDAwIik7CisJCQlicmVhazsKKwkJY2FzZSBHSV84MDA6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdJXzgwMCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpCisJeworCQljYXNlIEhUTU9ERV9HRjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0YiKTsKKwkJCWJyZWFrOworCQljYXNlIEhUTU9ERV9NTToKKwkJCXNwcmludGYocEJ1ZiwgIlx0TU0iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpCisJeworCQljYXNlIEVYVENIQV9CRUxPVzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QmVsb3ciKTsKKwkJCWJyZWFrOworCQljYXNlIEVYVENIQV9BQk9WRToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QWJvdmUiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYlJkZyA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5TdGFDZmcuQnNzVHlwZSkKKwl7CisJCWNhc2UgQlNTX0FESE9DOgorCQkJc3ByaW50ZihwQnVmLCAiXHRBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0lORlJBOgorCQkJc3ByaW50ZihwQnVmLCAiXHRJbmZyYSIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0FOWToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QW55Iik7CisJCQlicmVhazsKKwkJY2FzZSBCU1NfTU9OSVRPUjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0TW9uaXRvciIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKEF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pICYmCisJCShBdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoQXV0aE1vZGUpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIEF1dGhNb2RlKTsKKworCXJldHVybiAwOworfQorCitJTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlXZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKFdlcFN0YXR1cyA+PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQpKQorCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihXZXBTdGF0dXMpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIFdlcFN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOworCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1dlcEtleV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBJTlQJCQkJS2V5SWR4LAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVVDSEFSICAgS2V5WzE2XSA9IHswfSwgS2V5TGVuZ3RoID0gMDsKKwlJTlQJCWluZGV4ID0gQlNTMDsKKworCUtleUxlbmd0aCA9IHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleUxlbjsKKwlOZGlzTW92ZU1lbW9yeShLZXksIHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleSwgS2V5TGVuZ3RoKTsKKworCS8vY2hlY2sga2V5IHN0cmluZyBpcyBBU0NJSSBvciBub3QKKyAgICBpZiAoUlRNUENoZWNrU3RyUHJpbnRBYmxlKEtleSwgS2V5TGVuZ3RoKSkKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQlcyIsIEtleSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQiKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBLZXlMZW5ndGg7IGlkeCsrKQorICAgICAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBLZXlbaWR4XSk7CisgICAgfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDEsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDIsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlJTlQgCWlkeDsKKwlVQ0hBUglQTUtbMzJdID0gezB9OworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShQTUssIHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgc3ByaW50ZihwQnVmLCAiXHRQTUsgPSAiKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykKKyAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBQTUtbaWR4XSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjA3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc2FuaXR5LmMKQEAgLTAsMCArMSwxNjMzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCitleHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107CisKK2V4dGVybiBVQ0hBUglXUEFfT1VJW107CitleHRlcm4gVUNIQVIJUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUglSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107CitleHRlcm4gVUNIQVIgICAgV1BTX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMikKK3sKKyAgICBQTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgcEluZm87CisKKyAgICBwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilNc2c7CisKKyAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHBJbmZvLT5wQWRkclswXSYweDAxKSA9PSAweDAxKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopTXNnOworCisgICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCkpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+VElEICYgMHhmMCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwlpZiAoTmRpc0VxdWFsTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLCBNQUNfQUREUl9MRU4pID09IDApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIHRoZSBwZWVyIGFkZHIgZG9zZW4ndCBleGlzdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMikKK3sKKwlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUEZSQU1FX0FEREJBX1JFUSBwQWRkRnJhbWU7CisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisJcEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihwQWRkRnJhbWUtPkJhU3RhcnRTZXEud29yZCk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOworCisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCXBBZGRGcmFtZS0+U3RhdHVzQ29kZSA9IGNwdTJsZTE2KHBBZGRGcmFtZS0+U3RhdHVzQ29kZSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCWlmIChwQWRkRnJhbWUtPkJhUGFybS5USUQgJjB4ZmZmMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworCit9CisKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSIFdjaWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4gKQoreworCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9ERUxCQV9SRVEgIHBEZWxGcmFtZTsKKwlpZiAoTXNnTGVuICE9IChzaXplb2YoRlJBTUVfREVMQkFfUkVRKSkpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkocE1zZyk7CisKKwkqKFVTSE9SVCAqKSgmcERlbEZyYW1lLT5EZWxiYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSk7CisJcERlbEZyYW1lLT5SZWFzb25Db2RlID0gY3B1MmxlMTYocERlbEZyYW1lLT5SZWFzb25Db2RlKTsKKworCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQgJjB4ZmZmMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIElOIFVDSEFSICBNc2dDaGFubmVsLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAorICAgIE9VVCBVQ0hBUiAqcEJzc1R5cGUsCisgICAgT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBDaGFubmVsLAorICAgIE9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCisgICAgT1VUIENGX1BBUk0gKnBDZlBhcm0sCisgICAgT1VUIFVTSE9SVCAqcEF0aW1XaW4sCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVQ0hBUiAqcEVycCwKKyAgICBPVVQgVUNIQVIgKnBEdGltQ291bnQsCisgICAgT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCisgICAgT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCisgICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCisgICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQJVUNIQVIgKnBDa2lwRmxhZywKKyAgICBPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisgICAgT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAorICAgIE9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKKyAgICBPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisgICAgT1VUIFVMT05HICpwUmFsaW5rSWUsCisgICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCisJT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCisJT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsT2Zmc2V0LAkJLy8gSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KQorICAgIE9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKKyAgICBPVVQJUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworICAgIENIQVIJCQkJKlB0cjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlDSEFSIAkJCQlUaW1MZW47CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgUEZSQU1FXzgwMl8xMQkJcEZyYW1lOworICAgIFBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKyAgICBVQ0hBUgkJCQlTdWJUeXBlOworICAgIFVDSEFSCQkJCVNhbml0eTsKKyAgICAvL1VDSEFSCQkJCUVDV01pbiwgRUNXTWF4OworICAgIC8vTUFDX0NTUjlfU1RSVUMJCUNzcjk7CisgICAgVUxPTkcJCQkJTGVuZ3RoID0gMDsKKworCS8vIEZvciBzb21lIDExYSBBUCB3aGljaCBkaWRuJ3QgaGF2ZSBEU19JRSwgd2UgdXNlIHR3byBjb25kaXRpb25zIHRvIGRlY2lkZSB0aGUgY2hhbm5lbAorCS8vCTEuIElmIHRoZSBBUCBpcyAxMW4gZW5hYmxlZCwgdGhlbiBjaGVjayB0aGUgY29udHJvbCBjaGFubmVsLgorCS8vCTIuIElmIHRoZSBBUCBkaWRuJ3QgaGF2ZSBhbnkgaW5mbyBhYm91dCBjaGFubmVsLCB1c2UgdGhlIGNoYW5uZWwgd2UgcmVjZWl2ZWQgdGhpcyBmcmFtZSBhcyB0aGUgY2hhbm5lbC4gKE1heSBpbmFjY3VyYWN5ISEpCisJVUNIQVIJCQlDdHJsQ2hhbm5lbCA9IDA7CisKKyAgICAvLyBBZGQgZm9yIDMgbmVjZXNzYXJ5IEVJRCBmaWVsZCBjaGVjaworICAgIFNhbml0eSA9IDA7CisKKyAgICAqcEF0aW1XaW4gPSAwOworICAgICpwRXJwID0gMDsKKyAgICAqcER0aW1Db3VudCA9IDA7CisgICAgKnBEdGltUGVyaW9kID0gMDsKKyAgICAqcEJjYXN0RmxhZyA9IDA7CisgICAgKnBNZXNzYWdlVG9NZSA9IDA7CisgICAgKnBFeHRSYXRlTGVuID0gMDsKKyAgICAqcENraXBGbGFnID0gMDsJCQkgICAgICAgIC8vIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMAorICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsgIC8vIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYKKyAgICAqTGVuZ3RoVklFID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKKyAgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgKkFkZEh0SW5mb0xlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisgICAgKnBSYWxpbmtJZSA9IDA7CisgICAgKnBOZXdDaGFubmVsID0gMDsKKyAgICAqTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CS8vRGVmYXVsdCAweGZmIG1lYW5zIG5vIHN1Y2ggSUUKKyAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0NGIGZvdW5kCisgICAgcFFic3NMb2FkLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9RQlNTX0xPQUQgZm91bmQKKyAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0VEQ0FfUEFSQU1FVEVSIGZvdW5kCisgICAgcFFvc0NhcGFiaWxpdHktPmJWYWxpZCA9IEZBTFNFOyAvLyBkZWZhdWx0OiBubyBJRV9RT1NfQ0FQQUJJTElUWSBmb3VuZAorCisgICAgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgLy8gZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIKKyAgICBTdWJUeXBlID0gKFVDSEFSKXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CisKKyAgICAvLyBnZXQgQWRkcjIgYW5kIEJTU0lEIGZyb20gaGVhZGVyCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBCc3NpZCwgcEZyYW1lLT5IZHIuQWRkcjMpOworCisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIC8vIGdldCB0aW1lc3RhbXAgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFRpbWVzdGFtcCwgUHRyLCBUSU1FU1RBTVBfTEVOKTsKKworCXBUaW1lc3RhbXAtPnUuTG93UGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuTG93UGFydCk7CisJcFRpbWVzdGFtcC0+dS5IaWdoUGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuSGlnaFBhcnQpOworCisgICAgUHRyICs9IFRJTUVTVEFNUF9MRU47CisgICAgTGVuZ3RoICs9IFRJTUVTVEFNUF9MRU47CisKKyAgICAvLyBnZXQgYmVhY29uIGludGVydmFsIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBCZWFjb25QZXJpb2QsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKyAgICBMZW5ndGggKz0gMjsKKworICAgIGlmIChDQVBfSVNfRVNTX09OKCpwQ2FwYWJpbGl0eUluZm8pKQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgZWxzZQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfQURIT0M7CisKKyAgICBwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VjdXJlIGNvcHkgVklFIHRvIFZhcklFW01BWF9WSUVfTEVOXSBkaWRuJ3Qgb3ZlcmZsb3cuCisgICAgICAgIC8vCisgICAgICAgIGlmICgoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpID49IE1BWF9WSUVfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIFZhcmlhYmxlIElFcyBvdXQgb2YgcmVzb3VyY2UgW2xlbig9JWQpID4gTUFYX1ZJRV9MRU4oPSVkKV1cbiIsCisgICAgICAgICAgICAgICAgICAgICgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMiksIE1BWF9WSUVfTEVOKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfU1NJRDoKKyAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IGhhcyBvbmUgU1NJRCBFSUQgaW4gdGhpcyBiZWFjb24sIGlnbm9yZSB0aGUgc2Vjb25kIG9uZQorICAgICAgICAgICAgICAgIGlmIChTYW5pdHkgJiAweDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBTc2lkTGVuID0gcEVpZC0+TGVuOworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwU3VwUmF0ZUxlbiA9IHBFaWQtPkxlbjsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBTdXBSYXRlLCBwU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKworCQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBwRWlkLT5MZW4gPSAlZFxuIiwgcEVpZC0+TGVuKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKKwkJCXsKKwkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQorCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQorCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCisJCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOworCisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7CisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpCisJCQl7CisJCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9GSF9QQVJNOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShJRV9GSF9QQVJNKSBcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9EU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsICpwQ2hhbm5lbCkgPT0gMCkKKwkJCQkJCXsKKworCQkJCQkJCXJldHVybiBGQUxTRTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSUJTU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEF0aW1XaW4sIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBJRV9USU06CisgICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQVUNIQVIpcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLCAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LCBwRHRpbVBlcmlvZCwgcE1lc3NhZ2VUb01lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICBjYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICAgICAgLy8gQ0NYIHYyIGhhcyB0aGUgc2FtZSBJRSwgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHRvbworICAgICAgICAgICAgLy8gV2lmaSBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbGUsIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KKyAgICAgICAgICAgIC8vIGNhc2UgSUVfV1BBOgorICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIE9VSSB2ZXJzaW9uLCBmaWx0ZXIgb3V0IG5vbi1zdGFuZGFyZCB1c2FnZQorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFJBTElOS19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLypwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFaWQtPk9jdGV0WzNdICE9IDApCisgICAgICAgIAkJCQkqcFJhbGlua0llID0gcEVpZC0+T2N0ZXRbM107CisgICAgICAgIAkJCWVsc2UKKyAgICAgICAgCQkJCSpwUmFsaW5rSWUgPSAweGYwMDAwMDAwOyAvLyBTZXQgdG8gbm9uLXplcm8gdmFsdWUgKGNhbid0IHNldCBiaXQwLTIpIHRvIHJlcHJlc2VudCB0aGlzIGlzIFJhbGluayBDaGlwLiBTbyBhdCBsaW5rdXAsIHdlIHdpbGwgc2V0IHJhbGlua2NoaXAgZmxhZy4KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIFRoaXMgSFQgSUUgaXMgYmVmb3JlIElFRUUgZHJhZnQgc2V0IEhUIElFIHZhbHVlLjIwMDYtMDktMjggYnkgSmFuLgorCisgICAgICAgICAgICAgICAgLy8gT3RoZXIgdmVuZG9ycyBoYWQgcHJvZHVjdGlvbiBiZWZvcmUgSUVfSFRfQ0FQIHZhbHVlIGlzIGFzc2lnbmVkLiBUbyBiYWNrd2FyZCBzdXBwb3J0IHRob3NlIG9sZC1maXJtd2FyZSBBUCwKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBicm9hZGNvbS1kZWZpZW5kIHByZS04MDIuMTFuRDEuMCBPVUkgZm9yIEhUIHJlbGF0ZWQgSUUsIGluY2x1ZGluZyBIVCBDYXBhdGlsaXRpZXMgSUUgYW5kIEhUIEluZm9ybWF0aW9uIElFCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKCpwSHRDYXBhYmlsaXR5TGVuID09IDApICYmIE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUFJFX05fSFRfT1VJLCAzKSAmJiAocEVpZC0+TGVuID49IDQpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fSFRfQ0FQKSAmJiAocEVpZC0+TGVuID49IDMwKSAmJiAoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9BRERfSFQpICYmIChwRWlkLT5MZW4gPj0gMjYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgorICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSAyNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgcHRyOworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwRWlkLT5PY3RldFs4XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7IC8vIGI1fjYgaXMgQUMgSU5ERVgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVthY2ldICA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7ICAgLy8gYjUgaXMgQUNNCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOyAgICAgICAgICAgICAgIC8vIGIwfjMgaXMgQUlGU04KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyKzEpICYgMHgwZjsgICAgICAgICAgICAgLy8gYjB+NCBpcyBDd21pbgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFthY2ldID0gKihwdHIrMSkgPj4gNDsgICAgICAgICAgICAgICAvLyBiNX44IGlzIEN3bWF4CisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbYWNpXSAgPSAqKHB0cisyKSArIDI1NiAqICgqKHB0ciszKSk7IC8vIGluIHVuaXQgb2YgMzItdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA0OyAvLyBwb2ludCB0byBuZXh0IEFDCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfSU5GT19FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOworCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IEVEQ0EgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQkVdICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXSA9IDM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXSA9IENXX01JTl9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV0gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gID0gMDsKKworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JLXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS10gPSA3OworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS10gPSBDV19NSU5fSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdID0gQ1dfTUFYX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdICA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WSV0gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID0gMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldID0gQ1dfTUlOX0lOX0JJVFMtMTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldID0gQ1dfTUFYX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICA9IDk2OyAgIC8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfVk9dICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXSA9IDI7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSA9IENXX01JTl9JTl9CSVRTLTI7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXSA9IENXX01BWF9JTl9CSVRTLTE7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dICA9IDQ4OyAgIC8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcworICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHJhdGVzIGluIE1sbWVBdXguCisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcworICAgICAgICAgICAgICAgICAgICAvLyBSVE1QQ2hlY2tSYXRlcyhwQWQsIEV4dFJhdGUsIHBFeHRSYXRlTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRVJQOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwRXJwID0gKFVDSEFSKXBFaWQtPk9jdGV0WzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6CisgICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4CisgICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjgKKyAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDEyWFggdXNlZCBsZW5ndGggYXMgMzAKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FQX1RYX1BPV0VSOgorICAgICAgICAgICAgICAgIC8vIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCisgICAgICAgICAgICAgICAgLy8wLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSA2CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDA2KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEdldCBjZWxsIHBvd2VyIGxpbWl0IGluIGRCbQorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAqKHBFaWQtPk9jdGV0ICsgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFdQQTIgJiA4MDIuMTFpIFJTTgorICAgICAgICAgICAgY2FzZSBJRV9SU046CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gT1VJIGZvciB2ZXJzaW9uIGFueW1vcmUsIGNoZWNrIHRoZSBncm91cCBjaXBoZXIgT1VJIGJlZm9yZSBjb3B5aW5nCisgICAgICAgICAgICAgICAgaWYgKFJUTVBFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgorICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCWNhc2UgSUVfQ09VTlRSWToKKwkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKyAgICB9CisKKyAgICAvLyBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJVUNIQVIgTGF0Y2hSZkNoYW5uZWwgPSBNc2dDaGFubmVsOworCQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoKFNhbml0eSAmIDB4NCkgPT0gMCkpCisJCXsKKwkJCWlmIChDdHJsQ2hhbm5lbCAhPSAwKQorCQkJCSpwQ2hhbm5lbCA9IEN0cmxDaGFubmVsOworCQkJZWxzZQorCQkJCSpwQ2hhbm5lbCA9IExhdGNoUmZDaGFubmVsOworCQkJU2FuaXR5IHw9IDB4NDsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChTYW5pdHkgIT0gMHg3KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBtaXNzaW5nIGZpZWxkLCBTYW5pdHk9MHglMDJ4XG4iLCBTYW5pdHkpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gVFJVRTsKKwl9CisKK30KKworI2lmZGVmIERPVDExTl9EUkFGVDMKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjayBmb3Igc29tZSBJRSBhZGRyZXNzZWQgIGluIDgwMi4xMW4gZDMuMDMuCisJUmV0dXJuOgorCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAJKlJlZ0NsYXNzKQoreworCUNIQVIJCQkJKlB0cjsKKwlQRlJBTUVfODAyXzExCQlwRnJhbWU7CisJUEVJRF9TVFJVQ1QJCQlwRWlkOworCVVMT05HCQkJCUxlbmd0aCA9IDA7CisKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKwkqUmVnQ2xhc3MgPSAwOworCVB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisJTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKwkvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCVB0ciArPSBUSU1FU1RBTVBfTEVOOworCUxlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCisJLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwlQdHIgKz0gMjsKKwlMZW5ndGggKz0gMjsKKworCS8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CisKKwlwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKwkvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorCXsKKwkJc3dpdGNoKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JFR19DTEFTUzoKKwkJCQlpZihwRWlkLT5MZW4gPiAwKQorCQkJCXsKKwkJCQkJKlJlZ0NsYXNzID0gKnBFaWQtPk9jdGV0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisKKwkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCX0KKworCXJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKk1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFVDSEFSICpwQnNzVHlwZSwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbiwKKwlPVVQgVUNIQVIgKnBTY2FuVHlwZSkKK3sKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKKworCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKKwkqcEJzc1R5cGUgPSBJbmZvLT5Cc3NUeXBlOworCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKwkqcFNjYW5UeXBlID0gSW5mby0+U2NhblR5cGU7CisKKwlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQyB8fCAqcEJzc1R5cGUgPT0gQlNTX0FOWSkKKwkJJiYgKCpwU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRQorCQl8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkpKQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBCc3NUeXBlIG9yIFNjYW5UeXBlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVUNIQVIgQ2hhbm5lbFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBjaGFubmVsKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkgKyspCisgICAgeworICAgICAgICBpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyLAorICAgIE9VVCBVU0hPUlQgKnBBbGcsCisgICAgT1VUIFVTSE9SVCAqcFNlcSwKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIENIQVIgKnBDaGxnVGV4dCkKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIsICAgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBbGcsICAgICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwU2VxLCAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisgICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCisgICAgaWYgKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgfHwgKCpwQWxnID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICkKKyAgICB7CisgICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisgICAgeworICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqcFNlcSA9PSAyIHx8ICpwU2VxID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDaGxnVGV4dCwgJnBGcmFtZS0+T2N0ZXRbOF0sIENJUEhFUl9URVhUX0xFTik7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkciwKKyAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAorICAgIE9VVCBVU0hPUlQgKnBBbGcpCit7CisgICAgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gID0gKE1MTUVfQVVUSF9SRVFfU1RSVUNUICopTXNnOworICAgIENPUFlfTUFDX0FERFIocEFkZHIsIHBJbmZvLT5BZGRyKTsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsKKyAgICAqcEFsZyA9IHBJbmZvLT5BbGc7CisKKyAgICBpZiAoKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8KCpwQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgIHx8ICgqcEFsZyA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgIAkpICYmCisgICAgICAgICgoKnBBZGRyICYgMHgwMSkgPT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUF1dGhSZXFTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVTE9ORyAqcFRpbWVvdXQsCisgICAgT1VUIFVTSE9SVCAqcExpc3RlbkludHYpCit7CisgICAgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvID0gKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqKU1zZzsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQKKyAgICBDT1BZX01BQ19BRERSKHBBcEFkZHIsIHBJbmZvLT5BZGRyKTsgICAgICAgICAgICAgICAgICAgLy8gQVAgYWRkcmVzcworICAgICpwQ2FwYWJpbGl0eUluZm8gPSBwSW5mby0+Q2FwYWJpbGl0eUluZm87ICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSBpbmZvCisgICAgKnBMaXN0ZW5JbnR2ID0gcEluZm8tPkxpc3RlbkludHY7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2FuaXR5IGNoZWNrIE5ldHdvcmtUeXBlICgxMWIsIDExZyBvciAxMWEpCisKKwlBcmd1bWVudHM6CisJCXBCc3MgLSBQb2ludGVyIHRvIEJTUyB0YWJsZS4KKworCVJldHVybiBWYWx1ZToKKyAgICAgICAgTmRpczgwMl8xMURTIC4uLi4uLi4oMTFiKQorICAgICAgICBOZGlzODAyXzExT0ZETTI0Li4uLigxMWcpCisgICAgICAgIE5kaXM4MDJfMTFPRkRNNS4uLi4uKDExYSkKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCisgICAgSU4gUEJTU19FTlRSWSBwQnNzKQoreworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRQlOZXRXb3JrVHlwZTsKKwlVQ0hBUgkJCQkJCXJhdGUsIGk7CisKKwlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFEUzsKKworCWlmIChwQnNzLT5DaGFubmVsIDw9IDE0KQorCXsKKwkJLy8KKwkJLy8gRmlyc3QgY2hlY2sgc3VwcG9ydCBSYXRlLgorCQkvLworCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+U3VwUmF0ZUxlbjsgaSsrKQorCQl7CisJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKSB8fCAocmF0ZSA9PSAyMikpCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAorCQkJCS8vCisJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8KKwkJLy8gU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLgorCQkvLworCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykKKwkJCXsKKwkJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQorCQkJCXsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vCisJCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0CisJCQkJCS8vCisJCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE01OworCX0KKworICAgIGlmIChwQnNzLT5IdENhcGFiaWxpdHlMZW4gIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChOZXRXb3JrVHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNV9OOworICAgICAgICBlbHNlCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjRfTjsKKyAgICB9CisKKwlyZXR1cm4gTmV0V29ya1R5cGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgV1BBIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKKyAgICBJTiAJUFJUTVBfQURBUFRFUiAJCXBBZCwKKyAgICBJTiAJUEVBUE9MX1BBQ0tFVCAJCXBNc2csCisgICAgSU4gCVVMT05HIAkJCQlNc2dMZW4sCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4gCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnkpCit7CisJVUNIQVIJCQltaWNbTEVOX0tFWV9ERVNDX01JQ10sIGRpZ2VzdFs4MF0sIEtFWURBVEFbTUFYX0xFTl9PRl9SU05JRV07CisJQk9PTEVBTgkJCWJSZXBsYXlEaWZmID0gRkFMU0U7CisJQk9PTEVBTgkJCWJXUEEyID0gRkFMU0U7CisJS0VZX0lORk8JCUVhcG9sS2V5SW5mbzsKKwlVQ0hBUgkJCUdyb3VwS2V5SW5kZXggPSAwOworCisKKwlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKKwlOZGlzWmVyb01lbW9yeShkaWdlc3QsIHNpemVvZihkaWdlc3QpKTsKKwlOZGlzWmVyb01lbW9yeShLRVlEQVRBLCBzaXplb2YoS0VZREFUQSkpOworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgc2l6ZW9mKEVhcG9sS2V5SW5mbykpOworCisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmRWFwb2xLZXlJbmZvLCAoUFVDSEFSKSZwTXNnLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmRWFwb2xLZXlJbmZvKSk7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyID0gVFJVRTsKKworCS8vIDAuIENoZWNrIE1zZ1R5cGUKKwlpZiAoKE1zZ1R5cGUgPiBFQVBPTF9HUk9VUF9NU0dfMikgfHwgKE1zZ1R5cGUgPCBFQVBPTF9QQUlSX01TR18xKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZCglZCkhIFxuIiwgTXNnVHlwZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gMS4gUmVwbGF5IGNvdW50ZXIgY2hlY2sKKyAJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkJLy8gRm9yIHN1cHBsaWNhbnQKKyAgICB7CisgICAgCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyLgorCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJCVVDSEFSCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJCShSVE1QQ29tcGFyZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorICAgIAl7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisgICAgCX0KKyAJfQorCWVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLy8gRm9yIGF1dGhlbnRpY2F0b3IKKwl7CisJCS8vIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQKKyAgICAJaWYgKCFOZGlzRXF1YWxNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkpCisgICAgCXsKKwkJCWJSZXBsYXlEaWZmID0gVFJVRTsKKyAgICAJfQorCX0KKworCS8vIFJlcGxheSBDb3VudGVyIGRpZmZlcmVudCBjb25kaXRpb24KKwlpZiAoYlJlcGxheURpZmYpCisJeworCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudAorCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJeworICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJfQorCisJCWhleF9kdW1wKCJSZWNlaXZlIHJlcGxheSBjb3VudGVyICIsIHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWhleF9kdW1wKCJDdXJyZW50IHJlcGxheSBjb3VudGVyICIsIHBFbnRyeS0+Ul9Db3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKworCS8vIDIuIFZlcmlmeSBNSUMgZXhjZXB0IFBhaXJ3aXNlIE1zZzEKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJVUNIQVIJCQlyY3ZkX21pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKworCQkvLyBSZWNvcmQgdGhlIHJlY2VpdmVkIE1JQyBmb3IgY2hlY2sgbGF0ZXIKKwkJTmRpc01vdmVNZW1vcnkocmN2ZF9taWMsIHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisgICAgICAgIGlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQkvLyBUS0lQCisgICAgICAgIHsKKyAgICAgICAgICAgIGhtYWNfbWQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpcE1zZywgTXNnTGVuLCBtaWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCS8vIEFFUworICAgICAgICB7CisgICAgICAgICAgICBITUFDX1NIQTEoKFBVQ0hBUilwTXNnLCBNc2dMZW4sIHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIU5kaXNFcXVhbE1lbW9yeShyY3ZkX21pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKyAgICAgICAgeworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBNSUMgZGlmZmVyZW50CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKKworCQkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOworCQkJfQorCisJCQloZXhfZHVtcCgiUmVjZWl2ZWQgTUlDIiwgcmN2ZF9taWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJaGV4X2R1bXAoIkRlc2lyZWQgIE1JQyIsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJCXJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCX0KKworCS8vIEV4dHJhY3QgdGhlIGNvbnRleHQgb2YgdGhlIEtleSBEYXRhIGZpZWxkIGlmIGl0IGV4aXN0CisJLy8gVGhlIGZpZWxkIGluIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEExIGlzIHVuLWVuY3J5cHRlZC4KKwkvLyBUaGUgZmllbGQgaW4gZ3JvdXBfbXNnXzFfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTIgaXMgZW5jcnlwdGVkLgorCWlmIChwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPiAwKQorCXsKKwkJLy8gRGVjcnlwdCB0aGlzIGZpZWxkCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXsKKwkJCWlmKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJLy8gQUVTCisJCQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwRW50cnktPlBUS1sxNl0sIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnLT5LZXlEZXNjLktleURhdGEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlOVCAJaTsKKwkJCQlVQ0hBUiAgIEtleVszMl07CisJCQkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwRW50cnktPlBUS1sxNl0sIDE2KTsKKwkJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQkJfQorCisJCQlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJCQlHcm91cEtleUluZGV4ID0gRWFwb2xLZXlJbmZvLktleUluZGV4OworCisJCX0KKwkJZWxzZSBpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiAhYldQQTIpKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCXJldHVybiBUUlVFOworCQl9CisKKwkJLy8gUGFyc2UgS2V5IERhdGEgZmllbGQgdG8KKwkJLy8gMS4gdmVyaWZ5IFJTTiBJRSBmb3IgcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAscGFpcndpc2VfbXNnXzNfV1BBMShXUEEyKQorCQkvLyAyLiB2ZXJpZnkgS0RFIGZvcm1hdCBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMgorCQkvLyAzLiB1cGRhdGUgc2hhcmVkIGtleSBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMShXUEEyKQorCQlpZiAoIVJUTVBQYXJzZUVhcG9sS2V5RGF0YShwQWQsIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSwgR3JvdXBLZXlJbmRleCwgTXNnVHlwZSwgYldQQTIsIHBFbnRyeSkpCisJCXsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKKyAgICBPVVQgUFVTSE9SVCBwUmVhc29uKQoreworCU1MTUVfRExTX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gPSAoTUxNRV9ETFNfUkVRX1NUUlVDVCAqKU1zZzsKKworCSpwRExTID0gcEluZm8tPnBETFM7CisJKnBSZWFzb24gPSBwSW5mby0+UmVhc29uOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKwlPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCit7CisJQ0hBUiAgICAgICAgICAgICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKKworICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKKyAgICAqcENhcGFiaWxpdHlJbmZvCT0gMDsKKyAgICAqcERsc1RpbWVvdXQJPSAwOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERsc1RpbWVvdXQsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKwkvLyBDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkICsgREEgKyBTQSArIGNhcGFiaWxpdHkgKyBUaW1lb3V0CisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07CisKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKKwkJCQkJUmF0ZXNbMF0gPSAweDgyOworCQkJCQlSYXRlc1sxXSA9IDB4ODQ7CisJCQkJCVJhdGVzWzJdID0gMHg4YjsKKwkJCQkJUmF0ZXNbM10gPSAweDk2OworCQkJCQlSYXRlc1s0XSA9IDB4MTI7CisJCQkJCVJhdGVzWzVdID0gMHgyNDsKKwkJCQkJUmF0ZXNbNl0gPSAweDQ4OworCQkJCQlSYXRlc1s3XSA9IDB4NmM7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9IVF9DQVA6CisJCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSkKK3sKKyAgICBDSEFSICAgICAgICAgICAgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOworCVBFSURfU1RSVUNUICBlaWRfcHRyOworCisgICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQorICAgICpwU3RhdHVzCQk9IDA7CisgICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7CisJKnBIdENhcGFiaWxpdHlMZW4gPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisJLy8gZ2V0IHN0YXR1cyBjb2RlIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgREEgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworICAgIC8vIGdldCBTQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU0EsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisJaWYgKHBTdGF0dXMgPT0gMCkKKwl7CisJICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKwkgICAgUHRyICs9IDI7CisJfQorCisJLy8gQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCArIHN0YXR1cyBjb2RlICsgREEgKyBTQSArIGNhcGFiaWxpdHkKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKSAmRnItPk9jdGV0WzE4XTsKKworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFVDSEFSKilGciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKChlaWRfcHRyLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpICYmIChlaWRfcHRyLT5MZW4gPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFJhdGVzLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX1NVUFBfUkFURVMuLCBMZW49JWQuIFJhdGVzWzBdPSV4XG4iLGVpZF9wdHItPkxlbiwgUmF0ZXNbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmF0ZXNbMV09JXggJXggJXggJXggJXggJXggJXhcbiIsIFJhdGVzWzFdLCBSYXRlc1syXSwgUmF0ZXNbM10sIFJhdGVzWzRdLCBSYXRlc1s1XSwgUmF0ZXNbNl0sIFJhdGVzWzddKSk7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSA4OworCQkJCQlSYXRlc1swXSA9IDB4ODI7CisJCQkJCVJhdGVzWzFdID0gMHg4NDsKKwkJCQkJUmF0ZXNbMl0gPSAweDhiOworCQkJCQlSYXRlc1szXSA9IDB4OTY7CisJCQkJCVJhdGVzWzRdID0gMHgxMjsKKwkJCQkJUmF0ZXNbNV0gPSAweDI0OworCQkJCQlSYXRlc1s2XSA9IDB4NDg7CisJCQkJCVJhdGVzWzddID0gMHg2YzsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMuLCBMZW49JWRcbiIsZWlkX3B0ci0+TGVuKSk7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChlaWRfcHRyLT5MZW4gKyAqcFJhdGVzTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9ICgqcFJhdGVzTGVuKSArIGVpZF9wdHItPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgLSAoKnBSYXRlc0xlbikpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0hUX0NBUDoKKwkJCQlpZiAoZWlkX3B0ci0+TGVuID49IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIGVpZF9wdHItPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCisJCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKwkJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX0hUX0NBUFxuIikpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLmVpZF9wdHItPkxlbiA9ICVkXG4iLCBlaWRfcHRyLT5MZW4pKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKworCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyRGxzVGVhckRvd25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIENIQVIgICAgICAgICAgICAqUHRyOworICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCisgICAgKnBSZWFzb24JPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisgICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworCS8vIGdldCByZWFzb24gY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTQxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gMi40IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLgorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NJWkUJMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TSVpFCTEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkJCS8vIDEwLDExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU0laRQkyCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU1RBUlQJOQkJCS8vIDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU0laRQk0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzRfU1RBUlQJMTMJCQkvLyAxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NJWkUJMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NJWkUJMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TVEFSVAkyCQkJLy8gMyw0LDUsNiw3LDgsOQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl82X1NJWkUJNworI2RlZmluZQlCR19CQU5EX1JFR0lPTl83X1NUQVJUCTQJCQkvLyA1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TSVpFCTkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NJWkUJMTQKKworLy8gNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KK1VDSEFSIEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjF9OworVUNIQVIgQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OH07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjF9OworCisvL0JhU2l6ZUFycmF5IGZvbGxvd3MgdGhlIDgwMi4xMW4gZGVmaW5pdGlvbiBhcyBNYXhSeEZhY3Rvci4gIDJeKDEzK2ZhY3RvcikgYnl0ZXMuIFdoZW4gZmFjdG9yID0wLCBpdCdzIGFib3V0IEJhIGJ1ZmZlciBzaXplID04LgorVUNIQVIgQmFTaXplQXJyYXlbNF0gPSB7OCwxNiwzMiw2NH07CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVXBkYXRlIFN0YUNmZy0+Q2hhbm5lbExpc3RbXSBhY2NvcmRpbmcgdG8gMSkgQ291bnRyeSBSZWdpb24gMikgUkYgSUMgdHlwZSwKKwkJYW5kIDMpIFBIWS1tb2RlIHVzZXIgc2VsZWN0ZWQuCisJCVRoZSBvdXRjb21lIGlzIHVzZWQgYnkgZHJpdmVyIHdoZW4gZG9pbmcgc2l0ZSBzdXJ2ZXkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCdWlsZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIGksIGosIGluZGV4PTAsIG51bT0wOworCVBVQ0hBUglwQ2hhbm5lbExpc3QgPSBOVUxMOworCisJTmRpc1plcm9NZW1vcnkocEFkLT5DaGFubmVsTGlzdCwgTUFYX05VTV9PRl9DSEFOTkVMUyAqIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7CisKKwkvLyBpZiBub3QgMTFhLW9ubHkgbW9kZSwgY2hhbm5lbCBsaXN0IHN0YXJ0cyBmcm9tIDIuNEdoeiBiYW5kCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUEpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCSYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUFOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFOXzVHKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCSkKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAgJiAweDdmKQorCQl7CisJCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8vIDEgLTExCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzBfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8wX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzBfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8xX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzFfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLy8gMTAgLSAxMQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8yX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMl9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8yX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8vIDEwIC0gMTMKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fM19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzNfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fM19TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl80X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNF9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl80X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8vIDEgLSAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl81X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl81X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8vIDMgLSA5CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzZfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl82X1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzZfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl83X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fN19TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl83X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zMV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zMV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zMV9TSVpFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgICAvLyBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJCWJyZWFrOworCQl9CisJCWZvciAoaT0wOyBpPGluZGV4OyBpKyspCisJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyID0gMjA7CisJfQorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4N2YpCisJCXsKKwkJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMl9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl80X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl83X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fOF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzExX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bSAhPSAwKQorCQl7CisJCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKKwkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCQkJeworCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKKwkJCQl7CisJCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKKwkJCQkJfQorCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCisJCQkJeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCisJCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7CisJCQkJfQorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uTWF4VHhQd3IgPSAyMDsKKwkJCX0KKwkJCWluZGV4ICs9IG51bTsKKwkJfQorCX0KKworCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBpbmRleDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24sIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwgcEFkLT5SZkljVHlwZSwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOworI2lmZGVmIERCRworCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7CisJfQorI2VuZGlmCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybiB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBjb3VudHJ5CisJCWNvZGUgc2VsZWN0aW9uIGFuZCBSRiBJQyBzZWxlY3Rpb24gKHNpZ25hbCBiYW5kIG9yIGR1YWwgYmFuZCkuIEl0IGlzIGNhbGxlZAorCQl3aGVuZXZlciBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCisJUmV0dXJuOgorCQljaCAtIHRoZSBmaXJzdCBjaGFubmVsIG51bWJlciBvZiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgRmlyc3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG5leHQgY2hhbm5lbCBudW1iZXIuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQKKwkJZHVyaW5nIGRyaXZlciBuZWVkIHRvIHN0YXJ0IGEgc2l0ZSBzdXJ2ZXkgb2YgYWxsIHN1cHBvcnRlZCBjaGFubmVscy4KKwlSZXR1cm46CisJCW5leHRfY2hhbm5lbCAtIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyIHZhbGlkIGluIGN1cnJlbnQgY291bnRyeSBjb2RlIHNldHRpbmcuCisJTm90ZToKKwkJcmV0dXJuIDAgaWYgbm8gbW9yZSBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitVQ0hBUiBOZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQoreworCWludCBpOworCVVDSEFSIG5leHRfY2hhbm5lbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQorCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCXsKKwkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSsxXS5DaGFubmVsOworCQkJYnJlYWs7CisJfQorCXJldHVybiBuZXh0X2NoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGZvciBDaXNjbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMgMi5YCisJCVNwZWMzMS4gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwlSZXR1cm46CisJCU5vbmUKKwlOb3RlOgorCSAgIFJlcXVpcmVkIGJ5IEFpcm9uZXQgZEJtKG1XKQorCQkgICAwZEJtKDFtVyksICAgMWRCbSg1bVcpLCAxM2RCbSgyMG1XKSwgMTVkQm0oMzBtVyksCisJCSAgMTdkQm0oNTBtdyksIDIwZEJtKDEwMG1XKQorCisJICAgV2Ugc3VwcG9ydGVkCisJCSAgIDNkQm0oTG93ZXN0KSwgNmRCbSgxMCUpLCA5ZEJtKDI1JSksIDEyZEJtKDUwJSksCisJCSAgMTRkQm0oNzUlKSwgICAxNWRCbSgxMDAlKQorCisJCVRoZSBjbGllbnQgc3RhdGlvbidzIGFjdHVhbCB0cmFuc21pdCBwb3dlciBzaGFsbCBiZSB3aXRoaW4gKy8tIDVkQiBvZgorCQl0aGUgbWluaW11bSB2YWx1ZSBvciBuZXh0IGxvd2VyIHZhbHVlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKK3sKKwkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KKwkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgorCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPT0gMHhGRikKKwkJcmV0dXJuOworCisJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDYpIC8vVXNlZCBMb3dlc3QgUG93ZXIgUGVyY2VudGFnZS4KKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA2OworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDkpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTIpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMjU7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTUpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNzU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwMDsgLy9lbHNlIHVzZWQgbWF4aW11bQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKK30KKworQ0hBUglDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCQlSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOworICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKyAgICB7CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKyAgICB9CisKKyAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5OZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVTSE9SVCAgICAgICAgICBTdGF0dXM7CisJUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkmJiAoSU5GUkFfT04ocEFkKQorCQkJCXx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisJCWVsc2UKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLworCQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCisJCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KKwkJCS8vIE5vdywgd2UgbmVlZCB0byBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKKwkJCS8vCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKKwkJCXsKKwkJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKKwkJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXsKKwkJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CisJCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCisJCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lXG4iKSk7CisJCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCisJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCX0KKwllbHNlCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCS8vIEJCUCBhbmQgUkYgYXJlIG5vdCBhY2Nlc3NpYmxlIGluIFBTIG1vZGUsIHdlIGhhcyB0byB3YWtlIHRoZW0gdXAgZmlyc3QKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKworCQkJLy8gbGVhdmUgUFNNIGR1cmluZyBzY2FubmluZy4gb3RoZXJ3aXNlIHdlIG1heSBsb3N0IFByb2JlUnNwICYgQkVBQ09OCisJCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQorCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIFRSVUUpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCisJCQl7CisJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKKwkJCQl7CisJCQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOworCQkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKKwkJCQl9CisJCQl9CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQkJLy8gY2FycmllciBkZXRlY3Rpb24KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorCQkJeworCQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOworCQkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBNSU5fQ0hBTk5FTF9USU1FOworCQkJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwkJfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJLy9HbG9iYWwgY291bnRyeSBkb21haW4oY2gxLTExOmFjdGl2ZSBzY2FuLCBjaDEyLTE0IHBhc3NpdmUgc2NhbikKKwkJaWYgKChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID49IDEyKSAmJiAoKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDdmKSA9PSBSRUdJT05fMzFfQkdfQkFORCkpCisJCXsKKwkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOworCQl9CisKKwkJLy8gV2UgbmVlZCB0byBzaG9ydGVuIGFjdGl2ZSBzY2FuIHRpbWUgaW4gb3JkZXIgZm9yIFdaQyBjb25uZWN0IGlzc3VlCisJCS8vIENobmFnZSB0aGUgY2hhbm5lbCBzY2FuIHRpbWUgZm9yIENJU0NPIHN0dWZmIGJhc2VkIG9uIGl0cyBJQVBQIGFubm91bmNlbWVudAorCQlpZiAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKKwkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgRkFTVF9BQ1RJVkVfU0NBTl9USU1FKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJZWxzZSBpZiAoKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fAorCQkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lIDwgMjUpCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAqIDIpOworCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWVsc2UgLy8gbXVzdCBiZSBTQ0FOX1BBU1NJVkUgb3IgU0NBTl9BQ1RJVkUKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCQl7CisJCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgU2NhblRpbWVJbjVnQ2hhbm5lbCk7CisJCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUlOX0NIQU5ORUxfVElNRSk7CisJCQl9CisJCQllbHNlCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNQVhfQ0hBTk5FTF9USU1FKTsKKwkJfQorCisJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKSB8fAorCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSkKKwkJeworCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFNjYW5OZXh0Q2hhbm5lbCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCQkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgaWYgYWN0aXZlIHNjYW4gaXMgaW4gZWZmZWN0LgorCQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkgfHwgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCisJCQkJKQorCQkJCVNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKKwkJCWVsc2UKKwkJCQlTc2lkTGVuID0gMDsKKworCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkhkcjgwMjExLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZExlbiwKKwkJCQkJCQkgIFNzaWRMZW4sCQkJICAgICAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLCAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4pCisJCQl7CisJCQkJVUxPTkcgVG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXA7CisJCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJVUxPTkcJVG1wOworCQkJCVVDSEFSCUh0TGVuOworCQkJCVVDSEFSCUJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisJCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkKKwkJCQl7CisJCQkJCUh0TGVuID0gcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiArIDQ7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW47CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCQkJCX0KKwkJCQlGcmFtZUxlbiArPSBUbXA7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5iMjA0MENvZXhpc3RTY2FuU3VwID09IDEpCisJCQkJeworCQkJCQlVTE9ORwkJVG1wOworCQkJCQlIdExlbiA9IDE7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJICAxLAkJCQkJJkV4dEh0Q2FwSWUsCisJCQkJCQkJCQkgIDEsCQkJCQkmSHRMZW4sCisJCQkJCQkJCQkgIDEsICAgICAgICAgIAkJCSZwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkLAorCQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQl9CisKKwkJLy8gRm9yIFNDQU5fQ0lTQ09fUEFTU0lWRSwgZG8gbm90aGluZyBhbmQgc2lsZW50bHkgd2FpdCBmb3IgYmVhY29uIG9yIG90aGVyIHByb2JlIHJlcG9uc2UKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNDQU5fTElTVEVOOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJfQorfQorCitWT0lEIE1ndFByb2JSZXFNYWNIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisJSU4gVUNIQVIgU3ViVHlwZSwKKwlJTiBVQ0hBUiBUb0RzLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBCc3NpZCkKK3sKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisKKwlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOworCXBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFN1YlR5cGU7CisJaWYgKFN1YlR5cGUgPT0gU1VCVFlQRV9BQ0spCisJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7CisJcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzMzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKQEAgLTAsMCArMSwxNjA2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXdwYS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKKwlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50CisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorLy8gV1BBIE9VSQorVUNIQVIJCU9VSV9XUEFfTk9ORV9BS01bNF0JCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDB9OworVUNIQVIgICAgICAgT1VJX1dQQV9WRVJTSU9OWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBX1RLSVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDJ9OworVUNIQVIgICAgICAgT1VJX1dQQV9DQ01QWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA0fTsKK1VDSEFSICAgICAgIE9VSV9XUEFfODAyMVhfQUtNWzRdCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9QU0tfQUtNWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07CisvLyBXUEEyIE9VSQorVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQNDBbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1RLSVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OworVUNIQVIgICAgICAgT1VJX1dQQTJfQ0NNUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH07CitVQ0hBUiAgICAgICBPVUlfV1BBMl84MDIxWF9BS01bNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn07CisvLyBNU0EgT1VJCitVQ0hBUiAgIAlPVUlfTVNBXzgwMjFYX0FLTVs0XSAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA1fTsJCS8vIE5vdCB5ZXQgZmluYWwgLSBJRUVFIDgwMi4xMXMtRDEuMDYKK1VDSEFSICAgCU9VSV9NU0FfUFNLX0FLTVs0XSAgIAk9IHsweDAwLCAweDBGLCAweEFDLCAweDA2fTsJCS8vIE5vdCB5ZXQgZmluYWwgLSBJRUVFIDgwMi4xMXMtRDEuMDYKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoZSBwc2V1ZG8tcmFuZG9tIGZ1bmN0aW9uKFBSRikgdGhhdCBoYXNoZXMgdmFyaW91cyBpbnB1dHMgdG8KKwkJZGVyaXZlIGEgcHNldWRvLXJhbmRvbSB2YWx1ZS4gVG8gYWRkIGxpdmVuZXNzIHRvIHRoZSBwc2V1ZG8tcmFuZG9tCisJCXZhbHVlLCBhIG5vbmNlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGlucHV0cy4KKworCQlJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIFBUSywgR1RLIG9yIHNvbWUgc3BlY2lmaWMgcmFuZG9tIHZhbHVlLgorCisJQXJndW1lbnRzOgorCQlVQ0hBUgkqa2V5LAkJLQl0aGUga2V5IG1hdGVyaWFsIGZvciBITUFDX1NIQTEgdXNlCisJCUlOVAkJa2V5X2xlbgkJLQl0aGUgbGVuZ3RoIG9mIGtleQorCQlVQ0hBUgkqcHJlZml4CQktCWEgcHJlZml4IGxhYmVsCisJCUlOVAkJcHJlZml4X2xlbgktCXRoZSBsZW5ndGggb2YgdGhlIGxhYmVsCisJCVVDSEFSCSpkYXRhCQktCWEgc3BlY2lmaWMgZGF0YSB3aXRoIHZhcmlhYmxlIGxlbmd0aAorCQlJTlQJCWRhdGFfbGVuCS0JdGhlIGxlbmd0aCBvZiBhIHNwZWNpZmljIGRhdGEKKwkJSU5UCQlsZW4JCQktCXRoZSBvdXRwdXQgbGVuZ2h0CisKKwlSZXR1cm4gVmFsdWU6CisJCVVDSEFSCSpvdXRwdXQJCS0JdGhlIGNhbGN1bGF0ZWQgcmVzdWx0CisKKwlOb3RlOgorCQk4MDIuMTFpLTIwMDQJQW5uZXggSC4zCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVBSRigKKwlJTglVQ0hBUgkqa2V5LAorCUlOCUlOVAkJa2V5X2xlbiwKKwlJTglVQ0hBUgkqcHJlZml4LAorCUlOCUlOVAkJcHJlZml4X2xlbiwKKwlJTglVQ0hBUgkqZGF0YSwKKwlJTglJTlQJCWRhdGFfbGVuLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCUlOVAkJbGVuKQoreworCUlOVAkJaTsKKyAgICBVQ0hBUiAgICppbnB1dDsKKwlJTlQJCWN1cnJlbnRpbmRleCA9IDA7CisJSU5UCQl0b3RhbF9sZW47CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIGlucHV0CisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmaW5wdXQsIDEwMjQpOworCisgICAgaWYgKGlucHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFQUkY6IG5vIG1lbW9yeSEhIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisJLy8gR2VuZXJhdGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCU5kaXNNb3ZlTWVtb3J5KGlucHV0LCBwcmVmaXgsIHByZWZpeF9sZW4pOworCisJLy8gQ29uY2F0ZW5hdGUgYSBzaW5nbGUgb2N0ZXQgY29udGFpbmluZyAwCisJaW5wdXRbcHJlZml4X2xlbl0gPQkwOworCisJLy8gQ29uY2F0ZW5hdGUgc3BlY2lmaWMgZGF0YQorCU5kaXNNb3ZlTWVtb3J5KCZpbnB1dFtwcmVmaXhfbGVuICsgMV0sIGRhdGEsIGRhdGFfbGVuKTsKKwl0b3RhbF9sZW4gPQlwcmVmaXhfbGVuICsgMSArIGRhdGFfbGVuOworCisJLy8gQ29uY2F0ZW5hdGUgYSBzaW5nbGUgb2N0ZXQgY29udGFpbmluZyAwCisJLy8gVGhpcyBvY3RldCBzaGFsbCBiZSB1cGRhdGUgbGF0ZXIKKwlpbnB1dFt0b3RhbF9sZW5dID0gMDsKKwl0b3RhbF9sZW4rKzsKKworCS8vIEl0ZXJhdGUgdG8gY2FsY3VsYXRlIHRoZSByZXN1bHQgYnkgaG1hYy1zaGEtMQorCS8vIFRoZW4gY29uY2F0ZW5hdGUgdG8gbGFzdCByZXN1bHQKKwlmb3IJKGkgPSAwOwlpIDwJKGxlbiArIDE5KSAvIDIwOyBpKyspCisJeworCQlITUFDX1NIQTEoaW5wdXQsIHRvdGFsX2xlbiwJa2V5LCBrZXlfbGVuLCAmb3V0cHV0W2N1cnJlbnRpbmRleF0pOworCQljdXJyZW50aW5kZXggKz0JMjA7CisKKwkJLy8gdXBkYXRlIHRoZSBsYXN0IG9jdGV0CisJCWlucHV0W3RvdGFsX2xlbiAtIDFdKys7CisJfQorICAgIG9zX2ZyZWVfbWVtKE5VTEwsIGlucHV0KTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUl0IHV0aWxpemVzIFBSRi0zODQgb3IgUFJGLTUxMiB0byBkZXJpdmUgc2Vzc2lvbi1zcGVjaWZpYyBrZXlzIGZyb20gYSBQTUsuCisJCUl0IHNoYWxsIGJlIGNhbGxlZCBieSA0LXdheSBoYW5kc2hha2UgcHJvY2Vzc2luZy4KKworCUFyZ3VtZW50czoKKwkJcEFkIAktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJUE1LCQktCXBvaW50ZXIgdG8gUE1LCisJCUFOb25jZQktCXBvaW50ZXIgdG8gQU5vbmNlCisJCUFBCQktCXBvaW50ZXIgdG8gQXV0aGVudGljYXRvciBBZGRyZXNzCisJCVNOb25jZQktCXBvaW50ZXIgdG8gU05vbmNlCisJCVNBCQktCXBvaW50ZXIgdG8gU3VwcGxpY2FudCBBZGRyZXNzCisJCWxlbgkJLQlpbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIFBUSyAob2N0ZXQpCisKKwlSZXR1cm4gVmFsdWU6CisJCU91dHB1dAkJcG9pbnRlciB0byB0aGUgUFRLCisKKwlOb3RlOgorCQlSZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCA4LjUuMS4yCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFdwYUNvdW50UFRLKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCSpQTUssCisJSU4JVUNIQVIJKkFOb25jZSwKKwlJTglVQ0hBUgkqQUEsCisJSU4JVUNIQVIJKlNOb25jZSwKKwlJTglVQ0hBUgkqU0EsCisJT1VUCVVDSEFSCSpvdXRwdXQsCisJSU4JVUlOVAlsZW4pCit7CisJVUNIQVIJY29uY2F0ZW5hdGlvbls3Nl07CisJVUlOVAlDdXJyUG9zID0gMDsKKwlVQ0hBUgl0ZW1wWzMyXTsKKwlVQ0hBUglQcmVmaXhbXSA9IHsnUCcsICdhJywgJ2knLCAncicsICd3JywgJ2knLCAncycsICdlJywgJyAnLCAnaycsICdlJywgJ3knLCAnICcsCisJCQkJCQknZScsICd4JywgJ3AnLCAnYScsICduJywgJ3MnLCAnaScsICdvJywgJ24nfTsKKworCS8vIGluaXRpYXRlIHRoZSBjb25jYXRlbmF0aW9uIGlucHV0CisJTmRpc1plcm9NZW1vcnkodGVtcCwgc2l6ZW9mKHRlbXApKTsKKwlOZGlzWmVyb01lbW9yeShjb25jYXRlbmF0aW9uLCA3Nik7CisKKwkvLyBHZXQgc21hbGxlciBhZGRyZXNzCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KFNBLCBBQSwgNikgPT0gMSkKKwkJTmRpc01vdmVNZW1vcnkoY29uY2F0ZW5hdGlvbiwgQUEsIDYpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoY29uY2F0ZW5hdGlvbiwgU0EsIDYpOworCUN1cnJQb3MgKz0gNjsKKworCS8vIEdldCBsYXJnZXIgYWRkcmVzcworCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTQSwgNik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQUEsIDYpOworCisJLy8gc3RvcmUgdGhlIGxhcmdlciBtYWMgYWRkcmVzcyBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBvZgorCS8vIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJTmRpc01vdmVNZW1vcnkodGVtcCwgJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIE1BQ19BRERSX0xFTik7CisJQ3VyclBvcyArPSA2OworCisJLy8gR2V0IHNtYWxsZXIgTm9uY2UKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKKwlDdXJyUG9zICs9IDMyOworCisJLy8gR2V0IGxhcmdlciBOb25jZQorCWlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDApCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8vIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCWVsc2UgaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMSkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFOb25jZSwgMzIpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIFNOb25jZSwgMzIpOworCUN1cnJQb3MgKz0gMzI7CisKKwloZXhfZHVtcCgiY29uY2F0ZW5hdGlvbj0iLCBjb25jYXRlbmF0aW9uLCA3Nik7CisKKwkvLyBVc2UgUFJGIHRvIGdlbmVyYXRlIFBUSworCVBSRihQTUssIExFTl9NQVNURVJfS0VZLCBQcmVmaXgsIDIyLCBjb25jYXRlbmF0aW9uLCA3Niwgb3V0cHV0LCBsZW4pOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlHZW5lcmF0ZSByYW5kb20gbnVtYmVyIGJ5IHNvZnR3YXJlLgorCisJQXJndW1lbnRzOgorCQlwQWQJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorCQltYWNBZGRyCS0JcG9pbnRlciB0byBsb2NhbCBNQUMgYWRkcmVzcworCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKwkJODAyLjFpaS0yMDA0ICBBbm5leCBILjUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJR2VuUmFuZG9tKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJKm1hY0FkZHIsCisJT1VUCVVDSEFSCQkJKnJhbmRvbSkKK3sKKwlJTlQJCWksIGN1cnI7CisJVUNIQVIJbG9jYWxbODBdLCBLZXlDb3VudGVyWzMyXTsKKwlVQ0hBUglyZXN1bHRbODBdOworCVVMT05HCUN1cnJlbnRUaW1lOworCVVDSEFSCXByZWZpeFtdID0geydJJywgJ24nLCAnaScsICd0JywgJyAnLCAnQycsICdvJywgJ3UnLCAnbicsICd0JywgJ2UnLCAncid9OworCisJLy8gWmVybyB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbgorCU5kaXNaZXJvTWVtb3J5KHJlc3VsdCwgODApOworCU5kaXNaZXJvTWVtb3J5KGxvY2FsLCA4MCk7CisJTmRpc1plcm9NZW1vcnkoS2V5Q291bnRlciwgMzIpOworCisJZm9yCShpID0gMDsJaSA8CTMyOwlpKyspCisJeworCQkvLyBjb3B5IHRoZSBsb2NhbCBNQUMgYWRkcmVzcworCQlDT1BZX01BQ19BRERSKGxvY2FsLCBtYWNBZGRyKTsKKwkJY3VyciA9CU1BQ19BRERSX0xFTjsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGUgY3VycmVudCB0aW1lCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJkN1cnJlbnRUaW1lKTsKKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgJkN1cnJlbnRUaW1lLAlzaXplb2YoQ3VycmVudFRpbWUpKTsKKwkJY3VyciArPQlzaXplb2YoQ3VycmVudFRpbWUpOworCisJCS8vIGNvbmNhdGVuYXRlIHRoZSBsYXN0IHJlc3VsdAorCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICByZXN1bHQsIDMyKTsKKwkJY3VyciArPQkzMjsKKworCQkvLyBjb25jYXRlbmF0ZSBhIHZhcmlhYmxlCisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZpLCAgMik7CisJCWN1cnIgKz0JMjsKKworCQkvLyBjYWxjdWxhdGUgdGhlIHJlc3VsdAorCQlQUkYoS2V5Q291bnRlciwgMzIsIHByZWZpeCwxMiwgbG9jYWwsIGN1cnIsIHJlc3VsdCwgMzIpOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KHJhbmRvbSwgcmVzdWx0LAkzMik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBjaXBoZXIgc3VpdGUgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorICAgIAlXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisJCWJNaXhDaXBoZXIJLQlhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGNpcGhlciBhbmQgZ3JvdXAKKwkJCQkJCWNpcGhlciBhcmUgdGhlIHNhbWUgb3Igbm90CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2lwaGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVJTlQJCQlXZXBTdGF0dXMsCisJSU4JQk9PTEVBTgkJCWJNaXhDaXBoZXIsCisJSU4JVUNIQVIJCQlGbGV4aWJsZUNpcGhlciwKKwlPVVQJUFVDSEFSCQkJcFJzbkllLAorCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQoreworCVVDSEFSCVBhaXJ3aXNlQ250OworCisJKnJzbl9sZW4gPSAwOworCisJLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQorCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQorCXsKKwkJUlNOSUUyCSpwUnNuaWVfY2lwaGVyID0gKFJTTklFMiopcFJzbkllOworCisJCS8vIEFzc2lnbiB0aGUgdmVyc29uIGFzIDEKKwkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CisKKyAgICAgICAgc3dpdGNoIChXZXBTdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgCS8vIFRLSVAgbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gQUVTIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCQlpZiAoYk1peENpcGhlcikKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOworCQkJCWVsc2UKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX0NDTVAsIDQpOworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQkvLyBUS0lQLUFFUyBtaXggbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKworCQkJCVBhaXJ3aXNlQ250ID0gMTsKKwkJCQkvLyBJbnNlcnQgV1BBMiBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCisJCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQkJeworICAgICAgICAgICAgICAgIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkJCQlQYWlyd2lzZUNudCA9IDI7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9DQ01QLCA0KTsKKwkJCQl9CisKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpICsgKDQgKiAoUGFpcndpc2VDbnQgLSAxKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCQkvLyBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKKwkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKKwl9CisJZWxzZQorCXsKKwkJUlNOSUUJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uCisJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm91aSwgT1VJX1dQQV9WRVJTSU9OLCA0KTsKKyAgICAgICAgcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CisKKwkJc3dpdGNoIChXZXBTdGF0dXMpCisJCXsKKwkJCS8vIFRLSVAgbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gQUVTIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCQlpZiAoYk1peENpcGhlcikKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJZWxzZQorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQSBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJeworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCisJCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCQl7CisgICAgICAgICAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWkgKyA0LCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCX0KKworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7CisJICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBBS00gc3VpdGUgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorICAgIAlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCisJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVk9JRCBSVE1QSW5zZXJ0UnNuSWVBS00oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlFbGVtZW50SUQsCisJSU4JVUlOVAkJCUF1dGhNb2RlLAorCUlOCVVDSEFSCQkJYXBpZHgsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlSU05JRV9BVVRICQkqcFJzbmllX2F1dGg7CisKKwlwUnNuaWVfYXV0aCA9IChSU05JRV9BVVRIKikocFJzbkllICsgKCpyc25fbGVuKSk7CisKKwkvLyBkZWNpZGUgV1BBMiBvciBXUEExCisJaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpCisJeworCQlzd2l0Y2ggKEF1dGhNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyXzgwMjFYX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisgICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQTJfUFNLX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwl9CisJZWxzZQorCXsKKwkJc3dpdGNoIChBdXRoTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV84MDIxWF9BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzoKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisgICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBX1BTS19BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU6CisgICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBX05PTkVfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCX0KKworCXBSc25pZV9hdXRoLT5hY291bnQgPSBjcHUybGUxNihwUnNuaWVfYXV0aC0+YWNvdW50KTsKKworCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTklFX0FVVEgpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgY2FwYWJpbGl0eSBpbiBSU04tSUUuCisJCUl0IG9ubHkgc2hhbGwgYmUgY2FsbGVkIGJ5IFJUTVBNYWtlUlNOSUUuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCisJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVk9JRCBSVE1QSW5zZXJ0UnNuSWVDYXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlFbGVtZW50SUQsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlPVVQJUFVDSEFSCQkJcFJzbkllLAorCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQoreworCVJTTl9DQVBBQklMSVRJRVMgICAgKnBSU05fQ2FwOworCisJLy8gaXQgY291bGQgYmUgaWdub3JlZCBpbiBXUEExIG1vZGUKKwlpZiAoRWxlbWVudElEID09IFdwYUllKQorCQlyZXR1cm47CisKKwlwUlNOX0NhcCA9IChSU05fQ0FQQUJJTElUSUVTKikocFJzbkllICsgKCpyc25fbGVuKSk7CisKKworCXBSU05fQ2FwLT53b3JkID0gY3B1MmxlMTYocFJTTl9DYXAtPndvcmQpOworCisJKCpyc25fbGVuKSArPSBzaXplb2YoUlNOX0NBUEFCSUxJVElFUyk7CS8vIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aAorCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIFJTTiBJRSBjb250ZXh0LiBJdCBpcyBub3QgaW5jbHVkZWQgZWxlbWVudC1JRCBhbmQgbGVuZ3RoLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorICAgIAlXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBNYWtlUlNOSUUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBBdXRoTW9kZSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIFdlcFN0YXR1cywKKwlJTglVQ0hBUgkJCWFwaWR4KQoreworCVBVQ0hBUgkJcFJzbkllID0gTlVMTDsJCQkvLyBwcmltYXJ5IFJTTklFCisJVUNIQVIgCQkqcnNuaWVsZW5fY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltYXJ5IFJTTklFCisJVUNIQVIJCSpyc25pZWxlbl9leF9jdXJfcCA9IDA7CS8vIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZGFyeSBSU05JRQorCVVDSEFSCQlQcmltYXJ5UnNuaWU7CisJQk9PTEVBTgkJYk1peENpcGhlciA9IEZBTFNFOwkvLyBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgYW5kIGdyb3VwIGNpcGhlciBhcmUgZGlmZmVyZW50CisJVUNIQVIJCXBfb2Zmc2V0OworCVdQQV9NSVhfUEFJUl9DSVBIRVIJCUZsZXhpYmxlQ2lwaGVyID0gTUlYX0NJUEhFUl9OT1RVU0U7CS8vIGl0IHByb3ZpZGUgdGhlIG1vcmUgZmxleGlibGUgY2lwaGVyIGNvbWJpbmF0aW9uIGluIFdQQS1XUEEyIGFuZCBUS0lQQUVTIG1vZGUKKworCXJzbmllbGVuX2N1cl9wID0gTlVMTDsKKwlyc25pZWxlbl9leF9jdXJfcCA9IE5VTEw7CisKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisJCQl7CisJCQkJaWYgKEF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJeworCQkJCS8vIFN1cHBvcnQgV1BBUFNLIG9yIFdQQTJQU0sgaW4gU1RBLUluZnJhIG1vZGUKKwkJCQkvLyBTdXBwb3J0IFdQQU5vbmUgaW4gU1RBLUFkaG9jIG1vZGUKKwkJCQlpZiAoKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkJKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT4gUlRNUE1ha2VSU05JRShTVEEpXG4iKSk7CisKKwkJCS8vIFplcm8gUlNOSUUgY29udGV4dAorCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisKKwkJCS8vIFBvaW50ZXIgdG8gUlNOSUUKKwkJCXJzbmllbGVuX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwkJCXBSc25JZSA9IHBBZC0+U3RhQ2ZnLlJTTl9JRTsKKworCQkJYk1peENpcGhlciA9IHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXI7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBpbmRpY2F0ZSBwcmltYXJ5IFJTTklFIGFzIFdQQSBvciBXUEEyCisJaWYgKChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpIHx8CisJCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisJCVByaW1hcnlSc25pZSA9IFdwYUllOworCWVsc2UKKwkJUHJpbWFyeVJzbmllID0gV3BhMkllOworCisJeworCQkvLyBCdWlsZCB0aGUgcHJpbWFyeSBSU05JRQorCQkvLyAxLiBpbnNlcnQgY2lwaGVyIHN1aXRlCisJCVJUTVBJbnNlcnRSc25JZUNpcGhlcihwQWQsIFByaW1hcnlSc25pZSwgV2VwU3RhdHVzLCBiTWl4Q2lwaGVyLCBGbGV4aWJsZUNpcGhlciwgcFJzbkllLCAmcF9vZmZzZXQpOworCisJCS8vIDIuIGluc2VydCBBS00KKwkJUlRNUEluc2VydFJzbkllQUtNKHBBZCwgUHJpbWFyeVJzbmllLCBBdXRoTW9kZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKworCQkvLyAzLiBpbnNlcnQgY2FwYWJpbGl0eQorCQlSVE1QSW5zZXJ0UnNuSWVDYXAocEFkLCBQcmltYXJ5UnNuaWUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CisJfQorCisJLy8gNC4gdXBkYXRlIHRoZSBSU05JRSBsZW5ndGgKKwkqcnNuaWVsZW5fY3VyX3AgPSBwX29mZnNldDsKKworCWhleF9kdW1wKCJUaGUgcHJpbWFyeSBSU05JRSIsIHBSc25JZSwgKCpyc25pZWxlbl9jdXJfcCkpOworCisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQlDaGVjayB3aGV0aGVyIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAgZnJhbWUuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJcEVudHJ5CQkJLQlwb2ludGVyIHRvIGFjdGl2ZSBlbnRyeQorCQlwRGF0YQkJCS0JdGhlIHJlY2VpdmVkIGZyYW1lCisJCURhdGFCeXRlQ291bnQgCS0JdGhlIHJlY2VpdmVkIGZyYW1lJ3MgbGVuZ3RoCisJCUZyb21XaGljaEJTU0lECS0JaW5kaWNhdGUgdGhlIGludGVyZmFjZSBpbmRleAorCisgICAgUmV0dXJuOgorICAgICAgICAgVFJVRSAJCQktCVRoaXMgZnJhbWUgaXMgRUFQIGZyYW1lCisgICAgICAgICBGQUxTRSAJCQktCW90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBEYXRhLAorICAgIElOIFVMT05HICAgICAgICAgICAgRGF0YUJ5dGVDb3VudCwKKwlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVVMT05HCUJvZHlfbGVuOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCisKKyAgICBpZihEYXRhQnl0ZUNvdW50IDwgKExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKworCS8vIFNraXAgTExDIGhlYWRlcgorICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIHBEYXRhLCA2KSB8fAorICAgICAgICAvLyBDaXNjbyAxMjAwIEFQIG1heSBzZW5kIHBhY2tldCB3aXRoIFNOQVBfQlJJREdFX1RVTk5FTAorICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBwRGF0YSwgNikpCisgICAgeworICAgICAgICBwRGF0YSArPSA2OworICAgIH0KKwkvLyBTa2lwIDItYnl0ZXMgRUFQb0wgdHlwZQorICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoRUFQT0wsIHBEYXRhLCAyKSkKKyAgICB7CisgICAgICAgIHBEYXRhICs9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgc3dpdGNoICgqKHBEYXRhKzEpKQorICAgIHsKKyAgICAgICAgY2FzZSBFQVBQYWNrZXQ6CisJCQlCb2R5X2xlbiA9ICgqKHBEYXRhKzIpPDw4KSB8ICgqKHBEYXRhKzMpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQLVBhY2tldCBmcmFtZSwgVFlQRSA9IDAsIExlbmd0aCA9ICVsZFxuIiwgQm9keV9sZW4pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MU3RhcnQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MLVN0YXJ0IGZyYW1lLCBUWVBFID0gMSBcbiIpKTsKKwkJCWlmIChwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nICE9IEVBUE9MX1NUQVJUX0RJU0FCTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FuY2VsIHRoZSBFbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyBcbiIpKTsKKyAgICAgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsICZDYW5jZWxsZWQpOworICAgICAgICAgICAgICAgIHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUFQT0xMb2dvZmY6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MTG9nb2ZmIGZyYW1lLCBUWVBFID0gMiBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MS2V5OgorCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MLUtleSBmcmFtZSwgVFlQRSA9IDMsIExlbmd0aCA9ICVsZFxuIiwgQm9keV9sZW4pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MQVNGQWxlcnQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MQVNGQWxlcnQgZnJhbWUsIFRZUEUgPSA0IFxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBFTkNSWVBUIEFFUyBHVEsgYmVmb3JlIHNlbmRpbmcgaW4gRUFQT0wgZnJhbWUuCisgICAgICAgIEFFUyBHVEsgbGVuZ3RoID0gMTI4IGJpdCwgIHNvIGZpeCBibG9ja3MgZm9yIGFlcy1rZXktd3JhcCBhcyAyIGluIHRoaXMgZnVuY3Rpb24uCisgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0byBSRkMgMzM5NCBmb3IgYWVzIGtleSB3cmFwIGFsZ29yaXRobS4KKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFFU19HVEtfS0VZX1dSQVAoCisgICAgSU4gVUNIQVIgICAgKmtleSwKKyAgICBJTiBVQ0hBUiAgICAqcGxhaW50ZXh0LAorICAgIElOIFVDSEFSICAgIHBfbGVuLAorICAgIE9VVCBVQ0hBUiAgICpjaXBoZXJ0ZXh0KQoreworICAgIFVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworICAgIFVDSEFSICAgICAgIFJbNTEyXTsKKyAgICBJTlQgICAgICAgICBudW1fYmxvY2tzID0gcF9sZW4vODsgICAvLyB1bml0OjY0Yml0cworICAgIElOVCAgICAgICAgIGksIGo7CisgICAgYWVzX2NvbnRleHQgYWVzY3R4OworICAgIFVDSEFSICAgICAgIHhvcjsKKworICAgIHJ0bXBfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOworCisgICAgLy8gSW5pdCBJQQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIEFbaV0gPSAweGE2OworCisgICAgLy9JbnB1dCBwbGFpbnRleHQKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCisgICAgICAgICAgICBSWzggKiAoaSArIDEpICsgal0gPSBwbGFpbnRleHRbOCAqIGkgKyBqXTsKKyAgICB9CisKKyAgICAvLyBLZXkgTWl4CisgICAgZm9yIChqID0gMDsgaiA8IDY7IGorKykKKyAgICB7CisgICAgICAgIGZvcihpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcGhhc2UgMQorICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoQklOLCBBLCA4KTsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZCSU5bOF0sICZSWzggKiBpXSwgOCk7CisgICAgICAgICAgICBydG1wX2Flc19lbmNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7CisKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEEsICZCT1VUWzBdLCA4KTsKKyAgICAgICAgICAgIHhvciA9IG51bV9ibG9ja3MgKiBqICsgaTsKKyAgICAgICAgICAgIEFbN10gPSBCT1VUWzddIF4geG9yOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJbOCAqIGldLCAmQk9VVFs4XSwgOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdXRwdXQgY2lwaGVydGV4dAorICAgIE5kaXNNb3ZlTWVtb3J5KGNpcGhlcnRleHQsIEEsIDgpOworCisgICAgZm9yIChpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIGNpcGhlcnRleHRbOCAqIGkgKyBqXSA9IFJbOCAqIGkgKyBqXTsKKyAgICB9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCU1pc2MgZnVuY3Rpb24gdG8gZGVjcnlwdCBBRVMgYm9keQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKwkJVGhpcyBmdW5jdGlvbiByZWZlcmVuY2VzIHRvCVJGQwkzMzk0IGZvciBhZXMga2V5IHVud3JhcCBhbGdvcml0aG0uCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFFU19HVEtfS0VZX1VOV1JBUCgKKwlJTglVQ0hBUgkqa2V5LAorCU9VVAlVQ0hBUgkqcGxhaW50ZXh0LAorCUlOCVVDSEFSICAgIGNfbGVuLAorCUlOCVVDSEFSCSpjaXBoZXJ0ZXh0KQorCit7CisJVUNIQVIgICAgICAgQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07CisJVUNIQVIgICAgICAgeG9yOworCUlOVCAgICAgICAgIGksIGo7CisJYWVzX2NvbnRleHQgYWVzY3R4OworCVVDSEFSICAgICAgICpSOworCUlOVCAgICAgICAgIG51bV9ibG9ja3MgPSBjX2xlbi84OwkvLyB1bml0OjY0Yml0cworCisKKwlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZSLCA1MTIpOworCisJaWYgKFIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiEhIUFFU19HVEtfS0VZX1VOV1JBUDogbm8gbWVtb3J5ISEhXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9IC8qIEVuZCBvZiBpZiAqLworCisJLy8gSW5pdGlhbGl6ZQorCU5kaXNNb3ZlTWVtb3J5KEEsIGNpcGhlcnRleHQsIDgpOworCS8vSW5wdXQgcGxhaW50ZXh0CisJZm9yKGkgPSAwOyBpIDwgKGNfbGVuLTgpOyBpKyspCisJeworCQlSWyBpXSA9IGNpcGhlcnRleHRbaSArIDhdOworCX0KKworCXJ0bXBfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOworCisJZm9yKGogPSA1OyBqID49IDA7IGotLSkKKwl7CisJCWZvcihpID0gKG51bV9ibG9ja3MtMSk7IGkgPiAwOyBpLS0pCisJCXsKKwkJCXhvciA9IChudW1fYmxvY2tzIC0xICkqIGogKyBpOworCQkJTmRpc01vdmVNZW1vcnkoQklOLCBBLCA4KTsKKwkJCUJJTls3XSA9IEFbN10gXiB4b3I7CisJCQlOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUlsoaS0xKSo4XSwgOCk7CisJCQlydG1wX2Flc19kZWNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7CisJCQlOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmUlsoaS0xKSo4XSwgJkJPVVRbOF0sIDgpOworCQl9CisJfQorCisJLy8gT1VUUFVUCisJZm9yKGkgPSAwOyBpIDwgY19sZW47IGkrKykKKwl7CisJCXBsYWludGV4dFtpXSA9IFJbaV07CisJfQorCisKKwlvc19mcmVlX21lbShOVUxMLCBSKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQlSZXBvcnQgdGhlIEVBUCBtZXNzYWdlIHR5cGUKKworCUFyZ3VtZW50czoKKwkJbXNnCQktCUVBUE9MX1BBSVJfTVNHXzEKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMgorCQkJCQlFQVBPTF9QQUlSX01TR18zCisJCQkJCUVBUE9MX1BBSVJfTVNHXzQKKwkJCQkJRUFQT0xfR1JPVVBfTVNHXzEKKwkJCQkJRUFQT0xfR1JPVVBfTVNHXzIKKworICAgIFJldHVybjoKKyAgICAgICAgIG1lc3NhZ2UgdHlwZSBzdHJpbmcKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQ0hBUiAqR2V0RWFwb2xNc2dUeXBlKENIQVIgbXNnKQoreworICAgIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18xKQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMSI7CisgICAgZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMikKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDIiOworCWVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzMpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAzIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR180KQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgNCI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisgICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAxIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9HUk9VUF9NU0dfMikKKyAgICAgICAgcmV0dXJuICJHcm91cCBNZXNzYWdlIDIiOworICAgIGVsc2UKKyAgICAJcmV0dXJuICJJbnZhbGlkIE1lc3NhZ2UiOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIFNhbml0eSBSU04gSUUgb2YgRUFQb0wgbWVzc2FnZQorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KQoreworCVBVQ0hBUiAgICAgICAgICAgICAgcFZJRTsKKwlVQ0hBUiAgICAgICAgICAgICAgIGxlbjsKKwlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisJQk9PTEVBTgkJCQlyZXN1bHQgPSBGQUxTRTsKKworCXBWSUUgPSBwRGF0YTsKKwlsZW4JID0gRGF0YUxlbjsKKwkqT2Zmc2V0ID0gMDsKKworCXdoaWxlIChsZW4gPiBzaXplb2YoUlNOSUUyKSkKKwl7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCS8vIFdQQSBSU04gSUUKKwkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkpCisJCXsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pKSAmJgorCQkJCShwRW50cnktPlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQorCQkJeworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQkvLyBXUEEyIFJTTiBJRQorCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKKwkJeworCQkJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkgJiYKKwkJCQkocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKS8qIFRvRG8tQWxiZXJ0WSBmb3IgbWVzaCovKQorCQkJeworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCX0KKworCisJcmV0dXJuIHJlc3VsdDsKKworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFBhcnNlIEtFWURBVEEgZmllbGQuICBLRVlEQVRBW10gTWF5IGNvbnRhaW4gMiBSU04gSUUgYW5kIG9wdGlvbmFsbHkgR1RLLgorICAgIEdUSyAgaXMgZW5jYXB0dWxhdGVkIGluIEtERSBmb3JtYXQgYXQgIHAuODMgODAyLjExaSBEMTAKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworICAgIE5vdGU6CisgICAgICAgIDgwMi4xMWkgRDEwCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCUdyb3VwS2V5SW5kZXgsCisJSU4JVUNIQVIJCQlNc2dUeXBlLAorCUlOCUJPT0xFQU4JCQliV1BBMiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpCit7CisgICAgUEtERV9FTkNBUCAgICAgICAgICBwS0RFID0gTlVMTDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgIHBNeUtleURhdGEgPSBwS2V5RGF0YTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtleURhdGFMZW5ndGggPSBLZXlEYXRhTGVuOworICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLTEVOID0gMDsKKwlVQ0hBUgkJCQlEZWZhdWx0SWR4ID0gMDsKKwlVQ0hBUgkJCQlza2lwX29mZnNldDsKKworCS8vIFZlcmlmeSBUaGUgUlNOIElFIGNvbnRhaW5lZCBpbiBwYWlyZXdpc2VfbXNnXzIgJiYgcGFpcmV3aXNlX21zZ18zIGFuZCBza2lwIGl0CisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisgICAgeworCQkvLyBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sKKwkJaWYgKCFSVE1QQ2hlY2tSU05JRShwQWQsIHBLZXlEYXRhLCBLZXlEYXRhTGVuLCBwRW50cnksICZza2lwX29mZnNldCkpCisJCXsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgUlNOIElFIGRpZmZlcmVudAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKKworICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlNOX0lFIERpZmZlcmVudCBpbiBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOworCQkJaGV4X2R1bXAoIlJlY2VpdmUgUlNOX0lFICIsIHBLZXlEYXRhLCBLZXlEYXRhTGVuKTsKKwkJCWhleF9kdW1wKCJEZXNpcmVkIFJTTl9JRSAiLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pOworCisJCQlyZXR1cm4gRkFMU0U7CisgICAgCX0KKyAgICAJZWxzZQorCQl7CisJCQlpZiAoYldQQTIgJiYgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCS8vIHNraXAgUlNOIElFCisJCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKKwkJCQlLZXlEYXRhTGVuZ3RoIC09IHNraXBfb2Zmc2V0OworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgc2tpcF9vZmZzZXQpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFBhcnNlRWFwb2xLZXlEYXRhID09PiBLZXlEYXRhTGVuZ3RoICVkIHdpdGhvdXQgUlNOX0lFIFxuIiwgS2V5RGF0YUxlbmd0aCkpOworCisJLy8gUGFyc2UgRUtEIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2dfM19XUEEyICYmIGdyb3VwX21zZ18xX1dQQTIKKwlpZiAoYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwl7CisJCWlmIChLZXlEYXRhTGVuZ3RoID49IDgpCS8vIEtERSBmb3JtYXQgZXhjbHVkZSBHVEsgbGVuZ3RoCisgICAgCXsKKyAgICAgICAgCXBLREUgPSAoUEtERV9FTkNBUCkgcE15S2V5RGF0YTsKKworCisJCQlEZWZhdWx0SWR4ID0gcEtERS0+R1RLRW5jYXAuS2lkOworCisJCQkvLyBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoCisJCQlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkKKyAgICAJCXsKKyAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7CisgICAgICAgIAkJcmV0dXJuIEZBTFNFOworICAgIAkJfQorCisJCQkvLyBHZXQgR1RLIGxlbmd0aCAtIHJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IHAuODIKKwkJCUdUS0xFTiA9IHBLREUtPkxlbiAtNjsKKwkJCWlmIChHVEtMRU4gPCBMRU5fQUVTX0tFWSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBsZW5ndGggaXMgdG9vIHNob3J0ICglZCkgXG4iLCBHVEtMRU4pKTsKKyAgICAgICAgCQlyZXR1cm4gRkFMU0U7CisJCQl9CisKKyAgICAJfQorCQllbHNlCisgICAgCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBLREUgZm9ybWF0IGxlbmd0aCBpcyB0b28gc2hvcnQgXG4iKSk7CisJICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgaW4gS0RFIGZvcm1hdCAsRGVmYXVsdEtleUlEPSVkLCBLZXlMZW49JWQgXG4iLCBEZWZhdWx0SWR4LCBHVEtMRU4pKTsKKwkJLy8gc2tpcCBpdAorCQlwTXlLZXlEYXRhICs9IDg7CisJCUtleURhdGFMZW5ndGggLT0gODsKKworCX0KKwllbHNlIGlmICghYldQQTIgJiYgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwl7CisJCURlZmF1bHRJZHggPSBHcm91cEtleUluZGV4OworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgRGVmYXVsdEtleUlEPSVkIFxuIiwgRGVmYXVsdElkeCkpOworCX0KKworCS8vIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggbXVzdCBiZSAxIH4gMworCWlmIChEZWZhdWx0SWR4IDwgMSB8fCBEZWZhdWx0SWR4ID4gMykKKyAgICB7CisgICAgIAlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBpbmRleCglZCkgaXMgaW52YWxpZCBpbiAlcyAlcyBcbiIsIERlZmF1bHRJZHgsICgoYldQQTIpID8gIldQQTIiIDogIldQQSIpLCBHZXRFYXBvbE1zZ1R5cGUoTXNnVHlwZSkpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJLy8gVG9kbworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIFRSVUU7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgZm9yIFdQQSBoYW5kc2hha2luZworCQlJdHMgZm9ybWF0IGlzIGJlbG93LAorCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBQcm90b2NvbCBWZXJzaW9uCSB8ICAxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBQcm90b2NvbCBUeXBlCQkgfAkxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBCb2R5IExlbmd0aAkJIHwgIDIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBEZXNjcmlwdG9yIFR5cGUJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IEluZm9ybWF0aW9uICAgIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBMZW5ndGgJICAgICB8ICAxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgUmVwYWx5IENvdW50ZXIgfAk4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IE5vbmNlCQkgICAgIHwgIDMyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IElWCQkJIHwgIDE2IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJTQwkJCSB8ICA4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IElEIG9yIFJlc2VydmVkIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBNSUMJCQkgfAkxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhIExlbmd0aAkgfAkyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IERhdGEJCQkgfAluIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDb25zdHJ1Y3RFYXBvbE1zZygKKwlJTiAJUFJUTVBfQURBUFRFUiAgICAJcEFkLAorICAgIElOIAlVQ0hBUgkJCQlBdXRoTW9kZSwKKyAgICBJTiAJVUNIQVIJCQkJV2VwU3RhdHVzLAorICAgIElOIAlVQ0hBUgkJCQlHcm91cEtleVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJTXNnVHlwZSwKKyAgICBJTglVQ0hBUgkJCQlEZWZhdWx0S2V5SWR4LAorICAgIElOIAlVQ0hBUgkJCQkqUmVwbGF5Q291bnRlciwKKwlJTiAJVUNIQVIJCQkJKktleU5vbmNlLAorCUlOCVVDSEFSCQkJCSpUeFJTQywKKwlJTglVQ0hBUgkJCQkqUFRLLAorCUlOCVVDSEFSCQkJCSpHVEssCisJSU4JVUNIQVIJCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJCVJTTklFX0xlbiwKKyAgICBPVVQgUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnKQoreworCUJPT0xFQU4JYldQQTIgPSBGQUxTRTsKKworCS8vIENob29zZSBXUEEyIG9yIG5vdAorCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQliV1BBMiA9IFRSVUU7CisKKyAgICAvLyBJbml0IFBhY2tldCBhbmQgRmlsbCBoZWFkZXIKKyAgICBwTXNnLT5Qcm9WZXIgPSBFQVBPTF9WRVI7CisgICAgcE1zZy0+UHJvVHlwZSA9IEVBUE9MS2V5OworCisJLy8gRGVmYXVsdCA5NSBieXRlcywgdGhlIEVBUG9MLUtleSBkZXNjcmlwdG9yIGV4Y2x1ZGUgS2V5LWRhdGEgZmllbGQKKwlwTXNnLT5Cb2R5X0xlblsxXSA9IExFTl9FQVBPTF9LRVlfTVNHOworCisJLy8gRmlsbCBpbiBFQVBvTCBkZXNjcmlwdG9yCisJaWYgKGJXUEEyKQorCQlwTXNnLT5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCWVsc2UKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKworCS8vIEZpbGwgaW4gS2V5IGluZm9ybWF0aW9uLCByZWZlciB0byBJRUVFIFN0ZCA4MDIuMTFpLTIwMDQgcGFnZSA3OAorCS8vIFdoZW4gZWl0aGVyIHRoZSBwYWlyd2lzZSBvciB0aGUgZ3JvdXAgY2lwaGVyIGlzIEFFUywgdGhlIERFU0NfVFlQRV9BRVMoMikgc2hhbGwgYmUgdXNlZC4KKwlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9CisgICAgICAgIAkoKChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOworCisJLy8gU3BlY2lmeSBLZXkgVHlwZSBhcyBHcm91cCgwKSBvciBQYWlyd2lzZSgxKQorCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOworCWVsc2UKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIFNwZWNpZnkgS2V5IEluZGV4LCBvbmx5IGdyb3VwX21zZzFfV1BBMQorCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBEZWZhdWx0S2V5SWR4OworCisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgPSAxOworCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUFjayA9IDE7CisKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5TWljID0gMTsKKworCWlmICgoYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfUEFJUl9NU0dfMykpIHx8ICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKSkKKyAgICB7CisgICAgICAgCXBNc2ctPktleURlc2MuS2V5SW5mby5TZWN1cmUgPSAxOworICAgIH0KKworCWlmIChiV1BBMiAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkKKyAgICB7CisgICAgICAgIHBNc2ctPktleURlc2MuS2V5SW5mby5FS0RfREwgPSAxOworICAgIH0KKworCS8vIGtleSBJbmZvcm1hdGlvbiBlbGVtZW50IGhhcyBkb25lLgorCSooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBNc2ctPktleURlc2MuS2V5SW5mbykpOworCisJLy8gRmlsbCBpbiBLZXkgTGVuZ3RoCisJeworCQlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJeworCQkJLy8gdGhlIGxlbmd0aCBvZiBncm91cCBrZXkgY2lwaGVyCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBUS0lQX0dUS19MRU5HVEggOiBMRU5fQUVTX0tFWSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyB0aGUgbGVuZ3RoIG9mIHBhaXJ3aXNlIGtleSBjaXBoZXIKKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0gKChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBMRU5fVEtJUF9LRVkgOiBMRU5fQUVTX0tFWSk7CisJCX0KKwl9CisKKyAJLy8gRmlsbCBpbiByZXBsYXkgY291bnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBGaWxsIEtleSBOb25jZSBmaWVsZAorCS8vIEFOb25jZSA6IHBhaXJ3aXNlX21zZzEgJiBwYWlyd2lzZV9tc2czCisJLy8gU05vbmNlIDogcGFpcndpc2VfbXNnMgorCS8vIEdOb25jZSA6IGdyb3VwX21zZzFfd3BhMQorCWlmICgoTXNnVHlwZSA8PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKSkKKyAgICAJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlOb25jZSwgS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyBGaWxsIGtleSBJViAtIFdQQTIgYXMgMCwgV1BBMSBhcyByYW5kb20KKwlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwl7CisJCS8vIFN1Z2dlc3QgSVYgYmUgcmFuZG9tIG51bWJlciBwbHVzIHNvbWUgbnVtYmVyLAorCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleUl2LCAmS2V5Tm9uY2VbMTZdLCBMRU5fS0VZX0RFU0NfSVYpOworICAgICAgICBwTXNnLT5LZXlEZXNjLktleUl2WzE1XSArPSAyOworCX0KKworICAgIC8vIEZpbGwgS2V5IFJTQyBmaWVsZAorICAgIC8vIEl0IGNvbnRhaW5zIHRoZSBSU0MgZm9yIHRoZSBHVEsgYmVpbmcgaW5zdGFsbGVkLgorCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworICAgICAgICBOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleVJzYywgVHhSU0MsIDYpOworCX0KKworCS8vIENsZWFyIEtleSBNSUMgZmllbGQgZm9yIE1JQyBjYWxjdWxhdGlvbiBsYXRlcgorICAgIE5kaXNaZXJvTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCUNvbnN0cnVjdEVhcG9sS2V5RGF0YShwQWQsCisJCQkJCQkgIEF1dGhNb2RlLAorCQkJCQkJICBXZXBTdGF0dXMsCisJCQkJCQkgIEdyb3VwS2V5V2VwU3RhdHVzLAorCQkJCQkJICBNc2dUeXBlLAorCQkJCQkJICBEZWZhdWx0S2V5SWR4LAorCQkJCQkJICBiV1BBMiwKKwkJCQkJCSAgUFRLLAorCQkJCQkJICBHVEssCisJCQkJCQkgIFJTTklFLAorCQkJCQkJICBSU05JRV9MZW4sCisJCQkJCQkgIHBNc2cpOworCisJLy8gQ2FsY3VsYXRlIE1JQyBhbmQgZmlsbCBpbiBLZXlNaWMgRmllbGQgZXhjZXB0IFBhaXJ3aXNlIE1zZyAxLgorCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpCisJeworCQlDYWxjdWxhdGVNSUMocEFkLCBXZXBTdGF0dXMsIFBUSywgcE1zZyk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBDb25zdHJ1Y3RFYXBvbE1zZyBmb3IgJXMgJXNcbiIsICgoYldQQTIpID8gIldQQTIiIDogIldQQSIpLCBHZXRFYXBvbE1zZ1R5cGUoTXNnVHlwZSkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJICAgICBCb2R5IGxlbmd0aCA9ICVkIFxuIiwgcE1zZy0+Qm9keV9MZW5bMV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJICAgICBLZXkgbGVuZ3RoICA9ICVkIFxuIiwgcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0pKTsKKworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb25zdHJ1Y3QgdGhlIEtleSBEYXRhIGZpZWxkIG9mIEVBUG9MIG1lc3NhZ2UKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ29uc3RydWN0RWFwb2xLZXlEYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQXV0aE1vZGUsCisJSU4JVUNIQVIJCQlXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlHcm91cEtleVdlcFN0YXR1cywKKwlJTiAJVUNIQVIJCQlNc2dUeXBlLAorCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKKwlJTglCT09MRUFOCQkJYldQQTJDYXBhYmxlLAorCUlOCVVDSEFSCQkJKlBUSywKKwlJTglVQ0hBUgkJCSpHVEssCisJSU4JVUNIQVIJCQkqUlNOSUUsCisJSU4JVUNIQVIJCQlSU05JRV9MRU4sCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQoreworCVVDSEFSCQkqbXBvb2wsICpLZXlfRGF0YSwgKlJjNEdUSzsKKwlVQ0hBUiAgICAgICBla2V5WyhMRU5fS0VZX0RFU0NfSVYrTEVOX0VBUF9FSyldOworCVVDSEFSCQlkYXRhX29mZnNldDsKKworCisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikKKwkJcmV0dXJuOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxNTAwKTsKKworICAgIGlmIChtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBSYzRHVEsgTGVuID0gNTEyICovCisJUmM0R1RLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvKiBLZXlfRGF0YSBMZW4gPSA1MTIgKi8KKwlLZXlfRGF0YSA9IChVQ0hBUiAqKSBST1VORF9VUChSYzRHVEsgKyA1MTIsIDQpOworCisJTmRpc1plcm9NZW1vcnkoS2V5X0RhdGEsIDUxMik7CisJcE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gMDsKKwlkYXRhX29mZnNldCA9IDA7CisKKwkvLyBFbmNhcHN1bGF0ZSBSU05JRSBpbiBwYWlyd2lzZV9tc2cyICYgcGFpcndpc2VfbXNnMworCWlmIChSU05JRV9MRU4gJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpKSkKKwl7CisJCWlmIChiV1BBMkNhcGFibGUpCisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gSUVfV1BBMjsKKwkJZWxzZQorCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IElFX1dQQTsKKworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gUlNOSUVfTEVOOworCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAyXSwgUlNOSUUsIFJTTklFX0xFTik7CisJCWRhdGFfb2Zmc2V0ICs9ICgyICsgUlNOSUVfTEVOKTsKKwl9CisKKwkvLyBFbmNhcHN1bGF0ZSBLREUgZm9ybWF0IGluIHBhaXJ3aXNlX21zZzNfV1BBMiAmIGdyb3VwX21zZzFfV1BBMgorCWlmIChiV1BBMkNhcGFibGUgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCisJeworCQkvLyBLZXkgRGF0YSBFbmNhcHN1bGF0aW9uIChLREUpIGZvcm1hdCAtIDgwMi4xMWktMjAwNCAgRmlndXJlLTQzdyBhbmQgVGFibGUtMjBoCisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSAweEREOworCisJCWlmIChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQl7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgxNjsvLyA0KzIrMTYoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkKKwkJfQorCQllbHNlCisJCXsKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDI2Oy8vIDQrMiszMihPVUkrRGF0YVR5cGUrRGF0YUZpZWxkKQorCQl9CisKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAyXSA9IDB4MDA7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgM10gPSAweDBGOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDRdID0gMHhBQzsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA1XSA9IDB4MDE7CisKKwkJLy8gR1RLIEtERSBmb3JtYXQgLSA4MDIuMTFpLTIwMDQgIEZpZ3VyZS00M3gKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA2XSA9IChEZWZhdWx0S2V5SWR4ICYgMHgwMyk7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgN10gPSAweDAwOwkvLyBSZXNlcnZlZCBCeXRlCisKKwkJZGF0YV9vZmZzZXQgKz0gODsKKwl9CisKKworCS8vIEVuY2Fwc3VsYXRlIEdUSyBhbmQgZW5jcnlwdCB0aGUga2V5LWRhdGEgZmllbGQgd2l0aCBLRUsuCisJLy8gT25seSBmb3IgcGFpcndpc2VfbXNnM19XUEEyIGFuZCBncm91cF9tc2cxCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTJDYXBhYmxlKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQkvLyBGaWxsIGluIEdUSworCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0XSwgR1RLLCBMRU5fQUVTX0tFWSk7CisJCQlkYXRhX29mZnNldCArPSBMRU5fQUVTX0tFWTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgVEtJUF9HVEtfTEVOR1RIKTsKKwkJCWRhdGFfb2Zmc2V0ICs9IFRLSVBfR1RLX0xFTkdUSDsKKwkJfQorCisJCS8vIFN0aWxsIGRvbnQga25vdyB3aHksIGJ1dCBpZiBub3QgYXBwZW5kIHdpbGwgb2NjdXIgIkdUSyBub3QgaW5jbHVkZSBpbiBNU0czIgorCQkvLyBQYXRjaCBmb3IgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHplcm8gY29uZmlnIGFuZCBmdW5rCisJCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTJDYXBhYmxlKQorCQl7CisJCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMDsKKwkJCQlkYXRhX29mZnNldCArPSAyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSAweEREOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAwOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAwOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgM10gPSAwOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNF0gPSAwOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAwOworCQkJCWRhdGFfb2Zmc2V0ICs9IDY7CisJCQl9CisJCX0KKworCQkvLyBFbmNyeXB0IHRoZSBkYXRhIG1hdGVyaWFsIGluIGtleSBkYXRhIGZpZWxkCisJCWlmIChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJQUVTX0dUS19LRVlfV1JBUCgmUFRLWzE2XSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0LCBSYzRHVEspOworICAgICAgICAgICAgLy8gQUVTIHdyYXAgZnVuY3Rpb24gd2lsbCBncm93IDggYnl0ZXMgaW4gbGVuZ3RoCisgICAgICAgICAgICBkYXRhX29mZnNldCArPSA4OworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gUFJFUEFSRSBFbmNyeXB0ZWQgICJLZXkgREFUQSIgZmllbGQuICAoRW5jcnlwdCBHVEsgd2l0aCBSQzQsIHVzaW5mIFBUS1sxNl0tPlszMV0gYXMgS2V5LCBJVi1maWVsZCBhcyBJVikKKwkJCS8vIHB1dCBUeFRzYyBpbiBLZXkgUlNDIGZpZWxkCisJCQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUFBQSU5JVEZDUzMyOyAgIC8vSW5pdCBjcmMzMi4KKworCQkJLy8gZWtleSBpcyB0aGUgY29udGFuZXRpb24gb2YgSVYtZmllbGQsIGFuZCBQVEtbMTZdLT5QVEtbMzFdCisJCQlOZGlzTW92ZU1lbW9yeShla2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCBMRU5fS0VZX0RFU0NfSVYpOworCQkJTmRpc01vdmVNZW1vcnkoJmVrZXlbTEVOX0tFWV9ERVNDX0lWXSwgJlBUS1sxNl0sIExFTl9FQVBfRUspOworCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIGVrZXksIHNpemVvZihla2V5KSk7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisJCQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUlRNUF9DQUxDX0ZDUzMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7CisJCQlXUEFBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgUmM0R1RLLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCQl9CisKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBSYzRHVEssIGRhdGFfb2Zmc2V0KTsKKwl9CisJZWxzZQorCXsKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCX0KKworCS8vIHNldCBrZXkgZGF0YSBsZW5ndGggZmllbGQgYW5kIHRvdGFsIGxlbmd0aAorCXBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSA9IGRhdGFfb2Zmc2V0OworICAgIHBNc2ctPkJvZHlfTGVuWzFdICs9IGRhdGFfb2Zmc2V0OworCisJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGNhdWxhdGUgTUlDLiBJdCBpcyB1c2VkIGR1cmluZyA0LXdheXMgaGFuZHNoYXJraW5nLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCVBlZXJXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDYWxjdWxhdGVNSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlQZWVyV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJKlBUSywKKwlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpCit7CisgICAgVUNIQVIgICAqT3V0QnVmZmVyOworCVVMT05HCUZyYW1lTGVuID0gMDsKKwlVQ0hBUgltaWNbTEVOX0tFWV9ERVNDX01JQ107CisJVUNIQVIJZGlnZXN0WzgwXTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZPdXRCdWZmZXIsIDUxMik7CisKKyAgICBpZiAoT3V0QnVmZmVyID09IE5VTEwpCisgICAgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFDYWxjdWxhdGVNSUM6IG5vIG1lbW9yeSEhIVxuIikpOworCQlyZXR1cm47CisgICAgfQorCisJLy8gbWFrZSBhIGZyYW1lIGZvciBjYWxjdWxhdGluZyBNSUMuCisgICAgTWFrZU91dGdvaW5nRnJhbWUoT3V0QnVmZmVyLCAgICAgICAgICAgIAkmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+Qm9keV9MZW5bMV0gKyA0LCAgCXBNc2csCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJTmRpc1plcm9NZW1vcnkobWljLCBzaXplb2YobWljKSk7CisKKwkvLyBDYWxjdWxhdGUgTUlDCisgICAgaWYgKFBlZXJXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAJeworCQlITUFDX1NIQTEoT3V0QnVmZmVyLCAgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgT3V0QnVmZmVyLCBGcmFtZUxlbiwgbWljKTsKKwl9CisKKwkvLyBzdG9yZSB0aGUgY2FsY3VsYXRlZCBNSUMKKwlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCW9zX2ZyZWVfbWVtKHBBZCwgT3V0QnVmZmVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNvbWUgcmVjZWl2ZWQgZnJhbWVzIGNhbid0IGRlY3J5cHQgYnkgQXNpYywgc28gZGVjcnlwdCB0aGVtIGJ5IHNvZnR3YXJlLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCVBlZXJXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCS0JZGVjcnlwdGlvbiBzdWNjZXNzZnVsCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCS0JZGVjcnlwdGlvbiBmYWlsdXJlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKKwlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKKwlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgCUdyb3VwQ2lwaGVyLAorCUlOICBQQ0lQSEVSX0tFWQkJCQkJCXBTaGFyZF9rZXkpCit7CisJUFJYV0lfU1RSVUMJCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisKKworCisJLy8gaGFuZGxlIFdFUCBkZWNyeXB0aW9uCisJaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisgICAgeworCQlpZiAoUlRNUFNvZnREZWNyeXB0V0VQKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy9NaW51cyBJVls0XSAmIElDVls0XQorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSA4OworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBTb2Z0d2FyZSBkZWNyeXB0IFdFUCBkYXRhIGZhaWxzLlxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwkvLyBoYW5kbGUgVEtJUCBkZWNyeXB0aW9uCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwl7CisJCWlmIChSVE1QU29mdERlY3J5cHRUS0lQKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgMCwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy9NaW51cyA4IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYsIDQgYnl0ZXMgSUNWCisJCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDIwOworCQl9CisgICAgICAgIGVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRUS0lQIEZhaWxlZFxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorCX0KKwkvLyBoYW5kbGUgQUVTIGRlY3J5cHRpb24KKwllbHNlIGlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdEFFUyhwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLCBwU2hhcmRfa2V5KSkKKwkJeworCisJCQkvLzggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViAoQ0NNUCBIZWFkZXIpCisJCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDE2OworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRBRVMgRmFpbGVkXG4iKSk7CisJCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2YxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYwpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBhcF9kZnMuYworCisgICAgQWJzdHJhY3Q6CisgICAgU3VwcG9ydCBERlMgZnVuY3Rpb24uCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZvbmNoaSAgICAwMy0xMi0yMDA3ICAgICAgY3JlYXRlZAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCit0eXBlZGVmIHN0cnVjdCBfUkFEQVJfRFVSQVRJT05fVEFCTEUKK3sKKwlVTE9ORyBSRER1clJlZ2lvbjsKKwlVTE9ORyBSYWRhclNpZ25hbER1cmF0aW9uOworCVVMT05HIFRvbGVyYW5jZTsKK30gUkFEQVJfRFVSQVRJT05fVEFCTEUsICpQUkFEQVJfRFVSQVRJT05fVEFCTEU7CisKKworc3RhdGljIFVDSEFSIFJkSWRsZVRpbWVUYWJsZVtNQVhfUkRfUkVHSU9OXVs0XSA9Cit7CisJezksIDI1MCwgMjUwLCAyNTB9LAkJLy8gQ0UKKwl7NCwgMjUwLCAyNTAsIDI1MH0sCQkvLyBGQ0MKKwl7NCwgMjUwLCAyNTAsIDI1MH0sCQkvLyBKQVAKKwl7MTUsIDI1MCwgMjUwLCAyNTB9LAkvLyBKQVBfVzUzCisJezQsIDI1MCwgMjUwLCAyNTB9CQkvLyBKQVBfVzU2Cit9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQ4IFJhZGFyUGVyaW9kOworCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDExNCwgMHgwMik7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyMSwgMHgyMCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyMiwgMHgwMCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyMywgMHgwOC8qMHg4MCovKTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTI0LCAweDI4KTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTI1LCAweGZmKTsKKworI2lmIDAKKwkvLyB0b2dnbGUgUnggZW5hYmxlIGJpdCBmb3IgcmFkYXIgZGV0ZWN0aW9uLgorCS8vIGl0J3MgQW5keSdzIHJlY29tbWFuZC4KKwl7CisJCVVJTlQzMiBWYWx1ZTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwlWYWx1ZSB8PSAoMHgxIDw8IDMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCVZhbHVlICY9IH4oMHgxIDw8IDMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCX0KKyNlbmRpZgorCVJhZGFyUGVyaW9kID0gKChVSU5UKVJkSWRsZVRpbWVUYWJsZVtwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbl1bMF0gKyAoVUlOVClwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSkgPCAyNTAgPworCQkJKFJkSWRsZVRpbWVUYWJsZVtwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbl1bMF0gKyBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSkgOiAyNTA7CisKKwlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMCwgMHgxZCk7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjEsIDB4NDApOworCisJUmFkYXJEZXRlY3Rpb25TdGFydChwQWQsIDAsIFJhZGFyUGVyaW9kKTsKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCYnAgUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMCwgMHgxZCk7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjEsIDB4NjApOworCisJUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBDVFNQcm90ZWN0LAorCUlOIFVJTlQ4IENUU1BlcmlvZCkKK3sKKwlVSU5UOCBEZnNBY3RpdmVUaW1lID0gKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lICYgMHgxZik7CisJVUlOVDggQ3RzUHJvdGVjdCA9IChDVFNQcm90ZWN0ID09IDEpID8gMHgwMiA6IDB4MDE7IC8vIENUUyBwcm90ZWN0LgorCisJaWYgKENUU1Byb3RlY3QgIT0gMCkKKwl7CisJCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbikKKwkJeworCQljYXNlIEZDQzoKKwkJY2FzZSBKQVBfVzU2OgorCQkJQ3RzUHJvdGVjdCA9IDB4MDM7CisJCQlicmVhazsKKworCQljYXNlIENFOgorCQljYXNlIEpBUF9XNTM6CisJCWRlZmF1bHQ6CisJCQlDdHNQcm90ZWN0ID0gMHgwMjsKKwkJCWJyZWFrOworCQl9CisJfQorCWVsc2UKKwkJQ3RzUHJvdGVjdCA9IDB4MDE7CisKKworCS8vIHNlbmQgc3RhcnQtUkQgd2l0aCBDVFMgcHJvdGVjdGlvbiBjb21tYW5kIHRvIE1DVQorCS8vIGhpZ2hieXRlIFs3XQkJcmVzZXJ2ZQorCS8vIGhpZ2hieXRlIFs2OjVdCTB4OiBzdG9wIENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uCisJLy8gaGlnaGJ5dGUgWzEwXToJU3RhcnQgQ2Fycmllci9SYWRhciBkZXRlY3Rpb24gd2l0aG91dCBDVFMgcHJvdGVjdGlvbiwgMTE6IFN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGggQ1RTIHByb3RlY3Rpb24KKwkvLyBoaWdoYnl0ZSBbNDowXQlSYWRhci9jYXJyaWVyIGRldGVjdGlvbiBkdXJhdGlvbi4gSW4gMW1zLgorCisJLy8gbG93Ynl0ZSBbNzowXQlSYWRhci9jYXJyaWVyIGRldGVjdGlvbiBwZXJpb2QsIGluIDFtcy4KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIENUU1BlcmlvZCwgRGZzQWN0aXZlVGltZSB8IChDdHNQcm90ZWN0IDw8IDUpKTsKKwkvL0FzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MywgMHhmZiwgMTAsIDApOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJRm91bmQgcmFkYXIgc2lnbmFsCisJCUZBTFNFCU5vdCBmb3VuZCByYWRhciBzaWduYWwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFkYXJEZXRlY3Rpb25TdG9wLlxuIikpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MCwgMHhmZiwgMHgwMCwgMHgwMCk7CS8vIHNlbmQgc3RhcnQtUkQgd2l0aCBDVFMgcHJvdGVjdGlvbiBjb21tYW5kIHRvIE1DVQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmFkYXIgY2hhbm5lbCBjaGVjayByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCW5lZWQgdG8gZG8gcmFkYXIgZGV0ZWN0CisJCUZBTFNFCW5lZWQgbm90IHRvIGRvIHJhZGFyIGRldGVjdAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUNoKQoreworI2lmIDEKKwlJTlQJCWk7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKworCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChDaCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCXsKKwkJCXJlc3VsdCA9IHBBZC0+Q2hhbm5lbExpc3RbaV0uRGZzUmVxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworI2Vsc2UKKwlJTlQJCWk7CisJVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisKKwlmb3IgKGk9MDsgaTwxNTsgaSsrKQorCXsKKwkJaWYgKENoID09IENoYW5uZWxbaV0pCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgIT0gMTUpCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKK1VMT05HIEphcFJhZGFyVHlwZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORwkJaTsKKwljb25zdCBVQ0hBUglDaGFubmVsWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiAhPSBKQVApCisJeworCQlyZXR1cm4gcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb247CisJfQorCisJZm9yIChpPTA7IGk8MTU7IGkrKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IENoYW5uZWxbaV0pCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPCA0KQorCQlyZXR1cm4gSkFQX1c1MzsKKwllbHNlIGlmIChpIDwgMTUpCisJCXJldHVybiBKQVBfVzU2OworCWVsc2UKKwkJcmV0dXJuIEpBUDsgLy8gVzUyCisKK30KKworVUxPTkcgUlRNUEJicFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVJTlQ4IGJ5dGVWYWx1ZSA9IDA7CisJVUxPTkcgcmVzdWx0OworCisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE1LCAmYnl0ZVZhbHVlKTsKKworCXJlc3VsdCA9IDA7CisJc3dpdGNoIChieXRlVmFsdWUpCisJeworCWNhc2UgMTogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHB1bHNlIG1vZGUuCisJY2FzZSAyOiAvLyByYWRhciBzaWduYWwgZGV0ZWN0ZWQgYnkgd2lkdGggbW9kZS4KKwkJcmVzdWx0ID0gUlRNUFJlYWRSYWRhckR1cmF0aW9uKHBBZCk7CisJCWJyZWFrOworCisJY2FzZSAwOiAvLyBObyByYWRhciBzaWduYWwuCisJZGVmYXVsdDoKKworCQlyZXN1bHQgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitVTE9ORyBSVE1QUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcgcmVzdWx0ID0gMDsKKworI2lmZGVmIERGU19TVVBQT1JUCisJVUlOVDggZHVyYXRpb24xID0gMCwgZHVyYXRpb24yID0gMCwgZHVyYXRpb24zID0gMDsKKworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNiwgJmR1cmF0aW9uMSk7CisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE3LCAmZHVyYXRpb24yKTsKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTgsICZkdXJhdGlvbjMpOworCXJlc3VsdCA9IChkdXJhdGlvbjEgPDwgMTYpICsgKGR1cmF0aW9uMiA8PCA4KSArIGR1cmF0aW9uMzsKKyNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLworCisJcmV0dXJuIHJlc3VsdDsKKworfQorCitWT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJcmV0dXJuOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFJhZGFyIHdhdmUgZGV0ZWN0aW9uLiBUaGUgQVBJIHNob3VsZCBiZSBpbnZva2UgZWFjaCBzZWNvbmQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXBSYWRhckRldGVjdFBlcmlvZGljKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVAlpOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuSW5TZXJ2aWNlTW9uaXRvckNvdW50Kys7CisKKwlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID4gMCkKKwkJeworCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlIC0tOworCQkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCU1KSA9PSAwKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhZGFyRGV0ZWN0UGVyaW9kaWMgLSBjaD0lZCwgUmVtYWluaW5nVGltZUZvclVzZT0lZFxuIiwgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UpKTsKKwkJCX0KKwkJfQorCX0KKworCS8vcmFkYXIgZGV0ZWN0CisJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCXsKKwkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOworCX0KKworCXJldHVybjsKK30KKworLy8gUGVyaW9kaWMgUmFkYXIgZGV0ZWN0aW9uLCBzd2l0Y2ggY2hhbm5lbCB3aWxsIG9jY3VyIGluIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KCkKKy8vIEJlZm9yZSBzd2l0Y2ggY2hhbm5lbCwgZHJpdmVyIG5lZWRzIGRvaW5nIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudC4KK1ZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBuZWVkIHRvIGNoZWNrIGNoYW5uZWwgYXZhaWxhYmlsaXR5LCBhZnRlciBzd2l0Y2ggY2hhbm5lbAorCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfU0lMRU5DRV9NT0RFKQorCQkJcmV0dXJuOworCisJLy8gY2hhbm5lbCBhdmFpbGFiaWxpdHkgY2hlY2sgdGltZSBpcyA2MHNlYywgdXNlIDY1IGZvciBhc3N1cmFuY2UKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCsrID4gcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGZvdW5kIHJhZGFyIHNpZ25hbCwgc3RhcnQgc2VuZCBiZWFjb24gYW5kIHJhZGFyIGRldGVjdGlvbiBpbiBzZXJ2aWNlIG1vbml0b3JcblxuIikpOworCQkJQmJwUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7CisJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOworCisKKwkJcmV0dXJuOworCX0KKworCXJldHVybjsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisJCWNoYW5nZSBjaGFubmVsIG1vdmluZyB0aW1lIGZvciBERlMgdGVzdGluZy4KKworCUFyZ3VtZW50czoKKwkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgc2V0IENoTW92VGltZT1bdmFsdWVdCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpCit7CisJVUlOVDggVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUgPSBWYWx1ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlVSU5UOCBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA+IDEwID8gMTAgOiBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IFZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19GVU5DVElPTl9fLAorCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZXByb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDJkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZXByb20uYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwllZXByb20uYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgUmFpc2VDbG9jaygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVUlOVDMyICp4KQoreworICAgICp4ID0gKnggfCBFRVNLOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsICp4KTsKKyAgICBSVE1QdXNlY0RlbGF5KDEpOwkJCQkvLyBNYXggZnJlcXVlbmN5ID0gMU1IeiBpbiBTcGVjLiBkZWZpbml0aW9uCit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIExvd2VyQ2xvY2soCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVJTlQzMiAqeCkKK3sKKyAgICAqeCA9ICp4ICYgfkVFU0s7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworICAgIFJUTVB1c2VjRGVsYXkoMSk7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitVU0hPUlQgU2hpZnRJbkJpdHMoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisgICAgVUlOVDMyCQl4LGk7CisJVVNIT1JUICAgICAgZGF0YT0wOworCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICB4ICY9IH4oIEVFRE8gfCBFRURJKTsKKworICAgIGZvcihpPTA7IGk8MTY7IGkrKykKKyAgICB7CisgICAgICAgIGRhdGEgPSBkYXRhIDw8IDE7CisgICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisKKyAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICAgICAgeCAmPSB+KEVFREkpOworICAgICAgICBpZih4ICYgRUVETykKKyAgICAgICAgICAgIGRhdGEgfD0gMTsKKworICAgICAgICBMb3dlckNsb2NrKHBBZCwgJngpOworICAgIH0KKworICAgIHJldHVybiBkYXRhOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBTaGlmdE91dEJpdHMoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVTSE9SVCBkYXRhLAorICAgIElOICBVU0hPUlQgY291bnQpCit7CisgICAgVUlOVDMyICAgICAgIHgsbWFzazsKKworICAgIG1hc2sgPSAweDAxIDw8IChjb3VudCAtIDEpOworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgeCAmPSB+KEVFRE8gfCBFRURJKTsKKworICAgIGRvCisgICAgeworICAgICAgICB4ICY9IH5FRURJOworICAgICAgICBpZihkYXRhICYgbWFzaykJCXggfD0gRUVESTsKKworICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworICAgICAgICBSYWlzZUNsb2NrKHBBZCwgJngpOworICAgICAgICBMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgICAgIG1hc2sgPSBtYXNrID4+IDE7CisgICAgfSB3aGlsZShtYXNrKTsKKworICAgIHggJj0gfkVFREk7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIEVFcHJvbUNsZWFudXAoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisgICAgVUlOVDMyIHg7CisKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgIHggJj0gfihFRUNTIHwgRUVESSk7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKyAgICBSYWlzZUNsb2NrKHBBZCwgJngpOworICAgIExvd2VyQ2xvY2socEFkLCAmeCk7Cit9CisKK1ZPSUQgRVdFTigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJeDsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdFTl9PUENPREUsIDUpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCitWT0lEIEVXRFMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisgICAgVUlOVDMyCXg7CisKKyAgICAvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworICAgIHggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworICAgIHggfD0gRUVDUzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8vIGtpY2sgYSBwdWxzZQorCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHNpeCBwdWxzZSBpbiB0aGF0IG9yZGVyCisgICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX0VXRFNfT1BDT0RFLCA1KTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCAwLCA2KTsKKworICAgIEVFcHJvbUNsZWFudXAocEFkKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VTSE9SVCBSVE1QX0VFUFJPTV9SRUFEMTYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVTSE9SVCBPZmZzZXQpCit7CisgICAgVUlOVDMyCQl4OworICAgIFVTSE9SVAkJZGF0YTsKKworICAgIE9mZnNldCAvPSAyOworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgcmVnaXN0ZXIgbnVtYmVyIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fUkVBRF9PUENPREUsIDMpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKKworICAgIC8vIE5vdyByZWFkIHRoZSBkYXRhICgxNiBiaXRzKSBpbiBmcm9tIHRoZSBzZWxlY3RlZCBFRVBST00gd29yZAorICAgIGRhdGEgPSBTaGlmdEluQml0cyhwQWQpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworCisgICAgcmV0dXJuIGRhdGE7Cit9CS8vUmVhZEVFcHJvbQorCitWT0lEIFJUTVBfRUVQUk9NX1dSSVRFMTYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVTSE9SVCBPZmZzZXQsCisgICAgSU4gIFVTSE9SVCBEYXRhKQoreworICAgIFVJTlQzMiB4OworCisJT2Zmc2V0IC89IDI7CisKKwlFV0VOKHBBZCk7CisKKyAgICAvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworICAgIHggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworICAgIHggfD0gRUVDUzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8vIGtpY2sgYSBwdWxzZQorCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgLHJlZ2lzdGVyIG51bWJlciBhbmQgZGF0YSBpbiB0aGF0IG9yZGVyCisgICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1dSSVRFX09QQ09ERSwgMyk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOworCVNoaWZ0T3V0Qml0cyhwQWQsIERhdGEsIDE2KTsJCS8vIDE2LWJpdCBhY2Nlc3MKKworICAgIC8vIHJlYWQgRE8gc3RhdHVzCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKwlFRXByb21DbGVhbnVwKHBBZCk7CisKKwlSVE1QdXNlY0RlbGF5KDEwMDAwKTsJLy9kZWxheSBmb3IgdHdwKE1BWCk9MTBtcworCisJRVdEUyhwQWQpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzI5OTZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmUuaApAQCAtMCwwICsxLDU1OCBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMDcsIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uLiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBiaW5hcnkgZm9ybSwgd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyBtZXQ6CisKKyAJKiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZQorIAlmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgCXByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAJKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgCXN1cHBsaWVycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAJc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgCSogTm8gcmV2ZXJzZSBlbmdpbmVlcmluZywgZGVjb21waWxhdGlvbiwgb3IgZGlzYXNzZW1ibHkgb2YgdGhpcyBzb2Z0d2FyZQorIAlpcyBwZXJtaXR0ZWQuCisKKyBMaW1pdGVkIHBhdGVudCBsaWNlbnNlLiBSYWxpbmsgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiBncmFudHMgYSB3b3JsZC13aWRlLAorIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlIHVuZGVyIHBhdGVudHMgaXQgbm93IG9yIGhlcmVhZnRlcgorIG93bnMgb3IgY29udHJvbHMgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIGltcG9ydCwgb2ZmZXIgdG8gc2VsbCBhbmQKKyBzZWxsICgiVXRpbGl6ZSIpIHRoaXMgc29mdHdhcmUsIGJ1dCBzb2xlbHkgdG8gdGhlIGV4dGVudCB0aGF0IGFueQorIHN1Y2ggcGF0ZW50IGlzIG5lY2Vzc2FyeSB0byBVdGlsaXplIHRoZSBzb2Z0d2FyZSBhbG9uZSwgb3IgaW4KKyBjb21iaW5hdGlvbiB3aXRoIGFuIG9wZXJhdGluZyBzeXN0ZW0gbGljZW5zZWQgdW5kZXIgYW4gYXBwcm92ZWQgT3BlbgorIFNvdXJjZSBsaWNlbnNlIGFzIGxpc3RlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBhdAorIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KKyBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZS4gIE5vIGhhcmR3YXJlIHBlcgorIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworIERJU0NMQUlNRVIuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsCisgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgREFNQUdFLgorKi8KKy8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCisvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLworCisKK1VDSEFSIEZpcm13YXJlSW1hZ2UgW10gPSB7CisweDAyLCAweDAzLCAweDVlLCAweDAyLCAweDAyLCAweGIxLCAweDIyLCAweDIyLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDgyLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHgxZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMSwgMHgzMywgMHhjMCwgMHhlMCwKKzB4YzAsIDB4ZjAsIDB4YzAsIDB4ODMsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ZDAsIDB4NzUsIDB4ZDAsIDB4MTgsIDB4YzIsIDB4YWYsIDB4MzAsIDB4NDUsIDB4MDMsCisweDEyLCAweDEwLCAweDA5LCAweDkwLCAweDA0LCAweDE2LCAweGUwLCAweDMwLCAweGUzLCAweDAzLCAweDc0LCAweDA4LCAweGYwLCAweDkwLCAweDA0LCAweDE0LAorMHhlMCwgMHgyMCwgMHhlNywgMHgwMywgMHgwMiwgMHgwMCwgMHhjYiwgMHg3NCwgMHg4MCwgMHhmMCwgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHgyZiwKKzB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MjQsIDB4Y2YsIDB4NjAsIDB4MzAsIDB4MTQsIDB4NjAsIDB4NDIsIDB4MjQsIDB4ZTIsIDB4NjAsIDB4NDcsIDB4MTQsCisweDYwLCAweDU1LCAweDI0LCAweDIxLCAweDcwLCAweDYwLCAweGU1LCAweDU1LCAweDI0LCAweGZlLCAweDYwLCAweDA3LCAweDE0LCAweDYwLCAweDA4LCAweDI0LAorMHgwMiwgMHg3MCwgMHgwOCwgMHg3ZCwgMHgwMSwgMHg4MCwgMHgyOCwgMHg3ZCwgMHgwMiwgMHg4MCwgMHgyNCwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmNSwKKzB4NTAsIDB4ODUsIDB4MmYsIDB4NDAsIDB4ZDIsIDB4MDEsIDB4ODAsIDB4M2UsIDB4ZTUsIDB4NTUsIDB4NjQsIDB4MDMsIDB4NjAsIDB4MDQsIDB4ZTUsIDB4NTUsCisweDcwLCAweDA0LCAweDdkLCAweDAyLCAweDgwLCAweDA5LCAweDg1LCAweDJmLCAweDQxLCAweGQyLCAweDAyLCAweDgwLCAweDI5LCAweGFkLCAweDU1LCAweGFmLAorMHgyZiwgMHgxMiwgMHgwMiwgMHg4ZCwgMHg4MCwgMHgyMCwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmNSwgMHg0NywgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwKKzB4ZjUsIDB4NDQsIDB4MTIsIDB4MTAsIDB4MjUsIDB4ODAsIDB4MDYsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZjUsIDB4NDUsIDB4ZTQsIDB4ZmQsIDB4YWYsCisweDJmLCAweDEyLCAweDAyLCAweDhkLCAweGQyLCAweDA0LCAweDkwLCAweDcwLCAweDEzLCAweGU0LCAweGYwLCAweGQyLCAweGFmLCAweGQwLCAweGQwLCAweGQwLAorMHg4MiwgMHhkMCwgMHg4MywgMHhkMCwgMHhmMCwgMHhkMCwgMHhlMCwgMHgzMiwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHgzMCwgMHhlMSwgMHg1MywgMHhjMiwKKzB4YWYsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWQsCisweGYwLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweGY1LCAweDMwLCAweDkwLAorMHgxMCwgMHgxZSwgMHhlMCwgMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOCwgMHhmMCwgMHg5MCwgMHgxMCwKKzB4MWQsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZjAsIDB4MzAsIDB4NGEsCisweDBkLCAweDkwLCAweDcwLCAweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDAyLCAweDJjLCAweDc0LCAweGZmLCAweGYwLCAweGMyLCAweDA1LAorMHhkMiwgMHhhZiwgMHgyMiwgMHhjMCwgMHhlMCwgMHhjMCwgMHhmMCwgMHhjMCwgMHg4MywgMHhjMCwgMHg4MiwgMHhjMCwgMHhkMCwgMHhlOCwgMHhjMCwgMHhlMCwKKzB4ZTksIDB4YzAsIDB4ZTAsIDB4ZWEsIDB4YzAsIDB4ZTAsIDB4ZWIsIDB4YzAsIDB4ZTAsIDB4ZWMsIDB4YzAsIDB4ZTAsIDB4ZWQsIDB4YzAsIDB4ZTAsIDB4ZWUsCisweGMwLCAweGUwLCAweGVmLCAweGMwLCAweGUwLCAweGMyLCAweGFmLCAweDMwLCAweDQ1LCAweDAzLCAweDEyLCAweDEwLCAweDEyLCAweGQyLCAweGFmLCAweGQwLAorMHhlMCwgMHhmZiwgMHhkMCwgMHhlMCwgMHhmZSwgMHhkMCwgMHhlMCwgMHhmZCwgMHhkMCwgMHhlMCwgMHhmYywgMHhkMCwgMHhlMCwgMHhmYiwgMHhkMCwgMHhlMCwKKzB4ZmEsIDB4ZDAsIDB4ZTAsIDB4ZjksIDB4ZDAsIDB4ZTAsIDB4ZjgsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ODIsIDB4ZDAsIDB4ODMsIDB4ZDAsIDB4ZjAsIDB4ZDAsCisweGUwLCAweDMyLCAweGMwLCAweGUwLCAweGMwLCAweGYwLCAweGMwLCAweDgzLCAweGMwLCAweDgyLCAweGMwLCAweGQwLCAweDc1LCAweGQwLCAweDEwLCAweGMyLAorMHhhZiwgMHgzMCwgMHg0NSwgMHgwMywgMHgxMiwgMHgxMCwgMHgwYywgMHgzMCwgMHg1OCwgMHgwYSwgMHhlNSwgMHg1NCwgMHg2MCwgMHgwNCwgMHgxNSwgMHg1NCwKKzB4ODAsIDB4MDIsIDB4YzIsIDB4NTgsIDB4MzAsIDB4NTksIDB4MGEsIDB4ZTUsIDB4NTAsIDB4NjAsIDB4MDQsIDB4MTUsIDB4NTAsIDB4ODAsIDB4MDIsIDB4YzIsCisweDU5LCAweGQ1LCAweDUzLCAweDA3LCAweDMwLCAweDYwLCAweDA0LCAweDE1LCAweDQ2LCAweGQyLCAweDA0LCAweDMwLCAweDQ1LCAweDAzLCAweDEyLCAweDEwLAorMHgwZiwgMHhjMiwgMHg4ZCwgMHhkMiwgMHhhZiwgMHhkMCwgMHhkMCwgMHhkMCwgMHg4MiwgMHhkMCwgMHg4MywgMHhkMCwgMHhmMCwgMHhkMCwgMHhlMCwgMHgzMiwKKzB4MTIsIDB4MDIsIDB4ZDMsIDB4MzAsIDB4NDUsIDB4MDMsIDB4MTIsIDB4MTAsIDB4MDMsIDB4MzAsIDB4MDEsIDB4MDYsIDB4MjAsIDB4MDksIDB4MDMsIDB4MTIsCisweDEwLCAweDFjLCAweDMwLCAweDAyLCAweDA2LCAweDIwLCAweDBhLCAweDAzLCAweDEyLCAweDEwLCAweDFmLCAweDMwLCAweDAzLCAweDA2LCAweDIwLCAweDBiLAorMHgwMywgMHgxMiwgMHgxMCwgMHgxZiwgMHgzMCwgMHgwNCwgMHgwNiwgMHgyMCwgMHgwYywgMHgwMywgMHgxMiwgMHgxMCwgMHgyMiwgMHgyMCwgMHgxMywgMHgwOSwKKzB4MjAsIDB4MTEsIDB4MDYsIDB4ZTUsIDB4MmIsIDB4NDUsIDB4MmMsIDB4NjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4YTksIDB4MTIsCisweDAyLCAweGVjLCAweDgwLCAweGJmLCAweGMyLCAweDQzLCAweGQyLCAweDQ1LCAweGU0LCAweGY1LCAweDIwLCAweGY1LCAweDIxLCAweGY1LCAweDUzLCAweGY1LAorMHg0NiwgMHhmNSwgMHgyYiwgMHhmNSwgMHgyYywgMHhjMiwgMHg0MiwgMHhmNSwgMHg1MSwgMHhmNSwgMHg1MiwgMHhmNSwgMHg1NSwgMHg5MCwgMHgwNCwgMHgxOCwKKzB4NzQsIDB4ODAsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MWEsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4YzIsIDB4MTksIDB4YzIsIDB4MTgsIDB4YzIsIDB4MWEsIDB4MjIsCisweGM4LCAweGVmLCAweGM4LCAweGU2LCAweGZhLCAweDA4LCAweGU2LCAweDRhLCAweDYwLCAweDBjLCAweGM4LCAweGVmLCAweGM4LCAweDA4LCAweGU2LCAweDE2LAorMHgxOCwgMHg3MCwgMHgwMSwgMHgxNiwgMHhjMywgMHgyMiwgMHhlZCwgMHgyNCwgMHhmZiwgMHhmZCwgMHhlYywgMHgzNCwgMHhmZiwgMHhjOCwgMHhlZiwgMHhjOCwKKzB4ZjYsIDB4MDgsIDB4YzYsIDB4ZWQsIDB4YzYsIDB4ZDMsIDB4MjIsIDB4ZDAsIDB4ODMsIDB4ZDAsIDB4ODIsIDB4ZjgsIDB4ZTQsIDB4OTMsIDB4NzAsIDB4MTIsCisweDc0LCAweDAxLCAweDkzLCAweDcwLCAweDBkLCAweGEzLCAweGEzLCAweDkzLCAweGY4LCAweDc0LCAweDAxLCAweDkzLCAweGY1LCAweDgyLCAweDg4LCAweDgzLAorMHhlNCwgMHg3MywgMHg3NCwgMHgwMiwgMHg5MywgMHg2OCwgMHg2MCwgMHhlZiwgMHhhMywgMHhhMywgMHhhMywgMHg4MCwgMHhkZiwgMHhlZiwgMHhmNCwgMHg2MCwKKzB4MWYsIDB4ZTQsIDB4ZmUsIDB4MTIsIDB4MDMsIDB4NmEsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTIsIDB4MTIsIDB4MDMsIDB4NmEsIDB4ZWYsIDB4ZjAsIDB4NzQsCisweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVkLCAweGYwLCAweDIyLCAweDBlLCAweGJlLCAweDA0LCAweGUzLAorMHgyMiwgMHhjMCwgMHhlMCwgMHhjMCwgMHhmMCwgMHhjMCwgMHg4MywgMHhjMCwgMHg4MiwgMHhjMCwgMHhkMCwgMHg3NSwgMHhkMCwgMHgwOCwgMHhjMiwgMHhhZiwKKzB4MzAsIDB4NDUsIDB4MDMsIDB4MTIsIDB4MTAsIDB4MDYsIDB4ZDIsIDB4YWYsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ODIsIDB4ZDAsIDB4ODMsIDB4ZDAsIDB4ZjAsCisweGQwLCAweGUwLCAweDMyLCAweGMyLCAweGFmLCAweDEyLCAweDAwLCAweDA2LCAweDEyLCAweDAyLCAweDE0LCAweDEyLCAweDAzLCAweDFjLCAweGU0LCAweGY1LAorMHgyMiwgMHhmNSwgMHg0NywgMHg5MCwgMHgwNCwgMHgwMCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhkMiwgMHhhZiwgMHgyMiwgMHgzMCwgMHg0NSwgMHgwMywgMHgxMiwKKzB4MTAsIDB4MTUsIDB4ZTUsIDB4MjAsIDB4NzAsIDB4MDMsIDB4MjAsIDB4MTAsIDB4MDMsIDB4MzAsIDB4MTEsIDB4MDMsIDB4NDMsIDB4ODcsIDB4MDEsIDB4MjIsCisweGMwLCAweDJhLCAweDc0LCAweDAzLCAweGMwLCAweGUwLCAweGMwLCAweDgyLCAweGMwLCAweDgzLCAweDc1LCAweDJhLCAweDBhLCAweDIyLCAweGMwLCAweDJhLAorMHg3NCwgMHgwMywgMHhjMCwgMHhlMCwgMHhjMCwgMHg4MiwgMHhjMCwgMHg4MywgMHg3NSwgMHgyYSwgMHgxOCwgMHgyMiwgMHg3NSwgMHg4OSwgMHgwMiwgMHhlNCwKKzB4ZjUsIDB4OGMsIDB4ZjUsIDB4OGEsIDB4ZjUsIDB4ODgsIDB4ZjUsIDB4YjgsIDB4ZjUsIDB4ZTgsIDB4NzUsIDB4OTAsIDB4MTgsIDB4ZDIsIDB4OGMsIDB4NzUsCisweGE4LCAweDA1LCAweDIyLCAweGNlLCAweGVmLCAweGNlLCAweGVlLCAweDYwLCAweDA4LCAweDdmLCAweGZmLCAweDEyLCAweDAzLCAweDgwLCAweDFlLCAweDgwLAorMHhmNSwgMHgyMiwgMHhjOCwgMHhlZiwgMHhjOCwgMHhlNiwgMHg2MCwgMHgwMywgMHgxNiwgMHhjMywgMHgyMiwgMHhlZCwgMHgxNCwgMHhmNiwgMHhkMywgMHgyMiwKKzB4YzgsIDB4ZWYsIDB4YzgsIDB4ZTYsIDB4NjAsIDB4MDYsIDB4MTYsIDB4ZTYsIDB4MjQsIDB4ZmYsIDB4YjMsIDB4MjIsIDB4YzMsIDB4MjIsIDB4NzgsIDB4N2YsCisweGU0LCAweGY2LCAweGQ4LCAweGZkLCAweDc1LCAweDgxLCAweDVmLCAweDAyLCAweDAxLCAweGQwLCAweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHgyMiwgMHhlZiwgMHg5MCwgMHgwMywgMHg3ZSwgMHg5MywgMHg5MCwgMHgwMywgMHgwMCwgMHg3MywgMHgwYSwgMHgxOCwKKzB4ZWYsIDB4NjAsIDB4MDMsIDB4MWYsIDB4ODAsIDB4ZmEsIDB4MjIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxMCwgMHgyOCwgMHgwMiwgMHgxMCwgMHgzYiwgMHgwMiwgMHgxMCwgMHgzYywgMHgwMiwgMHgxMiwgMHhiOCwgMHgwMiwKKzB4MTIsIDB4YjksIDB4MDIsIDB4MTMsIDB4M2UsIDB4MDIsIDB4MTMsIDB4M2YsIDB4YzMsIDB4MjIsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MTYsIDB4NTYsIDB4MDIsCisweDE3LCAweDZiLCAweDAyLCAweDE0LCAweDJhLCAweDAyLCAweDEzLCAweDQwLCAweDMwLCAweDA1LCAweDA2LCAweDIwLCAweDBkLCAweDAzLCAweDEyLCAweDAwLAorMHhkOCwgMHgzMCwgMHgwNiwgMHgwNiwgMHgyMCwgMHgwZSwgMHgwMywgMHgxMiwgMHgxOCwgMHg1ZSwgMHgyMiwgMHgyMiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwKKzB4MjAsIDB4ZTcsIDB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4OTAsIDB4NzAsIDB4MTIsIDB4ZTAsIDB4ZjUsIDB4NTYsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsCisweDEyLCAweDAyLCAweDY3LCAweDExLCAweDRlLCAweDMwLCAweDExLCAweDI1LCAweDMxLCAweDEwLCAweDg3LCAweDMzLCAweDEwLCAweGFhLCAweDM0LCAweDEwLAorMHhjMywgMHgzNSwgMHgxMSwgMHg1NywgMHg1MCwgMHgxMSwgMHg3YiwgMHg1MSwgMHgxMSwgMHg4NCwgMHg1MiwgMHgxMSwgMHg4NCwgMHg1MywgMHgxMSwgMHg4NCwKKzB4NTQsIDB4MTEsIDB4YzUsIDB4NTUsIDB4MTEsIDB4ZGMsIDB4NzAsIDB4MTIsIDB4MDcsIDB4NzEsIDB4MTIsIDB4MzQsIDB4NzIsIDB4MTIsIDB4NWUsIDB4ODAsCisweDEyLCAweDgxLCAweDgzLCAweDAwLCAweDAwLCAweDEyLCAweGI3LCAweDc1LCAweDI0LCAweDA1LCAweDc1LCAweDI1LCAweGRjLCAweDkwLCAweDcwLCAweDlmLAorMHg3NCwgMHgxMiwgMHhmMCwgMHhkMiwgMHgxOCwgMHhkMiwgMHg2MSwgMHg3NSwgMHgzNSwgMHgwZCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwKKzB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4MDIsIDB4MTIsIDB4YWEsIDB4YzIsIDB4MTgsIDB4OTAsIDB4MDEsIDB4MTQsIDB4ZTAsCisweDU0LCAweGZkLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweGI3LAorMHgwMiwgMHgxMiwgMHhhYSwgMHhlNSwgMHg1NSwgMHg2NCwgMHgwMiwgMHg3MCwgMHgzNywgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg2MCwgMHgwOCwgMHg5MCwKKzB4MDEsIDB4MGQsIDB4NzQsIDB4MDksIDB4ZjAsIDB4ODAsIDB4MjUsIDB4ZTUsIDB4MzQsIDB4MTQsIDB4NjAsIDB4MGEsIDB4MTQsIDB4NjAsIDB4MGYsIDB4MTQsCisweDYwLCAweDE0LCAweDI0LCAweDAzLCAweDcwLCAweDE2LCAweDkwLCAweDAxLCAweDBkLCAweDc0LCAweDA4LCAweGYwLCAweDgwLCAweDBlLCAweDkwLCAweDAxLAorMHgwZCwgMHg3NCwgMHgwYiwgMHhmMCwgMHg4MCwgMHgwNiwgMHg5MCwgMHgwMSwgMHgwZCwgMHg3NCwgMHgxYiwgMHhmMCwgMHg3ZCwgMHgwMSwgMHg4MCwgMHgwMiwKKzB4N2QsIDB4MDIsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MWIsIDB4OTAsCisweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLAorMHgxMiwgMHhiNywgMHgwMiwgMHgxMiwgMHhhYSwgMHgyMCwgMHgwMiwgMHgwMywgMHgzMCwgMHgwMywgMHgxZCwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg1NiwgMHgxMiwKKzB4MDIsIDB4OGQsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsCisweDcwLCAweDAzLCAweDAyLCAweDEyLCAweGI3LCAweDAyLCAweDEyLCAweGFhLCAweDg1LCAweDU2LCAweDQxLCAweGQyLCAweDAyLCAweDIyLCAweDkwLCAweDcwLAorMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHgxYiwgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHg2NCwgMHgwMiwgMHg2MCwKKzB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDgsIDB4ZTAsIDB4NjQsIDB4MjAsIDB4NjAsCisweDAzLCAweDAyLCAweDEyLCAweGI3LCAweDc1LCAweDRlLCAweDAzLCAweDc1LCAweDRmLCAweDIwLCAweDIyLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDI0LAorMHhmZiwgMHg5MiwgMHg0NywgMHgyMiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNSwgMHhlMCwgMHgyNCwgMHg1ZCwgMHhmNSwgMHg1NywgMHg5MCwgMHg3MCwKKzB4MTAsIDB4ZTAsIDB4ZmYsIDB4NzQsIDB4NDcsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmYsCisweDc0LCAweDQ4LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLAorMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwKKzB4MTIsIDB4YjcsIDB4MDIsIDB4MTIsIDB4YWEsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDcsIDB4MDgsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4NTQsIDB4MDcsCisweGY1LCAweDI2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweGQyLCAweDA0LCAweDIyLCAweDkwLCAweDcwLCAweDEwLCAweGUwLAorMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmOCwgMHhlNiwgMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwMiwKKzB4OGQsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsCisweDAzLCAweDAyLCAweDEyLCAweGI3LCAweDAyLCAweDEyLCAweGFhLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLAorMHhmZCwgMHhlZCwgMHhmNSwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwgMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwMiwgMHg4ZCwgMHg5MCwKKzB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsCisweDEyLCAweGI3LCAweDgwLCAweDc2LCAweGU0LCAweGY1LCAweDRlLCAweGY1LCAweDRmLCAweDc1LCAweDI2LCAweGZmLCAweGMyLCAweDE5LCAweGMyLCAweDE4LAorMHhjMiwgMHgxYSwgMHg3NSwgMHgzNCwgMHhmZiwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwgMHgxMiwgMHgwMiwgMHg4ZCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwKKzB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NjAsIDB4NWIsIDB4ODAsIDB4NGMsIDB4OTAsIDB4NzAsCisweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDRhLCAweGQyLCAweDA1LCAweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLAorMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgzOCwgMHg4MCwKKzB4MjksIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZjUsIDB4MzQsIDB4ZDMsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MDcsIDB4OTAsIDB4MDEsIDB4MGQsIDB4ZTAsCisweDU0LCAweGZiLCAweGYwLCAweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLAorMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgwZCwgMHg5MCwgMHg3MCwgMHgyNSwgMHhlMCwgMHg0NCwgMHgwMSwKKzB4ZjAsIDB4OTAsIDB4MDIsIDB4MmMsIDB4NzQsIDB4ZmYsIDB4ZjAsIDB4MjIsIDB4MjIsIDB4ZTUsIDB4NTMsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4M2QsCisweGU1LCAweDRmLCAweDQ1LCAweDRlLCAweDYwLCAweDA4LCAweGU1LCAweDRmLCAweDE1LCAweDRmLCAweDcwLCAweDAyLCAweDE1LCAweDRlLCAweGEyLCAweDE5LAorMHhlNCwgMHgzMywgMHg5MCwgMHg3MCwgMHg5MCwgMHhmMCwgMHhhMiwgMHgxOCwgMHhlNCwgMHgzMywgMHhhMywgMHhmMCwgMHgzMCwgMHgxOSwgMHg0ZCwgMHg5MCwKKzB4NzAsIDB4OTgsIDB4NzQsIDB4MjMsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4MjUsIDB4ZjAsIDB4ZTUsIDB4MjQsIDB4YTMsIDB4ZjAsIDB4N2YsIDB4MzUsIDB4N2QsCisweDMyLCAweDEyLCAweDAzLCAweDQyLCAweDUwLCAweDA5LCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGY3LCAweGYwLCAweGQyLCAweDA2LCAweGU1LAorMHgzNSwgMHhkMywgMHg5NCwgMHgxMCwgMHg0MCwgMHgxZSwgMHgzMCwgMHgxYSwgMHgxYiwgMHhjMiwgMHgxYSwgMHhhMiwgMHgxOCwgMHg5MiwgMHgxOSwgMHgyMCwKKzB4MTksIDB4MTIsIDB4OTAsIDB4MDQsIDB4MDksIDB4ZTAsIDB4NTQsIDB4ZGQsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MDgsIDB4ZjAsCisweGMyLCAweDYxLCAweGQyLCAweDAzLCAweGU1LCAweDM1LCAweGI0LCAweDBiLCAweDE0LCAweGQyLCAweDAzLCAweDIyLCAweGU0LCAweGY1LCAweDM1LCAweGEyLAorMHgxOCwgMHg5MiwgMHgxOSwgMHgzMCwgMHgxOSwgMHgwNywgMHg5MCwgMHgwNCwgMHgwOSwgMHhlMCwgMHg0NCwgMHgyMiwgMHhmMCwgMHgyMiwgMHgyMiwgMHgyMiwKKzB4YzIsIDB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MDIsIDB4NjcsIDB4MTMsIDB4NjIsIDB4MDAsIDB4MTMsIDB4ZjUsIDB4MDQsIDB4MTMsCisweGYxLCAweDA4LCAweDEzLCAweGNjLCAweDEwLCAweDEzLCAweDc2LCAweDIwLCAweDEzLCAweDk2LCAweDYwLCAweDEzLCAweGE3LCAweGEwLCAweDAwLCAweDAwLAorMHgxMywgMHhmNywgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwgMHg4NSwgMHg0YywgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg2MCwKKzB4MDMsIDB4MDIsIDB4MTMsIDB4ZjcsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGEsIDB4YzQsCisweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLAorMHg2NiwgMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg2MSwgMHg4NSwgMHg0OSwgMHg0MywgMHg4NSwgMHg0YiwgMHg0MiwgMHg4NSwgMHg0ZCwgMHg1ZSwgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NTIsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDksIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGIsCisweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LAorMHg3MCwgMHgzNSwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgyYiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNCwKKzB4MDYsIDB4NTMsIDB4NWUsIDB4ZmIsIDB4NzUsIDB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsIDB4NWUsIDB4MDQsIDB4NzUsCisweDQyLCAweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLCAweGY1LCAweDQzLCAweDgwLAorMHgwNiwgMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgzOCwgMHhlNSwgMHg0MiwgMHhjNCwgMHg1NCwgMHhmMCwgMHhmZiwKKzB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4OTAsIDB4NzAsIDB4NDQsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NWUsIDB4ZjAsIDB4YTMsCisweGU1LCAweDRhLCAweGYwLCAweGEzLCAweGU1LCAweDQ4LCAweGYwLCAweGEzLCAweGU1LCAweDRjLCAweGYwLCAweGEzLCAweGU1LCAweDQ0LCAweGYwLCAweGEzLAorMHhlNSwgMHg0MiwgMHhmMCwgMHhhMywgMHhlNSwgMHg0MywgMHhmMCwgMHhkMiwgMHg2MCwgMHgyMiwgMHhlNSwgMHg0NywgMHg2MCwgMHgxMCwgMHgyNCwgMHhjMCwKKzB4NzAsIDB4MDMsIDB4MTIsIDB4MTYsIDB4MzYsIDB4MTIsIDB4MTQsIDB4M2YsIDB4YzIsIDB4YWYsIDB4YzIsIDB4MDQsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsCisweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDU0LCAweDBlLCAweDYwLCAweDA0LCAweGQyLCAweDFjLCAweDgwLCAweDA4LCAweGU1LCAweDRlLCAweDQ1LAorMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgxYywgMHhkMiwgMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHhhMiwgMHhlNCwgMHg5MiwgMHgxZCwgMHg3NCwKKzB4MWUsIDB4ZjAsIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4MmQsIDB4ZTUsIDB4MzgsIDB4NzAsIDB4MTMsIDB4MzAsIDB4MWMsIDB4MDUsIDB4ZTUsCisweDVmLCAweDIwLCAweGU1LCAweDBiLCAweDMwLCAweDFkLCAweDE5LCAweGU1LCAweDVmLCAweDU0LCAweDMwLCAweGZmLCAweGJmLCAweDMwLCAweDExLCAweGU1LAorMHgzOCwgMHg3MCwgMHgwNSwgMHg3NSwgMHgzOCwgMHgwYywgMHg4MCwgMHgwMiwgMHgxNSwgMHgzOCwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwZiwKKzB4ZTUsIDB4NWYsIDB4MzAsIDB4ZTYsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDQsIDB4ZDIsIDB4NmMsIDB4YzIsIDB4NmQsIDB4ZTUsCisweDQ3LCAweDY0LCAweDAzLCAweDcwLCAweDIxLCAweDMwLCAweDRiLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDE4LCAweGU1LCAweDM4LAorMHg3MCwgMHgwMywgMHgzMCwgMHg0YywgMHgxMSwgMHhjMiwgMHg0YywgMHhlNSwgMHgzOCwgMHg3MCwgMHgwNSwgMHg3NSwgMHgzOCwgMHgwNywgMHg4MCwgMHgwMiwKKzB4MTUsIDB4MzgsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4OTAsIDB4NzAsIDB4NDYsIDB4ZTUsIDB4MmQsIDB4ZjAsIDB4MjAsIDB4NjksIDB4MDcsIDB4ZTUsCisweDVlLCAweDIwLCAweGUwLCAweDAyLCAweGIyLCAweDY4LCAweDIwLCAweDZiLCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUxLCAweDAyLCAweGIyLCAweDZhLAorMHgyMCwgMHg2ZCwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwMiwgMHhiMiwgMHg2YywgMHg5MCwgMHg3MCwgMHg0NywgMHhlNSwgMHgyZCwgMHhmMCwKKzB4NzUsIDB4MmUsIDB4NDAsIDB4MjAsIDB4NjksIDB4MDQsIDB4YTIsIDB4NjgsIDB4ODAsIDB4MTUsIDB4MzAsIDB4NjgsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsCisweGUzLCAweDgwLCAweDBjLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZmLCAweGJmLCAweGYwLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLAorMHg3MywgMHg5MiwgMHg3MiwgMHgyMCwgMHg2YiwgMHgwNCwgMHhhMiwgMHg2YSwgMHg4MCwgMHgxNSwgMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwKKzB4ZTMsIDB4ODAsIDB4MGMsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4YmYsIDB4ZjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsCisweDc1LCAweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LCAweGEyLCAweDZjLCAweDgwLCAweDE1LCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLAorMHhlMywgMHg4MCwgMHgwYywgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZiwgMHhiZiwgMHhmMCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwKKzB4NzEsIDB4OTIsIDB4NzAsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZTUsIDB4MmUsIDB4ZjAsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NDYsIDB4OTAsCisweDAyLCAweDI5LCAweGUwLCAweDU0LCAweGZlLCAweGYwLCAweGU1LCAweDQzLCAweGM0LCAweDU0LCAweDBmLCAweDE0LCAweDYwLCAweDE0LCAweDI0LCAweGZlLAorMHg2MCwgMHgxZiwgMHgyNCwgMHgwMywgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgzNSwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwgMHgzMCwgMHg0NywgMHgwZCwKKzB4ODAsIDB4MDcsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4MjAsIDB4NDcsIDB4MDQsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4MjIsIDB4NDQsIDB4MDEsIDB4ZjAsCisweDIyLCAweGU1LCAweDQ2LCAweDMwLCAweGUzLCAweDA0LCAweDdmLCAweDAxLCAweDgwLCAweDAyLCAweDdmLCAweDAwLCAweDkwLCAweDAyLCAweDI4LCAweGUwLAorMHg1NCwgMHhmZSwgMHg0ZiwgMHhmMCwgMHgyMiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNywgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgzNSwgMHhmNSwgMHgyNywKKzB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4ZjAsIDB4ZTUsIDB4MjYsIDB4MTQsIDB4NjAsIDB4MjYsIDB4MTQsIDB4NjAsIDB4MmUsIDB4MTQsCisweDYwLCAweDM2LCAweDI0LCAweDAzLCAweDcwLCAweDVmLCAweGU1LCAweDQ2LCAweDEzLCAweDEzLCAweDEzLCAweDU0LCAweDFmLCAweDc1LCAweGYwLCAweDAzLAorMHg4NCwgMHhhZiwgMHhmMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwgMHgwMCwgMHhlZiwgMHg2ZSwgMHgyNCwgMHhmZiwKKzB4ODAsIDB4MDIsIDB4YTIsIDB4NDcsIDB4OTIsIDB4MzksIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsIDB4MzgsIDB4ODAsIDB4M2YsIDB4ZTUsIDB4NDYsIDB4MzAsCisweGUzLCAweDAzLCAweGQzLCAweDgwLCAweDI3LCAweGMzLCAweDgwLCAweDI0LCAweGU1LCAweDQ2LCAweDMwLCAweGUzLCAweDBkLCAweDU0LCAweDcwLCAweGMzLAorMHg5NCwgMHg2MCwgMHg1MCwgMHgwNiwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgyMCwgMHg0NywKKzB4MDQsIDB4N2QsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2QsIDB4MDAsIDB4ZWYsIDB4NmQsIDB4NGUsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MzgsIDB4YTIsIDB4NDcsCisweGIzLCAweDkyLCAweDM5LCAweDgwLCAweDA3LCAweGEyLCAweDQ3LCAweGIzLCAweDkyLCAweDM4LCAweDkyLCAweDM5LCAweDkwLCAweDAyLCAweDI4LCAweGUwLAorMHg1NCwgMHhmYywgMHg0NSwgMHgyNywgMHhmMCwgMHgyMiwgMHhlNCwgMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHg0NSwKKzB4ODAsIDB4MDQsIDB4ZTUsIDB4NDUsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OGYsIDB4NTAsIDB4ZDIsIDB4NTksCisweDIyLCAweDhmLCAweDU0LCAweGQyLCAweDU4LCAweDIyLCAweGU0LCAweGY1LCAweDMwLCAweGMyLCAweGFmLCAweGU1LCAweDUxLCAweDE0LCAweDYwLCAweDRhLAorMHgxNCwgMHg2MCwgMHg2YSwgMHgyNCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNywgMHg0YywgMHhkMiwgMHg1OSwgMHg3NSwgMHg1NSwgMHgwMSwgMHgyMCwKKzB4MTksIDB4MWMsIDB4OTAsIDB4MDIsIDB4MDgsIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4ZTAsIDB4MjAsIDB4ZTEsIDB4MjMsIDB4OTAsIDB4MDQsIDB4MzQsCisweGUwLCAweGI0LCAweDAyLCAweDFjLCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDE3LCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDEyLCAweDdmLCAweDIwLAorMHgxMiwgMHgxNiwgMHg0YywgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmMywgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMSwgMHgwMiwgMHgxNywgMHg0YywKKzB4ZTUsIDB4NTAsIDB4NzAsIDB4MDYsIDB4NzUsIDB4MzAsIDB4MDMsIDB4MDIsIDB4MTcsIDB4NGMsIDB4OTAsIDB4MTIsIDB4MDAsIDB4ZTAsIDB4NTQsIDB4MDMsCisweDcwLCAweDE1LCAweDdmLCAweDIwLCAweDEyLCAweDE2LCAweDRjLCAweDIwLCAweDE5LCAweDA3LCAweDkwLCAweDAyLCAweDA4LCAweGUwLCAweDU0LCAweGZiLAorMHhmMCwgMHg3NSwgMHg1MSwgMHgwMiwgMHgwMiwgMHgxNywgMHg0YywgMHhlNSwgMHg1MCwgMHg3MCwgMHgwMiwgMHg4MCwgMHg3YSwgMHgyMCwgMHgxOSwgMHgwZiwKKzB4OTAsIDB4MDIsIDB4MDgsIDB4ZTAsIDB4MjAsIDB4ZTMsIDB4NmMsIDB4OTAsIDB4MDQsIDB4MzcsIDB4ZTAsIDB4NjQsIDB4MjIsIDB4NzAsIDB4NjQsIDB4OTAsCisweDEyLCAweDA0LCAweDc0LCAweDBhLCAweGYwLCAweDMwLCAweDFiLCAweDExLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLAorMHhlMCwgMHg1NCwgMHhmMCwgMHhmMCwgMHhhMywgMHhlMCwgMHg1NCwgMHhmYSwgMHhmMCwgMHgyMCwgMHgxOSwgMHgwNywgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwKKzB4NDQsIDB4MTAsIDB4ZjAsIDB4ZTUsIDB4MzQsIDB4ZjQsIDB4OTAsIDB4MDQsIDB4MDEsIDB4NjAsIDB4MDYsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4ODAsCisweDA0LCAweGUwLCAweDU0LCAweGY5LCAweGYwLCAweDIwLCAweDE5LCAweDA3LCAweDkwLCAweDEyLCAweDA0LCAweGUwLCAweDQ0LCAweDA0LCAweGYwLCAweGU1LAorMHgzNCwgMHhmNCwgMHg2MCwgMHgxNCwgMHg5MCwgMHgwMSwgMHgwZCwgMHhlMCwgMHhmNSwgMHgzMywgMHhlNSwgMHgzNCwgMHhkMywgMHg5NCwgMHgwMiwgMHg0MCwKKzB4MDcsIDB4OTAsIDB4MTIsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZmQsIDB4ZjAsIDB4NzUsIDB4MzAsIDB4MDEsIDB4NzUsIDB4NTUsIDB4MDIsIDB4ZTQsIDB4ZjUsCisweDUxLCAweDgwLCAweDA5LCAweGU1LCAweDUwLCAweDcwLCAweDA1LCAweDc1LCAweDMwLCAweDAzLCAweGY1LCAweDUxLCAweGU1LCAweDMwLCAweDYwLCAweDE4LAorMHhjMiwgMHgwMSwgMHhlNCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwgMHgyMCwgMHgxOSwgMHgwZSwgMHhhZCwgMHgzMCwgMHhhZiwgMHg0MCwgMHgxMiwgMHgxOCwKKzB4MmEsIDB4ZTUsIDB4MzAsIDB4YjQsIDB4MDMsIDB4MDIsIDB4ZDIsIDB4MDMsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsIDB4YWYsIDB4MzAsIDB4MDEsIDB4MGUsCisweGU0LCAweGY1LCAweDUxLCAweGMyLCAweDU5LCAweGMyLCAweDAxLCAweDdkLCAweDAyLCAweGFmLCAweDQwLCAweDEyLCAweDE4LCAweDJhLCAweGU1LCAweDUyLAorMHgxNCwgMHg2MCwgMHg1NSwgMHgxNCwgMHg2MCwgMHgyZiwgMHgyNCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxOCwgMHgyNywgMHhlNSwgMHgzNCwgMHhmNCwKKzB4NjAsIDB4MjMsIDB4ZTUsIDB4MzQsIDB4ZDMsIDB4OTQsIDB4MDIsIDB4NDAsIDB4MTYsIDB4OTAsIDB4MTIsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MDIsIDB4ZjAsCisweDkwLCAweDAxLCAweDBkLCAweGUwLCAweDIwLCAweGUzLCAweDAzLCAweDAyLCAweDE4LCAweDI3LCAweDdmLCAweDUwLCAweDEyLCAweDE2LCAweDUxLCAweDc1LAorMHg1MiwgMHgwMiwgMHg3NSwgMHg1NSwgMHgwMywgMHhlNSwgMHgzNCwgMHhmNCwgMHg2MCwgMHgwYSwgMHhlNSwgMHg1NCwgMHg3MCwgMHg2OSwgMHg5MCwgMHgwMSwKKzB4MGQsIDB4ZTUsIDB4MzMsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTYsIDB4NTEsCisweDc1LCAweDUyLCAweDAxLCAweDc1LCAweDU1LCAweDAzLCAweDgwLCAweDRmLCAweGU1LCAweDU0LCAweDcwLCAweDRiLCAweDkwLCAweDA0LCAweDAxLCAweGUwLAorMHg0NCwgMHgwZSwgMHhmMCwgMHgyMCwgMHgxOSwgMHgwNCwgMHhlMCwgMHg1NCwgMHhlZiwgMHhmMCwgMHg5MCwgMHgxMywgMHgyOCwgMHhlMCwgMHg0NCwgMHgwZiwKKzB4ZjAsIDB4YTMsIDB4ZTAsIDB4NDQsIDB4MGYsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NDQsIDB4MDUsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4NzQsIDB4MDMsCisweGYwLCAweDIwLCAweDE5LCAweDA3LCAweDkwLCAweDAyLCAweDA4LCAweGUwLCAweDQ0LCAweDA1LCAweGYwLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDQ0LAorMHgwYywgMHhmMCwgMHhlNCwgMHhmNSwgMHg1MiwgMHhmNSwgMHg1NSwgMHgzMCwgMHgwMiwgMHgwYiwgMHhjMiwgMHgwMiwgMHg3ZCwgMHgwMSwgMHhhZiwgMHg0MSwKKzB4MTIsIDB4MTgsIDB4MmEsIDB4ODAsIDB4MDIsIDB4YzIsIDB4MDMsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4ZWYsIDB4ZjQsIDB4NjAsIDB4MmQsIDB4ZTQsIDB4ZmUsCisweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGUwLCAweGI0LCAweGZmLCAweDE5LCAweDc0LCAweDE0LAorMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZiwgMHhmMCwgMHg3NCwgMHgxYywgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwKKzB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsIDB4MDQsIDB4ZDUsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjAsIDB4MTksCisweDAzLCAweDAyLCAweDE5LCAweDBmLCAweDkwLCAweDcwLCAweDgwLCAweGUwLCAweDA0LCAweGYwLCAweDkwLCAweDA0LCAweDM3LCAweGUwLCAweDMwLCAweGU1LAorMHgwMywgMHgwMiwgMHgxOSwgMHgwYiwgMHg5MCwgMHgwNCwgMHgyOCwgMHhlMCwgMHhmNSwgMHgzMSwgMHhhMywgMHhlMCwgMHhmNSwgMHgzMCwgMHhmNSwgMHgzMiwKKzB4ZTQsIDB4ZjUsIDB4MzcsIDB4OTAsIDB4NzAsIDB4ODEsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4ODIsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4ZTUsCisweDMyLCAweDc1LCAweGYwLCAweDgwLCAweGE0LCAweDI0LCAweDAwLCAweGZmLCAweGU1LCAweGYwLCAweDM0LCAweDgwLCAweGZlLCAweGU1LCAweDMwLCAweDY1LAorMHgzMiwgMHg3MCwgMHgwNSwgMHhmYywgMHg3ZCwgMHgxOCwgMHg4MCwgMHgwNCwgMHg3YywgMHgwMCwgMHg3ZCwgMHgwMCwgMHhlZiwgMHgyZCwgMHhmZiwgMHhlZSwKKzB4M2MsIDB4ZmUsIDB4MTIsIDB4MTksIDB4MTAsIDB4NTAsIDB4MjUsIDB4OTAsIDB4NzAsIDB4ODMsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4MTQsCisweGUwLCAweDQ0LCAweDAyLCAweGYwLCAweGUwLCAweDMwLCAweGUxLCAweDA2LCAweDkwLCAweDcwLCAweDkyLCAweDc0LCAweDQ1LCAweGYwLCAweDkwLCAweDcwLAorMHg5MywgMHhlMCwgMHgwNCwgMHhmMCwgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwgMHg5MCwgMHg3MCwgMHg5NCwgMHhmMCwgMHhlNSwgMHgzMiwgMHg2NSwgMHgzMSwKKzB4NjAsIDB4MTAsIDB4ZTQsIDB4MjUsIDB4MzIsIDB4ZmYsIDB4ZTQsIDB4MzQsIDB4ODAsIDB4OGYsIDB4ODIsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4ZjUsIDB4MzIsCisweDgwLCAweDk3LCAweDkwLCAweDA0LCAweDEwLCAweDc0LCAweDAxLCAweGYwLCAweDkwLCAweDA0LCAweDI4LCAweGU1LCAweDMxLCAweGYwLCAweGEzLCAweGU1LAorMHgzMCwgMHhmMCwgMHg5MCwgMHgwNCwgMHgxMSwgMHg3NCwgMHgwMSwgMHhmMCwgMHgwMiwgMHgxOCwgMHg2YSwgMHhjMiwgMHgwNiwgMHhkMiwgMHgxYSwgMHgyMiwKKzB4OTAsIDB4NzAsIDB4ODQsIDB4ZTUsIDB4MzcsIDB4ZjAsIDB4YzMsIDB4OTQsIDB4MDYsIDB4NTAsIDB4MTksIDB4OGYsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsCisweGI0LCAweGZmLCAweDA3LCAweDA1LCAweDM3LCAweGU0LCAweGY1LCAweDM2LCAweDgwLCAweDU5LCAweGU0LCAweGY1LCAweDM3LCAweDhmLCAweDgyLCAweDhlLAorMHg4MywgMHhmMCwgMHg4MCwgMHg0ZiwgMHhlNSwgMHgzNiwgMHg3NSwgMHhmMCwgMHgwNiwgMHg4NCwgMHg3NCwgMHgwOCwgMHgyNSwgMHhmMCwgMHhmNSwgMHg4MiwKKzB4ZTQsIDB4MzQsIDB4MTAsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4ZmQsIDB4OGYsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsIDB4ZmMsIDB4NmQsIDB4NzAsIDB4MzAsCisweDkwLCAweDcwLCAweDg4LCAweGUwLCAweDA0LCAweGYwLCAweGEzLCAweGUwLCAweGZkLCAweGQzLCAweDk1LCAweDM3LCAweDQwLCAweDAyLCAweDgwLCAweDAyLAorMHhhZCwgMHgzNywgMHg5MCwgMHg3MCwgMHg4OSwgMHhlZCwgMHhmMCwgMHgwNSwgMHgzNywgMHgwNSwgMHgzNiwgMHhlNSwgMHgzNiwgMHg3NSwgMHhmMCwgMHgwNiwKKzB4ODQsIDB4NzQsIDB4OGEsIDB4MjUsIDB4ZjAsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWMsIDB4ZjAsIDB4ODAsIDB4MDMsCisweGU0LCAweGY1LCAweDM3LCAweDBmLCAweGJmLCAweDAwLCAweDAxLCAweDBlLCAweGVmLCAweDU0LCAweDdmLCAweDYwLCAweDBhLCAweGU1LCAweDM3LCAweGMzLAorMHg5NCwgMHg0ZSwgMHg1MCwgMHgwMywgMHgwMiwgMHgxOSwgMHgxMCwgMHhlNSwgMHgzNywgMHhiNCwgMHg0ZSwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywKKzB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYiwgMHg5NCwgMHhlYiwgfSA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tZDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDc3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tZDUuYwpAQCAtMCwwICsxLDE0MjcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgbWQ1LmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlqYW4JCQkxMC0yOC0wMwkJSW5pdGlhbAorCVJpdGEgICAgCTExLTIzLTA0CQlNb2RpZnkgTUQ1IGFuZCBTSEEtMQorCVJpdGEJCTEwLTE0LTA1CQlNb2RpZnkgU0hBLTEgaW4gYmlnLWVuZGlhbiBwbGF0Zm9ybQorICovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qKgorICogbWQ1X21hYzoKKyAqIEBrZXk6IHBvaW50ZXIgdG8JdGhlCWtleQl1c2VkIGZvciBNQUMgZ2VuZXJhdGlvbgorICogQGtleV9sZW46IGxlbmd0aAlvZiB0aGUga2V5IGluIGJ5dGVzCisgKiBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSBhcmVhIGZvciB3aGljaCB0aGUgTUFDIGlzCWdlbmVyYXRlZAorICogQGRhdGFfbGVuOiBsZW5ndGggb2YJdGhlCWRhdGEgaW4JYnl0ZXMKKyAqIEBtYWM6IHBvaW50ZXIgdG8JdGhlCWJ1ZmZlciBob2xkaW5nIHNwYWNlIGZvciB0aGUgTUFDOyB0aGUgYnVmZmVyIHNob3VsZAorICogaGF2ZQlzcGFjZSBmb3IgMTI4LWJpdCAoMTYgYnl0ZXMpIE1ENSBoYXNoIHZhbHVlCisgKgorICogbWQ1X21hYygpIGRldGVybWluZXMJdGhlCW1lc3NhZ2UJYXV0aGVudGljYXRpb24gY29kZQlieSB1c2luZyBzZWN1cmUJaGFzaAorICogTUQ1KGtleSB8IGRhdGEgfAlrZXkpLgorICovCit2b2lkIG1kNV9tYWModTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpCit7CisJTUQ1X0NUWAljb250ZXh0OworCisJTUQ1SW5pdCgmY29udGV4dCk7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrZXksIGtleV9sZW4pOworCU1ENVVwZGF0ZSgmY29udGV4dCwJZGF0YSwgZGF0YV9sZW4pOworCU1ENVVwZGF0ZSgmY29udGV4dCwJa2V5LCBrZXlfbGVuKTsKKwlNRDVGaW5hbChtYWMsICZjb250ZXh0KTsKK30KKworLyoqCisgKiBobWFjX21kNToKKyAqIEBrZXk6IHBvaW50ZXIgdG8JdGhlCWtleQl1c2VkIGZvciBNQUMgZ2VuZXJhdGlvbgorICogQGtleV9sZW46IGxlbmd0aAlvZiB0aGUga2V5IGluIGJ5dGVzCisgKiBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSBhcmVhIGZvciB3aGljaCB0aGUgTUFDIGlzCWdlbmVyYXRlZAorICogQGRhdGFfbGVuOiBsZW5ndGggb2YJdGhlCWRhdGEgaW4JYnl0ZXMKKyAqIEBtYWM6IHBvaW50ZXIgdG8JdGhlCWJ1ZmZlciBob2xkaW5nIHNwYWNlIGZvciB0aGUgTUFDOyB0aGUgYnVmZmVyIHNob3VsZAorICogaGF2ZQlzcGFjZSBmb3IgMTI4LWJpdCAoMTYgYnl0ZXMpIE1ENSBoYXNoIHZhbHVlCisgKgorICogaG1hY19tZDUoKSBkZXRlcm1pbmVzIHRoZSBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uCWNvZGUgdXNpbmcgSE1BQy1NRDUuCisgKiBUaGlzCWltcGxlbWVudGF0aW9uIGlzIGJhc2VkCW9uIHRoZSBzYW1wbGUgY29kZSBwcmVzZW50ZWQgaW4JUkZDCTIxMDQuCisgKi8KK3ZvaWQgaG1hY19tZDUodTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpCit7CisJTUQ1X0NUWAljb250ZXh0OworICAgIHU4IGtfaXBhZFs2NV07IC8qIGlubmVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIGlwYWQgKi8KKyAgICB1OCBrX29wYWRbNjVdOyAvKiBvdXRlciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBvcGFkICovCisgICAgdTggdGtbMTZdOworCWludAlpOworCisJLy9hc3NlcnQoa2V5ICE9IE5VTEwgJiYgZGF0YSAhPSBOVUxMICYmIG1hYyAhPSBOVUxMKTsKKworCS8qIGlmIGtleSBpcyBsb25nZXIJdGhhbiA2NAlieXRlcyByZXNldAlpdCB0byBrZXkgPQlNRDUoa2V5KSAqLworCWlmIChrZXlfbGVuCT4gNjQpIHsKKwkJTUQ1X0NUWAl0dGNvbnRleHQ7CisKKwkJTUQ1SW5pdCgmdHRjb250ZXh0KTsKKwkJTUQ1VXBkYXRlKCZ0dGNvbnRleHQsIGtleSwga2V5X2xlbik7CisJCU1ENUZpbmFsKHRrLCAmdHRjb250ZXh0KTsKKwkJLy9rZXk9KFBVQ0hBUil0dGNvbnRleHQuYnVmOworCQlrZXkJPSB0azsKKwkJa2V5X2xlbgk9IDE2OworCX0KKworCS8qIHRoZSBITUFDX01ENQl0cmFuc2Zvcm0gbG9va3MJbGlrZToKKwkgKgorCSAqIE1ENShLIFhPUiBvcGFkLCBNRDUoSyBYT1IgaXBhZCwgdGV4dCkpCisJICoKKwkgKiB3aGVyZSBLIGlzIGFuIG4gYnl0ZQlrZXkKKwkgKiBpcGFkCWlzIHRoZSBieXRlCTB4MzYgcmVwZWF0ZWQgNjQgdGltZXMKKwkgKiBvcGFkCWlzIHRoZSBieXRlCTB4NWMgcmVwZWF0ZWQgNjQgdGltZXMKKwkgKiBhbmQgdGV4dAlpcyB0aGUgZGF0YQliZWluZyBwcm90ZWN0ZWQJKi8KKworCS8qIHN0YXJ0IG91dCBieQlzdG9yaW5nCWtleQlpbiBwYWRzCSovCisJTmRpc1plcm9NZW1vcnkoa19pcGFkLCBzaXplb2Yoa19pcGFkKSk7CisJTmRpc1plcm9NZW1vcnkoa19vcGFkLAlzaXplb2Yoa19vcGFkKSk7CisJLy9hc3NlcnQoa2V5X2xlbiA8IHNpemVvZihrX2lwYWQpKTsKKwlOZGlzTW92ZU1lbW9yeShrX2lwYWQsIGtleSwJa2V5X2xlbik7CisJTmRpc01vdmVNZW1vcnkoa19vcGFkLCBrZXksCWtleV9sZW4pOworCisJLyogWE9SIGtleSB3aXRoCWlwYWQgYW5kIG9wYWQgdmFsdWVzICovCisJZm9yCShpID0gMDsJaSA8CTY0OwlpKyspIHsKKwkJa19pcGFkW2ldIF49IDB4MzY7CisJCWtfb3BhZFtpXSBePSAweDVjOworCX0KKworCS8qIHBlcmZvcm0gaW5uZXIgTUQ1ICovCisJTUQ1SW5pdCgmY29udGV4dCk7CQkJCQkgLyoJaW5pdCBjb250ZXh0IGZvciAxc3QgcGFzcyAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJa19pcGFkLAk2NCk7CSAvKglzdGFydCB3aXRoIGlubmVyIHBhZCAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJZGF0YSwgZGF0YV9sZW4pOyAvKgl0aGVuIHRleHQgb2YgZGF0YWdyYW0gKi8KKwlNRDVGaW5hbChtYWMsICZjb250ZXh0KTsJCQkgLyoJZmluaXNoIHVwIDFzdCBwYXNzICovCisKKwkvKiBwZXJmb3JtIG91dGVyIE1ENSAqLworCU1ENUluaXQoJmNvbnRleHQpOwkJCQkJIC8qCWluaXQgY29udGV4dCBmb3IgMm5kIHBhc3MgKi8KKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtfb3BhZCwJNjQpOwkgLyoJc3RhcnQgd2l0aCBvdXRlciBwYWQgKi8KKwlNRDVVcGRhdGUoJmNvbnRleHQsCW1hYywgMTYpOwkJIC8qCXRoZW4gcmVzdWx0cyBvZgkxc3QJaGFzaCAqLworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwkJCSAvKglmaW5pc2ggdXAgMm5kIHBhc3MgKi8KK30KKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisjZGVmaW5lIGJ5dGVSZXZlcnNlKGJ1ZiwgbGVuKSAgIC8qIE5vdGhpbmcgKi8KKyNlbHNlCit2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpOwordm9pZCBieXRlUmV2ZXJzZSh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmdzKQoreworICAgIGRvIHsKKyAgICAgICAgKihVSU5UMzIgKilidWYgPSBTV0FQMzIoKihVSU5UMzIgKilidWYpOworICAgICAgICBidWYgKz0gNDsKKyAgICB9IHdoaWxlICgtLWxvbmdzKTsKK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09ICBNRDUgaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvLyBmb3VyIGJhc2UgZnVuY3Rpb25zIGZvciBNRDUKKyNkZWZpbmUgTUQ1X0YxKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICgofngpICYgKHopKSkKKyNkZWZpbmUgTUQ1X0YyKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiAofnopKSkKKyNkZWZpbmUgTUQ1X0YzKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisjZGVmaW5lIE1ENV9GNCh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8ICh+eikpKQorI2RlZmluZSBDWUNMSUNfTEVGVF9TSElGVCh3LCBzKSAoKCh3KSA8PCAocykpIHwgKCh3KSA+PiAoMzItKHMpKSkpCisKKyNkZWZpbmUJTUQ1U3RlcChmLCB3LCB4LCB5LAl6LCBkYXRhLCB0LCBzKQlcCisJKCB3CSs9IGYoeCwJeSwgeikgKwlkYXRhICsgdCwgIHcgPSAoQ1lDTElDX0xFRlRfU0hJRlQodywgcykpICYgMHhmZmZmZmZmZiwgdyArPQl4ICkKKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBJbml0aWF0ZSBNRDUgQ29udGV4dCBzYXRpc2ZpZWQgaW4gUkZDIDEzMjEKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBwQ3R4ICAgICAgICBQb2ludGVyCXRvIE1ENSBjb250ZXh0CisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICovCitWT0lEIE1ENUluaXQoTUQ1X0NUWCAqcEN0eCkKK3sKKyAgICBwQ3R4LT5CdWZbMF09MHg2NzQ1MjMwMTsKKyAgICBwQ3R4LT5CdWZbMV09MHhlZmNkYWI4OTsKKyAgICBwQ3R4LT5CdWZbMl09MHg5OGJhZGNmZTsKKyAgICBwQ3R4LT5CdWZbM109MHgxMDMyNTQ3NjsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF09MDsKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdPTA7Cit9CisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgVXBkYXRlIE1ENSBDb250ZXh0LCBhbGxvdyBvZiBhbiBhcnJhcnkgb2Ygb2N0ZXRzIGFzIHRoZSBuZXh0IHBvcnRpb24KKyAqICAgICAgb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBwQ3R4CQlQb2ludGVyCXRvIE1ENSBjb250ZXh0CisgKiAJICAgIHBEYXRhICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICogICAgICBMZW5JbkJ5dGVzICBUaGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKHVuaXQ6IGJ5dGUpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYWZ0ZXIgTUQ1SW5pdCBvciBNRDVVcGRhdGUoaXRzZWxmKQorICovCitWT0lEIE1ENVVwZGF0ZShNRDVfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKQoreworCisgICAgVUlOVDMyIFRmVGltZXM7CisgICAgVUlOVDMyIHRlbXA7CisJdW5zaWduZWQgaW50IGk7CisKKyAgICB0ZW1wID0gcEN0eC0+TGVuSW5CaXRDb3VudFswXTsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFswXSArIChMZW5JbkJ5dGVzIDw8IDMpKTsKKworICAgIGlmIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdIDwgdGVtcCkKKyAgICAgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSsrOyAgIC8vY2FycnkgaW4KKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0gKz0gTGVuSW5CeXRlcyA+PiAyOTsKKworICAgIC8vIG1vZCA2NCBieXRlcworICAgIHRlbXAgPSAodGVtcCA+PiAzKSAmIDB4M2Y7CisKKyAgICAvLyBwcm9jZXNzIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQorICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgVUNIQVIgKnBBZHMgPSAoVUNIQVIgKikgcEN0eC0+SW5wdXQgKyB0ZW1wOworCisgICAgICAgIGlmICgodGVtcCtMZW5JbkJ5dGVzKSA8IDY0KQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgNjQtdGVtcCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKyAgICAgICAgcERhdGEgKz0gNjQtdGVtcDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NC10ZW1wOworICAgIH0gLy8gZW5kIG9mIGlmICh0ZW1wKQorCisKKyAgICBUZlRpbWVzID0gKExlbkluQnl0ZXMgPj4gNik7CisKKyAgICBmb3IgKGk9VGZUaW1lczsgaT4wOyBpLS0pCisgICAgeworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIDY0KTsKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICAgICAgcERhdGEgKz0gNjQ7CisgICAgICAgIExlbkluQnl0ZXMgLT0gNjQ7CisgICAgfSAvLyBlbmQgb2YgZm9yCisKKyAgICAvLyBidWZmZXJpbmcgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYoTGVuSW5CeXRlcykKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKworfQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIEFwcGVuZCBwYWRkaW5nIGJpdHMgYW5kIGxlbmd0aCBvZiBvcmlnaW5hbCBtZXNzYWdlIGluIHRoZSB0YWlsCisgKiAgICAgIFRoZSBtZXNzYWdlIGRpZ2VzdCBoYXMgdG8gYmUgY29tcGxldGVkIGluIHRoZSBlbmQKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBEaWdlc3QJCU91dHB1dCBvZiBEaWdlc3QtTWVzc2FnZSBmb3IgTUQ1CisgKiAgCXBDdHggICAgICAgIFBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBNRDVVcGRhdGUKKyAqLworVk9JRCBNRDVGaW5hbChVQ0hBUiBEaWdlc3RbMTZdLCBNRDVfQ1RYICpwQ3R4KQoreworICAgIFVDSEFSIFJlbWFpbmRlcjsKKyAgICBVQ0hBUiBQYWRMZW5JbkJ5dGVzOworICAgIFVDSEFSICpwQXBwZW5kPTA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBSZW1haW5kZXIgPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IDMpICYgMHgzZik7CisKKyAgICBQYWRMZW5JbkJ5dGVzID0gKFJlbWFpbmRlciA8IDU2KSA/ICg1Ni1SZW1haW5kZXIpIDogKDEyMC1SZW1haW5kZXIpOworCisgICAgcEFwcGVuZCA9IChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyOworCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGhvdXQgY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBpZiAoUmVtYWluZGVyIDwgNTYpCisgICAgeworICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkLCBmcm9tIGxvdyB0byBoaWdoCisgICAgICAgCWZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IChpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+IChpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgCX0KKworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgIH0gLy8gZW5kIG9mIGlmCisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIHRoZSBmaXJzdCBibG9jayA9PT0KKyAgICAgICAgKnBBcHBlbmQgPSAweDgwOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsICg2NC1SZW1haW5kZXItMSkpOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC09ICg2NCAtIFJlbWFpbmRlciAtIDEpOworCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKworICAgICAgICAvLyB0aGUgc2Vjb25kIGJsb2NrID09PQorICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgUGFkTGVuSW5CeXRlcyk7CisKKyAgICAgICAgLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IChpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+IChpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgCX0KKworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgIH0gLy8gZW5kIG9mIGVsc2UKKworCisgICAgTmRpc01vdmVNZW1vcnkoKFVDSEFSICopRGlnZXN0LCAoVUlOVDMyICopcEN0eC0+QnVmLCAxNik7IC8vIG91dHB1dAorICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKURpZ2VzdCwgNCk7CisgICAgTmRpc1plcm9NZW1vcnkocEN0eCwgc2l6ZW9mKHBDdHgpKTsgLy8gbWVtb3J5IGZyZWUKK30KKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBUaGUgY2VudHJhbCBhbGdvcml0aG0gb2YgTUQ1LCBjb25zaXN0cyBvZiBmb3VyIHJvdW5kcyBhbmQgc2l4dGVlbgorICogIAlzdGVwcyBwZXIgcm91bmQKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBCdWYgICAgIEJ1ZmZlcnMgb2YgZm91ciBzdGF0ZXMgKG91dHB1dDogMTYgYnl0ZXMpCisgKiAJICAgIE1lcyAgICAgSW5wdXQgZGF0YSAoaW5wdXQ6IDY0IGJ5dGVzKQorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGJ5IE1ENVVwZGF0ZSBvciBNRDVGaW5hbAorICovCitWT0lEIE1ENVRyYW5zZm9ybShVSU5UMzIgQnVmWzRdLCBVSU5UMzIgTWVzWzE2XSkKK3sKKyAgICBVSU5UMzIgUmVnWzRdLCBUZW1wOworCXVuc2lnbmVkIGludCBpOworCisgICAgc3RhdGljIFVDSEFSIExTaGlmdFZhbFsxNl0gPQorICAgIHsKKyAgICAgICAgNywgMTIsIDE3LCAyMiwKKwkJNSwgOSAsIDE0LCAyMCwKKwkJNCwgMTEsIDE2LCAyMywKKyAJCTYsIDEwLCAxNSwgMjEsCisgCX07CisKKworCS8vIFtlcXVhbCB0byA0Mjk0OTY3Mjk2KmFicyhzaW4oaW5kZXgpKV0KKyAgICBzdGF0aWMgVUlOVDMyIE1ENVRhYmxlWzY0XSA9CisJeworCQkweGQ3NmFhNDc4LAkweGU4YzdiNzU2LAkweDI0MjA3MGRiLAkweGMxYmRjZWVlLAorCQkweGY1N2MwZmFmLAkweDQ3ODdjNjJhLAkweGE4MzA0NjEzLCAweGZkNDY5NTAxLAorCQkweDY5ODA5OGQ4LAkweDhiNDRmN2FmLAkweGZmZmY1YmIxLAkweDg5NWNkN2JlLAorICAgIAkweDZiOTAxMTIyLAkweGZkOTg3MTkzLAkweGE2Nzk0MzhlLAkweDQ5YjQwODIxLAorCisgICAgCTB4ZjYxZTI1NjIsCTB4YzA0MGIzNDAsCTB4MjY1ZTVhNTEsCTB4ZTliNmM3YWEsCisgICAgCTB4ZDYyZjEwNWQsCTB4MDI0NDE0NTMsCTB4ZDhhMWU2ODEsCTB4ZTdkM2ZiYzgsCisgICAgCTB4MjFlMWNkZTYsCTB4YzMzNzA3ZDYsCTB4ZjRkNTBkODcsCTB4NDU1YTE0ZWQsCisgICAgCTB4YTllM2U5MDUsCTB4ZmNlZmEzZjgsCTB4Njc2ZjAyZDksCTB4OGQyYTRjOGEsCisKKyAgICAJMHhmZmZhMzk0MiwJMHg4NzcxZjY4MSwJMHg2ZDlkNjEyMiwJMHhmZGU1MzgwYywKKyAgICAJMHhhNGJlZWE0NCwJMHg0YmRlY2ZhOSwJMHhmNmJiNGI2MCwJMHhiZWJmYmM3MCwKKyAgICAJMHgyODliN2VjNiwJMHhlYWExMjdmYSwJMHhkNGVmMzA4NSwJMHgwNDg4MWQwNSwKKyAgICAJMHhkOWQ0ZDAzOSwJMHhlNmRiOTllNSwJMHgxZmEyN2NmOCwJMHhjNGFjNTY2NSwKKworICAgIAkweGY0MjkyMjQ0LAkweDQzMmFmZjk3LAkweGFiOTQyM2E3LAkweGZjOTNhMDM5LAorICAgCQkweDY1NWI1OWMzLAkweDhmMGNjYzkyLAkweGZmZWZmNDdkLAkweDg1ODQ1ZGQxLAorICAgIAkweDZmYTg3ZTRmLAkweGZlMmNlNmUwLAkweGEzMDE0MzE0LAkweDRlMDgxMWExLAorICAgIAkweGY3NTM3ZTgyLAkweGJkM2FmMjM1LAkweDJhZDdkMmJiLAkweGViODZkMzkxCisJfTsKKworCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICBSZWdbaV09QnVmW2ldOworCisKKyAgICAvLyA2NCBzdGVwcyBpbiBNRDUgYWxnb3JpdGhtCisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0YxLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1tpXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsW2kgJiAweDNdKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorICAgIGZvciAoaT0xNjsgaTwzMjsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWyg1KihpICYgMHhmKSsxKSAmIDB4Zl0sCisgICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFsoMHgxIDw8IDIpKyhpICYgMHgzKV0pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisgICAgZm9yIChpPTMyOyBpPDQ4OyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GMywgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDMqKGkgJiAweGYpKzUpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDEgPDwgMykrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKyAgICBmb3IgKGk9NDg7IGk8NjQ7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0Y0LCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soNyooaSAmIDB4ZikpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDMgPDwgMikrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKworCisgICAgLy8gKHRlbXBvcmFyeSlvdXRwdXQKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIEJ1ZltpXSArPSBSZWdbaV07CisKK30KKworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT0gIFNIQS0xIGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvLyBmb3VyIGJhc2UgZnVuY3Rpb25zIGZvciBTSEEtMQorI2RlZmluZSBTSEExX0YxKGIsIGMsIGQpICAgICgoKGIpICYgKGMpKSB8ICgofmIpICYgKGQpKSkKKyNkZWZpbmUgU0hBMV9GMihiLCBjLCBkKSAgICAoKGIpIF4gKGMpIF4gKGQpKQorI2RlZmluZSBTSEExX0YzKGIsIGMsIGQpICAgICgoKGIpICYgKGMpKSB8ICgoYikgJiAoZCkpIHwgKChjKSAmIChkKSkpCisKKworI2RlZmluZSBTSEExU3RlcChmLCBhLCBiLCBjLCBkLCBlLCB3LCBrKSAgICBcCisgICAgKCBlCSs9ICggZihiLCBjLCBkKSArIHcgKyBrICsgQ1lDTElDX0xFRlRfU0hJRlQoYSwgNSkpICYgMHhmZmZmZmZmZiwgXAorICAgICAgYiA9IENZQ0xJQ19MRUZUX1NISUZUKGIsIDMwKSApCisKKy8vSW5pdGlhdGUgU0hBLTEgQ29udGV4dCBzYXRpc2ZpZWQgaW4gUkZDIDMxNzQKK1ZPSUQgU0hBSW5pdChTSEFfQ1RYICpwQ3R4KQoreworICAgIHBDdHgtPkJ1ZlswXT0weDY3NDUyMzAxOworICAgIHBDdHgtPkJ1ZlsxXT0weGVmY2RhYjg5OworICAgIHBDdHgtPkJ1ZlsyXT0weDk4YmFkY2ZlOworICAgIHBDdHgtPkJ1ZlszXT0weDEwMzI1NDc2OworICAgIHBDdHgtPkJ1Zls0XT0weGMzZDJlMWYwOworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXT0wOworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV09MDsKK30KKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgVXBkYXRlIFNIQS0xIENvbnRleHQsIGFsbG93IG9mIGFuIGFycmFyeSBvZiBvY3RldHMgYXMgdGhlIG5leHQKKyAqICAgICAgcG9ydGlvbiBvZiB0aGUgbWVzc2FnZQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHgJCVBvaW50ZXIJdG8gU0hBLTEgY29udGV4dAorICogCSAgICBwRGF0YSAgICAgICBQb2ludGVyIHRvIGlucHV0IGRhdGEKKyAqICAgICAgTGVuSW5CeXRlcyAgVGhlIGxlbmd0aCBvZiBpbnB1dCBkYXRhICh1bml0OiBieXRlKQorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIGVycm9yICAgICAgIGluZGljYXRlIG1vcmUgdGhhbiBwb3coMiw2NCkgYml0cyBvZiBkYXRhCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBTSEFJbml0IG9yIFNIQVVwZGF0ZShpdHNlbGYpCisgKi8KK1VDSEFSIFNIQVVwZGF0ZShTSEFfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKQoreworICAgIFVJTlQzMiBUZlRpbWVzOworICAgIFVJTlQzMiB0ZW1wMSx0ZW1wMjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlVQ0hBUiBlcnI9MTsKKworICAgIHRlbXAxID0gcEN0eC0+TGVuSW5CaXRDb3VudFswXTsKKyAgICB0ZW1wMiA9IHBDdHgtPkxlbkluQml0Q291bnRbMV07CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gKyAoTGVuSW5CeXRlcyA8PCAzKSk7CisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPCB0ZW1wMSkKKyAgICAgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSsrOyAgIC8vY2FycnkgaW4KKworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzFdICsoTGVuSW5CeXRlcyA+PiAyOSkpOworICAgIGlmIChwQ3R4LT5MZW5JbkJpdENvdW50WzFdIDwgdGVtcDIpCisgICAgICAgIHJldHVybiAoZXJyKTsgICAvL2NoZWNrIHRvdGFsIGxlbmd0aCBvZiBvcmlnaW5hbCBkYXRhCisKKworICAgIC8vIG1vZCA2NCBieXRlcworICAgIHRlbXAxID0gKHRlbXAxID4+IDMpICYgMHgzZjsKKworICAgIC8vIHByb2Nlc3MgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYgKHRlbXAxKQorICAgIHsKKyAgICAgICAgVUNIQVIgKnBBZHMgPSAoVUNIQVIgKikgcEN0eC0+SW5wdXQgKyB0ZW1wMTsKKworICAgICAgICBpZiAoKHRlbXAxK0xlbkluQnl0ZXMpIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgNjQtdGVtcDEpOworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworICAgICAgICBwRGF0YSArPSA2NC10ZW1wMTsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NC10ZW1wMTsKKyAgICB9IC8vIGVuZCBvZiBpZiAodGVtcDEpCisKKworICAgIFRmVGltZXMgPSAoTGVuSW5CeXRlcyA+PiA2KTsKKworICAgIGZvciAoaT1UZlRpbWVzOyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgNjQpOworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICAgICAgcERhdGEgKz0gNjQ7CisgICAgICAgIExlbkluQnl0ZXMgLT0gNjQ7CisgICAgfSAvLyBlbmQgb2YgZm9yCisKKyAgICAvLyBidWZmZXJpbmcgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYoTGVuSW5CeXRlcykKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKworCXJldHVybiAoMCk7CisKK30KKworLy8gQXBwZW5kIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoIG9mIG9yaWdpbmFsIG1lc3NhZ2UgaW4gdGhlIHRhaWwKKy8vIFRoZSBtZXNzYWdlIGRpZ2VzdCBoYXMgdG8gYmUgY29tcGxldGVkIGluIHRoZSBlbmQKK1ZPSUQgU0hBRmluYWwoU0hBX0NUWCAqcEN0eCwgVUNIQVIgRGlnZXN0WzIwXSkKK3sKKyAgICBVQ0hBUiBSZW1haW5kZXI7CisgICAgVUNIQVIgUGFkTGVuSW5CeXRlczsKKyAgICBVQ0hBUiAqcEFwcGVuZD0wOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgUmVtYWluZGVyID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAzKSAmIDB4M2YpOworCisgICAgcEFwcGVuZCA9IChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyOworCisgICAgUGFkTGVuSW5CeXRlcyA9IChSZW1haW5kZXIgPCA1NikgPyAoNTYtUmVtYWluZGVyKSA6ICgxMjAtUmVtYWluZGVyKTsKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRob3V0IGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgaWYgKFJlbWFpbmRlciA8IDU2KQorICAgIHsKKyAgICAgICAgKnBBcHBlbmQgPSAweDgwOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsIFBhZExlbkluQnl0ZXMpOworCisJCS8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZCwgZnJvbSBoaWdoIHRvIGxvdworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgCX0KKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNCk7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgaWYKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRoIGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gdGhlIGZpcnN0IGJsb2NrID09PQorICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgKDY0LVJlbWFpbmRlci0xKSk7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLT0gKDY0IC0gUmVtYWluZGVyIC0gMSk7CisKKyAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisKKyAgICAgICAgLy8gdGhlIHNlY29uZCBibG9jayA9PT0KKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQsIFBhZExlbkluQnl0ZXMpOworCisJCS8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZAorCQlmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgCX0KKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgZWxzZQorCisKKyAgICAvL091dHB1dCwgYnl0ZXJldmVyc2UKKyAgICBmb3IgKGk9MDsgaTwyMDsgaSsrKQorICAgIHsKKyAgICAgICAgRGlnZXN0IFtpXSA9IChVQ0hBUikocEN0eC0+QnVmW2k+PjJdID4+IDgqKDMtKGkgJiAweDMpKSk7CisgICAgfQorCisgICAgTmRpc1plcm9NZW1vcnkocEN0eCwgc2l6ZW9mKHBDdHgpKTsgLy8gbWVtb3J5IGZyZWUKK30KKworCisvLyBUaGUgY2VudHJhbCBhbGdvcml0aG0gb2YgU0hBLTEsIGNvbnNpc3RzIG9mIGZvdXIgcm91bmRzIGFuZAorLy8gdHdlbnR5IHN0ZXBzIHBlciByb3VuZAorVk9JRCBTSEFUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls1XSwgVUlOVDMyIE1lc1syMF0pCit7CisgICAgVUlOVDMyIFJlZ1s1XSxUZW1wOworCXVuc2lnbmVkIGludCBpOworICAgIFVJTlQzMiBXWzgwXTsKKworICAgIHN0YXRpYyBVSU5UMzIgU0hBMVRhYmxlWzRdID0geyAweDVhODI3OTk5LCAweDZlZDllYmExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGYxYmJjZGMsIDB4Y2E2MmMxZDYgfTsKKworICAgIFJlZ1swXT1CdWZbMF07CisJUmVnWzFdPUJ1ZlsxXTsKKwlSZWdbMl09QnVmWzJdOworCVJlZ1szXT1CdWZbM107CisJUmVnWzRdPUJ1Zls0XTsKKworICAgIC8vdGhlIGZpcnN0IG9jdGV0IG9mIGEgd29yZCBpcyBzdG9yZWQgaW4gdGhlIDB0aCBlbGVtZW50LCBieXRlcmV2ZXJzZQorCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgIAlXW2ldICA9IChNZXNbaV0gPj4gMjQpICYgMHhmZjsKKyAgICAgICAgV1tpXSB8PSAoTWVzW2ldID4+IDggKSAmIDB4ZmYwMDsKKyAgICAgICAgV1tpXSB8PSAoTWVzW2ldIDw8IDggKSAmIDB4ZmYwMDAwOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPDwgMjQpICYgMHhmZjAwMDAwMDsKKyAgICB9CisKKworICAgIGZvcgkoaSA9IDA7IGkgPCA2NDsgaSsrKQorCSAgICBXWzE2K2ldID0gQ1lDTElDX0xFRlRfU0hJRlQoV1tpXSBeIFdbMitpXSBeIFdbOCtpXSBeIFdbMTMraV0sIDEpOworCisKKyAgICAvLyA4MCBzdGVwcyBpbiBTSEEtMSBhbGdvcml0aG0KKyAgICBmb3IgKGk9MDsgaTw4MDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGk8MjApCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YxLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVswXSk7CisKKyAgICAgICAgZWxzZSBpZiAoaT49MjAgJiYgaTw0MCkKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzFdKTsKKworCQllbHNlIGlmIChpPj00MCAmJiBpPDYwKQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMywgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzJdKTsKKworICAgICAgICBlbHNlCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YyLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVszXSk7CisKKworICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisJCVRlbXAgICA9IFJlZ1s0XTsKKyAgICAgICAgUmVnWzRdID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworCisgICAgfSAvLyBlbmQgb2YgZm9yLWxvb3AKKworCisgICAgLy8gKHRlbXBvcmFyeSlvdXRwdXQKKyAgICBmb3IgKGk9MDsgaTw1OyBpKyspCisgICAgICAgIEJ1ZltpXSArPSBSZWdbaV07CisKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICBBRVMgRW4vRGVjcnlwdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBmb3J3YXJkIFMtYm94ICovCitzdGF0aWMgdWludDMyIEZTYlsyNTZdID0KK3sKKwkweDYzLCAweDdDLAkweDc3LCAweDdCLAkweEYyLCAweDZCLAkweDZGLCAweEM1LAorCTB4MzAsIDB4MDEsCTB4NjcsIDB4MkIsCTB4RkUsIDB4RDcsCTB4QUIsIDB4NzYsCisJMHhDQSwgMHg4MiwJMHhDOSwgMHg3RCwJMHhGQSwgMHg1OSwJMHg0NywgMHhGMCwKKwkweEFELCAweEQ0LAkweEEyLCAweEFGLAkweDlDLCAweEE0LAkweDcyLCAweEMwLAorCTB4QjcsIDB4RkQsCTB4OTMsIDB4MjYsCTB4MzYsIDB4M0YsCTB4RjcsIDB4Q0MsCisJMHgzNCwgMHhBNSwJMHhFNSwgMHhGMSwJMHg3MSwgMHhEOCwJMHgzMSwgMHgxNSwKKwkweDA0LCAweEM3LAkweDIzLCAweEMzLAkweDE4LCAweDk2LAkweDA1LCAweDlBLAorCTB4MDcsIDB4MTIsCTB4ODAsIDB4RTIsCTB4RUIsIDB4MjcsCTB4QjIsIDB4NzUsCisJMHgwOSwgMHg4MywJMHgyQywgMHgxQSwJMHgxQiwgMHg2RSwJMHg1QSwgMHhBMCwKKwkweDUyLCAweDNCLAkweEQ2LCAweEIzLAkweDI5LCAweEUzLAkweDJGLCAweDg0LAorCTB4NTMsIDB4RDEsCTB4MDAsIDB4RUQsCTB4MjAsIDB4RkMsCTB4QjEsIDB4NUIsCisJMHg2QSwgMHhDQiwJMHhCRSwgMHgzOSwJMHg0QSwgMHg0QywJMHg1OCwgMHhDRiwKKwkweEQwLCAweEVGLAkweEFBLCAweEZCLAkweDQzLCAweDRELAkweDMzLCAweDg1LAorCTB4NDUsIDB4RjksCTB4MDIsIDB4N0YsCTB4NTAsIDB4M0MsCTB4OUYsIDB4QTgsCisJMHg1MSwgMHhBMywJMHg0MCwgMHg4RiwJMHg5MiwgMHg5RCwJMHgzOCwgMHhGNSwKKwkweEJDLCAweEI2LAkweERBLCAweDIxLAkweDEwLCAweEZGLAkweEYzLCAweEQyLAorCTB4Q0QsIDB4MEMsCTB4MTMsIDB4RUMsCTB4NUYsIDB4OTcsCTB4NDQsIDB4MTcsCisJMHhDNCwgMHhBNywJMHg3RSwgMHgzRCwJMHg2NCwgMHg1RCwJMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLAkweDRGLCAweERDLAkweDIyLCAweDJBLAkweDkwLCAweDg4LAorCTB4NDYsIDB4RUUsCTB4QjgsIDB4MTQsCTB4REUsIDB4NUUsCTB4MEIsIDB4REIsCisJMHhFMCwgMHgzMiwJMHgzQSwgMHgwQSwJMHg0OSwgMHgwNiwJMHgyNCwgMHg1QywKKwkweEMyLCAweEQzLAkweEFDLCAweDYyLAkweDkxLCAweDk1LAkweEU0LCAweDc5LAorCTB4RTcsIDB4QzgsCTB4MzcsIDB4NkQsCTB4OEQsIDB4RDUsCTB4NEUsIDB4QTksCisJMHg2QywgMHg1NiwJMHhGNCwgMHhFQSwJMHg2NSwgMHg3QSwJMHhBRSwgMHgwOCwKKwkweEJBLCAweDc4LAkweDI1LCAweDJFLAkweDFDLCAweEE2LAkweEI0LCAweEM2LAorCTB4RTgsIDB4REQsCTB4NzQsIDB4MUYsCTB4NEIsIDB4QkQsCTB4OEIsIDB4OEEsCisJMHg3MCwgMHgzRSwJMHhCNSwgMHg2NiwJMHg0OCwgMHgwMywJMHhGNiwgMHgwRSwKKwkweDYxLCAweDM1LAkweDU3LCAweEI5LAkweDg2LCAweEMxLAkweDFELCAweDlFLAorCTB4RTEsIDB4RjgsCTB4OTgsIDB4MTEsCTB4NjksIDB4RDksCTB4OEUsIDB4OTQsCisJMHg5QiwgMHgxRSwJMHg4NywgMHhFOSwJMHhDRSwgMHg1NSwJMHgyOCwgMHhERiwKKwkweDhDLCAweEExLAkweDg5LCAweDBELAkweEJGLCAweEU2LAkweDQyLCAweDY4LAorCTB4NDEsIDB4OTksCTB4MkQsIDB4MEYsCTB4QjAsIDB4NTQsCTB4QkIsIDB4MTYKK307CisKKy8qIGZvcndhcmQgdGFibGUgKi8KKyNkZWZpbmUJRlQgXAorXAorCVYoQzYsNjMsNjMsQTUpLAlWKEY4LDdDLDdDLDg0KSwJVihFRSw3Nyw3Nyw5OSksCVYoRjYsN0IsN0IsOEQpLAlcCisJVihGRixGMixGMiwwRCksCVYoRDYsNkIsNkIsQkQpLAlWKERFLDZGLDZGLEIxKSwJVig5MSxDNSxDNSw1NCksCVwKKwlWKDYwLDMwLDMwLDUwKSwJVigwMiwwMSwwMSwwMyksCVYoQ0UsNjcsNjcsQTkpLAlWKDU2LDJCLDJCLDdEKSwJXAorCVYoRTcsRkUsRkUsMTkpLAlWKEI1LEQ3LEQ3LDYyKSwJVig0RCxBQixBQixFNiksCVYoRUMsNzYsNzYsOUEpLAlcCisJVig4RixDQSxDQSw0NSksCVYoMUYsODIsODIsOUQpLAlWKDg5LEM5LEM5LDQwKSwJVihGQSw3RCw3RCw4NyksCVwKKwlWKEVGLEZBLEZBLDE1KSwJVihCMiw1OSw1OSxFQiksCVYoOEUsNDcsNDcsQzkpLAlWKEZCLEYwLEYwLDBCKSwJXAorCVYoNDEsQUQsQUQsRUMpLAlWKEIzLEQ0LEQ0LDY3KSwJVig1RixBMixBMixGRCksCVYoNDUsQUYsQUYsRUEpLAlcCisJVigyMyw5Qyw5QyxCRiksCVYoNTMsQTQsQTQsRjcpLAlWKEU0LDcyLDcyLDk2KSwJVig5QixDMCxDMCw1QiksCVwKKwlWKDc1LEI3LEI3LEMyKSwJVihFMSxGRCxGRCwxQyksCVYoM0QsOTMsOTMsQUUpLAlWKDRDLDI2LDI2LDZBKSwJXAorCVYoNkMsMzYsMzYsNUEpLAlWKDdFLDNGLDNGLDQxKSwJVihGNSxGNyxGNywwMiksCVYoODMsQ0MsQ0MsNEYpLAlcCisJVig2OCwzNCwzNCw1QyksCVYoNTEsQTUsQTUsRjQpLAlWKEQxLEU1LEU1LDM0KSwJVihGOSxGMSxGMSwwOCksCVwKKwlWKEUyLDcxLDcxLDkzKSwJVihBQixEOCxEOCw3MyksCVYoNjIsMzEsMzEsNTMpLAlWKDJBLDE1LDE1LDNGKSwJXAorCVYoMDgsMDQsMDQsMEMpLAlWKDk1LEM3LEM3LDUyKSwJVig0NiwyMywyMyw2NSksCVYoOUQsQzMsQzMsNUUpLAlcCisJVigzMCwxOCwxOCwyOCksCVYoMzcsOTYsOTYsQTEpLAlWKDBBLDA1LDA1LDBGKSwJVigyRiw5QSw5QSxCNSksCVwKKwlWKDBFLDA3LDA3LDA5KSwJVigyNCwxMiwxMiwzNiksCVYoMUIsODAsODAsOUIpLAlWKERGLEUyLEUyLDNEKSwJXAorCVYoQ0QsRUIsRUIsMjYpLAlWKDRFLDI3LDI3LDY5KSwJVig3RixCMixCMixDRCksCVYoRUEsNzUsNzUsOUYpLAlcCisJVigxMiwwOSwwOSwxQiksCVYoMUQsODMsODMsOUUpLAlWKDU4LDJDLDJDLDc0KSwJVigzNCwxQSwxQSwyRSksCVwKKwlWKDM2LDFCLDFCLDJEKSwJVihEQyw2RSw2RSxCMiksCVYoQjQsNUEsNUEsRUUpLAlWKDVCLEEwLEEwLEZCKSwJXAorCVYoQTQsNTIsNTIsRjYpLAlWKDc2LDNCLDNCLDREKSwJVihCNyxENixENiw2MSksCVYoN0QsQjMsQjMsQ0UpLAlcCisJVig1MiwyOSwyOSw3QiksCVYoREQsRTMsRTMsM0UpLAlWKDVFLDJGLDJGLDcxKSwJVigxMyw4NCw4NCw5NyksCVwKKwlWKEE2LDUzLDUzLEY1KSwJVihCOSxEMSxEMSw2OCksCVYoMDAsMDAsMDAsMDApLAlWKEMxLEVELEVELDJDKSwJXAorCVYoNDAsMjAsMjAsNjApLAlWKEUzLEZDLEZDLDFGKSwJVig3OSxCMSxCMSxDOCksCVYoQjYsNUIsNUIsRUQpLAlcCisJVihENCw2QSw2QSxCRSksCVYoOEQsQ0IsQ0IsNDYpLAlWKDY3LEJFLEJFLEQ5KSwJVig3MiwzOSwzOSw0QiksCVwKKwlWKDk0LDRBLDRBLERFKSwJVig5OCw0Qyw0QyxENCksCVYoQjAsNTgsNTgsRTgpLAlWKDg1LENGLENGLDRBKSwJXAorCVYoQkIsRDAsRDAsNkIpLAlWKEM1LEVGLEVGLDJBKSwJVig0RixBQSxBQSxFNSksCVYoRUQsRkIsRkIsMTYpLAlcCisJVig4Niw0Myw0MyxDNSksCVYoOUEsNEQsNEQsRDcpLAlWKDY2LDMzLDMzLDU1KSwJVigxMSw4NSw4NSw5NCksCVwKKwlWKDhBLDQ1LDQ1LENGKSwJVihFOSxGOSxGOSwxMCksCVYoMDQsMDIsMDIsMDYpLAlWKEZFLDdGLDdGLDgxKSwJXAorCVYoQTAsNTAsNTAsRjApLAlWKDc4LDNDLDNDLDQ0KSwJVigyNSw5Riw5RixCQSksCVYoNEIsQTgsQTgsRTMpLAlcCisJVihBMiw1MSw1MSxGMyksCVYoNUQsQTMsQTMsRkUpLAlWKDgwLDQwLDQwLEMwKSwJVigwNSw4Riw4Riw4QSksCVwKKwlWKDNGLDkyLDkyLEFEKSwJVigyMSw5RCw5RCxCQyksCVYoNzAsMzgsMzgsNDgpLAlWKEYxLEY1LEY1LDA0KSwJXAorCVYoNjMsQkMsQkMsREYpLAlWKDc3LEI2LEI2LEMxKSwJVihBRixEQSxEQSw3NSksCVYoNDIsMjEsMjEsNjMpLAlcCisJVigyMCwxMCwxMCwzMCksCVYoRTUsRkYsRkYsMUEpLAlWKEZELEYzLEYzLDBFKSwJVihCRixEMixEMiw2RCksCVwKKwlWKDgxLENELENELDRDKSwJVigxOCwwQywwQywxNCksCVYoMjYsMTMsMTMsMzUpLAlWKEMzLEVDLEVDLDJGKSwJXAorCVYoQkUsNUYsNUYsRTEpLAlWKDM1LDk3LDk3LEEyKSwJVig4OCw0NCw0NCxDQyksCVYoMkUsMTcsMTcsMzkpLAlcCisJVig5MyxDNCxDNCw1NyksCVYoNTUsQTcsQTcsRjIpLAlWKEZDLDdFLDdFLDgyKSwJVig3QSwzRCwzRCw0NyksCVwKKwlWKEM4LDY0LDY0LEFDKSwJVihCQSw1RCw1RCxFNyksCVYoMzIsMTksMTksMkIpLAlWKEU2LDczLDczLDk1KSwJXAorCVYoQzAsNjAsNjAsQTApLAlWKDE5LDgxLDgxLDk4KSwJVig5RSw0Riw0RixEMSksCVYoQTMsREMsREMsN0YpLAlcCisJVig0NCwyMiwyMiw2NiksCVYoNTQsMkEsMkEsN0UpLAlWKDNCLDkwLDkwLEFCKSwJVigwQiw4OCw4OCw4MyksCVwKKwlWKDhDLDQ2LDQ2LENBKSwJVihDNyxFRSxFRSwyOSksCVYoNkIsQjgsQjgsRDMpLAlWKDI4LDE0LDE0LDNDKSwJXAorCVYoQTcsREUsREUsNzkpLAlWKEJDLDVFLDVFLEUyKSwJVigxNiwwQiwwQiwxRCksCVYoQUQsREIsREIsNzYpLAlcCisJVihEQixFMCxFMCwzQiksCVYoNjQsMzIsMzIsNTYpLAlWKDc0LDNBLDNBLDRFKSwJVigxNCwwQSwwQSwxRSksCVwKKwlWKDkyLDQ5LDQ5LERCKSwJVigwQywwNiwwNiwwQSksCVYoNDgsMjQsMjQsNkMpLAlWKEI4LDVDLDVDLEU0KSwJXAorCVYoOUYsQzIsQzIsNUQpLAlWKEJELEQzLEQzLDZFKSwJVig0MyxBQyxBQyxFRiksCVYoQzQsNjIsNjIsQTYpLAlcCisJVigzOSw5MSw5MSxBOCksCVYoMzEsOTUsOTUsQTQpLAlWKEQzLEU0LEU0LDM3KSwJVihGMiw3OSw3OSw4QiksCVwKKwlWKEQ1LEU3LEU3LDMyKSwJVig4QixDOCxDOCw0MyksCVYoNkUsMzcsMzcsNTkpLAlWKERBLDZELDZELEI3KSwJXAorCVYoMDEsOEQsOEQsOEMpLAlWKEIxLEQ1LEQ1LDY0KSwJVig5Qyw0RSw0RSxEMiksCVYoNDksQTksQTksRTApLAlcCisJVihEOCw2Qyw2QyxCNCksCVYoQUMsNTYsNTYsRkEpLAlWKEYzLEY0LEY0LDA3KSwJVihDRixFQSxFQSwyNSksCVwKKwlWKENBLDY1LDY1LEFGKSwJVihGNCw3QSw3QSw4RSksCVYoNDcsQUUsQUUsRTkpLAlWKDEwLDA4LDA4LDE4KSwJXAorCVYoNkYsQkEsQkEsRDUpLAlWKEYwLDc4LDc4LDg4KSwJVig0QSwyNSwyNSw2RiksCVYoNUMsMkUsMkUsNzIpLAlcCisJVigzOCwxQywxQywyNCksCVYoNTcsQTYsQTYsRjEpLAlWKDczLEI0LEI0LEM3KSwJVig5NyxDNixDNiw1MSksCVwKKwlWKENCLEU4LEU4LDIzKSwJVihBMSxERCxERCw3QyksCVYoRTgsNzQsNzQsOUMpLAlWKDNFLDFGLDFGLDIxKSwJXAorCVYoOTYsNEIsNEIsREQpLAlWKDYxLEJELEJELERDKSwJVigwRCw4Qiw4Qiw4NiksCVYoMEYsOEEsOEEsODUpLAlcCisJVihFMCw3MCw3MCw5MCksCVYoN0MsM0UsM0UsNDIpLAlWKDcxLEI1LEI1LEM0KSwJVihDQyw2Niw2NixBQSksCVwKKwlWKDkwLDQ4LDQ4LEQ4KSwJVigwNiwwMywwMywwNSksCVYoRjcsRjYsRjYsMDEpLAlWKDFDLDBFLDBFLDEyKSwJXAorCVYoQzIsNjEsNjEsQTMpLAlWKDZBLDM1LDM1LDVGKSwJVihBRSw1Nyw1NyxGOSksCVYoNjksQjksQjksRDApLAlcCisJVigxNyw4Niw4Niw5MSksCVYoOTksQzEsQzEsNTgpLAlWKDNBLDFELDFELDI3KSwJVigyNyw5RSw5RSxCOSksCVwKKwlWKEQ5LEUxLEUxLDM4KSwJVihFQixGOCxGOCwxMyksCVYoMkIsOTgsOTgsQjMpLAlWKDIyLDExLDExLDMzKSwJXAorCVYoRDIsNjksNjksQkIpLAlWKEE5LEQ5LEQ5LDcwKSwJVigwNyw4RSw4RSw4OSksCVYoMzMsOTQsOTQsQTcpLAlcCisJVigyRCw5Qiw5QixCNiksCVYoM0MsMUUsMUUsMjIpLAlWKDE1LDg3LDg3LDkyKSwJVihDOSxFOSxFOSwyMCksCVwKKwlWKDg3LENFLENFLDQ5KSwJVihBQSw1NSw1NSxGRiksCVYoNTAsMjgsMjgsNzgpLAlWKEE1LERGLERGLDdBKSwJXAorCVYoMDMsOEMsOEMsOEYpLAlWKDU5LEExLEExLEY4KSwJVigwOSw4OSw4OSw4MCksCVYoMUEsMEQsMEQsMTcpLAlcCisJVig2NSxCRixCRixEQSksCVYoRDcsRTYsRTYsMzEpLAlWKDg0LDQyLDQyLEM2KSwJVihEMCw2OCw2OCxCOCksCVwKKwlWKDgyLDQxLDQxLEMzKSwJVigyOSw5OSw5OSxCMCksCVYoNUEsMkQsMkQsNzcpLAlWKDFFLDBGLDBGLDExKSwJXAorCVYoN0IsQjAsQjAsQ0IpLAlWKEE4LDU0LDU0LEZDKSwJVig2RCxCQixCQixENiksCVYoMkMsMTYsMTYsM0EpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBGVDBbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIHVpbnQzMiBGVDFbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBGVDJbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBGVDNbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyN1bmRlZiBGVAorCisvKiByZXZlcnNlIFMtYm94ICovCisKK3N0YXRpYyB1aW50MzIgUlNiWzI1Nl0gPQoreworCTB4NTIsIDB4MDksCTB4NkEsIDB4RDUsCTB4MzAsIDB4MzYsCTB4QTUsIDB4MzgsCisJMHhCRiwgMHg0MCwJMHhBMywgMHg5RSwJMHg4MSwgMHhGMywJMHhENywgMHhGQiwKKwkweDdDLCAweEUzLAkweDM5LCAweDgyLAkweDlCLCAweDJGLAkweEZGLCAweDg3LAorCTB4MzQsIDB4OEUsCTB4NDMsIDB4NDQsCTB4QzQsIDB4REUsCTB4RTksIDB4Q0IsCisJMHg1NCwgMHg3QiwJMHg5NCwgMHgzMiwJMHhBNiwgMHhDMiwJMHgyMywgMHgzRCwKKwkweEVFLCAweDRDLAkweDk1LCAweDBCLAkweDQyLCAweEZBLAkweEMzLCAweDRFLAorCTB4MDgsIDB4MkUsCTB4QTEsIDB4NjYsCTB4MjgsIDB4RDksCTB4MjQsIDB4QjIsCisJMHg3NiwgMHg1QiwJMHhBMiwgMHg0OSwJMHg2RCwgMHg4QiwJMHhEMSwgMHgyNSwKKwkweDcyLCAweEY4LAkweEY2LCAweDY0LAkweDg2LCAweDY4LAkweDk4LCAweDE2LAorCTB4RDQsIDB4QTQsCTB4NUMsIDB4Q0MsCTB4NUQsIDB4NjUsCTB4QjYsIDB4OTIsCisJMHg2QywgMHg3MCwJMHg0OCwgMHg1MCwJMHhGRCwgMHhFRCwJMHhCOSwgMHhEQSwKKwkweDVFLCAweDE1LAkweDQ2LCAweDU3LAkweEE3LCAweDhELAkweDlELCAweDg0LAorCTB4OTAsIDB4RDgsCTB4QUIsIDB4MDAsCTB4OEMsIDB4QkMsCTB4RDMsIDB4MEEsCisJMHhGNywgMHhFNCwJMHg1OCwgMHgwNSwJMHhCOCwgMHhCMywJMHg0NSwgMHgwNiwKKwkweEQwLCAweDJDLAkweDFFLCAweDhGLAkweENBLCAweDNGLAkweDBGLCAweDAyLAorCTB4QzEsIDB4QUYsCTB4QkQsIDB4MDMsCTB4MDEsIDB4MTMsCTB4OEEsIDB4NkIsCisJMHgzQSwgMHg5MSwJMHgxMSwgMHg0MSwJMHg0RiwgMHg2NywJMHhEQywgMHhFQSwKKwkweDk3LCAweEYyLAkweENGLCAweENFLAkweEYwLCAweEI0LAkweEU2LCAweDczLAorCTB4OTYsIDB4QUMsCTB4NzQsIDB4MjIsCTB4RTcsIDB4QUQsCTB4MzUsIDB4ODUsCisJMHhFMiwgMHhGOSwJMHgzNywgMHhFOCwJMHgxQywgMHg3NSwJMHhERiwgMHg2RSwKKwkweDQ3LCAweEYxLAkweDFBLCAweDcxLAkweDFELCAweDI5LAkweEM1LCAweDg5LAorCTB4NkYsIDB4QjcsCTB4NjIsIDB4MEUsCTB4QUEsIDB4MTgsCTB4QkUsIDB4MUIsCisJMHhGQywgMHg1NiwJMHgzRSwgMHg0QiwJMHhDNiwgMHhEMiwJMHg3OSwgMHgyMCwKKwkweDlBLCAweERCLAkweEMwLCAweEZFLAkweDc4LCAweENELAkweDVBLCAweEY0LAorCTB4MUYsIDB4REQsCTB4QTgsIDB4MzMsCTB4ODgsIDB4MDcsCTB4QzcsIDB4MzEsCisJMHhCMSwgMHgxMiwJMHgxMCwgMHg1OSwJMHgyNywgMHg4MCwJMHhFQywgMHg1RiwKKwkweDYwLCAweDUxLAkweDdGLCAweEE5LAkweDE5LCAweEI1LAkweDRBLCAweDBELAorCTB4MkQsIDB4RTUsCTB4N0EsIDB4OUYsCTB4OTMsIDB4QzksCTB4OUMsIDB4RUYsCisJMHhBMCwgMHhFMCwJMHgzQiwgMHg0RCwJMHhBRSwgMHgyQSwJMHhGNSwgMHhCMCwKKwkweEM4LCAweEVCLAkweEJCLCAweDNDLAkweDgzLCAweDUzLAkweDk5LCAweDYxLAorCTB4MTcsIDB4MkIsCTB4MDQsIDB4N0UsCTB4QkEsIDB4NzcsCTB4RDYsIDB4MjYsCisJMHhFMSwgMHg2OSwJMHgxNCwgMHg2MywJMHg1NSwgMHgyMSwJMHgwQywgMHg3RAorfTsKKworLyogcmV2ZXJzZSB0YWJsZSAqLworCisjZGVmaW5lCVJUIFwKK1wKKwlWKDUxLEY0LEE3LDUwKSwJVig3RSw0MSw2NSw1MyksCVYoMUEsMTcsQTQsQzMpLAlWKDNBLDI3LDVFLDk2KSwJXAorCVYoM0IsQUIsNkIsQ0IpLAlWKDFGLDlELDQ1LEYxKSwJVihBQyxGQSw1OCxBQiksCVYoNEIsRTMsMDMsOTMpLAlcCisJVigyMCwzMCxGQSw1NSksCVYoQUQsNzYsNkQsRjYpLAlWKDg4LENDLDc2LDkxKSwJVihGNSwwMiw0QywyNSksCVwKKwlWKDRGLEU1LEQ3LEZDKSwJVihDNSwyQSxDQixENyksCVYoMjYsMzUsNDQsODApLAlWKEI1LDYyLEEzLDhGKSwJXAorCVYoREUsQjEsNUEsNDkpLAlWKDI1LEJBLDFCLDY3KSwJVig0NSxFQSwwRSw5OCksCVYoNUQsRkUsQzAsRTEpLAlcCisJVihDMywyRiw3NSwwMiksCVYoODEsNEMsRjAsMTIpLAlWKDhELDQ2LDk3LEEzKSwJVig2QixEMyxGOSxDNiksCVwKKwlWKDAzLDhGLDVGLEU3KSwJVigxNSw5Miw5Qyw5NSksCVYoQkYsNkQsN0EsRUIpLAlWKDk1LDUyLDU5LERBKSwJXAorCVYoRDQsQkUsODMsMkQpLAlWKDU4LDc0LDIxLEQzKSwJVig0OSxFMCw2OSwyOSksCVYoOEUsQzksQzgsNDQpLAlcCisJVig3NSxDMiw4OSw2QSksCVYoRjQsOEUsNzksNzgpLAlWKDk5LDU4LDNFLDZCKSwJVigyNyxCOSw3MSxERCksCVwKKwlWKEJFLEUxLDRGLEI2KSwJVihGMCw4OCxBRCwxNyksCVYoQzksMjAsQUMsNjYpLAlWKDdELENFLDNBLEI0KSwJXAorCVYoNjMsREYsNEEsMTgpLAlWKEU1LDFBLDMxLDgyKSwJVig5Nyw1MSwzMyw2MCksCVYoNjIsNTMsN0YsNDUpLAlcCisJVihCMSw2NCw3NyxFMCksCVYoQkIsNkIsQUUsODQpLAlWKEZFLDgxLEEwLDFDKSwJVihGOSwwOCwyQiw5NCksCVwKKwlWKDcwLDQ4LDY4LDU4KSwJVig4Riw0NSxGRCwxOSksCVYoOTQsREUsNkMsODcpLAlWKDUyLDdCLEY4LEI3KSwJXAorCVYoQUIsNzMsRDMsMjMpLAlWKDcyLDRCLDAyLEUyKSwJVihFMywxRiw4Riw1NyksCVYoNjYsNTUsQUIsMkEpLAlcCisJVihCMixFQiwyOCwwNyksCVYoMkYsQjUsQzIsMDMpLAlWKDg2LEM1LDdCLDlBKSwJVihEMywzNywwOCxBNSksCVwKKwlWKDMwLDI4LDg3LEYyKSwJVigyMyxCRixBNSxCMiksCVYoMDIsMDMsNkEsQkEpLAlWKEVELDE2LDgyLDVDKSwJXAorCVYoOEEsQ0YsMUMsMkIpLAlWKEE3LDc5LEI0LDkyKSwJVihGMywwNyxGMixGMCksCVYoNEUsNjksRTIsQTEpLAlcCisJVig2NSxEQSxGNCxDRCksCVYoMDYsMDUsQkUsRDUpLAlWKEQxLDM0LDYyLDFGKSwJVihDNCxBNixGRSw4QSksCVwKKwlWKDM0LDJFLDUzLDlEKSwJVihBMixGMyw1NSxBMCksCVYoMDUsOEEsRTEsMzIpLAlWKEE0LEY2LEVCLDc1KSwJXAorCVYoMEIsODMsRUMsMzkpLAlWKDQwLDYwLEVGLEFBKSwJVig1RSw3MSw5RiwwNiksCVYoQkQsNkUsMTAsNTEpLAlcCisJVigzRSwyMSw4QSxGOSksCVYoOTYsREQsMDYsM0QpLAlWKERELDNFLDA1LEFFKSwJVig0RCxFNixCRCw0NiksCVwKKwlWKDkxLDU0LDhELEI1KSwJVig3MSxDNCw1RCwwNSksCVYoMDQsMDYsRDQsNkYpLAlWKDYwLDUwLDE1LEZGKSwJXAorCVYoMTksOTgsRkIsMjQpLAlWKEQ2LEJELEU5LDk3KSwJVig4OSw0MCw0MyxDQyksCVYoNjcsRDksOUUsNzcpLAlcCisJVihCMCxFOCw0MixCRCksCVYoMDcsODksOEIsODgpLAlWKEU3LDE5LDVCLDM4KSwJVig3OSxDOCxFRSxEQiksCVwKKwlWKEExLDdDLDBBLDQ3KSwJVig3Qyw0MiwwRixFOSksCVYoRjgsODQsMUUsQzkpLAlWKDAwLDAwLDAwLDAwKSwJXAorCVYoMDksODAsODYsODMpLAlWKDMyLDJCLEVELDQ4KSwJVigxRSwxMSw3MCxBQyksCVYoNkMsNUEsNzIsNEUpLAlcCisJVihGRCwwRSxGRixGQiksCVYoMEYsODUsMzgsNTYpLAlWKDNELEFFLEQ1LDFFKSwJVigzNiwyRCwzOSwyNyksCVwKKwlWKDBBLDBGLEQ5LDY0KSwJVig2OCw1QyxBNiwyMSksCVYoOUIsNUIsNTQsRDEpLAlWKDI0LDM2LDJFLDNBKSwJXAorCVYoMEMsMEEsNjcsQjEpLAlWKDkzLDU3LEU3LDBGKSwJVihCNCxFRSw5NixEMiksCVYoMUIsOUIsOTEsOUUpLAlcCisJVig4MCxDMCxDNSw0RiksCVYoNjEsREMsMjAsQTIpLAlWKDVBLDc3LDRCLDY5KSwJVigxQywxMiwxQSwxNiksCVwKKwlWKEUyLDkzLEJBLDBBKSwJVihDMCxBMCwyQSxFNSksCVYoM0MsMjIsRTAsNDMpLAlWKDEyLDFCLDE3LDFEKSwJXAorCVYoMEUsMDksMEQsMEIpLAlWKEYyLDhCLEM3LEFEKSwJVigyRCxCNixBOCxCOSksCVYoMTQsMUUsQTksQzgpLAlcCisJVig1NyxGMSwxOSw4NSksCVYoQUYsNzUsMDcsNEMpLAlWKEVFLDk5LERELEJCKSwJVihBMyw3Riw2MCxGRCksCVwKKwlWKEY3LDAxLDI2LDlGKSwJVig1Qyw3MixGNSxCQyksCVYoNDQsNjYsM0IsQzUpLAlWKDVCLEZCLDdFLDM0KSwJXAorCVYoOEIsNDMsMjksNzYpLAlWKENCLDIzLEM2LERDKSwJVihCNixFRCxGQyw2OCksCVYoQjgsRTQsRjEsNjMpLAlcCisJVihENywzMSxEQyxDQSksCVYoNDIsNjMsODUsMTApLAlWKDEzLDk3LDIyLDQwKSwJVig4NCxDNiwxMSwyMCksCVwKKwlWKDg1LDRBLDI0LDdEKSwJVihEMixCQiwzRCxGOCksCVYoQUUsRjksMzIsMTEpLAlWKEM3LDI5LEExLDZEKSwJXAorCVYoMUQsOUUsMkYsNEIpLAlWKERDLEIyLDMwLEYzKSwJVigwRCw4Niw1MixFQyksCVYoNzcsQzEsRTMsRDApLAlcCisJVigyQixCMywxNiw2QyksCVYoQTksNzAsQjksOTkpLAlWKDExLDk0LDQ4LEZBKSwJVig0NyxFOSw2NCwyMiksCVwKKwlWKEE4LEZDLDhDLEM0KSwJVihBMCxGMCwzRiwxQSksCVYoNTYsN0QsMkMsRDgpLAlWKDIyLDMzLDkwLEVGKSwJXAorCVYoODcsNDksNEUsQzcpLAlWKEQ5LDM4LEQxLEMxKSwJVig4QyxDQSxBMixGRSksCVYoOTgsRDQsMEIsMzYpLAlcCisJVihBNixGNSw4MSxDRiksCVYoQTUsN0EsREUsMjgpLAlWKERBLEI3LDhFLDI2KSwJVigzRixBRCxCRixBNCksCVwKKwlWKDJDLDNBLDlELEU0KSwJVig1MCw3OCw5MiwwRCksCVYoNkEsNUYsQ0MsOUIpLAlWKDU0LDdFLDQ2LDYyKSwJXAorCVYoRjYsOEQsMTMsQzIpLAlWKDkwLEQ4LEI4LEU4KSwJVigyRSwzOSxGNyw1RSksCVYoODIsQzMsQUYsRjUpLAlcCisJVig5Riw1RCw4MCxCRSksCVYoNjksRDAsOTMsN0MpLAlWKDZGLEQ1LDJELEE5KSwJVihDRiwyNSwxMixCMyksCVwKKwlWKEM4LEFDLDk5LDNCKSwJVigxMCwxOCw3RCxBNyksCVYoRTgsOUMsNjMsNkUpLAlWKERCLDNCLEJCLDdCKSwJXAorCVYoQ0QsMjYsNzgsMDkpLAlWKDZFLDU5LDE4LEY0KSwJVihFQyw5QSxCNywwMSksCVYoODMsNEYsOUEsQTgpLAlcCisJVihFNiw5NSw2RSw2NSksCVYoQUEsRkYsRTYsN0UpLAlWKDIxLEJDLENGLDA4KSwJVihFRiwxNSxFOCxFNiksCVwKKwlWKEJBLEU3LDlCLEQ5KSwJVig0QSw2RiwzNixDRSksCVYoRUEsOUYsMDksRDQpLAlWKDI5LEIwLDdDLEQ2KSwJXAorCVYoMzEsQTQsQjIsQUYpLAlWKDJBLDNGLDIzLDMxKSwJVihDNixBNSw5NCwzMCksCVYoMzUsQTIsNjYsQzApLAlcCisJVig3NCw0RSxCQywzNyksCVYoRkMsODIsQ0EsQTYpLAlWKEUwLDkwLEQwLEIwKSwJVigzMyxBNyxEOCwxNSksCVwKKwlWKEYxLDA0LDk4LDRBKSwJVig0MSxFQyxEQSxGNyksCVYoN0YsQ0QsNTAsMEUpLAlWKDE3LDkxLEY2LDJGKSwJXAorCVYoNzYsNEQsRDYsOEQpLAlWKDQzLEVGLEIwLDREKSwJVihDQyxBQSw0RCw1NCksCVYoRTQsOTYsMDQsREYpLAlcCisJVig5RSxEMSxCNSxFMyksCVYoNEMsNkEsODgsMUIpLAlWKEMxLDJDLDFGLEI4KSwJVig0Niw2NSw1MSw3RiksCVwKKwlWKDlELDVFLEVBLDA0KSwJVigwMSw4QywzNSw1RCksCVYoRkEsODcsNzQsNzMpLAlWKEZCLDBCLDQxLDJFKSwJXAorCVYoQjMsNjcsMUQsNUEpLAlWKDkyLERCLEQyLDUyKSwJVihFOSwxMCw1NiwzMyksCVYoNkQsRDYsNDcsMTMpLAlcCisJVig5QSxENyw2MSw4QyksCVYoMzcsQTEsMEMsN0EpLAlWKDU5LEY4LDE0LDhFKSwJVihFQiwxMywzQyw4OSksCVwKKwlWKENFLEE5LDI3LEVFKSwJVihCNyw2MSxDOSwzNSksCVYoRTEsMUMsRTUsRUQpLAlWKDdBLDQ3LEIxLDNDKSwJXAorCVYoOUMsRDIsREYsNTkpLAlWKDU1LEYyLDczLDNGKSwJVigxOCwxNCxDRSw3OSksCVYoNzMsQzcsMzcsQkYpLAlcCisJVig1MyxGNyxDRCxFQSksCVYoNUYsRkQsQUEsNUIpLAlWKERGLDNELDZGLDE0KSwJVig3OCw0NCxEQiw4NiksCVwKKwlWKENBLEFGLEYzLDgxKSwJVihCOSw2OCxDNCwzRSksCVYoMzgsMjQsMzQsMkMpLAlWKEMyLEEzLDQwLDVGKSwJXAorCVYoMTYsMUQsQzMsNzIpLAlWKEJDLEUyLDI1LDBDKSwJVigyOCwzQyw0OSw4QiksCVYoRkYsMEQsOTUsNDEpLAlcCisJVigzOSxBOCwwMSw3MSksCVYoMDgsMEMsQjMsREUpLAlWKEQ4LEI0LEU0LDlDKSwJVig2NCw1NixDMSw5MCksCVwKKwlWKDdCLENCLDg0LDYxKSwJVihENSwzMixCNiw3MCksCVYoNDgsNkMsNUMsNzQpLAlWKEQwLEI4LDU3LDQyKQorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKK3N0YXRpYyB1aW50MzIgUlQwWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyB1aW50MzIgUlQxWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKK3N0YXRpYyB1aW50MzIgUlQyWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKK3N0YXRpYyB1aW50MzIgUlQzWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjdW5kZWYgUlQKKworLyogcm91bmQgY29uc3RhbnRzICovCisKK3N0YXRpYyB1aW50MzIgUkNPTlsxMF0gPQoreworCTB4MDEwMDAwMDAsCTB4MDIwMDAwMDAsCTB4MDQwMDAwMDAsCTB4MDgwMDAwMDAsCisJMHgxMDAwMDAwMCwJMHgyMDAwMDAwMCwJMHg0MDAwMDAwMCwJMHg4MDAwMDAwMCwKKwkweDFCMDAwMDAwLAkweDM2MDAwMDAwCit9OworCisvKiBrZXkgc2NoZWR1bGUJdGFibGVzICovCisKK3N0YXRpYyBpbnQgS1RfaW5pdCA9IDE7CisKK3N0YXRpYyB1aW50MzIgS1QwWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMVsyNTZdOworc3RhdGljIHVpbnQzMiBLVDJbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QzWzI1Nl07CisKKy8qIHBsYXRmb3JtLWluZGVwZW5kYW50CTMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbgltYWNyb3MgKi8KKworI2RlZmluZQlHRVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKG4pCT0gKAkodWludDMyKSAoYilbKGkpCV0gPDwgMjQJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDFdIDw8IDE2CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAyXSA8PCAgOAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgM10JCSk7CQlcCit9CisKKyNkZWZpbmUJUFVUX1VJTlQzMihuLGIsaSkJCQkJCQlcCit7CQkJCQkJCQkJCQkJXAorCShiKVsoaSkJICAgXSA9ICh1aW50OCkgKCAobikgPj4JMjQgKTsJCVwKKwkoYilbKGkpCSsgMV0gPSAodWludDgpICggKG4pID4+CTE2ICk7CQlcCisJKGIpWyhpKQkrIDJdID0gKHVpbnQ4KSAoIChuKSA+PgkgOCApOwkJXAorCShiKVsoaSkJKyAzXSA9ICh1aW50OCkgKCAobikJICAgKTsJCVwKK30KKworLyogQUVTIGtleSBzY2hlZHVsaW5nIHJvdXRpbmUgKi8KKworaW50CXJ0bXBfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4ICprZXksIGludCBuYml0cyApCit7CisJaW50CWk7CisJdWludDMyICpSSywJKlNLOworCisJc3dpdGNoKAluYml0cyApCisJeworCQljYXNlIDEyODogY3R4LT5uciA9CTEwOwlicmVhazsKKwkJY2FzZSAxOTI6IGN0eC0+bnIgPQkxMjsJYnJlYWs7CisJCWNhc2UgMjU2OiBjdHgtPm5yID0JMTQ7CWJyZWFrOworCQlkZWZhdWx0CTogcmV0dXJuKCAxCSk7CisJfQorCisJUksgPSBjdHgtPmVyazsKKworCWZvciggaSA9IDA7CWkgPAkobmJpdHMgPj4gNSk7IGkrKyApCisJeworCQlHRVRfVUlOVDMyKAlSS1tpXSwga2V5LAlpICoJNCApOworCX0KKworCS8qIHNldHVwIGVuY3J5cHRpb24Jcm91bmQga2V5cyAqLworCisJc3dpdGNoKAluYml0cyApCisJeworCWNhc2UgMTI4OgorCisJCWZvciggaSA9IDA7CWkgPAkxMDsJaSsrLCBSSwkrPSA0ICkKKwkJeworCQkJUktbNF0gID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gMTYgKSBdIDw8CTI0ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAgOCApIF0gPDwJMTYgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdCQkgKSBdIDw8CSA4ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAyNCApIF0JICAgKTsKKworCQkJUktbNV0gID0gUktbMV0gXiBSS1s0XTsKKwkJCVJLWzZdICA9IFJLWzJdIF4gUktbNV07CisJCQlSS1s3XSAgPSBSS1szXSBeIFJLWzZdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAxOTI6CisKKwkJZm9yKCBpID0gMDsJaSA8CTg7IGkrKywJUksgKz0gNgkpCisJCXsKKwkJCVJLWzZdICA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+IDE2ICkgXSA8PAkyNCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gIDggKSBdIDw8CTE2ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XQkJICkgXSA8PAkgOCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMjQgKSBdCSAgICk7CisKKwkJCVJLWzddICA9IFJLWzFdIF4gUktbNl07CisJCQlSS1s4XSAgPSBSS1syXSBeIFJLWzddOworCQkJUktbOV0gID0gUktbM10gXiBSS1s4XTsKKwkJCVJLWzEwXSA9IFJLWzRdIF4gUktbOV07CisJCQlSS1sxMV0gPSBSS1s1XSBeIFJLWzEwXTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMjU2OgorCisJCWZvciggaSA9IDA7CWkgPAk3OyBpKyssCVJLICs9IDgJKQorCQl7CisJCQlSS1s4XSAgPSBSS1swXSBeIFJDT05baV0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAxNiApIF0gPDwJMjQgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+ICA4ICkgXSA8PAkxNiApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10JCSApIF0gPDwJIDggKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDI0ICkgXQkgICApOworCisJCQlSS1s5XSAgPSBSS1sxXSBeIFJLWzhdOworCQkJUktbMTBdID0gUktbMl0gXiBSS1s5XTsKKwkJCVJLWzExXSA9IFJLWzNdIF4gUktbMTBdOworCisJCQlSS1sxMl0gPSBSS1s0XSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+PiAyNCApCV0gPDwgMjQJKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+PiAxNiApCV0gPDwgMTYJKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+Pgk4ICkJXSA8PCAgOAkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCQkgICkJXQkJKTsKKworCQkJUktbMTNdID0gUktbNV0gXiBSS1sxMl07CisJCQlSS1sxNF0gPSBSS1s2XSBeIFJLWzEzXTsKKwkJCVJLWzE1XSA9IFJLWzddIF4gUktbMTRdOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIHNldHVwIGRlY3J5cHRpb24Jcm91bmQga2V5cyAqLworCisJaWYoCUtUX2luaXQJKQorCXsKKwkJZm9yKCBpID0gMDsJaSA8CTI1NjsgaSsrICkKKwkJeworCQkJS1QwW2ldID0gUlQwWyBGU2JbaV0gXTsKKwkJCUtUMVtpXSA9IFJUMVsgRlNiW2ldIF07CisJCQlLVDJbaV0gPSBSVDJbIEZTYltpXSBdOworCQkJS1QzW2ldID0gUlQzWyBGU2JbaV0gXTsKKwkJfQorCisJCUtUX2luaXQJPSAwOworCX0KKworCVNLID0gY3R4LT5kcms7CisKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCisJZm9yKCBpID0gMTsJaSA8CWN0eC0+bnI7IGkrKyApCisJeworCQlSSyAtPSA4OworCisJCSpTSysrID0JS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisJCQkJS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisJCQkJS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisJCQkJS1QzWyAodWludDgpICggKlJLCQkgKSBdOyBSSysrOworCisJCSpTSysrID0JS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisJCQkJS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisJCQkJS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisJCQkJS1QzWyAodWludDgpICggKlJLCQkgKSBdOyBSSysrOworCisJCSpTSysrID0JS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisJCQkJS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisJCQkJS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisJCQkJS1QzWyAodWludDgpICggKlJLCQkgKSBdOyBSSysrOworCisJCSpTSysrID0JS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisJCQkJS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisJCQkJS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisJCQkJS1QzWyAodWludDgpICggKlJLCQkgKSBdOyBSSysrOworCX0KKworCVJLIC09IDg7CisKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCisJcmV0dXJuKAkwICk7Cit9CisKKy8qIEFFUyAxMjgtYml0IGJsb2NrIGVuY3J5cHRpb24Jcm91dGluZQkqLworCit2b2lkIHJ0bXBfYWVzX2VuY3J5cHQoYWVzX2NvbnRleHQgKmN0eCwgdWludDggaW5wdXRbMTZdLAl1aW50OCBvdXRwdXRbMTZdICkKK3sKKwl1aW50MzIgKlJLLAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTM7CisKKwlSSyA9IGN0eC0+ZXJrOworCUdFVF9VSU5UMzIoCVgwLAlpbnB1dCwJMCApOyBYMAlePSBSS1swXTsKKwlHRVRfVUlOVDMyKAlYMSwJaW5wdXQsCTQgKTsgWDEJXj0gUktbMV07CisJR0VUX1VJTlQzMigJWDIsCWlucHV0LAk4ICk7IFgyCV49IFJLWzJdOworCUdFVF9VSU5UMzIoCVgzLAlpbnB1dCwgMTIgKTsgWDMJXj0gUktbM107CisKKyNkZWZpbmUJQUVTX0ZST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykJCVwKK3sJCQkJCQkJCQkJCQlcCisJUksgKz0gNDsJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQlcCisJWDAgPSBSS1swXSBeIEZUMFsgKHVpbnQ4KSAoCVkwID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTEgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMiA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkzCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDEgPSBSS1sxXSBeIEZUMFsgKHVpbnQ4KSAoCVkxID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTIgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMyA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkwCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDIgPSBSS1syXSBeIEZUMFsgKHVpbnQ4KSAoCVkyID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTMgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMCA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkxCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDMgPSBSS1szXSBeIEZUMFsgKHVpbnQ4KSAoCVkzID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTAgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMSA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkyCQkgKSBdOwlcCit9CisKKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDEgKi8KKwlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDIgKi8KKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDMgKi8KKwlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDQgKi8KKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDUgKi8KKwlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDYgKi8KKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDcgKi8KKwlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDggKi8KKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDkgKi8KKworCWlmKAljdHgtPm5yCT4gMTAgKQorCXsKKwkJQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEwCSovCisJCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMQkqLworCX0KKworCWlmKAljdHgtPm5yCT4gMTIgKQorCXsKKwkJQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEyCSovCisJCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMwkqLworCX0KKworCS8qIGxhc3QJcm91bmQgKi8KKworCVJLICs9IDQ7CisKKwlYMCA9IFJLWzBdIF4gKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOworCisJWDEgPSBSS1sxXSBeICggRlNiWwkodWludDgpCSggWTEgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMyA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKKworCVgyID0gUktbMl0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkyID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMyA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTAgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxCSAgICkgXQkJICk7CisKKwlYMyA9IFJLWzNdIF4gKCBGU2JbCSh1aW50OCkJKCBZMyA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTAgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMgkgICApIF0JCSApOworCisJUFVUX1VJTlQzMigJWDAsCW91dHB1dCwJIDAgKTsKKwlQVVRfVUlOVDMyKAlYMSwJb3V0cHV0LAkgNCApOworCVBVVF9VSU5UMzIoCVgyLAlvdXRwdXQsCSA4ICk7CisJUFVUX1VJTlQzMigJWDMsCW91dHB1dCwJMTIgKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZGVjcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRtcF9hZXNfZGVjcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICkKK3sKKwl1aW50MzIgKlJLLAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTM7CisKKwlSSyA9IGN0eC0+ZHJrOworCisJR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOworCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKKwlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07CisJR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKKworI2RlZmluZQlBRVNfUlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gUlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gUlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTIJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gUlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gUlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTAJCSApIF07CVwKK30KKworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLworCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLworCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLworCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLworCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLworCisJaWYoCWN0eC0+bnIJPiAxMCApCisJeworCQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KKwkJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCisJfQorCisJaWYoCWN0eC0+bnIJPiAxMiApCisJeworCQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KKwkJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCisJfQorCisJLyogbGFzdAlyb3VuZCAqLworCisJUksgKz0gNDsKKworCVgwID0gUktbMF0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxCSAgICkgXQkJICk7CisKKwlYMSA9IFJLWzFdIF4gKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTAgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMgkgICApIF0JCSApOworCisJWDIgPSBSS1syXSBeICggUlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTMJICAgKSBdCQkgKTsKKworCVgzID0gUktbM10gXiAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwCSAgICkgXQkJICk7CisKKwlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOworCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7CisJUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKKwlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU0hBMSBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJSE1BQ19TSEExKAorCUlOCVVDSEFSCSp0ZXh0LAorCUlOCVVJTlQJdGV4dF9sZW4sCisJSU4JVUNIQVIJKmtleSwKKwlJTglVSU5UCWtleV9sZW4sCisJSU4JVUNIQVIJKmRpZ2VzdCkKK3sKKwlTSEFfQ1RYCWNvbnRleHQ7CisJVUNIQVIJa19pcGFkWzY1XTsgLyogaW5uZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZAkqLworCVVDSEFSCWtfb3BhZFs2NV07IC8qIG91dGVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIG9wYWQJKi8KKwlJTlQJCWk7CisKKwkvLyBpZiBrZXkgaXMgbG9uZ2VyCXRoYW4gNjQJYnl0ZXMgcmVzZXQJaXQgdG8ga2V5PVNIQTEoa2V5KQorCWlmIChrZXlfbGVuCT4gNjQpCisJeworCQlTSEFfQ1RYCQkgdGN0eDsKKwkJU0hBSW5pdCgmdGN0eCk7CisJCVNIQVVwZGF0ZSgmdGN0eCwga2V5LCBrZXlfbGVuKTsKKwkJU0hBRmluYWwoJnRjdHgsCWtleSk7CisJCWtleV9sZW4JPSAyMDsKKwl9CisJTmRpc1plcm9NZW1vcnkoa19pcGFkLCBzaXplb2Yoa19pcGFkKSk7CisJTmRpc1plcm9NZW1vcnkoa19vcGFkLCBzaXplb2Yoa19vcGFkKSk7CisJTmRpc01vdmVNZW1vcnkoa19pcGFkLCBrZXksCWtleV9sZW4pOworCU5kaXNNb3ZlTWVtb3J5KGtfb3BhZCwga2V5LAlrZXlfbGVuKTsKKworCS8vIFhPUiBrZXkgd2l0aAlpcGFkIGFuZCBvcGFkIHZhbHVlcworCWZvcgkoaSA9IDA7CWkgPAk2NDsJaSsrKQorCXsKKwkJa19pcGFkW2ldIF49IDB4MzY7CisJCWtfb3BhZFtpXSBePSAweDVjOworCX0KKworCS8vIHBlcmZvcm0gaW5uZXIgU0hBMQorCVNIQUluaXQoJmNvbnRleHQpOyAJCQkJCQkvKiBpbml0IGNvbnRleHQgZm9yIDFzdCBwYXNzICovCisJU0hBVXBkYXRlKCZjb250ZXh0LAlrX2lwYWQsCTY0KTsJCS8qCXN0YXJ0IHdpdGggaW5uZXIgcGFkICovCisJU0hBVXBkYXRlKCZjb250ZXh0LAl0ZXh0LCB0ZXh0X2xlbik7CS8qCXRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworCVNIQUZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOwkJCQkvKiBmaW5pc2ggdXAgMXN0IHBhc3MgKi8KKworCS8vcGVyZm9ybSBvdXRlcglTSEExCisJU0hBSW5pdCgmY29udGV4dCk7CQkJCQkvKiBpbml0IGNvbnRleHQgZm9yIDJuZCBwYXNzICovCisJU0hBVXBkYXRlKCZjb250ZXh0LAlrX29wYWQsCTY0KTsJLyoJc3RhcnQgd2l0aCBvdXRlciBwYWQgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWRpZ2VzdCwJMjApOwkvKgl0aGVuIHJlc3VsdHMgb2YJMXN0CWhhc2ggKi8KKwlTSEFGaW5hbCgmY29udGV4dCwgZGlnZXN0KTsJCQkvKiBmaW5pc2ggdXAgMm5kIHBhc3MgKi8KKworfQorCisvKgorKiBGKFAsIFMsIGMsIGkpID0gVTEgeG9yIFUyIHhvciAuLi4gVWMKKyogVTEgPSBQUkYoUCwgUyB8fCBJbnQoaSkpCisqIFUyID0gUFJGKFAsIFUxKQorKiBVYyA9IFBSRihQLCBVYy0xKQorKi8KKwordm9pZCBGKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgaW50IGl0ZXJhdGlvbnMsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQoreworICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzM2XSwgZGlnZXN0MVtTSEFfRElHRVNUX0xFTl07CisgICAgaW50IGksIGo7CisKKyAgICAvKiBVMSA9IFBSRihQLCBTIHx8IGludChpKSkgKi8KKyAgICBtZW1jcHkoZGlnZXN0LCBzc2lkLCBzc2lkbGVuZ3RoKTsKKyAgICBkaWdlc3Rbc3NpZGxlbmd0aF0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj4yNCkgJiAweGZmKTsKKyAgICBkaWdlc3Rbc3NpZGxlbmd0aCsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjE2KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzJdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+OCkgJiAweGZmKTsKKyAgICBkaWdlc3Rbc3NpZGxlbmd0aCszXSA9ICh1bnNpZ25lZCBjaGFyKShjb3VudCAmIDB4ZmYpOworICAgIEhNQUNfU0hBMShkaWdlc3QsIHNzaWRsZW5ndGgrNCwgKHVuc2lnbmVkIGNoYXIqKSBwYXNzd29yZCwgKGludCkgc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0MSk7IC8vIGZvciBXUEEgdXBkYXRlCisKKyAgICAvKiBvdXRwdXQgPSBVMSAqLworICAgIG1lbWNweShvdXRwdXQsIGRpZ2VzdDEsIFNIQV9ESUdFU1RfTEVOKTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBpdGVyYXRpb25zOyBpKyspCisgICAgeworICAgICAgICAvKiBVbiA9IFBSRihQLCBVbi0xKSAqLworICAgICAgICBITUFDX1NIQTEoZGlnZXN0MSwgU0hBX0RJR0VTVF9MRU4sICh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdCk7IC8vIGZvciBXUEEgdXBkYXRlCisgICAgICAgIG1lbWNweShkaWdlc3QxLCBkaWdlc3QsIFNIQV9ESUdFU1RfTEVOKTsKKworICAgICAgICAvKiBvdXRwdXQgPSBvdXRwdXQgeG9yIFVuICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBTSEFfRElHRVNUX0xFTjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRbal0gXj0gZGlnZXN0W2pdOworICAgICAgICB9CisgICAgfQorfQorLyoKKyogcGFzc3dvcmQgLSBhc2NpaSBzdHJpbmcgdXAgdG8gNjMgY2hhcmFjdGVycyBpbiBsZW5ndGgKKyogc3NpZCAtIG9jdGV0IHN0cmluZyB1cCB0byAzMiBvY3RldHMKKyogc3NpZGxlbmd0aCAtIGxlbmd0aCBvZiBzc2lkIGluIG9jdGV0cworKiBvdXRwdXQgbXVzdCBiZSA0MCBvY3RldHMgaW4gbGVuZ3RoIGFuZCBvdXRwdXRzIDI1NiBiaXRzIG9mIGtleQorKi8KK2ludCBQYXNzd29yZEhhc2goY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCit7CisgICAgaWYgKChzdHJsZW4ocGFzc3dvcmQpID4gNjMpIHx8IChzc2lkbGVuZ3RoID4gMzIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDEsIG91dHB1dCk7CisgICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMiwgJm91dHB1dFtTSEFfRElHRVNUX0xFTl0pOworICAgIHJldHVybiAxOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk3NDcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCkBAIC0wLDAgKzEsODY2NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwltbG1lLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDQtMDgtMjUJCU1vZGlmeSBmcm9tIFJUMjUwMCBjb2RlIGJhc2UKKwlKb2huIENoYW5nCTIwMDQtMDktMDYJCW1vZGlmaWVkIGZvciBSVDI2MDAKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworVUNIQVIJQ0lTQ09fT1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5Nn07CisKK1VDSEFSCVdQQV9PVUlbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAxfTsKK1VDSEFSCVJTTl9PVUlbXSA9IHsweDAwLCAweDBmLCAweGFjfTsKK1VDSEFSCVdBUElfT1VJW10gPSB7MHgwMCwgMHgxNCwgMHg3Mn07CitVQ0hBUiAgIFdNRV9JTkZPX0VMRU1bXSAgPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMX07CitVQ0hBUiAgIFdNRV9QQVJNX0VMRU1bXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxLCAweDAxfTsKK1VDSEFSCUNjeDJRb3NJbmZvW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwNH07CitVQ0hBUiAgIFJBTElOS19PVUlbXSAgPSB7MHgwMCwgMHgwYywgMHg0M307CitVQ0hBUiAgIEJST0FEQ09NX09VSVtdICA9IHsweDAwLCAweDkwLCAweDRjfTsKK1VDSEFSICAgV1BTX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIJUFJFX05fSFRfT1VJW10JPSB7MHgwMCwgMHg5MCwgMHg0Y307CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZVtdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDIxLCAgMCwgMzAsIDUwLAorICAgIDB4MDUsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwNiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDA3LCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDgsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwOSwgMHgyMSwgIDUsIDEwLCAyNSwKKyAgICAweDBhLCAweDIxLCAgNiwgIDgsIDI1LAorICAgIDB4MGIsIDB4MjEsICA3LCAgOCwgMjUsCisgICAgMHgwYywgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwZCwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDBlLCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MGYsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgxMCwgMHgyMiwgMTUsICA4LCAyNSwKKyAgICAweDExLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTIsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxMywgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE0LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTUsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE3LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTgsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxOSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFhLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWIsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxYywgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFkLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWUsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxZiwgMHgwMCwgIDAsICAwLCAgMCwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQltdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MDQsIDB4MDMsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCisgICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKKyAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAorICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCisgICAgMHgwNCwgMHgxMCwgIDIsIDIwLCAzNSwKKyAgICAweDA1LCAweDEwLCAgMywgMTYsIDM1LAorICAgIDB4MDYsIDB4MTAsICA0LCAxMCwgMjUsCisgICAgMHgwNywgMHgxMCwgIDUsIDE2LCAyNSwKKyAgICAweDA4LCAweDEwLCAgNiwgMTAsIDI1LAorICAgIDB4MDksIDB4MTAsICA3LCAxMCwgMTMsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUdbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDA4LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgxMCwgIDAsIDIwLCAxMDEsCisgICAgMHgwMSwgMHgxMCwgIDEsIDIwLCAzNSwKKyAgICAweDAyLCAweDEwLCAgMiwgMjAsIDM1LAorICAgIDB4MDMsIDB4MTAsICAzLCAxNiwgMzUsCisgICAgMHgwNCwgMHgxMCwgIDQsIDEwLCAyNSwKKyAgICAweDA1LCAweDEwLCAgNSwgMTYsIDI1LAorICAgIDB4MDYsIDB4MTAsICA2LCAxMCwgMjUsCisgICAgMHgwNywgMHgxMCwgIDcsIDEwLCAxMywKK307CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjFTW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwOSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDEwLCAyNSwKKyAgICAweDA2LCAweDIxLCAgNiwgIDgsIDE0LAorICAgIDB4MDcsIDB4MjEsICA3LCAgOCwgMTQsCisgICAgMHgwOCwgMHgyMywgIDcsICA4LCAxNCwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTW10gPSB7CisvLyBJdGVtIE5vLglNb2RlCUN1cnItTUNTCVRyYWluVXAJVHJhaW5Eb3duCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEyLCAgMTUsIDMwLAorICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU0ZvckFCYW5kW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBkLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCisgICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKKyAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAorICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCisgICAgMHgwNCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDUsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwNiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDA3LCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDgsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwOSwgMHgyMSwgIDUsIDEwLCAyNSwKKyAgICAweDBhLCAweDIxLCAgNiwgIDgsIDE0LAorICAgIDB4MGIsIDB4MjEsICA3LCAgOCwgMTQsCisJMHgwYywgMHgyMywgIDcsICA4LCAxNCwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMCwgMTIsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU1tdID0geyAvLyAzKjMKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMjAsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgNTAsCisgICAgMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAyMywgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGMsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA4LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwYSwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDBiLCAweDIyLCAyMywgIDgsIDI1LAorfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworUFVDSEFSIFJlYXNvblN0cmluZ1tdID0geworCS8qIDAgICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEgICovCSAiVW5zcGVjaWZpZWQgUmVhc29uIiwKKwkvKiAyICAqLwkgIlByZXZpb3VzIEF1dGggbm8gbG9uZ2VyIHZhbGlkIiwKKwkvKiAzICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAorCS8qIDQgICovCSAiRElTLUFTU09DIGR1ZSB0byBpbmFjdGl2aXR5IiwKKwkvKiA1ICAqLwkgIkFQIHVuYWJsZSB0byBoYW5sZSBhbGwgYXNzb2NpYXRpb25zIiwKKwkvKiA2ICAqLwkgImNsYXNzIDIgZXJyb3IiLAorCS8qIDcgICovCSAiY2xhc3MgMyBlcnJvciIsCisJLyogOCAgKi8JICJTVEEgaXMgbGVhdmluZyAvIGhhcyBsZWZ0IiwKKwkvKiA5ICAqLwkgInJlcXVpcmUgYXV0aCBiZWZvcmUgYXNzb2MvcmUtYXNzb2MiLAorCS8qIDEwICovCSAiUmVzZXJ2ZWQiLAorCS8qIDExICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEyICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEzICovCSAiaW52YWxpZCBJRSIsCisJLyogMTQgKi8JICJNSUMgZXJyb3IiLAorCS8qIDE1ICovCSAiNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE2ICovCSAiMi13YXkgKGdyb3VwIGtleSkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE3ICovCSAiNC13YXkgaGFuZHNoYWtlIElFIGRpZmYgYW1vbmcgQXNzb3NSZXEvUnNwL0JlYWNvbiIsCisJLyogMTggKi8KK307CisKK2V4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKKy8vIHNpbmNlIFJUNjEgaGFzIGJldHRlciBSWCBzZW5zaWJpbGl0eSwgd2UgaGF2ZSB0byBsaW1pdCBUWCBBQ0sgcmF0ZSBub3QgdG8gZXhjZWVkIG91ciBub3JtYWwgZGF0YSBUWCByYXRlLgorLy8gb3RoZXJ3aXNlIHRoZSBXTEFOIHBlZXIgbWF5IG5vdCBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIEFDSyB0aHVzIGRvd25ncmFkZSBpdHMgZGF0YSBUWCByYXRlCitVTE9ORyBCYXNpY1JhdGVNYXNrWzEyXQkJCQk9IHsweGZmZmZmMDAxIC8qIDEtTWJwcyAqLywgMHhmZmZmZjAwMyAvKiAyIE1icHMgKi8sIDB4ZmZmZmYwMDcgLyogNS41ICovLCAweGZmZmZmMDBmIC8qIDExICovLAorCQkJCQkJCQkJICAweGZmZmZmMDFmIC8qIDYgKi8JICwgMHhmZmZmZjAzZiAvKiA5ICovCSAgLCAweGZmZmZmMDdmIC8qIDEyICovICwgMHhmZmZmZjBmZiAvKiAxOCAqLywKKwkJCQkJCQkJCSAgMHhmZmZmZjFmZiAvKiAyNCAqLwkgLCAweGZmZmZmM2ZmIC8qIDM2ICovCSAgLCAweGZmZmZmN2ZmIC8qIDQ4ICovICwgMHhmZmZmZmZmZiAvKiA1NCAqL307CisKK1VDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHgxLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CitVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dICA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgorLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgorLy8JCWNsZWFuIGVudmlyb25tZW50LgorLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAorQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07CisKK1VDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKK1VTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07CisKK1VDSEFSICBTc2lkSWUJID0gSUVfU1NJRDsKK1VDSEFSICBTdXBSYXRlSWUgPSBJRV9TVVBQX1JBVEVTOworVUNIQVIgIEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgIEh0Q2FwSWUgPSBJRV9IVF9DQVA7CitVQ0hBUiAgQWRkSHRJbmZvSWUgPSBJRV9BRERfSFQ7CitVQ0hBUiAgTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitVQ0hBUiAgRXh0SHRDYXBJZSA9IElFX0VYVF9DQVBBQklMSVRZOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK1VDSEFSICBFcnBJZQkgPSBJRV9FUlA7CitVQ0hBUiAgRHNJZSAJID0gSUVfRFNfUEFSTTsKK1VDSEFSICBUaW1JZQkgPSBJRV9USU07CitVQ0hBUiAgV3BhSWUJID0gSUVfV1BBOworVUNIQVIgIFdwYTJJZQkgPSBJRV9XUEEyOworVUNIQVIgIElic3NJZQkgPSBJRV9JQlNTX1BBUk07CitVQ0hBUiAgQ2N4MkllCSA9IElFX0NDWF9WMjsKKworZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKKworVUNIQVIJU0VTX09VSVtdID0gezB4MDAsIDB4OTAsIDB4NGN9OworCitVQ0hBUglaZXJvU3NpZFszMl0gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKKworLy8gUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzCitSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXSA9IHsKKy8vCQljaAkgUjEgCQkgUjIgCQkgUjMoVFgwfjQ9MCkgUjQKKwkJezEsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifSwKKwkJezIsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezMsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezQsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezUsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezYsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezcsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezgsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezksICAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEyLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfSwKKworCQkvLyA4MDIuMTEgVU5JIC8gSHlwZXJMYW4gMgorCQl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NDgsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOWJ9LAorCQl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NTYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NjQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LCAvLyBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuCisKKwkJLy8gODAyLjExIEh5cGVyTGFuIDIKKwkJezEwMCwgMHg5ODQwMmVjOCwgMHg5ODRjMDZiMiwgMHg5ODE3OGE1NSwgMHg5ODBlZDc4M30sCisKKwkJLy8gMjAwOC4wNC4zMCBtb2RpZmllZAorCQkvLyBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZQorCQkvLyBmb3IgY2hhbm5lbCAxMDIgdG8gMTA4IGZvciB0aGUgUlQyODUwL1JUMjc1MCBkdWFsIGJhbmQgc29sdXRpb24uCisJCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9LAorCQl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEwOCwgMHg5ODQwMmVjYywgMHg5ODVjMGEzMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDE5M30sCisKKwkJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisJCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAorCQl7MTE2LCAweDk4NDAyZWNjLCAweDk4NGMwYTNhLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCisJCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAorCQl7MTI0LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKKwkJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0sIC8vIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNworCQl7MTI4LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAorCQl7MTM2LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKKwkJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisKKwkJLy8gODAyLjExIFVOSUkKKwkJezE0OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCisJCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAorCQl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfSwKKwkJezE1NywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Zn0sCisJCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAorCQl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKKwkJezE2NSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5N30sCisKKwkJLy8gSmFwYW4KKwkJezE4NCwgMHg5NTAwMmNjYywgMHg5NTAwNDkxZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEwYn0sCisJCXsxODgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjIsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MTkyLCAweDk1MDAyY2NjLCAweDk1MDA0OTI2LCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezE5NiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisJCXsyMDgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2EsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MjEyLCAweDk1MDAyY2NjLCAweDk1MDA0OTNlLCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezIxNiwgMHg5NTAwMmNjYywgMHg5NTAwNDk4MiwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisKKwkJLy8gc3RpbGwgbGFjayBvZiBNTUFDKEphcGFuKSBjaCAzNCwzOCw0Miw0NgorfTsKK1VDSEFSCU5VTV9PRl8yODUwX0NITkwgPSAoc2l6ZW9mKFJGMjg1MFJlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JGX1JFR1MpKTsKKworRlJFUVVFTkNZX0lURU0gRnJlcUl0ZW1zMzAyMFtdID0KK3sKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8gSVNNIDogMi40IHRvIDIuNDgzIEdIeiAgICAgICAgICAgICAgICAgICAgICAgICAvLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyAxMWcKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8tQ0gtLS1OLS0tLS0tLVItLS1LLS0tLS0tLS0tLS0KKwl7MSwgICAgMjQxLCAgMiwgIDJ9LAorCXsyLCAgICAyNDEsCSAyLCAgN30sCisJezMsICAgIDI0MiwJIDIsICAyfSwKKwl7NCwgICAgMjQyLAkgMiwgIDd9LAorCXs1LCAgICAyNDMsCSAyLCAgMn0sCisJezYsICAgIDI0MywJIDIsICA3fSwKKwl7NywgICAgMjQ0LAkgMiwgIDJ9LAorCXs4LCAgICAyNDQsCSAyLCAgN30sCisJezksICAgIDI0NSwJIDIsICAyfSwKKwl7MTAsICAgMjQ1LAkgMiwgIDd9LAorCXsxMSwgICAyNDYsCSAyLCAgMn0sCisJezEyLCAgIDI0NiwJIDIsICA3fSwKKwl7MTMsICAgMjQ3LAkgMiwgIDJ9LAorCXsxNCwgICAyNDgsCSAyLCAgNH0sCit9OworI2RlZmluZQlOVU1fT0ZfMzAyMF9DSE5MCShzaXplb2YoRnJlcUl0ZW1zMzAyMCkgLyBzaXplb2YoRlJFUVVFTkNZX0lURU0pKQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWluaXRpYWxpemUgdGhlIE1MTUUgdGFzayBhbmQgaXRzIGRhdGEgc3RydWN0dXJlIChxdWV1ZSwgc3BpbmxvY2ssCisJCXRpbWVyLCBzdGF0ZSBtYWNoaW5lcykuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJUmV0dXJuOgorCQlhbHdheXMgcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTWxtZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBNTE1FIEluaXRpYWxpemVcbiIpKTsKKworCWRvCisJeworCQlTdGF0dXMgPSBNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOworCQlpZihTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisKKwkJCS8vIGluaXQgU1RBIHN0YXRlIG1hY2hpbmVzCisJCQlBc3NvY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgcEFkLT5NbG1lLkFzc29jRnVuYyk7CisJCQlBdXRoU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoRnVuYyk7CisJCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoUnNwRnVuYyk7CisJCQlTeW5jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIHBBZC0+TWxtZS5TeW5jRnVuYyk7CisJCQlXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBwQWQtPk1sbWUuV3BhUHNrRnVuYyk7CisJCQlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIHBBZC0+TWxtZS5BaXJvbmV0RnVuYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCURsc1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIHBBZC0+TWxtZS5EbHNGdW5jKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCisJCQkvLyBTaW5jZSB3ZSBhcmUgdXNpbmcgc3dpdGNoL2Nhc2UgdG8gaW1wbGVtZW50IGl0LCB0aGUgaW5pdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUKKwkJCS8vIHN0YXRlIG1hY2hpbmUgaW5pdAorCQkJTWxtZUNudGxJbml0KHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwkJQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgcEFkLT5NbG1lLkFjdEZ1bmMpOworCisJCS8vIEluaXQgbWxtZSBwZXJpb2RpYyB0aW1lcgorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyksIHBBZCwgVFJVRSk7CisKKwkJLy8gU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CisKKwkJLy8gc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwgRkFMU0UpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCSAgICAgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkgICAgICAgIHsKKwkgICAgICAgICAgICAvLyBvbmx5IFBDSWUgY2FyZHMgbmVlZCB0aGVzZSB0d28gdGltZXJzCisJICAgIAkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyksIHBBZCwgRkFMU0UpOworCSAgICAJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKSwgcEFkLCBGQUxTRSk7CisJICAgICAgICB9CisJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCX0gd2hpbGUgKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBNTE1FIEluaXRpYWxpemVcbiIpKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWFpbiBsb29wIG9mIHRoZSBNTE1FCisJUHJlOgorCQlNbG1lIGhhcyB0byBiZSBpbml0aWFsaXplZCwgYW5kIHRoZXJlIGFyZSBzb21ldGhpbmcgaW5zaWRlIHRoZSBxdWV1ZQorCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBmcm9tIE1QU2V0SW5mb3JtYXRpb24gYW5kIE1QUmVjZWl2ZTsKKwkJVGhpcyB0YXNrIGd1YXJhbnRlZSBvbmx5IG9uZSBNbG1lSGFuZGxlciB3aWxsIHJ1bi4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lSGFuZGxlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlNTE1FX1FVRVVFX0VMRU0gCSAgICpFbGVtID0gTlVMTDsKKyNpZmRlZiBBUENMSV9TVVBQT1JUCisJU0hPUlQgYXBjbGlJZkluZGV4OworI2VuZGlmCisKKwkvLyBPbmx5IGFjY2VwdCBNTE1FIGFuZCBGcmFtZSBmcm9tIHBlZXIgc2lkZSwgbm8gb3RoZXIgKGNvbnRyb2wvZGF0YSkgZnJhbWUgc2hvdWxkCisJLy8gZ2V0IGludG8gdGhpcyBzdGF0ZSBtYWNoaW5lCisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCWlmKHBBZC0+TWxtZS5iUnVubmluZykKKwl7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5NbG1lLmJSdW5uaW5nID0gVFJVRTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01MTUVfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGV2aWNlIEhhbHRlZCBvciBSZW1vdmVkIG9yIE1sbWVSZXN0LCBleGl0IE1sbWVIYW5kbGVyISAocXVldWUgbnVtID0gJWxkKVxuIiwgcEFkLT5NbG1lLlF1ZXVlLk51bSkpOworCQkJYnJlYWs7CisJCX0KKworI2lmZGVmIFJBTElOS19BVEUKKwkJaWYoQVRFX09OKHBBZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93IGluIE1sbWVIYW5kbGVyXG4iKSk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQorCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQorCQl7CisKKwkJCS8vIGlmIGRlcXVldWUgc3VjY2VzcworCQkJc3dpdGNoIChFbGVtLT5NYWNoaW5lKQorCQkJeworCQkJCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcworI2lmZGVmCUNPTkZJR19TVEFfU1VQUE9SVAorCQkJCWNhc2UgQVNTT0NfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRIX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1lOQ19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkU6CisJCQkJCU1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCQljYXNlIExFQVBfU1RBVEVfTUFDSElORToKKwkJCQkJTGVhcE1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5MZWFwTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJY2FzZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCQljYXNlIERMU19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5EbHNNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCQljYXNlIEFDVElPTl9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisKKworCisKKwkJCQlkZWZhdWx0OgorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFUlJPUjogSWxsZWdhbCBtYWNoaW5lICVsZCBpbiBNbG1lSGFuZGxlcigpXG4iLCBFbGVtLT5NYWNoaW5lKSk7CisJCQkJCWJyZWFrOworCQkJfSAvLyBlbmQgb2Ygc3dpdGNoCisKKwkJCS8vIGZyZWUgTUxNRSBlbGVtZW50CisJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOworCQkJRWxlbS0+TXNnTGVuID0gMDsKKworCQl9CisJCWVsc2UgeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZUhhbmRsZXI6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOworCQl9CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURlc3RydWN0b3Igb2YgTUxNRSAoRGVzdHJveSBxdWV1ZSwgc3RhdGUgbWFjaGluZSwgc3BpbiBsb2NrIGFuZCB0aW1lcikKKwlQYXJhbWV0ZXJzOgorCQlBZGFwdGVyIC0gTklDIEFkYXB0ZXIgcG9pbnRlcgorCVBvc3Q6CisJCVRoZSBNTE1FIHRhc2sgd2lsbCBubyBsb25nZXIgd29yayBwcm9wZXJseQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUhhbHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQk9PTEVBTiAJICBDYW5jZWxsZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUhhbHRcbiIpKTsKKworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJLy8gZGlzYWJsZSBCRUFDT04gZ2VuZXJhdGlvbiBhbmQgb3RoZXIgQkVBQ09OIHJlbGF0ZWQgaGFyZHdhcmUgdGltZXJzCisJCUFzaWNEaXNhYmxlU3luYyhwQWQpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlVQ0hBUgkJaTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJLy8gQ2FuY2VsIHBlbmRpbmcgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkJJkNhbmNlbGxlZCk7CisjaWZkZWYgUlQyODYwCisJICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisJICAgIHsKKwkgICAJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkJJkNhbmNlbGxlZCk7CisJCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwJCSZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAkJJkNhbmNlbGxlZCk7CisKKworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQkvLyBTZXQgTEVECisJCVJUTVBTZXRMRUQocEFkLCBMRURfSEFMVCk7CisgICAgICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KKwl9CisKKwlSVE1QdXNlY0RlbGF5KDUwMDApOyAgICAvLyAgNSBtc2VjIHRvIGd1cmFudGVlIEFudCBEaXZlcnNpdHkgdGltZXIgY2FuY2VsZWQKKworCU1sbWVRdWV1ZURlc3Ryb3koJnBBZC0+TWxtZS5RdWV1ZSk7CisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBNbG1lSGFsdFxuIikpOworfQorCitWT0lEIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1J4T2tEYXRhQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudDsKKwkvLyBjbGVhciBhbGwgT25lU2VjeHh4IGNvdW50ZXJzLgorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjQmVhY29uU2VudENudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQgPSAwOworCisJLy8gVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQkVdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQktdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfVkldID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfVk9dID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfQkVdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfQktdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfVkldID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfVk9dID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4Q291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4QWdncmVnYXRpb25Db3VudCA9IDA7CisKKwlyZXR1cm47Cit9CisKK3Vuc2lnbmVkIGxvbmcgcnhfQU1TRFU7Cit1bnNpZ25lZCBsb25nIHJ4X1RvdGFsOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgdG8gLQorCQkxLiBEZWNpZGUgaWYgaXQncyBhIHJpZ2h0IHRpbWUgdG8gdHVybiBvbiBQd3JNZ210IGJpdCBvZiBhbGwKKwkJICAgb3V0Z29paW5nIGZyYW1lcworCQkyLiBDYWxjdWxhdGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb24gc3RhdGlzdGljcyBvZiB0aGUgbGFzdAorCQkgICBwZXJpb2QsIHNvIHRoYXQgVFggcmF0ZSB3b24ndCB0b2dnbGluZyB2ZXJ5IGZyZXF1ZW50bHkgYmV0d2VlbiBhCisJCSAgIHN1Y2Nlc3NmdWwgVFggYW5kIGEgZmFpbGVkIFRYLgorCQkzLiBJZiB0aGUgY2FsY3VsYXRlZCBDaGFubmVsUXVhbGl0eSBpbmRpY2F0ZWQgY3VycmVudCBjb25uZWN0aW9uIG5vdAorCQkgICBoZWFsdGh5LCB0aGVuIGEgUk9BTWluZyBhdHRlbXB0IGlzIHRyaWVkIGhlcmUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNkZWZpbmUgQURIT0NfQkVBQ09OX0xPU1RfVElNRQkJKDgqT1NfSFopICAvLyA4IHNlYworVk9JRCBNbG1lUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlVTE9ORwkJCVR4VG90YWxDbnQ7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJICAgIC8vIElmIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZCwgd2UgaGF2ZSB0byBjaGVjayBHUElPIHBpbjIgZXZlcnkgMiBzZWNvbmQuCisJCS8vIE1vdmUgY29kZSB0byBoZXJlLCBiZWNhdXNlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV0dXJuIHdoZW4gcmFkaW8gaXMgb2ZmCisJCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSAoTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiAyKSA9PSAwKSAmJiAocEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSkKKwkJeworCQkJVUlOVDMyCQkJCWRhdGEgPSAwOworCisJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCWlmIChkYXRhICYgMHgwNCkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKKwkJCX0KKwkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworCQkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKwkJCQl7CisJCQkJCU1sbWVSYWRpb09uKHBBZCk7CisJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCU1sbWVSYWRpb09mZihwQWQpOworCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBIV19SQURJT19PRkY7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQorCQlyZXR1cm47CisKKwlSVDI4WFhfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogRG8gbm90IHNob3cgUlNTSSB1bnRpbCAiTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjIi4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAhPSAoTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgLSAxKSkKKwl7CisJCQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKworCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJiAweDEpCisJCXsKKwkJCS8vIFRoaXMgaXMgdGhlIGZpeCBmb3Igd2lmaSAxMW4gZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgdGVzdCBjYXNlLiAgZm9yIDI4NjBECisJCQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkgJiYKKwkJCQkoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCisJCQkJKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9PSBGQUxTRSkpCisKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjRCZik7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IFRSVUU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKKwkJCQkJCSgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNDNmKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gRkFMU0U7CisJCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOworCisvLwlSRUNCQVRpbWVyVGltZW91dChTeXN0ZW1TcGVjaWZpYzEsRnVuY3Rpb25Db250ZXh0LFN5c3RlbVNwZWNpZmljMixTeXN0ZW1TcGVjaWZpYzMpOworCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICsrOworCisJLy8gZXhlY3V0ZSBldmVyeSA1MDBtcworCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkvKihPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKSovKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy8gcGVyZm9ybSBkeW5hbWljIHR4IHJhdGUgc3dpdGNoaW5nIGJhc2VkIG9uIHBhc3QgVFggaGlzdG9yeQorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkJCQkpCisJCQkJJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSkKKwkJCQlNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZyhwQWQpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjLgorCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkKKwl7CisgICAgICAgICAgICAgICAgcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgKys7CisKKyNpZmRlZiBSQUxJTktfQVRFCisgICAgCWlmIChBVEVfT04ocEFkKSkKKyAgICAJeworCQkJLyogcmVxdWVzdCBmcm9tIEJhcm9uIDogbW92ZSB0aGlzIHJvdXRpbmUgZnJvbSBsYXRlciB0byBoZXJlICovCisJCQkvKiBmb3Igc2hvd2luZyBSeCBlcnJvciBjb3VudCBpbiBBVEUgUlhGUkFNRSAqLworICAgICAgICAgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKwkJCWlmIChwQWQtPmF0ZS5iUnhGZXIgPT0gMSkKKwkJCXsKKwkJCQlwQWQtPmF0ZS5SeFRvdGFsQ250ICs9IHBBZC0+YXRlLlJ4Q250UGVyU2VjOworCQkJICAgIGF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBwYWNrZXQgY250ID0gJWQvJWRcbiIsIHBBZC0+YXRlLlJ4Q250UGVyU2VjLCBwQWQtPmF0ZS5SeFRvdGFsQ250KTsKKwkJCQlwQWQtPmF0ZS5SeENudFBlclNlYyA9IDA7CisKKwkJCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCQkJCWF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBBdmdSc3NpMD0lZCwgQXZnUnNzaTE9JWQsIEF2Z1Jzc2kyPSVkXG5cbiIsCisJCQkJCQlwQWQtPmF0ZS5BdmdSc3NpMCwgcEFkLT5hdGUuQXZnUnNzaTEsIHBBZC0+YXRlLkF2Z1Jzc2kyKTsKKwkJCQllbHNlCisJCQkJCWF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBBdmdSc3NpPSVkXG5cbiIsIHBBZC0+YXRlLkF2Z1Jzc2kwKTsKKwkJCX0KKwkJCU1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHBBZCk7CisJCQlyZXR1cm47CisgICAgCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCQlpZiAocnhfVG90YWwpCisJCXsKKworCQkJLy8gcmVzZXQgY291bnRlcnMKKwkJCXJ4X0FNU0RVID0gMDsKKwkJCXJ4X1RvdGFsID0gMDsKKwkJfQorCisJCS8vIE1lZGlhIHN0YXR1cyBjaGFuZ2VkLCByZXBvcnQgdG8gTkRJUworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSkpCisJCXsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQl7CisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCQkJfQorCQl9CisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLk5vdzMyKTsKKworCQkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgdmFyaWFibGUsIHNvIHRoYXQKKwkJLy8gdGhlIGR5bmFtaWMgdHVuaW5nIG1lY2hhbmlzbSBiZWxvdyBhcmUgYmFzZWQgb24gbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCisJCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgCQkvLyBOZWVkIHN0YXRpc3RpY3MgYWZ0ZXIgcmVhZCBjb3VudGVyLiBTbyBwdXQgYWZ0ZXIgTklDVXBkYXRlUmF3Q291bnRlcnMKKwkJT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJCS8vIFRoZSB0aW1lIHBlcmlvZCBmb3IgY2hlY2tpbmcgYW50ZW5uYSBpcyBhY2NvcmRpbmcgdG8gdHJhZmZpYworCQlpZiAocEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrKQorCQl7CisJCQlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250ID4gNTApCisJCQl7CisJCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTAgPT0gMCkKKwkJCQl7CisJCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDMgPT0gMCkKKwkJCQl7CisJCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCQkJfQorCQkJfQorCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVNUQU1sbWVQZXJpb2RpY0V4ZWMocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKyNpZmRlZiBSVDI4NjAKKwkJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpICYmIChwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpKQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJeworCQkJCS8vIFdoZW4gQWRob2MgYmVhY29uIGlzIGVuYWJsZWQgYW5kIFJUUy9DVFMgaXMgZW5hYmxlZCwgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBoYXJkd2FyZSBNQUMgRlNNIHdpbGwgcnVuIGludG8gYSBkZWFkbG9jaworCQkJCS8vIGFuZCBzZW5kaW5nIENUUy10by1zZWxmIG92ZXIgYW5kIG92ZXIuCisJCQkJLy8gU29mdHdhcmUgUGF0Y2ggU29sdXRpb246CisJCQkJLy8gMS4gUG9sbGluZyBkZWJ1ZyBzdGF0ZSByZWdpc3RlciAweDEwRjQgZXZlcnkgb25lIHNlY29uZC4KKwkJCQkvLyAyLiBJZiBpbiAweDEwRjQgdGhlICgoYml0Mjk9PTEpICYmIChiaXQ3PT0xKSkgT1IgKChiaXQyOT09MSkgJiYgKGJpdDU9PTEpKSwgaXQgbWVhbnMgdGhlIGRlYWRsb2NrIGhhcyBvY2N1cnJlZC4KKwkJCQkvLyAzLiBJZiB0aGUgZGVhZGxvY2sgb2NjdXJyZWQsIHJlc2V0IE1BQy9CQlAgYnkgc2V0dGluZyAweDEwMDQgdG8gMHgwMDAxIGZvciBhIHdoaWxlIHRoZW4gc2V0dGluZyBpdCBiYWNrIHRvIDB4MDAwQyBhZ2Fpbi4KKworCQkJCVVJTlQzMglNYWNSZWcgPSAwOworCisJCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEwRjQsICZNYWNSZWcpOworCQkJCWlmICgoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDgwKSkgfHwgKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHgyMCkpKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOworCQkJCQlSVE1QdXNlY0RlbGF5KDEpOworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Qyk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoIldhcm5pbmcsIE1BQyBzcGVjaWZpYyBjb25kaXRpb24gb2NjdXJzIFxuIikpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CisKKworCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBTVEFNbG1lUGVyaW9kaWNFeGVjKAorCVBSVE1QX0FEQVBURVIgcEFkKQoreworCVVMT05HCQkJICAgIFR4VG90YWxDbnQ7CisKKy8vCisvLyBXZSByZXR1cm4gaGVyZSBpbiBBVEUgbW9kZSwgYmVjYXVzZSB0aGUgc3RhdGlzdGljcworLy8gdGhhdCBBVEUgbmVlZHMgYXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoaXMgcm91dGluZS4KKy8vCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIEl0IGlzIHN1cHBvc2VkIHRoYXQgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlIGluIEFURSBtb2RlLgorCUFTU0VSVCghKEFURV9PTihwQWQpKSk7CisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgeworICAgIAkvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJiAocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCisgICAgCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgIH0KKworICAgIGlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKSAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJcEFkLT5QcmVNZWRpYVN0YXRlID0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGU7CisJfQorCisKKworCisgICAJQXNpY1N0YUJicFR1bmluZyhwQWQpOworCisJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJLy8gdXBkYXRlIGNoYW5uZWwgcXVhbGl0eSBmb3IgUm9hbWluZyBhbmQgVUkgTGlua1F1YWxpdHkgZGlzcGxheQorCQlNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCX0KKworCS8vIG11c3QgYmUgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKSBiZWNhdXNlIGl0IG5lZWRzIHRvIGtub3cgaWYKKwkvLyBSYWRpbyBpcyBjdXJyZW50bHkgaW4gbm9pc3kgZW52aXJvbm1lbnQKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCUFzaWNBZGp1c3RUeFBvd2VyKHBBZCk7CisKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIENoZWNrIERMUyB0aW1lIG91dCwgdGhlbiB0ZWFyIGRvd24gdGhvc2Ugc2Vzc2lvbgorCQlSVE1QQ2hlY2tETFNUaW1lT3V0KHBBZCk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8KKwkJLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OworCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIDEqT1NfSFogPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCisJCQkoKFR4VG90YWxDbnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPCA2MDApKSkKKwkJeworCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKSk7CisJCX0KKworICAgICAgICB7CisgICAgCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorICAgIAkJeworICAgIAkJICAgIC8vIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIwKSA9PSA4KQorICAgIAkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisgICAgCQl9CisgICAgCQllbHNlCisgICAgCQl7CisgICAgCQkgICAgLy8gU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwKSA9PSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorICAgIAkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisJCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAJCX0KKyAgICAgICAgfQorCisJCWlmIChDUUlfSVNfREVBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSA9IHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWU7CisKKwkJCS8vIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudAorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQkJeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9CisJCWVsc2UgaWYgKENRSV9JU19CQUQocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5KSkKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCArKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gQmFkIENRSS4gQXV0byBSZWNvdmVyeSBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQpKTsKKwkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJfQorCisJCS8vIEFkZCBhdXRvIHNlYW1sZXNzIHJvYW1pbmcKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZykKKwkJeworCQkJU0hPUlQJZEJtVG9Sb2FtID0gKFNIT1JUKXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnNzaT0lZCwgZEJtVG9Sb2FtPSVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCAoQ0hBUilkQm1Ub1JvYW0pKTsKKworCQkJaWYgKFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMikgPD0gKENIQVIpZEJtVG9Sb2FtKQorCQkJeworCQkJCU1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmIChBREhPQ19PTihwQWQpKQorCXsKKwkJLy8gMjAwMy0wNC0xNyBqb2huLiB0aGlzIGlzIGEgcGF0Y2ggdGhhdCBkcml2ZXIgZm9yY2VzIGEgQkVBQ09OIG91dCBpZiBBU0lDIGZhaWxzCisJCS8vIHRoZSAiVFggQkVBQ09OIGNvbXBldGl0aW9uIiBmb3IgdGhlIGVudGlyZSBwYXN0IDEgc2VjLgorCQkvLyBTbyB0aGF0IGV2ZW4gd2hlbiBBU0lDJ3MgQkVBQ09OZ2VuIGVuZ2luZSBiZWVuIGJsb2NrZWQKKwkJLy8gYnkgcGVlcidzIEJFQUNPTiBkdWUgdG8gc2xvd2VyIHN5c3RlbSBjbG9jaywgdGhpcyBTVEEgc3RpbGwgY2FuIHNlbmQgb3V0CisJCS8vIG1pbmltdW0gQkVBQ09OIHRvIHRlbGwgdGhlIHBlZXIgSSdtIGFsaXZlLgorCQkvLyBkcmF3YmFjayBpcyB0aGF0IHRoaXMgQkVBQ09OIHdvbid0IGJlIHdlbGwgYWxpZ25lZCBhdCBUQlRUIGJvdW5kYXJ5LgorCQkvLyBFbnF1ZXVlQmVhY29uRnJhbWUocEFkKTsJCQkgIC8vIHNvZnR3YXJlIHNlbmQgQkVBQ09OCisKKwkJLy8gaWYgYWxsIDExYiBwZWVycyBsZWF2ZSB0aGlzIEJTUyBtb3JlIHRoYW4gNSBzZWNvbmRzLCB1cGRhdGUgVHggcmF0ZSwKKwkJLy8gcmVzdG9yZSBvdXRnb2luZyBCRUFDT04gdG8gc3VwcG9ydCBCL0ctbWl4ZWQgbW9kZQorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCQkJICAgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPD0gUkFURV8xMSkJICAgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5NYXhEZXNpcmVkUmF0ZSA+IFJBVEVfMTEpICAmJgorCQkJKChwQWQtPlN0YUNmZy5MYXN0MTFiQmVhY29uUnhUaW1lICsgNSpPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMTFCIHBlZXIgbGVmdCwgdXBkYXRlIFR4IHJhdGVzXG4iKSk7CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOworCQkJTWFrZUlic3NCZWFjb24ocEFkKTsJCS8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7CS8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPSBGQUxTRTsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCkgJiYKKwkJCQkoKHBBZC0+U3RhQ2ZnLkxhc3QxMWdCZWFjb25SeFRpbWUgKyA1ICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMTFHIHBlZXIgbGVmdFxuIikpOworCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBGQUxTRTsKKwkJCX0KKworCQkJaWYgKChwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCkgJiYKKwkJCQkoKHBBZC0+U3RhQ2ZnLkxhc3QyME5CZWFjb25SeFRpbWUgKyA1ICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMjBNSHogTiBwZWVyIGxlZnRcbiIpKTsKKwkJCQlwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9IEZBTFNFOworCQkJfQorCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJLy9yYWRhciBkZXRlY3QKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCXsKKwkJCVJhZGFyRGV0ZWN0UGVyaW9kaWMocEFkKTsKKwkJfQorCisJCS8vIElmIGFsbCBwZWVycyBsZWF2ZSwgYW5kIHRoaXMgU1RBIGJlY29tZXMgdGhlIGxhc3Qgb25lIGluIHRoaXMgSUJTUywgdGhlbiBjaGFuZ2UgTWVkaWFTdGF0ZQorCQkvLyB0byBESVNDT05ORUNURUQuIEJ1dCBzdGlsbCBob2xkaW5nIHRoaXMgSUJTUyAoaS5lLiBzZW5kaW5nIEJFQUNPTikgc28gdGhhdCBvdGhlciBTVEFzIGNhbgorCQkvLyBqb2luIGxhdGVyLgorCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19CRUFDT05fTE9TVF9USU1FIDwgcEFkLT5NbG1lLk5vdzMyKSAmJgorCQkJT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQl7CisJCQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGV4Y2Vzc2l2ZSBCRUFDT04gbG9zdCwgbGFzdCBTVEEgaW4gdGhpcyBJQlNTLCBNZWRpYVN0YXRlPURpc2Nvbm5lY3RlZFxuIikpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKwkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7CisJCX0KKwl9CisJZWxzZSAvLyBubyBJTkZSQSBub3IgQURIT0MgY29ubmVjdGlvbgorCXsKKworCQlpZiAocEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSAmJgorICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAzMCAqIE9TX0haKSA+IHBBZC0+TWxtZS5Ob3czMikpCisJCQlnb3RvIFNLSVBfQVVUT19TQ0FOX0NPTk47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpCisJCQkmJiBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApCisJCQkmJiAoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJCXsKKwkJCWlmICgocEFkLT5TY2FuVGFiLkJzc05yPT0wKSAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQorCQkJeworCQkJCU1MTUVfU0NBTl9SRVFfU1RSVUNUCSAgIFNjYW5SZXE7CisKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBTWxtZVBlcmlvZGljRXhlYygpOkNOVEwgLSBTY2FuVGFiLkJzc05yPT0wLCBzdGFydCBhIG5ldyBBQ1RJVkUgc2NhbiBTU0lEWyVzXVxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKSk7CisJCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCQkJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykJLy8gUXVpdCB0aGUgZm9yZXZlciBzY2FuIHdoZW4gaW4gYSB2ZXJ5IGNsZWFuIHJvb20KKwkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApCisJCQkJeworCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNSkgPT0gMSkKKwkJCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK1NLSVBfQVVUT19TQ0FOX0NPTk46CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCAhPTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IEZBTFNFKSkKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBUUlVFOworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKwllbHNlIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwID09MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gVFJVRSkpCisJeworCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gRkFMU0U7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApKQorCQlUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZShwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXJldHVybjsKK30KKworLy8gTGluayBkb3duIHJlcG9ydAorVk9JRCBMaW5rRG93bkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lQXV0b1NjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkJCTAsCisJCQkJCU5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKworCisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAmJgorCQkoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJeworCQlORElTXzgwMl8xMV9TU0lEIE9pZFNzaWQ7CisJCU9pZFNzaWQuU3NpZExlbmd0aCA9IHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkoT2lkU3NpZC5Tc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9TU0lEIHNldHRpbmcgLSAlcywgbGVuIC0gJWRcbiIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfU1NJRCwKKwkJCQkJc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorCQkJCQkmT2lkU3NpZCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlWYWxpZGF0ZSBTU0lEIGZvciBjb25uZWN0aW9uIHRyeSBhbmQgcmVzY2FuIHB1cnBvc2UKKwlWYWxpZCBTU0lEIHdpbGwgaGF2ZSB2aXNpYmxlIGNoYXJzIG9ubHkuCisJVGhlIHZhbGlkIGxlbmd0aCBpcyBmcm9tIDAgdG8gMzIuCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAorCUlOIFBVQ0hBUglwU3NpZCwKKwlJTiBVQ0hBUglTc2lkTGVuKQoreworCWludAlpbmRleDsKKworCWlmIChTc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCS8vIENoZWNrIGVhY2ggY2hhcmFjdGVyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU3NpZExlbjsgaW5kZXgrKykKKwl7CisJCWlmIChwU3NpZFtpbmRleF0gPCAweDIwKQorCQkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJLy8gQWxsIGNoZWNrZWQKKwlyZXR1cm4gKFRSVUUpOworfQorCitWT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpCit7CisJZG8KKwl7CisJCS8vIGRlY2lkZSB0aGUgcmF0ZSB0YWJsZSBmb3IgdHVuaW5nCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVUYWJsZVNpemUgPiAwKQorCQl7CisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlWzFdOworCisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCisJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgJiYKKwkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgorCQkJCShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJCSgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQorCQkJey8vIDExTiAxUyBBZGhvYworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKKwkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgJiYKKwkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKKwkJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkJCShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweGZmKSAmJgorCQkJCQkocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXsvLyAxMU4gMlMgQWRob2MKKwkJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCisJCQl9CisJICAgICAgICBlbHNlIGlmKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID09IFRSVUUpKQorCQkJeworCQkJCS8vIFVTZSBCIFRhYmxlIHdoZW4gT25seSBiLW9ubHkgU3RhdGlvbiBpbiBteSBJQlNTIC4KKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07CisKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gMTIpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJCSgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCisJCXsvLyAxMUJHTiAxUyBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpCisJCXsvLyAxMUJHTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlM7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMV07CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZDsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMV07CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKKwkJey8vIDExTiAxUyBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKKwkJey8vIDExTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJfQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID09IDQpICYmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJey8vIEIgb25seSBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA+IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID4gOCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7Ly8gQi9HICBtaXhlZCBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSA4KQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsvLyBHIG9ubHkgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsJLy8gTGVnYWN5IG1vZGUKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIDw9IFJBVEVfMTEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPiBSQVRFXzExKSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOworCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAorCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSkpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfSB3aGlsZShGQUxTRSk7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGVyZSdyZSBvdGhlciBBUHMgb3V0IHRoZXJlIGNhcGFibGUgZm9yCisJCXJvYW1pbmcuIENhbGxlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgb25seSB3aGVuIExpbmsgdXAgaW4gSU5GUkEgbW9kZQorCQlhbmQgY2hhbm5lbCBxdWFsaXR5IGlzIGJlbG93IENRSV9HT09EX1RIUkVTSE9MRC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJT3V0cHV0OgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORwlOb3czMikKK3sKKwlVU0hPUlQJICAgaTsKKwlCU1NfVEFCTEUgICpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKKwlCU1NfRU5UUlkgICpwQnNzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvclJvYW1pbmdcbiIpKTsKKwkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKKwlCc3NUYWJsZUluaXQocFJvYW1UYWIpOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCisJCWlmICgocEJzcy0+TGFzdEJlYWNvblJ4VGltZSArIEJFQUNPTl9MT1NUX1RJTUUpIDwgTm93MzIpCisJCQljb250aW51ZTsJIC8vIEFQIGRpc2FwcGVhcgorCQlpZiAocEJzcy0+UnNzaSA8PSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORykKKwkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCisJCWlmIChwQnNzLT5Sc3NpIDwgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJIC8vIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nCisKKwkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBSb2FtVGFiLT5Cc3NOciArPSAxOworCX0KKworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQorCXsKKwkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yUm9hbWluZygjIG9mIGNhbmRpZGF0ZT0gJWQpXG4iLHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgorCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUKKwkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU91dHB1dDoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVMT05HCQkJTm93KQoreworCVVTSE9SVAkJaTsKKwlCU1NfVEFCTEUJKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCUJTU19FTlRSWQkqcEJzczsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOworCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisKKyAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCisJCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAorCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKKyAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQorCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCBwQnNzLT5Sc3NpKSk7CisJCS8vIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlCisJCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKKwl9CisKKwlpZiAocFJvYW1UYWItPkJzc05yID4gMCkKKwl7CisJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nIGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCX0KKwl9CisJLy8gTWF5YmUgc2l0ZSBzdXJ2ZXkgcmVxdWlyZWQKKwllbHNlCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogMTAwMCkgPCBOb3cpCisJCXsKKwkJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcsIE5vIGVsaWdhYmxlIGVudHJ5LCB0cnkgbmV3IHNjYW4hXG4iKSk7CisJCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMjsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJCU1sbWVBdXRvU2NhbihwQWQpOworCQl9CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCisJCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCisKKwkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KKwlPdXRwdXQ6CisJCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCisJCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCisJCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCisJCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTm93MzIpCit7CisJVUxPTkcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKKwlVTE9ORyBSeENudCwgUnhQRVI7CisJVUNIQVIgTm9yUnNzaTsKKwlDSEFSICBNYXhSc3NpOworCVVMT05HIEJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRTsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJLy8gbG9uZ2VyIGJlYWNvbiBsb3N0IHRpbWUgd2hlbiBjYXJyaWVyIGRldGVjdGlvbiBlbmFibGVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJeworCQlCZWFjb25Mb3N0VGltZSA9IEJFQUNPTl9MT1NUX1RJTUUgKyBCRUFDT05fTE9TVF9USU1FLzI7CisJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworCisJLy8KKwkvLyBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MKKwkvLworCVR4T2tDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50OworCVR4Q250ID0gVHhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisJaWYgKFR4Q250IDwgNSkKKwl7CisJCVR4UEVSID0gMDsKKwkJVHhQUlIgPSAwOworCX0KKwllbHNlCisJeworCQlUeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICogMTAwKSAvIFR4Q250OworCQlUeFBSUiA9ICgoVHhDbnQgLSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQpICogMTAwKSAvIFR4Q250OworCX0KKworCS8vCisJLy8gY2FsY3VsYXRlIFJYIFBFUiAtIGRvbid0IHRha2UgUnhQRVIgaW50byBjb25zaWRlcmF0aW9uIGlmIHRvbyBmZXcgc2FtcGxlCisJLy8KKwlSeENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7CisJaWYgKFJ4Q250IDwgNSkKKwkJUnhQRVIgPSAwOworCWVsc2UKKwkJUnhQRVIgPSAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCAqIDEwMCkgLyBSeENudDsKKworCS8vCisJLy8gZGVjaWRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uOiAxKWxhc3QgQkVBQ09OIHJlY2VpdmVkIHRpbWUsIDIpbGFzdCBSU1NJLCAzKVR4UEVSLCBhbmQgNClSeFBFUgorCS8vCisJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA8IDIpICYmIC8vIG5vIGhlYXZ5IHRyYWZmaWMKKwkJKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBCZWFjb25Mb3N0VGltZSA8IE5vdzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJLy8gTm9ybWFsaXplIFJzc2kKKwkJaWYgKE1heFJzc2kgPiAtNDApCisJCQlOb3JSc3NpID0gMTAwOworCQllbHNlIGlmIChNYXhSc3NpIDwgLTkwKQorCQkJTm9yUnNzaSA9IDA7CisJCWVsc2UKKwkJCU5vclJzc2kgPSAoTWF4UnNzaSArIDkwKSAqIDI7CisKKwkJLy8gQ2hhbm5lbFF1YWxpdHkgPSBXMSpSU1NJICsgVzIqVHhQUlIgKyBXMypSeFBFUgkgKFJTU0kgMC4uMTAwKSwgKFR4UEVSIDEwMC4uMCksIChSeFBFUiAxMDAuLjApCisJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKworCQkJCQkJCQkgICBUWF9XRUlHSFRJTkcgKiAoMTAwIC0gVHhQUlIpICsKKwkJCQkJCQkJICAgUlhfV0VJR0hUSU5HKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKKwkJaWYgKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA+PSAxMDApCisJCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJfQorCit9CisKK1ZPSUQgTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpCit7CisJVUNIQVIJTWF4TW9kZSA9IE1PREVfT0ZETTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heE1vZGUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKworCWlmIChwVHhSYXRlLT5TVEJDICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworCWlmIChwVHhSYXRlLT5DdXJyTUNTIDwgTUNTX0FVVE8pCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwVHhSYXRlLT5DdXJyTUNTOworCisJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPiA3KQorCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworICAgCWlmIChBREhPQ19PTihwQWQpKQorCXsKKwkJLy8gSWYgcGVlciBhZGhvYyBpcyBiLW9ubHkgbW9kZSwgd2UgY2FuJ3Qgc2VuZCAxMWcgcmF0ZS4KKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBTVEJDX05PTkU7CisKKwkJLy8KKwkJLy8gRm9yIEFkaG9jIE1PREVfQ0NLLCBkcml2ZXIgd2lsbCB1c2UgQWRob2NCT25seUpvaW5lZCBmbGFnIHRvIHJvbGwgYmFjayB0byBCIG9ubHkgaWYgbmVjZXNzYXJ5CisJCS8vCisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwVHhSYXRlLT5Nb2RlOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCisJCS8vIFBhdGNoIHNwZWVkIGVycm9yIGluIHN0YXR1cyBwYWdlCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKHBUeFJhdGUtPk1vZGUgPD0gTWF4TW9kZSkKKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQorCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIFJlZXhhbSBlYWNoIGJhbmR3aWR0aCdzIFNHSSBzdXBwb3J0LgorCQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPT0gR0lfNDAwKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzIwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSkpKQorCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV180MCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpKSkKKwkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJfQorCisJCS8vIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLgorCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkKKwkJeworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKQorCQl7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpCisJCXsKKwkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCisJCX0KKwkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkKKwkJeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkgJiYKKwkJICAgIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCisJCSAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJfQorCisJcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGFjdW11bGF0ZWQgVHhQRVIgb2YgZWF4aCBUeFJhdGUuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgY2hhbmdlIENvbW1vbkNmZy5UeFJhdGUgd2hpY2gKKwkJaXMgdGhlIHN0YWJsZSBUWCBSYXRlIHdlIGV4cGVjdCB0aGUgUmFkaW8gc2l0dWF0aW9uIGNvdWxkIHN1c3RhaW5lZC4KKworCQlDb21tb25DZmcuVHhSYXRlIHdpbGwgY2hhbmdlIGR5bmFtaWNhbGx5IHdpdGhpbiB7UkFURV8xL1JBVEVfNiwgTWF4VHhSYXRlfQorCU91dHB1dDoKKwkJQ29tbW9uQ2ZnLlR4UmF0ZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6CisJCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7CisJVUxPTkcJCQkJCWksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKKwlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKKwlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlDSEFSCQkJCQlSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLyppZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCisJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CisJZWxzZQorCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsqLworCisJLy8KKwkvLyB3YWxrIHRocm91Z2ggTUFDIHRhYmxlLCBzZWUgaWYgbmVlZCB0byBjaGFuZ2UgQVAncyBUWCByYXRlIHRvd2FyZCBlYWNoIGVudHJ5CisJLy8KKyAgIAlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCS8vIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5CisJCWlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcEVudHJ5KSA9PSBGQUxTRSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKSB8fCAocEVudHJ5LT5WYWxpZEFzRGxzKSkKKwkJeworCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJCQlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gVFJVRTsKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworCQkJLy8gaWYgbm8gdHJhZmZpYyBpbiB0aGUgcGFzdCAxLXNlYyBwZXJpb2QsIGRvbid0IGNoYW5nZSBUWCByYXRlLAorCQkJLy8gYnV0IGNsZWFyIGFsbCBiYWQgaGlzdG9yeS4gYmVjYXVzZSB0aGUgYmFkIGhpc3RvcnkgbWF5IGFmZmVjdCB0aGUgbmV4dAorCQkJLy8gQ2hhcmlvdCB0aHJvdWdocHV0IHRlc3QKKwkJCUFjY3VUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisJCWVsc2UKKwkJeworCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLCAoQ0hBUilwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsIChDSEFSKXBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCisJCUN1cnJSYXRlSWR4ID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJaWYgKEN1cnJSYXRlSWR4ID49IFRhYmxlU2l6ZSkKKwkJeworCQkJQ3VyclJhdGVJZHggPSBUYWJsZVNpemUgLSAxOworCQl9CisKKwkJLy8gV2hlbiBzd2l0Y2ggZnJvbSBGaXhlZCByYXRlIC0+IGF1dG8gcmF0ZSwgdGhlIFJFQUwgVFggcmF0ZSBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleC4KKwkJLy8gU28gbmVlZCB0byBzeW5jIGhlcmUuCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJKQorCQl7CisKKwkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCisJCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCisJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKKworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCQkJY29udGludWU7CisJCX0KKworCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55CisJCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOworCQl9CisKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQorCQl7CisJCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7CisJCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQl9CisKKwkJLy9wQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisJCS8vCisJCS8vIEtlZXAgdGhlIGxhc3QgdGltZSBUeFJhdGVDaGFuZ2VBY3Rpb24gc3RhdHVzLgorCQkvLworCQlwRW50cnktPkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisKKworCQkvLworCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQorCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKKwkJLy8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTUpCisJCXsKKwkJCUNIQVIJaWR4ID0gMDsKKwkJCVVDSEFSCVR4UmF0ZUlkeDsKKwkJCS8vVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCBNQ1M3ID0gMCwgTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCAgTUNTNSA9MCwgTUNTNiA9IDAsIE1DUzcgPSAwOworCSAgICAgICAgVUNIQVIJTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMjAgPSAwLCBNQ1MyMSA9IDAsIE1DUzIyID0gMCwgTUNTMjMgPSAwOyAvLyAzKjMKKworCQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBhbmQgaW5kZXggb2YgZWFjaCBuZWVkZWQgTUNTCisJCQl3aGlsZSAoaWR4IDwgcFRhYmxlWzBdKQorCQkJeworCQkJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhpZHgrMSkqNV07CisKKwkJCQlpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzApCisJCQkJeworCQkJCQlNQ1MwID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMSkKKwkJCQl7CisJCQkJCU1DUzEgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yKQorCQkJCXsKKwkJCQkJTUNTMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpCisJCQkJeworCQkJCQlNQ1MzID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNCkKKwkJCQl7CisJCQkJCU1DUzQgPSBpZHg7CisJCQkJfQorCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU181KQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgTUNTNSA9IGlkeDsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzYpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBNQ1M2ID0gaWR4OworCSAgICAgICAgICAgIH0KKwkJCQkvL2Vsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vIHByZXZlbnQgdGhlIGhpZ2hlc3QgTUNTIHVzaW5nIHNob3J0IEdJIHdoZW4gMVQgYW5kIGxvdyB0aHJvdWdocHV0CisJCQkJeworCQkJCQlNQ1M3ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTIpCisJCQkJeworCQkJCQlNQ1MxMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEzKQorCQkJCXsKKwkJCQkJTUNTMTMgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNCkKKwkJCQl7CisJCQkJCU1DUzE0ID0gaWR4OworCQkJCX0KKwkJCQkvL2Vsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpLyogJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkqLykJLy93ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlLCBob3dldmVyIEF0aGVyb3MncyBjaGlwIGhhcyBidWdzIHdoZW4gc2hvcnQgR0kKKwkJCQl7CisJCQkJCU1DUzE1ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjApIC8vIDMqMworCQkJCXsKKwkJCQkJTUNTMjAgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMSkKKwkJCQl7CisJCQkJCU1DUzIxID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjIpCisJCQkJeworCQkJCQlNQ1MyMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIzKQorCQkJCXsKKwkJCQkJTUNTMjMgPSBpZHg7CisJCQkJfQorCQkJCWlkeCArKzsKKwkJCX0KKworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSAyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUnNzaU9mZnNldCA9IDg7CisJCQkJfQorCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLyppZiAoTUNTMTUpKi8KKwkJCWlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOM1MpIHx8CisJCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4zUykgfHwKKwkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpCisJCQl7Ly8gTiBtb2RlIHdpdGggMyBzdHJlYW0gLy8gMyozCisJCQkJaWYgKE1DUzIzICYmIChSc3NpID49IC03MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCWVsc2UgaWYgKE1DUzIyICYmIChSc3NpID49IC03MikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OworICAgICAgICAJICAgIGVsc2UgaWYgKE1DUzIxICYmIChSc3NpID49IC03NikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOworCQkJCWVsc2UgaWYgKE1DUzIwICYmIChSc3NpID49IC03OCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOworCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCisJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gLTg2KSkKKwkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQllbHNlCisJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJfQorCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlMpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kKSkgLy8gMyozCisJCQl7Ly8gTiBtb2RlIHdpdGggMiBzdHJlYW0KKwkJCQlpZiAoTUNTMTUgJiYgKFJzc2kgPj0gKC03MCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCWVsc2UgaWYgKE1DUzE0ICYmIChSc3NpID49ICgtNzIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxNDsKKwkJCQllbHNlIGlmIChNQ1MxMyAmJiAoUnNzaSA+PSAoLTc2K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7CisJCQkJZWxzZSBpZiAoTUNTMTIgJiYgKFJzc2kgPj0gKC03OCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPj0gKC04MitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+PSAoLTg0K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID49ICgtODYrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPj0gKC04OCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCQkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjFTKSkKKwkJCXsvLyBOIG1vZGUgd2l0aCAxIHN0cmVhbQorCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gKC03MitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzc7CisJCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+ICgtNzQrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M2OworCQkJCWVsc2UgaWYgKE1DUzUgJiYgKFJzc2kgPiAoLTc3K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gKC03OStSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+ICgtODErUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAoLTgzK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID4gKC04NitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJey8vIExlZ2FjeSBtb2RlCisJCQkJaWYgKE1DUzcgJiYgKFJzc2kgPiAtNzApKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M3OworCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAtNzQpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M2OworCQkJCWVsc2UgaWYgKE1DUzUgJiYgKFJzc2kgPiAtNzgpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M1OworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPiAtODIpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzQgPT0gMCkJLy8gZm9yIEItb25seSBtb2RlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+IC04NSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+IC04NykpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+IC05MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCisJCQl7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBUeFJhdGVJZHg7CisJCQkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KzEpKjVdOworCQkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJCX0KKworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IFRSVUU7CisJCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID09IFRSVUUpCisJCXsKKwkJCXBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID0gRkFMU0U7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWRvCisJCXsKKwkJCUJPT0xFQU4JYlRyYWluVXBEb3duID0gRkFMU0U7CisKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgKys7CisKKwkJCS8vIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkCisJCQlpZiAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikKKwkJCXsKKwkJCQliVHJhaW5VcERvd24gPSBUUlVFOworCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCQkJLy8gdXBncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA8PSBSYXRlLVVwIHRocmVzaG9sZAorCQkJZWxzZSBpZiAoVHhFcnJvclJhdGlvIDw9IFRyYWluVXApCisJCQl7CisJCQkJYlRyYWluVXBEb3duID0gVFJVRTsKKwkJCQliVXBncmFkZVF1YWxpdHkgPSBUUlVFOworCQkJCWlmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0pCisJCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSAtLTsgIC8vIHF1YWxpdHkgdmVyeSBnb29kIGluIEN1cnJSYXRlCisKKwkJCQlpZiAocEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkpCisJCQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5IC0tOworCQkJCWVsc2UgaWYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0pCisJCQkJCXBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gLS07ICAgIC8vIG1heSBpbXByb3ZlIG5leHQgVVAgcmF0ZSdzIHF1YWxpdHkKKwkJCX0KKworCQkJcEVudHJ5LT5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKKworCQkJaWYgKGJUcmFpblVwRG93bikKKwkJCXsKKwkJCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCisJCQkJaWYgKChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA+PSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCkpCisJCQkJeworCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCX0KKwkJCQllbHNlIGlmICgoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSAmJiAocEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSA8PSAwKSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoRkFMU0UpOworCisJCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCisJCWlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKKwkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDE7IC8vIHJhdGUgVVAKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCisJCQkvLworCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIHVwCisJCQkvLworCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpCisJCQl7CisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKKworCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQl9CisJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CisJCX0KKwkJLy8gaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5CisJCWVsc2UgaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCisJCXsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgPSAwOworCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQorCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMjsgLy8gcmF0ZSBET1dOCisJCQlwRW50cnktPlR4UXVhbGl0eVtwRW50cnktPkN1cnJUeFJhdGVJbmRleF0gPSAwOworCQkJcEVudHJ5LT5QRVJbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKKworCQkJLy8KKwkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiBkb3duCisJCQkvLworCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpCisJCQl7CisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKKworCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQl9CisJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOyAvLyByYXRlIG5vIGNoYW5nZQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBGQUxTRTsKKwkJfQorCisJCXBFbnRyeS0+TGFzdFR4T2tDb3VudCA9IFR4U3VjY2VzczsKKworCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKKworCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgrMSkqNV07CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKKwkJeworCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVN0YXRpb24gc2lkZSwgQXV0byBUeFJhdGUgZmFzdGVyIHRyYWluIHVwIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJU3lzdGVtU3BlY2lmaWMxCQkJLSBOb3QgdXNlZC4KKwkJRnVuY3Rpb25Db250ZXh0CQkJLSBQb2ludGVyIHRvIG91ciBBZGFwdGVyIGNvbnRleHQuCisJCVN5c3RlbVNwZWNpZmljMgkJCS0gTm90IHVzZWQuCisJCVN5c3RlbVNwZWNpZmljMwkJCS0gTm90IHVzZWQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUFJUTVBfQURBUFRFUgkJCXBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKKwlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeCA9IDA7CisJVUxPTkcJCQkJCVR4VG90YWxDbnQ7CisJVUxPTkcJCQkJCVR4RXJyb3JSYXRpbyA9IDA7CisJQk9PTEVBTgkJCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOyAvLywgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJQ0hBUgkJCQkJUnNzaSwgcmF0aW87CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCVVMT05HCQkJCQlpOworCisJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKyAgICAvLworICAgIC8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKKyAgICAvLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQorCQkJY29udGludWU7CisKKwkJLy9Sc3NpID0gUlRNUE1heFJzc2kocEFkLCAoQ0hBUilwQWQtPlN0YUNmZy5BdmdSc3NpMCwgKENIQVIpcEFkLT5TdGFDZmcuQXZnUnNzaTEsIChDSEFSKXBBZC0+U3RhQ2ZnLkF2Z1Jzc2kyKTsKKwkgICAgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPiAxKQorCQkJUnNzaSA9IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICsgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSkgPj4gMTsKKwkJZWxzZQorCQkJUnNzaSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisKKwkJQ3VyclJhdGVJZHggPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleDsKKworCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJLy8gZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueQorCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKKwkJfQorCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfQorCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKFJzc2kgPiAtNjUpICYmIChwQ3VyclR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSkKKwkJeworCQkJVHJhaW5VcAkJPSAocEN1cnJUeFJhdGUtPlRyYWluVXAgKyAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duCT0gKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gKyAocEN1cnJUeFJhdGUtPlRyYWluRG93biA+PiAxKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlUcmFpblVwCQk9IHBDdXJyVHhSYXRlLT5UcmFpblVwOworCQkJVHJhaW5Eb3duCT0gcEN1cnJUeFJhdGUtPlRyYWluRG93bjsKKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDEpCisJCXsKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChUeFJldHJhbnNtaXQgKyBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCisKKwkJLy8KKwkJLy8gQ0FTRSAxLiB3aGVuIFRYIHNhbXBsZXMgYXJlIGZld2VyIHRoYW4gMTUsIHRoZW4gZGVjaWRlIFRYIHJhdGUgc29sZWx5IG9uIFJTU0kKKwkJLy8gICAgICAgICAoY3JpdGVyaWEgY29waWVkIGZyb20gUlQyNTAwIGZvciBOZXRvcGlhIGNhc2UpCisJCS8vCisJCWlmIChUeFRvdGFsQ250IDw9IDEyKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKworCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkgJiYgKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCX0KKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IFR4VG90YWxDbnQgPD0gMTUsIHRyYWluIGJhY2sgdG8gb3JpZ2luYWwgcmF0ZSBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWRvCisJCXsKKwkJCVVMT05HIE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQ7CisKKwkJCWlmIChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID09IDApCisJCQkJcmF0aW8gPSA1OworCQkJZWxzZQorCQkJCXJhdGlvID0gNDsKKworCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKKwkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQorCQkJeworCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCisJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltDdXJyUmF0ZUlkeF0gPSAoVUNIQVIpVHhFcnJvclJhdGlvOworCisJCQlPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50ID0gKFR4U3VjY2VzcyAqIHJhdGlvKTsKKworCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgorCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkgJiYgKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSkKKwkJCXsKKwkJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKworCQkJCX0KKworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKKwkJCXsKKwkJCQlpZiAoKFR4RXJyb3JSYXRpbyA+PSA1MCkgfHwgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pKQorCQkJCXsKKworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OworCQkJCX0KKwkJCX0KKwkJfXdoaWxlIChGQUxTRSk7CisKKwkJLy8gaWYgcmF0ZS11cCBoYXBwZW4sIGNsZWFyIGFsbCBiYWQgaGlzdG9yeSBvZiBhbGwgVFggcmF0ZXMKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCisJCXsKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQl9CisJCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQorCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogLS1UWCByYXRlIGZyb20gJWQgdG8gJWQgXG4iLCBDdXJyUmF0ZUlkeCwgcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpKTsKKworCQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQorCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXhdID0gMDsKKwkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOworCQl9CisKKwkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KzEpKjVdOworCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCisJCXsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgaXMgZXhlY3V0ZWQgcGVyaW9kaWNhbGx5IGluc2lkZSBNbG1lUGVyaW9kaWNFeGVjKCkgYWZ0ZXIKKwkJYXNzb2NpYXRpb24gd2l0aCBhbiBBUC4KKwkJSXQgY2hlY2tzIGlmIFN0YUNmZy5Qc20gaXMgY29uc2lzdGVudCB3aXRoIHVzZXIgcG9saWN5IChyZWNvcmRlZCBpbgorCQlTdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkuIElmIG5vdCwgZW5mb3JjZSB1c2VyIHBvbGljeS4gSG93ZXZlciwKKwkJdGhlcmUncmUgc29tZSBjb25kaXRpb25zIHRvIGNvbnNpZGVyOgorCQkxLiB3ZSBkb24ndCBzdXBwb3J0IHBvd2VyLXNhdmluZyBpbiBBREhPQyBtb2RlLCBzbyBQc209UFdSX0FDVElWRSBhbGwKKwkJICAgdGhlIHRpbWUgd2hlbiBNaWJzcz09VFJVRQorCQkyLiBXaGVuIGxpbmsgdXAgaW4gSU5GUkEgbW9kZSwgUHNtIHNob3VsZCBub3QgYmUgc3dpdGNoIHRvIFBXUl9TQVZFCisJCSAgIGlmIG91dGdvaW5nIHRyYWZmaWMgYXZhaWxhYmxlIGluIFR4UmluZyBvciBNZ210UmluZy4KKwlPdXRwdXQ6CisJCTEuIGNoYW5nZSBwQWQtPlN0YUNmZy5Qc20gdG8gUFdSX1NBVkUgb3IgbGVhdmUgaXQgdW50b3VjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HCU5vdzMyKQoreworCVVMT05HCVBvd2VyTW9kZTsKKworCS8vIGNvbmRpdGlvbiAtCisJLy8gMS4gUHNtIG1heWJlIE9OIG9ubHkgaGFwcGVuIGluIElORlJBU1RSVUNUVVJFIG1vZGUKKwkvLyAyLiB1c2VyIHdhbnRzIGVpdGhlciBNQVhfUFNQIG9yIEZBU1RfUFNQCisJLy8gMy4gYnV0IGN1cnJlbnQgcHNtIGlzIG5vdCBpbiBQV1JfU0FWRQorCS8vIDQuIENOVEwgc3RhdGUgbWFjaGluZSBpcyBub3QgZG9pbmcgU0NBTm5pbmcKKwkvLyA1LiBubyBUWCBTVUNDRVNTIGV2ZW50IGZvciB0aGUgcGFzdCAxLXNlYyBwZXJpb2QKKyNpZmRlZiBORElTNTFfTUlOSVBPUlQKKwlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyUHJvZmlsZSA9PSBOZGlzUG93ZXJQcm9maWxlQmF0dGVyeSkKKwkJUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGU7CisJZWxzZQorI2VuZGlmCisJCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisKKwlpZiAoSU5GUkFfT04ocEFkKSAmJgorCQkoUG93ZXJNb2RlICE9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pICYmCisJCShwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkgJiYKKwkJKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSkKKwl7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7CisJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCisJCXsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisJCX0KKwl9Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVNldFBzbUJpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJcEFkLT5TdGFDZmcuUHNtID0gcHNtOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmY3NyNC53b3JkKTsKKwljc3I0LmZpZWxkLkFja0N0c1BzbUJpdCA9IChwc20gPT0gUFdSX1NBVkUpPyAxOjA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRQc21CaXQgPSAlZFxuIiwgcHNtKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVTZXRUeFByZWFtYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUeFByZWFtYmxlKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCS8vVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOworCWlmIChUeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gTE9ORyBQUkVBTUJMRSlcbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAwOworCX0KKwllbHNlCisJeworCQkvLyBOT1RFOiAxTWJwcyBzaG91bGQgYWx3YXlzIHVzZSBsb25nIHByZWFtYmxlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IFNIT1JUIFBSRUFNQkxFKVxuIikpOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAxOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgY3NyNC53b3JkKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBVcGRhdGUgYmFzaWMgcmF0ZSBiaXRtYXAKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIpCit7CisgICAgSU5UICBpLCBqOworICAgICAgICAgICAgICAgICAgLyogMSAgMiAgNS41LCAxMSwgIDYsICA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsICA1NCAqLworICAgIFVDSEFSIHJhdGVbXSA9IHsgMiwgNCwgIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCB9OworICAgIFVDSEFSICpzdXBfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3VwUmF0ZTsKKyAgICBVQ0hBUiAqZXh0X3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkV4dFJhdGU7CisgICAgVUxPTkcgYml0bWFwID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXA7CisKKworICAgIC8qIGlmIEEgbW9kZSwgYWx3YXlzIHVzZSBmaXggQmFzaWNSYXRlQml0TWFwICovCisgICAgLy9pZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID09IFBIWV8xMUEpCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IDB4MTUwOyAvKiA2LCAxMiwgMjRNICovCisgICAgLyogRW5kIG9mIGlmICovCisKKyAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPiA0MDk1KQorICAgIHsKKyAgICAgICAgLyogKDIgXiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgLTEgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0gLyogRW5kIG9mIGlmICovCisKKyAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisgICAgeworICAgICAgICBzdXBfcFtpXSAmPSAweDdmOworICAgICAgICBleHRfcFtpXSAmPSAweDdmOworICAgIH0gLyogRW5kIG9mIGZvciAqLworCisgICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcCAmICgxIDw8IGkpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN1cF9wW2pdID09IHJhdGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHN1cF9wW2pdIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKworICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleHRfcFtqXSA9PSByYXRlW2ldKQorICAgICAgICAgICAgICAgICAgICBleHRfcFtqXSB8PSAweDgwOworICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLworICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogRW5kIG9mIGlmICovCisgICAgfSAvKiBFbmQgb2YgZm9yICovCit9IC8qIEVuZCBvZiBVcGRhdGVCYXNpY1JhdGVCaXRtYXAgKi8KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorLy8gYkxpbmtVcCBpcyB0byBpZGVudGlmeSB0aGUgaW5pdGFsIGxpbmsgc3BlZWQuCisvLyBUUlVFIGluZGljYXRlcyB0aGUgcmF0ZSB1cGRhdGUgYXQgbGlua3VwLCB3ZSBzaG91bGQgbm90IHRyeSB0byBzZXQgdGhlIHJhdGUgYXQgNTRNYnBzLgorVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOIAlCT09MRUFOCQkgCQliTGlua1VwLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCWludCBpLCBudW07CisJVUNIQVIgUmF0ZSA9IFJBVEVfNiwgTWF4RGVzaXJlID0gUkFURV8xLCBNYXhTdXBwb3J0ID0gUkFURV8xOworCVVDSEFSIE1pblN1cHBvcnQgPSBSQVRFXzU0OworCVVMT05HIEJhc2ljUmF0ZUJpdG1hcCA9IDA7CisJVUNIQVIgQ3VyckJhc2ljUmF0ZSA9IFJBVEVfMTsKKwlVQ0hBUiAqcFN1cFJhdGUsIFN1cFJhdGVMZW4sICpwRXh0UmF0ZSwgRXh0UmF0ZUxlbjsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCVVDSEFSCQkJCQlIdE1jcyA9IE1DU19BVVRPOworCisJLy8gZmluZCBtYXggZGVzaXJlZCByYXRlCisJVXBkYXRlQmFzaWNSYXRlQml0bWFwKHBBZCk7CisKKwludW0gPSAwOworCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVtpXSAmIDB4N2YpCisJCXsKKwkJCWNhc2UgMjogIFJhdGUgPSBSQVRFXzE7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDQ6ICBSYXRlID0gUkFURV8yOyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMTogUmF0ZSA9IFJBVEVfNV81OyBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjI6IFJhdGUgPSBSQVRFXzExOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDEyOiBSYXRlID0gUkFURV82OyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxODogUmF0ZSA9IFJBVEVfOTsgICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjQ6IFJhdGUgPSBSQVRFXzEyOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDM2OiBSYXRlID0gUkFURV8xODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSA0ODogUmF0ZSA9IFJBVEVfMjQ7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgNzI6IFJhdGUgPSBSQVRFXzM2OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDk2OiBSYXRlID0gUkFURV80ODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OyBudW0rKzsgICBicmVhazsKKwkJCS8vZGVmYXVsdDogUmF0ZSA9IFJBVEVfMTsgICBicmVhazsKKwkJfQorCQlpZiAoTWF4RGVzaXJlIDwgUmF0ZSkgIE1heERlc2lyZSA9IFJhdGU7CisJfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisKKwkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQlIdE1jcyAJCT0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmCisJCQkoTWF4RGVzaXJlID4gUkFURV8xMSkpCisJCXsKKwkJCU1heERlc2lyZSA9IFJBVEVfMTE7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPkNvbW1vbkNmZy5NYXhEZXNpcmVkUmF0ZSA9IE1heERlc2lyZTsKKwlwTWluSHRQaHktPndvcmQgPSAwOworCXBNYXhIdFBoeS0+d29yZCA9IDA7CisJcEh0UGh5LT53b3JkID0gMDsKKworCS8vIEF1dG8gcmF0ZSBzd2l0Y2hpbmcgaXMgZW5hYmxlZCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgREVTSVJFRCBSQVRFUyBhcmUKKwkvLyBzcGVjaWZpZWQ7IG90aGVyd2lzZSBkaXNhYmxlZAorCWlmIChudW0gPD0gMSkKKwl7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CisJfQorCisjaWYgMQorCWlmIChIdE1jcyAhPSBNQ1NfQVVUTykKKwl7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJcFN1cFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZVswXTsKKwkJcEV4dFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZVswXTsKKwkJU3VwUmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW47CisJCUV4dFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuOworCX0KKwllbHNlCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeworCQlwU3VwUmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdOworCQlwRXh0UmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdOworCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47CisJfQorCisJLy8gZmluZCBtYXggc3VwcG9ydGVkIHJhdGUKKwlmb3IgKGk9MDsgaTxTdXBSYXRlTGVuOyBpKyspCisJeworCQlzd2l0Y2ggKHBTdXBSYXRlW2ldICYgMHg3ZikKKwkJeworCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKKwkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7CisJCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7CisJCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKKwkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKKwkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7CisJCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOworCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7CisJCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOworCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7CisJCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKKwkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOworCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOworCQl9CisJCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7CisKKwkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKKwl9CisKKwlmb3IgKGk9MDsgaTxFeHRSYXRlTGVuOyBpKyspCisJeworCQlzd2l0Y2ggKHBFeHRSYXRlW2ldICYgMHg3ZikKKwkJeworCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKKwkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7CisJCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7CisJCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKKwkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKKwkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7CisJCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOworCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7CisJCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOworCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7CisJCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKKwkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOworCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOworCQl9CisJCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7CisKKwkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKKwl9CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRUdBQ1lfQkFTSUNfUkFURSwgQmFzaWNSYXRlQml0bWFwKTsKKworCS8vIGNhbGN1bGF0ZSB0aGUgZXhwdGVjdGVkIEFDSyByYXRlIGZvciBlYWNoIFRYIHJhdGUuIFRoaXMgaW5mbyBpcyB1c2VkIHRvIGNhY3VsYXRlCisJLy8gdGhlIERVUkFUSU9OIGZpZWxkIG9mIG91dGdvaW5nIHVuaWljYXN0IERBVEEvTUdNVCBmcmFtZQorCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisJeworCQlpZiAoQmFzaWNSYXRlQml0bWFwICYgKDB4MDEgPDwgaSkpCisJCQlDdXJyQmFzaWNSYXRlID0gKFVDSEFSKWk7CisJCXBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtpXSA9IEN1cnJCYXNpY1JhdGU7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlVHhSYXRlc1tNYXhTdXBwb3J0ID0gJWRdID0gTWF4RGVzaXJlICVkIE1icHNcbiIsIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0pKTsKKwkvLyBtYXggdHggcmF0ZSA9IG1pbiB7bWF4IGRlc2lyZSByYXRlLCBtYXggc3VwcG9ydGVkIHJhdGV9CisJaWYgKE1heFN1cHBvcnQgPCBNYXhEZXNpcmUpCisJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heFN1cHBvcnQ7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhEZXNpcmU7CisKKwlwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPSBNaW5TdXBwb3J0OworCWlmICgqYXV0b19yYXRlX2N1cl9wKQorCXsKKwkJc2hvcnQgZGJtID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCWRibSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlpZiAoYkxpbmtVcCA9PSBUUlVFKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8yNDsKKwkJZWxzZQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCisJCWlmIChkYm0gPCAtNzUpCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzExOworCQllbHNlIGlmIChkYm0gPCAtNzApCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OworCisJCS8vIHNob3VsZCBuZXZlciBleGNlZWQgTWF4VHhSYXRlIChjb25zaWRlciAxMUItb25seSBtb2RlKQorCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlID4gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCQlwSHRQaHktPmZpZWxkLk1DUwk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgLSA0KSA6IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKwkJcEh0UGh5LT5maWVsZC5NT0RFCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gTU9ERV9PRkRNIDogTU9ERV9DQ0s7CisKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IHBIdFBoeS0+ZmllbGQuU1RCQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBIdFBoeS0+ZmllbGQuU2hvcnRHSTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBIdFBoeS0+ZmllbGQuTUNTOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEh0UGh5LT5maWVsZC5NT0RFOworCX0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPD0gUkFURV8xMSkKKwl7CisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7CisJfQorCWVsc2UKKwl7CisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdOworCQlpZiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID49IFJBVEVfNiAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlIDw9IFJBVEVfNTQpKQorCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXTt9CisJCWVsc2UKKwkJCXtwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTt9CisJfQorCisJcEh0UGh5LT53b3JkID0gKHBNYXhIdFBoeS0+d29yZCk7CisJaWYgKGJMaW5rVXAgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwSHRQaHktPndvcmQ7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkID0gcE1heEh0UGh5LT53b3JkOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCA9IHBNaW5IdFBoeS0+d29yZDsKKwl9CisJZWxzZQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQorCQl7CisJCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQkJY2FzZSBQSFlfMTFCOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzExOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfMTFHOgorCQkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFOXzJfNEc6CisJCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAvLyBlcnJvcgorCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCQlicmVhazsKKwkJfQorCQkvLworCQkvLyBLZWVwIEJhc2ljIE1sbWUgUmF0ZS4KKwkJLy8KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkOworCQlpZiAocEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbUkFURV8yNF07CisJCWVsc2UKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IFJBVEVfMTsKKwkJcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoTWF4RGVzaXJlPSVkLCBNYXhTdXBwb3J0PSVkLCBNYXhUeFJhdGU9JWQsIE1pblJhdGU9JWQsIFJhdGUgU3dpdGNoaW5nID0lZClcbiIsCisJCQkgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0sIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdLAorCQkJIC8qT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSovKmF1dG9fcmF0ZV9jdXJfcCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoVHhSYXRlPSVkLCBSdHNSYXRlPSVkLCBCYXNpY1JhdGVCaXRtYXA9MHglMDRseClcbiIsCisJCQkgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5SdHNSYXRlXSwgQmFzaWNSYXRlQml0bWFwKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVVwZGF0ZVR4UmF0ZXMgKE1sbWVUcmFuc21pdD0weCV4LCBNaW5IVFBoeU1vZGU9JXgsIE1heEhUUGh5TW9kZT0weCV4LCBIVFBoeU1vZGU9MHgleClcbiIsCisJCQkgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgKSk7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiB1cGRhdGUgSFQgUmF0ZSBzZXR0aW5nLgorCQlJbnB1dCBXY2lkIHZhbHVlIGlzIHZhbGlkIGZvciAyIGNhc2UgOgorCQkxLiBpdCdzIHVzZWQgZm9yIFN0YXRpb24gaW4gaW5mcmEgbW9kZSB0aGF0IGNvcHkgQVAgcmF0ZSB0byBNYWN0YWJsZS4KKwkJMi4gT1IgU3RhdGlvbiAJaW4gYWRob2MgbW9kZSB0byBjb3B5IHBlZXIncyBIVCByYXRlIHRvIE1hY3RhYmxlLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCisJSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCkKK3sKKwlVQ0hBUglTdGJjTWNzOyAvL2osIFN0YmNNY3MsIGJpdG1hc2s7CisJQ0hBUiAJaTsgLy8gMyozCisJUlRfSFRfQ0FQQUJJTElUWSAJKnBSdEh0Q2FwID0gTlVMTDsKKwlSVF9IVF9QSFlfSU5GTwkJKnBBY3RpdmVIdFBoeSA9IE5VTEw7CisJVUxPTkcJCUJhc2ljTUNTOworCVVDSEFSIGosIGJpdG1hc2s7CisJUFJUX0hUX1BIWV9JTkZPCQkJcERlc2lyZUh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPT09PiBcbiIpKTsKKworCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcERlc2lyZUh0UGh5CT0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCXBBY3RpdmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisKKwkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQlyZXR1cm47CisKKwkJcFJ0SHRDYXAgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHk7CisJCXBBY3RpdmVIdFBoeSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvOworCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOworCQlCYXNpY01DUyA9cEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0rKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCQllbHNlCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7CisJCWlmIChwRGVzaXJlSHRQaHktPmJIdEVuYWJsZSA9PSBGQUxTRSkKKwkJCXJldHVybjsKKworCQlwUnRIdENhcCA9ICZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHk7CisJCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdKyhwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCQllbHNlCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJfQorCisJLy8gRGVjaWRlIE1BWCBodCByYXRlLgorCWlmICgocFJ0SHRDYXAtPkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJZWxzZQorCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCisgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJiAocFJ0SHRDYXAtPkNoYW5uZWxXaWR0aCkpCisJCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV180MDsKKwllbHNlCisJCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKKworICAgIGlmIChwTWF4SHRQaHktPmZpZWxkLkJXID09IEJXXzIwKQorCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPSAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCAmIHBSdEh0Q2FwLT5TaG9ydEdJZm9yMjApOworCWVsc2UKKwkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjQwKTsKKworCWZvciAoaT0yMzsgaT49MDsgaS0tKSAvLyAzKjMKKwl7CisJCWogPSBpLzg7CisJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKKworCQlpZiAoKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCisJCXsKKwkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGk9PTApCisJCQlicmVhazsKKwl9CisKKwkvLyBDb3B5IE1JTiBodCByYXRlLiAgcnQyODYwPz8/CisJcE1pbkh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOworCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gMDsKKwlwTWluSHRQaHktPmZpZWxkLlNUQkMgPSAwOworCXBNaW5IdFBoeS0+ZmllbGQuU2hvcnRHSSA9IDA7CisJLy9JZiBTVEEgYXNzaWducyBmaXhlZCByYXRlLiB1cGRhdGUgdG8gZml4ZWQgaGVyZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikpCisJeworCQlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbNF0gIT0gMCkKKwkJeworCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKKwkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gMzI7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFVzZSBGaXhlZCBNQ1MgPSAlZFxuIixwTWluSHRQaHktPmZpZWxkLk1DUykpOworCQl9CisKKwkJZm9yIChpPTIzOyAoQ0hBUilpID49IDA7IGktLSkgLy8gMyozCisJCXsKKwkJCWogPSBpLzg7CisJCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisJCQlpZiAoIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQkJeworCQkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKKwkJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaT09MCkKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJLy8gRGVjaWRlIGh0IHJhdGUKKwlwSHRQaHktPmZpZWxkLlNUQkMgPSBwTWF4SHRQaHktPmZpZWxkLlNUQkM7CisJcEh0UGh5LT5maWVsZC5CVyA9IHBNYXhIdFBoeS0+ZmllbGQuQlc7CisJcEh0UGh5LT5maWVsZC5NT0RFID0gcE1heEh0UGh5LT5maWVsZC5NT0RFOworCXBIdFBoeS0+ZmllbGQuTUNTID0gcE1heEh0UGh5LT5maWVsZC5NQ1M7CisJcEh0UGh5LT5maWVsZC5TaG9ydEdJID0gcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJOworCisJLy8gdXNlIGRlZmF1bHQgbm93LiBydDI4NjAKKwlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCWVsc2UKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZUh0VHhSYXRlczwtLS0uQU1zZHVTaXplID0gJWQgIFxuIiwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRYOiBNQ1NbMF0gPSAleCAoY2hvb3NlICVkKSwgQlcgPSAlZCwgU2hvcnRHSSA9ICVkLCBNT0RFID0gJWQsICBcbiIsIHBBY3RpdmVIdFBoeS0+TUNTU2V0WzBdLHBIdFBoeS0+ZmllbGQuTUNTLAorCQlwSHRQaHktPmZpZWxkLkJXLCBwSHRQaHktPmZpZWxkLlNob3J0R0ksIHBIdFBoeS0+ZmllbGQuTU9ERSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gXG4iKSk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lUmFkaW9PZmYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCk7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlSVDI4WFhfTUxNRV9SQURJT19PTihwQWQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBic3NfdGFibGUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8qISBcYnJpZWYgaW5pdGlhbGl6ZSBCU1MgdGFibGUKKyAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSB0YWJsZQorICoJXHJldHVybiBub25lCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIEJzc1RhYmxlSW5pdCgKKwlJTiBCU1NfVEFCTEUgKlRhYikKK3sKKwlpbnQgaTsKKworCVRhYi0+QnNzTnIgPSAwOworICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CU1NfVEFCTEU7IGkrKykKKwl7CisJCU5kaXNaZXJvTWVtb3J5KCZUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCVRhYi0+QnNzRW50cnlbaV0uUnNzaSA9IC0xMjc7CS8vIGluaXRpYWwgdGhlIHJzc2kgYXMgYSBtaW5pbXVtIHZhbHVlCisJfQorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIEJBX1RBQkxFICpUYWIpCit7CisJaW50IGk7CisKKwlUYWItPm51bUFzT3JpZ2luYXRvciA9IDA7CisJVGFiLT5udW1Bc1JlY2lwaWVudCA9IDA7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCVRhYi0+QkFSZWNFbnRyeVtpXS5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X05PTkU7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoVGFiLT5CQVJlY0VudHJ5W2ldLlJ4UmVSaW5nTG9jaykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKKwl7CisJCVRhYi0+QkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9OT05FOworCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyohIFxicmllZiBzZWFyY2ggdGhlIEJTUyB0YWJsZSBieSBTU0lECisgKglccGFyYW0gcF90YWIgcG9pbnRlciB0byB0aGUgYnNzIHRhYmxlCisgKglccGFyYW0gc3NpZCBTU0lEIHN0cmluZworICoJXHJldHVybiBpbmRleCBvZiB0aGUgdGFibGUsIEJTU19OT1RfRk9VTkQgaWYgbm90IGluIHRoZSB0YWJsZQorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlIHNlYXJjaCBieSBzZXF1ZW50aWFsIHNlYXJjaAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVUxPTkcgQnNzVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSCSBwQnNzaWQsCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQkvLworCQkvLyBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4KKwkJLy8gV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4KKwkJLy8KKwkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAorCQkJICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgcEJzc2lkLAorCUlOIFBVQ0hBUgkgcFNzaWQsCisJSU4gVUNIQVIJIFNzaWRMZW4sCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQkvLworCQkvLyBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4KKwkJLy8gV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4KKwkJLy8KKwkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAorCQkJICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkgJiYKKwkJCVNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkKKwkJeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworfQorCitVTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgQnNzaWQsCisJSU4gUFVDSEFSCSBwU3NpZCwKKwlJTiBVQ0hBUgkgU3NpZExlbiwKKwlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKCYoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCksIEJzc2lkKSAmJgorCQkJKFNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSB8fAorCQkJKE5kaXNFcXVhbE1lbW9yeShwU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pKSB8fAorCQkJKE5kaXNFcXVhbE1lbW9yeShUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFplcm9Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKSkpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCisJSU4gT1VUCUJTU19UQUJMRSAqVGFiLAorCUlOCQlQVUNIQVIJICBwQnNzaWQsCisJSU4JCVVDSEFSCSAgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCWlmICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID09IENoYW5uZWwpICYmCisJCQkoTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkpCisJCXsKKwkJCWZvciAoaiA9IGk7IGogPCBUYWItPkJzc05yIC0gMTsgaisrKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtqXSksICYoVGFiLT5Cc3NFbnRyeVtqICsgMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQl9CisJCQlOZGlzWmVyb01lbW9yeSgmKFRhYi0+QnNzRW50cnlbVGFiLT5Cc3NOciAtIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJVGFiLT5Cc3NOciAtPSAxOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCURlbGV0ZSB0aGUgT3JpZ2luYXRvciBFbnRyeSBpbiBCQXRhYmxlLiBPciBkZWNyZWFzZSBudW1BcyBPcmlnaW5hdG9yIGJ5IDEgaWYgbmVlZGVkLgorCisJQXJndW1lbnRzOgorCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSkKK3sKKworCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCisJeworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBVGFibGVEZWxldGVPUklFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJfQorCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFPUklFbnRyeS0+VElEKSApKTsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEJBT1JJRW50cnktPlRJRF0gPSAwOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQorCQlwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwkJcEJBT1JJRW50cnktPlRva2VuID0gMTsKKwkJLy8gTm90IGNsZWFyIFNlcXVlbmNlIGhlcmUuCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8qISBcYnJpZWYKKyAqCVxwYXJhbQorICoJXHJldHVybgorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgQnNzRW50cnlTZXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19FTlRSWSAqcEJzcywKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIFBDRl9QQVJNIHBDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworCUNPUFlfTUFDX0FERFIocEJzcy0+QnNzaWQsIHBCc3NpZCk7CisJLy8gRGVmYXVsdCBIaWRkZW4gU1NJRCB0byBiZSBUUlVFLCBpdCB3aWxsIGJlIHR1cm5lZCB0byBGQUxTRSBhZnRlciBjb3BpbmcgU1NJRAorCXBCc3MtPkhpZGRlbiA9IDE7CisJaWYgKFNzaWRMZW4gPiAwKQorCXsKKwkJLy8gRm9yIGhpZGRlbiBTU0lEIEFQLCBpdCBtaWdodCBzZW5kIGJlYWNvbiB3aXRoIFNTSUQgbGVuIGVxdWFsIHRvIDAKKwkJLy8gT3Igc2VuZCBiZWFjb24gL3Byb2JlIHJlc3BvbnNlIHdpdGggU1NJRCBsZW4gbWF0Y2hpbmcgcmVhbCBTU0lEIGxlbmd0aCwKKwkJLy8gYnV0IFNTSUQgaXMgYWxsIHplcm8uIHN1Y2ggYXMgIjAwLTAwLTAwLTAwIiB3aXRoIGxlbmd0aCA0LgorCQkvLyBXZSBoYXZlIHRvIHByZXZlbnQgdGhpcyBjYXNlIG92ZXJ3cml0ZSBjb3JyZWN0IHRhYmxlCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pID09IDApCisJCXsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KHBCc3MtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCXBCc3MtPlNzaWRMZW4gPSBTc2lkTGVuOworCQkJcEJzcy0+SGlkZGVuID0gMDsKKwkJfQorCX0KKwllbHNlCisJCXBCc3MtPlNzaWRMZW4gPSAwOworCXBCc3MtPkJzc1R5cGUgPSBCc3NUeXBlOworCXBCc3MtPkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKKwlpZiAoQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJeworCQlpZiAocENmUGFybS0+YlZhbGlkKQorCQl7CisJCQlwQnNzLT5DZnBDb3VudCA9IHBDZlBhcm0tPkNmcENvdW50OworCQkJcEJzcy0+Q2ZwUGVyaW9kID0gcENmUGFybS0+Q2ZwUGVyaW9kOworCQkJcEJzcy0+Q2ZwTWF4RHVyYXRpb24gPSBwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbjsKKwkJCXBCc3MtPkNmcER1clJlbWFpbmluZyA9IHBDZlBhcm0tPkNmcER1clJlbWFpbmluZzsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQnNzLT5BdGltV2luID0gQXRpbVdpbjsKKwl9CisKKwlwQnNzLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOworCS8vIFRoZSBwcml2YWN5IGJpdCBpbmRpY2F0ZSBzZWN1cml0eSBpcyBPTiwgaXQgbWFpZ2h0IGJlIFdFUCwgVEtJUCBvciBBRVMKKwkvLyBDb21iaW5lIHdpdGggQXV0aE1vZGUsIHRoZXkgd2lsbCBkZWNpZGUgdGhlIGNvbm5lY3Rpb24gbWV0aG9kcy4KKwlwQnNzLT5Qcml2YWN5ID0gQ0FQX0lTX1BSSVZBQ1lfT04ocEJzcy0+Q2FwYWJpbGl0eUluZm8pOworCUFTU0VSVChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlpZiAoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJcEJzcy0+U3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJQVNTRVJUKEV4dFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7CisJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkFkZEh0SW5mbywgcEFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKKwlwQnNzLT5OZXdFeHRDaGFuT2Zmc2V0ID0gTmV3RXh0Q2hhbk9mZnNldDsKKwlwQnNzLT5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlwQnNzLT5DaGFubmVsID0gQ2hhbm5lbDsKKwlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IENoYW5uZWw7CisJcEJzcy0+UnNzaSA9IFJzc2k7CisJLy8gVXBkYXRlIENraXBGbGFnLiBpZiBub3QgZXhpc3RzLCB0aGUgdmFsdWUgaXMgMHgwCisJcEJzcy0+Q2tpcEZsYWcgPSBDa2lwRmxhZzsKKworCS8vIE5ldyBmb3IgbWljcm9zb2Z0IEZpeGVkIElFcworCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkZpeElFcy5UaW1lc3RhbXAsICZUaW1lU3RhbXAsIDgpOworCXBCc3MtPkZpeElFcy5CZWFjb25JbnRlcnZhbCA9IEJlYWNvblBlcmlvZDsKKwlwQnNzLT5GaXhJRXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0eUluZm87CisKKwkvLyBOZXcgZm9yIG1pY3Jvc29mdCBWYXJpYWJsZSBJRXMKKwlpZiAoTGVuZ3RoVklFICE9IDApCisJeworCQlwQnNzLT5WYXJJRUxlbiA9IExlbmd0aFZJRTsKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+VmFySUVzLCBwVklFLCBwQnNzLT5WYXJJRUxlbik7CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPlZhcklFTGVuID0gMDsKKwl9CisKKwlwQnNzLT5BZGRIdEluZm9MZW4gPSAwOworCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKEh0Q2FwYWJpbGl0eUxlbj4gMCkKKwl7CisJCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkh0Q2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuKTsKKwkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCisJCXsKKwkJCXBCc3MtPkFkZEh0SW5mb0xlbiA9IEFkZEh0SW5mb0xlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisKKwkgCQkJaWYgKChwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiA+IDIpJiYgKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCSAJCQl7CisJIAkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuIC0gMjsKKwkgCQkJfQorCSAJCQllbHNlIGlmICgocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCQkJeworCQkgCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gKyAyOworCQkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCUJzc0NpcGhlclBhcnNlKHBCc3MpOworCisJLy8gbmV3IGZvciBRT1MKKwlpZiAocEVkY2FQYXJtKQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+RWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCWVsc2UKKwkJcEJzcy0+RWRjYVBhcm0uYlZhbGlkID0gRkFMU0U7CisJaWYgKHBRb3NDYXBhYmlsaXR5KQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UW9zQ2FwYWJpbGl0eSwgcFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJZWxzZQorCQlwQnNzLT5Rb3NDYXBhYmlsaXR5LmJWYWxpZCA9IEZBTFNFOworCWlmIChwUWJzc0xvYWQpCisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5RYnNzTG9hZCwgcFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwllbHNlCisJCXBCc3MtPlFic3NMb2FkLmJWYWxpZCA9IEZBTFNFOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVBFSURfU1RSVUNUICAgICBwRWlkOworCQlVU0hPUlQgICAgICAgICAgTGVuZ3RoID0gMDsKKworCisJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5XcGFJRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOworCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+UnNuSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAzKTsKKwkJcEJzcy0+Ykhhc0NvdW50cnlJRSA9IEZBTFNFOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJd2hpbGUgKChMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW4pIDw9IExlbmd0aFZJRSkKKwkJeworCQkJc3dpdGNoKHBFaWQtPkVpZCkKKwkJCXsKKwkJCQljYXNlIElFX1dQQToKKwkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisJCQkJCXsKKwkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKKwkJCQkJCXsKKwkJCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5XcGFJRS5JRSwgcEVpZCwgcEJzcy0+V3BhSUUuSUVMZW4pOworCQkJCQl9CisJCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSUVfUlNOOgorICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCisJCQkJCXsKKwkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKKwkJCQkJCXsKKwkJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Sc25JRS5JRSwgcEVpZCwgcEJzcy0+UnNuSUUuSUVMZW4pOworCQkJfQorCQkJCWJyZWFrOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQljYXNlIElFX0NPVU5UUlk6CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCBwRWlkLT5PY3RldCwgMyk7CisJCQkJCXBCc3MtPmJIYXNDb3VudHJ5SUUgPSBUUlVFOworCQkJCQlicmVhazsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisgICAgICAgICAgICB9CisJCQlMZW5ndGggPSBMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorCQkJcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9CisKKy8qIQorICoJXGJyaWVmIGluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBic3MgdGFibGUKKyAqCVxwYXJhbSBwX3RhYiBUaGUgQlNTIHRhYmxlCisgKglccGFyYW0gQnNzaWQgQlNTSUQKKyAqCVxwYXJhbSBzc2lkIFNTSUQKKyAqCVxwYXJhbSBzc2lkX2xlbiBMZW5ndGggb2YgU1NJRAorICoJXHBhcmFtIGJzc190eXBlCisgKglccGFyYW0gYmVhY29uX3BlcmlvZAorICoJXHBhcmFtIHRpbWVzdGFtcAorICoJXHBhcmFtIHBfY2YKKyAqCVxwYXJhbSBhdGltX3dpbgorICoJXHBhcmFtIGNhcAorICoJXHBhcmFtIHJhdGVzCisgKglccGFyYW0gcmF0ZXNfbGVuCisgKglccGFyYW0gY2hhbm5lbF9pZHgKKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlIElmIFNTSUQgaXMgaWRlbnRpY2FsLCB0aGUgb2xkIGVudHJ5IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmUKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1VMT05HIEJzc1RhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbE5vLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworCVVMT05HCUlkeDsKKworCUlkeCA9IEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoVGFiLCBwQnNzaWQsICBTc2lkLCBTc2lkTGVuLCBDaGFubmVsTm8pOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCWlmIChUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQorCSAgICB7CisJCQkvLworCQkJLy8gSXQgbWF5IGhhcHBlbiB3aGVuIEJTUyBUYWJsZSB3YXMgZnVsbC4KKwkJCS8vIFRoZSBkZXNpcmVkIEFQIHdpbGwgbm90IGJlIGFkZGVkIGludG8gQlNTIFRhYmxlCisJCQkvLyBJbiB0aGlzIGNhc2UsIGlmIHdlIGZvdW5kIHRoZSBkZXNpcmVkIEFQIHRoZW4gb3ZlcndyaXRlIEJTUyBUYWJsZS4KKwkJCS8vCisJCQlpZighT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJeworCQkJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3NpZCkgfHwKKwkJCQkJU1NJRF9FUVVBTChwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIFNzaWQsIFNzaWRMZW4pKQorCQkJCXsKKwkJCQkJSWR4ID0gVGFiLT5Cc3NPdmVybGFwTnI7CisJCQkJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKKwkJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKyAgICAgICAgICAgICAgICAgICAgVGFiLT5Cc3NPdmVybGFwTnIgPSAoVGFiLT5Cc3NPdmVybGFwTnIrKykgJSBNQVhfTEVOX09GX0JTU19UQUJMRTsKKwkJCQl9CisJCQkJcmV0dXJuIElkeDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCXJldHVybiBCU1NfTk9UX0ZPVU5EOworCQkJfQorCQl9CisJCUlkeCA9IFRhYi0+QnNzTnI7CisJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKKwkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKKwkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisJCVRhYi0+QnNzTnIrKzsKKwl9CisJZWxzZQorCXsKKwkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCxDZlBhcm0sIEF0aW1XaW4sCisJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCX0KKworCXJldHVybiBJZHg7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEICBUcmlFdmVudEluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCWk7CisKKwlmb3IgKGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID0gRkFMU0U7CisKKwlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPSAwOworfQorCitVTE9ORyBUcmlFdmVudFRhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFRSSUdHRVJfRVZFTlRfVEFCICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJUmVnQ2xhc3MsCisJSU4gVUNIQVIgQ2hhbm5lbE5vKQoreworCS8vIEV2ZW50IEEKKwlpZiAoSHRDYXBhYmlsaXR5TGVuID09IDApCisJeworCQlpZiAoVGFiLT5FdmVudEFObyA8IE1BWF9UUklHR0VSX0VWRU5UKQorCQl7CisJCQlSVE1QTW92ZU1lbW9yeShUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5CU1NJRCwgcEJzc2lkLCA2KTsKKwkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLmJWYWxpZCA9IFRSVUU7CisJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5DaGFubmVsID0gQ2hhbm5lbE5vOworCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQ0RDb3VudGVyID0gcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CisJCQlpZiAoUmVnQ2xhc3MgIT0gMCkKKwkJCXsKKwkJCQkvLyBCZWFjb24gaGFzIFJlZ3VsYXRvcnkgY2xhc3MgSUUuIFNvIHVzZSBiZWFjb24ncworCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gUmVnQ2xhc3M7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gVXNlIFN0YXRpb24ncyBSZWd1bGF0b3J5IGNsYXNzIGluc3RlYWQuCisJCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9PSBUUlVFKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJeworCQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSAzMjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IDMzOworCQkJCX0KKwkJCQllbHNlCisJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gPz87CisKKwkJCX0KKworCQkJVGFiLT5FdmVudEFObyArKzsKKwkJfQorCX0KKwllbHNlIGlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uSW50b2xlcmFudDQwKQorCXsKKwkJVGFiLT5FdmVudEJDb3VudERvd24gPSBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUcmlnZ2VyIEV2ZW50IHRhYmxlIE1haW50YWluZW5jZSBjYWxsZWQgb25jZSBldmVyeSBzZWNvbmQuCisKKwlBcmd1bWVudHM6CisJLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJaTsKKwlCT09MRUFOCQkJYk5vdGlmeSA9IEZBTFNFOworCWZvciAoaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCAmJiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXIgPiAwKSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXItLTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlciA9PSAwKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID0gRkFMU0U7CisJCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vIC0tOworCQkJCS8vIE5lZWQgdG8gc2VuZCAyMC80MCBDb2V4aXN0ZW5jZSBOb3RpZnkgZnJhbWUgaWYgaGFzIHN0YXR1cyBjaGFuZ2UuCisJCQkJYk5vdGlmeSA9IFRSVUU7CisJCQl9CisJCX0KKwl9CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93bi0tOworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA9PSAwKQorCQkJYk5vdGlmeSA9IFRSVUU7CisJfQorCisJaWYgKGJOb3RpZnkgPT0gVFJVRSkKKwkJVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeShwQWQsIEJTU0lEX1dDSUQsIFRSVUUpOworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlU3NpZFNvcnQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19UQUJMRSAqT3V0VGFiLAorCUlOCUNIQVIgU3NpZFtdLAorCUlOCVVDSEFSIFNzaWRMZW4pCit7CisJSU5UIGk7CisJQnNzVGFibGVJbml0KE91dFRhYik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlCU1NfRU5UUlkgKnBJbkJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisJCUJPT0xFQU4JYklzSGlkZGVuQXBJbmNsdWRlZCA9IEZBTFNFOworCisJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKyAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBJbkJzcy0+Q2hhbm5lbCkpCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKyAgICAgICAgICAgICB8fCAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisgICAgICAgICAgICApCisJCXsKKwkJCWlmIChwSW5Cc3MtPkhpZGRlbikKKwkJCQliSXNIaWRkZW5BcEluY2x1ZGVkID0gVFJVRTsKKwkJfQorCisJCWlmICgocEluQnNzLT5Cc3NUeXBlID09IHBBZC0+U3RhQ2ZnLkJzc1R5cGUpICYmCisJCQkoU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwSW5Cc3MtPlNzaWQsIHBJbkJzcy0+U3NpZExlbikgfHwgYklzSGlkZGVuQXBJbmNsdWRlZCkpCisJCXsKKwkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkvLyBJZiBubyBDb3VudHJ5IElFIGV4aXN0cyBubyBDb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgd2hlbiBJRUVFODAyMTFkQ2xpZW50TW9kZSBpcyBzdHJpY3QuCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID09IFJ0ODAyXzExX0RfU3RyaWN0KSAmJgorCQkJCShwSW5Cc3MtPmJIYXNDb3VudHJ5SUUgPT0gRkFMU0UpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID09IFJ0ODAyXzExX0RfU3RyaWN0LCBidXQgdGhpcyBBUCBkb2Vzbid0IGhhdmUgY291bnRyeSBJRS5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKKwkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gTmV3IGZvciBXUEEyCisJCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl7CisJCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQorCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgorCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBwSW5Cc3MtPldlcFN0YXR1cykpOworCQkJCS8vCisJCQkJLy8gRm9yIHRoZSBTRVN2MiBjYXNlLCB3ZSB3aWxsIG5vdCBxdWFsaWZ5IFdlcFN0YXR1cy4KKwkJCQkvLworCQkJCWlmICghcEluQnNzLT5iU0VTKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWQorCQkJLy8gSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LgorCQkJLy8gQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEhCisJCQlpZiAoU3NpZExlbiA9PSAwKQorCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJBTkRfV0lEVEhfMjApCisJCQkJCXsKKwkJCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKworCQkJT3V0VGFiLT5Cc3NOcisrOworCQl9CisJCWVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYgKFNzaWRMZW4gPT0gMCkpCisJCXsKKwkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKKwkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gTmV3IGZvciBXUEEyCisJCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl7CisJCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQorCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgorCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgorCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisKKwkJCU91dFRhYi0+QnNzTnIrKzsKKwkJfQorCisJCWlmIChPdXRUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQorCQkJYnJlYWs7CisJfQorCisJQnNzVGFibGVTb3J0QnlSc3NpKE91dFRhYik7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlU29ydEJ5UnNzaSgKKwlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpCit7CisJSU5UIAkgIGksIGo7CisJQlNTX0VOVFJZIFRtcEJzczsKKworCWZvciAoaSA9IDA7IGkgPCBPdXRUYWItPkJzc05yIC0gMTsgaSsrKQorCXsKKwkJZm9yIChqID0gaSsxOyBqIDwgT3V0VGFiLT5Cc3NOcjsgaisrKQorCQl7CisJCQlpZiAoT3V0VGFiLT5Cc3NFbnRyeVtqXS5Sc3NpID4gT3V0VGFiLT5Cc3NFbnRyeVtpXS5Sc3NpKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZUbXBCc3MsICZPdXRUYWItPkJzc0VudHJ5W2pdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbal0sICZPdXRUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbaV0sICZUbXBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitWT0lEIEJzc0NpcGhlclBhcnNlKAorCUlOIE9VVAlQQlNTX0VOVFJZCXBCc3MpCit7CisJUEVJRF9TVFJVQ1QgCQkgcEVpZDsKKwlQVUNIQVIJCQkJcFRtcDsKKwlQUlNOX0lFX0hFQURFUl9TVFJVQ1QJCQlwUnNuSGVhZGVyOworCVBDSVBIRVJfU1VJVEVfU1RSVUNUCQkJcENpcGhlcjsKKwlQQUtNX1NVSVRFX1NUUlVDVAkJCQlwQUtNOworCVVTSE9SVAkJCQkJCQlDb3VudDsKKwlJTlQJCQkJCQkJCUxlbmd0aDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlUbXBDaXBoZXI7CisKKwkvLworCS8vIFdlcFN0YXR1cyB3aWxsIGJlIHJlc2V0IGxhdGVyLCBpZiBBUCBhbm5vdW5jZSBUS0lQIG9yIEFFUyBvbiB0aGUgYmVhY29uIGZyYW1lLgorCS8vCisJaWYgKHBCc3MtPlByaXZhY3kpCisJeworCQlwQnNzLT5XZXBTdGF0dXMgCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJfQorCS8vIFNldCBkZWZhdWx0IHRvIGRpc2FibGUgJiBvcGVuIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSBwYXJzaW5nIHZhcmlhYmxlIElFCisJcEJzcy0+QXV0aE1vZGUJCT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwlwQnNzLT5BdXRoTW9kZUF1eAk9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkvLyBJbml0IFdQQSBzZXR0aW5nCisJcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQS5Sc25DYXBhYmlsaXR5ID0gMDsKKwlwQnNzLT5XUEEuYk1peE1vZGUJCT0gRkFMU0U7CisKKwkvLyBJbml0IFdQQTIgc2V0dGluZworCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIJID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IDA7CisJcEJzcy0+V1BBMi5iTWl4TW9kZSAJID0gRkFMU0U7CisKKworCUxlbmd0aCA9IChJTlQpIHBCc3MtPlZhcklFTGVuOworCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQkvLyBQYXJzZSBjaXBoZXIgc3VpdGUgYmFzZSBvbiBXUEExICYgV1BBMiwgdGhleSBzaG91bGQgYmUgcGFyc2VkIGRpZmZlcmVudGx5CisJCXBUbXAgPSAoKFBVQ0hBUikgcEJzcy0+VmFySUVzKSArIHBCc3MtPlZhcklFTGVuIC0gTGVuZ3RoOworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVG1wOworCQlzd2l0Y2ggKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9XUEE6CisJCQkJLy9QYXJzZSBDaXNjbyBJRV9XUEEgKExFQVAsIENDS00sIGV0Yy4pCisJCQkJaWYgKCBOZGlzRXF1YWxNZW1vcnkoKHBUbXArOCksIENJU0NPX09VSSwgMykpCisJCQkJeworCQkJCQlwVG1wICAgKz0gMTE7CisJCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJCXsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gaWYgQ2lzY28gSUVfV1BBLCBicmVhaworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBTRVNfT1VJLCAzKSAmJiAocEVpZC0+TGVuID09IDcpKQorCQkJCXsKKwkJCQkJcEJzcy0+YlNFUyA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpICE9IDEpCisJCQkJeworCQkJCQkvLyBpZiB1bnN1cHBvcnRlZCB2ZW5kb3Igc3BlY2lmaWMgSUUKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFNraXAgT1VJLCB2ZXJzaW9uLCBhbmQgbXVsdGljYXN0IHN1aXRlCisJCQkJLy8gVGhpcyBwYXJ0IHNob3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gQVAgc3VwcG9ydGVkIG11bHRpcGxlIGNpcGhlciBzdWl0ZS4KKwkJCQkvLyBGb3Igbm93LCBpdCdzIE9LIHNpbmNlIGFsbW9zdCBhbGwgQVBzIGhhdmUgZml4ZWQgY2lwaGVyIHN1aXRlIHN1cHBvcnRlZC4KKwkJCQkvLyBwVG1wID0gKFBVQ0hBUikgcEVpZC0+T2N0ZXQ7CisJCQkJcFRtcCAgICs9IDExOworCisJCQkJLy8gQ2lwaGVyIFN1aXRlIFNlbGVjdG9ycyBmcm9tIFNwZWMgUDgwMi4xMWkvRDMuMiBQMjYuCisJCQkJLy8JVmFsdWUJICAgTWVhbmluZworCQkJCS8vCTAJCQlOb25lCisJCQkJLy8JMQkJCVdFUC00MAorCQkJCS8vCTIJCQlUa2lwCisJCQkJLy8JMwkJCVdSQVAKKwkJCQkvLwk0CQkJQUVTCisJCQkJLy8JNQkJCVdFUC0xMDQKKwkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKKwkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQljYXNlIDU6CS8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBudW1iZXIgb2YgdW5pY2FzdCBzdWl0ZQorCQkJCXBUbXAgICArPSAxOworCisJCQkJLy8gc2tpcCBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGVzCisJCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKKwkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUKKwkJCQl3aGlsZSAoQ291bnQgPiAwKQorCQkJCXsKKwkJCQkJLy8gU2tpcCBPVUkKKwkJCQkJcFRtcCArPSAzOworCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJCXsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgNTogLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChUbXBDaXBoZXIgPiBwQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQkJeworCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOworCQkJCQl9CisJCQkJCXBUbXArKzsKKwkJCQkJQ291bnQtLTsKKwkJCQl9CisKKwkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cworCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKwkJCQlwVG1wICAgKz0gMzsKKworCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEgbW9kZQorCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCQkJZWxzZQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCAgICs9IDE7CisKKwkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKKwkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJeworCQkJCQlwQnNzLT5BdXRoTW9kZQkgID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCQkJLy8gUGF0Y2hlZCBidWdzIGZvciBvbGQgZHJpdmVyCisJCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCisJCQkJLy8gQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZworCQkJCWlmIChwQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gcEJzcy0+V1BBLlBhaXJDaXBoZXIpCisJCQkJCXBCc3MtPldQQS5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9SU046CisJCQkJcFJzbkhlYWRlciA9IChQUlNOX0lFX0hFQURFUl9TVFJVQ1QpIHBUbXA7CisKKwkJCQkvLyAwLiBWZXJzaW9uIG11c3QgYmUgMQorCQkJCWlmIChsZTJjcHUxNihwUnNuSGVhZGVyLT5WZXJzaW9uKSAhPSAxKQorCQkJCQlicmVhazsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFJTTl9JRV9IRUFERVJfU1RSVUNUKTsKKworCQkJCS8vIDEuIENoZWNrIGdyb3VwIGNpcGhlcgorCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJCWJyZWFrOworCisJCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCisJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQljYXNlIDU6CS8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBzZXQgdG8gY29ycmVjdCBvZmZzZXQgZm9yIG5leHQgcGFyc2luZworCQkJCXBUbXAgICArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisKKwkJCQkvLyAyLiBHZXQgcGFpcndpc2UgY2lwaGVyIGNvdW50cworCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIDMuIEdldCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQorCQkJCXdoaWxlIChDb3VudCA+IDApCisJCQkJeworCQkJCQkvLyBTa2lwIE9VSQorCQkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJeworCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJcFRtcCArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisJCQkJCUNvdW50LS07CisJCQkJfQorCisJCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKKwkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisKKwkJCQkvLyA1LiBHZXQgQUtNIGNpcGhlcnMKKwkJCQlwQUtNID0gKFBBS01fU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCQlicmVhazsKKworCQkJCXN3aXRjaCAocEFLTS0+VHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCAgICs9IChDb3VudCAqIHNpemVvZihBS01fU1VJVEVfU1RSVUNUKSk7CisKKwkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKKwkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJeworCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7CisJCQkJCXBCc3MtPldlcFN0YXR1cyAJCT0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKKwkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCX0KKwkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKworCQkJCS8vIDYuIEdldCBSU04gY2FwYWJpbGl0eQorCQkJCS8vcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKihQVVNIT1JUKSBwVG1wOworCQkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKKwkJCQlpZiAocEJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCXBCc3MtPldQQTIuYk1peE1vZGUgPSBUUlVFOworCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCUxlbmd0aCAtPSAocEVpZC0+TGVuICsgMik7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtYWNfdGFibGUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmIGdlbmVyYXRlcyBhIHJhbmRvbSBtYWMgYWRkcmVzcyB2YWx1ZSBmb3IgSUJTUyBCU1NJRAorICoJXHBhcmFtIEFkZHIgdGhlIGJzc2lkIGxvY2F0aW9uCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKi8KK1ZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEFkZHIpCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCisJeworCQlwQWRkcltpXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwl9CisKKwlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsgIC8vIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4Cit9CisKKy8qISBcYnJpZWYgaW5pdCB0aGUgbWFuYWdlbWVudCBtYWMgZnJhbWUgaGVhZGVyCisgKglccGFyYW0gcF9oZHIgbWFjIGhlYWRlcgorICoJXHBhcmFtIHN1YnR5cGUgc3VidHlwZSBvZiB0aGUgZnJhbWUKKyAqCVxwYXJhbSBwX2RzIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGRvbid0IGNhcmUgaWYgaXQgaXMgYSBicm9hZGNhc3QgYWRkcmVzcworICoJXHJldHVybiBub25lCisgKglccHJlIHRoZSBzdGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBwQWQtPlN0YUNmZworICoJIC0gYnNzaWQKKyAqCSAtIHN0YXRpb24gYWRkcmVzcworICoJXHBvc3QKKyAqCVxub3RlIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGZvbGxvd2luZyBmaWVsZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIE1ndE1hY0hlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKwlJTiBVQ0hBUiBTdWJUeXBlLAorCUlOIFVDSEFSIFRvRHMsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisJcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU3ViVHlwZTsKKwlwSGRyODAyMTEtPkZDLlRvRHMgPSBUb0RzOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgcERBKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEJzc2lkKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbWVtX21nbXQuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgcm91dGluZSBidWlsZCBhbiBvdXRnb2luZyBmcmFtZSwgYW5kIGZpbGwgYWxsIGluZm9ybWF0aW9uIHNwZWNpZmllZAorICogaW4gYXJndW1lbnQgbGlzdCB0byB0aGUgZnJhbWUgYm9keS4gVGhlIGFjdHVhbCBmcmFtZSBzaXplIGlzIHRoZSBzdW1tYXRpb24KKyAqIG9mIGFsbCBhcmd1bWVudHMuCisgKiBpbnB1dCBwYXJhbXM6CisgKgkJQnVmZmVyIC0gcG9pbnRlciB0byBhIHByZS1hbGxvY2F0ZWQgbWVtb3J5IHNlZ21lbnQKKyAqCQlhcmdzIC0gYSBsaXN0IG9mIDxpbnQgYXJnX3NpemUsIGFyZz4gcGFpcnMuCisgKgkJTk9URSBOT1RFIE5PVEUhISEhIHRoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgTlVMTCwgb3RoZXJ3aXNlIHRoaXMKKyAqCQkJCQkJICAgZnVuY3Rpb24gd2lsbCBGQUlMISEhCisgKiByZXR1cm46CisgKgkJU2l6ZSBvZiB0aGUgYnVmZmVyCisgKiB1c2FnZToKKyAqCQlNYWtlT3V0Z29pbmdGcmFtZShCdWZmZXIsIG91dHB1dF9sZW5ndGgsIDIsICZmYywgMiwgJmR1ciwgNiwgcF9hZGRyMSwgNixwX2FkZHIyLCBFTkRfT0ZfQVJHUyk7CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAorCU9VVCBDSEFSICpCdWZmZXIsCisJT1VUIFVMT05HICpGcmFtZUxlbiwgLi4uKQoreworCUNIQVIgICAqcDsKKwlpbnQgCWxlbmc7CisJVUxPTkcJVG90TGVuZzsKKwl2YV9saXN0IEFyZ3M7CisKKwkvLyBjYWxjdWxhdGVzIHRoZSB0b3RhbCBsZW5ndGgKKwlUb3RMZW5nID0gMDsKKwl2YV9zdGFydChBcmdzLCBGcmFtZUxlbik7CisJZG8KKwl7CisJCWxlbmcgPSB2YV9hcmcoQXJncywgaW50KTsKKwkJaWYgKGxlbmcgPT0gRU5EX09GX0FSR1MpCisJCXsKKwkJCWJyZWFrOworCQl9CisJCXAgPSB2YV9hcmcoQXJncywgUFZPSUQpOworCQlOZGlzTW92ZU1lbW9yeSgmQnVmZmVyW1RvdExlbmddLCBwLCBsZW5nKTsKKwkJVG90TGVuZyA9IFRvdExlbmcgKyBsZW5nOworCX0gd2hpbGUoVFJVRSk7CisKKwl2YV9lbmQoQXJncyk7IC8qIGNsZWFuIHVwICovCisJKkZyYW1lTGVuID0gVG90TGVuZzsKKwlyZXR1cm4gVG90TGVuZzsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbWxtZV9xdWV1ZS5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qISBcYnJpZWYJSW5pdGlhbGl6ZSBUaGUgTUxNRSBRdWV1ZSwgdXNlZCBieSBNTE1FIEZ1bmN0aW9ucworICoJXHBhcmFtCSpRdWV1ZQkgICBUaGUgTUxNRSBRdWV1ZQorICoJXHJldHVybiBBbHdheXMJICAgUmV0dXJuIE5ESVNfU1RBVEVfU1VDQ0VTUyBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUJQmVjYXVzZSB0aGlzIGlzIGRvbmUgb25seSBvbmNlIChhdCB0aGUgaW5pdCBzdGFnZSksIG5vIG5lZWQgdG8gYmUgbG9ja2VkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK05ESVNfU1RBVFVTIE1sbWVRdWV1ZUluaXQoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpCit7CisJSU5UIGk7CisKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmUXVldWUtPkxvY2spOworCisJUXVldWUtPk51bQk9IDA7CisJUXVldWUtPkhlYWQgPSAwOworCVF1ZXVlLT5UYWlsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01MTUVfUVVFVUU7IGkrKykKKwl7CisJCVF1ZXVlLT5FbnRyeVtpXS5PY2N1cGllZCA9IEZBTFNFOworCQlRdWV1ZS0+RW50cnlbaV0uTXNnTGVuID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoUXVldWUtPkVudHJ5W2ldLk1zZywgTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCX0KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKiEgXGJyaWVmCSBFbnF1ZXVlIGEgbWVzc2FnZSBmb3Igb3RoZXIgdGhyZWFkcywgaWYgdGhleSB3YW50IHRvIHNlbmQgbWVzc2FnZXMgdG8gTUxNRSB0aHJlYWQKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSBNYWNoaW5lICBUaGUgU3RhdGUgTWFjaGluZSBJZAorICoJXHBhcmFtCSBNc2dUeXBlICBUaGUgTWVzc2FnZSBUeXBlCisgKglccGFyYW0JIE1zZ0xlbiAgIFRoZSBNZXNzYWdlIGxlbmd0aAorICoJXHBhcmFtCSpNc2cJICBUaGUgbWVzc2FnZSBwb2ludGVyCisgKglccmV0dXJuICBUUlVFIGlmIGVucXVldWUgaXMgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQkgVGhlIG1lc3NhZ2UgaGFzIHRvIGJlIGluaXRpYWxpemVkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZUVucXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUxPTkcgTWFjaGluZSwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2cpCit7CisJSU5UIFRhaWw7CisJTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZTogbXNnIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCVRhaWwgPSBRdWV1ZS0+VGFpbDsKKwlRdWV1ZS0+VGFpbCsrOworCVF1ZXVlLT5OdW0rKzsKKwlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQorCXsKKwkJUXVldWUtPlRhaWwgPSAwOworCX0KKworCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gUkVTRVJWRURfV0NJRDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uT2NjdXBpZWQgPSBUUlVFOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5NYWNoaW5lID0gTWFjaGluZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnVHlwZSA9IE1zZ1R5cGU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiAgPSBNc2dMZW47CisKKwlpZiAoTXNnICE9IE5VTEwpCisJeworCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIFJlY3YgZ2V0cyBhIE1MTUUgbWVzc2FnZQorICoJXHBhcmFtCSpRdWV1ZQkJCSBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSBUaW1lU3RhbXBIaWdoCSBUaGUgdXBwZXIgMzIgYml0IG9mIHRpbWVzdGFtcAorICoJXHBhcmFtCSBUaW1lU3RhbXBMb3cJIFRoZSBsb3dlciAzMiBiaXQgb2YgdGltZXN0YW1wCisgKglccGFyYW0JIFJzc2kJCQkgVGhlIHJlY2VpdmluZyBSU1NJIHN0cmVuZ3RoCisgKglccGFyYW0JIE1zZ0xlbiAJCSBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCisgKglccGFyYW0JKk1zZwkJCSBUaGUgbWVzc2FnZSBwb2ludGVyCisgKglccmV0dXJuICBUUlVFIGlmIGV2ZXJ5dGhpbmcgb2ssIEZBTFNFIG90aGVyd2lzZSAobGlrZSBRdWV1ZSBGdWxsKQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCisJSU4gVUNIQVIgUnNzaTAsCisJSU4gVUNIQVIgUnNzaTEsCisJSU4gVUNIQVIgUnNzaTIsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFZPSUQgKk1zZywKKwlJTiBVQ0hBUiBTaWduYWwpCit7CisJSU5UIAkJIFRhaWwsIE1hY2hpbmU7CisJUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJSU5UCQkgTXNnVHlwZTsKKwlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvKiBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlICovCisJaWYoQVRFX09OKHBBZCkpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1NcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQorCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIscEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gT0ssIHdlIGdvdCBhbGwgdGhlIGluZm9ybWF0aW9ucywgaXQgaXMgdGltZSB0byBwdXQgdGhpbmdzIGludG8gcXVldWUKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlUYWlsID0gUXVldWUtPlRhaWw7CisJUXVldWUtPlRhaWwrKzsKKwlRdWV1ZS0+TnVtKys7CisJaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKKwl7CisJCVF1ZXVlLT5UYWlsID0gMDsKKwl9CisJUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gID0gTXNnTGVuOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5Mb3dQYXJ0ID0gVGltZVN0YW1wTG93OworCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5IaWdoUGFydCA9IFRpbWVTdGFtcEhpZ2g7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kwID0gUnNzaTA7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kxID0gUnNzaTE7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kyID0gUnNzaTI7CisJUXVldWUtPkVudHJ5W1RhaWxdLlNpZ25hbCA9IFNpZ25hbDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9IChVQ0hBUilXY2lkOworCisJUXVldWUtPkVudHJ5W1RhaWxdLkNoYW5uZWwgPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWw7CisKKwlpZiAoTXNnICE9IE5VTEwpCisJeworCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKiEgXGJyaWVmCSBEZXF1ZXVlIGEgbWVzc2FnZSBmcm9tIHRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JKlF1ZXVlCSAgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkqRWxlbQkgIFRoZSBtZXNzYWdlIGRlcXVldWVkIGZyb20gTUxNRSBRdWV1ZQorICoJXHJldHVybiAgVFJVRSBpZiB0aGUgRWxlbSBjb250YWlucyBzb21ldGhpbmcsIEZBTFNFIG90aGVyd2lzZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZURlcXVldWUoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUsCisJT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pCit7CisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJKkVsZW0gPSAmKFF1ZXVlLT5FbnRyeVtRdWV1ZS0+SGVhZF0pOworCVF1ZXVlLT5OdW0tLTsKKwlRdWV1ZS0+SGVhZCsrOworCWlmIChRdWV1ZS0+SGVhZCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCisJeworCQlRdWV1ZS0+SGVhZCA9IDA7CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCXJldHVybiBUUlVFOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisjaWZkZWYgUlQyODYwCisJTUxNRV9RVUVVRV9FTEVNCQkqRWxlbSA9IE5VTEw7CisjZW5kaWYgLy8gUlQyODYwIC8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCQlDYW5jZWxsZWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZSBcbiIpKTsKKworI2lmZGVmIFJUMjg2MAorCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJaWYocEFkLT5NbG1lLmJSdW5uaW5nKQorCXsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJLy8gUmVtb3ZlIGFsbCBNbG1lIHF1ZXVlcyBlbGVtZW50cworCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCisJeworCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQorCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQorCQl7CisJCQkvLyBmcmVlIE1MTUUgZWxlbWVudAorCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKKwkJCUVsZW0tPk1zZ0xlbiA9IDA7CisKKwkJfQorCQllbHNlIHsKKwkJCURCR1BSSU5UX0VSUigoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlVQ0hBUiBpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkvLyBDYW5jZWwgYWxsIHRpbWVyIGV2ZW50cworCQkvLyBCZSBjYXJlZnVsIHRvIGNhbmNlbCBuZXcgYWRkZWQgdGltZXIKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENoYW5nZSBiYWNrIHRvIG9yaWdpbmFsIGNoYW5uZWwgaW4gY2FzZSBvZiBkb2luZyBzY2FuCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZXN1bWUgTVNEVSB3aGljaCBpcyB0dXJuZWQgb2ZmIGR1cm5pbmcgc2NhbgorCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gU2V0IGFsbCBzdGF0ZSBtYWNoaW5lcyBiYWNrIElETEUKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgICA9IEFTU09DX0lETEU7CisJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgICAgPSBBVVRIX1JFUV9JRExFOworCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IFNZTkNfSURMRTsKKwkJcEFkLT5NbG1lLkFjdE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQUNUX0lETEU7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCXBBZC0+TWxtZS5EbHNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IERMU19JRExFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorCS8vIFJlbW92ZSBydW5uaW5nIHN0YXRlCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworI2VuZGlmIC8vIFJUMjg2MCAvLworfQorCisvKiEgXGJyaWVmCXRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZW1wdHkKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHJldHVybiBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lUXVldWVFbXB0eSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlCT09MRUFOIEFuczsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCUFucyA9IChRdWV1ZS0+TnVtID09IDApOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCisJcmV0dXJuIEFuczsKK30KKworLyohIFxicmllZgkgdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBmdWxsCisgKglccGFyYW0JICpRdWV1ZSAJIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuICBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVRdWV1ZUZ1bGwoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpCit7CisJQk9PTEVBTiBBbnM7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlBbnMgPSAoUXVldWUtPk51bSA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUgfHwgUXVldWUtPkVudHJ5W1F1ZXVlLT5UYWlsXS5PY2N1cGllZCk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlyZXR1cm4gQW5zOworfQorCisvKiEgXGJyaWVmCSBUaGUgZGVzdHJ1Y3RvciBvZiBNTE1FIFF1ZXVlCisgKglccGFyYW0KKyAqCVxyZXR1cm4KKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQlDbGVhciBNbG1lIFF1ZXVlLCBTZXQgUXVldWUtPk51bSB0byBaZXJvLgorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIE1sbWVRdWV1ZURlc3Ryb3koCisJSU4gTUxNRV9RVUVVRSAqcFF1ZXVlKQoreworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKKwlwUXVldWUtPk51bSAgPSAwOworCXBRdWV1ZS0+SGVhZCA9IDA7CisJcFF1ZXVlLT5UYWlsID0gMDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7CisJTmRpc0ZyZWVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOworfQorCisvKiEgXGJyaWVmCSBUbyBzdWJzdGl0dXRlIHRoZSBtZXNzYWdlIHR5cGUgaWYgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gZXh0ZXJuYWwKKyAqCVxwYXJhbQlwRnJhbWUJCSAgIFRoZSBmcmFtZSByZWNlaXZlZAorICoJXHBhcmFtCSpNYWNoaW5lCSAgIFRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JKk1zZ1R5cGUJICAgdGhlIG1lc3NhZ2UgdHlwZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxyZXR1cm4gVFJVRSBpZiB0aGUgc3Vic3RpdHV0aW9uIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JPT0xFQU4gTXNnVHlwZVN1YnN0KAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKwlPVVQgSU5UICpNYWNoaW5lLAorCU9VVCBJTlQgKk1zZ1R5cGUpCit7CisJVVNIT1JUCVNlcTsKKwlVQ0hBUglFQVBUeXBlOworCVBVQ0hBUglwRGF0YTsKKworCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCisJcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOworCisJLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCisJaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKwl7CisJCWlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF9BSVJPTkVULCBwRGF0YSwgTEVOR1RIXzgwMl8xX0gpKQorCQl7CisJCQkvLyBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGVyCisJCQkqTWFjaGluZSA9IEFJUk9ORVRfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX0FJUk9ORVRfTVNHOworCQkJcmV0dXJuIChUUlVFKTsKKwkJfQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQlpZiAoIHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVAgKSAvL0xFQVAKKwkJeworCQkJLy8gTEVBUCBmcmFtZXMKKwkJCSpNYWNoaW5lID0gTEVBUF9TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybiAoTGVhcE1zZ1R5cGVTdWJzdChFQVBUeXBlLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQl7CisJCQkqTWFjaGluZSA9IFdQQV9QU0tfU1RBVEVfTUFDSElORTsKKwkJCUVBUFR5cGUgPSAqKChVQ0hBUiopcEZyYW1lICsgTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgMSk7CisJCQlyZXR1cm4oV3BhTXNnVHlwZVN1YnN0KEVBUFR5cGUsIE1zZ1R5cGUpKTsKKwkJfQorCX0KKworCXN3aXRjaCAocEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkKKwl7CisJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUkVROgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SRVE6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SU1A6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQkVBQ09OOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BVElNOgorCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FUSU07CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ESVNBU1NPQ19SRVE7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0FVVEg6CisJCQkvLyBnZXQgdGhlIHNlcXVlbmNlIG51bWJlciBmcm9tIHBheWxvYWQgMjQgTWFjIEhlYWRlciArIDIgYnl0ZXMgYWxnb3JpdGhtCisJCQlOZGlzTW92ZU1lbW9yeSgmU2VxLCAmcEZyYW1lLT5PY3RldFsyXSwgc2l6ZW9mKFVTSE9SVCkpOworCQkJaWYgKFNlcSA9PSAxIHx8IFNlcSA9PSAzKQorCQkJeworCQkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfT0REOworCQkJfQorCQkJZWxzZSBpZiAoU2VxID09IDIgfHwgU2VxID09IDQpCisJCQl7CisJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7CisJCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX0VWRU47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RFQVVUSDsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQUNUSU9OOgorCQkJKk1hY2hpbmUgPSBBQ1RJT05fU1RBVEVfTUFDSElORTsKKwkJCS8vICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQKKwkJCWlmICgocEZyYW1lLT5PY3RldFswXSYweDdGKSA+IE1BWF9QRUVSX0NBVEVfTVNHKQorCQkJeworCQkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpNc2dUeXBlID0gKHBGcmFtZS0+T2N0ZXRbMF0mMHg3Rik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBzdGF0ZV9tYWNoaW5lLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgorICoJXHBhcmFtICpTCQkJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCVRyYW5zCQlTdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24KKyAqCVxwYXJhbQlTdE5yCQludW1iZXIgb2Ygc3RhdGVzCisgKglccGFyYW0JTXNnTnIJCW51bWJlciBvZiBtZXNzYWdlcworICoJXHBhcmFtCURlZkZ1bmMgCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCisgKglccGFyYW0JSW5pdFN0YXRlCWluaXRpYWwgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQlCYXNlCQlTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKKyAqCVxwcmUgcF9zbSBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIFN0YXRlTWFjaGluZUluaXQoCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwlJTiBVTE9ORyBTdE5yLAorCUlOIFVMT05HIE1zZ05yLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCUlOIFVMT05HIEluaXRTdGF0ZSwKKwlJTiBVTE9ORyBCYXNlKQoreworCVVMT05HIGksIGo7CisKKwkvLyBzZXQgbnVtYmVyIG9mIHN0YXRlcyBhbmQgbWVzc2FnZXMKKwlTLT5OclN0YXRlID0gU3ROcjsKKwlTLT5Ock1zZyAgID0gTXNnTnI7CisJUy0+QmFzZSAgICA9IEJhc2U7CisKKwlTLT5UcmFuc0Z1bmMgID0gVHJhbnM7CisKKwkvLyBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24KKwlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IE1zZ05yOyBqKyspCisJCXsKKwkJCVMtPlRyYW5zRnVuY1tpICogTXNnTnIgKyBqXSA9IERlZkZ1bmM7CisJCX0KKwl9CisKKwkvLyBzZXQgdGhlIHN0YXJ0aW5nIHN0YXRlCisJUy0+Q3VyclN0YXRlID0gSW5pdFN0YXRlOworfQorCisvKiEgXGJyaWVmIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW50byB0aGUgY2VsbCBpbiB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtICpTCXBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbSBTdAlzdGF0ZQorICoJXHBhcmFtIE1zZwlpbmNvbWluZyBtZXNzYWdlCisgKglccGFyYW0gZgl0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiAoc3RhdGUsIG1lc3NhZ2UpIGNvbWJpbmF0aW9uIG9jY3VycyBhdCB0aGUgc3RhdGUgbWFjaGluZQorICoJXHByZSAqUyBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLCBzdCwgbXNnLCBzaG91bGQgYmUgYWxsIHdpdGhpbiB0aGUgcmFuZ2UsIEJhc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgaW5pdGlhbCBzdGF0ZQorICoJXHBvc3QKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAqLworVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBVTE9ORyBTdCwKKwlJTiBVTE9ORyBNc2csCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIEZ1bmMpCit7CisJVUxPTkcgTXNnSWR4OworCisJTXNnSWR4ID0gTXNnIC0gUy0+QmFzZTsKKworCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpCisJeworCQkvLyBib3VuZGFyeSBjaGVja2luZyBiZWZvcmUgc2V0dGluZyB0aGUgYWN0aW9uCisJCVMtPlRyYW5zRnVuY1tTdCAqIFMtPk5yTXNnICsgTXNnSWR4XSA9IEZ1bmM7CisJfQorfQorCisvKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHN0YXRlIHRyYW5zaXRpb24KKyAqCVxwYXJhbQkgKkFkYXB0ZXIgdGhlIE5JQyBhZGFwdGVyIHBvaW50ZXIKKyAqCVxwYXJhbQkgKlMgCSAgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQkgKkVsZW0JICB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZAorICoJXHJldHVybiAgIE5vbmUKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkoKihTLT5UcmFuc0Z1bmNbUy0+Q3VyclN0YXRlICogUy0+TnJNc2cgKyBFbGVtLT5Nc2dUeXBlIC0gUy0+QmFzZV0pKShwQWQsIEVsZW0pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoZSBkcm9wIGZ1bmN0aW9uLCB3aGVuIG1hY2hpbmUgZXhlY3V0ZXMgdGhpcywgdGhlIG1lc3NhZ2UgaXMgc2ltcGx5CisJCWlnbm9yZWQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCB0aGUgbWVzc2FnZSBpcyBmcmVlZCBpbgorCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKCkKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERyb3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsZnNyLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTGZzckluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgU2VlZCkKK3sKKwlpZiAoU2VlZCA9PSAwKQorCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAxOworCWVsc2UKKwkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gU2VlZDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1VDSEFSIFJhbmRvbUJ5dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcgaTsKKwlVQ0hBUiBSLCBSZXN1bHQ7CisKKwlSID0gMDsKKworCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgPT0gMCkKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKChVTE9ORyAqKSZwQWQtPk1sbWUuU2hpZnRSZWcpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgJiAweDAwMDAwMDAxKQorCQl7CisJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAoKHBBZC0+TWxtZS5TaGlmdFJlZyBeIExGU1JfTUFTSykgPj4gMSkgfCAweDgwMDAwMDAwOworCQkJUmVzdWx0ID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IHBBZC0+TWxtZS5TaGlmdFJlZyA+PiAxOworCQkJUmVzdWx0ID0gMDsKKwkJfQorCQlSID0gKFIgPDwgMSkgfCBSZXN1bHQ7CisJfQorCisJcmV0dXJuIFI7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBSYXRlVGFibGUpCit7CisJVUNIQVIJCQkJCWk7CisJSFRfRkJLX0NGRzBfU1RSVUMJCUh0Q2ZnMDsKKwlIVF9GQktfQ0ZHMV9TVFJVQwkJSHRDZmcxOworCUxHX0ZCS19DRkcwX1NUUlVDCQlMZ0NmZzA7CisJTEdfRkJLX0NGRzFfU1RSVUMJCUxnQ2ZnMTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGU7CisKKwkvLyBzZXQgdG8gaW5pdGlhbCB2YWx1ZQorCUh0Q2ZnMC53b3JkID0gMHg2NTQzMjEwMDsKKwlIdENmZzEud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcwLndvcmQgPSAweGVkY2JhOTg4OworCUxnQ2ZnMS53b3JkID0gMHgwMDAwMjEwMDsKKworCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMTsKKwlmb3IgKGkgPSAxOyBpIDwgKigoUFVDSEFSKSBwUmF0ZVRhYmxlKTsgaSsrKQorCXsKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxK2k7CisJCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpCisJCXsKKwkJCWNhc2UgMDoJCS8vQ0NLCisJCQkJYnJlYWs7CisJCQljYXNlIDE6CQkvL09GRE0KKwkJCQl7CisJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCQkJeworCQkJCQkJY2FzZSAwOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAzOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTM0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDU6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA2OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNzoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIDI6CQkvL0hULU1JWAorCQkJY2FzZSAzOgkJLy9IVC1HRgorCQkJCXsKKwkJCQkJaWYgKChwTmV4dFR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSAmJiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgIT0gcE5leHRUeFJhdGUtPkN1cnJNQ1MpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDU6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA2OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNzoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTN0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDg6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA5OgorCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTA6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTE6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTI6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTM6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTQ6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTU6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZTogbm90IHN1cHBvcnQgQ3Vyck1DUz0lZFxuIiwgcEN1cnJUeFJhdGUtPkN1cnJNQ1MpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCisJCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgorCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgorCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCisKKwkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKKwkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCisJCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KKwkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KKwkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKKwkJaWYgKGJOb25HRkV4aXN0KQorCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIAkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcikKKwl7CisJCS8vCisJCS8vIGVuYWJsZSB0aGUgUlRTL0NUUyB0byBhdm9pZCBjaGFubmVsIGNvbGxpc2lvbgorCQkvLworCQlTZXRNYXNrID0gQUxMTl9TRVRQUk9URUNUOworCQlPcGVyYXRpb25Nb2RlID0gODsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKKwlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKKyNpZiAwCisJTWFjUmVnIHw9IChwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPDwgOCk7CisjZWxzZQorCS8vIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYmFsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYKKyAgICAgICAgaWYgKCgKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCShwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKKyAgICAgICAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9PSBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgeworCQkJTWFjUmVnIHw9ICgweDEwMDAgPDwgOCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisJCQlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKyAgICAgICAgfQorI2VuZGlmCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOworCisJLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncworCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7CisJUHJvdENmZzQud29yZCA9IDA7CisJUHJvdENmZy53b3JkID0gMDsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOworCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKworCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQorCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCisJeworCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisJZWxzZQorCXsKKwkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAorCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBEZWNpZGUgSFQgZnJhbWUgcHJvdGVjdGlvbi4KKwlpZiAoKFNldE1hc2sgJiBBTExOX1NFVFBST1RFQ1QpICE9IDApCisJeworCQlzd2l0Y2goT3BlcmF0aW9uTW9kZSkKKwkJeworCQkJY2FzZSAweDA6CisJCQkJLy8gTk8gUFJPVEVDVAorCQkJCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCisJCQkJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCisJCQkJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCisJCQkJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KKworCQkJCS8vIE1NMjBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCQkJCS8vIE1NNDBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJCQkJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7CisKKwkJCQkvLyBDRjIwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkJCQkvLyBDRjQwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJCQkJaWYgKGJOb25HRkV4aXN0KQorCQkJCXsKKwkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQorCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQorCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7CisJCQkJfQorCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworIAkJCWNhc2UgMToKKwkJCQkvLyBUaGlzIGlzICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZS4iCisJCQkJLy8gSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgorCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7CisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJLy8gSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMKKwkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OyAgLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KKworCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzCisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCWlmIChiTm9uR0ZFeGlzdCkKKwkJCQl7CisJCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQl9CisJCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCS8vIEhUIG1peGVkIG1vZGUuCSBQUk9URUNUIEFMTCEKKwkJCQkvLyBBc3NpZ24gUmF0ZQorCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OworCQkJCS8vIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZQorCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQl7CisJCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KKwkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzCisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQkJLy8gU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4KKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCW9mZnNldCA9IENDS19QUk9UX0NGRzsKKwlmb3IgKGkgPSAwO2kgPCA2O2krKykKKwl7CisJCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwsCisJSU4JQk9PTEVBTgkJCWJTY2FuKQoreworCVVMT05HCQkJUjIgPSAwLCBSMyA9IERFRkFVTFRfUkZfVFhfUE9XRVIsIFI0ID0gMDsKKwlDSEFSICAgIFR4UHdlciA9IDAsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOyAvL0JicDk0ID0gQkJQUjk0X0RFRkFVTFQsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCVVDSEFSCWluZGV4OworCVVJTlQzMiAJVmFsdWUgPSAwOyAvL0JicFJlZywgVmFsdWU7CisJUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOworCisJLy8gU2VhcmNoIFR4IHBvd2VyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKKwl7CisJCWlmIChDaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwpCisJCXsKKwkJCVR4UHdlciA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyOworCQkJVHhQd2VyMiA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyMjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogQ2FudCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwgQ2hhbm5lbCkpOworCX0KKworCXsKKwkJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCisJCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwkJeworCQkJY2FzZSBSRklDXzI4MjA6CisJCQljYXNlIFJGSUNfMjg1MDoKKwkJCWNhc2UgUkZJQ18yNzIwOgorCQkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCisJCQkJCWlmIChDaGFubmVsID4gMTQpCisJCQkJCXsKKwkJCQkJCS8vIGluaXRpYWxpemUgUjMsIFI0CisJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSk7CisKKwkJCQkJCS8vIDVHIGJhbmQgcG93ZXIgcmFuZ2U6IDB4Rjl+MFgwRiwgVFgwIFJlZzMgYml0OS9UWDEgUmVnNCBiaXQ2PSIwIiBtZWFucyB0aGUgVFggcG93ZXIgcmVkdWNlIDdkQgorCQkJCQkJLy8gUjMKKwkJCQkJCWlmICgoVHhQd2VyID49IC03KSAmJiAoVHhQd2VyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKDcrVHhQd2VyKTsKKwkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcj0lZCBcbiIsIFR4UHdlcikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKSB8ICgxIDw8IDkpOworCQkJCQkJfQorCisJCQkJCQkvLyBSNAorCQkJCQkJaWYgKChUeFB3ZXIyID49IC03KSAmJiAoVHhQd2VyMiA8IDApKQorCQkJCQkJeworCQkJCQkJCVR4UHdlcjIgPSAoNytUeFB3ZXIyKTsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNyk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLCBUeFB3ZXIyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpIHwgKDEgPDwgNik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpIHwgKFR4UHdlciA8PCA5KTsgLy8gc2V0IFRYIHBvd2VyMAorCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8Nik7Ly8gU2V0IGZyZXEgT2Zmc2V0ICYgVHhQd3IxCisJCQkJCX0KKworCQkJCQkvLyBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLgorCQkJCQlpZiAoIWJTY2FuICYmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApKQorCQkJCQl7CisJCQkJCQlSNCB8PTB4MjAwMDAwOworCQkJCQl9CisKKwkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSBSMjsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFIzOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7CisKKwkJCQkJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCQkJCQkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gQ2hhbmdlIEJCUCBzZXR0aW5nIGR1cmluZyBzaXd0Y2ggZnJvbSBhLT5nLCBnLT5hCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly9HYXJ5IDIwMDcvMDgvMDkgMHgwNTBBMEEKKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CS8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7CisKKwkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0CisJICAgIGlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCSAgICB7CisJICAgICAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJICAgIH0KKworCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KKwllbHNlCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly9HYXJ5IDIwMDcvOC85IDB4MDUwNTA1CisKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOyAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOworCisJCS8vIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdAorCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOworCQl9CisKKwkJLy8gNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCisgICAgLy8gUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nCisJLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpOworCWlmIChiU2NhbikKKwkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwllbHNlCisJCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOworCisJLy8KKwkvLyBPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCisJLy8gYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMKKwkvLyAyMDA1LzA2LzA1IC0gT24gMTFHLCBXZSBhbHNvIG5lZWQgdGhpcyBkZWxheSB0aW1lLiBPdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gcGFzcyB0aGUgV0hRTC4KKwkvLworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVsdSwgUHdyMT0lbHUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCisJCQkJCQkJICAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAorCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKKwkJCQkJCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjMsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgMjQyMSBvbmx5LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGR1cmluZworCQlzaXRlIHN1cnZleS4gSXQncyBvbmx5IHJlcXVpcmVkIGFmdGVyIE5JQyBkZWNpZGVkIHRvIHN0YXkgYXQgYSBjaGFubmVsCisJCWZvciBhIGxvbmdlciBwZXJpb2QuCisJCVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0J3MgYWx3YXlzIGFmdGVyIEFzaWNTd2l0Y2hDaGFubmVsKCkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljTG9ja0NoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQ2hhbm5lbCkKK3sKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQJQXNpY0FudGVubmFTZWxlY3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQW50ZW5uYSBtaXNjZWxsYW5lb3VzIHNldHRpbmcuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJQmFuZFN0YXRlCQkJCUluZGljYXRlIGN1cnJlbnQgQmFuZCBTdGF0ZS4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA8PSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJMS4pIEZyYW1lIEVuZCB0eXBlIGNvbnRyb2wKKwkJCW9ubHkgdmFsaWQgZm9yIEcgb25seSAoUkZfMjUyNyAmIFJGXzI1MjkpCisJCQkwOiBtZWFucyBEUERULCBzZXQgQkJQIFI0IGJpdCA1IHRvIDEKKwkJCTE6IG1lYW5zIFNQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMAorCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFzaWNBbnRlbm5hU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglBQkdCQU5EX1NUQVRFCUJhbmRTdGF0ZSkKK3sKK30KKworVk9JRCBBc2ljUmZUdW5pbmdFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHaXZlcyBDQ0sgVFggcmF0ZSAyIG1vcmUgZEIgVFggcG93ZXIuCisJCVRoaXMgcm91dGluZSB3b3JrcyBvbmx5IGluIExJTksgVVAgaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZS4KKworCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KKwkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQorCQkxLiBUeFBvd2VyUGVyY2VudGFnZQorCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKKwkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCisJCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCisKKwlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKKwkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0U3dpdGNoaW5nKCkKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVAkJCWksIGo7CisJQ0hBUgkJRGVsdGFQd3IgPSAwOworCUJPT0xFQU4JCWJBdXRvVHhBZ2MgPSBGQUxTRTsKKwlVQ0hBUgkJVHNzaVJlZiwgKnBUc3NpTWludXNCb3VuZGFyeSwgKnBUc3NpUGx1c0JvdW5kYXJ5LCBUeEFnY1N0ZXA7CisJVUNIQVIJCUJicFIxID0gMCwgQmJwUjQ5ID0gMCwgaWR4OworCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOworCVVMT05HCQlUeFB3cls1XTsKKwlDSEFSCQlWYWx1ZTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisKKwkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLiB0cnkgZXZlcnkgNCBzZWNvbmQKKwlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA0ID09IDApCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJLyogYmcgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkc7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBhIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7CisJCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZBOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF07CisJCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEE7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCXsKKwkJCS8qIEJicFIxIGlzIHVuc2lnbmVkIGNoYXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOworCisJCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLworCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLworCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KKworCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KKwkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCisJCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KKwkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLworCisJCQkvKiBwbHVzICgrKSBpcyAweDAwIH4gMHg0NSwgbWludXMgKC0pIGlzIDB4YTAgfiAweGYwICovCisJCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIDB4YTUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCisKKwkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCisJCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlcgorCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKSAgLy8gRm91bmQgdGhlIHJhbmdlCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBkZWNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7CisKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCisJCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBUeCBwb3dlcgorCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pICAgLy8gRm91bmQgdGhlIHJhbmdlCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHgtMSk7CisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgICBUeCBQb3dlciwgQkJQIFI0OT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCX0KKworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFIxKTsKKwlCYnBSMSAmPSAweEZDOworCisjaWZkZWYgU0lOR0xFX1NLVQorCS8vIEhhbmRsZSByZWd1bGF0b3J5IG1heCB0eCBwb3dlciBjb25zdHJhaW4KKwlkbworCXsKKwkJVUNIQVIgICAgVHhQd3JJbkVFUFJPTSA9IDB4RkYsIENvdW50cnlUeFB3ciA9IDB4RkYsIGNyaXRlcmlvbjsKKwkJVUNIQVIgICAgQWRqdXN0TWF4VHhQd3JbNDBdOworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIDVHIGJhbmQKKwkJCVR4UHdySW5FRVBST00gPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlZmluZU1heFR4UHdyICYgMHhGRjAwKSA+PiA4KTsKKwkJZWxzZSAvLyAyLjRHIGJhbmQKKwkJCVR4UHdySW5FRVBST00gPSAocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweDAwRkYpOworCQlDb3VudHJ5VHhQd3IgPSBHZXRDdW50cnlNYXhUeFB3cihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCS8vIGVycm9yIGhhbmRsaW5nLCByYW5nZSBjaGVjaworCQlpZiAoKFR4UHdySW5FRVBST00gPiAweDUwKSB8fCAoQ291bnRyeVR4UHdyID4gMHg1MCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQXNpY0FkanVzdFR4UG93ZXIgLSBJbnZhbGlkIG1heCB0eCBwb3dlciAoPTB4JTAyeCksIENvdW50cnlUeFB3cj0lZFxuIiwgVHhQd3JJbkVFUFJPTSwgQ291bnRyeVR4UHdyKSk7CisJCQlicmVhazsKKwkJfQorCisJCWNyaXRlcmlvbiA9ICooKFBVQ0hBUilUeFB3ciArIDIpICYgMHhGOyAgICAgICAgLy8gRkFFIHVzZSBPRkRNIDZNIGFzIGNyaXRlcmlvbgorCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChjcml0ZXJpb249JWQsIFR4UHdySW5FRVBST009JWQsIENvdW50cnlUeFB3cj0lZClcbiIsIGNyaXRlcmlvbiwgVHhQd3JJbkVFUFJPTSwgQ291bnRyeVR4UHdyKSk7CisKKwkJLy8gQWRqdXN0IG1heCB0eCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHJlbGF0aW9uc2hpcCBvZiB0eCBwb3dlciBpbiBFMlBST00KKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQkvLyBDQ0sgd2lsbCBoYXZlIDRkQm0gbGFyZ2VyIHRoYW4gT0ZETQorCQkJLy8gVGhlcmVmb3JlLCB3ZSBzaG91bGQgc2VwYXJhdGUgdG8gcGFyc2UgdGhlIHR4IHBvd2VyIGZpZWxkCisJCQlpZiAoaSA9PSAwKQorCQkJeworCQkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCQl7CisJCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7CisKKwkJCQkJaWYgKGogPCA0KQorCQkJCQl7CisJCQkJCQkvLyBDQ0sgd2lsbCBoYXZlIDRkQm0gbGFyZ2VyIHRoYW4gT0ZETQorCQkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbikgKyA0OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7CisJCQkJCX0KKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQkJeworCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOworCisJCQkJCUFkanVzdE1heFR4UHdyW2kqOCtqXSA9IFR4UHdySW5FRVBST00gKyAoVmFsdWUgLSBjcml0ZXJpb24pOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gQWRqdXN0IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwCisJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJeworCQkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCQl7CisJCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKKworCQkJCQkvLyBUaGUgc3lzdGVtIHR4IHBvd2VyIGlzIGxhcmdlciB0aGFuIHRoZSByZWd1bGF0b3J5LCB0aGUgcG93ZXIgc2hvdWxkIGJlIHJlc3RyYWluCisJCQkJCWlmIChBZGp1c3RNYXhUeFB3cltpKjgral0gPiBDb3VudHJ5VHhQd3IpCisJCQkJCXsKKwkJCQkJCS8vIGRlY3JlYXNlIHRvIHplcm8gYW5kIGRvbid0IG5lZWQgdG8gdGFrZSBjYXJlIEJCUFIxCisJCQkJCQlpZiAoKFZhbHVlIC0gKEFkanVzdE1heFR4UHdyW2kqOCtqXSAtIENvdW50cnlUeFB3cikpID4gMCkKKwkJCQkJCQlWYWx1ZSAtPSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlWYWx1ZSA9IDA7CisKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQsIG5vIGNoYW5nZSlcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKworCQkJCQkJVHhQd3JbaV0gPSAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaio0KSkgfCAoVmFsdWUgPDwgaio0KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlIChGQUxTRSk7CisjZW5kaWYgLy8gU0lOR0xFX1NLVSAvLworCisJLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCisJLy8gRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKQorCS8vIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAorCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgIC8vIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcKKwkJOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvLyA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxOworCXsKKwkJRGVsdGFQd3IgLT0gMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8vIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDM7CisJeworCQlEZWx0YVB3ciAtPSAzOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gNjsKKwl7CisJCUJicFIxIHw9IDB4MDE7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvLyAxMCB+IDE1JSwgdHJlYXQgYXMgMTIuNSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDk7CisJeworCQlCYnBSMSB8PSAweDAxOworCQlEZWx0YVB3ciAtPSAzOworCX0KKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxMjsKKwl7CisJCUJicFIxIHw9IDB4MDI7CisJfQorCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwUjEpOworCisJLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KKwlmb3IoaT0wOyBpPDU7IGkrKykKKwl7CisJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQorCQl7CisJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQl7CisJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCisKKwkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKKwkJCQl7CisJCQkJCVZhbHVlID0gMDsgLyogbWluICovCisJCQkJfQorCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKKwkJCQl7CisJCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLworCQkJCX0KKworCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KKwkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJfQorCisJCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KKwkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCisJCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOworCQl9CisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcHV0IFBIWSB0byBzbGVlcCBoZXJlLCBhbmQgc2V0IG5leHQgd2FrZXVwIHRpbWVyLiBQSFkgZG9lc24ndCBub3Qgd2FrZXVwCisJCWF1dG9tYXRpY2FsbHkuIEluc3RlYWQsIE1DVSB3aWxsIGlzc3VlIGEgVHdha2VVcEludGVycnVwdCB0byBob3N0IGFmdGVyCisJCXRoZSB3YWtldXAgdGltZXIgdGltZW91dC4gRHJpdmVyIGhhcyB0byBpc3N1ZSBhIHNlcGFyYXRlIGNvbW1hbmQgdG8gd2FrZQorCQlQSFkgdXAuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCit7CisgICAgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBtYW51YWwgd2FrZXVwIGlzIHJlcXVpcmVkCisJCUFzaWNGb3JjZVNsZWVwKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIG5vdCBpbiBJTkZSQSBCU1MuIFdoZW4KKwkJaW4gSU5GUkEgQlNTLCB3ZSBzaG91bGQgdXNlIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKCkgaW5zdGVhZC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNGb3JjZVNsZWVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBUd2FrZXVwIHRpbWVyIChzZXQgdmlhIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKQorCQlleHBpcmVkLgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgIGJGcm9tVHgpCit7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNGb3JjZVdha2V1cCBcbiIpKTsKKyAgICBSVDI4WFhfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTZXQgTXkgQlNTSUQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2V0QnNzaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBCc3NpZCkKK3sKKwlVTE9ORwkJICBBZGRyNDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09PT09PT09PT4gQXNpY1NldEJzc2lkICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQlwQnNzaWRbMF0scEJzc2lkWzFdLHBCc3NpZFsyXSxwQnNzaWRbM10sIHBCc3NpZFs0XSxwQnNzaWRbNV0pKTsKKworCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbMF0pCQkgfAorCQkJKFVMT05HKShwQnNzaWRbMV0gPDwgOCkgIHwKKwkJCShVTE9ORykocEJzc2lkWzJdIDw8IDE2KSB8CisJCQkoVUxPTkcpKHBCc3NpZFszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMCwgQWRkcjQpOworCisJQWRkcjQgPSAwOworCS8vIGFsd2F5cyBvbmUgQlNTSUQgaW4gU1RBIG1vZGUKKwlBZGRyNCA9IChVTE9ORykocEJzc2lkWzRdKSB8IChVTE9ORykocEJzc2lkWzVdIDw8IDgpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMSwgQWRkcjQpOworfQorCitWT0lEIEFzaWNTZXRNY2FzdFdDKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF07CisJVVNIT1JUCQlvZmZzZXQ7CisKKwlwRW50cnktPlNzdCAgICAgICAgPSBTU1RfQVNTT0M7CisJcEVudHJ5LT5BaWQgICAgICAgID0gTUNBU1RfV0NJRDsJLy8gU29mdGFwIHN1cHBvcnRzIDEgQlNTSUQgYW5kIHVzZSBXQ0lEPTAgYXMgbXVsdGljYXN0IFdjaWQgaW5kZXgKKwlwRW50cnktPlBzTW9kZSAgICAgPSBQV1JfQUNUSVZFOworCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBCU1MwTWNhc3RfV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEZWxXY2lkVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCVdjaWQpCit7CisJVUxPTkcJCSAgQWRkcjAgPSAweDAsIEFkZHIxID0gMHgwOworCVVMT05HIAkJb2Zmc2V0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0RlbFdjaWRUYWI9PT5XY2lkID0gMHgleFxuIixXY2lkKSk7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIFdjaWQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMCk7CisJb2Zmc2V0ICs9IDQ7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRW5hYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKKwlVSU5UMzIJCQkJRGF0YSA9IDA7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOworCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKwlEYXRhICAmPSAweEZGRkZGRjAwOworCURhdGEgIHw9IDB4ODA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKworCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEaXNhYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKKwlVSU5UMzIJCQkJRGF0YSA9IDA7CisKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCisJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCSYmIChwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk1JTU9QU0R5bmFtaWMgPT0gRkFMU0UpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJKQorCXsKKwkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCQkJRGF0YSB8PSAweDIwOworCX0KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRGlzYWJsZVN5bmMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5EaXNhYmxlIFRTRiBzeW5jaHJvbml6YXRpb25cbiIpKTsKKworCS8vIDIwMDMtMTItMjAgZGlzYWJsZSBUU0YgYW5kIFRCVFQgd2hpbGUgTklDIGluIHBvd2VyLXNhdmluZyBoYXZlIHNpZGUgZWZmZWN0CisJLy8JCQkgIHRoYXQgTklDIHdpbGwgbmV2ZXIgd2FrZXMgdXAgYmVjYXVzZSBUU0Ygc3RvcHMgYW5kIG5vIG1vcmUKKwkvLwkJCSAgVEJUVCBpbnRlcnJ1cHRzCisJcEFkLT5UYnR0VGlja0NvdW50ID0gMDsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOworCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVCc3NTeW5jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUJzc1N5bmMoSU5GUkEgbW9kZSlcbiIpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgorCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCU5vdGU6CisJCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCisJCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQorCQlCZWFjb24gcGVyaW9kLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVJYnNzU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKKwlQVUNIQVIJCQlwdHI7CisJVUlOVCBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVJYnNzU3luYyhBREhPQyBtb2RlLiBNUERVdG90YWxCeXRlQ291bnQgPSAlZClcbiIsIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOworCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKKworI2lmZGVmIFJUMjg2MAorCS8vIG1vdmUgQkVBQ09OIFRYRCBhbmQgZnJhbWUgY29udGVudCB0byBvbi1jaGlwIG1lbW9yeQorCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKKwlmb3IgKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpICAvLyAxNi1ieXRlIFRYV0kgZmllbGQKKwl7CisJCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7CisJCXB0ciArPSA0OworCX0KKworCS8vIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQKKwlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlmb3IgKGk9MDsgaTwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSs9NCkKKwl7CisJCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgbG9uZ3B0cik7CisJCXB0ciArPTQ7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJLy8gc3RhcnQgc2VuZGluZyBCRUFDT04KKwljc3I5LmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQorCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAxOworCWNzcjkuZmllbGQuVHNmU3luY01vZGUgPSAyOyAvLyBzeW5jIFRTRiBpbiBJQlNTIG1vZGUKKwljc3I5LmZpZWxkLmJUQlRURW5hYmxlID0gMTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1NldEVkY2FQYXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFRENBX1BBUk0JIHBFZGNhUGFybSkKK3sKKwlFRENBX0FDX0NGR19TVFJVQyAgIEFjMENmZywgQWMxQ2ZnLCBBYzJDZmcsIEFjM0NmZzsKKwlBQ19UWE9QX0NTUjBfU1RSVUMgY3NyMDsKKwlBQ19UWE9QX0NTUjFfU1RSVUMgY3NyMTsKKwlBSUZTTl9DU1JfU1RSVUMgICAgQWlmc25Dc3I7CisJQ1dNSU5fQ1NSX1NUUlVDICAgIEN3bWluQ3NyOworCUNXTUFYX0NTUl9TVFJVQyAgICBDd21heENzcjsKKwlpbnQgaTsKKworCUFjMENmZy53b3JkID0gMDsKKwlBYzFDZmcud29yZCA9IDA7CisJQWMyQ2ZnLndvcmQgPSAwOworCUFjM0NmZy53b3JkID0gMDsKKwlpZiAoKHBFZGNhUGFybSA9PSBOVUxMKSB8fCAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljU2V0RWRjYVBhcm1cbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgfHwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGkpCisJCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W2ldLCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisJCX0KKworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkgLgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmKCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCApCisJCXsKKwkJCS8vIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMHgyMDsgLy8gU3VnZ2VzdCBieSBKb2huIGZvciBUeEJ1cnN0IGluIEhUIE1vZGUKKwkJfQorCQllbHNlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JFCisJCUFjMENmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7CisKKwkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CSworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMUNmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCXsKKwkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKKwkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcworCQl9CisJCWVsc2UKKwkJeworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKwkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwkJfQorCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMkNmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjM0NmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMzX0NGRywgQWMzQ2ZnLndvcmQpOworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gMDsJCS8vIFFJRF9BQ19CRQorCQljc3IwLmZpZWxkLkFjMVR4b3AgPSAwOwkJLy8gUUlEX0FDX0JLCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCXsKKwkJCWNzcjEuZmllbGQuQWMyVHhvcCA9IDE5MjsJCS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKKwkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDk2OwkJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcworCQl9CisJCWVsc2UKKwkJeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gOTY7CQkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKwkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDQ4OwkJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4xID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjMgPSBDV19NSU5fSU5fQklUUzsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7CisKKwkJQ3dtYXhDc3Iud29yZCA9IDA7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgyID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IENXX01BWF9JTl9CSVRTOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCAweDAwMDAyMjIyKTsKKworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCX0KKwllbHNlCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weS4KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLworCQkvLyBNb2RpZnkgQ3dtaW4vQ3dtYXgvVHhvcCBvbiBxdWV1ZVtRSURfQUNfVkldLCBSZWNvbW1lbmQgYnkgSmVycnkgMjAwNS8wNy8yNworCQkvLyBUbyBkZWdyYWRlIG91ciBWSURPIFF1ZXVlJ3MgdGhyb3VnaHB1dCBmb3IgV2lGaSBXTU0gUzNUMDcgSXNzdWUuCisJCS8vCisJCS8vcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDcgLyAxMDsgLy8gcnQyODYwYyBuZWVkIHRoaXMKKworCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtaW49IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXTsKKwkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07IC8vKzE7CisKKwkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9ICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdOyAvLysyOworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUFjMUNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsgLy8rMTsKKworCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gKHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNikgLyAxMDsKKwkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOworCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07CisJCUFjMkNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJCUFjMkNmZy5maWVsZC5BaWZzbiAtPSAxOworCisJCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKKwkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhCisJCQlpZiAoU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQl7CisJCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMzsKKwkJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gNTsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsKKworLy8jaWZkZWYgV0lGSV9URVNUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QpCisJCXsKKwkJCWlmIChBYzNDZmcuZmllbGQuQWNUeG9wID09IDEwMikKKwkJCXsKKwkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSA/IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdIDogMTA7CisJCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuICA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXS0xOyAvKiBBSUZTTiBtdXN0ID49IDEgKi8KKwkJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKKwkJCQlBYzFDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJfQorLy8jZW5kaWYgLy8gV0lGSV9URVNUIC8vCisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7CisKKworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IEFjMENmZy5maWVsZC5BY1R4b3A7CisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IEFjMUNmZy5maWVsZC5BY1R4b3A7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisKKwkJY3NyMS5maWVsZC5BYzJUeG9wID0gQWMyQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMS5maWVsZC5BYzNUeG9wID0gQWMzQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKKworCQlDd21pbkNzci53b3JkID0gMDsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSAtIDE7IC8vZm9yIFRHbiB3aWZpIHRlc3QKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7CisKKwkJQ3dtYXhDc3Iud29yZCA9IDA7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdOworCQlDd21heENzci5maWVsZC5Dd21heDIgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7CisKKwkJQWlmc25Dc3Iud29yZCA9IDA7CisJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IEFjMENmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07CisJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMSA9IEFjMUNmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107CisJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCS8vIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSBBYzJDZmcuZmllbGQuQWlmc24gLSA0OworCisJCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKKwkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhCisJCQlpZiAoU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQl7CisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gMzsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSA3OworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMyA9IEFjM0NmZy5maWVsZC5BaWZzbiAtIDE7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOyAvL2ZvciBUR24gd2lmaSB0ZXN0CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIEFpZnNuQ3NyLndvcmQpOworCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJaWYgKCFBREhPQ19PTihwQWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVEQ0EgWyMlZF06IEFJRlNOIENXbWluIENXbWF4ICBUWE9QKHVzKSAgQUNNXG4iLCBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX0JFICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblswXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzBdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMF0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzBdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVswXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX0JLICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblsxXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzFdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMV0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzFdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVsxXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX1ZJICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblsyXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzJdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMl0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzJdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVsyXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX1ZPICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblszXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzNdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbM10sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzNdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVszXSkpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCAJQXNpY1NldFNsb3RUaW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpCit7CisJVUxPTkcJU2xvdFRpbWU7CisJVUlOVDMyCVJlZ1ZhbHVlID0gMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCWJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChiVXNlU2hvcnRTbG90VGltZSkKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKwllbHNlCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKworCVNsb3RUaW1lID0gKGJVc2VTaG9ydFNsb3RUaW1lKT8gOSA6IDIwOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIGZvcmNlIHVzaW5nIHNob3J0IFNMT1QgdGltZSBmb3IgRkFFIHRvIGRlbW8gcGVyZm9ybWFuY2Ugd2hlbiBUeEJ1cnN0IGlzIE9OCisJCWlmICgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsKKwkJCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCB0aGluayBpdCBpcyBkb2luZyBXaS1GaSB0ZXN0CisJCQkvLyBBbmQgd2Ugd2lsbCBub3Qgc2V0IHRvIHNob3J0IHNsb3Qgd2hlbiBiRW5hYmxlVHhCdXJzdCBpcyBUUlVFLgorCQl9CisJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCQkJU2xvdFRpbWUgPSA5OworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vCisJLy8gRm9yIHNvbWUgcmVhc29ucywgYWx3YXlzIHNldCBpdCB0byBzaG9ydCBzbG90IHRpbWUuCisJLy8KKwkvLyBUb0RvOiBTaG91bGQgY29uc2lkZXIgY2FwYWJpbGl0eSB3aXRoIDExQgorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCVNsb3RUaW1lID0gMjA7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCS09GRl9TTE9UX0NGRywgJlJlZ1ZhbHVlKTsKKwlSZWdWYWx1ZSA9IFJlZ1ZhbHVlICYgMHhGRkZGRkYwMDsKKworCVJlZ1ZhbHVlIHw9IFNsb3RUaW1lOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgQktPRkZfU0xPVF9DRkcsIFJlZ1ZhbHVlKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFNoYXJlZCBrZXkgaW5mb3JtYXRpb24gaW50byBBU0lDLgorCQlVcGRhdGUgc2hhcmVkIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgU2hhcmVkIGtleSB0YWJsZQorCQlVcGRhdGUgaXRzIGNpcGhlckFsZyB0byBBc2ljIFNoYXJlZCBrZXkgTW9kZS4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0luZGV4LAorCUlOIFVDSEFSCQkgS2V5SWR4LAorCUlOIFVDSEFSCQkgQ2lwaGVyQWxnLAorCUlOIFBVQ0hBUgkJIHBLZXksCisJSU4gUFVDSEFSCQkgcFR4TWljLAorCUlOIFBVQ0hBUgkJIHBSeE1pYykKK3sKKwlVTE9ORyBvZmZzZXQ7IC8vLCBjc3IwOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisjaWZkZWYgUlQyODYwCisJSU5UICAgaTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNBZGRTaGFyZWRLZXlFbnRyeSBCc3NJbmRleD0lZCwgS2V5SWR4PSVkXG4iLCBCc3NJbmRleCxLZXlJZHgpKTsKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkZFNoYXJlZEtleUVudHJ5OiAlcyBrZXkgIyVkXG4iLCBDaXBoZXJOYW1lW0NpcGhlckFsZ10sIEJzc0luZGV4KjQgKyBLZXlJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIAlLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwS2V5WzBdLHBLZXlbMV0scEtleVsyXSxwS2V5WzNdLHBLZXlbNF0scEtleVs1XSxwS2V5WzZdLHBLZXlbN10scEtleVs4XSxwS2V5WzldLHBLZXlbMTBdLHBLZXlbMTFdLHBLZXlbMTJdLHBLZXlbMTNdLHBLZXlbMTRdLHBLZXlbMTVdKSk7CisJaWYgKHBSeE1pYykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10scFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7CisJfQorCWlmIChwVHhNaWMpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIAlUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLHBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOworCX0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLworCS8vIGZpbGwga2V5IG1hdGVyaWFsIC0ga2V5ICsgVFggTUlDICsgUlggTUlDCisJLy8KKyNpZmRlZiBSVDI4NjAKKwlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCpCc3NJbmRleCArIEtleUlkeCkqSFdfS0VZX0VOVFJZX1NJWkU7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TSEFSRV9LRVk7IGkrKykKKwl7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOworCWlmIChwVHhNaWMpCisJeworCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4TWljW2ldKTsKKwkJfQorCX0KKworCW9mZnNldCArPSA4OworCWlmIChwUnhNaWMpCisJeworCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8KKwkvLyBVcGRhdGUgY2lwaGVyIGFsZ29yaXRobS4gV1NUQSBhbHdheXMgdXNlIEJTUzAKKwkvLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksICZjc3IxLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVhZDogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdIEtleUlkeFslZF09IDB4JXggXG4iLCBCc3NJbmRleCxLZXlJZHgsIGNzcjEud29yZCkpOworCWlmICgoQnNzSW5kZXglMikgPT0gMCkKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCX0KKwllbHNlCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKKworfQorCisvLwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSW5kZXgsCisJSU4gVUNIQVIJCSBLZXlJZHgpCit7CisJLy9VTE9ORyBTZWNDc3IwOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeTogIyVkIFxuIiwgQnNzSW5kZXgqNCArIEtleUlkeCkpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7CisJaWYgKChCc3NJbmRleCUyKSA9PSAwKQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IDA7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSAwOworCX0KKwllbHNlCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gMDsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IDA7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiV3JpdGU6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSA9IDB4JXggXG4iLCBCc3NJbmRleCwgY3NyMS53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksIGNzcjEud29yZCk7CisJQVNTRVJUKEJzc0luZGV4IDwgNCk7CisJQVNTRVJUKEtleUlkeCA8IDQpOworCit9CisKKworVk9JRCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICBDaXBoZXJBbGcsCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlKQoreworCVVMT05HICAgV0NJREF0dHJpID0gMCwgb2Zmc2V0OworCisJLy8KKwkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUuCisJLy8gT25seSBUeEtleSBjb3VsZCB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUuCisJLy8KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXQ0lEICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSW5kZXggPDwgNCkgfCAoQ2lwaGVyQWxnIDw8IDEpIHwgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCitWT0lEIEFzaWNVcGRhdGVXQ0lESVZFSVYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVMT05HICAgICAgICB1SVYsCisJSU4gVUxPTkcgICAgICAgIHVFSVYpCit7CisJVUxPTkcJb2Zmc2V0OworCisJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB1SVYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIDQsIHVFSVYpOworfQorCitWT0lEIEFzaWNVcGRhdGVSeFdDSURUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkcikKK3sKKwlVTE9ORyBvZmZzZXQ7CisJVUxPTkcgQWRkcjsKKworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRSk7CisJQWRkciA9IHBBZGRyWzBdICsgKHBBZGRyWzFdIDw8IDgpICsocEFkZHJbMl0gPDwgMTYpICsocEFkZHJbM10gPDwgMjQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcik7CisJQWRkciA9IHBBZGRyWzRdICsgKHBBZGRyWzVdIDw8IDgpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIDQsIEFkZHIpOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSwgSVYvRUlWIHRvIEFzaWMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICBXQ0lEICAgICAgICAgICAgICAgICAgICBXQ0lEIEVudHJ5IG51bWJlci4KKyAgICAgICAgQnNzSW5kZXggICAgICAgICAgICAgICAgQlNTSUQgaW5kZXgsIHN0YXRpb24gb3Igbm9uZSBtdWx0aXBsZSBCU1NJRCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgc2hvdWxkIGJlIDAuCisgICAgICAgIEtleUlkeCAgICAgICAgICAgICAgICAgIFRoaXMgS2V5SWR4IHdpbGwgc2V0IHRvIElWJ3MgS2V5SUQgaWYgYlR4S2V5IGVuYWJsZWQKKyAgICAgICAgcENpcGhlcktleSAgICAgICAgICAgICAgUG9pbnRlciB0byBDaXBoZXIgS2V5LgorICAgICAgICBiVXNlUGFpcmV3aXNlS2V5VGFibGUgICBUUlVFIG1lYW5zIHNhdmVkIHRoZSBrZXkgaW4gU2hhcmVkS2V5IHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgUGFpcmV3aXNlS2V5IHRhYmxlCisgICAgICAgIGJUeEtleSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHRyYW5zbWl0IGtleSBpZiBlbmFibGVkLgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgd2lsbCBzZXQgdGhlIHJlbGF0aXZlIGtleSBzdHVmZiB0byBBc2ljIGluY2x1ZGluZyBXQ0lEIGF0dHJpYnV0ZSwKKyAgICAgICAgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSBhbmQgSVYvRUlWLgorCisgICAgICAgIElWL0VJViB3aWxsIGJlIHVwZGF0ZSBpZiB0aGlzIENpcGhlcktleSBpcyB0aGUgdHJhbnNtaXNzaW9uIGtleSBiZWNhdXNlCisgICAgICAgIEFTSUMgd2lsbCBiYXNlIG9uIElWJ3MgS2V5SUQgdmFsdWUgdG8gc2VsZWN0IENpcGhlciBLZXkuCisKKyAgICAgICAgSWYgYlR4S2V5IHNldHMgdG8gRkFMU0UsIHRoaXMgaXMgbm90IHRoZSBUWCBrZXksIGJ1dCBpdCBjb3VsZCBiZQorICAgICAgICBSWCBrZXkKKworICAgIAlGb3IgQVAgbW9kZSBiVHhLZXkgbXVzdCBiZSBhbHdheXMgc2V0IHRvIFRSVUUuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljQWRkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUgkJS2V5SWR4LAorCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAorCUlOIEJPT0xFQU4JCWJUeEtleSkKK3sKKwlVTE9ORwlvZmZzZXQ7CisJVUNIQVIJSVY0ID0gMDsKKwlQVUNIQVIJCXBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7CisJUFVDSEFSCQlwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwlQVUNIQVIJCXBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOworCVBVQ0hBUgkJcFR4dHNjID0gcENpcGhlcktleS0+VHhUc2M7CisJVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworI2lmZGVmIFJUMjg2MAorCVVDSEFSCQlpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IEFzaWNBZGRLZXlFbnRyeVxuIikpOworCS8vCisJLy8gMS4pIGRlY2lkZSBrZXkgdGFibGUgb2Zmc2V0CisJLy8KKwlpZiAoYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworCWVsc2UKKwkJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQgKiBCc3NJbmRleCArIEtleUlkeCkgKiBIV19LRVlfRU5UUllfU0laRTsKKworCS8vCisJLy8gMi4pIFNldCBLZXkgdG8gQXNpYworCS8vCisJLy9mb3IgKGkgPSAwOyBpIDwgS2V5TGVuOyBpKyspCisjaWZkZWYgUlQyODYwCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykKKwl7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLy8KKwkvLyAzLikgU2V0IE1JQyBrZXkgaWYgYXZhaWxhYmxlCisJLy8KKwlpZiAocFR4TWljKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisJfQorCW9mZnNldCArPSBMRU5fVEtJUF9UWE1JQ0s7CisKKwlpZiAocFJ4TWljKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwUnhNaWNbaV0pOworCQl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwkvLworCS8vIDQuKSBNb2RpZnkgSVYvRUlWIGlmIG5lZWRzCisJLy8gICAgIFRoaXMgd2lsbCBmb3JjZSBBc2ljIHRvIHVzZSB0aGlzIGtleSBJRCBieSBzZXR0aW5nIElWLgorCS8vCisJaWYgKGJUeEtleSkKKwl7CisjaWZkZWYgUlQyODYwCisJCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJLy8KKwkJLy8gV3JpdGUgSVYKKwkJLy8KKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQsIHBUeHRzY1sxXSk7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMSwgKChwVHh0c2NbMV0gfCAweDIwKSAmIDB4N2YpKTsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAyLCBwVHh0c2NbMF0pOworCisJCUlWNCA9IChLZXlJZHggPDwgNik7CisJCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCQkJSVY0IHw9IDB4MjA7ICAvLyB0dXJuIG9uIGV4dGVuc2lvbiBiaXQgbWVhbnMgRUlWIGV4aXN0ZW5jZQorCisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMywgSVY0KTsKKworCQkvLworCQkvLyBXcml0ZSBFSVYKKwkJLy8KKwkJb2Zmc2V0ICs9IDQ7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4dHNjW2kgKyAyXSk7CisJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZShwQWQsIFdDSUQsIEJzc0luZGV4LCBDaXBoZXJBbGcsIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisJfQorCisJaWYgKCFiVXNlUGFpcmV3aXNlS2V5VGFibGUpCisJeworCQkvLworCQkvLyBPbmx5IHVwZGF0ZSB0aGUgc2hhcmVkIGtleSBzZWN1cml0eSBtb2RlCisJCS8vCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksICZjc3IxLndvcmQpOworCQlpZiAoKEJzc0luZGV4ICUgMikgPT0gMCkKKwkJeworCQkJaWYgKEtleUlkeCA9PSAwKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKEtleUlkeCA9PSAwKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCBjc3IxLndvcmQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBBc2ljQWRkS2V5RW50cnlcbiIpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgUGFpci13aXNlIGtleSBtYXRlcmlhbCBpbnRvIEFTSUMuCisJCVVwZGF0ZSBwYWlyd2lzZSBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFBhaXItd2lzZSBrZXkgdGFibGUKKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIJCVdDSUQsCisJSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KQoreworCUlOVCBpOworCVVMT05HIAkJb2Zmc2V0OworCVBVQ0hBUgkJIHBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7CisJUFVDSEFSCQkgcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7CisJUFVDSEFSCQkgcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisjaWZkZWYgREJHCisJVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKyNlbmRpZiAvLyBEQkcgLy8KKworCS8vIEVLRVkKKwlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworI2lmZGVmIFJUMjg2MAorCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykKKwl7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrPTQpCisJeworCQlVSU5UMzIgVmFsdWU7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgb2Zmc2V0ICsgaSwgJlZhbHVlKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKKworCS8vICBNSUMgS0VZCisJaWYgKHBUeE1pYykKKwl7CisjaWZkZWYgUlQyODYwCisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQraSwgcFR4TWljW2ldKTsKKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCX0KKwlvZmZzZXQgKz0gODsKKwlpZiAocFJ4TWljKQorCXsKKyNpZmRlZiBSVDI4NjAKKwkJZm9yIChpPTA7IGk8ODsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwUnhNaWNbaV0pOworCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkUGFpcndpc2VLZXlFbnRyeTogV0NJRCAjJWQgQWxnPSVzXG4iLFdDSUQsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKKwlpZiAocFJ4TWljKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10scFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7CisJfQorCWlmIChwVHhNaWMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKKwl9Cit9CisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMuCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0lkeCwKKwlJTiBVQ0hBUgkJIFdjaWQpCit7CisJVUxPTkcJCVdDSURBdHRyaTsKKwlVU0hPUlQJCW9mZnNldDsKKworCS8vIHJlLXNldCB0aGUgZW50cnkncyBXQ0lEIGF0dHJpYnV0ZSBhcyBPUEVOLU5PTkUuCisJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7CisJV0NJREF0dHJpID0gKEJzc0lkeDw8NCkgfCBQQUlSV0lTRUtFWVRBQkxFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKK30KKworQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIENvbW1hbmQsCisJSU4gVUNIQVIJCSBUb2tlbiwKKwlJTiBVQ0hBUgkJIEFyZzAsCisJSU4gVUNIQVIJCSBBcmcxKQoreworCUhPU1RfQ01EX0NTUl9TVFJVQwlIMk1DbWQ7CisJSDJNX01BSUxCT1hfU1RSVUMJSDJNTWFpbGJveDsKKwlVTE9ORwkJCQlpID0gMDsKKyNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSQUxJTktfQVRFCisJc3RhdGljIFVJTlQzMiBqID0gMDsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAmSDJNTWFpbGJveC53b3JkKTsKKwkJaWYgKEgyTU1haWxib3guZmllbGQuT3duZXIgPT0gMCkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMik7CisJfSB3aGlsZShpKysgPCAxMDApOworCisJaWYgKGkgPj0gMTAwKQorCXsKKyNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSQUxJTktfQVRFCisJCWlmIChwQWQtPmF0ZS5iRldMb2FkaW5nID09IFRSVUUpCisJCXsKKwkJCS8qIHJlbG9hZGluZyBmaXJtd2FyZSB3aGVuIHJlY2VpdmVkIGl3cHJpdiBjbWQgIkFURT1BVEVTVE9QIiAqLworCQkJaWYgKGogPiAwKQorCQkJeworCQkJCWlmIChqICUgNjQgIT0gMCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiMiKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlxuIikpOworCQkJCX0KKwkJCQkrK2o7CisJCQl9CisJCQllbHNlIGlmIChqID09IDApCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTG9hZGluZyBmaXJtd2FyZS4gUGxlYXNlIHdhaXQgZm9yIGEgbW9tZW50Li4uXG4iKSk7CisJCQkJKytqOworCQkJfQorCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisJCXsKKwkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSQUxJTktfQVRFCisJZWxzZSBpZiAocEFkLT5hdGUuYkZXTG9hZGluZyA9PSBUUlVFKQorCXsKKwkJLyogcmVsb2FkaW5nIG9mIGZpcm13YXJlIGlzIGNvbXBsZXRlZCAqLworCQlwQWQtPmF0ZS5iRldMb2FkaW5nID0gRkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlxuIikpOworCQlqID0gMDsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJSDJNTWFpbGJveC5maWVsZC5Pd25lcgkgID0gMTsJICAgLy8gcGFzcyBvd25lcnNoaXAgdG8gTUNVCisJSDJNTWFpbGJveC5maWVsZC5DbWRUb2tlbiA9IFRva2VuOworCUgyTU1haWxib3guZmllbGQuSGlnaEJ5dGUgPSBBcmcxOworCUgyTU1haWxib3guZmllbGQuTG93Qnl0ZSAgPSBBcmcwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgSDJNTWFpbGJveC53b3JkKTsKKworCUgyTUNtZC53b3JkIAkJCSAgPSAwOworCUgyTUNtZC5maWVsZC5Ib3N0Q29tbWFuZCAgPSBDb21tYW5kOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhPU1RfQ01EX0NTUiwgSDJNQ21kLndvcmQpOworCisJaWYgKENvbW1hbmQgIT0gMHg4MCkKKwl7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBSVDI4NjAKK0JPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBDb21tYW5kKQoreworCVVJTlQzMglDbWRTdGF0dXMgPSAwLCBDSUQgPSAwLCBpOworCVVJTlQzMglUaGlzQ0lETWFzayA9IDA7CisKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsICZDSUQpOworCQkvLyBGaW5kIHdoZXJlIHRoZSBjb21tYW5kIGlzLiBCZWNhdXNlIHRoaXMgaXMgcmFuZG9tbHkgc3BlY2lmaWVkIGJ5IGZpcm13YXJlLgorCQlpZiAoKENJRCAmIENJRDBNQVNLKSA9PSBDb21tYW5kKQorCQl7CisJCQlUaGlzQ0lETWFzayA9IENJRDBNQVNLOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoKCgoQ0lEICYgQ0lEMU1BU0spPj44KSAmIDB4ZmYpID09IENvbW1hbmQpCisJCXsKKwkJCVRoaXNDSURNYXNrID0gQ0lEMU1BU0s7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmICgoKChDSUQgJiBDSUQyTUFTSyk+PjE2KSAmIDB4ZmYpID09IENvbW1hbmQpCisJCXsKKwkJCVRoaXNDSURNYXNrID0gQ0lEMk1BU0s7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmICgoKChDSUQgJiBDSUQzTUFTSyk+PjI0KSAmIDB4ZmYpID09IENvbW1hbmQpCisJCXsKKwkJCVRoaXNDSURNYXNrID0gQ0lEM01BU0s7CisJCQlicmVhazsKKwkJfQorCisJCVJUTVB1c2VjRGVsYXkoMTAwKTsKKwkJaSsrOworCX13aGlsZSAoaSA8IDIwMCk7CisKKwkvLyBHZXQgQ29tbWFuZFN0YXR1cyBWYWx1ZQorCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAmQ21kU3RhdHVzKTsKKworCS8vIFRoaXMgY29tbWFuZCdzIHN0YXR1cyBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBjb21tYW5kLiBTbyBBTkQgY29tbWFuZCBwb3NpdGlvbidzIGJpdG1hc2sgdG8gcmVhZCBzdGF0dXMuCisJaWYgKGkgPCAyMDApCisJeworCQkvLyBJZiBTdGF0dXMgaXMgMSwgdGhlIGNvbWFtbmQgaXMgc3VjY2Vzcy4KKwkJaWYgKCgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MSkgfHwgKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxMDApCisJCQl8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwMDApKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuT2sgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwxIENJRCA9IDB4JXgsIENtZFN0YXR1cz0gMHgleCBcbiIsIENJRCwgQ21kU3RhdHVzKSk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5GYWlsMiBUaW1lb3V0IENvbW1hbmQgPSAlZCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ29tbWFuZCwgQ21kU3RhdHVzKSk7CisJfQorCS8vIENsZWFyIENvbW1hbmQgYW5kIFN0YXR1cy4KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQ2hlY2tSYXRlcygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUCVVDSEFSCQkJU3VwUmF0ZVtdLAorCUlOIE9VVAlVQ0hBUgkJCSpTdXBSYXRlTGVuKQoreworCVVDSEFSCVJhdGVJZHgsIGksIGo7CisJVUNIQVIJTmV3UmF0ZVsxMl0sIE5ld1JhdGVMZW47CisKKwlOZXdSYXRlTGVuID0gMDsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCVJhdGVJZHggPSA0OworCWVsc2UKKwkJUmF0ZUlkeCA9IDEyOworCisJLy8gQ2hlY2sgZm9yIHN1cHBvcnQgcmF0ZXMgZXhjbHVkZSBiYXNpYyByYXRlIGJpdAorCWZvciAoaSA9IDA7IGkgPCAqU3VwUmF0ZUxlbjsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQorCQkJaWYgKChTdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJCU5ld1JhdGVbTmV3UmF0ZUxlbisrXSA9IFN1cFJhdGVbaV07CisKKwkqU3VwUmF0ZUxlbiA9IE5ld1JhdGVMZW47CisJTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgTmV3UmF0ZSwgTmV3UmF0ZUxlbik7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCisJSU4gVUNIQVIJCUNoYW5uZWwpCit7CisJVUNIQVIJCWs7CisJVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7CisJVUNIQVIJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9IDA7CisKKwkvLyBGaW5kIHVwcGVyIGFuZCBsb3dlciBjaGFubmVsIGFjY29yZGluZyB0byA0ME1IeiBjdXJyZW50IG9wZXJhdGlvbi4KKwlpZiAoQ2VudHJhbENoYW5uZWwgPCBDaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gQ2hhbm5lbDsKKwkJaWYgKENlbnRyYWxDaGFubmVsID4gMikKKwkJCUxvd2VyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsIC0gMjsKKwkJZWxzZQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBDZW50cmFsQ2hhbm5lbCArIDI7CisJCUxvd2VyQ2hhbm5lbCA9IENoYW5uZWw7CisJfQorCisJZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IFVwcGVyQ2hhbm5lbCkKKwkJeworCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ICsrOworCQl9CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gTG93ZXJDaGFubmVsKQorCQl7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7CisJaWYgKE5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9PSAyKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBIVCBwaHkgdHlwZQorCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJRkFMU0UgaWYgcEFkLT5Db21tb25DZmcuU3VwcG9ydGVkSHRQaHkgZG9lc24ndCBhY2NlcHQgdGhlIHBIdENhcGFiaWxpdHkuICAoQVAgTW9kZSkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIAlSVE1QQ2hlY2tIdCgKKwlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOCVVDSEFSCQkJCQlXY2lkLAorCUlOIAlIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiAJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbykKK3sKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gSWYgdXNlIEFNU0RVLCBzZXQgZmxhZy4KKwlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOworCS8vIFNhdmUgUGVlciBDYXBhYmlsaXR5CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQykKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJeworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJfQorCisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uTXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJfQorCisJLy8gV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOworICAgIHN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJCWJyZWFrOworCX0KKworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoICYgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGgsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCisJCXBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JHLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9ICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKKworCS8vIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4KKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QczsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKKyAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCisJeworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7CisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOworCX0KKworICAgIGlmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApCisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgwOyAgLy8gQlcyMCBjYW4ndCB0cmFuc21pdCBNQ1MzMgorCisJQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKHBBZCwgcEh0Q2FwYWJpbGl0eSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJTWluaW11bVJhdGU7CisJVUNIQVIJUHJvcGVyTWxtZVJhdGU7IC8vPSBSQVRFXzU0OworCVVDSEFSCWksIGosIFJhdGVJZHggPSAxMjsgLy8xLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisJQk9PTEVBTgliTWF0Y2ggPSBGQUxTRTsKKworCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQjoKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID09IDQpICYmCisJCQkJKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID09IDApKQorCQkJCS8vIEIgb25seSBBUAorCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCWVsc2UKKwkJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgkvLyBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OworCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQkgICBNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvLyBlcnJvcgorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzE7CisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKKwkJeworCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCXsKKwkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKKwkJCQl7CisJCQkJCWJNYXRjaCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChiTWF0Y2gpCisJCQlicmVhazsKKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspCisJCXsKKwkJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWVBdXguRXh0UmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCQl7CisJCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQorCQkJCQl7CisJCQkJCQliTWF0Y2ggPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChiTWF0Y2gpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJUHJvcGVyTWxtZVJhdGUgPSBNaW5pbXVtUmF0ZTsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IE1pbmltdW1SYXRlOworCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBQcm9wZXJNbG1lUmF0ZTsKKwlpZiAocEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPj0gUkFURV82KQorCXsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTWxtZVJhdGUgPT0+ICAgTWxtZVRyYW5zbWl0ID0gMHgleCAgXG4iICwgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQpKTsKK30KKworQ0hBUiBSVE1QTWF4UnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBDSEFSCQkJCVJzc2kwLAorCUlOIENIQVIJCQkJUnNzaTEsCisJSU4gQ0hBUgkJCQlSc3NpMikKK3sKKwlDSEFSCWxhcmdlciA9IC0xMjc7CisKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgJiYgKFJzc2kwICE9IDApKQorCXsKKwkJbGFyZ2VyID0gUnNzaTA7CisJfQorCisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIpICYmIChSc3NpMSAhPSAwKSkKKwl7CisJCWxhcmdlciA9IG1heChSc3NpMCwgUnNzaTEpOworCX0KKworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpCisJeworCQlsYXJnZXIgPSBtYXgobGFyZ2VyLCBSc3NpMik7CisJfQorCisJaWYgKGxhcmdlciA9PSAtMTI3KQorCQlsYXJnZXIgPSAwOworCisJcmV0dXJuIGxhcmdlcjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBQZXJpb2RpYyBldmFsdWF0ZSBhbnRlbm5hIGxpbmsgc3RhdHVzCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJQkJQUjMgPSAwOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCXwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUCQl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCUJCUFIzICY9ICh+MHgxOCk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJQkJQUjMgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCUJCUFIzIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCUJCUFIzIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKyAgICAJcEFkLT5TdGFDZmcuQkJQUjMgPSBCQlBSMzsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCSkKKwl7CisJCVVMT05HCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCQlpZiAoVHhUb3RhbENudCA+IDUwKQorCQl7CisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMjApOworCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMzAwKTsKKwkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IFRSVUU7CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgQWZ0ZXIgZXZhbHVhdGlvbiwgY2hlY2sgYW50ZW5uYSBsaW5rIHN0YXR1cworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIJKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUNIQVIJCQlCQlBSMyA9IDA7CisJQ0hBUgkJCWxhcmdlciA9IC0xMjcsIHJzc2kwLCByc3NpMSwgcnNzaTI7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKQkJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpCQkJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJCXJldHVybjsKKworCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQorCQkJcmV0dXJuOworCisKKwkJLy8gaWYgdGhlIHRyYWZmaWMgaXMgbG93LCB1c2UgYXZlcmFnZSByc3NpIGFzIHRoZSBjcml0ZXJpYQorCQlpZiAocEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID09IFRSVUUpCisJCXsKKwkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKwkJCXJzc2kxID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMTsKKwkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMjsKKwkJfQorCisJCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKKwkJeworCQkJbGFyZ2VyID0gbWF4KHJzc2kwLCByc3NpMSk7CisKKwkJCWlmIChsYXJnZXIgPiAocnNzaTIgKyAyMCkpCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOworCQkJZWxzZQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMzsKKwkJfQorCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwkJeworCQkJaWYgKHJzc2kwID4gKHJzc2kxICsgMjApKQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMTsKKwkJCWVsc2UKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7CisJCX0KKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJCUJCUFIzICY9ICh+MHgxOCk7CisJCWlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDMpCisJCXsKKwkJCUJCUFIzIHw9ICgweDEwKTsKKwkJfQorCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDIpCisJCXsKKwkJCUJCUFIzIHw9ICgweDgpOworCQl9CisJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMSkKKwkJeworCQkJQkJQUjMgfD0gKDB4MCk7CisJCX0KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOworI2lmZGVmIFJUMjg2MAorICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK30KKworCisKK1ZPSUQgQVBTRFBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXJldHVybjsKKworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50Kys7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQvcmVzZXQgTUFDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gYlBpZ2d5QmFjayBwYXJhbWV0ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKyAgICAgICAgYlBpZ2d5QmFjayAgLSBFbmFibGUgLyBEaXNhYmxlIFBpZ2d5LUJhY2sKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKK3sKKwlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKworCVR4TGlua0NmZy5maWVsZC5UeENGQWNrRW4gPSBiUGlnZ3lCYWNrOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCit7CisJQk9PTEVBTgkJcmVzdWx0ID0gVFJVRTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIG9ubHkgYXNzb2NpYXRlZCBTVEEgY291bnRzCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQl9CisJCWVsc2UKKwkJCXJlc3VsdCA9IEZBTFNFOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykpCisJCQlyZXN1bHQgPSBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKKwkJCXJldHVybiBUUlVFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gZml4IHR4IGxlZ2FjeSByYXRlCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQoreworCVVDSEFSCXR4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQl0eF9tb2RlID0gKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIHR4X21vZGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgT3ZlcndyaXRlIEhUIFR4IE1vZGUgYnkgRml4ZWQgTGVnZW5jeSBUeCBNb2RlLCBpZiBzcGVjaWZpZWQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAorCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAorCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3sKKwlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXRTZXR0aW5nOworCisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0hUKQorCQlyZXR1cm47CisKKwlUcmFuc21pdFNldHRpbmcud29yZCA9IDA7CisKKwlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7CisJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUzsKKworCWlmIChmaXhlZF90eF9tb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spCisJeworCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkvLyBDQ0sgbW9kZSBhbGxvdyBNQ1MgMH4zCisJCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzMpCisJCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisJfQorCWVsc2UKKwl7CisJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkvLyBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NworCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU183KQorCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OworCX0KKworCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IFRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFKQorCXsKKwkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IFRyYW5zbWl0U2V0dGluZy53b3JkOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nIDogd2NpZC0lZCwgTU9ERT0lcywgTUNTPSVkIFxuIiwKKwkJCQlwRW50cnktPkFpZCwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWR5bmFtaWMgdHVuZSBCQlAgUjY2IHRvIGZpbmQgYSBiYWxhbmNlIGJldHdlZW4gc2Vuc2liaWxpdHkgYW5kCisJCW5vaXNlIGlzb2xhdGlvbgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTdGFCYnBUdW5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJT3JpZ1I2NlZhbHVlID0gMCwgUjY2Oy8vLCBSNjZVcHBlckJvdW5kID0gMHgzMCwgUjY2TG93ZXJCb3VuZCA9IDB4MzA7CisJQ0hBUglSc3NpOworCisJLy8gMjg2MEMgZGlkIG5vdCBzdXBwb3J0IEZhc2UgQ0NBLCB0aGVyZWZvcmUgY2FuJ3QgdHVuZQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJcmV0dXJuOworCisJLy8KKwkvLyB3b3JrIGFzIGEgU1RBCisJLy8KKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICAvLyBubyBSNjYgdHVuaW5nIHdoZW4gU0NBTk5JTkcKKwkJcmV0dXJuOworCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkpCisJCSYmICEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyNpZmRlZiBSVDI4NjAKKwkJJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yaWdSNjZWYWx1ZSk7CisJCVI2NiA9IE9yaWdSNjZWYWx1ZTsKKworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCisJCQlSc3NpID0gKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKyBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOworCQllbHNlCisJCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKworCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQl7CS8vQkcgYmFuZAorCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9ICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJewkvL0EgYmFuZAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV18yMCkKKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQmFuZFdpZHRoKQoreworCVVDSEFSCVI2NiA9IDB4MzA7CisKKwlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCXsJLy8gQkcgYmFuZAorCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCX0KKwllbHNlCisJewkvL0EgYmFuZAorCQlpZiAoQmFuZFdpZHRoID09IEJXXzIwKQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQllbHNlCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJfQorCit9CisKK1ZPSUQgQXNpY1R1cm5PZmZSRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJQ2hhbm5lbCkKK3sKKworCS8vIFJGIFIyIGJpdCAxOCA9IDAKKwlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOworCVVDSEFSCQkJaW5kZXg7CisJUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOworCisJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCisJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCXsKKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjEgJiAweGZmZmZkZmZmOworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyICYgMHhmZmZiZmZmZjsKKwkJCQkJUjMgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmM2ZmZmY7CisKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQkJLy8gUHJvZ3JhbSBSMWIxMyB0byAxLCBSMy9iMTgsMTkgdG8gMCwgUjJiMTggdG8gMC4KKwkJCQkJLy8gU2V0IFJGIFIyIGJpdDE4PTAsIFIzIGJpdFsxODoxOV09MAorCQkJCQkvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisJCQkJCWlmICgxKQorCQkJCQl7CisJCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHgsICBSMyA9IDB4JTA4eCBcbiIsCisJCQkJCQkJQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgUjIsIFIzKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PZmZSRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eCBcbiIsCisJCQkJCQkJQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgUjIpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KK30KKworCitWT0lEIEFzaWNUdXJuT25SRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpCit7CisKKwkvLyBSRiBSMiBiaXQgMTggPSAwCisJVUlOVDMyCQkJUjEgPSAwLCBSMiA9IDAsIFIzID0gMDsKKwlVQ0hBUgkJCWluZGV4OworCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCisJCQkJeworCQkJCQlSMyA9IHBBZC0+TGF0Y2hSZlJlZ3MuUjM7CisJCQkJCVIzICY9IDB4ZmZmM2ZmZmY7CisJCQkJCVIzIHw9IDB4MDAwODAwMDA7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKKworCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7CisKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PblJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4XG4iLAorCQlDaGFubmVsLAorCQlwQWQtPlJmSWNUeXBlLAorCQlSMikpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbmV0aWZfYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y3ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbmV0aWZfYmxvY2suYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgIm5ldGlmX2Jsb2NrLmgiCisKK3N0YXRpYyBORVRJRl9FTlRSWSBmcmVlTmV0SWZFbnRyeVBvb2xbRlJFRV9ORVRJRl9QT09MX1NJWkVdOworc3RhdGljIExJU1RfSEVBREVSIGZyZWVOZXRJZkVudHJ5TGlzdDsKKwordm9pZCBpbml0YmxvY2tRdWV1ZVRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlpbnQgaTsKKworCWluaXRMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QpOworCWZvciAoaSA9IDA7IGkgPCBGUkVFX05FVElGX1BPT0xfU0laRTsgaSsrKQorCQlpbnNlcnRUYWlsTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpJmZyZWVOZXRJZkVudHJ5UG9vbFtpXSk7CisKKwlmb3IgKGk9MDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspCisJCWluaXRMaXN0KCZwQWQtPmJsb2NrUXVldWVUYWJbaV0uTmV0SWZMaXN0KTsKKworCXJldHVybjsKK30KKworQk9PTEVBTiBibG9ja05ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAorCUlOIFBORVRfREVWIHBOZXREZXYpCit7CisJUE5FVElGX0VOVFJZIHBOZXRJZkVudHJ5ID0gTlVMTDsKKworCWlmICgocE5ldElmRW50cnkgPSAoUE5FVElGX0VOVFJZKXJlbW92ZUhlYWRMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QpKSAhPSBOVUxMKQorCXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShwTmV0RGV2KTsKKwkJcE5ldElmRW50cnktPnBOZXREZXYgPSBwTmV0RGV2OworCQlpbnNlcnRUYWlsTGlzdCgmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0LCAoUExJU1RfRU5UUlkpcE5ldElmRW50cnkpOworCisJCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IFRSVUU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm5ldGlmX3N0b3BfcXVldWUoJXMpXG4iLCBwTmV0RGV2LT5uYW1lKSk7CisJfQorCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKK1ZPSUQgcmVsZWFzZU5ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5KQoreworCVBORVRJRl9FTlRSWSBwTmV0SWZFbnRyeSA9IE5VTEw7CisJUExJU1RfSEVBREVSIHBOZXRJZkxpc3QgPSAmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0OworCisJd2hpbGUoKHBOZXRJZkVudHJ5ID0gKFBORVRJRl9FTlRSWSlyZW1vdmVIZWFkTGlzdChwTmV0SWZMaXN0KSkgIT0gIE5VTEwpCisJeworCQlQTkVUX0RFViBwTmV0RGV2ID0gcE5ldElmRW50cnktPnBOZXREZXY7CisJCW5ldGlmX3dha2VfcXVldWUocE5ldERldik7CisJCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibmV0aWZfd2FrZV9xdWV1ZSglcylcbiIsIHBOZXREZXYtPm5hbWUpKTsKKwl9CisJcEJsb2NrUXVldWVFbnRyeS0+U3dUeFF1ZXVlQmxvY2tGbGFnID0gRkFMU0U7CisJcmV0dXJuOworfQorCisKK1ZPSUQgU3RvcE5ldElmUXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KQoreworCVBORVRfREVWIE5ldERldiA9IE5VTEw7CisJVUNIQVIgSWZJZHggPSAwOworCUJPT0xFQU4gdmFsaWQgPSBGQUxTRTsKKworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgPj0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKQorCXsKKwkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpICUgTUFYX0FQQ0xJX05VTTsKKwkJTmV0RGV2ID0gcEFkLT5BcENmZy5BcENsaVRhYltJZklkeF0uZGV2OworCX0KKwllbHNlCisjZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLworI2lmZGVmIFdEU19TVVBQT1JUCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpID49IE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpCisJeworCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpICUgTUFYX1dEU19FTlRSWTsKKwkJTmV0RGV2ID0gcEFkLT5XZHNUYWIuV2RzRW50cnlbSWZJZHhdLmRldjsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCisJeworI2lmZGVmIE1CU1NfU1VQUE9SVAorCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCQl7CisJCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQpICUgTUFYX01CU1NJRF9OVU07CisJCQlOZXREZXYgPSBwQWQtPkFwQ2ZnLk1CU1NJRFtJZklkeF0uTVNTSUREZXY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJZklkeCA9IE1BSU5fTUJTU0lEOworCQkJTmV0RGV2ID0gcEFkLT5uZXRfZGV2OworCQl9CisjZWxzZQorCQlJZklkeCA9IE1BSU5fTUJTU0lEOworCQlOZXREZXYgPSBwQWQtPm5ldF9kZXY7CisjZW5kaWYKKwl9CisKKwkvLyBXTU0gc3VwcG9ydCA0IHNvZnR3YXJlIHF1ZXVlcy4KKwkvLyBPbmUgc29mdHdhcmUgcXVldWUgZnVsbCBkb2Vzbid0IG1lYW4gZGV2aWNlIGhhdmUgbm8gY2FwYmlsaXR5IHRvIHRyYW5zbWl0IHBhY2tldC4KKwkvLyBTbyBkaXNhYmxlIGJsb2NrIE5ldC1JZiBxdWV1ZSBmdW5jdGlvbiB3aGlsZSBXTU0gZW5hYmxlLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXZhbGlkID0gKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID09IFRSVUUpID8gRkFMU0UgOiBUUlVFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKHZhbGlkKQorCQlibG9ja05ldElmKCZwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XSwgTmV0RGV2KTsKKwlyZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL25ldGlmX2Jsb2NrLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTE1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19ORVRfSUZfQkxPQ0tfSF9fCisjZGVmaW5lIF9fTkVUX0lGX0JMT0NLX0hfXworCisvLyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlICJsaW5rX2xpc3QuaCIKKyNpbmNsdWRlICJydG1wLmgiCisKKyNkZWZpbmUgRlJFRV9ORVRJRl9QT09MX1NJWkUgMzIKKwordHlwZWRlZiBzdHJ1Y3QgX05FVElGX0VOVFJZCit7CisJc3RydWN0IF9ORVRJRl9FTlRSWSAqcE5leHQ7CisJUE5FVF9ERVYgcE5ldERldjsKK30gTkVUSUZfRU5UUlksICpQTkVUSUZfRU5UUlk7CisKK3ZvaWQgaW5pdGJsb2NrUXVldWVUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIGJsb2NrTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnksCisJSU4gUE5FVF9ERVYgcE5ldERldik7CisKK1ZPSUQgcmVsZWFzZU5ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5KTsKKworVk9JRCBTdG9wTmV0SWZRdWV1ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBRdWVJZHgsCisJSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQpOworI2VuZGlmIC8vIF9fTkVUX0lGX0JMT0NLX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZWRmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYwpAQCAtMCwwICsxLDM3NDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9pbml0LmMKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKKyAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKKyAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAJImZpcm13YXJlLmgiCisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisKK1VDSEFSICAgIEJJVDhbXSA9IHsweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwfTsKK1VMT05HICAgIEJJVDMyW10gPSB7MHgwMDAwMDAwMSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwOCwKKwkJCQkJMHgwMDAwMDAxMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA4MCwKKwkJCQkJMHgwMDAwMDEwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDgwMCwKKwkJCQkJMHgwMDAwMTAwMCwgMHgwMDAwMjAwMCwgMHgwMDAwNDAwMCwgMHgwMDAwODAwMCwKKwkJCQkJMHgwMDAxMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDA0MDAwMCwgMHgwMDA4MDAwMCwKKwkJCQkJMHgwMDEwMDAwMCwgMHgwMDIwMDAwMCwgMHgwMDQwMDAwMCwgMHgwMDgwMDAwMCwKKwkJCQkJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwKKwkJCQkJMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMH07CisKK2NoYXIqICAgQ2lwaGVyTmFtZVtdID0geyJub25lIiwid2VwNjQiLCJ3ZXAxMjgiLCJUS0lQIiwiQUVTIiwiQ0tJUDY0IiwiQ0tJUDEyOCJ9OworCitjb25zdCB1bnNpZ25lZCBzaG9ydCBjY2l0dF8xNlRhYmxlW10gPSB7CisJMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBBNSwgMHg2MEM2LCAweDcwRTcsCisJMHg4MTA4LCAweDkxMjksIDB4QTE0QSwgMHhCMTZCLCAweEMxOEMsIDB4RDFBRCwgMHhFMUNFLCAweEYxRUYsCisJMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyQjUsIDB4NDI5NCwgMHg3MkY3LCAweDYyRDYsCisJMHg5MzM5LCAweDgzMTgsIDB4QjM3QiwgMHhBMzVBLCAweEQzQkQsIDB4QzM5QywgMHhGM0ZGLCAweEUzREUsCisJMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLCAweDY0RTYsIDB4NzRDNywgMHg0NEE0LCAweDU0ODUsCisJMHhBNTZBLCAweEI1NEIsIDB4ODUyOCwgMHg5NTA5LCAweEU1RUUsIDB4RjVDRiwgMHhDNUFDLCAweEQ1OEQsCisJMHgzNjUzLCAweDI2NzIsIDB4MTYxMSwgMHgwNjMwLCAweDc2RDcsIDB4NjZGNiwgMHg1Njk1LCAweDQ2QjQsCisJMHhCNzVCLCAweEE3N0EsIDB4OTcxOSwgMHg4NzM4LCAweEY3REYsIDB4RTdGRSwgMHhENzlELCAweEM3QkMsCisJMHg0OEM0LCAweDU4RTUsIDB4Njg4NiwgMHg3OEE3LCAweDA4NDAsIDB4MTg2MSwgMHgyODAyLCAweDM4MjMsCisJMHhDOUNDLCAweEQ5RUQsIDB4RTk4RSwgMHhGOUFGLCAweDg5NDgsIDB4OTk2OSwgMHhBOTBBLCAweEI5MkIsCisJMHg1QUY1LCAweDRBRDQsIDB4N0FCNywgMHg2QTk2LCAweDFBNzEsIDB4MEE1MCwgMHgzQTMzLCAweDJBMTIsCisJMHhEQkZELCAweENCREMsIDB4RkJCRiwgMHhFQjlFLCAweDlCNzksIDB4OEI1OCwgMHhCQjNCLCAweEFCMUEsCisJMHg2Q0E2LCAweDdDODcsIDB4NENFNCwgMHg1Q0M1LCAweDJDMjIsIDB4M0MwMywgMHgwQzYwLCAweDFDNDEsCisJMHhFREFFLCAweEZEOEYsIDB4Q0RFQywgMHhERENELCAweEFEMkEsIDB4QkQwQiwgMHg4RDY4LCAweDlENDksCisJMHg3RTk3LCAweDZFQjYsIDB4NUVENSwgMHg0RUY0LCAweDNFMTMsIDB4MkUzMiwgMHgxRTUxLCAweDBFNzAsCisJMHhGRjlGLCAweEVGQkUsIDB4REZERCwgMHhDRkZDLCAweEJGMUIsIDB4QUYzQSwgMHg5RjU5LCAweDhGNzgsCisJMHg5MTg4LCAweDgxQTksIDB4QjFDQSwgMHhBMUVCLCAweEQxMEMsIDB4QzEyRCwgMHhGMTRFLCAweEUxNkYsCisJMHgxMDgwLCAweDAwQTEsIDB4MzBDMiwgMHgyMEUzLCAweDUwMDQsIDB4NDAyNSwgMHg3MDQ2LCAweDYwNjcsCisJMHg4M0I5LCAweDkzOTgsIDB4QTNGQiwgMHhCM0RBLCAweEMzM0QsIDB4RDMxQywgMHhFMzdGLCAweEYzNUUsCisJMHgwMkIxLCAweDEyOTAsIDB4MjJGMywgMHgzMkQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsCisJMHhCNUVBLCAweEE1Q0IsIDB4OTVBOCwgMHg4NTg5LCAweEY1NkUsIDB4RTU0RiwgMHhENTJDLCAweEM1MEQsCisJMHgzNEUyLCAweDI0QzMsIDB4MTRBMCwgMHgwNDgxLCAweDc0NjYsIDB4NjQ0NywgMHg1NDI0LCAweDQ0MDUsCisJMHhBN0RCLCAweEI3RkEsIDB4ODc5OSwgMHg5N0I4LCAweEU3NUYsIDB4Rjc3RSwgMHhDNzFELCAweEQ3M0MsCisJMHgyNkQzLCAweDM2RjIsIDB4MDY5MSwgMHgxNkIwLCAweDY2NTcsIDB4NzY3NiwgMHg0NjE1LCAweDU2MzQsCisJMHhEOTRDLCAweEM5NkQsIDB4RjkwRSwgMHhFOTJGLCAweDk5QzgsIDB4ODlFOSwgMHhCOThBLCAweEE5QUIsCisJMHg1ODQ0LCAweDQ4NjUsIDB4NzgwNiwgMHg2ODI3LCAweDE4QzAsIDB4MDhFMSwgMHgzODgyLCAweDI4QTMsCisJMHhDQjdELCAweERCNUMsIDB4RUIzRiwgMHhGQjFFLCAweDhCRjksIDB4OUJEOCwgMHhBQkJCLCAweEJCOUEsCisJMHg0QTc1LCAweDVBNTQsIDB4NkEzNywgMHg3QTE2LCAweDBBRjEsIDB4MUFEMCwgMHgyQUIzLCAweDNBOTIsCisJMHhGRDJFLCAweEVEMEYsIDB4REQ2QywgMHhDRDRELCAweEJEQUEsIDB4QUQ4QiwgMHg5REU4LCAweDhEQzksCisJMHg3QzI2LCAweDZDMDcsIDB4NUM2NCwgMHg0QzQ1LCAweDNDQTIsIDB4MkM4MywgMHgxQ0UwLCAweDBDQzEsCisJMHhFRjFGLCAweEZGM0UsIDB4Q0Y1RCwgMHhERjdDLCAweEFGOUIsIDB4QkZCQSwgMHg4RkQ5LCAweDlGRjgsCisJMHg2RTE3LCAweDdFMzYsIDB4NEU1NSwgMHg1RTc0LCAweDJFOTMsIDB4M0VCMiwgMHgwRUQxLCAweDFFRjAKK307CisjZGVmaW5lIEJ5dGVDUkMxNih2LCBjcmMpIFwKKwkodW5zaWduZWQgc2hvcnQpKChjcmMgPDwgOCkgXiAgY2NpdHRfMTZUYWJsZVsoKGNyYyA+PiA4KSBeICh2KSkgJiAyNTVdKQorCisvLworLy8gQkJQIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldAorLy8KK1JFR19QQUlSICAgQkJQUmVnVGFibGVbXSA9IHsKKwl7QkJQX1I2NSwJCTB4MkN9LAkJLy8gZml4IHJzc2kgaXNzdWUKKwl7QkJQX1I2NiwJCTB4Mzh9LAkvLyBBbHNvIHNldCB0aGlzIGRlZmF1bHQgdmFsdWUgdG8gcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlIGF0IGluaXRpYWwKKwl7QkJQX1I2OSwJCTB4MTJ9LAorCXtCQlBfUjcwLAkJMHhhfSwJLy8gQkJQX1I3MCB3aWxsIGNoYW5nZSB0byAweDggaW4gQXBTdGFydFVwIGFuZCBMaW5rVXAgZm9yIHJ0Mjg2MEMsIG90aGVyd2lzZSB2YWx1ZSBpcyAweGEKKwl7QkJQX1I3MywJCTB4MTB9LAorCXtCQlBfUjgxLAkJMHgzN30sCisJe0JCUF9SODIsCQkweDYyfSwKKwl7QkJQX1I4MywJCTB4NkF9LAorCXtCQlBfUjg0LAkJMHg5OX0sCS8vIDB4MTkgaXMgZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuIDB4OTkgaXMgZm9yIHJ0Mjg2MEQgYW5kIGJlZm9yZQorCXtCQlBfUjg2LAkJMHgwMH0sCS8vIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOAorCXtCQlBfUjkxLAkJMHgwNH0sCS8vIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOAorCXtCQlBfUjkyLAkJMHgwMH0sCS8vIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOAorCXtCQlBfUjEwMywgIAkweDAwfSwgCS8vIG5lYXIgcmFuZ2UgaGlnaC1wb3dlciBpc3N1ZSwgcmVxdWVzdGVkIGZyb20gR2FyeSBAMjAwOC0wNTI4CisJe0JCUF9SMTA1LAkJMHgwNX0sCS8vIDB4MDUgaXMgZm9yIHJ0Mjg2MEUgdG8gdHVybiBvbiBGRVEgY29udHJvbC4gSXQgaXMgc2FmZSBmb3IgcnQyODYwRCBhbmQgYmVmb3JlLCBiZWNhdXNlIEJpdCA3OjIgYXJlIHJlc2VydmVkIGluIHJ0Mjg2MEQgYW5kIGJlZm9yZS4KK307CisjZGVmaW5lCU5VTV9CQlBfUkVHX1BBUk1TCShzaXplb2YoQkJQUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKKworLy8KKy8vIFJGIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldAorLy8KKworLy8KKy8vIEFTSUMgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0cworLy8KKworUlRNUF9SRUdfUEFJUglNQUNSZWdUYWJsZVtdID0JeworI2lmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgyMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZjhmMGU4ZTB9LCAvKiAweDM4MDAoZTApLCAweDNBMDAoZTgpLCAweDNDMDAoZjApLCAweDNFMDAoZjgpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworCXtCQ05fT0ZGU0VUMSwJCQkweDZmNzdkMGM4fSwgLyogMHgzMjAwKGM4KSwgMHgzNDAwKGQwKSwgMHgxREMwKDc3KSwgMHgxQkMwKDZmKSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKyNlbGlmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgxMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZWNlOGU0ZTB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLAkJCTB4ZmNmOGY0ZjB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisjZWxzZQorICAgICNlcnJvciBZb3UgbXVzdCByZS1jYWxjdWxhdGUgbmV3IHZhbHVlIGZvciBCQ05fT0ZGU0VUMCAmIEJDTl9PRkZTRVQxIGluIE1BQ1JlZ1RhYmxlW10hISEKKyNlbmRpZiAvLyBIV19CRUFDT05fT0ZGU0VUIC8vCisKKwl7TEVHQUNZX0JBU0lDX1JBVEUsCQkweDAwMDAwMTNmfSwgLy8gIEJhc2ljIHJhdGUgc2V0IGJpdG1hcAorCXtIVF9CQVNJQ19SQVRFLAkJMHgwMDAwODAwM30sIC8vIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLgorCXtNQUNfU1lTX0NUUkwsCQkweDAwfSwgLy8gMHgxMDA0LCAsIGRlZmF1bHQgRGlzYWJsZSBSWAorCXtSWF9GSUxUUl9DRkcsCQkweDE3Zjk3fSwgLy8weDE0MDAgICwgUlggZmlsdGVyIGNvbnRyb2wsCisJe0JLT0ZGX1NMT1RfQ0ZHLAkweDIwOX0sIC8vIGRlZmF1bHQgc2V0IHNob3J0IHNsb3QgdGltZSwgQ0NfREVMQVlfVElNRSBzaG91bGQgYmUgMgorCXtUWF9TV19DRkcwLAkJMHgwfSwgCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0CisJe1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCisJe1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMworCXtUWF9USU1FT1VUX0NGRywJMHgwMDBhMjA5MH0sCS8vIENDSyBoYXMgc29tZSBwcm9ibGVtLiBTbyBpbmNyZWFzZSB0aW1pZW91dCB2YWx1ZS4gMjAwNi0xMC0wOS8vIE1BcnZlayBSVCAsIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDEKKwl7TUFYX0xFTl9DRkcsCQlNQVhfQUdHUkVHQVRJT05fU0laRSB8IDB4MDAwMDEwMDB9LAkvLyAweDMwMTgsIE1BWCBmcmFtZSBsZW5ndGguIE1heCBQU0RVID0gMTZrYnl0ZXMuCisJe0xFRF9DRkcsCQkweDdmMDMxZTQ2fSwgLy8gR2FyeSwgMjAwNi0wOC0yMworCXtQQkZfTUFYX1BDTlQsCQkJMHgxRjNGQkY5Rn0sIAkvLzB4MUYzZjdmOWZ9LAkJLy9KYW4sIDIwMDYvMDQvMjAKKwl7VFhfUlRZX0NGRywJCQkweDQ3ZDAxZjBmfSwJLy8gSmFuLCAyMDA2LzExLzE2LCBTZXQgVHhXSS0+QUNLID0wIGluIFByb2JlIFJzcCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAzCisJe0FVVE9fUlNQX0NGRywJCQkweDAwMDAwMDEzfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyCisJe0NDS19QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgorCXtPRkRNX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCisJe0dGMjBfUFJPVF9DRkcsCQkJMHgwMTc0NDAwNH0sICAgIC8vIHNldCAxOToxOCAtLT4gU2hvcnQgTkFWIGZvciBNSU1PIFBTCisJe0dGNDBfUFJPVF9DRkcsCQkJMHgwM0Y0NDA4NH0sCisJe01NMjBfUFJPVF9DRkcsCQkJMHgwMTc0NDAwNH0sCisjaWZkZWYgUlQyODYwCisJe01NNDBfUFJPVF9DRkcsCQkJMHgwM0Y1NDA4NH0sCisjZW5kaWYgLy8gUlQyODYwIC8vCisJe1RYT1BfQ1RSTF9DRkcsCQkJMHgwMDAwNTgzZiwgLyoweDAwMDAyNDNmKi8gLyoweDAwMDAyNGJmKi99LAkvL0V4dGVuc2lvbiBjaGFubmVsIGJhY2tvZmYuCisJe1RYX1JUU19DRkcsCQkJMHgwMDA5MmIyMH0sCisJe0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQorCXtUWE9QX0hMRFJfRVQsIAkJCTB4MDAwMDAwMDJ9LAorCisJLyogSmVycnkgY29tbWVudHMgMjAwOC8wMS8xNjogd2UgdXNlIFNJRlMgPSAxMHVzIGluIENDSyBkZWZhdWx0bHksIGJ1dCBpdCBzZWVtcyB0aGF0IDEwdXMKKwkJaXMgdG9vIHNtYWxsIGZvciBJTlRFTCAyMjAwYmcgY2FyZCwgc28gaW4gTUJTUyBtb2RlLCB0aGUgZGVsdGEgdGltZSBiZXR3ZWVuIGJlYWNvbjAKKwkJYW5kIGJlYWNvbjEgaXMgU0lGUyAoMTB1cyksIHNvIGlmIElOVEVMIDIyMDBiZyBjYXJkIGNvbm5lY3RzIHRvIEJTUzAsIHRoZSBwaW5nCisJCXdpbGwgYWx3YXlzIGxvc3QuIFNvIHdlIGNoYW5nZSB0aGUgU0lGUyBvZiBDQ0sgZnJvbSAxMHVzIHRvIDE2dXMuICovCisJe1hJRlNfVElNRV9DRkcsCQkJMHgzM2E0MTAxMH0sCisJe1BXUl9QSU5fQ0ZHLAkJCTB4MDAwMDAwMDN9LAkvLyBwYXRjaCBmb3IgMjg4MC1FCit9OworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1JUTVBfUkVHX1BBSVIJU1RBTUFDUmVnVGFibGVbXSA9CXsKKwl7V01NX0FJRlNOX0NGRywJCTB4MDAwMDIyNzN9LAorCXtXTU1fQ1dNSU5fQ0ZHLAkweDAwMDAyMzQ0fSwKKwl7V01NX0NXTUFYX0NGRywJMHgwMDAwMzRhYX0sCit9OworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjZGVmaW5lCU5VTV9NQUNfUkVHX1BBUk1TCQkoc2l6ZW9mKE1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUJTlVNX1NUQV9NQUNfUkVHX1BBUk1TCShzaXplb2YoU1RBTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKy8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RICTB4MjAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFX0xFTkdUSAkJKHNpemVvZiAoRmlybXdhcmVJbWFnZSkgLyBzaXplb2YoVUNIQVIpKQorI2RlZmluZSBGSVJNV0FSRV9NQUpPUl9WRVJTSU9OCTAKKworI2RlZmluZSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RICTB4MTAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RICTB4MTAwMAorCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04JMgorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbGxvY2F0ZSBSVE1QX0FEQVBURVIgZGF0YSBibG9jayBhbmQgZG8gc29tZSBpbml0aWFsaXphdGlvbgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NBZGFwdGVyQmxvY2soCisJSU4gIFBWT0lECWhhbmRsZSwKKwlPVVQJUFJUTVBfQURBUFRFUgkqcHBBZGFwdGVyKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJSU5UIAkJCWluZGV4OworCVVDSEFSCQkJKnBCZWFjb25CdWYgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY0FkYXB0ZXJCbG9ja1xuIikpOworCisJKnBwQWRhcHRlciA9IE5VTEw7CisKKwlkbworCXsKKwkJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1lbW9yeSBibG9jaworCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkKKwkJeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKFBWT0lEICopJnBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEFEQVBURVJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKKwkJcHJpbnRrKCJcblxuPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG5cbiIsIHBBZCwgKFVJTlQzMilzaXplb2YoUlRNUF9BREFQVEVSKSk7CisKKworCQkvLyBJbml0IHNwaW4gbG9ja3MKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKyNpZmRlZiBSVDI4NjAKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJZm9yIChpbmRleCA9MCA7IGluZGV4IDwgTlVNX09GX1RYX1JJTkc7IGluZGV4KyspCisJCXsKKwkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlR4U3dRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7CisJCQlwQWQtPkRlUXVldWVSdW5uaW5nW2luZGV4XSA9IEZBTFNFOworCQl9CisKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+aXJxX2xvY2spOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJaWYgKChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgJiYgKHBCZWFjb25CdWYpKQorCQlrZnJlZShwQmVhY29uQnVmKTsKKworCSpwcEFkYXB0ZXIgPSBwQWQ7CisKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jQWRhcHRlckJsb2NrLCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIGluaXRpYWwgVHggcG93ZXIgcGVyIE1DUyBhbmQgQlcgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBSZWFkVHhQd3JQZXJSYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCQlkYXRhLCBBZGF0YSwgR2RhdGE7CisJVVNIT1JUCQlpLCB2YWx1ZSwgdmFsdWUyOworCUlOVAkJCUFwd3JkZWx0YSwgR3B3cmRlbHRhOworCVVDSEFSCQl0MSx0Mix0Myx0NDsKKwlCT09MRUFOCQliVmFsaWQsIGJBcHdyZGVsdGFNaW51cyA9IFRSVUUsIGJHcHdyZGVsdGFNaW51cyA9IFRSVUU7CisKKwkvLworCS8vIEdldCBwb3dlciBkZWx0YSBmb3IgMjBNSHogYW5kIDQwTUh6LgorCS8vCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhwb3dlciBwZXIgUmF0ZVxuIikpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfREVMVEEsIHZhbHVlMik7CisJQXB3cmRlbHRhID0gMDsKKwlHcHdyZGVsdGEgPSAwOworCisJaWYgKCh2YWx1ZTIgJiAweGZmKSAhPSAweGZmKQorCXsKKwkJaWYgKCh2YWx1ZTIgJiAweDgwKSkKKwkJCUdwd3JkZWx0YSA9ICh2YWx1ZTImMHhmKTsKKworCQlpZiAoKHZhbHVlMiAmIDB4NDApKQorCQkJYkdwd3JkZWx0YU1pbnVzID0gRkFMU0U7CisJCWVsc2UKKwkJCWJHcHdyZGVsdGFNaW51cyA9IFRSVUU7CisJfQorCWlmICgodmFsdWUyICYgMHhmZjAwKSAhPSAweGZmMDApCisJeworCQlpZiAoKHZhbHVlMiAmIDB4ODAwMCkpCisJCQlBcHdyZGVsdGEgPSAoKHZhbHVlMiYweGYwMCk+PjgpOworCisJCWlmICgodmFsdWUyICYgMHg0MDAwKSkKKwkJCWJBcHdyZGVsdGFNaW51cyA9IEZBTFNFOworCQllbHNlCisJCQliQXB3cmRlbHRhTWludXMgPSBUUlVFOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcHdyZGVsdGEgPSAleCwgQXB3cmRlbHRhID0gJXggLlxuIiwgR3B3cmRlbHRhLCBBcHdyZGVsdGEpKTsKKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgMjBNSHogaW4gMi40Ry4KKwkvLworCWZvciAoaT0wOyBpPDU7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpKjQsIHZhbHVlKTsKKwkJZGF0YSA9IHZhbHVlOworCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKwkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlHZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCQlkYXRhIHw9ICh2YWx1ZTw8MTYpOworCisJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOworCQlwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gPSBHZGF0YTsKKworCQlpZiAoZGF0YSAhPSAweGZmZmZmZmZmKQorCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBkYXRhKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjIwTUh6IEJXLCAyLjRHIGJhbmQtJWx4LCAgQWRhdGEgPSAlbHgsICBHZGF0YSA9ICVseCBcbiIsIGRhdGEsIEFkYXRhLCBHZGF0YSkpOworCX0KKworCS8vCisJLy8gQ2hlY2sgdGhpcyBibG9jayBpcyB2YWxpZCBmb3IgNDBNSHogaW4gMi40Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgMiArIGkqMiwgdmFsdWUpOworCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQorCQl7CisJCQliVmFsaWQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciA0ME1IeiBpbiAyLjRHLgorCS8vCisJaWYgKGJWYWxpZCkKKwl7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJeworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJR2RhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlHZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdID0gKHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdICYgMHgwMDAwRkZGRikgfCAoR2RhdGEgJiAweEZGRkYwMDAwKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaSsxXSA9IEdkYXRhOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiNDBNSHogQlcsIDIuNEcgYmFuZCwgR2RhdGEgPSAlbHggXG4iLCBHZGF0YSkpOworCQl9CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciAyME1IeiBpbiA1Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw4OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RyArIDIgKyBpKjIsIHZhbHVlKTsKKwkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKKwkJeworCQkJYlZhbGlkID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgMjBNSHogaW4gNUcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgaSo0ICsgMiwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gPSAocEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldICYgMHgwMDAwRkZGRikgfCAoQWRhdGEgJiAweEZGRkYwMDAwKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gPSBBZGF0YTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjIwTUh6IEJXLCA1R0h6IGJhbmQsIEFkYXRhID0gJWx4IFxuIiwgQWRhdGEpKTsKKwkJfQorCX0KKworCS8vCisJLy8gQ2hlY2sgdGhpcyBibG9jayBpcyB2YWxpZCBmb3IgNDBNSHogaW4gNUcuIElmIGludmFsaWQsIHVzZSBwYXJhbWV0ZXIgZm9yIDIwTUh6IGluIDIuNEcKKwkvLworCWJWYWxpZCA9IFRSVUU7CisJZm9yIChpPTA7IGk8NjsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcgKyAyICsgaSoyLCB2YWx1ZSk7CisJCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCisJCXsKKwkJCWJWYWxpZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDQwTUh6IGluIDVHLgorCS8vCisJaWYgKGJWYWxpZCkKKwl7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJeworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcgKyBpKjQsIHZhbHVlKTsKKwkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUFkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisKKwkJCWlmIChpID09IDApCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gPSAocEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gJiAweDAwMDBGRkZGKSB8IChBZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpKzFdID0gQWRhdGE7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI0ME1IeiBCVywgNUdIeiBiYW5kLCBBZGF0YSA9ICVseCBcbiIsIEFkYXRhKSk7CisJCX0KKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBjaGFubmVsIHBvd2VyIHBhcmFtZXRlcnMgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBSZWFkQ2hhbm5lbFB3cigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCQlpLCBjaG9mZnNldDsKKwlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKKwlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjI7CisKKwkvLyBSZWFkIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMKKwkvLyBWYWx1ZSBmcm9tIDEgLSAweDdmLiBEZWZhdWx0IHZhbHVlIGlzIDI0LgorCS8vIFBvd2VyIHZhbHVlIDogMi40RyAweDAwICgwKSB+IDB4MUYgKDMxKQorCS8vICAgICAgICAgICAgIDogNS41RyAweEY5ICgtNykgfiAweDBGICgxNSkKKworCS8vIDAuIDExYi9nLCBjaDEgLSBjaCAxNAorCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCQlwQWQtPlR4UG93ZXJbaSAqIDJdLkNoYW5uZWwgPSBpICogMiArIDE7CisJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLkNoYW5uZWwgPSBpICogMiArIDI7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA+IDMxKSB8fCAoUG93ZXIuZmllbGQuQnl0ZTAgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA+IDMxKSB8fCAoUG93ZXIuZmllbGQuQnl0ZTEgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA+IDMxKSB8fCAoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxID4gMzEpIHx8IChQb3dlcjIuZmllbGQuQnl0ZTEgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisKKwkvLyAxLiBVLU5JSSBsb3dlci9taWRkbGUgYmFuZDogMzYsIDM4LCA0MDsgNDQsIDQ2LCA0ODsgNTIsIDU0LCA1NjsgNjAsIDYyLCA2NCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDEuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwl9CisKKwkvLyAxLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDIuIEhpcHBlckxBTiAyIDEwMCwgMTAyICwxMDQ7IDEwOCwgMTEwLCAxMTI7IDExNiwgMTE4LCAxMjA7IDEyNCwgMTI2LCAxMjg7IDEzMiwgMTM0LCAxMzY7IDE0MCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDIuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTI7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTQwOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJLy8gMi4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisKKwkvLyAzLiBVLU5JSSB1cHBlciBiYW5kOiAxNDksIDE1MSwgMTUzOyAxNTcsIDE1OSwgMTYxOyAxNjUgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikKKwkvLyAzLjEgRmlsbCB1cCBjaGFubmVsCisJY2hvZmZzZXQgPSAxNCArIDEyICsgMTY7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKwlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTY1OworCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJLy8gMy4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisKKwkvLyA0LiBQcmludCBhbmQgRGVidWcKKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDc7CisKKworI2lmIDAKKwkvLyBJbml0IHRoZSA4MDIuMTFqIGNoYW5uZWwgbnVtYmVyIGZvciBUWCBjaGFubmVsIHBvd2VyCisJLy8gMC4gMjBNSHoKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2ldLkNoYW5uZWwgPSA4ICsgaSAqIDQ7CisJCXBBZC0+VHhQb3dlcjExSltpXS5CVyA9IEJXXzIwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDNdLkNoYW5uZWwgPSAzNCArIGkgKiA0OworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDNdLkJXID0gQldfMjA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlcjExSltpICsgN10uQ2hhbm5lbCA9IDE4NCArIGkgKiA0OworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDddLkJXID0gQldfMjA7CisJfQorCisJLy8gMC4gMTBNSHoKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxMV0uQ2hhbm5lbCA9IDcgKyBpOworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDExXS5CVyA9IEJXXzEwOworCX0KKwlwQWQtPlR4UG93ZXIxMUpbMTNdLkNoYW5uZWwgPSAxMTsKKwlwQWQtPlR4UG93ZXIxMUpbMTNdLkJXID0gQldfMTA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxNF0uQ2hhbm5lbCA9IDE4MyArIGk7CisJCXBBZC0+VHhQb3dlcjExSltpICsgMTRdLkJXPSBCV18xMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxN10uQ2hhbm5lbCA9IDE4NyArIGk7CisJCXBBZC0+VHhQb3dlcjExSltpICsgMTddLkJXID0gQldfMTA7CisJfQorCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCXsKKwkJUG93ZXIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9KYXBhbl9UWF9QV1JfT0ZGU0VUICsgaSAqIDIpOworCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9KYXBhbl9UWDJfUFdSX09GRlNFVCArIGkgKiAyKTsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMzYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+IC02KSkKKwkJCXBBZC0+VHhQb3dlcjExSltpICogMl0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMzYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+IC02KSkKKwkJCXBBZC0+VHhQb3dlcjExSltpICogMiArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAzNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+IC02KSkKKwkJCXBBZC0+VHhQb3dlcjExSltpICogMl0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMzYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPiAtNikpCisJCQlwQWQtPlR4UG93ZXIxMUpbaSAqIDIgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorI2VuZGlmCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgcmVnaXN0cnkKKwkJMS4gQWxsIHRoZSBwYXJhbWV0ZXJzCisJCTIuIE5ldHdvcmtBZGRyZXMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CUZvciB1c2UgYnkgTmRpc09wZW5Db25maWd1cmF0aW9uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19SRVNPVVJDRVMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDUmVhZFJlZ1BhcmFtZXRlcnMoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU5ESVNfSEFORExFCQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKQoreworCU5ESVNfU1RBVFVTCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gTklDUmVhZFJlZ1BhcmFtZXRlcnMsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBwYXJhbWV0ZXJzIGZyb20gRUVQUk9NCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQltYWNfYWRkcikKK3sKKwlVSU5UMzIJCQlkYXRhID0gMDsKKwlVU0hPUlQJCQlpLCB2YWx1ZSwgdmFsdWUyOworCVVDSEFSCQkJVG1wUGh5OworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOworCUVFUFJPTV9WRVJTSU9OX1NUUlVDICAgIFZlcnNpb247CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOworCisJLy8gSW5pdCBFRVBST00gQWRkcmVzcyBOdW1iZXIsIGJlZm9yZSBhY2Nlc3MgRUVQUk9NOyBpZiA5M2M0NiwgRUVQUk9NQWRkcmVzc051bT02LCBlbHNlIGlmIDkzYzY2LCBFRVBST01BZGRyZXNzTnVtPTgKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZkYXRhKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRTJQUk9NX0NTUiA9IDB4JXhcbiIsIGRhdGEpKTsKKworCWlmKChkYXRhICYgMHgzMCkgPT0gMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJCS8vIDkzQzQ2CisJZWxzZSBpZigoZGF0YSAmIDB4MzApID09IDB4MTApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M2NgorCWVsc2UKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsgICAgIC8vIDkzQzg2CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVFUFJPTUFkZHJlc3NOdW0gPSAlZFxuIiwgcEFkLT5FRVBST01BZGRyZXNzTnVtICkpOworCisJLy8gUlQyODYwIE1BQyBubyBsb25nZXIgYXV0byBsb2FkIE1BQyBhZGRyZXNzIGZyb20gRTJQUk9NLiBEcml2ZXIgaGFzIHRvIGludGlhbGl6ZQorCS8vIE1BQyBhZGRyZXNzIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gRTJQUk9NIHNldHRpbmcKKwlpZiAobWFjX2FkZHIgPT0gTlVMTCB8fAorCQlzdHJsZW4obWFjX2FkZHIpICE9IDE3IHx8CisJCW1hY19hZGRyWzJdICE9ICc6JyAgfHwgbWFjX2FkZHJbNV0gIT0gJzonICB8fCBtYWNfYWRkcls4XSAhPSAnOicgfHwKKwkJbWFjX2FkZHJbMTFdICE9ICc6JyB8fCBtYWNfYWRkclsxNF0gIT0gJzonKQorCXsKKwkJVVNIT1JUICBBZGRyMDEsQWRkcjIzLEFkZHI0NSA7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA0LCBBZGRyMDEpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDYsIEFkZHIyMyk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgQWRkcjQ1KTsKKworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAoVUNIQVIpKEFkZHIwMSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAoVUNIQVIpKEFkZHIwMSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKFVDSEFSKShBZGRyMjMgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKFVDSEFSKShBZGRyMjMgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9IChVQ0hBUikoQWRkcjQ1ICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IChVQ0hBUikoQWRkcjQ1ID4+IDgpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBFMlBST00gXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCUlOVAkJajsKKwkJUFVDSEFSCW1hY3B0cjsKKworCQltYWNwdHIgPSBtYWNfYWRkcjsKKworCQlmb3IgKGo9MDsgajxNQUNfQUREUl9MRU47IGorKykKKwkJeworCQkJQXRvSChtYWNwdHIsICZwQWQtPlBlcm1hbmVudEFkZHJlc3Nbal0sIDEpOworCQkJbWFjcHRyPW1hY3B0ciszOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIgXG4iKSk7CisJfQorCisKKwl7CisJCS8vbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxCisJCWlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPT0gMHhmZikKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCisJCS8vaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9PSAweGZmKQorCQkvLwlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0pKTsKKwkJaWYgKHBBZC0+YkxvY2FsQWRtaW5NQUMgPT0gRkFMU0UpCisJCXsKKwkJCU1BQ19EVzBfU1RSVUMgY3NyMjsKKwkJCU1BQ19EVzFfU1RSVUMgY3NyMzsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKKwkJCWNzcjIuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOworCQkJY3NyMi5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07CisJCQljc3IyLmZpZWxkLkJ5dGUyID0gcEFkLT5DdXJyZW50QWRkcmVzc1syXTsKKwkJCWNzcjIuZmllbGQuQnl0ZTMgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcwLCBjc3IyLndvcmQpOworCQkJY3NyMy53b3JkID0gMDsKKwkJCWNzcjMuZmllbGQuQnl0ZTQgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdOworCQkJY3NyMy5maWVsZC5CeXRlNSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNV07CisJCQljc3IzLmZpZWxkLlUyTWVNYXNrID0gMHhmZjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMSwgY3NyMy53b3JkKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQl9CisJfQorCisJLy8gaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uCisJLy8gSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwlSVE1QUmVhZENoYW5uZWxQd3IocEFkKTsKKworCS8vIGlmIEUyUFJPTSB2ZXJzaW9uIG1pc21hdGNoIHdpdGggZHJpdmVyJ3MgZXhwZWN0YXRpb24sIHRoZW4gc2tpcAorCS8vIGFsbCBzdWJzZXF1ZW50IEUyUlBPTSByZXRpZXZhbCBhbmQgc2V0IGEgc3lzdGVtIGVycm9yIGJpdCB0byBub3RpZnkgR1VJCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVkVSU0lPTl9PRkZTRVQsIFZlcnNpb24ud29yZCk7CisJcEFkLT5FZXByb21WZXJzaW9uID0gVmVyc2lvbi5maWVsZC5WZXJzaW9uICsgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyICogMjU2OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkUyUFJPTTogVmVyc2lvbiA9ICVkLCBGQUUgcmVsZWFzZSAjJWRcbiIsIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7CisKKwlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pCisJeworCQlEQkdQUklOVF9FUlIoKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKKwkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7CisKKwkJLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZAorCQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CisJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0NIQU5ORUxTOyBpKyspCisJCQlwQWQtPlR4UG93ZXJbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKKwkJCXBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJZm9yKGkgPSAwOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwkJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOworCQlyZXR1cm47ICAqLworCX0KKworCS8vIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMl9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDM4LCB2YWx1ZSk7CS8vIENvdW50cnkgUmVnaW9uCisJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPSB2YWx1ZTsKKworCWZvcihpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkqMiwgdmFsdWUpOworCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpKzNdID0gdmFsdWU7CisJfQorCisJLy8gV2UgaGF2ZSB0byBwYXJzZSBOSUMgY29uZmlndXJhdGlvbiAwIGF0IGhlcmUuCisJLy8gSWYgVFNTSSBkaWQgbm90IGhhdmUgcHJlbG9hZGVkIHZhbHVlLCBpdCBzaG91bGQgcmVzZXQgdGhlIFR4QXV0b0FnYyB0byBmYWxzZQorCS8vIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byByZWFkIFR4QXV0b0FnYyBjb250cm9sIGJlZm9yZWhhbmQuCisJLy8gUmVhZCBUeCBBR0MgY29udHJvbCBiaXQKKwlBbnRlbm5hLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXTsKKwlpZiAoQW50ZW5uYS53b3JkID09IDB4RkZGRikKKwl7CisJCUFudGVubmEud29yZCA9IDA7CisJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzI4MjA7CisJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKKwkJQW50ZW5uYS5maWVsZC5SeFBhdGggPSAyOworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkUyUFJPTSBlcnJvciwgaGFyZCBjb2RlIGFzIDB4JTA0eFxuIiwgQW50ZW5uYS53b3JkKSk7CisJfQorCisJLy8gQ2hvb3NlIHRoZSBkZXNpcmVkIFR4JlJ4IHN0cmVhbS4KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA+IEFudGVubmEuZmllbGQuVHhQYXRoKSkKKwkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlR4UGF0aDsKKworCWlmICgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5SeFBhdGgpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pICYmCisJCQkocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiAyKSkKKwkJeworCQkJLy8gb25seSAyIFJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKKwkJfQorCX0KKworCS8vIDMqMworCS8vIHJlYWQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHNldCB0aGVtIHRvIENTUjE3NCB+IDE3NyBpbiBjaGFpbjAgfiBjaGFpbjIKKwkvLyB5ZXQgaW1wbGVtZW50CisJZm9yKGk9MDsgaTwzOyBpKyspCisJeworCX0KKworCU5pY0NvbmZpZzIud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdOworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOaWNDb25maWcyLndvcmQgPSAwOworCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikKKwkJeworCQkJTmljQ29uZmlnMi53b3JkICY9IDB4ZmYwMDsKKwkJfQorCisJCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpCisJCXsKKwkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKKwllbHNlCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiTklDUmVhZEVFUFJPTVBhcmFtZXRlcnM6IFJ4UGF0aCA9ICVkLCBUeFBhdGggPSAlZFxuIiwgQW50ZW5uYS5maWVsZC5SeFBhdGgsIEFudGVubmEuZmllbGQuVHhQYXRoKSk7CisKKwkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCisJcEFkLT5BbnRlbm5hLndvcmQgPSBBbnRlbm5hLndvcmQ7CisKKwkvLworCS8vIFJlc2V0IFBoeU1vZGUgaWYgd2UgZG9uJ3Qgc3VwcG9ydCA4MDIuMTFhCisJLy8gT25seSBSRklDXzI4NTAgJiBSRklDXzI3NTAgc3VwcG9ydCA4MDIuMTFhCisJLy8KKwlpZiAoKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yODUwKSAmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI3NTApKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkgfHwKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQl8fAorCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHTl9NSVhFRDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBSZWFkIFRTU0kgcmVmZXJlbmNlIGFuZCBUU1NJIGJvdW5kYXJ5IGZvciB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24uIFRoaXMgaXMgdWdseQorCS8vIDAuIDExYi9nCisJeworCQkvKiB0aGVzZSBhcmUgdGVtcGF0dXJlIHJlZmVyZW5jZSB2YWx1ZSAoMHgwMCB+IDB4RkUpCisJCSAgIGV4OiAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkgICBUc3NpUGx1c0JvdW5kYXJ5RyBbNF0gWzNdIFsyXSBbMV0gWzBdIChzbWFsbGVyKSArCisJCSAgIFRzc2lNaW51c0JvdW5kYXJ5R1swXSBbMV0gWzJdIFszXSBbNF0gKGxhcmdlcikgKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDZFLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcwLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcyLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUmVmRyAgID0gUG93ZXIuZmllbGQuQnl0ZTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBbMF0gKi8KKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzQsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDc2LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlR4QWdjU3RlcEcgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJcEFkLT5UeEFnY0NvbXBlbnNhdGVHID0gMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdICA9IHBBZC0+VHNzaVJlZkc7CisKKwkJLy8gRGlzYWJsZSBUeEFnYyBpZiB0aGUgYmFzZWQgdmFsdWUgaXMgbm90IHJpZ2h0CisJCWlmIChwQWQtPlRzc2lSZWZHID09IDB4ZmYpCisJCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFMlBST006IEcgVHNzaVstNCAuLiArNF0gPSAlZCAlZCAlZCAlZCAtICVkIC0lZCAlZCAlZCAlZCwgc3RlcD0lZCwgdHVuaW5nPSVkXG4iLAorCQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0sCisJCQlwQWQtPlRzc2lSZWZHLAorCQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSwKKwkJCXBBZC0+VHhBZ2NTdGVwRywgcEFkLT5iQXV0b1R4QWdjRykpOworCX0KKwkvLyAxLiAxMWEKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENiwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEOCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVJlZkEgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQSwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVszXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4REMsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHhBZ2NTdGVwQSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUEgPSAwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXSA9IHBBZC0+VHNzaVJlZkE7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF0gID0gcEFkLT5Uc3NpUmVmQTsKKworCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJaWYgKHBBZC0+VHNzaVJlZkEgPT0gMHhmZikKKwkJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogQSBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSwKKwkJCXBBZC0+VHNzaVJlZkEsCisJCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdLAorCQkJcEFkLT5UeEFnY1N0ZXBBLCBwQWQtPmJBdXRvVHhBZ2NBKSk7CisJfQorCXBBZC0+QmJwUnNzaVRvRGJtRGVsdGEgPSAweDA7CisKKwkvLyBSZWFkIGZyZXF1ZW5jeSBvZmZzZXQgc2V0dGluZyBmb3IgUkYKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9GUkVRX09GRlNFVCwgdmFsdWUpOworCWlmICgodmFsdWUgJiAweDAwRkYpICE9IDB4MDBGRikKKwkJcEFkLT5SZkZyZXFPZmZzZXQgPSAoVUxPTkcpICh2YWx1ZSAmIDB4MDBGRik7CisJZWxzZQorCQlwQWQtPlJmRnJlcU9mZnNldCA9IDA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKKworCS8vQ291bnRyeVJlZ2lvbiBieXRlIG9mZnNldCAoMzhoKQorCXZhbHVlID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPj4gODsJCS8vIDIuNEcgYmFuZAorCXZhbHVlMiA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdICYgMHgwMEZGOwkvLyA1RyBiYW5kCisKKwlpZiAoKHZhbHVlIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpICYmICh2YWx1ZTIgPD0gUkVHSU9OX01BWElNVU1fQV9CQU5EKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoKFVDSEFSKSB2YWx1ZSkgfCAweDgwOworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoKFVDSEFSKSB2YWx1ZTIpIHwgMHg4MDsKKwkJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLworCS8vIEdldCBSU1NJIE9mZnNldCBvbiBFRVBST00gMHg5QWggJiAweDlDaC4KKwkvLyBUaGUgdmFsaWQgdmFsdWUgYXJlICgtMTAgfiAxMCkKKwkvLworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CR1Jzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5CR1Jzc2lPZmZzZXQxID0gKHZhbHVlID4+IDgpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUKzIsIHZhbHVlKTsKKwlwQWQtPkJHUnNzaU9mZnNldDIgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkFMTkFHYWluMSA9ICh2YWx1ZSA+PiA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CTE5BR2FpbiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4wID0gKHZhbHVlID4+IDgpOworCisJLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8wIG9mZnNldC4KKwlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5CR1Jzc2lPZmZzZXQwID0gMDsKKworCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkJHUnNzaU9mZnNldDEgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDEgPiAxMCkpCisJCXBBZC0+QkdSc3NpT2Zmc2V0MSA9IDA7CisKKwkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQyID4gMTApKQorCQlwQWQtPkJHUnNzaU9mZnNldDIgPSAwOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgdmFsdWUpOworCXBBZC0+QVJzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQrMiksIHZhbHVlKTsKKwlwQWQtPkFSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4yID0gKHZhbHVlID4+IDgpOworCisJaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjEgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4xID09IDB4MDApKQorCQlwQWQtPkFMTkFHYWluMSA9IHBBZC0+QUxOQUdhaW4wOworCWlmICgoKFVDSEFSKXBBZC0+QUxOQUdhaW4yID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMiA9PSAweDAwKSkKKwkJcEFkLT5BTE5BR2FpbjIgPSBwQWQtPkFMTkFHYWluMDsKKworCS8vIFZhbGlkYXRlIDExYSBSU1NJXzAgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDAgPSAwOworCisJLy8gVmFsaWRhdGUgMTFhIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQxID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MSA9IDA7CisKKwkvL1ZhbGlkYXRlIDExYSBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MiA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDIgPSAwOworCisJLy8KKwkvLyBHZXQgTEVEIFNldHRpbmcuCisJLy8KKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4M2EsIHZhbHVlKTsKKwlwQWQtPkxlZENudGwud29yZCA9ICh2YWx1ZSYweGZmMDApID4+IDg7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkxlZDEgPSB2YWx1ZTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQyX09GRlNFVCwgdmFsdWUpOworCXBBZC0+TGVkMiA9IHZhbHVlOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDNfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5MZWQzID0gdmFsdWU7CisKKwlSVE1QUmVhZFR4UHdyUGVyUmF0ZShwQWQpOworCisjaWZkZWYgU0lOR0xFX1NLVQorCS8vcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUik7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUiwgcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IpOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVSU5UMzIJCQkJCWRhdGEgPSAwOworCVVDSEFSCUJCUFIxID0gMDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVU0hPUlQJCQkJCWk7CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKwlVQ0hBUglCQlBSMyA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7CisJZm9yKGkgPSAzOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwl7CisJCVVDSEFSIEJicFJlZ0lkeCwgQmJwVmFsdWU7CisKKwkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKKwkJeworCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKKwkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKKwkJfQorCX0KKworCUFudGVubmEud29yZCA9IHBBZC0+QW50ZW5uYS53b3JkOworCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKwlwQWQtPlJmSWNUeXBlID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJmSWNUeXBlOworCisJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CisKKworCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwlwQWQtPk5pY0NvbmZpZzIud29yZCA9IE5pY0NvbmZpZzIud29yZDsKKworCS8vCisJLy8gU2VuZCBMRUQgU2V0dGluZyB0byBNQ1UuCisJLy8KKwlpZiAocEFkLT5MZWRDbnRsLndvcmQgPT0gMHhGRikKKwl7CisJCXBBZC0+TGVkQ250bC53b3JkID0gMHgwMTsKKwkJcEFkLT5MZWQxID0gMHg1NTU1OworCQlwQWQtPkxlZDIgPSAweDIyMjE7CisKKyNpZmRlZiBSVDI4NjAKKwkJcEFkLT5MZWQzID0gMHhBOUY4OworI2VuZGlmIC8vIFJUMjg2MCAvLworCX0KKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MiwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMSwgKFVDSEFSKShwQWQtPkxlZDEgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MywgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMiwgKFVDSEFSKShwQWQtPkxlZDIgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1NCwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMywgKFVDSEFSKShwQWQtPkxlZDMgPj4gOCkpOworICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RkY7CisgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGJlZm9yZSBsaW5rIHVwCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gUmVhZCBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIHN0YXRlIGVuYWJsZSBiaXQKKwkJaWYgKE5pY0NvbmZpZzIuZmllbGQuSGFyZHdhcmVSYWRpb0NvbnRyb2wgPT0gMSkKKwkJeworCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBUUlVFOworCisJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCWlmICgoZGF0YSAmIDB4MDQpID09IDApCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBGQUxTRTsKKwkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7CisjaWZkZWYgUlQyODYwCisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDApOworCQkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCisJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKQorCXsKKwl9CisKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKKwllbHNlCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisJLy8KKwkvLyBTaW5jZSBCQlAgaGFzIGJlZW4gcHJvZ2FtZWQsIHRvIG1ha2Ugc3VyZSBCQlAgc2V0dGluZyB3aWxsIGJlCisJLy8gdXBhdGUgaW5zaWRlIG9mIEFzaWNBbnRlbm5hU2VsZWN0LCBzbyByZXNldCB0byBVTktOT1dOX0JBTkQhIQorCS8vCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCUJCUFIzICY9ICh+MHgxOCk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJQkJQUjMgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCUJCUFIzIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCUJCUFIzIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gSGFuZGxlIHRoZSBkaWZmZXJlbmNlIHdoZW4gMVQKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQkJQUjEpOworCQlpZihwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJQkJQUjEgJj0gKH4weDE4KTsKKwkJfQorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCQlBSMSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVXNlIEh3IFJhZGlvIENvbnRyb2wgUGluPSVkOyBpZiB1c2VkIFBpbj0lZDtcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvLCBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbykpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFBhdGggPSAlZCwgUnhQYXRoID0gJWQsIFJGSUM9JWQsIFBvbGFyK0xFRCBtb2RlPSV4XG4iLCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoLCBwQWQtPlJmSWNUeXBlLCBwQWQtPkxlZENudGwud29yZCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXRpYWxpemUgTklDIGhhcmR3YXJlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpCit7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisjaWZkZWYgUlQyODYwCisJVUlOVDMyCQkJVmFsdWU7CisJREVMQVlfSU5UX0NGR19TVFJVQwlJbnRDZmc7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUxPTkcJaSA9MCwgaj0wOworCUFDX1RYT1BfQ1NSMF9TVFJVQwljc3IwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBZGFwdGVyXG4iKSk7CisKKwkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgorcmV0cnk6CisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpPDEwMCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJLy8gUmVjb3JkIEhXIEJlYWNvbiBvZmZzZXQKKwlwQWQtPkJlYWNvbk9mZnNldFswXSA9IEhXX0JFQUNPTl9CQVNFMDsKKwlwQWQtPkJlYWNvbk9mZnNldFsxXSA9IEhXX0JFQUNPTl9CQVNFMTsKKwlwQWQtPkJlYWNvbk9mZnNldFsyXSA9IEhXX0JFQUNPTl9CQVNFMjsKKwlwQWQtPkJlYWNvbk9mZnNldFszXSA9IEhXX0JFQUNPTl9CQVNFMzsKKwlwQWQtPkJlYWNvbk9mZnNldFs0XSA9IEhXX0JFQUNPTl9CQVNFNDsKKwlwQWQtPkJlYWNvbk9mZnNldFs1XSA9IEhXX0JFQUNPTl9CQVNFNTsKKwlwQWQtPkJlYWNvbk9mZnNldFs2XSA9IEhXX0JFQUNPTl9CQVNFNjsKKwlwQWQtPkJlYWNvbk9mZnNldFs3XSA9IEhXX0JFQUNPTl9CQVNFNzsKKworCS8vCisJLy8gd3JpdGUgYWxsIHNoYXJlZCBSaW5nJ3MgYmFzZSBhZGRyZXNzIGludG8gQVNJQworCS8vCisKKwkvLyBhc2ljIHNpbXVsYXRpb24gc2VxdWVuY2UgcHV0IHRoaXMgYWhlYWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUuCisJLy8gcGJmIGhhcmR3YXJlIHJlc2V0CisjaWZkZWYgUlQyODYwCisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfUlNUX0lEWCwgMHgxMDAzZik7CS8vIDB4MTAwMDAgZm9yIHJlc2V0IHJ4LCAweDNmIHJlc2V0cyBhbGwgNiB0eCByaW5ncy4KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTFmKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTAwKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCS8vIEluaXRpYWx6ZSBBU0lDIGZvciBUWCAmIFJ4IG9wZXJhdGlvbgorCWlmIChOSUNJbml0aWFsaXplQXNpYyhwQWQgLCBiSGFyZFJlc2V0KSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJaWYgKGorKyA9PSAwKQorCQl7CisJCQlOSUNMb2FkRmlybXdhcmUocEFkKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKyNpZmRlZiBSVDI4NjAKKwkvLyBXcml0ZSBBQ19CSyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjEsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIxIDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIEFDX0JFIGJhc2UgYWRkcmVzcyByZWdpc3RlcgorCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsWzBdLkFsbG9jUGEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMCwgVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjAgOiAweCV4XG4iLCBWYWx1ZSkpOworCisJLy8gV3JpdGUgQUNfVkkgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCisJVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVkldLkNlbGxbMF0uQWxsb2NQYSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIyLCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMiA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBXcml0ZSBBQ19WTyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjMsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIzIDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIEhDQ0EgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCisJICBWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9IQ0NBXS5DZWxsWzBdLkFsbG9jUGEpOworCSAgUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI0LCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNCA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBXcml0ZSBNR01UX0JBU0VfQ1NSIHJlZ2lzdGVyCisJVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPk1nbXRSaW5nLkNlbGxbMF0uQWxsb2NQYSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI1LCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNSA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBXcml0ZSBSWF9CQVNFX0NTUiByZWdpc3RlcgorCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5SeFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9CQVNFX1BUUiwgVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSWF9CQVNFX1BUUiA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgorCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gMDsKKwlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRS0xOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgorCXsKKwkJZm9yIChpPTA7IGk8TlVNX09GX1RYX1JJTkc7IGkrKykKKwkJeworCQkJcEFkLT5UeFJpbmdbaV0uVHhTd0ZyZWVJZHggPSAwOworCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHggPSAwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlR4Q3B1SWR4KTsKKwkJfQorCX0KKworCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKKwlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOworCisJLy8KKwkvLyBzZXQgZWFjaCBSaW5nJ3MgU0laRSAgaW50byBBU0lDLiBEZXNjcmlwdG9yIFNpemUgaXMgZml4ZWQgYnkgZGVzaWduLgorCS8vCisKKwkvLyBXcml0ZSBUWF9SSU5HX0NTUjAgcmVnaXN0ZXIKKwlWYWx1ZSA9IFRYX1JJTkdfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMCwgVmFsdWUpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQxLCBWYWx1ZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDIsIFZhbHVlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMywgVmFsdWUpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQ0LCBWYWx1ZSk7CisJVmFsdWUgPSBNR01UX1JJTkdfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UTUFYX0NOVCwgVmFsdWUpOworCisJLy8gV3JpdGUgUlhfUklOR19DU1IgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJYX1JJTkdfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9NQVhfQ05ULCBWYWx1ZSk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCS8vIFdNTSBwYXJhbWV0ZXIKKwljc3IwLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwl7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcworCX0KKwllbHNlCisJeworCQljc3IwLmZpZWxkLkFjMFR4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCX0KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IwLndvcmQpOworCisKKyNpZmRlZiBSVDI4NjAKKwkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaSA8IDEwMCk7CisKKwlHbG9DZmcud29yZCAmPSAweGZmMDsKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCUludENmZy53b3JkID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBERUxBWV9JTlRfQ0ZHLCBJbnRDZmcud29yZCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCS8vIHJlc2V0IGFjdGlvbgorCS8vIExvYWQgZmlybXdhcmUKKwkvLyAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCit7CisJVUxPTkcJCQlJbmRleCA9IDA7CisJVUNIQVIJCQlSMCA9IDB4ZmY7CisJVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKKwlVU0hPUlQJCQlLZXlJZHg7CisJSU5UCQkJCWksYXBpZHg7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKKworI2lmZGVmIFJUMjg2MAorCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Myk7CisJfQorCWVsc2UKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOworCS8vIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fU1RBX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8KKwkvLyBCZWZvcmUgcHJvZ3JhbSBCQlAsIHdlIG5lZWQgdG8gd2FpdCBCQlAvUkYgZ2V0IHdha2UgdXAuCisJLy8KKwlJbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NUQVRVU19DRkcsICZNYWNDc3IxMik7CisKKwkJaWYgKChNYWNDc3IxMiAmIDB4MDMpID09IDApCS8vIGlmIEJCLlJGIGlzIHN0YWJsZQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2sgTUFDX1NUQVRVU19DRkcgID0gQnVzeSA9ICV4XG4iLCBNYWNDc3IxMikpOworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOworCisgICAgLy8gVGhlIGNvbW1hbmRzIHRvIGZpcm13YXJlIHNob3VsZCBiZSBhZnRlciB0aGVzZSBjb21tYW5kcywgdGhlc2UgY29tbWFuZHMgd2lsbCBpbml0IGZpcm13YXJlCisJLy8gUENJIGFuZCBVU0IgYXJlIG5vdCB0aGUgc2FtZSBiZWNhdXNlIFBDSSBkcml2ZXIgbmVlZHMgdG8gd2FpdCBmb3IgUENJIGJ1cyByZWFkeQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9CQlBfQUdFTlQsIDApOwkvLyBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsKKwlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJLy8gUmVhZCBCQlAgcmVnaXN0ZXIsIG1ha2Ugc3VyZSBCQlAgaXMgdXAgYW5kIHJ1bm5pbmcgYmVmb3JlIHdyaXRlIG5ldyBkYXRhCisJSW5kZXggPSAwOworCWRvCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjAsICZSMCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJCUCB2ZXJzaW9uID0gJXhcbiIsIFIwKSk7CisJfSB3aGlsZSAoKCsrSW5kZXggPCAyMCkgJiYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpKTsKKwkvL0FTU0VSVChJbmRleCA8IDIwKTsgLy90aGlzIHdpbGwgY2F1c2UgQlNPRCBvbiBDaGVjay1idWlsZCBkcml2ZXIKKworCWlmICgoUjAgPT0gMHhmZikgfHwgKFIwID09IDB4MDApKQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKworCS8vIEluaXRpYWxpemUgQkJQIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fQkJQX1JFR19QQVJNUzsgSW5kZXgrKykKKwl7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIEJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJfQorCisJLy8gZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IEJCUF9SODQgd2l0aCAweDE5LiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCisJaWYgKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmKSAhPSAweDAxMDEpCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDE5KTsKKworCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMik7CisgICAgfQorCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKSAvLyAzKjMKKwl7CisJCS8vIGVubGFyZ2UgTUFYX0xFTl9DRkcKKwkJVUlOVDMyIGNzcjsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQVhfTEVOX0NGRywgJmNzcik7CisJCWNzciAmPSAweEZGRjsKKwkJY3NyIHw9IDB4MjAwMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIGNzcik7CisJfQorCisKKwkvLyBBZGQgcmFkaW8gb2ZmIGNvbnRyb2wKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJeworLy8JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMHgwMDAwMTgxOCk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IFJhZGlvIE9mZlxuIikpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7CisKKwkvLyBBU0lDIHdpbGwga2VlcCBnYXJiYWdlIHZhbHVlIGFmdGVyIGJvb3QKKwkvLyBDbGVhciBhbGwgc2VhcmVkIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKKwkvLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGlnbm9yZWQgaW4gcmFkaW8tT04vT0ZGIG9wZXJhdGlvbi4KKwlpZiAoYkhhcmRSZXNldCkKKwl7CisJCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgNDsgS2V5SWR4KyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCpLZXlJZHgsIDApOworCQl9CisKKwkJLy8gQ2xlYXIgYWxsIHBhaXJ3aXNlIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKKwkJZm9yIChLZXlJZHggPSAwOyBLZXlJZHggPCAyNTY7IEtleUlkeCsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChLZXlJZHggKiBIV19XQ0lEX0FUVFJJX1NJWkUpLCAxKTsKKwkJfQorCX0KKworCisJLy8gSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGNsZWFyIHRoaXMgc3BhY2Ugd2hlbiBub3QgaGFyZCByZXNldC4KKwlpZiAoYkhhcmRSZXNldCA9PSBUUlVFKQorCXsKKwkJLy8gY2xlYXIgYWxsIG9uLWNoaXAgQkVBQ09OIGZyYW1lIHNwYWNlCisJCWZvciAoYXBpZHggPSAwOyBhcGlkeCA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGFwaWR4KyspCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBIV19CRUFDT05fT0ZGU0VUPj4yOyBpKz00KQorCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2FwaWR4XSArIGksIDB4MDApOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBUWE9QX0NUUkxfQ0ZHIHdpdGggMHg1ODNmLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCisJCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQorCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHg1ODNmKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSXNzdWVSZXNldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UMzIJVmFsdWUgPSAwOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJc3N1ZVJlc2V0XG4iKSk7CisKKwkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCS8vIElzc3VlIHJlc2V0IGFuZCBjbGVhciBmcm9tIHJlc2V0IHN0YXRlCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAzKTsgLy8gMjAwNC0wOS0xNyBjaGFuZ2UgZnJvbSAweDAxCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJc3N1ZVJlc2V0XG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayBBU0lDIHJlZ2lzdGVycyBhbmQgZmluZCBhbnkgcmVhc29uIHRoZSBzeXN0ZW0gbWlnaHQgaGFuZworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JTklDQ2hlY2tGb3JIYW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCitWT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlUWF9TVEFfRklGT19TVFJVQwlTdGFGaWZvOworCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeTsKKwlVQ0hBUgkJCQlpID0gMDsKKwlVQ0hBUgkJCXBpZCA9IDAsIHdjaWQgPSAwOworCUNIQVIJCQkJcmVUcnk7CisJVUNIQVIJCQkJc3VjY01DUzsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvKiBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlICovCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCWRvCisJCXsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0ZJRk8sICZTdGFGaWZvLndvcmQpOworCisJCQlpZiAoU3RhRmlmby5maWVsZC5iVmFsaWQgPT0gMCkKKwkJCQlicmVhazsKKworCQkJd2NpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLndjaWQ7CisKKworCQkvKiBpZ25vcmUgTm9BQ0sgYW5kIE1HTVQgZnJhbWUgdXNlIDB4RkYgYXMgV0NJRCAqLworCQkJaWYgKChTdGFGaWZvLmZpZWxkLlR4QWNrUmVxdWlyZWQgPT0gMCkgfHwgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorCQkJeworCQkJCWkrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogUElEIHN0b3JlIFR4IE1DUyBSYXRlICovCisJCQlwaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC5QaWRUeXBlOworCisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCQkJcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCsrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoU3RhRmlmby5maWVsZC5UeEJGKSAvLyAzKjMKKwkJCQlwRW50cnktPlR4QkZDb3VudCsrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQkJVUFQU0RfU1BfQVVFX0hhbmRsZShwQWQsIHBFbnRyeSwgU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKworCQkJaWYgKCFTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKKwkJCXsKKwkJCQlwRW50cnktPkZJRk9Db3VudCsrOworCQkJCXBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQrKzsKKworCQkJCWlmIChwRW50cnktPkZJRk9Db3VudCA+PSAxKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIyIpKTsKKyNpZiAwCisJCQkJCVNlbmRSZWZyZXNoQkFSKHBBZCwgcEVudHJ5KTsKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OworI2Vsc2UKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCWlmKHBFbnRyeS0+UHNNb2RlID09IFBXUl9BQ1RJVkUpCisJCQkJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCWludCB0aWQ7CisJCQkJCQlmb3IgKHRpZD0wOyB0aWQ8TlVNX09GX1RJRDsgdGlkKyspCisJCQkJCQl7CisJCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgIHRpZCwgRkFMU0UsIEZBTFNFKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQkJLy8gVXBkYXRlIHRoZSBjb250aW51b3VzIHRyYW5zbWlzc2lvbiBjb3VudGVyIGV4Y2VwdCBQUyBtb2RlCisJCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250Kys7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvLyBDbGVhciB0aGUgRklGT0NvdW50IHdoZW4gc3RhIGluIFBvd2VyIFNhdmUgbW9kZS4gQmFzaWNhbGx5IHdlIGFzc3VtZQorCQkJCQkJLy8gICAgIHRoaXMgdHggZXJyb3IgaGFwcGVuZWQgZHVlIHRvIHN0YSBqdXN0IGdvIHRvIHNsZWVwLgorCQkJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CisJCQkJCX0KKyNlbmRpZgorCQkJCQkvL3BFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQl9CisJCQkJLy9wRW50cnktPmJTZW5kQkFSID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlpZiAoKHBFbnRyeS0+UHNNb2RlICE9IFBXUl9TQVZFKSAmJiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA+IDApKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bi0tOworCQkJCQlpZiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bj09MCkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQFxuIikpOworCQkJCQl9CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQlwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQrKzsKKwkJCQkvLyB1cGRhdGUgTm9EYXRhSWRsZUNvdW50IHdoZW4gc3VjZXNzZnVsIHNlbmQgcGFja2V0IHRvIFNUQS4KKwkJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CisJCQl9CisKKwkJCXN1Y2NNQ1MgPSBTdGFGaWZvLmZpZWxkLlN1Y2Nlc3NSYXRlICYgMHg3RjsKKworCQkJcmVUcnkgPSBwaWQgLSBzdWNjTUNTOworCisJCQlpZiAoU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCisJCQl7CisJCQkJcEVudHJ5LT5UWE1DU0V4cGVjdGVkW3BpZF0rKzsKKwkJCQlpZiAocGlkID09IHN1Y2NNQ1MpCisJCQkJeworCQkJCQlwRW50cnktPlRYTUNTU3VjY2Vzc2Z1bFtwaWRdKys7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+VFhNQ1NBdXRvRmFsbEJhY2tbcGlkXVtzdWNjTUNTXSsrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwRW50cnktPlRYTUNTRmFpbGVkW3BpZF0rKzsKKwkJCX0KKworCQkJaWYgKHJlVHJ5ID4gMCkKKwkJCXsKKwkJCQlpZiAoKHBpZCA+PSAxMikgJiYgc3VjY01DUyA8PTcpCisJCQkJeworCQkJCQlyZVRyeSAtPSA0OworCQkJCX0KKwkJCQlwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IHJlVHJ5OworCQkJfQorCisJCQlpKys7CisJCQkvLyBBU0lDIHN0b3JlIDE2IHN0YWNrCisJCX0gd2hpbGUgKCBpIDwgKDIqVFhfUklOR19TSVpFKSApOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIHN0YXRpc3RpY2FsIGNvdW50ZXJzIGZyb20gaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCByZWNvcmQgdGhlbQorCQlpbiBzb2Z0d2FyZSB2YXJpYWJsZXMgZm9yIGxhdGVyIG9uIHF1ZXJ5CisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUlOVDMyCU9sZFZhbHVlOworCVJYX1NUQV9DTlQwX1NUUlVDCSBSeFN0YUNudDA7CisJUlhfU1RBX0NOVDFfU1RSVUMgICBSeFN0YUNudDE7CisJUlhfU1RBX0NOVDJfU1RSVUMgICBSeFN0YUNudDI7CisJVFhfU1RBX0NOVDBfU1RSVUMgCSBUeFN0YUNudDA7CisJVFhfU1RBX0NOVDFfU1RSVUMJIFN0YVR4MTsKKwlUWF9TVEFfQ05UMl9TVFJVQwkgU3RhVHgyOworCVRYX0FHR19DTlRfU1RSVUMJVHhBZ2dDbnQ7CisJVFhfQUdHX0NOVDBfU1RSVUMJVHhBZ2dDbnQwOworCVRYX0FHR19DTlQxX1NUUlVDCVR4QWdnQ250MTsKKwlUWF9BR0dfQ05UMl9TVFJVQwlUeEFnZ0NudDI7CisJVFhfQUdHX0NOVDNfU1RSVUMJVHhBZ2dDbnQzOworCVRYX0FHR19DTlQ0X1NUUlVDCVR4QWdnQ250NDsKKwlUWF9BR0dfQ05UNV9TVFJVQwlUeEFnZ0NudDU7CisJVFhfQUdHX0NOVDZfU1RSVUMJVHhBZ2dDbnQ2OworCVRYX0FHR19DTlQ3X1NUUlVDCVR4QWdnQ250NzsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZSeFN0YUNudDAud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJlJ4U3RhQ250Mi53b3JkKTsKKworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJlJ4U3RhQ250MS53b3JkKTsKKwkgICAgLy8gVXBkYXRlIFJYIFBMQ1AgZXJyb3IgY291bnRlcgorCSAgICBwQWQtPlByaXZhdGVJbmZvLlBoeVJ4RXJyQ250ICs9IFJ4U3RhQ250MS5maWVsZC5QbGNwRXJyOworCQkvLyBVcGRhdGUgRmFsc2UgQ0NBIGNvdW50ZXIKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCArPSBSeFN0YUNudDEuZmllbGQuRmFsc2VDY2E7CisJfQorCisJLy8gVXBkYXRlIEZDUyBjb3VudGVycworCU9sZFZhbHVlPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydDsKKwlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCArPSAoUnhTdGFDbnQwLmZpZWxkLkNyY0Vycik7IC8vID4+IDcpOworCWlmIChwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQorCQlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIEFkZCBGQ1MgZXJyb3IgY291bnQgdG8gcHJpdmF0ZSBjb3VudGVycworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlPbGRWYWx1ZSA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIFVwZGF0ZSBEdXBsaWNhdGUgUmN2IGNoZWNrCisJcEFkLT5SYWxpbmtDb3VudGVycy5EdXBsaWNhdGVSY3YgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCS8vIFVwZGF0ZSBSWCBPdmVyZmxvdyBjb3VudGVyCisJcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciArPSAoUnhTdGFDbnQyLmZpZWxkLlJ4Rmlmb092ZXJmbG93Q291bnQpOworCisJaWYgKCFwQWQtPmJVcGRhdGVCY25DbnREb25lKQorCXsKKwkvLyBVcGRhdGUgQkVBQ09OIHNlbnQgY291bnQKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJlN0YVR4Mi53b3JkKTsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4QmVhY29uQ291bnQ7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJfQorCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQsICZUeEFnZ0NudC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMCwgJlR4QWdnQ250MC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMSwgJlR4QWdnQ250MS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMiwgJlR4QWdnQ250Mi53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMywgJlR4QWdnQ250My53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNCwgJlR4QWdnQ250NC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNSwgJlR4QWdnQ250NS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNiwgJlR4QWdnQ250Ni53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNywgJlR4QWdnQ250Ny53b3JkKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMU1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzJNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzNNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c0TVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNU1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzZNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzdNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c4TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnOU1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzEwTVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTFNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTJNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTNNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTRNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNU1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNk1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50IC8gMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudCAvIDMpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50IC8gNCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudCAvIDUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50IC8gNik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudCAvIDcpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50IC8gOCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudCAvIDEwKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudCAvIDExKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQgLyAxMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQgLyAxMyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudCAvIDE2KTsKKwl9CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwl7CisJCVJ0bXBEaWFnU3RydWN0CSpwRGlhZzsKKwkJQ09VTlRFUl9SQUxJTksJKnBSYWxpbmtDb3VudGVyczsKKwkJVUNIQVIJCQlBcnJheUN1cklkeCwgaTsKKworCQlwRGlhZyA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisJCXBSYWxpbmtDb3VudGVycyA9ICZwQWQtPlJhbGlua0NvdW50ZXJzOworCQlBcnJheUN1cklkeCA9IHBEaWFnLT5BcnJheUN1cklkeDsKKworCQlpZiAocERpYWctPmluaXRlZCA9PSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGlhZywgc2l6ZW9mKHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfKSk7CisJCQlwRGlhZy0+QXJyYXlTdGFydElkeCA9IHBEaWFnLT5BcnJheUN1cklkeCA9IDA7CisJCQlwRGlhZy0+aW5pdGVkID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFR4CisJCQlwRGlhZy0+VHhGYWlsQ250W0FycmF5Q3VySWR4XSA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBEaWFnLT5UeEFnZ0NudFtBcnJheUN1cklkeF0gPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OworCQkJcERpYWctPlR4Tm9uQWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMF0gPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzJdID0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bM10gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs0XSA9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzVdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNl0gPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs3XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzhdID0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOV0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTBdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzExXSA9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMl0gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTNdID0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE0XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxNV0gPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCisJCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlDdXJJZHgsICBESUFHTk9TRV9USU1FKTsKKwkJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OworCQkJZm9yIChpID0wOyBpIDwgOTsgaSsrKQorCQkJeworCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldPSAwOworCQkJCXBEaWFnLT5UeFNXUXVlQ250W0FycmF5Q3VySWR4XVtpXSA9MDsKKwkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCX0KKwkJCXBEaWFnLT5UeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gID0gMDsKKwkJCWZvciAoaSA9IDk7IGkgPCAyNDsgaSsrKSAvLyAzKjMKKwkJCXsKKwkJCQlwRGlhZy0+VHhEZXNjQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7CisJCQkJcERpYWctPlR4TWNzQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7CisJCQkJcERpYWctPlJ4TWNzQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7Cit9CisKKwkJCWlmIChwRGlhZy0+QXJyYXlDdXJJZHggPT0gcERpYWctPkFycmF5U3RhcnRJZHgpCisJCQkJSU5DX1JJTkdfSU5ERVgocERpYWctPkFycmF5U3RhcnRJZHgsICBESUFHTk9TRV9USU1FKTsKKwkJfQorCisJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVzZXQgTklDIGZyb20gZXJyb3IKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisJCVJlc2V0IE5JQyBmcm9tIGVycm9yIHN0YXRlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ1Jlc2V0RnJvbUVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vIFJlc2V0IEJCUCAoYWNjb3JkaW5nIHRvIGFsZXgsIHJlc2V0IEFTSUMgd2lsbCBmb3JjZSByZXNldCBCQlAKKwkvLyBUaGVyZWZvcmUsIHNraXAgdGhlIHJlc2V0IEJCUAorCS8vIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxLCAweDIpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOworCS8vIFJlbW92ZSBBU0lDIGZyb20gcmVzZXQgc3RhdGUKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7CisKKwlOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIEZBTFNFKTsKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKKworCS8vIFN3aXRjaCB0byBjdXJyZW50IGNoYW5uZWwsIHNpbmNlIGR1cmluZyByZXNldCBwcm9jZXNzLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgcmVtYWlucyBvbi4KKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJZXJhc2UgODA1MSBmaXJtd2FyZSBpbWFnZSBpbiBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTklDRXJhc2VGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORyBpOworCisJZm9yKGk9MDsgaTxNQVhfRklSTVdBUkVfSU1BR0VfU0laRTsgaSs9NCkKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIGksIDApOworCit9LyogRW5kIG9mIE5JQ0VyYXNlRmlybXdhcmUgKi8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUxvYWQgODA1MSBmaXJtd2FyZSBSVDI1NjEuQklOIGZpbGUgaW50byBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvaworCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTklDTG9hZEZpcm13YXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworI2lmZGVmIEJJTl9JTl9GSUxFCisjZGVmaW5lIE5JQ0xGX0RFRkFVTFRfVVNFKCkJXAorCWZsZ19kZWZhdWx0X2Zpcm1fdXNlID0gVFJVRTsgXAorCXByaW50aygiJXMgLSBVc2UgZGVmYXVsdCBmaXJtd2FyZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlzcmM7CisJc3RydWN0IGZpbGUJCSpzcmNmOworCUlOVCAJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZCwgaTsKKyAgIAltbV9zZWdtZW50X3QJb3JnZnM7CisJUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7CisJVUlOVAkJCUZpbGVMZW5ndGggPSAwOworCVVJTlQzMgkJCU1hY1JlZzsKKwlVTE9ORwkJCUluZGV4OworCVVMT05HCQkJZmlybTsKKwlCT09MRUFOCQkJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBGQUxTRTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKwkvKiBpbml0ICovCisJcEZpcm13YXJlSW1hZ2UgPSBOVUxMOworCXNyYyA9IFJUTVBfRklSTVdBUkVfRklMRV9OQU1FOworCisJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICBzZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkgKi8KKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKyBcCisJCQkJCQkgICBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OOworCisKKwkvKiBhbGxvY2F0ZSBmaXJtd2FyZSBidWZmZXIgKi8KKyAgICBwRmlybXdhcmVJbWFnZSA9IGttYWxsb2MoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICBpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKKwl7CisJCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KKwkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJTklDTEZfREVGQVVMVF9VU0UoKTsKKyAgICB9CisJZWxzZQorCXsKKwkJLyogYWxsb2NhdGUgb2shIHplcm8gdGhlIGZpcm13YXJlIGJ1ZmZlciAqLworCQltZW1zZXQocEZpcm13YXJlSW1hZ2UsIDB4MDAsIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisKKwkvKiBpZiBvaywgcmVhZCBmaXJtd2FyZSBmaWxlIGZyb20gKi5iaW4gZmlsZSAqLworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBGQUxTRSkKKwl7CisJCWRvCisJCXsKKwkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCisJCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCisJCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJeworCQkJCXByaW50aygiJXMgLSBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCXByaW50aygiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBfX0ZVTkNUSU9OX18sIHNyYyk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KKwkJCUZpbGVMZW5ndGggPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsCisJCQkJCQkJCQkJICBwRmlybXdhcmVJbWFnZSwKKwkJCQkJCQkJCQkgIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLAorCQkJCQkJCQkJCSAgJnNyY2YtPmZfcG9zKTsKKworCQkJaWYgKEZpbGVMZW5ndGggIT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpCisJCQl7CisJCQkJcHJpbnRrKCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gUlQyODYwQVAuQklOXG4iLAorCQkJCQkgICBfX0ZVTkNUSU9OX18sIEZpbGVMZW5ndGgpOworCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUFVDSEFSIHB0ciA9IHBGaXJtd2FyZUltYWdlOworCQkJCVVTSE9SVCBjcmMgPSAweGZmZmY7CisKKworCQkJCS8qIGNhbGN1bGF0ZSBmaXJtd2FyZSBDUkMgKi8KKwkJCQlmb3IoaT0wOyBpPChNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yKTsgaSsrLCBwdHIrKykKKwkJCQkJY3JjID0gQnl0ZUNSQzE2KGJpdHJldjgoKnB0ciksIGNyYyk7CisJCQkJLyogRW5kIG9mIGZvciAqLworCisJCQkJaWYgKChwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSAhPSBcCisJCQkJCQkJCShVQ0hBUiliaXRyZXY4KChVQ0hBUikoY3JjPj44KSkpIHx8CisJCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0xXSAhPSBcCisJCQkJCQkJCShVQ0hBUiliaXRyZXY4KChVQ0hBUiljcmMpKSkKKwkJCQl7CisJCQkJCS8qIENSQyBmYWlsICovCisJCQkJCXByaW50aygiJXM6IENSQyA9IDB4JTAyeCAweCUwMnggIgorCQkJCQkJICAgImVycm9yLCBzaG91bGQgYmUgMHglMDJ4IDB4JTAyeFxuIiwKKwkJCQkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdLAorCQkJCQkJICAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0sCisJCQkJCQkgICAoVUNIQVIpKGNyYz4+OCksIChVQ0hBUikoY3JjKSk7CisJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBmaXJtd2FyZSBpcyBvayAqLworCQkJCQlwQWQtPkZpcm13YXJlVmVyc2lvbiA9IFwKKwkJCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSA8PCA4KSArCisJCQkJCQlwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0zXTsKKworCQkJCQkvKiBjaGVjayBpZiBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGlzIHRvbyBvbGQgKi8KKwkJCQkJaWYgKChwQWQtPkZpcm13YXJlVmVyc2lvbikgPCBcCisJCQkJCQkJCQkJCSgoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArCisJCQkJCQkJCQkgIAkgCSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OKSkKKwkJCQkJeworCQkJCQkJcHJpbnRrKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCQlicmVhazsKKwkJCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJCQl9IC8qIEVuZCBvZiBpZiAqLworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJOSUNMb2FkRmlybXdhcmU6IENSQyBvaywgdmVyPSVkLiVkXG4iLAorCQkJCQkJICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSwKKwkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM10pKTsKKwkJCX0gLyogRW5kIG9mIGlmIChGaWxlTGVuZ3RoID09IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKSAqLworCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJOworCQllbHNlCisJCXsKKwkJCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJfSAvKiBFbmQgb2YgaWYgKi8KKwl9IC8qIEVuZCBvZiBpZiAqLworCisKKwkvKiB3cml0ZSBmaXJtd2FyZSB0byBBU0lDICovCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IFRSVUUpCisJeworCQkvKiB1c2UgZGVmYXVsdCBmaW1ld2FyZSwgZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJCWlmIChwRmlybXdhcmVJbWFnZSAhPSBOVUxMKQorCQkJa2ZyZWUocEZpcm13YXJlSW1hZ2UpOworCQkvKiBFbmQgb2YgaWYgKi8KKworCQkvKiB1c2UgZGVmYXVsdCAqLmJpbiBhcnJheSAqLworCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJCUZpbGVMZW5ndGggPSBzaXplb2YoRmlybXdhcmVJbWFnZSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworCS8qIGVuYWJsZSBIb3N0IHByb2dyYW0gcmFtIHdyaXRlIHNlbGVjdGlvbiAqLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CisKKwlmb3IoaT0wOyBpPEZpbGVMZW5ndGg7IGkrPTQpCisJeworCQlmaXJtID0gcEZpcm13YXJlSW1hZ2VbaV0gKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krM10gPDwgMjQpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzJdIDw8IDE2KSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSsxXSA8PCA4KTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgZmlybSk7CisJfSAvKiBFbmQgb2YgZm9yICovCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CisKKwkvKiBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50ICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsKKworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBGQUxTRSkKKwl7CisJCS8qIHVzZSBmaWxlIGZpcm13YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCisJCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7CisJCS8qIEVuZCBvZiBpZiAqLworCX0gLyogRW5kIG9mIGlmICovCisKKwlzZXRfZnMob3JnZnMpOworCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKyNlbHNlCisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlwRmlybXdhcmVJbWFnZTsKKwlVTE9ORwkJCUZpbGVMZW5ndGgsIEluZGV4OworCS8vVUxPTkcJCQlmaXJtOworCVVJTlQzMgkJCU1hY1JlZyA9IDA7CisKKwlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKKwlSVDI4WFhfV1JJVEVfRklSTVdBUkUocEFkLCBwRmlybXdhcmVJbWFnZSwgRmlsZUxlbmd0aCk7CisjZW5kaWYKKworCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOworCisJCWlmIChNYWNSZWcgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7CisKKyAgICBpZiAoSW5kZXggPj0gMTAwMCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuXG5cbiIpKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFN0YXR1cykpOworICAgIHJldHVybiBTdGF0dXM7Cit9IC8qIEVuZCBvZiBOSUNMb2FkRmlybXdhcmUgKi8KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJTG9hZCBUeCByYXRlIHN3aXRjaGluZyBwYXJhbWV0ZXJzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlSYXRlIFRhYmxlIEZvcm1hdDoKKwkJMS4gKEIwOiBWYWxpZCBJdGVtIG51bWJlcikgKEIxOkluaXRpYWwgaXRlbSBmcm9tIHplcm8pCisJCTIuIEl0ZW0gTnVtYmVyKERlYykgICAgICBNb2RlKEhleCkgICAgIEN1cnJlbnQgTUNTKERlYykgICAgVHJhaW5VcChEZWMpICAgIFRyYWluRG93bihEZWMpCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWlmICBwU3JjMSBhbGwgemVybyB3aXRoIGxlbmd0aCBMZW5ndGgsIHJldHVybiAwLgorCQlJZiBub3QgYWxsIHplcm8sIHJldHVybiAxCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCisKKwlSZXR1cm4gVmFsdWU6CisJCTE6CQkJbm90IGFsbCB6ZXJvCisJCTA6CQkJYWxsIHplcm8KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HCVJUTVBOb3RBbGxaZXJvKAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCWlmIChwTWVtMVtJbmRleF0gIT0gMHgwKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChJbmRleCA9PSBMZW5ndGgpCisJeworCQlyZXR1cm4gKDApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gKDEpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbXBhcmUgdHdvIG1lbW9yeSBibG9jaworCisJQXJndW1lbnRzOgorCQlwU3JjMQkJUG9pbnRlciB0byBmaXJzdCBtZW1vcnkgYWRkcmVzcworCQlwU3JjMgkJUG9pbnRlciB0byBzZWNvbmQgbWVtb3J5IGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKwkJMDoJCQltZW1vcnkgaXMgZXF1YWwKKwkJMToJCQlwU3JjMSBtZW1vcnkgaXMgbGFyZ2VyCisJCTI6CQkJcFNyYzIgbWVtb3J5IGlzIGxhcmdlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUENvbXBhcmVNZW1vcnkoCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JUFZPSUQJcFNyYzIsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlQVUNIQVIJcE1lbTI7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKwlwTWVtMiA9IChQVUNIQVIpIHBTcmMyOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJaWYgKHBNZW0xW0luZGV4XSA+IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMSk7CisJCWVsc2UgaWYgKHBNZW0xW0luZGV4XSA8IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMik7CisJfQorCisJLy8gRXF1YWwKKwlyZXR1cm4gKDApOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJWmVybyBvdXQgbWVtb3J5IGJsb2NrCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCQlQb2ludGVyIHRvIG1lbW9yeSBhZGRyZXNzCisJCUxlbmd0aAkJU2l6ZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFplcm9NZW1vcnkoCisJSU4JUFZPSUQJcFNyYywKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IDB4MDA7CisJfQorfQorCitWT0lECVJUTVBGaWxsTWVtb3J5KAorCUlOCVBWT0lECXBTcmMsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCVVDSEFSCUZpbGwpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IEZpbGw7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBkYXRhIGZyb20gbWVtb3J5IGJsb2NrIDEgdG8gbWVtb3J5IGJsb2NrIDIKKworCUFyZ3VtZW50czoKKwkJcERlc3QJCVBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGFkZHJlc3MKKwkJcFNyYwkJUG9pbnRlciB0byBzb3VyY2UgbWVtb3J5IGFkZHJlc3MKKwkJTGVuZ3RoCQlDb3B5IHNpemUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBNb3ZlTWVtb3J5KAorCU9VVAlQVk9JRAlwRGVzdCwKKwlJTglQVk9JRAlwU3JjLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJUFVDSEFSCXBNZW0yOworCVVJTlQJSW5kZXg7CisKKwlBU1NFUlQoKExlbmd0aD09MCkgfHwgKHBEZXN0ICYmIHBTcmMpKTsKKworCXBNZW0xID0gKFBVQ0hBUikgcERlc3Q7CisJcE1lbTIgPSAoUFVDSEFSKSBwU3JjOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJcE1lbTFbSW5kZXhdID0gcE1lbTJbSW5kZXhdOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXRpYWxpemUgcG9ydCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJVXNlckNmZ0luaXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgVUlOVCBrZXlfaW5kZXgsIGJzc19pbmRleDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdFxuIikpOworCisJLy8KKwkvLyAgcGFydCBJLiBpbnRpYWxpemUgY29tbW9uIGNvbmZpZ3VyYXRpb24KKwkvLworCisJZm9yKGtleV9pbmRleD0wOyBrZXlfaW5kZXg8U0hBUkVfS0VZX05VTTsga2V5X2luZGV4KyspCisJeworCQlmb3IoYnNzX2luZGV4ID0gMDsgYnNzX2luZGV4IDwgTUFYX01CU1NJRF9OVU07IGJzc19pbmRleCsrKQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVtic3NfaW5kZXhdW2tleV9pbmRleF0uS2V5TGVuID0gMDsKKwkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJfQorCX0KKworCXBBZC0+QW50ZW5uYS53b3JkID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKworCXBBZC0+TGVkQ250bC53b3JkID0gMDsKKyNpZmRlZiBSVDI4NjAKKwlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAwOworCXBBZC0+Ukxua0N0cmxPZmZzZXQgPSAwOworCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSAwOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwkJCS8vIERlZmF1bHQgaXMgT0ZGCisJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwkJCS8vIERlZmF1bHQgaXMgT0ZGCisJcEFkLT5SZkljVHlwZSA9IFJGSUNfMjgyMDsKKworCS8vIEluaXQgdGltZXIgZm9yIHJlc2V0IGNvbXBsZXRlIGV2ZW50CisJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAxOworCXBBZC0+YkZvcmNlUHJpbnRUWCA9IEZBTFNFOworCXBBZC0+YkZvcmNlUHJpbnRSWCA9IEZBTFNFOworCXBBZC0+YlN0YUZpZm9UZXN0ID0gRkFMU0U7CisJcEFkLT5iUHJvdGVjdGlvblRlc3QgPSBGQUxTRTsKKwlwQWQtPmJIQ0NBVGVzdCA9IEZBTFNFOworCXBBZC0+Ykdlbk9uZUhDQ0EgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOyAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCisJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAweGZmZmZmZmZmOyAvLyBBVVRPCisJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSAweGZmZmZmZmZmOyAvLyBBVVRPCisJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVBdXRvOyAvLyB1c2UgTG9uZyBwcmVhbWJsZSBvbiBUWCBieSBkZWZhdXQKKwlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gMjM0NzsKKwlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IDIzNDY7CisJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsgICAgLy8gMDogQVVUTworCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsgLy8wOworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOyAgICAgLy8gdW5rbm93bgorCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IDEwOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTQ291bnQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IDY1OworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSAzOworCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50ID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMDsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkJlYWNvblR4V0ksIHNpemVvZihwQWQtPkJlYWNvblR4V0kpKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKKwlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOworCXBBZC0+YkJyb2FkQ29tSFQgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbCA9IGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gNX4xMDAwCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZUR3ZWxsID0gZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsOwkvLyBVbml0IDogVFUuIDEwfjEwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgPSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbDsJLy8gVW5pdCA6IFNlY29uZAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbCA9IGRvdDExT0JTU1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjB+MTAwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvciA9IGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcjsKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlID0gZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQ7CS8vIFVuaXQgOiBwZXJjZW50YWdlCisJcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXkgPSAocEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpOworI2VuZGlmICAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsgLy8zMjsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXQuIEJBQ2FwYWJpbGl0eSA9IDB4JXhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7CisKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisJQkFUYWJsZUluaXQocEFkLCAmcEFkLT5CQVRhYmxlKTsKKworCXBBZC0+Q29tbW9uQ2ZnLmJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50ID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKKwlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7CisKKwlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IDc7CisKKwlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV82OworCisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE1DU19SQVRFXzY7CisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLkJXID0gQldfMjA7CisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisKKwlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAxMDA7ICAgICAvLyBpbiBtU2VjCisKKwkvLworCS8vIHBhcnQgSUkuIGludGlhbGl6ZSBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVJYX0ZJTFRFUl9TRVRfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX0RJUkVDVCk7CisJCVJYX0ZJTFRFUl9DTEVBUl9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfTVVMVElDQVNUKTsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfQlJPQURDQVNUKTsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfQUxMX01VTFRJQ0FTVCk7CisKKwkJcEFkLT5TdGFDZmcuUHNtID0gUFdSX0FDVElWRTsKKworCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOworCisJCS8vIDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gMDsKKwkJcEFkLT5TdGFDZmcuTWljRXJyQ250ICAgICAgICA9IDA7CisJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICAgICAgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgICAgICAgICA9IFNTX05PVFVTRTsKKworCQlwQWQtPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9IEZBTFNFOwkJLy8gTmV3IHRvIHN1cHBvcnQgbWljcm9zb2Z0IGRpc2FibGUgcmFkaW8gd2l0aCBPSUQgY29tbWFuZAorCisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHNpemVvZihSU1NJX1NBTVBMRSkpOworCQlwQWQtPlN0YUNmZy5Sc3NpVHJpZ2dlck1vZGUgPSBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRDsKKwkJcEFkLT5TdGFDZmcuQXRpbVdpbiA9IDA7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7Ly9kZWZhdWx0IGxpc3RlbiBjb3VudDsKKwkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsgIC8vIEJTU19JTkZSQSBvciBCU1NfQURIT0Mgb3IgQlNTX01PTklUT1IKKwkJcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCX0KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfTm9uZTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBnbG9iYWwgdmFyaWFibGVzIG1YWFhYIHVzZWQgaW4gTUFDIHByb3RvY29sIHN0YXRlIG1hY2hpbmVzCisJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKworCS8vIFBIWSBzcGVjaWZpY2F0aW9uCisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwkJLy8gZGVmYXVsdCBQSFkgbW9kZQorCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7ICAvLyBDQ0sgdXNlIExPTkcgcHJlYW1ibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyB1c2VyIGRlc2lyZWQgcG93ZXIgbW9kZQorCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQlwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID0gRkFMU0U7CisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJLy8gQ0NYIHYxLjAgcmVsZWF0ZWQgaW5pdCB2YWx1ZQorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihMZWFwQXV0aFRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwkJcEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID0gQ0lTQ09fQXV0aE1vZGVMRUFQTm9uZTsKKwkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKSwgcEFkLCBGQUxTRSk7CisJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IEZBTFNFOworCisJCS8vIFBhdGNoIGZvciBOZHRlc3QKKwkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7CisKKwkJLy8gQ0NYIDIuMCBjb250cm9sIGZsYWcgaW5pdAorCQlwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9IE1TUk5fVFlQRV9VTlVTRUQ7CisJCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01pbgk9IDQ7CisJCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01heAk9IDEwOworCisJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvICA9IFRSVUU7IC8vIERlZmF1bHQgSGFyZHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uCisJCXBBZC0+U3RhQ2ZnLmJTd1JhZGlvICA9IFRSVUU7IC8vIERlZmF1bHQgU29mdHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uCisJCXBBZC0+U3RhQ2ZnLmJSYWRpbyAgICA9IFRSVUU7IC8vIGJId1JhZGlvICYmIGJTd1JhZGlvCisJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CQkvLyBEZWZhdWx0IGlzIE9GRgorCQlwQWQtPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPSBGQUxTRTsJCS8vIERlZmF1bHQgbm8gc2hvdworCisJCS8vIE5pdHJvIG1vZGUgY29udHJvbAorCQlwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisKKwkJLy8gU2F2ZSB0aGUgaW5pdCB0aW1lIGFzIGxhc3Qgc2NhbiB0aW1lLCB0aGUgc3lzdGVtIHNob3VsZCBkbyBzY2FuIGFmdGVyIDIgc2Vjb25kcy4KKwkJLy8gVGhpcyBwYXRjaCBpcyBmb3IgZHJpdmVyIHdha2UgdXAgZnJvbSBzdGFuZGJ5IG1vZGUsIHN5c3RlbSB3aWxsIGRvIHNjYW4gcmlnaHQgYXdheS4KKwkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gMDsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUrMSk7CisJCXNwcmludGYocEFkLT5uaWNrbmFtZSwgIiVzIiwgU1RBX05JQ19ERVZJQ0VfTkFNRSk7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyksIHBBZCwgRkFMU0UpOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJcEFkLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRGVmYXVsdCBmb3IgZXh0cmEgaW5mb3JtYXRpb24gaXMgbm90IHZhbGlkCisJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworCisJLy8gRGVmYXVsdCBDb25maWcgY2hhbmdlIGZsYWcKKwlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7CisKKwkvLworCS8vIHBhcnQgSUlJLiBBUCBjb25maWd1cmF0aW9ucworCS8vCisKKworCS8vCisJLy8gcGFydCBJVi4gb3RoZXJzCisJLy8KKwkvLyBkeW5hbWljIEJCUCBSNjY6c2Vuc2liaXR5IHR1bmluZyB0byBvdmVyY29tZSBiYWNrZ3JvdW5kIG5vaXNlCisJcEFkLT5CYnBUdW5pbmcuYkVuYWJsZSAgICAgICAgICAgICAgICA9IFRSVUU7CisJcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FMb3dlclRocmVzaG9sZCA9IDEwMDsKKwlwQWQtPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkID0gNTEyOworCXBBZC0+QmJwVHVuaW5nLlI2NkRlbHRhICAgICAgICAgICAgICAgPSA0OworCXBBZC0+TWxtZS5iRW5hYmxlQXV0b0FudGVubmFDaGVjayA9IFRSVUU7CisKKwkvLworCS8vIEFsc28gaW5pdGlhbCBSNjZDdXJyZW50VmFsdWUsIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiBtaWdodCB1c2UgdGhpcyB2YWx1ZS4KKwkvLyBpZiBub3QgaW5pdGlhbCB0aGlzIHZhbHVlLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDAuCisJLy8KKwlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OworCisJcEFkLT5CYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCXBBZC0+QmJwRm9yQ0NLID0gRkFMU0U7CisKKwkvLyBpbml0aWFsaXplIE1BQyB0YWJsZSBhbmQgYWxsb2NhdGUgc3BpbiBsb2NrCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2YoTUFDX1RBQkxFKSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPk1hY1RhYi5NY2FzdFBzUXVldWUpOworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisjaWZkZWYgUkFMSU5LX0FURQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPmF0ZSwgc2l6ZW9mKEFURV9JTkZPKSk7CisJcEFkLT5hdGUuTW9kZSA9IEFURV9TVE9QOworCXBBZC0+YXRlLlR4Q291bnQgPSAyMDA7LyogdG8gZXhjZWVkIFRYX1JJTkdfU0laRSAuLi4gKi8KKwlwQWQtPmF0ZS5UeExlbmd0aCA9IDEwMjQ7CisJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsvLyBMT05HIEdJIDogODAwIG5zCisJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gTU9ERV9DQ0s7CisJcEFkLT5hdGUuVHhXSS5NQ1MgPSAzOworCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKKwlwQWQtPmF0ZS5DaGFubmVsID0gMTsKKwlwQWQtPmF0ZS5RSUQgPSBRSURfQUNfQkU7CisJcEFkLT5hdGUuQWRkcjFbMF0gPSAweDAwOworCXBBZC0+YXRlLkFkZHIxWzFdID0gMHgxMTsKKwlwQWQtPmF0ZS5BZGRyMVsyXSA9IDB4MjI7CisJcEFkLT5hdGUuQWRkcjFbM10gPSAweEFBOworCXBBZC0+YXRlLkFkZHIxWzRdID0gMHhCQjsKKwlwQWQtPmF0ZS5BZGRyMVs1XSA9IDB4Q0M7CisJTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjIsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+YXRlLkFkZHIzLCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwlwQWQtPmF0ZS5iUnhGZXIgPSAwOworCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gRkFMU0U7CisjaWZkZWYgUlQyODYwCisJcEFkLT5hdGUuYkZXTG9hZGluZyA9IEZBTFNFOworI2VuZGlmIC8vIFJUMjg2MCAvLworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKKwlwQWQtPmF0ZS5BdGVQaWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IEZBTFNFOworI2lmZGVmIFJUMjg2MAorICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gVXNlckNmZ0luaXRcbiIpKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VDSEFSIEJ0b0goY2hhciBjaCkKK3sKKwlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgcmV0dXJuIChjaCAtICcwJyk7ICAgICAgICAvLyBIYW5kbGUgbnVtZXJhbHMKKwlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgcmV0dXJuIChjaCAtICdBJyArIDB4QSk7ICAvLyBIYW5kbGUgY2FwaXRvbCBoZXggZGlnaXRzCisJaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHJldHVybiAoY2ggLSAnYScgKyAweEEpOyAgLy8gSGFuZGxlIHNtYWxsIGhleCBkaWdpdHMKKwlyZXR1cm4oMjU1KTsKK30KKworLy8KKy8vICBGVU5DVElPTjogQXRvSChjaGFyICosIFVDSEFSICosIGludCkKKy8vCisvLyAgUFVSUE9TRTogIENvbnZlcnRzIGFzY2lpIHN0cmluZyB0byBuZXR3b3JrIG9yZGVyIGhleAorLy8KKy8vICBQQVJBTUVURVJTOgorLy8gICAgc3JjICAgIC0gcG9pbnRlciB0byBpbnB1dCBhc2NpaSBzdHJpbmcKKy8vICAgIGRlc3QgICAtIHBvaW50ZXIgdG8gb3V0cHV0IGhleAorLy8gICAgZGVzdGxlbiAtIHNpemUgb2YgZGVzdAorLy8KKy8vICBDT01NRU5UUzoKKy8vCisvLyAgICAyIGFzY2lpIGJ5dGVzIG1ha2UgYSBoZXggYnl0ZSBzbyBtdXN0IHB1dCAxc3QgYXNjaWkgYnl0ZSBvZiBwYWlyCisvLyAgICBpbnRvIHVwcGVyIG5pYmJsZSBhbmQgMm5kIGFzY2lpIGJ5dGUgb2YgcGFpciBpbnRvIGxvd2VyIG5pYmJsZS4KKy8vCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCit2b2lkIEF0b0goY2hhciAqIHNyYywgVUNIQVIgKiBkZXN0LCBpbnQgZGVzdGxlbikKK3sKKwljaGFyICogc3JjcHRyOworCVBVQ0hBUiBkZXN0VGVtcDsKKworCXNyY3B0ciA9IHNyYzsKKwlkZXN0VGVtcCA9IChQVUNIQVIpIGRlc3Q7CisKKwl3aGlsZShkZXN0bGVuLS0pCisJeworCQkqZGVzdFRlbXAgPSBCdG9IKCpzcmNwdHIrKykgPDwgNDsgICAgLy8gUHV0IDFzdCBhc2NpaSBieXRlIGluIHVwcGVyIG5pYmJsZS4KKwkJKmRlc3RUZW1wICs9IEJ0b0goKnNyY3B0cisrKTsgICAgICAvLyBBZGQgMm5kIGFzY2lpIGJ5dGUgdG8gYWJvdmUuCisJCWRlc3RUZW1wKys7CisJfQorfQorCitWT0lECVJUTVBQYXRjaE1hY0JicEJ1ZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVTE9ORwlJbmRleDsKKworCS8vIEluaXRpYWxpemUgQkJQIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fQkJQX1JFR19QQVJNUzsgSW5kZXgrKykKKwl7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIChVQ0hBUilCQlBSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCX0KKworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJLy8gUmUtaW5pdCBCQlAgcmVnaXN0ZXIgZnJvbSBFRVBST00gdmFsdWUKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwQWQJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKKwkJcFRpbWVyRnVuYwkJCUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aW1lciBleHBpcmVkCisJCVJlcGVhdAkJCQlUdXJlIGZvciBwZXJpb2QgdGltZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRUaW1lcigKKwlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglQVk9JRAkJCQkJcFRpbWVyRnVuYywKKwlJTglQVk9JRAkJCQkJcERhdGEsCisJSU4JQk9PTEVBTgkJCQkJUmVwZWF0KQoreworCS8vCisJLy8gU2V0IFZhbGlkIHRvIFRSVUUgZm9yIGxhdGVyIHVzZWQuCisJLy8gSXQgd2lsbCBjcmFzaCBpZiB3ZSBjYW5jZWwgYSB0aW1lciBvciBzZXQgYSB0aW1lcgorCS8vIHRoYXQgd2UgaGF2ZW4ndCBpbml0aWFsaXplIGJlZm9yZS4KKwkvLworCXBUaW1lci0+VmFsaWQgICAgICA9IFRSVUU7CisKKwlwVGltZXItPlBlcmlvZGljVHlwZSA9IFJlcGVhdDsKKwlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwlwVGltZXItPmNvb2tpZSA9IChVTE9ORykgcERhdGE7CisKKworCVJUTVBfT1NfSW5pdF9UaW1lcihwQWQsCSZwVGltZXItPlRpbWVyT2JqLAlwVGltZXJGdW5jLCAoUFZPSUQpIHBUaW1lcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0IHRpbWVyIG9iamVjdHMKKworCUFyZ3VtZW50czoKKwkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQorCQlWYWx1ZQkJCQlUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0VGltZXIoCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVVMT05HCQkJCQlWYWx1ZSkKK3sKKwlpZiAocFRpbWVyLT5WYWxpZCkKKwl7CisJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOworCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCisJCXsKKwkJCXBUaW1lci0+UmVwZWF0ID0gVFJVRTsKKwkJCVJUTVBfU2V0UGVyaW9kaWNUaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJcFRpbWVyLT5SZXBlYXQgPSBGQUxTRTsKKwkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUFNldFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCisJCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBNb2RUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKQoreworCUJPT0xFQU4JQ2FuY2VsOworCisJaWYgKHBUaW1lci0+VmFsaWQpCisJeworCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKKwkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7CisJCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIocFRpbWVyLCAmQ2FuY2VsKTsKKwkJCVJUTVBTZXRUaW1lcihwVGltZXIsIFZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBfT1NfTW9kX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYW5jZWwgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJMS4pIFRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KKwkJMi4pIFJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDYW5jZWxUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmIChwVGltZXItPlZhbGlkKQorCXsKKwkJaWYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpCisJCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOworCQkJUlRNUF9PU19EZWxfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBDYW5jZWxsZWQpOworCisJCWlmICgqcENhbmNlbGxlZCA9PSBUUlVFKQorCQkJcFRpbWVyLT5TdGF0ZSA9IFRSVUU7CisKKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gTmRpc01DYW5jZWxUaW1lciBqdXN0IGNhbmNlZCB0aGUgdGltZXIgYW5kIG5vdCBtZWFuIHJlbGVhc2UgdGhlIHRpbWVyLgorCQkvLyBBbmQgZG9uJ3Qgc2V0IHRoZSAiVmFsaWQiIHRvIEZhbHNlLiBTbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyB0aW1lciBhZ2Fpbi4KKwkJLy8KKwkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgTEVEIFN0YXR1cworCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVN0YXR1cwkJCQkJTEVEIFN0YXR1cworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gVUNIQVIJCQlTdGF0dXMpCit7CisJLy9VTE9ORwkJCWRhdGE7CisJVUNIQVIJCQlIaWdoQnl0ZSA9IDA7CisJVUNIQVIJCQlMb3dCeXRlOworCisvLyBJbiBBVEUgbW9kZSBvZiBSVDI4NjAgQVAvU1RBLCB3ZSBoYXZlIGVyYXNlZCA4MDUxIGZpcm13YXJlLgorLy8gU28gTEVEIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB3aGVuIEFURSBpcyBydW5uaW5nLgorI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlMb3dCeXRlID0gcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUmMHg3ZjsKKwlzd2l0Y2ggKFN0YXR1cykKKwl7CisJCWNhc2UgTEVEX0xJTktfRE9XTjoKKwkJCUhpZ2hCeXRlID0gMHgyMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMDsKKwkJCWJyZWFrOworCQljYXNlIExFRF9MSU5LX1VQOgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCQlIaWdoQnl0ZSA9IDB4YTA7CisJCQllbHNlCisJCQkJSGlnaEJ5dGUgPSAweDYwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfUkFESU9fT046CisJCQlIaWdoQnl0ZSA9IDB4MjA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9IQUxUOgorCQkJTG93Qnl0ZSA9IDA7IC8vIERyaXZlciBzZXRzIE1BQyByZWdpc3RlciBhbmQgTUFDIGNvbnRyb2xzIExFRAorCQljYXNlIExFRF9SQURJT19PRkY6CisJCQlIaWdoQnl0ZSA9IDA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIExFRF9XUFM6CisJCQlIaWdoQnl0ZSA9IDB4MTA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9PTl9TSVRFX1NVUlZFWToKKwkJCUhpZ2hCeXRlID0gMHgwODsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX1BPV0VSX1VQOgorCQkJSGlnaEJ5dGUgPSAweDA0OworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldExFRDo6VW5rbm93biBTdGF0dXMgJWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisJfQorCisgICAgLy8KKwkvLyBLZWVwIExFRCBzdGF0dXMgZm9yIExFRCBTaXRlU3VydmV5IG1vZGUuCisJLy8gQWZ0ZXIgU2l0ZVN1cnZleSwgd2Ugd2lsbCBzZXQgdGhlIExFRCBtb2RlIHRvIHByZXZpb3VzIHN0YXR1cy4KKwkvLworCWlmICgoU3RhdHVzICE9IExFRF9PTl9TSVRFX1NVUlZFWSkgJiYgKFN0YXR1cyAhPSBMRURfUE9XRVJfVVApKQorCQlwQWQtPkxlZFN0YXR1cyA9IFN0YXR1czsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRMRUQ6Ok1vZGU9JWQsSGlnaEJ5dGU9MHglMDJ4LExvd0J5dGU9MHglMDJ4XG4iLCBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSwgSGlnaEJ5dGUsIExvd0J5dGUpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBMRUQgU2lnbmFsIFN0cmVndGgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlEYm0JCQkJCQlTaWduYWwgU3RyZWd0aAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJQ2FuIGJlIHJ1biBvbiBhbnkgSVJRTCBsZXZlbC4KKworCQlBY2NvcmRpbmcgdG8gTWljcm9zb2Z0IFplcm8gQ29uZmlnIFdpcmVsZXNzIFNpZ25hbCBTdHJlZ3RoIGRlZmluaXRpb24gYXMgYmVsb3dzLgorCQk8PSAtOTAgIE5vIFNpZ25hbAorCQk8PSAtODEgIFZlcnkgTG93CisJCTw9IC03MSAgTG93CisJCTw9IC02NyAgR29vZAorCQk8PSAtNTcgIFZlcnkgR29vZAorCQkgPiAtNTcgIEV4Y2VsbGVudAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldFNpZ25hbExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pCit7CisJVUNIQVIJCW5MZWQgPSAwOworCisJLy8KKwkvLyBpZiBub3QgU2lnbmFsIFN0cmVndGgsIHRoZW4gZG8gbm90aGluZy4KKwkvLworCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAhPSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAoRGJtIDw9IC05MCkKKwkJbkxlZCA9IDA7CisJZWxzZSBpZiAoRGJtIDw9IC04MSkKKwkJbkxlZCA9IDE7CisJZWxzZSBpZiAoRGJtIDw9IC03MSkKKwkJbkxlZCA9IDM7CisJZWxzZSBpZiAoRGJtIDw9IC02NykKKwkJbkxlZCA9IDc7CisJZWxzZSBpZiAoRGJtIDw9IC01NykKKwkJbkxlZCA9IDE1OworCWVsc2UKKwkJbkxlZCA9IDMxOworCisJLy8KKwkvLyBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4KKwkvLworCWlmIChwQWQtPkxlZEluZGljYXRvclN0cmVndGggIT0gbkxlZCkKKwl7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgbkxlZCwgcEFkLT5MZWRDbnRsLmZpZWxkLlBvbGFyaXR5KTsKKwkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gbkxlZDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmFibGUgUlgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlCZWZvcmUgRW5hYmxlIFJYLCBtYWtlIHN1cmUgeW91IGhhdmUgZW5hYmxlZCBJbnRlcnJ1cHQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QRW5hYmxlUnhUeCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKKworCS8vIEVuYWJsZSBSeCBETUEuCisJUlQyOFhYRE1BRW5hYmxlKHBBZCk7CisKKwkvLyBlbmFibGUgUlggb2YgTUFDIGJsb2NrCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCVVJTlQzMiByeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOworCisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7ICAgICAvLyBlbmFibGUgUlggb2YgRE1BIGJsb2NrCisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgICAgIC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QRW5hYmxlUnhUeFxuIikpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZWEzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGtpcC5jCkBAIC0wLDAgKzEsMTYwNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3RraXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCisjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAorCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQorCitVSU5UIFRraXBfU2JveF9Mb3dlclsyNTZdID0KK3sKKwkweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisJMHg1MCwweDAzLDB4QTksMHg3RCwweDE5LDB4NjIsMHhFNiwweDlBLAorCTB4NDUsMHg5RCwweDQwLDB4ODcsMHgxNSwweEVCLDB4QzksMHgwQiwKKwkweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisJMHhDMiwweDFDLDB4QUUsMHg2QSwweDVBLDB4NDEsMHgwMiwweDRGLAorCTB4NUMsMHhGNCwweDM0LDB4MDgsMHg5MywweDczLDB4NTMsMHgzRiwKKwkweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisJMHgwOSwweDM2LDB4OUIsMHgzRCwweDI2LDB4NjksMHhDRCwweDlGLAorCTB4MUIsMHg5RSwweDc0LDB4MkUsMHgyRCwweEIyLDB4RUUsMHhGQiwKKwkweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisJMHhGNSwweDY4LDB4MDAsMHgyQywweDYwLDB4MUYsMHhDOCwweEVELAorCTB4QkUsMHg0NiwweEQ5LDB4NEIsMHhERSwweEQ0LDB4RTgsMHg0QSwKKwkweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisJMHhDRiwweDEwLDB4MDYsMHg4MSwweEYwLDB4NDQsMHhCQSwweEUzLAorCTB4RjMsMHhGRSwweEMwLDB4OEEsMHhBRCwweEJDLDB4NDgsMHgwNCwKKwkweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisJMHg0QywweDE0LDB4MzUsMHgyRiwweEUxLDB4QTIsMHhDQywweDM5LAorCTB4NTcsMHhGMiwweDgyLDB4NDcsMHhBQywweEU3LDB4MkIsMHg5NSwKKwkweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisJMHhDQSwweDI5LDB4RDMsMHgzQywweDc5LDB4RTIsMHgxRCwweDc2LAorCTB4M0IsMHg1NiwweDRFLDB4MUUsMHhEQiwweDBBLDB4NkMsMHhFNCwKKwkweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisJMHgzMiwweDQzLDB4NTksMHhCNywweDhDLDB4NjQsMHhEMiwweEUwLAorCTB4QjQsMHhGQSwweDA3LDB4MjUsMHhBRiwweDhFLDB4RTksMHgxOCwKKwkweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisJMHgyMywweDdDLDB4OUMsMHgyMSwweERELDB4REMsMHg4NiwweDg1LAorCTB4OTAsMHg0MiwweEM0LDB4QUEsMHhEOCwweDA1LDB4MDEsMHgxMiwKKwkweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisJMHgzOCwweDEzLDB4QjMsMHgzMywweEJCLDB4NzAsMHg4OSwweEE3LAorCTB4QjYsMHgyMiwweDkyLDB4MjAsMHg0OSwweEZGLDB4NzgsMHg3QSwKKwkweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisJMHhDMywweEIwLDB4NzcsMHgxMSwweENCLDB4RkMsMHhENiwweDNBCit9OworCitVSU5UIFRraXBfU2JveF9VcHBlclsyNTZdID0KK3sKKwkweEM2LDB4RjgsMHhFRSwweEY2LDB4RkYsMHhENiwweERFLDB4OTEsCisJMHg2MCwweDAyLDB4Q0UsMHg1NiwweEU3LDB4QjUsMHg0RCwweEVDLAorCTB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKwkweDQxLDB4QjMsMHg1RiwweDQ1LDB4MjMsMHg1MywweEU0LDB4OUIsCisJMHg3NSwweEUxLDB4M0QsMHg0QywweDZDLDB4N0UsMHhGNSwweDgzLAorCTB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKwkweDA4LDB4OTUsMHg0NiwweDlELDB4MzAsMHgzNywweDBBLDB4MkYsCisJMHgwRSwweDI0LDB4MUIsMHhERiwweENELDB4NEUsMHg3RiwweEVBLAorCTB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKwkweEE0LDB4NzYsMHhCNywweDdELDB4NTIsMHhERCwweDVFLDB4MTMsCisJMHhBNiwweEI5LDB4MDAsMHhDMSwweDQwLDB4RTMsMHg3OSwweEI2LAorCTB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKwkweEJCLDB4QzUsMHg0RiwweEVELDB4ODYsMHg5QSwweDY2LDB4MTEsCisJMHg4QSwweEU5LDB4MDQsMHhGRSwweEEwLDB4NzgsMHgyNSwweDRCLAorCTB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKwkweDYzLDB4NzcsMHhBRiwweDQyLDB4MjAsMHhFNSwweEZELDB4QkYsCisJMHg4MSwweDE4LDB4MjYsMHhDMywweEJFLDB4MzUsMHg4OCwweDJFLAorCTB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKwkweEMwLDB4MTksMHg5RSwweEEzLDB4NDQsMHg1NCwweDNCLDB4MEIsCisJMHg4QywweEM3LDB4NkIsMHgyOCwweEE3LDB4QkMsMHgxNiwweEFELAorCTB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKwkweDlGLDB4QkQsMHg0MywweEM0LDB4MzksMHgzMSwweEQzLDB4RjIsCisJMHhENSwweDhCLDB4NkUsMHhEQSwweDAxLDB4QjEsMHg5QywweDQ5LAorCTB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKwkweDZGLDB4RjAsMHg0QSwweDVDLDB4MzgsMHg1NywweDczLDB4OTcsCisJMHhDQiwweEExLDB4RTgsMHgzRSwweDk2LDB4NjEsMHgwRCwweDBGLAorCTB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKwkweEMyLDB4NkEsMHhBRSwweDY5LDB4MTcsMHg5OSwweDNBLDB4MjcsCisJMHhEOSwweEVCLDB4MkIsMHgyMiwweEQyLDB4QTksMHgwNywweDMzLAorCTB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKwkweDAzLDB4NTksMHgwOSwweDFBLDB4NjUsMHhENywweDg0LDB4RDAsCisJMHg4MiwweDI5LDB4NUEsMHgxRSwweDdCLDB4QTgsMHg2RCwweDJDCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1VDSEFSIFNib3hUYWJsZVsyNTZdID0KK3sKKwkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAorCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCisJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKKwkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAorCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCisJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKKwkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAorCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCisJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKKwkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAorCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCisJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKKwkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAorCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCisJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKKwkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAorCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCisJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAorCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCisJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKKwkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAorCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCisJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKKwkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAorCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCisJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKKwkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAorCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCisJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKKwkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAorCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK307CisKK1ZPSUQgeG9yXzMyKAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHhvcl8xMjgoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbmV4dF9rZXkoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorCUlOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKKworVk9JRCBieXRlX3N1YigKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHNoaWZ0X3JvdygKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG1peF9jb2x1bW4oCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVUNIQVIgUlRNUENraXBTYm94KAorCUlOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOworLy8KKy8vIEV4cGFuZGVkIElWIGZvciBUS0lQIGZ1bmN0aW9uLgorLy8KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSVZfQ09OVFJPTF8KK3sKKwl1bmlvbiBQQUNLRUQKKwl7CisJCXN0cnVjdCBQQUNLRUQKKwkJeworCQkJVUNIQVIJCXJjMDsKKwkJCVVDSEFSCQlyYzE7CisJCQlVQ0hBUgkJcmMyOworCisJCQl1bmlvbiBQQUNLRUQKKwkJCXsKKwkJCQlzdHJ1Y3QgUEFDS0VECisJCQkJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJVUNIQVIJS2V5SUQ6MjsKKwkJCQkJVUNIQVIJRXh0SVY6MTsKKwkJCQkJVUNIQVIJUnN2ZDo1OworI2Vsc2UKKwkJCQkJVUNIQVIJUnN2ZDo1OworCQkJCQlVQ0hBUglFeHRJVjoxOworCQkJCQlVQ0hBUglLZXlJRDoyOworI2VuZGlmCisJCQkJfQlmaWVsZDsKKwkJCQlVQ0hBUgkJQnl0ZTsKKwkJCX0JQ09OVFJPTDsKKwkJfQlmaWVsZDsKKworCQlVTE9ORwl3b3JkOworCX0JSVYxNjsKKworCVVMT05HCUlWMzI7Cit9CVRLSVBfSVYsICpQVEtJUF9JVjsKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIFVDSEFSW10gdG8gVUxPTkcgaW4gYSBwb3J0YWJsZSB3YXkKKworCUFyZ3VtZW50czoKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUFRraXBHZXRVSW50MzIoCisJSU4JUFVDSEFSCXBNSUNLZXkpCit7CisJVUxPTkcJcmVzID0gMDsKKwlJTlQJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcmVzIHw9ICgqcE1JQ0tleSsrKSA8PCAoOCAqIGkpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb252ZXJ0IGZyb20gVUxPTkcgdG8gVUNIQVJbXSBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgVUxPTkcgdG8gVUNIQVJbXQorICAgICAgdmFsCQkJdGhlIHZhbHVlIGZvciBjb252ZXJ0CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBQdXRVSW50MzIoCisJSU4gT1VUCVBVQ0hBUgkJcERzdCwKKwlJTgkJVUxPTkcJCXZhbCkKK3sKKwlJTlQgaTsKKworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCSpwRHN0KysgPSAoVUNIQVIpICh2YWwgJiAweGZmKTsKKwkJdmFsID4+PSA4OworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVNldCB0aGUgTUlDIEtleS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFRraXBTZXRNSUNLZXkoCisJSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSkKK3sKKwkvLyBTZXQgdGhlIGtleQorCXBUa2lwLT5LMCA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkpOworCXBUa2lwLT5LMSA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkgKyA0KTsKKwkvLyBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UKKwlwVGtpcC0+TCA9IHBUa2lwLT5LMDsKKwlwVGtpcC0+UiA9IHBUa2lwLT5LMTsKKwlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKKwlwVGtpcC0+TSA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgdUNoYXIJCQlBcHBlbmQgdGhpcyB1Q2hhcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwQXBwZW5kQnl0ZSgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglVQ0hBUiAJCQl1Q2hhcikKK3sKKwkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCisJcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7CisJcFRraXAtPm5CeXRlc0luTSsrOworCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KKwlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKKwl7CisJCXBUa2lwLT5MIF49IHBUa2lwLT5NOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgorCQlwVGtpcC0+TSA9IDA7CisJCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEFwcGVuZCgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVVJTlQJCQluQnl0ZXMpCit7CisJLy8gVGhpcyBpcyBzaW1wbGUKKwl3aGlsZShuQnl0ZXMgPiAwKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKKwkJbkJ5dGVzLS07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEdldE1JQygKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKK3sKKwkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJfQorCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCisJUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOworCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFRraXAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCUtleUlkCQlUSyBLZXkgSUQKKwkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JUFVDSEFSCQkJcFRBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JUFVDSEFSCQkJcFRTQywKKwlPVVQJUFVMT05HCQkJcElWMTYsCisJT1VUCVBVTE9ORwkJCXBJVjMyKQoreworCVRLSVBfSVYJdGtpcEl2OworCisJLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQorCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7CisJTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCisKKwkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOworCSpwSVYzMiA9IHRraXBJdi5JVjMyOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCisJCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0TUlDRW5naW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBLZXksCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5KQoreworCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7CisJLy8gREEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8vIFNBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVQ0hBUglPbGRNaWNbOF07CisJVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgorCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKKwkvLyBEQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLy8gU0EKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKKworCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKKworCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOworCisJLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCisJUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOworCisJLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KKwkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcExMQwkJTExDIGhlYWRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCisJCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTExDLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5LAorCUlOCVVJTlQJCQlMZW4pCit7CisJVUNIQVIJT2xkTWljWzhdOworCVVMT05HCVByaW9yaXR5ID0gMDsKKworCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOworCS8vIERBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBTQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOworCisJLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOworCisJLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQorCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgorCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KKwkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQorCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRW5jYXAsCisJSU4JUENJUEhFUl9LRVkJCXBLZXksCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKKwlQVUNIQVIJCQlwU3JjQnVmVkE7CisJVUlOVAkJCVNyY0J1ZkxlbjsKKwlQVUNIQVIJCQlwU3JjOworICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7CisJVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7CisJcFNyYyA9IHBTcmNCdWZWQTsKKworCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKKwlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKKwkJdmxhbl9vZmZzZXQgPSA0OworCisJeworCQlSVE1QSW5pdE1JQ0VuZ2luZSgKKwkJCXBBZCwKKwkJCXBLZXktPktleSwKKwkJCXBTcmMsCisJCQlwU3JjICsgNiwKKwkJCVVzZXJQcmlvcml0eSwKKwkJCXBLZXktPlR4TWljKTsKKwl9CisKKworCWlmIChwRW5jYXAgIT0gTlVMTCkKKwl7CisJCS8vIExMQyBlbmNhcHN1bGF0aW9uCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOworCQkvLyBQcm90b2NvbCBUeXBlCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7CisJfQorCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7CisJcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7CisJZG8KKwl7CisJCWlmIChTcmNCdWZMZW4gPiAwKQorCQl7CisJCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKKwkJfQorCisJCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAorCisJfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCisKKwkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCisvKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKK3sKKwlVSU5UIGluZGV4X2xvdzsKKwlVSU5UIGluZGV4X2hpZ2g7CisJVUlOVCBsZWZ0LCByaWdodDsKKworCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7CisJaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOworCisJbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKKwlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOworCisJcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCitVSU5UIHJvdHIxKFVJTlQgYSkKK3sKKwl1bnNpZ25lZCBpbnQgYjsKKworCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCisJeworCQliID0gKGEgPj4gMSkgfCAweDgwMDA7CisJfQorCWVsc2UKKwl7CisJCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKKwl9CisJYiA9IGIgJSA2NTUzNjsKKwlyZXR1cm4gYjsKK30KKworVk9JRCBSVE1QVGtpcE1peEtleSgKKwlVQ0hBUiAqa2V5LAorCVVDSEFSICp0YSwKKwlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCVVDSEFSICpyYzRrZXksCisJVUlOVCAqcDFrKQoreworCisJVUlOVCB0c2MwOworCVVJTlQgdHNjMTsKKwlVSU5UIHRzYzI7CisKKwlVSU5UIHBwazA7CisJVUlOVCBwcGsxOworCVVJTlQgcHBrMjsKKwlVSU5UIHBwazM7CisJVUlOVCBwcGs0OworCVVJTlQgcHBrNTsKKworCUlOVCBpOworCUlOVCBqOworCisJdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KKwl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOworCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLworCisJLyogUGhhc2UgMSwgc3RlcCAxICovCisJcDFrWzBdID0gdHNjMTsKKwlwMWtbMV0gPSB0c2MwOworCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKKwlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7CisJcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOworCisJLyogUGhhc2UgMSwgc3RlcCAyICovCisJZm9yIChpPTA7IGk8ODsgaSsrKQorCXsKKwkJaiA9IDIqKGkgJiAxKTsKKwkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OworCX0KKworCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLworCXBwazAgPSBwMWtbMF07CisJcHBrMSA9IHAxa1sxXTsKKwlwcGsyID0gcDFrWzJdOworCXBwazMgPSBwMWtbM107CisJcHBrNCA9IHAxa1s0XTsKKwlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7CisKKwkvKiBQaGFzZTIsIFN0ZXAgMiAqLworCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKKwlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7CisJcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOworCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKKwlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7CisJcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7CisKKwlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKKwlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKKwlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOworCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7CisJcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKKwlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOworCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisgICAgLyogUGhhc2UgMiwgU3RlcCAzICovCisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCisKKwlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKKwlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKKwlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OworCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKKworCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7CisJcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OworCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OworCisJcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKKwlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OworCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OworCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OworCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCisJaW50IGhlYWRlcl9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqbXBkdSkKK3sKKwltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKKwltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKKwltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLworCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7ICAgIC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCisJbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAgICAgICAvKiBBMSAqLworCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKKwltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07CisJbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOworCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKKwltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07CisJbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLworCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOworCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOworCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOworCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOworCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjIsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIG1pY19oZWFkZXIyW2ldPTB4MDA7CisKKwltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAgICAvKiBBMyAqLworCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107CisJbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKKwltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOworCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07CisJbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKKworCS8vIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KQorCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOyAgIC8qIFNDICovCisJbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KKworCWlmICgoIXFjX2V4aXN0cykgJiBhNF9leGlzdHMpCisJeworCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLworCisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpCisJeworCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLworCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwl7CisJCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCisKKwkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOworCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19pdigKKwl1bnNpZ25lZCBjaGFyICptaWNfaXYsCisJaW50IHFjX2V4aXN0cywKKwlpbnQgYTRfZXhpc3RzLAorCXVuc2lnbmVkIGNoYXIgKm1wZHUsCisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvcikKK3sKKwlpbnQgaTsKKworCW1pY19pdlswXSA9IDB4NTk7CisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCisJCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDICAgICAgICAgICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KKwlpZiAoIXFjX2V4aXN0cykKKwkJbWljX2l2WzFdID0gMHgwMDsKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgIC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisjaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKwltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7CisJbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8MTY7IGkrKykKKwl7CisJCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKKwl9Cit9CisKKwordm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCit7CisJaW50IHJvdW5kOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYVsxNl07CisJdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGViWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHJvdW5kX2tleVsxNl07CisKKwlmb3IoaT0wOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKQorCXsKKwkJaWYgKHJvdW5kID09IDApCisJCXsKKwkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9CisJCWVsc2UgaWYgKHJvdW5kID09IDEwKQorCQl7CisJCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKKwkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJfQorCQllbHNlICAgIC8qIDEgLSA5ICovCisJCXsKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfQorCX0KKworfQorCit2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCgKKwl1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwl1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IsCisJaW50IGMpCit7CisKKwlpbnQgaSA9IDA7CisJZm9yIChpPTA7IGk8MTY7IGkrKykgY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCWkgPSAwOworCisJY3RyX3ByZWxvYWRbMF0gPSAweDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnICovCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOyAgIC8qIFFvQ19Db250cm9sICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7CisKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbaSAtIDhdOyAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KKyNlbmRpZgorCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvLyBDdHIKKwljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKKworfQorCisKKy8vCisvLyBUUlVFOiBTdWNjZXNzIQorLy8gRkFMU0U6IERlY3J5cHQgRXJyb3IhCisvLworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisgICAgVUNIQVIJCQlmYzA7CisJVUNIQVIJCQlmYzE7CisJVVNIT1JUCQkJZmM7CisJVUlOVAkJCWZyYW1lX3R5cGU7CisJVUlOVAkJCWZyYW1lX3N1YnR5cGU7CisgICAgVUlOVAkJCWZyb21fZHM7CisgICAgVUlOVAkJCXRvX2RzOworCUlOVAkJCQlhNF9leGlzdHM7CisJSU5UCQkJCXFjX2V4aXN0czsKKwlVU0hPUlQJCQlkdXJhdGlvbjsKKwlVU0hPUlQJCQlzZXFfY29udHJvbDsKKwlVU0hPUlQJCQlxb3NfY29udHJvbDsKKwlVQ0hBUgkJCVRBW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJU0FbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCVJDNEtleVsxNl07CisJVUlOVAkJCXAxa1s1XTsgLy9mb3IgbWl4X2tleTsKKwlVTE9ORwkJCXBubDsvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCisJVUxPTkcJCQlwbmg7LyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCUFSQ0ZPVVJDT05URVhUIAlBcmNGb3VyQ29udGV4dDsKKwlVSU5UCQkJY3JjMzIgPSAwOworCVVJTlQJCQl0cmFpbGZjcyA9IDA7CisJVUNIQVIJCQlNSUNbOF07CisJVUNIQVIJCQlUcmFpbE1JQ1s4XTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisKKwlmYzAgPSAqcERhdGE7CisJZmMxID0gKihwRGF0YSArIDEpOworCisJZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisgICAgZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisgICAgdG9fZHMgPSAoZmMxICYgMHgxKTsKKworICAgIGE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworICAgIHFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKKyAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCisgICAgICAgICAgICAgICAgICk7CisKKwlIZWFkZXJMZW4gPSAyNDsKKwlpZiAoYTRfZXhpc3RzKQorCQlIZWFkZXJMZW4gKz0gNjsKKworCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOworCUtleUlEID0gS2V5SUQgPj4gNjsKKworCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlkdXJhdGlvbiA9ICooKFBVU0hPUlQpKHBEYXRhKzIpKTsKKworCXNlcV9jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjIpKTsKKworCWlmIChxY19leGlzdHMpCisJeworCQlpZiAoYTRfZXhpc3RzKQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzMwKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzI0KSk7CisJCX0KKwl9CisKKwlpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDEpCisJeworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7ICAvL0JTU0lECisJfQorCWVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwICkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwl9CisJZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDApCisJeworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCX0KKwllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMjIsIE1BQ19BRERSX0xFTik7CisJfQorCisJbnVtX2Jsb2NrcyA9IChEYXRhQnl0ZUNudCAtIDE2KSAvIDE2OworCXBheWxvYWRfcmVtYWluZGVyID0gKERhdGFCeXRlQ250IC0gMTYpICUgMTY7CisKKwlwbmwgPSAoKihwRGF0YSArIEhlYWRlckxlbikpICogMjU2ICsgKihwRGF0YSArIEhlYWRlckxlbiArIDIpOworCXBuaCA9ICooKFBVTE9ORykocERhdGEgKyBIZWFkZXJMZW4gKyA0KSk7CisJcG5oID0gY3B1MmxlMzIocG5oKTsKKwlSVE1QVGtpcE1peEtleShwV3BhS2V5W0tleUlEXS5LZXksIFRBLCBwbmwsIHBuaCwgUkM0S2V5LCBwMWspOworCisJQVJDRk9VUl9JTklUKCZBcmNGb3VyQ29udGV4dCwgUkM0S2V5LCAxNik7CisKKwlBUkNGT1VSX0RFQ1JZUFQoJkFyY0ZvdXJDb250ZXh0LCBwRGF0YSArIEhlYWRlckxlbiwgcERhdGEgKyBIZWFkZXJMZW4gKyA4LCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDgpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA0LCA0KTsKKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA0KTsgIC8vU2tpcCBJVitFSVYgOCBieXRlcyAmIFNraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJIC8vSUNWIGVycm9yLgorCisJCXJldHVybiAoRkFMU0UpOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDggLSA0LCA4KTsKKwlSVE1QSW5pdE1JQ0VuZ2luZShwQWQsIHBXcGFLZXlbS2V5SURdLktleSwgREEsIFNBLCBVc2VyUHJpb3JpdHksIHBXcGFLZXlbS2V5SURdLlJ4TWljKTsKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7CisJTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKwlyZXR1cm4gVFJVRTsKK30KKworCisKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCit7CisJVUNIQVIJCQlLZXlJRDsKKwlVSU5UCQkJSGVhZGVyTGVuOworCVVDSEFSCQkJUE5bNl07CisJVUlOVAkJCXBheWxvYWRfbGVuOworCVVJTlQJCQludW1fYmxvY2tzOworCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKKwlVU0hPUlQJCQlmYzsKKwlVQ0hBUgkJCWZjMDsKKwlVQ0hBUgkJCWZjMTsKKwlVSU5UCQkJZnJhbWVfdHlwZTsKKwlVSU5UCQkJZnJhbWVfc3VidHlwZTsKKwlVSU5UCQkJZnJvbV9kczsKKwlVSU5UCQkJdG9fZHM7CisJSU5UCQkJCWE0X2V4aXN0czsKKwlJTlQJCQkJcWNfZXhpc3RzOworCVVDSEFSCQkJYWVzX291dFsxNl07CisJaW50IAkJCXBheWxvYWRfaW5kZXg7CisJVUlOVCAJCQlpOworCVVDSEFSIAkJCWN0cl9wcmVsb2FkWzE2XTsKKwlVQ0hBUiAJCQljaGFpbl9idWZmZXJbMTZdOworCVVDSEFSIAkJCXBhZGRlZF9idWZmZXJbMTZdOworCVVDSEFSIAkJCW1pY19pdlsxNl07CisJVUNIQVIgCQkJbWljX2hlYWRlcjFbMTZdOworCVVDSEFSIAkJCW1pY19oZWFkZXIyWzE2XTsKKwlVQ0hBUgkJCU1JQ1s4XTsKKwlVQ0hBUgkJCVRyYWlsTUlDWzhdOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKFBVU0hPUlQpcERhdGEpOworCisJZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7CisJZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7CisKKwlmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKKwl0b19kcyA9IChmYzEgJiAweDEpOworCisJYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7CisJcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8ICAgIC8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDA5KSB8fCAgIC8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fAorCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKwkJCQkgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKChQVUNIQVIpKHBEYXRhKyBIZWFkZXJMZW4gKyAzKSk7CisJS2V5SUQgPSBLZXlJRCA+PiA2OworCisJaWYgKHBXcGFLZXlbS2V5SURdLktleUxlbiA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0QUVTIGZhaWxlZCEoS2V5SURbJWRdIExlbmd0aCBjYW4gbm90IGJlIDApXG4iLCBLZXlJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJUE5bMF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4pOworCVBOWzFdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgMSk7CisJUE5bMl0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA0KTsKKwlQTlszXSA9ICoocERhdGErIEhlYWRlckxlbiArIDUpOworCVBOWzRdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNik7CisJUE5bNV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA3KTsKKworCXBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gODsJLy8gOCBieXRlcyBmb3IgQ0NNUCBoZWFkZXIgLCA4IGJ5dGVzIGZvciBNSUMKKwlwYXlsb2FkX3JlbWFpbmRlciA9IChwYXlsb2FkX2xlbikgJSAxNjsKKwludW1fYmxvY2tzID0gKHBheWxvYWRfbGVuKSAvIDE2OworCisKKworCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAorCXBheWxvYWRfaW5kZXggPSBIZWFkZXJMZW4gKyA4OyAvL0lWK0VJVgorCisJZm9yIChpPTA7IGk8IG51bV9ibG9ja3M7IGkrKykKKwl7CisJCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKKwkJCQkJCQkJYTRfZXhpc3RzLAorCQkJCQkJCQlxY19leGlzdHMsCisJCQkJCQkJCXBEYXRhLAorCQkJCQkJCQlQTiwKKwkJCQkJCQkJaSsxICk7CisKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CisKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlOZGlzTW92ZU1lbW9yeShwRGF0YSArIHBheWxvYWRfaW5kZXggLSA4LCBjaGFpbl9idWZmZXIsIDE2KTsKKwkJcGF5bG9hZF9pbmRleCArPSAxNjsKKwl9CisKKwkvLworCS8vIElmIHRoZXJlIGlzIGEgc2hvcnQgZmluYWwgYmxvY2ssIHRoZW4gcGFkIGl0CisJLy8gZW5jcnlwdCBpdCBhbmQgY29weSB0aGUgdW5wYWRkZWQgcGFydCBiYWNrCisJLy8KKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQorCXsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJCXFjX2V4aXN0cywKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCVBOLAorCQkJCQkJCQludW1fYmxvY2tzICsgMSk7CisKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlOZGlzTW92ZU1lbW9yeShwRGF0YSArIHBheWxvYWRfaW5kZXggLSA4LCBjaGFpbl9idWZmZXIsIHBheWxvYWRfcmVtYWluZGVyKTsKKwkJcGF5bG9hZF9pbmRleCArPSBwYXlsb2FkX3JlbWFpbmRlcjsKKwl9CisKKwkvLworCS8vIERlc2NyeXB0IHRoZSBNSUMKKwkvLworCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKKwkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJcWNfZXhpc3RzLAorCQkJCQkJCXBEYXRhLAorCQkJCQkJCVBOLAorCQkJCQkJCTApOworCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIDgpOworCisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CisKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCisJTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIGNoYWluX2J1ZmZlciwgOCk7CisKKwkvLworCS8vIENhbGN1bGF0ZSBNSUMKKwkvLworCisJLy9Gb3JjZSB0aGUgcHJvdGVjdGVkIGZyYW1lIGJpdCBvbgorCSoocERhdGEgKyAxKSA9ICoocERhdGEgKyAxKSB8IDB4NDA7CisKKwkvLyBGaW5kIHN0YXJ0IG9mIHBheWxvYWQKKwkvLyBCZWNhdXNlIHRoZSBDQ01QIGhlYWRlciBoYXMgYmVlbiByZW1vdmVkCisJcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbjsKKworCWNvbnN0cnVjdF9taWNfaXYoCisJCQkJCW1pY19pdiwKKwkJCQkJcWNfZXhpc3RzLAorCQkJCQlhNF9leGlzdHMsCisJCQkJCXBEYXRhLAorCQkJCQlwYXlsb2FkX2xlbiwKKwkJCQkJUE4pOworCisJY29uc3RydWN0X21pY19oZWFkZXIxKAorCQkJCQkJbWljX2hlYWRlcjEsCisJCQkJCQlIZWFkZXJMZW4sCisJCQkJCQlwRGF0YSk7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjIoCisJCQkJCQltaWNfaGVhZGVyMiwKKwkJCQkJCXBEYXRhLAorCQkJCQkJYTRfZXhpc3RzLAorCQkJCQkJcWNfZXhpc3RzKTsKKworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgbWljX2l2LCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjIsIGNoYWluX2J1ZmZlcik7CisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCisJLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggMTYgYnl0ZSBwYXlsb2FkIGJsb2NrCisJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKwl7CisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKKwkJcGF5bG9hZF9pbmRleCArPSAxNjsKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCX0KKworCS8vIEFkZCBvbiB0aGUgZmluYWwgcGF5bG9hZCBibG9jayBpZiBpdCBuZWVkcyBwYWRkaW5nCisJaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkKKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBwYXlsb2FkX3JlbWFpbmRlcik7CisKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCX0KKwkvLyBhZXNfb3V0IGNvbnRhaW5zIHBhZGRlZCBtaWMsIGRpc2NhcmQgbW9zdCBzaWduaWZpY2FudAorCS8vIDggYnl0ZXMgdG8gZ2VuZXJhdGUgNjQgYml0IE1JQworCWZvciAoaSA9IDAgOyBpIDwgODsgaSsrKSBNSUNbaV0gPSBhZXNfb3V0W2ldOworCisJaWYgKCFOZGlzRXF1YWxNZW1vcnkoTUlDLCBUcmFpbE1JQywgOCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU29mdERlY3J5cHRBRVMsIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBhZXMxMjhrMTI4ZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBlcmZvcm1zIGEgMTI4IGJpdCBBRVMgZW5jcnlwdCB3aXRoICAqLworLyogMTI4IGJpdCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1ZPSUQgeG9yXzEyOCgKKwlJTiAgUFVDSEFSICBhLAorCUlOICBQVUNIQVIgIGIsCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCUlOVCBpOworCisJZm9yIChpPTA7aTwxNjsgaSsrKQorCXsKKwkJb3V0W2ldID0gYVtpXSBeIGJbaV07CisJfQorfQorCitWT0lEIG5leHRfa2V5KAorCUlOICBQVUNIQVIgIGtleSwKKwlJTiAgSU5UICAgICByb3VuZCkKK3sKKwlVQ0hBUiAgICAgICByY29uOworCVVDSEFSICAgICAgIHNib3hfa2V5WzRdOworCVVDSEFSICAgICAgIHJjb25fdGFibGVbMTJdID0KKwl7CisJCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCisJCTB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKKwl9OworCisJc2JveF9rZXlbMF0gPSBSVE1QQ2tpcFNib3goa2V5WzEzXSk7CisJc2JveF9rZXlbMV0gPSBSVE1QQ2tpcFNib3goa2V5WzE0XSk7CisJc2JveF9rZXlbMl0gPSBSVE1QQ2tpcFNib3goa2V5WzE1XSk7CisJc2JveF9rZXlbM10gPSBSVE1QQ2tpcFNib3goa2V5WzEyXSk7CisKKwlyY29uID0gcmNvbl90YWJsZVtyb3VuZF07CisKKwl4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOworCWtleVswXSA9IGtleVswXSBeIHJjb247CisKKwl4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7CisJeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOworCXhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOworfQorCitWT0lEIHhvcl8zMigKKwlJTiAgUFVDSEFSICBhLAorCUlOICBQVUNIQVIgIGIsCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCUlOVCBpOworCisJZm9yIChpPTA7aTw0OyBpKyspCisJeworCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKKwl9Cit9CisKK1ZPSUQgYnl0ZV9zdWIoCisJSU4gIFBVQ0hBUiAgaW4sCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCUlOVCBpOworCisJZm9yIChpPTA7IGk8IDE2OyBpKyspCisJeworCQlvdXRbaV0gPSBSVE1QQ2tpcFNib3goaW5baV0pOworCX0KK30KKworVUNIQVIgUlRNUENraXBTYm94KAorCUlOICBVQ0hBUiAgIGEpCit7CisJcmV0dXJuIFNib3hUYWJsZVsoaW50KWFdOworfQorCitWT0lEIHNoaWZ0X3JvdygKKwlJTiAgUFVDSEFSICBpbiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJb3V0WzBdID0gIGluWzBdOworCW91dFsxXSA9ICBpbls1XTsKKwlvdXRbMl0gPSAgaW5bMTBdOworCW91dFszXSA9ICBpblsxNV07CisJb3V0WzRdID0gIGluWzRdOworCW91dFs1XSA9ICBpbls5XTsKKwlvdXRbNl0gPSAgaW5bMTRdOworCW91dFs3XSA9ICBpblszXTsKKwlvdXRbOF0gPSAgaW5bOF07CisJb3V0WzldID0gIGluWzEzXTsKKwlvdXRbMTBdID0gaW5bMl07CisJb3V0WzExXSA9IGluWzddOworCW91dFsxMl0gPSBpblsxMl07CisJb3V0WzEzXSA9IGluWzFdOworCW91dFsxNF0gPSBpbls2XTsKKwlvdXRbMTVdID0gaW5bMTFdOworfQorCitWT0lEIG1peF9jb2x1bW4oCisJSU4gIFBVQ0hBUiAgaW4sCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCUlOVCAgICAgICAgIGk7CisJVUNIQVIgICAgICAgYWRkMWJbNF07CisJVUNIQVIgICAgICAgYWRkMWJmN1s0XTsKKwlVQ0hBUiAgICAgICByb3RsWzRdOworCVVDSEFSICAgICAgIHN3YXBfaGFsZnNbNF07CisJVUNIQVIgICAgICAgYW5kZjdbNF07CisJVUNIQVIgICAgICAgcm90cls0XTsKKwlVQ0hBUiAgICAgICB0ZW1wWzRdOworCVVDSEFSICAgICAgIHRlbXBiWzRdOworCisJZm9yIChpPTAgOyBpPDQ7IGkrKykKKwl7CisJCWlmICgoaW5baV0gJiAweDgwKT09IDB4ODApCisJCQlhZGQxYltpXSA9IDB4MWI7CisJCWVsc2UKKwkJCWFkZDFiW2ldID0gMHgwMDsKKwl9CisKKwlzd2FwX2hhbGZzWzBdID0gaW5bMl07ICAgIC8qIFN3YXAgaGFsZnMgKi8KKwlzd2FwX2hhbGZzWzFdID0gaW5bM107CisJc3dhcF9oYWxmc1syXSA9IGluWzBdOworCXN3YXBfaGFsZnNbM10gPSBpblsxXTsKKworCXJvdGxbMF0gPSBpblszXTsgICAgICAgIC8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLworCXJvdGxbMV0gPSBpblswXTsKKwlyb3RsWzJdID0gaW5bMV07CisJcm90bFszXSA9IGluWzJdOworCisJYW5kZjdbMF0gPSBpblswXSAmIDB4N2Y7CisJYW5kZjdbMV0gPSBpblsxXSAmIDB4N2Y7CisJYW5kZjdbMl0gPSBpblsyXSAmIDB4N2Y7CisJYW5kZjdbM10gPSBpblszXSAmIDB4N2Y7CisKKwlmb3IgKGkgPSAzOyBpPjA7IGktLSkgICAgLyogbG9naWNhbCBzaGlmdCBsZWZ0IDEgYml0ICovCisJeworCQlhbmRmN1tpXSA9IGFuZGY3W2ldIDw8IDE7CisJCWlmICgoYW5kZjdbaS0xXSAmIDB4ODApID09IDB4ODApCisJCXsKKwkJCWFuZGY3W2ldID0gKGFuZGY3W2ldIHwgMHgwMSk7CisJCX0KKwl9CisJYW5kZjdbMF0gPSBhbmRmN1swXSA8PCAxOworCWFuZGY3WzBdID0gYW5kZjdbMF0gJiAweGZlOworCisJeG9yXzMyKGFkZDFiLCBhbmRmNywgYWRkMWJmNyk7CisKKwl4b3JfMzIoaW4sIGFkZDFiZjcsIHJvdHIpOworCisJdGVtcFswXSA9IHJvdHJbMF07ICAgICAgICAgLyogUm90YXRlIHJpZ2h0IDggYml0cyAqLworCXJvdHJbMF0gPSByb3RyWzFdOworCXJvdHJbMV0gPSByb3RyWzJdOworCXJvdHJbMl0gPSByb3RyWzNdOworCXJvdHJbM10gPSB0ZW1wWzBdOworCisJeG9yXzMyKGFkZDFiZjcsIHJvdHIsIHRlbXApOworCXhvcl8zMihzd2FwX2hhbGZzLCByb3RsLHRlbXBiKTsKKwl4b3JfMzIodGVtcCwgdGVtcGIsIG91dCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTI2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3dlcC5jCkBAIC0wLDAgKzEsNDk5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfd2VwLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIFd1CQkxMC0yOC0wMgkJSW5pdGlhbAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVSU5UIEZDU1RBQl8zMlsyNTZdID0KK3sKKwkweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLAorCTB4MDc2ZGM0MTksIDB4NzA2YWY0OGYsIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsCisJMHgwZWRiODgzMiwgMHg3OWRjYjhhNCwgMHhlMGQ1ZTkxZSwgMHg5N2QyZDk4OCwKKwkweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LCAweDkwYmYxZDkxLAorCTB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsCisJMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywKKwkweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLAorCTB4MTQwMTVjNGYsIDB4NjMwNjZjZDksIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsCisJMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCwgMHhhMjY3NzE3MiwKKwkweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLAorCTB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsCisJMHgzMmQ4NmNlMywgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwKKwkweDI2ZDkzMGFjLCAweDUxZGUwMDNhLCAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LAorCTB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsIDB4Y2ZiYTk1OTksIDB4YjhiZGE1MGYsCisJMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCwKKwkweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLAorCTB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsCisJMHg3MWIxODU4OSwgMHgwNmI2YjUxZiwgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywKKwkweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLCAweGUxMGU5ODE4LAorCTB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsCisJMHg2YjZiNTFmNCwgMHgxYzZjNjE2MiwgMHg4NTY1MzBkOCwgMHhmMjYyMDA0ZSwKKwkweDZjMDY5NWVkLCAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LAorCTB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsCisJMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMywgMHhmYmQ0NGM2NSwKKwkweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLAorCTB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsCisJMHg0MzY5ZTk2YSwgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwKKwkweDQ0MDQyZDczLCAweDMzMDMxZGU1LCAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LAorCTB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsCisJMHg1NzY4YjUyNSwgMHgyMDZmODViMywgMHhiOTY2ZDQwOSwgMHhjZTYxZTQ5ZiwKKwkweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LAorCTB4NTliMzNkMTcsIDB4MmViNDBkODEsIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsCisJMHhlZGI4ODMyMCwgMHg5YWJmYjNiNiwgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwKKwkweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLAorCTB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsCisJMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwKKwkweGYwMGY5MzQ0LCAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLAorCTB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsCisJMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSwgMHg2N2RkNGFjYywKKwkweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LAorCTB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsCisJMHhkMWJiNjdmMSwgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwKKwkweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLAorCTB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksCisJMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNiwKKwkweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLAorCTB4YzViYTNiYmUsIDB4YjJiZDBiMjgsIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsCisJMHhjMmQ3ZmZhNywgMHhiNWQwY2YzMSwgMHgyY2Q5OWU4YiwgMHg1YmRlYWUxZCwKKwkweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLCAweDAyNmQ5MzBhLAorCTB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsCisJMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwKKwkweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLAorCTB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsCisJMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSwgMHgxOGI3NDc3NywKKwkweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLAorCTB4OGY2NTllZmYsIDB4Zjg2MmFlNjksIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsCisJMHhhMDBhZTI3OCwgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwKKwkweGE3NjcyNjYxLCAweGQwNjAxNmY3LCAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLAorCTB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsIDB4NDBkZjBiNjYsIDB4MzdkODNiZjAsCisJMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwKKwkweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LAorCTB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsCisJMHhiMzY2N2EyZSwgMHhjNDYxNGFiOCwgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwKKwkweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLCAweDJkMDJlZjhkCit9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBXRVAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlJZAkJICAgV0VQIEtleSBJRAorCQlLZXlMZW4gICAgICB0aGUgbGVuZ3RoIG9mIFdFUCBLRVkKKwkJcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hpY2ggRW5jcnlwdGlvbiBkYXRhIHdpbGwgc3RvcmUgaW4uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRXZXBFbmdpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglVQ0hBUgkJCUtleUlkLAorCUlOCVVDSEFSCQkJS2V5TGVuLAorCUlOIE9VVAlQVUNIQVIJCXBEZXN0KQoreworCVVJTlQgaTsKKwlVQ0hBUiAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7ICAgLy9Jbml0IGNyYzMyLgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLmJDa2lwT24gJiYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgxMCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorICAgIHsKKyAgICAgICAgQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBLZXksIEtleUxlbik7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwS2V5LCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICB7CisJCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBLZXksIEtleUxlbik7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJV0VQS0VZW2ldID0gUmFuZG9tQnl0ZShwQWQpOyAgIC8vQ2FsbCBtbG1lIFJhbmRvbUJ5dGUoKSBmdW5jdGlvbi4KKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFdFUEtFWSwgS2V5TGVuICsgMyk7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIFdFUEtFWSwgMyk7ICAvL0FwcGVuZCBJbml0IFZlY3RvcgorICAgIH0KKwkqKHBEZXN0KzMpID0gKEtleUlkIDw8IDYpOyAgICAgICAvL0FwcGVuZCBLRVlJRAorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlFbmNyeXB0IHRyYW5zaW1pdHRlZCBkYXRhCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHRyYW5zaW1pdHRlZCBzb3VyY2UgZGF0YSB0aGF0IHdpbGwgYmUgZW5jcnlwdAorICAgICAgcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hlcmUgZW50cnlwdGlvbiBkYXRhIHdpbGwgYmUgc3RvcmUgaW4uCisgICAgICBMZW4JCQlJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorICAgICAgTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QRW5jcnlwdERhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwRGVzdCwKKwlJTglVSU5UCQkJTGVuKQoreworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgcFNyYywgTGVuKTsKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIHBTcmMsIExlbik7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCURlY3J5cHQgcmVjZWl2ZWQgV0VQIGRhdGEKKworCUFyZ3VtZW50czoKKwkJcEFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgZGF0YQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIERlY3J5cHQgV0VQIGRhdGEgc3VjY2VzcworCQlGQUxTRSAgICAgICBEZWNyeXB0IFdFUCBkYXRhIGZhaWxlZAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFNvZnREZWNyeXB0V0VQKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBQVUNIQVIJCQlwRGF0YSwKKwlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpCit7CisJVUlOVAl0cmFpbGZjczsKKwlVSU5UICAgIGNyYzMyOworCVVDSEFSCUtleUlkeDsKKwlVQ0hBUiAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKwlVQ0hBUiAJKnBQYXlsb2FkID0gKFVDSEFSICopcERhdGEgKyBMRU5HVEhfODAyXzExOworCVVMT05HCXBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBMRU5HVEhfODAyXzExOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZLCBwUGF5bG9hZCwgMyk7ICAgIC8vR2V0IFdFUCBJVgorCisJS2V5SWR4ID0gKCoocFBheWxvYWQgKyAzKSAmIDB4YzApID4+IDY7CisJaWYgKHBHcm91cEtleVtLZXlJZHhdLktleUxlbiA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBHcm91cEtleVtLZXlJZHhdLktleSwgcEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuKTsKKwlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4gKyAzKTsKKwlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcFBheWxvYWQsIHBQYXlsb2FkICsgNCwgcGF5bG9hZF9sZW4gLSA0KTsKKwlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBQYXlsb2FkICsgcGF5bG9hZF9sZW4gLSA4LCA0KTsKKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBQYXlsb2FkLCBwYXlsb2FkX2xlbiAtIDgpOyAgLy9Ta2lwIGxhc3QgNCBieXRlcyhGQ1MpLgorCWNyYzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKworICAgIGlmKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkKKyAgICB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEgV0VQIERhdGEgQ1JDIEVycm9yICFcbiIpKTsJIC8vQ1JDIGVycm9yLgorCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVRoZSBTdHJlYW0gQ2lwaGVyIEVuY3J5cHRpb24gQWxnb3JpdGhtICJBUkNGT1VSIiBpbml0aWFsaXplCisKKwlBcmd1bWVudHM6CisJICAgQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBLZXkgICAgICAgIFBvaW50ZXIgdG8gdGhlIFdFUCBLRVkKKwkJS2V5TGVuICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBmbyB0aGUgV0VQIEtFWQorCisJUmV0dXJuIFZhbHVlOgorCSAgIE5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9JTklUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglVSU5UCQkJS2V5TGVuKQoreworCVVDSEFSCXQsIHU7CisJVUlOVAlrZXlpbmRleDsKKwlVSU5UCXN0YXRlaW5kZXg7CisJUFVDSEFSCXN0YXRlOworCVVJTlQJY291bnRlcjsKKworCXN0YXRlID0gQ3R4LT5TVEFURTsKKwlDdHgtPlggPSAwOworCUN0eC0+WSA9IDA7CisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKQorCQlzdGF0ZVtjb3VudGVyXSA9IChVQ0hBUiljb3VudGVyOworCWtleWluZGV4ID0gMDsKKwlzdGF0ZWluZGV4ID0gMDsKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCisJeworCQl0ID0gc3RhdGVbY291bnRlcl07CisJCXN0YXRlaW5kZXggPSAoc3RhdGVpbmRleCArIHBLZXlba2V5aW5kZXhdICsgdCkgJiAweGZmOworCQl1ID0gc3RhdGVbc3RhdGVpbmRleF07CisJCXN0YXRlW3N0YXRlaW5kZXhdID0gdDsKKwkJc3RhdGVbY291bnRlcl0gPSB1OworCQlpZiAoKytrZXlpbmRleCA+PSBLZXlMZW4pCisJCQlrZXlpbmRleCA9IDA7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IGJ5dGVzIGZyb20gQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKworCVJldHVybiBWYWx1ZToKKwkgICBVQ0hBUiAgLSB0aGUgdmFsdWUgb2YgdGhlIEFSQ0ZPVVIgQ09OVEVYVCAoUy1CT1gpCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUNIQVIJQVJDRk9VUl9CWVRFKAorCUlOCVBBUkNGT1VSQ09OVEVYVAkJQ3R4KQoreworICBVSU5UIHg7CisgIFVJTlQgeTsKKyAgVUNIQVIgc3gsIHN5OworICBQVUNIQVIgc3RhdGU7CisKKyAgc3RhdGUgPSBDdHgtPlNUQVRFOworICB4ID0gKEN0eC0+WCArIDEpICYgMHhmZjsKKyAgc3ggPSBzdGF0ZVt4XTsKKyAgeSA9IChzeCArIEN0eC0+WSkgJiAweGZmOworICBzeSA9IHN0YXRlW3ldOworICBDdHgtPlggPSB4OworICBDdHgtPlkgPSB5OworICBzdGF0ZVt5XSA9IHN4OworICBzdGF0ZVt4XSA9IHN5OworCisgIHJldHVybihzdGF0ZVsoc3ggKyBzeSkgJiAweGZmXSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVRoZSBTdHJlYW0gQ2lwaGVyIERlY3J5cHRpb24gQWxnb3JpdGhtCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCisJCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFSQ0ZPVVJfREVDUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCisJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFSQ0ZPVVJfRU5DUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCisJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gd2hpY2ggY29uZm9ybSB0byB0aGUgc3BlY2lhbCByZXF1aXJlbWVudCB0byBlbmNyeXB0ICBHVEsuCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCisJCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkdGEKKworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitWT0lECVdQQUFSQ0ZPVVJfRU5DUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisgICAgICAgIC8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBBUkNGT1VSX0JZVEUoQ3R4KTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSBhIG5ldyBGQ1MgZ2l2ZW4gdGhlIGN1cnJlbnQgRkNTIGFuZCB0aGUgbmV3IGRhdGEuCisKKwlBcmd1bWVudHM6CisJCUZjcwkgICAgICB0aGUgb3JpZ2luYWwgRkNTIHZhbHVlCisJCUNwICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSBjYWxjdWxhdGUgdGhlIEZDUworCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCVVJTlQgLSBGQ1MgMzIgYml0cworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUlOVAlSVE1QX0NBTENfRkNTMzIoCisJSU4JVUlOVAlGY3MsCisJSU4JUFVDSEFSCUNwLAorCUlOCUlOVAkJTGVuKQoreworCXdoaWxlIChMZW4tLSkKKwkgICBGY3MgPSAoKChGY3MpID4+IDgpIF4gRkNTVEFCXzMyWygoRmNzKSBeICgqQ3ArKykpICYgMHhmZl0pOworCisJcmV0dXJuIChGY3MpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgbGFzdCBGQ1MgYW5kIGVuY3J5cHQgaXQgdG8gdGhlIGRlc3RpbmF0aW9uCisKKwlBcmd1bWVudHM6CisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldElDVigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJcERlc3QpCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiBePSAweGZmZmZmZmZmOyAgICAgICAgICAgICAvKiBjb21wbGVtZW50ICovCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IGNwdTJsZTMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIpOworCisJQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LCAoUFVDSEFSKSAmcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgNCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTYzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCkBAIC0wLDAgKzEsMTg3NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgICAyMDA4CSAgCSAgIGNyZWF0ZWQgZm9yIDgwMi4xMWgKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAiYWN0aW9uLmgiCisKK1ZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19GVU5DVElPTl9fKSk7CisKKwlyZXR1cm47Cit9CisKK1ZPSUQgTWVhc3VyZVJlcVRhYkV4aXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0ZyZWVTcGluTG9jayhwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpCisJCWtmcmVlKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKTsKKwlwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBQTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUxvb2tVcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVVJTlQgSGFzaElkeDsKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisKKwlpZiAocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCisJCQlicmVhazsKKwkJZWxzZQorCQl7CisJCQlwUHJldkVudHJ5ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwkJfQorCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJSU5UIGk7CisJVUxPTkcgSGFzaElkeDsKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKKwlVTE9ORyBOb3c7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgTVFfUkVRX0FHRV9PVVQpKSkKKwkJCXsKKwkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKKwkJCQlwVGFiLT5TaXplLS07CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKKwkJeworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7CisJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKKwkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKKwkJCXBUYWItPlNpemUrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeSA9IE5VTEw7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJfQorCisJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQlpZiAocEVudHJ5KQorCQl7CisJCQlIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQkJeworCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBWT0lEIE1lYXN1cmVSZXFEZWxldGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCWlmKHBUYWIgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBpZiBlbXB0eSwgcmV0dXJuCisJaWYgKHBUYWItPlNpemUgPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBNZWFzdXJlUmVxVGFiIGVtcHR5LlxuIikpOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKKwlpZiAocEVudHJ5ICE9IE5VTEwpCisJeworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQlkbworCQl7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJeworCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQlwVGFiLT5TaXplLS07CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuOworfQorCitWT0lEIFRwY1JlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKFRQQ19SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKworCXJldHVybjsKK30KKworVk9JRCBUcGNSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKKwkJa2ZyZWUocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYik7CisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFMb29rVXAoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlVSU5UIEhhc2hJZHg7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisKKwlpZiAocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJcEVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCXdoaWxlIChwRW50cnkpCisJeworCQlpZiAocEVudHJ5LT5EaWFsb2dUb2tlbiA9PSBEaWFsb2dUb2tlbikKKwkJCWJyZWFrOworCQllbHNlCisJCXsKKwkJCXBQcmV2RW50cnkgPSBwRW50cnk7CisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCQl9CisJfQorCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKKworc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUluc2VydCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCUlOVCBpOworCVVMT05HIEhhc2hJZHg7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEwsIHBDdXJyRW50cnk7CisJVUxPTkcgTm93OworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgVFBDX1JFUV9BR0VfT1VUKSkpCisJCQl7CisJCQkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQkJCVBUUENfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQkJCXBUYWItPlNpemUtLTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkUpCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnktPmxhc3RUaW1lID0gTm93OworCQkJcEVudHJ5LT5WYWxpZCA9IFRSVUU7CisJCQlwRW50cnktPkRpYWxvZ1Rva2VuID0gRGlhbG9nVG9rZW47CisJCQlwVGFiLT5TaXplKys7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnkgPSBOVUxMOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJfQorCisJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQlpZiAocEVudHJ5KQorCQl7CisJCQlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBWT0lEIFRwY1JlcURlbGV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm47CisJfQorCisJLy8gaWYgZW1wdHksIHJldHVybgorCWlmIChwVGFiLT5TaXplID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwVHBjUmVxVGFiIGVtcHR5LlxuIikpOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgIT0gTlVMTCkKKwl7CisJCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCQlVTE9ORyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCVBUUENfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKwkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQlkbworCQl7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJeworCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihUUENfUkVRX0VOVFJZKSk7CisJCXBUYWItPlNpemUtLTsKKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHZXQgQ3VycmVudCBUaW1lUyB0YW1wLgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBVSU5UNjQgR2V0Q3VycmVudFRpbWVTdGFtcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBnZXQgY3VycmVudCB0aW1lIHN0YW1wLgorCXJldHVybiAwOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdldCBDdXJyZW50IFRyYW5zbWl0IFBvd2VyLgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBVSU5UOCBHZXRDdXJUeFB3cigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UOCBXY2lkKQoreworCXJldHVybiAxNjsgLyogMTYgZEJtICovCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IERpYWxvZyBUb2tlbiBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBEaWFsb2cgdG9rZW4uCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydERpYWxvZ1Rva2VuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuKQoreworCVVMT05HIFRlbXBMZW47CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkmVGVtcExlbiwKKwkJCQkJMSwJCQkJJkRpYWxvZ1Rva2VuLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IFRQQyBSZXF1ZXN0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXFJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbikKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IDA7CisJVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUVVFU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBUUEMgUmVwb3J0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIFRyYW5zbWl0IFBvd2VyLgorCQk0LiBMaW5rIE1hcmdpbi4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworIHN0YXRpYyBWT0lEIEluc2VydFRwY1JlcG9ydElFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IFR4UHdyLAorCUlOIFVJTlQ4IExpbmtNYXJnaW4pCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW4gPSBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKTsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVQT1JUOworCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBvcnRJRTsKKworCVRwY1JlcG9ydElFLlR4UHdyID0gVHhQd3I7CisJVHBjUmVwb3J0SUUuTGlua01hcmdpbiA9IExpbmtNYXJnaW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJCSZUcGNSZXBvcnRJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCisJCTQuIG5ldyBzZWxlY3RlZCBjaGFubmVsLgorCQk1LiBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgY291bnQuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydENoU3dBbm5JRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBOZXdDaGFubmVsLAorCUlOIFVJTlQ4IENoU3dDbnQpCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW4gPSBzaXplb2YoQ0hfU1dfQU5OX0lORk8pOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDsKKwlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSUU7CisKKwlDaFN3QW5uSUUuQ2hTd01vZGUgPSBDaFN3TW9kZTsKKwlDaFN3QW5uSUUuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJQ2hTd0FubklFLkNoU3dDbnQgPSBDaFN3Q250OworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCSZDaFN3QW5uSUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgTWVhc3VyZSBSZXF1ZXN0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIE1lYXN1cmUgVG9rZW4uCisJCTQuIE1lYXN1cmUgUmVxdWVzdCBNb2RlLgorCQk1LiBNZWFzdXJlIFJlcXVlc3QgVHlwZS4KKwkJNi4gTWVhc3VyZSBDaGFubmVsLgorCQk3LiBNZWFzdXJlIFN0YXJ0IHRpbWUuCisJCTguIE1lYXN1cmUgRHVyYXRpb24uCisKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcUlFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFBNRUFTVVJFX1JFUV9JTkZPIHBNZWFzdXJlUmVxSUUpCit7CisJVUxPTkcgVGVtcExlbjsKKwlVSU5UOCBMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVFfSU5GTyk7CisJVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXFJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgTWVhc3VyZSBSZXBvcnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gTWVhc3VyZSBUb2tlbi4KKwkJNC4gTWVhc3VyZSBSZXF1ZXN0IE1vZGUuCisJCTUuIE1lYXN1cmUgUmVxdWVzdCBUeXBlLgorCQk2LiBMZW5ndGggb2YgUmVwb3J0IEluZm9tYXRpb24KKwkJNy4gUG9pbnRlciBvZiBSZXBvcnQgSW5mb21hdGlvbiBCdWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydE1lYXN1cmVSZXBvcnRJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydElFLAorCUlOIFVJTlQ4IFJlcG9ydExuZm9MZW4sCisJSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKworCUxlbiA9IHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSArIFJlcG9ydExuZm9MZW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJCXBNZWFzdXJlUmVwb3J0SUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlpZiAoKFJlcG9ydExuZm9MZW4gPiAwKSAmJiAocFJlcG9ydEluZm8gIT0gTlVMTCkpCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYgKyAqcEZyYW1lTGVuLAkJJlRlbXBMZW4sCisJCQkJCQkJUmVwb3J0TG5mb0xlbiwJCQkJcFJlcG9ydEluZm8sCisJCQkJCQkJRU5EX09GX0FSR1MpOworCisJCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKwl9CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJRTsKKwlVSU5UOCBSbVJlcURhaWxvZ1Rva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lID0gR2V0Q3VycmVudFRpbWVTdGFtcChwQWQpOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUSk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKKworCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pKTsKKwlNZWFzdXJlUmVxSUUuVG9rZW4gPSBSbVJlcURhaWxvZ1Rva2VuOworCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBjcHUybGUxNihNZWFzdXJlRHVyYXRpb24pOworCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVxSUUpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggRGlhbG9nVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IFJlcG9ydEluZm9MZW4sCisJSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcElFOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUCk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcElFLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCU1lYXN1cmVSZXBJRS5Ub2tlbiA9IE1lYXN1cmVUb2tlbjsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CisJTWVhc3VyZVJlcElFLlJlcG9ydFR5cGUgPSBNZWFzdXJlUmVxVHlwZTsKKwlJbnNlcnRNZWFzdXJlUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCAmTWVhc3VyZVJlcElFLCBSZXBvcnRJbmZvTGVuLCBwUmVwb3J0SW5mbyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVQ0hBUiBEaWFsb2dUb2tlbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JRKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJSW5zZXJ0VHBjUmVxSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIFRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggRGlhbG9nVG9rZW4sCisJSU4gVUlOVDggVHhQd3IsCisJSU4gVUlOVDggTGlua01hcmdpbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JQKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJSW5zZXJ0VHBjUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBUeFB3ciwgTGlua01hcmdpbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKwkJMi4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCisJCTIuIGEgTmV3IHNlbGVjdGVkIGNoYW5uZWwuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZUNoU3dBbm4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBOZXdDaCkKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX0NIQU5ORUxfU1dJVENIKTsKKworCUluc2VydENoU3dBbm5JRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENoU3dNb2RlLCBOZXdDaCwgMCk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBCT09MRUFOIERmc1JlcXVpcmVtZW50Q2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggQ2hhbm5lbCkKK3sKKwlCT09MRUFOIFJlc3VsdCA9IEZBTFNFOworCUlOVCBpOworCisJZG8KKwl7CisJCS8vIGNoZWNrIERGUyBwcm9jZWR1cmUgaXMgcnVubmluZy4KKwkJLy8gbWFrZSBzdXJlIERGUyBwcm9jZWR1cmUgd29uJ3Qgc3RhcnQgdHdpY2UuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCisJCXsKKwkJCVJlc3VsdCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBjaGVjayB0aGUgbmV3IGNoYW5uZWwgY2FycmllZCBmcm9tIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbW5ldCBpcyB2YWxpZC4KKwkJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQl7CisJCQlpZiAoKENoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJCSYmKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9PSAwKSkKKwkJCXsKKwkJCQkvLyBmb3VuZCByYWRhciBzaWduYWwgaW4gdGhlIGNoYW5uZWwuIHRoZSBjaGFubmVsIGNhbid0IHVzZSBhdCBsZWFzdCBmb3IgMzAgbWludXRlcy4KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPSAxODAwOy8vMzAgbWluID0gMTgwMCBzZWMKKwkJCQlSZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitWT0lEIE5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBSQSwKKwlJTiBQVUNIQVIgcFRBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IENoYW5uZWwpCit7CisjaWZkZWYgV0RTX1NVUFBPUlQKKwlpZiAoISgocFJBWzBdICYgMHhmZikgPT0gMHhmZikpIC8vIGlzIHBSQSBhIGJyb2FkY2FzZSBhZGRyZXNzLgorCXsKKwkJSU5UIGk7CisJCS8vIGluZm8gbmVpZ2hib3IgQVBzIHRoYXQgUmFkYXIgc2lnbmFsIGZvdW5kIHRocm9naCBXRFMgbGluay4KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9XRFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKFZhbGlkV2RzRW50cnkocEFkLCBpKSkKKwkJCXsKKwkJCQlQVUNIQVIgcERBID0gcEFkLT5XZHNUYWIuV2RzRW50cnlbaV0uUGVlcldkc0FkZHI7CisKKwkJCQkvLyBEQSBlcXVhbCB0byBTQS4gaGF2ZSBubyBuZWNlc3Nhcnkgb3JpZ25hbCBBUCB3aGljaCBmb3VuZCBSYWRhciBzaWduYWwuCisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBUQSwgcERBKSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBzZW5kIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBmcmFtZSB0byBpbmZvIE5laWdoYnJvIEFQcy4KKwkJCQlFbnF1ZXVlQ2hTd0FubihwQWQsIHBEQSwgQ2hTd01vZGUsIENoYW5uZWwpOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCit9CisKK3N0YXRpYyBWT0lEIFN0YXJ0REZTUHJvY2VkdXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gVUlOVDggQ2hTd01vZGUpCit7CisJLy8gc3RhcnQgREZTIHByb2NlZHVyZQorCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU1dJVENISU5HX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGluZm9tYXRpb24gYnVmZmVyLgorCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgIHwgSUQgfCBMZW4gfENoIFN3IE1vZGUgfCBOZXcgQ2ggTnVtIHwgQ2ggU3cgQ250IHwKKyAgKy0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICAgIDEgICAgMSAgICAgICAgMSAgICAgICAgICAgMSAgICAgICAgICAgIDEKKyovCitzdGF0aWMgQk9PTEVBTiBQZWVyQ2hTd0FublNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUENIX1NXX0FOTl9JTkZPIHBDaFN3QW5uSW5mbykKK3sKKwlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisJUEVJRF9TVFJVQ1QgZWlkX3B0cjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocENoU3dBbm5JbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dNb2RlLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3Q250LCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBNZWFzdXJlbWVudCByZXF1ZXN0IGluZm9tYXRpb24gYnVmZmVyLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKKwlPVVQgUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocE1lYXN1cmVSZXFJbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcU1vZGUud29yZCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IFNXQVA2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gU1dBUDE2KE1lYXN1cmVEdXJhdGlvbik7CisKKwkJCQlyZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gTWVhc3VyZW1lbnQgcmVwb3J0IGluZm9tYXRpb24gYnVmZmVyLgorCQk0LiBiYXNpYyByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgTWVhc3VyZW1lbnQgUmVwb3J0IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBJRCB8IExlbiB8IFRva2VuIHwgUmVwb3J0IE1vZGUgfCBNZWFzdXJlIFR5cGUgfCBNZWFzdXJlIFJlcG9ydCB8CisgICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICAgIDEgICAgIDEgICAgICAxICAgICAgICAgIDEgICAgICAgICAgICAgMSAgICAgICAgICAgIHZhcmlhYmxlCisKKyAgQmFzaWMgUmVwb3J0LgorICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCisgIHwgQ2ggTnVtIHwgU3RhcnQgVGltZSB8IER1cmF0aW9uIHwgTWFwIHwKKyAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tKworICAgICAgMSAgICAgICAgICA4ICAgICAgICAgICAyICAgICAgICAxCisKKyAgTWFwIEZpZWxkIEJpdCBGb3JtYXQuCisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgIHwgQnNzIHwgT0ZETSBQcmVhbWJsZSB8IFVuaWRlbnRpZmllZCBzaWduYWwgfCBSYWRhciB8IFVubWVhc3VyZWQgfCBSZXNlcnZlZCB8CisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgICAgIDAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgIDUtNworKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydEluZm8sCisJT1VUIFBVSU5UOCBwUmVwb3J0QnVmKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisKKwkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBNZWFzdXJlUmVwb3J0SW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydE1vZGUsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKKwkJCQlpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7CisKKwkJCQl9CisJCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX0NDQV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9DQ0FfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sIHB0ciArIDExLCAxKTsKKworCQkJCX0KKwkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fUlBJX0hJU1RPR1JBTSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX1JQSV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9SUElfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+UlBJX0RlbnNpdHksIHB0ciArIDExLCA4KTsKKwkJCQl9CisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVFVRVNUOgorCQkJCXJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCQk0LiBUUEMgUmVwb3J0IElFLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVwU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQVFBDX1JFUE9SVF9JTkZPIHBUcGNSZXBJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVBPUlQ6CisJCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5UeFB3ciwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+TGlua01hcmdpbiwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJDaFN3QW5uQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSW5mbzsKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUiBpbmRleCA9IDAsIENoYW5uZWwgPSAwLCBOZXdDaGFubmVsID0gMDsKKwlVTE9ORyBCc3NpZHggPSAwOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTmRpc1plcm9NZW1vcnkoJkNoU3dBbm5JbmZvLCBzaXplb2YoQ0hfU1dfQU5OX0lORk8pKTsKKwlpZiAoISBQZWVyQ2hTd0FublNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmQ2hTd0FubkluZm8pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBDaGFubmVsIFN3aXRjaCBBY3Rpb24gRnJhbWUuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEZyLT5IZHIuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJDaFN3QW5uQWN0aW9uIC0gQnNzaWR4IGlzIG5vdCBmb3VuZFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7CisJCWhleF9kdW1wKCJTU0lEIixwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCAsNik7CisKKwkJQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCU5ld0NoYW5uZWwgPSBDaFN3QW5uSW5mby5DaGFubmVsOworCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCisJCXsKKwkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KKwkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7CisJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKworCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKKwkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCisJCQkJeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm47Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJbmZvOworCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKKworCWlmKFBlZXJNZWFzdXJlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXFJbmZvKSkKKwl7CisJCVJlcG9ydE1vZGUud29yZCA9IDA7CisJCVJlcG9ydE1vZGUuZmllbGQuSW5jYXBhYmxlID0gMTsKKwkJRW5xdWV1ZU1lYXN1cmVtZW50UmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBNZWFzdXJlUmVxSW5mby5Ub2tlbiwgUmVwb3J0TW9kZS53b3JkLCBNZWFzdXJlUmVxSW5mby5SZXFUeXBlLCAwLCBOVUxMKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgUmVwb3J0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBvcnRJbmZvOworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVBVSU5UOCBwTWVhc3VyZVJlcG9ydEluZm87CisKKy8vCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQorLy8JCXJldHVybjsKKworCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JWQpLlxuIiwgX19GVU5DVElPTl9fLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSkpOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCU5kaXNaZXJvTWVtb3J5KHBNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpOworCWlmIChQZWVyTWVhc3VyZVJlcG9ydFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVwb3J0SW5mbywgcE1lYXN1cmVSZXBvcnRJbmZvKSkKKwl7CisJCWRvIHsKKwkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJCQkvLyBOb3QgYSBhdXRvbm9tb3VzIG1lYXN1cmUgcmVwb3J0LgorCQkJLy8gY2hlY2sgdGhlIGRpYWxvZyB0b2tlbiBmaWVsZC4gZHJvcCBpdCBpZiB0aGUgZGlhbG9nIHRva2VuIGRvZXNuJ3QgbWF0Y2guCisJCQlpZiAoKERpYWxvZ1Rva2VuICE9IDApCisJCQkJJiYgKChwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSA9PSBOVUxMKSkKKwkJCQlicmVhazsKKworCQkJaWYgKHBFbnRyeSAhPSBOVUxMKQorCQkJCU1lYXN1cmVSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKKworCQkJaWYgKE1lYXN1cmVSZXBvcnRJbmZvLlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCisJCQl7CisJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBCYXNpY1JlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcE1lYXN1cmVSZXBvcnRJbmZvOworCQkJCWlmICgocEJhc2ljUmVwb3J0LT5NYXAuZmllbGQuUmFkYXIpCisJCQkJCSYmIChEZnNSZXF1aXJlbWVudENoZWNrKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSkgPT0gVFJVRSkpCisJCQkJeworCQkJCQlOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKHBBZCwgcEZyLT5IZHIuQWRkcjEsIHBGci0+SGRyLkFkZHIyLCAxLCBwQmFzaWNSZXBvcnQtPkNoTnVtKTsKKwkJCQkJU3RhcnRERlNQcm9jZWR1cmUocEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtLCAxKTsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIE1lYXN1cmVtZW50IFJlcG9ydCBGcmFtZS5cbiIpKTsKKworCWtmcmVlKHBNZWFzdXJlUmVwb3J0SW5mbyk7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlclRwY1JlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IHBGci0+T2N0ZXQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggVHhQd3IgPSBHZXRDdXJUeFB3cihwQWQsIEVsZW0tPldjaWQpOworCVVJTlQ4IExpbmtNYXJnaW4gPSAwOworCUNIQVIgUmVhbFJzc2k7CisKKwkvLyBsaW5rIG1hcmdpbjogUmF0aW8gb2YgdGhlIHJlY2VpdmVkIHNpZ25hbCBwb3dlciB0byB0aGUgbWluaW11bSBkZXNpcmVkIGJ5IHRoZSBzdGF0aW9uIChTVEEpLiBUaGUKKwkvLwkJCQlTVEEgbWF5IGluY29ycG9yYXRlIHJhdGUgaW5mb3JtYXRpb24gYW5kIGNoYW5uZWwgY29uZGl0aW9ucywgaW5jbHVkaW5nIGludGVyZmVyZW5jZSwgaW50byBpdHMgY29tcHV0YXRpb24KKwkvLwkJCQlvZiBsaW5rIG1hcmdpbi4KKworCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksCisJCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwKKwkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKworCS8vIHNraXAgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCisJLy8gRGlhbG9nIHRva2VuLgorCU5kaXNNb3ZlTWVtb3J5KCZEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKKworCUxpbmtNYXJnaW4gPSAoUmVhbFJzc2kgLyBNSU5fUkNWX1BXUik7CisJaWYgKFBlZXJUcGNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuKSkKKwkJRW5xdWV1ZVRQQ1JlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwgVHhQd3IsIExpbmtNYXJnaW4pOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlclRwY1JlcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVFBDX1JFUE9SVF9JTkZPIFRwY1JlcEluZm87CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCU5kaXNaZXJvTWVtb3J5KCZUcGNSZXBJbmZvLCBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKSk7CisJaWYgKFBlZXJUcGNSZXBTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmVHBjUmVwSW5mbykpCisJeworCQlpZiAoKHBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKSkgIT0gTlVMTCkKKwkJeworCQkJVHBjUmVxRGVsZXRlKHBBZCwgcEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogRGlhbG9nVG9rZW49JXgsIFR4UHdyPSVkLCBMaW5rTWFyZ2luPSVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgU1BFQ19NUlE6CisJCQkvLyBjdXJyZW50IHJ0Mjg2MCB1bmFibGUgZG8gc3VjaCBtZWFzdXJlIHNwZWNpZmllZCBpbiBNZWFzdXJlbWVudCBSZXF1ZXN0LgorCQkJLy8gcmVqZWN0IGFsbCBtZWFzdXJlbWVudCByZXF1ZXN0LgorCQkJUGVlck1lYXN1cmVSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19NUlA6CisJCQlQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JROgorCQkJUGVlclRwY1JlcUFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JQOgorCQkJUGVlclRwY1JlcEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX0NIQU5ORUxfU1dJVENIOgoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQlTRUNfQ0hBX09GRlNFVF9JRQlTZWNvbmRhcnk7CisJCQkJQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDaGFubmVsU3dpdGNoOworCisJCQkJLy8gODAyLjExaCBvbmx5IGhhcyBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCisJCQkJUlRNUE1vdmVNZW1vcnkoJkNoYW5uZWxTd2l0Y2gsICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs0XSwgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSk7CisKKwkJCQkvLyA4MDIuMTFuIEQzLjAzIGFkZHMgc2Vjb25kYXJ5IGNoYW5uZWwgb2Zmc2V0IGVsZW1lbnQgaW4gdGhlIGVuZC4KKwkJCQlpZiAoRWxlbS0+TXNnTGVuID09ICAoTEVOR1RIXzgwMl8xMSArIDIgKyBzaXplb2YgKENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUpICsgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJlNlY29uZGFyeSwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzldLCBzaXplb2YgKFNFQ19DSEFfT0ZGU0VUX0lFKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCkgJiYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzNdID09IDMpKQorCQkJCXsKKwkJCQkJQ2hhbm5lbFN3aXRjaEFjdGlvbihwQWQsIEVsZW0tPldjaWQsIENoYW5uZWxTd2l0Y2guTmV3Q2hhbm5lbCwgU2Vjb25kYXJ5LlNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCit9CisJCQlQZWVyQ2hTd0FubkFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0lOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZCA9IDE7CisJVUlOVCBBcmdJZHg7CisJUFVDSEFSIHRoaXNDaGFyOworCisJTUVBU1VSRV9SRVFfTU9ERSBNZWFzdXJlUmVxTW9kZTsKKwlVSU5UOCBNZWFzdXJlUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJVUlOVDggTWVhc3VyZVJlcVR5cGUgPSBSTV9CQVNJQzsKKwlVSU5UOCBNZWFzdXJlQ2ggPSAxOworCisJQXJnSWR4ID0gMTsKKwl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpCisJeworCQlzd2l0Y2goQXJnSWR4KQorCQl7CisJCQljYXNlIDE6CS8vIEFpZC4KKwkJCQlBaWQgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBUeXBlLgorCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19GVU5DVElPTl9fLCBNZWFzdXJlUmVxVHlwZSkpOworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy8gTWVhc3VyZW1lbnQgY2hhbm5lbC4KKwkJCQlNZWFzdXJlQ2ggPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisJCX0KKwkJQXJnSWR4Kys7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fRlVOQ1RJT05fXywgQWlkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoKSk7CisJaWYgKCFWQUxJRF9XQ0lEKEFpZCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCkpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlNZWFzdXJlUmVxTW9kZS53b3JkID0gMDsKKwlNZWFzdXJlUmVxTW9kZS5maWVsZC5FbmFibGUgPSAxOworCisJTWVhc3VyZVJlcUluc2VydChwQWQsIE1lYXN1cmVSZXFUb2tlbik7CisKKwlFbnF1ZXVlTWVhc3VyZW1lbnRSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwKKwkJTWVhc3VyZVJlcVRva2VuLCBNZWFzdXJlUmVxTW9kZS53b3JkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoLCAyMDAwKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1RwY1JlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZDsKKworCVVJTlQ4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCisJQWlkID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBBaWQpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7CisJCXJldHVybiBUUlVFOworCX0KKworCVRwY1JlcUluc2VydChwQWQsIFRwY1JlcVRva2VuKTsKKworCUVucXVldWVUUENSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwgVHBjUmVxVG9rZW4pOworCisJcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29uZmlnLm1rIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3ZDdiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjQ1IEBACisjIFN1cHBvcnQgQVRFIGZ1bmN0aW9uCitIQVNfQVRFPW4KKworIyBTdXBwb3J0IDI4eHggUUEgQVRFIGZ1bmN0aW9uCitIQVNfMjh4eF9RQT1uCisKKyMgU3VwcG9ydCBXcGFfU3VwcGxpY2FudAorSEFTX1dQQV9TVVBQTElDQU5UPW4KKworIyBTdXBwb3J0IE5hdGl2ZSBXcGFTdXBwbGljYW50IGZvciBOZXR3b3JrIE1hZ2FuZ2VyCitIQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ9bgorCisjU3VwcG9ydCBOZXQgaW50ZXJmYWNlIGJsb2NrIHdoaWxlIFR4LVN3IHF1ZXVlIGZ1bGwKK0hBU19CTE9DS19ORVRfSUY9bgorCisjU3VwcG9ydCBERlMgZnVuY3Rpb24KK0hBU19ERlNfU1VQUE9SVD1uCisKKyNTdXBwb3J0IENhcnJpZXItU2Vuc2UgZnVuY3Rpb24KK0hBU19DU19TVVBQT1JUPW4KKworI2lmZGVmIE1VTFRJX0NBUkQKKyMgU3VwcG9ydCBmb3IgTXVsdGlwbGUgQ2FyZHMKK0hBU19NQ19TVVBQT1JUPW4KKyNlbmRpZiAvLyBNVUxUSV9DQVJEIC8vCisKKyNTdXBwb3J0IGZvciBJRUVFODAyLjExZSBETFMKK0hBU19RT1NfRExTX1NVUFBPUlQ9bgorCisjU3VwcG9ydCBmb3IgRVhUX0NIQU5ORUwKK0hBU19FWFRfQlVJTERfQ0hBTk5FTF9MSVNUPW4KKworI1N1cHBvcnQgZm9yIE5ldC1TTk1QCitIQVNfU05NUF9TVVBQT1JUPW4KKworI1N1cHBvcnQgZmVhdHVyZXMgb2YgU2luZ2xlIFNLVS4KK0hBU19TSU5HTEVfU0tVX1NVUFBPUlQ9bgorCisjU3VwcG9ydCBmZWF0dXJlcyBvZiA4MDIuMTFuCitIQVNfRE9UMTFfTl9TVVBQT1JUPXkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NDIDo9ICQoQ1JPU1NfQ09NUElMRSlnY2MKK0xEIDo9ICQoQ1JPU1NfQ09NUElMRSlsZAorCitXRkxBR1MgOj0gLURBR0dSRUdBVElPTl9TVVBQT1JUIC1EUElHR1lCQUNLX1NVUFBPUlQgLURXTU1fU1VQUE9SVCAgLURMSU5VWCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjIGNvbmZpZyBmb3IgU1RBIG1vZGUKKworaWZlcSAoJChSVDI4eHhfTU9ERSksU1RBKQorV0ZMQUdTICs9IC1EQ09ORklHX1NUQV9TVVBQT1JUIC1EREJHCisKK2lmZXEgKCQoSEFTX1dQQV9TVVBQTElDQU5UKSx5KQorV0ZMQUdTICs9IC1EV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChIQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLUROQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChIQVNfQVRFKSx5KQorV0ZMQUdTICs9IC1EUkFMSU5LX0FURQoraWZlcSAoJChIQVNfMjh4eF9RQSkseSkKK1dGTEFHUyArPSAtRFJBTElOS18yOHh4X1FBCitlbmRpZgorZW5kaWYKKworaWZlcSAoJChIQVNfU05NUF9TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1EU05NUF9TVVBQT1JUCitlbmRpZgorCitpZmVxICgkKEhBU19RT1NfRExTX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLURRT1NfRExTX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX0RPVDExX05fU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRERPVDExX05fU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChIQVNfQ1NfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX1NJTkdMRV9TS1VfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRFNJTkdMRV9TS1UKK2VuZGlmCisKK2VuZGlmCisjIGVuZGlmIG9mIGlmZXEgKCQoUlQyOHh4X01PREUpLFNUQSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMKKyMgQ29tbW9uIGNvbXBpbGVyIGZsYWcKKyMKKworCitpZmVxICgkKEhBU19FWFRfQlVJTERfQ0hBTk5FTF9MSVNUKSx5KQorV0ZMQUdTICs9IC1ERVhUX0JVSUxEX0NIQU5ORUxfTElTVAorZW5kaWYKKworaWZlcSAoJChDSElQU0VUKSwyODYwKQorV0ZMQUdTICs9LURSVDI4NjAKK2VuZGlmCisKK2lmZXEgKCQoQ0hJUFNFVCksMjg3MCkKK1dGTEFHUyArPS1EUlQyODcwCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSw1VlQpCisjV0ZMQUdTICs9IC1EQ09ORklHXzVWVF9FTkhBTkNFCitlbmRpZgorCitpZmVxICgkKEhBU19CTE9DS19ORVRfSUYpLHkpCitXRkxBR1MgKz0gLURCTE9DS19ORVRfSUYKK2VuZGlmCisKK2lmZXEgKCQoSEFTX0RGU19TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1EREZTX1NVUFBPUlQKK2VuZGlmCisKKyNpZmRlZiBNVUxUSV9DQVJECitpZmVxICgkKEhBU19NQ19TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1ETVVMVElQTEVfQ0FSRF9TVVBQT1JUCitlbmRpZgorI2VuZGlmIC8vIE1VTFRJX0NBUkQgLy8KKworaWZlcSAoJChIQVNfTExURCkseSkKK1dGTEFHUyArPSAtRExMVERfU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSVhQKQorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTgorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxNjApCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESUtBTk9TX1ZYXzFYMAorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxODApCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESUtBTk9TX1ZYXzFYMAorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSU5GX1RXSU5QQVNTKQorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElORl9UV0lOUEFTUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSU5GX0RBTlVCRSkKK1dGTEFHUyArPSAtRElORl9EQU5VQkUgLURSVF9CSUdfRU5ESUFOCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxDQVZNX09DVEVPTikKK1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4KK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLEJSQ01fNjM1OCkKK1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4KK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9BTUFaT05fU0UpCisjV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElORl9BTUFaT05fU0UgLURCR19GVF9TVVBQT1JUCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESU5GX0FNQVpPTl9TRQorZW5kaWYKKworI2tlcm5lbCBidWlsZCBvcHRpb25zIGZvciAyLjQKKyMgbW92ZSB0byBNYWtlZmlsZSBvdXRzaWRlIExJTlVYX1NSQyA6PSAvb3B0L3N0YXIva2VybmVsL2xpbnV4LTIuNC4yNy1zdGFyCisKK2lmZXEgKCQoUExBVEZPUk0pLFNUQVIpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtTzIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLVVhcm0gLWZuby1jb21tb24gLXBpcGUgLW1hcGNzLTMyIC1EX19MSU5VWF9BUk1fQVJDSF9fPTQgLW1hcmNoPWFybXY0ICAtbXNob3J0LWxvYWQtYnl0ZXMgLW1zb2Z0LWZsb2F0IC1VYXJtIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgJChMSU5VWF9TUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaCAkKFdGTEFHUykKKworZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksU0lHTUEpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtREVNODZYWF9DSElQPUVNODZYWF9DSElQSURfVEFOR08yIC1ERU04NlhYX1JFVklTSU9OPTYgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgLUkkKFJUMjg2MF9ESVIpL2luY2x1ZGUgLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PMiAgICAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlICAtbWFiaT0zMiAtbWFyY2g9bWlwczMycjIgLVdhLC0zMiAtV2EsLW1hcmNoPW1pcHMzMnIyIC1XYSwtbWlwczMycjIgLVdhLC0tdHJhcCAtRE1PRFVMRSAkKFdGTEFHUykKKworZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksU0lHTUFfODYyMikKK0NGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKENST1NTX0NPTVBJTEVfSU5DTFVERSkvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLU8yIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mbm8tY29tbW9uIC1waXBlIC1mbm8tYnVpbHRpbiAtRF9fbGludXhfXyAtRE5PX01NIC1tYXBjcy0zMiAtbWFyY2g9YXJtdjQgLW10dW5lPWFybTd0ZG1pIC1tc29mdC1mbG9hdCAtRE1PRFVMRSAtbXNob3J0LWxvYWQtYnl0ZXMgLW5vc3RkaW5jIC1pd2l0aHByZWZpeCAtRE1PRFVMRSAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLDVWVCkKK0NGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtbWxpdHRsZS1lbmRpYW4gLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1PMyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLW1hcGNzIC1tbm8tc2NoZWQtcHJvbG9nIC1tYWJpPWFwY3MtZ251IC1tbm8tdGh1bWItaW50ZXJ3b3JrIC1EX19MSU5VWF9BUk1fQVJDSF9fPTUgLW1hcmNoPWFybXY1dGUgLW10dW5lPWFybTkyNmVqLXMgLS1wYXJhbSBtYXgtaW5saW5lLWluc25zLXNpbmdsZT00MDAwMCAgLVVhcm0gLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVduby1wb2ludGVyLXNpZ24gLURNT0RVTEUgJChXRkxBR1MpCisKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTYwKQorQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgLW1hcmNoPWx4NDE4OSAtV2EsIC1ETU9EVUxFICQoV0ZMQUdTKQorZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxODApCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAtbWlwczMycjIgLVdhLCAtRE1PRFVMRSAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9UV0lOUEFTUykKK0NGTEFHUyA6PSAtRF9fS0VSTkVMX18gLURNT0RVTEUgLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLW1hcmNoPTRrYyAtbWlwczMyIC1XYSwtLXRyYXAgLXBpcGUgLW1sb25nLWNhbGxzICQoV0ZMQUdTKQorZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSU5GX0RBTlVCRSkKK0NGTEFHUyA6PSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAkKFdGTEFHUykgLVd1bmRlZiAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlIC1tc29mdC1mbG9hdCAgLW1hYmk9MzIgLW1hcmNoPW1pcHMzMiAtV2EsLTMyIC1XYSwtbWFyY2g9bWlwczMyIC1XYSwtbWlwczMyIC1XYSwtLXRyYXAgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLEJSQ01fNjM1OCkKK0NGTEFHUyA6PSAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLW5vc3RkaW5jIC1pd2l0aHByZWZpeCBpbmNsdWRlIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1JICQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlICAtZmlubGluZS1saW1pdD0xMDAwMDAgLW1hYmk9MzIgLW1hcmNoPW1pcHMzMiAtV2EsLTMyIC1XYSwtbWFyY2g9bWlwczMyIC1XYSwtbWlwczMyIC1XYSwtLXRyYXAgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWJjbTk2M3h4IC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljICAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1ETU9EVUxFIC1tbG9uZy1jYWxscworZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksUEMpCisgICAgaWZuZXEgKCwkKGZpbmRzdHJpbmcgMi40LCQoTElOVVhfU1JDKSkpCisJIyBMaW51eCAyLjQKKwlDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1waXBlIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgLW1hcmNoPWk2ODYgLURNT0RVTEUgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAkKExJTlVYX1NSQykvaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICQoV0ZMQUdTKQorCWV4cG9ydCBDRkxBR1MKKyAgICBlbHNlCisJIyBMaW51eCAyLjYKKwlFWFRSQV9DRkxBR1MgOj0gJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlCisgICAgZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElYUCkKKyAgICAgICAgRVhUUkFfQ0ZMQUdTIDo9IC12ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtbWJpZy1lbmRpYW4KK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLENBVk1fT0NURU9OKQorCUVYVFJBX0NGTEFHUyA6PSAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgXAorCQkJCSAgICAtbWFiaT02NCAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZGZzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmE2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIGRmcy5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBTdXBwb3J0IERGUyBmdW5jdGlvbi4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRm9uY2hpICAgIDAzLTEyLTIwMDcgICAgICBjcmVhdGVkCisqLworCisjZGVmaW5lIFJBREFSX1BVTFNFIDEKKyNkZWZpbmUgUkFEQVJfV0lEVEggMgorCisjZGVmaW5lIFdJRFRIX1JEX0lETEUgMAorI2RlZmluZSBXSURUSF9SRF9DSEVDSyAxCisKKworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBDVFNfUHJvdGVjdCwKKwlJTiBVSU5UOCBDVFNQZXJpb2QpOworCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUNoKTsKKworVUxPTkcgSmFwUmFkYXJUeXBlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUxPTkcgUlRNUEJicFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QUHJlcGFyZVJEQ1RTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVVMT05HCQkJRHVyYXRpb24sCisJSU4gIFVDSEFSICAgICAgICAgICBSVFNSYXRlLAorCUlOICBVTE9ORyAgICAgICAgICAgQ1RTQmFzZUFkZHIsCisJSU4gIFVDSEFSCQkJRnJhbWVHYXApOworCitWT0lEIFJUTVBQcmVwYXJlUmFkYXJEZXRlY3RQYXJhbXMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisKK0lOVCBTZXRfQ2hNb3ZpbmdUaW1lX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKK0lOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbGVhcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9sZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxOGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbGVhcC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWxlYXAuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKyNpZm5kZWYgX19MRUFQX0hfXworI2RlZmluZSBfX0xFQVBfSF9fCisKKy8vIE1lc3NhZ2VzIGZvciBBc3NvY2lhdGUgc3RhdGUgbWFjaGluZQorI2RlZmluZSBMRUFQX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgICAgICAzMAorCisjZGVmaW5lIExFQVBfTVNHX1JFUVVFU1RfSURFTlRJVFkgICAgICAgICAgIDMxCisjZGVmaW5lIExFQVBfTVNHX1JFUVVFU1RfTEVBUCAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIExFQVBfTVNHX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDMzCisjZGVmaW5lIExFQVBfTVNHX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDM0CisjZGVmaW5lIExFQVBfTVNHX1JFU1BPTlNFX0xFQVAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIExFQVBfTVNHX0VBUE9MS0VZICAgICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIExFQVBfTVNHX1VOS05PV04gICAgICAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIExFQVBfTVNHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CisvLyEgYXNzb2Mgc3RhdGUtbWFjaGluZSBzdGF0ZXMKKyNkZWZpbmUgTEVBUF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMRUFQX1dBSVRfSURFTlRJVFlfUkVRVUVTVCAgICAgICAgICAxCisjZGVmaW5lIExFQVBfV0FJVF9DSEFOTExFTkdFX1JFUVVFU1QgICAgICAgIDIKKyNkZWZpbmUgTEVBUF9XQUlUX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBMRUFQX1dBSVRfQ0hBTkxMRU5HRV9SRVNQT05TRSAgICAgICA0CisjZGVmaW5lIExFQVBfV0FJVF9FQVBPTEtFWSAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBMRUFQX1JFQVNPTl9JTlZBTElEX0FVVEggICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIExFQVBfUkVBU09OX0NIQUxMRU5HRV9GUk9NX0FQX0ZBSUxFRCAgICAgICAgMHgwMworI2RlZmluZSBMRUFQX1JFQVNPTl9DSEFMTEVOR0VfVE9fQVBfRkFJTEVEICAgICAgICAgIDB4MDQKKworI2RlZmluZSBDSVNDT19BdXRoTW9kZUxFQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0lTQ09fQXV0aE1vZGVMRUFQTm9uZSAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIExFQVBfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwMDAKKyNkZWZpbmUgTEVBUF9DSEFMTEVOR0VfUkVTUE9OU0VfTEVOR1RIICAgICAgICAgICAgICAyNAorI2RlZmluZSBMRUFQX0NIQUxMRU5HRV9SRVFVRVNUX0xFTkdUSCAgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQT0xfSEVBREVSXyB7CisgICAgVUNIQVIgICAgICAgVmVyc2lvbjsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKK30gTEVBUF9FQVBPTF9IRUFERVIsICpQTEVBUF9FQVBPTF9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0VBUE9MX1BBQ0tFVF8geworICAgIFVDSEFSICAgICAgIENvZGU7CisgICAgVUNIQVIgICAgICAgSWRlbnRpZmllcjsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGhbMl07CisgICAgVUNIQVIgICAgICAgVHlwZTsKK30gTEVBUF9FQVBPTF9QQUNLRVQsICpQTEVBUF9FQVBPTF9QQUNLRVQ7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0VBUF9DT05URU5UU18geworICAgIFVDSEFSICAgICAgIFZlcnNpb247CisgICAgVUNIQVIgICAgICAgUmVzZXJ2ZWQ7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoOworfSBMRUFQX0VBUF9DT05URU5UUywgKlBMRUFQX0VBUF9DT05URU5UUzsKKworLyoqKiBFQVBPTCBrZXkgKioqLwordHlwZWRlZiBzdHJ1Y3QgX0VBUE9MX0tFWV9IRUFERVJfIHsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKKyAgICBVQ0hBUiAgICAgICBDb3VudGVyWzhdOworICAgIFVDSEFSICAgICAgIElWWzE2XTsKKyAgICBVQ0hBUiAgICAgICBJbmRleDsKKyAgICBVQ0hBUiAgICAgICBTaWduYXR1cmVbMTZdOworfSBFQVBPTF9LRVlfSEVBREVSLCAqUEVBUE9MX0tFWV9IRUFERVI7CisKK0JPT0xFQU4gTGVhcE1zZ1R5cGVTdWJzdCgKKyAgICBJTiAgVUNIQVIgICBFQVBUeXBlLAorICAgIE9VVCBVTE9ORyAgICpNc2dUeXBlKTsKKworVk9JRCBMZWFwTWFjaGluZVBlcmZvcm1BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAgICAqUywKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwTWFjSGVhZGVySW5pdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisgICAgSU4gIE9VVCBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgICAgIHdlcCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBwQWRkcjMpOworCitWT0lEIExlYXBTdGFydEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwSWRlbnRpdHlBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcFBlZXJDaGFsbGVuZ2VBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgSGFzaFB3ZCgKKyAgICBJTiAgUFVDSEFSICBwd2QsCisgICAgSU4gIElOVCAgICAgcHdkbGVuLAorICAgIE9VVCBQVUNIQVIgIGhhc2gpOworCitWT0lEIFBlZXJDaGFsbGVuZ2VSZXNwb25zZSgKKyAgICBJTiAgUFVDSEFSICBzekNoYWxsZW5nZSwKKyAgICBJTiAgUFVDSEFSICBzbWJQYXNzd2QsCisgICAgT1VUIFBVQ0hBUiAgc3pSZXNwb25zZSk7CisKK1ZPSUQgUGFyaXR5S2V5KAorICAgIE9VVCBQVUNIQVIgIHN6T3V0LAorICAgIElOICBQVUNIQVIgIHN6SW4pOworCitWT0lEIERlc0tleSgKKyAgICBPVVQgVUxPTkcgICBrWzE2XVsyXSwKKyAgICBJTiAgUFVDSEFSICBrZXksCisgICAgSU4gIElOVCAgICAgZGVjcnlwdCk7CisKK1ZPSUQgRGVzKAorICAgIElOICBVTE9ORyAgIGtzWzE2XVsyXSwKKyAgICBPVVQgVUNIQVIgICBibG9ja1s4XSk7CisKK1ZPSUQgRGVzRW5jcnlwdCgKKyAgICBJTiAgUFVDSEFSICBzekNsZWFyLAorICAgIElOICBQVUNIQVIgIHN6S2V5LAorICAgIE9VVCBQVUNIQVIgIHN6T3V0KTsKKworVk9JRCBMZWFwTmV0d29ya0NoYWxsZW5nZUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwTmV0d29ya0NoYWxsZW5nZVJlc3BvbnNlKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIEhhc2hwd2RIYXNoKAorICAgIElOICBQVUNIQVIgIGhhc2gsCisgICAgSU4gIFBVQ0hBUiAgaGFzaGhhc2gpOworCitWT0lEIFByb2Nlc3NTZXNzaW9uS2V5KAorICAgIE9VVCBQVUNIQVIgIFNlc3Npb25LZXksCisgICAgSU4gIFBVQ0hBUiAgaGFzaDIsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlVG9SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlUmVzcG9uc2VGcm9tUmFkaXVzLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZUZyb21SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlUmVzcG9uc2VUb1JhZGl1cyk7CisKK1ZPSUQgTGVhcEVhcG9sS2V5QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIFJvZ3VlQXBUYWJsZUluaXQoCisgICAgSU4gUk9HVUVBUF9UQUJMRSAgICAqVGFiKTsKKworVUxPTkcgUm9ndWVBcFRhYmxlU2VhcmNoKAorICAgIElOIFJPR1VFQVBfVEFCTEUgICAgKlRhYiwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBSb2d1ZUFwRW50cnlTZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFJPR1VFQVBfRU5UUlkgICAqcFJvZ3VlQXAsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKKyAgICBJTiBVQ0hBUiAgICAgICAgICAgIEZhaWxlQ29kZSk7CisKK1VMT05HIFJvZ3VlQXBUYWJsZVNldEVudHJ5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIE9VVCBST0dVRUFQX1RBQkxFICAqVGFiLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICAgICBGYWlsZUNvZGUpOworCitWT0lEIFJvZ3VlQXBUYWJsZURlbGV0ZUVudHJ5KAorICAgIElOIE9VVCBST0dVRUFQX1RBQkxFICpUYWIsCisgICAgSU4gUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBMZWFwQXV0aFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMZWFwU2VuZFJvZ3VlQVBSZXBvcnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIENDS01Bc3NvY1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICpNc2csCisgICAgSU4gVUxPTkcgICAgICAgICAgICBNc2dMZW4pOworCisjZW5kaWYgIC8vIF9fTEVBUF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbGlua19saXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xpbmtfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTIxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xpbmtfbGlzdC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTElOS19MSVNUX0hfXworI2RlZmluZSBfX0xJTktfTElTVF9IX18KKwordHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUlkKK3sKKwlzdHJ1Y3QgX0xJU1RfRU5UUlkgKnBOZXh0OworfSBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9MSVNUX0hFQURSCit7CisJUExJU1RfRU5UUlkgcEhlYWQ7CisJUExJU1RfRU5UUlkgcFRhaWw7CisJVUNIQVIgc2l6ZTsKK30gTElTVF9IRUFERVIsICpQTElTVF9IRUFERVI7CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBpbml0TGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QpCit7CisJcExpc3QtPnBIZWFkID0gcExpc3QtPnBUYWlsID0gTlVMTDsKKwlwTGlzdC0+c2l6ZSA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFZPSUQgaW5zZXJ0VGFpbExpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0LAorCUlOIFBMSVNUX0VOVFJZIHBFbnRyeSkKK3sKKwlwRW50cnktPnBOZXh0ID0gTlVMTDsKKwlpZiAocExpc3QtPnBUYWlsKQorCQlwTGlzdC0+cFRhaWwtPnBOZXh0ID0gcEVudHJ5OworCWVsc2UKKwkJcExpc3QtPnBIZWFkID0gcEVudHJ5OworCXBMaXN0LT5wVGFpbCA9IHBFbnRyeTsKKwlwTGlzdC0+c2l6ZSsrOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIHJlbW92ZUhlYWRMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlQTElTVF9FTlRSWSBwTmV4dDsKKwlQTElTVF9FTlRSWSBwRW50cnk7CisKKwlwRW50cnkgPSBwTGlzdC0+cEhlYWQ7CisJaWYgKHBMaXN0LT5wSGVhZCAhPSBOVUxMKQorCXsKKwkJcE5leHQgPSBwTGlzdC0+cEhlYWQtPnBOZXh0OworCQlwTGlzdC0+cEhlYWQgPSBwTmV4dDsKKwkJaWYgKHBOZXh0ID09IE5VTEwpCisJCQlwTGlzdC0+cFRhaWwgPSBOVUxMOworCQlwTGlzdC0+c2l6ZS0tOworCX0KKwlyZXR1cm4gcEVudHJ5OworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRMaXN0U2l6ZSgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QpCit7CisJcmV0dXJuIHBMaXN0LT5zaXplOworfQorCitzdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIGRlbEVudHJ5TGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QsCisJSU4gUExJU1RfRU5UUlkgcEVudHJ5KQoreworCVBMSVNUX0VOVFJZIHBDdXJFbnRyeTsKKwlQTElTVF9FTlRSWSBwUHJ2RW50cnk7CisKKwlpZihwTGlzdC0+cEhlYWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZihwRW50cnkgPT0gcExpc3QtPnBIZWFkKQorCXsKKwkJcEN1ckVudHJ5ID0gcExpc3QtPnBIZWFkOworCQlwTGlzdC0+cEhlYWQgPSBwQ3VyRW50cnktPnBOZXh0OworCisJCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQorCQkJcExpc3QtPnBUYWlsID0gTlVMTDsKKworCQlwTGlzdC0+c2l6ZS0tOworCQlyZXR1cm4gcEN1ckVudHJ5OworCX0KKworCXBQcnZFbnRyeSA9IHBMaXN0LT5wSGVhZDsKKwlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OworCXdoaWxlKHBDdXJFbnRyeSAhPSBOVUxMKQorCXsKKwkJaWYgKHBFbnRyeSA9PSBwQ3VyRW50cnkpCisJCXsKKwkJCXBQcnZFbnRyeS0+cE5leHQgPSBwQ3VyRW50cnktPnBOZXh0OworCisJCQlpZihwRW50cnkgPT0gcExpc3QtPnBUYWlsKQorCQkJCXBMaXN0LT5wVGFpbCA9IHBQcnZFbnRyeTsKKworCQkJcExpc3QtPnNpemUtLTsKKwkJCWJyZWFrOworCQl9CisJCXBQcnZFbnRyeSA9IHBDdXJFbnRyeTsKKwkJcEN1ckVudHJ5ID0gcFBydkVudHJ5LT5wTmV4dDsKKwl9CisKKwlyZXR1cm4gcEN1ckVudHJ5OworfQorCisjZW5kaWYgLy8gX19fTElOS19MSVNUX0hfXyAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU1YjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDQuaApAQCAtMCwwICsxLDQyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTUQ0X0hfXworI2RlZmluZSBfX01ENF9IX18KKworLyogTUQ0IGNvbnRleHQuICovCit0eXBlZGVmCXN0cnVjdAlfTUQ0X0NUWF8JeworCVVMT05HCXN0YXRlWzRdOyAgICAgICAgLyogc3RhdGUgKEFCQ0QpICovCisJVUxPTkcJY291bnRbMl07ICAgICAgICAvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KKwlVQ0hBUglidWZmZXJbNjRdOyAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworfQlNRDRfQ1RYOworCitWT0lEIE1ENEluaXQgKE1ENF9DVFggKik7CitWT0lEIE1ENFVwZGF0ZSAoTUQ0X0NUWCAqLCBQVUNIQVIsIFVJTlQpOworVk9JRCBNRDRGaW5hbCAoVUNIQVIgWzE2XSwgTUQ0X0NUWCAqKTsKKworI2VuZGlmIC8vX19NRDRfSF9fClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1ZGIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbWQ1LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlqYW4JCQkxMC0yOC0wMwkJSW5pdGlhbAorCVJpdGEgICAgCTExLTIzLTA0CQlNb2RpZnkgTUQ1IGFuZCBTSEEtMQorKi8KKworI2lmbmRlZgl1aW50OAorI2RlZmluZQl1aW50OCAgdW5zaWduZWQJY2hhcgorI2VuZGlmCisKKyNpZm5kZWYJdWludDMyCisjZGVmaW5lCXVpbnQzMiB1bnNpZ25lZAlsb25nIGludAorI2VuZGlmCisKKworI2lmbmRlZglfX01ENV9IX18KKyNkZWZpbmUJX19NRDVfSF9fCisKKyNkZWZpbmUgTUQ1X01BQ19MRU4gMTYKKwordHlwZWRlZiBzdHJ1Y3QgX01ENV9DVFggeworICAgIFVJTlQzMiAgIEJ1Zls0XTsgICAgICAgICAgICAgLy8gYnVmZmVycyBvZiBmb3VyIHN0YXRlcworCVVDSEFSICAgSW5wdXRbNjRdOyAgICAgICAgICAvLyBpbnB1dCBtZXNzYWdlCisJVUlOVDMyICAgTGVuSW5CaXRDb3VudFsyXTsgICAvLyBsZW5ndGggY291bnRlciBmb3IgaW5wdXQgbWVzc2FnZSwgMCB1cCB0byA2NCBiaXRzCit9ICAgTUQ1X0NUWDsKKworVk9JRCBNRDVJbml0KE1ENV9DVFggKnBDdHgpOworVk9JRCBNRDVVcGRhdGUoTUQ1X0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcyk7CitWT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpOworVk9JRCBNRDVUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls0XSwgVUlOVDMyIE1lc1sxNl0pOworCit2b2lkIG1kNV9tYWModTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpOwordm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7CisKKy8vCisvLyBTSEEgY29udGV4dAorLy8KK3R5cGVkZWYJc3RydWN0IF9TSEFfQ1RYCit7CisJVUlOVDMyICAgQnVmWzVdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZpdmUgc3RhdGVzCisJVUNIQVIgICBJbnB1dFs4MF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKKwlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKKworfQlTSEFfQ1RYOworCitWT0lEIFNIQUluaXQoU0hBX0NUWCAqcEN0eCk7CitVQ0hBUiBTSEFVcGRhdGUoU0hBX0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcyk7CitWT0lEIFNIQUZpbmFsKFNIQV9DVFggKnBDdHgsIFVDSEFSIERpZ2VzdFsyMF0pOworVk9JRCBTSEFUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls1XSwgVUlOVDMyIE1lc1syMF0pOworCisjZGVmaW5lIFNIQV9ESUdFU1RfTEVOIDIwCisjZW5kaWYgLy8gX19NRDVfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmCV9BRVNfSAorI2RlZmluZQlfQUVTX0gKKwordHlwZWRlZglzdHJ1Y3QKK3sKKwl1aW50MzIgZXJrWzY0XTsJCS8qIGVuY3J5cHRpb24gcm91bmQJa2V5cyAqLworCXVpbnQzMiBkcmtbNjRdOwkJLyogZGVjcnlwdGlvbiByb3VuZAlrZXlzICovCisJaW50CW5yOwkJCQkvKiBudW1iZXIgb2Ygcm91bmRzCSovCit9CithZXNfY29udGV4dDsKKworaW50CSBydG1wX2Flc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCAqa2V5LAlpbnQJbmJpdHMgKTsKK3ZvaWQgcnRtcF9hZXNfZW5jcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7Cit2b2lkIHJ0bXBfYWVzX2RlY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApOworCit2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpOworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7CisKKyNlbmRpZiAvKiBhZXMuaAkqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWxtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjYxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaApAQCAtMCwwICsxLDE0NDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbWxtZS5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZwkyMDAzLTA4LTI4CQlDcmVhdGVkCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICAgIG1vZGlmaWVkIGZvciBSVDI2MDAKKworKi8KKyNpZm5kZWYgX19NTE1FX0hfXworI2RlZmluZSBfX01MTUVfSF9fCisKKy8vIG1heGltdW0gc3VwcG9ydGVkIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gLQorLy8gRVNTLCBJQlNTLCBQcml2YWN5LCBTaG9ydCBQcmVhbWJsZSwgU3BlY3RydW0gbWdtdCwgU2hvcnQgU2xvdAorI2RlZmluZSBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPICAgMHgwNTMzCisKKyNkZWZpbmUgRU5EX09GX0FSR1MgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIExGU1JfTUFTSyAgICAgICAgICAgICAgICAgICAweDgwMDAwMDU3CisjZGVmaW5lIE1MTUVfVEFTS19FWEVDX0lOVFYgICAgICAgICAxMDAvKjIwMCovICAgICAgIC8vCisjZGVmaW5lIExFQURfVElNRSAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICAgICAgIDEwICAvKjUqLyAgICAgICAvLyBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIE1MTUVfVEFTS19FWEVDX0lOVFYgPSAxIHNlYworI2RlZmluZSBSRU9SREVSX0VYRUNfSU5UViAgICAgICAgIAkxMDAgICAgICAgLy8gMC4xIHNlYworCisvLyBUaGUgZGVmaW5pdGlvbiBvZiBSYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uCisjZGVmaW5lIENFCQkwCisjZGVmaW5lIEZDQwkJMQorI2RlZmluZSBKQVAJCTIKKyNkZWZpbmUgSkFQX1c1MwkzCisjZGVmaW5lIEpBUF9XNTYJNAorI2RlZmluZSBNQVhfUkRfUkVHSU9OIDUKKworI2lmZGVmCU5ESVM1MV9NSU5JUE9SVAorI2RlZmluZSBCRUFDT05fTE9TVF9USU1FICAgICAgICAgICAgNDAwMCAgICAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYworI2Vsc2UKKyNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQgKiBPU19IWiAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYworI2VuZGlmCisKKyNkZWZpbmUgRExTX1RJTUVPVVQgICAgICAgICAgICAgICAgIDEyMDAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIEFVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAzMDAgICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBBU1NPQ19USU1FT1VUICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgSk9JTl9USU1FT1VUICAgICAgICAgICAgICAgIDIgKiBPU19IWiAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgU0hPUlRfQ0hBTk5FTF9USU1FICAgICAgICAgIDkwICAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIE1JTl9DSEFOTkVMX1RJTUUgICAgICAgICAgICAxMTAgICAgICAgIC8vIHVuaXQ6IG1zZWMsIGZvciBkdWFsIGJhbmQgc2NhbgorI2RlZmluZSBNQVhfQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTQwICAgICAgIC8vIHVuaXQ6IG1zZWMsIGZvciBzaW5nbGUgYmFuZCBzY2FuCisjZGVmaW5lCUZBU1RfQUNUSVZFX1NDQU5fVElNRQkgICAgMzAgCQkgIC8vIEFjdGl2ZSBzY2FuIHdhaXRpbmcgZm9yIHByb2JlIHJlc3BvbnNlIHRpbWUKKyNkZWZpbmUgQ1dfTUlOX0lOX0JJVFMgICAgICAgICAgICAgIDQgICAgICAgICAvLyBhY3R1YWwgQ3dNaW4gPSAyXkNXX01JTl9JTl9CSVRTIC0gMQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKyNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwICAgICAgICAvLyBhY3R1YWwgQ3dNYXggPSAyXkNXX01BWF9JTl9CSVRTIC0gMQorI2VuZGlmCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorZXh0ZXJuIFVJTlQzMiBDV19NQVhfSU5fQklUUzsKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisvLyBOb3RlOiBSU1NJX1RPX0RCTV9PRkZTRVQgaGFzIGJlZW4gY2hhbmdlZCB0byB2YXJpYWJsZSBmb3IgbmV3IFJGICgyMDA0LTA3MjApLgorLy8gU0hvdWxkIG5vdCByZWZlciB0byB0aGlzIGNvbnN0YW50IGFueW1vcmUKKy8vI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgICAgICAgICAgMTIwIC8vIGZvciBSVDI1MzAgUlNTSS0xMTUgPSBkQm0KKyNkZWZpbmUgUlNTSV9GT1JfTUlEX1RYX1BPV0VSICAgICAgIC01NSAgLy8gLTU1IGRiIGlzIGNvbnNpZGVyZWQgbWlkLWRpc3RhbmNlCisjZGVmaW5lIFJTU0lfRk9SX0xPV19UWF9QT1dFUiAgICAgICAtNDUgIC8vIC00NSBkYiBpcyBjb25zaWRlcmVkIHZlcnkgc2hvcnQgZGlzdGFuY2UgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxpZ2libGUgdG8gdXNlIGEgbG93ZXIgVFggcG93ZXIKKyNkZWZpbmUgUlNTSV9GT1JfTE9XRVNUX1RYX1BPV0VSICAgIC0zMAorLy8jZGVmaW5lIE1JRF9UWF9QT1dFUl9ERUxUQSAgICAgICAgICAwICAgLy8gMCBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiBtaWQtZGlzdGFuY2UgdG8gQVAKKyNkZWZpbmUgTE9XX1RYX1BPV0VSX0RFTFRBICAgICAgICAgIDYgICAgLy8gLTMgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gdmVyeSBzaG9ydCBkaXN0YW5jZS4gMSBncmFkZSBpcyAwLjUgZGIKKyNkZWZpbmUgTE9XRVNUX1RYX1BPV0VSX0RFTFRBICAgICAgIDE2ICAgLy8gLTggZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gc2hvcnRlc3QgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCisKKyNkZWZpbmUgUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQgICAgIDAKKyNkZWZpbmUgUlNTSV9UUklHR0VSRURfVVBPTl9FWENDRUVEX1RIUkVTSE9MRCAgIDEKKyNkZWZpbmUgUlNTSV9USFJFU0hPTERfRk9SX1JPQU1JTkcgICAgICAgICAgICAgIDI1CisjZGVmaW5lIFJTU0lfREVMVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisKKy8vIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uCisjZGVmaW5lIENRSV9JU19HT09EKGNxaSkgICAgICAgICAgICAoKGNxaSkgPj0gNTApCisvLyNkZWZpbmUgQ1FJX0lTX0ZBSVIoY3FpKSAgICAgICAgICAoKChjcWkpID49IDIwKSAmJiAoKGNxaSkgPCA1MCkpCisjZGVmaW5lIENRSV9JU19QT09SKGNxaSkgICAgICAgICAgICAoY3FpIDwgNTApICAvLygoKGNxaSkgPj0gNSkgJiYgKChjcWkpIDwgMjApKQorI2RlZmluZSBDUUlfSVNfQkFEKGNxaSkgICAgICAgICAgICAgKGNxaSA8IDUpCisjZGVmaW5lIENRSV9JU19ERUFEKGNxaSkgICAgICAgICAgICAoY3FpID09IDApCisKKy8vIHdlaWdodGluZyBmYWN0b3IgdG8gY2FsY3VsYXRlIENoYW5uZWwgcXVhbGl0eSwgdG90YWwgc2hvdWxkIGJlIDEwMCUKKyNkZWZpbmUgUlNTSV9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgVFhfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgUlhfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgMjAKKworI2RlZmluZSBCU1NfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBNQVhfTEVOX09GX01MTUVfUVVFVUUgICAgICAgICAgICA0MCAvLzEwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgU0NBTl9QQVNTSVZFICAgICAgICAgICAgICAgICAgICAgMTgJCS8vIHNjYW4gd2l0aCBubyBwcm9iZSByZXF1ZXN0LCBvbmx5IHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorI2RlZmluZSBTQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxOQkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKyNkZWZpbmUJU0NBTl9DSVNDT19QQVNTSVZFCQkJCSAyMAkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuCisjZGVmaW5lCVNDQU5fQ0lTQ09fQUNUSVZFCQkJCSAyMQkJLy8gU2luZ2xlIGNoYW5uZWwgYWN0aXZlIHNjYW4KKyNkZWZpbmUJU0NBTl9DSVNDT19OT0lTRQkJCQkgMjIJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3Igbm9pc2UgaGlzdG9ncmFtIGNvbGxlY3Rpb24KKyNkZWZpbmUJU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQJCQkgMjMJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3IgY2hhbm5lbCBsb2FkIGNvbGxlY3Rpb24KKyNkZWZpbmUgRkFTVF9TQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgMjQJCS8vIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIFNDQU5fMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgICAgIDI2CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisjZGVmaW5lIE1BQ19BRERSX0lTX0dST1VQKEFkZHIpICAgICAgICgoKEFkZHJbMF0pICYgMHgwMSkpCisjZGVmaW5lIE1BQ19BRERSX0hBU0goQWRkcikgICAgICAgICAgICAoQWRkclswXSBeIEFkZHJbMV0gXiBBZGRyWzJdIF4gQWRkclszXSBeIEFkZHJbNF0gXiBBZGRyWzVdKQorI2RlZmluZSBNQUNfQUREUl9IQVNIX0lOREVYKEFkZHIpICAgICAgKE1BQ19BRERSX0hBU0goQWRkcikgJSBIQVNIX1RBQkxFX1NJWkUpCisjZGVmaW5lIFRJRF9NQUNfSEFTSChBZGRyLFRJRCkgICAgICAgICAgICAoVElEXkFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKKyNkZWZpbmUgVElEX01BQ19IQVNIX0lOREVYKEFkZHIsVElEKSAgICAgIChUSURfTUFDX0hBU0goQWRkcixUSUQpICUgSEFTSF9UQUJMRV9TSVpFKQorCisvLyBMRUQgQ29udHJvbAorLy8gYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlCisvLyBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmCisjZGVmaW5lIEFTSUNfTEVEX0FDVF9PTihwQWQpICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMzFlNDYpCisjZGVmaW5lIEFTSUNfTEVEX0FDVF9PRkYocEFkKSAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMDFlNDYpCisKKy8vIGJpdCBkZWZpbml0aW9uIG9mIHRoZSAyLWJ5dGUgcEJFQUNPTi0+Q2FwYWJpbGl0eSBmaWVsZAorI2RlZmluZSBDQVBfSVNfRVNTX09OKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDAwMSkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0lCU1NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDIpICE9IDApCisjZGVmaW5lIENBUF9JU19DRl9QT0xMQUJMRV9PTih4KSAgICAgICAgICgoKHgpICYgMHgwMDA0KSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTF9SRVFfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwOCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1BSSVZBQ1lfT04oeCkgICAgICAgICAgICAgKCgoeCkgJiAweDAwMTApICE9IDApCisjZGVmaW5lIENBUF9JU19TSE9SVF9QUkVBTUJMRV9PTih4KSAgICAgICgoKHgpICYgMHgwMDIwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfUEJDQ19PTih4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDA0MCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0FHSUxJVFlfT04oeCkgICAgICAgICAgICAgKCgoeCkgJiAweDAwODApICE9IDApCisjZGVmaW5lIENBUF9JU19TUEVDVFJVTV9NR01UKHgpICAgICAgICAgICgoKHgpICYgMHgwMTAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorI2RlZmluZSBDQVBfSVNfUU9TKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDIwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX1NIT1JUX1NMT1QoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDA0MDApICE9IDApCisjZGVmaW5lIENBUF9JU19BUFNEKHgpICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwODAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorI2RlZmluZSBDQVBfSVNfSU1NRURfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MTAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0RTU1NfT0ZETSh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDIwMDApICE9IDApCisjZGVmaW5lIENBUF9JU19ERUxBWV9CQSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHg0MDAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorCisjZGVmaW5lIENBUF9HRU5FUkFURShlc3MsaWJzcyxwcml2LHNfcHJlLHNfc2xvdCxzcGVjdHJ1bSkgICgoKGVzcykgPyAweDAwMDEgOiAweDAwMDApIHwgKChpYnNzKSA/IDB4MDAwMiA6IDB4MDAwMCkgfCAoKHByaXYpID8gMHgwMDEwIDogMHgwMDAwKSB8ICgoc19wcmUpID8gMHgwMDIwIDogMHgwMDAwKSB8ICgoc19zbG90KSA/IDB4MDQwMCA6IDB4MDAwMCkgfCAoKHNwZWN0cnVtKSA/IDB4MDEwMCA6IDB4MDAwMCkpCisKKyNkZWZpbmUgRVJQX0lTX05PTl9FUlBfUFJFU0VOVCh4KSAgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKSAgICAvLyA4MDIuMTFnCisjZGVmaW5lIEVSUF9JU19VU0VfUFJPVEVDVElPTih4KSAgICAgICAgICgoKHgpICYgMHgwMikgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRSh4KSAgICAoKCh4KSAmIDB4MDQpICE9IDApICAgIC8vIDgwMi4xMWcKKworI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4Ly8gMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkKKyNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEJBX05PVFVTRSAJMgorLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUKKyNkZWZpbmUgSU1NRURfQkEgCTEKKyNkZWZpbmUgREVMQVlfQkEJMAorCisvLyBCQSBJbml0aWF0b3Igc3ViZmllbGQgaW4gREVMQkEgZnJhbWUKKyNkZWZpbmUgT1JJR0lOQVRPUgkxCisjZGVmaW5lIFJFQ0lQSUVOVAkwCisKKy8vIEFEREJBIFN0YXR1cyBDb2RlCisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfU1VDQ0VTUwkJCQkJMAorI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1JFRlVTRUQJCQkJCTM3CisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfSU5WQUxJRF9QQVJBTUVURVJTCQkJMzgKKworLy8gREVMQkEgUmVhc29uIENvZGUKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9RU1RBX0xFQVZJTkcJCQkJMzYKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9FTkRfQkEJCQkJCQkzNworI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1VOS05PV05fQkEJCQkJCTM4CisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfVElNRU9VVAkJCQkJMzkKKworLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisjZGVmaW5lIFJFU0VUX09ORV9TRUNfVFhfQ05UKF9fcEVudHJ5KSBcCitpZiAoKChfX3BFbnRyeSkpICE9IE5VTEwpIFwKK3sgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4RmFpbENvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOyBcCit9CisKKy8vCisvLyA4MDIuMTEgZnJhbWUgZm9ybWF0cworLy8KKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlMU0lHVHhvcFByb1N1cDoxOworCVVTSE9SVAlGb3J0eV9NaHpfSW50b2xlcmFudDoxOworCVVTSE9SVAlQU01QOjE7CisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCUFNc2R1U2l6ZToxOworCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0CisJVVNIT1JUCVJ4U1RCQzoyOworCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7CisJVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKKwlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7CisJVVNIT1JUCUFkdkNvZGluZzoxOworI2Vsc2UKKwlVU0hPUlQJQWR2Q29kaW5nOjE7CisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21vbWkgcG93ZXIgc2FmZQorCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CisJVVNIT1JUCURlbGF5ZWRCQToxOwkvL3J0Mjg2MGMgbm90IHN1cHBvcnQKKwlVU0hPUlQJQU1zZHVTaXplOjE7CS8vIG9ubHkgc3VwcG9ydCBhcyB6ZXJvCisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCVBTTVA6MTsKKwlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKKwlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKKyNlbmRpZgkvKiAhUlRfQklHX0VORElBTiAqLworfSBIVF9DQVBfSU5GTywgKlBIVF9DQVBfSU5GTzsKKworLy8gIEhUIENhcGFiaWxpdHkgSU5GTyBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2OjM7Ly9tb21pIHBvd2VyIHNhZmUKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworI2Vsc2UKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ0FQX1BBUk0sICpQSFRfQ0FQX1BBUk07CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJTUNTU2V0WzEwXTsKKwlVQ0hBUglTdXBSYXRlWzJdOyAgLy8gdW5pdCA6IDFNYnBzCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjozOworCVVDSEFSCU1wZHVEZW5zaXR5OjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglUeFJ4Tm90RXF1YWw6MTsKKwlVQ0hBUglUeE1DU1NldERlZmluZWQ6MTsKKyNlbHNlCisJVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7CisJVUNIQVIJVHhSeE5vdEVxdWFsOjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglNcGR1RGVuc2l0eToxOworCVVDSEFSCXJzdjozOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlVQ0hBUglyc3YzWzNdOworfSBIVF9NQ1NfU0VULCAqUEhUX01DU19TRVQ7CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3YyOjQ7CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlQbHVzSFRDOjE7CS8vK0hUQyBjb250cm9sIGZpZWxkIHN1cHBvcnQKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJUGNvOjE7CisjZWxzZQorCVVTSE9SVAlQY286MTsKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlyc3YyOjQ7CisjZW5kaWYgLyogUlRfQklHX0VORElBTiAqLworfSBFWFRfSFRfQ0FQX0lORk8sICpQRVhUX0hUX0NBUF9JTkZPOworCisvLyAgSFQgQmVhbWZvcm1pbmcgZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQkZfQ0FQeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVTE9ORwlyc3Y6MzsKKwlVTE9ORwlDaGFuRXN0aW1hdGlvbjoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTWluR3JvdXBpbmc6MjsKKwlVTE9ORwlFeHBDb21CRjoyOworCVVMT05HCUV4cE5vQ29tQkY6MjsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBOb0NvbVN0ZWVyQ2FwYWJsZToxOworCVVMT05HCUV4cENTSUNhcGFibGU6MTsKKwlVTE9ORwlDYWxpYnJhdGlvbjoyOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJVHhORFBDYXBhYmxlOjE7CisJVUxPTkcJUnhORFBDYXBhYmxlOjE7CisJVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlSeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisjZWxzZQorCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisJVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlUeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVJ4TkRQQ2FwYWJsZToxOworCVVMT05HCVR4TkRQQ2FwYWJsZToxOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJQ2FsaWJyYXRpb246MjsKKwlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7CisJVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBOb0NvbUJGOjI7CisJVUxPTkcJRXhwQ29tQkY6MjsKKwlVTE9ORwlNaW5Hcm91cGluZzoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTm9Db21TdGVlckJGQW50U3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKKwlVTE9ORwlyc3Y6MzsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEhUX0JGX0NBUCwgKlBIVF9CRl9DQVA7CisKKy8vICBIVCBhbnRlbm5hIHNlbGVjdGlvbiBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9BU19DQVB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJUnhBU2VsOjE7CisJVUNIQVIJQW50SW5kRmJrOjE7CisJVUNIQVIJRXhwQ1NJRmJrOjE7CisJVUNIQVIJQW50SW5kRmJrVHhBU0VMOjE7CisJVUNIQVIJRXhwQ1NJRmJrVHhBU0VMOjE7CisJVUNIQVIJQW50U2VsZWN0OjE7CisjZWxzZQorCVVDSEFSCUFudFNlbGVjdDoxOworCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOworCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOworCVVDSEFSCUV4cENTSUZiazoxOworCVVDSEFSCUFudEluZEZiazoxOworCVVDSEFSCVJ4QVNlbDoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJcnN2OjE7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBIVF9BU19DQVAsICpQSFRfQVNfQ0FQOworCisvLyBEcmFmdCAxLjAgc2V0IElFIGxlbmd0aCAyNiwgYnV0IGlzIGV4dGVuc2libGUuLgorI2RlZmluZSBTSVpFX0hUX0NBUF9JRQkJMjYKKy8vIFRoZSBzdHJ1Y3R1cmUgZm9yIEhUIENhcGFiaWxpdHkgSUUuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0NBUEFCSUxJVFlfSUV7CisJSFRfQ0FQX0lORk8JCUh0Q2FwSW5mbzsKKwlIVF9DQVBfUEFSTQkJSHRDYXBQYXJtOworLy8JSFRfTUNTX1NFVAkJSHRNQ1NTZXQ7CisJVUNIQVIJCQlNQ1NTZXRbMTZdOworCUVYVF9IVF9DQVBfSU5GTwlFeHRIdENhcEluZm87CisJSFRfQkZfQ0FQCQlUeEJGQ2FwOwkvLyBiZWFtZm9ybWluZyBjYXAuIHJ0Mjg2MGMgbm90IHN1cHBvcnQgYmVhbWZvcm1pbmcuCisJSFRfQVNfQ0FQCQlBU0NhcDsJLy9hbnRlbm5hIHNlbGVjdGlvbi4KK30gSFRfQ0FQQUJJTElUWV9JRSwgKlBIVF9DQVBBQklMSVRZX0lFOworCisKKy8vIDgwMi4xMW4gZHJhZnQzIHJlbGF0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zLgorLy8gNy4zLjIuNjAKKyNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvLyBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIGFjdGl2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExT0JTU1NjYW5BY3RpdmVEd2VsbAkJCQkJCQkxMAkvLyBpbiBUVS5taW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gcGFzc2l2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsCQkJCQkzMDAgIC8vIGluIHNlYy4gbWF4IGludGVydmFsIGJldHdlZW4gc2NhbiBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgQlNTIGNoYW5uZWwgd2lkdGggdHJpZ2dlciBldmVudHMuCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMDAJLy8gaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIHBhc3NpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMAkvL2luIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBhY3RpdmUgT0JTUyBzY2FuCisjZGVmaW5lIGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcgkJCTUJLy8gbWluIHJhdGlvIGJldHdlZW4gdGhlIGRlbGF5IHRpbWUgaW4gcGVyZm9ybWluZyBhIHN3aXRjaCBmcm9tIDIwTUh6IEJTUyB0byAyMC80MCBCU1Mgb3BlcmF0aW9uIGFuZCB0aGUgbWF4aW1hCisJCQkJCQkJCQkJCQkJCQkJLy8JaW50ZXJ2YWwgYmV0d2VlbiBvdmVybGFwcGluZyBCU1Mgc2NhbiBvcGVyYXRpb25zLgorI2RlZmluZSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZAkJCQkJCTI1CS8vIGluICUlLCBtYXggdG90YWwgdGltZSB0aGF0IGEgU1RBIG1heSBiZSBhY3RpdmUgb24gdGhlIG1lZGl1bSBkdXJpbmcgYSBwZXJpb2Qgb2YKKwkJCQkJCQkJCQkJCQkJCQkvLwkoZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yICogZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwpIHNlY29uZHMgd2l0aG91dAorCQkJCQkJCQkJCQkJCQkJCS8vCWJlaW5nIG9ibGlnYXRlZCB0byBwZXJmb3JtIE9CU1MgU2NhbiBvcGVyYXRpb25zLiBkZWZhdWx0IGlzIDI1KD09IDAuMjUlKQorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX09WRVJMQVBfQlNTX1NDQU5fSUV7CisJVVNIT1JUCQlTY2FuUGFzc2l2ZUR3ZWxsOworCVVTSE9SVAkJU2NhbkFjdGl2ZUR3ZWxsOworCVVTSE9SVAkJVHJpZ2dlclNjYW5JbnQ7CQkJCS8vIFRyaWdnZXIgc2NhbiBpbnRlcnZhbAorCVVTSE9SVAkJUGFzc2l2ZVRhbFBlckNoYW5uZWw7CQkvLyBwYXNzaXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlBY3RpdmVUYWxQZXJDaGFubmVsOwkJLy8gYWN0aXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlEZWxheUZhY3RvcjsJCQkJLy8gQlNTIHdpZHRoIGNoYW5uZWwgdHJhbnNpdGlvbiBkZWxheSBmYWN0b3IKKwlVU0hPUlQJCVNjYW5BY3RUaHJlOwkJCQkvLyBTY2FuIEFjdGl2aXR5IHRocmVzaG9sZAorfU9WRVJMQVBfQlNTX1NDQU5fSUUsICpQT1ZFUkxBUF9CU1NfU0NBTl9JRTsKKworCisvLyAgNy4zLjIuNTYuIDIwLzQwIENvZXhpc3RlbmNlIGVsZW1lbnQgdXNlZCBpbiAgRWxlbWVudCBJRCA9IDcyID0gSUVfMjA0MF9CU1NfQ09FWElTVAordHlwZWRlZiB1bmlvbiBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfSUV7Cisgc3RydWN0IFBBQ0tFRCB7CisgI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6NTsKKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CisJVUNIQVIJSW50b2xlcmFudDQwOjE7CisJVUNIQVIJSW5mb1JlcToxOworICNlbHNlCisJVUNIQVIJSW5mb1JlcToxOworCVVDSEFSCUludG9sZXJhbnQ0MDoxOwkJCS8vIEludGVyLUJTUy4gc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQlNTIGZyb20gb3BlcmF0aW5nIGFzIGEgMjAvNDAgTWh6IEJTUy4KKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CQkvLyBJbnRyYS1CU1Mgc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQVAgZnJvbSBvcGVyYXRpbmcgaXRzIEJTUyBhcyBhIDIwLzQwTUh6IEJTUy4KKwlVQ0hBUglyc3Y6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisgICAgfSBmaWVsZDsKKyBVQ0hBUiAgIHdvcmQ7Cit9IEJTU18yMDQwX0NPRVhJU1RfSUUsICpQQlNTXzIwNDBfQ09FWElTVF9JRTsKKworCit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRBeworCUJPT0xFQU4JCQliVmFsaWQ7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUmVnQ2xhc3M7CS8vIFJlZ3VsYXRvcnkgQ2xhc3MKKwlVU0hPUlQJQ2hhbm5lbDsKKwlVTE9ORwlDRENvdW50ZXI7ICAgLy8gTWFpbnRhaW4gYSBzZXBlcmF0ZSBjb3VudCBkb3duIGNvdW50ZXIgZm9yIGVhY2ggRXZlbnQgQS4KK30gVFJJR0dFUl9FVkVOVEEsICpQVFJJR0dFUl9FVkVOVEE7CisKKy8vIDIwLzQwIHRyaWdnZXIgZXZlbnQgdGFibGUKKy8vIElmIG9uZSBFdmVudCBBIGRlbGV0ZSBvciBjcmVhdGVkLCBvciBpZiBFdmVudCBCIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4KKyNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0Cit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRfVEFCeworCVVDSEFSCUV2ZW50QU5vOworCVRSSUdHRVJfRVZFTlRBCUV2ZW50QVtNQVhfVFJJR0dFUl9FVkVOVF07CisJVUxPTkcJCQlFdmVudEJDb3VudERvd247CS8vIENvdW50IGRvd24gY291bnRlciBmb3IgRXZlbnQgQi4KK30gVFJJR0dFUl9FVkVOVF9UQUIsICpQVFJJR0dFUl9FVkVOVF9UQUI7CisKKy8vIDcuMy4yNyAyMC80MCBCc3MgQ29leGlzdGVuY2UgTWdtdCBjYXBhYmlsaXR5IHVzZWQgaW4gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIElFKCBJRCA9IDEyNyA9IElFX0VYVF9DQVBBQklMSVRZKS4KKy8vCVRoaXMgaXMgdGhlIGZpcnN0IG9jdGV0IGFuZCB3YXMgZGVmaW5lZCBpbiA4MDIuMTFuIEQzLjAzIGFuZCA4MDIuMTF5RDkuMAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FWFRfQ0FQX0lORk9fRUxFTUVOVHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2Mjo1OworCVVDSEFSCUV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwlVQ0hBUglyc3Y6MTsKKwlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKKyNlbHNlCisJVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7CisJVUNIQVIJcnN2OjE7CisJVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOworCVVDSEFSCXJzdjI6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9RVhUX0NBUF9JTkZPX0VMRU1FTlQsICpQRVhUX0NBUF9JTkZPX0VMRU1FTlQ7CisKKworLy8gODAyLjExbiA3LjMuMi42MQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlR7CisJVUNIQVIJCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfQ09FWElTVCA9IDcyCisJVUNIQVIJCQkJCUxlbjsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0SWU7Cit9QlNTXzIwNDBfQ09FWElTVF9FTEVNRU5ULCAqUEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVDsKKworCisvLzgwMi4xMW4gNy4zLjIuNTkKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlR7CisJVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczCisJVUNIQVIJCQkJTGVuOworCVVDSEFSCQkJCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUgkJCQlDaExpc3RbMF07Cit9QlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQsICpQQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQ7CisKKworLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFfU1dJVENIX0FOTk9VTkNFX0lFeworCVVDSEFSCQkJU3dpdGNoTW9kZTsJLy9jaGFubmVsIHN3aXRjaCBtb2RlCisJVUNIQVIJCQlOZXdDaGFubmVsOwkvLworCVVDSEFSCQkJU3dpdGNoQ291bnQ7CS8vCit9IENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUsICpQQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRTsKKworCisvLyBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1NFQ19DSEFfT0ZGU0VUX0lFeworCVVDSEFSCQkJU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsJIC8vIDE6IFNlY29uZGFyeSBhYm92ZSwgMzogU2Vjb25kYXJ5IGJlbG93LCAwOiBubyBTZWNvbmRhcnkKK30gU0VDX0NIQV9PRkZTRVRfSUUsICpQU0VDX0NIQV9PRkZTRVRfSUU7CisKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gc3RydWN0IFJUX0hUX0NBUEFCSUxJVFkKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOCQkJYkh0RW5hYmxlOwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCUJPT0xFQU4JCQliUHJlTkh0OwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCS8vU3Vic3RyYWN0IGZyb20gSFQgQ2FwYWJpbGl0eSBJRQorCVVDSEFSCQkJTUNTU2V0WzE2XTsJLy9vbmx5IHN1cG9vcnQgTUNTPTAtMTUsMzIgLAorfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKKworLy9UaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuCisvL0ZlYXR1cmVzIG5vdCBsaXN0ZWQgaGVyZSBidXQgY29udGFpbmVkIGluIDgwMi4xMW4gc3BlYyBhcmUgbm90IHN1cHBvcnRlZCBpbiBydDI4NjAuCit0eXBlZGVmIHN0cnVjdCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3Y6NTsKKwlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKKwlVU0hPUlQJQW1zZHVFbmFibGU6MTsJLy8gRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuCisJVVNIT1JUCVJ4U1RCQzoyOwkvLyAyIGJpdHMKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6CisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworI2Vsc2UKKwlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7CisJVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCisJVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKKwlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7CisJVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6CisJVVNIT1JUCVR4U1RCQzoxOworCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCisJVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgorCVVTSE9SVAlBbXNkdVNpemU6MTsJLy8gTWF4IHJlY2VpdmluZyBBLU1TRFUgc2l6ZQorCVVTSE9SVAlyc3Y6NTsKKyNlbmRpZgorCisJLy9TdWJzdHJhY3QgZnJvbSBBZGRpb250IEhUIElORk8gSUUKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJUmVjb21XaWR0aDoxOworCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZyAJVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsgZnJvbSA4MDIuMTFuCisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKyNlbHNlCisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgorCVVDSEFSCVJlY29tV2lkdGg6MTsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3YyOjExOworCVVTSE9SVAlPQlNTX05vbkhURXhpc3Q6MTsKKwlVU0hPUlQJcnN2MzoxOworCVVTSE9SVAlOb25HZlByZXNlbnQ6MTsKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisjZWxzZQorCVVTSE9SVAlPcGVyYWlvbk1vZGU6MjsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCXJzdjM6MTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjI6MTE7CisjZW5kaWYKKworCS8vIE5ldyBFeHRlbnNpb24gQ2hhbm5lbCBPZmZzZXQgSUUKKwlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OworCS8vIEV4dGVuc2lvbiBDYXBhYmlsaXR5IElFID0gMTI3CisJVUNIQVIJQlNTQ29leGlzdDIwNDA7Cit9IFJUX0hUX0NBUEFCSUxJVFksICpQUlRfSFRfQ0FQQUJJTElUWTsKKworLy8gICBmaWVsZCBpbiBBZGR0aW9uYWwgSFQgSW5mb3JtYXRpb24gSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJU2VySW50ZXJHcmFudTozOworCVVDSEFSCVNfUFNNUFN1cDoxOworCVVDSEFSCVJpZnNNb2RlOjE7CisJVUNIQVIJUmVjb21XaWR0aDoxOworCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKKyNlbHNlCisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOworCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglSaWZzTW9kZToxOworCVVDSEFSCVNfUFNNUFN1cDoxOwkgLy9JbmRpY2F0ZSBzdXBwb3J0IGZvciBzY2hlZHVsZWQgUFNNUAorCVVDSEFSCVNlckludGVyR3JhbnU6MzsJIC8vc2VydmljZSBpbnRlcnZhbCBncmFudWxhcml0eQorI2VuZGlmCit9IEFERF9IVElORk8sICpQQUREX0hUSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2MjoxMTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjoxOworCVVTSE9SVAlOb25HZlByZXNlbnQ6MTsKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisjZWxzZQorCVVTSE9SVAlPcGVyYWlvbk1vZGU6MjsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCXJzdjoxOworCVVTSE9SVAlPQlNTX05vbkhURXhpc3Q6MTsKKwlVU0hPUlQJcnN2MjoxMTsKKyNlbmRpZgorfSBBRERfSFRJTkZPMiwgKlBBRERfSFRJTkZPMjsKKworCisvLyBUT0RPOiBOZWVkIHN5bmMgd2l0aCBzcGVjIGFib3V0IHRoZSBkZWZpbml0aW9uIG9mIFN0YmNNY3MuIEluIERyYWZ0IDMuMDMsIGl0J3MgcmVzZXJ2ZWQuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUR7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3Y6NDsKKwlVU0hPUlQJUGNvUGhhc2U6MTsKKwlVU0hPUlQJUGNvQWN0aXZlOjE7CisJVVNIT1JUCUxzaWdUeG9wUHJvdDoxOworCVVTSE9SVAlTVEJDQmVhY29uOjE7CisJVVNIT1JUCUR1YWxDVFNQcm90ZWN0OjE7CisJVVNIT1JUCUR1YWxCZWFjb246MTsKKwlVU0hPUlQJU3RiY01jczo2OworI2Vsc2UKKwlVU0hPUlQJU3RiY01jczo2OworCVVTSE9SVAlEdWFsQmVhY29uOjE7CisJVVNIT1JUCUR1YWxDVFNQcm90ZWN0OjE7CisJVVNIT1JUCVNUQkNCZWFjb246MTsKKwlVU0hPUlQJTHNpZ1R4b3BQcm90OjE7CS8vIEwtU0lHIFRYT1AgcHJvdGVjdGlvbiBmdWxsIHN1cHBvcnQKKwlVU0hPUlQJUGNvQWN0aXZlOjE7CisJVVNIT1JUCVBjb1BoYXNlOjE7CisJVVNIT1JUCXJzdjo0OworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KK30gQUREX0hUSU5GTzMsICpQQUREX0hUSU5GTzM7CisKKyNkZWZpbmUgU0laRV9BRERfSFRfSU5GT19JRQkJMjIKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUR7CisJVUNIQVIJCQkJQ29udHJvbENoYW47CisJQUREX0hUSU5GTwkJCUFkZEh0SW5mbzsKKwlBRERfSFRJTkZPMgkJCUFkZEh0SW5mbzI7CisJQUREX0hUSU5GTzMJCQlBZGRIdEluZm8zOworCVVDSEFSCQkJCU1DU1NldFsxNl07CQkvLyBCYXNpYyBNQ1Mgc2V0Cit9IEFERF9IVF9JTkZPX0lFLCAqUEFERF9IVF9JTkZPX0lFOworCit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEeworCVVDSEFSCQkJCU5ld0V4dENoYW5PZmZzZXQ7Cit9IE5FV19FWFRfQ0hBTl9JRSwgKlBORVdfRVhUX0NIQU5fSUU7CisKKworLy8gNC1ieXRlIEhUQyBmaWVsZC4gIG1heWJlIGluY2x1ZGVkIGluIGFueSBmcmFtZSBleGNlcHQgbm9uLVFPUyBkYXRhIGZyYW1lLiAgVGhlIE9yZGVyIGJpdCBtdXN0IHNldCAxLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVUlOVDMyCQlSREc6MTsJLy9SREcgLyBNb3JlIFBQRFUKKyAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQorICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50CisgICAgVUlOVDMyCQlDU0lTVEVFUklORzoyOwkvL0NTSS8gU1RFRVJJTkcKKyAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQorICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCisgICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQorICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCisgICAgVUlOVDMyCQlNUlNvckFTSTozOwkvLyBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4KKyAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKKyAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKKyAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQorI2Vsc2UKKyAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQorICAgIFVJTlQzMgkJVFJROjE7CS8vc291bmRpbmcgcmVxdWVzdAorICAgIFVJTlQzMgkJTVJROjE7CS8vTUNTIGZlZWRiYWNrLiBSZXF1ZXN0IGZvciBhIE1DUyBmZWVkYmFjaworICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCisgICAgVUlOVDMyCQlNRlM6MzsJLy9TRVQgdG8gdGhlIHJlY2VpdmVkIHZhbHVlIG9mIE1SUy4gMHgxMTEgZm9yIHVuc29saWNpdGVkIE1GQi4KKyAgICBVSU5UMzIJCU1GQm9yQVNDOjc7CS8vTGluayBhZGFwdGF0aW9uIGZlZWRiYWNrIGNvbnRhaW5pbmcgcmVjb21tZW5kZWQgTUNTLiAweDdmIGZvciBubyBmZWVkYmFjayBvciBub3QgYXZhaWxhYmxlCisgICAgVUlOVDMyCQlDYWxQb3M6MjsJLy8gY2FsaWJyYXRpb24gcG9zaXRpb24KKyAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQorICAgIFVJTlQzMgkJRkJLUmVxOjI7CS8vZmVlZGJhY2sgcmVxdWVzdAorICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCisgICAgVUlOVDMyCQlaTEZBbm5vdWNlOjE7CS8vIFpMRiBhbm5vdW5jZW1lbnQKKyAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQorICAgIFVJTlQzMgkJQUNDb25zdHJhaW50OjE7CS8vZmVlZGJhY2sgcmVxdWVzdAorICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ09OVFJPTCwgKlBIVF9DT05UUk9MOworCisvLyAyLWJ5dGUgUU9TIENPTlRST0wgZmllbGQKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFR4b3BfUXVldWVTaXplOjg7CisgICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7CisgICAgVVNIT1JUICAgICAgQWNrUG9saWN5OjI7ICAvLzA6IG5vcm1hbCBBQ0sgMTpObyBBQ0sgMjpzY2hlZHVsZWQgdW5kZXIgTVRCQS9QU01QICAzOiBCQQorICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgRU9TUDoxOworICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKKyAgICBVU0hPUlQgICAgICBBTXNkdVByZXNlbnQ6MTsKKyAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IFFPU19DT05UUk9MLCAqUFFPU19DT05UUk9MOworCisvLyAyLWJ5dGUgRnJhbWUgY29udHJvbCBmaWVsZAordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCQlPcmRlcjoxOwkJCS8vIFN0cmljdCBvcmRlciBleHBlY3RlZAorCVVTSE9SVAkJV2VwOjE7CQkJCS8vIFdlcCBkYXRhCisJVVNIT1JUCQlNb3JlRGF0YToxOwkJCS8vIE1vcmUgZGF0YSBiaXQKKwlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAorCVVTSE9SVAkJUmV0cnk6MTsJCQkvLyBSZXRyeSBzdGF0dXMgYml0CisJVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0CisJVVNIT1JUCQlGckRzOjE7CQkJCS8vIEZyb20gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJVG9EczoxOwkJCQkvLyBUbyBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCisJVVNIT1JUCQlUeXBlOjI7CQkJCS8vIE1TRFUgdHlwZQorCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KKyNlbHNlCisJVVNIT1JUCQlWZXI6MjsJCQkJLy8gUHJvdG9jb2wgdmVyc2lvbgorCVVTSE9SVAkJVHlwZToyOwkJCQkvLyBNU0RVIHR5cGUKKwlVU0hPUlQJCVN1YlR5cGU6NDsJCQkvLyBNU0RVIHN1YnR5cGUKKwlVU0hPUlQJCVRvRHM6MTsJCQkJLy8gVG8gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJRnJEczoxOwkJCQkvLyBGcm9tIERTIGluZGljYXRpb24KKwlVU0hPUlQJCU1vcmVGcmFnOjE7CQkJLy8gTW9yZSBmcmFnbWVudCBiaXQKKwlVU0hPUlQJCVJldHJ5OjE7CQkJLy8gUmV0cnkgc3RhdHVzIGJpdAorCVVTSE9SVAkJUHdyTWdtdDoxOwkJCS8vIFBvd2VyIG1hbmFnZW1lbnQgYml0CisJVVNIT1JUCQlNb3JlRGF0YToxOwkJCS8vIE1vcmUgZGF0YSBiaXQKKwlVU0hPUlQJCVdlcDoxOwkJCQkvLyBXZXAgZGF0YQorCVVTSE9SVAkJT3JkZXI6MTsJCQkvLyBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBGUkFNRV9DT05UUk9MLCAqUEZSQU1FX0NPTlRST0w7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSEVBREVSXzgwMl8xMQl7CisgICAgRlJBTUVfQ09OVFJPTCAgIEZDOworICAgIFVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKyAgICBVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCUFkZHIzW01BQ19BRERSX0xFTl07CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworCVVTSE9SVAkJCUZyYWc6NDsKKyNlbHNlCisJVVNIT1JUCQkJRnJhZzo0OworCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCisJVUNIQVIJCQlPY3RldFswXTsKK30JSEVBREVSXzgwMl8xMSwgKlBIRUFERVJfODAyXzExOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FXzgwMl8xMSB7CisgICAgSEVBREVSXzgwMl8xMSAgIEhkcjsKKyAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOworfSAgIEZSQU1FXzgwMl8xMSwgKlBGUkFNRV84MDJfMTE7CisKKy8vIFFvU051bGwgZW1iZWRkaW5nIG9mIG1hbmFnZW1lbnQgYWN0aW9uLiBXaGVuIEhUIENvbnRyb2wgTUEgZmllbGQgc2V0IHRvIDEuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01BX0JPRFkgeworICAgIFVDSEFSICAgICAgICAgICAgQ2F0ZWdvcnk7CisgICAgVUNIQVIgICAgICAgICAgICBBY3Rpb247CisgICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKK30gICBNQV9CT0RZLCAqUE1BX0JPRFk7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSEVBREVSXzgwMl8zCXsKKyAgICBVQ0hBUiAgICAgICAgICAgREFBZGRyMVtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBTQUFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIE9jdGV0WzJdOworfQlIRUFERVJfODAyXzMsICpQSEVBREVSXzgwMl8zOworLy8vL0Jsb2NrIEFDSyByZWxhdGVkIGZvcm1hdAorLy8gMi1ieXRlIEJBIFBhcmFtZXRlciAgZmllbGQgIGluIAlERUxCQSBmcmFtZXMgdG8gdGVybWluYXRlIGFuIGFscmVhZHkgc2V0IHVwIGJBCit0eXBlZGVmIHN0cnVjdCBQQUNLRUR7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworICAgIFVTSE9SVCAgICAgIEluaXRpYXRvcjoxOwkvLyAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50CisgICAgVVNIT1JUICAgICAgUnN2OjExOwkvLyBhbHdheXMgc2V0IHRvIDAKKyNlbHNlCisgICAgVVNIT1JUICAgICAgUnN2OjExOwkvLyBhbHdheXMgc2V0IHRvIDAKKyAgICBVU0hPUlQgICAgICBJbml0aWF0b3I6MTsJLy8gMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudAorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IERFTEJBX1BBUk0sICpQREVMQkFfUEFSTTsKKworLy8gMi1ieXRlIEJBIFBhcmFtZXRlciBTZXQgZmllbGQgIGluIEFEREJBIGZyYW1lcyB0byBzaWduYWwgcGFybSBmb3Igc2V0dGluZyB1cCBhIEJBCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBCdWZTaXplOjEwOwkvLyBudW1iZXIgb2YgYnVmZmUgb2Ygc2l6ZSAyMzA0IG9jdGV0c3IKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyAgICBVU0hPUlQgICAgICBCQVBvbGljeToxOwkvLyAxOiBpbW1lZGlhdGVseSBCQSAgICAwOmRlbGF5ZWQgQkEKKyAgICBVU0hPUlQgICAgICBBTVNEVVN1cHBvcnRlZDoxOwkvLyAwOiBub3QgcGVybWl0dGVkCQkxOiBwZXJtaXR0ZWQKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQU1TRFVTdXBwb3J0ZWQ6MTsJLy8gMDogbm90IHBlcm1pdHRlZAkJMTogcGVybWl0dGVkCisgICAgVVNIT1JUICAgICAgQkFQb2xpY3k6MTsJLy8gMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBCisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisgICAgVVNIT1JUICAgICAgQnVmU2l6ZToxMDsJLy8gbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFfUEFSTSwgKlBCQV9QQVJNOworCisvLyAyLWJ5dGUgQkEgU3RhcnRpbmcgU2VxIENPTlRST0wgZmllbGQKK3R5cGVkZWYgdW5pb24gUEFDS0VEIHsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgU3RhcnRTZXE6MTI7ICAgLy8gc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSAxc3QgTVNEVSBmb3Igd2hpY2ggdGhpcyBCQVIgaXMgc2VudAorCVVTSE9SVCAgICAgIEZyYWdOdW06NDsJLy8gYWx3YXlzIHNldCB0byAwCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEZyYWdOdW06NDsJLy8gYWx3YXlzIHNldCB0byAwCisJVVNIT1JUICAgICAgU3RhcnRTZXE6MTI7ICAgLy8gc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSAxc3QgTVNEVSBmb3Igd2hpY2ggdGhpcyBCQVIgaXMgc2VudAorI2VuZGlmIC8qIFJUX0JJR19FTkRJQU4gKi8KKyAgICB9ICAgZmllbGQ7CisgICAgVVNIT1JUICAgICAgICAgICB3b3JkOworfSBCQVNFUV9DT05UUk9MLCAqUEJBU0VRX0NPTlRST0w7CisKKy8vQkFDb250cm9sIGFuZCBCQVJDb250cm9sIGFyZSB0aGUgc2FtZQorLy8gMi1ieXRlIEJBIENPTlRST0wgZmllbGQgaW4gQkEgZnJhbWUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL0VXQyBWMS4yNAorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyBvbmx5IHJlbGF0ZWQgdG8gTi1EZWxheWVkIEJBLiBCdXQgbm90IHN1cHBvcnQgaW4gUlQyODYwYi4gMDpOb3JtYWxBQ0sgIDE6Tm8gQUNLCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyBvbmx5IHJlbGF0ZWQgdG8gTi1EZWxheWVkIEJBLiBCdXQgbm90IHN1cHBvcnQgaW4gUlQyODYwYi4gMDpOb3JtYWxBQ0sgIDE6Tm8gQUNLCisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9FV0MgVjEuMjQKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgUnN2Ojk7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFfQ09OVFJPTCwgKlBCQV9DT05UUk9MOworCisvLyAyLWJ5dGUgQkFSIENPTlRST0wgZmllbGQgaW4gQkFSIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gMDpub3JtYWwgYWNrLCAgMTpubyBhY2suCisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9pZiB0aGlzIGJpdDEsIHVzZSAgRlJBTUVfTVRCQV9SRVEsICBpZiAwLCB1c2UgRlJBTUVfQkFfUkVRCisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBCQVJfQ09OVFJPTCwgKlBCQVJfQ09OVFJPTDsKKworLy8gQkFSQ29udHJvbCBpbiBNVEJBUiBmcmFtZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgTnVtVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIE51bVRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IE1UQkFSX0NPTlRST0wsICpQTVRCQVJfQ09OVFJPTDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MToxMjsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgUnN2MToxMjsKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBQRVJfVElEX0lORk8sICpQUEVSX1RJRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisJUEVSX1RJRF9JTkZPICAgICAgUGVyVElEOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSBFQUNIX1RJRCwgKlBFQUNIX1RJRDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1BTUE9MTF9GUkFNRSB7CisgICAgRlJBTUVfQ09OVFJPTCAgIEZDOworICAgIFVTSE9SVCAgICAgICAgICBBaWQ7CisgICAgVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIFRhW01BQ19BRERSX0xFTl07Cit9ICAgUFNQT0xMX0ZSQU1FLCAqUFBTUE9MTF9GUkFNRTsKKwordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SVFNfRlJBTUUJeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Cit9UlRTX0ZSQU1FLCAqUFJUU19GUkFNRTsKKworLy8gQkFSRVEgQU5EIE1UQkFSRVEgaGF2ZSB0aGUgc2FtZSBzdWJ0eXBlIEJBUiwgODAyLjExbiBCQVIgdXNlIGNvbXByZXNzZWQgYml0bWFwLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQV9SRVEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wgIEJBUkNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Cit9ICAgRlJBTUVfQkFfUkVRLCAqUEZSQU1FX0JBX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBX1JFUSB7CisJRlJBTUVfQ09OVFJPTCAgIEZDOworCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlNVEJBUl9DT05UUk9MICBNVEJBUkNvbnRyb2w7CisJUEVSX1RJRF9JTkZPCVBlclRJREluZm87CisJQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Cit9ICAgRlJBTUVfTVRCQV9SRVEsICpQRlJBTUVfTVRCQV9SRVE7CisKKy8vIENvbXByZXNzZWQgZm9ybWF0IGlzIG1hbmRhbnRvcnkgaW4gSFQgU1RBCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX01UQkEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFfQ09OVFJPTCAgQkFDb250cm9sOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworCVVDSEFSCQlCaXRNYXBbOF07Cit9ICAgRlJBTUVfTVRCQSwgKlBGUkFNRV9NVEJBOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1BTTVBfQUNUSU9OIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlVQ0hBUglQc21wOwkvLyA3LjMuMS4yNQorfSAgIEZSQU1FX1BTTVBfQUNUSU9OLCAqUEZSQU1FX1BTTVBfQUNUSU9OOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FDVElPTl9IRFIgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworfSAgIEZSQU1FX0FDVElPTl9IRFIsICpQRlJBTUVfQUNUSU9OX0hEUjsKKworLy9BY3Rpb24gRnJhbWUKKy8vQWN0aW9uIEZyYW1lICBDYXRlZ29yeTpTcGVjdHJ1bSwgIEFjdGlvbjpDaGFubmVsIFN3aXRjaC4gNy4zLjIuMjAKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UgeworCVVDSEFSCQkJCQlFbGVtZW50SUQ7CS8vIElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UID0gMzcKKwlVQ0hBUgkJCQkJTGVuOworCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ1NBbm5vdW5jZUllOworfSAgIENIQU5fU1dJVENIX0FOTk9VTkNFLCAqUENIQU5fU1dJVENIX0FOTk9VTkNFOworCisKKy8vODAyLjExbiA6IDcuMy4yLjIwYQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNPTkRfQ0hBTl9PRkZTRVQgeworCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVCA9IDYyCisJVUNIQVIJCQkJTGVuOworCVNFQ19DSEFfT0ZGU0VUX0lFCVNlY0NoT2Zmc2V0SWU7Cit9ICAgU0VDT05EX0NIQU5fT0ZGU0VULCAqUFNFQ09ORF9DSEFOX09GRlNFVDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1NQRVRSVU1fQ1MgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCUNIQU5fU1dJVENIX0FOTk9VTkNFCUNTQW5ub3VuY2U7CisJU0VDT05EX0NIQU5fT0ZGU0VUCQlTZWNvbmRDaGFubmVsOworfSAgIEZSQU1FX1NQRVRSVU1fQ1MsICpQRlJBTUVfU1BFVFJVTV9DUzsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JFUSB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CS8vIDEKKwlCQV9QQVJNCQlCYVBhcm07CSAgICAgIC8vICAyIC0gMTAKKwlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsJLy8gMCAtIDAKKwlCQVNFUV9DT05UUk9MCUJhU3RhcnRTZXE7IC8vIDAtMAorfSAgIEZSQU1FX0FEREJBX1JFUSwgKlBGUkFNRV9BRERCQV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUlNQIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlVQ0hBUglUb2tlbjsKKwlVU0hPUlQJU3RhdHVzQ29kZTsKKwlCQV9QQVJNCQlCYVBhcm07IC8vMCAtIDIKKwlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKK30gICBGUkFNRV9BRERCQV9SU1AsICpQRlJBTUVfQUREQkFfUlNQOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0RFTEJBX1JFUSB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJREVMQkFfUEFSTQkJRGVsYmFQYXJtOworCVVTSE9SVAlSZWFzb25Db2RlOworfSAgIEZSQU1FX0RFTEJBX1JFUSwgKlBGUkFNRV9ERUxCQV9SRVE7CisKKworLy83LjIuMS43Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBUiB7CisJRlJBTUVfQ09OVFJPTCAgIEZDOworCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX0JBUiwgKlBGUkFNRV9CQVI7CisKKy8vNy4yLjEuNwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQSB7CisJRlJBTUVfQ09OVFJPTCAgIEZDOworCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOworCVVDSEFSCQliaXRtYXNrWzhdOworfSAgIEZSQU1FX0JBLCAqUEZSQU1FX0JBOworCisKKy8vIFJhZGlvIE1lYXN1ZW1lbnQgUmVxdWVzdCBGcmFtZSBGb3JtYXQKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfUk1fUkVRX0FDVElPTiB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CisJVVNIT1JUCVJlcGV0aXRpb247CisJVUNIQVIgICBkYXRhWzBdOworfSAgIEZSQU1FX1JNX1JFUV9BQ1RJT04sICpQRlJBTUVfUk1fUkVRX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKwlVQ0hBUgkJSUQ7CisJVUNIQVIJCUxlbmd0aDsKKwlVQ0hBUgkJQ2hhbm5lbFN3aXRjaE1vZGU7CisJVUNIQVIJCU5ld1JlZ0NsYXNzOworCVVDSEFSCQlOZXdDaGFubmVsTnVtOworCVVDSEFSCQlDaGFubmVsU3dpdGNoQ291bnQ7Cit9IEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUsICpQSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRTsKKworCisvLworLy8gX0xpbWl0IG11c3QgYmUgdGhlIDIqKm4gLSAxCisvLyBfU0VRMSAsIF9TRVEyIG11c3QgYmUgd2l0aGluIDAgfiBfTGltaXQKKy8vCisjZGVmaW5lIFNFUV9TVEVQT05FKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExID09ICgoX1NFUTIrMSkgJiBfTGltaXQpKSkKKyNkZWZpbmUgU0VRX1NNQUxMRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpCisjZGVmaW5lIFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgIT0gX1NFUTIpICYmICEoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKSkKKyNkZWZpbmUgU0VRX1dJVEhJTl9XSU4oX1NFUTEsIF9TRVEyLCBfV0lOLCBfTGltaXQpIChTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KSAmJiAgXAorCQkJCQkJCQkJCQkJU0VRX1NNQUxMRVIoX1NFUTEsICgoX1NFUTIrX1dJTisxKSZfTGltaXQpLCBfTGltaXQpKQorCisvLworLy8gQ29udGVudGlvbi1mcmVlIHBhcmFtZXRlciAod2l0aG91dCBJRCBhbmQgTGVuZ3RoKQorLy8KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgVUNIQVIgICAgICAgQ2ZwQ291bnQ7CisgICAgVUNIQVIgICAgICAgQ2ZwUGVyaW9kOworICAgIFVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgICAgIENmcER1clJlbWFpbmluZzsKK30gQ0ZfUEFSTSwgKlBDRl9QQVJNOworCit0eXBlZGVmCXN0cnVjdAlfQ0lQSEVSX1NVSVRFCXsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyOwkJLy8gVW5pY2FzdCBjaXBoZXIgMSwgdGhpcyBvbmUgaGFzIG1vcmUgc2VjdXJlZCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyQXV4OwkvLyBVbmljYXN0IGNpcGhlciAyIGlmIEFQIGFubm91bmNlIHR3byB1bmljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUdyb3VwQ2lwaGVyOwkvLyBHcm91cCBjaXBoZXIKKwlVU0hPUlQJCQkJCQkJUnNuQ2FwYWJpbGl0eTsJLy8gUlNOIGNhcGFiaWxpdHkgZnJvbSBiZWFjb24KKwlCT09MRUFOCQkJCQkJCWJNaXhNb2RlOwkJLy8gSW5kaWNhdGUgUGFpciAmIEdyb3VwIGNpcGhlciBtaWdodCBiZSBkaWZmZXJlbnQKK30JQ0lQSEVSX1NVSVRFLCAqUENJUEhFUl9TVUlURTsKKworLy8gRURDQSBjb25maWd1cmF0aW9uIGZyb20gQVAncyBCRUFDT04vUHJvYmVSc3AKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKKyAgICBCT09MRUFOICAgICBiQWRkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYlFBY2s7CisgICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKKyAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYkFQU0RDYXBhYmxlOworLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKKyAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7CisgICAgVUNIQVIgICAgICAgQWlmc25bNF07ICAgICAgIC8vIDA6QUNfQkssIDE6QUNfQkUsIDI6QUNfVkksIDM6QUNfVk8KKyAgICBVQ0hBUiAgICAgICBDd21pbls0XTsKKyAgICBVQ0hBUiAgICAgICBDd21heFs0XTsKKyAgICBVU0hPUlQgICAgICBUeG9wWzRdOyAgICAgIC8vIGluIHVuaXQgb2YgMzItdXMKKyAgICBCT09MRUFOICAgICBiQUNNWzRdOyAgICAgIC8vIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkKK30gRURDQV9QQVJNLCAqUEVEQ0FfUEFSTTsKKworLy8gUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgVVNIT1JUICAgICAgU3RhTnVtOworICAgIFVDSEFSICAgICAgIENoYW5uZWxVdGlsaXphdGlvbjsKKyAgICBVU0hPUlQgICAgICBSZW1haW5pbmdBZG1pc3Npb25Db250cm9sOyAgLy8gaW4gdW5pdCBvZiAzMi11cworfSBRQlNTX0xPQURfUEFSTSwgKlBRQlNTX0xPQURfUEFSTTsKKworLy8gUUJTUyBJbmZvIGZpZWxkIGluIFFTVEEncyBhc3NvYyByZXEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCQlSc3YyOjE7CisJVUNIQVIJCU1heFNQTGVuZ3RoOjI7CisJVUNIQVIJCVJzdjE6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfQkU6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfQks6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfVkk6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfVk86MTsKKyNlbHNlCisgICAgVUNIQVIJCVVBUFNEX0FDX1ZPOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZJOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JLOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JFOjE7CisJVUNIQVIJCVJzdjE6MTsKKwlVQ0hBUgkJTWF4U1BMZW5ndGg6MjsKKwlVQ0hBUgkJUnN2MjoxOworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IFFCU1NfU1RBX0lORk9fUEFSTSwgKlBRQlNTX1NUQV9JTkZPX1BBUk07CisKKy8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRQVAncyBCZWFjb24vUHJvYmVSc3AKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCQlVQVBTRDoxOworCVVDSEFSCQlSc3Y6MzsKKyAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OworI2Vsc2UKKyAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OworCVVDSEFSCQlSc3Y6MzsKKwlVQ0hBUgkJVUFQU0Q6MTsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRQlNTX0FQX0lORk9fUEFSTSwgKlBRQlNTX0FQX0lORk9fUEFSTTsKKworLy8gUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCisvLyBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYlFBY2s7CisgICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKKyAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7CisvLyAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOworICAgIFVDSEFSICAgICAgIEVkY2FVcGRhdGVDb3VudDsKK30gUU9TX0NBUEFCSUxJVFlfUEFSTSwgKlBRT1NfQ0FQQUJJTElUWV9QQVJNOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICAgICAgSUVMZW47CisgICAgVUNIQVIgICAgICAgSUVbTUFYX0NVU1RPTV9MRU5dOworfSBXUEFfSUVfOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVQ0hBUiAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICBDaGFubmVsOworCVVDSEFSICAgQ2VudHJhbENoYW5uZWw7CS8vU3RvcmUgdGhlIHdpZGUtYmFuZCBjZW50cmFsIGNoYW5uZWwgZm9yIDQwTUh6LiAgLnVzZWQgaW4gNDBNSHogQVAuIE9yIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ2hhbm5lbC4KKyAgICBVQ0hBUiAgIEJzc1R5cGU7CisgICAgVVNIT1JUICBBdGltV2luOworICAgIFVTSE9SVCAgQmVhY29uUGVyaW9kOworCisgICAgVUNIQVIgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKyAgICBVQ0hBUiAgIFN1cFJhdGVMZW47CisgICAgVUNIQVIgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKyAgICBVQ0hBUiAgIEV4dFJhdGVMZW47CisJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHk7CisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47CisJQUREX0hUX0lORk9fSUUgQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQ7CisJQ0hBUiAgICBSc3NpOworICAgIFVDSEFSICAgUHJpdmFjeTsJCQkvLyBJbmRpY2F0ZSBzZWN1cml0eSBmdW5jdGlvbiBPTi9PRkYuIERvbid0IG1lc3MgdXAgd2l0aCBhdXRoIG1vZGUuCisJVUNIQVIJSGlkZGVuOworCisgICAgVVNIT1JUICBEdGltUGVyaW9kOworICAgIFVTSE9SVCAgQ2FwYWJpbGl0eUluZm87CisKKyAgICBVU0hPUlQgIENmcENvdW50OworICAgIFVTSE9SVCAgQ2ZwUGVyaW9kOworICAgIFVTSE9SVCAgQ2ZwTWF4RHVyYXRpb247CisgICAgVVNIT1JUICBDZnBEdXJSZW1haW5pbmc7CisgICAgVUNIQVIgICBTc2lkTGVuOworICAgIENIQVIgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCisgICAgVUxPTkcgICBMYXN0QmVhY29uUnhUaW1lOyAvLyBPUydzIHRpbWVzdGFtcAorCisJQk9PTEVBTgliU0VTOworCisJLy8gTmV3IGZvciBXUEEyCisJQ0lQSEVSX1NVSVRFCQkJCQlXUEE7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQSBjaXBoZXIgc3VpdGUKKwlDSVBIRVJfU1VJVEUJCQkJCVdQQTI7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQTIgY2lwaGVyIHN1aXRlCisKKwkvLyBOZXcgZm9yIG1pY3Jvc29mdCBXUEEgc3VwcG9ydAorCU5ESVNfODAyXzExX0ZJWEVEX0lFcwlGaXhJRXM7CisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZUF1eDsJLy8gQWRkaXRpb24gbW9kZSBmb3IgV1BBMiAvIFdQQSBjYXBhYmxlIEFQCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZTsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCVdlcFN0YXR1czsJCQkJLy8gVW5pY2FzdCBFbmNyeXB0aW9uIEFsZ29yaXRobSBleHRyYWN0IGZyb20gVkFSX0lFCisJVVNIT1JUCQkJCQlWYXJJRUxlbjsJCQkJLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCisJVUNIQVIJCQkJCVZhcklFc1tNQVhfVklFX0xFTl07CisKKwkvLyBDQ1ggQ2tpcCBpbmZvcm1hdGlvbgorICAgIFVDSEFSICAgQ2tpcEZsYWc7CisKKwkvLyBDQ1ggMiBUU0YKKwlVQ0hBUglQVFNGWzRdOwkJLy8gUGFyZW50IFRTRgorCVVDSEFSCVRUU0ZbOF07CQkvLyBUYXJnZXQgVFNGCisKKyAgICAvLyA4MDIuMTFlIGQ5LCBhbmQgV01NCisJRURDQV9QQVJNICAgICAgICAgICBFZGNhUGFybTsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJUUJTU19MT0FEX1BBUk0gICAgICBRYnNzTG9hZDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBXUEFfSUVfICAgICBXcGFJRTsKKyAgICBXUEFfSUVfICAgICBSc25JRTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJVUNIQVIJCUNvdW50cnlTdHJpbmdbM107CisJQk9PTEVBTgkJYkhhc0NvdW50cnlJRTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9IEJTU19FTlRSWSwgKlBCU1NfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVQ0hBUiAgICAgICAgICAgQnNzTnI7CisgICAgVUNIQVIgICAgICAgICAgIEJzc092ZXJsYXBOcjsKKyAgICBCU1NfRU5UUlkgICAgICAgQnNzRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworfSBCU1NfVEFCTEUsICpQQlNTX1RBQkxFOworCisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFX0VMRU0geworICAgIFVMT05HICAgICAgICAgICAgIE1hY2hpbmU7CisgICAgVUxPTkcgICAgICAgICAgICAgTXNnVHlwZTsKKyAgICBVTE9ORyAgICAgICAgICAgICBNc2dMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgTXNnW01HTVRfRE1BX0JVRkZFUl9TSVpFXTsKKyAgICBMQVJHRV9JTlRFR0VSICAgICBUaW1lU3RhbXA7CisgICAgVUNIQVIgICAgICAgICAgICAgUnNzaTA7CisgICAgVUNIQVIgICAgICAgICAgICAgUnNzaTE7CisgICAgVUNIQVIgICAgICAgICAgICAgUnNzaTI7CisgICAgVUNIQVIgICAgICAgICAgICAgU2lnbmFsOworICAgIFVDSEFSICAgICAgICAgICAgIENoYW5uZWw7CisgICAgVUNIQVIgICAgICAgICAgICAgV2NpZDsKKyAgICBCT09MRUFOICAgICAgICAgICBPY2N1cGllZDsKK30gTUxNRV9RVUVVRV9FTEVNLCAqUE1MTUVfUVVFVUVfRUxFTTsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfUVVFVUUgeworICAgIFVMT05HICAgICAgICAgICAgIE51bTsKKyAgICBVTE9ORyAgICAgICAgICAgICBIZWFkOworICAgIFVMT05HICAgICAgICAgICAgIFRhaWw7CisgICAgTkRJU19TUElOX0xPQ0sgICBMb2NrOworICAgIE1MTUVfUVVFVUVfRUxFTSAgRW50cnlbTUFYX0xFTl9PRl9NTE1FX1FVRVVFXTsKK30gTUxNRV9RVUVVRSwgKlBNTE1FX1FVRVVFOworCit0eXBlZGVmIFZPSUQgKCpTVEFURV9NQUNISU5FX0ZVTkMpKFZPSUQgKkFkYXB0b3IsIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK3R5cGVkZWYgc3RydWN0IF9TVEFURV9NQUNISU5FIHsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOclN0YXRlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJNc2c7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyU3RhdGU7CisgICAgU1RBVEVfTUFDSElORV9GVU5DICAgICAgICAgICAgICpUcmFuc0Z1bmM7Cit9IFNUQVRFX01BQ0hJTkUsICpQU1RBVEVfTUFDSElORTsKKworCisvLyBNTE1FIEFVWCBkYXRhIHN0cnVjdHVyZSB0aGF0IGhvbGQgdGVtcG9yYXJsaXkgc2V0dGluZ3MgZHVyaW5nIGEgY29ubmVjdGlvbiBhdHRlbXB0LgorLy8gT25jZSB0aGlzIGF0dGVtcCBzdWNjZWVkcywgYWxsIHNldHRpbmdzIHdpbGwgYmUgY29weSB0byBwQWQtPlN0YUFjdGl2ZS4KKy8vIEEgY29ubmVjdGlvbiBhdHRlbXB0ICh1c2VyIHNldCBPSUQsIHJvYW1pbmcsIENDWCBmYXN0IHJvYW1pbmcsLi4pIGNvbnNpc3RzIG9mCisvLyBzZXZlcmFsIHN0ZXBzIChKT0lOLCBBVVRILCBBU1NPQyBvciBSRUFTU09DKSBhbmQgbWF5IGZhaWwgYXQgYW55IHN0ZXAuIFdlIHB1cnBvc2VseQorLy8gc2VwYXJhdGUgdGhpcyB1bmRlci10cmlhbCBzZXR0aW5ncyBhd2F5IGZyb20gcEFkLT5TdGFBY3RpdmUgc28gdGhhdCBvbmNlCisvLyB0aGlzIG5ldyBhdHRlbXB0IGZhaWxlZCwgZHJpdmVyIGNhbiBhdXRvLXJlY292ZXIgYmFjayB0byB0aGUgYWN0aXZlIHNldHRpbmdzLgordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVVYIHsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc1R5cGU7CisgICAgVUNIQVIgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisgICAgVUNIQVIgICAgICAgICAgICAgICBTc2lkTGVuOworICAgIFVDSEFSICAgICAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZFtNQVhfTEVOX09GX1NTSURdOworCVVDSEFSCQkJCUF1dG9SZWNvbm5lY3RTc2lkTGVuOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQWxnOworICAgIFVDSEFSICAgICAgICAgICAgICAgU2NhblR5cGU7CisgICAgVUNIQVIgICAgICAgICAgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgICAgICAgICAgQ2VudHJhbENoYW5uZWw7CisgICAgVVNIT1JUICAgICAgICAgICAgICBBaWQ7CisgICAgVVNIT1JUICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEJlYWNvblBlcmlvZDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2ZwUGVyaW9kOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQXRpbVdpbjsKKworCS8vIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCisJLy8gQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuCisJVUNIQVIJCSAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgICAgICAgU3VwUmF0ZUxlbjsKKwlVQ0hBUgkJICAgICAgICBFeHRSYXRlTGVuOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlVQ0hBUgkJICAgICAgICAJSHRDYXBhYmlsaXR5TGVuOworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7CisKKyAgICAvLyBuZXcgZm9yIFFPUworICAgIFFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisgICAgRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisgICAgUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisKKyAgICAvLyBuZXcgdG8ga2VlcCBSYWxpbmsgc3BlY2lmaWMgZmVhdHVyZQorICAgIFVMT05HICAgICAgICAgICAgICAgQVBSYWxpbmtJZTsKKworICAgIEJTU19UQUJMRSAgICAgICAgICAgU3NpZEJzc1RhYjsgICAgIC8vIEFQIGxpc3QgZm9yIHRoZSBzYW1lIFNTSUQKKyAgICBCU1NfVEFCTEUgICAgICAgICAgIFJvYW1UYWI7ICAgICAgICAvLyBBUCBsaXN0IGVsaWdpYmxlIGZvciByb2FtaW5nCisgICAgVUxPTkcgICAgICAgICAgICAgICBCc3NJZHg7CisgICAgVUxPTkcgICAgICAgICAgICAgICBSb2FtSWR4OworCisJQk9PTEVBTgkJCQlDdXJyUmVxSXNGcm9tTmRpczsKKworICAgIFJBTElOS19USU1FUl9TVFJVQ1QgQmVhY29uVGltZXIsIFNjYW5UaW1lcjsKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEF1dGhUaW1lcjsKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEFzc29jVGltZXIsIFJlYXNzb2NUaW1lciwgRGlzYXNzb2NUaW1lcjsKK30gTUxNRV9BVVgsICpQTUxNRV9BVVg7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FEREJBX1JFUV9TVFJVQ1R7CisJVUNIQVIgICBXY2lkOwkvLworCVVDSEFSICAgcEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIEJhQnVmU2l6ZTsKKwlVU0hPUlQJVGltZU91dFZhbHVlOworCVVDSEFSICAgVElEOworCVVDSEFSICAgVG9rZW47CisJVVNIT1JUCUJhU3RhcnRTZXE7Cit9IE1MTUVfQUREQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0FEREJBX1JFUV9TVFJVQ1Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVMQkFfUkVRX1NUUlVDVHsKKwlVQ0hBUiAgIFdjaWQ7CS8vCisJVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUglJbml0aWF0b3I7Cit9IE1MTUVfREVMQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0RFTEJBX1JFUV9TVFJVQ1Q7CisKKy8vIGFzc29jIHN0cnVjdCBpcyBlcXVhbCB0byByZWFzc29jCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BU1NPQ19SRVFfU1RSVUNUeworICAgIFVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgIENhcGFiaWxpdHlJbmZvOworICAgIFVTSE9SVCAgICBMaXN0ZW5JbnR2OworICAgIFVMT05HICAgICBUaW1lb3V0OworfSBNTE1FX0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9BU1NPQ19SRVFfU1RSVUNULCBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfRElTQVNTT0NfUkVRX1NUUlVDVHsKKyAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICBSZWFzb247Cit9IE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FVVEhfUkVRX1NUUlVDVCB7CisgICAgVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgQWxnOworICAgIFVMT05HICAgICAgICBUaW1lb3V0OworfSBNTE1FX0FVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0FVVEhfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVBVVRIX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgIFJlYXNvbjsKK30gTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUxPTkcgICAgICBCc3NJZHg7Cit9IE1MTUVfSk9JTl9SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgIEJzc1R5cGU7CisgICAgVUNIQVIgICAgICBTY2FuVHlwZTsKKyAgICBVQ0hBUiAgICAgIFNzaWRMZW47CisgICAgQ0hBUiAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Cit9IE1MTUVfU0NBTl9SRVFfU1RSVUNULCAqUE1MTUVfU0NBTl9SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9TVEFSVF9SRVFfU1RSVUNUIHsKKyAgICBDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisgICAgVUNIQVIgICAgICAgU3NpZExlbjsKK30gTUxNRV9TVEFSVF9SRVFfU1RSVUNULCAqUE1MTUVfU1RBUlRfUkVRX1NUUlVDVDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLy8gc3RydWN0dXJlIGZvciBETFMKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTIHsKKwlVU0hPUlQJCQkJCQlUaW1lT3V0OwkJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsIHVuaXQ6IHNlY29uZCAsIHNldCBieSBVSQorCVVTSE9SVAkJCQkJCUNvdW50RG93blRpbWVyOwkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgc2xpZW5jZSx1bml0OiBzZWNvbmQgLCB1c2VkIGJ5IGRyaXZlciBvbmx5CisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCU1hY0FkZHI7CQkvLyBzZXQgYnkgVUkKKwlVQ0hBUgkJCQkJCVN0YXR1czsJCQkvLyAwOiBub25lICwgMTogd2FpdCBTVEFrZXksIDI6IGZpbmlzaCBETFMgc2V0dXAgLCBzZXQgYnkgZHJpdmVyIG9ubHkKKwlCT09MRUFOCQkJCQkJVmFsaWQ7CQkJLy8gMTogdmFsaWQgLCAwOiBpbnZhbGlkICwgc2V0IGJ5IFVJLCB1c2UgdG8gc2V0dXAgb3IgdGVhciBkb3duIERMUyBsaW5rCisJUkFMSU5LX1RJTUVSX1NUUlVDVAkJCVRpbWVyOwkJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBoYW5kc2hha2UKKwlVU0hPUlQJCQkJCQlTZXF1ZW5jZTsKKwlVU0hPUlQJCQkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKKwlCT09MRUFOCQkJCQkJYkhUQ2FwOworCVBWT0lECQkJCQkJcEFkOworfSBSVF84MDJfMTFfRExTLCAqUFJUXzgwMl8xMV9ETFM7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RMU19SRVFfU1RSVUNUIHsKKyAgICBQUlRfODAyXzExX0RMUwlwRExTOworICAgIFVTSE9SVAkJCVJlYXNvbjsKK30gTUxNRV9ETFNfUkVRX1NUUlVDVCwgKlBNTE1FX0RMU19SRVFfU1RSVUNUOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworICAgIFVDSEFSICAgRWlkOworICAgIFVDSEFSICAgTGVuOworICAgIENIQVIgICBPY3RldFsxXTsKK30gRUlEX1NUUlVDVCwqUEVJRF9TVFJVQ1QsIEJFQUNPTl9FSURfU1RSVUNULCAqUEJFQUNPTl9FSURfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUTVBfVFhfUkFURV9TV0lUQ0gKK3sKKwlVQ0hBUiAgIEl0ZW1ObzsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJUnN2MjoyOworCVVDSEFSCU1vZGU6MjsKKwlVQ0hBUglSc3YxOjE7CisJVUNIQVIJQlc6MTsKKwlVQ0hBUglTaG9ydEdJOjE7CisJVUNIQVIJU1RCQzoxOworI2Vsc2UKKwlVQ0hBUglTVEJDOjE7CisJVUNIQVIJU2hvcnRHSToxOworCVVDSEFSCUJXOjE7CisJVUNIQVIJUnN2MToxOworCVVDSEFSCU1vZGU6MjsKKwlVQ0hBUglSc3YyOjI7CisjZW5kaWYKKwlVQ0hBUiAgIEN1cnJNQ1M7CisJVUNIQVIgICBUcmFpblVwOworCVVDSEFSICAgVHJhaW5Eb3duOworfSBSUlRNUF9UWF9SQVRFX1NXSVRDSCwgKlBSVE1QX1RYX1JBVEVfU1dJVENIOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBUQlRUX1BSRUxPQURfVElNRSAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKKyNkZWZpbmUgREVGQVVMVF9EVElNX1BFUklPRCAgICAgMQorCisjZGVmaW5lIE1BQ19UQUJMRV9BR0VPVVRfVElNRQkJCTMwMAkJCS8vIHVuaXQ6IHNlYworI2RlZmluZSBNQUNfVEFCTEVfQVNTT0NfVElNRU9VVAkJCTUJCQkvLyB1bml0OiBzZWMKKyNkZWZpbmUgTUFDX1RBQkxFX0ZVTEwoVGFiKQkJCQkoKFRhYikuc2l6ZSA9PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKworLy8gQVAgc2hhbGwgZHJvcCB0aGUgc3RhIGlmIGNvbnRpbmUgVHggZmFpbCBjb3VudCByZWFjaCBpdC4KKyNkZWZpbmUgTUFDX0VOVFJZX0xJRkVfQ0hFQ0tfQ05UCQkyMAkJCS8vIHBhY2tldCBjbnQuCisKKy8vIFZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPlNzdAordHlwZWRlZiBlbnVtIF9Tc3QgeworICAgIFNTVF9OT1RfQVVUSCwgICAvLyAwOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMQorICAgIFNTVF9BVVRILCAgICAgICAvLyAxOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMgorICAgIFNTVF9BU1NPQyAgICAgICAvLyAyOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMworfSBTU1Q7CisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPkF1dGhTdGF0ZQordHlwZWRlZiBlbnVtIF9BdXRoU3RhdGUgeworICAgIEFTX05PVF9BVVRILAorICAgIEFTX0FVVEhfT1BFTiwgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgT1BFTiBTWVNURU0KKyAgICBBU19BVVRIX0tFWSwgICAgICAgIC8vIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIFNIQVJFRCBLRVkKKyAgICBBU19BVVRIRU5USUNBVElORyAgIC8vIFNUQSBpcyB3YWl0aW5nIGZvciBBVVRIIHNlcSMzIHVzaW5nIFNIQVJFRCBLRVkKK30gQVVUSF9TVEFURTsKKworLy9mb3Itd3BhIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9BcFdwYVN0YXRlIHsKKyAgICBBU19OT1RVU0UsICAgICAgICAgICAgICAvLyAwCisgICAgQVNfRElTQ09OTkVDVCwgICAgICAgICAgLy8gMQorICAgIEFTX0RJU0NPTk5FQ1RFRCwgICAgICAgIC8vIDIKKyAgICBBU19JTklUSUFMSVpFLCAgICAgICAgICAvLyAzCisgICAgQVNfQVVUSEVOVElDQVRJT04sICAgICAgLy8gNAorICAgIEFTX0FVVEhFTlRJQ0FUSU9OMiwgICAgIC8vIDUKKyAgICBBU19JTklUUE1LLCAgICAgICAgICAgICAvLyA2CisgICAgQVNfSU5JVFBTSywgICAgICAgICAgICAgLy8gNworICAgIEFTX1BUS1NUQVJULCAgICAgICAgICAgIC8vIDgKKyAgICBBU19QVEtJTklUX05FR09USUFUSU5HLCAvLyA5CisgICAgQVNfUFRLSU5JVERPTkUsICAgICAgICAgLy8gMTAKKyAgICBBU19VUERBVEVLRVlTLCAgICAgICAgICAvLyAxMQorICAgIEFTX0lOVEVHUklUWV9GQUlMVVJFLCAgIC8vIDEyCisgICAgQVNfS0VZVVBEQVRFLCAgICAgICAgICAgLy8gMTMKK30gQVBfV1BBX1NUQVRFOworCisvLyBmb3Itd3BhIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9HVEtTdGF0ZSB7CisgICAgUkVLRVlfTkVHT1RJQVRJTkcsCisgICAgUkVLRVlfRVNUQUJMSVNIRUQsCisgICAgS0VZRVJST1IsCit9IEdUS19TVEFURTsKKworLy8gIGZvci13cGEgIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9XcGFHVEtTdGF0ZSB7CisgICAgU0VUS0VZUywKKyAgICBTRVRLRVlTX0RPTkUsCit9IFdQQV9HVEtfU1RBVEU7CisvLyA9PT09PT09PT09PT09PT09PT09PT09IGVuZCBvZiBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyNlbmRpZgkvLyBNTE1FX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmOTFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKQEAgLTAsMCArMSw5OTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJb2lkLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisjaWZuZGVmIF9PSURfSF8KKyNkZWZpbmUgX09JRF9IXworCisKKyNkZWZpbmUgVFJVRQkJCQkxCisjZGVmaW5lIEZBTFNFCQkJCTAKKy8vCisvLyBJRUVFIDgwMi4xMSBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucworLy8KKyNkZWZpbmUgTUFYX1RYX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAxMDAgICAvKiBtVyAqLworI2RlZmluZSBNQVhfUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0xMCAgICAvKiBkQm0gKi8KKyNkZWZpbmUgTUlOX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMjAwICAgLyogZEJtICovCisjZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjM0NiAgLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDI1NiAgIC8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAyMzQ3ICAvKiBieXRlIGNvdW50ICovCisKKy8vIG5ldyB0eXBlcyBmb3IgTWVkaWEgU3BlY2lmaWMgSW5kaWNhdGlvbnMKKy8vIEV4dGVuc2lvbiBjaGFubmVsIG9mZnNldAorI2RlZmluZSBFWFRDSEFfTk9ORQkJCTAKKyNkZWZpbmUgRVhUQ0hBX0FCT1ZFCQkweDEKKyNkZWZpbmUgRVhUQ0hBX0JFTE9XCQkweDMKKworLy8gQlcKKyNkZWZpbmUgQkFORF9XSURUSF8yMAkJMAorI2RlZmluZSBCQU5EX1dJRFRIXzQwCQkxCisjZGVmaW5lIEJBTkRfV0lEVEhfQk9USAkJMgorI2RlZmluZSBCQU5EX1dJRFRIXzEwCQkzCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgorLy8gU0hPUlRHSQorI2RlZmluZSBHQVBfSU5URVJWQUxfNDAwCTEJLy8gb25seSBzdXBwb3J0IGluIEhUIG1vZGUKKyNkZWZpbmUgR0FQX0lOVEVSVkFMXzgwMAkwCisjZGVmaW5lIEdBUF9JTlRFUlZBTF9CT1RICTIKKworI2RlZmluZSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAkJCTEKKyNkZWZpbmUgTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQJCTAKKworI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCAgICAgICAgIDMyCisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFUyAgICAgICAgOAorI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVggICAgIDE2CisjZGVmaW5lIE1BQ19BRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQkJNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRVZFTlQJCQkJMTAgIC8vIGVudHJ5ICMgaW4gRVZFTlQgdGFibGUKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9NQUMJCQkJMzIgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9BQ0wJCQkJNjQKKyNkZWZpbmUgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTCQkxMiAgICAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCQkJNAorCisjaWZuZGVmIFVOREVSX0NFCisKKyNkZWZpbmUgT0lEX0dFTl9NQUNISU5FX05BTUUgICAgICAgICAgICAgICAweDAwMDEwMjFBCisKKyNpZmRlZiBSQUxJTktfQVRFCisjZGVmaW5lIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQJCQkweDA0MDEKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZGVmaW5lIFJUX1FVRVJZX1NJR05BTF9DT05URVhUCQkJCTB4MDQwMgorI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQgICAgICAgICAgICAgICAgIAkweDA0MDQKKyNkZWZpbmUgUlRfU0VUX0FQRF9QSUQJCQkJCQkweDA0MDUKKyNkZWZpbmUgUlRfU0VUX0RFTF9NQUNfRU5UUlkJCQkJMHgwNDA2CisKKy8vCisvLyBJRUVFIDgwMi4xMSBPSURzCisvLworI2RlZmluZQlPSURfR0VUX1NFVF9UT0dHTEUJCQkweDgwMDAKKworI2RlZmluZQlPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVECQkJMHgwMTAzCisjZGVmaW5lCU9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRQkJCQkweDAxMDQKKyNkZWZpbmUJT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIJCQkJCQkweDAxMDcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJCQkJCQkJCTB4MDEwOCAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJXzEJCQkJCQkweDAxMDkgLy9ydDI4NjAJb25seSAsIGthdGh5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV8yCQkJCQkJMHgwMTBBIC8vcnQyODYwCW9ubHkgLCBrYXRoeQorI2RlZmluZQlPSURfODAyXzExX05VTUJFUl9PRl9BTlRFTk5BUwkJCQkweDAxMEIKKyNkZWZpbmUJT0lEXzgwMl8xMV9SWF9BTlRFTk5BX1NFTEVDVEVECQkJCTB4MDEwQworI2RlZmluZQlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQJCQkJMHgwMTBECisjZGVmaW5lCU9JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkJCQkweDAxMEUKKyNkZWZpbmUJT0lEXzgwMl8xMV9BRERfV0VQCQkJCQkJCTB4MDExMgorI2RlZmluZQlPSURfODAyXzExX1JFTU9WRV9XRVAJCQkJCQkweDAxMTMKKyNkZWZpbmUJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJCQkJCQkweDAxMTQKKyNkZWZpbmUJT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgkJCQkJMHgwMTE4CisjZGVmaW5lCU9JRF84MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04JCQkweDAxMUUKKyNkZWZpbmUJT0lEXzgwMl8xMV9URVNUCQkJCQkJCQkweDAxMUYKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTgkJCQkweDA1MDcKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4JCQkJCTB4MDUwOAorI2RlZmluZQlPSURfODAyXzExX1NTSUQJCQkJCQkJCTB4MDUwOQorI2RlZmluZQlPSURfODAyXzExX0JTU0lECQkJCQkJCTB4MDUwQQorI2RlZmluZQlSVF9PSURfODAyXzExX1JBRElPCQkJCQkJCTB4MDUwQgorI2RlZmluZQlSVF9PSURfODAyXzExX1BIWV9NT0RFCQkJCQkJMHgwNTBDCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1RBX0NPTkZJRwkJCQkJMHgwNTBECisjZGVmaW5lCU9JRF84MDJfMTFfREVTSVJFRF9SQVRFUwkJCQkJMHgwNTBFCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUFJFQU1CTEUJCQkJCQkweDA1MEYKKyNkZWZpbmUJT0lEXzgwMl8xMV9XRVBfU1RBVFVTCQkJCQkJMHgwNTEwCisjZGVmaW5lCU9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQkJCQkweDA1MTEKKyNkZWZpbmUJT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFCQkJCTB4MDUxMgorI2RlZmluZQlSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTCQkJCTB4MDUxMworI2RlZmluZQlPSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkJCTB4MDUxNAorI2RlZmluZQlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xECQkJMHgwNTE1CisjZGVmaW5lCU9JRF84MDJfMTFfUE9XRVJfTU9ERQkJCQkJCTB4MDUxNgorI2RlZmluZQlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkJCQkweDA1MTcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BRERfV1BBCQkJCQkJMHgwNTE4CisjZGVmaW5lCU9JRF84MDJfMTFfUkVNT1ZFX0tFWQkJCQkJCTB4MDUxOQorI2RlZmluZQlPSURfODAyXzExX0FERF9LRVkJCQkJCQkJMHgwNTIwCisjZGVmaW5lCU9JRF84MDJfMTFfQ09ORklHVVJBVElPTgkJCQkJMHgwNTIxCisjZGVmaW5lCU9JRF84MDJfMTFfVFhfUEFDS0VUX0JVUlNUCQkJCQkweDA1MjIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTAkJCQkweDA1MjMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPCQkJCQkweDA1MjQKKyNpZmRlZglEQkcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUgkJCQkweDA1MjUKKyNlbmRpZgorI2RlZmluZSBPSURfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTICAgICAgICAgICAgT0lEXzgwMl8xMV9XRVBfU1RBVFVTCisjZGVmaW5lIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAgICAgICAgICAgICAgICAgMHgwNTI2CisjZGVmaW5lIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAgICAgICAgICAgICAgICAgMHgwNTI3CisjZGVmaW5lIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FICAgICAgICAgMHgwNTI4CisKKy8vIEZvciA4MDIuMXggZGFlbWluIHVzaW5nIHRvIHJlcXVpcmUgY3VycmVudCBkcml2ZXIgY29uZmlndXJhdGlvbgorI2RlZmluZSBPSURfODAyXzExX1JBRElVU19RVUVSWV9TRVRUSU5HCQkJCTB4MDU0MAorCisjZGVmaW5lCVJUX09JRF9ERVZJQ0VfTkFNRQkJCQkJCQkweDA2MDcKKyNkZWZpbmUJUlRfT0lEX1ZFUlNJT05fSU5GTwkJCQkJCQkweDA2MDgKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUCQkJCQkJMHgwNjA5CisjZGVmaW5lCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MJCQkJCTB4MDYwQQorI2RlZmluZQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTCQkJCTB4MDYwQgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTCQkJCTB4MDYwQworI2RlZmluZQlPSURfODAyXzExX1JTU0kJCQkJCQkJCTB4MDYwRAorI2RlZmluZQlPSURfODAyXzExX1NUQVRJU1RJQ1MJCQkJCQkweDA2MEUKKyNkZWZpbmUJT0lEX0dFTl9SQ1ZfT0sJCQkJCQkJCTB4MDYwRgorI2RlZmluZQlPSURfR0VOX1JDVl9OT19CVUZGRVIJCQkJCQkweDA2MTAKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTgkJCTB4MDYxMQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT04JCTB4MDYxMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURQkJCTB4MDYxMworI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEJCQkJMHgwNjE0CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfUElEVklECQkJCQkweDA2MTUKKy8vZm9yIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgICAgICAgICAgICAgICAgICAgICAweDA2MTYKKyNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICAgICAgICAgICAgICAgICAgICAweDA2MTcKKyNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICAgICAgICAweDA2MTgKKyNkZWZpbmUgT0lEXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjAKKyNkZWZpbmUgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgICAgICAgICAgICAgICAweDA2MjEKKyNkZWZpbmUgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQgICAgICAgICAgICAgICAgICAweDA2MjIKKyNkZWZpbmUgUlRfT0lEX05FV19EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKKworCisvL3J0Mjg2MCAsIGthdGh5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU05SXzAJCQkJCQkJMHgwNjMwCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU05SXzEJCQkJCQkJMHgwNjMxCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFCQkJMHgwNjMyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERQkJCQkweDA2MzMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERQkJCQkweDA2MzQKKyNkZWZpbmUJT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCQkJCTB4MDYzNQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORwkJCTB4MDYzNgorI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkcJCQkJMHgwNjM3CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00JCQkJMHgwNjM4CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNCQkJCQkweDA2MzkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMJCQkJCQkweDA2M0EKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfRExTCQkJCQkJMHgwNjNCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNCQkJCTB4MDYzQworI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0JCQkJCTB4MDYzRAorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX1dNTSAgICAgICAgICAgICAgCQkweDA2M0UKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfV01NICAgICAgCQkJCQkweDA2M0YKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9JTU1FX0JBX0NBUAkJCQkweDA2NDAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVAJCQkJMHgwNjQxCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfQkFUQUJMRQkJCQkJMHgwNjQyCisjZGVmaW5lIFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEJCQkJCTB4MDY0MworI2RlZmluZSBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQQkJCQkJMHgwNjQ0CisjZGVmaW5lIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgICAgICAgICAgICAgICAgICAgMHgwNjQ1CisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREUgICAgICAgICAgMHgwNjQ2CisjZGVmaW5lIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQgICAgICAgICAgMHgwNjQ3CisKKy8vIFJhbGluayBkZWZpbmVkIE9JRHMKKy8vIERlbm5pcyBMZWUgbW92ZSB0byBwbGF0Zm9ybSBzcGVjaWZpYworCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQlNTSUQJCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQlNTSUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TU0lEKQorI2RlZmluZQlSVF9PSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XRVAJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BRERfV0VQKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9LRVkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BRERfS0VZKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JFTU9WRV9XRVAJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JFTU9WRV9XRVApCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX0tFWQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX0tFWSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0RJU0FTU09DSUFURSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4JCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOKQorI2RlZmluZQlSVF9PSURfODAyXzExX1dFUF9TVEFUVVMJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1dFUF9TVEFUVVMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JFTE9BRF9ERUZBVUxUUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTAkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JTU0lfVFJJR0dFUikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xECQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SWF9BTlRFTk5BX1NFTEVDVEVEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUwkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TVVBQT1JURURfUkFURVMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfREVTSVJFRF9SQVRFUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfREVTSVJFRF9SQVRFUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKQorI2RlZmluZQlSVF9PSURfODAyXzExX1BPV0VSX01PREUJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BPV0VSX01PREUpCisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfU1RBVFVTX1RZUEUKK3sKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9BdXRoZW50aWNhdGlvbiwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9NZWRpYVN0cmVhbU1vZGUsCisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfUE1LSURfQ2FuZGlkYXRlTGlzdCwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZU1heCAgICAvLyBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfU1RBVFVTX1RZUEUsICpQTkRJU184MDJfMTFfU1RBVFVTX1RZUEU7CisKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9NQUNfQUREUkVTU1s2XTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OCit7CisgICAgTkRJU184MDJfMTFfU1RBVFVTX1RZUEUgU3RhdHVzVHlwZTsKK30gTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04sICpQTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT047CisKKy8vIG1hc2sgZm9yIGF1dGhlbnRpY2F0aW9uL2ludGVncml0eSBmaWVsZHMKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0FVVEhfRklFTERTICAgICAgICAweDBmCisKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX1JFQVVUSCAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9LRVlVUERBVEUgICAgICAgICAgMHgwMgorI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUEFJUldJU0VfRVJST1IgICAgIDB4MDYKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0dST1VQX0VSUk9SICAgICAgICAweDBFCisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUCit7CisgICAgVUxPTkcgTGVuZ3RoOyAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKyAgICBVTE9ORyBGbGFnczsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUOworCisvL0FkZGVkIG5ldyB0eXBlcyBmb3IgUE1LSUQgQ2FuZGlkYXRlIGxpc3RzLgordHlwZWRlZiBzdHJ1Y3QgX1BNS0lEX0NBTkRJREFURSB7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisgICAgVUxPTkcgRmxhZ3M7Cit9IFBNS0lEX0NBTkRJREFURSwgKlBQTUtJRF9DQU5ESURBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVAoreworICAgIFVMT05HIFZlcnNpb247ICAgICAgIC8vIFZlcnNpb24gb2YgdGhlIHN0cnVjdHVyZQorICAgIFVMT05HIE51bUNhbmRpZGF0ZXM7IC8vIE5vLiBvZiBwbWtpZCBjYW5kaWRhdGVzCisgICAgUE1LSURfQ0FORElEQVRFIENhbmRpZGF0ZUxpc3RbMV07Cit9IE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNULCAqUE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUOworCisvL0ZsYWdzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdCBzdHJ1Y3R1cmUKKyNkZWZpbmUgTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX1BSRUFVVEhfRU5BQkxFRAkweDAxCisKKy8vIEFkZGVkIG5ldyB0eXBlcyBmb3IgT0ZETSA1RyBhbmQgMi40RwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUKK3sKKyAgIE5kaXM4MDJfMTFGSCwKKyAgIE5kaXM4MDJfMTFEUywKKyAgICBOZGlzODAyXzExT0ZETTUsCisgICAgTmRpczgwMl8xMU9GRE01X04sCisgICAgTmRpczgwMl8xMU9GRE0yNCwKKyAgICBOZGlzODAyXzExT0ZETTI0X04sCisgICBOZGlzODAyXzExQXV0b21vZGUsCisgICAgTmRpczgwMl8xMU5ldHdvcmtUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QKK3sKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIE5ldHdvcmtUeXBlIFsxXTsKK30gTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1Q7CisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUE9XRVJfTU9ERQoreworICAgIE5kaXM4MDJfMTFQb3dlck1vZGVDQU0sCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNYXggICAgICAvLyBub3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfUE9XRVJfTU9ERSwgKlBORElTXzgwMl8xMV9QT1dFUl9NT0RFOworCit0eXBlZGVmIFVMT05HICAgTkRJU184MDJfMTFfVFhfUE9XRVJfTEVWRUw7IC8vIGluIG1pbGxpd2F0dHMKKworLy8KKy8vIFJlY2VpdmVkIFNpZ25hbCBTdHJlbmd0aCBJbmRpY2F0aW9uCisvLwordHlwZWRlZiBMT05HICAgIE5ESVNfODAyXzExX1JTU0k7ICAgICAgICAgICAvLyBpbiBkQm0KKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgKK3sKKyAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgVUxPTkcgICAgICAgICAgIEhvcFBhdHRlcm47ICAgICAgICAvLyBBcyBkZWZpbmVkIGJ5IDgwMi4xMSwgTVNCIHNldAorICAgVUxPTkcgICAgICAgICAgIEhvcFNldDsgICAgICAgICAgICAvLyB0byBvbmUgaWYgbm9uLTgwMi4xMQorICAgVUxPTkcgICAgICAgICAgIER3ZWxsVGltZTsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKK30gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTgoreworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOyAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRJTVdpbmRvdzsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNDb25maWc7ICAgICAgICAgICAvLyBGcmVxdWVuY3ksIHVuaXRzIGFyZSBrSHoKKyAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkggICAgRkhDb25maWc7Cit9IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04sICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRJU1RJQ1MKK3sKKyAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgIExBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OworICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZW1vdGVNSUNFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUElDVkVycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVwbGF5czsKKyAgIExBUkdFX0lOVEVHRVIgICBDQ01QRm9ybWF0RXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBSZXBsYXlzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBEZWNyeXB0RXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKK30gTkRJU184MDJfMTFfU1RBVElTVElDUywgKlBORElTXzgwMl8xMV9TVEFUSVNUSUNTOworCit0eXBlZGVmICBVTE9ORyAgTkRJU184MDJfMTFfS0VZX0lOREVYOwordHlwZWRlZiBVTE9OR0xPTkcgICBORElTXzgwMl8xMV9LRVlfUlNDOworCisjZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJICAvLyA4MDIuMXggZmFpbG92ZXIgbnVtYmVyCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX1NSVl9JTkZPIHsKKwlVSU5UMzIJCQlyYWRpdXNfaXA7CisJVUlOVDMyCQkJcmFkaXVzX3BvcnQ7CisJVUNIQVIJCQlyYWRpdXNfa2V5WzY0XTsKKwlVQ0hBUgkJCXJhZGl1c19rZXlfbGVuOworfSBSQURJVVNfU1JWX0lORk8sICpQUkFESVVTX1NSVl9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19LRVlfSU5GTworeworCVVDSEFSCQkJcmFkaXVzX3Nydl9udW07CisJUkFESVVTX1NSVl9JTkZPCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOworCVVDSEFSCQkJaWVlZTgwMjF4V0VQOwkJIC8vIGR5bmFtaWMgV0VQCisgICAgVUNIQVIgICAgICAgICAgIGtleV9pbmRleDsKKyAgICBVQ0hBUiAgICAgICAgICAga2V5X2xlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgIFVDSEFSICAgICAgICAgICBrZXlfbWF0ZXJpYWxbMTNdOworfSBSQURJVVNfS0VZX0lORk8sICpQUkFESVVTX0tFWV9JTkZPOworCisvLyBJdCdzIHVzZWQgYnkgODAyLjF4IGRhZW1vbiB0byByZXF1aXJlIHJlbGF0aXZlIGNvbmZpZ3VyYXRpb24KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0NPTkYKK3sKKyAgICBVSU5UMzIgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVQ0hBUgkJCW1ic3NfbnVtOwkJCS8vIGluZGljYXRlIG11bHRpcGxlIEJTUyBudW1iZXIKKwlVSU5UMzIJCQlvd25faXBfYWRkcjsKKwlVSU5UMzIJCQlyZXRyeV9pbnRlcnZhbDsKKwlVSU5UMzIJCQlzZXNzaW9uX3RpbWVvdXRfaW50ZXJ2YWw7CisJVUNIQVIJCQlFQVBpZm5hbWVbSUZOQU1TSVpdOworCVVDSEFSCQkJRUFQaWZuYW1lX2xlbjsKKwlVQ0hBUiAJCQlQcmVBdXRoaWZuYW1lW0lGTkFNU0laXTsKKwlVQ0hBUgkJCVByZUF1dGhpZm5hbWVfbGVuOworCVJBRElVU19LRVlfSU5GTwlSYWRpdXNJbmZvWzgvKk1BWF9NQlNTSURfTlVNKi9dOworfSBSQURJVVNfQ09ORiwgKlBSQURJVVNfQ09ORjsKKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIEtleSBtYXBwaW5nIGtleXMgcmVxdWlyZSBhIEJTU0lECit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfS0VZCit7CisgICAgVUlOVCAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVSU5UICAgICAgICAgICBLZXlJbmRleDsKKyAgICBVSU5UICAgICAgICAgICBLZXlMZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBORElTXzgwMl8xMV9LRVlfUlNDIEtleVJTQzsKKyAgICBVQ0hBUiAgICAgICAgICAgS2V5TWF0ZXJpYWxbMV07ICAgICAvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCit9IE5ESVNfODAyXzExX0tFWSwgKlBORElTXzgwMl8xMV9LRVk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9SRU1PVkVfS0VZCit7CisgICAgVUlOVCAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVSU5UICAgICAgICAgICBLZXlJbmRleDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKK30gTkRJU184MDJfMTFfUkVNT1ZFX0tFWSwgKlBORElTXzgwMl8xMV9SRU1PVkVfS0VZOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfV0VQCit7CisgICBVSU5UICAgICBMZW5ndGg7ICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgIFVJTlQgICAgIEtleUluZGV4OyAgICAgICAgICAgLy8gMCBpcyB0aGUgcGVyLWNsaWVudCBrZXksIDEtTiBhcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIGtleXMKKyAgIFVJTlQgICAgIEtleUxlbmd0aDsgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKKyAgIFVDSEFSICAgICBLZXlNYXRlcmlhbFsxXTsvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCit9IE5ESVNfODAyXzExX1dFUCwgKlBORElTXzgwMl8xMV9XRVA7CisKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFCit7CisgICBOZGlzODAyXzExSUJTUywKKyAgIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSwKKyAgIE5kaXM4MDJfMTFBdXRvVW5rbm93biwKKyAgIE5kaXM4MDJfMTFNb25pdG9yLAorICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlTWF4ICAgICAvLyBOb3QgYSByZWFsIHZhbHVlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUsICpQTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRTsKKworLy8gQWRkIG5ldyBhdXRoZW50aWNhdGlvbiBtb2RlcwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCit7CisgICBOZGlzODAyXzExQXV0aE1vZGVPcGVuLAorICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkLAorICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwKKyAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEsCisgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLLAorICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUsCisgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyLAorICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSywKKyAgIAlOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMiwKKwlOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSywKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZU1heCAgICAgICAgICAgLy8gTm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERTsKKwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1JBVEVTW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU107ICAgICAgICAvLyBTZXQgb2YgOCBkYXRhIHJhdGVzCit0eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNfRVhbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsgIC8vIFNldCBvZiAxNiBkYXRhIHJhdGVzCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfU1NJRAoreworICAgIFVJTlQgICBTc2lkTGVuZ3RoOyAgICAgICAgIC8vIGxlbmd0aCBvZiBTU0lEIGZpZWxkIGJlbG93LCBpbiBieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW4gYmUgemVyby4KKyAgICBVQ0hBUiAgIFNzaWRbTkRJU184MDJfMTFfTEVOR1RIX1NTSURdOyAgICAgICAgICAgLy8gU1NJRCBpbmZvcm1hdGlvbiBmaWVsZAorfSBORElTXzgwMl8xMV9TU0lELCAqUE5ESVNfODAyXzExX1NTSUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSUQKK3sKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgTWFjQWRkcmVzczsgLy8gQlNTSUQKKyAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOworICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsgICAgICAgLy8gU1NJRAorICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmFjeTsgICAgLy8gV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQKKyAgIE5ESVNfODAyXzExX1JTU0kgICAgICAgICAgICAgICAgICAgIFJzc2k7ICAgICAgIC8vIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIGluIGRCbQorICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKKyAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZ3VyYXRpb247CisgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBJbmZyYXN0cnVjdHVyZU1vZGU7CisgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKK30gTkRJU19XTEFOX0JTU0lELCAqUE5ESVNfV0xBTl9CU1NJRDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9CU1NJRF9MSVNUCit7CisgICBVSU5UICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgICAgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKKyAgIE5ESVNfV0xBTl9CU1NJRCBCc3NpZFsxXTsKK30gTkRJU184MDJfMTFfQlNTSURfTElTVCwgKlBORElTXzgwMl8xMV9CU1NJRF9MSVNUOworCisvLyBBZGRlZCBDYXBhYmlsaXRpZXMsIElFTGVuZ3RoIGFuZCBJRXMgZm9yIGVhY2ggQlNTSUQKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU19XTEFOX0JTU0lEX0VYCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAgICAgICAgIC8vIEJTU0lECisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsgICAgICAgICAgICAgICAvLyBTU0lECisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmFjeTsgICAgICAgICAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAorICAgIE5ESVNfODAyXzExX1JTU0kgICAgICAgICAgICAgICAgICAgIFJzc2k7ICAgICAgICAgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVuZ3RoIGluIGRCbQorICAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldHdvcmtUeXBlSW5Vc2U7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBJbmZyYXN0cnVjdHVyZU1vZGU7CisgICAgTkRJU184MDJfMTFfUkFURVNfRVggICAgICAgICAgICAgICAgU3VwcG9ydGVkUmF0ZXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVMZW5ndGg7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVzWzFdOworfSBORElTX1dMQU5fQlNTSURfRVgsICpQTkRJU19XTEFOX0JTU0lEX0VYOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgKK3sKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgIE5ESVNfV0xBTl9CU1NJRF9FWCAgICAgIEJzc2lkWzFdOworfSBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYLCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVg7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfRklYRURfSUVzCit7CisgICAgVUNIQVIgVGltZXN0YW1wWzhdOworICAgIFVTSE9SVCBCZWFjb25JbnRlcnZhbDsKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworfSBORElTXzgwMl8xMV9GSVhFRF9JRXMsICpQTkRJU184MDJfMTFfRklYRURfSUVzOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCit7CisgICAgVUNIQVIgRWxlbWVudElEOworICAgIFVDSEFSIExlbmd0aDsgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIGRhdGEgZmllbGQKKyAgICBVQ0hBUiBkYXRhWzFdOworfSBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMsICpQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzOworCit0eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOworCit0eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQ7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfQU5URU5OQTsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgoreworICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGwsCisgICBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQCit9IE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSLCAqUE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSOworCisvLyBBZGRlZCBuZXcgZW5jcnlwdGlvbiB0eXBlcworLy8gQWxzbyBhbGlhc2VkIHR5cGVkZWYgdG8gbmV3IG5hbWUKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfV0VQX1NUQVRVUworeworICAgTmRpczgwMl8xMVdFUEVuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCA9IE5kaXM4MDJfMTFXRVBFbmFibGVkLAorICAgTmRpczgwMl8xMVdFUERpc2FibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQsCisgICBOZGlzODAyXzExV0VQS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUtleUFic2VudCA9IE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCisgICBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uTm90U3VwcG9ydGVkID0gTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMktleUFic2VudCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkLAkvLyBUS0lQIG9yIEFFUyBtaXgKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQsCit9IE5ESVNfODAyXzExX1dFUF9TVEFUVVMsICpQTkRJU184MDJfMTFfV0VQX1NUQVRVUywKKyAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMsICpQTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTCit7CisgICBOZGlzODAyXzExUmVsb2FkV0VQS2V5cworfSBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMsICpQTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTOworCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyAgICAgIDEKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfTElTVEVOSU5URVJWQUwgICAgMgorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9DVVJSRU5UQVBBRERSRVNTICA0CisKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQ0FQQUJJTElUSUVTICAgICAgMQorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9TVEFUVVNDT0RFICAgICAgICAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX0FTU09DSUFUSU9OSUQgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FJX1JFUUZJCit7CisgICAgVVNIT1JUIENhcGFiaWxpdGllczsKKyAgICBVU0hPUlQgTGlzdGVuSW50ZXJ2YWw7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgIEN1cnJlbnRBUEFkZHJlc3M7Cit9IE5ESVNfODAyXzExX0FJX1JFUUZJLCAqUE5ESVNfODAyXzExX0FJX1JFUUZJOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVTRkkKK3sKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworICAgIFVTSE9SVCBTdGF0dXNDb2RlOworICAgIFVTSE9SVCBBc3NvY2lhdGlvbklkOworfSBORElTXzgwMl8xMV9BSV9SRVNGSSwgKlBORElTXzgwMl8xMV9BSV9SRVNGSTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgTGVuZ3RoOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVJlcXVlc3RGaXhlZElFczsKKyAgICBORElTXzgwMl8xMV9BSV9SRVFGSSAgICBSZXF1ZXN0Rml4ZWRJRXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVxdWVzdElFTGVuZ3RoOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlcXVlc3RJRXM7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVzcG9uc2VGaXhlZElFczsKKyAgICBORElTXzgwMl8xMV9BSV9SRVNGSSAgICBSZXNwb25zZUZpeGVkSUVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlSUVMZW5ndGg7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVzcG9uc2VJRXM7Cit9IE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OLCAqUE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQKK3sKKyAgICBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiAgICAgICBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVCAgUmVxdWVzdFsxXTsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQ7CisKKy8vIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit7CisgICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAorICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAorfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKKworLy8gUE1LSUQgU3RydWN0dXJlcwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX0JTU0lEX0lORk8KK3sKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKK30gQlNTSURfSU5GTywgKlBCU1NJRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKK3sKKyAgICBVSU5UICAgIExlbmd0aDsKKyAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OworICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOworfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgoreworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7CisgICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQoreworICAgICBVTE9ORyBMZW5ndGg7CisgICAgIFVMT05HIFZlcnNpb247CisgICAgIFVMT05HIE5vT2ZQTUtJRHM7CisgICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOworICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKK30gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOworCisvLyNlbmRpZiAvL29mIFdJTiAyaworI2VuZGlmIC8vVU5ERVJfQ0UKKworI2lmIFdJUkVMRVNTX0VYVCA8PSAxMQorI2lmbmRlZiBTSU9DREVWUFJJVkFURQorI2RlZmluZSBTSU9DREVWUFJJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJFMAorI2VuZGlmCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVgkJCQkJCQkJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCisKKyNpZmRlZiBEQkcKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0JCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwMykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0UyUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNykKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9BVEUJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDgpCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKKyNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQorI2RlZmluZSBSVFBSSVZfSU9DVExfR0VUX01BQ19UQUJMRQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEYpCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NIT1cJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MTEpCitlbnVtIHsKKyAgICBTSE9XX0NPTk5fU1RBVFVTID0gNCwKKyAgICBTSE9XX0RSVklFUl9WRVJJT04gPSA1LAorICAgIFNIT1dfQkFfSU5GTyA9IDYsCisJU0hPV19ERVNDX0lORk8gPSA3LAorICAgIFJBSU9fT0ZGID0gMTAsCisgICAgUkFJT19PTiA9IDExLAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVNIT1dfRExTX0VOVFJZX0lORk8gPSAxOSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwlTSE9XX0NGR19WQUxVRSA9IDIwLAorfTsKKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgU05NUF9TVVBQT1JUCisvL1NOTVAgaWVlZSA4MDJkb3QxMSwga2F0aHkgLCAyMDA4XzAyMjAKKy8vIGRvdDExcmVzKDMpCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJCQkJMHgwNzAwCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRQkJCTB4MDcwMQorI2RlZmluZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRQkJMHgwNzAyCisKKy8vIGRvdDExc210KDEpCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVECTB4MDcwMworI2RlZmluZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUJCTB4MDcwNAorI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRQkJCTB4MDcwNSAvLyByZWFkICwgd3JpdGUKKyNkZWZpbmUgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQJCQkJMHgwNzA2CisjZGVmaW5lIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSAkJMHgwNzA3CisjZGVmaW5lIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUCQkJCTB4MDcwOAorI2RlZmluZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUCQkJCTB4MDcwOQorI2RlZmluZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRAkJCQkJMHgwNzEwCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRAkJCQkweDA3MTEKKworLy8gLy9kb3QxMVBoeSg0KQorI2RlZmluZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMCQkJCTB4MDcxMgorCisvL2RvdDExbWFjCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1MJCQkJMHgwNzEzCisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKyNkZWZpbmUgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYCQkJCTB4MDcxNAorI2RlZmluZSBPSURfODAyXzExX0dFVF9DSF9MSVNUCQkJCQkweDA3MTUKKyNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFCQkJCTB4MDcxNgorI2RlZmluZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWQkJMHgwNzE3CisKKyNpZmRlZiBMTFREX1NVUFBPUlQKKy8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEKKyNkZWZpbmUgUlRfT0lEX0dFVF9QSFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDc2MQorI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworCisvLyBOZXcgZm9yIE1lZXRpbmdIb3VzZSBBcGkgc3VwcG9ydAorI2RlZmluZSBPSURfTUhfODAyXzFYX1NVUFBPUlRFRCAgICAgICAgICAgICAgIDB4RkZFREMxMDAKKworLy8gTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJLiBEb24ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uISEhCit0eXBlZGVmIHVuaW9uICBfSFRUUkFOU01JVF9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0CXsKKwlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCisJVVNIT1JUCQlUeEJGOjE7CisJVVNIT1JUCQlyc3Y6MjsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJcnN2OjI7CisJVVNIT1JUCQlUeEJGOjE7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorCX0JZmllbGQ7CisjZW5kaWYKKwlVU0hPUlQJCXdvcmQ7CisgfSBIVFRSQU5TTUlUX1NFVFRJTkcsICpQSFRUUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QUkVBTUJMRSB7CisgICAgUnQ4MDJfMTFQcmVhbWJsZUxvbmcsCisgICAgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LAorICAgIFJ0ODAyXzExUHJlYW1ibGVBdXRvCit9IFJUXzgwMl8xMV9QUkVBTUJMRSwgKlBSVF84MDJfMTFfUFJFQU1CTEU7CisKKy8vIE9ubHkgZm9yIFNUQSwgbmVlZCB0byBzeW5jIHdpdGggQVAKKy8vIDIwMDUtMDMtMDggbWF0Y2ggY3VycmVudCBSYUNvbmZpZy4KK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX1BIWV9NT0RFIHsKKwlQSFlfMTFCR19NSVhFRCA9IDAsCisJUEhZXzExQiwKKwlQSFlfMTFBLAorCVBIWV8xMUFCR19NSVhFRCwKKwlQSFlfMTFHLAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVBIWV8xMUFCR05fTUlYRUQsCS8vIGJvdGggYmFuZCAgIDUKKwlQSFlfMTFOXzJfNEcsCQkvLyAxMW4tb25seSB3aXRoIDIuNEcgYmFuZCAgIAk2CisJUEhZXzExR05fTUlYRUQsCS8vIDIuNEcgYmFuZCAgICAgIDcKKwlQSFlfMTFBTl9NSVhFRCwJLy8gNUcgIGJhbmQgICAgICAgOAorCVBIWV8xMUJHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICA5CisJUEhZXzExQUdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDEwCisJUEhZXzExTl81RywJCQkvLyAxMW4tb25seSB3aXRoIDVHIGJhbmQJCTExCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9IFJUXzgwMl8xMV9QSFlfTU9ERTsKKworLy8gcHV0IGFsbCBwcm9wcmlldGVyeSBmb3ItcXVlcnkgb2JqZWN0cyBoZXJlIHRvIHJlZHVjZSAjIG9mIFF1ZXJ5X09JRAordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9MSU5LX1NUQVRVUyB7CisgICAgVUxPTkcgICBDdXJyVHhSYXRlOyAgICAgICAgIC8vIGluIHVuaXRzIG9mIDAuNU1icHMKKyAgICBVTE9ORyAgIENoYW5uZWxRdWFsaXR5OyAgICAgLy8gMC4uMTAwICUKKyAgICBVTE9ORyAgIFR4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAorICAgIFVMT05HICAgUnhCeXRlQ291bnQ7ICAgICAgICAvLyBib3RoIG9rIGFuZCBmYWlsCisgICAgVUxPTkcJQ2VudHJhbENoYW5uZWw7CQkvLyA0ME1IeiBjZW50cmFsIGNoYW5uZWwgbnVtYmVyCit9IFJUXzgwMl8xMV9MSU5LX1NUQVRVUywgKlBSVF84MDJfMTFfTElOS19TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfTE9HIHsKKyAgICBMQVJHRV9JTlRFR0VSICAgU3lzdGVtVGltZTsgIC8vIHRpbWVzdGFtbXAgdmlhIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgpCisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKyAgICBVU0hPUlQgICAgICAgICAgRXZlbnQ7ICAgICAgIC8vIEVWRU5UX3h4eAorfSBSVF84MDJfMTFfRVZFTlRfTE9HLCAqUFJUXzgwMl8xMV9FVkVOVF9MT0c7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfVEFCTEUgeworICAgIFVMT05HICAgICAgIE51bTsKKyAgICBVTE9ORyAgICAgICBSc3Y7ICAgICAvLyB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTkVHRVIgYm91bmRhcnkKKyAgICBSVF84MDJfMTFfRVZFTlRfTE9HICAgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOworfSBSVF84MDJfMTFfRVZFTlRfVEFCTEUsIFBSVF84MDJfMTFfRVZFTlRfVEFCTEU7CisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX01BQ0hUVFJBTlNNSVRfU0VUVElORyB7CisJc3RydWN0CXsKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKwl9CWZpZWxkOworCVVTSE9SVAkJd29yZDsKKyB9IE1BQ0hUVFJBTlNNSVRfU0VUVElORywgKlBNQUNIVFRSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX0VOVFJZIHsKKyAgICBVQ0hBUiAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVUNIQVIgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgIFBzbTsgICAgIC8vIDA6UFdSX0FDVElWRSwgMTpQV1JfU0FWRQorICAgIFVDSEFSCQlNaW1vUHM7ICAvLyAwOk1NUFNfU1RBVElDLCAxOk1NUFNfRFlOQU1JQywgMzpNTVBTX0VuYWJsZWQKKyAgICBDSEFSCQlBdmdSc3NpMDsKKwlDSEFSCQlBdmdSc3NpMTsKKwlDSEFSCQlBdmdSc3NpMjsKKwlVSU5UMzIJCUNvbm5lY3RlZFRpbWU7CisgICAgTUFDSFRUUkFOU01JVF9TRVRUSU5HCVR4UmF0ZTsKK30gUlRfODAyXzExX01BQ19FTlRSWSwgKlBSVF84MDJfMTFfTUFDX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19UQUJMRSB7CisgICAgVUxPTkcgICAgICAgTnVtOworICAgIFJUXzgwMl8xMV9NQUNfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOworfSBSVF84MDJfMTFfTUFDX1RBQkxFLCAqUFJUXzgwMl8xMV9NQUNfVEFCTEU7CisKKy8vIHN0cnVjdHVyZSBmb3IgcXVlcnkvc2V0IGhhcmR3YXJlIHJlZ2lzdGVyIC0gTUFDLCBCQlAsIFJGIHJlZ2lzdGVyCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSIHsKKyAgICBVTE9ORyAgIEhhcmR3YXJlVHlwZTsgICAgICAgLy8gMDpNQUMsIDE6QkJQLCAyOlJGIHJlZ2lzdGVyLCAzOkVFUFJPTQorICAgIFVMT05HICAgT2Zmc2V0OyAgICAgICAgICAgICAvLyBRL1MgcmVnaXN0ZXIgb2Zmc2V0IGFkZHIKKyAgICBVTE9ORyAgIERhdGE7ICAgICAgICAgICAgICAgLy8gUi9XIGRhdGEgYnVmZmVyCit9IFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiwgKlBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVI7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQVBfQ09ORklHIHsKKyAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQorICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQorICAgIFVMT05HICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaXNvbGF0aW9uCisgICAgVUxPTkcgICBIaWRlU3NpZDsgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaGlkaW5nCisgICAgVUxPTkcgICBVc2VCR1Byb3RlY3Rpb247ICAgIC8vIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRgorICAgIFVMT05HICAgVXNlU2hvcnRTbG90VGltZTsgICAvLyAwLW5vIHVzZSwgMS11c2UgOS11cyBzaG9ydCBzbG90IHRpbWUKKyAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisgICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCit9IFJUXzgwMl8xMV9BUF9DT05GSUcsICpQUlRfODAyXzExX0FQX0NPTkZJRzsKKworLy8gc3RydWN0dXJlIHRvIHF1ZXJ5L3NldCBTVEFfQ09ORklHCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1NUQV9DT05GSUcgeworICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCisgICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCisgICAgVUxPTkcgICBVc2VCR1Byb3RlY3Rpb247ICAgIC8vIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRgorICAgIFVMT05HICAgVXNlU2hvcnRTbG90VGltZTsgICAvLyAwLW5vIHVzZSwgMS11c2UgOS11cyBzaG9ydCBzbG90IHRpbWUgd2hlbiBhcHBsaWNhYmxlCisgICAgVUxPTkcgICBBZGhvY01vZGU7IAkJCS8vIDAtMTFiIHJhdGVzIG9ubHkgKFdJRkkgc3BlYyksIDEgLSBiL2cgbWl4ZWQsIDIgLSBnIG9ubHkKKyAgICBVTE9ORyAgIEh3UmFkaW9TdGF0dXM7ICAgICAgLy8gMC1PRkYsIDEtT04sIGRlZmF1bHQgaXMgMSwgUmVhZC1Pbmx5CisgICAgVUxPTkcgICBSc3YxOyAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMAorICAgIFVMT05HICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAvLyBpZ25vcmUgdXBvbiBTRVQsIHJldHVybiBzeXN0ZW0gZXJyb3IgdXBvbiBRVUVSWQorfSBSVF84MDJfMTFfU1RBX0NPTkZJRywgKlBSVF84MDJfMTFfU1RBX0NPTkZJRzsKKworLy8KKy8vICBGb3IgT0lEIFF1ZXJ5IG9yIFNldCBhYm91dCBCQSBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmCXN0cnVjdAlfT0lEX0JBQ0FQX1NUUlVDCXsKKwkJVUNIQVIJCVJ4QkFXaW5MaW1pdDsKKwkJVUNIQVIJCVR4QkFXaW5MaW1pdDsKKwkJVUNIQVIJCVBvbGljeTsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZAorCQlVQ0hBUgkJTXBkdURlbnNpdHk7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKKwkJVUNIQVIgICAgICAgCUFtc2R1RW5hYmxlOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCisJCVVDSEFSICAgICAgIAlBbXNkdVNpemU7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07CisJCVVDSEFSICAgICAgIAlNTVBTbW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCisJCUJPT0xFQU4JCUF1dG9CQTsJLy8gQXV0byBCQSB3aWxsIGF1dG9tYXRpY2FsbHkKK30gT0lEX0JBQ0FQX1NUUlVDLCAqUE9JRF9CQUNBUF9TVFJVQzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BQ0xfRU5UUlkgeworICAgIFVDSEFSICAgQWRkcltNQUNfQUREUl9MRU5HVEhdOworICAgIFVTSE9SVCAgUnN2OworfSBSVF84MDJfMTFfQUNMX0VOVFJZLCAqUFJUXzgwMl8xMV9BQ0xfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX0FDTCB7CisgICAgVUxPTkcgICBQb2xpY3k7ICAgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1wb3NpdGl2ZSBsaXN0LCAyLW5lZ2F0aXZlIGxpc3QKKyAgICBVTE9ORyAgIE51bTsKKyAgICBSVF84MDJfMTFfQUNMX0VOVFJZIEVudHJ5W01BWF9OVU1CRVJfT0ZfQUNMXTsKK30gUlRfODAyXzExX0FDTCwgKlBSVF84MDJfMTFfQUNMOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1dEUyB7CisgICAgVUxPTkcJCQkJCQlOdW07CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCUVudHJ5WzI0LypNQVhfTlVNX09GX1dEU19MSU5LKi9dOworCVVMT05HCQkJCQkJS2V5TGVuZ3RoOworCVVDSEFSCQkJCQkJS2V5TWF0ZXJpYWxbMzJdOworfSBSVF84MDJfMTFfV0RTLCAqUFJUXzgwMl8xMV9XRFM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfVFhfUkFURVNfIHsKKyAgICBVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworICAgIFVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKKyAgICBVQ0hBUiAgICAgICBFeHRSYXRlTGVuOworICAgIFVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKK30gUlRfODAyXzExX1RYX1JBVEVTLCAqUFJUXzgwMl8xMV9UWF9SQVRFUzsKKworCisvLyBEZWZpbml0aW9uIG9mIGV4dHJhIGluZm9ybWF0aW9uIGNvZGUKKyNkZWZpbmUJR0VORVJBTF9MSU5LX1VQCQkJMHgwCQkJLy8gTGluayBpcyBVcAorI2RlZmluZQlHRU5FUkFMX0xJTktfRE9XTgkJMHgxCQkJLy8gTGluayBpcyBEb3duCisjZGVmaW5lCUhXX1JBRElPX09GRgkJCTB4MgkJCS8vIEhhcmR3YXJlIHJhZGlvIG9mZgorI2RlZmluZQlTV19SQURJT19PRkYJCQkweDMJCQkvLyBTb2Z0d2FyZSByYWRpbyBvZmYKKyNkZWZpbmUJQVVUSF9GQUlMCQkJCTB4NAkJCS8vIE9wZW4gYXV0aGVudGljYXRpb24gZmFpbAorI2RlZmluZQlBVVRIX0ZBSUxfS0VZUwkJCTB4NQkJCS8vIFNoYXJlZCBhdXRoZW50aWNhdGlvbiBmYWlsCisjZGVmaW5lCUFTU09DX0ZBSUwJCQkJMHg2CQkJLy8gQXNzb2NpYXRpb24gZmFpbGVkCisjZGVmaW5lCUVBUF9NSUNfRkFJTFVSRQkJCTB4NwkJCS8vIERlYXV0aGVuY2F0aW9uIGJlY2F1c2UgTUlDIGZhaWx1cmUKKyNkZWZpbmUJRUFQXzRXQVlfVElNRU9VVAkJMHg4CQkJLy8gRGVhdXRoZW5jYXRpb24gb24gNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQKKyNkZWZpbmUJRUFQX0dST1VQX0tFWV9USU1FT1VUCTB4OQkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIGdyb3VwIGtleSBoYW5kc2hha2UgdGltZW91dAorI2RlZmluZQlFQVBfU1VDQ0VTUwkJCQkweGEJCQkvLyBFQVAgc3VjY2VlZAorI2RlZmluZQlERVRFQ1RfUkFEQVJfU0lHTkFMCQkweGIgICAgICAgICAvLyBSYWRhciBzaWduYWwgb2NjdXIgaW4gY3VycmVudCBjaGFubmVsCisjZGVmaW5lIEVYVFJBX0lORk9fTUFYCQkJMHhiCQkJLy8gSW5kaWNhdGUgTGFzdCBPSUQKKworI2RlZmluZSBFWFRSQV9JTkZPX0NMRUFSCQkweGZmZmZmZmZmCisKKy8vIFRoaXMgaXMgT0lEIHNldHRpbmcgc3RydWN0dXJlLiBTbyBvbmx5IEdGIG9yIE1NIGFzIE1vZGUuIFRoaXMgaXMgdmFsaWQgd2hlbiBvdXIgd2lyZWxzcyBtb2RlIGhhcyA4MDIuMTFuIGluIHVzZS4KK3R5cGVkZWYgc3RydWN0IHsKKwlSVF84MDJfMTFfUEhZX01PREUJCVBoeU1vZGU7IAkvLworCVVDSEFSCQlUcmFuc21pdE5vOworCVVDSEFSCQlIdE1vZGU7IAkvL0hUTU9ERV9HRiBvciBIVE1PREVfTU0KKwlVQ0hBUgkJRXh0T2Zmc2V0OwkvL2V4dGVuc2lvbiBjaGFubmVsIGFib3ZlIG9yIGJlbG93CisJVUNIQVIJCU1DUzsKKwlVQ0hBUiAgIAlCVzsKKwlVQ0hBUgkJU1RCQzsKKwlVQ0hBUgkJU0hPUlRHSTsKKwlVQ0hBUgkJcnN2OworfSBPSURfU0VUX0hUX1BIWU1PREUsICpQT0lEX1NFVF9IVF9QSFlNT0RFOworCisjaWZkZWYgTExURF9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSB7CisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgTU9SOyAgICAgICAgLy8gbWF4aW11bSBvcGVyYXRpb25hbCByYXRlCisgICAgVUNIQVIgICAgICAgICAgIHBoeU1vZGU7Cit9IFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlksICpQUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUgeworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBOdW07CisgICAgUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSAgIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsKK30gUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFOworI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvL3J0Mjg2MCwga2F0aHkgMjAwNy0wMTE4CisvLyBzdHJ1Y3R1cmUgZm9yIERMUwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFNfVUkgeworCVVTSE9SVAkJCQkJCVRpbWVPdXQ7CQkvLyB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworfSBSVF84MDJfMTFfRExTX1VJLCAqUFJUXzgwMl8xMV9ETFNfVUk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTX0lORk8geworCVJUXzgwMl8xMV9ETFNfVUkJRW50cnlbTUFYX05VTUJFUl9PRl9ETFNfRU5UUlldOworCVVDSEFSCQkJCW51bTsKK30gUlRfODAyXzExX0RMU19JTkZPLCAqUFJUXzgwMl8xMV9ETFNfSU5GTzsKKwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRExTX01PREUgeworICAgIERMU19OT05FLAorICAgIERMU19XQUlUX0tFWSwKKyAgICBETFNfRklOSVNICit9IFJUXzgwMl8xMV9ETFNfTU9ERTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJUlRfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUJUlRfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAxMDIKKyNkZWZpbmUJUlRfUkVRSUVfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUJUlRfUkVTUElFX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKKyNkZWZpbmUJUlRfQVNTT0NJTkZPX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAweDAxMDUKKyNkZWZpbmUgUlRfUE1LSURDQU5EX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDYKKyNkZWZpbmUgUlRfSU5URVJGQUNFX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDcKKyNkZWZpbmUgUlRfSU5URVJGQUNFX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiAxMjgKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRF9DTElFTlRfTU9ERQoreworICAgUnQ4MDJfMTFfRF9Ob25lLAorICAgUnQ4MDJfMTFfRF9GbGV4aWJsZSwKKyAgIFJ0ODAyXzExX0RfU3RyaWN0LAorfSBSVF84MDJfMTFfRF9DTElFTlRfTU9ERSwgKlBSVF84MDJfMTFfRF9DTElFTlRfTU9ERTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0NIQU5ORUxfTElTVF9JTkZPCit7CisJVUNIQVIgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKKwlVQ0hBUiBDaGFubmVsTGlzdE51bTsgLy8gbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXQorfSBSVF9DSEFOTkVMX0xJU1RfSU5GTywgKlBSVF9DSEFOTkVMX0xJU1RfSU5GTzsKKworCisjZW5kaWYgLy8gX09JRF9IXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjg2MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTcyMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1JUMjg2MF9IX18KKyNkZWZpbmUgX19SVDI4NjBfSF9fCisKKyNkZWZpbmUgUlQyOHh4X0NISVBfTkFNRQkiUlQyODYwIgorCisjZGVmaW5lIFRYSU5GT19TSVpFICAgICAgICAgICAgICAgMAorI2RlZmluZSBUWFBBRERJTkdfU0laRSAgICAgIAkgIDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQsIHZhcikJCVwKKwl2YXIgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQpCisKKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YXIpCQlcCisJUlRNUF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFyKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBUQVNLL1RIUkVBRCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKQkJXAorCWluaXRfdGhyZWFkX3Rhc2socEFkKTsgTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKHBBZCk7CVwKKwlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIElSUV9IQU5ETEVfVFlQRSAgaXJxcmV0dXJuX3QKKyNlbHNlCisjZGVmaW5lIElSUV9IQU5ETEVfVFlQRSAgdm9pZAorI2VuZGlmCisKK0lSUV9IQU5ETEVfVFlQRQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkKK3J0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKKyNlbHNlCitydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEZyaW13YXJlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX1dSSVRFX0ZJUk1XQVJFKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQkJCQlcCisJZG97CQkJCQkJCQkJCQkJCQkJCVwKKwkJVUxPTkcJX2ksIF9maXJtOwkJCQkJCQkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQlcCisJCWZvcihfaT0wOyBfaTxfRndMZW47IF9pKz00KQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCVwKKwkJCV9maXJtID0gX3BGd0ltYWdlW19pXSArCQkJCQkJCQkJXAorCQkJICAgKF9wRndJbWFnZVtfaSszXSA8PCAyNCkgKwkJCQkJCQlcCisJCQkgICAoX3BGd0ltYWdlW19pKzJdIDw8IDE2KSArCQkJCQkJCVwKKwkJCSAgIChfcEZ3SW1hZ2VbX2krMV0gPDwgOCk7CQkJCQkJCQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIF9pLCBfZmlybSk7CVwKKwkJfQkJCQkJCQkJCQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMCk7CQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJXAorCQkvKiBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50ICovCQkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CQkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOwkJCQkJXAorCX13aGlsZSgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBUWCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCWRve313aGlsZSgwKQorI2RlZmluZSBSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCWRve313aGlsZSgwKQorCisKKyNkZWZpbmUgUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBmcmVlTnVtLCBwUGFja2V0KSBcCisJCSgoZnJlZU51bSkgPj0gKFVMT05HKShwVHhCbGstPlRvdGFsRnJhZ051bSArIFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCkgKyAzKSkgLyogcm91Z2ggZXN0aW1hdGUgd2Ugd2lsbCB1c2UgMyBtb3JlIGRlc2NyaXB0b3IuICovCisjZGVmaW5lIFJUMjhYWF9SRUxFQVNFX0RFU0NfUkVTT1VSQ0UocEFkLCBRdWVJZHgpCQkJCQlcCisJCWRve313aGlsZSgwKQorCisjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKHBBZCwgUXVlSWR4LCBmcmVlTnVtLCBfVHhGcmFtZVR5cGUpIFwKKwkJKCgoZnJlZU51bSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMCkpIHx8IChmcmVlTnVtPDMpKQorCQkvLygoKGZyZWVOdW0pICE9IChUWF9SSU5HX1NJWkUtMSkpICYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA9PSAxIC8qMCovKSkKKworCisjZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQlcCisJCQlSdG1wUENJTWdtdEtpY2tPdXQoX3BBZCwgX1F1ZUlkeCwgX3BQYWNrZXQsIF9wU3JjQnVmVkEsIF9TcmNCdWZMZW4pCisKKyNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HIDAKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkwCisKKyNkZWZpbmUgSEFMX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJLyogUnRtcFBDSV9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKSovCisKKyNkZWZpbmUgSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsayxiSXNMYXN0LCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAorCQkJUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKF9wQWQsIF9wVHhCbGssIF9Ub3RhbE1QRFVTaXplLCBfRmlyc3RUeElkeCkJXAorCQkJUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCisKKyNkZWZpbmUgSEFMX0xhc3RUeElkeChfcEFkLCBfUXVlSWR4LF9MYXN0VHhJZHgpIFwKKwkJCS8qUnRtcFBDSURhdGFMYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSovCisKKyNkZWZpbmUgSEFMX0tpY2tPdXRUeChfcEFkLCBfcFR4QmxrLCBfUXVlSWR4KQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBUWF9DVFhfSURYMCsoKF9RdWVJZHgpKjB4MTApLCAoX3BBZCktPlR4UmluZ1soX1F1ZUlkeCldLlR4Q3B1SWR4KQorLyoJCQlSdG1wUENJRGF0YUtpY2tPdXQoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkqLworCisjZGVmaW5lIEhBTF9LaWNrT3V0TnVsbEZyYW1lVHgoX3BBZCwgX1F1ZUlkeCwgX3BOdWxsRnJhbWUsIF9mcmFtZUxlbikJXAorCQkJTWluaXBvcnRNTVJlcXVlc3QoX3BBZCwgX1F1ZUlkeCwgX3BOdWxsRnJhbWUsIF9mcmFtZUxlbikKKworI2RlZmluZSBHRVRfVFhSSU5HX0ZSRUVOTyhfcEFkLCBfUXVlSWR4KSBcCisJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCA+IF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCkJPyBcCisJCQkoX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4U3dGcmVlSWR4IC0gX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4Q3B1SWR4IC0gMSkgXAorCQkJIDoJXAorCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCArIFRYX1JJTkdfU0laRSAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpOworCisKKyNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKSBcCisJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID4gX3BBZC0+TWdtdFJpbmcuVHhDcHVJZHgpCT8gXAorCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IC0gX3BBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxKSBcCisJCQkgOglcCisJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBubyB1c2UKKyNkZWZpbmUgUlQyOFhYX1JDVl9QS1RfR0VUX0lOSVQocEFkKQorI2RlZmluZSBSVDI4WFhfUlZfQV9CVUZfRU5ECisvLyNkZWZpbmUgUlQyOFhYX1JWX0FMTF9CVUZfRU5ECisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gQVNJQyBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBubyB1c2UKKyNkZWZpbmUgUlQyOFhYX0RNQV9QT1NUX1dSSVRFKHBBZCkKKworLy8gcmVzZXQgTUFDIG9mIGEgc3RhdGlvbiBlbnRyeSB0byAweDAwMDAwMDAwMDAwMAorI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIFdjaWQpCQkJCQkJXAorCUFzaWNEZWxXY2lkVGFiKHBBZCwgV2NpZCk7CisKKy8vIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQorI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSkJCQkJCQkJXAorCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHIpOworCisvLyByZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQkJCQkJXAorCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQnNzSWR4LCAoVUNIQVIpV2NpZCk7CisKKy8vIGFkZCBDbGllbnQgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW50byBBU0lDIFdDSUQgdGFibGUgYW5kIElWRUlWIHRhYmxlCisjZGVmaW5lIFJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCVwKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELCAJCQkJCVwKKwkJCQkJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywgcEVudHJ5KTsKKworI2RlZmluZSBSVDI4WFhfU0VDVVJJVFlfS0VZX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJCQlcCisJewkvKiB1cGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZSAqLwlcCisJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwJCQkJCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnLAkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLktleSwJCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLlR4TWljLAkJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5SeE1pYyk7CQkJXAorCQkvKiB1cGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8JCQlcCisJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBhcGlkeCwgS2V5SUQsCQkJCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnLAkJXAorCQkJCQkJICBwRW50cnkpOyB9CisKKworLy8gSW5zZXJ0IHRoZSBCQSBiaXRtYXAgdG8gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKKyNkZWZpbmUgUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMoX3BBZCwgX0FpZCwgX1RJRCkJCQkJCVwKKwkJZG97CQkJCQkJCQkJCQkJCQkJCVwKKwkJCVVJTlQzMglfVmFsdWUgPSAwLCBfT2Zmc2V0OwkJCQkJCQkJCVwKKwkJCV9PZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKF9BaWQpICogSFdfV0NJRF9FTlRSWV9TSVpFICsgNDsJXAorCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBfT2Zmc2V0LCAmX1ZhbHVlKTsJCQkJCVwKKwkJCV9WYWx1ZSB8PSAoMHgxMDAwMDw8KF9USUQpKTsJCQkJCQkJCVwKKwkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIF9PZmZzZXQsIF9WYWx1ZSk7CQkJCQlcCisJCX13aGlsZSgwKQorCisKKy8vIFJlbW92ZSB0aGUgQkEgYml0bWFwIGZyb20gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKKy8vCQliaXRtYXAgZmllbGQgc3RhcnRzIGF0IDB4MTAwMDAgaW4gQVNJQyBXQ0lEIHRhYmxlCisjZGVmaW5lIFJUMjhYWF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMoX3BBZCwgX1djaWQsIF9USUQpCQkJCVwKKwkJZG97CQkJCQkJCQkJCQkJCQkJCVwKKwkJCVVJTlQzMglfVmFsdWUgPSAwLCBfT2Zmc2V0OwkJCQkJCQkJCVwKKwkJCV9PZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKF9XY2lkKSAqIEhXX1dDSURfRU5UUllfU0laRSArIDQ7CVwKKwkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgX09mZnNldCwgJl9WYWx1ZSk7CQkJCQlcCisJCQlfVmFsdWUgJj0gKH4oMHgxMDAwMCA8PCAoX1RJRCkpKTsJCQkJCQkJXAorCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTsJCQlcCisJCX13aGlsZSgwKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFBDSS9VU0IgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKQkJCQlcCisJKChQT1NfQ09PS0lFKWhhbmRsZSktPnBjaV9kZXYgPSBkZXZfcDsKKworLy8gc2V0IGRyaXZlciBkYXRhCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkJCQlwY2lfc2V0X2RydmRhdGEoX2EsIG5ldF9kZXYpOworCisjZGVmaW5lIFJUMjhYWF9VTk1BUCgpCQkJCQkJCQkJCVwKK3sJaWYgKG5ldF9kZXYtPmJhc2VfYWRkcikJewkJCQkJCQkJXAorCQlpb3VubWFwKCh2b2lkICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOwkJCQlcCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2X3AsIDApLAlcCisJCQkJCQkJcGNpX3Jlc291cmNlX2xlbihkZXZfcCwgMCkpOyB9CVwKKwlpZiAobmV0X2Rldi0+aXJxKSBwY2lfcmVsZWFzZV9yZWdpb25zKGRldl9wKTsgfQorCisjaWZkZWYgUENJX01TSV9TVVBQT1JUCisjZGVmaW5lIFJUTVBfTVNJX0VOQUJMRShfcEFkKSBcCit7IAlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7IFwKKwkoX3BBZCktPkhhdmVNc2kgPQlwY2lfZW5hYmxlX21zaShfcE9iai0+cGNpX2RldikgPT0gMCA/IFRSVUUgOiBGQUxTRTsgfQorCisjZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkgXAoreyAJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOyBcCisJaWYgKF9wQWQtPkhhdmVNc2kgPT0gVFJVRSkgXAorCQlwY2lfZGlzYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpOyBcCisJX3BBZC0+SGF2ZU1zaSA9IEZBTFNFOwl9CisjZWxzZQorI2RlZmluZSBSVE1QX01TSV9FTkFCTEUoX3BBZCkKKyNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKQorI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyNkZWZpbmUgU0FfU0hJUlEgSVJRRl9TSEFSRUQKKyNlbmRpZgorCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KQkJCQkJCQlcCit7CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKSgobmV0X2RldiktPm1sX3ByaXYpOwlcCisJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJXAorCVJUTVBfTVNJX0VOQUJMRShfcEFkKTsJCQkJCQkJCQlcCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAJCVwKKwkJCQkJCQlydDI4NjBfaW50ZXJydXB0LCBTQV9TSElSUSwJCVwKKwkJCQkJCQkobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSkpKSB7CVwKKwkJcHJpbnRrKCJSVDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7CVwKKwlyZXR1cm4gcmV0dmFsOyB9IH0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpCQkJCQkJCQlcCit7CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKSgobmV0X2RldiktPm1sX3ByaXYpOwkJXAorCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsJCQlcCisJc3luY2hyb25pemVfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEpOwkJCQkJCVwKKwlmcmVlX2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAobmV0X2RldikpOwkJCQkJXAorCVJUTVBfTVNJX0RJU0FCTEUoX3BBZCk7IH0KKyNlbHNlCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KQkJCQkJCQkJXAorewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoKG5ldF9kZXYpLT5wcml2KTsJCVwKKwlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7CQkJXAorCWZyZWVfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEsIChuZXRfZGV2KSk7CQkJCQlcCisJUlRNUF9NU0lfRElTQUJMRShfcEFkKTsgfQorI2VuZGlmCisKKyNkZWZpbmUgUlQyOFhYX0lSUV9JTklUKHBBZCkJCQkJCQkJCQkJXAorCXsJcEFkLT5pbnRfZW5hYmxlX3JlZyA9ICgoREVMQVlJTlRNQVNLKSB8CQkJCQkJXAorCQkJCQkJCShSeElOVHxUeERhdGFJbnR8VHhNZ210SW50KSkgJiB+KDB4MDMpOwlcCisJCXBBZC0+aW50X2Rpc2FibGVfbWFzayA9IDA7CQkJCQkJCQkJXAorCQlwQWQtPmludF9wZW5kaW5nID0gMDsgfQorCisjZGVmaW5lIFJUMjhYWF9JUlFfRU5BQkxFKHBBZCkJCQkJCQkJCQlcCisJewkvKiBjbGVhciBnYXJiYWdlIGludHMgKi8JCQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIDB4ZmZmZmZmZmYpOwkJXAorCQlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsgfQorCisjZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFKGRldl9wKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIE1MTUUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCkJCQlNbG1lSGFuZGxlcihwQWQpCisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpCisKKyNkZWZpbmUgUlQyOFhYX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAorCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWQpCVwKKwkJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUocEFkKQorCisjZGVmaW5lIFJUMjhYWF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpCQlcCisJCUhhbmRsZUNvdW50ZXJNZWFzdXJlKF9wQWQsIF9wRW50cnkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFBvd2VyIFNhdmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCkJCQkJRW5xdWV1ZVBzUG9sbChwQWQpCisKKy8vCisvLyBEZXZpY2UgSUQgJiBWZW5kb3IgSUQsIHRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2ggRUVQUk9NIHZhbHVlCisvLworI2RlZmluZSBOSUMyODYwX1BDSV9ERVZJQ0VfSUQgICAweDA2MDEKKyNkZWZpbmUgTklDMjg2MF9QQ0llX0RFVklDRV9JRCAgMHgwNjgxCisjZGVmaW5lIE5JQzI3NjBfUENJX0RFVklDRV9JRCAgIDB4MDcwMQkJLy8gMVQvMlIgQ2FyZGJ1cyA/Pz8KKyNkZWZpbmUgTklDMjc5MF9QQ0llX0RFVklDRV9JRCAgMHgwNzgxCSAgICAvLyAxVC8yUiBtaW5pQ2FyZAorCisjZGVmaW5lIE5JQ19QQ0lfVkVORE9SX0lEICAgICAgIDB4MTgxNAorCisjZGVmaW5lIFZFTl9BV1RfUENJZV9ERVZJQ0VfSUQJMHgxMDU5CisjZGVmaW5lIFZFTl9BV1RfUENJX1ZFTkRPUl9JRAkweDFBM0IKKworLy8gRm9yIFJUTVBQQ0llUG93ZXJMaW5rQ3RybFJlc3RvcmUgKCkgZnVuY3Rpb24KKyNkZWZpbmUgUkVTVE9SRV9IQUxUCQkgICAgMQorI2RlZmluZSBSRVNUT1JFX1dBS0VVUAkJICAgIDIKKyNkZWZpbmUgUkVTVE9SRV9DTE9TRSAgICAgICAgICAgMworCisjZGVmaW5lIFBvd2VyU2FmZUNJRAkJMQorI2RlZmluZSBQb3dlclJhZGlvT2ZmQ0lECQkyCisjZGVmaW5lIFBvd2VyV2FrZUNJRAkJMworI2RlZmluZSBDSUQwTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBDSUQxTUFTSwkJMHgwMDAwZmYwMAorI2RlZmluZSBDSUQyTUFTSwkJMHgwMGZmMDAwMAorI2RlZmluZSBDSUQzTUFTSwkJMHhmZjAwMDAwMAorCisjZGVmaW5lIFBDSV9SRUdfUkVBRF9XT1JEKHBjaV9kZXYsIG9mZnNldCwgQ29uZmlndXJhdGlvbikgICBcCisgICAgaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgJnJlZzE2KSA9PSAwKSAgICAgXAorICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENvbmZpZ3VyYXRpb24gPSAwOworCisjZGVmaW5lIFBDSV9SRUdfV0lSVEVfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICBcCisgICAgcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgcmVnMTYpOyAgICAgICAgICBcCisKKyNkZWZpbmUgUlQyOFhYX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBiRnJvbVR4KSBcCisgICAgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKHBBZCwgYkZyb21UeCk7CisKKyNkZWZpbmUgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCkgXAorICAgIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKSBcCisgICAgUlQyOHh4UGNpTWxtZVJhZGlvT24ocEFkKTsKKworI2RlZmluZSBSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKSBcCisgICAgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKHBBZCk7CisKKyNlbmRpZiAvL19fUlQyODYwX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjh4eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjIzMDQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaApAQCAtMCwwICsxLDI3MTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnQyOHh4LmgKKworCUFic3RyYWN0OgorCVJUMjh4eCBBU0lDIHJlbGF0ZWQgZGVmaW5pdGlvbiAmIHN0cnVjdHVyZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJICBXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBKYW4gTGVlICAgICAgICAgICBKYW4tMy0yMDA2ICAgICBjcmVhdGVkIGZvciBSVDI4NjBjCisqLworCisjaWZuZGVmCV9fUlQyOFhYX0hfXworI2RlZmluZQlfX1JUMjhYWF9IX18KKworCisvLworLy8gUENJIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDAwMDAKKy8vCisjZGVmaW5lIFBDSV9DRkcJCQkweDAwMDAKKyNkZWZpbmUgUENJX0VFQ1RSTAkJCTB4MDAwNAorI2RlZmluZSBQQ0lfTUNVQ1RSTAkJCTB4MDAwOAorCisvLworLy8gU0NIL0RNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMjAwCisvLworLy8gSU5UX1NPVVJDRV9DU1I6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIuIFdyaXRlIG9uZSB0byBjbGVhciBjb3JyZXNwb25kaW5nIGJpdAorLy8KKyNkZWZpbmUgRE1BX0NTUjAgICAgICAweDIwMAorI2RlZmluZSBJTlRfU09VUkNFX0NTUiAgICAgIDB4MjAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSU5UX1NPVVJDRV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJOjE0OworCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJR1BUaW1lcjoxOworCQlVSU5UMzIgICAgICAgCUF1dG9XYWtldXA6MTsvL2JpdDE0CisJCVVJTlQzMiAgICAgICAJVFhGaWZvU3RhdHVzSW50OjE7Ly9GSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjCisJCVVJTlQzMiAgICAgICAJUHJlVEJUVDoxOworCQlVSU5UMzIgICAgICAgCVRCVFRJbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlSeFR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlUeERlbGF5SU5UOjE7CS8vZGVsYXllZCBpbnRlcnJ1cHQsIG5vdCBpbnRlcnJ1cHQgdW50aWwgc2V2ZXJhbCBpbnQgb3IgdGltZSBsaW1pdCBoaXQKKwkJVUlOVDMyCQlSeERlbGF5SU5UOjE7IC8vZGVhbHllZCBpbnRlcnJ1cHQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUlOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lOVF9TT1VSQ0VfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJ4RGVsYXlJTlQ6MTsKKwkJVUlOVDMyCQlUeERlbGF5SU5UOjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOy8vNAorCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7IC8vIGJpdDcKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsvL2JpdCA5CisJCVVJTlQzMiAgICAgICAJUnhUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJVEJUVEludDoxOworCQlVSU5UMzIgICAgICAgCVByZVRCVFQ6MTsKKwkJVUlOVDMyICAgICAgIAlUWEZpZm9TdGF0dXNJbnQ6MTsvL0ZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMKKwkJVUlOVDMyICAgICAgIAlBdXRvV2FrZXVwOjE7Ly9iaXQxNAorCQlVSU5UMzIgICAgICAgCUdQVGltZXI6MTsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7Ly9iaXQxNgorCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MTQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYKKy8vCisjZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MjA7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJVHhEZWxheToxOworCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31JTlRfTUFTS19DU1JfU1RSVUMsICpQSU5UX01BU0tfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lOVF9NQVNLX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSWERlbGF5X0lOVF9NU0s6MTsKKwkJVUlOVDMyCQlUeERlbGF5OjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJOjIwOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBJTlRfTUFTS19DU1JfU1RSVUMsICpQSU5UX01BU0tfQ1NSX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdQRE1BX0dMT19DRkcgCTB4MjA4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfV1BETUFfR0xPX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlIRFJfU0VHX0xFTjoxNjsKKwkJVUlOVDMyICAgICAgIAlSWEhkclNjYXRlcjo4OworCQlVSU5UMzIgICAgICAgCUJpZ0VuZGlhbjoxOworCQlVSU5UMzIgICAgICAgCUVuVFhXcml0ZUJhY2tERE9ORToxOworCQlVSU5UMzIgICAgICAgCVdQRE1BQnVyc3RTSVpFOjI7CisJCVVJTlQzMgkJUnhETUFCdXN5OjE7CisJCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKKwkJVUlOVDMyCQlUeERNQUJ1c3k6MTsKKwkJVUlOVDMyCQlFbmFibGVUeERNQToxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31XUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfV1BETUFfR0xPX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlFbmFibGVUeERNQToxOworCQlVSU5UMzIJCVR4RE1BQnVzeToxOworCQlVSU5UMzIJCUVuYWJsZVJ4RE1BOjE7CisJCVVJTlQzMgkJUnhETUFCdXN5OjE7CisJCVVJTlQzMiAgICAgICAJV1BETUFCdXJzdFNJWkU6MjsKKwkJVUlOVDMyICAgICAgIAlFblRYV3JpdGVCYWNrRERPTkU6MTsKKwkJVUlOVDMyICAgICAgIAlCaWdFbmRpYW46MTsKKwkJVUlOVDMyICAgICAgIAlSWEhkclNjYXRlcjo4OworCQlVSU5UMzIgICAgICAgCUhEUl9TRUdfTEVOOjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gV1BETUFfR0xPX0NGR19TVFJVQywgKlBXUERNQV9HTE9fQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdQRE1BX1JTVF9JRFggCTB4MjBjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAk6MTU7CisJCVVJTlQzMiAgICAgICAJUlNUX0RSWF9JRFgwOjE7CisJCVVJTlQzMiAgICAgICAJcnN2OjEwOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNToxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNDoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31XUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDA6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDE6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDI6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDM6MTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDQ6MTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDU6MTsKKwkJVUlOVDMyICAgICAgIAlyc3Y6MTA7CisJCVVJTlQzMiAgICAgICAJUlNUX0RSWF9JRFgwOjE7CisJCVVJTlQzMiAgICAgICAJOjE1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gV1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIERFTEFZX0lOVF9DRkcgIDB4MDIxMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJVFhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJUlhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJUlhNQVhfUElOVDo3OworCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfURFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJUlhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVJYRExZX0lOVF9FTjoxOworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVRYRExZX0lOVF9FTjoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdNTV9BSUZTTl9DRkcgICAweDAyMTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEFpZnNuMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEFpZnNuMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgUnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIENXTUlOX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQworLy8KKyNkZWZpbmUgV01NX0NXTUlOX0NGRyAgIDB4MDIxOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBDV01BWF9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKKy8vCisjZGVmaW5lIFdNTV9DV01BWF9DRkcgICAweDAyMWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgUnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBBQ19UWE9QX0NTUjA6IEFDX0JLL0FDX0JFIFRYT1AgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFdNTV9UWE9QMF9DRkcgICAgMHgwMjIwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjMVR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjMFR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IwX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJJTkdSRUdfRElGRgkJCTB4MTAKKyNkZWZpbmUgR1BJT19DVFJMX0NGRyAgICAweDAyMjgJLy9NQUNfQ1NSMTMKKyNkZWZpbmUgTUNVX0NNRF9DRkcgICAgMHgwMjJjCisjZGVmaW5lIFRYX0JBU0VfUFRSMCAgICAgMHgwMjMwCS8vQUNfQksgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQwICAgICAgMHgwMjM0CisjZGVmaW5lIFRYX0NUWF9JRFgwICAgICAgIDB4MDIzOAorI2RlZmluZSBUWF9EVFhfSURYMCAgICAgIDB4MDIzYworI2RlZmluZSBUWF9CQVNFX1BUUjEgICAgIDB4MDI0MCAJLy9BQ19CRSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDEgICAgICAweDAyNDQKKyNkZWZpbmUgVFhfQ1RYX0lEWDEgICAgICAgMHgwMjQ4CisjZGVmaW5lIFRYX0RUWF9JRFgxICAgICAgMHgwMjRjCisjZGVmaW5lIFRYX0JBU0VfUFRSMiAgICAgMHgwMjUwIAkvL0FDX1ZJIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMiAgICAgIDB4MDI1NAorI2RlZmluZSBUWF9DVFhfSURYMiAgICAgICAweDAyNTgKKyNkZWZpbmUgVFhfRFRYX0lEWDIgICAgICAweDAyNWMKKyNkZWZpbmUgVFhfQkFTRV9QVFIzICAgICAweDAyNjAgCS8vQUNfVk8gYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQzICAgICAgMHgwMjY0CisjZGVmaW5lIFRYX0NUWF9JRFgzICAgICAgIDB4MDI2OAorI2RlZmluZSBUWF9EVFhfSURYMyAgICAgIDB4MDI2YworI2RlZmluZSBUWF9CQVNFX1BUUjQgICAgIDB4MDI3MCAJLy9IQ0NBIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UNCAgICAgIDB4MDI3NAorI2RlZmluZSBUWF9DVFhfSURYNCAgICAgICAweDAyNzgKKyNkZWZpbmUgVFhfRFRYX0lEWDQgICAgICAweDAyN2MKKyNkZWZpbmUgVFhfQkFTRV9QVFI1ICAgICAweDAyODAgCS8vTUdNVCBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgIFRYX01BWF9DTlQ1ICAgICAweDAyODQKKyNkZWZpbmUgVFhfQ1RYX0lEWDUgICAgICAgMHgwMjg4CisjZGVmaW5lIFRYX0RUWF9JRFg1ICAgICAgMHgwMjhjCisjZGVmaW5lIFRYX01HTVRNQVhfQ05UICAgICAgVFhfTUFYX0NOVDUKKyNkZWZpbmUgVFhfTUdNVENUWF9JRFggICAgICAgVFhfQ1RYX0lEWDUKKyNkZWZpbmUgVFhfTUdNVERUWF9JRFggICAgICBUWF9EVFhfSURYNQorI2RlZmluZSBSWF9CQVNFX1BUUiAgICAgMHgwMjkwIAkvL1JYIGJhc2UgYWRkcmVzcworI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0CisjZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4CisjZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKKyNkZWZpbmUgVVNCX0RNQV9DRkcgICAgICAweDAyYTAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9VU0JfRE1BX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBUeEJ1c3k6MTsgICAJLy9VU0IgRE1BIFRYIEZTTSBidXN5IC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIFJ4QnVzeToxOyAgICAgICAgLy9VU0IgRE1BIFJYIEZTTSBidXN5IC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIEVwb3V0VmFsaWQ6NjsgICAgICAgIC8vT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQuIGRlYnVnIG9ubHkKKwkgICAgVUlOVDMyICBUeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBUeAorCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4CisJICAgIFVJTlQzMiAgUnhCdWxrQWdnRW46MTsgICAgICAgIC8vRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24KKwkgICAgVUlOVDMyICBUeG9wSGFsdDoxOyAgICAgICAgLy9IYWx0IFRYT1AgY291bnQgZG93biB3aGVuIFRYIGJ1ZmZlciBpcyBmdWxsLgorCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgcGh5Y2xlYXI6MTsgICAgICAgIAkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQorCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDEwMjQgYnl0ZXMKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dUT3V0Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gVGltZU91dCAgaW4gdW5pdCBvZiAzM25zCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlVU0JfRE1BX0NGR19TVFJVQywgKlBVU0JfRE1BX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9VU0JfRE1BX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dUT3V0Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gVGltZU91dCAgaW4gdW5pdCBvZiAzM25zCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnTG10Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgIGluIHVuaXQgb2YgMjU2IGJ5dGVzCisJICAgIFVJTlQzMiAgcGh5Y2xlYXI6MTsgICAgICAgIAkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQorCSAgICBVSU5UMzIgIHJzdjoyOworCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCisJICAgIFVJTlQzMiAgVHhvcEhhbHQ6MTsgICAgICAgIC8vSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgorCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4CisJICAgIFVJTlQzMiAgVHhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgVHgKKwkgICAgVUlOVDMyICBFcG91dFZhbGlkOjY7ICAgICAgICAvL09VVCBlbmRwb2ludCBkYXRhIHZhbGlkCisJICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kKKwkgICAgVUlOVDMyICBUeEJ1c3k6MTsgICAJLy9VU0IgRE1BIFRYIEZTTSBidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlVU0JfRE1BX0NGR19TVFJVQywgKlBVU0JfRE1BX0NGR19TVFJVQzsKKyNlbmRpZgorCisvLworLy8gIDMgIFBCRiAgcmVnaXN0ZXJzCisvLworLy8KKy8vIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLgorI2RlZmluZSAJUEJGX1NZU19DVFJMIAkgMHgwNDAwCisjZGVmaW5lICAgICBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKKyNkZWZpbmUgCVBCRl9NQVhfUENOVCAJIDB4MDQwQworI2RlZmluZSAJUEJGX0NUUkwJIAkweDA0MTAKKyNkZWZpbmUgCVBCRl9JTlRfU1RBCSAweDA0MTQKKyNkZWZpbmUgCVBCRl9JTlRfRU5BCSAweDA0MTgKKyNkZWZpbmUgCVRYUlhRX1BDTlQgIAkgMHgwNDM4CisjZGVmaW5lIAlQQkZfREJHIAkgCSAweDA0M2MKKyNkZWZpbmUgICAgIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCisKKy8vCisvLyAgNCAgTUFDICByZWdpc3RlcnMKKy8vCisvLworLy8gIDQuMSBNQUMgU1lTVEVNICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTAwMCkKKy8vCisjZGVmaW5lIE1BQ19DU1IwICAgICAgICAgICAgMHgxMDAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQVNJQ19WRVJfSURfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQVNJQ1ZlcjsgICAgICAgIC8vIHZlcnNpb24gOiAyODYwCisJICAgIFVTSE9SVCAgQVNJQ1JldjsgICAgICAgIC8vIHJldmVyc2lvbiAgOiAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKKwkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIE1BQ19TWVNfQ1RSTCAgICAgICAgICAgIDB4MTAwNAkJLy9NQUNfQ1NSMQorI2RlZmluZSBNQUNfQUREUl9EVzAgICAgICAgICAgICAJCTB4MTAwOAkJLy8gTUFDIEFERFIgRFcwCisjZGVmaW5lIE1BQ19BRERSX0RXMSAgICAgICAgICAgCQkgMHgxMDBjCQkvLyBNQUMgQUREUiBEVzEKKy8vCisvLyBNQUNfQ1NSMjogU1RBIE1BQyByZWdpc3RlciAwCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19EVzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMF9TVFJVQywgKlBNQUNfRFcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01BQ19EVzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMF9TVFJVQywgKlBNQUNfRFcwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBNQUNfQ1NSMzogU1RBIE1BQyByZWdpc3RlciAxCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19EVzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlSc3ZkMTsKKwkJVUNIQVIJCVUyTWVNYXNrOworCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKKwkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0RXMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJVTJNZU1hc2s7CisJCVVDSEFSCQlSc3ZkMTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIE1BQ19CU1NJRF9EVzAgICAgICAgICAgICAJCTB4MTAxMAkJLy8gTUFDIEJTU0lEIERXMAorI2RlZmluZSBNQUNfQlNTSURfRFcxICAgICAgICAgICAgCQkweDEwMTQJCS8vIE1BQyBCU1NJRCBEVzEKKworLy8KKy8vIE1BQ19DU1I1OiBCU1NJRCByZWdpc3RlciAxCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19DU1I1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCVJzdmQ6MTE7CisJCVVTSE9SVAkJTUJzc0Jjbk51bTozOworCQlVU0hPUlQJCUJzc0lkTW9kZToyOyAvLyAwOiBvbmUgQlNTSUQsIDEwOiA0IEJTU0lELCAgMDE6IDIgQlNTSUQgLCAxMTogOEJTU0lECisJCVVDSEFSCQlCeXRlNTsJCSAvLyBCU1NJRCBieXRlIDUKKwkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0NTUjVfU1RSVUMsICpQTUFDX0NTUjVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlNDsJCSAvLyBCU1NJRCBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQorCQlVU0hPUlQgICAgICAJQnNzSWRNYXNrOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKKwkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7CisJCVVTSE9SVAkJUnN2ZDoxMTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTUFYX0xFTl9DRkcgICAgICAgICAgICAgIDB4MTAxOAkJLy8gcnQyODYwYiBtYXggMTZrIGJ5dGVzLiBiaXQxMjoxMyBNYXhpbXVtIFBTRFUgbGVuZ3RoIChwb3dlciBmYWN0b3IpIDA6Ml4xMywgMToyXjE0LCAyOjJeMTUsIDM6Ml4xNgorI2RlZmluZSBCQlBfQ1NSX0NGRyAgICAgICAgICAgIAkJMHgxMDFjCQkvLworLy8KKy8vIEJCUF9DU1JfQ0ZHOiBCQlAgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJOjEyOworCQlVSU5UMzIJCUJCUF9SV19NT0RFOjE7CQkvLyAwOiB1c2Ugc2VyaWFsIG1vZGUgIDE6cGFyYWxsZWwKKwkJVUlOVDMyCQlCQlBfUEFSX0RVUjoxOwkJICAgIC8vIDA6IDQgTUFDIGNsb2NrIGN5Y2xlcyAgMTogOCBNQUMgY2xvY2sgY3ljbGVzCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCisJCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCisJCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQlBfQ1NSX0NGR19TVFJVQywgKlBCQlBfQ1NSX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9CQlBfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlWYWx1ZTo4OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQlSZWdOdW06ODsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlmUmVhZDoxOwkJICAgIC8vIDA6IFdyaXRlCUJCUCwgMToJUmVhZCBCQlAKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIEJCUCBwcm9ncmFtbWluZy4KKwkJVUlOVDMyCQlCQlBfUEFSX0RVUjoxOwkJICAgICAvLyAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcworCQlVSU5UMzIJCUJCUF9SV19NT0RFOjE7CQkvLyAwOiB1c2Ugc2VyaWFsIG1vZGUgIDE6cGFyYWxsZWwKKwkJVUlOVDMyCQk6MTI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQlBfQ1NSX0NGR19TVFJVQywgKlBCQlBfQ1NSX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSRl9DU1JfQ0ZHMCAgICAgICAgICAgIAkJMHgxMDIwCisvLworLy8gUkZfQ1NSX0NGRzogUkYgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKKwkJVUlOVDMyCQlTdGFuZGJ5TW9kZToxOwkJICAgIC8vIDA6IGhpZ2ggd2hlbiBzdGFuZCBieSAxOglsb3cgd2hlbiBzdGFuZGJ5CisJCVVJTlQzMgkJYml0d2lkdGg6NTsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKKwkJVUlOVDMyCQlTZWw6MTsJCQkJLy8gMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlCisJCVVJTlQzMgkJQnVzeToxOwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcwX1NUUlVDLCAqUFJGX0NTUl9DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcxICAgICAgICAgICAJCTB4MTAyNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCXJzdjo3OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwkJVUlOVDMyCQlSRkdhcDo1OwkJCS8vIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQlSRkdhcDo1OwkJCS8vIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykKKwkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMV9TVFJVQywgKlBSRl9DU1JfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSRl9DU1JfQ0ZHMiAgICAgICAgICAgCQkweDEwMjgJCS8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzJfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMl9TVFJVQywgKlBSRl9DU1JfQ0ZHMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExFRF9DRkcgICAgICAgICAgIAkJMHgxMDJjCQkvLyAgTUFDX0NTUjE0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTsKKwkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAorCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCisJCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQorCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCisJCVVJTlQzMgkJcnN2OjI7CisJCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCisJCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlPblBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9uIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCU9mZlBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMKKwkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKKwkJVUlOVDMyCQlyc3Y6MjsKKwkJVUlOVDMyCQlSTGVkTW9kZToyOwkJCS8vIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbgorCQlVSU5UMzIJCUdMZWRNb2RlOjI7CQkJLy8gZ3JlZW4gTGVkIE1vZGUKKwkJVUlOVDMyCQlZTGVkTW9kZToyOwkJCS8vIHllbGxvdyBMZWQgTW9kZQorCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCisJCVVJTlQzMgkJOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7CisjZW5kaWYKKy8vCisvLyAgNC4yIE1BQyBUSU1JTkcgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMTAwKQorLy8KKyNkZWZpbmUgWElGU19USU1FX0NGRyAgICAgICAgICAgICAweDExMDAJCSAvLyBNQUNfQ1NSOCAgTUFDX0NTUjkKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgorCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cworCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECisJICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAorCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCisJICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAorCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECisJICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCisJICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgorCSAgICBVSU5UMzIgIHJzdjoyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIEJLT0ZGX1NMT1RfQ0ZHICAgICAgICAgICAgIDB4MTEwNAkJIC8vICBtYWNfY3NyOSBsYXN0IDggYml0cworI2RlZmluZSBOQVZfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTA4CQkgLy8gTkFWICAoTUFDX0NTUjE1KQorI2RlZmluZSBDSF9USU1FX0NGRyAgICAgICAgICAgICAweDExMEMJCSAJLy8gQ291bnQgYXMgY2hhbm5lbCBidXN5CisjZGVmaW5lIFBCRl9MSUZFX1RJTUVSICAgICAgICAgICAgIDB4MTExMAkJIC8vVFgvUlggTVBEVSB0aW1lc3RhbXAgdGltZXIgKGZyZWUgcnVuKVVuaXQ6IDF1cworI2RlZmluZSBCQ05fVElNRV9DRkcgICAgICAgICAgICAgMHgxMTE0CQkgLy8gVFhSWF9DU1I5CisKKyNkZWZpbmUgQkNOX09GRlNFVDAJCQkJMHgwNDJDCisjZGVmaW5lIEJDTl9PRkZTRVQxCQkJCTB4MDQzMAorCisvLworLy8gQkNOX1RJTUVfQ0ZHIDogU3luY2hyb25pemF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQkNOX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVR4VGltZXN0YW1wQ29tcGVuc2F0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgOjM7CisJCVVJTlQzMgkJYkJlYWNvbkdlbjoxOwkJLy8gRW5hYmxlIGJlYWNvbiBnZW5lcmF0b3IKKyAgICAgICAgVUlOVDMyICAgICAgIGJUQlRURW5hYmxlOjE7CisJCVVJTlQzMgkJVHNmU3luY01vZGU6MjsJCS8vIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUKKwkJVUlOVDMyCQliVHNmVGlja2luZzoxOwkJLy8gRW5hYmxlIFRTRiBhdXRvIGNvdW50aW5nCisJCVVJTlQzMiAgICAgICBCZWFjb25JbnRlcnZhbDoxNjsgIC8vIGluIHVuaXQgb2YgMS8xNiBUVQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkNOX1RJTUVfQ0ZHX1NUUlVDLCAqUEJDTl9USU1FX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBCZWFjb25JbnRlcnZhbDoxNjsgIC8vIGluIHVuaXQgb2YgMS8xNiBUVQorCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKKwkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQorICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKKwkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgorICAgICAgICBVSU5UMzIgICAgICAgOjM7CisJCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRCVFRfU1lOQ19DRkcgICAgICAgICAgICAweDExMTggIAkJLy8gdHhyeF9jc3IxMAorI2RlZmluZSBUU0ZfVElNRVJfRFcwICAgICAgICAgICAgIDB4MTExQyAgCQkvLyBMb2NhbCBUU0YgdGltZXIgbHNiIDMyIGJpdHMuIFJlYWQtb25seQorI2RlZmluZSBUU0ZfVElNRVJfRFcxICAgICAgICAgICAgIDB4MTEyMCAgCQkvLyBtc2IgMzIgYml0cy4gUmVhZC1vbmx5LgorI2RlZmluZSBUQlRUX1RJTUVSICAgICAgICAgICAgIAkweDExMjQgIAkJLy8gVEltZXIgcmVtYWlucyB0aWxsIG5leHQgVEJUVC4gUmVhZC1vbmx5LiAgVFhSWF9DU1IxNAorI2RlZmluZSBJTlRfVElNRVJfQ0ZHICAgICAgICAgICAgICAJMHgxMTI4ICAJCS8vCisjZGVmaW5lIElOVF9USU1FUl9FTiAgICAgICAgICAgICAJMHgxMTJjICAJCS8vICBHUC10aW1lciBhbmQgcHJlLXRidHQgSW50IGVuYWJsZQorI2RlZmluZSBDSF9JRExFX1NUQSAgICAgICAgICAgICAgCTB4MTEzMCAgCQkvLyAgY2hhbm5lbCBpZGxlIHRpbWUKKyNkZWZpbmUgQ0hfQlVTWV9TVEEgICAgICAgICAgICAgIAkweDExMzQgIAkJLy8gIGNoYW5ubGUgYnVzeSB0aW1lCisvLworLy8gIDQuMiBNQUMgUE9XRVIgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMjAwKQorLy8KKyNkZWZpbmUgTUFDX1NUQVRVU19DRkcgICAgICAgICAgICAgMHgxMjAwCQkgLy8gb2xkIE1BQ19DU1IxMgorI2RlZmluZSBQV1JfUElOX0NGRyAgICAgICAgICAgICAweDEyMDQJCSAvLyBvbGQgTUFDX0NTUjEyCisjZGVmaW5lIEFVVE9fV0FLRVVQX0NGRyAgICAgICAgICAgICAweDEyMDgJCSAvLyBvbGQgTUFDX0NTUjEwCisvLworLy8gQVVUT19XQUtFVVBfQ0ZHOiBNYW51YWwgcG93ZXIgY29udHJvbCAvIHN0YXR1cyByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BVVRPX1dBS0VVUF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTY7CisJCVVJTlQzMgkJRW5hYmxlQXV0b1dha2V1cDoxOwkvLyAwOnNsZWVwLCAxOmF3YWtlCisJCVVJTlQzMiAgICAgICBOdW1vZlNsZWVwaW5nVGJ0dDo3OyAgICAgICAgICAvLyBGb3JjZVdha2UgaGFzIGhpZ2ggcHJpdmlsZWdlIHRoYW4gUHV0VG9TbGVlcCB3aGVuIGJvdGggc2V0CisJCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFVVE9fV0FLRVVQX1NUUlVDLCAqUEFVVE9fV0FLRVVQX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgQXV0b0xlYWRUaW1lOjg7CisJCVVJTlQzMiAgICAgICBOdW1vZlNsZWVwaW5nVGJ0dDo3OyAgICAgICAgICAvLyBGb3JjZVdha2UgaGFzIGhpZ2ggcHJpdmlsZWdlIHRoYW4gUHV0VG9TbGVlcCB3aGVuIGJvdGggc2V0CisJCVVJTlQzMgkJRW5hYmxlQXV0b1dha2V1cDoxOwkvLyAwOnNsZWVwLCAxOmF3YWtlCisJCVVJTlQzMgkJOjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7CisjZW5kaWYKKy8vCisvLyAgNC4zIE1BQyBUWCAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEzMDApCisvLworCisjZGVmaW5lIEVEQ0FfQUMwX0NGRwkweDEzMDAJCS8vQUNfVFhPUF9DU1IwIDB4MzQ3NAorI2RlZmluZSBFRENBX0FDMV9DRkcJMHgxMzA0CisjZGVmaW5lIEVEQ0FfQUMyX0NGRwkweDEzMDgKKyNkZWZpbmUgRURDQV9BQzNfQ0ZHCTB4MTMwYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIDoxMjsgICAgICAgIC8vCisJICAgIFVJTlQzMiAgQ3dtYXg6NDsgICAgICAgIC8vdW5pdCBwb3dlciBvZiAyCisJICAgIFVJTlQzMiAgQ3dtaW46NDsgICAgICAgIC8vCisJICAgIFVJTlQzMiAgQWlmc246NDsgICAgICAgIC8vICMgb2Ygc2xvdCB0aW1lCisJICAgIFVJTlQzMiAgQWNUeG9wOjg7ICAgICAgICAvLyAgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFRENBX0FDX0NGR19TVFJVQywgKlBFRENBX0FDX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRENBX0FDX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKKwkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKKwkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKKwkgICAgVUlOVDMyICA6MTI7ICAgICAgIC8vCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFRENBX0FDX0NGR19TVFJVQywgKlBFRENBX0FDX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIEVEQ0FfVElEX0FDX01BUAkweDEzMTAKKyNkZWZpbmUgVFhfUFdSX0NGR18wCTB4MTMxNAorI2RlZmluZSBUWF9QV1JfQ0ZHXzEJMHgxMzE4CisjZGVmaW5lIFRYX1BXUl9DRkdfMgkweDEzMUMKKyNkZWZpbmUgVFhfUFdSX0NGR18zCTB4MTMyMAorI2RlZmluZSBUWF9QV1JfQ0ZHXzQJMHgxMzI0CisjZGVmaW5lIFRYX1BJTl9DRkcJCTB4MTMyOAorI2RlZmluZSBUWF9CQU5EX0NGRwkweDEzMmMJCS8vIDB4MSB1c2UgdXBwZXIgMjBNSHouIDAganVzZSBsb3dlciAyME1IegorI2RlZmluZSBUWF9TV19DRkcwCQkweDEzMzAKKyNkZWZpbmUgVFhfU1dfQ0ZHMQkJMHgxMzM0CisjZGVmaW5lIFRYX1NXX0NGRzIJCTB4MTMzOAorI2RlZmluZSBUWE9QX1RIUkVTX0NGRwkJMHgxMzNjCisjZGVmaW5lIFRYT1BfQ1RSTF9DRkcJCTB4MTM0MAorI2RlZmluZSBUWF9SVFNfQ0ZHCQkweDEzNDQKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6NzsKKwkgICAgVUlOVDMyICAgICAgIFJ0c0Zia0VuOjE7ICAgIC8vIGVuYWJsZSBydHMgcmF0ZSBmYWxsYmFjaworCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQorCSAgICBVSU5UMzIgICAgICAgQXV0b1J0c1JldHJ5TGltaXQ6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUU19DRkdfU1RSVUMsICpQVFhfUlRTX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9SVFNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgQXV0b1J0c1JldHJ5TGltaXQ6ODsKKwkgICAgVUlOVDMyICAgICAgIFJ0c1RocmVzOjE2OyAgICAvLyB1bml0OmJ5dGUKKwkgICAgVUlOVDMyICAgICAgIFJ0c0Zia0VuOjE7ICAgIC8vIGVuYWJsZSBydHMgcmF0ZSBmYWxsYmFjaworCSAgICBVSU5UMzIgICAgICAgcnN2Ojc7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1RJTUVPVVRfQ0ZHCTB4MTM0OAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OworCSAgICBVSU5UMzIgICAgICAgVHhvcFRpbWVvdXQ6ODsJLy9UWE9QIHRpbWVvdXQgdmFsdWUgZm9yIFRYT1AgdHJ1bmNhdGlvbi4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKFNMT1RfVElNRSkgPiAoVFhfT1BfVElNRU9VVCkgPiAoUlhfQUNLX1RJTUVPVVQpCisJICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKKwkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCisJICAgIFVJTlQzMiAgICAgICByc3Y6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjQ7CisJICAgIFVJTlQzMiAgICAgICBNcGR1TGlmZVRpbWU6NDsgICAgLy8gIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cworCSAgICBVSU5UMzIgICAgICAgUnhBY2tUaW1lb3V0Ojg7CS8vIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlCisJICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKKwkgICAgVUlOVDMyICAgICAgIHJzdjI6ODsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9SVFlfQ0ZHCTB4MTM0YworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjE7CisJICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgQWdnUnR5TW9kZToxOwkvLyBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgTm9uQWdnUnR5TW9kZToxOwkvLyBOb24tQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIFNob3J0UnR5TGltaXQ6ODsJLy8gIHNob3J0IHJldHJ5IGxpbWl0CisKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUWV9DRkdfU1RSVUMsICpQVFhfUlRZX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIFNob3J0UnR5TGltaXQ6ODsJLy8gIHNob3J0IHJldHJ5IGxpbWl0CisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5TGltaXQ6ODsJLy9sb25nIHJldHJ5IGxpbWl0CisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5VGhyZToxMjsJLy8gTG9uZyByZXRyeSB0aHJlc2hvb2xkCisJICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgQWdnUnR5TW9kZToxOwkvLyBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgVHhhdXRvRkJFbmFibGU6MTsgICAgLy8gVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUWV9DRkdfU1RSVUMsICpQVFhfUlRZX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9MSU5LX0NGRwkweDEzNTAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCVBBQ0tFRCBfVFhfTElOS19DRkdfU1RSVUMJeworCXN0cnVjdCBQQUNLRUQgeworCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRlM6ODsJLy9yZW1vdGUgTUNTIGZlZWRiYWNrIHNlcXVlbmNlIG51bWJlcgorCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRkI6ODsgICAgLy8gIHJlbW90ZSBNQ1MgZmVlZGJhY2sKKwkgICAgVUlOVDMyICAgICAgIHJzdjozOwkvLworCSAgICBVSU5UMzIgICAgICAgVHhDRkFja0VuOjE7CS8vICAgUGlnZ3liYWNrIENGLUFDSyBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4UkRHRW46MTsJLy8gUkRHIFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVVTUZTRW5hYmxlOjE7CS8vICByZW1vdGUgdW5zb2xpY2l0ICBNRkIgZW5hYmxlLiAgMDogbm90IGFwcGx5IHJlbW90ZSByZW1vdGUgdW5zb2xpY2l0IChNRlM9NykKKwkgICAgVUlOVDMyICAgICAgIE1GQkVuYWJsZToxOwkvLyAgVFggYXBwbHkgcmVtb3RlIE1GQiAxOmVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgUmVtb3RlTUZCTGlmZVRpbWU6ODsJLy9yZW1vdGUgTUZCIGxpZmUgdGltZS4gdW5pdCA6IDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7CisJc3RydWN0IFBBQ0tFRCB7CisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cworCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVVTUZTRW5hYmxlOjE7CS8vICByZW1vdGUgdW5zb2xpY2l0ICBNRkIgZW5hYmxlLiAgMDogbm90IGFwcGx5IHJlbW90ZSByZW1vdGUgdW5zb2xpY2l0IChNRlM9NykKKwkgICAgVUlOVDMyICAgICAgIFR4TVJRRW46MTsJLy8gIE1DUyByZXF1ZXN0IFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjaworCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRlM6ODsJLy9yZW1vdGUgTUNTIGZlZWRiYWNrIHNlcXVlbmNlIG51bWJlcgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgSFRfRkJLX0NGRzAJMHgxMzU0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M3RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzZGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzBGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9IVF9GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzVGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M3RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMF9TVFJVQywgKlBIVF9GQktfQ0ZHMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBIVF9GQktfQ0ZHMQkweDEzNTgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9IVF9GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMV9TVFJVQywgKlBIVF9GQktfQ0ZHMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9IVF9GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEwRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzExRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE1RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMV9TVFJVQywgKlBIVF9GQktfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBMR19GQktfQ0ZHMAkweDEzNWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M3RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA2CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M0RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAzCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M1RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA0CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcwX1NUUlVDLCAqUExHX0ZCS19DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExHX0ZCS19DRkcxCQkweDEzNjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxNjsKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcxX1NUUlVDLCAqUExHX0ZCS19DRkcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT0gUHJvdGVjdGlvbiBQYXJhbWF0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIENDS19QUk9UX0NGRwkweDEzNjQJCS8vQ0NLIFByb3RlY3Rpb24KKyNkZWZpbmUgQVNJQ19TSE9SVE5BVgkJMQorI2RlZmluZSBBU0lDX0xPTkdOQVYJCTIKKyNkZWZpbmUgQVNJQ19SVFMJCTEKKyNkZWZpbmUgQVNJQ19DVFMJCTIKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9QUk9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjo1OworCSAgICBVSU5UMzIgICAgICAgUlRTVGhFbjoxOwkvL1JUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWAorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0Y0MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0YyMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU00MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU0yMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd09mZG06MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0NjazoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdE5hdjoyOwkvL1RYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdEN0cmw6MjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RSYXRlOjE2OwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQUk9UX0NGR19TVFJVQywgKlBQUk9UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9QUk9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RSYXRlOjE2OwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuCisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0Q3RybDoyOwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdE5hdjoyOwkvL1RYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93Q2NrOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU00MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0YyMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0Y0MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgUlRTVGhFbjoxOwkvL1JUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWAorCSAgICBVSU5UMzIgICAgICAgcnN2OjU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQUk9UX0NGR19TVFJVQywgKlBQUk9UX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIE9GRE1fUFJPVF9DRkcJMHgxMzY4CQkvL09GRE0gUHJvdGVjdGlvbgorI2RlZmluZSBNTTIwX1BST1RfQ0ZHCTB4MTM2QwkJLy9NTTIwIFByb3RlY3Rpb24KKyNkZWZpbmUgTU00MF9QUk9UX0NGRwkweDEzNzAJCS8vTU00MCBQcm90ZWN0aW9uCisjZGVmaW5lIEdGMjBfUFJPVF9DRkcJMHgxMzc0CQkvL0dGMjAgUHJvdGVjdGlvbgorI2RlZmluZSBHRjQwX1BST1RfQ0ZHCTB4MTM3OAkJLy9HUjQwIFByb3RlY3Rpb24KKyNkZWZpbmUgRVhQX0NUU19USU1FCTB4MTM3QwkJLy8KKyNkZWZpbmUgRVhQX0FDS19USU1FCTB4MTM4MAkJLy8KKworLy8KKy8vICA0LjQgTUFDIFJYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNDAwKQorLy8KKyNkZWZpbmUgUlhfRklMVFJfQ0ZHCTB4MTQwMAkJCS8vVFhSWF9DU1IwCisjZGVmaW5lIEFVVE9fUlNQX0NGRwkweDE0MDQJCQkvL1RYUlhfQ1NSNAorLy8KKy8vIFRYUlhfQ1NSNDogQXV0by1SZXNwb25kZXIvCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gX0FVVE9fUlNQX0NGR19TVFJVQyB7Cisgc3RydWN0IHsKKyAgICAgVUlOVDMyICAgICAgICA6MjQ7CisgICAgIFVJTlQzMiAgICAgICBBY2tDdHNQc21CaXQ6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIER1YWxDVFNFbjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1SZWY6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNTW9kZToxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBCQUNBY2tQb2xpY3lFbmFibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyRW5hYmxlOjE7CisgfSBmaWVsZDsKKyBVSU5UMzIgICB3b3JkOworfSBBVVRPX1JTUF9DRkdfU1RSVUMsICpQQVVUT19SU1BfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gX0FVVE9fUlNQX0NGR19TVFJVQyB7Cisgc3RydWN0IHsKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJFbmFibGU6MTsKKyAgICAgVUlOVDMyICAgICAgIEJBQ0Fja1BvbGljeUVuYWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgRHVhbENUU0VuOjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBBY2tDdHNQc21CaXQ6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgICA6MjQ7CisgfSBmaWVsZDsKKyBVSU5UMzIgICB3b3JkOworfSBBVVRPX1JTUF9DRkdfU1RSVUMsICpQQVVUT19SU1BfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTEVHQUNZX0JBU0lDX1JBVEUJMHgxNDA4CS8vICBUWFJYX0NTUjUgICAgICAgICAgIDB4MzA1NAorI2RlZmluZSBIVF9CQVNJQ19SQVRFCQkweDE0MGMKKyNkZWZpbmUgSFRfQ1RSTF9DRkcJCTB4MTQxMAorI2RlZmluZSBTSUZTX0NPU1RfQ0ZHCQkweDE0MTQKKyNkZWZpbmUgUlhfUEFSU0VSX0NGRwkJMHgxNDE4CS8vU2V0IE5BViBmb3IgYWxsIHJlY2VpdmVkIGZyYW1lcworCisvLworLy8gIDQuNSBNQUMgU2VjdXJpdHkgY29uZmlndXJhdGlvbiAob2Zmc2V0OjB4MTUwMCkKKy8vCisjZGVmaW5lIFRYX1NFQ19DTlQwCQkweDE1MDAJCS8vCisjZGVmaW5lIFJYX1NFQ19DTlQwCQkweDE1MDQJCS8vCisjZGVmaW5lIENDTVBfRkNfTVVURQkJMHgxNTA4CQkvLworLy8KKy8vICA0LjYgSENDQS9QU01QIChvZmZzZXQ6MHgxNjAwKQorLy8KKyNkZWZpbmUgVFhPUF9ITERSX0FERFIwCQkweDE2MDAKKyNkZWZpbmUgVFhPUF9ITERSX0FERFIxCQkweDE2MDQKKyNkZWZpbmUgVFhPUF9ITERSX0VUCQkweDE2MDgKKyNkZWZpbmUgUU9TX0NGUE9MTF9SQV9EVzAJCTB4MTYwYworI2RlZmluZSBRT1NfQ0ZQT0xMX0ExX0RXMQkJMHgxNjEwCisjZGVmaW5lIFFPU19DRlBPTExfUUMJCTB4MTYxNAorLy8KKy8vICA0LjcgTUFDIFN0YXRpc3RpcyByZWdpc3RlcnMgKG9mZnNldDoweDE3MDApCisvLworI2RlZmluZSBSWF9TVEFfQ05UMAkJMHgxNzAwCQkvLworI2RlZmluZSBSWF9TVEFfQ05UMQkJMHgxNzA0CQkvLworI2RlZmluZSBSWF9TVEFfQ05UMgkJMHgxNzA4CQkvLworCisvLworLy8gUlhfU1RBX0NOVDBfU1RSVUM6IFJYIFBMQ1AgZXJyb3IgY291bnQgJiBSWCBDUkMgZXJyb3IgY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUGh5RXJyOworCSAgICBVU0hPUlQgIENyY0VycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIENyY0VycjsKKwkgICAgVVNIT1JUICBQaHlFcnI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUlhfU1RBX0NOVDFfU1RSVUM6IFJYIEZhbHNlIENDQSBjb3VudCAmIFJYIExPTkcgZnJhbWUgY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUGxjcEVycjsKKwkgICAgVVNIT1JUICBGYWxzZUNjYTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQxX1NUUlVDLCAqUFJYX1NUQV9DTlQxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEZhbHNlQ2NhOworCSAgICBVU0hPUlQgIFBsY3BFcnI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUlhfU1RBX0NOVDJfU1RSVUM6CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFJ4Rmlmb092ZXJmbG93Q291bnQ7CisJICAgIFVTSE9SVCAgUnhEdXBsaUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUnhEdXBsaUNvdW50OworCSAgICBVU0hPUlQgIFJ4Rmlmb092ZXJmbG93Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMl9TVFJVQywgKlBSWF9TVEFfQ05UMl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfQ05UMAkJMHgxNzBDCQkvLworLy8KKy8vIFNUQV9DU1IzOiBUWCBCZWFjb24gY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhCZWFjb25Db3VudDsKKwkgICAgVVNIT1JUICBUeEZhaWxDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQwX1NUUlVDLCAqUFRYX1NUQV9DTlQwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4RmFpbENvdW50OworCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfQ05UMQkJMHgxNzEwCQkvLworLy8KKy8vIFRYX1NUQV9DTlQxOiBUWCB0eCBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7CisJICAgIFVTSE9SVCAgVHhTdWNjZXNzOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDFfU1RSVUMsICpQVFhfU1RBX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhTdWNjZXNzOworCSAgICBVU0hPUlQgIFR4UmV0cmFuc21pdDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQyCQkweDE3MTQJCS8vCisvLworLy8gVFhfU1RBX0NOVDI6IFRYIHR4IGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4VW5kZXJGbG93Q291bnQ7CisJICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMl9TVFJVQywgKlBUWF9TVEFfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFplcm9MZW5Db3VudDsKKwkgICAgVVNIT1JUICBUeFVuZGVyRmxvd0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0ZJRk8JCTB4MTcxOAkJLy8KKy8vCisvLyBUWF9TVEFfRklGT19TVFJVQzogVFggUmVzdWx0IGZvciBzcGVjaWZpYyBQSUQgc3RhdHVzIGZpZm8gcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlc2VydmU6MjsKKwkJVUlOVDMyCQlUeEJGOjE7IC8vIDMqMworCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorLy8JCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTY7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKKwkJVUlOVDMyICAgICAgIAlUeEFja1JlcXVpcmVkOjE7ICAgIC8vIGFjayByZXF1aXJlZAorCQlVSU5UMzIgICAgICAgCVR4QWdncmU6MTsgICAgLy8gVHggaXMgYWdncmVnYXRlZAorCQlVSU5UMzIgICAgICAgCVR4U3VjY2VzczoxOyAgIC8vIFR4IHN1Y2Nlc3MuIHdoZXRoZXIgc3VjY2VzcyBvciBub3QKKwkJVUlOVDMyICAgICAgIAlQaWRUeXBlOjQ7CisJCVVJTlQzMiAgICAgICAJYlZhbGlkOjE7ICAgLy8gMTpUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIGEgdmFsaWQgVFggcmVzdWx0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfU1RBX0ZJRk9fU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJYlZhbGlkOjE7ICAgLy8gMTpUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIGEgdmFsaWQgVFggcmVzdWx0CisJCVVJTlQzMiAgICAgICAJUGlkVHlwZTo0OworCQlVSU5UMzIgICAgICAgCVR4U3VjY2VzczoxOyAgIC8vIFR4IE5vIHJldHJ5IHN1Y2Nlc3MKKwkJVUlOVDMyICAgICAgIAlUeEFnZ3JlOjE7ICAgIC8vIFR4IFJldHJ5IFN1Y2Nlc3MKKwkJVUlOVDMyICAgICAgIAlUeEFja1JlcXVpcmVkOjE7ICAgIC8vIFR4IGZhaWwKKwkJVUlOVDMyCQl3Y2lkOjg7CQkvL3dpcmVsZXNzIGNsaWVudCBpbmRleAorLy8JCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTY7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTM7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJVHhCRjoxOworCQlVSU5UMzIJCVJlc2VydmU6MjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9GSUZPX1NUUlVDLCAqUFRYX1NUQV9GSUZPX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQJMHgxNzFjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dUeENvdW50OworCSAgICBVU0hPUlQgIE5vbkFnZ1R4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OworCSAgICBVU0hPUlQgIEFnZ1R4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDAJMHgxNzIwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTJDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDBfU1RSVUMsICpQVFhfQUdHX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDBfU1RSVUMsICpQVFhfQUdHX0NOVDBfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDEJMHgxNzI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplM0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDFfU1RSVUMsICpQVFhfQUdHX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTNDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDFfU1RSVUMsICpQVFhfQUdHX0NOVDFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDIJMHgxNzI4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDMJMHgxNzJjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDNfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZThDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplN0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDNfU1RSVUMsICpQVFhfQUdHX0NOVDNfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDNfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplOENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDNfU1RSVUMsICpQVFhfQUdHX0NOVDNfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDQJMHgxNzMwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEwQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTlDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ0X1NUUlVDLCAqUFRYX0FHR19DTlQ0X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEwQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNQkweDE3MzQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxMUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxMkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDYJCTB4MTczOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDZfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEzQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE0Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNwkJMHgxNzNjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UN19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTVDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTZDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIE1QRFVfREVOU0lUWV9DTlQJCTB4MTc0MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTVBEVV9ERU5fQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFRYWmVyb0RlbENvdW50OwkvL1RYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCSAgICBVU0hPUlQgIFJYWmVyb0RlbENvdW50OwkvL1JYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIFRYUlggY29udHJvbCByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgzMDAwCisvLworLy8gcnQyODYwYiAgVU5LTk9XTiByZWcgdXNlIFIvTyBSZWcgQWRkciAweDc3ZDAgZmlyc3QuLgorI2RlZmluZSBUWFJYX0NTUjEgICAgICAgICAgIDB4NzdkMAorCisvLworLy8gU2VjdXJpdHkga2V5IHRhYmxlIG1lbW9yeSwgYmFzZSBhZGRyZXNzID0gMHgxMDAwCisvLworI2RlZmluZSBNQUNfV0NJRF9CQVNFCQkweDE4MDAgLy84LWJ5dGVzKHVzZSBvbmx5IDYtYnl0ZXMpICogMjU2IGVudHJ5ID0KKyNkZWZpbmUgSFdfV0NJRF9FTlRSWV9TSVpFICAgOAorI2RlZmluZSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSAgICAgMHg0MDAwICAgICAgLy8gMzItYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBIV19LRVlfRU5UUllfU0laRSAgICAgICAgICAgMHgyMAorI2RlZmluZSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgTUFDX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMCAgICAgIC8vIDgtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBIV19JVkVJVl9FTlRSWV9TSVpFICAgOAorI2RlZmluZSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSAgICAgMHg2ODAwICAgICAgLy8gNC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX1dDSURfQVRUUklfU0laRSAgIDQKKyNkZWZpbmUgV0NJRF9SRVNFUlZFRCAgICAgICAgICAJCTB4NmJmYworI2RlZmluZSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgICAgICAgMHg2YzAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKKyNkZWZpbmUgU0hBUkVEX0tFWV9NT0RFX0JBU0UgICAgICAgMHg3MDAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKKyNkZWZpbmUgSFdfU0hBUkVEX0tFWV9NT0RFX1NJWkUgICA0CisjZGVmaW5lIFNIQVJFREtFWVRBQkxFCQkJMAorI2RlZmluZSBQQUlSV0lTRUtFWVRBQkxFCQkJMQorCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTBDaXBoZXJBbGc6MzsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1NIQVJFREtFWV9NT0RFX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgQnNzMEtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0hBUkVES0VZX01PREVfU1RSVUMsICpQU0hBUkVES0VZX01PREVfU1RSVUM7CisjZW5kaWYKKy8vIDY0LWVudHJ5IGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK3R5cGVkZWYgc3RydWN0IF9IV19XQ0lEX0VOVFJZIHsgIC8vIDgtYnl0ZSBwZXIgZW50cnkKKyAgICBVQ0hBUiAgIEFkZHJlc3NbNl07CisgICAgVUNIQVIgICBSc3ZbMl07Cit9IEhXX1dDSURfRU5UUlksIFBIV19XQ0lEX0VOVFJZOworCisKKworLy8KKy8vIE90aGVyIG9uLWNoaXAgc2hhcmVkIG1lbW9yeSBzcGFjZSwgYmFzZSA9IDB4MjAwMAorLy8KKworLy8gQ0lTIHNwYWNlIC0gYmFzZSBhZGRyZXNzID0gMHgyMDAwCisjZGVmaW5lIEhXX0NJU19CQVNFICAgICAgICAgICAgIDB4MjAwMAorCisvLyBDYXJyaWVyLXNlbnNlIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBjYXJyaWVyLXNlbnNlIGZyYW1lIGZvciBjYXJyaWVyLXNlbnNlIGZ1bmN0aW9uLgorI2RlZmluZSBIV19DU19DVFNfQkFTRQkJCTB4NzcwMAorLy8gREZTIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBDVFMgZnJhbWUgZm9yIERGUy4KKyNkZWZpbmUgSFdfREZTX0NUU19CQVNFCQkJMHg3NzgwCisjZGVmaW5lIEhXX0NUU19GUkFNRV9TSVpFCQkweDgwCisKKy8vIDIwMDQtMTEtMDggam9obiAtIHNpbmNlIE5VTEwgZnJhbWUgd29uJ3QgYmUgdGhhdCBsb25nICgyNTYgYnl0ZSkuIFdlIHN0ZWFsIDE2IHRhaWwgYnl0ZXMKKy8vIHRvIHNhdmUgZGVidWdnaW5nIHNldHRpbmdzCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRSAgIDB4NzdmMCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcworI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UyICAgMHg3NzcwICAvLyAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzCisKKy8vIEluIG9yZGVyIHRvIHN1cHBvcnQgbWF4aW11bSA4IE1CU1MgYW5kIGl0cyBtYXhpbXVtIGxlbmd0aCBpcyA1MTIgZm9yIGVhY2ggYmVhY29uCisvLyBUaHJlZSBzZWN0aW9uIGRpc2NvbnRpbnVlIG1lbW9yeSBzZWdtZW50cyB3aWxsIGJlIHVzZWQuCisvLyAxLiBUaGUgb3JpZ2luYWwgcmVnaW9uIGZvciBCQ04gMH4zCisvLyAyLiBFeHRyYWN0IG1lbW9yeSBmcm9tIEZDRSB0YWJsZSBmb3IgQkNOIDR+NQorLy8gMy4gRXh0cmFjdCBtZW1vcnkgZnJvbSBQYWlyLXdpc2Uga2V5IHRhYmxlIGZvciBCQ04gNn43CisvLwkgIEl0IG9jY3VwaWVkIHRob3NlIG1lbW9yeSBvZiB3Y2lkIDIzOH4yNTMgZm9yIEJDTiA2CisvLwkJCQkJCSAgICAgIGFuZCB3Y2lkIDIyMn4yMzcgZm9yIEJDTiA3CisjZGVmaW5lIEhXX0JFQUNPTl9NQVhfU0laRSAgICAgIDB4MTAwMCAvKiB1bml0OiBieXRlICovCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMCAgICAgICAgIDB4NzgwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTEgICAgICAgICAweDdBMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UyICAgICAgICAgMHg3QzAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMyAgICAgICAgIDB4N0UwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTQgICAgICAgICAweDcyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U1ICAgICAgICAgMHg3NDAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNiAgICAgICAgIDB4NURDMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTcgICAgICAgICAweDVCQzAKKworI2RlZmluZSBIV19CRUFDT05fTUFYX0NPVU5UICAgICA4CisjZGVmaW5lIEhXX0JFQUNPTl9PRkZTRVQJCTB4MDIwMAorI2RlZmluZSBIV19CRUFDT05fQ09OVEVOVF9MRU4JKEhXX0JFQUNPTl9PRkZTRVQgLSBUWFdJX1NJWkUpCisKKy8vIEhPU1QtTUNVIHNoYXJlZCBtZW1vcnkgLSBiYXNlIGFkZHJlc3MgPSAweDIxMDAKKyNkZWZpbmUgSE9TVF9DTURfQ1NSCQkweDQwNAorI2RlZmluZSBIMk1fTUFJTEJPWF9DU1IgICAgICAgICAweDcwMTAKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ0lEICAgICAgICAgMHg3MDE0CisjZGVmaW5lIEgyTV9NQUlMQk9YX1NUQVRVUyAgICAgIDB4NzAxYworI2RlZmluZSBIMk1fSU5UX1NSQyAgICAgICAgICAgICAweDcwMjQKKyNkZWZpbmUgSDJNX0JCUF9BR0VOVCAgICAgICAgICAgMHg3MDI4CisjZGVmaW5lIE0ySF9DTURfRE9ORV9DU1IgICAgICAgIDB4MDAwYworI2RlZmluZSBNQ1VfVFhPUF9BUlJBWV9CQVNFICAgICAweDAwMGMgICAvLyBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQKKyNkZWZpbmUgTUNVX1RYT1BfRU5UUllfU0laRSAgICAgMzIgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisjZGVmaW5lIE1BWF9OVU1fT0ZfVFhPUF9FTlRSWSAgIDE2ICAgICAgIC8vIFRPRE86IG11c3QgYmUgc2FtZSB3aXRoIDgwNTEgZmlybXdhcmUKKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTiAgICAgICAgMHgwMSAgICAgLy8gVE9ETzogdG8gYmUgY29uZmlybWVkIGJ5IEFsYmVydAorI2RlZmluZSBNQ1VfTUJPWF9WRVJTSU9OX09GRlNFVCA1ICAgICAgICAvLyBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQKKworLy8KKy8vIEhvc3QgRE1BIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDIwMCAuICBUWDAtMz1FRENBUWlkMC0zLCBUWDQ9SENDQSwgVFg1PU1HTVQsCisvLworLy8KKy8vICBETUEgUklORyBERVNDUklQVE9SCisvLworI2RlZmluZSBFMlBST01fQ1NSICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBJT19DTlRMX0NTUiAgICAgICAgIDB4NzdkMAorCisjaWZkZWYgUlQyODYwCisvLyA4MDUxIGZpcm13YXJlIGltYWdlIGZvciBSVDI4NjAgLSBiYXNlIGFkZHJlc3MgPSAweDQwMDAKKyNkZWZpbmUgRklSTVdBUkVfSU1BR0VfQkFTRSAgICAgMHgyMDAwCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFIDB4MjAwMCAgICAvLyA4a2J5dGUKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUeCAvCVJ4IC8gTWdtdCByaW5nIGRlc2NyaXB0b3IgZGVmaW5pdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0aGUgZm9sbG93aW5nIFBJRCB2YWx1ZXMgYXJlIHVzZWQgdG8gbWFyayBvdXRnb2luZyBmcmFtZSB0eXBlIGluIFRYRC0+UElEIHNvIHRoYXQKKy8vIHByb3BlciBUWCBzdGF0aXN0aWNzIGNhbiBiZSBjb2xsZWN0ZWQgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcworLy8gYjMtMiBvZiBQSUQgZmllbGQgLQorI2RlZmluZSBQSURfTUdNVAkJCTB4MDUKKyNkZWZpbmUgUElEX0JFQUNPTgkJCTB4MGMKKyNkZWZpbmUgUElEX0RBVEFfTk9STUFMVUNBU1QJIAkweDAyCisjZGVmaW5lIFBJRF9EQVRBX0FNUERVCSAJMHgwNAorI2RlZmluZSBQSURfREFUQV9OT19BQ0sgICAgCTB4MDgKKyNkZWZpbmUgUElEX0RBVEFfTk9UX05PUk1fQUNLCSAJMHgwMworLy8gdmFsdWUgZG9tYWluIG9mIHBUeEQtPkhvc3RRSWQgKDQtYml0OiAwfjE1KQorI2RlZmluZSBRSURfQUNfQksgICAgICAgICAgICAgICAxICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCisjZGVmaW5lIFFJRF9BQ19CRSAgICAgICAgICAgICAgIDAgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKKyNkZWZpbmUgUUlEX0FDX1ZJICAgICAgICAgICAgICAgMgorI2RlZmluZSBRSURfQUNfVk8gICAgICAgICAgICAgICAzCisjZGVmaW5lIFFJRF9IQ0NBICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNQorI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMworI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQkJQICYgUkYJZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCisjZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUJUkZfUjAwCQkJCQkgICAgMAorI2RlZmluZQlSRl9SMDEJCQkJCSAgICAxCisjZGVmaW5lCVJGX1IwMgkJCQkJICAgIDIKKyNkZWZpbmUJUkZfUjAzCQkJCQkgICAgMworI2RlZmluZQlSRl9SMDQJCQkJCSAgICA0CisjZGVmaW5lCVJGX1IwNQkJCQkJICAgIDUKKyNkZWZpbmUJUkZfUjA2CQkJCQkgICAgNgorI2RlZmluZQlSRl9SMDcJCQkJCSAgICA3CisjZGVmaW5lCVJGX1IwOAkJCQkJICAgIDgKKyNkZWZpbmUJUkZfUjA5CQkJCQkgICAgOQorI2RlZmluZQlSRl9SMTAJCQkJCSAgICAxMAorI2RlZmluZQlSRl9SMTEJCQkJCSAgICAxMQorI2RlZmluZQlSRl9SMTIJCQkJCSAgICAxMgorI2RlZmluZQlSRl9SMTMJCQkJCSAgICAxMworI2RlZmluZQlSRl9SMTQJCQkJCSAgICAxNAorI2RlZmluZQlSRl9SMTUJCQkJCSAgICAxNQorI2RlZmluZQlSRl9SMTYJCQkJCSAgICAxNgorI2RlZmluZQlSRl9SMTcJCQkJCSAgICAxNworI2RlZmluZQlSRl9SMTgJCQkJCSAgICAxOAorI2RlZmluZQlSRl9SMTkJCQkJCSAgICAxOQorI2RlZmluZQlSRl9SMjAJCQkJCSAgICAyMAorI2RlZmluZQlSRl9SMjEJCQkJCSAgICAyMQorI2RlZmluZQlSRl9SMjIJCQkJCSAgICAyMgorI2RlZmluZQlSRl9SMjMJCQkJCSAgICAyMworI2RlZmluZQlSRl9SMjQJCQkJCSAgICAyNAorI2RlZmluZQlSRl9SMjUJCQkJCSAgICAyNQorI2RlZmluZQlSRl9SMjYJCQkJCSAgICAyNgorI2RlZmluZQlSRl9SMjcJCQkJCSAgICAyNworI2RlZmluZQlSRl9SMjgJCQkJCSAgICAyOAorI2RlZmluZQlSRl9SMjkJCQkJCSAgICAyOQorI2RlZmluZQlSRl9SMzAJCQkJCSAgICAzMAorI2RlZmluZQlSRl9SMzEJCQkJCSAgICAzMQorCisjZGVmaW5lCUJCUF9SMAkJCQkJICAgIDAgIC8vIHZlcnNpb24KKyNkZWZpbmUJQkJQX1IxCQkJCSAgICAgICAgMSAgLy8gVFNTSQorI2RlZmluZQlCQlBfUjIgICAgICAgICAgCQkJMiAgLy8gVFggY29uZmlndXJlCisjZGVmaW5lIEJCUF9SMyAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEJCUF9SNCAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJCUF9SNSAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJCUF9SNiAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lCUJCUF9SMTQJCQkgICAgICAgICAgICAxNCAvLyBSWCBjb25maWd1cmUKKyNkZWZpbmUgQkJQX1IxNiAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEJCUF9SMTcgICAgICAgICAgICAgICAgICAgICAxNyAvLyBSWCBzZW5zaWJpbGl0eQorI2RlZmluZSBCQlBfUjE4ICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQkJQX1IyMSAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEJCUF9SMjIgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBCQlBfUjI0ICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgQkJQX1IyNSAgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIEJCUF9SNDkgICAgICAgICAgICAgICAgICAgICA0OSAvL1RTU0kKKyNkZWZpbmUgQkJQX1I1MCAgICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIEJCUF9SNTEgICAgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBCQlBfUjUyICAgICAgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgQkJQX1I1NSAgICAgICAgICAgICAgICAgICAgIDU1CisjZGVmaW5lIEJCUF9SNjIgICAgICAgICAgICAgICAgICAgICA2MiAvLyBSeCBTUTAgVGhyZXNob2xkIEhJR0gKKyNkZWZpbmUgQkJQX1I2MyAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIEJCUF9SNjQgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBCQlBfUjY1ICAgICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgQkJQX1I2NiAgICAgICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIEJCUF9SNjcgICAgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBCQlBfUjY4ICAgICAgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgQkJQX1I2OSAgICAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIEJCUF9SNzAgICAgICAgICAgICAgICAgICAgICA3MCAvLyBSeCBBR0MgU1EgQ0NLIFhjb3JyIHRocmVzaG9sZAorI2RlZmluZSBCQlBfUjczICAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgQkJQX1I3NQkJCQkJCTc1CisjZGVmaW5lIEJCUF9SNzcgICAgICAgICAgICAgICAgICAgICA3NworI2RlZmluZSBCQlBfUjgxICAgICAgICAgICAgICAgICAgICAgODEKKyNkZWZpbmUgQkJQX1I4MiAgICAgICAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIEJCUF9SODMgICAgICAgICAgICAgICAgICAgICA4MworI2RlZmluZSBCQlBfUjg0ICAgICAgICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgQkJQX1I4NgkJCQkJCTg2CisjZGVmaW5lIEJCUF9SOTEJCQkJCQk5MQorI2RlZmluZSBCQlBfUjkyCQkJCQkJOTIKKyNkZWZpbmUgQkJQX1I5NCAgICAgICAgICAgICAgICAgICAgIDk0IC8vIFR4IEdhaW4gQ29udHJvbAorI2RlZmluZSBCQlBfUjEwMyAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIEJCUF9SMTA1ICAgICAgICAgICAgICAgICAgICAxMDUKKyNkZWZpbmUgQkJQX1IxMTMgICAgICAgICAgICAgICAgICAgIDExMworI2RlZmluZSBCQlBfUjExNCAgICAgICAgICAgICAgICAgICAgMTE0CisjZGVmaW5lIEJCUF9SMTE1ICAgICAgICAgICAgICAgICAgICAxMTUKKyNkZWZpbmUgQkJQX1IxMTYgICAgICAgICAgICAgICAgICAgIDExNgorI2RlZmluZSBCQlBfUjExNyAgICAgICAgICAgICAgICAgICAgMTE3CisjZGVmaW5lIEJCUF9SMTE4ICAgICAgICAgICAgICAgICAgICAxMTgKKyNkZWZpbmUgQkJQX1IxMTkgICAgICAgICAgICAgICAgICAgIDExOQorI2RlZmluZSBCQlBfUjEyMCAgICAgICAgICAgICAgICAgICAgMTIwCisjZGVmaW5lIEJCUF9SMTIxICAgICAgICAgICAgICAgICAgICAxMjEKKyNkZWZpbmUgQkJQX1IxMjIgICAgICAgICAgICAgICAgICAgIDEyMgorI2RlZmluZSBCQlBfUjEyMyAgICAgICAgICAgICAgICAgICAgMTIzCisKKworI2RlZmluZSBCQlBSOTRfREVGQVVMVCAgICAgICAgICAgICAgMHgwNiAvLyBBZGQgMSB2YWx1ZSB3aWxsIGdhaW4gMWRiCisKKyNkZWZpbmUgUlNTSV9GT1JfVkVSWV9MT1dfU0VOU0lCSUxJVFkgLTM1CisjZGVmaW5lIFJTU0lfRk9SX0xPV19TRU5TSUJJTElUWSAgICAgIC01OAorI2RlZmluZSBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZICAtODAKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX1NFTlNJQklMSVRZICAgICAgLTkwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRUVQUk9NIGRlZmluaXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFRURPICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBFRURJICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFRUNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFRVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFRVJMICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREUgICAgICAgICAweDA1CisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERSAgICAgICAgICAweDA2CisjZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERSAgICAgICAgICAweDEwCisjZGVmaW5lIEVFUFJPTV9FV0VOX09QQ09ERSAgICAgICAgICAweDEzCisKKyNkZWZpbmUJTlVNX0VFUFJPTV9CQlBfUEFSTVMJCTE5CQkJLy8gSW5jbHVkZSBOSUMgQ29uZmlnIDAsIDEsIENSLCBUWCBBTEMgc3RlcCwgQkJQcworI2RlZmluZQlOVU1fRUVQUk9NX1RYX0dfUEFSTVMJCTcKKyNkZWZpbmUJRUVQUk9NX05JQzFfT0ZGU0VUICAgICAgICAgIDB4MzQJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECisjZGVmaW5lCUVFUFJPTV9OSUMyX09GRlNFVCAgICAgICAgICAweDM2CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fQkJQX0JBU0VfT0ZGU0VUCQkweGYwCQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fR19UWF9QV1JfT0ZGU0VUCQkweDUyCisjZGVmaW5lCUVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUCQkweDYwCisjZGVmaW5lIEVFUFJPTV9MRUQxX09GRlNFVAkJCTB4M2MKKyNkZWZpbmUgRUVQUk9NX0xFRDJfT0ZGU0VUCQkJMHgzZQorI2RlZmluZSBFRVBST01fTEVEM19PRkZTRVQJCQkweDQwCisjZGVmaW5lIEVFUFJPTV9MTkFfT0ZGU0VUCQkJMHg0NAorI2RlZmluZSBFRVBST01fUlNTSV9CR19PRkZTRVQJCTB4NDYKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQV9PRkZTRVQJCTB4NGEKKyNkZWZpbmUgRUVQUk9NX0RFRklORV9NQVhfVFhQV1IJCTB4NGUKKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcJMHhkZQkvLyAyME1IWiAyLjRHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RwkweGVlCS8vIDQwTUhaIDIuNEcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RwkJMHhmYQkvLyAyME1IWiA1RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHCQkweDEwYQkvLyA0ME1IWiA1RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCAgICAgIDB4NzgKKyNkZWZpbmUgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgICAgICAweGE2CisjZGVmaW5lIEVFUFJPTV9WRVJTSU9OX09GRlNFVCAgICAgICAweDAyCisjZGVmaW5lCUVFUFJPTV9GUkVRX09GRlNFVAkJCTB4M2EKKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFIAkweGRlCS8vIDIwTUhaIHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9ERUxUQQkJMHg1MAkvLyAyME1IWiBBTkQgNDAgTUhaIHVzZSBkaWZmZXJlbnQgcG93ZXIuIFRoaXMgaXMgZGVsdGEgaW4gNDBNSFouCisjZGVmaW5lIFZBTElEX0VFUFJPTV9WRVJTSU9OICAgICAgICAxCisKKy8vIFBhaXJLZXlNb2RlIGRlZmluaXRpb24KKyNkZWZpbmUgUEtNT0RFX05PTkUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEtNT0RFX1dFUDY0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEtNT0RFX1dFUDEyOCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUEtNT0RFX1RLSVAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUEtNT0RFX0FFUyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUEtNT0RFX0NLSVA2NCAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUEtNT0RFX0NLSVAxMjggICAgICAgICAgICAgIDYKKyNkZWZpbmUgUEtNT0RFX1RLSVBfTk9fTUlDICAgICAgICAgIDcgICAgICAgLy8gTUlDIGFwcGVuZGVkIGJ5IGRyaXZlcjogbm90IGEgdmFsaWQgdmFsdWUgaW4gaGFyZHdhcmUga2V5IHRhYmxlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gV0NJRCAgZm9ybWF0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vNy4xCVdDSUQgIEVOVFJZICBmb3JtYXQgIDogOGJ5dGVzCit0eXBlZGVmCXN0cnVjdAlfV0NJRF9FTlRSWV9TVFJVQyB7CisJVUNIQVIJCVJYQkFCaXRtYXA3OyAgICAvLyBiaXQwIGZvciBUSUQ4LCBiaXQ3IGZvciBUSUQgMTUKKwlVQ0hBUgkJUlhCQUJpdG1hcDA7ICAgIC8vIGJpdDAgZm9yIFRJRDAsIGJpdDcgZm9yIFRJRCA3CisJVUNIQVIJCU1BQ1s2XTsJLy8gMCBmb3Igc2hhcmVkIGtleSB0YWJsZS4gIDEgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQorfQlXQ0lEX0VOVFJZX1NUUlVDLCAqUFdDSURfRU5UUllfU1RSVUM7CisKKy8vOC4xLjEJU0VDVVJJVFkgIEtFWSAgZm9ybWF0ICA6IDhEVworLy8gMzItYnl0ZSBwZXIgZW50cnksIHRvdGFsIDE2LWVudHJ5IGZvciBzaGFyZWQga2V5IHRhYmxlLCA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCit0eXBlZGVmIHN0cnVjdCBfSFdfS0VZX0VOVFJZIHsgICAgICAgICAgLy8gMzItYnl0ZSBwZXIgZW50cnkKKyAgICBVQ0hBUiAgIEtleVsxNl07CisgICAgVUNIQVIgICBUeE1pY1s4XTsKKyAgICBVQ0hBUiAgIFJ4TWljWzhdOworfSBIV19LRVlfRU5UUlksICpQSFdfS0VZX0VOVFJZOworCisvLzguMS4yCUlWL0VJViAgZm9ybWF0ICA6IDJEVworCisvLzguMS4zCVJYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQgIDogMURXCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJX01BQ19BVFRSSUJVVEVfU1RSVUMgeworCVVJTlQzMgkJcnN2OjIyOworCVVJTlQzMgkJUlhXSVVERjozOworCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKKwlVSU5UMzIJCVBhaXJLZXlNb2RlOjM7CisJVUlOVDMyCQlLZXlUYWI6MTsJLy8gMCBmb3Igc2hhcmVkIGtleSB0YWJsZS4gIDEgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQorfQlNQUNfQVRUUklCVVRFX1NUUlVDLCAqUE1BQ19BVFRSSUJVVEVfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJX01BQ19BVFRSSUJVVEVfU1RSVUMgeworCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKKwlVSU5UMzIJCVBhaXJLZXlNb2RlOjM7CisJVUlOVDMyCQlCU1NJRElkeDozOyAvL211bHRpcGxlQlNTIGluZGV4IGZvciB0aGUgV0NJRAorCVVJTlQzMgkJUlhXSVVERjozOworCVVJTlQzMgkJcnN2OjIyOworfQlNQUNfQVRUUklCVVRFX1NUUlVDLCAqUE1BQ19BVFRSSUJVVEVfU1RSVUM7CisjZW5kaWYKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRYIC8gUlggcmluZyBkZXNjcmlwdG9yIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHRoZSBmaXJzdCAyNC1ieXRlIGluIFRYRCBpcyBjYWxsZWQgVFhJTkZPIGFuZCB3aWxsIGJlIERNQWVkIHRvIE1BQyBibG9jayB0aHJvdWdoIFRYRklGTy4KKy8vIE1BQyBibG9jayB1c2UgdGhpcyBUWElORk8gdG8gY29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIGJlaGF2aW9yIG9mIHRoaXMgZnJhbWUuCisjZGVmaW5lIEZJRk9fTUdNVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBGSUZPX0hDQ0EgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRklGT19FRENBICAgICAgICAgICAgICAgICAyCisKKy8vCisvLyBUWCBkZXNjcmlwdG9yIGZvcm1hdCwgVHgJcmluZywgTWdtdCBSaW5nCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhEX1NUUlVDIHsKKwkvLyBXb3JkIDAKKwlVSU5UMzIJCVNEUHRyMDsKKwkvLyBXb3JkIDEKKwlVSU5UMzIJCURNQURPTkU6MTsKKwlVSU5UMzIJCUxhc3RTZWMwOjE7CisJVUlOVDMyCQlTRExlbjA6MTQ7CisJVUlOVDMyCQlCdXJzdDoxOworCVVJTlQzMgkJTGFzdFNlYzE6MTsKKwlVSU5UMzIJCVNETGVuMToxNDsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCVNEUHRyMTsKKwkvLyBXb3JkIDMKKwlVSU5UMzIJCUlDTzoxOworCVVJTlQzMgkJVUNPOjE7CisJVUlOVDMyCQlUQ086MTsKKwlVSU5UMzIJCXJzdjoyOworCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKKwlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgorCVVJTlQzMgkJcnN2MjoyNDsKK30JVFhEX1NUUlVDLCAqUFRYRF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYRF9TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlTRFB0cjA7CisJLy8gV29yZAkxCisJVUlOVDMyCQlTRExlbjE6MTQ7CisJVUlOVDMyCQlMYXN0U2VjMToxOworCVVJTlQzMgkJQnVyc3Q6MTsKKwlVSU5UMzIJCVNETGVuMDoxNDsKKwlVSU5UMzIJCUxhc3RTZWMwOjE7CisJVUlOVDMyCQlETUFET05FOjE7CisJLy9Xb3JkMgorCVVJTlQzMgkJU0RQdHIxOworCS8vV29yZDMKKwlVSU5UMzIJCXJzdjI6MjQ7CisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlyc3Y6MjsKKwlVSU5UMzIJCVRDTzoxOwkvLworCVVJTlQzMgkJVUNPOjE7CS8vCisJVUlOVDMyCQlJQ086MTsJLy8KK30JVFhEX1NUUlVDLCAqUFRYRF9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBUWEQgV2lyZWxlc3MgSW5mb3JtYXRpb24gZm9ybWF0IGZvciBUeCByaW5nIGFuZCBNZ210IFJpbmcKKy8vCisvL3R4b3AgOiBmb3IgdHhvcCBtb2RlCisvLyAwOnR4b3AgZm9yIHRoZSBNUERVIGZyYW1lIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDIGJ5IHJlZ2lzdGVyCisvLyAxLzIvMzp0aGUgTVBEVSBmcmFtZSBpcyBzZW5kIGFmdGVyIFBJRlMvYmFja29mZi9TSUZTCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWFdJX1NUUlVDIHsKKwkvLyBXb3JkIDAKKwlVSU5UMzIJCVBIWU1PREU6MjsKKwlVSU5UMzIJCVR4QkY6MTsJLy8gMyozCisJVUlOVDMyCQlyc3YyOjE7CisJVUlOVDMyCQlJZnM6MTsJLy8KKwlVSU5UMzIJCVNUQkM6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlNQ1M6NzsKKworCVVJTlQzMgkJcnN2OjY7CisJVUlOVDMyCQl0eG9wOjI7CS8vdHggYmFjayBvZmYgbW9kZSAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCVVJTlQzMgkJQU1QRFU6MTsKKworCVVJTlQzMgkJVFM6MTsKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlNSU1PcHM6MTsJLy8gdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlCisJVUlOVDMyCQlGUkFHOjE7CQkvLyAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuCisJLy8gV29yZCAxCisJVUlOVDMyCQlQYWNrZXRJZDo0OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJQkFXaW5TaXplOjY7CisJVUlOVDMyCQlOU0VROjE7CisJVUlOVDMyCQlBQ0s6MTsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCUlWOworCS8vIFdvcmQgMworCVVJTlQzMgkJRUlWOworfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCUZSQUc6MTsJCS8vIDEgdG8gaW5mb3JtIFRLSVAgZW5naW5lIHRoaXMgaXMgYSBmcmFnbWVudC4KKwlVSU5UMzIJCU1JTU9wczoxOwkvLyB0aGUgcmVtb3RlIHBlZXIgaXMgaW4gZHluYW1pYyBNSU1PLVBTIG1vZGUKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlUUzoxOworCisJVUlOVDMyCQlBTVBEVToxOworCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwlVSU5UMzIJCXR4b3A6MjsJLy9GT1IgIlRISVMiIGZyYW1lLiAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlyc3Y6NjsKKworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOwkvLyAxOiBTVEJDIHN1cHBvcnQgTUNTID0wLTcsICAgMiwzIDogUkVTRVJWRQorCVVJTlQzMgkJSWZzOjE7CS8vCisJVUlOVDMyCQlyc3YyOjE7CisJVUlOVDMyCQlUeEJGOjE7CS8vIDMqMworCVVJTlQzMgkJUEhZTU9ERToyOworCS8vIFdvcmQJMQorCVVJTlQzMgkJQUNLOjE7CisJVUlOVDMyCQlOU0VROjE7CisJVUlOVDMyCQlCQVdpblNpemU6NjsKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVBhY2tldElkOjQ7CisJLy9Xb3JkMgorCVVJTlQzMgkJSVY7CisJLy9Xb3JkMworCVVJTlQzMgkJRUlWOworfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7CisjZW5kaWYKKy8vCisvLyBSeCBkZXNjcmlwdG9yIGZvcm1hdCwgUngJUmluZworLy8KKyNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYRF9TVFJVQwl7CisJLy8gV29yZCAwCisJVUlOVDMyCQlTRFAwOworCS8vIFdvcmQgMQorCVVJTlQzMgkJRERPTkU6MTsKKwlVSU5UMzIJCUxTMDoxOworCVVJTlQzMgkJU0RMMDoxNDsKKwlVSU5UMzIJCVJzdjoyOworCVVJTlQzMgkJU0RMMToxNDsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCVNEUDE7CisJLy8gV29yZCAzCisJVUlOVDMyCQlSc3YxOjEzOworCVVJTlQzMgkJUGxjcFJzc2lsOjE7Ly8gVG8gYmUgbW92ZWQKKwlVSU5UMzIJCVBsY3BTaWduYWw6MTsJCS8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsJLy8gdGhpcyBmcmFtZSBpcyBiZWluZyBkZWNyeXB0ZWQuCisJVUlOVDMyCQlBTVBEVToxOworCVVJTlQzMgkJTDJQQUQ6MTsKKwlVSU5UMzIJCVJTU0k6MTsKKwlVSU5UMzIJCUhUQzoxOworCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4gb2Jzb2xldGUuCisJVUlOVDMyCQlDaXBoZXJFcnI6MjsgICAgICAgIC8vIDA6IGRlY3J5cHRpb24gb2theSwgMTpJQ1YgZXJyb3IsIDI6TUlDIGVycm9yLCAzOktFWSBub3QgdmFsaWQKKwlVSU5UMzIJCUNyYzoxOyAgICAgICAgICAgICAgLy8gMTogQ1JDIGVycm9yCisJVUlOVDMyCQlNeUJzczoxOyAgCS8vIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRAorCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCisJVUlOVDMyCQlNY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBtdWx0aWNhc3QgZnJhbWUKKwlVSU5UMzIJCVUyTToxOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCisJVUlOVDMyCQlGUkFHOjE7CisJVUlOVDMyCQlOVUxMREFUQToxOworCVVJTlQzMgkJREFUQToxOworCVVJTlQzMgkJQkE6MTsKKworfQlSWERfU1RSVUMsICpQUlhEX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWERfU1RSVUMJeworCS8vIFdvcmQJMAorCVVJTlQzMgkJU0RQMDsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCVNETDE6MTQ7CisJVUlOVDMyCQlSc3Y6MjsKKwlVSU5UMzIJCVNETDA6MTQ7CisJVUlOVDMyCQlMUzA6MTsKKwlVSU5UMzIJCURET05FOjE7CisJLy8gV29yZAkyCisJVUlOVDMyCQlTRFAxOworCS8vIFdvcmQJMworCVVJTlQzMgkJQkE6MTsKKwlVSU5UMzIJCURBVEE6MTsKKwlVSU5UMzIJCU5VTExEQVRBOjE7CisJVUlOVDMyCQlGUkFHOjE7CisJVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCisJVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKKwlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECisJVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgorCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCisJVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgorCVVJTlQzMgkJSFRDOjE7CisJVUlOVDMyCQlSU1NJOjE7CisJVUlOVDMyCQlMMlBBRDoxOworCVVJTlQzMgkJQU1QRFU6MTsKKwlVSU5UMzIJCURlY3J5cHRlZDoxOwkvLyB0aGlzIGZyYW1lIGlzIGJlaW5nIGRlY3J5cHRlZC4KKwlVSU5UMzIJCVBsY3BTaWduYWw6MTsJCS8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlQbGNwUnNzaWw6MTsvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJUnN2MToxMzsKK30JUlhEX1NUUlVDLCAqUFJYRF9TVFJVQywgUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOworI2VuZGlmCisjZW5kaWYgLy8gUlQyODYwIC8vCisvLworLy8gUlhXSSB3aXJlbGVzcyBpbmZvcm1hdGlvbiBmb3JtYXQsIGluIFBCRi4gaW52aXNpYmxlIGluIGRyaXZlci4KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKKwkvLyBXb3JkIDAKKwlVSU5UMzIJCVRJRDo0OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJVURGOjM7CisJVUlOVDMyCQlCU1NJRDozOworCVVJTlQzMgkJS2V5SW5kZXg6MjsKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwkvLyBXb3JkIDEKKwlVSU5UMzIJCVBIWU1PREU6MjsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJcnN2OjM7CisJVUlOVDMyCQlTVEJDOjI7CisJVUlOVDMyCQlTaG9ydEdJOjE7CisJVUlOVDMyCQlCVzoxOworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlTRVFVRU5DRToxMjsKKwlVSU5UMzIJCUZSQUc6NDsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCXJzdjE6ODsKKwlVSU5UMzIJCVJTU0kyOjg7CisJVUlOVDMyCQlSU1NJMTo4OworCVVJTlQzMgkJUlNTSTA6ODsKKwkvLyBXb3JkIDMKKwlVSU5UMzIJCXJzdjI6MTY7CisJVUlOVDMyCQlTTlIxOjg7CisJVUlOVDMyCQlTTlIwOjg7Cit9CVJYV0lfU1RSVUMsICpQUlhXSV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYV0lfU1RSVUMgeworCS8vIFdvcmQJMAorCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJS2V5SW5kZXg6MjsKKwlVSU5UMzIJCUJTU0lEOjM7CisJVUlOVDMyCQlVREY6MzsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVRJRDo0OworCS8vIFdvcmQJMQorCVVJTlQzMgkJRlJBRzo0OworCVVJTlQzMgkJU0VRVUVOQ0U6MTI7CisJVUlOVDMyCQlNQ1M6NzsKKwlVSU5UMzIJCUJXOjE7CisJVUlOVDMyCQlTaG9ydEdJOjE7CisJVUlOVDMyCQlTVEJDOjI7CisJVUlOVDMyCQlyc3Y6MzsKKwlVSU5UMzIJCVBIWU1PREU6MjsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCS8vV29yZDIKKwlVSU5UMzIJCVJTU0kwOjg7CisJVUlOVDMyCQlSU1NJMTo4OworCVVJTlQzMgkJUlNTSTI6ODsKKwlVSU5UMzIJCXJzdjE6ODsKKwkvL1dvcmQzCisJVUlOVDMyCQlTTlIwOjg7CisJVUlOVDMyCQlTTlIxOjg7CisJVUlOVDMyCQlyc3YyOjE2OworfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7CisjZW5kaWYKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhPU1QtTUNVIGNvbW11bmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLworLy8gSDJNX01BSUxCT1hfQ1NSOiBIb3N0LXRvLU1DVSBNYWlsYm94CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyICAgICAgIE93bmVyOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OyAgICAvLyAweGZmIHRlbGxzIE1DVSBub3QgdG8gcmVwb3J0IENtZERvbmVJbnQgYWZ0ZXIgZXhjdXRpbmcgdGhlIGNvbW1hbmQKKyAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBMb3dCeXRlOjg7CisgICAgfSAgIGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gSDJNX01BSUxCT1hfU1RSVUMsICpQSDJNX01BSUxCT1hfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiAgX0gyTV9NQUlMQk9YX1NUUlVDIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgSGlnaEJ5dGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OworICAgIH0gICBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBNMkhfQ01EX0RPTkVfQ1NSOiBNQ1UtdG8tSG9zdCBjb21tYW5kIGNvbXBsZXRlIGluZGljYXRpb24KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKKyAgICB9IGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uIF9NMkhfQ01EX0RPTkVfU1RSVUMgeworICAgIHN0cnVjdCAgeworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4wOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4xOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4yOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4zOworICAgIH0gZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBNMkhfQ01EX0RPTkVfU1RSVUMsICpQTTJIX0NNRF9ET05FX1NUUlVDOworI2VuZGlmCisKKworCisvLworLy8gTUNVX0xFRENTOiBNQ1UgTEVEIENvbnRyb2wgU2V0dGluZy4KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZiB1bmlvbiAgX01DVV9MRURDU19TVFJVQyB7CisJc3RydWN0CXsKKwkJVUNIQVIJCVBvbGFyaXR5OjE7CisJCVVDSEFSCQlMZWRNb2RlOjc7CisJfSBmaWVsZDsKKwlVQ0hBUgkJCQl3b3JkOworfSBNQ1VfTEVEQ1NfU1RSVUMsICpQTUNVX0xFRENTX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gIF9NQ1VfTEVEQ1NfU1RSVUMgeworCXN0cnVjdAl7CisJCVVDSEFSCQlMZWRNb2RlOjc7CisJCVVDSEFSCQlQb2xhcml0eToxOworCX0gZmllbGQ7CisJVUNIQVIJCQl3b3JkOworfSBNQ1VfTEVEQ1NfU1RSVUMsICpQTUNVX0xFRENTX1NUUlVDOworI2VuZGlmCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFJlZ2lzdGVyIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCisvL05BVl9USU1FX0NGRyA6TkFWCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCXJzdjo2OworCQlVU0hPUlQJCVplcm9TaWZzOjE7ICAgICAgICAgICAgICAgLy8gQXBwbGllZCB6ZXJvIFNJRlMgdGltZXIgYWZ0ZXIgT0ZETSBSWCAwOiBkaXNhYmxlCisJCVVTSE9SVAkJRWlmczo5OyAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUiAgICAgICBTbG90VGltZTsgICAgLy8gaW4gdW5pdCBvZiAxLXVzCisJCVVDSEFSCQlTaWZzOyAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgMS11cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9OQVZfVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlTaWZzOyAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUiAgICAgICBTbG90VGltZTsgICAgLy8gaW4gdW5pdCBvZiAxLXVzCisJCVVTSE9SVAkJRWlmczo5OyAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVU0hPUlQJCVplcm9TaWZzOjE7ICAgICAgICAgICAgICAgLy8gQXBwbGllZCB6ZXJvIFNJRlMgdGltZXIgYWZ0ZXIgT0ZETSBSWCAwOiBkaXNhYmxlCisJCVVTSE9SVAkJcnN2OjY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlOQVZfVElNRV9DRkdfU1RSVUMsICpQTkFWX1RJTUVfQ0ZHX1NUUlVDOworI2VuZGlmCisKKworCisKKworLy8KKy8vIFJYX0ZJTFRSX0NGRzogIC9SWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JUlhfRklMVFJfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxNTsKKwkJVUlOVDMyICAgICAgIERyb3BSc3ZDbnRsVHlwZToxOworCisgICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KKwkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCisJCVVJTlQzMgkJRHJvcFBzUG9sbDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcFJ0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wQ3RzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQWNrOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ0ZFbmQ6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDRkVuZEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wRHVwbGljYXRlOjE7CQkvLyBEcm9wIGR1cGxpY2F0ZSBmcmFtZQorCQlVSU5UMzIJCURyb3BCY2FzdDoxOwkJLy8gRHJvcCBicm9hZGNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wVmVyRXJyOjE7CSAgICAvLyBEcm9wIHZlcnNpb24gZXJyb3IgZnJhbWUKKworCQlVSU5UMzIJCURyb3BOb3RNeUJTU0lEOjE7CQkJLy8gRHJvcCBmcmFtIFRvRHMgYml0IGlzIHRydWUKKwkJVUlOVDMyCQlEcm9wTm90VG9NZToxOwkJLy8gRHJvcCBub3QgdG8gbWUgdW5pY2FzdCBmcmFtZQorCQlVSU5UMzIJCURyb3BQaHlFcnI6MTsJCS8vIERyb3AgcGh5c2ljYWwgZXJyb3IKKwkJVUlOVDMyCQlEcm9wQ1JDRXJyOjE7CQkvLyBEcm9wIENSQyBlcnJvcgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfRklMVFJfQ0ZHX1NUUlVDLCAqUFJYX0ZJTFRSX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9GSUxUUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKKwkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCisJCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKKwkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCisKKwkJVUlOVDMyCQlEcm9wVmVyRXJyOjE7CSAgICAvLyBEcm9wIHZlcnNpb24gZXJyb3IgZnJhbWUKKwkJVUlOVDMyCQlEcm9wTWNhc3Q6MTsJCS8vIERyb3AgbXVsdGljYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BCY2FzdDoxOwkJLy8gRHJvcCBicm9hZGNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKKworCQlVSU5UMzIJCURyb3BDRkVuZEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQWNrOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ3RzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKworCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BCQToxOwkJLy8KKyAgICAgICAgCVVJTlQzMiAgICAgICAJRHJvcEJBUjoxOyAgICAgICAvLworCisJCVVJTlQzMiAgICAgICAJRHJvcFJzdkNudGxUeXBlOjE7CisJCVVJTlQzMgkJOjE1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfRklMVFJfQ0ZHX1NUUlVDLCAqUFJYX0ZJTFRSX0NGR19TVFJVQzsKKyNlbmRpZgorCisKKworCisvLworLy8gUEhZX0NTUjQ6IFJGIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1BIWV9DU1I0X1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgUkYgcHJvZ3JhbW1pbmcuCisJCVVJTlQzMgkJUExMX0xEOjE7CQkJLy8gUkYgUExMX0xEIHN0YXR1cworCQlVSU5UMzIJCUlGU2VsZWN0OjE7CQkJLy8gMTogc2VsZWN0IElGCXRvIHByb2dyYW0sCTA6IHNlbGVjdCBSRiB0bwlwcm9ncmFtCisJCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCisJCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQSFlfQ1NSNF9TVFJVQywgKlBQSFlfQ1NSNF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSRlJlZ1ZhbHVlOjI0OwkJLy8gUmVnaXN0ZXIJdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIJaWQpCXNlcmlhbCBvdXQgdG8gUkYvSUYJY2hpcC4KKwkJVUlOVDMyCQlOdW1iZXJPZkJpdHM6NTsJCS8vIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwJUkZNRDoyMikKKwkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQorCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1NFQ19DU1I1X1NUUlVDCXsKKwlzdHJ1Y3QJeworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gSE9TVF9DTURfQ1NSOiBGb3IgSE9TVCB0byBpbnRlcnJ1cHQgZW1iZWRkZWQgcHJvY2Vzc29yCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0hPU1RfQ01EX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjI0OworCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSE9TVF9DTURfQ1NSX1NUUlVDLCAqUEhPU1RfQ01EX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEhvc3RDb21tYW5kOjg7CisJICAgIFVJTlQzMiAgIFJzdjoyNDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gQUlGU05fQ1NSOiBBSUZTTiBmb3IgZWFjaCBFRENBIEFDCisvLworCisKKworLy8KKy8vIEUyUFJPTV9DU1I6IEVFUFJPTSBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0UyUFJPTV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUnN2ZDoyNTsKKwkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQorCQlVSU5UMzIJCVR5cGU6MTsJCQkvLyAxOiA5M0M0NiwgMDo5M0M2NgorCQlVSU5UMzIJCUVlcHJvbURPOjE7CisJCVVJTlQzMgkJRWVwcm9tREk6MTsKKwkJVUlOVDMyCQlFZXByb21DUzoxOworCQlVSU5UMzIJCUVlcHJvbVNLOjE7CisJCVVJTlQzMgkJUmVsb2FkOjE7CQkvLyBSZWxvYWQgRUVQUk9NIGNvbnRlbnQsIHdyaXRlIG9uZSB0byByZWxvYWQsIHNlbGYtY2xlYXJlZC4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUUyUFJPTV9DU1JfU1RSVUMsICpQRTJQUk9NX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCisJCVVJTlQzMgkJRWVwcm9tU0s6MTsKKwkJVUlOVDMyCQlFZXByb21DUzoxOworCQlVSU5UMzIJCUVlcHJvbURJOjE7CisJCVVJTlQzMgkJRWVwcm9tRE86MTsKKwkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKKwkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQorCQlVSU5UMzIJCVJzdmQ6MjU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRTJQUk9NIGRhdGEgbGF5b3V0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBFRVBST00gYW50ZW5uYSBzZWxlY3QgZm9ybWF0CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQgICAgICBSc3Y6NDsKKwkJVVNIT1JUICAgICAgUmZJY1R5cGU6NDsgICAgICAgICAgICAgLy8gc2VlIEUyUFJPTSBkb2N1bWVudAorCQlVU0hPUlQJCVR4UGF0aDo0OwkvLyAxOiAxVCwgMjogMlQKKwkJVVNIT1JUCQlSeFBhdGg6NDsJLy8gMTogMVIsIDI6IDJSLCAzOiAzUgorCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX0FOVEVOTkFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKKwkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCisJCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKKwkJVVNIT1JUICAgICAgUnN2OjQ7CisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fQU5URU5OQV9TVFJVQywgKlBFRVBST01fQU5URU5OQV9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDCXsKKwlzdHJ1Y3QJeworICAgICAgICBVU0hPUlQJCVJzdjI6NjsJCQkJCS8vIG11c3QgYmUgMAorCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JBOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQorCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JHOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQorCQlVU0hPUlQJCUVuYWJsZVdQU1BCQzoxOyAgICAgICAgICAgICAgICAgLy8gV1BTIFBCQyBDb250cm9sIGJpdAorCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7CisJCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckc6MTsKKwkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQorCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDVHCisJCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JHOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RworCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLworCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIFdoZXRoZXIgUkYgaXMgY29udHJvbGxlZCBieSBkcml2ZXIgb3IgSFcuIDE6ZW5hYmxlIGh3IGNvbnRyb2wsIDA6ZGlzYWJsZQorCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIF9FRVBST01fTklDX0NJTkZJRzJfU1RSVUMJeworCXN0cnVjdCB7CisJCVVTSE9SVAkJSGFyZHdhcmVSYWRpb0NvbnRyb2w6MTsJLy8gMTplbmFibGUsIDA6ZGlzYWJsZQorCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCQkvLworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKKwkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQorCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7CisJCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckE6MTsKKwkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlSc3YyOjY7ICAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQywgKlBFRVBST01fTklDX0NPTkZJRzJfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFRYX1BXUiBWYWx1ZSB2YWxpZCByYW5nZSAweEZBKC02KSB+IDB4MjQoMzYpCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWF9QV1JfU1RSVUMJeworCXN0cnVjdAl7CisJCUNIQVIJQnl0ZTE7CQkJCS8vIEhpZ2ggQnl0ZQorCQlDSEFSCUJ5dGUwOwkJCQkvLyBMb3cgQnl0ZQorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9UWF9QV1JfU1RSVUMsICpQRUVQUk9NX1RYX1BXUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlDSEFSCUJ5dGUwOwkJCQkvLyBMb3cgQnl0ZQorCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9WRVJTSU9OX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglWZXJzaW9uOwkJCS8vIEhpZ2ggQnl0ZQorCQlVQ0hBUglGYWVSZWxlYXNlTnVtYmVyOwkvLyBMb3cgQnl0ZQorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9WRVJTSU9OX1NUUlVDLCAqUEVFUFJPTV9WRVJTSU9OX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9WRVJTSU9OX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglGYWVSZWxlYXNlTnVtYmVyOwkvLyBMb3cgQnl0ZQorCQlVQ0hBUglWZXJzaW9uOwkJCS8vIEhpZ2ggQnl0ZQorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9WRVJTSU9OX1NUUlVDLCAqUEVFUFJPTV9WRVJTSU9OX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fTEVEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJUnN2ZDozOwkJCQkvLyBSZXNlcnZlZAorCQlVU0hPUlQJTGVkTW9kZTo1OwkJCS8vIExlZCBtb2RlLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzQ6MTsJLy8gUG9sYXJpdHkgR1BJTyM0IHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMzoxOwkvLyBQb2xhcml0eSBHUElPIzMgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzE6MTsJLy8gUG9sYXJpdHkgR1BJTyMxIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMDoxOwkvLyBQb2xhcml0eSBHUElPIzAgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5QUNUOjE7CQkvLyBQb2xhcml0eSBBQ1Qgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0E6MTsJCS8vIFBvbGFyaXR5IFJEWV9BIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9HOjE7CQkvLyBQb2xhcml0eSBSRFlfRyBzZXR0aW5nLgorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9MRURfU1RSVUMsICpQRUVQUk9NX0xFRF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fTEVEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0E6MTsJCS8vIFBvbGFyaXR5IFJEWV9BIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMDoxOwkvLyBQb2xhcml0eSBHUElPIzAgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzI6MTsJLy8gUG9sYXJpdHkgR1BJTyMyIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMzoxOwkvLyBQb2xhcml0eSBHUElPIzMgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgorCQlVU0hPUlQJTGVkTW9kZTo1OwkJCS8vIExlZCBtb2RlLgorCQlVU0hPUlQJUnN2ZDozOwkJCQkvLyBSZXNlcnZlZAorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9MRURfU1RSVUMsICpQRUVQUk9NX0xFRF9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCVR4UG93ZXJFbmFibGU6MTsvLyBFbmFibGUKKwkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKKwkJVUNIQVIJRGVsdGFWYWx1ZTo2OwkvLyBUeCBQb3dlciBkYWx0YSB2YWx1ZSAoTUFYPTQpCisJfQlmaWVsZDsKKwlVQ0hBUgl2YWx1ZTsKK30JRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMsICpQRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQorCQlVQ0hBUglUeXBlOjE7CQkJLy8gMTogcGx1cyB0aGUgZGVsdGEgdmFsdWUsIDA6IG1pbnVzIHRoZSBkZWx0YSB2YWx1ZQorCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCisJfQlmaWVsZDsKKwlVQ0hBUgl2YWx1ZTsKK30JRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMsICpQRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFFPU19DU1IwOiBUWE9QIGhvbGRlciBhZGRyZXNzMCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQorCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUU9TX0NTUjE6IFRYT1AgaG9sZGVyIGFkZHJlc3MxIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJUnN2ZDE7CisJCVVDSEFSCQlSc3ZkMDsKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUU9TX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAorCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKKwkJVUNIQVIJCVJzdmQwOworCQlVQ0hBUgkJUnN2ZDE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlRT1NfQ1NSMV9TVFJVQywgKlBRT1NfQ1NSMV9TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lCVJGX0NTUl9DRkcJMHg1MDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAorCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCisJCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKKwkJVUlOVAlSc3ZkMjozOwkJCQkvLyBSZXNlcnZlZAorCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECisJCVVJTlQJUkZfQ1NSX0RBVEE6ODsJCQkvLyBEQVRBCisJfQlmaWVsZDsKKwlVSU5UCXdvcmQ7Cit9CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQorCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECisJCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlSRl9DU1JfV1I6MTsJCQkvLyAwOiByZWFkICAxOiB3cml0ZQorCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCisJCVVJTlQJUnN2ZDE6MTQ7CQkJCS8vIFJlc2VydmVkCisJfQlmaWVsZDsKKwlVSU5UCXdvcmQ7Cit9CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZW5kaWYJLy8gX19SVDI4WFhfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2F0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA3ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuYwpAQCAtMCwwICsxLDYwMjUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworI2lmZGVmIFJBTElOS19BVEUKK1VDSEFSIFRlbXBsYXRlRnJhbWVbMjRdID0gezB4MDgvKiBEYXRhIHR5cGUgKi8sMHgwMCwweDAwLDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMCwweEFBLDB4QkIsMHgxMiwweDM0LDB4NTYsMHgwMCwweDExLDB4MjIsMHhBQSwweEJCLDB4Q0MsMHgwMCwweDAwfTsJLy8gODAyLjExIE1BQyBIZWFkZXIsIFR5cGU6RGF0YSwgTGVuZ3RoOjI0Ynl0ZXMKK2V4dGVybiBSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXTsKK2V4dGVybiBVQ0hBUiBOVU1fT0ZfMjg1MF9DSE5MOworCitzdGF0aWMgQ0hBUiBDQ0tSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIC0xfTsgLyogQ0NLIE1vZGUuICovCitzdGF0aWMgQ0hBUiBPRkRNUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgLTF9OyAvKiBPRkRNIE1vZGUuICovCitzdGF0aWMgQ0hBUiBIVE1JWFJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xfTsgLyogSFQgTWl4IE1vZGUuICovCisKK3N0YXRpYyBJTlQgVHhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBSeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wRG1hRW5hYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBFbmFibGUpOworCitzdGF0aWMgVk9JRCBCYnBTb2Z0UmVzZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQzMiBUeElkeCk7CisKK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpOworCitzdGF0aWMgSU5UIEFURUNtZEhhbmRsZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAorCUlOIFVDSEFSIE1vZGUsCisJSU4gVUNIQVIgTWNzKTsKKworI2lmZGVmIFJUMjg2MAorc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwT3V0VHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJQ0ZBQ0ssCisJSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOIAkJQU1QRFUsCisJSU4JQk9PTEVBTiAJCUFjaywKKwlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTglVQ0hBUiAJCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKK3N0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09ZW5kIG9mIHByb3RvdHlwZT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZkZWYgUlQyODYwCitzdGF0aWMgSU5UIFR4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQgcmVzdWx0OworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQorCWlmIChHbG9DZmcuZmllbGQuVHhETUFCdXN5KQorCQlyZXN1bHQgPSAxOworCWVsc2UKKwkJcmVzdWx0ID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBJTlQgUnhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCByZXN1bHQ7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJaWYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kpCisJCXJlc3VsdCA9IDE7CisJZWxzZQorCQlyZXN1bHQgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFZPSUQgUnRtcERtYUVuYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgRW5hYmxlKQoreworCUJPT0xFQU4gdmFsdWU7CisJVUxPTkcgV2FpdENudDsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKKworCXZhbHVlID0gRW5hYmxlID4gMCA/IDEgOiAwOworCisJLy8gY2hlY2sgRE1BIGlzIGluIGJ1c3kgbW9kZS4KKwlXYWl0Q250ID0gMDsKKwl3aGlsZSAoVHhEbWFCdXN5KHBBZCkgfHwgUnhEbWFCdXN5KHBBZCkpCisJeworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwkJaWYgKFdhaXRDbnQrKyA+IDEwMCkKKwkJCWJyZWFrOworCX0KKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSB2YWx1ZTsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSB2YWx1ZTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CS8vIGFib3J0IGFsbCBUWCByaW5ncworCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworc3RhdGljIFZPSUQgQmJwU29mdFJlc2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIEJicERhdGEgPSAwOworCisJLy8gU29mdCByZXNldCwgc2V0IEJCUCBSMjEgYml0MD0xLT4wCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCAmQmJwRGF0YSk7CisJQmJwRGF0YSB8PSAweDAwMDAwMDAxOyAvL3NldCBiaXQwPTEKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCBCYnBEYXRhKTsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOworCUJicERhdGEgJj0gfigweDAwMDAwMDAxKTsgLy9zZXQgYml0MD0wCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQorCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCisJVUNIQVIgTW9kZSwKKwlVQ0hBUiBNY3MpCit7CisJaW50IGk7CisJUENIQVIgcFJhdGVUYWI7CisKKwlzd2l0Y2goTW9kZSkKKwl7CisJCWNhc2UgMDoKKwkJCXBSYXRlVGFiID0gQ0NLUmF0ZVRhYmxlOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBSYXRlVGFiID0gT0ZETVJhdGVUYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJCXBSYXRlVGFiID0gSFRNSVhSYXRlVGFibGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInVucmVjb2duaXphYmxlIFR4IE1vZGUgJWRcbiIsIE1vZGUpKTsKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCX0KKworCWkgPSAwOworCXdoaWxlKHBSYXRlVGFiW2ldICE9IC0xKQorCXsKKwkJaWYgKHBSYXRlVGFiW2ldID09IE1jcykKKwkJCXJldHVybiAwOworCQlpKys7CisJfQorCisJcmV0dXJuIC0xOworfQorCisjaWYgMQorc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gY2hhciBpbmRleCkKK3sKKwlVTE9ORyBSOworCUNIQVIgVHhQb3dlcjsKKwlVQ0hBUiBCYnA5NCA9IDA7CisJQk9PTEVBTiBiUG93ZXJSZWR1Y2UgPSBGQUxTRTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJLyogV2hlbiBRQSBpcyB1c2VkIGZvciBUeCwgcEFkLT5hdGUuVHhQb3dlcjAvMSBhbmQgcmVhbCB0eCBwb3dlcgorCQkqKiBhcmUgbm90IHN5bmNocm9uaXplZC4KKwkJKi8KKy8qCisJCXBBZC0+YXRlLlR4UG93ZXIwID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisJCXBBZC0+YXRlLlR4UG93ZXIxID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWlmIChUeFBvd2VyID4gMzEpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzMSAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKKwkJCQkvLworCQkJCVIgPSAzMTsKKwkJCQlpZiAoVHhQb3dlciA8PSAzNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIChVQ0hBUikoVHhQb3dlciAtIDMxKTsKKwkJCX0KKwkJCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwLCAtMSB+IC02IHVzZWQgYnkgQkJQIDk0CisJCQkJLy8KKwkJCQlSID0gMDsKKwkJCQlpZiAoVHhQb3dlciA+PSAtNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gMCB+IDMxCisJCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKKwkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CisJCX0KKwkJZWxzZS8vIDUuNSBHSHoKKwkJeworCQkJaWYgKFR4UG93ZXIgPiAxNSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDE1ICgweDBGKQorCQkJCS8vCisJCQkJUiA9IDE1OworCQkJfQorCQkJZWxzZSBpZiAoVHhQb3dlciA8IDApCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAKKwkJCQkvLworCQkJCS8vIC0xIH4gLTcKKwkJCQlBU1NFUlQoKFR4UG93ZXIgPj0gLTcpKTsKKwkJCQlSID0gKFVMT05HKShUeFBvd2VyICsgNyk7CisJCQkJYlBvd2VyUmVkdWNlID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyAwIH4gMTUKKwkJCQlSID0gKFVMT05HKSBUeFBvd2VyOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIpKTsKKwkJfQorCisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCXsKKwkJCQlSID0gUiA8PCA5OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUiA9IFIgPDwgNjsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCQkJfQorCQl9CisJCWVsc2UvLyA1LjVHSHoKKwkJeworCQkJaWYgKGJQb3dlclJlZHVjZSA9PSBGQUxTRSkKKwkJCXsKKwkJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCA3KSB8ICgxIDw8IDYpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKGluZGV4ID09IDApCisJCQkJeworCQkJCQlSID0gKFIgPDwgMTApOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCisJCQkJCS8qIENsZWFyIGJpdCA5IG9mIFIzIHRvIHJlZHVjZSA3ZEIuICovCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSAoUiAmICh+KDEgPDwgOSkpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDcpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCisJCQkJCS8qIENsZWFyIGJpdCA2IG9mIFI0IHRvIHJlZHVjZSA3ZEIuICovCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSAoUiAmICh+KDEgPDwgNikpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwkJcmV0dXJuIDA7CisJfQorfQorI2Vsc2UvLyAxIC8vCitzdGF0aWMgSU5UIEFURVR4UHdySGFuZGxlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBjaGFyIGluZGV4KQoreworCVVMT05HIFI7CisJQ0hBUiBUeFBvd2VyOworCVVDSEFSIEJicDk0ID0gMDsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJLy8gVE9ETzogaG93IHRvIGdldCBjdXJyZW50IFR4UG93ZXIwLzEgZnJvbSBwQWQtPkxhdGNoUmZSZWdzID8KKwkJLyogV2hlbiBRQSBpcyB1c2VkIGZvciBUeCwgcEFkLT5hdGUuVHhQb3dlcjAvMSBhbmQgcmVhbCB0eCBwb3dlcgorCQkqKiBhcmUgbm90IHN5bmNocm9uaXplZC4KKwkJKi8KKy8qCisJCXBBZC0+YXRlLlR4UG93ZXIwID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisJCXBBZC0+YXRlLlR4UG93ZXIxID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7CisKKwlpZiAoVHhQb3dlciA+IDMxKQorCXsKKwkJLy8KKwkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMzYgKDB4MjQpLCAzMSB+IDM2IHVzZWQgYnkgQkJQIDk0CisJCS8vCisJCVIgPSAzMTsKKwkJaWYgKFR4UG93ZXIgPD0gMzYpCisJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgKFVDSEFSKShUeFBvd2VyIC0gMzEpOworCX0KKwllbHNlIGlmIChUeFBvd2VyIDwgMCkKKwl7CisJCS8vCisJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMCwgLTEgfiAtNiB1c2VkIGJ5IEJCUCA5NAorCQkvLworCQlSID0gMDsKKwkJaWYgKFR4UG93ZXIgPj0gLTYpCisJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgVHhQb3dlcjsKKwl9CisJZWxzZQorCXsKKwkJLy8gMCB+IDMxCisJCVIgPSAoVUxPTkcpIFR4UG93ZXI7CisJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFIzPSVsZCwgQkJQX1I5ND0lZClcbiIsIF9fRlVOQ1RJT05fXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKKworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCWlmIChpbmRleCA9PSAwKQorCXsKKwkJUiA9IFIgPDwgOTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJfQorCWVsc2UKKwl7CisJCVIgPSBSIDw8IDY7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJeworCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVIgPSAoUiA8PCA3KSB8ICgxIDw8IDYpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQl9CisJCX0KKworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiAwOworCX0KK30KKyNlbmRpZiAvLyAxIC8vCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgb3BlcmF0aW9uIG1vZGUgdG8KKyAgICAgICAgMC4gQVRFU1RBUlQgID0gU3RhcnQgQVRFIE1vZGUKKyAgICAgICAgMS4gQVRFU1RPUCAgID0gU3RvcCBBVEUgTW9kZQorICAgICAgICAyLiBUWENPTlQgICAgPSBDb250aW51b3VzIFRyYW5zbWl0CisgICAgICAgIDMuIFRYQ0FSUiAgICA9IFRyYW5zbWl0IENhcnJpZXIKKyAgICAgICAgNC4gVFhGUkFNRSAgID0gVHJhbnNtaXQgRnJhbWVzCisgICAgICAgIDUuIFJYRlJBTUUgICA9IFJlY2VpdmUgRnJhbWVzCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKyAgICAgICAgNi4gVFhTVE9QICAgID0gU3RvcCBBbnkgVHlwZSBvZiBUcmFuc21pdGlvbgorICAgICAgICA3LiBSWFNUT1AgICAgPSBTdG9wIFJlY2VpdmluZyBGcmFtZXMKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIFJUMjg2MAorc3RhdGljIElOVAlBVEVDbWRIYW5kbGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIJCQlWYWx1ZSA9IDA7CisJVUNIQVIJCQlCYnBEYXRhOworCVVJTlQzMgkJCU1hY0RhdGEgPSAwOworCVBUWERfU1RSVUMJCXBUeEQ7CisJSU5UCQkJCWluZGV4OworCVVJTlQJCQlpPTAsIGF0ZW1vZGU7CisJUFJYRF9TVFJVQwkJcFJ4RDsKKwlQUlRNUF9UWF9SSU5HIAlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07CisjaWZuZGVmIFVDT1MKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyNlbmRpZiAvLyBVQ09TIC8vCisjaWZkZWYJUlRfQklHX0VORElBTgorICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKKyAgICBUWERfU1RSVUMgICAgICAgVHhEOworI2VuZGlmCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBBVEVDbWRIYW5kbGVyKClcbiIpKTsKKworCUFURUFzaWNTd2l0Y2hDaGFubmVsKHBBZCk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5hdGUuQ2hhbm5lbCk7CisKKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJLy8gcmVhZCBNQUNfU1lTX0NUUkwgYW5kIGJhY2t1cCBNQUNfU1lTX0NUUkwgdmFsdWUuCisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKworCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJQmJwRGF0YSA9IDA7CisKKwkvLyBjbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCisJTWFjRGF0YSAmPSAweEZGRkZGRkVGOworCisJaWYgKCFzdHJjbXAoYXJnLCAiQVRFU1RBUlQiKSkgCQkvL0VudGVyIEFURSBtb2RlIGFuZCBzZXQgVHgvUnggSWRsZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBBVEVTVEFSVFxuIikpOworCisjaWZuZGVmIFVDT1MKKwkJLy8gY2hlY2sgaWYgd2UgaGF2ZSByZW1vdmVkIHRoZSBmaXJtd2FyZQorCQlpZiAoIShBVEVfT04ocEFkKSkpCisJCXsKKwkJCU5JQ0VyYXNlRmlybXdhcmUocEFkKTsKKwkJfQorI2VuZGlmIC8vICFVQ09TIC8vCisJCWF0ZW1vZGUgPSBwQWQtPmF0ZS5Nb2RlOworCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUQVJUOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQlpZiAoYXRlbW9kZSAmIEFURV9UWENBUlIpCisJCXsKKwkJCS8vIE5vIENhcnJpZXIgVGVzdCBzZXQgQkJQIFIyMiBiaXQ3PTAsIGJpdDY9MCwgYml0WzV+MF09MHgwCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKwkJZWxzZSBpZiAoYXRlbW9kZSAmIEFURV9UWENBUlJTVVBQKQorCQl7CisJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIE5vIENhcnJpZXIgU3VwcHJlc3Npb24gc2V0IEJCUCBSMjQgYml0MD0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkZGRTsgLy9jbGVhciBiaXQwCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCBCYnBEYXRhKTsKKwkJfQorCQkvLyBXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisJCQlQUlRNUF9UWF9SSU5HIHBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXTsKKworCQkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDT05UKQorCQkJeworCQkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJCX0KKwkJCS8vIEFib3J0IFR4LCBSeCBETUEuCisJCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisJCQlmb3IgKGk9MDsgaTxUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXsKKwkJCQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7CisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJICAgIHBUeEQgPSAoUFRYRF9TVFJVQylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKKyNlbHNlCisgICAgICAgIAkJcERlc3RUeEQgPSAoUFRYRF9TVFJVQylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKKyAgICAgICAgCQlUeEQgPSAqcERlc3RUeEQ7CisgICAgICAgIAkJcFR4RCA9ICZUeEQ7CisgICAgICAgIAkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCQlwVHhELT5ETUFET05FID0gMDsKKwkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldDsKKwkJCQlpZiAocFBhY2tldCkKKwkJCQl7CisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCQl9CisJCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKKwkJCQlpZiAocFBhY2tldCkKKwkJCQl7CisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCQl9CisJCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKwkJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisJCQl9CisJCQkvLyBTdGFydCBUeCwgUlggRE1BCisJCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisJCX0KKwkJLy8gcmVzZXQgUnggc3RhdGlzdGljcy4KKwkJcEFkLT5hdGUuTGFzdFNOUjAgPSAwOworCQlwQWQtPmF0ZS5MYXN0U05SMSA9IDA7CisJCXBBZC0+YXRlLkxhc3RSc3NpMCA9IDA7CisJCXBBZC0+YXRlLkxhc3RSc3NpMSA9IDA7CisJCXBBZC0+YXRlLkxhc3RSc3NpMiA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTEgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMiA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwWDggPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMVg4ID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTJYOCA9IDA7CisJCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSA9IDA7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkvLyBUeCBmcmFtZQorCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKwkJcEFkLT5hdGUuc2VxID0gMDsKKworCQkvLyBjb3VudGVycworCQlwQWQtPmF0ZS5VMk0gPSAwOworCQlwQWQtPmF0ZS5PdGhlckRhdGEgPSAwOworCQlwQWQtPmF0ZS5CZWFjb24gPSAwOworCQlwQWQtPmF0ZS5PdGhlckNvdW50ID0gMDsKKwkJcEFkLT5hdGUuVHhBYzAgPSAwOworCQlwQWQtPmF0ZS5UeEFjMSA9IDA7CisJCXBBZC0+YXRlLlR4QWMyID0gMDsKKwkJcEFkLT5hdGUuVHhBYzMgPSAwOworCQlwQWQtPmF0ZS5UeEhDQ0EgPSAwOworCQlwQWQtPmF0ZS5UeE1nbXQgPSAwOworCQlwQWQtPmF0ZS5SU1NJMCA9IDA7CisJCXBBZC0+YXRlLlJTU0kxID0gMDsKKwkJcEFkLT5hdGUuUlNTSTIgPSAwOworCQlwQWQtPmF0ZS5TTlIwID0gMDsKKwkJcEFkLT5hdGUuU05SMSA9IDA7CisKKwkJLy8gY29udHJvbAorCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7CisJCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsgLy8gdGFzayBUeCBzdGF0dXMgLy8gMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIFNvZnQgcmVzZXQgQkJQLgorCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vCisJCS8vIExpbmtEb3duKCkgaGFzICJBc2ljRGlzYWJsZVN5bmMoKTsiIGFuZCAiUlRNUF9CQlBfSU9fUi9XOF9CWV9SRUdfSUQoKTsiIGluc2lkZS4KKwkJLy8KKy8vICAgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisvLwkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKKyNpZm5kZWYgVUNPUworCQluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisjZW5kaWYgLy8gIVVDT1MgLy8KKwkJLy8KKwkJLy8gSWYgd2Ugc2tpcCAiTGlua0Rvd24oKSIsIHdlIHNob3VsZCBkaXNhYmxlIHByb3RlY3Rpb24KKwkJLy8gdG8gcHJldmVudCBmcm9tIHNlbmRpbmcgb3V0IFJUUyBvciBDVFMtdG8tc2VsZi4KKwkJLy8KKwkJQVRFRGlzYWJsZUFzaWNQcm90ZWN0KHBBZCk7CisJCVJUTVBTdGF0aW9uU3RvcChwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8qIERpc2FibGUgVHggKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLyogRGlzYWJsZSBSeCAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJBVEVTVE9QIikpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IEFURVNUT1BcbiIpKTsKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsgLy8gcmVjb3ZlciB0aGUgTUFDX1NZU19DVFJMIHJlZ2lzdGVyIGJhY2suCisKKwkJLy8gRGlzYWJsZSBUeCwgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisjaWZuZGVmIFVDT1MKKwkJcEFkLT5hdGUuYkZXTG9hZGluZyA9IFRSVUU7CisJCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKyNlbmRpZiAvLyAhVUNPUyAvLworCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvLworCQkvLyBFdmVuIHRoZSBmaXJtd2FyZSBoYXMgYmVlbiBsb2FkZWQsCisJCS8vIHdlIHN0aWxsIGNvdWxkIHVzZSBBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRCgpLgorCQkvLyBCdXQgdGhpcyBpcyBub3Qgc3VnZ2VzdGVkLgorCQkvLworCQlCYnBTb2Z0UmVzZXQocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlOSUNEaXNhYmxlSW50ZXJydXB0KHBBZCk7CisKKwkJTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBUUlVFKTsKKworCisJCS8vIFJlaW5pdGlhbGl6ZSBSeCBSaW5nIGJlZm9yZSBSeCBETUEgaXMgZW5hYmxlZC4KKwkJLy8gVGhlIG5pZ2h0bWFyZSBvZiA+Pj5SeENvaGVyZW50PDw8IHdhcyBnb25lICEKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUlhfUklOR19TSVpFOyBpbmRleCsrKQorCQl7CisJCQlwUnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQlwUnhELT5ERE9ORSA9IDA7CisJCX0KKworCQkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4KKwkJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCBOVUxMKTsKKwkJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7CisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCS8vCisJCS8vIEVuYWJsZSBJbnRlcnJ1cHQKKwkJLy8KKworCQkvLworCQkvLyBUaGVzZSBzdGVwcyBhcmUgb25seSBmb3IgQVBBdXRvU2VsZWN0Q2hhbm5lbCgpLgorCQkvLworI2lmIDAKKwkJLy9wQWQtPmJTdGFGaWZvVGVzdCA9IFRSVUU7CisJCXBBZC0+aW50X2VuYWJsZV9yZWcgPSAoKERFTEFZSU5UTUFTSykgIHwgKFJ4SU5UfFR4RGF0YUludHxUeE1nbXRJbnQpKSAmIH4oMHgwMyk7CisJCXBBZC0+aW50X2Rpc2FibGVfbWFzayA9IDA7CisJCXBBZC0+aW50X3BlbmRpbmcgPSAwOworI2VuZGlmCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTsgIC8vIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cworCQlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQkvKiByZXN0b3JlIFJYX0ZJTFRSX0NGRyAqLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvKiByZXN0b3JlIFJYX0ZJTFRSX0NGRyBkdWUgdG8gdGhhdCBRQSBtYXliZSBzZXQgaXQgdG8gMHgzICovCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRW5hYmxlIFR4LCBSeCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBFbmFibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCVJUTVBTdGF0aW9uU3RhcnQocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNpZm5kZWYgVUNPUworCQluZXRpZl9zdGFydF9xdWV1ZShwQWQtPm5ldF9kZXYpOworI2VuZGlmIC8vICFVQ09TIC8vCisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhDQVJSIikpCS8vIFR4IENhcnJpZXIKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDQVJSXG4iKSk7CisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYQ0FSUjsKKworCQkvLyBRQSBoYXMgZG9uZSB0aGUgZm9sbG93aW5nIHN0ZXBzIGlmIGl0IGlzIHVzZWQuCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IEZBTFNFKQorCQl7CisJCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJCUJicFNvZnRSZXNldChwQWQpOworCisJCQkvLyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0xLCBiaXQ2PTEsIGJpdFs1fjBdPTB4MDEKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCisJCQlCYnBEYXRhIHw9IDB4MDAwMDAwQzE7IC8vc2V0IGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkJLy8gc2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0IChiaXQ0KSA9IDEKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJVmFsdWUgPSBWYWx1ZSB8IDB4MDAwMDAwMTA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ09OVCIpKQkvLyBUeCBDb250aW51ZQorCXsKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJLyogc2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIGJpdDQoQ29udGludW91cyBUeCBQcm9kdWN0aW9uIFRlc3QpCisJCQkgICBhbmQgYml0MihNQUMgVFggZW5hYmxlKSBiYWNrIHRvIHplcm8uICovCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQkJTWFjRGF0YSAmPSAweEZGRkZGRkVCOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQkJLy8gc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkY3RjsgLy9zZXQgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJfQorCisJCS8qIGZvciBUeENvbnQgbW9kZS4KKwkJKiogU3RlcCAxOiBTZW5kIDUwIHBhY2tldHMgZmlyc3QgdGhlbiB3YWl0IGZvciBhIG1vbWVudC4KKwkJKiogU3RlcCAyOiBTZW5kIG1vcmUgNTAgcGFja2V0IHRoZW4gc3RhcnQgY29udGludWUgbW9kZS4KKwkJKi8KKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWENPTlRcbiIpKTsKKwkJLy8gU3RlcCAxOiBzZW5kIDUwIHBhY2tldHMgZmlyc3QuCisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYQ09OVDsKKwkJcEFkLT5hdGUuVHhDb3VudCA9IDUwOworICAgICAgICAgICAgICAgIC8qIERvIGl0IGFmdGVyIFR4L1J4IERNQSBpcyBhYm9ydGVkLiAqLworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljaworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCQl9CisKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCS8qIE9ubHkgbmVlZGVkIGlmIHdlIGhhdmUgdG8gc2VuZCBzb21lIG5vcm1hbCBmcmFtZXMuICovCisJCVNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQorCQl7CisJCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwkJCVR4RCA9ICpwRGVzdFR4RDsKKwkJCXBUeEQgPSAmVHhEOworCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCS8vIENsZWFuIGN1cnJlbnQgY2VsbC4KKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCisJCQkJYnJlYWs7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOworCQl9CisKKyAgICAgICAgICAgICAgICAvLyBTZXR1cCBmcmFtZSBmb3JtYXQuCisJCUFURVNldFVwRnJhbWUocEFkLCBwVHhSaW5nLT5UeENwdUlkeCk7CisKKwkJLy8gU3RhcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7CisJCQkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIGtpY2sgVHgtUmluZy4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOworCisJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisKKworCQkvLyBTdGVwIDI6IHNlbmQgbW9yZSA1MCBwYWNrZXRzIHRoZW4gc3RhcnQgY29udGludWUgbW9kZS4KKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCS8vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MQorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJQmJwRGF0YSB8PSAweDAwMDAwMDgwOyAvL3NldCBiaXQ3PTEKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJcEFkLT5hdGUuVHhDb3VudCA9IDUwOworCisJCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljaworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCQl9CisKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCVNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQorCQl7CisJCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwkJCVR4RCA9ICpwRGVzdFR4RDsKKwkJCXBUeEQgPSAmVHhEOworCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCS8vIGNsZWFuIGN1cnJlbnQgY2VsbC4KKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCisJCQkJYnJlYWs7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOworCQl9CisKKwkJQVRFU2V0VXBGcmFtZShwQWQsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKworCQkvLyBTdGFydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJLy8ga2ljayBUeC1SaW5nLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeENwdUlkeCk7CisKKwkJUlRNUHVzZWNEZWxheSg1MDApOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisJCU1hY0RhdGEgfD0gMHgwMDAwMDAxMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWEZSQU1FIikpIC8vIFR4IEZyYW1lcworCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWEZSQU1FKENvdW50PSVkKVxuIiwgcEFkLT5hdGUuVHhDb3VudCkpOworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWEZSQU1FOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljaworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCQl9CisKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCVNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQorCQl7CisJCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwkJCVR4RCA9ICpwRGVzdFR4RDsKKwkJCXBUeEQgPSAmVHhEOworCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCS8vIENsZWFuIGN1cnJlbnQgY2VsbC4KKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCisJCQkJYnJlYWs7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOworCisJCX0KKworCQlBVEVTZXRVcEZyYW1lKHBBZCwgcFR4UmluZy0+VHhDcHVJZHgpOworCisJCS8vIFN0YXJ0IFR4LCBSeCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBFbmFibGUgVHgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkvLyBhZGQgdGhpcyBmb3IgTG9vcEJhY2sgbW9kZQorCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gRGlzYWJsZSBSeAorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJfQorCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2Vsc2UKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdLlR4RG1hSWR4KTsKKwkJLy8ga2ljayBUeC1SaW5nLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeENwdUlkeCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCX0KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhTVE9QIikpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYU1RPUFxuIikpOworCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKKwkJcEFkLT5hdGUuTW9kZSAmPSBBVEVfVFhTVE9QOworCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisvLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSBwQWQtPmF0ZS5UeENvdW50OworCisJCWlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUikKKwkJeworCQkJLy8gTm8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MCwgYml0Nj0wLCBiaXRbNX4wXT0weDAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJfQorCQllbHNlIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUlNVUFApCisJCXsKKwkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkJLy8gTm8gQ2FycmllciBTdXBwcmVzc2lvbiBzZXQgQkJQIFIyNCBiaXQwPTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRkZFOyAvL2NsZWFyIGJpdDAKKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIEJicERhdGEpOworCQl9CisJCS8vIFdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggYWxsb2NhdGUgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisKKwkJCVBSVE1QX1RYX1JJTkcgcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOworCisJCQlpZiAoYXRlbW9kZSAmIEFURV9UWENPTlQpCisJCQl7CisJCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQkJfQorCisJCQkvLyBBYm9ydCBUeCwgUnggRE1BLgorCQkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJUE5ESVNfUEFDS0VUICBwUGFja2V0OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCSAgICBwVHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisjZWxzZQorICAgICAgICAJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisgICAgICAgIAkJVHhEID0gKnBEZXN0VHhEOworICAgICAgICAJCXBUeEQgPSAmVHhEOworICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7CisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQkJfQorCQkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7CisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQkJfQorCQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJfQorCQkJLy8gRW5hYmxlIFR4LCBSeCBETUEKKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQl9CisKKwkJLy8gY29udHJvbAorLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOyAvLyB0YXNrIFR4IHN0YXR1cyAvLyAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZworCisJCS8vIFNvZnQgcmVzZXQgQkJQLgorCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkvLyBEaXNhYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlJYU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWFNUT1BcbiIpKTsKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1JYU1RPUDsKKwkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKworCQlpZiAoYXRlbW9kZSAmIEFURV9UWENBUlIpCisJCXsKKwkJCTsKKwkJfQorCQllbHNlIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUlNVUFApCisJCXsKKwkJCTsKKwkJfQorCisJCS8vIFdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggd2FzIGFsbG9jYXRlZCB3aGVuIEFURV9UWEZSQU1FICwgQVRFX1NUT1AsIGFuZCBBVEVfVFhDT05ULgorCQllbHNlIGlmICgoYXRlbW9kZSAmIEFURV9UWEZSQU1FKSB8fCAoYXRlbW9kZSA9PSBBVEVfU1RPUCkpCisJCXsKKwkJCWlmIChhdGVtb2RlICYgQVRFX1RYQ09OVCkKKwkJCXsKKwkJCQk7CisJCQl9CisJCX0KKworCQkvLyBjb250cm9sCisvLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworLy8JCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsgLy8gdGFzayBUeCBzdGF0dXMgLy8gMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlJYRlJBTUUiKSkgLy8gUnggRnJhbWVzCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFJYRlJBTUVcbiIpKTsKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9SWEZSQU1FOworCisJCS8vIERpc2FibGUgVHggb2YgTUFDIGJsb2NrLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBFbmFibGUgUnggb2YgTUFDIGJsb2NrLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCX0KKwllbHNlCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IEludmFsaWQgYXJnIVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IEFURUNtZEhhbmRsZXIoKVxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PUVuZCBvZiBSVDI4NjA9PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09U3RhcnQgb2YgUlQyODcwPT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKK0lOVAlTZXRfQVRFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWlmIChBVEVDbWRIYW5kbGVyKHBBZCwgYXJnKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJCXJldHVybiBUUlVFOworCX0KKwllbHNlCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUHJvYyBGYWlsZWRcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIEFERFIxPURBIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQorICAgICAgICBvcgorICAgICAgICBTZXQgQVRFIEFERFIzPURBIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9EQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWk7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIzW2krK10sIDEpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCWlmKGkgIT0gNikKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfREFfUHJvYyAoREEgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZC0+YXRlLkFkZHIzWzBdLAorCQlwQWQtPmF0ZS5BZGRyM1sxXSwgcEFkLT5hdGUuQWRkcjNbMl0sIHBBZC0+YXRlLkFkZHIzWzNdLCBwQWQtPmF0ZS5BZGRyM1s0XSwgcEFkLT5hdGUuQWRkcjNbNV0pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9EQV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgQUREUjM9U0EgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCisgICAgICAgIG9yCisgICAgICAgIFNldCBBVEUgQUREUjI9U0EgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1NBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaTsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjJbaSsrXSwgMSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJaWYoaSAhPSA2KQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9TQV9Qcm9jIChTQSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkLT5hdGUuQWRkcjJbMF0sCisJCXBBZC0+YXRlLkFkZHIyWzFdLCBwQWQtPmF0ZS5BZGRyMlsyXSwgcEFkLT5hdGUuQWRkcjJbM10sIHBBZC0+YXRlLkFkZHIyWzRdLCBwQWQtPmF0ZS5BZGRyMls1XSkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1NBX1Byb2MgU3VjY2Vzc1xuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBBRERSMj1CU1NJRCBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKKyAgICAgICAgb3IKKyAgICAgICAgU2V0IEFURSBBRERSMT1CU1NJRCBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfQlNTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlpOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyMVtpKytdLCAxKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwlpZihpICE9IDYpCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0JTU0lEX1Byb2MgKEJTU0lEID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLAlwQWQtPmF0ZS5BZGRyMVswXSwKKwkJcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfQlNTSURfUHJvYyBTdWNjZXNzXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IENoYW5uZWwKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBjaGFubmVsOworCisJY2hhbm5lbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDIxNikpLy8gdG8gYWxsb3cgQSBiYW5kIGNoYW5uZWwgOiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDE0KSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfQ0hBTk5FTF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAxfjE0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXBBZC0+YXRlLkNoYW5uZWwgPSBjaGFubmVsOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9DSEFOTkVMX1Byb2MgKEFURSBDaGFubmVsID0gJWQpXG4iLCBwQWQtPmF0ZS5DaGFubmVsKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0NIQU5ORUxfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggUG93ZXIwCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIFR4UG93ZXI7CisKKwlUeFBvd2VyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCXsKKwkJaWYgKChUeFBvd2VyID4gMzEpIHx8IChUeFBvd2VyIDwgMCkpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIwX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisJZWxzZS8vIDUuNUdIegorCXsKKwkJaWYgKChUeFBvd2VyID4gMTUpIHx8IChUeFBvd2VyIDwgLTcpKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcEFkLT5hdGUuVHhQb3dlcjAgPSBUeFBvd2VyOworCUFURVR4UHdySGFuZGxlcihwQWQsIDApOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9QT1dFUjBfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggUG93ZXIxCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIFR4UG93ZXI7CisKKwlUeFBvd2VyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCXsKKwlpZiAoKFR4UG93ZXIgPiAzMSkgfHwgKFR4UG93ZXIgPCAwKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIxX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJfQorCWVsc2UKKwl7CisJCWlmICgoVHhQb3dlciA+IDE1KSB8fCAoVHhQb3dlciA8IC03KSkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXBBZC0+YXRlLlR4UG93ZXIxID0gVHhQb3dlcjsKKwlBVEVUeFB3ckhhbmRsZXIocEFkLCAxKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfUE9XRVIxX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IEFudGVubmEKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIHZhbHVlOworCisJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKCh2YWx1ZSA+IDIpIHx8ICh2YWx1ZSA8IDApKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9BbnRlbm5hX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCB2YWx1ZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gdmFsdWU7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0FudGVubmFfUHJvYyAoQW50ZW5uYSA9ICVkKVxuIiwgcEFkLT5hdGUuVHhBbnRlbm5hU2VsKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSYWxpbms6IFNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBSeCBBbnRlbm5hCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1JYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiB2YWx1ZTsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgodmFsdWUgPiAzKSB8fCAodmFsdWUgPCAwKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IHZhbHVlOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFJGIGZyZXF1ZW5jZSBvZmZzZXQKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBSRkZyZXFPZmZzZXQ7CisJVUxPTkcgUjQ7CisKKwlSRkZyZXFPZmZzZXQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYoUkZGcmVxT2Zmc2V0ID49IDY0KQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDB+NjMuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPSBSRkZyZXFPZmZzZXQ7CisJUjQgPSBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTU7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJUjQgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAoKH4weDAwMWY4MDAwKSkpOworCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jIChSRkZyZXFPZmZzZXQgPSAlZClcbiIsIHBBZC0+YXRlLlJGRnJlcU9mZnNldCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFJGIEJXCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0JXX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWludCBpOworCVVDSEFSIHZhbHVlID0gMDsKKwlVQ0hBUiBCQlBDdXJyZW50Qlc7CisKKwlCQlBDdXJyZW50QlcgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYoQkJQQ3VycmVudEJXID09IDApCisJCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKKwllbHNlCisJCXBBZC0+YXRlLlR4V0kuQlcgPSBCV180MDsKKworCWlmKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCisJeworCQlpZihwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisgCQlmb3IgKGk9MDsgaTw1OyBpKyspCisgCQl7CisJCQkJaWYgKHBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0pOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisgCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSk7CisgCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisgCQkJfQorIAkJfQorCQl9CisKKwkJLy9TZXQgQkJQIFI0IGJpdFs0OjNdPTA6MAorIAkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7CisgCQl2YWx1ZSAmPSAofjB4MTgpOworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7CisKKyAgCQkvL1NldCBCQlAgUjY2PTB4M0MKKyAJCXZhbHVlID0gMHgzQzsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OD0weDBCCisJCS8vdG8gaW1wcm92ZSBSeCBzZW5zaXRpdml0eS4KKwkJdmFsdWUgPSAweDBCOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY4LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjk9MHgxNgorCQl2YWx1ZSA9IDB4MTY7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzA9MHgwOAorCQl2YWx1ZSA9IDB4MDg7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzM9MHgxMQorCQl2YWx1ZSA9IDB4MTE7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCB2YWx1ZSk7CisKKwkgICAgLy8gSWYgQ2hhbm5lbD0xNCwgQmFuZHdpZHRoPTIwTSBhbmQgTW9kZT1DQ0ssIFNldCBCQlAgUjQgYml0NT0xCisJICAgIC8vIChKYXBhbiBmaWx0ZXIgY29lZmZpY2llbnRzKQorCSAgICAvLyBUaGlzIHNlZ21lbnQgb2YgY29kZSB3aWxsIG9ubHkgd29ya3Mgd2hlbiBBVEVUWE1PREUgYW5kIEFURUNIQU5ORUwKKwkgICAgLy8gd2VyZSBzZXQgdG8gTU9ERV9DQ0sgYW5kIDE0IHJlc3BlY3RpdmVseSBiZWZvcmUgQVRFVFhCVyBpcyBzZXQgdG8gMC4KKwkgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPT0gMTQpCisJCXsKKwkJCWludCBUeE1vZGUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisJCQlpZiAoVHhNb2RlID09IE1PREVfQ0NLKQorCQkJeworCQkJCS8vIHdoZW4gQ2hhbm5lbD09MTQgJiYgTW9kZT09Q0NLICYmIEJhbmRXaWR0aD09MjBNLCBCQlAgUjQgYml0NT0xCisgCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOworCQkJCXZhbHVlIHw9IDB4MjA7IC8vc2V0IGJpdDU9MQorIAkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKKwkJCX0KKwkJfQorCisJICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIElmIGJhbmR3aWR0aCAhPSA0ME0sIFJGIFJlZzQgYml0IDIxID0gMC4KKwkJcEFkLT5MYXRjaFJmUmVncy5SNCAmPSB+MHgwMDIwMDAwMDsKKwkJUnRtcFJmSW9Xcml0ZShwQWQpOworCX0KKwllbHNlIGlmKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCisJeworCQlpZihwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0pOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPj0gTU9ERV9IVE1JWCkgJiYgKHBBZC0+YXRlLlR4V0kuTUNTID09IDcpKQorCQkJeworICAgIAkJCXZhbHVlID0gMHgyODsKKyAgICAJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY3LCB2YWx1ZSk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCX0KKworCQkvL1NldCBCQlAgUjQgYml0WzQ6M109MTowCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOworCQl2YWx1ZSAmPSAofjB4MTgpOworCQl2YWx1ZSB8PSAweDEwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKKworCQkvL1NldCBCQlAgUjY2PTB4M0MKKwkJdmFsdWUgPSAweDNDOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjg9MHgwQworCQkvL3RvIGltcHJvdmUgUnggc2Vuc2l0aXZpdHkuCisJCXZhbHVlID0gMHgwQzsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY5PTB4MUEKKwkJdmFsdWUgPSAweDFBOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzA9MHgwQQorCQl2YWx1ZSA9IDB4MEE7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3Mz0weDE2CisJCXZhbHVlID0gMHgxNjsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgdmFsdWUpOworCisJCS8vIElmIGJhbmR3aWR0aCA9IDQwTSwgc2V0IFJGIFJlZzQgYml0IDIxID0gMS4KKwkJcEFkLT5MYXRjaFJmUmVncy5SNCB8PSAweDAwMjAwMDAwOworCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9CV19Qcm9jIChCQlBDdXJyZW50QlcgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuQlcpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQldfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgbGVuZ3RoCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeExlbmd0aCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZigocEFkLT5hdGUuVHhMZW5ndGggPCAyNCkgfHwgKHBBZC0+YXRlLlR4TGVuZ3RoID4gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSkpCisJeworCQlwQWQtPmF0ZS5UeExlbmd0aCA9IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLyk7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTEVOR1RIX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDI0fiVkLlxuIiwgKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9MRU5HVEhfUHJvYyAoVHhMZW5ndGggPSAlZClcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBjb3VudAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeENvdW50ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQ09VTlRfUHJvYyAoVHhDb3VudCA9ICVkKVxuIiwgcEFkLT5hdGUuVHhDb3VudCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9DT1VOVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBNQ1MKKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9NQ1NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgTUNTOworCWludCByZXN1bHQ7CisKKwlNQ1MgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCXJlc3VsdCA9IENoZWNrTUNTVmFsaWQocEFkLT5hdGUuVHhXSS5QSFlNT0RFLCBNQ1MpOworCisJaWYgKHJlc3VsdCAhPSAtMSkKKwl7CisJCXBBZC0+YXRlLlR4V0kuTUNTID0gKFVDSEFSKU1DUzsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9NQ1NfUHJvYzo6T3V0IG9mIHJhbmdlLCByZWZlciB0byByYXRlIHRhYmxlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9NQ1NfUHJvYyAoTUNTID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLk1DUykpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9NQ1NfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgTW9kZQorICAgICAgICAwOiBNT0RFX0NDSworICAgICAgICAxOiBNT0RFX09GRE0KKyAgICAgICAgMjogTU9ERV9IVE1JWAorICAgICAgICAzOiBNT0RFX0hUR1JFRU5GSUVMRAorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA+IDMpCisJeworCQlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSAwOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX01PREVfUHJvYzo6T3V0IG9mIHJhbmdlLiBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH4zXG4iKSk7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjA6IENDSywgMTogT0ZETSwgMjogSFRfTUlYLCAzOiBIVF9HUkVFTl9GSUVMRC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTU9ERV9Qcm9jIChUeE1vZGUgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuUEhZTU9ERSkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9NT0RFX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIEdJCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfR0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKHBBZC0+YXRlLlR4V0kuU2hvcnRHSSA+IDEpCisJeworCQlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSAwOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0dJX1Byb2M6Ok91dCBvZiByYW5nZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9HSV9Qcm9jIChHSSA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5TaG9ydEdJKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0dJX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0lOVAlTZXRfQVRFX1JYX0ZFUl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5iUnhGZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKHBBZC0+YXRlLmJSeEZlciA9PSAxKQorCXsKKwkJcEFkLT5hdGUuUnhDbnRQZXJTZWMgPSAwOworCQlwQWQtPmF0ZS5SeFRvdGFsQ250ID0gMDsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1JYX0ZFUl9Qcm9jIChiUnhGZXIgPSAlZClcbiIsIHBBZC0+YXRlLmJSeEZlcikpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9SWF9GRVJfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9SZWFkX1JGX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSMSA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIyID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjMgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjMpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSNCA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkYxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlIxID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SMiA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkY0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTG9hZCBhbmQgV3JpdGUgRUVQUk9NIGZyb20gYSBiaW5hcnkgZmlsZSBwcmVwYXJlZCBpbiBhZHZhbmNlLgorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZm5kZWYgVUNPUworSU5UIFNldF9BVEVfTG9hZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQk9PTEVBTgkJICAgIHJldCA9IEZBTFNFOworCVBVQ0hBUgkJCXNyYyA9IEVFUFJPTV9CSU5fRklMRV9OQU1FOworCXN0cnVjdCBmaWxlCQkqc3JjZjsKKwlJTlQzMiAJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3QJb3JnZnM7CisJVVNIT1JUIAkJCVdyaXRlRUVQUk9NWyhFRVBST01fU0laRS8yKV07CisJVUlOVDMyCQkJRmlsZUxlbmd0aCA9IDA7CisJVUlOVDMyIAkJCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PT4gJXMgKHZhbHVlPSVkKVxuXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlKSk7CisKKwlpZiAodmFsdWUgPiAwKQorCXsKKwkJLyogemVybyB0aGUgZTJwIGJ1ZmZlciAqLworCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCBFRVBST01fU0laRSk7CisKKwkJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICAgKiogc2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpCisJICAgICovCisJCW9yZ2ZzdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCS8qIGFzIHJvb3QgKi8KKwkJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgCW9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgCXNldF9mcyhLRVJORUxfRFMpOworCisJCWRvCisJCXsKKwkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCisJCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCisJCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXMgLSBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19GVU5DVElPTl9fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgcmVhZCBtZXRob2RcbiIsIF9fRlVOQ1RJT05fXywgc3JjKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogcmVhZCB0aGUgZmlybXdhcmUgZnJvbSB0aGUgZmlsZSAqLmJpbiAqLworCQkJRmlsZUxlbmd0aCA9IHNyY2YtPmZfb3AtPnJlYWQoc3JjZiwKKwkJCQkJCQkJCQkgIChQVUNIQVIpV3JpdGVFRVBST00sCisJCQkJCQkJCQkJICBFRVBST01fU0laRSwKKwkJCQkJCQkJCQkgICZzcmNmLT5mX3Bvcyk7CisKKwkJCWlmIChGaWxlTGVuZ3RoICE9IEVFUFJPTV9TSVpFKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXM6IGVycm9yIGZpbGUgbGVuZ3RoICg9JWQpIGluIGUycC5iaW5cbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXywgRmlsZUxlbmd0aCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLworCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKKwkJCQlyZXQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQl7CisJCQkJOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dmFsID0gZmlscF9jbG9zZShzcmNmLCBOVUxMKTsKKwkJCWlmIChyZXR2YWwpCisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCisJCQl9CisJCX0KKworCQkvKiByZXN0b3JlICovCisJCXNldF9mcyhvcmdmcyk7CisJCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisJfQorICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gJXMgKHJldD0lZClcbiIsIF9fRlVOQ1RJT05fXywgcmV0KSk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisjZWxzZQorSU5UIFNldF9BVEVfTG9hZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIAkJCVdyaXRlRUVQUk9NWyhFRVBST01fU0laRS8yKV07CisJc3RydWN0IGl3cmVxCSp3cnEgPSAoc3RydWN0IGl3cmVxICopYXJnOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlcyAod3JxLT51LmRhdGEubGVuZ3RoID0gJWQpXG5cbiIsIF9fRlVOQ1RJT05fXywgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IEVFUFJPTV9TSVpFKQorCXsKKwkJYXRlX3ByaW50KCIlczogZXJyb3IgbGVuZ3RoICg9JWQpIGZyb20gaG9zdFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlLyogKHdycS0+dS5kYXRhLmxlbmd0aCA9PSBFRVBST01fU0laRSkgKi8KKwl7CisJCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KKwkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOworCisJCS8qIGZpbGwgdGhlIGxvY2FsIGJ1ZmZlciAqLworCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCWRvCisJCXsKKwkJCQkvKiB3cml0ZSB0aGUgY29udGVudCBvZiAuYmluIGZpbGUgdG8gRUVQUk9NICovCisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZCwgV3JpdGVFRVBST00pOworCisJCX0gd2hpbGUoRkFMU0UpOworCQl9CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKworICAgIHJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gIVVDT1MgLy8KKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKwlVU0hPUlQgKnA7CisJaW50IGk7CisKKwlydF9lZV9yZWFkX2FsbChwQWQsIChVU0hPUlQgKilidWZmZXIpOworCXAgPSBidWZmZXI7CisJZm9yIChpID0gMDsgaSA8IChFRVBST01fU0laRS8yKTsgaSsrKQorCXsKKwkJYXRlX3ByaW50KCIlNC40eCAiLCAqcCk7CisJCWlmICgoKGkrMSkgJSAxNikgPT0gMCkKKwkJCWF0ZV9wcmludCgiXG4iKTsKKwkJcCsrOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9BVEVfU2hvd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoIk1vZGU9JWRcbiIsIHBBZC0+YXRlLk1vZGUpOworCWF0ZV9wcmludCgiVHhQb3dlcjA9JWRcbiIsIHBBZC0+YXRlLlR4UG93ZXIwKTsKKwlhdGVfcHJpbnQoIlR4UG93ZXIxPSVkXG4iLCBwQWQtPmF0ZS5UeFBvd2VyMSk7CisJYXRlX3ByaW50KCJUeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCk7CisJYXRlX3ByaW50KCJSeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCk7CisJYXRlX3ByaW50KCJCQlBDdXJyZW50Qlc9JWRcbiIsIHBBZC0+YXRlLlR4V0kuQlcpOworCWF0ZV9wcmludCgiR0k9JWRcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSk7CisJYXRlX3ByaW50KCJNQ1M9JWRcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKTsKKwlhdGVfcHJpbnQoIlR4TW9kZT0lZFxuIiwgcEFkLT5hdGUuVHhXSS5QSFlNT0RFKTsKKwlhdGVfcHJpbnQoIkFkZHIxPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyMVswXSwgcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKTsKKwlhdGVfcHJpbnQoIkFkZHIyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyMlswXSwgcEFkLT5hdGUuQWRkcjJbMV0sIHBBZC0+YXRlLkFkZHIyWzJdLCBwQWQtPmF0ZS5BZGRyMlszXSwgcEFkLT5hdGUuQWRkcjJbNF0sIHBBZC0+YXRlLkFkZHIyWzVdKTsKKwlhdGVfcHJpbnQoIkFkZHIzPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyM1swXSwgcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKTsKKwlhdGVfcHJpbnQoIkNoYW5uZWw9JWRcbiIsIHBBZC0+YXRlLkNoYW5uZWwpOworCWF0ZV9wcmludCgiVHhMZW5ndGg9JWRcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKTsKKwlhdGVfcHJpbnQoIlR4Q291bnQ9JXVcbiIsIHBBZC0+YXRlLlR4Q291bnQpOworCWF0ZV9wcmludCgiUkZGcmVxT2Zmc2V0PSVkXG4iLCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJTZXRfQVRFX1Nob3dfUHJvYyBTdWNjZXNzXG4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoIkFURT1BVEVTVEFSVCwgQVRFU1RPUCwgVFhDT05ULCBUWENBUlIsIFRYRlJBTUUsIFJYRlJBTUVcbiIpOworCWF0ZV9wcmludCgiQVRFREFcbiIpOworCWF0ZV9wcmludCgiQVRFU0FcbiIpOworCWF0ZV9wcmludCgiQVRFQlNTSURcbiIpOworCWF0ZV9wcmludCgiQVRFQ0hBTk5FTCwgcmFuZ2U6MH4xNCh1bmxlc3MgQSBiYW5kICEpXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYUE9XMCwgc2V0IHBvd2VyIGxldmVsIG9mIGFudGVubmEgMS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhQT1cxLCBzZXQgcG93ZXIgbGV2ZWwgb2YgYW50ZW5uYSAyLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEFOVCwgc2V0IFRYIGFudGVubmEuIDA6YWxsLCAxOmFudGVubmEgb25lLCAyOmFudGVubmEgdHdvLlxuIik7CisJYXRlX3ByaW50KCJBVEVSWEFOVCwgc2V0IFJYIGFudGVubmEuMDphbGwsIDE6YW50ZW5uYSBvbmUsIDI6YW50ZW5uYSB0d28sIDM6YW50ZW5uYSB0aHJlZS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhGUkVRT0ZGU0VULCBzZXQgZnJlcXVlbmN5IG9mZnNldCwgcmFuZ2UgMH42M1xuIik7CisJYXRlX3ByaW50KCJBVEVUWEJXLCBzZXQgQmFuZFdpZHRoLCAwOjIwTUh6LCAxOjQwTUh6LlxuIik7CisJYXRlX3ByaW50KCJBVEVUWExFTiwgc2V0IEZyYW1lIGxlbmd0aCwgcmFuZ2UgMjR+JWRcbiIsIChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpOworCWF0ZV9wcmludCgiQVRFVFhDTlQsIHNldCBob3cgbWFueSBmcmFtZSBnb2luZyB0byB0cmFuc21pdC5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhNQ1MsIHNldCBNQ1MsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWE1PREUsIHNldCBNb2RlIDA6Q0NLLCAxOk9GRE0sIDI6SFQtTWl4LCAzOkdyZWVuRmllbGQsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEdJLCBzZXQgR0kgaW50ZXJ2YWwsIDA6TG9uZywgMTpTaG9ydFxuIik7CisJYXRlX3ByaW50KCJBVEVSWEZFUiwgMDpkaXNhYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuIDE6ZW5hYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJSRiwgc2hvdyBhbGwgUkYgcmVnaXN0ZXJzLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYxLCBzZXQgUkYxIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYyLCBzZXQgUkYyIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYzLCBzZXQgUkYzIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkY0LCBzZXQgUkY0IHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVMREUyUCwgbG9hZCBFRVBST00gZnJvbSAuYmluIGZpbGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJFMlAsIGRpc3BsYXkgYWxsIEVFUFJPTSBjb250ZW50LlxuIik7CisJYXRlX3ByaW50KCJBVEVTSE9XLCBkaXNwbGF5IGFsbCBwYXJhbWV0ZXJzIG9mIEFURS5cbiIpOworCWF0ZV9wcmludCgiQVRFSEVMUCwgb25saW5lIGhlbHAuXG4iKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlBc2ljU3dpdGNoQ2hhbm5lbCgpIGRlZGljYXRlZCBmb3IgQVRFLgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQzMiBSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwLCBWYWx1ZSA9IDA7CisJQ0hBUiBUeFB3ZXIgPSAwLCBUeFB3ZXIyID0gMDsKKwlVQ0hBUiBpbmRleCwgQmJwVmFsdWUgPSAwLCBSNjYgPSAweDMwOworCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKKwlVQ0hBUiBDaGFubmVsOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAoKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgfHwgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkpCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCAhPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwpCisJCXsKKwkJCXBBZC0+YXRlLkNoYW5uZWwgPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWw7CisJCX0KKwkJcmV0dXJuOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwlDaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKKworCS8vIFNlbGVjdCBhbnRlbm5hCisJQXNpY0FudGVubmFTZWxlY3QocEFkLCBDaGFubmVsKTsKKworCS8vIGZpbGwgVHggcG93ZXIgdmFsdWUKKwlUeFB3ZXIgPSBwQWQtPmF0ZS5UeFBvd2VyMDsKKwlUeFB3ZXIyID0gcEFkLT5hdGUuVHhQb3dlcjE7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQkvKiBCdXQgb25seSAyODUwIGFuZCAyNzUwIHN1cHBvcnQgNS41R0h6IGJhbmQuLi4gKi8KKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVIyIHw9IDB4MjAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlSMiB8PSAweDEwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCVIyIHw9IDB4NDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQkvKiBPbmx5IGVuYWJsZSB0d28gQW50ZW5uYSB0byByZWNlaXZlLiAqLworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCWlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDEgLCBiaXQgMTQgPSAxOyBEaXNhYmxlIEFudCAyCisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsJCS8vMTExMDAxMTFCCisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMikKKwkJCQkJCXsKKwkJCQkJCQlSMiB8PSAweDgwMDA7CS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDIgLCBiaXQgMTUgPSAxOyBEaXNhYmxlIEFudCAxCisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKKwkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOworCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7CisJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVIyIHw9IDB4MjAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlSMiB8PSAweDEwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJUjIgfD0gMHgzMDAwMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDI7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJCQkJCS8vIDUuNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PDYpOy8vIFNldCBmcmVxIG9mZnNldCAmIFR4UHdyMQorCQkJCQl9CisKKwkJCQkJLy8gQmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbC4KKwkJCQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc3dpdGNoIGZyb20gYS0+ZywgZy0+YQorCWlmIChDaGFubmVsIDw9IDE0KQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjBBOy8vIDIwMDcuMTAuMDkgYnkgQnJpYW4gOiAweDAwMDUwNTBBID09PiAweDAwMDUwRjBBCisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKworCQkvKiBGb3IgMVQvMlIgY2hpcCBvbmx5Li4uICovCisJICAgIGlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCSAgICB7CisJICAgICAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4ODQpOworCSAgICB9CisKKyAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOworCQlpZiAoKEJicFZhbHVlICE9IDB4MDApKQorCQl7CisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAweDAwKTsKKwkJfQorCisJCS8vIDUuNUdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJCX0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisJZWxzZQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjA1Oy8vMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MDUgPT0+IDB4MDAwNTBGMDUKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweEYyKTsKKworICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7CisJCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCisJCXsKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOworCQl9CisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I5MSwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDA0KSk7CisKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjkyLCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKKworCQkvLyA1LjVHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCSAgICB9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCisgICAgLy8gUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCQkvLyBCRyBiYW5kCisJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwl9CisJZWxzZQorCXsKKwkJLy8gNS41IEdIeiBiYW5kCisJCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisgICAgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorCX0KKworCS8vCisJLy8gT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZQorCS8vIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzCisJLy8gMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCisJLy8KKwlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJaWYgKENoYW5uZWwgPiAxNCkKKwl7CisJCS8vIFdoZW4gNS41R0h6IGJhbmQgdGhlIExTQiBvZiBUeFB3ciB3aWxsIGJlIHVzZWQgdG8gcmVkdWNlZCA3ZEIgb3Igbm90LgorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKKwkJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCisJCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JXUsIFB3cjE9JXUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkJICAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAorCQkJCQkJCQkgIChSNCAmIDB4MDAwMDA3YzApID4+IDYsCisJCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisgICAgfQorfQorCisvLworLy8gSW4gZmFjdCwgbm8gb25lIHdpbGwgY2FsbCB0aGlzIHJvdXRpbmUgc28gZmFyICEKKy8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gQVRFIG1vZGUuCisKKwkJY2FsY3VsYXRlIGRlc2lyZWQgVHggcG93ZXIgaW4gUkYgUjMuVHgwfjUsCXNob3VsZCBjb25zaWRlciAtCisJCTAuIGlmIGN1cnJlbnQgcmFkaW8gaXMgYSBub2lzeSBlbnZpcm9ubWVudCAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCkKKwkJMS4gVHhQb3dlclBlcmNlbnRhZ2UKKwkJMi4gYXV0byBjYWxpYnJhdGlvbiBiYXNlZCBvbiBUU1NJIGZlZWRiYWNrCisJCTMuIGV4dHJhIDIgZGIgZm9yIENDSworCQk0LiAtMTAgZGIgdXBvbiB2ZXJ5LXNob3J0IGRpc3RhbmNlIChBdmdSU1NJID49IC00MGRiKSB0byBBUAorCisJTk9URTogU2luY2UgdGhpcyByb3V0aW5lIHJlcXVpcmVzIHRoZSB2YWx1ZSBvZiAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCksCisJCWl0IHNob3VsZCBiZSBjYWxsZWQgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjQ5ID0gMCwgaWR4OworCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOworCVVMT05HCQlUeFB3cls1XTsKKwlDSEFSCQlWYWx1ZTsKKworCS8qIG5vIG9uZSBjYWxscyB0aGlzIHByb2NlZHVyZSBzbyBmYXIgKi8KKwlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCisJLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4KKwkvLyBEbyBpdCBwZXIgNCBzZWNvbmRzLgorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjQ5IGlzIHVuc2lnbmVkIGNoYXIgKi8KKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgaXMgMHgxMCB+IDB4NDAsIG1pbnVzIGlzIDB4NjAgfiAweDkwICovCisJCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIDB4NjUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCisKKwkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlLgorCQkJCS8vIENoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIuCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorLy8JCQkJaWYgKFIzID4gKFVMT05HKSAoVHhBZ2NTdGVwICogKGlkeC0xKSkpCisJCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKFVDSEFSKVIzKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIDApKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0KKwkJZWxzZQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwl9CisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDE7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvLyAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSAzOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gNjsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gOTsKKwl9CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gMTI7CisJfQorCisJLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KKwlmb3IoaT0wOyBpPDU7IGkrKykKKwl7CisJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQorCQl7CisJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQl7CisJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCisKKwkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKKwkJCQl7CisJCQkJCVZhbHVlID0gMDsgLyogbWluICovCisJCQkJfQorCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKKwkJCQl7CisJCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLworCQkJCX0KKworCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KKwkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJfQorCisJCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KKwkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCisJCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOworCisKKwkJfQorCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVdyaXRlIFR4V0kgZm9yIEFURSBtb2RlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIFJUMjg2MAorc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwT3V0VHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJQ0ZBQ0ssCisJSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOIAkJQU1QRFUsCisJSU4JQk9PTEVBTiAJCUFjaywKKwlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTglVQ0hBUiAJCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpCit7CisJVFhXSV9TVFJVQyAJCVR4V0k7CisJUFRYV0lfU1RSVUMgCXBUeFdJOworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CisJTmRpc1plcm9NZW1vcnkoJlR4V0ksIFRYV0lfU0laRSk7CisJcFR4V0kgPSAmVHhXSTsKKworCXBUeFdJLT5GUkFHPSBGUkFHOworCisJcFR4V0ktPkNGQUNLID0gQ0ZBQ0s7CisJcFR4V0ktPlRTPSBJbnNUaW1lc3RhbXA7CisJcFR4V0ktPkFNUERVID0gQU1QRFU7CisJcFR4V0ktPkFDSyA9IEFjazsKKwlwVHhXSS0+dHhvcD0gVHhvcG1vZGU7CisKKwlwVHhXSS0+TlNFUSA9IE5TZXE7CisJLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCWlmKCBCQVNpemUgPjcgKQorCQlCQVNpemUgPTc7CisKKwlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gV0NJRDsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOworCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKwlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKKwlwVHhXSS0+TUlNT3BzID0gMDsKKwlwVHhXSS0+TXBkdURlbnNpdHkgPSAwOworCisJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKKwlOZGlzTW92ZU1lbW9yeShwT3V0VHhXSSwgJlR4V0ksIHNpemVvZihUWFdJX1NUUlVDKSk7CisKKyAgICAgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRGlzYWJsZSBwcm90ZWN0aW9uIGZvciBBVEUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBVEVEaXNhYmxlQXNpY1Byb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVBST1RfQ0ZHX1NUUlVDCVByb3RDZmcsIFByb3RDZmc0OworCVVJTlQzMiBQcm90ZWN0WzZdOworCVVTSE9SVAkJCW9mZnNldDsKKwlVQ0hBUgkJCWk7CisJVUlOVDMyIE1hY1JlZyA9IDA7CisKKwkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKKwlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKKwlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOworCisJLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncworCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7CisJUHJvdENmZzQud29yZCA9IDA7CisJUHJvdENmZy53b3JkID0gMDsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOworCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKworCS8vIEhhbmRsZSBsZWdhY3koQi9HKSBwcm90ZWN0aW9uCisJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CisJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCisJLy8gTk8gUFJPVEVDVAorCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCisJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCisJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCisJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KKworCS8vIE1NMjBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCS8vIE1NNDBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7CisKKwkvLyBDRjIwX1BST1RfQ0ZHCisJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkvLyBDRjQwX1BST1RfQ0ZHCisJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCisJb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOworCWZvciAoaSA9IDA7aSA8IDY7aSsrKQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOworCit9CisKKworLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbnZlcnQgUnNzaSAqLworI2lmIDEKKy8vCisvLyBUaGUgd2F5IHVzZWQgd2l0aCBHRVRfTE5BX0dBSU4oKS4KKy8vCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUglSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOworCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKwl7CisJCWlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworCX0KKwllbHNlCisJeworCQlpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKwl9CisKKwlyZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Cit9CisjZWxzZQorLy8KKy8vIFRoZSB3YXkgb3JpZ2luYWxseSB1c2VkIGluIEFURSBvZiBydDI4NjBhcC4KKy8vCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUgkJCVJzc2ksCisJSU4gIFVDSEFSICAgUnNzaU51bWJlcikKK3sKKwlVQ0hBUglSc3NpT2Zmc2V0LCBMTkFHYWluOworCisJLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQorCWlmIChSc3NpID09IDApCisJCXJldHVybiAtOTk7CisKKyAgICBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisgICAgeworICAgICAgICBMTkFHYWluID0gcEFkLT5BTE5BR2FpbjsKKyAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExOQUdhaW4gPSBwQWQtPkJMTkFHYWluOworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKyAgICB9CisKKyAgICByZXR1cm4gKC0zMiAtIFJzc2lPZmZzZXQgKyBMTkFHYWluIC0gUnNzaSk7Cit9CisjZW5kaWYgLyogZW5kIG9mICNpZiAxICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgSmFwYW4gZmlsdGVyIGNvZWZmaWNpZW50cyBpZiBuZWVkZWQuCisJTm90ZToKKwkJVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCisJCWVudGVyaW5nIFRYRlJBTUUgbW9kZSBvciBUWENPTlQgbW9kZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCUJicERhdGEgPSAwOworCisJLy8KKwkvLyBJZiBDaGFubmVsPTE0IGFuZCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgc2V0IEJCUCBSNCBiaXQ1PTEKKwkvLyAoSmFwYW4gVHggZmlsdGVyIGNvZWZmaWNpZW50cyl3aGVuIChUWEZSQU1FIG9yIFRYQ09OVCkuCisJLy8KKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJicERhdGEpOworCisgICAgaWYgKChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPT0gTU9ERV9DQ0spICYmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KSAmJiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkpCisgICAgeworICAgICAgICBCYnBEYXRhIHw9IDB4MjA7ICAgIC8vIHR1cm4gb24KKyAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0SmFwYW5GaWx0ZXIhISFcbiIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkJQmJwRGF0YSAmPSAweGRmOyAgICAvLyB0dXJuIG9mZgorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbGVhckphcGFuRmlsdGVyISEhXG4iKSk7CisgICAgfQorCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCYnBEYXRhKTsKK30KKworVk9JRCBBVEVTYW1wbGVSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKK3sKKwkvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY29sbGVjdCBSU1NJLiAqLworI2lmIDEKKwkvL3BBZC0+TGFzdFJ4UmF0ZSA9IChVU0hPUlQpKChwUnhXSS0+TUNTKSArIChwUnhXSS0+QlcgPDw3KSArIChwUnhXSS0+U2hvcnRHSSA8PDgpKyAocFJ4V0ktPlBIWU1PREUgPDwxNCkpIDsKKwlpZiAocFJ4V0ktPlJTU0kwICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTAJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMCwgUlNTSV8wKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTBYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMFg4IC0gcEFkLT5hdGUuQXZnUnNzaTApICsgcEFkLT5hdGUuTGFzdFJzc2kwOworCQlwQWQtPmF0ZS5BdmdSc3NpMCAgCT0gcEFkLT5hdGUuQXZnUnNzaTBYOCA+PiAzOworCX0KKwlpZiAocFJ4V0ktPlJTU0kxICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTEJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMSwgUlNTSV8xKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTFYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMVg4IC0gcEFkLT5hdGUuQXZnUnNzaTEpICsgcEFkLT5hdGUuTGFzdFJzc2kxOworCQlwQWQtPmF0ZS5BdmdSc3NpMQk9IHBBZC0+YXRlLkF2Z1Jzc2kxWDggPj4gMzsKKwl9CisJaWYgKHBSeFdJLT5SU1NJMiAhPSAwKQorCXsKKwkJcEFkLT5hdGUuTGFzdFJzc2kyCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTIsIFJTU0lfMik7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyWDgJPSAocEFkLT5hdGUuQXZnUnNzaTJYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kyKSArIHBBZC0+YXRlLkxhc3RSc3NpMjsKKwkJcEFkLT5hdGUuQXZnUnNzaTIJPSBwQWQtPmF0ZS5BdmdSc3NpMlg4ID4+IDM7CisJfQorCisJcEFkLT5hdGUuTGFzdFNOUjAgPSAoQ0hBUikocFJ4V0ktPlNOUjApOy8vIENIQVIgPT0+IFVDSEFSID8KKwlwQWQtPmF0ZS5MYXN0U05SMSA9IChDSEFSKShwUnhXSS0+U05SMSk7Ly8gQ0hBUiA9PT4gVUNIQVIgPworCisJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOworI2Vsc2UKKwlwQWQtPmF0ZS5MYXN0U05SMCA9IChDSEFSKShwUnhXSS0+U05SMCk7CisJcEFkLT5hdGUuTGFzdFNOUjEgPSAoQ0hBUikocFJ4V0ktPlNOUjEpOworCXBBZC0+YXRlLlJ4Q250UGVyU2VjKys7CisJcEFkLT5hdGUuTGFzdFJzc2kwID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTAsIFJTU0lfMCk7CisJcEFkLT5hdGUuTGFzdFJzc2kxID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTEsIFJTU0lfMSk7CisJcEFkLT5hdGUuTGFzdFJzc2kyID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTIsIFJTU0lfMik7CisJcEFkLT5hdGUuQXZnUnNzaTBYOCA9IChwQWQtPmF0ZS5BdmdSc3NpMFg4IC0gcEFkLT5hdGUuQXZnUnNzaTApICsgcEFkLT5hdGUuTGFzdFJzc2kwOworCXBBZC0+YXRlLkF2Z1Jzc2kwID0gcEFkLT5hdGUuQXZnUnNzaTBYOCA+PiAzOworCXBBZC0+YXRlLkF2Z1Jzc2kxWDggPSAocEFkLT5hdGUuQXZnUnNzaTFYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kxKSArIHBBZC0+YXRlLkxhc3RSc3NpMTsKKwlwQWQtPmF0ZS5BdmdSc3NpMSA9IHBBZC0+YXRlLkF2Z1Jzc2kxWDggPj4gMzsKKwlwQWQtPmF0ZS5BdmdSc3NpMlg4ID0gKHBBZC0+YXRlLkF2Z1Jzc2kyWDggLSBwQWQtPmF0ZS5BdmdSc3NpMikgKyBwQWQtPmF0ZS5MYXN0UnNzaTI7CisJcEFkLT5hdGUuQXZnUnNzaTIgPSBwQWQtPmF0ZS5BdmdSc3NpMlg4ID4+IDM7CisJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUFN0YXRpb25TdG9wKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworLy8JQk9PTEVBTiAgICAgICBDYW5jZWxsZWQ7CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUFN0YXRpb25TdG9wXG4iKSk7CisKKyNpZiAwCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgICAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgICAgICAgJkNhbmNlbGxlZCk7CisjZW5kaWYKKwkvLyBGb3Igcnggc3RhdGlzdGljcywgd2UgbmVlZCB0byBrZWVwIHRoaXMgdGltZXIgcnVubmluZy4KKy8vCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsICAgICAgJkNhbmNlbGxlZCk7CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUFN0YXRpb25TdG9wXG4iKSk7Cit9CisKK1ZPSUQgUlRNUFN0YXRpb25TdGFydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUFN0YXRpb25TdGFydFxuIikpOworI2lmZGVmIFJUMjg2MAorCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJLy8KKwkvLyBXZSBkaWQgbm90IGNhbmNlbCB0aGlzIHRpbWVyIHdoZW4gZW50ZXJpbmcgQVRFIG1vZGUuCisJLy8KKy8vCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIE1MTUVfVEFTS19FWEVDX0lOVFYpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0YXJ0XG4iKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2V0dXAgRnJhbWUgZm9ybWF0LgorCU5PVEU6CisJCVRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSB1c2VkIGluIEFURSBtb2RlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNpZmRlZiBSVDI4NjAKK3N0YXRpYyBJTlQgQVRFU2V0VXBGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UMzIgVHhJZHgpCit7CisJVUlOVCBqOworCVBUWERfU1RSVUMgcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwlQVUNIQVIgcERlc3Q7CisJUFZPSUQgQWxsb2NWYTsKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgQWxsb2NQYTsKKwlIVFRSQU5TTUlUX1NFVFRJTkcJVHhIVFBoeU1vZGU7CisKKwlQUlRNUF9UWF9SSU5HIHBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXTsKKwlQVFhXSV9TVFJVQyBwVHhXSSA9IChQVFhXSV9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJUFVDSEFSIHBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJeworCQkvLyBhbHdheXMgdXNlIFFJRF9BQ19CRSBhbmQgRklGT19FRENBCisKKwkJLy8gZmlsbCBUeFdJCisJCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKKwkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKKwkJVHhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOworCQlUeEhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgcEFkLT5hdGUuVHhXSS5GUkFHLCBwQWQtPmF0ZS5UeFdJLkNGQUNLLCBwQWQtPmF0ZS5UeFdJLlRTLCAgcEFkLT5hdGUuVHhXSS5BTVBEVSwgcEFkLT5hdGUuVHhXSS5BQ0ssIHBBZC0+YXRlLlR4V0kuTlNFUSwKKwkJCXBBZC0+YXRlLlR4V0kuQkFXaW5TaXplLCAwLCBwQWQtPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCwgcEFkLT5hdGUuVHhXSS5QYWNrZXRJZCwgMCwgMCwgcEFkLT5hdGUuVHhXSS50eG9wLypJRlNfSFRUWE9QKi8sIHBBZC0+YXRlLlR4V0kuQ0ZBQ0svKkZBTFNFKi8sICZUeEhUUGh5TW9kZSk7CisJfQorCWVsc2UKKwl7CisJCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKKwkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKKwkJVHhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOworCQlUeEhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgIEZBTFNFLCBGQUxTRSwgRkFMU0UsCisJCQk0LCAwLCBwQWQtPmF0ZS5UeExlbmd0aCwgMCwgMCwgMCwgSUZTX0hUVFhPUCwgRkFMU0UsICZUeEhUUGh5TW9kZSk7CisJfQorCisJLy8gZmlsbCA4MDIuMTEgaGVhZGVyLgorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUsIHBBZC0+YXRlLkhlYWRlciwgcEFkLT5hdGUuSExlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSwgVGVtcGxhdGVGcmFtZSwgTEVOR1RIXzgwMl8xMSk7CisJCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUrNCwgcEFkLT5hdGUuQWRkcjEsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUrMTAsIHBBZC0+YXRlLkFkZHIyLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFKzE2LCBwQWQtPmF0ZS5BZGRyMywgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKCgoUFVDSEFSKXBETUFIZWFkZXJCdWZWQSkrVFhXSV9TSVpFKSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkvKiBhbGxvYyBidWZmZXIgZm9yIHBheWxvYWQgKi8KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJeworCQkvKiBXaHkgbm90IHVzZSBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoKSBpbnN0ZWFkIG9mIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigpPyAqLworCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKHBBZCwgcEFkLT5hdGUuRExlbiArIDB4MTAwLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQkvKiBXaHkgbm90IHVzZSBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoKSBpbnN0ZWFkIG9mIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigpPyAqLworCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKHBBZCwgcEFkLT5hdGUuVHhMZW5ndGgsIEZBTFNFLCAmQWxsb2NWYSwgJkFsbG9jUGEpOworCX0KKworCWlmIChwUGFja2V0ID09IE5VTEwpCisJeworCQlwQWQtPmF0ZS5UeENvdW50ID0gMDsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgZmFpbCB0byBhbGxvYyBwYWNrZXQgc3BhY2UuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBwUGFja2V0OworCisJcERlc3QgPSAoUFVDSEFSKSBBbGxvY1ZhOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCXsKKwkJUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbiA9IHBBZC0+YXRlLkRMZW47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbiA9IHBBZC0+YXRlLlR4TGVuZ3RoIC0gTEVOR1RIXzgwMl8xMTsKKwl9CisKKwkvLyBQcmVwYXJlIGZyYW1lIHBheWxvYWQKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJeworCQkvLyBjb3B5IHBhdHRlcm4KKwkJaWYgKChwQWQtPmF0ZS5QTGVuICE9IDApKQorCQl7CisJCQlpbnQgajsKKworCQkJZm9yIChqID0gMDsgaiA8IHBBZC0+YXRlLkRMZW47IGorPXBBZC0+YXRlLlBMZW4pCisJCQl7CisJCQkJbWVtY3B5KFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5kYXRhICsgaiwgcEFkLT5hdGUuUGF0dGVybiwgcEFkLT5hdGUuUExlbik7CisJCQl9CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlmb3IoaiA9IDA7IGogPCBSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuOyBqKyspCisJCQlwRGVzdFtqXSA9IDB4QTU7CisJfQorCisJLy8KKwkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCisJLy8KKyNpZm5kZWYgUlRfQklHX0VORElBTgorCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisgICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyAgICBUeEQgPSAqcERlc3RUeEQ7CisgICAgcFR4RCA9ICZUeEQ7CisjZW5kaWYgLy8gIVJUX0JJR19FTkRJQU4gLy8KKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCS8vIHByZXBhcmUgVHhECisJCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKKwkJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisJCS8vIGJ1aWxkIFRYIERFU0MKKwkJcFR4RC0+U0RQdHIwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCQlwVHhELT5TRExlbjAgPSBUWFdJX1NJWkUgKyBwQWQtPmF0ZS5ITGVuOworCQlwVHhELT5MYXN0U2VjMCA9IDA7CisJCXBUeEQtPlNEUHRyMSA9IEFsbG9jUGE7CisJCXBUeEQtPlNETGVuMSA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW47CisJCXBUeEQtPkxhc3RTZWMxID0gMTsKKworCQlwRGVzdCA9IChQVUNIQVIpcFR4V0k7CisJCXBEZXN0ICs9IFRYV0lfU0laRTsKKwkJcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBEZXN0OworCisJCS8vIG1vZGlmeSBzZXF1ZW5jZSBudW1iZXIuLi4uCisJCWlmIChwQWQtPmF0ZS5UeERvbmVDb3VudCA9PSAwKQorCQl7CisJCQlwQWQtPmF0ZS5zZXEgPSBwSGVhZGVyODAyMTEtPlNlcXVlbmNlOworCQl9CisJCWVsc2UKKwkJCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSArK3BBZC0+YXRlLnNlcTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisJCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOworCQkvLyBidWlsZCBUWCBERVNDCisJCXBUeEQtPlNEUHRyMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisJCXBUeEQtPlNETGVuMCA9IFRYV0lfU0laRSArIExFTkdUSF84MDJfMTE7CisJCXBUeEQtPkxhc3RTZWMwID0gMDsKKwkJcFR4RC0+U0RQdHIxID0gQWxsb2NQYTsKKwkJcFR4RC0+U0RMZW4xID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbjsKKwkJcFR4RC0+TGFzdFNlYzEgPSAxOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoKChQVUNIQVIpcERNQUhlYWRlckJ1ZlZBKStUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlyZXR1cm4gMDsKK30KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09RW5kIG9mIFJUMjg2MD09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCitWT0lEIHJ0X2VlX3JlYWRfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCit7CisJVVNIT1JUIGk7CisJVVNIT1JUIHZhbHVlOworCisJZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQorCXsKKwkJLyogInZhbHVlIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIGkqMiwgdmFsdWUpOworCQlEYXRhW2ldID0gdmFsdWU7CisJCWkrKzsKKwl9Cit9CisKK1ZPSUQgcnRfZWVfd3JpdGVfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCit7CisJVVNIT1JUIGk7CisJVVNIT1JUIHZhbHVlOworCisJZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQorCXsKKwkJLyogInZhbHVlIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQl2YWx1ZSA9IERhdGFbaV07CisJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWQsIGkqMiwgdmFsdWUpOworCQlpICsrOworCX0KK30KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorVk9JRCBBVEVfUUFfU3RhdGlzdGljcygKKwlJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJCXBSeFdJLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOIFBIRUFERVJfODAyXzExCQkJcEhlYWRlcikKK3sKKwkvLyB1cGRhdGUgY291bnRlciBmaXJzdAorCWlmIChwSGVhZGVyICE9IE5VTEwpCisJeworCQlpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKQorCQl7CisJCQlpZiAocFJ4RC0+VTJNKQorCQkJCXBBZC0+YXRlLlUyTSsrOworCQkJZWxzZQorCQkJCXBBZC0+YXRlLk90aGVyRGF0YSsrOworCQl9CisJCWVsc2UgaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkKKwkJeworCQkJaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pCisJCQkJcEFkLT5hdGUuQmVhY29uKys7CisJCQllbHNlCisJCQkJcEFkLT5hdGUuT3RoZXJDb3VudCsrOworCQl9CisJCWVsc2UgaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkKKwkJeworCQkJcEFkLT5hdGUuT3RoZXJDb3VudCsrOworCQl9CisJfQorCXBBZC0+YXRlLlJTU0kwID0gcFJ4V0ktPlJTU0kwOworCXBBZC0+YXRlLlJTU0kxID0gcFJ4V0ktPlJTU0kxOworCXBBZC0+YXRlLlJTU0kyID0gcFJ4V0ktPlJTU0kyOworCXBBZC0+YXRlLlNOUjAgPSBwUnhXSS0+U05SMDsKKwlwQWQtPmF0ZS5TTlIxID0gcFJ4V0ktPlNOUjE7Cit9CisKKy8qIGNvbW1hbmQgaWQgd2l0aCBDbWQgVHlwZSA9PSAweDAwMDgoZm9yIDI4eHgpLzB4MDAwNShmb3IgaU5JQykgKi8KKyNkZWZpbmUgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTAkJMHgwMDAwCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2CQkweDAwMDEKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2CTB4MDAwMgorI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMCTB4MDAwMworI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTAkweDAwMDQKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1JFQUQJCQkweDAwMDUKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1dSSVRFCQkJMHgwMDA2CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsJCTB4MDAwNworI2RlZmluZSBSQUNGR19DTURfQkJQX1JFQUQ4CQkJMHgwMDA4CisjZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4CQkweDAwMDkKKyNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTAkJMHgwMDBhCisjZGVmaW5lIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUgkJMHgwMDBiCisjZGVmaW5lIFJBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSCQkweDAwMGMKKworI2RlZmluZSBSQUNGR19DTURfUlNWMQkJCQkweDAwMGQKKyNkZWZpbmUgUkFDRkdfQ01EX1JTVjIJCQkJMHgwMDBlCisjZGVmaW5lIFJBQ0ZHX0NNRF9SU1YzCQkJCTB4MDAwZgorCisjZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVEFSVAkJCTB4MDAxMAorI2RlZmluZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVUwkJMHgwMDExCisjZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVE9QCQkJMHgwMDEyCisjZGVmaW5lIFJBQ0ZHX0NNRF9SWF9TVEFSVAkJCTB4MDAxMworI2RlZmluZSBSQUNGR19DTURfUlhfU1RPUAkJCTB4MDAxNAorI2RlZmluZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMCTB4MDAxNQorCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlQJCQkweDAwODAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVE9QCQkJMHgwMDgxCisKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSCQkweDAxMDAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UCQkJMHgwMTAxCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUUJCTB4MDEwMgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9CVwkgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwCSAgICAgICAgMHgwMTA0CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMQkJCTB4MDEwNQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVAkJMHgwMTA2CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MJCTB4MDEwNworI2RlZmluZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIJCQkweDAxMDgKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQQkJMHgwMTA5CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEJCTB4MDEwYQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRQkJCTB4MDEwYgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMCQkJMHgwMTBjCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxCQkJCTB4MDEwZAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMgkJCQkweDAxMGUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjMJCQkJMHgwMTBmCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUJCQkJMHgwMTEwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTgkJMHgwMTExCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UCTB4MDExMgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FCQkweDAxMTMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLCTB4MDExNAorI2RlZmluZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLCTB4MDExNQorI2RlZmluZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsJCTB4MDExNgorI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsJCTB4MDExNworI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLCTB4MDExOAorI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSwkJMHgwMTE5CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSwkJMHgwMTFhCisKKworCisjZGVmaW5lIEEySGV4KF9YLCBfcCkgCQkJCVwKK3sJCQkJCQkJCQlcCisJVUNIQVIgKnA7CQkJCQkJXAorCV9YID0gMDsJCQkJCQkJXAorCXAgPSBfcDsJCQkJCQkJXAorCXdoaWxlICgoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpIHx8ICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkgfHwgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKSkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlpZiAoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpCQkJCVwKKwkJCV9YID0gX1ggKiAxNiArICpwIC0gODc7CQkJCQlcCisJCWVsc2UgaWYgKCgqcCA+PSAnQScpICYmICgqcCA8PSAnRicpKQkJXAorCQkJX1ggPSBfWCAqIDE2ICsgKnAgLSA1NTsJCQkJCVwKKwkJZWxzZSBpZiAoKCpwID49ICcwJykgJiYgKCpwIDw9ICc5JykpCQlcCisJCQlfWCA9IF9YICogMTYgKyAqcCAtIDQ4OwkJCQkJXAorCQlwKys7CQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJXAorfQorCisKK3N0YXRpYyBWT0lEIG1lbWNweV9leGwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbik7CitzdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOworc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pOworCisjaWZkZWYgVUNPUworaW50IGF0ZV9jb3B5X3RvX3VzZXIoCisJSU4gUFVDSEFSIHBheWxvYWQsCisJSU4gUFVDSEFSIG1zZywKKwlJTiBJTlQgICAgbGVuKQoreworCW1lbW1vdmUocGF5bG9hZCwgbXNnLCBsZW4pOworCXJldHVybiAwOworfQorCisjdW5kZWYJY29weV90b191c2VyCisjZGVmaW5lIGNvcHlfdG9fdXNlcih4LHkseikgYXRlX2NvcHlfdG9fdXNlcigoUFVDSEFSKXgsIChQVUNIQVIpeSwgeikKKyNlbmRpZiAvLyBVQ09TIC8vCisKKyNkZWZpbmUJTEVOX09GX0FSRyAxNgorCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCXVuc2lnbmVkIHNob3J0IENvbW1hbmRfSWQ7CisJc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnOworCUlOVAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisKKworCWlmKChwUmFDZmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJeworCQlTdGF0dXMgPSAtRUlOVkFMOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkocFJhQ2ZnLCBzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikpOworCisgICAgaWYgKGNvcHlfZnJvbV91c2VyKChQVUNIQVIpcFJhQ2ZnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJU3RhdHVzID0gLUVGQVVMVDsKKwkJa2ZyZWUocFJhQ2ZnKTsKKwkJcmV0dXJuOworCX0KKworCisJQ29tbWFuZF9JZCA9IG50b2hzKHBSYUNmZy0+Y29tbWFuZF9pZCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXM6IENvbW1hbmRfSWQgPSAweCUwNHggIVxuIiwgX19GVU5DVElPTl9fLCBDb21tYW5kX0lkKSk7CisKKwlzd2l0Y2ggKENvbW1hbmRfSWQpCisJeworIAkJLy8gV2Ugd2lsbCBnZXQgdGhpcyBjb21tYW5kIHdoZW4gUUEgc3RhcnRzLgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUXG4iKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrIGFzIHNvb24gYXMgd2UgY2FuIHRvIGF2b2lkIFFBIHRpbWVvdXQuCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVEFSVCIpOworCQkJfQorCQkJYnJlYWs7CisKKyAJCS8vIFdlIHdpbGwgZ2V0IHRoaXMgY29tbWFuZCBlaXRoZXIgUUEgaXMgY2xvc2VkIG9yIGF0ZWQgaXMga2lsbGVkIGJ5IHVzZXIuCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVE9QOgorCQkJeworI2lmbmRlZiBVQ09TCisJCQkJSU5UMzIgcmV0OworI2VuZGlmIC8vICFVQ09TIC8vCisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RPUFxuIikpOworCisJCQkJLy8gRGlzdGluZ3Vpc2ggdGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQSh2aWEgYXRlZCkKKwkJCQkvLyBvciBhdGUgZGFlbW9uIGFjY29yZGluZyB0byB0aGUgZXhpc3RlbmNlIG9mIHBpZCBpbiBwYXlsb2FkLgorCQkJCS8vIE5vIG5lZWQgdG8gcHJlcGFyZSBmZWVkYmFjayBpZiB0aGlzIGNtZCBjYW1lIGRpcmVjdGx5IGZyb20gYXRlIGRhZW1vbi4KKwkJCQlwUmFDZmctPmxlbmd0aCA9IG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCWlmIChwUmFDZmctPmxlbmd0aCA9PSBzaXplb2YocEFkYXB0ZXItPmF0ZS5BdGVQaWQpKQorCQkJCXsKKwkJCQkJLy8gVGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQS4KKwkJCQkJLy8gR2V0IHRoZSBwaWQgb2YgQVRFIGRhZW1vbi4KKwkJCQkJbWVtY3B5KChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkF0ZVBpZCwKKwkJCQkJCSgmcFJhQ2ZnLT5kYXRhWzBdKSAtIDIvKiA9PSAmKHBSYUNmZy0+c3RhdHVzKSAqLywKKwkJCQkJCXNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpOworCisJCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4KKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKwkgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUT1BcbiIpKTsKKwkgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJICAgICAgICAgICAgCX0KKworCQkJCQkvLworCQkJCQkvLyBraWxsIEFURSBkYWVtb24gd2hlbiBsZWF2aW5nIEFURSBtb2RlLgorCQkJCQkvLyBXZSBtdXN0IGtpbGwgQVRFIGRhZW1vbiBmaXJzdCBiZWZvcmUgc2V0dGluZyBBVEVTVE9QLAorCQkJCQkvLyBvciBNaWNyb3NvZnQgd2lsbCByZXBvcnQgc3RoLiB3cm9uZy4KKyNpZm5kZWYgVUNPUworCQkJCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocEFkYXB0ZXItPmF0ZS5BdGVQaWQsIFNJR1RFUk0sIDEpOworCQkJCQlpZiAocmV0KQorCQkJCQl7CisJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5hYmxlIHRvIHNpZ25hbCB0aHJlYWRcbiIsIHBBZGFwdGVyLT5uZXRfZGV2LT5uYW1lKSk7CisJCQkJCX0KKyNlbmRpZiAvLyAhVUNPUyAvLworCQkJCX0KKworCQkJCS8vIEFQIG1pZ2h0IGhhdmUgaW4gQVRFX1NUT1AgbW9kZSBkdWUgdG8gY21kIGZyb20gUUEuCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQkvLyBTb21lb25lIGhhcyBraWxsZWQgYXRlIGRhZW1vbiB3aGlsZSBRQSBHVUkgaXMgc3RpbGwgb3Blbi4KKwkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiQVRFU1RPUCIpOworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVBfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUkZfV1JJVEVfQUxMOgorCQkJeworCQkJCVVJTlQzMiBSMSwgUjIsIFIzLCBSNDsKKwkJCQlVU0hPUlQgY2hhbm5lbDsKKworCQkJCW1lbWNweSgmUjEsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKKwkJCQltZW1jcHkoJlIyLCBwUmFDZmctPmRhdGErMiwgNCk7CisJCQkJbWVtY3B5KCZSMywgcFJhQ2ZnLT5kYXRhKzYsIDQpOworCQkJCW1lbWNweSgmUjQsIHBSYUNmZy0+ZGF0YSsxMCwgNCk7CisJCQkJbWVtY3B5KCZjaGFubmVsLCBwUmFDZmctPmRhdGErMTQsIDIpOworCisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIxID0gbnRvaGwoUjEpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMiA9IG50b2hsKFIyKTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjMgPSBudG9obChSMyk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlI0ID0gbnRvaGwoUjQpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5DaGFubmVsID0gbnRvaHMoY2hhbm5lbCk7CisKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIzKTsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JGX1dSSVRFX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICBicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQsIHZhbHVlLCB0bXA7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJLyogInRtcCIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgb2Zmc2V0LCB0bXApOworCQkJCXZhbHVlID0gdG1wOworCQkJCXZhbHVlID0gaHRvbnModmFsdWUpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRVBST00gUmVhZCBvZmZzZXQgPSAweCUwNHgsIHZhbHVlID0gMHglMDR4XG4iLCBvZmZzZXQsIHZhbHVlKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucyg0KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCW1lbWNweShwUmFDZmctPmRhdGEsICZ2YWx1ZSwgMik7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikgPSAlZFxuIiwgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTZcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTYgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorICAgICAgICAgICAJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTY6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldCwgdmFsdWU7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTZcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilidWZmZXIsIEVFUFJPTV9TSVpFKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrRUVQUk9NX1NJWkUpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKWJ1ZmZlciwgRUVQUk9NX1NJWkUpOworCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciwgKFVDSEFSICopJnBSYUNmZy0+c3RhdHVzLCBFRVBST01fU0laRSk7CisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1JFQUQ6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldDsKKwkJCQlVSU5UMzIJdmFsdWU7CisKKwkJCQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3QgdGhlIG9mZnNldCBvdXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKKwkJCQl2YWx1ZSA9IGh0b25sKHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDYpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJbWVtY3B5KHBSYUNmZy0+ZGF0YSwgJnZhbHVlLCA0KTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9JT19SRUFEXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19SRUFEIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1dSSVRFOgorCQkJeworCQkJCVVJTlQzMglvZmZzZXQsIHZhbHVlOworCisJCQkJbWVtY3B5KCZvZmZzZXQsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKKwkJCQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGErMiwgNCk7CisKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3Qgb3V0IHRoZSBvZmZzZXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfSU9fV1JJVEU6IG9mZnNldCA9ICV4LCB2YWx1ZSA9ICV4XG4iLCBvZmZzZXQsIHZhbHVlKSk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0lPX1dSSVRFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19XUklURSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEs6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldDsKKwkJCQlVU0hPUlQJbGVuOworCisJCQkJbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7CisJCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKworCQkJCS8vIFdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCisJCQkJLy8gU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSsyLCAyKTsKKwkJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQkJaWYgKGxlbiA+IDM3MSkKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgibGVuIGlzIHRvbyBsYXJnZSwgbWFrZSBpdCBzbWFsbGVyXG4iKSk7CisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCVJUTVBfSU9fUkVBRF9CVUxLKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKW9mZnNldCwgbGVuKjQpOy8vIHVuaXQgaW4gZm91ciBieXRlcworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQkJQX1JFQUQ4OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQ7CisJCQkJVUNIQVIJdmFsdWU7CisKKwkJCQl2YWx1ZSA9IDA7CisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgJnZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICAmdmFsdWUpOworCQkJCX0KKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygzKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXBSYUNmZy0+ZGF0YVswXSA9IHZhbHVlOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAgdmFsdWUgPSAleFxuIiwgdmFsdWUpKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDhcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9SRUFEOCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSQUNGR19DTURfQkJQX1dSSVRFODoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0OworCQkJCVVDSEFSCXZhbHVlOworCisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSwgMSk7CisKKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICB2YWx1ZSk7CisJCQkJfQorCisJCQkJaWYgKChvZmZzZXQgPT0gQkJQX1IxKSB8fCAob2Zmc2V0ID09IEJCUF9SMykpCisJCQkJeworCQkJCQlTeW5jVHhSeENvbmZpZyhwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQkJQX1dSSVRFOFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1dSSVRFOCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGo7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgMTM3OyBqKyspCisJCQkJeworCQkJCQlwUmFDZmctPmRhdGFbal0gPSAwOworCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbal0pOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqXSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzEzNyk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9SRUFEX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQlpZiAob2Zmc2V0ICsgbGVuIDw9IEVFUFJPTV9TSVpFKQorCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopYnVmZmVyK29mZnNldCwgbGVuKTsKKwkJCWVsc2UKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJleGNlZWQgRUVQUk9NIHNpemVcbiIpKTsKKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCAoVUNIQVIgKilidWZmZXIgKyBvZmZzZXQsIChVQ0hBUiAqKXBSYUNmZy0+ZGF0YSArIDIsIGxlbik7CisJCQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLOgorCQl7CisJCQlVSU5UMzIgb2Zmc2V0LCBpLCB2YWx1ZTsKKwkJCVVTSE9SVCBsZW47CisKKwkJCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOworCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGErMiwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpCisJCQl7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopJnZhbHVlLCBwUmFDZmctPmRhdGErNCtpLCA0KTsKKwkJCQlwcmludGsoIldyaXRlICV4ICV4XG4iLCBvZmZzZXQgKyBpLCB2YWx1ZSk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCAob2Zmc2V0ICtpKSAmIDB4ZmZmZiwgdmFsdWUpOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQlwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0gPSAwOworCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJCX0KKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKwkJCVVDSEFSICp2YWx1ZTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7CisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKwkJfQorCQkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfUkFMSU5LX1JUMzA1MgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7CisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKwkJCVVDSEFSICp2YWx1ZTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZGFwdGVyLCBqLCAgKnZhbHVlKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisJCWNhc2UgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTDoKKwkJCXsKKwkJCQlVQ0hBUgljaGFubmVsOworCQkJCUlOVDMyICAgYnVmZmVyWzNdWzEwXTsvKiAzIDogUnhQYXRoIDsgMTAgOiBuby4gb2YgcGVyIHJzc2kgc2FtcGxlcyAqLworCisJCQkJY2hhbm5lbCA9IChudG9ocyhwUmFDZmctPnN0YXR1cykgJiAweDAwRkYpOworCQkJCUNhbE5vaXNlTGV2ZWwocEFkYXB0ZXIsIGNoYW5uZWwsIGJ1ZmZlcik7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKikmKGJ1ZmZlclswXVswXSksIChzaXplb2YoSU5UMzIpKjMqMTApKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIgKyAoc2l6ZW9mKElOVDMyKSozKjEwKSk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVI6CisJCQl7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVTJNLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkJlYWNvbiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLk90aGVyQ291bnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMxLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzIsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMywgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4SENDQSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4TWdtdCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kwLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Ml0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjAsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5TTlIxLCA0KTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMis2MCk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVI6CisJCQl7CisJCQkJcEFkYXB0ZXItPmF0ZS5VMk0gPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuT3RoZXJEYXRhID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLkJlYWNvbiA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5PdGhlckNvdW50ID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMwID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMxID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMyID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMzID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4SENDQSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeE1nbXQgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVDoKKwkJCXsKKwkJCQlVU0hPUlQgKnA7CisJCQkJVVNIT1JUCWVyciA9IDE7CisJCQkJVUNIQVIgICBCYnAyMlZhbHVlID0gMCwgQmJwMjRWYWx1ZSA9IDA7CisKKwkJCQlpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgKHBBZGFwdGVyLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXRlIFR4IGlzIGFscmVhZHkgcnVubmluZywgdG8gcnVuIG5leHQgVHgsIHlvdSBtdXN0IHN0b3AgaXQgZmlyc3RcbiIpKTsKKwkJCQkJZXJyID0gMjsKKwkJCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgIShwQWRhcHRlci0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCisJCQkJeworCQkJCQlpbnQgaSA9IDA7CisKKwkJCQkJd2hpbGUgKChpKysgPCAxMCkgJiYgKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkpCisJCQkJCXsKKwkJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJCX0KKworCQkJCQkvLyBmb3JjZSBpdCB0byBzdG9wCisJCQkJCXBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgPSAwOworCQkJCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJCQkJLy9wQWRhcHRlci0+YXRlLlJlcGVhdCA9IDA7CisJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCQkJCX0KKworCQkJCS8vIElmIHBSYUNmZy0+bGVuZ3RoID09IDAsIHRoaXMgIlJBQ0ZHX0NNRF9UWF9TVEFSVCIgaXMgZm9yIENhcnJpZXIgdGVzdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uLgorCQkJCWlmIChudG9ocyhwUmFDZmctPmxlbmd0aCkgIT0gMCkKKwkJCQl7CisJCQkJCS8vIEdldCBmcmFtZSBpbmZvCisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhXSSwgcFJhQ2ZnLT5kYXRhICsgMiwgMTYpOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpJnBBZGFwdGVyLT5hdGUuVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhDb3VudCwgcFJhQ2ZnLT5kYXRhICsgMTgsIDQpOworCQkJCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSBudG9obChwQWRhcHRlci0+YXRlLlR4Q291bnQpOworCisJCQkJCXAgPSAoVVNIT1JUICopKCZwUmFDZmctPmRhdGFbMjJdKTsKKwkJCQkJLy9wID0gcFJhQ2ZnLT5kYXRhICsgMjI7CisJCQkJCS8vIGFsd2F5cyB1c2UgUUlEX0FDX0JFCisJCQkJCXBBZGFwdGVyLT5hdGUuUUlEID0gMDsKKwkJCQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyNF0pOworCQkJCQkvL3AgPSBwUmFDZmctPmRhdGEgKyAyNDsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5ITGVuID0gbnRvaHMoKnApOworCisJCQkJCWlmIChwQWRhcHRlci0+YXRlLkhMZW4gPiAzMikKKwkJCQkJeworCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLkhMZW4gPiAzMlxuIikpOworCQkJCQkJZXJyID0gMzsKKwkJCQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7CisJCQkJCX0KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5IZWFkZXIsIHBSYUNmZy0+ZGF0YSArIDI2LCBwQWRhcHRlci0+YXRlLkhMZW4pOworCisKKwkJCQkJcEFkYXB0ZXItPmF0ZS5QTGVuID0gbnRvaHMocFJhQ2ZnLT5sZW5ndGgpIC0gKHBBZGFwdGVyLT5hdGUuSExlbiArIDI4KTsKKworCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5QTGVuID4gMzIpCisJCQkJCXsKKwkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEFkYXB0ZXItPmF0ZS5QTGVuID4gMzJcbiIpKTsKKwkJCQkJCWVyciA9IDQ7CisJCQkJCQlnb3RvIFRYX1NUQVJUX0VSUk9SOworCQkJCQl9CisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuUGF0dGVybiwgcFJhQ2ZnLT5kYXRhICsgMjYgKyBwQWRhcHRlci0+YXRlLkhMZW4sIHBBZGFwdGVyLT5hdGUuUExlbik7CisJCQkJCXBBZGFwdGVyLT5hdGUuRExlbiA9IHBBZGFwdGVyLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQgLSBwQWRhcHRlci0+YXRlLkhMZW47CisJCQkJfQorCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMjIsICZCYnAyMlZhbHVlKTsKKworCQkJCXN3aXRjaCAoQmJwMjJWYWx1ZSkKKwkJCQl7CisJCQkJCWNhc2UgQkJQMjJfVFhGUkFNRToKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5UeENvdW50ID09IDApCisJCQkJCQkJeworI2lmZGVmIFJUMjg2MAorCQkJCQkJCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSAweEZGRkZGRkZGOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCQkJCX0KKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYRlJBTUVcbiIpKTsKKwkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQOgorCQkJCQkJeworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQXG4iKSk7CisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIDI0LCAmQmJwMjRWYWx1ZSk7CisKKwkJCQkJCQlzd2l0Y2ggKEJicDI0VmFsdWUpCisJCQkJCQkJeworCQkJCQkJCQljYXNlIEJCUDI0X1RYQ09OVDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ09OVFxuIikpOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQljYXNlIEJCUDI0X0NBUlJTVVBQOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDQVJSU1VQUFxuIikpOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlJTVVBQOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCQlAyMl9UWENBUlI6CisJCQkJCQl7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENBUlJcbiIpKTsKKwkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCSAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSB3YXMgZmFpbGVkIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUXG4iKSk7CisJICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworCSAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKwkJCQkJeworCSAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1RYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworVFhfU1RBUlRfRVJST1I6CisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucyhlcnIpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmZWVkYmFjayBvZiBUWF9TVEFSVF9FUlJPUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTOgorCQkJeworCQkJCVVJTlQzMiBjb3VudDsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDYpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJY291bnQgPSBodG9ubChwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50KTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwUmFDZmctPmRhdGEsICZjb3VudCwgNCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfVFhfU1RPUDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9UWF9TVE9QXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWFNUT1AiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUT1BcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1RYX1NUT1AgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUlhfU1RBUlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKworCQkJCXBBZGFwdGVyLT5hdGUuYlFBUnhTdGFydCA9IFRSVUU7CisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1JYX1NUT1A6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RPUFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhTVE9QIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SWF9TVE9QXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVE9QIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCS8qIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGZvciBuZXcgQVRFIEdVSShub3QgUUEpLiAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVI6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVJcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0JXOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9CV1xuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKworCQkJCVNldF9BVEVfVFhfQldfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQldcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQlcgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjA6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjBcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDU1xuIikpOworCisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzE2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCwgNCk7CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJCQl7CisJCQkJCUlOVDMyIFJTU0kwID0gMDsKKwkJCQkJSU5UMzIgUlNTSTEgPSAwOworCQkJCQlJTlQzMiBSU1NJMiA9IDA7CisKKwkJCQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJUlNTSTEgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kxIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJUlNTSTIgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kyIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmUlNTSTEsIDQpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ4XSwgKFVDSEFSICopJlJTU0kyLCA0KTsKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzUyKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSU5UMzIgUlNTSTAgPSAwOworCisJCQkJCVJTU0kwID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDBdLCAoVUNIQVIgKikmUlNTSTAsIDQpOworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrNDQpOworCQkJCX0KKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1NcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUjoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDE7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSXG4iKSk7CisKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTDoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjE6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOworCisJCQkJLy8gQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKKwkJCQkvLyBzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCisJCQkJbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjEsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMSBpcyBkb25lICFcbiAoQUREUjEgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZGFwdGVyLT5hdGUuQWRkcjFbMF0sCisJCQkJCQlwQWRhcHRlci0+YXRlLkFkZHIxWzFdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzJdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzNdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzRdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMjoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7CisKKwkJCQkvLyBBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAorCQkJCS8vIHNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KKwkJCQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMiwgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyIGlzIGRvbmUgIVxuIChBRERSMiA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkYXB0ZXItPmF0ZS5BZGRyMlswXSwKKwkJCQkJCXBBZGFwdGVyLT5hdGUuQWRkcjJbMV0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbMl0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbM10sIHBBZGFwdGVyLT5hdGUuQWRkcjJbNF0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKKworCQkJCS8vIEFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCisJCQkJLy8gc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgorCQkJCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIzLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjMgaXMgZG9uZSAhXG4gKEFERFIzID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWRhcHRlci0+YXRlLkFkZHIzWzBdLAorCQkJCQkJcEFkYXB0ZXItPmF0ZS5BZGRyM1sxXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1syXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1szXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1s0XSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1s1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUkFURToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUkFURVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX01DU19Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU46CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTlxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQ6CisJCQl7CisJCQkJVVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKyNpZmRlZiBSVDI4NjAKKwkJCQkvKiBUWF9GUkFNRV9DT1VOVCA9PSAwIG1lYW5zIHR4IGluZmluaXRlbHkgKi8KKwkJCQlpZiAodmFsdWUgPT0gMCkKKwkJCQl7CisJCQkJCS8qIFVzZSBUeENvdW50ID0gMHhGRkZGRkZGRiB0byBhcHByb3hpbWF0ZSB0aGUgaW5maW5pdHkuICovCisJCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IDB4RkZGRkZGRkY7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQ09VTlRfUHJvYyAoVHhDb3VudCA9ICVkKVxuIiwgcEFkYXB0ZXItPmF0ZS5UeENvdW50KSk7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9DT1VOVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQl7CisJCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2MocEFkYXB0ZXIsIHN0cik7CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUU6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKyAgICBBU1NFUlQocFJhQ2ZnICE9IE5VTEwpOworICAgIGlmIChwUmFDZmcgIT0gTlVMTCkKKyAgICB7CisgICAga2ZyZWUocFJhQ2ZnKTsKKyAgICB9CisJcmV0dXJuOworfQorCitWT0lEIEJ1YmJsZVNvcnQoSU5UMzIgbiwgSU5UMzIgYVtdKQoreworCUlOVDMyIGssIGosIHRlbXA7CisKKwlmb3IgKGsgPSBuLTE7ICBrPjA7ICBrLS0pCisJeworCQlmb3IgKGogPSAwOyBqPGs7IGorKykKKwkJeworCQkJaWYoYVtqXSA+IGFbaisxXSkKKwkJCXsKKwkJCQl0ZW1wID0gYVtqXTsKKwkJCQlhW2pdPWFbaisxXTsKKwkJCQlhW2orMV09dGVtcDsKKwkJCX0KKwkJfQorCX0KK30KKworVk9JRCBDYWxOb2lzZUxldmVsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiBjaGFubmVsLCBJTlQzMiBSU1NJWzNdWzEwXSkKK3sKKwlJTlQzMgkJUlNTSTAsIFJTU0kxLCBSU1NJMjsKKyAJQ0hBUgkJUnNzaTBPZmZzZXQsIFJzc2kxT2Zmc2V0LCBSc3NpMk9mZnNldDsKKwlVQ0hBUgkJQmJwUjUwUnNzaTAgPSAwLCBCYnBSNTFSc3NpMSA9IDAsIEJicFI1MlJzc2kyID0gMDsKKwlVQ0hBUgkJT3JnX0JCUDY2dmFsdWUgPSAwLCBPcmdfQkJQNjl2YWx1ZSA9IDAsIE9yZ19CQlA3MHZhbHVlID0gMCwgZGF0YSA9IDA7CisJVVNIT1JUCQlMTkFfR2FpbiA9IDA7CisJSU5UMzIgICAgICAgaiA9IDA7CisJVUNIQVIJCU9yZ19DaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKKwlVU0hPUlQJICAgIEdhaW5WYWx1ZSA9IDAsIE9mZnNldFZhbHVlID0gMDsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yZ19CQlA2NnZhbHVlKTsKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksICZPcmdfQkJQNjl2YWx1ZSk7CisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAmT3JnX0JCUDcwdmFsdWUpOworCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gUmVhZCB0aGUgdmFsdWUgb2YgTE5BIGdhaW4gYW5kIFJzc2kgb2Zmc2V0CisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTE5BX09GRlNFVCwgR2FpblZhbHVlKTsKKworCS8vIGZvciBOb2lzZSBMZXZlbAorCWlmIChjaGFubmVsIDw9IDE0KQorCXsKKwkJTE5BX0dhaW4gPSBHYWluVmFsdWUgJiAweDAwRkY7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIE9mZnNldFZhbHVlKTsKKwkJUnNzaTBPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwkJUnNzaTFPZmZzZXQgPSAoT2Zmc2V0VmFsdWUgJiAweEZGMDApID4+IDg7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0JHX09GRlNFVCArIDIpLyogMHg0OCAqLywgT2Zmc2V0VmFsdWUpOworCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCX0KKwllbHNlCisJeworCQlMTkFfR2FpbiA9IChHYWluVmFsdWUgJiAweEZGMDApID4+IDg7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgT2Zmc2V0VmFsdWUpOworCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQgKyAyKS8qIDB4NEMgKi8sIE9mZnNldFZhbHVlKTsKKwkJUnNzaTJPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwl9CisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJeworCQlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKKwkJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKwkJbWRlbGF5KDUpOworCisJCWRhdGEgPSAweDEwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBkYXRhKTsKKwkJZGF0YSA9IDB4NDA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIGRhdGEpOworCQlkYXRhID0gMHg0MDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgZGF0YSk7CisJCW1kZWxheSg1KTsKKworCQkvLyBTdGFydCBSeAorCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKKwkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYRlJBTUUiKTsKKworCQltZGVsYXkoNSk7CisKKwkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCisJCXsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MCwgJkJicFI1MFJzc2kwKTsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MSwgJkJicFI1MVJzc2kxKTsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MiwgJkJicFI1MlJzc2kyKTsKKworCQkJbWRlbGF5KDEwKTsKKworCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMAorCQkJaWYgKEJicFI1MFJzc2kwID09IDApCisJCQl7CisJCQkJUlNTSTAgPSAtMTAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJTU0kwID0gKElOVDMyKSgtMTIgLSBCYnBSNTBSc3NpMCAtIExOQV9HYWluIC0gUnNzaTBPZmZzZXQpOworCQkJfQorCQkJUlNTSVswXVtqXSA9IFJTU0kwOworCisJCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMQorCQkJCWlmIChCYnBSNTFSc3NpMSA9PSAwKQorCQkJCXsKKwkJCQkJUlNTSTEgPSAtMTAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSU1NJMSA9IChJTlQzMikoLTEyIC0gQmJwUjUxUnNzaTEgLSBMTkFfR2FpbiAtIFJzc2kxT2Zmc2V0KTsKKwkJCQl9CisJCQkJUlNTSVsxXVtqXSA9IFJTU0kxOworCQkJfQorCisJCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMgorCQkJCWlmIChCYnBSNTJSc3NpMiA9PSAwKQorCQkJCQlSU1NJMiA9IC0xMDA7CisJCQkJZWxzZQorCQkJCQlSU1NJMiA9IChJTlQzMikoLTEyIC0gQmJwUjUyUnNzaTIgLSBMTkFfR2FpbiAtIFJzc2kyT2Zmc2V0KTsKKworCQkJCVJTU0lbMl1bal0gPSBSU1NJMjsKKwkJCX0KKwkJfQorCisJCS8vIFN0b3AgUngKKwkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpOworCisJCW1kZWxheSg1KTsKKworI2lmIDAvLyBEZWJ1ZyBNZXNzYWdlLi4uLi4uLi4uLi4uLi4uLgorCQlhdGVfcHJpbnQoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCWF0ZV9wcmludCgiTm9pc2UgTGV2ZWw6IENoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCQlhdGVfcHJpbnQoIlJTU0kwID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQlSU1NJWzBdWzBdLCBSU1NJWzBdWzFdLCBSU1NJWzBdWzJdLAorCQkJUlNTSVswXVszXSwgUlNTSVswXVs0XSwgUlNTSVswXVs1XSwKKwkJCVJTU0lbMF1bNl0sIFJTU0lbMF1bN10sIFJTU0lbMF1bOF0sCisJCQlSU1NJWzBdWzldKTsKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kxID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsxXVswXSwgUlNTSVsxXVsxXSwgUlNTSVsxXVsyXSwKKwkJCQlSU1NJWzFdWzNdLCBSU1NJWzFdWzRdLCBSU1NJWzFdWzVdLAorCQkJCVJTU0lbMV1bNl0sIFJTU0lbMV1bN10sIFJTU0lbMV1bOF0sCisJCQkJUlNTSVsxXVs5XSk7CisJCX0KKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kyID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsyXVswXSwgUlNTSVsyXVsxXSwgUlNTSVsyXVsyXSwKKwkJCQlSU1NJWzJdWzNdLCBSU1NJWzJdWzRdLCBSU1NJWzJdWzVdLAorCQkJCVJTU0lbMl1bNl0sIFJTU0lbMl1bN10sIFJTU0lbMl1bOF0sCisJCQkJUlNTSVsyXVs5XSk7CisJCX0KKyNlbmRpZiAvLyAwIC8vCisJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMF0pOwkvLyAxUgorCisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJeworCQkJQnViYmxlU29ydCgxMCwgUlNTSVsxXSk7CisJCX0KKworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMl0pOworCQl9CisKKyNpZiAwLy8gRGVidWcgTWVzc2FnZS4uLi4uLi4uLi4uLi4uLi4KKwkJYXRlX3ByaW50KCJcbkFmdGVyIFNvcnRpbmcuLi4uQ2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCWF0ZV9wcmludCgiUlNTSTAgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCVJTU0lbMF1bMF0sIFJTU0lbMF1bMV0sIFJTU0lbMF1bMl0sCisJCQlSU1NJWzBdWzNdLCBSU1NJWzBdWzRdLCBSU1NJWzBdWzVdLAorCQkJUlNTSVswXVs2XSwgUlNTSVswXVs3XSwgUlNTSVswXVs4XSwKKwkJCVJTU0lbMF1bOV0pOworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTEgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzFdWzBdLCBSU1NJWzFdWzFdLCBSU1NJWzFdWzJdLAorCQkJCVJTU0lbMV1bM10sIFJTU0lbMV1bNF0sIFJTU0lbMV1bNV0sCisJCQkJUlNTSVsxXVs2XSwgUlNTSVsxXVs3XSwgUlNTSVsxXVs4XSwKKwkJCQlSU1NJWzFdWzldKTsKKwkJfQorCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTIgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzJdWzBdLCBSU1NJWzJdWzFdLCBSU1NJWzJdWzJdLAorCQkJCVJTU0lbMl1bM10sIFJTU0lbMl1bNF0sIFJTU0lbMl1bNV0sCisJCQkJUlNTSVsyXVs2XSwgUlNTSVsyXVs3XSwgUlNTSVsyXVs4XSwKKwkJCQlSU1NJWzJdWzldKTsKKwkJfQorCQlhdGVfcHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworI2VuZGlmIC8vIDAgLy8KKwl9CisKKwlwQWQtPmF0ZS5DaGFubmVsID0gT3JnX0NoYW5uZWw7CisJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKworCS8vIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUKKyAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBPcmdfQkJQNjZ2YWx1ZSk7CisgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgT3JnX0JCUDY5dmFsdWUpOworICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIE9yZ19CQlA3MHZhbHVlKTsKKworCXJldHVybjsKK30KKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZyhQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUIG9mZnNldCwgVUNIQVIgdmFsdWUpCit7CisJVUNIQVIgdG1wID0gMCwgYmJwX2RhdGEgPSAwOworCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICZiYnBfZGF0YSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgJmJicF9kYXRhKTsKKwl9CisKKwkvKiBjb25maXJtIGFnYWluICovCisJQVNTRVJUKGJicF9kYXRhID09IHZhbHVlKTsKKworCXN3aXRjaChvZmZzZXQpCisJeworCQljYXNlIEJCUF9SMToKKwkJCS8qIE5lZWQgdG8gc3luYy4gdHggY29uZmlndXJhdGlvbiB3aXRoIGxlZ2FjeSBBVEUuICovCisJCQl0bXAgPSAoYmJwX2RhdGEgJiAoKDEgPDwgNCkgfCAoMSA8PCAzKSkvKiAweDE4ICovKSA+PiAzOworCQkgICAgc3dpdGNoKHRtcCkKKwkJICAgIHsKKwkJCQkvKiBUaGUgQkJQIFIxIGJpdFs0OjNdID0gMiA6OiBCb3RoIERBQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMjoKKwkJCQkJLyogQWxsICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDA7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAwIDo6IERBQyAwIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDA6CisJCQkJCS8qIEFudGVubmEgb25lICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDE7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAxIDo6IERBQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDE6CisJCQkJCS8qIEFudGVubmEgdHdvICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDI7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgIGRlZmF1bHQ6CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCQkgICAgfQorCQkJYnJlYWs7LyogY2FzZSBCQlBfUjEgKi8KKworCQljYXNlIEJCUF9SMzoKKwkJCS8qIE5lZWQgdG8gc3luYy4gcnggY29uZmlndXJhdGlvbiB3aXRoIGxlZ2FjeSBBVEUuICovCisJCQl0bXAgPSAoYmJwX2RhdGEgJiAoKDEgPDwgMSkgfCAoMSA8PCAwKSkvKiAweDAzICovKTsKKwkJICAgIHN3aXRjaCh0bXApCisJCSAgICB7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDMgOjogQWxsIEFEQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMzoKKwkJCQkJLyogQWxsICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDA7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAwIDo6IEFEQyAwIHdpbGwgYmUgdXNlZCBieSBRQSwgKi8KKwkJCQkvKiB1bmxlc3MgdGhlIEJCUCBSMyBiaXRbNDozXSA9IDIgKi8KKwkJICAgICAgICBjYXNlIDA6CisJCQkJCS8qIEFudGVubmEgb25lICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDE7CisJCQkJCXRtcCA9ICgoYmJwX2RhdGEgJiAoKDEgPDwgNCkgfCAoMSA8PCAzKSkvKiAweDAzICovKSA+PiAzKTsKKwkJCQkJaWYgKHRtcCA9PSAyKS8vIDNSCisJCQkJCXsKKwkJCQkJCS8qIERlZmF1bHQgOiBBbGwgQURDcyB3aWxsIGJlIHVzZWQgYnkgUUEgKi8KKwkJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDA7CisJCQkJCX0KKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDEgOjogQURDIDEgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMToKKwkJCQkJLyogQW50ZW5uYSB0d28gKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMjsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDIgOjogQURDIDIgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMjoKKwkJCQkJLyogQW50ZW5uYSB0aHJlZSAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAzOworCQkgICAgICAgICAgICBicmVhazsKKwkJICAgICAgICBkZWZhdWx0OgorCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBJbXBvc3NpYmxlISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisJCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwkJICAgIH0KKwkJCWJyZWFrOy8qIGNhc2UgQkJQX1IzICovCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIFZPSUQgbWVtY3B5X2V4bChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKQoreworCVVMT05HIGksIFZhbHVlID0gMDsKKwlVTE9ORyAqcERzdCwgKnBTcmM7CisJVUNIQVIgKnA4OworCisJcDggPSBzcmM7CisJcERzdCA9IChVTE9ORyAqKSBkc3Q7CisJcFNyYyA9IChVTE9ORyAqKSBzcmM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IChsZW4vNCk7IGkrKykKKwl7CisJCS8qIEZvciBhbGlnbm1lbnQgaXNzdWUsIHdlIG5lZWQgYSB2YXJpYWJsZSAiVmFsdWUiLiAqLworCQltZW1tb3ZlKCZWYWx1ZSwgcFNyYywgNCk7CisJCVZhbHVlID0gaHRvbmwoVmFsdWUpOworCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgNCk7CisJCXBEc3QrKzsKKwkJcFNyYysrOworCX0KKwlpZiAoKGxlbiAlIDQpICE9IDApCisJeworCQkvKiB3aXNoIHRoYXQgaXQgd2lsbCBuZXZlciByZWFjaCBoZXJlICovCisJCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCAobGVuICUgNCkpOworCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKKwkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIChsZW4gJSA0KSk7CisJfQorfQorCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCit7CisJVUxPTkcgaTsKKwlVQ0hBUiAqcERzdCwgKnBTcmM7CisKKwlwRHN0ID0gZHN0OworCXBTcmMgPSBzcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbi8yKTsgaSsrKQorCXsKKwkJbWVtbW92ZShwRHN0LCBwU3JjLCAyKTsKKwkJKigoVVNIT1JUICopcERzdCkgPSBodG9ucygqKChVU0hPUlQgKilwRHN0KSk7CisJCXBEc3QrPTI7CisJCXBTcmMrPTI7CisJfQorCisJaWYgKChsZW4gJSAyKSAhPSAwKQorCXsKKwkJbWVtbW92ZShwRHN0LCBwU3JjLCAxKTsKKwl9Cit9CisKK3N0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKQoreworCVVJTlQzMiBpLCBWYWx1ZTsKKwlVSU5UMzIgKnBEc3QsICpwU3JjOworCisJcERzdCA9IChVSU5UMzIgKikgZHN0OworCXBTcmMgPSAoVUlOVDMyICopIHNyYzsKKworCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCAoVUxPTkcpcFNyYywgJlZhbHVlKTsKKwkJVmFsdWUgPSBodG9ubChWYWx1ZSk7CisJCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKKwkJcERzdCsrOworCQlwU3JjKys7CisJfQorCXJldHVybjsKK30KKworLy8gVE9ETzoKKyNpZiAwCisvKiBUaGVzZSB3b3JrIG9ubHkgd2hlbiBSQUxJTktfQVRFIGlzIGRlZmluZWQgKi8KK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJVUNIQVIgYnVmZmVyWzI2XSA9IHsweDg4LCAweDAyLCAweDJjLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDAwLCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweGMwLCAweDIyLCAweDAwLCAweDAwfTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlpZiAocEFkLT5hdGUuVHhTdGF0dXMgIT0gMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcEFkLT5hdGUuVHhJbmZvID0gMHgwNDAwMDAwMDsKKwliemVybygmcEFkLT5hdGUuVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSAwOy8vIE1PREVfQ0NLCisJcEFkLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQgPSAxMjI2OworCXBBZC0+YXRlLlR4V0kuTUNTID0gMzsKKwkvL3BBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7CisJcEFkLT5hdGUuTW9kZSB8PSBBVEVfVFhGUkFNRTsKKwlwQWQtPmF0ZS5UeENvdW50ID0gdmFsdWU7CisJcEFkLT5hdGUuUUlEID0gMDsKKwlwQWQtPmF0ZS5ITGVuID0gMjY7CisJcEFkLT5hdGUuUExlbiA9IDA7CisJcEFkLT5hdGUuRExlbiA9IDEyMDA7CisJbWVtY3B5KHBBZC0+YXRlLkhlYWRlciwgYnVmZmVyLCAyNik7CisJcEFkLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJLy9wT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCS8vdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+QXRlVHhUYXNrKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLyogZW5kIG9mICNpZiAwICovCisKK0lOVCBTZXRfVHhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0X1R4U3RvcF9Qcm9jXG4iKSk7CisKKwlpZiAoU2V0X0FURV9Qcm9jKHBBZCwgIlRYU1RPUCIpKQorCXsKKwlyZXR1cm4gVFJVRTsKK30KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldF9SeFN0b3BfUHJvY1xuIikpOworCisJaWYgKFNldF9BVEVfUHJvYyhwQWQsICJSWFNUT1AiKSkKKwl7CisJcmV0dXJuIFRSVUU7Cit9CisJZWxzZQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworI2lmIDAKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgb2Zmc2V0ID0gMCwgdmFsdWU7CisJUFVDSEFSIHAyID0gYXJnOworCisJd2hpbGUoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCisJeworCQlwMisrOworCX0KKworCWlmICgqcDIgPT0gJzonKQorCXsKKwkJQTJIZXgob2Zmc2V0LCBhcmcpOworCQlBMkhleCh2YWx1ZSwgcDIrIDEpOworCX0KKwllbHNlCisJeworCQlBMkhleCh2YWx1ZSwgYXJnKTsKKwl9CisKKwlpZiAob2Zmc2V0ID49IEVFUFJPTV9TSVpFKQorCXsKKwkJYXRlX3ByaW50KCJPZmZzZXQgY2FuIG5vdCBleGNlZWQgRUVQUk9NX1NJWkUoID09IDB4JTA0eClcbiIsIEVFUFJPTV9TSVpFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCVJUTVBfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhbHVlKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0JCUFJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgdmFsdWUgPSAwLCBvZmZzZXQ7CisKKwlBMkhleChvZmZzZXQsIGFyZyk7CisKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgICZ2YWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgICZ2YWx1ZSk7CisJfQorCisJYXRlX3ByaW50KCIleFxuIiwgdmFsdWUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UIFNldF9CQlBXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgb2Zmc2V0ID0gMDsKKwlQVUNIQVIgcDIgPSBhcmc7CisJVUNIQVIgdmFsdWU7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiA9PSAnOicpCisJeworCQlBMkhleChvZmZzZXQsIGFyZyk7CisJCUEySGV4KHZhbHVlLCBwMisgMSk7CisJfQorCWVsc2UKKwl7CisJCUEySGV4KHZhbHVlLCBhcmcpOworCX0KKworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgIHZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlROUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9SRldyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVBVQ0hBUiBwMiwgcDMsIHA0OworCVVMT05HIFIxLCBSMiwgUjMsIFI0OworCisJcDIgPSBhcmc7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiAhPSAnOicpCisJCXJldHVybiBGQUxTRTsKKworCXAzID0gcDIgKyAxOworCisJd2hpbGUoKCpwMyAhPSAnOicpICYmICgqcDMgIT0gJ1wwJykpCisJeworCQlwMysrOworCX0KKworCWlmICgqcDMgIT0gJzonKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwNCA9IHAzICsgMTsKKworCXdoaWxlKCgqcDQgIT0gJzonKSAmJiAoKnA0ICE9ICdcMCcpKQorCXsKKwkJcDQrKzsKKwl9CisKKwlpZiAoKnA0ICE9ICc6JykKKwkJcmV0dXJuIEZBTFNFOworCisKKwlBMkhleChSMSwgYXJnKTsKKwlBMkhleChSMiwgcDIgKyAxKTsKKwlBMkhleChSMywgcDMgKyAxKTsKKwlBMkhleChSNCwgcDQgKyAxKTsKKworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFI0KTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmICAvLyBlbmQgb2YgI2lmIDAgLy8KKyNlbmRpZgkvLyBSQUxJTktfMjh4eF9RQSAvLworCisjZW5kaWYJLy8gUkFMSU5LX0FURSAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2F0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFhNzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuaApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX0FURV9IX18KKyNkZWZpbmUgX19BVEVfSF9fCisKKyNpZm5kZWYgVUNPUworI2RlZmluZSBhdGVfcHJpbnQgcHJpbnRrCisjZGVmaW5lIEFURURCR1BSSU5UIERCR1BSSU5UCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBFRVBST01fQklOX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL2UycC5iaW4iCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNlbHNlIC8vICFVQ09TIC8vCisjZGVmaW5lIGZBVEVfTE9BRF9FRVBST00JCQkJCQkweDBDNDMKKyNpZmRlZiBDT05GSUdfUFJJTlRLCitleHRlcm4gSU5UIENvbnNvbGVSZXNwb25zZShJTiBQVUNIQVIgYnVmZik7CitleHRlcm4gaW50ICgqcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKik7CitleHRlcm4gdm9pZCBwdXRzIChjb25zdCBjaGFyICpzKTsKKworLyogc3BlY2lmaWNseSBkZWZpbmVkIHRvIHJlZGlyZWN0IGFuZCBzaG93IGF0ZS1yZWxhdGVkIG1lc3NhZ2VzIHRvIGhvc3QuICovCisvKiBUcnkgdG8gZGVmaW5lIGF0ZV9wcmludCBhcyBhIG1hY3JvLiAqLworI2RlZmluZSBhdGVfcHJpbnQoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgXAorZG97ICAgaW50ICgqb3JnX3JlbW90ZV9kaXNwbGF5KShjaGFyICopID0gTlVMTDsgICBcCisJb3JnX3JlbW90ZV9kaXNwbGF5ID0gcmVtb3RlX2Rpc3BsYXk7XAorCS8qIFNhdmUgb3JpZ2luYWwgInJlbW90ZV9kaXNwbGF5IiAqL1wKKwlyZW1vdGVfZGlzcGxheSA9IChpbnQgKCopKGNoYXIgKikpQ29uc29sZVJlc3BvbnNlOyAgICAgICAgICAgXAorCXByaW50ayhmbXQsICMjIGFyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgXAorCS8qIFJlc3RvcmUgdGhlIHJlbW90ZV9kaXNwbGF5IGZ1bmN0aW9uIHBvaW50ZXIgKi8gICAgICAgIFwKKwlyZW1vdGVfZGlzcGxheSA9IG9yZ19yZW1vdGVfZGlzcGxheTsgfXdoaWxlKDApCisKKyNkZWZpbmUgQVRFREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgCVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKExldmVsKSA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdGVfcHJpbnQgRm10OwkJCQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIENPTkZJR19QUklOVEsgLy8KKyNlbmRpZiAvLyAhVUNPUyAvLworCisjZGVmaW5lIEFURV9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+YXRlLk1vZGUpICE9IEFURV9TVE9QKQorCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSAiUlQyODYwIi4gKi8KKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7IFwKKyAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQkJQIHJlYWQgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICAgXAorICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX0kpKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSBSVDI4NjAuICovCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorLyogaU5JQyBoYXMgaXRzIG93biBFRVBST01fQklOX0ZJTEVfTkFNRSAqLworI2lmbmRlZiBVQ09TCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEVFUFJPTV9CSU5fRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvZTJwLmJpbiIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyAhVUNPUyAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworVk9JRCBydF9lZV9yZWFkX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgVVNIT1JUICpEYXRhKTsKKworCitWT0lEIHJ0X2VlX3dyaXRlX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUICpEYXRhKTsKKworSU5UIFNldF9BVEVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9EQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1NBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfQlNTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1JYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQldfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9TaG93X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK1ZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJcFJ4V0ksCisJSU4gUFJUMjhYWF9SWERfU1RSVUMgICAgcDI4eHhSeEQsCisJSU4gUEhFQURFUl84MDJfMTEJCXBIZWFkZXIpOworCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBCdWJibGVTb3J0KAorCUlOICBJTlQzMiBuLAorCUlOICBJTlQzMiBhW10pOworCitWT0lEIENhbE5vaXNlTGV2ZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKwlJTiAgVUNIQVIgICAgICAgICAgIGNoYW5uZWwsCisJT1VUIElOVDMyICAgICAgICAgICBidWZmZXJbM11bMTBdKTsKKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVVTSE9SVAkJCW9mZnNldCwKKwlJTglVQ0hBUgkJCXZhbHVlKTsKKworI2lmIDAKK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgIC8vIDAgLy8KKworSU5UIFNldF9UeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZiAwCitJTlQgU2V0X0VFUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1JGV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIGVuZCBvZiAjaWYgMCAvLworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCk7CisKK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gQ0hBUgkJCQlSc3NpLAorCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOworCitWT0lEIEFURVNhbXBsZVJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBTdGF0aW9uU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFN0YXRpb25TdGFydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gX19BVEVfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU3YTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydF9jb25maWcuaAorCisJQWJzdHJhY3Q6CisJQ2VudHJhbCBoZWFkZXIgZmlsZSB0byBtYWludGFpbiBhbGwgaW5jbHVkZSBmaWxlcyBmb3IgYWxsIE5ESVMKKwltaW5pcG9ydCBkcml2ZXIgcm91dGluZXMuCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorCisqLworI2lmbmRlZglfX1JUX0NPTkZJR19IX18KKyNkZWZpbmUJX19SVF9DT05GSUdfSF9fCisKKyNpbmNsdWRlICAgICJydG1wX3R5cGUuaCIKKyNpZmRlZiBVQ09TCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgCSJydF91Y29zLmgiCisjZW5kaWYKKworI2lmZGVmIExJTlVYCisjaW5jbHVkZQkicnRfbGludXguaCIKKyNlbmRpZgorI2luY2x1ZGUgICAgInJ0bXBfZGVmLmgiCisjaW5jbHVkZSAgICAicnQyOHh4LmgiCisKKyNpZmRlZiBSVDI4NjAKKyNpbmNsdWRlCSJydDI4NjAuaCIKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaW5jbHVkZSAgICAib2lkLmgiCisjaW5jbHVkZSAgICAibWxtZS5oIgorI2luY2x1ZGUgICAgIndwYS5oIgorI2luY2x1ZGUgICAgIm1kNS5oIgorI2luY2x1ZGUgICAgInJ0bXAuaCIKKyNpbmNsdWRlCSJhcC5oIgorI2luY2x1ZGUJImRmcy5oIgorI2luY2x1ZGUJImNobGlzdC5oIgorI2luY2x1ZGUJInNwZWN0cnVtLmgiCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyNpbmNsdWRlICAgICJsZWFwLmgiCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCisjaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgorI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorI2luY2x1ZGUgInJ0X2F0ZS5oIgorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNlcnJvciAiQnVpbGQgZm9yIGJlaW5nIGNvbnRyb2xsZWQgYnkgTmV0d29ya01hbmFnZXIgb3Igd2V4dCwgcGxlYXNlIHNldCBIQVNfV1BBX1NVUFBMSUNBTlQ9eSBhbmQgSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPXkiCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIElLQU5PU19WWF8xWDAKKyNpbmNsdWRlCSJ2cl9pa2Fucy5oIgorI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworI2VuZGlmCS8vIF9fUlRfQ09ORklHX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0YzE3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKQEAgLTAsMCArMSwxMDU0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKK1VMT05HCVJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOworCitCVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorQlVJTERfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oRGlzYXNzb2NUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CisjaWZkZWYgTEVBUF9TVVBQT1JUCitCVUlMRF9USU1FUl9GVU5DVElPTihMZWFwQXV0aFRpbWVvdXQpOworI2VuZGlmCitCVUlMRF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKKyNpZmRlZiBSVDI4NjAKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyBmb3Igd2lyZWxlc3Mgc3lzdGVtIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc1N5c0V2ZW50VGV4dFtJV19TWVNfRVZFTlRfVFlQRV9OVU1dID0geworCS8vIHN5c3RlbSBzdGF0dXMgZXZlbnQKKyAgICAiaGFkIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5IiwJCQkJCQkJLyogSVdfQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJoYWQgZGlzYXNzb2NpYXRlZCIsCQkJCQkJCQkJLyogSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJoYWQgZGVhdXRoZW50aWNhdGVkIiwJCQkJCQkJCQkvKiBJV19ERUFVVEhfRVZFTlRfRkxBRyAqLworICAgICJoYWQgYmVlbiBhZ2VkLW91dCBhbmQgZGlzYXNzb2NpYXRlZCIsCQkJCQkvKiBJV19BR0VPVVRfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBDb3VudGVyTWVhc3VyZXMgYXR0YWNrIiwJCQkJCQkvKiBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgcmVwbGF5IGNvdW50ZXIgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCS8qIElXX1JFUExBWV9DT1VOVEVSX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBSU05JRSBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJCQkvKiBJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgTUlDIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX01JQ19ESUZGX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgSUNWIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIE1JQyBlcnJvciBpbiBSWCIsCQkJCQkJCQkvKiBJV19NSUNfRVJST1JfRVZFTlRfRkxBRyAqLworCSJHcm91cCBLZXkgSGFuZHNoYWtpbmcgdGltZW91dCIsCQkJCQkJLyogSVdfR1JPVVBfSFNfVElNRU9VVF9FVkVOVF9GTEFHICovCisJIlBhaXJ3aXNlIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19QQUlSV0lTRV9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUlNOIElFIHNhbml0eSBjaGVjayBmYWlsdXJlIiwJCQkJCQkJLyogSVdfUlNOSUVfU0FOSVRZX0ZBSUxfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBL1dQQVBTSyIsCQkJCQkJCS8qIElXX1NFVF9LRVlfRE9ORV9XUEExX0VWRU5UX0ZMQUcgKi8KKwkic2V0IGtleSBkb25lIGluIFdQQTIvV1BBMlBTSyIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcgKi8KKwkiY29ubmVjdHMgd2l0aCBvdXIgd2lyZWxlc3MgY2xpZW50IiwgICAgICAgICAgICAgICAgICAgIC8qIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRyAqLworCSJkaXNjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcgKi8KKwkic2NhbiBjb21wbGV0ZWQiCQkJCQkJCQkJCS8qIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcgKi8KKwkic2NhbiB0ZXJtaW5hdGUhISBCdXN5ISEgRW5xdWV1ZSBmYWlsISEiCQkJCS8qIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcgKi8KKwl9OworCisvLyBmb3Igd2lyZWxlc3MgSURTX3Nwb29mX2F0dGFjayBldmVudCBtZXNzYWdlCitjaGFyIGNvbnN0ICpwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtJV19TUE9PRl9FVkVOVF9UWVBFX05VTV0gPSB7CisgICAgImRldGVjdGVkIGNvbmZsaWN0IFNTSUQiLAkJCQkJCQkJLyogSVdfQ09ORkxJQ1RfU1NJRF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgYXNzb2NpYXRpb24gcmVzcG9uc2UiLAkJCQkvKiBJV19TUE9PRl9BU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCByZWFzc29jaWF0aW9uIHJlc3BvbnNlcyIsCQkJCS8qIElXX1NQT09GX1JFQVNTT0NfUkVTUF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgcHJvYmUgcmVzcG9uc2UiLAkJCQkJCS8qIElXX1NQT09GX1BST0JFX1JFU1BfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIGJlYWNvbiIsCQkJCQkJCQkvKiBJV19TUE9PRl9CRUFDT05fRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIGRpc2Fzc29jaWF0aW9uIiwJCQkJCQkvKiBJV19TUE9PRl9ESVNBU1NPQ19FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgYXV0aGVudGljYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIGRlYXV0aGVudGljYXRpb24iLAkJCQkJLyogSVdfU1BPT0ZfREVBVVRIX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCB1bmtub3duIG1hbmFnZW1lbnQgZnJhbWUiLAkJCS8qIElXX1NQT09GX1VOS05PV05fTUdNVF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHJlcGxheSBhdHRhY2siCQkJCQkJCQkvKiBJV19SRVBMQVlfQVRUQUNLX0VWRU5UX0ZMQUcgKi8KKwl9OworCisvLyBmb3Igd2lyZWxlc3MgSURTX2Zsb29kaW5nX2F0dGFjayBldmVudCBtZXNzYWdlCitjaGFyIGNvbnN0ICpwV2lyZWxlc3NGbG9vZEV2ZW50VGV4dFtJV19GTE9PRF9FVkVOVF9UWVBFX05VTV0gPSB7CisJImRldGVjdGVkIGF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgYXNzb2NpYXRpb24gcmVxdWVzdCBmbG9vZGluZyIsCQkJCS8qIElXX0ZMT09EX0FTU09DX1JFUV9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHJlYXNzb2NpYXRpb24gcmVxdWVzdCBmbG9vZGluZyIsCQkJCS8qIElXX0ZMT09EX1JFQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgcHJvYmUgcmVxdWVzdCBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfUFJPQkVfUkVRX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgZGlzYXNzb2NpYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgZGVhdXRoZW50aWNhdGlvbiBmbG9vZGluZyIsCQkJCQkvKiBJV19GTE9PRF9ERUFVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCA4MDIuMXggZWFwLXJlcXVlc3QgZmxvb2RpbmciCQkJCQkvKiBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcgKi8KKwl9OworCisvKiB0aW1lb3V0IC0tIG1zICovCitWT0lEIFJUTVBfU2V0UGVyaW9kaWNUaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJcFRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7CisJYWRkX3RpbWVyKHBUaW1lcik7Cit9CisKKy8qIGNvbnZlcnQgTmRpc01Jbml0aWFsaXplVGltZXIgLS0+IFJUTVBfT1NfSW5pdF9UaW1lciAqLworVk9JRCBSVE1QX09TX0luaXRfVGltZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAorCUlOCVRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLAorCUlOCVBWT0lEIGRhdGEpCit7CisJaW5pdF90aW1lcihwVGltZXIpOworICAgIHBUaW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisgICAgcFRpbWVyLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworfQorCisKK1ZPSUQgUlRNUF9PU19BZGRfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJaWYgKHRpbWVyX3BlbmRpbmcocFRpbWVyKSkKKwkJcmV0dXJuOworCisJdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlhZGRfdGltZXIocFRpbWVyKTsKK30KKworVk9JRCBSVE1QX09TX01vZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCW1vZF90aW1lcihwVGltZXIsIGppZmZpZXMgKyB0aW1lb3V0KTsKK30KKworVk9JRCBSVE1QX09TX0RlbF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAorCU9VVAlCT09MRUFOCQkJCQkqcENhbmNlbGxlZCkKK3sKKwlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQorCXsKKwkJKnBDYW5jZWxsZWQgPSBkZWxfdGltZXJfc3luYyhwVGltZXIpOworCX0KKwllbHNlCisJeworCQkqcENhbmNlbGxlZCA9IFRSVUU7CisJfQorCit9CisKK1ZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSkKK3sKKwkvL1JUTVBGcmVlTmRpc1BhY2tldChwQWQsIChzdHJ1Y3Qgc2tfYnVmZiAqKXBFbnRyeSk7Cit9CisKKy8vIFVuaWZ5IGFsbCBkZWxheSByb3V0aW5lIGJ5IHVzaW5nIHVkZWxheQorVk9JRCBSVE1QdXNlY0RlbGF5KAorCUlOCVVMT05HCXVzZWMpCit7CisJVUxPTkcJaTsKKworCWZvciAoaSA9IDA7IGkgPCAodXNlYyAvIDUwKTsgaSsrKQorCQl1ZGVsYXkoNTApOworCisJaWYgKHVzZWMgJSA1MCkKKwkJdWRlbGF5KHVzZWMgJSA1MCk7Cit9CisKK3ZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKQoreworCXRpbWUtPnUuTG93UGFydCA9IGppZmZpZXM7Cit9CisKKy8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKK05ESVNfU1RBVFVTIG9zX2FsbG9jX21lbSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQJUFVDSEFSICptZW0sCisJSU4JVUxPTkcgIHNpemUpCit7CisJKm1lbSA9IChQVUNIQVIpIGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCptZW0pCisJCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJZWxzZQorCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworfQorCisvLyBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMCitORElTX1NUQVRVUyBvc19mcmVlX21lbSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglQVUNIQVIgbWVtKQoreworCisJQVNTRVJUKG1lbSk7CisJa2ZyZWUobWVtKTsKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKKworCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIGZyYWcgcnggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCX0KKworCWlmIChwa3QpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwl9CisKKwlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworfQorCisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKKworCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHR4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwl9CisKKwlpZiAocGt0KQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgcGt0LT5kYXRhOworCX0KKwllbHNlCisJeworCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIE5VTEw7CisJfQorCisJcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKK30KKworCitWT0lEIGJ1aWxkX3R4X3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJcEZyYW1lLAorCUlOCVVMT05HCUZyYW1lTGVuKQoreworCisJc3RydWN0IHNrX2J1ZmYJKnBUeFBrdDsKKworCUFTU0VSVChwUGFja2V0KTsKKwlwVHhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKKworCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXQocFR4UGt0LCBGcmFtZUxlbiksIHBGcmFtZSwgRnJhbWVMZW4pOworfQorCitWT0lECVJUTVBGcmVlQWRhcHRlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBQT1NfQ09PS0lFIG9zX2Nvb2tpZTsKKwlpbnQgaW5kZXg7CisKKwlvc19jb29raWU9KFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwlrZnJlZShwQWQtPkJlYWNvbkJ1Zik7CisKKworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworI2lmZGVmIFJUMjg2MAorCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwl7CisgICAgCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7CisJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJfQorCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKwl2ZnJlZShwQWQpOyAvLyBwY2lfZnJlZV9jb25zaXN0ZW50KG9zX2Nvb2tpZS0+cGNpX2RldixzaXplb2YoUlRNUF9BREFQVEVSKSxwQWQsb3NfY29va2llLT5wQWRfcGEpOworCWtmcmVlKG9zX2Nvb2tpZSk7Cit9CisKK0JPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCkKK3sKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQljbG9uZSBhbiBpbnB1dCBORElTIFBBQ0tFVCB0byBhbm90aGVyIG9uZS4gVGhlIG5ldyBpbnRlcm5hbGx5IGNyZWF0ZWQgTkRJUyBQQUNLRVQKKwkJbXVzdCBoYXZlIG9ubHkgb25lIE5ESVMgQlVGRkVSCisJCXJldHVybiAtIGJ5dGUgY29waWVkLiAwIG1lYW5zIGNhbid0IGNyZWF0ZSBORElTIFBBQ0tFVAorCQlOT1RFOiBpbnRlcm5hbGx5IGNyZWF0ZWQgTkRJU19QQUNLRVQgc2hvdWxkIGJlIGRlc3Ryb3llZCBieSBSVE1QRnJlZU5kaXNQYWNrZXQKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBJbnNBTVNEVUhkcglFV0MgQS1NU0RVIGZvcm1hdCBoYXMgZXh0cmEgMTQtYnl0ZXMgaGVhZGVyLiBpZiBUUlVFLCBpbnNlcnQgdGhpcyAxNC1ieXRlIGhkciBpbiBmcm9udCBvZiBNU0RVLgorCQkqcFNyY1RvdGFsTGVuCQkJcmV0dXJuIHRvdGFsIHBhY2tldCBsZW5ndGguIFRoaXMgbGVuZ2h0IGlzIGNhbGN1bGF0ZWQgd2l0aCA4MDIuMyBmb3JtYXQgcGFja2V0LgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBSVE1QQ2xvbmVOZGlzUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUJPT0xFQU4JCQlwSW5zQU1TRFVIZHIsCisJSU4JUE5ESVNfUEFDS0VUCXBJblBhY2tldCwKKwlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KQoreworCisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKKworCUFTU0VSVChwSW5QYWNrZXQpOworCUFTU0VSVChwcE91dFBhY2tldCk7CisKKwkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAorCXBrdCA9IGRldl9hbGxvY19za2IoMjA0OCk7CisKKwlpZiAocGt0ID09IE5VTEwpCisJeworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKyAJc2tiX3B1dChwa3QsIEdFVF9PU19QS1RfTEVOKHBJblBhY2tldCkpOworCU5kaXNNb3ZlTWVtb3J5KHBrdC0+ZGF0YSwgR0VUX09TX1BLVF9EQVRBUFRSKHBJblBhY2tldCksIEdFVF9PU19QS1RfTEVOKHBJblBhY2tldCkpOworCSpwcE91dFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHBrdCk7CisKKworCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCisJcHJpbnRrKCIjIyNDbG9uZSMjI1xuIik7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvLyB0aGUgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIG11c3QgYmUgZnJlZWQgdmlhIFJUTVBGcmVlTmRpc1BhY2tldCgpCitORElTX1NUQVRVUyBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcEhlYWRlciwKKwlJTglVSU5UCQkJSGVhZGVyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVJTlQJCQlEYXRhTGVuKQoreworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCUFTU0VSVChwRGF0YSk7CisJQVNTRVJUKERhdGFMZW4pOworCisJLy8gMS4gQWxsb2NhdGUgYSBwYWNrZXQKKwlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCAqKSBkZXZfYWxsb2Nfc2tiKEhlYWRlckxlbiArIERhdGFMZW4gKyBUWFBBRERJTkdfU0laRSk7CisJaWYgKHBQYWNrZXQgPT0gTlVMTCkKKyAJeworCQkqcHBQYWNrZXQgPSBOVUxMOworI2lmZGVmIERFQlVHCisJCXByaW50aygiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG5cbiIpOworI2VuZGlmCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCS8vIDIuIGNsb25lIHRoZSBmcmFtZSBjb250ZW50CisJaWYgKEhlYWRlckxlbiA+IDApCisJCU5kaXNNb3ZlTWVtb3J5KEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSwgcEhlYWRlciwgSGVhZGVyTGVuKTsKKwlpZiAoRGF0YUxlbiA+IDApCisJCU5kaXNNb3ZlTWVtb3J5KEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSArIEhlYWRlckxlbiwgcERhdGEsIERhdGFMZW4pOworCisJLy8gMy4gdXBkYXRlIGxlbmd0aCBvZiBwYWNrZXQKKyAJc2tiX3B1dChHRVRfT1NfUEtUX1RZUEUocFBhY2tldCksIEhlYWRlckxlbitEYXRhTGVuKTsKKworCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOworLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcFBhY2tldCwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOworCSpwcFBhY2tldCA9IHBQYWNrZXQ7CisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZXNjcmlwdGlvbjoKKwlUaGlzIHJvdXRpbmUgZnJlZXMgYSBtaW5pcG9ydCBpbnRlcm5hbGx5IGFsbG9jYXRlZCBORElTX1BBQ0tFVCBhbmQgaXRzCisJY29ycmVzcG9uZGluZyBORElTX0JVRkZFUiBhbmQgYWxsb2NhdGVkIG1lbW9yeS4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QRnJlZU5kaXNQYWNrZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUE5ESVNfUEFDS0VUICBwUGFja2V0KQoreworCWRldl9rZnJlZV9za2JfYW55KFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpKTsKK30KKworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKy8vIE5PVEU6IHdlIGRvIGhhdmUgYW4gYXNzdW1wdGlvbiBoZXJlLCB0aGF0IEJ5dGUwIGFuZCBCeXRlMSBhbHdheXMgcmVhc2lkIGF0IHRoZSBzYW1lCisvLwkJCSBzY2F0dGVyIGdhdGhlciBidWZmZXIKK05ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCisJSU4JUE5ESVNfQlVGRkVSCXBGaXJzdEJ1ZmZlciwKKwlJTglVQ0hBUgkJCURlc2lyZWRPZmZzZXQsCisJT1VUIFBVQ0hBUgkJCXBCeXRlMCwKKwlPVVQgUFVDSEFSCQkJcEJ5dGUxKQoreworICAgICpwQnl0ZTAgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCk7CisgICAgKnBCeXRlMSA9ICooUFVDSEFSKShwRmlyc3RCdWZmZXIgKyBEZXNpcmVkT2Zmc2V0ICsgMSk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCit2b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKAorCUlOICBQTkRJU19QQUNLRVQgcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQoreworCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7CisJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDE7CisJcFBhY2tldEluZm8tPlRvdGFsUGFja2V0TGVuZ3RoID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCSpwU3JjQnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Cit9CisKK3ZvaWQgUlRNUF9RdWVyeU5leHRQYWNrZXRJbmZvKAorCUlOICBQTkRJU19QQUNLRVQgKnBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pCit7CisJUE5ESVNfUEFDS0VUIHBQYWNrZXQgPSBOVUxMOworCisJaWYgKCpwcFBhY2tldCkKKwkJcFBhY2tldCA9IEdFVF9PU19QS1RfTkVYVCgqcHBQYWNrZXQpOworCisJaWYgKHBQYWNrZXQpCisJeworCQlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAxOworCQlwUGFja2V0SW5mby0+cEZpcnN0QnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDE7CisJCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCisJCSpwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJCSpwU3JjQnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCSpwcFBhY2tldCA9IEdFVF9PU19QS1RfTkVYVChwUGFja2V0KTsKKwl9CisJZWxzZQorCXsKKwkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMDsKKwkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IE5VTEw7CisJCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMDsKKwkJcFBhY2tldEluZm8tPlRvdGFsUGFja2V0TGVuZ3RoID0gMDsKKworCQkqcFNyY0J1ZlZBID0gTlVMTDsKKwkJKnBTcmNCdWZMZW4gPSAwOworCQkqcHBQYWNrZXQgPSBOVUxMOworCX0KK30KKworLy8gbm90IHlldCBzdXBwb3J0IE1CU1MKK1BORVRfREVWIGdldF9uZXRkZXZfZnJvbV9ic3NpZCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworICAgIFBORVRfREVWIGRldl9wID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlkZXZfcCA9IHBBZC0+bmV0X2RldjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBU1NFUlQoZGV2X3ApOworCXJldHVybiBkZXZfcDsgLyogcmV0dXJuIG9uZSBvZiBNQlNTICovCit9CisKK1BORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVU0hPUlQJCQlEYXRhU2l6ZTsKKwlVQ0hBUgkJCSpwRGF0YTsKKworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisKKworCXNrYiA9IHNrYl9jbG9uZShSVFBLVF9UT19PU1BLVChwUGFja2V0KSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmIChza2IpCisJeworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFJldFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorCisJcmV0dXJuIHBSZXRQYWNrZXQ7CisKK30KKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVBORElTX1BBQ0tFVAlwUGFja2V0ID0gTlVMTDsKKworCisJaWYgKChza2IgPSBfX2Rldl9hbGxvY19za2IoSGRyTGVuICsgRGF0YVNpemUgKyAyLCBNRU1fQUxMT0NfRkxBRykpICE9IE5VTEwpCisJeworCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQlOZGlzTW92ZU1lbW9yeShza2ItPnRhaWwsIHBIZWFkZXI4MDJfMywgSGRyTGVuKTsKKwkJc2tiX3B1dChza2IsIEhkckxlbik7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcERhdGEsIERhdGFTaXplKTsKKwkJc2tiX3B1dChza2IsIERhdGFTaXplKTsKKwkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJCXBQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOworCX0KKworCXJldHVybiBwUGFja2V0OworfQorCisKKyNkZWZpbmUgVEtJUF9UWF9NSUNfU0laRQkJOAorUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiLCAqbmV3c2tiOworCisKKwlza2IgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKKwlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBUS0lQX1RYX01JQ19TSVpFKQorCXsKKwkJLy8gYWxsb2MgYSBuZXcgc2tiIGFuZCBjb3B5IHRoZSBwYWNrZXQKKwkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIFRLSVBfVFhfTUlDX1NJWkUsIEdGUF9BVE9NSUMpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZiAobmV3c2tiID09IE5VTEwpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkV4dGVuZCBUeC5NSUMgZm9yIHBhY2tldCBmYWlsZWQhLCBkcm9wcGluZyBwYWNrZXQhXG4iKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlza2IgPSBuZXdza2I7CisJfQorCisJcmV0dXJuIE9TUEtUX1RPX1JUUEtUKHNrYik7Cit9CisKKworCisKK1BORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKQoreworCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisJc3RydWN0IHNrX2J1ZmYJKnBDbG9uZWRQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisKKwkvLyBjbG9uZSB0aGUgcGFja2V0CisJcENsb25lZFBrdCA9IHNrYl9jbG9uZShwUnhQa3QsIE1FTV9BTExPQ19GTEFHKTsKKworCWlmIChwQ2xvbmVkUGt0KQorCXsKKyAgICAJLy8gc2V0IHRoZSBjb3JyZWN0IGRhdGFwdHIgYW5kIGRhdGEgbGVuCisgICAgCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OworICAgIAlwQ2xvbmVkUGt0LT5kYXRhID0gcERhdGE7CisgICAgCXBDbG9uZWRQa3QtPmxlbiA9IERhdGFTaXplOworICAgIAlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKKwkJQVNTRVJUKERhdGFTaXplIDwgMTUzMCk7CisJfQorCXJldHVybiBwQ2xvbmVkUGt0OworfQorCisvLworLy8gY2hhbmdlIE9TIHBhY2tldCBEYXRhUHRyIGFuZCBEYXRhTGVuCisvLwordm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CisJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47Cit9CisKKwordm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJQVNTRVJUKHBIZWFkZXI4MDJfMyk7CisKKwlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwlwT1NQa3QtPmRhdGEgPSBwUnhCbGstPnBEYXRhOworCXBPU1BrdC0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIKKwkvLworCS8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCit2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKworCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKKworICAgIC8qIFB1c2ggdXAgdGhlIHByb3RvY29sIHN0YWNrICovCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCUlLQU5PU19EYXRhRnJhbWVSeChwQWQsIHBSeFBrdC0+ZGV2LCBwUnhQa3QsIHBSeFBrdC0+bGVuKTsKKyNlbHNlCisJcFJ4UGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBSeFBrdCwgcFJ4UGt0LT5kZXYpOworCisJbmV0aWZfcngocFJ4UGt0KTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCit9CisKKworUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVAorcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoUE5ESVNfUEFDS0VUIHBQYWNrZXQsIFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCAqc2cpCit7CisJc2ctPk51bWJlck9mRWxlbWVudHMgPSAxOworCXNnLT5FbGVtZW50c1swXS5BZGRyZXNzID0gIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlzZy0+RWxlbWVudHNbMF0uTGVuZ3RoID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcmV0dXJuIChzZyk7Cit9CisKK3ZvaWQgaGV4X2R1bXAoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpwU3JjQnVmVkEsIHVuc2lnbmVkIGludCBTcmNCdWZMZW4pCit7CisJdW5zaWduZWQgY2hhciAqcHQ7CisJaW50IHg7CisKKwlpZiAoUlREZWJ1Z0xldmVsIDwgUlRfREVCVUdfVFJBQ0UpCisJCXJldHVybjsKKworCXB0ID0gcFNyY0J1ZlZBOworCXByaW50aygiJXM6ICVwLCBsZW4gPSAlZFxuIixzdHIsICBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisJZm9yICh4PTA7IHg8U3JjQnVmTGVuOyB4KyspCisJeworCQlpZiAoeCAlIDE2ID09IDApCisJCQlwcmludGsoIjB4JTA0eCA6ICIsIHgpOworCQlwcmludGsoIiUwMnggIiwgKCh1bnNpZ25lZCBjaGFyKXB0W3hdKSk7CisJCWlmICh4JTE2ID09IDE1KSBwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNlbmQgbG9nIG1lc3NhZ2UgdGhyb3VnaCB3aXJlbGVzcyBldmVudAorCisJCVN1cHBvcnQgc3RhbmRhcmQgaXdfZXZlbnQgd2l0aCBJV0VWQ1VTVE9NLiBJdCBpcyB1c2VkIGJlbG93LgorCisJCWl3cmVxX2RhdGEuZGF0YS5mbGFncyBpcyB1c2VkIHRvIHN0b3JlIGV2ZW50X2ZsYWcgdGhhdCBpcyBkZWZpbmVkIGJ5IHVzZXIuCisJCWl3cmVxX2RhdGEuZGF0YS5sZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgZXZlbnQgbG9nLgorCisJCVRoZSBmb3JtYXQgb2YgdGhlIGV2ZW50IGxvZyBpcyBjb21wb3NlZCBvZiB0aGUgZW50cnkncyBNQUMgYWRkcmVzcyBhbmQKKwkJdGhlIGRlc2lyZWQgbG9nIG1lc3NhZ2UgKHJlZmVyIHRvIHBXaXJlbGVzc0V2ZW50VGV4dCkuCisKKwkJCWV4OiAxMToyMjozMzo0NDo1NTo2NiBoYXMgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkKKworCQlwLnMuIFRoZSByZXF1aXJlbWVudCBvZiBXaXJlbGVzcyBFeHRlbnNpb24gaXMgdjE1IG9yIG5ld2VyLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2VuZFdpcmVsZXNzRXZlbnQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJRXZlbnRfZmxhZywKKwlJTglQVUNIQVIgCQkJcEFkZHIsCisJSU4JVUNIQVIJCQlCc3NJZHgsCisJSU4JQ0hBUgkJCVJzc2kpCit7CisjaWYgV0lSRUxFU1NfRVhUID49IDE1CisKKwl1bmlvbiAJaXdyZXFfZGF0YSAgICAgIHdycXU7CisJUFVDSEFSIAlwQnVmID0gTlVMTCwgcEJ1ZlB0ciA9IE5VTEw7CisJVVNIT1JUCWV2ZW50LCB0eXBlLCBCdWZMZW47CisJVUNIQVIJZXZlbnRfdGFibGVfbGVuID0gMDsKKworCXR5cGUgPSBFdmVudF9mbGFnICYgMHhGRjAwOworCWV2ZW50ID0gRXZlbnRfZmxhZyAmIDB4MDBGRjsKKworCXN3aXRjaCAodHlwZSkKKwl7CisJCWNhc2UgSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCQlldmVudF90YWJsZV9sZW4gPSBJV19TWVNfRVZFTlRfVFlQRV9OVU07CisJCQlicmVhazsKKworCQljYXNlIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCQlldmVudF90YWJsZV9sZW4gPSBJV19TUE9PRl9FVkVOVF9UWVBFX05VTTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVDoKKwkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX0ZMT09EX0VWRU5UX1RZUEVfTlVNOworCQkJYnJlYWs7CisJfQorCisJaWYgKGV2ZW50X3RhYmxlX2xlbiA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgdHlwZSglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fRlVOQ1RJT05fXywgdHlwZSkpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCBldmVudCkpOworCQlyZXR1cm47CisJfQorCisJLy9BbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgdGhlIG1zZy4KKwlpZigocEJ1ZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWF9MRU4sIEdGUF9BVE9NSUMpKSAhPSBOVUxMKQorCXsKKwkJLy9QcmVwYXJlIHRoZSBwYXlsb2FkCisJCW1lbXNldChwQnVmLCAwLCBJV19DVVNUT01fTUFYX0xFTik7CisKKwkJcEJ1ZlB0ciA9IHBCdWY7CisKKwkJaWYgKHBBZGRyKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBTVEEoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpICIsIFBSSU5UX01BQyhwQWRkcikpOworCQllbHNlIGlmIChCc3NJZHggPCBNQVhfTUJTU0lEX05VTSkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgQlNTKHJhJWQpICIsIEJzc0lkeCk7CisJCWVsc2UKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgIik7CisKKwkJaWYgKHR5cGUgPT0gSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzU3lzRXZlbnRUZXh0W2V2ZW50XSk7CisJCWVsc2UgaWYgKHR5cGUgPT0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMgKFJTU0k9JWQpIiwgcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbZXZlbnRdLCBSc3NpKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsIHBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W2V2ZW50XSk7CisJCWVsc2UKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCAidW5rbm93biBldmVudCIpOworCisJCXBCdWZQdHJbcEJ1ZlB0ciAtIHBCdWZdID0gJ1wwJzsKKwkJQnVmTGVuID0gcEJ1ZlB0ciAtIHBCdWY7CisKKwkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCSAgICB3cnF1LmRhdGEuZmxhZ3MgPSBFdmVudF9mbGFnOworCQl3cnF1LmRhdGEubGVuZ3RoID0gQnVmTGVuOworCisJCS8vc2VuZCB3aXJlbGVzcyBldmVudAorCSAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIHBCdWYpOworCisJCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiAlc1xuIiwgX19GVU5DVElPTl9fLCBwQnVmKSk7CisKKwkJa2ZyZWUocEJ1Zik7CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpcmVsZXNzIGV2ZW50LlxuIiwgX19GVU5DVElPTl9fKSk7CisjZWxzZQorCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fRlVOQ1RJT05fXykpOworI2VuZGlmICAvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KK30KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCit2b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisgICAgc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKyAgICB3bGFuX25nX3ByaXNtMl9oZWFkZXIgKnBoOworICAgIGludCByYXRlX2luZGV4ID0gMDsKKyAgICBVU0hPUlQgaGVhZGVyX2xlbiA9IDA7CisgICAgVUNIQVIgdGVtcF9oZWFkZXJbNDBdID0gezB9OworCisgICAgdV9pbnQzMl90IHJhbGlua3JhdGVbMjU2XSA9IHsyLDQsMTEsMjIsIDEyLDE4LDI0LDM2LDQ4LDcyLDk2LCAgMTA4LCAgIDEwOSwgMTEwLCAxMTEsIDExMiwgMTMsIDI2LCAzOSwgNTIsNzgsMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCwxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgMjcsIDU0LDgxLDEwOCwxNjIsIDIxNiwgMjQzLCAyNzAsIC8vIExhc3QgMzgKKwk1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAgMTQsIDI5LCA0MywgNTcsIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksODcsMTE1LCAxNzMsIDIzMCwyNjAsIDI4OCwgMzAsIDYwLDkwLDEyMCwxODAsMjQwLDI3MCwzMDAsNjAsMTIwLDE4MCwyNDAsMzYwLDQ4MCw1NDAsNjAwLCAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLAorCTExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwfTsKKworCisgICAgQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKyAgICBpZiAocFJ4QmxrLT5EYXRhU2l6ZSA8IDEwKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBTaXplIGlzIHRvbyBzbWFsbCEgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBwUnhCbGstPkRhdGFTaXplKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKyAgICB9CisKKyAgICBpZiAocFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpID4gUlhfQlVGRkVSX0FHR1JFU0laRSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogU2l6ZSBpcyB0b28gbGFyZ2UhICglZClcbiIsIF9fRlVOQ1RJT05fXywgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKyAgICB9CisKKyAgICBwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKKyAgICBpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCisgICAgeworICAgICAgICBwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CisgICAgICAgIGlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCisgICAgICAgICAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7CisKKyAgICAgICAgLy8gUU9TCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDI7CisgICAgCQkvLyBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKKyAgICAJCXBSeEJsay0+RGF0YVNpemUgLT0yOworICAgIAl9CisKKyAgICAJLy8gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLk9yZGVyKQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDQ7CisJCQkvLyBEYXRhIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKKyAgICAJfQorCisgICAgICAgIC8vIENvcHkgSGVhZGVyCisgICAgICAgIGlmIChoZWFkZXJfbGVuIDw9IDQwKQorICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkodGVtcF9oZWFkZXIsIHBSeEJsay0+cERhdGEsIGhlYWRlcl9sZW4pOworCisgICAgICAgIC8vIHNraXAgSFcgcGFkZGluZworICAgIAlpZiAocFJ4QmxrLT5SeEQuTDJQQUQpCisgICAgCSAgICBwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKKyAgICB9IC8vZW5kIGlmCisKKworCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKKyAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgeworCSAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworCSAgICBza2JfcHVsbChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoc2tiX2hlYWRyb29tKHBPU1BrdCkgPCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikrIGhlYWRlcl9sZW4pKSB7CisgICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHBPU1BrdCwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsIEdGUF9BVE9NSUMpKSB7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFJlYWxsb2NhdGUgaGVhZGVyIHNpemUgb2Ygc2tfYnVmZiBmYWlsIVxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CisJICAgIH0gLy9lbmQgaWYKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoaGVhZGVyX2xlbiA+IDApCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBPU1BrdCwgaGVhZGVyX2xlbiksIHRlbXBfaGVhZGVyLCBoZWFkZXJfbGVuKTsKKworICAgIHBoID0gKHdsYW5fbmdfcHJpc20yX2hlYWRlciAqKSBza2JfcHVzaChwT1NQa3QsIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKKwlOZGlzWmVyb01lbW9yeShwaCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOworCisgICAgcGgtPm1zZ2NvZGUJCSAgICA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm07CisJcGgtPm1zZ2xlbgkJICAgID0gc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcik7CisJc3RyY3B5KHBoLT5kZXZuYW1lLCBwQWQtPm5ldF9kZXYtPm5hbWUpOworCisgICAgcGgtPmhvc3R0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWU7CisJcGgtPmhvc3R0aW1lLnN0YXR1cyA9IDA7CisJcGgtPmhvc3R0aW1lLmxlbiA9IDQ7CisJcGgtPmhvc3R0aW1lLmRhdGEgPSBqaWZmaWVzOworCisJcGgtPm1hY3RpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lOworCXBoLT5tYWN0aW1lLnN0YXR1cyA9IDA7CisJcGgtPm1hY3RpbWUubGVuID0gMDsKKwlwaC0+bWFjdGltZS5kYXRhID0gMDsKKworICAgIHBoLT5pc3R4LmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eDsKKwlwaC0+aXN0eC5zdGF0dXMgPSAwOworCXBoLT5pc3R4LmxlbiA9IDA7CisJcGgtPmlzdHguZGF0YSA9IDA7CisKKyAgICBwaC0+Y2hhbm5lbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWw7CisJcGgtPmNoYW5uZWwuc3RhdHVzID0gMDsKKwlwaC0+Y2hhbm5lbC5sZW4gPSA0OworCisgICAgcGgtPmNoYW5uZWwuZGF0YSA9ICh1X2ludDMyX3QpcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKworICAgIHBoLT5yc3NpLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaTsKKwlwaC0+cnNzaS5zdGF0dXMgPSAwOworCXBoLT5yc3NpLmxlbiA9IDQ7CisgICAgcGgtPnJzc2kuZGF0YSA9ICh1X2ludDMyX3QpUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kyLCBSU1NJXzIpKTs7CisKKwlwaC0+c2lnbmFsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsOworCXBoLT5zaWduYWwuc3RhdHVzID0gMDsKKwlwaC0+c2lnbmFsLmxlbiA9IDQ7CisJcGgtPnNpZ25hbC5kYXRhID0gMDsgLy9yc3NpICsgbm9pc2U7CisKKwlwaC0+bm9pc2UuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZTsKKwlwaC0+bm9pc2Uuc3RhdHVzID0gMDsKKwlwaC0+bm9pc2UubGVuID0gNDsKKwlwaC0+bm9pc2UuZGF0YSA9IDA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAocFJ4QmxrLT5wUnhXSS0+UEhZTU9ERSA+PSBNT0RFX0hUTUlYKQorICAgIHsKKyAgICAJcmF0ZV9pbmRleCA9IDE2ICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5CVyAqMTYpICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5TaG9ydEdJICozMikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPk1DUyk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlpZiAocFJ4QmxrLT5wUnhXSS0+UEhZTU9ERSA9PSBNT0RFX09GRE0pCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKHBSeEJsay0+cFJ4V0ktPk1DUykgKyA0OworICAgIGVsc2UKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKTsKKyAgICBpZiAocmF0ZV9pbmRleCA8IDApCisgICAgICAgIHJhdGVfaW5kZXggPSAwOworICAgIGlmIChyYXRlX2luZGV4ID4gMjU1KQorICAgICAgICByYXRlX2luZGV4ID0gMjU1OworCisJcGgtPnJhdGUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlOworCXBoLT5yYXRlLnN0YXR1cyA9IDA7CisJcGgtPnJhdGUubGVuID0gNDsKKyAgICBwaC0+cmF0ZS5kYXRhID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XTsKKworCXBoLT5mcm1sZW4uZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW47CisgICAgcGgtPmZybWxlbi5zdGF0dXMgPSAwOworCXBoLT5mcm1sZW4ubGVuID0gNDsKKwlwaC0+ZnJtbGVuLmRhdGEJPSAodV9pbnQzMl90KXBSeEJsay0+RGF0YVNpemU7CisKKworICAgIHBPU1BrdC0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworICAgIHBPU1BrdC0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwT1NQa3QsIHBPU1BrdC0+ZGV2KTsKKyAgICBwT1NQa3QtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisgICAgbmV0aWZfcngocE9TUGt0KTsKKworICAgIHJldHVybjsKKworZXJyX2ZyZWVfc2tfYnVmZjoKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCXJldHVybjsKKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK3ZvaWQgcnRtcF9vc190aHJlYWRfaW5pdChQVUNIQVIgcFRocmVhZE5hbWUsIFBWT0lEIHBOb3RpZnkpCit7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJZGFlbW9uaXplKHBUaHJlYWROYW1lIC8qIiVzIixwQWQtPm5ldF9kZXYtPm5hbWUqLyk7CisKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGFlbW9uaXplKCk7CisJcmVwYXJlbnRfdG9faW5pdCgpOworCXN0cmNweShjdXJyZW50LT5jb21tLCBwVGhyZWFkTmFtZSk7CisKKwlzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCBzaWdtYXNrKFNJR1RFUk0pIHwgc2lnbWFzayhTSUdLSUxMKSk7CisKKwkvKiBBbGxvdyBpbnRlcmNlcHRpb24gb2YgU0lHS0lMTCBvbmx5CisJICogRG9uJ3QgYWxsb3cgb3RoZXIgc2lnbmFscyB0byBpbnRlcnJ1cHQgdGhlIHRyYW5zbWlzc2lvbiAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMikKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnbWFza19sb2NrLCBmbGFncyk7CisJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwlyZWNhbGNfc2lncGVuZGluZyhjdXJyZW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdtYXNrX2xvY2ssIGZsYWdzKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICAvKiBzaWduYWwgdGhhdCB3ZSd2ZSBzdGFydGVkIHRoZSB0aHJlYWQgKi8KKwljb21wbGV0ZShwTm90aWZ5KTsKKworfQorCit2b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwl7CisJCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKwkJeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M3Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCkBAIC0wLDAgKzEsOTI2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFByb2dyYW06ICAgIHJ0X2xpbnV4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENyZWF0ZWQ6ICAgIDQvMjEvMjAwNiAxOjE3OjM4IFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEF1dGhvcjogICAgIFd1IFhpLUt1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENvbW1lbnRzOiAgIGBkZXNjcmlwdGlvbmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZXZpc2lvbiAxLjEgNC8yMS8yMDA2IDE6MTc6MzggUE0gIHhzaWt1biAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbml0aWFsIHJldmlzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKworLy8gbG9hZCBmaXJtd2FyZQorI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCisjZGVmaW5lIE1FTV9BTExPQ19GTEFHICAgICAgKEdGUF9BVE9NSUMpIC8vKEdGUF9ETUEgfCBHRlBfQVRPTUlDKQorCisjaWZuZGVmIElGTkFNU0laCisjZGVmaW5lIElGTkFNU0laIDE2CisjZW5kaWYKKworLy8jZGVmaW5lIENPTkZJR19DS0lQX1NVUFBPUlQKKworI3VuZGVmIF9faW5saW5lCisjZGVmaW5lIF9faW5saW5lCSAgIHN0YXRpYyBpbmxpbmUKKwordHlwZWRlZiBpbnQgKCpIQVJEX1NUQVJUX1hNSVRfRlVOQykoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisvLyBhZGQgYnkga2F0aHkKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFJUMjg2MAorI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQS5kYXQiCisjZGVmaW5lIFNUQV9SVE1QX0ZJUk1XQVJFX0ZJTEVfTkFNRSAiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvUlQyODYwU1RBLmJpbiIKKyNkZWZpbmUgU1RBX05JQ19ERVZJQ0VfTkFNRQkJCSJSVDI4NjBTVEEiCisjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIxLjguMC4wIgorI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorI2RlZmluZSBDQVJEX0lORk9fUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEFDYXJkLmRhdCIKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSVDI4NjAKKyNpZm5kZWYgUENJX0RFVklDRQorI2RlZmluZSBQQ0lfREVWSUNFKHZlbmQsZGV2KSBcCisJLnZlbmRvciA9ICh2ZW5kKSwgLmRldmljZSA9IChkZXYpLCBcCisJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lECisjZW5kaWYgLy8gUENJX0RFVklDRSAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpCQlcCisJKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCisJIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCisJICgobG9uZykoYikgLSAobG9uZykoYSkgPCAwKSkKKworI2RlZmluZSBSVE1QX1RJTUVfQUZURVJfRVEoYSxiKQlcCisJKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCisJIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCisJICgobG9uZykoYSkgLSAobG9uZykoYikgPj0gMCkpCisjZGVmaW5lIFJUTVBfVElNRV9CRUZPUkUoYSxiKQlSVE1QX1RJTUVfQUZURVJfRVEoYixhKQorI2Vsc2UKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikgdGltZV9hZnRlcihhLCBiKQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAorCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCisJeyBcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fRlVOQ1RJT05fXykpOyBcCisJCXJldHVybiAtMTsgXAorCX0KKworI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIG1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworI2Vsc2UKKyNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKQlNT0RfSU5DX1VTRV9DT1VOVDsKKyNkZWZpbmUgUlRfTU9EX0RFQ19VU0VfQ09VTlQoKSBNT0RfREVDX1VTRV9DT1VOVDsKKyNlbmRpZgorCisjZGVmaW5lIE9TX0haCQkJSFoKKworI2RlZmluZSBFVEhfTEVOR1RIX09GX0FERFJFU1MJNgorCisjZGVmaW5lIElOCisjZGVmaW5lIE9VVAorCisjZGVmaW5lIE5ESVNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQKKyNkZWZpbmUgTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBCQkJCTB4MDIKKyNkZWZpbmUgTkRJU19TVEFUVVNfUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgIDB4MDMKKworI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQUlECQkJMHgwMAkJLy8weDAwfjB4M2YKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01CU1NJRAkJMHgwMAkJLy8weDAwLDB4MTAsMHgyMCwweDMwCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMJCQkweDEwCQkvLzB4NDAsMHg1MCwweDYwLDB4NzAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJCQkweDIwCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNICQkJMHgzMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfRExTCQkJMHg0MAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAkJMAorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAkJMQorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAkJMgorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QJMworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKK3R5cGVkZWYJc3RydWN0IHBpZCAqCVRIUkVBRF9QSUQ7CisjZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQlOVUxMCisjZGVmaW5lCUdFVF9QSUQoX3YpCWZpbmRfZ2V0X3BpZChfdikKKyNkZWZpbmUJR0VUX1BJRF9OVU1CRVIoX3YpCXBpZF9ucihfdikKKyNkZWZpbmUgQ0hFQ0tfUElEX0xFR0FMSVRZKF9waWQpCWlmIChwaWRfbnIoX3BpZCkgPj0gMCkKKyNkZWZpbmUgS0lMTF9USFJFQURfUElEKF9BLCBfQiwgX0MpCWtpbGxfcGlkKF9BLCBfQiwgX0MpCisjZWxzZQordHlwZWRlZglwaWRfdAlUSFJFQURfUElEOworI2RlZmluZQlUSFJFQURfUElEX0lOSVRfVkFMVUUJLTEKKyNkZWZpbmUJR0VUX1BJRChfdikJX3YKKyNkZWZpbmUJR0VUX1BJRF9OVU1CRVIoX3YpCV92CisjZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAoX3BpZCA+PSAwKQorI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9wcm9jKF9BLCBfQiwgX0MpCisjZW5kaWYKKworc3RydWN0IG9zX2xvY2sgIHsKKwlzcGlubG9ja190CQlsb2NrOworCXVuc2lnbmVkIGxvbmcgIAlmbGFnczsKK307CisKKworc3RydWN0IG9zX2Nvb2tpZSB7CisjaWZkZWYgUlQyODYwCisJc3RydWN0IHBjaV9kZXYgCQkJKnBjaV9kZXY7CisJc3RydWN0IHBjaV9kZXYgCQkJKnBhcmVudF9wY2lfZGV2OworCWRtYV9hZGRyX3QJCSAgCQlwQWRfcGE7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJcnhfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJbWdtdF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMwX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzFfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMl9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMzX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAloY2NhX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRidHRfdGFzazsKKyNpZmRlZiBSVDI4NjAKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwl1bnNpZ25lZCBsb25nCQkJYXBkX3BpZDsgLy84MDIuMXggZGFlbW9uIHBpZAorCUlOVAkJCQkJCWlvY3RsX2lmX3R5cGU7CisJSU5UIAkJCQkJaW9jdGxfaWY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVklSVFVBTF9BREFQVEVSCit7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpSdG1wRGV2OworCXN0cnVjdCBuZXRfZGV2aWNlCQkqVmlydHVhbERldjsKK30gVklSVFVBTF9BREFQVEVSLCBQVklSVFVBTF9BREFQVEVSOworCisjdW5kZWYgIEFTU0VSVAorI2RlZmluZSBBU1NFUlQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoISh4KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgX19GSUxFX18gIjolZCBhc3NlcnQgIiAjeCAiZmFpbGVkXG4iLCBfX0xJTkVfXyk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCit0eXBlZGVmIHN0cnVjdCBvc19jb29raWUJKiBQT1NfQ09PS0lFOwordHlwZWRlZiBzdHJ1Y3QgcGNpX2RldiAJCSogUFBDSV9ERVY7Cit0eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlCSogUE5FVF9ERVY7Cit0eXBlZGVmIHZvaWQJCQkJKiBQTkRJU19QQUNLRVQ7Cit0eXBlZGVmIGNoYXIJCQkJTkRJU19QQUNLRVQ7Cit0eXBlZGVmIFBORElTX1BBQ0tFVAkJKiBQUE5ESVNfUEFDS0VUOwordHlwZWRlZglkbWFfYWRkcl90CQkJTkRJU19QSFlTSUNBTF9BRERSRVNTOwordHlwZWRlZglkbWFfYWRkcl90CQkJKiBQTkRJU19QSFlTSUNBTF9BRERSRVNTOwordHlwZWRlZiBzcGlubG9ja190CQkJTkRJU19TUElOX0xPQ0s7Cit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CU5ESVNfTUlOSVBPUlRfVElNRVI7Cit0eXBlZGVmIHZvaWQJCQkJKiBORElTX0hBTkRMRTsKK3R5cGVkZWYgY2hhciAJCQkJKiBQTkRJU19CVUZGRVI7CisKKworCit2b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKTsKKworZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGludCBzZF9pZHgsIGludCBkaXJlY3Rpb24pOwordm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1PVkUgVE8gcnRtcC5oID8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIFBLVFNSQ19ORElTICAgICAgICAgICAgIDB4N2YKKyNkZWZpbmUgUEtUU1JDX0RSSVZFUiAgICAgICAgICAgMHgwZgorI2RlZmluZSBQUklOVF9NQUMoYWRkcikJXAorCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0KKworCisjZGVmaW5lIFJUMjg2MF9QQ0lfREVWSUNFX0lECQkweDA2MDEKKworI2lmZGVmIFJUMjg2MAorI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX3NkX2lkeCwgX2RpcikgXAorCWxpbnV4X3BjaV9tYXBfc2luZ2xlKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKQorCisjZGVmaW5lIFBDSV9VTk1BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpIFwKKwlsaW51eF9wY2lfdW5tYXBfc2luZ2xlKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKQorCisjZGVmaW5lIFBDSV9BTExPQ19DT05TSVNURU5UKF9wY2lfZGV2LCBfc2l6ZSwgX3B0cikgXAorCXBjaV9hbGxvY19jb25zaXN0ZW50KF9wY2lfZGV2LCBfc2l6ZSwgX3B0cikKKworI2RlZmluZSBQQ0lfRlJFRV9DT05TSVNURU5UKF9wY2lfZGV2LCBfc2l6ZSwgX3ZpcnR1YWxfYWRkciwgX3BoeXNpY2FsX2FkZHIpIFwKKwlwY2lfZnJlZV9jb25zaXN0ZW50KF9wY2lfZGV2LCBfc2l6ZSwgX3ZpcnR1YWxfYWRkciwgX3BoeXNpY2FsX2FkZHIpCisKKyNkZWZpbmUgREVWX0FMTE9DX1NLQihfbGVuZ3RoKSBcCisJZGV2X2FsbG9jX3NrYihfbGVuZ3RoKQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworI2RlZmluZSBCRUFDT05fRlJBTUVfRE1BX0NBQ0hFX1dCQUNLKF9wdHIsIF9zaXplKQlcCisJZG1hX2NhY2hlX3diYWNrKF9wdHIsIF9zaXplKQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKyNkZWZpbmUgTmRpc01JbmRpY2F0ZVN0YXR1cyhfdywgX3gsIF95LCBfeikKKworCit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CVJUTVBfT1NfVElNRVI7CisKKworCit0eXBlZGVmIHN0cnVjdCAgX1JBTElOS19USU1FUl9TVFJVQ1QgICAgeworICAgIFJUTVBfT1NfVElNRVIJCVRpbWVyT2JqOyAgICAgICAvLyBOZGlzIFRpbWVyIG9iamVjdAorCUJPT0xFQU4JCQkJVmFsaWQ7CQkJLy8gU2V0IHRvIFRydWUgd2hlbiBjYWxsIFJUTVBJbml0VGltZXIKKyAgICBCT09MRUFOICAgICAgICAgICAgIFN0YXRlOyAgICAgICAgICAvLyBUcnVlIGlmIHRpbWVyIGNhbmNlbGxlZAorICAgIEJPT0xFQU4JICAgICAgCQlQZXJpb2RpY1R5cGU7CS8vIFRydWUgaWYgdGltZXIgaXMgcGVyaW9kaWMgdGltZXIKKyAgICBCT09MRUFOICAgICAgICAgICAgIFJlcGVhdDsgICAgICAgICAvLyBUcnVlIGlmIHBlcmlvZGljIHRpbWVyCisgICAgVUxPTkcgICAgICAgICAgICAgICBUaW1lclZhbHVlOyAgICAgLy8gVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCisJVUxPTkcJCQkJY29va2llOwkJCS8vIG9zIHNwZWNpZmljIG9iamVjdAorfSAgIFJBTElOS19USU1FUl9TVFJVQ1QsICpQUkFMSU5LX1RJTUVSX1NUUlVDVDsKKworCisKKworLy8jZGVmaW5lIERCRwkxCisKKy8vCisvLyAgTUFDUk8gZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorLy8KKworI2lmZGVmIERCRworZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKKworI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChMZXZlbCA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KSAgICBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKKworCisjZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKCJFUlJPUiEhISAiKTsgICAgICAgICAgXAorICAgIHByaW50ayBGbXQ7ICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCQlcCit7CQkJCQkJCQkJXAorCXByaW50ayBGbXQ7CQkJCQlcCit9CisKKworI2Vsc2UKKyNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpCisjZW5kaWYKKworCisvLworLy8gIHNwaW5fbG9jayBlbmhhbmNlZCBmb3IgTmVzdGVkIHNwaW4gbG9jaworLy8KKyNkZWZpbmUgTmRpc0FsbG9jYXRlU3BpbkxvY2soX19sb2NrKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Bpbl9sb2NrX2luaXQoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7ICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIE5kaXNGcmVlU3BpbkxvY2sobG9jaykgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIFJUTVBfU0VNX0xPQ0soX19sb2NrKQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwlzcGluX2xvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJCVwKK30KKworI2RlZmluZSBSVE1QX1NFTV9VTkxPQ0soX19sb2NrKQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQkJXAorfQorCisvLyBzYW1wbGUsIHVzZSBzZW1hcGhvcmUgbG9jayB0byByZXBsYWNlIElSUSBsb2NrLCAyMDA3LzExLzE1CisjZGVmaW5lIFJUTVBfSVJRX0xPQ0soX19sb2NrLCBfX2lycWZsYWdzKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCV9faXJxZmxhZ3MgPSAwOwkJCQkJCQkJCVwKKwlzcGluX2xvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkIHw9IDE7IFwKK30KKworI2RlZmluZSBSVE1QX0lSUV9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJcEFkLT5pcnFfZGlzYWJsZWQgJj0gMDsgXAorCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKK30KKworI2RlZmluZSBSVE1QX0lOVF9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlzcGluX2xvY2tfaXJxc2F2ZSgoc3BpbmxvY2tfdCAqKV9fbG9jaywgX19pcnFmbGFncyk7CVwKK30KKworI2RlZmluZSBSVE1QX0lOVF9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgoc3BpbmxvY2tfdCAqKShfX2xvY2spLCAoKHVuc2lnbmVkIGxvbmcpX19pcnFmbGFnKSk7CVwKK30KKworI2lmZGVmIFJUMjg2MAorI2lmIGRlZmluZWQoSU5GX1RXSU5QQVNTKSB8fCBkZWZpbmVkKElORl9EQU5VQkUpIHx8IGRlZmluZWQoSUtBTk9TX1ZYXzFYMCkKKy8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKKyNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKKwkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCisJKCpfcFYgPSBTV0FQMzIoKigoVUlOVDMyICopKF9wVikpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBSVE1QX0lPX1JFQUQ4KF9BLCBfUiwgX3BWKQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCVwKKwkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCisJKCpfcFYgPSByZWFkYigodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAorfQorI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQlcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJVUlOVDMyCV9WYWw7CQkJCQkJCQkJCQkJCVwKKwlfVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJXAorCV9WYWwgPSBTV0FQMzIoX1YpOwkJCQkJCQkJCQkJCVwKKwl3cml0ZWwoX1ZhbCwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCVwKKwlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKKwl3cml0ZWIoKF9WKSwgKFBVQ0hBUikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJXAorfQorI2RlZmluZSBSVE1QX0lPX1dSSVRFMTYoX0EsIF9SLCBfVikJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQlcCisJVUlOVAlWYWw7CQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQlcCisJd3JpdGV3KFNXQVAxNigoX1YpKSwgKFBVU0hPUlQpKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwlcCit9CisjZWxzZQorLy9QYXRjaCBmb3IgQVNJQyB0dXJzdCByZWFkL3dyaXRlIGJ1ZywgbmVlZHMgdG8gcmVtb3ZlIGFmdGVyIG1ldGVsIGZpeAorI2RlZmluZSBSVE1QX0lPX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJXAorCQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlCQkJCQkJCQkJCQkJCQkJXAorCQkqX3BWID0gMDsJCQkJCQkJCQkJCQkJXAorfQorI2RlZmluZSBSVE1QX0lPX1JFQUQ4KF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJCVwKKwkoKl9wViA9IHJlYWRiKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQkJXAorfQorI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKKwl3cml0ZWwoX1YsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCQkJCQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjaWYgZGVmaW5lZChCUkNNXzYzNTgpCisjZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgXAorCVVMT05HIFZhbDsgICAgICAgICAgICAgICAgXAorCVVDSEFSIF9pOyAgICAgICAgICAgICAgICBcCisJX2kgPSAoX1IgJiAweDMpOyAgICAgICAgICAgICBcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IgLSBfaSkpKTsgICBcCisJVmFsID0gVmFsICYgKH4oMHgwMDAwMDBmZiA8PCAoKF9pKSo4KSkpOyAgICAgICAgIFwKKwlWYWwgPSBWYWwgfCAoKFVMT05HKV9WIDw8ICgoX2kpKjgpKTsgICAgICAgICBcCisJd3JpdGVsKChWYWwpLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUiAtIF9pKSkpOyAgICBcCit9CisjZWxzZQorI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJCQkJXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCQlcCisJd3JpdGViKChfViksIChQVUNIQVIpKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJXAorfQorI2VuZGlmCisjZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJCQkJXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCQlcCisJd3JpdGV3KChfViksIChQVVNIT1JUKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJXAorfQorI2VuZGlmCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworI2lmbmRlZiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dAorI2RlZmluZSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHJldCkgXAorZG8geyBcCisgICAgICAgIHdhaXRfcXVldWVfdCBfX3dhaXQ7IFwKKyAgICAgICAgaW5pdF93YWl0cXVldWVfZW50cnkoJl9fd2FpdCwgY3VycmVudCk7IFwKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgXAorICAgICAgICBmb3IgKDs7KSB7IFwKKyAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbikgXAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHNjaGVkdWxlX3RpbWVvdXQocmV0KTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgcmV0ID0gLUVSRVNUQVJUU1lTOyBcCisgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOyBcCisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgdGltZW91dCkgXAorKHsgXAorICAgICAgICBsb25nIF9fcmV0ID0gdGltZW91dDsgXAorICAgICAgICBpZiAoIShjb25kaXRpb24pKSBcCisgICAgICAgICAgICAgICAgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCBfX3JldCk7IFwKKyAgICAgICAgX19yZXQ7IFwKK30pCisjZW5kaWYKKyNkZWZpbmUgT05FX1RJQ0sgMQorI2RlZmluZSBPU19XQUlUKF90aW1lKSBcCit7CWludCBfaTsgXAorCWxvbmcgX2xvb3AgPSAoKF90aW1lKS8oMTAwMC9PU19IWikpID4gMCA/ICgoX3RpbWUpLygxMDAwL09TX0haKSkgOiAxO1wKKwl3YWl0X3F1ZXVlX2hlYWRfdCBfd2FpdDsgXAorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJl93YWl0KTsgXAorCWZvciAoX2k9MDsgX2k8KF9sb29wKTsgX2krKykgXAorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChfd2FpdCwgMCwgT05FX1RJQ0spOyB9CisKKworLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLwordHlwZWRlZiB2b2lkICgqVElNRVJfRlVOQ1RJT04pKHVuc2lnbmVkIGxvbmcpOworCisjZGVmaW5lIENPUFlfTUFDX0FERFIoQWRkcjEsIEFkZHIyKSAgICAgICAgICAgICBtZW1jcHkoKEFkZHIxKSwgKEFkZHIyKSwgTUFDX0FERFJfTEVOKQorCisjZGVmaW5lIE1sbWVBbGxvY2F0ZU1lbW9yeShfcEFkLCBfcHBWQSkgb3NfYWxsb2NfbWVtKF9wQWQsIF9wcFZBLCBNR01UX0RNQV9CVUZGRVJfU0laRSkKKyNkZWZpbmUgTWxtZUZyZWVNZW1vcnkoX3BBZCwgX3BWQSkgICAgIG9zX2ZyZWVfbWVtKF9wQWQsIF9wVkEpCisKKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCQkJXAordm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIgPSAoUFJBTElOS19USU1FUl9TVFJVQ1QpIGRhdGE7CQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCV9mdW5jKE5VTEwsIChQVk9JRCkgcFRpbWVyLT5jb29raWUsIE5VTEwsIHBUaW1lcik7IAkJCQkJCQlcCisJaWYgKHBUaW1lci0+UmVwZWF0KQkJCQkJCQkJCQkJCQkJCVwKKwkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBUaW1lci0+VGltZXJWYWx1ZSk7CQkJCVwKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisKKyNkZWZpbmUgREVDTEFSRV9USU1FUl9GVU5DVElPTihfZnVuYykJCQlcCit2b2lkIGxpbnV4XyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQorCisjZGVmaW5lIEdFVF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJXAorCQlsaW51eF8jI19mdW5jCisKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVSc3NpUmVwb3J0RXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQVBTRFBlcmlvZGljRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFzaWNSZlR1bmluZ0V4ZWMpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CisjaWZkZWYgTEVBUF9TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSYWRpb09uRXhlYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3ZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKTsKKworCisvKgorICogcGFja2V0IGhlbHBlcgorICogCS0gY29udmVydCBpbnRlcm5hbCBydCBwYWNrZXQgdG8gb3MgcGFja2V0IG9yCisgKiAgICAgICAgICAgICBvcyBwYWNrZXQgdG8gcnQgcGFja2V0CisgKi8KKyNkZWZpbmUgUlRQS1RfVE9fT1NQS1QoX3ApCQkoKHN0cnVjdCBza19idWZmICopKF9wKSkKKyNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKFBORElTX1BBQ0tFVCkoX3ApKQorCisjZGVmaW5lIEdFVF9PU19QS1RfREFUQVBUUihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkKKworI2RlZmluZSBHRVRfT1NfUEtUX0xFTihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKQorCisjZGVmaW5lIEdFVF9PU19QS1RfREFUQVRBSUwoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPnRhaWwpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9IRUFEKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5oZWFkKQorCisjZGVmaW5lIEdFVF9PU19QS1RfRU5EKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5lbmQpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9ORVRERVYoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikKKworI2RlZmluZSBHRVRfT1NfUEtUX1RZUEUoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCkpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9ORVhUKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5uZXh0KQorCisKKyNkZWZpbmUgT1NfTlRPSFMoX1ZhbCkgXAorCQkobnRvaHMoX1ZhbCkpCisjZGVmaW5lIE9TX0hUT05TKF9WYWwpIFwKKwkJKGh0b25zKF9WYWwpKQorI2RlZmluZSBPU19OVE9ITChfVmFsKSBcCisJCShudG9obChfVmFsKSkKKyNkZWZpbmUgT1NfSFRPTkwoX1ZhbCkgXAorCQkoaHRvbmwoX1ZhbCkpCisKKy8qIHN0YXRpc3RpY3MgY291bnRlciAqLworI2RlZmluZSBTVEFUU19JTkNfUlhfUEFDS0VUUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfUEFDS0VUUyhfcEFkLCBfZGV2KQorCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQorI2RlZmluZSBTVEFUU19JTkNfVFhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfRVJST1JTKF9wQWQsIF9kZXYpCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9FUlJPUlMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfRFJPUFBFRChfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRFJPUFBFRChfcEFkLCBfZGV2KQorCisKKyNkZWZpbmUgQ0JfT0ZGICAxMAorCisKKy8vICAgY2hlY2sgRERLIE5ESVNfUEFDS0VUIGRhdGEgc3RydWN0dXJlIGFuZCBmaW5kIG91dCBvbmx5IE1pbmlwb3J0UmVzZXJ2ZWRFeFswLi43XSBjYW4gYmUgdXNlZCBieSBvdXIgZHJpdmVyIHdpdGhvdXQKKy8vICAgYW1iaWd1aXR5LiBGaWVsZHMgYWZ0ZXIgcFBhY2tldC0+TWluaXBvcnRSZXNlcnZlZEV4WzhdIG1heSBiZSB1c2VkIGJ5IG90aGVyIHdyYXBwZXIgbGF5ZXIgdGh1cyBjcmFzaGVzIHRoZSBkcml2ZXIKKy8vCisKKy8vIFVzZXIgUHJpb3JpdHkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1VQKF9wLCBfcHJpbykJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMF0gPSBfcHJpbykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1VQKF9wKQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdKQorCisvLyBGcmFnbWVudCAjCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMoX3AsIF9udW0pCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0gPSBfbnVtKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxXSkKKworLy8gMHgwIH4weDdmOiBUWCB0byBBUCdzIG93biBCU1Mgd2hpY2ggaGFzIHRoZSBzcGVjaWZpZWQgQUlELiBpZiBBSUQ+MTI3LCBzZXQgYml0IDcgaW4gUlRNUF9TRVRfUEFDS0VUX0VNQUNUQUIgdG9vLgorLy8odGhpcyB2YWx1ZSBhbHNvIGFzIE1BQyhvbi1jaGlwIFdDSUQpIHRhYmxlIGluZGV4KQorLy8gMHg4MH4weGZmOiBUWCB0byBhIFdEUyBsaW5rLiBiMH42OiBXRFMgaW5kZXgKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1dDSUQoX3AsIF93ZHNpZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0gPSBfd2RzaWR4KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0NJRChfcCkgICAgICAgICAgCQkoKFVDSEFSKShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSkpCisKKy8vIDB4ZmY6IFBLVFNSQ19ORElTLCBvdGhlcnM6IGxvY2FsIFRYIGJ1ZmZlciBpbmRleC4gVGhpcyB2YWx1ZSBhZmZlY3RzIGhvdyB0byBhIHBhY2tldAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU09VUkNFKF9wLCBfcGt0c3JjKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdID0gX3BrdHNyYykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1NPVVJDRShfcCkgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10pCisKKy8vIFJUUy9DVFMtdG8tc2VsZiBwcm90ZWN0aW9uIG1ldGhvZAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfUlRTKF9wLCBfbnVtKSAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdID0gX251bSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1JUUyhfcCkgICAgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0pCisvLyBzZWUgUlRNUF9TKEcpRVRfUEFDS0VUX0VNQUNUQUIKKworLy8gVFggcmF0ZSBpbmRleAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKF9wLCBfcmF0ZSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSA9IF9yYXRlKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSkKKworLy8gRnJvbSB3aGljaCBJbnRlcmZhY2UKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0lGKF9wLCBfaWZkeCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSA9IF9pZmR4KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSUYoX3ApCQkgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzZdKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3AsIF9ic3MpCQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKF9ic3MpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9XRFMoX3AsIF9ic3MpCQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfYnNzKSArIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9BUENMSShfcCwgX2lkeCkgICAJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2lkeCkgKyBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NRVNIKF9wLCBfaWR4KSAgIAlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfaWR4KSArIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wKQkJCVJUTVBfR0VUX1BBQ0tFVF9JRigoX3ApKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShfcCkJCQkJCVJUTVBfR0VUX1BBQ0tFVF9JRigoX3ApKQorCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9NT1JFREFUQShfcCwgX21vcmViaXQpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10gPSBfbW9yZWJpdCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10pCisKKworI2lmIDAKKy8vI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCisvLyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0RIQ1AoX3ApICAgICAgICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pCisjZWxzZQorLy8KKy8vCVNlcGNpZmljIFBha2NldCBUeXBlIGRlZmluaXRpb24KKy8vCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQorCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AJCTB4MDEKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wJCTB4MDIKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNAkJMHgwNAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkJCTB4MDgKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTgkJMHgxMAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQCTB4MjAKKworLy9TcGVjaWZpYworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMoX3AsIF9mbGcpCSAgIAkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdID0gX2ZsZykKKworLy9ESENQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ESENQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfREhDUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKQorCisvL0VBUE9MCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9FQVBPTChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRUFQT0woX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpCisKKy8vV0FJCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQUkoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0FJKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wgfCBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKSkKKworLy9WTEFOCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9WTEFOKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTik7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVkxBTihfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKQorCisvL0xMQy9TTkFQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTExDU05BUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKQorCisvLyBJUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSVBWNChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KTsJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lQVjQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCkKKworI2VuZGlmCisKKworLy8gSWYgdGhpcyBmbGFnIGlzIHNldCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBFQVBvTCBmcmFtZSBNVVNUIGJlIGNsZWFyLgorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKF9wLCBfZmxnKSAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMl0gPSBfZmxnKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKF9wKSAgICAgICAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMl0pCisKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUXzVWVChfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdID0gX2ZsZykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUXzVWVChfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdKQorCisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisjZGVmaW5lIEJSSURHRV9UQUcgMHgzNTU2NDI1MiAgICAvLyBkZXBlbmRzIG9uIDVWVCBkZWZpbmUgaW4gYnJfaW5wdXQuYworI2VuZGlmCisKKworI2RlZmluZSBORElTX1NFVF9QQUNLRVRfU1RBVFVTKF9wLCBfc3RhdHVzKQorCisKKyNkZWZpbmUgR0VUX1NHX0xJU1RfRlJPTV9QQUNLRVQoX3AsIF9zYykJXAorICAgIHJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KF9wLCBfc2MpCisKKyNkZWZpbmUgTmRpc01vdmVNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1tb3ZlKERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKKyNkZWZpbmUgTmRpc1plcm9NZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCkgICAgICAgICBtZW1zZXQoRGVzdGluYXRpb24sIDAsIExlbmd0aCkKKyNkZWZpbmUgTmRpc0ZpbGxNZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCwgRmlsbCkgICBtZW1zZXQoRGVzdGluYXRpb24sIEZpbGwsIExlbmd0aCkKKyNkZWZpbmUgTmRpc0VxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkgICAoIW1lbWNtcChTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpKQorI2RlZmluZSBSVE1QRXF1YWxNZW1vcnkoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKQkoIW1lbWNtcChTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpKQorCisKKyNkZWZpbmUgUlRNUF9JTkNfUkVGKF9BKQkJMAorI2RlZmluZSBSVE1QX0RFQ19SRUYoX0EpCQkwCisjZGVmaW5lIFJUTVBfR0VUX1JFRihfQSkJCTAKKworCisKKy8qCisgKiBVTE9ORworICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MpCQkoUGh5c2ljYWxBZGRyZXNzKQorCisvKgorICogVUxPTkcKKyAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MpOworICovCisjZGVmaW5lIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MpCQkoMCkKKworLyoKKyAqIFZPSUQKKyAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcywKKyAqICAgSU4gVUxPTkcgIFZhbHVlKTsKKyAqLworI2RlZmluZSBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQlcCisJCQlQaHlzaWNhbEFkZHJlc3MgPSBWYWx1ZTsKKworLyoKKyAqIFZPSUQKKyAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCisgKiAgIElOIFVMT05HICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKFBoeXNpY2FsQWRkcmVzcywgVmFsdWUpCisKKworLy9DT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOworI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KSBcCisJKFBORElTX1BBQ0tFVCkocEVudHJ5KQorCisjZGVmaW5lIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSBcCisJKFBRVUVVRV9FTlRSWSkocFBhY2tldCkKKworCisjaWZuZGVmIENPTlRBSU5JTkdfUkVDT1JECisjZGVmaW5lIENPTlRBSU5JTkdfUkVDT1JEKGFkZHJlc3MsIHR5cGUsIGZpZWxkKQkJCVwKKygodHlwZSAqKSgoUENIQVIpKGFkZHJlc3MpIC0gb2Zmc2V0b2YodHlwZSwgZmllbGQpKSkKKyNlbmRpZgorCisKKyNkZWZpbmUgUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX1N0YXR1cykgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUEZyZWVOZGlzUGFja2V0KF9wQWQsIF9wUGFja2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIFNXSVRDSF9QaHlBQihfcEFBLCBfcEJCKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUFBQmFzZVBhSGlnaDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUxPTkcJQUFCYXNlUGFMb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUJCQmFzZVBhSGlnaDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUxPTkcJQkJCYXNlUGFMb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEJCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBQUJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BBQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBQUJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEsIEJCQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBLCBCQkJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQiwgQUFCYXNlUGFIaWdoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIsIEFBQmFzZVBhTG93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgTmRpc1dyaXRlRXJyb3JMb2dFbnRyeShfYSwgX2IsIF9jLCBfZCkKKyNkZWZpbmUgTmRpc01BbGxvY2F0ZU1hcFJlZ2lzdGVycyhfYSwgX2IsIF9jLCBfZCwgX2UpCQlORElTX1NUQVRVU19TVUNDRVNTCisKKworI2RlZmluZSBOZGlzQWNxdWlyZVNwaW5Mb2NrCQlSVE1QX1NFTV9MT0NLCisjZGVmaW5lIE5kaXNSZWxlYXNlU3BpbkxvY2sJCVJUTVBfU0VNX1VOTE9DSworCitzdGF0aWMgaW5saW5lIHZvaWQgTmRpc0dldFN5c3RlbVVwVGltZShVTE9ORyAqdGltZSkKK3sKKwkqdGltZSA9IGppZmZpZXM7Cit9CisKKy8vcFBhY2tldCA9IENPTlRBSU5JTkdfUkVDT1JEKHBFbnRyeSwgTkRJU19QQUNLRVQsIE1pbmlwb3J0UmVzZXJ2ZWRFeCk7CisjZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpIFwKKwkJKChQTkRJU19QQUNLRVQpIChwRW50cnkpKQorCitpbnQgcnQyOHh4X3BhY2tldF94bWl0KHN0cnVjdCBza19idWZmICpza2IpOworCisKKwordm9pZCBydG1wX29zX3RocmVhZF9pbml0KFBVQ0hBUiBwVGhyZWFkTmFtZSwgUFZPSUQgcE5vdGlmeSk7CisKKyNpZmRlZiBSVDI4NjAKKyNpZiAhZGVmaW5lZChQQ0lfQ0FQX0lEX0VYUCkKKyNkZWZpbmUgUENJX0NBUF9JRF9FWFAJCQkgICAgMHgxMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQQ0lfRVhQX0xOS0NUTCkKKyNkZWZpbmUgUENJX0VYUF9MTktDVEwJCQkgICAgMHgxMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9QQ0kJCTB4MDYwNAorI2VuZGlmCisKKyNkZWZpbmUgUENJQlVTX0lOVEVMX1ZFTkRPUiAgICAgICAgIDB4ODA4NgorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODczYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jCkBAIC0wLDAgKzEsMTY4NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydF9tYWluX2Rldi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU2FtcGxlCQlNYXIvMjEvMDcJCU1lcmdlIFJUMjg3MCBhbmQgUlQyODYwIGRyaXZlcnMuCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNkZWZpbmUgRk9SVFlfTUhaX0lOVE9MRVJBTlRfSU5URVJWQUwJKDYwKjEwMDApIC8vIDEgbWluCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKy8vIHJlY29yZCB3aGV0aGVyIHRoZSBjYXJkIGluIHRoZSBjYXJkIGxpc3QgaXMgdXNlZCBpbiB0aGUgY2FyZCBmaWxlCitVSU5UOCAgTUNfQ2FyZFVzZWRbTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEXTsKKy8vIHJlY29yZCB1c2VkIGNhcmQgbWFjIGFkZHJlc3MgaW4gdGhlIGNhcmQgbGlzdAorc3RhdGljIFVJTlQ4ICBNQ19DYXJkTWFjW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF1bNl07CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorVUlOVDMyIENXX01BWF9JTl9CSVRTOworI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgVmFyaWFibGVzIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vc3RhdGljIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CisKK2NoYXIgKm1hYyA9ICIiOwkJICAgLy8gZGVmYXVsdCAwMDowMDowMDowMDowMDowMAorY2hhciAqaG9zdG5hbWUgPSAiIjsJCSAgIC8vIGRlZmF1bHQgQ01QQworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMTIpCitNT0RVTEVfUEFSTSAobWFjLCAicyIpOworI2Vsc2UKK21vZHVsZV9wYXJhbSAobWFjLCBjaGFycCwgMCk7CisjZW5kaWYKK01PRFVMRV9QQVJNX0RFU0MgKG1hYywgInJ0Mjh4eDogd2lyZWxlc3MgbWFjIGFkZHIiKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcm90b3R5cGVzIG9mIEZ1bmN0aW9ucyBVc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitleHRlcm4gQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pOworZXh0ZXJuIHZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK2V4dGVybiBORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZmRlZiBSVDI4NjAKK2V4dGVybiB2b2lkIGluaXRfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisvLyBwdWJsaWMgZnVuY3Rpb24gcHJvdG90eXBlCitJTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKKwkJCQkJCQlJTiBVSU5UIGFyZ2MsIE9VVCBQUlRNUF9BREFQVEVSICpwcEFkKTsKKworLy8gcHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGUKK3N0YXRpYyBpbnQgcnQyOHh4X2luaXQoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworSU5UIHJ0Mjh4eF9zZW5kX3BhY2tldHMoSU4gc3RydWN0IHNrX2J1ZmYgKnNrYl9wLCBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMgkvLyBSZWQgSGF0IDcuMQorc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX25ldGRldigKKwlpbnQgc2l6ZW9mX3ByaXYsCisJY29uc3QgY2hhciAqbWFzaywKKwl2b2lkICgqc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICopKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworc3RhdGljIHZvaWQgQ2ZnSW5pdEhvb2soUFJUTVBfQURBUFRFUiBwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitleHRlcm4JY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitleHRlcm4JY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKyNlbmRpZgorCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKKyAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IE1haW5WaXJ0dWFsSUZfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisJbmV0aWZfY2Fycmllcl9vZmYocEFkLT5uZXRfZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKworCVZJUlRVQUxfSUZfRE9XTihwQWQpOworCisJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKKworCXJldHVybiAwOyAvLyBjbG9zZSBvaworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE9wZW4gcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6CisJMS4gaWYgb3BlbiBmYWlsLCBrZXJuZWwgd2lsbCBub3QgY2FsbCB0aGUgY2xvc2UgZnVuY3Rpb24uCisJMi4gRnJlZSBtZW1vcnkgZm9yCisJCSgxKSBNbG1lIE1lbW9yeSBIYW5kbGVyOgkJTWxtZUhhbHQoKQorCQkoMikgVFggJiBSWDoJCQkJCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoKQorCQkoMykgQkEgUmVvcmRlcmluZzogCQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgTWFpblZpcnR1YWxJRl9vcGVuKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKworCWlmIChWSVJUVUFMX0lGX1VQKHBBZCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLy8gaW5jcmVhc2UgTU9EVUxFIHVzZSBjb3VudAorCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKwluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBydDI4eHhfY2xvc2UoSU4gUE5FVF9ERVYgZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKyAgICBSVE1QX0FEQVBURVIJKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJQk9PTEVBTiAJCUNhbmNlbGxlZCA9IEZBTFNFOworCVVJTlQzMgkJCWkgPSAwOworCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjh4eF9jbG9zZVxuIikpOworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisKKyNpZmRlZiBXRFNfU1VQUE9SVAorCVdkc0Rvd24ocEFkKTsKKyNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgUlQyODYwCisJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX0NMT1NFKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQkvLyBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsCisJCS8vIE5JQ0xvYWRGaXJtd2FyZSB3aWxsIGhhbmcgZm9yZXZlciB3aGVuIGludGVyZmFjZSBpcyB1cCBhZ2Fpbi4KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisgICAgICAgIHsKKwkJICAgIEFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworICAgICAgICB9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy8gc2VuZCBETFMtVEVBUl9ET1dOIG1lc3NhZ2UsCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJeworCQkJVUNIQVIgaTsKKworCQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCX0KKwkJCX0KKworCQkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCX0KKwkJCX0KKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWlmIChJTkZSQV9PTihwQWQpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJCXsKKwkJCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNSZXE7CisJCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQkJQ09QWV9NQUNfQUREUihEaXNSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJRGlzUmVxLlJlYXNvbiA9ICBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HOworCisJCQlNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCU1zZ0VsZW0tPk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLT5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBNc2dFbGVtKTsKKwkJCWtmcmVlKE1zZ0VsZW0pOworCisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQl9CisKKworI2lmZGVmIENDWF9TVVBQT1JUCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJkNhbmNlbGxlZCk7CisjZW5kaWYKKworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgJkNhbmNlbGxlZCk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCXsKKwkJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQgZm9yIGluZnJvbWluZyBpbnRlcmZhY2UgZG93bi4KKwkJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJCXdycXUuZGF0YS5mbGFncyA9IFJUX0lOVEVSRkFDRV9ET1dOOworCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKwkJfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCU1sbWVSYWRpb09mZihwQWQpOworI2lmZGVmIFJUMjg2MAorCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKworCWZvciAoaSA9IDAgOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKKwl7CisJCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpCisJCXsKKwkJCXByaW50aygiV2FpdGluZyBmb3IgVHhRdWV1ZVslZF0gZG9uZS4uLi4uLi4uLi5cbiIsIGkpOworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJfQorCX0KKworCS8vIFN0b3AgTWxtZSBzdGF0ZSBtYWNoaW5lCisJTWxtZUhhbHQocEFkKTsKKworCS8vIENsb3NlIGtlcm5lbCB0aHJlYWRzIG9yIHRhc2tsZXRzCisJa2lsbF90aHJlYWRfdGFzayhwQWQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJTWFjVGFibGVSZXNldChwQWQpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJTWVhc3VyZVJlcVRhYkV4aXQocEFkKTsKKwlUcGNSZXFUYWJFeGl0KHBBZCk7CisKKworI2lmZGVmIFJUMjg2MAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpCisJeworCQlOSUNEaXNhYmxlSW50ZXJydXB0KHBBZCk7CisJfQorCisJLy8gRGlzYWJsZSBSeCwgcmVnaXN0ZXIgdmFsdWUgc3VwcG9zZWQgd2lsbCByZW1haW4gYWZ0ZXIgcmVzZXQKKwlOSUNJc3N1ZVJlc2V0KHBBZCk7CisKKwkvLyBGcmVlIElSUQorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworCQkvLyBEZXJlZ2lzdGVyIGludGVycnVwdCBmdW5jdGlvbgorCQlSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCS8vIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycworCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UKKwliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7CisKKwlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKK30gLyogRW5kIG9mIHJ0Mjh4eF9jbG9zZSAqLworCitzdGF0aWMgaW50IHJ0Mjh4eF9pbml0KElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCVBSVE1QX0FEQVBURVIgCQkJcEFkID0gKFBSVE1QX0FEQVBURVIpbmV0X2Rldi0+bWxfcHJpdjsKKwlVSU5UCQkJCQlpbmRleDsKKwlVQ0hBUgkJCQkJVG1wUGh5OworCU5ESVNfU1RBVFVTCQkJCVN0YXR1czsKKwlVSU5UMzIgCQlNYWNDc3IwID0gMDsKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gQWxsb2NhdGUgQkEgUmVvcmRlcmluZyBtZW1vcnkKKwliYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQocEFkLCBNQVhfUkVPUkRFUklOR19NUERVX05VTSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBNYWtlIHN1cmUgTUFDIGdldHMgcmVhZHkuCisJaW5kZXggPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7CisJCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7CisKKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkgJiYgKHBBZC0+TUFDVmVyc2lvbiAhPSAweEZGRkZGRkZGKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTApOworCX0gd2hpbGUgKGluZGV4KysgPCAxMDApOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKKworCS8vIERpc2FibGUgRE1BCisJUlQyOFhYRE1BRGlzYWJsZShwQWQpOworCisKKwkvLyBMb2FkIDgwNTEgZmlybXdhcmUKKwlTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjE7CisJfQorCisJTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMocEFkKTsKKworCS8vIERpc2FibGUgaW50ZXJydXB0cyBoZXJlIHdoaWNoIGlzIGFzIHNvb24gYXMgcG9zc2libGUKKwkvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgbmV2ZXIgYmUgdHJ1ZS4gV2UgbWlnaHQgY29uc2lkZXIgdG8gcmVtb3ZlIGl0IGxhdGVyCisjaWZkZWYgUlQyODYwCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKSkKKwl7CisJCU5JQ0Rpc2FibGVJbnRlcnJ1cHQocEFkKTsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlTdGF0dXMgPSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIlJUTVBBbGxvY0RNQU1lbW9yeSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKworCS8vIGluaXRpYWxpemUgTUxNRQorCS8vCisKKwlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVJbml0IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJZ290byBlcnIyOworCX0KKworCS8vIEluaXRpYWxpemUgcEFkLT5TdGFDZmcsIHBBZC0+QXBDZmcsIHBBZC0+Q29tbW9uQ2ZnIHRvIG1hbnVmYWN0dXJlIGRlZmF1bHQKKwkvLworCVVzZXJDZmdJbml0KHBBZCk7CisKKworCVJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyMTsKKworCUNmZ0luaXRIb29rKHBBZCk7CisKKworI2lmZGVmIEJMT0NLX05FVF9JRgorCWluaXRibG9ja1F1ZXVlVGFiKHBBZCk7CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCU1lYXN1cmVSZXFUYWJJbml0KHBBZCk7CisJVHBjUmVxVGFiSW5pdChwQWQpOworCisJLy8KKwkvLyBJbml0IHRoZSBoYXJkd2FyZSwgd2UgbmVlZCB0byBpbml0IGFzaWMgYmVmb3JlIHJlYWQgcmVnaXN0cnksIG90aGVyd2lzZSBtYWMgcmVnaXN0ZXIgd2lsbCBiZSByZXNldAorCS8vCisJU3RhdHVzID0gTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBUUlVFKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNJbml0aWFsaXplQWRhcHRlciBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnIzOworCX0KKworCS8vIFJlYWQgcGFyYW1ldGVycyBmcm9tIENvbmZpZyBGaWxlCisJU3RhdHVzID0gUlRNUFJlYWRQYXJhbWV0ZXJzSG9vayhwQWQpOworCisJcHJpbnRrKCIxLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNSZWFkUmVnUGFyYW1ldGVycyBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIixTdGF0dXMpKTsKKwkJZ290byBlcnI0OworCX0KKworCisKKyAgIAkvL0luaXQgQmEgQ2FwYWJpbGl0eSBwYXJhbWV0ZXJzLgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJLy8gVVBkYXRhIHRvIEhUIElFCisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXByaW50aygiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisKKwkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIKKwlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsIG1hYyk7CisKKwlwcmludGsoIjMuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCisJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7IC8vcnQyODYwYgorCisJLy8gU2V0IFBIWSB0byBhcHByb3ByaWF0ZSBtb2RlCisJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIE5vIHZhbGlkIGNoYW5uZWxzLgorCWlmIChwQWQtPkNoYW5uZWxMaXN0TnVtID09IDApCisJeworCQlwcmludGsoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIik7CisJCWdvdG8gZXJyNDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwcmludGsoIk1DUyBTZXQgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCisgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0sCisgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCVZSX0lLQU5PU19GUF9Jbml0KHBBZC0+QXBDZmcuQnNzaWROdW0sIHBBZC0+UGVybWFuZW50QWRkcmVzcyk7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworCisJCS8vCisJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCisJLy8KKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCS8vIDgwNTEgZmlybXdhcmUgcmVxdWlyZSB0aGUgc2lnbmFsIGR1cmluZyBib290aW5nIHRpbWUuCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweEZGLCAweDAwLCAweDAwKTsKKworCWlmIChwQWQgJiYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKKwl7CisJCS8vCisJCS8vIFVuZG8gZXZlcnl0aGluZyBpZiBpdCBmYWlsZWQKKwkJLy8KKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwkJeworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKwkJfQorCX0KKwllbHNlIGlmIChwQWQpCisJeworCQkvLyBNaWNyb3NvZnQgSENUIHJlcXVpcmUgZHJpdmVyIHNlbmQgYSBkaXNjb25uZWN0IGV2ZW50IGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4KKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCIVxuIikpOworCisKKwl9Ly8gZW5kIG9mIGVsc2UKKworCisJREJHUFJJTlRfUyhTdGF0dXMsICgiPD09PT0gUlRNUEluaXRpYWxpemUsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisKKwlyZXR1cm4gVFJVRTsKKworCitlcnI0OgorZXJyMzoKKwlNbG1lSGFsdChwQWQpOworZXJyMjoKKwlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7CitlcnIxOgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPm1wZHVfYmxrX3Bvb2wubWVtKTsgLy8gZnJlZSBCQSBwb29sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpOworCisJLy8gc2hhbGwgbm90IHNldCBtbF9wcml2IHRvIE5VTEwgaGVyZSBiZWNhdXNlIHRoZSBtbF9wcml2IGRpZG4ndCBiZWVuIGZyZWUgeWV0LgorCS8vbmV0X2Rldi0+bWxfcHJpdiA9IDA7CisjaWZkZWYgSU5GX0FNQVpPTl9TRQorZXJyMDoKKyNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCisJcHJpbnRrKCIhISEgJXMgSW5pdGlhbGl6ZWQgZmFpbCAhISFcbiIsIFJUMjh4eF9DSElQX05BTUUpOworCXJldHVybiBGQUxTRTsKK30gLyogRW5kIG9mIHJ0Mjh4eF9pbml0ICovCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBPcGVuIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCWludCByZXR2YWwgPSAwOworIAlQT1NfQ09PS0lFIHBPYmo7CisKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtMTsKKwl9CisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJeworCQlDV19NQVhfSU5fQklUUyA9IDY7CisJfQorCWVsc2UgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJeworCQlDV19NQVhfSU5fQklUUyA9IDEwOworCX0KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwkJCW5ldF9kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOworCQllbHNlIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisJfQorI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCA+PSAxMiAvLworI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyAgICAJLy8gSWYgZGlydmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLAorICAgIAkvLyBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uCisgICAgCS8vIFJUMjg2MCBQQ0kKKyAgICAJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkgJiYKKyAgICAgICAgCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICAJeworICAgICAgICAJQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworICAgICAgICAJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkgICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKyAgICAgICAgCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworICAgIAl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gSW5pdAorIAlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwkvLyByZXNldCBBZGFwdGVyIGZsYWdzCisJUlRNUF9DTEVBUl9GTEFHUyhwQWQpOworCisJLy8gUmVxdWVzdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBQQ0kgZGV2aWNlCisJLy8gcmVnaXN0ZXIgdGhlIGludGVycnVwdCByb3V0aW5lIHdpdGggdGhlIG9zCisJUlQyOFhYX0lSUV9SRVFVRVNUKG5ldF9kZXYpOworCisKKwkvLyBJbml0IEJzc1RhYiAmIENoYW5uZWxJbmZvIHRhYmJsZXMgZm9yIGF1dG8gY2hhbm5lbCBzZWxlY3QuCisKKworCS8vIENoaXAgJiBvdGhlciBpbml0CisJaWYgKHJ0Mjh4eF9pbml0KG5ldF9kZXYpID09IEZBTFNFKQorCQlnb3RvIGVycjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgbmV0X2Rldi0+bmFtZSwgc3RybGVuKG5ldF9kZXYtPm5hbWUpKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBTZXQgdXAgdGhlIE1hYyBhZGRyZXNzCisJTmRpc01vdmVNZW1vcnkobmV0X2Rldi0+ZGV2X2FkZHIsICh2b2lkICopIHBBZC0+Q3VycmVudEFkZHJlc3MsIDYpOworCisJLy8gSW5pdCBJUlEgcGFyYW1ldGVycworCVJUMjhYWF9JUlFfSU5JVChwQWQpOworCisJLy8gVmFyaW91cyBBUCBmdW5jdGlvbiBpbml0CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCXsKKwkJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQgZm9yIGluZnJvbWluZyBpbnRlcmZhY2UgZG93bi4KKwkJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJCXdycXUuZGF0YS5mbGFncyA9IFJUX0lOVEVSRkFDRV9VUDsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIEVuYWJsZSBJbnRlcnJ1cHQKKwlSVDI4WFhfSVJRX0VOQUJMRShwQWQpOworCisJLy8gTm93IEVuYWJsZSBSeFR4CisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7CisKKwl7CisJVUlOVDMyIHJlZyA9IDA7CisJUlRNUF9JT19SRUFEMzIocEFkLCAweDEzMDAsICZyZWcpOyAgLy8gY2xlYXIgZ2FyYmFnZSBpbnRlcnJ1cHRzCisJcHJpbnRrKCIweDEzMDAgPSAlMDh4XG4iLCByZWcpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFJUMjg2MAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisgICAgICAgIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUocEFkKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiAocmV0dmFsKTsKKworZXJyOgorCXJldHVybiAoLTEpOworfSAvKiBFbmQgb2YgcnQyOHh4X29wZW4gKi8KKworCisvKiBNdXN0IG5vdCBiZSBjYWxsZWQgZm9yIG1kZXYgYW5kIGFwZGV2ICovCitzdGF0aWMgTkRJU19TVEFUVVMgcnRfaWVlZTgwMjExX2lmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5ESVNfU1RBVFVTIFN0YXR1czsKKwlJTlQgICAgIGk9MDsKKwlDSEFSICAgIHNsb3RfbmFtZVtJRk5BTVNJWl07CisJc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2aWNlOworCisKKwkvL2V0aGVyX3NldHVwKGRldik7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBydDI4eHhfc2VuZF9wYWNrZXRzOworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gSUtBTk9TX0RhdGFGcmFtZXNUeDsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwl7CisJCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCX0KKyNlbmRpZiAvL1dJUkVMRVNTX0VYVCA+PSAxMgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCXsKKwkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7CisJfQorI2VuZGlmIC8vV0lSRUxFU1NfRVhUID49IDEyCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA8IDIxCisJCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZgorCWRldi0+Z2V0X3N0YXRzID0gUlQyOHh4X2dldF9ldGhlcl9zdGF0czsKKwlkZXYtPm9wZW4gPSBNYWluVmlydHVhbElGX29wZW47IC8vcnQyOHh4X29wZW47CisJZGV2LT5zdG9wID0gTWFpblZpcnR1YWxJRl9jbG9zZTsgLy9ydDI4eHhfY2xvc2U7CisJZGV2LT5wcml2X2ZsYWdzID0gSU5UX01BSU47CisJZGV2LT5kb19pb2N0bCA9IHJ0Mjh4eF9pb2N0bDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorICAgIGRldi0+dmFsaWRhdGVfYWRkciA9IE5VTEw7CisjZW5kaWYKKwkvLyBmaW5kIGF2YWlsYWJsZSBkZXZpY2UgbmFtZQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCQlpZiAocEFkLT5NQ19Sb3dJRCA+PSAwKQorCQkJc3ByaW50ZihzbG90X25hbWUsICJyYSUwMmRfJWQiLCBwQWQtPk1DX1Jvd0lELCBpKTsKKwkJZWxzZQorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCQlzcHJpbnRmKHNsb3RfbmFtZSwgInJhJWQiLCBpKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjYpCisgICAgICAgIGRldmljZSA9IGRldl9nZXRfYnlfbmFtZShkZXZfbmV0KGRldiksIHNsb3RfbmFtZSk7CisjZWxzZQorICAgICAgICBkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoZGV2LT5uZF9uZXQsIHNsb3RfbmFtZSk7CisjZW5kaWYKKyNlbHNlCisJCWRldmljZSA9IGRldl9nZXRfYnlfbmFtZShzbG90X25hbWUpOworI2VuZGlmCisJCWlmIChkZXZpY2UgIT0gTlVMTCkgZGV2X3B1dChkZXZpY2UpOworI2Vsc2UKKwkJZm9yIChkZXZpY2UgPSBkZXZfYmFzZTsgZGV2aWNlICE9IE5VTEw7IGRldmljZSA9IGRldmljZS0+bmV4dCkKKwkJeworCQkJaWYgKHN0cm5jbXAoZGV2aWNlLT5uYW1lLCBzbG90X25hbWUsIDQpID09IDApCisJCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlpZihkZXZpY2UgPT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKworCWlmKGkgPT0gOCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5vIGF2YWlsYWJsZSBzbG90IG5hbWVcbiIpKTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKHBBZC0+TUNfUm93SUQgPj0gMCkKKwkgICAgICAgIHNwcmludGYoZGV2LT5uYW1lLCAicmElMDJkXyVkIiwgcEFkLT5NQ19Sb3dJRCwgaSk7CisJCWVsc2UKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJc3ByaW50ZihkZXYtPm5hbWUsICJyYSVkIiwgaSk7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFN0YXR1czsKKworfQorCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgR2V0IGNhcmQgcHJvZmlsZSBwYXRoLgorCitBcmd1bWVudHM6CisgICAgcEFkCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQktIEZpbmQgYSBjYXJkIHByb2ZpbGUKKwlGQUxTRQkJLSB1c2UgZGVmYXVsdCBwcm9maWxlCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitleHRlcm4gSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXIoCisgICAgSU4gIFBDSEFSICAga2V5LAorICAgIE9VVCBQQ0hBUiAgIGRlc3QsCisgICAgSU4gIElOVCAgICAgZGVzdHNpemUsCisgICAgSU4gIFBDSEFSICAgYnVmZmVyKTsKKworQk9PTEVBTiBSVE1QX0NhcmRJbmZvUmVhZCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyNkZWZpbmUgTUNfU0VMRUNUX0NBUkRJRAkJMAkvKiB1c2UgQ0FSRCBJRCAoMCB+IDMxKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKyNkZWZpbmUgTUNfU0VMRUNUX01BQwkJCTEJLyogdXNlIENBUkQgTUFDIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBjYXJkcyAqLworI2RlZmluZSBNQ19TRUxFQ1RfQ0FSRFRZUEUJCTIJLyogdXNlIENBUkQgdHlwZSAoYWJnbiBvciBiZ24pIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBjYXJkcyAqLworCisjZGVmaW5lIExFVFRFUl9DQVNFX1RSQU5TTEFURSh0eHRfcCwgY2FyZF9pZCkJCQlcCisJewlVSU5UMzIgX2xlbjsgY2hhciBfY2hhcjsJCQkJCQlcCisJCWZvcihfbGVuPTA7IF9sZW48c3RybGVuKGNhcmRfaWQpOyBfbGVuKyspIHsJCVwKKwkJCV9jaGFyID0gKih0eHRfcCArIF9sZW4pOwkJCQkJXAorCQkJaWYgKCgnQScgPD0gX2NoYXIpICYmIChfY2hhciA8PSAnWicpKQkJXAorCQkJCSoodHh0X3ArX2xlbikgPSAnYScrKF9jaGFyLSdBJyk7CQlcCisJCX0gfQorCisJc3RydWN0IGZpbGUgKnNyY2Y7CisJSU5UIHJldHZhbCwgb3JnZnN1aWQsIG9yZ2ZzZ2lkOworICAgCW1tX3NlZ21lbnRfdCBvcmdmczsKKwlDSEFSICpidWZmZXIsICp0bXBidWYsIGNhcmRfaWRfYnVmWzMwXSwgUkZJQ193b3JkWzMwXTsKKwlCT09MRUFOIGZsZ19tYXRjaF9vayA9IEZBTFNFOworCUlOVDMyIGNhcmRfc2VsZWN0X21ldGhvZDsKKwlJTlQzMiBjYXJkX2ZyZWVfaWQsIGNhcmRfbm91c2VfaWQsIGNhcmRfc2FtZV9tYWNfaWQsIGNhcmRfbWF0Y2hfaWQ7CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgYW50ZW5uYTsKKwlVU0hPUlQgYWRkcjAxLCBhZGRyMjMsIGFkZHI0NTsKKwlVSU5UOCBtYWNbNl07CisJVUlOVDMyIGRhdGEsIGNhcmRfaW5kZXg7CisJVUNIQVIgKnN0YXJ0X3B0cjsKKworCisJLy8gaW5pdAorCWJ1ZmZlciA9IGttYWxsb2MoTUFYX0lOSV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmIChidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisJdG1wYnVmID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZih0bXBidWYgPT0gTlVMTCkKKwl7CisJCWtmcmVlKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCW9yZ2ZzdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJb3JnZnNnaWQgPSBjdXJyZW50LT5mc2dpZDsKKwljdXJyZW50LT5mc3VpZCA9IGN1cnJlbnQtPmZzZ2lkID0gMDsKKyAgICBvcmdmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworCisJLy8gZ2V0IFJGIElDIHR5cGUKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZkYXRhKTsKKworCWlmICgoZGF0YSAmIDB4MzApID09IDApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CS8vIDkzQzQ2CisJZWxzZSBpZiAoKGRhdGEgJiAweDMwKSA9PSAweDEwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvLyA5M0M2NgorCWVsc2UKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLy8gOTNDODYKKworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX05JQzFfT0ZGU0VULCBhbnRlbm5hLndvcmQpOworCisJaWYgKChhbnRlbm5hLmZpZWxkLlJmSWNUeXBlID09IFJGSUNfMjg1MCkgfHwKKwkJKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yNzUwKSkKKwl7CisJCS8qIEFCR04gY2FyZCAqLworCQlzdHJjcHkoUkZJQ193b3JkLCAiYWJnbiIpOworCX0KKwllbHNlCisJeworCQkvKiBCR04gY2FyZCAqLworCQlzdHJjcHkoUkZJQ193b3JkLCAiYmduIik7CisJfQorCisJLy8gZ2V0IE1BQyBhZGRyZXNzCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA0LCBhZGRyMDEpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNiwgYWRkcjIzKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgsIGFkZHI0NSk7CisKKwltYWNbMF0gPSAoVUNIQVIpKGFkZHIwMSAmIDB4ZmYpOworCW1hY1sxXSA9IChVQ0hBUikoYWRkcjAxID4+IDgpOworCW1hY1syXSA9IChVQ0hBUikoYWRkcjIzICYgMHhmZik7CisJbWFjWzNdID0gKFVDSEFSKShhZGRyMjMgPj4gOCk7CisJbWFjWzRdID0gKFVDSEFSKShhZGRyNDUgJiAweGZmKTsKKwltYWNbNV0gPSAoVUNIQVIpKGFkZHI0NSA+PiA4KTsKKworCS8vIG9wZW4gY2FyZCBpbmZvcm1hdGlvbiBmaWxlCisJc3JjZiA9IGZpbHBfb3BlbihDQVJEX0lORk9fUEFUSCwgT19SRE9OTFksIDApOworCWlmIChJU19FUlIoc3JjZikpCisJeworCQkvKiBjYXJkIGluZm9ybWF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QgKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSwgQ0FSRF9JTkZPX1BBVEgpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPnJlYWQpCisJeworCQkvKiBjYXJkIGluZm9ybWF0aW9uIGZpbGUgZXhpc3RzIHNvIHJlYWRpbmcgdGhlIGNhcmQgaW5mb3JtYXRpb24gKi8KKwkJbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7CisJCXJldHZhbCA9IHNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFLCAmc3JjZi0+Zl9wb3MpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJeworCQkJLyogcmVhZCBmYWlsICovCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSgiLS0+IFJlYWQgJXMgZXJyb3IgJWRcbiIsIENBUkRfSU5GT19QQVRILCAtcmV0dmFsKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBnZXQgY2FyZCBzZWxlY3Rpb24gbWV0aG9kICovCisJCQltZW1zZXQodG1wYnVmLCAweDAwLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRUWVBFOyAvLyBkZWZhdWx0CisKKwkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJTRUxFQ1QiLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKKwkJCXsKKwkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkNBUkRJRCIpID09IDApCisJCQkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJESUQ7CisJCQkJZWxzZSBpZiAoc3RyY21wKHRtcGJ1ZiwgIk1BQyIpID09IDApCisJCQkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9NQUM7CisJCQkJZWxzZSBpZiAoc3RyY21wKHRtcGJ1ZiwgIkNBUkRUWVBFIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRUWVBFOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCJNQz4gQ2FyZCBTZWxlY3Rpb24gPSAlZFxuIiwgY2FyZF9zZWxlY3RfbWV0aG9kKSk7CisKKwkJCS8vIGluaXQKKwkJCWNhcmRfZnJlZV9pZCA9IC0xOworCQkJY2FyZF9ub3VzZV9pZCA9IC0xOworCQkJY2FyZF9zYW1lX21hY19pZCA9IC0xOworCQkJY2FyZF9tYXRjaF9pZCA9IC0xOworCisJCQkvLyBzZWFyY2ggY3VycmVudCBjYXJkIGluZm9ybWF0aW9uIHJlY29yZHMKKwkJCWZvcihjYXJkX2luZGV4PTA7CisJCQkJY2FyZF9pbmRleDxNQVhfTlVNX09GX01VTFRJUExFX0NBUkQ7CisJCQkJY2FyZF9pbmRleCsrKQorCQkJeworCQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgorCQkJCQkoKihVSU5UMTYgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVs0XSA9PSAwKSkKKwkJCQl7CisJCQkJCS8vIE1BQyBpcyBhbGwtMCBzbyB0aGUgZW50cnkgaXMgYXZhaWxhYmxlCisJCQkJCU1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID0gMDsKKworCQkJCQlpZiAoY2FyZF9mcmVlX2lkIDwgMCkKKwkJCQkJCWNhcmRfZnJlZV9pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBmcmVlIGVudHJ5CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChtZW1jbXAoTUNfQ2FyZE1hY1tjYXJkX2luZGV4XSwgbWFjLCA2KSA9PSAwKQorCQkJCQl7CisJCQkJCQkvLyB3ZSBmaW5kIHRoZSBlbnRyeSB3aXRoIHNhbWUgTUFDCisJCQkJCQlpZiAoY2FyZF9zYW1lX21hY19pZCA8IDApCisJCQkJCQkJY2FyZF9zYW1lX21hY19pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBzYW1lIGVudHJ5CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvLyBNQUMgaXMgbm90IGFsbC0wIGJ1dCB1c2VkIGZsYWcgPT0gMAorCQkJCQkJaWYgKChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKSAmJgorCQkJCQkJCShjYXJkX25vdXNlX2lkIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJY2FyZF9ub3VzZV9pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBhdmFpbGFibGUgZW50cnkKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSgiTUM+IEZyZWUgPSAlZCwgU2FtZSA9ICVkLCBOT1VTRSA9ICVkXG4iLAorCQkJCQljYXJkX2ZyZWVfaWQsIGNhcmRfc2FtZV9tYWNfaWQsIGNhcmRfbm91c2VfaWQpKTsKKworCQkJaWYgKChjYXJkX3NhbWVfbWFjX2lkID49IDApICYmCisJCQkJKChjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRJRCkgfHwKKwkJCQkoY2FyZF9zZWxlY3RfbWV0aG9kID09IE1DX1NFTEVDVF9DQVJEVFlQRSkpKQorCQkJeworCQkJCS8vIHNhbWUgTUFDIGVudHJ5IGlzIGZvdW5kCisJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfc2FtZV9tYWNfaWQ7CisKKwkJCQlpZiAoY2FyZF9zZWxlY3RfbWV0aG9kID09IE1DX1NFTEVDVF9DQVJEVFlQRSkKKwkJCQl7CisJCQkJCS8vIGZvciBDQVJEVFlQRQorCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAorCQkJCQkJCWNhcmRfbWF0Y2hfaWQsIFJGSUNfd29yZCk7CisKKwkJCQkJaWYgKChzdGFydF9wdHI9cnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLCBjYXJkX2lkX2J1ZikpICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJCS8vIHdlIGZvdW5kIHRoZSBjYXJkIElECisJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gdGhlIGNhcmQgaXMgMXN0IHBsdWctaW4sIHRyeSB0byBmaW5kIHRoZSBtYXRjaCBjYXJkIHByb2ZpbGUKKwkJCQlzd2l0Y2goY2FyZF9zZWxlY3RfbWV0aG9kKQorCQkJCXsKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRElEOiAvLyBDQVJESUQKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmIChjYXJkX2ZyZWVfaWQgPj0gMCkKKwkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9mcmVlX2lkOworCQkJCQkJZWxzZQorCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX25vdXNlX2lkOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfTUFDOiAvLyBNQUMKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICJNQUMlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkJCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sCisJCQkJCQkJCW1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworCisJCQkJCQkvKiB0cnkgdG8gZmluZCB0aGUga2V5IHdvcmQgaW4gdGhlIGNhcmQgZmlsZSAqLworCQkJCQkJaWYgKChzdGFydF9wdHI9cnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLCBjYXJkX2lkX2J1ZikpICE9IE5VTEwpCisJCQkJCQl7CisJCQkJCQkJTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHN0YXJ0X3B0ciwgY2FyZF9pZF9idWYpOworCisJCQkJCQkJLyogZ2V0IHRoZSByb3cgSUQgKDIgQVNDSUkgY2hhcmFjdGVycykgKi8KKwkJCQkJCQlzdGFydF9wdHIgLT0gMjsKKwkJCQkJCQljYXJkX2lkX2J1ZlswXSA9ICooc3RhcnRfcHRyKTsKKwkJCQkJCQljYXJkX2lkX2J1ZlsxXSA9ICooc3RhcnRfcHRyKzEpOworCQkJCQkJCWNhcmRfaWRfYnVmWzJdID0gMHgwMDsKKworCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBzaW1wbGVfc3RydG9sKGNhcmRfaWRfYnVmLCAwLCAxMCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJEVFlQRTogLy8gQ0FSRFRZUEUKKwkJCQkJCWNhcmRfbm91c2VfaWQgPSAtMTsKKworCQkJCQkJZm9yKGNhcmRfaW5kZXg9MDsKKwkJCQkJCQljYXJkX2luZGV4PE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRDsKKwkJCQkJCQljYXJkX2luZGV4KyspCisJCQkJCQl7CisJCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJEVFlQRSVzIiwKKwkJCQkJCQkJCWNhcmRfaW5kZXgsIFJGSUNfd29yZCk7CisKKwkJCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsCisJCQkJCQkJCQkJCQkJCWNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJCQl7CisJCQkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKKworCQkJCQkJCQlpZiAoTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPT0gMCkKKwkJCQkJCQkJeworCQkJCQkJCQkJLyogY3VycmVudCB0aGUgY2FyZCBwcm9maWxlIGlzIG5vdCB1c2VkICovCisJCQkJCQkJCQlpZiAoKCooVUlOVDMyICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bMF0gPT0gMCkgJiYKKwkJCQkJCQkJCQkoKihVSU5UMTYgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVs0XSA9PSAwKSkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQkvLyBmaW5kIGl0IGFuZCBubyBwcmV2aW91cyBjYXJkIHVzZSBpdAorCQkJCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX2luZGV4OworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vIGV2ZXIgYSBjYXJkIHVzZSBpdAorCQkJCQkJCQkJCWlmIChjYXJkX25vdXNlX2lkIDwgMCkKKwkJCQkJCQkJCQkJY2FyZF9ub3VzZV9pZCA9IGNhcmRfaW5kZXg7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIGlmIG5vdCBmaW5kIGEgZnJlZSBvbmUsIHVzZSB0aGUgYXZhaWxhYmxlIG9uZQorCQkJCQkJaWYgKGNhcmRfbWF0Y2hfaWQgPCAwKQorCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX25vdXNlX2lkOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY2FyZF9tYXRjaF9pZCA+PSAwKQorCQkJeworCQkJCS8vIG1ha2UgdXAgc2VhcmNoIGtleXdvcmQKKwkJCQlzd2l0Y2goY2FyZF9zZWxlY3RfbWV0aG9kKQorCQkJCXsKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRElEOiAvLyBDQVJESUQKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRElEIiwgY2FyZF9tYXRjaF9pZCk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9NQUM6IC8vIE1BQworCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwKKwkJCQkJCQkJIiUwMmRtYWMlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkJCQkJCWNhcmRfbWF0Y2hfaWQsCisJCQkJCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sCisJCQkJCQkJCW1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRFRZUEU6IC8vIENBUkRUWVBFCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZGNhcmR0eXBlJXMiLAorCQkJCQkJCQljYXJkX21hdGNoX2lkLCBSRklDX3dvcmQpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VhcmNoIEtleXdvcmQgPSAlc1xuIiwgY2FyZF9pZF9idWYpKTsKKworCQkJCS8vIHJlYWQgY2FyZCBmaWxlIHBhdGgKKwkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcihjYXJkX2lkX2J1ZiwgdG1wYnVmLCAyNTYsIGJ1ZmZlcikpCisJCQkJeworCQkJCQlpZiAoc3RybGVuKHRtcGJ1ZikgPCBzaXplb2YocEFkLT5NQ19GaWxlTmFtZSkpCisJCQkJCXsKKwkJCQkJCS8vIGJhY2t1cCBjYXJkIGluZm9ybWF0aW9uCisJCQkJCQlwQWQtPk1DX1Jvd0lEID0gY2FyZF9tYXRjaF9pZDsgLyogYmFzZSAwICovCisJCQkJCQlNQ19DYXJkVXNlZFtjYXJkX21hdGNoX2lkXSA9IDE7CisJCQkJCQltZW1jcHkoTUNfQ2FyZE1hY1tjYXJkX21hdGNoX2lkXSwgbWFjLCBzaXplb2YobWFjKSk7CisKKwkJCQkJCS8vIGJhY2t1cCBjYXJkIGZpbGUgcGF0aAorCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NQ19GaWxlTmFtZSwgdG1wYnVmICwgc3RybGVuKHRtcGJ1ZikpOworCQkJCQkJcEFkLT5NQ19GaWxlTmFtZVtzdHJsZW4odG1wYnVmKV0gPSAnXDAnOworCQkJCQkJZmxnX21hdGNoX29rID0gVFJVRTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJCSgiQ2FyZCBQcm9maWxlIE5hbWUgPSAlc1xuIiwgcEFkLT5NQ19GaWxlTmFtZSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJCSgiQ2FyZCBQcm9maWxlIE5hbWUgbGVuZ3RoIHRvbyBsYXJnZSFcbiIpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkoIkNhbiBub3QgZmluZCBzZWFyY2gga2V5IHdvcmQgaW4gY2FyZC5kYXQhXG4iKSk7CisJCQkJfQorCisJCQkJaWYgKChmbGdfbWF0Y2hfb2sgIT0gVFJVRSkgJiYKKwkJCQkJKGNhcmRfbWF0Y2hfaWQgPCBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQpKQorCQkJCXsKKwkJCQkJTUNfQ2FyZFVzZWRbY2FyZF9tYXRjaF9pZF0gPSAwOworCQkJCQltZW1zZXQoTUNfQ2FyZE1hY1tjYXJkX21hdGNoX2lkXSwgMCwgc2l6ZW9mKG1hYykpOworCQkJCX0KKwkJCX0gLy8gaWYgKGNhcmRfbWF0Y2hfaWQgPj0gMCkKKwkJfQorCX0KKworCS8vIGNsb3NlIGZpbGUKKwlyZXR2YWwgPSBmaWxwX2Nsb3NlKHNyY2YsIE5VTEwpOworCXNldF9mcyhvcmdmcyk7CisJY3VycmVudC0+ZnN1aWQgPSBvcmdmc3VpZDsKKwljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOworCWtmcmVlKGJ1ZmZlcik7CisJa2ZyZWUodG1wYnVmKTsKKwlyZXR1cm4gZmxnX21hdGNoX29rOworfQorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUHJvYmUgUlQyOFhYIGNoaXBzZXQuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisJX2Rldl9pZF9wCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlIElECisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlQcm9iZSBPSworCS1FTk9ERVYJCQkJUHJvYmUgRmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIF9fZGV2aW5pdCAgIHJ0Mjh4eF9wcm9iZSgKKyAgICBJTiAgdm9pZCAqX2Rldl9wLAorICAgIElOICB2b2lkICpfZGV2X2lkX3AsCisJSU4gIFVJTlQgYXJnYywKKwlPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCkKK3sKKyAgICBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXY7CisgICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgTlVMTDsKKyAgICBJTlQgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlQVk9JRAkJCQloYW5kbGU7CisjaWZkZWYgUlQyODYwCisJc3RydWN0IHBjaV9kZXYgKmRldl9wID0gKHN0cnVjdCBwY2lfZGV2ICopX2Rldl9wOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEEgRHJpdmVyIHZlcnNpb24tJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTikpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIgICAgICAgLy8gUmVkIEhhdCA3LjEKKyAgICBuZXRfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihQUlRNUF9BREFQVEVSKSwgImV0aCVkIiwgZXRoZXJfc2V0dXApOworI2Vsc2UKKyAgICBuZXRfZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKFBSVE1QX0FEQVBURVIpKTsKKyNlbmRpZgorICAgIGlmIChuZXRfZGV2ID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGsoImFsbG9jX25ldGRldiBmYWlsZWRcbiIpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisjZW5kaWYgLy9MSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTUpCisjZWxzZQorCQlNT0RfREVDX1VTRV9DT1VOVDsKKyNlbmRpZgorICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorICAgIFNFVF9NT0RVTEVfT1dORVIobmV0X2Rldik7CisjZW5kaWYKKworCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKy8qIGZvciBzdXBwb3J0aW5nIE5ldHdvcmsgTWFuYWdlciAqLworLyogU2V0IHRoZSBzeXNmcyBwaHlzaWNhbCBkZXZpY2UgcmVmZXJlbmNlIGZvciB0aGUgbmV0d29yayBsb2dpY2FsIGRldmljZQorICogaWYgc2V0IHByaW9yIHRvIHJlZ2lzdHJhdGlvbiB3aWxsIGNhdXNlIGEgc3ltbGluayBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKKyAgICBTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKGRldl9wLT5kZXYpKTsKKyNlbmRpZgorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgbWluaXBvcnQgYWRhcHRlciBzdHJ1Y3R1cmUKKwloYW5kbGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NfY29va2llKSwgR0ZQX0tFUk5FTCk7CisJUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApOworCisJc3RhdHVzID0gUlRNUEFsbG9jQWRhcHRlckJsb2NrKGhhbmRsZSwgJnBBZCk7CisJaWYgKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisKKwluZXRfZGV2LT5tbF9wcml2ID0gKFBWT0lEKXBBZDsKKyAgICBwQWQtPm5ldF9kZXYgPSBuZXRfZGV2OyAvLyBtdXN0IGJlIGJlZm9yZSBSVDI4WFhOZXREZXZJbml0KCkKKworCVJUMjhYWE5ldERldkluaXQoX2Rldl9wLCBuZXRfZGV2LCBwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBQb3N0IGNvbmZpZworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIGFyZ2MpID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisjZWxzZQorCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIDApID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCS8vIGZpbmQgaXRzIHByb2ZpbGUgcGF0aAorCXBBZC0+TUNfUm93SUQgPSAtMTsgLy8gdXNlIGRlZmF1bHQgcHJvZmlsZSBwYXRoCisJUlRNUF9DYXJkSW5mb1JlYWQocEFkKTsKKworCWlmIChwQWQtPk1DX1Jvd0lEID09IC0xKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlzdHJjcHkocEFkLT5NQ19GaWxlTmFtZSwgU1RBX1BST0ZJTEVfUEFUSCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSgiTUM+IFJPVyA9ICVkLCBQQVRIID0gJXNcbiIsIHBBZC0+TUNfUm93SUQsIHBBZC0+TUNfRmlsZU5hbWUpKTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCS8vIHNhbXBsZSBtb3ZlCisJaWYgKHJ0X2llZWU4MDIxMV9pZl9zZXR1cChuZXRfZGV2LCBwQWQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKworICAgIC8vIFJlZ2lzdGVyIHRoaXMgZGV2aWNlCisgICAgc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworICAgIGlmIChzdGF0dXMpCisgICAgICAgIGdvdG8gZXJyX291dF91bm1hcDsKKworICAgIC8vIFNldCBkcml2ZXIgZGF0YQorCVJUMjhYWF9EUlZEQVRBX1NFVChfZGV2X3ApOworCisJKnBwQWQgPSBwQWQ7CisgICAgcmV0dXJuIDA7IC8vIHByb2JlIG9rCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitlcnJfb3V0X3VubWFwOgorCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCVJUMjhYWF9VTk1BUCgpOworCitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyAgICBmcmVlX25ldGRldihuZXRfZGV2KTsKKyNlbHNlCisJa2ZyZWUobmV0X2Rldik7CisjZW5kaWYKKworZXJyX291dDoKKwlSVDI4WFhfUFVUX0RFVklDRShkZXZfcCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlyZXR1cm4gKExPTkcpTlVMTDsKKyNlbHNlCisgICAgcmV0dXJuIC1FTk9ERVY7IC8qIHByb2JlIGZhaWwgKi8KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KK30gLyogRW5kIG9mIHJ0Mjh4eF9wcm9iZSAqLworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgVGhlIGVudHJ5IHBvaW50IGZvciBMaW51eCBrZXJuZWwgc2VudCBwYWNrZXQgdG8gb3VyIGRyaXZlci4KKworQXJndW1lbnRzOgorICAgIHNrX2J1ZmYgKnNrYgkJdGhlIHBvaW50ZXIgcmVmZXIgdG8gYSBza19idWZmZXIuCisKK1JldHVybiBWYWx1ZToKKyAgICAwCisKK05vdGU6CisJVGhpcyBmdW5jdGlvbiBpcyB0aGUgZW50cnkgcG9pbnQgb2YgVHggUGF0aCBmb3IgT3MgZGVsaXZlcnkgcGFja2V0IHRvCisJb3VyIGRyaXZlci4gWW91IG9ubHkgY2FuIHB1dCBPUy1kZXBlbmVkICYgU1RBL0FQIGNvbW1vbiBoYW5kbGUgcHJvY2VkdXJlcworCWluIGhlcmUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgcnQyOHh4X3BhY2tldF94bWl0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBza2ItPmRldjsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJaW50IHN0YXR1cyA9IDA7CisJUE5ESVNfUEFDS0VUIHBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBza2I7CisKKwkvKiBSVDI4NzBTVEEgZG9lcyB0aGlzIGluIFJUTVBTZW5kUGFja2V0cygpICovCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19SRVNPVVJDRVMpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIHdlIGFyZSBpbiBtb25pdG9yIG1vZGUKKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJZ290byBkb25lOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgICAgIC8vIEVhcG9sU3RhcnQgc2l6ZSBpcyAxOAorCWlmIChza2ItPmxlbiA8IDE0KQorCXsKKwkJLy9wcmludGsoImJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIHBrdC0+bGVuKTsKKwkJaGV4X2R1bXAoImJhZCBwYWNrZXQiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlnb3RvIGRvbmU7CisJfQorCisJUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAwKTsKKyNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKKyAgICBpZiAoKihpbnQqKShza2ItPmNiKSA9PSBCUklER0VfVEFHKSB7CisJCVJUTVBfU0VUX1BBQ0tFVF81VlQocFBhY2tldCwgMSk7CisgICAgfQorI2VuZGlmCisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisKKwkJU1RBU2VuZFBhY2tldHMoKE5ESVNfSEFORExFKXBBZCwgKFBQTkRJU19QQUNLRVQpICZwUGFja2V0LCAxKTsKKwl9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXN0YXR1cyA9IDA7Citkb25lOgorCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFNlbmQgYSBwYWNrZXQgdG8gV0xBTi4KKworQXJndW1lbnRzOgorICAgIHNrYl9wICAgICAgICAgICBwb2ludHMgdG8gb3VyIGFkYXB0ZXIKKyAgICBkZXZfcCAgICAgICAgICAgd2hpY2ggV0xBTiBuZXR3b3JrIGludGVyZmFjZQorCitSZXR1cm4gVmFsdWU6CisgICAgMDogdHJhbnNtaXQgc3VjY2Vzc2Z1bGx5CisgICAgb3RoZXJ3aXNlOiB0cmFuc21pdCBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgcnQyOHh4X3NlbmRfcGFja2V0cygKKwlJTiBzdHJ1Y3Qgc2tfYnVmZiAJCSpza2JfcCwKKwlJTiBzdHJ1Y3QgbmV0X2RldmljZSAJKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCWlmICghKG5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwl7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCAoUE5ESVNfUEFDS0VUKXNrYl9wLCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmc2tiX3AtPmNiW0NCX09GRl0sIDE1KTsKKwlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoc2tiX3AsIE1BSU5fTUJTU0lEKTsKKworCXJldHVybiBydDI4eHhfcGFja2V0X3htaXQoc2tiX3ApOworCit9IC8qIEVuZCBvZiBNQlNTX1ZpcnR1YWxJRl9QYWNrZXRTZW5kICovCisKKworCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMgkvLyBSZWQgSGF0IDcuMQorc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX25ldGRldigKKwlpbnQgc2l6ZW9mX3ByaXYsCisJY29uc3QgY2hhciAqbWFzaywKKwl2b2lkICgqc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICopKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisgICAgSU5UCQkJCQlhbGxvY19zaXplOworCisKKyAgICAvKiBlbnN1cmUgMzItYnl0ZSBhbGlnbm1lbnQgb2YgdGhlIHByaXZhdGUgYXJlYSAqLworICAgIGFsbG9jX3NpemUgPSBzaXplb2YgKCpkZXYpICsgc2l6ZW9mX3ByaXYgKyAzMTsKKworICAgIGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBrbWFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOworICAgIGlmIChkZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSgiYWxsb2NfbmV0ZGV2OiBVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIG1lbW9yeS5cbiIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0KGRldiwgMCwgYWxsb2Nfc2l6ZSk7CisKKyAgICBpZiAoc2l6ZW9mX3ByaXYpCisgICAgICAgIGRldi0+cHJpdiA9ICh2b2lkICopICgoKGxvbmcpKGRldiArIDEpICsgMzEpICYgfjMxKTsKKworICAgIHNldHVwKGRldik7CisgICAgc3RyY3B5KGRldi0+bmFtZSwgbWFzayk7CisKKyAgICByZXR1cm4gZGV2OworfQorI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisKK3ZvaWQgQ2ZnSW5pdEhvb2soUFJUTVBfQURBUFRFUiBwQWQpCit7CisJcEFkLT5iQnJvYWRDb21IVCA9IFRSVUU7Cit9IC8qIEVuZCBvZiBDZmdJbml0SG9vayAqLworCisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCisgICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC0tLT5cbiIpKTsKKworCXBBZC0+aXdfc3RhdHMuc3RhdHVzID0gMDsgLy8gU3RhdHVzIC0gZGV2aWNlIGRlcGVuZGVudCBmb3Igbm93CisKKwkvLyBsaW5rIHF1YWxpdHkKKwlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9ICgocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ICogMTIpLzEwICsgMTApOworCWlmKHBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID4gMTAwKQorCQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9IDEwMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQlwQWQtPml3X3N0YXRzLnF1YWwubGV2ZWwgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcEFkLT5pd19zdGF0cy5xdWFsLm5vaXNlID0gcEFkLT5CYnBXcml0ZUxhdGNoWzY2XTsgLy8gbm9pc2UgbGV2ZWwgKGRCbSkKKworCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSArPSAyNTYgLSAxNDM7CisJcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgPSAxOyAgICAgLy8gRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkCisjaWZkZWYgSVdfUVVBTF9EQk0KKwlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0RCTTsJLy8gTGV2ZWwgKyBOb2lzZSBhcmUgZEJtCisjZW5kaWYgLy8gSVdfUVVBTF9EQk0gLy8KKworCXBBZC0+aXdfc3RhdHMuZGlzY2FyZC5ud2lkID0gMDsgICAgIC8vIFJ4IDogV3JvbmcgbndpZC9lc3NpZAorCXBBZC0+aXdfc3RhdHMubWlzcy5iZWFjb24gPSAwOyAgICAgIC8vIE1pc3NlZCBiZWFjb25zL3N1cGVyZnJhbWUKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0c1xuIikpOworCXJldHVybiAmcEFkLT5pd19zdGF0czsKK30gLyogRW5kIG9mIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgKi8KKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQgLy8KKworCisKK3ZvaWQgdGJ0dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKyNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKKworfQorCitJTlQgcnQyOHh4X2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCQkJY21kKQoreworCVZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUlRNUF9BREFQVEVSCSpwQWQgPSBOVUxMOworCUlOVAkJCQlyZXQgPSAwOworCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlyZXQgPSBydDI4eHhfc3RhX2lvY3RsKG5ldF9kZXYsIHJxLCBjbWQpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICByZXR1cm4gZXRoZXJuZXQgc3RhdGlzdGljcyBjb3VudGVyCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIG5ldF9kZXYgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG5ldF9kZXZpY2UKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgbmV0X2RldmljZV9zdGF0cyoKKworICAgIE5vdGU6CisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKKyAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBOVUxMOworCisJaWYgKG5ldF9kZXYpCisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwlpZiAocEFkKQorCXsKKworCQlwQWQtPnN0YXRzLnJ4X3BhY2tldHMgPSBwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisJCXBBZC0+c3RhdHMudHhfcGFja2V0cyA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKworCQlwQWQtPnN0YXRzLnJ4X2J5dGVzID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudDsKKwkJcEFkLT5zdGF0cy50eF9ieXRlcyA9IHBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisKKwkJcEFkLT5zdGF0cy5yeF9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeEVycm9yczsKKwkJcEFkLT5zdGF0cy50eF9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5UeEVycm9yczsKKworCQlwQWQtPnN0YXRzLnJ4X2Ryb3BwZWQgPSAwOworCQlwQWQtPnN0YXRzLnR4X2Ryb3BwZWQgPSAwOworCisJICAgIHBBZC0+c3RhdHMubXVsdGljYXN0ID0gcEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OyAgIC8vIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkCisJICAgIHBBZC0+c3RhdHMuY29sbGlzaW9ucyA9IHBBZC0+Q291bnRlcnM4MDIzLk9uZUNvbGxpc2lvbiArIHBBZC0+Q291bnRlcnM4MDIzLk1vcmVDb2xsaXNpb25zOyAgLy8gQ29sbGlzaW9uIHBhY2tldHMKKworCSAgICBwQWQtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsgICAgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93CisJICAgIHBBZC0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IDA7Ly9wQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50OyAgICAgLy8gcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvcgorCSAgICBwQWQtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJjdkFsaWdubWVudEVycm9yczsgICAgICAgICAgLy8gcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvcgorCSAgICBwQWQtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsgICAgICAgICAgICAgICAgICAgLy8gcmVjdidyIGZpZm8gb3ZlcnJ1bgorCSAgICBwQWQtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZXIgbWlzc2VkIHBhY2tldAorCisJICAgIC8vIGRldGFpbGVkIHR4X2Vycm9ycworCSAgICBwQWQtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfZmlmb19lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSAwOworCisJICAgIC8vIGZvciBjc2xpcCBldGMKKwkgICAgcEFkLT5zdGF0cy5yeF9jb21wcmVzc2VkID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9jb21wcmVzc2VkID0gMDsKKworCQlyZXR1cm4gJnBBZC0+c3RhdHM7CisJfQorCWVsc2UKKyAgICAJcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3ZmZjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jCkBAIC0wLDAgKzEsMTk4MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgdm9pZCBIVFBhcmFtZXRlcnNIb29rKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCSAgKnBWYWx1ZVN0ciwKKwlJTglDSEFSCQkgICpwSW5wdXQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjZGVmaW5lIEVUSF9NQUNfQUREUl9TVFJfTEVOIDE3ICAvLyBpbiBmb3JtYXQgb2YgeHg6eHg6eHg6eHg6eHg6eHgKKworLy8gV2UgYXNzdW1lIHRoZSBzMSBpcyBhIHN0aW5nLCBzMiBpcyBhIG1lbW9yeSBzcGFjZSB3aXRoIDYgYnl0ZXMuIGFuZCBjb250ZW50IG9mIHMxIHdpbGwgYmUgY2hhbmdlZC4KK0JPT0xFQU4gcnRzdHJtYWN0b2hleChjaGFyICpzMSwgY2hhciAqczIpCit7CisJaW50IGkgPSAwOworCWNoYXIgKnB0b2tTID0gczEsICpwdG9rRSA9IHMxOworCisJaWYgKHN0cmxlbihzMSkgIT0gRVRIX01BQ19BRERSX1NUUl9MRU4pCisJCXJldHVybiBGQUxTRTsKKworCXdoaWxlKCgqcHRva1MpICE9ICdcMCcpCisJeworCQlpZigocHRva0UgPSBzdHJjaHIocHRva1MsICc6JykpICE9IE5VTEwpCisJCQkqcHRva0UrKyA9ICdcMCc7CisJCWlmICgoc3RybGVuKHB0b2tTKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCpwdG9rUykpIHx8ICghaXN4ZGlnaXQoKihwdG9rUysxKSkpKQorCQkJYnJlYWs7IC8vIGZhaWwKKwkJQXRvSChwdG9rUywgJnMyW2krK10sIDEpOworCQlwdG9rUyA9IHB0b2tFOworCQlpZiAoaSA9PSA2KQorCQkJYnJlYWs7IC8vIHBhcnNpbmcgZmluaXNoZWQKKwl9CisKKwlyZXR1cm4gKCBpID09IDYgPyBUUlVFIDogRkFMU0UpOworCit9CisKKworLy8gd2UgYXNzdW1lIHRoZSBzMSBhbmQgczIgYm90aCBhcmUgc3RyaW5ncy4KK0JPT0xFQU4gcnRzdHJjYXNlY21wKGNoYXIgKnMxLCBjaGFyICpzMikKK3sKKwljaGFyICpwMSA9IHMxLCAqcDIgPSBzMjsKKworCWlmIChzdHJsZW4oczEpICE9IHN0cmxlbihzMikpCisJCXJldHVybiBGQUxTRTsKKworCXdoaWxlKCpwMSAhPSAnXDAnKQorCXsKKwkJaWYoKCpwMSAhPSAqcDIpICYmICgoKnAxIF4gKnAyKSAhPSAweDIwKSkKKwkJCXJldHVybiBGQUxTRTsKKwkJcDErKzsKKwkJcDIrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gd2UgYXNzdW1lIHRoZSBzMSAoYnVmZmVyKSBhbmQgczIgKGtleSkgYm90aCBhcmUgc3RyaW5ncy4KK2NoYXIgKiBydHN0cnN0cnVuY2FzZWNtcChjaGFyICogczEsIGNoYXIgKiBzMikKK3sKKwlJTlQgbDEsIGwyLCBpOworCWNoYXIgdGVtcDEsIHRlbXAyOworCisJbDIgPSBzdHJsZW4oczIpOworCWlmICghbDIpCisJCXJldHVybiAoY2hhciAqKSBzMTsKKworCWwxID0gc3RybGVuKHMxKTsKKworCXdoaWxlIChsMSA+PSBsMikKKwl7CisJCWwxLS07CisKKwkJZm9yKGk9MDsgaTxsMjsgaSsrKQorCQl7CisJCQl0ZW1wMSA9ICooczEraSk7CisJCQl0ZW1wMiA9ICooczIraSk7CisKKwkJCWlmICgoJ2EnIDw9IHRlbXAxKSAmJiAodGVtcDEgPD0gJ3onKSkKKwkJCQl0ZW1wMSA9ICdBJysodGVtcDEtJ2EnKTsKKwkJCWlmICgoJ2EnIDw9IHRlbXAyKSAmJiAodGVtcDIgPD0gJ3onKSkKKwkJCQl0ZW1wMiA9ICdBJysodGVtcDItJ2EnKTsKKworCQkJaWYgKHRlbXAxICE9IHRlbXAyKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gbDIpCisJCQlyZXR1cm4gKGNoYXIgKikgczE7CisKKwkJczErKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsgLy8gbm90IGZvdW5kCit9CisKKy8vYWRkIGJ5IGthdGh5CisKKyAvKioKKyAgKiBzdHJzdHIgLSBGaW5kIHRoZSBmaXJzdCBzdWJzdHJpbmcgaW4gYSAlTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCisgICogQHMxOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgICogQHMyOiBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IKKyAgKi8KK2NoYXIgKiBydHN0cnN0cihjb25zdCBjaGFyICogczEsY29uc3QgY2hhciAqIHMyKQoreworCUlOVCBsMSwgbDI7CisKKwlsMiA9IHN0cmxlbihzMik7CisJaWYgKCFsMikKKwkJcmV0dXJuIChjaGFyICopIHMxOworCisJbDEgPSBzdHJsZW4oczEpOworCisJd2hpbGUgKGwxID49IGwyKQorCXsKKwkJbDEtLTsKKwkJaWYgKCFtZW1jbXAoczEsczIsbDIpKQorCQkJcmV0dXJuIChjaGFyICopIHMxOworCQlzMSsrOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHJzdHJ0b2sgLSBTcGxpdCBhIHN0cmluZyBpbnRvIHRva2VucworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBjdDogVGhlIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvcgorICogKiBXQVJOSU5HOiBzdHJ0b2sgaXMgZGVwcmVjYXRlZCwgdXNlIHN0cnNlcCBpbnN0ZWFkLiBIb3dldmVyIHN0cnNlcCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG9sZCBhcmNoaXRlY3R1cmUuCisgKi8KK2NoYXIgKiBfX3JzdHJ0b2s7CitjaGFyICogcnN0cnRvayhjaGFyICogcyxjb25zdCBjaGFyICogY3QpCit7CisJY2hhciAqc2JlZ2luLCAqc2VuZDsKKworCXNiZWdpbiAgPSBzID8gcyA6IF9fcnN0cnRvazsKKwlpZiAoIXNiZWdpbikKKwl7CisJCXJldHVybiBOVUxMOworCX0KKworCXNiZWdpbiArPSBzdHJzcG4oc2JlZ2luLGN0KTsKKwlpZiAoKnNiZWdpbiA9PSAnXDAnKQorCXsKKwkJX19yc3RydG9rID0gTlVMTDsKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCisJc2VuZCA9IHN0cnBicmsoIHNiZWdpbiwgY3QpOworCWlmIChzZW5kICYmICpzZW5kICE9ICdcMCcpCisJCSpzZW5kKysgPSAnXDAnOworCisJX19yc3RydG9rID0gc2VuZDsKKworCXJldHVybiAoc2JlZ2luKTsKK30KKworLyoqCisgKiBkZWxpbWl0Y250IC0gcmV0dXJuIHRoZSBjb3VudCBvZiBhIGdpdmVuIGRlbGltaXRlciBpbiBhIGdpdmVuIHN0cmluZy4KKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkLgorICogQGN0OiBUaGUgZGVsaW1pdGVyIHRvIHNlYXJjaCBmb3IuCisgKiBOb3RpY2UgOiBXZSBzdXBwb3NlIHRoZSBkZWxpbWl0ZXIgaXMgYSBzaW5nbGUtY2hhciBzdHJpbmcoZm9yIGV4YW1wbGUgOiAiOyIpLgorICovCitJTlQgZGVsaW1pdGNudChjaGFyICogcyxjb25zdCBjaGFyICogY3QpCit7CisJSU5UIGNvdW50ID0gMDsKKwkvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCisJY29uc3QgY2hhciAqdG9rZW4gPSBzOworCisJZm9yICggOzsgKQorCXsKKwkJdG9rZW4gPSBzdHJwYnJrKHRva2VuLCBjdCk7IC8qIHNlYXJjaCBmb3IgZGVsaW1pdGVycyAqLworCisgICAgICAgIGlmICggdG9rZW4gPT0gTlVMTCApCisJCXsKKwkJCS8qIGFkdmFuY2VkIHRvIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciAqLworCQkJYnJlYWs7CisJCX0KKwkJLyogc2tpcCB0aGUgZGVsaW1pdGVyICovCisJICAgICsrdG9rZW47CisKKwkJLyoKKwkJICogUHJpbnQgdGhlIGZvdW5kIHRleHQ6IHVzZSBsZW4gd2l0aCAlLipzIHRvIHNwZWNpZnkgZmllbGQgd2lkdGguCisJCSAqLworCisJCS8qIGFjY3VtdWxhdGUgZGVsaW1pdGVyIGNvdW50ICovCisJICAgICsrY291bnQ7CisJfQorICAgIHJldHVybiBjb3VudDsKK30KKworLyoKKyAgKiBjb252ZXJ0cyB0aGUgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGZyb20gdGhlIHN0YW5kYXJkIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24KKyAgKiBpbnRvIGJpbmFyeSBkYXRhLgorICAqIHJldHVybnMgbm9uemVybyBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgemVybyBpZiBub3QuCisgICovCitpbnQgcnRpbmV0X2F0b24oY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgCXZhbDsKKwlpbnQgICAgICAgICAJYmFzZSwgbjsKKwljaGFyICAgICAgICAJYzsKKwl1bnNpZ25lZCBpbnQgICAgcGFydHNbNF07CisJdW5zaWduZWQgaW50ICAgICpwcCA9IHBhcnRzOworCisJZm9yICg7OykKKyAgICB7CisgICAgICAgICAvKgorICAgICAgICAgICogQ29sbGVjdCBudW1iZXIgdXAgdG8gYGAuJycuCisgICAgICAgICAgKiBWYWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBmb3IgQzoKKyAgICAgICAgICAqCTB4PWhleCwgMD1vY3RhbCwgb3RoZXI9ZGVjaW1hbC4KKyAgICAgICAgICAqLworICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgIGJhc2UgPSAxMDsKKyAgICAgICAgIGlmICgqY3AgPT0gJzAnKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmICgqKytjcCA9PSAneCcgfHwgKmNwID09ICdYJykKKyAgICAgICAgICAgICAgICAgYmFzZSA9IDE2LCBjcCsrOworICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgICB9CisgICAgICAgICB3aGlsZSAoKGMgPSAqY3ApICE9ICdcMCcpCisgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCAqIGJhc2UpICsgKGMgLSAnMCcpOworICAgICAgICAgICAgICAgICBjcCsrOworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYgKGJhc2UgPT0gMTYgJiYgaXN4ZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICAoYyArIDEwIC0gKGlzbG93ZXIoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSk7CisgICAgICAgICAgICAgICAgIGNwKys7CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgqY3AgPT0gJy4nKQorICAgICAgICAgeworICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICogSW50ZXJuZXQgZm9ybWF0OiBhLmIuYy5kIGEuYi5jICAgKHdpdGggYyB0cmVhdGVkIGFzIDE2LWJpdHMpCisgICAgICAgICAgICAgICogYS5iICAgICAod2l0aCBiIHRyZWF0ZWQgYXMgMjQgYml0cykKKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBpZiAocHAgPj0gcGFydHMgKyAzIHx8IHZhbCA+IDB4ZmYpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICpwcCsrID0gdmFsLCBjcCsrOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgLyoKKyAgICAgICogQ2hlY2sgZm9yIHRyYWlsaW5nIGp1bmsuCisgICAgICAqLworICAgICB3aGlsZSAoKmNwKQorICAgICAgICAgaWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqY3ArKykpCisgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgLyoKKyAgICAgICogQ29uY29jdCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBwYXJ0cyBzcGVjaWZpZWQuCisgICAgICAqLworICAgICBuID0gcHAgLSBwYXJ0cyArIDE7CisgICAgIHN3aXRjaCAobikKKyAgICAgeworCisgICAgICAgICBjYXNlIDE6ICAgICAgICAgLyogYSAtLSAzMiBiaXRzICovCisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMjogICAgICAgICAvKiBhLmIgLS0gOC4yNCBiaXRzICovCisgICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZmZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gcGFydHNbMF0gPDwgMjQ7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMzogICAgICAgICAvKiBhLmIuYyAtLSA4LjguMTYgYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmYpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KTsKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSA0OiAgICAgICAgIC8qIGEuYi5jLmQgLS0gOC44LjguOCBiaXRzICovCisgICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmYpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KSB8IChwYXJ0c1syXSA8PCA4KTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgICphZGRyID0gaHRvbmwodmFsKTsKKyAgICAgcmV0dXJuIDE7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEZpbmQga2V5IHNlY3Rpb24gZm9yIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleSBzZWN0aW9uCisgICAgICAgIHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzZWNpb24gdG8gYmUgZmluZAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgRmFpbAorICAgICAgICBPdGhlcnMgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1BVQ0hBUiAgUlRNUEZpbmRTZWN0aW9uKAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKK3sKKyAgICBDSEFSIHRlbXBfYnVmWzMyXTsKKyAgICBQVUNIQVIgIHB0cjsKKworICAgIHN0cmNweSh0ZW1wX2J1ZiwgIkRlZmF1bHQiKTsKKworICAgIGlmKChwdHIgPSBydHN0cnN0cihidWZmZXIsIHRlbXBfYnVmKSkgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAocHRyK3N0cmxlbigiXG4iKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKKyAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKK3sKKyAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKKyAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKKyAgICBDSEFSICpzdGFydF9wdHI7CisgICAgQ0hBUiAqZW5kX3B0cjsKKyAgICBDSEFSICpwdHI7CisgICAgQ0hBUiAqb2Zmc2V0ID0gMDsKKyAgICBJTlQgIGxlbjsKKworCS8vdGVtcF9idWYxID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCS8vdGVtcF9idWYyID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworCX0KKworICAgIC8vZmluZCBzZWN0aW9uCisgICAgaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOworCisgICAgLy9zZWFyY2gga2V5CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7CisgICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCisgICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7CisKKyAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOworICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKKyAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKKyAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOworICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOworICAgIHB0ciA9IHRlbXBfYnVmMjsKKyAgICAvL3RyaW0gc3BhY2Ugb3IgdGFiCisgICAgd2hpbGUoKnB0ciAhPSAweDAwKQorICAgIHsKKyAgICAgICAgaWYoICgqcHRyID09ICcgJykgfHwgKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGVuID0gc3RybGVuKHB0cik7CisgICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKKyAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOworCisJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKKyAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKS4KKyAgICAgICAgSXQgaXMgY2FsbGVkIGZvciBwYXJzaW5nIFNTSUQgYW5kIGFueSBrZXkgc3RyaW5nLgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoCisgICAgSU4gIFBDSEFSICAga2V5LAorICAgIE9VVCBQQ0hBUiAgIGRlc3QsCisgICAgSU4gIElOVCAgICAgZGVzdHNpemUsCisgICAgSU4gIFBDSEFSICAgYnVmZmVyKQoreworICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOworICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOworICAgIENIQVIgKnN0YXJ0X3B0cjsKKyAgICBDSEFSICplbmRfcHRyOworICAgIENIQVIgKnB0cjsKKyAgICBDSEFSICpvZmZzZXQgPSAwOworICAgIElOVCAgbGVuOworCisJLy90ZW1wX2J1ZjEgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJaWYodGVtcF9idWYxID09IE5VTEwpCisgICAgICAgIHJldHVybiAoRkFMU0UpOworCisJLy90ZW1wX2J1ZjIgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisJfQorCisgICAgLy9maW5kIHNlY3Rpb24KKyAgICBpZigob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCisgICAgeworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7CisKKyAgICAvL3NlYXJjaCBrZXkKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKKyAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKKyAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKKworICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7CisgICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOworICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOworICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7CisgICAgcHRyID0gdGVtcF9idWYyOworCisgICAgLy90cmltIHRhYgorICAgIC8qIFdlIGNhbm5vdCB0cmltIHNwYWNlKCcgJykgZm9yIFNTSUQgYW5kIGtleSBzdHJpbmcuICovCisgICAgd2hpbGUoKnB0ciAhPSAweDAwKQorICAgIHsKKyAgICAgICAgLy9pZiggKCpwdHIgPT0gJyAnKSB8fCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgIGlmKCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOworICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7CisKKwlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgbXVsdGlwbGUga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZworICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgorICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcworICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAorCisgICAgTm90ZToKKyAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXJXaXRoT2Zmc2V0KAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIE9VVAlVU0hPUlQJKmVuZF9vZmZzZXQsCisgICAgSU4gIElOVCAgICAgZGVzdHNpemUsCisgICAgSU4gIFBDSEFSICAgYnVmZmVyLAorICAgIElOCUJPT0xFQU4JYlRyaW1TcGFjZSkKK3sKKyAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKKyAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKKyAgICBDSEFSICpzdGFydF9wdHI7CisgICAgQ0hBUiAqZW5kX3B0cjsKKyAgICBDSEFSICpwdHI7CisgICAgQ0hBUiAqb2Zmc2V0ID0gMDsKKyAgICBJTlQgIGxlbjsKKworCWlmICgqZW5kX29mZnNldCA+PSBNQVhfSU5JX0JVRkZFUl9TSVpFKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJaWYodGVtcF9idWYxID09IE5VTEwpCisgICAgICAgIHJldHVybiAoRkFMU0UpOworCisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJaWYodGVtcF9idWYyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKwl9CisKKyAgICAvL2ZpbmQgc2VjdGlvbgorCWlmKCplbmRfb2Zmc2V0ID09IDApCisgICAgeworCQlpZiAoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQorCQl7CisJCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworCSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAJICAgIHJldHVybiAoRkFMU0UpOworCQl9CisgICAgfQorCWVsc2UKKwkJb2Zmc2V0ID0gYnVmZmVyICsgKCplbmRfb2Zmc2V0KTsKKworICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKKworICAgIC8vc2VhcmNoIGtleQorICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOworICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQorICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOworCisgICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisJKmVuZF9vZmZzZXQgPSBlbmRfcHRyIC0gYnVmZmVyOworCisgICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKKyAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7CisgICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7CisgICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKKyAgICBwdHIgPSB0ZW1wX2J1ZjI7CisgICAgLy90cmltIHNwYWNlIG9yIHRhYgorICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIGlmKChiVHJpbVNwYWNlICYmICgqcHRyID09ICcgJykpIHx8ICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbiA9IHN0cmxlbihwdHIpOworICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7CisgICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgaW50IHJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLElOICBjaGFyICpidWZmZXIsSU4gIFVMT05HIEtleVR5cGUsSU4gIElOVCBCU1NJZHgsSU4gIElOVCBLZXlJZHgpCit7CisJUFVDSEFSCQlrZXlidWZmOworCUlOVAkJCWkgPSBCU1NJZHgsIGlkeCA9IEtleUlkeDsKKwlVTE9ORwkJS2V5TGVuOworCVVDSEFSCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisKKwlrZXlidWZmID0gYnVmZmVyOworCUtleUxlbiA9IHN0cmxlbihrZXlidWZmKTsKKworCWlmIChLZXlUeXBlID09IDEpCisJey8vQXNjaWkKKwkJaWYoIChLZXlMZW4gPT0gNSkgfHwgKEtleUxlbiA9PSAxMykpCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5TGVuID0gS2V5TGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXksIGtleWJ1ZmYsIEtleUxlbik7CisJCQlpZiAoS2V5TGVuID09IDUpCisJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSS9GKHJhJWQpIEtleSVkU3RyPSVzIGFuZCB0eXBlPSVzXG4iLCBpLCBpZHgrMSwga2V5YnVmZiwgKEtleVR5cGUgPT0gMCkgPyAiSGV4IjoiQXNjaWkiKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQllbHNlCisJCXsvL0ludmFsaWQga2V5IGxlbmd0aAorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5JWRTdHIgaXMgSW52YWxpZCBrZXkgbGVuZ3RoISBLZXlMZW4gPSAlbGQhXG4iLCBpZHgrMSwgS2V5TGVuKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlCisJey8vSGV4IHR5cGUKKwkJaWYoIChLZXlMZW4gPT0gMTApIHx8IChLZXlMZW4gPT0gMjYpKQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleUxlbiA9IEtleUxlbiAvIDI7CisJCQlBdG9IKGtleWJ1ZmYsIHBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5LCBLZXlMZW4gLyAyKTsKKwkJCWlmIChLZXlMZW4gPT0gMTApCisJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSS9GKHJhJWQpIEtleSVkU3RyPSVzIGFuZCB0eXBlPSVzXG4iLCBpLCBpZHgrMSwga2V5YnVmZiwgKEtleVR5cGUgPT0gMCkgPyAiSGV4IjoiQXNjaWkiKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQllbHNlCisJCXsvL0ludmFsaWQga2V5IGxlbmd0aAorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSS9GKHJhJWQpIEtleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCEgS2V5TGVuID0gJWxkIVxuIiwgaSwgaWR4KzEsIEtleUxlbikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZCBydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIGNoYXIgKnRtcGJ1ZiwgY2hhciAqYnVmZmVyKQoreworCWNoYXIJCXRva19zdHJbMTZdOworCVBVQ0hBUgkJbWFjcHRyOworCUlOVAkJCWkgPSAwLCBpZHg7CisJVUxPTkcJCUtleVR5cGVbTUFYX01CU1NJRF9OVU1dOworCVVMT05HCQlLZXlJZHg7CisKKwlOZGlzWmVyb01lbW9yeShLZXlUeXBlLCBNQVhfTUJTU0lEX05VTSk7CisKKwkvL0RlZmF1bHRLZXlJRAorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRlZmF1bHRLZXlJRCIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCUtleUlkeCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQlpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQorCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEpOworCQkJZWxzZQorCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJRCgwfjMpPSVkXG4iLCBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCisJZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykKKwl7CisJCXNwcmludGYodG9rX3N0ciwgIktleSVkVHlwZSIsIGlkeCArIDEpOworCQkvL0tleTFUeXBlCisJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKHRva19zdHIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQl7CisJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCSAgICB7CisJCQkgICAgS2V5VHlwZVtpXSA9IHNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7CisJCSAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQl7CisJCQkJc3ByaW50Zih0b2tfc3RyLCAiS2V5JWRTdHIiLCBpZHggKyAxKTsKKwkJCQlpZiAoUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKHRva19zdHIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCXsKKwkJCQkJcnRtcF9wYXJzZV9rZXlfYnVmZmVyX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgS2V5VHlwZVtCU1MwXSwgQlNTMCwgaWR4KTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKwl9Cit9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorc3RhdGljIHZvaWQgcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCwgY2hhciAqdG1wYnVmLCBjaGFyICpidWZmZXIpCit7CisJUFVDSEFSCQkJCQltYWNwdHI7CisJSU5UCQkJCQkJaT0wOworCUJPT0xFQU4JCQkJCWJXbW1FbmFibGUgPSBGQUxTRTsKKworCS8vV21tQ2FwYWJsZQorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldtbUNhcGFibGUiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCXsKKwkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAvL0VuYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7CisJCQliV21tRW5hYmxlID0gVFJVRTsKKwkJfQorCQllbHNlIC8vRGlzYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV21tQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwl9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkvL0RMU0NhcGFibGUKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJETFNDYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwl7CisJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlID0gVFJVRTsKKwkJfQorCQllbHNlIC8vRGlzYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IEZBTFNFOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYkRMU0NhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJLy9BY2tQb2xpY3kgZm9yIEFDX0JLLCBBQ19CRSwgQUNfVkksIEFDX1ZPCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQWNrUG9saWN5IiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwl7CisJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQWNrUG9saWN5W2ldID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFja1BvbGljeVslZF09JWRcbiIsIGksIHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSkpOworCQl9CisJfQorCisJaWYgKGJXbW1FbmFibGUpCisJeworCQkvL0FQU0RDYXBhYmxlCisJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RDYXBhYmxlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJeworCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBUUlVFOworCQkJZWxzZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlKSk7CisJCX0KKworCQkvL0FQU0RBQyBmb3IgQUNfQkUsIEFDX0JLLCBBQ19WSSwgQUNfVk8KKwkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQVBTREFDIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwkJeworCQkJQk9PTEVBTiBhcHNkX2FjWzRdOworCisJCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCQl7CisJCQkJYXBzZF9hY1tpXSA9IChCT09MRUFOKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQUMlZCAgJWRcbiIsIGksICBhcHNkX2FjW2ldKSk7CisJCQl9CisKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSBhcHNkX2FjWzBdOworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9IGFwc2RfYWNbMV07CisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJID0gYXBzZF9hY1syXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSBhcHNkX2FjWzNdOworCQl9CisJfQorCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQVUNIQVIJCQkJCXNyYyA9IE5VTEw7CisJc3RydWN0IGZpbGUJCQkJKnNyY2Y7CisJSU5UIAkJCQkJcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQ7CisgICAJbW1fc2VnbWVudF90CQkJb3JnZnM7CisJQ0hBUgkJCQkJKmJ1ZmZlcjsKKwlDSEFSCQkJCQkqdG1wYnVmOworCVVMT05HCQkJCQlSdHNUaHJlc2g7CisJVUxPTkcJCQkJCUZyYWdUaHJlc2g7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUNIQVIJICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJUFVDSEFSCQkJCQltYWNwdHI7CisJSU5UCQkJCQkJaSA9IDA7CisKKwlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZihidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKwl0bXBidWYgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmKHRtcGJ1ZiA9PSBOVUxMKQorCXsKKwkJa2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3JjID0gU1RBX1BST0ZJTEVfUEFUSDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwlzcmMgPSBwQWQtPk1DX0ZpbGVOYW1lOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisJLy8gU2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkvLyBTZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkKKwlvcmdmc3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKKwlvcmdmc2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKKwkvKiBIbSwgY2FuJ3QgcmVhbGx5IGRvIHRoaXMgbmljZWx5IGFueW1vcmUsIHNvIHJlbHkgb24gdGhlc2UgZmlsZXMKKwkgKiBiZWluZyBzZXQgdG8gdGhlIHByb3BlciBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlbS4uLiAqLworCS8qIGN1cnJlbnQtPmNyZWQtPmZzdWlkID0gY3VycmVudC0+Y3JlZC0+ZnNnaWQgPSAwOyAqLworICAgIG9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwlpZiAoc3JjICYmICpzcmMpCisJeworCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZAorCQkJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKKwkJCXsKKwkJCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKKwkJCQlyZXR2YWw9c3JjZi0+Zl9vcC0+cmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUsICZzcmNmLT5mX3Bvcyk7CisJCQkJaWYgKHJldHZhbCA8IDApCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUmVhZCAlcyBlcnJvciAlZFxuIiwgc3JjLCAtcmV0dmFsKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIHNldCBmaWxlIHBhcmFtZXRlciB0byBwb3J0Y2ZnCisJCQkJCS8vQ291bnRyeVJlZ2lvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5UmVnaW9uIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKKwkJCQkJfQorCQkJCQkvL0NvdW50cnlSZWdpb25BQmFuZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5UmVnaW9uQUJhbmQiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlSZWdpb25BQmFuZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7CisJCQkJCX0KKwkJCQkJLy9Db3VudHJ5Q29kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5Q29kZSIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlN0YU9yaUNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCQlpZiAoc3RybGVuKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSAhPSAwKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJDb3VudHJ5RmxhZyA9IFRSVUU7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5Q29kZT0lc1xuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpKTsKKwkJCQkJfQorCQkJCQkvL0NoYW5uZWxHZW9ncmFwaHkKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2hhbm5lbEdlb2dyYXBoeSIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCVVDSEFSIEdlb2dyYXBoeSA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWlmIChHZW9ncmFwaHkgPD0gQk9USCkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBHZW9ncmFwaHk7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPQorCQkJCQkJCQkocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IEJPVEgpID8gJyAnIDogKChwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gSURPUikgPyAnSScgOiAnTycpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQkJcEFkLT5TdGFDZmcuU3RhT3JpR2VvZ3JhcGh5ID0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5OworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsR2VvZ3JhcGh5PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEJPVEg7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVsyXSA9ICcgJzsKKwkJCQkJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9TU0lECisJCQkJCQlpZiAoUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKCJTU0lEIiwgdG1wYnVmLCAyNTYsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKHN0cmxlbih0bXBidWYpIDw9IDMyKQorCQkJCQkJCXsKKwkJCSAJCQkJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoVUNIQVIpIHN0cmxlbih0bXBidWYpOworCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHRtcGJ1ZiwgcEFkLT5Db21tb25DZmcuU3NpZExlbik7CisJCQkJCQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJCQkJCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgdG1wYnVmLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooU1NJRD0lcylcbiIsIF9fRlVOQ1RJT05fXywgdG1wYnVmKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9OZXR3b3JrVHlwZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ldHdvcmtUeXBlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKwkJCQkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkFkaG9jIikgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKwkJCQkJCQllbHNlIC8vRGVmYXVsdCBJbmZyYXN0cnVjdHVyZSBtb2RlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQkJCQkJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+U3RhQ2ZnLkJzc1R5cGUpKTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkvL0NoYW5uZWwKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2hhbm5lbCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJCX0KKwkJCQkJLy9XaXJlbGVzc01vZGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lyZWxlc3NNb2RlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaW50IHZhbHVlICA9IDAsIG1heFBoeU1vZGUgPSBQSFlfMTFHOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCQltYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQkJdmFsdWUgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCisJCQkJCQlpZiAodmFsdWUgPD0gbWF4UGh5TW9kZSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gdmFsdWU7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQaHlNb2RlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgLy9CYXNpY1JhdGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQmFzaWNSYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmFzaWNSYXRlPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwKSk7CisJCQkJCX0KKwkJCQkJLy9CZWFjb25QZXJpb2QKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQmVhY29uUGVyaW9kIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblBlcmlvZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSk7CisJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgLy9UeFBvd2VyCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UG93ZXIiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IChVTE9ORykgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UG93ZXI9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJCQl9CisJCQkJCS8vQkdQcm90ZWN0aW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkJHUHJvdGVjdGlvbiIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vQWx3YXlzIE9uCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjogLy9BbHdheXMgT0ZGCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9BVVRPCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCR1Byb3RlY3Rpb249JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pKTsKKwkJCQkJfQorCQkJCQkvL09MQkNEZXRlY3Rpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGlzYWJsZU9MQkMiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAxOiAvL2Rpc2FibGUgT0xCQyBEZXRlY3Rpb24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDA6IC8vZW5hYmxlIE9MQkMgRGV0ZWN0aW9uCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0ID0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3Q9IDA7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiT0xCQ0RldGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0KSk7CisJCQkJCX0KKwkJCQkJLy9UeFByZWFtYmxlCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UHJlYW1ibGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6CisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UHJlYW1ibGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7CisJCQkJCX0KKwkJCQkJLy9SVFNUaHJlc2hvbGQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUlRTVGhyZXNob2xkIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWlmKCAoUnRzVGhyZXNoID49IDEpICYmIChSdHNUaHJlc2ggPD0gTUFYX1JUU19USFJFU0hPTEQpICkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgID0gKFVTSE9SVClSdHNUaHJlc2g7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUU1RocmVzaG9sZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7CisJCQkJCX0KKwkJCQkJLy9GcmFnVGhyZXNob2xkCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZyYWdUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKworCQkJCQkJaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKKwkJCQkJCXsgLy9pbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCisJCQkJCQl7CisJCQkJCQkJLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGZyYWdtZW50IHNoYWxsIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlciBvZiBvY3RldHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKKwkJCQkJCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCisJCQkJCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7CisJCQkJCQl9CisJCQkJCQkvL3BBZC0+Q29tbW9uQ2ZnLkFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFnVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCQkJCQl9CisJCQkJCS8vVHhCdXJzdAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeEJ1cnN0IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7CisJCQkJCQllbHNlIC8vRGlzYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeEJ1cnN0PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOworCQkJCQl9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJCQkJCS8vUGt0QWdncmVnYXRlCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBrdEFnZ3JlZ2F0ZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IFRSVUU7CisJCQkJCQllbHNlIC8vRGlzYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKKyNpZmRlZiBQSUdHWUJBQ0tfU1VQUE9SVAorCQkJCQkJcEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUgPSBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlOworI2VuZGlmIC8vIFBJR0dZQkFDS19TVVBQT1JUIC8vCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQa3RBZ2dyZWdhdGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKKwkJCQkJfQorI2Vsc2UKKwkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOworCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IEZBTFNFOworI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKworCQkJCQkvLyBXbW1DYXBhYmxlCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCQkvL1Nob3J0U2xvdAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJTaG9ydFNsb3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBGQUxTRTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRTbG90PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworCQkJCQl9CisJCQkJCS8vSUVFRTgwMjExSAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJJRUVFODAyMTFIIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkJCQkgICAgeworICAgIAkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisgICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKKyAgICAJCQkJCQllbHNlIC8vRGlzYWJsZQorICAgIAkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IEZBTFNFOworCisgICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUVFRTgwMjExSD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKKwkJCQkJICAgIH0KKwkJCQkJfQorCQkJCQkvL0NTUGVyaW9kCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNTUGVyaW9kIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IDA7CisKKyAgIAkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNTUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCkpOworCQkJCQl9CisKKwkJCQkJLy9SRFJlZ2lvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSRFJlZ2lvbiIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1MyIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTMiLCA3KSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTM7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUF9XNTYiLCA3KSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXBfdzU2IiwgNykgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBKQVBfVzU2OworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJKQVAiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXAiLCAzKSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUDsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlICBpZiAoKHN0cm5jbXAodG1wYnVmLCAiRkNDIiwgMykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiZmNjIiwgMykgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBGQ0M7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSA1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiQ0UiLCAyKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJjZSIsIDIpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7CisJCQkJCQl9CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJEUmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7CisJCQkJCX0KKworCQkJCQkvL1dpcmVsZXNzRXZlbnQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lyZWxlc3NFdmVudCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTUKKwkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCisjZWxzZQorCQkJCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCisjZW5kaWYKKyAgIAkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldpcmVsZXNzRXZlbnQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSk7CisJCQkJCX0KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lGaVRlc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0PSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IDA7CS8vIGRpc2FibGUKKworICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lGaVRlc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkpOworCQkJCQl9CisJCQkJCS8vQXV0aE1vZGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQXV0aE1vZGUiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQkJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3ZXBhdXRvIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAic2hhcmVkIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGFwc2siKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFOT05FIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGFub25lIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYTJwc2siKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQSIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMiIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KEVuY3J5cFR5cGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOworCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisJCQkJCS8vRW5jcnlwVHlwZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJFbmNyeXBUeXBlIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcCIpID09IDApKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgInRraXAiKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkFFUyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiYWVzIikgPT0gMCkpCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKwkJCQkJCQkvLyBVcGRhdGUgYWxsIHdlcHN0YXR1cyByZWxhdGVkCisJCQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlcgkJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQkJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQkJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgCQk9IEZBTFNFOworCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19GVU5DVElPTl9fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZihSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIldQQVBTSyIsIHRtcGJ1ZiwgNTEyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWludCAgICAgZXJyPTA7CisKKwkJCQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0CisKKwkJCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQkpCisJCQkJCQkJeworCQkJCQkJCQllcnIgPSAxOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmICgoc3RybGVuKHRtcGJ1ZikgPj0gOCkgJiYgKHN0cmxlbih0bXBidWYpIDwgNjQpKQorCQkJCQkJCXsKKwkJCQkJCQkJUGFzc3dvcmRIYXNoKChjaGFyICopdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChzdHJsZW4odG1wYnVmKSA9PSA2NCkKKwkJCQkJCQl7CisJCQkJCQkJCUF0b0godG1wYnVmLCBrZXlNYXRlcmlhbCwgMzIpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWVyciA9IDE7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19GVU5DVElPTl9fKSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKGVyciA9PSAwKQorCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCXsKKwkgICAgICAgICAgICAgICAgICAgICAgICAJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJCQkJeworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisJCQkJCQkJCX0KKworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFdQQVBTSz0lcylcbiIsIF9fRlVOQ1RJT05fXywgdG1wYnVmKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCQkJLy9EZWZhdWx0S2V5SUQsIEtleVR5cGUsIEtleVN0cgorCQkJCQlydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlIVFBhcmFtZXRlcnNIb29rKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJCQkJCQkvL0NhcnJpZXJEZXRlY3QKKwkJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNhcnJpZXJEZXRlY3QiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKHN0cm5jbXAodG1wYnVmLCAiMCIsIDEpID09IDApKQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworCQkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIjEiLCAxKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhcnJpZXJEZXRlY3QuRW5hYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCS8vUFNNb2RlCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUFNNb2RlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCQkJCQkJeworCQkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJNQVhfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJtYXhfcHNwIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtKHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkZhc3RfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJmYXN0X3BzcCIpID09IDApCisJCQkJCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkZBU1RfUFNQIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiTGVnYWN5X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibGVnYWN5X3BzcCIpID09IDApCisJCQkJCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkxFR0FDWV9QU1AiKSA9PSAwKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisJCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKwkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeyAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorCQkJCQkJCQkJLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorCQkJCQkJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9BQ1RJVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJCQkJCQkJfQorCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU01vZGU9JWxkXG4iLCBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJLy8gRmFzdFJvYW1pbmcKKwkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGYXN0Um9hbWluZyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nID0gRkFMU0U7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcgPSBUUlVFOworCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRmFzdFJvYW1pbmc9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZykpOworCQkJCQkJfQorCQkJCQkJLy8gUm9hbVRocmVzaG9sZAorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJvYW1UaHJlc2hvbGQiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWxvbmcgbEluZm8gPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCisJCQkJCQkJaWYgKGxJbmZvID4gOTAgfHwgbEluZm8gPCA2MCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuZEJtVG9Sb2FtID0gLTcwOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuZEJtVG9Sb2FtID0gKENIQVIpKC0xKSpsSW5mbzsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJvYW1UaHJlc2hvbGQ9JWQgIGRCbVxuIiwgcEFkLT5TdGFDZmcuZEJtVG9Sb2FtKSk7CisJCQkJCQl9CisKKwkJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlRHbldpZmlUZXN0IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVEduV2lmaVRlc3Q9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+ICVzIGRvZXMgbm90IGhhdmUgYSB3cml0ZSBtZXRob2RcbiIsIHNyYykpOworCQkJfQorCisJCQlyZXR2YWw9ZmlscF9jbG9zZShzcmNmLE5VTEwpOworCisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKKwkJCX0KKwkJfQorCX0KKworCXNldF9mcyhvcmdmcyk7CisKKyNpZiAwCisJY3VycmVudC0+Y3JlZC0+ZnN1aWQgPSBvcmdmc3VpZDsKKwljdXJyZW50LT5jcmVkLT5mc2dpZCA9IG9yZ2ZzZ2lkOworI2VuZGlmCisKKwlrZnJlZShidWZmZXIpOworCWtmcmVlKHRtcGJ1Zik7CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgdm9pZAlIVFBhcmFtZXRlcnNIb29rKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCSAgKnBWYWx1ZVN0ciwKKwlJTglDSEFSCQkgICpwSW5wdXQpCit7CisKKwlJTlQgVmFsdWU7CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUFJPVEVDVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUHJvdGVjdGlvbiAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU0VuYWJsZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTRW5hYmxlICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID4gTU1QU19FTkFCTEUpCisgICAgICAgIHsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9UT0RPOiBhZGQgbWltbyBwb3dlciBzYXZpbmcgbWVjaGFuaXNtCisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKwkJCS8vcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QUyBNb2RlICA9ICVkXG4iLCBWYWx1ZSkpOworICAgIH0KKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQURlY2xpbmUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIERlY2xpbmUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0Rpc2FibGVSZW9yZGVyaW5nIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRGlzYWJsZVJlb3JkZXJpbmcgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BdXRvQkEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBBdXRvIEJBICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKwkvLyBUeF8rSFRDIGZyYW1lCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0hUQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4ICtIVEMgZnJhbWUgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisJfQorCisJLy8gRW5hYmxlIEhUIExpbmsgQWRhcHRhdGlvbiBDb250cm9sCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0xpbmtBZGFwdCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IExpbmsgQWRhcHRhdGlvbiBDb250cm9sID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOworCX0KKworCS8vIFJldmVyc2UgRGlyZWN0aW9uIE1lY2hhbmlzbQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SREciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFJERyA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSgrSFRDKSIpKTsKKwl9CisKKworCisKKwkvLyBUeCBBLU1TVUQgPworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BTVNEVSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4IEEtTVNEVSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKwl9CisKKwkvLyBNUERVIERlbnNpdHkKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTXBkdURlbnNpdHkiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkXG4iLCBWYWx1ZSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNUERVIERlbnNpdHkgPSAlZCAoRGVmYXVsdClcbiIsIDQpKTsKKwkJfQorCX0KKworCS8vIE1heCBSeCBCQSBXaW5kb3cgU2l6ZQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQVdpblNpemUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA+PTEgJiYgVmFsdWUgPD0gNjQpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gJWRcbiIsIFZhbHVlKSk7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgV2luZHcgU2l6ZSA9IDY0IChEZWZ1YWx0KVxuIikpOworCQl9CisKKwl9CisKKwkvLyBHdWFyZCBJbnRlcnZhbAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9HSSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID09IEdJXzQwMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBHdWFyZCBJbnRlcnZhbCA9ICVzXG4iLCAoVmFsdWU9PUdJXzQwMCkgPyAiNDAwIiA6ICI4MDAiICkpOworCX0KKworCS8vIEhUIE9wZXJhdGlvbiBNb2RlIDogTWl4ZWQgTW9kZSAsIEdyZWVuIEZpZWxkCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX09wTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID09IEhUTU9ERV9HRikKKwkJeworCisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE9wZXJhdGUgTW9kZSA9ICVzXG4iLCAoVmFsdWU9PUhUTU9ERV9HRikgPyAiR3JlZW4gRmllbGQiIDogIk1peGVkIE1vZGUiICkpOworCX0KKworCS8vIEZpeGVkIFR4IG1vZGUgOiBDQ0ssIE9GRE0KKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiRml4ZWRUeE1vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVUNIQVIJZml4X3R4X21vZGU7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKwkJCWlmIChzdHJjbXAocFZhbHVlU3RyLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgIm9mZG0iKSA9PSAwKQorCQkJeworCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX09GRE07CisJCQl9CisJCQllbHNlIGlmIChzdHJjbXAocFZhbHVlU3RyLCAiQ0NLIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAiY2NrIikgPT0gMCkKKwkJCXsKKwkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7CisJCQl9CisJCQllbHNlIGlmIChzdHJjbXAocFZhbHVlU3RyLCAiSFQiKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJodCIpID09IDApCisJCQl7CisJCSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQkJCS8vIDEgOiBDQ0sKKwkJCQkvLyAyIDogT0ZETQorCQkJCS8vIG90aGVyd2lzZSA6IEhUCisJCQkJaWYgKFZhbHVlID09IEZJWEVEX1RYTU9ERV9DQ0sgfHwgVmFsdWUgPT0gRklYRURfVFhNT0RFX09GRE0pCisJCQkJCWZpeF90eF9tb2RlID0gVmFsdWU7CisJCQkJZWxzZQorCQkJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKwkJfQorCisJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID0gZml4X3R4X21vZGU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaXhlZCBUeCBNb2RlID0gJWRcbiIsIGZpeF90eF9tb2RlKSk7CisKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCisJLy8gQ2hhbm5lbCBXaWR0aAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CVyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID09IEJXXzQwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCX0KKworI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKwkJcEFkLT5Db21tb25DZmcuTUNhc3RQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQ2hhbm5lbCBXaWR0aCA9ICVzXG4iLCAoVmFsdWU9PUJXXzQwKSA/ICI0MCBNSHoiIDogIjIwIE1IeiIgKSk7CisJfQorCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0VYVENIQSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSAgPSBFWFRDSEFfQkVMT1c7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEV4dCBDaGFubmVsID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiQkVMT1ciIDogIkFCT1ZFIiApKTsKKwl9CisKKwkvLyBNU0MKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUNTIiwgcFZhbHVlU3RyLCA1MCwgcElucHV0KSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCQlpZiAoKFZhbHVlID49IDAgJiYgVmFsdWUgPD0gMjMpIHx8IChWYWx1ZSA9PSAzMikpIC8vIDMqMworCQl7CisJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgID0gVmFsdWU7CisJCQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgID0gTUNTX0FVVE87CisJCQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNQ1MgPSBBVVRPXG4iKSk7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gU1RCQworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9TVEJDIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IFNUQkNfVVNFKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFNUQkMgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKKwl9CisKKwkvLyA0MF9NaHpfSW50b2xlcmFudAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF80ME1IWl9JTlRPTEVSQU5UIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogNDBNSFogSU5UT0xFUkFOVCA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQpKTsKKwl9CisJLy9IVF9UeFN0cmVhbQorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1R4U3RyZWFtIiwgcFZhbHVlU3RyLCAxMCwgcElucHV0KSkKKwl7CisJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKSkKKwkJeworCQkJY2FzZSAxOgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6IC8vIDMqMworCQkJZGVmYXVsdDoKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDM7CisKKwkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKKwkJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgdHggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJCWJyZWFrOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuVHhTdHJlYW0pKTsKKwl9CisJLy9IVF9SeFN0cmVhbQorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1J4U3RyZWFtIiwgcFZhbHVlU3RyLCAxMCwgcElucHV0KSkKKwl7CisJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKSkKKwkJeworCQkJY2FzZSAxOgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQlkZWZhdWx0OgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMzsKKworCQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKQorCQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDI7IC8vIG9ubHkgMiByeCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCisJCQkJYnJlYWs7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFJ4IFN0cmVhbSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSkpOworCX0KKworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTk1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaApAQCAtMCwwICsxLDcxNzcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRtcC5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGF1bCBMaW4gICAgMjAwMi0wOC0wMSAgICBjcmVhdGVkCisgICAgSmFtZXMgVGFuICAgMjAwMi0wOS0wNiAgICBtb2RpZmllZCAoUmV2aXNlIE5UQ1JlZ1RhYmxlKQorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDktMDYgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAorKi8KKyNpZm5kZWYgX19SVE1QX0hfXworI2RlZmluZSBfX1JUTVBfSF9fCisKKyNpbmNsdWRlICJsaW5rX2xpc3QuaCIKKyNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaW5jbHVkZSAiYWlyb25ldC5oIgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyNkZWZpbmUgREJHX0RJQUdOT1NFCQkxCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUF9TVVBQT1JUKSAmJiBkZWZpbmVkKENPTkZJR19TVEFfU1VQUE9SVCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fQVAoX3BBZCkJaWYoX3BBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorI2Vsc2UKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fQVAoX3BBZCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKF9wQWQpCisjZW5kaWYKKworI2RlZmluZSBWSVJUVUFMX0lGX0lOQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCsrKQorI2RlZmluZSBWSVJUVUFMX0lGX0RFQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudC0tKQorI2RlZmluZSBWSVJUVUFMX0lGX05VTShfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCkKKworCisKKy8vCisvLyAgTkRJUyBWZXJzaW9uIGRlZmluaXRpb25zCisvLworI2lmZGVmICBORElTNTBfTUlOSVBPUlQKKyNkZWZpbmUgUlRNUF9ORElTX01BSk9SX1ZFUlNJT04gICAgIDUKKyNkZWZpbmUgUlRNUF9ORElTX01JTk9SX1ZFUlNJT04gICAgIDAKKyNlbmRpZgorCisjaWZkZWYgIE5ESVM1MV9NSU5JUE9SVAorI2RlZmluZSBSVE1QX05ESVNfTUFKT1JfVkVSU0lPTiAgICAgNQorI2RlZmluZSBSVE1QX05ESVNfTUlOT1JfVkVSU0lPTiAgICAgMQorI2VuZGlmCisKK2V4dGVybiAgY2hhciAgICBOSUNfVkVORE9SX0RFU0NbXTsKK2V4dGVybiAgaW50ICAgICBOSUNfVkVORE9SX0RFU0NfTEVOOworCitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBTTkFQX0FJUk9ORVRbXTsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ2lzY29DQ0tNW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKK2V4dGVybgl1bnNpZ25lZCBjaGFyCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRbXTsKK2V4dGVybgl1bnNpZ25lZCBjaGFyCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRMZW47CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNDWFRraXBbXTsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ0NYVGtpcExlbjsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENJU0NPX09VSVtdOworZXh0ZXJuICBVQ0hBUglCYVNpemVBcnJheVs0XTsKKworZXh0ZXJuIFVDSEFSIEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gVUNIQVIgTVVMVElDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKK2V4dGVybiBVQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gVUxPTkcgQklUMzJbMzJdOworZXh0ZXJuIFVDSEFSIEJJVDhbOF07CitleHRlcm4gY2hhciogQ2lwaGVyTmFtZVtdOworZXh0ZXJuIGNoYXIqIE1DU1RvTWJwc1tdOworZXh0ZXJuIFVDSEFSCSBSeHdpTUNTVG9PZmRtUmF0ZVsxMl07CitleHRlcm4gVUNIQVIgU05BUF84MDJfMUhbNl07CitleHRlcm4gVUNIQVIgU05BUF9CUklER0VfVFVOTkVMWzZdOworZXh0ZXJuIFVDSEFSIFNOQVBfQUlST05FVFs4XTsKK2V4dGVybiBVQ0hBUiBDS0lQX0xMQ19TTkFQWzhdOworZXh0ZXJuIFVDSEFSIEVBUE9MX0xMQ19TTkFQWzhdOworZXh0ZXJuIFVDSEFSIEVBUE9MWzJdOworZXh0ZXJuIFVDSEFSIElQWFsyXTsKK2V4dGVybiBVQ0hBUiBBUFBMRV9UQUxLWzJdOworZXh0ZXJuIFVDSEFSIFJhdGVJZFRvUGxjcFNpZ25hbFsxMl07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKK2V4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKK2V4dGVybiBVQ0hBUiBPZmRtU2lnbmFsVG9SYXRlSWRbMTZdIDsKK2V4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWluWzRdOworZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtYXhbNF07CitleHRlcm4gVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bNF07CitleHRlcm4gVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XTsKKworZXh0ZXJuIFVTSE9SVCBSYXRlVXBQRVJbXTsKK2V4dGVybiBVU0hPUlQgUmF0ZURvd25QRVJbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIENIQVIgICBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW107CitleHRlcm4gVUNIQVIgIFJhdGVJZFRvTWJwc1tdOworZXh0ZXJuIFVTSE9SVCBSYXRlSWRUbzUwMEticHNbXTsKKworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW107CitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBMZW47CisKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzW107CitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc0xlbjsKKworZXh0ZXJuIFVDSEFSICBTc2lkSWU7CitleHRlcm4gVUNIQVIgIFN1cFJhdGVJZTsKK2V4dGVybiBVQ0hBUiAgRXh0UmF0ZUllOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitleHRlcm4gVUNIQVIgIEh0Q2FwSWU7CitleHRlcm4gVUNIQVIgIEFkZEh0SW5mb0llOworZXh0ZXJuIFVDSEFSICBOZXdFeHRDaGFuSWU7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworZXh0ZXJuIFVDSEFSICBFeHRIdENhcEllOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworZXh0ZXJuIFVDSEFSICBFcnBJZTsKK2V4dGVybiBVQ0hBUiAgRHNJZTsKK2V4dGVybiBVQ0hBUiAgVGltSWU7CitleHRlcm4gVUNIQVIgIFdwYUllOworZXh0ZXJuIFVDSEFSICBXcGEySWU7CitleHRlcm4gVUNIQVIgIElic3NJZTsKK2V4dGVybiBVQ0hBUiAgQ2N4MkllOworCitleHRlcm4gVUNIQVIgIFdQQV9PVUlbXTsKK2V4dGVybiBVQ0hBUiAgUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSICBXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIgIFdNRV9QQVJNX0VMRU1bXTsKK2V4dGVybiBVQ0hBUiAgQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUiAgQ2N4MkllSW5mb1tdOworZXh0ZXJuIFVDSEFSICBSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIgIFBvd2VyQ29uc3RyYWludElFW107CisKKworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGVbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExR1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHW107CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFtdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4xU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4yU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW107CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK2V4dGVybiBVQ0hBUiAgUFJFX05fSFRfT1VJW107CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNkZWZpbmUJTUFYU0VRCQkoMHhGRkYpCisKKyNpZmRlZiBSQUxJTktfQVRFCit0eXBlZGVmCXN0cnVjdCBfQVRFX0lORk8geworCVVDSEFSCU1vZGU7CisJQ0hBUglUeFBvd2VyMDsKKwlDSEFSCVR4UG93ZXIxOworCUNIQVIgICAgVHhBbnRlbm5hU2VsOworCUNIQVIgICAgUnhBbnRlbm5hU2VsOworCVRYV0lfU1RSVUMgIFR4V0k7IAkgIC8vIFRYV0kKKwlVU0hPUlQJUUlEOworCVVDSEFSCUFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIJQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglBZGRyM1tNQUNfQUREUl9MRU5dOworCVVDSEFSCUNoYW5uZWw7CisJVUlOVDMyCVR4TGVuZ3RoOworCVVJTlQzMglUeENvdW50OworCVVJTlQzMglUeERvbmVDb3VudDsgLy8gVHggRE1BIERvbmUKKwlVSU5UMzIJUkZGcmVxT2Zmc2V0OworCUJPT0xFQU4JYlJ4RmVyOworCUJPT0xFQU4JYlFBVHhTdGFydDsgLy8gSGF2ZSBjb21waWxlZCBRQSBpbiBhbmQgdXNlIGl0IHRvIEFURSB0eC4KKwlCT09MRUFOCWJRQVJ4U3RhcnQ7CS8vIEhhdmUgY29tcGlsZWQgUUEgaW4gYW5kIHVzZSBpdCB0byBBVEUgcnguCisjaWZkZWYgUlQyODYwCisJQk9PTEVBTgliRldMb2FkaW5nOwkvLyBSZWxvYWQgZmlybXdhcmUgd2hlbiBBVEUgaXMgZG9uZS4KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlVSU5UMzIJUnhUb3RhbENudDsKKwlVSU5UMzIJUnhDbnRQZXJTZWM7CisKKwlDSEFSCUxhc3RTTlIwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFNOUgorCUNIQVIgICAgTGFzdFNOUjE7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgU05SIGZvciAybmQgIGFudGVubmEKKwlDSEFSICAgIExhc3RSc3NpMDsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKKwlDSEFSICAgIExhc3RSc3NpMTsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kgZm9yIDJuZCAgYW50ZW5uYQorCUNIQVIgICAgTGFzdFJzc2kyOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSSBmb3IgM3JkICBhbnRlbm5hCisJQ0hBUiAgICBBdmdSc3NpMDsgICAgICAgICAgICAgLy8gbGFzdCA4IGZyYW1lcycgYXZlcmFnZSBSU1NJCisJQ0hBUiAgICBBdmdSc3NpMTsgICAgICAgICAgICAgLy8gbGFzdCA4IGZyYW1lcycgYXZlcmFnZSBSU1NJCisJQ0hBUiAgICBBdmdSc3NpMjsgICAgICAgICAgICAgLy8gbGFzdCA4IGZyYW1lcycgYXZlcmFnZSBSU1NJCisJU0hPUlQgICBBdmdSc3NpMFg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKKwlTSE9SVCAgIEF2Z1Jzc2kxWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQorCVNIT1JUICAgQXZnUnNzaTJYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCisKKwlVSU5UMzIJTnVtT2ZBdmdSc3NpU2FtcGxlOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkvLyBUeCBmcmFtZQorCVVTSE9SVAkJSExlbjsgLy8gSGVhZGVyIExlbmd0aAorCVVTSE9SVAkJUExlbjsgLy8gUGF0dGVybiBMZW5ndGgKKwlVQ0hBUiAJCUhlYWRlclszMl07IC8vIEhlYWRlciBidWZmZXIKKwlVQ0hBUgkJUGF0dGVyblszMl07IC8vIFBhdHRlcm4gYnVmZmVyCisJVVNIT1JUCQlETGVuOyAvLyBEYXRhIExlbmd0aAorCVVTSE9SVAkJc2VxOworCVVJTlQzMgkJQ0lEOworCVRIUkVBRF9QSUQgCQlBdGVQaWQ7CisJLy8gY291bnRlcnMKKwlVSU5UMzIJCVUyTTsKKwlVSU5UMzIJCU90aGVyRGF0YTsKKwlVSU5UMzIJCUJlYWNvbjsKKwlVSU5UMzIJCU90aGVyQ291bnQ7CisJVUlOVDMyCQlUeEFjMDsKKwlVSU5UMzIJCVR4QWMxOworCVVJTlQzMgkJVHhBYzI7CisJVUlOVDMyCQlUeEFjMzsKKwlVSU5UMzIJCVR4SENDQTsKKwlVSU5UMzIJCVR4TWdtdDsKKwlVSU5UMzIJCVJTU0kwOworCVVJTlQzMgkJUlNTSTE7CisJVUlOVDMyCQlSU1NJMjsKKwlVSU5UMzIJCVNOUjA7CisJVUlOVDMyCQlTTlIxOworCS8vIGNvbnRyb2wKKwkvL1VJTlQzMgkJUmVwZWF0OyAvLyBUeCBDcHUgY291bnQKKwlVQ0hBUgkJVHhTdGF0dXM7IC8vIHRhc2sgVHggc3RhdHVzIC8vIDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KK30JQVRFX0lORk8sICpQQVRFX0lORk87CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorc3RydWN0IGF0ZV9yYWNmZ2hkciB7CisgCVVJTlQzMgkJbWFnaWNfbm87CisJVVNIT1JUCQljb21tYW5kX3R5cGU7CisJVVNIT1JUCQljb21tYW5kX2lkOworCVVTSE9SVAkJbGVuZ3RoOworCVVTSE9SVAkJc2VxdWVuY2U7CisJVVNIT1JUCQlzdGF0dXM7CisJVUNIQVIJCWRhdGFbMjA0Nl07Cit9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RydWN0IHJlb3JkZXJpbmdfbXBkdQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUJKm5leHQ7CisJUE5ESVNfUEFDS0VUCQkJcFBhY2tldDsJCS8qIGNvdmVydGVkIHRvIDgwMi4zIGZyYW1lICovCisJaW50CQkJCQkJU2VxdWVuY2U7CQkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgTVBEVSAqLworCUJPT0xFQU4JCQkJCWJBTVNEVTsKK307CisKK3N0cnVjdCByZW9yZGVyaW5nX2xpc3QKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpuZXh0OworCWludCAJcWxlbjsKK307CisKK3N0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbAoreworCVBWT0lECQkJCQltZW07CisJTkRJU19TUElOX0xPQ0sJCQlsb2NrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgCWZyZWVsaXN0OworfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgCV9SU1NJX1NBTVBMRSB7CisJQ0hBUgkJCUxhc3RSc3NpMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUxhc3RSc3NpMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUxhc3RSc3NpMjsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUF2Z1Jzc2kwOworCUNIQVIJCQlBdmdSc3NpMTsKKwlDSEFSCQkJQXZnUnNzaTI7CisJU0hPUlQJCQlBdmdSc3NpMFg4OworCVNIT1JUCQkJQXZnUnNzaTFYODsKKwlTSE9SVAkJCUF2Z1Jzc2kyWDg7Cit9IFJTU0lfU0FNUExFOworCisvLworLy8gIFF1ZXVlIHN0cnVjdHVyZSBhbmQgbWFjcm9zCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9FTlRSWSAgICB7CisJc3RydWN0IF9RVUVVRV9FTlRSWSAgICAgKk5leHQ7Cit9ICAgUVVFVUVfRU5UUlksICpQUVVFVUVfRU5UUlk7CisKKy8vIFF1ZXVlIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9IRUFERVIgICB7CisJUFFVRVVFX0VOVFJZICAgIEhlYWQ7CisJUFFVRVVFX0VOVFJZICAgIFRhaWw7CisJVUxPTkcgICAgICAgICAgIE51bWJlcjsKK30gICBRVUVVRV9IRUFERVIsICpQUVVFVUVfSEVBREVSOworCisjZGVmaW5lIEluaXRpYWxpemVRdWV1ZUhlYWRlcihRdWV1ZUhlYWRlcikgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICBcCisJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBSZW1vdmVIZWFkUXVldWUoUXVldWVIZWFkZXIpICAgICAgICAgICAgICAgIFwKKyhRdWV1ZUhlYWRlciktPkhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVBRVUVVRV9FTlRSWSBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoKFF1ZXVlSGVhZGVyKS0+SGVhZCAhPSBOVUxMKQkJCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJcE5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkLT5OZXh0OyAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSBwTmV4dDsgICAgICAgICAgICAgICAgXAorCQlpZiAocE5leHQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPk51bWJlci0tOyAgICAgICAgICAgICAgICAgICAgXAorCX0JCQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgSW5zZXJ0SGVhZFF1ZXVlKFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkOyBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAorCQlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICBcCisJCShRdWV1ZUhlYWRlciktPk51bWJlcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEluc2VydFRhaWxRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKFBRVUVVRV9FTlRSWSlRdWV1ZUVudHJ5KS0+TmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICBcCisJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7IFwKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAorCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vCisvLyAgTWFjcm9zIGZvciBmbGFnIGFuZCByZWYgY291bnQgb3BlcmF0aW9ucworLy8KKyNkZWZpbmUgUlRNUF9TRVRfRkxBRyhfTSwgX0YpICAgICAgICgoX00pLT5GbGFncyB8PSAoX0YpKQorI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUcoX00sIF9GKSAgICAgKChfTSktPkZsYWdzICY9IH4oX0YpKQorI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUdTKF9NKSAgICAgICAgKChfTSktPkZsYWdzID0gMCkKKyNkZWZpbmUgUlRNUF9URVNUX0ZMQUcoX00sIF9GKSAgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSAhPSAwKQorI2RlZmluZSBSVE1QX1RFU1RfRkxBR1MoX00sIF9GKSAgICAgKCgoX00pLT5GbGFncyAmIChfRikpID09IChfRikpCisKKyNkZWZpbmUgT1BTVEFUVVNfU0VUX0ZMQUcoX3BBZCwgX0YpICAgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyB8PSAoX0YpKQorI2RlZmluZSBPUFNUQVRVU19DTEVBUl9GTEFHKF9wQWQsIF9GKSAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzICY9IH4oX0YpKQorI2RlZmluZSBPUFNUQVRVU19URVNUX0ZMQUcoX3BBZCwgX0YpICAgICgoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhfcEVudHJ5LF9GKSAgICAgICgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhfcEVudHJ5LF9GKSAgICAoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoX3BFbnRyeSxfRikgICAgICgoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgUlhfRklMVEVSX1NFVF9GTEFHKF9wQWQsIF9GKSAgICAoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyIHw9IChfRikpCisjZGVmaW5lIFJYX0ZJTFRFUl9DTEVBUl9GTEFHKF9wQWQsIF9GKSAgKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciAmPSB+KF9GKSkKKyNkZWZpbmUgUlhfRklMVEVSX1RFU1RfRkxBRyhfcEFkLCBfRikgICAoKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciAmIChfRikpICE9IDApCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgU1RBX05PX1NFQ1VSSVRZX09OKF9wKSAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKyNkZWZpbmUgU1RBX1dFUF9PTihfcCkgICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKyNkZWZpbmUgU1RBX1RLSVBfT04oX3ApICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyNkZWZpbmUgU1RBX0FFU19PTihfcCkgICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKworI2RlZmluZSBTVEFfVEdOX1dJRklfT04oX3ApICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9PSBUUlVFKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjZGVmaW5lIENLSVBfS1BfT04oX3ApCQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDEwKSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQorI2RlZmluZSBDS0lQX0NNSUNfT04oX3ApCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MDgpICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCisKKworI2RlZmluZSBJTkNfUklOR19JTkRFWChfaWR4LCBfUmluZ1NpemUpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9pZHgpID0gKF9pZHgrMSkgJSAoX1JpbmdTaXplKTsgICAgICAgXAorfQorCisjZGVmaW5lIElTX1JUMzA3MChfcEFkKQkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MDAwMDApCisKKyNkZWZpbmUgUklOR19QQUNLRVRfSU5JVChfVHhSaW5nLCBfaWR4KSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9UeFJpbmctPkNlbGxbX2lkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfVHhSaW5nLT5DZWxsW19pZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFRYRFRfSU5JVChfVHhEKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNaZXJvTWVtb3J5KF9UeEQsIFRYRF9TSVpFKTsJXAorCV9UeEQtPkRNQURPTkUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy9TZXQgbGFzdCBkYXRhIHNlZ21lbnQKKyNkZWZpbmUgUklOR19TRVRfTEFTVERTKF9UeEQsIF9Jc1NEMCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX0lzU0QwKSB7X1R4RC0+TGFzdFNlYzAgPSAxO30gICAgIFwKKyAgICBlbHNlIHtfVHhELT5MYXN0U2VjMSA9IDE7fSAgICAgXAorfQorCisvLyBJbmNyZWFzZSBUeFRzYyB2YWx1ZSBmb3IgbmV4dCB0cmFuc21pc3Npb24KKy8vIFRPRE86CisvLyBXaGVuIGk9PTYsIG1lYW5zIFRTQyBoYXMgZG9uZSBvbmUgZnVsbCBjeWNsZSwgZG8gcmUta2V5aW5nIHN0dWZmIGZvbGxvdyBzcGVjcworLy8gU2hvdWxkIHNlbmQgYSBzcGVjaWFsIGV2ZW50IG1pY3Jvc29mdCBkZWZpbmVkIHRvIHJlcXVlc3QgcmUta2V5CisjZGVmaW5lIElOQ19UWF9UU0MoX3RzYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKCsrX3RzY1tpXSA9PSAweDApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpID09IDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgaXMgY29waWVkIGZyb20gQVAgYmVhY29uLiAgRG9uJ3QgbmVlZCB0byB1cGRhdGUgaGVyZS4KKyNkZWZpbmUgQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGg7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NaW1vUHMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuR0YgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0Y7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5TaG9ydEdJZm9yMjAgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuU2hvcnRHSWZvcjQwID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlR4U1RCQyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkM7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5SeFNUQkMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuRXh0Q2hhbk9mZnNldCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0OyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuUmVjb21XaWR0aCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuT3BlcmFpb25Nb2RlID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5Ob25HZlByZXNlbnQgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVENhcGFiaWxpdHkuTUNTU2V0LCAoX3BBZCktPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgc2l6ZW9mKFVDSEFSKSAqIDE2KTtcCit9CisKKyNkZWZpbmUgQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKF9wQWQsIF9wSHRDYXBhYmlsaXR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSk7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZT0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9Qcyk7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhSQW1wZHVGYWN0b3IgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yKTsJXAorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLworLy8gTUFDUk8gZm9yIDMyLWJpdCBQQ0kgcmVnaXN0ZXIgcmVhZCAvIHdyaXRlCisvLworLy8gVXNhZ2UgOiBSVE1QX0lPX1JFQUQzMigKKy8vICAgICAgICAgICAgICBQUlRNUF9BREFQVEVSIHBBZCwKKy8vICAgICAgICAgICAgICBVTE9ORyBSZWdpc3Rlcl9PZmZzZXQsCisvLyAgICAgICAgICAgICAgUFVMT05HICBwVmFsdWUpCisvLworLy8gICAgICAgICBSVE1QX0lPX1dSSVRFMzIoCisvLyAgICAgICAgICAgICAgUFJUTVBfQURBUFRFUiBwQWQsCisvLyAgICAgICAgICAgICAgVUxPTkcgUmVnaXN0ZXJfT2Zmc2V0LAorLy8gICAgICAgICAgICAgIFVMT05HIFZhbHVlKQorLy8KKworLy8KKy8vIEJCUCAmIFJGIGFyZSB1c2luZyBpbmRpcmVjdCBhY2Nlc3MuIEJlZm9yZSB3cml0ZSBhbnkgdmFsdWUgaW50byBpdC4KKy8vIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nIGNvbW1hbmQgcGVuZGluZyB2aWEgY2hlY2tpbmcgYnVzeSBiaXQuCisvLworI2RlZmluZSBNQVhfQlVTWV9DT1VOVCAgMTAwICAgICAgICAgLy8gTnVtYmVyIG9mIHJldHJ5IGJlZm9yZSBmYWlsaW5nIGFjY2VzcyBCQlAgJiBSRiBpbmRpcmVjdCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgUlRNUF9SRl9JT19XUklURTMyKF9BLCBfVikgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBIWV9DU1I0X1NUUlVDICBWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORyAgICAgICAgICAgQnVzeUNudCA9IDA7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYpIAkgICAgICAgICAgICAgICAgXAorICAgIHsJCQkJCQkJCQkJCQlcCisgICAgICAgIHJldHVybjsJCQkJCQkJCQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBSRl9DU1JfQ0ZHMCwgJlZhbHVlLndvcmQpOyAgXAorICAgICAgICBpZiAoVmFsdWUuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJ1c3lDbnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICB3aGlsZSAoQnVzeUNudCA8IE1BWF9CVVNZX0NPVU5UKTsgICAgICAgICAgIFwKKyAgICBpZiAoQnVzeUNudCA8IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIFJGX0NTUl9DRkcwLCBfVik7ICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgIGksIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUF9JT19XUklURTMyKF9BLCBCQlBfQ1NSX0NGRywgQmJwQ3NyLndvcmQpOyAgICAgXAorICAgICAgICBmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgXAorICAgICAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBEQkdQUklOVF9FUlIoKCJERlMgQkJQIHJlYWQgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICAgXAorICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAge30KKy8vIFJlYWQgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQuIEdlbmVyYXRlIFBFUiB0byB0ZXN0IEJBCisjZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgIGksIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9BLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQkJCQlcCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CQkJCQkJCVwKKyAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQlcCisgICAgICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOyAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCURCR1BSSU5UX0VSUigoIkJCUCByZWFkIFIlZD0weCV4IGZhaWxcbiIsIF9JLCBCYnBDc3Iud29yZCkpOwlcCisgICAgICAgICooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOyAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKKwkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX0kpKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBXcml0ZSBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRCAmIHZhbHVlCisjZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5WYWx1ZSA9IF9WOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorCQlBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAorICAgICAgICAgICAgaWYgKF9BLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QdXNlY0RlbGF5KDEwMDApOwkJCQkJCQlcCisgICAgICAgIChfQSktPkJicFdyaXRlTGF0Y2hbX0ldID0gX1Y7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkPTB4JXggZmFpbFxuIiwgX0ksIEJicENzci53b3JkKSk7CVwKKwkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKKwkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjZGVmaW5lICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIGtoeikgIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogICAgIGtoeiA9IDI0MTIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogICAgIGtoeiA9IDI0MTcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogICAgIGtoeiA9IDI0MjIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogICAgIGtoeiA9IDI0MjcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogICAgIGtoeiA9IDI0MzIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogICAgIGtoeiA9IDI0MzcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNzogICAgIGtoeiA9IDI0NDIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgODogICAgIGtoeiA9IDI0NDcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgOTogICAgIGtoeiA9IDI0NTIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6ICAgIGtoeiA9IDI0NTcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6ICAgIGtoeiA9IDI0NjIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6ICAgIGtoeiA9IDI0NjcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6ICAgIGtoeiA9IDI0NzIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6ICAgIGtoeiA9IDI0ODQwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6ICAvKiBVTklJICovICBraHogPSA1MTgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOiAgLyogVU5JSSAqLyAga2h6ID0gNTIwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDogIC8qIFVOSUkgKi8gIGtoeiA9IDUyMjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6ICAvKiBVTklJICovICBraHogPSA1MjQwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOiAgLyogVU5JSSAqLyAga2h6ID0gNTI2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjogIC8qIFVOSUkgKi8gIGtoeiA9IDUyODAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6ICAvKiBVTklJICovICBraHogPSA1MzAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDY0OiAgLyogVU5JSSAqLyAga2h6ID0gNTMyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6IC8qIFVOSUkgKi8gIGtoeiA9IDU3NDUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOiAvKiBVTklJICovICBraHogPSA1NzY1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzogLyogVU5JSSAqLyAga2h6ID0gNTc4NTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjE6IC8qIFVOSUkgKi8gIGtoeiA9IDU4MDUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OiAvKiBVTklJICovICBraHogPSA1ODI1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDogLyogSGlwZXJMQU4yICovICBraHogPSA1NTAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwNDogLyogSGlwZXJMQU4yICovICBraHogPSA1NTIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwODogLyogSGlwZXJMQU4yICovICBraHogPSA1NTQwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDExMjogLyogSGlwZXJMQU4yICovICBraHogPSA1NTYwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDExNjogLyogSGlwZXJMQU4yICovICBraHogPSA1NTgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyMDogLyogSGlwZXJMQU4yICovICBraHogPSA1NjAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNDogLyogSGlwZXJMQU4yICovICBraHogPSA1NjIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyODogLyogSGlwZXJMQU4yICovICBraHogPSA1NjQwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMjogLyogSGlwZXJMQU4yICovICBraHogPSA1NjYwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEzNjogLyogSGlwZXJMQU4yICovICBraHogPSA1NjgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0MDogLyogSGlwZXJMQU4yICovICBraHogPSA1NzAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUxNzAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUxOTAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUyMTAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUyMzAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NDogLyogSmFwYW4gKi8gICBraHogPSA0OTIwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODg6IC8qIEphcGFuICovICAga2h6ID0gNDk0MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTkyOiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5NjAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE5NjogLyogSmFwYW4gKi8gICBraHogPSA0OTgwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDg6IC8qIEphcGFuLCBtZWFucyBKMDggKi8gICBraHogPSA1MDQwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTI6IC8qIEphcGFuLCBtZWFucyBKMTIgKi8gICBraHogPSA1MDYwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTY6IC8qIEphcGFuLCBtZWFucyBKMTYgKi8gICBraHogPSA1MDgwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAga2h6ID0gMjQxMjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworI2RlZmluZSAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKGtoeiwgY2gpICB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN3aXRjaCAoa2h6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MTIwMDA6ICAgIGNoID0gMTsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MTcwMDA6ICAgIGNoID0gMjsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjIwMDA6ICAgIGNoID0gMzsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjcwMDA6ICAgIGNoID0gNDsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzIwMDA6ICAgIGNoID0gNTsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzcwMDA6ICAgIGNoID0gNjsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDIwMDA6ICAgIGNoID0gNzsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDcwMDA6ICAgIGNoID0gODsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NTIwMDA6ICAgIGNoID0gOTsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NTcwMDA6ICAgIGNoID0gMTA7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjIwMDA6ICAgIGNoID0gMTE7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjcwMDA6ICAgIGNoID0gMTI7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NzIwMDA6ICAgIGNoID0gMTM7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0ODQwMDA6ICAgIGNoID0gMTQ7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUxODAwMDA6ICAgIGNoID0gMzY7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjAwMDAwOiAgICBjaCA9IDQwOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIyMDAwMDogICAgY2ggPSA0NDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyNDAwMDA6ICAgIGNoID0gNDg7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjYwMDAwOiAgICBjaCA9IDUyOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI4MDAwMDogICAgY2ggPSA1NjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUzMDAwMDA6ICAgIGNoID0gNjA7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzIwMDAwOiAgICBjaCA9IDY0OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc0NTAwMDogICAgY2ggPSAxNDk7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NjUwMDA6ICAgIGNoID0gMTUzOyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1Nzg1MDAwOiAgICBjaCA9IDE1NzsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTgwNTAwMDogICAgY2ggPSAxNjE7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU4MjUwMDA6ICAgIGNoID0gMTY1OyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTAwMDAwOiAgICBjaCA9IDEwMDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTIwMDAwOiAgICBjaCA9IDEwNDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTQwMDAwOiAgICBjaCA9IDEwODsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTYwMDAwOiAgICBjaCA9IDExMjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTgwMDAwOiAgICBjaCA9IDExNjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjAwMDAwOiAgICBjaCA9IDEyMDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjIwMDAwOiAgICBjaCA9IDEyNDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjQwMDAwOiAgICBjaCA9IDEyODsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjYwMDAwOiAgICBjaCA9IDEzMjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjgwMDAwOiAgICBjaCA9IDEzNjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzAwMDAwOiAgICBjaCA9IDE0MDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTcwMDAwOiAgICBjaCA9IDM0OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTkwMDAwOiAgICBjaCA9IDM4OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjEwMDAwOiAgICBjaCA9IDQyOyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjMwMDAwOiAgICBjaCA9IDQ2OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTIwMDAwOiAgICBjaCA9IDE4NDsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTQwMDAwOiAgICBjaCA9IDE4ODsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTYwMDAwOiAgICBjaCA9IDE5MjsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTgwMDAwOiAgICBjaCA9IDE5NjsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDQwMDAwOiAgICBjaCA9IDIwODsgLyogSmFwYW4sIG1lYW5zIEowOCAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUwNjAwMDA6ICAgIGNoID0gMjEyOyAvKiBKYXBhbiwgbWVhbnMgSjEyICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA4MDAwMDogICAgY2ggPSAyMTY7IC8qIEphcGFuLCBtZWFucyBKMTYgKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICBjaCA9IDE7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworLy8KKy8vIENvbW1vbiBmcmFnbWVudCBsaXN0IHN0cnVjdHVyZSAtICBJZGVudGljYWwgdG8gdGhlIHNjYXR0ZXIgZ2F0aGVyIGZyYWcgbGlzdCBzdHJ1Y3R1cmUKKy8vCisjZGVmaW5lIE5JQ19NQVhfUEhZU19CVUZfQ09VTlQgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCB7CisgICAgUFZPSUQJCUFkZHJlc3M7CisgICAgVUxPTkcJCUxlbmd0aDsKKyAgICBQVUxPTkcJCVJlc2VydmVkOworfSBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UOworCisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgeworICAgIFVMT05HICBOdW1iZXJPZkVsZW1lbnRzOworICAgIFBVTE9ORyBSZXNlcnZlZDsKKyAgICBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgRWxlbWVudHNbTklDX01BWF9QSFlTX0JVRl9DT1VOVF07Cit9IFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCwgKlBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1Q7CisKKy8vCisvLyAgU29tZSB1dGlsaXR5IG1hY3JvcworLy8KKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihfYSwgX2IpICAgICAoKChfYSkgPCAoX2IpKSA/IChfYSkgOiAoX2IpKQorI2VuZGlmCisKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChfYSwgX2IpICAgICAoKChfYSkgPiAoX2IpKSA/IChfYSkgOiAoX2IpKQorI2VuZGlmCisKKyNkZWZpbmUgR0VUX0xOQV9HQUlOKF9wQWQpCSgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgPyAoX3BBZC0+QkxOQUdhaW4pIDogKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDY0KSA/IChfcEFkLT5BTE5BR2FpbjApIDogKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDEyOCkgPyAoX3BBZC0+QUxOQUdhaW4xKSA6IChfcEFkLT5BTE5BR2FpbjIpKSkpCisKKyNkZWZpbmUgSU5DX0NPVU5URVI2NChWYWwpICAgICAgICAgIChWYWwuUXVhZFBhcnQrKykKKworI2RlZmluZSBJTkZSQV9PTihfcCkgICAgICAgICAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhfcCwgZk9QX1NUQVRVU19JTkZSQV9PTikpCisjZGVmaW5lIEFESE9DX09OKF9wKSAgICAgICAgICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKF9wLCBmT1BfU1RBVFVTX0FESE9DX09OKSkKKyNkZWZpbmUgTU9OSVRPUl9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkJzc1R5cGUpID09IEJTU19NT05JVE9SKQorI2RlZmluZSBJRExFX09OKF9wKSAgICAgICAgICAgICAgICAgKCFJTkZSQV9PTihfcCkgJiYgIUFESE9DX09OKF9wKSkKKworLy8gQ2hlY2sgTEVBUCAmIENDS00gZmxhZ3MKKyNkZWZpbmUgTEVBUF9PTihfcCkgICAgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2RlZmluZSBMRUFQX0NDS01fT04oX3ApICAgICAgICAgICAgKCgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoSW5mby5DQ0tNID09IFRSVUUpKQorCisvLyBpZiBvcmdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLCB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCisjZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCWlmICgoKCooX3BCdWZWQSArIDEyKSA8PCA4KSArICooX3BCdWZWQSArIDEzKSkgPiAxNTAwKQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBICsgMTIsIDIpIHx8IAkJCVwKKwkJCU5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBfcEJ1ZlZBICsgMTIsIDIpKQkJXAorCQl7CQkJCQkJCQkJCQkJCQlcCisJCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF9CUklER0VfVFVOTkVMOwkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBOVUxMOwkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCit9CisKKy8vIE5ldyBEZWZpbmUgZm9yIG5ldyBUeCBQYXRoLgorI2RlZmluZSBFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoKCgqKF9wQnVmVkEpIDw8IDgpICsgKihfcEJ1ZlZBICsgMSkpID4gMTUwMCkJCQlcCisJewkJCQkJCQkJCQkJCQkJCVwKKwkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfODAyXzFIOwkJCQkJCVwKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShJUFgsIF9wQnVmVkEsIDIpIHx8IAkJCQlcCisJCQlOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgX3BCdWZWQSwgMikpCQkJXAorCQl7CQkJCQkJCQkJCQkJCQlcCisJCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF9CUklER0VfVFVOTkVMOwkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBOVUxMOwkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCit9CisKKworI2RlZmluZSBNQUtFXzgwMl8zX0hFQURFUihfcCwgX3BNYWMxLCBfcE1hYzIsIF9wVHlwZSkgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE5kaXNNb3ZlTWVtb3J5KF9wLCBfcE1hYzEsIE1BQ19BRERSX0xFTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE5kaXNNb3ZlTWVtb3J5KChfcCArIE1BQ19BRERSX0xFTiksIF9wTWFjMiwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgXAorICAgIE5kaXNNb3ZlTWVtb3J5KChfcCArIE1BQ19BRERSX0xFTiAqIDIpLCBfcFR5cGUsIExFTkdUSF84MDJfM19UWVBFKTsgXAorfQorCisvLyBpZiBwRGF0YSBoYXMgbm8gTExDL1NOQVAgKG5laXRoZXIgUkZDMTA0MiBub3IgQnJpZGdlIHR1bm5lbCksIGtlZXAgaXQgdGhhdCB3YXkuCisvLyBlbHNlIGlmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBMTEMvU05BUC1lbmNhcGVkIElQWCBvciBBUFBMRVRBTEssIHByZXNlcnZlIHRoZSBMTEMvU05BUCBmaWVsZAorLy8gZWxzZSByZW1vdmUgdGhlIExMQy9TTkFQIGZpZWxkIGZyb20gdGhlIHJlc3VsdCBFdGhlcm5ldCBmcmFtZQorLy8gUGF0Y2ggZm9yIFdIUUwgb25seSwgd2hpY2ggZGlkIG5vdCB0dXJuIG9uIE5ldGJpb3MgYnV0IHVzZSBJUFggd2l0aGluIGl0cyBwYXlsb2FkCisvLyBOb3RlOgorLy8gICAgIF9wRGF0YSAmIF9EYXRhU2l6ZSBtYXkgYmUgYWx0ZXJlZCAocmVtb3ZlIDgtYnl0ZSBMTEMvU05BUCkgYnkgdGhpcyBNQUNSTworLy8gICAgIF9wUmVtb3ZlZExMQ1NOQVA6IHBvaW50ZXIgdG8gcmVtb3ZlZCBMTEMvU05BUDsgTlVMTCBpcyBub3QgcmVtb3ZlZAorI2RlZmluZSBDT05WRVJUX1RPXzgwMl8zKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgX3BEYXRhLCBfRGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgTExDX0xlblsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9wUmVtb3ZlZExMQ1NOQVAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIF9wRGF0YSwgNikgIHx8ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVUNIQVIgcFByb3RvID0gX3BEYXRhICsgNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKE5kaXNFcXVhbE1lbW9yeShJUFgsIHBQcm90bywgMikgfHwgTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIHBQcm90bywgMikpICYmICBcCisgICAgICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIF9wRGF0YSwgNikpICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIHBQcm90byk7ICAgICAgICAgICBcCisgICAgICAgICAgICBfcFJlbW92ZWRMTENTTkFQID0gX3BEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfRGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xX0g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfcERhdGEgKz0gTEVOR1RIXzgwMl8xX0g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExMQ19MZW5bMF0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExMQ19MZW5bMV0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgTExDX0xlbik7ICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgU1dJVENIX0FCKCBfcEFBLCBfcEJCKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBWT0lEIHBDQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBDQyA9IF9wQkI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcEJCID0gX3BBQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9wQUEgPSBwQ0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gRW5xdWV1ZSB0aGlzIGZyYW1lIHRvIE1MTUUgZW5naW5lCisvLyBXZSBuZWVkIHRvIGVucXVldWUgdGhlIHdob2xlIGZyYW1lIGJlY2F1c2UgTUxNRSBuZWVkIHRvIHBhc3MgZGF0YSB0eXBlCisvLyBpbmZvcm1hdGlvbiBmcm9tIDgwMi4xMSBoZWFkZXIKKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShfcEFkLCBXY2lkLCBfcEZyYW1lLCBfRnJhbWVTaXplLCBfUnNzaTAsIF9Sc3NpMSwgX1Jzc2kyLCBfUGxjcFNpZ25hbCkgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUlOVDMyIEhpZ2gzMlRTRiwgTG93MzJUU0Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX0lPX1JFQUQzMihfcEFkLCBUU0ZfVElNRVJfRFcxLCAmSGlnaDMyVFNGKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9JT19SRUFEMzIoX3BBZCwgVFNGX1RJTUVSX0RXMCwgJkxvdzMyVFNGKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1sbWVFbnF1ZXVlRm9yUmVjdihfcEFkLCBXY2lkLCBIaWdoMzJUU0YsIExvdzMyVFNGLCAoVUNIQVIpX1Jzc2kwLCAoVUNIQVIpX1Jzc2kxLChVQ0hBUilfUnNzaTIsX0ZyYW1lU2l6ZSwgX3BGcmFtZSwgKFVDSEFSKV9QbGNwU2lnbmFsKTsgICBcCit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNkZWZpbmUgTkRJU19RVUVSWV9CVUZGRVIoX05kaXNCdWYsIF9wcFZBLCBfcEJ1ZkxlbikgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzUXVlcnlCdWZmZXIoX05kaXNCdWYsIF9wcFZBLCBfcEJ1ZkxlbikKKworI2RlZmluZSBNQUNfQUREUl9FUVVBTChwQWRkcjEscEFkZHIyKSAgICAgICAgICAgUlRNUEVxdWFsTWVtb3J5KChQVk9JRCkocEFkZHIxKSwgKFBWT0lEKShwQWRkcjIpLCBNQUNfQUREUl9MRU4pCisjZGVmaW5lIFNTSURfRVFVQUwoc3NpZDEsIGxlbjEsIHNzaWQyLCBsZW4yKSAgICAoKGxlbjE9PWxlbjIpICYmIChSVE1QRXF1YWxNZW1vcnkoc3NpZDEsIHNzaWQyLCBsZW4xKSkpCisKKy8vCisvLyBDaGVjayBpZiBpdCBpcyBKYXBhbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbC4KKy8vCisjZGVmaW5lIEphcGFuQ2hhbm5lbENoZWNrKGNoYW5uZWwpICAoKGNoYW5uZWwgPT0gNTIpIHx8IChjaGFubmVsID09IDU2KSB8fCAoY2hhbm5lbCA9PSA2MCkgfHwgKGNoYW5uZWwgPT0gNjQpKQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFNUQV9QT1JUX1NFQ1VSRUQoX3BBZCkgXAoreyBcCisJX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7IFwKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZfcEFkLT5NYWNUYWJMb2NrKTsgXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOyBcCisJTmRpc1JlbGVhc2VTcGluTG9jaygmX3BBZC0+TWFjVGFiTG9jayk7IFwKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisvLworLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkVHX1BBSVIKK3sKKwlVTE9ORyAgIFJlZ2lzdGVyOworCVVMT05HICAgVmFsdWU7Cit9IFJUTVBfUkVHX1BBSVIsICpQUlRNUF9SRUdfUEFJUjsKKwordHlwZWRlZiBzdHJ1Y3QgIF9SRUdfUEFJUgoreworCVVDSEFSICAgUmVnaXN0ZXI7CisJVUNIQVIgICBWYWx1ZTsKK30gUkVHX1BBSVIsICpQUkVHX1BBSVI7CisKKy8vCisvLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9SRl9SRUdTCit7CisJVUNIQVIgICBDaGFubmVsOworCVVMT05HICAgUjE7CisJVUxPTkcgICBSMjsKKwlVTE9ORyAgIFIzOworCVVMT05HICAgUjQ7Cit9IFJUTVBfUkZfUkVHUywgKlBSVE1QX1JGX1JFR1M7CisKK3R5cGVkZWYgc3RydWN0IF9GUkVRVUVOQ1lfSVRFTSB7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglOOworCVVDSEFSCVI7CisJVUNIQVIJSzsKK30gRlJFUVVFTkNZX0lURU0sICpQRlJFUVVFTkNZX0lURU07CisKKy8vCisvLyAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQorLy8gIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfRE1BQlVGCit7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOworCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBUeEJ1ZiBwaHlzaWNhbCBhZGRyZXNzCit9IFJUTVBfRE1BQlVGLCAqUFJUTVBfRE1BQlVGOworCisKK3R5cGVkZWYJdW5pb24JX0hFQURFUl84MDJfMTFfU0VReworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBzdHJ1Y3QgeworICAgCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworCVVTSE9SVAkJCUZyYWc6NDsKKyAgICB9ICAgZmllbGQ7CisjZWxzZQorICAgIHN0cnVjdCB7CisJVVNIT1JUCQkJRnJhZzo0OworCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworICAgIH0gICBmaWVsZDsKKyNlbmRpZgorICAgIFVTSE9SVCAgICAgICAgICAgdmFsdWU7Cit9CUhFQURFUl84MDJfMTFfU0VRLCAqUEhFQURFUl84MDJfMTFfU0VROworCisvLworLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKKy8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFT1JERVJCVUYKK3sKKwlCT09MRUFOCQkJSXNGdWxsOworCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCisJVUNIQVIJCQlIZWFkZXI4MDJfM1sxNF07CisJSEVBREVSXzgwMl8xMV9TRVEJCQlTZXF1ZW5jZTsJLy9zdXBwb3J0IGNvbXByZXNzZWQgYml0bWFwIEJBLCBzbyBubyBjb25zaWRlciBmcmFnbWVudCBpbiBCQQorCVVDSEFSIAkJRGF0YU9mZnNldDsKKwlVU0hPUlQgCQlEYXRhc2l6ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7CisjaWZkZWYgUlQyODYwCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBUeEJ1ZiBwaHlzaWNhbCBhZGRyZXNzCisjZW5kaWYgLy8gUlQyODYwIC8vCit9ICAgUlRNUF9SRU9SREVSQlVGLCAqUFJUTVBfUkVPUkRFUkJVRjsKKworLy8KKy8vIENvbnRyb2wgYmxvY2sgKERlc2NyaXB0b3IpIGZvciBhbGwgcmluZyBkZXNjcmlwdG9yIERNQSBvcGVyYXRpb24sIGJ1ZmZlciBtdXN0IGJlCisvLyBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4gTkRJU19QQUNLRVQgc3RvcmVkIHRoZSBiaW5kaW5nIFJ4IHBhY2tldCBkZXNjcmlwdG9yCisvLyB3aGljaCB3b24ndCBiZSByZWxlYXNlZCwgZHJpdmVyIGhhcyB0byB3YWl0IHVudGlsIHVwcGVyIGxheWVyIHJldHVybiB0aGUgcGFja2V0CisvLyBiZWZvcmUgZ2l2ZWluZyB1cCB0aGlzIHJ4IHJpbmcgZGVzY3JpcHRvciB0byBBU0lDLiBORElTX0JVRkZFUiBpcyBhc3NvY2FpdGVkIHBhaXIKKy8vIHRvIGRlc2NyaWJlIHRoZSBwYWNrZXQgYnVmZmVyLiBGb3IgVHgsIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgdHggcGFja2V0IGRlc2NyaXB0b3IKKy8vIHdoaWNoIGRyaXZlciBzaG91bGQgQUNLIHVwcGVyIGxheWVyIHdoZW4gdGhlIHR4IGlzIHBoeXNpY2FsbHkgZG9uZSBvciBmYWlsZWQuCisvLwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfRE1BQ0IKK3sKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7ICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgc2l6ZQorCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcworCVBORElTX1BBQ0tFVCBwTmRpc1BhY2tldDsKKwlQTkRJU19QQUNLRVQgcE5leHROZGlzUGFja2V0OworCisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgRG1hQnVmOyAgICAgICAgICAgICAvLyBBc3NvY2lhdGVkIERNQSBidWZmZXIgc3RydWN0dXJlCit9IFJUTVBfRE1BQ0IsICpQUlRNUF9ETUFDQjsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVFhfQlVGCit7CisJUFFVRVVFX0VOVFJZICAgIE5leHQ7CisJVUNIQVIgICAgICAgICAgIEluZGV4OworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBzaXplCisJUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzCit9IFJUTVBfVFhCVUYsICpQUlRNUF9UWEJVRjsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfUlhfQlVGCit7CisJQk9PTEVBTiAgICAgICAgICAgSW5Vc2U7CisJVUxPTkcgICAgICAgICAgIAlCeUJhUmVjSW5kZXg7CisJUlRNUF9SRU9SREVSQlVGCU1BUF9SWEJ1ZltNQVhfUlhfUkVPUkRFUkJVRl07Cit9IFJUTVBfUlhCVUYsICpQUlRNUF9SWEJVRjsKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1RYX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW1RYX1JJTkdfU0laRV07CisJVUlOVDMyCQlUeENwdUlkeDsKKwlVSU5UMzIJCVR4RG1hSWR4OworCVVJTlQzMgkJVHhTd0ZyZWVJZHg7IAkvLyBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXgKK30gUlRNUF9UWF9SSU5HLCAqUFJUTVBfVFhfUklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfUlhfUklORworeworCVJUTVBfRE1BQ0IgIENlbGxbUlhfUklOR19TSVpFXTsKKwlVSU5UMzIJCVJ4Q3B1SWR4OworCVVJTlQzMgkJUnhEbWFJZHg7CisJSU5UMzIJCVJ4U3dSZWFkSWR4OyAJLy8gc29mdHdhcmUgbmV4dCByZWFkIGluZGV4Cit9IFJUTVBfUlhfUklORywgKlBSVE1QX1JYX1JJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX01HTVRfUklORworeworCVJUTVBfRE1BQ0IgIENlbGxbTUdNVF9SSU5HX1NJWkVdOworCVVJTlQzMgkJVHhDcHVJZHg7CisJVUlOVDMyCQlUeERtYUlkeDsKKwlVSU5UMzIJCVR4U3dGcmVlSWR4OyAvLyBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXgKK30gUlRNUF9NR01UX1JJTkcsICpQUlRNUF9NR01UX1JJTkc7CisKKy8vCisvLyAgU3RhdGlzdGljIGNvdW50ZXIgc3RydWN0dXJlCisvLwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzMKK3sKKwkvLyBHZW5lcmFsIFN0YXRzCisJVUxPTkcgICAgICAgR29vZFRyYW5zbWl0czsKKwlVTE9ORyAgICAgICBHb29kUmVjZWl2ZXM7CisJVUxPTkcgICAgICAgVHhFcnJvcnM7CisJVUxPTkcgICAgICAgUnhFcnJvcnM7CisJVUxPTkcgICAgICAgUnhOb0J1ZmZlcjsKKworCS8vIEV0aGVybmV0IFN0YXRzCisJVUxPTkcgICAgICAgUmN2QWxpZ25tZW50RXJyb3JzOworCVVMT05HICAgICAgIE9uZUNvbGxpc2lvbjsKKwlVTE9ORyAgICAgICBNb3JlQ29sbGlzaW9uczsKKworfSBDT1VOVEVSXzgwMl8zLCAqUENPVU5URVJfODAyXzM7CisKK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8xMSB7CisJVUxPTkcgICAgICAgICAgIExlbmd0aDsKKwlMQVJHRV9JTlRFR0VSICAgTGFzdFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OworCUxBUkdFX0lOVEVHRVIgICBSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBNdWx0aXBsZVJldHJ5Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUlRTRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBBQ0tGYWlsdXJlQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OworfSBDT1VOVEVSXzgwMl8xMSwgKlBDT1VOVEVSXzgwMl8xMTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfUkFMSU5LIHsKKwlVTE9ORyAgICAgICAgICAgVHJhbnNtaXR0ZWRCeXRlQ291bnQ7ICAgLy8gYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0CisJVUxPTkcgICAgICAgICAgIFJlY2VpdmVkQnl0ZUNvdW50OyAgICAgIC8vIGJvdGggQ1JDIG9rYXkgYW5kIENSQyBlcnJvciwgdXNlZCB0byBjYWxjdWxhdGUgUlggdGhyb3VnaHB1dAorCVVMT05HICAgICAgICAgICBCZWVuRGlzYXNzb2NpYXRlZENvdW50OworCVVMT05HICAgICAgICAgICBCYWRDUUlBdXRvUmVjb3ZlcnlDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUG9vckNRSVJvYW1pbmdDb3VudDsKKwlVTE9ORyAgICAgICAgICAgTWdtdFJpbmdGdWxsQ291bnQ7CisJVUxPTkcgICAgICAgICAgIFJ4Q291bnRTaW5jZUxhc3ROVUxMOworCVVMT05HICAgICAgICAgICBSeENvdW50OworCVVMT05HICAgICAgICAgICBSeFJpbmdFcnJDb3VudDsKKwlVTE9ORyAgICAgICAgICAgS2lja1R4Q291bnQ7CisJVUxPTkcgICAgICAgICAgIFR4UmluZ0VyckNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSZWFsRmNzRXJyQ291bnQ7CisJVUxPTkcgICAgICAgICAgIFBlbmRpbmdOZGlzUGFja2V0Q291bnQ7CisKKwlVTE9ORyAgICAgICAgICAgT25lU2VjT3NUeENvdW50W05VTV9PRl9UWF9SSU5HXTsKKwlVTE9ORyAgICAgICAgICAgT25lU2VjRG1hRG9uZUNvdW50W05VTV9PRl9UWF9SSU5HXTsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhEb25lQ291bnQ7CisJVUxPTkcgICAgICAgICAgIE9uZVNlY1J4Q291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4QWdncmVnYXRpb25Db3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50OworCisJVUlOVDMyICAgCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OworCisKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNGYWxzZUNDQUNudDsgICAgICAvLyBDQ0EgZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyCisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4T2tDbnQ7ICAgICAgICAgIC8vIFJYIHdpdGhvdXQgZXJyb3IKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0RhdGFDbnQ7ICAgICAgLy8gdW5pY2FzdC10by1tZSBEQVRBIGZyYW1lIGNvdW50CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4RmNzRXJyQ250OyAgICAgIC8vIENSQyBlcnJvcgorCVVJTlQzMiAgICAgICAgICBPbmVTZWNCZWFjb25TZW50Q250OworCVVJTlQzMiAgICAgICAgICBMYXN0T25lU2VjVG90YWxUeENvdW50OyAvLyBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQgKyBPbmVTZWNUeEZhaWxDb3VudAorCVVJTlQzMiAgICAgICAgICBMYXN0T25lU2VjUnhPa0RhdGFDbnQ7ICAvLyBPbmVTZWNSeE9rRGF0YUNudAorCVVMT05HCQlEdXBsaWNhdGVSY3Y7CisJVUxPTkcJCVR4QWdnQ291bnQ7CisJVUxPTkcJCVR4Tm9uQWdnQ291bnQ7CisJVUxPTkcJCVR4QWdnMU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cyTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzNNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnNE1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c1TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzZNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnN01QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c4TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzlNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTBNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTFNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTJNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTNNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTRNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTVNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTZNUERVQ291bnQ7CisKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVTsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkT2N0ZXNJbkFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBSZWNlaXZlZEFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZEFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE1QRFVzSW5BTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBNUERVSW5SZWNlaXZlZEFNUERVQ291bnQ7Cit9IENPVU5URVJfUkFMSU5LLCAqUENPVU5URVJfUkFMSU5LOworCit0eXBlZGVmIHN0cnVjdCBfUElEX0NPVU5URVIgeworCVVMT05HICAgICAgICAgICBUeEFja1JlcXVpcmVkQ291bnQ7ICAgICAgLy8gQ1JDIGVycm9yCisJVUxPTkcgICAgICAgICAgIFR4QWdncmVDb3VudDsKKwlVTE9ORyAgICAgICAgICAgVHhTdWNjZXNzQ291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50CisJVUxPTkcJCUxhc3RTdWNjZXNzUmF0ZTsKK30gUElEX0NPVU5URVIsICpQUElEX0NPVU5URVI7CisKK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSX0RSUyB7CisJLy8gdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLgorCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCVVDSEFSICAgICAgICAgICBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KKwlVTE9ORyAgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQorCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKKwlCT09MRUFOICAgICAgICAgZkxhc3RTZWNBY2NvcmRpbmdSU1NJOworCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KKwlVQ0hBUgkJCUxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uOyAvL0tlZXAgbGFzdCB0aW1lIHZhbHVlIG9mIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24KKwlVTE9ORwkJCUxhc3RUeE9rQ291bnQ7Cit9IENPVU5URVJfRFJTLCAqUENPVU5URVJfRFJTOworCisvLworLy8gIEFyY2ZvdXIgU3RydWN0dXJlIEFkZGVkIGJ5IFBhdWxXdQorLy8KK3R5cGVkZWYgc3RydWN0ICBfQVJDRk9VUgoreworCVVJTlQgICAgICAgICAgICBYOworCVVJTlQgICAgICAgICAgICBZOworCVVDSEFSICAgICAgICAgICBTVEFURVsyNTZdOworfSBBUkNGT1VSQ09OVEVYVCwgKlBBUkNGT1VSQ09OVEVYVDsKKworLy8gTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJIHRvby4ganVzdCBjb3B5IHRvIFRYV0kuCit0eXBlZGVmIHN0cnVjdCAgX1JFQ0VJVkVfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJTUlNTzoxOworCVVTSE9SVAkJT0ZETToxOworCVVTSE9SVAkJcnN2OjM7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCU1vZGU6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQgICAJTnVtT2ZSWDoyOyAgICAgICAgICAgICAgICAgLy8gTUlNTy4gV0UgSEFWRSAzUgorI2Vsc2UKKwlVU0hPUlQgICAJTnVtT2ZSWDoyOyAgICAgICAgICAgICAgICAgLy8gTUlNTy4gV0UgSEFWRSAzUgorCVVTSE9SVAkJTW9kZToyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCU9GRE06MTsKKwlVU0hPUlQJCU1JTU86MTsKKyNlbmRpZgorIH0gUkVDRUlWRV9TRVRUSU5HLCAqUFJFQ0VJVkVfU0VUVElORzsKKworLy8gU2hhcmVkIGtleSBkYXRhIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgIF9XRVBfS0VZIHsKKwlVQ0hBUiAgIEtleUxlbjsgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZAorCVVDSEFSICAgS2V5W01BWF9MRU5fT0ZfS0VZXTsgICAgICAgIC8vIHJpZ2h0IG5vdyB3ZSBpbXBsZW1lbnQgNCBrZXlzLCAxMjggYml0cyBtYXgKK30gV0VQX0tFWSwgKlBXRVBfS0VZOworCit0eXBlZGVmIHN0cnVjdCBfQ0lQSEVSX0tFWSB7CisJVUNIQVIgICBLZXlbMTZdOyAgICAgICAgICAgIC8vIHJpZ2h0IG5vdyB3ZSBpbXBsZW1lbnQgNCBrZXlzLCAxMjggYml0cyBtYXgKKwlVQ0hBUiAgIFJ4TWljWzhdOwkJCS8vIG1ha2UgYWxpZ25tZW50CisJVUNIQVIgICBUeE1pY1s4XTsKKwlVQ0hBUiAgIFR4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCisJVUNIQVIgICBSeFRzY1s2XTsgICAgICAgICAgIC8vIDQ4Yml0IFRTQyB2YWx1ZQorCVVDSEFSICAgQ2lwaGVyQWxnOyAgICAgICAgICAvLyAwLW5vbmUsIDE6V0VQNjQsIDI6V0VQMTI4LCAzOlRLSVAsIDQ6QUVTLCA1OkNLSVA2NCwgNjpDS0lQMTI4CisJVUNIQVIgICBLZXlMZW47CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUNIQVIgICBCc3NJZFs2XTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIC8vIEtleSBsZW5ndGggZm9yIGVhY2gga2V5LCAwOiBlbnRyeSBpcyBpbnZhbGlkCisJVUNIQVIgICBUeXBlOyAgICAgICAgICAgICAgIC8vIEluZGljYXRlIFBhaXJ3aXNlL0dyb3VwIHdoZW4gcmVwb3J0aW5nIE1JQyBlcnJvcgorfSBDSVBIRVJfS0VZLCAqUENJUEhFUl9LRVk7CisKK3R5cGVkZWYgc3RydWN0IF9CQlBfVFVOSU5HX1NUUlVDVCB7CisJQk9PTEVBTiAgICAgRW5hYmxlOworCVVDSEFSICAgICAgIEZhbHNlQ2NhQ291bnRVcHBlckJvdW5kOyAgLy8gMTAwIHBlciBzZWMKKwlVQ0hBUiAgICAgICBGYWxzZUNjYUNvdW50TG93ZXJCb3VuZDsgIC8vIDEwIHBlciBzZWMKKwlVQ0hBUiAgICAgICBSMTdMb3dlckJvdW5kOyAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiBFMlBST00KKwlVQ0hBUiAgICAgICBSMTdVcHBlckJvdW5kOyAgICAgICAgICAgIC8vIDB4NjggYWNjb3JkaW5nIHRvIERhdmlkIFR1bmcKKwlVQ0hBUiAgICAgICBDdXJyZW50UjE3VmFsdWU7Cit9IEJCUF9UVU5JTkcsICpQQkJQX1RVTklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1NPRlRfUlhfQU5UX0RJVkVSU0lUWV9TVFJVQ1QgeworCVVDSEFSICAgICBFdmFsdWF0ZVBlcmlvZDsJCSAvLyAwOm5vdCBldmFsdXRlIHN0YXR1cywgMTogZXZhbHVhdGUgc3RhdHVzLCAyOiBzd2l0Y2hpbmcgc3RhdHVzCisJVUNIQVIgICAgIFBhaXIxUHJpbWFyeVJ4QW50OyAgICAgLy8gMDpBbnQtRTEsIDE6QW50LUUyCisJVUNIQVIgICAgIFBhaXIxU2Vjb25kYXJ5UnhBbnQ7ICAgLy8gMDpBbnQtRTEsIDE6QW50LUUyCisJVUNIQVIgICAgIFBhaXIyUHJpbWFyeVJ4QW50OyAgICAgLy8gMDpBbnQtRTMsIDE6QW50LUU0CisJVUNIQVIgICAgIFBhaXIyU2Vjb25kYXJ5UnhBbnQ7ICAgLy8gMDpBbnQtRTMsIDE6QW50LUU0CisJU0hPUlQgICAgIFBhaXIxQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMSwgQXZnUnNzaVsxXTpFMgorCVNIT1JUICAgICBQYWlyMkF2Z1Jzc2lbMl07ICAgICAgIC8vIEF2Z1Jzc2lbMF06RTMsIEF2Z1Jzc2lbMV06RTQKKwlTSE9SVCAgICAgUGFpcjFMYXN0QXZnUnNzaTsgICAgICAvLworCVNIT1JUICAgICBQYWlyMkxhc3RBdmdSc3NpOyAgICAgIC8vCisJVUxPTkcgICAgIFJjdlBrdE51bVdoZW5FdmFsdWF0ZTsKKwlCT09MRUFOICAgRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgUnhBbnREaXZlcnNpdHlUaW1lcjsKK30gU09GVF9SWF9BTlRfRElWRVJTSVRZLCAqUFNPRlRfUlhfQU5UX0RJVkVSU0lUWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfQVVUSF9JTkZPIHsKKwlCT09MRUFOICAgICAgICAgRW5hYmxlZDsgICAgICAgIC8vVHVyZTogRW5hYmxlIExFQVAgQXV0aGVudGljYXRpb24KKwlCT09MRUFOICAgICAgICAgQ0NLTTsgICAgICAgICAgIC8vVHVyZTogVXNlIEZhc3QgUmVhdXRoZW50aWNhdGlvbiB3aXRoIENDS00KKwlVQ0hBUiAgICAgICAgICAgUmVzZXJ2ZVsyXTsKKwlVQ0hBUiAgICAgICAgICAgVXNlck5hbWVbMjU2XTsgIC8vTEVBUCwgVXNlciBuYW1lCisJVUxPTkcgICAgICAgICAgIFVzZXJOYW1lTGVuOworCVVDSEFSICAgICAgICAgICBQYXNzd29yZFsyNTZdOyAgLy9MRUFQLCBVc2VyIFBhc3N3b3JkCisJVUxPTkcgICAgICAgICAgIFBhc3N3b3JkTGVuOworfSBMRUFQX0FVVEhfSU5GTywgKlBMRUFQX0FVVEhfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgIEVycm9yQ29kZVsyXTsgIC8vMDAgMDEtSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0eXBlCisJCQkJCQkJCS8vMDAgMDItQXV0aGVudGljYXRpb24gdGltZW91dAorCQkJCQkJCQkvLzAwIDAzLUNoYWxsZW5nZSBmcm9tIEFQIGZhaWxlZAorCQkJCQkJCQkvLzAwIDA0LUNoYWxsZW5nZSB0byBBUCBmYWlsZWQKKwlCT09MRUFOICAgICAgUmVwb3J0ZWQ7Cit9IFJPR1VFQVBfRU5UUlksICpQUk9HVUVBUF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVDSEFSICAgICAgICAgICAgICAgUm9ndWVBcE5yOworCVJPR1VFQVBfRU5UUlkgICAgICAgUm9ndWVBcEVudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKK30gUk9HVUVBUF9UQUJMRSwgKlBST0dVRUFQX1RBQkxFOworCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTEVBTiAgICAgRW5hYmxlOworCVVDSEFSICAgICAgIERlbHRhOworCUJPT0xFQU4gICAgIFBsdXNTaWduOworfSBDQ0tfVFhfUE9XRVJfQ0FMSUJSQVRFLCAqUENDS19UWF9QT1dFUl9DQUxJQlJBVEU7CisKKy8vCisvLyBSZWNlaXZlIFR1cGxlIENhY2hlIEZvcm1hdAorLy8KK3R5cGVkZWYgc3RydWN0ICBfVFVQTEVfQ0FDSEUgICAgeworCUJPT0xFQU4gICAgICAgICBWYWxpZDsKKwlVQ0hBUiAgICAgICAgICAgTWFjQWRkcmVzc1tNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgICAgICBTZXF1ZW5jZTsKKwlVU0hPUlQgICAgICAgICAgRnJhZzsKK30gVFVQTEVfQ0FDSEUsICpQVFVQTEVfQ0FDSEU7CisKKy8vCisvLyBGcmFnbWVudCBGcmFtZSBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmIHN0cnVjdCAgX0ZSQUdNRU5UX0ZSQU1FIHsKKwlQTkRJU19QQUNLRVQgICAgcEZyYWdQYWNrZXQ7CisJVUxPTkcgICAgICAgUnhTaXplOworCVVTSE9SVCAgICAgIFNlcXVlbmNlOworCVVTSE9SVCAgICAgIExhc3RGcmFnOworCVVMT05HICAgICAgIEZsYWdzOyAgICAgICAgICAvLyBTb21lIGV4dHJhIGZyYW1lIGluZm9ybWF0aW9uLiBiaXQgMDogTExDIHByZXNlbnRlZAorfSBGUkFHTUVOVF9GUkFNRSwgKlBGUkFHTUVOVF9GUkFNRTsKKworCisvLworLy8gUGFja2V0IGluZm9ybWF0aW9uIGZvciBOZGlzUXVlcnlQYWNrZXQKKy8vCit0eXBlZGVmIHN0cnVjdCAgX1BBQ0tFVF9JTkZPICAgIHsKKwlVSU5UICAgICAgICAgICAgUGh5c2ljYWxCdWZmZXJDb3VudDsgICAgLy8gUGh5c2ljYWwgYnJlYWtzIG9mIGJ1ZmZlciBkZXNjcmlwb3IgY2hhaW5lZAorCVVJTlQgICAgICAgICAgICBCdWZmZXJDb3VudCA7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgQnVmZmVyIGRlc2NyaXB0b3IgY2hhaW5lZAorCVVJTlQgICAgICAgICAgICBUb3RhbFBhY2tldExlbmd0aCA7ICAgICAvLyBTZWxmIGV4cGxhaW5lZAorCVBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXI7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIGZpcnN0IGJ1ZmZlciBkZXNjcmlwdG9yCit9IFBBQ0tFVF9JTkZPLCAqUFBBQ0tFVF9JTkZPOworCisvLworLy8gVGtpcCBLZXkgc3RydWN0dXJlIHdoaWNoIFJDNCBrZXkgJiBNSUMgY2FsY3VsYXRpb24KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1RLSVBfS0VZX0lORk8gIHsKKwlVSU5UICAgICAgICBuQnl0ZXNJbk07ICAvLyAjIGJ5dGVzIGluIE0gZm9yIE1JQ0tFWQorCVVMT05HICAgICAgIElWMTY7CisJVUxPTkcgICAgICAgSVYzMjsKKwlVTE9ORyAgICAgICBLMDsgICAgICAgICAvLyBmb3IgTUlDS0VZIExvdworCVVMT05HICAgICAgIEsxOyAgICAgICAgIC8vIGZvciBNSUNLRVkgSGlnCisJVUxPTkcgICAgICAgTDsgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZCisJVUxPTkcgICAgICAgUjsgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZCisJVUxPTkcgICAgICAgTTsgICAgICAgICAgLy8gTWVzc2FnZSBhY2N1bXVsYXRvciBmb3IgTUlDS0VZCisJVUNIQVIgICAgICAgUkM0S0VZWzE2XTsKKwlVQ0hBUiAgICAgICBNSUNbOF07Cit9IFRLSVBfS0VZX0lORk8sICpQVEtJUF9LRVlfSU5GTzsKKworLy8KKy8vIFByaXZhdGUgLyBNaXNjIGRhdGEsIGNvdW50ZXJzIGZvciBkcml2ZXIgaW50ZXJuYWwgdXNlCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9fUFJJVkFURV9TVFJVQyB7CisJVUlOVCAgICAgICBTeXN0ZW1SZXNldENudDsgICAgICAgICAvLyBTeXN0ZW0gcmVzZXQgY291bnRlcgorCVVJTlQgICAgICAgVHhSaW5nRnVsbENudDsgICAgICAgICAgLy8gVHggcmluZyBmdWxsIG9jY3VycmFuY2UgbnVtYmVyCisJVUlOVCAgICAgICBQaHlSeEVyckNudDsgICAgICAgICAgICAvLyBQSFkgUnggZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyCisJLy8gVmFyaWFibGVzIGZvciBXRVAgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb24gaW4gcnRtcF93ZXAuYworCVVJTlQgICAgICAgRkNTQ1JDMzI7CisJQVJDRk9VUkNPTlRFWFQgIFdFUENPTlRFWFQ7CisJLy8gVGtpcCBzdHVmZgorCVRLSVBfS0VZX0lORk8gICBUeDsKKwlUS0lQX0tFWV9JTkZPICAgUng7Cit9IFBSSVZBVEVfU1RSVUMsICpQUFJJVkFURV9TVFJVQzsKKworLy8gc3RydWN0dXJlIHRvIHR1bmUgQkJQIFI2NiAoQkJQIFRVTklORykKK3R5cGVkZWYgc3RydWN0IF9CQlBfUjY2X1RVTklORyB7CisJQk9PTEVBTiAgICAgYkVuYWJsZTsKKwlVU0hPUlQgICAgICBGYWxzZUNjYUxvd2VyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCAxMDAKKwlVU0hPUlQgICAgICBGYWxzZUNjYVVwcGVyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCA1MTIKKwlVQ0hBUiAgICAgICBSNjZEZWx0YTsKKwlVQ0hBUiAgICAgICBSNjZDdXJyZW50VmFsdWU7CisJQk9PTEVBTgkJUjY2TG93ZXJVcHBlclNlbGVjdDsgLy9CZWZvcmUgTGlua1VwLCBVc2VkIExvd2VyQm91bmQgb3IgVXBwZXJCb3VuZCBhcyBSNjYgdmFsdWUuCit9IEJCUF9SNjZfVFVOSU5HLCAqUEJCUF9SNjZfVFVOSU5HOworCisvLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgY2hhbm5lbCBUWCBwb3dlcgordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfVFhfUE9XRVIgeworCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCisJVUNIQVIgICAgICBDaGFubmVsOworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlCT09MRUFOICAgICAgIGJFZmZlY3RlZENoYW5uZWw7CS8vIEZvciBCVyA0MCBvcGVyYXRpbmcgaW4gMi40R0h6ICwgdGhlICJlZmZlY3RlZCBjaGFubmVsIiBpcyB0aGUgY2hhbm5lbCB0aGF0IGlzIGNvdmVyZWQgaW4gNDBNaHouCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCUNIQVIgICAgICAgUG93ZXI7CisJQ0hBUiAgICAgICBQb3dlcjI7CisJVUNIQVIgICAgICBNYXhUeFB3cjsKKwlVQ0hBUiAgICAgIERmc1JlcTsKK30gQ0hBTk5FTF9UWF9QT1dFUiwgKlBDSEFOTkVMX1RYX1BPV0VSOworCisvLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgODAyLjExaiBjaGFubmVsIFRYIHBvd2VyCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF8xMUpfVFhfUE9XRVIgeworCVVDSEFSICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgIEJXOwkvLyBCV18xMCBvciBCV18yMAorCUNIQVIgICAgICAgUG93ZXI7CisJQ0hBUiAgICAgICBQb3dlcjI7CisJVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKK30gQ0hBTk5FTF8xMUpfVFhfUE9XRVIsICpQQ0hBTk5FTF8xMUpfVFhfUE9XRVI7CisKK3R5cGVkZWYgZW51bSBfQUJHQkFORF9TVEFURV8geworCVVOS05PV05fQkFORCwKKwlCR19CQU5ELAorCUFfQkFORCwKK30gQUJHQkFORF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RSVUNUIHsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkvLyBTVEEgc3RhdGUgbWFjaGluZXMKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBDbnRsTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBc3NvY01hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQXV0aE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQXV0aFJzcE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgU3luY01hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgV3BhUHNrTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBMZWFwTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBaXJvbmV0TWFjaGluZTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBc3NvY0Z1bmNbQVNTT0NfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoRnVuY1tBVVRIX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXV0aFJzcEZ1bmNbQVVUSF9SU1BfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBTeW5jRnVuY1tTWU5DX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgV3BhUHNrRnVuY1tXUEFfUFNLX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQWlyb25ldEZ1bmNbQUlST05FVF9GVU5DX1NJWkVdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFjdEZ1bmNbQUNUX0ZVTkNfU0laRV07CisJLy8gQWN0aW9uCisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQWN0TWFjaGluZTsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJU1RBVEVfTUFDSElORQkJCURsc01hY2hpbmU7CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgRGxzRnVuY1tETFNfRlVOQ19TSVpFXTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCisKKworCVVMT05HICAgICAgICAgICAgICAgICAgIENoYW5uZWxRdWFsaXR5OyAgLy8gMC4uMTAwLCBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbiBmb3IgUm9hbWluZworCVVMT05HICAgICAgICAgICAgICAgICAgIE5vdzMyOyAgICAgICAgICAgLy8gbGF0Y2ggdGhlIHZhbHVlIG9mIE5kaXNHZXRTeXN0ZW1VcFRpbWUoKQorCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RTZW5kTlVMTHBzbVRpbWU7CisKKwlCT09MRUFOICAgICAgICAgICAgICAgICBiUnVubmluZzsKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBUYXNrTG9jazsKKwlNTE1FX1FVRVVFICAgICAgICAgICAgICBRdWV1ZTsKKworCVVJTlQgICAgICAgICAgICAgICAgICAgIFNoaWZ0UmVnOworCisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUGVyaW9kaWNUaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBBUFNEUGVyaW9kaWNUaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rRG93blRpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIExpbmtVcFRpbWVyOworI2lmZGVmIFJUMjg2MAorICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGJQc1BvbGxUaW1lclJ1bm5pbmc7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUHNQb2xsVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUmFkaW9Pbk9mZlRpbWVyOworI2VuZGlmIC8vIFJUMjg2MCAvLworCVVMT05HICAgICAgICAgICAgICAgICAgIFBlcmlvZGljUm91bmQ7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgT25lU2VjUGVyaW9kaWNSb3VuZDsKKworCVVDSEFSCQkJCQlSZWFsUnhQYXRoOworCUJPT0xFQU4JCQkJCWJMb3dUaHJvdWdocHV0OworCUJPT0xFQU4JCQkJCWJFbmFibGVBdXRvQW50ZW5uYUNoZWNrOworCVJBTElOS19USU1FUl9TVFJVQ1QJCVJ4QW50RXZhbFRpbWVyOworCisKK30gTUxNRV9TVFJVQ1QsICpQTUxNRV9TVFJVQ1Q7CisKKy8vIHN0cnVjdHVyZSBmb3IgcmFkYXIgZGV0ZWN0aW9uIGFuZCBjaGFubmVsIHN3aXRjaAordHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RFVEVDVF9TVFJVQ1QgeworCVVDSEFSCQlDU0NvdW50OwkJCS8vQ2hhbm5lbCBzd2l0Y2ggY291bnRlcgorCVVDSEFSCQlDU1BlcmlvZDsJCQkvL0NoYW5uZWwgc3dpdGNoIHBlcmlvZCAoYmVhY29uIGNvdW50KQorCVVDSEFSCQlSRENvdW50OwkJCS8vUmFkYXIgZGV0ZWN0aW9uIGNvdW50ZXIKKwlVQ0hBUgkJUkRNb2RlOwkJCQkvL1JhZGFyIERldGVjdGlvbiBtb2RlCisJVUNIQVIJCVJERHVyUmVnaW9uOwkJLy9SYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uCisJVUNIQVIJCUJCUFIxNjsKKwlVQ0hBUgkJQkJQUjE3OworCVVDSEFSCQlCQlBSMTg7CisJVUNIQVIJCUJCUFIyMTsKKwlVQ0hBUgkJQkJQUjIyOworCVVDSEFSCQlCQlBSNjQ7CisJVUxPTkcJCUluU2VydmljZU1vbml0b3JDb3VudDsgLy8gdW5pdDogc2VjCisJVUlOVDgJCURmc1Nlc3Npb25UaW1lOworCUJPT0xFQU4JCWJGYXN0RGZzOworCVVJTlQ4CQlDaE1vdmluZ1RpbWU7CisJVUlOVDgJCUxvbmdQdWxzZVJhZGFyVGg7Cit9IFJBREFSX0RFVEVDVF9TVFJVQ1QsICpQUkFEQVJfREVURUNUX1NUUlVDVDsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK3R5cGVkZWYgZW51bSBDRF9TVEFURV9uCit7CisJQ0RfTk9STUFMLAorCUNEX1NJTEVOQ0UsCisJQ0RfTUFYX1NUQVRFCit9IENEX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBDQVJSSUVSX0RFVEVDVElPTl9zCit7CisJQk9PTEVBTgkJCQkJRW5hYmxlOworCVVJTlQ4CQkJCQlDRFNlc3Npb25UaW1lOworCVVJTlQ4CQkJCQlDRFBlcmlvZDsKKwlDRF9TVEFURQkJCQlDRF9TdGF0ZTsKK30gQ0FSUklFUl9ERVRFQ1RJT04sICpQQ0FSUklFUl9ERVRFQ1RJT047CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCit0eXBlZGVmIGVudW0gX1JFQ19CTE9DS0FDS19TVEFUVVMKK3sKKyAgICBSZWNpcGllbnRfTk9ORT0wLAorCVJlY2lwaWVudF9VU0VELAorCVJlY2lwaWVudF9IYW5kbGVSZXMsCisgICAgUmVjaXBpZW50X0FjY2VwdAorfSBSRUNfQkxPQ0tBQ0tfU1RBVFVTLCAqUFJFQ19CTE9DS0FDS19TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfT1JJX0JMT0NLQUNLX1NUQVRVUworeworICAgIE9yaWdpbmF0b3JfTk9ORT0wLAorCU9yaWdpbmF0b3JfVVNFRCwKKyAgICBPcmlnaW5hdG9yX1dhaXRSZXMsCisgICAgT3JpZ2luYXRvcl9Eb25lCit9IE9SSV9CTE9DS0FDS19TVEFUVVMsICpQT1JJX0JMT0NLQUNLX1NUQVRVUzsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX0JBX09SSV9FTlRSWXsKKwlVQ0hBUiAgIFdjaWQ7CisJVUNIQVIgICBUSUQ7CisJVUNIQVIgICBCQVdpblNpemU7CisJVUNIQVIgICBUb2tlbjsKKy8vIFNlcXVlbmNlIGlzIHRvIGZpbGwgZXZlcnkgb3V0Z29pbmcgUW9TIERBVEEgZnJhbWUncyBzZXF1ZW5jZSBmaWVsZCBpbiA4MDIuMTEgaGVhZGVyLgorCVVTSE9SVAlTZXF1ZW5jZTsKKwlVU0hPUlQJVGltZU91dFZhbHVlOworCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXM7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCBPUklCQVRpbWVyOworCVBWT0lECXBBZGFwdGVyOworfSBCQV9PUklfRU5UUlksICpQQkFfT1JJX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfQkFfUkVDX0VOVFJZIHsKKwlVQ0hBUiAgIFdjaWQ7CisJVUNIQVIgICBUSUQ7CisJVUNIQVIgICBCQVdpblNpemU7CS8vIDcuMy4xLjE0LiBlYWNoIGJ1ZmZlciBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgYSBtYXggQU1TRFUgb3IgTVNEVS4KKwlVU0hPUlQJCUxhc3RJbmRTZXE7CisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCBSRUNCQVRpbWVyOworCVVMT05HCQlMYXN0SW5kU2VxQXRUaW1lcjsKKwlVTE9ORwkJbkRyb3BQYWNrZXQ7CisJVUxPTkcJCXJjdlNlcTsKKwlSRUNfQkxPQ0tBQ0tfU1RBVFVTICBSRUNfQkFfU3RhdHVzOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmVSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKKwlQVk9JRAlwQWRhcHRlcjsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0CWxpc3Q7Cit9IEJBX1JFQ19FTlRSWSwgKlBCQV9SRUNfRU5UUlk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVMT05HCQludW1Bc1JlY2lwaWVudDsJCS8vIEkgYW0gcmVjaXBpZW50IG9mIG51bUFzUmVjaXBpZW50IGNsaWVudHMuIFRoZXNlIGNsaWVudCBhcmUgaW4gdGhlIEJBUmVjRW50cnlbXQorCVVMT05HCQludW1Bc09yaWdpbmF0b3I7CS8vIEkgYW0gb3JpZ2luYXRvciBvZiAJbnVtQXNPcmlnaW5hdG9yIGNsaWVudHMuIFRoZXNlIGNsaWVudHMgYXJlIGluIHRoZSBCQU9yaUVudHJ5W10KKwlCQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVtNQVhfTEVOX09GX0JBX09SSV9UQUJMRV07CisJQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOworfSBCQV9UQUJMRSwgKlBCQV9UQUJMRTsKKworLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9SRUNfRU5UUll7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJpdG1hcDsgICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZQorCVVDSEFSICAgcnN2OworCVVDSEFSICAgQnVmU2l6ZVs4XTsKKwlSRUNfQkxPQ0tBQ0tfU1RBVFVTCVJFQ19CQV9TdGF0dXNbOF07Cit9IE9JRF9CQV9SRUNfRU5UUlksICpQT0lEX0JBX1JFQ19FTlRSWTsKKworLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9PUklfRU5UUll7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJpdG1hcDsgIC8vIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplLCByZWFkIE9SSV9CQV9TdGF0dXNbVElEXSBmb3Igc3RhdHVzCisJVUNIQVIgICByc3Y7CisJVUNIQVIgICBCdWZTaXplWzhdOworCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXNbOF07Cit9IE9JRF9CQV9PUklfRU5UUlksICpQT0lEX0JBX09SSV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1FVRVJZQkFfVEFCTEV7CisJT0lEX0JBX09SSV9FTlRSWSAgICAgICBCQU9yaUVudHJ5WzMyXTsKKwlPSURfQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbMzJdOworCVVDSEFSICAgT3JpTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQU9yaUVudHJ5CisJVUNIQVIgICBSZWNOdW07Ly8gTnVtYmVyIG9mIGJlbG93IEJBUmVjRW50cnkKK30gUVVFUllCQV9UQUJMRSwgKlBRVUVSWUJBX1RBQkxFOworCit0eXBlZGVmCXVuaW9uCV9CQUNBUF9TVFJVQwl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgOjQ7CisJCVVJTlQzMiAgICAgYjIwNDBDb2V4aXN0U2NhblN1cDoxOwkJLy9BcyBTdGEsIHN1cHBvcnQgZG8gMjA0MCBjb2V4aXN0ZW5jZSBzY2FuIGZvciBBUC4gQXMgQXAsIHN1cHBvcnQgbW9uaXRvciB0cmlnZ2VyIGV2ZW50IHRvIGNoZWNrIGlmIGNhbiB1c2UgQlcgNDBNSHouCisJCVVJTlQzMiAgICAgYkh0QWRob2M6MTsJCQkvLyBhZGhvYyBjYW4gdXNlIGh0IHJhdGUuCisJCVVJTlQzMiAgICAgTU1QU21vZGU6MjsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCisJCVVJTlQzMiAgICAgQW1zZHVTaXplOjE7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07CisJCVVJTlQzMiAgICAgQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgorCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKKwkJVUlOVDMyCQlBdXRvQkE6MTsJLy8gYXV0b21hdGljYWxseSBCQQorCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OworCX0JZmllbGQ7CisjZWxzZQorCXN0cnVjdAl7CisJCVVJTlQzMgkJUnhCQVdpbkxpbWl0Ojg7CisJCVVJTlQzMgkJVHhCQVdpbkxpbWl0Ojg7CisJCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKKwkJVUlOVDMyCQlQb2xpY3k6MjsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZQorCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJCVVJTlQzMiAgICAgICAJQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgorCQlVSU5UMzIgICAgICAgCUFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OworCQlVSU5UMzIgICAgICAgCU1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQorCQlVSU5UMzIgICAgICAgCWJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgorCQlVSU5UMzIgICAgICAgCWIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgorCQlVSU5UMzIgICAgICAgCTo0OworCX0JZmllbGQ7CisjZW5kaWYKKwlVSU5UMzIJCQl3b3JkOworfSBCQUNBUF9TVFJVQywgKlBCQUNBUF9TVFJVQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy9UaGlzIHN0cnVjdHVyZSBpcyBmb3IgYWxsIDgwMi4xMW4gY2FyZCBJbnRlck9wdGliaWxpdHlUZXN0IGFjdGlvbi4gUmVzZXQgYWxsIE51bSBldmVyeSBuIHNlY29uZC4gIChEZXRhaWxzIHNlZSBNTE1FUGVyaW9kaWMpCit0eXBlZGVmCXN0cnVjdAlfSU9UX1NUUlVDCXsKKwlVQ0hBUgkJCVRocmVzaG9sZFsyXTsKKwlVQ0hBUgkJCVJlb3JkZXJUaW1lT3V0TnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFswXQorCVVDSEFSCQkJUmVmcmVzaE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMV0KKwlVTE9ORwkJCU9uZVNlY0luV2luZG93Q291bnQ7CisJVUxPTkcJCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OworCVVMT05HCQkJT25lU2VjT3V0V2luZG93Q291bnQ7CisJVUNIQVIJCQlEZWxPcmlBY3Q7CisJVUNIQVIJCQlEZWxSZWNBY3Q7CisJVUNIQVIJCQlSVFNTaG9ydFByb3Q7CisJVUNIQVIJCQlSVFNMb25nUHJvdDsKKwlCT09MRUFOCQkJYlJUU0xvbmdQcm90T247CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCWJMYXN0QXRoZXJvczsKKyAgICBCT09MRUFOCQkJYkN1cnJlbnRBdGhlcm9zOworICAgIEJPT0xFQU4gICAgICAgICBiTm93QXRoZXJvc0J1cnN0T247CisJQk9PTEVBTgkJCWJOZXh0RGlzYWJsZVJ4QkE7CisgICAgQk9PTEVBTgkJCWJUb2dnbGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9IElPVF9TVFJVQywgKlBJT1RfU1RSVUM7CisKKy8vIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IHNldHRpbmcgZm9yIDgwMi4xMW4gdHJhbnNtaXQgc2V0dGluZy4gIFVzZWQgaW4gYWR2YW5jZWQgcGFnZS4KK3R5cGVkZWYgdW5pb24gX1JFR19UUkFOU01JVF9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgc3RydWN0IHsKKyAgICAgICAgIFVJTlQzMiAgcnN2OjEzOworCQkgVUlOVDMyICBFWFRDSEE6MjsKKwkJIFVJTlQzMiAgSFRNT0RFOjE7CisJCSBVSU5UMzIgIFRSQU5TTk86MjsKKwkJIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCisJCSBVSU5UMzIgIFNob3J0R0k6MTsKKwkJIFVJTlQzMiAgQlc6MTsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwkJIFVJTlQzMiAgVHhCRjoxOyAvLyAzKjMKKwkJIFVJTlQzMiAgcnN2MDoxMDsKKyAgICB9IGZpZWxkOworI2Vsc2UKKyBzdHJ1Y3QgeworCQkgVUlOVDMyICByc3YwOjEwOworCQkgVUlOVDMyICBUeEJGOjE7CisgICAgICAgICBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisgICAgICAgICBVSU5UMzIgIFNob3J0R0k6MTsKKyAgICAgICAgIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCisgICAgICAgICBVSU5UMzIgIFRSQU5TTk86MjsKKyAgICAgICAgIFVJTlQzMiAgSFRNT0RFOjE7CisgICAgICAgICBVSU5UMzIgIEVYVENIQToyOworICAgICAgICAgVUlOVDMyICByc3Y6MTM7CisgICAgfSBmaWVsZDsKKyNlbmRpZgorIFVJTlQzMiAgIHdvcmQ7Cit9IFJFR19UUkFOU01JVF9TRVRUSU5HLCAqUFJFR19UUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHVuaW9uICBfREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0CXsKKwkJCVVTSE9SVAkJcnN2OjM7CisJCQlVU0hPUlQJCUZpeGVkVHhNb2RlOjI7CQkJLy8gSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLgorCQkJVVNIT1JUCQlQaHlNb2RlOjQ7CisJCQlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCQkJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgCS8vIE1DUworCQkJVVNIT1JUCQlQaHlNb2RlOjQ7CisJCQlVU0hPUlQJIAlGaXhlZFR4TW9kZToyOwkJCS8vIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4KKwkJCVVTSE9SVAkJcnN2OjM7CisJfQlmaWVsZDsKKyNlbmRpZgorCVVTSE9SVAkJd29yZDsKKyB9IERFU0lSRURfVFJBTlNNSVRfU0VUVElORywgKlBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOCQlJc1JlY2lwaWVudDsKKwlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIG5NU0RVOworCVVTSE9SVCAgIFRpbWVPdXQ7CisJQk9PTEVBTiBiQWxsVGlkOyAgLy8gSWYgVHJ1ZSwgZGVsZXRlIGFsbCBUSUQgZm9yIEJBIHNlc3Npb25zIHdpdGggdGhpcyBNQUNhZGRyLgorfSBPSURfQUREX0JBX0VOVFJZLCAqUE9JRF9BRERfQkFfRU5UUlk7CisKKy8vCisvLyBNdWx0aXBsZSBTU0lEIHN0cnVjdHVyZQorLy8KKyNkZWZpbmUgV0xBTl9NQVhfTlVNX09GX1RJTQkJCSgoTUFYX0xFTl9PRl9NQUNfVEFCTEUgPj4gMykgKyAxKSAvKiAvOCArIDEgKi8KKyNkZWZpbmUgV0xBTl9DVF9USU1fQkNNQ19PRkZTRVQJCTAgLyogdW5pdDogMzJCICovCisKKy8qIGNsZWFyIGJjbWMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX0NMRUFSKGFwaWR4KSBcCisJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdICY9IH5CSVQ4WzBdOworCisvKiBzZXQgYmNtYyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfU0VUKGFwaWR4KSBcCisJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdIHw9IEJJVDhbMF07CisKKy8qIGNsZWFyIGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9DTEVBUihhZF9wLCBhcGlkeCwgd2NpZCkgXAorCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAorCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAorCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gJj0gKH5CSVQ4W2JpdF9vZmZzZXRdKTsgfQorCisvKiBzZXQgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQklUX1NFVChhZF9wLCBhcGlkeCwgd2NpZCkgXAorCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAorCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAorCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gfD0gQklUOFtiaXRfb2Zmc2V0XTsgfQorCisKK3R5cGVkZWYgc3RydWN0IF9NVUxUSVNTSURfU1RSVUNUIHsKKwlVQ0hBUgkJCQkJCQkJQnNzaWRbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2lkTGVuOworICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKworICAgIFBORVRfREVWICAgICAgICAgICAgICAgICAgIAkJCU1TU0lERGV2OworCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJR3JvdXBLZXlXZXBTdGF0dXM7CisJV1BBX01JWF9QQUlSX0NJUEhFUgkJCQkJV3BhTWl4UGFpckNpcGhlcjsKKworCVVMT05HCQkJCQkJCQlUeENvdW50OworCVVMT05HCQkJCQkJCQlSeENvdW50OworCVVMT05HCQkJCQkJCQlSZWNlaXZlZEJ5dGVDb3VudDsKKwlVTE9ORwkJCQkJCQkJVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisJVUxPTkcJCQkJCQkJCVJ4RXJyb3JDb3VudDsKKwlVTE9ORwkJCQkJCQkJUnhEcm9wQ291bnQ7CisKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisJUlRfSFRfUEhZX0lORk8JCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4gdGhpcyBpcyBmb3IgcmVhZGluZyByZWdpc3RyeSBzZXR0aW5nIG9ubHkuIG5vdCB1c2VmdWwuCisJQk9PTEVBTgkJCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5SWQ7CisKKwlVQ0hBUgkJCQkJCQkJVHhSYXRlOyAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEsIC4uLgorCVVDSEFSICAgICAJCQkJCQkJRGVzaXJlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsvLyBPSURfODAyXzExX0RFU0lSRURfUkFURVMKKwlVQ0hBUgkJCQkJCQkJRGVzaXJlZFJhdGVzSW5kZXg7CisJVUNIQVIgICAgIAkJCQkJCQlNYXhUeFJhdGU7ICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCisKKwlVQ0hBUgkJCQkJCQkJVGltQml0bWFwc1tXTEFOX01BWF9OVU1fT0ZfVElNXTsKKworICAgIC8vIFdQQQorICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNS1szMl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1LWzMyXTsKKwlVQ0hBUgkJCQkJCQkJR1RLWzMyXTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMVg7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlQXV0aDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTm9uY2VbMzJdOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRTZWN1cmVkOworICAgIE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICAgICAgICAgIFByaXZhY3lGaWx0ZXI7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFOQ2xhc3MzRGF0YTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOworCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOSUVfTGVuWzJdOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTl9JRVsyXVtNQVhfTEVOX09GX1JTTklFXTsKKworCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgCQkJVGltSUVMb2NhdGlvbkluQmVhY29uOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIAkJCUNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbjsKKyAgICAvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYV0kKKwkvLyBQVFhXSV9TVFJVQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvblR4V0k7IC8vCisgICAgQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uQnVmW01BWF9CRUFDT05fU0laRV07IC8vIE5PVEU6IEJlYWNvbkJ1ZiBzaG91bGQgYmUgNC1ieXRlIGFsaWduZWQKKworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIaWRlU3NpZDsKKwlVSU5UMTYJCQkJCQkJCVN0YXRpb25LZWVwQWxpdmVUaW1lOyAvLyB1bml0OiBzZWNvbmQKKworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZMQU5fVklEOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZMQU5fUHJpb3JpdHk7CisKKyAgICBSVF84MDJfMTFfQUNMCQkJCQkJQWNjZXNzQ29udHJvbExpc3Q7CisKKwkvLyBFRENBIFFvcworICAgIEJPT0xFQU4JCQkJCQkJCWJXbW1DYXBhYmxlOwkvLyAwOmRpc2FibGUgV01NLCAxOmVuYWJsZSBXTU0KKyAgICBCT09MRUFOCQkJCQkJCQliRExTQ2FwYWJsZTsJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCisKKwlVQ0hBUiAgICAgICAgICAgCQkJCQlEbHNQVEtbNjRdOwkJLy8gRHVlIHRvIHdpbmRvd3MgZGlydmVyIGNvdW50IG9uIG1lZXRpbmdob3VzZSB0byBoYW5kbGUgNC13YXkgc2hha2UKKworCS8vIEZvciA4MDIuMXggZGFlbW9uIHNldHRpbmcgcGVyIEJTUworCVVDSEFSCQkJCQkJCQlyYWRpdXNfc3J2X251bTsKKwlSQURJVVNfU1JWX0lORk8JCQkJCQlyYWRpdXNfc3J2X2luZm9bTUFYX1JBRElVU19TUlZfTlVNXTsKKworI2lmZGVmIFJUTDg2NVhfU09DCisJdW5zaWduZWQgaW50CQkJCQkJbXlsaW5raWQ7CisjZW5kaWYKKworCisJVUlOVDMyCQkJCQlSY3ZkQ29uZmxpY3RTc2lkQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEFzc29jUmVzcENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRSZWFzc29jUmVzcENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRQcm9iZVJlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQmVhY29uQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZERpc2Fzc29jQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEF1dGhDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkRGVhdXRoQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFVua25vd25NZ210Q291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkUmVwbGF5QXR0YWNrQ291bnQ7CisKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkQ29uZmxpY3RTc2lkOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQXNzb2NSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkUmVhc3NvY1Jlc3A7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRQcm9iZVJlc3A7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRCZWFjb247CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWREaXNhc3NvYzsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEF1dGg7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWREZWF1dGg7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRVbmtub3duTWdtdDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkUmVwbGF5QXR0YWNrOworCisJQk9PTEVBTgkJCQkJYkJjblNudFJlcTsKKwlVQ0hBUgkJCQkJQmNuQnVmSWR4OworfSBNVUxUSVNTSURfU1RSVUNULCAqUE1VTFRJU1NJRF9TVFJVQ1Q7CisKKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMwordHlwZWRlZiBlbnVtIF9CU1MyMDQwQ09FWElTVF9GTEFHeworCUJTU18yMDQwX0NPRVhJU1RfRElTQUJMRSA9IDAsCisJQlNTXzIwNDBfQ09FWElTVF9USU1FUl9GSVJFRCAgPSAxLAorCUJTU18yMDQwX0NPRVhJU1RfSU5GT19TWU5DID0gMiwKKwlCU1NfMjA0MF9DT0VYSVNUX0lORk9fTk9USUZZID0gNCwKK31CU1MyMDQwQ09FWElTVF9GTEFHOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworLy8gY29uZmlndXJhdGlvbiBjb21tb24gdG8gT1BNT0RFX0FQIGFzIHdlbGwgYXMgT1BNT0RFX1NUQQordHlwZWRlZiBzdHJ1Y3QgX0NPTU1PTl9DT05GSUcgeworCisJQk9PTEVBTgkJYkNvdW50cnlGbGFnOworCVVDSEFSCQlDb3VudHJ5Q29kZVszXTsKKwlVQ0hBUgkJR2VvZ3JhcGh5OworCVVDSEFSICAgICAgIENvdW50cnlSZWdpb247ICAgICAgLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiwgMDpGQ0MsIDE6SUMsIDI6RVRTSSwgMzpTUEFJTiwgNDpGcmFuY2UsIDU6TUtLLCA2Ok1LSzEsIDc6SXNyYWVsCisJVUNIQVIgICAgICAgQ291bnRyeVJlZ2lvbkZvckFCYW5kOwkvLyBFbnVtIG9mIGNvdW50cnkgcmVnaW9uIGZvciBBIGJhbmQKKwlVQ0hBUiAgICAgICBQaHlNb2RlOyAgICAgICAgICAgIC8vIFBIWV8xMUEsIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfQUJHX01JWEVECisJVVNIT1JUICAgICAgRHNpZnM7ICAgICAgICAgICAgICAvLyBpbiB1bml0cyBvZiB1c2VjCisJVUxPTkcgICAgICAgUGFja2V0RmlsdGVyOyAgICAgICAvLyBQYWNrZXQgZmlsdGVyIGZvciByZWNlaXZpbmcKKworCUNIQVIgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy8gTk9UIE5VTEwtdGVybWluYXRlZAorCVVDSEFSICAgICAgIFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCisJVUNIQVIgICAgICAgTGFzdFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCisJQ0hBUiAgICAgICAgTGFzdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy8gTk9UIE5VTEwtdGVybWluYXRlZAorCVVDSEFSCQlMYXN0QnNzaWRbTUFDX0FERFJfTEVOXTsKKworCVVDSEFSICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgQmVhY29uUGVyaW9kOworCVVDSEFSICAgICAgIENoYW5uZWw7CisJVUNIQVIgICAgICAgQ2VudHJhbENoYW5uZWw7ICAgIAkvLyBDZW50cmFsIENoYW5uZWwgd2hlbiB1c2luZyA0ME1IeiBpcyBpbmRpY2F0aW5nLiBub3QgcmVhbCBjaGFubmVsLgorCisJVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgIERlc2lyZVJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOyAgICAgIC8vIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUworCVVDSEFSICAgICAgIE1heERlc2lyZWRSYXRlOworCVVDSEFSICAgICAgIEV4cGVjdGVkQUNLUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisKKwlVTE9ORyAgICAgICBCYXNpY1JhdGVCaXRtYXA7ICAgICAgICAvLyBiYWNrdXAgYmFzaWMgcmF0ZWJpdG1hcAorCisJQk9PTEVBTgkJYkFQU0RDYXBhYmxlOworCUJPT0xFQU4JCWJJblNlcnZpY2VQZXJpb2Q7CisJQk9PTEVBTgkJYkFQU0RBQ19CRTsKKwlCT09MRUFOCQliQVBTREFDX0JLOworCUJPT0xFQU4JCWJBUFNEQUNfVkk7CisJQk9PTEVBTgkJYkFQU0RBQ19WTzsKKwlCT09MRUFOCQliTmVlZFNlbmRUcmlnZ2VyRnJhbWU7CisJQk9PTEVBTgkJYkFQU0RGb3JjZVBvd2VyU2F2ZTsJLy8gRm9yY2UgcG93ZXIgc2F2ZSBtb2RlLCBzaG91bGQgb25seSB1c2UgaW4gQVBTRC1TVEFVVAorCVVMT05HCQlUcmlnZ2VyVGltZXJDb3VudDsKKwlVQ0hBUgkJTWF4U1BMZW5ndGg7CisJVUNIQVIJCUJCUEN1cnJlbnRCVzsJLy8gQldfMTAsIAlCV18yMCwgQldfNDAKKwlSRUdfVFJBTlNNSVRfU0VUVElORyAgICAgICAgUmVnVHJhbnNtaXRTZXR0aW5nOyAvL3JlZ2lzdHJ5IHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgorCVVDSEFSICAgICAgIFR4UmF0ZTsgICAgICAgICAgICAgICAgIC8vIFNhbWUgdmFsdWUgdG8gZmlsbCBpbiBUWEQuIFR4UmF0ZSBpcyA2LWJpdAorCVVDSEFSICAgICAgIE1heFR4UmF0ZTsgICAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCVVDSEFSICAgICAgIFR4UmF0ZUluZGV4OyAgICAgICAgICAgIC8vIFR4IHJhdGUgaW5kZXggaW4gUmF0ZVN3aXRjaFRhYmxlCisJVUNIQVIgICAgICAgVHhSYXRlVGFibGVTaXplOyAgICAgICAgLy8gVmFsaWQgVHggcmF0ZSB0YWJsZSBzaXplIGluIFJhdGVTd2l0Y2hUYWJsZQorCVVDSEFSICAgICAgIE1pblR4UmF0ZTsgICAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCVVDSEFSICAgICAgIFJ0c1JhdGU7ICAgICAgICAgICAgICAgIC8vIFJBVEVfeHh4CisJSFRUUkFOU01JVF9TRVRUSU5HCU1sbWVUcmFuc21pdDsgICAvLyBNR01UIGZyYW1lIFBIWSByYXRlIHNldHRpbmcgd2hlbiBvcGVyYXRpbiBhdCBIdCByYXRlLgorCVVDSEFSICAgICAgIE1sbWVSYXRlOyAgICAgICAgICAgICAgIC8vIFJBVEVfeHh4LCB1c2VkIHRvIHNlbmQgTUxNRSBmcmFtZXMKKwlVQ0hBUiAgICAgICBCYXNpY01sbWVSYXRlOyAgICAgICAgICAvLyBEZWZhdWx0IFJhdGUgZm9yIHNlbmRpbmcgTUxNRSBmcmFtZXMKKworCVVTSE9SVCAgICAgIFJ0c1RocmVzaG9sZDsgICAgICAgICAgIC8vIGluIHVuaXQgb2YgQllURQorCVVTSE9SVCAgICAgIEZyYWdtZW50VGhyZXNob2xkOyAgICAgIC8vIGluIHVuaXQgb2YgQllURQorCisJVUNIQVIgICAgICAgVHhQb3dlcjsgICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiBtVworCVVMT05HICAgICAgIFR4UG93ZXJQZXJjZW50YWdlOyAgICAgIC8vIDB+MTAwICUKKwlVTE9ORyAgICAgICBUeFBvd2VyRGVmYXVsdDsgICAgICAgICAvLyBrZWVwIGZvciBUeFBvd2VyUGVyY2VudGFnZQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQkFDQVBfU1RSVUMgICAgICAgIEJBQ2FwYWJpbGl0eTsgLy8gICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MAorCUJBQ0FQX1NUUlVDICAgICAgICBSRUdCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlJT1RfU1RSVUMJCUlPVGVzdFBhcm07CS8vIDgwMi4xMW4gSW50ZXJPcGJpbGl0eSBUZXN0IFBhcmFtZXRlcjsKKwlVTE9ORyAgICAgICBUeFByZWFtYmxlOyAgICAgICAgICAgICAvLyBSdDgwMl8xMVByZWFtYmxlTG9uZywgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LCBSdDgwMl8xMVByZWFtYmxlQXV0bworCUJPT0xFQU4gICAgIGJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQ7ICAgICAvLyBNaWNyb3NvZnQgdXNlIDAgYXMgZGlzYWJsZQorCVVMT05HICAgICAgIFVzZUJHUHJvdGVjdGlvbjsgICAgICAgIC8vIDA6IGF1dG8sIDE6IGFsd2F5cyB1c2UsIDI6IGFsd2F5cyBub3QgdXNlCisJQk9PTEVBTiAgICAgYlVzZVNob3J0U2xvdFRpbWU7ICAgICAgLy8gMDogZGlzYWJsZSwgMSAtIHVzZSBzaG9ydCBzbG90ICg5dXMpCisJQk9PTEVBTiAgICAgYkVuYWJsZVR4QnVyc3Q7ICAgICAgICAgLy8gMTogZW5ibGUgVFggUEFDS0VUIEJVUlNULCAwOiBkaXNhYmxlIFRYIFBBQ0tFVCBCVVJTVAorCUJPT0xFQU4gICAgIGJBZ2dyZWdhdGlvbkNhcGFibGU7ICAgICAgLy8gMTogZW5hYmxlIFRYIGFnZ3JlZ2F0aW9uIHdoZW4gdGhlIHBlZXIgc3VwcG9ydHMgaXQKKwlCT09MRUFOICAgICBiUGlnZ3lCYWNrQ2FwYWJsZTsJCS8vIDE6IGVuYWJsZSBUWCBwaWdneS1iYWNrIGFjY29yZGluZyBNQUMncyB2ZXJzaW9uCisJQk9PTEVBTiAgICAgYklFRUU4MDIxMUg7CQkJLy8gMTogZW5hYmxlIElFRUU4MDIuMTFoIHNwZWMuCisJVUxPTkcJCURpc2FibGVPTEJDRGV0ZWN0OwkJLy8gMDogZW5hYmxlIE9MQkMgZGV0ZWN0OyAxIGRpc2FibGUgT0xCQyBkZXRlY3QKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJPT0xFQU4JCQkJYlJkZzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlCT09MRUFOICAgICAgICAgICAgIGJXbW1DYXBhYmxlOyAgICAgICAgLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCisJUU9TX0NBUEFCSUxJVFlfUEFSTSBBUFFvc0NhcGFiaWxpdHk7ICAgIC8vIFFPUyBjYXBhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKwlFRENBX1BBUk0gICAgICAgICAgIEFQRWRjYVBhcm07ICAgICAgICAgLy8gRURDQSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKwlRQlNTX0xPQURfUEFSTSAgICAgIEFQUWJzc0xvYWQ7ICAgICAgICAgLy8gUUJTUyBsb2FkIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKwlVQ0hBUiAgICAgICAgICAgICAgIEFja1BvbGljeVs0XTsgICAgICAgLy8gQUNLIHBvbGljeSBvZiB0aGUgc3BlY2lmaWVkIEFDLiBzZWUgQUNLX3h4eAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUJPT0xFQU4JCQkJYkRMU0NhcGFibGU7CQkvLyAwOmRpc2FibGUgRExTLCAxOmVuYWJsZSBETFMKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkvLyBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIKKwkvLyBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhCisJLy8gT1BTVEFUVVNfVEVTVF9GTEFHKCksIE9QU1RBVFVTX1NFVF9GTEFHKCksIE9QX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgorCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24KKwlVTE9ORyAgICAgICAgICAgICAgIE9wU3RhdHVzRmxhZ3M7CisKKwlCT09MRUFOCQkJCU5kaXNSYWRpb1N0YXRlT2ZmOyAvL0ZvciBIQ1QgMTIuMCwgc2V0IHRoaXMgZmxhZyB0byBUUlVFIGluc3RlYWQgb2YgY2FsbGVkIE1sbWVSYWRpb09mZi4KKwlBQkdCQU5EX1NUQVRFCQlCYW5kU3RhdGU7CQkvLyBGb3Igc2V0dGluZyBCQlAgdXNlZCBvbiBCL0cgb3IgQSBtb2RlLgorCisJLy8gSUVFRTgwMi4xMUgtLURGUy4KKwlSQURBUl9ERVRFQ1RfU1RSVUNUCVJhZGFyRGV0ZWN0OworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCUNBUlJJRVJfREVURUNUSU9OCQlDYXJyaWVyRGV0ZWN0OworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEhUCisJVUNIQVIJCQlCQVNpemU7CQkvLyBVU2VyIGRlc2lyZWQgQkFXaW5kb3dTaXplLiBTaG91bGQgbm90IGV4Y2VlZCBvdXIgbWF4IGNhcGFiaWxpdHkKKwkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7CisJUlRfSFRfQ0FQQUJJTElUWQlEZXNpcmVkSHRQaHk7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIVEluZm87CS8vIFVzZWZ1bCBhcyBBUC4KKwkvL1RoaXMgSUUgaXMgdXNlZCB3aXRoIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBlbGVtZW50IHdoZW4gY2hhbmdpbmcgdG8gYSBuZXcgNDBNSHouCisJLy9UaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFtbW91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLgorCU5FV19FWFRfQ0hBTl9JRQlOZXdFeHRDaGFuT2Zmc2V0OwkvLzcuMy4yLjIwQSwgMSBpZiBleHRlbnNpb24gY2hhbm5lbCBpcyBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLCAzIGlmIGJlbG93LCAwIGlmIG5vdCBwcmVzZW50CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJVUNIQVIJCQkJCUJzczIwNDBDb2V4aXN0RmxhZzsJCS8vIGJpdCAwOiBiQnNzQ29leGlzdFRpbWVyUnVubmluZywgYml0IDE6IE5lZWRTeW5jQWRkSHRJbmZvLgorCVJBTElOS19USU1FUl9TVFJVQ1QJQnNzMjA0MENvZXhpc3RUaW1lcjsKKworCS8vVGhpcyBJRSBpcyB1c2VkIGZvciAyMC80MCBCU1MgQ29leGlzdGVuY2UuCisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQlNTMjA0MENvZXhpc3RJbmZvOworCS8vID09PT09PSAxMW4gRDMuMCA9PT09PT09PT09PT09PT09PT09PT09PT4KKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5QYXNzaXZlRHdlbGw7CQkJCS8vIFVuaXQgOiBUVS4gNX4xMDAwCisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGw7CQkJCS8vIFVuaXQgOiBUVS4gMTB+MTAwMAorCVVTSE9SVAkJCQkJRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50OwkJCS8vIFVuaXQgOiBTZWNvbmQKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsOwkvLyBVbml0IDogVFUuIDIwMH4xMDAwMAorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAorCVVTSE9SVAkJCQkJRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3I7CisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlOwkJCQkvLyBVbml0IDogcGVyY2VudGFnZQorCisJVUxPTkcJCQkJCURvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OwkJCS8vIG11bHRpcGxlIG9mIChEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcikKKwlVTE9ORwkJCQkJQ291bnREb3duQ3RyOwkvLyBDb3VudERvd24gQ291bnRlciBmcm9tIChEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcikKKworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFRyaWdnZXJFdmVudFRhYkxvY2s7CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJTGFzdEJTU0NvZXhpc3QyMDQwOworCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJTU0NvZXhpc3QyMDQwOworCVRSSUdHRVJfRVZFTlRfVEFCCQlUcmlnZ2VyRXZlbnRUYWI7CisJVUNIQVIJCQkJCUNoYW5uZWxMaXN0SWR4OworCS8vIDw9PT09PT0gMTFuIEQzLjAgPT09PT09PT09PT09PT09PT09PT09PT0KKwlCT09MRUFOCQkJCQliT3ZlcmxhcFNjYW5uaW5nOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJIVFByb3RlY3Q7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYk1JTU9QU0VuYWJsZTsKKyAgICBCT09MRUFOCQkJCQliQkFEZWNsaW5lOworCUJPT0xFQU4JCQkJCWJEaXNhYmxlUmVvcmRlcmluZzsKKwlCT09MRUFOCQkJCQliRm9ydHlfTWh6X0ludG9sZXJhbnQ7CisJQk9PTEVBTgkJCQkJYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQ7CisJQk9PTEVBTgkJCQkJYlJjdkJTU1dpZHRoVHJpZ2dlckV2ZW50czsKKwlVTE9ORwkJCQkJTGFzdFJjdkJTU1dpZHRoVHJpZ2dlckV2ZW50c1RpbWU7CisKKwlVQ0hBUgkJCQkJVHhCQVNpemU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBFbmFibGUgd2lyZWxlc3MgZXZlbnQKKwlCT09MRUFOCQkJCWJXaXJlbGVzc0V2ZW50OworCUJPT0xFQU4JCQkJYldpRmlUZXN0OwkJCQkvLyBFbmFibGUgdGhpcyBwYXJhbWV0ZXIgZm9yIFdpRmkgdGVzdAorCisJLy8gVHggJiBSeCBTdHJlYW0gbnVtYmVyIHNlbGVjdGlvbgorCVVDSEFSCQkJCVR4U3RyZWFtOworCVVDSEFSCQkJCVJ4U3RyZWFtOworCisJLy8gdHJhbnNtaXQgcGh5IG1vZGUsIHRyYXNtaXQgcmF0ZSBmb3IgTXVsdGljYXN0LgorI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKwlVQ0hBUgkJCQlNY2FzdFRyYW5zbWl0TWNzOworCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRQaHlNb2RlOworI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKworCUJPT0xFQU4gICAgIAkJYkhhcmR3YXJlUmFkaW87ICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQKKworCisKKyAJTkRJU19TUElOX0xPQ0sJCQlNZWFzdXJlUmVxVGFiTG9jazsKKwlQTUVBU1VSRV9SRVFfVEFCCQlwTWVhc3VyZVJlcVRhYjsKKworCU5ESVNfU1BJTl9MT0NLCQkJVHBjUmVxVGFiTG9jazsKKwlQVFBDX1JFUV9UQUIJCQlwVHBjUmVxVGFiOworCisJLy8gdHJhbnNtaXQgcGh5IG1vZGUsIHRyYXNtaXQgcmF0ZSBmb3IgTXVsdGljYXN0LgorI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCU1DYXN0UGh5TW9kZTsKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKyNpZmRlZiBTSU5HTEVfU0tVCisJVUlOVDE2CQkJCQlEZWZpbmVNYXhUeFB3cjsKKyNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCisKKworfSBDT01NT05fQ09ORklHLCAqUENPTU1PTl9DT05GSUc7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLworLy8gU1RBIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1cwordHlwZWRlZiBzdHJ1Y3QgX1NUQV9BRE1JTl9DT05GSUcgeworCS8vIEdST1VQIDEgLQorCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKKwkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGJ1dCBub3QgbmVjZXNzYXJ5IGZ1bGx5IGVxdWFsIHRvIHRoZSBmaW5hbAorCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyBhZnRlciBuZWdvdGlhdGlvbi9jb21wcm9taXplIHdpdGggdGhlIEJTUyBob2xkZXIgKGVpdGhlcgorCS8vICAgQVAgb3IgSUJTUyBob2xkZXIpLgorCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKKwlVQ0hBUiAgICAgICBCc3NUeXBlOyAgICAgICAgICAgICAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQworCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgIC8vIHVzZWQgd2hlbiBzdGFydGluZyBhIG5ldyBJQlNTCisKKwkvLyBHUk9VUCAyIC0KKwkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCisJLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBhbmQgc2hvdWxkIGJlIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSBmaW5hbAorCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyB3aXRob3V0IGNvbXByb21pc2luZyB3aXRoIHRoZSBCU1MgaG9sZGVyLgorCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKKwlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlcjsKKwlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlck1vZGU7ICAgICAgLy8gUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQgb3IgUlNTSV9UUklHR0VSRURfVVBPTl9FWENDRUVEX1RIUkVTSE9MRAorCVVTSE9SVCAgICAgIERlZmF1bHRMaXN0ZW5Db3VudDsgICAvLyBkZWZhdWx0IGxpc3RlbiBjb3VudDsKKwlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJNb2RlOyAgICAgICAgICAgLy8gUG93ZXIgbW9kZSBmb3IgQUMgcG93ZXIKKwlVTE9ORyAgICAgICBXaW5kb3dzQmF0dGVyeVBvd2VyTW9kZTsgICAgLy8gUG93ZXIgbW9kZSBmb3IgYmF0dGVyeSBpZiBleGlzdHMKKwlCT09MRUFOICAgICBiV2luZG93c0FDQ0FNRW5hYmxlOyAgICAgICAgLy8gRW5hYmxlIENBTSBwb3dlciBtb2RlIHdoZW4gQUMgb24KKwlCT09MRUFOICAgICBiQXV0b1JlY29ubmVjdDsgICAgICAgICAvLyBTZXQgdG8gVFJVRSB3aGVuIHNldHRpbmcgT0lEXzgwMl8xMV9TU0lEIHdpdGggbm8gbWF0Y2hpbmcgQlNTSUQKKwlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJQcm9maWxlOyAgICAvLyBXaW5kb3dzIHBvd2VyIHByb2ZpbGUsIGZvciBORElTNS4xIFBuUAorCisJLy8gTUlCOmllZWU4MDJkb3QxMS5kb3QxMXNtdCgxKS5kb3QxMVN0YXRpb25Db25maWdUYWJsZSgxKQorCVVTSE9SVCAgICAgIFBzbTsgICAgICAgICAgICAgICAgICAvLyBwb3dlciBtYW5hZ2VtZW50IG1vZGUgICAoUFdSX0FDVElWRXxQV1JfU0FWRSkKKwlVU0hPUlQgICAgICBEaXNhc3NvY1JlYXNvbjsKKwlVQ0hBUiAgICAgICBEaXNhc3NvY1N0YVtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIERlYXV0aFJlYXNvbjsKKwlVQ0hBUiAgICAgICBEZWF1dGhTdGFbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICBBdXRoRmFpbFJlYXNvbjsKKwlVQ0hBUiAgICAgICBBdXRoRmFpbFN0YVtNQUNfQUREUl9MRU5dOworCisJTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJT3JpZ1dlcFN0YXR1czsJLy8gT3JpZ2luYWwgd2VwIHN0YXR1cyBzZXQgZnJvbSBPSUQKKworCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcworCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOworCisJVUNIQVIJCVBNS1szMl07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQTUsKKwlVQ0hBUiAgICAgICBQVEtbNjRdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUFRLCisJVUNIQVIJCUdUS1szMl07CQkJCS8vIEdUSyBmcm9tIGF1dGhlbnRpY2F0b3IKKwlCU1NJRF9JTkZPCVNhdmVkUE1LW1BNS0lEX05PXTsKKwlVSU5UCQlTYXZlZFBNS051bTsJCQkvLyBTYXZlZCBQTUtJRCBudW1iZXIKKworCVVDSEFSCQlEZWZhdWx0S2V5SWQ7CisKKworCS8vIFdQQSA4MDIuMXggcG9ydCBjb250cm9sLCBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCwgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVECisJVUNIQVIgICAgICAgUG9ydFNlY3VyZWQ7CisKKwkvLyBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcworCVVMT05HICAgICAgIExhc3RNaWNFcnJvclRpbWU7ICAgLy8gcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUKKwlVTE9ORyAgICAgICBNaWNFcnJDbnQ7ICAgICAgICAgIC8vIFNob3VsZCBiZSAwLCAxLCAyLCB0aGVuIHJlc2V0IHRvIHplcm8gKGFmdGVyIGRpc2Fzc29pY2lhdGlvbikuCisJQk9PTEVBTiAgICAgYkJsb2NrQXNzb2M7ICAgICAgICAvLyBCbG9jayBhc3NvY2lhdGUgYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcyBhZnRlciBjb3VudGVyIG1lYXN1cmUgb2NjdXJyZWQuCisJLy8gRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZQorCVdQQV9TVEFURSAgIFdwYVN0YXRlOyAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBTU19OT1RVU0UgYW5kIGhhbmRsZWQgYnkgbWljcm9zb2Z0IDgwMi4xeAorCVVDSEFSICAgICAgIFJlcGxheUNvdW50ZXJbOF07CisJVUNIQVIgICAgICAgQU5vbmNlWzMyXTsgICAgICAgICAvLyBBTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXJoZW50aWNhdG9yCisJVUNIQVIgICAgICAgU05vbmNlWzMyXTsgICAgICAgICAvLyBTTm9uY2UgZm9yIFdQQS1QU0sKKworCVVDSEFSICAgICAgIExhc3RTTlIwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUgorCVVDSEFSICAgICAgIExhc3RTTlIxOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SIGZvciAybmQgIGFudGVubmEKKwlSU1NJX1NBTVBMRSBSc3NpU2FtcGxlOworCVVMT05HICAgICAgIE51bU9mQXZnUnNzaVNhbXBsZTsKKworCVVMT05HICAgICAgIExhc3RCZWFjb25SeFRpbWU7ICAgICAvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBCRUFDT04gUlggdGltZQorCVVMT05HICAgICAgIExhc3QxMWJCZWFjb25SeFRpbWU7ICAvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUIgQkVBQ09OIFJYIHRpbWUKKwlVTE9ORwkJTGFzdDExZ0JlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFHIEJFQUNPTiBSWCB0aW1lCisJVUxPTkcJCUxhc3QyME5CZWFjb25SeFRpbWU7CS8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDIwTUh6IE4gQkVBQ09OIFJYIHRpbWUKKworCVVMT05HICAgICAgIExhc3RTY2FuVGltZTsgICAgICAgLy8gUmVjb3JkIGxhc3Qgc2NhbiB0aW1lIGZvciBpc3N1ZSBCU1NJRF9TQ0FOX0xJU1QKKwlVTE9ORyAgICAgICBTY2FuQ250OyAgICAgICAgICAgIC8vIFNjYW4gY291bnRzIHNpbmNlIG1vc3QgcmVjZW50IFNTSUQsIEJTU0lELCBTQ0FOIE9JRCByZXF1ZXN0CisJQk9PTEVBTiAgICAgYlN3UmFkaW87ICAgICAgICAgICAvLyBTb2Z0d2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24KKwlCT09MRUFOICAgICBiSHdSYWRpbzsgICAgICAgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgorCUJPT0xFQU4gICAgIGJSYWRpbzsgICAgICAgICAgICAgLy8gUmFkaW8gc3RhdGUsIEFuZCBvZiBTdyAmIEh3IHJhZGlvIHN0YXRlCisJQk9PTEVBTiAgICAgYkhhcmR3YXJlUmFkaW87ICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQKKwlCT09MRUFOICAgICBiU2hvd0hpZGRlblNTSUQ7ICAgIC8vIFNob3cgYWxsIGtub3duIFNTSUQgaW4gU1NJRCBsaXN0IGdldCBvcGVyYXRpb24KKworICAgIEJPT0xFQU4JCUFkaG9jQk9ubHlKb2luZWQ7CS8vIEluZGljYXRlIEFkaG9jIEIgSm9pbi4KKyAgICBCT09MRUFOCQlBZGhvY0JHSm9pbmVkOwkJLy8gSW5kaWNhdGUgQWRob2MgQi9HIEpvaW4uCisgICAgQk9PTEVBTgkJQWRob2MyME5Kb2luZWQ7CQkvLyBJbmRpY2F0ZSBBZGhvYyAyME1IeiBOIEpvaW4uCisKKwkvLyBOZXcgZm9yIFdQQSwgd2luZG93cyB3YW50IHVzIHRvIHRvIGtlZXAgYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gYW5kCisJLy8gRml4ZWQgSUVzIGZyb20gbGFzdCBhc3NvY2lhdGlvbiByZXNwb25zZQorCU5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OICAgICBBc3NvY0luZm87CisJVVNIT1JUICAgICAgIFJlcVZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKKwlVQ0hBUiAgICAgICBSZXFWYXJJRXNbTUFYX1ZJRV9MRU5dOwkJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJVVNIT1JUICAgICAgIFJlc1ZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKKwlVQ0hBUiAgICAgICBSZXNWYXJJRXNbTUFYX1ZJRV9MRU5dOworCisJVUNIQVIgICAgICAgUlNOSUVfTGVuOworCVVDSEFSICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisKKwkvLyBOZXcgdmFyaWFibGVzIHVzZWQgZm9yIENDWCAxLjAKKwlCT09MRUFOICAgICAgICAgICAgIGJDa2lwT247CisJQk9PTEVBTiAgICAgICAgICAgICBiQ2tpcENtaWNPbjsKKwlVQ0hBUiAgICAgICAgICAgICAgIENraXBGbGFnOworCVVDSEFSICAgICAgICAgICAgICAgR0lWWzNdOyAgLy9mb3IgQ0NYIGl2CisJVUNIQVIgICAgICAgICAgICAgICBSeFNFUVs0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIFR4U0VRWzRdOworCVVDSEFSICAgICAgICAgICAgICAgQ0tJUE1JQ1s0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIExlYXBBdXRoTW9kZTsKKwlMRUFQX0FVVEhfSU5GTyAgICAgIExlYXBBdXRoSW5mbzsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhhc2hQd2RbMTZdOworCVVDSEFSICAgICAgICAgICAgICAgTmV0d29ya0NoYWxsZW5nZVs4XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE5ldHdvcmtDaGFsbGVuZ2VSZXNwb25zZVsyNF07CisJVUNIQVIgICAgICAgICAgICAgICBQZWVyQ2hhbGxlbmdlWzhdOworCisJVUNIQVIgICAgICAgICAgICAgICBQZWVyQ2hhbGxlbmdlUmVzcG9uc2VbMjRdOworCVVDSEFSICAgICAgICAgICAgICAgU2Vzc2lvbktleVsxNl07IC8vTmV0d29yayBzZXNzaW9uIGtleXMgKE5TSykKKwlSQUxJTktfVElNRVJfU1RSVUNUIExlYXBBdXRoVGltZXI7CisJUk9HVUVBUF9UQUJMRSAgICAgICBSb2d1ZUFwVGFiOyAgIC8vQ2lzY28gQ0NYMSBSb2d1ZSBBUCBEZXRlY3Rpb24KKworCS8vIE5ldyBjb250cm9sIGZsYWdzIGZvciBDQ1gKKwlDQ1hfQ09OVFJPTCAgICAgICAgIENDWENvbnRyb2w7ICAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgYWRtaW5pc3RyYXRpb24gc3RhdGUKKwlCT09MRUFOICAgICAgICAgICAgIENDWEVuYWJsZTsgICAgICAgICAgICAgICAgICAvLyBBY3R1YWwgQ0NYIHN0YXRlCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hTY2FuQ2hhbm5lbDsgICAgICAgICAgICAgLy8gU2VsZWN0ZWQgY2hhbm5lbCBmb3IgQ0NYIGJlYWNvbiByZXF1ZXN0CisJVVNIT1JUICAgICAgICAgICAgICBDQ1hTY2FuVGltZTsgICAgICAgICAgICAgICAgLy8gVGltZSBvdXQgdG8gd2FpdCBmb3IgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUmVxVHlwZTsgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgcHJvY2Vzc2luZyBDQ1ggcmVxdWVzdCB0eXBlCisJQlNTX1RBQkxFICAgICAgICAgICBDQ1hCc3NUYWI7ICAgICAgICAgICAgICAgICAgLy8gQlNTIFRhYmxlCisJVUNIQVIgICAgICAgICAgICAgICBGcmFtZVJlcG9ydEJ1ZlsyMDQ4XTsgICAgICAgLy8gQnVmZmVyIGZvciBjcmVhdGluZyBmcmFtZSByZXBvcnQKKwlVU0hPUlQgICAgICAgICAgICAgIEZyYW1lUmVwb3J0TGVuOyAgICAgICAgICAgICAvLyBDdXJyZW50IEZyYW1lIHJlcG9ydCBsZW5ndGgKKwlVTE9ORyAgICAgICAgICAgICAgIENMQnVzeUJ5dGVzOyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUKKwlVU0hPUlQgICAgICAgICAgICAgIFJQSURlbnNpdHlbOF07ICAgICAgICAgICAgICAvLyBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbgorCS8vIFN0YXJ0IGFkZHJlc3Mgb2YgZWFjaCBCU1MgdGFibGUgd2l0aGluIEZyYW1lUmVwb3J0QnVmCisJLy8gSXQncyBpbXBvcnRhbnQgdG8gdXBkYXRlIHRoZSBSeFBvd2VyIG9mIHRoZSBjb3JyZXNwb25kaW5nIEJzcworCVVTSE9SVCAgICAgICAgICAgICAgQnNzUmVwb3J0T2Zmc2V0W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKKwlVU0hPUlQgICAgICAgICAgICAgIEJlYWNvblRva2VuOyAgICAgICAgICAgICAgICAvLyBUb2tlbiBmb3IgYmVhY29uIHJlcG9ydAorCVVMT05HICAgICAgICAgICAgICAgTGFzdEJzc0luZGV4OyAgICAgICAgICAgICAgIC8vIE1vc3QgY3VycmVudCByZXBvcnRlZCBCc3MgaW5kZXgKKwlSTV9SRVFVRVNUX0FDVElPTiAgIE1lYXN1cmVtZW50UmVxdWVzdFsxNl07ICAgICAvLyBTYXZlZCBtZWFzdXJlbWVudCByZXF1ZXN0CisJVUNIQVIgICAgICAgICAgICAgICBSTVJlcUNudDsgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCisJVUNIQVIgICAgICAgICAgICAgICBDdXJyZW50Uk1SZXFJZHg7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCisJQk9PTEVBTiAgICAgICAgICAgICBQYXJhbGxlbFJlcTsgICAgICAgICAgICAgICAgLy8gUGFyYWxsZWwgbWVhc3VyZW1lbnQsIG9ubHkgb25lIHJlcXVlc3QgcGVyZm9ybWVkLAorCQkJCQkJCQkJCQkJCS8vIEl0IG11c3QgYmUgdGhlIHNhbWUgY2hhbm5lbCB3aXRoIG1heGltdW0gZHVyYXRpb24KKwlVU0hPUlQgICAgICAgICAgICAgIFBhcmFsbGVsRHVyYXRpb247ICAgICAgICAgICAvLyBNYXhpbXVtIGR1cmF0aW9uIGZvciBwYXJhbGxlbCBtZWFzdXJlbWVudAorCVVDSEFSICAgICAgICAgICAgICAgUGFyYWxsZWxDaGFubmVsOyAgICAgICAgICAgIC8vIE9ubHkgb25lIGNoYW5uZWwgd2l0aCBwYXJhbGxlbCBtZWFzdXJlbWVudAorCVVTSE9SVCAgICAgICAgICAgICAgSUFQUFRva2VuOyAgICAgICAgICAgICAgICAgIC8vIElBUFAgZGlhbG9nIHRva2VuCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hRb3NFQ1dNaW47ICAgICAgICAgICAgICAgLy8gQ2lzY28gUU9TIEVDV01pbiBmb3IgQUMgMAorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUW9zRUNXTWF4OyAgICAgICAgICAgICAgIC8vIENpc2NvIFFPUyBFQ1dNYXggZm9yIEFDIDAKKwkvLyBIYWNrIGZvciBjaGFubmVsIGxvYWQgYW5kIG5vaXNlIGhpc3RvZ3JhbSBwYXJhbWV0ZXJzCisJVUNIQVIgICAgICAgICAgICAgICBOSEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBOb2lzZSBoaXN0b2dyYW0KKwlVQ0hBUiAgICAgICAgICAgICAgIENMRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIGNoYW5uZWwgbG9hZAorCisJVUNIQVIgICAgICAgICAgICAgICBLUktbMTZdOyAgICAgICAgLy9LZXkgUmVmcmVzaCBLZXkuCisJVUNIQVIgICAgICAgICAgICAgICBCVEtbMzJdOyAgICAgICAgLy9CYXNlIFRyYW5zaWVudCBLZXkKKwlCT09MRUFOICAgICAgICAgICAgIENDS01MaW5rVXBGbGFnOworCVVMT05HICAgICAgICAgICAgICAgQ0NLTVJOOyAgICAvLyhSZSlBc3NvY2lhdGlvbiByZXF1ZXN0IG51bWJlci4KKwlMQVJHRV9JTlRFR0VSICAgICAgIENDS01CZWFjb25BdEpvaW5UaW1lU3RhbXA7ICAvL1RTRiB0aW1lciBmb3IgUmUtYXNzb2NhaXRlIHRvIHRoZSBuZXcgQVAKKwlVQ0hBUiAgICAgICAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsgICAgICAvL2luIGRCbQorCVVDSEFSICAgICAgICAgICAgICAgQWlyb25ldElQQWRkcmVzc1s0XTsgICAgICAgIC8vZWcuIDE5Mi4xNjguMS4xCisJQk9PTEVBTiAgICAgICAgICAgICBDQ1hBZGphY2VudEFQUmVwb3J0RmxhZzsgICAgLy9mbGFnIGZvciBkZXRlcm1pbmluZyByZXBvcnQgQXNzb2MgTG9zdCB0aW1lCisJQ0hBUiAgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQU3NpZFtNQVhfTEVOX09GX1NTSURdOyAvL0FkamFjZW50IEFQJ3MgU1NJRCByZXBvcnQKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCVVDSEFSICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUEJzc2lkW01BQ19BRERSX0xFTl07ICAgICAgICAgLy9BZGphY2VudCBBUCdzIEJTU0lEIHJlcG9ydAorCVVTSE9SVCAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUENoYW5uZWw7CisJVUxPTkcgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lOyAgLy9mb3IgU3BlYyBTMzIuCisKKwlSQUxJTktfVElNRVJfU1RSVUNUCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyOworCUJPT0xFQU4JCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nOworCisJVUNIQVIgICAgICAgICAgIAlEdGltQ291bnQ7ICAgICAgLy8gMC4uIER0aW1QZXJpb2QtMQorCVVDSEFSICAgICAgICAgICAJRHRpbVBlcmlvZDsgICAgIC8vIGRlZmF1bHQgPSAzCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlSVF84MDJfMTFfRExTCQlETFNFbnRyeVtNQVhfTlVNX09GX0RMU19FTlRSWV07CisJVUNIQVIJCQkJRGxzUmVwbGF5Q291bnRlcls4XTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVGhpcyBpcyBvbmx5IGZvciBXSFFMIHRlc3QuCisJQk9PTEVBTgkJCQlXaHFsVGVzdDsKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIFdwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyOworICAgIC8vIEZhc3QgUm9hbWluZworCUJPT0xFQU4JCSAgICAgICAgYkZhc3RSb2FtaW5nOyAgICAgICAvLyAwOmRpc2FibGUgZmFzdCByb2FtaW5nLCAxOmVuYWJsZSBmYXN0IHJvYW1pbmcKKwlDSEFSCQkgICAgICAgIGRCbVRvUm9hbTsgICAgICAgICAgLy8gdGhlIGNvbmRpdGlvbiB0byByb2FtIHdoZW4gcmVjZWl2aW5nIFJzc2kgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIEl0J3MgbmVnYXRpdmUgdmFsdWUuCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMVg7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKyAgICBDSVBIRVJfS0VZCSAgICAgICAgRGVzaXJlU2hhcmVkS2V5WzRdOwkvLyBSZWNvcmQgdXNlciBkZXNpcmVkIFdFUCBrZXlzCisgICAgVUNIQVIgICAgICAgICAgICAgICBEZXNpcmVTaGFyZWRLZXlJZDsKKworICAgIC8vIDA6IGRyaXZlciBpZ25vcmVzIHdwYV9zdXBwbGljYW50CisgICAgLy8gMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24KKyAgICAvLyAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycworICAgIFVDSEFSICAgICAgICAgICAgICAgV3BhU3VwcGxpY2FudFVQOworCVVDSEFSCQkJCVdwYVN1cHBsaWNhbnRTY2FuQ291bnQ7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgQ0hBUiAgICAgICAgICAgICAgICBkZXZfbmFtZVsxNl07CisgICAgVVNIT1JUICAgICAgICAgICAgICBPcmlEZXZUeXBlOworCisgICAgQk9PTEVBTiAgICAgICAgICAgICBiVEduV2lmaVRlc3Q7CisJQk9PTEVBTgkJCSAgICBiU2NhblJlcUlzRnJvbVdlYlVJOworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOworCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisKKyNpZmRlZiBSVDI4NjAKKyAgICBVQ0hBUiAgICAgICBCQlBSMzsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlVQ0hBUgkJCQlJRUVFODAyMTFkQ2xpZW50TW9kZTsKKwlVQ0hBUgkJCQlTdGFPcmlDb3VudHJ5Q29kZVszXTsKKwlVQ0hBUgkJCQlTdGFPcmlHZW9ncmFwaHk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworfSBTVEFfQURNSU5fQ09ORklHLCAqUFNUQV9BRE1JTl9DT05GSUc7CisKKy8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEKKy8vIGhhZCBhZ3JlZWQgdXBvbiBqb2luaW5nIHRoZSBuZXR3b3JrLiBXaGljaCBtZWFucyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSB1c3VhbGx5IGRlY2lkZWQKKy8vIGJ5IHRoZSBCU1MvSUJTUyBjcmVhdG9yIGluc3RlYWQgb2YgdXNlciBjb25maWd1cmF0aW9uLiBEYXRhIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cnJlCisvLyBpcyB2YWxpZCBvbmx5IHdoZW4gZWl0aGVyIEFESE9DX09OKHBBZCkgb3IgSU5GUkFfT04ocEFkKSBpcyBUUlVFLgorLy8gTm9ybWFsbHksIGFmdGVyIFNDQU4gb3IgZmFpbGVkIHJvYW1pbmcgYXR0ZW1wdHMsIHdlIG5lZWQgdG8gcmVjb3ZlciBiYWNrIHRvCisvLyB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZ3MuCit0eXBlZGVmIHN0cnVjdCBfU1RBX0FDVElWRV9DT05GSUcgeworCVVTSE9SVCAgICAgIEFpZDsKKwlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAgICAgICAvLyBpbiBrdXNlYzsgSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQKKwlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKKwlVU0hPUlQgICAgICBDZnBQZXJpb2Q7CisKKwkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgorCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKKwkvLyBDb3B5IHN1cHBvcnRlZCBodCBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKKwlSVF9IVF9QSFlfSU5GTwkJU3VwcG9ydGVkUGh5SW5mbzsKKwlSVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworfSBTVEFfQUNUSVZFX0NPTkZJRywgKlBTVEFfQUNUSVZFX0NPTkZJRzsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy8gLS0tLS0tLS0tLS0gc3RhcnQgb2YgQVAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFVVEgtUlNQIFN0YXRlIE1hY2hpbmUgQXV4IGRhdGEgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCBfQVBfTUxNRV9BVVggeworCVVDSEFSICAgICAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgICAgICAgICAgQWxnOworCUNIQVIgICAgICAgICAgICAgICAgQ2hhbGxlbmdlW0NJUEhFUl9URVhUX0xFTl07Cit9IEFQX01MTUVfQVVYLCAqUEFQX01MTUVfQVVYOworCisvLyBzdHJ1Y3R1cmUgdG8gZGVmaW5lIFdQQSBHcm91cCBLZXkgUmVrZXkgSW50ZXJ2YWwKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX1dQQV9SRUtFWSB7CisJVUxPTkcgUmVLZXlNZXRob2Q7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCisJVUxPTkcgUmVLZXlJbnRlcnZhbDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCit9IFJUX1dQQV9SRUtFWSwqUFJUX1dQQV9SRUtFWSwgUlRfODAyXzExX1dQQV9SRUtFWSwgKlBSVF84MDJfMTFfV1BBX1JFS0VZOworCit0eXBlZGVmIHN0cnVjdCBfTUFDX1RBQkxFX0VOVFJZIHsKKwkvL0Nob29zZSAxIGZyb20gVmFsaWRBc1dEUyBhbmQgVmFsaWRBc0NMSSAgdG8gdmFsaWRpemUuCisJQk9PTEVBTgkJVmFsaWRBc0NMSTsJCS8vIFN0YSBtb2RlLCBzZXQgdGhpcyBUUlVFIGFmdGVyIExpbmt1cCx0b28uCisJQk9PTEVBTgkJVmFsaWRBc1dEUzsJLy8gVGhpcyBpcyBXRFMgRW50cnkuIG9ubHkgZm9yIEFQIG1vZGUuCisJQk9PTEVBTgkJVmFsaWRBc0FwQ2xpOyAgIC8vVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4KKwlCT09MRUFOCQlWYWxpZEFzTWVzaDsKKwlCT09MRUFOCQlWYWxpZEFzRGxzOwkvLyBUaGlzIGlzIERMUyBFbnRyeS4gb25seSBmb3IgU1RBIG1vZGUuCisJQk9PTEVBTgkJaXNDYWNoZWQ7CisJQk9PTEVBTgkJYklBbUJhZEF0aGVyb3M7CS8vIEZsYWcgaWYgdGhpcyBpcyBBdGhlcm9zIGNoaXAgdGhhdCBoYXMgSU9UIHByb2JsZW0uICBXZSBuZWVkIHRvIHR1cm4gb24gUlRTL0NUUyBwcm90ZWN0aW9uLgorCisJVUNIQVIgICAgICAgICAJRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7ICAvLyBFbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIEVBUCBTTQorCS8vamFuIGZvciB3cGEKKwkvLyByZWNvcmQgd2hpY2ggZW50cnkgcmV2b2tlIE1JQyBGYWlsdXJlICwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQgorCVVDSEFSICAgICAgICAgICBDTVRpbWVyUnVubmluZzsKKwlVQ0hBUiAgICAgICAgICAgYXBpZHg7CQkJLy8gTUJTUyBudW1iZXIKKwlVQ0hBUiAgICAgICAgICAgUlNOSUVfTGVuOworCVVDSEFSICAgICAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CisJVUNIQVIgICAgICAgICAgIEFOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOworCVVDSEFSICAgICAgICAgICBSX0NvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIgICAgICAgICAgIFBUS1s2NF07CisJVUNIQVIgICAgICAgICAgIFJlVHJ5Q291bnRlcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICAgICAgICAgICAgICBSZXRyeVRpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QJCQkJCUVucXVldWVTdGFydEZvclBTS1RpbWVyOwkvLyBBIHRpbWVyIHdoaWNoIGVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgUFNLIFNNCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJQVBfV1BBX1NUQVRFICAgIFdwYVN0YXRlOworCUdUS19TVEFURSAgICAgICBHVEtTdGF0ZTsKKwlVU0hPUlQgICAgICAgICAgUG9ydFNlY3VyZWQ7CisJTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgIFByaXZhY3lGaWx0ZXI7ICAgICAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKKwlDSVBIRVJfS0VZICAgICAgUGFpcndpc2VLZXk7CisJUFZPSUQgICAgICAgICAgIHBBZDsKKyAgICBJTlQJCQkJUE1LSURfQ2FjaGVJZHg7CisgICAgVUNIQVIJCQlQTUtJRFtMRU5fUE1LSURdOworCisKKwlVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBQc01vZGU7CisJU1NUICAgICAgICAgICAgIFNzdDsKKwlBVVRIX1NUQVRFICAgICAgQXV0aFN0YXRlOyAvLyBmb3IgU0hBUkVEIEtFWSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lIHVzZWQgb25seQorCUJPT0xFQU4JCQlJc1JlYXNzb2NTdGE7CS8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhIHJlYXNzb2NpYXRpb24gcHJvY2VkdXJlCisJVVNIT1JUICAgICAgICAgIEFpZDsKKwlVU0hPUlQgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisJVUNIQVIgICAgICAgICAgIExhc3RSc3NpOworCVVMT05HICAgICAgICAgICBOb0RhdGFJZGxlQ291bnQ7CisJVUlOVDE2CQkJU3RhdGlvbktlZXBBbGl2ZUNvdW50OyAvLyB1bml0OiBzZWNvbmQKKwlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OworCVFVRVVFX0hFQURFUiAgICBQc1F1ZXVlOworCisJVUlOVDMyCQkJU3RhQ29ubmVjdFRpbWU7CQkvLyB0aGUgbGl2ZSB0aW1lIG9mIHRoaXMgc3RhdGlvbiBzaW5jZSBhc3NvY2lhdGVkIHdpdGggQVAKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCWJTZW5kQkFSOworCVVTSE9SVAkJCU5vQkFEYXRhQ291bnREb3duOworCisJVUlOVDMyICAgCQlDYWNoZWRCdWZbMTZdOwkJLy8gVUlOVCAoNCBieXRlcykgZm9yIGFsaWdubWVudAorCVVJTlQJCQlUeEJGQ291bnQ7IC8vIDMqMworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCVVJTlQJCQlGSUZPQ291bnQ7CisJVUlOVAkJCURlYnVnRklGT0NvdW50OworCVVJTlQJCQlEZWJ1Z1R4Q291bnQ7CisgICAgQk9PTEVBTgkJCWJEbHNJbml0OworCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy9XRFMgZW50cnkgbmVlZHMgdGhlc2UKKy8vIHJ0Mjg2MCBhZGQgdGhpcy4gaWYgVmFsaWRBc1dEUz09VFJVRSwgTWF0Y2hXRFNUYWJJZHggaXMgdGhlIGluZGV4IGluIFdkc1RhYi5NYWNUYWIKKwlVSU5UCQkJTWF0Y2hXRFNUYWJJZHg7CisJVUNIQVIgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGU7CisJVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGU7CisJVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGVJbmRleDsKKwkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCisJVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJVUlOVDMyCQkJT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OworCVVJTlQzMgkJCUNvbnRpbnVlVHhGYWlsQ250OworCVVJTlQzMiAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCisJVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJVUlOVAkJCU1hdGNoRGxzRW50cnlJZHg7IC8vIGluZGljYXRlIHRoZSBpbmRleCBpbiBwQWQtPlN0YUNmZy5ETFNFbnRyeQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OworCUJPT0xFQU4JCQlmTGFzdFNlY0FjY29yZGluZ1JTU0k7CisJVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgorCUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCisJVUxPTkcJCQlMYXN0VHhPa0NvdW50OworCVVDSEFSICAgICAgICAgICBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCisJLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCisJLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQorCS8vIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgorCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24uIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAorCVVMT05HICAgICAgICAgICBDbGllbnRTdGF0dXNGbGFnczsKKworCS8vIFRPRE86IFNoYWxsIHdlIG1vdmUgdGhhdCB0byBET1QxMV9OX1NVUFBPUlQ/Pz8KKwlIVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEhUIEVXQyBNSU1PLU4gdXNlZCBwYXJhbWV0ZXJzCisJVVNIT1JUCQlSWEJBYml0bWFwOwkvLyBmaWxsIHRvIG9uLWNoaXAgIFJYV0lfQkFfQklUTUFTSyBpbiA4LjEuM1JYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQKKwlVU0hPUlQJCVRYQkFiaXRtYXA7CS8vIFRoaXMgYml0bWFwIGFzIG9yaWdpbmF0b3IsIG9ubHkga2VlcCBpbiBzb2Z0d2FyZSB1c2VkIHRvIG1hcmsgQU1QRFUgYml0IGluIFRYV0kKKwlVU0hPUlQJCVRYQXV0b0JBYml0bWFwOworCVVTSE9SVAkJQkFEZWNsaW5lQml0bWFwOworCVVTSE9SVAkJQkFSZWNXY2lkQXJyYXlbTlVNX09GX1RJRF07CS8vIFRoZSBtYXBwaW5nIHdjaWQgb2YgcmVjaXBpZW50IHNlc3Npb24uIGlmIFJYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAorCVVTSE9SVAkJQkFPcmlXY2lkQXJyYXlbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKwlVU0hPUlQJCUJBT3JpU2VxdWVuY2VbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKworCS8vIDgwMi4xMW4gZmVhdHVyZXMuCisJVUNIQVIJCU1wZHVEZW5zaXR5OworCVVDSEFSCQlNYXhSQW1wZHVGYWN0b3I7CisJVUNIQVIJCUFNc2R1U2l6ZTsKKwlVQ0hBUgkJTW1wc01vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLgorCisJSFRfQ0FQQUJJTElUWV9JRQkJSFRDYXBhYmlsaXR5OworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCVVDSEFSCQlCU1MyMDQwQ29leGlzdGVuY2VNZ210U3VwcG9ydDsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlCT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKKworCVVDSEFSICAgICAgIFJhdGVMZW47CisJc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgKnBOZXh0OworICAgIFVTSE9SVCAgICAgIFR4U2VxW05VTV9PRl9USURdOworCVVTSE9SVAkJTm9uUW9zRGF0YVNlcTsKKworCVJTU0lfU0FNUExFCVJzc2lTYW1wbGU7CisKKwlVSU5UMzIJCQlUWE1DU0V4cGVjdGVkWzE2XTsKKwlVSU5UMzIJCQlUWE1DU1N1Y2Nlc3NmdWxbMTZdOworCVVJTlQzMgkJCVRYTUNTRmFpbGVkWzE2XTsKKwlVSU5UMzIJCQlUWE1DU0F1dG9GYWxsQmFja1sxNl1bMTZdOworfSBNQUNfVEFCTEVfRU5UUlksICpQTUFDX1RBQkxFX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTUFDX1RBQkxFIHsKKwlVU0hPUlQJCQlTaXplOworCU1BQ19UQUJMRV9FTlRSWSAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOworCU1BQ19UQUJMRV9FTlRSWSBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKKwlRVUVVRV9IRUFERVIgICAgTWNhc3RQc1F1ZXVlOworCVVMT05HICAgICAgICAgICBQc1FJZGxlQ291bnQ7CisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSW5Qc207CisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uQmFkQXRoZXJvczsJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgYXRoZXJvcyA4MDIuMTFuIENoaXAuICBXZSBuZWVkIHRvIHVzZSBSVFMvQ1RTIHdpdGggQXRoZXJvcyA4MDIsLjExbiBjaGlwLgorCUJPT0xFQU4JCQlmQW55VHhPUEZvcmNlRGlzYWJsZTsJLy8gQ2hlY2sgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgQkUgVHhPUAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbklzTGVnYWN5OwkvLyBDaGVjayBpZiBJIHVzZSBsZWdhY3kgcmF0ZSB0byB0cmFuc21pdCB0byBteSBCU1MgU3RhdGlvbi8KKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Ob25HRjsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uMjBPbmx5OwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KKwlCT09MRUFOCQkJZkFueVN0YXRpb25NSU1PUFNEeW5hbWljOyAvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBNSU1PIER5bmFtaWMKKwlCT09MRUFOICAgICAgICAgZkFueUJBU2Vzc2lvbjsgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBCQSBzZXNzaW9uLiAgRm9yY2UgdHVybiBvbiBSVFMvQ1RTCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9IE1BQ19UQUJMRSwgKlBNQUNfVEFCTEU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgSVNfSFRfU1RBKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKworI2RlZmluZSBJU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKworI2RlZmluZSBQRUVSX0lTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBfV0RTX0VOVFJZIHsKKwlCT09MRUFOICAgICAgICAgVmFsaWQ7CisJVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OworCXN0cnVjdCBfV0RTX0VOVFJZICpwTmV4dDsKK30gV0RTX0VOVFJZLCAqUFdEU19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgIF9XRFNfVEFCTEVfRU5UUlkgeworCVVTSE9SVAkJCVNpemU7CisJVUNIQVIgICAgICAgICAgIFdkc0FkZHJbTUFDX0FERFJfTEVOXTsKKwlXRFNfRU5UUlkgICAgICAgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKKwlXRFNfRU5UUlkgICAgICAgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07CisJVUNIQVIgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGU7CisJVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGU7CisJVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVVNIT1JUICAgICAgICAgIE9uZVNlY1R4T2tDb3VudDsKKwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVVNIT1JUICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OworCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCisJVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgorfSBXRFNfVEFCTEVfRU5UUlksICpQV0RTX1RBQkxFX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1dEU19FTlRSWSB7CisJUE5FVF9ERVYJCQlkZXY7CisJVUNIQVIJCQkJVmFsaWQ7CisJVUNIQVIJCQkJUGh5TW9kZTsKKwlVQ0hBUgkJCQlQZWVyV2RzQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJCU1hY1RhYk1hdGNoV0NJRDsJLy8gQVNJQworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgIFdlcFN0YXR1czsKKwlVQ0hBUgkJCQkJS2V5SWR4OworCUNJUEhFUl9LRVkgICAgICAgICAgCVdkc0tleTsKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsKKwlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLgorfSBSVF84MDJfMTFfV0RTX0VOVFJZLCAqUFJUXzgwMl8xMV9XRFNfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9XRFNfVEFCTEUgeworCVVDSEFSICAgICAgICAgICAgICAgTW9kZTsKKwlVTE9ORyAgICAgICAgICAgICAgIFNpemU7CisJUlRfODAyXzExX1dEU19FTlRSWQlXZHNFbnRyeVtNQVhfV0RTX0VOVFJZXTsKK30gV0RTX1RBQkxFLCAqUFdEU19UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FQQ0xJX1NUUlVDVCB7CisJUE5FVF9ERVYJCQkJZGV2OworI2lmZGVmIFJUTDg2NVhfU09DCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgbXlsaW5raWQ7CisjZW5kaWYKKwlCT09MRUFOICAgICAgICAgICAgICAgICBFbmFibGU7CS8vIFNldCBpdCBhcyAxIGlmIHRoZSBhcGNsaSBpbnRlcmZhY2Ugd2FzIGNvbmZpZ3VyZWQgdG8gIjEiICBvciBieSBpd3ByaXYgY21kICJBcENsaUVuYWJsZSIKKwlCT09MRUFOICAgICAgICAgICAgICAgICBWYWxpZDsJLy8gU2V0IGl0IGFzIDEgaWYgdGhlIGFwY2xpIGludGVyZmFjZSBhc3NvY2lhdGVkIHN1Y2Nlc3MgdG8gcmVtb3RlIEFQLgorCVVDSEFSCQkJCQlNYWNUYWJXQ0lEOwkvL1dDSUQgdmFsdWUsIHdoaWNoIHBvaW50IHRvIHRoZSBlbnRyeSBvZiBBU0lDIE1hYyB0YWJsZS4KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBTc2lkTGVuOworCUNIQVIgICAgICAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKworCVVDSEFSICAgICAgICAgICAgICAgICAgIENmZ1NzaWRMZW47CisJQ0hBUiAgICAgICAgICAgICAgICAgICAgQ2ZnU3NpZFtNQVhfTEVOX09GX1NTSURdOworCVVDSEFSICAgICAgICAgICAgICAgICAgIENmZ0FwQ2xpQnNzaWRbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDdXJyZW50QWRkcmVzc1tFVEhfTEVOR1RIX09GX0FERFJFU1NdOworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQXBDbGlSY3ZCZWFjb25UaW1lOworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQ3RybEN1cnJTdGF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBTeW5jQ3VyclN0YXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIEF1dGhDdXJyU3RhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQXNzb2NDdXJyU3RhdGU7CisJVUxPTkcJCQkJCVdwYVBza0N1cnJTdGF0ZTsKKworCVVTSE9SVCAgICAgICAgICAgICAgICAgIEF1dGhSZXFDbnQ7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgQXNzb2NSZXFDbnQ7CisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBDbGllbnRTdGF0dXNGbGFnczsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBNcGR1RGVuc2l0eTsKKworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCisJLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQorCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCisJVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OworCisJVUNIQVIJCVBTS1sxMDBdOwkJCQkvLyByZXNlcnZlIFBTSyBrZXkgbWF0ZXJpYWwKKwlVQ0hBUiAgICAgICBQU0tMZW47CisJVUNIQVIgICAgICAgUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSworCVVDSEFSCQlHVEtbMzJdOwkJCQkvLyBHVEsgZnJvbSBhdXRoZW50aWNhdG9yCisKKwlDSVBIRVJfS0VZICAgICAgU2hhcmVkS2V5W1NIQVJFX0tFWV9OVU1dOworCVVDSEFSICAgICAgICAgICBEZWZhdWx0S2V5SWQ7CisKKwkvLyBzdG9yZSBSU05fSUUgYnVpbHQgYnkgZHJpdmVyCisJVUNIQVIJCVJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsgIC8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGNvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJVUNIQVIJCVJTTklFX0xlbjsKKworCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCisJVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQorCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJCbG9ja0Fzc29jOyAvLyBCbG9jayBhc3NvY2lhdGUgYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcyBhZnRlciBjb3VudGVyIG1lYXN1cmUgb2NjdXJyZWQuCisKKwkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCisJVUNIQVIgICAgICAgCVNOb25jZVszMl07ICAgICAgICAgLy8gU05vbmNlIGZvciBXUEEtUFNLCisJVUNIQVIJCQlHTm9uY2VbMzJdOwkJCS8vIEdOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1dGhlbnRpY2F0b3IKKworI2lmZGVmIFdTQ19BUF9TVVBQT1JUCisJV1NDX0NUUkwJICAgICAgICAgICBXc2NDb250cm9sOworI2VuZGlmIC8vIFdTQ19BUF9TVVBQT1JUIC8vCisKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsKKwlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLgorfSBBUENMSV9TVFJVQ1QsICpQQVBDTElfU1RSVUNUOworCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgQVAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgQkxPQ0tfTkVUX0lGCit0eXBlZGVmIHN0cnVjdCBfQkxPQ0tfUVVFVUVfRU5UUlkKK3sKKwlCT09MRUFOIFN3VHhRdWV1ZUJsb2NrRmxhZzsKKwlMSVNUX0hFQURFUiBOZXRJZkxpc3Q7Cit9IEJMT0NLX1FVRVVFX0VOVFJZLCAqUEJMT0NLX1FVRVVFX0VOVFJZOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCitzdHJ1Y3Qgd2lmaWNvbmYKK3sKKwlCT09MRUFOCWJTaG9ydEdJOworCUJPT0xFQU4gYkdyZWVuRmllbGQ7Cit9OworCisKKworCit0eXBlZGVmIHN0cnVjdCBfSU5GX1BDSV9DT05GSUcKK3sKKwlQVUNIQVIgICAgICAgICAgICAgICAgICBDU1JCYXNlQWRkcmVzczsgICAgIC8vIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZQorfUlORl9QQ0lfQ09ORklHOworCit0eXBlZGVmIHN0cnVjdCBfSU5GX1VTQl9DT05GSUcKK3sKKwlVSU5UICAgICAgICAgICAgICAgIEJ1bGtJbkVwQWRkcjsJCS8vIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcworCVVJTlQgICAgICAgICAgICAgICAgQnVsa091dEVwQWRkcls2XTsJLy8gYnVsay1vdXQgZW5kcG9pbnQgYWRkcmVzcworCit9SU5GX1VTQl9DT05GSUc7CisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJdHlwZWRlZiB2b2lkICgqSWthbm9zV2xhblR4Q2JGdW5jUCkodm9pZCAqLCB2b2lkICopOworCisJc3RydWN0IElLQU5PU19UWF9JTkZPCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCQlJa2Fub3NXbGFuVHhDYkZ1bmNQICpmcDsKKwl9OworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworI2lmZGVmIE5JTlRFTkRPX0FQCit0eXBlZGVmIHN0cnVjdCBfTklORE9fQ1RSTF9CTE9DSyB7CisKKwlSVF9OSU5URU5ET19UQUJMRQlEU19UQUJMRTsKKworI2lmZGVmIENISVAyNVhYCisJc3BpbmxvY2tfdAkJCU5JTlRFTkRPX1RBQkxFX0xvY2s7CisjZWxzZQorCU5ESVNfU1BJTl9MT0NLCQlOSU5URU5ET19UQUJMRV9Mb2NrOworI2VuZGlmIC8vIENISVAyNVhYIC8vCisKKwlVQ0hBUgkJCQlOSU5URU5ET19VUF9CVUZGRVJbNTEyXTsKKwlVQ0hBUgkJCQlMb2NhbF9LZXlJZHg7CisJQ0lQSEVSX0tFWQkJCUxvY2FsX1NoYXJlZEtleTsKKwlVQ0hBUgkJCQlMb2NhbF9iSGlkZVNzaWQ7CisJVUNIQVIJCQkJTG9jYWxfQXV0aE1vZGU7CisJVUNIQVIJCQkJTG9jYWxfV2VwU3RhdHVzOworCVVTSE9SVAkJCQlMb2NhbF9DYXBhYmlsaXR5SW5mbzsKK30gTklORE9fQ1RSTF9CTE9DSzsKKyNlbmRpZiAvLyBOSU5URU5ET19BUCAvLworCisKKyNpZmRlZiBEQkdfRElBR05PU0UKKyNkZWZpbmUgRElBR05PU0VfVElNRQkxMCAgIC8vIDEwIHNlYwordHlwZWRlZiBzdHJ1Y3QgX1J0bXBEaWFnU3RyY3V0XworewkvLyBEaWFnbm9zaXMgUmVsYXRlZCBlbGVtZW50CisJdW5zaWduZWQgY2hhcgkJaW5pdGVkOworCXVuc2lnbmVkIGNoYXIgCXFJZHg7CisJdW5zaWduZWQgY2hhciAJQXJyYXlTdGFydElkeDsKKwl1bnNpZ25lZCBjaGFyCQlBcnJheUN1cklkeDsKKwkvLyBUeCBSZWxhdGVkIENvdW50CisJVVNIT1JUCQkJVHhEYXRhQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVR4RmFpbENudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeERlc2NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMJLy8gVHhEZXNjIHF1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwfjE0LCA+PTE1CisJVVNIT1JUCQkJVHhNY3NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMKKwlVU0hPUlQJCQlUeFNXUXVlQ250W0RJQUdOT1NFX1RJTUVdWzldOwkJLy8gVHhTd1F1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA+PTgKKworCVVTSE9SVAkJCVR4QWdnQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVR4Tm9uQWdnQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVR4QU1QRFVDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMgLy8gMTAgc2VjLCBUeERNQSBBUE1EVSBBZ2dyZWdhdGlvbiBjb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIGluIHNldHAgb2YgMS4KKwlVU0hPUlQJCQlUeFJhbGlua0NudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeFJhbGluayBBZ2dyZWdhdGlvbiBDb3VudCBpbiAxIHNlYyBzY2FsZS4KKwlVU0hPUlQJCQlUeEFNU0RVQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFR4QU1TVUQgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCisKKwkvLyBSeCBSZWxhdGVkIENvdW50CisJVVNIT1JUCQkJUnhEYXRhQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFJ4IFRvdGFsIERhdGEgY291bnQuCisJVVNIT1JUCQkJUnhDcmNFcnJDbnRbRElBR05PU0VfVElNRV07CisJVVNIT1JUCQkJUnhNY3NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMKK31SdG1wRGlhZ1N0cnVjdDsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCisvLworLy8gIFRoZSBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0IF9SVE1QX0FEQVBURVIKK3sKKwlQVk9JRAkJCQkJT1NfQ29va2llOwkvLyBzYXZlIHNwZWNpZmljIHN0cnVjdHVyZSByZWxhdGl2ZSB0byBPUworCVBORVRfREVWCQkJCW5ldF9kZXY7CisJVUxPTkcJCQkJCVZpcnR1YWxJZkNudDsKKworI2lmZGVmIFJUMjg2MAorICAgIFVTSE9SVAkJICAgICAgICAgICAgTG5rQ3RybEJpdE1hc2s7CisgICAgVVNIT1JUCQkgICAgICAgICAgICBSTG5rQ3RybENvbmZpZ3VyYXRpb247CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgUkxua0N0cmxPZmZzZXQ7CisgICAgVVNIT1JUCQkgICAgICAgICAgICBIb3N0TG5rQ3RybENvbmZpZ3VyYXRpb247CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgSG9zdExua0N0cmxPZmZzZXQ7CisJVVNIT1JUCQkgICAgICAgICAgICBQQ0llUG93ZXJTYXZlTGV2ZWw7CisgICAJQk9PTEVBTgkJCQkJYlBDSWNsa09mZjsJCQkJCQkvLyBmbGFnIHRoYXQgaW5kaWNhdGUgaWYgdGhlIFBJQ0UgcG93ZXIgc3RhdHVzIGluIENvbmZpZ3VyYXRpb24gU1BhY2UuLgorCUJPT0xFQU4JCQkJCWJQQ0ljbGtPZmZEaXNhYmxlVHg7CQkJLy8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFBDSSByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKKworCVVJTlQJCQkJCWludF9lbmFibGVfcmVnOworCVVJTlQJCQkJCWludF9kaXNhYmxlX21hc2s7CisJVUlOVAkJCQkJaW50X3BlbmRpbmc7CisKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIFR4QnVmU3BhY2VbTlVNX09GX1RYX1JJTkddOyAvLyBTaGFyZWQgbWVtb3J5IG9mIGFsbCAxc3QgcHJlLWFsbG9jYXRlZCBUeEJ1ZiBhc3NvY2lhdGVkIHdpdGggZWFjaCBUWEQKKwlSVE1QX0RNQUJVRiAgICAgICAgICAgICBSeERlc2NSaW5nOyAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIG1lbW9yeSBmb3IgUlggZGVzY3JpcHRvcnMKKwlSVE1QX0RNQUJVRiAgICAgICAgICAgICBUeERlc2NSaW5nW05VTV9PRl9UWF9SSU5HXTsgCS8vIFNoYXJlZCBtZW1vcnkgZm9yIFR4IGRlc2NyaXB0b3JzCisJUlRNUF9UWF9SSU5HICAgICAgICAgICAgVHhSaW5nW05VTV9PRl9UWF9SSU5HXTsgICAgIAkvLyBBQzB+NCArIEhDQ0EKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgaXJxX2xvY2s7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgaXJxX2Rpc2FibGVkOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qICAgICAgQm90aCBQQ0kvVVNCIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFR4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlCT09MRUFOICAgICAgICAgICAgICAgICBEZVF1ZXVlUnVubmluZ1tOVU1fT0ZfVFhfUklOR107ICAvLyBmb3IgZW5zdXJpbmcgUlRVU0JEZVF1ZXVlUGFja2V0IGdldCBjYWxsIG9uY2UKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBEZVF1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CisKKworCS8vIHJlc291cmNlIGZvciBzb2Z0d2FyZSBiYWNrbG9nIHF1ZXVlcworCVFVRVVFX0hFQURFUiAgICAgICAgICAgIFR4U3dRdWV1ZVtOVU1fT0ZfVFhfUklOR107ICAvLyA0IEFDICsgMSBIQ0NBCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgVHhTd1F1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CS8vIFR4U3dRdWV1ZSBzcGlubG9jaworCisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgTWdtdERlc2NSaW5nOyAgICAgICAgICAgICAgIAkvLyBTaGFyZWQgbWVtb3J5IGZvciBNR01UIGRlc2NyaXB0b3JzCisJUlRNUF9NR01UX1JJTkcgICAgICAgICAgTWdtdFJpbmc7CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWdtdFJpbmdMb2NrOyAgICAgICAgICAgICAgIAkvLyBQcmlvIFJpbmcgc3BpbmxvY2sKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFJ4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFJUMjg2MAorCVJUTVBfUlhfUklORyAgICAgICAgICAgIFJ4UmluZzsKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBSeFJpbmdMb2NrOyAgICAgICAgICAgICAgICAgLy8gUnggUmluZyBzcGlubG9jaworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBBU0lDIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCVVJTlQzMiAgICAgICAgICAgICAgIAlNQUNWZXJzaW9uOyAgICAgIAkvLyBNQUMgdmVyc2lvbi4gUmVjb3JkIHJ0Mjg2MEMoMHgyODYwMDEwMCkgb3IgcnQyODYwRCAoMHgyODYwMDEwMSkuLgorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gRTJQUk9NCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUxPTkcgICAgICAgICAgICAgICAgICAgRWVwcm9tVmVyc2lvbjsgICAgICAgICAgLy8gYnl0ZSAwOiB2ZXJzaW9uLCBieXRlIDE6IHJldmlzaW9uLCBieXRlIDJ+MzogdW51c2VkCisJVUNIQVIgICAgICAgICAgICAgICAgICAgRUVQUk9NQWRkcmVzc051bTsgICAgICAgLy8gOTNjNDY9NiAgOTNjNjY9OAorCVVTSE9SVCAgICAgICAgICAgICAgICAgIEVFUFJPTURlZmF1bHRWYWx1ZVtOVU1fRUVQUk9NX0JCUF9QQVJNU107CisJVUxPTkcgICAgICAgICAgICAgICAgICAgRmlybXdhcmVWZXJzaW9uOyAgICAgICAgLy8gYnl0ZSAwOiBNaW5vciB2ZXJzaW9uLCBieXRlIDE6IE1ham9yIHZlcnNpb24sIG90aGVyd2lzZSB1bnVzZWQuCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBCQlAgQ29udHJvbAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVDSEFSICAgICAgICAgICAgICAgICAgIEJicFdyaXRlTGF0Y2hbMTQwXTsgICAgIC8vIHJlY29yZCBsYXN0IEJCUCByZWdpc3RlciB2YWx1ZSB3cml0dGVuIHZpYSBCQlBfSU9fV1JJVEUvQkJQX0lPX1dSSVRFX1ZZX1JFR19JRAorCVVDSEFSICAgICAgICAgICAgICAgICAgIEJicFJzc2lUb0RibURlbHRhOworCUJCUF9SNjZfVFVOSU5HICAgICAgICAgIEJicFR1bmluZzsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBSRklDIGNvbnRyb2wKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUmZJY1R5cGU7ICAgICAgIC8vIFJGSUNfeHh4CisJVUxPTkcgICAgICAgICAgICAgICAgICAgUmZGcmVxT2Zmc2V0OyAgIC8vIEZyZXF1ZW5jeSBvZmZzZXQgZm9yIGNoYW5uZWwgc3dpdGNoaW5nCisJUlRNUF9SRl9SRUdTICAgICAgICAgICAgTGF0Y2hSZlJlZ3M7ICAgIC8vIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRAorCisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgICAgQW50ZW5uYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgQU50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKworCS8vIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQKKwkvLyBSWCBBbnRlbm5hID0gRElWRVJTSVRZIE9OCisJU09GVF9SWF9BTlRfRElWRVJTSVRZICAgUnhBbnQ7CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBSRlByb2dTZXE7CisJQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgVHhQb3dlcltNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAgICAgLy8gU3RvcmUgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscy4KKwlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisJQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgVHhQb3dlcjExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAgICAgLy8gODAyLjExaiBjaGFubmVsIGFuZCBidworCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIENoYW5uZWxMaXN0MTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKKworCVVDSEFSICAgICAgICAgICAgICAgICAgIENoYW5uZWxMaXN0TnVtOyAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KKwlVQ0hBUgkJCQkJQmJwOTQ7CisJQk9PTEVBTgkJCQkJQmJwRm9yQ0NLOworCVVMT05HCQlUeDIwTVB3ckNmZ0FCYW5kWzVdOworCVVMT05HCQlUeDIwTVB3ckNmZ0dCYW5kWzVdOworCVVMT05HCQlUeDQwTVB3ckNmZ0FCYW5kWzVdOworCVVMT05HCQlUeDQwTVB3ckNmZ0dCYW5kWzVdOworCisJQk9PTEVBTiAgICAgYkF1dG9UeEFnY0E7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAorCVVDSEFSCSAgICBUc3NpUmVmQTsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgorCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCisJVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCisJVUNIQVIJICAgIFR4QWdjU3RlcEE7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQorCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUE7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKKworCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NHOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKKwlVQ0hBUgkgICAgVHNzaVJlZkc7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KKwlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUeEFnY1N0ZXBHOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKKwlDSEFSCQlUeEFnY0NvbXBlbnNhdGVHOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCisKKwkvLysrK0ZvciBSVDI4NzAsIHRoZSBwYXJhbWV0ZXJlcyBpcyBzdGFydCBmcm9tIEJHUnNzaU9mZnNldDEgfiBCR1Jzc2lPZmZzZXQzCisJQ0hBUgkJQkdSc3NpT2Zmc2V0MDsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMCBPZmZzZXQgdmFsdWUgb24gRUVQUk9NIDB4NDZoCisJQ0hBUgkJQkdSc3NpT2Zmc2V0MTsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMSBPZmZzZXQgdmFsdWUKKwlDSEFSCQlCR1Jzc2lPZmZzZXQyOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMyIE9mZnNldCB2YWx1ZQorCS8vLS0tCisKKwkvLysrK0ZvciBSVDI4NzAsIHRoZSBwYXJhbWV0ZXJlcyBpcyBzdGFydCBmcm9tIEFSc3NpT2Zmc2V0MSB+IEFSc3NpT2Zmc2V0MworCUNIQVIJCUFSc3NpT2Zmc2V0MDsJCQkJLy8gU3RvcmUgQSBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDRBaAorCUNIQVIJCUFSc3NpT2Zmc2V0MTsJCQkJLy8gU3RvcmUgQSBSU1NJIzEgT2Zmc2V0IHZhbHVlCisJQ0hBUgkJQVJzc2lPZmZzZXQyOwkJCQkvLyBTdG9yZSBBIFJTU0kjMiBPZmZzZXQgdmFsdWUKKwkvLy0tLQorCisJQ0hBUgkJQkxOQUdhaW47CQkJCQkvLyBTdG9yZSBCL0cgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgb24gRUVQUk9NIDB4NDRoCisJQ0hBUgkJQUxOQUdhaW4wOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMCB2YWx1ZSBmb3IgY2gzNn42NAorCUNIQVIJCUFMTkFHYWluMTsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzEgdmFsdWUgZm9yIGNoMTAwfjEyOAorCUNIQVIJCUFMTkFHYWluMjsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzIgdmFsdWUgZm9yIGNoMTMyfjE2NQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIExFRCBjb250cm9sCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU1DVV9MRURDU19TVFJVQwkJTGVkQ250bDsKKwlVU0hPUlQJCQkJTGVkMTsJLy8gcmVhZCBmcm9tIEVFUFJPTSAweDNjCisJVVNIT1JUCQkJCUxlZDI7CS8vIEVFUFJPTSAweDNlCisJVVNIT1JUCQkJCUxlZDM7CS8vIEVFUFJPTSAweDQwCisJVUNIQVIJCQkJTGVkSW5kaWNhdG9yU3RyZWd0aDsKKwlVQ0hBUgkJCQlSc3NpU2luZ2Fsc3RyZW5ndGhPZmZldDsKKyAgICBCT09MRUFOCQkJCWJMZWRPblNjYW5uaW5nOworCVVDSEFSCQkJCUxlZFN0YXR1czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICA4MDIuMTEgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8vIG91dGdvaW5nIEJFQUNPTiBmcmFtZSBidWZmZXIgYW5kIGNvcnJlc3BvbmRpbmcgVFhECisJVFhXSV9TVFJVQyAgICAgICAgICAgICAgCUJlYWNvblR4V0k7CisJUFVDSEFSCQkJCQkJQmVhY29uQnVmOworCVVTSE9SVAkJCQkJCUJlYWNvbk9mZnNldFtIV19CRUFDT05fTUFYX0NPVU5UXTsKKworCS8vIHByZS1idWlsZCBQUy1QT0xMIGFuZCBOVUxMIGZyYW1lIHVwb24gbGluayB1cC4gZm9yIGVmZmljaWVuY3kgcHVycG9zZS4KKwlQU1BPTExfRlJBTUUgICAgICAgICAgICAJUHNQb2xsRnJhbWU7CisJSEVBREVSXzgwMl8xMSAgICAgICAgICAgCU51bGxGcmFtZTsKKworLy89PT09PT09PT1BUD09PT09PT09PT09CisKKworLy89PT09PT09U1RBPT09PT09PT09PT0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICYgb3BlcmF0aW9uIHN0YXR1cworCS8vIHVzZWQgb25seSB3aGVuIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVNUQV9BRE1JTl9DT05GSUcgICAgICAgIFN0YUNmZzsgICAgICAgICAgIC8vIHVzZXIgZGVzaXJlZCBzZXR0aW5ncworCVNUQV9BQ1RJVkVfQ09ORklHICAgICAgIFN0YUFjdGl2ZTsgICAgICAgICAvLyB2YWxpZCBvbmx5IHdoZW4gQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpCisJQ0hBUiAgICAgICAgICAgICAgICAgICAgbmlja25hbWVbSVdfRVNTSURfTUFYX1NJWkUrMV07IC8vIG5pY2tuYW1lLCBvbmx5IHVzZWQgaW4gdGhlIGl3Y29uZmlnIGkvZgorCU5ESVNfTUVESUFfU1RBVEUgICAgICAgIFByZU1lZGlhU3RhdGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vPT09PT09PUNvbW1vbj09PT09PT09PT09CisJLy8gT1AgbW9kZTogZWl0aGVyIEFQIG9yIFNUQQorCVVDSEFSICAgICAgICAgICAgICAgICAgIE9wTW9kZTsgICAgICAgICAgICAgICAgICAgICAvLyBPUE1PREVfU1RBLCBPUE1PREVfQVAKKworCU5ESVNfTUVESUFfU1RBVEUgICAgICAgIEluZGljYXRlTWVkaWFTdGF0ZTsJCQkvLyBCYXNlIG9uIEluZGljYXRpb24gc3RhdGUsIGRlZmF1bHQgaXMgTmRpc01lZGlhU3RhdGVEaXNDb25uZWN0ZWQKKworCS8vIE1BVCByZWxhdGVkIHBhcmFtZXRlcnMKKworCS8vIGNvbmZpZ3VyYXRpb246IHJlYWQgZnJvbSBSZWdpc3RyeSAmIEUyUFJPTQorCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJMb2NhbEFkbWluTUFDOyAgICAgICAgICAgICAvLyBVc2UgdXNlciBjaGFuZ2VkIE1BQworCVVDSEFSICAgICAgICAgICAgICAgICAgIFBlcm1hbmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsgICAgLy8gRmFjdG9yeSBkZWZhdWx0IE1BQyBhZGRyZXNzCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ3VycmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsgICAgICAvLyBVc2VyIGNoYW5nZWQgTUFDIGFkZHJlc3MKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNvbW1vbiBjb25maWd1cmF0aW9uIHRvIGJvdGggT1BNT0RFX1NUQSBhbmQgT1BNT0RFX0FQCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQ09NTU9OX0NPTkZJRyAgICAgICAgICAgQ29tbW9uQ2ZnOworCU1MTUVfU1RSVUNUICAgICAgICAgICAgIE1sbWU7CisKKwkvLyBBUCBuZWVkcyB0aG9zZSB2YWlhYmxlcyBmb3Igc2l0ZSBzdXJ2ZXkgZmVhdHVyZS4KKwlNTE1FX0FVWCAgICAgICAgICAgICAgICBNbG1lQXV4OyAgICAgICAgICAgLy8gdGVtcG9yYXJ5IHNldHRpbmdzIHVzZWQgZHVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZQorCUJTU19UQUJMRSAgICAgICAgICAgICAgIFNjYW5UYWI7ICAgICAgICAgICAvLyBzdG9yZSB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0CisKKwkvL0Fib3V0IE1hY1RhYiwgdGhlIHN0YSBkcml2ZXIgd2lsbCB1c2UgIzAgYW5kICMxIGZvciBtdWx0aWNhc3QgYW5kIEFQLgorCU1BQ19UQUJMRSAgICAgICAgICAgICAgICAgTWFjVGFiOyAgICAgLy8gQVNJQyBvbi1jaGlwIFdDSUQgZW50cnkgdGFibGUuICBBdCBUWCwgQVNJQyBhbHdheXMgdXNlIGtleSBhY2NvcmRpbmcgdG8gdGhpcyBvbi1jaGlwIHRhYmxlLgorCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1hY1RhYkxvY2s7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQV9UQUJMRQkJCUJBVGFibGU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgQkFUYWJMb2NrOworCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKKworCS8vIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBLRVkgdGFibGVzCisJQ0lQSEVSX0tFWSAgICAgICAgICAgICAgU2hhcmVkS2V5W01BWF9NQlNTSURfTlVNXVs0XTsgLy8gU1RBIGFsd2F5cyB1c2UgU2hhcmVkS2V5W0JTUzBdWzAuLjNdCisKKwkJLy8gUlggcmUtYXNzZW1ibHkgYnVmZmVyIGZvciBmcmFnbWVudGF0aW9uCisJRlJBR01FTlRfRlJBTUUgICAgICAgICAgRnJhZ0ZyYW1lOyAgICAgICAgICAgICAgICAgIC8vIEZyYW1lIHN0b3JhZ2UgZm9yIGZyYWdtZW50IGZyYW1lCisKKwkvLyB2YXJpb3VzIENvdW50ZXJzCisJQ09VTlRFUl84MDJfMyAgICAgICAgICAgQ291bnRlcnM4MDIzOyAgICAgICAgICAgICAgIC8vIDgwMi4zIGNvdW50ZXJzCisJQ09VTlRFUl84MDJfMTEgICAgICAgICAgV2xhbkNvdW50ZXJzOyAgICAgICAgICAgICAgIC8vIDgwMi4xMSBNSUIgY291bnRlcnMKKwlDT1VOVEVSX1JBTElOSyAgICAgICAgICBSYWxpbmtDb3VudGVyczsgICAgICAgICAgICAgLy8gUmFsaW5rIHByb3ByaWV0eSBjb3VudGVycworCUNPVU5URVJfRFJTICAgICAgICAgICAgIERyc0NvdW50ZXJzOyAgICAgICAgICAgICAgICAvLyBjb3VudGVycyBmb3IgRHluYW1pYyBUWCBSYXRlIFN3aXRjaGluZworCVBSSVZBVEVfU1RSVUMgICAgICAgICAgIFByaXZhdGVJbmZvOyAgICAgICAgICAgICAgICAvLyBQcml2YXRlIGluZm9ybWF0aW9uICYgY291bnRlcnMKKworCS8vIGZsYWdzLCBzZWUgZlJUTVBfQURBUFRFUl94eHggZmxhZ3MKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50IGN1cnJlbnQgZGV2aWNlIHN0YXR1cworCisJLy8gY3VycmVudCBUWCBzZXF1ZW5jZSAjCisJVVNIT1JUICAgICAgICAgICAgICAgICAgU2VxdWVuY2U7CisKKyNpZmRlZiBVTkRFUl9DRQorCU5ESVNfSEFORExFICAgICAgICAgICAgIGhHaUlTUjsKKyNlbmRpZgorCisKKwkvLyBDb250cm9sIGRpc2Nvbm5lY3QgLyBjb25uZWN0IGV2ZW50IGdlbmVyYXRpb24KKwkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMaW5rRG93blRpbWU7CisJLy8tLS0KKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0UnhSYXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RUeFJhdGU7CisJLy8rKytVc2VkIG9ubHkgZm9yIFN0YXRpb24KKwlCT09MRUFOICAgICAgICAgICAgICAgICBiQ29uZmlnQ2hhbmdlZDsgICAgICAgICAvLyBDb25maWcgQ2hhbmdlIGZsYWcgZm9yIHRoZSBzYW1lIFNTSUQgc2V0dGluZworCS8vLS0tCisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBFeHRyYUluZm87ICAgICAgICAgICAgICAvLyBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBTeXN0ZW1FcnJvckJpdG1hcDsgICAgICAvLyBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IKKworCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQorCVVMT05HICAgICAgICAgICAgICAgICAgIE1hY0ljVmVyc2lvbjsgICAgICAgICAgIC8vIE1BQy9CQlAgc2VyaWFsIGludGVyZmFjZSBpc3N1ZSBzb2x2ZWQgYWZ0ZXIgdmVyLkQKKwkvLy0tLQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU3lzdGVtIGV2ZW50IGxvZworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVJUXzgwMl8xMV9FVkVOVF9UQUJMRSAgIEV2ZW50VGFiOworCisKKwlCT09MRUFOCQlIVENFbmFibGU7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogICAgICBTdGF0aXN0aWMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCUJPT0xFQU4JCQkJCQliVXBkYXRlQmNuQ250RG9uZTsKKwlVTE9ORwkJCQkJCXdhdGNoRG9nTWFjRGVhZGxvY2s7CS8vIHByZXZlbnQgTUFDL0JCUCBpbnRvIGRlYWRsb2NrIGNvbmRpdGlvbgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBERUJVRyBwYXJhbWVydHMKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQk9PTEVBTgkJYkJhbkFsbEJhU2V0dXA7CisJQk9PTEVBTgkJYlByb21pc2N1b3VzOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIHJ0Mjg2MGMgZW11bGF0aW9uLXVzZSBQYXJhbWV0ZXJzCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVMT05HCQlydHNhY2N1WzMwXTsKKwlVTE9ORwkJY3RzYWNjdVszMF07CisJVUxPTkcJCWNmZW5kYWNjdVszMF07CisJVUxPTkcJCWJhY29udGVudFsxNl07CisJVUxPTkcJCXJ4aW50W1JYX1JJTkdfU0laRSsxXTsKKwlVQ0hBUgkJcmN2YmFbNjBdOworCUJPT0xFQU4JCWJMaW5rQWRhcHQ7CisJQk9PTEVBTgkJYkZvcmNlUHJpbnRUWDsKKwlCT09MRUFOCQliRm9yY2VQcmludFJYOworCUJPT0xFQU4JCWJEaXNhYmxlc2Nhbm5pbmc7CQkvL2RlZmluZWQgaW4gUlQyODcwIFVTQgorCUJPT0xFQU4JCWJTdGFGaWZvVGVzdDsKKwlCT09MRUFOCQliUHJvdGVjdGlvblRlc3Q7CisJQk9PTEVBTgkJYkhDQ0FUZXN0OworCUJPT0xFQU4JCWJHZW5PbmVIQ0NBOworCUJPT0xFQU4JCWJCcm9hZENvbUhUOworCS8vKysrRm9sbG93aW5nIGFkZCBmcm9tIFJUMjg3MCBVU0IuCisJVUxPTkcJCUJ1bGtPdXRSZXE7CisJVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZTsKKwlVTE9ORwkJQnVsa091dENvbXBsZXRlT3RoZXI7CisJVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZUNhbmNlbDsJLy8gc2VlbXMgbm90IHVzZSBub3c/CisJVUxPTkcJCUJ1bGtJblJlcTsKKwlVTE9ORwkJQnVsa0luQ29tcGxldGU7CisJVUxPTkcJCUJ1bGtJbkNvbXBsZXRlRmFpbDsKKwkvLy0tLQorCisgICAgc3RydWN0IHdpZmljb25mCQkJV0lGSXRlc3RiZWQ7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJQVRFX0lORk8JCQkJYXRlOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXN0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbCBtcGR1X2Jsa19wb29sOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJVUxPTkcJCQkJCU9uZVNlY29uZG5vbkJFcGFja2V0czsJCS8vIHJlY29yZCBub24gQkUgcGFja2V0cyBwZXIgc2Vjb25kCisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKyAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICBpd19zdGF0czsKKyNlbmRpZgorCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwlCTE9DS19RVUVVRV9FTlRSWQkJYmxvY2tRdWV1ZVRhYltOVU1fT0ZfVFhfUklOR107CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisKKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJSU5UMzIJCQkJCU1DX1Jvd0lEOworCVVDSEFSCQkJCQlNQ19GaWxlTmFtZVsyNTZdOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisJVUxPTkcJCQkJCVRidHRUaWNrQ291bnQ7CisjaWZkZWYgUENJX01TSV9TVVBQT1JUCisJQk9PTEVBTgkJCQkJSGF2ZU1zaTsKKyNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KKworCisJVUNIQVIJCQkJCWlzX29uOworCisjZGVmaW5lIFRJTUVfQkFTRQkJCSgxMDAwMDAwL09TX0haKQorI2RlZmluZSBUSU1FX09ORV9TRUNPTkQJCSgxMDAwMDAwL1RJTUVfQkFTRSkKKwlVQ0hBUgkJCQkJZmxnX2JlX2FkanVzdDsKKwlVTE9ORwkJCQkJYmVfYWRqdXN0X2xhc3RfdGltZTsKKworI2lmZGVmIE5JTlRFTkRPX0FQCisJTklORE9fQ1RSTF9CTE9DSwkJbmluZG9fY3RybF9ibG9jazsKKyNlbmRpZiAvLyBOSU5URU5ET19BUCAvLworCisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJc3RydWN0IElLQU5PU19UWF9JTkZPCUlrYW5vc1R4SW5mbzsKKwlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8JSWthbm9zUnhJbmZvW01BWF9NQlNTSURfTlVNICsgTUFYX1dEU19FTlRSWSArIE1BWF9BUENMSV9OVU0gKyBNQVhfTUVTSF9OVU1dOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJUnRtcERpYWdTdHJ1Y3QJRGlhZ1N0cnVjdDsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCisJVUlOVDgJCQkJCVBNX0ZsZ1N1c3BlbmQ7Cit9IFJUTVBfQURBUFRFUiwgKlBSVE1QX0FEQVBURVI7CisKKy8vCisvLyBDaXNjbyBJQVBQIGZvcm1hdAorLy8KK3R5cGVkZWYgc3RydWN0ICBfQ0lTQ09fSUFQUF9DT05URU5UXworeworCVVTSE9SVCAgICAgTGVuZ3RoOyAgICAgICAgLy9JQVBQIExlbmd0aAorCVVDSEFSICAgICAgTWVzc2FnZVR5cGU7ICAgICAgLy9JQVBQIHR5cGUKKwlVQ0hBUiAgICAgIEZ1bmN0aW9uQ29kZTsgICAgIC8vSUFQUCBmdW5jdGlvbiB0eXBlCisJVUNIQVIgICAgICBEZXN0aW5haW9uTUFDW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICBTb3VyY2VNQUNbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgIFRhZzsgICAgICAgICAgIC8vVGFnKGVsZW1lbnQgSUUpIC0gQWRqYWNlbnQgQVAgcmVwb3J0CisJVVNIT1JUICAgICBUYWdMZW5ndGg7ICAgICAvL0xlbmd0aCBvZiBlbGVtZW50IG5vdCBpbmNsdWRpbmcgNCBieXRlIGhlYWRlcgorCVVDSEFSICAgICAgT1VJWzRdOyAgICAgICAgICAgLy8weDAwLCAweDQwLCAweDk2LCAweDAwCisJVUNIQVIgICAgICBQcmV2aW91c0FQW01BQ19BRERSX0xFTl07ICAgICAgIC8vTUFDIEFkZHJlc3Mgb2YgYWNjZXNzIHBvaW50CisJVVNIT1JUICAgICBDaGFubmVsOworCVVTSE9SVCAgICAgU3NpZExlbjsKKwlVQ0hBUiAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVU0hPUlQgICAgIFNlY29uZHM7ICAgICAgICAgIC8vU2Vjb25kcyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4gZGlzYXNzb2NpYXRlZC4KK30gQ0lTQ09fSUFQUF9DT05URU5ULCAqUENJU0NPX0lBUFBfQ09OVEVOVDsKKworI2RlZmluZSBERUxBWUlOVE1BU0sJCTB4MDAwM2ZmZmIKKyNkZWZpbmUgSU5UTUFTSwkJCQkweDAwMDNmZmZiCisjZGVmaW5lIEluZE1hc2sJCQkJMHgwMDAzZmZmYworI2RlZmluZSBSeElOVAkJCQkweDAwMDAwMDA1CS8vIERlbGF5ZWQgUnggb3IgaW5kaXZpIHJ4CisjZGVmaW5lIFR4RGF0YUludAkJCTB4MDAwMDAwZmEJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKKyNkZWZpbmUgVHhNZ210SW50CQkJMHgwMDAwMDEwMgkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAorI2RlZmluZSBUeENvaGVyZW50CQkJMHgwMDAyMDAwMAkvLyB0eCBjb2hlcmVudAorI2RlZmluZSBSeENvaGVyZW50CQkJMHgwMDAxMDAwMAkvLyByeCBjb2hlcmVudAorI2RlZmluZSBNY3VDb21tYW5kCQkJMHgwMDAwMDIwMAkvLyBtY3UKKyNkZWZpbmUgUHJlVEJUVEludAkJCTB4MDAwMDEwMDAJLy8gUHJlLVRCVFQgaW50ZXJydXB0CisjZGVmaW5lIFRCVFRJbnQJCQkJMHgwMDAwMDgwMAkJLy8gVEJUVCBpbnRlcnJ1cHQKKyNkZWZpbmUgR1BUaW1lT3V0SW50CQkJMHgwMDAwODAwMAkJLy8gR1B0aW1lb3V0IGludGVycnVwdAorI2RlZmluZSBBdXRvV2FrZXVwSW50CQkweDAwMDA0MDAwCQkvLyBBdXRvV2FrZXVwSW50IGludGVycnVwdAorI2RlZmluZSBGaWZvU3RhRnVsbEludAkJCTB4MDAwMDIwMDAJLy8gIGZpZm8gc3RhdGlzdGljcyBmdWxsIGludGVycnVwdAorCisKK3R5cGVkZWYgc3RydWN0IF9SWF9CTEtfCit7CisJUlQyOFhYX1JYRF9TVFJVQwlSeEQ7CisJUFJYV0lfU1RSVUMJCQlwUnhXSTsKKwlQSEVBREVSXzgwMl8xMQkJcEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJCXBSeFBhY2tldDsKKwlVQ0hBUgkJCQkqcERhdGE7CisJVVNIT1JUCQkJCURhdGFTaXplOworCVVTSE9SVAkJCQlGbGFnczsKKwlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CS8vIGZvciBjYWxjdWxhdGUgVEtJUCBNSUMgdXNpbmcKK30gUlhfQkxLOworCisKKyNkZWZpbmUgUlhfQkxLX1NFVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkJKF9wUnhCbGstPkZsYWdzIHw9IF9mbGFnKQorI2RlZmluZSBSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJiBfZmxhZykKKyNkZWZpbmUgUlhfQkxLX0NMRUFSX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCShfcFJ4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKKworCisjZGVmaW5lIGZSWF9XRFMJCQkweDAwMDEKKyNkZWZpbmUgZlJYX0FNU0RVICAgICAgIDB4MDAwMgorI2RlZmluZSBmUlhfQVJBTElOSyAgICAgMHgwMDA0CisjZGVmaW5lIGZSWF9IVEMgICAgICAgICAweDAwMDgKKyNkZWZpbmUgZlJYX1BBRCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBmUlhfQU1QRFUgICAgICAgMHgwMDIwCisjZGVmaW5lIGZSWF9RT1MJCQkweDAwNDAKKyNkZWZpbmUgZlJYX0lORlJBCQkweDAwODAKKyNkZWZpbmUgZlJYX0VBUAkJCTB4MDEwMAorI2RlZmluZSBmUlhfTUVTSAkJMHgwMjAwCisjZGVmaW5lIGZSWF9BUENMSQkJMHgwNDAwCisjZGVmaW5lIGZSWF9ETFMJCQkweDA4MDAKKyNkZWZpbmUgZlJYX1dQSQkJCTB4MTAwMAorCisjZGVmaW5lIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQJMTQKKyNkZWZpbmUgTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFECTE0CisjZGVmaW5lIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRAkgMgorCisjZGVmaW5lIFRYX1VOS09XTl9GUkFNRQkJCTB4MDAKKyNkZWZpbmUgVFhfTUNBU1RfRlJBTUUJCQkweDAxCisjZGVmaW5lIFRYX0xFR0FDWV9GUkFNRQkJCTB4MDIKKyNkZWZpbmUgVFhfQU1QRFVfRlJBTUUJCQkweDA0CisjZGVmaW5lIFRYX0FNU0RVX0ZSQU1FCQkJMHgwOAorI2RlZmluZSBUWF9SQUxJTktfRlJBTUUJCQkweDEwCisjZGVmaW5lIFRYX0ZSQUdfRlJBTUUJCQkweDIwCisKKworLy8JQ3VycmVudGx5IHRoZSBzaXplb2YoVFhfQkxLKSBpcyAxNDggYnl0ZXMuCit0eXBlZGVmIHN0cnVjdCBfVFhfQkxLXworeworCVVDSEFSCQkJCVF1ZUlkeDsKKwlVQ0hBUgkJCQlUeEZyYW1lVHlwZTsJCQkJLy8gSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaAorCVVDSEFSCQkJCVRvdGFsRnJhbWVOdW07CQkJCS8vIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaAorCVVTSE9SVAkJCQlUb3RhbEZyYWdOdW07CQkJCS8vIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2gKKwlVU0hPUlQJCQkJVG90YWxGcmFtZUxlbjsJCQkJLy8gVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKKworCVFVRVVFX0hFQURFUgkJVHhQYWNrZXRMaXN0OworCU1BQ19UQUJMRV9FTlRSWQkJKnBNYWNFbnRyeTsJCQkJCS8vIE5VTEw6IHBhY2tldCB3aXRoIDgwMi4xMSBSQSBmaWVsZCBpcyBtdWx0aWNhc3QvYnJvYWRjYXN0IGFkZHJlc3MKKwlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKKworCS8vIEZvbGxvd2luZyBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNwZWNpZmljIHBhY2tldC4KKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7CisJUFVDSEFSCQkJCXBTcmNCdWZIZWFkZXI7CQkJCS8vIFJlZmVyZW5jZSB0byB0aGUgaGVhZCBvZiBza19idWZmLT5kYXRhCisJUFVDSEFSCQkJCXBTcmNCdWZEYXRhOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlZCBkZXBlbmRzIG9uIGhhbmxkaW5nIHByb2dyZXNzcworCVVJTlQJCQkJU3JjQnVmTGVuOwkJCQkJLy8gTGVuZ3RoIG9mIHBhY2tldCBwYXlsb2FkIHdoaWNoIG5vdCBpbmNsdWRpbmcgTGF5ZXIgMiBoZWFkZXIKKwlQVUNIQVIJCQkJcEV4dHJhTGxjU25hcEVuY2FwOwkJCS8vIE5VTEwgbWVhbnMgbm8gZXh0cmEgTExDL1NOQVAgaXMgcmVxdWlyZWQKKwlVQ0hBUgkJCQlIZWFkZXJCdWZbODBdOwkJCQkvLyBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQCisJVUNIQVIJCQkJTXBkdUhlYWRlckxlbjsJCQkJLy8gODAyLjExIGhlYWRlciBsZW5ndGggTk9UIGluY2x1ZGluZyB0aGUgcGFkZGluZworCVVDSEFSCQkJCUhkclBhZExlbjsJCQkJCS8vIHJlY29yZGluZyBIZWFkZXIgUGFkZGluZyBMZW5ndGg7CisJVUNIQVIJCQkJYXBpZHg7CQkJCQkJLy8gVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJV2NpZDsJCQkJCQkvLyBUaGUgTUFDIGVudHJ5IGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQKKwlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CQkJCS8vIHByaW9yaXR5IGNsYXNzIG9mIHBhY2tldAorCVVDSEFSCQkJCUZyYW1lR2FwOwkJCQkJLy8gd2hhdCBraW5kIG9mIElGUyB0aGlzIHBhY2tldCB1c2UKKwlVQ0hBUgkJCQlNcGR1UmVxTnVtOwkJCQkJLy8gbnVtYmVyIG9mIGZyYWdtZW50cyBvZiB0aGlzIGZyYW1lCisJVUNIQVIJCQkJVHhSYXRlOwkJCQkJCS8vIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/CisJVUNIQVIJCQkJQ2lwaGVyQWxnOwkJCQkJLy8gY2lwaGVyIGFsb2dyaXRobQorCVBDSVBIRVJfS0VZCQkJcEtleTsKKworCisKKwlVU0hPUlQJCQkJRmxhZ3M7CQkJCQkJLy9TZWUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBkZXRhaWwuCisKKwkvL1lPVSBTSE9VTEQgTk9UIFRPVUNIIElUISBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3IgaGFyZHdhcmUtZGVwZW5kZWQgbGF5ZXIuCisJVUxPTkcJCQkJUHJpdjsJCQkJCQkvLyBIYXJkd2FyZSBzcGVjaWZpYyB2YWx1ZSBzYXZlZCBpbiBoZXJlLgorfSBUWF9CTEssICpQVFhfQkxLOworCisKKyNkZWZpbmUgZlRYX2JSdHNSZXF1aXJlZAkJMHgwMDAxCS8vIEluZGljYXRlIGlmIG5lZWQgc2VuZCBSVFMgZnJhbWUgZm9yIHByb3RlY3Rpb24uIE5vdCB1c2VkIGluIFJUMjg2MC9SVDI4NzAuCisjZGVmaW5lIGZUWF9iQWNrUmVxdWlyZWQgICAgICAgCTB4MDAwMgkvLyB0aGUgcGFja2V0IG5lZWQgYWNrIHJlc3BvbnNlCisjZGVmaW5lIGZUWF9iUGlnZ3lCYWNrICAgICAJCTB4MDAwNAkvLyBMZWdhY3kgZGV2aWNlIHVzZSBQaWdnYmFjayBvciBub3QKKyNkZWZpbmUgZlRYX2JIVFJhdGUgICAgICAgICAJMHgwMDA4CS8vIGFsbG93IHRvIHVzZSBIVCByYXRlCisjZGVmaW5lIGZUWF9iRm9yY2VOb25Rb1MgICAgICAgCTB4MDAxMAkvLyBmb3JjZSB0byB0cmFuc21pdCBmcmFtZSB3aXRob3V0IFdNTS1Rb1MgaW4gSFQgbW9kZQorI2RlZmluZSBmVFhfYkFsbG93RnJhZyAgICAgICAJMHgwMDIwCS8vIGFsbG93IHRvIGZyYWdtZW50IHRoZSBwYWNrZXQsIEEtTVBEVSwgQS1NU0RVLCBBLVJhbGluayBpcyBub3QgYWxsb3dlZCB0byBmcmFnbWVudAorI2RlZmluZSBmVFhfYk1vcmVEYXRhCQkJMHgwMDQwCS8vIHRoZXJlIGFyZSBtb3JlIGRhdGEgcGFja2V0cyBpbiBQb3dlclNhdmUgUXVldWUKKyNkZWZpbmUgZlRYX2JXTU0JCQkJMHgwMDgwCS8vIFFPUyBEYXRhCisKKyNkZWZpbmUgZlRYX2JDbGVhckVBUEZyYW1lCQkweDAxMDAKKworI2RlZmluZSBUWF9CTEtfQVNTSUdOX0ZMQUcoX3BUeEJsaywgX2ZsYWcsIHZhbHVlKQlcCisJCWRvIHsJCQkJCQkJCQkJXAorCQkJaWYgKHZhbHVlKSAJCQkJCQkJCVwKKwkJCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpIAkJCVwKKwkJCWVsc2UgCQkJCQkJCQkJXAorCQkJCShfcFR4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkJCVwKKwkJfXdoaWxlKDApCisKKyNkZWZpbmUgVFhfQkxLX1NFVF9GTEFHKF9wVHhCbGssIF9mbGFnKQkJKF9wVHhCbGstPkZsYWdzIHw9IF9mbGFnKQorI2RlZmluZSBUWF9CTEtfVEVTVF9GTEFHKF9wVHhCbGssIF9mbGFnKQkoKChfcFR4QmxrLT5GbGFncyAmIF9mbGFnKSA9PSBfZmxhZykgPyAxIDogMCkKKyNkZWZpbmUgVFhfQkxLX0NMRUFSX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCShfcFR4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKKworCisKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyNpZmRlZiBSVDI4NjAKKy8vCisvLyBFbmFibGUgJiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgdmlhIHdyaXRpbmcgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKy8vIFNpbmNlIGl0IHVzZSBBREFQVEVSIHN0cnVjdHVyZSwgaXQgaGF2ZSB0byBiZSBwdXQgYWZ0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24uCisvLworX19pbmxpbmUgICAgVk9JRCAgICBOSUNEaXNhYmxlSW50ZXJydXB0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgMHgwKTsgICAgIC8vIDA6IGRpc2FibGUKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9JTlRfRU5BLCAweDApOwkgCS8vIDB4NDE4IGlzIGZvciBmaXJtd2FyZSAuIFNXIGRvZXNuJ3QgaGFuZGxlIGhlcmUuCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKK30KKworX19pbmxpbmUgICAgVk9JRCAgICBOSUNFbmFibGVJbnRlcnJ1cHQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisJLy8KKwkvLyBGbGFnICJmT1BfU1RBVFVTX0RPWkUiIE9uLCBtZWFucyBBU0lDIHB1dCB0byBzbGVlcCwgZWxzZSBtZWFucyBBU0lDIFdha2VVcAorCS8vIFRvIHByZXZlbnQgU3lzdGVtIGhhbmcsIHdlIHNob3VsZCBlbmFsYmUgdGhlIGludGVycnVwdCB3aGVuCisJLy8gQVNJQyBpcyBhbHJlYWR5IFdha2UgVXAuCisJLy8KKyAgICAvLyBSVDI2NjEgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2Fubm90IGJlIHJlYWQgYW5kIHdyaXR0ZW4uCisJLy8gUlQyODYwID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuLgorCS8vaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBwQWQtPmludF9lbmFibGVfcmVnIC8qREVMQVlJTlRNQVNLKi8pOyAgICAgLy8gMTplbmFibGUKKwl9CisJLy9lbHNlCisJLy8JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19ET1pFICFcbiIpKTsKKworCS8vUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0lOVF9FTkEsIDB4MDAwMDAwMzApOyAvLyAxIDogZW5hYmxlCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCitzdGF0aWMgaW5saW5lIFZPSUQJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKAorCUlOICBQVUNIQVIJCQlEZXN0LAorIAlJTglQVUNIQVIJCQlTcmMsCisgICAgSU4gIEJPT0xFQU4JCQlEb0VuY3J5cHQsCisJSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSkKK3sKKwlVSU5UMzIgKnAxLCAqcDI7CisKKwlwMSA9ICgoVUlOVDMyICopRGVzdCk7CisJcDIgPSAoKFVJTlQzMiAqKVNyYyk7CisKKwkqcDEgPSAqcDI7CisJKihwMSsyKSA9ICoocDIrMik7CisJKihwMSszKSA9ICoocDIrMyk7CisJKihwMSsxKSA9ICoocDIrMSk7IC8vIFdvcmQgMTsgdGhpcyBtdXN0IGJlIHdyaXR0ZW4gYmFjayBsYXN0Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmRpYW4gY29udmVyc2lvbiBvZiBUeC9SeCBkZXNjcmlwdG9yIC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQkJUG9pbnRlciB0byBUeC9SeCBkZXNjcmlwdG9yCisJCURlc2NyaXB0b3JUeXBlCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgZGVzY3JpcHRvcgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbmxpbmUgVk9JRAlSVE1QV0lFbmRpYW5DaGFuZ2UoCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEZXNjcmlwdG9yVHlwZSkKK3sKKwlpbnQgc2l6ZTsKKwlpbnQgaTsKKworCXNpemUgPSAoKERlc2NyaXB0b3JUeXBlID09IFRZUEVfVFhXSSkgPyBUWFdJX1NJWkUgOiBSWFdJX1NJWkUpOworCisJaWYoRGVzY3JpcHRvclR5cGUgPT0gVFlQRV9UWFdJKQorCXsKKwkJKigoVUlOVDMyICopKHBEYXRhKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKSkpOwkJLy8gQnl0ZSAwfjMKKwkJKigoVUlOVDMyICopKHBEYXRhICsgNCkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSs0KSkpOwkvLyBCeXRlIDR+NworCX0KKwllbHNlCisJeworCQlmb3IoaT0wOyBpIDwgc2l6ZS80IDsgaSsrKQorCQkJKigoKFVJTlQzMiAqKXBEYXRhKSAraSkgPSBTV0FQMzIoKigoKFVJTlQzMiAqKXBEYXRhKStpKSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5kaWFuIGNvbnZlcnNpb24gb2YgVHgvUnggZGVzY3JpcHRvciAuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJCVBvaW50ZXIgdG8gVHgvUnggZGVzY3JpcHRvcgorCQlEZXNjcmlwdG9yVHlwZQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGRlc2NyaXB0b3IKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgUlQyODYwCitzdGF0aWMgaW5saW5lIFZPSUQJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEZXNjcmlwdG9yVHlwZSkKK3sKKwkqKChVSU5UMzIgKikocERhdGEpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEpKSk7CQkvLyBCeXRlIDB+MworCSooKFVJTlQzMiAqKShwRGF0YSArIDgpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGErOCkpKTsJLy8gQnl0ZSA4fjExCisJKigoVUlOVDMyICopKHBEYXRhICsxMikpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSArIDEyKSkpOwkvLyBCeXRlIDEyfjE1CisJKigoVUlOVDMyICopKHBEYXRhICsgNCkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSArIDQpKSk7CQkJCS8vIEJ5dGUgNH43LCB0aGlzIG11c3QgYmUgc3dhcHBlZCBsYXN0Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmRpYW4gY29udmVyc2lvbiBvZiBhbGwga2luZHMgb2YgODAyLjExIGZyYW1lcyAuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJCVBvaW50ZXIgdG8gdGhlIDgwMi4xMSBmcmFtZSBzdHJ1Y3R1cmUKKwkJRGlyIAkJCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKKwkJRnJvbVJ4RG9uZUludAlDYWxsZXIgaXMgZnJvbSBSeERvbmUgaW50ZXJydXB0CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGJ1ZmZlciBkYXRhCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGlubGluZSBWT0lECVJUTVBGcmFtZUVuZGlhbkNoYW5nZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURpciwKKwlJTglCT09MRUFOIAkJRnJvbVJ4RG9uZUludCkKK3sKKwlQSEVBREVSXzgwMl8xMSBwRnJhbWU7CisJUFVDSEFSCXBNYWNIZHI7CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBGcmFtZSBDb250cm9sIGZpZWxkCisJaWYoRGlyID09IERJUl9SRUFEKQorCXsKKwkJKihVU0hPUlQgKilwRGF0YSA9IFNXQVAxNigqKFVTSE9SVCAqKXBEYXRhKTsKKwl9CisKKwlwRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBEYXRhOworCXBNYWNIZHIgPSAoUFVDSEFSKSBwRnJhbWU7CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBEdXJhdGlvbi9JRCBmaWVsZAorCSooVVNIT1JUICopKHBNYWNIZHIgKyAyKSA9IFNXQVAxNigqKFVTSE9SVCAqKShwTWFjSGRyICsgMikpOworCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU2VxdWVuY2UgQ29udHJvbCBmaWVsZAorCSooVVNIT1JUICopKHBNYWNIZHIgKyAyMikgPSBTV0FQMTYoKihVU0hPUlQgKikocE1hY0hkciArIDIyKSk7CisKKwlpZihwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkKKwl7CisJCXN3aXRjaChwRnJhbWUtPkZDLlN1YlR5cGUpCisJCXsKKwkJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIExpc3RlbiBJbnRlcnZhbCBmaWVsZAorCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0FTU09DX1JTUDoKKwkJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU3RhdHVzIENvZGUgZmllbGQKKwkJCQlwTWFjSGRyICs9IDI7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBSUQgZmllbGQKKwkJCQlwTWFjSGRyICs9IDI7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9BVVRIOgorCQkJCS8vIElmIGZyb20gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQgcm91dGluZSwgaXQgaXMgc3RpbGwgYSBlbmNyeXB0IGZvcm1hdC4KKwkJCQkvLyBUaGUgY29udmVydGlvbiBpcyBkZWxheWVkIHRvIFJUTVBIYW5kbGVEZWNyeXB0aW9uRG9uZUludGVycnVwdC4KKwkJCQlpZighRnJvbVJ4RG9uZUludCAmJiBwRnJhbWUtPkZDLldlcCA9PSAxKQorCQkJCQlicmVhazsKKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBdXRoIEFsZyBOby4gZmllbGQKKwkJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEF1dGggU2VxIE5vLiBmaWVsZAorCQkJCQlwTWFjSGRyICs9IDI7CisJCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFN0YXR1cyBDb2RlIGZpZWxkCisJCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQkVBQ09OOgorCQkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBCZWFjb25JbnRlcnZhbCBmaWVsZAorCQkJCXBNYWNIZHIgKz0gKHNpemVvZihIRUFERVJfODAyXzExKSArIFRJTUVTVEFNUF9MRU4pOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihVU0hPUlQpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfREVBVVRIOgorCQkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFJlYXNvbiBjb2RlIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSBpZiggcEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX0RBVEEgKQorCXsKKwl9CisJZWxzZSBpZihwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkKKwl7CisJCXN3aXRjaChwRnJhbWUtPkZDLlN1YlR5cGUpCisJCXsKKwkJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgorCQkJCXsKKwkJCQkJUEZSQU1FX0JBX1JFUSBwQkFSZXEgPSAoUEZSQU1FX0JBX1JFUSlwRnJhbWU7CisJCQkJCSooVVNIT1JUICopKCZwQkFSZXEtPkJBUkNvbnRyb2wpID0gU1dBUDE2KCooVVNIT1JUICopKCZwQkFSZXEtPkJBUkNvbnRyb2wpKTsKKwkJCQkJcEJBUmVxLT5CQVN0YXJ0aW5nU2VxLndvcmQgPSBTV0FQMTYocEJBUmVxLT5CQVN0YXJ0aW5nU2VxLndvcmQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0s6CisJCQkJLy8gRm9yIEJsb2NrIEFjayBwYWNrZXQsIHRoZSBIVF9DT05UUk9MIGZpZWxkIGlzIGluIHRoZSBzYW1lIG9mZnNldCB3aXRoIEFkZHIzCisJCQkJKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjNbMF0pID0gU1dBUDMyKCooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIzWzBdKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9BQ0s6CisJCQkJLy9Gb3IgQUNLIHBhY2tldCwgdGhlIEhUX0NPTlRST0wgZmllbGQgaXMgaW4gdGhlIHNhbWUgb2Zmc2V0IHdpdGggQWRkcjIKKwkJCQkqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyMlswXSk9CVNXQVAzMigqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyMlswXSkpOworCQkJCWJyZWFrOworCQl9CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSW52YWxpZCBGcmFtZSBUeXBlISEhXG4iKSk7CisJfQorCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRnJhbWUgQ29udHJvbAorCWlmKERpciA9PSBESVJfV1JJVEUpCisJeworCQkqKFVTSE9SVCAqKXBEYXRhID0gU1dBUDE2KCooVVNIT1JUICopcERhdGEpOworCX0KK30KKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKworc3RhdGljIGlubGluZSBWT0lEIENvbnZlcnRNdWx0aWNhc3RJUDJNQUMoCisJSU4gUFVDSEFSIHBJcEFkZHIsCisJSU4gUFVDSEFSICpwcE1hY0FkZHIsCisJSU4gVUlOVDE2IFByb3RvVHlwZSkKK3sKKwlpZiAocElwQWRkciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAocHBNYWNBZGRyID09IE5VTEwgfHwgKnBwTWFjQWRkciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKFByb3RvVHlwZSkKKwl7CisJCWNhc2UgRVRIX1BfSVBWNjoKKy8vCQkJbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCQkqKCpwcE1hY0FkZHIpID0gMHgzMzsKKwkJCSooKnBwTWFjQWRkciArIDEpID0gMHgzMzsKKwkJCSooKnBwTWFjQWRkciArIDIpID0gcElwQWRkclsxMl07CisJCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMTNdOworCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzE0XTsKKwkJCSooKnBwTWFjQWRkciArIDUpID0gcElwQWRkclsxNV07CisJCQlicmVhazsKKworCQljYXNlIEVUSF9QX0lQOgorCQlkZWZhdWx0OgorLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwkJCSooKnBwTWFjQWRkcikgPSAweDAxOworCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDAwOworCQkJKigqcHBNYWNBZGRyICsgMikgPSAweDVlOworCQkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzFdICYgMHg3ZjsKKwkJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsyXTsKKwkJCSooKnBwTWFjQWRkciArIDUpID0gcElwQWRkclszXTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworQk9PTEVBTiBSVE1QQ2hlY2tGb3JIYW5nKAorCUlOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CisJKTsKKworVk9JRCAgUlRNUEhhbHQoCisJSU4gIE5ESVNfSEFORExFIE1pbmlwb3J0QWRhcHRlckNvbnRleHQKKwkpOworCisvLworLy8gIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9pbml0LmMKKy8vCitORElTX1NUQVRVUyBSVE1QQWxsb2NBZGFwdGVyQmxvY2soCisJSU4gUFZPSUQJCQloYW5kbGUsCisJT1VUIFBSVE1QX0FEQVBURVIgICAqcHBBZGFwdGVyCisJKTsKKworTkRJU19TVEFUVVMgUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQKKwkpOworCitORElTX1NUQVRVUyBSVE1QRmluZEFkYXB0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE5ESVNfSEFORExFICAgICBXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKKwkpOworCitORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkCisJKTsKKworVk9JRCBSVE1QRnJlZUFkYXB0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQKKwkpOworCitORElTX1NUQVRVUyBOSUNSZWFkUmVnUGFyYW1ldGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIE5ESVNfSEFORExFICAgICAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKTsKKworCitWT0lEIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTglQVUNIQVIJCQkJbWFjX2FkZHIpOworCitWT0lEIE5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOworCitWT0lEIE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBZGFwdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICAgQk9PTEVBTiAgICBiSGFyZFJlc2V0KTsKKworTkRJU19TVEFUVVMgTklDSW5pdGlhbGl6ZUFzaWMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpOworCitWT0lEIE5JQ0lzc3VlUmVzZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBSaW5nQ2xlYW5VcCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJpbmdUeXBlKTsKKworVk9JRCBSeFRlc3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBEYmdTZW5kUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK1ZPSUQgVXNlckNmZ0luaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE5JQ1Jlc2V0RnJvbUVycm9yKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBOSUNFcmFzZUZpcm13YXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworTkRJU19TVEFUVVMgTklDTG9hZEZpcm13YXJlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIE5JQ0NoZWNrRm9ySGFuZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBOSUNVcGRhdGVSYXdDb3VudGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VMT05HCVJUTVBOb3RBbGxaZXJvKAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVVMT05HCUxlbmd0aCk7CisKK1ZPSUQgUlRNUFplcm9NZW1vcnkoCisJSU4gIFBWT0lEICAgcFNyYywKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitVTE9ORyBSVE1QQ29tcGFyZU1lbW9yeSgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEIFJUTVBNb3ZlTWVtb3J5KAorCU9VVCBQVk9JRCAgIHBEZXN0LAorCUlOICBQVk9JRCAgIHBTcmMsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCBBdG9IKAorCWNoYXIJKnNyYywKKwlVQ0hBUgkqZGVzdCwKKwlpbnQJCWRlc3RsZW4pOworCitVQ0hBUiBCdG9IKAorCWNoYXIgY2gpOworCitWT0lEIFJUTVBQYXRjaE1hY0JicEJ1ZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFBhdGNoQ2FyZEJ1cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyKTsKKworVk9JRCBSVE1QUGF0Y2hSYWxpbmtDYXJkQnVzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JVUxPTkcJCQlCdXMpOworCitVTE9ORyBSVE1QUmVhZENCQ29uZmlnKAorCUlOCVVMT05HCUJ1cywKKwlJTglVTE9ORwlTbG90LAorCUlOCVVMT05HCUZ1bmMsCisJSU4JVUxPTkcJT2Zmc2V0KTsKKworVk9JRCBSVE1QV3JpdGVDQkNvbmZpZygKKwlJTglVTE9ORwlCdXMsCisJSU4JVUxPTkcJU2xvdCwKKwlJTglVTE9ORwlGdW5jLAorCUlOCVVMT05HCU9mZnNldCwKKwlJTglVTE9ORwlWYWx1ZSk7CisKK1ZPSUQgUlRNUEluaXRUaW1lcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICAgICAgcEFkLAorCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCisJSU4gIFBWT0lEICAgICAgICAgICAgICAgICAgIHBUaW1lckZ1bmMsCisJSU4JUFZPSUQJCQkJCXBEYXRhLAorCUlOICBCT09MRUFOICAgICAgICAgICAgICAgICBSZXBlYXQpOworCitWT0lEIFJUTVBTZXRUaW1lcigKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCUlOICBVTE9ORyAgICAgICAgICAgICAgICAgICBWYWx1ZSk7CisKKworVk9JRCBSVE1QTW9kVGltZXIoCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVVMT05HCQkJCQlWYWx1ZSk7CisKK1ZPSUQgUlRNUENhbmNlbFRpbWVyKAorCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCisJT1VUIEJPT0xFQU4gICAgICAgICAgICAgICAgICpwQ2FuY2VsbGVkKTsKKworVk9JRCBSVE1QU2V0TEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBVQ0hBUgkJCVN0YXR1cyk7CisKK1ZPSUQgUlRNUFNldFNpZ25hbExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pOworCitWT0lEIFJUTVBFbmFibGVSeFR4KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworLy8KKy8vIHByb3RvdHlwZSBpbiBhY3Rpb24uYworLy8KK1ZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIE1sbWVBRERCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVERUxCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVETFNBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVRT1NBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQWRkQkFSc3BBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGVsQkFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBTZW5kUFNNUEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCVdjaWQsCisJSU4gVUNIQVIJCQlQc21wKTsKKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBTZW5kQlNTMjA0MENvZXhpc3RNZ210QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCVdjaWQsCisJSU4JVUNIQVIJYXBpZHgsCisJSU4JVUNIQVIJSW5mb1JlcSk7CisKK1ZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgIFdjaWQsCisJSU4gVUNIQVIgYXBpZHgpOworCitCT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KTsKKworVk9JRCBDaGFubmVsU3dpdGNoQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpOworCitVTE9ORyBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFBVQ0hBUiAgcERlc3QpOworCitWT0lEIFVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSk7CisKK1ZPSUQgU2VuZDIwNDBDb2V4aXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworVk9JRCBQZWVyUk1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgU3RhUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIEJzczIwNDBDb2V4aXN0KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitWT0lEIFBlZXJCU1NUcmFuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckhUQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgUGVlclFPU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIFBlZXJETFNBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBEbHNQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ETFNfUkVRX1NUUlVDVCAqcERsc1JlcSwKKwlJTiBQUlRfODAyXzExX0RMUyBwRGxzLAorCUlOIFVTSE9SVCByZWFzb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFJFQ0JBVGltZXJUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFNlbmRSZWZyZXNoQkFSKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpOworCitWT0lEIEJhckhlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBGUkFNRV9CQVIgcENudGxCYXIsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcFNBKTsKKworVk9JRCBJbnNlcnRBY3RGaWVsZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDYXRlZ29yeSwKKwlJTiBVSU5UOCBBY3RDb2RlKTsKKworQk9PTEVBTiBRb3NCQURhdGFQYXJzZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBCT09MRUFOIGJBTVNEVSwKKwlJTiBQVUNIQVIgcDgwMjNIZWFkZXIsCisJSU4gVUNIQVIJV0NJRCwKKwlJTiBVQ0hBUglUSUQsCisJSU4gVVNIT1JUIFNlcXVlbmNlLAorCUlOIFVDSEFSIERhdGFPZmZzZXQsCisJSU4gVVNIT1JUIERhdGFzaXplLAorCUlOIFVJTlQgICBDdXJSeEluZGV4KTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUxPTkcgV2NpZCwKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJSU4gUEZSQU1FX0JBX1JFUSBwTXNnKTsKKworVk9JRCBCYUF1dG9NYW5Td2l0Y2goCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEhUSU9UQ2hlY2soCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgICAgIEJhdFJlY0lkeCk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfZGF0YS5jCisvLworQk9PTEVBTiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QSGFuZGxlVHhEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKTsKKworVk9JRCBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCit2b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRAlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFByZXZBZGRyMSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHA4MDIzaGRyKTsKKworQk9PTEVBTiBQZWVySXNBZ2dyZU9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBVTE9ORyAgICAgICAgICBUeFJhdGUsCisgICAgSU4gIFBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KTsKKworTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKKwlJTiAgUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlciwKKwlJTiAgVUNIQVIgICAgICAgICAgIERlc2lyZWRPZmZzZXQsCisJT1VUIFBVQ0hBUiAgICAgICAgICBwQnl0ZTAsCisJT1VUIFBVQ0hBUiAgICAgICAgICBwQnl0ZTEpOworCitORElTX1NUQVRVUyBTVEFTZW5kUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK1ZPSUQgU1RBU2VuZFBhY2tldHMoCisJSU4gIE5ESVNfSEFORExFICAgICBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorCUlOICBQUE5ESVNfUEFDS0VUICAgcHBQYWNrZXRBcnJheSwKKwlJTiAgVUlOVCAgICAgICAgICAgIE51bWJlck9mUGFja2V0cyk7CisKK1ZPSUQgUlRNUERlUXVldWVQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAJSU4JQk9PTEVBTgkJCWJJbnRDb250ZXh0LAorCUlOICBVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVQ0hBUgkJCU1heF9UeF9QYWNrZXRzKTsKKworTkRJU19TVEFUVVMJUlRNUEhhcmRUcmFuc21pdCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4gIFVDSEFSCQkJUXVlSWR4LAorCU9VVAlQVUxPTkcJCQlwRnJlZVRYRExlZnQpOworCitORElTX1NUQVRVUwlTVEFIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVFhfQkxLCQkJKnBUeEJsaywKKwlJTiAgVUNIQVIJCQlRdWVJZHgpOworCitWT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK05ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJpbmdUeXBlLAorCUlOICBVQ0hBUiAgICAgICAgICAgTnVtYmVyUmVxdWlyZWQsCisJSU4gCVBVQ0hBUiAgICAgICAgICBGcmVlTnVtYmVySXMpOworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUglRdWVJZHgsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUglRdWVJZHgsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK1VTSE9SVCAgUlRNUENhbGNEdXJhdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJhdGUsCisJSU4gIFVMT05HICAgICAgICAgICBTaXplKTsKKworVk9JRCBSVE1QV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTiAgQk9PTEVBTiAgICAJCUZSQUcsCisJSU4gIEJPT0xFQU4gICAgCQlDRkFDSywKKwlJTiAgQk9PTEVBTiAgICAJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOCQkJQU1QRFUsCisJSU4JQk9PTEVBTgkJCUFjaywKKwlJTglCT09MRUFOCQkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTiAgVUNIQVIgICAgICAJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCk7CisKKworVk9JRCBSVE1QV3JpdGVUeFdJX0RhdGEoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspOworCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9DYWNoZSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTglUWF9CTEsJCQkJKnBUeEJsayk7CisKK1ZPSUQgUlRNUFdyaXRlVHhEZXNjcmlwdG9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWERfU1RSVUMJCXBUeEQsCisJSU4JQk9PTEVBTgkJCWJXSVYsCisJSU4JVUNIQVIJCQlRU0VMKTsKKworVk9JRCBSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgTWluaXBvcnRNTVJlcXVlc3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW5ndGgpOworCitWT0lEIFJUTVBTZW5kTnVsbEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOCUJPT0xFQU4JCQliUW9zTnVsbCk7CisKK1ZPSUQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QU2VuZFJUU0ZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOCXVuc2lnbmVkIGludAlOZXh0TXBkdVNpemUsCisJSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisJSU4gIFVDSEFSICAgICAgICAgICBSVFNSYXRlLAorCUlOICBVU0hPUlQgICAgICAgICAgQWNrRHVyYXRpb24sCisJSU4gIFVDSEFSICAgICAgICAgICBRdWVJZHgsCisJSU4gIFVDSEFSCQkJRnJhbWVHYXApOworCisKK05ESVNfU1RBVFVTIFJUTVBBcHBseVBhY2tldEZpbHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFJUMjhYWF9SWERfU1RSVUMgICAgICBwUnhELAorCUlOICBQSEVBREVSXzgwMl8xMSAgcEhlYWRlcik7CisKK1BRVUVVRV9IRUFERVIgICBSVE1QQ2hlY2tUeFN3UXVldWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFVDSEFSICAgICAgICAgICAqUXVlSWR4KTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QUmVwb3J0TWljRXJyb3IoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBDSVBIRVJfS0VZICAgICBwV3BhS2V5KTsKKworVk9JRAlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKAorICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitORElTX1NUQVRVUyBSVE1QQ2xvbmVOZGlzUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUJPT0xFQU4gICAgcEluc0FNU0RVSGRyLAorCUlOICBQTkRJU19QQUNLRVQgICAgcEluUGFja2V0LAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpOworCitORElTX1NUQVRVUyBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgKnBQYWNrZXQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyLAorCUlOICBVSU5UICAgICAgICAgICAgSGVhZGVyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuKTsKKworVk9JRCBSVE1QRnJlZU5kaXNQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworQk9PTEVBTiBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gVUNIQVIgICAgICAgICAgICBRdWVJZHgpOworCitCT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK1ZPSUQgUlRNUENja0JicFR1bmluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVSU5UCQkJVHhSYXRlKTsKKworLy8KKy8vIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF93ZXAuYworLy8KK1ZPSUQgUlRNUEluaXRXZXBFbmdpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCk7CisKK1ZPSUQgUlRNUEVuY3J5cHREYXRhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworQk9PTEVBTglSVE1QRGVjcnlwdERhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVVJTlQJCQlMZW4sCisJSU4JVUlOVAkJCWlkeCk7CisKK0JPT0xFQU4JUlRNUFNvZnREZWNyeXB0V0VQKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBQVUNIQVIJCQlwRGF0YSwKKwlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpOworCitWT0lEIFJUTVBTZXRJQ1YoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCk7CisKK1ZPSUQgQVJDRk9VUl9JTklUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgVUlOVCAgICAgICAgICAgIEtleUxlbik7CisKK1VDSEFSICAgQVJDRk9VUl9CWVRFKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgICAgIEN0eCk7CisKK1ZPSUQgQVJDRk9VUl9ERUNSWVBUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCBBUkNGT1VSX0VOQ1JZUFQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEIFdQQUFSQ0ZPVVJfRU5DUllQVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1VJTlQgUlRNUF9DQUxDX0ZDUzMyKAorCUlOICBVSU5UICAgRmNzLAorCUlOICBQVUNIQVIgIENwLAorCUlOICBJTlQgICAgIExlbik7CisKKy8vCisvLyBNTE1FIHJvdXRpbmVzCisvLworCisvLyBBc2ljL1JGL0JCUCByZWxhdGVkIGZ1bmN0aW9ucworCitWT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIAkJVVNIT1JUCQkJT3BlcmFpb25Nb2RlLAorCUlOIAkJVUNIQVIJCQlTZXRNYXNrLAorCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCisJSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCk7CisKK1ZPSUQgQXNpY1N3aXRjaENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsLAorCUlOCUJPT0xFQU4JCQliU2Nhbik7CisKK1ZPSUQgQXNpY0xvY2tDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIENoYW5uZWwpIDsKKworVk9JRCBBc2ljQW50ZW5uYVNlbGVjdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIENoYW5uZWwpOworCitWT0lEIEFzaWNBbnRlbm5hU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglBQkdCQU5EX1NUQVRFCUJhbmRTdGF0ZSk7CisKK1ZPSUQgQXNpY1JmVHVuaW5nRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKK1ZPSUQgQXNpY0ZvcmNlU2xlZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgIGJGcm9tVHgpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitWT0lEIEFzaWNTZXRCc3NpZCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBCc3NpZCk7CisKK1ZPSUQgQXNpY1NldE1jYXN0V0MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNEZWxXY2lkVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCVdjaWQpOworCitWT0lEIEFzaWNFbmFibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNEaXNhYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRGlzYWJsZVN5bmMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNFbmFibGVCc3NTeW5jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljRW5hYmxlSWJzc1N5bmMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNTZXRFZGNhUGFybSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRURDQV9QQVJNICAgIHBFZGNhUGFybSk7CisKK1ZPSUQgQXNpY1NldFNsb3RUaW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpOworCitWT0lEIEFzaWNBZGRTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICAgS2V5SWR4LAorCUlOIFVDSEFSICAgICAgICAgQ2lwaGVyQWxnLAorCUlOIFBVQ0hBUiAgICAgICAgcEtleSwKKwlJTiBQVUNIQVIgICAgICAgIHBUeE1pYywKKwlJTiBQVUNIQVIgICAgICAgIHBSeE1pYyk7CisKK1ZPSUQgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgICBLZXlJZHgpOworCitWT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpOworCitWT0lEIEFzaWNVcGRhdGVXQ0lESVZFSVYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVMT05HICAgICAgICB1SVYsCisJSU4gVUxPTkcgICAgICAgIHVFSVYpOworCitWT0lEIEFzaWNVcGRhdGVSeFdDSURUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkcik7CisKK1ZPSUQgQXNpY0FkZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIJCUtleUlkeCwKKwlJTiBQQ0lQSEVSX0tFWQlwQ2lwaGVyS2V5LAorCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSwKKwlJTiBCT09MRUFOCQliVHhLZXkpOworCitWT0lEIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIJCVdDSUQsCisJSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KTsKKworVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gVUNIQVIJCSBCc3NJZHgsCisJSU4gVUNIQVIJCSBXY2lkKTsKKworQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIENvbW1hbmQsCisJSU4gVUNIQVIgICAgICAgICBUb2tlbiwKKwlJTiBVQ0hBUiAgICAgICAgIEFyZzAsCisJSU4gVUNIQVIgICAgICAgICBBcmcxKTsKKworI2lmZGVmIFJUMjg2MAorQk9PTEVBTiBBc2ljQ2hlY2tDb21tYW5PaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIENvbW1hbmQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCitWT0lEIE1hY0FkZHJSYW5kb21Cc3NpZCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgUFVDSEFSIHBBZGRyKTsKKworVk9JRCBNZ3RNYWNIZWFkZXJJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICBwQWQsCisJSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKwlJTiBVQ0hBUiBTdWJUeXBlLAorCUlOIFVDSEFSIFRvRHMsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcEJzc2lkKTsKKworVk9JRCBNbG1lUmFkaW9PZmYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworCitWT0lEIEJzc1RhYmxlSW5pdCgKKwlJTiBCU1NfVEFCTEUgKlRhYik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gQkFfVEFCTEUgKlRhYik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1VMT05HIEJzc1RhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gVUNIQVIgQ2hhbm5lbCk7CisKK1VMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgICAgcEJzc2lkLAorCUlOIFBVQ0hBUiAgICBwU3NpZCwKKwlJTiBVQ0hBUiAgICAgU3NpZExlbiwKKwlJTiBVQ0hBUiAgICAgQ2hhbm5lbCk7CisKK1VMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSICAgIEJzc2lkLAorCUlOIFBVQ0hBUiAgICBwU3NpZCwKKwlJTiBVQ0hBUiAgICAgU3NpZExlbiwKKwlJTiBVQ0hBUiAgICAgQ2hhbm5lbCk7CisKK1ZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKKwlJTiBPVVQgIFBCU1NfVEFCTEUgcFRhYiwKKwlJTiAgICAgIFBVQ0hBUiBwQnNzaWQsCisJSU4gICAgICBVQ0hBUiBDaGFubmVsKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KTsKKworVk9JRCBCQVRhYmxlRGVsZXRlUkVDRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlCQV9SRUNfRU5UUlkJKnBCQVJFQ0VudHJ5KTsKKworVk9JRCBCQVRhYmxlVGVhck9SSUVudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJVUNIQVIgVElELAorCUlOCQlVQ0hBUiBXY2lkLAorCUlOCQlCT09MRUFOIGJGb3JjZURlbGV0ZSwKKwlJTgkJQk9PTEVBTiBBTEwpOworCitWT0lEIEJBVGFibGVUZWFyUkVDRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlVQ0hBUiBUSUQsCisJSU4JCVVDSEFSIFdDSUQsCisJSU4JCUJPT0xFQU4gQUxMKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCAgQnNzRW50cnlTZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFBCU1NfRU5UUlkgcEJzcywKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIFBDRl9QQVJNIENmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOworCitVTE9ORyAgQnNzVGFibGVTZXRFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgUEJTU19UQUJMRSBwVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZUluc2VydEVudHJ5KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVTSE9SVCBBaWQsCisgICAgSU4gVVNIT1JUCQlUaW1lT3V0VmFsdWUsCisJSU4gVVNIT1JUCQlTdGFydGluZ1NlcSwKKyAgICBJTiBVQ0hBUiBUSUQsCisJSU4gVUNIQVIgQkFXaW5TaXplLAorCUlOIFVDSEFSIE9yaWdpbmF0b3JTdGF0dXMsCisgICAgSU4gQk9PTEVBTiBJc1JlY2lwaWVudCk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEJzczIwNDBDb2V4aXN0VGltZU91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisKK1ZPSUQgIFRyaUV2ZW50SW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1VMT05HIFRyaUV2ZW50VGFibGVTZXRFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgVFJJR0dFUl9FVkVOVF9UQUIgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlSZWdDbGFzcywKKwlJTiBVQ0hBUiBDaGFubmVsTm8pOworCitWT0lEIFRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgQnNzVGFibGVTc2lkU29ydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCisJSU4gIENIQVIgU3NpZFtdLAorCUlOICBVQ0hBUiBTc2lkTGVuKTsKKworVk9JRCAgQnNzVGFibGVTb3J0QnlSc3NpKAorCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYik7CisKK1ZPSUQgQnNzQ2lwaGVyUGFyc2UoCisJSU4gT1VUICBQQlNTX0VOVFJZICBwQnNzKTsKKworTkRJU19TVEFUVVMgIE1sbWVRdWV1ZUluaXQoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitWT0lEICBNbG1lUXVldWVEZXN0cm95KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworQk9PTEVBTiBNbG1lRW5xdWV1ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBNYWNoaW5lLAorCUlOIFVMT05HIE1zZ1R5cGUsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFZPSUQgKk1zZyk7CisKK0JPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCisJSU4gVUNIQVIgUnNzaTAsCisJSU4gVUNIQVIgUnNzaTEsCisJSU4gVUNIQVIgUnNzaTIsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFBWT0lEIE1zZywKKwlJTiBVQ0hBUiBTaWduYWwpOworCisKK0JPT0xFQU4gTWxtZURlcXVldWUoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUsCisJT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pOworCitWT0lEICAgIE1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiAgTWxtZVF1ZXVlRW1wdHkoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitCT09MRUFOICBNbG1lUXVldWVGdWxsKAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworQk9PTEVBTiAgTXNnVHlwZVN1YnN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAorCU9VVCBJTlQgKk1hY2hpbmUsCisJT1VUIElOVCAqTXNnVHlwZSk7CisKK1ZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiBTVEFURV9NQUNISU5FICpTbSwKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwlJTiBVTE9ORyBTdE5yLAorCUlOIFVMT05HIE1zZ05yLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCUlOIFVMT05HIEluaXRTdGF0ZSwKKwlJTiBVTE9ORyBCYXNlKTsKKworVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBVTE9ORyBTdCwKKwlVTE9ORyBNc2csCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIEYpOworCitWT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIERyb3AoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBc3NvY1N0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgUmVhc3NvY1RpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBc3NvY1RpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBEaXNhc3NvY1RpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitWT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFzc29jVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIENsczNlcnJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQWRkcik7CisKK1ZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEICBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisKK1ZPSUQgIENvbXBvc2VQc1BvbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEICBDb21wb3NlTnVsbEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgIEFzc29jUG9zdFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQWRkcjIsCisJSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiAgVVNIT1JUIEFpZCwKKwlJTiAgVUNIQVIgU3VwUmF0ZVtdLAorCUlOICBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOICBVQ0hBUiBFeHRSYXRlW10sCisJSU4gIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOworCitWT0lEIEF1dGhTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFBTVEFURV9NQUNISU5FIHNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQXV0aFRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBdXRoVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbHMyZXJyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIpOworCitWT0lEIE1sbWVEZWF1dGhSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkF1dGgoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBTVEFURV9NQUNISU5FIFNtLAorCUlOICBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgUGVlckRlYXV0aEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKKwlJTiAgVVNIT1JUIEFsZywKKwlJTiAgVVNIT1JUIFNlcSwKKwlJTiAgVVNIT1JUIFJlYXNvbiwKKwlJTiAgVVNIT1JUIFN0YXR1cyk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIGRscy5jCisvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCit2b2lkIERsc1N0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBNbG1lRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOworCitWT0lEIFBlZXJEbHNSc3BBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBNbG1lRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBSVE1QQ2hlY2tETFNUaW1lT3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworQk9PTEVBTiBSVE1QUmN2RnJhbWVETFNDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAorCUlOIFVMT05HCQkJTGVuLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCXBSeEQpOworCitJTlQJUlRNUENoZWNrRExTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpOworCitWT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSk7CisKK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCitWT0lEIERsc1RpbWVvdXRBY3Rpb24oCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworQk9PTEVBTiBNbG1lRGxzUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBSVF84MDJfMTFfRExTICpwRExTLAorICAgIE9VVCBQVVNIT1JUIHBSZWFzb24pOworCitJTlQgU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnREbHNFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCXBBZGRyLAorCUlOICBVSU5UCURsc0VudHJ5SWR4KTsKKworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCB3Y2lkLAorCUlOIFBVQ0hBUiBwQWRkcik7CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpOworCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJd2NpZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpOworCitJTlQJU2V0X0Rsc0FkZEVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQk9PTEVBTiBQZWVyRGxzUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBEbHNUaW1lb3V0LAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7CisKK0JPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7CisKK0JPT0xFQU4gUGVlckRsc1RlYXJEb3duU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEJlYWNvblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBTY2FuVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TdGFydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIFNjYW5SdW5uaW5nKAorCQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZPSUQgTWxtZUNudGxJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsSWRsZVByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bE9pZFNjYW5Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsT2lkU3NpZFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxPaWRSVEJzc2lkUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7CisKK1ZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7CisKK1ZPSUQgQ250bFdhaXREaXNhc3NvY1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRKb2luUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdFJlYXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0U3RhcnRQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXV0aFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIENudGxPaWRETFNTZXR1cFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworVk9JRCBMaW5rVXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSIEJzc1R5cGUpOworCitWT0lEIExpbmtEb3duKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBCT09MRUFOICAgICAgICAgSXNSZXFGcm9tQVApOworCitWT0lEIEl0ZXJhdGVPbkJzc1RhYigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7OworCitWT0lEIEpvaW5QYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAorCUlOICBVTE9ORyBCc3NJZHgpOworCitWT0lEIEFzc29jUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gT1VUIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqQXNzb2NSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOICBVTE9ORyBUaW1lb3V0LAorCUlOICBVU0hPUlQgTGlzdGVuSW50dik7CisKK1ZPSUQgU2NhblBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCisJSU4gIENIQVIgU3NpZFtdLAorCUlOICBVQ0hBUiBTc2lkTGVuLAorCUlOICBVQ0hBUiBCc3NUeXBlLAorCUlOICBVQ0hBUiBTY2FuVHlwZSk7CisKK1ZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAqRGlzYXNzb2NSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgU3RhcnRQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCisJSU4gIENIQVIgU3NpZFtdLAorCUlOICBVQ0hBUiBTc2lkTGVuKTsKKworVk9JRCBBdXRoUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKKwlJTiAgUFVDSEFSIHBBZGRyLAorCUlOICBVU0hPUlQgQWxnKTsKKworVk9JRCBFbnF1ZXVlUHNQb2xsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFbnF1ZXVlQmVhY29uRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVKb2luUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBTY2FuVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJQcm9iZVJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgU2Nhbk5leHRDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVUxPTkcgTWFrZUlic3NCZWFjb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIENDWEFkamFjZW50QVBSZXBvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgVUNIQVIgKkJzc1R5cGUsCisJT1VUIENIQVIgc3NpZFtdLAorCU9VVCBVQ0hBUiAqU3NpZExlbiwKKwlPVVQgVUNIQVIgKlNjYW5UeXBlKTsKKworQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCUlOICBVQ0hBUiBNc2dDaGFubmVsLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBQVUNIQVIgcEJzc2lkLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKnBTc2lkTGVuLAorCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCisJT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKKwlPVVQgVUNIQVIgKnBDaGFubmVsLAorCU9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCisJT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCisJT1VUIENGX1BBUk0gKnBDZlBhcm0sCisJT1VUIFVTSE9SVCAqcEF0aW1XaW4sCisJT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorCU9VVCBVQ0hBUiAqcEVycCwKKwlPVVQgVUNIQVIgKnBEdGltQ291bnQsCisJT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKKwlPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCisJT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCisJT1VUIFVDSEFSIFN1cFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorCU9VVCBVQ0hBUiBFeHRSYXRlW10sCisJT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKwlPVVQJVUNIQVIgKnBDa2lwRmxhZywKKwlPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAorCU9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKKwlPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJT1VUIFVMT05HICpwUmFsaW5rSWUsCisJT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCU9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCisJT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCisJT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsLAorCU9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKKwlPVVQgUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIpOworCitCT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbik7CisKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSIFdjaWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQXBBZGRyLAorCU9VVCBVU0hPUlQgKkNhcGFiaWxpdHlJbmZvLAorCU9VVCBVTE9ORyAqVGltZW91dCwKKwlPVVQgVVNIT1JUICpMaXN0ZW5JbnR2KTsKKworQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkciwKKwlPVVQgVUxPTkcgKlRpbWVvdXQsCisJT1VUIFVTSE9SVCAqQWxnKTsKKworQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKlNzaWRsZW4pOworCitCT09MRUFOIFBlZXJBdXRoU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyLAorCU9VVCBVU0hPUlQgKkFsZywKKwlPVVQgVVNIT1JUICpTZXEsCisJT1VUIFVTSE9SVCAqU3RhdHVzLAorCU9VVCBDSEFSIENobGdUZXh0W10pOworCitCT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorCU9VVCBVU0hPUlQgKnBTdGF0dXMsCisJT1VUIFVTSE9SVCAqcEFpZCwKKwlPVVQgVUNIQVIgU3VwUmF0ZVtdLAorCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisJT1VUIFVDSEFSIEV4dFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKyAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKyAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKKyAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCisJT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCU9VVCBVQ0hBUiAqcENraXBGbGFnKTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBVU0hPUlQgKlJlYXNvbik7CisKK0JPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoCisgICAgSU4gCVBSVE1QX0FEQVBURVIgCQlwQWQsCisgICAgSU4gCVBFQVBPTF9QQUNLRVQgCQlwTXNnLAorICAgIElOIAlVTE9ORyAJCQkJTXNnTGVuLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOIAlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5KTsKKworQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqcFNzaWRMZW4pOworCitCT09MRUFOIEdldFRpbUJpdCgKKwlJTiAgQ0hBUiAqUHRyLAorCUlOICBVU0hPUlQgQWlkLAorCU9VVCBVQ0hBUiAqVGltTGVuLAorCU9VVCBVQ0hBUiAqQmNhc3RGbGFnLAorCU9VVCBVQ0hBUiAqRHRpbUNvdW50LAorCU9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKKwlPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKTsKKworVUNIQVIgQ2hhbm5lbFNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKTsKKworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCisJSU4gUEJTU19FTlRSWSBwQnNzKTsKKworQk9PTEVBTiBNbG1lRGVsQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbik7CisKK0JPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIpOworCitVTE9ORyBNYWtlT3V0Z29pbmdGcmFtZSgKKwlPVVQgQ0hBUiAqQnVmZmVyLAorCU9VVCBVTE9ORyAqTGVuZ3RoLCAuLi4pOworCitWT0lEICBMZnNySW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgU2VlZCk7CisKK1VDSEFSIFJhbmRvbUJ5dGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwVHhSYXRlKTsKKworVk9JRCAgTWxtZVBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIExpbmtEb3duRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIExpbmtVcEV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBTVEFNbG1lUGVyaW9kaWNFeGVjKAorCVBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lQXV0b1NjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCisJSU4gUFVDSEFSIHBTc2lkLAorCUlOIFVDSEFSICBTc2lkTGVuKTsKKworVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HICAgIE5vdzMyKTsKKworVk9JRCBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgICAgICAgICAgIE5vdyk7CisKK1ZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVTZXRUeFJhdGUoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKKwlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKKworVk9JRCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKKwlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCisJSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCisJSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKKworVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTm93KTsKKworVk9JRCBNbG1lQ2hlY2tQc21DaGFuZ2UoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgICAgTm93MzIpOworCitWT0lEIE1sbWVTZXRQc21CaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHBzbSk7CisKK1ZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFR4UHJlYW1ibGUpOworCitWT0lEIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgTWxtZVVwZGF0ZVR4UmF0ZXMoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIAlCT09MRUFOCQkgCWJMaW5rVXAsCisJSU4JVUNIQVIJCQlhcGlkeCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgTWxtZVVwZGF0ZUh0VHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCAgICBSVE1QQ2hlY2tSYXRlcygKKwlJTiAgICAgIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gT1VUICBVQ0hBUiAgICAgICAgICAgU3VwUmF0ZVtdLAorCUlOIE9VVCAgVUNIQVIgICAgICAgICAgICpTdXBSYXRlTGVuKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQlDZW50cmFsQ2hhbm5lbCwKKwlJTiBVQ0hBUgkJQ2hhbm5lbCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0JPT0xFQU4gCVJUTVBDaGVja0h0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJV2NpZCwKKwlJTiBPVVQJSFRfQ0FQQUJJTElUWV9JRQkJCSpwSHRDYXBhYmlsaXR5LAorCUlOIE9VVAlBRERfSFRfSU5GT19JRQkJCSpwQWRkSHRJbmZvKTsKKworVk9JRCBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQXNpY0JicFR1bmluZzEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNCYnBUdW5pbmcyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitDSEFSIFJUTVBNYXhSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIENIQVIJCQkJUnNzaTAsCisJSU4gQ0hBUgkJCQlSc3NpMSwKKwlJTiBDSEFSCQkJCVJzc2kyKTsKKworVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7CisKK1VDSEFSIFJUTVBTdGFGaXhlZFR4TW9kZSgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7CisKK1ZPSUQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygKKwkJVUNIQVIJCQkJZml4ZWRfdHhfbW9kZSwKKwkJUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworCitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKKworTkRJU19TVEFUVVMgTWxtZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVIYW5kbGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lSGFsdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEJ1aWxkQ2hhbm5lbExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVQ0hBUiBGaXJzdENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVQ0hBUiBOZXh0Q2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgY2hhbm5lbCk7CisKK1ZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisKK1ZPSUQgUmFpc2VDbG9jaygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUlOVDMyICp4KTsKKworVk9JRCBMb3dlckNsb2NrKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVSU5UMzIgKngpOworCitVU0hPUlQgU2hpZnRJbkJpdHMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFNoaWZ0T3V0Qml0cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIGRhdGEsCisJSU4gIFVTSE9SVCBjb3VudCk7CisKK1ZPSUQgRUVwcm9tQ2xlYW51cCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgRVdEUygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgRVdFTigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VTSE9SVCBSVE1QX0VFUFJPTV9SRUFEMTYoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBPZmZzZXQpOworCitWT0lEIFJUTVBfRUVQUk9NX1dSSVRFMTYoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBPZmZzZXQsCisJSU4gIFVTSE9SVCBEYXRhKTsKKworLy8KKy8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBydG1wX3RraXAuYworLy8KK1ZPSUQgICAgUlRNUEluaXRUa2lwRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFRLZXksCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBUQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwVFNDLAorCU9VVCBQVUxPTkcgICAgICAgICAgcElWMTYsCisJT1VUIFBVTE9ORyAgICAgICAgICBwSVYzMik7CisKK1ZPSUQgICAgUlRNUEluaXRNSUNFbmdpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAorCUlOICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5LAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSk7CisKK0JPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKKwlJTglVQ0hBUgkJCVVzZXJQcmlvcml0eSwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgICAgUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBFbmNhcCwKKwlJTiAgUENJUEhFUl9LRVkgICAgIHBLZXksCisJSU4JVUNIQVIJCQlhcGlkeCk7CisKK0JPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcExMQywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCAgICBSVE1QVGtpcEFwcGVuZEJ5dGUoCisJSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKKwlJTiAgVUNIQVIgICAgICAgICAgIHVDaGFyKTsKKworVk9JRCAgICBSVE1QVGtpcEFwcGVuZCgKKwlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIG5CeXRlcyk7CisKK1ZPSUQgICAgUlRNUFRraXBHZXRNSUMoCisJSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCk7CisKK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gVUNIQVIgICAgVXNlclByaW9yaXR5LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSk7CisKKy8vCisvLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gY21tX2luZm8uYworLy8KK05ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVk9JRCAgICAgICAgICAgcEJ1Zik7CisKK1ZPSUQgICAgUlRNUFdQQVJlbW92ZUFsbEtleXMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKKyAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAorICAgIElOICBVQ0hBUiBzdHJMZW4pOworCitWT0lEICAgIFJUTVBTZXRQaHlNb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyBwaHltb2RlKTsKKworVk9JRAlSVE1QVXBkYXRlSFRJRSgKKwlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKKwlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCisJT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKKworVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCisJSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKKwlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitDSEFSICpHZXRFbmNyeXB0VHlwZSgKKwlDSEFSIGVuYyk7CisKK0NIQVIgKkdldEF1dGhNb2RlKAorCUNIQVIgYXV0aCk7CisKK1ZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxHZXRNYWNUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBzdHJ1Y3QgaXdyZXEgKndycSk7CisKK1ZPSUQgUlRNUEluZGljYXRlV1BBMlN0YXR1cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgcEFkYXB0ZXIpOworCitWT0lECVJUTVBPUE1vZGVTd2l0Y2hpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEICAgIFJUTVBBZGRCU1NJRENpcGhlcigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUglBaWQsCisgICAgSU4gIFBORElTXzgwMl8xMV9LRVkgICAgcEtleSwKKyAgICBJTiAgVUNIQVIgICBDaXBoZXJBbGcpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lECVJUTVBTZXRIVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpOworCitWT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBSVE1QU2VuZFdpcmVsZXNzRXZlbnQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJRXZlbnRfZmxhZywKKwlJTglQVUNIQVIgCQkJcEFkZHIsCisJSU4gIFVDSEFSCQkJQnNzSWR4LAorCUlOCUNIQVIJCQlSc3NpKTsKKworVk9JRAlOSUNVcGRhdGVDbnRsQ291bnRlcnMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiAgICBVQ0hBUgkJCVN1YlR5cGUsCisJSU4JUFJYV0lfU1RSVUMgCXBSeFdJKTsKKy8vCisvLyBwcm90b3R5cGUgaW4gd3BhLmMKKy8vCitCT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCgKKwlJTiAgVUNIQVIgICBFQVBUeXBlLAorCU9VVCBJTlQJCSpNc2dUeXBlKTsKKworVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAgICAgICAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFdwYUVBUE9MS2V5QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYVBhaXJNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYVBhaXJNc2czQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYUdyb3VwTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFNYWNIZWFkZXJJbml0KAorCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBPVVQgIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisJSU4gICAgICBVQ0hBUiAgICAgICAgICAgd2VwLAorCUlOICAgICAgUFVDSEFSICAgICAgICAgIHBBZGRyMSk7CisKK1ZPSUQgICAgV3BhMlBhaXJNc2cxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYTJQYWlyTXNnM0FjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworQk9PTEVBTiBQYXJzZUtleURhdGEoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQliUGFpcmV3aXNlKTsKKworVk9JRCAgICBSVE1QVG9XaXJlbGVzc1N0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTglCT09MRUFOCQkJaXM0d2F5RnJhbWUpOworCitWT0lEICAgIEhNQUNfU0hBMSgKKwlJTiAgVUNIQVIgICAqdGV4dCwKKwlJTiAgVUlOVCAgICB0ZXh0X2xlbiwKKwlJTiAgVUNIQVIgICAqa2V5LAorCUlOICBVSU5UICAgIGtleV9sZW4sCisJSU4gIFVDSEFSICAgKmRpZ2VzdCk7CisKK1ZPSUQgICAgUFJGKAorCUlOICBVQ0hBUiAgICprZXksCisJSU4gIElOVCAgICAga2V5X2xlbiwKKwlJTiAgVUNIQVIgICAqcHJlZml4LAorCUlOICBJTlQgICAgIHByZWZpeF9sZW4sCisJSU4gIFVDSEFSICAgKmRhdGEsCisJSU4gIElOVCAgICAgZGF0YV9sZW4sCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgSU5UICAgICBsZW4pOworCitWT0lEICAgIENDS01QUkYoCisJSU4gIFVDSEFSICAgKmtleSwKKwlJTiAgSU5UICAgICBrZXlfbGVuLAorCUlOICBVQ0hBUiAgICpkYXRhLAorCUlOICBJTlQgICAgIGRhdGFfbGVuLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIElOVCAgICAgbGVuKTsKKworVk9JRCBXcGFDb3VudFBUSygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAqUE1LLAorCUlOICBVQ0hBUiAgICpBTm9uY2UsCisJSU4gIFVDSEFSICAgKkFBLAorCUlOICBVQ0hBUiAgICpTTm9uY2UsCisJSU4gIFVDSEFSICAgKlNBLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIFVJTlQgICAgbGVuKTsKKworVk9JRCAgICBHZW5SYW5kb20oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQkqbWFjQWRkciwKKwlPVVQJVUNIQVIJCQkqcmFuZG9tKTsKKworLy8KKy8vIHByb3RvdHlwZSBpbiBhaXJvbmV0LmMKKy8vCitWT0lEICAgIEFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAgICAgICAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DICBUcmFuc1tdKTsKKworVk9JRCAgICBBaXJvbmV0TXNnQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIEFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIENoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEJlYWNvblJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBDaGFubmVsTG9hZFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBOb2lzZUhpc3RSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgICBCZWFjb25SZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldEFkZEJlYWNvblJlcG9ydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICAgICAgSW5kZXgsCisJSU4gIFBNTE1FX1FVRVVFX0VMRU0gICAgcEVsZW0pOworCitWT0lEICAgIEFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKKworVk9JRCAgICBEQkdQUklOVF9UWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpOworCitWT0lEIERCR1BSSU5UX1JYX1JJTkcoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkKTsKKworQ0hBUiAgICBDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBDSEFSCQkJCVJzc2ksCisJSU4gVUNIQVIgICAgUnNzaU51bWJlcik7CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKworVk9JRCBBUEFzaWNFdmFsdWF0ZVJ4QW50KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworCitWT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLworLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGNtbV93cGEuYworLy8KK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisJSU4gUFVDSEFSIAkJCXBEYXRhLAorCUlOIFVMT05HIAkJCURhdGFCeXRlQ291bnQsCisJSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgQUVTX0dUS19LRVlfVU5XUkFQKAorCUlOICBVQ0hBUiAgICprZXksCisJT1VUIFVDSEFSICAgKnBsYWludGV4dCwKKwlJTglVQ0hBUgljX2xlbiwKKwlJTiAgVUNIQVIgICAqY2lwaGVydGV4dCk7CisKK0JPT0xFQU4gUlRNUENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOworCitCT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCUdyb3VwS2V5SW5kZXgsCisJSU4JVUNIQVIJCQlNc2dUeXBlLAorCUlOCUJPT0xFQU4JCQliV1BBMiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitWT0lECUNvbnN0cnVjdEVhcG9sTXNnKAorCUlOIAlQUlRNUF9BREFQVEVSICAgIAlwQWQsCisgICAgSU4gCVVDSEFSCQkJCVBlZXJBdXRoTW9kZSwKKyAgICBJTiAJVUNIQVIJCQkJUGVlcldlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJTXlHcm91cEtleVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJTXNnVHlwZSwKKyAgICBJTglVQ0hBUgkJCQlEZWZhdWx0S2V5SWR4LAorICAgIElOIAlVQ0hBUgkJCQkqUmVwbGF5Q291bnRlciwKKwlJTiAJVUNIQVIJCQkJKktleU5vbmNlLAorCUlOCVVDSEFSCQkJCSpUeFJTQywKKwlJTglVQ0hBUgkJCQkqUFRLLAorCUlOCVVDSEFSCQkJCSpHVEssCisJSU4JVUNIQVIJCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJCVJTTklFX0xlbiwKKyAgICBPVVQgUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnKTsKKworVk9JRAlDYWxjdWxhdGVNSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlQZWVyV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJKlBUSywKKwlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpOworCitORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKKwlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKKwlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgCUdyb3VwQ2lwaGVyLAorCUlOICBQQ0lQSEVSX0tFWQkJCQkJCXBTaGFyZF9rZXkpOworCitWT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVBlZXJBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCVBlZXJXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlHcm91cEtleVdlcFN0YXR1cywKKwlJTiAJVUNIQVIJCQlNc2dUeXBlLAorCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKKwlJTglCT09MRUFOCQkJYldQQTJDYXBhYmxlLAorCUlOCVVDSEFSCQkJKlBUSywKKwlJTglVQ0hBUgkJCSpHVEssCisJSU4JVUNIQVIJCQkqUlNOSUUsCisJSU4JVUNIQVIJCQlSU05JRV9MRU4sCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKKworVk9JRCBSVE1QTWFrZVJTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCisJSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlhcGlkeCk7CisKKy8vCisvLyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gYXBfd3BhLmMKKy8vCisKK0JPT0xFQU4gQVBXcGFNc2dUeXBlU3Vic3QoCisJSU4gVUNIQVIgICAgRUFQVHlwZSwKKwlPVVQgSU5UICpNc2dUeXBlKSA7CisKK01BQ19UQUJMRV9FTlRSWSAqUEFDSW5xdWlyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgICAgICAgICAgIFdjaWQpOworCitCT09MRUFOIFJUTVBDaGVja01jYXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitCT09MRUFOIFJUTVBDaGVja1VjYXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitCT09MRUFOIFJUTVBDaGVja0FVVEgoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVJRF9TVFJVQ1QgICAgICBlaWRfcHRyLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK1ZPSUQgV1BBU3RhcnQ0V2F5SFMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCUlOCVVMT05HCQkJVGltZUludGVydmFsKTsKKworVk9JRCBXUEFTdGFydDJXYXlHcm91cEhTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7CisKK1ZPSUQgQVBXcGFFQVBQYWNrZXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MU3RhcnRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MTG9nb2ZmQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTEtleUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xBU0ZBbGVydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIEhhbmRsZUNvdW50ZXJNZWFzdXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK1ZPSUQgUGVlclBhaXJNc2cyQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJQYWlyTXNnNEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDTVRpbWVyRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFdQQVJldHJ5RXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEVucXVldWVTdGFydEZvclBTS0V4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBSVE1QSGFuZGxlU1RBS2V5KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkYXB0ZXIsCisgICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIFBlZXJHcm91cE1zZzJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVk9JRCAgICAgICAgICAgICAqTXNnLAorCUlOICBVSU5UICAgICAgICAgICAgIE1zZ0xlbik7CisKK1ZPSUQgUGFpckRpc0Fzc29jQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCisJSU4gIFVTSE9SVCAgICAgICAgICAgUmVhc29uKTsKKworVk9JRCBNbG1lRGVBdXRoQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCisJSU4gIFVTSE9SVCAgICAgICAgICAgUmVhc29uKTsKKworVk9JRCBHUkVLRVlQZXJpb2RpY0V4ZWMoCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMxLAorCUlOICBQVk9JRCAgIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBDb3VudEdUSygKKwlJTiAgVUNIQVIgICAqUE1LLAorCUlOICBVQ0hBUiAgICpHTm9uY2UsCisJSU4gIFVDSEFSICAgKkFBLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIFVJTlQgICAgbGVuKTsKKworVk9JRCAgICBHZXRTbWFsbCgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlPVVQgUFVDSEFSICBvdXQsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCAgICBHZXRMYXJnZSgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlPVVQgUFVDSEFSICBvdXQsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCBBUEdlblJhbmRvbSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgVUNIQVIgICAgICAgKnJhbmRvbSk7CisKK1ZPSUQgQUVTX0dUS19LRVlfV1JBUCgKKwlJTiBVQ0hBUiAqa2V5LAorCUlOIFVDSEFSICpwbGFpbnRleHQsCisJSU4gVUNIQVIgcF9sZW4sCisJT1VUIFVDSEFSICpjaXBoZXJ0ZXh0KTsKKworVk9JRCAgICBXcGFTZW5kKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwUGFja2V0LAorICAgIElOICBVTE9ORyAgICAgICAgICAgTGVuKTsKKworVk9JRCAgICBBUFRvV2lyZWxlc3NTdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAorCUlOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOCUJPT0xFQU4JCQliQ2xlYXJGcmFtZSk7CisKK1ZPSUQgUlRNUEFkZFBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAJCXBBZCwKKwlJTglJTlQJCQkJCQlhcGlkeCwKKwlJTglQVUNIQVIJCQkJcEFkZHIsCisJSU4JVUNIQVIJCQkJCSpQTUtJRCwKKwlJTglVQ0hBUgkJCQkJKlBNSyk7CisKK0lOVCBSVE1QU2VhcmNoUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgsCisJSU4JUFVDSEFSCQlwQWRkcik7CisKK1ZPSUQgUlRNUERlbGV0ZVBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JSU5UCQkJCWFwaWR4LAorCUlOICBJTlQJCQkJaWR4KTsKKworVk9JRCBSVE1QTWFpbnRhaW5QTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRAlSVE1QU2VuZFRyaWdnZXJGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVk9JRAkJCXBCdWZmZXIsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisJSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKKworCisvKiB0aW1lb3V0IC0tIG1zICovCitWT0lEIFJUTVBfU2V0UGVyaW9kaWNUaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworVk9JRCBSVE1QX09TX0luaXRfVGltZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAorCUlOCVRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLAorCUlOCVBWT0lEIGRhdGEpOworCitWT0lEIFJUTVBfT1NfQWRkX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCitWT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCisKK1ZPSUQgUlRNUF9PU19EZWxfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAorCU9VVAlCT09MRUFOCQkJCSAqcENhbmNlbGxlZCk7CisKKworVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KTsKKworVk9JRCBSVE1QdXNlY0RlbGF5KAorCUlOCVVMT05HCXVzZWMpOworCitORElTX1NUQVRVUyBvc19hbGxvY19tZW0oCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUCVBVQ0hBUiAqbWVtLAorCUlOCVVMT05HICBzaXplKTsKKworTkRJU19TVEFUVVMgb3NfZnJlZV9tZW0oCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JUFVDSEFSIG1lbSk7CisKKwordm9pZCBSVE1QX0FsbG9jYXRlU2hhcmVkTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK1ZPSUQgUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAorCUlOIFBWT0lECWhhbmRsZSwKKwlPVVQJUFZPSUQJKnBwQWQpOworCit2b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUlOVAlJbmRleCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCit2b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcyk7CisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgpOworCit2b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKAorCUlOICBQTkRJU19QQUNLRVQgcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKKwordm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7CisKKworQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLICpwVHhCbGspOworCisKK1BSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKTsKKworCisgdm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK1VJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK1VJTlQgSGFuZGxlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCit2b2lkIGNvbnZlcnRfODAyXzExX3RvXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwODAyM2hkciwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcE9sZFBrdCk7CisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVkxBTigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9XUEkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUlOVDMyCQkJZXh0X2hlYWRfbGVuLAorCUlOCVVJTlQzMgkJCWV4dF90YWlsX2xlbik7CisKK1VDSEFSIFZMQU5fODAyM19IZWFkZXJfQ29weSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisJSU4JVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlPVVQgUFVDSEFSCQkJcERhdGEsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBCQV9SRUNfRU5UUlkJcEJBRW50cnksCisJSU4gVUxPTkcJCQlOb3czMik7CisKKworVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKKwkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJSU4gTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJCQlJTiBVQ0hBUgkJCVRJRCwKKwkJCUlOIFVTSE9SVAkJCVRpbWVPdXQsCisJCQlJTiBVTE9ORwkJCURlbGF5VGltZSwKKwkJCUlOIEJPT0xFQU4JCWlzRm9yY2VkKTsKKworVk9JRCBCQVNlc3Npb25UZWFyRG93bkFMTCgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCVVDSEFSIFdjaWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitCT09MRUFOIE9TX05lZWRfQ2xvbmVfUGFja2V0KHZvaWQpOworCisKK1ZPSUQgYnVpbGRfdHhfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUglwRnJhbWUsCisJSU4JVUxPTkcJRnJhbWVMZW4pOworCisKK1ZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCisJSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUgkJCVdjaWQsCisJSU4JCVVDSEFSCQkJVElELAorCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUsCisJSU4JCUJPT0xFQU4JCQliRm9yY2VTZW5kKTsKKworVk9JRCBCQVJlY1Nlc3Npb25UZWFyRG93bigKKwlJTiBPVVQJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCQkJV2NpZCwKKwlJTgkJVUNIQVIJCQlUSUQsCisJSU4JCUJPT0xFQU4JCQliUGFzc2l2ZSk7CisKK0JPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKK3ZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUxPTkcgQXV0b0NoQnNzSW5zZXJ0RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIENoYW5uZWxObywKKwlJTiBDSEFSIFJzc2kpOworCit2b2lkIEF1dG9DaEJzc1RhYmxlSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgQ2hhbm5lbEluZm9Jbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBBdXRvQ2hCc3NUYWJsZURlc3Ryb3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIENoYW5uZWxJbmZvRGVzdHJveSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VDSEFSIE5ld19BcEF1dG9TZWxlY3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBydHN0cm1hY3RvaGV4KAorCUlOIGNoYXIgKnMxLAorCUlOIGNoYXIgKnMyKTsKKworQk9PTEVBTiBydHN0cmNhc2VjbXAoCisJSU4gY2hhciAqczEsCisJSU4gY2hhciAqczIpOworCitjaGFyICpydHN0cnN0cnVuY2FzZWNtcCgKKwlJTiBjaGFyICpzMSwKKwlJTiBjaGFyICpzMik7CisKK2NoYXIgICAgKnJ0c3Ryc3RyKAorCUlOCWNvbnN0IGNoYXIgKiBzMSwKKwlJTgljb25zdCBjaGFyICogczIpOworCitjaGFyICpyc3RydG9rKAorCUlOIGNoYXIgKiBzLAorCUlOIGNvbnN0IGNoYXIgKiBjdCk7CisKK2ludCBydGluZXRfYXRvbigKKwljb25zdCBjaGFyICpjcCwKKwl1bnNpZ25lZCBpbnQgKmFkZHIpOworCisvLy8vLy8vLy8vIGNvbW1vbiBpb2N0bCBmdW5jdGlvbnMgLy8vLy8vLy8vLworSU5UIFNldF9Ecml2ZXJWZXJzaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1dpcmVsZXNzTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfU2hvcnRTbG90X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9UeFBvd2VyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9CR1Byb3RlY3Rpb25fUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1R4UHJlYW1ibGVfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfVHhCdXJzdF9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIERCRworSU5UCVNldF9EZWJ1Z19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UCVNob3dfRGVzY0luZm9fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2V0X0JBU2V0dXBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQkFSZWNUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdFN0YmNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0SHRjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEV4dGNoYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRCYVdpblNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0UmRnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRBdXRvQmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRNaW1vUHNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisKK0lOVAlTZXRfRm9yY2VTaG9ydEdJX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9Gb3JjZUdGX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldENvbW1vbkhUKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworSU5UCVNldF9TZW5kUFNNUEFjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRNSU1PUFNtb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworCitJTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy9EbHMgLAlrYXRoeQorVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy9CbG9jayBBQ0sKK1ZPSUQgUXVlcnlCQVRBQkxFKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFFVRVJZQkFfVEFCTEUgcEJBVCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitJTlQJICAgIFdwYUNoZWNrRWFwQ29kZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIAlwQWQsCisJSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCisJSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKKwlJTiAgVVNIT1JUCQkJCU9mZlNldCk7CisKK1ZPSUQgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorICAgIElOICBCT09MRUFOICAgICAgICAgICAgIGJVbmljYXN0KTsKKworVk9JRCAgICBTZW5kQXNzb2NJRXNUb1dwYVN1cHBsaWNhbnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAoraW50IHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKAorCUlOICBSVE1QX0FEQVBURVIgKnBBZCk7CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBIYW5kbGVfQlNTX1dpZHRoX1RyaWdnZXJfRXZlbnRzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBidWlsZF9leHRfY2hhbm5lbF9zd2l0Y2hfaWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRSAqcElFKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCitCT09MRUFOIEFQUnhEb25lSW50ZXJydXB0SGFuZGxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCWFyZ2MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBBTVBEVSBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworLy8gQU1TRFUgcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfQU1TRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIEluZGljYXRlX0VBUE9MX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCit2b2lkICB1cGRhdGVfb3NfcGFja2V0X2luZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKwordm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitVSU5UIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvLyByZW1vdmUgTExDIGFuZCBnZXQgODAyXzMgSGVhZGVyCisjZGVmaW5lICBSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKF9wUnhCbGssIF9wSGVhZGVyODAyXzMpCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlQVUNIQVIgX3BSZW1vdmVkTExDU05BUCA9IE5VTEwsIF9wREEsIF9wU0E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX01FU0gpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCV9wU0EgPSAoUFVDSEFSKV9wUnhCbGstPnBIZWFkZXIgKyBzaXplb2YoSEVBREVSXzgwMl8xMSk7ICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0lORlJBKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0RMUykpCQkJCQkJCQkJXAorCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIyOwkJCQkJCQkJCQlcCisJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlDT05WRVJUX1RPXzgwMl8zKF9wSGVhZGVyODAyXzMsIF9wREEsIF9wU0EsIF9wUnhCbGstPnBEYXRhLCAJCQkJXAorCQlfcFJ4QmxrLT5EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBBUEZvd2FyZFdpcmVsZXNzU3RhVG9XaXJlbGVzc1N0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVTE9ORwkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBBbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX0Zyb21XaGljaEJTUylcCisJCQlTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpOworCQkJLy9hbm5vdW5jZV84MDJfM19wYWNrZXQoX3BBZCwgX3BQYWNrZXQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK1BORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5ESVNfUEFDS0VUIENsb25lUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpOworCisKKy8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKK1ZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgVXBkYXRlX1Jzc2lfU2FtcGxlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFJTU0lfU0FNUExFCQkqcFJzc2ksCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKKworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJCXBTYXZlUnhELAorCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCisJSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKTsKKworUE5ESVNfUEFDS0VUIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorLy9mb3Igc25tcCAsIGthdGh5Cit0eXBlZGVmIHN0cnVjdCBfRGVmYXVsdEtleUlkeFZhbHVlCit7CisJVUNIQVIJS2V5SWR4OworCVVDSEFSCVZhbHVlWzE2XTsKK30gRGVmYXVsdEtleUlkeFZhbHVlLCAqUERlZmF1bHRLZXlJZHhWYWx1ZTsKKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK2VudW0geworCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm0JCT0gMHgwMDAwMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lCT0gMHgwMDAxMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWUJPSAweDAwMDIwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbAk9IDB4MDAwMzAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpCQk9IDB4MDAwNDAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcQkJPSAweDAwMDUwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsCT0gMHgwMDA2MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlCQk9IDB4MDAwNzAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlCQk9IDB4MDAwODAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4CQk9IDB4MDAwOTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW4JPSAweDAwMEEwMDQ0Cit9OworZW51bSB7CisJUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZQk9IDB4MDAKK307CitlbnVtIHsKKwlQODAyMTFFTlVNX3RydXRoX2ZhbHNlCQkJPSAweDAwLAorCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZQkJCT0gMHgwMQorfTsKKworLyogRGVmaW5pdGlvbiBmcm9tIG1hZHdpZmkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyIGRpZDsKKyAgICAgICAgVUlOVDE2IHN0YXR1czsKKyAgICAgICAgVUlOVDE2IGxlbjsKKyAgICAgICAgVUlOVDMyIGRhdGE7Cit9IHA4MDIxMWl0ZW1fdWludDMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyIG1zZ2NvZGU7CisgICAgICAgIFVJTlQzMiBtc2dsZW47CisjZGVmaW5lIFdMQU5fREVWTkFNRUxFTl9NQVggMTYKKyAgICAgICAgVUlOVDggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBob3N0dGltZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBtYWN0aW1lOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGNoYW5uZWw7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcnNzaTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzcTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzaWduYWw7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgbm9pc2U7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcmF0ZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBpc3R4OworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGZybWxlbjsKK30gd2xhbl9uZ19wcmlzbTJfaGVhZGVyOworCisvKiBUaGUgcmFkaW8gY2FwdHVyZSBoZWFkZXIgcHJlY2VkZXMgdGhlIDgwMi4xMSBoZWFkZXIuICovCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX2llZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgeworICAgIFVJTlQ4CWl0X3ZlcnNpb247CS8qIFZlcnNpb24gMC4gT25seSBpbmNyZWFzZXMKKwkJCQkgKiBmb3IgZHJhc3RpYyBjaGFuZ2VzLAorCQkJCSAqIGludHJvZHVjdGlvbiBvZiBjb21wYXRpYmxlCisJCQkJICogbmV3IGZpZWxkcyBkb2VzIG5vdCBjb3VudC4KKwkJCQkgKi8KKyAgICBVSU5UOAlpdF9wYWQ7CisgICAgVUlOVDE2ICAgICBpdF9sZW47ICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSB3aG9sZQorCQkJCSAqIGhlYWRlciBpbiBieXRlcywgaW5jbHVkaW5nCisJCQkJICogaXRfdmVyc2lvbiwgaXRfcGFkLAorCQkJCSAqIGl0X2xlbiwgYW5kIGRhdGEgZmllbGRzLgorCQkJCSAqLworICAgIFVJTlQzMiAgIGl0X3ByZXNlbnQ7CS8qIEEgYml0bWFwIHRlbGxpbmcgd2hpY2gKKwkJCQkJICogZmllbGRzIGFyZSBwcmVzZW50LiBTZXQgYml0IDMxCisJCQkJCSAqICgweDgwMDAwMDAwKSB0byBleHRlbmQgdGhlCisJCQkJCSAqIGJpdG1hcCBieSBhbm90aGVyIDMyIGJpdHMuCisJCQkJCSAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBhcmUgbWFkZQorCQkJCQkgKiBieSBzZXR0aW5nIGJpdCAzMS4KKwkJCQkJICovCit9aWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciA7CisKK2VudW0gaWVlZTgwMjExX3JhZGlvdGFwX3R5cGUgeworICAgIElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUID0gMCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgPSAxLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFID0gMiwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCA9IDMsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0ZIU1MgPSA0LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMID0gNSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFID0gNiwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZID0gNywKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gPSA4LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiA9IDksCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUiA9IDEwLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BID0gMTEsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCA9IDEyLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSA9IDEzCit9OworCisjZGVmaW5lIFdMQU5fUkFESU9UQVBfUFJFU0VOVCAoCQkJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUKQl8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpIHwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9SQVRFKSAgfCAJXAorCSAwKQorCit0eXBlZGVmIHN0cnVjdCBfd2xhbl9yYWRpb3RhcF9oZWFkZXIgeworCWllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgd3RfaWhkcjsKKwlJTlQ2NCB3dF90c2Z0OworCVVJTlQ4IHd0X2ZsYWdzOworCVVJTlQ4IHd0X3JhdGU7Cit9IHdsYW5fcmFkaW90YXBfaGVhZGVyOworLyogRGVmaW5pdGlvbiBmcm9tIG1hZHdpZmkgKi8KKwordm9pZCBzZW5kX21vbml0b3JfcGFja2V0cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKKyAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisjZW5kaWYKKworVk9JRCAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIExPTkcgICAgICAgICAgICBSYXRlcyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0lOVAlTZXRfRml4ZWRUeE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK0lOVAlTZXRfT3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCitzdGF0aWMgaW5saW5lIGNoYXIqIEdldFBoeU1vZGUoCisJaW50IE1vZGUpCit7CisJc3dpdGNoKE1vZGUpCisJeworCQljYXNlIE1PREVfQ0NLOgorCQkJcmV0dXJuICJDQ0siOworCisJCWNhc2UgTU9ERV9PRkRNOgorCQkJcmV0dXJuICJPRkRNIjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBNT0RFX0hUTUlYOgorCQkJcmV0dXJuICJIVE1JWCI7CisKKwkJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKKwkJCXJldHVybiAiR1JFRU4iOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJOL0EiOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIGNoYXIqIEdldEJXKAorCWludCBCVykKK3sKKwlzd2l0Y2goQlcpCisJeworCQljYXNlIEJXXzEwOgorCQkJcmV0dXJuICIxME0iOworCisJCWNhc2UgQldfMjA6CisJCQlyZXR1cm4gIjIwTSI7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgQldfNDA6CisJCQlyZXR1cm4gIjQwTSI7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIk4vQSI7CisJfQorfQorCisKK1ZPSUQgUlQyOHh4VGhyZWFkVGVybWluYXRlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCisJSU4gdm9pZCAqX2Rldl9wKTsKKworQk9PTEVBTiBSVDI4WFhOZXREZXZJbml0KAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOworCitCT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCisJSU4gSU5UMzIJCQkJYXJnYyk7CisKK1ZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKKworVk9JRCBSVDI4WFhETUFFbmFibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7CisKK1ZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKKwlJTiBSVE1QX0FEQVBURVIgKiBwQWQsCisJSU4gSU5UIGFwaWR4LAorCUlOIFVMT05HIEJlYWNvbkxlbiwKKwlJTiBVTE9ORyBVcGRhdGVQb3MpOworCitJTlQgcnQyOHh4X2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCWNtZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UIHJ0Mjh4eF9zdGFfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJY21kKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworQk9PTEVBTiBSVDI4WFhTZWN1cml0eUtleUFkZCgKKwlJTgkJUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCQlVTE9ORwkJCQlhcGlkeCwKKwlJTgkJVUxPTkcJCQkJS2V5SWR4LAorCUlOCQlNQUNfVEFCTEVfRU5UUlkgCSpwRW50cnkpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitQTkRJU19QQUNLRVQgR2V0UGFja2V0RnJvbVJ4UmluZygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwlwU2F2ZVJ4RCwKKwlPVVQJCUJPT0xFQU4JCQkqcGJSZXNjaGVkdWxlLAorCUlOIE9VVAlVSU5UMzIJCQkqcFJ4UGVuZGluZyk7CisKKwordm9pZCBraWxsX3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCB0YnR0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKKworI2lmZGVmIFJUMjg2MAorLy8KKy8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBjbW1fZGF0YV8yODYwLmMKKy8vCitVU0hPUlQgUnRtcFBDSV9Xcml0ZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQgUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQgUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJZnJhbWVOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJZnJhZ051bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQgUnRtcFBDSV9Xcml0ZVN1YlR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitWT0lEIFJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAorCUlOCVVTSE9SVAkJCUZpcnN0VHhJZHgpOworCitWT0lEIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVVTSE9SVAkJCUxhc3RUeElkeCk7CisKK1ZPSUQgUnRtcFBDSURhdGFLaWNrT3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlRdWVJZHgpOworCisKK2ludCBSdG1wUENJTWdtdEtpY2tPdXQoCisJSU4gUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOIFVDSEFSIAkJCVF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAorCUlOIFVJTlQgCQkJU3JjQnVmTGVuKTsKKworCitORElTX1NUQVRVUyBSVE1QQ2hlY2tSeEVycm9yKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQSEVBREVSXzgwMl8xMSAgcEhlYWRlciwKKwlJTglQUlhXSV9TVFJVQwlwUnhXSSwKKwlJTiAgUFJUMjhYWF9SWERfU1RSVUMgICAgICBwUnhEKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QSW5pdFBDSWVMaW5rQ3RybFZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QRmluZEhvc3RQQ0lEZXYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICBVQ0hBUgkJTGV2ZWwpOworCitWT0lEIFJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIAlVU0hPUlQJCU1heCk7CisKK1ZPSUQgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFVDSEFSICAgICAgICAgICAgTGV2ZWwsCisJSU4gVVNIT1JUICAgICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgTGV2ZWwpOworCitWT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpOworCitWT0lEIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworVk9JRCBQc1BvbGxXYWtlRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEICBSYWRpb09uRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitWT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PRkYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCitWT0lEIEFzaWNUdXJuT2ZmUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4JVUNIQVIgICAgICAgICAgIENoYW5uZWwpOworCitWT0lEIEFzaWNUdXJuT25SRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1ZPSUQgUUJTU19Mb2FkSW5pdCgKKyAJSU4JCVJUTVBfQURBUFRFUgkqcEFkKTsKKworVUlOVDMyIFFCU1NfTG9hZEVsZW1lbnRBcHBlbmQoCisgCUlOCQlSVE1QX0FEQVBURVIJKnBBZCwKKwlPVVQJCVVJTlQ4CQkJKmJ1Zl9wKTsKKworVk9JRCBRQlNTX0xvYWRVcGRhdGUoCisgCUlOCQlSVE1QX0FEQVBURVIJKnBBZCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE5hbWUsCisJSU4JUFVDSEFSCQkJcEJ1Zik7CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAorICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKTsKKworUENIQVIgICBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKAorICAgIElOICBVU0hPUlQgZW5jcnlNb2RlKTsKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgQXNpY1N0YUJicFR1bmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJlU3luY0JlYWNvblRpbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlCYW5kV2lkdGgpOworCitpbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldik7CitpbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KTsKKworX19pbmxpbmUgSU5UIFZJUlRVQUxfSUZfVVAoUFJUTVBfQURBUFRFUiBwQWQpCit7CitleHRlcm4gVk9JRCBNZXNoTWFrZUJlYWNvbihJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gVUNIQVIgaWR4KTsKK2V4dGVybiBWT0lEIE1lc2hVcGRhdGVCZWFjb25GcmFtZShJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gVUNIQVIgaWR4KTsKKworCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCisJeworCQlpZiAocnQyOHh4X29wZW4ocEFkLT5uZXRfZGV2KSAhPSAwKQorCQkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJeworCX0KKwlWSVJUVUFMX0lGX0lOQyhwQWQpOworCXJldHVybiAwOworfQorCitfX2lubGluZSBWT0lEIFZJUlRVQUxfSUZfRE9XTihQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlWSVJUVUFMX0lGX0RFQyhwQWQpOworCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCisJCXJ0Mjh4eF9jbG9zZShwQWQtPm5ldF9kZXYpOworCXJldHVybjsKK30KKworCisjZW5kaWYgIC8vIF9fUlRNUF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NraXBtaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9ja2lwbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkOTQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9ja2lwbWljLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9ja2lwbWljLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisjaWZuZGVmCV9fUlRNUF9DS0lQTUlDX0hfXworI2RlZmluZQlfX1JUTVBfQ0tJUE1JQ19IX18KKwordHlwZWRlZglzdHJ1Y3QJX01JQ19DT05URVhUCXsKKwkvKiAtLS0gTU1IIGNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlVQ0hBUgkJQ0tbMTZdOwkJCQkvKiB0aGUga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlVQ0hBUgkJY29lZmZpY2llbnRbMTZdOwkvKiBjdXJyZW50IGFlcyBjb3VudGVyIG1vZGUgY29lZmZpY2llbnRzICAgICAgKi8KKwlVTE9OR0xPTkcJYWNjdW07CQkJCS8qIGFjY3VtdWxhdGVkIG1pYywgcmVkdWNlZCB0byB1MzIgaW4gZmluYWwoKSAqLworCVVJTlQJCXBvc2l0aW9uOwkJCS8qIGN1cnJlbnQgcG9zaXRpb24gKGJ5dGUgb2Zmc2V0KSBpbiBtZXNzYWdlICAqLworCVVDSEFSCQlwYXJ0WzRdOwkJCS8qIGZvciBjb252ZXJzaW9uIG9mIG1lc3NhZ2UgdG8gdTMyIGZvciBtbWggICAqLworfQlNSUNfQ09OVEVYVCwgKlBNSUNfQ09OVEVYVDsKKworVk9JRAlDS0lQX2tleV9wZXJtdXRlKAorCU9VVAlVQ0hBUgkqUEssCQkJLyogb3V0cHV0IHBlcm11dGVkIGtleSAqLworCUlOCVVDSEFSCSpDSywJCQkvKiBpbnB1dCBDS0lQIGtleSAqLworCUlOCVVDSEFSCXRvRHNGcm9tRHMsCQkvKiBpbnB1dCB0b0RzL0Zyb21EcyBiaXRzICovCisJSU4JVUNIQVIJKnBpdik7CQkJLyogaW5wdXQgcG9pbnRlciB0byBJViAqLworCitWT0lECVJUTVBDa2lwTWljSW5pdCgKKwlJTglQTUlDX0NPTlRFWFQJCXBDb250ZXh0LAorCUlOCVBVQ0hBUgkJCQlDSyk7CisKK1ZPSUQgUlRNUE1pY1VwZGF0ZSgKKyAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICBwQ29udGV4dCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBwT2N0ZXRzLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGxlbik7CisKK1VMT05HIFJUTVBNaWNHZXRDb2VmZmljaWVudCgKKyAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICAgcENvbnRleHQpOworCitWT0lEIHhvcl8xMjgoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1VDSEFSIFJUTVBDa2lwU2JveCgKKyAgICBJTiAgVUNIQVIgICAgICAgICAgICAgICBhKTsKKworVk9JRCB4b3JfMzIoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbmV4dF9rZXkoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKKworVk9JRCBieXRlX3N1YigKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHNoaWZ0X3JvdygKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG1peF9jb2x1bW4oCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBSVE1QQWVzRW5jcnlwdCgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgZGF0YSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBjaXBoZXJ0ZXh0KTsKKworVk9JRCBSVE1QTWljRmluYWwoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgcENvbnRleHQsCisgICAgT1VUIFVDSEFSICAgICAgICAgICAgICAgZGlnZXN0WzRdKTsKKworVk9JRCBSVE1QQ2tpcEluc2VydENNSUMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICBwTUlDLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcDgwMjExaGRyLAorICAgIElOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCwKKyAgICBJTiAgUENJUEhFUl9LRVkgICAgIHBLZXksCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBtaWNfc25hcCk7CisKKyNlbmRpZiAvL19fUlRNUF9DS0lQTUlDX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNmYzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKQEAgLTAsMCArMSwxNTg4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXBfZGVmLmgKKworICAgIEFic3RyYWN0OgorICAgIE1pbmlwb3J0IHJlbGF0ZWQgZGVmaW5pdGlvbiBoZWFkZXIKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGF1bCBMaW4gICAgMDgtMDEtMjAwMiAgICBjcmVhdGVkCisgICAgSm9obiBDaGFuZyAgMDgtMDUtMjAwMyAgICBhZGQgZGVmaW5pdGlvbiBmb3IgMTFnICYgb3RoZXIgZHJhZnRzCisqLworI2lmbmRlZiBfX1JUTVBfREVGX0hfXworI2RlZmluZSBfX1JUTVBfREVGX0hfXworCisjaW5jbHVkZSAib2lkLmgiCisKKy8vCisvLyAgRGVidWcgaW5mb3JtYXRpb24gdmVyYm9zaXR5OiBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgaGlnaGVyIHVyZ2VuY3kKKy8vCisjZGVmaW5lIFJUX0RFQlVHX09GRiAgICAgICAgMAorI2RlZmluZSBSVF9ERUJVR19FUlJPUiAgICAgIDEKKyNkZWZpbmUgUlRfREVCVUdfV0FSTiAgICAgICAyCisjZGVmaW5lIFJUX0RFQlVHX1RSQUNFICAgICAgMworI2RlZmluZSBSVF9ERUJVR19JTkZPICAgICAgIDQKKyNkZWZpbmUgUlRfREVCVUdfTE9VRCAgICAgICA1CisKKyNkZWZpbmUgTklDX1RBRyAgICAgICAgICAgICAoKFVMT05HKScwNjgyJykKKyNkZWZpbmUgTklDX0RCR19TVFJJTkcgICAgICAoIioqUlQyOHh4KioiKQorCisjaWZkZWYgU05NUF9TVVBQT1JUCisvLyBmb3Igc25tcAorLy8gdG8gZ2V0IG1hbnVmYWN0dXJlciBPVUksIGthdGh5LCAyMDA4XzAyMjAKKyNkZWZpbmUgTWFudWZhY3R1cmVyT1VJX0xFTgkJCTMKKyNkZWZpbmUgTWFudWZhY3R1cmVyTkFNRQkJCSgiUmFsaW5rIFRlY2hub2xvZ3kgQ29tcGFueS4iKQorI2RlZmluZQlSZXNvdXJjZVR5cGVJZE5hbWUJCQkoIlJhbGlua19JRCIpCisjZW5kaWYKKworCisjZGVmaW5lIFJBTElOS18yODgzX1ZFUlNJT04JCSgoVUlOVDMyKTB4Mjg4MzAzMDApCisjZGVmaW5lIFJBTElOS18yODgwRV9WRVJTSU9OCSgoVUlOVDMyKTB4Mjg3MjAyMDApCisjZGVmaW5lIFJBTElOS18zMDcwX1ZFUlNJT04JCSgoVUlOVDMyKTB4MzA3MDAyMDApCisKKy8vCisvLyBORElTIHZlcnNpb24gaW4gdXNlIGJ5IHRoZSBOSUMgZHJpdmVyLgorLy8gVGhlIGhpZ2ggYnl0ZSBpcyB0aGUgbWFqb3IgdmVyc2lvbi4gVGhlIGxvdyBieXRlIGlzIHRoZSBtaW5vciB2ZXJzaW9uLgorLy8KKyNpZmRlZiAgTkRJUzUxX01JTklQT1JUCisjZGVmaW5lIE5JQ19EUklWRVJfVkVSU0lPTiAgICAgIDB4MDUwMQorI2Vsc2UKKyNkZWZpbmUgTklDX0RSSVZFUl9WRVJTSU9OICAgICAgMHgwNTAwCisjZW5kaWYKKworLy8KKy8vIE5ESVMgbWVkaWEgdHlwZSwgY3VycmVudCBpcyBldGhlcm5ldCwgY2hhbmdlIGlmIG5hdGl2ZSB3aXJlbGVzcyBzdXBwb3J0ZWQKKy8vCisjZGVmaW5lIE5JQ19NRURJQV9UWVBFICAgICAgICAgIE5kaXNNZWRpdW04MDJfMworI2RlZmluZSBOSUNfUENJX0hEUl9MRU5HVEggICAgICAweGUyCisjZGVmaW5lIE5JQ19NQVhfUEFDS0VUX1NJWkUgICAgIDIzMDQKKyNkZWZpbmUgTklDX0hFQURFUl9TSVpFICAgICAgICAgMTQKKyNkZWZpbmUgTUFYX01BUF9SRUdJU1RFUlNfTkVFREVEIDMyCisjZGVmaW5lIE1JTl9NQVBfUkVHSVNURVJTX05FRURFRCAyICAgLy9Ub2RvOiBzaG91bGQgY29uc2lkZXIgZnJhZ21lbnQgaXNzdWUuCisKKy8vCisvLyBpbnRlcmZhY2UgdHlwZSwgd2UgdXNlIFBDSQorLy8KKyNkZWZpbmUgTklDX0lOVEVSRkFDRV9UWVBFICAgICAgTmRpc0ludGVyZmFjZVBjaQorI2RlZmluZSBOSUNfSU5URVJSVVBUX01PREUgICAgICBOZGlzSW50ZXJydXB0TGV2ZWxTZW5zaXRpdmUKKworLy8KKy8vIGJ1ZmZlciBzaXplIHBhc3NlZCBpbiBOZGlzTVF1ZXJ5QWRhcHRlclJlc291cmNlcworLy8gV2Ugc2hvdWxkIG9ubHkgbmVlZCB0aHJlZSBhZGFwdGVyIHJlc291cmNlcyAoSU8sIGludGVycnVwdCBhbmQgbWVtb3J5KSwKKy8vIFNvbWUgZGV2aWNlcyBnZXQgZXh0cmEgcmVzb3VyY2VzLCBzbyBoYXZlIHJvb20gZm9yIDEwIHJlc291cmNlcworLy8gICAgICAgICAgICAgICAgICAgIFVGX1NJWkUgICAoc2l6ZW9mKE5ESVNfUkVTT1VSQ0VfTElTVCkgKyAoMTAqc2l6ZW9mKENNX1BBUlRJQUxfUkVTT1VSQ0VfREVTQ1JJUFRPUikpKQorCisKKyNkZWZpbmUgTklDX1JFU09VUkNFX0IvLworLy8gSU8gc3BhY2UgbGVuZ3RoCisvLworI2RlZmluZSBOSUNfTUFQX0lPU1BBQ0VfTEVOR1RIICBzaXplb2YoQ1NSX1NUUlVDKQorCisjZGVmaW5lIE1BWF9SWF9QS1RfTEVOCTE1MjAKKworLy8KKy8vIEVudHJ5IG51bWJlciBmb3IgZWFjaCBETUEgZGVzY3JpcHRvciByaW5nCisvLworCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgICAgICAgIDY0IC8vNjQKKyNkZWZpbmUgTUdNVF9SSU5HX1NJWkUgICAgICAgICAgMTI4CisjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAgICAgICAgIDEyOCAvLzY0CisjZGVmaW5lIE1BWF9UWF9QUk9DRVNTICAgICAgICAgIFRYX1JJTkdfU0laRSAvLzgKKyNkZWZpbmUgTUFYX0RNQV9ET05FX1BST0NFU1MgICAgVFhfUklOR19TSVpFCisjZGVmaW5lIE1BWF9UWF9ET05FX1BST0NFU1MgICAgIFRYX1JJTkdfU0laRSAvLzgKKyNkZWZpbmUgTE9DQUxfVFhCVUZfU0laRSAgICAgICAgMgorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKy8vIE1DOiBNdWx0cGxlIENhcmRzCisjZGVmaW5lIE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRAkJMzIKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworI2RlZmluZSBNQVhfUlhfUFJPQ0VTUyAgICAgICAgICAxMjggLy82NCAvLzMyCisjZGVmaW5lIE5VTV9PRl9MT0NBTF9UWEJVRiAgICAgIDIKKyNkZWZpbmUgVFhEX1NJWkUgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFhXSV9TSVpFICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUlhEX1NJWkUgICAgICAgICAgICAgICAJMTYKKyNkZWZpbmUgUlhXSV9TSVpFICAgICAgICAgICAgIAkxNgorLy8gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyA4MDIuMTEgSGVhZGVyIFNpemUgKyBBTVNEVSBzdWIgZnJhbWUgaGVhZGVyCisjZGVmaW5lIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkUgIDk2ICAgIC8vIG9ubHkgdGhlIDFzdCBwaHlzaWNhbCBidWZmZXIgaXMgcHJlLWFsbG9jYXRlZAorI2RlZmluZSBNR01UX0RNQV9CVUZGRVJfU0laRSAgICAxNTM2IC8vMjA0OAorI2RlZmluZSBSWF9CVUZGRVJfQUdHUkVTSVpFICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKKyNkZWZpbmUgUlhfQlVGRkVSX05PUk1TSVpFICAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2CisjZGVmaW5lIFRYX0JVRkZFUl9OT1JNU0laRQkJUlhfQlVGRkVSX05PUk1TSVpFCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAgICAgICAgIDIzNDYgICAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gODAyLjExIGZyYW1lIHNpemUKKyNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX1NJWkUgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NgorI2RlZmluZSBNQVhfTlVNX09GX1RVUExFX0NBQ0hFICAyCisjZGVmaW5lIE1BWF9NQ0FTVF9MSVNUX1NJWkUgICAgIDMyCisjZGVmaW5lIE1BWF9MRU5fT0ZfVkVORE9SX0RFU0MgIDY0CisvLyNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgKE5VTV9PRl9MT0NBTF9UWEJVRiA+PiAyKSAvLyBBUCB3b24ndCBzcGVuZCBtb3JlIHRoYW4gMS80IG9mIHRvdGFsIGJ1ZmZlcnMgb24gTS9CQ0FTVCBQU1EKKyNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBNQVhfUlhfUFJPQ0VTU19DTlQJKFJYX1JJTkdfU0laRSkKKworCisjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1FVRVVFCQkJCSg1MTIpIC8vKDUxMikgICAgLy8gdG8gcGFzcyBXTU0gQTUtV1BBUFNLCisjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX01DQVNUX1BTX1FVRVVFCQkzMgorI2RlZmluZSBNQVhfUEFDS0VUU19JTl9QU19RVUVVRQkJCQkxMjgJLy8zMgorI2RlZmluZSBXTU1fTlVNX09GX0FDICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBQzAsIEFDMSwgQUMyLCBhbmQgQUMzICovCisKKworCisvLyBSeEZpbHRlcgorI2RlZmluZSBTVEFOT1JNQUwJIDB4MTdmOTcKKyNkZWZpbmUgQVBOT1JNQUwJIDB4MTVmOTcKKy8vCisvLyAgUlRNUF9BREFQVEVSIGZsYWdzCisvLworI2RlZmluZSBmUlRNUF9BREFQVEVSX01BUF9SRUdJU1RFUiAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUiAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQVRURVJfR0FUSEVSICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU0VORF9QQUNLRVRfRVJST1IgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NTE1FX1JFU0VUX0lOX1BST0dSRVNTIDB4MDAwMDAwMjAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTICAgICAweDAwMDAwMDgwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9UWF9SSU5HX0FMTE9DQVRFRCAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyAgICAweDAwMDAwNDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUlNT1JBVEVfSU5VU0VEICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SWF9SSU5HX0FMTE9DQVRFRCAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MgIDB4MDAwMDQwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9SRUFTU09DX0lOX1BST0dSRVNTCTB4MDAwMDgwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9QRU5ESU5HCTB4MDAwMTAwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9SQURJT19PRkYJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQJCQkweDAwMDQwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUCQkJMHgwMDA4MDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1JER19BQ1RJVkUJCQkweDAwMTAwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSAweDAwMjAwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU0NBTl8yMDQwIAkJCTB4MDQwMDAwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVAkJMHgwODAwMDAwMAorCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU1RBUlRfVVAgICAgICAgICAJCTB4MTAwMDAwMDAJLy9EZXZpdmUgYWxyZWFkeSBpbml0aWFsaXplZCBhbmQgZW5hYmxlZCBUeC9SeC4KKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UgICAgMHgyMDAwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGICAgICAgICAweDQwMDAwMDAwCisKKy8vCisvLyAgU1RBIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKKy8vCisjZGVmaW5lIGZPUF9TVEFUVVNfSU5GUkFfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgZk9QX1NUQVRVU19BREhPQ19PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEICAgICAweDAwMDAwMDA0CisjZGVmaW5lIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQgICAgMHgwMDAwMDAxMAorI2RlZmluZSBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgZk9QX1NUQVRVU19XTU1fSU5VU0VEICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIGZPUF9TVEFUVVNfRE9aRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vIGRlYnVnIHB1cnBvc2UKKyNkZWZpbmUgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEICAgICAgICAgMHgwMDAwMDgwMCAgLy8gcGlnZ3ktYmFjaywgYW5kIGFnZ3JlZ2F0aW9uCisjZGVmaW5lIGZPUF9TVEFUVVNfQVBTRF9JTlVTRUQJCQkJMHgwMDAwMTAwMAorI2RlZmluZSBmT1BfU1RBVFVTX1RYX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19NQVhfUkVUUllfRU5BQkxFRAkJMHgwMDAwNDAwMAorI2RlZmluZSBmT1BfU1RBVFVTX1dBS0VVUF9OT1cgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFICAgICAgIDB4MDAwMjAwMDAKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgZk9QX1NUQVRVU19TQ0FOXzIwNDAgICAgICAgICAgICAgICAJICAgIDB4MDAwNDAwMDAKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyNkZWZpbmUgQ0NLU0VUUFJPVEVDVAkJMHgxCisjZGVmaW5lIE9GRE1TRVRQUk9URUNUCQkweDIKKyNkZWZpbmUgTU0yMFNFVFBST1RFQ1QJCTB4NAorI2RlZmluZSBNTTQwU0VUUFJPVEVDVAkJMHg4CisjZGVmaW5lIEdGMjBTRVRQUk9URUNUCQkweDEwCisjZGVmaW5lIEdSNDBTRVRQUk9URUNUCQkweDIwCisjZGVmaW5lIEFMTE5fU0VUUFJPVEVDVAkJKEdSNDBTRVRQUk9URUNUIHwgR0YyMFNFVFBST1RFQ1QgfCBNTTQwU0VUUFJPVEVDVCB8IE1NMjBTRVRQUk9URUNUKQorCisvLworLy8gIEFQJ3MgY2xpZW50IHRhYmxlIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKKy8vCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFICAgICAgICAgIDB4MDAwMDAwMDEgIC8vIENMSUVOVCBjYW4gcGFyc2UgUU9TIERBVEEgZnJhbWUKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSAgMHgwMDAwMDAwMiAgLy8gQ0xJRU5UIGNhbiByZWNlaXZlIFJhbGluaydzIHByb3ByaWV0YXJ5IFRYIGFnZ3JlZ2F0aW9uIGZyYW1lCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFICAgIDB4MDAwMDAwMDQgIC8vIENMSUVOVCBzdXBwb3J0IHBpZ2d5LWJhY2sKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECQkJMHgwMDAwMDAwOAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFCQkweDAwMDAwMDEwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUJCTB4MDAwMDAwMjAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwNDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwODAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUJCQkweDAwMDAwMTAwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFCQkJMHgwMDAwMDIwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFICAweDAwMDAwNDAwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFVBUFNEIFNUQVRJT04gKi8KKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQlNTQ09FWElTVF9DQVBBQkxFCTB4MDAwMDEwMDAKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQJCTB4MDAxMDAwMDAKKy8vCisvLyAgU1RBIGNvbmZpZ3VyYXRpb24gZmxhZ3MKKy8vCisKKy8vIDgwMi4xMW4gT3BlcmF0aW5nIE1vZGUgRGVmaW5pdGlvbi4gMC0zIGFsc28gdXNlZCBpbiBBU0lDVVBkYXRlUHJvdGVjdCBzd2l0Y2ggY2FzZQorI2RlZmluZSBIVF9OT19QUk9URUNUCTAKKyNkZWZpbmUgSFRfTEVHQUNZX1BST1RFQ1QJMQorI2RlZmluZSBIVF80MF9QUk9URUNUCTIKKyNkZWZpbmUgSFRfMjA0MF9QUk9URUNUCTMKKyNkZWZpbmUgSFRfUlRTQ1RTXzZNCTcKKy8vZm9sbG93aW5nIGlzIG91ciBvd24gZGVmaW5pdGlvbiBpbiBvcmRlciB0byB0dXJuIG9uIG91ciBBU0lDIHByb3RlY3Rpb24gcmVnaXN0ZXIgaW4gSU5GUkFTVFJVQ1RVUkUuCisjZGVmaW5lIEhUX0FUSEVST1MJOAkvLyBydDI4NjBjIGhhcyBwcm9ibGVtIHdpdGggYXRoZXJvcyBjaGlwLiB3ZSBuZWVkIHRvIHR1cm4gb24gUlRTL0NUUyAuCisjZGVmaW5lIEhUX0ZPUkNFUlRTQ1RTCTkJLy8gRm9yY2UgdHVybiBvbiBSVFMvQ1RTIGZpcnN0LiB0aGVuIGdvIHRvIGV2YWx1YXRlIGlmIHRoaXMgZm9yY2UgUlRTIGlzIG5lY2Vzc2FyeS4KKworLy8KKy8vIFJYIFBhY2tldCBGaWx0ZXIgY29udHJvbCBmbGFncy4gQXBwbHkgb24gcEFkLT5QYWNrZXRGaWx0ZXIKKy8vCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0RJUkVDVCAgICAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQKKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfTVVMVElDQVNUICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9NVUxUSUNBU1QKKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfQlJPQURDQVNUICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QKKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfQUxMX01VTFRJQ0FTVCAgICAgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCisKKy8vCisvLyBFcnJvciBjb2RlIHNlY3Rpb24KKy8vCisvLyBORElTX0VSUk9SX0NPREVfQURBUFRFUl9OT1RfRk9VTkQKKyNkZWZpbmUgRVJSTE9HX1JFQURfUENJX1NMT1RfRkFJTEVEICAgICAweDAwMDAwMTAxTAorI2RlZmluZSBFUlJMT0dfV1JJVEVfUENJX1NMT1RfRkFJTEVEICAgIDB4MDAwMDAxMDJMCisjZGVmaW5lIEVSUkxPR19WRU5ET1JfREVWSUNFX05PTUFUQ0ggICAgMHgwMDAwMDEwM0wKKworLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfRElTQUJMRUQKKyNkZWZpbmUgRVJSTE9HX0JVU19NQVNURVJfRElTQUJMRUQgICAgICAweDAwMDAwMjAxTAorCisvLyBORElTX0VSUk9SX0NPREVfVU5TVVBQT1JURURfQ09ORklHVVJBVElPTgorI2RlZmluZSBFUlJMT0dfSU5WQUxJRF9TUEVFRF9EVVBMRVggICAgIDB4MDAwMDAzMDFMCisjZGVmaW5lIEVSUkxPR19TRVRfU0VDT05EQVJZX0ZBSUxFRCAgICAgMHgwMDAwMDMwMkwKKworLy8gTkRJU19FUlJPUl9DT0RFX09VVF9PRl9SRVNPVVJDRVMKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAweDAwMDAwNDAxTAorI2RlZmluZSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlkgICAgIDB4MDAwMDA0MDJMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUFQX1JFR0lTVEVSUyAgICAgMHgwMDAwMDQwM0wKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9CVUZGRVJfUE9PTCAgICAgICAweDAwMDAwNDA0TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX05ESVNfQlVGRkVSICAgICAgIDB4MDAwMDA0MDVMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfUEFDS0VUX1BPT0wgICAgICAgMHgwMDAwMDQwNkwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX1BBQ0tFVCAgICAgICAweDAwMDAwNDA3TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX0xPT0tBU0lERV9NRU1PUlkgIDB4MDAwMDA0MDhMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9IQVJEV0FSRV9GQUlMVVJFCisjZGVmaW5lIEVSUkxPR19TRUxGVEVTVF9GQUlMRUQgICAgICAgICAgMHgwMDAwMDUwMUwKKyNkZWZpbmUgRVJSTE9HX0lOSVRJQUxJWkVfQURBUFRFUiAgICAgICAweDAwMDAwNTAyTAorI2RlZmluZSBFUlJMT0dfUkVNT1ZFX01JTklQT1JUICAgICAgICAgIDB4MDAwMDA1MDNMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9SRVNPVVJDRV9DT05GTElDVAorI2RlZmluZSBFUlJMT0dfTUFQX0lPX1NQQUNFICAgICAgICAgICAgIDB4MDAwMDA2MDFMCisjZGVmaW5lIEVSUkxPR19RVUVSWV9BREFQVEVSX1JFU09VUkNFUyAgMHgwMDAwMDYwMkwKKyNkZWZpbmUgRVJSTE9HX05PX0lPX1JFU09VUkNFICAgICAgICAgICAweDAwMDAwNjAzTAorI2RlZmluZSBFUlJMT0dfTk9fSU5URVJSVVBUX1JFU09VUkNFICAgIDB4MDAwMDA2MDRMCisjZGVmaW5lIEVSUkxPR19OT19NRU1PUllfUkVTT1VSQ0UgICAgICAgMHgwMDAwMDYwNUwKKworCisvLyBXRFMgZGVmaW5pdGlvbgorI2RlZmluZQlNQVhfV0RTX0VOVFJZICAgICAgICAgICAgICAgNAorI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgNjAgICAgLy8gV0RTIGxpbmtzIHVzZXMgcGFpcndpc2Uga2V5IzYwIH4gNjMgaW4gQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKworI2RlZmluZQlXRFNfRElTQUJMRV9NT0RFICAgICAgICAgICAgMAorI2RlZmluZQlXRFNfUkVTVFJJQ1RfTU9ERSAgICAgICAgICAgMQorI2RlZmluZQlXRFNfQlJJREdFX01PREUgICAgICAgICAgICAgMgorI2RlZmluZQlXRFNfUkVQRUFURVJfTU9ERSAgICAgICAgICAgMworI2RlZmluZQlXRFNfTEFaWV9NT0RFICAgICAgICAgICAgICAgNAorCisKKyNkZWZpbmUgTUFYX01FU0hfTlVNCQkJCTAKKworI2RlZmluZSBNQVhfQVBDTElfTlVNCQkJCTAKKyNpZmRlZiBBUENMSV9TVVBQT1JUCisjdW5kZWYJTUFYX0FQQ0xJX05VTQorI2RlZmluZSBNQVhfQVBDTElfTlVNCQkJCTEKKyNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgTUFYX01CU1NJRF9OVU0JCQkJMQorI2lmZGVmIE1CU1NfU1VQUE9SVAorI3VuZGVmCU1BWF9NQlNTSURfTlVNCisjZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCSg4IC0gTUFYX01FU0hfTlVNIC0gTUFYX0FQQ0xJX05VTSkKKyNlbmRpZiAvLyBNQlNTX1NVUFBPUlQgLy8KKworLyogc2FuaXR5IGNoZWNrIGZvciBhcGlkeCAqLworI2RlZmluZSBNQlNTX01SX0FQSURYX1NBTklUWV9DSEVDSyhhcGlkeCkgXAorICAgIHsgaWYgKGFwaWR4ID4gTUFYX01CU1NJRF9OVU0pIHsgXAorICAgICAgICAgIHByaW50aygiJXM+IEVycm9yISBhcGlkeCA9ICVkID4gTUFYX01CU1NJRF9OVU0hXG4iLCBfX0ZVTkNUSU9OX18sIGFwaWR4KTsgXAorCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9CisKKyNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCisKKyNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKKworCisjZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKKy8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAorLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KKy8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KKy8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KKyNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKKyNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIzOAorI2Vsc2UKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKKyNlbmRpZgorCisvLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgorI2RlZmluZSBERlNfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDEpCisjZGVmaW5lIENTX0NUU19XQ0lEIAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorI2RlZmluZSBMQVNUX1NQRUNJRklDX1dDSUQJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorCisvLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4KKy8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LgorI2RlZmluZSBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECShMQVNUX1NQRUNJRklDX1dDSUQgLSBNQVhfTUJTU0lEX05VTSAtIDEpCisKKy8vIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkKKy8vIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LgorI2RlZmluZSBHRVRfR3JvdXBLZXlfV0NJRChfX3djaWQsIF9fYnNzaWR4KSBcCisJewkJCQkJCQkJCQlcCisJCV9fd2NpZCA9IExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkgKyBfX2Jzc2lkeDsJXAorCX0KKworI2RlZmluZSBJc0dyb3VwS2V5V0NJRChfX3djaWQpICgoKF9fd2NpZCkgPCBMQVNUX1NQRUNJRklDX1dDSUQpICYmICgoX193Y2lkKSA+PSAoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSkpKQorCisKKy8vIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRAorI2RlZmluZSBCU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQlNTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJTUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCU1M2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQlNTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExlbmd0aCBkZWZpbml0aW9ucworI2RlZmluZSBQRUVSX0tFWV9OTyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRJTUVTVEFNUF9MRU4gICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUyAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKKyNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KKyNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBBU0lDIFdDSUQgVGFibGUgZGVmaW5pdGlvbi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEJTU0lEX1dDSUQJCTEJLy8gaW4gaW5mcmEgbW9kZSwgYWx3YXlzIHB1dCBic3NpZCB3aXRoIHRoaXMgV0NJRAorI2RlZmluZSBNQ0FTVF9XQ0lECTB4MAorI2RlZmluZSBCU1MwTWNhc3RfV0NJRAkweDAKKyNkZWZpbmUgQlNTMU1jYXN0X1dDSUQJMHhmOAorI2RlZmluZSBCU1MyTWNhc3RfV0NJRAkweGY5CisjZGVmaW5lIEJTUzNNY2FzdF9XQ0lECTB4ZmEKKyNkZWZpbmUgQlNTNE1jYXN0X1dDSUQJMHhmYgorI2RlZmluZSBCU1M1TWNhc3RfV0NJRAkweGZjCisjZGVmaW5lIEJTUzZNY2FzdF9XQ0lECTB4ZmQKKyNkZWZpbmUgQlNTN01jYXN0X1dDSUQJMHhmZQorI2RlZmluZSBSRVNFUlZFRF9XQ0lECQkweGZmCisKKyNkZWZpbmUgTUFYX05VTV9PRl9BQ0xfTElTVAkJCQlNQVhfTlVNQkVSX09GX0FDTAorCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUFDX1RBQkxFICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9NQUMgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKworI2lmIE1BWF9MRU5fT0ZfTUFDX1RBQkxFPk1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQKKyNlcnJvciBNQVhfTEVOX09GX01BQ19UQUJMRSBjYW4gbm90IGJlIGxhcmdlciB0aGFuIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQhISEhCisjZW5kaWYKKworI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lECSAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX05VTV9PRl9XRFNfTElOSwkgICAgICAgICAgICAoTUFYX05VTV9PRl9XRFNfTElOS19QRVJCU1NJRCpNQVhfTUJTU0lEX05VTSkKKyNkZWZpbmUgTUFYX05VTV9PRl9FVkVOVCAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX0VWRU5UCisjZGVmaW5lIFdEU19MSU5LX1NUQVJUX1dDSUQJCQkJKE1BWF9MRU5fT0ZfTUFDX1RBQkxFLTEpCisKKyNkZWZpbmUgTlVNX09GX1RJRAkJCTgKKyNkZWZpbmUgTUFYX0FJRF9CQSAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikJIC8vQmxvY2sgQUNLIHJlY2lwaWVudAorI2RlZmluZSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAvLyBCbG9jayBBQ0sgb3JpZ2luYXRvcgorI2RlZmluZSBNQVhfTEVOX09GX0JTU19UQUJMRSAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfUkVPUkRFUklOR19NUERVX05VTQkJCSA1MTIKKworLy8ga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgU0hBUkVfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9MRU5fT0ZfU0hBUkVfS0VZICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAorI2RlZmluZSBNQVhfTEVOX09GX1BFRVJfS0VZICAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKKyNkZWZpbmUgUEFJUldJU0VfS0VZX05VTSAgICAgICAgICAgICAgICA2NCAgICAvLyBpbiBNQUMgQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKyNkZWZpbmUgR1JPVVBfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBNS19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZQlQTUtJRF9OTyAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8vIE51bWJlciBvZiBQTUtJRCBzYXZlZCBzdXBwb3J0ZWQKKyNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX0JVRkZFUiAgICAgICAgICAyMDQ4CisKKy8vIHBvd2VyIHN0YXR1cyByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIFBXUl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQV1JfU0FWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUFdSX01NUFMgICAgICAgICAgICAgICAgICAgICAgICAyCQkJLy9NSU1PIHBvd2VyIHNhdmUKKworLy8gQXV0aCBhbmQgQXNzb2MgbW9kZSByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIEFVVEhfTU9ERV9PUEVOICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBVVRIX01PREVfS0VZICAgICAgICAgICAgICAgICAgIDB4MDEKKworLy8gQlNTIFR5cGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgQlNTX0FESE9DICAgICAgICAgICAgICAgICAgICAgICAwICAvLyA9IE5kaXM4MDJfMTFJQlNTCisjZGVmaW5lIEJTU19JTkZSQSAgICAgICAgICAgICAgICAgICAgICAgMSAgLy8gPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUKKyNkZWZpbmUgQlNTX0FOWSAgICAgICAgICAgICAgICAgICAgICAgICAyICAvLyA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bgorI2RlZmluZSBCU1NfTU9OSVRPUgkJCSAgICAgICAgICAgIDMgIC8vID0gTmRpczgwMl8xMU1vbml0b3IKKworCisvLyBSZWFzb24gY29kZSBkZWZpbml0aW9ucworI2RlZmluZSBSRUFTT05fUkVTRVJWRUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVBU09OX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFQVNPTl9OT19MT05HRVJfVkFMSUQgICAgICAgICAgMgorI2RlZmluZSBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HICAgICAgIDMKKyNkZWZpbmUgUkVBU09OX0RJU0FTU09DX0lOQUNUSVZFICAgICAgICA0CisjZGVmaW5lIFJFQVNPTl9ESVNBU1NQQ19BUF9VTkFCTEUgICAgICAgNQorI2RlZmluZSBSRUFTT05fQ0xTMkVSUiAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVBU09OX0NMUzNFUlIgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyAgICAgOAorI2RlZmluZSBSRUFTT05fU1RBX1JFUV9BU1NPQ19OT1RfQVVUSCAgIDkKKyNkZWZpbmUgUkVBU09OX0lOVkFMSURfSUUgICAgICAgICAgICAgICAxMworI2RlZmluZSBSRUFTT05fTUlDX0ZBSUxVUkUgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFJFQVNPTl80X1dBWV9USU1FT1VUICAgICAgICAgICAgMTUKKyNkZWZpbmUgUkVBU09OX0dST1VQX0tFWV9IU19USU1FT1VUICAgICAxNgorI2RlZmluZSBSRUFTT05fSUVfRElGRkVSRU5UICAgICAgICAgICAgIDE3CisjZGVmaW5lIFJFQVNPTl9NQ0lQSEVSX05PVF9WQUxJRCAgICAgICAgMTgKKyNkZWZpbmUgUkVBU09OX1VDSVBIRVJfTk9UX1ZBTElEICAgICAgICAxOQorI2RlZmluZSBSRUFTT05fQUtNUF9OT1RfVkFMSUQgICAgICAgICAgIDIwCisjZGVmaW5lIFJFQVNPTl9VTlNVUFBPUlRfUlNORV9WRVIgICAgICAgMjEKKyNkZWZpbmUgUkVBU09OX0lOVkFMSURfUlNORV9DQVAgICAgICAgICAyMgorI2RlZmluZSBSRUFTT05fODAyMVhfQVVUSF9GQUlMICAgICAgICAgIDIzCisjZGVmaW5lIFJFQVNPTl9DSVBIRVJfU1VJVEVfUkVKRUNURUQgICAgMjQKKyNkZWZpbmUgUkVBU09OX0RFQ0xJTkVEICAgICAgICAgICAgICAgICAzNworCisjZGVmaW5lIFJFQVNPTl9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAzMgorI2RlZmluZSBSRUFTT05fUU9TX0xBQ0tfQkFORFdJRFRIICAgICAgICAgMzMKKyNkZWZpbmUgUkVBU09OX1BPT1JfQ0hBTk5FTF9DT05ESVRJT04gICAgIDM0CisjZGVmaW5lIFJFQVNPTl9RT1NfT1VUU0lERV9UWE9QX0xJTUlUSU9OICAzNQorI2RlZmluZSBSRUFTT05fUU9TX1FTVEFfTEVBVklOR19RQlNTICAgICAgMzYKKyNkZWZpbmUgUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU00gICAgIDM3CisjZGVmaW5lIFJFQVNPTl9RT1NfTUVDSF9TRVRVUF9SRVFVSVJFRCAgICAzOAorI2RlZmluZSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVCAgICAgICAgMzkKKyNkZWZpbmUgUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQgICAgIDQ1CisKKy8vIFN0YXR1cyBjb2RlIGRlZmluaXRpb25zCisjZGVmaW5lIE1MTUVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNTE1FX1VOU1BFQ0lGWV9GQUlMICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUxNRV9DQU5OT1RfU1VQUE9SVF9DQVAgICAgICAgICAxMAorI2RlZmluZSBNTE1FX1JFQVNTT0NfREVOWV9BU1NPQ19FWElTVCAgIDExCisjZGVmaW5lIE1MTUVfQVNTT0NfREVOWV9PVVRfU0NPUEUgICAgICAgMTIKKyNkZWZpbmUgTUxNRV9BTEdfTk9UX1NVUFBPUlQgICAgICAgICAgICAxMworI2RlZmluZSBNTE1FX1NFUV9OUl9PVVRfT0ZfU0VRVUVOQ0UgICAgIDE0CisjZGVmaW5lIE1MTUVfUkVKX0NIQUxMRU5HRV9GQUlMVVJFICAgICAgMTUKKyNkZWZpbmUgTUxNRV9SRUpfVElNRU9VVCAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX1VOQUJMRV9IQU5ETEVfU1RBICAxNworI2RlZmluZSBNTE1FX0FTU09DX1JFSl9EQVRBX1JBVEUgICAgICAgICAgMTgKKworI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19FWFRfUkFURSAgICAgICAgMjIKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fRVhUX1JBVEVfUEJDQyAgIDIzCisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0NDS19PRkRNICAgICAgICAyNAorCisjZGVmaW5lIE1MTUVfUU9TX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBNTE1FX1JFUVVFU1RfREVDTElORUQgICAgICAgICAgICAgMzcKKyNkZWZpbmUgTUxNRV9SRVFVRVNUX1dJVEhfSU5WQUxJRF9QQVJBTSAgIDM4CisjZGVmaW5lIE1MTUVfRExTX05PVF9BTExPV19JTl9RQlNTICAgICAgICA0OAorI2RlZmluZSBNTE1FX0RFU1RfU1RBX05PVF9JTl9RQlNTICAgICAgICAgNDkKKyNkZWZpbmUgTUxNRV9ERVNUX1NUQV9JU19OT1RfQV9RU1RBICAgICAgIDUwCisKKyNkZWZpbmUgTUxNRV9JTlZBTElEX0ZPUk1BVCAgICAgICAgICAgICAweDUxCisjZGVmaW5lIE1MTUVfRkFJTF9OT19SRVNPVVJDRSAgICAgICAgICAgMHg1MgorI2RlZmluZSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUICAgICAgIDB4NTMKKyNkZWZpbmUgTUxNRV9NQUNfVEFCTEVfRkFJTCAgICAgICAgICAgICAweDU0CisKKy8vIElFIGNvZGUKKyNkZWZpbmUgSUVfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElFX1NVUFBfUkFURVMgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJRV9GSF9QQVJNICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSUVfRFNfUEFSTSAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIElFX0NGX1BBUk0gICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJRV9USU0gICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgSUVfSUJTU19QQVJNICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElFX0NPVU5UUlkgICAgICAgICAgICAgICAgICAgICAgNyAgICAgLy8gODAyLjExZAorI2RlZmluZSBJRV84MDJfMTFEX1JFUVVFU1QgICAgICAgICAgICAgIDEwICAgIC8vIDgwMi4xMWQKKyNkZWZpbmUgSUVfUUJTU19MT0FEICAgICAgICAgICAgICAgICAgICAxMSAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX0VEQ0FfUEFSQU1FVEVSICAgICAgICAgICAgICAgMTIgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UU1BFQyAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfVENMQVMgICAgICAgICAgICAgICAgICAgICAgICAxNCAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgMTUgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9DSEFMTEVOR0VfVEVYVCAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIElFX1BPV0VSX0NPTlNUUkFJTlQgICAgICAgICAgICAgMzIgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1BPV0VSX0NBUEFCSUxJVFkgICAgICAgICAgICAgMzMgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1RQQ19SRVFVRVNUICAgICAgICAgICAgICAgICAgMzQgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1RQQ19SRVBPUlQgICAgICAgICAgICAgICAgICAgMzUgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1NVUFBfQ0hBTk5FTFMgICAgICAgICAgICAgICAgMzYgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCAgMzcgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUVVFU1QgICAgICAgICAgMzggICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUE9SVCAgICAgICAgICAgMzkgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1FVSUVUICAgICAgICAgICAgICAgICAgICAgICAgNDAgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0lCU1NfREZTICAgICAgICAgICAgICAgICAgICAgNDEgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0VSUCAgICAgICAgICAgICAgICAgICAgICAgICAgNDIgICAgLy8gODAyLjExZworI2RlZmluZSBJRV9UU19ERUxBWSAgICAgICAgICAgICAgICAgICAgIDQzICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfVENMQVNfUFJPQ0VTU0lORyAgICAgICAgICAgICA0NCAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgNDYgICAgLy8gODAyLjExZSBkNgorI2RlZmluZSBJRV9IVF9DQVAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisjZGVmaW5lIElFX0FQX0NIQU5ORUxfUkVQT1JUCQkJNTEgICAgLy8gODAyLjExayBkNgorI2RlZmluZSBJRV9IVF9DQVAyICAgICAgICAgICAgICAgICAgICAgICAgIDUyICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisjZGVmaW5lIElFX1JTTiAgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gODAyLjExaSBkMy4wCisjZGVmaW5lIElFX1dQQTIgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gV1BBMgorI2RlZmluZSBJRV9FWFRfU1VQUF9SQVRFUyAgICAgICAgICAgICAgIDUwICAgIC8vIDgwMi4xMWcKKyNkZWZpbmUgSUVfU1VQUF9SRUdfQ0xBU1MgICAgICAgICAgICAgICA1OSAgICAvLyA4MDIuMTF5LiBTdXBwb3J0ZWQgcmVndWxhdG9yeSBjbGFzc2VzLgorI2RlZmluZSBJRV9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UCTYwCS8vIDgwMi4xMW4KKyNkZWZpbmUgSUVfQUREX0hUICAgICAgICAgICAgICAgICAgICAgICAgIDYxICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKworCisvLyBGb3IgODAyLjExbiBEMy4wMworLy8jZGVmaW5lIElFX05FV19FWFRfQ0hBX09GRlNFVCAgICAgICAgICAgICA2MiAgICAvLyA4MDIuMTFuIGQxLiBOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IGVsZW1ldAorI2RlZmluZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUCQk2MgkvLyA4MDIuMTFuIEQzLjAzCVNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50CisjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MiAgICAvLyA4MDIuMTFuIEQzLjAuMworI2RlZmluZSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCAgICAgNzMgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9PVkVSTEFQQlNTX1NDQU5fUEFSTSAgICAgICAgICAgNzQgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9FWFRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAxMjcgICAvLyA4MDIuMTFuIEQzLjAzCisKKworI2RlZmluZSBJRV9XUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMSAgIC8vIFdQQQorI2RlZmluZSBJRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgIDIyMSAgIC8vIFdpZmkgV01NIChXTUUpCisKKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUICAgICAgICAgICAgICA1MSAgIC8vCisjZGVmaW5lIE9VSV9CUk9BRENPTV9IVEFERCAgICAgICAgICAgICAgNTIgICAvLworI2RlZmluZSBPVUlfUFJFTl9IVF9DQVAgICAgICAgICAgICAgIDUxICAgLy8KKyNkZWZpbmUgT1VJX1BSRU5fQUREX0hUICAgICAgICAgICAgICA1MiAgIC8vCisKKy8vIENDWCBpbmZvcm1hdGlvbgorI2RlZmluZSBJRV9BSVJPTkVUX0NLSVAgICAgICAgICAgICAgICAgIDEzMyAgIC8vIENDWDEuMCBJRCA4NUggZm9yIENLSVAKKyNkZWZpbmUgSUVfQVBfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAxNTAgICAvLyBDQ1ggMi4wIGZvciBBUCB0cmFuc21pdCBwb3dlcgorI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZICAgICAgIDIyMSAgIC8vIENDWCAyLjAKKyNkZWZpbmUgSUVfQ0NYX1YyICAgICAgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgSUVfQUlST05FVF9JUEFERFJFU1MgICAgICAgICAgICAxNDkgICAvLyBDQ1ggSUQgOTVIIGZvciBJUCBBZGRyZXNzCisjZGVmaW5lIElFX0FJUk9ORVRfQ0NLTVJFQVNTT0MgICAgICAgICAgMTU2ICAgLy8gQ0NYIElEIDlDSCBmb3IgQ0NLTSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgZWxlbWVudAorI2RlZmluZSBDS0lQX05FR09USUFUSU9OX0xFTkdUSCAgICAgICAgIDMwCisjZGVmaW5lIEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSCAgICAgICAgMTAKKyNkZWZpbmUgQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEggICAgICAyNAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTUxNRSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFNUQSBNTE1FIHN0YXRlIG1haGNpbmVzCisjZGVmaW5lIEFTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgMQorI2RlZmluZSBBVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAgICAzCisjZGVmaW5lIFNZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNAorI2RlZmluZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgIDUKKyNkZWZpbmUgV1BBX1BTS19TVEFURV9NQUNISU5FICAgICAgICAgICA2CisjZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNworI2RlZmluZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDgKKyNkZWZpbmUgQUNUSU9OX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDkKKworLy8gQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcworI2RlZmluZSBBUF9BU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgIDExCisjZGVmaW5lIEFQX0FVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTIKKyNkZWZpbmUgQVBfQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAxMworI2RlZmluZSBBUF9TWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE0CisjZGVmaW5lIEFQX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTUKKyNkZWZpbmUgQVBfV1BBX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAxNgorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisjZGVmaW5lIERMU19TVEFURV9NQUNISU5FICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLy8KKy8vIFNUQSdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQ05UTF9JRExFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENOVExfV0FJVF9ESVNBU1NPQyAgICAgICAgICAgICAgMQorI2RlZmluZSBDTlRMX1dBSVRfSk9JTiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ05UTF9XQUlUX1JFQVNTT0MgICAgICAgICAgICAgICAzCisjZGVmaW5lIENOVExfV0FJVF9TVEFSVCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDTlRMX1dBSVRfQVVUSCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ05UTF9XQUlUX0FTU09DICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENOVExfV0FJVF9BVVRIMiAgICAgICAgICAgICAgICAgNworI2RlZmluZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTiAgICAgICAgIDgKKyNkZWZpbmUgQ05UTF9XQUlUX09JRF9ESVNBU1NPQyAgICAgICAgICA5CisKKyNkZWZpbmUgTVQyX0FTU09DX0NPTkYgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBNVDJfQVVUSF9DT05GICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIE1UMl9ERUFVVEhfQ09ORiAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgTVQyX0RJU0FTU09DX0NPTkYgICAgICAgICAgICAgICAzNworI2RlZmluZSBNVDJfUkVBU1NPQ19DT05GICAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIE1UMl9QV1JfTUdNVF9DT05GICAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgTVQyX0pPSU5fQ09ORiAgICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBNVDJfU0NBTl9DT05GICAgICAgICAgICAgICAgICAgIDQxCisjZGVmaW5lIE1UMl9TVEFSVF9DT05GICAgICAgICAgICAgICAgICAgNDIKKyNkZWZpbmUgTVQyX0dFVF9DT05GICAgICAgICAgICAgICAgICAgICA0MworI2RlZmluZSBNVDJfU0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQ0CisjZGVmaW5lIE1UMl9SRVNFVF9DT05GICAgICAgICAgICAgICAgICAgNDUKKyNkZWZpbmUgTVQyX01MTUVfUk9BTUlOR19SRVEgICAgICAgICAgICA1MgorCisjZGVmaW5lIENOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgMQorCisvLworLy8gU1RBJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFTU09DX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkVBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERJU0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMworI2RlZmluZSBNQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBBU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX1JFQVNTT0NfUkVRICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9BU1NPQ19SU1AgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgICA2CisjZGVmaW5lIE1UMl9QRUVSX1JFQVNTT0NfUlNQICAgICAgICAgICAgNworI2RlZmluZSBNVDJfRElTQVNTT0NfVElNRU9VVCAgICAgICAgICAgIDgKKyNkZWZpbmUgTVQyX0FTU09DX1RJTUVPVVQgICAgICAgICAgICAgICA5CisjZGVmaW5lIE1UMl9SRUFTU09DX1RJTUVPVVQgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICAgICAxMQorCisjZGVmaW5lIEFTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BU1NPQ19TVEFURSAqIE1BWF9BU1NPQ19NU0cpCisKKy8vCisvLyBBQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFDVF9JRExFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX0FDVF9TVEFURSAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFDVF9NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKKworLy9UaG9zZSBQRUVSX3h4X0NBVEUgbnVtYmVyIGlzIGJhc2VkIG9uIHJlYWwgQ2F0ZWdhcnkgdmFsdWUgaW4gSUVFRSBzcGVjLiBQbGVhc2UgZG9uJ2VzIG1vZGlmeSBpdCBieSB5b3VyIHNlbGYuCisvL0NhdGVnb3J5CisjZGVmaW5lIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfUU9TX0NBVEUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX1BFRVJfRExTX0NBVEUgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9CQV9DQVRFICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfUFVCTElDX0NBVEUgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9STV9DQVRFICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1BFRVJfSFRfQ0FURSAgICAgICAgICAgICA3CS8vCTcuNC43CisjZGVmaW5lIE1BWF9QRUVSX0NBVEVfTVNHICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgTVQyX01MTUVfQUREX0JBX0NBVEUgICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSAgICAgICAgICAgICA5CisjZGVmaW5lIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFICAgICAgICAgICAgIDEwCisjZGVmaW5lIE1UMl9NTE1FX1FPU19DQVRFICAgICAgICAgICAgICAxMQorI2RlZmluZSBNVDJfTUxNRV9ETFNfQ0FURSAgICAgICAgICAgICAxMgorI2RlZmluZSBNVDJfQUNUX0lOVkFMSUQgICAgICAgICAgICAgMTMKKyNkZWZpbmUgTUFYX0FDVF9NU0cgICAgICAgICAgICAgICAgICAgMTQKKworLy9DYXRlZ29yeSBmaWVsZAorI2RlZmluZSBDQVRFR09SWV9TUEVDVFJVTQkJMAorI2RlZmluZSBDQVRFR09SWV9RT1MJCQkxCisjZGVmaW5lIENBVEVHT1JZX0RMUwkJCTIKKyNkZWZpbmUgQ0FURUdPUllfQkEJCQkzCisjZGVmaW5lIENBVEVHT1JZX1BVQkxJQwkJNAorI2RlZmluZSBDQVRFR09SWV9STQkJCTUKKyNkZWZpbmUgQ0FURUdPUllfSFQJCQk3CisKKworLy8gRExTIEFjdGlvbiBmcmFtZSBkZWZpbml0aW9uCisjZGVmaW5lIEFDVElPTl9ETFNfUkVRVUVTVAkJCTAKKyNkZWZpbmUgQUNUSU9OX0RMU19SRVNQT05TRQkJCTEKKyNkZWZpbmUgQUNUSU9OX0RMU19URUFSRE9XTgkJCTIKKworLy9TcGVjdHJ1bSAgQWN0aW9uIGZpZWxkIHZhbHVlIDgwMi4xMWggNy40LjEKKyNkZWZpbmUgU1BFQ19NUlEJMAkvLyBSZXF1ZXN0CisjZGVmaW5lIFNQRUNfTVJQCTEJLy9SZXBvcnQKKyNkZWZpbmUgU1BFQ19UUENSUQkyCisjZGVmaW5lIFNQRUNfVFBDUlAJMworI2RlZmluZSBTUEVDX0NIQU5ORUxfU1dJVENICTQKKworCisvL0JBICBBY3Rpb24gZmllbGQgdmFsdWUKKyNkZWZpbmUgQUREQkFfUkVRCTAKKyNkZWZpbmUgQUREQkFfUkVTUAkxCisjZGVmaW5lIERFTEJBICAgMgorCisvL1B1YmxpYydzICBBY3Rpb24gZmllbGQgdmFsdWUgaW4gUHVibGljIENhdGVnb3J5LiAgU29tZSBpbiA4MDIuMTF5IGFuZCBzb21lIGluIDExbgorI2RlZmluZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVAkJCQkwCS8vIDExbgorI2RlZmluZSBBQ1RJT05fRFNFX0VOQUJMRU1FTlQJCQkJCTEJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9ERUVOQUJMRU1FTlQJCQkJMgkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX1JFR19MT0NBVElPTl9BTk5PVU5DRQkzCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9FWFRfQ0hfU1dJVENIX0FOTk9VTkNFCQk0CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVRCQkJNQkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUE9SVAkJNgkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fTUVBU1VSRU1FTlRfUElMT1RfQUNUSU9OCQk3ICAJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9QT1dFUl9DT05TVFJBSU5UCQkJOAkvLyAxMXkgRDkuMAorCisKKy8vSFQgIEFjdGlvbiBmaWVsZCB2YWx1ZQorI2RlZmluZSBOT1RJRllfQldfQUNUSU9OCQkJCTAKKyNkZWZpbmUgU01QU19BQ1RJT04JCQkJCQkxCisjZGVmaW5lIFBTTVBfQUNUSU9OICAgCQkJCQkyCisjZGVmaW5lIFNFVFBDT19BQ1RJT04JCQkJCTMKKyNkZWZpbmUgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT04JCQk0CisjZGVmaW5lIE1JTU9fTl9CRUFDT05GT1JNCQkJCTUKKyNkZWZpbmUgTUlNT19CRUFDT05GT1JNCQkJCQk2CisjZGVmaW5lIEFOVEVOTkFfU0VMRUNUCQkJCQk3CisjZGVmaW5lIEhUX0lORk9fRVhDSEFOR0UJCQkJOAorCisjZGVmaW5lIEFDVF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQUNUX1NUQVRFICogTUFYX0FDVF9NU0cpCisvLworLy8gU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldnZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfQVVUSF9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAoTUFYX0FVVEhfU1RBVEUgKiBNQVhfQVVUSF9NU0cpCisKKy8vCisvLyBTVEEncyBBVVRIX1JTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVVUSF9SU1BfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFVVEhfUlNQX1dBSVRfQ0hBTCAgICAgICAgICAgICAgMQorI2RlZmluZSBNQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAgICAoTUFYX0FVVEhfUlNQX1NUQVRFICogTUFYX0FVVEhfUlNQX01TRykKKworLy8KKy8vIFNUQSdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIFNZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgSk9JTl9XQUlUX0JFQUNPTiAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNDQU5fTElTVEVOICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBTWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfU0NBTl9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX0pPSU5fUkVRICAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfTUxNRV9TVEFSVF9SRVEgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9QRUVSX1BST0JFX1JTUCAgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9BVElNICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1NDQU5fVElNRU9VVCAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1UMl9CRUFDT05fVElNRU9VVCAgICAgICAgICAgICAgNworI2RlZmluZSBNVDJfQVRJTV9USU1FT1VUICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUkVRICAgICAgICAgICAgICA5CisjZGVmaW5lIE1BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBTWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfU1lOQ19TVEFURSAqIE1BWF9TWU5DX01TRykKKworLy9NZXNzYWdlcyBmb3IgdGhlIERMUyBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIERMU19JRExFCQkJCQkJMAorI2RlZmluZSBNQVhfRExTX1NUQVRFCQkJCQkxCisKKyNkZWZpbmUgRExTX01BQ0hJTkVfQkFTRQkJCQkwCisjZGVmaW5lIE1UMl9NTE1FX0RMU19SRVEJCQkgICAgMAorI2RlZmluZSBNVDJfUEVFUl9ETFNfUkVRCQkJICAgIDEKKyNkZWZpbmUgTVQyX1BFRVJfRExTX1JTUAkJCSAgICAyCisjZGVmaW5lIE1UMl9NTE1FX0RMU19URUFSX0RPV04JCSAgICAzCisjZGVmaW5lIE1UMl9QRUVSX0RMU19URUFSX0RPV04JCSAgICA0CisjZGVmaW5lIE1BWF9ETFNfTVNHCQkJCSAgICAgICAgNQorCisjZGVmaW5lIERMU19GVU5DX1NJWkUJCQkJCShNQVhfRExTX1NUQVRFICogTUFYX0RMU19NU0cpCisKKy8vCisvLyBTVEEncyBXUEEtUFNLIFN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBXUEFfUFNLX0lETEUJCQkJCTAKKyNkZWZpbmUgTUFYX1dQQV9QU0tfU1RBVEUJCQkJMQorCisjZGVmaW5lIFdQQV9NQUNISU5FX0JBU0UgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9XUEFfUFNLX01TRyAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lCVdQQV9QU0tfRlVOQ19TSVpFCQkJCShNQVhfV1BBX1BTS19TVEFURSAqIE1BWF9XUEFfUFNLX01TRykKKworLy8KKy8vIFNUQSdzIENJU0NPLUFJUk9ORVQgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFJUk9ORVRfSURMRQkJCQkJMAorI2RlZmluZQlBSVJPTkVUX1NDQU5OSU5HCQkJCTEKKyNkZWZpbmUgTUFYX0FJUk9ORVRfU1RBVEUJCQkJMgorCisjZGVmaW5lIEFJUk9ORVRfTUFDSElORV9CQVNFCQkgICAgMAorI2RlZmluZSBNVDJfQUlST05FVF9NU0cJCQkJICAgIDAKKyNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9SRVEJCSAgICAxCisjZGVmaW5lIE1UMl9BSVJPTkVUX1NDQU5fRE9ORQkJICAgIDIKKyNkZWZpbmUgTUFYX0FJUk9ORVRfTVNHCQkJCSAgICAzCisKKyNkZWZpbmUJQUlST05FVF9GVU5DX1NJWkUJCQkJKE1BWF9BSVJPTkVUX1NUQVRFICogTUFYX0FJUk9ORVRfTVNHKQorCisvLworLy8gQVAncyBDT05UUk9ML0NPTk5FQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0NOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgMQorCisvLworLy8gQVAncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX01BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFQX0FTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgICAgICAgMgorI2RlZmluZSBBUE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICAgICAgIDMKKyNkZWZpbmUgQVBNVDJfQ0xTM0VSUiAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFQX01BWF9BU1NPQ19NU0cgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQX0FTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQX01BWF9BU1NPQ19TVEFURSAqIEFQX01BWF9BU1NPQ19NU0cpCisKKy8vCisvLyBBUCdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FVVEhfU1RBVEUgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVVUSF9NQUNISU5FX0JBU0UgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9DTFMyRVJSICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBfQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBfTUFYX0FVVEhfU1RBVEUgKiBBUF9NQVhfQVVUSF9NU0cpCisKKy8vCisvLyBBUCdzIEFVVEgtUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX1NUQVRFICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVVUSF9SU1BfTUFDSElORV9CQVNFICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQX01BWF9BVVRIX1JTUF9NU0cgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQX0FVVEhfUlNQX0ZVTkNfU0laRSAgICAgICAgICAgKEFQX01BWF9BVVRIX1JTUF9TVEFURSAqIEFQX01BWF9BVVRIX1JTUF9NU0cpCisKKy8vCisvLyBBUCdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX1NZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9TQ0FOX0xJU1RFTgkJCQkJMQorI2RlZmluZSBBUF9NQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUF9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9NTE1FX1NDQU5fUkVRCQkJCTIKKyNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SU1AJCQkzCisjZGVmaW5lIEFQTVQyX1NDQU5fVElNRU9VVAkJCQk0CisjZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9DTkNMCQkJNQorI2RlZmluZSBBUF9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgIDYKKworI2RlZmluZSBBUF9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfU1lOQ19TVEFURSAqIEFQX01BWF9TWU5DX01TRykKKworLy8KKy8vIEFQJ3MgV1BBIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9XUEFfUFRLICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX1dQQV9QVEtfU1RBVEUgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBfTUFYX1dQQV9NU0cgICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBfV1BBX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAoQVBfTUFYX1dQQV9QVEtfU1RBVEUgKiBBUF9NQVhfV1BBX01TRykKKworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKy8vQXBDbGkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9BVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX0FVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBUENMSV9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVVUSF9SRVEgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RFQVVUSF9SRVEgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9BVVRIX0VWRU4gICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfREVBVVRIICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX01UMl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUENMSV9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUENMSV9NQVhfQVVUSF9TVEFURSAqIEFQQ0xJX01BWF9BVVRIX01TRykKKworLy9BcENsaSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0FTU09DX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9BU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBDTElfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0FTU09DX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FTU09DX1JTUCAgICAgICAgICAgMworI2RlZmluZSBBUENMSV9NVDJfQVNTT0NfVElNRU9VVCAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBDTElfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBDTElfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0FTU09DX1NUQVRFICogQVBDTElfTUFYX0FTU09DX01TRykKKworLy9BcENsaSBzeW5jIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgIDAgIC8vIG1lcmdlIE5PX0JTUyxJQlNTX0lETEUsSUJTU19BQ1RJVkUgYW5kIEJTUyBpbiB0byAxIHN0YXRlCisjZGVmaW5lIEFQQ0xJX0pPSU5fV0FJVF9QUk9CRV9SU1AgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBDTElfU1lOQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfUFJPQkVfUkVRICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfUFJPQkVfUlNQICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTVQyX1BST0JFX1RJTUVPVVQgICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBUENMSV9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQQ0xJX01BWF9TWU5DX1NUQVRFICogQVBDTElfTUFYX1NZTkNfTVNHKQorCisvL0FwQ2xpIGN0cmwgc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9DVFJMX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgQVBDTElfQ1RSTF9QUk9CRSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIXzIgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfQ1RSTF9BU1NPQyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBDTElfQ1RSTF9ERUFTU09DICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVBDTElfQ1RSTF9DT05ORUNURUQgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQVBDTElfTUFYX0NUUkxfU1RBVEUgICAgICAgICAgICAgIDcKKworI2RlZmluZSBBUENMSV9DVFJMX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9DVFJMX0pPSU5fUkVRICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9DVFJMX1BST0JFX1JTUCAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfUlNQICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9DVFJMX0RJU0NPTk5FQ1RfUkVRICAgICAgICAgMworI2RlZmluZSBBUENMSV9DVFJMX1BFRVJfRElTQ09OTkVDVF9SRVEgICAgNAorI2RlZmluZSBBUENMSV9DVFJMX0FTU09DX1JTUCAgICAgICAgICAgICAgNQorI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0NfUlNQICAgICAgICAgICAgNgorI2RlZmluZSBBUENMSV9DVFJMX0pPSU5fUkVRX1RJTUVPVVQgICAgICAgNworI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfUkVRX1RJTUVPVVQgICAgICAgOAorI2RlZmluZSBBUENMSV9DVFJMX0FTU09DX1JFUV9USU1FT1VUICAgICAgOQorI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9NU0cgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBBUENMSV9DVFJMX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQQ0xJX01BWF9DVFJMX1NUQVRFICogQVBDTElfTUFYX0NUUkxfTVNHKQorCisjZW5kaWYJLy8gQVBDTElfU1VQUE9SVCAvLworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgaGVhZGVyIEZDLlR5dGUsIHdoaWNoIGlzIGIzLi5iMiBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBCVFlQRV9NR01UICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCVFlQRV9DTlRMICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCVFlQRV9EQVRBICAgICAgICAgICAgICAgICAgMgorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIE1HTVQgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX0FTU09DX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBTVUJUWVBFX0FTU09DX1JTUCAgICAgICAgICAgMQorI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUkVRICAgICAgICAgMgorI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUlNQICAgICAgICAgMworI2RlZmluZSBTVUJUWVBFX1BST0JFX1JFUSAgICAgICAgICAgNAorI2RlZmluZSBTVUJUWVBFX1BST0JFX1JTUCAgICAgICAgICAgNQorI2RlZmluZSBTVUJUWVBFX0JFQUNPTiAgICAgICAgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX0FUSU0gICAgICAgICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX0RJU0FTU09DICAgICAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9BVVRIICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNVQlRZUEVfREVBVVRIICAgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX0FDVElPTiAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9BQ1RJT05fTk9fQUNLICAgICAgICAgICAgICAxNAorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIENOVEwgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX1dSQVBQRVIgICAgICAgCTcKKyNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0tfUkVRICAgICAgIDgKKyNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0sgICAgICAgICAgIDkKKyNkZWZpbmUgU1VCVFlQRV9QU19QT0xMICAgICAgICAgICAgIDEwCisjZGVmaW5lIFNVQlRZUEVfUlRTICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBTVUJUWVBFX0NUUyAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU1VCVFlQRV9BQ0sgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFNVQlRZUEVfQ0ZFTkQgICAgICAgICAgICAgICAxNAorI2RlZmluZSBTVUJUWVBFX0NGRU5EX0NGQUNLICAgICAgICAgMTUKKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBEQVRBIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKyNkZWZpbmUgU1VCVFlQRV9EQVRBICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLICAgICAgICAgIDEKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGUE9MTCAgICAgICAgIDIKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLX0NGUE9MTCAgIDMKKyNkZWZpbmUgU1VCVFlQRV9OVUxMX0ZVTkMgICAgICAgICAgIDQKKyNkZWZpbmUgU1VCVFlQRV9DRkFDSyAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU1VCVFlQRV9DRlBPTEwgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU1VCVFlQRV9DRkFDS19DRlBPTEwgICAgICAgIDcKKyNkZWZpbmUgU1VCVFlQRV9RREFUQSAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRkFDSyAgICAgICAgIDkKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRlBPTEwgICAgICAgIDEwCisjZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZBQ0tfQ0ZQT0xMICAxMQorI2RlZmluZSBTVUJUWVBFX1FPU19OVUxMICAgICAgICAgICAgMTIKKyNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZBQ0sgICAgICAgICAgIDEzCisjZGVmaW5lIFNVQlRZUEVfUU9TX0NGUE9MTCAgICAgICAgICAxNAorI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDS19DRlBPTEwgICAgMTUKKworLy8gQUNLIHBvbGljeSBvZiBRT1MgQ29udHJvbCBmaWVsZCBiaXQgNjo1CisjZGVmaW5lIE5PUk1BTF9BQ0sgICAgICAgICAgICAgICAgICAweDAwICAvLyBiNjo1ID0gMDAKKyNkZWZpbmUgTk9fQUNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8vIGI2OjUgPSAwMQorI2RlZmluZSBOT19FWFBMSUNJVF9BQ0sgICAgICAgICAgICAgMHg0MCAgLy8gYjY6NSA9IDEwCisjZGVmaW5lIEJMT0NLX0FDSyAgICAgICAgICAgICAgICAgICAweDYwICAvLyBiNjo1ID0gMTEKKworLy8KKy8vIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uCisvLworI2RlZmluZSBMRU5HVEhfODAyXzExICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9BTkRfSCAgICAgICAgIDMwCisjZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDX0ggICAgICAgICAzNAorI2RlZmluZSBMRU5HVEhfODAyXzExX0NSQyAgICAgICAgICAgMjgKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9XSVRIX0FERFI0ICAgIDMwCisjZGVmaW5lIExFTkdUSF84MDJfMyAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBMRU5HVEhfODAyXzNfVFlQRSAgICAgICAgICAgMgorI2RlZmluZSBMRU5HVEhfODAyXzFfSCAgICAgICAgICAgICAgOAorI2RlZmluZSBMRU5HVEhfRUFQT0xfSCAgICAgICAgICAgICAgNAorI2RlZmluZSBMRU5HVEhfV01NUU9TX0gJCQkJMgorI2RlZmluZSBMRU5HVEhfQ1JDICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfU0VRX05VTUJFUiAgICAgICAgICAgICAgMHgwZmZmCisjZGVmaW5lIExFTkdUSF84MDJfM19OT19UWVBFCQkxMgorI2RlZmluZSBMRU5HVEhfODAyXzFRCQkJCTQgLyogVkxBTiByZWxhdGVkICovCisKKy8vIFNUQV9DU1I0LmZpZWxkLlR4UmVzdWx0CisjZGVmaW5lIFRYX1JFU1VMVF9TVUNDRVNTICAgICAgICAgICAwCisjZGVmaW5lIFRYX1JFU1VMVF9aRVJPX0xFTkdUSCAgICAgICAxCisjZGVmaW5lIFRYX1JFU1VMVF9VTkRFUl9SVU4gICAgICAgICAyCisjZGVmaW5lIFRYX1JFU1VMVF9PSFlfRVJST1IgICAgICAgICA0CisjZGVmaW5lIFRYX1JFU1VMVF9SRVRSWV9GQUlMICAgICAgICA2CisKKy8vIEFsbCBQSFkgcmF0ZSBzdW1tYXJ5IGluIFRYRAorLy8gUHJlYW1ibGUgTU9ERSBpbiBUeEQKKyNkZWZpbmUgTU9ERV9DQ0sJMAorI2RlZmluZSBNT0RFX09GRE0gICAxCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZGVmaW5lIE1PREVfSFRNSVgJMgorI2RlZmluZSBNT0RFX0hUR1JFRU5GSUVMRAkzCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisvLyBNQ1MgZm9yIENDSy4gIEJXLlNHSS5TVEJDIGFyZSByZXNlcnZlZAorI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQkvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcworI2RlZmluZSBNQ1NfTE9OR1BfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDQJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzLiBzaG9ydCBpcyBmb3JiaWRkZW4gaW4gMU1icHMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgNQkvLyBzaG9ydCBwcmVhbWJsZSBDQ0sgMk1icHMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICA3CisvLyBUbyBzZW5kIGR1cGxpY2F0ZSBsZWdhY3kgT0ZETS4gc2V0IEJXPUJXXzQwLiAgU0dJLlNUQkMgYXJlIHJlc2VydmVkCisjZGVmaW5lIE1DU19SQVRFXzYgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vIGxlZ2FjeSBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzkgICAgICAgICAgICAgICAgICAgICAgMSAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMTIgICAgICAgICAgICAgICAgICAgICAyICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDMgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgNCAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgNiAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDcgLy8gT0ZETQorLy8gSFQKKyNkZWZpbmUgTUNTXzAJCTAJLy8gMVMKKyNkZWZpbmUgTUNTXzEJCTEKKyNkZWZpbmUgTUNTXzIJCTIKKyNkZWZpbmUgTUNTXzMJCTMKKyNkZWZpbmUgTUNTXzQJCTQKKyNkZWZpbmUgTUNTXzUJCTUKKyNkZWZpbmUgTUNTXzYJCTYKKyNkZWZpbmUgTUNTXzcJCTcKKyNkZWZpbmUgTUNTXzgJCTgJLy8gMlMKKyNkZWZpbmUgTUNTXzkJCTkKKyNkZWZpbmUgTUNTXzEwCQkxMAorI2RlZmluZSBNQ1NfMTEJCTExCisjZGVmaW5lIE1DU18xMgkJMTIKKyNkZWZpbmUgTUNTXzEzCQkxMworI2RlZmluZSBNQ1NfMTQJCTE0CisjZGVmaW5lIE1DU18xNQkJMTUKKyNkZWZpbmUgTUNTXzE2CQkxNgkvLyAzKjMKKyNkZWZpbmUgTUNTXzE3CQkxNworI2RlZmluZSBNQ1NfMTgJCTE4CisjZGVmaW5lIE1DU18xOQkJMTkKKyNkZWZpbmUgTUNTXzIwCQkyMAorI2RlZmluZSBNQ1NfMjEJCTIxCisjZGVmaW5lIE1DU18yMgkJMjIKKyNkZWZpbmUgTUNTXzIzCQkyMworI2RlZmluZSBNQ1NfMzIJCTMyCisjZGVmaW5lIE1DU19BVVRPCQkzMworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBPSURfSFRQSFlNT0RFCisvLyBNT0RFCisjZGVmaW5lIEhUTU9ERV9NTQkwCisjZGVmaW5lIEhUTU9ERV9HRgkxCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIEZpeGVkIFR4IE1PREUgLSBIVCwgQ0NLIG9yIE9GRE0KKyNkZWZpbmUgRklYRURfVFhNT0RFX0hUCQkwCisjZGVmaW5lIEZJWEVEX1RYTU9ERV9DQ0sJMQorI2RlZmluZSBGSVhFRF9UWE1PREVfT0ZETSAJMgorLy8gQlcKKyNkZWZpbmUgQldfMjAJCUJBTkRfV0lEVEhfMjAKKyNkZWZpbmUgQldfNDAJCUJBTkRfV0lEVEhfNDAKKyNkZWZpbmUgQldfQk9USAkJQkFORF9XSURUSF9CT1RICisjZGVmaW5lIEJXXzEwCQlCQU5EX1dJRFRIXzEwCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBTSE9SVEdJCisjZGVmaW5lIEdJXzQwMAkJR0FQX0lOVEVSVkFMXzQwMAkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQorI2RlZmluZSBHSV9CT1RICQlHQVBfSU5URVJWQUxfQk9USAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2RlZmluZSBHSV84MDAJCUdBUF9JTlRFUlZBTF84MDAKKy8vIFNUQkMKKyNkZWZpbmUgU1RCQ19OT05FCTAKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgU1RCQ19VU0UJMQkvLyBsaW1pdGVkIHVzZSBpbiBydDI4NjBiIHBoeQorI2RlZmluZSBSWFNUQkNfT05FCTEJLy8gcnggc3VwcG9ydCBvZiBvbmUgc3BhdGlhbCBzdHJlYW0KKyNkZWZpbmUgUlhTVEJDX1RXTwkyCS8vIHJ4IHN1cHBvcnQgb2YgMSBhbmQgMiBzcGF0aWFsIHN0cmVhbQorI2RlZmluZSBSWFNUQkNfVEhSCTMJLy8gcnggc3VwcG9ydCBvZiAxfjMgc3BhdGlhbCBzdHJlYW0KKy8vIE1DUyBGRUVEQkFDSworI2RlZmluZSBNQ1NGQktfTk9ORQkwICAvLyBub3Qgc3VwcG9ydCBtY3MgZmVlZGJhY2sgLworI2RlZmluZSBNQ1NGQktfUlNWCTEJLy8gcmVzZXJ2ZWQKKyNkZWZpbmUgTUNTRkJLX1VOU09MSUNJVAkyCS8vIG9ubHkgc3VwcG9ydCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKKyNkZWZpbmUgTUNTRkJLX01SUQkzCS8vIHJlc3BvbnNlIHRvIGJvdGggTVJRIGFuZCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKKworLy8gTUlNTyBwb3dlciBzYWZlCisjZGVmaW5lCU1NUFNfU1RBVElDCTAKKyNkZWZpbmUJTU1QU19EWU5BTUlDCQkxCisjZGVmaW5lICAgTU1QU19SU1YJCTIKKyNkZWZpbmUgTU1QU19FTkFCTEUJCTMKKworCisvLyBBLU1TRFUgc2l6ZQorI2RlZmluZQlBTVNEVV8wCTAKKyNkZWZpbmUJQU1TRFVfMQkJMQorCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIE1DUyB1c2UgNyBiaXRzCisjZGVmaW5lIFRYUkFURU1JTU8JCTB4ODAKKyNkZWZpbmUgVFhSQVRFTUNTCQkweDdGCisjZGVmaW5lIFRYUkFURU9GRE0JCTB4N0YKKyNkZWZpbmUgUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDQgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfOSAgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzEyICAgICAgICAgICAgICAgICAgICAgNiAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDcgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMjQgICAgICAgICAgICAgICAgICAgICA4ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgOSAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDEwICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfNTQgICAgICAgICAgICAgICAgICAgICAxMSAgLy8gT0ZETQorI2RlZmluZSBSQVRFX0ZJUlNUX09GRE1fUkFURSAgICAgICAgUkFURV82CisjZGVmaW5lIFJBVEVfTEFTVF9PRkRNX1JBVEUgICAgICAgIAlSQVRFXzU0CisjZGVmaW5lIFJBVEVfNl81ICAgICAgICAgICAgICAgICAgICAxMiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTMgICAgICAgICAgICAgICAgICAgICAxMyAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTlfNSAgICAgICAgICAgICAgICAgICAxNCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMjYgICAgICAgICAgICAgICAgICAgICAxNSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMzkgICAgICAgICAgICAgICAgICAgICAxNiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNTIgICAgICAgICAgICAgICAgICAgICAxNyAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNThfNSAgICAgICAgICAgICAgICAgICAxOCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNjUgICAgICAgICAgICAgICAgICAgICAxOSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNzggICAgICAgICAgICAgICAgICAgICAyMCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTA0ICAgICAgICAgICAgICAgICAgICAyMSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTE3ICAgICAgICAgICAgICAgICAgICAyMiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTMwICAgICAgICAgICAgICAgICAgICAyMyAgLy8gSFQgbWl4CisvLyNkZWZpbmUgUkFURV9BVVRPX1NXSVRDSCAgICAgICAgICAgIDI1NSAvLyBmb3IgU3RhQ2ZnLkZpeGVkVHhSYXRlIG9ubHkKKyNkZWZpbmUgSFRSQVRFXzAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkFURV9GSVJTVF9NTV9SQVRFICAgICAgICBIVFJBVEVfMAorI2RlZmluZSBSQVRFX0ZJUlNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCisjZGVmaW5lIFJBVEVfTEFTVF9IVF9SQVRFICAgICAgICBIVFJBVEVfMAorCisvLyBwVHhXSS0+dHhvcAorI2RlZmluZSBJRlNfSFRUWE9QICAgICAgICAgICAgICAgICAwCS8vIFRoZSB0eG9wIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDLgorI2RlZmluZSBJRlNfUElGUyAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJRlNfU0lGUyAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJRlNfQkFDS09GRiAgICAgICAgICAgICAgICAgMworCisvLyBwVHhELT5SZXRyeU1vZGUKKyNkZWZpbmUgTE9OR19SRVRSWSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0hPUlRfUkVUUlkgICAgICAgICAgICAgICAgIDAKKworLy8gQ291bnRyeSBSZWdpb24gZGVmaW5pdGlvbgorI2RlZmluZSBSRUdJT05fTUlOSU1VTV9CR19CQU5EICAgICAgICAgICAgMAorI2RlZmluZSBSRUdJT05fMF9CR19CQU5EICAgICAgICAgICAgICAgICAgMCAgICAgICAvLyAxLTExCisjZGVmaW5lIFJFR0lPTl8xX0JHX0JBTkQgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDEtMTMKKyNkZWZpbmUgUkVHSU9OXzJfQkdfQkFORCAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMTAtMTEKKyNkZWZpbmUgUkVHSU9OXzNfQkdfQkFORCAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMTAtMTMKKyNkZWZpbmUgUkVHSU9OXzRfQkdfQkFORCAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMTQKKyNkZWZpbmUgUkVHSU9OXzVfQkdfQkFORCAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMS0xNAorI2RlZmluZSBSRUdJT05fNl9CR19CQU5EICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzLTkKKyNkZWZpbmUgUkVHSU9OXzdfQkdfQkFORCAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gNS0xMworI2RlZmluZSBSRUdJT05fMzFfQkdfQkFORCAgICAgICAgICAgICAgICAgMzEgICAgICAgLy8gNS0xMworI2RlZmluZSBSRUdJT05fTUFYSU1VTV9CR19CQU5EICAgICAgICAgICAgNworCisjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0FfQkFORCAgICAgICAgICAgICAwCisjZGVmaW5lIFJFR0lPTl8wX0FfQkFORCAgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzFfQV9CQU5EICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorI2RlZmluZSBSRUdJT05fMl9BX0JBTkQgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQKKyNkZWZpbmUgUkVHSU9OXzNfQV9CQU5EICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MQorI2RlZmluZSBSRUdJT05fNF9BX0JBTkQgICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fNV9BX0JBTkQgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEKKyNkZWZpbmUgUkVHSU9OXzZfQV9CQU5EICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgKKyNkZWZpbmUgUkVHSU9OXzdfQV9CQU5EICAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzhfQV9CQU5EICAgICAgICAgICAgICAgICAgIDggICAgICAgLy8gNTIsIDU2LCA2MCwgNjQKKyNkZWZpbmUgUkVHSU9OXzlfQV9CQU5EICAgICAgICAgICAgICAgICAgIDkgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzEwX0FfQkFORCAgICAgICAgICAgICAgICAgIDEwCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl8xMV9BX0JBTkQgICAgICAgICAgICAgICAgICAxMQkgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxCisjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0FfQkFORCAgICAgICAgICAgICAxMQorCisvLyBwVHhELT5DaXBoZXJBbGcKKyNkZWZpbmUgQ0lQSEVSX05PTkUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0lQSEVSX1dFUDY0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0lQSEVSX1dFUDEyOCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0lQSEVSX1RLSVAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ0lQSEVSX0FFUyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ0lQSEVSX0NLSVA2NCAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ0lQSEVSX0NLSVAxMjggICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0lQSEVSX1RLSVBfTk9fTUlDICAgICAgICAgIDcgICAgICAgLy8gTUlDIGFwcGVuZGVkIGJ5IGRyaXZlcjogbm90IGEgdmFsaWQgdmFsdWUgaW4gaGFyZHdhcmUga2V5IHRhYmxlCisjZGVmaW5lIENJUEhFUl9TTVM0CQkJCQk4CisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlJmSWNUeXBlCisjZGVmaW5lIFJGSUNfMjgyMCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDIuNEcgMlQzUgorI2RlZmluZSBSRklDXzI4NTAgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAyLjRHLzVHIDJUM1IKKyNkZWZpbmUgUkZJQ18yNzIwICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMi40RyAxVDJSCisjZGVmaW5lIFJGSUNfMjc1MCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDIuNEcvNUcgMVQyUgorI2RlZmluZSBSRklDXzMwMjAgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAyLjRHIDFUMVIKKyNkZWZpbmUgUkZJQ18yMDIwICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMi40RyBCL0cKKworLy8gTEVEIFN0YXR1cy4KKyNkZWZpbmUgTEVEX0xJTktfRE9XTiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVEX0xJTktfVVAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEVEX1JBRElPX09GRiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTEVEX1JBRElPX09OICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTEVEX0hBTFQgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTEVEX1dQUyAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTEVEX09OX1NJVEVfU1VSVkVZICAgICAgICAgIDYKKyNkZWZpbmUgTEVEX1BPV0VSX1VQICAgICAgICAgICAgICAgIDcKKworLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+TGVkQ250bC5MZWRNb2RlIGFuZCBFMlBST00KKyNkZWZpbmUgTEVEX01PREVfREVGQVVMVCAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVEX01PREVfVFdPX0xFRAkJCTEKKyNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTggIC8vIEVFUFJPTSBkZWZpbmUgPTgKKworLy8gUkM0IGluaXQgdmFsdWUsIHVzZWQgZnJvIFdFUCAmIFRLSVAKKyNkZWZpbmUgUFBQSU5JVEZDUzMyICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYgICAvKiBJbml0aWFsIEZDUyB2YWx1ZSAqLworCisvLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQuIDgwMi4xWCBjb250cm9sbGVkIHBvcnQgZGVmaW5pdGlvbgorI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCAgICAgMQorI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQgMgorCisjZGVmaW5lIFBBSVJXSVNFX0tFWSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdST1VQX0tFWSAgICAgICAgICAgICAgICAgICAyCisKKy8vZGVmaW5pdGlvbiBvZiBEUlMKKyNkZWZpbmUgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gJMzIKKworCisvLyBwcmUtYWxsb2NhdGVkIGZyZWUgTkRJUyBQQUNLRVQvQlVGRkVSIHBvbGwgZm9yIGludGVybmFsIHVzYWdlCisjZGVmaW5lIE1BWF9OVU1fT0ZfRlJFRV9ORElTX1BBQ0tFVCAxMjgKKworLy9CbG9jayBBQ0sKKyNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYgICA2NAorI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRiAgIDY0CisjZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVCAgIDMwCisjZGVmaW5lIERFRkFVTFRfUlhfVElNRU9VVCAgIDMwCisKKy8vIGRlZmluaXRpb24gb2YgUmVjaXBpZW50IG9yIE9yaWdpbmF0b3IKKyNkZWZpbmUgSV9SRUNJUElFTlQgICAgICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIElfT1JJR0lOQVRPUiAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIERFRkFVTFRfQkJQX1RYX1BPV0VSICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkZfVFhfUE9XRVIgICAgICAgICA1CisKKyNkZWZpbmUgTUFYX0lOSV9CVUZGRVJfU0laRQkJCTQwOTYKKyNkZWZpbmUgTUFYX1BBUkFNX0JVRkZFUl9TSVpFCQkoMjA0OCkgLy8gZW5vdWdoIGZvciBBQ0wgKDE4KjY0KQorCQkJCQkJCQkJCQkvLzE4IDogdGhlIGxlbmd0aCBvZiBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAiMDE6MDI6MDM6MDQ6MDU6MDY7IikKKwkJCQkJCQkJCQkJLy82NCA6IE1BWF9OVU1fT0ZfQUNMX0xJU1QKKy8vIGRlZmluaXRpb24gb2YgcEFkLT5PcE1vZGUKKyNkZWZpbmUgT1BNT0RFX1NUQSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgT1BNT0RFX0FQICAgICAgICAgICAgICAgICAgIDEKKy8vI2RlZmluZSBPUE1PREVfTDNfQlJHICAgICAgICAgICAgICAgMiAgICAgICAvLyBhcyBBUCBhbmQgU1RBIGF0IHRoZSBzYW1lIHRpbWUKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyNkZWZpbmUgRElSX1JFQUQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRElSX1dSSVRFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFlQRV9UWEQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFlQRV9SWEQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFlQRV9UWElORk8JCQkJCTAKKyNkZWZpbmUgVFlQRV9SWElORk8JCQkJCTEKKyNkZWZpbmUgVFlQRV9UWFdJCQkJCQkwCisjZGVmaW5lIFRZUEVfUlhXSQkJCQkJMQorI2VuZGlmCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHZhbHVlIGRvbWFpbiBmb3IgcEFkLT5FdmVudFRhYi5Mb2dbXS5FdmVudAorI2RlZmluZSBFVkVOVF9SRVNFVF9BQ0NFU1NfUE9JTlQgICAgMCAvLyBMb2cgPSAiaGg6bW06c3MgICBSZXN0YXJ0IEFjY2VzcyBQb2ludCIKKyNkZWZpbmUgRVZFTlRfQVNTT0NJQVRFRCAgICAgICAgICAgIDEgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGFzc29jaWF0ZWQiCisjZGVmaW5lIEVWRU5UX0RJU0FTU09DSUFURUQgICAgICAgICAyIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBsZWZ0IHRoaXMgQlNTIgorI2RlZmluZSBFVkVOVF9BR0VEX09VVCAgICAgICAgICAgICAgMyAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgd2FzIGFnZWQtb3V0IGFuZCByZW1vdmVkIGZyb20gdGhpcyBCU1MiCisjZGVmaW5lIEVWRU5UX0NPVU5URVJfTSAgICAgICAgICAgICA0CisjZGVmaW5lIEVWRU5UX0lOVkFMSURfUFNLICAgICAgICAgICA1CisjZGVmaW5lIEVWRU5UX01BWF9FVkVOVF9UWVBFICAgICAgICA2CisvLyA9PT09IGVuZCBvZiBBUCBydG1wX2RlZi5oID09PT09PT09PT09PQorCisvLyBkZWZpbml0aW9uIFJTU0kgTnVtYmVyCisjZGVmaW5lIFJTU0lfMAkJCQkJMAorI2RlZmluZSBSU1NJXzEJCQkJCTEKKyNkZWZpbmUgUlNTSV8yCQkJCQkyCisKKy8vIGRlZmluaXRpb24gb2YgcmFkYXIgZGV0ZWN0aW9uCisjZGVmaW5lIFJEX05PUk1BTF9NT0RFCQkJCTAJLy8gTm90IGZvdW5kIHJhZGFyIHNpZ25hbAorI2RlZmluZSBSRF9TV0lUQ0hJTkdfTU9ERQkJCTEJLy8gRm91bmQgcmFkYXIgc2lnbmFsLCBhbmQgZG9pbmcgY2hhbm5lbCBzd2l0Y2gKKyNkZWZpbmUgUkRfU0lMRU5DRV9NT0RFCQkJCTIJLy8gQWZ0ZXIgY2hhbm5lbCBzd2l0Y2gsIG5lZWQgdG8gYmUgc2lsZW5jZSBhIHdoaWxlIHRvIGVuc3VyZSByYWRhciBub3QgZm91bmQKKworLy9Ecml2ZXIgZGVmaW5lZCBjaWQgZm9yIG1hcHBpbmcgc3RhdHVzIGFuZCBjb21tYW5kLgorI2RlZmluZSAgU0xFRVBDSUQJMHgxMQorI2RlZmluZSAgV0FLRUNJRAkweDIyCisjZGVmaW5lICBRVUVSWVBPV0VSQ0lECTB4MzMKKyNkZWZpbmUgIE9XTkVSTUNVCTB4MQorI2RlZmluZSAgT1dORVJDUFUJMHgwCisKKy8vIE1CU1NJRCBkZWZpbml0aW9uCisjZGVmaW5lIEVOVFJZX05PVF9GT1VORCAgICAgICAgICAgICAweEZGCisKKworLyogQWZ0ZXIgTGludXggMi42LjksCisgKiBWTEFOIG1vZHVsZSB1c2UgUHJpdmF0ZSAoZnJvbSB1c2VyKSBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+cHJpdl9mbGFncykuCisgKiAjZGVmaW5lIElGRl84MDJfMVFfVkxBTiAweDEgICAgICAgICAtLSAgICA4MDIuMVEgVkxBTiBkZXZpY2UuICBpbiBpZi5oCisgKiByZWYgdG8gaXBfc2Fib3RhZ2Vfb3V0KCkgWyBvdXQtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4gXSBpbiBicl9uZXRmaWx0ZXIuYworICoKKyAqIEZvciB0aGlzIHJlYXNvbiwgd2UgTVVTVCB1c2UgRVZFTiB2YWx1ZSBpbiBwcml2X2ZsYWdzCisgKi8KKyNkZWZpbmUgSU5UX01BSU4gICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBJTlRfTUJTU0lEICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIElOVF9XRFMgICAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgSU5UX0FQQ0xJICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJTlRfTUVTSCAgICAgICAgICAgICAgICAgICAJMHgwNTAwCisKKy8vIFVzZSBiaXRtYXAgdG8gYWxsb3cgY29leGlzdCBvZiBBVEVfVFhGUkFNRSBhbmQgQVRFX1JYRlJBTUUoaS5lLix0byBzdXBwb3J0IExvb3BCYWNrIG1vZGUpCisjaWZkZWYgUkFMSU5LX0FURQorI2RlZmluZQlBVEVfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMCAgIC8vIFN0YXJ0IEFURQorI2RlZmluZQlBVEVfU1RPUCAgICAgICAgICAgICAgICAgICAgMHg4MCAgIC8vIFN0b3AgQVRFCisjZGVmaW5lCUFURV9UWENPTlQgICAgICAgICAgICAgICAgICAweDA1ICAgLy8gQ29udGludW91cyBUcmFuc21pdAorI2RlZmluZQlBVEVfVFhDQVJSICAgICAgICAgICAgICAgICAgMHgwOSAgIC8vIFRyYW5zbWl0IENhcnJpZXIKKyNkZWZpbmUJQVRFX1RYQ0FSUlNVUFAgICAgICAgICAgICAgIDB4MTEgICAvLyBUcmFuc21pdCBDYXJyaWVyIFN1cHByZXNzaW9uCisjZGVmaW5lCUFURV9UWEZSQU1FICAgICAgICAgICAgICAgICAweDAxICAgLy8gVHJhbnNtaXQgRnJhbWVzCisjZGVmaW5lCUFURV9SWEZSQU1FICAgICAgICAgICAgICAgICAweDAyICAgLy8gUmVjZWl2ZSBGcmFtZXMKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorI2RlZmluZSBBVEVfVFhTVE9QICAgICAgICAgICAgICAgICAgMHhlMiAgIC8vIFN0b3AgVHJhbnNtaXRpb24oaS5lLiwgVFhDT05ULCBUWENBUlIsIFRYQ0FSUlNVUFAsIGFuZCBUWEZSQU1FKQorI2RlZmluZSBBVEVfUlhTVE9QCQkJCQkweGZkICAgLy8gU3RvcCByZWNlaXZpbmcgRnJhbWVzCisjZGVmaW5lCUJCUDIyX1RYRlJBTUUgICAgIAkJCTB4MDAgICAvLyBUcmFuc21pdCBGcmFtZXMKKyNkZWZpbmUJQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQICAgIDB4ODAgICAvLyBDb250aW51b3VzIFRyYW5zbWl0IG9yIENhcnJpZXIgU3VwcHJlc3Npb24KKyNkZWZpbmUJQkJQMjJfVFhDQVJSICAgICAgICAgICAgICAgIDB4YzEgICAvLyBUcmFuc21pdCBDYXJyaWVyCisjZGVmaW5lCUJCUDI0X1RYQ09OVCAgICAgICAgICAgICAgICAweDAwICAgLy8gQ29udGludW91cyBUcmFuc21pdAorI2RlZmluZQlCQlAyNF9DQVJSU1VQUCAgICAgICAgICAgICAgMHgwMSAgIC8vIENhcnJpZXIgU3VwcHJlc3Npb24KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworLy8gV0VQIEtleSBUWVBFCisjZGVmaW5lIFdFUF9IRVhBREVDSU1BTF9UWVBFICAgIDAKKyNkZWZpbmUgV0VQX0FTQ0lJX1RZUEUgICAgICAgICAgMQorCisKKworLy8gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKy8qIE1heCBudW1iZXIgb2YgY2hhciBpbiBjdXN0b20gZXZlbnQsIHJlZmVyIHRvIHdpcmVsZXNzX3Rvb2xzLjI4L3dpcmVsZXNzLjIwLmggKi8KKyNkZWZpbmUgSVdfQ1VTVE9NX01BWF9MRU4JCQkJICAJCQkyNTUJLyogSW4gYnl0ZXMgKi8KKworLy8gRm9yIHN5c3RlbSBldmVudCAtIHN0YXJ0CisjZGVmaW5lCUlXX1NZU19FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lCUlXX0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lCUlXX0RJU0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lCUlXX0RFQVVUSF9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIAkweDAyMDIKKyNkZWZpbmUJSVdfQUdFT1VUX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgCTB4MDIwMworI2RlZmluZQlJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZQlJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIDB4MDIwNQorI2RlZmluZQlJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIAkJCTB4MDIwNgorI2RlZmluZQlJV19NSUNfRElGRl9FVkVOVF9GTEFHICAgICAgICAgICAJCQkweDAyMDcKKyNkZWZpbmUgSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcJCQkJCQkweDAyMDgKKyNkZWZpbmUgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcJCQkJCQkweDAyMDkKKyNkZWZpbmUgSVdfR1JPVVBfSFNfVElNRU9VVF9FVkVOVF9GTEFHCQkJCTB4MDIwQQorI2RlZmluZQlJV19QQUlSV0lTRV9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkweDAyMEIKKyNkZWZpbmUgSVdfUlNOSUVfU0FOSVRZX0ZBSUxfRVZFTlRfRkxBRwkJCQkweDAyMEMKKyNkZWZpbmUgSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRwkJCQkweDAyMEQKKyNkZWZpbmUgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRwkJCQkweDAyMEUKKyNkZWZpbmUgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHCQkJCQkweDAyMEYKKyNkZWZpbmUgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcJCQkJCTB4MDIxMAorI2RlZmluZSBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHCQkJCTB4MDIxMQorI2RlZmluZSBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIxMgorLy8gaWYgYWRkIG5ldyBzeXN0ZW0gZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1lTX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX1NZU19FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEyCisjZGVmaW5lCUlXX1NZU19FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TWVNfRVZFTlRfRkxBR19FTkQgLSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3Igc3lzdGVtIGV2ZW50IC0gZW5kCisKKy8vIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBzdGFydAorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcJCQkJCTB4MDMwMAorI2RlZmluZSBJV19TUE9PRl9BU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkJMHgwMzAxCisjZGVmaW5lIElXX1NQT09GX1JFQVNTT0NfUkVTUF9FVkVOVF9GTEFHCQkJMHgwMzAyCisjZGVmaW5lIElXX1NQT09GX1BST0JFX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDMKKyNkZWZpbmUgSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNAorI2RlZmluZSBJV19TUE9PRl9ESVNBU1NPQ19FVkVOVF9GTEFHCQkJCTB4MDMwNQorI2RlZmluZSBJV19TUE9PRl9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNgorI2RlZmluZSBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA3CisjZGVmaW5lIElXX1NQT09GX1VOS05PV05fTUdNVF9FVkVOVF9GTEFHCQkJMHgwMzA4CisjZGVmaW5lIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRwkJCQkJMHgwMzA5CisvLyBpZiBhZGQgbmV3IHNwb29mIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TUE9PRl9FVkVOVF9GTEFHX0VORAorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgIDB4MDMwOQorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAtIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQorLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIGVuZAorCisvLyBGb3IgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IC0gc3RhcnQKKyNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDAKKyNkZWZpbmUgSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAxCisjZGVmaW5lIElXX0ZMT09EX1JFQVNTT0NfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAyCisjZGVmaW5lIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHCQkJCTB4MDQwMworI2RlZmluZSBJV19GTE9PRF9ESVNBU1NPQ19FVkVOVF9GTEFHCQkJCTB4MDQwNAorI2RlZmluZSBJV19GTE9PRF9ERUFVVEhfRVZFTlRfRkxBRwkJCQkJMHgwNDA1CisjZGVmaW5lIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRwkJCQkJMHgwNDA2CisvLyBpZiBhZGQgbmV3IGZsb29kaW5nIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19GTE9PRF9FVkVOVF9GTEFHX0VORAorI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAJMHgwNDA2CisjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EIC0gSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3IgZmxvb2RpbmcgYXR0YWNrIC0gZW5kCisKKy8vIEVuZCAtIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIGRlZmluaXRpb24gZm9yIERMUywga2F0aHkKKyNkZWZpbmUJTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSAgIDEKKyNkZWZpbmUJTUFYX05VTV9PRl9ETFNfRU5UUlkgICAgICAgIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCisKKy8vQmxvY2sgQUNLICwgcnQyODYwLCBrYXRoeQorI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRgkJNjQKKyNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYJCTY0CisjZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVAkJMzAKKyNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUCQkzMAorI2lmbmRlZiBDT05GSUdfQVBfU1VQUE9SVAorI2RlZmluZSBNQVhfQkFSRUNJX1NFU1NJT04JCTgKKyNlbmRpZgorCisjaWZuZGVmIElXX0VTU0lEX01BWF9TSVpFCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIEVTU0lEIGFuZCBwQWQtPm5pY2tuYW1lIHN0cmluZ3MgKi8KKyNkZWZpbmUgSVdfRVNTSURfTUFYX1NJWkUgICAJCTMyCisjZW5kaWYKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKyNkZWZpbmUgTUNBU1RfRElTQUJMRQkwCisjZGVmaW5lIE1DQVNUX0NDSwkJMQorI2RlZmluZSBNQ0FTVF9PRkRNCQkyCisjZGVmaW5lIE1DQVNUX0hUTUlYCQkzCisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisvLyBGb3IgQXNpY1JhZGlvT2ZmL0FzaWNSYWRpb09uIGZ1bmN0aW9uCisjZGVmaW5lIERPVDExUE9XRVJTQVZFCQkwCisjZGVmaW5lIEdVSVJBRElPX09GRgkJMQorI2RlZmluZSBSVE1QX0hBTFQJCSAgICAyCisjZGVmaW5lIEdVSV9JRExFX1BPV0VSX1NBVkUJCTMKKy8vIC0tCisKKworLy8gZGVmaW5pdGlvbiBmb3IgV3BhU3VwcG9ydCBmbGFnCisjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0RJU0FCTEUJCQkJMAorI2RlZmluZSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUJCQkJMQorI2RlZmluZQlXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkJMgorCisvLyBFbmRpYW4gYnl0ZSBzd2FwcGluZyBjb2RlcworI2RlZmluZSBTV0FQMTYoeCkgXAorICAgICgoVUlOVDE2KSggXAorICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweDAwZmZVKSA8PCA4KSB8IFwKKyAgICAoKChVSU5UMTYpKHgpICYgKFVJTlQxNikgMHhmZjAwVSkgPj4gOCkgKSkKKworI2RlZmluZSBTV0FQMzIoeCkgXAorICAgICgoVUlOVDMyKSggXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMDAwZmYwMFVMKSA8PCAgOCkgfCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweGZmMDAwMDAwVUwpID4+IDI0KSApKQorCisjZGVmaW5lIFNXQVA2NCh4KSBcCisgICAgKChVSU5UNjQpKCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NikgKSkKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKworI2RlZmluZSBjcHUybGU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBsZTJjcHU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBjcHUybGUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBsZTJjcHUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBjcHUybGUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBsZTJjcHUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBjcHUyYmU2NCh4KSAoKFVJTlQ2NCkoeCkpCisjZGVmaW5lIGJlMmNwdTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgY3B1MmJlMzIoeCkgKChVSU5UMzIpKHgpKQorI2RlZmluZSBiZTJjcHUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGNwdTJiZTE2KHgpICgoVUlOVDE2KSh4KSkKKyNkZWZpbmUgYmUyY3B1MTYoeCkgKChVSU5UMTYpKHgpKQorCisjZWxzZSAgIC8vIExpdHRsZV9FbmRpYW4KKworI2RlZmluZSBjcHUybGU2NCh4KSAoKFVJTlQ2NCkoeCkpCisjZGVmaW5lIGxlMmNwdTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgY3B1MmxlMzIoeCkgKChVSU5UMzIpKHgpKQorI2RlZmluZSBsZTJjcHUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGNwdTJsZTE2KHgpICgoVUlOVDE2KSh4KSkKKyNkZWZpbmUgbGUyY3B1MTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBjcHUyYmU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBiZTJjcHU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBjcHUyYmUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBiZTJjcHUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBjcHUyYmUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBiZTJjcHUxNih4KSBTV0FQMTYoKHgpKQorCisjZW5kaWYgIC8vIFJUX0JJR19FTkRJQU4KKworI2VuZGlmICAvLyBfX1JUTVBfREVGX0hfXworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90eXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDdkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRtcF90eXBlLmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTmFtZSAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisgICAgUGF1bCBMaW4gICAgMS0yLTIwMDQKKyovCisjaWZuZGVmIF9fUlRNUF9UWVBFX0hfXworI2RlZmluZSBfX1JUTVBfVFlQRV9IX18KKworI2RlZmluZSBQQUNLRUQgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvLyBQdXQgcGxhdGZvcm0gZGVwZW5kZW50IGRlY2xhcmF0aW9uIGhlcmUKKy8vIEZvciBleGFtcGxlLCBsaW51eCB0eXBlIGRlZmluaXRpb24KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUlOVDY0OwordHlwZWRlZiBpbnQJCQkJCUlOVDMyOwordHlwZWRlZiBsb25nIGxvbmcgCQkJSU5UNjQ7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqCQkJUFVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAqCQlQVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgKgkJCVBVSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAqCVBVSU5UNjQ7Cit0eXBlZGVmIGludAkqCQkJCQlQSU5UMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyAqIAkJCVBJTlQ2NDsKKwordHlwZWRlZiBzaWduZWQgY2hhcgkJCUNIQVI7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydAkJU0hPUlQ7Cit0eXBlZGVmIHNpZ25lZCBpbnQJCQlJTlQ7Cit0eXBlZGVmIHNpZ25lZCBsb25nCQkJTE9ORzsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZwlMT05HTE9ORzsKKworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCVVDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJVVNIT1JUOwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCVVJTlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCVVMT05HOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUxPTkdMT05HOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCUJPT0xFQU47Cit0eXBlZGVmIHZvaWQJCQkJVk9JRDsKKwordHlwZWRlZiBWT0lEICoJCQkJUFZPSUQ7Cit0eXBlZGVmIENIQVIgKgkJCQlQQ0hBUjsKK3R5cGVkZWYgVUNIQVIgKiAJCQlQVUNIQVI7Cit0eXBlZGVmIFVTSE9SVCAqCQkJUFVTSE9SVDsKK3R5cGVkZWYgTE9ORyAqCQkJCVBMT05HOwordHlwZWRlZiBVTE9ORyAqCQkJCVBVTE9ORzsKK3R5cGVkZWYgVUlOVCAqCQkJCVBVSU5UOworCit0eXBlZGVmIHVuc2lnbmVkIGludAlORElTX01FRElBX1NUQVRFOworCit0eXBlZGVmIHVuaW9uIF9MQVJHRV9JTlRFR0VSIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBVSU5UIExvd1BhcnQ7CisgICAgICAgIElOVDMyIEhpZ2hQYXJ0OworICAgIH0gdTsKKyAgICBJTlQ2NCBRdWFkUGFydDsKK30gTEFSR0VfSU5URUdFUjsKKworI2VuZGlmICAvLyBfX1JUTVBfVFlQRV9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZjI1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0hfXworI2RlZmluZSBfX1NQRUNUUlVNX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfVFBDX1JFUE9SVF9JTkZPCit7CisJVUlOVDggVHhQd3I7CisJVUlOVDggTGlua01hcmdpbjsKK30gVFBDX1JFUE9SVF9JTkZPLCAqUFRQQ19SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSF9TV19BTk5fSU5GTworeworCVVJTlQ4IENoU3dNb2RlOworCVVJTlQ4IENoYW5uZWw7CisJVUlOVDggQ2hTd0NudDsKK30gQ0hfU1dfQU5OX0lORk8sICpQQ0hfU1dfQU5OX0lORk87CisKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUV9NT0RFCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjE6NDsKKwkJVUlOVDggUmVwb3J0OjE7CisJCVVJTlQ4IFJlcXVlc3Q6MTsKKwkJVUlOVDggRW5hYmxlOjE7CisJCVVJTlQ4IFJldjA6MTsKKwl9IGZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXYwOjE7CisJCVVJTlQ4IEVuYWJsZToxOworCQlVSU5UOCBSZXF1ZXN0OjE7CisJCVVJTlQ4IFJlcG9ydDoxOworCQlVSU5UOCBSZXYxOjQ7CisJfSBmaWVsZDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKK30gTUVBU1VSRV9SRVEsICpQTUVBU1VSRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVFfSU5GTworeworCVVJTlQ4IFRva2VuOworCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKKwlVSU5UOCBSZXFUeXBlOworCU1FQVNVUkVfUkVRIE1lYXN1cmVSZXE7Cit9IE1FQVNVUkVfUkVRX0lORk8sICpQTUVBU1VSRV9SRVFfSU5GTzsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUAoreworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXY6MzsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJhZGFyOjE7CisJCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOworCQlVSU5UOCBPZmRtUHJlYW1ibGU6MTsKKwkJVUlOVDggQlNTOjE7CisJfSBmaWVsZDsKKyNlbHNlCisJc3RydWN0IFBBQ0tFRAorCXsKKwkJVUlOVDggQlNTOjE7CisJCVVJTlQ4IE9mZG1QcmVhbWJsZToxOworCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKKwkJVUlOVDggUmFkYXI6MTsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJldjozOworCX0gZmllbGQ7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCVVJTlQ4IHdvcmQ7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlQKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCU1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCBNYXA7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JULCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQ0NBX1JFUE9SVAoreworCVVJTlQ4IENoTnVtOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOworCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJVUlOVDggQ0NBX0J1c3lfRnJhY3Rpb247Cit9IE1FQVNVUkVfQ0NBX1JFUE9SVCwgKlBNRUFTVVJFX0NDQV9SRVBPUlQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SUElfUkVQT1JUCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlVSU5UOCBSUElfRGVuc2l0eVs4XTsKK30gTUVBU1VSRV9SUElfUkVQT1JULCAqUE1FQVNVUkVfUlBJX1JFUE9SVDsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX01PREUKK3sKKwlzdHJ1Y3QgUEFDS0VECisJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJVUlOVDggUmV2OjU7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IExhdGU6MTsKKyNlbHNlCisJCVVJTlQ4IExhdGU6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggUmV2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCX0gZmllbGQ7CisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVBPUlRfTU9ERSwgKlBNRUFTVVJFX1JFUE9SVF9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX0lORk8KK3sKKwlVSU5UOCBUb2tlbjsKKwlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7CisJVUlOVDggUmVwb3J0VHlwZTsKKwlVSU5UOCBPY3RlY3RbMF07Cit9IE1FQVNVUkVfUkVQT1JUX0lORk8sICpQTUVBU1VSRV9SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9RVUlFVF9JTkZPCit7CisJVUlOVDggUXVpZXRDbnQ7CisJVUlOVDggUXVpZXRQZXJpb2Q7CisJVUlOVDggUXVpZXREdXJhdGlvbjsKKwlVSU5UOCBRdWlldE9mZnNldDsKK30gUVVJRVRfSU5GTywgKlBRVUlFVF9JTkZPOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUNIQVIgRGlhbG9nVG9rZW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlQ2hTd0FubigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKKwkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UcGNSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitWT0lEIE1lYXN1cmVSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCk7CisjZW5kaWYgLy8gX19TUEVDVFJVTV9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW1fZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNDgxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW1fZGVmLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwlzcGVjdHJ1bV9kZWYuaAorCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlGb25jaGkgV3UgICAgMjAwOAkgIAkgICBjcmVhdGVkIGZvciA4MDIuMTFoCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0RFRl9IX18KKyNkZWZpbmUgX19TUEVDVFJVTV9ERUZfSF9fCisKKyNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzCisjZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMworI2RlZmluZSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFCQlNQVhfVFBDX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1JTl9SQ1ZfUFdSCQkJCTEwMAkJLyogTmVnYXRpdmUgdmFsdWUgKChkQm0pICovCisKKyNkZWZpbmUgUk1fVFBDX1JFUQkJCQkwCisjZGVmaW5lIFJNX01FQVNVUkVfUkVRCQkJMQorCisjZGVmaW5lIFJNX0JBU0lDCQkJCTAKKyNkZWZpbmUgUk1fQ0NBCQkJCQkxCisjZGVmaW5lIFJNX1JQSV9ISVNUT0dSQU0JCTIKKworI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCisjZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLworCisjZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKKyNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCisKK3R5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQoreworCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OworCVVMT05HIGxhc3RUaW1lOworCUJPT0xFQU4JVmFsaWQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCit9IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCit7CisJVUNIQVIgU2l6ZTsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07CisJTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9FTlRSWQoreworCXN0cnVjdCBfVFBDX1JFUV9FTlRSWSAqcE5leHQ7CisJVUxPTkcgbGFzdFRpbWU7CisJQk9PTEVBTiBWYWxpZDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKK30gVFBDX1JFUV9FTlRSWSwgKlBUUENfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9UQUIKK3sKKwlVQ0hBUiBTaXplOworCVBUUENfUkVRX0VOVFJZIEhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07CisJVFBDX1JFUV9FTlRSWSBDb250ZW50W01BWF9UUENfUkVRX1RBQl9TSVpFXTsKK30gVFBDX1JFUV9UQUIsICpQVFBDX1JFUV9UQUI7CisKKyNlbmRpZiAvLyBfX1NQRUNUUlVNX0RFRl9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjRhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9haXJvbmV0LmMKQEAgLTAsMCArMSwxMzEyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWFpcm9uZXQuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQJQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUJCSpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMJVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfQUlST05FVF9TVEFURSwgTUFYX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFJUk9ORVRfSURMRSwgQUlST05FVF9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0TXNnQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVxdWVzdEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfU0NBTk5JTkcsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVwb3J0QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldE1zZ0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCit7CisJVVNIT1JUCQkJCQkJCUxlbmd0aDsKKwlVQ0hBUgkJCQkJCQlJbmRleCwgaTsKKwlQVUNIQVIJCQkJCQkJcERhdGE7CisJUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRQkJcFJNUmVxOworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxRWxlbTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7CisKKwkvLyAwLiBHZXQgQWlyb25ldCBJQVBQIGhlYWRlciBmaXJzdAorCXBSTVJlcSA9IChQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCXBEYXRhICA9IChQVUNIQVIpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisKKwkvLyAxLiBDaGFuZ2UgZW5kaWFuIGZvcm1hdCBmb3JtIG5ldHdvcmsgdG8gbGl0dGxlIGVuZGlhbgorCUxlbmd0aCA9IGJlMmNwdTE2KHBSTVJlcS0+SUFQUC5MZW5ndGgpOworCisJLy8gMi4wIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBDQ1ggMi4wIHN1cHBvcnQgaXMgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5DQ1hFbmFibGUgIT0gVFJVRSkKKwkJcmV0dXJuOworCisJLy8gMi4xIFJhZGlvIG1lYXN1cmVtZW50IG11c3QgYmUgb24KKwlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5STUVuYWJsZSAhPSAxKQorCQlyZXR1cm47CisKKwkvLyAyLjIuIERlYnVnIHByaW50IGFsbCBiaXQgaW5mb3JtYXRpb24KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIElEICYgTGVuZ3RoICVkXG4iLCBMZW5ndGgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5UeXBlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBTdWJUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuU3ViVHlwZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgRGlhbG9nIFRva2VuICV4XG4iLCBwUk1SZXEtPklBUFAuVG9rZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIEFjdGl2YXRpb24gRGVsYXkgJXhcbiIsIHBSTVJlcS0+RGVsYXkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIE1lYXN1cmVtZW50IE9mZnNldCAleFxuIiwgcFJNUmVxLT5PZmZzZXQpKTsKKworCS8vIDMuIENoZWNrIElBUFAgZnJhbWUgdHlwZSwgaXQgbXVzdCBiZSAweDMyIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbgorCWlmIChwUk1SZXEtPklBUFAuVHlwZSAhPSBBSVJPTkVUX0lBUFBfVFlQRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgdHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDQuIENoZWNrIElBUFAgZnJhbWUgc3VidHlwZSwgaXQgbXVzdCBiZSAweDAxIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiByZXF1ZXN0LgorCS8vICAgIFNpbmNlIHdlIGFyZSBhY3RpbmcgYXMgY2xpZW50IG9ubHksIHdlIHdpbGwgZGlzcmVnYXJkcyByZXBseSBzdWJ0eXBlLgorCWlmIChwUk1SZXEtPklBUFAuU3ViVHlwZSAhPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBzdWJ0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gNS4gVmVyaWZ5IERlc3RpbmF0aW9uIE1BQyBhbmQgU291cmNlIE1BQywgYm90aCBzaG91bGQgYmUgYWxsIHplcm9zLgorCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5EQSwgWkVST19NQUNfQUREUikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIERBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLlNBLCBaRVJPX01BQ19BRERSKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgU0EgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyA2LiBSZWluaXQgYWxsIHJlcG9ydCByZWxhdGVkIGZpZWxkcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLCAyMDQ4KTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXQsIHNpemVvZihVU0hPUlQpICogTUFYX0xFTl9PRl9CU1NfVEFCTEUpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdCwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSAqIDQpOworCisJLy8gNy4gUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGZpcnN0IGVsZW1lbnQgcmVwb3J0IGVsZW1lbnQKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAgID0gTEVOR1RIXzgwMl8xMSArIHNpemVvZihBSVJPTkVUX0lBUFBfSEVBREVSKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggICAgID0gMHhmZjsKKwlwQWQtPlN0YUNmZy5STVJlcUNudCAgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSAgICAgID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxEdXJhdGlvbiA9IDA7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxDaGFubmVsICA9IDA7CisJcEFkLT5TdGFDZmcuSUFQUFRva2VuICAgICAgICA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKwlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggID0gMDsKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICAgID0gMDsKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJSW5kZXggPSAwOworCisJLy8gOC4gU2F2ZSBkaWFsb2cgdG9rZW4gZm9yIHJlcG9ydAorCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKworCS8vIFNhdmUgQWN0aXZhdGlvbiBkZWxheSAmIG1lYXN1cmVtZW50IG9mZnNldCwgTm90IHJlYWxseSBuZWVkZWQKKworCS8vIDkuIFBvaW50IHRvIHRoZSBmaXJzdCByZXF1ZXN0IGVsZW1lbnQKKwlwRGF0YSArPSBzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKTsKKwkvLyAgICBMZW5ndGggc2hvdWxkIGV4Y2x1ZGUgdGhlIENJU0NPIEFpcm9uZXQgU05BUCBoZWFkZXIKKwlMZW5ndGggLT0gKHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpIC0gTEVOR1RIXzgwMl8xX0gpOworCisJLy8gMTAuIFN0YXJ0IFBhcnNpbmcgdGhlIE1lYXN1cmVtZW50IGVsZW1lbnRzLgorCS8vICAgIEJlIGNhcmVmdWwgYWJvdXQgbXVsdGlwbGUgTVIgZWxlbWVudHMgd2l0aGluIG9uZSBmcmFtZXMuCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQlwUmVxRWxlbSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pIHBEYXRhOworCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCS8vIEZyb20gdGhlIGV4YW1wbGUsIGl0IHNlZW1zIHdlIG9ubHkgbmVlZCB0byBzdXBwb3J0IG9uZSByZXF1ZXN0IGluIG9uZSBmcmFtZQorCQkJCS8vIFRoZXJlIGlzIG5vIG11bHRpcGxlIHJlcXVlc3QgaW4gb25lIGZyYW1lLgorCQkJCS8vIEJlc2lkZXMsIGxvb2tzIGxpa2Ugd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhlIG1lYXN1cmVtZW50IHJlcXVlc3Qgb25seS4KKwkJCQkvLyBUaGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBpcyBhbHdheXMgNCBieXRlcy4KKworCQkJCS8vIFN0YXJ0IHBhcnNpbmcgdGhpcyB0eXBlIG9mIHJlcXVlc3QuCisJCQkJLy8gMC4gRWlkIGlzIElFX01FQVNVUkVNRU5UX1JFUVVFU1QKKwkJCQkvLyAxLiBMZW5ndGggZGlkbid0IGluY2x1ZGUgRWlkIGFuZCBMZW5ndGggZmllbGQsIGl0IGFsd2F5cyBiZSA4LgorCQkJCS8vIDIuIE1lYXN1cmVtZW50IFRva2VuLCB3ZSBubmVkIHRvIHNhdmUgaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJlcG9ydC4KKwkJCQkvLyAzLiBNZWFzdXJlbWVudCBNb2RlLCBBbHRob3VnaCB0aGVyZSBhcmUgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkaW4ndCBzZWUgdmFsdWUgb3RoZXIgdGhhbgorCQkJCS8vICAgIDAgZnJvbSB0ZXN0IHNwZWNzIGV4YW1wbGVzLgorCQkJCS8vIDQuIE1lYXN1cmVtZW50IFR5cGUsIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGRvLgorCQkJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uVHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE6CisJCQkJCWNhc2UgTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROgorCQkJCQljYXNlIE1TUk5fVFlQRV9CRUFDT05fUkVROgorCQkJCQkJLy8gQ2hlY2sgdGhlIEVuYWJsZSBub24tc2VydmluZyBjaGFubmVsIG1lYXN1cmVtZW50IGNvbnRyb2wKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkRDUk1FbmFibGUgPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBDaGVjayBjaGFubmVsIGJlZm9yZSBlbnF1ZXVlIHRoZSBhY3Rpb24KKwkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gSWYgb2ZmIGNoYW5uZWwgbWVhc3VyZW1lbnQsIGNoZWNrIHRoZSBUVSBkdXJhdGlvbiBsaW1pdAorCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5UdUxpbWl0KQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIFNhdmUgcmVxdWVzdHMgYW5kIGV4ZWN1dGUgYWN0aW9ucyBsYXRlcgorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0sIHBSZXFFbGVtLCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pKTsKKwkJCQkJCUluZGV4ICs9IDE7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1TUk5fVFlQRV9GUkFNRV9SRVE6CisJCQkJCQkvLyBTaW5jZSBpdCdzIG9wdGlvbiwgd2Ugd2lsbCBzdXBwb3J0IGxhdGVyCisJCQkJCQkvLyBGcmFtZVJlcXVlc3RBY3Rpb24ocEFkLCBwRGF0YSk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gUG9pbnQgdG8gbmV4dCBNZWFzdXJlbWVudCByZXF1ZXN0CisJCQkJcERhdGEgICs9IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJTGVuZ3RoIC09IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJYnJlYWs7CisKKwkJCS8vIFdlIGFjY2VwdCByZXF1ZXN0IG9ubHksIGFsbCBvdGhlcnMgYXJlIGRyb3BwZWQKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJY2FzZSBJRV9BUF9UWF9QT1dFUjoKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuOworCQl9CisJfQorCisJLy8gMTEuIFVwZGF0ZSBzb21lIGZsYWdzIGFuZCBpbmRleAorCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ID0gSW5kZXg7CisKKwlpZiAoSW5kZXgpCisJeworCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKK3sKKwlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKKworCS8vIDEuIFBvaW50IHRvIG5leHQgcmVxdWVzdCBlbGVtZW50CisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCS8vIDIuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCisJaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKKwkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UKKwkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJcmV0dXJuOworCisJLy8gMy4gUGVlayBpbnRvIHRoZSBuZXh0IHJlcXVlc3QsIGlmIGl0J3MgcGFyYWxsZWwsIHdlIHdpbGwgdXBkYXRlIHRoZSBzY2FuIHRpbWUgdG8gdGhlIGxhcmdlc3Qgb25lCisJaWYgKChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxKSA8IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQorCXsKKwkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMV07CisJCS8vIENoZWNrIGZvciBwYXJhbGxlbCBiaXQKKwkJaWYgKChwUmVxLT5SZXFFbGVtLk1vZGUgJiAweDAxKSAmJiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCisJCXsKKwkJCS8vIFVwZGF0ZSBwYXJhbGxlbCBtb2RlIHJlcXVlc3QgaW5mb3JtYXRpb24KKwkJCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gVFJVRTsKKwkJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lID0gKChwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSA/CisJCQkocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pIDogKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSk7CisJCX0KKwl9CisKKwkvLyA0LiBDYWxsIFJUMjhYWF9NTE1FX0hBTkRMRVIgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBtbG1lIGNvbW1hbmRzLCBTY2FuIHJlcXVlc3QgaXMgdGhlIG9ubHkgb25lIHVzZWQKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBjaGFubmVsIGxvYWQgcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKwlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7CisJUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOworCisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOworCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7CisKKwkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAorCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCisJLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgorCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KKwkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KKwkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KKwkvLyBQYXNzaXZlIHNjYW4gTW9kZQorCisJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCisJCXJldHVybjsKKworCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KKwlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOworCisJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOzsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgCT0gQlRZUEVfREFUQTsKKwkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOworCisJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCX0KKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7CisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgPSAwOworCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKKworCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKKworCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKwlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl0sIGk7CisJTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCS8vIFBhc3NpdmUgc2NhbiBNb2RlCisKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKKwkJcmV0dXJuOworCisJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19OT0lTRSk7CisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOworCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKKworCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgorCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm47CisKKwkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgIAk9IEJUWVBFX0RBVEE7CisJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKKworCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwl9CisKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOworCisJLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQmVhY29uUmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCWlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9QQVNTSVZFKQorCXsKKwkJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFzc2l2ZSBTY2FuIE1vZGUhXG4iKSk7CisKKwkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwkJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQorCQkJcmV0dXJuOworCisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX1BBU1NJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQUNUSVZFKQorCXsKKwkJLy8gQWN0aXZlIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY3RpdmUgU2NhbiBNb2RlIVxuIikpOworCisJCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJCXJldHVybjsKKworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19BQ1RJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFKQorCXsKKwkJLy8gQmVhY29uIHJlcG9ydCBNb2RlLCByZXBvcnQgYWxsIHRoZSBBUFMgaW4gY3VycmVudCBic3MgdGFibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uIFJlcG9ydCBNb2RlIVxuIikpOworCisJCS8vIENvcHkgY3VycmVudCBCU1MgdGFibGUgdG8gQ0NYIHRhYmxlLCB3ZSBjYW4gb21pdCB0aGlzIHN0ZXAgbGF0ZXIgb24uCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsICZwQWQtPlNjYW5UYWIsIHNpemVvZihCU1NfVEFCTEUpKTsKKworCQkvLyBDcmVhdGUgYmVhY29uIHJlcG9ydCBmcm9tIEJzcyB0YWJsZQorCQlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKHBBZCk7CisKKwkJLy8gU2V0IHN0YXRlIHRvIHNjYW5uaW5nCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJCS8vIEVucXVldWUgcmVwb3J0IHJlcXVlc3QKKwkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFdyb25nIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcm9uZyBTY2FuIE1vZGUhXG4iKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQoreworCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOworCVVMT05HCQkJCU5vdzMyOworCisgICAgTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3czMjsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMS4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKKwlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQorCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKKwkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZQorCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4KKwkJOworCisJLy8gMi4gUG9pbnQgdG8gdGhlIGNvcnJlY3QgaW5kZXggb2YgYWN0aW9uIGVsZW1lbnQsIHN0YXJ0IGZyb20gMAorCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOworCisJLy8gMy4gQ2hlY2sgZm9yIHBhcmFsbGVsIGFjdGlvbnMKKwlpZiAocEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPT0gVFJVRSkKKwl7CisJCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwkJLy8gUHJvY2VzcyBuZXh0IGFjdGlvbiByaWdodCBhd2F5CisJCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCisJCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisKKwkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7CisJfQorCisJaWYgKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCA+PSBwQWQtPlN0YUNmZy5STVJlcUNudCkKKwl7CisJCS8vIDQuIFRoZXJlIGlzIG5vIG1vcmUgdW5wcm9jZXNzZWQgbWVhc3VyZW1lbnQgcmVxdWVzdCwgZ28gZm9yIHRyYW5zbWl0IHRoaXMgcmVwb3J0CisJCUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbihwQWQpOworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOworCX0KKwllbHNlCisJeworCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOworCisJCWlmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKKwkJfQorCisJCS8vIDUuIFRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIHRvIGJlIG1lYXN1cmUKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFVDSEFSCQkJCQlwRGVzdDsKKwlQQUlST05FVF9JQVBQX0hFQURFUglwSUFQUDsKKwlQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXI7CisJVUNIQVIJCQkJCUFja1JhdGUgPSBSQVRFXzI7CisJVVNIT1JUCQkJCQlBY2tEdXJhdGlvbiA9IDA7CisJTkRJU19TVEFUVVMJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HCQkJCQlGcmFtZUxlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAwLiBTZXQgdXAgdGhlIGZyYW1lIHBvaW50ZXIsIEZyYW1lIHdhcyBpbml0ZWQgYXQgdGhlIGVuZCBvZiBtZXNzYWdlIGFjdGlvbgorCXBEZXN0ID0gJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW0xFTkdUSF84MDJfMTFdOworCisJLy8gMS4gVXBkYXRlIHJlcG9ydCBJQVBQIGZpZWxkcworCXBJQVBQID0gKFBBSVJPTkVUX0lBUFBfSEVBREVSKSBwRGVzdDsKKworCS8vIDIuIENvcHkgQ2lzY28gU05BUCBoZWFkZXIKKwlOZGlzTW92ZU1lbW9yeShwSUFQUC0+Q2lzY29TbmFwSGVhZGVyLCBTTkFQX0FJUk9ORVQsIExFTkdUSF84MDJfMV9IKTsKKworCS8vIDMuIG5ldHdvcmsgb3JkZXIgZm9yIHRoaXMgMTZiaXQgbGVuZ3RoCisJcElBUFAtPkxlbmd0aCAgPSBjcHUyYmUxNihwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSCk7CisKKwkvLyAzLjEgc2FuaXR5IGNoZWNrIHRoZSByZXBvcnQgbGVuZ3RoLCBpZ25vcmUgaXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQKKwlpZiAoYmUyY3B1MTYocElBUFAtPkxlbmd0aCkgPD0gMTgpCisJCXJldHVybjsKKworCS8vIDQuIFR5cGUgbXVzdCBiZSAweDMyCisJcElBUFAtPlR5cGUgICAgPSBBSVJPTkVUX0lBUFBfVFlQRTsKKworCS8vIDUuIFN1YlR5cGUgZm9yIHJlcG9ydCBtdXN0IGJlIDB4ODEKKwlwSUFQUC0+U3ViVHlwZSA9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVDsKKworCS8vIDYuIERBIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIHplcm8sIGFsdGhvdWdoIHRoZSB3aG9sZSBmcmFtZSB3YXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24KKwkvLyAgICBXZSB3aWxsIGRvIGl0IGFnYWluIGhlcmUuIFdlIGNhbiB1c2UgQlNTSUQgaW5zdGVhZAorCUNPUFlfTUFDX0FERFIocElBUFAtPkRBLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyA3LiBTQSBpcyB0aGUgY2xpZW50IHJlcG9ydGluZyB3aGljaCBtdXN0IGJlIG91ciBNQUMKKwlDT1BZX01BQ19BRERSKHBJQVBQLT5TQSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwkvLyA4LiBDb3B5IHRoZSBzYXZlZCBkaWFsb2cgdG9rZW4KKwlwSUFQUC0+VG9rZW4gPSBwQWQtPlN0YUNmZy5JQVBQVG9rZW47CisKKwkvLyA5LiBNYWtlIHRoZSBSZXBvcnQgZnJhbWUgODAyLjExIGhlYWRlcgorCS8vICAgIFJldXNlIGZ1bmN0aW9uIGluIHdwYS5jCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWY7CisJcEFkLT5TZXF1ZW5jZSArKzsKKwlXcGFNYWNIZWFkZXJJbml0KHBBZCwgcEhlYWRlciwgMCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQUNLIHNpemUJaXMgMTQgaW5jbHVkZSBDUkMsIGFuZCBpdHMgcmF0ZQlpcyBiYXNlZCBvbiByZWFsIHRpbWUgaW5mb3JtYXRpb24KKwlBY2tSYXRlICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgQWNrUmF0ZSwgMTQpOworCXBIZWFkZXItPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKworCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisKKwkvLyAxMC4gUHJlcGFyZSByZXBvcnQgZnJhbWUgd2l0aCBkeW5hbWljIG91dGJ1ZmZlci4gSnVzdCBzaW1wbHkgY29weSBldmVyeXRoaW5nLgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4sIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIDExLiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPSBNU1JOX1RZUEVfVU5VU0VEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQQ0hBTk5FTF9MT0FEX1JFUE9SVAkJcExvYWQ7CisJUFVDSEFSCQkJCQkJcERlc3Q7CisJVUNIQVIJCQkJCQlDQ0FCdXN5RnJhY3Rpb247CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDEuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCA5LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKKwlwUmVwb3J0LT5MZW5ndGggPSA5OworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKKwlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKKwlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKKworCS8vIDIuIEZpbGwgY2hhbm5lbCByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQorCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcExvYWQgID0gKFBDSEFOTkVMX0xPQURfUkVQT1JUKSBwRGVzdDsKKwlwTG9hZC0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcExvYWQtPlNwYXJlICAgID0gMDsKKwlwTG9hZC0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJLy8gMy4gQ2FsY3VsYXRlIHRoZSBDQ0EgQnVzeSBGcmFjdGlvbgorCS8vICAgIChCeXRlcyArIEFDSyBzaXplKSAqIDggLyBUeCBzcGVlZCAqIDI1NSAvIDEwMDAgLyBtZWFzdXJlbWVudCBkdXJhdGlvbiwgdXNlIDI0IHVzIFR4IHNwZWVkCisJLy8gICAgID0gIChCeXRlcyArIEFDSykgLyAxMiAvIGR1cmF0aW9uCisJLy8gICAgIDkgaXMgdGhlIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yCisJLy8gQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyA5IC8gcExvYWQtPkR1cmF0aW9uKTsKKwlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yIC8gcExvYWQtPkR1cmF0aW9uKTsKKwlpZiAoQ0NBQnVzeUZyYWN0aW9uIDwgMTApCisJCQlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDMgLyBwTG9hZC0+RHVyYXRpb24pICsgMTsKKworCXBMb2FkLT5DQ0FCdXN5ID0gQ0NBQnVzeUZyYWN0aW9uOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNMQnVzeUJ5dGUgJWxkLCBEdXJhdGlvbiAlZCwgUmVzdWx0LCAlZFxuIiwgcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMsIHBMb2FkLT5EdXJhdGlvbiwgQ0NBQnVzeUZyYWN0aW9uKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihDSEFOTkVMX0xPQURfUkVQT1JUKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwkvLyA0LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJLy8gNS4gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5vaXNlSGlzdFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBOT0lTRV9ISVNUX1JFUE9SVAkJCXBOb2lzZTsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlVQ0hBUgkJCQkJCWksTm9pc2VDbnQ7CisJVVNIT1JUCQkJCQkJVG90YWxSUElDbnQsIFRvdGFsUlBJU3VtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMC4gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwkvLyAxLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCAxNiwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCisJcFJlcG9ydC0+TGVuZ3RoID0gMTY7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOworCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCS8vIDMuIEZpbGwgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCisJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwTm9pc2UgID0gKFBOT0lTRV9ISVNUX1JFUE9SVCkgcERlc3Q7CisJcE5vaXNlLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwTm9pc2UtPlNwYXJlICAgID0gMDsKKwlwTm9pc2UtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwkvLyA0LiBGaWxsIE5vaXNlIGhpc3RvZ3JhbSwgdGhlIHRvdGFsIFJQSSBjb3VudHMgc2hvdWxkIGJlIDAuNCAqIFRVCisJLy8gICAgV2UgZXN0aW1hdGUgNDAwMCBub3JtYWwgcGFja2V0cyByZWNlaXZlZCBkdXJuaW5nIDEwIHNlY29uZHMgdGVzdC4KKwkvLyAgICBBZGp1c3QgaXQgaWYgcmVxdWlyZWQuCisJLy8gMyBpcyBhIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yCisJLy8gVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogMyAvIDEwOworCVRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yIC8gMTA7CisJVG90YWxSUElTdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVRvdGFsUlBJU3VtICs9IHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV07CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJQSSAlZCBDb251dHMgJWRcbiIsIGksIHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0pKTsKKwl9CisKKwkvLyBEb3VibGUgY2hlY2sgaWYgdGhlIGNvdW50ZXIgaXMgbGFyZ2VyIHRoYW4gb3VyIGV4cGVjdGF0aW9uLgorCS8vIFdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSB0b3RhbCBudW1iZXIgcGx1cyBhIGZyYWN0aW9uLgorCWlmIChUb3RhbFJQSVN1bSA+IFRvdGFsUlBJQ250KQorCQlUb3RhbFJQSUNudCA9IFRvdGFsUlBJU3VtICsgcE5vaXNlLT5EdXJhdGlvbiAvIDIwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgUlBJIENvbnV0cyAlZFxuIiwgVG90YWxSUElDbnQpKTsKKworCS8vIDUuIEluaXRpYWxpemUgbm9pc2UgY291bnQgZm9yIHRoZSB0b3RhbCBzdW1tYXRpb24gb2YgMHhmZgorCU5vaXNlQ250ID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorCXsKKwkJcE5vaXNlLT5EZW5zaXR5W2ldID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAqIDI1NSAvIFRvdGFsUlBJQ250KTsKKwkJaWYgKChwTm9pc2UtPkRlbnNpdHlbaV0gPT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gIT0gMCkpCisJCQlwTm9pc2UtPkRlbnNpdHlbaV0rKzsKKwkJTm9pc2VDbnQgKz0gcE5vaXNlLT5EZW5zaXR5W2ldOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbJWRdICA9IDB4JTAyeFxuIiwgaSwgcE5vaXNlLT5EZW5zaXR5W2ldKSk7CisJfQorCisJLy8gNi4gUlBJWzBdIHJlcHJlc2VudHMgdGhlIHJlc3Qgb2YgY291bnRzCisJcE5vaXNlLT5EZW5zaXR5WzBdID0gMHhmZiAtIE5vaXNlQ250OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVswXSAgPSAweCUwMnhcbiIsIHBOb2lzZS0+RGVuc2l0eVswXSkpOworCisJcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoTk9JU0VfSElTVF9SRVBPUlQpKTsKKworCS8vIDcuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwkvLyA4LiByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUJlYWNvblJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIExvb2tzIGxpa2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0aGluZyBuZWVkIHRvIGRvIGhlcmUuCisJLy8gQWxsIG1lYXN1cmVtZW50IHJlcG9ydCBhbHJlYWR5IGZpbmlzaGVkIGluIEFkZEJlYWNvblJlcG9ydAorCS8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIEZyYW1lUmVwb3J0TGVuCisKKwkvLyByZXNldCBCZWFjb24gaW5kZXggZm9yIG5leHQgYmVhY29uIHJlcXVlc3QKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSAweGZmOworCisJLy8gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVMT05HCQkJCUluZGV4LAorCUlOCVBNTE1FX1FVRVVFX0VMRU0JcEVsZW0pCit7CisJUFZPSUQJCQkJCQlwTXNnOworCVBVQ0hBUgkJCQkJCXBTcmMsIHBEZXN0OworCVVDSEFSCQkJCQkJUmVxSWR4OworCVVMT05HCQkJCQkJTXNnTGVuOworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQRlJBTUVfODAyXzExCQkJCXBGcmFtZTsKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQRUlEX1NUUlVDVAkJCSAgICAgICAgcEVpZDsKKwlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OworCVBCU1NfRU5UUlkJCQkJCXBCc3M7CisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcE1zZyAgID0gcEVsZW0tPk1zZzsKKwlNc2dMZW4gPSBwRWxlbS0+TXNnTGVuOworCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBwTXNnOworCXBTcmMgICA9IHBGcmFtZS0+T2N0ZXQ7CQkJCS8vIFN0YXJ0IGZyb20gQVAgVFNGCisJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKKworCS8vIDEgQ2hlY2sgdGhlIEluZGV4LCBpZiB3ZSBhbHJlYWR5IGNyZWF0ZSB0aGlzIGVudHJ5LCBvbmx5IHVwZGF0ZSB0aGUgYXZlcmFnZSBSU1NJCisJaWYgKChJbmRleCA8PSBwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXgpICYmIChwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggIT0gMHhmZikpCisJeworCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XV07CisJCS8vIFBvaW50IHRvIGJzcyByZXBvcnQgaW5mb3JtYXRpb24KKwkJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisKKwkJLy8gVXBkYXRlIFJ4IHBvd2VyLCBpbiBkQm0KKwkJLy8gR2V0IHRoZSBvcmlnaW5hbCBSU1NJIHJlYWRiYWNrIGZyb20gQkJQCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKz0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJLy8gQXZlcmFnZSB0aGUgUnNzaSByZWFkaW5nCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgID0gKHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKyBwQnNzLT5Sc3NpKSAvIDI7CisJCS8vIEdldCB0byBkQm0gZm9ybWF0CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLT0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKKwkJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdIFJzc2kgJWQsIEF2ZyBSc3NpICVkXG4iLCBJbmRleCwgKHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdKSk7CisKKwkJLy8gVXBkYXRlIG90aGVyIGluZm9ybWF0aW9uIGhlcmUKKworCQkvLyBEb25lCisJCXJldHVybjsKKwl9CisKKwkvLyAyLiBVcGRhdGUgcmVwb3J0ZWQgSW5kZXgKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSBJbmRleDsKKworCS8vIDMuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCisJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisKKwkvLyA0LiBTYXZlIHRoZSBzdGFydCBvZmZzZXQgb2YgZWFjaCBCc3MgaW4gcmVwb3J0IGZyYW1lCisJcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSA9IHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuOworCisJLy8gNS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCXBSZXBvcnQtPkVpZCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKwlwUmVwb3J0LT5MZW5ndGggPSAwOworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47CisJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKworCS8vIDYuIFN0YXJ0IHRoZWJlYWNvbiByZXBvcnQgZm9ybWF0CisJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCisJLy8gNy4gQ29weSBDaGFubmVsIG51bWJlcgorCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7CisJcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJLy8gOC4gUnggcG93ZXIsIGluIGRCbQorCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdLCBSc3NpICVkXG4iLCBJbmRleCwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKKwlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwRnJhbWUtPkhkci5BZGRyMyk7CisJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwU3JjLCA0KTsKKwlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsICZwRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJTmRpc01vdmVNZW1vcnkoJnBCZWFjb25SZXBvcnQtPlRhcmdldFRTRls0XSwgJnBFbGVtLT5UaW1lU3RhbXAudS5IaWdoUGFydCwgNCk7CisKKwkvLyA5LiBTa2lwIHRoZSBiZWFjb24gZnJhbWUgYW5kIG9mZnNldCB0byBzdGFydCBvZiBjYXBhYmlsaXR5aW5mbyBzaW5jZSB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBjYXBhYmlsaXR5aW5mbworCXBTcmMgKz0gKFRJTUVTVEFNUF9MRU4gKyAyKTsKKwlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9ICooVVNIT1JUICopcFNyYzsKKworCS8vIDEwLiBQb2ludCB0byBzdGFydCBvZiBlbGVtZW50IElECisJcFNyYyArPSAyOworCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisKKwkvLyAxMS4gU3RhcnQgcHJvY2VzcyBhbGwgdmFyaWFibGUgRWlkIG9heWxvYWQgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgdG8gdGhlIGZyYW1lIHJlcG9ydAorCXdoaWxlICgoKFBVQ0hBUikgcEVpZCArIHBFaWQtPkxlbiArIDEpIDwgKChQVUNIQVIpIHBGcmFtZSArIE1zZ0xlbikpCisJeworCQkvLyBPbmx5IGxpbWl0ZWQgRUlEIGFyZSByZXF1aXJlZCB0byByZXBvcnQgZm9yIENDWCAyLiBJdCBpbmNsdWRlcyBTU0lELCBTdXBwb3J0ZWQgcmF0ZSwKKwkJLy8gRkggcGFyYW1lbnRlciBzZXQsIERTIHBhcmFtZXRlciBzZXQsIENGIHBhcmFtZXRlciBzZXQsIElCU1MgcGFyYW1ldGVyIHNldCwKKwkJLy8gVElNIChyZXBvcnQgZmlyc3QgNCBieXRlcyBvbmx5LCByYWRpbyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1NTSUQ6CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisJCQljYXNlIElFX0ZIX1BBUk06CisJCQljYXNlIElFX0RTX1BBUk06CisJCQljYXNlIElFX0NGX1BBUk06CisJCQljYXNlIElFX0lCU1NfUEFSTToKKwkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworCisJCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6CisJCQkJLy8gU2luY2UgdGhpcyBJRSBpcyBkdXBsaWNhdGVkIHdpdGggV1BBIHNlY3VyaXR5IElFLCB3ZSBoYXMgdG8gZG8gc2FuaXR5IGNoZWNrIGJlZm9yZQorCQkJCS8vIHJlY29nbml6ZSBpdC4KKwkJCQkvLyAxLiBJdCBhbHNvIGhhcyBmaXhlZCA2IGJ5dGVzIElFIGxlbmd0aC4KKwkJCQlpZiAocEVpZC0+TGVuICE9IDYpCisJCQkJCWJyZWFrOworCQkJCS8vIDIuIENoZWNrIHRoZSBDaXNjbyBBaXJvbmV0IE9VSQorCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQ0lTQ09fT1VJLCAocFNyYyArIDIpLCAzKSkKKwkJCQl7CisJCQkJCS8vIE1hdGNoZWQsIHRoaXMgaXMgd2hhdCB3ZSB3YW50CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfVElNOgorCQkJCWlmIChwRWlkLT5MZW4gPiA0KQorCQkJCXsKKwkJCQkJLy8gTWF5IHRydW5jYXRlIGFuZCByZXBvcnQgdGhlIGZpcnN0IDQgYnl0ZXMgb25seSwgd2l0aCB0aGUgZWlkICYgbGVuLCB0b3RhbCBzaG91bGQgYmUgNgorCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgNik7CisJCQkJCXBEZXN0ICArPSA2OworCQkJCQlMZW5ndGggKz0gNjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQkvLyAxMi4gTW92ZSB0byBuZXh0IGVsZW1lbnQgSUQKKwkJcFNyYyArPSAoMiArIHBFaWQtPkxlbik7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisJfQorCisJLy8gMTMuIFVwZGF0ZSB0aGUgbGVuZ3RoIGluIHRoZSBoZWFkZXIsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKKworCS8vIDE0LiBVcGRhdGUgdGhlIGZyYW1lIHJlcG9ydCBidWZmZXIgZGF0YSBsZW5ndGgKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkKQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7CisJVUNIQVIJCQkJCQlJbmRleCwgUmVxSWR4OworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlQQlNTX0VOVFJZCQkJCQlwQnNzOworCisJLy8gMC4gc2V0dXAgYmFzZSBwb2ludGVyCisJUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc05yOyBJbmRleCsrKQorCXsKKwkJLy8gMS4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKKwkJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKKwkJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCQlMZW5ndGggPSAwOworCisJCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcworCQlwUmVwb3J0ICAgICAgICAgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKwkJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCQlwUmVwb3J0LT5MZW5ndGggPSAwOworCQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOworCQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7CisJCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCQlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCisJCS8vIDMuIFN0YXJ0IHRoZSBiZWFjb24gcmVwb3J0IGZvcm1hdAorCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKwkJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwkJTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKworCQkvLyA0LiBDb3B5IENoYW5uZWwgbnVtYmVyCisJCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwkJcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOworCQlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOworCQlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9IHBCc3MtPkNhcGFiaWxpdHlJbmZvOworCQlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwQnNzLT5Cc3NpZCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcEJzcy0+UFRTRiwgNCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgcEJzcy0+VFRTRiwgOCk7CisKKwkJLy8gNS4gQ3JlYXRlIFNTSUQKKwkJKnBEZXN0KysgPSAweDAwOworCQkqcERlc3QrKyA9IHBCc3MtPlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlNzaWRMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlNzaWRMZW4pOworCisJCS8vIDYuIENyZWF0ZSBTdXBwb3J0UmF0ZXMKKwkJKnBEZXN0KysgPSAweDAxOworCQkqcERlc3QrKyA9IHBCc3MtPlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5TdXBSYXRlLCBwQnNzLT5TdXBSYXRlTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlN1cFJhdGVMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlN1cFJhdGVMZW4pOworCisJCS8vIDcuIERTIFBhcmFtZXRlcgorCQkqcERlc3QrKyA9IDB4MDM7CisJCSpwRGVzdCsrID0gMTsKKwkJKnBEZXN0KysgPSBwQnNzLT5DaGFubmVsOworCQlMZW5ndGggICs9IDM7CisKKwkJLy8gOC4gSUJTUyBwYXJhbWV0ZXIgaWYgcHJlc2VudHMKKwkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQl7CisJCQkqcERlc3QrKyA9IDB4MDY7CisJCQkqcERlc3QrKyA9IDI7CisJCQkqKFBVU0hPUlQpIHBEZXN0ID0gcEJzcy0+QXRpbVdpbjsKKwkJCXBEZXN0ICAgKz0gMjsKKwkJCUxlbmd0aCAgKz0gNDsKKwkJfQorCisJCS8vIDkuIFVwZGF0ZSBsZW5ndGggZmllbGQsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7CisKKwkJLy8gMTAuIFVwZGF0ZSB0b3RhbCBmcmFtZSBzaXplCisJCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRiNzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYwpAQCAtMCwwICsxLDE4MjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXNzb2MuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJXcGFUZW1wbGF0ZVtdID0geworCQkweGRkLCAJCQkJCS8vIFdQQSBJRQorCQkweDE2LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJXcGEyVGVtcGxhdGVbXSA9IHsKKwkJMHgzMCwJCQkJCS8vIFJTTiBJRQorCQkweDE0LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gZ3JvdXAgY2lwaGVyLCBUS0lQCisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBwYWlyd2lzZQorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gYXV0aGVudGljYXRpb24KKwkJMHgwMCwgMHgwMCwJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJfTsKKworVUNIQVIJQ2N4MkllSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAyfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisJUGFyYW1ldGVyczoKKwkJUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCBUcmFucywgTUFYX0FTU09DX1NUQVRFLCBNQVhfQVNTT0NfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFTU09DX0lETEUsIEFTU09DX01BQ0hJTkVfQkFTRSk7CisKKwkvLyBmaXJzdCBjb2x1bW4KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVSZWFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEaXNhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCisJLy8gc2Vjb25kIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCS8vCisJLy8gUGF0Y2ggM0NvbSBBUCBNT2RlOjNDUldFNDU0RzcyCisJLy8gV2Ugc2VuZCBBc3NvYyByZXF1ZXN0IGZyYW1lIHRvIHRoaXMgQVAsIGl0IGFsd2F5cyBzZW5kIFJlYXNzb2MgUnNwIG5vdCBBc3NvY2lhdGUgUnNwLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXNzb2NUaW1lb3V0QWN0aW9uKTsKKworCS8vIHRoaXJkIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJLy8KKwkvLyBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9SRUFTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVhc3NvY1RpbWVvdXRBY3Rpb24pOworCisJLy8gZm91cnRoIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKURpc2Fzc29jVGltZW91dEFjdGlvbik7CisKKwkvLyBpbml0aWFsaXplIHRoZSB0aW1lcgorCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgYXNzb2NpYXRpb24gdGltZW91dCwgdGhpcyBmdW5jdGlvbgorCQl3aWxsIGJlIGNhbGxlZCBhbmQgaXQgd2lsbCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgcmVhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7CisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURpc2Fzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBkaXNhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWxtZSBhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIEFkYXB0ZXIgcG9pbnRlcgorCQlFbGVtIC0gTUxNRSBRdWV1ZSBFbGVtZW50CisJUHJlOgorCQl0aGUgc3RhdGlvbiBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGFuZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgY29uZmlnCisJCQktIyBTU0lECisJCQktIyBzdXBwb3J0ZWQgcmF0ZXMgYW5kIHRoZWlyIGxlbmd0aAorCQkJLSMgbGlzdGVuIGludGVydmFsIChBZGFwdGVyLT5TdGFDZmcuZGVmYXVsdF9saXN0ZW5fY291bnQpCisJCQktIyBUcmFuc21pdCBwb3dlciAgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKwlQb3N0ICA6CisJCS0jIEFuIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgaXMgZ2VuZXJhdGVkIGFuZCBzZW50IHRvIHRoZSBhaXIKKwkJLSMgQXNzb2NpYXRpb24gdGltZXIgc3RhcnRzCisJCS0jIEFzc29jaWF0aW9uIHN0YXRlIC0+IEFTU09DX1dBSVRfUlNQCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCUFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUxpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0Q2tpcEllID0gSUVfQUlST05FVF9DS0lQOworCVVDSEFSCQkJQWlyb25ldENraXBMZW4gPSBDS0lQX05FR09USUFUSU9OX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NJRSA9IElFX0FJUk9ORVRfSVBBRERSRVNTOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0xlbiA9IEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXJbQUlST05FVF9JUEFERFJFU1NfTEVOR1RIXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyBjaGVjayBzYW5pdHkgZmlyc3QKKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwkJLy8gQXNzb2NpYXRpb24gZG9uJ3QgbmVlZCB0byByZXBvcnQgTUFDIGFkZHJlc3MKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkF2YWlsYWJsZVJlcXVlc3RGaXhlZElFcyA9CisJCQlORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgfCBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTDsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9IExpc3RlbkludHY7CisJCS8vIE9ubHkgcmVhc3NvY2lhdGUgbmVlZCB0aGlzCisJCS8vQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkN1cnJlbnRBUEFkZHJlc3MsIEFwQWRkcik7CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXF1ZXN0SUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKKwkJLy8gRmlyc3QgYWRkIFNTSUQKKwkJVmFySWVzT2Zmc2V0ID0gMDsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCisJCS8vIFNlY29uZCBhZGQgU3VwcG9ydGVkIHJhdGVzCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlN1cFJhdGVJZSwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKKwkJLy8gRW5kIEFkZCBieSBKYW1lcworCisgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQorICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisKKwkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKKwkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCisJCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAJcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gSFQKKwkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIEh0TGVuOworCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKKwkJCXsKKwkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkgICAgICAgIEhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbik7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKyAgICAgICAgCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgJlRtcExlbiwKKyAgICAgICAgCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisgICAgICAgIAkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorICAgICAgICAJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwmSHRDYXBhYmlsaXR5VG1wLAorICAgICAgICAJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCQkJeworCQkJCVFCU1NfU1RBX0lORk9fUEFSTSBRb3NJbmZvOworCisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sIHNpemVvZihRQlNTX1NUQV9JTkZPX1BBUk0pKTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKKwkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7CisJCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQl9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy8gVGhlIFBhcmFtZXRlciBTZXQgQ291bnQgaXMgc2V0IHRvIKGnMKGoIGluIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcworICAgICAgICAgICAgICAgIC8vIFdtZUllWzhdIHw9IChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgJiAweDBmKTsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQkvLworCQkvLyBMZXQgV1BBKCMyMjEpIEVsZW1lbnQgSUQgb24gdGhlIGVuZCBvZiB0aGlzIGFzc29jaWF0aW9uIGZyYW1lLgorCQkvLyBPdGhlcndpc2Ugc29tZSBBUCB3aWxsIGZhaWwgb24gcGFyc2luZyBFbGVtZW50IElEIGFuZCBzZXQgc3RhdHVzIGZhaWwgb24gQXNzb2MgUnNwLgorCQkvLyBGb3IgZXhhbXBsZTogUHV0IFZlbmRvciBTcGVjaWZpYyBJRSBvbiB0aGUgZnJvbnQgb2YgV1BBIElFLgorCQkvLyBUaGlzIGhhcHBlbnMgb24gQVAgKE1vZGVsIE5vOkxpbmtzeXMgV1JLNTRHKQorCQkvLworCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCSkKKyAgICAgICAgICAgICkKKwkJeworCQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQl7CisJCQkJUlNOSWUgPSBJRV9XUEEyOworCQkJfQorCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZmRlZiBTSU9DU0lXR0VOSUUKKwkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gMSkKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBCU1MwKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFdQQSBQTUsgY2FjaGUgbGlzdAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQl7CisJCQkgICAgSU5UICAgICBpZHg7CisgICAgICAgICAgICAgICAgQk9PTEVBTiBGb3VuZFBNSyA9IEZBTFNFOworCQkJCS8vIFNlYXJjaCBjaGNoZWQgUE1LSUQsIGFwcGVuZCBpdCBpZiBleGlzdGVkCisJCQkJZm9yIChpZHggPSAwOyBpZHggPCBQTUtJRF9OTzsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KEFwQWRkciwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSUQsIDYpKQorCQkJCQl7CisJCQkJCQlGb3VuZFBNSyA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChGb3VuZFBNSykKKwkJCQl7CisJCQkJCS8vIFNldCBQTUsgbnVtYmVyCisJCQkJCSooUFVTSE9SVCkgJnBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPlN0YUNmZy5SU05JRV9MZW5dID0gMTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSUQsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuICs9IDE4OworCQkJCX0KKwkJCX0KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IDEpCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOworCQkJfQorCQkJZWxzZQorI2VuZGlmCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgIAkJJnRtcCwKKwkJCQkgICAgICAgICAgICAgIAkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOworCQkJfQorCisJCQlGcmFtZUxlbiArPSB0bXA7CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSAxKQorI2VuZGlmCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkgICAgICAgICAgICAvLyBBcHBlbmQgVmFyaWFibGUgSUUKKwkgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZSU05JZSwgMSk7CisJICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7CisJICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAxKTsKKwkgICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKKwkJCX0KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCQkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKworCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OworCQl9CisKKwkJLy8gV2UgaGF2ZSB1cGRhdGUgdGhhdCBhdCBQZWVyQmVhY29uQXRKb2luUmVxdWVzdCgpCisJCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7CisJCWlmIChDa2lwRmxhZyAhPSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShDa2lwTmVnb3RpYXRpb25CdWZmZXIsIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIKTsKKwkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlclsyXSA9IDB4NjY7CisJCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCisJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbOF0gPSAweDE4OworCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMV0gPSAweDIyOworCQkJQ2tpcEZsYWcgPSAweDE4OworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sIAkmdG1wLAorCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwSWUsCisJCQkJCQkxLAkJCQkJCSAgCQkmQWlyb25ldENraXBMZW4sCisJCQkJCQlBaXJvbmV0Q2tpcExlbiwgCQkgIAkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJLy8gQWRkIENDWCB2MiByZXF1ZXN0IGlmIENDWDIgYWRtaW4gc3RhdGUgaXMgb24KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisJCXsKKworCQkJLy8KKwkJCS8vIEFkZCBBaXJvbmV0SVBBZGRyZXNzSUUgZm9yIENpc2NvIENDWCAyLlgKKwkJCS8vIEFkZCBDQ1ggVmVyc2lvbgorCQkJLy8KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCTEsCQkJCQkJCSZBaXJvbmV0SVBBZGRyZXNzSUUsCisJCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0xlbiwKKwkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJJZSwKKwkJCQkJCTEsCQkJCQkJCSZDY3gyTGVuLAorCQkJCQkJQ2N4MkxlbiwJCQkJICAgIENjeDJJZUluZm8sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCS8vCisJCQkvLyBBZGQgQ2lwaGVyU3VpdGUgQ0NLTSBvciBMZWFwVGtpcCBpZiBzZXR0aW5nLgorCQkJLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbiwJCUNpcGhlclN1aXRlQ2lzY29DQ0tNLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKworCQkJCS8vIFRoaXJkIGFkZCBSU04KKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIENpcGhlclN1aXRlQ2lzY29DQ0tNLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbik7IC8vU2F2ZSBDaXBoZXJTdWl0ZQorCQkJCVZhckllc09mZnNldCArPSBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCUNpcGhlclN1aXRlQ0NYVGtpcExlbiwJICAgIENpcGhlclN1aXRlQ0NYVGtpcCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCQkvLyBUaGlyZCBhZGQgUlNOCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBDaXBoZXJTdWl0ZUNDWFRraXAsIENpcGhlclN1aXRlQ0NYVGtpcExlbik7CisJCQkJVmFySWVzT2Zmc2V0ICs9IENpcGhlclN1aXRlQ0NYVGtpcExlbjsKKwkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkJLy8gQWRkIGJ5IEphbWVzIDAzLzA2LzI3CisJCQkvLyBTZXQgVmFyaWFibGUgSUVzIExlbmd0aAorCQkJcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPSBWYXJJZXNPZmZzZXQ7CisJCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdElFTGVuZ3RoID0gVmFySWVzT2Zmc2V0OworCisJCQkvLyBPZmZzZXRSZXNwb25zZUlFcyBmb2xsb3cgUmVxVmFySUUKKwkJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXNwb25zZUlFcyA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTikgKyBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbjsKKwkJCS8vIEVuZCBBZGQgYnkgSmFtZXMKKwkJfQorCisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgVGltZW91dCk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfV0FJVF9SU1A7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhISEgXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCW1sbWUgcmVhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJRWxlbSAtCisJUHJlOgorCQktIyBTU0lEICAoQWRhcHRlci0+U3RhQ2ZnLnNzaWRbXSkKKwkJLSMgQlNTSUQgKEFQIGFkZHJlc3MsIEFkYXB0ZXItPlN0YUNmZy5ic3NpZCkKKwkJLSMgU3VwcG9ydGVkIHJhdGVzIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzW10pCisJCS0jIFN1cHBvcnRlZCByYXRlcyBsZW5ndGggKEFkYXB0ZXItPlN0YUNmZy5zdXBwb3J0ZWRfcmF0ZXNfbGVuKQorCQktIyBUeCBwb3dlciAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCVJlYXNzb2NIZHI7CisJVUNIQVIJCQlDY3gyTGVuID0gNTsKKwlVQ0hBUgkJCVdtZUllWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgMHgwNywgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07CisJVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8sIExpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCXRtcDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKy8vQ0NYIDIuWAorI2lmZGVmIExFQVBfU1VQUE9SVAorCVVDSEFSCQkJQ2tpcEZsYWc7CisJVUNIQVIJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEhdOworCVVDSEFSCQkJQWlyb25ldENraXBJZSA9IElFX0FJUk9ORVRfQ0tJUDsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwTGVuID0gQ0tJUF9ORUdPVElBVElPTl9MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzSUUgPSBJRV9BSVJPTkVUX0lQQUREUkVTUzsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NMZW4gPSBBSVJPTkVUX0lQQUREUkVTU19MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyW0FJUk9ORVRfSVBBRERSRVNTX0xFTkdUSF0gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NJRSA9IElFX0FJUk9ORVRfQ0NLTVJFQVNTT0M7CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NMZW4gPSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlcltBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0T1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMH07CisJVUNIQVIJCQlNSUNNTlsxNl07CisJVUNIQVIJCQlDYWxjTWljQnVmZmVyWzgwXTsKKwlVTE9ORwkJCUNhbGNNaWNCdWZmZXJMZW4gPSAwOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCVVTSE9SVAkJCVN0YXR1czsKKworCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAorCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBSZUFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyB0aGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGFzc29jaWF0aW9uCisJZWxzZSBpZihNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQlyZXR1cm47CisJCX0KKworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBtYWtlIGZyYW1lLCB1c2UgYnNzaWQgYXMgdGhlIEFQIGFkZHJlc3M/PworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgUkUtQVNTT0MgcmVxdWVzdC4uLlxuIikpOworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJlJlYXNzb2NIZHIsIFNVQlRZUEVfUkVBU1NPQ19SRVEsIDAsIEFwQWRkciwgQXBBZGRyKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJlJlYXNzb2NIZHIsCisJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZMaXN0ZW5JbnR2LAorCQkJCQkJICBNQUNfQUREUl9MRU4sICAgICAgICAgICAgIEFwQWRkciwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sICAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sICBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAkgICAgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKKwkJCXsKKwkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19CRSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkU7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19CSyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQks7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19WSSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkk7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19WTyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk87CisJCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9IHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOworCQkJCVdtZUllWzhdIHw9ICooUFVDSEFSKSZRb3NJbmZvOworCQkJfQorCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCisJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIEhUCisJCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQl7CisJCQlVTE9ORyBUbXBMZW47CisJCQlVQ0hBUiBIdExlbjsKKwkJCVVDSEFSIEJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID09IFRSVUUpCisJCQl7CisJCQkJSHRMZW4gPSBTSVpFX0hUX0NBUF9JRSArIDQ7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCisJCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKKwkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAorCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCisJCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA0LCAweDAwLCAweDAwLCAweDAwfTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKKwkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCXsKKwkJCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7CS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQorCQkJaWYgKENraXBGbGFnICE9IDApCisJCQl7CisJCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7CisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzJdID0gMHg2NjsKKwkJCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKKwkJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAxXSA9IDB4MjI7CisKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJnRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDa2lwSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q2tpcExlbiwKKwkJCQkJCQkJCUFpcm9uZXRDa2lwTGVuLCAgICAgICAgICAgICAgICAgQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRJUEFkZHJlc3NJRSwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0SVBBZGRyZXNzTGVuLAorCQkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sICAgICAgICAgICAgQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCS8vCisJCQkvLyBUaGUgUk4gaXMgaW5jcmVtZW50ZWQgYmVmb3JlIGVhY2ggcmVhc3NvY2lhdGlvbiByZXF1ZXN0LgorCQkJLy8KKwkJCXBBZC0+U3RhQ2ZnLkNDS01STisrOworCQkJLy8KKwkJCS8vIENhbGN1bGF0ZSBNSUMgPSBobWFjLW1kNShrcmssIFNUQS1JRHxCU1NJRHxSU05JRXxUU0Z8Uk4pOworCQkJLy8KKwkJCUNPUFlfTUFDX0FERFIoQ2FsY01pY0J1ZmZlciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDYWxjTWljQnVmZmVyTGVuID0gTUFDX0FERFJfTEVOOworCQkJQ09QWV9NQUNfQUREUihDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gTUFDX0FERFJfTEVOOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIENpcGhlclN1aXRlQ2lzY29DQ0tNLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbik7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIChQVUNIQVIpICZwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wLCBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCkpOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCk7CisJCQlOZGlzTW92ZU1lbW9yeShDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgKFBVQ0hBUikmcEFkLT5TdGFDZmcuQ0NLTVJOLCBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTVJOKSk7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IHNpemVvZihwQWQtPlN0YUNmZy5DQ0tNUk4pOworCQkJaG1hY19tZDUocEFkLT5TdGFDZmcuS1JLLCBMRU5fRUFQX01JQ0ssIENhbGNNaWNCdWZmZXIsIENhbGNNaWNCdWZmZXJMZW4sIE1JQ01OKTsKKworCQkJLy8KKwkJCS8vIGZpbGwgdXAgQ0NLTSByZWFzc29jaWF0aW9uIHJlcXVlc3QgZWxlbWVudAorCQkJLy8KKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciwgQWlyb25ldE9VSSwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKyA0LCAoUFVDSEFSKSZwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wLCA4KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArIDEyLCAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuQ0NLTVJOLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArMTYsIE1JQ01OLCA4KTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q0NLTVJlYXNzb2NJRSwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENDS01SZWFzc29jTGVuLAorCQkJCQkJCUFpcm9uZXRDQ0tNUmVhc3NvY0xlbiwgIEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbixDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkvLyBBZGQgQ0NYIHYyIHJlcXVlc3QgaWYgQ0NYMiBhZG1pbiBzdGF0ZSBpcyBvbgorCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKKwkJeworCQkJLy8KKwkJCS8vIEFkZCBDQ1ggVmVyc2lvbgorCQkJLy8KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKKwkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IFJFQVNTT0NfV0FJVF9SU1A7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEgXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVVwcGVyIGxheWVyIGlzc3VlcyBkaXNhc3NvYyByZXF1ZXN0CisJUGFyYW1ldGVyczoKKwkJRWxlbSAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgcERpc2Fzc29jUmVxOworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCUJPT0xFQU4gICAgICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgVGltZW91dCA9IDA7CisJVVNIT1JUICAgICAgICAgICAgICAgIFN0YXR1czsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAorCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwl7CisJCVVDSEFSIGk7CisKKwkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJeworCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQl9CisJCX0KKworCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQl7CisJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vIHNraXAgc2FuaXR5IGNoZWNrCisJcERpc2Fzc29jUmVxID0gKFBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKEVsZW0tPk1zZyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIERJU0FTU09DIHJlcXVlc3RbQlNTSUQ6OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IChSZWFzb249JWQpXG4iLAorCQkJCXBEaXNhc3NvY1JlcS0+QWRkclswXSwgcERpc2Fzc29jUmVxLT5BZGRyWzFdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMl0sCisJCQkJcERpc2Fzc29jUmVxLT5BZGRyWzNdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNF0sIHBEaXNhc3NvY1JlcS0+QWRkcls1XSwgcERpc2Fzc29jUmVxLT5SZWFzb24pKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwRGlzYXNzb2NSZXEtPkFkZHIsIHBEaXNhc3NvY1JlcS0+QWRkcik7CS8vIHBhdGNoIHBlYXAgdHRscyBzd2l0Y2hpbmcgaXNzdWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGlzYXNzb2NIZHIsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICZwRGlzYXNzb2NSZXEtPlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HOworCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGlzYXNzb2NTdGEsIHBEaXNhc3NvY1JlcS0+QWRkcik7CisKKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gRElTQVNTT0NfV0FJVF9SU1A7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCXsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgYXNzb2MgcnNwIGJhY2sKKwlQYXJhbWV0ZXJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBTdGF0dXMsIEFpZDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIgICAgICAgICBDa2lwRmxhZzsKKwlFRENBX1BBUk0gICAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYgKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCisJCSZIdENhcGFiaWxpdHksJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwmQWRkSHRJbmZvTGVuLCZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmRWRjYVBhcm0sICZDa2lwRmxhZykpCisJeworCQkvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOkFTU09DIC0gcmVjZWl2ZSBBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwQWN0aW9uKCk6TWFjVGFibGUgWyVkXS5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsRWxlbS0+V2NpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKwkJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJeworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5UeFNFUSwgNCk7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkdJVlswXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBUUlVFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRmFpbGUgb24gQXNzb2NpYXRpb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBjb2RlCisJCQkJLy8gSXMgdGhhdCBhIFJvZ3VlIEFQPworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCWlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKFN0YXR1cyA9PSBNTE1FX0FMR19OT1RfU1VQUE9SVCkpCisJCQkJeyAvL1Bvc3NpYmx5IFJvZ3VlIEFQCisJCQkJCVJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl9CisJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyQXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIHJlYXNzb2MgcnNwCisJUGFyYW1ldHJzOgorCQlFbGVtIC0gTUxNRSBtZXNzYWdlIGNudGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgU3RhdHVzOworCVVTSE9SVCAgICAgIEFpZDsKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgIENraXBGbGFnOworCUJPT0xFQU4gICAgIFRpbWVyQ2FuY2VsbGVkOworCUVEQ0FfUEFSTSAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwJJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIC8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPworCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIHJlY2VpdmUgUkVBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJfQorCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCWlmIChDQ0tNQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikgPT0gVFJVRSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisJCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJCXsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkNLSVBNSUMsIDQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzJdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQkJfQorCisJCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQ0NLTUFzc29jUnNwU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQorCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJSZWFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwcm9jZWR1cmVzIG9uIElFRUUgODAyLjExLzE5OTkgcC4zNzYKKwlQYXJhbWV0cnM6CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NQb3N0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEFkZHIyLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVU0hPUlQgQWlkLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQoreworCVVMT05HIElkeDsKKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0lORlJBOworCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQWRkcjIpOworCXBBZC0+TWxtZUF1eC5BaWQgPSBBaWQ7CisJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uCisJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKKwkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7CisJCXBFZGNhUGFybS0+QWlmc25bMl0gPSAyOworCQlwRWRjYVBhcm0tPkFpZnNuWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWluWzBdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21pblsxXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtaW5bMl0gPSAzOworCQlwRWRjYVBhcm0tPkN3bWluWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWF4WzBdID0gMTA7CisJCXBFZGNhUGFybS0+Q3dtYXhbMV0gPSAxMDsKKwkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOworCisJCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOworCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKKwkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OworCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7CisKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCisJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKKwlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisKKwkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQorCXsKKwkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gIEFQLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgorCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIEluaXQgdmFyaWFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisKKwkJLy8gU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkKKwkJeworCQkJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCQkJVVNIT1JUICAgICAgICAgICAgICBsZW47CisJCQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisKKwkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7CisJCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisKKwkJCXdoaWxlIChsZW4gPiAwKQorCQkJeworCQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCQkJLy8gRm9yIFdQQS9XUEFQU0sKKwkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJCX0KKwkJCQkvLyBGb3IgV1BBMi9XUEEyUFNLCisJCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBMiBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCQl9CisKKwkJCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0KKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBubyBSU05fSUUgXG4iKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloZXhfZHVtcCgiUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlsZWZ0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwLjM3NAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgIFJlYXNvbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKClcbiIpKTsKKwlpZihQZWVyRGlzYXNzb2NTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBSZWFzb24gPSAlZFxuIiwgUmVhc29uKSk7CisJCWlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpCisJCXsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorCQkJCS8vIFdlIHNob3VsZCBjYW5jZWwgaXQgaWYgdXNpbmcgTEVBUAorCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKwkJCQkvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEFzc29jaWF0aW9uLgorCQkJCWlmICgocEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSAhPSBMRUFQX0lETEUpICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJeworCQkJCQlSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKwkJCQl9CisJCQl9CisjZW5kaWYJLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkvLworCQkJLy8gR2V0IEN1cnJlbnQgU3lzdGVtIHRpbWUgYW5kIFR1cm4gb24gQWRqYWNlbnRBUFJlcG9ydAorCQkJLy8KKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBMaW5rRG93blRpbWUpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJTGlua0Rvd24ocEFkLCBUUlVFKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwkJCXsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBhc3NvYyB0aW1lb3V0CisJUGFyYW1ldGVyczoKKwkJRWxtZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEFzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgcmVhc3NvYyB0aW1lb3V0CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUmVhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgZGlzYXNzb2MgdGltZW91dAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlblJlYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJpZ2h0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwYWdlIDM3NAorCU5vdGU6CisJCVRoaXMgZXZlbnQgc2hvdWxkIG5ldmVyIGNhdXNlIEFTU09DIHN0YXRlIG1hY2hpbmUgcGVyZm9ybSBzdGF0ZQorCQl0cmFuc2l0aW9uLCBhbmQgaGFzIG5vIHJlbGF0aW9uc2hpcCB3aXRoIENOVEwgbWFjaGluZS4gU28gd2Ugc2VwYXJhdGUKKwkJdGhpcyByb3V0aW5lIGFzIGEgc2VydmljZSBvdXRzaWRlIG9mIEFTU09DIHN0YXRlIHRyYW5zaXRpb24gdGFibGUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2xzM2VyckFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCVVTSE9SVCAgICAgICAgICAgICAgICBSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBDbGFzcyAzIEVycm9yLCBTZW5kIERJU0FTU09DIGZyYW1lXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcEFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcEFkZHIpOworfQorCisgLyoKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgRGVzY3JpcHRpb246CisJCSBTd2l0Y2ggYmV0d2VlbiBXRVAgYW5kIENLSVAgdXBvbiBuZXcgYXNzb2NpYXRpb24gdXAuCisJIFBhcmFtZXRlcnM6CisKKwkgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKi8KK1ZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50ICAgICAgICAgICAgaTsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyAgY3NyMTsKKworCS8vIGlmIEtQIGlzIHJlcXVpcmVkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBXRVAKKwkvLyB0byBDS0lQLiBlbHNlIHJlbWFpbiBhcyBXRVAKKwlpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSkKKwl7CisJCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7CisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7CisKKwkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAorCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKwkJfQorCX0KKworCS8vIGVsc2UgaWYgS1AgTk9UIGludXNlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gQ0tJUAorCS8vIHRvIFdFUC4KKwllbHNlCisJeworCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKKwkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEtTk9ORSwgbXVzdCB1cGRhdGUgQ2lwaGVyQWxnLgorCQkvLyBCZWNhdXNlIHRoZSBPSURfODAyXzExX1dFUF9TVEFUVVMgd2FzIGJlZW4gc2V0IGFmdGVyIE9JRF84MDJfMTFfQUREX0tFWQorCQkvLyBhbmQgQ2lwaGVyQWxnIHdpbGwgYmUgQ0lQSEVSX05PTkUgYnkgV2luZG93cyBaZXJvQ29uZmlnLgorCQkvLyBTbyB3ZSBuZWVkIHRvIHVwZGF0ZSBDaXBoZXJBbGcgYWZ0ZXIgY29ubmVjdC4KKwkJLy8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiAhPSAwKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQl7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQkJeworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQl9CisJCQl9CisKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnOworCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZzsKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKKwl9Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIHVuc2lnbmVkIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisgICAgaWYgKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3KSA8PSBJV19DVVNUT01fTUFYKQorICAgIHsKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk9fUmVxSUVzPSIpOworCSAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20rMTcsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworCSAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3OworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9SRVFJRV9FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3ID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCisgICAgeworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisgICAgICAgIG1lbWNweShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkFTU09DUkVRSUUsICZ3cnF1LCBjdXN0b20pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKyNlbHNlCisgICAgaWYgKCgocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNykgPD0gSVdfQ1VTVE9NX01BWCkKKyAgICB7CisgICAgICAgIFVDSEFSICAgaWR4OworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTc7CisgICAgICAgIHNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKKyAgICAgICAgZm9yIChpZHg9MDsgaWR4PHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzW2lkeF0pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTcgPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZiOGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhdXRoLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkyMDA0LTktMwkJcG9ydGluZyBmcm9tIFJUMjUwMAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBhdXRoZW50aWNhdGUgc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gcG9pbnRlciB0byB0aGUgYXV0aCBzdGF0ZSBtYWNoaW5lCisgICAgTm90ZToKKyAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGlzCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfUkVRX0lETEUgICAgICAgICAgIEFVVEhfV0FJVF9TRVEyICAgICAgICAgICAgICAgICAgIEFVVEhfV0FJVF9TRVE0CisgICAgTVQyX01MTUVfQVVUSF9SRVEgICBtbG1lX2F1dGhfcmVxX2FjdGlvbiAgICBpbnZhbGlkX3N0YXRlX3doZW5fYXV0aCAgICAgICAgICBpbnZhbGlkX3N0YXRlX3doZW5fYXV0aAorICAgIE1UMl9QRUVSX0FVVEhfRVZFTiAgZHJvcCAgICAgICAgICAgICAgICAgICAgcGVlcl9hdXRoX2V2ZW5fYXRfc2VxMl9hY3Rpb24gICAgcGVlcl9hdXRoX2V2ZW5fYXRfc2VxNF9hY3Rpb24KKyAgICBNVDJfQVVUSF9USU1FT1VUICAgIERyb3AgICAgICAgICAgICAgICAgICAgIGF1dGhfdGltZW91dF9hY3Rpb24gICAgICAgICAgICAgIGF1dGhfdGltZW91dF9hY3Rpb24KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3ZvaWQgQXV0aFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9TVEFURSwgTUFYX0FVVEhfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUkVRX0lETEUsIEFVVEhfTUFDSElORV9CQVNFKTsKKworICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUkVRX0lETEUsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBdXRoUmVxQWN0aW9uKTsKKworICAgIC8vIHRoZSBzZWNvbmQgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7CisKKyAgICAvLyB0aGUgdGhpcmQgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7CisKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRpbWVyIHRocmVhZCB3aGVuIGF1dGggdGltZXIgZXhwaXJlcworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEF1dGhUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEggLSBBdXRoVGltZW91dFxuIikpOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJLy8gc2VuZCBhIGRlLWF1dGggdG8gcmVzZXQgQVAncyBzdGF0ZSBtYWNoaW5lIChQYXRjaCBBUC1EaXI2MzUpCisJaWYgKHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPT0gQVVUSF9XQUlUX1NFUTIpCisJCUNsczJlcnJBY3Rpb24ocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCisKKyAgICBNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfVElNRU9VVCwgMCwgTlVMTCk7CisgICAgUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVUNIQVIgICAgICAgICAgICAgIEFkZHJbNl07CisgICAgVVNIT1JUICAgICAgICAgICAgIEFsZywgU2VxLCBTdGF0dXM7CisgICAgVUxPTkcgICAgICAgICAgICAgIFRpbWVvdXQ7CisgICAgSEVBREVSXzgwMl8xMSAgICAgIEF1dGhIZHI7CisgICAgQk9PTEVBTiAgICAgICAgICAgIFRpbWVyQ2FuY2VsbGVkOworICAgIE5ESVNfU1RBVFVTICAgICAgICBOU3RhdHVzOworICAgIFBVQ0hBUiAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCisJLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCisJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCisJeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKyAgICBlbHNlIGlmKE1sbWVBdXRoUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIsICZUaW1lb3V0LCAmQWxnKSkKKyAgICB7CisgICAgICAgIC8vIHJlc2V0IHRpbWVyCisgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKyAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIpOworICAgICAgICBwQWQtPk1sbWVBdXguQWxnICA9IEFsZzsKKyAgICAgICAgU2VxID0gMTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCisgICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIE1sbWVBdXRoUmVxQWN0aW9uKEFsZzolZCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIiwgQWxnKSk7CisgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMxIChBbGc9JWQpLi4uXG4iLCBBbGcpKTsKKyAgICAgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmQXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgICAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKyAgICAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIFRpbWVvdXQpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UX0VSUigoIkFVVEggLSBNbG1lQXV0aFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWRcbiIpKTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgICBTZXEsIFN0YXR1cywgUmVtb3RlU3RhdHVzLCBBbGc7CisgICAgVUNIQVIgICAgICAgICBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworICAgIFVDSEFSICAgICAgICAgQ3lwZXJDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU4gKyA4ICsgOF07CisgICAgVUNIQVIgICAgICAgICBFbGVtZW50WzJdOworICAgIEhFQURFUl84MDJfMTEgQXV0aEhkcjsKKyAgICBCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgU3RhdHVzMjsKKworICAgIGlmIChQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQorICAgIHsKKyAgICAgICAgaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjMiB0byBtZSAoQWxnPSVkLCBTdGF0dXM9JWQpXG4iLCBBbGcsIFN0YXR1cykpOworICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisgICAgICAgICAgICBpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBdXRoZW50aWNhdGlvbiBNb2RlICJMRUFQIiBoYXMgYWxsb3cgZm9yIENDWCAxLlgKKyAgICAgICAgICAgICAgICBpZiAoKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCQkJfHwgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkJKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5MZWFwTWFjaGluZS5DdXJyU3RhdGUgPSBMRUFQX0lETEU7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAyLiBzaGFyZWQga2V5LCBuZWVkIHRvIGJlIGNoYWxsZW5nZWQKKyAgICAgICAgICAgICAgICAgICAgU2VxKys7CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKworCQkJCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czIgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisgICAgICAgICAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzMuLi5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgICAgICAgICAgICAgICAgICBBdXRoSGRyLkZDLldlcCA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgY2hhbGxlbmdlIHRleHQgJiBhdXRoIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgIFJUTVBJbml0V2VwRW5naW5lKAorICAgICAgICAgICAgICAgICAgICAJcEFkLAorICAgICAgICAgICAgICAgICAgICAJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgICAgICAgICAgICAgIAlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKyAgICAgICAgICAgICAgICAgICAgCUN5cGVyQ2hsZ1RleHQpOworCisJCQkJCUFsZyA9IGNwdTJsZTE2KCooVVNIT1JUICopJkFsZyk7CisJCQkJCVNlcSA9IGNwdTJsZTE2KCooVVNIT1JUICopJlNlcSk7CisJCQkJCVJlbW90ZVN0YXR1cz0gY3B1MmxlMTYoKihVU0hPUlQgKikmUmVtb3RlU3RhdHVzKTsKKworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmQWxnLCBDeXBlckNobGdUZXh0ICsgNCwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZTZXEsIEN5cGVyQ2hsZ1RleHQgKyA2LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlJlbW90ZVN0YXR1cywgQ3lwZXJDaGxnVGV4dCArIDgsIDIpOworCQkJCQlFbGVtZW50WzBdID0gMTY7CisJCQkJCUVsZW1lbnRbMV0gPSAxMjg7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIEVsZW1lbnQsIEN5cGVyQ2hsZ1RleHQgKyAxMCwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIENobGdUZXh0LCBDeXBlckNobGdUZXh0ICsgMTIsIDEyOCk7CisJCQkJCVJUTVBTZXRJQ1YocEFkLCBDeXBlckNobGdUZXh0ICsgMTQwKTsKKyAgICAgICAgICAgICAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9URVhUX0xFTiArIDE2LCAgICAgQ3lwZXJDaGxnVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgICAgICAgICAgICAgICAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKyAgICAgICAgICAgICAgICAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgICAgICAgICAgICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIEFVVEhfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1dBSVRfU0VRNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0ludmFsaWQgQXV0aGVudGljYXRpb24gcG9zc2libGUgcm9ndWUgQVAKKyAgICAgICAgICAgICAgICAgICAgLy9BZGQgdGhpcyBBcCB0byBSb2d1ZSBBUC4KKyAgICAgICAgICAgICAgICAgICAgUm9ndWVBcFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TdGFDZmcuUm9ndWVBcFRhYiwgQWRkcjIsIExFQVBfUkVBU09OX0lOVkFMSURfQVVUSCk7CisJCQkJfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKyAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhTYW5pdHkoKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgICBBbGcsIFNlcSwgU3RhdHVzOworICAgIENIQVIgICAgICAgICAgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKKyAgICBCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCisgICAgaWYoUGVlckF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsIENobGdUZXh0KSkKKyAgICB7CisgICAgICAgIGlmKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjNCB0byBtZVxuIikpOworICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisgICAgICAgICAgICBpZiAoU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKKyAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKKyAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKKyAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKyAgICBVU0hPUlQgICAgICAgIFN0YXR1czsKKworICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisKKyAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gTWxtZURlYXV0aFJlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBERS1BVVRIIHJlcXVlc3QgKFJlYXNvbj0lZCkuLi5cbiIsIHBJbmZvLT5SZWFzb24pKTsKKyAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBJbmZvLT5BZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZwSW5mby0+UmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gcEluZm8tPlJlYXNvbjsKKyAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEluZm8tPkFkZHIpOworICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVU0hPUlQgU3RhdHVzOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBBdXRoVGltZW91dEFjdGlvblxuIikpOworICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgIFN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVVNIT1JUIFN0YXR1czsKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gSW52YWxpZFN0YXRlV2hlbkF1dGggKHN0YXRlPSVsZCksIHJlc2V0IEFVVEggc3RhdGUgbWFjaGluZVxuIiwgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSkpOworICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU29tZSBTVEEvQVAKKyAgICBOb3RlOgorICAgICAgICBUaGlzIGFjdGlvbiBzaG91bGQgbmV2ZXIgdHJpZ2dlciBBVVRIIHN0YXRlIHRyYW5zaXRpb24sIHRoZXJlZm9yZSB3ZQorICAgICAgICBzZXBhcmF0ZSBpdCBmcm9tIEFVVEggc3RhdGUgbWFjaGluZSwgYW5kIG1ha2UgaXQgYXMgYSBzdGFuZGFsb25lIHNlcnZpY2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBDbHMyZXJyQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBVQ0hBUiBwQWRkcikKK3sKKyAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKKyAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKyAgICBVU0hPUlQgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMyRVJSOworCisgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQ2xhc3MgMiBlcnJvciwgU2VuZCBERUFVVEggZnJhbWUuLi5cbiIpKTsKKyAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBSZWFzb247CisgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBBZGRyKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aF9yc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FhNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aF9yc3AuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhdXRoX3JzcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJMjAwNC0xMC0xCQljb3B5IGZyb20gUlQyNTYwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCBwcm9jZWR1cmUKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTbSAtIHRoZSBzdGF0ZSBtYWNoaW5lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQU1RBVEVfTUFDSElORSBTbSwKKyAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKyAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfUlNQX1NUQVRFLCBNQVhfQVVUSF9SU1BfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUlNQX0lETEUsIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSk7CisKKyAgICAvLyBjb2x1bW4gMQorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfSURMRSwgTVQyX1BFRVJfREVBVVRILCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEZWF1dGhBY3Rpb24pOworCisgICAgLy8gY29sdW1uIDIKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUlNQX1dBSVRfQ0hBTCwgTVQyX1BFRVJfREVBVVRILCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEZWF1dGhBY3Rpb24pOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gVVNIT1JUIEFsZywKKyAgICBJTiBVU0hPUlQgU2VxLAorICAgIElOIFVTSE9SVCBSZWFzb24sCisgICAgSU4gVVNIT1JUIFN0YXR1cykKK3sKKyAgICBIRUFERVJfODAyXzExICAgICBBdXRoSGRyOworICAgIFVMT05HICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKyAgICBQVUNIQVIgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgICAgICBOU3RhdHVzOworCisgICAgaWYgKFJlYXNvbiAhPSBNTE1FX1NVQ0NFU1MpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyIEFVVEggZmFpbC4uLlxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisJLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisgICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBBVVRIIHJlc3BvbnNlIChzZXEjMikuLi5cbiIpKTsKKyAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgcEhkcjgwMjExLT5BZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZBdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkFsZywKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZTZXEsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBNTE1FX1FVRVVFX0VMRU0gRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgIFJlYXNvbjsKKworICAgIGlmIChQZWVyRGVhdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmUmVhc29uKSkKKyAgICB7CisgICAgICAgIGlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSF9SU1AgLSByZWNlaXZlIERFLUFVVEggZnJvbSBvdXIgQVAgKFJlYXNvbj0lZClcbiIsIFJlYXNvbikpOworCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKyAgICAgICAgICAgIExpbmtEb3duKHBBZCwgVFJVRSk7CisKKyAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIE1vZGUgQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGNhbmNlbCBpdCBpZiB1c2luZyBMRUFQCisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisgICAgICAgICAgICAgICAgLy9DaGVjayBpcyBpdCBtYWNoIHRoZSBMRUFQIEF1dGhlbnRpY2F0aW9uIGZhaWxlZCBhcyBwb3NzaWJsZSBhIFJvZ3VlIEFQCisgICAgICAgICAgICAgICAgLy9vbiBpdCdzIFBvcnRTZWN1cmVkIG5vdCBlcXVhbCB0byBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCB3aGlsZSBwcm9jZXNzIHRoZSBBdXRoZW50aWNhdG9uLgorICAgICAgICAgICAgICAgIGlmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpICYmIChwQWQtPk1sbWUuTGVhcE1hY2hpbmUuQ3VyclN0YXRlICE9IExFQVBfSURMRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIFBlZXJEZWF1dGhBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjI4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKQEAgLTAsMCArMSwyNzUxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWNvbm5lY3QuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCQkyMDA0LTA4LTA4CQkJTWFqb3IgbW9kaWZpY2F0aW9uIGZyb20gUlQyNTYwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW10gPSB7CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVXcGFOb25lVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzW10gPSB7CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVBZXMpIC8gc2l6ZW9mKFVDSEFSKSk7CisKKy8vIFRoZSBmb2xsb3dpbmcgTUFDUk8gaXMgY2FsbGVkIGFmdGVyIDEuIHN0YXJ0aW5nIGFuIG5ldyBJQlNTLCAyLiBzdWNjZXNmdWxseSBKT0lOIGFuIElCU1MsCisvLyBvciAzLiBzdWNjZXNmdWxseSBBU1NPQ0lBVEUgdG8gYSBCU1MsIDQuIHN1Y2Nlc3NmdWxseSBSRV9BU1NPQ0lBVEUgdG8gYSBCU1MKKy8vIEFsbCBzZXR0aW5ncyBzdWNjZXNzZnVseSBuZWdvdGlhdGVkIGZ1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmVzIGJlY29tZSBmaW5hbCBzZXR0aW5ncworLy8gYW5kIGFyZSBjb3BpZWQgdG8gcEFkLT5TdGFBY3RpdmUKKyNkZWZpbmUgQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoX3BBZCktPk1sbWVBdXguU3NpZExlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW4pOyBcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPkNvbW1vbkNmZy5Cc3NpZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSAoX3BBZCktPk1sbWVBdXguQ2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbDsgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoX3BBZCktPk1sbWVBdXguQXRpbVdpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbyA9IChfcEFkKS0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbzsgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKF9wQWQpLT5NbG1lQXV4LkJlYWNvblBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNmcE1heER1cmF0aW9uID0gKF9wQWQpLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5DZnBQZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQ2ZwUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbik7XAorCShfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW4pO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBFZGNhUGFybSwgJihfcEFkKS0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICYoX3BBZCktPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTtcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7ICAgICAgXAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IChfcEFkKS0+U3RhQ2ZnLlBhaXJDaXBoZXI7XAorCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5Cc3NJZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTtcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SYXRlTGVuID0gKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW47XAorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE1sbWVDbnRsSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgZGlmZmVycyBmcm9tIG90aGVyIHN0YXRlIG1hY2hpbmVzLCB0aGUgaW50ZXJmYWNlCisJLy8gZm9sbG93cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlzd2l0Y2gocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkKKwl7CisJCWNhc2UgQ05UTF9JRExFOgorCQkJeworCQkJCUNudGxJZGxlUHJvYyhwQWQsIEVsZW0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0RJU0FTU09DOgorCQkJQ250bFdhaXREaXNhc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9KT0lOOgorCQkJQ250bFdhaXRKb2luUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJLy8gQ05UTF9XQUlUX1JFQVNTT0MgaXMgdGhlIG9ubHkgc3RhdGUgaW4gQ05UTCBtYWNoaW5lIHRoYXQgZG9lcworCQkvLyBub3QgdHJpZ2dlcmVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgIlJUTVBTZXRJbmZvcm1hdGlvbihPSURfeHh4KSIuCisJCS8vIFRoZXJlZm9yZSBub3QgcHJvdGVjdGVkIGJ5IE5ESVMncyAib25seSBvbmUgb3V0c3RhbmRpbmcgT0lEIHJlcXVlc3QiCisJCS8vIHJ1bGUuIFdoaWNoIG1lYW5zIE5ESVMgbWF5IFNFVCBPSUQgaW4gdGhlIG1pZGRsZSBvZiBST0FNaW5nIGF0dGVtcHRzLgorCQkvLyBDdXJyZW50IGFwcHJvYWNoIGlzIHRvIGJsb2NrIG5ldyBTRVQgcmVxdWVzdCBhdCBSVE1QU2V0SW5mb3JtYXRpb24oKQorCQkvLyB3aGVuIENudGxNYWNoaW5lLkN1cnJTdGF0ZSBpcyBub3QgQ05UTF9JRExFCisJCWNhc2UgQ05UTF9XQUlUX1JFQVNTT0M6CisJCQlDbnRsV2FpdFJlYXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9TVEFSVDoKKwkJCUNudGxXYWl0U3RhcnRQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfQVVUSDoKKwkJCUNudGxXYWl0QXV0aFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BVVRIMjoKKwkJCUNudGxXYWl0QXV0aFByb2MyKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfQVNTT0M6CisJCQlDbnRsV2FpdEFzc29jUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjoKKwkJCWlmKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NDQU5fQ09ORikKKwkJCXsKKwkJCQkvLyBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUKKwkJCQkvLyB3b24ndCBiZSB0b28gbG9uZyB0byBsZXQgdXBwZXIgbGF5ZXIgdGltZS1vdXQgdGhlIHdhaXRpbmcgZnJhbWVzCisJCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKQorCQkJCXsKKwkJCQkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJCQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJCQkJfQorCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKyAgICAgICAgICAgICAgICAvLworCQkJCS8vIFNldCBMRUQgc3RhdHVzIHRvIHByZXZpb3VzIHN0YXR1cy4KKwkJCQkvLworCQkJCWlmIChwQWQtPmJMZWRPblNjYW5uaW5nKQorCQkJCXsKKwkJCQkJcEFkLT5iTGVkT25TY2FubmluZyA9IEZBTFNFOworCQkJCQlSVE1QU2V0TEVEKHBBZCwgcEFkLT5MZWRTdGF0dXMpOworCQkJCX0KKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQkJLy8gQVAgc2VudCBhIDIwNDBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lLCB0aGVuIHN0YXRpb24gcGVyZm9ybSBhIHNjYW4sIGFuZCB0aGVuIHNlbmQgYmFjayB0aGUgcmVzcG9uZS4KKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW5mb1JlcSA9PSAxKQorCQkJCXsKKwkJCQkJVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeShwQWQsIEJTU0lEX1dDSUQsIFRSVUUpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9PSURfRElTQVNTT0M6CisJCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikKKwkJCXsKKwkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVF9FUlIoKCIhRVJST1IhIENOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgdHlwZSg9JWxkKSIsIEVsZW0tPk1zZ1R5cGUpKTsKKwkJCWJyZWFrOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsSWRsZVByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgIERpc2Fzc29jUmVxOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2goRWxlbS0+TXNnVHlwZSkKKwl7CisJCWNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQkJQ250bE9pZFNzaWRQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisJCQlDbnRsT2lkUlRCc3NpZFByb2MocEFkLEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKwkJCUNudGxPaWRTY2FuUHJvYyhwQWQsRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmKEFURV9PTihwQWQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorICAgIAkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKyAgICAJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworICAgIAkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKyAgICAgICAgICAgIH0KKwkJCWJyZWFrOworCisJCWNhc2UgTVQyX01MTUVfUk9BTUlOR19SRVE6CisJCQlDbnRsTWxtZVJvYW1pbmdQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworICAgICAgICBjYXNlIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FOgorICAgICAgICAgICAgV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKHBBZCwgRWxlbSk7CisgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTToKKwkJCUNudGxPaWRETFNTZXR1cFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIGluIENudGxJZGxlUHJvYyhNc2dUeXBlPSVsZClcbiIsRWxlbS0+TXNnVHlwZSkpOworCQkJYnJlYWs7CisJfQorfQorCitWT0lEIENudGxPaWRTY2FuUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICAgICBCc3NJZHggPSBCU1NfTk9UX0ZPVU5EOworCUJTU19FTlRSWSAgICAgICAgICAgICAgICAgIEN1cnJCc3M7CisKKyNpZmRlZiBSQUxJTktfQVRFCisvKiBEaXNhYmxlIHNjYW5uaW5nIHdoZW4gQVRFIGlzIHJ1bm5pbmcuICovCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKwkvLyByZWNvcmQgY3VycmVudCBCU1MgaWYgbmV0d29yayBpcyBjb25uZWN0ZWQuCisJLy8gMjAwMy0yLTEzIGRvIG5vdCBpbmNsdWRlIGN1cnJlbnQgSUJTUyBpZiB0aGlzIGlzIHRoZSBvbmx5IFNUQSBpbiB0aGlzIElCU1MuCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwl7CisJCUJzc0lkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoJkN1cnJCc3MsICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQl9CisJfQorCisJLy8gY2xlYW4gdXAgcHJldmlvdXMgU0NBTiByZXN1bHQsIGFkZCBjdXJyZW50IEJTUyBiYWNrIHRvIHRhYmxlIGlmIGFueQorCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJeworCQkvLyBEREsgTm90ZTogSWYgdGhlIE5JQyBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIEJTU0lEIGFuZCBTU0lECisJCS8vICAgIHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YgQlNTSURzIGdlbmVyYXRlZCBieSB0aGlzIHNjYW4sIHRoZQorCQkvLyAgICBCU1NJRCBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgQlNTSUQgYW5kIFNTSUQgc2hvdWxkIGJlCisJCS8vICAgIGFwcGVuZGVkIHRvIHRoZSBsaXN0IG9mIEJTU0lEcyBpbiB0aGUgTklDJ3MgZGF0YWJhc2UuCisJCS8vIFRvIGVuc3VyZSB0aGlzLCB3ZSBhcHBlbmQgdGhpcyBCU1MgYXMgdGhlIGZpcnN0IGVudHJ5IGluIFNDQU4gcmVzdWx0CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbMF0sICZDdXJyQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBBZC0+U2NhblRhYi5Cc3NOciA9IDE7CisJfQorCisJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsICIiLCAwLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLAorCQlzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZSwgdXNlciBkZXNpcmVkIFNTSUQgc2hvdWxkIGFscmVhZHkgYmVlbgorCQlyZWNvcmRlZCBpbiBDb21tb25DZmcuU3NpZFtdCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bE9pZFNzaWRQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCit7CisJUE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgcE9pZFNzaWQgPSAoTkRJU184MDJfMTFfU1NJRCAqKUVsZW0tPk1zZzsKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKKwlVTE9ORwkJCQkJICAgTm93OworCisJLy8gU3RlcCAxLiByZWNvcmQgdGhlIGRlc2lyZWQgdXNlciBzZXR0aW5ncyB0byBNbG1lQXV4CisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBPaWRTc2lkLT5Tc2lkLCBwT2lkU3NpZC0+U3NpZExlbmd0aCk7CisJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSAoVUNIQVIpcE9pZFNzaWQtPlNzaWRMZW5ndGg7CisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEFkLT5TdGFDZmcuQnNzVHlwZTsKKworCisJLy8KKwkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCisJLy8KKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCisJLy8gc3RlcCAyLiBmaW5kIGFsbCBtYXRjaGluZyBCU1MgaW4gdGhlIGxhc3Rlc3QgU0NBTiByZXN1bHQgKGluQnNzVGFiKQorCS8vICAgICYgbG9nIHRoZW0gaW50byBNbG1lQXV4LlNzaWRCc3NUYWIgZm9yIGxhdGVyLW9uIGl0ZXJhdGlvbi4gU29ydCBieSBSU1NJIG9yZGVyCisJQnNzVGFibGVTc2lkU29ydChwQWQsICZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSAlZCBCU1Mgb2YgJWQgQlNTIG1hdGNoIHRoZSBkZXNpcmUgKCVkKVNTSUQgLSAlc1xuIiwKKwkJCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yLCBwQWQtPlNjYW5UYWIuQnNzTnIsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCkpOworCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCisJCShwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWRMZW4pICYmCisJCU5kaXNFcXVhbE1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSAmJgorCQlNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uQnNzaWQpKQorCXsKKwkJLy8gQ2FzZSAxLiBhbHJlYWR5IGNvbm5lY3RlZCB3aXRoIGFuIEFQIHdobyBoYXMgdGhlIGRlc2lyZWQgU1NJRAorCQkvLyAgICAgICAgIHdpdGggaGlnaGVzdCBSU1NJCisKKwkJLy8gQWRkIGNoZWNraW5nIE1vZGUgIkxFQVAiIGZvciBDQ1ggMS4wCisJCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJIHx8IChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJICkgJiYKKwkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQl7CisJCQkvLyBjYXNlIDEuMSBGb3IgV1BBLCBXUEEtUFNLLCBpZiB0aGUgMXggcG9ydCBpcyBub3Qgc2VjdXJlZCwgd2UgaGF2ZSB0byByZWRvCisJCQkvLyAgICAgICAgICBjb25uZWN0aW9uIHByb2Nlc3MKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCQl9CisJCWVsc2UgaWYgKHBBZC0+YkNvbmZpZ0NoYW5nZWQgPT0gVFJVRSkKKwkJeworCQkJLy8gY2FzZSAxLjIgSW1wb3J0YW50IENvbmZpZyBoYXMgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbm5lY3QgdG8gdGhlIHNhbWUgQVAKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIEJlY2F1c2UgY29uZmlnIGNoYW5nZWQuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBjYXNlIDEuMy4gYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlIFNTSUQgd2l0aCBoaWdoZXN0IFJTU0kuCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gYWxyZWFkeSB3aXRoIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9TU0lEIHJlcXVlc3RcbiIpKTsKKwkJCS8vCisJCQkvLyAoSENUIDEyLjEpIDFjX3dsYW5fbWVkaWFldmVudHMgcmVxdWlyZWQKKwkJCS8vIG1lZGlhIGNvbm5lY3QgZXZlbnRzIGFyZSBpbmRpY2F0ZWQgd2hlbiBhc3NvY2lhdGluZyB3aXRoIHRoZSBzYW1lIEFQCisJCQkvLworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBTaW5jZSBNZWRpYVN0YXRlIGFscmVhZHkgaXMgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQKKwkJCQkvLyBXZSBqdXN0IGluZGljYXRlIHRoZSBjb25uZWN0IGV2ZW50IGFnYWluIHRvIG1lZXQgdGhlIFdIUUwgcmVxdWlyZWQuCisJCQkJLy8KKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKwkJCX0KKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQl9CisJfQorCWVsc2UgaWYgKElORlJBX09OKHBBZCkpCisJeworCQkvLworCQkvLyBGb3IgUlQ2MQorCQkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQorCQkvLyBSVDYxIG1heSBsb3N0IFNTSUQsIGFuZCBub3QgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBhbmQgd2lsbCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGJ5IEF1dG9yZWNvbm5lY3QKKwkJLy8gQnV0IG1lZGlhIHN0YXR1cyBpcyBjb25uZWN0ZWQsIHNvIHRoZSBTU0lEIG5vdCByZXBvcnQgY29ycmVjdGx5LgorCQkvLworCQlpZiAoIVNTSURfRVFVQUwocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSkKKwkJeworCQkJLy8KKwkJCS8vIERpZmZlcmVudCBTU0lEIG1lYW5zIG5vdCBSb2FtaW5nIGNhc2UsIHNvIHdlIGxldCBMaW5rRG93bigpIHRvIEluZGljYXRlIGEgZGlzY29ubmVjdCBldmVudC4KKwkJCS8vCisJCQlwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOworCQl9CisJCS8vIGNhc2UgMi4gYWN0aXZlIElORlJBIGFzc29jaWF0aW9uIGV4aXN0ZW50CisJCS8vICAgIHJvYW1pbmcgaXMgZG9uZSB3aXRoaW4gbWluaXBvcnQgZHJpdmVyLCBub3RoaW5nIHRvIGRvIHdpdGggY29uZmlndXJhdGlvbgorCQkvLyAgICB1dGlsaXR5LiBzbyB1cG9uIGEgbmV3IFNFVChPSURfODAyXzExX1NTSUQpIGlzIHJlY2VpdmVkLCB3ZSBqdXN0CisJCS8vICAgIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAsCisJCS8vICAgIHRoZW4gcGVyZm9ybSBhIG5ldyBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgbmV3IFNTSUQsIG5vIG1hdHRlciB0aGUKKwkJLy8gICAgbmV3L29sZCBTU0lEIGFyZSB0aGUgc2FtZSBvciBub3QuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7CisJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJfQorCWVsc2UKKwl7CisJCWlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CisJCX0KKworCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID09IDApICYmCisJCQkocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkgJiYKKwkJCShwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfSU5GUkEpICYmCisJCQkoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pID09IFRSVUUpCisJCQkpCisJCXsKKwkJCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBObyBtYXRjaGluZyBCU1MsIHN0YXJ0IGEgbmV3IHNjYW5cbiIpKTsKKwkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCQkJLy8gUmVzZXQgTWlzc2VkIHNjYW4gbnVtYmVyCisJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxPaWRSVEJzc2lkUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQoreworCVVMT05HICAgICAgIEJzc0lkeDsKKwlQVUNIQVIgICAgICBwT2lkQnNzaWQgPSAoUFVDSEFSKUVsZW0tPk1zZzsKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7CisJTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgICAgIEpvaW5SZXE7CisKKyNpZmRlZiBSQUxJTktfQVRFCisvKiBObyBuZWVkIHRvIHBlcmZvcm0gdGhpcyByb3V0aW5lIHdoZW4gQVRFIGlzIHJ1bm5pbmcuICovCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLy8gcmVjb3JkIHVzZXIgZGVzaXJlZCBzZXR0aW5ncworCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwT2lkQnNzaWQpOworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEFkLT5TdGFDZmcuQnNzVHlwZTsKKworCS8vCisJLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgorCS8vCisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKworCS8vIGZpbmQgdGhlIGRlc2lyZWQgQlNTIGluIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQgdGFibGUKKwlCc3NJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwT2lkQnNzaWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKwlpZiAoQnNzSWR4ID09IEJTU19OT1RfRk9VTkQpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiByZXBseSBORElTX1NUQVRVU19OT1RfQUNDRVBURURcbiIpKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJcmV0dXJuOworCX0KKworCS8vIGNvcHkgdGhlIG1hdGNoZWQgQlNTIGVudHJ5IGZyb20gU2NhblRhYiB0byBNbG1lQXV4LlNzaWRCc3NUYWIuIFdoeT8KKwkvLyBCZWNhdXNlIHdlIG5lZWQgdGhpcyBlbnRyeSB0byBiZWNvbWUgdGhlIEpPSU4gdGFyZ2V0IGluIGxhdGVyIG9uIFNZTkMgc3RhdGUgbWFjaGluZQorCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID0gMTsKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0sICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCisJLy8gMjAwMi0xMS0yNiBza2lwIHRoZSBmb2xsb3dpbmcgY2hlY2tpbmcuIGkuZS4gaWYgdXNlciB3YW50cyB0byByZS1jb25uZWN0IHRvIHNhbWUgQVAKKwkvLyAgIHdlIGp1c3QgZm9sbG93IG5vcm1hbCBwcm9jZWR1cmUuIFRoZSByZWFzb24gb2YgdXNlciBkb2luZyB0aGlzIG1heSBiZWNhdXNlIGhlL3NoZSBjaGFuZ2VkCisJLy8gICBBUCB0byBhbm90aGVyIGNoYW5uZWwsIGJ1dCB3ZSBzdGlsbCByZWNlaXZlZCBCRUFDT04gZnJvbSBpdCB0aHVzIGRvbid0IGNsYWltIExpbmsgRG93bi4KKwkvLyAgIFNpbmNlIHVzZXIga25vd3MgaGUncyBjaGFuZ2VkIEFQIGNoYW5uZWwsIGhlJ2xsIHJlLWNvbm5lY3QgYWdhaW4uIEJ5IHNraXBwaW5nIHRoZSBmb2xsb3dpbmcKKwkvLyAgIGNoZWNraW5nLCB3ZSdsbCBkaXNhc3NvY2lhdGUgdGhlbiByZS1kbyBub3JtYWwgYXNzb2NpYXRpb24gd2l0aCB0aGlzIEFQIGF0IHRoZSBuZXcgY2hhbm5lbC4KKwkvLyAyMDAzLTEtNiBSZS1lbmFibGUgdGhpcyBmZWF0dXJlIGJhc2VkIG9uIG1pY3Jvc29mdCByZXF1aXJlbWVudCB3aGljaCBwcmVmZXIgbm90IHRvIHJlLWRvCisJLy8gICBjb25uZWN0aW9uIHdoZW4gc2V0dGluZyB0aGUgc2FtZSBCU1NJRC4KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCisJCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwT2lkQnNzaWQpKQorCXsKKwkJLy8gYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgQlNTSUQsIGdvIGJhY2sgdG8gaWRsZSBzdGF0ZSBkaXJlY3RseQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gYWxyZWFkeSBpbiB0aGlzIEJTU0lELiBpZ25vcmUgdGhpcyBTRVRfQlNTSUQgcmVxdWVzdFxuIikpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJfQorCWVsc2UKKwl7CisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisJCQkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGRyb3AgY3VycmVudCBBREhPQ1xuIikpOworCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOworCQkJfQorCisJCQkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKKwkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKworCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZworCQkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCisJCQkvLyBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuR3JvdXBDaXBoZXI7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXI7CisJCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXg7CisJCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQl9CisJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOworCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisKKwkJCQkvLyBSU04gY2FwYWJpbGl0eQorCQkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7CisJCQl9CisKKwkJCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKKwkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7CisJCQlpZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQorCQkJeworCQkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCisJCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOworCQkJfQorCQkJLy8gTm8gYWN0aXZlIGFzc29jaWF0aW9uLCBqb2luIHRoZSBCU1MgaW1tZWRpYXRlbHkKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luaW5nICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQlwT2lkQnNzaWRbMF0scE9pZEJzc2lkWzFdLHBPaWRCc3NpZFsyXSxwT2lkQnNzaWRbM10scE9pZEJzc2lkWzRdLHBPaWRCc3NpZFs1XSkpOworCisJCQlKb2luUGFybUZpbGwocEFkLCAmSm9pblJlcSwgcEFkLT5NbG1lQXV4LkJzc0lkeCk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksICZKb2luUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9KT0lOOworCQl9CisJfQorfQorCisvLyBSb2FtaW5nIGlzIHRoZSBvbmx5IGV4dGVybmFsIHJlcXVlc3QgdHJpZ2dlcmluZyBDTlRMIHN0YXRlIG1hY2hpbmUKKy8vIGRlc3BpdGUgb2Ygb3RoZXIgIlNFVCBPSUQiIG9wZXJhdGlvbi4gQWxsICJTRVQgT0lEIiByZWxhdGVkIG9lcmF0aW9ucworLy8gaGFwcGVuIGluIHNlcXVlbmNlLCBiZWNhdXNlIG5vIG90aGVyIFNFVCBPSUQgd2lsbCBiZSBzZW50IHRvIHRoaXMgZGV2aWNlCisvLyB1bnRpbCB0aGUgdGhlIHByZXZpb3VzIFNFVCBvcGVyYXRpb24gaXMgY29tcGxldGUgKHN1Y2Nlc3NmdWwgbyBmYWlsZWQpLgorLy8gU28sIGhvdyBkbyB3ZSBxdWFyYW50ZWUgdGhpcyBST0FNSU5HIHJlcXVlc3Qgd29uJ3QgY29ycnVwdCBvdGhlciAiU0VUIE9JRCI/CisvLyBvciBiZWVuIGNvcnJ1cHRlZCBieSBvdGhlciAiU0VUIE9JRCI/CisvLworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIENudGxNbG1lUm9hbWluZ1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCS8vIFRPRE86CisJLy8gQVAgaW4gZGlmZmVyZW50IGNoYW5uZWwgbWF5IHNob3cgbG93ZXIgUlNTSSB0aGFuIGFjdHVhbCB2YWx1ZT8/CisJLy8gc2hvdWxkIHdlIGFkZCBhIHdlaWdodGluZyBmYWN0b3IgdG8gY29tcGVuc2F0ZSBpdD8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBSb2FtaW5nIGluIE1sbWVBdXguUm9hbVRhYi4uLlxuIikpOworCisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCAmcEFkLT5NbG1lQXV4LlJvYW1UYWIsIHNpemVvZihwQWQtPk1sbWVBdXguUm9hbVRhYikpOworCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID0gcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnI7CisKKwlCc3NUYWJsZVNvcnRCeVJzc2koJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiKTsKKwlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwlJdGVyYXRlT25Cc3NUYWIocEFkKTsKK30KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bE9pZERMU1NldHVwUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFJUXzgwMl8xMV9ETFMJCXBETFMgPSAoUFJUXzgwMl8xMV9ETFMpRWxlbS0+TXNnOworCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwlJTlQJCQkJCWk7CisJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9VTlNQRUNJRlk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSAoT0lEIHNldCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFZhbGlkPSVkLCBTdGF0dXM9JWQsIFRpbWVPdXQ9JWQsIENvdW50RG93blRpbWVyPSVkKVxuIiwKKwkJcERMUy0+TWFjQWRkclswXSwgcERMUy0+TWFjQWRkclsxXSwgcERMUy0+TWFjQWRkclsyXSwgcERMUy0+TWFjQWRkclszXSwgcERMUy0+TWFjQWRkcls0XSwgcERMUy0+TWFjQWRkcls1XSwKKwkJcERMUy0+VmFsaWQsIHBETFMtPlN0YXR1cywgcERMUy0+VGltZU91dCwgcERMUy0+Q291bnREb3duVGltZXIpKTsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCS8vIERMUyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgd2hlbiBBZGhvYyBtb2RlCisJaWYgKElORlJBX09OKHBBZCkpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQkocERMUy0+VGltZU91dCA9PSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KSAmJiBNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyAxLiBTYW1lIHNldHRpbmcsIGp1c3QgZHJvcCBpdAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIHNldHRpbmcgdW5jaGFuZ2VkXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICghcERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDIuIERpc2FibGUgRExTIGxpbmsgY2FzZSwganVzdCB0ZWFyIGRvd24gRExTIGxpbmsKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBzdGFydCB0ZWFyIGRvd24gcHJvY2VkdXJlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICgoaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZKSAmJiBwRExTLT5WYWxpZCAmJiAhcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpCisJCQl7CisJCQkJLy8gMy4gRW5hYmxlIGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHBETFMsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisKKwkJCQkvL1VwZGF0ZSBjb3VudGRvd24gdGltZXIKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyBzZXR1cCBjYXNlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICgoaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZKSAmJiBwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgorCQkJCShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYgIU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDQuIHVwZGF0ZSBtYWMgY2FzZSwgdGVhciBkb3duIG9sZCBETFMgYW5kIHNldHVwIG5ldyBETFMKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHBETFMsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyB0ZWFyIGRvd24gYW5kIHJlc3RhcnQgY2FzZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSBwRExTLT5UaW1lT3V0KSkKKwkJCXsKKwkJCQkvLyA1LiB1cGRhdGUgdGltZW91dCBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlIChubyB0ZWFyIGRvd24pCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dAk9IHBETFMtPlRpbWVPdXQ7CisJCQkJLy9VcGRhdGUgY291bnRkb3duIHRpbWVyCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgdXBkYXRlIHRpbWVvdXQgY2FzZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKKwkJCQkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzICE9IERMU19GSU5JU0gpICYmIE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDYuIHJlLXNldHVwIGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUgKG5vIHRlYXIgZG93bikKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHJldHJ5IHNldHVwIHByb2NlZHVyZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sKCJDTlRMIC0gRExTIG5vdCBjaGFuZ2VkIGluIGVudHJ5IC0gJWQgLSBWYWxpZD0lZCwgU3RhdHVzPSVkLCBUaW1lT3V0PSVkXG4iLAorCQkJCQlpLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KSk7CisJCQl9CisJCX0KKwl9Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0RJU0FTU09DX0NPTkYpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsXG4iKSk7CisKKwkgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ESVNBU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQl9CisKKwkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKwkJLy8gY2FzZSAxLiBubyBtYXRjaGluZyBCU1MsIGFuZCB1c2VyIHdhbnRzIEFESE9DLCBzbyB3ZSBqdXN0IHN0YXJ0IGEgbmV3IG9uZQorCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yPT0wKSAmJiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKKwkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7CisJCX0KKwkJLy8gY2FzZSAyLiB0cnkgZWFjaCBtYXRjaGVkIEJTUworCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRKb2luUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKKwlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgQXV0aFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9KT0lOX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCS8vIDEuIGpvaW5lZCBhbiBJQlNTLCB3ZSBhcmUgcHJldHR5IG11Y2ggZG9uZSBoZXJlCisJCQlpZiAocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJeworCQkJICAgIC8vCisJCQkJLy8gNUcgYmFuZHMgcnVsZXMgb2YgSmFwYW46CisJCQkJLy8gQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLgorCQkJCS8vCisJCQkJaWYgKCAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJICAgKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIENoYW5uZWw9JWQsIEpvaW4gYWRob2Mgb24gVzUzKDUyLDU2LDYwLDY0KSBDaGFubmVscyBhcmUgbm90IGFjY2VwdGVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlMaW5rVXAocEFkLCBCU1NfQURIT0MpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW4gdGhlIElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbMF0scEFkLT5Db21tb25DZmcuQnNzaWRbMV0scEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisJCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbM10scEFkLT5Db21tb25DZmcuQnNzaWRbNF0scEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKKworICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQl9CisJCQkvLyAyLiBqb2luZWQgYSBuZXcgSU5GUkEgbmV0d29yaywgc3RhcnQgZnJvbSBhdXRoZW50aWNhdGlvbgorCQkJZWxzZQorCQkJeworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCS8vIEFkZCBBdXRoTW9kZSAiTEVBUCIgZm9yIENDWCAxLlgKKwkJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCQl7CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIENJU0NPX0F1dGhNb2RlTEVBUCk7CisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQl7CisJCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8CisJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpCisJCQkJCXsKKwkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gMy4gZmFpbGVkLCB0cnkgbmV4dCBCU1MKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0U3RhcnRQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBSZXN1bHQ7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU1RBUlRfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkgICAgLy8KKwkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgorCQkJLy8gQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLgorCQkJLy8KKwkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkgICApCisJCQl7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgU3RhcnQgYWRob2Mgb24gVzUzKDUyLDU2LDYwLDY0KSBDaGFubmVscyBhcmUgbm90IGFjY2VwdGVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJcmV0dXJuOworCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCXsKKwkJCQlOX0NoYW5uZWxDaGVjayhwQWQpOworCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgMTYpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sIDE2KTsKKwkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisKKwkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKKwkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCisJCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCQkJfQorCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJeworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCQl9CisJCQlMaW5rVXAocEFkLCBCU1NfQURIT0MpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCS8vIEJlZm9yZSBzZW5kIGJlYWNvbiwgZHJpdmVyIG5lZWQgZG8gcmFkYXIgZGV0ZWN0aW9uCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCApCisJCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TSUxFTkNFX01PREU7CisJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCA9IDA7CisjaWZkZWYgREZTX1NVUFBPUlQKKwkJCQlCYnBSYWRhckRldGVjdGlvblN0YXJ0KHBBZCk7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIHN0YXJ0IGEgbmV3IElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbMF0scEFkLT5Db21tb25DZmcuQnNzaWRbMV0scEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisJCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbM10scEFkLT5Db21tb25DZmcuQnNzaWRbNF0scEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBTdGFydCBJQlNTIGZhaWwuIEJVRyEhISEhXG4iKSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKKwlNTE1FX0FTU09DX1JFUV9TVFJVQ1QgICAgICAgIEFzc29jUmVxOworCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICAgQXV0aFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIE9LXG4iKSk7CisJCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJkFzc29jUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8KKwkJCS8vIENpc2NvIExlYXAgQ0NLTSBzdXBwb3J0ZWQgUmUtYXNzb2NpYXRpb24uCisJCQkvLworCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5DQ0tNTGlua1VwRmxhZyA9PSBUUlVFKSkKKwkJCXsKKwkJCQkvL2lmIENDS00gaXMgdHVybiBvbiAsIHRoYXQncyBtZWFuIEZhc3QgUmVhdXRoZW50aWNhdGlvbgorCQkJCS8vVXNlIENDS00gUmVhc3NvY2lhdGlvbiBpbnN0ZWFkIG9mIG5vcm1hbCBhc3NvY2lhdGlvbiBmb3IgRmFzdCBSb2FtaW5nLgorCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkJCQkJc2l6ZW9mKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCksICZBc3NvY1JlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1JFQVNTT0M7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkJCQkJc2l6ZW9mKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCksICZBc3NvY1JlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVGhpcyBmYWlsIG1heSBiZWNhdXNlIG9mIHRoZSBBUCBhbHJlYWR5IGtlZXAgdXMgaW4gaXRzIE1BQyB0YWJsZSB3aXRob3V0CisJCQkvLyBhZ2Vpbmctb3V0LiBUaGUgcHJldmlvdXMgYXV0aGVudGljYXRpb24gYXR0ZW1wdCBtdXN0IGhhdmUgbGV0IGl0IHJlbW92ZSB1cy4KKwkJCS8vIHNvIHRyeSBBdXRoZW50aWNhdGlvbiBhZ2FpbiBtYXkgaGVscC4gRm9yIEQtTGluayBEV0wtOTAwQVArIGNvbXBhdGliaWxpdHkuCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCB0cnkgYWdhaW4uLi5cbiIpKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vQWRkIEF1dGhNb2RlICJMRUFQIiBmb3IgQ0NYIDEuWAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQ0lTQ09fQXV0aE1vZGVMRUFQKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwKKwkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQorCQkJCXsKKwkJCQkJLy8gZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdAorCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKKwkJCQl9CisJCQl9CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDI7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0QXV0aFByb2MyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKKwlNTE1FX0FTU09DX1JFUV9TVFJVQ1QgICAgICAgIEFzc29jUmVxOworCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICAgQXV0aFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIE9LXG4iKSk7CisJCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJkFzc29jUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCksICZBc3NvY1JlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVNTT0M7CisJCX0KKwkJZWxzZQorCQl7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvLyBQcm9jZXNzIExFQVAgZmlyc3QsIHNpbmNlIGl0IHVzZSBkaWZmZXJlbnQgY29udHJvbCB2YXJpYWJsZQorCQkJLy8gV2UgZG9uJ3Qgd2FudCB0byBhZmZlY3Qgb3RoZXIgcG92ZW4gb3BlcmF0aW9uCisJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCXsKKwkJCQkvLyBMRUFQIEF1dGggbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSAqTEVBUCogQVVUSCBGQUlMLCBnaXZlIHVwOyB0cnkgbmV4dCBCU1NcbiIpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUb3RhbCBtYXRjaCBCU1NJRCBbPSVkXVxuIiwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYKKwkJCQkgKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCB0cnkgT1BFTiBzeXN0ZW0uLi5cbiIpKTsKKwkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgZ2l2ZSB1cDsgdHJ5IG5leHQgQlNTXG4iKSk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsgLy8/Pz8/Pz8/CisJCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQkJfQorCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgUmVhc29uOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FTU09DX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCUxpbmtVcChwQWQsIEJTU19JTkZSQSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFzc29jaWF0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOworCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQl7CisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7CisJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgUmVzdWx0OworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1JFQVNTT0NfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJLy8KKwkJCS8vIE5ESVMgcmVxdWlyZXMgYSBuZXcgTGluayBVUCBpbmRpY2F0aW9uIGJ1dCBubyBMaW5rIERvd24gZm9yIFJFLUFTU09DCisJCQkvLworCQkJTGlua1VwKHBBZCwgQlNTX0lORlJBKTsKKworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBhc3NvY2lhdGlvbgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpKQorCQkJeworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX0ZJTklTSDsKKwkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLCBwQWQtPk1sbWVBdXguUm9hbUlkeCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gcmVhc3NvYyBmYWlsZWQsIHRyeSB0byBwaWNrIG5leHQgQlNTIGluIHRoZSBCU1MgVGFibGUKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSZS1hc3NvY2l0aW9uIGZhaWxzIG9uIEJTUyAjJWxkXG4iLCBwQWQtPk1sbWVBdXguUm9hbUlkeCkpOworCQkJcEFkLT5NbG1lQXV4LlJvYW1JZHgrKzsKKwkJCUl0ZXJhdGVPbkJzc1RhYjIocEFkKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTGlua1VwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIEJzc1R5cGUpCit7CisJVUxPTkcJTm93OworCVVJTlQzMglEYXRhOworCUJPT0xFQU4JQ2FuY2VsbGVkOworCVVDSEFSCVZhbHVlID0gMCwgaWR4OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7CisKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKworCS8vCisJLy8gQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb24KKwkvLyBDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsCisJLy8gISEhIExJTksgRE9XTiAhISEKKwkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQorCS8vCisJLy8gVG8gcHJldmVudCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24gdG8gY2FsbCBMaW5rIGRvd24gYWZ0ZXIgd2UgbGluayB1cCwKKwkvLyBjYW5jZWwgdGhlIERpc2Fzc29jVGltZXIgbm8gbWF0dGVyIHdoYXQgaXQgc3RhcnQgb3Igbm90LgorCS8vCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICZDYW5jZWxsZWQpOworCisJQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkvLyBJdCdzIHF1aXRlIGRpZmZpY3VsdCB0byB0ZWxsIGlmIGEgbmV3bHkgYWRkZWQgS0VZIGlzIFdFUCBvciBDS0lQIHVudGlsIGEgbmV3IEJTUworCS8vIGlzIGZvcm1lZCAoZWl0aGVyIEFTU09DL1JFLUFTU09DIGRvbmUgb3IgSUJTUyBzdGFydGVkLiBMaW5rVVAgc2hvdWxkIGJlIGEgc2FmZSBwbGFjZQorCS8vIHRvIGV4YW1pbmUgaWYgY2lwaGVyIGFsZ29yaXRobSBzd2l0Y2hpbmcgaXMgcmVxdWlyZWQuCisJLy9ydDI4NjBiLiBEb24ndCBrbm93IHdoeSBuZWVkIHRoaXMKKwlTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcChwQWQpOworCisjaWZkZWYgUlQyODYwCisJLy8gQmVmb3JlIHBvd2VyIHNhdmUgYmVmb3JlIGxpbmsgdXAgZnVuY3Rpb24sIFdlIHdpbGwgZm9yY2UgdXNlIDFSLgorCS8vIFNvIGFmdGVyIGxpbmsgdXAsIGNoZWNrIFJ4IGFudGVubmEgIyBhZ2Fpbi4KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJVmFsdWUgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCVZhbHVlIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCVZhbHVlIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisJcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCS8vIE5vIGNhcnJpZXIgZGV0ZWN0aW9uIHdoZW4gYWRob2MKKwkJLy8gQ2FycmllckRldGVjdGlvblN0b3AocEFkKTsKKwkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5DRF9TdGF0ZSA9IENEX05PUk1BTDsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhQWRob2MgTElOSyBVUCAhISEgXG4iICkpOworCX0KKwllbHNlCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhSW5mcmEgTElOSyBVUCAhISEgXG4iICkpOworCX0KKworCS8vIDMqMworCS8vIHJlc2V0IFR4IGJlYW1mb3JtaW5nIGJpdAorCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwlWYWx1ZSAmPSAofjB4MDEpOworCVZhbHVlIHw9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5UeEJGOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIENoYW5nZSB0byBBUCBjaGFubmVsCisgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJVmFsdWUgfD0gMHgxMDsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgyMCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKyNpZmRlZiBSVDI4NjAKKyAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7CisJCURhdGEgJj0gMHhmZmZmZmZmZTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOworCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwl9CisJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisgICAgeworCSAgICAvLyBNdXN0IHVzaW5nIDQwTUh6LgorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlWYWx1ZSB8PSAweDEwOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOworCQlEYXRhIHw9IDB4MTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwkgICAgVmFsdWUgfD0gKDB4MjApOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisjaWZkZWYgUlQyODYwCisgICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7CisJCQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIDQwTUh6IFVwcGVyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBVcHBlckNlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgeworCSAgICBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOworCQlEYXRhICY9IDB4ZmZmZmZmZmU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgyMCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKyNpZmRlZiBSVDI4NjAKKyAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISAyME1IeiBMSU5LIFVQICEhISBcbiIgKSk7CisgICAgfQorCisJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7CisJLy8KKwkvLyBTYXZlIEJCUF9SNjYgdmFsdWUsIGl0IHdpbGwgYmUgdXNlZCBpbiBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24KKwkvLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChCc3NUeXBlPSVkLCBBSUQ9JWQsIHNzaWQ9JXMsIENoYW5uZWw9JWQsIENlbnRyYWxDaGFubmVsID0gJWQpXG4iLAorCQlCc3NUeXBlLCBwQWQtPlN0YUFjdGl2ZS5BaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgKERlbnNpdHkgPSVkLCApXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1wZHVEZW5zaXR5KSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOworCisJLy8gQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQKKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKQorCXsKKwkJLy8gVXBkYXRlIEhUIHByb3RlY3Rpb25mb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4KKyAgICAJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkKKyAgICAJeworICAgIAkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7CisgICAgCX0KKyAgICAJZWxzZQorICAgCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkRyc0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9EUlMpKTsKKworCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsgICAvLyBsYXN0IFJYIHRpbWVzdGFtcAorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlICE9IFJ0ODAyXzExUHJlYW1ibGVMb25nKSAmJgorCQlDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04ocEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8pKQorCXsKKwkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworCX0KKworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID09IFJEX1NJTEVOQ0VfTU9ERSkKKwl7CisjaWZkZWYgREZTX1NVUFBPUlQKKwkJUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKwl9CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisKKwlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJeworCQlNYWtlSWJzc0JlYWNvbihwQWQpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJeworCQkJOyAvL0RvIG5vdGhpbmcKKwkJfQorCQllbHNlCisJCXsKKwkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOworCQl9CisKKwkJLy8gSW4gYWQgaG9jIG1vZGUsIHVzZSBNQUMgdGFibGUgZnJvbSBpbmRleCAxLgorCQkvLyBwLnMgQVNJQyB1c2UgYWxsIDB4ZmYgYXMgdGVybWluYXRpb24gb2YgV0NJRCB0YWJsZSBzZWFyY2guVG8gcHJldmVudCBpdCdzIDB4ZmYtZmYtZmYtZmYtZmYtZmYsIFdyaXRlIDAgaGVyZS4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQkFTRSwgMHgwMCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTgwOCwgMHgwMCk7CisKKwkJLy8gSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKKwkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQorCisJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisJCXsKKwkJCVBVQ0hBUglLZXk7CisJCQlVQ0hBUiAJQ2lwaGVyQWxnOworCisJCQlmb3IgKGlkeD0wOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykKKyAgICAgICAgCXsKKwkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleTsKKworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApCisJCQkJeworCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCQkJeworCQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisJCQkJCX0KKwkJCQl9CisKKworCQkJfQorCQl9CisJCS8vIElmIFdQQU5vbmUgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYworCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CS8vIGFsd2F5cyBiZSB6ZXJvCisKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEFkLT5TdGFDZmcuUE1LLCBMRU5fVEtJUF9FSyk7CisKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsICZwQWQtPlN0YUNmZy5QTUtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgIH0KKworCQkJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCWVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVbmtub3cgQ2lwaGVyICg9JWQpLCBzZXQgQ2lwaGVyIHRvIEFFU1xuIiwgcEFkLT5TdGFDZmcuUGFpckNpcGhlcikpOworCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisgICAgICAgICAgICB9CisKKwkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJCQkgIEJTUzAsCisJCQkJCQkJCSAgMCwKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCAwLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsIE5VTEwpOworCisJCX0KKworCX0KKwllbHNlIC8vIEJTU19JTkZSQQorCXsKKwkJLy8gQ2hlY2sgdGhlIG5ldyBTU0lEIHdpdGggbGFzdCBTU0lECisJCXdoaWxlIChDYW5jZWxsZWQgPT0gVFJVRSkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID09IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pCisJCQl7CisJCQkJaWYgKFJUTVBDb21wYXJlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbikgPT0gMCkKKwkJCQl7CisJCQkJCS8vIExpbmsgdG8gdGhlIG9sZCBvbmUgbm8gbGlua2Rvd24gaXMgcmVxdWlyZWQuCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIFNlbmQgbGluayBkb3duIGV2ZW50IGJlZm9yZSBzZXQgdG8gbGluayB1cAorCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBQSFcbiIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8KKwkJLy8gT24gV1BBIG1vZGUsIFJlbW92ZSBBbGwgS2V5cyBpZiBub3QgY29ubmVjdCB0byB0aGUgbGFzdCBCU1NJRAorCQkvLyBLZXkgd2lsbCBiZSBzZXQgYWZ0ZXIgNC13YXkgaGFuZHNoYWtlLgorCQkvLworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJCXsKKwkJCVVMT05HIAkJSVY7CisKKwkJCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKKwkJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7CisJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOworCisJCQkvLyBGaXhlZCBjb25uZWN0aW9uIGZhaWxlZCB3aXRoIFJhbmdlIE1heGltaXplciAtIDUxNSBBUCAoTWFydmVsbCBDaGlwKSB3aGVuIHNlY3VyaXR5IGlzIFdQQVBTSy9US0lQCisJCQkvLyBJZiBJViByZWxhdGVkIHZhbHVlcyBhcmUgdG9vIGxhcmdlIGluIEdyb3VwTXNnMiwgQVAgd291bGQgaWdub3JlIHRoaXMgbWVzc2FnZS4KKwkJCUlWID0gMDsKKwkJCUlWIHw9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgMzApOworCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIEJTU0lEX1dDSUQsIElWLCAwKTsKKwkJfQorCQkvLyBOT1RFOgorCQkvLyB0aGUgZGVjaXNpb24gb2YgdXNpbmcgInNob3J0IHNsb3QgdGltZSIgb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgZHVlIHRvCisJCS8vIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCisKKwkJLy8gTk9URToKKwkJLy8gdGhlIGRlY2lzaW9uIHRvIHVzZSAiUlRDL0NUUyIgb3IgIkNUUy10by1zZWxmIiBwcm90ZWN0aW9uIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5CisJCS8vIGR1ZSB0byBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCisJCUNvbXBvc2VQc1BvbGwocEFkKTsKKwkJQ29tcG9zZU51bGxGcmFtZShwQWQpOworCisJCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCisJCS8vIEFkZCBCU1NJRCB0byBXQ0lEIHNlYXJjaCB0YWJsZQorCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBCU1NJRF9XQ0lELCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwkJLy8gYWRkIHRoaXMgQlNTSUQgZW50cnkgaW50byBIQVNIIHRhYmxlCisJCXsKKwkJCVVDSEFSIEhhc2hJZHg7CisKKwkJCS8vcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisKKwkJLy8gSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBwYWlld2lzZSBhbmQgc2hhcmVkIGtleQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgaWYgKCgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSYmCisgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkmJgorICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpIHx8CisgICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSYmCisgICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpKSkKKyNlbHNlCisJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQl7CisJCQlQVUNIQVIJS2V5OworCQkJVUNIQVIgCUNpcGhlckFsZzsKKworCQkJZm9yIChpZHg9MDsgaWR4IDwgU0hBUkVfS0VZX05VTTsgaWR4KyspCisgICAgICAgIAl7CisJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CisKKwkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQorCQkJCXsKKwkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkJaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQkJCXsKKwkJCQkJCS8vIEFzc2lnbiBncm91cCBrZXkgaW5mbworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgbmVlZCB0byBpbmRpY2F0ZSBjb25uZWN0aXZpdHkgaW1tZWRpYXRlbHk7IEFESE9DIG1vZGUKKwkJLy8gc2hvdWxkIHdhaXQgdW50aWwgYXQgbGVhc3QgMiBhY3RpdmUgbm9kZXMgaW4gdGhpcyBCU1NJRC4KKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKyAgICAgICAgLy8gRm9yIEdVSSArKworCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCXsKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJfQorICAgICAgICAvLyAtLQorCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCisJCS8vIEFkZCBCU1NJRCBpbiBteSBNQUMgVGFibGUuCisgICAgICAgIE5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gQlNTSURfV0NJRDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5wQWQgPSBwQWQ7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVmFsaWRBc0NMSSA9IFRSVUU7CS8vQWx0aG91Z2ggdGhpcyBpcyBic3NpZC4uc3RpbGwgc2V0IFZhbGlkQXNDbAorCQlwQWQtPk1hY1RhYi5TaXplID0gMTsJLy8gaW5mcmEgbW9kZSBhbHdheXMgc2V0IE1BQ3RhYiBzaXplID0xLgorCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlNzdCA9IFNTVF9BU1NPQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BdXRoU3RhdGUgPSBTU1RfQVNTT0M7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICBOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAgQ2xpZW50U3RhdHVzRmxhZ3M9JWx4KVxuIiwKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKworCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIFRSVUUsIEJTUzApOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhIChTdGFBY3RpdmUuYkh0RW5hYmxlID0lZCwgKVxuIiwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBSZXBvcnQgQWRqYWNlbnQgQVAgcmVwb3J0LgorCQkvLworI2lmZGVmIExFQVBfU1VQUE9SVAorCQlDQ1hBZGphY2VudEFQUmVwb3J0KHBBZCk7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpCisJCQl7CisKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCk7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisgICAgICAgICAgICAgICAgUlRNUFNldFBpZ2d5QmFjayhwQWQsIFRSVUUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR1cm4gb24gUGlnZ3ktQmFja1xuIikpOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCQkJfQorCQl9CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCisJCQl7CisJCQkJQXNpY0VuYWJsZVJERyhwQWQpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOworCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCX0KKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9DT05ORUNUIEV2ZW50IEIhLkJBQ2FwYWJpbGl0eSA9ICV4LiBDbGllbnRTdGF0dXNGbGFncyA9ICVseFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfVVApOworCisJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgPSAwOworCXBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kID0gMDsKKwlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7ICAgICAgICAvLyBSZXNldCBjb25maWcgZmxhZworCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOyAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisKKwkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjaworCXsKKwkJUFVDSEFSCQkJCQlwVGFibGU7CisJCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCisJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpOworCQlBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUocEFkLCBwVGFibGUpOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisgICAgcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworICAgIHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKwlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpCisJeworCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMzIpCisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID4gTUNTXzcpIHx8IChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMzIpKQorCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJLy8gSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuCisJCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkKKwkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJfQorCWVsc2UKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCS8vICBMZXQgTGluayBTdGF0dXMgUGFnZSBkaXNwbGF5IGZpcnN0IGluaXRpYWwgcmF0ZS4KKwlwQWQtPkxhc3RUeFJhdGUgPSAoVVNIT1JUKShwRW50cnktPkhUUGh5TW9kZS53b3JkKTsKKwkvLyBTZWxlY3QgREFDIGFjY29yZGluZyB0byBIVCBvciBMZWdhY3kKKwlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gIT0gMHgwMCkKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwkJeworCQkgICAgVmFsdWUgfD0gMHgxMDsKKwkJfQorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKKwl7CisJfQorCWVsc2UgaWYgKHBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID09IDApCisJeworCSAgICAvLyBJZiBIVCBBUCBkb2Vzbid0IHN1cHBvcnQgTWF4UkFtcGR1RmFjdG9yID0gMSwgd2UgbmVlZCB0byBzZXQgbWF4IFBTRFUgdG8gMC4KKwkgICAgLy8gQmVjYXVzZSBvdXIgSW5pdCB2YWx1ZSBpcyAxIGF0IE1BQ1JlZ1RhYmxlLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgwZmZmKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBQYXRjaCBmb3IgTWFydmVsIEFQIHRvIGdhaW4gaGlnaCB0aHJvdWdocHV0CisJLy8gTmVlZCB0byBzZXQgYXMgZm9sbG93aW5nLAorCS8vIDEuIFNldCB0eG9wIGluIHJlZ2lzdGVyLUVEQ0FfQUMwX0NGRyBhcyAweDYwCisJLy8gMi4gU2V0IEVuVFhXcml0ZUJhY2tERE9ORSBpbiByZWdpc3Rlci1XUERNQV9HTE9fQ0ZHIGFzIHplcm8KKwkvLyAzLiBQQkZfTUFYX1BDTlQgYXMgMHgxRjNGQkY5RgorCS8vIDQuIGtpY2sgcGVyIHR3byBwYWNrZXRzIHdoZW4gZGVxdWV1ZQorCS8vCisJLy8gVHhvcCBjYW4gb25seSBiZSBtb2RpZmllZCB3aGVuIFJERyBpcyBvZmYsIFdNTSBpcyBkaXNhYmxlIGFuZCBUeEJ1cnN0IGlzIGVuYWJsZQorCS8vCisJLy8gaWYgMS4gTGVnYWN5IEFQIFdNTSBvbiwgIG9yIDIuIDExbiBBUCwgQU1QRFUgZGlzYWJsZS4gIEZvcmNlIHR1cm4gb2ZmIGJ1cnN0IG5vIG1hdHRlciB3aGF0IGJFbmFibGVUeEJ1cnN0IGlzLgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkpCisJCXx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGN0Y5Rik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMVxuIikpOworCX0KKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKwkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwkJRGF0YSAgfD0gMHg2MDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKwkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBUUlVFOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGQkY5Rik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMlxuIikpOworCX0KKwllbHNlCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGN0Y5Rik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgM1xuIikpOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIFJlLWNoZWNrIHRvIHR1cm4gb24gVFggYnVyc3Qgb3Igbm90LgorCWlmICgocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPT0gVFJVRSkgJiYgKChTVEFfV0VQX09OKHBBZCkpfHwoU1RBX1RLSVBfT04ocEFkKSkpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gVFJVRTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCQl7CisJCSAgICBVSU5UMzIgTUFDVmFsdWUgPSAwOworCQkJLy8gRm9yY2UgZGlzYWJsZSAgVFhPUCB2YWx1ZSBpbiB0aGlzIGNhc2UuIFRoZSBzYW1lIGFjdGlvbiBpbiBNTE1FVXBkYXRlUHJvdGVjdCB0b28uCisJCQkvLyBJIGRpZG4ndCBjaGFuZ2UgUEJGX01BWF9QQ05UIHNldHRpbmcuCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlICAmPSAweEZGRkZGRjAwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBNQUNWYWx1ZSk7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IEZBTFNFOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSA9IEZBTFNFOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gRkFMU0U7CisJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFwQWQtPmJOZXh0RGlzYWJsZVJ4QkE9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBKSk7CisJLy8gQlNTSUQgYWRkIGluIG9uZSBNQUMgZW50cnkgdG9vLiAgQmVjYXVzZSBpbiBUeCwgQVNJQyBuZWVkIHRvIGNoZWNrIENpcGhlciBhbmQgSVYvRUlWLCBCQWJpdG1hcAorCS8vIFB0aGVyIGluZm9ybWF0aW9uIGluIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGRyaXZlci4KKwkvLyBOb3RlOiBBcyBTVEEsIFRoZSBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4gUGFpcndpc2VLZXkgYW5kIFNoYXJlZCBLZXkgZm9yIEJTUzAgYXJlIHRoZSBzYW1lLgorCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisgICAgeworICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwlwRW50cnktPlBvcnRTZWN1cmVkID0gcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworICAgIC8vCisJLy8gUGF0Y2ggQXRoZXJvcyBBUCBUWCB3aWxsIGJyZWFrZG93biBpc3N1ZS4KKwkvLyBBUCBNb2RlbDogRExpbmsgRFdMLTgyMDBBUAorCS8vCisJaWYgKElORlJBX09OKHBBZCkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBTVEFfVEtJUF9PTihwQWQpKQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDApOworCX0KKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLmIyMDQwQ29leGlzdFNjYW5TdXApICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDExKSkKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApOworCQlCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QocEFkKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlEaXNjb25uZWN0IGN1cnJlbnQgQlNTSUQKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlJc1JlcUZyb21BUAkJLSBSZXF1ZXN0IGZyb20gQVAKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlXZSBuZWVkIG1vcmUgaW5mb3JtYXRpb24gdG8ga25vdyBpdCdzIHRoaXMgcmVxdXN0IGZyb20gQVAuCisJCUlmIHllcyEgd2UgbmVlZCB0byBkbyBleHRyYSBoYW5kbGluZywgZm9yIGV4YW1wbGUsIHJlbW92ZSB0aGUgV1BBIGtleS4KKwkJT3RoZXJ3aXNlIG9uIDQtd2F5IGhhbmRzaGFraW5nIHdpbGwgZmFpZWQsIHNpbmNlIHRoZSBXUEEga2V5IGRpZG4ndCBiZQorCQlyZW1vdmUgd2hpbGUgYXV0byByZWNvbm5lY3QuCisJCURpc2Nvbm5lY3QgcmVxdWVzdCBmcm9tIEFQLCBpdCBtZWFucyB3ZSB3aWxsIHN0YXJ0IGFmcmVzaCA0LXdheSBoYW5kc2hha2luZworCQlvbiBXUEEgbW9kZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBMaW5rRG93bigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgQk9PTEVBTiAgICAgIElzUmVxRnJvbUFQKQoreworCVVDSEFSCQkJICAgIGksIEJ5dGVWYWx1ZSA9IDA7CisKKwkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgorCWlmIChNT05JVE9SX09OKHBBZCkpCisJCXJldHVybjsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwl7CisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gISEhXG4iKSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKworI2lmZGVmIFJUMjg2MAorICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisgICAgeworCSAgICBCT09MRUFOIENhbmNlbGxlZDsKKyAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworICAgIH0KKworICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorICAgIHsKKyAgICAgICAgQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKKwkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisgICAgICAgIEF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKyAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisgICAgfQorCisgICAgcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJaWYgKEFESE9DX09OKHBBZCkpCQkvLyBBZGhvYyBtb2RlIGxpbmsgZG93bgorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAxISEhXG4iKSk7CisKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1hY1RhYi5TaXplPSVkICEhIVxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCX0KKwllbHNlCQkJCQkvLyBJbmZyYSBzdHJ1Y3R1cmUgbW9kZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAyISEhXG4iKSk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy8gRExTIHRlYXIgZG93biBmcmFtZSBtdXN0IGJlIHNlbnQgYmVmb3JlIGxpbmsgZG93bgorCQkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZQorCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXsKKwkJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSAgRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCisJCS8vIFNhdmVkIGxhc3QgU1NJRCBmb3IgbGlua3VwIGNvbXBhcmlzb24KKwkJcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pOworCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQlpZiAocEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID09IFRSVUUpCisJCXsKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQSFcbiIpKTsKKwkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgLy8KKwkJCS8vIElmIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgaXMgZnJvbSBORElTLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIEJTU0lEIGZyb20gZW50cnkuCisJCQkvLyBPdGhlcndpc2UgbG9zdCBiZWFjb24gb3IgcmVjZWl2ZSBEZS1BdXRoZW50aWNhdGlvbiBmcm9tIEFQLAorCQkJLy8gdGhlbiB3ZSBzaG91bGQgZGVsZXRlIEJTU0lEIGZyb20gQnNzVGFibGUuCisJCQkvLyBJZiB3ZSBkb24ndCBkZWxldGUgZnJvbSBlbnRyeSwgcm9hbWluZyB3aWxsIGZhaWwuCisJCQkvLworCQkJQnNzVGFibGVEZWxldGVFbnRyeSgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCX0KKworCQkvLyByZXN0b3JlIGJhY2sgdG8gLQorCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKKwkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCisJCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9PSBUUlVFKQorCQl7CisJCQkvLworCQkJLy8gUmVjb3JkIGN1cnJlbnQgQVAncyBpbmZvcm1hdGlvbi4KKwkJCS8vIGZvciBsYXRlciB1c2VkIHJlcG9ydGluZyBBZGphY2VudCBBUCByZXBvcnQuCisJCQkvLworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkTGVuKTsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCX0KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJLy8gQ291bnRyeSBJRSBvZiB0aGUgQVAgd2lsbCBiZSBldmFsdWF0ZWQgYW5kIHdpbGwgYmUgdXNlZC4KKwkJaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlICE9IFJ0ODAyXzExX0RfTm9uZSkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzBdLCAmcEFkLT5TdGFDZmcuU3RhT3JpQ291bnRyeUNvZGVbMF0sIDIpOworCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gcEFkLT5TdGFDZmcuU3RhT3JpR2VvZ3JhcGh5OworCQkJQnVpbGRDaGFubmVsTGlzdEV4KHBBZCk7CisJCX0KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwl9CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQorCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCX0KKworCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01pbgk9IDQ7CisJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisKKwlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsgLy9GQUxTRSk7CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgTlVMTCk7CisKKwkvLyBTZXQgTEVECisJUlRNUFNldExFRChwQWQsIExFRF9MSU5LX0RPV04pOworICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RjA7CisgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgorCisJCUFzaWNEaXNhYmxlU3luYyhwQWQpOworCisJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgPSAwOworCXBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kID0gMDsKKworCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwl7CisJCS8vIFJlbW92ZSBTdGFDZmcgSW5mb3JtYXRpb24gYWZ0ZXIgbGluayBkb3duCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBNQUNfQUREUl9MRU4pOworCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gMDsKKwl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOworCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFJlc2V0IFdQQS1QU0sgc3RhdGUuIE9ubHkgcmVzZXQgd2hlbiBzdXBwbGljYW50IGVuYWJsZWQKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3RhdGUgIT0gU1NfTk9UVVNFKQorCXsKKwkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKwkJLy8gQ2xlYXIgUmVwbGF5IGNvdW50ZXIKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgOCk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorCisKKwkvLworCS8vIGlmIGxpbmsgZG93biBjb21lIGZyb20gQVAsIHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBXUEEga2V5cyBvbiBXUEEgbW9kZS4KKwkvLyBvdGhlcndpc2Ugd2lsbCBjYXVzZSA0LXdheSBoYW5kc2hha2luZyBmYWlsZWQsIHNpbmNlIHRoZSBXUEEga2V5IG5vdCBlbXB0eS4KKwkvLworCWlmICgoSXNSZXFGcm9tQVApICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJLy8gUmVtb3ZlIGFsbCBXUEEga2V5cworCQlSVE1QV1BBUmVtb3ZlQWxsS2V5cyhwQWQpOworCX0KKworCS8vIDgwMi4xeCBwb3J0IGNvbnRyb2wKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJLy8gUHJldmVudCBjbGVhciBQb3J0U2VjdXJlZCBoZXJlIHdpdGggc3RhdGljIFdFUAorCS8vIE5ldHdvcmtNYW5nZXIgc2V0IHNlY3VyaXR5IHBvbGljeSBmaXJzdCB0aGVuIHNldCBTU0lEIHRvIGNvbm5lY3QgQVAuCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgorCQkocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IEZBTFNFKSkKKwl7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9IDA7CisKKwkvLyBUdXJuIG9mZiBDa2lwIGNvbnRyb2wgZmxhZworCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBGQUxTRTsKKwlwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBGQUxTRTsKKworICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKwlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCisgICAgcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IEZBTFNFOworCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBGQUxTRTsKKwlwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9IEZBTFNFOworICAgIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisKKwkvLyBSZXNldCB0aGUgQ3VycmVudCBBUCdzIElQIGFkZHJlc3MKKwlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5BaXJvbmV0SVBBZGRyZXNzLCA0KTsKKworCS8vIENsZWFuIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLkFzc29jSW5mbywgc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKSk7CisJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7CisJcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPSAwOworCXBBZC0+U3RhQ2ZnLlJlc1ZhcklFTGVuID0gMDsKKworCS8vCisJLy8gUmVzZXQgUlNTSSB2YWx1ZSBhZnRlciBsaW5rIGRvd24KKwkvLworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTBYOCA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMVg4ID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDggPSAwOworCisJLy8gUmVzdG9yZSBNbG1lUmF0ZQorCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vCisJLy8gQWZ0ZXIgTGluayBkb3duLCByZXNldCBwaWdneS1iYWNrIHNldHRpbmcgaW4gQVNJQy4gRGlzYWJsZSBSREcuCisJLy8KKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJ5dGVWYWx1ZSk7CisJCUJ5dGVWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCeXRlVmFsdWUpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkvLyBSZXNldCBEQUMKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCeXRlVmFsdWUpOworCUJ5dGVWYWx1ZSAmPSAofjB4MTgpOworCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJeworCQlCeXRlVmFsdWUgfD0gMHgxMDsKKwl9CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQnl0ZVZhbHVlKTsKKworCVJUTVBTZXRQaWdneUJhY2socEFkLEZBTFNFKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBSZXN0b3JlIGFsbCBzZXR0aW5ncyBpbiB0aGUgZm9sbG93aW5nLgorCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKEFMTE5fU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfE9GRE1TRVRQUk9URUNUKSwgVFJVRSwgRkFMU0UpOworCUFzaWNEaXNhYmxlUkRHKHBBZCk7CisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iQ3VycmVudEF0aGVyb3MgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IEZBTFNFOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCk7CisJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCA9IDA7CisJVHJpRXZlbnRJbml0KHBBZCk7CisJZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKKwl7CisJCXBBZC0+Q2hhbm5lbExpc3RbaV0uYkVmZmVjdGVkQ2hhbm5lbCA9IEZBTFNFOworCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgxZmZmKTsKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSB7CisJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCXdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwl7CisJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEl0ZXJhdGVPbkJzc1RhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICBTdGFydFJlcTsKKwlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICBKb2luUmVxOworCVVMT05HICAgICAgICAgICAgICAgICAgIEJzc0lkeDsKKworCS8vIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cworCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCisJQnNzSWR4ID0gcEFkLT5NbG1lQXV4LkJzc0lkeDsKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpCisJeworCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZworCQkvLyBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOworCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXg7CisJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQl9CisJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLkdyb3VwQ2lwaGVyOworCisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcjsKKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCisJCQkvLyBSU04gY2FwYWJpbGl0eQorCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Sc25DYXBhYmlsaXR5OworCQl9CisKKwkJLy8gU2V0IE1peCBjaXBoZXIgZmxhZworCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOworCQlpZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQorCQl7CisJCQkvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQorCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGl0ZXJhdGUgQlNTICVsZCBvZiAlZFxuIiwgQnNzSWR4LCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikpOworCQlKb2luUGFybUZpbGwocEFkLCAmSm9pblJlcSwgQnNzSWR4KTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLCBzaXplb2YoTUxNRV9KT0lOX1JFUV9TVFJVQ1QpLAorCQkJCQkmSm9pblJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKKwl9CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIEJTUyBmYWlsOyBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKKwkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgc2l6ZW9mKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCksICZTdGFydFJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7CisJfQorCWVsc2UgLy8gbm8gbW9yZSBCU1MKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHN0YXkgQCBjaCAjJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCX0KK30KKworLy8gZm9yIHJlLWFzc29jaWF0aW9uIG9ubHkKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBJdGVyYXRlT25Cc3NUYWIyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfUkVBU1NPQ19SRVFfU1RSVUNUIFJlYXNzb2NSZXE7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQnNzSWR4OworCUJTU19FTlRSWSAgICAgICAgICAgICAgICpwQnNzOworCisJQnNzSWR4ID0gcEFkLT5NbG1lQXV4LlJvYW1JZHg7CisJcEJzcyA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NFbnRyeVtCc3NJZHhdOworCisJaWYgKEJzc0lkeCA8IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGl0ZXJhdGUgQlNTICVsZCBvZiAlZFxuIiwgQnNzSWR4LCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikpOworCisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEJzcy0+Q2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsKTsKKworCQkvLyByZWFzc29jaWF0ZSBtZXNzYWdlIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgYXNzb2NpYXRlIG1lc3NhZ2UKKwkJQXNzb2NQYXJtRmlsbChwQWQsICZSZWFzc29jUmVxLCBwQnNzLT5Cc3NpZCwgcEJzcy0+Q2FwYWJpbGl0eUluZm8sCisJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKKwkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCQkJc2l6ZW9mKE1MTUVfUkVBU1NPQ19SRVFfU1RSVUNUKSwgJlJlYXNzb2NSZXEpOworCisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfUkVBU1NPQzsKKwl9CisJZWxzZSAvLyBubyBtb3JlIEJTUworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCBmYXN0IHJvYW1pbmcgZmFpbGVkLCBiYWNrIHRvIGNoICMlZFxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEpvaW5QYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKkpvaW5SZXEsCisJSU4gVUxPTkcgQnNzSWR4KQoreworCUpvaW5SZXEtPkJzc0lkeCA9IEJzc0lkeDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU2NhblBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX1NDQU5fUkVRX1NUUlVDVCAqU2NhblJlcSwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVUNIQVIgU2NhblR5cGUpCit7CisgICAgTmRpc1plcm9NZW1vcnkoU2NhblJlcS0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlTY2FuUmVxLT5Tc2lkTGVuID0gU3NpZExlbjsKKwlOZGlzTW92ZU1lbW9yeShTY2FuUmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwlTY2FuUmVxLT5Cc3NUeXBlID0gQnNzVHlwZTsKKwlTY2FuUmVxLT5TY2FuVHlwZSA9IFNjYW5UeXBlOworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBEbHNQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ETFNfUkVRX1NUUlVDVCAqcERsc1JlcSwKKwlJTiBQUlRfODAyXzExX0RMUyBwRGxzLAorCUlOIFVTSE9SVCByZWFzb24pCit7CisJcERsc1JlcS0+cERMUyA9IHBEbHM7CisJcERsc1JlcS0+UmVhc29uID0gcmVhc29uOworfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTdGFydFBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4pCit7CisJQVNTRVJUKFNzaWRMZW4gPD0gTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzTW92ZU1lbW9yeShTdGFydFJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7CisJU3RhcnRSZXEtPlNzaWRMZW4gPSBTc2lkTGVuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBdXRoUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAorCUlOIFBVQ0hBUiBwQWRkciwKKwlJTiBVU0hPUlQgQWxnKQoreworCUNPUFlfTUFDX0FERFIoQXV0aFJlcS0+QWRkciwgcEFkZHIpOworCUF1dGhSZXEtPkFsZyA9IEFsZzsKKwlBdXRoUmVxLT5UaW1lb3V0ID0gQVVUSF9USU1FT1VUOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNpZmRlZiBSVDI4NjAKK1ZPSUQgQ29tcG9zZVBzUG9sbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOworCXBBZC0+UHNQb2xsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0NOVEw7CisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9QU19QT0xMOworCXBBZC0+UHNQb2xsRnJhbWUuQWlkID0gcEFkLT5TdGFBY3RpdmUuQWlkIHwgMHhDMDAwOworCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5UYSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBDb21wb3NlTnVsbEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlwQWQtPk51bGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwlwQWQtPk51bGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7CisJcEFkLT5OdWxsRnJhbWUuRkMuVG9EcyA9IDE7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmUtYnVpbGQgYSBCRUFDT04gZnJhbWUgaW4gdGhlIHNoYXJlZCBtZW1vcnkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HIE1ha2VJYnNzQmVhY29uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKKwlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAweDA0fTsKKwlIRUFERVJfODAyXzExIEJjbkhkcjsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOworCUxBUkdFX0lOVEVHRVIgRmFrZVRpbWVzdGFtcDsKKwlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQVFhXSV9TVFJVQwkgIHBUeFdJID0gJnBBZC0+QmVhY29uVHhXSTsKKwlDSEFSICAgICAgICAgKnBCZWFjb25GcmFtZSA9IHBBZC0+QmVhY29uQnVmOworCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgICAgU3VwUmF0ZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVMZW4gPSAwOworCVVDSEFSICAgICAgICAgUlNOSWUgPSBJRV9XUEE7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpKQorCXsKKwkJU3VwUmF0ZVswXSA9IDB4ODI7IC8vIDEgbWJwcworCQlTdXBSYXRlWzFdID0gMHg4NDsgLy8gMiBtYnBzCisJCVN1cFJhdGVbMl0gPSAweDhiOyAvLyA1LjUgbWJwcworCQlTdXBSYXRlWzNdID0gMHg5NjsgLy8gMTEgbWJwcworCQlTdXBSYXRlTGVuID0gNDsKKwkJRXh0UmF0ZUxlbiA9IDA7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwl7CisJCVN1cFJhdGVbMF0gID0gMHg4QzsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQlTdXBSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVsyXSAgPSAweDk4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQlTdXBSYXRlWzNdICA9IDB4MjQ7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbNF0gID0gMHhiMDsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJU3VwUmF0ZVs1XSAgPSAweDQ4OyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzZdICA9IDB4NjA7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbN10gID0gMHg2YzsgICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZUxlbiAgPSA4OworCQlFeHRSYXRlTGVuICA9IDA7CisKKwkJLy8KKwkJLy8gQWxzbyBVcGRhdGUgTWxtZVJhdGUgJiBSdHNSYXRlIGZvciBHIG9ubHkgJiBBIG9ubHkKKwkJLy8KKwkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwl9CisJZWxzZQorCXsKKwkJU3VwUmF0ZVswXSA9IDB4ODI7IC8vIDEgbWJwcworCQlTdXBSYXRlWzFdID0gMHg4NDsgLy8gMiBtYnBzCisJCVN1cFJhdGVbMl0gPSAweDhiOyAvLyA1LjUgbWJwcworCQlTdXBSYXRlWzNdID0gMHg5NjsgLy8gMTEgbWJwcworCQlTdXBSYXRlTGVuID0gNDsKKworCQlFeHRSYXRlWzBdICA9IDB4MEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCisJCUV4dFJhdGVbMV0gID0gMHgxMjsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzJdICA9IDB4MTg7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAorCQlFeHRSYXRlWzNdICA9IDB4MjQ7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbNF0gID0gMHgzMDsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCisJCUV4dFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVMZW4gID0gODsKKwl9CisKKwlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKKwlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKworCS8vIGNvbXBvc2UgSUJTUyBiZWFjb24gZnJhbWUKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkJjbkhkciwgU1VCVFlQRV9CRUFDT04sIDAsIEJST0FEQ0FTVF9BRERSLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKKwkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCUNhcGFiaWxpdHlJbmZvID0gQ0FQX0dFTkVSQVRFKDAsIDEsIFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDAsIDApOworCisJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lLCAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAgJkJjbkhkciwKKwkJCQkJICBUSU1FU1RBTVBfTEVOLCAgICAgICAgICAgICAgICAgICAmRmFrZVRpbWVzdGFtcCwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKKwkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICBTdXBSYXRlLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0llLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0llLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCS8vIGFkZCBFUlBfSUUgYW5kIEVYVF9SQUUgSUUgb2YgaW4gODAyLjExZworCWlmIChFeHRSYXRlTGVuKQorCXsKKwkJVUxPTkcJdG1wOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgICZ0bXAsCisJCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAorCQkJCQkJICBFeHRSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICBFeHRSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCUZyYW1lTGVuICs9IHRtcDsKKwl9CisKKwkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQorCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCXsKKwkJVUxPTkcgdG1wOworICAgICAgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICAgICAgICAJJnRtcCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJJlJTTkllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAJJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAgICAgIAkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCUZyYW1lTGVuICs9IHRtcDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJeworCQlVTE9ORyBUbXBMZW47CisJCVVDSEFSIEh0TGVuLCBIdExlbjE7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworCQlBRERfSFRfSU5GT19JRQlhZGRIVEluZm9UbXA7CisJCVVTSE9SVAliMmxUbXAsIGIybFRtcDI7CisjZW5kaWYKKworCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOworCQlIdExlbjEgPSBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUrRnJhbWVMZW4sCSZUbXBMZW4sCisJCQkJCQkgIDEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuLAorCQkJCQkJICBIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkgIDEsCQkJCQkJJkFkZEh0SW5mb0llLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbjEsCisJCQkJCQkgIEh0TGVuMSwJCQkJCSZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKKwkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCU5kaXNNb3ZlTWVtb3J5KCZhZGRIVEluZm9UbXAsICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIEh0TGVuMSk7CisJCSooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMikgPSBTV0FQMTYoKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8yKSk7CisJCSooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMykgPSBTV0FQMTYoKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8zKSk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lK0ZyYW1lTGVuLAkmVG1wTGVuLAorCQkJCQkJICAxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbiwKKwkJCQkJCSAgSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJICAxLAkJCQkJCSZBZGRIdEluZm9JZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4xLAorCQkJCQkJICBIdExlbjEsCQkJCQkmYWRkSFRJbmZvVG1wLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJRnJhbWVMZW4gKz0gVG1wTGVuOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vYmVhY29uIHVzZSByZXNlcnZlZCBXQ0lEIDB4ZmYKKyAgICBpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorICAgIHsKKwlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgIFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSwgMCwgMHhmZiwgRnJhbWVMZW4sCisJCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU2V0IHRvIHVzZSAxTWJwcyBmb3IgQWRob2MgYmVhY29uLgorCQlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXQ7CisgICAgICAgIFRyYW5zbWl0LndvcmQgPSAwOworICAgICAgICBSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgIFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSwgMCwgMHhmZiwgRnJhbWVMZW4sCisgICAgCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJlRyYW5zbWl0KTsKKyAgICB9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgcEJlYWNvbkZyYW1lLCBESVJfV1JJVEUsIEZBTFNFKTsKKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFrZUlic3NCZWFjb24gKGxlbj0lbGQpLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBDaGFubmVsPSVkLCBQaHlNb2RlPSVkXG4iLAorCQkJCQlGcmFtZUxlbiwgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCXJldHVybiBGcmFtZUxlbjsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9kbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Rscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZmIyODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9kbHMuYwpAQCAtMCwwICsxLDIyMDEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgZGxzLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBXTU0tRExTIHN0YXRlIG1hY2hpbmUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUm9yeSBDaGVuICAgMDItMTQtMjAwNgorCUFydmluIFRhaQkwNi0wMy0yMDA4CSAgTW9kaWZpZWQgZm9yIFJUMjh4eAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBkbHMgc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gcG9pbnRlciB0byB0aGUgZGxzIHN0YXRlIG1hY2hpbmUKKyAgICBOb3RlOgorICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoaXMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMU19JRExFCisgICAgTVQyX01MTUVfRExTX1JFUVVFU1QgICBNbG1lRGxzUmVxQWN0aW9uCisgICAgTVQyX1BFRVJfRExTX1JFUVVFU1QgICBQZWVyRGxzUmVxQWN0aW9uCisgICAgTVQyX1BFRVJfRExTX1JFU1BPTlNFICBQZWVyRGxzUnNwQWN0aW9uCisgICAgTVQyX01MTUVfRExTX1RFQVJET1dOICBNbG1lVGVhckRvd25BY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfVEVBUkRPV04gIFBlZXJUZWFyRG93bkFjdGlvbgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgRGxzU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJVUNIQVIJaTsKKworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIChTVEFURV9NQUNISU5FX0ZVTkMqKVRyYW5zLCBNQVhfRExTX1NUQVRFLCBNQVhfRExTX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBETFNfSURMRSwgRExTX01BQ0hJTkVfQkFTRSk7CisKKyAgICAvLyB0aGUgZmlyc3QgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX01MTUVfRExTX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGxzUmVxQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNSZXFBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1JzcEFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGxzVGVhckRvd25BY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19URUFSX0RPV04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1RlYXJEb3duQWN0aW9uKTsKKworCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5wQWQgPSBwQWQ7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEbHNUaW1lb3V0QWN0aW9uKSwgcEFkLCBGQUxTRSk7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJSEVBREVSXzgwMl8xMQlEbHNSZXFIZHI7CisJUFJUXzgwMl8xMV9ETFMJcERMUyA9IE5VTEw7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfUkVRVUVTVDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlyZWFzb247CisJVUxPTkcJCQlUaW1lb3V0OworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKworCWlmKCFNbG1lRGxzUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZwRExTLCAmcmVhc29uKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBNbG1lRGxzUmVxQWN0aW9uKCkgXG4iKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIE1sbWVEbHNSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNSZXFIZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JlcUhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQkmcERMUy0+TWFjQWRkciwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJnBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvLAorCQkJCQkyLAkJCQkJCQkmcERMUy0+VGltZU91dCwKKwkJCQkJMSwJCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJMSwJCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAorCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwJcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCUVORF9PRl9BUkdTKTsKKworCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJICAxLAkJCQkJCSZFeHRSYXRlSWUsCisJCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwJcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwl7CisJCVVDSEFSIEh0TGVuOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCisJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCUh0TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCUh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQlGcmFtZUxlbiA9IEZyYW1lTGVuICsgdG1wOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJVGltZW91dCA9IERMU19USU1FT1VUOworCVJUTVBTZXRUaW1lcigmcERMUy0+VGltZXIsIFRpbWVvdXQpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckRsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVVNIT1JUCQkJU3RhdHVzQ29kZSA9IE1MTUVfU1VDQ0VTUzsKKwlIRUFERVJfODAyXzExCURsc1JzcEhkcjsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19SRVNQT05TRTsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQkJRExTVGltZU91dDsKKwlTSE9SVAkJCWk7CisJVUxPTkcJCQlUaW1lb3V0OworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQUlRfODAyXzExX0RMUwlwRExTID0gTlVMTDsKKwlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworICAgIFVDSEFSCQkJU3VwcG9ydGVkUmF0ZXNMZW47CisgICAgVUNIQVIJCQlTdXBwb3J0ZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47CisJSFRfQ0FQQUJJTElUWV9JRQlIdENhcGFiaWxpdHk7CisKKwlpZiAoIVBlZXJEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmQ2FwYWJpbGl0eUluZm8sICZETFNUaW1lT3V0LAorCQkJCQkJCSZTdXBwb3J0ZWRSYXRlc0xlbiwgJlN1cHBvcnRlZFJhdGVzWzBdLCAmSHRDYXBhYmlsaXR5TGVuLCAmSHRDYXBhYmlsaXR5KSkKKwkJcmV0dXJuOworCisgICAgLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKyAgICBmb3IgKGkgPSAwOyBpIDwgU3VwcG9ydGVkUmF0ZXNMZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZikpCisgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmOworICAgIH0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9SRVFVRVNUX0RFQ0xJTkVEOworCX0KKwllbHNlIGlmICghcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9ERVNUX1NUQV9JU19OT1RfQV9RU1RBOworCX0KKwllbHNlIGlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9SRVFVRVNUX0RFQ0xJTkVEOworCX0KKwllbHNlCisJeworCQkvLyBmaW5kIHRhYmxlIHRvIHVwZGF0ZSBwYXJhbWV0ZXJzCisJCWZvciAoaSA9IChNQVhfTlVNX09GX0RMU19FTlRSWS0xKTsgaSA+PSAwOyBpLS0pCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJfQorCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgPSBETFNUaW1lT3V0OworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gRExTVGltZU91dDsKKwkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJZWxzZQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCQlwRExTID0gJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gY2FuIG5vdCBmaW5kIGluIHRhYmxlLCBjcmVhdGUgYSBuZXcgb25lCisJCWlmIChpIDwgMCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgY2FuIG5vdCBmaW5kIHNhbWUgZW50cnkgXG4iKSk7CisJCQlmb3IgKGk9KE1BWF9OVU1fT0ZfRExTX0VOVFJZIC0gMSk7IGkgPj0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaS0tKQorCQkJeworCQkJCWlmICghcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpCisJCQkJeworCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJeworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJCX0KKworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkID0gVFJVRTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCA9IERMU1RpbWVPdXQ7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gRExTVGltZU91dDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgU0EsIE1BQ19BRERSX0xFTik7CisJCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJCWVsc2UKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCQlwRExTID0gJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldOworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOworCisJCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKwkJCQkJeworCQkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOworCQkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworCQkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOworCQkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOworCQkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworCQkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOworCQkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOworCQkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7CisKKwkJCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7CisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7CisKKwkJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCQl7CisJCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJCQkJCUNIQVIgICAgaWk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCQl9CisKKwkJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQkJeworCQkJCQkJCWogPSBpaS84OworCQkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCisJCQkJCQkJeworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQkJeworCisJCQkJCQkJcHJpbnRrKCJAQEAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9ICVkXG4iLAorCQkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKKwkJCQkJCQl7CisJCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKKwkJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCQkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkJCXsKKwkJCQkJCVBVQ0hBUiBwVGFibGU7CisJCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOworCisJCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCVN0YXR1c0NvZGUgPSBNTE1FX1NVQ0NFU1M7CisKKwkJLy8gY2FuIG5vdCBmaW5kIGluIHRhYmxlLCBjcmVhdGUgYSBuZXcgb25lCisJCWlmIChpIDwgMCkKKwkJeworCQkJU3RhdHVzQ29kZSA9IE1MTUVfUU9TX1VOU1BFQ0lGWTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIERMU0VudHJ5IHRhYmxlIGZ1bGwob25seSBjYW4gc3VwcG9ydCAlZCBETFMgc2Vzc2lvbikgXG4iLCBNQVhfTlVNX09GX0RMU19FTlRSWSAtIE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIHVzZSBlbnRyeSglZCkgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJaSwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCQl9CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNSc3BIZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSc3BIZHIsCisJCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQkJMiwJCQkJCQkJJlN0YXR1c0NvZGUsCisJCQkJCQk2LAkJCQkJCQlTQSwKKwkJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAorCQkJCQkJMSwJCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAorCQkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5TdXBSYXRlLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJICAxLAkJCQkJCSZFeHRSYXRlSWUsCisJCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLCAJcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVDSEFSIEh0TGVuOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisjZW5kaWYKKworCQkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJCUh0TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCQlIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbHNlCisJCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQkJSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJCUZyYW1lTGVuID0gRnJhbWVMZW4gKyB0bXA7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlpZiAocERMUyAmJiAocERMUy0+U3RhdHVzICE9IERMU19GSU5JU0gpKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJVGltZW91dCA9IERMU19USU1FT1VUOworCQkJUlRNUFNldFRpbWVyKCZwRExTLT5UaW1lciwgVGltZW91dCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JzcEhkciwKKwkJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCQkyLAkJCQkJCQkmU3RhdHVzQ29kZSwKKwkJCQkJCTYsCQkJCQkJCVNBLAorCQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwl9CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGxzUnNwQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQJCUNhcGFiaWxpdHlJbmZvOworCVVDSEFSCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOworCVVTSE9SVAkJU3RhdHVzQ29kZTsKKwlTSE9SVAkJaTsKKwlCT09MRUFOCQlUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUgkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisgICAgVUNIQVIJCVN1cHBvcnRlZFJhdGVzTGVuOworICAgIFVDSEFSCQlTdXBwb3J0ZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCUh0Q2FwYWJpbGl0eUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCUh0Q2FwYWJpbGl0eTsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCWlmICghSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuOworCisJaWYgKCFQZWVyRGxzUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzQ29kZSwKKwkJCQkJCQkmU3VwcG9ydGVkUmF0ZXNMZW4sICZTdXBwb3J0ZWRSYXRlc1swXSwgJkh0Q2FwYWJpbGl0eUxlbiwgJkh0Q2FwYWJpbGl0eSkpCisJCXJldHVybjsKKworICAgIC8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCisgICAgZm9yIChpPTA7IGk8U3VwcG9ydGVkUmF0ZXNMZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZikpCisgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmOworICAgIH0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBTdGF0dXNDb2RlPSVkLCBDYXBhYmlsaXR5SW5mbz0weCV4XG4iLAorCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdLCBTdGF0dXNDb2RlLCBDYXBhYmlsaXR5SW5mbykpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKKwkJCXsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKworCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCisJCQkJeworCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKKwkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOworCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKKwkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOworCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKKwkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKKwkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOworCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJfQorCisJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7CisKKwkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJeworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCX0KKworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7CisJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgorCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCXsKKwkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7CisJCQkJCUNIQVIgICAgaWk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCX0KKworCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCisJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQl7CisJCQkJCQlqID0gaWkvODsKKwkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKKwkJCQkJeworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQorCQkJCQkJeworCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKKwkJCQkJCXsKKwkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKKwkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkJeworCQkJCQlQVUNIQVIgcFRhYmxlOworCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOworCisJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCQkJfQorCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQl7CisJCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKKwkJCQkJaWYgKFJUTVBTZW5kU1RBS2V5UmVxdWVzdChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXsKKwkJCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwkJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdoZW4gY2FsbCBSVE1QU2VuZFNUQUtleVJlcXVlc3QgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIHdhaXRpbmcgZm9yIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlXG4iKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBTdWNjZWVkIHdpdGggV0VQIG9yIG5vIHNlY3VyaXR5XG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisJCQkJfQorCisJCQkJLy9pbml0aWFsaXplIHNlcSBubyBmb3IgRExTIGZyYW1lcy4KKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCWVsc2UKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRExTIHNldHVwIHByb2NlZHVyZSBmYWlsZWQuCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2l0aCBTdGF0dXNDb2RlPSVkIFxuIiwgU3RhdHVzQ29kZSkpOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPj0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIHVwZGF0ZSB0aW1lb3V0IHZhbHVlIFxuIikpOworCQlmb3IgKGk9KE1BWF9OVU1fT0ZfRExTX0VOVFJZLTEpOyBpPj1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpLS0pCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCQkJCXsKKwkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorCQkJCQl7CisJCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwkJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJCXsKKwkJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCQl9CisKKwkJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQkJeworCQkJCQkJCWogPSBpaS84OworCQkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCisJCQkJCQkJeworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKKwkJCQkJCXsKKwkJCQkJCQlwcmludGsoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQkJeworCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQkJeworCQkJCQkJUFVDSEFSIHBUYWJsZTsKKwkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKworCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQkJfQorCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQl7CisJCQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKKwkJCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCQkJaWYgKFJUTVBTZW5kU1RBS2V5UmVxdWVzdChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCQl7CisJCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSB3YWl0aW5nIGZvciBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZVxuIikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJCWVsc2UKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2l0aCBTdGF0dXNDb2RlPSVkIFxuIiwgU3RhdHVzQ29kZSkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047CisJVVNIT1JUCQkJUmVhc29uQ29kZSA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOworCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7CisJUFJUXzgwMl8xMV9ETFMJcERMUzsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIJCQlpOworCisJaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZSZWFzb25Db2RlKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBNbG1lRGxzVGVhckRvd25BY3Rpb24oKSB3aXRoIFJlYXNvbkNvZGU9JWQgXG4iLCBSZWFzb25Db2RlKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1RlYXJEb3duSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQkmcERMUy0+TWFjQWRkciwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJlJlYXNvbkNvZGUsCisJCQkJCUVORF9PRl9BUkdTKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpID0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOworCVVTSE9SVAkJCVJlYXNvbkNvZGU7CisJVUlOVAkJCWk7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwlpZiAoIVBlZXJEbHNUZWFyRG93blNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZSZWFzb25Db2RlKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzVGVhckRvd25BY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggUmVhc29uQ29kZT0lZFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSwgUmVhc29uQ29kZSkpOworCisJLy8gY2xlYXIgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCS8vQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSVE1QQ2hlY2tETFNUaW1lT3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCQkJCWk7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOU1BFQ0lGWTsKKworCWlmICghIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoISBJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwkvLyBJZiB0aW1lb3V0IHZhbHVlIGlzIGVxdWFsZWQgdG8gemVybywgaXQgbWVhbnMgYWx3YXlzIG5vdCBiZSB0aW1lb3V0LgorCisJLy8gdXBkYXRlIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IDApKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciAtLTsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID09IDApCisJCQl7CisJCQkJcmVhc29uID0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQl9CisJCX0KKwl9CisKKwkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOworCisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKKwkJCXsKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4gVUxPTkcJCQlMZW4sCisJSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCkKK3sKKwlVTE9ORwkJCWk7CisJQk9PTEVBTgkJCWJGaW5kRW50cnkgPSBGQUxTRTsKKwlCT09MRUFOCQkJYlNUQUtleUZyYW1lID0gRkFMU0U7CisJUEVBUE9MX1BBQ0tFVAlwRWFwOworCVBVQ0hBUgkJCXBQcm90bywgcEFkZHIgPSBOVUxMOworCVBVQ0hBUgkJCXBTVEFLZXkgPSBOVUxMOworCVVDSEFSCQkJWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUgkJCU1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIJCQlkaWdlc3RbODBdOworCVVDSEFSCQkJRGxzUFRLWzgwXTsKKwlVQ0hBUgkJCXRlbXBbNjRdOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlDSVBIRVJfS0VZCQlQYWlyd2lzZUtleTsKKworCisJaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlpZiAoISBJTkZSQV9PTihwQWQpKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJaWYgKCEgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCWlmIChMZW4gPCBMRU5HVEhfODAyXzExICsgNiArIDIgKyAyKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJcFByb3RvCT0gKFBVQ0hBUilwSGVhZGVyICsgTEVOR1RIXzgwMl8xMSArIDIgKyA2OwkvLyBRT1MgQ29udHJvbCBmaWVsZCAsIDB4QUEgMHhBQSAweEFBIDB4MDAgMHgwMCAweDAwCisJcEFkZHIJPSBwSGVhZGVyLT5BZGRyMjsKKworCS8vIEwyUEFEIGJpdCBvbiB3aWxsIHBhZCAyIGJ5dGVzIGF0IExMQworCWlmIChwUnhELT5MMlBBRCkKKwl7CisJCXBQcm90byArPSAyOworCX0KKworCWlmIChSVE1QRXF1YWxNZW1vcnkoRUFQT0wsIHBQcm90bywgMikgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49ICBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJcEVhcCA9IChQRUFQT0xfUEFDS0VUKSAocFByb3RvICsgMik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiBMZW49JWxkLCBEYXRhTGVuPSVkLCBLZXlNaWM9JWQsIEluc3RhbGw9JWQsIEtleUFjaz0lZCwgU2VjdXJlPSVkLCBFS0RfREw9JWQsIEVycm9yPSVkLCBSZXF1ZXN0PSVkXG4iLCBMZW4sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyAxNiksCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleU1pYywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5QWNrLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5TZWN1cmUsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uRXJyb3IsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QpKTsKKworCQlpZiAoKExlbiA+PSAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSArIDE2KSkgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleU1pYworCQkJJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleUFjayAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uU2VjdXJlCisJCQkmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uRUtEX0RMICYmICFwRWFwLT5LZXlEZXNjLktleUluZm8uRXJyb3IgJiYgIXBFYXAtPktleURlc2MuS2V5SW5mby5SZXF1ZXN0KQorCQl7CisJCQkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlcgorCQkJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCQkJTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5KHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJCQkoUlRNUENvbXBhcmVNZW1vcnkocEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJCQkvL1JUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiByZXBsYXkgY291bnRlciAoJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4KSBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMF0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMV0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMl0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclszXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls0XSwJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls1XSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzZdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzddLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkvLyBwdXQgdGhlc2UgY29kZSBzZWdtZW50IHRvIGdldCB0aGUgcmVwbGF5IGNvdW50ZXIKKwkJCWlmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpCisJCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCQkJLy8gQ2hlY2sgTUlDIHZhbHVlCisJCQkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJCQkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJCQlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJCQlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7CisJCQlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJCQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBFYXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFYXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXsKKwkJCQkvLyBBRVMKKwkJCQlITUFDX1NIQTEoKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeShNaWMsCWRpZ2VzdCwJTEVOX0tFWV9ERVNDX01JQyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBFYXAsIHBFYXAtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwkJCX0KKworCQkJaWYgKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1JQyBEaWZmZXJlbnQgaW4gTXNnMSBvZiBTVEFLZXkgaGFuZHNoYWtlISBcbiIpKTsKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCQkJfQorCQkJZWxzZQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1JQyBWQUxJRCBpbiBNc2cxIG9mIFNUQUtleSBoYW5kc2hha2UhIFxuIikpOworI2lmIDEKKwkJCWlmICgocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzBdID09IDB4REQpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbMl0gPT0gMHgwMCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVszXSA9PSAweDBDKQorCQkJCSYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNF0gPT0gMHg0MykgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs1XSA9PSAweDAyKSkKKwkJCXsKKwkJCQlwQWRkcgkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgODsJCS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKQorCQkJCXBTVEFLZXkJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDE0OwkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMiksIFNUQUtleV9NYWNfQWRkcig2KQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCQlwQWRkclswXSwgcEFkZHJbMV0sIHBBZGRyWzJdLCBwQWRkclszXSwgcEFkZHJbNF0sIHBBZGRyWzVdLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkJYlNUQUtleUZyYW1lID0gVFJVRTsKKwkJCX0KKyNlbHNlCisJCQlpZiAoKHBFYXAtPktleURlc2MuS2V5RGF0YVswXSA9PSAweEREKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzJdID09IDB4MDApICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbM10gPT0gMHgwRikKKwkJCQkmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzRdID09IDB4QUMpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNV0gPT0gMHgwMikpCisJCQl7CisJCQkJcEFkZHIJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDg7CQkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMikKKwkJCQlwU1RBS2V5CQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyAxNDsJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpLCBTVEFLZXlfTWFjX0FkZHIoNikKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggTGVuPSVkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCQlwQWRkclswXSwgcEFkZHJbMV0sIHBBZGRyWzJdLCBwQWRkclszXSwgcEFkZHJbNF0sIHBBZGRyWzVdLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkJYlNUQUtleUZyYW1lID0gVFJVRTsKKwkJCX0KKyNlbmRpZgorCisJCX0KKwkJZWxzZSBpZiAoTGVuID49IChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFKSkKKwkJeworI2lmIDAKKwkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKyNlbmRpZgorCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgcmVwbGF5IGNvdW50ZXIgMiglMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngpIExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclswXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsxXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsyXSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzNdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzRdLAlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzVdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNl0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbN10sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJfQorCX0KKworCS8vIElmIHRpbWVvdXQgdmFsdWUgaXMgZXF1YWxlZCB0byB6ZXJvLCBpdCBtZWFucyBhbHdheXMgbm90IGJlIHRpbWVvdXQuCisJLy8gdXBkYXRlIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChwQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCWlmIChiU1RBS2V5RnJhbWUpCisJCQl7CisJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnk7CisKKwkJCQkvLyBTVEFLZXkgZnJhbWUsIGFkZCBwYWlyd2lzZSBrZXkgdGFibGUKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCQlQYWlyd2lzZUtleS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5LZXksICZwU1RBS2V5WzBdLCBMRU5fVEtJUF9FSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuVHhNaWMsICZwU1RBS2V5WzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5SeE1pYywgJnBTVEFLZXlbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGc7CisKKwkJCQlwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgVFJVRSk7CisJCQkJLy9Bc2ljQWRkS2V5RW50cnkocEFkLCAoVVNIT1JUKShpICsgMiksIEJTUzAsIDAsICZQYWlyd2lzZUtleSwgVFJVRSwgVFJVRSk7CS8vIHJlc2VydmUgMCBmb3IgbXVsdGljYXN0LCAxIGZvciB1bmljYXN0CisJCQkJLy9Bc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCAoVVNIT1JUKShpICsgMiksIHBBZGRyKTsKKwkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisjaWZkZWYgUlQyODYwCisgICAgICAgICAgICAJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkocEFkLAorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsCisJCQkJCQkJCQkJKFVDSEFSKXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwKKwkJCQkJCQkJCQkmUGFpcndpc2VLZXkpOworCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJCSAgMCwKKwkJCQkJCQkJCQkgIFBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCQkJCQkgIHBFbnRyeSk7CisKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleSwgJlBhaXJ3aXNlS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIChQZWVyIFNUQSBNQUMgQWRkcmVzcyBTVEFLZXkpIFxuIikpOworCisJCQkJUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gRmluaXNoIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlIChJbml0aWF0b3Igc2lkZSlcbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEYXRhIGZyYW1lLCB1cGRhdGUgdGltZW91dCB2YWx1ZQorCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQkJLy9Bc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCAoVVNIT1JUKShpICsgMiksIHBBZGRyKTsKKwkJCQl9CisJCQl9CisKKwkJCWJGaW5kRW50cnkgPSBUUlVFOworCQl9CisJfQorCisJLy8gdXBkYXRlIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChwQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCWlmIChiU1RBS2V5RnJhbWUpCisJCQl7CisJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJCQkJLy8gU1RBS2V5IGZyYW1lLCBhZGQgcGFpcndpc2Uga2V5IHRhYmxlLCBhbmQgc2VuZCBTVEFrZXkgTXNnLTIKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCQlQYWlyd2lzZUtleS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5LZXksICZwU1RBS2V5WzBdLCBMRU5fVEtJUF9FSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuVHhNaWMsICZwU1RBS2V5WzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5SeE1pYywgJnBTVEFLZXlbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGc7CisKKwkJCQlwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgVFJVRSk7CisJCQkJLy9Bc2ljQWRkS2V5RW50cnkocEFkLCAoVVNIT1JUKShpICsgMiksIEJTUzAsIDAsICZQYWlyd2lzZUtleSwgVFJVRSwgVFJVRSk7CS8vIHJlc2VydmUgMCBmb3IgbXVsdGljYXN0LCAxIGZvciB1bmljYXN0CisJCQkJLy9Bc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCAoVVNIT1JUKShpICsgMiksIHBBZGRyKTsKKwkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisjaWZkZWYgUlQyODYwCisgICAgICAgICAgICAJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkocEFkLAorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsCisJCQkJCQkJCQkJKFVDSEFSKXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwKKwkJCQkJCQkJCQkmUGFpcndpc2VLZXkpOworCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJCSAgMCwKKwkJCQkJCQkJCQkgIFBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCQkJCQkgIHBFbnRyeSk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXksICZQYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSAoSW5pdGlhdG9yIFNUQSBNQUMgQWRkcmVzcyBTVEFLZXkpXG4iKSk7CisKKwkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKKwkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKKwkJCQlpZiAoUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UocEFkLCBwQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQl7CisJCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOworCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIEZpbmlzaCBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZSAoUGVlciBzaWRlKVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEYXRhIGZyYW1lLCB1cGRhdGUgdGltZW91dCB2YWx1ZQorCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQl9CisJCQl9CisKKwkJCWJGaW5kRW50cnkgPSBUUlVFOworCQl9CisJfQorCisKKwlyZXR1cm4gYlNUQUtleUZyYW1lOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQorCisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIJdG8gYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlETFMgZW50cnkgaW5kZXgKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJUlRNUENoZWNrRExTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpCit7CisJSU5UIHJ2YWwgPSAtMTsKKwlJTlQJaTsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybiBydmFsOworCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCQlyZXR1cm4gcnZhbDsKKworCWRveworCQkvLyBjaGVjayBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJcnZhbCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBjaGVjayBwZWVyIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJcnZhbCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlIChGQUxTRSk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlIRUFERVJfODAyXzExCURsc1RlYXJEb3duSGRyOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVTSE9SVAkJCVJlYXNvbiA9IFJFQVNPTl9RT1NfUVNUQV9MRUFWSU5HX1FCU1M7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047CisJVUNIQVIJCQlpID0gMDsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBETFMgVGVhckRvd24gRnJhbWUgXG4iKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFTU09DIC0gUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzVGVhckRvd25IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzVGVhckRvd25IZHIsCisJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJNiwJCQkJCQkJcERBLAorCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkyLAkJCQkJCQkmUmVhc29uLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIE1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJLy8gUmVtb3ZlIGtleSBpbiBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIERMUyBUZWFyRG93biBGcmFtZSBhbmQgcmVtb3ZlIGtleSBpbiAoaT0lZCkgXG4iLCBpKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSkKK3sKKwlVQ0hBUgkJCQlIZWFkZXI4MDJfM1sxNF07CisJTkRJU19TVEFUVVMJCQlOU3RhdHVzOworCVVMT05HCQkJCUZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQJCVBhY2tldDsKKwlVQ0hBUgkJCQlNaWNbMTZdOworCVVDSEFSCQkJCWRpZ2VzdFs4MF07CisJUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBORElTX1BBQ0tFVAkJcE5kaXNQYWNrZXQ7CisJVUNIQVIJCQkJdGVtcFs2NF07CisJVUNIQVIJCQkJRGxzUFRLWzgwXTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBEQVswXSwgcERBWzFdLCBwREFbMl0sIHBEQVszXSwgcERBWzRdLCBwREFbNV0pKTsKKworCXBBZC0+U2VxdWVuY2UgKys7CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyID0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlICAgID0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgNiArIE1BQ19BRERSX0xFTjsJCS8vIGRhdGEgZmllbGQgY29udGFpbiBLREUgYW5kUGVlciBNQUMgYWRkcmVzcworCisJLy8gU1RBS2V5IE1lc3NhZ2UgaXMgYXMgRUFQT0wtS2V5KDEsMSwwLDAsRy8wLDAsMCwgTUlDLCAwLFBlZXIgTUFDIEtERSkKKwlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworICAgIH0KKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorCQkoKChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljCT0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZQk9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0CT0gMTsKKworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0JPSAxMjsKKworCS8vIHVzZSBvdXIgb3duIE9VSSB0byBkaXN0aW5ndWlzaCBwcm9wcmlldGFyeSB3aXRoIHN0YW5kYXJkLgorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0JCT0gMHhERDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdCQk9IDB4MEE7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsyXQkJPSAweDAwOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbM10JCT0gMHgwQzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzRdCQk9IDB4NDM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs1XQkJPSAweDAzOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzZdLCBwREEsIE1BQ19BRERSX0xFTik7CisKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBOU3RhdHVzOworCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gdXNlIHByb3ByaWV0YXJ5IFBUSworCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKKwlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7CisJV3BhQ291bnRQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKKworCS8vIGNhbGN1bGF0ZSBNSUMKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJTmRpc1plcm9NZW1vcnkoZGlnZXN0LAlzaXplb2YoZGlnZXN0KSk7CisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgRGxzUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJTmRpc1plcm9NZW1vcnkoTWljLAlzaXplb2YoTWljKSk7CisJCWhtYWNfbWQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhlYWRlcjgwMl8zKSwJSGVhZGVyODAyXzMsCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwJJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwlOU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwTmRpc1BhY2tldCwgTlVMTCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwTmRpc1BhY2tldCwgQlNTSURfV0NJRCk7CisJCVNUQVNlbmRQYWNrZXQocEFkLCBwTmRpc1BhY2tldCk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZW5kU1RBS2V5UmVxdWVzdC0gU2VuZCBTVEFLZXkgcmVxdWVzdCAoTlN0YXR1cz0leCwgRnJhbWVMZW49JWxkKVxuIiwgTlN0YXR1cywgRnJhbWVMZW4pKTsKKworCXJldHVybiBOU3RhdHVzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSkKK3sKKwlVQ0hBUgkJCQlIZWFkZXI4MDJfM1sxNF07CisJTkRJU19TVEFUVVMJCQlOU3RhdHVzOworCVVMT05HCQkJCUZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQJCVBhY2tldDsKKwlVQ0hBUgkJCQlNaWNbMTZdOworCVVDSEFSCQkJCWRpZ2VzdFs4MF07CisJUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBORElTX1BBQ0tFVAkJcE5kaXNQYWNrZXQ7CisJVUNIQVIJCQkJdGVtcFs2NF07CisJVUNIQVIJCQkJRGxzUFRLWzgwXTsJCQkvLyBEdWUgdG8gZGlydmVyIGNhbiBub3QgZ2V0IFBUSywgdXNlIHByb3ByaWV0YXJ5IFBUSworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgpIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBwREFbMF0sIHBEQVsxXSwgcERBWzJdLCBwREFbM10sIHBEQVs0XSwgcERBWzVdKSk7CisKKwlwQWQtPlNlcXVlbmNlICsrOworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1ZlciA9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZSAgICA9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIDYgKyBNQUNfQUREUl9MRU47CQkvLyBkYXRhIGZpZWxkIGNvbnRhaW4gS0RFIGFuZCBQZWVyIE1BQyBhZGRyZXNzCisKKwkvLyBTVEFLZXkgTWVzc2FnZSBpcyBhcyBFQVBPTC1LZXkoMSwxLDAsMCxHLzAsMCwwLCBNSUMsIDAsUGVlciBNQUMgS0RFKQorCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworICAgIH0KKyAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisgICAgfQorCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbgorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9CisJCSgoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOworCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMJPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlCT0gMTsKKworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0JPSAxMjsKKworCS8vIHVzZSBvdXIgb3duIE9VSSB0byBkaXN0aW5ndWlzaCBwcm9wcmlldGFyeSB3aXRoIHN0YW5kYXJkLgorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0JCT0gMHhERDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdCQk9IDB4MEE7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsyXQkJPSAweDAwOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbM10JCT0gMHgwQzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzRdCQk9IDB4NDM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs1XQkJPSAweDAzOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzZdLCBwREEsIE1BQ19BRERSX0xFTik7CisKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBOU3RhdHVzOworCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gdXNlIHByb3ByaWV0YXJ5IFBUSworCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKKwlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7CisJV3BhQ291bnRQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKKworCS8vIGNhbGN1bGF0ZSBNSUMKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJTmRpc1plcm9NZW1vcnkoZGlnZXN0LAlzaXplb2YoZGlnZXN0KSk7CisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgRGxzUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJTmRpc1plcm9NZW1vcnkoTWljLAlzaXplb2YoTWljKSk7CisJCWhtYWNfbWQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhlYWRlcjgwMl8zKSwJSGVhZGVyODAyXzMsCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwJJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwlOU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwTmRpc1BhY2tldCwgTlVMTCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwTmRpc1BhY2tldCwgQlNTSURfV0NJRCk7CisJCVNUQVNlbmRQYWNrZXQocEFkLCBwTmRpc1BhY2tldCk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlLSBTZW5kIFNUQUtleSBNZXNzYWdlLTIgKE5TdGF0dXM9JXgsIEZyYW1lTGVuPSVsZClcbiIsIE5TdGF0dXMsIEZyYW1lTGVuKSk7CisKKwlyZXR1cm4gTlN0YXR1czsKK30KKworVk9JRCBEbHNUaW1lb3V0QWN0aW9uKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlNTE1FX0RMU19SRVFfU1RSVUNUCQlNbG1lRGxzUmVxOworCVVTSE9SVAkJCQkJcmVhc29uOworCVBSVF84MDJfMTFfRExTCQkJcERMUyA9IChQUlRfODAyXzExX0RMUylGdW5jdGlvbkNvbnRleHQ7CisJUFJUTVBfQURBUFRFUgkJCXBBZCA9IHBETFMtPnBBZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRsc1RpbWVvdXQgLSBUZWFyIGRvd24gRExTIGxpbmtzICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCisJCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0pKTsKKworCWlmICgocERMUykgJiYgKHBETFMtPlZhbGlkKSkKKwl7CisJCXJlYXNvbgkJCT0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7CisJCXBETFMtPlZhbGlkCQk9IEZBTFNFOworCQlwRExTLT5TdGF0dXMJPSBETFNfTk9ORTsKKwkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgcERMUywgcmVhc29uKTsKKwkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEZXNjcmlwdGlvbiA6IGJlY2F1c2UgRExTIGFuZCBDTEkgc2hhcmUgdGhlIHNhbWUgV0NJRCB0YWJsZSBpbiBBU0lDLgorTWVzaCBlbnRyeSBhbHNvIGluc2VydCB0byBwQWQtPk1hY1RhYi5jb250ZW50W10uICBTdWNoIGlzIG1hcmtlZCBhcyBWYWxpZEFzRGxzID0gVFJVRS4KK0Fsc28gZmlsbHMgdGhlIHBhaXJ3aXNlIGtleS4KK0JlY2F1c2UgZnJvbnQgTUFYX0FJRF9CQSBlbnRyaWVzIGhhdmUgZGlyZWN0IG1hcHBpbmcgdG8gQkFFbnRyeSwgd2hpY2ggaXMgb25seSB1c2VkIGFzIENMSS4gU28gd2UgaW5zZXJ0IERscworZnJvbSBpbmRleCBNQVhfQUlEX0JBLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnREbHNFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCXBBZGRyLAorCUlOICBVSU5UCURsc0VudHJ5SWR4KQoreworCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnlcbiIpKTsKKwkvLyBpZiBGVUxMLCByZXR1cm4KKwlpZiAocEFkLT5NYWNUYWIuU2l6ZSA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkbworCXsKKwkJaWYoKHBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWRkciwgVFJVRSkpICE9IE5VTEwpCisJCQlicmVhazsKKworCQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5CisJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBwQWRkciwgRGxzRW50cnlJZHggKyBNSU5fTkVUX0RFVklDRV9GT1JfRExTLCBUUlVFKTsKKwkJaWYgKHBFbnRyeSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbRGxzRW50cnlJZHhdLk1hY1RhYk1hdGNoV0NJRCA9IHBFbnRyeS0+QWlkOworCQkJcEVudHJ5LT5NYXRjaERsc0VudHJ5SWR4ID0gRGxzRW50cnlJZHg7CisJCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVJbnNlcnREbHNFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLHBFbnRyeS0+QWlkLCBwQWQtPk1hY1RhYi5TaXplKSk7CisKKwkJCS8vIElmIGxlZ2FjeSBXRVAgaXMgdXNlZCwgc2V0IHBhaXItd2lzZSBjaXBoZXJBbGcgaW50byBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBmb3IgdGhpcyBlbnRyeQorCQkJaWYgKChwRW50cnktPlZhbGlkQXNEbHMpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpCisJCQl7CisJCQkJVUNIQVIgS2V5SWR4ID0gMDsKKwkJCQlVQ0hBUiBDaXBoZXJBbGcgPSAwOworCisJCQkJS2V5SWR4CT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCisJCQkJQ2lwaGVyQWxnIAk9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOworCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJCQkJCUJTUzAsCisJCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkJCQkJCXBFbnRyeSk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PSBNYWNUYWJsZUluc2VydERsc0VudHJ5XG4iKSk7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIGFsbCBNZXNoIEVudHJ5IGluIHBBZC0+TWFjVGFiCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCB3Y2lkLAorCUlOIFBVQ0hBUiBwQWRkcikKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5XG4iKSk7CisKKwlpZiAoIVZBTElEX1dDSUQod2NpZCkpCisJCXJldHVybiBGQUxTRTsKKworCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCB3Y2lkLCBwQWRkcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PSBNYWNUYWJsZURlbGV0ZURsc0VudHJ5XG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCkKK3sKKwlVTE9ORyBIYXNoSWR4OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCSYmIE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlpZihiUmVzZXRJZGVsQ291bnQpCisJCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwl9CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisJcmV0dXJuIHBFbnRyeTsKK30KKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCXdjaWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KQoreworCVVMT05HIERMc0luZGV4OworCVBNQUNfVEFCTEVfRU5UUlkgcEN1ckVudHJ5ID0gTlVMTDsKKwlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlpZiAoIVZBTElEX1dDSUQod2NpZCkpCisJCXJldHVybiBOVUxMOworCisJUlRNUF9TRU1fTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKworCWRvCisJeworCQlwQ3VyRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCQlETHNJbmRleCA9IDB4ZmY7CisJCWlmICgocEN1ckVudHJ5KSAmJiAocEN1ckVudHJ5LT5WYWxpZEFzRGxzPT0gVFJVRSkpCisJCXsKKwkJCURMc0luZGV4ID0gcEN1ckVudHJ5LT5NYXRjaERsc0VudHJ5SWR4OworCQl9CisKKwkJaWYgKERMc0luZGV4ID09IDB4ZmYpCisJCQlicmVhazsKKworCQlpZiAoTUFDX0FERFJfRVFVQUwocEN1ckVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKwkJCWlmKGJSZXNldElkZWxDb3VudCkKKwkJCQlwQ3VyRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnkgPSBwQ3VyRW50cnk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUoRkFMU0UpOworCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworSU5UIFNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpCit7CisJSU5UIGk7CisKKwlwcmludGsoIlxuJS0xOXMlLThzXG4iLCAiTUFDIiwgIlRJTUVPVVRcbiIpOworCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQl7CisJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRF07CisKKwkJCXByaW50aygiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggICIsCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclswXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclsxXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclsyXSwKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzNdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzRdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzVdKTsKKwkJCXByaW50aygiJS04ZFxuIiwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCk7CisKKwkJCXByaW50aygiXG4iKTsKKwkJCXByaW50aygiXG4lLTE5cyUtNHMlLTRzJS00cyUtNHMlLThzJS03cyUtN3MlLTdzJS0xMHMlLTZzJS02cyUtNnMlLTZzXG4iLAorCQkJCSAgICJNQUMiLCAiQUlEIiwgIkJTUyIsICJQU00iLCAiV01NIiwgIk1JTU9QUyIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOworCQkJcHJpbnRrKCIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJcHJpbnRrKCIlLTRkIiwgKGludClwRW50cnktPkFpZCk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+YXBpZHgpOworCQkJcHJpbnRrKCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKTsKKwkJCXByaW50aygiJS04ZCIsIChpbnQpcEVudHJ5LT5NbXBzTW9kZSk7CisJCQlwcmludGsoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTApOworCQkJcHJpbnRrKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKTsKKwkJCXByaW50aygiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQlwcmludGsoIiUtMTBzIiwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSk7CisJCQlwcmludGsoIiUtNnMiLCBHZXRCVyhwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVykpOworCQkJcHJpbnRrKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKTsKKwkJCXByaW50aygiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpOworCQkJcHJpbnRrKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyk7CisJCQlwcmludGsoIiUtMTBkLCAlZCwgJWQlJVxuIiwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCisJCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCk7CisJCQlwcmludGsoIlxuIik7CisKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0Rsc0FkZEVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSCW1hY1tNQUNfQUREUl9MRU5dOworCVVTSE9SVAlUaW1lb3V0OworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIFJUXzgwMl8xMV9ETFMJRGxzOworCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGltZW91dCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJVGltZW91dCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCSAgICBwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJWQiLCBtYWNbMF0sIG1hY1sxXSwKKwkgICAgICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgKGludClUaW1lb3V0KTsKKworCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCQlEbHMuVGltZU91dCA9IFRpbWVvdXQ7CisJCUNPUFlfTUFDX0FERFIoRGxzLk1hY0FkZHIsIG1hYyk7CisJCURscy5WYWxpZCA9IDE7CisKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJCSZEbHMpOworCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIJCQltYWNBZGRyW01BQ19BRERSX0xFTl07CisJQ0hBUgkJCSp2YWx1ZTsKKwlJTlQJCQkJaTsKKwlSVF84MDJfMTFfRExTCURsczsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisJZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisJCUF0b0godmFsdWUsICZtYWNBZGRyW2krK10sIDIpOworCX0KKworCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIG1hY0FkZHJbMF0sIG1hY0FkZHJbMV0sCisJICAgICAgICAgICBtYWNBZGRyWzJdLCBtYWNBZGRyWzNdLCBtYWNBZGRyWzRdLCBtYWNBZGRyWzVdKTsKKworCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjQWRkcik7CisJRGxzLlZhbGlkID0gMDsKKworCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCSZEbHMpOworCisJcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhZmYyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jCkBAIC0wLDAgKzEsMjYxNCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX2RhdGEuYworCisJQWJzdHJhY3Q6CisJRGF0YSBwYXRoIHN1YnJvdXRpbmVzCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCSAgICAgIEF1Zy8xNy8wNAkJbWFqb3IgbW9kaWZpY2F0aW9uIGZvciBSVDI1NjEvMjY2MQorCUphbiBMZWUJICAgICAgTWFyLzE3LzA2CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjg2MCBOZXcgUmluZyBEZXNpZ24KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworCitWT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlVQ0hBUgkJCSpwVG1wQnVmOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJeworCQkvLyBBbGwgRUFQb0wgZnJhbWVzIGhhdmUgdG8gcGFzcyB0byB1cHBlciBsYXllciAoZXguIFdQQV9TVVBQTElDQU5UIGRhZW1vbikKKwkJLy8gVEJEIDogcHJvY2VzcyBmcmFnbWVudGVkIEVBUG9sIGZyYW1lcworCQl7CisJCQkvLyBJbiA4MDIuMXggbW9kZSwgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1TVUNDRVNTIHBhY2tldCwgdHVybiBvbiB0aGUgUG9ydFNlY3VyZWQgdmFyaWFibGUKKwkJCWlmICggcEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUgJiYKKwkJCQkgKEVBUF9DT0RFX1NVQ0NFU1MgPT0gV3BhQ2hlY2tFYXBDb2RlKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgTEVOR1RIXzgwMl8xX0gpKSkKKwkJCXsKKwkJCQlQVUNIQVIJS2V5OworCQkJCVVDSEFSIAlDaXBoZXJBbGc7CisJCQkJaW50ICAgICBpZHggPSAwOworCisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQLVNVQ0NFU1MgUGFja2V0XG4iKSk7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQ7CisgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLkNpcGhlckFsZzsKKwkJCQkJS2V5ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5OworCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4gPiAwKQorICAgIAkJCQl7CisjaWZkZWYgUlQyODYwCisJCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCisJCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworCQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkJCS8vIEFzc2lnbiBncm91cCBrZXkgaW5mbworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQkJCS8vIEZvciBQcmV2ZW50aW5nIFNoYXJkS2V5IFRhYmxlIGlzIGNsZWFyZWQgYnkgcmVtb3ZlIGtleSBwcm9jZWR1cmUuCisgICAgCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXksCisJCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXksCisJCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4pOworICAgIAkJCQl9CisJCQkJfQorCQkJfQorCisJCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCS8vIFNwZWNpYWwgREFUQSBmcmFtZSB0aGF0IGhhcyB0byBwYXNzIHRvIE1MTUUKKwkJLy8JIDEuIENpc2NvIEFpcm9uZXQgZnJhbWVzIGZvciBDQ1gyLiBXZSBuZWVkIHBhc3MgaXQgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCisJCS8vCSAyLiBFQVBPTCBoYW5kc2hha2luZyBmcmFtZXMgd2hlbiBkcml2ZXIgc3VwcGxpY2FudCBlbmFibGVkLCBwYXNzIHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcworCQl7CisJCQlwVG1wQnVmID0gcFJ4QmxrLT5wRGF0YSAtIExFTkdUSF84MDJfMTE7CisJCQlOZGlzTW92ZU1lbW9yeShwVG1wQnVmLCBwUnhCbGstPnBIZWFkZXIsIExFTkdUSF84MDJfMTEpOworCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwVG1wQnVmLCBwUnhCbGstPkRhdGFTaXplICsgTEVOR1RIXzgwMl8xMSwgcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiISEhIHJlcG9ydCBFQVBPTC9BSVJPTkVUIERBVEEgdG8gTUxNRSAobGVuPSVkKSAhISFcbiIsIHBSeEJsay0+RGF0YVNpemUpKTsKKwkJfQorCX0KKworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJcmV0dXJuOworCit9CisKK1ZPSUQgU1RBUnhEYXRhRnJhbWVBbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisKKwkvLyBub24tRUFQIGZyYW1lCisJaWYgKCFSVE1QQ2hlY2tXUEFmcmFtZShwQWQsIHBFbnRyeSwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgRnJvbVdoaWNoQlNTSUQpKQorCXsKKwkJeworCQkJLy8gZHJvcCBhbGwgbm9uLUVBUCBEQVRBIGZyYW1lIGJlZm9yZQorCQkJLy8gdGhpcyBjbGllbnQncyBQb3J0LUFjY2Vzcy1Db250cm9sIGlzIHNlY3VyZWQKKwkJCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLldlcCkKKwkJCXsKKwkJCQkvLyB1bnN1cHBvcnRlZCBjaXBoZXIgc3VpdGUKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkJeworCQkJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIGVuY3J5cHRpb24gaW4tdXNlIGJ1dCByZWNlaXZlIGEgbm9uLUVBUE9MIGNsZWFyIHRleHQgZnJhbWUsIGRyb3AgaXQKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSAmJgorCQkJCQkocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJCQl7CisJCQkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJUlhfQkxLX0NMRUFSX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKTsKKwkJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FSQUxJTkspKQorCQl7CisJCQkvLyBOb3JtYWwgbGVnYWN5LCBBTVBEVSBvciBBTVNEVQorCQkJQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEFSQUxJTksKKwkJCUNtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJUlhfQkxLX0NMRUFSX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisJZWxzZQorCXsKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0VBUCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQorCQl7CisJCQlJbmRpY2F0ZV9BTVBEVV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCS8vIERldGVybWluIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lCisJCQkvLyAgdG8gV1BBIHN0YXRlIG1hY2hpbmUgb3IgdXBwZXIgbGF5ZXIKKwkJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfQorCX0KK30KKworCisvLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKK0JPT0xFQU4gU1RBQ2hlY2tUa2lwTUlDVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7CisJVUNIQVIJCQlVc2VyUHJpb3JpdHkgPSBwUnhCbGstPlVzZXJQcmlvcml0eTsKKwlQQ0lQSEVSX0tFWQkJcFdwYUtleTsKKwlVQ0hBUgkJCSpwREEsICpwU0E7CisKKwlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeEJsay0+cFJ4V0ktPktleUluZGV4XTsKKworCXBEQSA9IHBIZWFkZXItPkFkZHIxOworCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKSkKKwl7CisJCXBTQSA9IHBIZWFkZXItPkFkZHIzOworCX0KKwllbHNlCisJeworCQlwU0EgPSBwSGVhZGVyLT5BZGRyMjsKKwl9CisKKwlpZiAoUlRNUFRraXBDb21wYXJlTUlDVmFsdWUocEFkLAorCQkJCQkJCQlwRGF0YSwKKwkJCQkJCQkJcERBLAorCQkJCQkJCQlwU0EsCisJCQkJCQkJCXBXcGFLZXktPlJ4TWljLAorCQkJCQkJCQlVc2VyUHJpb3JpdHksCisJCQkJCQkJCURhdGFTaXplKSA9PSBGQUxTRSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvciAyXG4iKSk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJCXsKKwkJCVdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRSA6IEZBTFNFKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQl7CisJCQlSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKKwkJfQorCisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvLworLy8gQWxsIFJ4IHJvdXRpbmVzIHVzZSBSWF9CTEsgc3RydWN0dXJlIHRvIGhhbmRlIHJ4IGV2ZW50cworLy8gSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gYnVpbGQgcFJ4QmxrIGF0dHJpYnV0ZXMKKy8vICAxLiBwSGVhZGVyIHBvaW50ZXIgdG8gODAyLjExIEhlYWRlcgorLy8gIDIuIHBEYXRhIHBvaW50ZXIgdG8gcGF5bG9hZCBpbmNsdWRpbmcgTExDIChqdXN0IHNraXAgSGVhZGVyKQorLy8gIDMuIHNldCBwYXlsb2FkIHNpemUgaW5jbHVkaW5nIExMQyB0byBEYXRhU2l6ZQorLy8gIDQuIHNldCBzb21lIGZsYWdzIHdpdGggUlhfQkxLX1NFVF9GTEFHKCkKKy8vCitWT0lEIFNUQUhhbmRsZVJ4RGF0YUZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisJUFJUMjhYWF9SWERfU1RSVUMJCQkJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCVBSWFdJX1NUUlVDCQkJCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCVBIRUFERVJfODAyXzExCQkJCQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAkJCQkJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJQk9PTEVBTiAJCQkJCQliRnJhZ21lbnQgPSBGQUxTRTsKKwlNQUNfVEFCTEVfRU5UUlkJICAgIAkJCSpwRW50cnkgPSBOVUxMOworCVVDSEFSCQkJCQkJCUZyb21XaGljaEJTU0lEID0gQlNTMDsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJQcmlvcml0eSA9IDA7CisKKwl7CisJCS8vIGJlZm9yZSBMSU5LIFVQLCBhbGwgREFUQSBmcmFtZXMgYXJlIHJlamVjdGVkCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvL2lmICgocEhlYWRlci0+RkMuRnJEcyA9PSAwKSAmJiAocEhlYWRlci0+RkMuVG9EcyA9PSAwKSkKKwkJaWYgKFJUTVBSY3ZGcmFtZURMU0NoZWNrKHBBZCwgcEhlYWRlciwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgcFJ4RCkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vIERyb3Agbm90IG15IEJTUyBmcmFtZXMKKwkJaWYgKHBSeEQtPk15QnNzID09IDApCisJCXsKKwkJCXsKKwkJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwrKzsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKQorCQl7CisJCQlVQ0hBUiAqcERhdGE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImJBUFNEQ2FwYWJsZVxuIikpOworCisJCQkvLyBRb3MgYml0IDQKKwkJCXBEYXRhID0gKFBVQ0hBUilwSGVhZGVyICsgTEVOR1RIXzgwMl8xMTsKKwkJCWlmICgoKnBEYXRhID4+IDQpICYgMHgwMSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJ4RG9uZS0gUmN2IEVPU1AgZnJhbWUsIGRyaXZlciBtYXkgZmFsbCBpbnRvIHNsZWVwXG4iKSk7CisJCQkJcEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCA9IEZBTFNFOworCisJCQkJLy8gRm9yY2UgZHJpdmVyIHRvIGZhbGwgaW50byBzbGVlcCBtb2RlIHdoZW4gcmN2IEVPU1AgZnJhbWUKKwkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQkJeworCQkJCQlVU0hPUlQgIFRidHROdW1Ub05leHRXYWtlVXA7CisJCQkJCVVTSE9SVCAgTmV4dER0aW0gPSBwQWQtPlN0YUNmZy5EdGltUGVyaW9kOworCQkJCQlVTE9ORyAgIE5vdzsKKworCQkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJCQlOZXh0RHRpbSAtPSAoVVNIT1JUKShOb3cgLSBwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lKS9wQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisKKwkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKKwkJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBOZXh0RHRpbTsKKworCQkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOworCQkJCQkvLyBpZiBXTU0tQVBTRCBpcyBmYWlsZWQsIHRyeSB0byBkaXNhYmxlIGZvbGxvd2luZyBsaW5lCisJCQkJCUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKHBIZWFkZXItPkZDLk1vcmVEYXRhKSAmJiAocEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kaW5nIGFub3RoZXIgdHJpZ2dlciBmcmFtZSB3aGVuIE1vcmUgRGF0YSBiaXQgaXMgc2V0IHRvIDFcbiIpKTsKKwkJCX0KKwkJfQorCisJCS8vIERyb3AgTlVMTCwgQ0YtQUNLKG5vIGRhdGEpLCBDRi1QT0xMKG5vIGRhdGEpLCBhbmQgQ0YtQUNLK0NGLVBPTEwobm8gZGF0YSkgZGF0YSBmcmFtZQorCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA0KSkgLy8gYml0IDIgOiBubyBEQVRBCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJICAgIC8vIERyb3Agbm90IG15IEJTUyBmcmFtZSAod2UgY2FuIG5vdCBvbmx5IGNoZWNrIHRoZSBNeUJzcyBiaXQgaW4gUnhEKQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCSAgICBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCSAgICB7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisJCQkvLyBJbmZyYXN0cnVjdHVyZSBtb2RlLCBjaGVjayBhZGRyZXNzIDIgZm9yIEJTU0lECisJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjIsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCisJCQl7CisJCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKKwkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAorCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbHNlCS8vIEFkLUhvYyBtb2RlIG9yIE5vdCBhc3NvY2lhdGVkCisJCXsKKwkJCS8vIEFkLUhvYyBtb2RlLCBjaGVjayBhZGRyZXNzIDMgZm9yIEJTU0lECisJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjMsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCisJCQl7CisJCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKKwkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAorCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCSAgICB9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8KKwkJLy8gZmluZCBwRW50cnkKKwkJLy8KKwkJaWYgKHBSeFdJLT5XaXJlbGVzc0NsaUlEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIDEuIHJlbGVhc2UgcGFja2V0IGlmIGluZnJhIG1vZGUKKwkJCS8vIDIuIG5ldyBhIHBFbnRyeSBpZiBhZC1ob2MgbW9kZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBpbmZyYSBvciBhZC1ob2MKKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9JTkZSQSk7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAoKHBIZWFkZXItPkZDLkZyRHMgPT0gMCkgJiYgKHBIZWFkZXItPkZDLlRvRHMgPT0gMCkpCisJCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0RMUyk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQlBU1NFUlQocFJ4V0ktPldpcmVsZXNzQ2xpSUQgPT0gQlNTSURfV0NJRCk7CisJCX0KKworCQkvLyBjaGVjayBBdGhlcm9zIENsaWVudAorCQlpZiAoKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gRkFMU0UpICYmICAocFJ4RC0+QU1QRFUgPT0gMSkgJiYgKHBIZWFkZXItPkZDLlJldHJ5ICkpCisJCXsKKwkJCXBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPSBUUlVFOworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iQ3VycmVudEF0aGVyb3MgPSBUUlVFOworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPSBUUlVFOworCQkJaWYgKCFTVEFfQUVTX09OKHBBZCkpCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCA4LCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIEZBTFNFKTsKKwkJCX0KKwkJfQorCX0KKworCXBSeEJsay0+cERhdGEgPSAoVUNIQVIgKilwSGVhZGVyOworCisJLy8KKwkvLyB1cGRhdGUgUnhCbGstPnBEYXRhLCBEYXRhU2l6ZQorCS8vIDgwMi4xMSBIZWFkZXIsIFFPUywgSFRDLCBIdyBQYWRkaW5nCisJLy8KKworCS8vIDEuIHNraXAgODAyLjExIEhFQURFUgorCXsKKwkJcFJ4QmxrLT5wRGF0YSArPSBMRU5HVEhfODAyXzExOworCQlwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CisJfQorCisJLy8gMi4gUU9TCisJaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQorCXsKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1FPUyk7CisJCVVzZXJQcmlvcml0eSA9ICoocFJ4QmxrLT5wRGF0YSkgJiAweDBmOworCQkvLyBiaXQgNyBpbiBRb1MgQ29udHJvbCBmaWVsZCBzaWduYWxzIHRoZSBIVCBBLU1TRFUgZm9ybWF0CisJCWlmICgoKnBSeEJsay0+cERhdGEpICYgMHg4MCkKKwkJeworCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKKwkJfQorCisJCS8vIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKKwkJcFJ4QmxrLT5wRGF0YSArPSAyOworCQlwUnhCbGstPkRhdGFTaXplIC09MjsKKwl9CisJcFJ4QmxrLT5Vc2VyUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyAzLiBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKKwlpZiAocEhlYWRlci0+RkMuT3JkZXIpCisJeworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJaWYgKChwUnhXSS0+UEhZTU9ERSA8PSBNT0RFX09GRE0pICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQorCQl7CisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSyk7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9IVEMpOworCQkJLy8gc2tpcCBIVEMgY29udG9ybCBmaWVsZAorCQkJcFJ4QmxrLT5wRGF0YSArPSA0OworCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA0OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl9CisJfQorCisJLy8gNC4gc2tpcCBIVyBwYWRkaW5nCisJaWYgKHBSeEQtPkwyUEFEKQorCXsKKwkJLy8ganVzdCBtb3ZlIHBEYXRhIHBvaW50ZXIKKwkJLy8gYmVjYXVzZSBEYXRhU2l6ZSBleGNsdWRpbmcgSFcgcGFkZGluZworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfUEFEKTsKKwkJcFJ4QmxrLT5wRGF0YSArPSAyOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwUnhELT5CQSkKKwl7CisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkvLworCS8vIENhc2UgSSAgUHJvY2VzcyBCcm9hZGNhc3QgJiBNdWx0aWNhc3QgZGF0YSBmcmFtZQorCS8vCisJaWYgKHBSeEQtPkJjYXN0IHx8IHBSeEQtPk1jYXN0KQorCXsKKwkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQpOworCisJCS8vIERyb3AgTWNhc3QvQmNhc3QgZnJhbWUgd2l0aCBmcmFnbWVudCBiaXQgb24KKwkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBGaWx0ZXIgb3V0IEJjYXN0IGZyYW1lIHdoaWNoIEFQIHJlbGF5ZWQgZm9yIHVzCisJCWlmIChwSGVhZGVyLT5GQy5GckRzICYmIE1BQ19BRERSX0VRVUFMKHBIZWFkZXItPkFkZHIzLCBwQWQtPkN1cnJlbnRBZGRyZXNzKSkKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKHBSeEQtPlUyTSkKKwl7CisJCXBBZC0+TGFzdFJ4UmF0ZSA9IChVU0hPUlQpKChwUnhXSS0+TUNTKSArIChwUnhXSS0+QlcgPDw3KSArIChwUnhXSS0+U2hvcnRHSSA8PDgpKyAocFJ4V0ktPlBIWU1PREUgPDwxNCkpIDsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisgICAgICAgIGlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0RMUykpCisJCXsKKwkJCU1BQ19UQUJMRV9FTlRSWSAqcERsc0VudHJ5ID0gTlVMTDsKKworCQkJcERsc0VudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZChwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLT5BZGRyMiwgVFJVRSk7CisJCQkJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgaWYocERsc0VudHJ5KQorCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBEbHNFbnRyeS0+UnNzaVNhbXBsZSwgcFJ4V0kpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlci0+QWRkcjIpOworCQkJaWYgKHBFbnRyeSkKKwkJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEVudHJ5LT5Sc3NpU2FtcGxlLCBwUnhXSSk7CisJCX0KKworCisJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBwUnhXSSk7CisKKwkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKKwkJcEFkLT5TdGFDZmcuTGFzdFNOUjEgPSAoVUNIQVIpKHBSeFdJLT5TTlIxKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250Kys7CisKKworICAgIAlpZiAoISgocEhlYWRlci0+RnJhZyA9PSAwKSAmJiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gMCkpKQorICAgIAl7CisgICAgCQkvLyByZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzCisgICAgCQkvLyByZXR1cm4gY29tcGxldGUgZnJhbWUgKHBSeFBhY2tldCkgb3IgTlVMTAorICAgIAkJYkZyYWdtZW50ID0gVFJVRTsKKyAgICAJCXBSeFBhY2tldCA9IFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKHBBZCwgcFJ4QmxrKTsKKyAgICAJfQorCisgICAgCWlmIChwUnhQYWNrZXQpCisgICAgCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKKworICAgIAkJLy8gcHJvY2VzcyBjb21wbGV0ZSBmcmFtZQorICAgIAkJaWYgKGJGcmFnbWVudCAmJiAocFJ4RC0+RGVjcnlwdGVkKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkpCisgICAgCQl7CisJCQkJLy8gTWludXMgTUlDIGxlbmd0aAorCQkJCXBSeEJsay0+RGF0YVNpemUgLT0gODsKKworICAgIAkJCS8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQorICAgIAkJCWlmIChTVEFDaGVja1RraXBNSUNWYWx1ZShwQWQsIHBFbnRyeSwgcFJ4QmxrKSA9PSBGQUxTRSkKKyAgICAJCQl7CisgICAgCQkJCXJldHVybjsKKyAgICAJCQl9CisgICAgCQl9CisKKyAgICAJCVNUQVJ4RGF0YUZyYW1lQW5ub3VuY2UocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJcmV0dXJuOworICAgIAl9CisgICAgCWVsc2UKKyAgICAJeworICAgIAkJLy8ganVzdCByZXR1cm4KKyAgICAJCS8vIGJlY2F1c2UgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoKSB3aWxsIHJlbGVhc2UgcnggcGFja2V0LAorICAgIAkJLy8gaWYgcGFja2V0IGlzIGZyYWdtZW50ZWQKKyAgICAJCXJldHVybjsKKyAgICAJfQorCX0KKworCUFTU0VSVCgwKTsKKwkvLyByZWxlYXNlIHBhY2tldAorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworfQorCitWT0lEIFNUQUhhbmRsZVJ4TWdtdEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisJUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisKKwlkbworCXsKKworCQkvLyBXZSBzaG91bGQgY29sbGVjdCBSU1NJIG5vdCBvbmx5IFUyTSBkYXRhIGJ1dCBhbHNvIG15IGJlYWNvbgorCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pICYmIChNQUNfQUREUl9FUVVBTCgmcEFkLT5Db21tb25DZmcuQnNzaWQsICZwSGVhZGVyLT5BZGRyMikpKQorCQl7CisJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOworCisJCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9IChVQ0hBUikocFJ4V0ktPlNOUjApOworCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjEgPSAoVUNIQVIpKHBSeFdJLT5TTlIxKTsKKwkJfQorCisJCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQorCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJTVEFIYW5kbGVSeE1nbXRGcmFtZTogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWQgXG4iLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSk7CisJCQlicmVhazsKKwkJfQorCisJCVJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcEhlYWRlciwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwKKwkJCQkJCQkJCXBSeFdJLT5SU1NJMCwgcFJ4V0ktPlJTU0kxLCBwUnhXSS0+UlNTSTIsIHBSeEQtPlBsY3BTaWduYWwpOworCX0gd2hpbGUgKEZBTFNFKTsKKworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCitWT0lEIFNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCXN3aXRjaCAocEhlYWRlci0+RkMuU3ViVHlwZSkKKwl7CisJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJeworCQkJCUNudGxFbnF1ZXVlRm9yUmVjdihwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCksIChQRlJBTUVfQkFfUkVRKXBIZWFkZXIpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0s6CisJCWNhc2UgU1VCVFlQRV9BQ0s6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBSeERvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCVRoaXMgcm91dGluZSBoYXMgdG8gbWFpbnRhaW4gUnggcmluZyByZWFkIHBvaW50ZXIuCisJCU5lZWQgdG8gY29uc2lkZXIgUU9TIERBVEEgZm9ybWF0IHdoZW4gY29udmVydGluZyB0byA4MDIuMworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUJPT0xFQU4JCQlhcmdjKQoreworCU5ESVNfU1RBVFVTCQkJU3RhdHVzOworCVVJTlQzMgkJCVJ4UHJvY2Vzc2VkLCBSeFBlbmRpbmc7CisJQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7CisJUlQyOFhYX1JYRF9TVFJVQwkqcFJ4RDsKKwlVQ0hBUgkJCSpwRGF0YTsKKwlQUlhXSV9TVFJVQwkJcFJ4V0k7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldDsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyOworCVJYX0JMSwkJCVJ4Q2VsbDsKKworCVJ4UHJvY2Vzc2VkID0gUnhQZW5kaW5nID0gMDsKKworCS8vIHByb2Nlc3Mgd2hvbGUgcnggcmluZworCXdoaWxlICgxKQorCXsKKworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpIHx8CisJCQkhUlRNUF9URVNUX0ZMQUcocEFkLGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorCQl7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgUlQyODYwCisJCWlmIChSeFByb2Nlc3NlZCsrID4gTUFYX1JYX1BST0NFU1NfQ05UKQorCQl7CisJCQkvLyBuZWVkIHRvIHJlc2NoZWR1bGUgcnggaGFuZGxlCisJCQliUmVzY2hlZHVsZSA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCVJ4UHJvY2Vzc2VkICsrOyAvLyB0ZXN0CisKKwkJLy8gMS4gYWxsb2NhdGUgYSBuZXcgZGF0YSBwYWNrZXQgaW50byByeCByaW5nIHRvIHJlcGxhY2UgcmVjZWl2ZWQgcGFja2V0CisJCS8vICAgIHRoZW4gcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgcGFja2V0CisJCS8vIDIuIHRoZSBjYWxsZWUgbXVzdCB0YWtlIGNoYXJnZSBvZiByZWxlYXNlIG9mIHBhY2tldAorCQkvLyAzLiBBcyBmYXIgYXMgZHJpdmVyIGlzIGNvbmNlcm5lZCAsCisJCS8vICAgIHRoZSByeCBwYWNrZXQgbXVzdAorCQkvLyAgICAgIGEuIGJlIGluZGljYXRlZCB0byB1cHBlciBsYXllciBvcgorCQkvLyAgICAgIGIuIGJlIHJlbGVhc2VkIGlmIGl0IGlzIGRpc2NhcmRlZAorCQlwUnhQYWNrZXQgPSBHZXRQYWNrZXRGcm9tUnhSaW5nKHBBZCwgJihSeENlbGwuUnhEKSwgJmJSZXNjaGVkdWxlLCAmUnhQZW5kaW5nKTsKKwkJaWYgKHBSeFBhY2tldCA9PSBOVUxMKQorCQl7CisJCQkvLyBubyBtb3JlIHBhY2tldCB0byBwcm9jZXNzCisJCQlicmVhazsKKwkJfQorCisJCS8vIGdldCByeCByaW5nIGRlc2NyaXB0b3IKKwkJcFJ4RCA9ICYoUnhDZWxsLlJ4RCk7CisJCS8vIGdldCByeCBkYXRhIGJ1ZmZlcgorCQlwRGF0YQk9IEdFVF9PU19QS1RfREFUQVBUUihwUnhQYWNrZXQpOworCQlwUnhXSQk9IChQUlhXSV9TVFJVQykgcERhdGE7CisJCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIChwRGF0YStSWFdJX1NJWkUpIDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyLCBESVJfUkVBRCwgVFJVRSk7CisJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSeFdJLCBUWVBFX1JYV0kpOworI2VuZGlmCisKKwkJLy8gYnVpbGQgUnhDZWxsCisJCVJ4Q2VsbC5wUnhXSSA9IHBSeFdJOworCQlSeENlbGwucEhlYWRlciA9IHBIZWFkZXI7CisJCVJ4Q2VsbC5wUnhQYWNrZXQgPSBwUnhQYWNrZXQ7CisJCVJ4Q2VsbC5wRGF0YSA9IChVQ0hBUiAqKSBwSGVhZGVyOworCQlSeENlbGwuRGF0YVNpemUgPSBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlSeENlbGwuRmxhZ3MgPSAwOworCisJCS8vIEluY3JlYXNlIFRvdGFsIHJlY2VpdmUgYnl0ZSBjb3VudGVyIGFmdGVyIHJlYWwgZGF0YSByZWNlaXZlZCBubyBtYXRlciBhbnkgZXJyb3Igb3Igbm90CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQgKz0gIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCArKzsKKworCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudCk7CisKKwkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPCAxNCkKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKyAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJeworICAgICAgICAgICAgc2VuZF9tb25pdG9yX3BhY2tldHMocEFkLCAmUnhDZWxsKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIFJUMjg3MCBpbnZva2VzIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgpIGluIHJ0dXNiX2J1bGsuYyAqLworI2lmZGVmIFJBTElOS19BVEUKKwkJaWYgKEFURV9PTihwQWQpKQorCQl7CisJCQlwQWQtPmF0ZS5SeENudFBlclNlYysrOworCQkJQVRFU2FtcGxlUnNzaShwQWQsIHBSeFdJKTsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkJaWYgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkKKwkJCXsKKwkJCQkvKiAoKnBSeEQpIGhhcyBiZWVuIHN3YXBwZWQgaW4gR2V0UGFja2V0RnJvbVJ4UmluZygpICovCisJCQkJQVRFX1FBX1N0YXRpc3RpY3MocEFkLCBwUnhXSSwgcFJ4RCwJcEhlYWRlcik7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkJLy8gQ2hlY2sgZm9yIGFsbCBSeEQgZXJyb3JzCisJCVN0YXR1cyA9IFJUTVBDaGVja1J4RXJyb3IocEFkLCBwSGVhZGVyLCBwUnhXSSwgcFJ4RCk7CisKKwkJLy8gSGFuZGxlIHRoZSByZWNlaXZlZCBmcmFtZQorCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCXN3aXRjaCAocEhlYWRlci0+RkMuVHlwZSkKKwkJCXsKKwkJCQkvLyBDQVNFIEksIHJlY2VpdmUgYSBEQVRBIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9EQVRBOgorCQkJCXsKKwkJCQkJLy8gcHJvY2VzcyBEQVRBIGZyYW1lCisJCQkJCVNUQUhhbmRsZVJ4RGF0YUZyYW1lKHBBZCwgJlJ4Q2VsbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCS8vIENBU0UgSUksIHJlY2VpdmUgYSBNR01UIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9NR01UOgorCQkJCXsKKwkJCQkJU1RBSGFuZGxlUnhNZ210RnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gQ0FTRSBJSUkuIHJlY2VpdmUgYSBDTlRMIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9DTlRMOgorCQkJCXsKKwkJCQkJU1RBSGFuZGxlUnhDb250cm9sRnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gZGlzY2FyZCBvdGhlciB0eXBlCisJCQkJZGVmYXVsdDoKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnMrKzsKKwkJCS8vIGRpc2NhcmQgdGhpcyBmcmFtZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCX0KKwl9CisKKwlyZXR1cm4gYlJlc2NoZWR1bGU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRkFMU0UpOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEVhcmx5IGNoZWNraW5nIGFuZCBPUy1kZXBlbmVkIHBhcnNpbmcgZm9yIFR4IHBhY2tldCBzZW5kIHRvIG91ciBTVEEgZHJpdmVyLgorCitBcmd1bWVudHM6CisgICAgTkRJU19IQU5ETEUgCU1pbmlwb3J0QWRhcHRlckNvbnRleHQJUG9pbnRlciByZWZlciB0byB0aGUgZGV2aWNlIGhhbmRsZSwgaS5lLiwgdGhlIHBBZC4KKwlQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXkJCQlUaGUgcGFja2V0IGFycmF5IG5lZWQgdG8gZG8gdHJhbnNtaXNzaW9uLgorCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMJCQlOdW1iZXIgb2YgcGFja2V0IGluIHBhY2tldCBhcnJheS4KKworUmV0dXJuIFZhbHVlOgorCU5PTkUKKworTm90ZToKKwlUaGlzIGZ1bmN0aW9uIGRvIGVhcmx5IGNoZWNraW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3Igc2VuZC1vdXQgcGFja2V0LgorCVlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU1RBU2VuZFBhY2tldHMoCisJSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAorCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpCit7CisJVUlOVAkJCUluZGV4OworCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpIE1pbmlwb3J0QWRhcHRlckNvbnRleHQ7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQk9PTEVBTgkJCWFsbG93VG9TZW5kID0gRkFMU0U7CisKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE51bWJlck9mUGFja2V0czsgSW5kZXgrKykKKwl7CisJCXBQYWNrZXQgPSBwcFBhY2tldEFycmF5W0luZGV4XTsKKworCQlkbworCQl7CisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQkJeworCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIGhhcmR3YXJlIGlzIGluIHJlc2V0IHN0YXRlCisJCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoIUlORlJBX09OKHBBZCkgJiYgIUFESE9DX09OKHBBZCkpCisJCQl7CisJCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgdGhlcmUgYXJlIG5vIHBoeXNpY2FsIGNvbm5lY3Rpb24geWV0CisJCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFJlY29yZCB0aGF0IG9yaWduYWwgcGFja2V0IHNvdXJjZSBpcyBmcm9tIE5ESVMgbGF5ZXIsc28gdGhhdAorCQkJCS8vIGxhdGVyIG9uIGRyaXZlciBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGlzIE5ESVMgUEFDS0VUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJUFVDSEFSIHBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKKwkJCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkpCisJCQkJeworCQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBwRW50cnktPkFpZCk7CisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAwKTsgLy8gdGhpcyBmaWVsZCBpcyB1c2VsZXNzIHdoZW4gaW4gU1RBIG1vZGUKKwkJCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKKwkJCQlORElTX1NFVF9QQUNLRVRfU1RBVFVTKHBQYWNrZXQsIE5ESVNfU1RBVFVTX1BFTkRJTkcpOworCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCsrOworCisJCQkJYWxsb3dUb1NlbmQgPSBUUlVFOworCQkJfQorCQl9IHdoaWxlKEZBTFNFKTsKKworCQlpZiAoYWxsb3dUb1NlbmQgPT0gVFJVRSkKKwkJCVNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKKwkJZWxzZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKKwlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKwlUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBkbyBwYWNrZXQgcGFyc2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIFR4IHBhY2tldAorCXRvIFNUQSBkZXZpY2UsIGFuZCBpdCB3aWxsIGVuLXF1ZXVlIHBhY2tldHMgdG8gb3VyIFR4U3dRdWV1ZSBkZXBlbmRzIG9uIEFDCisJY2xhc3MuCisKK0FyZ3VtZW50czoKKwlwQWQgICAgCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJcFBhY2tldCAJUG9pbnRlciB0byBzZW5kIHBhY2tldAorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUwkJCUlmIHN1Y2NlcyB0byBxdWV1ZSB0aGUgcGFja2V0IGludG8gVHhTd1F1ZXVlLgorCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCQlJZiBmYWlsZWQgdG8gZG8gZW4tcXVldWUuCisKK05vdGU6CisJWW91IG9ubHkgY2FuIHB1dCBPUy1pbmRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBTVEFTZW5kUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVVJTlQJCQlBbGxvd0ZyYWdTaXplOworCVVDSEFSCQkJTnVtYmVyT2ZGcmFnOworCVVDSEFSCQkJUXVlSWR4LCBVc2VyUHJpb3JpdHk7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGludCAJSXJxRmxhZ3M7CisJVUNIQVIJCQlGbGdJc0lQID0gMDsKKwlVQ0hBUgkJCVJhdGU7CisKKwkvLyBQcmVwYXJlIHBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIGJ1ZmZlciBkZXNjcmlwdG9yCisJLy8gY2hhaW5lZCB3aXRoaW4gYSBzaW5nbGUgTkRJUyBwYWNrZXQuCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0IC0tPiBwU3JjQnVmVkEgPT0gTlVMTCAhISFTcmNCdWZMZW49JXhcbiIsU3JjQnVmTGVuKSk7CisJCS8vIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcworCQkvLyByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllcgorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCisJaWYgKFNyY0J1ZkxlbiA8IDE0KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0IC0tPiBOZGlzIFBhY2tldCBidWZmZXIgZXJyb3IgISEhXG4iKSk7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwkvLyBJbiBIVCByYXRlIGFkaG9jIG1vZGUsIEEtTVBEVSBpcyBvZnRlbiB1c2VkLiBTbyBuZWVkIHRvIGxvb2t1cCBCQSBUYWJsZSBhbmQgTUFDIEVudHJ5LgorCS8vIE5vdGUgbXVsdGljYXN0IHBhY2tldHMgaW4gYWRob2MgYWxzbyB1c2UgQlNTSURfV0NJRCBpbmRleC4KKwl7CisJCWlmKElORlJBX09OKHBBZCkpCisJCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCVVTSE9SVAl0bXBXY2lkOworCisJCQl0bXBXY2lkID0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7CisJCQlpZiAoVkFMSURfV0NJRCh0bXBXY2lkKSAmJgorCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdLlZhbGlkQXNEbHM9PSBUUlVFKSkKKwkJCXsKKwkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt0bXBXY2lkXTsKKwkJCQlSYXRlID0gcEFkLT5NYWNUYWIuQ29udGVudFt0bXBXY2lkXS5DdXJyVHhSYXRlOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJCVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CisJCX0KKwkJfQorCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpCisJCQl7CisJCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgTUNBU1RfV0NJRCk7CisJCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwU3JjQnVmVkEpOworCQkJfQorCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJfQorCX0KKworCWlmICghcEVudHJ5KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0LT5DYW5ub3QgZmluZCBwRW50cnkoJTJ4OiUyeDolMng6JTJ4OiUyeDolMngpIGluIE1hY1RhYiFcbiIsIFBSSU5UX01BQyhwU3JjQnVmVkEpKSk7CisJCS8vIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcworCQkvLyByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllcgorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCWlmIChBREhPQ19PTihwQWQpCisJCSkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIChVQ0hBUilwRW50cnktPkFpZCk7CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGUgRXRoZXJuZXQgRnJhbWUgdHlwZSBvZiB0aGlzIHBhY2tldCwgYW5kIHNldCB0aGUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDIGZsYWdzLgorCS8vCQlIZXJlIHdlIHNldCB0aGUgUEFDS0VUX1NQRUNJRklDIGZsYWdzKExMQywgVkxBTiwgREhDUC9BUlAsIEVBUE9MKS4KKwlSVE1QQ2hlY2tFdGhlclR5cGUocEFkLCBwUGFja2V0KTsKKworCisKKwkvLworCS8vIFdQQSA4MDIuMXggc2VjdXJlZCBwb3J0IGNvbnRyb2wgLSBkcm9wIGFsbCBub24tODAyLjF4IGZyYW1lIGJlZm9yZSBwb3J0IHNlY3VyZWQKKwkvLworCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkgIHx8IChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkgICkKKwkJICAmJiAoKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkgfHwgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA+PSAyKSkKKwkJICAmJiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpPT0gRkFMU0UpCisJCSAgKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFTZW5kUGFja2V0IC0tPiBEcm9wIHBhY2tldCBiZWZvcmUgcG9ydCBzZWN1cmVkICEhIVxuIikpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKworCS8vIFNURVAgMS4gRGVjaWRlIG51bWJlciBvZiBmcmFnbWVudHMgcmVxdWlyZWQgdG8gZGVsaXZlciB0aGlzIE1TRFUuCisJLy8JICAgVGhlIGVzdGltYXRpb24gaGVyZSBpcyBub3QgdmVyeSBhY2N1cmF0ZSBiZWNhdXNlIGRpZmZpY3VsdCB0bworCS8vCSAgIHRha2UgZW5jcnlwdGlvbiBvdmVyaGVhZCBpbnRvIGNvbnNpZGVyYXRpb24gaGVyZS4gVGhlIHJlc3VsdAorCS8vCSAgICJOdW1iZXJPZkZyYWciIGlzIHRoZW4ganVzdCB1c2VkIHRvIHByZS1jaGVjayBpZiBlbm91Z2ggZnJlZQorCS8vCSAgIFRYRCBhcmUgYXZhaWxhYmxlIHRvIGhvbGQgdGhpcyBNU0RVLgorCisKKwlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpCS8vIGZyYWdtZW50YXRpb24gbm90IGFsbG93ZWQgb24gbXVsdGljYXN0ICYgYnJvYWRjYXN0CisJCU51bWJlck9mRnJhZyA9IDE7CisJZWxzZSBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKQorCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKwllbHNlIGlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUTUlYKSB8fCAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpKQorCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBNSU1PIFJBVEUgb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJZWxzZQorCXsKKwkJLy8gVGhlIGNhbGN1bGF0ZWQgIk51bWJlck9mRnJhZyIgaXMgYSByb3VnaCBlc3RpbWF0aW9uIGJlY2F1c2Ugb2YgdmFyaW91cworCQkvLyBlbmNyeXB0aW9uL2VuY2Fwc3VsYXRpb24gb3ZlcmhlYWQgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhpcyBudW1iZXIgaXMganVzdAorCQkvLyB1c2VkIHRvIG1ha2Ugc3VyZSBlbm91Z2ggZnJlZSBUWEQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgZnJhZ21lbnRhdGlvbiB0YWtlcyBwbGFjZS4KKwkJLy8gSW4gY2FzZSB0aGUgYWN0dWFsIHJlcXVpcmVkIG51bWJlciBvZiBmcmFnbWVudHMgb2YgYW4gTkRJUyBwYWNrZXQKKwkJLy8gZXhjY2VlZHMgIk51bWJlck9mRnJhZyJjYWN1bGF0ZWQgaGVyZSBhbmQgbm90IGVub3VnaCBmcmVlIFRYRCBhdmFpbGFibGUsIHRoZQorCQkvLyBsYXN0IGZyYWdtZW50IChpLmUuIGxhc3QgTVBEVSkgd2lsbCBiZSBkcm9wcGVkIGluIFJUTVBIYXJkVHJhbnNtaXQoKSBkdWUgdG8gb3V0IG9mCisJCS8vIHJlc291cmNlLCBhbmQgdGhlIE5ESVMgcGFja2V0IHdpbGwgYmUgaW5kaWNhdGVkIE5ESVNfU1RBVFVTX0ZBSUxVUkUuIFRoaXMgc2hvdWxkCisJCS8vIHJhcmVseSBoYXBwZW4gYW5kIHRoZSBwZW5hbHR5IGlzIGp1c3QgbGlrZSBhIFRYIFJFVFJZIGZhaWwuIEFmZm9yZGFibGUuCisKKwkJQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKKwkJTnVtYmVyT2ZGcmFnID0gKChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgTEVOR1RIXzgwMl8xX0gpIC8gQWxsb3dGcmFnU2l6ZSkgKyAxOworCQkvLyBUbyBnZXQgYWNjdXJhdGUgbnVtYmVyIG9mIGZyYWdtZW50YXRpb24sIE1pbnVzIDEgaWYgdGhlIHNpemUganVzdCBtYXRjaCB0byBhbGxvd2FibGUgZnJhZ21lbnQgc2l6ZQorCQlpZiAoKChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgTEVOR1RIXzgwMl8xX0gpICUgQWxsb3dGcmFnU2l6ZSkgPT0gMCkKKwkJeworCQkJTnVtYmVyT2ZGcmFnLS07CisJCX0KKwl9CisKKwkvLyBTYXZlIGZyYWdtZW50IG51bWJlciB0byBOZGlzIHBhY2tldCByZXNlcnZlZCBmaWVsZAorCVJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCwgTnVtYmVyT2ZGcmFnKTsKKworCisJLy8gU1RFUCAyLiBDaGVjayB0aGUgcmVxdWlyZW1lbnQgb2YgUlRTOgorCS8vCSAgIElmIG11bHRpcGxlIGZyYWdtZW50IHJlcXVpcmVkLCBSVFMgaXMgcmVxdWlyZWQgb25seSBmb3IgdGhlIGZpcnN0IGZyYWdtZW50CisJLy8JICAgaWYgdGhlIGZyYWdtZW50IHNpemUgbGFyZ2UgdGhhbiBSVFMgdGhyZXNob2xkCisJLy8gICAgIEZvciBSVDI4eHgsIExldCBBU0lDIHNlbmQgUlRTL0NUUworCVJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgMCk7CisJUlRNUF9TRVRfUEFDS0VUX1RYUkFURShwUGFja2V0LCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUpOworCisJLy8KKwkvLyBTVEVQIDMuIFRyYWZmaWMgY2xhc3NpZmljYXRpb24uIG91dGNvbWUgPSA8VXNlclByaW9yaXR5LCBRdWVJZHg+CisJLy8KKwlVc2VyUHJpb3JpdHkgPSAwOworCVF1ZUlkeAkJID0gUUlEX0FDX0JFOworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKQorCXsKKwkJVVNIT1JUIFByb3RvY29sOworCQlVQ0hBUiAgTGxjU25hcExlbiA9IDAsIEJ5dGUwLCBCeXRlMTsKKwkJZG8KKwkJeworCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkCisJCQlQcm90b2NvbCA9IChVU0hPUlQpKChwU3JjQnVmVkFbMTJdIDw8IDgpICsgcFNyY0J1ZlZBWzEzXSk7CisJCQlpZiAoUHJvdG9jb2wgPD0gMTUwMCkKKwkJCXsKKwkJCQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQgZnJvbSBMTEMvU05BUAorCQkJCWlmIChTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyA2LCAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJYnJlYWs7CisKKwkJCQlQcm90b2NvbCA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKwkJCQlMbGNTbmFwTGVuID0gODsKKwkJCX0KKworCQkJLy8gYWx3YXlzIEFDX0JFIGZvciBub24tSVAgcGFja2V0CisJCQlpZiAoUHJvdG9jb2wgIT0gMHgwODAwKQorCQkJCWJyZWFrOworCisJCQkvLyBnZXQgSVAgaGVhZGVyCisJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgTGxjU25hcExlbiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJYnJlYWs7CisKKwkJCS8vIHJldHVybiBBQ19CRSBpZiBwYWNrZXQgaXMgbm90IElQdjQKKwkJCWlmICgoQnl0ZTAgJiAweGYwKSAhPSAweDQwKQorCQkJCWJyZWFrOworCisJCQlGbGdJc0lQID0gMTsKKwkJCVVzZXJQcmlvcml0eSA9IChCeXRlMSAmIDB4ZTApID4+IDU7CisJCQlRdWVJZHggPSBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5W1VzZXJQcmlvcml0eV07CisKKwkJCS8vIFRPRE86IGhhdmUgdG8gY2hlY2sgQUNNIGJpdC4gYXBwbHkgVFNQRUMgaWYgQUNNIGlzIE9OCisJCQkvLyBUT0RPOiBkb3duZ3JhZGUgVVAgJiBRdWVJZHggYmVmb3JlIHBhc3NpbmcgQUNNCisJCQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQUNNW1F1ZUlkeF0pCisJCQl7CisJCQkJVXNlclByaW9yaXR5ID0gMDsKKwkJCQlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKKwkJCX0KKwkJfSB3aGlsZSAoRkFMU0UpOworCX0KKworCVJUTVBfU0VUX1BBQ0tFVF9VUChwUGFja2V0LCBVc2VyUHJpb3JpdHkpOworCisKKworCS8vIE1ha2Ugc3VyZSBTZW5kVHhXYWl0IHF1ZXVlIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcworCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwlpZiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPj0gTUFYX1BBQ0tFVFNfSU5fUVVFVUUpCisJeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwkJU3RvcE5ldElmUXVldWUocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCWVsc2UKKwl7CisJCUluc2VydFRhaWxRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKwl9CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gVFJVRSkmJgorICAgICAgICAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkpCisJeworCQlpZiAoKChwRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8VXNlclByaW9yaXR5KSkgPT0gMCkgJiYKKyAgICAgICAgICAgICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VXNlclByaW9yaXR5KSkgPT0gMCkgJiYKKyAgICAgICAgICAgIChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorCQkJIC8vIEZvciBJT1QgY29tcGF0aWJpbGl0eSwgaWYKKwkJCSAvLyAxLiBJdCBpcyBSYWxpbmsgY2hpcCBvcgorCQkJIC8vIDIuIEl0IGlzIE9QRU4gb3IgQUVTIG1vZGUsCisJCQkgLy8gdGhlbiBCQSBzZXNzaW9uIGNhbiBiZSBidWxpdC4KKwkJCSAmJiAoKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiBwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApIHx8CisJCQkgCSAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkIHx8IHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQkJKQorCQl7CisJCQlCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgMCwgMCwgMTAsIEZBTFNFKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1F1ZUlkeF0rKzsgLy8gVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVGhpcyBzdWJyb3V0aW5lIHdpbGwgc2NhbiB0aHJvdWdoIHJlbGVhdGl2ZSByaW5nIGRlc2NyaXB0b3IgdG8gZmluZAorCQlvdXQgYXZhbGlhYmxlIGZyZWUgcmluZyBkZXNjcmlwdG9yIGFuZCBjb21wYXJlIHdpdGggcmVxdWVzdCBzaXplLgorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlRdWVJZHgJCVNlbGVjdGVkIFRYIFJpbmcKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAJTm90IGVub3VnaCBmcmVlIGRlc2NyaXB0b3IKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAJRW5vdWdoIGZyZWUgZGVzY3JpcHRvcgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgUlQyODYwCitORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUgkJCVF1ZUlkeCwKKwlJTgkJVUNIQVIJCQlOdW1iZXJSZXF1aXJlZCwKKwlJTgkJUFVDSEFSCQkJRnJlZU51bWJlcklzKQoreworCVVMT05HCQlGcmVlTnVtYmVyID0gMDsKKwlORElTX1NUQVRVUyAJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKworCXN3aXRjaCAoUXVlSWR4KQorCXsKKwkJY2FzZSBRSURfQUNfQks6CisJCWNhc2UgUUlEX0FDX0JFOgorCQljYXNlIFFJRF9BQ19WSToKKwkJY2FzZSBRSURfQUNfVk86CisJCWNhc2UgUUlEX0hDQ0E6CisJCQlpZiAocEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCA+IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgpCisJCQkJRnJlZU51bWJlciA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggLSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4IC0gMTsKKwkJCWVsc2UKKwkJCQlGcmVlTnVtYmVyID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCArIFRYX1JJTkdfU0laRSAtIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOworCisJCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfTUdNVDoKKwkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID4gcEFkLT5NZ210UmluZy5UeENwdUlkeCkKKwkJCQlGcmVlTnVtYmVyID0gcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxOworCQkJZWxzZQorCQkJCUZyZWVOdW1iZXIgPSBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMTsKKworCQkJaWYgKEZyZWVOdW1iZXIgPj0gTnVtYmVyUmVxdWlyZWQpCisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJUTVBGcmVlVFhEUmVxdWVzdDo6SW52YWxpZCBRdWVJZHgoPSVkKVxuIiwgUXVlSWR4KSk7CisJCQlicmVhazsKKwl9CisJKkZyZWVOdW1iZXJJcyA9IChVQ0hBUilGcmVlTnVtYmVyOworCisJcmV0dXJuIChTdGF0dXMpOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7Cit9CisKK1ZPSUQJUlRNUFNlbmROdWxsRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JQk9PTEVBTiAJCWJRb3NOdWxsKQoreworCVVDSEFSCU51bGxGcmFtZVs0OF07CisJVUxPTkcJTGVuZ3RoOworCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOworCisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYoQVRFX09OKHBBZCkpCisJeworCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworICAgIC8vIFdQQSA4MDIuMXggc2VjdXJlZCBwb3J0IGNvbnRyb2wKKyAgICBpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKKyNlbmRpZgorICAgICAgICApICYmCisgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJeworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoTnVsbEZyYW1lLCA0OCk7CisJTGVuZ3RoID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIE51bGxGcmFtZTsKKworCXBIZWFkZXJfODAyXzExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfTlVMTF9GVU5DOworCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMTsKKwlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisJeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCX0KKwllbHNlCisJeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpID8gMTogMDsKKwl9CisJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgVHhSYXRlLCAxNCk7CisKKwlwQWQtPlNlcXVlbmNlKys7CisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKKworCS8vIFByZXBhcmUgUW9zTnVsbCBmdW5jdGlvbiBmcmFtZQorCWlmIChiUW9zTnVsbCkKKwl7CisJCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9RT1NfTlVMTDsKKworCQkvLyBjb3B5IFFPUyBjb250cm9sIGJ5dGVzCisJCU51bGxGcmFtZVtMZW5ndGhdCT0gIDA7CisJCU51bGxGcmFtZVtMZW5ndGgrMV0gPSAgMDsKKwkJTGVuZ3RoICs9IDI7Ly8gaWYgcGFkIHdpdGggMiBieXRlcyBmb3IgYWxpZ25tZW50LCBBUFNEIHdpbGwgZmFpbAorCX0KKworCUhBTF9LaWNrT3V0TnVsbEZyYW1lVHgocEFkLCAwLCBOdWxsRnJhbWUsIExlbmd0aCk7CisKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lECVJUTVBTZW5kUlRTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCXVuc2lnbmVkIGludAlOZXh0TXBkdVNpemUsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlSVFNSYXRlLAorCUlOCVVTSE9SVAkJCUFja0R1cmF0aW9uLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVVDSEFSCQkJRnJhbWVHYXApCit7Cit9CisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEZJTkQgRU5DUllQVCBLRVkgQU5EIERFQ0lERSBDSVBIRVIgQUxHT1JJVEhNCisvLwkJRmluZCB0aGUgV1BBIGtleSwgZWl0aGVyIEdyb3VwIG9yIFBhaXJ3aXNlIEtleQorLy8JCUxFQVAgKyBUS0lQIGFsc28gdXNlIFdQQSBrZXkuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVjaWRlIFdFUCBiaXQgYW5kIGNpcGhlciBzdWl0ZSB0byBiZSB1c2VkLiBTYW1lIGNpcGhlciBzdWl0ZSBzaG91bGQgYmUgdXNlZCBmb3Igd2hvbGUgZnJhZ21lbnQgYnVyc3QKKy8vIEluIENpc2NvIENDWCAyLjAgTGVhcCBBdXRoZW50aWNhdGlvbgorLy8JCSAgIFdlcFN0YXR1cyBpcyBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkIGJ1dCB0aGUga2V5IHdpbGwgdXNlIFBhaXJ3aXNlS2V5CisvLwkJICAgSW5zdGVhZCBvZiB0aGUgU2hhcmVkS2V5LCBTaGFyZWRLZXkgTGVuZ3RoIG1heSBiZSBaZXJvLgorVk9JRCBTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJQ2lwaGVyOwkJCQkvLyBUbyBpbmRpY2F0ZSBjaXBoZXIgdXNlZCBmb3IgdGhpcyBwYWNrZXQKKwlVQ0hBUgkJCQkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsJCS8vIGNpcGhlciBhbG9ncml0aG0KKwlVQ0hBUgkJCQkJCQlLZXlJZHggPSAweGZmOworCVBVQ0hBUgkJCQkJCQlwU3JjQnVmVkE7CisJUENJUEhFUl9LRVkJCQkJCQlwS2V5ID0gTlVMTDsKKworCXBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwVHhCbGstPnBQYWNrZXQpOworCisJeworCSAgICAvLyBTZWxlY3QgQ2lwaGVyCisJICAgIGlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkKKwkgICAgICAgIENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIE11bHRpY2FzdCBvciBCcm9hZGNhc3QKKwkgICAgZWxzZQorCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuUGFpckNpcGhlcjsgLy8gQ2lwaGVyIGZvciBVbmljYXN0CisKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwVHhCbGstPnBQYWNrZXQpKQorCQl7CisJCQlBU1NFUlQocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnIDw9IENJUEhFUl9DS0lQMTI4KTsKKworCQkJLy8gNC13YXkgaGFuZHNoYWtpbmcgZnJhbWUgbXVzdCBiZSBjbGVhcgorCQkJaWYgKCEoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSkpICYmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcpICYmCisJCQkJKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbikpCisJCQl7CisJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCQkJCUtleUlkeCA9IDA7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisJCXsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChwQWQtPlN0YUNmZy5Da2lwRmxhZyAmIDB4MTApIC8vIENpc2NvIENLSVAgS1AgaXMgb24KKwkJCXsKKwkJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQkJeworCQkJCQlpZiAoKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKSkKKwkJCQkJCUtleUlkeCA9IDE7CisJCQkJCWVsc2UKKwkJCQkJCUtleUlkeCA9IDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDA4KSAvLyBvbmx5IENLSVAgQ01JQworCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCWVsc2UgaWYgKExFQVBfQ0NLTV9PTihwQWQpKQorCQkJeworCQkJCWlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkKKwkJCQkJS2V5SWR4ID0gMTsKKwkJCQllbHNlCisJCQkJCUtleUlkeCA9IDA7CisJCQl9CisJCQllbHNlCS8vIHN0YW5kYXJkIFdFUDY0IG9yIFdFUDEyOAorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJfQorCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkJIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCWlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkgLy8gbXVsdGljYXN0CisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKQorCQkJCUtleUlkeCA9IDA7CisJCQllbHNlCisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQl9CisKKwkJaWYgKEtleUlkeCA9PSAweGZmKQorCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgfHwgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDApKQorCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICBlbHNlIGlmICggcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCisJICAgICAgICAgICAgIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgJiYKKwkgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKSAmJgorCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9OT05FOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJZWxzZQorCQl7CisJCQkvL0hlYWRlcl84MDJfMTEuRkMuV2VwID0gMTsKKwkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOworCQkJcEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdOworCQl9CisJfQorCisJcFR4QmxrLT5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJcFR4QmxrLT5wS2V5ID0gcEtleTsKK30KKworCitWT0lEIFNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBUWF9CTEsgICAgICAgICAgKnBUeEJsaykKK3sKKworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCUJPT0xFQU4JYkRMU0ZyYW1lID0gRkFMU0U7CisJSU5UCURsc0VudHJ5SW5kZXggPSAwOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJLy8KKwkvLyBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIKKwkvLworCisJLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisKKwlOZGlzWmVyb01lbW9yeShwSGVhZGVyXzgwMl8xMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCXBIZWFkZXJfODAyXzExLT5GQy5GckRzID0gMDsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSAoKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpID8gU1VCVFlQRV9RREFUQSA6IFNVQlRZUEVfREFUQSk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisJCS8vIENoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKKwkJLy8gSWYgcGFja2V0IGNhbiBiZSBzZW50IHRocm91Z2ggRExTLCB0aGVuIGZvcmNlIGFnZ3JlZ2F0aW9uIGRpc2FibGUuIChIYXJkIHRvIGRldGVybWluZSBwZWVyIFNUQSdzIGNhcGFiaWxpdHkpCisJCURsc0VudHJ5SW5kZXggPSBSVE1QQ2hlY2tETFNGcmFtZShwQWQsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCWlmIChEbHNFbnRyeUluZGV4ID49IDApCisJCQliRExTRnJhbWUgPSBUUlVFOworCQllbHNlCisJCQliRExTRnJhbWUgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyAgICBpZiAocFR4QmxrLT5wTWFjRW50cnkpCisJeworCQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpKQorCQl7CisJCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcTsKKwkJCXBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxID0gKHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxKzEpICYgTUFYU0VROworCQl9CisJCWVsc2UKKwkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKGJETFNGcmFtZSkKKwkJCXsKKwkJCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtEbHNFbnRyeUluZGV4XS5TZXF1ZW5jZTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtEbHNFbnRyeUluZGV4XS5TZXF1ZW5jZSA9IChwQWQtPlN0YUNmZy5ETFNFbnRyeVtEbHNFbnRyeUluZGV4XS5TZXF1ZW5jZSsxKSAmIE1BWFNFUTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCXsKKyAgICAJICAgIHBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07CisgICAgCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7CisgICAgCX0KKwl9CisJfQorCWVsc2UKKwl7CisJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7CisJCXBBZC0+U2VxdWVuY2UgPSAocEFkLT5TZXF1ZW5jZSsxKSAmIE1BWFNFUTsgLy8gbmV4dCBzZXF1ZW5jZQorCX0KKworCXBIZWFkZXJfODAyXzExLT5GcmFnID0gMDsKKworCXBIZWFkZXJfODAyXzExLT5GQy5Nb3JlRGF0YSA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKworCXsKKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChiRExTRnJhbWUpCisJCQl7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAwOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJeworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOworCQl9CisJCX0KKwkJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAwOworCQl9CisJfQorCisJaWYgKHBUeEJsay0+Q2lwaGVyQWxnICE9IENJUEhFUl9OT05FKQorCQlwSGVhZGVyXzgwMl8xMS0+RkMuV2VwID0gMTsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAyLiBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIgU0hBUkVEIEJZIEVOVElSRSBGUkFHTUVOVCBCVVJTVC4gRmlsbCBzZXF1ZW5jZSBsYXRlci4KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQorICAgIAlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCWVsc2UKKyAgICAJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKAorCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKKwlJTiBUWF9CTEsJCQkqcFR4QmxrLAorCUlOIFVDSEFSCQkJKnBIZWFkZXIpCit7CisJTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOworCisJcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBIZWFkZXI7CisJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKwkvLworCS8vIFVwZGF0ZSB0aGUgY2FjaGVkIDgwMi4xMSBIRUFERVIKKwkvLworCisJLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwkvLyBNb3JlIEJpdAorCXBIZWFkZXI4MDIxMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisKKwkvLyBTZXF1ZW5jZQorCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSBwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XTsKKyAgICBwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSA9IChwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKKworCXsKKwkJLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQorCQkvLyBJZiBwYWNrZXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMsIHRoZW4gZm9yY2UgYWdncmVnYXRpb24gZGlzYWJsZS4gKEhhcmQgdG8gZGV0ZXJtaW5lIHBlZXIgU1RBJ3MgY2FwYWJpbGl0eSkKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJQk9PTEVBTgliRExTRnJhbWUgPSBGQUxTRTsKKwkJSU5UCURsc0VudHJ5SW5kZXggPSAwOworCisJCURsc0VudHJ5SW5kZXggPSBSVE1QQ2hlY2tETFNGcmFtZShwQWQsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCWlmIChEbHNFbnRyeUluZGV4ID49IDApCisJCQliRExTRnJhbWUgPSBUUlVFOworCQllbHNlCisJCQliRExTRnJhbWUgPSBGQUxTRTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLyBUaGUgYWRkcjMgb2Ygbm9ybWFsIHBhY2tldCBzZW5kIGZyb20gRFMgaXMgRGVzdCBNYWMgYWRkcmVzcy4KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJaWYgKGJETFNGcmFtZSkKKwkJeworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlwSGVhZGVyODAyMTEtPkZDLlRvRHMgPSAwOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAyLiBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIgU0hBUkVEIEJZIEVOVElSRSBGUkFHTUVOVCBCVVJTVC4gRmlsbCBzZXF1ZW5jZSBsYXRlci4KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQorICAgIAlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwllbHNlCisgICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitzdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUE5ESVNfUEFDS0VUCXBOZXh0UGFja2V0OworCVVJTlQzMgkJCW5leHRCdWZMZW47CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCS8vIHN0ZWFsICJvcmRlciIgYml0IHRvIG1hcmsgImFnZ3JlZ2F0aW9uIgorCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7CisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQorCXsKKwkJLy8KKwkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkJLy8KKwkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisJfQorCisJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdtZW50LgorCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCS8vIEZvciBSQSBBZ2dyZWdhdGlvbiwKKwkvLyBwdXQgdGhlIDJuZCBNU0RVIGxlbmd0aChleHRyYSAyLWJ5dGUgZmllbGQpIGFmdGVyIFFPU19DT05UUk9MIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0CisJcFFFbnRyeSA9IHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQ7CisJcE5leHRQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocFFFbnRyeSk7CisJbmV4dEJ1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBOZXh0UGFja2V0KTsKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocE5leHRQYWNrZXQpKQorCQluZXh0QnVmTGVuIC09IExFTkdUSF84MDJfMVE7CisKKwkqcEhlYWRlckJ1ZlB0ciA9IChVQ0hBUiluZXh0QnVmTGVuICYgMHhmZjsKKwkqKHBIZWFkZXJCdWZQdHIrMSkgPSAoVUNIQVIpKG5leHRCdWZMZW4gPj4gOCk7CisKKwlwSGVhZGVyQnVmUHRyICs9IDI7CisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisKKwlyZXR1cm4gcEhlYWRlckJ1ZlB0cjsKKworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSwkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOy8vLCBwU2F2ZUJ1ZlB0cjsKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKworCisJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwkvLworCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJLy8KKwkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJLy8KKwkvLyBBLU1TRFUgcGFja2V0CisJLy8KKwkqcEhlYWRlckJ1ZlB0ciB8PSAweDgwOworCisJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwlwSGVhZGVyQnVmUHRyICs9MjsKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKworCS8vcFNhdmVCdWZQdHIgPSBwSGVhZGVyQnVmUHRyOworCisJLy8KKwkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKKwkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwkvLworCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAorCS8vCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCXJldHVybiBwSGVhZGVyQnVmUHRyOworCit9CisKKworVk9JRCBTVEFfQU1QRFVfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJQVNTRVJUKHBUeEJsayk7CisKKwl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQorCXsKKwkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCWlmICggUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKQorCQl7CisJCQkvLyBOT1RFOiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaXplIG9mIHBNYWNFbnRyeS0+Q2FjaGVkQnVmW10gaXMgc21hbGxlciB0aGFuIHBUeEJsay0+SGVhZGVyQnVmW10hISEhCisJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0sIChQVUNIQVIpJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdLCBUWFdJX1NJWkUgKyBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV0pOworCQkJU1RBQnVpbGRDYWNoZTgwMl8xMUhlYWRlcihwQWQsIHBUeEJsaywgcEhlYWRlckJ1ZlB0cik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwkJCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJCX0KKworCisJCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwkJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwkJLy8KKwkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkJLy8KKwkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKwkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCisJCS8vCisJCS8vIGJ1aWxkIEhUQysKKwkJLy8gSFRDIGNvbnRyb2wgZmlsZWQgZm9sbG93aW5nIFFvUyBmaWVsZAorCQkvLworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPT0gVFJVRSkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocFR4QmxrLT5wTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkKKwkJeworCQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQgPT0gRkFMU0UpCisJCQl7CisJCQkJLy8gbWFyayBIVEMgYml0CisJCQkJcEhlYWRlcl84MDJfMTEtPkZDLk9yZGVyID0gMTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJCdWZQdHIsIDQpOworCQkJCSoocEhlYWRlckJ1ZlB0ciszKSB8PSAweDgwOworCQkJfQorCQkJcEhlYWRlckJ1ZlB0ciArPSA0OworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDQ7CisJCX0KKworCQkvL3BUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhlYWRlckJ1ZiAtIFRYV0lfU0laRSAtIFRYSU5GT19TSVpFOworCQlBU1NFUlQocFR4QmxrLT5NcGR1SGVhZGVyTGVuID49IDI0KTsKKworCQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisJCS8vIHNraXAgdmxhbiB0YWcKKwkJaWYgKGJWTEFOUGt0KQorCQl7CisJCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQl9CisKKwkJLy8KKwkJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCisJCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCQkvLworCQkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKKwkJLy8KKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwkJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJCXsKKworCQkJLy8KKwkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJCS8vCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJCX0KKworCQl9CisKKwkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCisJCXsKKyAgICAgICAgICAgIFJUTVBXcml0ZVR4V0lfQ2FjaGUocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgc2l6ZW9mKHBNYWNFbnRyeS0+Q2FjaGVkQnVmKSk7CisJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgKHBIZWFkZXJCdWZQdHIgLSAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSkpOworCQkJcE1hY0VudHJ5LT5pc0NhY2hlZCA9IFRSVUU7CisJCX0KKworCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1QRFUgY291bnQgYW5kIEJ5dGVDb3VudAorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQudS5Mb3dQYXJ0ICsrOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudC5RdWFkUGFydCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJfQorCisJCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworCQlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7CisKKwkJLy8KKwkJLy8gS2ljayBvdXQgVHgKKwkJLy8KKwkJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCX0KKworfQorCisKK1ZPSUQgU1RBX0FNU0RVX0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCVVTSE9SVAkJCXN1YkZyYW1lUGF5bG9hZExlbiA9IDA7CS8vIEFNU0RVIFN1YmZyYW1lIGxlbmd0aCB3aXRob3V0IEFNU0RVLUhlYWRlciAvIFBhZGRpbmcuCisJVVNIT1JUCQkJdG90YWxNUERVU2l6ZT0wOworCVVDSEFSCQkJKnN1YkZyYW1lSGVhZGVyOworCVVDSEFSCQkJcGFkZGluZyA9IDA7CisJVVNIT1JUCQkJRmlyc3RUeCA9IDAsIExhc3RUeElkeCA9IDA7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCWludCAJCQlmcmFtZU51bSA9IDA7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKworCUFTU0VSVChwVHhCbGspOworCisJQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPiAxKSk7CisKKwl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQorCXsKKwkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJY29udGludWU7CisJCX0KKworCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisJCS8vIHNraXAgdmxhbiB0YWcKKwkJaWYgKGJWTEFOUGt0KQorCQl7CisJCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQl9CisKKwkJaWYgKGZyYW1lTnVtID09IDApCisJCXsKKwkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCQkJLy8gTk9URTogVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOworCQkJcGFkZGluZyA9IFJPVU5EX1VQKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBzdWJGcmFtZVBheWxvYWRMZW4sIDQpIC0gKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBzdWJGcmFtZVBheWxvYWRMZW4pOworCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgcGFkZGluZyArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQpOworCQkJcEhlYWRlckJ1ZlB0ciArPSBwYWRkaW5nOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcGFkZGluZzsKKwkJfQorCisJCS8vCisJCS8vIEEtTVNEVSBzdWJmcmFtZQorCQkvLyAgIERBKDYpK1NBKDYpK0xlbmd0aCgyKSArIExMQy9TTkFQIEVuY2FwCisJCS8vCisJCXN1YkZyYW1lSGVhZGVyID0gcEhlYWRlckJ1ZlB0cjsKKwkJc3ViRnJhbWVQYXlsb2FkTGVuID0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJTmRpc01vdmVNZW1vcnkoc3ViRnJhbWVIZWFkZXIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgMTIpOworCisKKwkJcEhlYWRlckJ1ZlB0ciArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKworCisJCS8vCisJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJLy8KKwkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisKKwkJc3ViRnJhbWVQYXlsb2FkTGVuID0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCQlzdWJGcmFtZVBheWxvYWRMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCX0KKworCQkvLyB1cGRhdGUgc3ViRnJhbWUgTGVuZ3RoIGZpZWxkCisJCXN1YkZyYW1lSGVhZGVyWzEyXSA9IChzdWJGcmFtZVBheWxvYWRMZW4gJiAweEZGMDApID4+IDg7CisJCXN1YkZyYW1lSGVhZGVyWzEzXSA9IHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkY7CisKKwkJdG90YWxNUERVU2l6ZSArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlpZiAoZnJhbWVOdW0gPT0wKQorCQkJRmlyc3RUeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKwkJZWxzZQorCQkJTGFzdFR4SWR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCisJCWZyYW1lTnVtKys7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkJLy8gY2FsY3VsYXRlIFRyYW5zbWl0dGVkIEFNU0RVIENvdW50IGFuZCBCeXRlQ291bnQKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNU0RVQ291bnQudS5Mb3dQYXJ0ICsrOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1TRFUuUXVhZFBhcnQgKz0gdG90YWxNUERVU2l6ZTsKKwkJfQorCisJfQorCisJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKKwlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgU1RBX0xlZ2FjeV9GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlBU1NFUlQocFR4QmxrKTsKKworCisJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9NQ0FTVF9GUkFNRSkKKwl7CisJCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50KTsKKwl9CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX1JUUyhwVHhCbGstPnBQYWNrZXQpKQorCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKKwllbHNlCisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JSdHNSZXF1aXJlZCk7CisKKwliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCWlmIChwVHhCbGstPlR4UmF0ZSA8IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSkKKwkJcFR4QmxrLT5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7CisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKworCS8vIHNraXAgODAyLjMgaGVhZGVyCisJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisJLy8gc2tpcCB2bGFuIHRhZworCWlmIChiVkxBTlBrdCkKKwl7CisJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwl9CisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQorCXsKKwkJLy8KKwkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkJLy8KKwkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKwkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCX0KKworCS8vIFRoZSByZW1haW5pbmcgY29udGVudCBvZiBNUERVIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCXsKKworCQkvLworCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJCS8vCisJCS8vCisgICAJCS8vIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLAorCQkvLyB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCisJCS8vCisJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJeworCQkJVUNIQVIgdmxhbl9zaXplOworCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkvLyBza2lwIHZsYW4gdGFnCisJCQl2bGFuX3NpemUgPSAgKGJWTEFOUGt0KSA/IExFTkdUSF84MDJfMVEgOiAwOworCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIrMTIrdmxhbl9zaXplLCAyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJfQorCisJfQorCisJLy8KKwkvLyBwcmVwYXJlIGZvciBUWFdJCisJLy8gdXNlIFdjaWQgYXMgS2V5IEluZGV4CisJLy8KKworCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKwkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisKKwlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7CisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJLy8KKwkvLyBLaWNrIG91dCBUeAorCS8vCisJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworfQorCisKK1ZPSUQgU1RBX0FSYWxpbmtfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJVVNIT1JUCQkJdG90YWxNUERVU2l6ZT0wOworCVVTSE9SVAkJCUZpcnN0VHgsIExhc3RUeElkeDsKKwlpbnQgCQkJZnJhbWVOdW0gPSAwOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCisJQVNTRVJUKHBUeEJsayk7CisKKwlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcj09IDIpKTsKKworCisJRmlyc3RUeCA9IExhc3RUeElkeCA9IDA7ICAvLyBJcyBpdCBvayBpbml0IHRoZXkgYXMgMD8KKwl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQorCXsKKwkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisKKwkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQlpZiAoZnJhbWVOdW0gPT0gMCkKKwkJewkvLyBGb3IgZmlyc3QgZnJhbWUsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyICsgcGFkZGluZyhvcHRpb25hbCkgKyBSQS1BR0ctTEVOICsgU05BUCBIZWFkZXIKKworCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CisKKwkJCS8vIEl0J3Mgb2sgd3JpdGUgdGhlIFR4V0kgaGVyZSwgYmVjYXVzZSB0aGUgVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CisJCQkvLwl3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuCisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisKKwkJCS8vCisJCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJCQkvLworCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisKKwkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsJLy8gRm9yIHNlY29uZCBhZ2dyZWdhdGVkIGZyYW1lLCB3ZSBuZWVkIGNyZWF0ZSB0aGUgODAyLjMgaGVhZGVyIHRvIGhlYWRlckJ1ZiwgYmVjYXVzZSBQQ0kgd2lsbCBjb3B5IGl0IHRvIFNEUHRyMC4KKworCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZlswXTsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IDA7CisKKwkJCS8vIEEtUmFsaW5rIHN1Yi1zZXF1ZW50IGZyYW1lIGhlYWRlciBpcyB0aGUgc2FtZSBhcyA4MDIuMyBoZWFkZXIuCisJCQkvLyAgIERBKDYpK1NBKDYpK0ZyYW1lVHlwZSgyKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDEyOworCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFEOworCQl9CisKKwkJdG90YWxNUERVU2l6ZSArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCWlmIChmcmFtZU51bSA9PTApCisJCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCQllbHNlCisJCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisKKwkJZnJhbWVOdW0rKzsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4QWdncmVnYXRpb25Db3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCX0KKworCUhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgRmlyc3RUeCk7CisJSEFMX0xhc3RUeElkeChwQWQsIHBUeEJsay0+UXVlSWR4LCBMYXN0VHhJZHgpOworCisJLy8KKwkvLyBLaWNrIG91dCBUeAorCS8vCisJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworCit9CisKKworVk9JRCBTVEFfRnJhZ21lbnRfRnJhbWVfVHgoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlVQ0hBUiAJCQlmcmFnTnVtID0gMDsKKwlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKKwlVU0hPUlQJCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOworCVVJTlQzMgkJCUZyZWVNcGR1U2l6ZSwgU3JjUmVtYWluaW5nQnl0ZXM7CisJVVNIT1JUCQkJQWNrRHVyYXRpb247CisJVUlOVCAJCQlOZXh0TXBkdVNpemU7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisKKwlBU1NFUlQocFR4QmxrKTsKKworCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwl7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJQVNTRVJUKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZykpOworCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisJaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCXsKKwkJcFR4QmxrLT5wUGFja2V0ID0gZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKHBBZCwgcFR4QmxrLT5wUGFja2V0KTsKKwkJaWYgKHBUeEJsay0+cFBhY2tldCA9PSBOVUxMKQorCQkJcmV0dXJuOworCQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwVHhCbGstPnBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCX0KKworCS8vIHNraXAgODAyLjMgaGVhZGVyCisJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisKKwkvLyBza2lwIHZsYW4gdGFnCisJaWYgKGJWTEFOUGt0KQorCXsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCX0KKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKilwSGVhZGVyQnVmUHRyOworCisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQorCXsKKwkJLy8KKwkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkJLy8KKwkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisJfQorCisJLy8KKwkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKKwkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwkvLworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKworCisJLy8KKwkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJLy8KKwkvLworICAgCS8vIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLAorCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKwkvLworCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCXsKKwkJVUNIQVIgdmxhbl9zaXplOworCisJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkvLyBza2lwIHZsYW4gdGFnCisJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIrMTIrdmxhbl9zaXplLCAyKTsKKwkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJfQorCisKKwkvLyBJZiBUS0lQIGlzIHVzZWQgYW5kIGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQuIERyaXZlciBoYXMgdG8KKwkvLwlhcHBlbmQgVEtJUCBNSUMgYXQgdGFpbCBvZiB0aGUgc2NhdHRlciBidWZmZXIKKwkvLwlNQUMgQVNJQyB3aWxsIG9ubHkgcGVyZm9ybSBJVi9FSVYvSUNWIGluc2VydGlvbiBidXQgbm8gVEtJUCBNSUMKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJeworCisJCS8vIE5PVEU6IERPTidUIHJlZmVyIHRoZSBza2ItPmxlbiBkaXJlY3RseSBhZnRlciBmb2xsb3dpbmcgY29weS4gQmVjYXN1ZSB0aGUgbGVuZ3RoIGlzIG5vdCBhZGp1c3QKKwkJLy8JCQl0byBjb3JyZWN0IGxlbmdodCwgcmVmZXIgdG8gcFR4QmxrLT5TcmNCdWZMZW4gZm9yIHRoZSBwYWNrZXQgbGVuZ3RoIGluIGZvbGxvd2luZyBwcm9ncmVzcy4KKwkJTmRpc01vdmVNZW1vcnkocFR4QmxrLT5wU3JjQnVmRGF0YSArIHBUeEJsay0+U3JjQnVmTGVuLCAmcEFkLT5Qcml2YXRlSW5mby5UeC5NSUNbMF0sIDgpOworCQkvL3NrYl9wdXQoKFJUUEtUX1RPX09TUEtUKHBUeEJsay0+cFBhY2tldCkpLT50YWlsLCA4KTsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gKz0gODsKKwkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IDg7CisJCXBUeEJsay0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVBfTk9fTUlDOworCX0KKworCS8vCisJLy8gY2FsY3VhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcworCS8vIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkCisJLy8KKwlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkgfHwgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSA4OyAvL1dFUDogSVZbNF0gKyBJQ1ZbNF07CisJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxMjsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdLCBNSUMgd2lsbCBiZSBhZGRlZCB0byBUb3RhbFBhY2tldExlbmd0aAorCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAyMDsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdICsgTUlDWzhdCisJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMTY7CS8vIEFFUzogSVZbNF0gKyBFSVZbNF0gKyBNSUNbOF0KKwllbHNlCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7CisKKwkvLyBkZWNpZGUgaG93IG11Y2ggdGltZSBhbiBBQ0svQ1RTIGZyYW1lIHdpbGwgY29uc3VtZSBpbiB0aGUgYWlyCisJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW3BUeEJsay0+VHhSYXRlXSwgMTQpOworCisJLy8gSW5pdCB0aGUgdG90YWwgcGF5bG9hZCBsZW5ndGggb2YgdGhpcyBmcmFtZS4KKwlTcmNSZW1haW5pbmdCeXRlcyA9IHBUeEJsay0+U3JjQnVmTGVuOworCisJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gPSAweGZmOworCisJZG8geworCisJCUZyZWVNcGR1U2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkIC0gTEVOR1RIX0NSQzsKKworCQlGcmVlTXBkdVNpemUgLT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJCWlmIChTcmNSZW1haW5pbmdCeXRlcyA8PSBGcmVlTXBkdVNpemUpCisJCXsJLy8gdGhpcyBpcyB0aGUgbGFzdCBvciBvbmx5IGZyYWdtZW50CisKKwkJCXBUeEJsay0+U3JjQnVmTGVuID0gU3JjUmVtYWluaW5nQnl0ZXM7CisKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Nb3JlRnJhZyA9IDA7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIEFja0R1cmF0aW9uOworCisJCQkvLyBJbmRpY2F0ZSB0aGUgbG93ZXIgbGF5ZXIgdGhhdCB0aGlzJ3MgdGhlIGxhc3QgZnJhZ21lbnQuCisJCQlwVHhCbGstPlRvdGFsRnJhZ051bSA9IGZyYWdOdW07CisJCX0KKwkJZWxzZQorCQl7CS8vIG1vcmUgZnJhZ21lbnQgaXMgcmVxdWlyZWQKKworCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBGcmVlTXBkdVNpemU7CisKKwkJCU5leHRNcGR1U2l6ZSA9IG1pbigoKFVJTlQpU3JjUmVtYWluaW5nQnl0ZXMgLSBwVHhCbGstPlNyY0J1ZkxlbiksICgoVUlOVClwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9ICgzICogcEFkLT5Db21tb25DZmcuRHNpZnMpICsgKDIgKiBBY2tEdXJhdGlvbikgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgcFR4QmxrLT5UeFJhdGUsIE5leHRNcGR1U2l6ZSArIEVuY3J5cHRpb25PdmVyaGVhZCk7CisJCX0KKworCQlpZiAoZnJhZ051bSA9PSAwKQorCQkJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19IVFRYT1A7CisJCWVsc2UKKwkJCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfU0lGUzsKKworCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisJCUhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCAmRnJlZU51bWJlcik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkJLy8gVXBkYXRlIHRoZSBmcmFtZSBudW1iZXIsIHJlbWFpbmluZyBzaXplIG9mIHRoZSBORElTIHBhY2tldCBwYXlsb2FkLgorCisJCS8vIHNwYWNlIGZvciA4MDIuMTEgaGVhZGVyLgorCQlpZiAoZnJhZ051bSA9PSAwICYmIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC09IExFTkdUSF84MDJfMV9IOworCisJCWZyYWdOdW0rKzsKKwkJU3JjUmVtYWluaW5nQnl0ZXMgLT0gcFR4QmxrLT5TcmNCdWZMZW47CisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJcEhlYWRlcl84MDJfMTEtPkZyYWcrKzsJIC8vIGluY3JlYXNlIEZyYWcgIworCisJfXdoaWxlKFNyY1JlbWFpbmluZ0J5dGVzID4gMCk7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Cit9CisKKworI2RlZmluZSBSRUxFQVNFX0ZSQU1FU19PRl9UWEJMSyhfcEFkLCBfcFR4QmxrLCBfcFFFbnRyeSwgX1N0YXR1cykgCQkJCQkJCQkJCVwKKwkJd2hpbGUoX3BUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCQkJCQkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJX3BRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJl9wVHhCbGstPlR4UGFja2V0TGlzdCk7CQkJCQkJCQkJXAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBRVUVVRV9FTlRSWV9UT19QQUNLRVQoX3BRRW50cnkpLCBfU3RhdHVzKTsJXAorCQl9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSBlbmNyeXB0aW9uIGJlZm9yZSByZWFsbHkKKwlzZW50IG91dCB0byBhaXIuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCisJCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgU1RBSGFyZFRyYW5zbWl0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFRYX0JMSyAJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KQoreworCU5ESVNfUEFDS0VUCQkqcFBhY2tldDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNURVAgMC4gRE8gU0FOSVRZIENIRUNLIEFORCBTT01FIEVBUkxZIFBSRVBBUkFUSU9OLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vCisJQVNTRVJUKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcik7CisJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUeEJsay0+VG90YWxGcmFtZU51bSA9PSAlbGQhXG4iLCBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKTsKKworI2lmIDAgLy9kZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKSAmJiAoaXNDYXJyaWVyRGV0ZWN0RXhpc3QocEFkKSA9PSBUUlVFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sKCJTVEFIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAxLiBXQUtFIFVQIFBIWQorCS8vCQlvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QgYW5kCisJLy8JCXR1cm4gb2ZmIFBTTSBiaXQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIG5vdCB0byBjaGFuZ2UgUFNNIGJpdCwganVzdCBzZW5kIHRoaXMgZnJhbWUgb3V0PworCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCXsKKwkgICAgREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNGb3JjZVdha2V1cCBBdCBIYXJkVHhcbiIpKTsKKwkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJfQorCisJLy8gSXQgc2hvdWxkIG5vdCBjaGFuZ2UgUFNNIGJpdCwgd2hlbiBBUFNEIHR1cm4gb24uCisJaWYgKCghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPT0gRkFMU0UpKQorCQl8fCAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCisJCXx8IChSVE1QX0dFVF9QQUNLRVRfV0FJKHBUeEJsay0+cFBhY2tldCkpKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmCisgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApKQorCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9BQ1RJVkUpOworCX0KKworCXN3aXRjaCAocFR4QmxrLT5UeEZyYW1lVHlwZSkKKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgVFhfQU1QRFVfRlJBTUU6CisJCQkJU1RBX0FNUERVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX0FNU0RVX0ZSQU1FOgorCQkJCVNUQV9BTVNEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBUWF9MRUdBQ1lfRlJBTUU6CisJCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJY2FzZSBUWF9NQ0FTVF9GUkFNRToKKwkJCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX1JBTElOS19GUkFNRToKKwkJCQlTVEFfQVJhbGlua19GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJY2FzZSBUWF9GUkFHX0ZSQU1FOgorCQkJCVNUQV9GcmFnbWVudF9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNlbmQgYSBwYWNla3Qgd2FzIG5vdCBjbGFzc2lmaWVkISEgSXQgc2hvdWxkIG5vdCBoYXBwZW4hXG4iKSk7CisJCQkJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKQorCQkJCXsKKwkJCQkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCQkJCQlpZiAocFBhY2tldCkKKwkJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCit9CisKK1VMT05HICBIYXNoQnl0ZXNQb2x5bm9taWFsKFVDSEFSICp2YWx1ZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgIHVuc2lnbmVkIGNoYXIgKndvcmQgPSB2YWx1ZTsKKyAgIHVuc2lnbmVkIGludCByZXQgPSAwOworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIGZvcihpPTA7IGkgPCBsZW47IGkrKykKKyAgIHsKKwkgIGludCBtb2QgPSBpICUgMzI7CisJICByZXQgXj0odW5zaWduZWQgaW50KSAod29yZFtpXSkgPDwgbW9kOworCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pID4+ICgzMiAtIG1vZCk7CisgICB9CisgICByZXR1cm4gcmV0OworfQorCitWT0lEIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCWlmIChUUlVFCisJCSkKKwl7CisJCWFubm91bmNlXzgwMl8zX3BhY2tldChwQWQsIHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTg3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYwpAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzYW5pdHkuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK2V4dGVybiBVQ0hBUglDSVNDT19PVUlbXTsKKworZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKK2V4dGVybiBVQ0hBUglSU05fT1VJW107CitleHRlcm4gVUNIQVIJV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIFVDSEFSCVdNRV9QQVJNX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglDY3gyUW9zSW5mb1tdOworZXh0ZXJuIFVDSEFSCVJBTElOS19PVUlbXTsKK2V4dGVybiBVQ0hBUglCUk9BRENPTV9PVUlbXTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpwU3NpZExlbikKK3sKKyAgICBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKkluZm87CisKKyAgICBJbmZvID0gKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqKShNc2cpOworCisgICAgaWYgKEluZm8tPlNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgbGVuZ3RoXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOworICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKyAgICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVU0hPUlQgKnBBaWQsCisgICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCisgICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisgICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisgICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCisgICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAorICAgIE9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKKyAgICBPVVQgVUNIQVIgKnBDa2lwRmxhZykKK3sKKyAgICBDSEFSICAgICAgICAgIEllVHlwZSwgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7CisgICAgUEVJRF9TVFJVQ1QgICBwRWlkOworICAgIFVMT05HICAgICAgICAgTGVuZ3RoID0gMDsKKworCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJKnBIdENhcGFiaWxpdHlMZW4gPSAwOworCSpwQWRkSHRJbmZvTGVuID0gMDsKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIFB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisgICAgTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKyAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKyAgICBMZW5ndGggKz0gMjsKKyAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCAgICAgICAgICZwRnJhbWUtPk9jdGV0WzJdLCAyKTsKKyAgICBMZW5ndGggKz0gMjsKKyAgICAqcENraXBGbGFnID0gMDsKKyAgICAqcEV4dFJhdGVMZW4gPSAwOworICAgIHBFZGNhUGFybS0+YlZhbGlkID0gRkFMU0U7CisKKyAgICBpZiAoKnBTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHBBaWQsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKKyAgICBMZW5ndGggKz0gMjsKKworICAgIC8vIEFpZCBhbHJlYWR5IHN3YXBlZCBieXRlIG9yZGVyIGluIFJUTVBGcmFtZUVuZGlhbkNoYW5nZSgpIGZvciBiaWcgZW5kaWFuIHBsYXRmb3JtCisgICAgKnBBaWQgPSAoKnBBaWQpICYgMHgzZmZmOyAvLyBBSUQgaXMgbG93IDE0LWJpdAorCisgICAgLy8gLS0gZ2V0IHN1cHBvcnRlZCByYXRlcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBJZVR5cGUgPSBwRnJhbWUtPk9jdGV0WzZdOworICAgICpwU3VwUmF0ZUxlbiA9IHBGcmFtZS0+T2N0ZXRbN107CisgICAgaWYgKChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykgfHwgKCpwU3VwUmF0ZUxlbiA+IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcFNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydGVkUmF0ZXMgSUVcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsICZwRnJhbWUtPk9jdGV0WzhdLCAqcFN1cFJhdGVMZW4pOworCisgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArICpwU3VwUmF0ZUxlbjsKKworICAgIC8vIG1hbnkgQVAgaW1wbGVtZW50IHByb3ByaWV0YXJ5IElFcyBpbiBub24tc3RhbmRhcmQgb3JkZXIsIHdlJ2QgYmV0dGVyCisgICAgLy8gdG9sZXJhdGUgbWlzLW9yZGVyZWQgSUVzIHRvIGdldCBiZXN0IGNvbXBhdGliaWxpdHkKKyAgICBwRWlkID0gKFBFSURfU1RSVUNUKSAmcEZyYW1lLT5PY3RldFs4ICsgKCpwU3VwUmF0ZUxlbildOworCisgICAgLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICB3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKKyAgICB7CisgICAgICAgIHN3aXRjaCAocEVpZC0+RWlkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgorICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVAyOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIFNJWkVfSFRfQ0FQX0lFKTsKKworCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOworCisJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKKyAgICAgICAgICAgIGNhc2UgSUVfQUREX0hUMjoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKKwkJCXsKKwkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQorCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKworCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7CisJCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKKworCQkJCSpwQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpCisJCQl7CisJCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfQ0tJUDoKKyAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gMjgKKyAgICAgICAgICAgICAgICAvLyAgICBDaXNjbydzIEFQIFZ4V29yayB2ZXJzaW9uKHdpbGwgbm90IGJlIHN1cHBvcnRlZCkgdXNlZCB0aGlzIElFIGxlbmd0aCBhcyAyOAorICAgICAgICAgICAgICAgIC8vICAgIENpc2NvJ3MgQVAgSU9TIHZlcnNpb24gdXNlZCB0aGlzIElFIGxlbmd0aCBhcyAzMAorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPCAoQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAyKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIDEuIENvcHkgQ0tJUCBmbGFnIGJ5dGUgdG8gYnVmZmVyIGZvciBwcm9jZXNzCisgICAgICAgICAgICAgICAgKnBDa2lwRmxhZyA9ICoocEVpZC0+T2N0ZXQgKyA4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0lQQUREUkVTUzoKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDB4MEEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgQ2lzY28gQWlyb25ldCBJUCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQWlyb25ldElQQWRkcmVzcywgcEVpZC0+T2N0ZXQgKyA0LCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gQ0NYMiwgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWx1ZQorICAgICAgICAgICAgLy8gY2FzZSBJRV9DQ1hfVjI6CisgICAgICAgICAgICBjYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgV01FIFBBUkFNVEVSIEVMRU1FTlQKKyAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgLy9wRWRjYVBhcm0tPmJNb3JlRGF0YUFjayAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4ODA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwRWlkLT5PY3RldFs4XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7IC8vIGI1fjYgaXMgQUMgSU5ERVgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVthY2ldICA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7ICAgLy8gYjUgaXMgQUNNCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOyAgICAgICAgICAgICAgIC8vIGIwfjMgaXMgQUlGU04KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyKzEpICYgMHgwZjsgICAgICAgICAgICAgLy8gYjB+NCBpcyBDd21pbgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFthY2ldID0gKihwdHIrMSkgPj4gNDsgICAgICAgICAgICAgICAvLyBiNX44IGlzIEN3bWF4CisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbYWNpXSAgPSAqKHB0cisyKSArIDI1NiAqICgqKHB0ciszKSk7IC8vIGluIHVuaXQgb2YgMzItdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA0OyAvLyBwb2ludCB0byBuZXh0IEFDCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgQ0NYIElFCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgdGhlIHNpemUgYW5kIENDWCBhZG1pbiBjb250cm9sCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gNSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIFR1cm4gQ0NYMiBpZiBtYXRjaGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENjeDJJZUluZm8sIDUpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IC0gaWdub3JlIHVucmVjb2duaXplZCBFSUQgPSAlZFxuIiwgcEVpZC0+RWlkKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgcEVpZC0+TGVuOworICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKyAgICB9CisKKyAgICAvLyBGb3JjZSBDQ1gyIGVuYWJsZSB0byBUUlVFIGZvciB0aG9zZSBBUCBkaWRuJ3QgcmVwbGF5IENDWCB2MiBJRSwgd2Ugc3RpbGwgZm9yY2UgaXQgdG8gYmUgb24KKyAgICBpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKKyAgICAgICAgcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gVFJVRTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpwU3NpZExlbikKK3sKKyAgICBVQ0hBUiAgICAgICAgIElkeDsKKyAgICBVQ0hBUgkgICAgICBSYXRlTGVuOworICAgIENIQVIgICAgICAgICAgSWVUeXBlOworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKworICAgIGlmICgocEZyYW1lLT5PY3RldFswXSAhPSBJRV9TU0lEKSB8fCAocEZyYW1lLT5PY3RldFsxXSA+IE1BWF9MRU5fT0ZfU1NJRCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgSUUoVHlwZT0lZCxMZW49JWQpXG4iLHBGcmFtZS0+T2N0ZXRbMF0scEZyYW1lLT5PY3RldFsxXSkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgKnBTc2lkTGVuID0gcEZyYW1lLT5PY3RldFsxXTsKKyAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCAmcEZyYW1lLT5PY3RldFsyXSwgKnBTc2lkTGVuKTsKKworICAgIElkeCA9ICpwU3NpZExlbiArIDI7CisKKyAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbSWR4XTsKKyAgICBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFtJZHggKyAxXTsKKyAgICBpZiAoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRSYXRlcyBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFtJZHhdLHBGcmFtZS0+T2N0ZXRbSWR4KzFdKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChSYXRlTGVuIDwgOCkpCisgICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIEdldFRpbUJpdCgKKyAgICBJTiBDSEFSICpQdHIsCisgICAgSU4gVVNIT1JUIEFpZCwKKyAgICBPVVQgVUNIQVIgKlRpbUxlbiwKKyAgICBPVVQgVUNIQVIgKkJjYXN0RmxhZywKKyAgICBPVVQgVUNIQVIgKkR0aW1Db3VudCwKKyAgICBPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCisgICAgT1VUIFVDSEFSICpNZXNzYWdlVG9NZSkKK3sKKyAgICBVQ0hBUiAgICAgICAgICBCaXRDbnRsLCBOMSwgTjIsIE15Qnl0ZSwgTXlCaXQ7CisgICAgQ0hBUiAgICAgICAgICAqSWR4UHRyOworCisgICAgSWR4UHRyID0gUHRyOworCisgICAgSWR4UHRyICsrOworICAgICpUaW1MZW4gPSAqSWR4UHRyOworCisgICAgLy8gZ2V0IERUSU0gQ291bnQgZnJvbSBUSU0gZWxlbWVudAorICAgIElkeFB0ciArKzsKKyAgICAqRHRpbUNvdW50ID0gKklkeFB0cjsKKworICAgIC8vIGdldCBEVElNIFBlcmlvZCBmcm9tIFRJTSBlbGVtZW50CisgICAgSWR4UHRyKys7CisgICAgKkR0aW1QZXJpb2QgPSAqSWR4UHRyOworCisgICAgLy8gZ2V0IEJpdG1hcCBDb250cm9sIGZyb20gVElNIGVsZW1lbnQKKyAgICBJZHhQdHIrKzsKKyAgICBCaXRDbnRsID0gKklkeFB0cjsKKworICAgIGlmICgoKkR0aW1Db3VudCA9PSAwKSAmJiAoQml0Q250bCAmIDB4MDEpKQorICAgICAgICAqQmNhc3RGbGFnID0gVFJVRTsKKyAgICBlbHNlCisgICAgICAgICpCY2FzdEZsYWcgPSBGQUxTRTsKKworICAgIC8vIFBhcnNlIFBhcnRpYWwgVmlydHVhbCBCaXRtYXAgZnJvbSBUSU0gZWxlbWVudAorICAgIE4xID0gQml0Q250bCAmIDB4ZmU7ICAgIC8vIE4xIGlzIHRoZSBmaXJzdCBiaXRtYXAgYnl0ZSMKKyAgICBOMiA9ICpUaW1MZW4gLSA0ICsgTjE7ICAvLyBOMiBpcyB0aGUgbGFzdCBiaXRtYXAgYnl0ZSMKKworICAgIGlmICgoQWlkIDwgKE4xIDw8IDMpKSB8fCAoQWlkID49ICgoTjIgKyAxKSA8PCAzKSkpCisgICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIE15Qnl0ZSA9IChBaWQgPj4gMykgLSBOMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG15IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGJpdG1hcCBieXRlLXN0cmVhbQorICAgICAgICBNeUJpdCA9IEFpZCAlIDE2IC0gKChNeUJ5dGUgJiAweDAxKT8gODowKTsKKworICAgICAgICBJZHhQdHIgKz0gKE15Qnl0ZSArIDEpOworCisgICAgICAgIC8vaWYgKCpJZHhQdHIpCisgICAgICAgIC8vICAgIERCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiVElNIGJpdG1hcCA9IDB4JTAyeFxuIiwgKklkeFB0cikpOworCisgICAgICAgIGlmICgqSWR4UHRyICYgKDB4MDEgPDwgTXlCaXQpKQorICAgICAgICAgICAgKk1lc3NhZ2VUb01lID0gVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTk2Zjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCkBAIC0wLDAgKzEsMTk1OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzeW5jLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDQtMDktMDEgICAgICBtb2RpZmllZCBmb3IgcnQyNTYxLzI2NjEKKwlKYW4gTGVlCQkyMDA2LTA4LTAxICAgICAgbW9kaWZpZWQgZm9yIHJ0Mjg2MCBmb3IgODAyLjExbgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2RlZmluZSBBQzBfREVGX1RYT1AJCTAKKyNkZWZpbmUgQUMxX0RFRl9UWE9QCQkwCisjZGVmaW5lIEFDMl9ERUZfVFhPUAkJOTQKKyNkZWZpbmUgQUMzX0RFRl9UWE9QCQk0NworCitWT0lECUFkaG9jVHVybk9uUW9zKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBUdXJuIG9uIFFPcyBpZiB1c2UgSFQgcmF0ZS4KKwlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCisJeworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsyXSA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bM10gPSAxOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMF0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzFdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsyXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bM10gPSAyOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMF0gPSAxMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsxXSA9IDY7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMl0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzNdID0gMzsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMF0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdICA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsyXSAgPSBBQzJfREVGX1RYT1A7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSBBQzNfREVGX1RYT1A7CisJfQorCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGUgc3luYyBzdGF0ZSBtYWNoaW5lLAorCVBhcmFtZXRlcnM6CisJCVNtIC0gcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorCU5vdGU6CisJCXRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9TWU5DX1NUQVRFLCBNQVhfU1lOQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgU1lOQ19JRExFLCBTWU5DX01BQ0hJTkVfQkFTRSk7CisKKwkvLyBjb2x1bW4gMQorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lU2NhblJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVKb2luUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTdGFydFJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfUFJPQkVfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJQcm9iZVJlcUFjdGlvbik7CisKKwkvL2NvbHVtbiAyCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU2Nhbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblN0YXJ0KTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRKb2luQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9CRUFDT05fVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKTsKKworCS8vIGNvbHVtbiAzCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblN0YXJ0KTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1BFRVJfUFJPQkVfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9TQ0FOX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpU2NhblRpbWVvdXRBY3Rpb24pOworCisJLy8gdGltZXIgaW5pdAorCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KSwgcEFkLCBGQUxTRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQmVhY29uIHRpbWVvdXQgaGFuZGxlciwgZXhlY3V0ZWQgaW4gdGltZXIgdGhyZWFkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQmVhY29uVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTWU5DIC0gQmVhY29uVGltZW91dFxuIikpOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJCSkKKwl7CisJCVVDSEFSICAgICAgICBCQlBWYWx1ZSA9IDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCUJCUFZhbHVlIHw9IDB4MTA7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEVuZCBvZiBTQ0FOLCByZXN0b3JlIHRvIDQwTUh6IGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9CRUFDT05fVElNRU9VVCwgMCwgTlVMTCk7CisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNjYW4gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTY2FuVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlpZiAoTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX1RJTUVPVVQsIDAsIE5VTEwpKQorCXsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKwllbHNlCisJeworCQkvLyBUbyBwcmV2ZW50IFN5bmNNYWNoaW5lLkN1cnJTdGF0ZSBpcyBTQ0FOX0xJU1RFTiBmb3JldmVyLgorCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IDA7CisJCVNjYW5OZXh0Q2hhbm5lbChwQWQpOworCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBTQ0FOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbiwgU2NhblR5cGUsIEJzc1R5cGUsIEJCUFZhbHVlID0gMDsKKwlCT09MRUFOICAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVTE9ORwkJICAgTm93OworCVVTSE9SVCAgICAgICAgIFN0YXR1czsKKwlQSEVBREVSXzgwMl8xMSBwSGRyODAyMTE7CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgTlN0YXR1czsKKworCS8vIENoZWNrIHRoZSB0b3RhbCBzY2FuIHRyaWVzIGZvciBvbmUgc2luZ2xlIE9JRCBjb21tYW5kCisJLy8gSWYgdGhpcyBpcyB0aGUgQ0NYIDIuMCBDYXNlLCBza2lwIHRoYXQhCisJaWYgKCAhUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lU2NhblJlcUFjdGlvbiBiZWZvcmUgU3RhcnR1cFxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gSW5jcmVhc2UgdGhlIHNjYW4gcmV0cnkgY291bnRlcnMuCisJcEFkLT5TdGFDZmcuU2NhbkNudCsrOworCisjaWZkZWYgUlQyODYwCisgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpICYmCisgICAgICAgIChJRExFX09OKHBBZCkpICYmCisJCShwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgJiYKKwkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQorCXsKKwkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkvLyBmaXJzdCBjaGVjayB0aGUgcGFyYW1ldGVyIHNhbml0eQorCWlmIChNbG1lU2NhblJlcVNhbml0eShwQWQsCisJCQkJCQkgIEVsZW0tPk1zZywKKwkJCQkJCSAgRWxlbS0+TXNnTGVuLAorCQkJCQkJICAmQnNzVHlwZSwKKwkJCQkJCSAgU3NpZCwKKwkJCQkJCSAgJlNzaWRMZW4sCisJCQkJCQkgICZTY2FuVHlwZSkpCisJeworCisJCS8vIENoZWNrIGZvciBjaGFubmVsIGxvYWQgYW5kIG5vaXNlIGhpc3QgcmVxdWVzdAorCQkvLyBTdXNwZW5kIE1TRFUgb25seSBhdCBzY2FuIHJlcXVlc3QsIG5vdCB0aGUgbGFzdCB0d28gbWVudGlvbmVkCisJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CQkJLy8gU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlCisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUKKwkJCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOworCQl9CisKKwkJLy8KKwkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCisJCS8vIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLgorCQkvLyBBbmQgc2hvdWxkIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZQorCQkvLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKKwkJeworCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7CisJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlwSGRyODAyMTEtPkR1cmF0aW9uID0gMDsKKwkJCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCisJCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQorCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCX0KKwkJfQorCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkvLyByZWNvcmQgZGVzaXJlZCBCU1MgcGFyYW1ldGVycworCQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJzc1R5cGU7CisJCXBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9IFNjYW5UeXBlOworCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7CisKKwkJLy8gc3RhcnQgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbAorCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IEZpcnN0Q2hhbm5lbChwQWQpOworCisJCS8vIENoYW5nZSB0aGUgc2NhbiBjaGFubmVsIHdoZW4gZGVhbGluZyB3aXRoIENDWCBiZWFjb24gcmVwb3J0CisJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSkKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWw7CisKKwkJLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQkJQIFI0IHRvIDIwTUh6LmxcbiIpKTsKKwkJU2Nhbk5leHRDaGFubmVsKHBBZCk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU2NhblJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNTE1FIEpPSU4gcmVxIHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lSm9pblJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKKwlCU1NfRU5UUlkgICAgKnBCc3M7CisJQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlIRUFERVJfODAyXzExIEhkcjgwMjExOworCU5ESVNfU1RBVFVTICAgTlN0YXR1czsKKwlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVBVQ0hBUiAgICAgICAgcFN1cFJhdGUgPSBOVUxMOworCVVDSEFSICAgICAgICAgU3VwUmF0ZUxlbjsKKwlQVUNIQVIgICAgICAgIHBFeHRSYXRlID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBBU3VwUmF0ZVtdID0gezB4OEMsIDB4MTIsIDB4OTgsIDB4MjQsIDB4YjAsIDB4NDgsIDB4NjAsIDB4NkN9OworCVVDSEFSICAgICAgICAgQVN1cFJhdGVMZW4gPSBzaXplb2YoQVN1cFJhdGUpL3NpemVvZihVQ0hBUik7CisJTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKnBJbmZvID0gKE1MTUVfSk9JTl9SRVFfU1RSVUNUICopKEVsZW0tPk1zZyk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZUpvaW5SZXFBY3Rpb24oQlNTICMlbGQpXG4iLCBwSW5mby0+QnNzSWR4KSk7CisKKyNpZmRlZiBSVDI4NjAKKyAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkgJiYKKyAgICAgICAgKElETEVfT04ocEFkKSkgJiYKKwkJKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJgorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpCisJeworCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOworCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJcEJzcyA9ICZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtwSW5mby0+QnNzSWR4XTsKKworCS8vIHJlY29yZCB0aGUgZGVzaXJlZCBTU0lEICYgQlNTSUQgd2UncmUgd2FpdGluZyBmb3IKKwlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzcy0+QnNzaWQpOworCisJLy8gSWYgQVAncyBTU0lEIGlzIG5vdCBoaWRkZW4sIGl0IGlzIE9LIGZvciB1cGRhdGluZyBzc2lkIHRvIE1sbWVBdXggYWdhaW4uCisJaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQorCXsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4pOworCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBCc3MtPlNzaWRMZW47CisJfQorCisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQnNzLT5Cc3NUeXBlOworCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEJzcy0+Q2hhbm5lbDsKKwlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQnNzLT5DZW50cmFsQ2hhbm5lbDsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgorCWlmICgocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKSAmJgorCQkocEJzcy0+Ykhhc0NvdW50cnlJRSA9PSBUUlVFKSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVswXSwgJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIDIpOworCQlpZiAocEJzcy0+Q291bnRyeVN0cmluZ1syXSA9PSAnSScpCisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBJRE9SOworCQllbHNlIGlmIChwQnNzLT5Db3VudHJ5U3RyaW5nWzJdID09ICdPJykKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IE9ET1I7CisJCWVsc2UKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEJPVEg7CisJCUJ1aWxkQ2hhbm5lbExpc3RFeChwQWQpOworCX0KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7CisKKwkvLyBzd2l0Y2ggY2hhbm5lbCBhbmQgd2FpdGluZyBmb3IgYmVhY29uIHRpbWVyCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgSk9JTl9USU1FT1VUKTsKKworICAgIGRvCisJeworCQlpZiAoKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpICYmCisgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKyAgICAgICAgICAgICB8fCAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisgICAgICAgICAgICApCisJCXsKKwkJCS8vCisJCQkvLyBXZSBjYW4ndCBzZW5kIGFueSBQcm9iZSByZXF1ZXN0IGZyYW1lIHRvIG1lZXQgODAyLjExaC4KKwkJCS8vCisJCQlpZiAocEJzcy0+SGlkZGVuID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQkvLworCQkvLyBzZW5kIHByb2JlIHJlcXVlc3QKKwkJLy8KKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwkJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCXBTdXBSYXRlID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZTsKKwkJCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJCQlwRXh0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGU7CisJCQkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBPdmVyd3JpdGUgU3VwcG9ydCBSYXRlLCBDQ0sgcmF0ZSBhcmUgbm90IGFsbG93ZWQKKwkJCQkvLworCQkJCXBTdXBSYXRlID0gQVN1cFJhdGU7CisJCQkJU3VwUmF0ZUxlbiA9IEFTdXBSYXRlTGVuOworCQkJCUV4dFJhdGVMZW4gPSAwOworCQkJfQorCisJCQlpZiAocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCQllbHNlCisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLAkgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlTGVuLAorCQkJCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICBwU3VwUmF0ZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQkJaWYgKEV4dFJhdGVMZW4pCisJCQl7CisJCQkJVUxPTkcgVG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICBFeHRSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICAgcEV4dFJhdGUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcDsKKwkJCX0KKworCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCX0KKyAgICB9IHdoaWxlIChGQUxTRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU3dpdGNoIHRvIGNoICVkLCBXYWl0IEJFQUNPTiBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQnNzLT5DaGFubmVsLCBwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLCBwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gSk9JTl9XQUlUX0JFQUNPTjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNTE1FIFNUQVJUIFJlcXVlc3Qgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUsIHN0YXJ0aW5nIGFuIElCU1MKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW47CisJQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKworCS8vIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOyAJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCUxBUkdFX0lOVEVHRVIJCQkJVGltZVN0YW1wOworCUJPT0xFQU4gUHJpdmFjeTsKKwlVU0hPUlQgU3RhdHVzOworCisJLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKKwlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCXBWSUUtPkxlbmd0aCA9IDA7CisJVGltZVN0YW1wLnUuTG93UGFydCAgPSAwOworCVRpbWVTdGFtcC51LkhpZ2hQYXJ0ID0gMDsKKworCWlmIChNbG1lU3RhcnRSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgU3NpZCwgJlNzaWRMZW4pKQorCXsKKwkJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkvLworCQkvLyBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4KKwkJLy8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uIFxuIikpOworCQlwQWQtPk1sbWVBdXguQnNzVHlwZSAgICAgICAgICAgPSBCU1NfQURIT0M7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gICAgICAgICAgID0gU3NpZExlbjsKKworCQkvLyBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRAorCQlNYWNBZGRyUmFuZG9tQnNzaWQocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCBcbiIpKTsKKworCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAorCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvICAgID0gQ0FQX0dFTkVSQVRFKDAsMSxQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAxLCAwKTsKKwkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCAgICAgID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCQlwQWQtPk1sbWVBdXguQXRpbVdpbiAgICAgICAgICAgPSBwQWQtPlN0YUNmZy5BdGltV2luOworCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCAgICAgICAgICAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAgICA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworCisJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbik7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCXsKKwkJCVJUTVBVcGRhdGVIVElFKCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksICZwQWQtPk1sbWVBdXguQWRkSHRJbmZvKTsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisJCQkvLyBOb3QgdHVybiBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPSBUUlVFIGhlcmUuCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC1wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPSBUUlVFXG4iKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKKwkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCX0KKwkJLy8gdGVtcG9yYXJpbHkgbm90IHN1cHBvcnQgUU9TIGluIElCU1MKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oY2g9ICVkLHN1cCByYXRlcz0gJWQsIGV4dCByYXRlcz0lZClcbiIsCisJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7CisKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbC5cbiIpKTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIGJlYWNvbiBiYWNrIHdoZW4gc2Nhbm5pbmcKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsCisJCQkJCVNzaWRMZW4sIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBNZXNzYWdlVG9NZTsKKwlDRl9QQVJNICAgICAgICAgQ2ZQYXJtOworCVVTSE9SVCAgICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOworCVBGUkFNRV84MDJfMTEgICBwRnJhbWU7CisJTEFSR0VfSU5URUdFUiAgIFRpbWVTdGFtcDsKKwlVQ0hBUiAgICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgCVN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJICAJU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKKwlVU0hPUlQgCQkJTGVuVklFOworCVVDSEFSCQkJQ2tpcEZsYWc7CisJVUNIQVIJCQlBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOworCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJVUxPTkcJCQkJCQlSYWxpbmtJZTsKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpIEVsZW0tPk1zZzsKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKKwkJCQkJCQkJRWxlbS0+TXNnLAorCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCQkJCUFkZHIyLAorCQkJCQkJCQlCc3NpZCwKKwkJCQkJCQkJU3NpZCwKKwkJCQkJCQkJJlNzaWRMZW4sCisJCQkJCQkJCSZCc3NUeXBlLAorCQkJCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkJCQkmQ2hhbm5lbCwKKwkJCQkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCQkJCSZUaW1lU3RhbXAsCisJCQkJCQkJCSZDZlBhcm0sCisJCQkJCQkJCSZBdGltV2luLAorCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJCSZFcnAsCisJCQkJCQkJCSZEdGltQ291bnQsCisJCQkJCQkJCSZEdGltUGVyaW9kLAorCQkJCQkJCQkmQmNhc3RGbGFnLAorCQkJCQkJCQkmTWVzc2FnZVRvTWUsCisJCQkJCQkJCVN1cFJhdGUsCisJCQkJCQkJCSZTdXBSYXRlTGVuLAorCQkJCQkJCQlFeHRSYXRlLAorCQkJCQkJCQkmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkNraXBGbGFnLAorCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCQkJCQkmRWRjYVBhcm0sCisJCQkJCQkJCSZRYnNzTG9hZCwKKwkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJCSZSYWxpbmtJZSwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZIdENhcGFiaWxpdHksCisJCQkJCQkJCSZBZGRIdEluZm9MZW4sCisJCQkJCQkJCSZBZGRIdEluZm8sCisJCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCQkmTGVuVklFLAorCQkJCQkJCQlwVklFKSkKKwl7CisJCVVMT05HIElkeDsKKwkJQ0hBUiBSc3NpID0gMDsKKworCQlJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCVJzc2kgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5Sc3NpOworCisJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQorCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWlmICgocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKSAmJiAoQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCisJCXsKKwkJCUlkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLEV4dFJhdGUsIEV4dFJhdGVMZW4sICZIdENhcGFiaWxpdHksCisJCQkJCQkgJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsCisJCQkJCQkgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCQkJCUFpcm9uZXRBZGRCZWFjb25SZXBvcnQocEFkLCBJZHgsIEVsZW0pOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKKwkJCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbcEFkLT5Db21tb25DZmcuQ2hhbm5lbExpc3RJZHhdLmJFZmZlY3RlZENoYW5uZWwgPT0gVFJVRSkKKwkJCXsKKwkJCQlVQ0hBUgkJUmVnQ2xhc3M7CisJCQkJUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MihwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmUmVnQ2xhc3MpOworCQkJCVRyaUV2ZW50VGFibGVTZXRFbnRyeShwQWQsICZwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIsIEJzc2lkLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sIFJlZ0NsYXNzLCBDaGFubmVsKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCX0KKwkJfQorCX0KKwkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlZAorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVdoZW4gd2FpdGluZyBqb2luaW5nIHRoZSAoSSlCU1MsIGJlYWNvbiByZWNlaXZlZCBmcm9tIGV4dGVybmFsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIEJzc1R5cGUsIENoYW5uZWwsIE1lc3NhZ2VUb01lLAorCQkJCSAgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE5ld0NoYW5uZWw7CisJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7CisJVVNIT1JUICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOworCUNGX1BBUk0gICAgICAgQ2Y7CisJQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUiAgICAgICAgIEVycDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7CisJVVNIT1JUIAkJICBMZW5WSUU7CisJVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVTSE9SVCAgICAgICAgU3RhdHVzOworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKKwlVTE9ORyAgICAgICAgIElkeDsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlVQ0hBUgkJCUNlbnRyYWxDaGFubmVsOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKKwlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCXBWSUUtPkxlbmd0aCA9IDA7CisgICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisKKwlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKKwkJCQkJCQkJRWxlbS0+TXNnLAorCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCQkJCUFkZHIyLAorCQkJCQkJCQlCc3NpZCwKKwkJCQkJCQkJU3NpZCwKKwkJCQkJCQkJJlNzaWRMZW4sCisJCQkJCQkJCSZCc3NUeXBlLAorCQkJCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkJCQkmQ2hhbm5lbCwKKwkJCQkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCQkJCSZUaW1lU3RhbXAsCisJCQkJCQkJCSZDZiwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJLy8gRGlzcXVhbGlmeSAxMWIgb25seSBhZGhvYyB3aGVuIHdlIGFyZSBpbiAxMWcgb25seSBhZGhvYyBtb2RlCisJCWlmICgoQnNzVHlwZSA9PSBCU1NfQURIT0MpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuKTwgMTIpKQorCQkJcmV0dXJuOworCisJCS8vIEJFQUNPTiBmcm9tIGRlc2lyZWQgQlNTL0lCU1MgZm91bmQuIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlY2lkZSBtb3N0CisJCS8vIEJTUyBwYXJhbWV0ZXJzIGhlcmUuCisJCS8vIFEuIEJ1dCB3aGF0IGhhcHBlbiBpZiB0aGlzIEpPSU4gZG9lc24ndCBjb25jbHVkZSBhIHN1Y2Nlc3NmdWwgQVNTT0NJQVRFSU9OPworCQkvLyAgICBEbyB3ZSBuZWVkIHRvIHJlY2VvdmVyIGJhY2sgYWxsIHBhcmFtZXRlcnMgYmVsb25naW5nIHRvIHByZXZpb3VzIEJTUz8KKwkJLy8gQS4gU2hvdWxkIGJlIG5vdC4gVGhlcmUncyBubyBiYWNrLWRvb3IgcmVjb3ZlciB0byBwcmV2aW91cyBBUC4gSXQgc3RpbGwgbmVlZAorCQkvLyAgICBhIG5ldyBKT0lOLUFVVEgtQVNTT0Mgc2VxdWVuY2UuCisJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIHJlY2VpdmUgZGVzaXJlZCBCRUFDT04gYXQgSm9pbldhaXRCZWFjb24uLi4gQ2hhbm5lbCA9ICVkXG4iLCBDaGFubmVsKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkJLy8gVXBkYXRlIFJTU0kgdG8gcHJldmVudCBObyBzaWduYWwgZGlzcGxheSB3aGVuIGNhcmRzIGZpcnN0IGluaXRpYWxpemVkCisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMAk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMik7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIDw8IDM7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxIDw8IDM7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyIDw8IDM7CisKKwkJCS8vCisJCQkvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIFNTSUQgb25seSBzZXQgdG8gYW55LCB0aGVuIHdlIGNhbiByZWNvcmQgdGhlIGN1cnJlbnQgU1NJRC4KKwkJCS8vIE90aGVyd2lzZSB3aWxsIGNhdXNlIGhpZGRlbiBTU0lEIGFzc29jaWF0aW9uIGZhaWxlZC4KKwkJCS8vCisJCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRMZW4gPT0gMCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7CisJCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBDaGFubmVsKTsKKworCQkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCQl7CisJCQkJCS8vCisJCQkJCS8vIE11bHRpcGxlIFNTSUQgY2FzZSwgdXNlZCBjb3JyZWN0IENhcGFiaWxpdHlJbmZvCisJCQkJCS8vCisJCQkJCUNhcGFiaWxpdHlJbmZvID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uQ2FwYWJpbGl0eUluZm87CisJCQkJfQorCQkJfQorCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQnNzVHlwZTsKKwkJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7CisJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IENoYW5uZWw7CisJCQlwQWQtPk1sbWVBdXguQXRpbVdpbiA9IEF0aW1XaW47CisJCQlwQWQtPk1sbWVBdXguQ2ZwUGVyaW9kID0gQ2YuQ2ZwUGVyaW9kOworCQkJcEFkLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uID0gQ2YuQ2ZwTWF4RHVyYXRpb247CisJCQlwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSA9IFJhbGlua0llOworCisJCQkvLyBDb3B5IEFQJ3Mgc3VwcG9ydGVkIHJhdGUgdG8gTWxtZUF1eCBmb3IgY3JlYXRpbmcgYXNzb2ljYXRpb24gcmVxdWVzdAorCQkJLy8gQWxzbyBmaWx0ZXIgb3V0IG5vdCBzdXBwb3J0ZWQgcmF0ZQorCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKwkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbik7CisKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCAxNik7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IE5ld0V4dENoYW5uZWxPZmZzZXQ7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gSHRDYXBhYmlsaXR5TGVuOworCisJCQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCBodCByYXRlcworCQkJaWYgKCgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQl7CisJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKyAgIAkJCQlSVE1QTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7CisKKwkJCQkvLyBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IHN0b3JlcyBQZWVyIEFQJ3MgMTFuIFJ4IGNhcGFiaWxpdHkKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgSHRDYXBhYmlsaXR5Lk1DU1NldCwgMTYpOworCQkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOworCQkJCWlmIChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkKKwkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID0gVFJVRTsKKwkJCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsICZIdENhcGFiaWxpdHksICZBZGRIdEluZm8pOworCQkJCS8vIENvcHkgQVAgUGFyYW1ldGVyIHRvIFN0YUFjdGl2ZS4gIFRoaXMgaXMgYWxzbyBpbiBMaW5rVXAuCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiEgKE1wZHVEZW5zaXR5PSVkLCBNYXhSQW1wZHVGYWN0b3I9JWQsIEJXPSVkKVxuIiwKKwkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTXBkdURlbnNpdHksIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciwgSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpKTsKKworCQkJCWlmIChBZGRIdEluZm9MZW4gPiAwKQorCQkJCXsKKwkJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47CisJCSAJCQkvLyBDaGVjayBhZ2FpbiB0aGUgQmFuZHdpZHRoIGNhcGFiaWxpdHkgb2YgdGhpcyBBUC4KKwkJIAkJCWlmICgoQWRkSHRJbmZvLkNvbnRyb2xDaGFuID4gMikmJiAoQWRkSHRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykgJiYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkJIAkJCXsKKwkJIAkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbiAtIDI7CisJCSAJCQl9CisJCSAJCQllbHNlIGlmICgoQWRkSHRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkJIAkJCXsKKwkJIAkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbiArIDI7CisJCSAJCQl9CisKKwkJCQkJLy8gQ2hlY2sgRXJyb3IgLgorCQkJCQlpZiAocEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsICE9IENlbnRyYWxDaGFubmVsKQorCQkgCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+QmVhY29uIENlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZC4gTWxtZWF1eCBDZW50cmFsQ2hhbm5lbCA9ICVkXG4iLCBDZW50cmFsQ2hhbm5lbCwgQWRkSHRJbmZvLkNvbnRyb2xDaGFuLCBwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwpKTsKKworCQkgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5DZW50cmFsIENoYW5uZWwgPSAlZCwgQ29udHJvbCBDaGFubmVsID0gJWQsICAuXG4iLCBDZW50cmFsQ2hhbm5lbCwgQWRkSHRJbmZvLkNvbnRyb2xDaGFuKSk7CisKKwkJCQl9CisKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsKKyAgIAkJCQkvLyBUbyBwcmV2ZW50IGVycm9yLCBsZXQgbGVnYWN5IEFQIG11c3QgaGF2ZSBzYW1lIENlbnRyYWxDaGFubmVsIGFuZCBDaGFubmVsLgorCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuID09IDApICYmIChQcmVOSHRDYXBhYmlsaXR5TGVuID09IDApKQorCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPk1sbWVBdXguQ2hhbm5lbDsKKworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7CisJCQl9CisKKwkJCVJUTVBVcGRhdGVNbG1lUmF0ZShwQWQpOworCisJCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCSkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sICZFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIGFmdGVyIEpPSU4sIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWRcbiIsCisJCQkJCQkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7CisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vIFVwZGF0ZSBDa2lwRmxhZworCQkJcEFkLT5TdGFDZmcuQ2tpcEZsYWcgPSBDa2lwRmxhZzsKKworCQkJLy8gS2VlcCBUaW1lU3RhbXAgZm9yIFJlLUFzc29jaWF0aW9uIHVzZWQuCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJCXBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXAgPSBUaW1lU3RhbXA7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKKwkJCXsKKwkJCQkvL1dlIG5lZWQgdG8gY2hhbmdlIG91ciBUeFBvd2VyIGZvciBDQ1ggMi4wIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCisJCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisJCQl9CisJCQllbHNlICAvL1VzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZS4KKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCisJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKwkJLy8gbm90IHRvIG1lIEJFQUNPTiwgaWdub3JlZAorCX0KKwkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlyZWNlaXZlIEJFQUNPTiBmcm9tIHBlZXIKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQmVhY29uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJQ0ZfUEFSTSAgICAgICBDZlBhcm07CisJVUNIQVIgICAgICAgICBTc2lkTGVuLCBNZXNzYWdlVG9NZT0wLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLCBpbmRleD0wOworCVVDSEFSICAgICAgICAgRHRpbUNvdW50PTAsIER0aW1QZXJpb2Q9MCwgQmNhc3RGbGFnPTA7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgQXRpbVdpbiwgQmVhY29uUGVyaW9kOworCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOworCVVTSE9SVCAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcDsKKwlVQ0hBUiAgICAgICAgIEVycDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCVVDSEFSCQkgIENraXBGbGFnOworCVVTSE9SVCAgICAgICAgTGVuVklFOworCVVDSEFSCQkgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKKwlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07CisJUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOworCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKKwlVTE9ORyAgICAgICAgICAgUmFsaW5rSWU7CisJLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLCBQcmVOSHRDYXBhYmlsaXR5TGVuOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisKKworI2lmZGVmIFJBTElOS19BVEUKKyAgICBpZiAoQVRFX09OKHBBZCkpCisgICAgeworCQlyZXR1cm47CisgICAgfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCWlmICghKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQorCQkpKQorCQlyZXR1cm47CisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKyAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKwlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKKwkJCQkJCQkJRWxlbS0+TXNnLAorCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCQkJCUFkZHIyLAorCQkJCQkJCQlCc3NpZCwKKwkJCQkJCQkJU3NpZCwKKwkJCQkJCQkJJlNzaWRMZW4sCisJCQkJCQkJCSZCc3NUeXBlLAorCQkJCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkJCQkmQ2hhbm5lbCwKKwkJCQkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCQkJCSZUaW1lU3RhbXAsCisJCQkJCQkJCSZDZlBhcm0sCisJCQkJCQkJCSZBdGltV2luLAorCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJCSZFcnAsCisJCQkJCQkJCSZEdGltQ291bnQsCisJCQkJCQkJCSZEdGltUGVyaW9kLAorCQkJCQkJCQkmQmNhc3RGbGFnLAorCQkJCQkJCQkmTWVzc2FnZVRvTWUsCisJCQkJCQkJCVN1cFJhdGUsCisJCQkJCQkJCSZTdXBSYXRlTGVuLAorCQkJCQkJCQlFeHRSYXRlLAorCQkJCQkJCQkmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkNraXBGbGFnLAorCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCQkJCQkmRWRjYVBhcm0sCisJCQkJCQkJCSZRYnNzTG9hZCwKKwkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJCSZSYWxpbmtJZSwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZIdENhcGFiaWxpdHksCisJCQkJCQkJCSZBZGRIdEluZm9MZW4sCisJCQkJCQkJCSZBZGRIdEluZm8sCisJCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCQkmTGVuVklFLAorCQkJCQkJCQlwVklFKSkKKwl7CisJCUJPT0xFQU4gaXNfbXlfYnNzaWQsIGlzX215X3NzaWQ7CisJCVVMT05HICAgQnNzaWR4LCBOb3c7CisJCUJTU19FTlRSWSAqcEJzczsKKwkJQ0hBUgkJUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOworCisJCWlzX215X2Jzc2lkID0gTUFDX0FERFJfRVFVQUwoQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKT8gVFJVRSA6IEZBTFNFOworCQlpc19teV9zc2lkID0gU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKT8gVFJVRTpGQUxTRTsKKworCisJCS8vIGlnbm9yZSBCRUFDT04gbm90IGZvciBteSBTU0lECisJCWlmICgoISBpc19teV9zc2lkKSAmJiAoISBpc19teV9ic3NpZCkpCisJCQlyZXR1cm47CisKKwkJLy8gSXQgbWVhbnMgU1RBIHdhaXRzIGRpc2Fzc29jIGNvbXBsZXRlbHkgZnJvbSB0aGlzIEFQLCBpZ25vcmVzIHRoaXMgYmVhY29uLgorCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX1dBSVRfRElTQVNTT0MpCisJCQlyZXR1cm47CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gQ29weSBDb250cm9sIGNoYW5uZWwgZm9yIHRoaXMgQlNTSUQuCisJCWlmIChBZGRIdEluZm9MZW4gIT0gMCkKKwkJCUNoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47CisKKwkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQorCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJLy8KKwkJLy8gSG91c2VrZWVwaW5nICJTc2lkQnNzVGFiIiB0YWJsZSBmb3IgbGF0ZXItb24gUk9BTWluZyB1c2FnZS4KKwkJLy8KKwkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCS8vIGRpc2NvdmVyIG5ldyBBUCBvZiB0aGlzIG5ldHdvcmssIGNyZWF0ZSBCU1MgZW50cnkKKwkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAorCQkJCQkJJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sQWRkSHRJbmZvTGVuLE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsCisJCQkJCQlSZWFsUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCSZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKwkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgLy8gcmV0dXJuIGlmIEJTUyB0YWJsZSBmdWxsCisJCQkJcmV0dXJuOworCisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKworCisKKwkJfQorCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCisJCXsKKwkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KKwkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7CisJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKworCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKKwkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCisJCQkJeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwgTmV3Q2hhbm5lbCkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQkJeworCQkJCURCR1BSSU5UX0VSUigoIlBlZXJCZWFjb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSkpOworCQkJfQorCQl9CisKKwkJLy8gaWYgdGhlIHNzaWQgbWF0Y2hlZCAmIGJzc2lkIHVubWF0Y2hlZCwgd2Ugc2hvdWxkIHNlbGVjdCB0aGUgYnNzaWQgd2l0aCBsYXJnZSB2YWx1ZS4KKwkJLy8gVGhpcyBtaWdodCBoYXBwZW5lZCB3aGVuIHR3byBTVEEgc3RhcnQgYXQgdGhlIHNhbWUgdGltZQorCQlpZiAoKCEgaXNfbXlfYnNzaWQpICYmIEFESE9DX09OKHBBZCkpCisJCXsKKwkJCUlOVAlpOworCisJCQkvLyBBZGQgdGhlIHNhZmVndWFyZCBhZ2FpbnN0IHRoZSBtaXNtYXRjaCBvZiBhZGhvYyB3ZXAgc3RhdHVzCisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLldlcFN0YXR1cykKKwkJCXsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIGNvbGxhcHNlIGludG8gdGhlIEFESE9DIG5ldHdvcmsgd2hpY2ggaGFzIGJpZ2dlciBCU1NJRCB2YWx1ZS4KKwkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl7CisJCQkJaWYgKEJzc2lkW2ldID4gcEFkLT5Db21tb25DZmcuQnNzaWRbaV0pCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gbWVyZ2UgdG8gdGhlIElCU1Mgd2l0aCBiaWdnZXIgQlNTSUQ9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQlCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisJCQkJCUFzaWNEaXNhYmxlU3luYyhwQWQpOworCQkJCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBCc3NpZCk7CisJCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSBCRUFDT04gZnJhbWUgdG8gb24tY2hpcCBtZW1vcnkKKwkJCQkJaXNfbXlfYnNzaWQgPSBUUlVFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoQnNzaWRbaV0gPCBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF07CisJCXBCc3MtPlJzc2kgPSBSZWFsUnNzaTsgICAgICAgLy8gbGFzdGVzdCBSU1NJCisJCXBCc3MtPkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKKworCQkvLworCQkvLyBCRUFDT04gZnJvbSBteSBCU1NJRCAtIGVpdGhlciBJQlNTIG9yIElORlJBIG5ldHdvcmsKKwkJLy8KKwkJaWYgKGlzX215X2Jzc2lkKQorCQl7CisJCQlSWFdJX1NUUlVDCVJ4V0k7CisKKwkJCXBBZC0+U3RhQ2ZnLkR0aW1Db3VudCA9IER0aW1Db3VudDsKKwkJCXBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2QgPSBEdGltUGVyaW9kOworCQkJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKKworCisJCQlSeFdJLlJTU0kwID0gRWxlbS0+UnNzaTA7CisJCQlSeFdJLlJTU0kxID0gRWxlbS0+UnNzaTE7CisJCQlSeFdJLlJTU0kyID0gRWxlbS0+UnNzaTI7CisKKwkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCAmUnhXSSk7CisJCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBXZSBnZXQgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiByZXF1aXJlZAorCQkJCS8vIENoYW5nZWQgdG8gYXBwcm9wcmlhdGUgVHhQb3dlciBMaW1pdCBmb3IgQ2lzbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMKKwkJCQkvLworCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vCisJCQkJLy8gQWlyb25ldENlbGxQb3dlckxpbWl0IGVxdWFsIHRvIDB4RkYgbWVhbnMgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiBub3QgZXhpc3QuCisJCQkJLy8gVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLCB0aGF0IHNldCBmcm9tIFVJLgorCQkJCS8vCisJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJCX0KKworCQkJLy8gYXQgbGVhc3Qgb25lIDExYiBwZWVyIGpvaW5lZC4gZG93bmdyYWRlIHRoZSBNYXhUeFJhdGUgdG8gMTFNYnBzCisJCQkvLyBhZnRlciBsYXN0IDExYiBwZWVyIGxlZnQgZm9yIHNldmVyYWwgc2Vjb25kcywgd2UnbGwgYXV0byBzd2l0Y2ggYmFjayB0byAxMUcgcmF0ZQorCQkJLy8gaW4gTWxtZVBlcmlvZGljRXhlYygpCisJCQlpZiAoQURIT0NfT04ocEFkKSAmJiAoQ0FQX0lTX0lCU1NfT04oQ2FwYWJpbGl0eUluZm8pKSkKKwkJCXsKKwkJCQlCT09MRUFOCWJSZXN0YXJ0OworICAgICAgICAgICAgICAgIEJPT0xFQU4JYm5SZXN0YXJ0OworCisJCQkJYlJlc3RhcnQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBiblJlc3RhcnQgPSBGQUxTRTsKKworCQkJCWRvCisJCQkJeworCQkJCQlpZiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbiA8PSA0KSAmJiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gUkFURV8xMSkpCisJCQkJCXsKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID09IEZBTFNFKQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSAxMWIgcGVlciBqb2luZWQuIGRvd24tZ3JhZGUgdG8gMTFiIFRYIHJhdGVzIFxuIikpOworCQkJCQkJCWJSZXN0YXJ0ID0gVFJVRTsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQkJCQkJCXBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPSBUUlVFOworCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCQkJCQkJQXNpY1NldEVkY2FQYXJtKHBBZCwgTlVMTCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIHRoaXMgdGltZXN0YW1wIGlzIGZvciBNbG1lUGVyaW9kaWNFeGVjKCkgdG8gY2hlY2sgaWYgYWxsIDExQiBwZWVycyBoYXZlIGxlZnQKKwkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3QxMWJCZWFjb25SeFRpbWUgPSBOb3c7CisJCQkJCQlicmVhazsKKwkJCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQkvLyBVcGRhdGUgSHQgUGh5LgorCQkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJCXsKKwkJCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCisJCQkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKKwkJCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCkKKwkJCQkJCQlBZGhvY1R1cm5PblFvcyhwQWQpOworCisJCQkJCQkvLyBIYW5kbGUgcmF0ZSBzd2l0Y2ggaXNzdWUgd2hlbiBBZGhvYyBtb2RlCisJCQkJCQlpZiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbiA+PSA4KSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9PSBGQUxTRSkKKwkJCQkJCQl7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSAxMWcgcGVlciBqb2luZWQuIGRvd24tZ3JhZGUgdG8gMTFnIFRYIHJhdGVzIFxuIikpOworCQkJCQkJCQliUmVzdGFydCA9IFRSVUU7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIFN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBUUlVFOworCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAxMWcgcGVlcnMgaGF2ZSBsZWZ0CisJCQkJCQkJcEFkLT5TdGFDZmcuTGFzdDExZ0JlYWNvblJ4VGltZSA9IE5vdzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKCFwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkICYmCisJCQkJCQkJCSAhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgorCQkJCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkgJiYKKwkJCQkJCQkJIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkpCisJCQkJCQl7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID09IEZBTFNFKQorCQkJCQkJCXsKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gVFJVRTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJCQkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQorCQkJCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7CisKKwkJCQkJCQkJUlRNUENoZWNrSHQocEFkLCBFbGVtLT5XY2lkLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8pOworCQkJCQkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisJCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKKwkJCQkJCQkJYlJlc3RhcnQgPSBUUlVFOworCQkJCQkJCQliblJlc3RhcnQgPSBUUlVFOworCQkJCQkJCX0KKwkJCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAyME1IeiBOIHBlZXJzIGhhdmUgbGVmdAorCQkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3QyME5CZWFjb25SeFRpbWUgPSBOb3c7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJCXsKKwkJCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisJCQkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7CisJCQkJCX0KKwkJCQl9d2hpbGUgKEZBTFNFKTsKKworCQkJCS8vIElmIHBlZXIgQWRob2MgaXMgbGVnYWN5IG1vZGUsIEkgZG9uJ3QgbmVlZCB0byBjYWxsIE1sbWVVcGRhdGVIdFR4UmF0ZXMgbm8gbWF0dGVyIEkgc3VwcG9ydCBIVCBvciBub3QKKwkJCQlpZiAoKGJSZXN0YXJ0ID09IFRSVUUpICYmIChiblJlc3RhcnQgPT0gRkFMU0UpKQorCQkJCXsKKwkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKwkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJZWxzZSBpZiAoKGJSZXN0YXJ0ID09IFRSVUUpICYmIChiblJlc3RhcnQgPT0gVFJVRSkpCisJCQkJeworCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCBCU1MwKTsKKwkJCQkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJLy8gQXQgbGVhc3QgYW5vdGhlciBwZWVyIGluIHRoaXMgSUJTUywgZGVjbGFyZSBNZWRpYVN0YXRlIGFzIENPTk5FQ1RFRAorCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCXsKKwkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKwkgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCQkJCQkvLyAyMDAzLzAzLzEyIC0gam9obgorCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQKKwkJCQkJLy8gInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLgorCQkJCQkvLworCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJCQkJeworCQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkJCQkmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJCSZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSZWFsUnNzaSwgVGltZVN0YW1wLCAwLAorCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJCQl9CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRC5cbiIpKTsKKwkJCQl9CisKKwkJCQkvLyBBZC1ob2MgbW9kZSBpcyB1c2luZyBNQUMgYWRkcmVzcyBhcyBCQSBzZXNzaW9uLiBTbyB3ZSBuZWVkIHRvIGNvbnRpbnVvdXNseSBmaW5kIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uIGJ5IHJlY2VpdmluZyBiZWFjb24uCisJCQkJLy8gVG8gcHJldmVudCBhbHdheXMgY2hlY2sgdGhpcywgd2UgdXNlIHdjaWQgPT0gUkVTRVJWRURfV0NJRCB0byByZWNvZ25pemUgaXQgYXMgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24uCisJCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpCisJCQkJeworCQkJCQlVQ0hBUglpZHg7CisJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisJCQkJCS8vIGxvb2sgdXAgdGhlIGV4aXN0aW5nIHRhYmxlCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgQWRkcjIpOworCQkJCQlpZiAocEVudHJ5ID09IE5VTEwpCisJCQkJCXsKKwkJCQkJCS8vIEFub3RoZXIgYWRob2Mgam9pbmluZywgYWRkIHRvIG91ciBNQUMgdGFibGUuCisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgQWRkcjIsIEJTUzAsIEZBTFNFKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5Tc3QgPSBTU1RfQVNTT0M7CisJCQkJCQkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJCQkJCS8vIEFmdGVyIEluc2VydEVudHJ5LCBXcml0ZSB0byBBU0lDIG9uLWNoaXAgdGFibGUuCisJCQkJCQkJUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIEJTUzAsIGlkeCwgcEVudHJ5KTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAleDoleDoleDoleDoleDoleCAgam9pbiBpbi5FbnRyeT0lZFxuIiwgQWRkcjJbMF0sQWRkcjJbMV0sQWRkcjJbMl0sQWRkcjJbM10sQWRkcjJbNF0sQWRkcjJbNV0sIHBFbnRyeS0+QWlkKSk7CisKKwkJCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEh0Q2FwYWJpbGl0eUxlbiA8PSAwKQorCSAgICAgICAgICAgICAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuIDw9IDQpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKKwkgICAgICAgIAkJCQkJeworCSAgICAgICAgCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCSAgICAgICAgCQkJCQl9CisJICAgICAgICAJCQkJCWVsc2UKKwkgICAgICAgIAkJCQkJeworCSAgICAgICAgCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkgICAgICAgIAkJCQkJfQorCQkJCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQkJCQkJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKKwkJCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKwkgICAgICAgICAgICAgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kQXNzb2NJRXNUb1dwYVN1cHBsaWNhbnQocEFkKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ19FVkVOVF9GTEFHOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgICAgICAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7CisKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisJICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJCUJPT0xFQU4gYlVzZVNob3J0U2xvdCwgYlVzZUJHUHJvdGVjdGlvbjsKKworCQkJCS8vIGRlY2lkZSB0byB1c2UvY2hhbmdlIHRvIC0KKwkJCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKKwkJCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KKwkJCQkvLyAgICAgIDMuIHNob3J0IHByZWFtYmxlCisKKwkJCQkvL2JVc2VTaG9ydFNsb3QgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSAmJiBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7CisJCQkJYlVzZVNob3J0U2xvdCA9IENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKKwkJCQlpZiAoYlVzZVNob3J0U2xvdCAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkKKwkJCQkJQXNpY1NldFNsb3RUaW1lKHBBZCwgYlVzZVNob3J0U2xvdCk7CisKKwkJCQliVXNlQkdQcm90ZWN0aW9uID0gKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAxKSB8fCAgICAvLyBhbHdheXMgdXNlCisJCQkJCQkJCSAgICgocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDApICYmIEVSUF9JU19VU0VfUFJPVEVDVElPTihFcnApKTsKKworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIGFsd2F5cyBubyBCRyBwcm90ZWN0aW9uIGluIEEtYmFuZC4gZmFsc2VseSBoYXBwZW5lZCB3aGVuIHN3aXRjaGluZyBBL0cgYmFuZCB0byBhIGR1YWwtYmFuZCBBUAorCQkJCQliVXNlQkdQcm90ZWN0aW9uID0gRkFMU0U7CisKKwkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbiAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQl7CisJCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uKQorCQkJCQl7CisJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLEZBTFNFLChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxUUlVFLChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpKTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiU1lOQyAtIEFQIGNoYW5nZWQgQi9HIHByb3RlY3Rpb24gdG8gJWRcbiIsIGJVc2VCR1Byb3RlY3Rpb24pKTsKKwkJCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkvLyBjaGVjayBIdCBwcm90ZWN0aW9uIG1vZGUuIGFuZCBhZGhlcmUgdG8gdGhlIE5vbi1HRiBkZXZpY2UgaW5kaWNhdGlvbiBieSBBUC4KKwkJCQlpZiAoKEFkZEh0SW5mb0xlbiAhPSAwKSAmJgorCQkJCQkoKEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSB8fAorCQkJCQkoQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7CisJCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7CisJCQkJCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCisJCQkJeworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlZCBOIE9wZXJhaW9uTW9kZSB0byAlZFxuIiwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSkpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkgJiYKKwkJCQkJRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoRXJwKSkKKwkJCQl7CisJCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgZm9yY2VkIHRvIHVzZSBMT05HIHByZWFtYmxlXG4iKSk7CisJCQkJfQorCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgICAgJiYKKwkJCQkJKEVkY2FQYXJtLmJWYWxpZCA9PSBUUlVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKwkJCQkJKEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAhPSBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlIEVEQ0EgcGFyYW1ldGVycyhmcm9tICVkIHRvICVkKVxuIiwKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50LAorCQkJCQkJRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSk7CisJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsICZFZGNhUGFybSk7CisJCQkJfQorCisJCQkJLy8gY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICZRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCisJCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgc3VwcG9ydCBwb3dlci1zYXZpbmcgZmVhdHVyZQorCQkJaWYgKChJTkZSQV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpKSB8fCAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpCisJCQl7CisJCQkJVUNIQVIgRnJlZU51bWJlcjsKKwkJCQkvLyAgMS4gQVAgaGFzIGJhY2tsb2dnZWQgdW5pY2FzdC10by1tZSBmcmFtZSwgc3RheSBBV0FLRSwgc2VuZCBQU1BPTEwKKwkJCQkvLyAgMi4gQVAgaGFzIGJhY2tsb2dnZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZSBhbmQgd2Ugd2FudCB0aG9zZSBmcmFtZXMsIHN0YXkgQVdBS0UKKwkJCQkvLyAgMy4gd2UgaGF2ZSBvdXRnb2luZyBmcmFtZXMgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLCBiZXR0ZXIgc3RheSBBV0FLRQorCQkJCS8vICA0LiBQc20gY2hhbmdlIHRvIFBXUl9TQVZFLCBidXQgQVAgbm90IGJlZW4gaW5mb3JtZWQgeWV0LCB3ZSBiZXR0ZXIgc3RheSBBV0FLRQorCQkJCS8vICA1LiBvdGhlcndpc2UsIHB1dCBQSFkgYmFjayB0byBzbGVlcCB0byBzYXZlIGJhdHRlcnkuCisJCQkJaWYgKE1lc3NhZ2VUb01lKQorCQkJCXsKKyNpZmRlZiBSVDI4NjAKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworCQkJCQkJLy8gVHVybiBjbGsgdG8gODBNaHouCisJCQkJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJgorCQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKEJjYXN0RmxhZyAmJiAoRHRpbUNvdW50ID09IDApICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSkKKwkJCQl7CisjaWZkZWYgUlQyODYwCisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKwkJCQkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJfHwKKwkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKKwkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKKwkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfQkssIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX1ZJLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVk8sIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9NR01ULCBNR01UX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKKwkJCQl7CisJCQkJCS8vIFRPRE86IGNvbnNpZGVyIHNjaGVkdWxlZCBIQ0NBLiBtaWdodCBub3QgYmUgcHJvcGVyIHRvIHVzZSB0cmFkaXRpb25hbCBEVElNLWJhc2VkIHBvd2VyLXNhdmluZyBzY2hlbWUKKwkJCQkJLy8gY2FuIHdlIGNoZWF0IGhlcmUgKGkuZS4ganVzdCBjaGVjayBNR01UICYgQUNfQkUpIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2U/CisjaWZkZWYgUlQyODYwCisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKwkJCQkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlVU0hPUlQgTmV4dER0aW0gPSBEdGltQ291bnQ7CisKKwkJCQkJaWYgKE5leHREdGltID09IDApCisJCQkJCQlOZXh0RHRpbSA9IER0aW1QZXJpb2Q7CisKKwkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKKwkJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBOZXh0RHRpbTsKKworCQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQkJCXsKKwkJCQkJCUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gbm90IG15IEJTU0lELCBpZ25vcmUgaXQKKwl9CisJLy8gc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZSB0aGlzIGZyYW1lCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVjZWl2ZSBQUk9CRSBSRVEgZnJvbSByZW1vdGUgcGVlciB3aGVuIG9wZXJhdGluZyBpbiBJQlNTIG1vZGUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJQcm9iZVJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCVVDSEFSICAgICAgICAgU3NpZExlbjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlVQ0hBUgkJICBIdExlbiwgQWRkSHRMZW4sIE5ld0V4dExlbjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlIRUFERVJfODAyXzExIFByb2JlUnNwSGRyOworCU5ESVNfU1RBVFVTICAgTlN0YXR1czsKKwlQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworCUxBUkdFX0lOVEVHRVIgRmFrZVRpbWVzdGFtcDsKKwlVQ0hBUiAgICAgICAgIERzTGVuID0gMSwgSWJzc0xlbiA9IDI7CisJVUNIQVIgICAgICAgICBMb2NhbEVycEllWzNdID0ge0lFX0VSUCwgMSwgMH07CisJQk9PTEVBTiAgICAgICBQcml2YWN5OworCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm87CisJVUNIQVIJCSAgUlNOSWUgPSBJRV9XUEE7CisKKwlpZiAoISBBREhPQ19PTihwQWQpKQorCQlyZXR1cm47CisKKwlpZiAoUGVlclByb2JlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCBTc2lkLCAmU3NpZExlbikpCisJeworCQlpZiAoKFNzaWRMZW4gPT0gMCkgfHwgU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKKwkJeworCQkJLy8gYWxsb2NhdGUgYW5kIHNlbmQgb3V0IFByb2JlUnNwIGZyYW1lCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQlyZXR1cm47CisKKwkJCS8vcEFkLT5TdGFDZmcuQXRpbVdpbiA9IDA7ICAvLyA/Pz8/Pz8KKworCQkJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKKwkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwkJCUNhcGFiaWxpdHlJbmZvID0gQ0FQX0dFTkVSQVRFKDAsIDEsIFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDAsIDApOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAmUHJvYmVSc3BIZHIsCisJCQkJCQkJICBUSU1FU1RBTVBfTEVOLCAgICAgICAgICAgICAgICAmRmFrZVRpbWVzdGFtcCwKKwkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCisJCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgICAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0llLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0llLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NMZW4sCisJCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4pCisJCQl7CisJCQkJVUxPTkcgdG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICZ0bXAsCisJCQkJCQkJCSAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxFcnBJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLAorCQkJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sICAgICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisJCQl9CisKKwkJCS8vIElmIGFkaG9jIHNlY3J1aXR5IGlzIHNldCBmb3IgV1BBLU5vbmUsIGFwcGVuZCB0aGUgY2lwaGVyIHN1aXRlIElFCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCXsKKwkJCQlVTE9ORyB0bXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgCSZ0bXAsCisJCQkJCQkgIAkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkllLAorCQkJCQkJICAJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAJJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkJCSAgCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAgICAgIAlwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJCQkgIAkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJCUh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSk7CisJCQkJQWRkSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKwkJCQlOZXdFeHRMZW4gPSAxOworCQkJCS8vTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBJRSBpcyBpbmNsdWRlZCBpbiBCZWFjb24sIFByb2JlIFJzcCBvciBjaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgRnJhbWUKKwkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkSHRJbmZvSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdExlbiwKKwkJCQkJCQkJIHNpemVvZihBRERfSFRfSU5GT19JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZXdFeHRDaGFuSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZXdFeHRMZW4sCisJCQkJCQkJCSBzaXplb2YoTkVXX0VYVF9DSEFOX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCX0KKwkJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCX0KKwl9Cit9CisKK1ZPSUQgQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvblxuIikpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTY2FuIHRpbWVvdXQgcHJvY2VkdXJlLiBiYXNpY2FsbHkgYWRkIGNoYW5uZWwgaW5kZXggYnkgMSBhbmQgcmVzY2FuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTY2FuVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBOZXh0Q2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKworCS8vIE9ubHkgb25lIGNoYW5uZWwgc2Nhbm5lZCBmb3IgQ0lTQ08gYmVhY29uIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkgfHwKKwkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8CisJCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkgfHwKKwkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkpCisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKKworCS8vIHRoaXMgcm91dGluZSB3aWxsIHN0b3AgaWYgcEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMAorCVNjYW5OZXh0Q2hhbm5lbChwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBWU5DIC0gSW52YWxpZFN0YXRlV2hlblNjYW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkU3RhdGVXaGVuSm9pbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkU3RhdGVXaGVuU3RhcnQoc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVQc1BvbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisjaWZkZWYgUkFMSU5LX0FURQorICAgIGlmIChBVEVfT04ocEFkKSkKKyAgICB7CisJCXJldHVybjsKKyAgICB9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKwlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKKyAgICAJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCAoUFVDSEFSKSZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVByb2JlUmVxdWVzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlORElTX1NUQVRVUyAgICAgTlN0YXRlOworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJSEVBREVSXzgwMl8xMSAgIEhkcjgwMjExOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZm9yY2Ugb3V0IGEgUHJvYmVSZXF1ZXN0IC4uLlxuIikpOworCisJTlN0YXRlID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdGUgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCisJCS8vIHRoaXMgUHJvYmVSZXF1ZXN0IGV4cGxpY2l0bHkgc3BlY2lmeSBTU0lEIHRvIHJlZHVjZSB1bndhbnRlZCBQcm9iZVJlc3BvbnNlCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAgICZIZHI4MDIxMSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgICAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwl9CisKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSCQlFQ2hhbm5lbFsxMV07CisJVUNIQVIJCWksIGosIGs7CisJVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7CisKKwlSVE1QWmVyb01lbW9yeShFQ2hhbm5lbCwgMTEpOworCWkgPSAwOworCS8vIEZpbmQgdXBwZXIgY2hhbm5lbCBhbmQgbG93ZXIgY2hhbm5lbC4KKwlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJTG93ZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwl7CisJCVVwcGVyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworCQlMb3dlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCX0KKwllbHNlCisJeworCQlyZXR1cm47CisJfQorCisJLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYmVsb3cgbG93ZXIgY2hhbm5lbC4uCisJaWYgKExvd2VyQ2hhbm5lbCA+IDEpCisJeworCQlFQ2hhbm5lbFswXSA9IExvd2VyQ2hhbm5lbCAtIDE7CisJCWkgPSAxOworCQlpZiAoTG93ZXJDaGFubmVsID4gMikKKwkJeworCQkJRUNoYW5uZWxbMV0gPSBMb3dlckNoYW5uZWwgLSAyOworCQkJaSA9IDI7CisJCQlpZiAoTG93ZXJDaGFubmVsID4gMykKKwkJCXsKKwkJCQlFQ2hhbm5lbFsyXSA9IExvd2VyQ2hhbm5lbCAtIDM7CisJCQkJaSA9IDM7CisJCQl9CisJCX0KKwl9CisJLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYmV0d2VlbiAgbG93ZXIgY2hhbm5lbCBhbmQgdXBwZXIgY2hhbm5lbC4KKwlmb3IgKGsgPSBMb3dlckNoYW5uZWw7ayA8IFVwcGVyQ2hhbm5lbDtrKyspCisJeworCQlFQ2hhbm5lbFtpXSA9IGs7CisJCWkrKzsKKwl9CisJLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYWJvdmUgdXBwZXIgY2hhbm5lbC4uCisJaWYgKExvd2VyQ2hhbm5lbCA8IDExKQorCXsKKwkJRUNoYW5uZWxbaV0gPSBVcHBlckNoYW5uZWwgKyAxOworCQlpKys7CisJCWlmIChMb3dlckNoYW5uZWwgPCAxMCkKKwkJeworCQkJRUNoYW5uZWxbaV0gPSBMb3dlckNoYW5uZWwgKyAyOworCQkJaSsrOworCQkJaWYgKExvd2VyQ2hhbm5lbCA8IDkpCisJCQl7CisJCQkJRUNoYW5uZWxbaV0gPSBMb3dlckNoYW5uZWwgKyAzOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCX0KKwkvLworCWZvciAoaiA9IDA7aiA8IGk7aisrKQorCXsKKwkJZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCisJCXsKKwkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gRUNoYW5uZWxbal0pCisJCQl7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtrXS5iRWZmZWN0ZWRDaGFubmVsID0gVFJVRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiBFZmZlY3RlZENoYW5uZWwoID0lZClcbiIsIEVDaGFubmVsW2pdKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitCT09MRUFOIFNjYW5SdW5uaW5nKAorCQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlyZXR1cm4gKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU0NBTl9MSVNURU4pID8gVFJVRSA6IEZBTFNFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS93cGEuYwpAQCAtMCwwICsxLDIwODYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJd3BhLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKYW4JTGVlCQkwMy0wNy0yMgkJSW5pdGlhbAorCVBhdWwgTGluCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKyNkZWZpbmUJCVdQQVJTTklFCTB4ZGQKKyNkZWZpbmUJCVdQQTJSU05JRQkweDMwCisKKy8vZXh0ZXJuIFVDSEFSIEJJVDhbXTsKK1VDSEFSCUNpcGhlcldwYVBza1RraXBbXSA9IHsKKwkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMgkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyV3BhUHNrVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyV3BhUHNrVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyV3BhUHNrQWVzW10gPSB7CisJCTB4REQsIDB4MTYsIAkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlcldwYVBza0Flc0xlbiA9IChzaXplb2YoQ2lwaGVyV3BhUHNrQWVzKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTVtdID0geworCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwgLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1aWNhc3QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDAgIC8vIEF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDaXNjb0NDS00pIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRbXSA9IHsKKwkJMHhERCwgMHgxOCwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsIC8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdWljYXN0CisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDQwLCAweDk2LCAweDAwLAorCQkweDI4LCAweDAwLy8gQXV0aGVudGljYXRpb24KKwkJfTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDaXNjb0NDS00yNCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDQ1hUa2lwW10gPSB7CisJCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlQ0NYVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDQ1hUa2lwKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDQ1hfTExDX0hEUltdID0gezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDJ9OworVUNIQVIJTExDX05PUk1BTFtdID0gezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCitVQ0hBUglFQVBPTF9GUkFNRVtdID0gezB4ODgsIDB4OEV9OworCitCT09MRUFOIENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJT1VUCVVDSEFSCQkJKk9mZnNldCk7CisKK3ZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2xhc3NpZnkgV1BBIEVBUCBtZXNzYWdlIHR5cGUKKworCUFyZ3VtZW50czoKKwkJRUFQVHlwZQkJVmFsdWUgb2YgRUFQIG1lc3NhZ2UgdHlwZQorCQlNc2dUeXBlCQlJbnRlcm5hbCBNZXNzYWdlIGRlZmluaXRpb24gZm9yIE1MTUUgc3RhdGUgbWFjaGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCQlGb3VuZCBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKKwkJRkFMU0UJCU5vIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlBbGwgdGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHdwYS5oCisJCUZvciBzdXBwbGljYW50LCB0aGVyZSBpcyBvbmx5IEVBUE9MIEtleSBtZXNzYWdlIGF2YWxpYWJsZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglXcGFNc2dUeXBlU3Vic3QoCisJSU4JVUNIQVIJRUFQVHlwZSwKKwlPVVQJSU5UCQkqTXNnVHlwZSkKK3sKKwlzd2l0Y2ggKEVBUFR5cGUpCisJeworCQljYXNlIEVBUFBhY2tldDoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUFBhY2tldDsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MU3RhcnQ6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTFN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xMb2dvZmY6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTExvZ29mZjsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MS2V5OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xLZXk7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTEFTRkFsZXJ0OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xBU0ZBbGVydDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlhc3NvY2lhdGlvbglzdGF0ZSBtYWNoaW5lIGluaXQsCWluY2x1ZGluZyBzdGF0ZQl0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisJUGFyYW1ldGVyczoKKwkJUyAtCXBvaW50ZXIJdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFdwYVBza1N0YXRlTWFjaGluZUluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JU1RBVEVfTUFDSElORSAqUywKKwlPVVQJU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLAlUcmFucywgTUFYX1dQQV9QU0tfU1RBVEUsIE1BWF9XUEFfUFNLX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBXUEFfUFNLX0lETEUsIFdQQV9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFNLX0lETEUsIE1UMl9FQVBPTEtleSwgKFNUQVRFX01BQ0hJTkVfRlVOQylXcGFFQVBPTEtleUFjdGlvbik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcwlzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uLgorCQlXaGVuIHJlY2VpdmluZyBFQVBPTCBwYWNrZXRzIHdoaWNoIGlzICBmb3IgODAyLjF4IGtleSBtYW5hZ2VtZW50LgorCQlVc2UJYm90aCBpbglXUEEsIGFuZCBXUEFQU0sJY2FzZS4KKwkJSW4gdGhpcwlmdW5jdGlvbiwgZnVydGhlciBkaXNwYXRjaCB0byBkaWZmZXJlbnQJZnVuY3Rpb25zIGFjY29yZGluZwl0byB0aGUgcmVjZWl2ZWQJcGFja2V0LgkgMyBjYXRlZ29yaWVzIGFyZSA6CisJCSAgMS4gIG5vcm1hbCA0LXdheSBwYWlyd2lzZWtleSBhbmQgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlCisJCSAgMi4gIE1JQyBlcnJvcgkoQ291bnRlcm1lYXN1cmVzIGF0dGFjaykgIHJlcG9ydCBwYWNrZXQJZnJvbSBTVEEuCisJCSAgMy4gIFJlcXVlc3QgZm9yIHBhaXJ3aXNlL2dyb3VwIGtleSB1cGRhdGUJZnJvbSBTVEEKKwlSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFdwYUVBUE9MS2V5QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKKworeworCUlOVCAgICAgICAgICAgICBNc2dUeXBlID0gRUFQT0xfTVNHX0lOVkFMSUQ7CisJUEtFWV9ERVNDUklQVEVSIHBLZXlEZXNjOworCVBIRUFERVJfODAyXzExICBwSGVhZGVyOyAvL3JlZAorCVVDSEFSICAgICAgICAgICBaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSIEVhcG9sVnI7CisJS0VZX0lORk8JCXBlZXJLZXlJbmZvOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tLS0+IFdwYUVBUE9MS2V5QWN0aW9uXG4iKSk7CisKKwkvLyBHZXQgODAyLjExIGhlYWRlciBmaXJzdAorCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIEdldCBFQVBvTC1LZXkgRGVzY3JpcHRvcgorCXBLZXlEZXNjID0gKFBLRVlfREVTQ1JJUFRFUikgJkVsZW0tPk1zZ1soTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcEtleURlc2MtPktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykpOworCisKKwkvLyAxLiBDaGVjayBFQVBPTCBmcmFtZSB2ZXJzaW9uIGFuZCB0eXBlCisJRWFwb2xWcgk9IChVQ0hBUikgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErTEVOR1RIXzgwMl8xX0hdOworCisgICAgaWYgKCgoRWFwb2xWciAhPSBFQVBPTF9WRVIpICYmIChFYXBvbFZyICE9IEVBUE9MX1ZFUjIpKSB8fCAoKHBLZXlEZXNjLT5UeXBlICE9IFdQQTFfS0VZX0RFU0MpICYmIChwS2V5RGVzYy0+VHlwZSAhPSBXUEEyX0tFWV9ERVNDKSkpCisJeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXkgZGVzY3JpcHRlciBkb2VzIG5vdCBtYXRjaCB3aXRoIFdQQSBydWxlXG4iKSk7CisJCQlyZXR1cm47CisJfQorCisJLy8gRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIKKwkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwlpZigoUlRNUENvbXBhcmVNZW1vcnkocEtleURlc2MtPlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCisJCShSVE1QQ29tcGFyZU1lbW9yeShwS2V5RGVzYy0+UmVwbGF5Q291bnRlciwgWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgICBSZXBsYXlDb3VudGVyIG5vdCBtYXRjaCAgIFxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJvY2VzcyBXUEEyUFNLIGZyYW1lCisJaWYocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwl7CisJCWlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDFcbiIpKTsKKwkJfSBlbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCAgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18zOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAzXG4iKSk7CisJCX0gZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5FS0RfREwgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9HUk9VUF9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IEdyb3VwIE1lc3NhZ2UgMVxuIikpOworCQl9CisKKwkJLy8gV2Ugd2lsbCBhc3N1bWUgbGluayBpcyB1cCAoYXNzb2Mgc3VjZWVzcyBhbmQgcG9ydCBub3Qgc2VjdXJlZCkuCisJCS8vIEFsbCBzdGF0ZSBoYXMgdG8gYmUgYWJsZSB0byBwcm9jZXNzIG1lc3NhZ2UgZnJvbSBwcmV2aW91cyBzdGF0ZQorCQlzd2l0Y2gocEFkLT5TdGFDZmcuV3BhU3RhdGUpCisJCXsKKwkJY2FzZSBTU19TVEFSVDoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfTVNHXzM6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJV3BhMlBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX0dST1VQOgkJLy8gV2hlbiBkb2luZyBncm91cCBrZXkgZXhjaGFuZ2UKKwkJY2FzZSBTU19GSU5JU0g6CQkJLy8gVGhpcyBoYXBwZW5lZCB3aGVuIHVwZGF0ZSBncm91cCBrZXkKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCSAgICAvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCSAgICAvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCQlXcGEyUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCQl7CisJCQkJV3BhR3JvdXBNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJLy8gUHJvY2VzcyBXUEFQU0sgRnJhbWUKKwkvLyBDbGFzc2lmeSBtZXNzYWdlIFR5cGUsIGVpdGhlciBwYWlyd2lzZSBtZXNzYWdlIDEsIDMsIG9yIGdyb3VwIG1lc3NhZ2UgMSBmb3Igc3VwcGxpY2FudAorCWVsc2UgaWYocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorCXsKKwkJaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uS2V5SW5kZXggPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAxXG4iKSk7CisJCX0KKwkJZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlJbmRleCA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDNcbiIpKTsKKwkJfQorCQllbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IEdST1VQS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ICE9IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfR1JPVVBfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBHcm91cCBNZXNzYWdlIDFcbiIpKTsKKwkJfQorCisJCS8vIFdlIHdpbGwgYXNzdW1lIGxpbmsgaXMgdXAgKGFzc29jIHN1Y2Vlc3MgYW5kIHBvcnQgbm90IHNlY3VyZWQpLgorCQkvLyBBbGwgc3RhdGUgaGFzIHRvIGJlIGFibGUgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gcHJldmlvdXMgc3RhdGUKKwkJc3dpdGNoKHBBZC0+U3RhQ2ZnLldwYVN0YXRlKQorCQl7CisJCWNhc2UgU1NfU1RBUlQ6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfTVNHXzM6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQlXcGFQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9HUk9VUDoJCS8vIFdoZW4gZG9pbmcgZ3JvdXAga2V5IGV4Y2hhbmdlCisJCWNhc2UgU1NfRklOSVNIOgkJCS8vIFRoaXMgaGFwcGVuZWQgd2hlbiB1cGRhdGUgZ3JvdXAga2V5CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQkJLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQlXcGFQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCQkvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKwkJCQlXcGFHcm91cE1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX0ZJTklTSDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0tLSBXcGFFQVBPTEtleUFjdGlvblxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgNC13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYVBhaXJNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVVDSEFSCQkJCSptcG9vbCwgKlBUSywgKmRpZ2VzdDsKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzE7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDI1Nik7CisKKwlpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gUFRLIExlbiA9IDgwLgorCVBUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChQVEsgKyA4MCwgNCk7CisKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBQcm9jZXNzIG1lc3NhZ2UgMSBmcm9tIGF1dGhlbnRpY2F0b3IKKwlwTXNnMSA9IChQRUFQT0xfUEFDS0VUKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwkvLyAxLiBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzEtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyAyLiBTYXZlIEFOb25jZQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyBHZW5lcmF0ZSByYW5kb20gU05vbmNlCisJR2VuUmFuZG9tKHBBZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5TdGFDZmcuU05vbmNlKTsKKworCS8vIENhbGMgUFRLKEFOb25jZSwgU05vbmNlKQorCVdwYUNvdW50UFRLKHBBZCwKKwkJcEFkLT5TdGFDZmcuUE1LLAorCQlwQWQtPlN0YUNmZy5BTm9uY2UsCisJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQlwQWQtPlN0YUNmZy5TTm9uY2UsCisJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCVBUSywKKwkJTEVOX1BUSyk7CisKKwkvLyBTYXZlIGtleSB0byBQVEsgZW50cnkKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIFBUSywgTEVOX1BUSyk7CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gTWVzc2FnZSAyIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCS8vCisJLy8gTWVzc2FnZSAyIGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCS8vIDEuIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOworCX0KKworCS8vIGZpbGwgaW4gRGF0YSBNYXRlcmlhbCBhbmQgaXRzIGxlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0gPSBJRV9XUEE7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVsyXSwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyBQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdOworCisJLy8gVXBkYXRlIEtleSBsZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCS8vIDIuIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIDMuIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy9Db252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKworCS8vIDQuIEZpbGwgU05vbmNlCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5Tm9uY2UsIHBBZC0+U3RhQ2ZnLlNOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIDUuIEtleSBSZXBsYXkgQ291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIFNlbmQgRUFQT0woMCwgMSwgMCwgMCwgMCwgUCwgMCwgU05vbmNlLCBNSUMsIFJTTl9JRSkKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSAyCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCQlyZXR1cm47CisJfQorCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gNi4gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CS8vIFRLSVAKKwkJaG1hY19tZDUoUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJLy9oZXhfZHVtcCgiTUlDIiwgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1zZyAyIHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2cxQWN0aW9uIDwtLS0tLVxuIikpOworfQorCitWT0lEIFdwYTJQYWlyTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlVQ0hBUgkJCQkqbXBvb2wsICpQVEssICpkaWdlc3Q7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cxOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMjU2KTsKKworCWlmIChtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBQVEsgTGVuID0gODAuCisJUFRLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKFBUSyArIDgwLCA0KTsKKworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIFByb2Nlc3MgbWVzc2FnZSAxIGZyb20gYXV0aGVudGljYXRvcgorCQlwTXNnMSA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwkvLyAxLiBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzEtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyAyLiBTYXZlIEFOb25jZQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyBHZW5lcmF0ZSByYW5kb20gU05vbmNlCisJR2VuUmFuZG9tKHBBZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5TdGFDZmcuU05vbmNlKTsKKworCWlmKHBNc2cxLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPiAwICkKKwl7CisJCS8vIGNhY2hlZCBQTUtJRAorCX0KKworCS8vIENhbGMgUFRLKEFOb25jZSwgU05vbmNlKQorCVdwYUNvdW50UFRLKHBBZCwKKwkJcEFkLT5TdGFDZmcuUE1LLAorCQlwQWQtPlN0YUNmZy5BTm9uY2UsCisJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQlwQWQtPlN0YUNmZy5TTm9uY2UsCisJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCVBUSywKKwkJTEVOX1BUSyk7CisKKwkvLyBTYXZlIGtleSB0byBQVEsgZW50cnkKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIFBUSywgTEVOX1BUSyk7CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSAyIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCS8vCisJLy8gTWVzc2FnZSAyIGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCisJLy8gMS4gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKwkvLyBmaWxsIGluIERhdGEgTWF0ZXJpYWwgYW5kIGl0cyBsZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdID0gSUVfV1BBMjsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdLCBwQWQtPlN0YUNmZy5SU05fSUUsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisKKwkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAorCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIFBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV07CisKKwkvLyAyLiBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyAzLiBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gMDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyA0LiBGaWxsIFNOb25jZQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU5vbmNlLCBwQWQtPlN0YUNmZy5TTm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyA1LiBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBTZW5kIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQorCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDIKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyA2LiBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUoUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisKKwkvLyBNYWtlICBUcmFuc21pdHRpbmcgZnJhbWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2cxQWN0aW9uIDwtLS0tLVxuIikpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFBhaXJ3aXNlIGtleSA0LXdheSBoYW5kc2hha2luZworCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhUGFpck1zZzNBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQorCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVBVQ0hBUiAgICAgICAgICAJcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgIAlGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMzsKKwlVQ0hBUiAgICAgICAgICAgCU1pY1sxNl0sIE9sZE1pY1sxNl07CisJTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5ID0gTlVMTDsKKwlVQ0hBUgkJCQlza2lwX29mZnNldDsKKwlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzNBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBSZWNvcmQgODAyLjExIGhlYWRlciAmIHRoZSByZWNlaXZlZCBFQVBPTCBwYWNrZXQgTXNnMworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKwlwTXNnMyA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBNc2czLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKKworCisJLy8gMS4gVmVyaWZ5IGNpcGhlciB0eXBlIG1hdGNoCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAyKSkKKwl7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBWZXJpZnkgUlNOIElFCisJLy9pZiAoIVJUTVBFcXVhbE1lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKQorCWlmICghQ2hlY2tSU05JRShwQWQsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0sICZza2lwX29mZnNldCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSU05fSUUgRGlmZmVyZW50IGluIE1zZyAzIG9mIFdQQTEgNC13YXkgaGFuZHNoYWtlISEgXG4iKSk7CisJCWhleF9kdW1wKCJUaGUgb3JpZ2luYWwgUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJaGV4X2R1bXAoIlRoZSByZWNlaXZlZCBSU05fSUUiLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJTTl9JRSBWQUxJRCBpbiBNc2cgMyBvZiBXUEExIDQtd2F5IGhhbmRzaGFrZSEhIFxuIikpOworCisKKwkvLyAyLiBDaGVjayBNSUMgdmFsdWUKKwkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCU5kaXNaZXJvTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCVVDSEFSIGRpZ2VzdFs4MF07CisKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCS8vIFRLSVAKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwl9CisKKwlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisKKwkvLyAzLiBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKKwlpZihSVE1QQ29tcGFyZU1lbW9yeShwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCQlyZXR1cm47CisKKwkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyA0LiBEb3VibGUgY2hlY2sgQU5vbmNlCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2czLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpKQorCQlyZXR1cm47CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gTWVzc2FnZSA0IGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsJCS8vIE5vIGRhdGEgZmllbGQKKworCS8vCisJLy8gTWVzc2FnZSA0IGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCwwLE1JQywwKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvLyBJbiBNc2czLCAgS2V5SW5mby5zZWN1cmUgPTAgaWYgR3JvdXAgS2V5IEhTIHRvIGNvbWUuIDEgaWYgbm8gZ3JvdXAga2V5IEhTCisJLy8gU3RhdGlvbiBzZW5kcyBNc2c0ICBLZXlJbmZvLnNlY3VyZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhhdCBpbiBNc2cuMworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlPSBwZWVyS2V5SW5mby5TZWN1cmU7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBLZXkgUmVwbGF5IGNvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSA0CisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlVQ0hBUiBkaWdlc3RbODBdOworCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkvLyBVcGRhdGUgUFRLCisJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisKKwkvLyBEZWNpZGUgaXRzIENoaXBlckFsZworCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwllbHNlCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisJLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICAwLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIDAsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkJICBwRW50cnkpOworCisJLy8gTWFrZSB0cmFuc21pdHRpbmcgZnJhbWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIFNlbmQgTWVzc2FnZSA0IHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnM0FjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworVk9JRCAgICBXcGEyUGFpck1zZzNBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzM7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdLCBPbGRNaWNbMTZdOworCVVDSEFSICAgICAgICAgICAgICAgKm1wb29sLCAqS0VZREFUQSwgKmRpZ2VzdDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEtleVszMl07CisJTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5ID0gTlVMTDsKKwlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOworCisJLy8gYWxsb2NhdGUgbWVtb3J5CisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTAyNCk7CisKKwlpZihtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBLRVlEQVRBIExlbiA9IDUxMi4KKwlLRVlEQVRBID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKEtFWURBVEEgKyA1MTIsIDQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2czQWN0aW9uIC0tLS0tPlxuIikpOworCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gUHJvY2VzcyBtZXNzYWdlIDMgZnJhbWUuCisJcE1zZzMgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwTXNnMy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7CisKKwkvLyAxLiBWZXJpZnkgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIhPSAyKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyAyLiBDaGVjayBNSUMgdmFsdWUKKwkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCU5kaXNaZXJvTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMSgoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCX0KKworCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKworCS8vIDMuIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gNC4gRG91YmxlIGNoZWNrIEFOb25jZQorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBPYnRhaW4gR1RLCisJLy8gNS4gRGVjcnlwdCBHVEsgZnJvbSBLZXkgRGF0YQorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJFS0QgPSAlZFxuIiwgcGVlcktleUluZm8uRUtEX0RMKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBEZWNyeXB0IEFFUyBHVEsKKwkJQUVTX0dUS19LRVlfVU5XUkFQKCZwQWQtPlN0YUNmZy5QVEtbMTZdLCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLHBNc2czLT5LZXlEZXNjLktleURhdGEpOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJSU5UIGk7CisJCS8vIERlY3J5cHQgVEtJUCBHVEsKKwkJLy8gQ29uc3RydWN0IDMyIGJ5dGVzIFJDNCBLZXkKKwkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnMy0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQlOZGlzTW92ZU1lbW9yeSgmS2V5WzE2XSwgJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIDE2KTsKKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkvL2Rpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzCisJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkvLyBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdAorCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJfQorCisJaWYgKCFQYXJzZUtleURhdGEocEFkLCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAxKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBVcGRhdGUgR1RLIHRvIEFTSUMKKwkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgTlVMTCk7CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSA0IGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgCT0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCisKKwkvLworCS8vIE1lc3NhZ2UgNCBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsMCxNSUMsMCkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEtleSBSZXBsYXkgY291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDQKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJLy8gVXBkYXRlIFBUSworCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKwlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgcEVudHJ5KTsKKworCS8vIE1ha2UgIFRyYW5zbWl0dGluZyBmcmFtZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgU2VuZCBNZXNzYWdlIDQgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCS8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisKKworCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgQlNTMCwgMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcGEyUGFpck1zZzNBY3Rpb24gPC0tLS0tXG4iKSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgR3JvdXAga2V5IDItd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFHcm91cE1zZzFBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQorCit7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBHcm91cDsKKwlVQ0hBUiAgICAgICAgICAgICAgICptcG9vbCwgKmRpZ2VzdCwgKktFWURBVEE7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdLCBPbGRNaWNbMTZdOworCVVDSEFSICAgICAgICAgICAgICAgR1RLWzMyXSwgS2V5WzMyXTsKKwlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOworCisJLy8gYWxsb2NhdGUgbWVtb3J5CisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTAyNCk7CisKKwlpZihtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBLRVlEQVRBIExlbiA9IDUxMi4KKwlLRVlEQVRBID0gKFVDSEFSICopIFJPVU5EX1VQKGRpZ2VzdCArIDgwLCA0KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUdyb3VwTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIFByb2Nlc3MgR3JvdXAgTWVzc2FnZSAxIGZyYW1lLiBza2lwIDgwMi4xMSBoZWFkZXIoMjQpICYgTExDX1NOQVAgaGVhZGVyKDgpCisJcEdyb3VwID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcEdyb3VwLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKKworCS8vIDAuIENoZWNrIGNpcGhlciB0eXBlIG1hdGNoCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDIpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyAxLiBWZXJpZnkgUmVwbGF5IGNvdW50ZXIKKwkvLyAgICBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKKwlpZihSVE1QQ29tcGFyZU1lbW9yeShwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gMi4gVmVyaWZ5IE1JQyBpcyB2YWxpZAorCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBHcm91cC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCU5kaXNaZXJvTWVtb3J5KHBHcm91cC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsJLy8gQUVTCisJCUhNQUNfU0hBMSgoUFVDSEFSKSBwR3JvdXAsIHBHcm91cC0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwR3JvdXAsIHBHcm91cC0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCX0KKworCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnIDEgb2YgMi13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gZ3JvdXAgbXNnIDEgb2YgMi13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKworCisJLy8gMy4gRGVjcnlwdCBHVEsgZnJvbSBLZXkgRGF0YQorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIERlY3J5cHQgQUVTIEdUSworCQlBRVNfR1RLX0tFWV9VTldSQVAoJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIEtFWURBVEEsICBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGEpOworCX0KKwllbHNlCS8vIFRLSVAKKwl7CisJCUlOVCBpOworCisJCS8vIERlY3J5cHQgVEtJUCBHVEsKKwkJLy8gQ29uc3RydWN0IDMyIGJ5dGVzIFJDNCBLZXkKKwkJTmRpc01vdmVNZW1vcnkoS2V5LCBwR3JvdXAtPktleURlc2MuS2V5SXYsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwQWQtPlN0YUNmZy5QVEtbMTZdLCAxNik7CisJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLZXksIDMyKTsKKwkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCUFSQ0ZPVVJfQllURSgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhUKTsKKwkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJfQorCisJLy8gUHJvY2VzcyBkZWNyeXB0ZWQga2V5IGRhdGEgbWF0ZXJpYWwKKwkvLyBQYXJzZSBrZXlEYXRhIHRvIGhhbmRsZSBLREUgZm9ybWF0IGZvciBXUEEyUFNLCisJaWYgKHBlZXJLZXlJbmZvLkVLRF9ETCkKKwl7CisJCWlmICghUGFyc2VLZXlEYXRhKHBBZCwgS0VZREFUQSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIDApKQorCQl7CisJCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UJLy8gV1BBUFNLCisJeworCQkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgZm9yIFdQQVBTSworCQlOZGlzTW92ZU1lbW9yeShHVEssIEtFWURBVEEsIDMyKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBHVEssIDMyKTsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gcGVlcktleUluZm8uS2V5SW5kZXg7CisKKwkJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQorCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIEdUSywgTEVOX1RLSVBfRUspOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCAmR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgJkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworICAgIAkvL2hleF9kdW1wKCJHcm91cCBLZXkgOiIsIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBMRU5fVEtJUF9FSyk7CisJfQorCisJLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkgIE5VTEwpOworCisJLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwkvLyBpbml0IGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gR3JvdXAgbWVzc2FnZSAxIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsJCS8vIE5vIGRhdGEgZmllbGQKKworCS8vCisJLy8gR3JvdXAgTWVzc2FnZSAyIGFzICBFQVBPTC1LZXkoMSwwLDAsMCxHLDAsMCxNSUMsMCkKKwkvLworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCXsKKwkJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisJfQorCWVsc2UKKwl7CisJCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCX0KKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBHcm91cC0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcEdyb3VwLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIEtleSBJbmRleCBhcyBHLU1zZyAxCisJaWYocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleUluZGV4ID0gcGVlcktleUluZm8uS2V5SW5kZXg7CisKKwkvLyBLZXkgVHlwZSBHcm91cCBrZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBHUk9VUEtFWTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy8gU2VjdXJlIGJpdAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlICA9IDE7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBLZXkgUmVwbGF5IGNvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIGdyb3VwIG1lc3NhZ2UgMgorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAJCSZGcmFtZUxlbiwKKwkJCQkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBwcmVwYXJlIGZvciBlbmNyeXB0aW9uCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIEZBTFNFKTsKKworCS8vIDYgRnJlZSBhbGxvY2F0ZWQgbWVtb3J5CisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisKKwkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhR3JvdXBNc2cxQWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCBXUEEgTUFDIGhlYWRlcgorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFNYWNIZWFkZXJJbml0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQJUEhFQURFUl84MDJfMTEJcEhkcjgwMjExLAorCUlOCQlVQ0hBUgkJCXdlcCwKKwlJTgkJUFVDSEFSCQkgICAgcEFkZHIxKQoreworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlwSGRyODAyMTEtPkZDLlR5cGUJPSBCVFlQRV9EQVRBOworCXBIZHI4MDIxMS0+RkMuVG9Ecwk9IDE7CisJaWYgKHdlcAk9PSAxKQorCQlwSGRyODAyMTEtPkZDLldlcCA9IDE7CisKKwkgLy8JQWRkcjE6IEJTU0lELCBBZGRyMjogU0EsIEFkZHIzOglEQQorCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgcEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCXBIZHI4MDIxMS0+U2VxdWVuY2UgPQlwQWQtPlNlcXVlbmNlOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQorCXNlbnQgb3V0IHRvIGFpci4KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCAgICBSVE1QVG9XaXJlbGVzc1N0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTglCT09MRUFOCQkJaXM0d2F5RnJhbWUpCisKK3sKKwlORElTX1NUQVRVUyAgICAgU3RhdHVzOworCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCVVDSEFSICAgSW5kZXg7CisKKwlkbworCXsKKwkJLy8gMS4gYnVpbGQgYSBORElTIHBhY2tldCBhbmQgY2FsbCBSVE1QU2VuZFBhY2tldCgpOworCQkvLyAgICBiZSBjYXJlZnVsIGFib3V0IGhvdy93aGVuIHRvIHJlbGVhc2UgdGhpcyBpbnRlcm5hbCBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgYnVmZmVyCisJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgcEhlYWRlcjgwMl8zLCBIZHJMZW4sIHBEYXRhLCBEYXRhTGVuKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzNHdheUZyYW1lKQorCQkJUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwUGFja2V0LCAxKTsKKwkJZWxzZQorCQkJUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwUGFja2V0LCAwKTsKKworCQkvLyAyLiBzZW5kIG91dCB0aGUgcGFja2V0CisJCVN0YXR1cyA9IFNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKKwkJaWYoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCS8vIERlcXVldWUgb25lIGZyYW1lIGZyb20gVHhTd1F1ZXVlMC4uMyBxdWV1ZSBhbmQgcHJvY2VzcyBpdAorCQkJLy8gVGhlcmUgYXJlIHRocmVlIHBsYWNlIGNhbGxpbmcgZGVxdWV1ZSBmb3IgVFggcmluZy4KKwkJCS8vIDEuIEhlcmUsIHJpZ2h0IGFmdGVyIHF1ZXVlaW5nIHRoZSBmcmFtZS4KKwkJCS8vIDIuIEF0IHRoZSBlbmQgb2YgVHhSaW5nVHhEb25lIHNlcnZpY2Ugcm91dGluZS4KKwkJCS8vIDMuIFVwb24gTkRJUyBjYWxsIFJUTVBTZW5kUGFja2V0cworCQkJaWYoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSAmJgorCQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpCisJCQl7CisJCQkJZm9yKEluZGV4ID0gMDsgSW5kZXggPCA1OyBJbmRleCArKykKKwkJCQkJaWYocEFkLT5UeFN3UXVldWVbSW5kZXhdLk51bWJlciA+IDApCisJCQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBJbmRleCwgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCQl9CisJfSB3aGlsZShGQUxTRSk7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2hlY2sgU2FuaXR5IFJTTiBJRSBmb3JtIEFQCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KQoreworCVBVQ0hBUiAgICAgICAgICAgICAgcFZJRTsKKwlVQ0hBUiAgICAgICAgICAgICAgIGxlbjsKKwlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisJQk9PTEVBTgkJCQlyZXN1bHQgPSBGQUxTRTsKKworCXBWSUUgPSBwRGF0YTsKKwlsZW4JID0gRGF0YUxlbjsKKwkqT2Zmc2V0ID0gMDsKKworCXdoaWxlIChsZW4gPiBzaXplb2YoUlNOSUUyKSkKKwl7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCS8vIFdQQSBSU04gSUUKKwkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkpCisJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpICYmCisJCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkpCisJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IFdQQS9XUEFQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCAocEVpZC0+TGVuICsgMikpKTsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLy8gV1BBMiBSU04gSUUKKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpCisJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMiB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkgJiYKKwkJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgKHBFaWQtPkxlbiArIDIpKSk7CisJCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9CisJCWVsc2UKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJbGVuICAtPSAocEVpZC0+TGVuICsgMik7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gc2tpcF9vZmZzZXQoJWQpIFxuIiwgKk9mZnNldCkpOworCisJcmV0dXJuIHJlc3VsdDsKKworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFBhcnNlIEtFWURBVEEgZmllbGQuICBLRVlEQVRBW10gTWF5IGNvbnRhaW4gMiBSU04gSUUgYW5kIG9wdGlvbmFsbHkgR1RLLgorICAgIEdUSyAgaXMgZW5jYXB0dWxhdGVkIGluIEtERSBmb3JtYXQgYXQgIHAuODMgODAyLjExaSBEMTAKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworICAgIE5vdGU6CisgICAgICAgIDgwMi4xMWkgRDEwCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFBhcnNlS2V5RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCWJQYWlyZXdpc2UpCit7CisgICAgUEtERV9FTkNBUCAgICAgICAgICBwS0RFID0gTlVMTDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgIHBNeUtleURhdGEgPSBwS2V5RGF0YTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtleURhdGFMZW5ndGggPSBLZXlEYXRhTGVuOworICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLTEVOOworCVVDSEFSCQkJCXNraXBfb2Zmc2V0OworCisJLy8gVmVyaWZ5IFRoZSBSU04gSUUgY29udGFpbmVkIGluIFBhaXJld2lzZS1Nc2cgMyBhbmQgc2tpcCBpdAorCWlmIChiUGFpcmV3aXNlKQorICAgIHsKKwkJLy8gQ2hlY2sgUlNOIElFIHdoZXRoZXIgaXQgaXMgV1BBMi9XUEEyUFNLCisJCWlmICghQ2hlY2tSU05JRShwQWQsIHBLZXlEYXRhLCBLZXlEYXRhTGVuLCAmc2tpcF9vZmZzZXQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJQYXJzZUtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWlzbWF0Y2hlZCBcbiIpKTsKKwkJCWhleF9kdW1wKCJHZXQgS0VZREFUQSA6IiwgcEtleURhdGEsIEtleURhdGFMZW4pOworCQkJcmV0dXJuIEZBTFNFOworICAgIAl9CisgICAgCWVsc2UKKwkJeworCQkJLy8gc2tpcCBSU04gSUUKKwkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7CisJCQlLZXlEYXRhTGVuZ3RoIC09IHNraXBfb2Zmc2V0OworCisJCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBhcnNlS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgc2tpcF9vZmZzZXQpKTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUGFyc2VLZXlEYXRhID09PiBLZXlEYXRhTGVuZ3RoICVkIHdpdGhvdXQgUlNOX0lFIFxuIiwgS2V5RGF0YUxlbmd0aCkpOworCisJLy8gUGFyc2UgRUtEIGZvcm1hdAorCWlmIChLZXlEYXRhTGVuZ3RoID49IDgpCisgICAgeworICAgICAgICBwS0RFID0gKFBLREVfRU5DQVApIHBNeUtleURhdGE7CisgICAgfQorCWVsc2UKKyAgICB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBLZXlEYXRhTGVuZ3RoIGlzIHRvbyBzaG9ydCBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisJLy8gU2FuaXR5IGNoZWNrIC0gc2hhcmVkIGtleSBpbmRleCBzaG91bGQgbm90IGJlIDAKKwlpZiAocEtERS0+R1RLRW5jYXAuS2lkID09IDApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBpbmRleCB6ZXJvIFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisJLy8gU2FuaXR5IGNoZWNrIC0gS0VEIGxlbmd0aAorCWlmIChLZXlEYXRhTGVuZ3RoIDwgKHBLREUtPkxlbiArIDIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCisJR1RLTEVOID0gcEtERS0+TGVuIC02OworCisJaWYgKEdUS0xFTiA8IExFTl9BRVNfS0VZKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgS2V5IHdpdGggS0RFIGZvcm1ldCBnb3QgaW5kZXg9JWQsIGxlbj0lZCBcbiIsIHBLREUtPkdUS0VuY2FwLktpZCwgR1RLTEVOKSk7CisKKwkvLyBVcGRhdGUgR1RLCisJLy8gc2V0IGtleSBtYXRlcmlhbCwgVHhNaWMgYW5kIFJ4TWljIGZvciBXUEFQU0sKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIHBLREUtPkdUS0VuY2FwLkdUSywgMzIpOworCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IHBLREUtPkdUS0VuY2FwLktpZDsKKworCS8vIFVwZGF0ZSBzaGFyZWQga2V5IHRhYmxlCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgcEtERS0+R1RLRW5jYXAuR1RLLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgJnBLREUtPkdUS0VuY2FwLkdUS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgJnBLREUtPkdUS0VuY2FwLkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworCXJldHVybiBUUlVFOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaXNjbyBDQ0tNIFBSRiBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCQlrZXkJCQkJQ2lzY28gQmFzZSBUcmFuc2llbnQgS2V5IChCVEspCisJCWtleV9sZW4JCQlUaGUga2V5IGxlbmd0aCBvZiB0aGUgQlRLCisJCWRhdGEJCQlSdXF1ZXN0IE51bWJlcihSTikgKyBCU1NJRAorCQlkYXRhX2xlbgkJVGhlIGxlbmd0aCBvZiB0aGUgZGF0YQorCQlvdXRwdXQJCQlTdG9yZSBmb3IgUFRLKFBhaXJ3aXNlIHRyYW5zaWVudCBrZXlzKQorCQlsZW4JCQkJVGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0CisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQk4MDIuMWkJQW5uZXggRi45CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENDS01QUkYoCisJSU4JVUNIQVIJKmtleSwKKwlJTglJTlQJCWtleV9sZW4sCisJSU4JVUNIQVIJKmRhdGEsCisJSU4JSU5UCQlkYXRhX2xlbiwKKwlPVVQJVUNIQVIJKm91dHB1dCwKKwlJTglJTlQJCWxlbikKK3sKKwlJTlQJCWk7CisJVUNIQVIJaW5wdXRbMTAyNF07CisJSU5UCQljdXJyZW50aW5kZXggPSAwOworCUlOVAkJdG90YWxfbGVuOworCisJTmRpc01vdmVNZW1vcnkoaW5wdXQsIGRhdGEsIGRhdGFfbGVuKTsKKwl0b3RhbF9sZW4gPSBkYXRhX2xlbjsKKwlpbnB1dFt0b3RhbF9sZW5dID0gMDsKKwl0b3RhbF9sZW4rKzsKKwlmb3IJKGkgPSAwOwlpIDwJKGxlbiArIDE5KSAvIDIwOyBpKyspCisJeworCQlITUFDX1NIQTEoaW5wdXQsIHRvdGFsX2xlbiwJa2V5LCBrZXlfbGVuLCAmb3V0cHV0W2N1cnJlbnRpbmRleF0pOworCQljdXJyZW50aW5kZXggKz0JMjA7CisJCWlucHV0W3RvdGFsX2xlbiAtIDFdKys7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBNSUMgZXJyb3IgaW5kaWNhdGlvbiBhbmQgcmVjb3JkIE1JQyBlcnJvciB0aW1lci4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBXcGFLZXkgCQlQb2ludGVyIHRvIHRoZSBXUEEga2V5IHN0cnVjdHVyZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBSZXBvcnRNaWNFcnJvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0lQSEVSX0tFWSAJcFdwYUtleSkKK3sKKwlVTE9ORwlOb3c7CisgICAgVUNIQVIgICB1bmljYXN0S2V5ID0gKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VfS0VZID8gMTowKTsKKworCS8vIFJlY29yZCBMYXN0IE1JQyBlcnJvciB0aW1lIGFuZCBjb3VudAorCU5vdyA9IGppZmZpZXM7CisJaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAwKQorCXsKKwkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7CisJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCX0KKwllbHNlIGlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSkgPCBOb3cpCisJCXsKKwkJCS8vIFVwZGF0ZSBMYXN0IE1JQyBlcnJvciB0aW1lLCB0aGlzIGRpZCBub3QgdmlvbGF0ZSB0d28gTUlDIGVycm9ycyB3aXRoaW4gNjAgc2Vjb25kcworCQkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKKwkJfQorCQllbHNlCisJCXsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCQkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKKwkJCS8vIFZpb2xhdGUgTUlDIGVycm9yIGNvdW50cywgTUlDIGNvdW50ZXJtZWFzdXJlcyBraWNrcyBpbgorCQkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gTUlDIGVycm9yIGNvdW50ID49IDIKKwkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgorCQk7CisJfQorICAgIE1sbWVFbnF1ZXVlKHBBZCwKKwkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQlPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRSwKKwkJCQkxLAorCQkJCSZ1bmljYXN0S2V5KTsKKworICAgIGlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMikKKyAgICB7CisgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsIDEwMCk7CisgICAgfQorfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZGVmaW5lCUxFTkdUSF9FQVBfSCAgICA0CisvLyBJZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVBhY2tldCAsZmluZCBvdXQgaXRzIEVBUC1Db2RlIChSZXF1ZXN0KDB4MDEpLCBSZXNwb25zZSgweDAyKSwgU3VjY2VzcygweDAzKSwgRmFpbHVyZSgweDA0KSkuCitJTlQJICAgIFdwYUNoZWNrRWFwQ29kZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIAkJcEFkLAorCUlOICBQVUNIQVIJCQkJcEZyYW1lLAorCUlOICBVU0hPUlQJCQkJRnJhbWVMZW4sCisJSU4gIFVTSE9SVAkJCQlPZmZTZXQpCit7CisKKwlQVUNIQVIJcERhdGE7CisJSU5UCXJlc3VsdCA9IDA7CisKKwlpZiggRnJhbWVMZW4gPCBPZmZTZXQgKyBMRU5HVEhfRUFQT0xfSCArIExFTkdUSF9FQVBfSCApCisJCXJldHVybiByZXN1bHQ7CisKKwlwRGF0YSA9IHBGcmFtZSArIE9mZlNldDsgLy8gc2tpcCBvZmZzZXQgYnl0ZXMKKworCWlmKCoocERhdGErMSkgPT0gRUFQUGFja2V0KSAJLy8gODAyLjF4IGhlYWRlciAtIFBhY2tldCBUeXBlCisJeworCQkgcmVzdWx0ID0gKihwRGF0YSs0KTsJCS8vIEVBUCBoZWFkZXIgLSBDb2RlCisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICAgYlVuaWNhc3QpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisgICAgc3ByaW50ZihjdXN0b20sICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iKTsKKyAgICBpZiAoYlVuaWNhc3QpCisgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMgdW5pY2FzdCIsIGN1c3RvbSk7CisgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihjdXN0b20pOworICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgY3VzdG9tKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKK1ZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKKyAgICBCT09MRUFOICAgICAgICAgICAgIGJVbmljYXN0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIC0tLS0tPlxuIikpOworCisgICAgYlVuaWNhc3QgPSAoRWxlbS0+TXNnWzBdID09IDEgPyBUUlVFOkZBTFNFKTsKKwlwQWQtPlNlcXVlbmNlID0gKChwQWQtPlNlcXVlbmNlKSArIDEpICYgKE1BWF9TRVFfTlVNQkVSKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCisgICAgLy8gUmVxdWVzdCBmaWVsZCBwcmVzZW50ZWQKKyAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QgPSAxOworCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7CisJfQorCisgICAgUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gKGJVbmljYXN0ID8gUEFJUldJU0VLRVkgOiBHUk9VUEtFWSk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworICAgIC8vIEVycm9yIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uRXJyb3IgID0gMTsKKworCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOworCisJLy8gS2V5IFJlcGxheSBDb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworICAgIGluY19ieXRlX2FycmF5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsJLy8gQUVTCisgICAgICAgIFVDSEFSIGRpZ2VzdFsyMF0gPSB7MH07CisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsJLy8gVEtJUAorCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKyAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKyAgICAJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCQkmSGVhZGVyODAyXzMsCisgICAgCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICAmUGFja2V0LAorICAgIAkJCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNSUMgZmFpbHVyZSByZXBvcnQgZnJhbWUgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBGQUxTRSk7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUgPC0tLS0tXG4iKSk7Cit9CisKKy8qKiBmcm9tIHdwYV9zdXBwbGljYW50CisgKiBpbmNfYnl0ZV9hcnJheSAtIEluY3JlbWVudCBhcmJpdHJhcnkgbGVuZ3RoIGJ5dGUgYXJyYXkgYnkgb25lCisgKiBAY291bnRlcjogUG9pbnRlciB0byBieXRlIGFycmF5CisgKiBAbGVuOiBMZW5ndGggb2YgdGhlIGNvdW50ZXIgaW4gYnl0ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgY291bnRlciBieSBvbmUgYW5kIGNvbnRpbnVlcworICogcm9sbGluZyBvdmVyIHRvIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZXMgaWYgdGhlIGJ5dGUgd2FzIGluY3JlbWVudGVkIGZyb20KKyAqIDB4ZmYgdG8gMHgwMC4KKyAqLwordm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbikKK3sKKwlpbnQgcG9zID0gbGVuIC0gMTsKKwl3aGlsZSAocG9zID49IDApIHsKKwkJY291bnRlcltwb3NdKys7CisJCWlmIChjb3VudGVyW3Bvc10gIT0gMCkKKwkJCWJyZWFrOworCQlwb3MtLTsKKwl9Cit9CisKK1ZPSUQgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworICAgIFJUTVBfQURBUFRFUiAgICAgICAgICAgICAgICAqcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OworICAgIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKKworCS8vIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBSZXBvcnRNaWNFcnJvciAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgYWZ0ZXIgc2VuZGluZyBzZWNvbmQgY29udGludW91cyBFQVBPTCBmcmFtZVxuIikpOworCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fTUlDX0ZBSUxVUkUpOworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKworCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ3ZDExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYwpAQCAtMCwwICsxLDY5NDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgc3RhX2lvY3RsLmMKKworICAgIEFic3RyYWN0OgorICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCisJUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisqLworCisjaW5jbHVkZQkicnRfY29uZmlnLmgiCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisjZW5kaWYKKworI2RlZmluZSBOUl9XRVBfS0VZUyAJCQkJNAorI2RlZmluZSBXRVBfU01BTExfS0VZX0xFTiAJCQkoNDAvOCkKKyNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4gCQkJKDEwNC84KQorCisjZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbHNlCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQorI2VuZGlmCisKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcExlbjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF9WRVJTSU9OX0lORk97CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblc7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblg7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblk7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblo7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRZZWFyOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkTW9udGg7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGREYXk7Cit9IFJUX1ZFUlNJT05fSU5GTywgKlBSVF9WRVJTSU9OX0lORk87CisKK3N0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0geworeyBSVFBSSVZfSU9DVExfU0VULAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIDAsCisgICJzZXQifSwKKworeyBSVFBSSVZfSU9DVExfU0hPVywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAoreyBSVFBSSVZfSU9DVExfU0hPVywgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCisvKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KKyAgICB7IFNIT1dfQ09OTl9TVEFUVVMsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiY29ublN0YXR1cyIgfSwKKwl7IFNIT1dfRFJWSUVSX1ZFUklPTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkcml2ZXJWZXIiIH0sCisgICAgeyBTSE9XX0JBX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYmFpbmZvIiB9LAorCXsgU0hPV19ERVNDX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGVzY2luZm8iIH0sCisgICAgeyBSQUlPX09GRiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vZmYiIH0sCisJeyBSQUlPX09OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29uIiB9LAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsgU0hPV19ETFNfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkbHNlbnRyeWluZm8iIH0sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyBTSE9XX0NGR19WQUxVRSwKKwkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInNob3ciIH0sCisvKiAtLS0gc3ViLWlvY3RscyByZWxhdGlvbnMgLS0tICovCisKKyNpZmRlZiBEQkcKK3sgUlRQUklWX0lPQ1RMX0JCUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgImJicCJ9LAoreyBSVFBSSVZfSU9DVExfTUFDLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgIm1hYyJ9LAoreyBSVFBSSVZfSU9DVExfRTJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImUycCJ9LAorI2VuZGlmICAvKiBEQkcgKi8KKworeyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgInN0YXQifSwKK3sgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJnZXRfc2l0ZV9zdXJ2ZXkifSwKK307CisKK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworVk9JRCBSVE1QSW9jdGxCQlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7CisjZW5kaWYgLy8gREJHIC8vCisKKworTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOCVBWT0lECQkJcEJ1Zik7CisKK0lOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzZXRfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFVDSEFSIGFyZyk7Cit9ICpQUlRNUF9QUklWQVRFX1NFVF9QUk9DLCBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DW10gPSB7CisJeyJEcml2ZXJWZXJzaW9uIiwJCQkJU2V0X0RyaXZlclZlcnNpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uIiwJCQkJU2V0X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJCVNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJTU0lEIiwJCQkJCQlTZXRfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJCVNldF9XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNldF9UeEJ1cnN0X1Byb2N9LAorCXsiVHhQcmVhbWJsZSIsCQkJCVNldF9UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTZXRfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2V0X0NoYW5uZWxfUHJvY30sCisJeyJCR1Byb3RlY3Rpb24iLAkJCQlTZXRfQkdQcm90ZWN0aW9uX1Byb2N9LAorCXsiUlRTVGhyZXNob2xkIiwJCQkJU2V0X1JUU1RocmVzaG9sZF9Qcm9jfSwKKwl7IkZyYWdUaHJlc2hvbGQiLAkJCQlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwl7Ikh0QnciLAkJICAgICAgICAgICAgICAgIFNldF9IdEJ3X1Byb2N9LAorCXsiSHRNY3MiLAkJICAgICAgICAgICAgICAgIFNldF9IdE1jc19Qcm9jfSwKKwl7Ikh0R2kiLAkJICAgICAgICAgICAgICAgIFNldF9IdEdpX1Byb2N9LAorCXsiSHRPcE1vZGUiLAkJICAgICAgICAgICAgU2V0X0h0T3BNb2RlX1Byb2N9LAorCXsiSHRFeHRjaGEiLAkJICAgICAgICAgICAgU2V0X0h0RXh0Y2hhX1Byb2N9LAorCXsiSHRNcGR1RGVuc2l0eSIsCQkgICAgICAgIFNldF9IdE1wZHVEZW5zaXR5X1Byb2N9LAorCXsiSHRCYVdpblNpemUiLAkJICAgICAgICAJU2V0X0h0QmFXaW5TaXplX1Byb2N9LAorCXsiSHRSZGciLAkJICAgICAgICAJCVNldF9IdFJkZ19Qcm9jfSwKKwl7Ikh0QW1zZHUiLAkJICAgICAgICAJCVNldF9IdEFtc2R1X1Byb2N9LAorCXsiSHRBdXRvQmEiLAkJICAgICAgICAJU2V0X0h0QXV0b0JhX1Byb2N9LAorCXsiSHRCYURlY2xpbmUiLAkJCQkJU2V0X0JBRGVjbGluZV9Qcm9jfSwKKwl7Ikh0UHJvdGVjdCIsCQkgICAgICAgIAlTZXRfSHRQcm90ZWN0X1Byb2N9LAorCXsiSHRNaW1vUHMiLAkJICAgICAgICAJU2V0X0h0TWltb1BzX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQkJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCisgICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCisJeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAorCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCisJeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAorI2lmZGVmIERCRworCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorCXsiQVRFIiwJCQkJCQkJU2V0X0FURV9Qcm9jfSwKKwl7IkFURURBIiwJCQkJCQlTZXRfQVRFX0RBX1Byb2N9LAorCXsiQVRFU0EiLAkJCQkJCVNldF9BVEVfU0FfUHJvY30sCisJeyJBVEVCU1NJRCIsCQkJCQlTZXRfQVRFX0JTU0lEX1Byb2N9LAorCXsiQVRFQ0hBTk5FTCIsCQkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvY30sCisJeyJBVEVUWFBPVzAiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjBfUHJvY30sCisJeyJBVEVUWFBPVzEiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvY30sCisJeyJBVEVUWEFOVCIsCQkJCQlTZXRfQVRFX1RYX0FudGVubmFfUHJvY30sCisJeyJBVEVSWEFOVCIsCQkJCQlTZXRfQVRFX1JYX0FudGVubmFfUHJvY30sCisJeyJBVEVUWEZSRVFPRkZTRVQiLAkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvY30sCisJeyJBVEVUWEJXIiwJCQkJCQlTZXRfQVRFX1RYX0JXX1Byb2N9LAorCXsiQVRFVFhMRU4iLAkJCQkJU2V0X0FURV9UWF9MRU5HVEhfUHJvY30sCisJeyJBVEVUWENOVCIsCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2N9LAorCXsiQVRFVFhNQ1MiLAkJCQkJU2V0X0FURV9UWF9NQ1NfUHJvY30sCisJeyJBVEVUWE1PREUiLAkJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2N9LAorCXsiQVRFVFhHSSIsCQkJCQkJU2V0X0FURV9UWF9HSV9Qcm9jfSwKKwl7IkFURVJYRkVSIiwJCQkJCVNldF9BVEVfUlhfRkVSX1Byb2N9LAorCXsiQVRFUlJGIiwJCQkJCQlTZXRfQVRFX1JlYWRfUkZfUHJvY30sCisJeyJBVEVXUkYxIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jfSwKKwl7IkFURVdSRjIiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYyX1Byb2N9LAorCXsiQVRFV1JGMyIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjNfUHJvY30sCisJeyJBVEVXUkY0IiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jfSwKKwl7IkFURUxERTJQIiwJCQkJICAgIFNldF9BVEVfTG9hZF9FMlBfUHJvY30sCisJeyJBVEVSRTJQIiwJCQkJCQlTZXRfQVRFX1JlYWRfRTJQX1Byb2N9LAorCXsiQVRFU0hPVyIsCQkJCQkJU2V0X0FURV9TaG93X1Byb2N9LAorCXsiQVRFSEVMUCIsCQkJCQkJU2V0X0FURV9IZWxwX1Byb2N9LAorCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwl7IlR4U3RvcCIsCQkJCQkJU2V0X1R4U3RvcF9Qcm9jfSwKKwl7IlJ4U3RvcCIsCQkJCQkJU2V0X1J4U3RvcF9Qcm9jfSwKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7IldwYVN1cHBvcnQiLCAgICAgICAgICAgICAgICAgIFNldF9XcGFfU3VwcG9ydH0sCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAorI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJeyJPcE1vZGUiLAkJCQkJCVNldF9PcE1vZGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKKyAgICB7IkZvcmNlR0YiLAkJICAgICAgICAJCVNldF9Gb3JjZUdGX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsiRGxzQWRkRW50cnkiLAkJCQkJU2V0X0Rsc0FkZEVudHJ5X1Byb2N9LAorCXsiRGxzVGVhckRvd25FbnRyeSIsCQkJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvY30sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyJMb25nUmV0cnkiLAkgICAgICAgIAkJU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2N9LAorCXsiU2hvcnRSZXRyeSIsCSAgICAgICAgCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwl7IjExZENsaWVudE1vZGUiLAkJCQlTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvY30sCisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwl7IkNhcnJpZXJEZXRlY3QiLAkJCQlTZXRfQ2FycmllckRldGVjdF9Qcm9jfSwKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwl7TlVMTCx9Cit9OworCisKK1ZPSUQgUlRNUEFkZEtleSgKKwlJTglQUlRNUF9BREFQVEVSCSAgICBwQWQsCisJSU4JUE5ESVNfODAyXzExX0tFWSAgICBwS2V5KQoreworCVVMT05HCQkJCUtleUlkeDsKKwlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7CisKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCXsKKwkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJeworCQkgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAzMik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKwkJICAgIC8vIFVwZGF0ZSBQVEsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWNpZGUgaXRzIENoaXBlckFsZworICAgICAgICAJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAgICAgCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAJZWxzZQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKyAgICAgICAgCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgTEVOX1RLSVBfRUspOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisgICAgICAgIAkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgcEVudHJ5KTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgR1RLCisgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAocEtleS0+S2V5SW5kZXggJiAweEZGKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKyAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisgICAgCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgIAkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIE5VTEwpOworCisgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgfQorCX0KKwllbHNlCS8vIGR5bmFtaWMgV0VQIGZyb20gd3BhX3N1cHBsaWNhbnQKKwl7CisJCVVDSEFSCUNpcGhlckFsZzsKKyAgICAJUFVDSEFSCUtleTsKKworCQlpZihwS2V5LT5LZXlMZW5ndGggPT0gMzIpCisJCQlnb3RvIGVuZDsKKworCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisKKwkJaWYgKEtleUlkeCA8IDQpCisJCXsKKwkJCS8vIGl0IGlzIGEgZGVmYXVsdCBzaGFyZWQga2V5LCBmb3IgUGFpcndpc2Uga2V5IHNldHRpbmcKKwkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQl7CisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwS2V5LT5CU1NJRCk7CisKKwkJCQlpZiAocEVudHJ5KQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleTogU2V0IFBhaXItd2lzZSBLZXlcbiIpKTsKKworCQkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IChVQ0hBUilwS2V5LT5LZXlMZW5ndGg7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkJLy8gc2V0IENpcGhlciB0eXBlCisJCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCQllbHNlCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCXBFbnRyeS0+QWRkciwKKwkJCQkJCShVQ0hBUilwRW50cnktPkFpZCwKKyAgICAgICAgICAgICAgICAJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKKworCQkJCQkvLyB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5CisJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlCU1MwLAorCQkJCQkJS2V5SWR4LCAvLyBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCXBFbnRyeSk7CisKKwkJCQl9CisJCQl9CisJCQllbHNlCisgICAgICAgICAgICB7CisJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCisJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCS8vIFNldCBDaXBlciB0eXBlCisJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQllbHNlCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworICAgIAkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisJCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCisgICAgCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCX0KKwkJfQorCX0KK2VuZDoKKwlyZXR1cm47Cit9CisKK2NoYXIgKiBydHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCit7CisgICAgZm9yKDsgKnMgIT0gKGNoYXIpIGM7ICsrcykKKyAgICAgICAgaWYgKCpzID09ICdcMCcpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKGNoYXIgKikgczsKK30KKworLyoKK1RoaXMgaXMgcmVxdWlyZWQgZm9yIExpbkVYMjAwNC9rZXJuZWwyLjYuNyB0byBwcm92aWRlIGl3bGlzdCBzY2FubmluZyBmdW5jdGlvbgorKi8KKworaW50CitydF9pb2N0bF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworLy8JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworI2lmZGVmIFJUMjg2MAorICAgIHN0cm5jcHkobmFtZSwgIlJUMjg2MCBXaXJlbGVzcyIsIElGTkFNU0laKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlpbnQgCWNoYW4gPSAtMTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCisJaWYgKGZyZXEtPmUgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQorCQljaGFuID0gZnJlcS0+bTsJLy8gU2V0dGluZyBieSBjaGFubmVsIG51bWJlcgorCWVsc2UKKwkJTUFQX0tIWl9UT19DSEFOTkVMX0lEKCAoZnJlcS0+bSAvMTAwKSAsIGNoYW4pOyAvLyBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgLCBsaWtlIDIuNDEyRywgMi40MjJHLAorCisgICAgaWYgKENoYW5uZWxTYW5pdHkocEFkYXB0ZXIsIGNoYW4pID09IFRSVUUpCisgICAgeworCXBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA9IGNoYW47CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT0+cnRfaW9jdGxfc2l3ZnJlcTo6U0lPQ1NJV0ZSRVFbY21kPTB4JXhdIChDaGFubmVsPSVkKVxuIiwgU0lPQ1NJV0ZSRVEsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CitpbnQgcnRfaW9jdGxfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gTlVMTDsKKwlVQ0hBUiBjaDsKKwlVTE9ORwltOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJCWNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT5ydF9pb2N0bF9naXdmcmVxICAlZFxuIiwgY2gpKTsKKworICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihjaCwgbSk7CisJZnJlcS0+bSA9IG0gKiAxMDA7CisJZnJlcS0+ZSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoICgqbW9kZSkKKwl7CisJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfSU5GUkE6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQlicmVhazsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICAgICAgY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2l3bW9kZTo6U0lPQ1NJV01PREUgKHVua25vd24gJWQpXG4iLCAqbW9kZSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJKm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgIGVsc2UgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJKm1vZGUgPSBJV19NT0RFX0lORlJBOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgIGVsc2UgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX01PTklUT1I7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgICAgICAqbW9kZSA9IElXX01PREVfQVVUTzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PnJ0X2lvY3RsX2dpd21vZGUobW9kZT0lZClcbiIsICptb2RlKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJdTE2IHZhbDsKKwlpbnQgaTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT5ydF9pb2N0bF9naXdyYW5nZVxuIikpOworCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKworCWlmIChJTkZSQV9PTihwQWRhcHRlcil8fEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCXJhbmdlLT5taW5fcG1wID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG1wID0gNjU1MzUgKiAxMDI0OworCQlyYW5nZS0+bWluX3BtdCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtdCA9IDEwMDAgKiAxMDI0OworCQlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwKKwkJCUlXX1BPV0VSX1VOSUNBU1RfUiB8IElXX1BPV0VSX0FMTF9SOworCX0KKworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE0OworCisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMDsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OworCisJcmFuZ2UtPm51bV9jaGFubmVscyA9ICBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisKKwl2YWwgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2UtPm51bV9jaGFubmVsczsgaSsrKQorCXsKKwkJdTMyIG07CisJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWw7CisJCU1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsLCBtKTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsgLyogSFogKi8KKworCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOworCQl2YWwrKzsKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90CisJCQkJCSogZG9jdW1lbnRlZCBleGFjdGx5LiBBdCBsZWFzdAorCQkJCQkqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7IC8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsgLyogZEIgKi8KKworCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7CisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTYwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IC05NTsKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOworCisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBOUl9XRVBfS0VZUzsKKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworCS8qIElXX0VOQ19DQVBBXyogYml0IGZpZWxkICovCisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisJCQkJCUlXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgeworICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgIH0KKworICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgIG1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICBtZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIEVUSF9BTEVOKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIC8vIEFkZCBmb3IgUlQyODcwCisgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIGFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICAgICAgbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+TWxtZUF1eC5Cc3NpZCwgRVRIX0FMRU4pOworICAgIH0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSVdBUCg9RU1QVFkpXG4iKSk7CisJCXJldHVybiAtRU5PVENPTk47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbml0cyBhcmUgaW4gZGIgYWJvdmUgdGhlIG5vaXNlIGZsb29yLiBUaGF0IG1lYW5zIHRoZQorICogcnNzaSB2YWx1ZXMgcmVwb3J0ZWQgaW4gdGhlIHR4L3J4IGRlc2NyaXB0b3JzIGluIHRoZQorICogZHJpdmVyIGFyZSB0aGUgU05SIGV4cHJlc3NlZCBpbiBkYi4KKyAqCisgKiBJZiB5b3UgYXNzdW1lIHRoYXQgdGhlIG5vaXNlIGZsb29yIGlzIC05NSwgd2hpY2ggaXMgYW4KKyAqIGV4Y2VsbGVudCBhc3N1bXB0aW9uIDk5LjUgJSBvZiB0aGUgdGltZSwgdGhlbiB5b3UgY2FuCisgKiBkZXJpdmUgdGhlIGFic29sdXRlIHNpZ25hbCBsZXZlbCAoaS5lLiAtOTUgKyByc3NpKS4KKyAqIFRoZXJlIGFyZSBzb21lIG90aGVyIHNsaWdodCBmYWN0b3JzIHRvIHRha2UgaW50byBhY2NvdW50CisgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcnNzaSBtZWFzdXJlbWVudCBpcyBmcm9tIDExYiwKKyAqIDExZywgb3IgMTFhLiAgIFRoZXNlIGRpZmZlcmVuY2VzIGFyZSBhdCBtb3N0IDJkYiBhbmQKKyAqIGNhbiBiZSBkb2N1bWVudGVkLgorICoKKyAqIE5COiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIG9yaW5vY28vd2F2ZWxhbgorICogICAgIGRyaXZlcnMgZm9yIGNvbXBhdGliaWxpdHkKKyAqLworc3RhdGljIHZvaWQgc2V0X3F1YWxpdHkoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19xdWFsaXR5ICppcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyIHJzc2kpCit7CisJX191OCBDaGFubmVsUXVhbGl0eTsKKworCS8vIE5vcm1hbGl6ZSBSc3NpCisJaWYgKHJzc2kgPj0gLTUwKQorCQlDaGFubmVsUXVhbGl0eSA9IDEwMDsKKwllbHNlIGlmIChyc3NpID49IC04MCkgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikvMTApOworCWVsc2UgaWYgKHJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisgICAgICAgIENoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKChyc3NpICsgOTApICogMjYpLzEwOworCWVsc2UKKwkJQ2hhbm5lbFF1YWxpdHkgPSAwOworCisgICAgaXEtPnF1YWwgPSAoX191OClDaGFubmVsUXVhbGl0eTsKKworICAgIGlxLT5sZXZlbCA9IChfX3U4KShyc3NpKTsKKyAgICBpcS0+bm9pc2UgPSAocEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdID4gcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA/ICgoX191OClwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOyAJLy8gbm9pc2UgbGV2ZWwgKGRCbSkKKyAgICBpcS0+bm9pc2UgKz0gMjU2IC0gMTQzOworICAgIGlxLT51cGRhdGVkID0gcEFkYXB0ZXItPml3X3N0YXRzLnF1YWwudXBkYXRlZDsKK30KKworaW50IHJ0X2lvY3RsX2l3YXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCXN0cnVjdCBzb2NrYWRkciBhZGRyW0lXX01BWF9BUF07CisJc3RydWN0IGl3X3F1YWxpdHkgcXVhbFtJV19NQVhfQVBdOworCWludCBpOworCisgICAJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworICAgICAgICAvL3JldHVybiAtRU5FVERPV047CisJfQorCisJZm9yIChpID0gMDsgaSA8SVdfTUFYX0FQIDsgaSsrKQorCXsKKwkJaWYgKGkgPj0gIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKQorCQkJYnJlYWs7CisJCWFkZHJbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJnF1YWxbaV0sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworCX0KKwlkYXRhLT5sZW5ndGggPSBpOworCW1lbWNweShleHRyYSwgJmFkZHIsIGkqc2l6ZW9mKGFkZHJbMF0pKTsKKwlkYXRhLT5mbGFncyA9IDE7CQkvKiBzaWduYWwgcXVhbGl0eSBwcmVzZW50IChzb3J0IG9mKSAqLworCW1lbWNweShleHRyYSArIGkqc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSpzaXplb2YocXVhbFtpXSkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DR0lXU0NBTgoraW50IHJ0X2lvY3RsX3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwlVTE9ORwkJCQkJCQkJTm93OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50Kys7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuIDA7CisJZG97CisJCU5vdyA9IGppZmZpZXM7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDMpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDNcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisJCXsKKwkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQl9CisKKwkJLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisJCS8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisJCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCTAsCisJCQlOVUxMKTsKKworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKwl9d2hpbGUoMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJaW50IGk9MDsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmEsICpwcmV2aW91c19ldiA9IGV4dHJhOworCWNoYXIgKmVuZF9idWY7CisJY2hhciAqY3VycmVudF92YWwsIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7MH07CisjaWZuZGVmIElXRVZHRU5JRQorCWNoYXIgaWR4OworI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCXN0cnVjdCBpd19ldmVudCBpd2U7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgIHsKKwkJLyoKKwkJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKwkJICovCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPSAwOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgPT0gMCkKKwl7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgIGlmIChkYXRhLT5sZW5ndGggPiAwKQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7CisgICAgZWxzZQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2Vsc2UKKyAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCWlmIChjdXJyZW50X2V2ID49IGVuZF9idWYpCisgICAgICAgIHsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisJCS8vTUFDIGFkZHJlc3MKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRVNTSUQKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vTmV0d29yayBUeXBlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworCQl9CisJCWVsc2UKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQVVUTzsKKwkJfQorCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIElXX0VWX1VJTlRfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9DaGFubmVsIGFuZCBGcmVxdWVuY3kKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJZWxzZQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJaXdlLnUuZnJlcS5pID0gMDsKKworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKyAgICAgICAgLy9BZGQgcXVhbGl0eSBzdGF0aXN0aWNzCisgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAJaXdlLmNtZCA9IElXRVZRVUFMOworICAgIAlpd2UudS5xdWFsLmxldmVsID0gMDsKKyAgICAJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisgICAgICAgIHNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisgICAgCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRW5jeXB0aW9uIGtleQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCisJCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJZWxzZQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgICAgIGN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCZpd2UsIChjaGFyICopcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCktMV0uS2V5KTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9CaXQgUmF0ZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKyAgICAJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisgICAgICAgICAgICBpZiAodG1wUmF0ZSA9PSAweDgyKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4ODQpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAyICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDUuNSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlCisgICAgCQkgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAodG1wUmF0ZS8yKSAqIDEwMDAwMDA7CisKKwkJCWl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCQkJY3VycmVudF92YWwgPSBJV0VfU1RSRUFNX0FERF9WQUxVRShpbmZvLCBjdXJyZW50X2V2LAorCQkJCWN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLAorICAgIAkJCUlXX0VWX1BBUkFNX0xFTik7CisKKyAgICAgICAgCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQorICAgICAgICAgICAgCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKyAgICAgICAgCWVsc2UKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBJV0VWR0VOSUUKKwkJLy9XUEEgSUUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKwkJeworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgLy9XUEEgSUUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgIndwYV9pZT0iLCA3KTsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJyc25faWU9IiwgNyk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJfQorCisJZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SICwoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIixpICwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBydF9pb2N0bF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmZsYWdzKQorCXsKKwkJUENIQVIJcFNzaWRTdHJpbmcgPSBOVUxMOworCisJCS8vIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLgorCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCisJCQlyZXR1cm4gLUUyQklHOworCisJCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocFNzaWRTdHJpbmcpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgZXNzaWQsIGRhdGEtPmxlbmd0aCk7CisJCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpID09IEZBTFNFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVsc2UKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwllbHNlCisJeworCQkvLyBBTlkgc3NpZAorCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpID09IEZBTFNFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlkYXRhLT5mbGFncyA9IDE7CisgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoICA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorCWVsc2UKKwl7Ly90aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZAorCQlkYXRhLT5sZW5ndGggID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQgcnRfaW9jdGxfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQocEFkYXB0ZXItPm5pY2tuYW1lLCAwLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOworCW1lbWNweShwQWRhcHRlci0+bmlja25hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOworCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMSkKKwkJZGF0YS0+bGVuZ3RoID0gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxOworCWlmIChkYXRhLT5sZW5ndGggPiAwKSB7CisJCW1lbWNweShuaWNrbmFtZSwgcEFkYXB0ZXItPm5pY2tuYW1lLCBkYXRhLT5sZW5ndGgtMSk7CisJCW5pY2tuYW1lW2RhdGEtPmxlbmd0aC0xXSA9ICdcMCc7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJdTE2IHZhbDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChydHMtPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZQorCQl2YWwgPSBydHMtPnZhbHVlOworCisJaWYgKHZhbCAhPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkKKwkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSB2YWw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlydHMtPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisJcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID09IE1BWF9SVFNfVEhSRVNIT0xEKTsKKwlydHMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl1MTYgdmFsOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmIChmcmFnLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UgaWYgKGZyYWctPnZhbHVlID49IE1JTl9GUkFHX1RIUkVTSE9MRCB8fCBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCisgICAgICAgIHZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsgLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KKwllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlmcmFnLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisJZnJhZy0+ZGlzYWJsZWQgPSAoZnJhZy0+dmFsdWUgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKTsKKwlmcmFnLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVhfV0VQX0tFWV9TSVpFIDEzCisjZGVmaW5lIE1JTl9XRVBfS0VZX1NJWkUgNQoraW50IHJ0X2lvY3RsX3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKwllbHNlIGlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEIHx8IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikpCisJeworCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIAllbHNlCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKworICAgIGlmIChlcnEtPmxlbmd0aCA+IDApCisJeworCQlpbnQga2V5SWR4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBNQVhfV0VQX0tFWV9TSVpFKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayBrZXkgaW5kZXggKi8KKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXcm9uZyBrZXlJZHg9JWQhIFVzaW5nIGRlZmF1bHQga2V5IGluc3RlYWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJZHgsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICAgICAgICAgIC8vVXNpbmcgZGVmYXVsdCBrZXkKKwkJCWtleUlkeCA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkOworICAgICAgICB9CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKKworCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJfQorCQllbHNlIGlmIChlcnEtPmxlbmd0aCA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCX0KKwkJZWxzZQorCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKworCQkvKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZighKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0cmEsIGVycS0+bGVuZ3RoKTsKKyAgICAgICAgfQorCX0KKyAgICBlbHNlCisJCQl7CisJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/ICovCisJCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgNCkpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQlpZighZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKK2RvbmU6CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjplcnEtPmZsYWdzPSV4XG4iLGVycS0+ZmxhZ3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkF1dGhNb2RlPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkRlZmF1bHRLZXlJZD0leCwgS2V5TGVuID0gJWRcbiIscEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OldlcFN0YXR1cz0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCXJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQoreworCWludCBraWQ7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWtpZCA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX2dpd2VuY29kZSAlZFxuIiwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkpOworCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwl7CisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisJZWxzZSBpZiAoKGtpZCA+IDApICYmIChraWQgPD00KSkKKwl7CisJCS8vIGNvcHkgd2VwIGtleQorCQllcnEtPmZsYWdzID0ga2lkIDsJCQkvKiBOQjogYmFzZSAxICovCisJCWlmIChlcnEtPmxlbmd0aCA+IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbikKKwkJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy9pZiAoKGtpZCA9PSBwQWRhcHRlci0+UG9ydENmZy5EZWZhdWx0S2V5SWQpKQorCQkvL2VycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKworCX0KKwllbHNlIGlmIChraWQgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vIGNvcHkgZGVmYXVsdCBrZXkgSUQKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+ZmxhZ3MgPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCArIDE7CQkJLyogTkI6IGJhc2UgMSAqLworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50CitydF9pb2N0bF9zZXRwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlcjsKKwlQT1NfQ09PS0lFIHBPYmo7CisJY2hhciAqdGhpc19jaGFyID0gZXh0cmE7CisJY2hhciAqdmFsdWU7CisJaW50ICBTdGF0dXM9MDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZGFwdGVyLT5PU19Db29raWU7CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCQlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoISp0aGlzX2NoYXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkgICAgKnZhbHVlKysgPSAwOworCisJaWYgKCF2YWx1ZSkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkvLyByZWplY3Qgc2V0dGluZyBub3RoaW5nIGJlc2lkZXMgQU5ZIHNzaWQoc3NpZExlbj0wKQorICAgIGlmICghKnZhbHVlICYmIChzdHJjbXAodGhpc19jaGFyLCAiU1NJRCIpICE9IDApKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWZvciAoUFJUTVBfUFJJVkFURV9TRVRfUFJPQyA9IFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0M7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MrKykKKwl7CisJICAgIGlmIChzdHJjbXAodGhpc19jaGFyLCBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lKSA9PSAwKQorCSAgICB7CisJICAgICAgICBpZighUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+c2V0X3Byb2MocEFkYXB0ZXIsIHZhbHVlKSkKKwkgICAgICAgIHsJLy9GQUxTRTpTZXQgcHJpdmF0ZSBmYWlsZWQgdGhlbiByZXR1cm4gSW52YWxpZCBhcmd1bWVudAorCQkJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgICAgICB9CisJCSAgICBicmVhazsJLy9FeGl0IGZvciBsb29wLgorCSAgICB9CisJfQorCisJaWYoUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSA9PSBOVUxMKQorCXsgIC8vTm90IGZvdW5kIGFyZ3VtZW50CisJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zZXRwYXJhbTo6IChpd3ByaXYpIE5vdCBTdXBwb3J0IFNldCBDb21tYW5kIFslcz0lc11cbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwl9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworCUlOVAkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAoZXh0cmEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisgICAgc3ByaW50ZihleHRyYSwgIlxuXG4iKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCSAgICAvL3NwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3Mgd2l0aG91dCByZXRyeSAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJeworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3Mgd2l0aG91dCByZXRyeSAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgLSAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisJfQorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgYWZ0ZXIgcmV0cnkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBmYWlsIHRvIFJjdiBBQ0sgYWZ0ZXIgcmV0cnkgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJUUyBTdWNjZXNzIFJjdiBDVFMgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJUUyBGYWlsIFJjdiBDVFMgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggd2l0aCBDUkMgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGRyb3AgZHVlIHRvIG91dCBvZiByZXNvdXJjZSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyKTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkdXBsaWNhdGUgZnJhbWUgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJGYWxzZSBDQ0EgKG9uZSBzZWNvbmQpICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCk7CisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCWlmIChwQWQtPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwkJZWxzZQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJeworICAgIAlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJXcGFTdXBwbGljYW50VVAgICAgICAgICAgICAgICAgID0gJWRcblxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCB3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordm9pZAlnZXRCYUluZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE91dEJ1ZikKK3sKKwlJTlQgaSwgajsKKwlCQV9PUklfRU5UUlkgKnBPcmlCQUVudHJ5OworCUJBX1JFQ19FTlRSWSAqcFJlY0JBRW50cnk7CisKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJaWYgKCgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJCXx8IChwRW50cnktPlZhbGlkQXNXRFMpIHx8IChwRW50cnktPlZhbGlkQXNNZXNoKSkKKwkJeworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIChBaWQgPSAlZCkgKEFQKSAtXG4iLAorICAgICAgICAgICAgICAgIHBPdXRCdWYsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW1JlY2lwaWVudF1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBSZWNCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbcEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIExhc3RJbmRTZXE9JWQsIFJlb3JkZXJpbmdQa3RzPSVkXG4iLCBwT3V0QnVmLCBqLCBwUmVjQkFFbnRyeS0+QkFXaW5TaXplLCBwUmVjQkFFbnRyeS0+TGFzdEluZFNlcSwgcFJlY0JBRW50cnktPmxpc3QucWxlbik7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiIsIHBPdXRCdWYpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tPcmlnaW5hdG9yXVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcE9yaUJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgU3RhcnRTZXE9JWQsIEN1clR4U2VxPSVkXG4iLCBwT3V0QnVmLCBqLCBwT3JpQkFFbnRyeS0+QkFXaW5TaXplLCBwT3JpQkFFbnRyeS0+U2VxdWVuY2UsIHBFbnRyeS0+VHhTZXFbal0pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG5cbiIsIHBPdXRCdWYpOworCQl9CisgICAgICAgIGlmIChzdHJsZW4ocE91dEJ1ZikgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitzdGF0aWMgaW50CitydF9wcml2YXRlX3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworICAgIElOVAkJCQlTdGF0dXMgPSAwOworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZDsKKwlQT1NfQ09PS0lFCQlwT2JqOworICAgIHUzMiAgICAgICAgICAgICBzdWJjbWQgPSB3cnEtPmZsYWdzOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwkJcEFkID0gZGV2LT5tbF9wcml2OworCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoZXh0cmEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisgICAgc3dpdGNoKHN1YmNtZCkKKyAgICB7CisKKyAgICAgICAgY2FzZSBTSE9XX0NPTk5fU1RBVFVTOgorICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDZW50cmFsQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGlmIChJTkZSQV9PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWQoQVA6ICVzWyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiU3NpZD0lcyAsU3NpZGxlbiA9ICVkXG4iLHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJZWxzZQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgc3ByaW50ZihleHRyYSwgIkRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIkNvbm5TdGF0dXMgaXMgbm90IGNvbm5lY3RlZFxuIikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0hPV19EUlZJRVJfVkVSSU9OOgorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkRyaXZlciB2ZXJzaW9uLSVzLCAlcyAlc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OLCBfX0RBVEVfXywgX19USU1FX18gKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGNhc2UgU0hPV19CQV9JTkZPOgorICAgICAgICAgICAgZ2V0QmFJbmZvKHBBZCwgZXh0cmEpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBTSE9XX0RFU0NfSU5GTzoKKwkJCXsKKwkJCQlTaG93X0Rlc2NJbmZvX1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PRkY6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPZmZcbiIpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09OOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gVFJVRTsKKyAgICAgICAgICAgIC8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT25cbiIpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgU0hPV19ETFNfRU5UUllfSU5GTzoKKwkJCXsKKwkJCQlTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQljYXNlIFNIT1dfQ0ZHX1ZBTFVFOgorCQkJeworCQkJCVN0YXR1cyA9IFJUTVBTaG93Q2ZnVmFsdWUocEFkLCB3cnEtPnBvaW50ZXIsIGV4dHJhKTsKKwkJCQlpZiAoU3RhdHVzID09IDApCisJCQkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBTSU9DU0lXTUxNRQoraW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOworCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKwlpZiAocE1sbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2gocE1sbWUtPmNtZCkKKwl7CisjaWZkZWYgSVdfTUxNRV9ERUFVVEgKKwkJY2FzZSBJV19NTE1FX0RFQVVUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKKwkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEZUF1dGhSZXEsIHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSk7CisJCQlNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gSVdfTUxNRV9ERUFVVEggLy8KKyNpZmRlZiBJV19NTE1FX0RJU0FTU09DCisJCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19GVU5DVElPTl9fKSk7CisJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisKKwkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CitpbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorICAgICAgICAgICAgeworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9QUklWQUNZX0lOVk9LRUQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJCX0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworCQkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKyAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWRlZmF1bHQ6CisgICAgCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOworCXJldHVybiAwOworfQorCit2b2lkIGZuU2V0Q2lwaGVyS2V5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAorICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQoreworICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBMRU5fVEtJUF9FSyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIGtleUlkeCwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOworCisgICAgaWYgKGJHVEspCisgICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAorICAgIAkJCQkJCQkgIEJTUzAsCisgICAgCQkJCQkJCSAga2V5SWR4LAorICAgIAkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisgICAgCQkJCQkJCSAgTlVMTCk7CisgICAgZWxzZQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0pOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQorCQkJeworICAgIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKyAgICBpbnQga2V5SWR4LCBhbGcgPSBleHQtPmFsZzsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKKwl7CisgICAgICAgIGtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAgICAgLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQorCSAgICBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgQlNTSURfV0NJRCk7CisgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKWtleUlkeCk7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpSZW1vdmUgYWxsIGtleXMhKGVuY29kaW5nLT5mbGFncyA9ICV4KVxuIiwgX19GVU5DVElPTl9fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbGcpIHsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX05PTkVcbiIsIF9fRlVOQ1RJT05fXykpOworICAgIAkJCWJyZWFrOworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQl9CisgICAgICAgIAkJZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisgICAgCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICAgICAgICAgIAlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkJZGVmYXVsdDoKKyAgICAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlQQ0hBUiBwS2V5ID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0XG4iKSk7CisKKwltYXhfa2V5X2xlbiA9IGVuY29kaW5nLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7CisJaWYgKG1heF9rZXlfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkKKwl7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4LS07CisKKwkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCWlmIChpZHggIT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlleHQtPmtleV9sZW4gPSAwOworCXN3aXRjaChwQWQtPlN0YUNmZy5XZXBTdGF0dXMpIHsKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiBtYXhfa2V5X2xlbikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOworCQkJCXBLZXkgPSAmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJCWVsc2UKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKworCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAzMjsKKwkJCQlwS2V5ID0gJnBBZC0+U3RhQ2ZnLlBNS1swXTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KQorCXsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQltZW1jcHkoZXh0LT5rZXksIHBLZXksIGV4dC0+a2V5X2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DU0lXR0VOSUUKK2ludCBydF9pb2N0bF9zaXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gTUFYX0xFTl9PRl9SU05JRSB8fAorCSAgICAod3JxdS0+ZGF0YS5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoKQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIGV4dHJhLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBNQVhfTEVOX09GX1JTTklFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKworaW50IHJ0X2lvY3RsX2dpd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCisJaWYgKChwQWQtPlN0YUNmZy5SU05JRV9MZW4gPT0gMCkgfHwKKwkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwl7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZmRlZiBTSU9DU0lXR0VOSUUKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKQorCQlyZXR1cm4gLUUyQklHOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJbWVtY3B5KGV4dHJhLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCVVDSEFSIFJTTkllID0gSUVfV1BBOworCisJCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IChwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyKSkgLy8gSUQsIExlbgorCQkJcmV0dXJuIC1FMkJJRzsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKKwkJCVJTTkllID0gSUVfUlNOOworCisJCWV4dHJhWzBdID0gKGNoYXIpUlNOSWU7CisJCWV4dHJhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCQltZW1jcHkoZXh0cmErMiwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3Bta3NhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOworCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCisJaWYgKHBQbWtzYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKKwlzd2l0Y2gocFBta3NhLT5jbWQpCisJeworCQljYXNlIElXX1BNS1NBX0ZMVVNIOgorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9SRU1PVkU6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkgICAgICAgIHsKKwkJICAgICAgICAJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRCwgMTYpOworCQkJCQlmb3IgKGlkeCA9IENhY2hlZElkeDsgaWR4IDwgKHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtIC0gMSk7IGlkeCsrKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5CU1NJRFswXSwgTUFDX0FERFJfTEVOKTsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLlBNS0lEWzBdLCAxNik7CisJCQkJCX0KKwkJCQkJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0tLTsKKwkJCSAgICAgICAgYnJlYWs7CisJCSAgICAgICAgfQorCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX1JFTU9WRVxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfQUREOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJCSAgICAgICAgYnJlYWs7CisJICAgICAgICB9CisKKwkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJICAgICAgICB7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOworCSAgICAgICAgfQorCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0FERFxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIFVua25vdyBDb21tYW5kISFcbiIpKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vICNpZiBXSVJFTEVTU19FWFQgPiAxNworCisjaWZkZWYgREJHCitzdGF0aWMgaW50CitydF9wcml2YXRlX2lvY3RsX2JicChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCisJCQl7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlID0gTlVMTDsKKwlVQ0hBUgkJCQlyZWdCQlAgPSAwOworCVVJTlQzMgkJCQliYnBJZDsKKwlVSU5UMzIJCQkJYmJwVmFsdWU7CisJQk9PTEVBTgkJCQliSXNQcmludEFsbEJCUCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisKKwltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCWlmICh3cnEtPmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwkJCQl7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IHdycS0+cG9pbnRlcjsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzXG4iLCB0aGlzX2NoYXIpKTsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzLCB2YWx1ZT0lc1xuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCQkJaWYgKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJaWYgKChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkgJiYgKHNzY2FuZih2YWx1ZSwgIiV4IiwgJihiYnBWYWx1ZSkpID09IDEpKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKwkJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisgICAgCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworICAgIAkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCX0KKwllbHNlCisJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKworbmV4dDoKKwlpZiAoYklzUHJpbnRBbGxCQlApCisJeworCQltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisJCWZvciAoYmJwSWQgPSAwOyBiYnBJZCA8PSAxMzY7IGJicElkKyspCisJCXsKKwkJICAgIGlmIChzdHJsZW4oZXh0cmEpID49IChJV19QUklWX1NJWkVfTUFTSyAtIDEwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYICAgICIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworCQkJaWYgKGJicElkJTUgPT0gNCkKKwkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJcbiIpOworCQl9CisKKyAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09cnRfcHJpdmF0ZV9pb2N0bF9iYnBcblxuIikpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworaW50IHJ0X2lvY3RsX3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworICAgIFVJTlQzMiAgICAgICAgICByYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZSwgZml4ZWQgPSB3cnF1LT5iaXRyYXRlLmZpeGVkOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7CisgICAgLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQorICAgICAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKKyAgICAqLworICAgIGlmIChyYXRlID09IC0xKQorICAgIHsKKwkJLy9BdXRvIFJhdGUKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCVNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChmaXhlZCkKKyAgICAgICAgeworICAgICAgICAJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorICAgICAgICAgICAgICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisgICAgICAgICAgICAgICAgUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIHJhdGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihIdE1jcz0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJhdGUgPSBYLCBmaXhlZCA9IDAgPT4gKHJhdGVzIDw9IFgpCisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisgICAgaW50IHJhdGVfaW5kZXggPSAwLCByYXRlX2NvdW50ID0gMDsKKyAgICBIVFRSQU5TTUlUX1NFVFRJTkcgaHRfc2V0dGluZzsKKyAgICBfX3MzMiByYWxpbmtyYXRlW10gPQorCXsyLCAgNCwgICAxMSwgIDIyLCAvLyBDQ0sKKwkxMiwgMTgsICAgMjQsICAzNiwgNDgsIDcyLCA5NiwgMTA4LCAvLyBPRkRNCisJMTMsIDI2LCAgIDM5LCAgNTIsICA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsICA1MiwgIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTM5LCA3OCwgIDExNywgMTU2LCAyMzQsIDMxMiwgMzUxLCAzOTAsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkyNywgNTQsICAgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJCQkJCQkJCQkJICAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTE0LCAyOSwgICA0MywgIDU3LCAgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgICA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk0MywgODcsICAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMzAsIDYwLCAgIDkwLCAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDYwMCwgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTkwLCAxODAsIDI3MCwgMzYwLCA1NDAsIDcyMCwgODEwLCA5MDB9OwkJCQkJCQkJCQkgIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCisKKyAgICByYXRlX2NvdW50ID0gc2l6ZW9mKHJhbGlua3JhdGUpL3NpemVvZihfX3MzMik7CisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkgJiYKKyAgICAgICAgKElORlJBX09OKHBBZCkpICYmCisgICAgICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fCAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKSkKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisgICAgZWxzZQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorICAgIHsKKyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoyNCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqNDgpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpICsgNDsKKyAgICBlbHNlIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKTsKKworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisKKyAgICBpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCisgICAgICAgIHJhdGVfaW5kZXggPSByYXRlX2NvdW50OworCisgICAgd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IHJhbGlua3JhdGVbcmF0ZV9pbmRleF0gKiA1MDAwMDA7CisgICAgd3JxdS0+Yml0cmF0ZS5kaXNhYmxlZCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfaGFuZGxlcltdID0KK3sKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25hbWUsCQkJLyogU0lPQ0dJV05BTUUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyZXEsCQkgICAgLyogU0lPQ1NJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmVxLAkJICAgIC8qIFNJT0NHSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bW9kZSwJCSAgICAvKiBTSU9DU0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd21vZGUsCQkgICAgLyogU0lPQ0dJV01PREUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhbmdlLAkJICAgIC8qIFNJT0NHSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhcCwgICAgICAgICAgICAvKiBTSU9DU0lXQVAgICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2FwLAkJICAgIC8qIFNJT0NHSVdBUCAgICAgKi8KKyNpZmRlZiBTSU9DU0lXTUxNRQorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkgICAgICAgIC8qIFNJT0NTSVdNTE1FICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV01MTUUgKi8KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJCSAgICAvKiBTSU9DR0lXQVBMSVNUICovCisjaWZkZWYgU0lPQ0dJV1NDQU4KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3c2NhbiwJCSAgICAvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3NjYW4sCQkgICAgLyogU0lPQ0dJV1NDQU4gICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1NDQU4gICAqLworI2VuZGlmIC8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2Vzc2lkLAkJICAgIC8qIFNJT0NTSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCQkgICAgLyogU0lPQ0dJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJCSAgICAvKiBTSU9DU0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25pY2tuLAkJICAgIC8qIFNJT0NHSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdyYXRlLCAgICAgICAgICAvKiBTSU9DU0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhdGUsICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cnRzLAkJICAgIC8qIFNJT0NTSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkJICAgIC8qIFNJT0NHSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJCSAgICAvKiBTSU9DU0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyYWcsCQkgICAgLyogU0lPQ0dJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2dlbmllLCAgICAgICAgIC8qIFNJT0NTSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ0dJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkJICAgIC8qIFNJT0NTSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXV0aCwJCSAgICAvKiBTSU9DR0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZWV4dCwJICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgICovCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X3ByaXZfaGFuZGxlcnNbXSA9IHsKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAwICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMSAqLworI2lmbmRlZiBDT05GSUdfQVBfU1VQUE9SVAorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zZXRwYXJhbSwgLyogKyAweDAyICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDIgKi8KKyNlbmRpZiAvLyBDT05GSUdfQVBfU1VQUE9SVCAvLworI2lmZGVmIERCRworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2lvY3RsX2JicCwgLyogKyAweDAzICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDMgKi8KKyNlbmRpZgorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA4ICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIC8qICsgMHgwOSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEEgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBCICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTAgKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9zaG93LCAvKiArIDB4MTEgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEyICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxOCAqLworfTsKKworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZiA9Cit7CisjZGVmaW5lCU4oYSkJKHNpemVvZiAoYSkgLyBzaXplb2YgKGFbMF0pKQorCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIHJ0X2hhbmRsZXIsCisJLm51bV9zdGFuZGFyZAk9IHNpemVvZihydF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIHJ0X3ByaXZfaGFuZGxlcnMsCisJLm51bV9wcml2YXRlCQk9IE4ocnRfcHJpdl9oYW5kbGVycyksCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHByaXZ0YWIsCisJLm51bV9wcml2YXRlX2FyZ3MJPSBOKHByaXZ0YWIpLAorI2lmIElXX0hBTkRMRVJfVkVSU0lPTiA+PSA3CisgICAgLmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMsCisjZW5kaWYKK307CisKK0lOVCBSVE1QU2V0SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIEJzc2lkOworICAgIFJUXzgwMl8xMV9QSFlfTU9ERSAgICAgICAgICAgICAgICAgIFBoeU1vZGU7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgU3RhQ29uZmlnOworICAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtYmxlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU1heDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBQTkRJU184MDJfMTFfS0VZICAgICAgICAgICAgICAgICAgICBwS2V5ID0gTlVMTDsKKyAgICBQTkRJU184MDJfMTFfV0VQCQkJICAgICAgICBwV2VwS2V5ID1OVUxMOworICAgIFBORElTXzgwMl8xMV9SRU1PVkVfS0VZICAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBOVUxMOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZywgKnBDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldFR5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm93OworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IDA7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUywgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXJUZW1wOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU9JRF9TRVRfSFRfUEhZTU9ERQkJCQkJSFRfUGh5TW9kZTsJLy8xMW4gLGthdGh5CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIFBORElTXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgIHBQbWtJZCA9IE5VTEw7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4U3RhdGUgPSBGQUxTRTsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IEZBTFNFOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2VuYWJsZSA9IDA7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJY3RtcDsKKyNlbmRpZiAvLyBTTk1QX1NVUFBPUlQgLy8KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPlJUTVBTZXRJbmZvcm1hdGlvbigpLAkweCUwOHhcbiIsIGNtZCYweDdGRkYpKTsKKyAgICBzd2l0Y2goY21kICYgMHg3RkZGKSB7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggPCBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJCQkvLyBPbmx5IGF2YWxpYWJsZSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1pbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKCEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkgJiYgIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMT05HICAgQ291bnRyeTsKKyAgICAgICAgICAgICAgICBVQ0hBUglUbXBQaHk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ291bnRyeSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpKENvdW50cnkgJiAweDAwMDAwMEZGKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikoKENvdW50cnkgPj4gOCkgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBUbXBQaHkgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJCQkvLyBCdWlsZCBhbGwgY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uCisJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiAoQTolZCAgQi9HOiVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsCisJCQkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisgI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgTm93ID0gamlmZmllczsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sIFR4Q250ID0gJWQgXG4iLCBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCkpOworCisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQkvL0JlbnNvbiBhZGQgMjAwODA1MjcsIHdoZW4gcmFkaW8gb2ZmLCBzdGEgZG9uJ3QgbmVlZCB0byBzY2FuCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJCQlicmVhazsKKworCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCXsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIHNjYW5uaW5nIG5vdyAhISFcbiIpKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCWlmIChwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA+IDEwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKyAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgCVBDSEFSIHBTc2lkU3RyaW5nID0gTlVMTDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICAgICAgaWYgKFNzaWQuU3NpZExlbmd0aCA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAlpZiAoU3NpZC5Tc2lkTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKTsKKyAgICAgICAgICAgICAgICAJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAgICAgCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCQkJaWYgKHBTc2lkU3RyaW5nKQorCQkJCQkJeworCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQkJCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIFNzaWQuU3NpZCwgU3NpZC5Tc2lkTGVuZ3RoKTsKKwkgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZyk7CisJCQkJCQkJa2ZyZWUocFNzaWRTdHJpbmcpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCVN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKworCQkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvICE9IFJhZGlvU3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvID0gUmFkaW9TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvICE9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUEhZX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQaHlNb2RlIDw9IE1heFBoeU1vZGUpCisJCQkJeworICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQl9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWQpXG4iLCBQaHlNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlN0YUNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gU3RhQ29uZmlnLkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSBTdGFDb25maWcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSAxOyAvLyAyMDAzLTEwLTMwIGFsd2F5cyBTSE9SVCBTTE9UIGNhcGFibGUKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSAhPSBTdGFDb25maWcuQWRob2NNb2RlKSAmJgorCQkJCQkoU3RhQ29uZmlnLkFkaG9jTW9kZSA8PSBNYXhQaHlNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mICJVU0UgT0ZETSByYXRlIG9yIG5vdCIgaW4gQURIT0MgbW9kZQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZXR0aW5nIGNoYW5nZWQsIG5lZWQgdG8gcmVzZXQgY3VycmVudCBUWCByYXRlIGFzIHdlbGwgYXMgQkVBQ09OIGZyYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICAgICAgeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gU3RhQ29uZmlnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNYWtlSWJzc0JlYWNvbihwQWRhcHRlcik7ICAgICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNFbmFibGVJYnNzU3luYyhwQWRhcHRlcik7ICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAoQnVyc3Q9JWQsIFByb3RlY3Rpb249JWxkLFNob3J0U2xvdD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXJ5UmF0ZXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BSRUFNQkxFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUHJlYW1ibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB8fCAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUF1dG8pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSAoPSVkKVxuIiwgUHJlYW1ibGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1dFUF9TVEFUVVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgVEtJUCwgQUVTLCBXRVAgYXJlIGFsbCBzdXBwb3J0ZWQuIEl0IHNob3VsZCBub3QgaGF2ZSBhbnkgaW52YWxpZCBzZXR0aW5nCisgICAgICAgICAgICAgICAgaWYgKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgIT0gV2VwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTICg9JWQpXG4iLFdlcFN0YXR1cykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChBdXRoTW9kZSA+IE5kaXM4MDJfMTFBdXRoTW9kZU1heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gQXV0aE1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gQXV0aE1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgKD0lZCkgXG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMU1vbml0b3IpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyAgPSAtRUlOVkFMOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSAodW5rbm93bilcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkgY2FzZSBPSURfODAyXzExX1JFTU9WRV9XRVA6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX1dFUFxuIikpOworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfS0VZX0lOREVYKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkJCUtleUlkeCA9ICooTkRJU184MDJfMTFfS0VZX0lOREVYICopIHdycS0+dS5kYXRhLnBvaW50ZXI7CisKKwkJCQlpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisJCQkJCWlmIChLZXlJZHggPj0gNCl7CisJCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUzoKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+Q291bnRlcnM4MDIzLCBzaXplb2YoQ09VTlRFUl84MDJfMykpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisgICAgICAgICAgICBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlcyA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChSdHNUaHJlc2ggPiBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IChVU0hPUlQpUnRzVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQgKD0lbGQpXG4iLFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAoPSVsZCkgXG4iLEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1BPV0VSX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkNBTSIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTWF4X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkZhc3RfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJMZWdhY3lfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1BPV0VSX01PREUgKD0lZClcbiIsUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAgPCBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyVGVtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUG93ZXJUZW1wID4gMTAwKQorCQkJCQlQb3dlclRlbXAgPSAweGZmZmZmZmZmOyAgLy8gQVVUTworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBQb3dlclRlbXA7IC8va2VlcCBjdXJyZW50IHNldHRpbmcuCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJfQorCSAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19UWVBFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZOZXRUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMURTKQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQik7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTI0KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQkdfTUlYRUQpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQSk7CisJCQkJZWxzZQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFICg9JWQpXG4iLE5ldFR5cGUpKTsKKwkJICAgIH0KKwkJCWJyZWFrOworICAgICAgICAvLyBGb3IgV1BBIFBTSyBQTUsga2V5CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9BRERfV1BBOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISEgW0F1dGhNb2RlICE9IFdQQVBTSy9XUEEyUFNLL1dQQU5PTkVdXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkgICAgIC8vIE9ubHkgZm9yIFdQQSBQU0sgbW9kZQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFJhQ29uZmlnIGFzIFBTSyBhZ2VudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfS0VZOgorICAgICAgICAgICAgcFJlbW92ZUtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwUmVtb3ZlS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFJlbW92ZUtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwUmVtb3ZlS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUTVBXUEFSZW1vdmVLZXlQcm9jKHBBZGFwdGVyLCBwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIFJlbW92ZSBXUEEgS2V5ISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gcFJlbW92ZUtleS0+S2V5SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleSlcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoS2V5SWRbJWRdIG91dCBvZiByYW5nZSlcbiIsIEtleUlkeCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBSZW1vdmVLZXktPktleUluZGV4LCBwUmVtb3ZlS2V5LT5MZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBSZW1vdmVLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIE5ldyBmb3IgV1BBCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BRERfS0VZOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QQWRkS2V5KHBBZGFwdGVyLCBwS2V5KTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcENvbmZpZyA9ICZDb25maWc7CisKKyAgICAgICAgICAgICAgICBpZiAoKHBDb25maWctPkJlYWNvblBlcmlvZCA+PSAyMCkgJiYgKHBDb25maWctPkJlYWNvblBlcmlvZCA8PTQwMCkpCisgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChVU0hPUlQpIHBDb25maWctPkJlYWNvblBlcmlvZDsKKworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChVU0hPUlQpIHBDb25maWctPkFUSU1XaW5kb3c7CisgICAgICAgICAgICAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKHBDb25maWctPkRTQ29uZmlnLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgICAgIC8vCisJCQkJLy8gU2F2ZSB0aGUgY2hhbm5lbCBvbiBNbG1lQXV4IGZvciBDbnRsT2lkUlRCc3NpZFByb2MgdXNlZC4KKwkJCQkvLworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAoQmVhY25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaD0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkJlYWNvblBlcmlvZCwgcENvbmZpZy0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREU6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkgICAgUE9JRF9TRVRfSFRfUEhZTU9ERQlwSFRQaHlNb2RlID0gJkhUX1BoeU1vZGU7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSFRfUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnBIVFBoeU1vZGUJKFBoeU1vZGUgPSAlZCxUcmFuc21pdE5vID0gJWQsIEh0TW9kZSA9CSVkLAlFeHRPZmZzZXQgPQklZCAsIE1DUyA9ICVkLCBCVyA9CSVkLAlTVEJDID0gJWQsIFNIT1JUR0kgPSAlZCkgXG4iLAorCQkJCXBIVFBoeU1vZGUtPlBoeU1vZGUsIHBIVFBoeU1vZGUtPlRyYW5zbWl0Tm8scEhUUGh5TW9kZS0+SHRNb2RlLHBIVFBoeU1vZGUtPkV4dE9mZnNldCwKKwkJCQlwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLAlwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZQk+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJCQlSVE1QU2V0SFQocEFkYXB0ZXIsCXBIVFBoeU1vZGUpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFKE1DUz0lZCxCVz0lZCxTR0k9JWQsU1RCQz0lZClcbiIsCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDKSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkc6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVTE9ORyBhcHNkIDsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXBzZCwgd3JxLT51LmRhdGEucG9pbnRlciwJd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXxCMzF+QjcJfAlCNn5CNQkgfAkgQjQJIHwJIEIzCSB8CUIyCSB8CUIxCSB8CSAgIEIwCQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfCBSc3ZkCXwgTWF4IFNQIExlbiB8IEFDX1ZPIHwgQUNfVkkgfCBBQ19CSyB8IEFDX0JFIHwgQVBTRAlDYXBhYmxlCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gKGFwc2QgJiAweDAwMDAwMDAxKSA/IFRSVUUgOglGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSAoKGFwc2QJJiAweDAwMDAwMDAyKSA+PiAxKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSAoKGFwc2QJJiAweDAwMDAwMDA0KSA+PiAyKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSAoKGFwc2QJJiAweDAwMDAwMDA4KSA+PiAzKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSAoKGFwc2QJJiAweDAwMDAwMDEwKSA+PiA0KQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoCT0gKFVDSEFSKSgoYXBzZAkmIDB4MDAwMDAwNjApID4+IDUpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkcgKGFwc2Q9MHglbHgsIEFQU0RDYXA9JWQsIFtCRSxCSyxWSSxWT109WyVkLyVkLyVkLyVkXSwJTWF4U1BMZW49JWQpXG4iLCBhcHNkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSwKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkssCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJLy8gRHJpdmVyIG5lZWRzCXRvIG5vdGlmeSBBUCB3aGVuIFBTTSBjaGFuZ2VzCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlCSE9IHBBZGFwdGVyLT5TdGFDZmcuUHNtKQorCQkJCXsKKwkJCQkJTWxtZVNldFBzbUJpdChwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKTsKKwkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlLAlUUlVFKTsKKwkJCQl9CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTSAoYkFQU0RGb3JjZVBvd2VyU2F2ZTolZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJQk9PTEVBTglvbGR2YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGU7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKG9sZHZhbHVlICYmCSFwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQkJCXsKKwkJCQkJaW50CWk7CisJCQkJCS8vIHRlYXIJZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCQkJZm9yCShpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy8gdGVhcglkb3duIHBlZXIgZGxzIHRhYmxlCWVudHJ5CisJCQkJCWZvcgkoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUlRfODAyXzExX0RMUwlEbHM7CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCQkJCVJUTVBNb3ZlTWVtb3J5KCZEbHMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJCQkmRGxzKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNIFxuIikpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfV01NOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1dNTSAoPSVkKQlcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkvLworCQkJLy8gU2V0IE5kaXNSYWRpb1N0YXRlT2ZmIHRvCVRSVUUsIGluc3RlYWQgb2YgY2FsbGVkCU1sbWVSYWRpb09mZi4KKwkJCS8vIExhdGVyIG9uLCBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYLT5OdW1iZXJPZkl0ZW1zIHNob3VsZCBiZQkwCisJCQkvLyB3aGVuCXF1ZXJ5IE9JRF84MDJfMTFfQlNTSURfTElTVC4KKwkJCS8vCisJCQkvLyBUUlVFOiAgTnVtYmVyT2ZJdGVtcwl3aWxsIHNldCB0bwkwLgorCQkJLy8gRkFMU0U6IE51bWJlck9mSXRlbXMJbm8gY2hhbmdlLgorCQkJLy8KKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPQlUUlVFOworCQkJLy8gU2V0IHRvIGltbWVkaWF0ZWx5IHNlbmQgdGhlIG1lZGlhIGRpc2Nvbm5lY3QJZXZlbnQKKwkJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzCT0gVFJVRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJXG4iKSk7CisKKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPQlDTlRMX0lETEUpCisJCQkJeworCQkJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUJYnVzeSwgcmVzZXQJTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkJCX0KKworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUsCisJCQkJCTAsCisJCQkJCU5VTEwpOworCisJCQkJU3RhdGVNYWNoaW5lVG91Y2hlZAk9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0lNTUVfQkFfQ0FQOgorCQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9CQUNBUF9TVFJVQykpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJT0lEX0JBQ0FQX1NUUlVDIE9yZGUgOworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmT3JkZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJaWYgKE9yZGUuUG9saWN5ID4gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoT3JkZS5Qb2xpY3kgPT0gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBPcmRlLkF1dG9CQTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOyAvLyB3ZSBvbmx5IHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCisJCQkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID4gTUFYX1JYX1JFT1JERVJCVUYpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gTUFYX1JYX1JFT1JERVJCVUY7CisKKwkJCQkJfQorCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihPcmRlLkF1dG9CQSA9ICVkKSAoUG9saWN5PSVkKShSZUJBV2luTGltaXQ9JWQpKFR4QkFXaW5MaW1pdD0lZCkoQXV0b01vZGU9JWQpXG4iLE9yZGUuQXV0b0JBLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3ksCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQscEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooTWltb1BzID0gJWQpKEFtc2R1RW5hYmxlID0gJWQpIChBbXNkdVNpemU9JWQpKE1wZHVEZW5zaXR5PSVkKVxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlLAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgU2V0IDo6IFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVQ0hBUgkJICAgICAgICBpbmRleDsKKwkJCQlPSURfQUREX0JBX0VOVFJZICAgIEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAgICAgKnBFbnRyeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoQkEuVElEID4gMTUpCisJCQkJeworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeQorCQkJCQkvL0FzIGFkLWhvYyBtb2RlLCBCQSBwYWlyIGlzIG5vdCBsaW1pdGVkIHRvIG9ubHkgQlNTSUQuIHNvIGFkZCB2aWEgT0lELgorCQkJCQlpbmRleCA9IEJBLlRJRDsKKwkJCQkJLy8gaW4gYWQgaG9jIG1vZGUsIHdoZW4gYWRkaW5nIEJBIHBhaXIsIHdlIHNob3VsZCBpbnNlcnQgdGhpcyBlbnRyeSBpbnRvIE1BQ0VudHJ5IHRvbworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgQkEuTUFDQWRkcik7CisJCQkJCWlmICghcEVudHJ5KQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBicmVhayBvbiBubyBjb25uZWN0aW9uLi0tLS06JXg6JXhcbiIsIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChCQS5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkgICAgaWYgKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gVFJVRSkKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSAweDEwOworCisJCQkJCQlCQU9yaVNlc3Npb25TZXRVcChwQWRhcHRlciwgcEVudHJ5LCBpbmRleCwgMCwgMTAwLCBUUlVFKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5KHBBZGFwdGVyLCBwRW50cnktPkFpZCwgQkEuTUFDQWRkciwgMCwgMHhmZmZmLCBCQS5USUQsIEJBLm5NU0RVLCBCQS5Jc1JlY2lwaWVudCk7CisJCQkJCX0KKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIFJlYyA9ICVkLiBNYWMgPSAleDoleDoleDoleDoleDoleCAuIFxuIiwKKwkJCQkJCUJBLklzUmVjaXBpZW50LCBCQS5NQUNBZGRyWzBdLCBCQS5NQUNBZGRyWzFdLCBCQS5NQUNBZGRyWzJdLCBCQS5NQUNBZGRyWzJdCisJCQkJCQksIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUE9JRF9BRERfQkFfRU5UUlkJcEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisJCQkJcEJBID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCQkJCWlmIChwQkEgPT0gTlVMTCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBrbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIikpOworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQShUSUQ9JWQsIGJBbGxUaWQ9JWQpXG4iLCBwQkEtPlRJRCwgcEJBLT5iQWxsVGlkKSk7CisKKwkJCQkJaWYgKCFwQkEtPmJBbGxUaWQgJiYgKHBCQS0+VElEID4gTlVNX09GX1RJRCkpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0VcbiIpKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+cEVudHJ5XG4iKSk7CisJCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgRkFMU0UsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKCBwQWRhcHRlciwgKFVDSEFSKXBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJa2ZyZWUocEJBKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBGb3IgV1BBX1NVUFBMSUNBTlQgdG8gc2V0IHN0YXRpYyB3ZXAga2V5CisgICAgCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgorICAgIAkgICAgcFdlcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAJICAgIGlmKHBXZXBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdlcEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAobGVuZ3RoIG1pc21hdGNoKSEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCSAgICAgICAgS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgIC8vIEtleUlkeCBtdXN0IGJlIDAgfiAzCisgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDQpCisgICAgCQkJeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAoS2V5SWR4IG11c3QgYmUgc21hbGxlciB0aGFuIDQpISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgQ2lwaGVyQWxnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIEtleTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBXZXBLZXktPktleUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIG9ubHkgc3VwcG9ydCBDSVBIRVJfV0VQNjQobGVuOjUpICYgQ0lQSEVSX1dFUDEyOChsZW46MTMpISFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZCA9IEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgICAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworICAgIAkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQIChpZD0weCV4LCBMZW49JWQtYnl0ZSksICVzXG4iLCBwV2VwS2V5LT5LZXlJbmRleCwgcFdlcEtleS0+S2V5TGVuZ3RoLCAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyAiUG9ydCBTZWN1cmVkIjoiUG9ydCBOT1QgU2VjdXJlZCIpKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwV2VwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgY2FzZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV1BBIE1JQyBlcnJvciBzaG91bGQgYmxvY2sgYXNzb2NpYXRpb24gYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfU0VUX0NPVU5URVJNRUFTVVJFUyBiQmxvY2tBc3NvYz0lc1xuIiwgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA/ICJUUlVFIjoiRkFMU0UiKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmd3BhX3N1cHBsaWNhbnRfZW5hYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgIAkJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gd3BhX3N1cHBsaWNhbnRfZW5hYmxlOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgKnBJbmZvOworCQkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgICAgICAgICAgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKSBNc2dFbGVtLT5Nc2c7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEluZm8sIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTWxtZURlYXV0aFJlcUFjdGlvbihwQWRhcHRlciwgTXNnRWxlbSk7CisJCQkJa2ZyZWUoTXNnRWxlbSk7CisKKyAgICAgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OIChSZWFzb249JWQpXG4iLCBwSW5mby0+UmVhc29uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKwkJCQlwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeFN0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gSUVFRTgwMjF4U3RhdGU7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVggKD0lZClcbiIsIElFRUU4MDIxeFN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVk6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKwkJCQkgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAoJWQpXG4iLCBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cykpOworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QTUtJRDoKKwkgICAgICAgIHBQbWtJZCA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkgICAgICAgIGlmKHBQbWtJZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBQbWtJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCSAgICAgICAgLy8gY2hlY2sgdGhlIFBNS0lEIGluZm9ybWF0aW9uCisJICAgICAgICBpZiAocFBta0lkLT5CU1NJREluZm9Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgUEJTU0lEX0lORk8JcEJzc0lkSW5mbzsKKwkJICAgICAgICBVSU5UCQlCc3NJZHg7CisJCSAgICAgICAgVUlOVAkJQ2FjaGVkSWR4OworCisJCSAgICAgICAgZm9yIChCc3NJZHggPSAwOyBCc3NJZHggPCBwUG1rSWQtPkJTU0lESW5mb0NvdW50OyBCc3NJZHgrKykKKwkJICAgICAgICB7CisJCQkgICAgICAgIC8vIHBvaW50IHRvIHRoZSBpbmRleGVkIEJTU0lEX0lORk8gc3RydWN0dXJlCisJCQkgICAgICAgIHBCc3NJZEluZm8gPSAoUEJTU0lEX0lORk8pICgoUFVDSEFSKSBwUG1rSWQgKyAyICogc2l6ZW9mKFVJTlQpICsgQnNzSWR4ICogc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgLy8gRmluZCB0aGUgZW50cnkgaW4gdGhlIHNhdmVkIGRhdGEgYmFzZS4KKwkJCSAgICAgICAgZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEJzc0lkSW5mby0+QlNTSUQsIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkpCisJCQkJCSAgICAgICAgYnJlYWs7CisJCQkgICAgICAgIH0KKworCQkJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCQkJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkJCSAgICAgICAgfQorCQkJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJCQkgICAgICAgIGVsc2UKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJCQkgICAgICAgIENhY2hlZElkeCA9IChwQnNzSWRJbmZvLT5CU1NJRFs1XSAlIFBNS0lEX05PKTsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgfQorCQkgICAgICAgIH0KKwkJCX0KKwkJCWlmKHBQbWtJZCkKKwkJCQlrZnJlZShwUG1rSWQpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZCwgU2hvcnRSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCwgU2hvcnRSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5Mb25nUmV0cnlMaW1pdD0gJWQsTG9uZ1JldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQsIExvbmdSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRVxuIikpOworCQkJcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkvL3BLZXkgPSAmV2VwS2V5OworCisJCQlpZiAoIHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisJCQl7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFLCBGYWlsZWQhIVxuIikpOworCQkJfQorCQkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJwS2V5LT5LZXlJbmRleCA9JWQsIHBLZXktPktleUxlbmd0aD0lZFxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworCisJCQkvLyBpdCBpcyBhIHNoYXJlZCBrZXkKKwkJCWlmIChLZXlJZHggPiA0KQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCQkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQkJfQorCQkJCS8vUmVzdGFydEFQSXNSZXF1aXJlZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmN0bXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJc3ByaW50ZigmY3RtcCwiJWQiLCBjdG1wKTsKKwkJCQlTZXRfQ2hhbm5lbF9Qcm9jKHBBZGFwdGVyLCAmY3RtcCk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgUlRNUFF1ZXJ5SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYICAgICAgICAgICAqcEJzc2lkTGlzdCA9IE5VTEw7CisgICAgUE5ESVNfV0xBTl9CU1NJRF9FWCAgICAgICAgICAgICAgICAgcEJzczsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgICpwQ29uZmlndXJhdGlvbiA9IE5VTEw7CisgICAgUlRfODAyXzExX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgKnBMaW5rU3RhdHVzID0gTlVMTDsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICAqcFN0YUNvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfU1RBVElTVElDUyAgICAgICAgICAgICAgKnBTdGF0aXN0aWNzID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbVR5cGU7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfTUVESUFfU1RBVEUgICAgICAgICAgICAgICAgICAgIE1lZGlhU3RhdGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSwgdWxJbmZvPTAsIE5ldHdvcmtUeXBlTGlzdFs0XSwgYXBzZCA9IDA7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzTGVuID0gMDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmID0gTlVMTCwgcFB0cjsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQ7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgUGFkZGluZyA9IDA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKwlVQ0hBUglkcml2ZXJWZXJzaW9uWzhdOworICAgIE9JRF9TRVRfSFRfUEhZTU9ERQkJCSAgICAgICAgKnBIVFBoeU1vZGUgPSBOVUxMOworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkvL2ZvciBzbm1wLCBrYXRoeQorCURlZmF1bHRLZXlJZHhWYWx1ZQkJCSpwS2V5SWR4VmFsdWU7CisJSU5UCQkJCQkJCXZhbHVlTGVuOworCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCXRtcFs2NF07CisjZW5kaWYgLy9TTk1QCisKKyAgICBzd2l0Y2goY21kKQorICAgIHsKKyAgICAgICAgY2FzZSBSVF9PSURfREVWSUNFX05BTUU6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoU1RBX05JQ19ERVZJQ0VfTkFNRSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgU1RBX05JQ19ERVZJQ0VfTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9WRVJTSU9OX0lORk86CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1ZFUlNJT05fSU5GTyBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDgqc2l6ZW9mKFVDSEFSKTsKKwkJCXNwcmludGYoJmRyaXZlclZlcnNpb25bMF0sICIlcyIsIFNUQV9EUklWRVJfVkVSU0lPTik7CisJCQlkcml2ZXJWZXJzaW9uWzddID0gJ1wwJzsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRyaXZlclZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJY2FzZSBSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVDMyKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1Q6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCS8qCisgICAgICAgICAgICAJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIAkgKi8KKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUIChTdGlsbCBzY2FubmluZylcbiIpKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKCVkIEJTUyByZXR1cm5lZClcbiIscEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworICAgICAgICAgICAgLy8gQ2xhY3VsYXRlIHRvdGFsIGJ1ZmZlciBzaXplIHJlcXVpcmVkCisgICAgICAgICAgICBCc3NCdWZTaXplID0gc2l6ZW9mKFVMT05HKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWxpZ24gcG9pbnRlciB0byA0IGJ5dGVzIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIC8vUGFkZGluZyA9IDQgLSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gJiAweDAwMDMpOworICAgICAgICAgICAgICAgIC8vaWYgKFBhZGRpbmcgPT0gNCkKKyAgICAgICAgICAgICAgICAvLyAgICBQYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICBCc3NCdWZTaXplICs9IChzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvciBzYWZldHkgaXNzdWUsIHdlIGFkZCAyNTYgYnl0ZXMganVzdCBpbiBjYXNlCisgICAgICAgICAgICBCc3NCdWZTaXplICs9IDI1NjsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBzYW1lIHNpemUgYXMgcGFzc2VkIGZyb20gaGlnaGVyIGxheWVyCisgICAgICAgICAgICBwQnVmID0ga21hbGxvYyhCc3NCdWZTaXplLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwQnVmID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEluaXQgODAyXzExX0JTU0lEX0xJU1RfRVggc3RydWN0dXJlCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQnVmLCBCc3NCdWZTaXplKTsKKyAgICAgICAgICAgIHBCc3NpZExpc3QgPSAoUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgpIHBCdWY7CisgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBidWZmZXIgbGVuZ3RoCisgICAgICAgICAgICBCc3NMZW4gPSA0OyAvLyBDb25zaXN0IG9mIE51bWJlck9mSXRlbXMKKyAgICAgICAgICAgIC8vIFBvaW50IHRvIHN0YXJ0IG9mIE5ESVNfV0xBTl9CU1NJRF9FWAorICAgICAgICAgICAgLy8gcFB0ciA9IHBCdWYgKyBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgcFB0ciA9IChQVUNIQVIpICZwQnNzaWRMaXN0LT5Cc3NpZFswXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBCc3MgPSAoUE5ESVNfV0xBTl9CU1NJRF9FWCkgcFB0cjsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEJzcy0+TWFjQWRkcmVzcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uSGlkZGVuID09IDEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9PSBGQUxTRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLworCQkJCQkvLyBXZSBtdXN0IHJldHVybiB0aGlzIFNTSUQgZHVyaW5nIDR3YXkgaGFuZHNoYWtpbmcsIG90aGVyd2lzZSBBZWdpcyB3aWxsIGZhaWxlZCB0byBwYXJzZSBXUEEgaW5mb21hdGlvbgorCQkJCQkvLyBhbmQgdGhlbiBmYWlsZWQgdG8gc2VuZCBFQVBPbCBmYXJhbWUuCisJCQkJCS8vCisJCQkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkKKwkJCQkJeworCQkJCQkJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisJCQkJCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgICAgICAJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+UHJpdmFjeSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlByaXZhY3k7CisgICAgICAgICAgICAgICAgcEJzcy0+UnNzaSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICAgICAgcEJzcy0+TmV0d29ya1R5cGVJblVzZSA9IE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5BdGltV2luOworCisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwsIHBCc3MtPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSUJTUzsKKworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcyArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcyArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciArPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+TGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgICAgIGlmICgoQnNzTGVuICsgcEJzcy0+TGVuZ3RoKSA8IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZWxzZQorICAgICAgICAgICAgaWYgKEJzc0xlbiA+IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbmRpZgorICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBCc3NpZExpc3QsIEJzc0xlbik7CisgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU19NRURJQV9TVEFURSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1lZGlhU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRCg9RU1QVFkpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT1RDT05OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQkJTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisJCQlOZGlzWmVyb01lbW9yeShTc2lkLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQltZW1jcHkoU3NpZC5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsCVNzaWQuU3NpZExlbmd0aCk7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNzaWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsIHNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTOgorICAgICAgICAgICAgcExpbmtTdGF0dXMgPSAoUlRfODAyXzExX0xJTktfU1RBVFVTICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwTGlua1N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q3VyclR4UmF0ZSA9IFJhdGVJZFRvNTAwS2Jwc1twQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZV07ICAgLy8gdW5pdCA6IDUwMCBrYnBzCisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkNoYW5uZWxRdWFsaXR5ID0gcEFkYXB0ZXItPk1sbWUuQ2hhbm5lbFF1YWxpdHk7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlJ4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5UeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKKyAgICAgICAgCQlwTGlua1N0YXR1cy0+Q2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwTGlua1N0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwTGlua1N0YXR1cyk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24gPSAoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93ID0gcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luOworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBDb25maWd1cmF0aW9uLT5EU0NvbmZpZyk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ29uZmlndXJhdGlvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKEJlYWNvblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoYW5uZWw9JWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kLCBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJa2ZyZWUocENvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzA6CisJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjAgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8wKDB4PSVseClcbiIsIHVsSW5mbykpOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8xOgorCQkJaWYgKChwQWRhcHRlci0+QW50ZW5uYS5maWVsZC5SeFBhdGgJPiAxKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKDB4PSVseClcbiIsdWxJbmZvKSk7CisJCQl9CisJCQllbHNlCisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMT0lZClcbiIscEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JTU0lfVFJJR0dFUig9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX1JTU0k6CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJOgorCQkJdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMToKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1RBVElTVElDUzoKKyAgICAgICAgICAgIHBTdGF0aXN0aWNzID0gKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhdGlzdGljcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTIFxuIikpOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycworCQkJICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZGFwdGVyKTsKKworICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgY2FsY3VsYXRpb24gb2Ygc3VjZXNzZnVsIGNvdW50CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IDwgcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZhaWxlZENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+QUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyNpZmRlZiBEQkcKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgLyAxMDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGF0aXN0aWNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9PSzoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgcFN0YUNvbmZpZyA9IChSVF84MDJfMTFfU1RBX0NPTkZJRyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhQ29uZmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUdcbiIpKTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUeEJ1cnN0ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUdXJib1JhdGUgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZUJHUHJvdGVjdGlvbiA9IHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZVNob3J0U2xvdFRpbWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lOworICAgICAgICAgICAgICAgIC8vcFN0YUNvbmZpZy0+QWRob2NNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+SHdSYWRpb1N0YXR1cyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvID09IFRSVUUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+UnN2MSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+U3lzdGVtRXJyb3JCaXRtYXAgPSBwQWRhcHRlci0+U3lzdGVtRXJyb3JCaXRtYXA7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YUNvbmZpZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhQ29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBSdHNUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSdHNUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKD0lbGQpXG4iLCBSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBGcmFnVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICBGcmFnVGhyZXNoID0gMDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihGcmFnVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKD0lbGQpXG4iLCBGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBQb3dlck1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUG93ZXJNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSg9JWQpXG4iLCBQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBSYWRpb1N0YXRlID0gKEJPT0xFQU4pIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW87CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUmFkaW9TdGF0ZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJQlNTOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19NT05JVE9SKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExTW9uaXRvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUF1dG9Vbmtub3duOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQnNzVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkJzc1R5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKD0lZClcbiIsIEJzc1R5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBQcmVhbVR5cGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUHJlYW1UeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUHJlYW1UeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUoPSVkKVxuIiwgUHJlYW1UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBBdXRoTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQXV0aE1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZBdXRoTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUoPSVkKVxuIiwgQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIFdlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFdlcFN0YXR1cyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJldlcFN0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUF9TVEFUVVMoPSVkKVxuIiwgV2VwU3RhdHVzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwgJXhcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURUQ6CisJCQlpZiAoKHBBZGFwdGVyLT5SZkljVHlwZQk9PSBSRklDXzI4NTApIHx8IChwQWRhcHRlci0+UmZJY1R5cGUgPT0JUkZJQ18yNzUwKSkKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAzOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDMKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCQlOZXR3b3JrVHlwZUxpc3RbM10gPSBOZGlzODAyXzExT0ZETTU7ICAgLy8gTmV0d29ya1R5cGVbM10gPSAxMWEKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAyOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCSAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxMjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEXG4iKSk7CisJCQkJYnJlYWs7CisJICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTU7CisJCQllbHNlIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUJHX01JWEVEKSB8fCAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNMjQ7CisJCQllbHNlCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMURTOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFJ4UmF0ZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFOgorCQkJLy91bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RUeFJhdGU7CisJCQl1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURSAoPSVseClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FZXByb21WZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTCAoPSVkKVxuIiwgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKSk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX0VYVFJBX0lORk86CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RXh0cmFJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfRVhUUkFfSU5GTyAoPSVsZClcbiIsIHBBZGFwdGVyLT5FeHRyYUluZm8pKTsKKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQpOworCSAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmd2VfdmVyc2lvbl9jb21waWxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HOgorCQkJYXBzZCA9IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPDwgMSkgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLIDw8IDIpCisJCQkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJIDw8IDMpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA8PCA0KQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoIDw8IDUpKTsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmYXBzZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORyAoPTB4JWx4LEFQU0RDYXA9JWQsQUNfQkU9JWQsQUNfQks9JWQsQUNfVkk9JWQsQUNfVk89JWQsTUFYU1BMZW49JWQpXG4iLAorCQkJCWFwc2QscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU006CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTSAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX1dNTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1dNTSAoPSVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICBjYXNlIFJUX09JRF9ORVdfRFJJVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVDSEFSIGVuYWJsZWQgPSAxOworICAgIAkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZlbmFibGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfTkVXX0RSSVZFUiAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgICAgICBjYXNlIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUU6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQWRhcHRlci0+U3RhQ2ZnLmRldl9uYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisKKyAgICAJCQlwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPSAoKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpID8gKEVYVENIQV9CRUxPVykgOiAoRVhUQ0hBX0FCT1ZFKSk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7CisgICAgICAgICAgICB1bEluZm8gPSAodWxJbmZvIDw8IDgpfChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RBVF9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgICAgICAgICBpID0gMDsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKyAgICAgICAgICAgIGkgPSAxOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmaSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQoPSVkKSBcbiIsIGkpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBNYW51ZmFjdHVyZXJPVUlfTEVOOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oUmVzb3VyY2VUeXBlSWROYW1lKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBSZXNvdXJjZVR5cGVJZE5hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEIFxuIikpOworCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBzdXBwb3J0IHdlcCBlbHNlIDIgaXMgbm90IHN1cHBvcnQuCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFIFxuIikpOworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuUHNtID09IFBTTVBfQUNUSU9OKQorCQkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgcG93ZXIgYWN0aXZlIGVsc2UgMiBpcyBwb3dlciBzYXZlLgorCQkJZWxzZQorCQkJCXVsSW5mbyA9IDI7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFIFxuIikpOworCQkJLy9LZXlJZHhWYWx1ZS5LZXlJZHggPSBwQWQtPlBvcnRDZmcuTUJTU0lEW3BBZC0+SW9jdGxJRl0uRGVmYXVsdEtleUlkOworCQkJcEtleUlkeFZhbHVlID0gd3JxLT51LmRhdGEucG9pbnRlcjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiS2V5SWR4VmFsdWUuS2V5SWR4ID0gJWQsIFxuIixwS2V5SWR4VmFsdWUtPktleUlkeCkpOworCQkJdmFsdWVMZW4gPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwS2V5SWR4VmFsdWUtPlZhbHVlLAorCQkJCQkJICAgJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgIHZhbHVlTGVuKTsKKwkJCXBLZXlJZHhWYWx1ZS0+VmFsdWVbdmFsdWVMZW5dPSdcMCc7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihEZWZhdWx0S2V5SWR4VmFsdWUpOworCisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEtleUlkeFZhbHVlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJEZWZhdWx0S2V5SWQgPSAlZCwgdG90YWwgbGVuID0gJWQsIHN0ciBsZW49JWQsIEtleVZhbHVlPSAlMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlbMF0pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJZCA9JWQgXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEg6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkJCQkJJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCQkJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCVNob3J0UmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNob3J0UmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWRcbiIsIFNob3J0UmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCUxvbmdSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ9JWRcbiIsIExvbmdSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQgXG4iKSk7CisKKyNpZmRlZiBSVDI4NjAKKwkJCXsKKworCQkJCVVTSE9SVCAgZGV2aWNlX2lkOworCQkJCWlmICgoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBjaV9kZXYgIT0gTlVMTCkKKwkJCSAgICAJcGNpX3JlYWRfY29uZmlnX3dvcmQoKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wY2lfZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKKwkJCQllbHNlCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwY2lfZGV2ID0gTlVMTFxuIikpOworCQkJCXNwcmludGYodG1wLCAiJTA0eCAlMDR4XG4iLCBOSUNfUENJX1ZFTkRPUl9JRCwgZGV2aWNlX2lkKTsKKwkJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbih0bXApOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHRtcCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgic2l6ZW9mIFVDSEFSPSVkLCBjaGFubmVsPSVkIFxuIiwgc2l6ZW9mKFVDSEFSKSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKyNlbmRpZiAvL1NOTVBfU1VQUE9SVAorCisJCWNhc2UgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYOgorCQkJeworCQkJCVVDSEFSIHZhbHVlOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVggXG4iKSk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMTsKKyNlbHNlCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRG9lc24ndCBzdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAwOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnZhbHVlLCAxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSF9MSVNUOgorCQkJeworCQkJCVBSVF9DSEFOTkVMX0xJU1RfSU5GTyBwQ2hMaXN0QnVmOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIX0xJU1QgXG4iKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bSA9PSAwKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1ZiA9IChSVF9DSEFOTkVMX0xJU1RfSU5GTyAqKSBrbWFsbG9jKHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyksIE1FTV9BTExPQ19GTEFHKTsKKwkJCQlpZiAocENoTGlzdEJ1ZiA9PSBOVUxMKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisJCQkJZm9yIChpID0gMDsgaSA8IHBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0W2ldID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWw7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ2hMaXN0QnVmLCBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCisJCQkJaWYgKHBDaExpc3RCdWYpCisJCQkJCWtmcmVlKHBDaExpc3RCdWYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuR2VvZ3JhcGh5LCAxKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFM6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTToKKwkJCXsKKwkJCQlQUlRfODAyXzExX0RMU19JTkZPCXBEbHNJbmZvID0ga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKSwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKHBEbHNJbmZvID09IE5VTEwpCisJCQkJCWJyZWFrOworCisJCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KCZwRGxzSW5mby0+RW50cnlbaV0sICZwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCX0KKworCQkJCXBEbHNJbmZvLT5udW0gPSBNQVhfTlVNX09GX0RMU19FTlRSWTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcERsc0luZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNXG4iKSk7CisKKwkJCQlpZiAocERsc0luZm8pCisJCQkJCWtmcmVlKHBEbHNJbmZvKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIHJ0Mjh4eF9zdGFfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJCQljbWQpCit7CisJUE9TX0NPT0tJRQkJCXBPYmo7CisJVklSVFVBTF9BREFQVEVSCQkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUlRNUF9BREFQVEVSICAgICAgICAqcEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdyZXEgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCUJPT0xFQU4JCQkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVU0hPUlQJCQkJc3ViY21kOworCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwkgICAgaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKKwkgICAgeworCQkgICAgcmV0dXJuIFN0YXR1czsKKwkgICAgfQorCisJICAgIGlmIChzdHJzdHIod3JxLT51LmRhdGEucG9pbnRlciwgIk9wTW9kZSIpID09IE5VTEwpCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICAgICAgfQorICAgIH0KKworCXsJLy8gZGV0ZXJtaW5lIHRoaXMgaW9jdGwgY29tbWFuZCBpcyBjb21taW5nIGZyb20gd2hpY2ggaW50ZXJmYWNlLgorCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisJCXBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJc3dpdGNoKGNtZCkKKwl7CisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWNhc2UgUlRQUklWX0lPQ1RMX0FURToKKwkJCXsKKwkJCQlSdG1wRG9BdGUocEFkLCB3cnEpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lGSFdBRERSXG4iKSk7CisJCQltZW1jcHkod3JxLT51Lm5hbWUsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdOQU1FOgorICAgICAgICB7CisgICAgICAgIAljaGFyICpuYW1lPSZ3cnEtPnUubmFtZVswXTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25hbWUobmV0X2RldiwgTlVMTCwgbmFtZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdFU1NJRDogIC8vR2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdFU1NJRDogIC8vU2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOV0lEOiAgIC8vIHNldCBuZXR3b3JrIGlkICh0aGUgY2VsbCkKKwkJY2FzZSBTSU9DR0lXTldJRDogICAvLyBnZXQgbmV0d29yayBpZAorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DU0lXRlJFUTogICAvL3NldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdGUkVROiAgIC8vIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOSUNLTjogLy9zZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV05JQ0tOOiAvL2dldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXUkFURTogICAvL2dldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJCSAgICBydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgU0lPQ1NJV1JBVEU6ICAvL3NldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJICAgICAgICBydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lPQ0dJV1JUUzogIC8vIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfZ2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdSVFM6ICAvL3NldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfc2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdGUkFHOiAgLy9nZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0ZSQUc6ICAvL3NldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRU5DT0RFOiAgLy9nZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0VOQ09ERTogIC8vc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX3Npd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdBUDogICAgIC8vZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9naXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJICAgIGNhc2UgU0lPQ1NJV0FQOiAgLy9zZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTU9ERTogICAvL3NldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9zaXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXU0VOUzogICAvL2dldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NTSVdTRU5TOgkvL3NldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NHSVdQT1dFUjogIC8vZ2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DU0lXUE9XRVI6ICAvL3NldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ0dJV1RYUE9XOiAgLy9nZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DU0lXVFhQT1c6ICAvL3NldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NHSVdSQU5HRToJLy9HZXQgcmFuZ2Ugb2YgcGFyYW1ldGVycworCQljYXNlIFNJT0NHSVdSRVRSWToJLy9nZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQljYXNlIFNJT0NTSVdSRVRSWToJLy9zZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBSVF9QUklWX0lPQ1RMOgorCQkJc3ViY21kID0gd3JxLT51LmRhdGEuZmxhZ3M7CisJCQlpZiggc3ViY21kICYgT0lEX0dFVF9TRVRfVE9HR0xFKQorCQkJCVN0YXR1cyA9IFJUTVBTZXRJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IFJUTVBRdWVyeUluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXUFJJVjoKKwkJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCQkJeworCQkJCWlmICggYWNjZXNzX29rKFZFUklGWV9XUklURSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKHByaXZ0YWIpKSAhPSBUUlVFKQorCQkJCQlicmVhazsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocHJpdnRhYikgLyBzaXplb2YocHJpdnRhYlswXSk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX1NFVDoKKwkJCWlmKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSAhPSBUUlVFKQorCQkJCWJyZWFrOworCQkJcnRfaW9jdGxfc2V0cGFyYW0obmV0X2RldiwgTlVMTCwgTlVMTCwgd3JxLT51LmRhdGEucG9pbnRlcik7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6CisJCQlSVE1QSW9jdGxHZXRTaXRlU3VydmV5KHBBZCwgd3JxKTsKKwkJICAgIGJyZWFrOworI2lmZGVmIERCRworCQljYXNlIFJUUFJJVl9JT0NUTF9NQUM6CisJCQlSVE1QSW9jdGxNQUMocEFkLCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0UyUDoKKwkJCVJUTVBJb2N0bEUyUFJPTShwQWQsIHdycSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBEQkcgLy8KKyAgICAgICAgY2FzZSBTSU9DRVRIVE9PTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIklPQ1RMOjp1bmtub3duIElPQ1RMJ3MgY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJfQorCisgICAgaWYoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNTSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZCwgKnBTc2lkPU5VTEw7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworCisgICAgaWYoIHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworICAgICAgICBpZiAoc3RybGVuKGFyZykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZC5Tc2lkLCBhcmcsIHN0cmxlbihhcmcpKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvL0FOWSBzc2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IDA7CisJCSAgICBtZW1jcHkoU3NpZC5Tc2lkLCAiIiwgMCk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCX0KKyAgICAgICAgcFNzaWQgPSAmU3NpZDsKKworICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgeworICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworCisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9TU0lELAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCisgICAgICAgICAgICAgICAgICAgIChWT0lEICopcFNzaWQpOworCisgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU1NJRF9Qcm9jOjooTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKworICAgIGlmIChTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworI2lmZGVmIFdNTV9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXbW1DYXBhYmxlIEVuYWJsZSBvciBEaXNhYmxlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQk9PTEVBTgliV21tQ2FwYWJsZTsKKworCWJXbW1DYXBhYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgoYldtbUNhcGFibGUgPT0gMSkKKwkJKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7CisJZWxzZSBpZiAoYldtbUNhcGFibGUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dtbUNhcGFibGVfUHJvYzo6KGJXbW1DYXBhYmxlPSVkKVxuIiwKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IE5ldHdvcmsgVHlwZShJbmZyYXN0cnVjdHVyZS9BZGhvYyBtb2RlKQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUlOVDMyCVZhbHVlID0gMDsKKworICAgIGlmIChzdHJjbXAoYXJnLCAiQWRob2MiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfQURIT0MpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy9CT09MRUFOIENhbmNlbGxlZDsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQkIhXG4iKSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiSW5mcmEiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfSU5GUkEpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooSU5GUkEpXG4iKSk7CisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApCisgICAgeworCQlVQ0hBUgliYnBWYWx1ZSA9IDA7CisJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJLy8gZGlzYWJsZSBhbGwgcGVyaW9kaWMgc3RhdGUgbWFjaGluZQorCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gRkFMU0U7CisJCS8vIHJlc2V0IGFsbCBtbG1lIHN0YXRlIG1hY2hpbmUKKwkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEIFxuIikpOworICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKQorICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gNjsKKyAgICAgICAgfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBlbHNlCisgICAgICAgICAgICBOX0NoYW5uZWxDaGVjayhwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgJj0gMHhmZmZmZmZmZTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IHVwcGVyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlIHw9ICgweDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJLy8gMjBNSHoKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCX0KKwkJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOworCQkvLyBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuCisJCS8vUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJLy9WYWx1ZSB8PSAoMHg4MCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJLy8gZGlzYWJsZSBzeW5jCisJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwkJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfTU9OSVRPUjsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihNT05JVE9SKVxuIikpOworICAgIH0KKworICAgIC8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X05ldHdvcmtUeXBlX1Byb2M6OihOZXR3b3JrVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcGF1dG8iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJPUEVOIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJvcGVuIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJzaGFyZWQiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQVBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhcHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFub25lIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMnBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0F1dGhNb2RlX1Byb2M6OihBdXRoTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBFbmNyeXB0aW9uIFR5cGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4OworCisgICAgS2V5SWR4ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKyAgICBpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEgKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0RlZmF1bHRLZXlJRF9Qcm9jOjooRGVmYXVsdEtleUlEPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV1BBIFBTSyBrZXkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisKKyAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV1BBUFNLX1Byb2M6OihXUEFQU0s9JXMpXG4iLCBhcmcpKTsKKworICAgIE5kaXNaZXJvTWVtb3J5KGtleU1hdGVyaWFsLCA0MCk7CisKKyAgICBpZiAoKHN0cmxlbihhcmcpIDwgOCkgfHwgKHN0cmxlbihhcmcpID4gNjQpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IGZhaWxlZCEhKFdQQVBTSz0lcyksIFdQQVBTSyBrZXktc3RyaW5nIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzIFxuIiwgYXJnKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoc3RybGVuKGFyZykgPT0gNjQpCisgICAgeworICAgICAgICBBdG9IKGFyZywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUGFzc3dvcmRIYXNoKChjaGFyICopYXJnLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworICAgIH0KKworCisKKyAgICBpZihwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCisgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgIHsKKyAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBQb3dlciBTYXZpbmcgbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgIHsKKyAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAorCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KKyAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIE1sbWVTZXRQc21CaXQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICB9CisKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXcGFTdXBwb3J0IGZsYWcuCisgICAgVmFsdWU6CisgICAgICAgIDA6IERyaXZlciBpZ25vcmUgd3BhX3N1cHBsaWNhbnQuCisgICAgICAgIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uLgorICAgICAgICAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycy4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisgICAgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV3BhX1N1cHBvcnQ6OihXcGFTdXBwbGljYW50VVA9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgTUFDCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBtYWMgMCAgICAgICAgPT0+IHJlYWQgTUFDIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBtYWMgMD0xMiAgICAgPT0+IHdyaXRlIE1BQyB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVUxPTkcJCQkJbWFjQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVSU5UMzIJCQkJbWFjVmFsdWUgPSAwOworCUlOVAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCSAgICB0aGlzX2NoYXIgPSBhcmc7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIE1hYyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAobWFjQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBtYWNBZGRyLCAmbWFjVmFsdWUpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSVseCwgTWFjVmFsdWU9JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIgLCBtYWNWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzgtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgOCkKKwkJCQl0ZW1wMls3LWsrK109JzAnOworCQkJdGVtcDJbOF09J1wwJzsKKworCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJCUF0b0godGVtcDIsIHRlbXAsIDQpOworCQkJCW1hY1ZhbHVlID0gKnRlbXAqMjU2KjI1NioyNTYgKyB0ZW1wWzFdKjI1NioyNTYgKyB0ZW1wWzJdKjI1NiArIHRlbXBbM107CisKKwkJCQkvLyBkZWJ1ZyBtb2RlCisJCQkJaWYgKG1hY0FkZHIgPT0gKEhXX0RFQlVHX1NFVFRJTkdfQkFTRSArIDQpKQorCQkJCXsKKwkJCQkJLy8gMHgyYmY0OiBieXRlMCBub24temVybzogZW5hYmxlIFIxNyB0dW5pbmcsIDA6IGRpc2FibGUgUjE3IHR1bmluZworICAgICAgICAgICAgICAgICAgICBpZiAobWFjVmFsdWUgJiAweDAwMDAwMGZmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9uIFIxNyB0dW5pbmdcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIFI2NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgUjY2ID0gMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcik7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCQl7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvZmYgUjE3IHR1bmluZywgcmVzdG9yZSB0byAweCUwMnhcbiIsIFI2NikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSUwMmx4LCBNYWNWYWx1ZT0weCV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJfQorCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bE1BQ1xuXG4iKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIEUyUFJPTQorICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgZTJwIDAgICAgIAk9PT4gcmVhZCBFMlBST00gd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIGUycCAwPTEyMzQgICAgPT0+IHdyaXRlIEUyUFJPTSB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIzNAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxFMlBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVU0hPUlQJCQkJZWVwQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVU0hPUlQJCQkJZWVwVmFsdWU7CisJaW50CQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IGFyZzsKKworCisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gRTJQUk9NIGFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChlZXBBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDRYXToweCUwNFggICIsIGVlcEFkZHIgLCBlZXBWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls0LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGVtcDJbMy1rKytdPScwJzsKKwkJCXRlbXAyWzRdPSdcMCc7CisKKwkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlBdG9IKHRlbXAyLCB0ZW1wLCAyKTsKKwkJCWVlcFZhbHVlID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwMlhdOiUwMlggICIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bEUyUFJPTVxuIikpOworfQorI2VuZGlmIC8vIERCRyAvLworCisKKworCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1RHbldpZmlUZXN0X1Byb2M6OihiVEduV2lmaVRlc3Q9JWQpXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlMb25nUmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCVNob3J0UmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfRmxleGlibGU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9TdHJpY3Q7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSWVlZTgwMmRNb2RlX1Byb2M6OihJRUVFRTAyMTFkTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUpKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYzo6KENhcnJpZXJEZXRlY3QuRW5hYmxlPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzdjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXdwYS5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworCisjaWZuZGVmCV9fV1BBX0hfXworI2RlZmluZQlfX1dQQV9IX18KKworLy8gRUFQT0wgS2V5IGRlc2NyaXB0ZXIgZnJhbWUgZm9ybWF0IHJlbGF0ZWQgbGVuZ3RoCisjZGVmaW5lIExFTl9LRVlfREVTQ19OT05DRQkJCTMyCisjZGVmaW5lIExFTl9LRVlfREVTQ19JVgkJCQkxNgorI2RlZmluZSBMRU5fS0VZX0RFU0NfUlNDCQkJOAorI2RlZmluZSBMRU5fS0VZX0RFU0NfSUQJCQkJOAorI2RlZmluZSBMRU5fS0VZX0RFU0NfUkVQTEFZCQkJOAorI2RlZmluZSBMRU5fS0VZX0RFU0NfTUlDCQkJMTYKKworLy8gVGhlIGxlbmd0aCBpcyB0aGUgRUFQb0wtS2V5IGZyYW1lIGV4Y2VwdCBrZXkgZGF0YSBmaWVsZC4KKy8vIFBsZWFzZSByZWZlciB0byA4MDIuMTFpLTIwMDQgLEZpZ3VyZSA0M3UgaW4gcC43OAorI2RlZmluZSBMRU5fRUFQT0xfS0VZX01TRwkJCShzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSkKKworLy8gRUFQIENvZGUgVHlwZS4KKyNkZWZpbmUgRUFQX0NPREVfUkVRVUVTVAkxCisjZGVmaW5lIEVBUF9DT0RFX1JFU1BPTlNFCTIKKyNkZWZpbmUgRUFQX0NPREVfU1VDQ0VTUyAgICAzCisjZGVmaW5lIEVBUF9DT0RFX0ZBSUxVUkUgICAgNAorCisvLyBFQVBPTCBmcmFtZSBQcm90b2NvbCBWZXJzaW9uCisjZGVmaW5lCUVBUE9MX1ZFUgkJCQkJMQorI2RlZmluZQlFQVBPTF9WRVIyCQkJCQkyCisKKy8vIEVBUE9MLUtFWSBEZXNjcmlwdG9yIFR5cGUKKyNkZWZpbmUJV1BBMV9LRVlfREVTQwkJCQkweGZlCisjZGVmaW5lIFdQQTJfS0VZX0RFU0MgICAgICAgICAgICAgICAweDAyCisKKy8vIEtleSBEZXNjcmlwdG9yIFZlcnNpb24gb2YgS2V5IEluZm9ybWF0aW9uCisjZGVmaW5lCURFU0NfVFlQRV9US0lQCQkJCTEKKyNkZWZpbmUJREVTQ19UWVBFX0FFUwkJCQkyCisjZGVmaW5lIERFU0NfVFlQRV9NRVNICQkJCTMKKworI2RlZmluZSBMRU5fTVNHMV8yV0FZICAgICAgICAgICAgICAgMHg3ZgorI2RlZmluZSBNQVhfTEVOX09GX0VBUF9IUyAgICAgICAgICAgMjU2CisKKyNkZWZpbmUgTEVOX01BU1RFUl9LRVkJCQkJMzIKKworLy8gRUFQT0wgRUssIE1LCisjZGVmaW5lIExFTl9FQVBfRUsJCQkJCTE2CisjZGVmaW5lIExFTl9FQVBfTUlDSwkJCQkxNgorI2RlZmluZSBMRU5fRUFQX0tFWQkJCQkJKChMRU5fRUFQX0VLKSsoTEVOX0VBUF9NSUNLKSkKKy8vIFRLSVAga2V5IHJlbGF0ZWQKKyNkZWZpbmUgTEVOX1BNS0lECQkJCQkxNgorI2RlZmluZSBMRU5fVEtJUF9FSwkJCQkJMTYKKyNkZWZpbmUgTEVOX1RLSVBfUlhNSUNLCQkJCTgKKyNkZWZpbmUgTEVOX1RLSVBfVFhNSUNLCQkJCTgKKyNkZWZpbmUgTEVOX0FFU19FSwkJCQkJMTYKKyNkZWZpbmUgTEVOX0FFU19LRVkJCQkJCUxFTl9BRVNfRUsKKyNkZWZpbmUgTEVOX1RLSVBfS0VZCQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQorI2RlZmluZSBUS0lQX0FQX1RYTUlDS19PRkZTRVQJCSgoTEVOX0VBUF9LRVkpKyhMRU5fVEtJUF9FSykpCisjZGVmaW5lIFRLSVBfQVBfUlhNSUNLX09GRlNFVAkJKFRLSVBfQVBfVFhNSUNLX09GRlNFVCtMRU5fVEtJUF9UWE1JQ0spCisjZGVmaW5lIFRLSVBfR1RLX0xFTkdUSAkJCQkoKExFTl9US0lQX0VLKSsoTEVOX1RLSVBfUlhNSUNLKSsoTEVOX1RLSVBfVFhNSUNLKSkKKyNkZWZpbmUgTEVOX1BUSwkJCQkJCSgoTEVOX0VBUF9LRVkpKyhMRU5fVEtJUF9LRVkpKQorCisvLyBSU04gSUUgTGVuZ3RoIGRlZmluaXRpb24KKyNkZWZpbmUgTUFYX0xFTl9PRl9SU05JRSAgICAgICAgIAk5MAorI2RlZmluZSBNSU5fTEVOX09GX1JTTklFICAgICAgICAgCTgKKworLy9FQVAgUGFja2V0IFR5cGUKKyNkZWZpbmUJRUFQUGFja2V0CQkwCisjZGVmaW5lCUVBUE9MU3RhcnQJCTEKKyNkZWZpbmUJRUFQT0xMb2dvZmYJCTIKKyNkZWZpbmUJRUFQT0xLZXkJCTMKKyNkZWZpbmUJRUFQT0xBU0ZBbGVydAk0CisjZGVmaW5lCUVBUFR0eXBlTWF4CQk1CisKKyNkZWZpbmUJRUFQT0xfTVNHX0lOVkFMSUQJMAorI2RlZmluZQlFQVBPTF9QQUlSX01TR18xCTEKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMgkyCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzMJMworI2RlZmluZQlFQVBPTF9QQUlSX01TR180CTQKKyNkZWZpbmUJRUFQT0xfR1JPVVBfTVNHXzEJNQorI2RlZmluZQlFQVBPTF9HUk9VUF9NU0dfMgk2CisKKyNkZWZpbmUgUEFJUldJU0VLRVkJCQkJCTEKKyNkZWZpbmUgR1JPVVBLRVkJCQkJCTAKKworLy8gUmV0cnkgdGltZXIgY291bnRlciBpbml0aWFsIHZhbHVlCisjZGVmaW5lIFBFRVJfTVNHMV9SRVRSWV9USU1FUl9DVFIgICAgICAgICAgIDAKKyNkZWZpbmUgUEVFUl9NU0czX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMTAKKyNkZWZpbmUgR1JPVVBfTVNHMV9SRVRSWV9USU1FUl9DVFIgICAgICAgICAgMjAKKworCisjZGVmaW5lIEVBUE9MX1NUQVJUX0RJU0FCTEUJCQkJCTAKKyNkZWZpbmUgRUFQT0xfU1RBUlRfUFNLCQkJCQkJMQorI2RlZmluZSBFQVBPTF9TVEFSVF8xWAkJCQkJCTIKKworI2RlZmluZSBNSVhfQ0lQSEVSX1dQQV9US0lQX09OKHgpICAgICAgICgoKHgpICYgMHgwOCkgIT0gMCkKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEFfQUVTX09OKHgpICAgICAgICAoKCh4KSAmIDB4MDQpICE9IDApCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKHgpICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKQorI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKHgpICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkKKworI2RlZmluZSBST1VORF9VUChfX3gsIF9feSkgXAorCSgoKFVMT05HKSgoX194KSsoKF9feSktMSkpKSAmICgoVUxPTkcpfigoX195KS0xKSkpCisKKyNkZWZpbmUJQUREX09ORV9Ub182NEJJVF9WQVIoX1YpCQlcCit7CQkJCQkJCQkJCVwKKwlVQ0hBUgljbnQgPSBMRU5fS0VZX0RFU0NfUkVQTEFZOwlcCisJZG8JCQkJCQkJCQlcCisJewkJCQkJCQkJCVwKKwkJY250LS07CQkJCQkJCVwKKwkJX1ZbY250XSsrOwkJCQkJCVwKKwkJaWYgKGNudCA9PSAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCX13aGlsZSAoX1ZbY250XSA9PSAwKTsJCQkJXAorfQorCisjZGVmaW5lIElTX1dQQV9DQVBBQklMSVRZKGEpICAgICAgICgoKGEpID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKChhKSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisKKy8vIEVBUE9MIEtleSBJbmZvcm1hdGlvbiBkZWZpbml0aW9uIHdpdGhpbiBLZXkgZGVzY3JpcHRvciBmb3JtYXQKK3R5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0lORk8KK3sKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJS2V5QWNrOjE7CisgICAgVUNIQVIJSW5zdGFsbDoxOworICAgIFVDSEFSCUtleUluZGV4OjI7CisgICAgVUNIQVIJS2V5VHlwZToxOworICAgIFVDSEFSCUtleURlc2NWZXI6MzsKKyAgICBVQ0hBUglSc3ZkOjM7CisgICAgVUNIQVIJRUtEX0RMOjE7CQkvLyBFS0QgZm9yIEFQOyBETCBmb3IgU1RBCisgICAgVUNIQVIJUmVxdWVzdDoxOworICAgIFVDSEFSCUVycm9yOjE7CisgICAgVUNIQVIJU2VjdXJlOjE7CisgICAgVUNIQVIJS2V5TWljOjE7CisjZWxzZQorCVVDSEFSCUtleU1pYzoxOworCVVDSEFSCVNlY3VyZToxOworCVVDSEFSCUVycm9yOjE7CisJVUNIQVIJUmVxdWVzdDoxOworCVVDSEFSCUVLRF9ETDoxOyAgICAgICAvLyBFS0QgZm9yIEFQOyBETCBmb3IgU1RBCisJVUNIQVIJUnN2ZDozOworCVVDSEFSCUtleURlc2NWZXI6MzsKKwlVQ0hBUglLZXlUeXBlOjE7CisJVUNIQVIJS2V5SW5kZXg6MjsKKwlVQ0hBUglJbnN0YWxsOjE7CisJVUNIQVIJS2V5QWNrOjE7CisjZW5kaWYKK30JS0VZX0lORk8sICpQS0VZX0lORk87CisKKy8vIEVBUE9MIEtleSBkZXNjcmlwdG9yIGZvcm1hdAordHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9LRVlfREVTQ1JJUFRFUgoreworCVVDSEFSCQlUeXBlOworCUtFWV9JTkZPCUtleUluZm87CisJVUNIQVIJCUtleUxlbmd0aFsyXTsKKwlVQ0hBUgkJUmVwbGF5Q291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUgkJS2V5Tm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKKwlVQ0hBUgkJS2V5SXZbTEVOX0tFWV9ERVNDX0lWXTsKKwlVQ0hBUgkJS2V5UnNjW0xFTl9LRVlfREVTQ19SU0NdOworCVVDSEFSCQlLZXlJZFtMRU5fS0VZX0RFU0NfSURdOworCVVDSEFSCQlLZXlNaWNbTEVOX0tFWV9ERVNDX01JQ107CisJVUNIQVIJCUtleURhdGFMZW5bMl07CisJVUNIQVIJCUtleURhdGFbTUFYX0xFTl9PRl9SU05JRV07Cit9CUtFWV9ERVNDUklQVEVSLCAqUEtFWV9ERVNDUklQVEVSOworCit0eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0VBUE9MX1BBQ0tFVAoreworCVVDSEFSCSAJCQlQcm9WZXI7CisJVUNIQVIJIAkJCVByb1R5cGU7CisJVUNIQVIJIAkJCUJvZHlfTGVuWzJdOworCUtFWV9ERVNDUklQVEVSCQlLZXlEZXNjOworfQlFQVBPTF9QQUNLRVQsICpQRUFQT0xfUEFDS0VUOworCisvLzgwMi4xMWkgRDEwIHBhZ2UgODMKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfR1RLX0VOQ0FQCit7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtpZDoyOworICAgIFVDSEFSICAgICAgICAgICAgICAgdHg6MTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjo1OworICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2MTsKKyNlbHNlCisgICAgVUNIQVIgICAgICAgICAgICAgICByc3Y6NTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHR4OjE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLaWQ6MjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjE7CisjZW5kaWYKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS1tUS0lQX0dUS19MRU5HVEhdOworfSAgIEdUS19FTkNBUCwgKlBHVEtfRU5DQVA7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfS0RFX0VOQ0FQCit7CisgICAgVUNIQVIgICAgICAgICAgICAgICBUeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgTGVuOworICAgIFVDSEFSICAgICAgICAgICAgICAgT1VJWzNdOworICAgIFVDSEFSICAgICAgICAgICAgICAgRGF0YVR5cGU7CisgICAgR1RLX0VOQ0FQICAgICAgR1RLRW5jYXA7Cit9ICAgS0RFX0VOQ0FQLCAqUEtERV9FTkNBUDsKKworLy8gRm9yIFdQQTEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUUgeworICAgIFVDSEFSICAgb3VpWzRdOworICAgIFVTSE9SVCAgdmVyc2lvbjsKKyAgICBVQ0hBUiAgIG1jYXN0WzRdOworICAgIFVTSE9SVCAgdWNvdW50OworICAgIHN0cnVjdCBQQUNLRUQgeworICAgICAgICBVQ0hBUiBvdWlbNF07CisgICAgfXVjYXN0WzFdOworfSBSU05JRSwgKlBSU05JRTsKKworLy8gRm9yIFdQQTIKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUUyIHsKKyAgICBVU0hPUlQgIHZlcnNpb247CisgICAgVUNIQVIgICBtY2FzdFs0XTsKKyAgICBVU0hPUlQgIHVjb3VudDsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyAgICAgICAgVUNIQVIgb3VpWzRdOworICAgIH11Y2FzdFsxXTsKK30gUlNOSUUyLCAqUFJTTklFMjsKKworLy8gQUtNIFN1aXRlCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFX0FVVEggeworICAgIFVTSE9SVCBhY291bnQ7CisgICAgc3RydWN0IFBBQ0tFRCB7CisgICAgICAgIFVDSEFSIG91aVs0XTsKKyAgICB9YXV0aFsxXTsKK30gUlNOSUVfQVVUSCwqUFJTTklFX0FVVEg7CisKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9SU05fQ0FQQUJJTElUSUVTCXsKKwlzdHJ1Y3QJUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgICAgIFVTSE9SVAkJUnN2ZDoxMDsKKyAgICAgICAgVVNIT1JUCQlHVEtTQV9SX0NvdW50ZXI6MjsKKyAgICAgICAgVVNIT1JUCQlQVEtTQV9SX0NvdW50ZXI6MjsKKyAgICAgICAgVVNIT1JUCQlOb19QYWlyd2lzZToxOworCQlVU0hPUlQJCVByZUF1dGg6MTsKKyNlbHNlCisgICAgICAgIFVTSE9SVAkJUHJlQXV0aDoxOworCQlVU0hPUlQJCU5vX1BhaXJ3aXNlOjE7CisJCVVTSE9SVAkJUFRLU0FfUl9Db3VudGVyOjI7CisJCVVTSE9SVAkJR1RLU0FfUl9Db3VudGVyOjI7CisJCVVTSE9SVAkJUnN2ZDoxMDsKKyNlbmRpZgorCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JUlNOX0NBUEFCSUxJVElFUywgKlBSU05fQ0FQQUJJTElUSUVTOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0VBUF9IRFIgeworICAgIFVDSEFSICAgUHJvVmVyOworICAgIFVDSEFSICAgUHJvVHlwZTsKKyAgICBVQ0hBUiAgIEJvZHlfTGVuWzJdOworICAgIFVDSEFSICAgY29kZTsKKyAgICBVQ0hBUiAgIGlkZW50aWZpZXI7CisgICAgVUNIQVIgICBsZW5ndGhbMl07IC8vIGluY2x1ZGluZyBjb2RlIGFuZCBpZGVudGlmaWVyLCBmb2xsb3dlZCBieSBsZW5ndGgtMiBvY3RldHMgb2YgZGF0YQorfSBFQVBfSERSLCAqUEVBUF9IRFI7CisKKy8vIEZvciBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUgc3RhdGVzLiA4MDIuMTFpIERyYWZ0IDQuMSwgcC4gOTcKKy8vIFdlIHNpbXBsaWZpZWQgaXQKK3R5cGVkZWYJZW51bQlfV3BhU3RhdGUKK3sKKwlTU19OT1RVU0UsCQkJCS8vIDAKKwlTU19TVEFSVCwJCQkJLy8gMQorCVNTX1dBSVRfTVNHXzMsCQkJLy8gMgorCVNTX1dBSVRfR1JPVVAsCQkJLy8gMworCVNTX0ZJTklTSCwgIAkJCS8vIDQKKwlTU19LRVlVUERBVEUsCQkJLy8gNQorfQlXUEFfU1RBVEU7CisKKy8vCisvLwlUaGUgZGVmaW5pdGlvbiBvZiB0aGUgY2lwaGVyIGNvbWJpbmF0aW9uCisvLworLy8gCSBiaXQzCWJpdDIgIGJpdDEgICBiaXQwCisvLwkrLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKy8vIAl8CSAgV1BBCSB8CSAgIFdQQTIgICB8CisvLwkrLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsKKy8vCXwgVEtJUCB8IEFFUyB8IFRLSVAgfCBBRVMgfAorLy8JfAkwICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDA2CisvLwl8CTAgIHwgIDEgIHwgICAxICB8ICAxICB8IC0+IDB4MDcKKy8vCXwJMSAgfCAgMCAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwOQorLy8JfAkxICB8ICAwICB8ICAgMSAgfCAgMSAgfCAtPiAweDBCCisvLwl8CTEgIHwgIDEgIHwgICAwICB8ICAxICB8IC0+IDB4MEQKKy8vCXwJMSAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwRQorLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMSAgfAktPiAweDBGCisvLwkrLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsKKy8vCit0eXBlZGVmCWVudW0JX1dwYU1peFBhaXJDaXBoZXIKK3sKKwlNSVhfQ0lQSEVSX05PVFVTRSAJCQk9IDB4MDAsCisJV1BBX05PTkVfV1BBMl9US0lQQUVTCQk9IDB4MDMsCQkvLyBXUEEyLVRLSVBBRVMKKwlXUEFfQUVTX1dQQTJfVEtJUCAJCQk9IDB4MDYsCisJV1BBX0FFU19XUEEyX1RLSVBBRVMJCT0gMHgwNywKKwlXUEFfVEtJUF9XUEEyX0FFUwkJCT0gMHgwOSwKKwlXUEFfVEtJUF9XUEEyX1RLSVBBRVMJCT0gMHgwQiwKKwlXUEFfVEtJUEFFU19XUEEyX05PTkUJCT0gMHgwQywJCS8vIFdQQS1US0lQQUVTCisJV1BBX1RLSVBBRVNfV1BBMl9BRVMJCT0gMHgwRCwKKwlXUEFfVEtJUEFFU19XUEEyX1RLSVAJCT0gMHgwRSwKKwlXUEFfVEtJUEFFU19XUEEyX1RLSVBBRVMJPSAweDBGLAorfQlXUEFfTUlYX1BBSVJfQ0lQSEVSOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTl9JRV9IRUFERVJfU1RSVUNUCXsKKwlVQ0hBUgkJRWlkOworCVVDSEFSCQlMZW5ndGg7CisJVVNIT1JUCQlWZXJzaW9uOwkvLyBMaXR0bGUgZW5kaWFuIGZvcm1hdAorfQlSU05fSUVfSEVBREVSX1NUUlVDVCwgKlBSU05fSUVfSEVBREVSX1NUUlVDVDsKKworLy8gQ2lwaGVyIHN1aXRlIHNlbGVjdG9yIHR5cGVzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NJUEhFUl9TVUlURV9TVFJVQ1QJeworCVVDSEFSCQlPdWlbM107CisJVUNIQVIJCVR5cGU7Cit9CUNJUEhFUl9TVUlURV9TVFJVQ1QsICpQQ0lQSEVSX1NVSVRFX1NUUlVDVDsKKworLy8gQXV0aGVudGljYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IHN1aXRlIHNlbGVjdG9yCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0FLTV9TVUlURV9TVFJVQ1QJeworCVVDSEFSCQlPdWlbM107CisJVUNIQVIJCVR5cGU7Cit9CUFLTV9TVUlURV9TVFJVQ1QsICpQQUtNX1NVSVRFX1NUUlVDVDsKKworLy8gUlNOIGNhcGFiaWxpdHkKK3R5cGVkZWYgc3RydWN0CVBBQ0tFRCBfUlNOX0NBUEFCSUxJVFkJeworCVVTSE9SVAkJUnN2OjEwOworCVVTSE9SVAkJR1RLU0FSZXBsYXlDbnQ6MjsKKwlVU0hPUlQJCVBUS1NBUmVwbGF5Q250OjI7CisJVVNIT1JUCQlOb1BhaXJ3aXNlOjE7CisJVVNIT1JUCQlQcmVBdXRoOjE7Cit9CVJTTl9DQVBBQklMSVRZLCAqUFJTTl9DQVBBQklMSVRZOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkYTRlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jCkBAIC0wLDAgKzEsMTYxMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wX21haW4uYworCisgICAgQWJzdHJhY3Q6CisgICAgbWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTmFtZSAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisgICAgSmFuIExlZQkJMDEtMTAtMjAwNQkgICAgbW9kaWZpZWQKKwlTYW1wbGUJCUp1bi8wMS8wNwkJTWVyZ2UgUlQyODcwIGFuZCBSVDI4NjAgZHJpdmVycy4KKyovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworCisvLyBGb2xsb3dpbmcgaW5mb3JtYXRpb24gd2lsbCBiZSBzaG93IHdoZW4geW91IHJ1biAnbW9kaW5mbycKKy8vICoqKiBJZiB5b3UgaGF2ZSBhIHNvbHV0aW9uIGZvciB0aGUgYnVnIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBkcml2ZXIsIHBsZWFzZSBtYWlsIHRvIG1lLgorLy8gT3RoZXJ3aXNlIHBvc3QgdG8gZm9ydW0gaW4gcmFsaW5rdGVjaCdzIHdlYiBzaXRlKHd3dy5yYWxpbmt0ZWNoLmNvbSkgYW5kIGxldCBhbGwgdXNlcnMgaGVscCB5b3UuICoqKgorTU9EVUxFX0FVVEhPUigiUGF1bCBMaW4gPHBhdWxfbGluQHJhbGlua3RlY2guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDI4NzAgV2lyZWxlc3MgTGFuIExpbnV4IERyaXZlciIpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIE1PRFVMRV9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOworI2VuZGlmCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKy8vIHJlY29yZCB3aGV0aGVyIHRoZSBjYXJkIGluIHRoZSBjYXJkIGxpc3QgaXMgdXNlZCBpbiB0aGUgY2FyZCBmaWxlCitleHRlcm4gVUlOVDggIE1DX0NhcmRVc2VkW107CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKy8qIEtlcm5lbCB0aHJlYWQgYW5kIHZhcnMsIHdoaWNoIGhhbmRsZXMgcGFja2V0cyB0aGF0IGFyZSBjb21wbGV0ZWQuIE9ubHkKKyAqIHBhY2tldHMgdGhhdCBoYXZlIGEgImNvbXBsZXRlIiBmdW5jdGlvbiBhcmUgc2VudCBoZXJlLiBUaGlzIHdheSwgdGhlCisgKiBjb21wbGV0aW9uIGlzIHJ1biBvdXQgb2Yga2VybmVsIGNvbnRleHQsIGFuZCBkb2Vzbid0IGJsb2NrIHRoZSByZXN0IG9mCisgKiB0aGUgc3RhY2suICovCisKK2V4dGVybiBJTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKKwkJCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOworCisKKy8qIG1vZHVsZSB0YWJsZSAqLworc3RydWN0IHVzYl9kZXZpY2VfaWQgICAgcnR1c2JfdXNiX2lkW10gPSBSVDI4NzBfVVNCX0RFVklDRVM7CitJTlQgY29uc3QgICAgICAgICAgICAgICBydHVzYl91c2JfaWRfbGVuID0gc2l6ZW9mKHJ0dXNiX3VzYl9pZCkgLyBzaXplb2Yoc3RydWN0IHVzYl9kZXZpY2VfaWQpOworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHJ0dXNiX3VzYl9pZCk7CisKKyNpZm5kZWYgUEZfTk9GUkVFWkUKKyNkZWZpbmUgUEZfTk9GUkVFWkUgIDAKKyNlbmRpZgorCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy90ZXN0ZWQgZm9yIGtlcm5lbCAyLjQgc2VyaWVzCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAqcnR1c2JfcHJvYmUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgVUlOVCBpbnRlcmZhY2UsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWRfdGFibGUpOworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB2b2lkICpwdHIpOworCitzdHJ1Y3QgdXNiX2RyaXZlciBydHVzYl9kcml2ZXIgPSB7CisJCW5hbWU6InJ0Mjg3MCIsCisJCXByb2JlOnJ0dXNiX3Byb2JlLAorCQlkaXNjb25uZWN0OnJ0dXNiX2Rpc2Nvbm5lY3QsCisJCWlkX3RhYmxlOnJ0dXNiX3VzYl9pZCwKKwl9OworCisjZWxzZQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCBydDI4NzBfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKyNlbmRpZiAvLyBDT05GSUdfUE0gLy8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy90ZXN0ZWQgZm9yIGtlcm5lbCAyLjZzZXJpZXMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcnR1c2JfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCitzdHJ1Y3QgdXNiX2RyaXZlciBydHVzYl9kcml2ZXIgPSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQorCS5vd25lciA9IFRISVNfTU9EVUxFLAorI2VuZGlmCisJLm5hbWU9InJ0Mjg3MCIsCisJLnByb2JlPXJ0dXNiX3Byb2JlLAorCS5kaXNjb25uZWN0PXJ0dXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlPXJ0dXNiX3VzYl9pZCwKKworI2lmZGVmIENPTkZJR19QTQorCXN1c3BlbmQ6CXJ0Mjg3MF9zdXNwZW5kLAorCXJlc3VtZToJCXJ0Mjg3MF9yZXN1bWUsCisjZW5kaWYKKwl9OworCisjaWZkZWYgQ09ORklHX1BNCisKK1ZPSUQgUlQyODYwUmVqZWN0UGVuZGluZ1BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gY2xlYXIgUFMgcGFja2V0cworCS8vIGNsZWFyIFR4U3cgcGFja2V0cworfQorCitzdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCXBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODcwX3N1c3BlbmQoKVxuIikpOworCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7CisJbmV0aWZfZGV2aWNlX2RldGFjaCAobmV0X2Rldik7CisKKwlwQWQtPlBNX0ZsZ1N1c3BlbmQgPSAxOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldF9kZXYpKSB7CisJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODcwX3N1c3BlbmQoKVxuIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Mjg3MF9yZXN1bWUoCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg3MF9yZXN1bWUoKVxuIikpOworCisJcEFkLT5QTV9GbGdTdXNwZW5kID0gMDsKKwluZXRfZGV2ID0gcEFkLT5uZXRfZGV2OworCW5ldGlmX2RldmljZV9hdHRhY2ggKG5ldF9kZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODcwX3Jlc3VtZSgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gQ09ORklHX1BNIC8vCisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKworLy8gSW5pdCBkcml2ZXIgbW9kdWxlCitJTlQgX19pbml0IHJ0dXNiX2luaXQodm9pZCkKK3sKKwlwcmludGsoInJ0dXNiIGluaXQgLS0tPlxuIik7CisJcmV0dXJuIHVzYl9yZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKK30KKworLy8gRGVpbml0IGRyaXZlciBtb2R1bGUKK1ZPSUQgX19leGl0IHJ0dXNiX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKKwlwcmludGsoIjwtLS0gcnR1c2IgZXhpdFxuIik7Cit9CisKK21vZHVsZV9pbml0KHJ0dXNiX2luaXQpOworbW9kdWxlX2V4aXQocnR1c2JfZXhpdCk7CisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMJCQkJCQkJCQkJCQkqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBNTE1FIGtlcm5lbCB0aHJlYWQuCisKK0FyZ3VtZW50czoKKwkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBNbG1lVGhyZWFkKAorCUlOIHZvaWQgKkNvbnRleHQpCit7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OworCVBPU19DT09LSUUJcE9iajsKKwlpbnQgc3RhdHVzOworCisJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJcnRtcF9vc190aHJlYWRfaW5pdCgicnQyODcwTWxtZVRocmVhZCIsIChQVk9JRCkmKHBBZC0+bWxtZUNvbXBsZXRlKSk7CisKKwl3aGlsZSAocEFkLT5tbG1lX2tpbGwgPT0gMCkKKwl7CisJCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLworCQkvL2Rvd24oJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7CisJCXN0YXR1cyA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+bWxtZV9zZW1hcGhvcmUpKTsKKworCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgLCBuZWVkIHRvIGNoZWNrIGlmIHJlcXVpcmVkKi8KKwkJLy9kb3duKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7CisKKwkJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCisJCU1sbWVIYW5kbGVyKHBBZCk7CisKKwkJLyogdW5sb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJLy91cCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCQlpZiAoc3RhdHVzICE9IDApCisJCXsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93CisJICoKKwkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAorCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCisJICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAorCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgorCSAqIGNhc2UuCisJICoKKwkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCisJICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKKwkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93CisJICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgorCSAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS0lc1xuIixfX0ZVTkNUSU9OX18pKTsKKworCXBPYmotPk1MTUVUaHJfcGlkID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCisJY29tcGxldGVfYW5kX2V4aXQgKCZwQWQtPm1sbWVDb21wbGV0ZSwgMCk7CisJcmV0dXJuIDA7CisKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFVTQiBjb21tYW5kIGtlcm5lbCB0aHJlYWQuCisKK0FyZ3VtZW50czoKKwkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVFVTQkNtZFRocmVhZCgKKwlJTiB2b2lkICogQ29udGV4dCkKK3sKKwlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUNvbnRleHQ7CisJUE9TX0NPT0tJRQkJcE9iajsKKwlpbnQgc3RhdHVzOworCisJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJcnRtcF9vc190aHJlYWRfaW5pdCgicnQyODcwQ21kVGhyZWFkIiwgKFBWT0lEKSYocEFkLT5DbWRRQ29tcGxldGUpKTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX1JVTk5JTkc7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisKKwl3aGlsZSAocEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVDI4NzBfVEhSRUFEX1JVTk5JTkcpCisJeworCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJLy9kb3duKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKKwkJc3RhdHVzID0gZG93bl9pbnRlcnJ1cHRpYmxlKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKKworCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVDI4NzBfVEhSRUFEX1NUT1BFRCkKKwkJCWJyZWFrOworCisJCWlmIChzdGF0dXMgIT0gMCkKKwkJeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlicmVhazsKKwkJfQorCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgLCBuZWVkIHRvIGNoZWNrIGlmIHJlcXVpcmVkKi8KKwkJLy9kb3duKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7CisKKwkJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCisJCUNNREhhbmRsZXIocEFkKTsKKworCQkvKiB1bmxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLworCQkvL3VwKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7CisJfQorCisJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCisJewkvLyBDbGVhciB0aGUgQ21kUUVsZW1lbnRzLgorCQlDbWRRRWxtdAkqcENtZFFFbG10ID0gTlVMTDsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfU1RPUEVEOworCQl3aGlsZShwQWQtPkNtZFEuc2l6ZSkKKwkJeworCQkJUlRVU0JEZXF1ZXVlQ21kKCZwQWQtPkNtZFEsICZwQ21kUUVsbXQpOworCQkJaWYgKHBDbWRRRWxtdCkKKwkJCXsKKwkJCQlpZiAocENtZFFFbG10LT5DbWRGcm9tTmRpcyA9PSBUUlVFKQorCQkJCXsKKwkJCQkJaWYgKHBDbWRRRWxtdC0+YnVmZmVyICE9IE5VTEwpCisJCQkJCQlOZGlzRnJlZU1lbW9yeShwQ21kUUVsbXQtPmJ1ZmZlciwgcENtZFFFbG10LT5idWZmZXJsZW5ndGgsIDApOworCisJCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmICgocENtZFFFbG10LT5idWZmZXIgIT0gTlVMTCkgJiYgKHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoICE9IDApKQorCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LT5idWZmZXIsIHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKKwkJICAgICAgICAgICAgeworCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCX0KKwkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93CisJICoKKwkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAorCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCisJICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAorCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgorCSAqIGNhc2UuCisJICoKKwkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCisJICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKKwkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93CisJICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgorCSAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS1SVFVTQkNtZFRocmVhZFxuIikpOworCisJcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCisJY29tcGxldGVfYW5kX2V4aXQgKCZwQWQtPkNtZFFDb21wbGV0ZSwgMCk7CisJcmV0dXJuIDA7CisKK30KKworCitzdGF0aWMgdm9pZCBSVDI4NzBfVGltZXJRX0hhbmRsZShSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlpbnQgc3RhdHVzOworCVJBTElOS19USU1FUl9TVFJVQ1QJKnBUaW1lcjsKKwlSVDI4NzBfVElNRVJfRU5UUlkJKnBFbnRyeTsKKwl1bnNpZ25lZCBsb25nCWlycUZsYWc7CisKKwl3aGlsZSghcEFkLT5UaW1lckZ1bmNfa2lsbCkKKwl7CisvLwkJcHJpbnRrKCJ3YWl0aW5nIGZvciBldmVudCFcbiIpOworCQlwVGltZXIgPSBOVUxMOworCisJCXN0YXR1cyA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpKTsKKworCQlpZiAocEFkLT5UaW1lclEuc3RhdHVzID09IFJUMjg3MF9USFJFQURfU1RPUEVEKQorCQkJYnJlYWs7CisKKwkJLy8gZXZlbnQgaGFwcGVuZWQuCisJCXdoaWxlKHBBZC0+VGltZXJRLnBRSGVhZCkKKwkJeworCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKKwkJCXBFbnRyeSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKKwkJCWlmIChwRW50cnkpCisJCQl7CisJCQkJcFRpbWVyID0gcEVudHJ5LT5wUmFUaW1lcjsKKworCQkJCS8vIHVwZGF0ZSBwUUhlYWQKKwkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwRW50cnktPnBOZXh0OworCQkJCWlmIChwRW50cnkgPT0gcEFkLT5UaW1lclEucFFUYWlsKQorCQkJCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBOVUxMOworCisJCQkJLy8gcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuCisJCQkJcEVudHJ5LT5wTmV4dCA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OworCQkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcEVudHJ5OworCQkJfQorCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWcpOworCisJCQlpZiAocFRpbWVyKQorCQkJeworCQkJCWlmIChwVGltZXItPmhhbmRsZSAhPSBOVUxMKQorCQkJCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCQkJCQlwVGltZXItPmhhbmRsZShOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOworCQkJCWlmICgocFRpbWVyLT5SZXBlYXQpICYmIChwVGltZXItPlN0YXRlID09IEZBTFNFKSkKKwkJCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBUaW1lci0+VGltZXJWYWx1ZSk7CisJCQl9CisJCX0KKworCQlpZiAoc3RhdHVzICE9IDApCisJCXsKKwkJCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfU1RPUEVEOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCitJTlQgVGltZXJRVGhyZWFkKAorCUlOIE9VVCBQVk9JRCBDb250ZXh0KQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCVBPU19DT09LSUUJcE9iajsKKworCXBBZCA9IChQUlRNUF9BREFQVEVSKUNvbnRleHQ7CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXJ0bXBfb3NfdGhyZWFkX2luaXQoInJ0Mjg3MFRpbWVyUUhhbmRsZSIsIChQVk9JRCkmKHBBZC0+VGltZXJRQ29tcGxldGUpKTsKKworCVJUMjg3MF9UaW1lclFfSGFuZGxlKHBBZCk7CisKKwkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93CisJICoKKwkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAorCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCisJICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAorCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgorCSAqIGNhc2UuCisJICoKKwkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCisJICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKKwkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93CisJICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgorCSAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS0lc1xuIixfX0ZVTkNUSU9OX18pKTsKKworCXBPYmotPlRpbWVyUVRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisKKwljb21wbGV0ZV9hbmRfZXhpdCgmcEFkLT5UaW1lclFDb21wbGV0ZSwgMCk7CisJcmV0dXJuIDA7CisKK30KKworCitSVDI4NzBfVElNRVJfRU5UUlkgKlJUMjg3MF9UaW1lclFfSW5zZXJ0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKKwl7CisJCWlmKHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0KQorCQl7CisJCQlwUU5vZGUgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKKwkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcFFOb2RlLT5wTmV4dDsKKworCQkJcFFOb2RlLT5wUmFUaW1lciA9IHBUaW1lcjsKKwkJCXBRTm9kZS0+cE5leHQgPSBOVUxMOworCisJCQlwUVRhaWwgPSBwQWQtPlRpbWVyUS5wUVRhaWw7CisJCQlpZiAocEFkLT5UaW1lclEucFFUYWlsICE9IE5VTEwpCisJCQkJcFFUYWlsLT5wTmV4dCA9IHBRTm9kZTsKKwkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IHBRTm9kZTsKKwkJCWlmIChwQWQtPlRpbWVyUS5wUUhlYWQgPT0gTlVMTCkKKwkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwUU5vZGU7CisJCX0KKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKworCQlpZiAocFFOb2RlKQorCQkJdXAoJnBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpOworCQkJLy93YWtlX3VwKCZ0aW1lcldhaXRRKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwl9CisJcmV0dXJuIHBRTm9kZTsKK30KKworCitCT09MRUFOIFJUMjg3MF9UaW1lclFfUmVtb3ZlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBOb2RlLCAqcFByZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwlpZiAocEFkLT5UaW1lclEuc3RhdHVzID49IFJUMjg3MF9USFJFQURfSU5JVEVEKQorCXsKKwkJcE5vZGUgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CisJCXdoaWxlIChwTm9kZSkKKwkJeworCQkJaWYgKHBOb2RlLT5wUmFUaW1lciA9PSBwVGltZXIpCisJCQkJYnJlYWs7CisJCQlwUHJldiA9IHBOb2RlOworCQkJcE5vZGUgPSBwTm9kZS0+cE5leHQ7CisJCX0KKworCQkvLyBOb3cgbW92ZSBpdCB0byBmcmVlTGlzdCBxdWV1ZS4KKwkJaWYgKHBOb2RlKQorCQl7CisJCQlpZiAocE5vZGUgPT0gcEFkLT5UaW1lclEucFFIZWFkKQorCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBOb2RlLT5wTmV4dDsKKwkJCWlmIChwTm9kZSA9PSBwQWQtPlRpbWVyUS5wUVRhaWwpCisJCQkJcEFkLT5UaW1lclEucFFUYWlsID0gcFByZXY7CisJCQlpZiAocFByZXYgIT0gTlVMTCkKKwkJCQlwUHJldi0+cE5leHQgPSBwTm9kZS0+cE5leHQ7CisKKwkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgorCQkJcE5vZGUtPnBOZXh0ID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7CisJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBOb2RlOworCQl9CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCit2b2lkIFJUMjg3MF9UaW1lclFfRXhpdChSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBUaW1lclE7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCXdoaWxlIChwQWQtPlRpbWVyUS5wUUhlYWQpCisJeworCQlwVGltZXJRID0gcEFkLT5UaW1lclEucFFIZWFkOworCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwVGltZXJRLT5wTmV4dDsKKwkJLy8gcmVtb3ZlIHRoZSB0aW1lUQorCX0KKwlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IE5VTEw7CisJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCk7CisJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKKwlwQWQtPlRpbWVyUS5wUUhlYWQgPSBOVUxMOworCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfU1RPUEVEOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKK30KKworCit2b2lkIFJUMjg3MF9UaW1lclFfSW5pdChSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlpbnQgCWk7CisJUlQyODcwX1RJTUVSX0VOVFJZICpwUU5vZGUsICpwRW50cnk7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlRpbWVyUUxvY2spOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+VGltZXJRLCBzaXplb2YocEFkLT5UaW1lclEpKTsKKwkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+VGltZXJRLmNvdW50LCAwKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIHdhaXQgcSBoZWFkICovCisJLy9pbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aW1lcldhaXRRKTsKKworCW9zX2FsbG9jX21lbShwQWQsICZwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUMjg3MF9USU1FUl9FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7CisJaWYgKHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKQorCXsKKwkJcEVudHJ5ID0gTlVMTDsKKwkJcFFOb2RlID0gKFJUMjg3MF9USU1FUl9FTlRSWSAqKXBBZC0+VGltZXJRLnBUaW1lclFQb2xsOworCQlmb3IgKGkgPSAwIDtpIDxUSU1FUl9RVUVVRV9TSVpFX01BWDsgaSsrKQorCQl7CisJCQlwUU5vZGUtPnBOZXh0ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcFFOb2RlOworCQkJcFFOb2RlKys7CisJCX0KKwkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwRW50cnk7CisJCXBBZC0+VGltZXJRLnBRSGVhZCA9IE5VTEw7CisJCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7CisJCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfSU5JVEVEOworCX0KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworfQorCisKK1ZPSUQgUlQyODcwX1dhdGNoRG9nKElOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7CisJaW50IAkJCQkJaWR4OworCVVMT05HCQkJCWlycUZsYWdzOworCVBVUkIJCSAgIAkJcFVyYjsKKwlCT09MRUFOCQkJCW5lZWREdW1wU2VxID0gRkFMU0U7CisJVUlOVDMyICAgICAgICAgIAlNQUNWYWx1ZTsKKworCisJaWR4ID0gMDsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7CisJaWYgKChNQUNWYWx1ZSAmIDB4ZmYpICE9MCApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUWCBRVUVVRSAwIE5vdCBFTVBUWShWYWx1ZT0weCUweCkuICEhISEhISEhISEhISEhIVxuIiwgTUFDVmFsdWUpKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMTIpOworCQl3aGlsZSgoTUFDVmFsdWUgJjB4ZmYpICE9IDAgJiYgKGlkeCsrIDwgMTApKQorCQl7CisJCSAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkgICAgICAgIE5kaXNNU2xlZXAoMSk7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMDYpOworCX0KKworCWlkeCA9IDA7CisJaWYgKChNQUNWYWx1ZSAmIDB4ZmYwMCkgIT0wICkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRYIFFVRVVFIDEgTm90IEVNUFRZKFZhbHVlPTB4JTB4KS4gISEhISEhISEhISEhISEhXG4iLCBNQUNWYWx1ZSkpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwYSk7CisJCXdoaWxlKChNQUNWYWx1ZSAmMHhmZjAwKSAhPSAwICYmIChpZHgrKyA8IDEwKSkKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkJTmRpc01TbGVlcCgxKTsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwNik7CisJfQorCisKKwlpZiAocEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPj0gMikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1heWJlIHRoZSBSeCBCdWxrLUluIGhhbmdlZCEgQ2FuY2VsIHRoZSBwZW5kaW5nIFJ4IGJ1bGtzIHJlcXVlc3QhXG4iKSk7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FsbCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiB0byBjYW5jZWwgdGhlIHBlbmRpbmcgUnggQnVsayFcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOLCBOVUxMLCAwKTsKKwkJCW5lZWREdW1wU2VxID0gVFJVRTsKKwkJfQorCQlwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA9IDA7CisJfQorCisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE5VTV9PRl9UWF9SSU5HOyBpZHgrKykKKwl7CisJCXBVcmIgPSBOVUxMOworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbaWR4XSA9PSBUUlVFKSAmJiBwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250KQorCQl7CisJCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0rKzsKKworCQkJaWYgKChwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0gPiAyKSAmJgorCQkJCSAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJCQkpCisJCQl7CisJCQkJLy8gRklYTUU6IEZvbGxvd2luZyBjb2RlIGp1c3Qgc3VwcG9ydCBzaW5nbGUgYnVsayBvdXQuIElmIHlvdSB3YW5uYSBzdXBwb3J0IG11bHRpcGxlIGJ1bGsgb3V0LiBNb2RpZnkgaXQhCisJCQkJcEhUVFhDb250ZXh0ID0gKFBIVF9UWF9DT05URVhUKSgmcEFkLT5UeENvbnRleHRbaWR4XSk7CisJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQl7CS8vIENoZWNrIFR4Q29udGV4dC4KKwkJCQkJcFVyYiA9IHBIVFRYQ29udGV4dC0+cFVyYjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoaWR4ID09IE1HTVRQSVBFSURYKQorCQkJCXsKKwkJCQkJUFRYX0NPTlRFWFQgcE1MTUVDb250ZXh0LCBwTlVMTENvbnRleHQsIHBQc1BvbGxDb250ZXh0OworCisJCQkJCS8vQ2hlY2sgTWdtdENvbnRleHQuCisJCQkJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkocEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhEbWFJZHhdLkFsbG9jVmEpOworCQkJCQlwUHNQb2xsQ29udGV4dCA9IChQVFhfQ09OVEVYVCkoJnBBZC0+UHNQb2xsQ29udGV4dCk7CisJCQkJCXBOVUxMQ29udGV4dCA9IChQVFhfQ09OVEVYVCkoJnBBZC0+TnVsbENvbnRleHQpOworCisJCQkJCWlmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCXsKKwkJCQkJCUFTU0VSVChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcpOworCQkJCQkJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCXsKKwkJCQkJCUFTU0VSVChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpOworCQkJCQkJcFVyYiA9IHBOVUxMQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJeworCQkJCQkJQVNTRVJUKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwUHNQb2xsQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCX0KKworCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYXliZSB0aGUgVHggQnVsay1PdXQgaGFuZ2VkISBDYW5jZWwgdGhlIHBlbmRpbmcgVHggYnVsa3MgcmVxdWVzdCBvZiBpZHgoJWQpIVxuIiwgaWR4KSk7CisJCQkJaWYgKHBVcmIpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVbmxpbmsgdGhlIHBlbmRpbmcgVVJCIVxuIikpOworCQkJCQkvLyB1bmxpbmsgaXQgbm93CisJCQkJCVJUVVNCX1VOTElOS19VUkIocFVyYik7CisJCQkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKwkJCQkJbmVlZER1bXBTZXEgPSBUUlVFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVbmtvbncgYnVsa091dCBVUkIgbWF5YmUgaGFuZ2VkISEhISEhISEhISEhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQl9CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gRm9yIFNpZ21hIGRlYnVnLCBkdW1wIHRoZSBiYV9yZW9yZGVyaW5nIHNlcXVlbmNlLgorCWlmKChuZWVkRHVtcFNlcSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQorCXsKKwkJVVNIT1JUCQkJCUlkeDsKKwkJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnkgPSBOVUxMOworCQlVQ0hBUgkJCQljb3VudCA9IDA7CisJCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQkFSZWNXY2lkQXJyYXlbMF07CisKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJaWYoKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCAhPSBOVUxMKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTklDVXBkYXRlUmF3Q291bnRlcnMoKTpUaGUgUXVldWVpbmcgcGt0IGluIHJlb3JkZXJpbmcgYnVmZmVyOlxuIikpOworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJCQltcGR1X2JsayA9IHBCQUVudHJ5LT5saXN0Lm5leHQ7CisJCQl3aGlsZSAobXBkdV9ibGspCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHQlZDpTZXEtJWQsIGJBTVNEVS0lZCFcbiIsIGNvdW50LCBtcGR1X2Jsay0+U2VxdWVuY2UsIG1wZHVfYmxrLT5iQU1TRFUpKTsKKwkJCQltcGR1X2JsayA9IG1wZHVfYmxrLT5uZXh0OworCQkJCWNvdW50Kys7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlxucEJBRW50cnktPkxhc3RJbmRTZXE9JWQhXG4iLCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUmVsZWFzZSBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorCitBcmd1bWVudHM6CisgICAgKmRldgkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlwQWQJCQkJCWRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIF9ydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2ID0gTlVMTDsKKworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicnR1c2JfZGlzY29ubmVjdDogdW5yZWdpc3RlciB1c2JuZXQgdXNiLSVzLSVzXG4iLAorCQkJCWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT5kZXZwYXRoKSk7CisJaWYgKCFwQWQpCisJeworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCQlpZiAoKHBBZC0+TUNfUm93SUQgPj0gMCkgJiYgKHBBZC0+TUNfUm93SUQgPD0gTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEKSkKKwkJCU1DX0NhcmRVc2VkW3BBZC0+TUNfUm93SURdID0gMDsgLy8gbm90IGNsZWFyIE1BQyBhZGRyZXNzCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwkJd2hpbGUoTU9EX0lOX1VTRSA+IDApCisJCXsKKwkJCU1PRF9ERUNfVVNFX0NPVU5UOworCQl9CisjZWxzZQorCQl1c2JfcHV0X2RldihkZXYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisJCXByaW50aygicnR1c2JfZGlzY29ubmVjdDogcEFkID09IE5VTEwhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKTsKKworCisKKwkvLyBmb3IgZGVidWcsIHdhaXQgdG8gc2hvdyBzb21lIG1lc3NhZ2VzIHRvIC9wcm9jIHN5c3RlbQorCXVkZWxheSgxKTsKKworCisKKworCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7CisJaWYgKHBBZC0+bmV0X2RldiAhPSBOVUxMKQorCXsKKwkJcHJpbnRrKCJydHVzYl9kaXNjb25uZWN0OiB1bnJlZ2lzdGVyX25ldGRldigpLCBkZXYtPm5hbWU9JXMhXG4iLCBuZXRfZGV2LT5uYW1lKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYgKHBBZC0+bmV0X2Rldik7CisJfQorCXVkZWxheSgxKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKyNlbHNlCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwl1ZGVsYXkoMSk7CisKKwkvLyBmcmVlIG5ldF9kZXZpY2UgbWVtb3J5CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJa2ZyZWUobmV0X2Rldik7CisjZWxzZQorCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisJLy8gZnJlZSBhZGFwdGVyIG1lbW9yeQorCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCisJLy8gcmVsZWFzZSBhIHVzZSBvZiB0aGUgdXNiIGRldmljZSBzdHJ1Y3R1cmUKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwl3aGlsZShNT0RfSU5fVVNFID4gMCkKKwl7CisJCU1PRF9ERUNfVVNFX0NPVU5UOworCX0KKyNlbHNlCisJdXNiX3B1dF9kZXYoZGV2KTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwl1ZGVsYXkoMSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgUlRVU0IgZGlzY29ubmVjdCBzdWNjZXNzZnVsbHlcbiIpKTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFByb2JlIFJUMjhYWCBjaGlwc2V0LgorCitBcmd1bWVudHM6CisgICAgKmRldgkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlpbnRlcmZhY2UKKwkqaWRfdGFibGUJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KK3N0YXRpYyB2b2lkICpydHVzYl9wcm9iZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBVSU5UIGludGVyZmFjZSwKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZDsKKwlydDI4eHhfcHJvYmUoKHZvaWQgKilkZXYsICh2b2lkICopaWQsIGludGVyZmFjZSwgJnBBZCk7CisJcmV0dXJuICh2b2lkICopcEFkOworfQorCisvL0Rpc2Nvbm5lY3QgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhpbiBleGl0IHJvdXRpbmUKK3N0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdm9pZCAqcHRyKQoreworCV9ydHVzYl9kaXNjb25uZWN0KGRldiwgKChQUlRNUF9BREFQVEVSKXB0cikpOworfQorCisjZWxzZQkvKiBrZXJuZWwgMi42IHNlcmllcyAqLworc3RhdGljIGludCBydHVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJUFJUTVBfQURBUFRFUiBwQWQ7CisJcmV0dXJuIChpbnQpcnQyOHh4X3Byb2JlKCh2b2lkICopaW50ZiwgKHZvaWQgKilpZCwgMCwgJnBBZCk7Cit9CisKKworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAgICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCVBSVE1QX0FEQVBURVIgICAgICAgcEFkOworCisKKwlwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlfcnR1c2JfZGlzY29ubmVjdChkZXYsIHBBZCk7Cit9CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTk9ORQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJUE9TX0NPT0tJRQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCUlOVAkJCXJldDsKKworCisJLy8gU2xlZXAgNTAgbWlsbGlzZWNvbmRzIHNvIHBlbmRpbmcgaW8gbWlnaHQgZmluaXNoIG5vcm1hbGx5CisJUlRNUHVzZWNEZWxheSg1MDAwMCk7CisKKwkvLyBXZSB3YW50IHRvIHdhaXQgdW50aWwgYWxsIHBlbmRpbmcgcmVjZWl2ZXMgYW5kIHNlbmRzIHRvIHRoZQorCS8vIGRldmljZSBvYmplY3QuIFdlIGNhbmNlbCBhbnkKKwkvLyBpcnBzLiBXYWl0IHVudGlsIHNlbmRzIGFuZCByZWNlaXZlcyBoYXZlIHN0b3BwZWQuCisJUlRVU0JDYW5jZWxQZW5kaW5nSVJQcyhwQWQpOworCisJLy8gVGVybWluYXRlIFRocmVhZHMKKwlDSEVDS19QSURfTEVHQUxJVFkocE9iai0+VGltZXJRVGhyX3BpZCkKKwl7CisJCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJCXByaW50aygiVGVybWluYXRlIHRoZSBUaW1lclFUaHJfcGlkPSVkIVxuIiwgR0VUX1BJRF9OVU1CRVIocE9iai0+VGltZXJRVGhyX3BpZCkpOworCQltYigpOworCQlwQWQtPlRpbWVyRnVuY19raWxsID0gMTsKKwkJbWIoKTsKKwkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBPYmotPlRpbWVyUVRocl9waWQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0b3AgVGltZXJRVGhyZWFkLCBwaWQ9JWQsIHJldD0lZCFcbiIsCisJCQkJCXBBZC0+bmV0X2Rldi0+bmFtZSwgR0VUX1BJRF9OVU1CRVIocE9iai0+VGltZXJRVGhyX3BpZCksIHJldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwQWQtPlRpbWVyUUNvbXBsZXRlKTsKKwkJCXBPYmotPlRpbWVyUVRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJCX0KKwl9CisKKwlDSEVDS19QSURfTEVHQUxJVFkocE9iai0+TUxNRVRocl9waWQpCisJeworCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgTUxNRVRocl9waWQ9JWQhXG4iLCBHRVRfUElEX05VTUJFUihwT2JqLT5NTE1FVGhyX3BpZCkpOworCQltYigpOworCQlwQWQtPm1sbWVfa2lsbCA9IDE7CisJCS8vUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQltYigpOworCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocE9iai0+TUxNRVRocl9waWQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KQorCQl7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBNbG1lIHRocmVhZCwgcGlkPSVkLCByZXQ9JWQhXG4iLAorCQkJCQlwQWQtPm5ldF9kZXYtPm5hbWUsIEdFVF9QSURfTlVNQkVSKHBPYmotPk1MTUVUaHJfcGlkKSwgcmV0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bm90aWZ5KTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPm1sbWVDb21wbGV0ZSk7CisJCQlwT2JqLT5NTE1FVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwkJfQorCX0KKworCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCisJeworCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgUlRVU0JDbWRUaHJfcGlkPSVkIVxuIiwgR0VUX1BJRF9OVU1CRVIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSk7CisJCW1iKCk7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9TVE9QRUQ7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQltYigpOworCQkvL1JUVVNCQ01EVXAocEFkKTsKKwkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBPYmotPlJUVVNCQ21kVGhyX3BpZCwgU0lHVEVSTSwgMSk7CisJCWlmIChyZXQpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gUlRVU0JDbWQgdGhyZWFkLCBwaWQ9JWQsIHJldD0lZCFcbiIsCisJCQkJCXBBZC0+bmV0X2Rldi0+bmFtZSwgR0VUX1BJRF9OVU1CRVIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSwgcmV0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bm90aWZ5KTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPkNtZFFDb21wbGV0ZSk7CisJCQlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJfQorCX0KKworCisJLy8gS2lsbCB0YXNrbGV0cworCXBBZC0+bWxtZV9raWxsID0gMDsKKwlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9VTktOT1dOOworCXBBZC0+VGltZXJGdW5jX2tpbGwgPSAwOworfQorCisKK3ZvaWQga2lsbF90aHJlYWRfdGFzayhJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJdGFza2xldF9raWxsKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT50YnR0X3Rhc2spOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayB0aGUgY2hpcHNldCB2ZW5kb3IvcHJvZHVjdCBJRC4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJQ2hlY2sgb2sKKwlGQUxTRQkJCQlDaGVjayBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKKwlJTiB2b2lkICpfZGV2X3ApCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldl9wID0gKHN0cnVjdCB1c2JfZGV2aWNlICopX2Rldl9wOworI2Vsc2UKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCVVJTlQzMiBpOworCisKKwlmb3IoaT0wOyBpPHJ0dXNiX3VzYl9pZF9sZW47IGkrKykKKwl7CisJCWlmIChkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciA9PSBydHVzYl91c2JfaWRbaV0uaWRWZW5kb3IgJiYKKwkJCWRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBydHVzYl91c2JfaWRbaV0uaWRQcm9kdWN0KQorCQl7CisJCQlwcmludGsoInJ0Mjg3MDogaWRWZW5kb3IgPSAweCV4LCBpZFByb2R1Y3QgPSAweCV4XG4iLAorCQkJCQlkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciwgZGV2X3AtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gcnR1c2JfdXNiX2lkX2xlbikKKwl7CisJCXByaW50aygicnQyODcwOiBFcnJvciEgRGV2aWNlIERlc2NyaXB0b3Igbm90IG1hdGNoaW5nIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXQgbmV0IGRldmljZSBzdHJ1Y3R1cmUuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisgICAgKm5ldF9kZXYJCQlQb2ludCB0byB0aGUgbmV0IGRldmljZQorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlJbml0IG9rCisJRkFMU0UJCQkJSW5pdCBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUMjhYWE5ldERldkluaXQoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilfZGV2X3A7CisjZWxzZQorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQkvKiBrZXJuZWwgMi40IHNlcmllcyAqLworCXBBZC0+Y29uZmlnID0gZGV2X3AtPmNvbmZpZzsKKyNlbHNlCisJcEFkLT5jb25maWcgPSAmZGV2X3AtPmNvbmZpZy0+ZGVzYzsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXQgbmV0IGRldmljZSBzdHJ1Y3R1cmUuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUNvbmZpZyBvaworCUZBTFNFCQkJCUNvbmZpZyBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCitCT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCisJSU4gSU5UMzIJCQkJaW50ZXJmYWNlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IChzdHJ1Y3QgdXNiX2RldmljZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJVUxPTkcgQnVsa091dElkeDsKKwlVSU5UMzIgaTsKKworCisJLyogZ2V0IHRoZSBhY3RpdmUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8KKwlpbnRmID0gJmRldl9wLT5hY3Rjb25maWctPmludGVyZmFjZVtpbnRlcmZhY2VdOworCWlmYWNlX2Rlc2MgPSAmaW50Zi0+YWx0c2V0dGluZ1swXTsKKworCS8qIGdldCAjIG9mIGVucG9pbnRzICovCisJcEFkLT5OdW1iZXJPZlBpcGVzID0gaWZhY2VfZGVzYy0+Yk51bUVuZHBvaW50czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOdW1FbmRwb2ludHM9JWRcbiIsIGlmYWNlX2Rlc2MtPmJOdW1FbmRwb2ludHMpKTsKKworCS8qIENvbmZpZ3VyZSBQaXBlcyAqLworCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50WzBdOworCUJ1bGtPdXRJZHggPSAwOworCisJZm9yKGk9MDsgaTxwQWQtPk51bWJlck9mUGlwZXM7IGkrKykKKwl7CisJCWlmICgoZW5kcG9pbnRbaV0uYm1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCisJCQkoKGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pKQorCQl7CisJCQlwQWQtPkJ1bGtJbkVwQWRkciA9IGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPSBlbmRwb2ludFtpXS53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBJTiBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeCAgXG4iLCBlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwkJZWxzZSBpZiAoKGVuZHBvaW50W2ldLmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkJCSgoZW5kcG9pbnRbaV0uYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpKQorCQl7CisJCQkvLyBUaGVyZSBhcmUgNiBidWxrIG91dCBFUC4gRVA2IGhpZ2hlc3QgcHJpb3JpdHkuCisJCQkvLyBFUDEtNCBpcyBFRENBLiAgRVA1IGlzIEhDQ0EuCisJCQlwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dElkeCsrXSA9IGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplID0gZW5kcG9pbnRbaV0ud01heFBhY2tldFNpemU7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkJVTEsgT1VUIE1heGltdW1QYWNrZXRTaXplID0gJWRcbiIsIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeCAgXG4iLCBlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwl9CisKKwlpZiAoIShwQWQtPkJ1bGtJbkVwQWRkciAmJiBwQWQtPkJ1bGtPdXRFcEFkZHJbMF0pKQorCXsKKwkJcHJpbnRrKCJDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2Vsc2UKK0JPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKKwlJTiBJTlQzMgkJCQlpbnRlcmZhY2UpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKilfZGV2X3A7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlVTE9ORyBCdWxrT3V0SWR4OworCVVJTlQzMiBpOworCisKKwkvKiBnZXQgdGhlIGFjdGl2ZSBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIGdldCAjIG9mIGVucG9pbnRzICAqLworCXBBZC0+TnVtYmVyT2ZQaXBlcyA9IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSgiTnVtRW5kcG9pbnRzPSVkXG4iLCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMpKTsKKworCS8qIENvbmZpZ3VyZSBQaXBlcyAqLworCUJ1bGtPdXRJZHggPSAwOworCisJZm9yKGk9MDsgaTxwQWQtPk51bWJlck9mUGlwZXM7IGkrKykKKwl7CisJCWlmICgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5ibUF0dHJpYnV0ZXMgPT0KKwkJCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkJKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkJCVVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikpCisJCXsKKwkJCXBBZC0+QnVsa0luRXBBZGRyID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBJTiBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeFxuIiwgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwkJZWxzZSBpZiAoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYm1BdHRyaWJ1dGVzID09CisJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCisJCQkJKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkJCQlVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSkKKwkJeworCQkJLy8gdGhlcmUgYXJlIDYgYnVsayBvdXQgRVAuIEVQNiBoaWdoZXN0IHByaW9yaXR5LgorCQkJLy8gRVAxLTQgaXMgRURDQS4gIEVQNSBpcyBIQ0NBLgorCQkJcEFkLT5CdWxrT3V0RXBBZGRyW0J1bGtPdXRJZHgrK10gPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBPVVQgTWF4aW11bVBhY2tldFNpemUgPSAlZFxuIiwgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiRVAgYWRkcmVzcyA9IDB4JTJ4ICBcbiIsIGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcykpOworCQl9CisJfQorCisJaWYgKCEocEFkLT5CdWxrSW5FcEFkZHIgJiYgcEFkLT5CdWxrT3V0RXBBZGRyWzBdKSkKKwl7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCBmaW5kIGJvdGggYnVsay1pbiBhbmQgYnVsay1vdXQgZW5kcG9pbnRzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBEaXNhYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4WFhETUFEaXNhYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCit7CisJLy8gbm8gdXNlCit9CisKKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEVuYWJsZSBETUEuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlQyOFhYRE1BRW5hYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisJVVNCX0RNQV9DRkdfU1RSVUMJVXNiQ2ZnOworCWludAkJCQkJaSA9IDA7CisKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpIDwyMDApOworCisKKwlSVE1QdXNlY0RlbGF5KDUwKTsKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAxOworCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCVVzYkNmZy53b3JkID0gMDsKKwlVc2JDZmcuZmllbGQucGh5Y2xlYXIgPSAwOworCS8qIHVzYiB2ZXJzaW9uIGlzIDEuMSxkbyBub3QgdXNlIGJ1bGsgaW4gYWdncmVnYXRpb24gKi8KKwlpZiAocEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID09IDUxMikKKwkJCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dFbiA9IDE7CisJLyogZm9yIGxhc3QgcGFja2V0LCBQQkYgbWlnaHQgdXNlIG1vcmUgdGhhbiBsaW1pdGVkLCBzbyBtaW51cyAyIHRvIHByZXZlbnQgZnJvbSBlcnJvciAqLworCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dMbXQgPSAoTUFYX1JYQlVMS19TSVpFIC8xMDI0KS0zOworCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dUT3V0ID0gMHg4MDsgLyogMjAwNi0xMC0xOCAqLworCVVzYkNmZy5maWVsZC5SeEJ1bGtFbiA9IDE7CisJVXNiQ2ZnLmZpZWxkLlR4QnVsa0VuID0gMTsKKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCBVc2JDZmcud29yZCk7CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBXcml0ZSBCZWFjb24gYnVmZmVyIHRvIEFzaWMuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKKwlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCisJSU4gSU5UCQkJCWFwaWR4LAorCUlOIFVMT05HCQkJRnJhbWVMZW4sCisJSU4gVUxPTkcJCQlVcGRhdGVQb3MpCit7CisJUFVDSEFSICAgICAgICAJcEJlYWNvbkZyYW1lID0gTlVMTDsKKwlVQ0hBUiAgCQkJKnB0cjsKKwlVSU5UICAJCQlpLCBwYWRkaW5nOworCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwlVSU5UMzIJCQlsb25nVmFsdWU7CisJQk9PTEVBTgkJCWJCY25SZXEgPSBGQUxTRTsKKwlVQ0hBUgkJCWJjbl9pZHggPSAwOworCisKKwlpZiAocEJlYWNvbkZyYW1lID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBCZWFjb25GcmFtZSBpcyBOVUxMIVxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBCZWFjb25TeW5jID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBCZWFjb25TeW5jIGlzIE5VTEwhXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvL2lmICgocEFkLT5XZHNUYWIuTW9kZSA9PSBXRFNfQlJJREdFX01PREUpIHx8CisJLy8JKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYgPT0gTlVMTCkgfHwgIShwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkvLwkpCisJaWYgKGJCY25SZXEgPT0gRkFMU0UpCisJeworCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLworCQkvKiBjbGVhciBhbGwgemVybyAqLworCQlmb3IoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLCAweDAwKTsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICY9ICh+KEJFQUNPTl9CSVRNQVBfTUFTSyAmICgxIDw8IGJjbl9pZHgpKSk7CisJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2Jjbl9pZHhdLCBUWFdJX1NJWkUpOworCX0KKwllbHNlCisJeworCQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QV0lFbmRpYW5DaGFuZ2UocHRyLCBUWVBFX1RYV0kpOworI2VuZGlmCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sICZwQWQtPkJlYWNvblR4V0ksIFRYV0lfU0laRSkgPT0gRkFMU0UpCisJCXsJLy8gSWYgQmVhY29uVHhXSSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJld3JpdGUgdGhlIFR4V0kgZm9yIHRoZSBCZWFjb24gZnJhbWVzLgorCQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPSAofihCRUFDT05fQklUTUFQX01BU0sgJiAoMSA8PCBiY25faWR4KSkpOworCQkJTmRpc01vdmVNZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sICZwQWQtPkJlYWNvblR4V0ksIFRYV0lfU0laRSk7CisJCX0KKworCQlpZiAoKHBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgJiAoMSA8PCBiY25faWR4KSkgIT0gKDEgPDwgYmNuX2lkeCkpCisJCXsKKwkJCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCQkJeworCQkJCWxvbmdWYWx1ZSA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLCBsb25nVmFsdWUpOworCQkJCXB0ciArPSA0OworCQkJfQorCQl9CisKKwkJcHRyID0gcEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltiY25faWR4XTsKKwkJcGFkZGluZyA9IChGcmFtZUxlbiAmIDB4MDEpOworCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiksIHBhZGRpbmcpOworCQlGcmFtZUxlbiArPSBwYWRkaW5nOworCQlmb3IgKGkgPSAwIDsgaSA8IEZyYW1lTGVuIC8qSFdfQkVBQ09OX09GRlNFVCovOyBpICs9IDIpCisJCXsKKwkJCWlmIChOZGlzRXF1YWxNZW1vcnkocHRyLCBwQmVhY29uRnJhbWUsIDIpID09IEZBTFNFKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHB0ciwgcEJlYWNvbkZyYW1lLCAyKTsKKwkJCQkvL3Nob3J0VmFsdWUgPSAqcHRyICsgKCoocHRyKzEpPDw4KTsKKwkJCQkvL1JUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCBzaG9ydFZhbHVlKTsKKwkJCQlSVFVTQk11bHRpV3JpdGUocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksIHB0ciwgMik7CisJCQl9CisJCQlwdHIgKz0yOworCQkJcEJlYWNvbkZyYW1lICs9IDI7CisJCX0KKworCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwIHw9ICgxIDw8IGJjbl9pZHgpOworCX0KKworfQorCisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvblN0b3AoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKKwlpbnQgaSwgb2Zmc2V0OworCUJPT0xFQU4JQ2FuY2VsbGVkID0gVFJVRTsKKworCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJaWYgKHBCZWFjb25TeW5jICYmIHBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24pCisJeworCQlJTlQgTnVtT2ZCY247CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsICZDYW5jZWxsZWQpOworCisJCWZvcihpPTA7IGk8TnVtT2ZCY247IGkrKykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltpXSwgSFdfQkVBQ09OX09GRlNFVCk7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtpXSwgVFhXSV9TSVpFKTsKKworCQkJZm9yIChvZmZzZXQ9MDsgb2Zmc2V0PEhXX0JFQUNPTl9PRkZTRVQ7IG9mZnNldCs9NCkKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtpXSArIG9mZnNldCwgMHgwMCk7CisKKwkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7CisJCXBCZWFjb25TeW5jLT5EdGltQml0T24gPSAwOworCX0KK30KKworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25TdGFydCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlpbnQgYXBpZHg7CisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKKy8vCUxBUkdFX0lOVEVHRVIgCXRzZlRpbWUsIGRlbHRhVGltZTsKKworCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJaWYgKHBCZWFjb25TeW5jICYmIHBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24pCisJeworCQlJTlQgTnVtT2ZCY247CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCWZvcihhcGlkeD0wOyBhcGlkeDxOdW1PZkJjbjsgYXBpZHgrKykKKwkJeworCQkJVUNIQVIgQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uID0gMDsKKwkJCVVDSEFSIFRpbUlFTG9jYXRpb25JbkJlYWNvbiA9IDA7CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbYXBpZHhdLCBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25bYXBpZHhdID0gQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvblthcGlkeF0gPSBUaW1JRUxvY2F0aW9uSW5CZWFjb247CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVthcGlkeF0sIFRYV0lfU0laRSk7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7CisJCXBCZWFjb25TeW5jLT5EdGltQml0T24gPSAwOworCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lci5SZXBlYXQgPSBUUlVFOworCisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkFkanVzdCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciA9IDB4ZmZmZmZmZmYgLyAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluID0gKDB4ZmZmZmZmZmYgJSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKSkgKyAxOworCQlwcmludGsoIlJUMjg3MF9Cc3NCZWFjb25TdGFydDpCZWFjb25GYWN0b3I9JWQsIEJlYWNvblJlbWFpbj0lZCFcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciwgcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluKTsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKTsKKworCX0KK30KKworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25Jbml0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7CisJaW50IGk7CisKKwlOZGlzQWxsb2NNZW1vcnkocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMsIHNpemVvZihCRUFDT05fU1lOQ19TVFJVQ1QpLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKQorCXsKKwkJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMsIHNpemVvZihCRUFDT05fU1lOQ19TVFJVQ1QpKTsKKwkJZm9yKGk9MDsgaSA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGkrKykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltpXSwgSFdfQkVBQ09OX09GRlNFVCk7CisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7CisKKwkJLy9SVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyksIHBBZCwgVFJVRSk7CisJCXBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24gPSBUUlVFOworCX0KK30KKworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25FeGl0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7CisJQk9PTEVBTglDYW5jZWxsZWQgPSBUUlVFOworCWludCBpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKQorCXsKKwkJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwkJcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbiA9IEZBTFNFOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7CisKKwkJZm9yKGk9MDsgaTxIV19CRUFDT05fTUFYX0NPVU5UOyBpKyspCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCQl9CisKKwkJTmRpc0ZyZWVNZW1vcnkocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMsIEhXX0JFQUNPTl9PRkZTRVQgKiBIV19CRUFDT05fTUFYX0NPVU5ULCAwKTsKKwkJcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMgPSBOVUxMOworCX0KK30KKworVk9JRCBCZWFjb25VcGRhdGVFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKKwlMQVJHRV9JTlRFR0VSCXRzZlRpbWVfYTsvLywgdHNmVGltZV9iLCBkZWx0YVRpbWVfZXhwLCBkZWx0YVRpbWVfYWI7CisJVUlOVDMyCQkJZGVsdGEsIHJlbWFpbiwgcmVtYWluX2xvdywgcmVtYWluX2hpZ2g7CisvLwlCT09MRUFOCQkJcG9zaXRpdmU7CisKKwlSZVN5bmNCZWFjb25UaW1lKHBBZCk7CisKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUU0ZfVElNRVJfRFcwLCAmdHNmVGltZV9hLnUuTG93UGFydCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUU0ZfVElNRVJfRFcxLCAmdHNmVGltZV9hLnUuSGlnaFBhcnQpOworCisKKwkvL3Bvc2l0aXZlPWdldERlbHRhVGltZSh0c2ZUaW1lX2EsIGV4cGVjdGVkVGltZSwgJmRlbHRhVGltZV9leHApOworCXJlbWFpbl9oaWdoID0gcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluICogdHNmVGltZV9hLnUuSGlnaFBhcnQ7CisJcmVtYWluX2xvdyA9IHRzZlRpbWVfYS51Lkxvd1BhcnQgJSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKKwlyZW1haW4gPSAocmVtYWluX2hpZ2ggKyByZW1haW5fbG93KSUocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKKwlkZWx0YSA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApIC0gcmVtYWluOworCisJcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuVGltZXJWYWx1ZSA9IChkZWx0YSA+PiAxMCkgKyAxMDsKKworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5OGQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKK2NvbmZpZyBSVDI4NzAKKwl0cmlzdGF0ZSAiUmFsaW5rIDI4NzAgd2lyZWxlc3Mgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBYODYgJiYgV0xBTl84MDIxMQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgdGhlIFJhbGluayAyODcwIHdpcmVsZXNzIGNoaXAuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDE1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKK29iai0kKENPTkZJR19SVDI4NzApCSs9IHJ0Mjg3MHN0YS5vCisKKyMgVE9ETzogYWxsIG9mIHRoZXNlIHNob3VsZCBiZSByZW1vdmVkCitFWFRSQV9DRkxBR1MgKz0gLURMSU5VWCAtREFHR1JFR0FUSU9OX1NVUFBPUlQgLURQSUdHWUJBQ0tfU1VQUE9SVCAtRFdNTV9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURSVDI4NzAKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19TVEFfU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1EREJHCitFWFRSQV9DRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisKK3J0Mjg3MHN0YS1vYmpzIDo9CQlcCisJY29tbW9uL21kNS5vCQlcCisJY29tbW9uL21sbWUubwkJXAorCWNvbW1vbi9ydG1wX3dlcC5vCVwKKwljb21tb24vYWN0aW9uLm8JCVwKKwljb21tb24vY21tX2RhdGEubwlcCisJY29tbW9uL3J0bXBfaW5pdC5vCVwKKwljb21tb24vcnRtcF90a2lwLm8JXAorCWNvbW1vbi9jbW1fc3luYy5vCVwKKwljb21tb24vZWVwcm9tLm8JCVwKKwljb21tb24vY21tX3Nhbml0eS5vCVwKKwljb21tb24vY21tX2luZm8ubwlcCisJY29tbW9uL2NtbV93cGEubwlcCisJY29tbW9uL2Rmcy5vCQlcCisJY29tbW9uL3NwZWN0cnVtLm8JXAorCXN0YS9hc3NvYy5vCQlcCisJc3RhL2Fpcm9uZXQubwkJXAorCXN0YS9hdXRoLm8JCVwKKwlzdGEvYXV0aF9yc3AubwkJXAorCXN0YS9zeW5jLm8JCVwKKwlzdGEvc2FuaXR5Lm8JCVwKKwlzdGEvcnRtcF9kYXRhLm8JCVwKKwlzdGEvY29ubmVjdC5vCQlcCisJc3RhL3dwYS5vCQlcCisJcnRfbGludXgubwkJXAorCXJ0X3Byb2ZpbGUubwkJXAorCXJ0X21haW5fZGV2Lm8JCVwKKwlzdGFfaW9jdGwubwkJXAorCWNvbW1vbi9iYV9hY3Rpb24ubwlcCisJMjg3MF9tYWluX2Rldi5vCQlcCisJY29tbW9uLzI4NzBfcnRtcF9pbml0Lm8JXAorCWNvbW1vbi9ydHVzYl9pby5vCVwKKwljb21tb24vcnR1c2JfYnVsay5vCVwKKwljb21tb24vcnR1c2JfZGF0YS5vCVwKKwljb21tb24vY21tX2RhdGFfMjg3MC5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUxYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9UT0RPCkBAIC0wLDAgKzEsMTAgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFuCisJLSBzcGFyc2UgY2xlYW4KKwktIHBvcnQgdG8gaW4ta2VybmVsIDgwMjExIHN0YWNrCisJLSByZW1vdmUgcmVhZGluZyBmcm9tIC9ldGMvIGNvbmZpZyBmaWxlcworCS0gcmV2aWV3IGJ5IHRoZSB3aXJlbGVzcyBkZXZlbG9wZXIgY29tbXVuaXR5CisKK1BsZWFzZSBzZW5kIGFueSBwYXRjaGVzIG9yIGNvbXBsYWludHMgYWJvdXQgdGhpcyBkcml2ZXIgdG8gR3JlZworS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBkb24ndCBib3RoZXIgdGhlIHVwc3RyZWFtIHdpcmVsZXNzCitrZXJuZWwgZGV2ZWxvcGVycyBhYm91dCBpdCwgdGhleSB3YW50IG5vdGhpbmcgdG8gZG8gd2l0aCBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvYWlyb25ldC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9haXJvbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwN2IxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvYWlyb25ldC5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWFpcm9uZXQuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCisqLworCisjaWZuZGVmCV9fQUlST05FVF9IX18KKyNkZWZpbmUJX19BSVJPTkVUX0hfXworCisvLyBNZWFzdXJlbWVudCBUeXBlIGRlZmluaXRpb24KKyNkZWZpbmUJTVNSTl9UWVBFX1VOVVNFRAkJCQkwCisjZGVmaW5lCU1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRCQkxCisjZGVmaW5lCU1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUQkJMgorI2RlZmluZQlNU1JOX1RZUEVfQkVBQ09OX1JFUQkJCTMKKyNkZWZpbmUJTVNSTl9UWVBFX0ZSQU1FX1JFUQkJCQk0CisKKy8vIFNjYW4gTW9kZSBpbiBCZWFjb24gUmVxdWVzdAorI2RlZmluZQlNU1JOX1NDQU5fTU9ERV9QQVNTSVZFCQkJMAorI2RlZmluZQlNU1JOX1NDQU5fTU9ERV9BQ1RJVkUJCQkxCisjZGVmaW5lCU1TUk5fU0NBTl9NT0RFX0JFQUNPTl9UQUJMRQkJMgorCisvLyBQSFkgdHlwZSBkZWZpbml0aW9uIGZvciBBaXJvbmV0IGJlYWNvbiByZXBvcnQsIENDWCAyIHRhYmxlIDM2LTkKKyNkZWZpbmUJUEhZX0ZICQkJCQkJCTEKKyNkZWZpbmUJUEhZX0RTUwkJCQkJCQkyCisjZGVmaW5lCVBIWV9VTlVTRUQJCQkJCQkzCisjZGVmaW5lCVBIWV9PRkRNCQkJCQkJNAorI2RlZmluZQlQSFlfSFJfRFNTCQkJCQkJNQorI2RlZmluZQlQSFlfRVJQCQkJCQkJCTYKKworLy8gUlBJIHRhYmxlIGluIGRCbQorI2RlZmluZQlSUElfMAkJCTAJCQkvLwlQb3dlciA8PSAtODcKKyNkZWZpbmUJUlBJXzEJCQkxCQkJLy8JLTg3IDwgUG93ZXIgPD0gLTgyCisjZGVmaW5lCVJQSV8yCQkJMgkJCS8vCS04MiA8IFBvd2VyIDw9IC03NworI2RlZmluZQlSUElfMwkJCTMJCQkvLwktNzcgPCBQb3dlciA8PSAtNzIKKyNkZWZpbmUJUlBJXzQJCQk0CQkJLy8JLTcyIDwgUG93ZXIgPD0gLTY3CisjZGVmaW5lCVJQSV81CQkJNQkJCS8vCS02NyA8IFBvd2VyIDw9IC02MgorI2RlZmluZQlSUElfNgkJCTYJCQkvLwktNjIgPCBQb3dlciA8PSAtNTcKKyNkZWZpbmUJUlBJXzcJCQk3CQkJLy8JLTU3IDwgUG93ZXIKKworLy8gQ2lzY28gQWlyb25ldCBJQVBQIGRlZmluZXRpb25zCisjZGVmaW5lCUFJUk9ORVRfSUFQUF9UWVBFCQkJCQkweDMyCisjZGVmaW5lCUFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUVVFU1QJCTB4MDEKKyNkZWZpbmUJQUlST05FVF9JQVBQX1NVQlRZUEVfUkVQT1JUCQkJMHg4MQorCisvLyBNZWFzdXJlbWVudCBSZXF1ZXN0IGRldGFpbCBmb3JtYXQKK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVFVRVNUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNjYW5Nb2RlOwkJCS8vIFVzZSBvbmx5IGluIGJlYWNvbiByZXF1ZXN0LCBvdGhlciByZXF1ZXN0cyBkaWQgbm90IHVzZSB0aGlzIGZpZWxkCisJVVNIT1JUCUR1cmF0aW9uOworfQlNRUFTVVJFTUVOVF9SRVFVRVNULCAqUE1FQVNVUkVNRU5UX1JFUVVFU1Q7CisKKy8vIEJlYWNvbiBNZWFzdXJlbWVudCBSZXBvcnQKKy8vIEFsbCB0aGVzZSBmaWVsZCBtaWdodCBjaGFuZ2UgdG8gVUNIQVIsIGJlY2F1c2Ugd2UgZGlkbid0IGRvIGFueXRoaW5nIHRvIHRoZXNlIHJlcG9ydC4KKy8vIFdlIGNvcHkgYWxsIHRoZXNlIGJlYWNvbnMgYW5kIHJlcG9ydCB0byBDQ1ggMiBBUC4KK3R5cGVkZWYJc3RydWN0CV9CRUFDT05fUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglQaHlUeXBlOwkJCS8vIERlZmluaWF0aW9uIGlzIGxpc3RlZCBhYm92ZSB0YWJsZSAzNi05CisJVUNIQVIJUnhQb3dlcjsKKwlVQ0hBUglCU1NJRFs2XTsKKwlVQ0hBUglQYXJlbnRUU0ZbNF07CisJVUNIQVIJVGFyZ2V0VFNGWzhdOworCVVTSE9SVAlCZWFjb25JbnRlcnZhbDsKKwlVU0hPUlQJQ2FwYWJpbGl0eUluZm87Cit9CUJFQUNPTl9SRVBPUlQsICpQQkVBQ09OX1JFUE9SVDsKKworLy8gRnJhbWUgTWVhc3VyZW1lbnQgUmVwb3J0IChPcHRpb25hbCkKK3R5cGVkZWYJc3RydWN0CV9GUkFNRV9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCVRBOworCVVDSEFSCUJTU0lEWzZdOworCVVDSEFSCVJTU0k7CisJVUNIQVIJQ291bnQ7Cit9CUZSQU1FX1JFUE9SVCwgKlBGUkFNRV9SRVBPUlQ7CisKKyNwcmFnbWEgcGFjaygxKQorLy8gQ2hhbm5lbCBMb2FkIFJlcG9ydAordHlwZWRlZglzdHJ1Y3QJX0NIQU5ORUxfTE9BRF9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCUNDQUJ1c3k7Cit9CUNIQU5ORUxfTE9BRF9SRVBPUlQsICpQQ0hBTk5FTF9MT0FEX1JFUE9SVDsKKyNwcmFnbWEgcGFjaygpCisKKy8vIE5vc2llIEhpc3RvZ3JhbSBSZXBvcnQKK3R5cGVkZWYJc3RydWN0CV9OT0lTRV9ISVNUX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJRGVuc2l0eVs4XTsKK30JTk9JU0VfSElTVF9SRVBPUlQsICpQTk9JU0VfSElTVF9SRVBPUlQ7CisKKy8vIFJhZGlvIE1hbmFnZW1lbnQgQ2FwYWJpbGl0eSBlbGVtZW50Cit0eXBlZGVmCXN0cnVjdAlfUkFESU9fTUFOQUdFTUVOVF9DQVBBQklMSVRZCXsKKwlVQ0hBUglFaWQ7CQkJCS8vIFRPRE86IFdoeSB0aGUgRWlkIGlzIDEgYnl0ZSwgbm90IG5vcm1hbCAyIGJ5dGVzPz8/CisJVUNIQVIJTGVuZ3RoOworCVVDSEFSCUFpcm9uZXRPdWlbM107CQkvLyBBSXJvbmV0IE9VSSAoMDAgNDAgOTYpCisJVUNIQVIJVHlwZTsJCQkJLy8gVHlwZSAvIFZlcnNpb24KKwlVU0hPUlQJU3RhdHVzOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKK30JUkFESU9fTUFOQUdFTUVOVF9DQVBBQklMSVRZLCAqUFJBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWTsKKworLy8gTWVhc3VyZW1lbnQgTW9kZSBCaXQgZGVmaW5pdGlvbgordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX01PREUJeworCVVDSEFSCVJzdmQ6NDsKKwlVQ0hBUglSZXBvcnQ6MTsKKwlVQ0hBUglOb3RVc2VkOjE7CisJVUNIQVIJRW5hYmxlOjE7CisJVUNIQVIJUGFyYWxsZWw6MTsKK30JTUVBU1VSRU1FTlRfTU9ERSwgKlBNRUFTVVJFTUVOVF9NT0RFOworCisvLyBNZWFzdXJlbWVudCBSZXF1ZXN0IGVsZW1lbnQsIFRoaXMgaXMgbGl0dGxlIGVuZGlhbiBtb2RlCit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UCXsKKwlVU0hPUlQJCQkJRWlkOworCVVTSE9SVAkJCQlMZW5ndGg7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAorCVVTSE9SVAkJCQlUb2tlbjsJCQkJLy8gbm9uLXplcm8gdW5pcXVlIHRva2VuCisJVUNIQVIJCQkJTW9kZTsJCQkJLy8gTWVhc3VyZW1lbnQgTW9kZQorCVVDSEFSCQkJCVR5cGU7CQkJCS8vIE1lYXN1cmVtZW50IHR5cGUKK30JTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5ULCAqUE1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVDsKKworLy8gTWVhc3VyZW1lbnQgUmVwb3J0IGVsZW1lbnQsIFRoaXMgaXMgbGl0dGxlIGVuZGlhbiBtb2RlCit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJeworCVVTSE9SVAkJCQlFaWQ7CisJVVNIT1JUCQkJCUxlbmd0aDsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCisJVVNIT1JUCQkJCVRva2VuOwkJCQkvLyBub24temVybyB1bmlxdWUgdG9rZW4KKwlVQ0hBUgkJCQlNb2RlOwkJCQkvLyBNZWFzdXJlbWVudCBNb2RlCisJVUNIQVIJCQkJVHlwZTsJCQkJLy8gTWVhc3VyZW1lbnQgdHlwZQorfQlNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCwgKlBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVDsKKworLy8gQ2lzY28gQWlyb25ldCBJQVBQIEZyYW1lIEhlYWRlciwgTmV0d29yayBieXRlIG9yZGVyIHVzZWQKK3R5cGVkZWYJc3RydWN0CV9BSVJPTkVUX0lBUFBfSEVBREVSIHsKKwlVQ0hBUglDaXNjb1NuYXBIZWFkZXJbOF07CS8vIDggYnl0ZXMgQ2lzY28gc25hcCBoZWFkZXIKKwlVU0hPUlQJTGVuZ3RoOwkJCQkvLyBJQVBQIElEICYgbGVuZ3RoLCByZW1lbWJlciB0byBzd2FwMTYgaW4gTEUgc3lzdGVtCisJVUNIQVIJVHlwZTsJCQkJLy8gSUFQUCB0eXBlCisJVUNIQVIJU3ViVHlwZTsJCQkvLyBJQVBQIHN1YnR5cGUKKwlVQ0hBUglEQVs2XTsJCQkJLy8gRGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwlVQ0hBUglTQVs2XTsJCQkJLy8gU291cmNlIE1BQyBhZGRyZXNzCisJVVNIT1JUCVRva2VuOwkJCQkvLyBEaWFsb2cgdG9rZW4sIG5vIG5lZWQgdG8gc3dhcDE2IHNpbmNlIGl0IGlzIGZvciB5b2tlbiB1c2FnZSBvbmx5Cit9CUFJUk9ORVRfSUFQUF9IRUFERVIsICpQQUlST05FVF9JQVBQX0hFQURFUjsKKworLy8gUmFkaW8gTWVhc3VyZW1lbnQgUmVxdWVzdCBmcmFtZQordHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRQl7CisgICAgQUlST05FVF9JQVBQX0hFQURFUglJQVBQOwkJCS8vIENvbW1vbiBoZWFkZXIKKwlVQ0hBUgkJCQlEZWxheTsJCQkvLyBBY3RpdmF0aW9uIERlbGF5CisJVUNIQVIJCQkJT2Zmc2V0OwkJCS8vIE1lYXN1cmVtZW50IG9mZnNldAorfQlBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUsICpQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FOworCisvLyBSYWRpbyBNZWFzdXJlbWVudCBSZXBvcnQgZnJhbWUKK3R5cGVkZWYJc3RydWN0CV9BSVJPTkVUX1JNX1JFUE9SVF9GUkFNRQl7CisgICAgQUlST05FVF9JQVBQX0hFQURFUglJQVBQOwkJCS8vIENvbW1vbiBoZWFkZXIKK30JQUlST05FVF9STV9SRVBPUlRfRlJBTUUsICpQQUlST05FVF9STV9SRVBPUlRfRlJBTUU7CisKKy8vIFNhdmVkIGVsZW1lbnQgcmVxdWVzdCBhY3Rpb25zIHdoaWNoIHdpbGwgc2F2ZWQgaW4gU3RhQ2ZnLgordHlwZWRlZglzdHJ1Y3QJX1JNX1JFUVVFU1RfQUNUSU9OCXsKKwlNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQJUmVxRWxlbTsJCS8vIFNhdmVkIHJlcXVlc3QgZWxlbWVudAorCU1FQVNVUkVNRU5UX1JFUVVFU1QJCQlNZWFzdXJlbWVudDsJLy8gU2F2ZWQgbWVhc3VyZW1lbnQgd2l0aGluIHRoZSByZXF1ZXN0IGVsZW1lbnQKK30JUk1fUkVRVUVTVF9BQ1RJT04sICpQUk1fUkVRVUVTVF9BQ1RJT047CisKKy8vIENDWCBhZG1pbmlzdHJhdGlvbiBjb250cm9sCit0eXBlZGVmCXVuaW9uCV9DQ1hfQ09OVFJPTAl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlFbmFibGU6MTsJCQkvLyBFbmFibGUgQ0NYMgorCQlVSU5UMzIJCUxlYXBFbmFibGU6MTsJCS8vIEVuYWJsZSBMRUFQIGF0IENDWDIKKwkJVUlOVDMyCQlSTUVuYWJsZToxOwkJCS8vIFJhZGlvIE1lYXN1cmVtZW50IEVuYWJsZQorCQlVSU5UMzIJCURDUk1FbmFibGU6MTsJCS8vIE5vbiBzZXJ2aW5nIGNoYW5uZWwgUmFkaW8gTWVhc3VyZW1lbnQgZW5hYmxlCisJCVVJTlQzMgkJUU9TRW5hYmxlOjE7CQkvLyBFbmFibGUgUU9TIGZvciBDQ1ggMi4wIHN1cHBvcnQKKwkJVUlOVDMyCQlGYXN0Um9hbUVuYWJsZToxOwkvLyBFbmFibGUgZmFzdCByb2FtaW5nCisJCVVJTlQzMgkJUnN2ZDoyOwkJCQkvLyBOb3QgdXNlZAorCQlVSU5UMzIJCWRCbVRvUm9hbTo4OwkJLy8gdGhlIGNvbmRpdGlvbiB0byByb2FtIHdoZW4gcmVjZWl2aW5nIFJzc2kgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIEl0J3MgbmVnYXRpdmUgdmFsdWUuCisJCVVJTlQzMgkJVHVMaW1pdDoxNjsJCQkvLyBMaW1pdCBmb3IgZGlmZmVyZW50IGNoYW5uZWwgc2NhbgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ0NYX0NPTlRST0wsICpQQ0NYX0NPTlRST0w7CisKKyNlbmRpZgkvLyBfX0FJUk9ORVRfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2FwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjNTU3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvYXAuaApAQCAtMCwwICsxLDU2MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBhcC5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGF1bCBMaW4gICAgMDgtMDEtMjAwMiAgICBjcmVhdGVkCisgICAgSmFtZXMgVGFuICAgMDktMDYtMjAwMiAgICBtb2RpZmllZCAoUmV2aXNlIE5UQ1JlZ1RhYmxlKQorICAgIEpvaG4gQ2hhbmcgIDEyLTIyLTIwMDQgICAgbW9kaWZpZWQgZm9yIFJUMjU2MS8yNjYxLiBtZXJnZSB3aXRoIFNUQSBkcml2ZXIKKyovCisjaWZuZGVmIF9fQVBfSF9fCisjZGVmaW5lIF9fQVBfSF9fCisKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEFQIFJUTVAuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICAgICBGdW5jdGlvbiBQcm90b3R5cGVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIGFwX2RhdGEuYworCitCT09MRUFOIEFQQnJpZGdlVG9XaXJlbGVzc1N0YSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXIsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4gIFVMT05HICAgICAgICAgICBmcm9td2RzaWR4KTsKKworQk9PTEVBTiBBUEhhbmRsZVJ4RG9uZUludGVycnVwdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQJQVBTZW5kUGFja2V0cygKKwlJTglORElTX0hBTkRMRQkJTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwlJTglQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXksCisJSU4JVUlOVAkJCU51bWJlck9mUGFja2V0cyk7CisKK05ESVNfU1RBVFVTIEFQU2VuZFBhY2tldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCisKK05ESVNfU1RBVFVTIEFQSGFyZFRyYW5zbWl0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlRdWVJZHgpOworCitWT0lEIEFQUnhFQVBPTEZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworTkRJU19TVEFUVVMgQVBDaGVja1J4RXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFJUMjhYWF9SWERfU1RSVUMJCXBSeEQsCisJSU4JVUNIQVIJCQlXY2lkKTsKKworQk9PTEVBTiBBUENoZWNrQ2xhc3MyQ2xhc3MzRXJyb3IoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gVUxPTkcgV2NpZCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIpOworCitWT0lEIEFQSGFuZGxlUnhQc1BvbGwoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEFkZHIsCisJSU4JVVNIT1JUCQkJQWlkLAorICAgIElOCUJPT0xFQU4JCQlpc0FjdGl2ZSk7CisKK1ZPSUQgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgIERlc2NyaXB0b3JUeXBlKTsKKworVk9JRCAgICBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgIERpciwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgIEZyb21SeERvbmVJbnQpOworCisvLyBhcF9hc3NvYy5jCisKK1ZPSUQgQVBBc3NvY1N0YXRlTWFjaGluZUluaXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCAgQVBQZWVyQXNzb2NSZXFBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIEFQUGVlclJlYXNzb2NSZXFBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIEFQUGVlckRpc2Fzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1ic3NLaWNrT3V0U3RhcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgYXBpZHgsCisJSU4gVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgQVBNbG1lS2lja091dFN0YSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFN0YUFkZHIsCisJSU4gVUNIQVIgV2NpZCwKKwlJTiBVU0hPUlQgUmVhc29uKTsKKworVk9JRCBBUE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUENsczNlcnJBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gCVVMT05HIFdjaWQsCisgICAgSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlcik7CisKKworVVNIT1JUIEFQQnVpbGRBc3NvY2lhdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKyAgICBJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisgICAgSU4gVUNIQVIgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCisgICAgSU4gVUNIQVIgICpSU04sCisgICAgSU4gVUNIQVIgICpwUlNOTGVuLAorICAgIElOIEJPT0xFQU4gYldtbUNhcGFibGUsCisgICAgSU4gVUxPTkcgIFJhbGlua0llLAorI2lmZGVmIERPVDExTl9EUkFGVDMKKyAgICBJTiBFWFRfQ0FQX0lORk9fRUxFTUVOVCBFeHRDYXBJbmZvLAorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiBVQ0hBUgkJIEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgVVNIT1JUICpwQWlkKTsKKworLyoKK1ZPSUQJUlRNUEFkZENsaWVudFNlYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglCc3NJZHgsCisJSU4gVUNIQVIJCSBLZXlJZHgsCisJSU4gVUNIQVIJCSBDaXBoZXJBbGcsCisJSU4gUFVDSEFSCQkgcEtleSwKKwlJTiBQVUNIQVIJCSBwVHhNaWMsCisJSU4gUFVDSEFSCQkgcFJ4TWljLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKyovCisKKy8vIGFwX2F1dGguYworCit2b2lkIEFQQXV0aFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBUE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gCVVMT05HIFdjaWQsCisgICAgSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlcik7CisKKy8vIGFwX2F1dGhyc3AuYworCitWT0lEIEFQQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCisgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQUGVlckF1dGhBdEF1dGhSc3BJZGxlQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckRlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gIFVTSE9SVCBBbGcsCisgICAgSU4gIFVTSE9SVCBTZXEsCisgICAgSU4gIFVTSE9SVCBTdGF0dXNDb2RlKTsKKworLy8gYXBfY29ubmVjdC5jCisKK0JPT0xFQU4gQmVhY29uVHJhbnNtaXRSZXF1aXJlZCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBJTlQJCQkJYXBpZHgpOworCitWT0lEIEFQTWFrZUJzc0JlYWNvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgpOworCitWT0lEICBBUFVwZGF0ZUJlYWNvbkZyYW1lKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCk7CisKK1ZPSUQgQVBNYWtlQWxsQnNzQmVhY29uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgQVBVcGRhdGVBbGxCZWFjb25GcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKKworLy8gYXBfc3luYy5jCisKK1ZPSUQgQVBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBUEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlclByb2JlUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJCZWFjb25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuQ25jbEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFwU2l0ZVN1cnZleSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgU3VwcG9ydFJhdGUoCisJSU4gUFVDSEFSIFN1cFJhdGUsCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBQVUNIQVIgRXh0UmF0ZSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCU9VVCBQVUNIQVIgKlJhdGVzLAorCU9VVCBQVUNIQVIgUmF0ZXNMZW4sCisJT1VUIFBVQ0hBUiBwTWF4U3VwcG9ydFJhdGUpOworCisKK0JPT0xFQU4gQXBTY2FuUnVubmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEFQT3ZlcmxhcHBpbmdCU1NTY2FuKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGFwX3dwYS5jCisKK1ZPSUQgQVBXcGFTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCisvLyBhcF9tbG1lLmMKKworVk9JRCBBUE1sbWVQZXJpb2RpY0V4ZWMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7CisKK1ZPSUQgQVBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7CisKK1ZPSUQgQVBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVBRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gQVBNc2dUeXBlU3Vic3QoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCisgICAgT1VUIElOVCAqTWFjaGluZSwKKyAgICBPVVQgSU5UICpNc2dUeXBlKTsKKworVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworI2lmZGVmIFJUMjg3MAorVk9JRCBCZWFjb25VcGRhdGVFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgUlRNUFNldFBpZ2d5QmFjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBCT09MRUFOCQkJYlBpZ2d5QmFjayk7CisKK1ZPSUQgQVBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgQVBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKy8vIGFwLmMKKworVk9JRCBBUFN3aXRjaENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIENoYW5uZWwpOworCitORElTX1NUQVRVUyBBUEluaXRpYWxpemUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQU2h1dGRvd24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOworCitWT0lEIEFQU3RhcnRVcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBTdG9wKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUENsZWFudXBQc1F1ZXVlKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQUVVFVUVfSEVBREVSICAgcFF1ZXVlKTsKKworVk9JRCBNYWNUYWJsZVJlc2V0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydEVudHJ5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlJTiBCT09MRUFOCUNsZWFuQWxsKTsKKworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFVTSE9SVCB3Y2lkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOworCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOworCitWT0lEIE1hY1RhYmxlTWFpbnRlbmFuY2UoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVSU5UMzIgTWFjVGFibGVBc3NvY1N0YU51bUdldCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK01BQ19UQUJMRV9FTlRSWSAqQVBTc1BzSW5xdWlyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAorICAgIE9VVCBTU1QgICAgICAgICAgICAgKlNzdCwKKyAgICBPVVQgVVNIT1JUICAgICAgICAgICpBaWQsCisgICAgT1VUIFVDSEFSICAgICAgICAgICAqUHNNb2RlLAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgKlJhdGUpOworCitCT09MRUFOIEFQUHNJbmRpY2F0ZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAorCUlOIFVMT05HIFdjaWQsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBQc20pOworCitWT0lEIEFwTG9nRXZlbnQoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKKyAgICBJTiBVU0hPUlQgICAgICAgICAgIEV2ZW50KTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBBUFVwZGF0ZU9wZXJhdGlvbk1vZGUoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEFQVXBkYXRlQ2FwYWJpbGl0eUFuZEVycEllKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBBcENoZWNrQWNjZXNzQ29udHJvbExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUiAgICAgICAgIEFwaWR4KTsKKworVk9JRCBBcFVwZGF0ZUFjY2Vzc0NvbnRyb2xMaXN0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSICAgICAgICAgQXBpZHgpOworCitWT0lEIEFwRW5xdWV1ZU51bGxGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSICAgICAgICAgVHhSYXRlLAorCUlOIFVDSEFSICAgICAgICAgUElELAorCUlOIFVDSEFSICAgICAgICAgYXBpZHgsCisgICAgSU4gQk9PTEVBTiAgICAgICBiUW9zTnVsbCwKKyAgICBJTiBCT09MRUFOICAgICAgIGJFT1NQLAorICAgIElOIFVDSEFSICAgICAgICAgT2xkVVApOworCitWT0lEIEFwU2VuZEZyYW1lKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVk9JRCAgICAgICAgICAgcEJ1ZmZlciwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgIExlbmd0aCwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgIFBJRCk7CisKK1ZPSUQgQXBFbnF1ZXVlQWNrRnJhbWUoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFVDSEFSICAgICAgICBwQWRkciwKKyAgICBJTiBVQ0hBUiAgICAgICAgIFR4UmF0ZSwKKwlJTiBVQ0hBUiAgICAgICAgIGFwaWR4KTsKKworVUNIQVIgQVBBdXRvU2VsZWN0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIE9wdGltYWwpOworCisvLyBhcF9zYW5pdHkuYworCisKK0JPT0xFQU4gUGVlckFzc29jUmVxQ21tU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gaXNSZXNzb2MsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcExpc3RlbkludGVydmFsLAorICAgIE9VVCBQVUNIQVIgcEFwQWRkciwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAorICAgIE9VVCBjaGFyICpTc2lkLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqUlNOLAorICAgIE9VVCBVQ0hBUiAqcFJTTkxlbiwKKyAgICBPVVQgQk9PTEVBTiAqcGJXbW1DYXBhYmxlLAorI2lmZGVmIFdTQ19BUF9TVVBQT1JUCisgICAgT1VUIEJPT0xFQU4gKnBXc2NDYXBhYmxlLAorI2VuZGlmIC8vIFdTQ19BUF9TVVBQT1JUIC8vCisgICAgT1VUIFVMT05HICAqcFJhbGlua0llLAorI2lmZGVmIERPVDExTl9EUkFGVDMKKyAgICBPVVQgRVhUX0NBUF9JTkZPX0VMRU1FTlQJKnBFeHRDYXBJbmZvLAorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyAgICBPVVQgVUNIQVIJCSAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7CisKK0JPT0xFQU4gUGVlckRpc2Fzc29jUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqUmVhc29uKTsKKworQk9PTEVBTiBQZWVyRGVhdXRoUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqUmVhc29uKTsKKworQk9PTEVBTiBBUFBlZXJBdXRoU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjEsCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqQWxnLAorICAgIE9VVCBVU0hPUlQgKlNlcSwKKyAgICBPVVQgVVNIT1JUICpTdGF0dXMsCisgICAgQ0hBUiAqQ2hsZ1RleHQpOworCitCT09MRUFOIEFQUGVlclByb2JlUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIENIQVIgU3NpZFtdLAorICAgIE9VVCBVQ0hBUiAqU3NpZExlbik7CisKK0JPT0xFQU4gQVBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgUFVDSEFSIHBCc3NpZCwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpTc2lkTGVuLAorICAgIE9VVCBVQ0hBUiAqQnNzVHlwZSwKKyAgICBPVVQgVVNIT1JUICpCZWFjb25QZXJpb2QsCisgICAgT1VUIFVDSEFSICpDaGFubmVsLAorICAgIE9VVCBMQVJHRV9JTlRFR0VSICpUaW1lc3RhbXAsCisgICAgT1VUIFVTSE9SVCAqQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVDSEFSIFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKlJhdGVMZW4sCisgICAgT1VUIEJPT0xFQU4gKkV4dGVuZGVkUmF0ZUllRXhpc3QsCisgICAgT1VUIFVDSEFSICpFcnApOworCisvLyBhcF9pbmZvLmMKKworCisKKy8vID09PT09PT09PT09PT09PT09PSBlbmQgb2YgQVAgUlRNUC5oID09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyNlbmRpZiAgLy8gX19BUF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGxpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY2hsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxNWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY2hsaXN0LmgKQEAgLTAsMCArMSwxMjk2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWNobGlzdC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRm9uY2hpIFd1ICAgMjAwNy0xMi0xOSAgICBjcmVhdGVkCisqLworCisjaWZuZGVmIF9fQ0hMSVNUX0hfXworI2RlZmluZSBfX0NITElTVF9IX18KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorI2luY2x1ZGUgInJ0bXBfZGVmLmgiCisKKworI2RlZmluZSBPRE9SCQkJMAorI2RlZmluZSBJRE9SCQkJMQorI2RlZmluZSBCT1RICQkJMgorCisjZGVmaW5lIEJBTkRfNUcgICAgICAgICAwCisjZGVmaW5lIEJBTkRfMjRHICAgICAgICAxCisjZGVmaW5lIEJBTkRfQk9USCAgICAgICAyCisKK3R5cGVkZWYgc3RydWN0IF9DSF9ERVNQIHsKKwlVQ0hBUiBGaXJzdENoYW5uZWw7CisJVUNIQVIgTnVtT2ZDaDsKKwlDSEFSIE1heFR4UHdyOwkJCS8vIGRCbQorCVVDSEFSIEdlb2dyYXBoeTsJCQkvLyAwOm91dCBkb29yLCAxOmluIGRvb3IsIDI6Ym90aAorCUJPT0xFQU4gRGZzUmVxOwkJCS8vIERmcyByZXF1aXJlLCAwOiBObywgMTogeWVzLgorfSBDSF9ERVNQLCAqUENIX0RFU1A7CisKK3R5cGVkZWYgc3RydWN0IF9DSF9SRUdJT04geworCVVDSEFSIENvdW50UmVnWzNdOworCVVDSEFSIERmc1R5cGU7CQkJLy8gMDogQ0UsIDE6IEZDQywgMjogSkFQLCAzOkpBUF9XNTMsIEpBUF9XNTYKKwlDSF9ERVNQIENoRGVzcFsxMF07Cit9IENIX1JFR0lPTiwgKlBDSF9SRUdJT047CisKK3N0YXRpYyBDSF9SRUdJT04gQ2hSZWdpb25bXSA9Cit7CisJCXsJLy8gQW50aWd1YSBhbmQgQmVyYnVkYQorCQkJIkFHIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQXJnZW50aW5hCisJCQkiQVIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQXJ1YmEKKwkJCSJBVyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEF1c3RyYWxpYQorCQkJIkFVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQXVzdHJpYQorCQkJIkFUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQmFoYW1hcworCQkJIkJTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQmFyYmFkb3MKKwkJCSJCQiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJlcm11ZGEKKwkJCSJCTSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJyYXppbAorCQkJIkJSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJlbGdpdW0KKwkJCSJCRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDE4LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQnVsZ2FyaWEKKwkJCSJCRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDYW5hZGEKKwkJCSJDQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENheW1hbiBJc0xhbmRzCisJCQkiS1kiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDaGlsZQorCQkJIkNMIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2hpbmEKKwkJCSJDTiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksIDQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ29sb21iaWEKKwkJCSJDTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDb3N0YSBSaWNhCisJCQkiQ1IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDeXBydXMKKwkJCSJDWSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEN6ZWNoX1JlcHVibGljCisJCQkiQ1oiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIERlbm1hcmsKKwkJCSJESyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIERvbWluaWNhbiBSZXB1YmxpYworCQkJIkRPIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAwLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDAKKwkJCQl7IDE0OSwgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBFcXVhZG9yCisJCQkiRUMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDEwMCwgMTEsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRWwgU2FsdmFkb3IKKwkJCSJTViIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDQsICAgMzYsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRmlubGFuZAorCQkJIkZJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBGcmFuY2UKKwkJCSJGUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBHZXJtYW55CisJCQkiREUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEdyZWVjZQorCQkJIkdSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBHdWFtCisJCQkiR1UiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBHdWF0ZW1hbGEKKwkJCSJHVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIYWl0aQorCQkJIkhUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEhvbmR1cmFzCisJCQkiSE4iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgIDQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSG9uZyBLb25nCisJCQkiSEsiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSHVuZ2FyeQorCQkJIkhVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEljZWxhbmQKKwkJCSJJUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSW5kaWEKKwkJCSJJTiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCAJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJbmRvbmVzaWEKKwkJCSJJRCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCAJNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJcmVsYW5kCisJCQkiSUUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJc3JhZWwKKwkJCSJJTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgIDMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4zCisJCQkJeyA0LCAJNiwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCA0fjkKKwkJCQl7IDEwLCAJNCwgIDIwLCBJRE9SLCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxMH4xMworCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXRhbHkKKwkJCSJJVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEphcGFuCisJCQkiSlAiLAorCQkJSkFQLAorCQkJeworCQkJCXsgMSwgICAxNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjE0CisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEpvcmRhbgorCQkJIkpPIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBJRE9SLCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDE0OSwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTGF0dmlhCisJCQkiTFYiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBMaWVjaHRlbnN0ZWluCisJCQkiTEkiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTGl0aHVhbmlhCisJCQkiTFQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBMdXhlbWJ1cmcKKwkJCSJMVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1hbGF5c2lhCisJCQkiTVkiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAzNiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNYWx0YQorCQkJIk1UIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWFyb2NjbworCQkJIk1BIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1leGljbworCQkJIk1YIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNSwgIDMwLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBOZXRoZXJsYW5kcworCQkJIk5MIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTmV3IFplYWxhbmQKKwkJCSJOWiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTm9yd2F5CisJCQkiTk8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBQZXJ1CisJCQkiUEUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgIDQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUG9ydHVnYWwKKwkJCSJQVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUG9sYW5kCisJCQkiUEwiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFJvbWFuaWEKKwkJCSJSTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUnVzc2lhCisJCQkiUlUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgIDQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU2F1ZGkgQXJhYmlhCisJCQkiU0EiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU2VyYmlhX2FuZF9Nb250ZW5lZ3JvCisJCQkiQ1MiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNpbmdhcG9yZQorCQkJIlNHIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNsb3Zha2lhCisJCQkiU0siLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNsb3ZlbmlhCisJCQkiU0kiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU291dGggQWZyaWNhCisJCQkiWkEiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNvdXRoIEtvcmVhCisJCQkiS1IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgIDgsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjEyOAorCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTcGFpbgorCQkJIkVTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTd2VkZW4KKwkJCSJTRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3dpdHplcmxhbmQKKwkJCSJDSCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFRhaXdhbgorCQkJIlRXIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBUdXJrZXkKKwkJCSJUUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVUsKKwkJCSJHQiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVWtyYWluZQorCQkJIlVBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBVbml0ZWRfQXJhYl9FbWlyYXRlcworCQkJIkFFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBVbml0ZWRfU3RhdGVzCisJCQkiVVMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAxNywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyNCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVmVuZXp1ZWxhCisJCQkiVkUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDE0OSwgIDQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRGVmYXVsdAorCQkJIiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMzYsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgNTIsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKK307CisKK3N0YXRpYyBpbmxpbmUgUENIX1JFR0lPTiBHZXRDaFJlZ2lvbigKKwlJTiBQVUNIQVIgQ250cnlDb2RlKQoreworCUlOVCBsb29wID0gMDsKKwlQQ0hfUkVHSU9OIHBDaFJlZ2lvbiA9IE5VTEw7CisKKwl3aGlsZSAoc3RyY21wKENoUmVnaW9uW2xvb3BdLkNvdW50UmVnLCAiIikgIT0gMCkKKwl7CisJCWlmIChzdHJuY21wKENoUmVnaW9uW2xvb3BdLkNvdW50UmVnLCBDbnRyeUNvZGUsIDIpID09IDApCisJCXsKKwkJCXBDaFJlZ2lvbiA9ICZDaFJlZ2lvbltsb29wXTsKKwkJCWJyZWFrOworCQl9CisJCWxvb3ArKzsKKwl9CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXBDaFJlZ2lvbiA9ICZDaFJlZ2lvbltsb29wXTsKKwlyZXR1cm4gcENoUmVnaW9uOworfQorCitzdGF0aWMgaW5saW5lIFZPSUQgQ2hCYW5kQ2hlY2soCisJSU4gVUNIQVIgUGh5TW9kZSwKKwlPVVQgUFVDSEFSIHBDaFR5cGUpCit7CisJc3dpdGNoKFBoeU1vZGUpCisJeworCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkqcENoVHlwZSA9IEJBTkRfNUc7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkqcENoVHlwZSA9IEJBTkRfQk9USDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkqcENoVHlwZSA9IEJBTkRfMjRHOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW5saW5lIFVDSEFSIEZpbGxDaExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUENIX0RFU1AgcENoRGVzcCwKKwlJTiBVQ0hBUiBPZmZzZXQsCisJSU4gVUNIQVIgaW5jcmVtZW50KQoreworCUlOVCBpLCBqLCBsOworCVVDSEFSIGNoYW5uZWw7CisKKwlqID0gT2Zmc2V0OworCWZvciAoaSA9IDA7IGkgPCBwQ2hEZXNwLT5OdW1PZkNoOyBpKyspCisJeworCQljaGFubmVsID0gcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKKwkJZm9yIChsPTA7IGw8TUFYX05VTV9PRl9DSEFOTkVMUzsgbCsrKQorCQl7CisJCQlpZiAoY2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbbF0uQ2hhbm5lbCkKKwkJCXsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyID0gcEFkLT5UeFBvd2VyW2xdLlBvd2VyOworCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIyID0gcEFkLT5UeFBvd2VyW2xdLlBvd2VyMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAobCA9PSBNQVhfTlVNX09GX0NIQU5ORUxTKQorCQkJY29udGludWU7CisKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5DaGFubmVsID0gcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5NYXhUeFB3ciA9IHBDaERlc3AtPk1heFR4UHdyOworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkRmc1JlcSA9IHBDaERlc3AtPkRmc1JlcTsKKwkJaisrOworCX0KKwlwQWQtPkNoYW5uZWxMaXN0TnVtID0gajsKKworCXJldHVybiBqOworfQorCitzdGF0aWMgaW5saW5lIFZPSUQgQ3JlYXRlQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBDSF9SRUdJT04gcENoUmVnaW9uLAorCUlOIFVDSEFSIEdlb2dyYXBoeSkKK3sKKwlJTlQgaTsKKwlVQ0hBUiBvZmZzZXQgPSAwOworCVBDSF9ERVNQIHBDaERlc3A7CisJVUNIQVIgQ2hUeXBlOworCVVDSEFSIGluY3JlbWVudDsKKworCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQ2hCYW5kQ2hlY2socEFkLT5Db21tb25DZmcuUGh5TW9kZSwgJkNoVHlwZSk7CisKKwlmb3IgKGk9MDsgaTwxMDsgaSsrKQorCXsKKwkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKKwkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKKwkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gR2VvZ3JhcGh5KSkKKyAgICAgICAgeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gMTsKKwkJCW9mZnNldCA9IEZpbGxDaExpc3QocEFkLCBwQ2hEZXNwLCBvZmZzZXQsIGluY3JlbWVudCk7CisgICAgICAgIH0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBCdWlsZENoYW5uZWxMaXN0RXgoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUENIX1JFR0lPTiBwQ2hSZWc7CisKKwlwQ2hSZWcgPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisJQ3JlYXRlQ2hMaXN0KHBBZCwgcENoUmVnLCBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpOworfQorCitzdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRCZWFjb25DaExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwQnVmLAorCU9VVAlQVUxPTkcgcEJ1ZkxlbikKK3sKKwlJTlQgaTsKKwlVTE9ORyBUbXBMZW47CisJUENIX1JFR0lPTiBwQ2hSZWdpb247CisJUENIX0RFU1AgcENoRGVzcDsKKwlVQ0hBUiBDaFR5cGU7CisKKwlwQ2hSZWdpb24gPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCSpwQnVmTGVuID0gMDsKKworCWZvciAoaT0wOyBpPDEwOyBpKyspCisJeworCQlwQ2hEZXNwID0gJnBDaFJlZ2lvbi0+Q2hEZXNwW2ldOworCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID09IDApCisJCQlicmVhazsKKworCQlpZiAoQ2hUeXBlID09IEJBTkRfNUcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPD0gMTQpCisJCQkJY29udGludWU7CisJCX0KKwkJZWxzZSBpZiAoQ2hUeXBlID09IEJBTkRfMjRHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBCT1RIKQorCQkJfHwgKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwQnVmICsgKnBCdWZMZW4sCQkmVG1wTGVuLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5GaXJzdENoYW5uZWwsCisJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAJJnBDaERlc3AtPk51bU9mQ2gsCisJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAJJnBDaERlc3AtPk1heFR4UHdyLAorCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQkqcEJ1ZkxlbiArPSBUbXBMZW47CisJCX0KKwl9Cit9CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIGlubGluZSBCT09MRUFOIElzVmFsaWRDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIGNoYW5uZWwpCisKK3sKKwlJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQlyZXR1cm4gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgaW5saW5lIFVDSEFSIEdldEV4dENoKAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gVUNIQVIgRGlyZWN0aW9uKQoreworCUNIQVIgRXh0Q2g7CisKKwlpZiAoRGlyZWN0aW9uID09IEVYVENIQV9BQk9WRSkKKwkJRXh0Q2ggPSBDaGFubmVsICsgNDsKKwllbHNlCisJCUV4dENoID0gKENoYW5uZWwgLSA0KSA+IDAgPyAoQ2hhbm5lbCAtIDQpIDogMDsKKworCXJldHVybiBFeHRDaDsKK30KKworCitzdGF0aWMgaW5saW5lIFZPSUQgTl9DaGFubmVsQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy9VQ0hBUiBDaGFubmVsTnVtID0gcEFkLT5DaGFubmVsTGlzdE51bTsKKwlVQ0hBUiBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9PSBCV180MCkpCisJeworCQlpZiAoQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlpZiAoKENoYW5uZWwgPT0gMzYpIHx8IChDaGFubmVsID09IDQ0KSB8fCAoQ2hhbm5lbCA9PSA1MikgfHwgKENoYW5uZWwgPT0gNjApIHx8IChDaGFubmVsID09IDEwMCkgfHwgKENoYW5uZWwgPT0gMTA4KSB8fAorCQkJICAgIChDaGFubmVsID09IDExNikgfHwgKENoYW5uZWwgPT0gMTI0KSB8fCAoQ2hhbm5lbCA9PSAxMzIpIHx8IChDaGFubmVsID09IDE0OSkgfHwgKENoYW5uZWwgPT0gMTU3KSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCQkJfQorCQkJZWxzZSBpZiAoKENoYW5uZWwgPT0gNDApIHx8IChDaGFubmVsID09IDQ4KSB8fCAoQ2hhbm5lbCA9PSA1NikgfHwgKENoYW5uZWwgPT0gNjQpIHx8IChDaGFubmVsID09IDEwNCkgfHwgKENoYW5uZWwgPT0gMTEyKSB8fAorCQkJCQkoQ2hhbm5lbCA9PSAxMjApIHx8IChDaGFubmVsID09IDEyOCkgfHwgKENoYW5uZWwgPT0gMTM2KSB8fCAoQ2hhbm5lbCA9PSAxNTMpIHx8IChDaGFubmVsID09IDE2MSkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9CRUxPVzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlkbworCQkJeworCQkJCVVDSEFSIEV4dENoOworCQkJCVVDSEFSIERpciA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7CisJCQkJRXh0Q2ggPSBHZXRFeHRDaChDaGFubmVsLCBEaXIpOworCQkJCWlmIChJc1ZhbGlkQ2hhbm5lbChwQWQsIEV4dENoKSkKKwkJCQkJYnJlYWs7CisKKwkJCQlEaXIgPSAoRGlyID09IEVYVENIQV9BQk9WRSkgPyBFWFRDSEFfQkVMT1cgOiBFWFRDSEFfQUJPVkU7CisJCQkJRXh0Q2ggPSBHZXRFeHRDaChDaGFubmVsLCBEaXIpOworCQkJCWlmIChJc1ZhbGlkQ2hhbm5lbChwQWQsIEV4dENoKSkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBEaXI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQl9IHdoaWxlKEZBTFNFKTsKKworCQkJaWYgKENoYW5uZWwgPT0gMTQpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJCS8vcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9OT05FOwkvLyBXZSBkaWRuJ3Qgc2V0IHRoZSBFeHRDaCBhcyBOT05FIGR1ZSB0byBpdCdsbCBzZXQgaW4gUlRNUFNldEhUKCkKKwkJCX0KKyNpZiAwCisJCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gICYgMHg3ZikKKwkJCXsKKwkJCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8vIDEgLTExCisJCQkJY2FzZSBSRUdJT05fMV9CR19CQU5EOgkvLyAxIC0gMTMKKwkJCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8vIDEgLSAxNAorCQkJCQlpZiAoQ2hhbm5lbCA8PSA0KQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKENoYW5uZWwgPj0gOCkKKwkJCQkJeworCQkJCQkJaWYgKChDaGFubmVsTnVtIC0gQ2hhbm5lbCkgPCA0KQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJFR0lPTl8yX0JHX0JBTkQ6CS8vIDEwIC0gMTEKKwkJCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8vIDEwIC0gMTMKKwkJCQljYXNlIFJFR0lPTl80X0JHX0JBTkQ6CS8vIDE0CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8vIDMgLSA5CisJCQkJCWlmIChDaGFubmVsIDw9IDUpCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCQkJCQllbHNlIGlmIChDaGFubmVsID09IDYpCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQkJCWVsc2UgaWYgKENoYW5uZWwgPj0gNykKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fN19CR19CQU5EOiAgLy8gNSAtIDEzCisJCQkJCWlmIChDaGFubmVsIDw9IDgpCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCQkJCQllbHNlIGlmIChDaGFubmVsID49IDEwKQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9CRUxPVzsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgkvLyBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCisKK30KKworCitzdGF0aWMgaW5saW5lIFZPSUQgTl9TZXRDZW5DaCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gMTQpCisJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMTsKKwkJCWVsc2UKKwkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworc3RhdGljIGlubGluZSBVSU5UOCBHZXRDdW50cnlNYXhUeFB3cigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UOCBjaGFubmVsKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQlyZXR1cm4gMHhmZjsKKwllbHNlCisJCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyOworfQorI2VuZGlmIC8vIF9fQ0hMSVNUX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi8yODcwX3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vMjg3MF9ydG1wX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDg5YTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vMjg3MF9ydG1wX2luaXQuYwpAQCAtMCwwICsxLDE3NzggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJMjg3MF9ydG1wX2luaXQuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQorICAgIEphbiBMZWUgIAkyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KKwlTYW1wbGUgTGluCTIwMDctMDUtMzEgICAgTWVyZ2UgUlQyODYwIGFuZCBSVDI4NzAgZHJpdmVycy4KKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9hYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9hYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX3J0c19mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXRpYWxpemUgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKwlJbml0aWFsaXplIGFsbCByZWNlaXZlIHJlbGVhdGVkIHByaXZhdGUgYnVmZmVyLCBpbmNsdWRlIHRob3NlIGRlZmluZQorCWluIFJUTVBfQURBUFRFUiBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4gVGhlIG1haG9yCisJd29yayBpcyB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGVhY2ggcGFja2V0IGFuZCBjaGFpbiBidWZmZXIgdG8KKwlORElTIHBhY2tldCBkZXNjcmlwdG9yLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdFJlY3YoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCQkJaTsKKwlORElTX1NUQVRVUwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0UmVjdlxuIikpOworCXBPYmogPSBwT2JqOworCisJLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlBlbmRpbmdSeCwgMCk7CisJcEFkLT5QZW5kaW5nUnggPSAwOworCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4IAk9IDA7CS8vIE5leHQgUnggUmVhZCBpbmRleAorCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgJCT0gMCA7IC8vUlhfUklOR19TSVpFIC0xOyAvLyBSeCBCdWxrIHBvaW50ZXIKKwlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uIAk9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJLy9BbGxvY2F0ZSBVUkIKKwkJcFJ4Q29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKKwkJaWYgKHBSeENvbnRleHQtPnBVcmIgPT0gTlVMTCkKKwkJeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJZ290byBvdXQxOworCQl9CisKKwkJLy8gQWxsb2NhdGUgdHJhbnNmZXIgYnVmZmVyCisJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgTUFYX1JYQlVMS19TSVpFLCAmcFJ4Q29udGV4dC0+ZGF0YV9kbWEpOworCQlpZiAocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPT0gTlVMTCkKKwkJeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJZ290byBvdXQxOworCQl9CisKKwkJTmRpc1plcm9NZW1vcnkocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIE1BWF9SWEJVTEtfU0laRSk7CisKKwkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOworCQlwUnhDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisJCXBSeENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKKwkJcFJ4Q29udGV4dC0+UmVhZGFibGUJPSBGQUxTRTsKKwkJLy9wUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKwkJcFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPSBGQUxTRTsKKwkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdFJlY3ZcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworCitvdXQxOgorCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCXsKKwkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikKKwkJeworCQkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsCisJCQkJCQkJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBwUnhDb250ZXh0LT5kYXRhX2RtYSk7CisJCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCX0KKworCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5wVXJiKQorCQl7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJUlRVU0JfRlJFRV9VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCQlwUnhDb250ZXh0LT5wVXJiID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcy4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdFRyYW5zbWl0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworI2RlZmluZSBMTV9VU0JfQUxMT0MocE9iaiwgQ29udGV4dCwgVEJfVHlwZSwgQnVmZmVyU2l6ZSwgU3RhdHVzLCBtc2cxLCBlcnIxLCBtc2cyLCBlcnIyKQlcCisJQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsJCVwKKwlpZiAoQ29udGV4dC0+cFVyYiA9PSBOVUxMKSB7CQkJXAorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgbXNnMSk7CQlcCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsJCVwKKwkJZ290byBlcnIxOyB9CQkJCQkJXAorCQkJCQkJCQkJCQlcCisJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSAJCQkJXAorCQkoVEJfVHlwZSlSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLCAmQ29udGV4dC0+ZGF0YV9kbWEpOwlcCisJaWYgKENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID09IE5VTEwpIHsJXAorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgbXNnMik7CQlcCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsJCVwKKwkJZ290byBlcnIyOyB9CisKKyNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAorCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAorCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAorCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCisJCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJXAorCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsCVwKKwkJCQkJCQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsCVwKKwkJCQkJCQkJQ29udGV4dC0+ZGF0YV9kbWEpOwkJCVwKKwkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOyB9CisKKwlVQ0hBUgkJCWksIGFjaWR4OworCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVBUWF9DT05URVhUCQlwTnVsbENvbnRleHQgICA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisJUFRYX0NPTlRFWFQJCXBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOworCVBUWF9DT05URVhUCQlwUlRTQ29udGV4dCAgICA9ICYocEFkLT5SVFNDb250ZXh0KTsKKwlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0ID0gTlVMTDsKKy8vCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dCA9IE5VTEw7CisJUE9TX0NPT0tJRQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlQVk9JRAkJCVJpbmdCYXNlVmE7CisvLwlSVE1QX1RYX1JJTkcJKnBUeFJpbmc7CisJUlRNUF9NR01UX1JJTkcgICpwTWdtdFJpbmc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdFRyYW5zbWl0XG4iKSk7CisJcE9iaiA9IHBPYmo7CisKKwkvLyBJbml0IDQgc2V0IG9mIFR4IHBhcmFtZXRlcnMKKwlmb3IoYWNpZHggPSAwOyBhY2lkeCA8IE5VTV9PRl9UWF9SSU5HOyBhY2lkeCsrKQorCXsKKwkJLy8gSW5pdGlhbGl6ZSBhbGwgVHJhbnNtaXQgcmVsZWF0ZWQgcXVldWVzCisJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbYWNpZHhdKTsKKworCQkvLyBOZXh0IExvY2FsIHR4IHJpbmcgcG9pbnRlciB3YWl0aW5nIGZvciBidWNrIG91dAorCQlwQWQtPk5leHRCdWxrT3V0SW5kZXhbYWNpZHhdID0gYWNpZHg7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbYWNpZHhdID0gRkFMU0U7IC8vIEJ1Y2sgT3V0IGNvbnRyb2wgZmxhZworCQkvL3BBZC0+RGF0YUJ1bGtEb25lSWR4W2FjaWR4XSA9IDA7CisJfQorCisJLy9wQWQtPk5leHRNTE1FSW5kZXgJPSAwOworCS8vcEFkLT5QdXNoTWdtdEluZGV4CT0gMDsKKwkvL3BBZC0+UG9wTWdtdEluZGV4CT0gMDsKKwkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+TWdtdFF1ZXVlU2l6ZSwgMCk7CisJLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlR4Q291bnQsIDApOworCisJLy9wQWQtPlByaW9SaW5nRmlyc3RJbmRleAk9IDA7CisJLy9wQWQtPlByaW9SaW5nVHhDbnQJCT0gMDsKKworCWRvCisJeworCQkvLworCQkvLyBUWF9SSU5HX1NJWkUsIDQgQUNzCisJCS8vCisJCWZvcihhY2lkeD0wOyBhY2lkeDw0OyBhY2lkeCsrKQorCQl7CisJCQlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W2FjaWR4XSk7CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBIVFRYQ29udGV4dCwgc2l6ZW9mKEhUX1RYX0NPTlRFWFQpKTsKKwkJCS8vQWxsb2NhdGUgVVJCCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcEhUVFhDb250ZXh0LCBQSFRUWF9CVUZGRVIsIHNpemVvZihIVFRYX0JVRkZFUiksIFN0YXR1cywKKwkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIHVyYiEhIFxuIiwgYWNpZHgpLAorCQkJCQkJCWRvbmUsCisJCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggVHhDb250ZXh0WyVkXSBIVFRYX0JVRkZFUiAhISBcbiIsIGFjaWR4KSwKKwkJCQkJCQlvdXQxKTsKKworCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+QWdncmVnYXRpb24sIDQpOworCQkJcEhUVFhDb250ZXh0LT5wQWQgPSBwQWQ7CisJCQlwSFRUWENvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCQlwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPSAwOworCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSAwOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSAwOworCQkJcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IDA7CisJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBhY2lkeDsKKwkJCXBIVFRYQ29udGV4dC0+YlJpbmdFbXB0eSA9IFRSVUU7CisJCQlwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9IEZBTFNFOworCisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW2FjaWR4XSA9IEZBTFNFOworCQl9CisKKworCQkvLworCQkvLyBNR01UX1JJTkdfU0laRQorCQkvLworI2lmIDAKKwkJZm9yKGk9MDsgaTxNR01UX1JJTkdfU0laRTsgaSsrKSAvLyA4CisJCXsKKwkJCVBUWF9DT05URVhUCXBNTE1FQ29udGV4dCA9ICYocEFkLT5NTE1FQ29udGV4dFtpXSk7CisKKworCQkJTmRpc1plcm9NZW1vcnkocE1MTUVDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOworCisJCQkvL0FsbG9jYXRlIFVSQgorCQkJTE1fVVNCX0FMTE9DKHBPYmosIHBNTE1FQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKKwkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBNTE1FQ29udGV4dFslZF0gdXJiISEgXG4iLCBpKSwKKwkJCQkJCQlvdXQyLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE1MTUVDb250ZXh0WyVkXSBUWF9CVUZGRVIgISEgXG4iLCBpKSwKKwkJCQkJCQlvdXQyKTsKKworCQkJcE1MTUVDb250ZXh0LT5wQWQgPSBwQWQ7CisJCQlwTUxNRUNvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCX0KKyNlbHNlCisJCS8vIEFsbG9jYXRlIE1HTVQgcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5CisJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSA9IE1HTVRfUklOR19TSVpFICogc2l6ZW9mKFRYX0NPTlRFWFQpOworCQlSVE1QQWxsb2NhdGVNZW1vcnkoJnBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7CisJCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpCisJCXsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXIgZm9yIE1nbXREZXNjUmluZyFcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCQlOZGlzWmVyb01lbW9yeShwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUpOworCQlSaW5nQmFzZVZhICAgICA9IHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmE7CisKKwkJLy8gSW5pdGlhbGl6ZSBNR01UIFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQlwTWdtdFJpbmcgPSAmcEFkLT5NZ210UmluZzsKKwkJZm9yIChpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspCisJCXsKKwkJCS8vIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgTWdtdCBidWZmZXIgdG8gTWdtdFJpbmcuQ2VsbAorCQkJcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jU2l6ZSA9IHNpemVvZihUWF9DT05URVhUKTsKKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQlwTWdtdFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCQkJLy9BbGxvY2F0ZSBVUkIgZm9yIE1MTUVDb250ZXh0CisJCQlwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQkJcE1MTUVDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOworCQkJaWYgKHBNTE1FQ29udGV4dC0+cFVyYiA9PSBOVUxMKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBNTE1FQ29udGV4dFslZF0gdXJiISEgXG4iLCBpKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWdvdG8gb3V0MjsKKwkJCX0KKwkJCXBNTE1FQ29udGV4dC0+cEFkID0gcEFkOworCQkJcE1MTUVDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOworCQkJcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IDA7CisJCQlwTUxNRUNvbnRleHQtPlNlbGZJZHggPSBpOworCisJCQkvLyBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcworCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBzaXplb2YoVFhfQ09OVEVYVCk7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUdNVCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGkpKTsKKworCQkvL3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSAoTUdNVF9SSU5HX1NJWkUgLSAxKTsKKwkJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IE1HTVRfUklOR19TSVpFOworCQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKKwkJcEFkLT5NZ210UmluZy5UeERtYUlkeCA9IDA7CisjZW5kaWYKKworCQkvLworCQkvLyBCRUFDT05fUklOR19TSVpFCisJCS8vCisJCWZvcihpPTA7IGk8QkVBQ09OX1JJTkdfU0laRTsgaSsrKSAvLyAyCisJCXsKKwkJCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOworCisKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25Db250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOworCisJCQkvL0FsbG9jYXRlIFVSQgorCQkJTE1fVVNCX0FMTE9DKHBPYmosIHBCZWFjb25Db250ZXh0LCBQVFhfQlVGRkVSLCBzaXplb2YoVFhfQlVGRkVSKSwgU3RhdHVzLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIEJlYWNvbkNvbnRleHRbJWRdIHVyYiEhIFxuIiwgaSksCisJCQkJCQkJb3V0MiwKKwkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBCZWFjb25Db250ZXh0WyVkXSBUWF9CVUZGRVIgISEgXG4iLCBpKSwKKwkJCQkJCQlvdXQzKTsKKworCQkJcEJlYWNvbkNvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBCZWFjb25Db250ZXh0LT5wSXJwID0gTlVMTDsKKwkJCXBCZWFjb25Db250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJcEJlYWNvbkNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJfQorCisJCS8vCisJCS8vIE51bGxDb250ZXh0CisJCS8vCisJCU5kaXNaZXJvTWVtb3J5KHBOdWxsQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKKworCQkvL0FsbG9jYXRlIFVSQgorCQlMTV9VU0JfQUxMT0MocE9iaiwgcE51bGxDb250ZXh0LCBQVFhfQlVGRkVSLCBzaXplb2YoVFhfQlVGRkVSKSwgU3RhdHVzLAorCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTnVsbENvbnRleHQgdXJiISEgXG4iKSwKKwkJCQkJCW91dDMsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBOdWxsQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKKwkJCQkJCW91dDQpOworCisJCXBOdWxsQ29udGV4dC0+cEFkID0gcEFkOworCQlwTnVsbENvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwTnVsbENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCisJCS8vCisJCS8vIFJUU0NvbnRleHQKKwkJLy8KKwkJTmRpc1plcm9NZW1vcnkocFJUU0NvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7CisKKwkJLy9BbGxvY2F0ZSBVUkIKKwkJTE1fVVNCX0FMTE9DKHBPYmosIHBSVFNDb250ZXh0LCBQVFhfQlVGRkVSLCBzaXplb2YoVFhfQlVGRkVSKSwgU3RhdHVzLAorCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUlRTQ29udGV4dCB1cmIhISBcbiIpLAorCQkJCQkJb3V0NCwKKwkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFJUU0NvbnRleHQgVFhfQlVGRkVSICEhIFxuIiksCisJCQkJCQlvdXQ1KTsKKworCQlwUlRTQ29udGV4dC0+cEFkID0gcEFkOworCQlwUlRTQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBSVFNDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwUlRTQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCisJCS8vCisJCS8vIFBzUG9sbENvbnRleHQKKwkJLy8KKwkJLy9OZGlzWmVyb01lbW9yeShwUHNQb2xsQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKKwkJLy9BbGxvY2F0ZSBVUkIKKwkJTE1fVVNCX0FMTE9DKHBPYmosIHBQc1BvbGxDb250ZXh0LCBQVFhfQlVGRkVSLCBzaXplb2YoVFhfQlVGRkVSKSwgU3RhdHVzLAorCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUHNQb2xsQ29udGV4dCB1cmIhISBcbiIpLAorCQkJCQkJb3V0NSwKKwkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFBzUG9sbENvbnRleHQgVFhfQlVGRkVSICEhIFxuIiksCisJCQkJCQlvdXQ2KTsKKworCQlwUHNQb2xsQ29udGV4dC0+cEFkID0gcEFkOworCQlwUHNQb2xsQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBQc1BvbGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+YkFnZ3JlZ2F0aWJsZSA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+TGFzdE9uZSA9IFRSVUU7CisKKwl9ICAgd2hpbGUgKEZBTFNFKTsKKworCitkb25lOgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0VHJhbnNtaXRcbiIpKTsKKworCXJldHVybiBTdGF0dXM7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworb3V0NjoKKwlMTV9VUkJfRlJFRShwT2JqLCBwUHNQb2xsQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCitvdXQ1OgorCUxNX1VSQl9GUkVFKHBPYmosIHBSVFNDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisKK291dDQ6CisJTE1fVVJCX0ZSRUUocE9iaiwgcE51bGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisKK291dDM6CisJZm9yKGk9MDsgaTxCRUFDT05fUklOR19TSVpFOyBpKyspCisJeworCQlQVFhfQ09OVEVYVAlwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKKwkJaWYgKHBCZWFjb25Db250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcEJlYWNvbkNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKwl9CisKK291dDI6CisJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpCisJeworCQlwTWdtdFJpbmcgPSAmcEFkLT5NZ210UmluZzsKKwlmb3IoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspCisJeworCQlwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQlpZiAocE1MTUVDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcE1MTUVDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisJfQorCQlOZGlzRnJlZU1lbW9yeShwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsIDApOworCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID0gTlVMTDsKKwl9CisKK291dDE6CisJZm9yIChhY2lkeCA9IDA7IGFjaWR4IDwgNDsgYWNpZHgrKykKKwl7CisJCVBIVF9UWF9DT05URVhUIHBUeENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W2FjaWR4XSk7CisJCWlmIChwVHhDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFR4Q29udGV4dCwgc2l6ZW9mKEhUVFhfQlVGRkVSKSk7CisJfQorCisJLy8gSGVyZSB3ZSBkaWRuJ3QgaGF2ZSBhbnkgcHJlLWFsbG9jYXRlZCBtZW1vcnkgbmVlZCB0byBmcmVlLgorCisJcmV0dXJuIFN0YXR1czsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlLgorCitBcmd1bWVudHM6CisgICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfRkFJTFVSRQorCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisvLwlDT1VOVEVSXzgwMl8xMQlwQ291bnRlciA9ICZwQWQtPldsYW5Db3VudGVyczsKKwlORElTX1NUQVRVUwkJU3RhdHVzOworCUlOVAkJCQludW07CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeVxuIikpOworCisKKwlkbworCXsKKwkJLy8gSW5pdCB0aGUgQ21kUSBhbmQgQ21kUUxvY2sKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJUlRVU0JJbml0aWFsaXplQ21kUSgmcEFkLT5DbWRRKTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisKKworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NTE1FQnVsa091dExvY2spOworCQkvL05kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1MTUVXYWl0UXVldWVMb2NrKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMF0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1sxXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzJdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbM10pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1s0XSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzVdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa0luTG9jayk7CisKKwkJZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJCXsKKwkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tudW1dKTsKKwkJfQorCisjaWZkZWYgUkFMSU5LX0FURQorCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisvLwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWVtTG9jayk7CS8vIE5vdCB1c2VkIGluIFJUMjhYWAorCisvLwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7IC8vIGluaXQgaXQgaW4gVXNlckNmZ0luaXQoKQorLy8JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7IC8vIGluaXQgaXQgaW4gQkFUYWJsZUluaXQoKQorCisvLwkJZm9yKG51bT0wOyBudW08TUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IG51bSsrKQorLy8JCXsKKy8vCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W251bV0uUnhSZVJpbmdMb2NrKTsKKy8vCQl9CisKKwkJLy8KKwkJLy8gSW5pdCBNYWMgVGFibGUKKwkJLy8KKy8vCQlNYWNUYWJsZUluaXRpYWxpemUocEFkKTsKKworCQkvLworCQkvLyBJbml0IHNlbmQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMKKwkJLy8KKwkJU3RhdHVzID0gTklDSW5pdFRyYW5zbWl0KHBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCS8vCisJCS8vIEluaXQgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycworCQkvLworCQlTdGF0dXMgPSBOSUNJbml0UmVjdihwQWQpOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlwQWQtPlBlbmRpbmdJb0NvdW50ID0gMTsKKworCX0gd2hpbGUgKEZBTFNFKTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkZyYWdGcmFtZSwgc2l6ZW9mKEZSQUdNRU5UX0ZSQU1FKSk7CisJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSAgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCisJaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID09IE5VTEwpCisJeworCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJfQorCisJREJHUFJJTlRfUyhTdGF0dXMsICgiPC0tIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5LCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKwlDYWxscyBVU0JfSW50ZXJmYWNlU3RvcCBhbmQgZnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIFVSQnMKKyAgICBjYWxscyBOZGlzTURlcmVnaXN0ZXJEZXZpY2UgYW5kIGZyZWVzIHRoZSBtZW1vcnkKKyAgICBhbGxvY2F0ZWQgaW4gVk5ldEluaXRpYWxpemUgZm9yIHRoZSBBZGFwdGVyIE9iamVjdAorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisjZGVmaW5lIExNX1VSQl9GUkVFKHBPYmosIENvbnRleHQsIEJ1ZmZlclNpemUpCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5wVXJiKSB7CQkJCQkJCVwKKwkJUlRVU0JfVU5MSU5LX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCVwKKwkJUlRVU0JfRlJFRV9VUkIoQ29udGV4dC0+cFVyYik7CQkJCQkJXAorCQlDb250ZXh0LT5wVXJiID0gTlVMTDsgfQkJCQkJCQkJXAorCWlmIChOVUxMICE9IENvbnRleHQtPlRyYW5zZmVyQnVmZmVyKSB7CQkJCQlcCisJCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgQnVmZmVyU2l6ZSwJXAorCQkJCQkJCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwJXAorCQkJCQkJCQlDb250ZXh0LT5kYXRhX2RtYSk7CQkJXAorCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7IH0KKworCisJVUlOVCAgICAgICAgICAgICAgICBpLCBhY2lkeDsKKwlQVFhfQ09OVEVYVAkJCXBOdWxsQ29udGV4dCAgID0gJnBBZC0+TnVsbENvbnRleHQ7CisJUFRYX0NPTlRFWFQJCQlwUHNQb2xsQ29udGV4dCA9ICZwQWQtPlBzUG9sbENvbnRleHQ7CisJUFRYX0NPTlRFWFQJCQlwUlRTQ29udGV4dCAgICA9ICZwQWQtPlJUU0NvbnRleHQ7CisvLwlQSFRfVFhfQ09OVEVYVCAJCXBIVFRYQ29udGV4dDsKKwkvL1BSVE1QX1JFT1JERVJCVUYJcFJlb3JkZXJCdWY7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisvLwlSVE1QX1RYX1JJTkcJCSpwVHhSaW5nOworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0tPiBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7CisJcE9iaiA9IHBPYmo7CisKKwkvLyBGcmVlIGFsbCByZXNvdXJjZXMgZm9yIHRoZSBSRUNFSVZFIGJ1ZmZlciBxdWV1ZS4KKwlmb3IoaT0wOyBpPChSWF9SSU5HX1NJWkUpOyBpKyspCisJeworCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCQlpZiAocFJ4Q29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBSeENvbnRleHQsIE1BWF9SWEJVTEtfU0laRSk7CisJfQorCisJLy8gRnJlZSBQc1BvbGwgZnJhbWUgcmVzb3VyY2UKKwlMTV9VUkJfRlJFRShwT2JqLCBwUHNQb2xsQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCisJLy8gRnJlZSBOVUxMIGZyYW1lIHJlc291cmNlCisJTE1fVVJCX0ZSRUUocE9iaiwgcE51bGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisKKwkvLyBGcmVlIFJUUyBmcmFtZSByZXNvdXJjZQorCUxNX1VSQl9GUkVFKHBPYmosIHBSVFNDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisKKworCS8vIEZyZWUgYmVhY29uIGZyYW1lIHJlc291cmNlCisJZm9yKGk9MDsgaTxCRUFDT05fUklOR19TSVpFOyBpKyspCisJeworCQlQVFhfQ09OVEVYVAlwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKKwkJaWYgKHBCZWFjb25Db250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcEJlYWNvbkNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKwl9CisKKworCS8vIEZyZWUgbWdtdCBmcmFtZSByZXNvdXJjZQorCWZvcihpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspCisJeworCQlQVFhfQ09OVEVYVCBwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCS8vTE1fVVJCX0ZSRUUocE9iaiwgcE1MTUVDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisJCWlmIChOVUxMICE9IHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCkKKwkJeworCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0KTsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKKwkJfQorCisJCWlmIChwTUxNRUNvbnRleHQpCisJCXsKKwkJCWlmIChOVUxMICE9IHBNTE1FQ29udGV4dC0+cFVyYikKKwkJCXsKKwkJCQlSVFVTQl9VTkxJTktfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7CisJCQkJUlRVU0JfRlJFRV9VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKKwkJCQlwTUxNRUNvbnRleHQtPnBVcmIgPSBOVUxMOworCQkJfQorCQl9CisJfQorCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQorCQlOZGlzRnJlZU1lbW9yeShwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsIDApOworCisKKwkvLyBGcmVlIFR4IGZyYW1lIHJlc291cmNlCisJZm9yIChhY2lkeCA9IDA7IGFjaWR4IDwgNDsgYWNpZHgrKykKKwkJeworCQlQSFRfVFhfQ09OVEVYVCBwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W2FjaWR4XSk7CisJCQlpZiAocEhUVFhDb250ZXh0KQorCQkJCUxNX1VSQl9GUkVFKHBPYmosIHBIVFRYQ29udGV4dCwgc2l6ZW9mKEhUVFhfQlVGRkVSKSk7CisJCX0KKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCWZvcihpPTA7IGk8NjsgaSsrKQorCXsKKwkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1tpXSk7CisJfQorCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CdWxrSW5Mb2NrKTsKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKyNpZmRlZiBSQUxJTktfQVRFCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCS8vIENsZWFyIGFsbCBwZW5kaW5nIGJ1bGstb3V0IHJlcXVlc3QgZmxhZ3MuCisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgMHhmZmZmZmZmZik7CisKKy8vCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKy8vCWZvcihpPTA7IGk8TUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKy8vCXsKKy8vCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spOworLy8JfQorCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPC0tLSBSZWxlYXNlQWRhcHRlclxuIikpOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyIGNvbnRyb2wgYmxvY2suCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeSgKKwlJTiBQVk9JRAloYW5kbGUsCisJT1VUCVBWT0lECSpwcEFkKQoreworCVBVU0JfREVWCXVzYl9kZXY7CisJUE9TX0NPT0tJRQlwT2JqID0gKFBPU19DT09LSUUpIGhhbmRsZTsKKworCisJdXNiX2RldiA9IHBPYmotPnBVc2JfRGV2OworCisJcE9iai0+TUxNRVRocl9waWQJCT0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCXBPYmotPlJUVVNCQ21kVGhyX3BpZAk9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKworCSpwcEFkID0gKFBWT0lEKXZtYWxsb2Moc2l6ZW9mKFJUTVBfQURBUFRFUikpOworCisJaWYgKCpwcEFkKQorCXsKKwkJTmRpc1plcm9NZW1vcnkoKnBwQWQsIHNpemVvZihSVE1QX0FEQVBURVIpKTsKKwkJKChQUlRNUF9BREFQVEVSKSpwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENyZWF0ZSBrZXJuZWwgdGhyZWFkcyAmIHRhc2tsZXRzLgorCitBcmd1bWVudHM6CisgICAgKm5ldF9kZXYJCQlQb2ludGVyIHRvIHdpcmVsZXNzIG5ldCBkZXZpY2UgaW50ZXJmYWNlCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfRkFJTFVSRQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJIENyZWF0ZVRocmVhZHMoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlwaWRfdCBwaWRfbnVtYmVyID0gLTE7CisKKwkvL2luaXRfTVVURVgoJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKKworCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5tbG1lX3NlbWFwaG9yZSkpOworCWluaXRfY29tcGxldGlvbiAoJnBBZC0+bWxtZUNvbXBsZXRlKTsKKworCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKKwlpbml0X2NvbXBsZXRpb24gKCZwQWQtPkNtZFFDb21wbGV0ZSk7CisKKwlpbml0X01VVEVYX0xPQ0tFRCgmKHBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpKTsKKwlpbml0X2NvbXBsZXRpb24gKCZwQWQtPlRpbWVyUUNvbXBsZXRlKTsKKworCS8vIENyZWF0IE1MTUUgVGhyZWFkCisJcE9iai0+TUxNRVRocl9waWQ9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChNbG1lVGhyZWFkLCBwQWQsIENMT05FX1ZNKTsKKwlpZiAocGlkX251bWJlciA8IDApCisJeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdGFydCBNbG1lIHRocmVhZFxuIixwQWQtPm5ldF9kZXYtPm5hbWUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJcE9iai0+TUxNRVRocl9waWQgPSBHRVRfUElEKHBpZF9udW1iZXIpOworCS8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gc3RhcnQKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCYocEFkLT5tbG1lQ29tcGxldGUpKTsKKworCS8vIENyZWF0IENvbW1hbmQgVGhyZWFkCisJcE9iai0+UlRVU0JDbWRUaHJfcGlkPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJcGlkX251bWJlciA9IGtlcm5lbF90aHJlYWQoUlRVU0JDbWRUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOworCWlmIChwaWRfbnVtYmVyIDwgMCkKKwl7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IFJUVVNCQ21kIHRocmVhZFxuIixwQWQtPm5ldF9kZXYtPm5hbWUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gR0VUX1BJRChwaWRfbnVtYmVyKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCYocEFkLT5DbWRRQ29tcGxldGUpKTsKKworCXBPYmotPlRpbWVyUVRocl9waWQ9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChUaW1lclFUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOworCWlmIChwaWRfbnVtYmVyIDwgMCkKKwl7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IFRpbWVyUVRocmVhZFxuIixwQWQtPm5ldF9kZXYtPm5hbWUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJcE9iai0+VGltZXJRVGhyX3BpZCA9IEdFVF9QSUQocGlkX251bWJlcik7CisJLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydAorCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPlRpbWVyUUNvbXBsZXRlKSk7CisKKwkvLyBDcmVhdGUgcmVjZWl2ZSB0YXNrbGV0CisJdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKFVMT05HKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9tZ210X2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjMF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9hYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMyX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjM19kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLCBydDI4NzBfaGNjYV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssIHJ0Mjg3MF9udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX3J0c19mcmFtZV9jb21wbGV0ZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssIHJ0Mjg3MF9wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgCUFzIFNUQSdzIEJTU0lEIGlzIGEgV0MgdG9vLCBpdCB1c2VzIHNoYXJlZCBrZXkgdGFibGUuCisgCVRoaXMgZnVuY3Rpb24gd3JpdGUgY29ycmVjdCB1bmljYXN0IFRYIGtleSB0byBBU0lDIFdDSUQuCisgCUFuZCB3ZSBzdGlsbCBtYWtlIGEgY29weSBpbiBvdXIgTWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuCisJQ2FsbGVyIGd1YXJhbnRlZSBUS0lQL0FFUyBhbHdheXMgaGFzIGtleWlkeCA9IDAuIChwYWlyd2lzZSBrZXkpCisJQ2FsbGVyIGd1YXJhbnRlZSBXRVAgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIHNldCBUeGtleSwgIGRlZmF1bHQga2V5IGluZGV4PTB+My4KKworQXJndW1lbnRzOgorCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwlwS2V5CQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVUNDRVNTCQkJQWRkIGtleSBzdWNjZXNzZnVsbHkKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEFkZEJTU0lEQ2lwaGVyKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglVQ0hBUgkJCQlBaWQsCisJSU4JUE5ESVNfODAyXzExX0tFWQlwS2V5LAorCUlOICBVQ0hBUiAgIAkJCUNpcGhlckFsZykKK3sKKwlQVUNIQVIJCXBUeE1pYywgcFJ4TWljOworCUJPT0xFQU4gCWJLZXlSU0MsIGJBdXRoZW50aWNhdG9yOyAvLyBpbmRpY2F0ZSB0aGUgcmVjZWl2ZSBTQyBzZXQgYnkgS2V5UlNDIHZhbHVlCisvLwlVQ0hBUgkJQ2lwaGVyQWxnOworCVVDSEFSCQlpOworCVVMT05HCQlXQ0lEQXR0cmk7CisJVVNIT1JUCSAJb2Zmc2V0OworCVVDSEFSCQlLZXlJZHgsIElWRUlWWzhdOworCVVJTlQzMgkJVmFsdWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkQlNTSURDaXBoZXI9PT4gQWlkID0gJWRcbiIsQWlkKSk7CisKKwkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKKwliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCisJLy8gQml0IDI4IG9mIEFkZC1rZXkgQXV0aGVudGljYXRvcgorCWJBdXRoZW50aWNhdG9yID0gKHBLZXktPktleUluZGV4ICYgMHgxMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJS2V5SWR4ID0gKFVDSEFSKXBLZXktPktleUluZGV4JjB4ZmY7CisKKwlpZiAoS2V5SWR4ID4gNCkKKwkJcmV0dXJuOworCisKKwlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwl7CWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQl7CisJCQkvLyBmb3IgV1BBLU5vbmUgVHgsIFJ4IE1JQyBpcyB0aGUgc2FtZQorCQkJcFR4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAxNjsKKwkJCXBSeE1pYyA9IHBUeE1pYzsKKwkJfQorCQllbHNlIGlmIChiQXV0aGVudGljYXRvciA9PSBUUlVFKQorCQl7CisJCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQkJcFJ4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAyNDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBSeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7CisJCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCQl9CisKKwkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoQWlkICogSFdfS0VZX0VOVFJZX1NJWkUpICsgMHgxMDsKKwkJZm9yIChpPTA7IGk8ODsgKQorCQl7CisJCQlWYWx1ZSA9ICoocFR4TWljK2kpOworCQkJVmFsdWUgKz0gKCoocFR4TWljK2krMSk8PDgpOworCQkJVmFsdWUgKz0gKCoocFR4TWljK2krMik8PDE2KTsKKwkJCVZhbHVlICs9ICgqKHBUeE1pYytpKzMpPDwyNCk7CisJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQraSwgVmFsdWUpOworCQkJaSs9NDsKKwkJfQorCisJCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0tFWV9FTlRSWV9TSVpFKSArIDB4MTg7CisJCWZvciAoaT0wOyBpPDg7ICkKKwkJeworCQkJVmFsdWUgPSAqKHBSeE1pYytpKTsKKwkJCVZhbHVlICs9ICgqKHBSeE1pYytpKzEpPDw4KTsKKwkJCVZhbHVlICs9ICgqKHBSeE1pYytpKzIpPDwxNik7CisJCQlWYWx1ZSArPSAoKihwUnhNaWMraSszKTw8MjQpOworCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0K2ksIFZhbHVlKTsKKwkJCWkrPTQ7CisJCX0KKworCQkvLyBPbmx5IEtleSBsZW50aCBlcXVhbCB0byBUS0lQIGtleSBoYXZlIHRoZXNlCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5SeE1pYywgcFJ4TWljLCA4KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4TWljLCBwVHhNaWMsIDgpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiCVR4TUlDICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsCisJCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLAorCQkJCXBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkoIglSeE1JQyAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAorCQkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSwKKwkJCQlwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisKKwkvLyAyLiBSZWNvcmQgU2VjdXJpdHkgS2V5LgorCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCS8vIDMuIENoZWNrIFJ4VHNjLiBBbmQgdXNlZCB0byBpbml0IHRvIEFTSUMgSVYuCisJaWYgKGJLZXlSU0MgPT0gVFJVRSkKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlJ4VHNjLCAmcEtleS0+S2V5UlNDLCA2KTsKKwllbHNlCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5SeFRzYywgNik7CisKKwkvLyA0LiBJbml0IFR4VHNjIHRvIG9uZSBiYXNlZCBvbiBXaUZpIFdQQSBzcGVjcworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1swXSA9IDE7CisJcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzFdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbMl0gPSAwOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1szXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzRdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbNV0gPSAwOworCisJQ2lwaGVyQWxnID0gcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZzsKKworCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKKwlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKSBvZmZzZXQsIHBLZXktPktleU1hdGVyaWFsLAorCQkJCSgocEtleS0+S2V5TGVuZ3RoID09IExFTl9US0lQX0tFWSkgPyAxNiA6IChVU0hPUlQpcEtleS0+S2V5TGVuZ3RoKSk7CisKKwlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoS2V5SWR4ICogSFdfS0VZX0VOVFJZX1NJWkUpOworCVJUVVNCTXVsdGlXcml0ZShwQWQsIChVU0hPUlQpIG9mZnNldCwgcEtleS0+S2V5TWF0ZXJpYWwsIChVU0hPUlQpcEtleS0+S2V5TGVuZ3RoKTsKKworCW9mZnNldCA9IFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKyAoQWlkICogSFdfSVZFSVZfRU5UUllfU0laRSk7CisJTmRpc1plcm9NZW1vcnkoSVZFSVYsIDgpOworCisJLy8gSVYvRUlWCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8CisJCShDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fAorCQkoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCXsKKwkJSVZFSVZbM10gPSAweDIwOyAvLyBFaXYgYml0IG9uLiBrZXlpZCBhbHdheXMgMCBmb3IgcGFpcndpc2Uga2V5CisJfQorCS8vIGRlZmF1bHQga2V5IGlkeCBuZWVkcyB0byBzZXQuCisJLy8gaW4gVEtJUC9BRVMgS2V5SWR4ID0gMCAsIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuCisJZWxzZQorCXsKKwkJSVZFSVZbM10gfD0gKEtleUlkeDw8IDYpOworCX0KKwlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKSBvZmZzZXQsIElWRUlWLCA4KTsKKworCS8vIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOjE9UEFJUldJU0UgS0VZLCBCU1NJZHggaXMgMAorCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fAorCQkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKKwkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKKwl7CisJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOworCX0KKwllbHNlCisJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOworCisJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoQWlkKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKwlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgJlZhbHVlKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJTU0lEX1dDSUQgOiBvZmZzZXQgPSAleCwgV0NJREF0dHJpID0gJWx4XG4iLAorCQkJb2Zmc2V0LCBXQ0lEQXR0cmkpKTsKKworCS8vIHBBZGRyCisJLy8gQWRkIEJzc2lkIG1hYyBhZGRyZXNzIGF0IGxpbmt1cC4gbm90IGhlcmUuICBjaGVjayEKKwkvKm9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoQlNTSURfV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRSk7CisJKmZvciAoaT0wOyBpPE1BQ19BRERSX0xFTjsgaSsrKQorCXsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQraSwgcEtleS0+QlNTSURbaV0pOworCX0KKwkqLworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQWRkQlNTSURhc1dDSURFbnRyeTogQWxnPSVzLCBLZXlMZW5ndGggPSAlZFxuIiwKKwkJCUNpcGhlck5hbWVbQ2lwaGVyQWxnXSwgcEtleS0+S2V5TGVuZ3RoKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiS2V5IFtpZHg9JXhdIFtLZXlMZW4gPSAlZF1cbiIsCisJCQlwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisJZm9yKGk9MDsgaTxwS2V5LT5LZXlMZW5ndGg7IGkrKykKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiICV4OiIsIHBLZXktPktleU1hdGVyaWFsW2ldKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJIFxuIikpOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEdldCBhIHJlY2VpdmVkIHBhY2tldC4KKworQXJndW1lbnRzOgorCXBBZAkJCQkJZGV2aWNlIGNvbnRyb2wgYmxvY2sKKwlwU2F2ZVJ4RAkJCXJlY2VpdmUgZGVzY3JpcHRvciBpbmZvcm1hdGlvbgorCSpwYlJlc2NoZWR1bGUJCW5lZWQgcmVzY2hlZHVsZSBmbGFnCisJKnBSeFBlbmRpbmcJCQlwZW5kaW5nIHJlY2VpdmVkIHBhY2tldCBmbGFnCisKK1JldHVybiBWYWx1ZToKKyAgICB0aGUgcmVjaWV2ZWQgcGFja2V0CisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjZGVmaW5lIFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFCQkJNAorUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAorCU9VVAkJQk9PTEVBTgkJCQkqcGJSZXNjaGVkdWxlLAorCUlOIE9VVAlVSU5UMzIJCQkJKnBSeFBlbmRpbmcpCit7CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJUE5ESVNfUEFDS0VUCXBTa2I7CisJUFVDSEFSCQkJcERhdGE7CisJVUxPTkcJCQlUaGlzRnJhbWVMZW47CisJVUxPTkcJCQlSeEJ1ZmZlckxlbmd0aDsKKwlQUlhXSV9TVFJVQwkJcFJ4V0k7CisKKwlwUnhDb250ZXh0ID0gJnBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4XTsKKwlpZiAoKHBSeENvbnRleHQtPlJlYWRhYmxlID09IEZBTFNFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCisJCXJldHVybiBOVUxMOworCisJUnhCdWZmZXJMZW5ndGggPSBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgLSBwQWQtPlJlYWRQb3NpdGlvbjsKKwlpZiAoUnhCdWZmZXJMZW5ndGggPCAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2YoUlhXSV9TVFJVQykgKyBzaXplb2YoUlhJTkZPX1NUUlVDKSkpCisJeworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCisJcERhdGEgPSAmcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXJbcEFkLT5SZWFkUG9zaXRpb25dOyAvKiA0S0IgKi8KKwkvLyBUaGUgUlhETUEgZmllbGQgaXMgNCBieXRlcywgbm93IGp1c3QgdXNlIHRoZSBmaXJzdCAyIGJ5dGVzLiBUaGUgTGVuZ3RoIGluY2x1ZGluZyB0aGUgKFJYV0kgKyBNU0RVICsgUGFkZGluZykKKwlUaGlzRnJhbWVMZW4gPSAqcERhdGEgKyAoKihwRGF0YSsxKTw8OCk7CisgICAgaWYgKFRoaXNGcmFtZUxlbiA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQklSSWR4KCVkKTogUlhETUFMZW4gaXMgemVyby5bJWxkXSwgQnVsa0luQnVmTGVuID0gJWxkKVxuIiwKKwkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisJaWYgKChUaGlzRnJhbWVMZW4mMHgzKSAhPSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQklSSWR4KCVkKTogUlhETUFMZW4gbm90IG11bHRpcGxlIG9mIDQuWyVsZF0sIEJ1bGtJbkJ1ZkxlbiA9ICVsZClcbiIsCisJCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBUaGlzRnJhbWVMZW4sIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCkpOworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCisJaWYgKChUaGlzRnJhbWVMZW4gKyA4KT4gUnhCdWZmZXJMZW5ndGgpCS8vIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihSWElORk9fU1RSVUMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCSVJJZHgoJWQpOkZyYW1lTGVuKDB4JWx4KSBvdXRyYW5nZXMuIEJ1bGtJbkxlbj0weCVseCwgcmVtYWluaW5nIFJ4QnVmTGVuPTB4JWx4LCBSZWFkUG9zPTB4JWx4XG4iLAorCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0LCBSeEJ1ZmZlckxlbmd0aCwgcEFkLT5SZWFkUG9zaXRpb24pKTsKKworCQkvLyBlcnJvciBmcmFtZS4gZmluaXNoIHRoaXMgbG9vcAorCQlnb3RvIGxhYmVsX251bGw7CisJfQorCisJLy8gc2tpcCBVU0IgZnJhbWUgbGVuZ3RoIGZpZWxkCisJcERhdGEgKz0gUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkU7CisJcFJ4V0kgPSAoUFJYV0lfU1RSVUMpcERhdGE7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZShwRGF0YSwgVFlQRV9SWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBUaGlzRnJhbWVMZW4pCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOnBSeFdJTVBEVXRvdGFsQnl0ZUNvdW50KCVkKSBsYXJnZSB0aGFuIFJ4RE1BTGVuKCVsZClcbiIsCisJCQkJCQkJCQlfX0ZVTkNUSU9OX18sIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIFRoaXNGcmFtZUxlbikpOworCQlnb3RvIGxhYmVsX251bGw7CisJfQorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UocERhdGEsIFRZUEVfUlhXSSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJLy8gYWxsb2NhdGUgYSByeCBwYWNrZXQKKwlwU2tiID0gZGV2X2FsbG9jX3NrYihUaGlzRnJhbWVMZW4pOworCWlmIChwU2tiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIiVzKCk6Q2Fubm90IEFsbG9jYXRlIHNrIGJ1ZmZlciBmb3IgdGhpcyBCdWxrLUluIGJ1ZmZlciFcbiIsIF9fRlVOQ1RJT05fXykpOworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCisJLy8gY29weSB0aGUgcnggcGFja2V0CisJbWVtY3B5KHNrYl9wdXQocFNrYiwgVGhpc0ZyYW1lTGVuKSwgcERhdGEsIFRoaXNGcmFtZUxlbik7CisJUlRQS1RfVE9fT1NQS1QocFNrYiktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocFNrYiksIFBLVFNSQ19ORElTKTsKKworCS8vIGNvcHkgUnhECisJKnBTYXZlUnhEID0gKihQUlhJTkZPX1NUUlVDKShwRGF0YSArIFRoaXNGcmFtZUxlbik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFNhdmVSeEQsIFRZUEVfUlhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkvLyB1cGRhdGUgbmV4dCBwYWNrZXQgcmVhZCBwb3NpdGlvbi4KKwlwQWQtPlJlYWRQb3NpdGlvbiArPSAoVGhpc0ZyYW1lTGVuICsgUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBSWElORk9fU0laRSk7CS8vIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihSWElORk9fU1RSVUMpKQorCisJcmV0dXJuIHBTa2I7CisKK2xhYmVsX251bGw6CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEhhbmRsZSByZWNlaXZlZCBwYWNrZXRzLgorCitBcmd1bWVudHM6CisJZGF0YQkJCQktIFVSQiBpbmZvcm1hdGlvbiBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXB1cmJiX3QgCQkJcFVyYjsKKwlQUlhfQ09OVEVYVAkJCXBSeENvbnRleHQ7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCU5UU1RBVFVTCQkJU3RhdHVzOworCXVuc2lnbmVkIGludAkJSXJxRmxhZ3M7CisKKwlwVXJiCQk9IChwdXJiYl90KWRhdGE7CisJcFJ4Q29udGV4dAk9IChQUlhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCT0gcFJ4Q29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ICs9IHBVcmItPmFjdHVhbF9sZW5ndGg7CisJLy9OZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKwlwQWQtPlBlbmRpbmdSeC0tOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGUrKzsKKwkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisJCWlmIChwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpCS8vIEFzIGphbidzIGNvbW1lbnQsIGl0IG1heSBidWxrLWluIHN1Y2Nlc3MgYnV0IHNpemUgaXMgemVyby4KKwkJeworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBUUlVFOworCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgUlhfUklOR19TSVpFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCX0KKwllbHNlCSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsKys7CisJCS8vIFN0aWxsIHJlYWQgdGhpcyBwYWNrZXQgYWx0aG91Z2ggaXQgbWF5IGNvbXRhaW4gd3JvbmcgYnl0ZXMuCisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkJLy8gUGFyc2luZyBhbGwgcGFja2V0cy4gYmVjYXVzZSBhZnRlciByZXNldCwgdGhlIGluZGV4IHdpbGwgcmVzZXQgdG8gYWxsIHplcm8uCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwkJeworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBJbiBGYWlsZWQuIFN0YXR1cz0lZCwgQklJZHg9MHgleCwgQklSSWR4PTB4JXgsIGFjdHVhbF9sZW5ndGg9IDB4JXhcbiIsCisJCQkJCQkJU3RhdHVzLCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgcFJ4Q29udGV4dC0+cFVyYi0+YWN0dWFsX2xlbmd0aCkpOworCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisgICAgeworCQkvLyBJZiB0aGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIGFuZCBSeCBmcmFtZSBpcyBzZXQgaW50byBoZXJlLgorCQlpZiAocEFkLT5Db250aW5CdWxrSW4gPT0gVFJVRSkKKwkJeworCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCisJcmV0dXJuOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkOworCVBUWF9DT05URVhUCQlwTUxNRUNvbnRleHQ7CisJaW50CQkJCWluZGV4OworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCXB1cmJiX3QJCQlwVXJiOworCU5UU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwTUxNRUNvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTUxNRUNvbnRleHQtPnBBZDsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKwlpbmRleCAJCQk9IHBNTE1FQ29udGV4dC0+U2VsZklkeDsKKworCUFTU0VSVCgocEFkLT5NZ210UmluZy5UeERtYUlkeCA9PSBpbmRleCkpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2VuZCB0aGUgbWdtdCBwa3Q/CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQl9CisJfQorCisJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCS8vIFJlc2V0IE1MTUUgY29udGV4dCBmbGFncworCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCisJcFBhY2tldCA9IHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQ7CisJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkvLyBJbmNyZWFzZSBNZ210UmluZyBJbmRleAorCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIE1HTVRfUklOR19TSVpFKTsKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4Kys7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJLy8gTm8tbWF0dGVyIHN1Y2Nlc3Mgb3IgZmFpbCwgd2UgZnJlZSB0aGUgbWdtdCBwYWNrZXQuCisJaWYgKHBQYWNrZXQpCisJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpICYmCisJCQkoKHBBZC0+YnVsa1Jlc2V0UGlwZWlkICYgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpID09IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSkKKwkJewkvLyBGb3IgTWdtdCBCdWxrLU91dCBmYWlsZWQsIGlnbm9yZSBpdCBub3cuCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCQkJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFIC8qIHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IFRSVUUgKi8pCisJCQl7CisJCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkJCX0KKwkJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCQl9CisJCX0KKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSA0OworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIi0tLT5oY2NhX2RtYV9kb25lX3Rhc2tsZXRcbiIpKTsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPC0tLWhjY2FfZG1hX2RvbmVfdGFza2xldFxuIikpOworCisJCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAzOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8Myk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKworCQlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gMjsKKwlwdXJiYl90CQkJCXBVcmI7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQorCQl7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKKwkJCXsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDIpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisJCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAxOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8MSk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKworCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAwOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qICAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KKwkJCQkocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKKwkJCQkocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpCisJCQl7CisJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCisJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKTsKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKworCisJcmV0dXJuOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dDsKKwlwdXJiYl90CQkJcFVyYjsKKwlOVFNUQVRVUwkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJaXJxRmxhZzsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwTnVsbENvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTnVsbENvbnRleHQtPnBBZDsKKwlTdGF0dXMgCQkJPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgCT0gRkFMU0U7CisJcE51bGxDb250ZXh0LT5JblVzZSAJCT0gRkFMU0U7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTnVsbCBGcmFtZSBGYWlsZWQsIFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJfQorCX0KKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9ydHNfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0OworCXB1cmJiX3QJCQlwVXJiOworCU5UU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlpcnFGbGFnOworCisKKwlwVXJiCQk9IChwdXJiYl90KWRhdGE7CisJcFJUU0NvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQk9IHBSVFNDb250ZXh0LT5wQWQ7CisJU3RhdHVzCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFJlc2V0IFJUUyBmcmFtZSBjb250ZXh0IGZsYWdzCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwUlRTQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUlRTIEZyYW1lIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQl9CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0pOworCXBBZC0+QnVsa091dFBlbmRpbmdbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCVBUWF9DT05URVhUCQlwUHNQb2xsQ29udGV4dDsKKwlwdXJiYl90CQkJcFVyYjsKKwlOVFNUQVRVUwkJU3RhdHVzOworCisKKwlwVXJiCQkJPSAocHVyYmJfdClkYXRhOworCXBQc1BvbGxDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcFBzUG9sbENvbnRleHQtPnBBZDsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFJlc2V0IFBzUG9sbCBjb250ZXh0IGZsYWdzCisJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKKwlwUHNQb2xsQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOworCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCXB1cmJiX3QJCQkJcFVyYjsKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCisJQnVsa091dFBpcGVJZCA9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKKworCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJEb25lLUIoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJLy8JCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtCdWxrT3V0UGlwZUlkXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKKworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7CisJCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJRlJFRV9IVFRYX1JJTkcocEFkLCBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQpOworCQkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlQVUNIQVIJcEJ1ZjsKKworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7CisKKwkJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOworCisJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKKwkJCXBBZC0+YnVsa1Jlc2V0UmVxW0J1bGtPdXRQaXBlSWRdID0gcEFkLT5CdWxrT3V0UmVxOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBmYWlsZWQ6IFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0Pj5CdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLCBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJcdD4+QnVsa091dCBIZWFkZXI6JXggJXggJXggJXggJXggJXggJXggJXhcbiIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sIHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0sIHBCdWZbN10pKTsKKwkJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0Q29tcGxldGVDYW5jZWw9MHgleCwgQnVsa091dENvbXBsZXRlT3RoZXI9MHgleFxuIiwgcEFkLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKKworCX0KKworCS8vCisJLy8gYkluVXNlID0gVFJVRSwgbWVhbnMgc29tZSBwcm9jZXNzIGFyZSBmaWxsaW5nIFRYIGRhdGEsIGFmdGVyIHRoYXQgbXVzdCB0dXJuIG9uIGJXYWl0aW5nQnVsa091dAorCS8vIGJXYWl0aW5nQnVsa091dCA9IFRSVUUsIG1lYW5zIHRoZSBUWCBkYXRhIGFyZSB3YWl0aW5nIGZvciBidWxrIG91dC4KKwkvLworCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJgorCQkocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKzgpKSAmJgorCQkhUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSkpCisJeworCQkvLyBJbmRpY2F0ZSBUaGVyZSBpcyBkYXRhIGF2YWxpYWJsZQorCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Cit9CisKKy8qIEVuZCBvZiAyODcwX3J0bXBfaW5pdC5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDhhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uYwpAQCAtMCwwICsxLDEwNDYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJYWN0aW9uLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBhc3NvY2lhdGlvbiByZWxhdGVkIHJlcXVlc3RzIGVpdGhlciBmcm9tIFdTVEEgb3IgZnJvbSBsb2NhbCBNTE1FCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbiBMZWUJCTIwMDYJICAJY3JlYXRlZCBmb3IgcnQyODYwCisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgImFjdGlvbi5oIgorCisKK3N0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFMgLSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisgICAgTm90ZToKKyAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU09DX0lETEUKKyAgICAgICAgTVQyX01MTUVfRElTQVNTT0NfUkVRICAgIG1sbWVfZGlzYXNzb2NfcmVxX2FjdGlvbgorICAgICAgICBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgcGVlcl9kaXNhc3NvY19hY3Rpb24KKyAgICAgICAgTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgIGRyb3AKKyAgICAgICAgTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgIGRyb3AKKyAgICAgICAgTVQyX0NMUzNFUlIgICAgICAgICAgICAgIGNsczNlcnJfYWN0aW9uCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsIChTVEFURV9NQUNISU5FX0ZVTkMgKilUcmFucywgTUFYX0FDVF9TVEFURSwgTUFYX0FDVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQUNUX0lETEUsIEFDVF9NQUNISU5FX0JBU0UpOworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJTcGVjdHJ1bUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9RT1NfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUU9TQWN0aW9uKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVzZXJ2ZWRBY3Rpb24pOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJETFNBY3Rpb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9CQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9IVF9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJIVEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQUREQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURFTEJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1BVQkxJQ19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJQdWJsaWNBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUk1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUk1BY3Rpb24pOworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9RT1NfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lUU9TQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVETFNBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX0FDVF9JTlZBTElELCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVJbnZhbGlkQWN0aW9uKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBNbG1lQUREQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJTUxNRV9BRERCQV9SRVFfU1RSVUNUICpwSW5mbzsKKwlVQ0hBUiAgICAgICAgICAgQWRkcls2XTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORwkJSWR4OworCUZSQU1FX0FEREJBX1JFUSAgRnJhbWU7CisJVUxPTkcJCUZyYW1lTGVuOworCUJBX09SSV9FTlRSWQkJCSpwQkFFbnRyeSA9IE5VTEw7CisKKwlwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUkVRKSk7CisKKwlpZihNbG1lQWRkQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcikpCisJeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisJCS8vIDEuIGZpbmQgZW50cnkKKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07CisJCWlmIChJZHggPT0gMCkKKwkJeworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBjYW4ndCBmaW5kIEJBT3JpRW50cnkgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVmFsaWRBc0RscykKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwSW5mby0+cEFkZHIpOworCisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOworCQlGcmFtZS5BY3Rpb24gPSBBRERCQV9SRVE7CisJCUZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CisJCUZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOworCQlGcmFtZS5CYVBhcm0uVElEID0gcEluZm8tPlRJRDsKKwkJRnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSBwSW5mby0+QmFCdWZTaXplOworCQlGcmFtZS5Ub2tlbiA9IHBJbmZvLT5Ub2tlbjsKKwkJRnJhbWUuVGltZU91dFZhbHVlID0gcEluZm8tPlRpbWVPdXRWYWx1ZTsKKwkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5GcmFnTnVtID0gMDsKKwkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOworCisJCSooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkpOworCQlGcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihGcmFtZS5UaW1lT3V0VmFsdWUpOworCQlGcmFtZS5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihGcmFtZS5CYVN0YXJ0U2VxLndvcmQpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSksICZGcmFtZSwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBTZW5kIEFEREJBIHJlcXVlc3QuIFN0YXJ0U2VxID0gJXgsICBGcmFtZUxlbiA9ICVsZC4gQnVmU2l6ZSA9ICVkXG4iLCBGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxLCBGcmFtZUxlbiwgRnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgc2VuZCBERUxCQSBhbmQgZGVsZXRlIEJhRW50cnkgaWYgYW55CisgICAgUGFyYW1ldHJzOgorICAgICAgICBFbGVtIC0gTUxNRSBtZXNzYWdlIE1MTUVfREVMQkFfUkVRX1NUUlVDVAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVERUxCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICpwSW5mbzsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlQVUNIQVIJCSAgIHBPdXRCdWZmZXIyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORwkJSWR4OworCUZSQU1FX0RFTEJBX1JFUSAgRnJhbWU7CisJVUxPTkcJCUZyYW1lTGVuOworCUZSQU1FX0JBUglGcmFtZUJhcjsKKworCXBJbmZvID0gKE1MTUVfREVMQkFfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKKwkvLyBtdXN0IHNlbmQgYmFjayBERUxCQQorCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lREVMQkFBY3Rpb24oKSwgSW5pdGlhdG9yKCVkKSBcbiIsIHBJbmZvLT5Jbml0aWF0b3IpKTsKKworCWlmKE1sbWVEZWxCQVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMS4gXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDIuIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gU0VORCBCQVIgKFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlci4pCisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVHhTZXFbcEluZm8tPlRJRF07IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBJbmZvLT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLkFDS1BvbGljeSA9IElNTUVEX0JBOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuTVRJRCA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLAkJCQkmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcjIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgLiBTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIgXG4iKSk7CisKKwkJLy8gU0VORCBERUxCQSBGUkFNRQorCQlGcmFtZUxlbiA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChBREhPQ19PTihwQWQpKQorCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVmFsaWRBc0RscykKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCAgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CisJCUZyYW1lLkFjdGlvbiA9IERFTEJBOworCQlGcmFtZS5EZWxiYVBhcm0uSW5pdGlhdG9yID0gcEluZm8tPkluaXRpYXRvcjsKKwkJRnJhbWUuRGVsYmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7CisJCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsgLy8gVGltZSBPdXQKKwkJKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSk7CisJCUZyYW1lLlJlYXNvbkNvZGUgPSBjcHUybGUxNihGcmFtZS5SZWFzb25Db2RlKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfREVMQkFfUkVRKSwgICAgJkZyYW1lLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwgcEluZm8tPkluaXRpYXRvcikpOworICAgIAl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgTWxtZVFPU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKK1ZPSUQgTWxtZURMU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKK1ZPSUQgTWxtZUludmFsaWRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCS8vUFVDSEFSCQkgICBwT3V0QnVmZmVyID0gTlVMTDsKKwkvL1JldHVybiB0aGUgcmVjZWl2aW5nIGZyYW1lIGV4Y2VwdCB0aGUgTVNCIG9mIGNhdGVnb3J5IGZpbGVkIHNldCB0byAxLiAgNy4zLjEuMTEKK30KKworVk9JRCBQZWVyUU9TQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBQZWVyRExTQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFDVElPTl9ETFNfUkVRVUVTVDoKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlQZWVyRGxzUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKworCQljYXNlIEFDVElPTl9ETFNfUkVTUE9OU0U6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJUGVlckRsc1JzcEFjdGlvbihwQWQsIEVsZW0pOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1RJT05fRExTX1RFQVJET1dOOgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVBlZXJEbHNUZWFyRG93bkFjdGlvbihwQWQsIEVsZW0pOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJfQorfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFBlZXJCQUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBBRERCQV9SRVE6CisJCQlQZWVyQWRkQkFSZXFBY3Rpb24ocEFkLEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQUREQkFfUkVTUDoKKwkJCVBlZXJBZGRCQVJzcEFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBERUxCQToKKwkJCVBlZXJEZWxCQUFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwl9Cit9CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBTdGFQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpCit7CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdDsKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7CisKKwlCc3NDb2V4aXN0LndvcmQgPSBCc3MyMDQwQ29leGlzdDsKKwkvLyBBUCBhc2tzIFN0YXRpb24gdG8gcmV0dXJuIGEgMjAvNDAgQlNTIENvZXhpc3RlbmNlIG1nbXQgZnJhbWUuICBTbyB3ZSBmaXJzdCBzdGFydHMgYSBzY2FuLCB0aGVuIHNlbmQgYmFjayAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZQorCWlmICgoQnNzQ29leGlzdC5maWVsZC5JbmZvUmVxID09IDEpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpKQorCXsKKwkJLy8gQ2xlYXIgcmVjb3JkIGZpcnN0LiAgQWZ0ZXIgc2NhbiAsIHdpbGwgdXBkYXRlIHRob3NlIGJpdCBhbmQgc2VuZCBiYWNrIHRvIHRyYW5zbWl0ZXIuCisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkluZm9SZXEgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbnRvbGVyYW50NDAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxID0gMDsKKwkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fMjA0MF9CU1NfQ09FWElTVCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJfQorfQorCisKKy8qCitEZXNjcmlwdGlvbiA6IEJ1aWxkIEludG9sZXJhbnQgQ2hhbm5lbCBSZXJwb3QgZnJvbSBUcmlnZ2VyIGV2ZW50IHRhYmxlLgorcmV0dXJuIDogaG93IG1hbnkgYnl0ZXMgY29waWVkLgorKi8KK1VMT05HIEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgUFVDSEFSICBwRGVzdCkKK3sKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCVJlYWRPZmZzZXQgPSAwOworCVVDSEFSCQkJaTsKKwlVQ0hBUgkJCUxhc3RSZWdDbGFzcyA9IDB4ZmY7CisJUFVDSEFSCQkJcExlbjsKKworCWZvciAoIGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPT0gVFJVRSkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uUmVnQ2xhc3MgPT0gTGFzdFJlZ0NsYXNzKQorCQkJeworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7CisJCQkJKnBMZW4rKzsKKwkJCQlSZWFkT2Zmc2V0Kys7CisJCQkJRnJhbWVMZW4rKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCkgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVDsgIC8vIElFCisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAxKSA9IDI7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCisJCQkJcExlbiA9IHBEZXN0ICsgUmVhZE9mZnNldCArIDE7CisJCQkJTGFzdFJlZ0NsYXNzID0gcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzczsKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDIpID0gTGFzdFJlZ0NsYXNzOwkvLyBMZW4gPSBSZWdDbGFzcyBieXRlICsgY2hhbm5lbCBieXRlLgorCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMykgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DaGFubmVsOworCQkJCUZyYW1lTGVuICs9IDQ7CisJCQkJUmVhZE9mZnNldCArPSA0OworCQkJfQorCisJCX0KKwl9CisJcmV0dXJuIEZyYW1lTGVuOworfQorCisKKy8qCitEZXNjcmlwdGlvbiA6IFNlbmQgMjAvNDAgQlNTIENvZXhpc3RlbmNlIEFjdGlvbiBmcmFtZSBJZiBvbmUgdHJpZ2dlciBldmVudCBpcyB0cmlnZ2VyZWQuCisqLworVk9JRCBTZW5kMjA0MENvZXhpc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAJTlN0YXR1czsKKwlGUkFNRV9BQ1RJT05fSERSCUZyYW1lOworCVVMT05HCQkJRnJhbWVMZW47CisJVUxPTkcJCQlJbnRvbGVyYW50Q2hhUmVwTGVuOworCisJSW50b2xlcmFudENoYVJlcExlbiA9IDA7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmQyMDQwQ29leGlzdEFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfUFVCTElDOworCUZyYW1lLkFjdGlvbiA9IEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKworCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQ7CisJRnJhbWVMZW4rKzsKKworCWlmIChiQWRkSW50b2xlcmFudENoYSA9PSBUUlVFKQorCQlJbnRvbGVyYW50Q2hhUmVwTGVuID0gQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcChwQWQsIHBPdXRCdWZmZXIgKyBGcmFtZUxlbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4gKyBJbnRvbGVyYW50Q2hhUmVwTGVuKTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmQyMDQwQ29leGlzdEFjdGlvbiggQlNTQ29leGlzdDIwNDAgPSAweCV4ICkgIFxuIiwgcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCkpOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCUFmdGVyIHNjYW4sIFVwZGF0ZSAyMC80MCBCU1MgQ29leGlzdGVuY2UgSUUgYW5kIHNlbmQgb3V0LgorCUFjY29yZGluZyB0byA4MDIuMTFuIEQzLjAzIDExLjE0LjEwCisKKwlQYXJhbWV0ZXJzOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKQoreworCUJTU18yMDQwX0NPRVhJU1RfSUUJT2xkVmFsdWU7CisKKwlPbGRWYWx1ZS53b3JkID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyA+IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID4gMCkpCisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEgPSAxOworCisJLy8gTmVlZCB0byBjaGVjayAhISEhCisJLy8gSG93IFNUQSB3aWxsIHNldCBJbnRvbGVyYW50NDAgaWYgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBOb3cgd2UgZG9uJ3Qgc2V0IHRoaXMgYml0IGZpcnN0LiEhISEhCisJLy8gU28gT25seSBjaGVjayBCU1MyMFdpZHRoUmVxIGNoYW5nZS4KKwlpZiAoT2xkVmFsdWUuZmllbGQuQlNTMjBXaWR0aFJlcSAhPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxKQorCXsKKwkJU2VuZDIwNDBDb2V4aXN0QWN0aW9uKHBBZCwgV2NpZCwgYkFkZEludG9sZXJhbnRDaGEpOworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitCT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQoreworCVVDSEFSCQlpOworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgoTmV3Q2hhbm5lbCA+IDcpICYmIChTZWNvbmRhcnkgPT0gMSkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgoTmV3Q2hhbm5lbCA8IDUpICYmIChTZWNvbmRhcnkgPT0gMykpCisJCXJldHVybiBGQUxTRTsKKworCS8vIDAuIENoZWNrIGlmIG5ldyBjaGFubmVsIGlzIGluIHRoZSBjaGFubmVsbGlzdC4KKwlmb3IgKGkgPSAwO2kgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2krKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQlyZXR1cm4gRkFMU0U7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitWT0lEIENoYW5uZWxTd2l0Y2hBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIE5ld0NoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSkKK3sKKwlVQ0hBUgkJQkJQVmFsdWUgPSAwOworCVVMT05HCQlNQUNWYWx1ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1BFQ1RSVU0gLSBDaGFubmVsU3dpdGNoQWN0aW9uKE5ld0NoYW5uZWwgPSAlZCAsIFNlY29uZGFyeSA9ICVkKSAgXG4iLCBOZXdDaGFubmVsLCBTZWNvbmRhcnkpKTsKKworCWlmIChDaGFubmVsU3dpdGNoU2FuaXR5Q2hlY2socEFkLCBXY2lkLCBOZXdDaGFubmVsLCBTZWNvbmRhcnkpID09IEZBTFNFKQorCQlyZXR1cm47CisKKwkvLyAxLiAgU3dpdGNoZXMgdG8gQlcgPSAyMC4KKwlpZiAoU2Vjb25kYXJ5ID09IDApCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhMjBNSHogICAhISEgXG4iICkpOworCX0KKwkvLyAxLiAgU3dpdGNoZXMgdG8gQlcgPSA0MCBBbmQgU3RhdGlvbiBzdXBwb3J0cyBCVyA9IDQwLgorCWVsc2UgaWYgKCgoU2Vjb25kYXJ5ID09IDEpIHx8IChTZWNvbmRhcnkgPT0gMykpICYmIChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSAxKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCisJCWlmIChTZWNvbmRhcnkgPT0gMSkKKwkJeworCQkJLy8gU2Vjb25kYXJ5IGFib3ZlLgorCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAmPSAweGZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlfD0gKDB4MTApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQVmFsdWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFNlY29uZGFyeSBiZWxvdy4KKwkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmTUFDVmFsdWUpOworCQkJTUFDVmFsdWUgJj0gMHhmZTsKKwkJCU1BQ1ZhbHVlIHw9IDB4MTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBNQUNWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZXw9ICgweDEwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDIwKTsKKwkJCUJCUFZhbHVlfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQVmFsdWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisJCX0KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJfQorfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBQZWVyUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVDoJLy8gRm9ybWF0IGRlZmluZWQgaW4gSUVFRSA3LjQuN2EuMSBpbiAxMW4gRHJhZjMuMDMKKwkJCXsKKwkJCQkvL1VDSEFSCUJzc0NvZXhpc3Q7CisJCQkJQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UCQkqcENvZXhpc3RJbmZvOworCQkJCUJTU18yMDQwX0NPRVhJU1RfSUUgCQkJKnBCc3NDb2V4aXN0SWU7CisJCQkJQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQJKnBJbnRvbGVyYW50UmVwb3J0ID0gTlVMTDsKKworCQkJCWlmIChFbGVtLT5Nc2dMZW4gPD0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSkgKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUNUSU9OIC0gMjAvNDAgQlNTIENvZXhpc3RlbmNlIE1hbmFnZW1lbnQgRnJhbWUgbGVuZ3RoIHRvbyBzaG9ydCEgbGVuID0gJWxkIVxuIiwgRWxlbS0+TXNnTGVuKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBhY3Rpb24tLS0tPiBcbiIpKTsKKwkJCQloZXhfZHVtcCgiQ29leGlzdGVuY2VNZ210RnJhbWUiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKworCQkJCXBDb2V4aXN0SW5mbyA9IChCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOworCQkJCS8vaGV4X2R1bXAoIkNvZXhpc3RJbmZvIiwgKFBVQ0hBUilwQ29leGlzdEluZm8sIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKTsKKwkJCQlpZiAoRWxlbS0+TXNnTGVuID49IChMRU5HVEhfODAyXzExICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkgKyBzaXplb2YoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQpKSkKKwkJCQl7CisJCQkJCXBJbnRvbGVyYW50UmVwb3J0ID0gKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUICopKChQVUNIQVIpcENvZXhpc3RJbmZvICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOworCQkJCX0KKwkJCQkvL2hleF9kdW1wKCJJbnRvbGVyYW50UmVwb3J0ICIsIChQVUNIQVIpcEludG9sZXJhbnRSZXBvcnQsIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpOworCisJCQkJcEJzc0NvZXhpc3RJZSA9IChCU1NfMjA0MF9DT0VYSVNUX0lFICopKCZwQ29leGlzdEluZm8tPkJzc0NvZXhpc3RJZSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQkJCXsKKwkJCQkJCVN0YVB1YmxpY0FjdGlvbihwQWQsIHBDb2V4aXN0SW5mbyk7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCX0KKwkJCWJyZWFrOworCX0KKworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworfQorCisKK3N0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiBDYXRlZ29yeTsKKworCWlmIChFbGVtLT5Nc2dMZW4gPD0gTEVOR1RIXzgwMl8xMSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlDYXRlZ29yeSA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJjdiByZXNlcnZlZCBjYXRlZ29yeSglZCkgQWN0aW9uIEZyYW1lXG4iLCBDYXRlZ29yeSkpOworCWhleF9kdW1wKCJSZXNlcnZlZCBBY3Rpb24gRnJhbWUiLCAmRWxlbS0+TXNnWzBdLCBFbGVtLT5Nc2dMZW4pOworfQorCitWT0lEIFBlZXJSTUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBWT0lEIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuOworCUZSQU1FX0hUX0lORk8JSFRJTkZPZnJhbWUsICpwRnJhbWU7CisJVUNIQVIgICAJCSpwQWRkcjsKKworCisJLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBnZXQgUkEKKwlwRnJhbWUgPSAoRlJBTUVfSFRfSU5GTyAqKSAmRWxlbS0+TXNnWzBdOworCXBBZGRyID0gcEZyYW1lLT5IZHIuQWRkcjI7CisKKwlOZGlzWmVyb01lbW9yeSgmSFRJTkZPZnJhbWUsIHNpemVvZihGUkFNRV9IVF9JTkZPKSk7CisJLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZGRyKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlIVElORk9mcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUhUSU5GT2ZyYW1lLkFjdGlvbiA9IEhUX0lORk9fRVhDSEFOR0U7CisJSFRJTkZPZnJhbWUuSFRfSW5mby5SZXF1ZXN0ID0gMDsKKwlIVElORk9mcmFtZS5IVF9JbmZvLkZvcnR5X01Iel9JbnRvbGVyYW50ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5Gb3J0eV9NaHpfSW50b2xlcmFudDsKKwlIVElORk9mcmFtZS5IVF9JbmZvLlNUQV9DaGFubmVsX1dpZHRoCSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCQkmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0hUX0lORk8pLAkmSFRJTkZPZnJhbWUsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIFNlbmROb3RpZnlCV0FjdGlvbkZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICBXY2lkLAorCUlOIFVDSEFSIGFwaWR4KQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlQVUNIQVIJCQlwQWRkcjE7CisKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBQ1QgLSBTZW5kTm90aWZ5QldBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKFdjaWQgPT0gTUNBU1RfV0NJRCkKKwkJcEFkZHIxID0gJkJST0FEQ0FTVF9BRERSWzBdOworCWVsc2UKKwkJcEFkZHIxID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyOworCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWRkcjEsIHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkKTsKKworCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJRnJhbWUuQWN0aW9uID0gTk9USUZZX0JXX0FDVElPTjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihGUkFNRV9BQ1RJT05fSERSKSwJICAmRnJhbWUsCisJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkqKHBPdXRCdWZmZXIgKyBGcmFtZUxlbikgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7CisJRnJhbWVMZW4rKzsKKworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVCAtIFNlbmROb3RpZnlCV0FjdGlvbihOb3RpZnlCVz0gJWQpIVxuIiwgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoKSk7CisKK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKworVk9JRCBQZWVySFRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIE5PVElGWV9CV19BQ1RJT046CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIE5vdGlmeSBDaGFubmVsIGJhbmR3aWR0aCBhY3Rpb24tLS0tPiBcbiIpKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCWlmKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCQkJeworCQkJCS8vIE5vdGUsIHRoaXMgaXMgdG8gcGF0Y2ggRElSLTEzNTMgQVAuIFdoZW4gdGhlIEFQIHNldCB0byBXZXAsIGl0IHdpbGwgdXNlIGxlZ2FjeSBtb2RlLiBCdXQgQVAgc3RpbGwga2VlcHMKKwkJCQkvLyBzZW5kaW5nIEJXX05vdGlmeSBBY3Rpb24gZnJhbWUsIGFuZCBjYXVzZSB1cyB0byBsaW5rdXAgYW5kIGxpbmtkb3duLgorCQkJCS8vIEluIGxlZ2FjeSBtb2RlLCBkb24ndCBuZWVkIHRvIHBhcnNlIEhUIGFjdGlvbiBmcmFtZS4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtSWdub3JlIEhUIE5vdGlmeSBDaGFubmVsIEJXIHdoZW4gbGluayBhcyBsZWdhY3kgbW9kZS4gQlcgPSAlZC0tLT4gXG4iLAorCQkJCQkJCQlFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSApKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJaWYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IDApCS8vIDcuNC44LjIuIGlmIHZhbHVlIGlzIDEsIGtlZXAgdGhlIHNhbWUgYXMgc3VwcG9ydGVkIGNoYW5uZWwgYmFuZHdpZHRoLgorCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBTTVBTX0FDVElPTjoKKwkJCS8vIDcuMy4xLjI1CisgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOworCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCQl9CisJCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKKwkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KKwkJCWJyZWFrOworCisJCWNhc2UgU0VUUENPX0FDVElPTjoKKwkJCWJyZWFrOworCisJCWNhc2UgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT046CisJCQlicmVhazsKKworCQljYXNlIEhUX0lORk9fRVhDSEFOR0U6CisJCQl7CisJCQkJSFRfSU5GT1JNQVRJT05fT0NURVQJKnBIVF9pbmZvOworCisJCQkJcEhUX2luZm8gPSAoSFRfSU5GT1JNQVRJT05fT0NURVQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOworICAgIAkJCQkvLyA3LjQuOC4xMAorICAgIAkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIEluZm9ybWF0aW9uIEV4Y2hhbmdlIGFjdGlvbi0tLS0+IFxuIikpOworICAgIAkJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpCisgICAgCQkJCXsKKyAgICAJCQkJCXJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKHBBZCwgRWxlbSk7CisgICAgCQkJCX0KKwkJCX0KKyAgICAJCQlicmVhazsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBPUklCQVRpbWVyVGltZW91dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeTsKKwlJTlQJCQlpLCB0b3RhbDsKKy8vCUZSQU1FX0JBUgkJCUZyYW1lQmFyOworLy8JVUxPTkcJCQlGcmFtZUxlbjsKKy8vCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworLy8JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisvLwlVU0hPUlQJCQlTZXF1ZW5jZTsKKwlVQ0hBUgkJCVRJRDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwl0b3RhbCA9IHBBZC0+TWFjVGFiLlNpemUgKiBOVU1fT0ZfVElEOworCisJZm9yIChpID0gMTsgKChpIDxNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkgJiYgKHRvdGFsID4gMCkpIDsgaSsrKQorCXsKKwkJaWYgIChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKKwkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZF07CisJCQlUSUQgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5USUQ7CisKKwkJCUFTU0VSVChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOworCQl9CisJCXRvdGFsIC0tOworCX0KK30KKworCitWT0lEIFNlbmRSZWZyZXNoQkFSKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KQoreworCUZSQU1FX0JBUgkJRnJhbWVCYXI7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlORElTX1NUQVRVUyAJTlN0YXR1czsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlVU0hPUlQJCQlTZXF1ZW5jZTsKKwlVQ0hBUgkJCWksIFRJRDsKKwlVU0hPUlQJCQlpZHg7CisJQkFfT1JJX0VOVFJZCSpwQkFFbnRyeTsKKworCWZvciAoaSA9IDA7IGkgPE5VTV9PRl9USUQ7IGkrKykKKwl7CisJCWlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbaV07CisJCWlmIChpZHggPT0gMCkKKwkJeworCQkJY29udGludWU7CisJCX0KKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaWR4XTsKKworCQlpZiAgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKKwkJeworCQkJVElEID0gcEJBRW50cnktPlRJRDsKKworCQkJQVNTRVJUKHBCQUVudHJ5LT5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOworCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJU2VxdWVuY2UgPSBwRW50cnktPlR4U2VxW1RJRF07CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwRW50cnktPkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCisJCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IFNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gVElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJLy9pZiAoIShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkpCisJCQlpZiAoMSkJLy8gTm93IHdlIGFsd2F5cyBzZW5kIEJBUi4KKwkJCXsKKwkJCQkvL01pbmlwb3J0TU1SZXF1ZXN0VW5sb2NrKHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJfQorCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpCit7CisgICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisgICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CisKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKK30KKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSkKK3sKKy8vCVVTSE9SVAlEdXJhdGlvbjsKKworCU5kaXNaZXJvTWVtb3J5KHBDbnRsQmFyLCBzaXplb2YoRlJBTUVfQkFSKSk7CisJcENudGxCYXItPkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBDbnRsQmFyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9CTE9DS19BQ0tfUkVROworICAgCXBDbnRsQmFyLT5CYXJDb250cm9sLk1USUQgPSAwOworCXBDbnRsQmFyLT5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOworCXBDbnRsQmFyLT5CYXJDb250cm9sLkFDS1BvbGljeSA9IDA7CisKKworCXBDbnRsQmFyLT5EdXJhdGlvbiA9IDE2ICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfMSwgc2l6ZW9mKEZSQU1FX0JBKSk7CisKKwlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMSwgcERBKTsKKwlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMiwgcFNBKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUgaW50byB0aGUgYWN0aW9uIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBjYXRlZ29yeSBjb2RlIG9mIHRoZSBmcmFtZS4KKwkJNC4gYWN0aW9uIGNvZGUgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEluc2VydEFjdEZpZWxkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IENhdGVnb3J5LAorCUlOIFVJTlQ4IEFjdENvZGUpCit7CisJVUxPTkcgVGVtcExlbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKAlwRnJhbWVCdWYsCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCSZBY3RDb2RlLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM4NzdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhaXJvbmV0LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAorKi8KKworI2lmbmRlZglfX0FDVElPTl9IX18KKyNkZWZpbmUJX19BQ1RJT05fSF9fCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfX0hUX0lORk9fT0NURVQKK3sKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJUmVzZXJ2ZWQ6NTsKKwlVQ0hBUiAJU1RBX0NoYW5uZWxfV2lkdGg6MTsKKwlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCVVDSEFSCVJlcXVlc3Q6MTsKKyNlbHNlCisJVUNIQVIJUmVxdWVzdDoxOworCVVDSEFSCUZvcnR5X01Iel9JbnRvbGVyYW50OjE7CisJVUNIQVIgCVNUQV9DaGFubmVsX1dpZHRoOjE7CisJVUNIQVIJUmVzZXJ2ZWQ6NTsKKyNlbmRpZgorfSBIVF9JTkZPUk1BVElPTl9PQ1RFVDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19GUkFNRV9IVF9JTkZPCit7CisJSEVBREVSXzgwMl8xMSAgIAkJSGRyOworCVVDSEFSCQkJCQlDYXRlZ29yeTsKKwlVQ0hBUgkJCQkJQWN0aW9uOworCUhUX0lORk9STUFUSU9OX09DVEVUCUhUX0luZm87Cit9ICAgRlJBTUVfSFRfSU5GTywgKlBGUkFNRV9IVF9JTkZPOworCisjZW5kaWYgLyogX19BQ1RJT05fSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYmFfYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9iYV9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFkZGIyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9iYV9hY3Rpb24uYwpAQCAtMCwwICsxLDE3OTggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworCisjZGVmaW5lIEJBX09SSV9JTklUX1NFUQkJKHBFbnRyeS0+VHhTZXFbVElEXSkgLy8xCQkJLy8gaW5pdGFsIHNlcXVlbmNlIG51bWJlciBvZiBCQSBzZXNzaW9uCisKKyNkZWZpbmUgT1JJX1NFU1NJT05fTUFYX1JFVFJZCTgKKyNkZWZpbmUgT1JJX0JBX1NFU1NJT05fVElNRU9VVAkoMjAwMCkJLy8gbXMKKyNkZWZpbmUgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUCSgxMDAwKQkvLyBtcworCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKyNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKworI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQorCitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7CisKKworQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKKwkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOworCitCQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7CisKK1ZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitCVUlMRF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpOworCisjZGVmaW5lIEFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKF9wQWQsIF9tcGR1X2JsaykJXAorCQkJQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoX3BBZCwgX21wZHVfYmxrKTsKKworVk9JRCBCQV9NYXhXaW5TaXplUmVhc2lnbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnlQZWVyLAorCU9VVCBVQ0hBUgkJCSpwV2luU2l6ZSkKK3sKKwlVQ0hBUiBNYXhTaXplOworCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKQorCQl7CisJCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkJTWF4U2l6ZSA9IDc7IC8vIGZvciBub24tb3BlbiBtb2RlCisJCQllbHNlCisJCQkJTWF4U2l6ZSA9IDEzOworCQl9CisJCWVsc2UKKwkJCU1heFNpemUgPSAzMTsKKwl9CisJZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKKwl7CisJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQllbHNlCisJCQlNYXhTaXplID0gMTM7CisJfQorCWVsc2UKKwkJTWF4U2l6ZSA9IDc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKKwkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCisJaWYgKCgqcFdpblNpemUpID4gTWF4U2l6ZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiByZWFzc2lnbiBtYXggd2luIHNpemUgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQkqcFdpblNpemUsIE1heFNpemUpKTsKKworCQkqcFdpblNpemUgPSBNYXhTaXplOworCX0KK30KKwordm9pZCBBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCQkJCQkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSptcGR1KQoreworCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCisJcFBhY2tldCA9IG1wZHUtPnBQYWNrZXQ7CisKKwlpZiAobXBkdS0+YkFNU0RVKQorCXsKKwkJQVNTRVJUKDApOworCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKKwkJLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworLyoKKyAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCit7CisKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICoqcHBTY2FuID0gJmxpc3QtPm5leHQ7CisKKwl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKQorCXsKKwkJaWYgKFNFUV9TTUFMTEVSKCgqcHBTY2FuKS0+U2VxdWVuY2UsIG1wZHUtPlNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQlwcFNjYW4gPSAmKCpwcFNjYW4pLT5uZXh0OworCQl9CisJCWVsc2UgaWYgKCgqcHBTY2FuKS0+U2VxdWVuY2UgPT0gbXBkdS0+U2VxdWVuY2UpCisJCXsKKwkJCS8qIGdpdmUgdXAgdGhpcyBkdXBsaWNhdGVkIGZyYW1lICovCisJCQlyZXR1cm4oRkFMU0UpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogZmluZCBwb3NpdGlvbiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltcGR1LT5uZXh0ID0gKnBwU2NhbjsKKwkqcHBTY2FuID0gbXBkdTsKKwlsaXN0LT5xbGVuKys7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQoreworCWxpc3QtPnFsZW4rKzsKKwltcGR1X2Jsay0+bmV4dCA9IGxpc3QtPm5leHQ7CisJbGlzdC0+bmV4dCA9IG1wZHVfYmxrOworfQorCisvKgorICogY2FsbGVyIGxvY2sgY3JpdGljYWwgc2VjdGlvbiBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICogYmFfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrID0gTlVMTDsKKworCUFTU0VSVChsaXN0KTsKKworCQlpZiAobGlzdC0+cWxlbikKKwkJeworCQkJbGlzdC0+cWxlbi0tOworCQkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OworCQkJaWYgKG1wZHVfYmxrKQorCQkJeworCQkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCQltcGR1X2Jsay0+bmV4dCA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gbXBkdV9ibGs7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3sKKwlyZXR1cm4oYmFfZGVxdWV1ZShsaXN0KSk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCisJeworCUFTU0VSVChsaXN0KTsKKworCQlyZXR1cm4obGlzdC0+bmV4dCk7CisJfQorCisKKy8qCisgKiBmcmVlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkFfVEFCTEUgICAgICAgICpUYWI7CisJUEJBX1JFQ19FTlRSWSAgIHBCQUVudHJ5OworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCWludCBpOworCisJVGFiID0gJnBBZC0+QkFUYWJsZTsKKworCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSAmVGFiLT5CQVJlY0VudHJ5W2ldOworCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCisJCXsKKwkJCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwkJCXsKKwkJCQlBU1NFUlQobXBkdV9ibGstPnBQYWNrZXQpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJCX0KKwkJfQorCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwkvKiBJSS4gZnJlZSBtZW1vcnkgb2YgcmVvcmRlcmluZyBtcGR1IHRhYmxlICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworfQorCisKKworLyoKKyAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pCit7CisJaW50ICAgICBpOworCVBVQ0hBUiAgbWVtOworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OworCisJLyogYWxsb2NhdGUgc3BpbmxvY2sgKi8KKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCisJLyogaW5pdGlhbGl6ZSBmcmVlbGlzdCAqLworCWZyZWVsaXN0ID0gJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdDsKKwlmcmVlbGlzdC0+bmV4dCA9IE5VTEw7CisJZnJlZWxpc3QtPnFsZW4gPSAwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgJWQgbWVtb3J5IGZvciBCQSByZW9yZGVyaW5nXG4iLCAoVUlOVDMyKShudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSkpOworCisJLyogYWxsb2NhdGUgbnVtYmVyIG9mIG1wZHVfYmxrIG1lbW9yeSAqLworCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbWVtLCAobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpOworCisJcEFkLT5tcGR1X2Jsa19wb29sLm1lbSA9IG1lbTsKKworCWlmIChtZW0gPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgQkEgUmVvcmRlcmluZ1xuIikpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLworCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCXsKKwkJLyogZ2V0IG1wZHVfYmxrICovCisJCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOworCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCisJCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOworCQkvKiBuZXh0IG1wZHVfYmxrICovCisJCW1lbSArPSBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSk7CisJCS8qIGluc2VydCBtcGR1X2JsayBpbnRvIGZyZWVsaXN0ICovCisJCWJhX2VucXVldWUoZnJlZWxpc3QsIG1wZHVfYmxrKTsKKwl9CisKKwlyZXR1cm4oVFJVRSk7Cit9CisKKy8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKworc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW1wZHVfYmxrID0gYmFfZGVxdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0KTsKKwlpZiAobXBkdV9ibGspCisJeworLy8JCWJsa19jb3VudCsrOworCQkvKiByZXNldCBtcGR1X2JsayAqLworCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCXJldHVybiBtcGR1X2JsazsKK30KKworc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCit7CisJQVNTRVJUKG1wZHVfYmxrKTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKy8vCWJsa19jb3VudC0tOworCWJhX2VucXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCwgbXBkdV9ibGspOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKK30KKworCitzdGF0aWMgVVNIT1JUIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoCisJCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFN0YXJ0U2VxKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCVVTSE9SVCAgTGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpCisJCXsKKwkJCS8qIGZpbmQgaW4tb3JkZXIgZnJhbWUgKi8KKwkJaWYgKCFTRVFfU1RFUE9ORShtcGR1X2Jsay0+U2VxdWVuY2UsIFN0YXJ0U2VxLCBNQVhTRVEpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCS8qIG1vdmUgdG8gbmV4dCBzZXF1ZW5jZSAqLworCQkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKKwkJLyogZnJlZSBtcGR1X2JsayAqLworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCXJldHVybiBMYXN0SW5kU2VxOworfQorCitzdGF0aWMgdm9pZCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcSgKKwkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU2VxdWVuY2UpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQorCQl7CisJCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKSB8fCBTRVFfU01BTExFUihtcGR1X2Jsay0+U2VxdWVuY2UsIFNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKKwkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCQkvKiBmcmVlIG1wZHVfYmxrICovCisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQl9CisJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKAorCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkgICBQQkFfUkVDX0VOVFJZICAgICAgIHBCQUVudHJ5KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwl7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCisJCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCX0KKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworLy9zdGF0aWMKK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAorCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKKworeworCVVTSE9SVCBTZXF1ZW5jZTsKKworLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCisvLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAorLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKKy8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCisJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQorCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCisJCSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAorCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKwkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJfQorCWVsc2UKKwlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCisJCSYmIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkKKwkgICApCisJCXsKKyAgICAJCS8vCisJCS8vIGZvcmNlIExhc3RJbmRTZXEgdG8gc2hpZnQgdG8gTGFzdEluZFNlcSsxCisgICAgCQkvLworICAgIAkJU2VxdWVuY2UgPSAocEJBRW50cnktPkxhc3RJbmRTZXErMSkgJiBNQVhTRVE7CisgICAgCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisgICAgCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisgICAgCQkvLworICAgIAkJLy8gaW5kaWNhdGUgaW4tb3JkZXIgbXBkdXMKKyAgICAJCS8vCisgICAgCQlTZXF1ZW5jZSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOworICAgIAkJaWYgKFNlcXVlbmNlICE9IFJFU0VUX1JDVl9TRVEpCisgICAgCQl7CisgICAgCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKyAgICAJCX0KKworCX0KKyNpZiAwCisJZWxzZSBpZiAoCisJCQkgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKKwkJCSAgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAxKSkKKwkJCSkKKwkJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInRpbWVvdXRbJWRdICglbHgtJWx4ID0gJWQgPiAlZCk6ICV4XG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAorCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKwkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQkJCX0KKyNlbmRpZgorfQorCisKKy8qCisgKiBnZW5lcmF0ZSBBRERCQSByZXF1ZXN0IHRvCisgKiBzZXQgdXAgQkEgYWdyZWVtZW50CisgKi8KK1ZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCisJCQkJCSAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCSAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCQkJCQkgIElOIFVDSEFSICAgICAgICAgICAgVElELAorCQkJCQkgIElOIFVTSE9SVCAgICAgICAgICAgVGltZU91dCwKKwkJCQkJICBJTiBVTE9ORyAgICAgICAgICAgIERlbGF5VGltZSwKKwkJCQkJICBJTiBCT09MRUFOICAgICAgICAgIGlzRm9yY2VkKQorCit7CisJLy9NTE1FX0FEREJBX1JFUV9TVFJVQ1QJQWRkYmFSZXE7CisJQkFfT1JJX0VOVFJZICAgICAgICAgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBJZHg7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBICE9IFRSVUUpICAmJiAgKGlzRm9yY2VkID09IEZBTFNFKSkKKwkJcmV0dXJuOworCisJLy8gaWYgdGhpcyBlbnRyeSBpcyBsaW1pdGVkIHRvIHVzZSBsZWdhY3kgdHggbW9kZSwgaXQgZG9lc24ndCBnZW5lcmF0ZSBCQS4KKwlpZiAoUlRNUFN0YUZpeGVkVHhNb2RlKHBBZCwgcEVudHJ5KSAhPSBGSVhFRF9UWE1PREVfSFQpCisJCXJldHVybjsKKworCWlmICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VElEKSkgJiYgKGlzRm9yY2VkID09IEZBTFNFKSkKKwl7CisJCS8vIHRyeSBhZ2FpbiBhZnRlciAzIHNlY3MKKwkJRGVsYXlUaW1lID0gMzAwMDsKKy8vCQlwcmludGsoIkRlQ2xpbmUgQkEgZnJvbSBQZWVyXG4iKTsKKy8vCQlyZXR1cm47CisJfQorCisKKwlJZHggPSBwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF07CisJaWYgKElkeCA9PSAwKQorCXsKKwkJLy8gYWxsb2NhdGUgYSBCQSBzZXNzaW9uCisJCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jT3JpRW50cnkocEFkLCAmSWR4KTsKKwkJaWYgKHBCQUVudHJ5ID09IE5VTEwpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUREQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBCQSBzZXNzaW9uIGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJfQorCisJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID49IE9yaWdpbmF0b3JfV2FpdFJlcykKKwl7CisJCXJldHVybjsKKwl9CisKKwlwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF0gPSBJZHg7CisKKwkvLyBJbml0aWFsaXplIEJBIHNlc3Npb24KKwlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfV2FpdFJlczsKKwlwQkFFbnRyeS0+V2NpZCA9IHBFbnRyeS0+QWlkOworCXBCQUVudHJ5LT5CQVdpblNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OworCXBCQUVudHJ5LT5TZXF1ZW5jZSA9IEJBX09SSV9JTklUX1NFUTsKKwlwQkFFbnRyeS0+VG9rZW4gPSAxOwkvLyAoMjAwOC0wMS0yMSkgSmFuIExlZSByZWNvbW1lbmRzIGl0IC0gdGhpcyB0b2tlbiBjYW4ndCBiZSAwCisJcEJBRW50cnktPlRJRCA9IFRJRDsKKwlwQkFFbnRyeS0+VGltZU91dFZhbHVlID0gVGltZU91dDsKKwlwQkFFbnRyeS0+cEFkYXB0ZXIgPSBwQWQ7CisKKwlpZiAoIShwRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8VElEKSkpCisJeworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KSwgcEJBRW50cnksIEZBTFNFKTsKKwl9CisJZWxzZQorCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCS8vIHNldCB0aW1lciB0byBzZW5kIEFEREJBIHJlcXVlc3QKKwlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBEZWxheVRpbWUpOworfQorCitWT0lEIEJBT3JpU2Vzc2lvbkFkZCgKKwkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQlJTiBQRlJBTUVfQUREQkFfUlNQIHBGcmFtZSkKK3sKKwlCQV9PUklfRU5UUlkgICpwQkFFbnRyeSA9IE5VTEw7CisJQk9PTEVBTiAgICAgICBDYW5jZWxsZWQ7CisJVUNIQVIgICAgICAgICBUSUQ7CisJVVNIT1JUICAgICAgICBJZHg7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW47CisJRlJBTUVfQkFSICAgICAgIEZyYW1lQmFyOworCisJVElEID0gcEZyYW1lLT5CYVBhcm0uVElEOworCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKKwlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisKKwkvLyBTdGFydCBmaWxsIGluIHBhcmFtZXRlcnMuCisJaWYgKChJZHggIT0wKSAmJiAocEJBRW50cnktPlRJRCA9PSBUSUQpICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpKQorCXsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9IG1pbihwQkFFbnRyeS0+QkFXaW5TaXplLCAoKFVDSEFSKXBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpKTsKKwkJQkFfTWF4V2luU2l6ZVJlYXNpZ24ocEFkLCBwRW50cnksICZwQkFFbnRyeS0+QkFXaW5TaXplKTsKKworCQlwQkFFbnRyeS0+VGltZU91dFZhbHVlID0gcEZyYW1lLT5UaW1lT3V0VmFsdWU7CisJCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9Eb25lOworCQkvLyByZXNldCBzZXF1ZW5jZSBudW1iZXIKKwkJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROworCQkvLyBTZXQgQml0bWFwIGZsYWcuCisJCXBFbnRyeS0+VFhCQWJpdG1hcCB8PSAoMTw8VElEKTsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQlwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlID0gMDsJLy9wRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzIDogVFhCQWJpdG1hcCA9ICV4LCBCQVdpblNpemUgPSAlZCwgVGltZU91dCA9ICVsZFxuIiwgX19GVU5DVElPTl9fLCBwRW50cnktPlRYQkFiaXRtYXAsCisJCQkJCQkJCSBwQkFFbnRyeS0+QkFXaW5TaXplLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKSk7CisKKwkJLy8gU0VORCBCQVIgOworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIEJBT3JpU2Vzc2lvbkFkZCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsJLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEJBRW50cnktPlNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwQkFFbnRyeS0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLCAgICAgICZGcmFtZUJhciwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKKworCisJCWlmIChwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKQorCQkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSk7IC8vIGluIG1TZWMKKwl9Cit9CisKK0JPT0xFQU4gQkFSZWNTZXNzaW9uQWRkKAorCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCQkJCQkgICBJTiBQRlJBTUVfQUREQkFfUkVRIHBGcmFtZSkKK3sKKwlCQV9SRUNfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOworCUJPT0xFQU4gICAgICAgICAgICAgICAgIFN0YXR1cyA9IFRSVUU7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOworCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBUSUQ7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQkFXaW5TaXplOworCS8vVUlOVDMyICAgICAgICAgICAgICAgICAgVmFsdWU7CisJLy9VSU5UICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7CisKKworCUFTU0VSVChwRW50cnkpOworCisJLy8gZmluZCBUSUQKKwlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CisKKwlCQVdpblNpemUgPSBtaW4oKChVQ0hBUilwRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOworCisJLy8gSW50ZWwgcGF0Y2gKKwlpZiAoQkFXaW5TaXplID09IDApCisJeworCQlCQVdpblNpemUgPSA2NDsKKwl9CisKKwlJZHggPSBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF07CisKKworCWlmIChJZHggPT0gMCkKKwl7CisJCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jUmVjRW50cnkocEFkLCAmSWR4KTsKKwl9CisJZWxzZQorCXsKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyglbGQpOiBJZHggPSAlZCwgQkFXaW5TaXplKHJlcSAlZCkgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwKKwkJCQkJCQkgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwgQkFXaW5TaXplKSk7CisKKwkvLyBTdGFydCBmaWxsIGluIHBhcmFtZXRlcnMuCisJaWYgKHBCQUVudHJ5ICE9IE5VTEwpCisJeworCQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9IYW5kbGVSZXM7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPSBCQVdpblNpemU7CisJCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CisJCXBCQUVudHJ5LT5USUQgPSBUSUQ7CisJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfQWNjZXB0OworCQkvLyBpbml0aWFsIHNlcXVlbmNlIG51bWJlcgorCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7IC8vcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOworCisJCXByaW50aygiU3RhcnQgU2VxID0gJTA4eFxuIiwgIHBGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSk7CisKKwkJaWYgKHBFbnRyeS0+UlhCQWJpdG1hcCAmICgxPDxUSUQpKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPlJFQ0JBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCksIHBCQUVudHJ5LCBUUlVFKTsKKwkJfQorCisjaWYgMAkvLyBmb3IgZGVidWdnaW5nCisJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCk7CisjZW5kaWYKKworCQkvLyBTZXQgQml0bWFwIGZsYWcuCisJCXBFbnRyeS0+UlhCQWJpdG1hcCB8PSAoMTw8VElEKTsKKwkJcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdID0gSWR4OworCisJCXBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICY9IH4oMTw8VElEKTsKKworCQkvLyBTZXQgQkEgc2Vzc2lvbiBtYXNrIGluIFdDSUQgdGFibGUuCisJCVJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKHBBZCwgcEVudHJ5LT5BaWQsIFRJRCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNQUNFbnRyeVslZF1SWEJBYml0bWFwID0gMHgleC4gQkFSZWNXY2lkQXJyYXk9JWRcbiIsCisJCQkJcEVudHJ5LT5BaWQsIHBFbnRyeS0+UlhCQWJpdG1hcCwgcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdKSk7CisJfQorCWVsc2UKKwl7CisJCVN0YXR1cyA9IEZBTFNFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNhbid0IEFjY2VwdCBBRERCQSBmb3IgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVElEID0gJWRcbiIsCisJCQkJUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIFRJRCkpOworCX0KKwlyZXR1cm4oU3RhdHVzKTsKK30KKworCitCQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCA+PSBNQVhfQkFSRUNJX1NFU1NJT04pCisJeworCQlwcmludGsoIkJBIFJlY2lwZWludCBTZXNzaW9uICglbGQpID4gJWRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwKKwkJCU1BWF9CQVJFQ0lfU0VTU0lPTik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKKwlmb3IgKGk9MTsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCisJeworCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W2ldOworCQlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9OT05FKSkKKwkJeworCQkJLy8gZ2V0IG9uZQorCQkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50Kys7CisJCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9VU0VEOworCQkJKklkeCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworZG9uZToKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJcmV0dXJuIHBCQUVudHJ5OworfQorCitCQV9PUklfRU5UUlkgKkJBVGFibGVBbGxvY09yaUVudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCisJeworCQlnb3RvIGRvbmU7CisJfQorCisJLy8gcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5CisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9OT05FKSkKKwkJeworCQkJLy8gZ2V0IG9uZQorCQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcisrOworCQkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX1VTRUQ7CisJCQlwQkFFbnRyeS0+cEFkYXB0ZXIgPSBwQWQ7CisJCQkqSWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlyZXR1cm4gcEJBRW50cnk7Cit9CisKKworVk9JRCBCQVRhYmxlRnJlZU9yaUVudHJ5KAorCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKK3sKKwlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCisJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCisJCXJldHVybjsKKworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKworCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCisJeworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CisJCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0gPSAwOworCisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCSAJcEVudHJ5LT5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFFbnRyeS0+VElEKSApKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBVGFibGVGcmVlT3JpRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOworCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCX0KKworCQlBU1NFUlQocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAhPSAwKTsKKworCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7CisKKwkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJCXBCQUVudHJ5LT5Ub2tlbiA9IDA7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwl9Cit9CisKKworVk9JRCBCQVRhYmxlRnJlZVJlY0VudHJ5KAorCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKK3sKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCisJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSkpCisJCXJldHVybjsKKworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKworCWlmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyAhPSBSZWNpcGllbnRfTk9ORSkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKwkJcEVudHJ5LT5CQVJlY1djaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgIT0gMCk7CisKKwkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50IC09IDE7CisKKwkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfTk9ORTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKworCitWT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiRm9yY2VTZW5kKQoreworCVVMT05HICAgICAgICAgICBJZHggPSAwOworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnk7CisJQk9PTEVBTiAgICAgICAgIENhbmNlbGxlZDsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vCisJLy8gTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KKwkvLworCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFPcmlXY2lkQXJyYXlbVElEXTsKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwl7CisJCWlmIChiRm9yY2VTZW5kID09IFRSVUUpCisJCXsKKwkJCS8vIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQQorCQkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7CisJCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKKworCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQlEZWxiYVJlcS5USUQgPSBUSUQ7CisJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOworI2lmIDEKKwkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQkJTmRpc01vdmVNZW1vcnkoRWxlbS0+TXNnLCAmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSwgc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmRGVsYmFSZXEpOworCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworI2VuZGlmCisJCX0KKworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7CisKKwlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgT1JJX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzKSk7CisJLy8KKwkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KKwkvLworCWlmICgoYlBhc3NpdmUgPT0gRkFMU0UpICYmIChUSUQgPT0gcEJBRW50cnktPlRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkpCisJeworCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKKwkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCURlbGJhUmVxLlRJRCA9IHBCQUVudHJ5LT5USUQ7CisJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7CisjaWYgMQorCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKKwkJTmRpc01vdmVNZW1vcnkoRWxlbS0+TXNnLCAmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJa2ZyZWUoRWxlbSk7CisjZWxzZQorCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSwgc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmRGVsYmFSZXEpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwl9CisJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7CisJQkFUYWJsZUZyZWVPcmlFbnRyeShwQWQsIElkeCk7CisKKwlpZiAoYlBhc3NpdmUpCisJeworCQkvL0JBT3JpU2Vzc2lvblNldFVwKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIFRJRCwgMCwgMTAwMDAsIFRSVUUpOworCX0KK30KKworVk9JRCBCQVJlY1Nlc3Npb25UZWFyRG93bigKKwkJCQkJCSBJTiBPVVQgIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgV2NpZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBUSUQsCisJCQkJCQkgSU4gICAgICBCT09MRUFOICAgICAgICAgYlBhc3NpdmUpCit7CisJVUxPTkcgICAgICAgICAgIElkeCA9IDA7CisJQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeTsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vCisJLy8gIExvY2F0ZSBjb3JyZXNwb25kaW5nIEJBIE9yaWdpbmF0b3IgRW50cnkgaW4gQkEgVGFibGUgd2l0aCB0aGUgKHBBZGRyLFRJRCkuCisJLy8KKwlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJaWYgKElkeCA9PSAwKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKKworCisJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIFJFQ19CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cykpOworCS8vCisJLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCisJLy8KKwlpZiAoKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCisJeworCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJQk9PTEVBTiAJCQkJQ2FuY2VsbGVkOworCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKwkJLy9VTE9ORyAgIG9mZnNldDsKKwkJLy9VSU5UMzIgIFZBTFVFOworCisJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsICZDYW5jZWxsZWQpOworCisJCS8vCisJCS8vIDEuIFNlbmQgREVMQkEgQWN0aW9uIEZyYW1lCisJCS8vCisJCWlmIChiUGFzc2l2ZSA9PSBGQUxTRSkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKKworCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQlEZWxiYVJlcS5USUQgPSBUSUQ7CisJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBSRUNJUElFTlQ7CisjaWYgMQorCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwkJfQorCisKKwkJLy8KKwkJLy8gMi4gRnJlZSByZXNvdXJjZSBvZiBCQSBzZXNzaW9uCisJCS8vCisJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gMDsKKwkJLy8gRXJhc2UgQml0bWFwIGZsYWcgYXQgc29mdHdhcmUgbWFjdGFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5SWEJBYml0bWFwICY9ICh+KDE8PChwQkFFbnRyeS0+VElEKSkpOworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF0gPSAwOworCisJCVJUMjhYWF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMocEFkLCBXY2lkLCBUSUQpOworCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCX0KKworCUJBVGFibGVGcmVlUmVjRW50cnkocEFkLCBJZHgpOworfQorCitWT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiBwQWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiBXY2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8TlVNX09GX1RJRDsgaSsrKQorCXsKKwkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBXY2lkLCBpLCBGQUxTRSwgRkFMU0UpOworCQlCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFKTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfT1JJX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCVBSVE1QX0FEQVBURVIgICBwQWQ7CisKKwlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcEFkID0gcEJBRW50cnktPnBBZGFwdGVyOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUuCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOworCisJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpICYmIChwQkFFbnRyeS0+VG9rZW4gPCBPUklfU0VTU0lPTl9NQVhfUkVUUlkpKQorCXsKKwkJTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgIEFkZGJhUmVxOworCisJCU5kaXNaZXJvTWVtb3J5KCZBZGRiYVJlcSwgc2l6ZW9mKEFkZGJhUmVxKSk7CisJCUNPUFlfTUFDX0FERFIoQWRkYmFSZXEucEFkZHIsIHBFbnRyeS0+QWRkcik7CisJCUFkZGJhUmVxLldjaWQgPSAoVUNIQVIpKHBFbnRyeS0+QWlkKTsKKwkJQWRkYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKKwkJQWRkYmFSZXEuQmFCdWZTaXplID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKKwkJQWRkYmFSZXEuVGltZU91dFZhbHVlID0gMDsKKwkJQWRkYmFSZXEuVG9rZW4gPSBwQkFFbnRyeS0+VG9rZW47CisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLCBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZBZGRiYVJlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSBPcmkgU2Vzc2lvbiBUaW1lb3V0KCVkKSA6IFNlbmQgQUREIEJBIGFnYWluXG4iLCBwQkFFbnRyeS0+VG9rZW4pKTsKKworCQlwQkFFbnRyeS0+VG9rZW4rKzsKKwkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgT1JJX0JBX1NFU1NJT05fVElNRU9VVCk7CisJfQorCWVsc2UKKwl7CisJCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBwRW50cnktPkJBT3JpV2NpZEFycmF5W3BCQUVudHJ5LT5USURdKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCVBhcmFtZXRyczoKKwlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAorCisJUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgorCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCisJQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9SRUNfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7CisJUFJUTVBfQURBUFRFUiAgIHBBZDsKKwlVTE9ORyAgICAgICAgICAgTm93MzI7CisKKwlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKKwl7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKKworCQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKSkpCisJCXsKKwkJCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKKwkJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJCXByaW50aygiJWxkOiBSRUMgQkEgc2Vzc2lvbiBUaW1lb3V0XG4iLCBOb3czMik7CisJCX0KKwl9Cit9CisKKworVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJLy8JNy40LjQuMQorCS8vVUxPTkcJSWR4OworCVVDSEFSICAgU3RhdHVzID0gMTsKKwlVQ0hBUiAgIHBBZGRyWzZdOworCUZSQU1FX0FEREJBX1JTUCBBRERmcmFtZTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlQRlJBTUVfQUREQkFfUkVRICBwQWRkcmVxRnJhbWUgPSBOVUxMOworCS8vVUNIQVIJCUJ1ZlNpemU7CisJVUxPTkcgICAgICAgRnJhbWVMZW47CisJUFVMT05HICAgICAgcHRlbXA7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gKFdjaWQgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCkpOworCisJLy9oZXhfZHVtcCgiQWRkQkFSZXEiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKwkvL0FEREJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm47CisKKwlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7CisJcHRlbXAgPSAoUFVMT05HKUVsZW0tPk1zZzsKKwkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOworCisJaWYgKFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBwQWRkcikpCisJeworCisJCWlmICgocEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9PSBGQUxTRSkgJiYgSVNfSFRfU1RBKHBNYWNFbnRyeSkpCisJCXsKKwkJCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkJCXByaW50aygiUmN2IFdjaWQoJWQpIEFkZEJBUmVxXG4iLCBFbGVtLT5XY2lkKTsKKwkJCWlmIChCQVJlY1Nlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEFkZHJlcUZyYW1lKSkKKwkJCQlTdGF0dXMgPSAwOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IDM4OyAvLyBtb3JlIHBhcmFtZXRlcnMgaGF2ZSBpbnZhbGlkIHZhbHVlcworCQl9CisJCWVsc2UKKwkJeworCQkJU3RhdHVzID0gMzc7IC8vIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGRlY2xpbmVkLgorCQl9CisJfQorCisJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uVmFsaWRBc0NMSSkKKwkJQVNTRVJUKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uU3N0ID09IFNTVF9BU1NPQyk7CisKKwlwQWRkcmVxRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7CisJLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gUGVlckJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KCZBRERmcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpOworCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzRGxzKQorCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlBRERmcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOworCUFERGZyYW1lLkFjdGlvbiA9IEFEREJBX1JFU1A7CisJQUREZnJhbWUuVG9rZW4gPSBwQWRkcmVxRnJhbWUtPlRva2VuOworCS8vIFdoYXQgaXMgdGhlIFN0YXR1cyBjb2RlPz8gIG5lZWQgdG8gY2hlY2suCisJQUREZnJhbWUuU3RhdHVzQ29kZSA9IFN0YXR1czsKKwlBRERmcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKKwlBRERmcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOworCUFERGZyYW1lLkJhUGFybS5USUQgPSBwQWRkcmVxRnJhbWUtPkJhUGFybS5USUQ7CisJQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSBtaW4oKChVQ0hBUilwQWRkcmVxRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOworCWlmIChBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9PSAwKQorCXsKKwkJQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSA2NDsKKwl9CisJQUREZnJhbWUuVGltZU91dFZhbHVlID0gMDsgLy9wQWRkcmVxRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKworCSooVVNIT1JUICopKCZBRERmcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkpOworCUFERGZyYW1lLlN0YXR1c0NvZGUgPSBjcHUybGUxNihBRERmcmFtZS5TdGF0dXNDb2RlKTsKKwlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihBRERmcmFtZS5UaW1lT3V0VmFsdWUpOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCksICAmQUREZnJhbWUsCisJCQkgIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyglZCk6IFRJRCglZCksIEJ1ZlNpemUoJWQpIDw9PSBcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCwgQUREZnJhbWUuQmFQYXJtLlRJRCwKKwkJCQkJCQkgIEFERGZyYW1lLkJhUGFybS5CdWZTaXplKSk7Cit9CisKKworVk9JRCBQZWVyQWRkQkFSc3BBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJLy9VQ0hBUgkJSWR4LCBpOworCS8vUFVDSEFSCQkgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlQRlJBTUVfQUREQkFfUlNQICAgIHBGcmFtZSA9IE5VTEw7CisJLy9QQkFfT1JJX0VOVFJZCQlwQkFFbnRyeTsKKworCS8vQUREQkEgUmVzcG9uc2UgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gV2NpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCkpOworCisJLy9oZXhfZHVtcCgiUGVlckFkZEJBUnNwQWN0aW9uKCkiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKwlpZiAoUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pKQorCXsKKwkJcEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKCZFbGVtLT5Nc2dbMF0pOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlx0XHQgU3RhdHVzQ29kZSA9ICVkXG4iLCBwRnJhbWUtPlN0YXR1c0NvZGUpKTsKKwkJc3dpdGNoIChwRnJhbWUtPlN0YXR1c0NvZGUpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQkvLyBJIHdhbnQgYSBCQXNlc3Npb24gd2l0aCB0aGlzIHBlZXIgYXMgYW4gb3JpZ2luYXRvci4KKwkJCQlCQU9yaVNlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEZyYW1lKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLy8gY2hlY2sgc3RhdHVzID09IFVTRUQgPz8/CisJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRnJhbWUtPkJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJfQorCQkvLyBSY3YgRGVjbGluZSBTdGF0dXNDb2RlCisJCWlmICgocEZyYW1lLT5TdGF0dXNDb2RlID09IDM3KQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgICAgICAgICAgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBTVEFfVEdOX1dJRklfT04ocEFkKSAmJiAocEZyYW1lLT5TdGF0dXNDb2RlICE9IDApKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkJBRGVjbGluZUJpdG1hcCB8PSAxPDxwRnJhbWUtPkJhUGFybS5USUQ7CisJCX0KKwl9Cit9CisKK1ZPSUQgUGVlckRlbEJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCS8vVUNIQVIJCQkJSWR4OworCS8vUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBGUkFNRV9ERUxCQV9SRVEgICAgcERlbEZyYW1lID0gTlVMTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgPT0+XG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkvL0RFTEJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCWlmIChQZWVyRGVsQkFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5XY2lkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7CisJCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5Jbml0aWF0b3IgPT0gT1JJR0lOQVRPUikKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IE9SSUdJTkFUT1JcbiIpKTsKKwkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBSRUNJUElFTlQsIFJlYXNvbiA9ICVkXG4iLCAgcERlbEZyYW1lLT5SZWFzb25Db2RlKSk7CisJCQkvL2hleF9kdW1wKCJEZWxCQSBGcmFtZSIsIHBEZWxGcmFtZSwgRWxlbS0+TXNnTGVuKTsKKwkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJCX0KKwl9Cit9CisKKworQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCisJCQkJCQkgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwkJCQkJCSAgSU4gVUxPTkcJCQkJV2NpZCwKKwkJCQkJCSAgSU4gVUxPTkcJCQkJTXNnTGVuLAorCQkJCQkJICBJTiBQRlJBTUVfQkFfUkVRCQlwTXNnKQoreworCVBGUkFNRV9CQV9SRVEgICBwRnJhbWUgPSBwTXNnOworCS8vUFJUTVBfUkVPUkRFUkJVRglwQnVmZmVyOworCS8vUFJUTVBfUkVPUkRFUkJVRglwRG1hQnVmOworCVBCQV9SRUNfRU5UUlkgcEJBRW50cnk7CisJLy9CT09MRUFOIAlSZXN1bHQ7CisJVUxPTkcgICBJZHg7CisJLy9VQ0hBUglOdW1SeFBrdDsKKwlVQ0hBUglUSUQ7Ly8sIGk7CisKKwlUSUQgPSAoVUNIQVIpcEZyYW1lLT5CQVJDb250cm9sLlRJRDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCk6IEJBUi1XY2lkKCVsZCksIFRpZCAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIFdjaWQsIFRJRCkpOworCS8vaGV4X2R1bXAoIkJBUiIsIChQQ0hBUikgcEZyYW1lLCBNc2dMZW4pOworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybiBGQUxTRTsKKworCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQorCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwl7CisJCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihGUkFNRV9CQV9SRVEpKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihGUkFNRV9CQV9SRVEpKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkgJiYgKFRJRCA8IDgpKQorCQl7CisJCS8vIGlmIHRoaXMgcmVjZWl2aW5nIHBhY2tldCBpcyBmcm9tIFNBIHRoYXQgaXMgaW4gb3VyIE9yaUVudHJ5LiBTaW5jZSBXQ0lEIDw5IGhhcyBkaXJlY3QgbWFwcGluZy4gbm8gbmVlZCBzZWFyY2guCisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJfQorCQllbHNlCisJCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBUiglbGQpIDogVGlkICglZCkgLSAlMDR4OiUwNHhcbiIsIFdjaWQsIFRJRCwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBwQkFFbnRyeS0+TGFzdEluZFNlcSApKTsKKworCWlmIChTRVFfU01BTExFUihwQkFFbnRyeS0+TGFzdEluZFNlcSwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBNQVhTRVEpKQorCXsKKwkJLy9wcmludGsoIkJBUiBTZXEgPSAleCwgTGFzdEluZFNlcSA9ICV4XG4iLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKKwkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxKTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID09IDApID8gTUFYU0VRIDoocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxIC0xKTsKKwl9CisJLy9iYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCitEZXNjcmlwdGlvbiA6IFNlbmQgUFNNUCBBY3Rpb24gZnJhbWUgSWYgUFNNUCBtb2RlIHN3aXRjaGVzLgorKi8KK1ZPSUQgU2VuZFBTTVBBY3Rpb24oCisJCQkJICAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCQkJCSAgIElOIFVDSEFSCQkJCVdjaWQsCisJCQkJICAgSU4gVUNIQVIJCQkJUHNtcCkKK3sKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJLy9VTE9ORyAgICAgICAgICAgSWR4OworCUZSQU1FX1BTTVBfQUNUSU9OICAgRnJhbWU7CisJVUxPTkcgICAgICAgICAgIEZyYW1lTGVuOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKKwlGcmFtZS5BY3Rpb24gPSBTTVBTX0FDVElPTjsKKwlzd2l0Y2ggKFBzbXApCisJeworCQljYXNlIE1NUFNfRU5BQkxFOgorCQkJRnJhbWUuUHNtcCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBNTVBTX0RZTkFNSUM6CisJCQlGcmFtZS5Qc21wID0gMzsKKwkJCWJyZWFrOworCQljYXNlIE1NUFNfU1RBVElDOgorCQkJRnJhbWUuUHNtcCA9IDE7CisJCQlicmVhazsKKwl9CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX1BTTVBfQUNUSU9OKSwgICAgICAmRnJhbWUsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkhUIC0gU2VuZFBTTVBBY3Rpb24oICVkICkgIFxuIiwgRnJhbWUuUHNtcCkpOworfQorCisKKyNkZWZpbmUgUkFESU9fTUVBU1VSRU1FTlRfUkVRVUVTVF9BQ1RJT04JMAorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQKK3sKKwlVQ0hBUglSZWd1bGF0b3J5Q2xhc3M7CisJVUNIQVIJQ2hhbm5lbE51bWJlcjsKKwlVU0hPUlQJUmFuZG9tSW50ZXJ2YWw7CisJVVNIT1JUCU1lYXN1cmVtZW50RHVyYXRpb247CisJVUNIQVIJTWVhc3VyZW1lbnRNb2RlOworCVVDSEFSICAgQlNTSURbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglSZXBvcnRpbmdDb25kaXRpb247CisJVUNIQVIJVGhyZXNob2xkOworCVVDSEFSICAgU1NJRElFWzJdOwkJCS8vIDIgYnl0ZQorfSBCRUFDT05fUkVRVUVTVDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VECit7CisJVUNIQVIJSUQ7CisJVUNIQVIJTGVuZ3RoOworCVVDSEFSCVRva2VuOworCVVDSEFSCVJlcXVlc3RNb2RlOworCVVDSEFSCVR5cGU7Cit9IE1FQVNVUkVNRU5UX1JFUTsKKworCisKKwordm9pZCBjb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVBORElTX1BBQ0tFVAlwUnhQa3Q7CisJVUNIQVIJCQlIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOworCisJLy8gMS4gZ2V0IDgwMi4zIEhlYWRlcgorCS8vIDIuIHJlbW92ZSBMTEMKKwkvLyAJCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCisJLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmRhdGEgPSBwUnhCbGstPnBEYXRhOworCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+dGFpbCA9IFJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmRhdGEgKyBSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5sZW47CisKKwkvLworCS8vIGNvcHkgODAyLjMgaGVhZGVyLCBpZiBuZWNlc3NhcnkKKwkvLworCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKyNpZmRlZiBMSU5VWAorCQkJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocFJ4UGt0LCBMRU5HVEhfODAyXzMpLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKyNlbmRpZgorI2lmZGVmIFVDT1MKKwkJCU5kaXNNb3ZlTWVtb3J5KG5ldF9wa3RfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworI2VuZGlmCisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9Cit9CisKKworI2RlZmluZSBJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKQkJXAorCWRvCQkJCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJXAorICAgIAlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfQU1TRFUpKQkJCQkJCVwKKyAgICAJewkJCQkJCQkJCQkJCQkJCQlcCisgICAgCQlJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKKyAgICAJfQkJCQkJCQkJCQkJCQkJCQlcCisJCWVsc2UgaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0VBUCkpCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJXAorCQkJSW5kaWNhdGVfRUFQT0xfUGFja2V0KF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCk7CQlcCisJCX0JCQkJCQkJCQkJCQkJCQkJXAorICAgIAllbHNlCQkJCQkJCQkJCQkJCQkJXAorICAgIAl7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKKyAgICAJfQkJCQkJCQkJCQkJCQkJCQlcCisJfSB3aGlsZSAoMCk7CisKKworCitzdGF0aWMgVk9JRCBiYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBCQV9SRUNfRU5UUlkJcEJBRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCVVJTlQxNglTZXF1ZW5jZSA9IChVSU5UMTYpIHBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7CisKKwltcGR1X2JsayA9IGJhX21wZHVfYmxrX2FsbG9jKHBBZCk7CisJaWYgKG1wZHVfYmxrICE9IE5VTEwpCisJeworCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAorCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCQltcGR1X2Jsay0+U2VxdWVuY2UgPSBTZXF1ZW5jZTsKKworCQltcGR1X2Jsay0+YkFNU0RVID0gUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7CisKKwkJY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKworCQlTVEFUU19JTkNfUlhfUEFDS0VUUyhwQWQsIEZyb21XaGljaEJTU0lEKTsKKworICAgICAgICAvLworCQkvLyBpdCBpcyBuZWNlc3NhcnkgZm9yIHJlb3JkZXJpbmcgcGFja2V0IHRvIHJlY29yZAorCQkvLyB3aGljaCBCU1MgaXQgY29tZSBmcm9tCisJCS8vCisJCVJUTVBfU0VUX1BBQ0tFVF9JRihwUnhCbGstPnBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOworCisJCW1wZHVfYmxrLT5wUGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisKKwkJaWYgKGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoJnBCQUVudHJ5LT5saXN0LCBtcGR1X2JsaykgPT0gRkFMU0UpCisJCXsKKwkJCS8vIGhhZCBiZWVuIGFscmVhZHkgd2l0aGluIHJlb3JkZXJpbmcgbGlzdAorCQkJLy8gZG9uJ3QgaW5kaWNhdGUKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQl9CisKKwkJQVNTRVJUKCgwPD0gcEJBRW50cnktPmxpc3QucWxlbikgICYmIChwQkFFbnRyeS0+bGlzdC5xbGVuIDw9IHBCQUVudHJ5LT5CQVdpblNpemUpKTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJfQorCWVsc2UKKwl7CisjaWYgMAorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgICgiISEhICglZDolZCkgQ2FuJ3QgYWxsb2NhdGUgcmVvcmRlcmluZyBtcGR1IGJsa1xuIiwKKwkJCQkJCQkJICAgYmxrX2NvdW50LCBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CisjZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgICgiISEhICglZCkgQ2FuJ3QgYWxsb2NhdGUgcmVvcmRlcmluZyBtcGR1IGJsa1xuIiwKKwkJCQkJCQkJICAgcEJBRW50cnktPmxpc3QucWxlbikpOworI2VuZGlmCisJCS8qCisJCSAqIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJICogYW5kIHJlY2V2aW5nIG1wZHUgdG8gdXBwZXIgbGF5ZXIKKwkJICogbWFrZSB0Y3AvaXAgdG8gdGFrZSBjYXJlIHJlb3JkZXJpbmcgbWVjaGFuaXNtCisJCSAqLworCQkvL2JhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluZGljYXRlIHRoaXMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIHB1dCBpdCBpbnRvIHJlb3JkZXJpbmcgYnVmZmVyCisKKwlQYXJhbWV0cnM6CisJCXBSeEJsayAgICAgICAgIDogY2FycnkgbmVjZXNzYXJ5IHBhY2tldCBpbmZvIDgwMi4xMSBmb3JtYXQKKwkJRnJvbVdoaWNoQlNTSUQgOiB0aGUgcGFja2V0IHJlY2VpdmVkIGZyb20gd2hpY2ggQlNTCisKKwlSZXR1cm4JOgorCQkJICBub25lCisKKwlOb3RlICAgIDoKKwkgICAgICAgICAgdGhlIHBhY2tldCBxdWV1ZWQgaW50byByZW9yZGVyaW5nIGJ1ZmZlciBuZWVkIHRvIGNvdmVyIHRvIDgwMi4zIGZvcm1hdAorCQkJICBvciBwcmVfQU1TRFUgZm9ybWF0CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitWT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJVVNIT1JUCQkJCUlkeDsKKwlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeSA9IE5VTEw7CisJVUlOVDE2CQkJCVNlcXVlbmNlID0gcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKwlVTE9ORwkJCQlOb3czMjsKKwlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKKwlVQ0hBUgkJCQlUSUQgPSBwUnhCbGstPnBSeFdJLT5USUQ7CisKKworCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkgJiYgIChwUnhCbGstPkRhdGFTaXplID4gTUFYX1JYX1BLVF9MRU4pKQorCXsKKyNpZiAwIC8vIHNhbXBsZSB0YWtlIG9mZiwgbm8gdXNlCisJCXN0YXRpYyBpbnQgZXJyX3NpemU7CisKKwkJZXJyX3NpemUrKzsKKwkJaWYgKGVycl9zaXplID4gMjApIHsKKwkJCSBwcmludGsoIkFNUERVIERhdGFTaXplID0gJWRcbiIsIHBSeEJsay0+RGF0YVNpemUpOworCQkJIGhleF9kdW1wKCI4MDIuMTEgSGVhZGVyIiwgKFVDSEFSICopcFJ4QmxrLT5wSGVhZGVyLCAyNCk7CisJCQkgaGV4X2R1bXAoIlBheWxvYWQiLCBwUnhCbGstPnBEYXRhLCA2NCk7CisJCQkgZXJyX3NpemUgPSAwOworCQl9CisjZW5kaWYKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCisjaWYgMCAvLyB0ZXN0CisJLyogUmVjIEJBIFNlc3Npb24gaGFkIGJlZW4gdG9ybiBkb3duICovCisJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJcmV0dXJuOworI2VuZGlmCisKKwlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCXsKKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOworCQlpZiAoSWR4ID09IDApCisJCXsKKwkJCS8qIFJlYyBCQSBTZXNzaW9uIGhhZCBiZWVuIHRvcm4gZG93biAqLworCQkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCQlyZXR1cm47CisJCX0KKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwl9CisJZWxzZQorCXsKKwkJLy8gaW1wb3NzaWJsZSAhISEKKwkJQVNTRVJUKDApOworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJQVNTRVJUKHBCQUVudHJ5KTsKKworCS8vIHVwZGF0ZSBsYXN0IHJ4IHRpbWUKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CisKKwlwQkFFbnRyeS0+cmN2U2VxID0gU2VxdWVuY2U7CisKKworCWJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cyhwQWQsIHBCQUVudHJ5LCBOb3czMik7CisJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisKKwkvLworCS8vIFJlc2V0IExhc3QgSW5kaWNhdGUgU2VxdWVuY2UKKwkvLworCWlmIChwQkFFbnRyeS0+TGFzdEluZFNlcSA9PSBSRVNFVF9SQ1ZfU0VRKQorCXsKKwkJQVNTRVJUKChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApICYmIChwQkFFbnRyeS0+bGlzdC5uZXh0ID09IE5VTEwpKTsKKworCQkvLyByZXNldCByY3Ygc2VxdWVuY2Ugb2YgQkEgc2Vzc2lvbgorCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisKKworCS8vCisJLy8gSS4gQ2hlY2sgaWYgaW4gb3JkZXIuCisJLy8KKwlpZiAoU0VRX1NURVBPTkUoU2VxdWVuY2UsIHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBNQVhTRVEpKQorCXsKKwkJVVNIT1JUICBMYXN0SW5kU2VxOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworIAkJTGFzdEluZFNlcSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCQlpZiAoTGFzdEluZFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQorCQl7CisJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IExhc3RJbmRTZXE7CisJCX0KKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJfQorCS8vCisJLy8gSUkuIERyb3AgRHVwbGljYXRlZCBQYWNrZXQKKwkvLworCWVsc2UgaWYgKFNlcXVlbmNlID09IHBCQUVudHJ5LT5MYXN0SW5kU2VxKQorCXsKKworCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAorCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisJLy8KKwkvLyBJSUkuIERyb3AgT2xkIFJlY2VpdmVkIFBhY2tldAorCS8vCisJZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsIHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBNQVhTRVEpKQorCXsKKworCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAorCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisJLy8KKwkvLyBJVi4gUmVjZWl2ZSBTZXF1ZW5jZSB3aXRoaW4gV2luZG93IFNpemUKKwkvLworCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCAoKChwQkFFbnRyeS0+TGFzdEluZFNlcStwQkFFbnRyeS0+QkFXaW5TaXplKzEpKSAmIE1BWFNFUSksIE1BWFNFUSkpCisJeworCQliYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHBBZCwgcEJBRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCX0KKwkvLworCS8vIFYuIFJlY2VpdmUgc2VxIHN1cnBhc3NlcyBXaW4obGFzdHNlcSArIG5NU0RVKS4gU28gcmVmcmVzaCBhbGwgcmVvcmRlciBidWZmZXIKKwkvLworCWVsc2UKKwl7CisjaWYgMAorCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworI2Vsc2UKKwkJTE9ORyBXaW5TdGFydFNlcSwgVG1wU2VxOworCisKKwkJVG1wU2VxID0gU2VxdWVuY2UgLSAocEJBRW50cnktPkJBV2luU2l6ZSkgLTE7CisJCWlmIChUbXBTZXEgPCAwKQorCQl7CisJCQlUbXBTZXEgPSAoTUFYU0VRKzEpICsgVG1wU2VxOworCQl9CisJCVdpblN0YXJ0U2VxID0gKFRtcFNlcSsxKSAmIE1BWFNFUTsKKwkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgV2luU3RhcnRTZXEpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFdpblN0YXJ0U2VxOyAvL1RtcFNlcTsKKworCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKworCQliYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHBBZCwgcEJBRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCVRtcFNlcSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCQlpZiAoVG1wU2VxICE9IFJFU0VUX1JDVl9TRVEpCisJCXsKKwkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gVG1wU2VxOworCQl9CisjZW5kaWYKKwl9Cit9CisKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3N2E4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhLmMKQEAgLTAsMCArMSwyNzM0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2RlZmluZSBNQVhfVFhfSU5fVEJUVAkJKDE2KQorCisKK1VDSEFSCVNOQVBfODAyXzFIW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07CitVQ0hBUglTTkFQX0JSSURHRV9UVU5ORUxbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4fTsKKy8vIEFkZCBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGUgZm9yIENDWDIgc3VwcG9ydAorVUNIQVIJU05BUF9BSVJPTkVUW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMH07CitVQ0hBUglDS0lQX0xMQ19TTkFQW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMn07CitVQ0hBUglFQVBPTF9MTENfU05BUFtdPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4ZX07CitVQ0hBUglFQVBPTFtdID0gezB4ODgsIDB4OGV9OworVUNIQVIgICBUUElEW10gPSB7MHg4MSwgMHgwMH07IC8qIFZMQU4gcmVsYXRlZCAqLworCitVQ0hBUglJUFhbXSA9IHsweDgxLCAweDM3fTsKK1VDSEFSCUFQUExFX1RBTEtbXSA9IHsweDgwLCAweGYzfTsKK1VDSEFSCVJhdGVJZFRvUGxjcFNpZ25hbFsxMl0gPSB7CisJIDAsIC8qIFJBVEVfMSAqLwkxLCAvKiBSQVRFXzIgKi8gCTIsIC8qIFJBVEVfNV81ICovCTMsIC8qIFJBVEVfMTEgKi8JLy8gc2VlIEJCUCBzcGVjCisJMTEsIC8qIFJBVEVfNiAqLyAgIDE1LCAvKiBSQVRFXzkgKi8gICAgMTAsIC8qIFJBVEVfMTIgKi8gICAxNCwgLyogUkFURV8xOCAqLwkvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0CisJIDksIC8qIFJBVEVfMjQgKi8gIDEzLCAvKiBSQVRFXzM2ICovCTgsIC8qIFJBVEVfNDggKi8gICAxMiAgLyogUkFURV81NCAqLyB9OyAvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0CisKK1VDSEFSCSBPZmRtU2lnbmFsVG9SYXRlSWRbMTZdID0geworCVJBVEVfNTQsICBSQVRFXzU0LAlSQVRFXzU0LCAgUkFURV81NCwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDAsICAxLCAgMiwgIDMgcmVzcGVjdGl2ZWx5CisJUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gNCwgIDUsICA2LCAgNyByZXNwZWN0aXZlbHkKKwlSQVRFXzQ4LCAgUkFURV8yNCwJUkFURV8xMiwgIFJBVEVfNiwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDgsICA5LCAgMTAsIDExIHJlc3BlY3RpdmVseQorCVJBVEVfNTQsICBSQVRFXzM2LAlSQVRFXzE4LCAgUkFURV85LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMTIsIDEzLCAxNCwgMTUgcmVzcGVjdGl2ZWx5Cit9OworCitVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbMTJdID0geworCTAsICAwLAkwLCAgMCwKKwkwLCAgMSwJMiwgIDMsCS8vIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzCisJNCwgIDUsCTYsICA3LAkvLyBPRkRNIHJhdGUgMjQsMzYsNDgsNTQgPSByeHdpIG1jcyA0LDUsNiw3Cit9OworVUNIQVIJIFJ4d2lNQ1NUb09mZG1SYXRlWzEyXSA9IHsKKwlSQVRFXzYsICBSQVRFXzksCVJBVEVfMTIsICBSQVRFXzE4LAorCVJBVEVfMjQsICBSQVRFXzM2LAlSQVRFXzQ4LCAgUkFURV81NCwJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKKwk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKK307CisKK2NoYXIqICAgTUNTVG9NYnBzW10gPSB7IjFNYnBzIiwiMk1icHMiLCI1LjVNYnBzIiwiMTFNYnBzIiwiMDZNYnBzIiwiMDlNYnBzIiwiMTJNYnBzIiwiMThNYnBzIiwiMjRNYnBzIiwiMzZNYnBzIiwiNDhNYnBzIiwiNTRNYnBzIiwiTU0tMCIsIk1NLTEiLCJNTS0yIiwiTU0tMyIsIk1NLTQiLCJNTS01IiwiTU0tNiIsIk1NLTciLCJNTS04IiwiTU0tOSIsIk1NLTEwIiwiTU0tMTEiLCJNTS0xMiIsIk1NLTEzIiwiTU0tMTQiLCJNTS0xNSIsIk1NLTMyIiwiZWUxIiwiZWUyIiwiZWUzIn07CisKK1VDSEFSIGRlZmF1bHRfY3dtaW5bXT17Q1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUy0xLCBDV19NSU5fSU5fQklUUy0yfTsKKy8vVUNIQVIgZGVmYXVsdF9jd21heFtdPXtDV19NQVhfSU5fQklUUywgQ1dfTUFYX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUy0xfTsKK1VDSEFSIGRlZmF1bHRfc3RhX2FpZnNuW109ezMsNywyLDJ9OworCitVQ0hBUiBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdID0ge1FJRF9BQ19CRSwgUUlEX0FDX0JLLCBRSURfQUNfQkssIFFJRF9BQ19CRSwgUUlEX0FDX1ZJLCBRSURfQUNfVkksIFFJRF9BQ19WTywgUUlEX0FDX1ZPfTsKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQVBJIGZvciBNTE1FIHRvIHRyYW5zbWl0IG1hbmFnZW1lbnQgZnJhbWUgdG8gQVAgKEJTUyBNb2RlKQorCW9yIHN0YXRpb24gKElCU1MgTW9kZSkKKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCVBvaW50ZXIgdG8gdGhlIG91dGdvaW5nIDgwMi4xMSBmcmFtZQorCQlMZW5ndGgJCVNpemUgb2Ygb3V0Z29pbmcgbWFuYWdlbWVudCBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1BFTkRJTkcKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVSU5UCQkJTGVuZ3RoKQoreworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCU5ESVNfU1RBVFVTICAJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVTE9ORwkgCQlGcmVlTnVtOworCVVDSEFSCQkJSXJxU3RhdGU7CisJVUNIQVIJCQlydG1wSHdIZHJbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOyAvL1JUTVBfSFdfSERSX0xFTl07CisKKwlBU1NFUlQoTGVuZ3RoIDw9IE1HTVRfRE1BX0JVRkZFUl9TSVpFKTsKKworCVF1ZUlkeD0zOworCisJLy8gMjg2MEMgdXNlIFR4IFJpbmcKKworCUlycVN0YXRlID0gcEFkLT5pcnFfZGlzYWJsZWQ7CisKKwlkbworCXsKKwkJLy8gUmVzZXQgaXMgaW4gcHJvZ3Jlc3MsIHN0b3AgaW1tZWRpYXRlbHkKKwkJaWYgKCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCQkgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpfHwKKwkJCSAhUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKKwkJeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQ2hlY2sgRnJlZSBwcmlvcml0eSBxdWV1ZQorCQkvLyBTaW5jZSB3ZSB1c2UgUEJGIFF1ZXVlMiBmb3IgbWFuYWdlbWVudCBmcmFtZS4gIEl0cyBjb3JyZXNwb25kaW5nIERNQSByaW5nIHNob3VsZCBiZSB1c2luZyBUeFJpbmcuCisKKwkJLy8gMjg2MEMgdXNlIFR4IFJpbmcKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCQl9CisJCWVsc2UKKwkJeworCQkJRnJlZU51bSA9IEdFVF9NR01UUklOR19GUkVFTk8ocEFkKTsKKwkJfQorCisJCWlmICgoRnJlZU51bSA+IDApKQorCQl7CisJCQkvLyBXZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIHJ0bXAgaGFyZHdhcmUgaGVhZGVyLiBpLmUuLCBUeFdJIGZvciBSVDI4NjAgYW5kIFR4SW5mbytUeFdJIGZvciBSVDI4NzAKKwkJCU5kaXNaZXJvTWVtb3J5KCZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSkpOworCQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCAoUFVDSEFSKSZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSksIHBEYXRhLCBMZW5ndGgpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiTWluaXBvcnRNTVJlcXVlc3QgKGVycm9yOjogY2FuJ3QgYWxsb2NhdGUgTkRJUyBQQUNLRVQpXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCS8vcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzI7CisKKworCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBNZ210UmluZywgTWdtdFJpbmdGdWxsQ291bnQ9JWxkIVxuIiwKKwkJCQkJCQkJCQlRdWVJZHgsIHBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQpKTsKKwkJfQorCisJfSB3aGlsZSAoRkFMU0UpOworCisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIHRyYW5zbWl0IGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBCdWZmZXIgCVBvaW50ZXIgdG8JbWVtb3J5IG9mIG91dGdvaW5nIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwkJKQorCXsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcocEFkLFF1ZUlkeCxwUGFja2V0KTsKKworfQorCisKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCVF1ZUlkeCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKKwlQVUNIQVIJCQlwU3JjQnVmVkE7CisJVUlOVAkJCVNyY0J1ZkxlbjsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKwlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOworCVVDSEFSCQkJTWxtZVJhdGU7CisJUFRYV0lfU1RSVUMgCXBGaXJzdFR4V0k7CisJTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOworCisJLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKy8vIHNhbXBsZSwgZm9yIElSUSBMT0NLIC0+IFNFTSBMT0NLCisvLwlJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOworLy8JaWYgKCFJcnFTdGF0ZSkKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOworCisKKwlpZiAocFNyY0J1ZlZBID09IE5VTEwpCisJeworCQkvLyBUaGUgYnVmZmVyIHNob3VsZG4ndCBiZSBOVUxMCisvLwkJaWYgKCFJcnFTdGF0ZSkKKwkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcEZpcnN0VHhXSSA9IChQVFhXSV9TVFJVQykocFNyY0J1ZlZBICsgIFRYSU5GT19TSVpFKTsKKwlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsgLy9UWFdJX1NJWkUpOworCisJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCisJeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJfQorCWVsc2UKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJfQorCisJLy8gVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuCisJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkgLy8gMTFBIGJhbmQKKwkJTWxtZVJhdGUgPSBSQVRFXzY7CisKKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCisJCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkKKwl7CisJCXBNYWNFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlcl84MDJfMTEtPkFkZHIxKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRml4ZWQgVzUyIHdpdGggQWN0aXZpdHkgc2NhbiBpc3N1ZSBpbiBBQkdfTUlYRUQgYW5kIEFCR05fTUlYRUQgbW9kZS4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVECisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQl8fCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJKQorCQl7CisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOworCQkJZWxzZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMDsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vCisJLy8gU2hvdWxkIG5vdCBiZSBoYXJkIGNvZGUgdG8gc2V0IFB3ck1nbXQgdG8gMCAoUFdSX0FDVElWRSkKKwkvLyBTbmljZSBpdCdzIGJlZW4gc2V0IHRvIDAgd2hpbGUgb24gTWd0TWFjSGVhZGVySW5pdAorCS8vIEJ5IHRoZSB3YXkgdGhpcyB3aWxsIGNhdXNlIGZyYW1lIHRvIGJlIHNlbmQgb24gUFdSX1NBVkUgZmFpbGVkLgorCS8vCisJLy8gcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAwOyAvLyAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKKwkvLworCS8vIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICAvLyBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNECisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9EQVRBKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfQ05UTCkpCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYKKwkJCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0FDVElPTikpCisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQllbHNlCisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9BQ1RJVkU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOworCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vU2V0IFBNIGJpdCBpbiBwcy1wb2xsLCB0byBmaXggV0xLIDEuMiAgUG93ZXJTYXZlTW9kZV9leHQgZmFpbHVyZSBpc3N1ZS4KKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QU19QT0xMKSkKKwkJeworCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKKwl9CisJZWxzZSAvLyBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKQorCXsKKwkJLy9wQWQtPlNlcXVlbmNlKys7CisJCS8vcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKKworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOworCWlmIChwQWQtPlNlcXVlbmNlID4weGZmZikKKwkJcEFkLT5TZXF1ZW5jZSA9IDA7CisKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisvLwkJaWYgKCFJcnFTdGF0ZSkKKwkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKy8vCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMTsKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCisJCTAsIFJFU0VSVkVEX1dDSUQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwKKwkJCQkJcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJCQkoVUNIQVIpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAorCQkJCQlJRlNfQkFDS09GRiwgRkFMU0UsICZwTWFjRW50cnktPk1heEhUUGh5TW9kZSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBGaXJzdFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYKKworCS8vIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LgorCUhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisKKwkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKKy8vCWlmICghSXJxU3RhdGUpCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTmV3IERlUXVldWUgUHJvY2VkdXJlcy4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERFUVVFVUVfTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpIAkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChiSW50Q29udGV4dCA9PSBGQUxTRSkJCQkJCQlcCisJCQkJUlRNUF9JUlFfTE9DSygobG9jayksIElycUZsYWdzKTsJCVwKKwkJCX13aGlsZSgwKQorCisjZGVmaW5lIERFUVVFVUVfVU5MT0NLKGxvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncykJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoYkludENvbnRleHQgPT0gRkFMU0UpCQkJCQkJXAorCQkJCQlSVE1QX0lSUV9VTkxPQ0soKGxvY2spLCBJcnFGbGFncyk7CVwKKwkJCX13aGlsZSgwKQorCisKKyNpZiAwCitzdGF0aWMgVk9JRCBkdW1wVHhCbGsoVFhfQkxLICpwVHhCbGspCit7CisJTkRJU19QQUNLRVQgKnBQYWNrZXQ7CisJaW50IGksIGZyYW1lTnVtOworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJcHJpbnRrKCJEdW1wIFRYX0JMSyBTdHJ1Y3R1cmU6XG4iKTsKKwlwcmludGsoIlx0VHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKwlwcmludGsoIlx0VG90YWxGcmFtZUxlbj0lZFxuIiwgcFR4QmxrLT5Ub3RhbEZyYW1lTGVuKTsKKwlwcmludGsoIlx0VG90YWxGcmFtZU51bT0lbGQhXG4iLCBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpOworCXByaW50aygiXHRUb3RhbEZyYWdOdW09JWQhXG4iLCBwVHhCbGstPlRvdGFsRnJhZ051bSk7CisJcHJpbnRrKCJcdHBQYWNrZXRMaXN0PVxuIik7CisKKwlmcmFtZU51bSA9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKKworCWZvcihpPTA7IGkgPCBmcmFtZU51bTsgaSsrKQorCXsJaW50IGo7CisJCVVDSEFSCSpwQnVmOworCisJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKHBQYWNrZXQpCisJCXsKKwkJCXBCdWYgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJCQlwcmludGsoIlx0XHRbJWRdOnB0cj0weCV4LCBMZW49JWQhXG4iLCBpLCAoVUlOVDMyKShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkpLCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk7CisJCQlwcmludGsoIlx0XHQiKTsKKwkJCWZvciAoaiA9MCA7IGogPCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsgaisrKQorCQkJeworCQkJCXByaW50aygiJTAyeCAiLCAocEJ1ZltqXSAmIDB4ZmYpKTsKKwkJCQlpZiAoaiA9PSAxNikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCQl9CisJfQorCXByaW50aygiXHRXY2lkPSVkIVxuIiwgcFR4QmxrLT5XY2lkKTsKKwlwcmludGsoIlx0YXBpZHg9JWQhXG4iLCBwVHhCbGstPmFwaWR4KTsKKwlwcmludGsoIi0tLS1FbmRPZkR1bXBcbiIpOworCit9CisjZW5kaWYKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVR4IFBhdGggZGVzaWduIGFsZ29yaXRobToKKwkJQmFzaWNhbGx5LCB3ZSBkaXZpZGUgdGhlIHBhY2tldHMgaW50byBmb3VyIHR5cGVzLCBCcm9hZGNhc3QvTXVsdGljYXN0LCAxMU4gUmF0ZShBTVBEVSwgQU1TRFUsIE5vcm1hbCksIEIvRyBSYXRlKEFSQUxJTkssIE5vcm1hbCksCisJCVNwZWNpZmljIFBhY2tldCBUeXBlLiBGb2xsb3dpbmcgc2hvdyB0aGUgY2xhc3NpZmljYXRpb24gcnVsZSBhbmQgcG9saWN5IGZvciBlYWNoIGtpbmRzIG9mIHBhY2tldHMuCisJCQkJQ2xhc3NpZmljYXRpb24gUnVsZT0+CisJCQkJCU11bHRpY2FzdDogKCphZGRyMSAmIDB4MDEpID09IDB4MDEKKwkJCQkJU3BlY2lmaWMgOiBiREhDUEZyYW1lLCBiQVJQRnJhbWUsIGJFQVBPTEZyYW1lLCBldGMuCisJCQkJCTExTiBSYXRlIDogSWYgcGVlciBzdXBwb3J0IEhUCisJCQkJCQkJCSgxKS5BTVBEVSAgLS0gSWYgVFhCQSBpcyBuZWdvdGlhdGVkLgorCQkJCQkJCQkoMikuQU1TRFUgIC0tIElmIEFNU0RVIGlzIGNhcGFibGUgZm9yIGJvdGggcGVlciBhbmQgb3Vyc2VsZi4KKwkJCQkJCQkJCQkJKikuIEFNU0RVIGNhbiBlbWJlZGRlZCBpbiBhIEFNUERVLCBidXQgbm93IHdlIGRpZG4ndCBzdXBwb3J0IGl0LgorCQkJCQkJCQkoMykuTm9ybWFsIC0tIE90aGVyIHBhY2tldHMgd2hpY2ggc2VuZCBhcyAxMW4gcmF0ZS4KKworCQkJCQlCL0cgUmF0ZSA6IElmIHBlZXIgaXMgYi9nIG9ubHkuCisJCQkJCQkJCSgxKS5BUkFMSU5LLS0gSWYgYm90aCBvZiBwZWVyL3VzIHN1cHByb3QgUmFsaW5rIHByb3ByaWV0YXJ5IEFnZ3JlZ2F0aW9uIGFuZCB0aGUgVHhSYXRlIGlzIGxhcmdlIHRoYW4gUkFURV82CisJCQkJCQkJCSgyKS5Ob3JtYWwgLS0gT3RoZXIgcGFja2V0cyB3aGljaCBzZW5kIGFzIGIvZyByYXRlLgorCQkJCQlGcmFnbWVudDoKKwkJCQkJCQkJVGhlIHBhY2tldCBtdXN0IGJlIHVuaWNhc3QsIE5PVCBBLVJBTElOSywgTk9UIEEtTVNEVSwgTk9UIDExbiwgdGhlbiBjYW4gY29uc2lkZXIgYWJvdXQgZnJhZ21lbnQuCisKKwkJCQlDbGFzc2lmaWVkIFBhY2tldCBIYW5kbGUgUnVsZT0+CisJCQkJCU11bHRpY2FzdDoKKwkJCQkJCQkJTm8gQUNLLCAJCS8vcFR4QmxrLT5iQWNrUmVxdWlyZWQgPSBGQUxTRTsKKwkJCQkJCQkJTm8gV01NLCAJCS8vcFR4QmxrLT5iV01NID0gRkFMU0U7CisJCQkJCQkJCU5vIHBpZ2d5YmFjaywgICAvL3BUeEJsay0+YlBpZ2d5QmFjayA9IEZBTFNFOworCQkJCQkJCQlGb3JjZSBMb3dSYXRlLCAgLy9wVHhCbGstPmJGb3JjZUxvd1JhdGUgPSBUUlVFOworCQkJCQlTcGVjaWZpYyA6CUJhc2ljYWxseSwgZm9yIHNwZWNpZmljIHBhY2tldCwgd2Ugc2hvdWxkIGhhbmRsZSBpdCBzcGVjaWZpY2FsbHksIGJ1dCBub3cgYWxsIHNwZWNpZmljIHBhY2tldHMgYXJlIHVzZQorCQkJCQkJCQkJdGhlIHNhbWUgcG9saWN5IHRvIGhhbmRsZSBpdC4KKwkJCQkJCQkJRm9yY2UgTG93UmF0ZSwgIC8vcFR4QmxrLT5iRm9yY2VMb3dSYXRlID0gVFJVRTsKKworCQkJCQkxMU4gUmF0ZSA6CisJCQkJCQkJCU5vIHBpZ2d5YmFjaywJLy9wVHhCbGstPmJQaWdneUJhY2sgPSBGQUxTRTsKKworCQkJCQkJCQkoMSkuQU1TRFUKKwkJCQkJCQkJCXBUeEJsay0+YldNTSA9IFRSVUU7CisJCQkJCQkJCSgyKS5BTVBEVQorCQkJCQkJCQkJcFR4QmxrLT5iV01NID0gVFJVRTsKKwkJCQkJCQkJKDMpLk5vcm1hbAorCisJCQkJCUIvRyBSYXRlIDoKKwkJCQkJCQkJKDEpLkFSQUxJTksKKworCQkJCQkJCQkoMikuTm9ybWFsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFVDSEFSIFR4UGt0Q2xhc3NpZmljYXRpb24oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gUE5ESVNfUEFDS0VUICBwUGFja2V0KQoreworCVVDSEFSCQkJVHhGcmFtZVR5cGUgPSBUWF9VTktPV05fRlJBTUU7CisJVUNIQVIJCQlXY2lkOworCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5ID0gTlVMTDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOCQkJYkhUUmF0ZSA9IEZBTFNFOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJV2NpZCA9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOworCWlmIChXY2lkID09IE1DQVNUX1dDSUQpCisJewkvLyBIYW5kbGUgZm9yIFJBIGlzIEJyb2FkY2FzdC9NdWx0aWNhc3QgQWRkcmVzcy4KKwkJcmV0dXJuIFRYX01DQVNUX0ZSQU1FOworCX0KKworCS8vIEhhbmRsZSBmb3IgdW5pY2FzdCBwYWNrZXRzCisJcE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF07CisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKHBQYWNrZXQpKQorCXsJLy8gSXQncyBhIHNwZWNpZmljIHBhY2tldCBuZWVkIHRvIGZvcmNlIGxvdyByYXRlLCBpLmUuLCBiREhDUEZyYW1lLCBiRUFQT0xGcmFtZSwgYldBSUZyYW1lCisJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwllbHNlIGlmIChJU19IVF9SQVRFKHBNYWNFbnRyeSkpCisJewkvLyBpdCdzIGEgMTFuIGNhcGFibGUgcGFja2V0CisKKwkJLy8gRGVwZW5kcyBvbiBIVFBoeU1vZGUgdG8gY2hlY2sgaWYgdGhlIHBlZXIgc3VwcG9ydCB0aGUgSFRSYXRlIHRyYW5zbWlzc2lvbi4KKwkJLy8gCUN1cnJlbnRseSBkaWRuJ3Qgc3VwcG9ydCBBLU1TRFUgZW1iZWRkZWQgaW4gQS1NUERVCisJCWJIVFJhdGUgPSBUUlVFOworCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpIHx8IChwTWFjRW50cnktPlBzTW9kZSA9PSBQV1JfU0FWRSkpCisJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCWVsc2UgaWYgKFJUTVBfR0VUX1BBQ0tFVF9FT1NQKHBQYWNrZXQpKQorCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCQllbHNlIGlmKChwTWFjRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8KFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KSkpKSAhPSAwKQorCQkJcmV0dXJuIFRYX0FNUERVX0ZSQU1FOworCQllbHNlIGlmKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKSkKKwkJCXJldHVybiBUWF9BTVNEVV9GUkFNRTsKKwkJZWxzZQorCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWVsc2UKKwl7CS8vIGl0J3MgYSBsZWdhY3kgYi9nIHBhY2tldC4KKwkJaWYgKChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpICYmIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpICYmCisJCQkoUlRNUF9HRVRfUEFDS0VUX1RYUkFURShwUGFja2V0KSA+PSBSQVRFXzYpICYmCisJCQkoIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSkpCisJCXsJLy8gaWYgcGVlciBzdXBwb3J0IFJhbGluayBBZ2dyZWdhdGlvbiwgd2UgdXNlIGl0LgorCQkJVHhGcmFtZVR5cGUgPSBUWF9SQUxJTktfRlJBTUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwkJfQorCX0KKworCS8vIEN1cnJlbnRseSwgb3VyIGZyYWdtZW50IG9ubHkgc3VwcG9ydCB3aGVuIGEgdW5pY2FzdCBwYWNrZXQgc2VuZCBhcyBOT1QtQVJBTElOSywgTk9ULUFNU0RVIGFuZCBOT1QtQU1QRFUuCisJaWYgKChSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpID4gMSkgJiYgKFR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkpCisJCVR4RnJhbWVUeXBlID0gVFhfRlJBR19GUkFNRTsKKworCXJldHVybiBUeEZyYW1lVHlwZTsKK30KKworCitCT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsgKnBUeEJsaykKK3sKKwlQQUNLRVRfSU5GTwkJCVBhY2tldEluZm87CisJUE5ESVNfUEFDS0VUCQlwUGFja2V0OworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5ID0gTlVMTDsKKworCXBQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7CisKKwlwVHhCbGstPldjaWQJIAkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOworCXBUeEJsay0+YXBpZHgJCSAJCT0gUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpOworCXBUeEJsay0+VXNlclByaW9yaXR5IAkJPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7CisJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19IVFRYT1A7CQkvLyBBU0lDIGRldGVybWluZSBGcmFtZSBHYXAKKworCWlmIChSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBUeEJsay0+cFBhY2tldCkpCisJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7CisJZWxzZQorCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7CisKKwkvLyBEZWZhdWx0IHRvIGNsZWFyIHRoaXMgZmxhZworCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7CisKKworCWlmIChwVHhCbGstPldjaWQgPT0gTUNBU1RfV0NJRCkKKwl7CisJCXBUeEJsay0+cE1hY0VudHJ5ID0gTlVMTDsKKwkJeworI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKwkJCVBVQ0hBUiBwREEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJCQlpZiAoKCgqcERBICYgMHgwMSkgPT0gMHgwMSkgJiYgKCpwREEgIT0gMHhmZikpCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5Db21tb25DZmcuTUNhc3RQaHlNb2RlOworCQkJZWxzZQorI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKwkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKKwkJfQorCisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CS8vIEFja1JlcXVpcmVkID0gRkFMU0UsIHdoZW4gYnJvYWRjYXN0IHBhY2tldCBpbiBBZGhvYyBtb2RlLgorCQkvL1RYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VMb3dSYXRlKTsKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOworCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKQorCQl7CisJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKwkJfQorCisJfQorCWVsc2UKKwl7CisJCXBUeEJsay0+cE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFR4QmxrLT5XY2lkXTsKKwkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcFR4QmxrLT5wTWFjRW50cnktPkhUUGh5TW9kZTsKKworCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKworCisJCS8vIEZvciBhbGwgdW5pY2FzdCBwYWNrZXRzLCBuZWVkIEFjayB1bmxlc3MgdGhlIEFjayBQb2xpY3kgaXMgbm90IHNldCBhcyBOT1JNQUxfQUNLLgorCQlpZiAocEFkLT5Db21tb25DZmcuQWNrUG9saWN5W3BUeEJsay0+UXVlSWR4XSAhPSBOT1JNQUxfQUNLKQorCQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKKwkJZWxzZQorCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisKKwkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJeworCisJCQkJLy8gSWYgc3VwcG9ydCBXTU0sIGVuYWJsZSBpdC4KKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJgorCQkJCQlDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOworCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQl9CisKKwkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKQorCQl7CisJCQlpZiAoIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkgfHwKKyAgICAgICAgICAgICAgICAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgJiYgKHBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gUkFURV8xKSkpCisJCQl7CS8vIFNwZWNpZmljIHBhY2tldCwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZSwgbmVlZCBmb3JjZSBsb3cgcmF0ZS4KKwkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkvLyBNb2RpZnkgdGhlIFdNTSBiaXQgZm9yIElDViBpc3N1ZS4gSWYgd2UgaGF2ZSBhIHBhY2tldCB3aXRoIEVPU1AgZmllbGQgbmVlZCB0byBzZXQgYXMgMSwgaG93IHRvIGhhbmRsZSBpdD8/PworCQkJCWlmIChJU19IVF9TVEEocFR4QmxrLT5wTWFjRW50cnkpICYmCisJCQkJCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkgJiYKKwkJCQkJKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKSkKKwkJCQl7CisJCQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOworCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmICggKElTX0hUX1JBVEUocE1hY0VudHJ5KSA9PSBGQUxTRSkgJiYKKwkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSkpKQorCQkJewkvLyBDdXJyZW50bHkgcGlnZ3ktYmFjayBvbmx5IHN1cHBvcnQgd2hlbiBwZWVyIGlzIG9wZXJhdGUgaW4gYi9nIG1vZGUuCisJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JQaWdneUJhY2spOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKQorCQkJeworCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOworCQkJfQorI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKKwkJCWlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKKwkJCXsKKwkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYldNTV9VQVBTRF9FT1NQKTsKKwkJCX0KKyNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCisJCX0KKwkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9GUkFHX0ZSQU1FKQorCQl7CisJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJCX0KKworCQlwTWFjRW50cnktPkRlYnVnVHhDb3VudCsrOworCX0KKworCXJldHVybiBUUlVFOworCitGaWxsVHhCbGtFcnI6CisJcmV0dXJuIEZBTFNFOworfQorCisKK0JPT0xFQU4gQ2FuRG9BZ2dyZWdhdGVUcmFuc21pdCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBORElTX1BBQ0tFVCAqcFBhY2tldCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisKKwkvL3ByaW50aygiQ2hlY2sgaWYgY2FuIGRvIGFnZ3JlZ2F0aW9uISBUeEZyYW1lVHlwZT0lZCFcbiIsIHBUeEJsay0+VHhGcmFtZVR5cGUpOworCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpID09IE1DQVNUX1dDSUQpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChSVE1QX0dFVF9QQUNLRVRfREhDUChwUGFja2V0KSB8fAorCQlSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCkgfHwKKwkJUlRNUF9HRVRfUEFDS0VUX1dBSShwUGFja2V0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKSAmJgorCQkoKHBUeEJsay0+VG90YWxGcmFtZUxlbiArIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKT4gKFJYX0JVRkZFUl9BR0dSRVNJWkUgLSAxMDApKSkKKwl7CS8vIEZvciBBTVNEVSwgYWxsb3cgdGhlIHBhY2tldHMgd2l0aCB0b3RhbCBsZW5ndGggPCBtYXgtYW1zZHUgc2l6ZQorCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkgJiYKKwkJKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAyKSkKKwl7CS8vIEZvciBSQUxJTkstQWdncmVnYXRpb24sIGFsbG93IHR3byBmcmFtZXMgaW4gb25lIGJhdGNoLgorCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKChJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIC8vIG11c3QgYmUgdW5pY2FzdCB0byBBUAorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCXJldHVybiBGQUxTRTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUbyBkbyB0aGUgZW5xdWV1ZSBvcGVyYXRpb24gYW5kIGV4dHJhY3QgdGhlIGZpcnN0IGl0ZW0gb2Ygd2FpdGluZworCQlsaXN0LiBJZiBhIG51bWJlciBvZiBhdmFpbGFibGUgc2hhcmVkIG1lbW9yeSBzZWdtZW50cyBjb3VsZCBtZWV0CisJCXRoZSByZXF1ZXN0IG9mIGV4dHJhY3RlZCBpdGVtLCB0aGUgZXh0cmFjdGVkIGl0ZW0gd2lsbCBiZSBmcmFnbWVudGVkCisJCWludG8gc2hhcmVkIG1lbW9yeSBzZWdtZW50cy4KKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFF1ZXVlCQlQb2ludGVyIHRvIFdhaXRpbmcgUXVldWUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QRGVRdWV1ZVBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgQk9PTEVBTiAgICAgICAgIGJJbnRDb250ZXh0LAorCUlOICBVQ0hBUgkJCVFJZHgsIC8qIEJ1bGtPdXRQaXBlSWQgKi8KKwlJTiAgVUNIQVIgICAgICAgICAgIE1heF9UeF9QYWNrZXRzKQoreworCVBRVUVVRV9FTlRSWSAgICBwRW50cnkgPSBOVUxMOworCVBORElTX1BBQ0tFVCAJcFBhY2tldDsKKwlORElTX1NUQVRVUyAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVQ0hBUiAgICAgICAgICAgQ291bnQ9MDsKKwlQUVVFVUVfSEVBREVSICAgcFF1ZXVlOworCVVMT05HICAgICAgICAgICBGcmVlTnVtYmVyW05VTV9PRl9UWF9SSU5HXTsKKwlVQ0hBUgkJCVF1ZUlkeCwgc1FJZHgsIGVRSWR4OworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwOworCUJPT0xFQU4JCQloYXNUeERlc2MgPSBGQUxTRTsKKwlUWF9CTEsJCQlUeEJsazsKKwlUWF9CTEsJCQkqcFR4QmxrOworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJQk9PTEVBTgkJCWZpcnN0Um91bmQ7CisJUnRtcERpYWdTdHJ1Y3QJKnBEaWFnU3RydWN0ID0gJnBBZC0+RGlhZ1N0cnVjdDsKKyNlbmRpZgorCisKKwlpZiAoUUlkeCA9PSBOVU1fT0ZfVFhfUklORykKKwl7CisJCXNRSWR4ID0gMDsKKwkJZVFJZHggPSAzOwkvLyA0IEFDcywgc3RhcnQgZnJvbSAwLgorCX0KKwllbHNlCisJeworCQlzUUlkeCA9IGVRSWR4ID0gUUlkeDsKKwl9CisKKwlmb3IgKFF1ZUlkeD1zUUlkeDsgUXVlSWR4IDw9IGVRSWR4OyBRdWVJZHgrKykKKwl7CisJCUNvdW50PTA7CisKKwkJUlQyOFhYX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIElycUZsYWdzKTsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCQlmaXJzdFJvdW5kID0gKChRdWVJZHggPT0gMCkgPyBUUlVFIDogRkFMU0UpOworI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisJCXdoaWxlICgxKQorCQl7CisJCQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwkJCXsKKwkJCQlSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAoQ291bnQgPj0gTWF4X1R4X1BhY2tldHMpCisJCQkJYnJlYWs7CisKKwkJCURFUVVFVUVfTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCWlmICgmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSA9PSBOVUxMKQorCQkJeworI2lmZGVmIERCR19ESUFHTk9TRQorCQkJCWlmIChmaXJzdFJvdW5kID09IFRSVUUpCisJCQkJCXBEaWFnU3RydWN0LT5UeFNXUXVlQ250W3BEaWFnU3RydWN0LT5BcnJheUN1cklkeF1bMF0rKzsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKwkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKworCisJCQkvLyBwcm9iZSB0aGUgUXVldWUgSGVhZAorCQkJcFF1ZXVlID0gJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF07CisJCQlpZiAoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKKwkJCXsKKwkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFR4QmxrID0gJlR4QmxrOworCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilwVHhCbGssIHNpemVvZihUWF9CTEspKTsKKwkJCS8vSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CQkvLyBEaWRuJ3QgbmVlZCBpdCBiZWNhdXNlIHdlIGFscmVhZHkgbWVtemVybyBpdC4KKwkJCXBUeEJsay0+UXVlSWR4ID0gUXVlSWR4OworCisJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisKKwkJCS8vIEVhcmx5IGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub2d1aCBUeCBSZXNvdXJjZS4KKwkJCWhhc1R4RGVzYyA9IFJUMjhYWF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgRnJlZU51bWJlcltRdWVJZHhdLCBwUGFja2V0KTsKKwkJCWlmICghaGFzVHhEZXNjKQorCQkJeworCQkJCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCsrOworCisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFR4QmxrLT5UeEZyYW1lVHlwZSA9IFR4UGt0Q2xhc3NpZmljYXRpb24ocEFkLCBwUGFja2V0KTsKKwkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOworCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTnVtKys7CisJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkJcFR4QmxrLT5wUGFja2V0ID0gcFBhY2tldDsKKwkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisKKwkJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSB8fCBwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQorCQkJeworCQkJCS8vIEVuaGFuY2UgU1cgQWdncmVnYXRpb24gTWVjaGFuaXNtCisJCQkJaWYgKE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKHBBZCwgUXVlSWR4LCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBUeEJsay0+VHhGcmFtZVR5cGUpKQorCQkJCXsKKwkJCQkJSW5zZXJ0SGVhZFF1ZXVlKHBRdWV1ZSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKwkJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRveworCQkJCQlpZigocEVudHJ5ID0gcFF1ZXVlLT5IZWFkKSA9PSBOVUxMKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJLy8gRm9yIFRYX0FNU0RVX0ZSQU1FL1RYX1JBTElOS19GUkFNRSwgTmVlZCB0byBjaGVjayBpZiBuZXh0IHBha2NldCBjYW4gZG8gYWdncmVnYXRpb24uCisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KTsKKwkJCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCQkJCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7CisJCQkJCWlmICgoaGFzVHhEZXNjID09IEZBTFNFKSB8fCAoQ2FuRG9BZ2dyZWdhdGVUcmFuc21pdChwQWQsIHBQYWNrZXQsIHBUeEJsaykgPT0gRkFMU0UpKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJLy9SZW1vdmUgdGhlIHBhY2tldCBmcm9tIHRoZSBUeFN3UXVldWUgYW5kIGluc2VydCBpbnRvIHBUeEJsaworCQkJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCQkJQVNTRVJUKHBFbnRyeSk7CisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KTsKKwkJCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTnVtKys7CisJCQkJCXBUeEJsay0+VG90YWxGcmFnTnVtICs9IFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCk7CS8vIFRoZSByZWFsIGZyYWdtZW50IG51bWJlciBtYXliZSB2YXJ5CisJCQkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJCQkJSW5zZXJ0VGFpbFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKwkJCQl9d2hpbGUoMSk7CisKKwkJCQlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID09IDEpCisJCQkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJCQl9CisKKyNpZmRlZiBSVDI4NzAKKwkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJCQlDb3VudCArPSBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI7CisKKwkJCQkvLyBEbyBIYXJkVHJhbnNtaXQgbm93LgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlTdGF0dXMgPSBTVEFIYXJkVHJhbnNtaXQocEFkLCBwVHhCbGssIFF1ZUlkeCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmIDAJLy8gV2Ugc2hvdWxkIG5vdCBicmVhayBpZiBIYXJkVHJhbnNtaXQgZmFpbGVkLiBXZWxsLCBhdCBsZWFzdCBub3cgd2Ugc2hvdWxkIG5vdCEKKwkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAvKlJUX0RFQlVHX0lORk8qLywoIlJUTVBIYXJkVHJhbnNtaXQgcmV0dXJuIGZhaWxlZCEhIVxuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisJCX0KKworCQlSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisKKyNpZmRlZiBSVDI4NzAKKwkJaWYgKCFoYXNUeERlc2MpCisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwkJaWYgKChwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XS5Td1R4UXVldWVCbG9ja0ZsYWcgPT0gVFJVRSkKKwkJCSYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA8IDEpKQorCQl7CisJCQlyZWxlYXNlTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdKTsKKwkJfQorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisJfQorCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUmF0ZQkJCVRyYW5zbWl0IHJhdGUKKwkJU2l6ZQkJCUZyYW1lIHNpemUgaW4gdW5pdHMgb2YgYnl0ZQorCisJUmV0dXJuIFZhbHVlOgorCQlEdXJhdGlvbiBudW1iZXIgaW4gdW5pdHMgb2YgdXNlYworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVU0hPUlQJUlRNUENhbGNEdXJhdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJhdGUsCisJSU4JVUxPTkcJCQlTaXplKQoreworCVVMT05HCUR1cmF0aW9uID0gMDsKKworCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIC8vIENDSworCXsKKwkJaWYgKChSYXRlID4gUkFURV8xKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkpCisJCQlEdXJhdGlvbiA9IDk2OwkvLyA3MisyNCBwcmVhbWJsZStwbGNwCisJCWVsc2UKKwkJCUR1cmF0aW9uID0gMTkyOyAvLyAxNDQrNDggcHJlYW1ibGUrcGxjcAorCisJCUR1cmF0aW9uICs9IChVU0hPUlQpKChTaXplIDw8IDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJaWYgKChTaXplIDw8IDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQorCQkJRHVyYXRpb24gKys7CisJfQorCWVsc2UgaWYgKFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkvLyBPRkRNIHJhdGVzCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwkJRHVyYXRpb24gKz0gNCAqIChVU0hPUlQpKCgxMSArIFNpemUgKiA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CisJCWlmICgoMTEgKyBTaXplICogNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCisJCQlEdXJhdGlvbiArPSA0OworCX0KKwllbHNlCS8vbWltbyByYXRlCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwl9CisKKwlyZXR1cm4gKFVTSE9SVClEdXJhdGlvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeFdJCQlQb2ludGVyIHRvIGhlYWQgb2YgZWFjaCBNUERVIHRvIEhXLgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgISEhCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBPdXRUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlDRkFDSywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKK3sKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOworCVRYV0lfU1RSVUMgCQlUeFdJOworCVBUWFdJX1NUUlVDIAlwVHhXSTsKKworCWlmIChXQ0lEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXBNYWMgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXQ0lEXTsKKworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCU5kaXNaZXJvTWVtb3J5KCZUeFdJLCBUWFdJX1NJWkUpOworCXBUeFdJID0gJlR4V0k7CisKKwlwVHhXSS0+RlJBRz0gRlJBRzsKKworCXBUeFdJLT5DRkFDSyA9IENGQUNLOworCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOworCXBUeFdJLT5BTVBEVSA9IEFNUERVOworCXBUeFdJLT5BQ0sgPSBBY2s7CisJcFR4V0ktPnR4b3A9IFR4b3Btb2RlOworCisJcFR4V0ktPk5TRVEgPSBOU2VxOworCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKKworCWlmKCBCQVNpemUgPjcgKQorCQlCQVNpemUgPTc7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gV0NJRDsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOworCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCXBUeFdJLT5DRkFDSyA9IENmQWNrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBNYWMpCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKKwkJeworCQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQorCQkJeworCQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCQlwVHhXSS0+TUlNT3BzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQorCQkJeworCQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCisJCQkJeworCQkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7CisJCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjLT5NcGR1RGVuc2l0eTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7CisJTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworfQorCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQoreworCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0OworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJCUJBU2l6ZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBUeFdJKTsKKworCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OworCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeShwVHhXSSwgVFhXSV9TSVpFKTsKKworCXBUeFdJLT5GUkFHCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJcFR4V0ktPkFDSwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJcFR4V0ktPnR4b3AJCT0gcFR4QmxrLT5GcmFtZUdhcDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCWlmIChwTWFjRW50cnkgJiYKKwkJKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkocE1hY0VudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpKQorCQlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IEJTU0lEX1dDSUQ7CisJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlwVHhXSS0+V2lyZWxlc3NDbGlJRAkJPSBwVHhCbGstPldjaWQ7CisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4V0ktPkNGQUNLCQkJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCXBUeFdJLT5BTVBEVQk9ICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgPyBUUlVFIDogRkFMU0UpOworCisJLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOworCWlmKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkKKwl7CisJCVVDSEFSCQlSQUJBT3JpSWR4ID0gMDsJLy9UaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LgorCisJCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworCQlCQVNpemUgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtSQUJBT3JpSWR4XS5CQVdpblNpemU7CisJfQorCisjaWYgMCAvLyAzKjMKKwlpZiAoQkFTaXplID4gNykKKwkJQkFTaXplID0gNzsKKyNlbmRpZgorCisJcFR4V0ktPlR4QkYgPSBwVHJhbnNtaXQtPmZpZWxkLlR4QkY7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwTWFjRW50cnkpCisJeworCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQorCQkJeworCQkJCXBUeFdJLT5NQ1MgPSA3OworCQkJCXBUeFdJLT5NSU1PcHMgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHBNYWNFbnRyeS0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWNFbnRyeS0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjRW50cnktPk1wZHVEZW5zaXR5OworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJCXsKKwkJCXBBZC0+RGlhZ1N0cnVjdC5UeERhdGFDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XSsrOworCQkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwkJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisJLy8gZm9yIHJhdGUgYWRhcGF0aW9uCisJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKK30KKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspCit7CisJUEhUVFJBTlNNSVRfU0VUVElORwkvKnBUeEhUUGh5TW9kZSwqLyBwVHJhbnNtaXQ7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisKKwkvLworCS8vIHVwZGF0ZSBUWFdJCisJLy8KKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKworCWlmIChwTWFjRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoKQorCXsKKwkJcFR4V0ktPnR4b3AgPSBJRlNfSFRUWE9QOworCisJCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCQlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKworCQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCisJCS8vIHNldCBQSUQgZm9yIFR4UmF0ZVN3aXRjaGluZworCQlwVHhXSS0+UGFja2V0SWQgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwVHhXSS0+QU1QRFUgPSAoKHBNYWNFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPT0gMCkgPyBUUlVFOiBGQUxTRSk7CisJcFR4V0ktPk1JTU9wcyA9IDA7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCisJeworCQkvLyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAoKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJCXsKKwkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQlwVHhXSS0+TUlNT3BzID0gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERCR19ESUFHTk9TRQorCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJeworCQlwQWQtPkRpYWdTdHJ1Y3QuVHhEYXRhQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF0rKzsKKwkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwl9CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYRF9TVFJVQwkJcFR4RCwKKwlJTglCT09MRUFOIAkJYldJViwKKwlJTglVQ0hBUgkJCVF1ZXVlU0VMKQoreworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCisJcFR4RC0+V0lWCT0gKGJXSVYpID8gMTogMDsKKwlwVHhELT5RU0VMPSAoUXVldWVTRUwpOworCS8vUlQyODYwYz8/ICBmaXhlZCB1c2luZyBFRENBIHF1ZXVlIGZvciB0ZXN0Li4uICBXZSBkb3VidCBRdWV1ZTEgaGFzIHByb2JsZW0uICAyMDA2LTA5LTI2IEphbgorCS8vcFR4RC0+UVNFTD0gRklGT19FRENBOworCWlmIChwQWQtPmJHZW5PbmVIQ0NBID09IFRSVUUpCisJCXBUeEQtPlFTRUw9IEZJRk9fSENDQTsKKwlwVHhELT5ETUFET05FID0gMDsKK30KKworCisvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtCisvLyAxLiBNRUFESUFfQ09OTkVDVEVECisvLyAyLiBBR0dSRUdBVElPTl9JTl9VU0VECisvLyAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkCisvLyA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBQcmV2QWRkcjEsCisJSU4JUFVDSEFSCQkJcDgwMjNoZHIpCit7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUKKwlpZiAoKHA4MDIzaGRyWzEyXSA9PSAweDg4KSAmJiAocDgwMjNoZHJbMTNdID09IDB4OGUpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgbXVsdGljYXN0L2Jyb2FkY2FzdCBmcmFtZQorCWlmIChwODAyM2hkclswXSAmIDB4MDEpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChJTkZSQV9PTihwQWQpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKSAvLyB1bmljYXN0IHRvIHNhbWUgU1RBCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCSAgIENoZWNrIHRoZSBNU0RVIEFnZ3JlZ2F0aW9uIHBvbGljeQorCTEuSFQgYWdncmVnYXRpb24gaXMgQS1NU0RVCisJMi5sZWdhYWN5IHJhdGUgYWdncmVnYXRpb24gaXMgc29mdHdhcmUgYWdncmVnYXRpb24gYnkgUmFsaW5rLgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUGVlcklzQWdncmVPbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORwkJICAgVHhSYXRlLAorCUlOCVBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KQoreworCVVMT05HCUFGbGFncyA9IChmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQgfCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKKworCWlmIChwTWFjRW50cnkgIT0gTlVMTCAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIEFGbGFncykpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCQl7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoVHhSYXRlID49IFJBVEVfNiAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlICYmICghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKKwkJewkvLyBsZWdhY3kgIFJhbGluayBBZ2dyZWdhdGlvbiBzdXBwb3J0CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNoZWNrIGFuZCBmaW5lIHRoZSBwYWNrZXQgd2FpdGluZyBpbiBTVyBxdWV1ZSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkKKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJcFF1ZXVlCQlQb2ludGVyIHRvIFdhaXRpbmcgUXVldWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1BRVUVVRV9IRUFERVIJUlRNUENoZWNrVHhTd1F1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBQVUNIQVIJCQlwUXVlSWR4KQoreworCisJVUxPTkcJTnVtYmVyOworCS8vIDIwMDQtMTEtMTUgdG8gYmUgcmVtb3ZlZC4gdGVzdCBhZ2dyZWdhdGlvbiBvbmx5CisvLwlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkgJiYgKCpwTnVtYmVyIDwgMikpCisvLwkJIHJldHVybiBOVUxMOworCisJTnVtYmVyID0gcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXS5OdW1iZXI7CisKKwlpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19WTzsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfVkk7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX0JFOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19CSzsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9IQ0NBOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0pOworCX0KKworCS8vIE5vIHBhY2tldCBwZW5kaW5nIGluIFR4IFN3IHF1ZXVlCisJKnBRdWVJZHggPSBRSURfQUNfQks7CisKKwlyZXR1cm4gKE5VTEwpOworfQorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU5OSU5HLCBzdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwkvLworCS8vIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZAorCS8vIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikKKwkvLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCisJLy8gc2V0IEJCUF9SNjYgdG8gMHgzMC8weDQwIHdoZW4gc2Nhbm5pbmcgKEFzaWNTd2l0Y2hDaGFubmVsIHdpbGwgc2V0IFI2NiBhY2NvcmRpbmcgdG8gY2hhbm5lbCB3aGVuIHNjYW5uaW5nKQorCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCS8vUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ05UTF9DU1IsIDB4MDAwZjAwMDApOwkJLy8gYWJvcnQgYWxsIFRYIHJpbmdzCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKy8vICAgIFVDSEFSCQkJSXJxU3RhdGU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU4gZG9uZSwgcmVzdW1lIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworLy8gc2FtcGxlLCBmb3IgSVJRIExPQ0sgdG8gU0VNIExPQ0sKKy8vICAgIElycVN0YXRlID0gcEFkLT5pcnFfZGlzYWJsZWQ7CisvLwlpZiAoSXJxU3RhdGUpCisvLwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworLy8gICAgZWxzZQorCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Cit9CisKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlVU0hPUlQgCQkJUGF5bG9hZFNpemU7CisJVVNIT1JUIAkJCVN1YkZyYW1lU2l6ZTsKKwlQSEVBREVSXzgwMl8zIAlwQU1TRFVzdWJoZWFkZXI7CisJVUlOVAkJCW5NU0RVOworICAgIFVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCisJUFVDSEFSCQkJcFBheWxvYWQsIHBEQSwgcFNBLCBwUmVtb3ZlZExMQ1NOQVA7CisJUE5ESVNfUEFDS0VUCXBDbG9uZVBhY2tldDsKKworCisKKwluTVNEVSA9IDA7CisKKwl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpCisJeworCisJCW5NU0RVKys7CisKKwkJLy9oZXhfZHVtcCgic3ViaGVhZGVyIiwgcERhdGEsIDY0KTsKKwkJcEFNU0RVc3ViaGVhZGVyID0gKFBIRUFERVJfODAyXzMpcERhdGE7CisJCS8vcERhdGEgKz0gTEVOR1RIXzgwMl8zOworCQlQYXlsb2FkU2l6ZSA9IHBBTVNEVXN1YmhlYWRlci0+T2N0ZXRbMV0gKyAocEFNU0RVc3ViaGVhZGVyLT5PY3RldFswXTw8OCk7CisJCVN1YkZyYW1lU2l6ZSA9IFBheWxvYWRTaXplICsgTEVOR1RIXzgwMl8zOworCisKKwkJaWYgKChEYXRhU2l6ZSA8IFN1YkZyYW1lU2l6ZSkgfHwgKFBheWxvYWRTaXplID4gMTUxOCApKQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vcHJpbnRrKCIlZCBzdWJmcmFtZTogU2l6ZSA9ICVkXG4iLCAgbk1TRFUsIFBheWxvYWRTaXplKTsKKworCQlwUGF5bG9hZCA9IHBEYXRhICsgTEVOR1RIXzgwMl8zOworCQlwREEgPSBwRGF0YTsKKwkJcFNBID0gcERhdGEgKyBNQUNfQUREUl9MRU47CisKKwkJLy8gY29udmVydCB0byA4MDIuMyBoZWFkZXIKKyAgICAgICAgQ09OVkVSVF9UT184MDJfMyhIZWFkZXI4MDJfMywgcERBLCBwU0EsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSwgcFJlbW92ZWRMTENTTkFQKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlpZiAoKEhlYWRlcjgwMl8zWzEyXSA9PSAweDg4KSAmJiAoSGVhZGVyODAyXzNbMTNdID09IDB4OEUpICkKKwkJeworCQkgICAgLy8gYXZvaWQgbG9jYWwgaGVhcCBvdmVyZmxvdywgdXNlIGR5YW5hbWljIGFsbG9jYXRpb24KKwkJICAgTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisJCSAgIG1lbW1vdmUoRWxlbS0+TXNnKyhMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0gpLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUpOworCQkgICBFbGVtLT5Nc2dMZW4gPSBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBQYXlsb2FkU2l6ZTsKKwkJICAgV3BhRUFQT0xLZXlBY3Rpb24ocEFkLCBFbGVtKTsKKwkJICAga2ZyZWUoRWxlbSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJICAgICAgICAJaWYgKHBSZW1vdmVkTExDU05BUCkKKwkgICAgICAgIAl7CisJICAgIAkJCXBQYXlsb2FkIC09IExFTkdUSF84MDJfMzsKKwkgICAgCQkJUGF5bG9hZFNpemUgKz0gTEVOR1RIXzgwMl8zOworCSAgICAJCQlOZGlzTW92ZU1lbW9yeShwUGF5bG9hZCwgJkhlYWRlcjgwMl8zWzBdLCBMRU5HVEhfODAyXzMpOworCSAgICAgICAgCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCXBDbG9uZVBhY2tldCA9IENsb25lUGFja2V0KHBBZCwgcFBhY2tldCwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJaWYgKHBDbG9uZVBhY2tldCkKKwkJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBDbG9uZVBhY2tldCwgUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCisKKwkJLy8gQS1NU0RVIGhhcyBwYWRkaW5nIHRvIG11bHRpcGxlIG9mIDQgaW5jbHVkaW5nIHN1YmZyYW1lIGhlYWRlci4KKwkJLy8gYWxpZ24gU3ViRnJhbWVTaXplIHVwIHRvIG11bHRpcGxlIG9mIDQKKwkJU3ViRnJhbWVTaXplID0gKFN1YkZyYW1lU2l6ZSszKSYofjB4Myk7CisKKworCQlpZiAoU3ViRnJhbWVTaXplID4gMTUyOCB8fCBTdWJGcmFtZVNpemUgPCAzMikKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoRGF0YVNpemUgPiBTdWJGcmFtZVNpemUpCisJCXsKKwkJCXBEYXRhICs9IFN1YkZyYW1lU2l6ZTsKKwkJCURhdGFTaXplIC09IFN1YkZyYW1lU2l6ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIGVuZCBvZiBBLU1TRFUKKwkJCURhdGFTaXplID0gMDsKKwkJfQorCX0KKworCS8vIGZpbmFsbHkgcmVsZWFzZSBvcmlnaW5hbCByeCBwYWNrZXQKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gbk1TRFU7Cit9CisKKworVUlOVCBCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQVUNIQVIJCQlwRGF0YTsKKwlVU0hPUlQJCQlEYXRhU2l6ZTsKKwlVSU5UCQkJbk1TRFUgPSAwOworCisJcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJRGF0YVNpemUgPSAoVVNIT1JUKSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCW5NU0RVID0gZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UocEFkLCBwUGFja2V0LCBwRGF0YSwgRGF0YVNpemUpOworCisJcmV0dXJuIG5NU0RVOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTG9vayB1cCB0aGUgTUFDIGFkZHJlc3MgaW4gdGhlIE1BQyB0YWJsZS4gUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgorCVJldHVybjoKKwkJcEVudHJ5IC0gcG9pbnRlciB0byB0aGUgTUFDIGVudHJ5OyBOVUxMIGlzIG5vdCBmb3VuZAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUxvb2t1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlQVUNIQVIgcEFkZHIpCit7CisJVUxPTkcgSGFzaElkeDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7CisKKwlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKworCXdoaWxlIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaCkpCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJfQorCisJcmV0dXJuIHBFbnRyeTsKK30KKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydEVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIJCQlwQWRkciwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCUlOIEJPT0xFQU4JQ2xlYW5BbGwpCit7CisJVUNIQVIgSGFzaElkeDsKKwlpbnQgaSwgRmlyc3RXY2lkOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7CisKKwkvLyBpZiBGVUxMLCByZXR1cm4KKwlpZiAocEFkLT5NYWNUYWIuU2l6ZSA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIE5VTEw7CisKKwlGaXJzdFdjaWQgPSAxOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCQlGaXJzdFdjaWQgPSAyOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gYWxsb2NhdGUgb25lIE1BQyBlbnRyeQorCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJZm9yIChpID0gRmlyc3RXY2lkOyBpPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSAgIC8vIHNraXAgZW50cnkjMCBzbyB0aGF0ICJlbnRyeSBpbmRleCA9PSBBSUQiIGZvciBmYXN0IGxvb2t1cAorCXsKKwkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKKwkJaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gRkFMU0UpICYmCisJCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzV0RTID09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpPT0gRkFMU0UpICYmCisJCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzTWVzaCA9PSBGQUxTRSkKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCSYmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNEbHMgPT0gRkFMU0UpCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkpCisJCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQkJaWYgKENsZWFuQWxsID09IFRSVUUpCisJCQl7CisJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKwkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBSQVRFXzExOworCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1BQ19UQUJMRV9FTlRSWSkpOworCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gMDsKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJfQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKGFwaWR4ID49IE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMpCisJCQl7CisJCQkJcEVudHJ5LT5WYWxpZEFzQ0xJID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzV0RTID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzQXBDbGkgPSBGQUxTRTsKKwkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzRGxzID0gVFJVRTsKKwkJCQlwRW50cnktPmlzQ2FjaGVkID0gRkFMU0U7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5WYWxpZEFzQ0xJID0gVFJVRTsKKwkJCQkJcEVudHJ5LT5WYWxpZEFzV0RTID0gRkFMU0U7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7CisJCQkJCXBFbnRyeS0+VmFsaWRBc01lc2ggPSBGQUxTRTsKKwkJCQkJcEVudHJ5LT5WYWxpZEFzRGxzID0gRkFMU0U7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJfQorCisJCQlwRW50cnktPmJJQW1CYWRBdGhlcm9zID0gRkFMU0U7CisJCQlwRW50cnktPnBBZCA9IHBBZDsKKwkJCXBFbnRyeS0+Q01UaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworCQkJcEVudHJ5LT5SU05JRV9MZW4gPSAwOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5SX0NvdW50ZXIsIHNpemVvZihwRW50cnktPlJfQ291bnRlcikpOworCQkJcEVudHJ5LT5SZVRyeUNvdW50ZXIgPSBQRUVSX01TRzFfUkVUUllfVElNRVJfQ1RSOworCisJCQlpZiAocEVudHJ5LT5WYWxpZEFzTWVzaCkKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gpOworCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzQXBDbGkpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSk7CisJCQllbHNlIGlmIChwRW50cnktPlZhbGlkQXNXRFMpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzRGxzKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWVsc2UKKwkJCQlwRW50cnktPmFwaWR4ID0gYXBpZHg7CisKKwkJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisJCQkJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQl9CisKKwkJCXBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9ORUdPVElBVElORzsKKwkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gMDsKKwkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAocEVudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpCisJCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworI2VuZGlmIC8vUU9TX0RMU19TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJcEVudHJ5LT5QTUtJRF9DYWNoZUlkeCA9IEVOVFJZX05PVF9GT1VORDsKKwkJCUNPUFlfTUFDX0FERFIocEVudHJ5LT5BZGRyLCBwQWRkcik7CisJCQlwRW50cnktPlNzdCA9IFNTVF9OT1RfQVVUSDsKKwkJCXBFbnRyeS0+QXV0aFN0YXRlID0gQVNfTk9UX0FVVEg7CisJCQlwRW50cnktPkFpZCA9IChVU0hPUlQpaTsgIC8vMDsKKwkJCXBFbnRyeS0+Q2FwYWJpbGl0eUluZm8gPSAwOworCQkJcEVudHJ5LT5Qc01vZGUgPSBQV1JfQUNUSVZFOworCQkJcEVudHJ5LT5Qc1FJZGxlQ291bnQgPSAwOworCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CisJCQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBFbnRyeS0+UHNRdWV1ZSk7CisKKworCQkJcEFkLT5NYWNUYWIuU2l6ZSArKzsKKwkJCS8vIEFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQorCQkJUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydEVudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIsaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCisJaWYgKHBFbnRyeSkKKwl7CisJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJeworCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCX0KKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXJldHVybiBwRW50cnk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpCit7CisJVVNIT1JUIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnksICpwUHJldkVudHJ5LCAqcFByb2JlRW50cnk7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJLy9VU0hPUlQJb2Zmc2V0OwkvLyB1bnVzZWQgdmFyaWFibGUKKwkvL1VDSEFSCWo7CQkJLy8gdW51c2VkIHZhcmlhYmxlCisKKwlpZiAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwkvL3BFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07CisKKwlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKyAJCXx8IHBFbnRyeS0+VmFsaWRBc0RscworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkpKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisKKwkJCS8vIERlbGV0ZSB0aGlzIGVudHJ5IGZyb20gQVNJQyBvbi1jaGlwIFdDSUQgVGFibGUKKwkJCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgd2NpZCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIGZyZWUgcmVzb3VyY2VzIG9mIEJBCisJCQlCQVNlc3Npb25UZWFyRG93bkFMTChwQWQsIHBFbnRyeS0+QWlkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJCQlwUHJldkVudHJ5ID0gTlVMTDsKKwkJCXBQcm9iZUVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKwkJCUFTU0VSVChwUHJvYmVFbnRyeSk7CisKKwkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCWRvCisJCQl7CisJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQl7CisJCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJCXsKKwkJCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQkJLy8gbm90IGZvdW5kICEhIQorCQkJQVNTRVJUKHBQcm9iZUVudHJ5ICE9IE5VTEwpOworCisJCQlSVDI4WFhfU1RBX0VOVFJZX0tFWV9ERUwocEFkLCBCU1MwLCB3Y2lkKTsKKworCisJCWlmIChwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nICE9IEVBUE9MX1NUQVJUX0RJU0FCTEUpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5FbnF1ZXVlU3RhcnRGb3JQU0tUaW1lciwgJkNhbmNlbGxlZCk7CisJCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJfQorCisKKyAgIAkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1BQ19UQUJMRV9FTlRSWSkpOworCQkJcEFkLT5NYWNUYWIuU2l6ZSAtLTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlRGVsZXRlRW50cnkxIC0gVG90YWw9ICVkXG4iLCBwQWQtPk1hY1RhYi5TaXplKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoIlxuJXM6IEltcG9zc2libGUgV2NpZCA9ICVkICEhISEhXG4iLCBfX0ZVTkNUSU9OX18sIHdjaWQpOworCQl9CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCS8vUmVzZXQgb3BlcmF0aW5nIG1vZGUgd2hlbiBubyBTdGEuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMCkKKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IDA7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCAvKnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSovLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCAvKnBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YqLyk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgcmVzZXQgdGhlIGVudGlyZSBNQUMgdGFibGUuIEFsbCBwYWNrZXRzIHBlbmRpbmcgaW4KKwkJdGhlIHBvd2VyLXNhdmluZyBxdWV1ZXMgYXJlIGZyZWVkIGhlcmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNYWNUYWJsZVJlc2V0KAorCUlOICBQUlRNUF9BREFQVEVSICBwQWQpCit7CisJaW50ICAgICAgICAgaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlUmVzZXRcbiIpKTsKKwkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQorCSAgIHsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKKwkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgaSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9IEZBTFNFOworCisKKworI2lmZGVmIFJUMjg3MAorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyLCA2KTsKKwkJCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBpKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKKwlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKKwlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKKwlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAorCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCit7CisJQ09QWV9NQUNfQUREUihBc3NvY1JlcS0+QWRkciwgcEFkZHIpOworCS8vIEFkZCBtYXNrIHRvIHN1cHBvcnQgODAyLjExYiBtb2RlIG9ubHkKKwlBc3NvY1JlcS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87IC8vIG5vdCBjZi1wb2xsYWJsZSwgbm90IGNmLXBvbGwtcmVxdWVzdAorCUFzc29jUmVxLT5UaW1lb3V0ID0gVGltZW91dDsKKwlBc3NvY1JlcS0+TGlzdGVuSW50diA9IExpc3RlbkludHY7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKKwlJTiBQVUNIQVIgcEFkZHIsCisJSU4gVVNIT1JUIFJlYXNvbikKK3sKKwlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7CisJRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgdGhlIG91dCBnb2luZyBmcmFtZSwgaWYgdGhpcyBpcyBhbiBESENQIG9yIEFSUCBkYXRhZ3JhbQorCXdpbGwgYmUgZHVwbGljYXRlIGFub3RoZXIgZnJhbWUgYXQgbG93IGRhdGEgcmF0ZSB0cmFuc21pdC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwUGFja2V0IAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJVG8gYmUgZHVwbGljYXRlIGF0IExvdyBkYXRhIHJhdGUgdHJhbnNtaXQuICgxbWIpCisJCUZBTFNFCQlEbyBub3RoaW5nLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJCU1BQyBoZWFkZXIgKyBJUCBIZWFkZXIgKyBVRFAgSGVhZGVyCisJCSAgMTQgQnl0ZXMJICAyMCBCeXRlcworCisJCVVEUCBIZWFkZXIKKwkJMDB8MDF8MDJ8MDN8MDR8MDV8MDZ8MDd8MDh8MDl8MTB8MTF8MTJ8MTN8MTR8MTV8CisJCQkJCQlTb3VyY2UgUG9ydAorCQkxNnwxN3wxOHwxOXwyMHwyMXwyMnwyM3wyNHwyNXwyNnwyN3wyOHwyOXwzMHwzMXwKKwkJCQkJRGVzdGluYXRpb24gUG9ydAorCisJCXBvcnQgMHg0MyBtZWFucyBCb290c3RyYXAgUHJvdG9jb2wsIHNlcnZlci4KKwkJUG9ydCAweDQ0IG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgY2xpZW50LgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitCT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKKwlVTE9ORwkJCU51bWJlck9mQnl0ZXNSZWFkID0gMDsKKwlVTE9ORwkJCUN1cnJlbnRPZmZzZXQgPSAwOworCVBWT0lECQkJcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKKwlVSU5UCQkJTmRpc0J1ZmZlckxlbmd0aDsKKwlQVUNIQVIJCQlwU3JjOworCVVTSE9SVAkJCVByb3RvY29sOworCVVDSEFSCQkJQnl0ZU9mZnNldDM2ID0gMDsKKwlVQ0hBUgkJCUJ5dGVPZmZzZXQzOCA9IDA7CisJQk9PTEVBTiAJCVJlYWRGaXJzdFBhcm0gPSBUUlVFOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sIChQVUNIQVIgKikmcFZpcnR1YWxBZGRyZXNzLCAmTmRpc0J1ZmZlckxlbmd0aCk7CisKKwlOdW1iZXJPZkJ5dGVzUmVhZCArPSBOZGlzQnVmZmVyTGVuZ3RoOworCXBTcmMgPSAoUFVDSEFSKSBwVmlydHVhbEFkZHJlc3M7CisJUHJvdG9jb2wgPSAqKHBTcmMgKyAxMikgKiAyNTYgKyAqKHBTcmMgKyAxMyk7CisKKwkvLworCS8vIENoZWNrIERIQ1AgJiBCT09UUCBwcm90b2NvbAorCS8vCisJd2hpbGUgKE51bWJlck9mQnl0ZXNSZWFkIDw9IFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGgpCisJeworCQlpZiAoKE51bWJlck9mQnl0ZXNSZWFkID49IDM1KSAmJiAoUmVhZEZpcnN0UGFybSA9PSBUUlVFKSkKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM1IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzYgPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCVJlYWRGaXJzdFBhcm0gPSBGQUxTRTsKKwkJfQorCisJCWlmIChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNykKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM3IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzggPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCS8vRW5kIG9mIFJlYWQKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBDaGVjayBmb3IgREhDUCAmIEJPT1RQIHByb3RvY29sCisJaWYgKChCeXRlT2Zmc2V0MzYgIT0gMHg0NCkgfHwgKEJ5dGVPZmZzZXQzOCAhPSAweDQzKSkKKwkJeworCQkvLworCQkvLyAyMDU0IChoZXggMDgwNikgZm9yIEFSUCBkYXRhZ3JhbXMKKwkJLy8gaWYgdGhpcyBwYWNrZXQgaXMgbm90IEFSUCBkYXRhZ3JhbXMsIHRoZW4gZG8gbm90aGluZworCQkvLyBBUlAgZGF0YWdyYW1zIHdpbGwgYWxzbyBiZSBkdXBsaWNhdGUgYXQgMW1iIGJyb2FkY2FzdCBmcmFtZXMKKwkJLy8KKwkJaWYgKFByb3RvY29sICE9IDB4MDgwNiApCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCXJldHVybiBUUlVFOworfQorCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVVTSE9SVAlUeXBlTGVuOworCVVDSEFSCUJ5dGUwLCBCeXRlMTsKKwlQVUNIQVIJcFNyY0J1ZjsKKwlVSU5UMzIJcGt0TGVuOworCVVJTlQxNiAJc3JjUG9ydCwgZHN0UG9ydDsKKwlCT09MRUFOCXN0YXR1cyA9IFRSVUU7CisKKworCXBTcmNCdWYgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcGt0TGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwlBU1NFUlQocFNyY0J1Zik7CisKKwlSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMocFBhY2tldCwgMCk7CisKKwkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKKwlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpICsgcFNyY0J1ZlsxM107CisKKwlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgorCisJaWYgKFR5cGVMZW4gPD0gMTUwMCkKKwl7CS8vIDgwMi4zLCA4MDIuMyBMTEMKKwkJLyoKKwkJCURlc3RNQUMoNikgKyBTcmNNQUMoNikgKyBMZW5naHQoMikgKworCQkJRFNBUCgxKSArIFNTQVAoMSkgKyBDb250cm9sKDEpICsKKwkJCWlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KKwkJCQk9PiArIFNOQVAgKDUsIE9yaWdpbmF0aW9uSUQoMykgKyBldGhlclR5cGUoMikpCisJCSovCisJCWlmIChwU3JjQnVmWzBdID09IDB4QUEgJiYgcFNyY0J1ZlsxXSA9PSAweEFBICYmIHBTcmNCdWZbMl0gPT0gMHgwMykKKwkJeworCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCA2LCAmQnl0ZTAsICZCeXRlMSk7CisJCQlSVE1QX1NFVF9QQUNLRVRfTExDU05BUChwUGFja2V0LCAxKTsKKwkJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQlwU3JjQnVmICs9IDg7IC8vIFNraXAgdGhpcyBMTEMvU05BUCBoZWFkZXIKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vSXQganVzdCBoYXMgMy1ieXRlIExMQyBoZWFkZXIsIG1heWJlIGEgbGVnYWN5IGV0aGVyIHR5cGUgZnJhbWUuIHdlIGRpZG4ndCBoYW5kbGUgaXQuCisJCX0KKwl9CisKKwkvLyBJZiBpdCdzIGEgVkxBTiBwYWNrZXQsIGdldCB0aGUgcmVhbCBUeXBlL0xlbmd0aCBmaWVsZC4KKwlpZiAoVHlwZUxlbiA9PSAweDgxMDApCisJeworCQkvKiAweDgxMDAgbWVhbnMgVkxBTiBwYWNrZXRzICovCisKKwkJLyogRGVzdC4gTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKKwkJICAgU291cmNlIE1BQyBBZGRyZXNzICg2LWJ5dGVzKSArCisJCSAgIExlbmd0aC9UeXBlID0gODAyLjFRIFRhZyBUeXBlICgyLWJ5dGUpICsKKwkJICAgVGFnIENvbnRyb2wgSW5mb3JtYXRpb24gKDItYnl0ZXMpICsKKwkJICAgTGVuZ3RoIC8gVHlwZSAoMi1ieXRlcykgKworCQkgICBkYXRhIHBheWxvYWQgKDAtbiBieXRlcykgKworCQkgICBQYWQgKDAtcCBieXRlcykgKworCQkgICBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoNC1ieXRlcykgKi8KKworCQlSVE1QX1NFVF9QQUNLRVRfVkxBTihwUGFja2V0LCAxKTsKKwkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCAyLCAmQnl0ZTAsICZCeXRlMSk7CisJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisKKwkJcFNyY0J1ZiArPSA0OyAvLyBTa2lwIHRoZSBWTEFOIEhlYWRlci4KKwl9CisKKwlzd2l0Y2ggKFR5cGVMZW4pCisJeworCQljYXNlIDB4MDgwMDoKKwkJCXsKKwkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CisJCQkJaWYgKCoocFNyY0J1ZiArIDkpID09IDB4MTEpCisJCQkJewkvLyB1ZHAgcGFja2V0CisJCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsJLy8gMTQgZm9yIGV0aGVybmV0IGhlYWRlciwgMjAgZm9yIElQIGhlYWRlcgorCisJCQkJCXBTcmNCdWYgKz0gMjA7CS8vIFNraXAgdGhlIElQIGhlYWRlcgorCQkJCQlzcmNQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopcFNyY0J1ZikpOworCQkJCQlkc3RQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopKHBTcmNCdWYgKzIpKSk7CisKKwkJCQkJaWYgKChzcmNQb3J0PT0weDQ0ICYmIGRzdFBvcnQ9PTB4NDMpIHx8IChzcmNQb3J0PT0weDQzICYmIGRzdFBvcnQ9PTB4NDQpKQorCQkJCQl7CS8vSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0CisJCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MDgwNjoKKwkJCXsKKwkJCQkvL0FSUCBQYWNrZXQuCisJCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDg4OGU6CisJCQl7CisJCQkJLy8gRUFQT0wgUGFja2V0LgorCQkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gRkFMU0U7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKKworCitWT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKKwkJeworCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7CisJQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKKwlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOworCisJaWYgKHJzc2kwICE9IDApCisJeworCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOworCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOworCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOworCX0KKworCWlmIChyc3NpMSAhPSAwKQorCXsKKwkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKKwkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKKwkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKKwl9CisKKwlpZiAocnNzaTIgIT0gMCkKKwl7CisJCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7CisJCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOworCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOworCX0KK30KKworCisKKy8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKworCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKKwkvLyAyLiByZW1vdmUgTExDCisJLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAorCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikKKwl7CisjaWYgMCAvLyBzYW1wbGUgdGFrZSBvZmYsIGZvciBtdWx0aXBsZSBjYXJkIGRlc2lnbgorCQlzdGF0aWMgaW50IGVycl9zaXplOworCisJCWVycl9zaXplKys7CisJCWlmIChlcnJfc2l6ZSA+IDIwKQorCQl7CisJCQkgcHJpbnRrKCJMZWdhY3kgRGF0YVNpemUgPSAlZFxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJCQkgaGV4X2R1bXAoIjgwMi4zIEhlYWRlciIsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworCQkJIGhleF9kdW1wKCJQYXlsb2FkIiwgcFJ4QmxrLT5wRGF0YSwgNjQpOworCQkJIGVycl9zaXplID0gMDsKKwkJfQorI2VuZGlmCisKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKworCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisjaWZkZWYgUlQyODcwCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKQorCXsKKwkJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnk7CisJCVVMT05HCQkJCU5vdzMyOworCQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKKwkJVUNIQVIJCQkJVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOworCQlVU0hPUlQJCQkJSWR4OworCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKworCQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQl7CisJCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCQlpZiAoSWR4ICE9IDApCisJCQl7CisJCQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJCQkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCisJCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCQkJCWlmICgocEJBRW50cnktPmxpc3QucWxlbiA+IDApICYmCisJCQkJCSBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkKKwkgICAJCQkJKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KCk6Zmx1c2ggcmVvcmRlcmluZ190aW1lb3V0X21wZHVzISBSeFdJLT5GbGFncz0lZCwgcFJ4V0kuVElEPSVkLCBSeEQtPkFNUERVPSVkIVxuIiwgcFJ4QmxrLT5GbGFncywgcFJ4QmxrLT5wUnhXSS0+VElELCBwUnhCbGstPlJ4RC5BTVBEVSk7CisJCQkJCWhleF9kdW1wKCJEdW1wIHRoZSBsZWdhY3kgUGFja2V0OiIsIEdFVF9PU19QS1RfREFUQVBUUihwUnhCbGstPnBSeFBhY2tldCksIDY0KTsKKwkJCQkJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkvLworCS8vIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseQorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKy8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKK1ZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwl7CisJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCisJCXsKKwkJCS8vIGhhbmRsZSBBLU1TRFUKKwkJCUluZGljYXRlX0FNU0RVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJfQorfQorCisKK1ZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisJVUlOVDE2CQkJTXNkdTJTaXplOworCVVJTlQxNiAJCQlQYXlsb2FkMVNpemUsIFBheWxvYWQyU2l6ZTsKKwlQVUNIQVIgCQkJcERhdGEyOworCVBORElTX1BBQ0tFVAlwUGFja2V0MiA9IE5VTEw7CisKKworCisJTXNkdTJTaXplID0gKihwUnhCbGstPnBEYXRhKSArICgqKHBSeEJsay0+cERhdGErMSkgPDwgOCk7CisKKwlpZiAoKE1zZHUyU2l6ZSA8PSAxNTM2KSAmJiAoTXNkdTJTaXplIDwgcFJ4QmxrLT5EYXRhU2l6ZSkpCisJeworCQkvKiBza2lwIHR3byBieXRlIE1TRFUyIGxlbiAqLworCQlwUnhCbGstPnBEYXRhICs9IDI7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKKwl9CisJZWxzZQorCXsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCS8vIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZQorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ICsrOworCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7CisJUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOworCisJcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlwUGFja2V0MiA9IGR1cGxpY2F0ZV9wa3QocEFkLCAocERhdGEyLUxFTkdUSF84MDJfMyksIExFTkdUSF84MDJfMywgcERhdGEyLCBQYXlsb2FkMlNpemUsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmICghcFBhY2tldDIpCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJLy8gdXBkYXRlIHBheWxvYWQgc2l6ZSBvZiAxc3QgcGFja2V0CisJcFJ4QmxrLT5EYXRhU2l6ZSA9IFBheWxvYWQxU2l6ZTsKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocFBhY2tldDIpCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCisJewkJCQkJCQkJXAorCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCisJCV9mcmFnRnJhbWUuU2VxdWVuY2UgPSAwOwlcCisJCV9mcmFnRnJhbWUuTGFzdEZyYWcgPSAwOwlcCisJCV9mcmFnRnJhbWUuRmxhZ3MgPSAwOwkJXAorCX0KKworCitQTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVQ0hBUgkJCSpwRnJhZ0J1ZmZlciA9IE5VTEw7CisJQk9PTEVBTiAJCWJSZWFzc0RvbmUgPSBGQUxTRTsKKwlVQ0hBUgkJCUhlYWRlclJvb20gPSAwOworCisKKwlBU1NFUlQocEhlYWRlcik7CisKKwlIZWFkZXJSb29tID0gcERhdGEgLSAoVUNIQVIgKilwSGVhZGVyOworCisJLy8gUmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cworCWlmIChwSGVhZGVyLT5GcmFnID09IDApCQkvLyBGcmFnLiBOdW1iZXIgaXMgMCA6IEZpcnN0IGZyYWcgb3Igb25seSBvbmUgcGt0CisJeworCQkvLyB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKKwkJeworCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOworCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsCSBwSGVhZGVyLCBwQWQtPkZyYWdGcmFtZS5SeFNpemUpOworCQkJcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UgPSBwSGVhZGVyLT5TZXF1ZW5jZTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gU2hvdWxkIGJlIDAKKwkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9PSAwKTsKKwkJCWdvdG8gZG9uZTsJLy8gZW5kIG9mIHByb2Nlc3NpbmcgdGhpcyBmcmFtZQorCQl9CisJfQorCWVsc2UJLy9NaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQKKwl7CisJCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8CisJCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCisJCXsKKwkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOworCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJfQorCQllbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpCisJCXsKKwkJCS8vIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7CisJCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQl9CisKKyAgICAgICAgLy8KKwkJLy8gQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LgorCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuCisJCS8vCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwgcEhlYWRlci0+U2VxdWVuY2UsIHBIZWFkZXItPkZyYWcpKTsKKwkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCX0KKworCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSByZS1hc3NlbWJseSBidWZmZXIKKwkJTmRpc01vdmVNZW1vcnkoKHBGcmFnQnVmZmVyICsgcEFkLT5GcmFnRnJhbWUuUnhTaXplKSwgcERhdGEsIERhdGFTaXplKTsKKwkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICArPSBEYXRhU2l6ZTsKKwkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyCisKKwkJLy8gTGFzdCBmcmFnbWVudAorCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCisJCXsKKwkJCWJSZWFzc0RvbmUgPSBUUlVFOworCQl9CisJfQorCitkb25lOgorCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyByZXR1cm4gZGVmcmFnbWVudGVkIHBhY2tldCBpZiBwYWNrZXQgaXMgcmVhc3NlbWJsZWQgY29tcGxldGVseQorCS8vIG90aGVyd2lzZSByZXR1cm4gTlVMTAorCWlmIChiUmVhc3NEb25lKQorCXsKKwkJUE5ESVNfUEFDS0VUIHBOZXdGcmFnUGFja2V0OworCisJCS8vIGFsbG9jYXRlIGEgbmV3IHBhY2tldCBidWZmZXIgZm9yIGZyYWdtZW50CisJCXBOZXdGcmFnUGFja2V0ID0gUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCQlpZiAocE5ld0ZyYWdQYWNrZXQpCisJCXsKKwkJCS8vIHVwZGF0ZSBSeEJsaworCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OworCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKKwkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOworCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CisJCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcFJldFBhY2tldDsKK30KKworCitWT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJVUlOVAkJCW5NU0RVOworCisJdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisJbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKK30KKworVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocEVudHJ5ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9Cit9CisKKyNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCitWT0lEIFJlU3luY0JlYWNvblRpbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisKKwlVSU5UMzIgIE9mZnNldDsKKworCisJT2Zmc2V0ID0gKHBBZC0+VGJ0dFRpY2tDb3VudCkgJSAoQkNOX1RCVFRfT0ZGU0VUKTsKKworCXBBZC0+VGJ0dFRpY2tDb3VudCsrOworCisJLy8KKwkvLyBUaGUgdXBkYXRlZCBCZWFjb25JbnRlcnZhbCBWYWx1ZSB3aWxsIGFmZmVjdCBCZWFjb24gSW50ZXJ2YWwgYWZ0ZXIgdHdvIFRCVFQKKwkvLyBiZWFjYXN1ZSB0aGUgb3JpZ2luYWwgQmVhY29uSW50ZXJ2YWwgaGFkIGJlZW4gbG9hZGVkIGludG8gbmV4dCBUQlRUX1RJTUVSCisJLy8KKwlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMikpCisJeworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDEgOwkvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgPSA2NHVzCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCX0KKwllbHNlCisJeworCQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMSkpCisJCXsKKwkJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfMjg3MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfMjg3MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzAwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMKQEAgLTAsMCArMSw5NjMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKy8qCisgICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFVTQi1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgorCWluIG90aGVyIGZpbGVzLgorCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKKy8qCisJV2UgY2FuIGRvIGNvcHkgdGhlIGZyYW1lIGludG8gcFR4Q29udGV4dCB3aGVuIG1hdGNoIGZvbGxvd2luZyBjb25kaXRpb25zLgorCQk9PgorCQk9PgorCQk9PgorKi8KK3N0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUnRtcFVTQkNhbkRvV3JpdGUoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIFVDSEFSCQkJUXVlSWR4LAorCUlOIEhUX1RYX0NPTlRFWFQgCSpwSFRUWENvbnRleHQpCit7CisJTkRJU19TVEFUVVMJY2FuV3JpdGUgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisKKwlpZiAoKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMxIVxuIikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwl9CisJZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9PSA4KSAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uIDwgTE9DQUxfVFhCVUZfU0laRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMyIVxuIikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwl9CisJZWxzZSBpZiAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMyFcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJY2FuV3JpdGUgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCisJcmV0dXJuIGNhbldyaXRlOworfQorCisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKworCS8vIER1bW15IGZ1bmN0aW9uLiBTaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorCXJldHVybiAwOworCit9CisKK1VTSE9SVAlSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYWdOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKwlVU0hPUlQJCQlod0hkckxlbjsJLy8gVGhlIGh3SGRyTGVuIGNvbnNpc3Qgb2YgODAyLjExIGhlYWRlciBsZW5ndGggcGx1cyB0aGUgaGVhZGVyIHBhZGRpbmcgbGVuZ3RoLgorCVVJTlQzMgkJCWZpbGxPZmZzZXQ7CisJVFhJTkZPX1NUUlVDCSpwVHhJbmZvOworCVRYV0lfU1RSVUMJCSpwVHhXSTsKKwlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQgPSBOVUxMOworCVVDSEFSCQkJUXVlSWR4OworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlVSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7CisJQk9PTEVBTgkJCVR4UUxhc3RSb3VuZCA9IEZBTFNFOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwlpZihmcmFnTnVtID09IDApCisJeworCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhpcyBidWxrLW91dCBiYXRjaC4KKwkJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7CisKKwkJCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KKwkJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQkJeworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlmaWxsT2Zmc2V0ICs9IDg7CisJCQl9CisJCQlwVHhCbGstPlByaXYgPSAwOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4oU3RhdHVzKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLgorCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJZmlsbE9mZnNldCArPSBwVHhCbGstPlByaXY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4oU3RhdHVzKTsKKwkJfQorCX0KKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSksIFRYSU5GT19TSVpFKTsKKwlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKwlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkvLyBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7CisJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCS8vIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQKKwlETUFIZHJMZW4gPSBUWFdJX1NJWkUgKyBod0hkckxlbjsKKwlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLy8gcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudAorCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOworCisJcFR4QmxrLT5Qcml2ICs9IChUWElORk9fU0laRSArIFVTQkRNQXBrdExlbik7CisKKwkvLyBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkCisJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoVVNCRE1BcGt0TGVuKSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKKworCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQorCXsKKwkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDA7CisJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2ICsgMzkwNik+IE1BWF9UWEJVTEtfTElNSVQpCisJCXsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKKwkJCVR4UUxhc3RSb3VuZCA9IFRSVUU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDE7CisJfQorCisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBXaXJlbGVzc1BhY2tldCArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKworCS8vCVplcm8gdGhlIGxhc3QgcGFkZGluZy4KKwlwV2lyZWxlc3NQYWNrZXQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKKwl7CisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkvLyBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbi4gMzkwNiB1c2VkIHRvIHByZXZlbnQgdGhlIE5leHRCdWxrT3V0IGlzIGEgQS1SQUxJTksvQS1NU0RVIEZyYW1lLgorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gcFR4QmxrLT5Qcml2OworCQlpZiAoVHhRTGFzdFJvdW5kID09IFRSVUUpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCisJCS8vIEZpbmFsbHksIHNldCBiQ3VyV3JpdGluZyBhcyBGQUxTRQorCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkvLyBzdWNjZWVkIGFuZCByZWxlYXNlIHRoZSBza2IgYnVmZmVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0KKworCisJcmV0dXJuKFN0YXR1cyk7CisKK30KKworCitVU0hPUlQgUnRtcFVTQl9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCVVTSE9SVAkJCWh3SGRyTGVuOworCVVJTlQzMgkJCWZpbGxPZmZzZXQ7CisJVFhJTkZPX1NUUlVDCSpwVHhJbmZvOworCVRYV0lfU1RSVUMJCSpwVHhXSTsKKwlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQ7CisJVUNIQVIJCQlRdWVJZHg7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlORElTX1NUQVRVUwkJU3RhdHVzOworCVVJTlQzMgkJCVVTQkRNQXBrdExlbiA9IDAsIERNQUhkckxlbiwgcGFkZGluZzsKKwlCT09MRUFOCQkJYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCisJLy8gRm9yIFVTQiwgZGlkbid0IG5lZWQgUENJX01BUF9TSU5HTEUoKQorCS8vU3JjQnVmUEEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIChjaGFyICopIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKworCisJLy8gQ2hlY2sgcmluZyBmdWxsLgorCVN0YXR1cyA9IFJ0bXBVU0JDYW5Eb1dyaXRlKHBBZCwgUXVlSWR4LCBwSFRUWENvbnRleHQpOworCWlmKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7CisKKwkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCQlwVHhXST0gKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCQkvLyBSZXNlcnZlIHNwYWNlIGZvciA4IGJ5dGVzIHBhZGRpbmcuCisJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQl7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCWZpbGxPZmZzZXQgKz0gODsKKwkJfQorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJLy8gY29weSBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKKwkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQkvLyBCdWlsZCBvdXIgVVJCIGZvciBVU0JECisJCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOworCQlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcGFkZGluZyA9ICg0IC0gKFVTQkRNQXBrdExlbiAlIDQpKSAmIDB4MDM7CS8vIHJvdW5kIHVwIHRvIDQgYnl0ZSBhbGlnbm1lbnQKKwkJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwkJcFR4QmxrLT5Qcml2ID0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKworCQkvLyBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkCisJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKFVTQkRNQXBrdExlbiksIEZBTFNFLCBGSUZPX0VEQ0EsIEZBTFNFIC8qTmV4dFZhbGlkKi8sICBGQUxTRSk7CisKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2ICsgcFR4QmxrLT5Qcml2KSA+IE1BWF9UWEJVTEtfTElNSVQpCisJCXsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKKwkJCWJUeFFMYXN0Um91bmQgPSBUUlVFOworCQl9CisJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisKKwkJLy8gV2UgdW5sb2NrIGl0IGhlcmUgdG8gcHJldmVudCB0aGUgZmlyc3QgOCBieXRlcyBtYXliZSBvdmVyLXdyaXRlZCBpc3N1ZS4KKwkJLy8JMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Y29udGV4dC4KKwkJLy8JMi4gQW4gaW50ZXJydXB0IGJyZWFrIG91ciByb3V0aW5lIGFuZCBoYW5kbGUgYnVsay1vdXQgY29tcGxldGUuCisJCS8vCTMuIEluIHRoZSBidWxrLW91dCBjb21wbGxldGUsIGl0IG5lZWQgdG8gZG8gYW5vdGhlciBidWxrLW91dCwKKwkJLy8JCQlpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLAorCQkvLwkJCWJ1dCB0aGUgcGF5bG9hZCBzdGlsbCBub3QgY29weWVkLiB0aGUgcFR4Q29udGV4dC0+U2F2ZWRQYWRbXSB3aWxsIHNhdmUgYXMgYWxsemVyby4gYW5kIHNldCB0aGUgYkNvcHlQYWQgPSBUUlVFLgorCQkvLwk0LiBJbnRlcnJ1cHQgY29tcGxldGUuCisJCS8vICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuCisJCS8vCTYuIE5leHQgdGltZSB3aGVuIGRvIGJ1bGstb3V0LCBpdCBmb3VuZCB0aGUgYkNvcHlQYWQ9PVRSVUUgYW5kIHdpbGwgY29weSB0aGUgU2F2ZWRQYWRbXSB0byBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLgorCQkvLwkJYW5kIHRoZSBwYWNrZXQgd2lsbCB3cm9uZy4KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKwkJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IHBUeEJsay0+UHJpdjsKKwkJaWYgKGJUeFFMYXN0Um91bmQpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKwl9CisKKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisKKwkvLyBzdWNjZWVkIGFuZCByZWxlYXNlIHRoZSBza2IgYnVmZmVyCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4oU3RhdHVzKTsKKworfQorCisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFtZU51bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCVVTSE9SVAkJCWh3SGRyTGVuOwkvLyBUaGUgaHdIZHJMZW4gY29uc2lzdCBvZiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBwbHVzIHRoZSBoZWFkZXIgcGFkZGluZyBsZW5ndGguCisJVUlOVDMyCQkJZmlsbE9mZnNldDsKKwlUWElORk9fU1RSVUMJKnBUeEluZm87CisJVFhXSV9TVFJVQwkJKnBUeFdJOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldCA9IE5VTEw7CisJVUNIQVIJCQlRdWVJZHg7CisJTkRJU19TVEFUVVMJCVN0YXR1czsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCS8vVUlOVDMyCQkJVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJaWYoZnJhbWVOdW0gPT0gMCkKKwl7CisJCS8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLgorCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCQkJcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKworCQkJLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLgorCQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCQl7CisKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQl9CisJCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwkJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkJLy8KKwkJCS8vIENvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKKwkJCS8vCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQsIDQpK0xFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKQorCQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCQllbHNlCisJCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQkJLy8gVXBkYXRlIHRoZSBwVHhCbGstPlByaXYuCisJCQlwVHhCbGstPlByaXYgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOworCisJCQkvLwlwVHhJbmZvLT5VU0JETUFwa3RMZW4gbm93IGp1c3QgYSB0ZW1wIHZhbHVlIGFuZCB3aWxsIHRvIGNvcnJlY3QgbGF0dGVyLgorCQkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkocFR4QmxrLT5Qcml2KSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKKworCQkJLy8gQ29weSBpdC4KKwkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIHBUeEJsay0+UHJpdik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocFdpcmVsZXNzUGFja2V0KyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IHBUeEJsay0+UHJpdjsKKwkJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlByaXY7CisJCX0KKwl9CisJZWxzZQorCXsJLy8gRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4KKworCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJZmlsbE9mZnNldCA9ICAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2KTsKKwkJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkJLy9od0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIHBUeEJsay0+TXBkdUhlYWRlckxlbik7CisJCQlwV2lyZWxlc3NQYWNrZXQgKz0gKHBUeEJsay0+TXBkdUhlYWRlckxlbik7CisJCQlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCQl9CisJCWVsc2UKKwkJewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JpdGVNdWx0aVR4UmVzb3VyY2UoKTpiQ3VyV3JpdGluZyBpcyBGQUxTRSB3aGVuIGhhbmRsZSBzdWItc2VxdWVudCBmcmFtZXMuXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCisKKwkvLyBXZSB1bmxvY2sgaXQgaGVyZSB0byBwcmV2ZW50IHRoZSBmaXJzdCA4IGJ5dGVzIG1heWJlIG92ZXItd3JpdGUgaXNzdWUuCisJLy8JMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Q29udGV4dC4KKwkvLwkyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4KKwkvLwkzLiBJbiB0aGUgYnVsay1vdXQgY29tcGxsZXRlLCBpdCBuZWVkIHRvIGRvIGFub3RoZXIgYnVsay1vdXQsCisJLy8JCQlpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLAorCS8vCQkJYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuCisJLy8JNC4gSW50ZXJydXB0IGNvbXBsZXRlLgorCS8vICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuCisJLy8JNi4gTmV4dCB0aW1lIHdoZW4gZG8gYnVsay1vdXQsIGl0IGZvdW5kIHRoZSBiQ29weVBhZD09VFJVRSBhbmQgd2lsbCBjb3B5IHRoZSBTYXZlZFBhZFtdIHRvIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24uCisJLy8JCWFuZCB0aGUgcGFja2V0IHdpbGwgd3JvbmcuCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIldyaXRlTXVsdGlUeFJlc291cmNlOiBDV1BvcyA9ICVsZCwgTkJPdXRQb3MgPSAlbGQuXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQlnb3RvIGRvbmU7CisJfQorCisJLy8gQ29weSB0aGUgZnJhbWUgY29udGVudCBpbnRvIERNQSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgcFR4QmxrLT5Qcml2CisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1Zkxlbik7CisJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworZG9uZToKKwkvLyBSZWxlYXNlIHRoZSBza2IgYnVmZmVyIGhlcmUKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybihTdGF0dXMpOworCit9CisKKworVk9JRCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKKwlJTglVU0hPUlQJCQlUeElkeCkKK3sKKwlVQ0hBUgkJCVF1ZUlkeDsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisJVUlOVDMyCQkJZmlsbE9mZnNldDsKKwlUWElORk9fU1RSVUMJKnBUeEluZm87CisJVFhXSV9TVFJVQwkJKnBUeFdJOworCVVJTlQzMgkJCVVTQkRNQXBrdExlbiwgcGFkZGluZzsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldDsKKworCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OworCXBIVFRYQ29udGV4dCAgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpCisJeworCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQlpZiAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLTgpID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCQkmJiAocEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPT0gVFJVRSkpCisJCQlwV2lyZWxlc3NQYWNrZXQgPSAoUFVDSEFSKSgmcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSk7CisJCWVsc2UKKwkJCXBXaXJlbGVzc1BhY2tldCA9IChQVUNIQVIpKCZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XSk7CisKKwkJLy8KKwkJLy8gVXBkYXRlIFR4SW5mby0+VVNCRE1BcGt0TGVuICwKKwkJLy8JCXRoZSBsZW5ndGggPSBUWFdJX1NJWkUgKyA4MDIuMTFfaGRyICsgODAyLjExX2hkcl9wYWQgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMgKyBCdWxrLU91dC1wYWRkaW5nCisJCS8vCisJCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykocFdpcmVsZXNzUGFja2V0KTsKKworCQkvLyBDYWxjdWxhdGUgdGhlIGJ1bGstb3V0IHBhZGRpbmcKKwkJVVNCRE1BcGt0TGVuID0gcFR4QmxrLT5Qcml2IC0gVFhJTkZPX1NJWkU7CisJCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvLyByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50CisJCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOworCisJCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOworCisJCS8vCisJCS8vIFVwZGF0ZSBUWFdJLT5NUERVdG90YWxCeXRlQ291bnQgLAorCQkvLwkJdGhlIGxlbmd0aCA9IDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMKKwkJcFR4V0k9IChQVFhXSV9TVFJVQykocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUpOworCQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKKworCQkvLworCQkvLyBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbgorCQkvLworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2KT4gTUFYX1RYQlVMS19MSU1JVCkKKwkJewkvLyBBZGQgMzkwNiBmb3IgcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgcGFja2V0IHNpemUgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOworCQl9CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisKKwkJLy8KKwkJLy8JWmVybyB0aGUgbGFzdCBwYWRkaW5nLgorCQkvLworCQlwV2lyZWxlc3NQYWNrZXQgPSAoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXQgKyBwVHhCbGstPlByaXZdKTsKKwkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwkJLy8gRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFCisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKworCX0KKwllbHNlCisJewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5hbFdyaXRlVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIGxhc3QgZnJhbWVzLlxuIikpOworCX0KKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCit9CisKKworVk9JRCBSdG1wVVNCRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlUeElkeCkKK3sKKwkvLyBETyBub3RoaW5nIGZvciBVU0IuCit9CisKKworLyoKKwlXaGVuIGNhbiBkbyBidWxrLW91dDoKKwkJMS4gVHhTd0ZyZWVJZHggPCBUWF9SSU5HX1NJWkU7CisJCQlJdCBtZWFucyBoYXMgYXQgbGVhc3Qgb25lIFJpbmcgZW50aXR5IGlzIHJlYWR5IGZvciBidWxrLW91dCwga2ljayBpdCBvdXQuCisJCTIuIElmIFR4U3dGcmVlSWR4ID09IFRYX1JJTkdfU0laRQorCQkJQ2hlY2sgaWYgdGhlIEN1cldyaXRpbmcgZmxhZyBpcyBGQUxTRSwgaWYgaXQncyBGQUxTRSwgd2UgY2FuIGRvIGtpY2sgb3V0LgorCisqLworVk9JRCBSdG1wVVNCRGF0YUtpY2tPdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCkKK3sKKwlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUlQyODcwIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBVU0JNZ210S2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4gVUNIQVIgCQkJUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCisJSU4gVUlOVCAJCQlTcmNCdWZMZW4pCit7CisJUFRYSU5GT19TVFJVQwlwVHhJbmZvOworCVVMT05HCQkJQnVsa091dFNpemU7CisJVUNIQVIJCQlwYWRMZW47CisJUFVDSEFSCQkJcERlc3Q7CisJVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7CisJUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCisJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKShwU3JjQnVmVkEpOworCisJLy8gQnVpbGQgb3VyIFVSQiBmb3IgVVNCRAorCUJ1bGtPdXRTaXplID0gU3JjQnVmTGVuOworCUJ1bGtPdXRTaXplID0gKEJ1bGtPdXRTaXplICsgMykgJiAofjMpOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKEJ1bGtPdXRTaXplIC0gVFhJTkZPX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKKworCUJ1bGtPdXRTaXplICs9IDQ7IC8vIEFsd2F5cyBhZGQgNCBleHRyYSBieXRlcyBhdCBldmVyeSBwYWNrZXQuCisKKwkvLyBJZiBCdWxrT3V0U2l6ZSBpcyBtdWx0aXBsZSBvZiBCdWxrT3V0TWF4UGFja2V0U2l6ZSwgYWRkIGV4dHJhIDQgYnl0ZXMgYWdhaW4uCisJaWYgKChCdWxrT3V0U2l6ZSAlIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpID09IDApCisJCUJ1bGtPdXRTaXplICs9IDQ7CisKKwlwYWRMZW4gPSBCdWxrT3V0U2l6ZSAtIFNyY0J1ZkxlbjsKKwlBU1NFUlQoKHBhZExlbiA8PSBSVE1QX1BLVF9UQUlMX1BBRERJTkcpKTsKKworCS8vIE5vdyBtZW16ZXJvIGFsbCBleHRyYSBwYWRkaW5nIGJ5dGVzLgorCXBEZXN0ID0gKFBVQ0hBUikocFNyY0J1ZlZBICsgU3JjQnVmTGVuKTsKKwlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgcGFkTGVuKTsKKwlOZGlzWmVyb01lbW9yeShwRGVzdCwgcGFkTGVuKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7CisKKwlwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeENwdUlkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSAoUFRYX0JVRkZFUikoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpKTsKKworCS8vIExlbmd0aCBpbiBUeEluZm8gc2hvdWxkIGJlIDggbGVzcyB0aGFuIGJ1bGtvdXQgc2l6ZS4KKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gQnVsa091dFNpemU7CisJcE1MTUVDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOworCisKKwkvL2ZvciBkZWJ1ZworCS8vaGV4X2R1bXAoIlJ0bXBVU0JNZ210S2lja091dCIsICZwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgKHBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPiAxNiA/IDE2IDogcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSkpOworCisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvL2lmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID09IE1HTVRfUklOR19TSVpFKQorCS8vCW5lZWRLaWNrT3V0ID0gVFJVRTsKKworCS8vIERlY3JlYXNlIHRoZSBUeFN3RnJlZUlkeCBhbmQgSW5jcmVhc2UgdGhlIFRYX0NUWF9JRFgKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LS07CisJSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkvL2lmIChuZWVkS2lja091dCkKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKKwlyZXR1cm4gMDsKK30KKworCitWT0lEIFJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlRdWVJZHgsCisJSU4gVUNIQVIJCSpwTnVsbEZyYW1lLAorCUlOIFVJTlQzMgkJZnJhbWVMZW4pCit7CisJaWYgKHBBZC0+TnVsbENvbnRleHQuSW5Vc2UgPT0gRkFMU0UpCisJeworCQlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0OworCQlQVFhJTkZPX1NUUlVDCXBUeEluZm87CisJCVBUWFdJX1NUUlVDCQlwVHhXSTsKKwkJUFVDSEFSCQkJcFdpcmVsZXNzUGt0OworCisJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisKKwkJLy8gU2V0IHRoZSBpbiB1c2UgYml0CisJCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBUUlVFOworCQlwV2lyZWxlc3NQa3QgPSAoUFVDSEFSKSZwTnVsbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKworCQlSVE1QWmVyb01lbW9yeSgmcFdpcmVsZXNzUGt0WzBdLCAxMDApOworCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBXaXJlbGVzc1BrdFswXTsKKwkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKEhFQURFUl84MDJfMTEpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOworCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOworCQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcFdpcmVsZXNzUGt0W1RYSU5GT19TSVpFXTsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKEhFQURFUl84MDJfMTEpKSwKKwkJCTAsIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJUlRNUE1vdmVNZW1vcnkoJnBXaXJlbGVzc1BrdFtUWFdJX1NJWkUrVFhJTkZPX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKSZwV2lyZWxlc3NQa3RbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKKworCQkvLyBGaWxsIG91dCBmcmFtZSBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGdsb2JhbCBCdWxrIG91dCBhcmJpdG9yCisJCS8vcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gc2VuZCBOVUxMIEZyYW1lIEAlZCBNYnBzLi4uXG4iLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXSkpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCk7CisKKwkJLy8gS2ljayBidWxrIG91dAorCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKKworCUFyZ3VtZW50czoKKwkJcFJ4RAkJUG9pbnRlcgl0byB0aGUgUnggZGVzY3JpcHRvcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQlObyBlcnIKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQkJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCisJSU4JUFJUMjhYWF9SWERfU1RSVUMJcFJ4SU5GTykKK3sKKwlQQ0lQSEVSX0tFWSBwV3BhS2V5OworCUlOVAlkQm07CisKKwlpZiAocEFkLT5iUHJvbWlzY3VvdXMgPT0gVFJVRSkKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCWlmKHBSeElORk8gPT0gTlVMTCkKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLy8gUGh5IGVycm9ycyAmIENSQyBlcnJvcnMKKwlpZiAocFJ4SU5GTy0+Q3JjKQorCXsKKwkJLy8gQ2hlY2sgUlNTSSBmb3IgTm9pc2UgSGlzdCBzdGF0aXN0aWMgY29sbGVjdGlvbi4KKwkJZEJtID0gKElOVCkgKHBSeFdJLT5SU1NJMCkgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworCQlpZiAoZEJtIDw9IC04NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMF0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC04MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMV0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC03NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMl0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC03MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbM10gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC02NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNF0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC02MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNV0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNl0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtID4gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs3XSArPSAxOworCisJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwkvLyBBZGQgUnggc2l6ZSB0byBjaGFubmVsIGxvYWQgY291bnRlciwgd2Ugc2hvdWxkIGlnbm9yZSBlcnJvciBjb3VudHMKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyArPSAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCsgMTQpOworCisJLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKKwlpZiAocEhlYWRlci0+RkMuVG9EcykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJFcnI7RkMuVG9Ec1xuIikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwkvLyBQYXVsIDA0LTAzIGZvciBPRkRNIFJ4IGxlbmd0aCBpc3N1ZQorCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUFYX0FHR1JFR0FUSU9OX1NJWkUpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgicmVjZWl2ZWQgcGFja2V0IHRvbyBsb25nXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQorCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KKwkvLyBpZiAocFJ4RC0+VTJNID09IDApCisJLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQorCWlmIChwUnhJTkZPLT5EZWNyeXB0ZWQgJiYgcFJ4SU5GTy0+Q2lwaGVyRXJyKQorCXsKKworCQkvLworCQkvLyBNSUMgRXJyb3IKKwkJLy8KKwkJaWYgKChwUnhJTkZPLT5DaXBoZXJFcnIgPT0gMikgJiYgcFJ4SU5GTy0+TXlCc3MpCisJCXsKKwkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKKwkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7CisJCX0KKworCQlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmCisJCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XS5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykgJiYKKwkJCShwSGVhZGVyLT5TZXF1ZW5jZSA9PSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkpCisJCXsKKwkJCS8vCisJCQkvLyBBY2NlcHRhYmxlIHNpbmNlIHRoZSBGaXJzdCBGcmFnRnJhbWUgbm8gQ2lwaGVyRXJyIHByb2JsZW0uCisJCQkvLworCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQl9CisKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KQoreworICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7CisKKwlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMCk7CisKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKK30KKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOworCisJLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgorCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCisJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOworCisJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisKKwlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisJQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKKwlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAyKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgNDB1cy4KKworCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlQyOHh4VXNiTWxtZVJhZGlvT24oKVxuIikpOworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisgICAgCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMCk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlOSUNSZXNldEZyb21FcnJvcihwQWQpOworCisJLy8gRW5hYmxlIFR4L1J4CisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworfQorCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09GRigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKwlVSU5UMzIJVmFsdWUsIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUMjh4eFVzYk1sbWVSYWRpb09GRigpXG4iKSk7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisJLy8gU2V0IFJhZGlvIG9mZiBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cworCQlpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIENsZWFuIHVwIG9sZCBic3MgdGFibGUKKwkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJLy8gRGlzYWJsZSBNQUMgVHgvUngKKwlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkvLyBNQUNfU1lTX0NUUkwgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMCk7CisKKwkvLyBQV1JfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDApOworCisJLy8gVFhfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiAyMG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgMCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gTXVzdCB1c2luZyAyME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9d2hpbGUgKGkrKyA8IDEwMCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1faW5mby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDc5MmUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2luZm8uYwpAQCAtMCwwICsxLDM3MTIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitJTlQJU2hvd19TU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4QnVyc3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UHJlYW1ibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NoYW5uZWxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfUlRTVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2hvd19IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NvdW50cnlDb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitJTlQJU2hvd19BdXRoTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2hvd19wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MsIFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQ1tdID0geworCXsiU1NJRCIsCQkJCQlTaG93X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCVNob3dfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTaG93X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2hvd19UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTaG93X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNob3dfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJU2hvd19CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCVNob3dfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJU2hvd19GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkJCQlTaG93X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkJCQlTaG93X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkJCQlTaG93X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkJCVNob3dfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkJCVNob3dfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCQlTaG93X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIFNob3dfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAlTaG93X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAlTaG93X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIFNob3dfSHRBdXRvQmFfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeyJDb3VudHJ5UmVnaW9uIiwJCQlTaG93X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJDb3VudHJ5Q29kZSIsCQkJCVNob3dfQ291bnRyeUNvZGVfUHJvY30sCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQlTaG93X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQlTaG93X0lFRUU4MDIxMUhfUHJvY30sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgeyJOZXR3b3JrVHlwZSIsCQkJCVNob3dfTmV0d29ya1R5cGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeyJBdXRoTW9kZSIsCQkJCVNob3dfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJU2hvd19FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJU2hvd19LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQlTaG93X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCVNob3dfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJU2hvd19LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCVNob3dfV1BBUFNLX1Byb2N9LAorCXtOVUxMLCBOVUxMfQorfTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgRHJpdmVyIHZlcnNpb24uCisKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24uCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyByZWdpb247CisKKwlyZWdpb24gPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAorCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgcmVnaW9uOworCX0KKwllbHNlIGlmIChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHJlZ2lvbjsKKworCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpIHJlZ2lvbjsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjpwYXJhbWV0ZXJzIG91dCBvZiByYW5nZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKKwlCdWlsZENoYW5uZWxMaXN0KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcJV2lyZWxlc3NNb2RlOworCUlOVAkJc3VjY2VzcyA9IFRSVUU7CisKKwlXaXJlbGVzc01vZGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJSU5UIE1heFBoeU1vZGUgPSBQSFlfMTFHOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCWlmIChXaXJlbGVzc01vZGUgPD0gTWF4UGh5TW9kZSkKKwkJeworCQkJUlRNUFNldFBoeU1vZGUocEFkLCBXaXJlbGVzc01vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKFdpcmVsZXNzTW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkvLyBTZXQgQWRob2NNb2RlIHJhdGVzCisJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQl7CisJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdWNjZXNzID0gRkFMU0U7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBpdCBpcyBuZWVkZWQgdG8gc2V0IFNTSUQgdG8gdGFrZSBlZmZlY3QKKwlpZiAoc3VjY2VzcyA9PSBUUlVFKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjooPSVsZClcbiIsIFdpcmVsZXNzTW9kZSkpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENoYW5uZWwKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAJSU5UCQlzdWNjZXNzID0gVFJVRTsKKwlVQ0hBUglDaGFubmVsOworCisJQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCS8vIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyB2YWxpZAorCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgQ2hhbm5lbCkgPT0gVFJVRSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworCisJCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJCQkJeworCQkJCQlOX1NldENlbkNoKHBBZCk7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCwgY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJc3VjY2VzcyA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXN1Y2Nlc3MgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWlmIChzdWNjZXNzID09IFRSVUUpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9DaGFubmVsX1Byb2M6OihDaGFubmVsPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNob3J0IFNsb3QgVGltZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgU2hvcnRTbG90OworCisJU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaG9ydFNsb3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU2hvcnRTbG90X1Byb2M6OihTaG9ydFNsb3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4IHBvd2VyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVHhQb3dlcjsKKwlJTlQgICBzdWNjZXNzID0gRkFMU0U7CisKKwlUeFBvd2VyID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChUeFBvd2VyIDw9IDEwMCkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBUeFBvd2VyOworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlzdWNjZXNzID0gVFJVRTsKKwl9CisJZWxzZQorCQlzdWNjZXNzID0gRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQb3dlcl9Qcm9jOjooVHhQb3dlclBlcmNlbnRhZ2U9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCAxMUIvMTFHIFByb3RlY3Rpb24KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSkKKwl7CisJCWNhc2UgMDogLy9BVVRPCisJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDogIC8vSW52YWxpZCBhcmd1bWVudAorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JHUHJvdGVjdGlvbl9Qcm9jOjooQkdQcm90ZWN0aW9uPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4UHJlYW1ibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlSVF84MDJfMTFfUFJFQU1CTEUJUHJlYW1ibGU7CisKKwlQcmVhbWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworCXN3aXRjaCAoUHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86CisJCQkvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworCQkJLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKwkJCXJldHVybiBGQUxTRTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQcmVhbWJsZV9Qcm9jOjooVHhQcmVhbWJsZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUlRTIFRocmVzaG9sZAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKworCVJ0c1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZigoUnRzVGhyZXNoID4gMCkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkpCisJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwllbHNlIGlmIChSdHNUaHJlc2ggPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1JUU1RocmVzaG9sZF9Qcm9jOjooUlRTVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRnJhZ21lbnQgVGhyZXNob2xkCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICAgICBGcmFnVGhyZXNoOworCisJRnJhZ1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCXsKKwkJLy9JbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKKwkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJfQorCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCisJeworCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCisJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVCkoRnJhZ1RocmVzaCAtIDEpOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID09IE1BWF9GUkFHX1RIUkVTSE9MRCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYzo6KEZyYWdUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4QnVyc3QKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBUeEJ1cnN0OworCisJVHhCdXJzdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFR4QnVyc3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOworCWVsc2UgaWYgKFR4QnVyc3QgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4QnVyc3RfUHJvYzo6KFR4QnVyc3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBUeEJ1cnN0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBhZ2dyZTsKKworCWFnZ3JlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChhZ2dyZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChhZ2dyZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jOjooQUdHUkU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBJRUVFODAyMTFILgorICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyAxIHdoZW4gbmVlZHMgcmFkYXIgZGV0ZWN0aW9uLCBvdGhlcndpc2UgMAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVMT05HIGllZWU4MDIxMWg7CisKKwlpZWVlODAyMTFoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChpZWVlODAyMTFoID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKKwllbHNlIGlmIChpZWVlODAyMTFoID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JRUVFODAyMTFIX1Byb2M6OihJRUVFODAyMTFIPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRm9yIERlYnVnIGluZm9ybWF0aW9uCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0RlYnVnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfRGVidWdfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7CisKKyAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IFJUX0RFQlVHX0xPVUQpCisgICAgICAgIFJURGVidWdMZXZlbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0RlYnVnX1Byb2MoUlREZWJ1Z0xldmVsID0gJWxkKVxuIiwgUlREZWJ1Z0xldmVsKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCitJTlQJU2hvd19EZXNjSW5mb19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlc2V0IHN0YXRpc3RpY3MgY291bnRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgYXJnCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkvL1VDSEFSICAgICAgICAgICBpOworCS8vTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5TZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jXG4iKSk7CisKKwkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKKwlOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOworCisJLy8gUmVzZXQgSG90U3BvdCBjb3VudGVyCisjaWYgMCAvLyBUb0RvLgorCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJaWYgKChwRW50cnktPlZhbGlkID09IEZBTFNFKSB8fCAocEVudHJ5LT5Tc3QgIT0gU1NUX0FTU09DKSkKKwkJCWNvbnRpbnVlOworCisJCXBFbnRyeS0+SFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSA9IDA7CisJCXBFbnRyeS0+SFNDb3VudGVyLlRvdGFsUnhCeXRlQ291bnQ9IDA7CisJCXBFbnRyeS0+SFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQ9IDA7CisJfQorI2VuZGlmCisKKworCXJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQWRkIFdQQSBrZXkgcHJvY2Vzcy4KKwkJSW4gQWRob2MgV1BBTk9ORSwgYlBhaXJ3aXNlID0gMDsgIEtleUlkeCA9IDA7CisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWYgMCAvLyByZW1vdmUgYnkgQWxiZXJ0WQorTkRJU19TVEFUVVMgUlRNUFdQQUFkZEtleVByb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFZPSUQJCQlwQnVmKQoreworCVBORElTXzgwMl8xMV9LRVkJcEtleTsKKwlVTE9ORwkJCQlLZXlJZHg7CisvLwlORElTX1NUQVRVUyAJCVN0YXR1czsKKy8vCVVMT05HIAlvZmZzZXQ7CS8vIHVudXNlZCB2YXJpYWJsZSwgc25vd3BpbiAyMDA2LjA3LjEzCisKKwlQVUNIQVIJCXBUeE1pYywgcFJ4TWljOworCUJPT0xFQU4gCWJUeEtleTsgCQkvLyBTZXQgdGhlIGtleSBhcyB0cmFuc21pdCBrZXkKKwlCT09MRUFOIAliUGFpcndpc2U7CQkvLyBJbmRpY2F0ZSB0aGUga2V5IGlzIHBhaXJ3aXNlIGtleQorCUJPT0xFQU4gCWJLZXlSU0M7CQkvLyBpbmRpY2F0ZSB0aGUgcmVjZWl2ZSAgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZS4KKwkJCQkJCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIHNldCBieSB0aGUgTklDLgorCUJPT0xFQU4gCWJBdXRoZW50aWNhdG9yOyAvLyBpbmRpY2F0ZSBrZXkgaXMgc2V0IGJ5IGF1dGhlbnRpY2F0b3IuCisJVUNIQVIJCWFwaWR4ID0gQlNTMDsKKworCXBLZXkgPSAoUE5ESVNfODAyXzExX0tFWSkgcEJ1ZjsKKwlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4ZmY7CisJLy8gQml0IDMxIG9mIEFkZC1rZXksIFR4IEtleQorCWJUeEtleQkJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMzAgb2YgQWRkLWtleSBQYWlyd2lzZUtleQorCWJQYWlyd2lzZQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4NDAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOSBvZiBBZGQta2V5IEtleVJTQworCWJLZXlSU0MgCSAgID0gKHBLZXktPktleUluZGV4ICYgMHgyMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDI4IG9mIEFkZC1rZXkgQXV0aGVudGljYXRvcgorCWJBdXRoZW50aWNhdG9yID0gKHBLZXktPktleUluZGV4ICYgMHgxMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFBZGRLZXlQcm9jPT0+cEtleS0+S2V5SW5kZXggPSAleC4gYlBhaXJ3aXNlPSAlZFxuIiwgcEtleS0+S2V5SW5kZXgsIGJQYWlyd2lzZSkpOworCS8vIDEuIENoZWNrIEdyb3VwIC8gUGFpcndpc2UgS2V5CisJaWYgKGJQYWlyd2lzZSkJLy8gUGFpcndpc2UgS2V5CisJeworCQkvLyAxLiBLZXlJZHggbXVzdCBiZSAwLCBvdGhlcndpc2UsIHJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0RBVEEKKwkJaWYgKEtleUlkeCAhPSAwKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJLy8gMi4gQ2hlY2sgYlR4LCBpdCBtdXN0IGJlIHRydWUsIG90aGVyd2lzZSwgcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQorCQlpZiAoYlR4S2V5ID09IEZBTFNFKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJLy8gMy4gSWYgQlNTSUQgaXMgYWxsIDB4ZmYsIHJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0RBVEEKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBLZXktPkJTU0lELCBCUk9BRENBU1RfQUREUikpCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQkvLyAzLjEgQ2hlY2sgUGFpcndpc2Uga2V5IGxlbmd0aCBmb3IgVEtJUCBrZXkuIEZvciBBRVMsIGl0J3MgYWx3YXlzIDEyOCBiaXRzCisJCS8vaWYgKChwQWRhcHRlci0+UG9ydENmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYgKHBLZXktPktleUxlbmd0aCAhPSBMRU5fVEtJUF9LRVkpKQorCQlpZiAoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYgKHBLZXktPktleUxlbmd0aCAhPSBMRU5fVEtJUF9LRVkpKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHlwZSA9IFBBSVJXSVNFX0tFWTsKKworCQlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCXsKKwkJCS8vIFNlbmQgbWVkaWEgc3BlY2lmaWMgZXZlbnQgdG8gc3RhcnQgUE1LSUQgY2FjaGluZworCQkJUlRNUEluZGljYXRlV1BBMlN0YXR1cyhwQWQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIDEuIENoZWNrIEJTU0lELCBpZiBub3QgY3VycmVudCBCU1NJRCBvciBCY2FzdCwgcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQorCQlpZiAoKCEgTUFDX0FERFJfRVFVQUwocEtleS0+QlNTSUQsIEJST0FEQ0FTVF9BRERSKSkgJiYKKwkJCSghIE1BQ19BRERSX0VRVUFMKHBLZXktPkJTU0lELCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQpKSkKKwkJCXJldHVybihORElTX1NUQVRVU19JTlZBTElEX0RBVEEpOworCisJCS8vIDIuIENoZWNrIEtleSBpbmRleCBmb3Igc3VwcG9ydGVkIEdyb3VwIEtleQorCQlpZiAoS2V5SWR4ID49IEdST1VQX0tFWV9OVU0pCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQkvLyAzLiBTZXQgYXMgZGVmYXVsdCBUeCBLZXkgaWYgYlR4S2V5IGlzIFRSVUUKKwkJaWYgKGJUeEtleSA9PSBUUlVFKQorCQkJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCisJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR5cGUgPSBHUk9VUF9LRVk7CisJfQorCisJLy8gNC4gU2VsZWN0IFJ4TWljIC8gVHhNaWMgYmFzZWQgb24gU3VwcCAvIEF1dGhlbnRpY2F0b3IKKwlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJeworCQkvLyBmb3IgV1BBLU5vbmUgVHgsIFJ4IE1JQyBpcyB0aGUgc2FtZQorCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwUnhNaWMgPSBwVHhNaWM7CisJfQorCWVsc2UgaWYgKGJBdXRoZW50aWNhdG9yID09IFRSVUUpCisJeworCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCX0KKwllbHNlCisJeworCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCX0KKworCS8vIDYuIENoZWNrIFJ4VHNjCisJaWYgKGJLZXlSU0MgPT0gVFJVRSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4VHNjLCAmcEtleS0+S2V5UlNDLCA2KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5SeFRzYywgJnBLZXktPktleVJTQywgNik7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4VHNjLCA2KTsKKwl9CisKKwkvLyA3LiBDb3B5IGluZm9ybWF0aW9uIGludG8gUGFpcndpc2UgS2V5IHN0cnVjdHVyZS4KKwkvLyBwS2V5LT5LZXlMZW5ndGggd2lsbCBpbmNsdWRlIFR4TWljIGFuZCBSeE1pYywgdGhlcmVmb3JlLCB3ZSB1c2UgMTYgYnl0ZXMgaGFyZGNvZGVkLgorCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCAxNik7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgMTYpOworCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gTEVOX1RLSVBfS0VZKQorCXsKKwkJLy8gT25seSBLZXkgbGVudGggZXF1YWwgdG8gVEtJUCBrZXkgaGF2ZSB0aGVzZQorCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pYywgcFJ4TWljLCA4KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhNaWMsIHBUeE1pYywgOCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuUnhNaWMsIHBSeE1pYywgOCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuVHhNaWMsIHBUeE1pYywgOCk7CisJfQorCisJQ09QWV9NQUNfQUREUihwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkJzc0lkLCBwS2V5LT5CU1NJRCk7CisKKwkvLyBJbml0IFR4VHNjIHRvIG9uZSBiYXNlZCBvbiBXaUZpIFdQQSBzcGVjcworCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4VHNjWzBdID0gMTsKKwlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeFRzY1sxXSA9IDA7CisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhUc2NbMl0gPSAwOworCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4VHNjWzNdID0gMDsKKwlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeFRzY1s0XSA9IDA7CisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhUc2NbNV0gPSAwOworCS8vIDQuIEluaXQgVHhUc2MgdG8gb25lIGJhc2VkIG9uIFdpRmkgV1BBIHNwZWNzCisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1swXSA9IDE7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1sxXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1syXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1szXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1s0XSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1s1XSA9IDA7CisKKwlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCX0KKwllbHNlIGlmIChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJeworCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwl9CisJZWxzZSBpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorCXsKKwkJaWYgKHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleUxlbiA9PSA1KQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5LZXlMZW4gPT0gMTMpCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJfQorCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgIC8vIFBhaXJ3aXNlIEtleS4gQWRkIEJTU0lEIHRvIFdDVGFibGUKKwl7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW47CisJfQorCisJaWYgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwl7CisJCS8vCisJCS8vIE9uIFdQQTIsIFVwZGF0ZSBHcm91cCBLZXkgQ2lwaGVyLgorCQkvLworCQlpZiAoIWJQYWlyd2lzZSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlNoYXJlZEtleVslZF1bJWRdLkNpcGhlckFsZyA9ICVkXG4iLCBhcGlkeCwgS2V5SWR4LCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcpKTsKKworI2lmIDAKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJXMgS2V5ICMlZCIsIENpcGhlck5hbWVbcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnXSxLZXlJZHgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIlMDJ4OiIsIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleVtpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBSeCBNSUMgS2V5ID0gIikpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJTAyeDoiLCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pY1tpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBUeCBNSUMgS2V5ID0gIikpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJTAyeDoiLCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeE1pY1tpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBSeFRTQyA9ICIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiUwMng6IiwgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uUnhUc2NbaV0pKTsKKwl9CisjZW5kaWYKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4gcEtleS0+IEJTU0lEOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJcEtleS0+QlNTSURbMF0scEtleS0+QlNTSURbMV0scEtleS0+QlNTSURbMl0scEtleS0+QlNTSURbM10scEtleS0+QlNTSURbNF0scEtleS0+QlNTSURbNV0pKTsKKworCWlmICgoYlR4S2V5KSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpICAvLyBQYWlyd2lzZSBLZXkuIEFkZCBCU1NJRCB0byBXQ1RhYmxlCisJCVJUTVBBZGRCU1NJRENpcGhlcihwQWQsIEJTU0lEX1dDSUQsIHBLZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnKTsKKworCisJLy8gTm8gbWF0dGVyIHBhaXJ3aXNlIGtleSBvciB3aGF0IGxleWlkeCBpcywgYWx3YXlzIGhhcyBhIGNvcHkgYXQgb24tY2hpcCBTaGFyZWRLZXl0YWJsZS4KKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBhcGlkeCwKKwkJCQkJCSAgKFVDSEFSKUtleUlkeCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pYyk7CisKKwkvLyBUaGUgV0NJRCBrZXkgc3BlY2lmaWVkIGluIHVzZWQgYXQgVHguIEZvciBTVEEsIGFsd2F5cyB1c2UgcGFpcndpc2Uga2V5LgorCisJLy8gYWQtaG9jIG1vZGUgbmVlZCB0byBzcGVjaWZ5IFdBUCBHcm91cCBrZXkgd2l0aCBXQ0lEIGluZGV4PUJTUzBNY2FzdF9XQ0lELiBMZXQncyBhbHdheXMgc2V0IHRoaXMga2V5IGhlcmUuCisvKglpZiAoYlBhaXJ3aXNlID09IEZBTFNFKQorCXsKKwkJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJTmRpc1plcm9NZW1vcnkoSVZFSVYsIDgpOworCQkvLyAxLiBJVi9FSVYKKwkJLy8gU3BlY2lmeSBrZXkgaW5kZXggdG8gZmluZCBzaGFyZWQga2V5LgorCQlpZiAoKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnPT1DSVBIRVJfVEtJUCkgfHwKKwkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZz09Q0lQSEVSX0FFUykpCisJCUlWRUlWWzNdID0gMHgyMDsJCS8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyAwIGZvciBwYWlyd2lzZSBrZXkKKwkJSVZFSVZbM10gfD0gKEtleUlkeDw8IDYpOwkvLyBncm91cGtleSBpbmRleCBpcyBub3QgMAorCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIElWRUlWW2ldKTsKKwkJfQorCisJCS8vIDIuIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOnVzZSBzaGFyZSBrZXksIEJTU0lkeCBpcyAwCisJCVdDSURBdHRyaSA9IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzw8MSl8UEFJUldJU0VLRVlUQUJMRTsKKwkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCX0KKworKi8KKworICAgaWYgKHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR5cGUgPT0gR1JPVVBfS0VZKQorCXsKKwkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiEhV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQhIVxuIikpOworCisJfQorCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKyNlbmRpZgorCitCT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKKyAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAorICAgIElOICBVQ0hBUiBzdHJMZW4pCit7CisgICAgVUNIQVIgaT0wOworCisgICAgZm9yIChpPTA7IGk8c3RyTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBJblB1dFN0cltpXSA8IDB4MjEpIHx8CisgICAgICAgICAgICAocEluUHV0U3RyW2ldID4gMHg3RSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZW1vdmUgV1BBIEtleSBwcm9jZXNzCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKQoreworICAgIE5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOworCisgICAgbWVtc2V0KCZhcnlSYXRlcywgMHgwMCwgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgc3dpdGNoIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisgICAgeworICAgICAgICBjYXNlIFBIWV8xMUE6IC8vIEEgb25seQorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MGM7IC8vIDZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQSFlfMTFCR19NSVhFRDogLy8gQi9HIE1peGVkCisgICAgICAgIGNhc2UgUEhZXzExQjogLy8gQiBvbmx5CisgICAgICAgIGNhc2UgUEhZXzExQUJHX01JWEVEOiAvLyBBL0IvRyBNaXhlZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEwMDAwMDA6IC8vMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDAyOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjAwMDAwMDogLy8yTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDQ7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1MDAwMDAwOiAvLzUuNU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBiOyAvLyA1LjVNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMTAwMDAwMDogLy8xMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorICAgICAgICAgICAgICAgICAgICB7IC8vQiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDBiOyAvLyA1LjVNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4MDQ7IC8vIDJNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MDI7IC8vIDFNYnBzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7IC8vKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgxNjsgLy8gMTFNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MGI7IC8vIDUuNU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgwNDsgLy8gMk1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwMjsgLy8gMU1icHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7Cit9CisKK05ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBWT0lECQkJcEJ1ZikKK3sKKwlQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSBwS2V5OworCVVMT05HCQkJCQlLZXlJZHg7CisJTkRJU19TVEFUVVMgCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwlCT09MRUFOIAliVHhLZXk7IAkJLy8gU2V0IHRoZSBrZXkgYXMgdHJhbnNtaXQga2V5CisJQk9PTEVBTiAJYlBhaXJ3aXNlOwkJLy8gSW5kaWNhdGUgdGhlIGtleSBpcyBwYWlyd2lzZSBrZXkKKwlCT09MRUFOIAliS2V5UlNDOwkJLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgIFNDIHNldCBieSBLZXlSU0MgdmFsdWUuCisJCQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBzZXQgYnkgdGhlIE5JQy4KKwlCT09MRUFOIAliQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUga2V5IGlzIHNldCBieSBhdXRoZW50aWNhdG9yLgorCUlOVCAJCWk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKKworCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7CisJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOworCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKKwliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKKwliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKKwliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKKwliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCisJLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCisJaWYgKGJUeEtleSA9PSBUUlVFKQorCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQorCWlmIChiUGFpcndpc2UpCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KKwkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKKwkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKwkJeworCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvLyAzLiBHcm91cCBLZXkKKwllbHNlCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgZ3JvdXAga2V5cyBpbmRleGVkCisJCS8vIGIuIElmIEJTU0lEIG1hdGNoZWQsIGRlbGV0ZSB0aGUgZ3JvdXAga2V5IGluZGV4ZWQuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVsZClcbiIsIEtleUlkeCkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiAoU3RhdHVzKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIEFsbCBXUEEgS2V5cworCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFdQQVJlbW92ZUFsbEtleXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisKKwlVQ0hBUiAJaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCXJldHVybjsKKworCS8vIEZvciBXUEEtTm9uZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJcmV0dXJuOworCisJLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQorCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7CisKKwkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KKwlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpKTsKKwl9CisKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncworCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0UGh5TW9kZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORyBwaHltb2RlKQoreworCUlOVCBpOworCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQorCisJLy8gaWYgbm8gY2hhbmdlLCBkbyBub3RoaW5nCisJLyogYnVnIGZpeAorCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IHBoeW1vZGUpCisJCXJldHVybjsKKyAgICAqLworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAoVUNIQVIpcGh5bW9kZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKyNlbHNlCisJQnVpbGRDaGFubmVsTGlzdChwQWQpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIHNhbml0eSBjaGVjayB1c2VyIHNldHRpbmcKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJfQorCisJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJc3dpdGNoIChwaHltb2RlKSB7CisJCWNhc2UgUEhZXzExQjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDQ7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7CisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExRzoKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdICA9IDB4MEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsxXSAgPSAweDE4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzJdICA9IDB4MzA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSA0OworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs4XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzEwXSA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExTl81RzoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisKKwlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7Cit9CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRIVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCit7CisJLy9VTE9ORwkqcG1jczsKKwlVSU5UMzIJVmFsdWUgPSAwOworCVVDSEFSCUJCUFZhbHVlID0gMDsKKwlVQ0hBUglCQlAzVmFsdWUgPSAwOworCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBIVF9tb2RlKCVkKSwgRXh0T2Zmc2V0KCVkKSwgTUNTKCVkKSwgQlcoJWQpLCBTVEJDKCVkKSwgU0hPUlRHSSglZClcbiIsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywKKwkJCQkJCQkJCQlwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisKKwkvLyBEb24ndCB6ZXJvIHN1cHBvcnRlZEh5UGh5IHN0cnVjdHVyZS4KKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LCBzaXplb2YocEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCkpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKKworICAgCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMDsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IDM7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciA9IDM7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOworCisJLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOworCisJaWYocEhUUGh5TW9kZS0+SHRNb2RlID09IEhUTU9ERV9HRikKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOworCX0KKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7CisKKwkvLyBEZWNpZGUgUnggTUNTU2V0CisJc3dpdGNoIChSeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gIDB4ZmY7CisJCQlicmVhazsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApICkKKwl7CisJCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOworCX0KKworCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNDS21vZGVpbjQwID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpPyAoRVhUQ0hBX0JFTE9XKTogRVhUQ0hBX0FCT1ZFOworCQkvLyBTZXQgUmVnc2l0ZXIgZm9yIGV4dGVuc2lvbiBjaGFubmVsIHBvc2l0aW9uLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlAzVmFsdWUpOworCQlpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQorCQl7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlCQlAzVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJfQorCQllbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCisJCXsKKwkJCVZhbHVlICY9IDB4ZmU7CisJCQlCQlAzVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCX0KKworCQkvLyBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4KKwkJLy8gU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCQkpCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gRVhUQ0hBX05PTkU7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJfQorCX0KKworCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDA7CisJfQorCisjaWZkZWYgUlQyODcwCisJLyogRnJhbmsgcmVjb21tZW5kICxJZiBub3QsIFR4IG1heWJlIGJsb2NrIGluIGhpZ2ggcG93ZXIuIFJ4IGhhcyBubyBwcm9ibGVtKi8KKwlpZihJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDA7CisJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJaWYocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOworCX0KKworCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKKwlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQ29udHJvbENoYW4gPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCS8vIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLgorCisJLy8gRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbgorCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDY7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSAxMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7CisJfQorCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVJUTVBTZXRJbmRpdmlkdWFsSFQocEFkLCAwKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCVBSVF9IVF9QSFlfSU5GTwkJcERlc2lyZWRfaHRfcGh5ID0gTlVMTDsKKwlVQ0hBUglUeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtOworCVVDSEFSCURlc2lyZWRNY3MJPSBNQ1NfQVVUTzsKKworCWRvCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBEZXNpcmVkX2h0X3BoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQkJRGVzaXJlZE1jcyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworCQkJLy9wQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChEZXNpcmVkTWNzID09IE1DU19BVVRPKSA/IFRSVUUgOiBGQUxTRTsKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0gd2hpbGUgKEZBTFNFKTsKKworCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOworCQlyZXR1cm47CisJfQorCVJUTVBaZXJvTWVtb3J5KHBEZXNpcmVkX2h0X3BoeSwgc2l6ZW9mKFJUX0hUX1BIWV9JTkZPKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOworCS8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MKKwlpZiAoKFR4U3RyZWFtID09IDEpICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsIERlc2lyZWRNY3MpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU183OworCX0KKworCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV18yMCkgJiYgKERlc2lyZWRNY3MgPT0gTUNTXzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTXzMyIGlzIG9ubHkgc3VwcG9ydGVkIGluIDQwLU1IeiwgcmVzZXQgaXQgYXMgTUNTXzBcbiIpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU18wOworCX0KKworCXBEZXNpcmVkX2h0X3BoeS0+Ykh0RW5hYmxlID0gVFJVRTsKKworCS8vIERlY2lkZSBkZXNpcmVkIFR4IE1DUworCXN3aXRjaCAoVHhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzcpCisJCQl7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDE8PERlc2lyZWRNY3M7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4MDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAyKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQkvKiBNQ1MwIH4gTUNTMjMsIDMgYnl0ZXMgKi8KKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzIzKQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAzKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCWlmKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfNDApCisJeworCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTyB8fCBEZXNpcmVkTWNzID09IE1DU18zMikKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzRdID0gMHgxOworCX0KKworCS8vIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcKKyAgICBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKyAgICAgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworICAgIGVsc2UKKwkgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIGFwaWR4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVVwZGF0ZSBIVCBJRSBmcm9tIG91ciBjYXBhYmlsaXR5LgorCisJQXJndW1lbnRzOgorCQlTZW5kIGFsbCBIVCBJRSBpbiBiZWFjb24vcHJvYmUgcnNwL2Fzc29jIHJzcC9hY3Rpb24gZnJhbWUuCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFVwZGF0ZUhUSUUoCisJSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCisJSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAorCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykKK3sKKwlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCVJUTVBaZXJvTWVtb3J5KHBBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwUnRIdC0+Q2hhbm5lbFdpZHRoOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzID0gcFJ0SHQtPk1pbW9QczsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGID0gcFJ0SHQtPkdGOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gcFJ0SHQtPlNob3J0R0lmb3IyMDsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IHBSdEh0LT5TaG9ydEdJZm9yNDA7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMgPSBwUnRIdC0+VHhTVEJDOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDID0gcFJ0SHQtPlJ4U1RCQzsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSA9IHBSdEh0LT5BbXNkdVNpemU7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwUnRIdC0+TWF4UkFtcGR1RmFjdG9yOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBwUnRIdC0+TXBkdURlbnNpdHk7CisKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldCA7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoID0gcFJ0SHQtPlJlY29tV2lkdGg7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBwUnRIdC0+Tm9uR2ZQcmVzZW50OworCQlSVE1QTW92ZU1lbW9yeShwQWRkSHRJbmZvLT5NQ1NTZXQsIC8qcFJ0SHQtPk1DU1NldCovcE1jc1NldCwgNCk7IC8vIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUuCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTiAJVUNIQVIJCSAJS2V5SWR4LAorCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCisJSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworCVVJTlQzMgkJV0NJREF0dHJpID0gMDsKKwlVU0hPUlQJCW9mZnNldDsKKwlVQ0hBUgkJSVZFSVYgPSAwOworCVVTSE9SVAkJV2NpZCA9IDA7CisKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChCc3NJZHggPiBCU1MwKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIDEuCUluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLgorCQkJLy8gMi4JSW4gSW5mcmEgbW9kZSwgdGhlIEFJRDoxIE1VU1QgYmUgd2NpZCBvZiBpbmZyYSBTVEEuCisJCQkvLwkJCQkJICAgdGhlIEFJRDoyfiBhc3NpZ24gdG8gbWVzaCBsaW5rIGVudHJ5LgorCQkJaWYgKHBFbnRyeSAmJiBBREhPQ19PTihwQWQpKQorCQkJCVdjaWQgPSBwRW50cnktPkFpZDsKKwkJCWVsc2UgaWYgKHBFbnRyeSAmJiBJTkZSQV9PTihwQWQpKQorCQkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOworCQkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlXY2lkID0gQlNTSURfV0NJRDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlXY2lkID0gTUNBU1RfV0NJRDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZQorCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZEFzTWVzaCkKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgUEFJUldJU0VLRVlUQUJMRTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJZWxzZSBpZiAoKHBFbnRyeSkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykgJiYKKwkJCQkJKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8CisJCQkJIAkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKKwkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSB8fAorCQkJCSAJKENpcGhlckFsZyA9PSBDSVBIRVJfTk9ORSkpKQorCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQllbHNlCisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFNIQVJFREtFWVRBQkxFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCisJLy8gVXBkYXRlIElWL0VJViB0YWJsZQorCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdjaWQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKworCS8vIFdQQSBtb2RlCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCXsKKwkJLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIGlzIDAgZm9yIHBhaXJ3aXNlIGtleQorCQlJVkVJViA9IChLZXlJZHggPDw2KSB8IDB4MjA7CisJfQorCWVsc2UKKwl7CisJCS8vIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuCisJCUlWRUlWID0gKEtleUlkeCA8PCA2KTsKKwl9CisKKwkvLyBGb3Iga2V5IGluZGV4IGFuZCBleHQgSVYgYml0LCBzbyBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbihvZmZzZXQrMykuCisjaWZkZWYgUlQyODcwCisJUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUocEFkLCBvZmZzZXQrMywgJklWRUlWKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJV0NJREF0dHJpID0gMHgleCBcbiIsICBXQ0lEQXR0cmkpKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFBhcnNlIGVuY3J5cHRpb24gdHlwZQorQXJndW1lbnRzOgorICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitDSEFSICpHZXRFbmNyeXB0VHlwZShDSEFSIGVuYykKK3sKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorICAgICAgICByZXR1cm4gIk5PTkUiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKyAgICAJcmV0dXJuICJXRVAiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAlyZXR1cm4gIlRLSVAiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAlyZXR1cm4gIkFFUyI7CisJaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQpCisgICAgCXJldHVybiAiVEtJUEFFUyI7CisgICAgZWxzZQorICAgIAlyZXR1cm4gIlVOS05PVyI7Cit9CisKK0NIQVIgKkdldEF1dGhNb2RlKENIQVIgYXV0aCkKK3sKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisgICAgCXJldHVybiAiT1BFTiI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisgICAgCXJldHVybiAiU0hBUkVEIjsKKwlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpCisgICAgCXJldHVybiAiQVVUT1dFUCI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgCXJldHVybiAiV1BBIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKyAgICAJcmV0dXJuICJXUEFQU0siOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAJcmV0dXJuICJXUEFOT05FIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgCXJldHVybiAiV1BBMiI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorICAgIAlyZXR1cm4gIldQQTJQU0siOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpCisgICAgCXJldHVybiAiV1BBMVdQQTIiOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spCisgICAgCXJldHVybiAiV1BBMVBTS1dQQTJQU0siOworCisgICAgCXJldHVybiAiVU5LTk9XIjsKK30KKworI2lmIDEgLy8jaWZuZGVmIFVDT1MKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IHNpdGUgc3VydmV5IHJlc3VsdHMKKwlBcmd1bWVudHM6CisJICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgCQkxLikgVUkgbmVlZHMgdG8gd2FpdCA0IHNlY29uZHMgYWZ0ZXIgaXNzdWUgYSBzaXRlIHN1cnZleSBjb21tYW5kCisgICAgICAgIAkJMi4pIGl3cHJpdiByYTAgZ2V0X3NpdGVfc3VydmV5CisgICAgICAgIAkJMy4pIFVJIG5lZWRzIHRvIHByZXBhcmUgYXQgbGVhc3QgNDA5NmJ5dGVzIHRvIGdldCB0aGUgcmVzdWx0cworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2RlZmluZQlMSU5FX0xFTgkoNCszMysyMCs4KzEwKzkrNyszKQkvLyBDaGFubmVsK1NTSUQrQnNzaWQrV2VwU3RhdHVzK0F1dGhNb2RlK1NpZ25hbCtXaXJlc3NNb2RlK05ldHdvcmtUeXBlCitWT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkqbXNnOworCUlOVCAJCWk9MDsKKwlJTlQJCQlXYWl0Q250OworCUlOVCAJCVN0YXR1cz0wOworCUNIQVIJCVNzaWRbTUFYX0xFTl9PRl9TU0lEICsxXTsKKyAgICBJTlQgICAgICAgICBSc3NpID0gMCwgbWF4X2xlbiA9IExJTkVfTEVOOworCVVJTlQgICAgICAgIFJzc2lfUXVhbGl0eSA9IDA7CisJTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIHdpcmVsZXNzX21vZGU7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZtc2csIHNpemVvZihDSEFSKSooKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuKSk7CisKKwlpZiAobXNnID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gbXNnIG1lbW9yeSBhbGxvYyBmYWlsLlxuIikpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KG1zZywgMCAsKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuICk7CisJbWVtc2V0KFNzaWQsIDAgLChNQVhfTEVOX09GX1NTSUQgKzEpKTsKKwlzcHJpbnRmKG1zZywiJXMiLCJcbiIpOworCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRzJS0zM3MlLTIwcyUtOHMlLTEwcyUtOXMlLTdzJS0zc1xuIiwKKwkgICAgIkNoIiwgIlNTSUQiLCAiQlNTSUQiLCAiRW5jIiwgIkF1dGgiLCAiU2lnYW5sKCUpIiwgIlctTW9kZSIsICIgTlQiKTsKKworCisJV2FpdENudCA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwl3aGlsZSAoKFNjYW5SdW5uaW5nKHBBZGFwdGVyKSA9PSBUUlVFKSAmJiAoV2FpdENudCsrIDwgMjAwKSkKKwkJT1NfV0FJVCg1MDApOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJZm9yKGk9MDsgaTxwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA7aSsrKQorCXsKKwkJaWYoIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw9PTApCisJCQlicmVhazsKKworCQlpZigoc3RybGVuKG1zZykrbWF4X2xlbiApID49IElXX1NDQU5fTUFYX0RBVEEpCisJCQlicmVhazsKKworCQkvL0NoYW5uZWwKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsKTsKKwkJLy9TU0lECisJCW1lbWNweShTc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJU3NpZFtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuXSA9ICdcMCc7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTMzcyIsIFNzaWQpOworCQkvL0JTU0lECisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgICIsCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFswXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzFdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMl0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFszXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzRdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNV0pOworCQkvL0VuY3J5cHRpb24gVHlwZQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS04cyIsR2V0RW5jcnlwdFR5cGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzKSk7CisJCS8vQXV0aGVudGljYXRpb24gTW9kZQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBzIiwgIlVOS05PVyIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLEdldEF1dGhNb2RlKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF1dGhNb2RlKSk7CisJCS8vIFJzc2kKKwkJUnNzaSA9IChJTlQpcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaTsKKwkJaWYgKFJzc2kgPj0gLTUwKQorCQkJUnNzaV9RdWFsaXR5ID0gMTAwOworCQllbHNlIGlmIChSc3NpID49IC04MCkgICAgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgyNCArICgoUnNzaSArIDgwKSAqIDI2KS8xMCk7CisJCWVsc2UgaWYgKFJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisJCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoKChSc3NpICsgOTApICogMjYpLzEwKTsKKwkJZWxzZSAgICAvLyA8IC04NCBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IDA7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTlkIiwgUnNzaV9RdWFsaXR5KTsKKwkJLy8gV2lyZWxlc3MgTW9kZQorCQl3aXJlbGVzc19tb2RlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRkggfHwKKwkJCXdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMURTKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01X04pCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEvbiIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZyIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjRfTikKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nL24iKTsKKwkJZWxzZQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAidW5rbm93Iik7CisJCS8vTmV0d29yayBUeXBlCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBBZCIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgSW4iKTsKKworICAgICAgICBzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiXG4iKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIHdycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKwlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKW1zZyk7Cit9CisKKworI2RlZmluZQlNQUNfTElORV9MRU4JKDE0KzQrNCsxMCsxMCsxMCs2KzYpCS8vIEFkZHIrYWlkK3BzbStkYXRhdGltZStyeGJ5dGUrdHhieXRlK2N1cnJlbnQgdHggcmF0ZStsYXN0IHR4IHJhdGUKK1ZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gc3RydWN0IGl3cmVxICp3cnEpCit7CisJSU5UIGk7CisJUlRfODAyXzExX01BQ19UQUJMRSBNYWNUYWI7CisJY2hhciAqbXNnOworCisJTWFjVGFiLk51bSA9IDA7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIoTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFkZHIsICZwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFpZCA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Qc20gPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlBzTW9kZTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5NaW1vUHMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLk1tcHNNb2RlOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBGaWxsIGluIFJTU0kgcGVyIGVudHJ5CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTAgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTEgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTE7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTIgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTI7CisKKwkJCS8vIHRoZSBjb25uZWN0ZWQgdGltZSBwZXIgZW50cnkKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Db25uZWN0ZWRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5TdGFDb25uZWN0VGltZTsKKyNpZiAwIC8vIFRvRG8KKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50ID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5IU0NvdW50ZXIuVG90YWxUeEJ5dGVDb3VudCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQ7CisjZW5kaWYKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTUNTID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5CVyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLkJXOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TaG9ydEdJID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU1RCQyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLnJzdiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLnJzdjsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTU9ERSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS53b3JkOworCisJCQlNYWNUYWIuTnVtICs9IDE7CisJCX0KKwl9CisJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1hY1RhYiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwl9CisKKwltc2cgPSAoQ0hBUiAqKSBrbWFsbG9jKHNpemVvZihDSEFSKSooTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSwgTUVNX0FMTE9DX0ZMQUcpOworCW1lbXNldChtc2csIDAgLE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiApOworCXNwcmludGYobXNnLCIlcyIsIlxuIik7CisJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTRzJS00cyUtNHMlLTEwcyUtMTBzJS0xMHMlLTZzJS02c1xuIiwKKwkJIk1BQyIsICJBSUQiLCAiUFNNIiwgIkxEVCIsICJSeEIiLCAiVHhCIiwiQ1R4UiIsICJMVHhSIik7CisKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJaWYoKHN0cmxlbihtc2cpK01BQ19MSU5FX0xFTiApID49IChNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pICkKKwkJCQlicmVhazsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggICIsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPkFpZCk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5MYXN0RGF0YVBhY2tldFRpbWUqLyk7IC8vIFRvRG8KKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudCovKTsgLy8gVG9EbworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFR4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZCIsUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQ3VyclR4UmF0ZV0pOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNmRcbiIsMC8qUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTGFzdFR4UmF0ZV0qLyk7IC8vIFRvRG8KKwkJfQorCX0KKwkvLyBmb3IgY29tcGF0aWJsZSB3aXRoIG9sZCBBUEkganVzdCBkbyB0aGUgcHJpbnRrIHRvIGNvbnNvbGUKKwkvL3dycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCS8vaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyIsIG1zZykpOworCX0KKworCWtmcmVlKG1zZyk7Cit9CisjZW5kaWYgLy8gVUNPUyAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2V0X0JBU2V0dXBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCB0aWQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKy8qCisJVGhlIEJBU2V0dXAgaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KKyovCisJLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisKKwlpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiAxNSkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4XG4iLCBtYWNbMF0sIG1hY1sxXSwKKwkJCQltYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7CisKKwkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisgICAgCWlmIChwRW50cnkpIHsKKyAgICAgICAgCXByaW50aygiXG5TZXR1cCBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKwkgICAgICAgIEJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCB0aWQsIDAsIDEwMCwgVFJVRSk7CisgICAgCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9CQURlY2xpbmVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgYkJBRGVjbGluZTsKKworCWJCQURlY2xpbmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGJCQURlY2xpbmUgPT0gMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKwl9CisJZWxzZSBpZiAoYkJBRGVjbGluZSA9PSAxKQorCXsKKwkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JBRGVjbGluZV9Qcm9jOjooQkFEZWNsaW5lPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworLyoKKwlUaGUgQkFPcmlUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiBOVU1fT0ZfVElEKQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkgICAgcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKKwkgICAgICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkgICAgaWYgKHBFbnRyeSkgeworCSAgICAgICAgcHJpbnRrKCJcblRlYXIgZG93biBPcmkgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7CisgICAgICAgIEJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UsIFRSVUUpOworCSAgICB9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfQkFSZWNUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworLyoKKwlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiBOVU1fT0ZfVElEKQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKKwkJICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkJaWYgKHBFbnRyeSkgeworCQkgICAgcHJpbnRrKCJcblRlYXIgZG93biBSZWMgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7CisJCSAgICBCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFKTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgSHRCdzsKKworCUh0QncgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChIdEJ3ID09IEJXXzQwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7CisJZWxzZSBpZiAoSHRCdyA9PSBCV18yMCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QndfUHJvYzo6KEh0Qnc9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIEh0TWNzLCBNY3NfdG1wOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIEJPT0xFQU4gYkF1dG9SYXRlID0gRkFMU0U7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlNY3NfdG1wID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChNY3NfdG1wIDw9IDE1IHx8IE1jc190bXAgPT0gMzIpCisJCUh0TWNzID0gTWNzX3RtcDsKKwllbHNlCisJCUh0TWNzID0gTUNTX0FVVE87CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBIdE1jczsKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoSHRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRTpGQUxTRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihIdE1jcz0lZCwgYkF1dG9UeFJhdGVTd2l0Y2ggPSAlZClcbiIsCisJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUywgcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpKTsKKworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKSB8fAorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPCBNT0RFX0hUTUlYKSkKKwkJeworCSAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKKwkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSAzKSAmJgorCSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spKQorCQkJeworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAoTE9ORykgKFJhdGVJZFRvTWJwc1tIdE1jc10gKiAxMDAwMDAwKSk7CisJCQl9CisJICAgICAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCisJCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDcpICYmCisJICAgICAgICAgICAgCShwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9PRkRNKSkKKwkJCXsKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3MrNF0gKiAxMDAwMDAwKSk7CisJCQl9CisJCQllbHNlCisJCQkJYkF1dG9SYXRlID0gVFJVRTsKKworCQkJaWYgKGJBdXRvUmF0ZSkKKwkJCXsKKwkgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CisJCQl9CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlKSk7CisJCX0KKyAgICAgICAgaWYgKEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlTZXRDb21tb25IVChwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBIdEdpOworCisJSHRHaSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoIEh0R2kgPT0gR0lfNDAwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwllbHNlIGlmICggSHRHaSA9PSBHSV84MDAgKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0R2lfUHJvYzo6KFNob3J0R0k9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgU2l6ZTsKKworCVNpemUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFNpemUgPD0wIHx8IFNpemUgPj02NCkKKwl7CisJCVNpemUgPSA4OworCX0KKwlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IFNpemUtMTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfSHRUeEJBU2l6ZSA6OihUeEJBU2l6ZT0gJWQpXG4iLCBTaXplKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKKwllbHNlIGlmICggVmFsdWUgPT0gSFRNT0RFX01NICkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE9wTW9kZV9Qcm9jOjooSHRPcE1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpKTsKKworCXJldHVybiBUUlVFOworCit9CisKK0lOVAlTZXRfSHRTdGJjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gU1RCQ19VU0UpCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJZWxzZSBpZiAoIFZhbHVlID09IFNUQkNfTk9ORSApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU3RiY19Qcm9jOjooSHRTdGJjPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRIdGNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKyAgICAgICAgCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRIdGNfUHJvYzo6KEh0SHRjPSVkKVxuIixwQWQtPkhUQ0VuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0RXh0Y2hhX1Byb2M6OihIdEV4dGNoYT0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OworCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1wZHVEZW5zaXR5X1Byb2M6OihIdE1wZHVEZW5zaXR5PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisKKwlpZiAoVmFsdWUgPj0xICYmIFZhbHVlIDw9IDY0KQorCXsKKwkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJfQorCWVsc2UKKwl7CisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCX0KKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCYVdpblNpemVfUHJvYzo6KEh0QmFXaW5TaXplPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisJeworCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisgICAgICAgIAlwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKKwl9CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFJkZ19Qcm9jOjooSHRSZGc9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJSZGcpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKwl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRMaW5rQWRhcHRfUHJvYzo6KEh0TGlua0FkYXB0PSVkKVxuIixwQWQtPmJMaW5rQWRhcHQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PSAxICkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QW1zZHVfUHJvYzo6KEh0QW1zZHU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRBdXRvQmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKyAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QXV0b0JhX1Byb2M6OihIdEF1dG9CYT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCisJcmV0dXJuIFRSVUU7CisKK30KKworSU5UCVNldF9IdFByb3RlY3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKKyAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRQcm90ZWN0X1Byb2M6OihIdFByb3RlY3Q9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgbW9kZTsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworLyoKKwlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgbW9kZSB2YWx1ZS4KKyovCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgbW9kZSB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisgICAJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJbW9kZSA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmIChtb2RlID4gTU1QU19FTkFCTEUpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCBtb2RlKTsKKworCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkJaWYgKHBFbnRyeSkgeworCQkgICAgcHJpbnRrKCJcblNlbmRQU01QQWN0aW9uIE1JUFMgbW9kZSA9ICVkXG4iLCBtb2RlKTsKKwkJICAgIFNlbmRQU01QQWN0aW9uKHBBZCwgcEVudHJ5LT5BaWQsIG1vZGUpOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCisKK30KKworSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPD0zICYmIFZhbHVlID49IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOworCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gMzsKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNSU1PUFNtb2RlX1Byb2M6OihNSU1PUFMgbW9kZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IEZBTFNFOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VTaG9ydEdJX1Byb2M6OihGb3JjZVNob3J0R0k9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisKK0lOVAlTZXRfRm9yY2VHRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IEZBTFNFOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VHRl9Qcm9jOjooRm9yY2VHRj0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TWltb1BzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWltb1BzX1Byb2M6OihIdE1pbW9Qcz0lZClcbiIscEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNldENvbW1vbkhUKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU9JRF9TRVRfSFRfUEhZTU9ERQkJU2V0SFQ7CisKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpCisJCXJldHVybiBGQUxTRTsKKworCVNldEhULlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCVNldEhULlRyYW5zbWl0Tm8gPSAoKFVDSEFSKXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgpOworCVNldEhULkh0TW9kZSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworCVNldEhULkV4dE9mZnNldCA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCVNldEhULk1DUyA9IE1DU19BVVRPOworCVNldEhULkJXID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKwlTZXRIVC5TVEJDID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOworCVNldEhULlNIT1JUR0kgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisKKwlSVE1QU2V0SFQocEFkLCAmU2V0SFQpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTZXRfRml4ZWRUeE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKwlpZiAoc3RyY21wKGFyZywgIk9GRE0iKSA9PSAwIHx8IHN0cmNtcChhcmcsICJvZmRtIikgPT0gMCkKKwl7CisJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX09GRE07CisJfQorCWVsc2UgaWYgKHN0cmNtcChhcmcsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChhcmcsICJjY2siKSA9PSAwKQorCXsKKyAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfQ0NLOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9GaXhlZFR4TW9kZV9Qcm9jOjooRml4ZWRUeE1vZGU9JWQpXG4iLCBmaXhfdHhfbW9kZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorSU5UCVNldF9PcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBSVDI4NzAKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbiBub3Qgc3dpdGNoIG9wZXJhdGUgbW9kZSBvbiBpbnRlcmZhY2UgdXAgISEgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5PcE1vZGUgPSBPUE1PREVfU1RBOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+T3BNb2RlID0gT1BNT0RFX0FQOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9PcE1vZGVfUHJvYzo6KE9wTW9kZT0lcylcbiIsIHBBZC0+T3BNb2RlID09IDEgPyAiQVAgTW9kZSIgOiAiU1RBIE1vZGUiKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1BDSEFSICAgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAorICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKQoreworCXN3aXRjaChhdXRoTW9kZSkKKwl7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlT3BlbjoKKwkJCXJldHVybiAiT1BFTiI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOgorCQkJcmV0dXJuICJXUEFQU0siOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDoKKwkJCXJldHVybiAiU0hBUkVEIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6CisJCQlyZXR1cm4gIldQQSI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjoKKwkJCXJldHVybiAiV1BBMiI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKKwkJCXJldHVybiAiV1BBMlBTSyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisJCQlyZXR1cm4gIldQQVBTS1dQQTJQU0siOworICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorCQkJcmV0dXJuICJXUEExV1BBMiI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKKwkJCXJldHVybiAiV1BBTk9ORSI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIlVOS05PVyI7CisJfQorfQorCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCisgICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpCit7CisJc3dpdGNoKGVuY3J5TW9kZSkKKwl7CisJCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQkJcmV0dXJuICJOT05FIjsKKwkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJCXJldHVybiAiV0VQIjsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCQkJcmV0dXJuICJUS0lQIjsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJcmV0dXJuICJBRVMiOworICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisJCQlyZXR1cm4gIlRLSVBBRVMiOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJVTktOT1ciOworCX0KK30KKworSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE5hbWUsCisJSU4JUFVDSEFSCQkJcEJ1ZikKK3sKKwlJTlQJU3RhdHVzID0gMDsKKworCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQorCXsKKwkJaWYgKCFzdHJjbXAocE5hbWUsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpKQorCQl7CisJCQlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5zaG93X3Byb2MocEFkLCBwQnVmKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJYnJlYWs7ICAvL0V4aXQgZm9yIGxvb3AuCisJCX0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lID09IE5VTEwpCisJeworCQlzcHJpbnRmKHBCdWYsICJcbiIpOworCQlmb3IgKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MgPSBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0M7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MrKykKKwkJCXNwcmludGYocEJ1ZiwgIiVzJXNcbiIsIHBCdWYsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpOworCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKK0lOVAlTaG93X1NTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Tc2lkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisJeworCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRyIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFCIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEiKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0IvRyIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExRzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFHIik7CisJCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMU5fMl80RzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCAyLjRHIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFHL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRy9OIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMU5fNUc6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExTiBvbmx5IHdpdGggNUciKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworSU5UCVNob3dfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKQorCXsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFNob3J0Iik7CisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0TG9uZyIpOworCQkJYnJlYWs7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86CisJCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVsdSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikKKwl7CisJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCXNwcmludGYocEJ1ZiwgIlx0T04iKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8vQWx3YXlzIE9GRgorCQkJc3ByaW50ZihwQnVmLCAiXHRPRkYiKTsKKwkJCWJyZWFrOworCQljYXNlIDA6IC8vQVVUTworCQkJc3ByaW50ZihwQnVmLCAiXHRBdXRvIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVsdSkiLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTaG93X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQorCXsKKwkJc3ByaW50ZihwQnVmLCAiXHQ0MCBNSHoiKTsKKwl9CisJZWxzZQorCXsKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQyMCBNSHoiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKQorCXsKKwkJY2FzZSBHSV80MDA6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdJXzQwMCIpOworCQkJYnJlYWs7CisJCWNhc2UgR0lfODAwOgorCQkJc3ByaW50ZihwQnVmLCAiXHRHSV84MDAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKQorCXsKKwkJY2FzZSBIVE1PREVfR0Y6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdGIik7CisJCQlicmVhazsKKwkJY2FzZSBIVE1PREVfTU06CisJCQlzcHJpbnRmKHBCdWYsICJcdE1NIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEV4dGNoYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKQorCXsKKwkJY2FzZSBFWFRDSEFfQkVMT1c6CisJCQlzcHJpbnRmKHBCdWYsICJcdEJlbG93Iik7CisJCQlicmVhazsKKwkJY2FzZSBFWFRDSEFfQUJPVkU6CisJCQlzcHJpbnRmKHBCdWYsICJcdEFib3ZlIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKK0lOVAlTaG93X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0UmRnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTaG93X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUpCisJeworCQljYXNlIEJTU19BREhPQzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QWRob2MiKTsKKwkJCWJyZWFrOworCQljYXNlIEJTU19JTkZSQToKKwkJCXNwcmludGYocEJ1ZiwgIlx0SW5mcmEiKTsKKwkJCWJyZWFrOworCQljYXNlIEJTU19BTlk6CisJCQlzcHJpbnRmKHBCdWYsICJcdEFueSIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX01PTklUT1I6CisJCQlzcHJpbnRmKHBCdWYsICJcdE1vbml0b3IiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgcEFkLT5TdGFDZmcuQnNzVHlwZSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0F1dGhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKChBdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKSAmJgorCQkoQXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKEF1dGhNb2RlKSk7CisJZWxzZQorCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBBdXRoTW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKChXZXBTdGF0dXMgPj0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCShXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb240S2V5QWJzZW50KSkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoV2VwU3RhdHVzKSk7CisJZWxzZQorCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBXZXBTdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVVDSEFSIERlZmF1bHRLZXlJZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlEZWZhdWx0S2V5SWQgPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgRGVmYXVsdEtleUlkKTsKKworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XZXBLZXlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgSU5UCQkJCUtleUlkeCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlVQ0hBUiAgIEtleVsxNl0gPSB7MH0sIEtleUxlbmd0aCA9IDA7CisJSU5UCQlpbmRleCA9IEJTUzA7CisKKwlLZXlMZW5ndGggPSBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXlMZW47CisJTmRpc01vdmVNZW1vcnkoS2V5LCBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXksIEtleUxlbmd0aCk7CisKKwkvL2NoZWNrIGtleSBzdHJpbmcgaXMgQVNDSUkgb3Igbm90CisgICAgaWYgKFJUTVBDaGVja1N0clByaW50QWJsZShLZXksIEtleUxlbmd0aCkpCisgICAgICAgIHNwcmludGYocEJ1ZiwgIlx0JXMiLCBLZXkpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIHNwcmludGYocEJ1ZiwgIlx0Iik7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgS2V5TGVuZ3RoOyBpZHgrKykKKyAgICAgICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgS2V5W2lkeF0pOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5MV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAwLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5Ml9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAxLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5M19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAyLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5NF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAzLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfV1BBUFNLX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJSU5UIAlpZHg7CisJVUNIQVIJUE1LWzMyXSA9IHswfTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJTmRpc01vdmVNZW1vcnkoUE1LLCBwQWQtPlN0YUNmZy5QTUssIDMyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgIHNwcmludGYocEJ1ZiwgIlx0UE1LID0gIik7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCAzMjsgaWR4KyspCisgICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgUE1LW2lkeF0pOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9zYW5pdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9zYW5pdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI0MzIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3Nhbml0eS5jCkBAIC0wLDAgKzEsMTY2MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzYW5pdHkuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworZXh0ZXJuIFVDSEFSICAgIFdQU19PVUlbXTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIpCit7CisgICAgUE1MTUVfQUREQkFfUkVRX1NUUlVDVCAgIHBJbmZvOworCisgICAgcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopTXNnOworCisgICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfQUREQkFfUkVRX1NUUlVDVCkpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisJLyoKKyAgICBpZiAoKHBJbmZvLT5CYUJ1ZlNpemUgPiBNQVhfUlhfUkVPUkRFUkJVRikgfHwgKHBJbmZvLT5CYUJ1ZlNpemUgPCAyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gUnggUmVvcmRlcmluZyBidWZmZXIgdG9vIGJpZyBvciB0b28gc21hbGxcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKwkqLworCisgICAgaWYgKChwSW5mby0+cEFkZHJbMF0mMHgwMSkgPT0gMHgwMSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gYnJvYWRjYXN0IGFkZHJlc3Mgbm90IHN1cHBvcnQgQkFcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lRGVsQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbikKK3sKKwlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKnBJbmZvOworCXBJbmZvID0gKE1MTUVfREVMQkFfUkVRX1NUUlVDVCAqKU1zZzsKKworICAgIGlmICgoTXNnTGVuICE9IHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gbWVzc2FnZSBsZW5naHQgbm90IGNvcnJlY3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHBJbmZvLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgTWFjIGlzIG5vdCBhc3NvY2lhdGVkIHlldC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPlRJRCAmIDB4ZjApKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBUSUQgaXMgaW5jb3JyZWN0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisJaWYgKE5kaXNFcXVhbE1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwSW5mby0+QWRkciwgTUFDX0FERFJfTEVOKSA9PSAwKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSB0aGUgcGVlciBhZGRyIGRvc2VuJ3QgZXhpc3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIpCit7CisJUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9BRERCQV9SRVEgcEFkZEZyYW1lOworCXBBZGRGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKShwTXNnKTsKKwlpZiAoTXNnTGVuIDwgKHNpemVvZihGUkFNRV9BRERCQV9SRVEpKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOworCXBBZGRGcmFtZS0+QmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYocEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQpOworCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBRERCQSBSZXF1ZXN0LiB0aWQ9JXgsIEJ1ZnNpemU9JXgsIEFNU0RVU3VwcG9ydGVkPSV4IFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElELCBwQWRkRnJhbWUtPkJhUGFybS5CdWZTaXplLCBwQWRkRnJhbWUtPkJhUGFybS5BTVNEVVN1cHBvcnRlZCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmMHhmZmYwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCXJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbikKK3sKKwkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQRlJBTUVfQUREQkFfUlNQIHBBZGRGcmFtZTsKKworCXBBZGRGcmFtZSA9IChQRlJBTUVfQUREQkFfUlNQKShwTXNnKTsKKwlpZiAoTXNnTGVuIDwgKHNpemVvZihGUkFNRV9BRERCQV9SU1ApKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCSooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKKwlwQWRkRnJhbWUtPlN0YXR1c0NvZGUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlN0YXR1c0NvZGUpOworCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOworCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKKworfQorCitCT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBXY2lkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuICkKK3sKKwkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQRlJBTUVfREVMQkFfUkVRICBwRGVsRnJhbWU7CisJaWYgKE1zZ0xlbiAhPSAoc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJcERlbEZyYW1lID0gKFBGUkFNRV9ERUxCQV9SRVEpKHBNc2cpOworCisJKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOworCXBEZWxGcmFtZS0+UmVhc29uQ29kZSA9IGNwdTJsZTE2KHBEZWxGcmFtZS0+UmVhc29uQ29kZSk7CisKKwlpZiAocERlbEZyYW1lLT5EZWxiYVBhcm0uVElEICYweGZmZjApCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBJTiBVQ0hBUiAgTXNnQ2hhbm5lbCwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgUFVDSEFSIHBCc3NpZCwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpwU3NpZExlbiwKKyAgICBPVVQgVUNIQVIgKnBCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCisgICAgT1VUIFVDSEFSICpwQ2hhbm5lbCwKKyAgICBPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAorICAgIE9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAorICAgIE9VVCBDRl9QQVJNICpwQ2ZQYXJtLAorICAgIE9VVCBVU0hPUlQgKnBBdGltV2luLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgKnBFcnAsCisgICAgT1VUIFVDSEFSICpwRHRpbUNvdW50LAorICAgIE9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCisgICAgT1VUIFVDSEFSICpwQmNhc3RGbGFnLAorICAgIE9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAorICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCisgICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKyAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisgICAgT1VUCVVDSEFSICpwQ2tpcEZsYWcsCisgICAgT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAorICAgIE9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKKyAgICBPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCisgICAgT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorICAgIE9VVCBVTE9ORyAqcFJhbGlua0llLAorICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIE9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAorCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAorCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbE9mZnNldCwJCS8vIEh0IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldChhYm92ZSBvciBiZWxvdykKKyAgICBPVVQgVVNIT1JUICpMZW5ndGhWSUUsCisgICAgT1VUCVBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKyAgICBDSEFSCQkJCSpQdHI7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQ0hBUiAJCQkJVGltTGVuOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIFBGUkFNRV84MDJfMTEJCXBGcmFtZTsKKyAgICBQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisgICAgVUNIQVIJCQkJU3ViVHlwZTsKKyAgICBVQ0hBUgkJCQlTYW5pdHk7CisgICAgLy9VQ0hBUgkJCQlFQ1dNaW4sIEVDV01heDsKKyAgICAvL01BQ19DU1I5X1NUUlVDCQlDc3I5OworICAgIFVMT05HCQkJCUxlbmd0aCA9IDA7CisKKwkvLyBGb3Igc29tZSAxMWEgQVAgd2hpY2ggZGlkbid0IGhhdmUgRFNfSUUsIHdlIHVzZSB0d28gY29uZGl0aW9ucyB0byBkZWNpZGUgdGhlIGNoYW5uZWwKKwkvLwkxLiBJZiB0aGUgQVAgaXMgMTFuIGVuYWJsZWQsIHRoZW4gY2hlY2sgdGhlIGNvbnRyb2wgY2hhbm5lbC4KKwkvLwkyLiBJZiB0aGUgQVAgZGlkbid0IGhhdmUgYW55IGluZm8gYWJvdXQgY2hhbm5lbCwgdXNlIHRoZSBjaGFubmVsIHdlIHJlY2VpdmVkIHRoaXMgZnJhbWUgYXMgdGhlIGNoYW5uZWwuIChNYXkgaW5hY2N1cmFjeSEhKQorCVVDSEFSCQkJQ3RybENoYW5uZWwgPSAwOworCisgICAgLy8gQWRkIGZvciAzIG5lY2Vzc2FyeSBFSUQgZmllbGQgY2hlY2sKKyAgICBTYW5pdHkgPSAwOworCisgICAgKnBBdGltV2luID0gMDsKKyAgICAqcEVycCA9IDA7CisgICAgKnBEdGltQ291bnQgPSAwOworICAgICpwRHRpbVBlcmlvZCA9IDA7CisgICAgKnBCY2FzdEZsYWcgPSAwOworICAgICpwTWVzc2FnZVRvTWUgPSAwOworICAgICpwRXh0UmF0ZUxlbiA9IDA7CisgICAgKnBDa2lwRmxhZyA9IDA7CQkJICAgICAgICAvLyBEZWZhdWx0IG9mIENraXBGbGFnIGlzIDAKKyAgICAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9IDB4RkY7ICAvLyBEZWZhdWx0IG9mIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCBpcyAweEZGCisgICAgKkxlbmd0aFZJRSA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisgICAgKnBIdENhcGFiaWxpdHlMZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICpBZGRIdEluZm9MZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorICAgICpwUmFsaW5rSWUgPSAwOworICAgICpwTmV3Q2hhbm5lbCA9IDA7CisgICAgKk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwkvL0RlZmF1bHQgMHhmZiBtZWFucyBubyBzdWNoIElFCisgICAgcENmUGFybS0+YlZhbGlkID0gRkFMU0U7ICAgICAgICAvLyBkZWZhdWx0OiBubyBJRV9DRiBmb3VuZAorICAgIHBRYnNzTG9hZC0+YlZhbGlkID0gRkFMU0U7ICAgICAgLy8gZGVmYXVsdDogbm8gSUVfUUJTU19MT0FEIGZvdW5kCisgICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9FRENBX1BBUkFNRVRFUiBmb3VuZAorICAgIHBRb3NDYXBhYmlsaXR5LT5iVmFsaWQgPSBGQUxTRTsgLy8gZGVmYXVsdDogbm8gSUVfUU9TX0NBUEFCSUxJVFkgZm91bmQKKworICAgIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIC8vIGdldCBzdWJ0eXBlIGZyb20gaGVhZGVyCisgICAgU3ViVHlwZSA9IChVQ0hBUilwRnJhbWUtPkhkci5GQy5TdWJUeXBlOworCisgICAgLy8gZ2V0IEFkZHIyIGFuZCBCU1NJRCBmcm9tIGhlYWRlcgorICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgQ09QWV9NQUNfQUREUihwQnNzaWQsIHBGcmFtZS0+SGRyLkFkZHIzKTsKKworLy8JaGV4X2R1bXAoIkJlYWNvbiIsIE1zZywgTXNnTGVuKTsKKworICAgIFB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisgICAgTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKyAgICAvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBUaW1lc3RhbXAsIFB0ciwgVElNRVNUQU1QX0xFTik7CisKKwlwVGltZXN0YW1wLT51Lkxvd1BhcnQgPSBjcHUybGUzMihwVGltZXN0YW1wLT51Lkxvd1BhcnQpOworCXBUaW1lc3RhbXAtPnUuSGlnaFBhcnQgPSBjcHUybGUzMihwVGltZXN0YW1wLT51LkhpZ2hQYXJ0KTsKKworICAgIFB0ciArPSBUSU1FU1RBTVBfTEVOOworICAgIExlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCisgICAgLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQmVhY29uUGVyaW9kLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworICAgIExlbmd0aCArPSAyOworCisgICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICBpZiAoQ0FQX0lTX0VTU19PTigqcENhcGFiaWxpdHlJbmZvKSkKKyAgICAgICAgKnBCc3NUeXBlID0gQlNTX0lORlJBOworICAgIGVsc2UKKyAgICAgICAgKnBCc3NUeXBlID0gQlNTX0FESE9DOworCisgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkgUHRyOworCisgICAgLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICB3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNlY3VyZSBjb3B5IFZJRSB0byBWYXJJRVtNQVhfVklFX0xFTl0gZGlkbid0IG92ZXJmbG93LgorICAgICAgICAvLworICAgICAgICBpZiAoKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSA+PSBNQVhfVklFX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBWYXJpYWJsZSBJRXMgb3V0IG9mIHJlc291cmNlIFtsZW4oPSVkKSA+IE1BWF9WSUVfTEVOKD0lZCldXG4iLAorICAgICAgICAgICAgICAgICAgICAoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpLCBNQVhfVklFX0xFTikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2gocEVpZC0+RWlkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElFX1NTSUQ6CisgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBoYXMgb25lIFNTSUQgRUlEIGluIHRoaXMgYmVhY29uLCBpZ25vcmUgdGhlIHNlY29uZCBvbmUKKyAgICAgICAgICAgICAgICBpZiAoU2FuaXR5ICYgMHgxKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwU3NpZExlbiA9IHBFaWQtPkxlbjsKKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDI7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcFN1cFJhdGVMZW4gPSBwRWlkLT5MZW47CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgU3VwUmF0ZSwgcFN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpICAvL05vdGU6IGFsbG93IGV4dGVuc2lvbi4hIQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CS8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgorCisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisKKwkJCQkJUHRyID0gKFBVQ0hBUikgcFZJRTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gcEVpZC0+TGVuID0gJWRcbiIsIHBFaWQtPkxlbikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6CisJCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCisJCQl7CisJCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKKwkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKKwkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCQkqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKworCQkJCUN0cmxDaGFubmVsID0gQWRkSHRJbmZvLT5Db250cm9sQ2hhbjsKKworCQkJCSooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikpOworCQkJCSooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKKwkJCSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCSAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9BRERfSFQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKQorCQkJeworCQkJCSpOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfRkhfUEFSTToKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoSUVfRkhfUEFSTSkgXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRFNfUEFSTToKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwQ2hhbm5lbCA9ICpwRWlkLT5PY3RldDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJaWYgKENoYW5uZWxTYW5pdHkocEFkLCAqcENoYW5uZWwpID09IDApCisJCQkJCQl7CisKKwkJCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfRFNfUEFSTSAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9DRl9QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSA2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+YlZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwQ291bnQgPSBwRWlkLT5PY3RldFswXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwUGVyaW9kID0gcEVpZC0+T2N0ZXRbMV07CisgICAgICAgICAgICAgICAgICAgIHBDZlBhcm0tPkNmcE1heER1cmF0aW9uID0gcEVpZC0+T2N0ZXRbMl0gKyAyNTYgKiBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwRHVyUmVtYWluaW5nID0gcEVpZC0+T2N0ZXRbNF0gKyAyNTYgKiBwRWlkLT5PY3RldFs1XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfQ0ZfUEFSTVxuIikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0lCU1NfUEFSTToKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBdGltV2luLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSUJTU19QQVJNXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICAgICAgICAgIGNhc2UgSUVfVElNOgorICAgICAgICAgICAgICAgIGlmKElORlJBX09OKHBBZCkgJiYgU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldFRpbUJpdCgoUFVDSEFSKXBFaWQsIHBBZC0+U3RhQWN0aXZlLkFpZCwgJlRpbUxlbiwgcEJjYXN0RmxhZywgcER0aW1Db3VudCwgcER0aW1QZXJpb2QsIHBNZXNzYWdlVG9NZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAkqcE5ld0NoYW5uZWwgPSBwRWlkLT5PY3RldFsxXTsJLy9leHRyYWN0IG5ldyBjaGFubmVsIG51bWJlcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgICAgIC8vIENDWCB2MiBoYXMgdGhlIHNhbWUgSUUsIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KKyAgICAgICAgICAgIC8vIFdpZmkgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWxlLCBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vCisgICAgICAgICAgICAvLyBjYXNlIElFX1dQQToKKyAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIC8vIENoZWNrIEJyb2FkY29tL0F0aGVyb3MgODAyLjExbiBPVUkgdmVyc2lvbiwgZm9yIEhUIENhcGFiaWxpdHkgSUUuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCisgICAgICAgICAgICAgICAgLyppZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBCUk9BRENPTV9PVUksIDMpICYmIChwRWlkLT5MZW4gPj0gNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAlpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9CUk9BRENPTV9IVCkgJiYgKHBFaWQtPkxlbiA+PSAzMCkpCisgICAgICAgICAgICAJCXsKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisJCQkJfQorICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCWlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDI2KSkKKyAgICAgICAgICAgIAkJeworCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkoQWRkSHRJbmZvLCAmcEVpZC0+T2N0ZXRbNF0sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJCQkqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisJCQkJfQorICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgfQorCQkJCSovCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIE9VSSB2ZXJzaW9uLCBmaWx0ZXIgb3V0IG5vbi1zdGFuZGFyZCB1c2FnZQorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFJBTElOS19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLypwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFaWQtPk9jdGV0WzNdICE9IDApCisgICAgICAgIAkJCQkqcFJhbGlua0llID0gcEVpZC0+T2N0ZXRbM107CisgICAgICAgIAkJCWVsc2UKKyAgICAgICAgCQkJCSpwUmFsaW5rSWUgPSAweGYwMDAwMDAwOyAvLyBTZXQgdG8gbm9uLXplcm8gdmFsdWUgKGNhbid0IHNldCBiaXQwLTIpIHRvIHJlcHJlc2VudCB0aGlzIGlzIFJhbGluayBDaGlwLiBTbyBhdCBsaW5rdXAsIHdlIHdpbGwgc2V0IHJhbGlua2NoaXAgZmxhZy4KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIFRoaXMgSFQgSUUgaXMgYmVmb3JlIElFRUUgZHJhZnQgc2V0IEhUIElFIHZhbHVlLjIwMDYtMDktMjggYnkgSmFuLgorCisgICAgICAgICAgICAgICAgLy8gT3RoZXIgdmVuZG9ycyBoYWQgcHJvZHVjdGlvbiBiZWZvcmUgSUVfSFRfQ0FQIHZhbHVlIGlzIGFzc2lnbmVkLiBUbyBiYWNrd2FyZCBzdXBwb3J0IHRob3NlIG9sZC1maXJtd2FyZSBBUCwKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBicm9hZGNvbS1kZWZpZW5kIHByZS04MDIuMTFuRDEuMCBPVUkgZm9yIEhUIHJlbGF0ZWQgSUUsIGluY2x1ZGluZyBIVCBDYXBhdGlsaXRpZXMgSUUgYW5kIEhUIEluZm9ybWF0aW9uIElFCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKCpwSHRDYXBhYmlsaXR5TGVuID09IDApICYmIE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUFJFX05fSFRfT1VJLCAzKSAmJiAocEVpZC0+TGVuID49IDQpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fSFRfQ0FQKSAmJiAocEVpZC0+TGVuID49IDMwKSAmJiAoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9BRERfSFQpICYmIChwRWlkLT5MZW4gPj0gMjYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgorICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSAyNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgcHRyOworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwRWlkLT5PY3RldFs4XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7IC8vIGI1fjYgaXMgQUMgSU5ERVgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVthY2ldICA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7ICAgLy8gYjUgaXMgQUNNCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOyAgICAgICAgICAgICAgIC8vIGIwfjMgaXMgQUlGU04KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyKzEpICYgMHgwZjsgICAgICAgICAgICAgLy8gYjB+NCBpcyBDd21pbgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFthY2ldID0gKihwdHIrMSkgPj4gNDsgICAgICAgICAgICAgICAvLyBiNX44IGlzIEN3bWF4CisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbYWNpXSAgPSAqKHB0cisyKSArIDI1NiAqICgqKHB0ciszKSk7IC8vIGluIHVuaXQgb2YgMzItdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA0OyAvLyBwb2ludCB0byBuZXh0IEFDCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfSU5GT19FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOworCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IEVEQ0EgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQkVdICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXSA9IDM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXSA9IENXX01JTl9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV0gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gID0gMDsKKworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JLXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS10gPSA3OworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS10gPSBDV19NSU5fSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdID0gQ1dfTUFYX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdICA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WSV0gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID0gMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldID0gQ1dfTUlOX0lOX0JJVFMtMTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldID0gQ1dfTUFYX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICA9IDk2OyAgIC8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfVk9dICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXSA9IDI7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSA9IENXX01JTl9JTl9CSVRTLTI7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXSA9IENXX01BWF9JTl9CSVRTLTE7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dICA9IDQ4OyAgIC8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcworICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHJhdGVzIGluIE1sbWVBdXguCisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcworICAgICAgICAgICAgICAgICAgICAvLyBSVE1QQ2hlY2tSYXRlcyhwQWQsIEV4dFJhdGUsIHBFeHRSYXRlTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRVJQOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwRXJwID0gKFVDSEFSKXBFaWQtPk9jdGV0WzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6CisgICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4CisgICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjgKKyAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDEyWFggdXNlZCBsZW5ndGggYXMgMzAKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FQX1RYX1BPV0VSOgorICAgICAgICAgICAgICAgIC8vIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCisgICAgICAgICAgICAgICAgLy8wLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSA2CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDA2KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEdldCBjZWxsIHBvd2VyIGxpbWl0IGluIGRCbQorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAqKHBFaWQtPk9jdGV0ICsgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFdQQTIgJiA4MDIuMTFpIFJTTgorICAgICAgICAgICAgY2FzZSBJRV9SU046CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gT1VJIGZvciB2ZXJzaW9uIGFueW1vcmUsIGNoZWNrIHRoZSBncm91cCBjaXBoZXIgT1VJIGJlZm9yZSBjb3B5aW5nCisgICAgICAgICAgICAgICAgaWYgKFJUTVBFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgorICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCWNhc2UgSUVfQ09VTlRSWToKKwkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KKyAgICAgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisgICAgfQorCisgICAgLy8gRm9yIHNvbWUgMTFhIEFQLiBpdCBkaWQgbm90IGhhdmUgdGhlIGNoYW5uZWwgRUlELCBwYXRjaCBoZXJlCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVVDSEFSIExhdGNoUmZDaGFubmVsID0gTXNnQ2hhbm5lbDsKKwkJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKChTYW5pdHkgJiAweDQpID09IDApKQorCQl7CisJCQlpZiAoQ3RybENoYW5uZWwgIT0gMCkKKwkJCQkqcENoYW5uZWwgPSBDdHJsQ2hhbm5lbDsKKwkJCWVsc2UKKwkJCQkqcENoYW5uZWwgPSBMYXRjaFJmQ2hhbm5lbDsKKwkJCVNhbml0eSB8PSAweDQ7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoU2FuaXR5ICE9IDB4NykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gbWlzc2luZyBmaWVsZCwgU2FuaXR5PTB4JTAyeFxuIiwgU2FuaXR5KSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCit9CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sgZm9yIHNvbWUgSUUgYWRkcmVzc2VkICBpbiA4MDIuMTFuIGQzLjAzLgorCVJldHVybjoKKwkJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eTIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgVUNIQVIgCSpSZWdDbGFzcykKK3sKKwlDSEFSCQkJCSpQdHI7CisJUEZSQU1FXzgwMl8xMQkJcEZyYW1lOworCVBFSURfU1RSVUNUCQkJcEVpZDsKKwlVTE9ORwkJCQlMZW5ndGggPSAwOworCisJcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisJKlJlZ0NsYXNzID0gMDsKKwlQdHIgPSBwRnJhbWUtPk9jdGV0OworCUxlbmd0aCArPSBMRU5HVEhfODAyXzExOworCisJLy8gZ2V0IHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwlQdHIgKz0gVElNRVNUQU1QX0xFTjsKKwlMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKKworCS8vIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CisKKwkvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCVB0ciArPSAyOworCUxlbmd0aCArPSAyOworCisJcEVpZCA9IChQRUlEX1NUUlVDVCkgUHRyOworCisJLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwl3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKKwl7CisJCXN3aXRjaChwRWlkLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfU1VQUF9SRUdfQ0xBU1M6CisJCQkJaWYocEVpZC0+TGVuID4gMCkKKwkJCQl7CisJCQkJCSpSZWdDbGFzcyA9ICpwRWlkLT5PY3RldDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCisJCUxlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorCQlwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCisJT1VUIFVDSEFSICpwU2NhblR5cGUpCit7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKkluZm87CisKKwlJbmZvID0gKE1MTUVfU0NBTl9SRVFfU1RSVUNUICopKE1zZyk7CisJKnBCc3NUeXBlID0gSW5mby0+QnNzVHlwZTsKKwkqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7CisJKnBTY2FuVHlwZSA9IEluZm8tPlNjYW5UeXBlOworCisJaWYgKCgqcEJzc1R5cGUgPT0gQlNTX0lORlJBIHx8ICpwQnNzVHlwZSA9PSBCU1NfQURIT0MgfHwgKnBCc3NUeXBlID09IEJTU19BTlkpCisJCSYmICgqcFNjYW5UeXBlID09IFNDQU5fQUNUSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCXx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUKKwkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCB8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJKSkKKwl7CisJCXJldHVybiBUUlVFOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcVNhbml0eSBmYWlsIC0gd3JvbmcgQnNzVHlwZSBvciBTY2FuVHlwZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1VDSEFSIENoYW5uZWxTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVUNIQVIgY2hhbm5lbCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpICsrKQorICAgIHsKKyAgICAgICAgaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJBdXRoU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkciwKKyAgICBPVVQgVVNIT1JUICpwQWxnLAorICAgIE9VVCBVU0hPUlQgKnBTZXEsCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBDSEFSICpwQ2hsZ1RleHQpCit7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyLCAgIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWxnLCAgICAmcEZyYW1lLT5PY3RldFswXSwgMik7CisgICAgTmRpc01vdmVNZW1vcnkocFNlcSwgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKKworICAgIGlmICgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgIHx8ICgqcEFsZyA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICApCisgICAgeworICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorICAgIHsKKyAgICAgICAgaWYgKCpwU2VxID09IDEgfHwgKnBTZXEgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKnBTZXEgPT0gMiB8fCAqcFNlcSA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ2hsZ1RleHQsICZwRnJhbWUtPk9jdGV0WzhdLCBDSVBIRVJfVEVYVF9MRU4pOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgU2VnI1xuIikpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIsCisgICAgT1VUIFVMT05HICpwVGltZW91dCwKKyAgICBPVVQgVVNIT1JUICpwQWxnKQoreworICAgIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvICA9IChNTE1FX0FVVEhfUkVRX1NUUlVDVCAqKU1zZzsKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyLCBwSW5mby0+QWRkcik7CisgICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7CisgICAgKnBBbGcgPSBwSW5mby0+QWxnOworCisgICAgaWYgKCgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICB8fCAoKnBBbGcgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAJKSAmJgorICAgICAgICAoKCpwQWRkciAmIDB4MDEpID09IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBdXRoUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQXBBZGRyLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAorICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnR2KQoreworICAgIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqcEluZm87CisKKyAgICBwSW5mbyA9IChNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKilNc2c7CisgICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0CisgICAgQ09QWV9NQUNfQUREUihwQXBBZGRyLCBwSW5mby0+QWRkcik7ICAgICAgICAgICAgICAgICAgIC8vIEFQIGFkZHJlc3MKKyAgICAqcENhcGFiaWxpdHlJbmZvID0gcEluZm8tPkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgaW5mbworICAgICpwTGlzdGVuSW50diA9IHBJbmZvLT5MaXN0ZW5JbnR2OworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCit7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBSZWFzb24sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNhbml0eSBjaGVjayBOZXR3b3JrVHlwZSAoMTFiLCAxMWcgb3IgMTFhKQorCisJQXJndW1lbnRzOgorCQlwQnNzIC0gUG9pbnRlciB0byBCU1MgdGFibGUuCisKKwlSZXR1cm4gVmFsdWU6CisgICAgICAgIE5kaXM4MDJfMTFEUyAuLi4uLi4uKDExYikKKyAgICAgICAgTmRpczgwMl8xMU9GRE0yNC4uLi4oMTFnKQorICAgICAgICBOZGlzODAyXzExT0ZETTUuLi4uLigxMWEpCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAorICAgIElOIFBCU1NfRU5UUlkgcEJzcykKK3sKKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUJTmV0V29ya1R5cGU7CisJVUNIQVIJCQkJCQlyYXRlLCBpOworCisJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExRFM7CisKKwlpZiAocEJzcy0+Q2hhbm5lbCA8PSAxNCkKKwl7CisJCS8vCisJCS8vIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4KKwkJLy8KKwkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykKKwkJeworCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKKwkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQorCQkJeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vCisJCQkJLy8gT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQKKwkJCQkvLworCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vCisJCS8vIFNlY29uZCBjaGVjayBFeHRlbmQgUmF0ZS4KKwkJLy8KKwkJaWYgKE5ldFdvcmtUeXBlICE9IE5kaXM4MDJfMTFPRkRNMjQpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBwQnNzLT5FeHRSYXRlTGVuOyBpKyspCisJCQl7CisJCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKKwkJCQlpZiAoKHJhdGUgPT0gMikgfHwgKHJhdGUgPT0gNCkgfHwgKHJhdGUgPT0gMTEpIHx8IChyYXRlID09IDIyKSkKKwkJCQl7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLworCQkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAorCQkJCQkvLworCQkJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNTsKKwl9CisKKyAgICBpZiAocEJzcy0+SHRDYXBhYmlsaXR5TGVuICE9IDApCisgICAgeworICAgICAgICBpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047CisgICAgfQorCisJcmV0dXJuIE5ldFdvcmtUeXBlOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFdQQSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoCisgICAgSU4gCVBSVE1QX0FEQVBURVIgCQlwQWQsCisgICAgSU4gCVBFQVBPTF9QQUNLRVQgCQlwTXNnLAorICAgIElOIAlVTE9ORyAJCQkJTXNnTGVuLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOIAlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5KQoreworCVVDSEFSCQkJbWljW0xFTl9LRVlfREVTQ19NSUNdLCBkaWdlc3RbODBdLCBLRVlEQVRBW01BWF9MRU5fT0ZfUlNOSUVdOworCUJPT0xFQU4JCQliUmVwbGF5RGlmZiA9IEZBTFNFOworCUJPT0xFQU4JCQliV1BBMiA9IEZBTFNFOworCUtFWV9JTkZPCQlFYXBvbEtleUluZm87CisJVUNIQVIJCQlHcm91cEtleUluZGV4ID0gMDsKKworCisJTmRpc1plcm9NZW1vcnkobWljLCBzaXplb2YobWljKSk7CisJTmRpc1plcm9NZW1vcnkoZGlnZXN0LCBzaXplb2YoZGlnZXN0KSk7CisJTmRpc1plcm9NZW1vcnkoS0VZREFUQSwgc2l6ZW9mKEtFWURBVEEpKTsKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZFYXBvbEtleUluZm8sIHNpemVvZihFYXBvbEtleUluZm8pKTsKKworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgKFBVQ0hBUikmcE1zZy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCAqKSZFYXBvbEtleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykpOworCisJLy8gQ2hvb3NlIFdQQTIgb3Igbm90CisJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQliV1BBMiA9IFRSVUU7CisKKwkvLyAwLiBDaGVjayBNc2dUeXBlCisJaWYgKChNc2dUeXBlID4gRUFQT0xfR1JPVVBfTVNHXzIpIHx8IChNc2dUeXBlIDwgRUFQT0xfUEFJUl9NU0dfMSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQoJWQpISBcbiIsIE1zZ1R5cGUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIDEuIFJlcGxheSBjb3VudGVyIGNoZWNrCisgCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCS8vIEZvciBzdXBwbGljYW50CisgICAgeworICAgIAkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlci4KKwkJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCQlVQ0hBUglaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCisJCQkoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKyAgICAJeworCQkJYlJlcGxheURpZmYgPSBUUlVFOworICAgIAl9CisgCX0KKwllbHNlIGlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCS8vIEZvciBhdXRoZW50aWNhdG9yCisJeworCQkvLyBjaGVjayBSZXBsYXkgQ291bnRlciBjb3Jlc3BvbmRzIHRvIE1TRyBmcm9tIGF1dGhlbnRpY2F0b3IsIG90aGVyd2lzZSBkaXNjYXJkCisgICAgCWlmICghTmRpc0VxdWFsTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpKQorICAgIAl7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisgICAgCX0KKwl9CisKKwkvLyBSZXBsYXkgQ291bnRlciBkaWZmZXJlbnQgY29uZGl0aW9uCisJaWYgKGJSZXBsYXlEaWZmKQorCXsKKwkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciByZXBsYXkgY291bnRlciBkaWZmZXJlbnQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOworCisJCWlmIChNc2dUeXBlIDwgRUFQT0xfR1JPVVBfTVNHXzEpCisJCXsKKyAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlcGxheSBDb3VudGVyIERpZmZlcmVudCBpbiBwYWlyd2lzZSBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAlZCBvZiAyLXdheSBoYW5kc2hha2UhXG4iLCAoTXNnVHlwZSAtIEVBUE9MX1BBSVJfTVNHXzQpKSk7CisJCX0KKworCQloZXhfZHVtcCgiUmVjZWl2ZSByZXBsYXkgY291bnRlciAiLCBwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQloZXhfZHVtcCgiQ3VycmVudCByZXBsYXkgY291bnRlciAiLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKwl9CisKKwkvLyAyLiBWZXJpZnkgTUlDIGV4Y2VwdCBQYWlyd2lzZSBNc2cxCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwl7CisJCVVDSEFSCQkJcmN2ZF9taWNbTEVOX0tFWV9ERVNDX01JQ107CisKKwkJLy8gUmVjb3JkIHRoZSByZWNlaXZlZCBNSUMgZm9yIGNoZWNrIGxhdGVyCisJCU5kaXNNb3ZlTWVtb3J5KHJjdmRfbWljLCBwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCU5kaXNaZXJvTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworICAgICAgICBpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkJLy8gVEtJUAorICAgICAgICB7CisgICAgICAgICAgICBobWFjX21kNShwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKXBNc2csIE1zZ0xlbiwgbWljKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQkvLyBBRVMKKyAgICAgICAgeworICAgICAgICAgICAgSE1BQ19TSEExKChQVUNIQVIpcE1zZywgTXNnTGVuLCBwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFOZGlzRXF1YWxNZW1vcnkocmN2ZF9taWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQykpCisgICAgICAgIHsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgTUlDIGRpZmZlcmVudAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX01JQ19ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJCWlmIChNc2dUeXBlIDwgRUFQT0xfR1JPVVBfTVNHXzEpCisJCQl7CisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBwYWlyd2lzZSBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1JQyBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJCX0KKworCQkJaGV4X2R1bXAoIlJlY2VpdmVkIE1JQyIsIHJjdmRfbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCWhleF9kdW1wKCJEZXNpcmVkICBNSUMiLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJCQlyZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKwl9CisKKwkvLyBFeHRyYWN0IHRoZSBjb250ZXh0IG9mIHRoZSBLZXkgRGF0YSBmaWVsZCBpZiBpdCBleGlzdAorCS8vIFRoZSBmaWVsZCBpbiBwYWlyd2lzZV9tc2dfMl9XUEExKFdQQTIpICYgcGFpcndpc2VfbXNnXzNfV1BBMSBpcyB1bi1lbmNyeXB0ZWQuCisJLy8gVGhlIGZpZWxkIGluIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEEyIGlzIGVuY3J5cHRlZC4KKwlpZiAocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID4gMCkKKwl7CisJCS8vIERlY3J5cHQgdGhpcyBmaWVsZAorCQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQl7CisJCQlpZihwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJeworCQkJCS8vIEFFUworCQkJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEVudHJ5LT5QVEtbMTZdLCBLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0scE1zZy0+S2V5RGVzYy5LZXlEYXRhKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJTlQgCWk7CisJCQkJVUNIQVIgICBLZXlbMzJdOworCQkJCS8vIERlY3J5cHQgVEtJUCBHVEsKKwkJCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQkJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEVudHJ5LT5QVEtbMTZdLCAxNik7CisJCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwkJCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90CisJCQkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwkJCX0KKworCQkJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCQkJR3JvdXBLZXlJbmRleCA9IEVhcG9sS2V5SW5mby5LZXlJbmRleDsKKworCQl9CisJCWVsc2UgaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgIWJXUEEyKSkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQl9CisJCWVsc2UKKwkJeworCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCisJCS8vIFBhcnNlIEtleSBEYXRhIGZpZWxkIHRvCisJCS8vIDEuIHZlcmlmeSBSU04gSUUgZm9yIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgLHBhaXJ3aXNlX21zZ18zX1dQQTEoV1BBMikKKwkJLy8gMi4gdmVyaWZ5IEtERSBmb3JtYXQgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTIKKwkJLy8gMy4gdXBkYXRlIHNoYXJlZCBrZXkgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTEoV1BBMikKKwkJaWYgKCFSVE1QUGFyc2VFYXBvbEtleURhdGEocEFkLCBLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIEdyb3VwS2V5SW5kZXgsIE1zZ1R5cGUsIGJXUEEyLCBwRW50cnkpKQorCQl7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCisgICAgT1VUIFBVU0hPUlQgcFJlYXNvbikKK3sKKwlNTE1FX0RMU19SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvID0gKE1MTUVfRExTX1JFUV9TVFJVQ1QgKilNc2c7CisKKwkqcERMUyA9IHBJbmZvLT5wRExTOworCSpwUmVhc29uID0gcEluZm8tPlJlYXNvbjsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCT09MRUFOIFBlZXJEbHNSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcERsc1RpbWVvdXQsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisJT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KQoreworCUNIQVIgICAgICAgICAgICAqUHRyOworICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJUEVJRF9TVFJVQ1QgIGVpZF9wdHI7CisKKyAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCisgICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7CisgICAgKnBEbHNUaW1lb3V0CT0gMDsKKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CisKKyAgICBQdHIgPSBGci0+T2N0ZXQ7CisKKwkvLyBvZmZzZXQgdG8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQpCisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgREEgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworICAgIC8vIGdldCBTQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU0EsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEbHNUaW1lb3V0LCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisJLy8gQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCArIERBICsgU0EgKyBjYXBhYmlsaXR5ICsgVGltZW91dAorCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpICZGci0+T2N0ZXRbMThdOworCisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoVUNIQVIqKUZyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoKGVpZF9wdHItPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgJiYgKGVpZF9wdHItPkxlbiA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUmF0ZXMsIGVpZF9wdHItPk9jdGV0LCBlaWRfcHRyLT5MZW4pOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gSUVfU1VQUF9SQVRFUy4sIExlbj0lZC4gUmF0ZXNbMF09JXhcbiIsZWlkX3B0ci0+TGVuLCBSYXRlc1swXSkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYXRlc1sxXT0leCAleCAleCAleCAleCAleCAleFxuIiwgUmF0ZXNbMV0sIFJhdGVzWzJdLCBSYXRlc1szXSwgUmF0ZXNbNF0sIFJhdGVzWzVdLCBSYXRlc1s2XSwgUmF0ZXNbN10pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IGVpZF9wdHItPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IDg7CisJCQkJCVJhdGVzWzBdID0gMHg4MjsKKwkJCQkJUmF0ZXNbMV0gPSAweDg0OworCQkJCQlSYXRlc1syXSA9IDB4OGI7CisJCQkJCVJhdGVzWzNdID0gMHg5NjsKKwkJCQkJUmF0ZXNbNF0gPSAweDEyOworCQkJCQlSYXRlc1s1XSA9IDB4MjQ7CisJCQkJCVJhdGVzWzZdID0gMHg0ODsKKwkJCQkJUmF0ZXNbN10gPSAweDZjOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gd3JvbmcgSUVfU1VQUF9SQVRFUy4sIExlbj0lZFxuIixlaWRfcHRyLT5MZW4pKTsKKyAgICAgICAgICAgICAgICB9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKGVpZF9wdHItPkxlbiArICpwUmF0ZXNMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUmF0ZXNbKnBSYXRlc0xlbl0sIGVpZF9wdHItPk9jdGV0LCBlaWRfcHRyLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gKCpwUmF0ZXNMZW4pICsgZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUmF0ZXNbKnBSYXRlc0xlbl0sIGVpZF9wdHItPk9jdGV0LCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAtICgqcFJhdGVzTGVuKSk7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsKKyAgICAgICAgICAgICAgICB9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfSFRfQ0FQOgorCQkJCWlmIChlaWRfcHRyLT5MZW4gPj0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgZWlkX3B0ci0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOworCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gSUVfSFRfQ0FQXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuZWlkX3B0ci0+TGVuID0gJWRcbiIsIGVpZF9wdHItPkxlbikpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworICAgIHJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCit7CisgICAgQ0hBUiAgICAgICAgICAgICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKKworICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKKyAgICAqcFN0YXR1cwkJPSAwOworICAgICpwQ2FwYWJpbGl0eUluZm8JPSAwOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworCS8vIGdldCBzdGF0dXMgY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisgICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworCWlmIChwU3RhdHVzID09IDApCisJeworCSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCSAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisJICAgIFB0ciArPSAyOworCX0KKworCS8vIENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQgKyBzdGF0dXMgY29kZSArIERBICsgU0EgKyBjYXBhYmlsaXR5CisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07CisKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKKwkJCQkJUmF0ZXNbMF0gPSAweDgyOworCQkJCQlSYXRlc1sxXSA9IDB4ODQ7CisJCQkJCVJhdGVzWzJdID0gMHg4YjsKKwkJCQkJUmF0ZXNbM10gPSAweDk2OworCQkJCQlSYXRlc1s0XSA9IDB4MTI7CisJCQkJCVJhdGVzWzVdID0gMHgyNDsKKwkJCQkJUmF0ZXNbNl0gPSAweDQ4OworCQkJCQlSYXRlc1s3XSA9IDB4NmM7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9IVF9DQVA6CisJCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckRsc1RlYXJEb3duU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBDSEFSICAgICAgICAgICAgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQorICAgICpwUmVhc29uCT0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKwkvLyBnZXQgcmVhc29uIGNvZGUgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmU3Yzc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3N5bmMuYwpAQCAtMCwwICsxLDcxMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzeW5jLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDQtMDktMDEgICAgICBtb2RpZmllZCBmb3IgcnQyNTYxLzI2NjEKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8vIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TSVpFCTExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU0laRQkxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NUQVJUCTkJCQkvLyAxMCwxMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NJWkUJMgorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJCQkvLyAxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NJWkUJNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NUQVJUCTEzCQkJLy8gMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TSVpFCTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TSVpFCTE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU1RBUlQJMgkJCS8vIDMsNCw1LDYsNyw4LDkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TSVpFCTcKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TVEFSVAk0CQkJLy8gNSw2LDcsOCw5LDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU0laRQk5CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zMV9TSVpFCTE0CisKKy8vIDUgR2h6IGNoYW5uZWwgcGxhbiBpbmRleCBpbiB0aGUgVHhQb3dlciBhcnJheXMuCitVQ0hBUiBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUW109ezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDh9OworVUNIQVIgQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUW109ezUyLCA1NiwgNjAsIDY0fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKKworLy9CYVNpemVBcnJheSBmb2xsb3dzIHRoZSA4MDIuMTFuIGRlZmluaXRpb24gYXMgTWF4UnhGYWN0b3IuICAyXigxMytmYWN0b3IpIGJ5dGVzLiBXaGVuIGZhY3RvciA9MCwgaXQncyBhYm91dCBCYSBidWZmZXIgc2l6ZSA9OC4KK1VDSEFSIEJhU2l6ZUFycmF5WzRdID0gezgsMTYsMzIsNjR9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVVwZGF0ZSBTdGFDZmctPkNoYW5uZWxMaXN0W10gYWNjb3JkaW5nIHRvIDEpIENvdW50cnkgUmVnaW9uIDIpIFJGIElDIHR5cGUsCisJCWFuZCAzKSBQSFktbW9kZSB1c2VyIHNlbGVjdGVkLgorCQlUaGUgb3V0Y29tZSBpcyB1c2VkIGJ5IGRyaXZlciB3aGVuIGRvaW5nIHNpdGUgc3VydmV5LgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQnVpbGRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUiBpLCBqLCBpbmRleD0wLCBudW09MDsKKwlQVUNIQVIJcENoYW5uZWxMaXN0ID0gTlVMTDsKKworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q2hhbm5lbExpc3QsIE1BWF9OVU1fT0ZfQ0hBTk5FTFMgKiBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikpOworCisJLy8gaWYgbm90IDExYS1vbmx5IG1vZGUsIGNoYW5uZWwgbGlzdCBzdGFydHMgZnJvbSAyLjRHaHogYmFuZAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFBKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFBTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExTl81RykKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gICYgMHg3ZikKKwkJeworCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8wX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMF9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8wX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8xX0JHX0JBTkQ6CS8vIDEgLSAxMworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8xX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8xX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8yX0JHX0JBTkQ6CS8vIDEwIC0gMTEKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMl9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzJfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMl9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzNfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzNfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzRfQkdfQkFORDoJLy8gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNF9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzRfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNF9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzVfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNV9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl82X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNl9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl82X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl83X0JHX0JBTkQ6ICAvLyA1IC0gMTMKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fN19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzdfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fN19TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMzFfQkdfQkFORDoJLy8gMSAtIDE0CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzMxX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMzFfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMzFfU0laRTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQlicmVhazsKKwkJfQorCQlmb3IgKGk9MDsgaTxpbmRleDsgaSsrKQorCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3ciA9IDIwOworCX0KKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJKQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDdmKQorCQl7CisJCQljYXNlIFJFR0lPTl8wX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzJfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzVfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl82X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fN19BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzhfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl85X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFR0lPTl8xMF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFR0lPTl8xMV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoImNvdW50cnlyZWdpb249JWQgbm90IHN1cHBvcnQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChudW0gIT0gMCkKKwkJeworCQkJVUNIQVIgUmFkYXJDaFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisJCQlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajxNQVhfTlVNX09GX0NIQU5ORUxTOyBqKyspCisJCQkJeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IHBBZC0+VHhQb3dlcltqXS5DaGFubmVsKQorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0sICZwQWQtPlR4UG93ZXJbal0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7CisJCQkJCX0KKwkJCQlmb3IgKGo9MDsgajwxNTsgaisrKQorCQkJCXsKKwkJCQkJaWYgKHBDaGFubmVsTGlzdFtpXSA9PSBSYWRhckNoW2pdKQorCQkJCQkJcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXS5EZnNSZXEgPSBUUlVFOworCQkJCX0KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLk1heFR4UHdyID0gMjA7CisJCQl9CisJCQlpbmRleCArPSBudW07CisJCX0KKwl9CisKKwlwQWQtPkNoYW5uZWxMaXN0TnVtID0gaW5kZXg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJjb3VudHJ5IGNvZGU9JWQvJWQsIFJGSUM9JWQsIFBIWSBtb2RlPSVkLCBzdXBwb3J0ICVkIGNoYW5uZWxzXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsIHBBZC0+UmZJY1R5cGUsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKyNpZmRlZiBEQkcKKwlmb3IgKGk9MDtpPHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQnVpbGRDaGFubmVsICMgJWQgOjogUHdyMCA9ICVkLCBQd3IxID0lZCwgXG4gIiwgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyMikpOworCX0KKyNlbmRpZgorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXR1cm4gdGhlIGZpcnN0IGNoYW5uZWwgbnVtYmVyIGFjY29yZGluZyB0byB0aGUgY291bnRyeQorCQljb2RlIHNlbGVjdGlvbiBhbmQgUkYgSUMgc2VsZWN0aW9uIChzaWduYWwgYmFuZCBvciBkdWFsIGJhbmQpLiBJdCBpcyBjYWxsZWQKKwkJd2hlbmV2ZXIgZHJpdmVyIG5lZWQgdG8gc3RhcnQgYSBzaXRlIHN1cnZleSBvZiBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzLgorCVJldHVybjoKKwkJY2ggLSB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgb2YgY3VycmVudCBjb3VudHJ5IGNvZGUgc2V0dGluZworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1VDSEFSIEZpcnN0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFswXS5DaGFubmVsOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkCisJCWR1cmluZyBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCisJUmV0dXJuOgorCQluZXh0X2NoYW5uZWwgLSB0aGUgbmV4dCBjaGFubmVsIG51bWJlciB2YWxpZCBpbiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nLgorCU5vdGU6CisJCXJldHVybiAwIGlmIG5vIG1vcmUgbmV4dCBjaGFubmVsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgTmV4dENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwlVQ0hBUiBuZXh0X2NoYW5uZWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKKwkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQl7CisJCQluZXh0X2NoYW5uZWwgPSBwQWQtPkNoYW5uZWxMaXN0W2krMV0uQ2hhbm5lbDsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbmV4dF9jaGFubmVsOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBpcyBmb3IgQ2lzY28gQ29tcGF0aWJsZSBFeHRlbnNpb25zIDIuWAorCQlTcGVjMzEuIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCisJUmV0dXJuOgorCQlOb25lCisJTm90ZToKKwkgICBSZXF1aXJlZCBieSBBaXJvbmV0IGRCbShtVykKKwkJICAgMGRCbSgxbVcpLCAgIDFkQm0oNW1XKSwgMTNkQm0oMjBtVyksIDE1ZEJtKDMwbVcpLAorCQkgIDE3ZEJtKDUwbXcpLCAyMGRCbSgxMDBtVykKKworCSAgIFdlIHN1cHBvcnRlZAorCQkgICAzZEJtKExvd2VzdCksIDZkQm0oMTAlKSwgOWRCbSgyNSUpLCAxMmRCbSg1MCUpLAorCQkgIDE0ZEJtKDc1JSksICAgMTVkQm0oMTAwJSkKKworCQlUaGUgY2xpZW50IHN0YXRpb24ncyBhY3R1YWwgdHJhbnNtaXQgcG93ZXIgc2hhbGwgYmUgd2l0aGluICsvLSA1ZEIgb2YKKwkJdGhlIG1pbmltdW0gdmFsdWUgb3IgbmV4dCBsb3dlciB2YWx1ZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpCit7CisJLy92YWx1ZCAweEZGIG1lYW5zIHRoYXQgaGFzbid0IGZvdW5kIHBvd2VyIGxpbWl0IGluZm9ybWF0aW9uCisJLy9mcm9tIHRoZSBBUCdzIEJlYWNvbi9Qcm9iZSByZXNwb25zZS4KKwlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ID09IDB4RkYpCisJCXJldHVybjsKKworCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA2KSAvL1VzZWQgTG93ZXN0IFBvd2VyIFBlcmNlbnRhZ2UuCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNjsKKwllbHNlIGlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA5KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwOworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDEyKQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDI1OworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE0KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDUwOworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE1KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDc1OworCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAxMDA7IC8vZWxzZSB1c2VkIG1heGltdW0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCit9CisKK0NIQVIJQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkJUnNzaSwKKwlJTiAgVUNIQVIgICBSc3NpTnVtYmVyKQoreworCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47CisKKwkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJaWYgKFJzc2kgPT0gMCkKKwkJcmV0dXJuIC05OTsKKworCUxOQUdhaW4gPSBHRVRfTE5BX0dBSU4ocEFkKTsKKyAgICBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisgICAgeworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7CisgICAgfQorCisgICAgcmV0dXJuICgtMTIgLSBSc3NpT2Zmc2V0IC0gTE5BR2FpbiAtIFJzc2kpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNjYW4gbmV4dCBjaGFubmVsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTY2FuTmV4dENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSEVBREVSXzgwMl8xMSAgIEhkcjgwMjExOworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCVVDSEFSICAgICAgICAgICBTc2lkTGVuID0gMCwgU2NhblR5cGUgPSBwQWQtPk1sbWVBdXguU2NhblR5cGUsIEJCUFZhbHVlID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVU0hPUlQgICAgICAgICAgU3RhdHVzOworCVBIRUFERVJfODAyXzExICBwSGRyODAyMTE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJVUlOVAkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBTSE9SVF9DSEFOTkVMX1RJTUU7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMCkKKwl7CisJCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJJiYgKElORlJBX09OKHBBZCkKKwkJCQl8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCSkKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8KKwkJCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgorCQkJLy8gU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuCisJCQkvLyBOb3csIHdlIG5lZWQgdG8gc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lCisJCQkvLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCisJCQl7CisJCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7CisJCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQl7CisJCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOworCQkJCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCQkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKKworCQkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZVxuIikpOworCQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKworCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKwl9CisjaWZkZWYgUlQyODcwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJZWxzZSBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwl7CisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCU1sbWVDbnRsQ29uZmlybShwQWQsIE1UMl9TQ0FOX0NPTkYsIE1MTUVfRkFJTF9OT19SRVNPVVJDRSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworCWVsc2UKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJLy8gQkJQIGFuZCBSRiBhcmUgbm90IGFjY2Vzc2libGUgaW4gUFMgbW9kZSwgd2UgaGFzIHRvIHdha2UgdGhlbSB1cCBmaXJzdAorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworCisJCQkvLyBsZWF2ZSBQU00gZHVyaW5nIHNjYW5uaW5nLiBvdGhlcndpc2Ugd2UgbWF5IGxvc3QgUHJvYmVSc3AgJiBCRUFDT04KKwkJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9BQ1RJVkUpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgVFJVRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkKKwkJCXsKKwkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQorCQkJCXsKKwkJCQkJU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7CisJCQkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBNSU5fQ0hBTk5FTF9USU1FOworCQkJCX0KKwkJCX0KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCQkvLyBjYXJyaWVyIGRldGVjdGlvbgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJCQl7CisJCQkJU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7CisJCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IE1JTl9DSEFOTkVMX1RJTUU7CisJCQl9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCQl9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvL0dsb2JhbCBjb3VudHJ5IGRvbWFpbihjaDEtMTE6YWN0aXZlIHNjYW4sIGNoMTItMTQgcGFzc2l2ZSBzY2FuKQorCQlpZiAoKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KSAmJiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPj0gMTIpICYmICgocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4N2YpID09IFJFR0lPTl8zMV9CR19CQU5EKSkKKwkJeworCQkJU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7CisJCX0KKworCQkvLyBXZSBuZWVkIHRvIHNob3J0ZW4gYWN0aXZlIHNjYW4gdGltZSBpbiBvcmRlciBmb3IgV1pDIGNvbm5lY3QgaXNzdWUKKwkJLy8gQ2huYWdlIHRoZSBjaGFubmVsIHNjYW4gdGltZSBmb3IgQ0lTQ08gc3R1ZmYgYmFzZWQgb24gaXRzIElBUFAgYW5ub3VuY2VtZW50CisJCWlmIChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQorCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBGQVNUX0FDVElWRV9TQ0FOX1RJTUUpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQllbHNlIGlmICgoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAorCQkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSB8fAorCQkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgPCAyNSkKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICogMik7CisJCQllbHNlCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJZWxzZSAvLyBtdXN0IGJlIFNDQU5fUEFTU0lWRSBvciBTQ0FOX0FDVElWRQorCQl7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJCXsKKwkJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkKKwkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBTY2FuVGltZUluNWdDaGFubmVsKTsKKwkJCQllbHNlCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNSU5fQ0hBTk5FTF9USU1FKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1BWF9DSEFOTkVMX1RJTUUpOworCQl9CisKKwkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkgfHwgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpIHx8CisJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpKQorCQl7CisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU2Nhbk5leHRDaGFubmVsKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCBpZiBhY3RpdmUgc2NhbiBpcyBpbiBlZmZlY3QuCisJCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKKwkJCQkpCisJCQkJU3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCQkJZWxzZQorCQkJCVNzaWRMZW4gPSAwOworCisJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkTGVuLAorCQkJCQkJCSAgU3NpZExlbiwJCQkgICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQlpZiAocEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbikKKwkJCXsKKwkJCQlVTE9ORyBUbXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLAorCQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcDsKKwkJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCXsKKwkJCQlVTE9ORwlUbXA7CisJCQkJVUNIQVIJSHRMZW47CisJCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisjZW5kaWYKKwkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuICsgNDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbHNlCisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUh0TGVuID0gcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbjsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQlIdExlbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbHNlCisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQlIdExlbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCQkJfQorCQkJCUZyYW1lTGVuICs9IFRtcDsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLmIyMDQwQ29leGlzdFNjYW5TdXAgPT0gMSkKKwkJCQl7CisJCQkJCVVMT05HCQlUbXA7CisJCQkJCUh0TGVuID0gMTsKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCisJCQkJCQkJCQkgIDEsCQkJCQkmRXh0SHRDYXBJZSwKKwkJCQkJCQkJCSAgMSwJCQkJCSZIdExlbiwKKwkJCQkJCQkJCSAgMSwgICAgICAgICAgCQkJJnBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQsCisJCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQkJCQlGcmFtZUxlbiArPSBUbXA7CisJCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCX0KKworCQkvLyBGb3IgU0NBTl9DSVNDT19QQVNTSVZFLCBkbyBub3RoaW5nIGFuZCBzaWxlbnRseSB3YWl0IGZvciBiZWFjb24gb3Igb3RoZXIgcHJvYmUgcmVwb25zZQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU0NBTl9MSVNURU47CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwl9Cit9CisKK1ZPSUQgTWd0UHJvYlJlcU1hY0hlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKwlJTiBVQ0hBUiBTdWJUeXBlLAorCUlOIFVDSEFSIFRvRHMsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisJcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU3ViVHlwZTsKKwlpZiAoU3ViVHlwZSA9PSBTVUJUWVBFX0FDSykKKwkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwSGRyODAyMTEtPkZDLlRvRHMgPSBUb0RzOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgcERBKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEJzc2lkKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fd3BhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjMjRiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV93cGEuYwpAQCAtMCwwICsxLDE2NTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJd3BhLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKYW4JTGVlCQkwMy0wNy0yMgkJSW5pdGlhbAorCVBhdWwgTGluCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisvLyBXUEEgT1VJCitVQ0hBUgkJT1VJX1dQQV9OT05FX0FLTVs0XQkJPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMH07CitVQ0hBUiAgICAgICBPVUlfV1BBX1ZFUlNJT05bNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfV0VQNDBbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfVEtJUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07CitVQ0hBUiAgICAgICBPVUlfV1BBX0NDTVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDR9OworVUNIQVIgICAgICAgT1VJX1dQQV9XRVAxMDRbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA1fTsKK1VDSEFSICAgICAgIE9VSV9XUEFfODAyMVhfQUtNWzRdCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9QU0tfQUtNWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07CisvLyBXUEEyIE9VSQorVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQNDBbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1RLSVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OworVUNIQVIgICAgICAgT1VJX1dQQTJfQ0NNUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH07CitVQ0hBUiAgICAgICBPVUlfV1BBMl84MDIxWF9BS01bNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn07CitVQ0hBUiAgICAgICBPVUlfV1BBMl9XRVAxMDRbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA1fTsKKy8vIE1TQSBPVUkKK1VDSEFSICAgCU9VSV9NU0FfODAyMVhfQUtNWzRdICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDV9OwkJLy8gTm90IHlldCBmaW5hbCAtIElFRUUgODAyLjExcy1EMS4wNgorVUNIQVIgICAJT1VJX01TQV9QU0tfQUtNWzRdICAgCT0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDZ9OwkJLy8gTm90IHlldCBmaW5hbCAtIElFRUUgODAyLjExcy1EMS4wNgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVGhlIHBzZXVkby1yYW5kb20gZnVuY3Rpb24oUFJGKSB0aGF0IGhhc2hlcyB2YXJpb3VzIGlucHV0cyB0bworCQlkZXJpdmUgYSBwc2V1ZG8tcmFuZG9tIHZhbHVlLiBUbyBhZGQgbGl2ZW5lc3MgdG8gdGhlIHBzZXVkby1yYW5kb20KKwkJdmFsdWUsIGEgbm9uY2Ugc2hvdWxkIGJlIG9uZSBvZiB0aGUgaW5wdXRzLgorCisJCUl0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgUFRLLCBHVEsgb3Igc29tZSBzcGVjaWZpYyByYW5kb20gdmFsdWUuCisKKwlBcmd1bWVudHM6CisJCVVDSEFSCSprZXksCQktCXRoZSBrZXkgbWF0ZXJpYWwgZm9yIEhNQUNfU0hBMSB1c2UKKwkJSU5UCQlrZXlfbGVuCQktCXRoZSBsZW5ndGggb2Yga2V5CisJCVVDSEFSCSpwcmVmaXgJCS0JYSBwcmVmaXggbGFiZWwKKwkJSU5UCQlwcmVmaXhfbGVuCS0JdGhlIGxlbmd0aCBvZiB0aGUgbGFiZWwKKwkJVUNIQVIJKmRhdGEJCS0JYSBzcGVjaWZpYyBkYXRhIHdpdGggdmFyaWFibGUgbGVuZ3RoCisJCUlOVAkJZGF0YV9sZW4JLQl0aGUgbGVuZ3RoIG9mIGEgc3BlY2lmaWMgZGF0YQorCQlJTlQJCWxlbgkJCS0JdGhlIG91dHB1dCBsZW5naHQKKworCVJldHVybiBWYWx1ZToKKwkJVUNIQVIJKm91dHB1dAkJLQl0aGUgY2FsY3VsYXRlZCByZXN1bHQKKworCU5vdGU6CisJCTgwMi4xMWktMjAwNAlBbm5leCBILjMKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUFJGKAorCUlOCVVDSEFSCSprZXksCisJSU4JSU5UCQlrZXlfbGVuLAorCUlOCVVDSEFSCSpwcmVmaXgsCisJSU4JSU5UCQlwcmVmaXhfbGVuLAorCUlOCVVDSEFSCSpkYXRhLAorCUlOCUlOVAkJZGF0YV9sZW4sCisJT1VUCVVDSEFSCSpvdXRwdXQsCisJSU4JSU5UCQlsZW4pCit7CisJSU5UCQlpOworICAgIFVDSEFSICAgKmlucHV0OworCUlOVAkJY3VycmVudGluZGV4ID0gMDsKKwlJTlQJCXRvdGFsX2xlbjsKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgaW5wdXQKKwlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZpbnB1dCwgMTAyNCk7CisKKyAgICBpZiAoaW5wdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiEhIVBSRjogbm8gbWVtb3J5ISEhXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKwkvLyBHZW5lcmF0ZSBjb25jYXRlbmF0aW9uIGlucHV0CisJTmRpc01vdmVNZW1vcnkoaW5wdXQsIHByZWZpeCwgcHJlZml4X2xlbik7CisKKwkvLyBDb25jYXRlbmF0ZSBhIHNpbmdsZSBvY3RldCBjb250YWluaW5nIDAKKwlpbnB1dFtwcmVmaXhfbGVuXSA9CTA7CisKKwkvLyBDb25jYXRlbmF0ZSBzcGVjaWZpYyBkYXRhCisJTmRpc01vdmVNZW1vcnkoJmlucHV0W3ByZWZpeF9sZW4gKyAxXSwgZGF0YSwgZGF0YV9sZW4pOworCXRvdGFsX2xlbiA9CXByZWZpeF9sZW4gKyAxICsgZGF0YV9sZW47CisKKwkvLyBDb25jYXRlbmF0ZSBhIHNpbmdsZSBvY3RldCBjb250YWluaW5nIDAKKwkvLyBUaGlzIG9jdGV0IHNoYWxsIGJlIHVwZGF0ZSBsYXRlcgorCWlucHV0W3RvdGFsX2xlbl0gPSAwOworCXRvdGFsX2xlbisrOworCisJLy8gSXRlcmF0ZSB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdCBieSBobWFjLXNoYS0xCisJLy8gVGhlbiBjb25jYXRlbmF0ZSB0byBsYXN0IHJlc3VsdAorCWZvcgkoaSA9IDA7CWkgPAkobGVuICsgMTkpIC8gMjA7IGkrKykKKwl7CisJCUhNQUNfU0hBMShpbnB1dCwgdG90YWxfbGVuLAlrZXksIGtleV9sZW4sICZvdXRwdXRbY3VycmVudGluZGV4XSk7CisJCWN1cnJlbnRpbmRleCArPQkyMDsKKworCQkvLyB1cGRhdGUgdGhlIGxhc3Qgb2N0ZXQKKwkJaW5wdXRbdG90YWxfbGVuIC0gMV0rKzsKKwl9CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgaW5wdXQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSXQgdXRpbGl6ZXMgUFJGLTM4NCBvciBQUkYtNTEyIHRvIGRlcml2ZSBzZXNzaW9uLXNwZWNpZmljIGtleXMgZnJvbSBhIFBNSy4KKwkJSXQgc2hhbGwgYmUgY2FsbGVkIGJ5IDQtd2F5IGhhbmRzaGFrZSBwcm9jZXNzaW5nLgorCisJQXJndW1lbnRzOgorCQlwQWQgCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorCQlQTUsJCS0JcG9pbnRlciB0byBQTUsKKwkJQU5vbmNlCS0JcG9pbnRlciB0byBBTm9uY2UKKwkJQUEJCS0JcG9pbnRlciB0byBBdXRoZW50aWNhdG9yIEFkZHJlc3MKKwkJU05vbmNlCS0JcG9pbnRlciB0byBTTm9uY2UKKwkJU0EJCS0JcG9pbnRlciB0byBTdXBwbGljYW50IEFkZHJlc3MKKwkJbGVuCQktCWluZGljYXRlIHRoZSBsZW5ndGggb2YgUFRLIChvY3RldCkKKworCVJldHVybiBWYWx1ZToKKwkJT3V0cHV0CQlwb2ludGVyIHRvIHRoZSBQVEsKKworCU5vdGU6CisJCVJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IDguNS4xLjIKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgV3BhQ291bnRQVEsoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJKlBNSywKKwlJTglVQ0hBUgkqQU5vbmNlLAorCUlOCVVDSEFSCSpBQSwKKwlJTglVQ0hBUgkqU05vbmNlLAorCUlOCVVDSEFSCSpTQSwKKwlPVVQJVUNIQVIJKm91dHB1dCwKKwlJTglVSU5UCWxlbikKK3sKKwlVQ0hBUgljb25jYXRlbmF0aW9uWzc2XTsKKwlVSU5UCUN1cnJQb3MgPSAwOworCVVDSEFSCXRlbXBbMzJdOworCVVDSEFSCVByZWZpeFtdID0geydQJywgJ2EnLCAnaScsICdyJywgJ3cnLCAnaScsICdzJywgJ2UnLCAnICcsICdrJywgJ2UnLCAneScsICcgJywKKwkJCQkJCSdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAncycsICdpJywgJ28nLCAnbid9OworCisJLy8gaW5pdGlhdGUgdGhlIGNvbmNhdGVuYXRpb24gaW5wdXQKKwlOZGlzWmVyb01lbW9yeSh0ZW1wLCBzaXplb2YodGVtcCkpOworCU5kaXNaZXJvTWVtb3J5KGNvbmNhdGVuYXRpb24sIDc2KTsKKworCS8vIEdldCBzbWFsbGVyIGFkZHJlc3MKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeShjb25jYXRlbmF0aW9uLCBBQSwgNik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeShjb25jYXRlbmF0aW9uLCBTQSwgNik7CisJQ3VyclBvcyArPSA2OworCisJLy8gR2V0IGxhcmdlciBhZGRyZXNzCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KFNBLCBBQSwgNikgPT0gMSkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIFNBLCA2KTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBQSwgNik7CisKKwkvLyBzdG9yZSB0aGUgbGFyZ2VyIG1hYyBhZGRyZXNzIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIG9mCisJLy8gcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgTUFDX0FERFJfTEVOKTsKKwlDdXJyUG9zICs9IDY7CisKKwkvLyBHZXQgc21hbGxlciBOb25jZQorCWlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDApCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8vIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCWVsc2UgaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMSkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIFNOb25jZSwgMzIpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFOb25jZSwgMzIpOworCUN1cnJQb3MgKz0gMzI7CisKKwkvLyBHZXQgbGFyZ2VyIE5vbmNlCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7CisJQ3VyclBvcyArPSAzMjsKKworCWhleF9kdW1wKCJjb25jYXRlbmF0aW9uPSIsIGNvbmNhdGVuYXRpb24sIDc2KTsKKworCS8vIFVzZSBQUkYgdG8gZ2VuZXJhdGUgUFRLCisJUFJGKFBNSywgTEVOX01BU1RFUl9LRVksIFByZWZpeCwgMjIsIGNvbmNhdGVuYXRpb24sIDc2LCBvdXRwdXQsIGxlbik7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUdlbmVyYXRlIHJhbmRvbSBudW1iZXIgYnkgc29mdHdhcmUuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCW1hY0FkZHIJLQlwb2ludGVyIHRvIGxvY2FsIE1BQyBhZGRyZXNzCisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCQk4MDIuMWlpLTIwMDQgIEFubmV4IEguNQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlHZW5SYW5kb20oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQkqbWFjQWRkciwKKwlPVVQJVUNIQVIJCQkqcmFuZG9tKQoreworCUlOVAkJaSwgY3VycjsKKwlVQ0hBUglsb2NhbFs4MF0sIEtleUNvdW50ZXJbMzJdOworCVVDSEFSCXJlc3VsdFs4MF07CisJVUxPTkcJQ3VycmVudFRpbWU7CisJVUNIQVIJcHJlZml4W10gPSB7J0knLCAnbicsICdpJywgJ3QnLCAnICcsICdDJywgJ28nLCAndScsICduJywgJ3QnLCAnZScsICdyJ307CisKKwkvLyBaZXJvIHRoZSByZWxhdGVkIGluZm9ybWF0aW9uCisJTmRpc1plcm9NZW1vcnkocmVzdWx0LCA4MCk7CisJTmRpc1plcm9NZW1vcnkobG9jYWwsIDgwKTsKKwlOZGlzWmVyb01lbW9yeShLZXlDb3VudGVyLCAzMik7CisKKwlmb3IJKGkgPSAwOwlpIDwJMzI7CWkrKykKKwl7CisJCS8vIGNvcHkgdGhlIGxvY2FsIE1BQyBhZGRyZXNzCisJCUNPUFlfTUFDX0FERFIobG9jYWwsIG1hY0FkZHIpOworCQljdXJyID0JTUFDX0FERFJfTEVOOworCisJCS8vIGNvbmNhdGVuYXRlIHRoZSBjdXJyZW50IHRpbWUKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmQ3VycmVudFRpbWUpOworCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmQ3VycmVudFRpbWUsCXNpemVvZihDdXJyZW50VGltZSkpOworCQljdXJyICs9CXNpemVvZihDdXJyZW50VGltZSk7CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhlIGxhc3QgcmVzdWx0CisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgIHJlc3VsdCwgMzIpOworCQljdXJyICs9CTMyOworCisJCS8vIGNvbmNhdGVuYXRlIGEgdmFyaWFibGUKKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgJmksICAyKTsKKwkJY3VyciArPQkyOworCisJCS8vIGNhbGN1bGF0ZSB0aGUgcmVzdWx0CisJCVBSRihLZXlDb3VudGVyLCAzMiwgcHJlZml4LDEyLCBsb2NhbCwgY3VyciwgcmVzdWx0LCAzMik7CisJfQorCisJTmRpc01vdmVNZW1vcnkocmFuZG9tLCByZXN1bHQsCTMyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIGNpcGhlciBzdWl0ZSBpbiBSU04tSUUuCisJCUl0IG9ubHkgc2hhbGwgYmUgY2FsbGVkIGJ5IFJUTVBNYWtlUlNOSUUuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCisgICAgCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKwkJYk1peENpcGhlcgktCWEgYm9vbGVhbiB0byBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgY2lwaGVyIGFuZCBncm91cAorCQkJCQkJY2lwaGVyIGFyZSB0aGUgc2FtZSBvciBub3QKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVk9JRCBSVE1QSW5zZXJ0UnNuSWVDaXBoZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlFbGVtZW50SUQsCisJSU4JVUlOVAkJCVdlcFN0YXR1cywKKwlJTglCT09MRUFOCQkJYk1peENpcGhlciwKKwlJTglVQ0hBUgkJCUZsZXhpYmxlQ2lwaGVyLAorCU9VVAlQVUNIQVIJCQlwUnNuSWUsCisJT1VUCVVDSEFSCQkJKnJzbl9sZW4pCit7CisJVUNIQVIJUGFpcndpc2VDbnQ7CisKKwkqcnNuX2xlbiA9IDA7CisKKwkvLyBkZWNpZGUgV1BBMiBvciBXUEExCisJaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpCisJeworCQlSU05JRTIJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUyKilwUnNuSWU7CisKKwkJLy8gQXNzaWduIHRoZSB2ZXJzb24gYXMgMQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKKworICAgICAgICBzd2l0Y2ggKFdlcFN0YXR1cykKKyAgICAgICAgeworICAgICAgICAJLy8gVEtJUCBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQkvLyBBRVMgbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJCWlmIChiTWl4Q2lwaGVyKQorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQkJZWxzZQorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX0NDTVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOworCisJCQkJUGFpcndpc2VDbnQgPSAxOworCQkJCS8vIEluc2VydCBXUEEyIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgorCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJeworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOworCQkJCQkvLyBJbnNlcnQgV1BBMiBBRVMgYXMgdGhlIHNlY29uZGFyeSBwYWlyd2lzZSBjaXBoZXIKKwkJCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9BRVNfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCQl7CisgICAgICAgICAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWkgKyA0LCBPVUlfV1BBMl9DQ01QLCA0KTsKKwkJCQkJCVBhaXJ3aXNlQ250ID0gMjsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBJbnNlcnQgV1BBMiBBRVMgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJCX0KKworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMikgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKKwkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlVSU5UIEdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisJCQlzd2l0Y2goR3JvdXBDaXBoZXIpCisJCQl7CisJCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9XRVA0MCwgNCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDoKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1dFUDEwNCwgNCk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7CisJICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfQorCWVsc2UKKwl7CisJCVJTTklFCSpwUnNuaWVfY2lwaGVyID0gKFJTTklFKilwUnNuSWU7CisKKwkJLy8gQXNzaWduIE9VSSBhbmQgdmVyc2lvbgorCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5vdWksIE9VSV9XUEFfVkVSU0lPTiwgNCk7CisgICAgICAgIHBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOworCisJCXN3aXRjaCAoV2VwU3RhdHVzKQorCQl7CisJCQkvLyBUS0lQIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIEFFUyBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworCQkJCWVsc2UKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQkvLyBUS0lQLUFFUyBtaXggbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworCisJCQkJUGFpcndpc2VDbnQgPSAxOworCQkJCS8vIEluc2VydCBXUEEgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBX1RLSVBfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOworCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQkJeworICAgICAgICAgICAgICAgIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQV9DQ01QLCA0KTsKKwkJCQkJCVBhaXJ3aXNlQ250ID0gMjsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKKwkJCQl9CisKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSkgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKKwkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlVSU5UIEdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisJCQlzd2l0Y2goR3JvdXBDaXBoZXIpCisJCQl7CisJCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDQwLCA0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9XRVAxMDQsIDQpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KKwkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnZlcnNpb24pOworCSAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIEFLTSBzdWl0ZSBpbiBSU04tSUUuCisJCUl0IG9ubHkgc2hhbGwgYmUgY2FsbGVkIGJ5IFJUTVBNYWtlUlNOSUUuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCisgICAgCUF1dGhNb2RlCS0JaW5kaWNhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUKKwkJYXBpZHgJCS0JaW5kaWNhdGUgdGhlIGludGVyZmFjZSBpbmRleAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUFLTSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKKwlJTglVSU5UCQkJQXV0aE1vZGUsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlPVVQJUFVDSEFSCQkJcFJzbkllLAorCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQoreworCVJTTklFX0FVVEgJCSpwUnNuaWVfYXV0aDsKKworCXBSc25pZV9hdXRoID0gKFJTTklFX0FVVEgqKShwUnNuSWUgKyAoKnJzbl9sZW4pKTsKKworCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKKwlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKKwl7CisJCXN3aXRjaCAoQXV0aE1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjoKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6CisgICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQTJfODAyMVhfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl9QU0tfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCX0KKwllbHNlCisJeworCQlzd2l0Y2ggKEF1dGhNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6CisgICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBXzgwMjFYX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfUFNLX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfTk9ORV9BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJfQorCisJcFJzbmllX2F1dGgtPmFjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9hdXRoLT5hY291bnQpOworCisJKCpyc25fbGVuKSArPSBzaXplb2YoUlNOSUVfQVVUSCk7CS8vIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aAorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBjYXBhYmlsaXR5IGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKwkJYXBpZHgJCS0JaW5kaWNhdGUgdGhlIGludGVyZmFjZSBpbmRleAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUNhcCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCU9VVAlQVUNIQVIJCQlwUnNuSWUsCisJT1VUCVVDSEFSCQkJKnJzbl9sZW4pCit7CisJUlNOX0NBUEFCSUxJVElFUyAgICAqcFJTTl9DYXA7CisKKwkvLyBpdCBjb3VsZCBiZSBpZ25vcmVkIGluIFdQQTEgbW9kZQorCWlmIChFbGVtZW50SUQgPT0gV3BhSWUpCisJCXJldHVybjsKKworCXBSU05fQ2FwID0gKFJTTl9DQVBBQklMSVRJRVMqKShwUnNuSWUgKyAoKnJzbl9sZW4pKTsKKworCisJcFJTTl9DYXAtPndvcmQgPSBjcHUybGUxNihwUlNOX0NhcC0+d29yZCk7CisKKwkoKnJzbl9sZW4pICs9IHNpemVvZihSU05fQ0FQQUJJTElUSUVTKTsJLy8gdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoCisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgUlNOIElFIGNvbnRleHQuIEl0IGlzIG5vdCBpbmNsdWRlZCBlbGVtZW50LUlEIGFuZCBsZW5ndGguCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCisgICAgCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKwkJYXBpZHgJCS0JaW5kaWNhdGUgdGhlIGludGVyZmFjZSBpbmRleAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUE1ha2VSU05JRSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAorICAgIElOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJYXBpZHgpCit7CisJUFVDSEFSCQlwUnNuSWUgPSBOVUxMOwkJCS8vIHByaW1hcnkgUlNOSUUKKwlVQ0hBUiAJCSpyc25pZWxlbl9jdXJfcCA9IDA7CS8vIHRoZSBsZW5ndGggb2YgdGhlIHByaW1hcnkgUlNOSUUKKwlVQ0hBUgkJKnJzbmllbGVuX2V4X2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgc2Vjb25kYXJ5IFJTTklFCisJVUNIQVIJCVByaW1hcnlSc25pZTsKKwlCT09MRUFOCQliTWl4Q2lwaGVyID0gRkFMU0U7CS8vIGluZGljYXRlIHRoZSBwYWlyd2lzZSBhbmQgZ3JvdXAgY2lwaGVyIGFyZSBkaWZmZXJlbnQKKwlVQ0hBUgkJcF9vZmZzZXQ7CisJV1BBX01JWF9QQUlSX0NJUEhFUgkJRmxleGlibGVDaXBoZXIgPSBNSVhfQ0lQSEVSX05PVFVTRTsJLy8gaXQgcHJvdmlkZSB0aGUgbW9yZSBmbGV4aWJsZSBjaXBoZXIgY29tYmluYXRpb24gaW4gV1BBLVdQQTIgYW5kIFRLSVBBRVMgbW9kZQorCisJcnNuaWVsZW5fY3VyX3AgPSBOVUxMOworCXJzbmllbGVuX2V4X2N1cl9wID0gTlVMTDsKKworCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwkJCXsKKwkJCQlpZiAoQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJCXJldHVybjsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCQl7CisJCQkJLy8gU3VwcG9ydCBXUEFQU0sgb3IgV1BBMlBTSyBpbiBTVEEtSW5mcmEgbW9kZQorCQkJCS8vIFN1cHBvcnQgV1BBTm9uZSBpbiBTVEEtQWRob2MgbW9kZQorCQkJCWlmICgoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkJKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCQkJCSkKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PiBSVE1QTWFrZVJTTklFKFNUQSlcbiIpKTsKKworCQkJLy8gWmVybyBSU05JRSBjb250ZXh0CisJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUlNOX0lFLCBNQVhfTEVOX09GX1JTTklFKTsKKworCQkJLy8gUG9pbnRlciB0byBSU05JRQorCQkJcnNuaWVsZW5fY3VyX3AgPSAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCQkJcFJzbkllID0gcEFkLT5TdGFDZmcuUlNOX0lFOworCisJCQliTWl4Q2lwaGVyID0gcEFkLT5TdGFDZmcuYk1peENpcGhlcjsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIGluZGljYXRlIHByaW1hcnkgUlNOSUUgYXMgV1BBIG9yIFdQQTIKKwlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpIHx8CisJCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikgfHwKKwkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKKwkJUHJpbWFyeVJzbmllID0gV3BhSWU7CisJZWxzZQorCQlQcmltYXJ5UnNuaWUgPSBXcGEySWU7CisKKwl7CisJCS8vIEJ1aWxkIHRoZSBwcmltYXJ5IFJTTklFCisJCS8vIDEuIGluc2VydCBjaXBoZXIgc3VpdGUKKwkJUlRNUEluc2VydFJzbkllQ2lwaGVyKHBBZCwgUHJpbWFyeVJzbmllLCBXZXBTdGF0dXMsIGJNaXhDaXBoZXIsIEZsZXhpYmxlQ2lwaGVyLCBwUnNuSWUsICZwX29mZnNldCk7CisKKwkJLy8gMi4gaW5zZXJ0IEFLTQorCQlSVE1QSW5zZXJ0UnNuSWVBS00ocEFkLCBQcmltYXJ5UnNuaWUsIEF1dGhNb2RlLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOworCisJCS8vIDMuIGluc2VydCBjYXBhYmlsaXR5CisJCVJUTVBJbnNlcnRSc25JZUNhcChwQWQsIFByaW1hcnlSc25pZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKwl9CisKKwkvLyA0LiB1cGRhdGUgdGhlIFJTTklFIGxlbmd0aAorCSpyc25pZWxlbl9jdXJfcCA9IHBfb2Zmc2V0OworCisJaGV4X2R1bXAoIlRoZSBwcmltYXJ5IFJTTklFIiwgcFJzbkllLCAoKnJzbmllbGVuX2N1cl9wKSk7CisKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisJCUNoZWNrIHdoZXRoZXIgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUCBmcmFtZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorCQlwRW50cnkJCQktCXBvaW50ZXIgdG8gYWN0aXZlIGVudHJ5CisJCXBEYXRhCQkJLQl0aGUgcmVjZWl2ZWQgZnJhbWUKKwkJRGF0YUJ5dGVDb3VudCAJLQl0aGUgcmVjZWl2ZWQgZnJhbWUncyBsZW5ndGgKKwkJRnJvbVdoaWNoQlNTSUQJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKyAgICBSZXR1cm46CisgICAgICAgICBUUlVFIAkJCS0JVGhpcyBmcmFtZSBpcyBFQVAgZnJhbWUKKyAgICAgICAgIEZBTFNFIAkJCS0Jb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcERhdGEsCisgICAgSU4gVUxPTkcgICAgICAgICAgICBEYXRhQnl0ZUNvdW50LAorCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJVUxPTkcJQm9keV9sZW47CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisKKworICAgIGlmKERhdGFCeXRlQ291bnQgPCAoTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCisJLy8gU2tpcCBMTEMgaGVhZGVyCisgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgcERhdGEsIDYpIHx8CisgICAgICAgIC8vIENpc2NvIDEyMDAgQVAgbWF5IHNlbmQgcGFja2V0IHdpdGggU05BUF9CUklER0VfVFVOTkVMCisgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIHBEYXRhLCA2KSkKKyAgICB7CisgICAgICAgIHBEYXRhICs9IDY7CisgICAgfQorCS8vIFNraXAgMi1ieXRlcyBFQVBvTCB0eXBlCisgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShFQVBPTCwgcERhdGEsIDIpKQorICAgIHsKKyAgICAgICAgcERhdGEgKz0gMjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBzd2l0Y2ggKCoocERhdGErMSkpCisgICAgeworICAgICAgICBjYXNlIEVBUFBhY2tldDoKKwkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtUGFja2V0IGZyYW1lLCBUWVBFID0gMCwgTGVuZ3RoID0gJWxkXG4iLCBCb2R5X2xlbikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUFQT0xTdGFydDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wtU3RhcnQgZnJhbWUsIFRZUEUgPSAxIFxuIikpOworCQkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDYW5jZWwgdGhlIEVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nIFxuIikpOworICAgICAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5FbnF1ZXVlU3RhcnRGb3JQU0tUaW1lciwgJkNhbmNlbGxlZCk7CisgICAgICAgICAgICAgICAgcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTExvZ29mZjoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0xMb2dvZmYgZnJhbWUsIFRZUEUgPSAyIFxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUFQT0xLZXk6CisJCQlCb2R5X2xlbiA9ICgqKHBEYXRhKzIpPDw4KSB8ICgqKHBEYXRhKzMpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wtS2V5IGZyYW1lLCBUWVBFID0gMywgTGVuZ3RoID0gJWxkXG4iLCBCb2R5X2xlbikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUFQT0xBU0ZBbGVydDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0xBU0ZBbGVydCBmcmFtZSwgVFlQRSA9IDQgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIEVOQ1JZUFQgQUVTIEdUSyBiZWZvcmUgc2VuZGluZyBpbiBFQVBPTCBmcmFtZS4KKyAgICAgICAgQUVTIEdUSyBsZW5ndGggPSAxMjggYml0LCAgc28gZml4IGJsb2NrcyBmb3IgYWVzLWtleS13cmFwIGFzIDIgaW4gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgVGhpcyBmdW5jdGlvbiByZWZlcmVuY2VzIHRvIFJGQyAzMzk0IGZvciBhZXMga2V5IHdyYXAgYWxnb3JpdGhtLgorICAgIFJldHVybjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQUVTX0dUS19LRVlfV1JBUCgKKyAgICBJTiBVQ0hBUiAgICAqa2V5LAorICAgIElOIFVDSEFSICAgICpwbGFpbnRleHQsCisgICAgSU4gVUNIQVIgICAgcF9sZW4sCisgICAgT1VUIFVDSEFSICAgKmNpcGhlcnRleHQpCit7CisgICAgVUNIQVIgICAgICAgQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07CisgICAgVUNIQVIgICAgICAgUls1MTJdOworICAgIElOVCAgICAgICAgIG51bV9ibG9ja3MgPSBwX2xlbi84OyAgIC8vIHVuaXQ6NjRiaXRzCisgICAgSU5UICAgICAgICAgaSwgajsKKyAgICBhZXNfY29udGV4dCBhZXNjdHg7CisgICAgVUNIQVIgICAgICAgeG9yOworCisgICAgcnRtcF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7CisKKyAgICAvLyBJbml0IElBCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgQVtpXSA9IDB4YTY7CisKKyAgICAvL0lucHV0IHBsYWludGV4dAorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIFJbOCAqIChpICsgMSkgKyBqXSA9IHBsYWludGV4dFs4ICogaSArIGpdOworICAgIH0KKworICAgIC8vIEtleSBNaXgKKyAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgIHsKKyAgICAgICAgZm9yKGkgPSAxOyBpIDw9IG51bV9ibG9ja3M7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy9waGFzZSAxCisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbOCAqIGldLCA4KTsKKyAgICAgICAgICAgIHJ0bXBfYWVzX2VuY3J5cHQoJmFlc2N0eCwgQklOLCBCT1VUKTsKKworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworICAgICAgICAgICAgeG9yID0gbnVtX2Jsb2NrcyAqIGogKyBpOworICAgICAgICAgICAgQVs3XSA9IEJPVVRbN10gXiB4b3I7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUls4ICogaV0sICZCT1VUWzhdLCA4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE91dHB1dCBjaXBoZXJ0ZXh0CisgICAgTmRpc01vdmVNZW1vcnkoY2lwaGVydGV4dCwgQSwgOCk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IG51bV9ibG9ja3M7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgODsgaisrKQorICAgICAgICAgICAgY2lwaGVydGV4dFs4ICogaSArIGpdID0gUls4ICogaSArIGpdOworICAgIH0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJTWlzYyBmdW5jdGlvbiB0byBkZWNyeXB0IEFFUyBib2R5CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCQlUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8JUkZDCTMzOTQgZm9yIGFlcyBrZXkgdW53cmFwIGFsZ29yaXRobS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQUVTX0dUS19LRVlfVU5XUkFQKAorCUlOCVVDSEFSCSprZXksCisJT1VUCVVDSEFSCSpwbGFpbnRleHQsCisJSU4JVUNIQVIgICAgY19sZW4sCisJSU4JVUNIQVIJKmNpcGhlcnRleHQpCisKK3sKKwlVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKKwlVQ0hBUiAgICAgICB4b3I7CisJSU5UICAgICAgICAgaSwgajsKKwlhZXNfY29udGV4dCBhZXNjdHg7CisJVUNIQVIgICAgICAgKlI7CisJSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IGNfbGVuLzg7CS8vIHVuaXQ6NjRiaXRzCisKKworCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJlIsIDUxMik7CisKKwlpZiAoUiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQUVTX0dUS19LRVlfVU5XUkFQOiBubyBtZW1vcnkhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gLyogRW5kIG9mIGlmICovCisKKwkvLyBJbml0aWFsaXplCisJTmRpc01vdmVNZW1vcnkoQSwgY2lwaGVydGV4dCwgOCk7CisJLy9JbnB1dCBwbGFpbnRleHQKKwlmb3IoaSA9IDA7IGkgPCAoY19sZW4tOCk7IGkrKykKKwl7CisJCVJbIGldID0gY2lwaGVydGV4dFtpICsgOF07CisJfQorCisJcnRtcF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7CisKKwlmb3IoaiA9IDU7IGogPj0gMDsgai0tKQorCXsKKwkJZm9yKGkgPSAobnVtX2Jsb2Nrcy0xKTsgaSA+IDA7IGktLSkKKwkJeworCQkJeG9yID0gKG51bV9ibG9ja3MgLTEgKSogaiArIGk7CisJCQlOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOworCQkJQklOWzddID0gQVs3XSBeIHhvcjsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZCSU5bOF0sICZSWyhpLTEpKjhdLCA4KTsKKwkJCXJ0bXBfYWVzX2RlY3J5cHQoJmFlc2N0eCwgQklOLCBCT1VUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEEsICZCT1VUWzBdLCA4KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZSWyhpLTEpKjhdLCAmQk9VVFs4XSwgOCk7CisJCX0KKwl9CisKKwkvLyBPVVRQVVQKKwlmb3IoaSA9IDA7IGkgPCBjX2xlbjsgaSsrKQorCXsKKwkJcGxhaW50ZXh0W2ldID0gUltpXTsKKwl9CisKKworCW9zX2ZyZWVfbWVtKE5VTEwsIFIpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisJCVJlcG9ydCB0aGUgRUFQIG1lc3NhZ2UgdHlwZQorCisJQXJndW1lbnRzOgorCQltc2cJCS0JRUFQT0xfUEFJUl9NU0dfMQorCQkJCQlFQVBPTF9QQUlSX01TR18yCisJCQkJCUVBUE9MX1BBSVJfTVNHXzMKKwkJCQkJRUFQT0xfUEFJUl9NU0dfNAorCQkJCQlFQVBPTF9HUk9VUF9NU0dfMQorCQkJCQlFQVBPTF9HUk9VUF9NU0dfMgorCisgICAgUmV0dXJuOgorICAgICAgICAgbWVzc2FnZSB0eXBlIHN0cmluZworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitDSEFSICpHZXRFYXBvbE1zZ1R5cGUoQ0hBUiBtc2cpCit7CisgICAgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzEpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAxIjsKKyAgICBlbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18yKQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMiI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMykKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDMiOworCWVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzQpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSA0IjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKKyAgICAgICAgcmV0dXJuICJHcm91cCBNZXNzYWdlIDEiOworCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18yKQorICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMiI7CisgICAgZWxzZQorICAgIAlyZXR1cm4gIkludmFsaWQgTWVzc2FnZSI7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2hlY2sgU2FuaXR5IFJTTiBJRSBvZiBFQVBvTCBtZXNzYWdlCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpCit7CisJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCVVDSEFSICAgICAgICAgICAgICAgbGVuOworCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKwlCT09MRUFOCQkJCXJlc3VsdCA9IEZBTFNFOworCisJcFZJRSA9IHBEYXRhOworCWxlbgkgPSBEYXRhTGVuOworCSpPZmZzZXQgPSAwOworCisJd2hpbGUgKGxlbiA+IHNpemVvZihSU05JRTIpKQorCXsKKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJLy8gV1BBIFJTTiBJRQorCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKSkKKwkJeworCQkJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBFbnRyeS0+UlNOX0lFLCBwRW50cnktPlJTTklFX0xlbikpICYmCisJCQkJKHBFbnRyeS0+UlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkpCisJCQl7CisJCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9CisJCS8vIFdQQTIgUlNOIElFCisJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMiB8fCBwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pKSAmJgorCQkJCShwRW50cnktPlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpLyogVG9Eby1BbGJlcnRZIGZvciBtZXNoKi8pCisJCQl7CisJCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9CisJCWVsc2UKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJbGVuICAtPSAocEVpZC0+TGVuICsgMik7CisJfQorCisKKwlyZXR1cm4gcmVzdWx0OworCit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCisgICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisgICAgTm90ZToKKyAgICAgICAgODAyLjExaSBEMTAKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUFBhcnNlRWFwb2xLZXlEYXRhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlJbmRleCwKKwlJTglVQ0hBUgkJCU1zZ1R5cGUsCisJSU4JQk9PTEVBTgkJCWJXUEEyLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSkKK3sKKyAgICBQS0RFX0VOQ0FQICAgICAgICAgIHBLREUgPSBOVUxMOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgcE15S2V5RGF0YSA9IHBLZXlEYXRhOworICAgIFVDSEFSICAgICAgICAgICAgICAgS2V5RGF0YUxlbmd0aCA9IEtleURhdGFMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgICBHVEtMRU4gPSAwOworCVVDSEFSCQkJCURlZmF1bHRJZHggPSAwOworCVVDSEFSCQkJCXNraXBfb2Zmc2V0OworCisJLy8gVmVyaWZ5IFRoZSBSU04gSUUgY29udGFpbmVkIGluIHBhaXJld2lzZV9tc2dfMiAmJiBwYWlyZXdpc2VfbXNnXzMgYW5kIHNraXAgaXQKKwlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKyAgICB7CisJCS8vIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSworCQlpZiAoIVJUTVBDaGVja1JTTklFKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sIHBFbnRyeSwgJnNraXBfb2Zmc2V0KSkKKwkJeworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBSU04gSUUgZGlmZmVyZW50CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfUlNOSUVfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOworCisgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSU05fSUUgRGlmZmVyZW50IGluIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCQloZXhfZHVtcCgiUmVjZWl2ZSBSU05fSUUgIiwgcEtleURhdGEsIEtleURhdGFMZW4pOworCQkJaGV4X2R1bXAoIkRlc2lyZWQgUlNOX0lFICIsIHBFbnRyeS0+UlNOX0lFLCBwRW50cnktPlJTTklFX0xlbik7CisKKwkJCXJldHVybiBGQUxTRTsKKyAgICAJfQorICAgIAllbHNlCisJCXsKKwkJCWlmIChiV1BBMiAmJiBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJLy8gc2tpcCBSU04gSUUKKwkJCQlwTXlLZXlEYXRhICs9IHNraXBfb2Zmc2V0OworCQkJCUtleURhdGFMZW5ndGggLT0gc2tpcF9vZmZzZXQ7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFBhcnNlRWFwb2xLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCBza2lwX29mZnNldCkpOworCQkJfQorCQkJZWxzZQorCQkJCXJldHVybiBUUlVFOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IEtleURhdGFMZW5ndGggJWQgd2l0aG91dCBSU05fSUUgXG4iLCBLZXlEYXRhTGVuZ3RoKSk7CisKKwkvLyBQYXJzZSBFS0QgZm9ybWF0IGluIHBhaXJ3aXNlX21zZ18zX1dQQTIgJiYgZ3JvdXBfbXNnXzFfV1BBMgorCWlmIChiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKwkJaWYgKEtleURhdGFMZW5ndGggPj0gOCkJLy8gS0RFIGZvcm1hdCBleGNsdWRlIEdUSyBsZW5ndGgKKyAgICAJeworICAgICAgICAJcEtERSA9IChQS0RFX0VOQ0FQKSBwTXlLZXlEYXRhOworCisKKwkJCURlZmF1bHRJZHggPSBwS0RFLT5HVEtFbmNhcC5LaWQ7CisKKwkJCS8vIFNhbml0eSBjaGVjayAtIEtFRCBsZW5ndGgKKwkJCWlmIChLZXlEYXRhTGVuZ3RoIDwgKHBLREUtPkxlbiArIDIpKQorICAgIAkJeworICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBUaGUgbGVuIGZyb20gS0RFIGlzIHRvbyBzaG9ydCBcbiIpKTsKKyAgICAgICAgCQlyZXR1cm4gRkFMU0U7CisgICAgCQl9CisKKwkJCS8vIEdldCBHVEsgbGVuZ3RoIC0gcmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgcC44MgorCQkJR1RLTEVOID0gcEtERS0+TGVuIC02OworCQkJaWYgKEdUS0xFTiA8IExFTl9BRVNfS0VZKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGxlbmd0aCBpcyB0b28gc2hvcnQgKCVkKSBcbiIsIEdUS0xFTikpOworICAgICAgICAJCXJldHVybiBGQUxTRTsKKwkJCX0KKworICAgIAl9CisJCWVsc2UKKyAgICAJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEtERSBmb3JtYXQgbGVuZ3RoIGlzIHRvbyBzaG9ydCBcbiIpKTsKKwkgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdUSyBpbiBLREUgZm9ybWF0ICxEZWZhdWx0S2V5SUQ9JWQsIEtleUxlbj0lZCBcbiIsIERlZmF1bHRJZHgsIEdUS0xFTikpOworCQkvLyBza2lwIGl0CisJCXBNeUtleURhdGEgKz0gODsKKwkJS2V5RGF0YUxlbmd0aCAtPSA4OworCisJfQorCWVsc2UgaWYgKCFiV1BBMiAmJiBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQorCXsKKwkJRGVmYXVsdElkeCA9IEdyb3VwS2V5SW5kZXg7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdUSyBEZWZhdWx0S2V5SUQ9JWQgXG4iLCBEZWZhdWx0SWR4KSk7CisJfQorCisJLy8gU2FuaXR5IGNoZWNrIC0gc2hhcmVkIGtleSBpbmRleCBtdXN0IGJlIDEgfiAzCisJaWYgKERlZmF1bHRJZHggPCAxIHx8IERlZmF1bHRJZHggPiAzKQorICAgIHsKKyAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGluZGV4KCVkKSBpcyBpbnZhbGlkIGluICVzICVzIFxuIiwgRGVmYXVsdElkeCwgKChiV1BBMikgPyAiV1BBMiIgOiAiV1BBIiksIEdldEVhcG9sTXNnVHlwZShNc2dUeXBlKSkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkvLyBUb2RvCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gVFJVRTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSBmb3IgV1BBIGhhbmRzaGFraW5nCisJCUl0cyBmb3JtYXQgaXMgYmVsb3csCisKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IFByb3RvY29sIFZlcnNpb24JIHwgIDEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IFByb3RvY29sIFR5cGUJCSB8CTEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEJvZHkgTGVuZ3RoCQkgfCAgMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IERlc2NyaXB0b3IgVHlwZQkgfAkxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgSW5mb3JtYXRpb24gICAgfAkyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IExlbmd0aAkgICAgIHwgIDEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBSZXBhbHkgQ291bnRlciB8CTggb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTm9uY2UJCSAgICAgfCAgMzIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgSVYJCQkgfCAgMTYgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgUlNDCQkJIHwgIDggb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgSUQgb3IgUmVzZXJ2ZWQgfAk4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IE1JQwkJCSB8CTE2IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IERhdGEgTGVuZ3RoCSB8CTIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgRGF0YQkJCSB8CW4gb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworCisJQXJndW1lbnRzOgorCQlwQWQJCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUNvbnN0cnVjdEVhcG9sTXNnKAorCUlOIAlQUlRNUF9BREFQVEVSICAgIAlwQWQsCisgICAgSU4gCVVDSEFSCQkJCUF1dGhNb2RlLAorICAgIElOIAlVQ0hBUgkJCQlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCUdyb3VwS2V5V2VwU3RhdHVzLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOCVVDSEFSCQkJCURlZmF1bHRLZXlJZHgsCisgICAgSU4gCVVDSEFSCQkJCSpSZXBsYXlDb3VudGVyLAorCUlOIAlVQ0hBUgkJCQkqS2V5Tm9uY2UsCisJSU4JVUNIQVIJCQkJKlR4UlNDLAorCUlOCVVDSEFSCQkJCSpQVEssCisJSU4JVUNIQVIJCQkJKkdUSywKKwlJTglVQ0hBUgkJCQkqUlNOSUUsCisJSU4JVUNIQVIJCQkJUlNOSUVfTGVuLAorICAgIE9VVCBQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cpCit7CisJQk9PTEVBTgliV1BBMiA9IEZBTFNFOworCisJLy8gQ2hvb3NlIFdQQTIgb3Igbm90CisJaWYgKChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyID0gVFJVRTsKKworICAgIC8vIEluaXQgUGFja2V0IGFuZCBGaWxsIGhlYWRlcgorICAgIHBNc2ctPlByb1ZlciA9IEVBUE9MX1ZFUjsKKyAgICBwTXNnLT5Qcm9UeXBlID0gRUFQT0xLZXk7CisKKwkvLyBEZWZhdWx0IDk1IGJ5dGVzLCB0aGUgRUFQb0wtS2V5IGRlc2NyaXB0b3IgZXhjbHVkZSBLZXktZGF0YSBmaWVsZAorCXBNc2ctPkJvZHlfTGVuWzFdID0gTEVOX0VBUE9MX0tFWV9NU0c7CisKKwkvLyBGaWxsIGluIEVBUG9MIGRlc2NyaXB0b3IKKwlpZiAoYldQQTIpCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisJZWxzZQorCQlwTXNnLT5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCisJLy8gRmlsbCBpbiBLZXkgaW5mb3JtYXRpb24sIHJlZmVyIHRvIElFRUUgU3RkIDgwMi4xMWktMjAwNCBwYWdlIDc4CisJLy8gV2hlbiBlaXRoZXIgdGhlIHBhaXJ3aXNlIG9yIHRoZSBncm91cCBjaXBoZXIgaXMgQUVTLCB0aGUgREVTQ19UWVBFX0FFUygyKSBzaGFsbCBiZSB1c2VkLgorCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0KKyAgICAgICAgCSgoKFdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fCAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7CisKKwkvLyBTcGVjaWZ5IEtleSBUeXBlIGFzIEdyb3VwKDApIG9yIFBhaXJ3aXNlKDEpCisJaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gR1JPVVBLRVk7CisJZWxzZQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gU3BlY2lmeSBLZXkgSW5kZXgsIG9ubHkgZ3JvdXBfbXNnMV9XUEExCisJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlJbmRleCA9IERlZmF1bHRLZXlJZHg7CisKKwlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCA9IDE7CisKKwlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5QWNrID0gMTsKKworCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlNaWMgPSAxOworCisJaWYgKChiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9QQUlSX01TR18zKSkgfHwgKCFiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQorICAgIHsKKyAgICAgICAJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZSA9IDE7CisgICAgfQorCisJaWYgKGJXUEEyICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQorICAgIHsKKyAgICAgICAgcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCA9IDE7CisgICAgfQorCisJLy8ga2V5IEluZm9ybWF0aW9uIGVsZW1lbnQgaGFzIGRvbmUuCisJKihVU0hPUlQgKikoJnBNc2ctPktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBGaWxsIGluIEtleSBMZW5ndGgKKyNpZiAwCisJaWYgKGJXUEEyKQorCXsKKwkJLy8gSW4gV1BBMiBtb2RlLCB0aGUgZmllbGQgaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgcGFpcndpc2Uga2V5IGNpcGhlciwKKwkJLy8gc28gb25seSBwYWlyd2lzZV9tc2dfMSBhbmQgcGFpcndpc2VfbXNnXzMgbmVlZCB0byBmaWxsLgorCQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykpCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDogTEVOX0FFU19LRVkpOworCX0KKwllbHNlIGlmICghYldQQTIpCisjZW5kaWYKKwl7CisJCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKQorCQl7CisJCQkvLyB0aGUgbGVuZ3RoIG9mIGdyb3VwIGtleSBjaXBoZXIKKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0gKChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSA/IFRLSVBfR1RLX0xFTkdUSCA6IExFTl9BRVNfS0VZKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIHRoZSBsZW5ndGggb2YgcGFpcndpc2Uga2V5IGNpcGhlcgorCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKFdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSA/IExFTl9US0lQX0tFWSA6IExFTl9BRVNfS0VZKTsKKwkJfQorCX0KKworIAkvLyBGaWxsIGluIHJlcGxheSBjb3VudGVyCisgICAgTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIEZpbGwgS2V5IE5vbmNlIGZpZWxkCisJLy8gQU5vbmNlIDogcGFpcndpc2VfbXNnMSAmIHBhaXJ3aXNlX21zZzMKKwkvLyBTTm9uY2UgOiBwYWlyd2lzZV9tc2cyCisJLy8gR05vbmNlIDogZ3JvdXBfbXNnMV93cGExCisJaWYgKChNc2dUeXBlIDw9IEVBUE9MX1BBSVJfTVNHXzMpIHx8ICgoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpKQorICAgIAlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU5vbmNlLCBLZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIEZpbGwga2V5IElWIC0gV1BBMiBhcyAwLCBXUEExIGFzIHJhbmRvbQorCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKwkJLy8gU3VnZ2VzdCBJViBiZSByYW5kb20gbnVtYmVyIHBsdXMgc29tZSBudW1iZXIsCisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5SXYsICZLZXlOb25jZVsxNl0sIExFTl9LRVlfREVTQ19JVik7CisgICAgICAgIHBNc2ctPktleURlc2MuS2V5SXZbMTVdICs9IDI7CisJfQorCisgICAgLy8gRmlsbCBLZXkgUlNDIGZpZWxkCisgICAgLy8gSXQgY29udGFpbnMgdGhlIFJTQyBmb3IgdGhlIEdUSyBiZWluZyBpbnN0YWxsZWQuCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTIpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwl7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5UnNjLCBUeFJTQywgNik7CisJfQorCisJLy8gQ2xlYXIgS2V5IE1JQyBmaWVsZCBmb3IgTUlDIGNhbGN1bGF0aW9uIGxhdGVyCisgICAgTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJQ29uc3RydWN0RWFwb2xLZXlEYXRhKHBBZCwKKwkJCQkJCSAgQXV0aE1vZGUsCisJCQkJCQkgIFdlcFN0YXR1cywKKwkJCQkJCSAgR3JvdXBLZXlXZXBTdGF0dXMsCisJCQkJCQkgIE1zZ1R5cGUsCisJCQkJCQkgIERlZmF1bHRLZXlJZHgsCisJCQkJCQkgIGJXUEEyLAorCQkJCQkJICBQVEssCisJCQkJCQkgIEdUSywKKwkJCQkJCSAgUlNOSUUsCisJCQkJCQkgIFJTTklFX0xlbiwKKwkJCQkJCSAgcE1zZyk7CisKKwkvLyBDYWxjdWxhdGUgTUlDIGFuZCBmaWxsIGluIEtleU1pYyBGaWVsZCBleGNlcHQgUGFpcndpc2UgTXNnIDEuCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwl7CisJCUNhbGN1bGF0ZU1JQyhwQWQsIFdlcFN0YXR1cywgUFRLLCBwTXNnKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IENvbnN0cnVjdEVhcG9sTXNnIGZvciAlcyAlc1xuIiwgKChiV1BBMikgPyAiV1BBMiIgOiAiV1BBIiksIEdldEVhcG9sTXNnVHlwZShNc2dUeXBlKSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIgkgICAgIEJvZHkgbGVuZ3RoID0gJWQgXG4iLCBwTXNnLT5Cb2R5X0xlblsxXSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIgkgICAgIEtleSBsZW5ndGggID0gJWQgXG4iLCBwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSkpOworCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbnN0cnVjdCB0aGUgS2V5IERhdGEgZmllbGQgb2YgRUFQb0wgbWVzc2FnZQorCisJQXJndW1lbnRzOgorCQlwQWQJCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDb25zdHJ1Y3RFYXBvbEtleURhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCVdlcFN0YXR1cywKKwlJTglVQ0hBUgkJCUdyb3VwS2V5V2VwU3RhdHVzLAorCUlOIAlVQ0hBUgkJCU1zZ1R5cGUsCisJSU4JVUNIQVIJCQlEZWZhdWx0S2V5SWR4LAorCUlOCUJPT0xFQU4JCQliV1BBMkNhcGFibGUsCisJSU4JVUNIQVIJCQkqUFRLLAorCUlOCVVDSEFSCQkJKkdUSywKKwlJTglVQ0hBUgkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCVJTTklFX0xFTiwKKwlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpCit7CisJVUNIQVIJCSptcG9vbCwgKktleV9EYXRhLCAqUmM0R1RLOworCVVDSEFSICAgICAgIGVrZXlbKExFTl9LRVlfREVTQ19JVitMRU5fRUFQX0VLKV07CisJVUNIQVIJCWRhdGFfb2Zmc2V0OworCisKKwlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfNCB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18yKQorCQlyZXR1cm47CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDE1MDApOworCisgICAgaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIFJjNEdUSyBMZW4gPSA1MTIgKi8KKwlSYzRHVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8qIEtleV9EYXRhIExlbiA9IDUxMiAqLworCUtleV9EYXRhID0gKFVDSEFSICopIFJPVU5EX1VQKFJjNEdUSyArIDUxMiwgNCk7CisKKwlOZGlzWmVyb01lbW9yeShLZXlfRGF0YSwgNTEyKTsKKwlwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPSAwOworCWRhdGFfb2Zmc2V0ID0gMDsKKworCS8vIEVuY2Fwc3VsYXRlIFJTTklFIGluIHBhaXJ3aXNlX21zZzIgJiBwYWlyd2lzZV9tc2czCisJaWYgKFJTTklFX0xFTiAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykpKQorCXsKKwkJaWYgKGJXUEEyQ2FwYWJsZSkKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSBJRV9XUEEyOworCQllbHNlCisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gSUVfV1BBOworCisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSBSU05JRV9MRU47CisJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdLCBSU05JRSwgUlNOSUVfTEVOKTsKKwkJZGF0YV9vZmZzZXQgKz0gKDIgKyBSU05JRV9MRU4pOworCX0KKworCS8vIEVuY2Fwc3VsYXRlIEtERSBmb3JtYXQgaW4gcGFpcndpc2VfbXNnM19XUEEyICYgZ3JvdXBfbXNnMV9XUEEyCisJaWYgKGJXUEEyQ2FwYWJsZSAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkKKwl7CisJCS8vIEtleSBEYXRhIEVuY2Fwc3VsYXRpb24gKEtERSkgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN3IGFuZCBUYWJsZS0yMGgKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisKKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDE2Oy8vIDQrMisxNihPVUkrRGF0YVR5cGUrRGF0YUZpZWxkKQorCQl9CisJCWVsc2UKKwkJeworCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDB4MjY7Ly8gNCsyKzMyKE9VSStEYXRhVHlwZStEYXRhRmllbGQpCisJCX0KKworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMHgwMDsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAzXSA9IDB4MEY7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNF0gPSAweEFDOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMHgwMTsKKworCQkvLyBHVEsgS0RFIGZvcm1hdCAtIDgwMi4xMWktMjAwNCAgRmlndXJlLTQzeAorICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDZdID0gKERlZmF1bHRLZXlJZHggJiAweDAzKTsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA3XSA9IDB4MDA7CS8vIFJlc2VydmVkIEJ5dGUKKworCQlkYXRhX29mZnNldCArPSA4OworCX0KKworCisJLy8gRW5jYXBzdWxhdGUgR1RLIGFuZCBlbmNyeXB0IHRoZSBrZXktZGF0YSBmaWVsZCB3aXRoIEtFSy4KKwkvLyBPbmx5IGZvciBwYWlyd2lzZV9tc2czX1dQQTIgYW5kIGdyb3VwX21zZzEKKwlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMkNhcGFibGUpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwl7CisJCS8vIEZpbGwgaW4gR1RLCisJCWlmIChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssIExFTl9BRVNfS0VZKTsKKwkJCWRhdGFfb2Zmc2V0ICs9IExFTl9BRVNfS0VZOworCQl9CisJCWVsc2UKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0XSwgR1RLLCBUS0lQX0dUS19MRU5HVEgpOworCQkJZGF0YV9vZmZzZXQgKz0gVEtJUF9HVEtfTEVOR1RIOworCQl9CisKKwkJLy8gU3RpbGwgZG9udCBrbm93IHdoeSwgYnV0IGlmIG5vdCBhcHBlbmQgd2lsbCBvY2N1ciAiR1RLIG5vdCBpbmNsdWRlIGluIE1TRzMiCisJCS8vIFBhdGNoIGZvciBjb21wYXRpYmlsaXR5IGJldHdlZW4gemVybyBjb25maWcgYW5kIGZ1bmsKKwkJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMkNhcGFibGUpCisJCXsKKwkJCWlmIChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJeworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSAweEREOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAwOworCQkJCWRhdGFfb2Zmc2V0ICs9IDI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDA7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAyXSA9IDA7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAzXSA9IDA7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA0XSA9IDA7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA1XSA9IDA7CisJCQkJZGF0YV9vZmZzZXQgKz0gNjsKKwkJCX0KKwkJfQorCisJCS8vIEVuY3J5cHQgdGhlIGRhdGEgbWF0ZXJpYWwgaW4ga2V5IGRhdGEgZmllbGQKKwkJaWYgKFdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQl7CisJCQlBRVNfR1RLX0tFWV9XUkFQKCZQVEtbMTZdLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQsIFJjNEdUSyk7CisgICAgICAgICAgICAvLyBBRVMgd3JhcCBmdW5jdGlvbiB3aWxsIGdyb3cgOCBieXRlcyBpbiBsZW5ndGgKKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IDg7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBQUkVQQVJFIEVuY3J5cHRlZCAgIktleSBEQVRBIiBmaWVsZC4gIChFbmNyeXB0IEdUSyB3aXRoIFJDNCwgdXNpbmYgUFRLWzE2XS0+WzMxXSBhcyBLZXksIElWLWZpZWxkIGFzIElWKQorCQkJLy8gcHV0IFR4VHNjIGluIEtleSBSU0MgZmllbGQKKwkJCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7ICAgLy9Jbml0IGNyYzMyLgorCisJCQkvLyBla2V5IGlzIHRoZSBjb250YW5ldGlvbiBvZiBJVi1maWVsZCwgYW5kIFBUS1sxNl0tPlBUS1szMV0KKwkJCU5kaXNNb3ZlTWVtb3J5KGVrZXksIHBNc2ctPktleURlc2MuS2V5SXYsIExFTl9LRVlfREVTQ19JVik7CisJCQlOZGlzTW92ZU1lbW9yeSgmZWtleVtMRU5fS0VZX0RFU0NfSVZdLCAmUFRLWzE2XSwgTEVOX0VBUF9FSyk7CisJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgZWtleSwgc2l6ZW9mKGVrZXkpKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKwkJCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwkJCVdQQUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBSYzRHVEssIEtleV9EYXRhLCBkYXRhX29mZnNldCk7CisJCX0KKworCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleURhdGEsIFJjNEdUSywgZGF0YV9vZmZzZXQpOworCX0KKwllbHNlCisJeworCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleURhdGEsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7CisJfQorCisJLy8gc2V0IGtleSBkYXRhIGxlbmd0aCBmaWVsZCBhbmQgdG90YWwgbGVuZ3RoCisJcE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gZGF0YV9vZmZzZXQ7CisgICAgcE1zZy0+Qm9keV9MZW5bMV0gKz0gZGF0YV9vZmZzZXQ7CisKKwlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY2F1bGF0ZSBNSUMuIEl0IGlzIHVzZWQgZHVyaW5nIDQtd2F5cyBoYW5kc2hhcmtpbmcuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJUGVlcldlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUNhbGN1bGF0ZU1JQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVBlZXJXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQkqUFRLLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZykKK3sKKyAgICBVQ0hBUiAgICpPdXRCdWZmZXI7CisJVUxPTkcJRnJhbWVMZW4gPSAwOworCVVDSEFSCW1pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKwlVQ0hBUglkaWdlc3RbODBdOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IGZvciBNSUMgY2FsY3VsYXRpb24KKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJk91dEJ1ZmZlciwgNTEyKTsKKworICAgIGlmIChPdXRCdWZmZXIgPT0gTlVMTCkKKyAgICB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiEhIUNhbGN1bGF0ZU1JQzogbm8gbWVtb3J5ISEhXG4iKSk7CisJCXJldHVybjsKKyAgICB9CisKKwkvLyBtYWtlIGEgZnJhbWUgZm9yIGNhbGN1bGF0aW5nIE1JQy4KKyAgICBNYWtlT3V0Z29pbmdGcmFtZShPdXRCdWZmZXIsICAgICAgICAgICAgCSZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBwTXNnLT5Cb2R5X0xlblsxXSArIDQsICAJcE1zZywKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKKworCS8vIENhbGN1bGF0ZSBNSUMKKyAgICBpZiAoUGVlcldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorIAl7CisJCUhNQUNfU0hBMShPdXRCdWZmZXIsICBGcmFtZUxlbiwgUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KG1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUoUFRLLCAgTEVOX0VBUF9NSUNLLCBPdXRCdWZmZXIsIEZyYW1lTGVuLCBtaWMpOworCX0KKworCS8vIHN0b3JlIHRoZSBjYWxjdWxhdGVkIE1JQworCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJb3NfZnJlZV9tZW0ocEFkLCBPdXRCdWZmZXIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU29tZSByZWNlaXZlZCBmcmFtZXMgY2FuJ3QgZGVjcnlwdCBieSBBc2ljLCBzbyBkZWNyeXB0IHRoZW0gYnkgc29mdHdhcmUuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJUGVlcldlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUwkJLQlkZWNyeXB0aW9uIHN1Y2Nlc3NmdWwKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQkJLQlkZWNyeXB0aW9uIGZhaWx1cmUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCVJUTVBTb2Z0RGVjcnlwdEJyb2FkQ2FzdERhdGEoCisJSU4JUFJUTVBfQURBUFRFUgkJCQkJcEFkLAorCUlOCVJYX0JMSwkJCQkJCQkqcFJ4QmxrLAorCUlOICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyAJR3JvdXBDaXBoZXIsCisJSU4gIFBDSVBIRVJfS0VZCQkJCQkJcFNoYXJkX2tleSkKK3sKKwlQUlhXSV9TVFJVQwkJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKworCisKKwkvLyBoYW5kbGUgV0VQIGRlY3J5cHRpb24KKwlpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKyAgICB7CisJCWlmIChSVE1QU29mdERlY3J5cHRXRVAocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBwU2hhcmRfa2V5KSkKKwkJeworCisJCQkvL01pbnVzIElWWzRdICYgSUNWWzRdCisJCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDg7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFNvZnR3YXJlIGRlY3J5cHQgV0VQIGRhdGEgZmFpbHMuXG4iKSk7CisJCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCS8vIGhhbmRsZSBUS0lQIGRlY3J5cHRpb24KKwllbHNlIGlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCXsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdFRLSVAocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCAwLCBwU2hhcmRfa2V5KSkKKwkJeworCisJCQkvL01pbnVzIDggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViwgNCBieXRlcyBJQ1YKKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gMjA7CisJCX0KKyAgICAgICAgZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFJUTVBTb2Z0RGVjcnlwdFRLSVAgRmFpbGVkXG4iKSk7CisJCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisJfQorCS8vIGhhbmRsZSBBRVMgZGVjcnlwdGlvbgorCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlpZiAoUlRNUFNvZnREZWNyeXB0QUVTKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vOCBieXRlcyBNSUMsIDggYnl0ZXMgSVYvRUlWIChDQ01QIEhlYWRlcikKKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gMTY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFJUTVBTb2Z0RGVjcnlwdEFFUyBGYWlsZWRcbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Rmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjZjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Rmcy5jCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIGFwX2Rmcy5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBTdXBwb3J0IERGUyBmdW5jdGlvbi4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRm9uY2hpICAgIDAzLTEyLTIwMDcgICAgICBjcmVhdGVkCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK3R5cGVkZWYgc3RydWN0IF9SQURBUl9EVVJBVElPTl9UQUJMRQoreworCVVMT05HIFJERHVyUmVnaW9uOworCVVMT05HIFJhZGFyU2lnbmFsRHVyYXRpb247CisJVUxPTkcgVG9sZXJhbmNlOworfSBSQURBUl9EVVJBVElPTl9UQUJMRSwgKlBSQURBUl9EVVJBVElPTl9UQUJMRTsKKworCitzdGF0aWMgVUNIQVIgUmRJZGxlVGltZVRhYmxlW01BWF9SRF9SRUdJT05dWzRdID0KK3sKKwl7OSwgMjUwLCAyNTAsIDI1MH0sCQkvLyBDRQorCXs0LCAyNTAsIDI1MCwgMjUwfSwJCS8vIEZDQworCXs0LCAyNTAsIDI1MCwgMjUwfSwJCS8vIEpBUAorCXsxNSwgMjUwLCAyNTAsIDI1MH0sCS8vIEpBUF9XNTMKKwl7NCwgMjUwLCAyNTAsIDI1MH0JCS8vIEpBUF9XNTYKK307CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCYnAgUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUlOVDggUmFkYXJQZXJpb2Q7CisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTE0LCAweDAyKTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIxLCAweDIwKTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIyLCAweDAwKTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIzLCAweDA4LyoweDgwKi8pOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjQsIDB4MjgpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjUsIDB4ZmYpOworCisjaWYgMAorCS8vIHRvZ2dsZSBSeCBlbmFibGUgYml0IGZvciByYWRhciBkZXRlY3Rpb24uCisJLy8gaXQncyBBbmR5J3MgcmVjb21tYW5kLgorCXsKKwkJVUlOVDMyIFZhbHVlOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCVZhbHVlIHw9ICgweDEgPDwgMyk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJVmFsdWUgJj0gfigweDEgPDwgMyk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJfQorI2VuZGlmCisJUmFkYXJQZXJpb2QgPSAoKFVJTlQpUmRJZGxlVGltZVRhYmxlW3BBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uXVswXSArIChVSU5UKXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lKSA8IDI1MCA/CisJCQkoUmRJZGxlVGltZVRhYmxlW3BBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uXVswXSArIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lKSA6IDI1MDsKKworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIwLCAweDFkKTsKKwlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMSwgMHg0MCk7CisKKwlSYWRhckRldGVjdGlvblN0YXJ0KHBBZCwgMCwgUmFkYXJQZXJpb2QpOworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdG9wKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIwLCAweDFkKTsKKwlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMSwgMHg2MCk7CisKKwlSYWRhckRldGVjdGlvblN0b3AocEFkKTsKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSYWRhciBkZXRlY3Rpb24gcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIENUU1Byb3RlY3QsCisJSU4gVUlOVDggQ1RTUGVyaW9kKQoreworCVVJTlQ4IERmc0FjdGl2ZVRpbWUgPSAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgJiAweDFmKTsKKwlVSU5UOCBDdHNQcm90ZWN0ID0gKENUU1Byb3RlY3QgPT0gMSkgPyAweDAyIDogMHgwMTsgLy8gQ1RTIHByb3RlY3QuCisKKwlpZiAoQ1RTUHJvdGVjdCAhPSAwKQorCXsKKwkJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKQorCQl7CisJCWNhc2UgRkNDOgorCQljYXNlIEpBUF9XNTY6CisJCQlDdHNQcm90ZWN0ID0gMHgwMzsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0U6CisJCWNhc2UgSkFQX1c1MzoKKwkJZGVmYXVsdDoKKwkJCUN0c1Byb3RlY3QgPSAweDAyOworCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZQorCQlDdHNQcm90ZWN0ID0gMHgwMTsKKworCisJLy8gc2VuZCBzdGFydC1SRCB3aXRoIENUUyBwcm90ZWN0aW9uIGNvbW1hbmQgdG8gTUNVCisJLy8gaGlnaGJ5dGUgWzddCQlyZXNlcnZlCisJLy8gaGlnaGJ5dGUgWzY6NV0JMHg6IHN0b3AgQ2Fycmllci9SYWRhciBkZXRlY3Rpb24KKwkvLyBoaWdoYnl0ZSBbMTBdOglTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRob3V0IENUUyBwcm90ZWN0aW9uLCAxMTogU3RhcnQgQ2Fycmllci9SYWRhciBkZXRlY3Rpb24gd2l0aCBDVFMgcHJvdGVjdGlvbgorCS8vIGhpZ2hieXRlIFs0OjBdCVJhZGFyL2NhcnJpZXIgZGV0ZWN0aW9uIGR1cmF0aW9uLiBJbiAxbXMuCisKKwkvLyBsb3dieXRlIFs3OjBdCVJhZGFyL2NhcnJpZXIgZGV0ZWN0aW9uIHBlcmlvZCwgaW4gMW1zLgorCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MCwgMHhmZiwgQ1RTUGVyaW9kLCBEZnNBY3RpdmVUaW1lIHwgKEN0c1Byb3RlY3QgPDwgNSkpOworCS8vQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYzLCAweGZmLCAxMCwgMCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSYWRhciBkZXRlY3Rpb24gcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQlGb3VuZCByYWRhciBzaWduYWwKKwkJRkFMU0UJTm90IGZvdW5kIHJhZGFyIHNpZ25hbAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSYWRhckRldGVjdGlvblN0b3AuXG4iKSk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCAweDAwLCAweDAwKTsJLy8gc2VuZCBzdGFydC1SRCB3aXRoIENUUyBwcm90ZWN0aW9uIGNvbW1hbmQgdG8gTUNVCisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSYWRhciBjaGFubmVsIGNoZWNrIHJvdXRpbmUKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJbmVlZCB0byBkbyByYWRhciBkZXRlY3QKKwkJRkFMU0UJbmVlZCBub3QgdG8gZG8gcmFkYXIgZGV0ZWN0CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQ2gpCit7CisjaWYgMQorCUlOVAkJaTsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCisJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKENoID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKKwkJeworCQkJcmVzdWx0ID0gcEFkLT5DaGFubmVsTGlzdFtpXS5EZnNSZXE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7CisjZWxzZQorCUlOVAkJaTsKKwlVQ0hBUglDaGFubmVsWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKKworCWZvciAoaT0wOyBpPDE1OyBpKyspCisJeworCQlpZiAoQ2ggPT0gQ2hhbm5lbFtpXSkKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSAhPSAxNSkKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworVUxPTkcgSmFwUmFkYXJUeXBlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVMT05HCQlpOworCWNvbnN0IFVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uICE9IEpBUCkKKwl7CisJCXJldHVybiBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbjsKKwl9CisKKwlmb3IgKGk9MDsgaTwxNTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gQ2hhbm5lbFtpXSkKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA8IDQpCisJCXJldHVybiBKQVBfVzUzOworCWVsc2UgaWYgKGkgPCAxNSkKKwkJcmV0dXJuIEpBUF9XNTY7CisJZWxzZQorCQlyZXR1cm4gSkFQOyAvLyBXNTIKKworfQorCitVTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUlOVDggYnl0ZVZhbHVlID0gMDsKKwlVTE9ORyByZXN1bHQ7CisKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTUsICZieXRlVmFsdWUpOworCisJcmVzdWx0ID0gMDsKKwlzd2l0Y2ggKGJ5dGVWYWx1ZSkKKwl7CisJY2FzZSAxOiAvLyByYWRhciBzaWduYWwgZGV0ZWN0ZWQgYnkgcHVsc2UgbW9kZS4KKwljYXNlIDI6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSB3aWR0aCBtb2RlLgorCQlyZXN1bHQgPSBSVE1QUmVhZFJhZGFyRHVyYXRpb24ocEFkKTsKKwkJYnJlYWs7CisKKwljYXNlIDA6IC8vIE5vIHJhZGFyIHNpZ25hbC4KKwlkZWZhdWx0OgorCisJCXJlc3VsdCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK1VMT05HIFJUTVBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVTE9ORyByZXN1bHQgPSAwOworCisjaWZkZWYgREZTX1NVUFBPUlQKKwlVSU5UOCBkdXJhdGlvbjEgPSAwLCBkdXJhdGlvbjIgPSAwLCBkdXJhdGlvbjMgPSAwOworCisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE2LCAmZHVyYXRpb24xKTsKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTcsICZkdXJhdGlvbjIpOworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExOCwgJmR1cmF0aW9uMyk7CisJcmVzdWx0ID0gKGR1cmF0aW9uMSA8PCAxNikgKyAoZHVyYXRpb24yIDw8IDgpICsgZHVyYXRpb24zOworI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCisKKwlyZXR1cm4gcmVzdWx0OworCit9CisKK1ZPSUQgUlRNUENsZWFuUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmFkYXIgd2F2ZSBkZXRlY3Rpb24uIFRoZSBBUEkgc2hvdWxkIGJlIGludm9rZSBlYWNoIHNlY29uZC4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBcFJhZGFyRGV0ZWN0UGVyaW9kaWMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCWk7CisKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5JblNlcnZpY2VNb25pdG9yQ291bnQrKzsKKworCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPiAwKQorCQl7CisJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgLS07CisJCQlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kJTUpID09IDApCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFkYXJEZXRlY3RQZXJpb2RpYyAtIGNoPSVkLCBSZW1haW5pbmdUaW1lRm9yVXNlPSVkXG4iLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSkpOworCQkJfQorCQl9CisJfQorCisJLy9yYWRhciBkZXRlY3QKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJeworCQlSYWRhckRldGVjdFBlcmlvZGljKHBBZCk7CisJfQorCisJcmV0dXJuOworfQorCisvLyBQZXJpb2RpYyBSYWRhciBkZXRlY3Rpb24sIHN3aXRjaCBjaGFubmVsIHdpbGwgb2NjdXIgaW4gUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoKQorLy8gQmVmb3JlIHN3aXRjaCBjaGFubmVsLCBkcml2ZXIgbmVlZHMgZG9pbmcgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50LgorVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vIG5lZWQgdG8gY2hlY2sgY2hhbm5lbCBhdmFpbGFiaWxpdHksIGFmdGVyIHN3aXRjaCBjaGFubmVsCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9TSUxFTkNFX01PREUpCisJCQlyZXR1cm47CisKKwkvLyBjaGFubmVsIGF2YWlsYWJpbGl0eSBjaGVjayB0aW1lIGlzIDYwc2VjLCB1c2UgNjUgZm9yIGFzc3VyYW5jZQorCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50KysgPiBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3QgZm91bmQgcmFkYXIgc2lnbmFsLCBzdGFydCBzZW5kIGJlYWNvbiBhbmQgcmFkYXIgZGV0ZWN0aW9uIGluIHNlcnZpY2UgbW9uaXRvclxuXG4iKSk7CisJCQlCYnBSYWRhckRldGVjdGlvblN0b3AocEFkKTsKKwkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKKwkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisKKworCQlyZXR1cm47CisJfQorCisJcmV0dXJuOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJY2hhbmdlIGNoYW5uZWwgbW92aW5nIHRpbWUgZm9yIERGUyB0ZXN0aW5nLgorCisJQXJndW1lbnRzOgorCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBzZXQgQ2hNb3ZUaW1lPVt2YWx1ZV0KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ2hNb3ZpbmdUaW1lX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlVSU5UOCBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IFZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19GVU5DVElPTl9fLAorCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0xvbmdQdWxzZVJhZGFyVGhfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCVVJTlQ4IFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID4gMTAgPyAxMCA6IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoID0gVmFsdWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMTZlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2VlcHJvbS5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWVlcHJvbS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjaWYgMAorI2RlZmluZSBFRVBST01fU0laRQkJCQkJCQkJMHgyMDAKKyNkZWZpbmUgTlZSQU1fT0ZGU0VUCQkJMHgzMDAwMAorI2RlZmluZSBSRl9PRkZTRVQJCQkJMHg0MDAwMAorCitzdGF0aWMgVUNIQVIgaW5pdF9mbGFnID0gMDsKK3N0YXRpYyBQVUNIQVIgbnZfZWVfc3RhcnQgPSAwOworCitzdGF0aWMgVUNIQVIgRWVCdWZmZXJbRUVQUk9NX1NJWkVdOworI2VuZGlmCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBSYWlzZUNsb2NrKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVSU5UMzIgKngpCit7CisgICAgKnggPSAqeCB8IEVFU0s7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworICAgIFJUTVB1c2VjRGVsYXkoMSk7CQkJCS8vIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24KK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgTG93ZXJDbG9jaygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVUlOVDMyICp4KQoreworICAgICp4ID0gKnggJiB+RUVTSzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisgICAgUlRNUHVzZWNEZWxheSgxKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VTSE9SVCBTaGlmdEluQml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJCXgsaTsKKwlVU0hPUlQgICAgICBkYXRhPTA7CisKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgIHggJj0gfiggRUVETyB8IEVFREkpOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZGF0YSA9IGRhdGEgPDwgMTsKKyAgICAgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKKworICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgICAgICB4ICY9IH4oRUVESSk7CisgICAgICAgIGlmKHggJiBFRURPKQorICAgICAgICAgICAgZGF0YSB8PSAxOworCisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIFNoaWZ0T3V0Qml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIGRhdGEsCisgICAgSU4gIFVTSE9SVCBjb3VudCkKK3sKKyAgICBVSU5UMzIgICAgICAgeCxtYXNrOworCisgICAgbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICB4ICY9IH4oRUVETyB8IEVFREkpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHggJj0gfkVFREk7CisgICAgICAgIGlmKGRhdGEgJiBtYXNrKQkJeCB8PSBFRURJOworCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisgICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKKyAgICB9IHdoaWxlKG1hc2spOworCisgICAgeCAmPSB+RUVESTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgRUVwcm9tQ2xlYW51cCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIgeDsKKworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgeCAmPSB+KEVFQ1MgfCBFRURJKTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKK30KKworVk9JRCBFV0VOKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFVJTlQzMgl4OworCisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0VOX09QQ09ERSwgNSk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKK1ZPSUQgRVdEUygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJeDsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCkKK3sKKyAgICBVSU5UMzIJCXg7CisgICAgVVNIT1JUCQlkYXRhOworCisgICAgT2Zmc2V0IC89IDI7CisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCByZWdpc3RlciBudW1iZXIgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9SRUFEX09QQ09ERSwgMyk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOworCisgICAgLy8gTm93IHJlYWQgdGhlIGRhdGEgKDE2IGJpdHMpIGluIGZyb20gdGhlIHNlbGVjdGVkIEVFUFJPTSB3b3JkCisgICAgZGF0YSA9IFNoaWZ0SW5CaXRzKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7CisKKyAgICByZXR1cm4gZGF0YTsKK30JLy9SZWFkRUVwcm9tCisKK1ZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCwKKyAgICBJTiAgVVNIT1JUIERhdGEpCit7CisgICAgVUlOVDMyIHg7CisKKwlPZmZzZXQgLz0gMjsKKworCUVXRU4ocEFkKTsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSAscmVnaXN0ZXIgbnVtYmVyIGFuZCBkYXRhIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fV1JJVEVfT1BDT0RFLCAzKTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCBPZmZzZXQsIHBBZC0+RUVQUk9NQWRkcmVzc051bSk7CisJU2hpZnRPdXRCaXRzKHBBZCwgRGF0YSwgMTYpOwkJLy8gMTYtYml0IGFjY2VzcworCisgICAgLy8gcmVhZCBETyBzdGF0dXMKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCUVFcHJvbUNsZWFudXAocEFkKTsKKworCVJUTVB1c2VjRGVsYXkoMTAwMDApOwkvL2RlbGF5IGZvciB0d3AoTUFYKT0xMG1zCisKKwlFV0RTKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDY2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9maXJtd2FyZS5oCkBAIC0wLDAgKzEsNTU4IEBACisvKgorIENvcHlyaWdodCAoYykgMjAwNywgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24uICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIGJpbmFyeSBmb3JtLCB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIG1ldDoKKworIAkqIFJlZGlzdHJpYnV0aW9ucyBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlCisgCWZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAJcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIAkqIE5laXRoZXIgdGhlIG5hbWUgb2YgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAJc3VwcGxpZXJzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworIAlzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAJKiBObyByZXZlcnNlIGVuZ2luZWVyaW5nLCBkZWNvbXBpbGF0aW9uLCBvciBkaXNhc3NlbWJseSBvZiB0aGlzIHNvZnR3YXJlCisgCWlzIHBlcm1pdHRlZC4KKworIExpbWl0ZWQgcGF0ZW50IGxpY2Vuc2UuIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uIGdyYW50cyBhIHdvcmxkLXdpZGUsCisgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UgdW5kZXIgcGF0ZW50cyBpdCBub3cgb3IgaGVyZWFmdGVyCisgb3ducyBvciBjb250cm9scyB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgaW1wb3J0LCBvZmZlciB0byBzZWxsIGFuZAorIHNlbGwgKCJVdGlsaXplIikgdGhpcyBzb2Z0d2FyZSwgYnV0IHNvbGVseSB0byB0aGUgZXh0ZW50IHRoYXQgYW55Cisgc3VjaCBwYXRlbnQgaXMgbmVjZXNzYXJ5IHRvIFV0aWxpemUgdGhlIHNvZnR3YXJlIGFsb25lLCBvciBpbgorIGNvbWJpbmF0aW9uIHdpdGggYW4gb3BlcmF0aW5nIHN5c3RlbSBsaWNlbnNlZCB1bmRlciBhbiBhcHByb3ZlZCBPcGVuCisgU291cmNlIGxpY2Vuc2UgYXMgbGlzdGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGF0CisgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGlzIHNvZnR3YXJlLiAgTm8gaGFyZHdhcmUgcGVyCisgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCisgRElTQ0xBSU1FUi4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyBEQU1BR0UuCisqLworLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKy8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCisKKworVUNIQVIgRmlybXdhcmVJbWFnZSBbXSA9IHsKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MTAsIDB4MjgsIDB4MDIsIDB4MTAsIDB4MzIsIDB4MDIsIDB4MTAsIDB4NzgsIDB4MDIsIDB4MTIsIDB4NzksIDB4MDIsCisweDEyLCAweDdhLCAweDAyLCAweDEyLCAweDk5LCAweDAyLCAweDEyLCAweDllLCAweDEyLCAweDEyLCAweDlhLCAweDIyLCAweDAyLCAweDE2LCAweDM2LCAweDAyLAorMHgxNywgMHgwYywgMHgwMiwgMHgxMywgMHg4OSwgMHgwMiwgMHgxMiwgMHg5ZiwgMHgzMCwgMHgwNSwgMHgwNiwgMHgyMCwgMHgwZCwgMHgwMywgMHgxMiwgMHgxNywKKzB4YWUsIDB4MjIsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTMsIDB4MWIsIDB4ZTUsIDB4NGMsIDB4MzAsIDB4ZTAsIDB4MDQsIDB4N2YsIDB4NDAsCisweDgwLCAweDAyLCAweDdmLCAweDAwLCAweDkwLCAweDEwLCAweDJmLCAweGVmLCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweDc0LCAweDA4LCAweGYwLCAweGU0LAorMHg5MCwgMHgwMSwgMHhhNywgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMCwgMHgxYywgMHg5MCwgMHgwMSwgMHg4MCwgMHhlMCwgMHhiNCwKKzB4MDIsIDB4MTUsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDEsIDB4MTAsIDB4OTAsIDB4MDEsIDB4ODQsIDB4ZTAsIDB4YjQsIDB4ODEsIDB4MDksIDB4OTAsIDB4MDEsCisweDhjLCAweDc0LCAweDAxLCAweGYwLCAweDEyLCAweDBkLCAweGM4LCAweDIyLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDIwLCAweGU3LCAweDAzLCAweDAyLAorMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHg1NiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgxMiwgMHgwYSwgMHg5ZCwgMHgxMCwKKzB4YjcsIDB4MzEsIDB4MTAsIDB4ZTIsIDB4NTAsIDB4MTEsIDB4MDgsIDB4NTEsIDB4MTEsIDB4MTMsIDB4NTIsIDB4MTEsIDB4MTMsIDB4NTMsIDB4MTEsIDB4MTMsCisweDU0LCAweDExLCAweDU0LCAweDU1LCAweDExLCAweDc5LCAweDcwLCAweDExLCAweGE0LCAweDcxLCAweDExLCAweGQyLCAweDcyLCAweDEyLCAweDI1LCAweDczLAorMHgxMiwgMHg0NiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMiwgMHg2ZSwgMHgyMCwgMHgwMiwgMHgwMywgMHgzMCwgMHgwMywgMHgxZCwgMHg3ZCwgMHgwMiwgMHhhZiwKKzB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsCisweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweDZlLCAweDAyLCAweDEyLCAweDY3LCAweDg1LCAweDU2LCAweDQxLCAweGQyLCAweDAyLCAweDAyLAorMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHg2NCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwKKzB4NzAsIDB4MTEsIDB4ZTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDgsIDB4ZTAsIDB4NjQsIDB4MjAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4NmUsIDB4NzUsCisweDRlLCAweDAzLCAweDc1LCAweDRmLCAweDIwLCAweDAyLCAweDEyLCAweDZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDQ3LAorMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNSwgMHhlMCwgMHgyNCwgMHg1ZCwgMHhmNSwgMHg1NywgMHg5MCwgMHg3MCwgMHgxMCwKKzB4ZTAsIDB4ZmYsIDB4NzQsIDB4NDcsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmYsIDB4NzQsCisweDQ4LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LAorMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwKKzB4NmUsIDB4MDIsIDB4MTIsIDB4NjcsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MGIsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDUsCisweGU1LCAweDQ3LCAweGI0LCAweDA5LCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDU0LCAweDBmLCAweGY1LCAweDNhLCAweGU0LCAweGZkLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHhkMiwgMHgwNCwgMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwKKzB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjgsIDB4ZTYsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsCisweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLAorMHg2ZSwgMHgwMiwgMHgxMiwgMHg2NywgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmNSwKKzB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsCisweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweDZlLCAweDAyLAorMHgxMiwgMHg2NywgMHg5MCwgMHgxMCwgMHgwMiwgMHhlMCwgMHhiNCwgMHg3MCwgMHgxZSwgMHhhMywgMHhlMCwgMHhiNCwgMHgzMCwgMHgxOSwgMHg5MCwgMHgwNSwKKzB4MDgsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4ZmQsIDB4OTAsIDB4MDUsIDB4MDUsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4NDQsIDB4MDQsIDB4ZjAsCisweGVkLCAweDU0LCAweGZlLCAweDkwLCAweDA1LCAweDA4LCAweGYwLCAweGU0LCAweGY1LCAweDRlLCAweGY1LCAweDRmLCAweDc1LCAweDNhLCAweGZmLCAweGFkLAorMHg1NywgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywKKzB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NjAsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjUsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4NDAsCisweGU1LCAweDNhLCAweGYwLCAweDgwLCAweDQ5LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDkzLCAweGU0LCAweGZkLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwKKzB4NTYsIDB4ZjQsIDB4NjAsIDB4MmEsIDB4ODAsIDB4MjEsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NGEsIDB4ZDIsIDB4MDUsCisweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLAorMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNSwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHg5MCwgMHg3MCwKKzB4NDIsIDB4ZTUsIDB4M2EsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4YWIsIDB4ZjAsIDB4MjIsIDB4MjIsIDB4ZTUsIDB4NTMsIDB4NzAsIDB4MWEsIDB4MzAsIDB4NjAsCisweDA5LCAweGIyLCAweDRkLCAweDMwLCAweDRkLCAweDA0LCAweDA1LCAweDQ2LCAweGMyLCAweDA0LCAweGU1LCAweDRmLCAweDQ1LCAweDRlLCAweDYwLCAweDA4LAorMHhlNSwgMHg0ZiwgMHgxNSwgMHg0ZiwgMHg3MCwgMHgwMiwgMHgxNSwgMHg0ZSwgMHgyMiwgMHgyMiwgMHhjMiwgMHg0MiwgMHhkMywgMHgyMiwgMHgyMiwgMHhjMiwKKzB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MGEsIDB4OWQsIDB4MTIsIDB4YzEsIDB4MDAsIDB4MTMsIDB4NTQsIDB4MDQsIDB4MTMsIDB4NTAsCisweDA4LCAweDEzLCAweDJiLCAweDEwLCAweDEyLCAweGQ1LCAweDIwLCAweDEyLCAweGY1LCAweDYwLCAweDEzLCAweDA2LCAweGEwLCAweDAwLCAweDAwLCAweDEzLAorMHg1NiwgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwgMHg4NSwgMHg0YywgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg2MCwgMHgwMywKKzB4MDIsIDB4MTMsIDB4NTYsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGEsIDB4YzQsIDB4NTQsCisweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDY2LAorMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg2MSwgMHg4NSwgMHg0OSwgMHg0MywgMHg4NSwgMHg0YiwgMHg0MiwgMHg4NSwgMHg0ZCwgMHg1ZSwgMHhlNSwgMHg0NywKKzB4NjQsIDB4MDYsIDB4NzAsIDB4NTIsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDksIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGIsIDB4YzQsCisweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLAorMHgzNSwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgyYiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNCwgMHgwNiwKKzB4NTMsIDB4NWUsIDB4ZmIsIDB4NzUsIDB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsIDB4NWUsIDB4MDQsIDB4NzUsIDB4NDIsCisweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLCAweGY1LCAweDQzLCAweDgwLCAweDA2LAorMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgyNSwgMHhlNSwgMHg0MiwgMHhjNCwgMHg1NCwgMHhmMCwgMHhmZiwgMHhlNSwKKzB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4OTAsIDB4NzAsIDB4NDQsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NWUsIDB4ZjAsIDB4YTMsIDB4ZTUsCisweDRhLCAweGYwLCAweGEzLCAweGU1LCAweDQ4LCAweGYwLCAweGEzLCAweGU1LCAweDRjLCAweGYwLCAweGEzLCAweGU1LCAweDQ0LCAweGYwLCAweGEzLCAweGU1LAorMHg0MiwgMHhmMCwgMHhhMywgMHhlNSwgMHg0MywgMHhmMCwgMHhkMiwgMHg2MCwgMHgyMiwgMHhlNSwgMHg0NywgMHg2MCwgMHgxMCwgMHgyNCwgMHhjMCwgMHg3MCwKKzB4MDMsIDB4MTIsIDB4MTYsIDB4MTYsIDB4MTIsIDB4MTMsIDB4OWUsIDB4YzIsIDB4YWYsIDB4YzIsIDB4MDQsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsIDB4YWYsCisweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDU0LCAweDBlLCAweDYwLCAweDA0LCAweGQyLCAweDE4LCAweDgwLCAweDA4LCAweGU1LCAweDRlLCAweDQ1LCAweDRmLAorMHgyNCwgMHhmZiwgMHg5MiwgMHgxOCwgMHhkMiwgMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHhhMiwgMHhlNCwgMHg5MiwgMHgxOSwgMHg3NCwgMHgxZSwKKzB4ZjAsIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4MmQsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MTMsIDB4MzAsIDB4MTgsIDB4MDUsIDB4ZTUsIDB4NWYsCisweDIwLCAweGU1LCAweDBiLCAweDMwLCAweDE5LCAweDE5LCAweGU1LCAweDVmLCAweDU0LCAweDMwLCAweGZmLCAweGJmLCAweDMwLCAweDExLCAweGU1LCAweDI1LAorMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwYywgMHg4MCwgMHgwMiwgMHgxNSwgMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwZiwgMHhlNSwKKzB4NWYsIDB4MzAsIDB4ZTYsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDQsIDB4ZDIsIDB4NmMsIDB4YzIsIDB4NmQsIDB4ZTUsIDB4NDcsCisweDY0LCAweDAzLCAweDcwLCAweDIxLCAweDMwLCAweDRiLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDE4LCAweGU1LCAweDI1LCAweDcwLAorMHgwMywgMHgzMCwgMHg0YywgMHgxMSwgMHhjMiwgMHg0YywgMHhlNSwgMHgyNSwgMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwNywgMHg4MCwgMHgwMiwgMHgxNSwKKzB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDksIDB4MTQsIDB4ZTUsIDB4NDQsIDB4MjAsIDB4ZTMsIDB4MGIsIDB4ZTUsCisweDNhLCAweDY0LCAweDAyLCAweDYwLCAweDA1LCAweGU1LCAweDNhLCAweGI0LCAweDAzLCAweDA0LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDkwLCAweDcwLAorMHg0NiwgMHhlNSwgMHgyZCwgMHhmMCwgMHgyMCwgMHg2OSwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwgMHg2OCwgMHgyMCwgMHg2YiwKKzB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDIsIDB4YjIsIDB4NmEsIDB4MjAsIDB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTIsIDB4MDIsCisweGIyLCAweDZjLCAweDkwLCAweDcwLCAweDQ3LCAweGU1LCAweDJkLCAweGYwLCAweDc1LCAweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LAorMHg4MCwgMHgyNiwgMHgzMCwgMHg2OCwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwNCwKKzB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsCisweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDczLCAweDkyLCAweDcyLCAweDIwLCAweDZiLCAweDA0LCAweGEyLAorMHg2YSwgMHg4MCwgMHgyNiwgMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwKKzB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsCisweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDc1LCAweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LAorMHhhMiwgMHg2YywgMHg4MCwgMHgyNiwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwKKzB4ZTEsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsCisweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDcxLCAweDkyLCAweDcwLCAweDkwLCAweDEwLAorMHgyZiwgMHhlNSwgMHgyZSwgMHhmMCwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg0YywgMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHg1NCwgMHhmZSwKKzB4ZjAsIDB4ZTUsIDB4NDMsIDB4YzQsIDB4NTQsIDB4MGYsIDB4MTQsIDB4NjAsIDB4MTQsIDB4MjQsIDB4ZmUsIDB4NjAsIDB4MjMsIDB4MjQsIDB4MDMsIDB4NjAsCisweDAzLCAweDAyLCAweDE2LCAweDA1LCAweDkwLCAweDAyLCAweDI4LCAweGUwLCAweDMwLCAweDQ3LCAweDBmLCAweDgwLCAweDA3LCAweDkwLCAweDAyLCAweDI4LAorMHhlMCwgMHgyMCwgMHg0NywgMHgwNiwgMHg1NCwgMHhmZSwgMHhmMCwgMHgwMiwgMHgxNiwgMHgwNSwgMHg0NCwgMHgwMSwgMHhmMCwgMHgwMiwgMHgxNiwgMHgwNSwKKzB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsCisweGZlLCAweDRmLCAweGYwLCAweDAyLCAweDE2LCAweDA1LCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDBmLCAweGU1LCAweDQ3LCAweDY0LCAweDA4LAorMHg2MCwgMHgwOSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOSwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgwNSwgMHhlNCwgMHhmNSwgMHgyNywgMHg5MCwgMHgwMiwKKzB4MjksIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MmQsIDB4MTQsIDB4NjAsIDB4MmUsIDB4MTQsIDB4NjAsIDB4MzYsCisweDI0LCAweGZjLCAweDYwLCAweDVmLCAweDI0LCAweGY5LCAweDYwLCAweDFmLCAweDI0LCAweDBlLCAweDcwLCAweDY5LCAweGU1LCAweDQ2LCAweDEzLCAweDEzLAorMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMSwgMHg4NCwgMHhhZiwgMHhmMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwKKzB4MDAsIDB4ZWYsIDB4NmUsIDB4MjQsIDB4ZmYsIDB4ODAsIDB4NDUsIDB4YTIsIDB4NDcsIDB4ODAsIDB4NDEsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsCisweGQzLCAweDgwLCAweDI3LCAweGMzLCAweDgwLCAweDI0LCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDBkLCAweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLAorMHg1MCwgMHgwNiwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg3ZCwKKzB4MDEsIDB4ODAsIDB4MDIsIDB4N2QsIDB4MDAsIDB4ZWYsIDB4NmQsIDB4NGUsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MzgsIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsCisweDM5LCAweDgwLCAweDE5LCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDM5LCAweGEyLCAweDQ3LAorMHhiMywgMHg5MiwgMHgzOCwgMHg4MCwgMHgwNywgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg5MiwgMHgzOSwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwKKzB4NTQsIDB4ZmMsIDB4NDUsIDB4MjcsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4OWMsIDB4ZTUsIDB4M2EsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDcsIDB4ZjAsIDB4OTAsCisweDcwLCAweDQxLCAweGU1LCAweDNhLCAweGYwLCAweDIyLCAweGU0LCAweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDQ1LAorMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwgMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg4ZiwgMHg1MCwgMHhkMiwgMHg1OSwKKzB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsIDB4NTgsIDB4MjIsIDB4ZTQsIDB4ZjUsIDB4NjIsIDB4YzIsIDB4YWYsIDB4ZTUsIDB4NTEsIDB4MTQsIDB4NjAsIDB4NDYsCisweDE0LCAweDYwLCAweDYyLCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweGYwLCAweGQyLCAweDU5LCAweDc1LCAweDU1LCAweDAxLCAweDkwLAorMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwgMHg3ZiwgMHhmMCwgMHhhMywgMHhlMCwgMHgyMCwgMHhlNywgMHgyMiwgMHg5MCwgMHgwNCwgMHgzNCwgMHhlMCwgMHhiNCwKKzB4MDIsIDB4MWIsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTYsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTEsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTYsCisweDJjLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGYzLCAweGYwLCAweDc1LCAweDUxLCAweDAxLCAweDgwLCAweDczLCAweGU1LCAweDUwLCAweDcwLAorMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHg4MCwgMHg2YSwgMHg5MCwgMHgxMiwgMHgwMCwgMHhlMCwgMHg1NCwgMHgwMywgMHg3MCwgMHgxMSwgMHg3ZiwgMHgyMCwKKzB4MTIsIDB4MTYsIDB4MmMsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NTQsIDB4YmYsIDB4ZjAsIDB4NzUsIDB4NTEsIDB4MDIsIDB4ODAsIDB4NTEsIDB4ZTUsCisweDUwLCAweDcwLCAweDAyLCAweDgwLCAweDQ2LCAweDkwLCAweDAyLCAweGEzLCAweGUwLCAweDIwLCAweGU2LCAweDNiLCAweDkwLCAweDA0LCAweDM3LCAweGUwLAorMHg2NCwgMHgyMiwgMHg3MCwgMHgzMywgMHg5MCwgMHgwMSwgMHg4YSwgMHg3NCwgMHg3ZSwgMHhmMCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHg5MCwgMHgxMiwKKzB4MDQsIDB4NzQsIDB4MGEsIDB4ZjAsIDB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsCisweGEzLCAweGUwLCAweDU0LCAweGZhLCAweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDU0LCAweGY5LCAweGYwLCAweDc1LCAweDYyLCAweDAxLCAweDc1LAorMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwgMHg1MSwgMHg4MCwgMHgwOSwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHhmNSwgMHg1MSwKKzB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsIDB4YzIsIDB4MDEsIDB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YWQsIDB4NjIsIDB4YWYsIDB4NDAsIDB4MTIsCisweDE3LCAweDdhLCAweGU1LCAweDYyLCAweGI0LCAweDAzLCAweDAyLCAweGQyLCAweDAzLCAweGQyLCAweGFmLCAweDIyLCAweGMyLCAweGFmLCAweDMwLCAweDAxLAorMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwgMHhjMiwgMHgwMSwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg0MCwKKzB4MTIsIDB4MTcsIDB4N2EsIDB4ZTUsIDB4NTIsIDB4MTQsIDB4NjAsIDB4MDksIDB4MDQsIDB4NzAsIDB4NGMsIDB4NzUsIDB4NTIsIDB4MDEsIDB4NzUsIDB4NTUsCisweDAzLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDQ0LCAweDBlLCAweGYwLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLAorMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHg3NCwgMHgwMywgMHhmMCwgMHg5MCwKKzB4MDIsIDB4YTIsIDB4ZTAsIDB4NDQsIDB4YzAsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MGMsIDB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NTIsCisweGY1LCAweDU1LCAweDMwLCAweDAyLCAweDBiLCAweGMyLCAweDAyLCAweDdkLCAweDAxLCAweGFmLCAweDQxLCAweDEyLCAweDE3LCAweDdhLCAweDgwLCAweDAyLAorMHhjMiwgMHgwMywgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwKKzB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsCisweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVmLCAweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZCwgMHhmMCwgMHgyMiwgMHgwZSwgMHhiZSwgMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHg5MCwgMHg3MCwKKzB4MmEsIDB4ZTAsIDB4MzAsIDB4ZTEsIDB4NGQsIDB4YzIsIDB4YWYsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsCisweDcwLCAweDI5LCAweGUwLCAweDkwLCAweDEwLCAweDFkLCAweGYwLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLAorMHgxMCwgMHgxYywgMHhlMCwgMHhmNSwgMHg2MiwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwgMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwKKzB4OTAsIDB4NzAsIDB4MjgsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWQsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsCisweDkwLCAweDcwLCAweDJhLCAweGYwLCAweDMwLCAweDRhLCAweDA3LCAweDkwLCAweDcwLCAweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGMyLCAweDA1LAorMHhkMiwgMHhhZiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4NjksIDB4NzcsCisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDEwLCAweDI4LCAweDAyLCAweDEwLCAweDMyLCAweDAyLCAweDEwLCAweDc4LCAweDAyLCAweDEyLCAweDI1LCAweDAyLAorMHgxMiwgMHgyNiwgMHgwMiwgMHgxMiwgMHgzOSwgMHgwMiwgMHgxMiwgMHgzZSwgMHgxMiwgMHgxMiwgMHgzYSwgMHgyMiwgMHgwMiwgMHgxNSwgMHg3MiwgMHgwMiwKKzB4MTYsIDB4NDgsIDB4MDIsIDB4MTMsIDB4MjksIDB4MDIsIDB4MTIsIDB4M2YsIDB4MzAsIDB4MDUsIDB4MDYsIDB4MjAsIDB4MGQsIDB4MDMsIDB4MTIsIDB4MTYsCisweGVhLCAweDIyLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUzLCAweDFiLCAweGU1LCAweDRjLCAweDMwLCAweGUwLCAweDA0LCAweDdmLCAweDQwLAorMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlZiwgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHg3NCwgMHgwOCwgMHhmMCwgMHhlNCwKKzB4OTAsIDB4MDEsIDB4YTcsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTAsIDB4MWMsIDB4OTAsIDB4MDEsIDB4ODAsIDB4ZTAsIDB4YjQsCisweDAyLCAweDE1LCAweGEzLCAweGUwLCAweGI0LCAweDAxLCAweDEwLCAweDkwLCAweDAxLCAweDg0LCAweGUwLCAweGI0LCAweDgxLCAweDA5LCAweDkwLCAweDAxLAorMHg4YywgMHg3NCwgMHgwMSwgMHhmMCwgMHgxMiwgMHgwZCwgMHhkZCwgMHgyMiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHgyMCwgMHhlNywgMHgwMywgMHgwMiwKKzB4MTIsIDB4MWEsIDB4OTAsIDB4NzAsIDB4MTIsIDB4ZTAsIDB4ZjUsIDB4NTYsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MTIsIDB4MGEsIDB4YjYsIDB4MTAsCisweGI0LCAweDMxLCAweDEwLCAweGRmLCAweDUwLCAweDExLCAweDA1LCAweDUxLCAweDExLCAweDEwLCAweDUyLCAweDExLCAweDEwLCAweDUzLCAweDExLCAweDEwLAorMHg1NCwgMHgxMSwgMHg1MSwgMHg1NSwgMHgxMSwgMHg3MCwgMHg3MCwgMHgxMSwgMHg5YSwgMHg3MSwgMHgxMSwgMHhjNCwgMHg3MiwgMHgxMSwgMHhmMiwgMHg4MCwKKzB4MDAsIDB4MDAsIDB4MTIsIDB4MWEsIDB4MjAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MWQsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsCisweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLAorMHgwMywgMHgwMiwgMHgxMiwgMHgxYSwgMHgwMiwgMHgxMiwgMHgxMywgMHg4NSwgMHg1NiwgMHg0MSwgMHhkMiwgMHgwMiwgMHgwMiwgMHgxMiwgMHgxYSwgMHg5MCwKKzB4NzAsIDB4MTAsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4NjQsIDB4MDIsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4MWEsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweDY0LCAweDA4LCAweDYwLCAweDA4LCAweGUwLCAweDY0LCAweDIwLCAweDYwLCAweDAzLCAweDAyLCAweDEyLCAweDFhLCAweDc1LCAweDRlLCAweDAzLCAweDc1LAorMHg0ZiwgMHgyMCwgMHgwMiwgMHgxMiwgMHgxYSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg0NywgMHgwMiwgMHgxMiwgMHgxYSwKKzB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MjUsIDB4ZTAsIDB4MjQsIDB4NWQsIDB4ZjUsIDB4NTcsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmYsIDB4NzQsCisweDQ3LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZmLCAweDc0LCAweDQ4LCAweDI1LCAweDU3LAorMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwKKzB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4MWEsIDB4MDIsIDB4MTIsCisweDEzLCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDA1LCAweGU1LCAweDQ3LCAweGI0LCAweDA4LCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLAorMHg1NCwgMHgwNywgMHhmNSwgMHgzYSwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHhkMiwgMHgwNCwgMHgwMiwgMHgxMiwgMHgxYSwKKzB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjgsIDB4ZTYsIDB4ZjUsIDB4NTcsIDB4ZmQsCisweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLAorMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwgMHgxYSwgMHg4MCwgMHg3OSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwKKzB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjUsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsCisweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LAorMHg2MCwgMHg1OCwgMHg4MCwgMHg0ZiwgMHhlNCwgMHhmNSwgMHg0ZSwgMHhmNSwgMHg0ZiwgMHg3NSwgMHgzYSwgMHhmZiwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwKKzB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDYwLCAweDA3LCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDcwLCAweDQwLCAweGU1LCAweDNhLCAweGYwLAorMHg4MCwgMHgyOCwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg0YSwgMHhkMiwgMHgwNSwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwKKzB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDYwLCAweDA3LCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDcwLCAweDQyLCAweGU1LCAweDNhLCAweGYwLAorMHhhMywgMHg3NCwgMHhhYiwgMHhmMCwgMHgyMiwgMHgyMiwgMHhlNSwgMHg1MywgMHg3MCwgMHgwZSwgMHhlNSwgMHg0ZiwgMHg0NSwgMHg0ZSwgMHg2MCwgMHgwOCwKKzB4ZTUsIDB4NGYsIDB4MTUsIDB4NGYsIDB4NzAsIDB4MDIsIDB4MTUsIDB4NGUsIDB4MjIsIDB4MjIsIDB4YzIsIDB4NDIsIDB4ZDMsIDB4MjIsIDB4MjIsIDB4YzIsCisweDRiLCAweGMyLCAweDRjLCAweGU1LCAweDQ0LCAweDEyLCAweDBhLCAweGI2LCAweDEyLCAweDYxLCAweDAwLCAweDEyLCAweGY0LCAweDA0LCAweDEyLCAweGYwLAorMHgwOCwgMHgxMiwgMHhjYiwgMHgxMCwgMHgxMiwgMHg3NSwgMHgyMCwgMHgxMiwgMHg5NSwgMHg2MCwgMHgxMiwgMHhhNiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgxMiwKKzB4ZjYsIDB4ODUsIDB4NDgsIDB4NDMsIDB4ODUsIDB4NGEsIDB4NDIsIDB4ODUsIDB4NGMsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NjAsIDB4MDMsCisweDAyLCAweDEyLCAweGY2LCAweDgwLCAweDFiLCAweGU1LCAweDQ4LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRhLCAweGM0LCAweDU0LAorMHgwZiwgMHhmNSwgMHg0MiwgMHhlNSwgMHg0YywgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg2NiwKKzB4NTMsIDB4NDMsIDB4MGYsIDB4ODAsIDB4NjEsIDB4ODUsIDB4NDksIDB4NDMsIDB4ODUsIDB4NGIsIDB4NDIsIDB4ODUsIDB4NGQsIDB4NWUsIDB4ZTUsIDB4NDcsCisweDY0LCAweDA2LCAweDcwLCAweDUyLCAweDgwLCAweDFiLCAweGU1LCAweDQ5LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRiLCAweGM0LAorMHg1NCwgMHgwZiwgMHhmNSwgMHg0MiwgMHhlNSwgMHg0ZCwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwKKzB4MzUsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MTAsIDB4ZjUsIDB4NDMsIDB4ODAsIDB4MmIsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDQsIDB4MDYsCisweDUzLCAweDVlLCAweGZiLCAweDc1LCAweDQyLCAweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA1LCAweDA2LCAweDQzLCAweDVlLCAweDA0LCAweDc1LCAweDQyLAorMHgwOSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNiwgMHgxMCwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgzMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgwNiwKKzB4ZDIsIDB4NGIsIDB4ODAsIDB4MDIsIDB4ZDIsIDB4NGMsIDB4ZTQsIDB4ZjUsIDB4MjUsIDB4ZTUsIDB4NDIsIDB4YzQsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4ZTUsCisweDQzLCAweDU0LCAweDBmLCAweDRmLCAweGY1LCAweDVmLCAweDkwLCAweDcwLCAweDQ0LCAweGYwLCAweGEzLCAweGU1LCAweDVlLCAweGYwLCAweGEzLCAweGU1LAorMHg0YSwgMHhmMCwgMHhhMywgMHhlNSwgMHg0OCwgMHhmMCwgMHhhMywgMHhlNSwgMHg0YywgMHhmMCwgMHhhMywgMHhlNSwgMHg0NCwgMHhmMCwgMHhhMywgMHhlNSwKKzB4NDIsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDMsIDB4ZjAsIDB4ZDIsIDB4NjAsIDB4MjIsIDB4ZTUsIDB4NDcsIDB4NjAsIDB4MTAsIDB4MjQsIDB4YzAsIDB4NzAsCisweDAzLCAweDEyLCAweDE1LCAweDUyLCAweDEyLCAweDEzLCAweDNlLCAweGMyLCAweGFmLCAweGMyLCAweDA0LCAweGQyLCAweGFmLCAweDIyLCAweGMyLCAweGFmLAorMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHg1NCwgMHgwZSwgMHg2MCwgMHgwNCwgMHhkMiwgMHgxOCwgMHg4MCwgMHgwOCwgMHhlNSwgMHg0ZSwgMHg0NSwgMHg0ZiwKKzB4MjQsIDB4ZmYsIDB4OTIsIDB4MTgsIDB4ZDIsIDB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4YTIsIDB4ZTQsIDB4OTIsIDB4MTksIDB4NzQsIDB4MWUsCisweGYwLCAweGU1LCAweDVmLCAweDU0LCAweDBmLCAweGY1LCAweDJkLCAweGU1LCAweDI1LCAweDcwLCAweDEzLCAweDMwLCAweDE4LCAweDA1LCAweGU1LCAweDVmLAorMHgyMCwgMHhlNSwgMHgwYiwgMHgzMCwgMHgxOSwgMHgxOSwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgzMCwgMHhmZiwgMHhiZiwgMHgzMCwgMHgxMSwgMHhlNSwgMHgyNSwKKzB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MGMsIDB4ODAsIDB4MDIsIDB4MTUsIDB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MGYsIDB4ZTUsCisweDVmLCAweDMwLCAweGU2LCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDA0LCAweGQyLCAweDZjLCAweGMyLCAweDZkLCAweGU1LCAweDQ3LAorMHg2NCwgMHgwMywgMHg3MCwgMHgyMSwgMHgzMCwgMHg0YiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgxOCwgMHhlNSwgMHgyNSwgMHg3MCwKKzB4MDMsIDB4MzAsIDB4NGMsIDB4MTEsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MDcsIDB4ODAsIDB4MDIsIDB4MTUsCisweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDkwLCAweDcwLCAweDQ2LCAweGU1LCAweDJkLCAweGYwLCAweDIwLCAweDY5LCAweDA3LCAweGU1LCAweDVlLAorMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwgMHg2OCwgMHgyMCwgMHg2YiwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwMiwgMHhiMiwgMHg2YSwgMHgyMCwKKzB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTIsIDB4MDIsIDB4YjIsIDB4NmMsIDB4OTAsIDB4NzAsIDB4NDcsIDB4ZTUsIDB4MmQsIDB4ZjAsIDB4NzUsCisweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LCAweDgwLCAweDE1LCAweDMwLCAweDY4LCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUzLAorMHg4MCwgMHgwYywgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZiwgMHhiZiwgMHhmMCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHg3MywKKzB4OTIsIDB4NzIsIDB4MjAsIDB4NmIsIDB4MDQsIDB4YTIsIDB4NmEsIDB4ODAsIDB4MTUsIDB4MzAsIDB4NmEsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTMsCisweDgwLCAweDBjLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZmLCAweGJmLCAweGYwLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDc1LAorMHg5MiwgMHg3NCwgMHgyMCwgMHg2ZCwgMHgwNCwgMHhhMiwgMHg2YywgMHg4MCwgMHgxNSwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywKKzB4ODAsIDB4MGMsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4YmYsIDB4ZjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4NzEsCisweDkyLCAweDcwLCAweDkwLCAweDEwLCAweDJmLCAweGU1LCAweDJlLCAweGYwLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDRjLCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhmZSwgMHhmMCwgMHhlNSwgMHg0MywgMHhjNCwgMHg1NCwgMHgwZiwgMHgxNCwgMHg2MCwgMHgxNCwgMHgyNCwgMHhmZSwgMHg2MCwKKzB4MjMsIDB4MjQsIDB4MDMsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTUsIDB4NDEsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4MzAsIDB4NDcsIDB4MGYsIDB4ODAsCisweDA3LCAweDkwLCAweDAyLCAweDI4LCAweGUwLCAweDIwLCAweDQ3LCAweDA2LCAweDU0LCAweGZlLCAweGYwLCAweDAyLCAweDE1LCAweDQxLCAweDQ0LCAweDAxLAorMHhmMCwgMHgwMiwgMHgxNSwgMHg0MSwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMywgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwKKzB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4NGYsIDB4ZjAsIDB4MDIsIDB4MTUsIDB4NDEsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MDksCisweGU1LCAweDQ3LCAweDY0LCAweDA4LCAweDYwLCAweDAzLCAweDAyLCAweDE1LCAweDQxLCAweGU0LCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLAorMHg1NCwgMHhmYywgMHhmMCwgMHhlNSwgMHgzYSwgMHgxNCwgMHg2MCwgMHgyNiwgMHgxNCwgMHg2MCwgMHgyZSwgMHgxNCwgMHg2MCwgMHgzNiwgMHgyNCwgMHgwMywKKzB4NzAsIDB4NWYsIDB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsIDB4MTMsIDB4NTQsIDB4MWYsIDB4NzUsIDB4ZjAsIDB4MDMsIDB4ODQsIDB4YWYsIDB4ZjAsIDB4MjAsCisweDQ3LCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVmLCAweDZlLCAweDI0LCAweGZmLCAweDgwLCAweDAyLCAweGEyLCAweDQ3LAorMHg5MiwgMHgzOSwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg4MCwgMHgzZiwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMywgMHgwMywgMHhkMywgMHg4MCwKKzB4MjcsIDB4YzMsIDB4ODAsIDB4MjQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTMsIDB4MGQsIDB4NTQsIDB4NzAsIDB4YzMsIDB4OTQsIDB4NjAsIDB4NTAsIDB4MDYsCisweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLCAweDAwLCAweDIwLCAweDQ3LCAweDA0LCAweDdkLCAweDAxLCAweDgwLAorMHgwMiwgMHg3ZCwgMHgwMCwgMHhlZiwgMHg2ZCwgMHg0ZSwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOSwgMHg4MCwKKzB4MDcsIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsIDB4MzgsIDB4OTIsIDB4MzksIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4NDUsIDB4MjcsCisweGYwLCAweDkwLCAweDcwLCAweDljLCAweGU1LCAweDNhLCAweGYwLCAweGEzLCAweGU1LCAweDQ3LCAweGYwLCAweDkwLCAweDcwLCAweDQxLCAweGU1LCAweDNhLAorMHhmMCwgMHgyMiwgMHhlNCwgMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHg0NSwgMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwKKzB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OGYsIDB4NTAsIDB4ZDIsIDB4NTksIDB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsCisweDU4LCAweDIyLCAweGU0LCAweGY1LCAweDYyLCAweGMyLCAweGFmLCAweGU1LCAweDUxLCAweDE0LCAweDYwLCAweDQ2LCAweDE0LCAweDYwLCAweDYyLCAweDI0LAorMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgyYywgMHhkMiwgMHg1OSwgMHg3NSwgMHg1NSwgMHgwMSwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwKKzB4N2YsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4MjAsIDB4ZTcsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MzQsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MWIsIDB4YTMsIDB4ZTAsCisweGI0LCAweDAyLCAweDE2LCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDExLCAweDdmLCAweDIwLCAweDEyLCAweDE1LCAweDY4LCAweDkwLCAweDEwLCAweDA0LAorMHhlMCwgMHg1NCwgMHhmMywgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMSwgMHg4MCwgMHg3MywgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywKKzB4ODAsIDB4NmEsIDB4OTAsIDB4MTIsIDB4MDAsIDB4ZTAsIDB4NTQsIDB4MDMsIDB4NzAsIDB4MTEsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTUsIDB4NjgsIDB4OTAsCisweDAyLCAweGEyLCAweGUwLCAweDU0LCAweGJmLCAweGYwLCAweDc1LCAweDUxLCAweDAyLCAweDgwLCAweDUxLCAweGU1LCAweDUwLCAweDcwLCAweDAyLCAweDgwLAorMHg0NiwgMHg5MCwgMHgwMiwgMHhhMywgMHhlMCwgMHgyMCwgMHhlNiwgMHgzYiwgMHg5MCwgMHgwNCwgMHgzNywgMHhlMCwgMHg2NCwgMHgyMiwgMHg3MCwgMHgzMywKKzB4OTAsIDB4MDEsIDB4OGEsIDB4NzQsIDB4N2UsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OTYsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4NzQsIDB4MGEsIDB4ZjAsCisweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGZhLAorMHhmMCwgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwgMHg1NCwgMHhmOSwgMHhmMCwgMHg3NSwgMHg2MiwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwKKzB4NTEsIDB4ODAsIDB4MDksIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDUsIDB4NzUsIDB4NjIsIDB4MDMsIDB4ZjUsIDB4NTEsIDB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsCisweGMyLCAweDAxLCAweGU0LCAweGY1LCAweDUxLCAweGMyLCAweDU5LCAweGFkLCAweDYyLCAweGFmLCAweDQwLCAweDEyLCAweDE2LCAweGI2LCAweGU1LCAweDYyLAorMHhiNCwgMHgwMywgMHgwMiwgMHhkMiwgMHgwMywgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwgMHgzMCwgMHgwMSwgMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwKKzB4OTYsIDB4ZjAsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YzIsIDB4MDEsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTYsIDB4YjYsIDB4ZTUsCisweDUyLCAweDE0LCAweDYwLCAweDA5LCAweDA0LCAweDcwLCAweDRjLCAweDc1LCAweDUyLCAweDAxLCAweDc1LCAweDU1LCAweDAzLCAweDkwLCAweDA0LCAweDAxLAorMHhlMCwgMHg0NCwgMHgwZSwgMHhmMCwgMHg5MCwgMHgxMywgMHgyOCwgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwKKzB4YTMsIDB4ZTAsIDB4NDQsIDB4MDUsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NDQsCisweGMwLCAweGYwLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDQ0LCAweDBjLCAweGYwLCAweGU0LCAweGY1LCAweDUyLCAweGY1LCAweDU1LCAweDMwLCAweDAyLAorMHgwYiwgMHhjMiwgMHgwMiwgMHg3ZCwgMHgwMSwgMHhhZiwgMHg0MSwgMHgxMiwgMHgxNiwgMHhiNiwgMHg4MCwgMHgwMiwgMHhjMiwgMHgwMywgMHhlNCwgMHg5MCwKKzB4MDEsIDB4OTYsIDB4ZjAsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4ZWYsIDB4ZjQsIDB4NjAsIDB4MmQsIDB4ZTQsIDB4ZmUsIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsCisweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGUwLCAweGI0LCAweGZmLCAweDE5LCAweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZiwgMHhmMCwgMHg3NCwgMHgxYywgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywKKzB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsIDB4MDQsIDB4ZDUsIDB4MjIsIDB4MjIsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZTAsIDB4MzAsIDB4ZTEsCisweDRkLCAweGMyLCAweGFmLCAweDkwLCAweDcwLCAweDI4LCAweGUwLCAweDkwLCAweDEwLCAweDFjLCAweGYwLCAweDkwLCAweDcwLCAweDI5LCAweGUwLCAweDkwLAorMHgxMCwgMHgxZCwgMHhmMCwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHhmNSwKKzB4NjIsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4MjAsIDB4ZTEsIDB4ZjMsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZjAsCisweDkwLCAweDEwLCAweDFkLCAweGUwLCAweDkwLCAweDcwLCAweDI5LCAweGYwLCAweDkwLCAweDEwLCAweDFlLCAweGUwLCAweDkwLCAweDcwLCAweDJhLCAweGYwLAorMHgzMCwgMHg0YSwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNCwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHhjMiwgMHgwNSwgMHhkMiwgMHhhZiwgMHgyMiwgMHgyMiwKKzB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGU5LCAweDAwLCB9IDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0Nzc2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL21kNS5jCkBAIC0wLDAgKzEsMTQyNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBtZDUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCisJUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCisJUml0YQkJMTAtMTQtMDUJCU1vZGlmeSBTSEEtMSBpbiBiaWctZW5kaWFuIHBsYXRmb3JtCisgKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoqCisgKiBtZDVfbWFjOgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBtZDVfbWFjKCkgZGV0ZXJtaW5lcwl0aGUJbWVzc2FnZQlhdXRoZW50aWNhdGlvbiBjb2RlCWJ5IHVzaW5nIHNlY3VyZQloYXNoCisgKiBNRDUoa2V5IHwgZGF0YSB8CWtleSkuCisgKi8KK3ZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisKKwlNRDVJbml0KCZjb250ZXh0KTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrZXksIGtleV9sZW4pOworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOworfQorCisvKioKKyAqIGhtYWNfbWQ1OgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBobWFjX21kNSgpIGRldGVybWluZXMgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24JY29kZSB1c2luZyBITUFDLU1ENS4KKyAqIFRoaXMJaW1wbGVtZW50YXRpb24gaXMgYmFzZWQJb24gdGhlIHNhbXBsZSBjb2RlIHByZXNlbnRlZCBpbglSRkMJMjEwNC4KKyAqLwordm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisgICAgdTgga19pcGFkWzY1XTsgLyogaW5uZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZCAqLworICAgIHU4IGtfb3BhZFs2NV07IC8qIG91dGVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIG9wYWQgKi8KKyAgICB1OCB0a1sxNl07CisJaW50CWk7CisKKwkvL2Fzc2VydChrZXkgIT0gTlVMTCAmJiBkYXRhICE9IE5VTEwgJiYgbWFjICE9IE5VTEwpOworCisJLyogaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleSA9CU1ENShrZXkpICovCisJaWYgKGtleV9sZW4JPiA2NCkgeworCQlNRDVfQ1RYCXR0Y29udGV4dDsKKworCQlNRDVJbml0KCZ0dGNvbnRleHQpOworCQlNRDVVcGRhdGUoJnR0Y29udGV4dCwga2V5LCBrZXlfbGVuKTsKKwkJTUQ1RmluYWwodGssICZ0dGNvbnRleHQpOworCQkvL2tleT0oUFVDSEFSKXR0Y29udGV4dC5idWY7CisJCWtleQk9IHRrOworCQlrZXlfbGVuCT0gMTY7CisJfQorCisJLyogdGhlIEhNQUNfTUQ1CXRyYW5zZm9ybSBsb29rcwlsaWtlOgorCSAqCisJICogTUQ1KEsgWE9SIG9wYWQsIE1ENShLIFhPUiBpcGFkLCB0ZXh0KSkKKwkgKgorCSAqIHdoZXJlIEsgaXMgYW4gbiBieXRlCWtleQorCSAqIGlwYWQJaXMgdGhlIGJ5dGUJMHgzNiByZXBlYXRlZCA2NCB0aW1lcworCSAqIG9wYWQJaXMgdGhlIGJ5dGUJMHg1YyByZXBlYXRlZCA2NCB0aW1lcworCSAqIGFuZCB0ZXh0CWlzIHRoZSBkYXRhCWJlaW5nIHByb3RlY3RlZAkqLworCisJLyogc3RhcnQgb3V0IGJ5CXN0b3JpbmcJa2V5CWluIHBhZHMJKi8KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsCXNpemVvZihrX29wYWQpKTsKKwkvL2Fzc2VydChrZXlfbGVuIDwgc2l6ZW9mKGtfaXBhZCkpOworCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKKwlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7CisKKwkvKiBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMgKi8KKwlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykgeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLyogcGVyZm9ybSBpbm5lciBNRDUgKi8KKwlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDFzdCBwYXNzICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrX2lwYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggaW5uZXIgcGFkICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7IC8qCXRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwkJCSAvKglmaW5pc2ggdXAgMXN0IHBhc3MgKi8KKworCS8qIHBlcmZvcm0gb3V0ZXIgTUQ1ICovCisJTUQ1SW5pdCgmY29udGV4dCk7CQkJCQkgLyoJaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CSAvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJbWFjLCAxNik7CQkgLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCisJTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAybmQgcGFzcyAqLworfQorCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyNkZWZpbmUgYnl0ZVJldmVyc2UoYnVmLCBsZW4pICAgLyogTm90aGluZyAqLworI2Vsc2UKK3ZvaWQgYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncyk7Cit2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpCit7CisgICAgZG8geworICAgICAgICAqKFVJTlQzMiAqKWJ1ZiA9IFNXQVAzMigqKFVJTlQzMiAqKWJ1Zik7CisgICAgICAgIGJ1ZiArPSA0OworICAgIH0gd2hpbGUgKC0tbG9uZ3MpOworfQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT0gIE1ENSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIE1ENQorI2RlZmluZSBNRDVfRjEoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQorI2RlZmluZSBNRDVfRjIoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQorI2RlZmluZSBNRDVfRjMoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgTUQ1X0Y0KHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCisjZGVmaW5lIENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpICgoKHcpIDw8IChzKSkgfCAoKHcpID4+ICgzMi0ocykpKSkKKworI2RlZmluZQlNRDVTdGVwKGYsIHcsIHgsIHksCXosIGRhdGEsIHQsIHMpCVwKKwkoIHcJKz0gZih4LAl5LCB6KSArCWRhdGEgKyB0LCAgdyA9IChDWUNMSUNfTEVGVF9TSElGVCh3LCBzKSkgJiAweGZmZmZmZmZmLCB3ICs9CXggKQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIEluaXRpYXRlIE1ENSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMTMyMQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHggICAgICAgIFBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKi8KK1ZPSUQgTUQ1SW5pdChNRDVfQ1RYICpwQ3R4KQoreworICAgIHBDdHgtPkJ1ZlswXT0weDY3NDUyMzAxOworICAgIHBDdHgtPkJ1ZlsxXT0weGVmY2RhYjg5OworICAgIHBDdHgtPkJ1ZlsyXT0weDk4YmFkY2ZlOworICAgIHBDdHgtPkJ1ZlszXT0weDEwMzI1NDc2OworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXT0wOworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV09MDsKK30KKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgTUQ1IENvbnRleHQsIGFsbG93IG9mIGFuIGFycmFyeSBvZiBvY3RldHMgYXMgdGhlIG5leHQgcG9ydGlvbgorICogICAgICBvZiB0aGUgbWVzc2FnZQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHgJCVBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCisgKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBNRDVJbml0IG9yIE1ENVVwZGF0ZShpdHNlbGYpCisgKi8KK1ZPSUQgTUQ1VXBkYXRlKE1ENV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisKKyAgICBVSU5UMzIgVGZUaW1lczsKKyAgICBVSU5UMzIgdGVtcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworICAgIHRlbXAgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOworCisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPCB0ZW1wKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSArPSBMZW5JbkJ5dGVzID4+IDI5OworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcCA9ICh0ZW1wID4+IDMpICYgMHgzZjsKKworICAgIC8vIHByb2Nlc3MgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXA7CisKKyAgICAgICAgaWYgKCh0ZW1wK0xlbkluQnl0ZXMpIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wKTsKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworICAgICAgICBwRGF0YSArPSA2NC10ZW1wOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXA7CisgICAgfSAvLyBlbmQgb2YgaWYgKHRlbXApCisKKworICAgIFRmVGltZXMgPSAoTGVuSW5CeXRlcyA+PiA2KTsKKworICAgIGZvciAoaT1UZlRpbWVzOyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgNjQpOworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCit9CisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgQXBwZW5kIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoIG9mIG9yaWdpbmFsIG1lc3NhZ2UgaW4gdGhlIHRhaWwKKyAqICAgICAgVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIERpZ2VzdAkJT3V0cHV0IG9mIERpZ2VzdC1NZXNzYWdlIGZvciBNRDUKKyAqICAJcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENVVwZGF0ZQorICovCitWT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpCit7CisgICAgVUNIQVIgUmVtYWluZGVyOworICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7CisgICAgVUNIQVIgKnBBcHBlbmQ9MDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKKworICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGlmIChSZW1haW5kZXIgPCA1NikKKyAgICB7CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKKworCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gbG93IHRvIGhpZ2gKKyAgICAgICAJZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgaWYKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRoIGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gdGhlIGZpcnN0IGJsb2NrID09PQorICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgKDY0LVJlbWFpbmRlci0xKSk7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLT0gKDY0IC0gUmVtYWluZGVyIC0gMSk7CisKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworCisgICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKKworICAgICAgICAvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgZWxzZQorCisKKyAgICBOZGlzTW92ZU1lbW9yeSgoVUNIQVIgKilEaWdlc3QsIChVSU5UMzIgKilwQ3R4LT5CdWYsIDE2KTsgLy8gb3V0cHV0CisgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopRGlnZXN0LCA0KTsKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBNRDUsIGNvbnNpc3RzIG9mIGZvdXIgcm91bmRzIGFuZCBzaXh0ZWVuCisgKiAgCXN0ZXBzIHBlciByb3VuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIEJ1ZiAgICAgQnVmZmVycyBvZiBmb3VyIHN0YXRlcyAob3V0cHV0OiAxNiBieXRlcykKKyAqIAkgICAgTWVzICAgICBJbnB1dCBkYXRhIChpbnB1dDogNjQgYnl0ZXMpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYnkgTUQ1VXBkYXRlIG9yIE1ENUZpbmFsCisgKi8KK1ZPSUQgTUQ1VHJhbnNmb3JtKFVJTlQzMiBCdWZbNF0sIFVJTlQzMiBNZXNbMTZdKQoreworICAgIFVJTlQzMiBSZWdbNF0sIFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisKKyAgICBzdGF0aWMgVUNIQVIgTFNoaWZ0VmFsWzE2XSA9CisgICAgeworICAgICAgICA3LCAxMiwgMTcsIDIyLAorCQk1LCA5ICwgMTQsIDIwLAorCQk0LCAxMSwgMTYsIDIzLAorIAkJNiwgMTAsIDE1LCAyMSwKKyAJfTsKKworCisJLy8gW2VxdWFsIHRvIDQyOTQ5NjcyOTYqYWJzKHNpbihpbmRleCkpXQorICAgIHN0YXRpYyBVSU5UMzIgTUQ1VGFibGVbNjRdID0KKwl7CisJCTB4ZDc2YWE0NzgsCTB4ZThjN2I3NTYsCTB4MjQyMDcwZGIsCTB4YzFiZGNlZWUsCisJCTB4ZjU3YzBmYWYsCTB4NDc4N2M2MmEsCTB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsCisJCTB4Njk4MDk4ZDgsCTB4OGI0NGY3YWYsCTB4ZmZmZjViYjEsCTB4ODk1Y2Q3YmUsCisgICAgCTB4NmI5MDExMjIsCTB4ZmQ5ODcxOTMsCTB4YTY3OTQzOGUsCTB4NDliNDA4MjEsCisKKyAgICAJMHhmNjFlMjU2MiwJMHhjMDQwYjM0MCwJMHgyNjVlNWE1MSwJMHhlOWI2YzdhYSwKKyAgICAJMHhkNjJmMTA1ZCwJMHgwMjQ0MTQ1MywJMHhkOGExZTY4MSwJMHhlN2QzZmJjOCwKKyAgICAJMHgyMWUxY2RlNiwJMHhjMzM3MDdkNiwJMHhmNGQ1MGQ4NywJMHg0NTVhMTRlZCwKKyAgICAJMHhhOWUzZTkwNSwJMHhmY2VmYTNmOCwJMHg2NzZmMDJkOSwJMHg4ZDJhNGM4YSwKKworICAgIAkweGZmZmEzOTQyLAkweDg3NzFmNjgxLAkweDZkOWQ2MTIyLAkweGZkZTUzODBjLAorICAgIAkweGE0YmVlYTQ0LAkweDRiZGVjZmE5LAkweGY2YmI0YjYwLAkweGJlYmZiYzcwLAorICAgIAkweDI4OWI3ZWM2LAkweGVhYTEyN2ZhLAkweGQ0ZWYzMDg1LAkweDA0ODgxZDA1LAorICAgIAkweGQ5ZDRkMDM5LAkweGU2ZGI5OWU1LAkweDFmYTI3Y2Y4LAkweGM0YWM1NjY1LAorCisgICAgCTB4ZjQyOTIyNDQsCTB4NDMyYWZmOTcsCTB4YWI5NDIzYTcsCTB4ZmM5M2EwMzksCisgICAJCTB4NjU1YjU5YzMsCTB4OGYwY2NjOTIsCTB4ZmZlZmY0N2QsCTB4ODU4NDVkZDEsCisgICAgCTB4NmZhODdlNGYsCTB4ZmUyY2U2ZTAsCTB4YTMwMTQzMTQsCTB4NGUwODExYTEsCisgICAgCTB4Zjc1MzdlODIsCTB4YmQzYWYyMzUsCTB4MmFkN2QyYmIsCTB4ZWI4NmQzOTEKKwl9OworCisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIFJlZ1tpXT1CdWZbaV07CisKKworICAgIC8vIDY0IHN0ZXBzIGluIE1ENSBhbGdvcml0aG0KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzW2ldLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbaSAmIDB4M10pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisgICAgZm9yIChpPTE2OyBpPDMyOyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDUqKGkgJiAweGYpKzEpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDEgPDwgMikrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKyAgICBmb3IgKGk9MzI7IGk8NDg7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soMyooaSAmIDB4ZikrNSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAzKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorICAgIGZvciAoaT00ODsgaTw2NDsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjQsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWyg3KihpICYgMHhmKSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MyA8PCAyKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgU0hBLTEgaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIFNIQS0xCisjZGVmaW5lIFNIQTFfRjEoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKCh+YikgJiAoZCkpKQorI2RlZmluZSBTSEExX0YyKGIsIGMsIGQpICAgICgoYikgXiAoYykgXiAoZCkpCisjZGVmaW5lIFNIQTFfRjMoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKChiKSAmIChkKSkgfCAoKGMpICYgKGQpKSkKKworCisjZGVmaW5lIFNIQTFTdGVwKGYsIGEsIGIsIGMsIGQsIGUsIHcsIGspICAgIFwKKyAgICAoIGUJKz0gKCBmKGIsIGMsIGQpICsgdyArIGsgKyBDWUNMSUNfTEVGVF9TSElGVChhLCA1KSkgJiAweGZmZmZmZmZmLCBcCisgICAgICBiID0gQ1lDTElDX0xFRlRfU0hJRlQoYiwgMzApICkKKworLy9Jbml0aWF0ZSBTSEEtMSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMzE3NAorVk9JRCBTSEFJbml0KFNIQV9DVFggKnBDdHgpCit7CisgICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7CisgICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7CisgICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7CisgICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7CisgICAgcEN0eC0+QnVmWzRdPTB4YzNkMmUxZjA7CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7CisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOworfQorCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgU0hBLTEgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dAorICogICAgICBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBTSEEtMSBjb250ZXh0CisgKiAJICAgIHBEYXRhICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICogICAgICBMZW5JbkJ5dGVzICBUaGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKHVuaXQ6IGJ5dGUpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgZXJyb3IgICAgICAgaW5kaWNhdGUgbW9yZSB0aGFuIHBvdygyLDY0KSBiaXRzIG9mIGRhdGEKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIFNIQUluaXQgb3IgU0hBVXBkYXRlKGl0c2VsZikKKyAqLworVUNIQVIgU0hBVXBkYXRlKFNIQV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisgICAgVUlOVDMyIFRmVGltZXM7CisgICAgVUlOVDMyIHRlbXAxLHRlbXAyOworCXVuc2lnbmVkIGludCBpOworCVVDSEFSIGVycj0xOworCisgICAgdGVtcDEgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworICAgIHRlbXAyID0gcEN0eC0+TGVuSW5CaXRDb3VudFsxXTsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFswXSArIChMZW5JbkJ5dGVzIDw8IDMpKTsKKyAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXAxKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gKyhMZW5JbkJ5dGVzID4+IDI5KSk7CisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPCB0ZW1wMikKKyAgICAgICAgcmV0dXJuIChlcnIpOyAgIC8vY2hlY2sgdG90YWwgbGVuZ3RoIG9mIG9yaWdpbmFsIGRhdGEKKworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcDEgPSAodGVtcDEgPj4gMykgJiAweDNmOworCisgICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZiAodGVtcDEpCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXAxOworCisgICAgICAgIGlmICgodGVtcDErTGVuSW5CeXRlcykgPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wMSk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisgICAgICAgIHBEYXRhICs9IDY0LXRlbXAxOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXAxOworICAgIH0gLy8gZW5kIG9mIGlmICh0ZW1wMSkKKworCisgICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOworCisgICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCisJcmV0dXJuICgwKTsKKworfQorCisvLyBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAorLy8gVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorVk9JRCBTSEFGaW5hbChTSEFfQ1RYICpwQ3R4LCBVQ0hBUiBEaWdlc3RbMjBdKQoreworICAgIFVDSEFSIFJlbWFpbmRlcjsKKyAgICBVQ0hBUiBQYWRMZW5JbkJ5dGVzOworICAgIFVDSEFSICpwQXBwZW5kPTA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBSZW1haW5kZXIgPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IDMpICYgMHgzZik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICBQYWRMZW5JbkJ5dGVzID0gKFJlbWFpbmRlciA8IDU2KSA/ICg1Ni1SZW1haW5kZXIpIDogKDEyMC1SZW1haW5kZXIpOworCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGhvdXQgY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBpZiAoUmVtYWluZGVyIDwgNTYpCisgICAgeworICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkLCBmcm9tIGhpZ2ggdG8gbG93CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE0KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBpZgorCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKworICAgICAgICAvLyB0aGUgc2Vjb25kIGJsb2NrID09PQorICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkCisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBlbHNlCisKKworICAgIC8vT3V0cHV0LCBieXRlcmV2ZXJzZQorICAgIGZvciAoaT0wOyBpPDIwOyBpKyspCisgICAgeworICAgICAgICBEaWdlc3QgW2ldID0gKFVDSEFSKShwQ3R4LT5CdWZbaT4+Ml0gPj4gOCooMy0oaSAmIDB4MykpKTsKKyAgICB9CisKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8vIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBTSEEtMSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kCisvLyB0d2VudHkgc3RlcHMgcGVyIHJvdW5kCitWT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSkKK3sKKyAgICBVSU5UMzIgUmVnWzVdLFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisgICAgVUlOVDMyIFdbODBdOworCisgICAgc3RhdGljIFVJTlQzMiBTSEExVGFibGVbNF0gPSB7IDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNiB9OworCisgICAgUmVnWzBdPUJ1ZlswXTsKKwlSZWdbMV09QnVmWzFdOworCVJlZ1syXT1CdWZbMl07CisJUmVnWzNdPUJ1ZlszXTsKKwlSZWdbNF09QnVmWzRdOworCisgICAgLy90aGUgZmlyc3Qgb2N0ZXQgb2YgYSB3b3JkIGlzIHN0b3JlZCBpbiB0aGUgMHRoIGVsZW1lbnQsIGJ5dGVyZXZlcnNlCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgCVdbaV0gID0gKE1lc1tpXSA+PiAyNCkgJiAweGZmOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPj4gOCApICYgMHhmZjAwOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPDwgOCApICYgMHhmZjAwMDA7CisgICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCAyNCkgJiAweGZmMDAwMDAwOworICAgIH0KKworCisgICAgZm9yCShpID0gMDsgaSA8IDY0OyBpKyspCisJICAgIFdbMTYraV0gPSBDWUNMSUNfTEVGVF9TSElGVChXW2ldIF4gV1syK2ldIF4gV1s4K2ldIF4gV1sxMytpXSwgMSk7CisKKworICAgIC8vIDgwIHN0ZXBzIGluIFNIQS0xIGFsZ29yaXRobQorICAgIGZvciAoaT0wOyBpPDgwOyBpKyspCisgICAgeworICAgICAgICBpZiAoaTwyMCkKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzBdKTsKKworICAgICAgICBlbHNlIGlmIChpPj0yMCAmJiBpPDQwKQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMV0pOworCisJCWVsc2UgaWYgKGk+PTQwICYmIGk8NjApCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMl0pOworCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzNdKTsKKworCisgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKwkJVGVtcCAgID0gUmVnWzRdOworICAgICAgICBSZWdbNF0gPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisKKyAgICB9IC8vIGVuZCBvZiBmb3ItbG9vcAorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT0gIEFFUyBFbi9EZWNyeXB0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIGZvcndhcmQgUy1ib3ggKi8KK3N0YXRpYyB1aW50MzIgRlNiWzI1Nl0gPQoreworCTB4NjMsIDB4N0MsCTB4NzcsIDB4N0IsCTB4RjIsIDB4NkIsCTB4NkYsIDB4QzUsCisJMHgzMCwgMHgwMSwJMHg2NywgMHgyQiwJMHhGRSwgMHhENywJMHhBQiwgMHg3NiwKKwkweENBLCAweDgyLAkweEM5LCAweDdELAkweEZBLCAweDU5LAkweDQ3LCAweEYwLAorCTB4QUQsIDB4RDQsCTB4QTIsIDB4QUYsCTB4OUMsIDB4QTQsCTB4NzIsIDB4QzAsCisJMHhCNywgMHhGRCwJMHg5MywgMHgyNiwJMHgzNiwgMHgzRiwJMHhGNywgMHhDQywKKwkweDM0LCAweEE1LAkweEU1LCAweEYxLAkweDcxLCAweEQ4LAkweDMxLCAweDE1LAorCTB4MDQsIDB4QzcsCTB4MjMsIDB4QzMsCTB4MTgsIDB4OTYsCTB4MDUsIDB4OUEsCisJMHgwNywgMHgxMiwJMHg4MCwgMHhFMiwJMHhFQiwgMHgyNywJMHhCMiwgMHg3NSwKKwkweDA5LCAweDgzLAkweDJDLCAweDFBLAkweDFCLCAweDZFLAkweDVBLCAweEEwLAorCTB4NTIsIDB4M0IsCTB4RDYsIDB4QjMsCTB4MjksIDB4RTMsCTB4MkYsIDB4ODQsCisJMHg1MywgMHhEMSwJMHgwMCwgMHhFRCwJMHgyMCwgMHhGQywJMHhCMSwgMHg1QiwKKwkweDZBLCAweENCLAkweEJFLCAweDM5LAkweDRBLCAweDRDLAkweDU4LCAweENGLAorCTB4RDAsIDB4RUYsCTB4QUEsIDB4RkIsCTB4NDMsIDB4NEQsCTB4MzMsIDB4ODUsCisJMHg0NSwgMHhGOSwJMHgwMiwgMHg3RiwJMHg1MCwgMHgzQywJMHg5RiwgMHhBOCwKKwkweDUxLCAweEEzLAkweDQwLCAweDhGLAkweDkyLCAweDlELAkweDM4LCAweEY1LAorCTB4QkMsIDB4QjYsCTB4REEsIDB4MjEsCTB4MTAsIDB4RkYsCTB4RjMsIDB4RDIsCisJMHhDRCwgMHgwQywJMHgxMywgMHhFQywJMHg1RiwgMHg5NywJMHg0NCwgMHgxNywKKwkweEM0LCAweEE3LAkweDdFLCAweDNELAkweDY0LCAweDVELAkweDE5LCAweDczLAorCTB4NjAsIDB4ODEsCTB4NEYsIDB4REMsCTB4MjIsIDB4MkEsCTB4OTAsIDB4ODgsCisJMHg0NiwgMHhFRSwJMHhCOCwgMHgxNCwJMHhERSwgMHg1RSwJMHgwQiwgMHhEQiwKKwkweEUwLCAweDMyLAkweDNBLCAweDBBLAkweDQ5LCAweDA2LAkweDI0LCAweDVDLAorCTB4QzIsIDB4RDMsCTB4QUMsIDB4NjIsCTB4OTEsIDB4OTUsCTB4RTQsIDB4NzksCisJMHhFNywgMHhDOCwJMHgzNywgMHg2RCwJMHg4RCwgMHhENSwJMHg0RSwgMHhBOSwKKwkweDZDLCAweDU2LAkweEY0LCAweEVBLAkweDY1LCAweDdBLAkweEFFLCAweDA4LAorCTB4QkEsIDB4NzgsCTB4MjUsIDB4MkUsCTB4MUMsIDB4QTYsCTB4QjQsIDB4QzYsCisJMHhFOCwgMHhERCwJMHg3NCwgMHgxRiwJMHg0QiwgMHhCRCwJMHg4QiwgMHg4QSwKKwkweDcwLCAweDNFLAkweEI1LCAweDY2LAkweDQ4LCAweDAzLAkweEY2LCAweDBFLAorCTB4NjEsIDB4MzUsCTB4NTcsIDB4QjksCTB4ODYsIDB4QzEsCTB4MUQsIDB4OUUsCisJMHhFMSwgMHhGOCwJMHg5OCwgMHgxMSwJMHg2OSwgMHhEOSwJMHg4RSwgMHg5NCwKKwkweDlCLCAweDFFLAkweDg3LCAweEU5LAkweENFLCAweDU1LAkweDI4LCAweERGLAorCTB4OEMsIDB4QTEsCTB4ODksIDB4MEQsCTB4QkYsIDB4RTYsCTB4NDIsIDB4NjgsCisJMHg0MSwgMHg5OSwJMHgyRCwgMHgwRiwJMHhCMCwgMHg1NCwJMHhCQiwgMHgxNgorfTsKKworLyogZm9yd2FyZCB0YWJsZSAqLworI2RlZmluZQlGVCBcCitcCisJVihDNiw2Myw2MyxBNSksCVYoRjgsN0MsN0MsODQpLAlWKEVFLDc3LDc3LDk5KSwJVihGNiw3Qiw3Qiw4RCksCVwKKwlWKEZGLEYyLEYyLDBEKSwJVihENiw2Qiw2QixCRCksCVYoREUsNkYsNkYsQjEpLAlWKDkxLEM1LEM1LDU0KSwJXAorCVYoNjAsMzAsMzAsNTApLAlWKDAyLDAxLDAxLDAzKSwJVihDRSw2Nyw2NyxBOSksCVYoNTYsMkIsMkIsN0QpLAlcCisJVihFNyxGRSxGRSwxOSksCVYoQjUsRDcsRDcsNjIpLAlWKDRELEFCLEFCLEU2KSwJVihFQyw3Niw3Niw5QSksCVwKKwlWKDhGLENBLENBLDQ1KSwJVigxRiw4Miw4Miw5RCksCVYoODksQzksQzksNDApLAlWKEZBLDdELDdELDg3KSwJXAorCVYoRUYsRkEsRkEsMTUpLAlWKEIyLDU5LDU5LEVCKSwJVig4RSw0Nyw0NyxDOSksCVYoRkIsRjAsRjAsMEIpLAlcCisJVig0MSxBRCxBRCxFQyksCVYoQjMsRDQsRDQsNjcpLAlWKDVGLEEyLEEyLEZEKSwJVig0NSxBRixBRixFQSksCVwKKwlWKDIzLDlDLDlDLEJGKSwJVig1MyxBNCxBNCxGNyksCVYoRTQsNzIsNzIsOTYpLAlWKDlCLEMwLEMwLDVCKSwJXAorCVYoNzUsQjcsQjcsQzIpLAlWKEUxLEZELEZELDFDKSwJVigzRCw5Myw5MyxBRSksCVYoNEMsMjYsMjYsNkEpLAlcCisJVig2QywzNiwzNiw1QSksCVYoN0UsM0YsM0YsNDEpLAlWKEY1LEY3LEY3LDAyKSwJVig4MyxDQyxDQyw0RiksCVwKKwlWKDY4LDM0LDM0LDVDKSwJVig1MSxBNSxBNSxGNCksCVYoRDEsRTUsRTUsMzQpLAlWKEY5LEYxLEYxLDA4KSwJXAorCVYoRTIsNzEsNzEsOTMpLAlWKEFCLEQ4LEQ4LDczKSwJVig2MiwzMSwzMSw1MyksCVYoMkEsMTUsMTUsM0YpLAlcCisJVigwOCwwNCwwNCwwQyksCVYoOTUsQzcsQzcsNTIpLAlWKDQ2LDIzLDIzLDY1KSwJVig5RCxDMyxDMyw1RSksCVwKKwlWKDMwLDE4LDE4LDI4KSwJVigzNyw5Niw5NixBMSksCVYoMEEsMDUsMDUsMEYpLAlWKDJGLDlBLDlBLEI1KSwJXAorCVYoMEUsMDcsMDcsMDkpLAlWKDI0LDEyLDEyLDM2KSwJVigxQiw4MCw4MCw5QiksCVYoREYsRTIsRTIsM0QpLAlcCisJVihDRCxFQixFQiwyNiksCVYoNEUsMjcsMjcsNjkpLAlWKDdGLEIyLEIyLENEKSwJVihFQSw3NSw3NSw5RiksCVwKKwlWKDEyLDA5LDA5LDFCKSwJVigxRCw4Myw4Myw5RSksCVYoNTgsMkMsMkMsNzQpLAlWKDM0LDFBLDFBLDJFKSwJXAorCVYoMzYsMUIsMUIsMkQpLAlWKERDLDZFLDZFLEIyKSwJVihCNCw1QSw1QSxFRSksCVYoNUIsQTAsQTAsRkIpLAlcCisJVihBNCw1Miw1MixGNiksCVYoNzYsM0IsM0IsNEQpLAlWKEI3LEQ2LEQ2LDYxKSwJVig3RCxCMyxCMyxDRSksCVwKKwlWKDUyLDI5LDI5LDdCKSwJVihERCxFMyxFMywzRSksCVYoNUUsMkYsMkYsNzEpLAlWKDEzLDg0LDg0LDk3KSwJXAorCVYoQTYsNTMsNTMsRjUpLAlWKEI5LEQxLEQxLDY4KSwJVigwMCwwMCwwMCwwMCksCVYoQzEsRUQsRUQsMkMpLAlcCisJVig0MCwyMCwyMCw2MCksCVYoRTMsRkMsRkMsMUYpLAlWKDc5LEIxLEIxLEM4KSwJVihCNiw1Qiw1QixFRCksCVwKKwlWKEQ0LDZBLDZBLEJFKSwJVig4RCxDQixDQiw0NiksCVYoNjcsQkUsQkUsRDkpLAlWKDcyLDM5LDM5LDRCKSwJXAorCVYoOTQsNEEsNEEsREUpLAlWKDk4LDRDLDRDLEQ0KSwJVihCMCw1OCw1OCxFOCksCVYoODUsQ0YsQ0YsNEEpLAlcCisJVihCQixEMCxEMCw2QiksCVYoQzUsRUYsRUYsMkEpLAlWKDRGLEFBLEFBLEU1KSwJVihFRCxGQixGQiwxNiksCVwKKwlWKDg2LDQzLDQzLEM1KSwJVig5QSw0RCw0RCxENyksCVYoNjYsMzMsMzMsNTUpLAlWKDExLDg1LDg1LDk0KSwJXAorCVYoOEEsNDUsNDUsQ0YpLAlWKEU5LEY5LEY5LDEwKSwJVigwNCwwMiwwMiwwNiksCVYoRkUsN0YsN0YsODEpLAlcCisJVihBMCw1MCw1MCxGMCksCVYoNzgsM0MsM0MsNDQpLAlWKDI1LDlGLDlGLEJBKSwJVig0QixBOCxBOCxFMyksCVwKKwlWKEEyLDUxLDUxLEYzKSwJVig1RCxBMyxBMyxGRSksCVYoODAsNDAsNDAsQzApLAlWKDA1LDhGLDhGLDhBKSwJXAorCVYoM0YsOTIsOTIsQUQpLAlWKDIxLDlELDlELEJDKSwJVig3MCwzOCwzOCw0OCksCVYoRjEsRjUsRjUsMDQpLAlcCisJVig2MyxCQyxCQyxERiksCVYoNzcsQjYsQjYsQzEpLAlWKEFGLERBLERBLDc1KSwJVig0MiwyMSwyMSw2MyksCVwKKwlWKDIwLDEwLDEwLDMwKSwJVihFNSxGRixGRiwxQSksCVYoRkQsRjMsRjMsMEUpLAlWKEJGLEQyLEQyLDZEKSwJXAorCVYoODEsQ0QsQ0QsNEMpLAlWKDE4LDBDLDBDLDE0KSwJVigyNiwxMywxMywzNSksCVYoQzMsRUMsRUMsMkYpLAlcCisJVihCRSw1Riw1RixFMSksCVYoMzUsOTcsOTcsQTIpLAlWKDg4LDQ0LDQ0LENDKSwJVigyRSwxNywxNywzOSksCVwKKwlWKDkzLEM0LEM0LDU3KSwJVig1NSxBNyxBNyxGMiksCVYoRkMsN0UsN0UsODIpLAlWKDdBLDNELDNELDQ3KSwJXAorCVYoQzgsNjQsNjQsQUMpLAlWKEJBLDVELDVELEU3KSwJVigzMiwxOSwxOSwyQiksCVYoRTYsNzMsNzMsOTUpLAlcCisJVihDMCw2MCw2MCxBMCksCVYoMTksODEsODEsOTgpLAlWKDlFLDRGLDRGLEQxKSwJVihBMyxEQyxEQyw3RiksCVwKKwlWKDQ0LDIyLDIyLDY2KSwJVig1NCwyQSwyQSw3RSksCVYoM0IsOTAsOTAsQUIpLAlWKDBCLDg4LDg4LDgzKSwJXAorCVYoOEMsNDYsNDYsQ0EpLAlWKEM3LEVFLEVFLDI5KSwJVig2QixCOCxCOCxEMyksCVYoMjgsMTQsMTQsM0MpLAlcCisJVihBNyxERSxERSw3OSksCVYoQkMsNUUsNUUsRTIpLAlWKDE2LDBCLDBCLDFEKSwJVihBRCxEQixEQiw3NiksCVwKKwlWKERCLEUwLEUwLDNCKSwJVig2NCwzMiwzMiw1NiksCVYoNzQsM0EsM0EsNEUpLAlWKDE0LDBBLDBBLDFFKSwJXAorCVYoOTIsNDksNDksREIpLAlWKDBDLDA2LDA2LDBBKSwJVig0OCwyNCwyNCw2QyksCVYoQjgsNUMsNUMsRTQpLAlcCisJVig5RixDMixDMiw1RCksCVYoQkQsRDMsRDMsNkUpLAlWKDQzLEFDLEFDLEVGKSwJVihDNCw2Miw2MixBNiksCVwKKwlWKDM5LDkxLDkxLEE4KSwJVigzMSw5NSw5NSxBNCksCVYoRDMsRTQsRTQsMzcpLAlWKEYyLDc5LDc5LDhCKSwJXAorCVYoRDUsRTcsRTcsMzIpLAlWKDhCLEM4LEM4LDQzKSwJVig2RSwzNywzNyw1OSksCVYoREEsNkQsNkQsQjcpLAlcCisJVigwMSw4RCw4RCw4QyksCVYoQjEsRDUsRDUsNjQpLAlWKDlDLDRFLDRFLEQyKSwJVig0OSxBOSxBOSxFMCksCVwKKwlWKEQ4LDZDLDZDLEI0KSwJVihBQyw1Niw1NixGQSksCVYoRjMsRjQsRjQsMDcpLAlWKENGLEVBLEVBLDI1KSwJXAorCVYoQ0EsNjUsNjUsQUYpLAlWKEY0LDdBLDdBLDhFKSwJVig0NyxBRSxBRSxFOSksCVYoMTAsMDgsMDgsMTgpLAlcCisJVig2RixCQSxCQSxENSksCVYoRjAsNzgsNzgsODgpLAlWKDRBLDI1LDI1LDZGKSwJVig1QywyRSwyRSw3MiksCVwKKwlWKDM4LDFDLDFDLDI0KSwJVig1NyxBNixBNixGMSksCVYoNzMsQjQsQjQsQzcpLAlWKDk3LEM2LEM2LDUxKSwJXAorCVYoQ0IsRTgsRTgsMjMpLAlWKEExLERELERELDdDKSwJVihFOCw3NCw3NCw5QyksCVYoM0UsMUYsMUYsMjEpLAlcCisJVig5Niw0Qiw0QixERCksCVYoNjEsQkQsQkQsREMpLAlWKDBELDhCLDhCLDg2KSwJVigwRiw4QSw4QSw4NSksCVwKKwlWKEUwLDcwLDcwLDkwKSwJVig3QywzRSwzRSw0MiksCVYoNzEsQjUsQjUsQzQpLAlWKENDLDY2LDY2LEFBKSwJXAorCVYoOTAsNDgsNDgsRDgpLAlWKDA2LDAzLDAzLDA1KSwJVihGNyxGNixGNiwwMSksCVYoMUMsMEUsMEUsMTIpLAlcCisJVihDMiw2MSw2MSxBMyksCVYoNkEsMzUsMzUsNUYpLAlWKEFFLDU3LDU3LEY5KSwJVig2OSxCOSxCOSxEMCksCVwKKwlWKDE3LDg2LDg2LDkxKSwJVig5OSxDMSxDMSw1OCksCVYoM0EsMUQsMUQsMjcpLAlWKDI3LDlFLDlFLEI5KSwJXAorCVYoRDksRTEsRTEsMzgpLAlWKEVCLEY4LEY4LDEzKSwJVigyQiw5OCw5OCxCMyksCVYoMjIsMTEsMTEsMzMpLAlcCisJVihEMiw2OSw2OSxCQiksCVYoQTksRDksRDksNzApLAlWKDA3LDhFLDhFLDg5KSwJVigzMyw5NCw5NCxBNyksCVwKKwlWKDJELDlCLDlCLEI2KSwJVigzQywxRSwxRSwyMiksCVYoMTUsODcsODcsOTIpLAlWKEM5LEU5LEU5LDIwKSwJXAorCVYoODcsQ0UsQ0UsNDkpLAlWKEFBLDU1LDU1LEZGKSwJVig1MCwyOCwyOCw3OCksCVYoQTUsREYsREYsN0EpLAlcCisJVigwMyw4Qyw4Qyw4RiksCVYoNTksQTEsQTEsRjgpLAlWKDA5LDg5LDg5LDgwKSwJVigxQSwwRCwwRCwxNyksCVwKKwlWKDY1LEJGLEJGLERBKSwJVihENyxFNixFNiwzMSksCVYoODQsNDIsNDIsQzYpLAlWKEQwLDY4LDY4LEI4KSwJXAorCVYoODIsNDEsNDEsQzMpLAlWKDI5LDk5LDk5LEIwKSwJVig1QSwyRCwyRCw3NyksCVYoMUUsMEYsMEYsMTEpLAlcCisJVig3QixCMCxCMCxDQiksCVYoQTgsNTQsNTQsRkMpLAlWKDZELEJCLEJCLEQ2KSwJVigyQywxNiwxNiwzQSkKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIEZUMFsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgdWludDMyIEZUMlsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIEZUM1syNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qIHJldmVyc2UgUy1ib3ggKi8KKworc3RhdGljIHVpbnQzMiBSU2JbMjU2XSA9Cit7CisJMHg1MiwgMHgwOSwJMHg2QSwgMHhENSwJMHgzMCwgMHgzNiwJMHhBNSwgMHgzOCwKKwkweEJGLCAweDQwLAkweEEzLCAweDlFLAkweDgxLCAweEYzLAkweEQ3LCAweEZCLAorCTB4N0MsIDB4RTMsCTB4MzksIDB4ODIsCTB4OUIsIDB4MkYsCTB4RkYsIDB4ODcsCisJMHgzNCwgMHg4RSwJMHg0MywgMHg0NCwJMHhDNCwgMHhERSwJMHhFOSwgMHhDQiwKKwkweDU0LCAweDdCLAkweDk0LCAweDMyLAkweEE2LCAweEMyLAkweDIzLCAweDNELAorCTB4RUUsIDB4NEMsCTB4OTUsIDB4MEIsCTB4NDIsIDB4RkEsCTB4QzMsIDB4NEUsCisJMHgwOCwgMHgyRSwJMHhBMSwgMHg2NiwJMHgyOCwgMHhEOSwJMHgyNCwgMHhCMiwKKwkweDc2LCAweDVCLAkweEEyLCAweDQ5LAkweDZELCAweDhCLAkweEQxLCAweDI1LAorCTB4NzIsIDB4RjgsCTB4RjYsIDB4NjQsCTB4ODYsIDB4NjgsCTB4OTgsIDB4MTYsCisJMHhENCwgMHhBNCwJMHg1QywgMHhDQywJMHg1RCwgMHg2NSwJMHhCNiwgMHg5MiwKKwkweDZDLCAweDcwLAkweDQ4LCAweDUwLAkweEZELCAweEVELAkweEI5LCAweERBLAorCTB4NUUsIDB4MTUsCTB4NDYsIDB4NTcsCTB4QTcsIDB4OEQsCTB4OUQsIDB4ODQsCisJMHg5MCwgMHhEOCwJMHhBQiwgMHgwMCwJMHg4QywgMHhCQywJMHhEMywgMHgwQSwKKwkweEY3LCAweEU0LAkweDU4LCAweDA1LAkweEI4LCAweEIzLAkweDQ1LCAweDA2LAorCTB4RDAsIDB4MkMsCTB4MUUsIDB4OEYsCTB4Q0EsIDB4M0YsCTB4MEYsIDB4MDIsCisJMHhDMSwgMHhBRiwJMHhCRCwgMHgwMywJMHgwMSwgMHgxMywJMHg4QSwgMHg2QiwKKwkweDNBLCAweDkxLAkweDExLCAweDQxLAkweDRGLCAweDY3LAkweERDLCAweEVBLAorCTB4OTcsIDB4RjIsCTB4Q0YsIDB4Q0UsCTB4RjAsIDB4QjQsCTB4RTYsIDB4NzMsCisJMHg5NiwgMHhBQywJMHg3NCwgMHgyMiwJMHhFNywgMHhBRCwJMHgzNSwgMHg4NSwKKwkweEUyLCAweEY5LAkweDM3LCAweEU4LAkweDFDLCAweDc1LAkweERGLCAweDZFLAorCTB4NDcsIDB4RjEsCTB4MUEsIDB4NzEsCTB4MUQsIDB4MjksCTB4QzUsIDB4ODksCisJMHg2RiwgMHhCNywJMHg2MiwgMHgwRSwJMHhBQSwgMHgxOCwJMHhCRSwgMHgxQiwKKwkweEZDLCAweDU2LAkweDNFLCAweDRCLAkweEM2LCAweEQyLAkweDc5LCAweDIwLAorCTB4OUEsIDB4REIsCTB4QzAsIDB4RkUsCTB4NzgsIDB4Q0QsCTB4NUEsIDB4RjQsCisJMHgxRiwgMHhERCwJMHhBOCwgMHgzMywJMHg4OCwgMHgwNywJMHhDNywgMHgzMSwKKwkweEIxLCAweDEyLAkweDEwLCAweDU5LAkweDI3LCAweDgwLAkweEVDLCAweDVGLAorCTB4NjAsIDB4NTEsCTB4N0YsIDB4QTksCTB4MTksIDB4QjUsCTB4NEEsIDB4MEQsCisJMHgyRCwgMHhFNSwJMHg3QSwgMHg5RiwJMHg5MywgMHhDOSwJMHg5QywgMHhFRiwKKwkweEEwLCAweEUwLAkweDNCLCAweDRELAkweEFFLCAweDJBLAkweEY1LCAweEIwLAorCTB4QzgsIDB4RUIsCTB4QkIsIDB4M0MsCTB4ODMsIDB4NTMsCTB4OTksIDB4NjEsCisJMHgxNywgMHgyQiwJMHgwNCwgMHg3RSwJMHhCQSwgMHg3NywJMHhENiwgMHgyNiwKKwkweEUxLCAweDY5LAkweDE0LCAweDYzLAkweDU1LCAweDIxLAkweDBDLCAweDdECit9OworCisvKiByZXZlcnNlIHRhYmxlICovCisKKyNkZWZpbmUJUlQgXAorXAorCVYoNTEsRjQsQTcsNTApLAlWKDdFLDQxLDY1LDUzKSwJVigxQSwxNyxBNCxDMyksCVYoM0EsMjcsNUUsOTYpLAlcCisJVigzQixBQiw2QixDQiksCVYoMUYsOUQsNDUsRjEpLAlWKEFDLEZBLDU4LEFCKSwJVig0QixFMywwMyw5MyksCVwKKwlWKDIwLDMwLEZBLDU1KSwJVihBRCw3Niw2RCxGNiksCVYoODgsQ0MsNzYsOTEpLAlWKEY1LDAyLDRDLDI1KSwJXAorCVYoNEYsRTUsRDcsRkMpLAlWKEM1LDJBLENCLEQ3KSwJVigyNiwzNSw0NCw4MCksCVYoQjUsNjIsQTMsOEYpLAlcCisJVihERSxCMSw1QSw0OSksCVYoMjUsQkEsMUIsNjcpLAlWKDQ1LEVBLDBFLDk4KSwJVig1RCxGRSxDMCxFMSksCVwKKwlWKEMzLDJGLDc1LDAyKSwJVig4MSw0QyxGMCwxMiksCVYoOEQsNDYsOTcsQTMpLAlWKDZCLEQzLEY5LEM2KSwJXAorCVYoMDMsOEYsNUYsRTcpLAlWKDE1LDkyLDlDLDk1KSwJVihCRiw2RCw3QSxFQiksCVYoOTUsNTIsNTksREEpLAlcCisJVihENCxCRSw4MywyRCksCVYoNTgsNzQsMjEsRDMpLAlWKDQ5LEUwLDY5LDI5KSwJVig4RSxDOSxDOCw0NCksCVwKKwlWKDc1LEMyLDg5LDZBKSwJVihGNCw4RSw3OSw3OCksCVYoOTksNTgsM0UsNkIpLAlWKDI3LEI5LDcxLEREKSwJXAorCVYoQkUsRTEsNEYsQjYpLAlWKEYwLDg4LEFELDE3KSwJVihDOSwyMCxBQyw2NiksCVYoN0QsQ0UsM0EsQjQpLAlcCisJVig2MyxERiw0QSwxOCksCVYoRTUsMUEsMzEsODIpLAlWKDk3LDUxLDMzLDYwKSwJVig2Miw1Myw3Riw0NSksCVwKKwlWKEIxLDY0LDc3LEUwKSwJVihCQiw2QixBRSw4NCksCVYoRkUsODEsQTAsMUMpLAlWKEY5LDA4LDJCLDk0KSwJXAorCVYoNzAsNDgsNjgsNTgpLAlWKDhGLDQ1LEZELDE5KSwJVig5NCxERSw2Qyw4NyksCVYoNTIsN0IsRjgsQjcpLAlcCisJVihBQiw3MyxEMywyMyksCVYoNzIsNEIsMDIsRTIpLAlWKEUzLDFGLDhGLDU3KSwJVig2Niw1NSxBQiwyQSksCVwKKwlWKEIyLEVCLDI4LDA3KSwJVigyRixCNSxDMiwwMyksCVYoODYsQzUsN0IsOUEpLAlWKEQzLDM3LDA4LEE1KSwJXAorCVYoMzAsMjgsODcsRjIpLAlWKDIzLEJGLEE1LEIyKSwJVigwMiwwMyw2QSxCQSksCVYoRUQsMTYsODIsNUMpLAlcCisJVig4QSxDRiwxQywyQiksCVYoQTcsNzksQjQsOTIpLAlWKEYzLDA3LEYyLEYwKSwJVig0RSw2OSxFMixBMSksCVwKKwlWKDY1LERBLEY0LENEKSwJVigwNiwwNSxCRSxENSksCVYoRDEsMzQsNjIsMUYpLAlWKEM0LEE2LEZFLDhBKSwJXAorCVYoMzQsMkUsNTMsOUQpLAlWKEEyLEYzLDU1LEEwKSwJVigwNSw4QSxFMSwzMiksCVYoQTQsRjYsRUIsNzUpLAlcCisJVigwQiw4MyxFQywzOSksCVYoNDAsNjAsRUYsQUEpLAlWKDVFLDcxLDlGLDA2KSwJVihCRCw2RSwxMCw1MSksCVwKKwlWKDNFLDIxLDhBLEY5KSwJVig5NixERCwwNiwzRCksCVYoREQsM0UsMDUsQUUpLAlWKDRELEU2LEJELDQ2KSwJXAorCVYoOTEsNTQsOEQsQjUpLAlWKDcxLEM0LDVELDA1KSwJVigwNCwwNixENCw2RiksCVYoNjAsNTAsMTUsRkYpLAlcCisJVigxOSw5OCxGQiwyNCksCVYoRDYsQkQsRTksOTcpLAlWKDg5LDQwLDQzLENDKSwJVig2NyxEOSw5RSw3NyksCVwKKwlWKEIwLEU4LDQyLEJEKSwJVigwNyw4OSw4Qiw4OCksCVYoRTcsMTksNUIsMzgpLAlWKDc5LEM4LEVFLERCKSwJXAorCVYoQTEsN0MsMEEsNDcpLAlWKDdDLDQyLDBGLEU5KSwJVihGOCw4NCwxRSxDOSksCVYoMDAsMDAsMDAsMDApLAlcCisJVigwOSw4MCw4Niw4MyksCVYoMzIsMkIsRUQsNDgpLAlWKDFFLDExLDcwLEFDKSwJVig2Qyw1QSw3Miw0RSksCVwKKwlWKEZELDBFLEZGLEZCKSwJVigwRiw4NSwzOCw1NiksCVYoM0QsQUUsRDUsMUUpLAlWKDM2LDJELDM5LDI3KSwJXAorCVYoMEEsMEYsRDksNjQpLAlWKDY4LDVDLEE2LDIxKSwJVig5Qiw1Qiw1NCxEMSksCVYoMjQsMzYsMkUsM0EpLAlcCisJVigwQywwQSw2NyxCMSksCVYoOTMsNTcsRTcsMEYpLAlWKEI0LEVFLDk2LEQyKSwJVigxQiw5Qiw5MSw5RSksCVwKKwlWKDgwLEMwLEM1LDRGKSwJVig2MSxEQywyMCxBMiksCVYoNUEsNzcsNEIsNjkpLAlWKDFDLDEyLDFBLDE2KSwJXAorCVYoRTIsOTMsQkEsMEEpLAlWKEMwLEEwLDJBLEU1KSwJVigzQywyMixFMCw0MyksCVYoMTIsMUIsMTcsMUQpLAlcCisJVigwRSwwOSwwRCwwQiksCVYoRjIsOEIsQzcsQUQpLAlWKDJELEI2LEE4LEI5KSwJVigxNCwxRSxBOSxDOCksCVwKKwlWKDU3LEYxLDE5LDg1KSwJVihBRiw3NSwwNyw0QyksCVYoRUUsOTksREQsQkIpLAlWKEEzLDdGLDYwLEZEKSwJXAorCVYoRjcsMDEsMjYsOUYpLAlWKDVDLDcyLEY1LEJDKSwJVig0NCw2NiwzQixDNSksCVYoNUIsRkIsN0UsMzQpLAlcCisJVig4Qiw0MywyOSw3NiksCVYoQ0IsMjMsQzYsREMpLAlWKEI2LEVELEZDLDY4KSwJVihCOCxFNCxGMSw2MyksCVwKKwlWKEQ3LDMxLERDLENBKSwJVig0Miw2Myw4NSwxMCksCVYoMTMsOTcsMjIsNDApLAlWKDg0LEM2LDExLDIwKSwJXAorCVYoODUsNEEsMjQsN0QpLAlWKEQyLEJCLDNELEY4KSwJVihBRSxGOSwzMiwxMSksCVYoQzcsMjksQTEsNkQpLAlcCisJVigxRCw5RSwyRiw0QiksCVYoREMsQjIsMzAsRjMpLAlWKDBELDg2LDUyLEVDKSwJVig3NyxDMSxFMyxEMCksCVwKKwlWKDJCLEIzLDE2LDZDKSwJVihBOSw3MCxCOSw5OSksCVYoMTEsOTQsNDgsRkEpLAlWKDQ3LEU5LDY0LDIyKSwJXAorCVYoQTgsRkMsOEMsQzQpLAlWKEEwLEYwLDNGLDFBKSwJVig1Niw3RCwyQyxEOCksCVYoMjIsMzMsOTAsRUYpLAlcCisJVig4Nyw0OSw0RSxDNyksCVYoRDksMzgsRDEsQzEpLAlWKDhDLENBLEEyLEZFKSwJVig5OCxENCwwQiwzNiksCVwKKwlWKEE2LEY1LDgxLENGKSwJVihBNSw3QSxERSwyOCksCVYoREEsQjcsOEUsMjYpLAlWKDNGLEFELEJGLEE0KSwJXAorCVYoMkMsM0EsOUQsRTQpLAlWKDUwLDc4LDkyLDBEKSwJVig2QSw1RixDQyw5QiksCVYoNTQsN0UsNDYsNjIpLAlcCisJVihGNiw4RCwxMyxDMiksCVYoOTAsRDgsQjgsRTgpLAlWKDJFLDM5LEY3LDVFKSwJVig4MixDMyxBRixGNSksCVwKKwlWKDlGLDVELDgwLEJFKSwJVig2OSxEMCw5Myw3QyksCVYoNkYsRDUsMkQsQTkpLAlWKENGLDI1LDEyLEIzKSwJXAorCVYoQzgsQUMsOTksM0IpLAlWKDEwLDE4LDdELEE3KSwJVihFOCw5Qyw2Myw2RSksCVYoREIsM0IsQkIsN0IpLAlcCisJVihDRCwyNiw3OCwwOSksCVYoNkUsNTksMTgsRjQpLAlWKEVDLDlBLEI3LDAxKSwJVig4Myw0Riw5QSxBOCksCVwKKwlWKEU2LDk1LDZFLDY1KSwJVihBQSxGRixFNiw3RSksCVYoMjEsQkMsQ0YsMDgpLAlWKEVGLDE1LEU4LEU2KSwJXAorCVYoQkEsRTcsOUIsRDkpLAlWKDRBLDZGLDM2LENFKSwJVihFQSw5RiwwOSxENCksCVYoMjksQjAsN0MsRDYpLAlcCisJVigzMSxBNCxCMixBRiksCVYoMkEsM0YsMjMsMzEpLAlWKEM2LEE1LDk0LDMwKSwJVigzNSxBMiw2NixDMCksCVwKKwlWKDc0LDRFLEJDLDM3KSwJVihGQyw4MixDQSxBNiksCVYoRTAsOTAsRDAsQjApLAlWKDMzLEE3LEQ4LDE1KSwJXAorCVYoRjEsMDQsOTgsNEEpLAlWKDQxLEVDLERBLEY3KSwJVig3RixDRCw1MCwwRSksCVYoMTcsOTEsRjYsMkYpLAlcCisJVig3Niw0RCxENiw4RCksCVYoNDMsRUYsQjAsNEQpLAlWKENDLEFBLDRELDU0KSwJVihFNCw5NiwwNCxERiksCVwKKwlWKDlFLEQxLEI1LEUzKSwJVig0Qyw2QSw4OCwxQiksCVYoQzEsMkMsMUYsQjgpLAlWKDQ2LDY1LDUxLDdGKSwJXAorCVYoOUQsNUUsRUEsMDQpLAlWKDAxLDhDLDM1LDVEKSwJVihGQSw4Nyw3NCw3MyksCVYoRkIsMEIsNDEsMkUpLAlcCisJVihCMyw2NywxRCw1QSksCVYoOTIsREIsRDIsNTIpLAlWKEU5LDEwLDU2LDMzKSwJVig2RCxENiw0NywxMyksCVwKKwlWKDlBLEQ3LDYxLDhDKSwJVigzNyxBMSwwQyw3QSksCVYoNTksRjgsMTQsOEUpLAlWKEVCLDEzLDNDLDg5KSwJXAorCVYoQ0UsQTksMjcsRUUpLAlWKEI3LDYxLEM5LDM1KSwJVihFMSwxQyxFNSxFRCksCVYoN0EsNDcsQjEsM0MpLAlcCisJVig5QyxEMixERiw1OSksCVYoNTUsRjIsNzMsM0YpLAlWKDE4LDE0LENFLDc5KSwJVig3MyxDNywzNyxCRiksCVwKKwlWKDUzLEY3LENELEVBKSwJVig1RixGRCxBQSw1QiksCVYoREYsM0QsNkYsMTQpLAlWKDc4LDQ0LERCLDg2KSwJXAorCVYoQ0EsQUYsRjMsODEpLAlWKEI5LDY4LEM0LDNFKSwJVigzOCwyNCwzNCwyQyksCVYoQzIsQTMsNDAsNUYpLAlcCisJVigxNiwxRCxDMyw3MiksCVYoQkMsRTIsMjUsMEMpLAlWKDI4LDNDLDQ5LDhCKSwJVihGRiwwRCw5NSw0MSksCVwKKwlWKDM5LEE4LDAxLDcxKSwJVigwOCwwQyxCMyxERSksCVYoRDgsQjQsRTQsOUMpLAlWKDY0LDU2LEMxLDkwKSwJXAorCVYoN0IsQ0IsODQsNjEpLAlWKEQ1LDMyLEI2LDcwKSwJVig0OCw2Qyw1Qyw3NCksCVYoRDAsQjgsNTcsNDIpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBSVDBbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIHVpbnQzMiBSVDFbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBSVDJbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBSVDNbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyN1bmRlZiBSVAorCisvKiByb3VuZCBjb25zdGFudHMgKi8KKworc3RhdGljIHVpbnQzMiBSQ09OWzEwXSA9Cit7CisJMHgwMTAwMDAwMCwJMHgwMjAwMDAwMCwJMHgwNDAwMDAwMCwJMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLAkweDIwMDAwMDAwLAkweDQwMDAwMDAwLAkweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsCTB4MzYwMDAwMDAKK307CisKKy8qIGtleSBzY2hlZHVsZQl0YWJsZXMgKi8KKworc3RhdGljIGludCBLVF9pbml0ID0gMTsKKworc3RhdGljIHVpbnQzMiBLVDBbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QxWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMlsyNTZdOworc3RhdGljIHVpbnQzMiBLVDNbMjU2XTsKKworLyogcGxhdGZvcm0taW5kZXBlbmRhbnQJMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uCW1hY3JvcyAqLworCisjZGVmaW5lCUdFVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkobikJPSAoCSh1aW50MzIpIChiKVsoaSkJXSA8PCAyNAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMV0gPDwgMTYJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAzXQkJKTsJCVwKK30KKworI2RlZmluZQlQVVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKGIpWyhpKQkgICBdID0gKHVpbnQ4KSAoIChuKSA+PgkyNCApOwkJXAorCShiKVsoaSkJKyAxXSA9ICh1aW50OCkgKCAobikgPj4JMTYgKTsJCVwKKwkoYilbKGkpCSsgMl0gPSAodWludDgpICggKG4pID4+CSA4ICk7CQlcCisJKGIpWyhpKQkrIDNdID0gKHVpbnQ4KSAoIChuKQkgICApOwkJXAorfQorCisvKiBBRVMga2V5IHNjaGVkdWxpbmcgcm91dGluZSAqLworCitpbnQJcnRtcF9hZXNfc2V0X2tleSggYWVzX2NvbnRleHQgKmN0eCwgdWludDggKmtleSwgaW50IG5iaXRzICkKK3sKKwlpbnQJaTsKKwl1aW50MzIgKlJLLAkqU0s7CisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJCWNhc2UgMTI4OiBjdHgtPm5yID0JMTA7CWJyZWFrOworCQljYXNlIDE5MjogY3R4LT5uciA9CTEyOwlicmVhazsKKwkJY2FzZSAyNTY6IGN0eC0+bnIgPQkxNDsJYnJlYWs7CisJCWRlZmF1bHQJOiByZXR1cm4oIDEJKTsKKwl9CisKKwlSSyA9IGN0eC0+ZXJrOworCisJZm9yKCBpID0gMDsJaSA8CShuYml0cyA+PiA1KTsgaSsrICkKKwl7CisJCUdFVF9VSU5UMzIoCVJLW2ldLCBrZXksCWkgKgk0ICk7CisJfQorCisJLyogc2V0dXAgZW5jcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJY2FzZSAxMjg6CisKKwkJZm9yKCBpID0gMDsJaSA8CTEwOwlpKyssIFJLCSs9IDQgKQorCQl7CisJCQlSS1s0XSAgPSBSS1swXSBeIFJDT05baV0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAxNiApIF0gPDwJMjQgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+ICA4ICkgXSA8PAkxNiApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10JCSApIF0gPDwJIDggKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXQkgICApOworCisJCQlSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOworCQkJUktbNl0gID0gUktbMl0gXiBSS1s1XTsKKwkJCVJLWzddICA9IFJLWzNdIF4gUktbNl07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE5MjoKKworCQlmb3IoIGkgPSAwOwlpIDwJODsgaSsrLAlSSyArPSA2CSkKKwkJeworCQkJUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8CTI0ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwJMTYgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdCQkgKSBdIDw8CSA4ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0JICAgKTsKKworCQkJUktbN10gID0gUktbMV0gXiBSS1s2XTsKKwkJCVJLWzhdICA9IFJLWzJdIF4gUktbN107CisJCQlSS1s5XSAgPSBSS1szXSBeIFJLWzhdOworCQkJUktbMTBdID0gUktbNF0gXiBSS1s5XTsKKwkJCVJLWzExXSA9IFJLWzVdIF4gUktbMTBdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAyNTY6CisKKwkJZm9yKCBpID0gMDsJaSA8CTc7IGkrKywJUksgKz0gOAkpCisJCXsKKwkJCVJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PAkyNCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8CTE2ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XQkJICkgXSA8PAkgOCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMjQgKSBdCSAgICk7CisKKwkJCVJLWzldICA9IFJLWzFdIF4gUktbOF07CisJCQlSS1sxMF0gPSBSS1syXSBeIFJLWzldOworCQkJUktbMTFdID0gUktbM10gXiBSS1sxMF07CisKKwkJCVJLWzEyXSA9IFJLWzRdIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDI0ICkJXSA8PCAyNAkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDE2ICkJXSA8PCAxNgkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+CTggKQldIDw8ICA4CSkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JCSAgKQldCQkpOworCisJCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKKwkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOworCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogc2V0dXAgZGVjcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlpZigJS1RfaW5pdAkpCisJeworCQlmb3IoIGkgPSAwOwlpIDwJMjU2OyBpKysgKQorCQl7CisJCQlLVDBbaV0gPSBSVDBbIEZTYltpXSBdOworCQkJS1QxW2ldID0gUlQxWyBGU2JbaV0gXTsKKwkJCUtUMltpXSA9IFJUMlsgRlNiW2ldIF07CisJCQlLVDNbaV0gPSBSVDNbIEZTYltpXSBdOworCQl9CisKKwkJS1RfaW5pdAk9IDA7CisJfQorCisJU0sgPSBjdHgtPmRyazsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlmb3IoIGkgPSAxOwlpIDwJY3R4LT5ucjsgaSsrICkKKwl7CisJCVJLIC09IDg7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisJfQorCisJUksgLT0gODsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlyZXR1cm4oCTAgKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZW5jcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRtcF9hZXNfZW5jcnlwdChhZXNfY29udGV4dCAqY3R4LCB1aW50OCBpbnB1dFsxNl0sCXVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5lcms7CisJR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOworCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKKwlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07CisJR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKKworI2RlZmluZQlBRVNfRlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gRlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gRlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTAJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gRlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gRlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTIJCSApIF07CVwKK30KKworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLworCisJaWYoCWN0eC0+bnIJPiAxMCApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCisJfQorCisJaWYoCWN0eC0+bnIJPiAxMiApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCisJfQorCisJLyogbGFzdAlyb3VuZCAqLworCisJUksgKz0gNDsKKworCVgwID0gUktbMF0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7CisKKwlYMSA9IFJLWzFdIF4gKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOworCisJWDIgPSBSS1syXSBeICggRlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgzID0gUktbM10gXiAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOworCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7CisJUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKKwlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOworfQorCisvKiBBRVMgMTI4LWJpdCBibG9jayBkZWNyeXB0aW9uCXJvdXRpbmUJKi8KKwordm9pZCBydG1wX2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5kcms7CisKKwlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07CisJR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOworCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKKwlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOworCisjZGVmaW5lCUFFU19SUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBSVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBSVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBSVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBSVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorfQorCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCisKKwlpZigJY3R4LT5ucgk+IDEwICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KKwl9CisKKwlpZigJY3R4LT5ucgk+IDEyICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KKwl9CisKKwkvKiBsYXN0CXJvdW5kICovCisKKwlSSyArPSA0OworCisJWDAgPSBSS1swXSBeICggUlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgxID0gUktbMV0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlYMiA9IFJLWzJdIF4gKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOworCisJWDMgPSBSS1szXSBeICggUlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKKworCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7CisJUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKKwlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOworCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTSEExIGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlITUFDX1NIQTEoCisJSU4JVUNIQVIJKnRleHQsCisJSU4JVUlOVAl0ZXh0X2xlbiwKKwlJTglVQ0hBUgkqa2V5LAorCUlOCVVJTlQJa2V5X2xlbiwKKwlJTglVQ0hBUgkqZGlnZXN0KQoreworCVNIQV9DVFgJY29udGV4dDsKKwlVQ0hBUglrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkCSovCisJVUNIQVIJa19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZAkqLworCUlOVAkJaTsKKworCS8vIGlmIGtleSBpcyBsb25nZXIJdGhhbiA2NAlieXRlcyByZXNldAlpdCB0byBrZXk9U0hBMShrZXkpCisJaWYgKGtleV9sZW4JPiA2NCkKKwl7CisJCVNIQV9DVFgJCSB0Y3R4OworCQlTSEFJbml0KCZ0Y3R4KTsKKwkJU0hBVXBkYXRlKCZ0Y3R4LCBrZXksIGtleV9sZW4pOworCQlTSEFGaW5hbCgmdGN0eCwJa2V5KTsKKwkJa2V5X2xlbgk9IDIwOworCX0KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsIHNpemVvZihrX29wYWQpKTsKKwlOZGlzTW92ZU1lbW9yeShrX2lwYWQsIGtleSwJa2V5X2xlbik7CisJTmRpc01vdmVNZW1vcnkoa19vcGFkLCBrZXksCWtleV9sZW4pOworCisJLy8gWE9SIGtleSB3aXRoCWlwYWQgYW5kIG9wYWQgdmFsdWVzCisJZm9yCShpID0gMDsJaSA8CTY0OwlpKyspCisJeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLy8gcGVyZm9ybSBpbm5lciBTSEExCisJU0hBSW5pdCgmY29udGV4dCk7IAkJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkJLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCXRleHQsIHRleHRfbGVuKTsJLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCisJU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJCS8qIGZpbmlzaCB1cCAxc3QgcGFzcyAqLworCisJLy9wZXJmb3JtIG91dGVyCVNIQTEKKwlTSEFJbml0KCZjb250ZXh0KTsJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMm5kIHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfb3BhZCwJNjQpOwkvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCVNIQVVwZGF0ZSgmY29udGV4dCwJZGlnZXN0LAkyMCk7CS8qCXRoZW4gcmVzdWx0cyBvZgkxc3QJaGFzaCAqLworCVNIQUZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOwkJCS8qIGZpbmlzaCB1cCAybmQgcGFzcyAqLworCit9CisKKy8qCisqIEYoUCwgUywgYywgaSkgPSBVMSB4b3IgVTIgeG9yIC4uLiBVYworKiBVMSA9IFBSRihQLCBTIHx8IEludChpKSkKKyogVTIgPSBQUkYoUCwgVTEpCisqIFVjID0gUFJGKFAsIFVjLTEpCisqLworCit2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCit7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMzZdLCBkaWdlc3QxW1NIQV9ESUdFU1RfTEVOXTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLworICAgIG1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjI0KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzFdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MTYpICYgMHhmZik7CisgICAgZGlnZXN0W3NzaWRsZW5ndGgrMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj44KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7CisgICAgSE1BQ19TSEExKGRpZ2VzdCwgc3NpZGxlbmd0aCs0LCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxKTsgLy8gZm9yIFdQQSB1cGRhdGUKKworICAgIC8qIG91dHB1dCA9IFUxICovCisgICAgbWVtY3B5KG91dHB1dCwgZGlnZXN0MSwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykKKyAgICB7CisgICAgICAgIC8qIFVuID0gUFJGKFAsIFVuLTEpICovCisgICAgICAgIEhNQUNfU0hBMShkaWdlc3QxLCBTSEFfRElHRVNUX0xFTiwgKHVuc2lnbmVkIGNoYXIqKSBwYXNzd29yZCwgKGludCkgc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0KTsgLy8gZm9yIFdQQSB1cGRhdGUKKyAgICAgICAgbWVtY3B5KGRpZ2VzdDEsIGRpZ2VzdCwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgICAgIC8qIG91dHB1dCA9IG91dHB1dCB4b3IgVW4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNIQV9ESUdFU1RfTEVOOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFtqXSBePSBkaWdlc3Rbal07CisgICAgICAgIH0KKyAgICB9Cit9CisvKgorKiBwYXNzd29yZCAtIGFzY2lpIHN0cmluZyB1cCB0byA2MyBjaGFyYWN0ZXJzIGluIGxlbmd0aAorKiBzc2lkIC0gb2N0ZXQgc3RyaW5nIHVwIHRvIDMyIG9jdGV0cworKiBzc2lkbGVuZ3RoIC0gbGVuZ3RoIG9mIHNzaWQgaW4gb2N0ZXRzCisqIG91dHB1dCBtdXN0IGJlIDQwIG9jdGV0cyBpbiBsZW5ndGggYW5kIG91dHB1dHMgMjU2IGJpdHMgb2Yga2V5CisqLworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKK3sKKyAgICBpZiAoKHN0cmxlbihwYXNzd29yZCkgPiA2MykgfHwgKHNzaWRsZW5ndGggPiAzMikpCisgICAgICAgIHJldHVybiAwOworCisgICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMSwgb3V0cHV0KTsKKyAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAyLCAmb3V0cHV0W1NIQV9ESUdFU1RfTEVOXSk7CisgICAgcmV0dXJuIDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWxtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODJjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9tbG1lLmMKQEAgLTAsMCArMSw4NjA5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1sbWUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOC0yNQkJTW9kaWZ5IGZyb20gUlQyNTAwIGNvZGUgYmFzZQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wNgkJbW9kaWZpZWQgZm9yIFJUMjYwMAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitVQ0hBUglDSVNDT19PVUlbXSA9IHsweDAwLCAweDQwLCAweDk2fTsKKworVUNIQVIJV1BBX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OworVUNIQVIJUlNOX09VSVtdID0gezB4MDAsIDB4MGYsIDB4YWN9OworVUNIQVIJV0FQSV9PVUlbXSA9IHsweDAwLCAweDE0LCAweDcyfTsKK1VDSEFSICAgV01FX0lORk9fRUxFTVtdICA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKK1VDSEFSICAgV01FX1BBUk1fRUxFTVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDF9OworVUNIQVIJQ2N4MlFvc0luZm9bXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDA0fTsKK1VDSEFSICAgUkFMSU5LX09VSVtdICA9IHsweDAwLCAweDBjLCAweDQzfTsKK1VDSEFSICAgQlJPQURDT01fT1VJW10gID0gezB4MDAsIDB4OTAsIDB4NGN9OworVUNIQVIgICBXUFNfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwNH07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUglQUkVfTl9IVF9PVUlbXQk9IHsweDAwLCAweDkwLCAweDRjfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKKyAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAorICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwNCwgMHgwMywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDEwLCAgMiwgMjAsIDM1LAorICAgIDB4MDUsIDB4MTAsICAzLCAxNiwgMzUsCisgICAgMHgwNiwgMHgxMCwgIDQsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNSwgMTYsIDI1LAorICAgIDB4MDgsIDB4MTAsICA2LCAxMCwgMjUsCisgICAgMHgwOSwgMHgxMCwgIDcsIDEwLCAxMywKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MDgsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDEwLCAgMCwgMjAsIDEwMSwKKyAgICAweDAxLCAweDEwLCAgMSwgMjAsIDM1LAorICAgIDB4MDIsIDB4MTAsICAyLCAyMCwgMzUsCisgICAgMHgwMywgMHgxMCwgIDMsIDE2LCAzNSwKKyAgICAweDA0LCAweDEwLCAgNCwgMTAsIDI1LAorICAgIDB4MDUsIDB4MTAsICA1LCAxNiwgMjUsCisgICAgMHgwNiwgMHgxMCwgIDYsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNywgMTAsIDEzLAorfTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDA5LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MDYsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwNywgMHgyMSwgIDcsICA4LCAxNCwKKyAgICAweDA4LCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOM1NbXSA9IHsKKy8vIEl0ZW0gTm8uCU1vZGUJQ3Vyci1NQ1MJVHJhaW5VcAlUcmFpbkRvd24JLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGQsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAxNCwKKwkweDBjLCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAyMCwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCA1MCwKKyNpZiAxCisgICAgMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAyMywgIDgsIDI1LAorI2Vsc2UgLy8gZm9yIFJUMjg2MCAyKjMgdGVzdAorICAgIDB4MDUsIDB4MjAsIDEyLCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKKyNlbmRpZgorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGMsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA4LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwYSwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDBiLCAweDIyLCAyMywgIDgsIDI1LAorfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworUFVDSEFSIFJlYXNvblN0cmluZ1tdID0geworCS8qIDAgICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEgICovCSAiVW5zcGVjaWZpZWQgUmVhc29uIiwKKwkvKiAyICAqLwkgIlByZXZpb3VzIEF1dGggbm8gbG9uZ2VyIHZhbGlkIiwKKwkvKiAzICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAorCS8qIDQgICovCSAiRElTLUFTU09DIGR1ZSB0byBpbmFjdGl2aXR5IiwKKwkvKiA1ICAqLwkgIkFQIHVuYWJsZSB0byBoYW5sZSBhbGwgYXNzb2NpYXRpb25zIiwKKwkvKiA2ICAqLwkgImNsYXNzIDIgZXJyb3IiLAorCS8qIDcgICovCSAiY2xhc3MgMyBlcnJvciIsCisJLyogOCAgKi8JICJTVEEgaXMgbGVhdmluZyAvIGhhcyBsZWZ0IiwKKwkvKiA5ICAqLwkgInJlcXVpcmUgYXV0aCBiZWZvcmUgYXNzb2MvcmUtYXNzb2MiLAorCS8qIDEwICovCSAiUmVzZXJ2ZWQiLAorCS8qIDExICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEyICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEzICovCSAiaW52YWxpZCBJRSIsCisJLyogMTQgKi8JICJNSUMgZXJyb3IiLAorCS8qIDE1ICovCSAiNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE2ICovCSAiMi13YXkgKGdyb3VwIGtleSkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE3ICovCSAiNC13YXkgaGFuZHNoYWtlIElFIGRpZmYgYW1vbmcgQXNzb3NSZXEvUnNwL0JlYWNvbiIsCisJLyogMTggKi8KK307CisKK2V4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKKy8vIHNpbmNlIFJUNjEgaGFzIGJldHRlciBSWCBzZW5zaWJpbGl0eSwgd2UgaGF2ZSB0byBsaW1pdCBUWCBBQ0sgcmF0ZSBub3QgdG8gZXhjZWVkIG91ciBub3JtYWwgZGF0YSBUWCByYXRlLgorLy8gb3RoZXJ3aXNlIHRoZSBXTEFOIHBlZXIgbWF5IG5vdCBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIEFDSyB0aHVzIGRvd25ncmFkZSBpdHMgZGF0YSBUWCByYXRlCitVTE9ORyBCYXNpY1JhdGVNYXNrWzEyXQkJCQk9IHsweGZmZmZmMDAxIC8qIDEtTWJwcyAqLywgMHhmZmZmZjAwMyAvKiAyIE1icHMgKi8sIDB4ZmZmZmYwMDcgLyogNS41ICovLCAweGZmZmZmMDBmIC8qIDExICovLAorCQkJCQkJCQkJICAweGZmZmZmMDFmIC8qIDYgKi8JICwgMHhmZmZmZjAzZiAvKiA5ICovCSAgLCAweGZmZmZmMDdmIC8qIDEyICovICwgMHhmZmZmZjBmZiAvKiAxOCAqLywKKwkJCQkJCQkJCSAgMHhmZmZmZjFmZiAvKiAyNCAqLwkgLCAweGZmZmZmM2ZmIC8qIDM2ICovCSAgLCAweGZmZmZmN2ZmIC8qIDQ4ICovICwgMHhmZmZmZmZmZiAvKiA1NCAqL307CisKK1VDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHgxLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CitVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dICA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgorLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgorLy8JCWNsZWFuIGVudmlyb25tZW50LgorLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAorQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07CisKK1VDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKK1VTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07CisKK1VDSEFSICBTc2lkSWUJID0gSUVfU1NJRDsKK1VDSEFSICBTdXBSYXRlSWUgPSBJRV9TVVBQX1JBVEVTOworVUNIQVIgIEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgIEh0Q2FwSWUgPSBJRV9IVF9DQVA7CitVQ0hBUiAgQWRkSHRJbmZvSWUgPSBJRV9BRERfSFQ7CitVQ0hBUiAgTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitVQ0hBUiAgRXh0SHRDYXBJZSA9IElFX0VYVF9DQVBBQklMSVRZOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK1VDSEFSICBFcnBJZQkgPSBJRV9FUlA7CitVQ0hBUiAgRHNJZSAJID0gSUVfRFNfUEFSTTsKK1VDSEFSICBUaW1JZQkgPSBJRV9USU07CitVQ0hBUiAgV3BhSWUJID0gSUVfV1BBOworVUNIQVIgIFdwYTJJZQkgPSBJRV9XUEEyOworVUNIQVIgIElic3NJZQkgPSBJRV9JQlNTX1BBUk07CitVQ0hBUiAgQ2N4MkllCSA9IElFX0NDWF9WMjsKK1VDSEFSICBXYXBpSWUJID0gSUVfV0FQSTsKKworZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKKworVUNIQVIJU0VTX09VSVtdID0gezB4MDAsIDB4OTAsIDB4NGN9OworCitVQ0hBUglaZXJvU3NpZFszMl0gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKKworLy8gUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzCitSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXSA9IHsKKy8vCQljaAkgUjEgCQkgUjIgCQkgUjMoVFgwfjQ9MCkgUjQKKwkJezEsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifSwKKwkJezIsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezMsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezQsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezUsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezYsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezcsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezgsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezksICAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEyLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfSwKKworCQkvLyA4MDIuMTEgVU5JIC8gSHlwZXJMYW4gMgorCQl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NDgsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOWJ9LAorCQl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NTYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NjQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LCAvLyBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuCisKKwkJLy8gODAyLjExIEh5cGVyTGFuIDIKKwkJezEwMCwgMHg5ODQwMmVjOCwgMHg5ODRjMDZiMiwgMHg5ODE3OGE1NSwgMHg5ODBlZDc4M30sCisKKwkJLy8gMjAwOC4wNC4zMCBtb2RpZmllZAorCQkvLyBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZQorCQkvLyBmb3IgY2hhbm5lbCAxMDIgdG8gMTA4IGZvciB0aGUgUlQyODUwL1JUMjc1MCBkdWFsIGJhbmQgc29sdXRpb24uCisJCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9LAorCQl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEwOCwgMHg5ODQwMmVjYywgMHg5ODVjMGEzMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDE5M30sCisKKwkJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisJCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAorCQl7MTE2LCAweDk4NDAyZWNjLCAweDk4NGMwYTNhLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCisJCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAorCQl7MTI0LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKKwkJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0sIC8vIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNworCQl7MTI4LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAorCQl7MTM2LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKKwkJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisKKwkJLy8gODAyLjExIFVOSUkKKwkJezE0OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCisJCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAorCQl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfSwKKwkJezE1NywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Zn0sCisJCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAorCQl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKKwkJezE2NSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5N30sCisKKwkJLy8gSmFwYW4KKwkJezE4NCwgMHg5NTAwMmNjYywgMHg5NTAwNDkxZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEwYn0sCisJCXsxODgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjIsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MTkyLCAweDk1MDAyY2NjLCAweDk1MDA0OTI2LCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezE5NiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisJCXsyMDgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2EsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MjEyLCAweDk1MDAyY2NjLCAweDk1MDA0OTNlLCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezIxNiwgMHg5NTAwMmNjYywgMHg5NTAwNDk4MiwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisKKwkJLy8gc3RpbGwgbGFjayBvZiBNTUFDKEphcGFuKSBjaCAzNCwzOCw0Miw0NgorfTsKK1VDSEFSCU5VTV9PRl8yODUwX0NITkwgPSAoc2l6ZW9mKFJGMjg1MFJlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JGX1JFR1MpKTsKKworRlJFUVVFTkNZX0lURU0gRnJlcUl0ZW1zMzAyMFtdID0KK3sKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8gSVNNIDogMi40IHRvIDIuNDgzIEdIeiAgICAgICAgICAgICAgICAgICAgICAgICAvLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyAxMWcKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8tQ0gtLS1OLS0tLS0tLVItLS1LLS0tLS0tLS0tLS0KKwl7MSwgICAgMjQxLCAgMiwgIDJ9LAorCXsyLCAgICAyNDEsCSAyLCAgN30sCisJezMsICAgIDI0MiwJIDIsICAyfSwKKwl7NCwgICAgMjQyLAkgMiwgIDd9LAorCXs1LCAgICAyNDMsCSAyLCAgMn0sCisJezYsICAgIDI0MywJIDIsICA3fSwKKwl7NywgICAgMjQ0LAkgMiwgIDJ9LAorCXs4LCAgICAyNDQsCSAyLCAgN30sCisJezksICAgIDI0NSwJIDIsICAyfSwKKwl7MTAsICAgMjQ1LAkgMiwgIDd9LAorCXsxMSwgICAyNDYsCSAyLCAgMn0sCisJezEyLCAgIDI0NiwJIDIsICA3fSwKKwl7MTMsICAgMjQ3LAkgMiwgIDJ9LAorCXsxNCwgICAyNDgsCSAyLCAgNH0sCit9OworI2RlZmluZQlOVU1fT0ZfMzAyMF9DSE5MCShzaXplb2YoRnJlcUl0ZW1zMzAyMCkgLyBzaXplb2YoRlJFUVVFTkNZX0lURU0pKQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWluaXRpYWxpemUgdGhlIE1MTUUgdGFzayBhbmQgaXRzIGRhdGEgc3RydWN0dXJlIChxdWV1ZSwgc3BpbmxvY2ssCisJCXRpbWVyLCBzdGF0ZSBtYWNoaW5lcykuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJUmV0dXJuOgorCQlhbHdheXMgcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTWxtZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBNTE1FIEluaXRpYWxpemVcbiIpKTsKKworCWRvCisJeworCQlTdGF0dXMgPSBNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOworCQlpZihTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisKKwkJCS8vIGluaXQgU1RBIHN0YXRlIG1hY2hpbmVzCisJCQlBc3NvY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgcEFkLT5NbG1lLkFzc29jRnVuYyk7CisJCQlBdXRoU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoRnVuYyk7CisJCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoUnNwRnVuYyk7CisJCQlTeW5jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIHBBZC0+TWxtZS5TeW5jRnVuYyk7CisJCQlXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBwQWQtPk1sbWUuV3BhUHNrRnVuYyk7CisJCQlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIHBBZC0+TWxtZS5BaXJvbmV0RnVuYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCURsc1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIHBBZC0+TWxtZS5EbHNGdW5jKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCisJCQkvLyBTaW5jZSB3ZSBhcmUgdXNpbmcgc3dpdGNoL2Nhc2UgdG8gaW1wbGVtZW50IGl0LCB0aGUgaW5pdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUKKwkJCS8vIHN0YXRlIG1hY2hpbmUgaW5pdAorCQkJTWxtZUNudGxJbml0KHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwkJQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgcEFkLT5NbG1lLkFjdEZ1bmMpOworCisJCS8vIEluaXQgbWxtZSBwZXJpb2RpYyB0aW1lcgorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyksIHBBZCwgVFJVRSk7CisKKwkJLy8gU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CisKKwkJLy8gc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwgRkFMU0UpOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE1MTUUgSW5pdGlhbGl6ZVxuIikpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltYWluIGxvb3Agb2YgdGhlIE1MTUUKKwlQcmU6CisJCU1sbWUgaGFzIHRvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlcmUgYXJlIHNvbWV0aGluZyBpbnNpZGUgdGhlIHF1ZXVlCisJTm90ZToKKwkJVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gTVBTZXRJbmZvcm1hdGlvbiBhbmQgTVBSZWNlaXZlOworCQlUaGlzIHRhc2sgZ3VhcmFudGVlIG9ubHkgb25lIE1sbWVIYW5kbGVyIHdpbGwgcnVuLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfUVVFVUVfRUxFTSAJICAgKkVsZW0gPSBOVUxMOworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKwlTSE9SVCBhcGNsaUlmSW5kZXg7CisjZW5kaWYKKworCS8vIE9ubHkgYWNjZXB0IE1MTUUgYW5kIEZyYW1lIGZyb20gcGVlciBzaWRlLCBubyBvdGhlciAoY29udHJvbC9kYXRhKSBmcmFtZSBzaG91bGQKKwkvLyBnZXQgaW50byB0aGlzIHN0YXRlIG1hY2hpbmUKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJaWYocEFkLT5NbG1lLmJSdW5uaW5nKQorCXsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZXZpY2UgSGFsdGVkIG9yIFJlbW92ZWQgb3IgTWxtZVJlc3QsIGV4aXQgTWxtZUhhbmRsZXIhIChxdWV1ZSBudW0gPSAlbGQpXG4iLCBwQWQtPk1sbWUuUXVldWUuTnVtKSk7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgUkFMSU5LX0FURQorCQlpZihBVEVfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3cgaW4gTWxtZUhhbmRsZXJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCisJCXsKKyNpZmRlZiBSVDI4NzAKKwkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRVNFVF9DT05GKQorCQkJeworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkJCU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHBBZCk7CisJCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKKwkJCQlFbGVtLT5Nc2dMZW4gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJCQkvLyBpZiBkZXF1ZXVlIHN1Y2Nlc3MKKwkJCXN3aXRjaCAoRWxlbS0+TWFjaGluZSkKKwkJCXsKKwkJCQkvLyBTVEEgc3RhdGUgbWFjaGluZXMKKyNpZmRlZglDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQljYXNlIEFTU09DX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUSF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUSF9SU1BfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNZTkNfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FOgorCQkJCQlNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgV1BBX1BTS19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJY2FzZSBMRUFQX1NUQVRFX01BQ0hJTkU6CisJCQkJCUxlYXBNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuTGVhcE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCWNhc2UgQUlST05FVF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJY2FzZSBETFNfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuRGxzTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJY2FzZSBBQ1RJT05fU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCisKKworCisJCQkJZGVmYXVsdDoKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRVJST1I6IElsbGVnYWwgbWFjaGluZSAlbGQgaW4gTWxtZUhhbmRsZXIoKVxuIiwgRWxlbS0+TWFjaGluZSkpOworCQkJCQlicmVhazsKKwkJCX0gLy8gZW5kIG9mIHN3aXRjaAorCisJCQkvLyBmcmVlIE1MTUUgZWxlbWVudAorCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKKwkJCUVsZW0tPk1zZ0xlbiA9IDA7CisKKwkJfQorCQllbHNlIHsKKwkJCURCR1BSSU5UX0VSUigoIk1sbWVIYW5kbGVyOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKKwkJfQorCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlEZXN0cnVjdG9yIG9mIE1MTUUgKERlc3Ryb3kgcXVldWUsIHN0YXRlIG1hY2hpbmUsIHNwaW4gbG9jayBhbmQgdGltZXIpCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIE5JQyBBZGFwdGVyIHBvaW50ZXIKKwlQb3N0OgorCQlUaGUgTUxNRSB0YXNrIHdpbGwgbm8gbG9uZ2VyIHdvcmsgcHJvcGVybHkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVIYWx0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJPT0xFQU4gCSAgQ2FuY2VsbGVkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVIYWx0XG4iKSk7CisKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCS8vIGRpc2FibGUgQkVBQ09OIGdlbmVyYXRpb24gYW5kIG90aGVyIEJFQUNPTiByZWxhdGVkIGhhcmR3YXJlIHRpbWVycworCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJVUNIQVIJCWk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCS8vIENhbmNlbCBwZW5kaW5nIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLAkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwJCSZDYW5jZWxsZWQpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwJCSZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAkJJkNhbmNlbGxlZCk7CisKKworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQkvLyBTZXQgTEVECisJCVJUTVBTZXRMRUQocEFkLCBMRURfSEFMVCk7CisgICAgICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KKyNpZmRlZiBSVDI4NzAKKyAgICAgICAgeworICAgICAgICAgICAgTEVEX0NGR19TVFJVQyBMZWRDZmc7CisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIExFRF9DRkcsICZMZWRDZmcud29yZCk7CisgICAgICAgICAgICBMZWRDZmcuZmllbGQuTGVkUG9sYXIgPSAwOworICAgICAgICAgICAgTGVkQ2ZnLmZpZWxkLlJMZWRNb2RlID0gMDsKKyAgICAgICAgICAgIExlZENmZy5maWVsZC5HTGVkTW9kZSA9IDA7CisgICAgICAgICAgICBMZWRDZmcuZmllbGQuWUxlZE1vZGUgPSAwOworICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTEVEX0NGRywgTGVkQ2ZnLndvcmQpOworICAgICAgICB9CisjZW5kaWYgLy8gUlQyODcwIC8vCisJfQorCisJUlRNUHVzZWNEZWxheSg1MDAwKTsgICAgLy8gIDUgbXNlYyB0byBndXJhbnRlZSBBbnQgRGl2ZXJzaXR5IHRpbWVyIGNhbmNlbGVkCisKKwlNbG1lUXVldWVEZXN0cm95KCZwQWQtPk1sbWUuUXVldWUpOworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUhhbHRcbiIpKTsKK30KKworVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKwlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNSeE9rRGF0YUNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQ7CisJLy8gY2xlYXIgYWxsIE9uZVNlY3h4eCBjb3VudGVycy4KKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250ID0gMDsKKworCS8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JFXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JLXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZJXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZPXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JFXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JLXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZJXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZPXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeENvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4QWdncmVnYXRpb25Db3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQgPSAwOworCisJcmV0dXJuOworfQorCit1bnNpZ25lZCBsb25nIHJ4X0FNU0RVOwordW5zaWduZWQgbG9uZyByeF9Ub3RhbDsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgaXMgZXhlY3V0ZWQgcGVyaW9kaWNhbGx5IHRvIC0KKwkJMS4gRGVjaWRlIGlmIGl0J3MgYSByaWdodCB0aW1lIHRvIHR1cm4gb24gUHdyTWdtdCBiaXQgb2YgYWxsCisJCSAgIG91dGdvaWluZyBmcmFtZXMKKwkJMi4gQ2FsY3VsYXRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uIHN0YXRpc3RpY3Mgb2YgdGhlIGxhc3QKKwkJICAgcGVyaW9kLCBzbyB0aGF0IFRYIHJhdGUgd29uJ3QgdG9nZ2xpbmcgdmVyeSBmcmVxdWVudGx5IGJldHdlZW4gYQorCQkgICBzdWNjZXNzZnVsIFRYIGFuZCBhIGZhaWxlZCBUWC4KKwkJMy4gSWYgdGhlIGNhbGN1bGF0ZWQgQ2hhbm5lbFF1YWxpdHkgaW5kaWNhdGVkIGN1cnJlbnQgY29ubmVjdGlvbiBub3QKKwkJICAgaGVhbHRoeSwgdGhlbiBhIFJPQU1pbmcgYXR0ZW1wdCBpcyB0cmllZCBoZXJlLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjZGVmaW5lIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUJCSg4Kk9TX0haKSAgLy8gOCBzZWMKK1ZPSUQgTWxtZVBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJVUxPTkcJCQlUeFRvdGFsQ250OworCVBSVE1QX0FEQVBURVIJcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKSkKKwkJcmV0dXJuOworCisJUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8qIERvIG5vdCBzaG93IFJTU0kgdW50aWwgIk5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYyIuICovCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgIT0gKE1MTUVfVEFTS19FWEVDX01VTFRJUExFIC0gMSkpCisJeworCQkJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICYgMHgxKQorCQl7CisJCQkvLyBUaGlzIGlzIHRoZSBmaXggZm9yIHdpZmkgMTFuIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIHRlc3QgY2FzZS4gIGZvciAyODYwRAorCQkJaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpICYmCisJCQkJKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPT0gRkFMU0UpKQorCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0QmYpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBUUlVFOworCQkJCX0KKwkJCQllbHNlIGlmICgoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCisJCQkJCQkoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSkKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjQzZik7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IEZBTFNFOworCQkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKKworLy8JUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKKworCS8vIGV4ZWN1dGUgZXZlcnkgNTAwbXMKKwlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgNSA9PSAwKSAmJiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjayhwQWQpLyooT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkqLykKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vIHBlcmZvcm0gZHluYW1pYyB0eCByYXRlIHN3aXRjaGluZyBiYXNlZCBvbiBwYXN0IFRYIGhpc3RvcnkKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJCQkJKQorCQkJCSYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkpCisJCQkJTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcocEFkKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIE5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYy4KKwlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJU1MTUVfVEFTS19FWEVDX01VTFRJUExFID09IDApCisJeworICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICsrOworCisjaWZkZWYgUkFMSU5LX0FURQorICAgIAlpZiAoQVRFX09OKHBBZCkpCisgICAgCXsKKwkJCS8qIHJlcXVlc3QgZnJvbSBCYXJvbiA6IG1vdmUgdGhpcyByb3V0aW5lIGZyb20gbGF0ZXIgdG8gaGVyZSAqLworCQkJLyogZm9yIHNob3dpbmcgUnggZXJyb3IgY291bnQgaW4gQVRFIFJYRlJBTUUgKi8KKyAgICAgICAgICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CisJCQlpZiAocEFkLT5hdGUuYlJ4RmVyID09IDEpCisJCQl7CisJCQkJcEFkLT5hdGUuUnhUb3RhbENudCArPSBwQWQtPmF0ZS5SeENudFBlclNlYzsKKwkJCSAgICBhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggcGFja2V0IGNudCA9ICVkLyVkXG4iLCBwQWQtPmF0ZS5SeENudFBlclNlYywgcEFkLT5hdGUuUnhUb3RhbENudCk7CisJCQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMgPSAwOworCisJCQkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaTA9JWQsIEF2Z1Jzc2kxPSVkLCBBdmdSc3NpMj0lZFxuXG4iLAorCQkJCQkJcEFkLT5hdGUuQXZnUnNzaTAsIHBBZC0+YXRlLkF2Z1Jzc2kxLCBwQWQtPmF0ZS5BdmdSc3NpMik7CisJCQkJZWxzZQorCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaT0lZFxuXG4iLCBwQWQtPmF0ZS5BdmdSc3NpMCk7CisJCQl9CisJCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOworCQkJcmV0dXJuOworICAgIAl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKwkJaWYgKHJ4X1RvdGFsKQorCQl7CisKKwkJCS8vIHJlc2V0IGNvdW50ZXJzCisJCQlyeF9BTVNEVSA9IDA7CisJCQlyeF9Ub3RhbCA9IDA7CisJCX0KKworCQkvL09SSUJBVGltZXJUaW1lb3V0KHBBZCk7CisKKwkJLy8gTWVkaWEgc3RhdHVzIGNoYW5nZWQsIHJlcG9ydCB0byBORElTCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKSkKKwkJeworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJCQl9CisJCX0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTm93MzIpOworCisJCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSB2YXJpYWJsZSwgc28gdGhhdAorCQkvLyB0aGUgZHluYW1pYyB0dW5pbmcgbWVjaGFuaXNtIGJlbG93IGFyZSBiYXNlZCBvbiBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwkJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKworI2lmZGVmIFJUMjg3MAorCQlSVDI4NzBfV2F0Y2hEb2cocEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgCQkvLyBOZWVkIHN0YXRpc3RpY3MgYWZ0ZXIgcmVhZCBjb3VudGVyLiBTbyBwdXQgYWZ0ZXIgTklDVXBkYXRlUmF3Q291bnRlcnMKKwkJT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBpZiBNR01UIFJJTkcgaXMgZnVsbCBtb3JlIHRoYW4gdHdpY2Ugd2l0aGluIDEgc2Vjb25kLCB3ZSBjb25zaWRlciB0aGVyZSdzCisJCS8vIGEgaGFyZHdhcmUgcHJvYmxlbSBzdHVja2luZyB0aGUgVFggcGF0aC4gSW4gdGhpcyBjYXNlLCB0cnkgYSBoYXJkd2FyZSByZXNldAorCQkvLyB0byByZWNvdmVyIHRoZSBzeXN0ZW0KKwkvLwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCA+PSAyKQorCS8vCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUik7CisJLy8JZWxzZQorCS8vCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsKKworCQkvLyBUaGUgdGltZSBwZXJpb2QgZm9yIGNoZWNraW5nIGFudGVubmEgaXMgYWNjb3JkaW5nIHRvIHRyYWZmaWMKKwkJaWYgKHBBZC0+TWxtZS5iRW5hYmxlQXV0b0FudGVubmFDaGVjaykKKwkJeworCQkJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCA+IDUwKQorCQkJeworCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwID09IDApCisJCQkJeworCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAzID09IDApCisJCQkJeworCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkJCX0KKwkJCX0KKwkJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlTVEFNbG1lUGVyaW9kaWNFeGVjKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMocEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQl7CisJCQkJLy8gV2hlbiBBZGhvYyBiZWFjb24gaXMgZW5hYmxlZCBhbmQgUlRTL0NUUyBpcyBlbmFibGVkLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGhhcmR3YXJlIE1BQyBGU00gd2lsbCBydW4gaW50byBhIGRlYWRsb2NrCisJCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KKwkJCQkvLyBTb2Z0d2FyZSBQYXRjaCBTb2x1dGlvbjoKKwkJCQkvLyAxLiBQb2xsaW5nIGRlYnVnIHN0YXRlIHJlZ2lzdGVyIDB4MTBGNCBldmVyeSBvbmUgc2Vjb25kLgorCQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgorCQkJCS8vIDMuIElmIHRoZSBkZWFkbG9jayBvY2N1cnJlZCwgcmVzZXQgTUFDL0JCUCBieSBzZXR0aW5nIDB4MTAwNCB0byAweDAwMDEgZm9yIGEgd2hpbGUgdGhlbiBzZXR0aW5nIGl0IGJhY2sgdG8gMHgwMDBDIGFnYWluLgorCisJCQkJVUlOVDMyCU1hY1JlZyA9IDA7CisKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTBGNCwgJk1hY1JlZyk7CisJCQkJaWYgKCgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4ODApKSB8fCAoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDIwKSkpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoMSk7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhDKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCisJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCisJUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJVHhUb3RhbENudDsKKwlpbnQgCWk7CisKKy8vCisvLyBXZSByZXR1cm4gaGVyZSBpbiBBVEUgbW9kZSwgYmVjYXVzZSB0aGUgc3RhdGlzdGljcworLy8gdGhhdCBBVEUgbmVlZHMgYXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoaXMgcm91dGluZS4KKy8vCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIEl0IGlzIHN1cHBvc2VkIHRoYXQgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlIGluIEFURSBtb2RlLgorCUFTU0VSVCghKEFURV9PTihwQWQpKSk7CisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgeworICAgIAkvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJiAocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCisgICAgCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgIH0KKworICAgIGlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKSAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJcEFkLT5QcmVNZWRpYVN0YXRlID0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGU7CisJfQorCisKKworCisgICAJQXNpY1N0YUJicFR1bmluZyhwQWQpOworCisJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJLy8gdXBkYXRlIGNoYW5uZWwgcXVhbGl0eSBmb3IgUm9hbWluZyBhbmQgVUkgTGlua1F1YWxpdHkgZGlzcGxheQorCQlNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCX0KKworCS8vIG11c3QgYmUgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKSBiZWNhdXNlIGl0IG5lZWRzIHRvIGtub3cgaWYKKwkvLyBSYWRpbyBpcyBjdXJyZW50bHkgaW4gbm9pc3kgZW52aXJvbm1lbnQKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCUFzaWNBZGp1c3RUeFBvd2VyKHBBZCk7CisKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIENoZWNrIERMUyB0aW1lIG91dCwgdGhlbiB0ZWFyIGRvd24gdGhvc2Ugc2Vzc2lvbgorCQlSVE1QQ2hlY2tETFNUaW1lT3V0KHBBZCk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8KKwkJLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OworCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIDEqT1NfSFogPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCisJCQkoKFR4VG90YWxDbnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPCA2MDApKSkKKwkJeworCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKSk7CisJCX0KKworICAgICAgICAvL2lmICgocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID09IDApICYmCisgICAgICAgIC8vICAgIChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID09IDApKQorICAgICAgICB7CisgICAgCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorICAgIAkJeworICAgIAkJICAgIC8vIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIwKSA9PSA4KQorICAgIAkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisgICAgCQl9CisgICAgCQllbHNlCisgICAgCQl7CisgICAgCQkgICAgLy8gU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwKSA9PSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorICAgIAkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisJCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAJCX0KKyAgICAgICAgfQorCisJCWlmIChDUUlfSVNfREVBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSA9IHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWU7CisKKwkJCS8vIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudAorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQkJeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJLy8gUlRNUFBhdGNoTWFjQmJwQnVnKHBBZCk7CisJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCX0KKwkJZWxzZSBpZiAoQ1FJX0lTX0JBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9CisKKwkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZworCQlpZiAocEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKQorCQl7CisJCQlTSE9SVAlkQm1Ub1JvYW0gPSAoU0hPUlQpcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIChDSEFSKWRCbVRvUm9hbSkpOworCisJCQlpZiAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSA8PSAoQ0hBUilkQm1Ub1JvYW0pCisJCQl7CisJCQkJTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJeworCQkvL3JhZGFyIGRldGVjdAorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJeworCQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOworCQl9CisKKwkJLy8gSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlCisJCS8vIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuCisJCS8vIGpvaW4gbGF0ZXIuCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUgPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXsKKwkJCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gZXhjZXNzaXZlIEJFQUNPTiBsb3N0LCBsYXN0IFNUQSBpbiB0aGlzIElCU1MsIE1lZGlhU3RhdGU9RGlzY29ubmVjdGVkXG4iKSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCisJCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCQl7CisJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSA8IHBBZC0+TWxtZS5Ob3czMikKKwkJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisJCX0KKwl9CisJZWxzZSAvLyBubyBJTkZSQSBub3IgQURIT0MgY29ubmVjdGlvbgorCXsKKworCQlpZiAocEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSAmJgorICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAzMCAqIE9TX0haKSA+IHBBZC0+TWxtZS5Ob3czMikpCisJCQlnb3RvIFNLSVBfQVVUT19TQ0FOX0NPTk47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpCisJCQkmJiBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApCisJCQkmJiAoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJCXsKKwkJCWlmICgocEFkLT5TY2FuVGFiLkJzc05yPT0wKSAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQorCQkJeworCQkJCU1MTUVfU0NBTl9SRVFfU1RSVUNUCSAgIFNjYW5SZXE7CisKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBTWxtZVBlcmlvZGljRXhlYygpOkNOVEwgLSBTY2FuVGFiLkJzc05yPT0wLCBzdGFydCBhIG5ldyBBQ1RJVkUgc2NhbiBTU0lEWyVzXVxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKSk7CisJCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCQkJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykJLy8gUXVpdCB0aGUgZm9yZXZlciBzY2FuIHdoZW4gaW4gYSB2ZXJ5IGNsZWFuIHJvb20KKwkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApCisJCQkJeworCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNSkgPT0gMSkKKwkJCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK1NLSVBfQVVUT19TQ0FOX0NPTk46CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCAhPTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IEZBTFNFKSkKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBUUlVFOworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKwllbHNlIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwID09MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gVFJVRSkpCisJeworCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gRkFMU0U7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApKQorCQlUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZShwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXJldHVybjsKK30KKworLy8gTGluayBkb3duIHJlcG9ydAorVk9JRCBMaW5rRG93bkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lQXV0b1NjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkJCTAsCisJCQkJCU5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKworCisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAmJgorCQkoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJeworCQlORElTXzgwMl8xMV9TU0lEIE9pZFNzaWQ7CisJCU9pZFNzaWQuU3NpZExlbmd0aCA9IHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkoT2lkU3NpZC5Tc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9TU0lEIHNldHRpbmcgLSAlcywgbGVuIC0gJWRcbiIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfU1NJRCwKKwkJCQkJc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorCQkJCQkmT2lkU3NpZCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlWYWxpZGF0ZSBTU0lEIGZvciBjb25uZWN0aW9uIHRyeSBhbmQgcmVzY2FuIHB1cnBvc2UKKwlWYWxpZCBTU0lEIHdpbGwgaGF2ZSB2aXNpYmxlIGNoYXJzIG9ubHkuCisJVGhlIHZhbGlkIGxlbmd0aCBpcyBmcm9tIDAgdG8gMzIuCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAorCUlOIFBVQ0hBUglwU3NpZCwKKwlJTiBVQ0hBUglTc2lkTGVuKQoreworCWludAlpbmRleDsKKworCWlmIChTc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCS8vIENoZWNrIGVhY2ggY2hhcmFjdGVyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU3NpZExlbjsgaW5kZXgrKykKKwl7CisJCWlmIChwU3NpZFtpbmRleF0gPCAweDIwKQorCQkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJLy8gQWxsIGNoZWNrZWQKKwlyZXR1cm4gKFRSVUUpOworfQorCitWT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpCit7CisJZG8KKwl7CisJCS8vIGRlY2lkZSB0aGUgcmF0ZSB0YWJsZSBmb3IgdHVuaW5nCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVUYWJsZVNpemUgPiAwKQorCQl7CisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlWzFdOworCisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCisJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJCSgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKKwkJCXsvLyAxMU4gMVMgQWRob2MKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCisJCQkJCShwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJgorCQkJCQkocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXsvLyAxMU4gMlMgQWRob2MKKwkJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCQkpCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCisJCQl9CisJCQllbHNlIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOworCisJCQl9CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSAxMikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCS8vCSgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKKwkJey8vIDExQkdOIDFTIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDEyKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJLy8JKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpCisJCXsvLyAxMUJHTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlM7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMV07CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZDsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMV07CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCisJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCisJCXsvLyAxMU4gMVMgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKKwkJey8vIDExTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJfQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID09IDQpICYmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJey8vIEIgb25seSBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA+IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID4gOCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7Ly8gQi9HICBtaXhlZCBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSA4KQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsvLyBHIG9ubHkgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsJLy8gTGVnYWN5IG1vZGUKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIDw9IFJBVEVfMTEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPiBSQVRFXzExKSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOworCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAorCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSkpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfSB3aGlsZShGQUxTRSk7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGVyZSdyZSBvdGhlciBBUHMgb3V0IHRoZXJlIGNhcGFibGUgZm9yCisJCXJvYW1pbmcuIENhbGxlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgb25seSB3aGVuIExpbmsgdXAgaW4gSU5GUkEgbW9kZQorCQlhbmQgY2hhbm5lbCBxdWFsaXR5IGlzIGJlbG93IENRSV9HT09EX1RIUkVTSE9MRC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJT3V0cHV0OgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORwlOb3czMikKK3sKKwlVU0hPUlQJICAgaTsKKwlCU1NfVEFCTEUgICpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKKwlCU1NfRU5UUlkgICpwQnNzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvclJvYW1pbmdcbiIpKTsKKwkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKKwlCc3NUYWJsZUluaXQocFJvYW1UYWIpOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCisJCWlmICgocEJzcy0+TGFzdEJlYWNvblJ4VGltZSArIEJFQUNPTl9MT1NUX1RJTUUpIDwgTm93MzIpCisJCQljb250aW51ZTsJIC8vIEFQIGRpc2FwcGVhcgorCQlpZiAocEJzcy0+UnNzaSA8PSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORykKKwkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCisJCWlmIChwQnNzLT5Sc3NpIDwgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJIC8vIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nCisKKwkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBSb2FtVGFiLT5Cc3NOciArPSAxOworCX0KKworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQorCXsKKwkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yUm9hbWluZygjIG9mIGNhbmRpZGF0ZT0gJWQpXG4iLHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgorCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUKKwkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU91dHB1dDoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVMT05HCQkJTm93KQoreworCVVTSE9SVAkJaTsKKwlCU1NfVEFCTEUJKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCUJTU19FTlRSWQkqcEJzczsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOworCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisKKyAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCisJCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAorCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKKyAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQorCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCBwQnNzLT5Sc3NpKSk7CisJCS8vIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlCisJCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKKwl9CisKKwlpZiAocFJvYW1UYWItPkJzc05yID4gMCkKKwl7CisJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nIGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCX0KKwl9CisJLy8gTWF5YmUgc2l0ZSBzdXJ2ZXkgcmVxdWlyZWQKKwllbHNlCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogMTAwMCkgPCBOb3cpCisJCXsKKwkJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcsIE5vIGVsaWdhYmxlIGVudHJ5LCB0cnkgbmV3IHNjYW4hXG4iKSk7CisJCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMjsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJCU1sbWVBdXRvU2NhbihwQWQpOworCQl9CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCisJCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCisKKwkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KKwlPdXRwdXQ6CisJCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCisJCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCisJCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCisJCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTm93MzIpCit7CisJVUxPTkcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKKwlVTE9ORyBSeENudCwgUnhQRVI7CisJVUNIQVIgTm9yUnNzaTsKKwlDSEFSICBNYXhSc3NpOworCVVMT05HIEJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRTsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJLy8gbG9uZ2VyIGJlYWNvbiBsb3N0IHRpbWUgd2hlbiBjYXJyaWVyIGRldGVjdGlvbiBlbmFibGVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJeworCQlCZWFjb25Mb3N0VGltZSA9IEJFQUNPTl9MT1NUX1RJTUUgKyBCRUFDT05fTE9TVF9USU1FLzI7CisJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworCisJLy8KKwkvLyBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MKKwkvLworCVR4T2tDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50OworCVR4Q250ID0gVHhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisJaWYgKFR4Q250IDwgNSkKKwl7CisJCVR4UEVSID0gMDsKKwkJVHhQUlIgPSAwOworCX0KKwllbHNlCisJeworCQlUeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICogMTAwKSAvIFR4Q250OworCQlUeFBSUiA9ICgoVHhDbnQgLSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQpICogMTAwKSAvIFR4Q250OworCX0KKworCS8vCisJLy8gY2FsY3VsYXRlIFJYIFBFUiAtIGRvbid0IHRha2UgUnhQRVIgaW50byBjb25zaWRlcmF0aW9uIGlmIHRvbyBmZXcgc2FtcGxlCisJLy8KKwlSeENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7CisJaWYgKFJ4Q250IDwgNSkKKwkJUnhQRVIgPSAwOworCWVsc2UKKwkJUnhQRVIgPSAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCAqIDEwMCkgLyBSeENudDsKKworCS8vCisJLy8gZGVjaWRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uOiAxKWxhc3QgQkVBQ09OIHJlY2VpdmVkIHRpbWUsIDIpbGFzdCBSU1NJLCAzKVR4UEVSLCBhbmQgNClSeFBFUgorCS8vCisJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA8IDIpICYmIC8vIG5vIGhlYXZ5IHRyYWZmaWMKKwkJKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBCZWFjb25Mb3N0VGltZSA8IE5vdzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJLy8gTm9ybWFsaXplIFJzc2kKKwkJaWYgKE1heFJzc2kgPiAtNDApCisJCQlOb3JSc3NpID0gMTAwOworCQllbHNlIGlmIChNYXhSc3NpIDwgLTkwKQorCQkJTm9yUnNzaSA9IDA7CisJCWVsc2UKKwkJCU5vclJzc2kgPSAoTWF4UnNzaSArIDkwKSAqIDI7CisKKwkJLy8gQ2hhbm5lbFF1YWxpdHkgPSBXMSpSU1NJICsgVzIqVHhQUlIgKyBXMypSeFBFUgkgKFJTU0kgMC4uMTAwKSwgKFR4UEVSIDEwMC4uMCksIChSeFBFUiAxMDAuLjApCisJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKworCQkJCQkJCQkgICBUWF9XRUlHSFRJTkcgKiAoMTAwIC0gVHhQUlIpICsKKwkJCQkJCQkJICAgUlhfV0VJR0hUSU5HKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKKwkJaWYgKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA+PSAxMDApCisJCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJfQorCit9CisKK1ZPSUQgTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpCit7CisJVUNIQVIJTWF4TW9kZSA9IE1PREVfT0ZETTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heE1vZGUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKworCWlmIChwVHhSYXRlLT5TVEJDICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworCWlmIChwVHhSYXRlLT5DdXJyTUNTIDwgTUNTX0FVVE8pCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwVHhSYXRlLT5DdXJyTUNTOworCisJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPiA3KQorCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworICAgCWlmIChBREhPQ19PTihwQWQpKQorCXsKKwkJLy8gSWYgcGVlciBhZGhvYyBpcyBiLW9ubHkgbW9kZSwgd2UgY2FuJ3Qgc2VuZCAxMWcgcmF0ZS4KKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBTVEJDX05PTkU7CisKKwkJLy8KKwkJLy8gRm9yIEFkaG9jIE1PREVfQ0NLLCBkcml2ZXIgd2lsbCB1c2UgQWRob2NCT25seUpvaW5lZCBmbGFnIHRvIHJvbGwgYmFjayB0byBCIG9ubHkgaWYgbmVjZXNzYXJ5CisJCS8vCisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwVHhSYXRlLT5Nb2RlOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCisJCS8vIFBhdGNoIHNwZWVkIGVycm9yIGluIHN0YXR1cyBwYWdlCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKHBUeFJhdGUtPk1vZGUgPD0gTWF4TW9kZSkKKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQorCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIFJlZXhhbSBlYWNoIGJhbmR3aWR0aCdzIFNHSSBzdXBwb3J0LgorCQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPT0gR0lfNDAwKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzIwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSkpKQorCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV180MCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpKSkKKwkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJfQorCisJCS8vIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLgorCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkKKwkJeworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKQorCQl7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpCisJCXsKKwkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCisJCX0KKwkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkKKwkJeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkgJiYKKwkJICAgIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCisJCSAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJfQorCisJcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGFjdW11bGF0ZWQgVHhQRVIgb2YgZWF4aCBUeFJhdGUuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgY2hhbmdlIENvbW1vbkNmZy5UeFJhdGUgd2hpY2gKKwkJaXMgdGhlIHN0YWJsZSBUWCBSYXRlIHdlIGV4cGVjdCB0aGUgUmFkaW8gc2l0dWF0aW9uIGNvdWxkIHN1c3RhaW5lZC4KKworCQlDb21tb25DZmcuVHhSYXRlIHdpbGwgY2hhbmdlIGR5bmFtaWNhbGx5IHdpdGhpbiB7UkFURV8xL1JBVEVfNiwgTWF4VHhSYXRlfQorCU91dHB1dDoKKwkJQ29tbW9uQ2ZnLlR4UmF0ZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6CisJCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7CisJVUxPTkcJCQkJCWksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKKwlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKKwlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlDSEFSCQkJCQlSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLy8KKwkvLyB3YWxrIHRocm91Z2ggTUFDIHRhYmxlLCBzZWUgaWYgbmVlZCB0byBjaGFuZ2UgQVAncyBUWCByYXRlIHRvd2FyZCBlYWNoIGVudHJ5CisJLy8KKyAgIAlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCS8vIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5CisJCWlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcEVudHJ5KSA9PSBGQUxTRSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKSB8fCAocEVudHJ5LT5WYWxpZEFzRGxzKSkKKwkJeworCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAorCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJCQlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gVFJVRTsKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworCQkJLy8gaWYgbm8gdHJhZmZpYyBpbiB0aGUgcGFzdCAxLXNlYyBwZXJpb2QsIGRvbid0IGNoYW5nZSBUWCByYXRlLAorCQkJLy8gYnV0IGNsZWFyIGFsbCBiYWQgaGlzdG9yeS4gYmVjYXVzZSB0aGUgYmFkIGhpc3RvcnkgbWF5IGFmZmVjdCB0aGUgbmV4dAorCQkJLy8gQ2hhcmlvdCB0aHJvdWdocHV0IHRlc3QKKwkJCUFjY3VUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCisJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQllbHNlCisJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAorCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCisJCUN1cnJSYXRlSWR4ID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJaWYgKEN1cnJSYXRlSWR4ID49IFRhYmxlU2l6ZSkKKwkJeworCQkJQ3VyclJhdGVJZHggPSBUYWJsZVNpemUgLSAxOworCQl9CisKKwkJLy8gV2hlbiBzd2l0Y2ggZnJvbSBGaXhlZCByYXRlIC0+IGF1dG8gcmF0ZSwgdGhlIFJFQUwgVFggcmF0ZSBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleC4KKwkJLy8gU28gbmVlZCB0byBzeW5jIGhlcmUuCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJKQorCQl7CisKKwkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCisJCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCisJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKKworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCQkJY29udGludWU7CisJCX0KKworCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55CisJCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOworCQl9CisKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQorCQl7CisJCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7CisJCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQl9CisKKwkJLy9wQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisJCS8vCisJCS8vIEtlZXAgdGhlIGxhc3QgdGltZSBUeFJhdGVDaGFuZ2VBY3Rpb24gc3RhdHVzLgorCQkvLworCQlwRW50cnktPkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisKKworCQkvLworCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQorCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKKwkJLy8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTUpCisJCXsKKwkJCUNIQVIJaWR4ID0gMDsKKwkJCVVDSEFSCVR4UmF0ZUlkeDsKKwkJCS8vVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCBNQ1M3ID0gMCwgTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCAgTUNTNSA9MCwgTUNTNiA9IDAsIE1DUzcgPSAwOworCSAgICAgICAgVUNIQVIJTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMjAgPSAwLCBNQ1MyMSA9IDAsIE1DUzIyID0gMCwgTUNTMjMgPSAwOyAvLyAzKjMKKworCQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBhbmQgaW5kZXggb2YgZWFjaCBuZWVkZWQgTUNTCisJCQl3aGlsZSAoaWR4IDwgcFRhYmxlWzBdKQorCQkJeworCQkJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhpZHgrMSkqNV07CisKKwkJCQlpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzApCisJCQkJeworCQkJCQlNQ1MwID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMSkKKwkJCQl7CisJCQkJCU1DUzEgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yKQorCQkJCXsKKwkJCQkJTUNTMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpCisJCQkJeworCQkJCQlNQ1MzID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNCkKKwkJCQl7CisJCQkJCU1DUzQgPSBpZHg7CisJCQkJfQorCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU181KQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgTUNTNSA9IGlkeDsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzYpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBNQ1M2ID0gaWR4OworCSAgICAgICAgICAgIH0KKwkJCQkvL2Vsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vIHByZXZlbnQgdGhlIGhpZ2hlc3QgTUNTIHVzaW5nIHNob3J0IEdJIHdoZW4gMVQgYW5kIGxvdyB0aHJvdWdocHV0CisJCQkJeworCQkJCQlNQ1M3ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTIpCisJCQkJeworCQkJCQlNQ1MxMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEzKQorCQkJCXsKKwkJCQkJTUNTMTMgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNCkKKwkJCQl7CisJCQkJCU1DUzE0ID0gaWR4OworCQkJCX0KKwkJCQkvL2Vsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpLyogJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkqLykJLy93ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlLCBob3dldmVyIEF0aGVyb3MncyBjaGlwIGhhcyBidWdzIHdoZW4gc2hvcnQgR0kKKwkJCQl7CisJCQkJCU1DUzE1ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjApIC8vIDMqMworCQkJCXsKKwkJCQkJTUNTMjAgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMSkKKwkJCQl7CisJCQkJCU1DUzIxID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjIpCisJCQkJeworCQkJCQlNQ1MyMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIzKQorCQkJCXsKKwkJCQkJTUNTMjMgPSBpZHg7CisJCQkJfQorCQkJCWlkeCArKzsKKwkJCX0KKworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSAyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUnNzaU9mZnNldCA9IDg7CisJCQkJfQorCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLyppZiAoTUNTMTUpKi8KKwkJCWlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOM1MpIHx8CisJCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4zUykgfHwKKwkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpCisJCQl7Ly8gTiBtb2RlIHdpdGggMyBzdHJlYW0gLy8gMyozCisJCQkJaWYgKE1DUzIzICYmIChSc3NpID49IC03MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCWVsc2UgaWYgKE1DUzIyICYmIChSc3NpID49IC03MikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OworICAgICAgICAJICAgIGVsc2UgaWYgKE1DUzIxICYmIChSc3NpID49IC03NikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOworCQkJCWVsc2UgaWYgKE1DUzIwICYmIChSc3NpID49IC03OCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOworCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCisJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gLTg2KSkKKwkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQllbHNlCisJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJfQorLy8JCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKKwkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZCkgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZCkpIC8vIDMqMworCQkJey8vIE4gbW9kZSB3aXRoIDIgc3RyZWFtCisJCQkJaWYgKE1DUzE1ICYmIChSc3NpID49ICgtNzArUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxNTsKKwkJCQllbHNlIGlmIChNQ1MxNCAmJiAoUnNzaSA+PSAoLTcyK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7CisJCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOworCQkJCWVsc2UgaWYgKE1DUzEyICYmIChSc3NpID49ICgtNzgrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxMjsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49ICgtODIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gKC04NCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAoLTg2K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49ICgtODgrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4xUykpCisJCQl7Ly8gTiBtb2RlIHdpdGggMSBzdHJlYW0KKwkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+ICgtNzIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M3OworCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAoLTc0K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKKwkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gKC03NytSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzU7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+ICgtNzkrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAoLTgxK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gKC04MytSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+ICgtODYrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsvLyBMZWdhY3kgbW9kZQorCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gLTcwKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKKwkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gLTc0KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKKwkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gLTc4KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gLTgyKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCQllbHNlIGlmIChNQ1M0ID09IDApCS8vIGZvciBCLW9ubHkgbW9kZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAtODUpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAtODcpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAtOTApKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKworCS8vCQlpZiAoVHhSYXRlSWR4ICE9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KQorCQkJeworCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVHhSYXRlSWR4OworCQkJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKKwkJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CisJCQl9CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBUUlVFOworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9PSBUUlVFKQorCQl7CisJCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IEZBTFNFOworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsKKwkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKKworCQkJY29udGludWU7CisJCX0KKworCQlkbworCQl7CisJCQlCT09MRUFOCWJUcmFpblVwRG93biA9IEZBTFNFOworCisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lICsrOworCisJCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAorCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCisJCQl7CisJCQkJYlRyYWluVXBEb3duID0gVFJVRTsKKwkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKwkJCS8vIHVwZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPD0gUmF0ZS1VcCB0aHJlc2hvbGQKKwkJCWVsc2UgaWYgKFR4RXJyb3JSYXRpbyA8PSBUcmFpblVwKQorCQkJeworCQkJCWJUcmFpblVwRG93biA9IFRSVUU7CisJCQkJYlVwZ3JhZGVRdWFsaXR5ID0gVFJVRTsKKwkJCQlpZiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdKQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gLS07ICAvLyBxdWFsaXR5IHZlcnkgZ29vZCBpbiBDdXJyUmF0ZQorCisJCQkJaWYgKHBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5KQorCQkJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSAtLTsKKwkJCQllbHNlIGlmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdKQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIC0tOyAgICAvLyBtYXkgaW1wcm92ZSBuZXh0IFVQIHJhdGUncyBxdWFsaXR5CisJCQl9CisKKwkJCXBFbnRyeS0+UEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87CisKKwkJCWlmIChiVHJhaW5VcERvd24pCisJCQl7CisJCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgorCQkJCWlmICgoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPj0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQpKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0gMCkpCisJCQkJeworCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKworCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcworCQlpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKKwkJeworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7CisJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAxOyAvLyByYXRlIFVQCisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKworCQkJLy8KKwkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiB1cAorCQkJLy8KKwkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQorCQkJeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKwkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJfQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQorCQllbHNlIGlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKKwkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDI7IC8vIHJhdGUgRE9XTgorCQkJcEVudHJ5LT5UeFF1YWxpdHlbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKKwkJCXBFbnRyeS0+UEVSW3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7CisKKwkJCS8vCisJCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gZG93bgorCQkJLy8KKwkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQorCQkJeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKwkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJfQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsgLy8gcmF0ZSBubyBjaGFuZ2UKKwkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CisJCX0KKworCQlwRW50cnktPkxhc3RUeE9rQ291bnQgPSBUeFN1Y2Nlc3M7CisKKwkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisKKwkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KzEpKjVdOworCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCisJCXsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTdGF0aW9uIHNpZGUsIEF1dG8gVHhSYXRlIGZhc3RlciB0cmFpbiB1cCB0aW1lciBjYWxsIGJhY2sgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisJCVN5c3RlbVNwZWNpZmljMQkJCS0gTm90IHVzZWQuCisJCUZ1bmN0aW9uQ29udGV4dAkJCS0gUG9pbnRlciB0byBvdXIgQWRhcHRlciBjb250ZXh0LgorCQlTeXN0ZW1TcGVjaWZpYzIJCQktIE5vdCB1c2VkLgorCQlTeXN0ZW1TcGVjaWZpYzMJCQktIE5vdCB1c2VkLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVBSVE1QX0FEQVBURVIJCQlwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7CisJVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHggPSAwOworCVVMT05HCQkJCQlUeFRvdGFsQ250OworCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkOyAvLywgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJQ0hBUgkJCQkJUnNzaSwgcmF0aW87CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCVVMT05HCQkJCQlpOworCisJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKyAgICAvLworICAgIC8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKKyAgICAvLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQorCQkJY29udGludWU7CisKKwkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJZWxzZQorCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJQ3VyclJhdGVJZHggPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleDsKKworCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJLy8gZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueQorCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKKwkJfQorCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfQorCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKFJzc2kgPiAtNjUpICYmIChwQ3VyclR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSkKKwkJeworCQkJVHJhaW5VcAkJPSAocEN1cnJUeFJhdGUtPlRyYWluVXAgKyAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duCT0gKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gKyAocEN1cnJUeFJhdGUtPlRyYWluRG93biA+PiAxKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlUcmFpblVwCQk9IHBDdXJyVHhSYXRlLT5UcmFpblVwOworCQkJVHJhaW5Eb3duCT0gcEN1cnJUeFJhdGUtPlRyYWluRG93bjsKKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDEpCisJCXsKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworI2lmIDAgLy8gdGVzdCBieSBHYXJ5LgorCQkJLy8gaWYgbm8gdHJhZmZpYyBpbiB0aGUgcGFzdCAxLXNlYyBwZXJpb2QsIGRvbid0IGNoYW5nZSBUWCByYXRlLAorCQkJLy8gYnV0IGNsZWFyIGFsbCBiYWQgaGlzdG9yeS4gYmVjYXVzZSB0aGUgYmFkIGhpc3RvcnkgbWF5IGFmZmVjdCB0aGUgbmV4dAorCQkJLy8gQ2hhcmlvdCB0aHJvdWdocHV0IHRlc3QKKwkJCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisjZW5kaWYKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKworCisJCS8vCisJCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCisJCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQorCQkvLworCQlpZiAoVHhUb3RhbENudCA8PSAxMikKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisKKwkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CisJCQl9CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlkbworCQl7CisJCQlVTE9ORyBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50OworCisJCQlpZiAocEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9PSAwKQorCQkJCXJhdGlvID0gNTsKKwkJCWVsc2UKKwkJCQlyYXRpbyA9IDQ7CisKKwkJCS8vIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkCisJCQlpZiAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikKKwkJCXsKKwkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKworCQkJcEFkLT5EcnNDb3VudGVycy5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKKworCQkJT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCA9IChUeFN1Y2Nlc3MgKiByYXRpbyk7CisKKwkJCS8vIHBlcmZvcm0gRFJTIC0gY29uc2lkZXIgVHhSYXRlIERvd24gZmlyc3QsIHRoZW4gcmF0ZSB1cC4KKwkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCisJCQl7CisJCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisKKwkJCQl9CisKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCisJCQl7CisJCQkJaWYgKChUeEVycm9yUmF0aW8gPj0gNTApIHx8IChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSkKKwkJCQl7CisKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCQl9CisJCQl9CisJCX13aGlsZSAoRkFMU0UpOworCisJCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKKwkJfQorCQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKKwkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IC0tVFggcmF0ZSBmcm9tICVkIHRvICVkIFxuIiwgQ3VyclJhdGVJZHgsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSk7CisKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7CisJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOworCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJYlR4UmF0ZUNoYW5nZWQgPSBGQUxTRTsKKwkJfQorCisJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCsxKSo1XTsKKwkJaWYgKGJUeFJhdGVDaGFuZ2VkICYmIHBOZXh0VHhSYXRlKQorCQl7CisJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSBpbnNpZGUgTWxtZVBlcmlvZGljRXhlYygpIGFmdGVyCisJCWFzc29jaWF0aW9uIHdpdGggYW4gQVAuCisJCUl0IGNoZWNrcyBpZiBTdGFDZmcuUHNtIGlzIGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvbGljeSAocmVjb3JkZWQgaW4KKwkJU3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpLiBJZiBub3QsIGVuZm9yY2UgdXNlciBwb2xpY3kuIEhvd2V2ZXIsCisJCXRoZXJlJ3JlIHNvbWUgY29uZGl0aW9ucyB0byBjb25zaWRlcjoKKwkJMS4gd2UgZG9uJ3Qgc3VwcG9ydCBwb3dlci1zYXZpbmcgaW4gQURIT0MgbW9kZSwgc28gUHNtPVBXUl9BQ1RJVkUgYWxsCisJCSAgIHRoZSB0aW1lIHdoZW4gTWlic3M9PVRSVUUKKwkJMi4gV2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUsIFBzbSBzaG91bGQgbm90IGJlIHN3aXRjaCB0byBQV1JfU0FWRQorCQkgICBpZiBvdXRnb2luZyB0cmFmZmljIGF2YWlsYWJsZSBpbiBUeFJpbmcgb3IgTWdtdFJpbmcuCisJT3V0cHV0OgorCQkxLiBjaGFuZ2UgcEFkLT5TdGFDZmcuUHNtIHRvIFBXUl9TQVZFIG9yIGxlYXZlIGl0IHVudG91Y2hlZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORwlOb3czMikKK3sKKwlVTE9ORwlQb3dlck1vZGU7CisKKwkvLyBjb25kaXRpb24gLQorCS8vIDEuIFBzbSBtYXliZSBPTiBvbmx5IGhhcHBlbiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlCisJLy8gMi4gdXNlciB3YW50cyBlaXRoZXIgTUFYX1BTUCBvciBGQVNUX1BTUAorCS8vIDMuIGJ1dCBjdXJyZW50IHBzbSBpcyBub3QgaW4gUFdSX1NBVkUKKwkvLyA0LiBDTlRMIHN0YXRlIG1hY2hpbmUgaXMgbm90IGRvaW5nIFNDQU5uaW5nCisJLy8gNS4gbm8gVFggU1VDQ0VTUyBldmVudCBmb3IgdGhlIHBhc3QgMS1zZWMgcGVyaW9kCisjaWZkZWYgTkRJUzUxX01JTklQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlclByb2ZpbGUgPT0gTmRpc1Bvd2VyUHJvZmlsZUJhdHRlcnkpCisJCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOworCWVsc2UKKyNlbmRpZgorCQlQb3dlck1vZGUgPSBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworCisJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJKFBvd2VyTW9kZSAhPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKSAmJgorCQkocEFkLT5TdGFDZmcuUHNtID09IFBXUl9BQ1RJVkUpICYmCisvLwkJKCEgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAvKiYmCisJCShwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkqLykKKwl7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7CisJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCisJCXsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisJCX0KKwl9Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVNldFBzbUJpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJcEFkLT5TdGFDZmcuUHNtID0gcHNtOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmY3NyNC53b3JkKTsKKwljc3I0LmZpZWxkLkFja0N0c1BzbUJpdCA9IChwc20gPT0gUFdSX1NBVkUpPyAxOjA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRQc21CaXQgPSAlZFxuIiwgcHNtKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVTZXRUeFByZWFtYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUeFByZWFtYmxlKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCS8vVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOworCWlmIChUeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gTE9ORyBQUkVBTUJMRSlcbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAwOworCX0KKwllbHNlCisJeworCQkvLyBOT1RFOiAxTWJwcyBzaG91bGQgYWx3YXlzIHVzZSBsb25nIHByZWFtYmxlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IFNIT1JUIFBSRUFNQkxFKVxuIikpOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAxOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgY3NyNC53b3JkKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBVcGRhdGUgYmFzaWMgcmF0ZSBiaXRtYXAKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIpCit7CisgICAgSU5UICBpLCBqOworICAgICAgICAgICAgICAgICAgLyogMSAgMiAgNS41LCAxMSwgIDYsICA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsICA1NCAqLworICAgIFVDSEFSIHJhdGVbXSA9IHsgMiwgNCwgIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCB9OworICAgIFVDSEFSICpzdXBfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3VwUmF0ZTsKKyAgICBVQ0hBUiAqZXh0X3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkV4dFJhdGU7CisgICAgVUxPTkcgYml0bWFwID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXA7CisKKworICAgIC8qIGlmIEEgbW9kZSwgYWx3YXlzIHVzZSBmaXggQmFzaWNSYXRlQml0TWFwICovCisgICAgLy9pZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID09IFBIWV8xMUEpCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IDB4MTUwOyAvKiA2LCAxMiwgMjRNICovCisgICAgLyogRW5kIG9mIGlmICovCisKKyAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPiA0MDk1KQorICAgIHsKKyAgICAgICAgLyogKDIgXiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgLTEgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0gLyogRW5kIG9mIGlmICovCisKKyAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisgICAgeworICAgICAgICBzdXBfcFtpXSAmPSAweDdmOworICAgICAgICBleHRfcFtpXSAmPSAweDdmOworICAgIH0gLyogRW5kIG9mIGZvciAqLworCisgICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcCAmICgxIDw8IGkpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN1cF9wW2pdID09IHJhdGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHN1cF9wW2pdIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKworICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleHRfcFtqXSA9PSByYXRlW2ldKQorICAgICAgICAgICAgICAgICAgICBleHRfcFtqXSB8PSAweDgwOworICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLworICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogRW5kIG9mIGlmICovCisgICAgfSAvKiBFbmQgb2YgZm9yICovCit9IC8qIEVuZCBvZiBVcGRhdGVCYXNpY1JhdGVCaXRtYXAgKi8KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorLy8gYkxpbmtVcCBpcyB0byBpZGVudGlmeSB0aGUgaW5pdGFsIGxpbmsgc3BlZWQuCisvLyBUUlVFIGluZGljYXRlcyB0aGUgcmF0ZSB1cGRhdGUgYXQgbGlua3VwLCB3ZSBzaG91bGQgbm90IHRyeSB0byBzZXQgdGhlIHJhdGUgYXQgNTRNYnBzLgorVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOIAlCT09MRUFOCQkgCQliTGlua1VwLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCWludCBpLCBudW07CisJVUNIQVIgUmF0ZSA9IFJBVEVfNiwgTWF4RGVzaXJlID0gUkFURV8xLCBNYXhTdXBwb3J0ID0gUkFURV8xOworCVVDSEFSIE1pblN1cHBvcnQgPSBSQVRFXzU0OworCVVMT05HIEJhc2ljUmF0ZUJpdG1hcCA9IDA7CisJVUNIQVIgQ3VyckJhc2ljUmF0ZSA9IFJBVEVfMTsKKwlVQ0hBUiAqcFN1cFJhdGUsIFN1cFJhdGVMZW4sICpwRXh0UmF0ZSwgRXh0UmF0ZUxlbjsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCVVDSEFSCQkJCQlIdE1jcyA9IE1DU19BVVRPOworCisJLy8gZmluZCBtYXggZGVzaXJlZCByYXRlCisJVXBkYXRlQmFzaWNSYXRlQml0bWFwKHBBZCk7CisKKwludW0gPSAwOworCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVtpXSAmIDB4N2YpCisJCXsKKwkJCWNhc2UgMjogIFJhdGUgPSBSQVRFXzE7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDQ6ICBSYXRlID0gUkFURV8yOyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMTogUmF0ZSA9IFJBVEVfNV81OyBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjI6IFJhdGUgPSBSQVRFXzExOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDEyOiBSYXRlID0gUkFURV82OyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxODogUmF0ZSA9IFJBVEVfOTsgICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjQ6IFJhdGUgPSBSQVRFXzEyOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDM2OiBSYXRlID0gUkFURV8xODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSA0ODogUmF0ZSA9IFJBVEVfMjQ7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgNzI6IFJhdGUgPSBSQVRFXzM2OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDk2OiBSYXRlID0gUkFURV80ODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OyBudW0rKzsgICBicmVhazsKKwkJCS8vZGVmYXVsdDogUmF0ZSA9IFJBVEVfMTsgICBicmVhazsKKwkJfQorCQlpZiAoTWF4RGVzaXJlIDwgUmF0ZSkgIE1heERlc2lyZSA9IFJhdGU7CisJfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisKKwkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQlIdE1jcyAJCT0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmCisJCQkoTWF4RGVzaXJlID4gUkFURV8xMSkpCisJCXsKKwkJCU1heERlc2lyZSA9IFJBVEVfMTE7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPkNvbW1vbkNmZy5NYXhEZXNpcmVkUmF0ZSA9IE1heERlc2lyZTsKKwlwTWluSHRQaHktPndvcmQgPSAwOworCXBNYXhIdFBoeS0+d29yZCA9IDA7CisJcEh0UGh5LT53b3JkID0gMDsKKworCS8vIEF1dG8gcmF0ZSBzd2l0Y2hpbmcgaXMgZW5hYmxlZCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgREVTSVJFRCBSQVRFUyBhcmUKKwkvLyBzcGVjaWZpZWQ7IG90aGVyd2lzZSBkaXNhYmxlZAorCWlmIChudW0gPD0gMSkKKwl7CisJCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7CisJCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBGQUxTRTsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQkvL09QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsKKwkJLy9wQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaAk9IFRSVUU7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOworCX0KKworI2lmIDEKKwlpZiAoSHRNY3MgIT0gTUNTX0FVVE8pCisJeworCQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOworCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gRkFMU0U7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJLy9PUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7CisJCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBUUlVFOworCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQlwU3VwUmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlWzBdOworCQlwRXh0UmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlWzBdOworCQlTdXBSYXRlTGVuID0gcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbjsKKwkJRXh0UmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7CisJCXBTdXBSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF07CisJCXBFeHRSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF07CisJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwl9CisKKwkvLyBmaW5kIG1heCBzdXBwb3J0ZWQgcmF0ZQorCWZvciAoaT0wOyBpPFN1cFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCWZvciAoaT0wOyBpPEV4dFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocEV4dFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExFR0FDWV9CQVNJQ19SQVRFLCBCYXNpY1JhdGVCaXRtYXApOworCisJLy8gYnVnIGZpeAorCS8vIHBBZC0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IEJhc2ljUmF0ZUJpdG1hcDsKKworCS8vIGNhbGN1bGF0ZSB0aGUgZXhwdGVjdGVkIEFDSyByYXRlIGZvciBlYWNoIFRYIHJhdGUuIFRoaXMgaW5mbyBpcyB1c2VkIHRvIGNhY3VsYXRlCisJLy8gdGhlIERVUkFUSU9OIGZpZWxkIG9mIG91dGdvaW5nIHVuaWljYXN0IERBVEEvTUdNVCBmcmFtZQorCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisJeworCQlpZiAoQmFzaWNSYXRlQml0bWFwICYgKDB4MDEgPDwgaSkpCisJCQlDdXJyQmFzaWNSYXRlID0gKFVDSEFSKWk7CisJCXBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtpXSA9IEN1cnJCYXNpY1JhdGU7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlVHhSYXRlc1tNYXhTdXBwb3J0ID0gJWRdID0gTWF4RGVzaXJlICVkIE1icHNcbiIsIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0pKTsKKwkvLyBtYXggdHggcmF0ZSA9IG1pbiB7bWF4IGRlc2lyZSByYXRlLCBtYXggc3VwcG9ydGVkIHJhdGV9CisJaWYgKE1heFN1cHBvcnQgPCBNYXhEZXNpcmUpCisJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heFN1cHBvcnQ7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhEZXNpcmU7CisKKwlwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPSBNaW5TdXBwb3J0OworCS8vIDIwMDMtMDctMzEgam9obiAtIDI1MDAgZG9lc24ndCBoYXZlIGdvb2Qgc2Vuc2l0aXZpdHkgYXQgaGlnaCBPRkRNIHJhdGVzLiB0byBpbmNyZWFzZSB0aGUgc3VjY2VzcworCS8vIHJhdGlvIG9mIGluaXRpYWwgREhDUCBwYWNrZXQgZXhjaGFuZ2UsIFRYIHJhdGUgc3RhcnRzIGZyb20gYSBsb3dlciByYXRlIGRlcGVuZGluZworCS8vIG9uIGF2ZXJhZ2UgUlNTSQorCS8vCSAxLiBSU1NJID49IC03MGRiLCBzdGFydCBhdCA1NCBNYnBzIChzaG9ydCBkaXN0YW5jZSkKKwkvLwkgMi4gLTcwID4gUlNTSSA+PSAtNzUsIHN0YXJ0IGF0IDI0IE1icHMgKG1pZCBkaXN0YW5jZSkKKwkvLwkgMy4gLTc1ID4gUlNTSSwgc3RhcnQgYXQgMTEgTWJwcyAobG9uZyBkaXN0YW5jZSkKKwkvL2lmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpLyogJiYKKwkvLwlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkqLykKKwlpZiAoKmF1dG9fcmF0ZV9jdXJfcCkKKwl7CisJCXNob3J0IGRibSA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlkYm0gPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJaWYgKGJMaW5rVXAgPT0gVFJVRSkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMjQ7CisJCWVsc2UKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKworCQlpZiAoZGJtIDwgLTc1KQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8xMTsKKwkJZWxzZSBpZiAoZGJtIDwgLTcwKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8yNDsKKworCQkvLyBzaG91bGQgbmV2ZXIgZXhjZWVkIE1heFR4UmF0ZSAoY29uc2lkZXIgMTFCLW9ubHkgbW9kZSkKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA+IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKworCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IDA7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKwkJcEh0UGh5LT5maWVsZC5NQ1MJPSAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIC0gNCkgOiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisJCXBIdFBoeS0+ZmllbGQuTU9ERQk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IE1PREVfT0ZETSA6IE1PREVfQ0NLOworCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwSHRQaHktPmZpZWxkLlNUQkM7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwSHRQaHktPmZpZWxkLlNob3J0R0k7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwSHRQaHktPmZpZWxkLk1DUzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBIdFBoeS0+ZmllbGQuTU9ERTsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlIDw9IFJBVEVfMTEpCisJeworCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CisJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlOworCX0KKwllbHNlCisJeworCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuVHhSYXRlXTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+PSBSQVRFXzYgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA8PSBSQVRFXzU0KSkKKwkJCXtwTWluSHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZV07fQorCQllbHNlCisJCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7fQorCX0KKworCXBIdFBoeS0+d29yZCA9IChwTWF4SHRQaHktPndvcmQpOworCWlmIChiTGlua1VwICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwl7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEh0UGh5LT53b3JkOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCA9IHBNYXhIdFBoeS0+d29yZDsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgPSBwTWluSHRQaHktPndvcmQ7CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwkJeworCQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJCWNhc2UgUEhZXzExQjoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKKworLy8jaWZkZWYJV0lGSV9URVNUCisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7CisvLyNlbHNlCisvLwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOworLy8jZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhZXzExRzoKKwkJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJCWNhc2UgUEhZXzExTl8yXzRHOgorCQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJCWNhc2UgUEhZXzExTl81RzoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJYnJlYWs7CisJCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLy8gZXJyb3IKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisJCQkJYnJlYWs7CisJCX0KKwkJLy8KKwkJLy8gS2VlcCBCYXNpYyBNbG1lIFJhdGUuCisJCS8vCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZDsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW1JBVEVfMjRdOworCQllbHNlCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCXBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKE1heERlc2lyZT0lZCwgTWF4U3VwcG9ydD0lZCwgTWF4VHhSYXRlPSVkLCBNaW5SYXRlPSVkLCBSYXRlIFN3aXRjaGluZyA9JWQpXG4iLAorCQkJIFJhdGVJZFRvTWJwc1tNYXhEZXNpcmVdLCBSYXRlSWRUb01icHNbTWF4U3VwcG9ydF0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGVdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXSwKKwkJCSAvKk9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkqLyphdXRvX3JhdGVfY3VyX3ApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKFR4UmF0ZT0lZCwgUnRzUmF0ZT0lZCwgQmFzaWNSYXRlQml0bWFwPTB4JTA0bHgpXG4iLAorCQkJIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuUnRzUmF0ZV0sIEJhc2ljUmF0ZUJpdG1hcCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVVcGRhdGVUeFJhdGVzIChNbG1lVHJhbnNtaXQ9MHgleCwgTWluSFRQaHlNb2RlPSV4LCBNYXhIVFBoeU1vZGU9MHgleCwgSFRQaHlNb2RlPTB4JXgpXG4iLAorCQkJIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkICxwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkICxwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkICkpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gdXBkYXRlIEhUIFJhdGUgc2V0dGluZy4KKwkJSW5wdXQgV2NpZCB2YWx1ZSBpcyB2YWxpZCBmb3IgMiBjYXNlIDoKKwkJMS4gaXQncyB1c2VkIGZvciBTdGF0aW9uIGluIGluZnJhIG1vZGUgdGhhdCBjb3B5IEFQIHJhdGUgdG8gTWFjdGFibGUuCisJCTIuIE9SIFN0YXRpb24gCWluIGFkaG9jIG1vZGUgdG8gY29weSBwZWVyJ3MgSFQgcmF0ZSB0byBNYWN0YWJsZS4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJVUNIQVIJU3RiY01jczsgLy9qLCBTdGJjTWNzLCBiaXRtYXNrOworCUNIQVIgCWk7IC8vIDMqMworCVJUX0hUX0NBUEFCSUxJVFkgCSpwUnRIdENhcCA9IE5VTEw7CisJUlRfSFRfUEhZX0lORk8JCSpwQWN0aXZlSHRQaHkgPSBOVUxMOworCVVMT05HCQlCYXNpY01DUzsKKwlVQ0hBUiBqLCBiaXRtYXNrOworCVBSVF9IVF9QSFlfSU5GTwkJCXBEZXNpcmVIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7CisJQk9PTEVBTiAJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlcz09PT4gXG4iKSk7CisKKwlhdXRvX3JhdGVfY3VyX3AgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBEZXNpcmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQlwQWN0aXZlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKKwkJcEh0UGh5IAkJPSAmcEFkLT5TdGFDZmcuSFRQaHlNb2RlOworCQlwTWF4SHRQaHkJPSAmcEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlOworCQlwTWluSHRQaHkJPSAmcEFkLT5TdGFDZmcuTWluSFRQaHlNb2RlOworCisJCWF1dG9fcmF0ZV9jdXJfcCA9ICZwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCQkJcmV0dXJuOworCisJCXBSdEh0Q2FwID0gJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5OworCQlwQWN0aXZlSHRQaHkgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mbzsKKwkJU3RiY01jcyA9IChVQ0hBUilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzBdKyhwQWQtPk1sbWVBdXguQWRkSHRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJZWxzZQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCX0KKwllbHNlCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeworCQlpZiAocERlc2lyZUh0UGh5LT5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQlyZXR1cm47CisKKwkJcFJ0SHRDYXAgPSAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5OworCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8zLlN0YmNNY3M7CisJCUJhc2ljTUNTID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFswXSsocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJZWxzZQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCX0KKworCS8vIERlY2lkZSBNQVggaHQgcmF0ZS4KKwlpZiAoKHBSdEh0Q2FwLT5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCWVsc2UKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKworICAgIGlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkgJiYgKHBSdEh0Q2FwLT5DaGFubmVsV2lkdGgpKQorCQlwTWF4SHRQaHktPmZpZWxkLkJXID0gQldfNDA7CisJZWxzZQorCQlwTWF4SHRQaHktPmZpZWxkLkJXID0gQldfMjA7CisKKyAgICBpZiAocE1heEh0UGh5LT5maWVsZC5CVyA9PSBCV18yMCkKKwkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjIwKTsKKwllbHNlCisJCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3I0MCk7CisKKwlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJeworCQlqID0gaS84OworCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisKKwkJaWYgKChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQl7CisJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpPT0wKQorCQkJYnJlYWs7CisJfQorCisJLy8gQ29weSBNSU4gaHQgcmF0ZS4gIHJ0Mjg2MD8/PworCXBNaW5IdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKKwlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDA7CisJcE1pbkh0UGh5LT5maWVsZC5TVEJDID0gMDsKKwlwTWluSHRQaHktPmZpZWxkLlNob3J0R0kgPSAwOworCS8vSWYgU1RBIGFzc2lnbnMgZml4ZWQgcmF0ZS4gdXBkYXRlIHRvIGZpeGVkIGhlcmUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpKQorCXsKKwkJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApCisJCXsKKwkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7CisJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDMyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBVc2UgRml4ZWQgTUNTID0gJWRcbiIscE1pbkh0UGh5LT5maWVsZC5NQ1MpKTsKKwkJfQorCisJCWZvciAoaT0yMzsgKENIQVIpaSA+PSAwOyBpLS0pIC8vIDMqMworCQl7CisJCQlqID0gaS84OworCQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOworCQkJaWYgKCAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKKwkJCXsKKwkJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGk9PTApCisJCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCS8vIERlY2lkZSBodCByYXRlCisJcEh0UGh5LT5maWVsZC5TVEJDID0gcE1heEh0UGh5LT5maWVsZC5TVEJDOworCXBIdFBoeS0+ZmllbGQuQlcgPSBwTWF4SHRQaHktPmZpZWxkLkJXOworCXBIdFBoeS0+ZmllbGQuTU9ERSA9IHBNYXhIdFBoeS0+ZmllbGQuTU9ERTsKKwlwSHRQaHktPmZpZWxkLk1DUyA9IHBNYXhIdFBoeS0+ZmllbGQuTUNTOworCXBIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IHBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSTsKKworCS8vIHVzZSBkZWZhdWx0IG5vdy4gcnQyODYwCisJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpCisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwllbHNlCisJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVIdFR4UmF0ZXM8LS0tLkFNc2R1U2l6ZSA9ICVkICBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUWDogTUNTWzBdID0gJXggKGNob29zZSAlZCksIEJXID0gJWQsIFNob3J0R0kgPSAlZCwgTU9ERSA9ICVkLCAgXG4iLCBwQWN0aXZlSHRQaHktPk1DU1NldFswXSxwSHRQaHktPmZpZWxkLk1DUywKKwkJcEh0UGh5LT5maWVsZC5CVywgcEh0UGh5LT5maWVsZC5TaG9ydEdJLCBwSHRQaHktPmZpZWxkLk1PREUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFxuIikpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVJhZGlvT2ZmKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVJUMjhYWF9NTE1FX1JBRElPX09GRihwQWQpOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gYnNzX3RhYmxlLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvKiEgXGJyaWVmIGluaXRpYWxpemUgQlNTIHRhYmxlCisgKglccGFyYW0gcF90YWIgcG9pbnRlciB0byB0aGUgdGFibGUKKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVk9JRCBCc3NUYWJsZUluaXQoCisJSU4gQlNTX1RBQkxFICpUYWIpCit7CisJaW50IGk7CisKKwlUYWItPkJzc05yID0gMDsKKyAgICBUYWItPkJzc092ZXJsYXBOciA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQlNTX1RBQkxFOyBpKyspCisJeworCQlOZGlzWmVyb01lbW9yeSgmVGFiLT5Cc3NFbnRyeVtpXSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlUYWItPkJzc0VudHJ5W2ldLlJzc2kgPSAtMTI3OwkvLyBpbml0aWFsIHRoZSByc3NpIGFzIGEgbWluaW11bSB2YWx1ZQorCX0KK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBCQV9UQUJMRSAqVGFiKQoreworCWludCBpOworCisJVGFiLT5udW1Bc09yaWdpbmF0b3IgPSAwOworCVRhYi0+bnVtQXNSZWNpcGllbnQgPSAwOworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCisJeworCQlUYWItPkJBUmVjRW50cnlbaV0uUkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmKFRhYi0+QkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspCisJeworCQlUYWItPkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8qISBcYnJpZWYgc2VhcmNoIHRoZSBCU1MgdGFibGUgYnkgU1NJRAorICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIGJzcyB0YWJsZQorICoJXHBhcmFtIHNzaWQgU1NJRCBzdHJpbmcKKyAqCVxyZXR1cm4gaW5kZXggb2YgdGhlIHRhYmxlLCBCU1NfTk9UX0ZPVU5EIGlmIG5vdCBpbiB0aGUgdGFibGUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZSBzZWFyY2ggYnkgc2VxdWVudGlhbCBzZWFyY2gKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1VMT05HIEJzc1RhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgcEJzc2lkLAorCUlOIFVDSEFSCSBDaGFubmVsKQoreworCVVDSEFSIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJLy8KKwkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCisJCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCisJCS8vCisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKQorCQl7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Cit9CisKK1VMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIJIHBCc3NpZCwKKwlJTiBQVUNIQVIJIHBTc2lkLAorCUlOIFVDSEFSCSBTc2lkTGVuLAorCUlOIFVDSEFSCSBDaGFubmVsKQoreworCVVDSEFSIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJLy8KKwkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCisJCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCisJCS8vCisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpICYmCisJCQlTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIJIEJzc2lkLAorCUlOIFBVQ0hBUgkgcFNzaWQsCisJSU4gVUNIQVIJIFNzaWRMZW4sCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8CisJCQkoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTCgmKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQpLCBCc3NpZCkgJiYKKwkJCShTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikgfHwKKwkJCShOZGlzRXF1YWxNZW1vcnkocFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSkgfHwKKwkJCShOZGlzRXF1YWxNZW1vcnkoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkpKQorCQl7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAorCUlOIE9VVAlCU1NfVEFCTEUgKlRhYiwKKwlJTgkJUFVDSEFSCSAgcEJzc2lkLAorCUlOCQlVQ0hBUgkgIENoYW5uZWwpCit7CisJVUNIQVIgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQlpZiAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA9PSBDaGFubmVsKSAmJgorCQkJKE1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkpKQorCQl7CisJCQlmb3IgKGogPSBpOyBqIDwgVGFiLT5Cc3NOciAtIDE7IGorKykKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmKFRhYi0+QnNzRW50cnlbal0pLCAmKFRhYi0+QnNzRW50cnlbaiArIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJfQorCQkJTmRpc1plcm9NZW1vcnkoJihUYWItPkJzc0VudHJ5W1RhYi0+QnNzTnIgLSAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCVRhYi0+QnNzTnIgLT0gMTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlEZWxldGUgdGhlIE9yaWdpbmF0b3IgRW50cnkgaW4gQkF0YWJsZS4gT3IgZGVjcmVhc2UgbnVtQXMgT3JpZ2luYXRvciBieSAxIGlmIG5lZWRlZC4KKworCUFyZ3VtZW50czoKKwkvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpCit7CisKKwlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQorCXsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRGVsZXRlT1JJRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOworCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCX0KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uVFhCQWJpdG1hcCAmPSAofigxPDwocEJBT1JJRW50cnktPlRJRCkgKSk7CS8vIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLkJBT3JpV2NpZEFycmF5W3BCQU9SSUVudHJ5LT5USURdID0gMDsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKKwkJcEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJCXBCQU9SSUVudHJ5LT5Ub2tlbiA9IDE7CisJCS8vIE5vdCBjbGVhciBTZXF1ZW5jZSBoZXJlLgorCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvKiEgXGJyaWVmCisgKglccGFyYW0KKyAqCVxyZXR1cm4KKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIEJzc0VudHJ5U2V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfRU5UUlkgKnBCc3MsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBQQ0ZfUEFSTSBwQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKwlDT1BZX01BQ19BRERSKHBCc3MtPkJzc2lkLCBwQnNzaWQpOworCS8vIERlZmF1bHQgSGlkZGVuIFNTSUQgdG8gYmUgVFJVRSwgaXQgd2lsbCBiZSB0dXJuZWQgdG8gRkFMU0UgYWZ0ZXIgY29waW5nIFNTSUQKKwlwQnNzLT5IaWRkZW4gPSAxOworCWlmIChTc2lkTGVuID4gMCkKKwl7CisJCS8vIEZvciBoaWRkZW4gU1NJRCBBUCwgaXQgbWlnaHQgc2VuZCBiZWFjb24gd2l0aCBTU0lEIGxlbiBlcXVhbCB0byAwCisJCS8vIE9yIHNlbmQgYmVhY29uIC9wcm9iZSByZXNwb25zZSB3aXRoIFNTSUQgbGVuIG1hdGNoaW5nIHJlYWwgU1NJRCBsZW5ndGgsCisJCS8vIGJ1dCBTU0lEIGlzIGFsbCB6ZXJvLiBzdWNoIGFzICIwMC0wMC0wMC0wMCIgd2l0aCBsZW5ndGggNC4KKwkJLy8gV2UgaGF2ZSB0byBwcmV2ZW50IHRoaXMgY2FzZSBvdmVyd3JpdGUgY29ycmVjdCB0YWJsZQorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSA9PSAwKQorCQl7CisJCSAgICBOZGlzWmVyb01lbW9yeShwQnNzLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZCwgU3NpZCwgU3NpZExlbik7CisJCQlwQnNzLT5Tc2lkTGVuID0gU3NpZExlbjsKKwkJCXBCc3MtPkhpZGRlbiA9IDA7CisJCX0KKwl9CisJZWxzZQorCQlwQnNzLT5Tc2lkTGVuID0gMDsKKwlwQnNzLT5Cc3NUeXBlID0gQnNzVHlwZTsKKwlwQnNzLT5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7CisJaWYgKEJzc1R5cGUgPT0gQlNTX0lORlJBKQorCXsKKwkJaWYgKHBDZlBhcm0tPmJWYWxpZCkKKwkJeworCQkJcEJzcy0+Q2ZwQ291bnQgPSBwQ2ZQYXJtLT5DZnBDb3VudDsKKwkJCXBCc3MtPkNmcFBlcmlvZCA9IHBDZlBhcm0tPkNmcFBlcmlvZDsKKwkJCXBCc3MtPkNmcE1heER1cmF0aW9uID0gcENmUGFybS0+Q2ZwTWF4RHVyYXRpb247CisJCQlwQnNzLT5DZnBEdXJSZW1haW5pbmcgPSBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmc7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEJzcy0+QXRpbVdpbiA9IEF0aW1XaW47CisJfQorCisJcEJzcy0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbzsKKwkvLyBUaGUgcHJpdmFjeSBiaXQgaW5kaWNhdGUgc2VjdXJpdHkgaXMgT04sIGl0IG1haWdodCBiZSBXRVAsIFRLSVAgb3IgQUVTCisJLy8gQ29tYmluZSB3aXRoIEF1dGhNb2RlLCB0aGV5IHdpbGwgZGVjaWRlIHRoZSBjb25uZWN0aW9uIG1ldGhvZHMuCisJcEJzcy0+UHJpdmFjeSA9IENBUF9JU19QUklWQUNZX09OKHBCc3MtPkNhcGFiaWxpdHlJbmZvKTsKKwlBU1NFUlQoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJaWYgKFN1cFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCXBCc3MtPlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCUFTU0VSVChFeHRSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzTW92ZU1lbW9yeShwQnNzLT5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOworCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisJcEJzcy0+TmV3RXh0Q2hhbk9mZnNldCA9IE5ld0V4dENoYW5PZmZzZXQ7CisJcEJzcy0+RXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJcEJzcy0+Q2hhbm5lbCA9IENoYW5uZWw7CisJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBDaGFubmVsOworCXBCc3MtPlJzc2kgPSBSc3NpOworCS8vIFVwZGF0ZSBDa2lwRmxhZy4gaWYgbm90IGV4aXN0cywgdGhlIHZhbHVlIGlzIDB4MAorCXBCc3MtPkNraXBGbGFnID0gQ2tpcEZsYWc7CisKKwkvLyBOZXcgZm9yIG1pY3Jvc29mdCBGaXhlZCBJRXMKKwlOZGlzTW92ZU1lbW9yeShwQnNzLT5GaXhJRXMuVGltZXN0YW1wLCAmVGltZVN0YW1wLCA4KTsKKwlwQnNzLT5GaXhJRXMuQmVhY29uSW50ZXJ2YWwgPSBCZWFjb25QZXJpb2Q7CisJcEJzcy0+Rml4SUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOworCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgVmFyaWFibGUgSUVzCisJaWYgKExlbmd0aFZJRSAhPSAwKQorCXsKKwkJcEJzcy0+VmFySUVMZW4gPSBMZW5ndGhWSUU7CisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlZhcklFcywgcFZJRSwgcEJzcy0+VmFySUVMZW4pOworCX0KKwllbHNlCisJeworCQlwQnNzLT5WYXJJRUxlbiA9IDA7CisJfQorCisJcEJzcy0+QWRkSHRJbmZvTGVuID0gMDsKKwlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSAwOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4+IDApCisJeworCQlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7CisJCWlmIChBZGRIdEluZm9MZW4gPiAwKQorCQl7CisJCQlwQnNzLT5BZGRIdEluZm9MZW4gPSBBZGRIdEluZm9MZW47CisJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLCBBZGRIdEluZm9MZW4pOworCisJIAkJCWlmICgocEFkZEh0SW5mby0+Q29udHJvbENoYW4gPiAyKSYmIChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkgCQkJeworCSAJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiAtIDI7CisJIAkJCX0KKwkgCQkJZWxzZSBpZiAoKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkJCXsKKwkJIAkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuICsgMjsKKwkJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlCc3NDaXBoZXJQYXJzZShwQnNzKTsKKworCS8vIG5ldyBmb3IgUU9TCisJaWYgKHBFZGNhUGFybSkKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwllbHNlCisJCXBCc3MtPkVkY2FQYXJtLmJWYWxpZCA9IEZBTFNFOworCWlmIChwUW9zQ2FwYWJpbGl0eSkKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFvc0NhcGFiaWxpdHksIHBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCWVsc2UKKwkJcEJzcy0+UW9zQ2FwYWJpbGl0eS5iVmFsaWQgPSBGQUxTRTsKKwlpZiAocFFic3NMb2FkKQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UWJzc0xvYWQsIHBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJZWxzZQorCQlwQnNzLT5RYnNzTG9hZC5iVmFsaWQgPSBGQUxTRTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlQRUlEX1NUUlVDVCAgICAgcEVpZDsKKwkJVVNIT1JUICAgICAgICAgIExlbmd0aCA9IDA7CisKKworCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+V3BhSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPlJzbklFLklFWzBdLCBNQVhfQ1VTVE9NX0xFTik7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgMyk7CisJCXBCc3MtPmJIYXNDb3VudHJ5SUUgPSBGQUxTRTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCXdoaWxlICgoTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuKSA8PSBMZW5ndGhWSUUpCisJCXsKKwkJCXN3aXRjaChwRWlkLT5FaWQpCisJCQl7CisJCQkJY2FzZSBJRV9XUEE6CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQl7CisJCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCisJCQkJCQl7CisJCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+V3BhSUUuSUUsIHBFaWQsIHBCc3MtPldwYUlFLklFTGVuKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElFX1JTTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorCQkJCQl7CisJCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCisJCQkJCQl7CisJCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+UnNuSUUuSUUsIHBFaWQsIHBCc3MtPlJzbklFLklFTGVuKTsKKwkJCX0KKwkJCQlicmVhazsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJY2FzZSBJRV9DT1VOVFJZOgorCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgcEVpZC0+T2N0ZXQsIDMpOworCQkJCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gVFJVRTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworICAgICAgICAgICAgfQorCQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KKwkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfQorCisvKiEKKyAqCVxicmllZiBpbnNlcnQgYW4gZW50cnkgaW50byB0aGUgYnNzIHRhYmxlCisgKglccGFyYW0gcF90YWIgVGhlIEJTUyB0YWJsZQorICoJXHBhcmFtIEJzc2lkIEJTU0lECisgKglccGFyYW0gc3NpZCBTU0lECisgKglccGFyYW0gc3NpZF9sZW4gTGVuZ3RoIG9mIFNTSUQKKyAqCVxwYXJhbSBic3NfdHlwZQorICoJXHBhcmFtIGJlYWNvbl9wZXJpb2QKKyAqCVxwYXJhbSB0aW1lc3RhbXAKKyAqCVxwYXJhbSBwX2NmCisgKglccGFyYW0gYXRpbV93aW4KKyAqCVxwYXJhbSBjYXAKKyAqCVxwYXJhbSByYXRlcworICoJXHBhcmFtIHJhdGVzX2xlbgorICoJXHBhcmFtIGNoYW5uZWxfaWR4CisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZSBJZiBTU0lEIGlzIGlkZW50aWNhbCwgdGhlIG9sZCBlbnRyeSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgb25lCisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitVTE9ORyBCc3NUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIENGX1BBUk0gKkNmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWxObywKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKwlVTE9ORwlJZHg7CisKKwlJZHggPSBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKFRhYiwgcEJzc2lkLCAgU3NpZCwgU3NpZExlbiwgQ2hhbm5lbE5vKTsKKwlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCisJeworCQlpZiAoVGFiLT5Cc3NOciA+PSBNQVhfTEVOX09GX0JTU19UQUJMRSkKKwkgICAgeworCQkJLy8KKwkJCS8vIEl0IG1heSBoYXBwZW4gd2hlbiBCU1MgVGFibGUgd2FzIGZ1bGwuCisJCQkvLyBUaGUgZGVzaXJlZCBBUCB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIEJTUyBUYWJsZQorCQkJLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSBmb3VuZCB0aGUgZGVzaXJlZCBBUCB0aGVuIG92ZXJ3cml0ZSBCU1MgVGFibGUuCisJCQkvLworCQkJaWYoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCXsKKwkJCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzaWQpIHx8CisJCQkJCVNTSURfRVFVQUwocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBTc2lkLCBTc2lkTGVuKSkKKwkJCQl7CisJCQkJCUlkeCA9IFRhYi0+QnNzT3ZlcmxhcE5yOworCQkJCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCisJCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAorCQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisgICAgICAgICAgICAgICAgICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gKFRhYi0+QnNzT3ZlcmxhcE5yKyspICUgTUFYX0xFTl9PRl9CU1NfVEFCTEU7CisJCQkJfQorCQkJCXJldHVybiBJZHg7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQlyZXR1cm4gQlNTX05PVF9GT1VORDsKKwkJCX0KKwkJfQorCQlJZHggPSBUYWItPkJzc05yOworCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCisJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCQlUYWItPkJzc05yKys7CisJfQorCWVsc2UKKwl7CisJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsQ2ZQYXJtLCBBdGltV2luLAorCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAorCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKwl9CisKKwlyZXR1cm4gSWR4OworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCAgVHJpRXZlbnRJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQlpOworCisJZm9yIChpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQorCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9IEZBTFNFOworCisJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID0gMDsKK30KKworVUxPTkcgVHJpRXZlbnRUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBUUklHR0VSX0VWRU5UX1RBQiAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCVJlZ0NsYXNzLAorCUlOIFVDSEFSIENoYW5uZWxObykKK3sKKwkvLyBFdmVudCBBCisJaWYgKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKQorCXsKKwkJaWYgKFRhYi0+RXZlbnRBTm8gPCBNQVhfVFJJR0dFUl9FVkVOVCkKKwkJeworCQkJUlRNUE1vdmVNZW1vcnkoVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQlNTSUQsIHBCc3NpZCwgNik7CisJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5iVmFsaWQgPSBUUlVFOworCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQ2hhbm5lbCA9IENoYW5uZWxObzsKKwkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkNEQ291bnRlciA9IHBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OworCQkJaWYgKFJlZ0NsYXNzICE9IDApCisJCQl7CisJCQkJLy8gQmVhY29uIGhhcyBSZWd1bGF0b3J5IGNsYXNzIElFLiBTbyB1c2UgYmVhY29uJ3MKKwkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IFJlZ0NsYXNzOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFVzZSBTdGF0aW9uJ3MgUmVndWxhdG9yeSBjbGFzcyBpbnN0ZWFkLgorCQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPT0gVFJVRSkKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJCXsKKwkJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gMzI7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSAzMzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9ID8/OworCisJCQl9CisKKwkJCVRhYi0+RXZlbnRBTm8gKys7CisJCX0KKwl9CisJZWxzZSBpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkludG9sZXJhbnQ0MCkKKwl7CisJCVRhYi0+RXZlbnRCQ291bnREb3duID0gcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVHJpZ2dlciBFdmVudCB0YWJsZSBNYWludGFpbmVuY2UgY2FsbGVkIG9uY2UgZXZlcnkgc2Vjb25kLgorCisJQXJndW1lbnRzOgorCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCWk7CisJQk9PTEVBTgkJCWJOb3RpZnkgPSBGQUxTRTsKKwlmb3IgKGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgJiYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyID4gMCkpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyLS07CisJCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXIgPT0gMCkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9IEZBTFNFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyAtLTsKKwkJCQkvLyBOZWVkIHRvIHNlbmQgMjAvNDAgQ29leGlzdGVuY2UgTm90aWZ5IGZyYW1lIGlmIGhhcyBzdGF0dXMgY2hhbmdlLgorCQkJCWJOb3RpZnkgPSBUUlVFOworCQkJfQorCQl9CisJfQorCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID4gMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24tLTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPT0gMCkKKwkJCWJOb3RpZnkgPSBUUlVFOworCX0KKworCWlmIChiTm90aWZ5ID09IFRSVUUpCisJCVVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkocEFkLCBCU1NJRF9XQ0lELCBUUlVFKTsKK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBCc3NUYWJsZVNzaWRTb3J0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfVEFCTEUgKk91dFRhYiwKKwlJTglDSEFSIFNzaWRbXSwKKwlJTglVQ0hBUiBTc2lkTGVuKQoreworCUlOVCBpOworCUJzc1RhYmxlSW5pdChPdXRUYWIpOworCisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJQlNTX0VOVFJZICpwSW5Cc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCQlCT09MRUFOCWJJc0hpZGRlbkFwSW5jbHVkZWQgPSBGQUxTRTsKKworCQlpZiAoKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpICYmCisgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwSW5Cc3MtPkNoYW5uZWwpKQorI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisgICAgICAgICAgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQlpZiAocEluQnNzLT5IaWRkZW4pCisJCQkJYklzSGlkZGVuQXBJbmNsdWRlZCA9IFRSVUU7CisJCX0KKworCQlpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJgorCQkJKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEluQnNzLT5Tc2lkLCBwSW5Cc3MtPlNzaWRMZW4pIHx8IGJJc0hpZGRlbkFwSW5jbHVkZWQpKQorCQl7CisJCQlCU1NfRU5UUlkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKKworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJLy8gSWYgbm8gQ291bnRyeSBJRSBleGlzdHMgbm8gQ29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkIHdoZW4gSUVFRTgwMjExZENsaWVudE1vZGUgaXMgc3RyaWN0LgorCQkJaWYgKChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCkgJiYKKwkJCQkocEluQnNzLT5iSGFzQ291bnRyeUlFID09IEZBTFNFKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCwgYnV0IHRoaXMgQVAgZG9lc24ndCBoYXZlIGNvdW50cnkgSUUuXG4iKSk7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyAyLjRHLzVHIE4gb25seSBtb2RlCisJCQlpZiAoKHBJbkJzcy0+SHRDYXBhYmlsaXR5TGVuID09IDApICYmCisJCQkJKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBIGlzIGluIE4tb25seSBNb2RlLCB0aGlzIEFQIGRvbid0IGhhdmUgSHQgY2FwYWJpbGl0eSBpbiBCZWFjb24uXG4iKSk7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIE5ldyBmb3IgV1BBMgorCQkJLy8gQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJeworCQkJCS8vIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKKwkJCQkJLy8gTm9uZSBtYXRjaGVkCisJCQkJCWNvbnRpbnVlOworCisJCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJCQl7CisJCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KKwkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikgJiYKKwkJCQkJCShwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpICYmCisJCQkJCQkocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpICYmCisJCQkJCQkocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkgJiYKKwkJCQkJCShwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBwSW5Cc3MtPldlcFN0YXR1cykpOworCQkJCS8vCisJCQkJLy8gRm9yIHRoZSBTRVN2MiBjYXNlLCB3ZSB3aWxsIG5vdCBxdWFsaWZ5IFdlcFN0YXR1cy4KKwkJCQkvLworCQkJCWlmICghcEluQnNzLT5iU0VTKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWQorCQkJLy8gSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LgorCQkJLy8gQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEhCisJCQlpZiAoU3NpZExlbiA9PSAwKQorCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJBTkRfV0lEVEhfMjApCisJCQkJCXsKKwkJCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKworCQkJT3V0VGFiLT5Cc3NOcisrOworCQl9CisJCWVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYgKFNzaWRMZW4gPT0gMCkpCisJCXsKKwkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKKwkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gTmV3IGZvciBXUEEyCisJCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl7CisJCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQorCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgorCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgorCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisKKwkJCU91dFRhYi0+QnNzTnIrKzsKKwkJfQorCisJCWlmIChPdXRUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQorCQkJYnJlYWs7CisJfQorCisJQnNzVGFibGVTb3J0QnlSc3NpKE91dFRhYik7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlU29ydEJ5UnNzaSgKKwlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpCit7CisJSU5UIAkgIGksIGo7CisJQlNTX0VOVFJZIFRtcEJzczsKKworCWZvciAoaSA9IDA7IGkgPCBPdXRUYWItPkJzc05yIC0gMTsgaSsrKQorCXsKKwkJZm9yIChqID0gaSsxOyBqIDwgT3V0VGFiLT5Cc3NOcjsgaisrKQorCQl7CisJCQlpZiAoT3V0VGFiLT5Cc3NFbnRyeVtqXS5Sc3NpID4gT3V0VGFiLT5Cc3NFbnRyeVtpXS5Sc3NpKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZUbXBCc3MsICZPdXRUYWItPkJzc0VudHJ5W2pdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbal0sICZPdXRUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbaV0sICZUbXBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitWT0lEIEJzc0NpcGhlclBhcnNlKAorCUlOIE9VVAlQQlNTX0VOVFJZCXBCc3MpCit7CisJUEVJRF9TVFJVQ1QgCQkgcEVpZDsKKwlQVUNIQVIJCQkJcFRtcDsKKwlQUlNOX0lFX0hFQURFUl9TVFJVQ1QJCQlwUnNuSGVhZGVyOworCVBDSVBIRVJfU1VJVEVfU1RSVUNUCQkJcENpcGhlcjsKKwlQQUtNX1NVSVRFX1NUUlVDVAkJCQlwQUtNOworCVVTSE9SVAkJCQkJCQlDb3VudDsKKwlJTlQJCQkJCQkJCUxlbmd0aDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlUbXBDaXBoZXI7CisKKwkvLworCS8vIFdlcFN0YXR1cyB3aWxsIGJlIHJlc2V0IGxhdGVyLCBpZiBBUCBhbm5vdW5jZSBUS0lQIG9yIEFFUyBvbiB0aGUgYmVhY29uIGZyYW1lLgorCS8vCisJaWYgKHBCc3MtPlByaXZhY3kpCisJeworCQlwQnNzLT5XZXBTdGF0dXMgCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJfQorCS8vIFNldCBkZWZhdWx0IHRvIGRpc2FibGUgJiBvcGVuIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSBwYXJzaW5nIHZhcmlhYmxlIElFCisJcEJzcy0+QXV0aE1vZGUJCT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwlwQnNzLT5BdXRoTW9kZUF1eAk9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkvLyBJbml0IFdQQSBzZXR0aW5nCisJcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQS5Sc25DYXBhYmlsaXR5ID0gMDsKKwlwQnNzLT5XUEEuYk1peE1vZGUJCT0gRkFMU0U7CisKKwkvLyBJbml0IFdQQTIgc2V0dGluZworCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIJID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IDA7CisJcEJzcy0+V1BBMi5iTWl4TW9kZSAJID0gRkFMU0U7CisKKworCUxlbmd0aCA9IChJTlQpIHBCc3MtPlZhcklFTGVuOworCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQkvLyBQYXJzZSBjaXBoZXIgc3VpdGUgYmFzZSBvbiBXUEExICYgV1BBMiwgdGhleSBzaG91bGQgYmUgcGFyc2VkIGRpZmZlcmVudGx5CisJCXBUbXAgPSAoKFBVQ0hBUikgcEJzcy0+VmFySUVzKSArIHBCc3MtPlZhcklFTGVuIC0gTGVuZ3RoOworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVG1wOworCQlzd2l0Y2ggKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9XUEE6CisJCQkJLy9QYXJzZSBDaXNjbyBJRV9XUEEgKExFQVAsIENDS00sIGV0Yy4pCisJCQkJaWYgKCBOZGlzRXF1YWxNZW1vcnkoKHBUbXArOCksIENJU0NPX09VSSwgMykpCisJCQkJeworCQkJCQlwVG1wICAgKz0gMTE7CisJCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJCXsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gaWYgQ2lzY28gSUVfV1BBLCBicmVhaworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBTRVNfT1VJLCAzKSAmJiAocEVpZC0+TGVuID09IDcpKQorCQkJCXsKKwkJCQkJcEJzcy0+YlNFUyA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpICE9IDEpCisJCQkJeworCQkJCQkvLyBpZiB1bnN1cHBvcnRlZCB2ZW5kb3Igc3BlY2lmaWMgSUUKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFNraXAgT1VJLCB2ZXJzaW9uLCBhbmQgbXVsdGljYXN0IHN1aXRlCisJCQkJLy8gVGhpcyBwYXJ0IHNob3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gQVAgc3VwcG9ydGVkIG11bHRpcGxlIGNpcGhlciBzdWl0ZS4KKwkJCQkvLyBGb3Igbm93LCBpdCdzIE9LIHNpbmNlIGFsbW9zdCBhbGwgQVBzIGhhdmUgZml4ZWQgY2lwaGVyIHN1aXRlIHN1cHBvcnRlZC4KKwkJCQkvLyBwVG1wID0gKFBVQ0hBUikgcEVpZC0+T2N0ZXQ7CisJCQkJcFRtcCAgICs9IDExOworCisJCQkJLy8gQ2lwaGVyIFN1aXRlIFNlbGVjdG9ycyBmcm9tIFNwZWMgUDgwMi4xMWkvRDMuMiBQMjYuCisJCQkJLy8JVmFsdWUJICAgTWVhbmluZworCQkJCS8vCTAJCQlOb25lCisJCQkJLy8JMQkJCVdFUC00MAorCQkJCS8vCTIJCQlUa2lwCisJCQkJLy8JMwkJCVdSQVAKKwkJCQkvLwk0CQkJQUVTCisJCQkJLy8JNQkJCVdFUC0xMDQKKwkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKKwkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNToKKwkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gbnVtYmVyIG9mIHVuaWNhc3Qgc3VpdGUKKwkJCQlwVG1wICAgKz0gMTsKKworCQkJCS8vIHNraXAgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlcworCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCisJCQkJd2hpbGUgKENvdW50ID4gMCkKKwkJCQl7CisJCQkJCS8vIFNraXAgT1VJCisJCQkJCXBUbXAgKz0gMzsKKwkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCQl7CisJCQkJCQljYXNlIDE6CisJCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBLlBhaXJDaXBoZXIpCisJCQkJCXsKKwkJCQkJCS8vIE1vdmUgdGhlIGxvd2VyIGNpcGhlciBzdWl0ZSB0byBQYWlyQ2lwaGVyQXV4CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQlwVG1wKys7CisJCQkJCUNvdW50LS07CisJCQkJfQorCisJCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKKwkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisJCQkJcFRtcCAgICs9IDM7CisKKwkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCQkJZWxzZQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBUbXAgICArPSAxOworCisJCQkJLy8gRml4ZWQgZm9yIFdQQS1Ob25lCisJCQkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCXsKKwkJCQkJcEJzcy0+QXV0aE1vZGUJICA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJCS8vIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlcgorCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKKworCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKKwkJCQlpZiAocEJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCQlwQnNzLT5XUEEuYk1peE1vZGUgPSBUUlVFOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfUlNOOgorCQkJCXBSc25IZWFkZXIgPSAoUFJTTl9JRV9IRUFERVJfU1RSVUNUKSBwVG1wOworCisJCQkJLy8gMC4gVmVyc2lvbiBtdXN0IGJlIDEKKwkJCQlpZiAobGUyY3B1MTYocFJzbkhlYWRlci0+VmVyc2lvbikgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJcFRtcCAgICs9IHNpemVvZihSU05fSUVfSEVBREVSX1NUUlVDVCk7CisKKwkJCQkvLyAxLiBDaGVjayBncm91cCBjaXBoZXIKKwkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCQlicmVhazsKKworCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgorCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA1OgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBzZXQgdG8gY29ycmVjdCBvZmZzZXQgZm9yIG5leHQgcGFyc2luZworCQkJCXBUbXAgICArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisKKwkJCQkvLyAyLiBHZXQgcGFpcndpc2UgY2lwaGVyIGNvdW50cworCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIDMuIEdldCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQorCQkJCXdoaWxlIChDb3VudCA+IDApCisJCQkJeworCQkJCQkvLyBTa2lwIE9VSQorCQkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJeworCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJcFRtcCArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisJCQkJCUNvdW50LS07CisJCQkJfQorCisJCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKKwkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisKKwkJCQkvLyA1LiBHZXQgQUtNIGNpcGhlcnMKKwkJCQlwQUtNID0gKFBBS01fU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCQlicmVhazsKKworCQkJCXN3aXRjaCAocEFLTS0+VHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCAgICs9IChDb3VudCAqIHNpemVvZihBS01fU1VJVEVfU1RSVUNUKSk7CisKKwkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKKwkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJeworCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7CisJCQkJCXBCc3MtPldlcFN0YXR1cyAJCT0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKKwkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCX0KKwkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKworCQkJCS8vIDYuIEdldCBSU04gY2FwYWJpbGl0eQorCQkJCS8vcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKihQVVNIT1JUKSBwVG1wOworCQkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKKwkJCQlpZiAocEJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCXBCc3MtPldQQTIuYk1peE1vZGUgPSBUUlVFOworCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCUxlbmd0aCAtPSAocEVpZC0+TGVuICsgMik7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtYWNfdGFibGUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmIGdlbmVyYXRlcyBhIHJhbmRvbSBtYWMgYWRkcmVzcyB2YWx1ZSBmb3IgSUJTUyBCU1NJRAorICoJXHBhcmFtIEFkZHIgdGhlIGJzc2lkIGxvY2F0aW9uCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKi8KK1ZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEFkZHIpCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCisJeworCQlwQWRkcltpXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwl9CisKKwlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsgIC8vIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4Cit9CisKKy8qISBcYnJpZWYgaW5pdCB0aGUgbWFuYWdlbWVudCBtYWMgZnJhbWUgaGVhZGVyCisgKglccGFyYW0gcF9oZHIgbWFjIGhlYWRlcgorICoJXHBhcmFtIHN1YnR5cGUgc3VidHlwZSBvZiB0aGUgZnJhbWUKKyAqCVxwYXJhbSBwX2RzIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGRvbid0IGNhcmUgaWYgaXQgaXMgYSBicm9hZGNhc3QgYWRkcmVzcworICoJXHJldHVybiBub25lCisgKglccHJlIHRoZSBzdGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBwQWQtPlN0YUNmZworICoJIC0gYnNzaWQKKyAqCSAtIHN0YXRpb24gYWRkcmVzcworICoJXHBvc3QKKyAqCVxub3RlIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGZvbGxvd2luZyBmaWVsZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIE1ndE1hY0hlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKwlJTiBVQ0hBUiBTdWJUeXBlLAorCUlOIFVDSEFSIFRvRHMsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisJcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU3ViVHlwZTsKKy8vCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQkvLyBzYW1wbGUsIG5vIHVzZSwgaXQgd2lsbCBjb25mbGljdCB3aXRoIEFDVElPTiBmcmFtZSBzdWIgdHlwZQorLy8JCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7CisJcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1lbV9tZ210LmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIHJvdXRpbmUgYnVpbGQgYW4gb3V0Z29pbmcgZnJhbWUsIGFuZCBmaWxsIGFsbCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKKyAqIGluIGFyZ3VtZW50IGxpc3QgdG8gdGhlIGZyYW1lIGJvZHkuIFRoZSBhY3R1YWwgZnJhbWUgc2l6ZSBpcyB0aGUgc3VtbWF0aW9uCisgKiBvZiBhbGwgYXJndW1lbnRzLgorICogaW5wdXQgcGFyYW1zOgorICoJCUJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBzZWdtZW50CisgKgkJYXJncyAtIGEgbGlzdCBvZiA8aW50IGFyZ19zaXplLCBhcmc+IHBhaXJzLgorICoJCU5PVEUgTk9URSBOT1RFISEhISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCisgKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEhIQorICogcmV0dXJuOgorICoJCVNpemUgb2YgdGhlIGJ1ZmZlcgorICogdXNhZ2U6CisgKgkJTWFrZU91dGdvaW5nRnJhbWUoQnVmZmVyLCBvdXRwdXRfbGVuZ3RoLCAyLCAmZmMsIDIsICZkdXIsIDYsIHBfYWRkcjEsIDYscF9hZGRyMiwgRU5EX09GX0FSR1MpOworCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitVTE9ORyBNYWtlT3V0Z29pbmdGcmFtZSgKKwlPVVQgQ0hBUiAqQnVmZmVyLAorCU9VVCBVTE9ORyAqRnJhbWVMZW4sIC4uLikKK3sKKwlDSEFSICAgKnA7CisJaW50IAlsZW5nOworCVVMT05HCVRvdExlbmc7CisJdmFfbGlzdCBBcmdzOworCisJLy8gY2FsY3VsYXRlcyB0aGUgdG90YWwgbGVuZ3RoCisJVG90TGVuZyA9IDA7CisJdmFfc3RhcnQoQXJncywgRnJhbWVMZW4pOworCWRvCisJeworCQlsZW5nID0gdmFfYXJnKEFyZ3MsIGludCk7CisJCWlmIChsZW5nID09IEVORF9PRl9BUkdTKQorCQl7CisJCQlicmVhazsKKwkJfQorCQlwID0gdmFfYXJnKEFyZ3MsIFBWT0lEKTsKKwkJTmRpc01vdmVNZW1vcnkoJkJ1ZmZlcltUb3RMZW5nXSwgcCwgbGVuZyk7CisJCVRvdExlbmcgPSBUb3RMZW5nICsgbGVuZzsKKwl9IHdoaWxlKFRSVUUpOworCisJdmFfZW5kKEFyZ3MpOyAvKiBjbGVhbiB1cCAqLworCSpGcmFtZUxlbiA9IFRvdExlbmc7CisJcmV0dXJuIFRvdExlbmc7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1sbWVfcXVldWUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmCUluaXRpYWxpemUgVGhlIE1MTUUgUXVldWUsIHVzZWQgYnkgTUxNRSBGdW5jdGlvbnMKKyAqCVxwYXJhbQkqUXVldWUJICAgVGhlIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gQWx3YXlzCSAgIFJldHVybiBORElTX1NUQVRFX1NVQ0NFU1MgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlCUJlY2F1c2UgdGhpcyBpcyBkb25lIG9ubHkgb25jZSAoYXQgdGhlIGluaXQgc3RhZ2UpLCBubyBuZWVkIHRvIGJlIGxvY2tlZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitORElTX1NUQVRVUyBNbG1lUXVldWVJbml0KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQoreworCUlOVCBpOworCisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJlF1ZXVlLT5Mb2NrKTsKKworCVF1ZXVlLT5OdW0JPSAwOworCVF1ZXVlLT5IZWFkID0gMDsKKwlRdWV1ZS0+VGFpbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NTE1FX1FVRVVFOyBpKyspCisJeworCQlRdWV1ZS0+RW50cnlbaV0uT2NjdXBpZWQgPSBGQUxTRTsKKwkJUXVldWUtPkVudHJ5W2ldLk1zZ0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KFF1ZXVlLT5FbnRyeVtpXS5Nc2csIE1HTVRfRE1BX0JVRkZFUl9TSVpFKTsKKwl9CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyohIFxicmllZgkgRW5xdWV1ZSBhIG1lc3NhZ2UgZm9yIG90aGVyIHRocmVhZHMsIGlmIHRoZXkgd2FudCB0byBzZW5kIG1lc3NhZ2VzIHRvIE1MTUUgdGhyZWFkCisgKglccGFyYW0JKlF1ZXVlCSAgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkgTWFjaGluZSAgVGhlIFN0YXRlIE1hY2hpbmUgSWQKKyAqCVxwYXJhbQkgTXNnVHlwZSAgVGhlIE1lc3NhZ2UgVHlwZQorICoJXHBhcmFtCSBNc2dMZW4gICBUaGUgTWVzc2FnZSBsZW5ndGgKKyAqCVxwYXJhbQkqTXNnCSAgVGhlIG1lc3NhZ2UgcG9pbnRlcgorICoJXHJldHVybiAgVFJVRSBpZiBlbnF1ZXVlIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIHRoZSBxdWV1ZSBpcyBmdWxsCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUJIFRoZSBtZXNzYWdlIGhhcyB0byBiZSBpbml0aWFsaXplZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVFbnF1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIE1hY2hpbmUsCisJSU4gVUxPTkcgTXNnVHlwZSwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gVk9JRCAqTXNnKQoreworCUlOVCBUYWlsOworCU1MTUVfUVVFVUUJKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWU6IG1zZyB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlUYWlsID0gUXVldWUtPlRhaWw7CisJUXVldWUtPlRhaWwrKzsKKwlRdWV1ZS0+TnVtKys7CisJaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKKwl7CisJCVF1ZXVlLT5UYWlsID0gMDsKKwl9CisKKwlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9IFJFU0VSVkVEX1dDSUQ7CisJUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gID0gTXNnTGVuOworCisJaWYgKE1zZyAhPSBOVUxMKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOworCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCXJldHVybiBUUlVFOworfQorCisvKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBSZWN2IGdldHMgYSBNTE1FIG1lc3NhZ2UKKyAqCVxwYXJhbQkqUXVldWUJCQkgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkgVGltZVN0YW1wSGlnaAkgVGhlIHVwcGVyIDMyIGJpdCBvZiB0aW1lc3RhbXAKKyAqCVxwYXJhbQkgVGltZVN0YW1wTG93CSBUaGUgbG93ZXIgMzIgYml0IG9mIHRpbWVzdGFtcAorICoJXHBhcmFtCSBSc3NpCQkJIFRoZSByZWNlaXZpbmcgUlNTSSBzdHJlbmd0aAorICoJXHBhcmFtCSBNc2dMZW4gCQkgVGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZQorICoJXHBhcmFtCSpNc2cJCQkgVGhlIG1lc3NhZ2UgcG9pbnRlcgorICoJXHJldHVybiAgVFJVRSBpZiBldmVyeXRoaW5nIG9rLCBGQUxTRSBvdGhlcndpc2UgKGxpa2UgUXVldWUgRnVsbCkKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVTE9ORyBXY2lkLAorCUlOIFVMT05HIFRpbWVTdGFtcEhpZ2gsCisJSU4gVUxPTkcgVGltZVN0YW1wTG93LAorCUlOIFVDSEFSIFJzc2kwLAorCUlOIFVDSEFSIFJzc2kxLAorCUlOIFVDSEFSIFJzc2kyLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2csCisJSU4gVUNIQVIgU2lnbmFsKQoreworCUlOVCAJCSBUYWlsLCBNYWNoaW5lOworCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCUlOVAkJIE1zZ1R5cGU7CisJTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZSAqLworCWlmKEFURV9PTihwQWQpKQorCQlyZXR1cm4gRkFMU0U7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoIU1zZ1R5cGVTdWJzdChwQWQsIHBGcmFtZSwgJk1hY2hpbmUsICZNc2dUeXBlKSkKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIE9LLCB3ZSBnb3QgYWxsIHRoZSBpbmZvcm1hdGlvbnMsIGl0IGlzIHRpbWUgdG8gcHV0IHRoaW5ncyBpbnRvIHF1ZXVlCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJVGFpbCA9IFF1ZXVlLT5UYWlsOworCVF1ZXVlLT5UYWlsKys7CisJUXVldWUtPk51bSsrOworCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCisJeworCQlRdWV1ZS0+VGFpbCA9IDA7CisJfQorCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuTG93UGFydCA9IFRpbWVTdGFtcExvdzsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuSGlnaFBhcnQgPSBUaW1lU3RhbXBIaWdoOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMCA9IFJzc2kwOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMSA9IFJzc2kxOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMiA9IFJzc2kyOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5TaWduYWwgPSBTaWduYWw7CisJUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSAoVUNIQVIpV2NpZDsKKworCVF1ZXVlLT5FbnRyeVtUYWlsXS5DaGFubmVsID0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsOworCisJaWYgKE1zZyAhPSBOVUxMKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOworCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyohIFxicmllZgkgRGVxdWV1ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JKkVsZW0JICBUaGUgbWVzc2FnZSBkZXF1ZXVlZCBmcm9tIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIEVsZW0gY29udGFpbnMgc29tZXRoaW5nLCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVEZXF1ZXVlKAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAorCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKQoreworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCSpFbGVtID0gJihRdWV1ZS0+RW50cnlbUXVldWUtPkhlYWRdKTsKKwlRdWV1ZS0+TnVtLS07CisJUXVldWUtPkhlYWQrKzsKKwlpZiAoUXVldWUtPkhlYWQgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQorCXsKKwkJUXVldWUtPkhlYWQgPSAwOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lECU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUJPT0xFQU4JCQkJQ2FuY2VsbGVkOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUgXG4iKSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlVQ0hBUiBpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkvLyBDYW5jZWwgYWxsIHRpbWVyIGV2ZW50cworCQkvLyBCZSBjYXJlZnVsIHRvIGNhbmNlbCBuZXcgYWRkZWQgdGltZXIKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENoYW5nZSBiYWNrIHRvIG9yaWdpbmFsIGNoYW5uZWwgaW4gY2FzZSBvZiBkb2luZyBzY2FuCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZXN1bWUgTVNEVSB3aGljaCBpcyB0dXJuZWQgb2ZmIGR1cm5pbmcgc2NhbgorCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gU2V0IGFsbCBzdGF0ZSBtYWNoaW5lcyBiYWNrIElETEUKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgICA9IEFTU09DX0lETEU7CisJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgICAgPSBBVVRIX1JFUV9JRExFOworCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IFNZTkNfSURMRTsKKwkJcEFkLT5NbG1lLkFjdE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQUNUX0lETEU7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCXBBZC0+TWxtZS5EbHNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IERMU19JRExFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisvKiEgXGJyaWVmCXRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZW1wdHkKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHJldHVybiBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lUXVldWVFbXB0eSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlCT09MRUFOIEFuczsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCUFucyA9IChRdWV1ZS0+TnVtID09IDApOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCisJcmV0dXJuIEFuczsKK30KKworLyohIFxicmllZgkgdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBmdWxsCisgKglccGFyYW0JICpRdWV1ZSAJIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuICBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVRdWV1ZUZ1bGwoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpCit7CisJQk9PTEVBTiBBbnM7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlBbnMgPSAoUXVldWUtPk51bSA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUgfHwgUXVldWUtPkVudHJ5W1F1ZXVlLT5UYWlsXS5PY2N1cGllZCk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlyZXR1cm4gQW5zOworfQorCisvKiEgXGJyaWVmCSBUaGUgZGVzdHJ1Y3RvciBvZiBNTE1FIFF1ZXVlCisgKglccGFyYW0KKyAqCVxyZXR1cm4KKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQlDbGVhciBNbG1lIFF1ZXVlLCBTZXQgUXVldWUtPk51bSB0byBaZXJvLgorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIE1sbWVRdWV1ZURlc3Ryb3koCisJSU4gTUxNRV9RVUVVRSAqcFF1ZXVlKQoreworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKKwlwUXVldWUtPk51bSAgPSAwOworCXBRdWV1ZS0+SGVhZCA9IDA7CisJcFF1ZXVlLT5UYWlsID0gMDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7CisJTmRpc0ZyZWVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOworfQorCisvKiEgXGJyaWVmCSBUbyBzdWJzdGl0dXRlIHRoZSBtZXNzYWdlIHR5cGUgaWYgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gZXh0ZXJuYWwKKyAqCVxwYXJhbQlwRnJhbWUJCSAgIFRoZSBmcmFtZSByZWNlaXZlZAorICoJXHBhcmFtCSpNYWNoaW5lCSAgIFRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JKk1zZ1R5cGUJICAgdGhlIG1lc3NhZ2UgdHlwZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxyZXR1cm4gVFJVRSBpZiB0aGUgc3Vic3RpdHV0aW9uIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JPT0xFQU4gTXNnVHlwZVN1YnN0KAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKwlPVVQgSU5UICpNYWNoaW5lLAorCU9VVCBJTlQgKk1zZ1R5cGUpCit7CisJVVNIT1JUCVNlcTsKKwlVQ0hBUglFQVBUeXBlOworCVBVQ0hBUglwRGF0YTsKKworCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCisJcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOworCisJLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCisJaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKwl7CisJCWlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF9BSVJPTkVULCBwRGF0YSwgTEVOR1RIXzgwMl8xX0gpKQorCQl7CisJCQkvLyBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGVyCisJCQkqTWFjaGluZSA9IEFJUk9ORVRfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX0FJUk9ORVRfTVNHOworCQkJcmV0dXJuIChUUlVFKTsKKwkJfQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQlpZiAoIHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVAgKSAvL0xFQVAKKwkJeworCQkJLy8gTEVBUCBmcmFtZXMKKwkJCSpNYWNoaW5lID0gTEVBUF9TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybiAoTGVhcE1zZ1R5cGVTdWJzdChFQVBUeXBlLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQl7CisJCQkqTWFjaGluZSA9IFdQQV9QU0tfU1RBVEVfTUFDSElORTsKKwkJCUVBUFR5cGUgPSAqKChVQ0hBUiopcEZyYW1lICsgTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgMSk7CisJCQlyZXR1cm4oV3BhTXNnVHlwZVN1YnN0KEVBUFR5cGUsIE1zZ1R5cGUpKTsKKwkJfQorCX0KKworCXN3aXRjaCAocEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkKKwl7CisJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUkVROgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SRVE6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SU1A6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQkVBQ09OOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BVElNOgorCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FUSU07CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ESVNBU1NPQ19SRVE7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0FVVEg6CisJCQkvLyBnZXQgdGhlIHNlcXVlbmNlIG51bWJlciBmcm9tIHBheWxvYWQgMjQgTWFjIEhlYWRlciArIDIgYnl0ZXMgYWxnb3JpdGhtCisJCQlOZGlzTW92ZU1lbW9yeSgmU2VxLCAmcEZyYW1lLT5PY3RldFsyXSwgc2l6ZW9mKFVTSE9SVCkpOworCQkJaWYgKFNlcSA9PSAxIHx8IFNlcSA9PSAzKQorCQkJeworCQkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfT0REOworCQkJfQorCQkJZWxzZSBpZiAoU2VxID09IDIgfHwgU2VxID09IDQpCisJCQl7CisJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7CisJCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX0VWRU47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RFQVVUSDsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQUNUSU9OOgorCQkJKk1hY2hpbmUgPSBBQ1RJT05fU1RBVEVfTUFDSElORTsKKwkJCS8vICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQKKwkJCWlmICgocEZyYW1lLT5PY3RldFswXSYweDdGKSA+IE1BWF9QRUVSX0NBVEVfTVNHKQorCQkJeworCQkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpNc2dUeXBlID0gKHBGcmFtZS0+T2N0ZXRbMF0mMHg3Rik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBzdGF0ZV9tYWNoaW5lLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgorICoJXHBhcmFtICpTCQkJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCVRyYW5zCQlTdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24KKyAqCVxwYXJhbQlTdE5yCQludW1iZXIgb2Ygc3RhdGVzCisgKglccGFyYW0JTXNnTnIJCW51bWJlciBvZiBtZXNzYWdlcworICoJXHBhcmFtCURlZkZ1bmMgCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCisgKglccGFyYW0JSW5pdFN0YXRlCWluaXRpYWwgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQlCYXNlCQlTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKKyAqCVxwcmUgcF9zbSBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIFN0YXRlTWFjaGluZUluaXQoCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwlJTiBVTE9ORyBTdE5yLAorCUlOIFVMT05HIE1zZ05yLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCUlOIFVMT05HIEluaXRTdGF0ZSwKKwlJTiBVTE9ORyBCYXNlKQoreworCVVMT05HIGksIGo7CisKKwkvLyBzZXQgbnVtYmVyIG9mIHN0YXRlcyBhbmQgbWVzc2FnZXMKKwlTLT5OclN0YXRlID0gU3ROcjsKKwlTLT5Ock1zZyAgID0gTXNnTnI7CisJUy0+QmFzZSAgICA9IEJhc2U7CisKKwlTLT5UcmFuc0Z1bmMgID0gVHJhbnM7CisKKwkvLyBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24KKwlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IE1zZ05yOyBqKyspCisJCXsKKwkJCVMtPlRyYW5zRnVuY1tpICogTXNnTnIgKyBqXSA9IERlZkZ1bmM7CisJCX0KKwl9CisKKwkvLyBzZXQgdGhlIHN0YXJ0aW5nIHN0YXRlCisJUy0+Q3VyclN0YXRlID0gSW5pdFN0YXRlOworfQorCisvKiEgXGJyaWVmIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW50byB0aGUgY2VsbCBpbiB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtICpTCXBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbSBTdAlzdGF0ZQorICoJXHBhcmFtIE1zZwlpbmNvbWluZyBtZXNzYWdlCisgKglccGFyYW0gZgl0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiAoc3RhdGUsIG1lc3NhZ2UpIGNvbWJpbmF0aW9uIG9jY3VycyBhdCB0aGUgc3RhdGUgbWFjaGluZQorICoJXHByZSAqUyBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLCBzdCwgbXNnLCBzaG91bGQgYmUgYWxsIHdpdGhpbiB0aGUgcmFuZ2UsIEJhc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgaW5pdGlhbCBzdGF0ZQorICoJXHBvc3QKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAqLworVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBVTE9ORyBTdCwKKwlJTiBVTE9ORyBNc2csCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIEZ1bmMpCit7CisJVUxPTkcgTXNnSWR4OworCisJTXNnSWR4ID0gTXNnIC0gUy0+QmFzZTsKKworCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpCisJeworCQkvLyBib3VuZGFyeSBjaGVja2luZyBiZWZvcmUgc2V0dGluZyB0aGUgYWN0aW9uCisJCVMtPlRyYW5zRnVuY1tTdCAqIFMtPk5yTXNnICsgTXNnSWR4XSA9IEZ1bmM7CisJfQorfQorCisvKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHN0YXRlIHRyYW5zaXRpb24KKyAqCVxwYXJhbQkgKkFkYXB0ZXIgdGhlIE5JQyBhZGFwdGVyIHBvaW50ZXIKKyAqCVxwYXJhbQkgKlMgCSAgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQkgKkVsZW0JICB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZAorICoJXHJldHVybiAgIE5vbmUKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkoKihTLT5UcmFuc0Z1bmNbUy0+Q3VyclN0YXRlICogUy0+TnJNc2cgKyBFbGVtLT5Nc2dUeXBlIC0gUy0+QmFzZV0pKShwQWQsIEVsZW0pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoZSBkcm9wIGZ1bmN0aW9uLCB3aGVuIG1hY2hpbmUgZXhlY3V0ZXMgdGhpcywgdGhlIG1lc3NhZ2UgaXMgc2ltcGx5CisJCWlnbm9yZWQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCB0aGUgbWVzc2FnZSBpcyBmcmVlZCBpbgorCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKCkKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERyb3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsZnNyLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTGZzckluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgU2VlZCkKK3sKKwlpZiAoU2VlZCA9PSAwKQorCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAxOworCWVsc2UKKwkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gU2VlZDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1VDSEFSIFJhbmRvbUJ5dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcgaTsKKwlVQ0hBUiBSLCBSZXN1bHQ7CisKKwlSID0gMDsKKworCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgPT0gMCkKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKChVTE9ORyAqKSZwQWQtPk1sbWUuU2hpZnRSZWcpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgJiAweDAwMDAwMDAxKQorCQl7CisJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAoKHBBZC0+TWxtZS5TaGlmdFJlZyBeIExGU1JfTUFTSykgPj4gMSkgfCAweDgwMDAwMDAwOworCQkJUmVzdWx0ID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IHBBZC0+TWxtZS5TaGlmdFJlZyA+PiAxOworCQkJUmVzdWx0ID0gMDsKKwkJfQorCQlSID0gKFIgPDwgMSkgfCBSZXN1bHQ7CisJfQorCisJcmV0dXJuIFI7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBSYXRlVGFibGUpCit7CisJVUNIQVIJCQkJCWk7CisJSFRfRkJLX0NGRzBfU1RSVUMJCUh0Q2ZnMDsKKwlIVF9GQktfQ0ZHMV9TVFJVQwkJSHRDZmcxOworCUxHX0ZCS19DRkcwX1NUUlVDCQlMZ0NmZzA7CisJTEdfRkJLX0NGRzFfU1RSVUMJCUxnQ2ZnMTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGU7CisKKwkvLyBzZXQgdG8gaW5pdGlhbCB2YWx1ZQorCUh0Q2ZnMC53b3JkID0gMHg2NTQzMjEwMDsKKwlIdENmZzEud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcwLndvcmQgPSAweGVkY2JhOTg4OworCUxnQ2ZnMS53b3JkID0gMHgwMDAwMjEwMDsKKworCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMTsKKwlmb3IgKGkgPSAxOyBpIDwgKigoUFVDSEFSKSBwUmF0ZVRhYmxlKTsgaSsrKQorCXsKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxK2k7CisJCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpCisJCXsKKwkJCWNhc2UgMDoJCS8vQ0NLCisJCQkJYnJlYWs7CisJCQljYXNlIDE6CQkvL09GRE0KKwkJCQl7CisJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCQkJeworCQkJCQkJY2FzZSAwOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAzOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTM0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDU6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA2OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNzoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIDI6CQkvL0hULU1JWAorCQkJY2FzZSAzOgkJLy9IVC1HRgorCQkJCXsKKwkJCQkJaWYgKChwTmV4dFR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSAmJiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgIT0gcE5leHRUeFJhdGUtPkN1cnJNQ1MpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDU6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA2OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNzoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTN0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDg6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA5OgorCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTA6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTE6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTI6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTM6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTQ6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTU6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZTogbm90IHN1cHBvcnQgQ3Vyck1DUz0lZFxuIiwgcEN1cnJUeFJhdGUtPkN1cnJNQ1MpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCisJCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgorCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgorCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCisKKwkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKKwkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCisJCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KKwkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KKwkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKKwkJaWYgKGJOb25HRkV4aXN0KQorCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIAkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcikKKwl7CisJCS8vCisJCS8vIGVuYWJsZSB0aGUgUlRTL0NUUyB0byBhdm9pZCBjaGFubmVsIGNvbGxpc2lvbgorCQkvLworCQlTZXRNYXNrID0gQUxMTl9TRVRQUk9URUNUOworCQlPcGVyYXRpb25Nb2RlID0gODsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKKwlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKKyNpZiAwCisJTWFjUmVnIHw9IChwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPDwgOCk7CisjZWxzZQorCS8vIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYmFsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYKKyAgICAgICAgaWYgKCgKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCShwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKKyAgICAgICAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9PSBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgeworCQkJTWFjUmVnIHw9ICgweDEwMDAgPDwgOCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisJCQlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKyAgICAgICAgfQorI2VuZGlmCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOworCisJLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncworCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7CisJUHJvdENmZzQud29yZCA9IDA7CisJUHJvdENmZy53b3JkID0gMDsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOworCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKworCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQorCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCisJeworCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisJZWxzZQorCXsKKwkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAorCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBEZWNpZGUgSFQgZnJhbWUgcHJvdGVjdGlvbi4KKwlpZiAoKFNldE1hc2sgJiBBTExOX1NFVFBST1RFQ1QpICE9IDApCisJeworCQlzd2l0Y2goT3BlcmF0aW9uTW9kZSkKKwkJeworCQkJY2FzZSAweDA6CisJCQkJLy8gTk8gUFJPVEVDVAorCQkJCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCisJCQkJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCisJCQkJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCisJCQkJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KKworCQkJCS8vIE1NMjBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCQkJCS8vIE1NNDBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJCQkJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7CisKKwkJCQkvLyBDRjIwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkJCQkvLyBDRjQwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJCQkJaWYgKGJOb25HRkV4aXN0KQorCQkJCXsKKwkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQorCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQorCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7CisJCQkJfQorCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworIAkJCWNhc2UgMToKKwkJCQkvLyBUaGlzIGlzICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZS4iCisJCQkJLy8gSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgorCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7CisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJLy8gSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMKKwkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OyAgLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KKworCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzCisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCWlmIChiTm9uR0ZFeGlzdCkKKwkJCQl7CisJCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQl9CisJCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCS8vIEhUIG1peGVkIG1vZGUuCSBQUk9URUNUIEFMTCEKKwkJCQkvLyBBc3NpZ24gUmF0ZQorCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OworCQkJCS8vIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZQorCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQl7CisJCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KKwkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzCisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQkJLy8gU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4KKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCW9mZnNldCA9IENDS19QUk9UX0NGRzsKKwlmb3IgKGkgPSAwO2kgPCA2O2krKykKKwl7CisJCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwsCisJSU4JQk9PTEVBTgkJCWJTY2FuKQoreworCVVMT05HCQkJUjIgPSAwLCBSMyA9IERFRkFVTFRfUkZfVFhfUE9XRVIsIFI0ID0gMDsKKwlDSEFSICAgIFR4UHdlciA9IDAsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOyAvL0JicDk0ID0gQkJQUjk0X0RFRkFVTFQsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCVVDSEFSCWluZGV4OworCVVJTlQzMiAJVmFsdWUgPSAwOyAvL0JicFJlZywgVmFsdWU7CisJUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOworCisJLy8gU2VhcmNoIFR4IHBvd2VyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKKwl7CisJCWlmIChDaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwpCisJCXsKKwkJCVR4UHdlciA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyOworCQkJVHhQd2VyMiA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyMjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogQ2FudCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwgQ2hhbm5lbCkpOworCX0KKworI2lmZGVmIFJUMjg3MAorCS8vIFRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eAorCWlmIChJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApKSkKKwl7CisJCS8qIG1vZGlmeSBieSBXWSBmb3IgUmVhZCBSRiBSZWcuIGVycm9yICovCisJCVVDSEFSIFJGVmFsdWU7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzMwMjBfQ0hOTDsgaW5kZXgrKykKKwkJeworCQkJaWYgKENoYW5uZWwgPT0gRnJlcUl0ZW1zMzAyMFtpbmRleF0uQ2hhbm5lbCkKKwkJCXsKKwkJCQkvLyBQcm9ncmFtbWluZyBjaGFubmVsIHBhcmFtZXRlcnMKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDIsIEZyZXFJdGVtczMwMjBbaW5kZXhdLk4pOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMywgRnJlcUl0ZW1zMzAyMFtpbmRleF0uSyk7CisKKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUkZWYWx1ZSk7CisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhGQykgfCBGcmVxSXRlbXMzMDIwW2luZGV4XS5SOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IFR4IFBvd2VyCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTIsIChQVUNIQVIpJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IFJGIG9mZnNldAorCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCAoUFVDSEFSKSZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweDgwKSB8IHBBZC0+UmZGcmVxT2Zmc2V0OworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IEJXCisJCQkJaWYgKCFiU2NhbiAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSkKKwkJCQl7CisJCQkJCVJGVmFsdWUgPSBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNDsKKwkJCQkJLy9ESVNBQkxFXzExTl9DSEVDSyhwQWQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQ7CisJCQkJfQorCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gRW5hYmxlIFJGIHR1bmluZworCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAoUFVDSEFSKSZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gUkZWYWx1ZSB8IDB4MTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIChVQ0hBUilSRlZhbHVlKTsKKworCQkJCS8vIGxhdGNoIGNoYW5uZWwgZm9yIGZ1dHVyZSB1c2FnZS4KKwkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVkLCBQd3IxPSVkLCAlZFQpLCBOPTB4JTAyWCwgSz0weCUwMlgsIFI9MHglMDJYXG4iLAorCQkJQ2hhbm5lbCwKKwkJCXBBZC0+UmZJY1R5cGUsCisJCQlUeFB3ZXIsCisJCQlUeFB3ZXIyLAorCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLk4sCisJCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5LLAorCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUlQyODcwIC8vCisJeworCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCQl7CisJCQljYXNlIFJGSUNfMjgyMDoKKwkJCWNhc2UgUkZJQ18yODUwOgorCQkJY2FzZSBSRklDXzI3MjA6CisJCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KTsKKworCQkJCQkJLy8gNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsvLyBTZXQgZnJlcSBPZmZzZXQgJiBUeFB3cjEKKwkJCQkJfQorCisJCQkJCS8vIEJhc2VkIG9uIEJCUCBjdXJyZW50IG1vZGUgYmVmb3JlIGNoYW5naW5nIFJGIGNoYW5uZWwuCisJCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQkvLyBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLy8gU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyB8IDB4MDQpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8vIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHNpd3RjaCBmcm9tIGEtPmcsIGctPmEKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwQTsvL0dhcnkgMjAwNy8wOC8wOSAweDA1MEEwQQorCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsJLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKworCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKKwkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKKwkgICAgfQorCisJCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCQl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCWVsc2UKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwNTsvL0dhcnkgMjAwNy84LzkgMHgwNTA1MDUKKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7ICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7CisKKwkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0CisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJCX0KKworCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisKKyAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKKwkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJaWYgKGJTY2FuKQorCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCWVsc2UKKwkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7CisKKwkvLworCS8vIE9uIDExQSwgV2Ugc2hvdWxkIGRlbGF5IGFuZCB3YWl0IFJGL0JCUCB0byBiZSBzdGFibGUKKwkvLyBhbmQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgc2hvdWxkIGJlIDEwMDAgbWljcm8gc2Vjb25kcworCS8vIDIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgorCS8vCisJUlRNUHVzZWNEZWxheSgxMDAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWx1LCBQd3IxPSVsdSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCisJCQkJCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LAorCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciAyNDIxIG9ubHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nCisJCXNpdGUgc3VydmV5LiBJdCdzIG9ubHkgcmVxdWlyZWQgYWZ0ZXIgTklDIGRlY2lkZWQgdG8gc3RheSBhdCBhIGNoYW5uZWwKKwkJZm9yIGEgbG9uZ2VyIHBlcmlvZC4KKwkJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQncyBhbHdheXMgYWZ0ZXIgQXNpY1N3aXRjaENoYW5uZWwoKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRAlBc2ljQW50ZW5uYVNlbGVjdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbnRlbm5hIG1pc2NlbGxhbmVvdXMgc2V0dGluZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlCYW5kU3RhdGUJCQkJSW5kaWNhdGUgY3VycmVudCBCYW5kIFN0YXRlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgRnJhbWUgRW5kIHR5cGUgY29udHJvbAorCQkJb25seSB2YWxpZCBmb3IgRyBvbmx5IChSRl8yNTI3ICYgUkZfMjUyOSkKKwkJCTA6IG1lYW5zIERQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMQorCQkJMTogbWVhbnMgU1BEVCwgc2V0IEJCUCBSNCBiaXQgNSB0byAwCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQXNpY0FudGVubmFTZXR0aW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKQoreworfQorCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgorCisJCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQorCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCisJCTEuIFR4UG93ZXJQZXJjZW50YWdlCisJCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjaworCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKKwkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKKworCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAorCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjEgPSAwLCBCYnBSNDkgPSAwLCBpZHg7CisJUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7CisJVUxPTkcJCVR4UHdyWzVdOworCUNIQVIJCVZhbHVlOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKworCS8vIFRYIHBvd2VyIGNvbXBlbnNhdGlvbiBmb3IgdGVtcGVyYXR1cmUgdmFyaWF0aW9uIGJhc2VkIG9uIFRTU0kuIHRyeSBldmVyeSA0IHNlY29uZAorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjEgaXMgdW5zaWduZWQgY2hhciAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgKCspIGlzIDB4MDAgfiAweDQ1LCBtaW51cyAoLSkgaXMgMHhhMCB+IDB4ZjAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHhhNSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorLy8JCQkJaWYgKFIzID4gKFVMT05HKSAoVHhBZ2NTdGVwICogKGlkeC0xKSkpCisJCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKFVDSEFSKVIzKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjQ5PSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCAwKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJfQorCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwUjEpOworCUJicFIxICY9IDB4RkM7CisKKyNpZmRlZiBTSU5HTEVfU0tVCisJLy8gSGFuZGxlIHJlZ3VsYXRvcnkgbWF4IHR4IHBvd2VyIGNvbnN0cmFpbgorCWRvCisJeworCQlVQ0hBUiAgICBUeFB3ckluRUVQUk9NID0gMHhGRiwgQ291bnRyeVR4UHdyID0gMHhGRiwgY3JpdGVyaW9uOworCQlVQ0hBUiAgICBBZGp1c3RNYXhUeFB3cls0MF07CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gNUcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9ICgocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweEZGMDApID4+IDgpOworCQllbHNlIC8vIDIuNEcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9IChwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciAmIDB4MDBGRik7CisJCUNvdW50cnlUeFB3ciA9IEdldEN1bnRyeU1heFR4UHdyKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJLy8gZXJyb3IgaGFuZGxpbmcsIHJhbmdlIGNoZWNrCisJCWlmICgoVHhQd3JJbkVFUFJPTSA+IDB4NTApIHx8IChDb3VudHJ5VHhQd3IgPiAweDUwKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBc2ljQWRqdXN0VHhQb3dlciAtIEludmFsaWQgbWF4IHR4IHBvd2VyICg9MHglMDJ4KSwgQ291bnRyeVR4UHdyPSVkXG4iLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY3JpdGVyaW9uID0gKigoUFVDSEFSKVR4UHdyICsgMikgJiAweEY7ICAgICAgICAvLyBGQUUgdXNlIE9GRE0gNk0gYXMgY3JpdGVyaW9uCisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGNyaXRlcmlvbj0lZCwgVHhQd3JJbkVFUFJPTT0lZCwgQ291bnRyeVR4UHdyPSVkKVxuIiwgY3JpdGVyaW9uLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKworCQkvLyBBZGp1c3QgbWF4IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwIG9mIHR4IHBvd2VyIGluIEUyUFJPTQorCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkvLyBUaGVyZWZvcmUsIHdlIHNob3VsZCBzZXBhcmF0ZSB0byBwYXJzZSB0aGUgdHggcG93ZXIgZmllbGQKKwkJCWlmIChpID09IDApCisJCQl7CisJCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKKworCQkJCQlpZiAoaiA8IDQpCisJCQkJCXsKKwkJCQkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKSArIDQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKTsKKwkJCQkJfQorCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCQl7CisJCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7CisKKwkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBBZGp1c3QgdHggcG93ZXIgYWNjb3JkaW5nIHRvIHRoZSByZWxhdGlvbnNoaXAKKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQlpZiAoVHhQd3JbaV0gIT0gMHhmZmZmZmZmZikKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQkJeworCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOworCisJCQkJCS8vIFRoZSBzeXN0ZW0gdHggcG93ZXIgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZ3VsYXRvcnksIHRoZSBwb3dlciBzaG91bGQgYmUgcmVzdHJhaW4KKwkJCQkJaWYgKEFkanVzdE1heFR4UHdyW2kqOCtqXSA+IENvdW50cnlUeFB3cikKKwkJCQkJeworCQkJCQkJLy8gZGVjcmVhc2UgdG8gemVybyBhbmQgZG9uJ3QgbmVlZCB0byB0YWtlIGNhcmUgQkJQUjEKKwkJCQkJCWlmICgoVmFsdWUgLSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKSkgPiAwKQorCQkJCQkJCVZhbHVlIC09IChBZGp1c3RNYXhUeFB3cltpKjgral0gLSBDb3VudHJ5VHhQd3IpOworCQkJCQkJZWxzZQorCQkJCQkJCVZhbHVlID0gMDsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZCwgbm8gY2hhbmdlKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCisJCQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKyNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDE7CisJeworCQlEZWx0YVB3ciAtPSAxOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMzsKKwl7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA2OworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gOTsKKwl7CisJCUJicFIxIHw9IDB4MDE7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDEyOworCXsKKwkJQmJwUjEgfD0gMHgwMjsKKwl9CisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBSMSk7CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvcihpPTA7IGk8NTsgaSsrKQorCXsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCXsKKwkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCXsKKwkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCisJCQkJfQorCisJCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLworCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQl9CisKKwkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLworCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KKwkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7CisJCX0KKwl9CisKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwdXQgUEhZIHRvIHNsZWVwIGhlcmUsIGFuZCBzZXQgbmV4dCB3YWtldXAgdGltZXIuIFBIWSBkb2Vzbid0IG5vdCB3YWtldXAKKwkJYXV0b21hdGljYWxseS4gSW5zdGVhZCwgTUNVIHdpbGwgaXNzdWUgYSBUd2FrZVVwSW50ZXJydXB0IHRvIGhvc3QgYWZ0ZXIKKwkJdGhlIHdha2V1cCB0aW1lciB0aW1lb3V0LiBEcml2ZXIgaGFzIHRvIGlzc3VlIGEgc2VwYXJhdGUgY29tbWFuZCB0byB3YWtlCisJCVBIWSB1cC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKyAgICBSVDI4WFhfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIG1hbnVhbCB3YWtldXAgaXMgcmVxdWlyZWQKKwkJQXNpY0ZvcmNlU2xlZXAoKSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gbm90IGluIElORlJBIEJTUy4gV2hlbgorCQlpbiBJTkZSQSBCU1MsIHdlIHNob3VsZCB1c2UgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoKSBpbnN0ZWFkLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlU2xlZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIFR3YWtldXAgdGltZXIgKHNldCB2aWEgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXApCisJCWV4cGlyZWQuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgYkZyb21UeCkKK3sKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOworICAgIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldCBNeSBCU1NJRAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTZXRCc3NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCVVMT05HCQkgIEFkZHI0OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PiBBc2ljU2V0QnNzaWQgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCXBCc3NpZFswXSxwQnNzaWRbMV0scEJzc2lkWzJdLHBCc3NpZFszXSwgcEJzc2lkWzRdLHBCc3NpZFs1XSkpOworCisJQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFswXSkJCSB8CisJCQkoVUxPTkcpKHBCc3NpZFsxXSA8PCA4KSAgfAorCQkJKFVMT05HKShwQnNzaWRbMl0gPDwgMTYpIHwKKwkJCShVTE9ORykocEJzc2lkWzNdIDw8IDI0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcwLCBBZGRyNCk7CisKKwlBZGRyNCA9IDA7CisJLy8gYWx3YXlzIG9uZSBCU1NJRCBpbiBTVEEgbW9kZQorCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbNF0pIHwgKFVMT05HKShwQnNzaWRbNV0gPDwgOCk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcxLCBBZGRyNCk7Cit9CisKK1ZPSUQgQXNpY1NldE1jYXN0V0MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwlVU0hPUlQJCW9mZnNldDsKKworCXBFbnRyeS0+U3N0ICAgICAgICA9IFNTVF9BU1NPQzsKKwlwRW50cnktPkFpZCAgICAgICAgPSBNQ0FTVF9XQ0lEOwkvLyBTb2Z0YXAgc3VwcG9ydHMgMSBCU1NJRCBhbmQgdXNlIFdDSUQ9MCBhcyBtdWx0aWNhc3QgV2NpZCBpbmRleAorCXBFbnRyeS0+UHNNb2RlICAgICA9IFBXUl9BQ1RJVkU7CisJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIEJTUzBNY2FzdF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0RlbFdjaWRUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJV2NpZCkKK3sKKwlVTE9ORwkJICBBZGRyMCA9IDB4MCwgQWRkcjEgPSAweDA7CisJVUxPTkcgCQlvZmZzZXQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljRGVsV2NpZFRhYj09PldjaWQgPSAweCV4XG4iLFdjaWQpKTsKKwlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgV2NpZCAqIEhXX1dDSURfRU5UUllfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIwKTsKKwlvZmZzZXQgKz0gNDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIxKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCURhdGEgICY9IDB4RkZGRkZGMDA7CisJRGF0YSAgfD0gMHg4MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJLy9PUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0Rpc2FibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisKKwlEYXRhICAmPSAweEZGRkZGRjAwOworCS8vRGF0YSAgfD0gMHgyMDsKKyNpZm5kZWYgV0lGSV9URVNUCisJLy9pZiAoIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ICkKKwkvLwlEYXRhIHw9IDB4NjA7IC8vIGZvciBwZXJmb3JtYW5jZSBpc3N1ZSBub3Qgc2V0IHRoZSBUWE9QIHRvIDAKKyNlbmRpZgorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJJiYgKHBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYyA9PSBGQUxTRSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQorCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlEYXRhIHw9IDB4MjA7CisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEaXNhYmxlU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkRpc2FibGUgVFNGIHN5bmNocm9uaXphdGlvblxuIikpOworCisJLy8gMjAwMy0xMi0yMCBkaXNhYmxlIFRTRiBhbmQgVEJUVCB3aGlsZSBOSUMgaW4gcG93ZXItc2F2aW5nIGhhdmUgc2lkZSBlZmZlY3QKKwkvLwkJCSAgdGhhdCBOSUMgd2lsbCBuZXZlciB3YWtlcyB1cCBiZWNhdXNlIFRTRiBzdG9wcyBhbmQgbm8gbW9yZQorCS8vCQkJICBUQlRUIGludGVycnVwdHMKKwlwQWQtPlRidHRUaWNrQ291bnQgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlQnNzU3luYyhJTkZSQSBtb2RlKVxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisvLwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIDB4MDAwMDAwMDApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgorCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCU5vdGU6CisJCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCisJCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQorCQlCZWFjb24gcGVyaW9kLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVJYnNzU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKKwlQVUNIQVIJCQlwdHI7CisJVUlOVCBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVJYnNzU3luYyhBREhPQyBtb2RlLiBNUERVdG90YWxCeXRlQ291bnQgPSAlZClcbiIsIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOworCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKKworCisjaWZkZWYgUlQyODcwCisJLy8gbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5CisJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOworCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9MikgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCXsKKwkJLy9VSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIEhXX0JFQUNPTl9CQVNFMCArIGksIHB0ciwgMik7CisJCXB0ciArPSAyOworCX0KKworCS8vIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQKKwlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlmb3IgKGk9MDsgaTwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSs9MikKKwl7CisJCS8vVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOworCQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIFRYV0lfU0laRSArIGksIGxvbmdwdHIpOworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBwdHIsIDIpOworCQlwdHIgKz0yOworCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vCisJLy8gRm9yIFdpLUZpIGZhaWx5IGdlbmVyYXRlZCBiZWFjb25zIGJldHdlZW4gcGFydGljaXBhdGluZyBzdGF0aW9ucy4KKwkvLyBTZXQgVEJUVCBwaGFzZSBhZGFwdGl2ZSBhZGp1c3RtZW50IHN0ZXAgdG8gOHVzIChkZWZhdWx0IDE2dXMpCisJLy8gZG9uJ3QgY2hhbmdlIHNldHRpbmdzIDIwMDYtNS0gYnkgSmVycnkKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFRCVFRfU1lOQ19DRkcsIDB4MDAwMDEwMTApOworCisJLy8gc3RhcnQgc2VuZGluZyBCRUFDT04KKwljc3I5LmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQorCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAxOworCWNzcjkuZmllbGQuVHNmU3luY01vZGUgPSAyOyAvLyBzeW5jIFRTRiBpbiBJQlNTIG1vZGUKKwljc3I5LmZpZWxkLmJUQlRURW5hYmxlID0gMTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1NldEVkY2FQYXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFRENBX1BBUk0JIHBFZGNhUGFybSkKK3sKKwlFRENBX0FDX0NGR19TVFJVQyAgIEFjMENmZywgQWMxQ2ZnLCBBYzJDZmcsIEFjM0NmZzsKKwlBQ19UWE9QX0NTUjBfU1RSVUMgY3NyMDsKKwlBQ19UWE9QX0NTUjFfU1RSVUMgY3NyMTsKKwlBSUZTTl9DU1JfU1RSVUMgICAgQWlmc25Dc3I7CisJQ1dNSU5fQ1NSX1NUUlVDICAgIEN3bWluQ3NyOworCUNXTUFYX0NTUl9TVFJVQyAgICBDd21heENzcjsKKwlpbnQgaTsKKworCUFjMENmZy53b3JkID0gMDsKKwlBYzFDZmcud29yZCA9IDA7CisJQWMyQ2ZnLndvcmQgPSAwOworCUFjM0NmZy53b3JkID0gMDsKKwlpZiAoKHBFZGNhUGFybSA9PSBOVUxMKSB8fCAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljU2V0RWRjYVBhcm1cbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgfHwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGkpCisJCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W2ldLCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisJCX0KKworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkgLgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyNpZm5kZWYgV0lGSV9URVNUCisJCWlmKCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCApCisJCXsKKwkJCS8vIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMHgyMDsgLy8gU3VnZ2VzdCBieSBKb2huIGZvciBUeEJ1cnN0IGluIEhUIE1vZGUKKwkJfQorCQllbHNlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JFCisvLyNlbHNlCisvLwkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CRQorLy8jZW5kaWYKKwkJQWMwQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMENmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzBDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JLCisJCUFjMUNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCUFjMkNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzJfQ0ZHLCBBYzJDZmcud29yZCk7CisJCUFjM0NmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7CisKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIERNQSBSZWdpc3RlciBoYXMgYSBjb3B5IHRvby4KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAwOwkJLy8gUUlEX0FDX0JFCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDA7CQkvLyBRSURfQUNfQksKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gMTkyOwkJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gOTY7CQkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQljc3IxLmZpZWxkLkFjMlR4b3AgPSA5NjsJCS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gNDg7CQkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjEud29yZCk7CisKKwkJQ3dtaW5Dc3Iud29yZCA9IDA7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMCA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IENXX01JTl9JTl9CSVRTOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MSA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDIgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gQ1dfTUFYX0lOX0JJVFM7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01BWF9DRkcsIEN3bWF4Q3NyLndvcmQpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIDB4MDAwMDIyMjIpOworCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJfQorCWVsc2UKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5LgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vCisJCS8vIE1vZGlmeSBDd21pbi9Dd21heC9UeG9wIG9uIHF1ZXVlW1FJRF9BQ19WSV0sIFJlY29tbWVuZCBieSBKZXJyeSAyMDA1LzA3LzI3CisJCS8vIFRvIGRlZ3JhZGUgb3VyIFZJRE8gUXVldWUncyB0aHJvdWdocHV0IGZvciBXaUZpIFdNTSBTM1QwNyBJc3N1ZS4KKwkJLy8KKwkJLy9wRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNyAvIDEwOyAvLyBydDI4NjBjIG5lZWQgdGhpcworCisJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21pbj0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsgLy8rMTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107IC8vKzI7CisJCUFjMUNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOyAvLysxOworCisJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAocEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA2KSAvIDEwOworCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07CisJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuIC09IDE7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gPSAzOworCQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA1OworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOworCisvLyNpZmRlZiBXSUZJX1RFU1QKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKKwkJeworCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQorCQkJeworCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLworCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07CisJCQl9IC8qIEVuZCBvZiBpZiAqLworCQl9CisvLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKworCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOworCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsgLy9mb3IgVEduIHdpZmkgdGVzdAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlBaWZzbkNzci53b3JkID0gMDsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbiAtIDQ7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSAzOworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDc7CisJCQl9CisKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlBaWZzbkNzci5maWVsZC5BaWZzbjMgPSBBYzNDZmcuZmllbGQuQWlmc24gLSAxOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsgLy9mb3IgVEduIHdpZmkgdGVzdAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCBBaWZzbkNzci53b3JkKTsKKworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCWlmICghQURIT0NfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRENBIFsjJWRdOiBBSUZTTiBDV21pbiBDV21heCAgVFhPUCh1cykgIEFDTVxuIiwgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CRSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMF0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblswXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzBdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFswXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMF0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CSyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMV0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsxXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzFdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsxXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMV0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WSSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMl0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsyXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzJdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsyXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMl0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WTyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bM10sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblszXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzNdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFszXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bM10pKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgCUFzaWNTZXRTbG90VGltZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKQoreworCVVMT05HCVNsb3RUaW1lOworCVVJTlQzMglSZWdWYWx1ZSA9IDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQliVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJZWxzZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisKKwlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSk/IDkgOiAyMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBmb3JjZSB1c2luZyBzaG9ydCBTTE9UIHRpbWUgZm9yIEZBRSB0byBkZW1vIHBlcmZvcm1hbmNlIHdoZW4gVHhCdXJzdCBpcyBPTgorCQlpZiAoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdGhpbmsgaXQgaXMgZG9pbmcgV2ktRmkgdGVzdAorCQkJLy8gQW5kIHdlIHdpbGwgbm90IHNldCB0byBzaG9ydCBzbG90IHdoZW4gYkVuYWJsZVR4QnVyc3QgaXMgVFJVRS4KKwkJfQorCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwkJCVNsb3RUaW1lID0gOTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLworCS8vIEZvciBzb21lIHJlYXNvbnMsIGFsd2F5cyBzZXQgaXQgdG8gc2hvcnQgc2xvdCB0aW1lLgorCS8vCisJLy8gVG9EbzogU2hvdWxkIGNvbnNpZGVyIGNhcGFiaWxpdHkgd2l0aCAxMUIKKwkvLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQlTbG90VGltZSA9IDIwOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQktPRkZfU0xPVF9DRkcsICZSZWdWYWx1ZSk7CisJUmVnVmFsdWUgPSBSZWdWYWx1ZSAmIDB4RkZGRkZGMDA7CisKKwlSZWdWYWx1ZSB8PSBTbG90VGltZTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCBSZWdWYWx1ZSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFkZCBTaGFyZWQga2V5IGluZm9ybWF0aW9uIGludG8gQVNJQy4KKwkJVXBkYXRlIHNoYXJlZCBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFNoYXJlZCBrZXkgdGFibGUKKwkJVXBkYXRlIGl0cyBjaXBoZXJBbGcgdG8gQXNpYyBTaGFyZWQga2V5IE1vZGUuCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleUlkeCwKKwlJTiBVQ0hBUgkJIENpcGhlckFsZywKKwlJTiBQVUNIQVIJCSBwS2V5LAorCUlOIFBVQ0hBUgkJIHBUeE1pYywKKwlJTiBQVUNIQVIJCSBwUnhNaWMpCit7CisJVUxPTkcgb2Zmc2V0OyAvLywgY3NyMDsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5IEJzc0luZGV4PSVkLCBLZXlJZHg9JWRcbiIsIEJzc0luZGV4LEtleUlkeCkpOworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkU2hhcmVkS2V5RW50cnk6ICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSwgQnNzSW5kZXgqNCArIEtleUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKKwlpZiAocFJ4TWljKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7CisJfQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vCisJLy8gZmlsbCBrZXkgbWF0ZXJpYWwgLSBrZXkgKyBUWCBNSUMgKyBSWCBNSUMKKwkvLworCisjaWZkZWYgUlQyODcwCit7CisJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQqQnNzSW5kZXggKyBLZXlJZHgpKkhXX0tFWV9FTlRSWV9TSVpFOworCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9TSEFSRV9LRVkpOworCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOworCWlmIChwVHhNaWMpCisJeworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBUeE1pYywgOCk7CisJfQorCisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykKKwl7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKKwl9Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAorCS8vCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsIEJzc0luZGV4LEtleUlkeCwgY3NyMS53b3JkKSk7CisJaWYgKChCc3NJbmRleCUyKSA9PSAwKQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOworCit9CisKKy8vCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleUlkeCkKK3sKKwkvL1VMT05HIFNlY0NzcjA7CisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKKwlpZiAoKEJzc0luZGV4JTIpID09IDApCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKKwlBU1NFUlQoQnNzSW5kZXggPCA0KTsKKwlBU1NFUlQoS2V5SWR4IDwgNCk7CisKK30KKworCitWT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpCit7CisJVUxPTkcgICBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7CisKKwkvLworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLyBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLworCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVdDSURBdHRyaSA9IChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUxPTkcgICAgICAgIHVJViwKKwlJTiBVTE9ORyAgICAgICAgdUVJVikKK3sKKwlVTE9ORwlvZmZzZXQ7CisKKwlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCVVMT05HIG9mZnNldDsKKwlVTE9ORyBBZGRyOworCisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKKwlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyhwQWRkclsyXSA8PCAxNikgKyhwQWRkclszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKKwlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgorICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KKyAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAorICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCisgICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKKyAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAorICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCisKKyAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKKyAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KKworICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCisgICAgICAgIFJYIGtleQorCisgICAgCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSCQlLZXlJZHgsCisJSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCisJSU4gQk9PTEVBTgkJYlR4S2V5KQoreworCVVMT05HCW9mZnNldDsKKy8vCVVMT05HICAgV0NJREF0dHJpID0gMDsKKwlVQ0hBUglJVjQgPSAwOworCVBVQ0hBUgkJcEtleSA9IHBDaXBoZXJLZXktPktleTsKKy8vCVVMT05HCQlLZXlMZW4gPSBwQ2lwaGVyS2V5LT5LZXlMZW47CisJUFVDSEFSCQlwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwlQVUNIQVIJCXBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOworCVBVQ0hBUgkJcFR4dHNjID0gcENpcGhlcktleS0+VHhUc2M7CisJVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisvLwlBU1NFUlQoS2V5TGVuIDw9IE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IEFzaWNBZGRLZXlFbnRyeVxuIikpOworCS8vCisJLy8gMS4pIGRlY2lkZSBrZXkgdGFibGUgb2Zmc2V0CisJLy8KKwlpZiAoYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworCWVsc2UKKwkJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQgKiBCc3NJbmRleCArIEtleUlkeCkgKiBIV19LRVlfRU5UUllfU0laRTsKKworCS8vCisJLy8gMi4pIFNldCBLZXkgdG8gQXNpYworCS8vCisJLy9mb3IgKGkgPSAwOyBpIDwgS2V5TGVuOyBpKyspCisKKyNpZmRlZiBSVDI4NzAKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBLZXksIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLy8KKwkvLyAzLikgU2V0IE1JQyBrZXkgaWYgYXZhaWxhYmxlCisJLy8KKwlpZiAocFR4TWljKQorCXsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwVHhNaWMsIDgpOworCX0KKwlvZmZzZXQgKz0gTEVOX1RLSVBfVFhNSUNLOworCisJaWYgKHBSeE1pYykKKwl7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIDQuKSBNb2RpZnkgSVYvRUlWIGlmIG5lZWRzCisJLy8gICAgIFRoaXMgd2lsbCBmb3JjZSBBc2ljIHRvIHVzZSB0aGlzIGtleSBJRCBieSBzZXR0aW5nIElWLgorCS8vCisJaWYgKGJUeEtleSkKKwl7CisKKyNpZmRlZiBSVDI4NzAKKwkJVUlOVDMyIHRtcFZhbDsKKworCQkvLworCQkvLyBXcml0ZSBJVgorCQkvLworCQlJVjQgPSAoS2V5SWR4IDw8IDYpOworCQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8KENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKKwkJCUlWNCB8PSAweDIwOyAgLy8gdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UKKworCQl0bXBWYWwgPSBwVHh0c2NbMV0gKyAoKChwVHh0c2NbMV0gfCAweDIwKSAmIDB4N2YpIDw8IDgpICsgKHBUeHRzY1swXSA8PCAxNikgKyAoSVY0IDw8IDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB0bXBWYWwpOworCisJCS8vCisJCS8vIFdyaXRlIEVJVgorCQkvLworCQlvZmZzZXQgKz0gNDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCAqKFBVSU5UMzIpJnBDaXBoZXJLZXktPlR4VHNjWzJdKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBXQ0lELCBCc3NJbmRleCwgQ2lwaGVyQWxnLCBiVXNlUGFpcmV3aXNlS2V5VGFibGUpOworCX0KKworCWlmICghYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCXsKKwkJLy8KKwkJLy8gT25seSB1cGRhdGUgdGhlIHNoYXJlZCBrZXkgc2VjdXJpdHkgbW9kZQorCQkvLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCAmY3NyMS53b3JkKTsKKwkJaWYgKChCc3NJbmRleCAlIDIpID09IDApCisJCXsKKwkJCWlmIChLZXlJZHggPT0gMCkKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChLZXlJZHggPT0gMCkKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgY3NyMS53b3JkKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gQXNpY0FkZEtleUVudHJ5XG4iKSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgaW50byBBU0lDLgorCQlVcGRhdGUgcGFpcndpc2Uga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBQYWlyLXdpc2Uga2V5IHRhYmxlCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSCQlXQ0lELAorCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSkKK3sKKwlJTlQgaTsKKwlVTE9ORyAJCW9mZnNldDsKKwlQVUNIQVIJCSBwS2V5ID0gcENpcGhlcktleS0+S2V5OworCVBVQ0hBUgkJIHBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOworCVBVQ0hBUgkJIHBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOworI2lmZGVmIERCRworCVVDSEFSCQlDaXBoZXJBbGcgPSBwQ2lwaGVyS2V5LT5DaXBoZXJBbGc7CisjZW5kaWYgLy8gREJHIC8vCisKKwkvLyBFS0VZCisJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKKyNpZmRlZiBSVDI4NzAKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5LZXlbMF0sIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrPTQpCisJeworCQlVSU5UMzIgVmFsdWU7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgb2Zmc2V0ICsgaSwgJlZhbHVlKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKKworCS8vICBNSUMgS0VZCisJaWYgKHBUeE1pYykKKwl7CisjaWZkZWYgUlQyODcwCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPlR4TWljWzBdLCA4KTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykKKwl7CisjaWZkZWYgUlQyODcwCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPlJ4TWljWzBdLCA4KTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRQYWlyd2lzZUtleUVudHJ5OiBXQ0lEICMlZCBBbGc9JXNcbiIsV0NJRCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOworCWlmIChwUnhNaWMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIglUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLHBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOworCX0KK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQy4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSWR4LAorCUlOIFVDSEFSCQkgV2NpZCkKK3sKKwlVTE9ORwkJV0NJREF0dHJpOworCVVTSE9SVAkJb2Zmc2V0OworCisJLy8gcmUtc2V0IHRoZSBlbnRyeSdzIFdDSUQgYXR0cmlidXRlIGFzIE9QRU4tTk9ORS4KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSWR4PDw0KSB8IFBBSVJXSVNFS0VZVEFCTEU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQ29tbWFuZCwKKwlJTiBVQ0hBUgkJIFRva2VuLAorCUlOIFVDSEFSCQkgQXJnMCwKKwlJTiBVQ0hBUgkJIEFyZzEpCit7CisJSE9TVF9DTURfQ1NSX1NUUlVDCUgyTUNtZDsKKwlIMk1fTUFJTEJPWF9TVFJVQwlIMk1NYWlsYm94OworCVVMT05HCQkJCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgJkgyTU1haWxib3gud29yZCk7CisJCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDIpOworCX0gd2hpbGUoaSsrIDwgMTAwKTsKKworCWlmIChpID49IDEwMCkKKwl7CisJCXsKKwkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKworCUgyTU1haWxib3guZmllbGQuT3duZXIJICA9IDE7CSAgIC8vIHBhc3Mgb3duZXJzaGlwIHRvIE1DVQorCUgyTU1haWxib3guZmllbGQuQ21kVG9rZW4gPSBUb2tlbjsKKwlIMk1NYWlsYm94LmZpZWxkLkhpZ2hCeXRlID0gQXJnMTsKKwlIMk1NYWlsYm94LmZpZWxkLkxvd0J5dGUgID0gQXJnMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIEgyTU1haWxib3gud29yZCk7CisKKwlIMk1DbWQud29yZCAJCQkgID0gMDsKKwlIMk1DbWQuZmllbGQuSG9zdENvbW1hbmQgID0gQ29tbWFuZDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIT1NUX0NNRF9DU1IsIEgyTUNtZC53b3JkKTsKKworCWlmIChDb21tYW5kICE9IDB4ODApCisJeworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQ2hlY2tSYXRlcygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUCVVDSEFSCQkJU3VwUmF0ZVtdLAorCUlOIE9VVAlVQ0hBUgkJCSpTdXBSYXRlTGVuKQoreworCVVDSEFSCVJhdGVJZHgsIGksIGo7CisJVUNIQVIJTmV3UmF0ZVsxMl0sIE5ld1JhdGVMZW47CisKKwlOZXdSYXRlTGVuID0gMDsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCVJhdGVJZHggPSA0OworCWVsc2UKKwkJUmF0ZUlkeCA9IDEyOworCisJLy8gQ2hlY2sgZm9yIHN1cHBvcnQgcmF0ZXMgZXhjbHVkZSBiYXNpYyByYXRlIGJpdAorCWZvciAoaSA9IDA7IGkgPCAqU3VwUmF0ZUxlbjsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQorCQkJaWYgKChTdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJCU5ld1JhdGVbTmV3UmF0ZUxlbisrXSA9IFN1cFJhdGVbaV07CisKKwkqU3VwUmF0ZUxlbiA9IE5ld1JhdGVMZW47CisJTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgTmV3UmF0ZSwgTmV3UmF0ZUxlbik7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCisJSU4gVUNIQVIJCUNoYW5uZWwpCit7CisJVUNIQVIJCWs7CisJVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7CisJVUNIQVIJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9IDA7CisKKwkvLyBGaW5kIHVwcGVyIGFuZCBsb3dlciBjaGFubmVsIGFjY29yZGluZyB0byA0ME1IeiBjdXJyZW50IG9wZXJhdGlvbi4KKwlpZiAoQ2VudHJhbENoYW5uZWwgPCBDaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gQ2hhbm5lbDsKKwkJaWYgKENlbnRyYWxDaGFubmVsID4gMikKKwkJCUxvd2VyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsIC0gMjsKKwkJZWxzZQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBDZW50cmFsQ2hhbm5lbCArIDI7CisJCUxvd2VyQ2hhbm5lbCA9IENoYW5uZWw7CisJfQorCisJZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IFVwcGVyQ2hhbm5lbCkKKwkJeworCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ICsrOworCQl9CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gTG93ZXJDaGFubmVsKQorCQl7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7CisJaWYgKE5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9PSAyKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBIVCBwaHkgdHlwZQorCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJRkFMU0UgaWYgcEFkLT5Db21tb25DZmcuU3VwcG9ydGVkSHRQaHkgZG9lc24ndCBhY2NlcHQgdGhlIHBIdENhcGFiaWxpdHkuICAoQVAgTW9kZSkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIAlSVE1QQ2hlY2tIdCgKKwlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOCVVDSEFSCQkJCQlXY2lkLAorCUlOIAlIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiAJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbykKK3sKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gSWYgdXNlIEFNU0RVLCBzZXQgZmxhZy4KKwlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOworCS8vIFNhdmUgUGVlciBDYXBhYmlsaXR5CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQykKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJeworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJfQorCisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uTXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJfQorCisJLy8gV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOworICAgIHN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJCWJyZWFrOworCX0KKworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoICYgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGgsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCisJCXBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JHLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9ICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKKworCS8vIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4KKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QczsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKKyAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCisJeworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7CisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOworCX0KKworICAgIGlmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApCisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgwOyAgLy8gQlcyMCBjYW4ndCB0cmFuc21pdCBNQ1MzMgorCisJQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKHBBZCwgcEh0Q2FwYWJpbGl0eSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJTWluaW11bVJhdGU7CisJVUNIQVIJUHJvcGVyTWxtZVJhdGU7IC8vPSBSQVRFXzU0OworCVVDSEFSCWksIGosIFJhdGVJZHggPSAxMjsgLy8xLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisJQk9PTEVBTgliTWF0Y2ggPSBGQUxTRTsKKworCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQjoKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID09IDQpICYmCisJCQkJKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID09IDApKQorCQkJCS8vIEIgb25seSBBUAorCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCWVsc2UKKwkJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgkvLyBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OworCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQkgICBNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvLyBlcnJvcgorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzE7CisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKKwkJeworCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCXsKKwkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKKwkJCQl7CisJCQkJCWJNYXRjaCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChiTWF0Y2gpCisJCQlicmVhazsKKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspCisJCXsKKwkJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWVBdXguRXh0UmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCQl7CisJCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQorCQkJCQl7CisJCQkJCQliTWF0Y2ggPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChiTWF0Y2gpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJUHJvcGVyTWxtZVJhdGUgPSBNaW5pbXVtUmF0ZTsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IE1pbmltdW1SYXRlOworCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBQcm9wZXJNbG1lUmF0ZTsKKwlpZiAocEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPj0gUkFURV82KQorCXsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTWxtZVJhdGUgPT0+ICAgTWxtZVRyYW5zbWl0ID0gMHgleCAgXG4iICwgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQpKTsKK30KKworQ0hBUiBSVE1QTWF4UnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBDSEFSCQkJCVJzc2kwLAorCUlOIENIQVIJCQkJUnNzaTEsCisJSU4gQ0hBUgkJCQlSc3NpMikKK3sKKwlDSEFSCWxhcmdlciA9IC0xMjc7CisKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgJiYgKFJzc2kwICE9IDApKQorCXsKKwkJbGFyZ2VyID0gUnNzaTA7CisJfQorCisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIpICYmIChSc3NpMSAhPSAwKSkKKwl7CisJCWxhcmdlciA9IG1heChSc3NpMCwgUnNzaTEpOworCX0KKworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpCisJeworCQlsYXJnZXIgPSBtYXgobGFyZ2VyLCBSc3NpMik7CisJfQorCisJaWYgKGxhcmdlciA9PSAtMTI3KQorCQlsYXJnZXIgPSAwOworCisJcmV0dXJuIGxhcmdlcjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBQZXJpb2RpYyBldmFsdWF0ZSBhbnRlbm5hIGxpbmsgc3RhdHVzCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJQkJQUjMgPSAwOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCXwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUCQl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCUJCUFIzICY9ICh+MHgxOCk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJQkJQUjMgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCUJCUFIzIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCUJCUFIzIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkpCisJeworCQlVTE9ORwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJaWYgKFR4VG90YWxDbnQgPiA1MCkKKwkJeworCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDIwKTsKKwkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDMwMCk7CisJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBUUlVFOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEFmdGVyIGV2YWx1YXRpb24sIGNoZWNrIGFudGVubmEgbGluayBzdGF0dXMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSCSpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSCQkJQkJQUjMgPSAwOworCUNIQVIJCQlsYXJnZXIgPSAtMTI3LCByc3NpMCwgcnNzaTEsIHJzc2kyOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykJCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKQkJCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCXJldHVybjsKKworCisJCS8vIGlmIHRoZSB0cmFmZmljIGlzIGxvdywgdXNlIGF2ZXJhZ2UgcnNzaSBhcyB0aGUgY3JpdGVyaWEKKwkJaWYgKHBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9PSBUUlVFKQorCQl7CisJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTE7CisJCQlyc3NpMiA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTI7CisJCX0KKworCQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJCXsKKwkJCWxhcmdlciA9IG1heChyc3NpMCwgcnNzaTEpOworCisJCQlpZiAobGFyZ2VyID4gKHJzc2kyICsgMjApKQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMjsKKwkJCWVsc2UKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDM7CisJCX0KKwkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCXsKKwkJCWlmIChyc3NpMCA+IChyc3NpMSArIDIwKSkKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDE7CisJCQllbHNlCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOworCQl9CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCQlCQlBSMyAmPSAofjB4MTgpOworCQlpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAzKQorCQl7CisJCQlCQlBSMyB8PSAoMHgxMCk7CisJCX0KKwkJZWxzZSBpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAyKQorCQl7CisJCQlCQlBSMyB8PSAoMHg4KTsKKwkJfQorCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDEpCisJCXsKKwkJCUJCUFIzIHw9ICgweDApOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKKwl9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKworVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJcmV0dXJuOworCisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKKworLy8gRHJpdmVyIHNob3VsZCBub3Qgc2VuZCB0cmlnZ2VyIGZyYW1lLCBpdCBzaG91bGQgYmUgc2VuZCBieSBhcHBsaWNhdGlvbiBsYXllcgorLyoKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlCisJCSYmIChwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgfHwKKwkJKCgocEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQlMjApID09IDE5KSAmJiAoIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pKSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgdHJpZ2dlciBmcmFtZSBhbmQgZW50ZXIgc2VydmljZSBwZXJpb2Qgd2hlbiBzdXBwb3J0IEFQU0RcbiIpKTsKKwkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBGQUxTRTsKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gVFJVRTsKKwl9Ki8KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQvcmVzZXQgTUFDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gYlBpZ2d5QmFjayBwYXJhbWV0ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKyAgICAgICAgYlBpZ2d5QmFjayAgLSBFbmFibGUgLyBEaXNhYmxlIFBpZ2d5LUJhY2sKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKK3sKKwlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKworCVR4TGlua0NmZy5maWVsZC5UeENGQWNrRW4gPSBiUGlnZ3lCYWNrOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCit7CisJQk9PTEVBTgkJcmVzdWx0ID0gVFJVRTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIG9ubHkgYXNzb2NpYXRlZCBTVEEgY291bnRzCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQl9CisJCWVsc2UKKwkJCXJlc3VsdCA9IEZBTFNFOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykpCisJCQlyZXN1bHQgPSBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKKwkJCXJldHVybiBUUlVFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gZml4IHR4IGxlZ2FjeSByYXRlCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQoreworCVVDSEFSCXR4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQl0eF9tb2RlID0gKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIHR4X21vZGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgT3ZlcndyaXRlIEhUIFR4IE1vZGUgYnkgRml4ZWQgTGVnZW5jeSBUeCBNb2RlLCBpZiBzcGVjaWZpZWQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAorCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAorCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3sKKwlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXRTZXR0aW5nOworCisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0hUKQorCQlyZXR1cm47CisKKwlUcmFuc21pdFNldHRpbmcud29yZCA9IDA7CisKKwlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7CisJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUzsKKworCWlmIChmaXhlZF90eF9tb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spCisJeworCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkvLyBDQ0sgbW9kZSBhbGxvdyBNQ1MgMH4zCisJCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzMpCisJCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisJfQorCWVsc2UKKwl7CisJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkvLyBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NworCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU183KQorCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OworCX0KKworCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IFRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFKQorCXsKKwkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IFRyYW5zbWl0U2V0dGluZy53b3JkOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nIDogd2NpZC0lZCwgTU9ERT0lcywgTUNTPSVkIFxuIiwKKwkJCQlwRW50cnktPkFpZCwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWR5bmFtaWMgdHVuZSBCQlAgUjY2IHRvIGZpbmQgYSBiYWxhbmNlIGJldHdlZW4gc2Vuc2liaWxpdHkgYW5kCisJCW5vaXNlIGlzb2xhdGlvbgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTdGFCYnBUdW5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJT3JpZ1I2NlZhbHVlID0gMCwgUjY2Oy8vLCBSNjZVcHBlckJvdW5kID0gMHgzMCwgUjY2TG93ZXJCb3VuZCA9IDB4MzA7CisJQ0hBUglSc3NpOworCisJLy8gMjg2MEMgZGlkIG5vdCBzdXBwb3J0IEZhc2UgQ0NBLCB0aGVyZWZvcmUgY2FuJ3QgdHVuZQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJcmV0dXJuOworCisJLy8KKwkvLyB3b3JrIGFzIGEgU1RBCisJLy8KKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICAvLyBubyBSNjYgdHVuaW5nIHdoZW4gU0NBTk5JTkcKKwkJcmV0dXJuOworCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkpCisJCSYmICEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yaWdSNjZWYWx1ZSk7CisJCVI2NiA9IE9yaWdSNjZWYWx1ZTsKKworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCisJCQlSc3NpID0gKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKyBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOworCQllbHNlCisJCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKworCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQl7CS8vQkcgYmFuZAorI2lmZGVmIFJUMjg3MAorCQkJLy8gUlQzMDcwIGlzIGEgbm8gTE5BIHNvbHV0aW9uLCBpdCBzaG91bGQgaGF2ZSBkaWZmZXJlbnQgY29udHJvbCByZWdhcmRpbmcgdG8gQUdDIGdhaW4gY29udHJvbAorCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIGhhdmUgc29tZSB0aHJvdWdocHV0IHNpZGUgZWZmZWN0IHdoZW4gbG93IFJTU0kKKwkJCWlmIChJU19SVDMwNzAocEFkKSkKKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAweDFDICsgMipHRVRfTE5BX0dBSU4ocEFkKSArIDB4MjA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSArIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsJLy9BIGJhbmQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfMjApCisJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyArIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzM7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgUlRNUFNldEFHQ0luaXRWYWx1ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUJhbmRXaWR0aCkKK3sKKwlVQ0hBUglSNjYgPSAweDMwOworCisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwl7CS8vIEJHIGJhbmQKKwkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwl9CisJZWxzZQorCXsJLy9BIGJhbmQKKwkJaWYgKEJhbmRXaWR0aCA9PSBCV18yMCkKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJZWxzZQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworfQorCitWT0lEIEFzaWNUdXJuT2ZmUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUNIQVIJCUNoYW5uZWwpCit7CisKKwkvLyBSRiBSMiBiaXQgMTggPSAwCisJVUlOVDMyCQkJUjEgPSAwLCBSMiA9IDAsIFIzID0gMDsKKwlVQ0hBUgkJCWluZGV4OworCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCisJCQkJeworCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMiAmIDB4ZmZmYmZmZmY7CisJCQkJCVIzID0gUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZjNmZmZmOworCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOworCisJCQkJCS8vIFByb2dyYW0gUjFiMTMgdG8gMSwgUjMvYjE4LDE5IHRvIDAsIFIyYjE4IHRvIDAuCisJCQkJCS8vIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAKKwkJCQkJLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCQkJCQlpZiAoMSkKKwkJCQkJeworCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4LCAgUjMgPSAweCUwOHggXG4iLAorCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyLCBSMykpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHggXG4iLAorCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworVk9JRCBBc2ljVHVybk9uUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsKQoreworCisJLy8gUkYgUjIgYml0IDE4ID0gMAorCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7CisJVUNIQVIJCQlpbmRleDsKKwlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQljYXNlIFJGSUNfMjgyMDoKKwkJY2FzZSBSRklDXzI4NTA6CisJCWNhc2UgUkZJQ18yNzIwOgorCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjMgPSBwQWQtPkxhdGNoUmZSZWdzLlIzOworCQkJCQlSMyAmPSAweGZmZjNmZmZmOworCQkJCQlSMyB8PSAweDAwMDgwMDAwOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQkJUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT25SRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eFxuIiwKKwkJQ2hhbm5lbCwKKwkJcEFkLT5SZkljVHlwZSwKKwkJUjIpKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbmV0aWZfYmxvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL25ldGlmX2Jsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmN2QwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL25ldGlmX2Jsb2NrLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorCitzdGF0aWMgTkVUSUZfRU5UUlkgZnJlZU5ldElmRW50cnlQb29sW0ZSRUVfTkVUSUZfUE9PTF9TSVpFXTsKK3N0YXRpYyBMSVNUX0hFQURFUiBmcmVlTmV0SWZFbnRyeUxpc3Q7CisKK3ZvaWQgaW5pdGJsb2NrUXVldWVUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50IGk7CisKKwlpbml0TGlzdCgmZnJlZU5ldElmRW50cnlMaXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgRlJFRV9ORVRJRl9QT09MX1NJWkU7IGkrKykKKwkJaW5zZXJ0VGFpbExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCwgKFBMSVNUX0VOVFJZKSZmcmVlTmV0SWZFbnRyeVBvb2xbaV0pOworCisJZm9yIChpPTA7IGkgPCBOVU1fT0ZfVFhfUklORzsgaSsrKQorCQlpbml0TGlzdCgmcEFkLT5ibG9ja1F1ZXVlVGFiW2ldLk5ldElmTGlzdCk7CisKKwlyZXR1cm47Cit9CisKK0JPT0xFQU4gYmxvY2tOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSwKKwlJTiBQTkVUX0RFViBwTmV0RGV2KQoreworCVBORVRJRl9FTlRSWSBwTmV0SWZFbnRyeSA9IE5VTEw7CisKKwlpZiAoKHBOZXRJZkVudHJ5ID0gKFBORVRJRl9FTlRSWSlyZW1vdmVIZWFkTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0KSkgIT0gTlVMTCkKKwl7CisJCW5ldGlmX3N0b3BfcXVldWUocE5ldERldik7CisJCXBOZXRJZkVudHJ5LT5wTmV0RGV2ID0gcE5ldERldjsKKwkJaW5zZXJ0VGFpbExpc3QoJnBCbG9ja1F1ZXVlRW50cnktPk5ldElmTGlzdCwgKFBMSVNUX0VOVFJZKXBOZXRJZkVudHJ5KTsKKworCQlwQmxvY2tRdWV1ZUVudHJ5LT5Td1R4UXVldWVCbG9ja0ZsYWcgPSBUUlVFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJuZXRpZl9zdG9wX3F1ZXVlKCVzKVxuIiwgcE5ldERldi0+bmFtZSkpOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCitWT0lEIHJlbGVhc2VOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSkKK3sKKwlQTkVUSUZfRU5UUlkgcE5ldElmRW50cnkgPSBOVUxMOworCVBMSVNUX0hFQURFUiBwTmV0SWZMaXN0ID0gJnBCbG9ja1F1ZXVlRW50cnktPk5ldElmTGlzdDsKKworCXdoaWxlKChwTmV0SWZFbnRyeSA9IChQTkVUSUZfRU5UUlkpcmVtb3ZlSGVhZExpc3QocE5ldElmTGlzdCkpICE9ICBOVUxMKQorCXsKKwkJUE5FVF9ERVYgcE5ldERldiA9IHBOZXRJZkVudHJ5LT5wTmV0RGV2OworCQluZXRpZl93YWtlX3F1ZXVlKHBOZXREZXYpOworCQlpbnNlcnRUYWlsTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpcE5ldElmRW50cnkpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm5ldGlmX3dha2VfcXVldWUoJXMpXG4iLCBwTmV0RGV2LT5uYW1lKSk7CisJfQorCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IEZBTFNFOworCXJldHVybjsKK30KKworCitWT0lEIFN0b3BOZXRJZlF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIFF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCkKK3sKKwlQTkVUX0RFViBOZXREZXYgPSBOVUxMOworCVVDSEFSIElmSWR4ID0gMDsKKwlCT09MRUFOIHZhbGlkID0gRkFMU0U7CisKKyNpZmRlZiBBUENMSV9TVVBQT1JUCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpID49IE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkKKwl7CisJCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSAlIE1BWF9BUENMSV9OVU07CisJCU5ldERldiA9IHBBZC0+QXBDZmcuQXBDbGlUYWJbSWZJZHhdLmRldjsKKwl9CisJZWxzZQorI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KKyNpZmRlZiBXRFNfU1VQUE9SVAorCWlmIChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSA+PSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKQorCXsKKwkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSAlIE1BWF9XRFNfRU5UUlk7CisJCU5ldERldiA9IHBBZC0+V2RzVGFiLldkc0VudHJ5W0lmSWR4XS5kZXY7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLworCXsKKyNpZmRlZiBNQlNTX1NVUFBPUlQKKwkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwkJeworCQkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lEKSAlIE1BWF9NQlNTSURfTlVNOworCQkJTmV0RGV2ID0gcEFkLT5BcENmZy5NQlNTSURbSWZJZHhdLk1TU0lERGV2OworCQl9CisJCWVsc2UKKwkJeworCQkJSWZJZHggPSBNQUlOX01CU1NJRDsKKwkJCU5ldERldiA9IHBBZC0+bmV0X2RldjsKKwkJfQorI2Vsc2UKKwkJSWZJZHggPSBNQUlOX01CU1NJRDsKKwkJTmV0RGV2ID0gcEFkLT5uZXRfZGV2OworI2VuZGlmCisJfQorCisJLy8gV01NIHN1cHBvcnQgNCBzb2Z0d2FyZSBxdWV1ZXMuCisJLy8gT25lIHNvZnR3YXJlIHF1ZXVlIGZ1bGwgZG9lc24ndCBtZWFuIGRldmljZSBoYXZlIG5vIGNhcGJpbGl0eSB0byB0cmFuc21pdCBwYWNrZXQuCisJLy8gU28gZGlzYWJsZSBibG9jayBOZXQtSWYgcXVldWUgZnVuY3Rpb24gd2hpbGUgV01NIGVuYWJsZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl2YWxpZCA9IChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9PSBUUlVFKSA/IEZBTFNFIDogVFJVRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmICh2YWxpZCkKKwkJYmxvY2tOZXRJZigmcEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0sIE5ldERldik7CisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDI4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYwpAQCAtMCwwICsxLDQxMzIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9pbml0LmMKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKKyAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKKyAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKworLy8jZGVmaW5lIEJJTl9JTl9GSUxFIC8qIHVzZSAqLmJpbiBmaXJtd2FyZSAqLworCitVQ0hBUiAgICBCSVQ4W10gPSB7MHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07CitVTE9ORyAgICBCSVQzMltdID0gezB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDgsCisJCQkJCTB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwODAsCisJCQkJCTB4MDAwMDAxMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA4MDAsCisJCQkJCTB4MDAwMDEwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDgwMDAsCisJCQkJCTB4MDAwMTAwMDAsIDB4MDAwMjAwMDAsIDB4MDAwNDAwMDAsIDB4MDAwODAwMDAsCisJCQkJCTB4MDAxMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA4MDAwMDAsCisJCQkJCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCisJCQkJCTB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDB9OworCitjaGFyKiAgIENpcGhlck5hbWVbXSA9IHsibm9uZSIsIndlcDY0Iiwid2VwMTI4IiwiVEtJUCIsIkFFUyIsIkNLSVA2NCIsIkNLSVAxMjgifTsKKworY29uc3QgdW5zaWduZWQgc2hvcnQgY2NpdHRfMTZUYWJsZVtdID0geworCTB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwQTUsIDB4NjBDNiwgMHg3MEU3LAorCTB4ODEwOCwgMHg5MTI5LCAweEExNEEsIDB4QjE2QiwgMHhDMThDLCAweEQxQUQsIDB4RTFDRSwgMHhGMUVGLAorCTB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MkI1LCAweDQyOTQsIDB4NzJGNywgMHg2MkQ2LAorCTB4OTMzOSwgMHg4MzE4LCAweEIzN0IsIDB4QTM1QSwgMHhEM0JELCAweEMzOUMsIDB4RjNGRiwgMHhFM0RFLAorCTB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NEU2LCAweDc0QzcsIDB4NDRBNCwgMHg1NDg1LAorCTB4QTU2QSwgMHhCNTRCLCAweDg1MjgsIDB4OTUwOSwgMHhFNUVFLCAweEY1Q0YsIDB4QzVBQywgMHhENThELAorCTB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NkQ3LCAweDY2RjYsIDB4NTY5NSwgMHg0NkI0LAorCTB4Qjc1QiwgMHhBNzdBLCAweDk3MTksIDB4ODczOCwgMHhGN0RGLCAweEU3RkUsIDB4RDc5RCwgMHhDN0JDLAorCTB4NDhDNCwgMHg1OEU1LCAweDY4ODYsIDB4NzhBNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAorCTB4QzlDQywgMHhEOUVELCAweEU5OEUsIDB4RjlBRiwgMHg4OTQ4LCAweDk5NjksIDB4QTkwQSwgMHhCOTJCLAorCTB4NUFGNSwgMHg0QUQ0LCAweDdBQjcsIDB4NkE5NiwgMHgxQTcxLCAweDBBNTAsIDB4M0EzMywgMHgyQTEyLAorCTB4REJGRCwgMHhDQkRDLCAweEZCQkYsIDB4RUI5RSwgMHg5Qjc5LCAweDhCNTgsIDB4QkIzQiwgMHhBQjFBLAorCTB4NkNBNiwgMHg3Qzg3LCAweDRDRTQsIDB4NUNDNSwgMHgyQzIyLCAweDNDMDMsIDB4MEM2MCwgMHgxQzQxLAorCTB4RURBRSwgMHhGRDhGLCAweENERUMsIDB4RERDRCwgMHhBRDJBLCAweEJEMEIsIDB4OEQ2OCwgMHg5RDQ5LAorCTB4N0U5NywgMHg2RUI2LCAweDVFRDUsIDB4NEVGNCwgMHgzRTEzLCAweDJFMzIsIDB4MUU1MSwgMHgwRTcwLAorCTB4RkY5RiwgMHhFRkJFLCAweERGREQsIDB4Q0ZGQywgMHhCRjFCLCAweEFGM0EsIDB4OUY1OSwgMHg4Rjc4LAorCTB4OTE4OCwgMHg4MUE5LCAweEIxQ0EsIDB4QTFFQiwgMHhEMTBDLCAweEMxMkQsIDB4RjE0RSwgMHhFMTZGLAorCTB4MTA4MCwgMHgwMEExLCAweDMwQzIsIDB4MjBFMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAorCTB4ODNCOSwgMHg5Mzk4LCAweEEzRkIsIDB4QjNEQSwgMHhDMzNELCAweEQzMUMsIDB4RTM3RiwgMHhGMzVFLAorCTB4MDJCMSwgMHgxMjkwLCAweDIyRjMsIDB4MzJEMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAorCTB4QjVFQSwgMHhBNUNCLCAweDk1QTgsIDB4ODU4OSwgMHhGNTZFLCAweEU1NEYsIDB4RDUyQywgMHhDNTBELAorCTB4MzRFMiwgMHgyNEMzLCAweDE0QTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAorCTB4QTdEQiwgMHhCN0ZBLCAweDg3OTksIDB4OTdCOCwgMHhFNzVGLCAweEY3N0UsIDB4QzcxRCwgMHhENzNDLAorCTB4MjZEMywgMHgzNkYyLCAweDA2OTEsIDB4MTZCMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAorCTB4RDk0QywgMHhDOTZELCAweEY5MEUsIDB4RTkyRiwgMHg5OUM4LCAweDg5RTksIDB4Qjk4QSwgMHhBOUFCLAorCTB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOEMwLCAweDA4RTEsIDB4Mzg4MiwgMHgyOEEzLAorCTB4Q0I3RCwgMHhEQjVDLCAweEVCM0YsIDB4RkIxRSwgMHg4QkY5LCAweDlCRDgsIDB4QUJCQiwgMHhCQjlBLAorCTB4NEE3NSwgMHg1QTU0LCAweDZBMzcsIDB4N0ExNiwgMHgwQUYxLCAweDFBRDAsIDB4MkFCMywgMHgzQTkyLAorCTB4RkQyRSwgMHhFRDBGLCAweERENkMsIDB4Q0Q0RCwgMHhCREFBLCAweEFEOEIsIDB4OURFOCwgMHg4REM5LAorCTB4N0MyNiwgMHg2QzA3LCAweDVDNjQsIDB4NEM0NSwgMHgzQ0EyLCAweDJDODMsIDB4MUNFMCwgMHgwQ0MxLAorCTB4RUYxRiwgMHhGRjNFLCAweENGNUQsIDB4REY3QywgMHhBRjlCLCAweEJGQkEsIDB4OEZEOSwgMHg5RkY4LAorCTB4NkUxNywgMHg3RTM2LCAweDRFNTUsIDB4NUU3NCwgMHgyRTkzLCAweDNFQjIsIDB4MEVEMSwgMHgxRUYwCit9OworI2RlZmluZSBCeXRlQ1JDMTYodiwgY3JjKSBcCisJKHVuc2lnbmVkIHNob3J0KSgoY3JjIDw8IDgpIF4gIGNjaXR0XzE2VGFibGVbKChjcmMgPj4gOCkgXiAodikpICYgMjU1XSkKKwordW5zaWduZWQgY2hhciBCaXRSZXZlcnNlKHVuc2lnbmVkIGNoYXIgeCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIFRlbXA9MDsKKwlmb3IoaT0wOyA7IGkrKykKKwl7CisJCWlmKHggJiAweDgwKQlUZW1wIHw9IDB4ODA7CisJCWlmKGk9PTcpCQlicmVhazsKKwkJeAk8PD0gMTsKKwkJVGVtcCA+Pj0gMTsKKwl9CisJcmV0dXJuIFRlbXA7Cit9CisKKy8vCisvLyBCQlAgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworUkVHX1BBSVIgICBCQlBSZWdUYWJsZVtdID0geworCXtCQlBfUjY1LAkJMHgyQ30sCQkvLyBmaXggcnNzaSBpc3N1ZQorCXtCQlBfUjY2LAkJMHgzOH0sCS8vIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbAorCXtCQlBfUjY5LAkJMHgxMn0sCisJe0JCUF9SNzAsCQkweGF9LAkvLyBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YQorCXtCQlBfUjczLAkJMHgxMH0sCisJe0JCUF9SODEsCQkweDM3fSwKKwl7QkJQX1I4MiwJCTB4NjJ9LAorCXtCQlBfUjgzLAkJMHg2QX0sCisJe0JCUF9SODQsCQkweDk5fSwJLy8gMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlCisJe0JCUF9SODYsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTEsCQkweDA0fSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTIsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SMTAzLCAgCTB4MDB9LCAJLy8gbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjgKKwl7QkJQX1IxMDUsCQkweDA1fSwJLy8gMHgwNSBpcyBmb3IgcnQyODYwRSB0byB0dXJuIG9uIEZFUSBjb250cm9sLiBJdCBpcyBzYWZlIGZvciBydDI4NjBEIGFuZCBiZWZvcmUsIGJlY2F1c2UgQml0IDc6MiBhcmUgcmVzZXJ2ZWQgaW4gcnQyODYwRCBhbmQgYmVmb3JlLgorfTsKKyNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQorCisvLworLy8gUkYgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworI2lmZGVmIFJUMjg3MAorUkVHX1BBSVIgICBSVDMweHhfUkZSZWdUYWJsZVtdID0geworICAgICAgICB7UkZfUjA0LCAgICAgICAgICAweDQwfSwKKyAgICAgICAge1JGX1IwNSwgICAgICAgICAgMHgwM30sCisgICAgICAgIHtSRl9SMDYsICAgICAgICAgIDB4MDJ9LAorICAgICAgICB7UkZfUjA3LCAgICAgICAgICAweDcwfSwKKyAgICAgICAge1JGX1IwOSwgICAgICAgICAgMHgwRn0sCisgICAgICAgIHtSRl9SMTAsICAgICAgICAgIDB4NzF9LAorICAgICAgICB7UkZfUjExLCAgICAgICAgICAweDIxfSwKKyAgICAgICAge1JGX1IxMiwgICAgICAgICAgMHg3Qn0sCisgICAgICAgIHtSRl9SMTQsICAgICAgICAgIDB4OTB9LAorICAgICAgICB7UkZfUjE1LCAgICAgICAgICAweDU4fSwKKyAgICAgICAge1JGX1IxNiwgICAgICAgICAgMHhCM30sCisgICAgICAgIHtSRl9SMTcsICAgICAgICAgIDB4OTJ9LAorICAgICAgICB7UkZfUjE4LCAgICAgICAgICAweDJDfSwKKyAgICAgICAge1JGX1IxOSwgICAgICAgICAgMHgwMn0sCisgICAgICAgIHtSRl9SMjAsICAgICAgICAgIDB4QkF9LAorICAgICAgICB7UkZfUjIxLCAgICAgICAgICAweERCfSwKKyAgICAgICAge1JGX1IyNCwgICAgICAgICAgMHgxNn0sCisgICAgICAgIHtSRl9SMjUsICAgICAgICAgIDB4MDF9LAorICAgICAgICB7UkZfUjI3LCAgICAgICAgICAweDAzfSwKKyAgICAgICAge1JGX1IyOSwgICAgICAgICAgMHgxRn0sCit9OworI2RlZmluZQlOVU1fUkZfUkVHX1BBUk1TCShzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworLy8KKy8vIEFTSUMgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0cworLy8KKworUlRNUF9SRUdfUEFJUglNQUNSZWdUYWJsZVtdID0JeworI2lmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgyMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZjhmMGU4ZTB9LCAvKiAweDM4MDAoZTApLCAweDNBMDAoZTgpLCAweDNDMDAoZjApLCAweDNFMDAoZjgpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworCXtCQ05fT0ZGU0VUMSwJCQkweDZmNzdkMGM4fSwgLyogMHgzMjAwKGM4KSwgMHgzNDAwKGQwKSwgMHgxREMwKDc3KSwgMHgxQkMwKDZmKSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKyNlbGlmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgxMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZWNlOGU0ZTB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLAkJCTB4ZmNmOGY0ZjB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisjZWxzZQorICAgICNlcnJvciBZb3UgbXVzdCByZS1jYWxjdWxhdGUgbmV3IHZhbHVlIGZvciBCQ05fT0ZGU0VUMCAmIEJDTl9PRkZTRVQxIGluIE1BQ1JlZ1RhYmxlW10hISEKKyNlbmRpZiAvLyBIV19CRUFDT05fT0ZGU0VUIC8vCisKKwl7TEVHQUNZX0JBU0lDX1JBVEUsCQkweDAwMDAwMTNmfSwgLy8gIEJhc2ljIHJhdGUgc2V0IGJpdG1hcAorCXtIVF9CQVNJQ19SQVRFLAkJMHgwMDAwODAwM30sIC8vIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLgorCXtNQUNfU1lTX0NUUkwsCQkweDAwfSwgLy8gMHgxMDA0LCAsIGRlZmF1bHQgRGlzYWJsZSBSWAorCXtSWF9GSUxUUl9DRkcsCQkweDE3Zjk3fSwgLy8weDE0MDAgICwgUlggZmlsdGVyIGNvbnRyb2wsCisJe0JLT0ZGX1NMT1RfQ0ZHLAkweDIwOX0sIC8vIGRlZmF1bHQgc2V0IHNob3J0IHNsb3QgdGltZSwgQ0NfREVMQVlfVElNRSBzaG91bGQgYmUgMgorCXtUWF9TV19DRkcwLAkJMHgwfSwgCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0CisJe1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCisJe1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMworCS8ve1RYX1RJTUVPVVRfQ0ZHLAkweDAwMTgyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUCisJe1RYX1RJTUVPVVRfQ0ZHLAkweDAwMGEyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUICwgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMQorCXtNQVhfTEVOX0NGRywJCU1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8vIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4KKwl7TEVEX0NGRywJCTB4N2YwMzFlNDZ9LCAvLyBHYXJ5LCAyMDA2LTA4LTIzCisJe1BCRl9NQVhfUENOVCwJCQkweDFGM0ZCRjlGfSwgCS8vMHgxRjNmN2Y5Zn0sCQkvL0phbiwgMjAwNi8wNC8yMAorCS8ve1RYX1JUWV9DRkcsCQkJMHg2YmI4MDQwOH0sCS8vIEphbiwgMjAwNi8xMS8xNgorCXtUWF9SVFlfQ0ZHLAkJCTB4NDdkMDFmMGZ9LAkvLyBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMKKwl7QVVUT19SU1BfQ0ZHLAkJCTB4MDAwMDAwMTN9LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIKKwl7Q0NLX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCisJe09GRE1fUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KKyNpZmRlZiBSVDI4NzAKKwl7UEJGX0NGRywgCQkJCTB4ZjQwMDA2fSwgCQkvLyBPbmx5IGVuYWJsZSBRdWV1ZSAyCisJe01NNDBfUFJPVF9DRkcsCQkJMHgzRjQ0MDg0fSwJCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgorCXtXUERNQV9HTE9fQ0ZHLAkJCTB4MDAwMDAwMzB9LAorI2VuZGlmIC8vIFJUMjg3MCAvLworCXtHRjIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LCAgICAvLyBzZXQgMTk6MTggLS0+IFNob3J0IE5BViBmb3IgTUlNTyBQUworCXtHRjQwX1BST1RfQ0ZHLAkJCTB4MDNGNDQwODR9LAorCXtNTTIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LAorCXtUWE9QX0NUUkxfQ0ZHLAkJCTB4MDAwMDU4M2YsIC8qMHgwMDAwMjQzZiovIC8qMHgwMDAwMjRiZiovfSwJLy9FeHRlbnNpb24gY2hhbm5lbCBiYWNrb2ZmLgorCXtUWF9SVFNfQ0ZHLAkJCTB4MDAwOTJiMjB9LAorLy8jaWZkZWYgV0lGSV9URVNUCisJe0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQorLy8jZWxzZQorLy8Je0VYUF9BQ0tfVElNRSwJCQkweDAwNTQwMGNhfSwJLy8gc3VnZ2VzdGVkIGJ5IEdyYXkgQCAyMDA3MDMyMyBmb3IgMTFuIGludGVsLXN0YSB0aHJvdWdocHV0CisvLyNlbmRpZiAvLyBlbmQgLSBXSUZJX1RFU1QgLy8KKwl7VFhPUF9ITERSX0VULCAJCQkweDAwMDAwMDAyfSwKKworCS8qIEplcnJ5IGNvbW1lbnRzIDIwMDgvMDEvMTY6IHdlIHVzZSBTSUZTID0gMTB1cyBpbiBDQ0sgZGVmYXVsdGx5LCBidXQgaXQgc2VlbXMgdGhhdCAxMHVzCisJCWlzIHRvbyBzbWFsbCBmb3IgSU5URUwgMjIwMGJnIGNhcmQsIHNvIGluIE1CU1MgbW9kZSwgdGhlIGRlbHRhIHRpbWUgYmV0d2VlbiBiZWFjb24wCisJCWFuZCBiZWFjb24xIGlzIFNJRlMgKDEwdXMpLCBzbyBpZiBJTlRFTCAyMjAwYmcgY2FyZCBjb25uZWN0cyB0byBCU1MwLCB0aGUgcGluZworCQl3aWxsIGFsd2F5cyBsb3N0LiBTbyB3ZSBjaGFuZ2UgdGhlIFNJRlMgb2YgQ0NLIGZyb20gMTB1cyB0byAxNnVzLiAqLworCXtYSUZTX1RJTUVfQ0ZHLAkJCTB4MzNhNDEwMTB9LAorCXtQV1JfUElOX0NGRywJCQkweDAwMDAwMDAzfSwJLy8gcGF0Y2ggZm9yIDI4ODAtRQorfTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitSVE1QX1JFR19QQUlSCVNUQU1BQ1JlZ1RhYmxlW10gPQl7CisJe1dNTV9BSUZTTl9DRkcsCQkweDAwMDAyMjczfSwKKwl7V01NX0NXTUlOX0NGRywJMHgwMDAwMjM0NH0sCisJe1dNTV9DV01BWF9DRkcsCTB4MDAwMDM0YWF9LAorfTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZQlOVU1fTUFDX1JFR19QQVJNUwkJKHNpemVvZihNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lCU5VTV9TVEFfTUFDX1JFR19QQVJNUwkoc2l6ZW9mKFNUQU1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg3MAorLy8KKy8vIFJUMjg3MCBGaXJtd2FyZSBTcGVjIG9ubHkgdXNlZCAxIG9jdCBmb3IgdmVyc2lvbiBleHByZXNzaW9uCisvLworI2RlZmluZSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OCTcKKworI2VuZGlmIC8vIFJUMjg3MCAvLworCisvLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSAkweDIwMDAKKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9MRU5HVEgJCShzaXplb2YgKEZpcm13YXJlSW1hZ2UpIC8gc2l6ZW9mKFVDSEFSKSkKKyNkZWZpbmUgRklSTVdBUkVfTUFKT1JfVkVSU0lPTgkwCisKKyNkZWZpbmUgRklSTVdBUkVJTUFHRVYxX0xFTkdUSAkweDEwMDAKKyNkZWZpbmUgRklSTVdBUkVJTUFHRVYyX0xFTkdUSAkweDEwMDAKKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbGxvY2F0ZSBSVE1QX0FEQVBURVIgZGF0YSBibG9jayBhbmQgZG8gc29tZSBpbml0aWFsaXphdGlvbgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NBZGFwdGVyQmxvY2soCisJSU4gIFBWT0lECWhhbmRsZSwKKwlPVVQJUFJUTVBfQURBUFRFUgkqcHBBZGFwdGVyKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJSU5UIAkJCWluZGV4OworCVVDSEFSCQkJKnBCZWFjb25CdWYgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY0FkYXB0ZXJCbG9ja1xuIikpOworCisJKnBwQWRhcHRlciA9IE5VTEw7CisKKwlkbworCXsKKwkJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1lbW9yeSBibG9jaworCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkKKwkJeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKFBWT0lEICopJnBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEFEQVBURVJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKKwkJcHJpbnRrKCJcblxuPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG5cbiIsIHBBZCwgKFVJTlQzMilzaXplb2YoUlRNUF9BREFQVEVSKSk7CisKKworCQkvLyBJbml0IHNwaW4gbG9ja3MKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCQlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwkJeworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJCX0KKworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlpZiAoKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSAmJiAocEJlYWNvbkJ1ZikpCisJCWtmcmVlKHBCZWFjb25CdWYpOworCisJKnBwQWRhcHRlciA9IHBBZDsKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NBZGFwdGVyQmxvY2ssIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBUeCBwb3dlciBwZXIgTUNTIGFuZCBCVyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcJCWRhdGEsIEFkYXRhLCBHZGF0YTsKKwlVU0hPUlQJCWksIHZhbHVlLCB2YWx1ZTI7CisJSU5UCQkJQXB3cmRlbHRhLCBHcHdyZGVsdGE7CisJVUNIQVIJCXQxLHQyLHQzLHQ0OworCUJPT0xFQU4JCWJWYWxpZCwgYkFwd3JkZWx0YU1pbnVzID0gVFJVRSwgYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKworCS8vCisJLy8gR2V0IHBvd2VyIGRlbHRhIGZvciAyME1IeiBhbmQgNDBNSHouCisJLy8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeHBvd2VyIHBlciBSYXRlXG4iKSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9ERUxUQSwgdmFsdWUyKTsKKwlBcHdyZGVsdGEgPSAwOworCUdwd3JkZWx0YSA9IDA7CisKKwlpZiAoKHZhbHVlMiAmIDB4ZmYpICE9IDB4ZmYpCisJeworCQlpZiAoKHZhbHVlMiAmIDB4ODApKQorCQkJR3B3cmRlbHRhID0gKHZhbHVlMiYweGYpOworCisJCWlmICgodmFsdWUyICYgMHg0MCkpCisJCQliR3B3cmRlbHRhTWludXMgPSBGQUxTRTsKKwkJZWxzZQorCQkJYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKwl9CisJaWYgKCh2YWx1ZTIgJiAweGZmMDApICE9IDB4ZmYwMCkKKwl7CisJCWlmICgodmFsdWUyICYgMHg4MDAwKSkKKwkJCUFwd3JkZWx0YSA9ICgodmFsdWUyJjB4ZjAwKT4+OCk7CisKKwkJaWYgKCh2YWx1ZTIgJiAweDQwMDApKQorCQkJYkFwd3JkZWx0YU1pbnVzID0gRkFMU0U7CisJCWVsc2UKKwkJCWJBcHdyZGVsdGFNaW51cyA9IFRSVUU7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdwd3JkZWx0YSA9ICV4LCBBcHdyZGVsdGEgPSAleCAuXG4iLCBHcHdyZGVsdGEsIEFwd3JkZWx0YSkpOworCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLgorCS8vCisJZm9yIChpPTA7IGk8NTsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCwgdmFsdWUpOworCQlkYXRhID0gdmFsdWU7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJR2RhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisJCWRhdGEgfD0gKHZhbHVlPDwxNik7CisKKwkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7CisJCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOworCisJCWlmIChkYXRhICE9IDB4ZmZmZmZmZmYpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIGRhdGEpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDIuNEcgYmFuZC0lbHgsICBBZGF0YSA9ICVseCwgIEdkYXRhID0gJWx4IFxuIiwgZGF0YSwgQWRhdGEsIEdkYXRhKSk7CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiAyLjRHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDY7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyAyICsgaSoyLCB2YWx1ZSk7CisJCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCisJCXsKKwkJCWJWYWxpZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDQwTUh6IGluIDIuNEcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlHZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisKKwkJCWlmIChpID09IDApCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gJiAweDAwMDBGRkZGKSB8IChHZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdID0gR2RhdGE7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI0ME1IeiBCVywgMi40RyBiYW5kLCBHZGF0YSA9ICVseCBcbiIsIEdkYXRhKSk7CisJCX0KKwl9CisKKwkvLworCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDIwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOworCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQorCQl7CisJCQliVmFsaWQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiA1Ry4KKwkvLworCWlmIChiVmFsaWQpCisJeworCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gJiAweDAwMDBGRkZGKSB8IChBZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOworCQl9CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiA1Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIDIgKyBpKjIsIHZhbHVlKTsKKwkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKKwkJeworCQkJYlZhbGlkID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gNUcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0ICsgMiwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7CisJCQllbHNlCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gPSBBZGF0YTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCA1R0h6IGJhbmQsIEFkYXRhID0gJWx4IFxuIiwgQWRhdGEpKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBpbml0aWFsIGNoYW5uZWwgcG93ZXIgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRDaGFubmVsUHdyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJCWksIGNob2Zmc2V0OworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyMjsKKworCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscworCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCisJLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCisJLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQorCisJLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwl7CisvLwkJUG93ZXIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMik7CisvLwkJUG93ZXIyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWF9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKwkJcEFkLT5UeFBvd2VyW2kgKiAyXS5DaGFubmVsID0gaSAqIDIgKyAxOworCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5DaGFubmVsID0gaSAqIDIgKyAyOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPiAzMSkgfHwgKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPiAzMSkgfHwgKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPiAzMSkgfHwgKFBvd2VyMi5maWVsZC5CeXRlMCA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA+IDMxKSB8fCAoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gMS4gVS1OSUkgbG93ZXIvbWlkZGxlIGJhbmQ6IDM2LCAzOCwgNDA7IDQ0LCA0NiwgNDg7IDUyLCA1NCwgNTY7IDYwLCA2MiwgNjQgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikKKwkvLyAxLjEgRmlsbCB1cCBjaGFubmVsCisJY2hvZmZzZXQgPSAxNDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDA7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCisJLy8gMS4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKy8vCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIGkgKiAyKTsKKy8vCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDIuIEhpcHBlckxBTiAyIDEwMCwgMTAyICwxMDQ7IDEwOCwgMTEwLCAxMTI7IDExNiwgMTE4LCAxMjA7IDEyNCwgMTI2LCAxMjg7IDEzMiwgMTM0LCAxMzY7IDE0MCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDIuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTI7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTQwOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJLy8gMi4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKy8vCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyKTsKKy8vCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDMuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNjU7CisJcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvLyAzLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworLy8JCVBvd2VyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIpOworLy8JCVBvd2VyMi53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMik7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlcjIud29yZCk7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gNC4gUHJpbnQgYW5kIERlYnVnCisJY2hvZmZzZXQgPSAxNCArIDEyICsgMTYgKyA3OworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgcmVnaXN0cnkKKwkJMS4gQWxsIHRoZSBwYXJhbWV0ZXJzCisJCTIuIE5ldHdvcmtBZGRyZXMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CUZvciB1c2UgYnkgTmRpc09wZW5Db25maWd1cmF0aW9uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19SRVNPVVJDRVMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDUmVhZFJlZ1BhcmFtZXRlcnMoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU5ESVNfSEFORExFCQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKQoreworCU5ESVNfU1RBVFVTCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gTklDUmVhZFJlZ1BhcmFtZXRlcnMsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworCisjaWZkZWYgUlQyODcwCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRm9yIFJGIGZpbHRlciBjYWxpYnJhdGlvbiBwdXJwb3NlCisKKwlBcmd1bWVudHM6CisJCXBBZCAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkZpbHRlckNhbGlicmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSCVI1NXggPSAwLCB2YWx1ZSwgRmlsdGVyVGFyZ2V0ID0gMHgxRSwgQkJQVmFsdWU7CisJVUlOVAlsb29wID0gMCwgY291bnQgPSAwLCBsb29wY250ID0gMCwgUmVUcnkgPSAwOworCVVDSEFSCVJGX1IyNF9WYWx1ZSA9IDA7CisKKwkvLyBHaXZlIGJicCBmaWx0ZXIgaW5pdGlhbCB2YWx1ZQorCXBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0ID0gMHgxNjsKKwlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IDB4MzY7ICAvL0JpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwCisKKwlkbworCXsKKwkJaWYgKGxvb3AgPT0gMSkJLy9CYW5kV2lkdGggPSA0MCBNSHoKKwkJeworCQkJLy8gV3JpdGUgMHgyNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKKwkJCVJGX1IyNF9WYWx1ZSA9IDB4Mjc7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7CisJCQlGaWx0ZXJUYXJnZXQgPSAweDE5OworCisJCQkvLyB3aGVuIGNhbGlicmF0ZSBCVzQwLCBCQlAgbWFzayBtdXN0IHNldCB0byBCVzQwLgorCQkJUlRVU0JSZWFkQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZXw9ICgweDEwKTsKKwkJCVJUVVNCV3JpdGVCQlBSZWdpc3RlcihwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQl9CisJCWVsc2UJCQkvL0JhbmRXaWR0aCA9IDIwIE1IegorCQl7CisJCQkvLyBXcml0ZSAweDA3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgorCQkJUkZfUjI0X1ZhbHVlID0gMHgwNzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKwkJCUZpbHRlclRhcmdldCA9IDB4MTY7CisJCX0KKworCQkvLyBXcml0ZSAweDAxIHRvIFJGX1IyMiB0byBlbmFibGUgYmFzZWJhbmQgbG9vcGJhY2sgbW9kZQorCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwkJdmFsdWUgfD0gMHgwMTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7CisKKwkJLy8gV3JpdGUgMHgwMCB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBwYXNzYmFuZCB0ZXN0IHRvbmUKKwkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMCk7CisKKwkJZG8KKwkJeworCQkJLy8gV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZQorCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNSwgMHg5MCk7CisKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCQkvLyBSZWFkIEJCUF9SNTVbNjowXSBmb3IgcmVjZWl2ZWQgcG93ZXIsIHNldCBSNTV4ID0gQkJQX1I1NVs2OjBdCisJCQlSVFVTQlJlYWRCQlBSZWdpc3RlcihwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7CisJCQlSNTV4ID0gdmFsdWUgJiAweEZGOworCisJCX0gd2hpbGUgKChSZVRyeSsrIDwgMTAwKSAmJiAoUjU1eCA9PSAwKSk7CisKKwkJLy8gV3JpdGUgMHgwNiB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBzdG9wYmFuZCB0ZXN0IHRvbmUKKwkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMHgwNik7CisKKwkJd2hpbGUoVFJVRSkKKwkJeworCQkJLy8gV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZQorCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNSwgMHg5MCk7CisKKwkJCS8vV2UgbmVlZCB0byB3YWl0IGZvciBjYWxpYnJhdGlvbgorCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKKwkJCXZhbHVlICY9IDB4RkY7CisJCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpCisJCQl7CisJCQkJUkZfUjI0X1ZhbHVlICsrOworCQkJfQorCQkJZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KQorCQkJeworCQkJCVJGX1IyNF9WYWx1ZSArKzsKKwkJCQljb3VudCArKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIGNhdXNlIGRyaXZlciBoYW5nLgorCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLCBsb29wY250KSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgorCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkKKwkJeworCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOworCQl9CisKKwkJLy8gU3RvcmUgZm9yIGZ1dHVyZSB1c2FnZQorCQlpZiAobG9vcGNudCA8IDEwMCkKKwkJeworCQkJaWYgKGxvb3ArKyA9PSAwKQorCQkJeworCQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6CisJCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vQmFuZFdpZHRoID0gNDAgTUh6CisJCQkJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKworCQkvLyByZXNldCBjb3VudAorCQljb3VudCA9IDA7CisJfSB3aGlsZShUUlVFKTsKKworCS8vCisJLy8gU2V0IGJhY2sgdG8gaW5pdGlhbCBzdGF0ZQorCS8vCisJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMCk7CisKKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwl2YWx1ZSAmPSB+KDB4MDEpOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOworCisJLy8gc2V0IEJCUCBiYWNrIHRvIEJXMjAKKwlSVFVTQlJlYWRCQlBSZWdpc3RlcihwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkZpbHRlckNhbGlicmF0aW9uIC0gQ2FsaUJXMjBSZlIyND0weCV4LCBDYWxpQlc0MFJmUjI0PTB4JXhcbiIsIHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0LCBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCkpOworfQorCisKK1ZPSUQgTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzKElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCBpOworCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKKwkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgaWYgKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8KHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJbml0IFJGIGNhbGlicmF0aW9uCisgICAgICAgICAgICAgICAgLy8gRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCisgICAgICAgICAgICAgICAgVUxPTkcgUmZSZWcgPSAwOworICAgICAgICAgICAgICAgIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7CisgICAgICAgICAgICAgICAgUmZSZWcgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChVQ0hBUilSZlJlZyk7CisgICAgICAgICAgICAgICAgUlRNUHVzZWNEZWxheSgxMDAwKTsKKyAgICAgICAgICAgICAgICBSZlJlZyAmPSAweDdGOworICAgICAgICAgICAgICAgIFJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKKworICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0ZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24KKyAgICAgICAgICAgICAgICBSVFVTQkZpbHRlckNhbGlicmF0aW9uKHBBZCk7CisgICAgICAgIH0KKworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIGluaXRpYWwgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJbWFjX2FkZHIpCit7CisJVUlOVDMyCQkJZGF0YSA9IDA7CisJVVNIT1JUCQkJaSwgdmFsdWUsIHZhbHVlMjsKKwlVQ0hBUgkJCVRtcFBoeTsKKwlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKKwlFRVBST01fVkVSU0lPTl9TVFJVQyAgICBWZXJzaW9uOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDCUFudGVubmE7CisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDUmVhZEVFUFJPTVBhcmFtZXRlcnNcbiIpKTsKKworCS8vIEluaXQgRUVQUk9NIEFkZHJlc3MgTnVtYmVyLCBiZWZvcmUgYWNjZXNzIEVFUFJPTTsgaWYgOTNjNDYsIEVFUFJPTUFkZHJlc3NOdW09NiwgZWxzZSBpZiA5M2M2NiwgRUVQUk9NQWRkcmVzc051bT04CisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEUyUFJPTV9DU1IgPSAweCV4XG4iLCBkYXRhKSk7CisKKwlpZigoZGF0YSAmIDB4MzApID09IDApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CQkvLyA5M0M0NgorCWVsc2UgaWYoKGRhdGEgJiAweDMwKSA9PSAweDEwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OyAgICAgLy8gOTNDNjYKKwllbHNlCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M4NgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFRVBST01BZGRyZXNzTnVtID0gJWRcbiIsIHBBZC0+RUVQUk9NQWRkcmVzc051bSApKTsKKworCS8vIFJUMjg2MCBNQUMgbm8gbG9uZ2VyIGF1dG8gbG9hZCBNQUMgYWRkcmVzcyBmcm9tIEUyUFJPTS4gRHJpdmVyIGhhcyB0byBpbnRpYWxpemUKKwkvLyBNQUMgYWRkcmVzcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIEUyUFJPTSBzZXR0aW5nCisJaWYgKG1hY19hZGRyID09IE5VTEwgfHwKKwkJc3RybGVuKG1hY19hZGRyKSAhPSAxNyB8fAorCQltYWNfYWRkclsyXSAhPSAnOicgIHx8IG1hY19hZGRyWzVdICE9ICc6JyAgfHwgbWFjX2FkZHJbOF0gIT0gJzonIHx8CisJCW1hY19hZGRyWzExXSAhPSAnOicgfHwgbWFjX2FkZHJbMTRdICE9ICc6JykKKwl7CisJCVVTSE9SVCAgQWRkcjAxLEFkZHIyMyxBZGRyNDUgOworCisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNCwgQWRkcjAxKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBBZGRyMjMpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgsIEFkZHI0NSk7CisKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gKFVDSEFSKShBZGRyMDEgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdID0gKFVDSEFSKShBZGRyMDEgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSA9IChVQ0hBUikoQWRkcjIzICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1szXSA9IChVQ0hBUikoQWRkcjIzID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0gPSAoVUNIQVIpKEFkZHI0NSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSAoVUNIQVIpKEFkZHI0NSA+PiA4KTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gRTJQUk9NIFxuIikpOworCX0KKwllbHNlCisJeworCQlJTlQJCWo7CisJCVBVQ0hBUgltYWNwdHI7CisKKwkJbWFjcHRyID0gbWFjX2FkZHI7CisKKwkJZm9yIChqPTA7IGo8TUFDX0FERFJfTEVOOyBqKyspCisJCXsKKwkJCUF0b0gobWFjcHRyLCAmcEFkLT5QZXJtYW5lbnRBZGRyZXNzW2pdLCAxKTsKKwkJCW1hY3B0cj1tYWNwdHIrMzsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBtb2R1bGUgcGFyYW1ldGVyIFxuIikpOworCX0KKworCisJeworI2lmIDAKKwkJVVNIT1JUICBBZGRyMDEsQWRkcjIzLEFkZHI0NSA7CisKKwkJQWRkcjAxPVJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQpOworCQlBZGRyMjM9UlRNUF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNik7CisJCUFkZHI0NT1SVE1QX0VFUFJPTV9SRUFEMTYocEFkLCAweDA4KTsKKworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAoVUNIQVIpKEFkZHIwMSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAoVUNIQVIpKEFkZHIwMSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKFVDSEFSKShBZGRyMjMgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKFVDSEFSKShBZGRyMjMgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9IChVQ0hBUikoQWRkcjQ1ICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IChVQ0hBUikoQWRkcjQ1ID4+IDgpOworI2VuZGlmCisJCS8vbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxCisJCWlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPT0gMHhmZikKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCisJCS8vaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9PSAweGZmKQorCQkvLwlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0pKTsKKwkJaWYgKHBBZC0+YkxvY2FsQWRtaW5NQUMgPT0gRkFMU0UpCisJCXsKKwkJCU1BQ19EVzBfU1RSVUMgY3NyMjsKKwkJCU1BQ19EVzFfU1RSVUMgY3NyMzsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKKwkJCWNzcjIuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOworCQkJY3NyMi5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07CisJCQljc3IyLmZpZWxkLkJ5dGUyID0gcEFkLT5DdXJyZW50QWRkcmVzc1syXTsKKwkJCWNzcjIuZmllbGQuQnl0ZTMgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcwLCBjc3IyLndvcmQpOworCQkJY3NyMy53b3JkID0gMDsKKwkJCWNzcjMuZmllbGQuQnl0ZTQgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdOworCQkJY3NyMy5maWVsZC5CeXRlNSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNV07CisJCQljc3IzLmZpZWxkLlUyTWVNYXNrID0gMHhmZjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMSwgY3NyMy53b3JkKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQl9CisJfQorCisJLy8gaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uCisJLy8gSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwlSVE1QUmVhZENoYW5uZWxQd3IocEFkKTsKKworCS8vIGlmIEUyUFJPTSB2ZXJzaW9uIG1pc21hdGNoIHdpdGggZHJpdmVyJ3MgZXhwZWN0YXRpb24sIHRoZW4gc2tpcAorCS8vIGFsbCBzdWJzZXF1ZW50IEUyUlBPTSByZXRpZXZhbCBhbmQgc2V0IGEgc3lzdGVtIGVycm9yIGJpdCB0byBub3RpZnkgR1VJCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVkVSU0lPTl9PRkZTRVQsIFZlcnNpb24ud29yZCk7CisJcEFkLT5FZXByb21WZXJzaW9uID0gVmVyc2lvbi5maWVsZC5WZXJzaW9uICsgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyICogMjU2OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkUyUFJPTTogVmVyc2lvbiA9ICVkLCBGQUUgcmVsZWFzZSAjJWRcbiIsIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7CisKKwlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pCisJeworCQlEQkdQUklOVF9FUlIoKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKKwkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7CisKKwkJLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZAorCQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CisJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0NIQU5ORUxTOyBpKyspCisJCQlwQWQtPlR4UG93ZXJbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKKwkJCXBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJZm9yKGkgPSAwOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwkJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOworCQlyZXR1cm47ICAqLworCX0KKworCS8vIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMl9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDM4LCB2YWx1ZSk7CS8vIENvdW50cnkgUmVnaW9uCisJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPSB2YWx1ZTsKKworCWZvcihpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkqMiwgdmFsdWUpOworCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpKzNdID0gdmFsdWU7CisJfQorCisJLy8gV2UgaGF2ZSB0byBwYXJzZSBOSUMgY29uZmlndXJhdGlvbiAwIGF0IGhlcmUuCisJLy8gSWYgVFNTSSBkaWQgbm90IGhhdmUgcHJlbG9hZGVkIHZhbHVlLCBpdCBzaG91bGQgcmVzZXQgdGhlIFR4QXV0b0FnYyB0byBmYWxzZQorCS8vIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byByZWFkIFR4QXV0b0FnYyBjb250cm9sIGJlZm9yZWhhbmQuCisJLy8gUmVhZCBUeCBBR0MgY29udHJvbCBiaXQKKwlBbnRlbm5hLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXTsKKwlpZiAoQW50ZW5uYS53b3JkID09IDB4RkZGRikKKwl7CisJCUFudGVubmEud29yZCA9IDA7CisJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzI4MjA7CisJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKKwkJQW50ZW5uYS5maWVsZC5SeFBhdGggPSAyOworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkUyUFJPTSBlcnJvciwgaGFyZCBjb2RlIGFzIDB4JTA0eFxuIiwgQW50ZW5uYS53b3JkKSk7CisJfQorCisJLy8gQ2hvb3NlIHRoZSBkZXNpcmVkIFR4JlJ4IHN0cmVhbS4KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA+IEFudGVubmEuZmllbGQuVHhQYXRoKSkKKwkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlR4UGF0aDsKKworCWlmICgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5SeFBhdGgpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pICYmCisJCQkocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiAyKSkKKwkJeworCQkJLy8gb25seSAyIFJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKKwkJfQorCX0KKworCS8vIDMqMworCS8vIHJlYWQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHNldCB0aGVtIHRvIENTUjE3NCB+IDE3NyBpbiBjaGFpbjAgfiBjaGFpbjIKKwkvLyB5ZXQgaW1wbGVtZW50CisJZm9yKGk9MDsgaTwzOyBpKyspCisJeworCX0KKworCU5pY0NvbmZpZzIud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdOworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOaWNDb25maWcyLndvcmQgPSAwOworCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikKKwkJeworCQkJTmljQ29uZmlnMi53b3JkICY9IDB4ZmYwMDsKKwkJfQorCisJCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpCisJCXsKKwkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKKwllbHNlCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiTklDUmVhZEVFUFJPTVBhcmFtZXRlcnM6IFJ4UGF0aCA9ICVkLCBUeFBhdGggPSAlZFxuIiwgQW50ZW5uYS5maWVsZC5SeFBhdGgsIEFudGVubmEuZmllbGQuVHhQYXRoKSk7CisKKwkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCisJcEFkLT5BbnRlbm5hLndvcmQgPSBBbnRlbm5hLndvcmQ7CisKKwkvLworCS8vIFJlc2V0IFBoeU1vZGUgaWYgd2UgZG9uJ3Qgc3VwcG9ydCA4MDIuMTFhCisJLy8gT25seSBSRklDXzI4NTAgJiBSRklDXzI3NTAgc3VwcG9ydCA4MDIuMTFhCisJLy8KKwlpZiAoKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yODUwKSAmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI3NTApKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkgfHwKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQl8fAorCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHTl9NSVhFRDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBSZWFkIFRTU0kgcmVmZXJlbmNlIGFuZCBUU1NJIGJvdW5kYXJ5IGZvciB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24uIFRoaXMgaXMgdWdseQorCS8vIDAuIDExYi9nCisJeworCQkvKiB0aGVzZSBhcmUgdGVtcGF0dXJlIHJlZmVyZW5jZSB2YWx1ZSAoMHgwMCB+IDB4RkUpCisJCSAgIGV4OiAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkgICBUc3NpUGx1c0JvdW5kYXJ5RyBbNF0gWzNdIFsyXSBbMV0gWzBdIChzbWFsbGVyKSArCisJCSAgIFRzc2lNaW51c0JvdW5kYXJ5R1swXSBbMV0gWzJdIFszXSBbNF0gKGxhcmdlcikgKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDZFLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcwLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcyLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUmVmRyAgID0gUG93ZXIuZmllbGQuQnl0ZTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBbMF0gKi8KKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzQsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDc2LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlR4QWdjU3RlcEcgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJcEFkLT5UeEFnY0NvbXBlbnNhdGVHID0gMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdICA9IHBBZC0+VHNzaVJlZkc7CisKKwkJLy8gRGlzYWJsZSBUeEFnYyBpZiB0aGUgYmFzZWQgdmFsdWUgaXMgbm90IHJpZ2h0CisJCWlmIChwQWQtPlRzc2lSZWZHID09IDB4ZmYpCisJCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFMlBST006IEcgVHNzaVstNCAuLiArNF0gPSAlZCAlZCAlZCAlZCAtICVkIC0lZCAlZCAlZCAlZCwgc3RlcD0lZCwgdHVuaW5nPSVkXG4iLAorCQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0sCisJCQlwQWQtPlRzc2lSZWZHLAorCQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSwKKwkJCXBBZC0+VHhBZ2NTdGVwRywgcEFkLT5iQXV0b1R4QWdjRykpOworCX0KKwkvLyAxLiAxMWEKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENiwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEOCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVJlZkEgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQSwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVszXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4REMsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHhBZ2NTdGVwQSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUEgPSAwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXSA9IHBBZC0+VHNzaVJlZkE7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF0gID0gcEFkLT5Uc3NpUmVmQTsKKworCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJaWYgKHBBZC0+VHNzaVJlZkEgPT0gMHhmZikKKwkJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogQSBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSwKKwkJCXBBZC0+VHNzaVJlZkEsCisJCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdLAorCQkJcEFkLT5UeEFnY1N0ZXBBLCBwQWQtPmJBdXRvVHhBZ2NBKSk7CisJfQorCXBBZC0+QmJwUnNzaVRvRGJtRGVsdGEgPSAweDA7CisKKwkvLyBSZWFkIGZyZXF1ZW5jeSBvZmZzZXQgc2V0dGluZyBmb3IgUkYKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9GUkVRX09GRlNFVCwgdmFsdWUpOworCWlmICgodmFsdWUgJiAweDAwRkYpICE9IDB4MDBGRikKKwkJcEFkLT5SZkZyZXFPZmZzZXQgPSAoVUxPTkcpICh2YWx1ZSAmIDB4MDBGRik7CisJZWxzZQorCQlwQWQtPlJmRnJlcU9mZnNldCA9IDA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKKworCS8vQ291bnRyeVJlZ2lvbiBieXRlIG9mZnNldCAoMzhoKQorCXZhbHVlID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPj4gODsJCS8vIDIuNEcgYmFuZAorCXZhbHVlMiA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdICYgMHgwMEZGOwkvLyA1RyBiYW5kCisKKwlpZiAoKHZhbHVlIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpICYmICh2YWx1ZTIgPD0gUkVHSU9OX01BWElNVU1fQV9CQU5EKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoKFVDSEFSKSB2YWx1ZSkgfCAweDgwOworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoKFVDSEFSKSB2YWx1ZTIpIHwgMHg4MDsKKwkJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLworCS8vIEdldCBSU1NJIE9mZnNldCBvbiBFRVBST00gMHg5QWggJiAweDlDaC4KKwkvLyBUaGUgdmFsaWQgdmFsdWUgYXJlICgtMTAgfiAxMCkKKwkvLworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CR1Jzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5CR1Jzc2lPZmZzZXQxID0gKHZhbHVlID4+IDgpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUKzIsIHZhbHVlKTsKKwlwQWQtPkJHUnNzaU9mZnNldDIgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkFMTkFHYWluMSA9ICh2YWx1ZSA+PiA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CTE5BR2FpbiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4wID0gKHZhbHVlID4+IDgpOworCisJLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8wIG9mZnNldC4KKwlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5CR1Jzc2lPZmZzZXQwID0gMDsKKworCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkJHUnNzaU9mZnNldDEgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDEgPiAxMCkpCisJCXBBZC0+QkdSc3NpT2Zmc2V0MSA9IDA7CisKKwkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQyID4gMTApKQorCQlwQWQtPkJHUnNzaU9mZnNldDIgPSAwOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgdmFsdWUpOworCXBBZC0+QVJzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQrMiksIHZhbHVlKTsKKwlwQWQtPkFSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4yID0gKHZhbHVlID4+IDgpOworCisJaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjEgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4xID09IDB4MDApKQorCQlwQWQtPkFMTkFHYWluMSA9IHBBZC0+QUxOQUdhaW4wOworCWlmICgoKFVDSEFSKXBBZC0+QUxOQUdhaW4yID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMiA9PSAweDAwKSkKKwkJcEFkLT5BTE5BR2FpbjIgPSBwQWQtPkFMTkFHYWluMDsKKworCS8vIFZhbGlkYXRlIDExYSBSU1NJXzAgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDAgPSAwOworCisJLy8gVmFsaWRhdGUgMTFhIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQxID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MSA9IDA7CisKKwkvL1ZhbGlkYXRlIDExYSBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MiA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDIgPSAwOworCisJLy8KKwkvLyBHZXQgTEVEIFNldHRpbmcuCisJLy8KKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4M2EsIHZhbHVlKTsKKwlwQWQtPkxlZENudGwud29yZCA9ICh2YWx1ZSYweGZmMDApID4+IDg7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkxlZDEgPSB2YWx1ZTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQyX09GRlNFVCwgdmFsdWUpOworCXBBZC0+TGVkMiA9IHZhbHVlOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDNfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5MZWQzID0gdmFsdWU7CisKKwlSVE1QUmVhZFR4UHdyUGVyUmF0ZShwQWQpOworCisjaWZkZWYgU0lOR0xFX1NLVQorCS8vcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUik7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUiwgcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IpOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVSU5UMzIJCQkJCWRhdGEgPSAwOworCVVDSEFSCUJCUFIxID0gMDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVU0hPUlQJCQkJCWk7CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKwlVQ0hBUglCQlBSMyA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7CisJZm9yKGkgPSAzOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwl7CisJCVVDSEFSIEJicFJlZ0lkeCwgQmJwVmFsdWU7CisKKwkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKKwkJeworCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKKwkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKKwkJfQorCX0KKworCUFudGVubmEud29yZCA9IHBBZC0+QW50ZW5uYS53b3JkOworCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKwlwQWQtPlJmSWNUeXBlID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJmSWNUeXBlOworCisJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CisKKworCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwlwQWQtPk5pY0NvbmZpZzIud29yZCA9IE5pY0NvbmZpZzIud29yZDsKKworCS8vCisJLy8gU2VuZCBMRUQgU2V0dGluZyB0byBNQ1UuCisJLy8KKwlpZiAocEFkLT5MZWRDbnRsLndvcmQgPT0gMHhGRikKKwl7CisJCXBBZC0+TGVkQ250bC53b3JkID0gMHgwMTsKKwkJcEFkLT5MZWQxID0gMHg1NTU1OworCQlwQWQtPkxlZDIgPSAweDIyMjE7CisKKyNpZmRlZiBSVDI4NzAKKwkJcEFkLT5MZWQzID0gMHg1NjI3OworI2VuZGlmIC8vIFJUMjg3MCAvLworCX0KKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MiwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMSwgKFVDSEFSKShwQWQtPkxlZDEgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MywgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMiwgKFVDSEFSKShwQWQtPkxlZDIgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1NCwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMywgKFVDSEFSKShwQWQtPkxlZDMgPj4gOCkpOworICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RkY7CisgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGJlZm9yZSBsaW5rIHVwCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gUmVhZCBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIHN0YXRlIGVuYWJsZSBiaXQKKwkJaWYgKE5pY0NvbmZpZzIuZmllbGQuSGFyZHdhcmVSYWRpb0NvbnRyb2wgPT0gMSkKKwkJeworCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBUUlVFOworCisJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCWlmICgoZGF0YSAmIDB4MDQpID09IDApCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBGQUxTRTsKKy8vCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKKwkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKQorCXsKKy8vCQlwQWQtPmJUZXN0MSA9IFRSVUU7CisJfQorCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuRHluYW1pY1R4QWdjQ29udHJvbCA9PSAxKQorCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IFRSVUU7CisJZWxzZQorCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOworCS8vCisJLy8gU2luY2UgQkJQIGhhcyBiZWVuIHByb2dhbWVkLCB0byBtYWtlIHN1cmUgQkJQIHNldHRpbmcgd2lsbCBiZQorCS8vIHVwYXRlIGluc2lkZSBvZiBBc2ljQW50ZW5uYVNlbGVjdCwgc28gcmVzZXQgdG8gVU5LTk9XTl9CQU5EISEKKwkvLworCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKKworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKKwlCQlBSMyAmPSAofjB4MTgpOworCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKKwl7CisJCUJCUFIzIHw9ICgweDEwKTsKKwl9CisJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJeworCQlCQlBSMyB8PSAoMHg4KTsKKwl9CisJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJeworCQlCQlBSMyB8PSAoMHgwKTsKKwl9CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIEhhbmRsZSB0aGUgZGlmZmVyZW5jZSB3aGVuIDFUCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJCUFIxKTsKKwkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCUJCUFIxICY9ICh+MHgxOCk7CisJCX0KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQkJQUjEpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVzZSBIdyBSYWRpbyBDb250cm9sIFBpbj0lZDsgaWYgdXNlZCBQaW49JWQ7XG4iLCBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbywgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8pKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQYXRoID0gJWQsIFJ4UGF0aCA9ICVkLCBSRklDPSVkLCBQb2xhcitMRUQgbW9kZT0leFxuIiwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwgcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCwgcEFkLT5SZkljVHlwZSwgcEFkLT5MZWRDbnRsLndvcmQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIE5JQyBoYXJkd2FyZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCU5JQ0luaXRpYWxpemVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgQk9PTEVBTiAgICBiSGFyZFJlc2V0KQoreworCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworLy8JSU5UX01BU0tfQ1NSX1NUUlVDCQlJbnRNYXNrOworCVVMT05HCWkgPTAsIGo9MDsKKwlBQ19UWE9QX0NTUjBfU1RSVUMJY3NyMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQWRhcHRlclxuIikpOworCisJLy8gMy4gU2V0IERNQSBnbG9iYWwgY29uZmlndXJhdGlvbiBleGNlcHQgVFhfRE1BX0VOIGFuZCBSWF9ETUFfRU4gYml0czoKK3JldHJ5OgorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaTwxMDApOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKKwlHbG9DZmcud29yZCAmPSAweGZmMDsKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCS8vIFJlY29yZCBIVyBCZWFjb24gb2Zmc2V0CisJcEFkLT5CZWFjb25PZmZzZXRbMF0gPSBIV19CRUFDT05fQkFTRTA7CisJcEFkLT5CZWFjb25PZmZzZXRbMV0gPSBIV19CRUFDT05fQkFTRTE7CisJcEFkLT5CZWFjb25PZmZzZXRbMl0gPSBIV19CRUFDT05fQkFTRTI7CisJcEFkLT5CZWFjb25PZmZzZXRbM10gPSBIV19CRUFDT05fQkFTRTM7CisJcEFkLT5CZWFjb25PZmZzZXRbNF0gPSBIV19CRUFDT05fQkFTRTQ7CisJcEFkLT5CZWFjb25PZmZzZXRbNV0gPSBIV19CRUFDT05fQkFTRTU7CisJcEFkLT5CZWFjb25PZmZzZXRbNl0gPSBIV19CRUFDT05fQkFTRTY7CisJcEFkLT5CZWFjb25PZmZzZXRbN10gPSBIV19CRUFDT05fQkFTRTc7CisKKwkvLworCS8vIHdyaXRlIGFsbCBzaGFyZWQgUmluZydzIGJhc2UgYWRkcmVzcyBpbnRvIEFTSUMKKwkvLworCisJLy8gYXNpYyBzaW11bGF0aW9uIHNlcXVlbmNlIHB1dCB0aGlzIGFoZWFkIGJlZm9yZSBsb2FkaW5nIGZpcm13YXJlLgorCS8vIHBiZiBoYXJkd2FyZSByZXNldAorCisJLy8gSW5pdGlhbHplIEFTSUMgZm9yIFRYICYgUnggb3BlcmF0aW9uCisJaWYgKE5JQ0luaXRpYWxpemVBc2ljKHBBZCAsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlpZiAoaisrID09IDApCisJCXsKKwkJCU5JQ0xvYWRGaXJtd2FyZShwQWQpOworCQkJZ290byByZXRyeTsKKwkJfQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKworCisKKwkvLyBXTU0gcGFyYW1ldGVyCisJY3NyMC53b3JkID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJeworCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKKwl9CisJZWxzZQorCXsKKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwl9CisJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMC53b3JkKTsKKworCisKKworCS8vIHJlc2V0IGFjdGlvbgorCS8vIExvYWQgZmlybXdhcmUKKwkvLyAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCit7CisJVUxPTkcJCQlJbmRleCA9IDA7CisJVUNIQVIJCQlSMCA9IDB4ZmY7CisJVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKKyNpZmRlZiBSVDI4NzAKKwlVSU5UMzIJCQlNYWNDc3IwID0gMDsKKwlOVFNUQVRVUwkJU3RhdHVzOworCVVDSEFSCQkJVmFsdWUgPSAweGZmOworI2VuZGlmIC8vIFJUMjg3MCAvLworCVVTSE9SVAkJCUtleUlkeDsKKwlJTlQJCQkJaSxhcGlkeDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQXNpY1xuIikpOworCisKKyNpZmRlZiBSVDI4NzAKKwkvLworCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeSBhZnRlciBOSUNMb2FkRmlybXdhcmUoKS4KKwkvLworCUluZGV4ID0gMDsKKworCS8vVG8gYXZvaWQgaGFuZy1vbiBpc3N1ZSB3aGVuIGludGVyZmFjZSB1cCBpbiBrZXJuZWwgMi40LAorCS8vd2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgIk1hY0NzcjAiIGluc3RlYWQgb2YgdXNpbmcgInBBZC0+TUFDVmVyc2lvbiIgZGlyZWN0bHkuCisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKKworCQlpZiAoKE1hY0NzcjAgIT0gMHgwMCkgJiYgKE1hY0NzcjAgIT0gMHhGRkZGRkZGRikpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwKTsKKworCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKKwkvLyB0dXJuIG9uIGJpdDEzIChzZXQgdG8gemVybykgYWZ0ZXIgcnQyODYwRC4gVGhpcyBpcyB0byBzb2x2ZSBoaWdoLWN1cnJlbnQgaXNzdWUuCisJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNDc3IxMik7CisJTWFjQ3NyMTIgJj0gKH4weDIwMDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgTWFjQ3NyMTIpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFVTQl9ETUFfQ0ZHLCAweDApOworCVN0YXR1cyA9IFJUVVNCVmVuZGVyUmVzZXQocEFkKTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKKworCS8vIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IoSW5kZXg9MDsgSW5kZXg8TlVNX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVVNIT1JUKU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwlpZihJU19SVDMwNzAocEFkKSkKKwl7CisJCS8vIEFjY29yZGluZyB0byBGcmFuayBIc3UgKGZyb20gR2FyeSBUc2FvKQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVVNIT1JUKVRYX1NXX0NGRzAsIDB4MDAwMDA0MDApOworCisJCS8vIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQUMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwKKwkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7CisJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFRYX1NXX0NGRzIsIDApOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9TVEFfTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFVTSE9SVClTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIEJlZm9yZSBwcm9ncmFtIEJCUCwgd2UgbmVlZCB0byB3YWl0IEJCUC9SRiBnZXQgd2FrZSB1cC4KKwkvLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1RBVFVTX0NGRywgJk1hY0NzcjEyKTsKKworCQlpZiAoKE1hY0NzcjEyICYgMHgwMykgPT0gMCkJLy8gaWYgQkIuUkYgaXMgc3RhYmxlCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVjayBNQUNfU1RBVFVTX0NGRyAgPSBCdXN5ID0gJXhcbiIsIE1hY0NzcjEyKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7CisKKyAgICAvLyBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUKKwkvLyBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8vIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkvLyBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEKKwlJbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKKwl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOworCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgorCisJaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOworCisjaWZkZWYgUlQyODcwCisJLy93cml0ZSBSVDMwNzAgQkJQIHdjaGljaCBkaWZmZXJlbnQgd2l0aCAyODcwIGFmdGVyIHdyaXRlIFJUMjg3MCBCQlAKKwlpZiAoSVNfUlQzMDcwKHBBZCkpCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwYSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDk5KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMTA1LCAweDA1KTsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDEyKTsKKyAgICB9CisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJLy8gZW5sYXJnZSBNQVhfTEVOX0NGRworCQlVSU5UMzIgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmY3NyKTsKKwkJY3NyICY9IDB4RkZGOworCQljc3IgfD0gMHgyMDAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgY3NyKTsKKwl9CisKKyNpZmRlZiBSVDI4NzAKK3sKKwlVQ0hBUglNQUNfVmFsdWVbXT17MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwwLDB9OworCisJLy9Jbml0aWFsaXplIFdDSUQgdGFibGUKKwlWYWx1ZSA9IDB4ZmY7CisJZm9yKEluZGV4ID0wIDtJbmRleCA8IDI1NDtJbmRleCsrKQorCXsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkoTUFDX1dDSURfQkFTRSArIEluZGV4ICogOCksIE1BQ19WYWx1ZSwgOCk7CisJfQorfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8gQWRkIHJhZGlvIG9mZiBjb250cm9sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisJCXsKKy8vCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBSYWRpbyBPZmZcbiIpKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENsZWFyIHJhdyBjb3VudGVycworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJkNvdW50ZXIpOworCisJLy8gQVNJQyB3aWxsIGtlZXAgZ2FyYmFnZSB2YWx1ZSBhZnRlciBib290CisJLy8gQ2xlYXIgYWxsIHNlYXJlZCBrZXkgdGFibGUgd2hlbiBpbml0aWFsCisJLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBpZ25vcmVkIGluIHJhZGlvLU9OL09GRiBvcGVyYXRpb24uCisJaWYgKGJIYXJkUmVzZXQpCisJeworCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDQ7IEtleUlkeCsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQqS2V5SWR4LCAwKTsKKwkJfQorCisJCS8vIENsZWFyIGFsbCBwYWlyd2lzZSBrZXkgdGFibGUgd2hlbiBpbml0aWFsCisJCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgMjU2OyBLZXlJZHgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoS2V5SWR4ICogSFdfV0NJRF9BVFRSSV9TSVpFKSwgMSk7CisJCX0KKwl9CisKKwkvLyBhc3NlcnQgSE9TVCByZWFkeSBiaXQKKy8vICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgwKTsgLy8gMjAwNC0wOS0xNCBhc2tlZCBieSBNYXJrCisvLyAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4NCk7CisKKwkvLyBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2xlYXIgdGhpcyBzcGFjZSB3aGVuIG5vdCBoYXJkIHJlc2V0LgorCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCisJeworCQkvLyBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UKKwkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQ+PjI7IGkrPTQpCisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYXBpZHhdICsgaSwgMHgwMCk7CisJCX0KKwl9CisjaWZkZWYgUlQyODcwCisJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJLy8gRGVmYXVsdCBQQ0kgY2xvY2sgY3ljbGUgcGVyIG1zIGlzIGRpZmZlcmVudCBhcyBkZWZhdWx0IHNldHRpbmcsIHdoaWNoIGlzIGJhc2VkIG9uIFBDSS4KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFVTQl9DWUNfQ0ZHLCAmQ291bnRlcik7CisJQ291bnRlciY9MHhmZmZmZmYwMDsKKwlDb3VudGVyfD0weDAwMDAwMWU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0NZQ19DRkcsIENvdW50ZXIpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBUWE9QX0NUUkxfQ0ZHIHdpdGggMHg1ODNmLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCisJCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQorCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHg1ODNmKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSXNzdWVSZXNldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UMzIJVmFsdWUgPSAwOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJc3N1ZVJlc2V0XG4iKSk7CisKKwkvLyBBYm9ydCBUeCwgcHJldmVudCBBU0lDIGZyb20gd3JpdGluZyB0byBIb3N0IG1lbW9yeQorCS8vUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ05UTF9DU1IsIDB4MDAxZjAwMDApOworCisJLy8gRGlzYWJsZSBSeCwgcmVnaXN0ZXIgdmFsdWUgc3VwcG9zZWQgd2lsbCByZW1haW4gYWZ0ZXIgcmVzZXQKKwlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkvLyBJc3N1ZSByZXNldCBhbmQgY2xlYXIgZnJvbSByZXNldCBzdGF0ZQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwMyk7IC8vIDIwMDQtMDktMTcgY2hhbmdlIGZyb20gMHgwMQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSXNzdWVSZXNldFxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgQVNJQyByZWdpc3RlcnMgYW5kIGZpbmQgYW55IHJlYXNvbiB0aGUgc3lzdGVtIG1pZ2h0IGhhbmcKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCU5JQ0NoZWNrRm9ySGFuZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworVk9JRCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfU1RBX0ZJRk9fU1RSVUMJU3RhRmlmbzsKKwlNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnk7CisJVUNIQVIJCQkJaSA9IDA7CisJVUNIQVIJCQlwaWQgPSAwLCB3Y2lkID0gMDsKKwlDSEFSCQkJCXJlVHJ5OworCVVDSEFSCQkJCXN1Y2NNQ1M7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZSAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCQlkbworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9GSUZPLCAmU3RhRmlmby53b3JkKTsKKworCQkJaWYgKFN0YUZpZm8uZmllbGQuYlZhbGlkID09IDApCisJCQkJYnJlYWs7CisKKwkJCXdjaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC53Y2lkOworCisKKwkJLyogaWdub3JlIE5vQUNLIGFuZCBNR01UIGZyYW1lIHVzZSAweEZGIGFzIFdDSUQgKi8KKwkJCWlmICgoU3RhRmlmby5maWVsZC5UeEFja1JlcXVpcmVkID09IDApIHx8ICh3Y2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKKwkJCXsKKwkJCQlpKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFBJRCBzdG9yZSBUeCBNQ1MgUmF0ZSAqLworCQkJcGlkID0gKFVDSEFSKVN0YUZpZm8uZmllbGQuUGlkVHlwZTsKKworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07CisKKwkJCXBFbnRyeS0+RGVidWdGSUZPQ291bnQrKzsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhCRikgLy8gMyozCisJCQkJcEVudHJ5LT5UeEJGQ291bnQrKzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKKwkJCVVBUFNEX1NQX0FVRV9IYW5kbGUocEFkLCBwRW50cnksIFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKTsKKyNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCisKKwkJCWlmICghU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCisJCQl7CisJCQkJcEVudHJ5LT5GSUZPQ291bnQrKzsKKwkJCQlwRW50cnktPk9uZVNlY1R4RmFpbENvdW50Kys7CisKKwkJCQlpZiAocEVudHJ5LT5GSUZPQ291bnQgPj0gMSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiMiKSk7CisjaWYgMAorCQkJCQlTZW5kUmVmcmVzaEJBUihwQWQsIHBFbnRyeSk7CisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPSA2NDsKKyNlbHNlCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPSA2NDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQlpZihwRW50cnktPlBzTW9kZSA9PSBQV1JfQUNUSVZFKQorCQkJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCQlpbnQgdGlkOworCQkJCQkJZm9yICh0aWQ9MDsgdGlkPE5VTV9PRl9USUQ7IHRpZCsrKQorCQkJCQkJeworCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsICB0aWQsIEZBTFNFLCBGQUxTRSk7CisJCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJCS8vIFVwZGF0ZSB0aGUgY29udGludW91cyB0cmFuc21pc3Npb24gY291bnRlciBleGNlcHQgUFMgbW9kZQorCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCsrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gQ2xlYXIgdGhlIEZJRk9Db3VudCB3aGVuIHN0YSBpbiBQb3dlciBTYXZlIG1vZGUuIEJhc2ljYWxseSB3ZSBhc3N1bWUKKwkJCQkJCS8vICAgICB0aGlzIHR4IGVycm9yIGhhcHBlbmVkIGR1ZSB0byBzdGEganVzdCBnbyB0byBzbGVlcC4KKwkJCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQkJCQl9CisjZW5kaWYKKwkJCQkJLy9wRW50cnktPkZJRk9Db3VudCA9IDA7CisJCQkJfQorCQkJCS8vcEVudHJ5LT5iU2VuZEJBUiA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKChwRW50cnktPlBzTW9kZSAhPSBQV1JfU0FWRSkgJiYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPiAwKSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24tLTsKKwkJCQkJaWYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd249PTApCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkBcbiIpKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7CisJCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7CisJCQkJLy8gdXBkYXRlIE5vRGF0YUlkbGVDb3VudCB3aGVuIHN1Y2Vzc2Z1bCBzZW5kIHBhY2tldCB0byBTVEEuCisJCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQkJfQorCisJCQlzdWNjTUNTID0gU3RhRmlmby5maWVsZC5TdWNjZXNzUmF0ZSAmIDB4N0Y7CisKKwkJCXJlVHJ5ID0gcGlkIC0gc3VjY01DUzsKKworCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQorCQkJeworCQkJCXBFbnRyeS0+VFhNQ1NFeHBlY3RlZFtwaWRdKys7CisJCQkJaWYgKHBpZCA9PSBzdWNjTUNTKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5UWE1DU1N1Y2Nlc3NmdWxbcGlkXSsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwRW50cnktPlRYTUNTQXV0b0ZhbGxCYWNrW3BpZF1bc3VjY01DU10rKzsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEVudHJ5LT5UWE1DU0ZhaWxlZFtwaWRdKys7CisJCQl9CisKKwkJCWlmIChyZVRyeSA+IDApCisJCQl7CisJCQkJaWYgKChwaWQgPj0gMTIpICYmIHN1Y2NNQ1MgPD03KQorCQkJCXsKKwkJCQkJcmVUcnkgLT0gNDsKKwkJCQl9CisJCQkJcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSByZVRyeTsKKwkJCX0KKworCQkJaSsrOworCQkJLy8gQVNJQyBzdG9yZSAxNiBzdGFjaworCQl9IHdoaWxlICggaSA8ICgyKlRYX1JJTkdfU0laRSkgKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBzdGF0aXN0aWNhbCBjb3VudGVycyBmcm9tIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgcmVjb3JkIHRoZW0KKwkJaW4gc29mdHdhcmUgdmFyaWFibGVzIGZvciBsYXRlciBvbiBxdWVyeQorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQzMglPbGRWYWx1ZTsKKwlSWF9TVEFfQ05UMF9TVFJVQwkgUnhTdGFDbnQwOworCVJYX1NUQV9DTlQxX1NUUlVDICAgUnhTdGFDbnQxOworCVJYX1NUQV9DTlQyX1NUUlVDICAgUnhTdGFDbnQyOworCVRYX1NUQV9DTlQwX1NUUlVDIAkgVHhTdGFDbnQwOworCVRYX1NUQV9DTlQxX1NUUlVDCSBTdGFUeDE7CisJVFhfU1RBX0NOVDJfU1RSVUMJIFN0YVR4MjsKKwlUWF9BR0dfQ05UX1NUUlVDCVR4QWdnQ250OworCVRYX0FHR19DTlQwX1NUUlVDCVR4QWdnQ250MDsKKwlUWF9BR0dfQ05UMV9TVFJVQwlUeEFnZ0NudDE7CisJVFhfQUdHX0NOVDJfU1RSVUMJVHhBZ2dDbnQyOworCVRYX0FHR19DTlQzX1NUUlVDCVR4QWdnQ250MzsKKwlUWF9BR0dfQ05UNF9TVFJVQwlUeEFnZ0NudDQ7CisJVFhfQUdHX0NOVDVfU1RSVUMJVHhBZ2dDbnQ1OworCVRYX0FHR19DTlQ2X1NUUlVDCVR4QWdnQ250NjsKKwlUWF9BR0dfQ05UN19TVFJVQwlUeEFnZ0NudDc7CisKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZSeFN0YUNudDAud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJlJ4U3RhQ250Mi53b3JkKTsKKworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJlJ4U3RhQ250MS53b3JkKTsKKwkgICAgLy8gVXBkYXRlIFJYIFBMQ1AgZXJyb3IgY291bnRlcgorCSAgICBwQWQtPlByaXZhdGVJbmZvLlBoeVJ4RXJyQ250ICs9IFJ4U3RhQ250MS5maWVsZC5QbGNwRXJyOworCQkvLyBVcGRhdGUgRmFsc2UgQ0NBIGNvdW50ZXIKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCArPSBSeFN0YUNudDEuZmllbGQuRmFsc2VDY2E7CisJfQorCisJLy8gVXBkYXRlIEZDUyBjb3VudGVycworCU9sZFZhbHVlPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydDsKKwlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCArPSAoUnhTdGFDbnQwLmZpZWxkLkNyY0Vycik7IC8vID4+IDcpOworCWlmIChwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQorCQlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIEFkZCBGQ1MgZXJyb3IgY291bnQgdG8gcHJpdmF0ZSBjb3VudGVycworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlPbGRWYWx1ZSA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIFVwZGF0ZSBEdXBsaWNhdGUgUmN2IGNoZWNrCisJcEFkLT5SYWxpbmtDb3VudGVycy5EdXBsaWNhdGVSY3YgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCS8vIFVwZGF0ZSBSWCBPdmVyZmxvdyBjb3VudGVyCisJcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciArPSAoUnhTdGFDbnQyLmZpZWxkLlJ4Rmlmb092ZXJmbG93Q291bnQpOworCisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgPSAwOworI2lmZGVmIFJUMjg3MAorCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgIT0gcEFkLT53YXRjaERvZ1J4Q250KQorCXsKKwkJcEFkLT53YXRjaERvZ1J4Q250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50OworCQlwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA9IDA7CisJfQorCWVsc2UKKwl7CisJCWlmIChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCkKKwkJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250Kys7CisJCWVsc2UKKwkJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworCS8vaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpIHx8CisJLy8JKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgJiYgKHBBZC0+TWFjVGFiLlNpemUgIT0gMSkpKQorCWlmICghcEFkLT5iVXBkYXRlQmNuQ250RG9uZSkKKwl7CisJLy8gVXBkYXRlIEJFQUNPTiBzZW50IGNvdW50CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZTdGFUeDIud29yZCk7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNCZWFjb25TZW50Q250ICs9IFR4U3RhQ250MC5maWVsZC5UeEJlYWNvbkNvdW50OworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCX0KKworI2lmIDAKKwlSZXRyeSA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJRmFpbCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwlUeEVycm9yUmF0aW8gPSAwOworCU9uZVNlY1RyYW5zbWl0Q291bnQgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0LSBwQWQtPldsYW5Db3VudGVycy5MYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydDsKKwlpZiAoKE9uZVNlY1RyYW5zbWl0Q291bnQrUmV0cnkgKyBGYWlsKSA+IDApCisJCVR4RXJyb3JSYXRpbyA9ICgoIFJldHJ5ICsgRmFpbCkgKjEwMCkgLyAoT25lU2VjVHJhbnNtaXRDb3VudCtSZXRyeSArIEZhaWwpOworCisJaWYgKChPbmVTZWNUcmFuc21pdENvdW50K1JldHJ5ICsgRmFpbCkgPiAwKQorCQlUeEVycm9yUmF0aW8gPSAoKCBSZXRyeSArIEZhaWwpICoxMDApIC8gKE9uZVNlY1RyYW5zbWl0Q291bnQrUmV0cnkgKyBGYWlsKTsKKwlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoIlRYIEVSUk9SIFJhdGUgPSAlbGQgJSUsIFJldHJ5ID0gJWxkLCBGYWlsID0gJWxkLCBUb3RhbCA9ICVsZCAgXG4iLFR4RXJyb3JSYXRpbywgUmV0cnksIEZhaWwsIChPbmVTZWNUcmFuc21pdENvdW50K1JldHJ5ICsgRmFpbCkpKTsKKwlwQWQtPldsYW5Db3VudGVycy5MYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQ7CisjZW5kaWYKKworCS8vaWYgKHBBZC0+YlN0YUZpZm9UZXN0ID09IFRSVUUpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQsICZUeEFnZ0NudC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMCwgJlR4QWdnQ250MC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMSwgJlR4QWdnQ250MS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMiwgJlR4QWdnQ250Mi53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMywgJlR4QWdnQ250My53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNCwgJlR4QWdnQ250NC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNSwgJlR4QWdnQ250NS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNiwgJlR4QWdnQ250Ni53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNywgJlR4QWdnQ250Ny53b3JkKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMU1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzJNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzNNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c0TVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNU1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzZNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzdNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c4TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnOU1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzEwTVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTFNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTJNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTNNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTRNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNU1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNk1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50IC8gMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudCAvIDMpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50IC8gNCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudCAvIDUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50IC8gNik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudCAvIDcpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50IC8gOCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudCAvIDEwKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudCAvIDExKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQgLyAxMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQgLyAxMyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudCAvIDE2KTsKKwl9CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwl7CisJCVJ0bXBEaWFnU3RydWN0CSpwRGlhZzsKKwkJQ09VTlRFUl9SQUxJTksJKnBSYWxpbmtDb3VudGVyczsKKwkJVUNIQVIJCQlBcnJheUN1cklkeCwgaTsKKworCQlwRGlhZyA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisJCXBSYWxpbmtDb3VudGVycyA9ICZwQWQtPlJhbGlua0NvdW50ZXJzOworCQlBcnJheUN1cklkeCA9IHBEaWFnLT5BcnJheUN1cklkeDsKKworCQlpZiAocERpYWctPmluaXRlZCA9PSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGlhZywgc2l6ZW9mKHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfKSk7CisJCQlwRGlhZy0+QXJyYXlTdGFydElkeCA9IHBEaWFnLT5BcnJheUN1cklkeCA9IDA7CisJCQlwRGlhZy0+aW5pdGVkID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFR4CisJCQlwRGlhZy0+VHhGYWlsQ250W0FycmF5Q3VySWR4XSA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBEaWFnLT5UeEFnZ0NudFtBcnJheUN1cklkeF0gPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OworCQkJcERpYWctPlR4Tm9uQWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMF0gPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzJdID0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bM10gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs0XSA9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzVdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNl0gPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs3XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzhdID0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOV0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTBdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzExXSA9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMl0gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTNdID0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE0XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxNV0gPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCisJCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlDdXJJZHgsICBESUFHTk9TRV9USU1FKTsKKwkJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OworCQkJZm9yIChpID0wOyBpIDwgOTsgaSsrKQorCQkJeworCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldPSAwOworCQkJCXBEaWFnLT5UeFNXUXVlQ250W0FycmF5Q3VySWR4XVtpXSA9MDsKKwkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCX0KKwkJCXBEaWFnLT5UeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gID0gMDsKKy8vCQkJZm9yIChpID0gOTsgaSA8IDE2OyBpKyspCisJCQlmb3IgKGkgPSA5OyBpIDwgMjQ7IGkrKykgLy8gMyozCisJCQl7CisJCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworfQorCisJCQlpZiAocERpYWctPkFycmF5Q3VySWR4ID09IHBEaWFnLT5BcnJheVN0YXJ0SWR4KQorCQkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheVN0YXJ0SWR4LCAgRElBR05PU0VfVElNRSk7CisJCX0KKworCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBmcm9tIGVycm9yCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCQlSZXNldCBOSUMgZnJvbSBlcnJvciBzdGF0ZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNSZXNldEZyb21FcnJvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQCisJLy8gVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAKKwkvLyBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgxKTsKKwkvLyBSZW1vdmUgQVNJQyBmcm9tIHJlc2V0IHN0YXRlCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOworCisJTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBGQUxTRSk7CisJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7CisKKwkvLyBTd2l0Y2ggdG8gY3VycmVudCBjaGFubmVsLCBzaW5jZSBkdXJpbmcgcmVzZXQgcHJvY2VzcywgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHJlbWFpbnMgb24uCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWVyYXNlIDgwNTEgZmlybXdhcmUgaW1hZ2UgaW4gTUFDIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE5JQ0VyYXNlRmlybXdhcmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcgaTsKKworCWZvcihpPTA7IGk8TUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkU7IGkrPTQpCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCAwKTsKKworfS8qIEVuZCBvZiBOSUNFcmFzZUZpcm13YXJlICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlMb2FkIDgwNTEgZmlybXdhcmUgUlQyNTYxLkJJTiBmaWxlIGludG8gTUFDIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyNpZmRlZiBCSU5fSU5fRklMRQorI2RlZmluZSBOSUNMRl9ERUZBVUxUX1VTRSgpCVwKKwlmbGdfZGVmYXVsdF9maXJtX3VzZSA9IFRSVUU7IFwKKwlwcmludGsoIiVzIC0gVXNlIGRlZmF1bHQgZmlybXdhcmUhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJUFVDSEFSCQkJc3JjOworCXN0cnVjdCBmaWxlCQkqc3JjZjsKKwlJTlQgCQkJcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQsIGk7CisgICAJbW1fc2VnbWVudF90CW9yZ2ZzOworCVBVQ0hBUgkJCXBGaXJtd2FyZUltYWdlOworCVVJTlQJCQlGaWxlTGVuZ3RoID0gMDsKKwlVSU5UMzIJCQlNYWNSZWc7CisJVUxPTkcJCQlJbmRleDsKKwlVTE9ORwkJCWZpcm07CisJQk9PTEVBTgkJCWZsZ19kZWZhdWx0X2Zpcm1fdXNlID0gRkFMU0U7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCisJLyogaW5pdCAqLworCXBGaXJtd2FyZUltYWdlID0gTlVMTDsKKwlzcmMgPSBSVE1QX0ZJUk1XQVJFX0ZJTEVfTkFNRTsKKworCS8qIHNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCisJICAgc2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpICovCisJb3JnZnN1aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlvcmdmc2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+ZnNnaWQgPSAwOworICAgIG9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwlwQWQtPkZpcm13YXJlVmVyc2lvbiA9IChGSVJNV0FSRV9NQUpPUl9WRVJTSU9OIDw8IDgpICsgXAorCQkJCQkJICAgRklSTVdBUkVfTUlOT1JfVkVSU0lPTjsKKworCisJLyogYWxsb2NhdGUgZmlybXdhcmUgYnVmZmVyICovCisgICAgcEZpcm13YXJlSW1hZ2UgPSBrbWFsbG9jKE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgaWYgKHBGaXJtd2FyZUltYWdlID09IE5VTEwpCisJeworCQkvKiBhbGxvY2F0ZSBmYWlsLCB1c2UgZGVmYXVsdCBmaXJtd2FyZSBhcnJheSBpbiBmaXJtd2FyZS5oICovCisJCXByaW50aygiJXMgLSBBbGxvY2F0ZSBtZW1vcnkgZmFpbCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisgICAgfQorCWVsc2UKKwl7CisJCS8qIGFsbG9jYXRlIG9rISB6ZXJvIHRoZSBmaXJtd2FyZSBidWZmZXIgKi8KKwkJbWVtc2V0KHBGaXJtd2FyZUltYWdlLCAweDAwLCBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworCisJLyogaWYgb2ssIHJlYWQgZmlybXdhcmUgZmlsZSBmcm9tICouYmluIGZpbGUgKi8KKwlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gRkFMU0UpCisJeworCQlkbworCQl7CisJCQkvKiBvcGVuIHRoZSBiaW4gZmlsZSAqLworCQkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKworCQkJaWYgKElTX0VSUihzcmNmKSkKKwkJCXsKKwkJCQlwcmludGsoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCS8qIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QgKi8KKwkJCWlmICgoc3JjZi0+Zl9vcCA9PSBOVUxMKSB8fCAoc3JjZi0+Zl9vcC0+cmVhZCA9PSBOVUxMKSkKKwkJCXsKKwkJCQlwcmludGsoIiVzIC0gJXMgZG9lcyBub3QgaGF2ZSBhIHdyaXRlIG1ldGhvZFxuIiwgX19GVU5DVElPTl9fLCBzcmMpOworCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJYnJlYWs7CisJCQl9IC8qIEVuZCBvZiBpZiAqLworCisJCQkvKiByZWFkIHRoZSBmaXJtd2FyZSBmcm9tIHRoZSBmaWxlICouYmluICovCisJCQlGaWxlTGVuZ3RoID0gc3JjZi0+Zl9vcC0+cmVhZChzcmNmLAorCQkJCQkJCQkJCSAgcEZpcm13YXJlSW1hZ2UsCisJCQkJCQkJCQkJICBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSwKKwkJCQkJCQkJCQkgICZzcmNmLT5mX3Bvcyk7CisKKwkJCWlmIChGaWxlTGVuZ3RoICE9IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKQorCQkJeworCQkJCXByaW50aygiJXM6IGVycm9yIGZpbGUgbGVuZ3RoICg9JWQpIGluIFJUMjg2MEFQLkJJTlxuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCBGaWxlTGVuZ3RoKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVBVQ0hBUiBwdHIgPSBwRmlybXdhcmVJbWFnZTsKKwkJCQlVU0hPUlQgY3JjID0gMHhmZmZmOworCisKKwkJCQkvKiBjYWxjdWxhdGUgZmlybXdhcmUgQ1JDICovCisJCQkJZm9yKGk9MDsgaTwoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMik7IGkrKywgcHRyKyspCisJCQkJCWNyYyA9IEJ5dGVDUkMxNihCaXRSZXZlcnNlKCpwdHIpLCBjcmMpOworCQkJCS8qIEVuZCBvZiBmb3IgKi8KKworCQkJCWlmICgocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMl0gIT0gXAorCQkJCQkJCQkoVUNIQVIpQml0UmV2ZXJzZSgoVUNIQVIpKGNyYz4+OCkpKSB8fAorCQkJCQkocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0gIT0gXAorCQkJCQkJCQkoVUNIQVIpQml0UmV2ZXJzZSgoVUNIQVIpY3JjKSkpCisJCQkJeworCQkJCQkvKiBDUkMgZmFpbCAqLworCQkJCQlwcmludGsoIiVzOiBDUkMgPSAweCUwMnggMHglMDJ4ICIKKwkJCQkJCSAgICJlcnJvciwgc2hvdWxkIGJlIDB4JTAyeCAweCUwMnhcbiIsCisJCQkJCQkgICBfX0ZVTkNUSU9OX18sCisJCQkJCQkgICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSwKKwkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTFdLAorCQkJCQkJICAgKFVDSEFSKShjcmM+PjgpLCAoVUNIQVIpKGNyYykpOworCQkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogZmlybXdhcmUgaXMgb2sgKi8KKwkJCQkJcEFkLT5GaXJtd2FyZVZlcnNpb24gPSBcCisJCQkJCQkocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtNF0gPDwgOCkgKworCQkJCQkJcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM107CisKKwkJCQkJLyogY2hlY2sgaWYgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgZmlsZSBpcyB0b28gb2xkICovCisJCQkJCWlmICgocEFkLT5GaXJtd2FyZVZlcnNpb24pIDwgXAorCQkJCQkJCQkJCQkoKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKworCQkJCQkJCQkJICAJIAkgRklSTVdBUkVfTUlOT1JfVkVSU0lPTikpCisJCQkJCXsKKwkJCQkJCXByaW50aygiJXM6IGZpcm13YXJlIHZlcnNpb24gdG9vIG9sZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCQkJYnJlYWs7CisJCQkJCX0gLyogRW5kIG9mIGlmICovCisJCQkJfSAvKiBFbmQgb2YgaWYgKi8KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiTklDTG9hZEZpcm13YXJlOiBDUkMgb2ssIHZlcj0lZC4lZFxuIiwKKwkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtNF0sCisJCQkJCQkgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTNdKSk7CisJCQl9IC8qIEVuZCBvZiBpZiAoRmlsZUxlbmd0aCA9PSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSkgKi8KKwkJCWJyZWFrOworCQl9IHdoaWxlKFRSVUUpOworCisJCS8qIGNsb3NlIGZpcm13YXJlIGZpbGUgKi8KKwkJaWYgKElTX0VSUihzcmNmKSkKKwkJCTsKKwkJZWxzZQorCQl7CisJCQlyZXR2YWwgPSBmaWxwX2Nsb3NlKHNyY2YsIE5VTEwpOworCQkJaWYgKHJldHZhbCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCSAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKKwkJCX0gLyogRW5kIG9mIGlmICovCisJCX0gLyogRW5kIG9mIGlmICovCisJfSAvKiBFbmQgb2YgaWYgKi8KKworCisJLyogd3JpdGUgZmlybXdhcmUgdG8gQVNJQyAqLworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBUUlVFKQorCXsKKwkJLyogdXNlIGRlZmF1bHQgZmltZXdhcmUsIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlciAqLworCQlpZiAocEZpcm13YXJlSW1hZ2UgIT0gTlVMTCkKKwkJCWtmcmVlKHBGaXJtd2FyZUltYWdlKTsKKwkJLyogRW5kIG9mIGlmICovCisKKwkJLyogdXNlIGRlZmF1bHQgKi5iaW4gYXJyYXkgKi8KKwkJcEZpcm13YXJlSW1hZ2UgPSBGaXJtd2FyZUltYWdlOworCQlGaWxlTGVuZ3RoID0gc2l6ZW9mKEZpcm13YXJlSW1hZ2UpOworCX0gLyogRW5kIG9mIGlmICovCisKKwkvKiBlbmFibGUgSG9zdCBwcm9ncmFtIHJhbSB3cml0ZSBzZWxlY3Rpb24gKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MTAwMDApOworCisJZm9yKGk9MDsgaTxGaWxlTGVuZ3RoOyBpKz00KQorCXsKKwkJZmlybSA9IHBGaXJtd2FyZUltYWdlW2ldICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzNdIDw8IDI0KSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSsyXSA8PCAxNikgKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMV0gPDwgOCk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIGksIGZpcm0pOworCX0gLyogRW5kIG9mIGZvciAqLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAwKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDEpOworCisJLyogaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudCAqLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9CQlBfQUdFTlQsIDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CisKKwlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gRkFMU0UpCisJeworCQkvKiB1c2UgZmlsZSBmaXJtd2FyZSwgZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJCWlmIChwRmlybXdhcmVJbWFnZSAhPSBOVUxMKQorCQkJa2ZyZWUocEZpcm13YXJlSW1hZ2UpOworCQkvKiBFbmQgb2YgaWYgKi8KKwl9IC8qIEVuZCBvZiBpZiAqLworCisJc2V0X2ZzKG9yZ2ZzKTsKKwljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisjZWxzZQorCisJTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7CisJVUxPTkcJCQlGaWxlTGVuZ3RoLCBJbmRleDsKKwkvL1VMT05HCQkJZmlybTsKKwlVSU5UMzIJCQlNYWNSZWcgPSAwOworI2lmZGVmIFJUMjg3MAorCVVJTlQzMgkJCVZlcnNpb24gPSAocEFkLT5NQUNWZXJzaW9uID4+IDE2KTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKKwlGaWxlTGVuZ3RoID0gc2l6ZW9mKEZpcm13YXJlSW1hZ2UpOworI2lmZGVmIFJUMjg3MAorCS8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKKwkvL3ByaW50aygiVXNiIENoaXBcbiIpOworCWlmIChGSVJNV0FSRUlNQUdFX0xFTkdUSCA9PSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEgpCisJLy9UaGUgZmlybXdhcmUgaW1hZ2UgY29uc2lzdHMgb2YgdHdvIHBhcnRzLiBPbmUgaXMgdGhlIG9yaWdpYW5sIGFuZCB0aGUgb3RoZXIgaXMgdGhlIG5ldy4KKwkvL1VzZSBTZWNvbmQgUGFydAorCXsKKwkJaWYgKChWZXJzaW9uICE9IDB4Mjg2MCkgJiYgKFZlcnNpb24gIT0gMHgyODcyKSAmJiAoVmVyc2lvbiAhPSAweDMwNzApKQorCQl7CS8vIFVzZSBGaXJtd2FyZSBWMi4KKwkJCS8vcHJpbnRrKCJLSDpVc2UgTmV3IFZlcnNpb24scGFydDJcbiIpOworCQkJcEZpcm13YXJlSW1hZ2UgPSAoUFVDSEFSKSZGaXJtd2FyZUltYWdlW0ZJUk1XQVJFSU1BR0VWMV9MRU5HVEhdOworCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VWMl9MRU5HVEg7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvL3ByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQxXG4iKTsKKwkJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKKwkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RIOworCQl9CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktIOiBiaW4gZmlsZSBzaG91bGQgYmUgOEtCLlxuIikpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWYgMAorCS8qIGVuYWJsZSBIb3N0IHByb2dyYW0gcmFtIHdyaXRlIHNlbGVjdGlvbiAqLworCVJUMjhYWF9GSVJNVURfSU5JVChwQWQpOworCisJZm9yKGk9MDsgaTxGaWxlTGVuZ3RoOyBpKz00KQorCXsKKwkJZmlybSA9IHBGaXJtd2FyZUltYWdlW2ldICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzNdIDw8IDI0KSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSsyXSA8PCAxNikgKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMV0gPDwgOCk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIGksIGZpcm0pOworCX0gLyogRW5kIG9mIGZvciAqLworCisJUlQyOFhYX0ZJUk1VRF9FTkQocEFkKTsKKyNlbHNlCisJUlQyOFhYX1dSSVRFX0ZJUk1XQVJFKHBBZCwgcEZpcm13YXJlSW1hZ2UsIEZpbGVMZW5ndGgpOworI2VuZGlmCisKKyNlbmRpZgorCisJLyogY2hlY2sgaWYgTUNVIGlzIHJlYWR5ICovCisJSW5kZXggPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJk1hY1JlZyk7CisKKwkJaWYgKE1hY1JlZyAmIDB4ODApCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX0gd2hpbGUgKEluZGV4KysgPCAxMDAwKTsKKworICAgIGlmIChJbmRleCA+PSAxMDAwKQorCXsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTklDTG9hZEZpcm13YXJlOiBNQ1UgaXMgbm90IHJlYWR5XG5cblxuIikpOworCX0gLyogRW5kIG9mIGlmICovCisKKyNpZiAwCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8PT09ICVzIChzcmM9JXMsIHN0YXR1cz0lZClcbiIsIF9fRlVOQ1RJT05fXywgc3JjLCBTdGF0dXMpKTsKKyNlbHNlCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFN0YXR1cykpOworI2VuZGlmCisgICAgcmV0dXJuIFN0YXR1czsKK30gLyogRW5kIG9mIE5JQ0xvYWRGaXJtd2FyZSAqLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlMb2FkIFR4IHJhdGUgc3dpdGNoaW5nIHBhcmFtZXRlcnMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCVJhdGUgVGFibGUgRm9ybWF0OgorCQkxLiAoQjA6IFZhbGlkIEl0ZW0gbnVtYmVyKSAoQjE6SW5pdGlhbCBpdGVtIGZyb20gemVybykKKwkJMi4gSXRlbSBOdW1iZXIoRGVjKSAgICAgIE1vZGUoSGV4KSAgICAgQ3VycmVudCBNQ1MoRGVjKSAgICBUcmFpblVwKERlYykgICAgVHJhaW5Eb3duKERlYykKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworI2lmIDAKKwlORElTX1NUQVRVUyBTdGF0dXM7CisKKwlORElTX0hBTkRMRSBGaWxlSGFuZGxlOworCVVJTlQgRmlsZUxlbmd0aCA9IDAsIGksIGo7CisJUFVDSEFSIHBGaXJtd2FyZUltYWdlOworCU5ESVNfU1RSSU5HIEZpbGVOYW1lOworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBIaWdoZXN0QWNjZXB0YWJsZU1heCA9IE5ESVNfUEhZU0lDQUxfQUREUkVTU19DT05TVCgtMSwgLTEpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT0+IE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zIFxuIikpOworCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSA9IDA7CisKKwlpZiAoKHBBZC0+RGV2aWNlSUQgPT0gTklDMjg2MF9QQ0lfREVWSUNFX0lEKSB8fCAocEFkLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKSkKKwl7CisJCU5kaXNJbml0aWFsaXplU3RyaW5nKCZGaWxlTmFtZSwicmF0ZS5iaW4iKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXM6IGxvYWQgZmlsZSAtIHJhdGUuYmluIGZvciB0eCByYXRlIHN3aXRjaCBcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXM6IHdyb25nIERldmljZUlEID0gMHglMDR4LCBjYW4ndCBmaW5kIFR4IHJhdGUgc3dpdGNoIHBhcmFtZXRlcnMgZmlsZVxuIiwgcEFkLT5EZXZpY2VJRCkpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisJTmRpc09wZW5GaWxlKCZTdGF0dXMsICZGaWxlSGFuZGxlLCAmRmlsZUxlbmd0aCwgJkZpbGVOYW1lLCBIaWdoZXN0QWNjZXB0YWJsZU1heCk7CisJTmRpc0ZyZWVTdHJpbmcoRmlsZU5hbWUpOworCisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXM6IE5kaXNPcGVuRmlsZSgpIGZhaWxlZCwgdXNlZCBSYXRlU3dpdGNoVGFibGUgaW5zdGVhZFxuIikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlpZiAoKEZpbGVMZW5ndGggPT0gMCkgfHwgKEZpbGVMZW5ndGggPiAoTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0grMSkqMTYpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXM6IGZpbGUgc2l6ZSBpcyBub3QgcmVhc29uYWJsZSwgdXNlZCBSYXRlU3dpdGNoVGFibGUgaW5zdGVhZFxuIikpOworCisJCU5kaXNDbG9zZUZpbGUoRmlsZUhhbmRsZSk7CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBORElTX1NUQVRVU19TVUNDRVNTIG1lYW5zCisJCS8vIFRoZSBoYW5kbGUgYXQgRmlsZUhhbmRsZSBpcyB2YWxpZCBmb3IgYSBzdWJzZXF1ZW50IGNhbGwgdG8gTmRpc01hcEZpbGUuCisJCS8vCisJCU5kaXNNYXBGaWxlKCZTdGF0dXMsICZwRmlybXdhcmVJbWFnZSwgRmlsZUhhbmRsZSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5kaXNNYXBGaWxlIEZpbGVMZW5ndGg9JWRcbiIsIEZpbGVMZW5ndGgpKTsKKwl9CisKKwlmb3IgKGk9MCwgaj0wOyBpPEZpbGVMZW5ndGg7IGkrKykKKwl7CisJCWlmICgoaSUxNikgPD0gNCkJLy8gdHJpbSByZXNlcnZlZCBmaWVsZAorCQl7CisJCQlpZiAoaSUxNiA9PSAxKQkvLyBkZWFsIHdpdGggREVDIGFuZCBIRVgsIG9ubHkgcm93MCBpcyBIZXgsIG90aGVycyBhcmUgRGVjCisJCQl7CisJCQkJUmF0ZVN3aXRjaFRhYmxlW2pdID0gKihwRmlybXdhcmVJbWFnZSArIGkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJhdGVTd2l0Y2hUYWJsZVtqXSA9ICgqKHBGaXJtd2FyZUltYWdlICsgaSk+PjQpICogMTAgKyAoKihwRmlybXdhcmVJbWFnZSArIGkpICYgMHgwRik7CisJCQl9CisKKwkJCWorKzsKKwkJfQorCX0KKworCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZVswXTsJCS8vIGJhY2t1cCB0YWJsZSBzaXplCisKKwlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlOZGlzVW5tYXBGaWxlKEZpbGVIYW5kbGUpOworCQlOZGlzQ2xvc2VGaWxlKEZpbGVIYW5kbGUpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPD09PSBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhWYWxpZCBUeFJhdGVUYWJsZSBpdGVtIG51bWJlcj0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSkpOworI2VuZGlmCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlpZiAgcFNyYzEgYWxsIHplcm8gd2l0aCBsZW5ndGggTGVuZ3RoLCByZXR1cm4gMC4KKwkJSWYgbm90IGFsbCB6ZXJvLCByZXR1cm4gMQorCisJQXJndW1lbnRzOgorCQlwU3JjMQorCisJUmV0dXJuIFZhbHVlOgorCQkxOgkJCW5vdCBhbGwgemVybworCQkwOgkJCWFsbCB6ZXJvCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVTE9ORwlSVE1QTm90QWxsWmVybygKKwlJTglQVk9JRAlwU3JjMSwKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW0xOworCVVMT05HCUluZGV4ID0gMDsKKworCXBNZW0xID0gKFBVQ0hBUikgcFNyYzE7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlpZiAocE1lbTFbSW5kZXhdICE9IDB4MCkKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoSW5kZXggPT0gTGVuZ3RoKQorCXsKKwkJcmV0dXJuICgwKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuICgxKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb21wYXJlIHR3byBtZW1vcnkgYmxvY2sKKworCUFyZ3VtZW50czoKKwkJcFNyYzEJCVBvaW50ZXIgdG8gZmlyc3QgbWVtb3J5IGFkZHJlc3MKKwkJcFNyYzIJCVBvaW50ZXIgdG8gc2Vjb25kIG1lbW9yeSBhZGRyZXNzCisKKwlSZXR1cm4gVmFsdWU6CisJCTA6CQkJbWVtb3J5IGlzIGVxdWFsCisJCTE6CQkJcFNyYzEgbWVtb3J5IGlzIGxhcmdlcgorCQkyOgkJCXBTcmMyIG1lbW9yeSBpcyBsYXJnZXIKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HCVJUTVBDb21wYXJlTWVtb3J5KAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVBWT0lECXBTcmMyLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJUFVDSEFSCXBNZW0yOworCVVMT05HCUluZGV4ID0gMDsKKworCXBNZW0xID0gKFBVQ0hBUikgcFNyYzE7CisJcE1lbTIgPSAoUFVDSEFSKSBwU3JjMjsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCWlmIChwTWVtMVtJbmRleF0gPiBwTWVtMltJbmRleF0pCisJCQlyZXR1cm4gKDEpOworCQllbHNlIGlmIChwTWVtMVtJbmRleF0gPCBwTWVtMltJbmRleF0pCisJCQlyZXR1cm4gKDIpOworCX0KKworCS8vIEVxdWFsCisJcmV0dXJuICgwKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVplcm8gb3V0IG1lbW9yeSBibG9jaworCisJQXJndW1lbnRzOgorCQlwU3JjMQkJUG9pbnRlciB0byBtZW1vcnkgYWRkcmVzcworCQlMZW5ndGgJCVNpemUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBaZXJvTWVtb3J5KAorCUlOCVBWT0lECXBTcmMsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtOworCVVMT05HCUluZGV4ID0gMDsKKworCXBNZW0gPSAoUFVDSEFSKSBwU3JjOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJcE1lbVtJbmRleF0gPSAweDAwOworCX0KK30KKworVk9JRAlSVE1QRmlsbE1lbW9yeSgKKwlJTglQVk9JRAlwU3JjLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglVQ0hBUglGaWxsKQoreworCVBVQ0hBUglwTWVtOworCVVMT05HCUluZGV4ID0gMDsKKworCXBNZW0gPSAoUFVDSEFSKSBwU3JjOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJcE1lbVtJbmRleF0gPSBGaWxsOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvcHkgZGF0YSBmcm9tIG1lbW9yeSBibG9jayAxIHRvIG1lbW9yeSBibG9jayAyCisKKwlBcmd1bWVudHM6CisJCXBEZXN0CQlQb2ludGVyIHRvIGRlc3RpbmF0aW9uIG1lbW9yeSBhZGRyZXNzCisJCXBTcmMJCVBvaW50ZXIgdG8gc291cmNlIG1lbW9yeSBhZGRyZXNzCisJCUxlbmd0aAkJQ29weSBzaXplCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QTW92ZU1lbW9yeSgKKwlPVVQJUFZPSUQJcERlc3QsCisJSU4JUFZPSUQJcFNyYywKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW0xOworCVBVQ0hBUglwTWVtMjsKKwlVSU5UCUluZGV4OworCisJQVNTRVJUKChMZW5ndGg9PTApIHx8IChwRGVzdCAmJiBwU3JjKSk7CisKKwlwTWVtMSA9IChQVUNIQVIpIHBEZXN0OworCXBNZW0yID0gKFBVQ0hBUikgcFNyYzsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCXBNZW0xW0luZGV4XSA9IHBNZW0yW0luZGV4XTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIHBvcnQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVVzZXJDZmdJbml0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkKQoreworLy8JRURDQV9QQVJNIERlZmF1bHRFZGNhUGFybTsKKyAgICBVSU5UIGtleV9pbmRleCwgYnNzX2luZGV4OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFVzZXJDZmdJbml0XG4iKSk7CisKKwkvLworCS8vICBwYXJ0IEkuIGludGlhbGl6ZSBjb21tb24gY29uZmlndXJhdGlvbgorCS8vCisjaWZkZWYgUlQyODcwCisJcEFkLT5CdWxrT3V0UmVxID0gMDsKKworCXBBZC0+QnVsa091dENvbXBsZXRlID0gMDsKKwlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyID0gMDsKKwlwQWQtPkJ1bGtPdXRDb21wbGV0ZUNhbmNlbCA9IDA7CisJcEFkLT5CdWxrSW5SZXEgPSAwOworCXBBZC0+QnVsa0luQ29tcGxldGUgPSAwOworCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsID0gMDsKKworCS8vcEFkLT5RdWlja1RpbWVyUCA9IDEwMDsKKwkvL3BBZC0+VHVybkFnZ3JCdWxrSW5Db3VudCA9IDA7CisJcEFkLT5iVXNiVHhCdWxrQWdncmUgPSAwOworCisJLy8gaW5pdCBhcyB1bnNlZCB2YWx1ZSB0byBlbnN1cmUgZHJpdmVyIHdpbGwgc2V0IHRvIE1DVSBvbmNlLgorCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RkY7CisKKwlwQWQtPkNvbW1vbkNmZy5NYXhQa3RPbmVUeEJ1bGsgPSAyOworCXBBZC0+Q29tbW9uQ2ZnLlR4QnVsa0ZhY3RvciA9IDE7CisJcEFkLT5Db21tb25DZmcuUnhCdWxrRmFjdG9yID0xOworCisJcEFkLT5Db21tb25DZmcuVHhQb3dlciA9IDEwMDsgLy9tVworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtKSk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlmb3Ioa2V5X2luZGV4PTA7IGtleV9pbmRleDxTSEFSRV9LRVlfTlVNOyBrZXlfaW5kZXgrKykKKwl7CisJCWZvcihic3NfaW5kZXggPSAwOyBic3NfaW5kZXggPCBNQVhfTUJTU0lEX05VTTsgYnNzX2luZGV4KyspCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5LZXlMZW4gPSAwOworCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQl9CisJfQorCisJcEFkLT5BbnRlbm5hLndvcmQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCisJcEFkLT5MZWRDbnRsLndvcmQgPSAwOworCisJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwkJCS8vIERlZmF1bHQgaXMgT0ZGCisJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwkJCS8vIERlZmF1bHQgaXMgT0ZGCisJcEFkLT5SZkljVHlwZSA9IFJGSUNfMjgyMDsKKworCS8vIEluaXQgdGltZXIgZm9yIHJlc2V0IGNvbXBsZXRlIGV2ZW50CisJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAxOworCXBBZC0+YkZvcmNlUHJpbnRUWCA9IEZBTFNFOworCXBBZC0+YkZvcmNlUHJpbnRSWCA9IEZBTFNFOworCXBBZC0+YlN0YUZpZm9UZXN0ID0gRkFMU0U7CisJcEFkLT5iUHJvdGVjdGlvblRlc3QgPSBGQUxTRTsKKwlwQWQtPmJIQ0NBVGVzdCA9IEZBTFNFOworCXBBZC0+Ykdlbk9uZUhDQ0EgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOyAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCisJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAweGZmZmZmZmZmOyAvLyBBVVRPCisJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSAweGZmZmZmZmZmOyAvLyBBVVRPCisJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVBdXRvOyAvLyB1c2UgTG9uZyBwcmVhbWJsZSBvbiBUWCBieSBkZWZhdXQKKwlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gMjM0NzsKKwlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IDIzNDY7CisJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsgICAgLy8gMDogQVVUTworCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsgLy8wOworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOyAgICAgLy8gdW5rbm93bgorCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IDEwOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTQ291bnQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IDY1OworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSAzOworCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50ID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMDsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkJlYWNvblR4V0ksIHNpemVvZihwQWQtPkJlYWNvblR4V0kpKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKKwlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOworCXBBZC0+YkJyb2FkQ29tSFQgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbCA9IGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gNX4xMDAwCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZUR3ZWxsID0gZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsOwkvLyBVbml0IDogVFUuIDEwfjEwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgPSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbDsJLy8gVW5pdCA6IFNlY29uZAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbCA9IGRvdDExT0JTU1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjB+MTAwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvciA9IGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcjsKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlID0gZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQ7CS8vIFVuaXQgOiBwZXJjZW50YWdlCisJcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXkgPSAocEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpOworI2VuZGlmICAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsgLy8zMjsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXQuIEJBQ2FwYWJpbGl0eSA9IDB4JXhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7CisKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisJQkFUYWJsZUluaXQocEFkLCAmcEFkLT5CQVRhYmxlKTsKKworCXBBZC0+Q29tbW9uQ2ZnLmJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50ID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKKwlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7CisKKwlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IDc7CisKKwlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV82OworCisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE1DU19SQVRFXzY7CisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLkJXID0gQldfMjA7CisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisKKwlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAxMDA7ICAgICAvLyBpbiBtU2VjCisKKwkvLworCS8vIHBhcnQgSUkuIGludGlhbGl6ZSBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVJYX0ZJTFRFUl9TRVRfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX0RJUkVDVCk7CisJCVJYX0ZJTFRFUl9DTEVBUl9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfTVVMVElDQVNUKTsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfQlJPQURDQVNUKTsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfQUxMX01VTFRJQ0FTVCk7CisKKwkJcEFkLT5TdGFDZmcuUHNtID0gUFdSX0FDVElWRTsKKworCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOworCisJCS8vIDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gMDsKKwkJcEFkLT5TdGFDZmcuTWljRXJyQ250ICAgICAgICA9IDA7CisJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICAgICAgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgICAgICAgICA9IFNTX05PVFVTRTsKKworCQlwQWQtPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9IEZBTFNFOwkJLy8gTmV3IHRvIHN1cHBvcnQgbWljcm9zb2Z0IGRpc2FibGUgcmFkaW8gd2l0aCBPSUQgY29tbWFuZAorCisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHNpemVvZihSU1NJX1NBTVBMRSkpOworCQlwQWQtPlN0YUNmZy5Sc3NpVHJpZ2dlck1vZGUgPSBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRDsKKwkJcEFkLT5TdGFDZmcuQXRpbVdpbiA9IDA7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7Ly9kZWZhdWx0IGxpc3RlbiBjb3VudDsKKwkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsgIC8vIEJTU19JTkZSQSBvciBCU1NfQURIT0Mgb3IgQlNTX01PTklUT1IKKwkJcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCX0KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfTm9uZTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBnbG9iYWwgdmFyaWFibGVzIG1YWFhYIHVzZWQgaW4gTUFDIHByb3RvY29sIHN0YXRlIG1hY2hpbmVzCisJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKworCS8vIFBIWSBzcGVjaWZpY2F0aW9uCisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwkJLy8gZGVmYXVsdCBQSFkgbW9kZQorCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7ICAvLyBDQ0sgdXNlIExPTkcgcHJlYW1ibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyB1c2VyIGRlc2lyZWQgcG93ZXIgbW9kZQorCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQlwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID0gRkFMU0U7CisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJLy8gQ0NYIHYxLjAgcmVsZWF0ZWQgaW5pdCB2YWx1ZQorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihMZWFwQXV0aFRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwkJcEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID0gQ0lTQ09fQXV0aE1vZGVMRUFQTm9uZTsKKwkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKSwgcEFkLCBGQUxTRSk7CisJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IEZBTFNFOworCisJCS8vIFBhdGNoIGZvciBOZHRlc3QKKwkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7CisKKwkJLy8gQ0NYIDIuMCBjb250cm9sIGZsYWcgaW5pdAorCQlwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9IE1TUk5fVFlQRV9VTlVTRUQ7CisJCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01pbgk9IDQ7CisJCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01heAk9IDEwOworCisJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvICA9IFRSVUU7IC8vIERlZmF1bHQgSGFyZHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uCisJCXBBZC0+U3RhQ2ZnLmJTd1JhZGlvICA9IFRSVUU7IC8vIERlZmF1bHQgU29mdHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uCisJCXBBZC0+U3RhQ2ZnLmJSYWRpbyAgICA9IFRSVUU7IC8vIGJId1JhZGlvICYmIGJTd1JhZGlvCisJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CQkvLyBEZWZhdWx0IGlzIE9GRgorCQlwQWQtPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPSBGQUxTRTsJCS8vIERlZmF1bHQgbm8gc2hvdworCisJCS8vIE5pdHJvIG1vZGUgY29udHJvbAorCQlwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisKKwkJLy8gU2F2ZSB0aGUgaW5pdCB0aW1lIGFzIGxhc3Qgc2NhbiB0aW1lLCB0aGUgc3lzdGVtIHNob3VsZCBkbyBzY2FuIGFmdGVyIDIgc2Vjb25kcy4KKwkJLy8gVGhpcyBwYXRjaCBpcyBmb3IgZHJpdmVyIHdha2UgdXAgZnJvbSBzdGFuZGJ5IG1vZGUsIHN5c3RlbSB3aWxsIGRvIHNjYW4gcmlnaHQgYXdheS4KKwkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gMDsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUrMSk7CisJCXNwcmludGYocEFkLT5uaWNrbmFtZSwgIiVzIiwgU1RBX05JQ19ERVZJQ0VfTkFNRSk7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyksIHBBZCwgRkFMU0UpOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJcEFkLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRGVmYXVsdCBmb3IgZXh0cmEgaW5mb3JtYXRpb24gaXMgbm90IHZhbGlkCisJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworCisJLy8gRGVmYXVsdCBDb25maWcgY2hhbmdlIGZsYWcKKwlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7CisKKwkvLworCS8vIHBhcnQgSUlJLiBBUCBjb25maWd1cmF0aW9ucworCS8vCisKKworCS8vCisJLy8gcGFydCBJVi4gb3RoZXJzCisJLy8KKwkvLyBkeW5hbWljIEJCUCBSNjY6c2Vuc2liaXR5IHR1bmluZyB0byBvdmVyY29tZSBiYWNrZ3JvdW5kIG5vaXNlCisJcEFkLT5CYnBUdW5pbmcuYkVuYWJsZSAgICAgICAgICAgICAgICA9IFRSVUU7CisJcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FMb3dlclRocmVzaG9sZCA9IDEwMDsKKwlwQWQtPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkID0gNTEyOworCXBBZC0+QmJwVHVuaW5nLlI2NkRlbHRhICAgICAgICAgICAgICAgPSA0OworCXBBZC0+TWxtZS5iRW5hYmxlQXV0b0FudGVubmFDaGVjayA9IFRSVUU7CisKKwkvLworCS8vIEFsc28gaW5pdGlhbCBSNjZDdXJyZW50VmFsdWUsIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiBtaWdodCB1c2UgdGhpcyB2YWx1ZS4KKwkvLyBpZiBub3QgaW5pdGlhbCB0aGlzIHZhbHVlLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDAuCisJLy8KKwlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OworCisJcEFkLT5CYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCXBBZC0+QmJwRm9yQ0NLID0gRkFMU0U7CisKKwkvLyBEZWZhdWx0IGlzIEZBTFNFIGZvciB0ZXN0IGJpdCAxCisJLy9wQWQtPmJUZXN0MSA9IEZBTFNFOworCisJLy8gaW5pdGlhbGl6ZSBNQUMgdGFibGUgYW5kIGFsbG9jYXRlIHNwaW4gbG9jaworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1hY1RhYiwgc2l6ZW9mKE1BQ19UQUJMRSkpOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5NYWNUYWIuTWNhc3RQc1F1ZXVlKTsKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCS8vUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlJFQ0JBVGltZXIsIFJFQ0JBVGltZXJUaW1lb3V0LCBwQWQsIFRSVUUpOworCS8vUlRNUFNldFRpbWVyKCZwQWQtPlJFQ0JBVGltZXIsIFJFT1JERVJfRVhFQ19JTlRWKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5hdGUsIHNpemVvZihBVEVfSU5GTykpOworCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RPUDsKKwlwQWQtPmF0ZS5UeENvdW50ID0gMjAwOy8qIHRvIGV4Y2VlZCBUWF9SSU5HX1NJWkUgLi4uICovCisJcEFkLT5hdGUuVHhMZW5ndGggPSAxMDI0OworCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IDA7Ly8gTE9ORyBHSSA6IDgwMCBucworCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IE1PREVfQ0NLOworCXBBZC0+YXRlLlR4V0kuTUNTID0gMzsKKwlwQWQtPmF0ZS5UeFdJLkJXID0gQldfMjA7CisJcEFkLT5hdGUuQ2hhbm5lbCA9IDE7CisJcEFkLT5hdGUuUUlEID0gUUlEX0FDX0JFOworCXBBZC0+YXRlLkFkZHIxWzBdID0gMHgwMDsKKwlwQWQtPmF0ZS5BZGRyMVsxXSA9IDB4MTE7CisJcEFkLT5hdGUuQWRkcjFbMl0gPSAweDIyOworCXBBZC0+YXRlLkFkZHIxWzNdID0gMHhBQTsKKwlwQWQtPmF0ZS5BZGRyMVs0XSA9IDB4QkI7CisJcEFkLT5hdGUuQWRkcjFbNV0gPSAweENDOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+YXRlLkFkZHIyLCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPmF0ZS5BZGRyMywgcEFkLT5hdGUuQWRkcjEsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJcEFkLT5hdGUuYlJ4RmVyID0gMDsKKwlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKKwlwQWQtPmF0ZS5BdGVQaWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IEZBTFNFOworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gVXNlckNmZ0luaXRcbiIpKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VDSEFSIEJ0b0goY2hhciBjaCkKK3sKKwlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgcmV0dXJuIChjaCAtICcwJyk7ICAgICAgICAvLyBIYW5kbGUgbnVtZXJhbHMKKwlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgcmV0dXJuIChjaCAtICdBJyArIDB4QSk7ICAvLyBIYW5kbGUgY2FwaXRvbCBoZXggZGlnaXRzCisJaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHJldHVybiAoY2ggLSAnYScgKyAweEEpOyAgLy8gSGFuZGxlIHNtYWxsIGhleCBkaWdpdHMKKwlyZXR1cm4oMjU1KTsKK30KKworLy8KKy8vICBGVU5DVElPTjogQXRvSChjaGFyICosIFVDSEFSICosIGludCkKKy8vCisvLyAgUFVSUE9TRTogIENvbnZlcnRzIGFzY2lpIHN0cmluZyB0byBuZXR3b3JrIG9yZGVyIGhleAorLy8KKy8vICBQQVJBTUVURVJTOgorLy8gICAgc3JjICAgIC0gcG9pbnRlciB0byBpbnB1dCBhc2NpaSBzdHJpbmcKKy8vICAgIGRlc3QgICAtIHBvaW50ZXIgdG8gb3V0cHV0IGhleAorLy8gICAgZGVzdGxlbiAtIHNpemUgb2YgZGVzdAorLy8KKy8vICBDT01NRU5UUzoKKy8vCisvLyAgICAyIGFzY2lpIGJ5dGVzIG1ha2UgYSBoZXggYnl0ZSBzbyBtdXN0IHB1dCAxc3QgYXNjaWkgYnl0ZSBvZiBwYWlyCisvLyAgICBpbnRvIHVwcGVyIG5pYmJsZSBhbmQgMm5kIGFzY2lpIGJ5dGUgb2YgcGFpciBpbnRvIGxvd2VyIG5pYmJsZS4KKy8vCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCit2b2lkIEF0b0goY2hhciAqIHNyYywgVUNIQVIgKiBkZXN0LCBpbnQgZGVzdGxlbikKK3sKKwljaGFyICogc3JjcHRyOworCVBVQ0hBUiBkZXN0VGVtcDsKKworCXNyY3B0ciA9IHNyYzsKKwlkZXN0VGVtcCA9IChQVUNIQVIpIGRlc3Q7CisKKwl3aGlsZShkZXN0bGVuLS0pCisJeworCQkqZGVzdFRlbXAgPSBCdG9IKCpzcmNwdHIrKykgPDwgNDsgICAgLy8gUHV0IDFzdCBhc2NpaSBieXRlIGluIHVwcGVyIG5pYmJsZS4KKwkJKmRlc3RUZW1wICs9IEJ0b0goKnNyY3B0cisrKTsgICAgICAvLyBBZGQgMm5kIGFzY2lpIGJ5dGUgdG8gYWJvdmUuCisJCWRlc3RUZW1wKys7CisJfQorfQorCitWT0lECVJUTVBQYXRjaE1hY0JicEJ1ZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVTE9ORwlJbmRleDsKKworCS8vIEluaXRpYWxpemUgQkJQIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fQkJQX1JFR19QQVJNUzsgSW5kZXgrKykKKwl7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIChVQ0hBUilCQlBSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCX0KKworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJLy8gUmUtaW5pdCBCQlAgcmVnaXN0ZXIgZnJvbSBFRVBST00gdmFsdWUKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwQWQJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKKwkJcFRpbWVyRnVuYwkJCUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aW1lciBleHBpcmVkCisJCVJlcGVhdAkJCQlUdXJlIGZvciBwZXJpb2QgdGltZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRUaW1lcigKKwlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglQVk9JRAkJCQkJcFRpbWVyRnVuYywKKwlJTglQVk9JRAkJCQkJcERhdGEsCisJSU4JQk9PTEVBTgkJCQkJUmVwZWF0KQoreworCS8vCisJLy8gU2V0IFZhbGlkIHRvIFRSVUUgZm9yIGxhdGVyIHVzZWQuCisJLy8gSXQgd2lsbCBjcmFzaCBpZiB3ZSBjYW5jZWwgYSB0aW1lciBvciBzZXQgYSB0aW1lcgorCS8vIHRoYXQgd2UgaGF2ZW4ndCBpbml0aWFsaXplIGJlZm9yZS4KKwkvLworCXBUaW1lci0+VmFsaWQgICAgICA9IFRSVUU7CisKKwlwVGltZXItPlBlcmlvZGljVHlwZSA9IFJlcGVhdDsKKwlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwlwVGltZXItPmNvb2tpZSA9IChVTE9ORykgcERhdGE7CisKKyNpZmRlZiBSVDI4NzAKKwlwVGltZXItPnBBZCA9IHBBZDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCVJUTVBfT1NfSW5pdF9UaW1lcihwQWQsCSZwVGltZXItPlRpbWVyT2JqLAlwVGltZXJGdW5jLCAoUFZPSUQpIHBUaW1lcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0IHRpbWVyIG9iamVjdHMKKworCUFyZ3VtZW50czoKKwkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQorCQlWYWx1ZQkJCQlUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0VGltZXIoCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVVMT05HCQkJCQlWYWx1ZSkKK3sKKwlpZiAocFRpbWVyLT5WYWxpZCkKKwl7CisJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOworCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCisJCXsKKwkJCXBUaW1lci0+UmVwZWF0ID0gVFJVRTsKKwkJCVJUTVBfU2V0UGVyaW9kaWNUaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJcFRpbWVyLT5SZXBlYXQgPSBGQUxTRTsKKwkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUFNldFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCisJCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBNb2RUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKQoreworCUJPT0xFQU4JQ2FuY2VsOworCisJaWYgKHBUaW1lci0+VmFsaWQpCisJeworCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKKwkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7CisJCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIocFRpbWVyLCAmQ2FuY2VsKTsKKwkJCVJUTVBTZXRUaW1lcihwVGltZXIsIFZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBfT1NfTW9kX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYW5jZWwgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJMS4pIFRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KKwkJMi4pIFJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDYW5jZWxUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmIChwVGltZXItPlZhbGlkKQorCXsKKwkJaWYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpCisJCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOworCQkJUlRNUF9PU19EZWxfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBDYW5jZWxsZWQpOworCisJCWlmICgqcENhbmNlbGxlZCA9PSBUUlVFKQorCQkJcFRpbWVyLT5TdGF0ZSA9IFRSVUU7CisKKyNpZmRlZiBSVDI4NzAKKwkJLy8gV2UgbmVlZCB0byBnby10aHJvdWdoIHRoZSBUaW1lclEgdG8gZmluZG91dCB0aGlzIHRpbWVyIGhhbmRsZXIgYW5kIHJlbW92ZSBpdCBpZgorCQkvLwkJaXQncyBzdGlsbCB3YWl0aW5nIGZvciBleGVjdXRpb24uCisKKwkJUlQyODcwX1RpbWVyUV9SZW1vdmUocFRpbWVyLT5wQWQsIHBUaW1lcik7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJfQorCWVsc2UKKwl7CisJCS8vCisJCS8vIE5kaXNNQ2FuY2VsVGltZXIganVzdCBjYW5jZWQgdGhlIHRpbWVyIGFuZCBub3QgbWVhbiByZWxlYXNlIHRoZSB0aW1lci4KKwkJLy8gQW5kIGRvbid0IHNldCB0aGUgIlZhbGlkIiB0byBGYWxzZS4gU28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgdGltZXIgYWdhaW4uCisJCS8vCisJCURCR1BSSU5UX0VSUigoIlJUTVBDYW5jZWxUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IExFRCBTdGF0dXMKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlTdGF0dXMJCQkJCUxFRCBTdGF0dXMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBTZXRMRUQoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFVDSEFSCQkJU3RhdHVzKQoreworCS8vVUxPTkcJCQlkYXRhOworCVVDSEFSCQkJSGlnaEJ5dGUgPSAwOworCVVDSEFSCQkJTG93Qnl0ZTsKKworLy8gSW4gQVRFIG1vZGUgb2YgUlQyODYwIEFQL1NUQSwgd2UgaGF2ZSBlcmFzZWQgODA1MSBmaXJtd2FyZS4KKy8vIFNvIExFRCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBBVEUgaXMgcnVubmluZy4KKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJTG93Qnl0ZSA9IHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlJjB4N2Y7CisJc3dpdGNoIChTdGF0dXMpCisJeworCQljYXNlIExFRF9MSU5LX0RPV046CisJCQlIaWdoQnl0ZSA9IDB4MjA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBMRURfTElOS19VUDoKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCQkJSGlnaEJ5dGUgPSAweGEwOworCQkJZWxzZQorCQkJCUhpZ2hCeXRlID0gMHg2MDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX1JBRElPX09OOgorCQkJSGlnaEJ5dGUgPSAweDIwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfSEFMVDoKKwkJCUxvd0J5dGUgPSAwOyAvLyBEcml2ZXIgc2V0cyBNQUMgcmVnaXN0ZXIgYW5kIE1BQyBjb250cm9scyBMRUQKKwkJY2FzZSBMRURfUkFESU9fT0ZGOgorCQkJSGlnaEJ5dGUgPSAwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBMRURfV1BTOgorCQkJSGlnaEJ5dGUgPSAweDEwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfT05fU0lURV9TVVJWRVk6CisJCQlIaWdoQnl0ZSA9IDB4MDg7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9QT1dFUl9VUDoKKwkJCUhpZ2hCeXRlID0gMHgwNDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRMRUQ6OlVua25vd24gU3RhdHVzICVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCX0KKworICAgIC8vCisJLy8gS2VlcCBMRUQgc3RhdHVzIGZvciBMRUQgU2l0ZVN1cnZleSBtb2RlLgorCS8vIEFmdGVyIFNpdGVTdXJ2ZXksIHdlIHdpbGwgc2V0IHRoZSBMRUQgbW9kZSB0byBwcmV2aW91cyBzdGF0dXMuCisJLy8KKwlpZiAoKFN0YXR1cyAhPSBMRURfT05fU0lURV9TVVJWRVkpICYmIChTdGF0dXMgIT0gTEVEX1BPV0VSX1VQKSkKKwkJcEFkLT5MZWRTdGF0dXMgPSBTdGF0dXM7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0TEVEOjpNb2RlPSVkLEhpZ2hCeXRlPTB4JTAyeCxMb3dCeXRlPTB4JTAyeFxuIiwgcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUsIEhpZ2hCeXRlLCBMb3dCeXRlKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgTEVEIFNpZ25hbCBTdHJlZ3RoCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJRGJtCQkJCQkJU2lnbmFsIFN0cmVndGgKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisJCUNhbiBiZSBydW4gb24gYW55IElSUUwgbGV2ZWwuCisKKwkJQWNjb3JkaW5nIHRvIE1pY3Jvc29mdCBaZXJvIENvbmZpZyBXaXJlbGVzcyBTaWduYWwgU3RyZWd0aCBkZWZpbml0aW9uIGFzIGJlbG93cy4KKwkJPD0gLTkwICBObyBTaWduYWwKKwkJPD0gLTgxICBWZXJ5IExvdworCQk8PSAtNzEgIExvdworCQk8PSAtNjcgIEdvb2QKKwkJPD0gLTU3ICBWZXJ5IEdvb2QKKwkJID4gLTU3ICBFeGNlbGxlbnQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBTZXRTaWduYWxMRUQoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKQoreworCVVDSEFSCQluTGVkID0gMDsKKworCS8vCisJLy8gaWYgbm90IFNpZ25hbCBTdHJlZ3RoLCB0aGVuIGRvIG5vdGhpbmcuCisJLy8KKwlpZiAocEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUgIT0gTEVEX01PREVfU0lHTkFMX1NUUkVHVEgpCisJeworCQlyZXR1cm47CisJfQorCisJaWYgKERibSA8PSAtOTApCisJCW5MZWQgPSAwOworCWVsc2UgaWYgKERibSA8PSAtODEpCisJCW5MZWQgPSAxOworCWVsc2UgaWYgKERibSA8PSAtNzEpCisJCW5MZWQgPSAzOworCWVsc2UgaWYgKERibSA8PSAtNjcpCisJCW5MZWQgPSA3OworCWVsc2UgaWYgKERibSA8PSAtNTcpCisJCW5MZWQgPSAxNTsKKwllbHNlCisJCW5MZWQgPSAzMTsKKworCS8vCisJLy8gVXBkYXRlIFNpZ25hbCBTdHJlZ3RoIHRvIGZpcm13YXJlIGlmIGNoYW5nZWQuCisJLy8KKwlpZiAocEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoICE9IG5MZWQpCisJeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTEsIDB4ZmYsIG5MZWQsIHBBZC0+TGVkQ250bC5maWVsZC5Qb2xhcml0eSk7CisJCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IG5MZWQ7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5hYmxlIFJYCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA8PSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJQmVmb3JlIEVuYWJsZSBSWCwgbWFrZSBzdXJlIHlvdSBoYXZlIGVuYWJsZWQgSW50ZXJydXB0LgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUEVuYWJsZVJ4VHgoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisvLwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKy8vCVVMT05HCWkgPSAwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBFbmFibGVSeFR4XG4iKSk7CisKKyNpZiAwCisJLy8gRW5hYmxlIFJ4IERNQS4KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiAgRE1BQnVzeVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaSA8MjAwKTsKKworCVJUTVB1c2VjRGVsYXkoNTApOworCVJUMjhYWF9ETUFfV1JJVEVfSU5JVChHbG9DZmcpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlSVDI4WFhfRE1BX1BPU1RfV1JJVEUocEFkKTsKKyNlbHNlCisJLy8gRW5hYmxlIFJ4IERNQS4KKwlSVDI4WFhETUFFbmFibGUocEFkKTsKKyNlbmRpZgorCisJLy8gZW5hYmxlIFJYIG9mIE1BQyBibG9jaworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJeworCQlVSU5UMzIgcnhfZmlsdGVyX2ZsYWcgPSBBUE5PUk1BTDsKKworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgcnhfZmlsdGVyX2ZsYWcpOyAgICAgLy8gZW5hYmxlIFJYIG9mIERNQSBibG9jaworCX0KKwllbHNlCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7ICAgICAvLyBTdGFpb24gbm90IGRyb3AgY29udHJvbCBmcmFtZSB3aWxsIGZhaWwgV2lGaSBDZXJ0aWZpY2F0aW9uLgorCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhjKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGtpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDc0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3RraXAuYwpAQCAtMCwwICsxLDE2MTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF90a2lwLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIFd1CQkwMi0yNS0wMgkJSW5pdGlhbAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvLyBSb3RhdGlvbiBmdW5jdGlvbnMgb24gMzIgYml0IHZhbHVlcworI2RlZmluZSBST0wzMiggQSwgbiApIFwKKwkoICgoQSkgPDwgKG4pKSB8ICggKChBKT4+KDMyLShuKSkpICYgKCAoMVVMIDw8IChuKSkgLSAxICkgKSApCisjZGVmaW5lIFJPUjMyKCBBLCBuICkgUk9MMzIoIChBKSwgMzItKG4pICkKKworVUlOVCBUa2lwX1Nib3hfTG93ZXJbMjU2XSA9Cit7CisJMHhBNSwweDg0LDB4OTksMHg4RCwweDBELDB4QkQsMHhCMSwweDU0LAorCTB4NTAsMHgwMywweEE5LDB4N0QsMHgxOSwweDYyLDB4RTYsMHg5QSwKKwkweDQ1LDB4OUQsMHg0MCwweDg3LDB4MTUsMHhFQiwweEM5LDB4MEIsCisJMHhFQywweDY3LDB4RkQsMHhFQSwweEJGLDB4RjcsMHg5NiwweDVCLAorCTB4QzIsMHgxQywweEFFLDB4NkEsMHg1QSwweDQxLDB4MDIsMHg0RiwKKwkweDVDLDB4RjQsMHgzNCwweDA4LDB4OTMsMHg3MywweDUzLDB4M0YsCisJMHgwQywweDUyLDB4NjUsMHg1RSwweDI4LDB4QTEsMHgwRiwweEI1LAorCTB4MDksMHgzNiwweDlCLDB4M0QsMHgyNiwweDY5LDB4Q0QsMHg5RiwKKwkweDFCLDB4OUUsMHg3NCwweDJFLDB4MkQsMHhCMiwweEVFLDB4RkIsCisJMHhGNiwweDRELDB4NjEsMHhDRSwweDdCLDB4M0UsMHg3MSwweDk3LAorCTB4RjUsMHg2OCwweDAwLDB4MkMsMHg2MCwweDFGLDB4QzgsMHhFRCwKKwkweEJFLDB4NDYsMHhEOSwweDRCLDB4REUsMHhENCwweEU4LDB4NEEsCisJMHg2QiwweDJBLDB4RTUsMHgxNiwweEM1LDB4RDcsMHg1NSwweDk0LAorCTB4Q0YsMHgxMCwweDA2LDB4ODEsMHhGMCwweDQ0LDB4QkEsMHhFMywKKwkweEYzLDB4RkUsMHhDMCwweDhBLDB4QUQsMHhCQywweDQ4LDB4MDQsCisJMHhERiwweEMxLDB4NzUsMHg2MywweDMwLDB4MUEsMHgwRSwweDZELAorCTB4NEMsMHgxNCwweDM1LDB4MkYsMHhFMSwweEEyLDB4Q0MsMHgzOSwKKwkweDU3LDB4RjIsMHg4MiwweDQ3LDB4QUMsMHhFNywweDJCLDB4OTUsCisJMHhBMCwweDk4LDB4RDEsMHg3RiwweDY2LDB4N0UsMHhBQiwweDgzLAorCTB4Q0EsMHgyOSwweEQzLDB4M0MsMHg3OSwweEUyLDB4MUQsMHg3NiwKKwkweDNCLDB4NTYsMHg0RSwweDFFLDB4REIsMHgwQSwweDZDLDB4RTQsCisJMHg1RCwweDZFLDB4RUYsMHhBNiwweEE4LDB4QTQsMHgzNywweDhCLAorCTB4MzIsMHg0MywweDU5LDB4QjcsMHg4QywweDY0LDB4RDIsMHhFMCwKKwkweEI0LDB4RkEsMHgwNywweDI1LDB4QUYsMHg4RSwweEU5LDB4MTgsCisJMHhENSwweDg4LDB4NkYsMHg3MiwweDI0LDB4RjEsMHhDNywweDUxLAorCTB4MjMsMHg3QywweDlDLDB4MjEsMHhERCwweERDLDB4ODYsMHg4NSwKKwkweDkwLDB4NDIsMHhDNCwweEFBLDB4RDgsMHgwNSwweDAxLDB4MTIsCisJMHhBMywweDVGLDB4RjksMHhEMCwweDkxLDB4NTgsMHgyNywweEI5LAorCTB4MzgsMHgxMywweEIzLDB4MzMsMHhCQiwweDcwLDB4ODksMHhBNywKKwkweEI2LDB4MjIsMHg5MiwweDIwLDB4NDksMHhGRiwweDc4LDB4N0EsCisJMHg4RiwweEY4LDB4ODAsMHgxNywweERBLDB4MzEsMHhDNiwweEI4LAorCTB4QzMsMHhCMCwweDc3LDB4MTEsMHhDQiwweEZDLDB4RDYsMHgzQQorfTsKKworVUlOVCBUa2lwX1Nib3hfVXBwZXJbMjU2XSA9Cit7CisJMHhDNiwweEY4LDB4RUUsMHhGNiwweEZGLDB4RDYsMHhERSwweDkxLAorCTB4NjAsMHgwMiwweENFLDB4NTYsMHhFNywweEI1LDB4NEQsMHhFQywKKwkweDhGLDB4MUYsMHg4OSwweEZBLDB4RUYsMHhCMiwweDhFLDB4RkIsCisJMHg0MSwweEIzLDB4NUYsMHg0NSwweDIzLDB4NTMsMHhFNCwweDlCLAorCTB4NzUsMHhFMSwweDNELDB4NEMsMHg2QywweDdFLDB4RjUsMHg4MywKKwkweDY4LDB4NTEsMHhEMSwweEY5LDB4RTIsMHhBQiwweDYyLDB4MkEsCisJMHgwOCwweDk1LDB4NDYsMHg5RCwweDMwLDB4MzcsMHgwQSwweDJGLAorCTB4MEUsMHgyNCwweDFCLDB4REYsMHhDRCwweDRFLDB4N0YsMHhFQSwKKwkweDEyLDB4MUQsMHg1OCwweDM0LDB4MzYsMHhEQywweEI0LDB4NUIsCisJMHhBNCwweDc2LDB4QjcsMHg3RCwweDUyLDB4REQsMHg1RSwweDEzLAorCTB4QTYsMHhCOSwweDAwLDB4QzEsMHg0MCwweEUzLDB4NzksMHhCNiwKKwkweEQ0LDB4OEQsMHg2NywweDcyLDB4OTQsMHg5OCwweEIwLDB4ODUsCisJMHhCQiwweEM1LDB4NEYsMHhFRCwweDg2LDB4OUEsMHg2NiwweDExLAorCTB4OEEsMHhFOSwweDA0LDB4RkUsMHhBMCwweDc4LDB4MjUsMHg0QiwKKwkweEEyLDB4NUQsMHg4MCwweDA1LDB4M0YsMHgyMSwweDcwLDB4RjEsCisJMHg2MywweDc3LDB4QUYsMHg0MiwweDIwLDB4RTUsMHhGRCwweEJGLAorCTB4ODEsMHgxOCwweDI2LDB4QzMsMHhCRSwweDM1LDB4ODgsMHgyRSwKKwkweDkzLDB4NTUsMHhGQywweDdBLDB4QzgsMHhCQSwweDMyLDB4RTYsCisJMHhDMCwweDE5LDB4OUUsMHhBMywweDQ0LDB4NTQsMHgzQiwweDBCLAorCTB4OEMsMHhDNywweDZCLDB4MjgsMHhBNywweEJDLDB4MTYsMHhBRCwKKwkweERCLDB4NjQsMHg3NCwweDE0LDB4OTIsMHgwQywweDQ4LDB4QjgsCisJMHg5RiwweEJELDB4NDMsMHhDNCwweDM5LDB4MzEsMHhEMywweEYyLAorCTB4RDUsMHg4QiwweDZFLDB4REEsMHgwMSwweEIxLDB4OUMsMHg0OSwKKwkweEQ4LDB4QUMsMHhGMywweENGLDB4Q0EsMHhGNCwweDQ3LDB4MTAsCisJMHg2RiwweEYwLDB4NEEsMHg1QywweDM4LDB4NTcsMHg3MywweDk3LAorCTB4Q0IsMHhBMSwweEU4LDB4M0UsMHg5NiwweDYxLDB4MEQsMHgwRiwKKwkweEUwLDB4N0MsMHg3MSwweENDLDB4OTAsMHgwNiwweEY3LDB4MUMsCisJMHhDMiwweDZBLDB4QUUsMHg2OSwweDE3LDB4OTksMHgzQSwweDI3LAorCTB4RDksMHhFQiwweDJCLDB4MjIsMHhEMiwweEE5LDB4MDcsMHgzMywKKwkweDJELDB4M0MsMHgxNSwweEM5LDB4ODcsMHhBQSwweDUwLDB4QTUsCisJMHgwMywweDU5LDB4MDksMHgxQSwweDY1LDB4RDcsMHg4NCwweEQwLAorCTB4ODIsMHgyOSwweDVBLDB4MUUsMHg3QiwweEE4LDB4NkQsMHgyQworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqIFNCT1ggVGFibGUgKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitVQ0hBUiBTYm94VGFibGVbMjU2XSA9Cit7CisJMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwKKwkweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2LAorCTB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsCisJMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKKwkweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLAorCTB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsCisJMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwKKwkweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1LAorCTB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsCisJMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwKKwkweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLAorCTB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsCisJMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwKKwkweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4LAorCTB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsCisJMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwKKwkweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LAorCTB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsCisJMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwKKwkweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiLAorCTB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsCisJMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwKKwkweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LAorCTB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsCisJMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwKKwkweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhLAorCTB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsCisJMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwKKwkweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LAorCTB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsCisJMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwKKwkweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2Cit9OworCitWT0lEIHhvcl8zMigKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGIsCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCB4b3JfMTI4KAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG5leHRfa2V5KAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGtleSwKKwlJTiAgSU5UICAgICAgICAgICAgICAgICByb3VuZCk7CisKK1ZPSUQgYnl0ZV9zdWIoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBzaGlmdF9yb3coCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBtaXhfY29sdW1uKAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1VDSEFSIFJUTVBDa2lwU2JveCgKKwlJTiAgVUNIQVIgICAgICAgICAgICAgICBhKTsKKy8vCisvLyBFeHBhbmRlZCBJViBmb3IgVEtJUCBmdW5jdGlvbi4KKy8vCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0lWX0NPTlRST0xfCit7CisJdW5pb24gUEFDS0VECisJeworCQlzdHJ1Y3QgUEFDS0VECisJCXsKKwkJCVVDSEFSCQlyYzA7CisJCQlVQ0hBUgkJcmMxOworCQkJVUNIQVIJCXJjMjsKKworCQkJdW5pb24gUEFDS0VECisJCQl7CisJCQkJc3RydWN0IFBBQ0tFRAorCQkJCXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJCVVDSEFSCUtleUlEOjI7CisJCQkJCVVDSEFSCUV4dElWOjE7CisJCQkJCVVDSEFSCVJzdmQ6NTsKKyNlbHNlCisJCQkJCVVDSEFSCVJzdmQ6NTsKKwkJCQkJVUNIQVIJRXh0SVY6MTsKKwkJCQkJVUNIQVIJS2V5SUQ6MjsKKyNlbmRpZgorCQkJCX0JZmllbGQ7CisJCQkJVUNIQVIJCUJ5dGU7CisJCQl9CUNPTlRST0w7CisJCX0JZmllbGQ7CisKKwkJVUxPTkcJd29yZDsKKwl9CUlWMTY7CisKKwlVTE9ORwlJVjMyOworfQlUS0lQX0lWLCAqUFRLSVBfSVY7CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbnZlcnQgZnJvbSBVQ0hBUltdIHRvIFVMT05HIGluIGEgcG9ydGFibGUgd2F5CisKKwlBcmd1bWVudHM6CisgICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HCVJUTVBUa2lwR2V0VUludDMyKAorCUlOCVBVQ0hBUglwTUlDS2V5KQoreworCVVMT05HCXJlcyA9IDA7CisJSU5UCQlpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCXJlcyB8PSAoKnBNSUNLZXkrKykgPDwgKDggKiBpKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIFVMT05HIHRvIFVDSEFSW10gaW4gYSBwb3J0YWJsZSB3YXkKKworCUFyZ3VtZW50czoKKyAgICAgIHBEc3QJCQlwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGZvciBjb252ZXJ0IFVMT05HIHRvIFVDSEFSW10KKyAgICAgIHZhbAkJCXRoZSB2YWx1ZSBmb3IgY29udmVydAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwUHV0VUludDMyKAorCUlOIE9VVAlQVUNIQVIJCXBEc3QsCisJSU4JCVVMT05HCQl2YWwpCit7CisJSU5UIGk7CisKKwlmb3IoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQkqcERzdCsrID0gKFVDSEFSKSAodmFsICYgMHhmZik7CisJCXZhbCA+Pj0gODsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlTZXQgdGhlIE1JQyBLZXkuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBUa2lwU2V0TUlDS2V5KAorCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXkpCit7CisJLy8gU2V0IHRoZSBrZXkKKwlwVGtpcC0+SzAgPSBSVE1QVGtpcEdldFVJbnQzMihwTUlDS2V5KTsKKwlwVGtpcC0+SzEgPSBSVE1QVGtpcEdldFVJbnQzMihwTUlDS2V5ICsgNCk7CisJLy8gYW5kIHJlc2V0IHRoZSBtZXNzYWdlCisJcFRraXAtPkwgPSBwVGtpcC0+SzA7CisJcFRraXAtPlIgPSBwVGtpcC0+SzE7CisJcFRraXAtPm5CeXRlc0luTSA9IDA7CisJcFRraXAtPk0gPSAwOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHVDaGFyCQkJQXBwZW5kIHRoaXMgdUNoYXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEFwcGVuZEJ5dGUoCisJSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCisJSU4JVUNIQVIgCQkJdUNoYXIpCit7CisJLy8gQXBwZW5kIHRoZSBieXRlIHRvIG91ciB3b3JkLXNpemVkIGJ1ZmZlcgorCXBUa2lwLT5NIHw9ICh1Q2hhciA8PCAoOCogcFRraXAtPm5CeXRlc0luTSkpOworCXBUa2lwLT5uQnl0ZXNJbk0rKzsKKwkvLyBQcm9jZXNzIHRoZSB3b3JkIGlmIGl0IGlzIGZ1bGwuCisJaWYoIHBUa2lwLT5uQnl0ZXNJbk0gPj0gNCApCisJeworCQlwVGtpcC0+TCBePSBwVGtpcC0+TTsKKwkJcFRraXAtPlIgXj0gUk9MMzIoIHBUa2lwLT5MLCAxNyApOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJcFRraXAtPlIgXj0gKChwVGtpcC0+TCAmIDB4ZmYwMGZmMDApID4+IDgpIHwgKChwVGtpcC0+TCAmIDB4MDBmZjAwZmYpIDw8IDgpOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJcFRraXAtPlIgXj0gUk9MMzIoIHBUa2lwLT5MLCAzICk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSBST1IzMiggcFRraXAtPkwsIDIgKTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCS8vIENsZWFyIHRoZSBidWZmZXIKKwkJcFRraXAtPk0gPSAwOworCQlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcFNyYwkJCVBvaW50ZXIgdG8gc291cmNlIGRhdGEgZm9yIENhbGN1bGF0ZSBNSUMgVmFsdWUKKyAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBBcHBlbmQoCisJSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJbkJ5dGVzKQoreworCS8vIFRoaXMgaXMgc2ltcGxlCisJd2hpbGUobkJ5dGVzID4gMCkKKwl7CisJCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgKnBTcmMrKyk7CisJCW5CeXRlcy0tOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUdldCB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJdGhlIE1JQyBWYWx1ZSBpcyBzdG9yZSBpbiBwQWQtPlByaXZhdGVJbmZvLk1JQworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBHZXRNSUMoCisJSU4JUFRLSVBfS0VZX0lORk8JcFRraXApCit7CisJLy8gQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcKKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDB4NWEgKTsKKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKKwkvLyBhbmQgdGhlbiB6ZXJvZXMgdW50aWwgdGhlIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDQKKwl3aGlsZSggcFRraXAtPm5CeXRlc0luTSAhPSAwICkKKwl7CisJCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCX0KKwkvLyBUaGUgYXBwZW5kQnl0ZSBmdW5jdGlvbiBoYXMgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVzdWx0LgorCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMsIHBUa2lwLT5MKTsKKwlSVE1QVGtpcFB1dFVJbnQzMihwVGtpcC0+TUlDICsgNCwgcFRraXAtPlIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBUa2lwIGZ1bmN0aW9uLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBUS2V5ICAgICAgIFBvaW50ZXIgdG8gdGhlIFRlbXBvcmFsIEtleSAoVEspLCBUSyBzaGFsbCBiZSAxMjhiaXRzLgorCQlLZXlJZAkJVEsgS2V5IElECisJCXBUQQkJCVBvaW50ZXIgdG8gdHJhbnNtaXR0ZXIgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFRraXBFbmdpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglVQ0hBUgkJCUtleUlkLAorCUlOCVBVQ0hBUgkJCXBUQSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5LAorCUlOCVBVQ0hBUgkJCXBUU0MsCisJT1VUCVBVTE9ORwkJCXBJVjE2LAorCU9VVAlQVUxPTkcJCQlwSVYzMikKK3sKKwlUS0lQX0lWCXRraXBJdjsKKworCS8vIFByZXBhcmUgOCBieXRlcyBUS0lQIGVuY2Fwc3VsYXRpb24gZm9yIE1QRFUKKwlOZGlzWmVyb01lbW9yeSgmdGtpcEl2LCBzaXplb2YoVEtJUF9JVikpOworCXRraXBJdi5JVjE2LmZpZWxkLnJjMCA9ICoocFRTQyArIDEpOworCXRraXBJdi5JVjE2LmZpZWxkLnJjMSA9ICh0a2lwSXYuSVYxNi5maWVsZC5yYzAgfCAweDIwKSAmIDB4N2Y7CisJdGtpcEl2LklWMTYuZmllbGQucmMyID0gKnBUU0M7CisJdGtpcEl2LklWMTYuZmllbGQuQ09OVFJPTC5maWVsZC5FeHRJViA9IDE7ICAvLyAwOiBub24tZXh0ZW5kZWQgSVYsIDE6IGFuIGV4dGVuZGVkIElWCisJdGtpcEl2LklWMTYuZmllbGQuQ09OVFJPTC5maWVsZC5LZXlJRCA9IEtleUlkOworLy8JdGtpcEl2LklWMzIgPSAqKFBVTE9ORykocFRTQyArIDIpOworCU5kaXNNb3ZlTWVtb3J5KCZ0a2lwSXYuSVYzMiwgKHBUU0MgKyAyKSwgNCk7ICAgLy8gQ29weSBJVgorCisJKnBJVjE2ID0gdGtpcEl2LklWMTYud29yZDsKKwkqcElWMzIgPSB0a2lwSXYuSVYzMjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUluaXQgTUlDIFZhbHVlIGNhbGN1bGF0aW9uIGZ1bmN0aW9uIHdoaWNoIGluY2x1ZGUgc2V0IE1JQyBrZXkgJgorCQljYWxjdWxhdGUgZmlyc3QgMTYgYnl0ZXMgKERBICsgU0EgKyBwcmlvcml0eSArICAwKQorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBUS2V5ICAgICAgIFBvaW50ZXIgdG8gdGhlIFRlbXBvcmFsIEtleSAoVEspLCBUSyBzaGFsbCBiZSAxMjhiaXRzLgorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdE1JQ0VuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTglQVUNIQVIJCQlwU0EsCisJSU4gIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHksCisJSU4JUFVDSEFSCQkJcE1JQ0tleSkKK3sKKwlVTE9ORyBQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBNSUNLZXkpOworCS8vIERBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBTQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29tcGFyZSBNSUMgdmFsdWUgb2YgcmVjZWl2ZWQgTVNEVQorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCisJCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5LAorCUlOCVVDSEFSCQkJVXNlclByaW9yaXR5LAorCUlOCVVJTlQJCQlMZW4pCit7CisJVUNIQVIJT2xkTWljWzhdOworCVVMT05HCVByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcE1JQ0tleSk7CisJLy8gREEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8vIFNBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7CisKKwkvLyBDYWxjdWxhdGUgTUlDIHZhbHVlIGZyb20gcGxhaW4gdGV4dCBkYXRhCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTcmMsIExlbik7CisKKwkvLyBHZXQgTUlDIHZhbHVkZSBmcm9tIHJlY2VpdmVkIGZyYW1lCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwU3JjICsgTGVuLCA4KTsKKworCS8vIEdldCBNSUMgdmFsdWUgZnJvbSBkZWNyeXB0ZWQgcGxhaW4gZGF0YQorCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlJ4KTsKKworCS8vIE1vdmUgTUlDIHZhbHVlIGZyb20gTVNEVSwgdGhpcyBzdGVwcyBzaG91bGQgbW92ZSB0byBkYXRhIHBhdGguCisJLy8gU2luY2UgdGhlIE1JQyB2YWx1ZSBtaWdodCBjcm9zcyBNUERVcy4KKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+UHJpdmF0ZUluZm8uUnguTUlDLCBPbGRNaWMsIDgpKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKCk6IFRLSVAgTUlDIEVycm9yICFcbiIpKTsgIC8vTUlDIGVycm9yLgorCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCXJldHVybiAoVFJVRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBMTEMJCUxMQyBoZWFkZXIKKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgUGxhaW4gdGV4dCBkYXRhCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIHBsYWluIHRleHQgZGF0YSBleGNsdWRlIE1JQyB2YWx1ZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFICAgICAgICBNSUMgdmFsdWUgbWF0Y2hlZAorCQlGQUxTRSAgICAgICBNSUMgdmFsdWUgbWlzbWF0Y2hlZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcExMQywKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTglQVUNIQVIJCQlwU0EsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSwKKwlJTglVSU5UCQkJTGVuKQoreworCVVDSEFSCU9sZE1pY1s4XTsKKwlVTE9ORwlQcmlvcml0eSA9IDA7CisKKwkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgorCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKKwkvLyBEQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLy8gU0EKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKKworCS8vIFN0YXJ0IHdpdGggTExDIGhlYWRlcgorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTExDLCA4KTsKKworCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKKworCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOworCisJLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCisJUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOworCisJLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KKwkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKCk6IFRLSVAgTUlDIEVycm9yICFcbiIpKTsgIC8vTUlDIGVycm9yLgorCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCXJldHVybiAoVFJVRSk7Cit9CisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIHRyYW5zbWl0IGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBOZGlzIFBhY2tldCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJCXBFbmNhcAkJCVBvaW50ZXIgdG8gTExDIGVuY2FwIGRhdGEKKwkJTGVuRW5jYXAJCVRvdGFsIGVuY2FwIGxlbmd0aCwgbWlnaHQgYmUgMCB3aGljaCBpbmRpY2F0ZXMgbm8gZW5jYXAKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQ2FsY3VsYXRlTUlDVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcEVuY2FwLAorCUlOCVBDSVBIRVJfS0VZCQlwS2V5LAorCUlOCVVDSEFSCQkJYXBpZHgpCit7CisJUEFDS0VUX0lORk8JCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJUFVDSEFSCQkJcFNyYzsKKyAgICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5OworCVVDSEFSCQkJdmxhbl9vZmZzZXQgPSAwOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOworCisJVXNlclByaW9yaXR5ID0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBTcmMgPSBwU3JjQnVmVkE7CisKKwkvLyBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHZsYW4gcGFja2V0CisJaWYgKCgoKihwU3JjICsgMTIpIDw8IDgpICsgKihwU3JjICsgMTMpKSA9PSAweDgxMDApCisJCXZsYW5fb2Zmc2V0ID0gNDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXsKKwkJUlRNUEluaXRNSUNFbmdpbmUoCisJCQlwQWQsCisJCQlwS2V5LT5LZXksCisJCQlwU3JjLAorCQkJcFNyYyArIDYsCisJCQlVc2VyUHJpb3JpdHksCisJCQlwS2V5LT5UeE1pYyk7CisJfQorCisKKwlpZiAocEVuY2FwICE9IE5VTEwpCisJeworCQkvLyBMTEMgZW5jYXBzdWxhdGlvbgorCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcEVuY2FwLCA2KTsKKwkJLy8gUHJvdG9jb2wgVHlwZQorCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYyArIDEyICsgdmxhbl9vZmZzZXQsIDIpOworCX0KKwlTcmNCdWZMZW4gLT0gKDE0ICsgdmxhbl9vZmZzZXQpOworCXBTcmMgKz0gKDE0ICsgdmxhbl9vZmZzZXQpOworCWRvCisJeworCQlpZiAoU3JjQnVmTGVuID4gMCkKKwkJeworCQkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTcmMsIFNyY0J1Zkxlbik7CisJCX0KKworCQlicmVhazsJLy8gTm8gbmVlZCBoYW5kbGUgbmV4dCBwYWNrZXQKKworCX0Jd2hpbGUgKFRSVUUpOwkJLy8gRW5kIG9mIGNvcHlpbmcgcGF5bG9hZAorCisJLy8gQ29tcHV0ZSB0aGUgZmluYWwgTUlDIFZhbHVlCisJUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uVHgpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0a2lwX3Nib3goKQkJCQkJCQkJCQkJCQkJCQkqLworLyogUmV0dXJucyBhIDE2IGJpdCB2YWx1ZSBmcm9tIGEgNjRLIGVudHJ5IHRhYmxlLiBUaGUgVGFibGUgKi8KKy8qIGlzIHN5bnRoZXNpemVkIGZyb20gdHdvIDI1NiBlbnRyeSBieXRlIHdpZGUgdGFibGVzLgkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1VJTlQgdGtpcF9zYm94KFVJTlQgaW5kZXgpCit7CisJVUlOVCBpbmRleF9sb3c7CisJVUlOVCBpbmRleF9oaWdoOworCVVJTlQgbGVmdCwgcmlnaHQ7CisKKwlpbmRleF9sb3cgPSAoaW5kZXggJSAyNTYpOworCWluZGV4X2hpZ2ggPSAoKGluZGV4ID4+IDgpICUgMjU2KTsKKworCWxlZnQgPSBUa2lwX1Nib3hfTG93ZXJbaW5kZXhfbG93XSArIChUa2lwX1Nib3hfVXBwZXJbaW5kZXhfbG93XSAqIDI1Nik7CisJcmlnaHQgPSBUa2lwX1Nib3hfVXBwZXJbaW5kZXhfaGlnaF0gKyAoVGtpcF9TYm94X0xvd2VyW2luZGV4X2hpZ2hdICogMjU2KTsKKworCXJldHVybiAobGVmdCBeIHJpZ2h0KTsKK30KKworVUlOVCByb3RyMShVSU5UIGEpCit7CisJdW5zaWduZWQgaW50IGI7CisKKwlpZiAoKGEgJiAweDAxKSA9PSAweDAxKQorCXsKKwkJYiA9IChhID4+IDEpIHwgMHg4MDAwOworCX0KKwllbHNlCisJeworCQliID0gKGEgPj4gMSkgJiAweDdmZmY7CisJfQorCWIgPSBiICUgNjU1MzY7CisJcmV0dXJuIGI7Cit9CisKK1ZPSUQgUlRNUFRraXBNaXhLZXkoCisJVUNIQVIgKmtleSwKKwlVQ0hBUiAqdGEsCisJVUxPTkcgcG5sLCAvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCisJVUxPTkcgcG5oLCAvKiBNb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgUE4gKi8KKwlVQ0hBUiAqcmM0a2V5LAorCVVJTlQgKnAxaykKK3sKKworCVVJTlQgdHNjMDsKKwlVSU5UIHRzYzE7CisJVUlOVCB0c2MyOworCisJVUlOVCBwcGswOworCVVJTlQgcHBrMTsKKwlVSU5UIHBwazI7CisJVUlOVCBwcGszOworCVVJTlQgcHBrNDsKKwlVSU5UIHBwazU7CisKKwlJTlQgaTsKKwlJTlQgajsKKworCXRzYzAgPSAodW5zaWduZWQgaW50KSgocG5oID4+IDE2KSAlIDY1NTM2KTsgLyogbXNiICovCisJdHNjMSA9ICh1bnNpZ25lZCBpbnQpKHBuaCAlIDY1NTM2KTsKKwl0c2MyID0gKHVuc2lnbmVkIGludCkocG5sICUgNjU1MzYpOyAvKiBsc2IgKi8KKworCS8qIFBoYXNlIDEsIHN0ZXAgMSAqLworCXAxa1swXSA9IHRzYzE7CisJcDFrWzFdID0gdHNjMDsKKwlwMWtbMl0gPSAoVUlOVCkodGFbMF0gKyAodGFbMV0qMjU2KSk7CisJcDFrWzNdID0gKFVJTlQpKHRhWzJdICsgKHRhWzNdKjI1NikpOworCXAxa1s0XSA9IChVSU5UKSh0YVs0XSArICh0YVs1XSoyNTYpKTsKKworCS8qIFBoYXNlIDEsIHN0ZXAgMiAqLworCWZvciAoaT0wOyBpPDg7IGkrKykKKwl7CisJCWogPSAyKihpICYgMSk7CisJCXAxa1swXSA9IChwMWtbMF0gKyB0a2lwX3Nib3goIChwMWtbNF0gXiAoKDI1NiprZXlbMStqXSkgKyBrZXlbal0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1sxXSA9IChwMWtbMV0gKyB0a2lwX3Nib3goIChwMWtbMF0gXiAoKDI1NiprZXlbNStqXSkgKyBrZXlbNCtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzJdID0gKHAxa1syXSArIHRraXBfc2JveCggKHAxa1sxXSBeICgoMjU2KmtleVs5K2pdKSArIGtleVs4K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbM10gPSAocDFrWzNdICsgdGtpcF9zYm94KCAocDFrWzJdIF4gKCgyNTYqa2V5WzEzK2pdKSArIGtleVsxMitqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzRdID0gKHAxa1s0XSArIHRraXBfc2JveCggKHAxa1szXSBeICgoKDI1NiprZXlbMStqXSkgKyBrZXlbal0pKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbNF0gPSAocDFrWzRdICsgaSkgJSA2NTUzNjsKKwl9CisKKwkvKiBQaGFzZSAyLCBTdGVwIDEgKi8KKwlwcGswID0gcDFrWzBdOworCXBwazEgPSBwMWtbMV07CisJcHBrMiA9IHAxa1syXTsKKwlwcGszID0gcDFrWzNdOworCXBwazQgPSBwMWtbNF07CisJcHBrNSA9IChwMWtbNF0gKyB0c2MyKSAlIDY1NTM2OworCisJLyogUGhhc2UyLCBTdGVwIDIgKi8KKwlwcGswID0gcHBrMCArIHRraXBfc2JveCggKHBwazUgXiAoKDI1NiprZXlbMV0pICsga2V5WzBdKSkgJSA2NTUzNik7CisJcHBrMSA9IHBwazEgKyB0a2lwX3Nib3goIChwcGswIF4gKCgyNTYqa2V5WzNdKSArIGtleVsyXSkpICUgNjU1MzYpOworCXBwazIgPSBwcGsyICsgdGtpcF9zYm94KCAocHBrMSBeICgoMjU2KmtleVs1XSkgKyBrZXlbNF0pKSAlIDY1NTM2KTsKKwlwcGszID0gcHBrMyArIHRraXBfc2JveCggKHBwazIgXiAoKDI1NiprZXlbN10pICsga2V5WzZdKSkgJSA2NTUzNik7CisJcHBrNCA9IHBwazQgKyB0a2lwX3Nib3goIChwcGszIF4gKCgyNTYqa2V5WzldKSArIGtleVs4XSkpICUgNjU1MzYpOworCXBwazUgPSBwcGs1ICsgdGtpcF9zYm94KCAocHBrNCBeICgoMjU2KmtleVsxMV0pICsga2V5WzEwXSkpICUgNjU1MzYpOworCisJcHBrMCA9IHBwazAgKyByb3RyMShwcGs1IF4gKCgyNTYqa2V5WzEzXSkgKyBrZXlbMTJdKSk7CisJcHBrMSA9IHBwazEgKyByb3RyMShwcGswIF4gKCgyNTYqa2V5WzE1XSkgKyBrZXlbMTRdKSk7CisJcHBrMiA9IHBwazIgKyByb3RyMShwcGsxKTsKKwlwcGszID0gcHBrMyArIHJvdHIxKHBwazIpOworCXBwazQgPSBwcGs0ICsgcm90cjEocHBrMyk7CisJcHBrNSA9IHBwazUgKyByb3RyMShwcGs0KTsKKworCS8qIFBoYXNlIDIsIFN0ZXAgMyAqLworICAgIC8qIFBoYXNlIDIsIFN0ZXAgMyAqLworCisJdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KKwl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOworCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLworCisJcmM0a2V5WzBdID0gKHRzYzIgPj4gOCkgJSAyNTY7CisJcmM0a2V5WzFdID0gKCgodHNjMiA+PiA4KSAlIDI1NikgfCAweDIwKSAmIDB4N2Y7CisJcmM0a2V5WzJdID0gdHNjMiAlIDI1NjsKKwlyYzRrZXlbM10gPSAoKHBwazUgXiAoKDI1NiprZXlbMV0pICsga2V5WzBdKSkgPj4gMSkgJSAyNTY7CisKKwlyYzRrZXlbNF0gPSBwcGswICUgMjU2OworCXJjNGtleVs1XSA9IChwcGswID4+IDgpICUgMjU2OworCisJcmM0a2V5WzZdID0gcHBrMSAlIDI1NjsKKwlyYzRrZXlbN10gPSAocHBrMSA+PiA4KSAlIDI1NjsKKworCXJjNGtleVs4XSA9IHBwazIgJSAyNTY7CisJcmM0a2V5WzldID0gKHBwazIgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbMTBdID0gcHBrMyAlIDI1NjsKKwlyYzRrZXlbMTFdID0gKHBwazMgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbMTJdID0gcHBrNCAlIDI1NjsKKwlyYzRrZXlbMTNdID0gKHBwazQgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbMTRdID0gcHBrNSAlIDI1NjsKKwlyYzRrZXlbMTVdID0gKHBwazUgPj4gOCkgJSAyNTY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbnN0cnVjdF9taWNfaGVhZGVyMSgpICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdWlsZHMgdGhlIGZpcnN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAqLworLyogaGVhZGVyIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19oZWFkZXIxKAorCXVuc2lnbmVkIGNoYXIgKm1pY19oZWFkZXIxLAorCWludCBoZWFkZXJfbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKm1wZHUpCit7CisJbWljX2hlYWRlcjFbMF0gPSAodW5zaWduZWQgY2hhcikoKGhlYWRlcl9sZW5ndGggLSAyKSAvIDI1Nik7CisJbWljX2hlYWRlcjFbMV0gPSAodW5zaWduZWQgY2hhcikoKGhlYWRlcl9sZW5ndGggLSAyKSAlIDI1Nik7CisJbWljX2hlYWRlcjFbMl0gPSBtcGR1WzBdICYgMHhjZjsgICAgLyogTXV0ZSBDRiBwb2xsICYgQ0YgYWNrIGJpdHMgKi8KKwltaWNfaGVhZGVyMVszXSA9IG1wZHVbMV0gJiAweGM3OyAgICAvKiBNdXRlIHJldHJ5LCBtb3JlIGRhdGEgYW5kIHB3ciBtZ3QgYml0cyAqLworCW1pY19oZWFkZXIxWzRdID0gbXBkdVs0XTsgICAgICAgLyogQTEgKi8KKwltaWNfaGVhZGVyMVs1XSA9IG1wZHVbNV07CisJbWljX2hlYWRlcjFbNl0gPSBtcGR1WzZdOworCW1pY19oZWFkZXIxWzddID0gbXBkdVs3XTsKKwltaWNfaGVhZGVyMVs4XSA9IG1wZHVbOF07CisJbWljX2hlYWRlcjFbOV0gPSBtcGR1WzldOworCW1pY19oZWFkZXIxWzEwXSA9IG1wZHVbMTBdOyAgICAgLyogQTIgKi8KKwltaWNfaGVhZGVyMVsxMV0gPSBtcGR1WzExXTsKKwltaWNfaGVhZGVyMVsxMl0gPSBtcGR1WzEyXTsKKwltaWNfaGVhZGVyMVsxM10gPSBtcGR1WzEzXTsKKwltaWNfaGVhZGVyMVsxNF0gPSBtcGR1WzE0XTsKKwltaWNfaGVhZGVyMVsxNV0gPSBtcGR1WzE1XTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbnN0cnVjdF9taWNfaGVhZGVyMigpICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdWlsZHMgdGhlIGxhc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICAqLworLyogaGVhZGVyIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19oZWFkZXIyKAorCXVuc2lnbmVkIGNoYXIgKm1pY19oZWFkZXIyLAorCXVuc2lnbmVkIGNoYXIgKm1wZHUsCisJaW50IGE0X2V4aXN0cywKKwlpbnQgcWNfZXhpc3RzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaTwxNjsgaSsrKSBtaWNfaGVhZGVyMltpXT0weDAwOworCisJbWljX2hlYWRlcjJbMF0gPSBtcGR1WzE2XTsgICAgLyogQTMgKi8KKwltaWNfaGVhZGVyMlsxXSA9IG1wZHVbMTddOworCW1pY19oZWFkZXIyWzJdID0gbXBkdVsxOF07CisJbWljX2hlYWRlcjJbM10gPSBtcGR1WzE5XTsKKwltaWNfaGVhZGVyMls0XSA9IG1wZHVbMjBdOworCW1pY19oZWFkZXIyWzVdID0gbXBkdVsyMV07CisKKwkvLyBJbiBTZXF1ZW5jZSBDb250cm9sIGZpZWxkLCBtdXRlIHNlcXVlbmNlIG51bWVyIGJpdHMgKDEyLWJpdCkKKwltaWNfaGVhZGVyMls2XSA9IG1wZHVbMjJdICYgMHgwZjsgICAvKiBTQyAqLworCW1pY19oZWFkZXIyWzddID0gMHgwMDsgLyogbXBkdVsyM107ICovCisKKwlpZiAoKCFxY19leGlzdHMpICYgYTRfZXhpc3RzKQorCXsKKwkJZm9yIChpPTA7aTw2O2krKykgbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07ICAgLyogQTQgKi8KKworCX0KKworCWlmIChxY19leGlzdHMgJiYgKCFhNF9leGlzdHMpKQorCXsKKwkJbWljX2hlYWRlcjJbOF0gPSBtcGR1WzI0XSAmIDB4MGY7IC8qIG11dGUgYml0cyAxNSAtIDQgKi8KKwkJbWljX2hlYWRlcjJbOV0gPSBtcGR1WzI1XSAmIDB4MDA7CisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCisJeworCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLworCisJCW1pY19oZWFkZXIyWzE0XSA9IG1wZHVbMzBdICYgMHgwZjsKKwkJbWljX2hlYWRlcjJbMTVdID0gbXBkdVszMV0gJiAweDAwOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19pdigpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgTUlDIElWIGZyb20gaGVhZGVyIGZpZWxkcyBhbmQgUE4gICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbnN0cnVjdF9taWNfaXYoCisJdW5zaWduZWQgY2hhciAqbWljX2l2LAorCWludCBxY19leGlzdHMsCisJaW50IGE0X2V4aXN0cywKKwl1bnNpZ25lZCBjaGFyICptcGR1LAorCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbmd0aCwKKwl1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IpCit7CisJaW50IGk7CisKKwltaWNfaXZbMF0gPSAweDU5OworCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQorCQltaWNfaXZbMV0gPSBtcGR1WzMwXSAmIDB4MGY7ICAgIC8qIFFvU19UQyAgICAgICAgICAgKi8KKwlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpCisJCW1pY19pdlsxXSA9IG1wZHVbMjRdICYgMHgwZjsgICAvKiBtdXRlIGJpdHMgNy00ICAgICovCisJaWYgKCFxY19leGlzdHMpCisJCW1pY19pdlsxXSA9IDB4MDA7CisJZm9yIChpID0gMjsgaSA8IDg7IGkrKykKKwkJbWljX2l2W2ldID0gbXBkdVtpICsgOF07ICAgICAgICAgICAgICAgICAgICAvKiBtaWNfaXZbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwkJZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQltaWNfaXZbaV0gPSBwbl92ZWN0b3JbaSAtIDhdOyAgICAgICAgICAgLyogbWljX2l2Wzg6MTNdID0gUE5bMDo1XSAqLworI2Vsc2UKKwkJZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQltaWNfaXZbaV0gPSBwbl92ZWN0b3JbMTMgLSBpXTsgICAgICAgICAgLyogbWljX2l2Wzg6MTNdID0gUE5bNTowXSAqLworI2VuZGlmCisJaSA9IChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7CisJaSA9IChwYXlsb2FkX2xlbmd0aCAlIDI1Nik7CisJbWljX2l2WzE0XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggLyAyNTYpOworCW1pY19pdlsxNV0gPSAodW5zaWduZWQgY2hhcikgKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGJpdHdpc2VfeG9yKCkgICAgICAgICAgICAgICAgICAgICovCisvKiBBIDEyOCBiaXQsIGJpdHdpc2UgZXhjbHVzaXZlIG9yICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBiaXR3aXNlX3hvcih1bnNpZ25lZCBjaGFyICppbmEsIHVuc2lnbmVkIGNoYXIgKmluYiwgdW5zaWduZWQgY2hhciAqb3V0KQoreworCWludCBpOworCWZvciAoaT0wOyBpPDE2OyBpKyspCisJeworCQlvdXRbaV0gPSBpbmFbaV0gXiBpbmJbaV07CisJfQorfQorCisKK3ZvaWQgYWVzMTI4azEyOGQodW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBjaGFyICpjaXBoZXJ0ZXh0KQoreworCWludCByb3VuZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWFbMTZdOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYlsxNl07CisJdW5zaWduZWQgY2hhciByb3VuZF9rZXlbMTZdOworCisJZm9yKGk9MDsgaTwxNjsgaSsrKSByb3VuZF9rZXlbaV0gPSBrZXlbaV07CisKKwlmb3IgKHJvdW5kID0gMDsgcm91bmQgPCAxMTsgcm91bmQrKykKKwl7CisJCWlmIChyb3VuZCA9PSAwKQorCQl7CisJCQl4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfQorCQllbHNlIGlmIChyb3VuZCA9PSAxMCkKKwkJeworCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7CisJCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCX0KKwkJZWxzZSAgICAvKiAxIC0gOSAqLworCQl7CisJCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKKwkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKKwkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMF0sICZpbnRlcm1lZGlhdGVhWzBdKTsKKwkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbNF0sICZpbnRlcm1lZGlhdGVhWzRdKTsKKwkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbOF0sICZpbnRlcm1lZGlhdGVhWzhdKTsKKwkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMTJdLCAmaW50ZXJtZWRpYXRlYVsxMl0pOworCQkJeG9yXzEyOChpbnRlcm1lZGlhdGVhLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOworCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7CisJCX0KKwl9CisKK30KKwordm9pZCBjb25zdHJ1Y3RfY3RyX3ByZWxvYWQoCisJdW5zaWduZWQgY2hhciAqY3RyX3ByZWxvYWQsCisJaW50IGE0X2V4aXN0cywKKwlpbnQgcWNfZXhpc3RzLAorCXVuc2lnbmVkIGNoYXIgKm1wZHUsCisJdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yLAorCWludCBjKQoreworCisJaW50IGkgPSAwOworCWZvciAoaT0wOyBpPDE2OyBpKyspIGN0cl9wcmVsb2FkW2ldID0gMHgwMDsKKwlpID0gMDsKKworCWN0cl9wcmVsb2FkWzBdID0gMHgwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZyAqLworCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKSBjdHJfcHJlbG9hZFsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAvKiBRb0NfQ29udHJvbCAgKi8KKwlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVsyNF0gJiAweDBmOworCisJZm9yIChpID0gMjsgaSA8IDg7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KKyNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCisJICBmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCWN0cl9wcmVsb2FkW2ldID0gICAgcG5fdmVjdG9yW2kgLSA4XTsgICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bMDo1XSAqLworI2Vsc2UKKwkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbMTMgLSBpXTsgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwljdHJfcHJlbG9hZFsxNF0gPSAgKHVuc2lnbmVkIGNoYXIpIChjIC8gMjU2KTsgLy8gQ3RyCisJY3RyX3ByZWxvYWRbMTVdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAlIDI1Nik7CisKK30KKworCisvLworLy8gVFJVRTogU3VjY2VzcyEKKy8vIEZBTFNFOiBEZWNyeXB0IEVycm9yIQorLy8KK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gVUNIQVIgICAgVXNlclByaW9yaXR5LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCit7CisJVUNIQVIJCQlLZXlJRDsKKwlVSU5UCQkJSGVhZGVyTGVuOworICAgIFVDSEFSCQkJZmMwOworCVVDSEFSCQkJZmMxOworCVVTSE9SVAkJCWZjOworCVVJTlQJCQlmcmFtZV90eXBlOworCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOworICAgIFVJTlQJCQlmcm9tX2RzOworICAgIFVJTlQJCQl0b19kczsKKwlJTlQJCQkJYTRfZXhpc3RzOworCUlOVAkJCQlxY19leGlzdHM7CisJVVNIT1JUCQkJZHVyYXRpb247CisJVVNIT1JUCQkJc2VxX2NvbnRyb2w7CisJVVNIT1JUCQkJcW9zX2NvbnRyb2w7CisJVUNIQVIJCQlUQVtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCVNBW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlSQzRLZXlbMTZdOworCVVJTlQJCQlwMWtbNV07IC8vZm9yIG1peF9rZXk7CisJVUxPTkcJCQlwbmw7LyogTGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBQTiAqLworCVVMT05HCQkJcG5oOy8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCVVJTlQJCQludW1fYmxvY2tzOworCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKKwlBUkNGT1VSQ09OVEVYVCAJQXJjRm91ckNvbnRleHQ7CisJVUlOVAkJCWNyYzMyID0gMDsKKwlVSU5UCQkJdHJhaWxmY3MgPSAwOworCVVDSEFSCQkJTUlDWzhdOworCVVDSEFSCQkJVHJhaWxNSUNbOF07CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJZmMwID0gKnBEYXRhOworCWZjMSA9ICoocERhdGEgKyAxKTsKKworCWZjID0gKigoUFVTSE9SVClwRGF0YSk7CisKKwlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKKwlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKKworICAgIGZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOworICAgIHRvX2RzID0gKGZjMSAmIDB4MSk7CisKKyAgICBhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKKyAgICBxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KKyAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8CisgICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQorICAgICAgICAgICAgICAgICApOworCisJSGVhZGVyTGVuID0gMjQ7CisJaWYgKGE0X2V4aXN0cykKKwkJSGVhZGVyTGVuICs9IDY7CisKKwlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRUS0lQIGZhaWxlZCEoS2V5SURbJWRdIExlbmd0aCBjYW4gbm90IGJlIDApXG4iLCBLZXlJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJZHVyYXRpb24gPSAqKChQVVNIT1JUKShwRGF0YSsyKSk7CisKKwlzZXFfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzIyKSk7CisKKwlpZiAocWNfZXhpc3RzKQorCXsKKwkJaWYgKGE0X2V4aXN0cykKKwkJeworCQkJcW9zX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSszMCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcW9zX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSsyNCkpOworCQl9CisJfQorCisJaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAxKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOyAgLy9CU1NJRAorCX0KKwllbHNlIGlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMCApCisJeworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSs0LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJfQorCWVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAwKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKKwl9CisJZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDEpCisJeworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzIyLCBNQUNfQUREUl9MRU4pOworCX0KKworCW51bV9ibG9ja3MgPSAoRGF0YUJ5dGVDbnQgLSAxNikgLyAxNjsKKwlwYXlsb2FkX3JlbWFpbmRlciA9IChEYXRhQnl0ZUNudCAtIDE2KSAlIDE2OworCisJcG5sID0gKCoocERhdGEgKyBIZWFkZXJMZW4pKSAqIDI1NiArICoocERhdGEgKyBIZWFkZXJMZW4gKyAyKTsKKwlwbmggPSAqKChQVUxPTkcpKHBEYXRhICsgSGVhZGVyTGVuICsgNCkpOworCXBuaCA9IGNwdTJsZTMyKHBuaCk7CisJUlRNUFRraXBNaXhLZXkocFdwYUtleVtLZXlJRF0uS2V5LCBUQSwgcG5sLCBwbmgsIFJDNEtleSwgcDFrKTsKKworCUFSQ0ZPVVJfSU5JVCgmQXJjRm91ckNvbnRleHQsIFJDNEtleSwgMTYpOworCisJQVJDRk9VUl9ERUNSWVBUKCZBcmNGb3VyQ29udGV4dCwgcERhdGEgKyBIZWFkZXJMZW4sIHBEYXRhICsgSGVhZGVyTGVuICsgOCwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4KTsKKwlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gNCwgNCk7CisJY3JjMzIgPSBSVE1QX0NBTENfRkNTMzIoUFBQSU5JVEZDUzMyLCBwRGF0YSArIEhlYWRlckxlbiwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gNCk7ICAvL1NraXAgSVYrRUlWIDggYnl0ZXMgJiBTa2lwIGxhc3QgNCBieXRlcyhGQ1MpLgorCWNyYzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKworICAgIGlmKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIElDViBFcnJvciAhXG4iKSk7CSAvL0lDViBlcnJvci4KKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA4IC0gNCwgOCk7CisJUlRNUEluaXRNSUNFbmdpbmUocEFkLCBwV3BhS2V5W0tleUlEXS5LZXksIERBLCBTQSwgVXNlclByaW9yaXR5LCBwV3BhS2V5W0tleUlEXS5SeE1pYyk7CisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSAxMik7CisJUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uVHgpOworCU5kaXNNb3ZlTWVtb3J5KE1JQywgcEFkLT5Qcml2YXRlSW5mby5UeC5NSUMsIDgpOworCisJaWYgKCFOZGlzRXF1YWxNZW1vcnkoTUlDLCBUcmFpbE1JQywgOCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBNSUMgRXJyb3IgIVxuIikpOwkgLy9NSUMgZXJyb3IuCisJCS8vUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgJnBXcGFLZXlbS2V5SURdKTsJLy8gbWFya2VkIGJ5IEFsYmVydFkgQCAyMDA2MDYzMAorCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICJSVE1QU29mdERlY3J5cHRUS0lQIERlY3JpcHQgZG9uZSEhXG4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworCisKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCit7CisJVUNIQVIJCQlLZXlJRDsKKwlVSU5UCQkJSGVhZGVyTGVuOworCVVDSEFSCQkJUE5bNl07CisJVUlOVAkJCXBheWxvYWRfbGVuOworCVVJTlQJCQludW1fYmxvY2tzOworCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKKwlVU0hPUlQJCQlmYzsKKwlVQ0hBUgkJCWZjMDsKKwlVQ0hBUgkJCWZjMTsKKwlVSU5UCQkJZnJhbWVfdHlwZTsKKwlVSU5UCQkJZnJhbWVfc3VidHlwZTsKKwlVSU5UCQkJZnJvbV9kczsKKwlVSU5UCQkJdG9fZHM7CisJSU5UCQkJCWE0X2V4aXN0czsKKwlJTlQJCQkJcWNfZXhpc3RzOworCVVDSEFSCQkJYWVzX291dFsxNl07CisJaW50IAkJCXBheWxvYWRfaW5kZXg7CisJVUlOVCAJCQlpOworCVVDSEFSIAkJCWN0cl9wcmVsb2FkWzE2XTsKKwlVQ0hBUiAJCQljaGFpbl9idWZmZXJbMTZdOworCVVDSEFSIAkJCXBhZGRlZF9idWZmZXJbMTZdOworCVVDSEFSIAkJCW1pY19pdlsxNl07CisJVUNIQVIgCQkJbWljX2hlYWRlcjFbMTZdOworCVVDSEFSIAkJCW1pY19oZWFkZXIyWzE2XTsKKwlVQ0hBUgkJCU1JQ1s4XTsKKwlVQ0hBUgkJCVRyYWlsTUlDWzhdOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKFBVU0hPUlQpcERhdGEpOworCisJZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7CisJZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7CisKKwlmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKKwl0b19kcyA9IChmYzEgJiAweDEpOworCisJYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7CisJcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8ICAgIC8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDA5KSB8fCAgIC8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fAorCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKwkJCQkgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKChQVUNIQVIpKHBEYXRhKyBIZWFkZXJMZW4gKyAzKSk7CisJS2V5SUQgPSBLZXlJRCA+PiA2OworCisJaWYgKHBXcGFLZXlbS2V5SURdLktleUxlbiA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0QUVTIGZhaWxlZCEoS2V5SURbJWRdIExlbmd0aCBjYW4gbm90IGJlIDApXG4iLCBLZXlJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJUE5bMF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4pOworCVBOWzFdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgMSk7CisJUE5bMl0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA0KTsKKwlQTlszXSA9ICoocERhdGErIEhlYWRlckxlbiArIDUpOworCVBOWzRdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNik7CisJUE5bNV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA3KTsKKworCXBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gODsJLy8gOCBieXRlcyBmb3IgQ0NNUCBoZWFkZXIgLCA4IGJ5dGVzIGZvciBNSUMKKwlwYXlsb2FkX3JlbWFpbmRlciA9IChwYXlsb2FkX2xlbikgJSAxNjsKKwludW1fYmxvY2tzID0gKHBheWxvYWRfbGVuKSAvIDE2OworCisKKworCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAorCXBheWxvYWRfaW5kZXggPSBIZWFkZXJMZW4gKyA4OyAvL0lWK0VJVgorCisJZm9yIChpPTA7IGk8IG51bV9ibG9ja3M7IGkrKykKKwl7CisJCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKKwkJCQkJCQkJYTRfZXhpc3RzLAorCQkJCQkJCQlxY19leGlzdHMsCisJCQkJCQkJCXBEYXRhLAorCQkJCQkJCQlQTiwKKwkJCQkJCQkJaSsxICk7CisKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CisKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlOZGlzTW92ZU1lbW9yeShwRGF0YSArIHBheWxvYWRfaW5kZXggLSA4LCBjaGFpbl9idWZmZXIsIDE2KTsKKwkJcGF5bG9hZF9pbmRleCArPSAxNjsKKwl9CisKKwkvLworCS8vIElmIHRoZXJlIGlzIGEgc2hvcnQgZmluYWwgYmxvY2ssIHRoZW4gcGFkIGl0CisJLy8gZW5jcnlwdCBpdCBhbmQgY29weSB0aGUgdW5wYWRkZWQgcGFydCBiYWNrCisJLy8KKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQorCXsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJCXFjX2V4aXN0cywKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCVBOLAorCQkJCQkJCQludW1fYmxvY2tzICsgMSk7CisKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlOZGlzTW92ZU1lbW9yeShwRGF0YSArIHBheWxvYWRfaW5kZXggLSA4LCBjaGFpbl9idWZmZXIsIHBheWxvYWRfcmVtYWluZGVyKTsKKwkJcGF5bG9hZF9pbmRleCArPSBwYXlsb2FkX3JlbWFpbmRlcjsKKwl9CisKKwkvLworCS8vIERlc2NyeXB0IHRoZSBNSUMKKwkvLworCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKKwkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJcWNfZXhpc3RzLAorCQkJCQkJCXBEYXRhLAorCQkJCQkJCVBOLAorCQkJCQkJCTApOworCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIDgpOworCisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CisKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCisJTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIGNoYWluX2J1ZmZlciwgOCk7CisKKwkvLworCS8vIENhbGN1bGF0ZSBNSUMKKwkvLworCisJLy9Gb3JjZSB0aGUgcHJvdGVjdGVkIGZyYW1lIGJpdCBvbgorCSoocERhdGEgKyAxKSA9ICoocERhdGEgKyAxKSB8IDB4NDA7CisKKwkvLyBGaW5kIHN0YXJ0IG9mIHBheWxvYWQKKwkvLyBCZWNhdXNlIHRoZSBDQ01QIGhlYWRlciBoYXMgYmVlbiByZW1vdmVkCisJcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbjsKKworCWNvbnN0cnVjdF9taWNfaXYoCisJCQkJCW1pY19pdiwKKwkJCQkJcWNfZXhpc3RzLAorCQkJCQlhNF9leGlzdHMsCisJCQkJCXBEYXRhLAorCQkJCQlwYXlsb2FkX2xlbiwKKwkJCQkJUE4pOworCisJY29uc3RydWN0X21pY19oZWFkZXIxKAorCQkJCQkJbWljX2hlYWRlcjEsCisJCQkJCQlIZWFkZXJMZW4sCisJCQkJCQlwRGF0YSk7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjIoCisJCQkJCQltaWNfaGVhZGVyMiwKKwkJCQkJCXBEYXRhLAorCQkJCQkJYTRfZXhpc3RzLAorCQkJCQkJcWNfZXhpc3RzKTsKKworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgbWljX2l2LCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjIsIGNoYWluX2J1ZmZlcik7CisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCisJLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggMTYgYnl0ZSBwYXlsb2FkIGJsb2NrCisJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKwl7CisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKKwkJcGF5bG9hZF9pbmRleCArPSAxNjsKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCX0KKworCS8vIEFkZCBvbiB0aGUgZmluYWwgcGF5bG9hZCBibG9jayBpZiBpdCBuZWVkcyBwYWRkaW5nCisJaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkKKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBwYXlsb2FkX3JlbWFpbmRlcik7CisKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCX0KKworCS8vIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50CisJLy8gOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDCisJZm9yIChpID0gMCA7IGkgPCA4OyBpKyspIE1JQ1tpXSA9IGFlc19vdXRbaV07CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgorCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFlczEyOGsxMjhkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGVyZm9ybXMgYSAxMjggYml0IEFFUyBlbmNyeXB0IHdpdGggICovCisvKiAxMjggYml0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCB4b3JfMTI4KAorCUlOICBQVUNIQVIgIGEsCisJSU4gIFBVQ0hBUiAgYiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDtpPDE2OyBpKyspCisJeworCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKKwl9Cit9CisKK1ZPSUQgbmV4dF9rZXkoCisJSU4gIFBVQ0hBUiAga2V5LAorCUlOICBJTlQgICAgIHJvdW5kKQoreworCVVDSEFSICAgICAgIHJjb247CisJVUNIQVIgICAgICAgc2JveF9rZXlbNF07CisJVUNIQVIgICAgICAgcmNvbl90YWJsZVsxMl0gPQorCXsKKwkJMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwKKwkJMHgxYiwgMHgzNiwgMHgzNiwgMHgzNgorCX07CisKKwlzYm94X2tleVswXSA9IFJUTVBDa2lwU2JveChrZXlbMTNdKTsKKwlzYm94X2tleVsxXSA9IFJUTVBDa2lwU2JveChrZXlbMTRdKTsKKwlzYm94X2tleVsyXSA9IFJUTVBDa2lwU2JveChrZXlbMTVdKTsKKwlzYm94X2tleVszXSA9IFJUTVBDa2lwU2JveChrZXlbMTJdKTsKKworCXJjb24gPSByY29uX3RhYmxlW3JvdW5kXTsKKworCXhvcl8zMigma2V5WzBdLCBzYm94X2tleSwgJmtleVswXSk7CisJa2V5WzBdID0ga2V5WzBdIF4gcmNvbjsKKworCXhvcl8zMigma2V5WzRdLCAma2V5WzBdLCAma2V5WzRdKTsKKwl4b3JfMzIoJmtleVs4XSwgJmtleVs0XSwgJmtleVs4XSk7CisJeG9yXzMyKCZrZXlbMTJdLCAma2V5WzhdLCAma2V5WzEyXSk7Cit9CisKK1ZPSUQgeG9yXzMyKAorCUlOICBQVUNIQVIgIGEsCisJSU4gIFBVQ0hBUiAgYiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDtpPDQ7IGkrKykKKwl7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKworVk9JRCBieXRlX3N1YigKKwlJTiAgUFVDSEFSICBpbiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDsgaTwgMTY7IGkrKykKKwl7CisJCW91dFtpXSA9IFJUTVBDa2lwU2JveChpbltpXSk7CisJfQorfQorCitVQ0hBUiBSVE1QQ2tpcFNib3goCisJSU4gIFVDSEFSICAgYSkKK3sKKwlyZXR1cm4gU2JveFRhYmxlWyhpbnQpYV07Cit9CisKK1ZPSUQgc2hpZnRfcm93KAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlvdXRbMF0gPSAgaW5bMF07CisJb3V0WzFdID0gIGluWzVdOworCW91dFsyXSA9ICBpblsxMF07CisJb3V0WzNdID0gIGluWzE1XTsKKwlvdXRbNF0gPSAgaW5bNF07CisJb3V0WzVdID0gIGluWzldOworCW91dFs2XSA9ICBpblsxNF07CisJb3V0WzddID0gIGluWzNdOworCW91dFs4XSA9ICBpbls4XTsKKwlvdXRbOV0gPSAgaW5bMTNdOworCW91dFsxMF0gPSBpblsyXTsKKwlvdXRbMTFdID0gaW5bN107CisJb3V0WzEyXSA9IGluWzEyXTsKKwlvdXRbMTNdID0gaW5bMV07CisJb3V0WzE0XSA9IGluWzZdOworCW91dFsxNV0gPSBpblsxMV07Cit9CisKK1ZPSUQgbWl4X2NvbHVtbigKKwlJTiAgUFVDSEFSICBpbiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UICAgICAgICAgaTsKKwlVQ0hBUiAgICAgICBhZGQxYls0XTsKKwlVQ0hBUiAgICAgICBhZGQxYmY3WzRdOworCVVDSEFSICAgICAgIHJvdGxbNF07CisJVUNIQVIgICAgICAgc3dhcF9oYWxmc1s0XTsKKwlVQ0hBUiAgICAgICBhbmRmN1s0XTsKKwlVQ0hBUiAgICAgICByb3RyWzRdOworCVVDSEFSICAgICAgIHRlbXBbNF07CisJVUNIQVIgICAgICAgdGVtcGJbNF07CisKKwlmb3IgKGk9MCA7IGk8NDsgaSsrKQorCXsKKwkJaWYgKChpbltpXSAmIDB4ODApPT0gMHg4MCkKKwkJCWFkZDFiW2ldID0gMHgxYjsKKwkJZWxzZQorCQkJYWRkMWJbaV0gPSAweDAwOworCX0KKworCXN3YXBfaGFsZnNbMF0gPSBpblsyXTsgICAgLyogU3dhcCBoYWxmcyAqLworCXN3YXBfaGFsZnNbMV0gPSBpblszXTsKKwlzd2FwX2hhbGZzWzJdID0gaW5bMF07CisJc3dhcF9oYWxmc1szXSA9IGluWzFdOworCisJcm90bFswXSA9IGluWzNdOyAgICAgICAgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCisJcm90bFsxXSA9IGluWzBdOworCXJvdGxbMl0gPSBpblsxXTsKKwlyb3RsWzNdID0gaW5bMl07CisKKwlhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKKwlhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKKwlhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKKwlhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKKworCWZvciAoaSA9IDM7IGk+MDsgaS0tKSAgICAvKiBsb2dpY2FsIHNoaWZ0IGxlZnQgMSBiaXQgKi8KKwl7CisJCWFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKKwkJaWYgKChhbmRmN1tpLTFdICYgMHg4MCkgPT0gMHg4MCkKKwkJeworCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKKwkJfQorCX0KKwlhbmRmN1swXSA9IGFuZGY3WzBdIDw8IDE7CisJYW5kZjdbMF0gPSBhbmRmN1swXSAmIDB4ZmU7CisKKwl4b3JfMzIoYWRkMWIsIGFuZGY3LCBhZGQxYmY3KTsKKworCXhvcl8zMihpbiwgYWRkMWJmNywgcm90cik7CisKKwl0ZW1wWzBdID0gcm90clswXTsgICAgICAgICAvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCisJcm90clswXSA9IHJvdHJbMV07CisJcm90clsxXSA9IHJvdHJbMl07CisJcm90clsyXSA9IHJvdHJbM107CisJcm90clszXSA9IHRlbXBbMF07CisKKwl4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7CisJeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsdGVtcGIpOworCXhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfd2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmOWU1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfd2VwLmMKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF93ZXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTEwLTI4LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK1VJTlQgRkNTVEFCXzMyWzI1Nl0gPQoreworCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCisJMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKKwkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCisJMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKKwkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAorCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCisJMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKKwkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAorCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCisJMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKKwkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCisJMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKKwkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAorCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCisJMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKKwkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAorCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCisJMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKKwkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCisJMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKKwkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAorCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCisJMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKKwkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAorCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCisJMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKKwkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCisJMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKKwkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAorCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCisJMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKKwkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAorCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCisJMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKKwkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCisJMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKKwkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAorCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCisJMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKKwkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAorCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCisJMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKKwkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCisJMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKKwkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAorCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCisJMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKKwkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAorCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCisJMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKKwkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCisJMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKKwkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAorCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCisJMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKKwkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAorCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKK307CisKKy8qCitVQ0hBUiAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKyAqLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBXRVAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlJZAkJICAgV0VQIEtleSBJRAorCQlLZXlMZW4gICAgICB0aGUgbGVuZ3RoIG9mIFdFUCBLRVkKKwkJcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hpY2ggRW5jcnlwdGlvbiBkYXRhIHdpbGwgc3RvcmUgaW4uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRXZXBFbmdpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglVQ0hBUgkJCUtleUlkLAorCUlOCVVDSEFSCQkJS2V5TGVuLAorCUlOIE9VVAlQVUNIQVIJCXBEZXN0KQoreworCVVJTlQgaTsKKwlVQ0hBUiAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7ICAgLy9Jbml0IGNyYzMyLgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLmJDa2lwT24gJiYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgxMCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorICAgIHsKKyAgICAgICAgQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBLZXksIEtleUxlbik7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwS2V5LCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICB7CisJCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBLZXksIEtleUxlbik7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJV0VQS0VZW2ldID0gUmFuZG9tQnl0ZShwQWQpOyAgIC8vQ2FsbCBtbG1lIFJhbmRvbUJ5dGUoKSBmdW5jdGlvbi4KKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFdFUEtFWSwgS2V5TGVuICsgMyk7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIFdFUEtFWSwgMyk7ICAvL0FwcGVuZCBJbml0IFZlY3RvcgorICAgIH0KKwkqKHBEZXN0KzMpID0gKEtleUlkIDw8IDYpOyAgICAgICAvL0FwcGVuZCBLRVlJRAorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlFbmNyeXB0IHRyYW5zaW1pdHRlZCBkYXRhCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHRyYW5zaW1pdHRlZCBzb3VyY2UgZGF0YSB0aGF0IHdpbGwgYmUgZW5jcnlwdAorICAgICAgcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hlcmUgZW50cnlwdGlvbiBkYXRhIHdpbGwgYmUgc3RvcmUgaW4uCisgICAgICBMZW4JCQlJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorICAgICAgTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QRW5jcnlwdERhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwRGVzdCwKKwlJTglVSU5UCQkJTGVuKQoreworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgcFNyYywgTGVuKTsKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIHBTcmMsIExlbik7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCURlY3J5cHQgcmVjZWl2ZWQgV0VQIGRhdGEKKworCUFyZ3VtZW50czoKKwkJcEFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgZGF0YQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIERlY3J5cHQgV0VQIGRhdGEgc3VjY2VzcworCQlGQUxTRSAgICAgICBEZWNyeXB0IFdFUCBkYXRhIGZhaWxlZAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFNvZnREZWNyeXB0V0VQKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBQVUNIQVIJCQlwRGF0YSwKKwlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpCit7CisJVUlOVAl0cmFpbGZjczsKKwlVSU5UICAgIGNyYzMyOworCVVDSEFSCUtleUlkeDsKKwlVQ0hBUiAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKwlVQ0hBUiAJKnBQYXlsb2FkID0gKFVDSEFSICopcERhdGEgKyBMRU5HVEhfODAyXzExOworCVVMT05HCXBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBMRU5HVEhfODAyXzExOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZLCBwUGF5bG9hZCwgMyk7ICAgIC8vR2V0IFdFUCBJVgorCisJS2V5SWR4ID0gKCoocFBheWxvYWQgKyAzKSAmIDB4YzApID4+IDY7CisJaWYgKHBHcm91cEtleVtLZXlJZHhdLktleUxlbiA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBHcm91cEtleVtLZXlJZHhdLktleSwgcEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuKTsKKwlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4gKyAzKTsKKwlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcFBheWxvYWQsIHBQYXlsb2FkICsgNCwgcGF5bG9hZF9sZW4gLSA0KTsKKwlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBQYXlsb2FkICsgcGF5bG9hZF9sZW4gLSA4LCA0KTsKKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBQYXlsb2FkLCBwYXlsb2FkX2xlbiAtIDgpOyAgLy9Ta2lwIGxhc3QgNCBieXRlcyhGQ1MpLgorCWNyYzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKworICAgIGlmKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkKKyAgICB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEgV0VQIERhdGEgQ1JDIEVycm9yICFcbiIpKTsJIC8vQ1JDIGVycm9yLgorCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVRoZSBTdHJlYW0gQ2lwaGVyIEVuY3J5cHRpb24gQWxnb3JpdGhtICJBUkNGT1VSIiBpbml0aWFsaXplCisKKwlBcmd1bWVudHM6CisJICAgQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBLZXkgICAgICAgIFBvaW50ZXIgdG8gdGhlIFdFUCBLRVkKKwkJS2V5TGVuICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBmbyB0aGUgV0VQIEtFWQorCisJUmV0dXJuIFZhbHVlOgorCSAgIE5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9JTklUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglVSU5UCQkJS2V5TGVuKQoreworCVVDSEFSCXQsIHU7CisJVUlOVAlrZXlpbmRleDsKKwlVSU5UCXN0YXRlaW5kZXg7CisJUFVDSEFSCXN0YXRlOworCVVJTlQJY291bnRlcjsKKworCXN0YXRlID0gQ3R4LT5TVEFURTsKKwlDdHgtPlggPSAwOworCUN0eC0+WSA9IDA7CisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKQorCQlzdGF0ZVtjb3VudGVyXSA9IChVQ0hBUiljb3VudGVyOworCWtleWluZGV4ID0gMDsKKwlzdGF0ZWluZGV4ID0gMDsKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCisJeworCQl0ID0gc3RhdGVbY291bnRlcl07CisJCXN0YXRlaW5kZXggPSAoc3RhdGVpbmRleCArIHBLZXlba2V5aW5kZXhdICsgdCkgJiAweGZmOworCQl1ID0gc3RhdGVbc3RhdGVpbmRleF07CisJCXN0YXRlW3N0YXRlaW5kZXhdID0gdDsKKwkJc3RhdGVbY291bnRlcl0gPSB1OworCQlpZiAoKytrZXlpbmRleCA+PSBLZXlMZW4pCisJCQlrZXlpbmRleCA9IDA7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IGJ5dGVzIGZyb20gQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKworCVJldHVybiBWYWx1ZToKKwkgICBVQ0hBUiAgLSB0aGUgdmFsdWUgb2YgdGhlIEFSQ0ZPVVIgQ09OVEVYVCAoUy1CT1gpCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUNIQVIJQVJDRk9VUl9CWVRFKAorCUlOCVBBUkNGT1VSQ09OVEVYVAkJQ3R4KQoreworICBVSU5UIHg7CisgIFVJTlQgeTsKKyAgVUNIQVIgc3gsIHN5OworICBQVUNIQVIgc3RhdGU7CisKKyAgc3RhdGUgPSBDdHgtPlNUQVRFOworICB4ID0gKEN0eC0+WCArIDEpICYgMHhmZjsKKyAgc3ggPSBzdGF0ZVt4XTsKKyAgeSA9IChzeCArIEN0eC0+WSkgJiAweGZmOworICBzeSA9IHN0YXRlW3ldOworICBDdHgtPlggPSB4OworICBDdHgtPlkgPSB5OworICBzdGF0ZVt5XSA9IHN4OworICBzdGF0ZVt4XSA9IHN5OworCisgIHJldHVybihzdGF0ZVsoc3ggKyBzeSkgJiAweGZmXSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVRoZSBTdHJlYW0gQ2lwaGVyIERlY3J5cHRpb24gQWxnb3JpdGhtCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCisJCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFSQ0ZPVVJfREVDUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCisJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFSQ0ZPVVJfRU5DUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCisJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gd2hpY2ggY29uZm9ybSB0byB0aGUgc3BlY2lhbCByZXF1aXJlbWVudCB0byBlbmNyeXB0ICBHVEsuCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCisJCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkdGEKKworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitWT0lECVdQQUFSQ0ZPVVJfRU5DUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisgICAgICAgIC8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBBUkNGT1VSX0JZVEUoQ3R4KTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSBhIG5ldyBGQ1MgZ2l2ZW4gdGhlIGN1cnJlbnQgRkNTIGFuZCB0aGUgbmV3IGRhdGEuCisKKwlBcmd1bWVudHM6CisJCUZjcwkgICAgICB0aGUgb3JpZ2luYWwgRkNTIHZhbHVlCisJCUNwICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSBjYWxjdWxhdGUgdGhlIEZDUworCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCVVJTlQgLSBGQ1MgMzIgYml0cworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUlOVAlSVE1QX0NBTENfRkNTMzIoCisJSU4JVUlOVAlGY3MsCisJSU4JUFVDSEFSCUNwLAorCUlOCUlOVAkJTGVuKQoreworCXdoaWxlIChMZW4tLSkKKwkgICBGY3MgPSAoKChGY3MpID4+IDgpIF4gRkNTVEFCXzMyWygoRmNzKSBeICgqQ3ArKykpICYgMHhmZl0pOworCisJcmV0dXJuIChGY3MpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgbGFzdCBGQ1MgYW5kIGVuY3J5cHQgaXQgdG8gdGhlIGRlc3RpbmF0aW9uCisKKwlBcmd1bWVudHM6CisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldElDVigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJcERlc3QpCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiBePSAweGZmZmZmZmZmOyAgICAgICAgICAgICAvKiBjb21wbGVtZW50ICovCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IGNwdTJsZTMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIpOworCisJQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LCAoUFVDSEFSKSAmcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgNCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2J1bGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2J1bGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzZiYTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jCkBAIC0wLDAgKzEsMTk4MSBAQAorIC8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnR1c2JfYnVsay5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCU1vZGlmaWNhdGlvbiBsb2dzCisJUGF1bCBMaW4JMDYtMjUtMjAwNAljcmVhdGVkCisKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKy8vIE1hdGNoIHRvdGFsIDYgYnVsa291dCBlbmRwb2ludCB0byBjb3JyZXNwb25kaW5nIHF1ZXVlLgorVUNIQVIJRXBUb1F1ZXVlWzZdPXtGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19NR01UfTsKKworLy9zdGF0aWMgQk9PTEVBTiBTaW5nbGVCdWxrT3V0ID0gRkFMU0U7CisKK3ZvaWQgUlRVU0JfRklMTF9CVUxLX1VSQiAoc3RydWN0IHVyYiAqcFVyYiwKKwlzdHJ1Y3QgdXNiX2RldmljZSAqcFVzYl9EZXYsCisJdW5zaWduZWQgaW50IGJ1bGtwaXBlLAorCXZvaWQgKnBUcmFuc2ZlckJ1ZiwKKwlpbnQgQnVmU2l6ZSwKKwl1c2JfY29tcGxldGVfdCBDb21wbGV0ZSwKKwl2b2lkICpwQ29udGV4dCkKK3sKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwl1c2JfZmlsbF9idWxrX3VyYihwVXJiLCBwVXNiX0RldiwgYnVsa3BpcGUsIHBUcmFuc2ZlckJ1ZiwgQnVmU2l6ZSwgKHVzYl9jb21wbGV0ZV90KUNvbXBsZXRlLCBwQ29udGV4dCk7CisjZWxzZQorCUZJTExfQlVMS19VUkIocFVyYiwgcFVzYl9EZXYsIGJ1bGtwaXBlLCBwVHJhbnNmZXJCdWYsIEJ1ZlNpemUsIENvbXBsZXRlLCBwQ29udGV4dCk7CisjZW5kaWYKKworfQorCitWT0lECVJUVVNCSW5pdFR4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhfQ09OVEVYVAkJcFR4Q29udGV4dCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JdXNiX2NvbXBsZXRlX3QJRnVuYykKK3sKKwlQVVJCCQkJCXBVcmI7CisJUFVDSEFSCQkJCXBTcmMgPSBOVUxMOworCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJcFVyYiA9IHBUeENvbnRleHQtPnBVcmI7CisJQVNTRVJUKHBVcmIpOworCisJLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwlwVHhDb250ZXh0LT5CdWxrT3V0UGlwZUlkID0gQnVsa091dFBpcGVJZDsKKworCWlmIChwVHhDb250ZXh0LT5iQWdncmVnYXRpYmxlKQorCXsKKwkJcFNyYyA9ICZwVHhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+QWdncmVnYXRpb25bMl07CisJfQorCWVsc2UKKwl7CisJCXBTcmMgPSAoUFVDSEFSKSBwVHhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXQ7CisJfQorCisKKwkvL0luaXRpYWxpemUgYSB0eCBidWxrIHVyYgorCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKKwkJCQkJCXBPYmotPnBVc2JfRGV2LAorCQkJCQkJdXNiX3NuZGJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dFBpcGVJZF0pLAorCQkJCQkJcFNyYywKKwkJCQkJCXBUeENvbnRleHQtPkJ1bGtPdXRTaXplLAorCQkJCQkJRnVuYywKKwkJCQkJCXBUeENvbnRleHQpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWlmIChwVHhDb250ZXh0LT5iQWdncmVnYXRpYmxlKQorCQlwVXJiLT50cmFuc2Zlcl9kbWEJPSAocFR4Q29udGV4dC0+ZGF0YV9kbWEgKyBUWF9CVUZGRVJfTk9STVNJWkUgKyAyKTsKKwllbHNlCisJCXBVcmItPnRyYW5zZmVyX2RtYQk9IHBUeENvbnRleHQtPmRhdGFfZG1hOworCisJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisjZW5kaWYKKworfQorCitWT0lECVJUVVNCSW5pdEhUVHhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIVF9UWF9DT05URVhUCXBUeENvbnRleHQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAorCUlOCVVMT05HCQkJQnVsa091dFNpemUsCisJSU4JdXNiX2NvbXBsZXRlX3QJRnVuYykKK3sKKwlQVVJCCQkJCXBVcmI7CisJUFVDSEFSCQkJCXBTcmMgPSBOVUxMOworCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJcFVyYiA9IHBUeENvbnRleHQtPnBVcmI7CisJQVNTRVJUKHBVcmIpOworCisJLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwlwVHhDb250ZXh0LT5CdWxrT3V0UGlwZUlkID0gQnVsa091dFBpcGVJZDsKKworCXBTcmMgPSAmcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W3BUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOworCisKKwkvL0luaXRpYWxpemUgYSB0eCBidWxrIHVyYgorCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKKwkJCQkJCXBPYmotPnBVc2JfRGV2LAorCQkJCQkJdXNiX3NuZGJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dFBpcGVJZF0pLAorCQkJCQkJcFNyYywKKwkJCQkJCUJ1bGtPdXRTaXplLAorCQkJCQkJRnVuYywKKwkJCQkJCXBUeENvbnRleHQpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXBVcmItPnRyYW5zZmVyX2RtYQk9IChwVHhDb250ZXh0LT5kYXRhX2RtYSArIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pOworCXBVcmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworI2VuZGlmCisKK30KKworVk9JRAlSVFVTQkluaXRSeERlc2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQpCit7CisJUFVSQgkJCQlwVXJiOworCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCVVMT05HCQkJCVJYX2J1bGtfc2l6ZTsKKworCisJcFVyYiA9IHBSeENvbnRleHQtPnBVcmI7CisJQVNTRVJUKHBVcmIpOworCisJaWYgKCBwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNjQpCisJCVJYX2J1bGtfc2l6ZSA9IDQwOTY7CisJZWxzZQorCQlSWF9idWxrX3NpemUgPSBNQVhfUlhCVUxLX1NJWkU7CisKKwkvL0luaXRpYWxpemUgYSByeCBidWxrIHVyYgorCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKKwkJCQkJCXBPYmotPnBVc2JfRGV2LAorCQkJCQkJdXNiX3JjdmJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtJbkVwQWRkciksCisJCQkJCQkmKHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyW3BBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb25dKSwKKwkJCQkJCVJYX2J1bGtfc2l6ZSAtIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uKSwKKwkJCQkJCSh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtSeENvbXBsZXRlLAorCQkJCQkJKHZvaWQgKilwUnhDb250ZXh0KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlwVXJiLT50cmFuc2Zlcl9kbWEJPSBwUnhDb250ZXh0LT5kYXRhX2RtYSArIHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb247CisJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisjZW5kaWYKKworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2RlZmluZSBCVUxLX09VVF9MT0NLKHBMb2NrLCBJcnFGbGFncykJXAorCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKKwkJCVJUTVBfSVJRX0xPQ0soKHBMb2NrKSwgSXJxRmxhZ3MpOworCisjZGVmaW5lIEJVTEtfT1VUX1VOTE9DSyhwTG9jaywgSXJxRmxhZ3MpCVwKKwkJaWYoMSAvKiEoaW5faW50ZXJydXB0KCkgJiAweGZmZmYwMDAwKSovKQlcCisJCQlSVE1QX0lSUV9VTkxPQ0soKHBMb2NrKSwgSXJxRmxhZ3MpOworCisKK1ZPSUQJUlRVU0JCdWxrT3V0RGF0YVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKworCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dDsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwlQVFhJTkZPX1NUUlVDCXBUeEluZm8sIHBMYXN0VHhJbmZvID0gTlVMTDsKKwlQVFhXSV9TVFJVQyAgICAgICAgICAgICBwVHhXSTsKKwlVTE9ORwkJCVRtcEJ1bGtFbmRQb3MsIFRoaXNCdWxrU2l6ZTsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMCwgSXJxRmxhZ3MyID0gMDsKKwlQVUNIQVIJCQlwV2lyZWxlc3NQa3QsIHBBcHBlbmRhbnQ7CisJQk9PTEVBTgkJCWJUeFFMYXN0Um91bmQgPSBGQUxTRTsKKwlVQ0hBUgkJCWFsbHplcm9bNF09IHsweDAsMHgwLDB4MCwweDB9OworCisJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKKwl7CisJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBUUlVFOworCisJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJKQorCXsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCisJcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXSk7CisKKwlCVUxLX09VVF9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKQorCQl8fCAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24tOCkgPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwl7CisJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzMik7CisKKwkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisKKwkJLy8gQ2xlYXIgRGF0YSBmbGFnCisJCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvLyBDbGVhciBEYXRhIGZsYWcKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSk7CisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisKKwkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQnVsa091dC1COkk9MHglbHgsIENXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIGluX2ludGVycnVwdCgpLAorCS8vCQkJCQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkvLwkJCQkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOworCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA9IHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb247CisJVGhpc0J1bGtTaXplID0gMDsKKwlUbXBCdWxrRW5kUG9zID0gcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uOworCXBXaXJlbGVzc1BrdCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKworCWlmICgocEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPT0gVFJVRSkpCisJeworCQlpZiAoUlRNUEVxdWFsTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsIGFsbHplcm8sNCkpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoImUxLCBhbGx6ZXJvIDogJXggICV4ICAleCAgJXggICV4ICAleCAgJXggICV4IFxuIiwKKwkJCQlwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzFdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzJdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbM10KKwkJCQkscEhUVFhDb250ZXh0LT5TYXZlZFBhZFs0XSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs1XSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs2XSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzddKSk7CisJCX0KKwkJTmRpc01vdmVNZW1vcnkoJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgOCk7CisJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gRkFMU0U7CisJCWlmIChwQWQtPmJGb3JjZVByaW50VFggPT0gVFJVRSkKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldCAtLT4gQ09QWSBQQUQuIEN1cldyaXRlID0gJWxkLCBOZXh0QnVsayA9ICVsZC4gICBFTmV4dEJ1bGsgPSAlbGQuXG4iLCAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKSk7CisJfQorCisJZG8KKwl7CisJCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdOworCQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3MgKyBUWElORk9fU0laRV07CisKKwkJaWYgKHBBZC0+YkZvcmNlUHJpbnRUWCA9PSBUUlVFKQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldCBBTVBEVSA9ICVkLlxuIiwgICBwVHhXSS0+QU1QRFUpKTsKKworCQkvLyBhZGQgYnkgSXZlcnNvbiwgbGltaXQgQnVsa091dCBzaXplIHRvIDRrIHRvIHBhc3MgV01NIGIgbW9kZSAyVDFSIHRlc3QgaXRlbXMKKwkJLy9pZiAoKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkKKwkJaWYgKChUaGlzQnVsa1NpemUgIT0gMCkgJiYgKHBUeFdJLT5QSFlNT0RFID09IE1PREVfQ0NLKSkKKwkJeworCQkJaWYgKCgoVGhpc0J1bGtTaXplJjB4ZmZmZjgwMDApICE9IDApIHx8ICgoVGhpc0J1bGtTaXplJjB4MTAwMCkgPT0gMHgxMDAwKSkKKwkJCXsKKwkJCQkvLyBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgNGsgYnl0ZXMuCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICgoKHBBZC0+QnVsa091dE1heFBhY2tldFNpemUgPCA1MTIpICYmICgoVGhpc0J1bGtTaXplJjB4ZmZmZmY4MDApICE9IDApICkgLyp8fCAoIChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpKi8pCisJCQl7CisJCQkJLy8gRm9yIFVTQiAxLjEgb3IgcGVlciB3aGljaCBkaWRuJ3Qgc3VwcG9ydCBBTVBEVSwgbGltaXQgdGhlIEJ1bGtPdXQgc2l6ZS4KKwkJCQkvLyBGb3IgcGVyZm9ybWVuY2UgaW4gYi9nIG1vZGUsIG5vdyBqdXN0IGNoZWNrIGZvciBVU0IgMS4xIGFuZCBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgQVBNRFUgb3Igbm90ISAyMDA4LzA2LzA0LgorCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIGVuZCBJdmVyc29uCisJCWVsc2UKKwkJeworCQkJaWYgKCgoVGhpc0J1bGtTaXplJjB4ZmZmZjgwMDApICE9IDApIHx8ICgoVGhpc0J1bGtTaXplJjB4NjAwMCkgPT0gMHg2MDAwKSkKKwkJCXsJLy8gTGltaXQgQnVsa091dCBzaXplIHRvIGFib3V0IDI0ayBieXRlcy4KKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikgJiYgKChUaGlzQnVsa1NpemUmMHhmZmZmZjgwMCkgIT0gMCkgKSAvKnx8ICggKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkqLykKKwkJCXsJLy8gRm9yIFVTQiAxLjEgb3IgcGVlciB3aGljaCBkaWRuJ3Qgc3VwcG9ydCBBTVBEVSwgbGltaXQgdGhlIEJ1bGtPdXQgc2l6ZS4KKwkJCQkvLyBGb3IgcGVyZm9ybWVuY2UgaW4gYi9nIG1vZGUsIG5vdyBqdXN0IGNoZWNrIGZvciBVU0IgMS4xIGFuZCBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgQVBNRFUgb3Igbm90ISAyMDA4LzA2LzA0LgorCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKFRtcEJ1bGtFbmRQb3MgPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKQorCQl7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBUeEluZm8tPlFTRUwgIT0gRklGT19FRENBKQorCQl7CisJCQlwcmludGsoIiVzKCk6ID09PT0+IHBUeEluZm8tPlF1ZXVlU2VsKCVkKSE9IEZJRk9fRURDQSEhISFcbiIsIF9fRlVOQ1RJT05fXywgcFR4SW5mby0+UVNFTCk7CisJCQlwcmludGsoIlx0Q1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKTsKKwkJCWhleF9kdW1wKCJXcm9uZyBRU2VsIFBrdDoiLCAoUFVDSEFSKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc10sIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gLSBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKTsKKwkJfQorCisJCWlmIChwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA8PSA4KQorCQl7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLypSVF9ERUJVR19UUkFDRSovLCgiZTIsIFVTQkRNQVR4UGt0TGVuPT0wLCBTaXplPSVsZCwgYkNTUGFkPSVkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgQ1dSUG9zPSVsZCFcbiIsCisJCQkJCXBIVFRYQ29udGV4dC0+QnVsa091dFNpemUsIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MpKTsKKwkJCXsKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IgLypSVF9ERUJVR19UUkFDRSovLCgiJXggICV4ICAleCAgJXggICV4ICAleCAgJXggICV4IFxuIiwKKwkJCQkJcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsxXSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsyXSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzNdCisJCQkJCSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzRdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzVdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzZdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKKwkJCX0KKwkJCXBBZC0+YkZvcmNlUHJpbnRUWCA9IFRSVUU7CisJCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIk91dDpwVHhJbmZvLT5VU0JETUFUeFBrdExlbj0lZCFcbiIsIHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuKSk7CisJCQlyZXR1cm47CisJCX0KKworCQkJLy8gSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisKKwkJcExhc3RUeEluZm8gPSBwVHhJbmZvOworCisJCS8vIE1ha2Ugc3VyZSB3ZSB1c2UgRURDQSBRVUVVRS4KKwkJcFR4SW5mby0+UVNFTCA9IEZJRk9fRURDQTsKKwkJVGhpc0J1bGtTaXplICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbis0KTsKKwkJVG1wQnVsa0VuZFBvcyArPSAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4rNCk7CisKKwkJaWYgKFRtcEJ1bGtFbmRQb3MgIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKQorCQkJcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDE7CisKKwkJaWYgKHBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID09IDEpCisJCXsKKwkJCWlmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPT0gOCkKKwkJCQlwVHhJbmZvLT5VU0JETUFOZXh0VkxEID0gMDsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMDsKKworCQkJYlR4UUxhc3RSb3VuZCA9IFRSVUU7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gODsKKworCSNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEluZm8sIFRZUEVfVFhJTkZPKTsKKwkJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOworCSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4SW5mbywgVFlQRV9UWElORk8pOworCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwl9d2hpbGUgKFRSVUUpOworCisJLy8gYWRqdXN0IHRoZSBwVHhJbmZvLT5VU0JETUFOZXh0VkxEIHZhbHVlIG9mIGxhc3QgcFR4SW5mby4KKwlpZiAocExhc3RUeEluZm8pCisJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwTGFzdFR4SW5mbywgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJcExhc3RUeEluZm8tPlVTQkRNQU5leHRWTEQgPSAwOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwTGFzdFR4SW5mbywgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwl9CisKKwkvKgorCQlXZSBuZWVkIHRvIGNvcHkgU2F2ZWRQYWQgd2hlbiBmb2xsb3dpbmcgY29uZGl0aW9uIG1hdGNoZWQhCisJCQkxLiBOb3QgdGhlIGxhc3Qgcm91bmQgb2YgdGhlIFR4UXVldWUgYW5kCisJCQkyLiBhbnkgbWF0Y2ggb2YgZm9sbG93aW5nIGNhc2VzOgorCQkJCSgxKS4gVGhlIEVuZCBQb3NpdGlvbiBvZiB0aGlzIGJ1bGsgb3V0IGlzIHJlYWNoIHRvIHRoZSBDdXJyZW5jdCBXcml0ZSBwb3NpdGlvbiBhbmQKKwkJCQkJCXRoZSBUeEluZm8gYW5kIHJlbGF0ZWQgaGVhZGVyIGFscmVhZHkgd3JpdGUgdG8gdGhlIEN1cldyaXRlUG9zaXRpb24uCisJCQkgICAJCT0+KEVOZXh0QnVsa091dFBvc2l0aW9uID09IEN1cldyaXRlUG9zaXRpb24pICYmIChDdXJXcml0ZVJlYWxQb3MgPiBDdXJXcml0ZVBvc2l0aW9uKQorCisJCQkJKDIpLiBUaGUgRW5kUG9zaXRpb24gb2YgdGhlIGJ1bGsgb3V0IGlzIG5vdCByZWFjaCB0byB0aGUgQ3VycmVudCBXcml0ZSBQb3NpdGlvbi4KKwkJCQkJPT4oRU5leHRCdWxrT3V0UG9zaXRpb24gIT0gQ3VyV3JpdGVQb3NpdGlvbikKKwkqLworCWlmICgoYlR4UUxhc3RSb3VuZCA9PSBGQUxTRSkgJiYKKwkJICgoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB8fAorCQkgIChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsICZwV2lyZWxlc3NQa3RbcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbl0sIDgpOworCQlwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9IFRSVUU7CisJCWlmIChSVE1QRXF1YWxNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgYWxsemVybyw0KSkKKwkJeworCQkJUFVDSEFSCXBCdWYgPSAmcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIldBUk5JTkctWmVyby0zOiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LENXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgYkNXPSVkLCBOQlBvcz0lbGQsIFRCUG9zPSVsZCwgVEJTaXplPSVsZFxuIiwKKwkJCQlwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLHBCdWZbM10scEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSxwQnVmWzddLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLAorCQkJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcsIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgVG1wQnVsa0VuZFBvcywgVGhpc0J1bGtTaXplKSk7CisKKwkJCXBCdWYgPSAmcFdpcmVsZXNzUGt0W3BIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbl07CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJcdENXUG9zPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLHBCdWZbM10scEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSxwQnVmWzddKSk7CisJCX0KKwkJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiRU5Qb3M9PUNXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgYkNTUGFkPSVkIVxuIiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKwl9CisKKwlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQnVsa091dC1BOlNpemU9JWxkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBUaGlzQnVsa1NpemUsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOworCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkJ1bGtPdXQtQTpTaXplPSVsZCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBiTFJvdW5kPSVkIVxuIiwgVGhpc0J1bGtTaXplLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBiVHhRTGFzdFJvdW5kKSk7CisKKwkJLy8gVVNCIERNQSBlbmdpbmUgcmVxdWlyZXMgdG8gcGFkIGV4dHJhIDQgYnl0ZXMuIFRoaXMgcGFkIGRvZXNuJ3QgY291bnQgaW50byByZWFsIGJ1bGtvdXRzaXplLgorCXBBcHBlbmRhbnQgPSAmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdOworCU5kaXNaZXJvTWVtb3J5KHBBcHBlbmRhbnQsIDgpOworCQlUaGlzQnVsa1NpemUgKz0gNDsKKwkJcEhUVFhDb250ZXh0LT5MYXN0T25lID0gVFJVRTsKKwkJaWYgKChUaGlzQnVsa1NpemUgJSBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSA9PSAwKQorCQkJVGhpc0J1bGtTaXplICs9IDQ7CisJcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IFRoaXNCdWxrU2l6ZTsKKworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbQnVsa091dFBpcGVJZF0gPSAxOworCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzMik7CisKKwkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgorCVJUVVNCSW5pdEhUVHhEZXNjKHBBZCwgcEhUVFhDb250ZXh0LCBCdWxrT3V0UGlwZUlkLCBUaGlzQnVsa1NpemUsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUpOworCisJcFVyYiA9IHBIVFRYQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0OiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisKKwkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbQnVsa091dFBpcGVJZF0gPSAwOworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCQlyZXR1cm47CisJfQorCisJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UmVxKys7CisKK30KKworCitWT0lEIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlXG4iKSk7CisKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQk9IHBIVFRYQ29udGV4dC0+cEFkOworCXBPYmogCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlTdGF0dXMJCT0gcFVyYi0+c3RhdHVzOworCisJLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwlCdWxrT3V0UGlwZUlkID0gcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkOworCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOworCisJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCAoIkRvbmUtQiglZCk6ST0weCVseCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgQnVsa091dFBpcGVJZCwgaW5faW50ZXJydXB0KCksIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkvLwkJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZSsrOworCisJCXBBZC0+Q291bnRlcnM4MDIzLkdvb2RUcmFuc21pdHMrKzsKKwkJLy9SVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQlGUkVFX0hUVFhfUklORyhwQWQsIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dCk7CisJCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCVBVQ0hBUglwQnVmOworCisJCXBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIrKzsKKworCQlwQnVmID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPldpcmVsZXNzUGFja2V0W3BIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbl07CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGtPdXREYXRhUGFja2V0IGZhaWxlZDogUmVhc29uQ29kZT0lZCFcbiIsIFN0YXR1cykpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLCBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI+PkJ1bGtPdXQgSGVhZGVyOiV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdLCBwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLCBwQnVmWzddKSk7CisJCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIj4+QnVsa091dENvbXBsZXRlQ2FuY2VsPTB4JXgsIEJ1bGtPdXRDb21wbGV0ZU90aGVyPTB4JXhcbiIsIHBBZC0+QnVsa091dENvbXBsZXRlQ2FuY2VsLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisKKwkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSBCdWxrT3V0UGlwZUlkOworCQl9CisJfQorCisJLy8KKwkvLyBiSW5Vc2UgPSBUUlVFLCBtZWFucyBzb21lIHByb2Nlc3MgYXJlIGZpbGxpbmcgVFggZGF0YSwgYWZ0ZXIgdGhhdCBtdXN0IHR1cm4gb24gYldhaXRpbmdCdWxrT3V0CisJLy8gYldhaXRpbmdCdWxrT3V0ID0gVFJVRSwgbWVhbnMgdGhlIFRYIGRhdGEgYXJlIHdhaXRpbmcgZm9yIGJ1bGsgb3V0LgorCS8vCisJLy9SVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pICYmCisJCShwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24rOCkpICYmCisJCSFSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKSkKKwl7CisJCS8vIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhbGlhYmxlCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwl9CisJLy9SVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCisJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiRG9uZS1BKCVkKTpJPTB4JWx4LCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWRcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLAorCS8vCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKworCXN3aXRjaCAoQnVsa091dFBpcGVJZCkKKwl7CisJCWNhc2UgMDoKKwkJCQlwT2JqLT5hYzBfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcEFkOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJCXBPYmotPmFjMV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDI6CisJCQkJcE9iai0+YWMyX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCQlwT2JqLT5hYzNfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcEFkOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJCXBPYmotPmhjY2FfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcEFkOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJfQorI2Vsc2UKKworeworCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dDsKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQT1NfQ09PS0lFIAkJcE9iajsKKwlVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQ7CisKKworCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCQk9IHBIVFRYQ29udGV4dC0+cEFkOworCXBPYmogCQkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCUJ1bGtPdXRQaXBlSWQJPSBwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQ7CisJcEFkLT5CdWxrT3V0RGF0YU9uZVNlY0NvdW50Kys7CisKKwlzd2l0Y2ggKEJ1bGtPdXRQaXBlSWQpCisJeworCQljYXNlIDA6CisJCQkJcE9iai0+YWMwX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDE6CisJCQkJcE9iai0+YWMxX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDI6CisJCQkJcE9iai0+YWMyX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDM6CisJCQkJcE9iai0+YWMzX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDQ6CisJCQkJcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZTogTlVMTCBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JCdWxrT3V0TnVsbEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVBUWF9DT05URVhUCQlwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IFRSVUU7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDE7CisJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKworCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgorCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBOdWxsQ29udGV4dC0+QnVsa091dFNpemU7CisKKworCS8vIENsZWFyIE51bGwgZnJhbWUgYnVsayBmbGFnCisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCk7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwTnVsbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlSVFVTQkluaXRUeERlc2MocEFkLCBwTnVsbENvbnRleHQsIDAsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZSk7CisKKwlwVXJiID0gcE51bGxDb250ZXh0LT5wVXJiOworCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwl7CisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMDsKKwkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa091dE51bGxGcmFtZTogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCit9CisKKy8vIE5VTEwgZnJhbWUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCitWT0lEIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0OworCU5UU1RBVFVTCQkJU3RhdHVzOworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworCXVuc2lnbmVkIGxvbmcJCUlycUZsYWdzOworI2VuZGlmCisJUE9TX0NPT0tJRQkJCXBPYmo7CisKKworCXBOdWxsQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCQk9IHBOdWxsQ29udGV4dC0+cEFkOworCVN0YXR1cyAJCQk9IHBVcmItPnN0YXR1czsKKworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworCS8vIFJlc2V0IE51bGwgZnJhbWUgY29udGV4dCBmbGFncworCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyAJPSBGQUxTRTsKKwlwTnVsbENvbnRleHQtPkluVXNlIAkJPSBGQUxTRTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworCQkvLyBEb24ndCB3b3JyeSBhYm91dCB0aGUgcXVldWUgaXMgZW1wdHkgb3Igbm90LCB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaXRzZWxmCisJCS8vUlRNUFVTQkRlUXVldWVQYWNrZXQocEFkLCAwKTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKwllbHNlCS8vIFNUQVRVU19PVEhFUgorCXsKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBOdWxsIEZyYW1lIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworI2Vsc2UKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcE9iai0+bnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzayk7CisjZW5kaWYKKworfQorCisjaWYgMAkvLyBGb3IgUlQyODcwLCBSVFMgZnJhbWUgbm90IHVzZWQgbm93LCBidXQgbWF5YmUgd2lsbCB1c2UgaXQgbGF0dGVyLgorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOiBSVFMgZnJhbWUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQnVsa091dFJUU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVBUWF9DT05URVhUCQlwUlRTQ29udGV4dCA9ICYocEFkLT5SVFNDb250ZXh0KTsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCVVDSEFSCQkJUGlwZUlEPTA7CisKKwlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNCkpCisJCVBpcGVJRD0gMzsKKwllbHNlIGlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8zKSkKKwkJUGlwZUlEPSAyOworCWVsc2UgaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzIpKQorCQlQaXBlSUQ9IDE7CisJZWxzZSBpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpKQorCQlQaXBlSUQ9IDA7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW1BpcGVJRF0sIElycUZsYWdzKTsKKwlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbUGlwZUlEXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tQaXBlSURdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tQaXBlSURdID0gVFJVRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbUGlwZUlEXSwgSXJxRmxhZ3MpOworCisJLy8gSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyCisJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcFJUU0NvbnRleHQtPkJ1bGtPdXRTaXplOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiLS0tPlJUVVNCQnVsa091dFJUU0ZyYW1lIFxuIikpOworCisJLy8gQ2xlYXIgUlRTIGZyYW1lIGJ1bGsgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9SVFMpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJUU0NvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlSVFVTQkluaXRUeERlc2MocEFkLCBwUlRTQ29udGV4dCwgUGlwZUlELCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0UlRTRnJhbWVDb21wbGV0ZSk7CisJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCisJcFVyYiA9IHBSVFNDb250ZXh0LT5wVXJiOworCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa091dFJUU0ZyYW1lOiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCXJldHVybjsKKwl9CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCI8LS0tUlRVU0JCdWxrT3V0UlRTRnJhbWUgXG4iKSk7CisKK30KKworLy8gUlRTIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorVk9JRCBSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0OworCU5UU1RBVFVTCQlTdGF0dXM7CisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKyNlbmRpZgorCVBPU19DT09LSUUJCXBPYmo7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0UlRTRnJhbWVDb21wbGV0ZVxuIikpOworCisJcFJUU0NvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQk9IHBSVFNDb250ZXh0LT5wQWQ7CisJU3RhdHVzCQk9IHBVcmItPnN0YXR1czsKKworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworCS8vIFJlc2V0IFJUUyBmcmFtZSBjb250ZXh0IGZsYWdzCisJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwUlRTQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJLy8gRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHF1ZXVlIGlzIGVtcHR5IG9yIG5vdCwgdGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGl0c2VsZgorCQkvL1JUTVBVU0JEZVF1ZXVlUGFja2V0KHBBZCwgcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWQpOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIFRSVUUsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgT3V0IFJUUyBGcmFtZSBGYWlsZWRcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJfQorCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKyNlbHNlCisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCXBPYmotPnJ0c19mcmFtZV9jb21wbGV0ZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ0c19mcmFtZV9jb21wbGV0ZV90YXNrKTsKKyNlbmRpZgorCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGVcbiIpKTsKKworfQorI2VuZGlmCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZTogTUxNRSB1c2UgQnVsa091dFBpcGVJZCA9IDAKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JCdWxrT3V0TUxNRVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBUWF9DT05URVhUCQlwTUxNRUNvbnRleHQ7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYTsKKwlwVXJiID0gcE1MTUVDb250ZXh0LT5wVXJiOworCisJaWYgKChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID49IE1HTVRfUklOR19TSVpFKSB8fAorCQkocE1MTUVDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkgfHwKKwkJKHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IEZBTFNFKSkKKwl7CisKKworCQkvLyBDbGVhciBNTE1FIGJ1bGsgZmxhZworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisKKwkJcmV0dXJuOworCX0KKworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKwlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBUUlVFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbTUdNVFBJUEVJRFhdID0gMTsKKwlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCisJLy8gSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyCisJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZTsKKworCS8vIENsZWFyIE1MTUUgYnVsayBmbGFnCisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOworCisKKwkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIi0tLT5SVFVTQkJ1bGtPdXRNTE1FUGFja2V0XG4iKSk7CisjaWYgMCAvLyBmb3IgZGVidWcKK3sKKwlwcmludGsoIk1MTUUtT3V0LCBDPSVkISwgRD0lZCwgRj0lZCFcbiIsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpOworCisJLy9UT0RPOiBOZWVkIHRvIHJlbW92ZSBpdCB3aGVuIGZvcm1hbCByZWxlYXNlCisJUFRYSU5GT19TVFJVQyBwVHhJbmZvOworCisJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXI7CisJaWYgKHBUeEluZm8tPlFTRUwgIT0gRklGT19FRENBKQorCXsKKwkJCXByaW50aygiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwgX19GVU5DVElPTl9fLCBwVHhJbmZvLT5RU0VMKTsKKwkJCXByaW50aygiXHRNTE1FX0luZGV4PSVkIVxuIiwgSW5kZXgpOworCQkJaGV4X2R1bXAoIldyb25nIFFTZWwgUGt0OiIsIChQVUNIQVIpcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4pOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE1MTUVDb250ZXh0LCBNR01UUElQRUlEWCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLy9Gb3IgbWdtdCB1cmIgYnVmZmVyLCBiZWNhdXNlIHdlIHVzZSBza19idWZmLCBzbyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgVVNCIGNvbnRyb2xsZXIgZG8gZG1hIG1hcHBpbmcuCisJcFVyYi0+dHJhbnNmZXJfZG1hCT0gMDsKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyAmPSAoflVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKTsKKyNlbmRpZgorCisJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRNTE1FUGFja2V0OiBTdWJtaXQgTUxNRSBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKKwkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtNR01UUElQRUlEWF0gPSAwOworCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQgXG4iKSk7CisvLwlwcmludGsoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0LENwdT0lZCEsIERtYT0lZCwgU3dJZHg9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsKK30KKworCitWT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCVBUWF9DT05URVhUCQkJcE1MTUVDb250ZXh0OworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKwlQT1NfQ09PS0lFIAkJCXBPYmo7CisJaW50CQkJCQlpbmRleDsKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7CisjZW5kaWYKKworCisJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlXG4iKSk7CisJcE1MTUVDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJCT0gcE1MTUVDb250ZXh0LT5wQWQ7CisJcE9iaiAJCQk9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOworCWluZGV4IAkJCT0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OworCisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwlBU1NFUlQoKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPT0gaW5kZXgpKTsKKwkvL3ByaW50aygiTUxNRS1Eb25lLUI6IEM9JWQsIEQ9JWQsIEY9JWQsIFNlbGY9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LCBwTUxNRUNvbnRleHQtPlNlbGZJZHgpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2VuZCB0aGUgbWdtdCBwa3Q/CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQl9CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKwkvLyBSZXNldCBNTE1FIGNvbnRleHQgZmxhZ3MKKwlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKworCXBQYWNrZXQgPSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0OworCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJLy8gSW5jcmVhc2UgTWdtdFJpbmcgSW5kZXgKKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBNR01UX1JJTkdfU0laRSk7CisJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCsrOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJLy8gTm8tbWF0dGVyIHN1Y2Nlc3Mgb3IgZmFpbCwgd2UgZnJlZSB0aGUgbWdtdCBwYWNrZXQuCisJaWYgKHBQYWNrZXQpCisJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCisjaWYgMAorCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2V0IHRoZSBlbmRwb2ludD8KKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCX0KKwl9CisjZW5kaWYKKworCS8vcHJpbnRrKCJNTE1FLURvbmUtQTogQz0lZCwgRD0lZCwgRj0lZCFcbiIsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpOworCisJcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZVxuIikpOworLy8JcHJpbnRrKCI8LS0tUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlLCBDcHU9JWQsIERtYT0lZCwgU3dJZHg9JWQhXG4iLAorLy8JCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCwgcEFkLT5NZ210UmluZy5UeERtYUlkeCwgcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCk7CisKKyNlbHNlCisKKwlwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKyNlbmRpZgorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZTogUHNQb2xsIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkJ1bGtPdXRQc1BvbGwoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYX0NPTlRFWFQJCXBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IFRSVUU7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDE7CisJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisKKwkvLyBDbGVhciBQUy1Qb2xsIGJ1bGsgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFBzUG9sbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlSVFVTQkluaXRUeERlc2MocEFkLCBwUHNQb2xsQ29udGV4dCwgTUdNVFBJUEVJRFgsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZSk7CisKKwlwVXJiID0gcFBzUG9sbENvbnRleHQtPnBVcmI7CisJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCQlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRQc1BvbGw6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJcmV0dXJuOworCX0KKworfQorCisvLyBQUy1Qb2xsIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwdXJiYl90IHBVcmIsc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisjZW5kaWYKKwlQT1NfQ09PS0lFCQkJcE9iajsKKworCisJcFBzUG9sbENvbnRleHQ9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCA9IHBQc1BvbGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJLy8gUmVzZXQgUHNQb2xsIGNvbnRleHQgZmxhZ3MKKwlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOworCXBQc1BvbGxDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworCQkvLyBEb24ndCB3b3JyeSBhYm91dCB0aGUgcXVldWUgaXMgZW1wdHkgb3Igbm90LCB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaXRzZWxmCisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworI2Vsc2UKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworI2VuZGlmCit9CisKKworI2lmIDAKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCVVTQl9SeFBhY2tldCBpbml0aWFsaXplcyBhIFVSQiBhbmQgdXNlcyB0aGUgUnggSVJQIHRvIHN1Ym1pdCBpdAorCXRvIFVTQi4gSXQgY2hlY2tzIGlmIGFuIFJ4IERlc2NyaXB0b3IgaXMgYXZhaWxhYmxlIGFuZCBwYXNzZXMgdGhlCisJdGhlIGNvcmVzcG9uZGluZyBidWZmZXIgdG8gYmUgZmlsbGVkLiBJZiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZQorCWZhaWxzIHRoZSByZXF1ZXN0LiBXaGVuIHNldHRpbmcgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3ZSBwYXNzIG91cgorCUFkYXB0ZXIgT2JqZWN0IGFzIENvbnRleHQuCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJCQlmb3VuZCBtYXRjaGVkIHR1cGxlIGNhY2hlCisJCUZBTFNFCQkJbm8gbWF0Y2hlZCBmb3VuZAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkvKiBkZXZpY2UgaGFkIGJlZW4gY2xvc2VkICovCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCS8vIExhc3QgaXMgdGltZSBwb2ludCBiZXR3ZWVuIDIgc2VwYXJhdGUgVVJCLgorCWlmIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID09IDApCisJeworCQkvL3BBZC0+TmV4dFJ4QnVsa0luSW5kZXggPSAocEFkLT5OZXh0UnhCdWxrSW5JbmRleCArIDEpICUgKFJYX1JJTkdfU0laRSk7CisJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIFJYX1JJTkdfU0laRSk7CisJfQorCWVsc2UgaWYgKChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uJjB4MWZmKSAhPSAwKQorCXsKKwkJLy9wQWQtPk5leHRSeEJ1bGtJbkluZGV4ID0gKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXggKyAxKSAlIChSWF9SSU5HX1NJWkUpOworCQlJTkNfUklOR19JTkRFWChwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBSWF9SSU5HX1NJWkUpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDB4JWx4LiAgRW5kIG9mIFVSQi5cbiIsIHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gKSk7CisJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOworCX0KKworCWlmIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID09IE1BWF9SWEJVTEtfU0laRSkKKwkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisKKwlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJbkluZGV4XSk7CisKKwkvLyBUT0RPOiBXaHkgbmVlZCB0byBjaGVjayBpZiBwUnhDb250ZXh0LT5JblVzZWQgPT0gVFJVRT8KKwkvL2lmICgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpKQorCWlmICgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpICYmIChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJwUnhDb250ZXh0WyVkXSBJblVzZSA9ICVkLnBSeENvbnRleHQtPlJlYWRhYmxlID0gJWQuICBSZXR1cm4uXG4iLCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LHBSeENvbnRleHQtPkluVXNlLCBwUnhDb250ZXh0LT5SZWFkYWJsZSApKTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCQkvLyByZWFkIFJ4Q29udGV4dCwgU2luY2Ugbm90CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCVNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIFRSVUUpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vcmV0dXJuOworCX0KKwlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZz0gVFJVRTsKKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkvLyBJbml0IFJ4IGNvbnRleHQgZGVzY3JpcHRvcgorCU5kaXNaZXJvTWVtb3J5KHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBCVUZGRVJfU0laRSk7CisJUlRVU0JJbml0UnhEZXNjKHBBZCwgcFJ4Q29udGV4dCk7CisKKwlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZTogU3VibWl0IFJ4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCWVsc2UgLy8gc3VjY2VzcworCXsKKwkJTmRpc0ludGVybG9ja2VkSW5jcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCXBBZC0+QnVsa0luUmVxKys7CisJfQorCisJLy8gcmVhZCBSeENvbnRleHQsIFNpbmNlIG5vdAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIEZBTFNFKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBwcm9jZXNzIFJ4IElycCBhbmQgY2FsbCByeCBjb21wbGV0ZSBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJRGV2aWNlT2JqZWN0CVBvaW50ZXIgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIG5leHQgbG93ZXIKKwkJCQkJCWRldmljZS4gRGV2aWNlT2JqZWN0IHBhc3NlZCBpbiBoZXJlIGJlbG9uZ3MgdG8KKwkJCQkJCXRoZSBuZXh0IGxvd2VyIGRyaXZlciBpbiB0aGUgc3RhY2sgYmVjYXVzZSB3ZQorCQkJCQkJd2VyZSBpbnZva2VkIHZpYSBJb0NhbGxEcml2ZXIgaW4gVVNCX1J4UGFja2V0CisJCQkJCQlBTkQgaXQgaXMgbm90IE9VUiBkZXZpY2Ugb2JqZWN0CisJICBJcnAJCQkJUHRyIHRvIGNvbXBsZXRlZCBJUlAKKwkgIENvbnRleHQJCQlQdHIgdG8gb3VyIEFkYXB0ZXIgb2JqZWN0IChjb250ZXh0IHNwZWNpZmllZAorCQkJCQkJaW4gSW9TZXRDb21wbGV0aW9uUm91dGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisKKwlOb3RlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisjaWYgMAorCVBSWF9DT05URVhUCQkJcFJ4Q29udGV4dDsKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisvLwlQT1NfQ09PS0lFCQkJcE9iajsKKworCXBSeENvbnRleHQJPSAoUFJYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQk9IHBSeENvbnRleHQtPnBBZDsKKy8vCXBPYmoJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisJLy9wUnhDb250ZXh0LT5wSXJwID0gTlVMTDsKKworCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGUrKzsKKwkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBUUlVFOworCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKworCX0KKwllbHNlCSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsKys7CisJCS8vIFN0aWxsIHJlYWQgdGhpcyBwYWNrZXQgYWx0aG91Z2ggaXQgbWF5IGNvbXRhaW4gd3JvbmcgYnl0ZXMuCisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCS8vIFBhcnNpbmcgYWxsIHBhY2tldHMuIGJlY2F1c2UgYWZ0ZXIgcmVzZXQsIHRoZSBpbmRleCB3aWxsIHJlc2V0IHRvIGFsbCB6ZXJvLgorCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJCXsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgSW4gRmFpbGVkLiBTdGF0dXMgPSAlZFxuIiwgU3RhdHVzKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPT0+TmV4dFJ4QnVsa0luSW5kZXg9MHgleCwgTmV4dFJ4QnVsa0luUmVhZEluZGV4PTB4JXgsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoPSAweCV4XG4iLAorCQkJCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBwUnhDb250ZXh0LT5wVXJiLT5hY3R1YWxfbGVuZ3RoKSk7CisKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOLCBOVUxMLCAwKTsKKwkJfQorCQkvL3BVcmIgPSBOVUxMOworCX0KKworCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCkpICYmCisvLwkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisjaWYgMAorI2lmIDEKKwkJU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgRkFMU0UpOworI2Vsc2UKKwkJcE9iai0+cnhfYmguZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnBPYmotPnJ4X2JoKTsKKyNlbmRpZgorI2VuZGlmCisJfQorCisJLy8gQ2FsbCBSeFBhY2tldCB0byBwcm9jZXNzIHBhY2tldCBhbmQgcmV0dXJuIHRoZSBzdGF0dXMKKwlOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKyNlbHNlCisKKworCS8vIHVzZSBhIHJlY2VpdmUgdGFza2xldCB0byBoYW5kbGUgcmVjZWl2ZWQgcGFja2V0czsKKwkvLyBvciBzb21ldGltZXMgaGFyZHdhcmUgSVJRIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSwgc28gd2UgY2FuIG5vdAorCS8vIHVzZSBzcGluX2xvY2tfYmgoKS9zcGluX3VubG9ja19iaCgpIGFmdGVyIElSUSBpcyBkaXNhYmxlZC4gOjwKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQT1NfQ09PS0lFIAkJcE9iajsKKworCisJcFJ4Q29udGV4dAk9IChQUlhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCT0gcFJ4Q29udGV4dC0+cEFkOworCXBPYmogCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXBPYmotPnJ4X2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOworI2VuZGlmCit9CisKKyNlbHNlCisKK1ZPSUQgRG9CdWxrSW4oSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKKwlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcFJ4Q29udGV4dC0+SW5Vc2UgPSBUUlVFOworCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCXBBZC0+UGVuZGluZ1J4Kys7CisJcEFkLT5CdWxrSW5SZXErKzsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJLy8gSW5pdCBSeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KTsKKwlSVFVTQkluaXRSeERlc2MocEFkLCBwUnhDb250ZXh0KTsKKworCXBVcmIgPSBwUnhDb250ZXh0LT5wVXJiOworCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJewkvLyBmYWlsCisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJcEFkLT5QZW5kaW5nUngtLTsKKwkJcEFkLT5CdWxrSW5SZXEtLTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZTogU3VibWl0IFJ4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCX0KKwllbHNlCisJewkvLyBzdWNjZXNzCisjaWYgMAorCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCS8vTmRpc0ludGVybG9ja2VkSW5jcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCXBBZC0+UGVuZGluZ1J4Kys7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa0luUmVxKys7CisjZW5kaWYKKwkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7CisJCS8vcHJpbnRrKCJCSURvbmUsIFBlbmQ9JWQsQklJZHg9JWQsQklSSWR4PSVkIVxuIiwgcEFkLT5QZW5kaW5nUngsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4KTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJVVNCX1J4UGFja2V0IGluaXRpYWxpemVzIGEgVVJCIGFuZCB1c2VzIHRoZSBSeCBJUlAgdG8gc3VibWl0IGl0CisJdG8gVVNCLiBJdCBjaGVja3MgaWYgYW4gUnggRGVzY3JpcHRvciBpcyBhdmFpbGFibGUgYW5kIHBhc3NlcyB0aGUKKwl0aGUgY29yZXNwb25kaW5nIGJ1ZmZlciB0byBiZSBmaWxsZWQuIElmIG5vIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCisJZmFpbHMgdGhlIHJlcXVlc3QuIFdoZW4gc2V0dGluZyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdlIHBhc3Mgb3VyCisJQWRhcHRlciBPYmplY3QgYXMgQ29udGV4dC4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJCWZvdW5kIG1hdGNoZWQgdHVwbGUgY2FjaGUKKwkJRkFMU0UJCQlubyBtYXRjaGVkIGZvdW5kCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9SWAkJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgXAorCQkgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCkKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9IQU5ETEVfUlgJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgXAorCQkgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCisKK1ZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9IQU5ETEVfUlgpKQorCQlyZXR1cm47CisKKwl3aGlsZSgxKQorCXsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXhdKTsKKwkJaWYgKCgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpICYmIChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSkgJiYKKwkJCShwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9PSBGQUxTRSkpCisJCXsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gVFJVRTsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkJCS8vIHJlYWQgUnhDb250ZXh0LCBTaW5jZSBub3QKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgVFJVRSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCS8vIEZpbmlzaCB0byBoYW5kbGUgdGhpcyBidWxrSW4gYnVmZmVyLgorCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgPSAwOworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisJCQlwQWQtPlJlYWRQb3NpdGlvbiA9IDA7CisJCQlwQWQtPlRyYW5zZmVyQnVmZmVyTGVuZ3RoID0gMDsKKwkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBSWF9SSU5HX1NJWkUpOworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCEoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9SWCkpKQorCQlEb0J1bGtJbihwQWQpOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBwcm9jZXNzIFJ4IElycCBhbmQgY2FsbCByeCBjb21wbGV0ZSBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJRGV2aWNlT2JqZWN0CVBvaW50ZXIgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIG5leHQgbG93ZXIKKwkJCQkJCWRldmljZS4gRGV2aWNlT2JqZWN0IHBhc3NlZCBpbiBoZXJlIGJlbG9uZ3MgdG8KKwkJCQkJCXRoZSBuZXh0IGxvd2VyIGRyaXZlciBpbiB0aGUgc3RhY2sgYmVjYXVzZSB3ZQorCQkJCQkJd2VyZSBpbnZva2VkIHZpYSBJb0NhbGxEcml2ZXIgaW4gVVNCX1J4UGFja2V0CisJCQkJCQlBTkQgaXQgaXMgbm90IE9VUiBkZXZpY2Ugb2JqZWN0CisJICBJcnAJCQkJUHRyIHRvIGNvbXBsZXRlZCBJUlAKKwkgIENvbnRleHQJCQlQdHIgdG8gb3VyIEFkYXB0ZXIgb2JqZWN0IChjb250ZXh0IHNwZWNpZmllZAorCQkJCQkJaW4gSW9TZXRDb21wbGV0aW9uUm91dGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisKKwlOb3RlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJLy8gdXNlIGEgcmVjZWl2ZSB0YXNrbGV0IHRvIGhhbmRsZSByZWNlaXZlZCBwYWNrZXRzOworCS8vIG9yIHNvbWV0aW1lcyBoYXJkd2FyZSBJUlEgd2lsbCBiZSBkaXNhYmxlZCBoZXJlLCBzbyB3ZSBjYW4gbm90CisJLy8gdXNlIHNwaW5fbG9ja19iaCgpL3NwaW5fdW5sb2NrX2JoKCkgYWZ0ZXIgSVJRIGlzIGRpc2FibGVkLiA6PAorCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCVBSVE1QX0FEQVBURVIJcEFkOworCVBPU19DT09LSUUgCQlwT2JqOworCisKKwlwUnhDb250ZXh0CT0gKFBSWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJPSBwUnhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJcE9iai0+cnhfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisKK30KKworI2VuZGlmCisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCS2lja0J1bGtPdXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gQnVsa0luIFJlc2V0IHdpbGwgcmVzZXQgd2hvbGUgVVNCIFBIWS4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgbm90IGZsYWdlZC4KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCAsZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpCisjaWZkZWYgUkFMSU5LX0FURQorCQkmJiAhKEFURV9PTihwQWQpKQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJKQorCXsKKyNpZiAwCS8vIG5vdCB1c2VkIG5vdyBpbiBSVDI4eHgsIGJ1dCBtYXkgdXNlZCBsYXR0ZXIuCisJCS8vIDEuIERhdGEgRnJhZ21lbnQgaGFzIGhpZ2hlc3QgcHJpb3JpdHkKKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRykpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDAsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFswXSk7CisJCQl9CisJCX0KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18yKSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMSwgcEFkLT5OZXh0QnVsa091dEluZGV4WzFdKTsKKwkJCX0KKwkJfQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzMpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAyLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMl0pOworCQkJfQorCQl9CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfNCkpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDMsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFszXSk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCS8vIDIuIFBTLVBvbGwgZnJhbWUgaXMgbmV4dAorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUFNQT0xMKSkKKwkJeworCQkJUlRVU0JCdWxrT3V0UHNQb2xsKHBBZCk7CisJCX0KKworCQkvLyA1LiBNbG1lIGZyYW1lIGlzIG5leHQKKwkJZWxzZSBpZiAoKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpKSAmJgorCQkJCSAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFKSkKKwkJeworCQkJUlRVU0JCdWxrT3V0TUxNRVBhY2tldChwQWQsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgpOworCQl9CisKKwkJLy8gNi4gRGF0YSBmcmFtZSBub3JtYWwgaXMgbmV4dAorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAwLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMF0pOworCQkJfQorCQl9CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8yKSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMSwgcEFkLT5OZXh0QnVsa091dEluZGV4WzFdKTsKKwkJCX0KKwkJfQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMykpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDIsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFsyXSk7CisJCQl9CisJCX0KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAzLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbM10pOworCQkJfQorCQl9CisKKwkJLy8gNy4gTnVsbCBmcmFtZSBpcyB0aGUgbGFzdAorCQllbHNlIGlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpKQorCQl7CisJCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0TnVsbEZyYW1lKHBBZCk7CisJCQl9CisJCX0KKworCQkvLyA4LiBObyBkYXRhIGF2YWxpYWJsZQorCQllbHNlCisJCXsKKworCQl9CisJfQorI2lmZGVmIFJBTElOS19BVEUKKwkvKiBJZiB0aGUgbW9kZSBpcyBpbiBBVEUgbW9kZS4gKi8KKwllbHNlIGlmKChBVEVfT04ocEFkKSkgJiYKKwkJIVJUTVBfVEVTVF9GTEFHKHBBZCAsZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKS8vIFBFVEVSIDogd2F0Y2ggb3V0ICEKKwl7CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0FURSkpCisJCXsKKwkJCUFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMCk7CisJCX0KKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUNhbGwgZnJvbSBSZXNldCBhY3Rpb24gYWZ0ZXIgQnVsa091dCBmYWlsZWQuCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCUlkeDsKKwlQSFRfVFhfQ09OVEVYVAlwVHhDb250ZXh0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlXG4iKSk7CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQorCXsKKwkJcFR4Q29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtJZHhdOworCisJCXBUeENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uOworCQlwVHhDb250ZXh0LT5MYXN0T25lID0gRkFMU0U7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1DbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlXG4iKSk7CisKKyNpZiAwCS8vIERvIG5vdGhpbmchCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NTE1FQnVsa091dExvY2spOworCXdoaWxlIChwQWQtPlByaW9SaW5nVHhDbnQgPiAwKQorCXsKKwkJcEFkLT5NTE1FQ29udGV4dFtwQWQtPlByaW9SaW5nRmlyc3RJbmRleF0uSW5Vc2UgPSBGQUxTRTsKKworCQlwQWQtPlByaW9SaW5nRmlyc3RJbmRleCsrOworCQlpZiAocEFkLT5QcmlvUmluZ0ZpcnN0SW5kZXggPj0gTUdNVF9SSU5HX1NJWkUpCisJCXsKKwkJCXBBZC0+UHJpb1JpbmdGaXJzdEluZGV4ID0gMDsKKwkJfQorCisJCXBBZC0+UHJpb1JpbmdUeENudC0tOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisjZW5kaWYKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1DbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZVxuIikpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJVUlOVAkJCWk7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiLS0tPlJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUFxuIikpOworCWZvciAoIGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYocFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQl7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQkvL3BBZC0+UGVuZGluZ1J4LS07CisJCX0KKwl9CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlBcbiIpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBNTE1FQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBCZWFjb25Db250ZXh0OworCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0OworCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQ7CisJUFRYX0NPTlRFWFQJCQlwUlRTQ29udGV4dDsKKwlVSU5UCQkJCWksIElkeDsKKy8vCXVuc2lnbmVkIGludCAJCUlycUZsYWdzOworLy8JTkRJU19TUElOX0xPQ0sJCSpwTG9jazsKKy8vCUJPT0xFQU4JCQkJKnBQZW5kaW5nOworCisKKy8vCXBMb2NrID0gJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdOworLy8JcFBlbmRpbmcgPSAmcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF07CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQorCXsKKwkJcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFtJZHhdKTsKKworCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCXsKKworCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCisJCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAorCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCisJCQkvLworCisJCQlSVFVTQl9VTkxJTktfVVJCKHBIVFRYQ29udGV4dC0+cFVyYik7CisKKwkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisJCX0KKworI2lmZGVmIFJBTElOS19BVEUKKwkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSAwOworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSAwOworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IDA7CisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKwkJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0lkeF0gPSBGQUxTRTsKKwl9CisKKwkvL1JUTVBfSVJRX0xPQ0socExvY2ssIElycUZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKKwl7CisJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJaWYocE1MTUVDb250ZXh0ICYmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpCisJCXsKKworCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCisJCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAorCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCisJCQkvLworCisJCQlSVFVTQl9VTkxJTktfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKworCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKwkJfQorCX0KKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9IEZBTFNFOworCS8vUlRNUF9JUlFfVU5MT0NLKHBMb2NrLCBJcnFGbGFncyk7CisKKworCWZvciAoaSA9IDA7IGkgPCBCRUFDT05fUklOR19TSVpFOyBpKyspCisJeworCQlwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKKworCQlpZihwQmVhY29uQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQl7CisKKwkJCS8vIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZgorCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QKKwkJCS8vCXdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuCWNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcAorCQkJLy8KKworCQkJUlRVU0JfVU5MSU5LX1VSQihwQmVhY29uQ29udGV4dC0+cFVyYik7CisKKwkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisJCX0KKwl9CisKKwlwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCWlmIChwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKKwkJUlRVU0JfVU5MSU5LX1VSQihwTnVsbENvbnRleHQtPnBVcmIpOworCisJcFJUU0NvbnRleHQgPSAmKHBBZC0+UlRTQ29udGV4dCk7CisJaWYgKHBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCVJUVVNCX1VOTElOS19VUkIocFJUU0NvbnRleHQtPnBVcmIpOworCisJcFBzUG9sbENvbnRleHQgPSAmKHBBZC0+UHNQb2xsQ29udGV4dCk7CisJaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCVJUVVNCX1VOTElOS19VUkIocFBzUG9sbENvbnRleHQtPnBVcmIpOworCisJZm9yIChJZHggPSAwOyBJZHggPCA0OyBJZHgrKykKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGQ3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9kYXRhLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnR1c2JfZGF0YS5jCisKKwlBYnN0cmFjdDoKKwlSYWxpbmsgVVNCIGRyaXZlciBUeC9SeCBmdW5jdGlvbnMuCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbiAgICAgICAgICAgIDAzLTI1LTIwMDYgICAgY3JlYXRlZAorCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitleHRlcm4gIFVDSEFSIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOyAvLyBkZWZpbmVkIGluIG1sbWUuYworZXh0ZXJuIFVDSEFSCUVwVG9RdWV1ZVtdOworCitWT0lEIFJFUE9SVF9BTVNEVV9GUkFNRVNfVE9fTExDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJVUlOVAkJCW5NU0RVOworCXN0cnVjdAkJCXNrX2J1ZmYgKnBTa2I7CisKKwluTVNEVSA9IDA7CisJLyogYWxsb2NhdGUgYSByeCBwYWNrZXQgKi8KKwlwU2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZGRVJfQUdHUkVTSVpFKTsKKwlwUGFja2V0ID0gKFBORElTX1BBQ0tFVClPU1BLVF9UT19SVFBLVChwU2tiKTsKKwlpZiAocFNrYikKKwl7CisKKwkJLyogY29udmVydCA4MDIuMTEgdG8gODAyLjMgcGFja2V0ICovCisJCXBTa2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKKwkJZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UocEFkLCBwUGFja2V0LCBwRGF0YSwgRGF0YVNpemUpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkNhbid0IGFsbG9jYXRlIHNrYlxuIikpOworCX0KK30KKworTkRJU19TVEFUVVMJUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAorCUlOCVVJTlQzMgkJCU51bWJlclJlcXVpcmVkKQoreworLy8JVUNIQVIJCQlGcmVlTnVtYmVyID0gMDsKKy8vCVVJTlQJCQlJbmRleDsKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCisKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBOdW1iZXJSZXF1aXJlZCArIExPQ0FMX1RYQlVGX1NJWkUpID4gcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSkKKwl7CisKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOworCX0KKwllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCAoTnVtYmVyUmVxdWlyZWQgKyBMT0NBTF9UWEJVRl9TSVpFKSkpCisJeworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCWVsc2UgaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRVU0JGcmVlRCBjMyAtLT4gUXVlSWR4PSVkLCBDV1Bvcz0lbGQsIE5CT3V0UG9zPSVsZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwl9CisJZWxzZQorCXsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisKKwlyZXR1cm4gKFN0YXR1cyk7Cit9CisKK05ESVNfU1RBVFVTIFJUVVNCRnJlZURlc2NyaXB0b3JSZWxlYXNlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKQoreworCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworCitCT09MRUFOCVJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCUJPT0xFQU4JCQluZWVkUXVlQmFjayA9IEZBTFNFOworCisJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSAgLyomJiAocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID09IDApICovKQorCXsKKyNpZiAwCisJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDw9IDgpICYmCisJCQkocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gOCAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uK01BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpKQorCQl7CisJCQluZWVkUXVlQmFjayA9IFRSVUU7CisJCX0KKwkJZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKKwkJCQkgKChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyBNQVhfQUdHUkVHQVRJT05fU0laRSkgPCBNQVhfVFhCVUxLX0xJTUlUKSkKKwkJeworCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOworCQl9CisjZWxzZQorCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pICYmCisJCQkoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uK01BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpIHx8IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiBNQVhfQUdHUkVHQVRJT05fU0laRSkpKQorCQl7CisJCQluZWVkUXVlQmFjayA9IFRSVUU7CisJCX0KKyNlbmRpZgorCQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKKwkJCQkgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICsgTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkJeworCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOworCQl9CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCXJldHVybiBuZWVkUXVlQmFjazsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJSW5kZXg7CisJUFFVRVVFX0VOVFJZCXBFbnRyeTsKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlQUVVFVUVfSEVBREVSCXBRdWV1ZTsKKworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgNDsgSW5kZXgrKykKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tJbmRleF0pOworCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbSW5kZXhdLkhlYWQgIT0gTlVMTCkKKwkJeworCQkJcFF1ZXVlID0gKFBRVUVVRV9IRUFERVIpICYocEFkLT5UeFN3UXVldWVbSW5kZXhdKTsKKwkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tJbmRleF0pOworCisJfQorCit9CisKK1ZPSUQgUlRNUFdyaXRlVHhJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCisJSU4JICBVU0hPUlQJCVVTQkRNQXBrdExlbiwKKwlJTgkgIEJPT0xFQU4JCWJXaXYsCisJSU4JICBVQ0hBUgkJCVF1ZXVlU2VsLAorCUlOCSAgVUNIQVIJCQlOZXh0VmFsaWQsCisJSU4JICBVQ0hBUgkJCVR4QnVyc3QpCit7CisJcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPSBVU0JETUFwa3RMZW47CisJcFR4SW5mby0+UVNFTCA9IFF1ZXVlU2VsOworCWlmIChRdWV1ZVNlbCAhPSBGSUZPX0VEQ0EpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IFF1ZXVlU2VsICE9IEZJRk9fRURDQTw9PT09PT09PT09PT1cbiIpKTsKKwlwVHhJbmZvLT5VU0JETUFOZXh0VkxEID0gRkFMU0U7IC8vTmV4dFZhbGlkOyAgLy8gTmVlZCB0byBjaGVjayB3aXRoIEphbiBhYm91dCB0aGlzLgorCXBUeEluZm8tPlVTQkRNQVR4YnVyc3QgPSBUeEJ1cnN0OworCXBUeEluZm8tPldJViA9IGJXaXY7CisJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAwOworCXBUeEluZm8tPnJzdiA9IDA7CisJcFR4SW5mby0+cnN2MiA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjQ0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCkBAIC0wLDAgKzEsMjAwNiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAJTW9kdWxlIE5hbWU6CisJcnR1c2JfaW8uYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JICAgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbiAgICAwNi0yNS0yMDA0ICBjcmVhdGVkCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IE5JQyBpbml0aWFsaXphdGlvbiBjb21wbGV0ZQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitOVFNUQVRVUwlSVFVTQkZpcm13YXJlUnVuKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU5UU1RBVFVTCVN0YXR1czsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDAxLAorCQkweDgsCisJCTAsCisJCU5VTEwsCisJCTApOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBGaXJtd2FyZSB0byBOSUMuCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUyBSVFVTQkZpcm13YXJlV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCQlwRndJbWFnZSwKKwlJTiBVTE9ORwkJRndMZW4pCit7CisJVUlOVDMyCQlNYWNSZWc7CisJTlRTVEFUVVMgCVN0YXR1czsKKy8vCVVMT05HIAkJaTsKKwlVU0hPUlQJCXdyaXRlTGVuOworCisJU3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1hY1JlZyk7CisKKworCXdyaXRlTGVuID0gRndMZW47CisJUlRVU0JNdWx0aVdyaXRlKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSwgcEZ3SW1hZ2UsIHdyaXRlTGVuKTsKKworCVN0YXR1cyA9IFJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIDB4NzAxNCwgMHhmZmZmZmZmZik7CisJU3RhdHVzID0gUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDFjLCAweGZmZmZmZmZmKTsKKwlTdGF0dXMgPSBSVFVTQkZpcm13YXJlUnVuKHBBZCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBHZXQgY3VycmVudCBmaXJtd2FyZSBvcGVyYXRpb24gbW9kZSAoUmV0dXJuIFZhbHVlKQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQkwIG9yIDEgPSBEb3dubG9hZGVkIGJ5IGhvc3QgZHJpdmVyCisJCW90aGVycyA9IERyaXZlciBkb2Vzbid0IGRvd25sb2FkIGZpcm13YXJlCisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQkZpcm13YXJlT3Btb2RlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUlOVDMyCQkJcFZhbHVlKQoreworCU5UU1RBVFVTCVN0YXR1czsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKKwkJMHgxLAorCQkweDExLAorCQkwLAorCQlwVmFsdWUsCisJCTQpOworCXJldHVybiBTdGF0dXM7Cit9CitOVFNUQVRVUwlSVFVTQlZlbmRlclJlc2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU5UU1RBVFVTCVN0YXR1czsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiLS0+UlRVU0JWZW5kZXJSZXNldFxuIikpOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDAxLAorCQkweDEsCisJCTAsCisJCU5VTEwsCisJCTApOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIjwtLVJUVVNCVmVuZGVyUmVzZXRcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFJlYWQgdmFyaW91cyBsZW5ndGggZGF0YSBmcm9tIFJUMjU3MworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JNdWx0aVJlYWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCU9VVAlQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAorCQkweDcsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgdmFyaW91cyBsZW5ndGggZGF0YSB0byBSVDI1NzMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKwkvLyBUT0RPOiBJbiAyODcwLCB1c2UgdGhpcyBmdW5jaXRvbiBjYXJlZnVsbHkgY2F1c2UgaXQncyBub3Qgc3RhYmxlLgorCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDYsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCTEpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworTlRTVEFUVVMJUlRVU0JNdWx0aVdyaXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisKKyAgICAgICAgVVNIT1JUICAgICAgICAgIGluZGV4ID0gMCxWYWx1ZTsKKyAgICAgICAgUFVDSEFSICAgICAgICAgIHBTcmMgPSBwRGF0YTsKKyAgICAgICAgVVNIT1JUICAgICAgICAgIHJlc3VkZSA9IDA7CisKKyAgICAgICAgcmVzdWRlID0gbGVuZ3RoICUgMjsKKwkJbGVuZ3RoICArPSByZXN1ZGU7CisJCWRvCisJCXsKKwkJCVZhbHVlID0oVVNIT1JUKSggKnBTcmMgIHwgKCoocFNyYyArIDEpIDw8IDgpKTsKKwkJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsT2Zmc2V0ICsgaW5kZXgsVmFsdWUpOworICAgICAgICAgICAgaW5kZXggKz0yOworICAgICAgICAgICAgbGVuZ3RoIC09IDI7CisgICAgICAgICAgICBwU3JjID0gcFNyYyArIDI7CisgICAgICAgIH13aGlsZShsZW5ndGggPiAwKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKworTlRTVEFUVVMgUlRVU0JTaW5nbGVXcml0ZSgKKwlJTiAJUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglVU0hPUlQJCQlWYWx1ZSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJMHgyLAorCQlWYWx1ZSwKKwkJT2Zmc2V0LAorCQlOVUxMLAorCQkwKTsKKworCXJldHVybiBTdGF0dXM7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCAzMi1iaXQgTUFDIHJlZ2lzdGVyCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQlJlYWRNQUNSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVSU5UMzIJCQlwVmFsdWUpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCVVJTlQzMgkJbG9jYWxWYWw7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCShVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8IFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sCisJCTB4NywKKwkJMCwKKwkJT2Zmc2V0LAorCQkmbG9jYWxWYWwsCisJCTQpOworCisJKnBWYWx1ZSA9IGxlMmNwdTMyKGxvY2FsVmFsKTsKKworCisJaWYgKFN0YXR1cyA8IDApCisJCSpwVmFsdWUgPSAweGZmZmZmZmZmOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgMzItYml0IE1BQyByZWdpc3RlcgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglVSU5UMzIJCQlWYWx1ZSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisJVUlOVDMyCQlsb2NhbFZhbDsKKworCWxvY2FsVmFsID0gVmFsdWU7CisKKwlTdGF0dXMgPSBSVFVTQlNpbmdsZVdyaXRlKHBBZCwgT2Zmc2V0LCAoVVNIT1JUKShsb2NhbFZhbCAmIDB4ZmZmZikpOworCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQgKyAyLCAoVVNIT1JUKSgobG9jYWxWYWwgJiAweGZmZmYwMDAwKSA+PiAxNikpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKyNpZiAxCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCA4LWJpdCBCQlAgcmVnaXN0ZXIKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSWQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKQoreworCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKKwlVSU5UCQkJaSA9IDA7CisJTlRTVEFUVVMJCXN0YXR1czsKKworCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKKwkJaWYoc3RhdHVzID49IDApCisJCXsKKwkJaWYgKCEoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkpCisJCQlicmVhazsKKwkJfQorCQlwcmludGsoIlJUVVNCUmVhZEJCUFJlZ2lzdGVyKEJCUF9DU1JfQ0ZHXzEpOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7CisJCWkrKzsKKwl9CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisKKwlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCXsKKwkJLy8KKwkJLy8gUmVhZCBmYWlsZWQgdGhlbiBSZXR1cm4gRGVmYXVsdCB2YWx1ZS4KKwkJLy8KKwkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwkvLyBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbAorCUJicENzci53b3JkIAkJCQk9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkCQkJPSAxOworCUJicENzci5maWVsZC5CdXN5CQkJPSAxOworCUJicENzci5maWVsZC5SZWdOdW0gCQk9IElkOworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7CisKKwlpID0gMDsKKwkvLyBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uCisJZG8KKwl7CisJCXN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7CisJCWlmIChzdGF0dXMgPj0gMCkKKwkJeworCQlpZiAoIShCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSkKKwkJeworCQkJKnBWYWx1ZSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7CisJCQlicmVhazsKKwkJfQorCQl9CisJCXByaW50aygiUlRVU0JSZWFkQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkdfMik6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQkvLworCQkvLyBSZWFkIGZhaWxlZCB0aGVuIFJldHVybiBEZWZhdWx0IHZhbHVlLgorCQkvLworCQkqcFZhbHVlID0gcEFkLT5CYnBXcml0ZUxhdGNoW0lkXTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbHNlCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCA4LWJpdCBCQlAgcmVnaXN0ZXIgdmlhIGZpcm13YXJlCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQlJlYWRCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVBVQ0hBUgkJCXBWYWx1ZSkKK3sKKwlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7CisJaW50CQkJCQlpLCBrOworCWZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspCisJeworCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CisJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCQlCYnBDc3Iud29yZCA9IDA7CisJCUJicENzci5maWVsZC5mUmVhZCA9IDE7CisJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CisJCUJicENzci5maWVsZC5CdXN5ID0gMTsKKwkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IElkOworCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MCwgMHhmZiwgMHgwLCAweDApOworCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQorCQl7CisJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CisJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmCisJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBJZCkpCisJCXsKKwkJCSpwVmFsdWUgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCisJeworCQlEQkdQUklOVF9FUlIoKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBJZCwgQmJwQ3NyLndvcmQpKTsKKwkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmIDEKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSA4LWJpdCBCQlAgcmVnaXN0ZXIKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCV3JpdGVCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVVDSEFSCQkJVmFsdWUpCit7CisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOworCVVJTlQJCQlpID0gMDsKKwlOVFNUQVRVUwkJc3RhdHVzOworCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKKwkJaWYgKHN0YXR1cyA+PSAwKQorCQl7CisJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQorCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKCJSVFVTQldyaXRlQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkcpOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7CisJCWkrKzsKKwl9CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisKKwlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwkvLyBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbAorCUJicENzci53b3JkIAkJCQk9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkCQkJPSAwOworCUJicENzci5maWVsZC5WYWx1ZQkJCT0gVmFsdWU7CisJQmJwQ3NyLmZpZWxkLkJ1c3kJCQk9IDE7CisJQmJwQ3NyLmZpZWxkLlJlZ051bSAJCT0gSWQ7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsKKworCXBBZC0+QmJwV3JpdGVMYXRjaFtJZF0gPSBWYWx1ZTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbHNlCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgOC1iaXQgQkJQIHJlZ2lzdGVyIHZpYSBmaXJtd2FyZQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitOVFNUQVRVUwlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJZCwKKwlJTglVQ0hBUgkJCVZhbHVlKQorCit7CisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOworCWludAkJCQkJQnVzeUNudDsKKwlmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOworCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkKKwkJCWNvbnRpbnVlOworCQlCYnBDc3Iud29yZCA9IDA7CisJCUJicENzci5maWVsZC5mUmVhZCA9IDA7CisJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CisJCUJicENzci5maWVsZC5CdXN5ID0gMTsKKwkJQmJwQ3NyLmZpZWxkLlZhbHVlID0gVmFsdWU7CisJCUJicENzci5maWVsZC5SZWdOdW0gPSBJZDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsKKwkJcEFkLT5CYnBXcml0ZUxhdGNoW0lkXSA9IFZhbHVlOworCQlicmVhazsKKwl9CisJaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCisJeworCQlEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkPTB4JXggZmFpbFxuIiwgSWQsIEJicENzci53b3JkKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBSRiByZWdpc3RlciB0aHJvdWdoIE1BQworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JXcml0ZVJGUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVDMyCQkJVmFsdWUpCit7CisJUEhZX0NTUjRfU1RSVUMJUGh5Q3NyNDsKKwlVSU5UCQkJaSA9IDA7CisJTlRTVEFUVVMJCXN0YXR1czsKKworCU5kaXNaZXJvTWVtb3J5KCZQaHlDc3I0LCBzaXplb2YoUEhZX0NTUjRfU1RSVUMpKTsKKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHMCwgJlBoeUNzcjQud29yZCk7CisJCWlmIChzdGF0dXMgPj0gMCkKKwkJeworCQlpZiAoIShQaHlDc3I0LmZpZWxkLkJ1c3kpKQorCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKCJSVFVTQldyaXRlUkZSZWdpc3RlcihSRl9DU1JfQ0ZHMCk6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcwLCBWYWx1ZSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBSVDMwNzAgUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUMzB4eFdyaXRlUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJlZ0lELAorCUlOCVVDSEFSCQkJVmFsdWUpCit7CisJUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKKwlVSU5UCQkJCWkgPSAwOworCisJZG8KKwl7CisJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOworCisJCWlmICghcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0spCisJCQlicmVhazsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDE7CisJcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPSAxOworCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7CisJcmZjc3IuZmllbGQuUkZfQ1NSX0RBVEEgPSBWYWx1ZTsKKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCBSVDMwNzAgUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmVnSUQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKQoreworCVJGX0NTUl9DRkdfU1RSVUMJcmZjc3I7CisJVUlOVAkJCQlpPTAsIGs7CisKKwlmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKQorCXsKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7CisKKwkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IEJVU1kpCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJmY3NyLndvcmQgPSAwOworCQlyZmNzci5maWVsZC5SRl9DU1JfV1IgPSAwOworCQlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7CisJCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7CisJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOworCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQorCQl7CisJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKKworCQkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBJRExFKSAmJgorCQkJKHJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID09IFJlZ0lEKSkKKwkJeworCQkJKnBWYWx1ZSA9IChVQ0hBUilyZmNzci5maWVsZC5SRl9DU1JfREFUQTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUkYgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBSZWdJRCwgcmZjc3Iud29yZCkpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JSZWFkRUVQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlPVVQJUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKQoreworCU5UU1RBVFVTCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAorCQkweDksCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCV3JpdGVFRVBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCkKK3sKKwlOVFNUQVRVUwlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDgsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRVU0JQdXRUb1NsZWVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVJTlQzMgkJdmFsdWU7CisKKwkvLyBUaW1lb3V0IDB4NDAgeCA1MHVzCisJdmFsdWUgPSAoU0xFRVBDSUQ8PDE2KSsoT1dORVJNQ1U8PDI0KSsgKDB4NDA8PDgpKzE7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDEwLCB2YWx1ZSk7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg0MDQsIDB4MzApOworCS8vUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlNsZWVwIE1haWxib3ggdGVzdHZhbHVlICV4XG4iLCB2YWx1ZSkpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMgUlRVU0JXYWtlVXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCTB4MDEsCisJCTB4MDksCisJCTAsCisJCU5VTEwsCisJCTApOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCSW5pdGlhbGl6ZUNtZFEoCisJSU4JUENtZFEJY21kcSkKK3sKKwljbWRxLT5oZWFkID0gTlVMTDsKKwljbWRxLT50YWlsID0gTlVMTDsKKwljbWRxLT5zaXplID0gMDsKKwljbWRxLT5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX0lOSVRFRDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVFVTQkVucXVldWVDbWRGcm9tTmRpcygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglORElTX09JRAkJT2lkLAorCUlOCUJPT0xFQU4JCQlTZXRJbmZvcm1hdGlvbiwKKwlJTglQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKKwlJTglVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK3sKKwlORElTX1NUQVRVUwlzdGF0dXM7CisJUENtZFFFbG10CWNtZHFlbG10ID0gTlVMTDsKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKworCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCisJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKworCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCkpOworCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8IChjbWRxZWxtdCA9PSBOVUxMKSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOworCisJCWNtZHFlbG10LT5idWZmZXIgPSBOVUxMOworCQlpZiAocEluZm9ybWF0aW9uQnVmZmVyICE9IE5VTEwpCisJCXsKKwkJCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQtPmJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQkJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpCisJCQl7CisJCQkJa2ZyZWUoY21kcWVsbXQpOworCQkJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKwkJCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gSW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IDA7CisKKwljbWRxZWxtdC0+Y29tbWFuZCA9IE9pZDsKKwljbWRxZWxtdC0+Q21kRnJvbU5kaXMgPSBUUlVFOworCWlmIChTZXRJbmZvcm1hdGlvbiA9PSBUUlVFKQorCQljbWRxZWxtdC0+U2V0T3BlcmF0aW9uID0gVFJVRTsKKwllbHNlCisJCWNtZHFlbG10LT5TZXRPcGVyYXRpb24gPSBGQUxTRTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCWlmIChwQWQtPkNtZFEuQ21kUVN0YXRlICYgUlQyODcwX1RIUkVBRF9DQU5fRE9fSU5TRVJUKQorCXsKKwkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKKwkJc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisJZWxzZQorCXsKKwkJc3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisKKwlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpCisJeworCQlpZiAoY21kcWVsbXQtPmJ1ZmZlcikKKwkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOworCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJfQorCWVsc2UKKwlSVFVTQkNNRFVwKHBBZCk7CisKKworICAgIHJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBSVFVTQkVucXVldWVJbnRlcm5hbENtZCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBORElTX09JRAkJCU9pZCwKKwlJTiBQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKKwlJTiBVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK3sKKwlORElTX1NUQVRVUwlzdGF0dXM7CisJUENtZFFFbG10CWNtZHFlbG10ID0gTlVMTDsKKworCisJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10ID09IE5VTEwpKQorCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisJTmRpc1plcm9NZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCkpOworCisJaWYoSW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPiAwKQorCXsKKwkJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdC0+YnVmZmVyLCBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8IChjbWRxZWxtdC0+YnVmZmVyID09IE5VTEwpKQorCQl7CisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKwkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKKwkJfQorCX0KKwllbHNlCisJeworCQljbWRxZWxtdC0+YnVmZmVyID0gTlVMTDsKKwkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IDA7CisJfQorCisJY21kcWVsbXQtPmNvbW1hbmQgPSBPaWQ7CisJY21kcWVsbXQtPkNtZEZyb21OZGlzID0gRkFMU0U7CisKKwlpZiAoY21kcWVsbXQgIT0gTlVMTCkKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKKwkJeworCQkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKKwkJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisJCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkKKwkJeworCQkJaWYgKGNtZHFlbG10LT5idWZmZXIpCisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCX0KKwkJZWxzZQorCQlSVFVTQkNNRFVwKHBBZCk7CisJfQorCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCRGVxdWV1ZUNtZCgKKwlJTglQQ21kUQkJY21kcSwKKwlPVVQJUENtZFFFbG10CSpwY21kcWVsbXQpCit7CisJKnBjbWRxZWxtdCA9IGNtZHEtPmhlYWQ7CisKKwlpZiAoKnBjbWRxZWxtdCAhPSBOVUxMKQorCXsKKwkJY21kcS0+aGVhZCA9IGNtZHEtPmhlYWQtPm5leHQ7CisJCWNtZHEtPnNpemUtLTsKKwkJaWYgKGNtZHEtPnNpemUgPT0gMCkKKwkJCWNtZHEtPnRhaWwgPSBOVUxMOworCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIHVzYl9jb250cm9sX21zZyAtIEJ1aWxkcyBhIGNvbnRyb2wgdXJiLCBzZW5kcyBpdCBvZmYgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uCisJICBAZGV2OiBwb2ludGVyIHRvIHRoZSB1c2IgZGV2aWNlIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8KKwkgIEBwaXBlOiBlbmRwb2ludCAicGlwZSIgdG8gc2VuZCB0aGUgbWVzc2FnZSB0bworCSAgQHJlcXVlc3Q6IFVTQiBtZXNzYWdlIHJlcXVlc3QgdmFsdWUKKwkgIEByZXF1ZXN0dHlwZTogVVNCIG1lc3NhZ2UgcmVxdWVzdCB0eXBlIHZhbHVlCisJICBAdmFsdWU6IFVTQiBtZXNzYWdlIHZhbHVlCisJICBAaW5kZXg6IFVTQiBtZXNzYWdlIGluZGV4IHZhbHVlCisJICBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSB0byBzZW5kCisJICBAc2l6ZTogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkYXRhIHRvIHNlbmQKKwkgIEB0aW1lb3V0OiB0aW1lIGluIGppZmZpZXMgdG8gd2FpdCBmb3IgdGhlIG1lc3NhZ2UgdG8gY29tcGxldGUgYmVmb3JlCisJCQkgIHRpbWluZyBvdXQgKGlmIDAgdGhlIHdhaXQgaXMgZm9yZXZlcikKKwkgIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQgKCkKKworCSAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHNpbXBsZSBjb250cm9sIG1lc3NhZ2UgdG8gYSBzcGVjaWZpZWQgZW5kcG9pbnQKKwkgIGFuZCB3YWl0cyBmb3IgdGhlIG1lc3NhZ2UgdG8gY29tcGxldGUsIG9yIHRpbWVvdXQuCisJICBJZiBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKworCSBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBmcm9tIHdpdGhpbiBhbiBpbnRlcnJ1cHQgY29udGV4dCwgbGlrZSBhCisJICBib3R0b20gaGFsZiBoYW5kbGVyLglJZiB5b3UgbmVlZCBhbiBhc3luY2hyb25vdXMgbWVzc2FnZSwgb3IgbmVlZCB0byBzZW5kCisJICBhIG1lc3NhZ2UgZnJvbSB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQsIHVzZSB1c2Jfc3VibWl0X3VyYigpCisJICBJZiBhIHRocmVhZCBpbiB5b3VyIGRyaXZlciB1c2VzIHRoaXMgY2FsbCwgbWFrZSBzdXJlIHlvdXIgZGlzY29ubmVjdCgpCisJICBtZXRob2QgY2FuIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgU2luY2UgeW91IGRvbid0IGhhdmUgYSBoYW5kbGUgb24KKwkgIHRoZSBVUkIgdXNlZCwgeW91IGNhbid0IGNhbmNlbCB0aGUgcmVxdWVzdC4KKworCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUyAgICBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVJTlQzMgkJCVRyYW5zZmVyRmxhZ3MsCisJSU4JVUNIQVIJCQlSZXF1ZXN0VHlwZSwKKwlJTglVQ0hBUgkJCVJlcXVlc3QsCisJSU4JVVNIT1JUCQkJVmFsdWUsCisJSU4JVVNIT1JUCQkJSW5kZXgsCisJSU4JUFZPSUQJCQlUcmFuc2ZlckJ1ZmZlciwKKwlJTglVSU5UMzIJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCkKK3sKKwlpbnQJCQkJcmV0OworCVBPU19DT09LSUUJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiZGV2aWNlIGRpc2Nvbm5lY3RlZFxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKGluX2ludGVycnVwdCgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiaW5faW50ZXJydXB0LCBSVFVTQl9WZW5kb3JSZXF1ZXN0IFJlcXVlc3QlMDJ4IFZhbHVlJTA0eCBPZmZzZXQlMDR4XG4iLFJlcXVlc3QsVmFsdWUsSW5kZXgpKTsKKworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwl7CisjZGVmaW5lIE1BWF9SRVRSWV9DT1VOVCAgMTAKKworCQlpbnQgcmV0cnlDb3VudCA9IDA7CisJCXZvaWQJKnRtcEJ1ZiA9IFRyYW5zZmVyQnVmZmVyOworCisJCS8vIEFjcXVpcmUgQ29udHJvbCB0b2tlbgorI2lmZGVmIElORl9BTUFaT05fU0UKKwkJLy9TZW1hcGhvcmUgZml4IElORl9BTUFaT05fU0UgaGFuZworCQkvL3BBZC0+VXNiVmVuZG9yUmVxQnVmIGlzIHRoZSBzd2FwIGZvciBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4gdG8gZml4IGRtYSBidWcuCisJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCQlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYpCisJCXsKKwkJCUFTU0VSVChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA8TUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCQkgICAJdG1wQnVmID0gKHZvaWQgKilwQWQtPlVzYlZlbmRvclJlcUJ1ZjsKKwkJICAgCU5kaXNaZXJvTWVtb3J5KHBBZC0+VXNiVmVuZG9yUmVxQnVmLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CisKKwkJICAgCWlmIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkgICAJIE5kaXNNb3ZlTWVtb3J5KHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKwkJfQorI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKwkJZG8geworCQlpZiggUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCkKKwkJCXJldD11c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsIHVzYl9zbmRjdHJscGlwZSggcE9iai0+cFVzYl9EZXYsIDAgKSwgUmVxdWVzdCwgUmVxdWVzdFR5cGUsIFZhbHVlLEluZGV4LCB0bXBCdWYsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLCBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7CisJCWVsc2UgaWYoUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOKQorCQkJcmV0PXVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwgdXNiX3JjdmN0cmxwaXBlKCBwT2JqLT5wVXNiX0RldiwgMCApLCBSZXF1ZXN0LCBSZXF1ZXN0VHlwZSwgVmFsdWUsSW5kZXgsIHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJ2ZW5kb3IgcmVxdWVzdCBkaXJlY3Rpb24gaXMgZmFpbGVkXG4iKSk7CisJCQlyZXQgPSAtMTsKKwkJfQorCisJCQlyZXRyeUNvdW50Kys7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50aygiI1xuIik7CisJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCX0KKwkJfSB3aGlsZSgocmV0IDwgMCkgJiYgKHJldHJ5Q291bnQgPCBNQVhfUkVUUllfQ09VTlQpKTsKKworI2lmZGVmIElORl9BTUFaT05fU0UKKwkgIAlpZiAoKHBBZC0+VXNiVmVuZG9yUmVxQnVmKSAmJiAoUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOKSkKKwkJCU5kaXNNb3ZlTWVtb3J5KFRyYW5zZmVyQnVmZmVyLCB0bXBCdWYsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKwkgIAl1cCgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKworICAgICAgICBpZiAocmV0IDwgMCkgeworLy8JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVU0JWZW5kb3JSZXF1ZXN0IGZhaWxlZCByZXQ9JWQgXG4iLHJldCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JfVmVuZG9yUmVxdWVzdCBmYWlsZWQoJWQpLFR4RmxhZ3M9MHgleCwgUmVxVHlwZT0lcywgUmVxPTB4JXgsIEluZGV4PTB4JXhcbiIsCisJCQkJCQlyZXQsIFRyYW5zZmVyRmxhZ3MsIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUID8gIk9VVCIgOiAiSU4iKSwgUmVxdWVzdCwgSW5kZXgpKTsKKwkJCWlmIChSZXF1ZXN0ID09IDB4MikKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJcdFJlcXVlc3QgVmFsdWU9MHglMDR4IVxuIiwgVmFsdWUpKTsKKworCQkJaWYgKChUcmFuc2ZlckJ1ZmZlciE9IE5VTEwpICYmIChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA+IDApKQorCQkJCWhleF9kdW1wKCJGYWlsZWQgVHJhbnNmZXJCdWZmZXIgdmFsdWUiLCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworICAgICAgICB9CisKKyNpZiAwCisgICAgICAgIC8vIHJldHJ5CisJCWlmIChyZXQgPCAwKSB7CisJCQlpbnQgdGVtcF9pPTA7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVU0JWZW5kb3JSZXF1ZXN0IGZhaWxlZCByZXQ9JWQsIFxuIixyZXQpKTsKKwkJCXJldCA9IDA7CisJCQlkbworCQkJeworCQkJCWlmKCBSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkJCQlyZXQ9dXNiX2NvbnRyb2xfbXNnKHBPYmotPnBVc2JfRGV2LCB1c2Jfc25kY3RybHBpcGUoIHBPYmotPnBVc2JfRGV2LCAwICksIFJlcXVlc3QsIFJlcXVlc3RUeXBlLCBWYWx1ZSxJbmRleCwgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLCBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7CisJCQkJZWxzZSBpZihSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pCisJCQkJCXJldD11c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsIHVzYl9yY3ZjdHJscGlwZSggcE9iai0+cFVzYl9EZXYsIDAgKSwgUmVxdWVzdCwgUmVxdWVzdFR5cGUsIFZhbHVlLEluZGV4LCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJCQl0ZW1wX2krKzsKKwkJCX0gd2hpbGUoIChyZXQgPCAwKSAmJiAodGVtcF9pIDw9IDEpICk7CisKKwkJCWlmKCByZXQgPj0gMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCX0KKyNlbmRpZgorCisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCSAgQ3JlYXRlcyBhbiBJUlAgdG8gc3VibWl0ZSBhbiBJT0NUTF9JTlRFUk5BTF9VU0JfUkVTRVRfUE9SVAorCSAgc3luY2hyb25vdXNseS4gQ2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgcnVubmluZyBhdAorCSAgUEFTU0lWRSBMRVZFTC4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQl9SZXNldERldmljZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlOVFNUQVRVUwkJU3RhdHVzID0gVFJVRTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCItLS0+VVNCX1Jlc2V0RGV2aWNlXG4iKSk7CisJLy9SVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyk7CisJcmV0dXJuIFN0YXR1czsKK30KKworVk9JRCBDTURIYW5kbGVyKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBDbWRRRWxtdAkJY21kcWVsbXQ7CisJUFVDSEFSCQkJcERhdGE7CisJTkRJU19TVEFUVVMJCU5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworLy8JVUxPTkcJCQlOb3cgPSAwOworCU5UU1RBVFVTCQludFN0YXR1czsKKy8vCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwl3aGlsZSAocEFkLT5DbWRRLnNpemUgPiAwKQorCXsKKwkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCVJUVVNCRGVxdWV1ZUNtZCgmcEFkLT5DbWRRLCAmY21kcWVsbXQpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCQlpZiAoY21kcWVsbXQgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXBEYXRhID0gY21kcWVsbXQtPmJ1ZmZlcjsKKworCQlpZighKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKQorCQl7CisJCQlzd2l0Y2ggKGNtZHFlbG10LT5jb21tYW5kKQorCQkJeworCQkJCWNhc2UgQ01EVEhSRUFEX0NIRUNLX0dQSU86CisJCQkJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCVVJTlQzMiBkYXRhOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2lmZGVmIFJBTElOS19BVEUKKyAgICAgICAJCQkJCWlmKEFURV9PTihwQWQpKQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisKKworCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlciggcEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7CisKKwkJCQkJCQlpZiAoZGF0YSAmIDB4MDQpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7CisJCQkJCQkJfQorCisJCQkJCQkJaWYocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworCQkJCQkJCQlpZihwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKwkJCQkJCQkJeworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPbiAhISFcbiIpKTsKKworCQkJCQkJCQkJTWxtZVJhZGlvT24ocEFkKTsKKwkJCQkJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPZmYgISEhXG4iKSk7CisKKwkJCQkJCQkJCU1sbWVSYWRpb09mZihwQWQpOworCQkJCQkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEhXX1JBRElPX09GRjsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCWNhc2UgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQ6CisJCQkJCXsKKwkJCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoTlVMTCwgcEFkLCBOVUxMLCBOVUxMKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCWNhc2UgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOgorCQkJCQl7CisJCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlOworCQkJCQkJVUNIQVIJCUluZGV4OworCQkJCQkJaW50CQkJcmV0PTA7CisJCQkJCQlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQ7CisvLwkJCQkJCVJUTVBfVFhfUklORyAqcFR4UmluZzsKKwkJCQkJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVChSZXNldFBpcGVpZD0weCUweCk9PT0+XG4iLCBwQWQtPmJ1bGtSZXNldFBpcGVpZCkpOworCQkJCQkJLy8gQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLgorCQkJCQkJLy9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQkJCQkvLyBXYWl0IDEwbXMgdG8gbGV0IHByZXZpb3VzIHBhY2tldCB0aGF0IGFyZSBhbHJlYWR5IGluIEhXIEZJRk8gdG8gY2xlYXIuIGJ5IE1BWExFRSAxMi0yNS0yMDA3CisJCQkJCQlJbmRleCA9IDA7CisJCQkJCQlkbworCQkJCQkJeworCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKKwkJCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhmMDAwMDAvKjB4ODAwMDAwKi8pID09IDApCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCUluZGV4Kys7CisJCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJCQkJCQl9d2hpbGUoSW5kZXggPCAxMDApOworCQkJCQkJTUFDVmFsdWUgPSAwOworCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCQkJCS8vIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgMm5kIGNoZWNrIHRoZSB2YWxpZGl0eS4KKwkJCQkJCWlmICgoTUFDVmFsdWUgJiAweGMwMDAwMCkgPT0gMCkKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCAmTUFDVmFsdWUpOworCQkJCQkJLy8gVG8gcHJldmVudCBSZWFkIFJlZ2lzdGVyIGVycm9yLCB3ZSAzcmQgY2hlY2sgdGhlIHZhbGlkaXR5LgorCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQorCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsICZNQUNWYWx1ZSk7CisJCQkJCQlNQUNWYWx1ZSB8PSAweDgwMDAwOworCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsIE1BQ1ZhbHVlKTsKKworCQkJCQkJLy8gV2FpdCAxbXMgdG8gcHJldmVudCBuZXh0IFVSQiB0byBidWxrb3V0IGJlZm9yZSBIVyByZXNldC4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKKwkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkJCQkJCU1BQ1ZhbHVlICY9ICh+MHg4MDAwMCk7CisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgTUFDVmFsdWUpOworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlx0U2V0IDB4MmEwIGJpdDE5LiBDbGVhciBVU0IgRE1BIFRYIHBhdGhcbiIpKTsKKworCQkJCQkJLy8gV2FpdCA1bXMgdG8gcHJldmVudCBuZXh0IFVSQiB0byBidWxrb3V0IGJlZm9yZSBIVyByZXNldC4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKKwkJCQkJCS8vUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCQkJCQkJaWYgKChwQWQtPmJ1bGtSZXNldFBpcGVpZCAmIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSA9PSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykKKwkJCQkJCXsKKwkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJCQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwgTUdNVF9SSU5HX1NJWkUgLyogcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gVFJVRSAqLykKKwkJCQkJCQl7CisJCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJCQkJCQkJfQorCQkJCQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdFRYIE1HTVQgUkVDT1ZFUiBEb25lIVxuIikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCQkJCQkJCWlmICggcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPT0gRkFMU0UpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IFRSVUU7CisJCQkJCQkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCQkJCQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gMTsKKworCQkJCQkJCQkvLyBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcKKwkJCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKworCQkJCQkJCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJCQlpZihBVEVfT04ocEFkKSkKKwkJCQkJCQkgICAgeworCQkJCQkJCQkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwkJCQkJCQkJCS8vCisJCQkJCQkJCQkvLyBJZiBkcml2ZXIgaXMgc3RpbGwgaW4gQVRFIFRYRlJBTUUgbW9kZSwKKwkJCQkJCQkJCS8vIGtlZXAgb24gdHJhbnNtaXR0aW5nIEFURSBmcmFtZXMuCisJCQkJCQkJCQkvLworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+YXRlLk1vZGUgPT0gJWRcbnBBZC0+Q29udGluQnVsa091dCA9PSAlZFxucEFkLT5CdWxrT3V0UmVtYWluZWQgPT0gJWRcbiIsIHBBZC0+YXRlLk1vZGUsIHBBZC0+Q29udGluQnVsa091dCwgYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSkpOworCQkJCQkJCQkJaWYoKHBBZC0+YXRlLk1vZGUgPT0gQVRFX1RYRlJBTUUpICYmICgocEFkLT5Db250aW5CdWxrT3V0ID09IFRSVUUpIHx8IChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID4gMCkpKQorCQkJCQkJCQkgICAgeworCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBZnRlciBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIGNvbnRpbnVlIHRvIGJ1bGsgb3V0IGZyYW1lcyAhXG4iKSk7CisKKwkJCQkJCQkJCQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgorCQkJCQkJCQkJCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgMC8qIHBBZC0+YnVsa1Jlc2V0UGlwZWlkICovLCAodXNiX2NvbXBsZXRlX3QpQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwkJCQkJCQkJCQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwTnVsbENvbnRleHQtPnBVcmIpKSE9MCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0OiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCQkJCQkJCQkJfQorCisJCQkJCQkJCQkJcEFkLT5CdWxrT3V0UmVxKys7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJCQkJCQl7CisJCQkJCQkJCVJUVVNCSW5pdEhUVHhEZXNjKHBBZCwgcEhUVFhDb250ZXh0LCBwQWQtPmJ1bGtSZXNldFBpcGVpZCwgcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwkJCQkJCQkJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocEhUVFhDb250ZXh0LT5wVXJiKSkhPTApCisJCQkJCQkJCXsKKwkJCQkJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCQkJCQkJCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSBGQUxTRTsKKwkJCQkJCQkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJCQkJCQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gMDsKKwkJCQkJCQkJCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisKKwkJCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisJCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiXHRDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFR4Q29udGV4dFslZF06Q1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBwZW5kaW5nPSVkIVxuIiwKKwkJCQkJCQkJCQkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkJCQkJCQkJCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSkpOworCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlx0XHRCdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLAorCQkJCQkJCQkJCQkJCQkJcEFkLT5CdWxrT3V0UmVxLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZSwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKwkJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXHRDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFN1Ym1pdCBUeCBEQVRBIFVSQiBmb3IgZmFpbGVkIEJ1bGtSZXEoMHglbHgpIERvbmUsIHN0YXR1cz0lZCFcbiIsIHBBZC0+YnVsa1Jlc2V0UmVxW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgcEhUVFhDb250ZXh0LT5wVXJiLT5zdGF0dXMpKTsKKworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pOworCQkJCQkJCQkvL1JUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ21kVGhyZWFkIDogVFggREFUQSBSRUNPVkVSIEZBSUwgZm9yIEJ1bGtSZXEoMHglbHgpIGJlY2F1c2UgQnVsa091dFBlbmRpbmdbJWRdIGlzIFRSVUUhXG4iLCBwQWQtPmJ1bGtSZXNldFJlcVtwQWQtPmJ1bGtSZXNldFBpcGVpZF0sIHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7CisJCQkJCQkJCWlmIChwQWQtPmJ1bGtSZXNldFBpcGVpZCA9PSAwKQorCQkJCQkJCQl7CisJCQkJCQkJCQlVQ0hBUglwZW5kaW5nQ29udGV4dCA9IDA7CisJCQkJCQkJCQlQSFRfVFhfQ09OVEVYVCBwSFRUWENvbnRleHQgPSAoUEhUX1RYX0NPTlRFWFQpKCZwQWQtPlR4Q29udGV4dFtwQWQtPmJ1bGtSZXNldFBpcGVpZCBdKTsKKwkJCQkJCQkJCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkocEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhEbWFJZHhdLkFsbG9jVmEpOworCQkJCQkJCQkJUFRYX0NPTlRFWFQgcE5VTExDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5Qc1BvbGxDb250ZXh0KTsKKwkJCQkJCQkJCVBUWF9DT05URVhUIHBQc1BvbGxDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5OdWxsQ29udGV4dCk7CisKKwkJCQkJCQkJCWlmIChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgfD0gMTsKKwkJCQkJCQkJCWVsc2UgaWYgKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSAyOworCQkJCQkJCQkJZWxzZSBpZiAocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKQorCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDQ7CisJCQkJCQkJCQllbHNlIGlmIChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSA4OworCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0ID0gMDsKKworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0VFggT2NjdXBpZWQgYnkgJWQhXG4iLCBwZW5kaW5nQ29udGV4dCkpOworCQkJCQkJCQl9CisKKwkJCQkJCQkvLyBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcKKwkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCisJCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKworCQkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBwQWQtPmJ1bGtSZXNldFBpcGVpZCkpOworCQkJCQkJCX0KKworCQkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQkJCQkJLy9SVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkJLy8gRG9uJ3QgY2FuY2VsIEJVTEtJTi4KKwkJCQkJCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmCisJCQkJCQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApCisJCQkJCQkJeworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa0luIElSUCBQZW5kaW5nISFjYW5jZWwgaXQhXG4iKSk7CisJCQkJCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCQkJCX0KKwkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCisJCQkJCQl7CisJCQkJCQkJVUNIQVIJaTsKKwkJCQkJCQlSVFVTQlJ4UGFja2V0KHBBZCk7CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IDA7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQkJCQkJCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCQkJCQkJCXsKKwkJCQkJCQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQkJCQkJCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7CisJCQkJCQkJCXBSeENvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPlJlYWRhYmxlCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOworCisJCQkJCQkJfQorCQkJCQkJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKwkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZVxuIikpOworCQkJCQkJfSovCisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ8PT09XG4iKSk7CisgICAgCSAgIAkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTjoKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOID09PSA+XG4iKSk7CisKKwkJCQkJLy8gQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLgorCQkJCQl7CisJCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJaWYgKEFURV9PTihwQWQpKQorCQkJCQkJeworCQkJCQkJCWlmKChwQWQtPlBlbmRpbmdSeCA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCQl7CisJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJBVEUgOiBCdWxrSW4gSVJQIFBlbmRpbmchISFcbiIpKTsKKwkJCQkJCQkJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CisJCQkJCQkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJCQl7CisJCQkJCQkvL3doaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCWlmKChwQWQtPlBlbmRpbmdSeCA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa0luIElSUCBQZW5kaW5nISEhXG4iKSk7CisJCQkJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMDApOworCQkJCQkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gV2FpdCAxMG1zIGJlZm9yZSByZWFkaW5nIHJlZ2lzdGVyLgorCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJCQkJCQludFN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTUFDX0NTUjAsICZNQUNWYWx1ZSk7CisKKwkJCQkJCWlmICgoTlRfU1VDQ0VTUyhudFN0YXR1cykgPT0gVFJVRSkgJiYKKwkJCQkJCQkoIShSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkpCisJCQkJCQl7CisJCQkJCQkJVUNIQVIJaTsKKworCQkJCQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdLkJ1bGtJbk9mZnNldDsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCVUxLX0lOX1JFU0VUOiBOQklJZHg9MHgleCxOQklSSWR4PTB4JXgsIEJJUlBvcz0weCVseC4gQklSZXE9eCVseCwgQklDb21wbGV0ZT0weCVseCwgQklDRmFpbDB4JWx4XG4iLAorCQkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uLCBwQWQtPkJ1bGtJblJlcSwgcEFkLT5CdWxrSW5Db21wbGV0ZSwgcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwpKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQkJCQkJeworIAkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRSeENvbnRleHRbJWRdOiBJUlBQZW5kaW5nPSVkLCBJblVzZT0lZCwgUmVhZGFibGU9JWQhXG4iCisJCQkJCQkJCQksIGksIHBBZC0+UnhDb250ZXh0W2ldLklSUFBlbmRpbmcsIHBBZC0+UnhDb250ZXh0W2ldLkluVXNlLCBwQWQtPlJ4Q29udGV4dFtpXS5SZWFkYWJsZSkpOworCQkJCQkJCX0KKyAJCQkJCQkJLyoKKworCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpKTsKKworCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwOwkvLyBSeCBCdWxrIHBvaW50ZXIKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwkJCQkJCQl7CisJCQkJCQkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJCQkJCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOworCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKwkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKworCQkJCQkJCX0qLworCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlA7IGkrKykKKwkJCQkJCQl7CisJCQkJCQkJCS8vUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJCQkJCQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwkJCQkJCQkJUFVSQgkJCXBVcmI7CisJCQkJCQkJCWludAkJCQlyZXQgPSAwOworCQkJCQkJCQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKKwkJCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApIHx8IChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCQkJCQkJCQlwQWQtPlBlbmRpbmdSeCsrOworCQkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOworCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJCQkJCQkJCS8vIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yCisJCQkJCQkJCVJUVVNCSW5pdFJ4RGVzYyhwQWQsIHBSeENvbnRleHQpOworCQkJCQkJCQlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwkJCQkJCQkJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwkJCQkJCQkJewkvLyBmYWlsCisKKwkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQkJCQkJCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCQkJCQkJCXBBZC0+UGVuZGluZ1J4LS07CisJCQkJCQkJCQlwQWQtPkJ1bGtJblJlcS0tOworCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIGZhaWxlZCglZCksIHN0YXR1cz0lZFxuIiwgcmV0LCBwVXJiLT5zdGF0dXMpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsJLy8gc3VjY2VzcworI2lmIDAKKwkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCQkJCQkJCQkvL05kaXNJbnRlcmxvY2tlZEluY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJCQkJCQkJcEFkLT5QZW5kaW5nUngrKzsKKwkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOworI2VuZGlmCisJCQkJCQkJCQkvL3ByaW50aygiQklEb25lLCBQZW5kPSVkLEJJSWR4PSVkLEJJUklkeD0lZCFcbiIsIHBBZC0+UGVuZGluZ1J4LCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCk7CisJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFN1Ym1pdCBSeCBVUkIgRG9uZSwgc3RhdHVzPSVkIVxuIiwgcFVyYi0+c3RhdHVzKSk7CisJCQkJCQkJCQlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIENhcmQgbXVzdCBiZSByZW1vdmVkCisJCQkJCQkJaWYgKE5UX1NVQ0NFU1MobnRTdGF0dXMpICE9IFRSVUUpCisJCQkJCQkJeworCQkJCQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFJlYWQgUmVnaXN0ZXIgRmFpbGVkIUNhcmQgbXVzdCBiZSByZW1vdmVkISFcblxuIikpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IENhbm5vdCBkbyBidWxrIGluIGJlY2F1c2UgZmxhZ3MoMHglbHgpIG9uICFcbiIsIHBBZC0+RmxhZ3MpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl9CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19JTiA8PT09XG4iKSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRDoKKwkJCQkJeworCQkJCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsKKwkJCQkJCVVTSE9SVAkJb2Zmc2V0OworCQkJCQkJVUlOVDMyCQlNQUNWYWx1ZSwgTUFDUlZhbHVlID0gMDsKKwkJCQkJCVNldEFzaWNXY2lkID0gKigoUFJUX1NFVF9BU0lDX1dDSUQpKHBEYXRhKSk7CisKKwkJCQkJCWlmIChTZXRBc2ljV2NpZC5XQ0lEID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQkJCQkJCXJldHVybjsKKworCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWQuV0NJRCkqSFdfV0NJRF9FTlRSWV9TSVpFOworCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQgOiBXQ0lEID0gJWxkLCBTZXRUaWQgID0gJWx4LCBEZWxldGVUaWQgPSAlbHguXG4iLCBTZXRBc2ljV2NpZC5XQ0lELCBTZXRBc2ljV2NpZC5TZXRUaWQsIFNldEFzaWNXY2lkLkRlbGV0ZVRpZCkpOworCQkJCQkJTUFDVmFsdWUgPSAocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzNdPDwyNCkrKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkclsyXTw8MTYpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMV08PDgpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMF0pOworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjEtTUFDVmFsdWU9ICV4LFxuIiwgTUFDVmFsdWUpKTsKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDVmFsdWUpOworCQkJCQkJLy8gUmVhZCBiaXRtYXNrCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCs0LCAmTUFDUlZhbHVlKTsKKwkJCQkJCWlmICggU2V0QXNpY1djaWQuRGVsZXRlVGlkICE9IDB4ZmZmZmZmZmYpCisJCQkJCQkJTUFDUlZhbHVlICY9ICh+U2V0QXNpY1djaWQuRGVsZXRlVGlkKTsKKwkJCQkJCWlmIChTZXRBc2ljV2NpZC5TZXRUaWQgIT0gMHhmZmZmZmZmZikKKwkJCQkJCQlNQUNSVmFsdWUgfD0gKFNldEFzaWNXY2lkLlNldFRpZCk7CisJCQkJCQlNQUNSVmFsdWUgJj0gMHhmZmZmMDAwMDsKKworCQkJCQkJTUFDVmFsdWUgPSAocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzVdPDw4KStwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbNF07CisJCQkJCQlNQUNWYWx1ZSB8PSBNQUNSVmFsdWU7CisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQrNCwgTUFDVmFsdWUpOworCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMi1NQUNWYWx1ZT0gJXgsXG4iLCBNQUNWYWx1ZSkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVI6CisJCQkJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCVJUX1NFVF9BU0lDX1dDSURfQVRUUkkJU2V0QXNpY1djaWRBdHRyaTsKKwkJCQkJCVVTSE9SVAkJb2Zmc2V0OworCQkJCQkJVUlOVDMyCQlNQUNSVmFsdWUgPSAwOworCQkJCQkJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKwkJCQkJCVNldEFzaWNXY2lkQXR0cmkgPSAqKChQUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSkocERhdGEpKTsKKworCQkJCQkJaWYgKFNldEFzaWNXY2lkQXR0cmkuV0NJRCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJCQkJCQlyZXR1cm47CisKKwkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLldDSUQpKkhXX1dDSURfQVRUUklfU0laRTsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZCA6IENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiA6IFdDSUQgPSAlbGQsIENpcGhlciA9ICVseC5cbiIsIFNldEFzaWNXY2lkQXR0cmkuV0NJRCwgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsKKwkJCQkJCS8vIFJlYWQgYml0bWFzaworCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZNQUNSVmFsdWUpOworCQkJCQkJTUFDUlZhbHVlID0gMDsKKwkJCQkJCU1BQ1JWYWx1ZSB8PSAoKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikgPDwgMSk7CisKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDUlZhbHVlKTsKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKKworCQkJCQkJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5XQ0lEKSpIV19JVkVJVl9FTlRSWV9TSVpFOworCQkJCQkJTUFDUlZhbHVlID0gMDsKKwkJCQkJCWlmICggKFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyIDw9IENJUEhFUl9XRVAxMjgpKQorCQkJCQkJCU1BQ1JWYWx1ZSB8PSAoIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCAzMCk7CisJCQkJCQllbHNlCisJCQkJCQkJTUFDUlZhbHVlIHw9ICgweDIwMDAwMDAwKTsKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDUlZhbHVlKTsKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKKworCQkJCQkJLy8KKwkJCQkJCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAorCQkJCQkJLy8KKwkJCQkJCS8vIGZvciBhZGhvYyBtb2RlIG9ubHkgLGJlY2F1c2Ugd2VwIHN0YXR1cyBzbG93IHRoYW4gYWRkIGtleSwgd2hlbiB1c2UgemVybyBjb25maWcKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyApCisJCQkJCQl7CisJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0U7CisKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgJk1BQ1JWYWx1ZSk7CisJCQkJCQkJTUFDUlZhbHVlICY9ICh+MHhlKTsKKwkJCQkJCQlNQUNSVmFsdWUgfD0gKCgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpIDw8IDEpOworCisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBNQUNSVmFsdWUpOworCisJCQkJCQkJLy9VcGRhdGUgZ3JvdXAga2V5IGNpcGhlciwsYmVjYXVzZSB3ZXAgc3RhdHVzIHNsb3cgdGhhbiBhZGQga2V5LCB3aGVuIHVzZSB6ZXJvIGNvbmZpZworCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgJmNzcjEud29yZCk7CisKKwkJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7CisJCQkJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyOworCisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgY3NyMS53b3JkKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCS8vIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleQorCQkJCWNhc2UgUlRfQ01EX1NFVF9LRVlfVEFCTEU6IC8vR2VuZXJhbCBjYWxsIGZvciBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgpCisJCQkJCXsKKwkJCQkJCVJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkgS2V5SW5mbzsKKwkJCQkJCUtleUluZm8gID0gKigoUFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkpKHBEYXRhKSk7CisJCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCQkJCQlLZXlJbmZvLk1hY0FkZHIsCisJCQkJCQkJCQkJCQkoVUNIQVIpS2V5SW5mby5NYWNUYWJNYXRjaFdDSUQsCisJCQkJCQkJCQkJCQkmS2V5SW5mby5DaXBoZXJLZXkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSVF9DTURfU0VUX1JYX1dDSURfVEFCTEU6IC8vR2VuZXJhbCBjYWxsIGZvciBSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KCkKKwkJCQkJeworCQkJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgOworCQkJCQkJcEVudHJ5ID0gKFBNQUNfVEFCTEVfRU5UUlkpKHBEYXRhKTsKKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJCQkJCUJTUzAsCisJCQkJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCQkJCQkJCQlwRW50cnkpOworCQkJCQl9CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlk6CisJCQkJCXsKKwkJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCQkJcEVudHJ5ID0gKE1BQ19UQUJMRV9FTlRSWSAqKXBEYXRhOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQl7CisJCQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBwRW50cnktPmFwaWR4LCAoVUNIQVIpcEVudHJ5LT5BaWQpOworCQkJCQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkpCisJCQkJCQkJeworCQkJCQkJCQlVSU5UMzIgdUlWID0gMDsKKwkJCQkJCQkJUFVDSEFSICBwdHI7CisKKwkJCQkJCQkJcHRyID0gKFBVQ0hBUikgJnVJVjsKKwkJCQkJCQkJKihwdHIgKyAzKSA9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgNik7CisJCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgdUlWLCAwKTsKKwkJCQkJCQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBwRW50cnktPkFpZCwgQlNTMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsIEZBTFNFKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCXsKKwkJCQkJCQkJVUlOVDMyIHVJViA9IDA7CisJCQkJCQkJCVBVQ0hBUiAgcHRyOworCisJCQkJCQkJCXB0ciA9IChQVUNIQVIpICZ1SVY7CisJCQkJCQkJCSoocHRyICsgMykgPSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDYpOworCQkJCQkJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgcEVudHJ5LT5BaWQsIHVJViwgMCk7CisJCQkJCQkJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgcEVudHJ5LT5BaWQsIEJTUzAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLCBGQUxTRSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCS8vCisJCQkJCQkJCS8vIE90aGVyIGNhc2UsIGRpc2FibGUgZW5naW5lLgorCQkJCQkJCQkvLyBEb24ndCB3b3JyeSBXUEEga2V5LCB3ZSB3aWxsIGFkZCBXUEEgS2V5IGFmdGVyIDQtV2F5IGhhbmRzaGFraW5nLgorCQkJCQkJCQkvLworCQkJCQkJCQlVU0hPUlQgICBvZmZzZXQ7CisJCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKHBFbnRyeS0+QWlkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQkJLy8gUlhfUEtFWV9NT0RFOjAgZm9yIG5vIHNlY3VyaXR5OyBSWF9LRVlfVEFCOjAgZm9yIHNoYXJlZCBrZXkgdGFibGU7IEJTU19JRFg6MAorCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIDApOworCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCQkJQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisJCQkJCQlwcmludGsoIlVwZGF0ZVJ4V0NJRFRhYmxlKCk6IEFpZD0lZCwgQWRkcj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCFcbiIsIHBFbnRyeS0+QWlkLAorCQkJCQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLCBwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlVSU5UCWk7CisJCQkJCQlVSU5UMzIJS2V5SWR4OworCQkJCQkJUE5ESVNfODAyXzExX1dFUAlwV2VwS2V5OworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCAgXG4iKSk7CisKKwkJCQkJCXBXZXBLZXkgPSAoUE5ESVNfODAyXzExX1dFUClwRGF0YTsKKwkJCQkJCUtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQkJCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5CisJCQkJCQlpZiAoKEtleUlkeCA+PSA0KSB8fCAoKHBXZXBLZXktPktleUxlbmd0aCAhPSA1KSAmJiAocFdlcEtleS0+S2V5TGVuZ3RoICE9IDEzKSkpCisJCQkJCQl7CisJCQkJCQkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgSU5WQUxJRF9EQVRBISFcbiIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlVQ0hBUiBDaXBoZXJBbGc7CisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworCQkJCQkJCUNpcGhlckFsZyA9IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9PSA1KT8gQ0lQSEVSX1dFUDY0IDogQ0lQSEVSX1dFUDEyODsKKworCQkJCQkJCS8vCisJCQkJCQkJLy8gQ2hhbmdlIHRoZSBXRVAgY2lwaGVyIHRvIENLSVAgY2lwaGVyIGlmIENLSVAgS1Agb24uCisJCQkJCQkJLy8gRnVuayBVSSBvciBNZWV0aW5naG91c2UgVUkgd2lsbCBhZGQgY2tpcCBrZXkgZnJvbSB0aGlzIHBhdGguCisJCQkJCQkJLy8KKworCQkJCQkJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJCQkJIAl7CisJCQkJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCQkJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW47CisJCQkJCQkgCX0KKwkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCQkJCQlpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCQkJCQlVQ0hBUglJVkVJVls4XTsKKwkJCQkJCQkJVUlOVDMyCVdDSURBdHRyaSwgVmFsdWU7CisJCQkJCQkJCVVTSE9SVAlvZmZzZXQsIG9mZnNldDI7CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KElWRUlWLCA4KTsKKwkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQkJCQkJCS8vIEFkZCBCU1NJRCB0byBXQ1RhYmxlLiBiZWNhdXNlIHRoaXMgaXMgVHggd2VwIGtleS4KKwkJCQkJCQkJLy8gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6MT1QQUlSV0lTRSBLRVksIEJTU0lkeCBpcyAwCisJCQkJCQkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOworCisJCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEJTU0lEX1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7CisJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKwkJCQkJCQkJLy8gMS4gSVYvRUlWCisJCQkJCQkJCS8vIFNwZWNpZnkga2V5IGluZGV4IHRvIGZpbmQgc2hhcmVkIGtleS4KKwkJCQkJCQkJSVZFSVZbM10gPSAoVUNIQVIpKEtleUlkeDw8IDYpOwkvL1dFUCBFaXYgYml0IG9mZi4gZ3JvdXBrZXkgaW5kZXggaXMgbm90IDAKKwkJCQkJCQkJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkJCQkJCQlvZmZzZXQyID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChCU1NJRF9XQ0lEKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJCQkJCQkJZm9yIChpPTA7IGk8ODspCisJCQkJCQkJCXsKKwkJCQkJCQkJCVZhbHVlID0gSVZFSVZbaV07CisJCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSsxXTw8OCk7CisJCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSsyXTw8MTYpOworCQkJCQkJCQkJVmFsdWUgKz0gKElWRUlWW2krM108PDI0KTsKKwkJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7CisJCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQyK2ksIFZhbHVlKTsKKwkJCQkJCQkJCWkrPTQ7CisJCQkJCQkJCX0KKworCQkJCQkJCQkvLyAyLiBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZTp1c2Ugc2hhcmUga2V5LCBCU1NJZHggaXMgMAorCQkJCQkJCQlXQ0lEQXR0cmkgPSAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOworCQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJTUzBNY2FzdF9XQ0lEIDogb2Zmc2V0ID0gJXgsIFdDSURBdHRyaSA9ICV4XG4iLCBvZmZzZXQsIFdDSURBdHRyaSkpOworCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7CisKKwkJCQkJCQl9CisJCQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgKFVDSEFSKUtleUlkeCwgQ2lwaGVyQWxnLCBwV2VwS2V5LT5LZXlNYXRlcmlhbCwgTlVMTCwgTlVMTCk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAgKEtleUlkeD0lZCwgTGVuPSVkLWJ5dGUpXG4iLCBLZXlJZHgsIHBXZXBLZXktPktleUxlbmd0aCkpOworCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRToKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IENvbnRyb2wgVGhyZWFkICEhIEVSUk9SICEhIFVua25vd24oY21kcWVsbXQtPmNvbW1hbmQ9MHgleCkgISEgXG4iLCBjbWRxZWxtdC0+Y29tbWFuZCkpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChjbWRxZWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkKKwkJeworCQkJCWlmIChjbWRxZWxtdC0+YnVmZmVyICE9IE5VTEwpCisJCQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOworCisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkgJiYgKGNtZHFlbG10LT5idWZmZXJsZW5ndGggIT0gMCkpCisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisgICAgICAgICAgICB7CisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOworCQkJfQorCQl9CisJfQkvKiBlbmQgb2Ygd2hpbGUgKi8KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3NwZWN0cnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiYTg0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3NwZWN0cnVtLmMKQEAgLTAsMCArMSwxODc2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgICAyMDA4CSAgCSAgIGNyZWF0ZWQgZm9yIDgwMi4xMWgKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAiYWN0aW9uLmgiCisKK1ZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19GVU5DVElPTl9fKSk7CisKKwlyZXR1cm47Cit9CisKK1ZPSUQgTWVhc3VyZVJlcVRhYkV4aXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0ZyZWVTcGluTG9jayhwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpCisJCWtmcmVlKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKTsKKwlwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBQTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUxvb2tVcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVVJTlQgSGFzaElkeDsKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisKKwlpZiAocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCisJCQlicmVhazsKKwkJZWxzZQorCQl7CisJCQlwUHJldkVudHJ5ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwkJfQorCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJSU5UIGk7CisJVUxPTkcgSGFzaElkeDsKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKKwlVTE9ORyBOb3c7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgTVFfUkVRX0FHRV9PVVQpKSkKKwkJCXsKKwkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKKwkJCQlwVGFiLT5TaXplLS07CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKKwkJeworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7CisJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKKwkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKKwkJCXBUYWItPlNpemUrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeSA9IE5VTEw7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJfQorCisJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQlpZiAocEVudHJ5KQorCQl7CisJCQlIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQkJeworCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBWT0lEIE1lYXN1cmVSZXFEZWxldGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCWlmKHBUYWIgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBpZiBlbXB0eSwgcmV0dXJuCisJaWYgKHBUYWItPlNpemUgPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBNZWFzdXJlUmVxVGFiIGVtcHR5LlxuIikpOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKKwlpZiAocEVudHJ5ICE9IE5VTEwpCisJeworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQlkbworCQl7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJeworCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQlwVGFiLT5TaXplLS07CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuOworfQorCitWT0lEIFRwY1JlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKFRQQ19SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKworCXJldHVybjsKK30KKworVk9JRCBUcGNSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKKwkJa2ZyZWUocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYik7CisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFMb29rVXAoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlVSU5UIEhhc2hJZHg7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisKKwlpZiAocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJcEVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCXdoaWxlIChwRW50cnkpCisJeworCQlpZiAocEVudHJ5LT5EaWFsb2dUb2tlbiA9PSBEaWFsb2dUb2tlbikKKwkJCWJyZWFrOworCQllbHNlCisJCXsKKwkJCXBQcmV2RW50cnkgPSBwRW50cnk7CisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCQl9CisJfQorCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKKworc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUluc2VydCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCUlOVCBpOworCVVMT05HIEhhc2hJZHg7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEwsIHBDdXJyRW50cnk7CisJVUxPTkcgTm93OworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgVFBDX1JFUV9BR0VfT1VUKSkpCisJCQl7CisJCQkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQkJCVBUUENfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQkJCXBUYWItPlNpemUtLTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkUpCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnktPmxhc3RUaW1lID0gTm93OworCQkJcEVudHJ5LT5WYWxpZCA9IFRSVUU7CisJCQlwRW50cnktPkRpYWxvZ1Rva2VuID0gRGlhbG9nVG9rZW47CisJCQlwVGFiLT5TaXplKys7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnkgPSBOVUxMOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJfQorCisJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQlpZiAocEVudHJ5KQorCQl7CisJCQlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBWT0lEIFRwY1JlcURlbGV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm47CisJfQorCisJLy8gaWYgZW1wdHksIHJldHVybgorCWlmIChwVGFiLT5TaXplID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwVHBjUmVxVGFiIGVtcHR5LlxuIikpOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgIT0gTlVMTCkKKwl7CisJCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCQlVTE9ORyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCVBUUENfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKwkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQlkbworCQl7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJeworCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihUUENfUkVRX0VOVFJZKSk7CisJCXBUYWItPlNpemUtLTsKKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHZXQgQ3VycmVudCBUaW1lUyB0YW1wLgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBVSU5UNjQgR2V0Q3VycmVudFRpbWVTdGFtcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBnZXQgY3VycmVudCB0aW1lIHN0YW1wLgorCXJldHVybiAwOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdldCBDdXJyZW50IFRyYW5zbWl0IFBvd2VyLgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBVSU5UOCBHZXRDdXJUeFB3cigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UOCBXY2lkKQoreworCXJldHVybiAxNjsgLyogMTYgZEJtICovCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IERpYWxvZyBUb2tlbiBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBEaWFsb2cgdG9rZW4uCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydERpYWxvZ1Rva2VuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuKQoreworCVVMT05HIFRlbXBMZW47CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkmVGVtcExlbiwKKwkJCQkJMSwJCQkJJkRpYWxvZ1Rva2VuLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IFRQQyBSZXF1ZXN0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXFJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbikKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IDA7CisJVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUVVFU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBUUEMgUmVwb3J0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIFRyYW5zbWl0IFBvd2VyLgorCQk0LiBMaW5rIE1hcmdpbi4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworIHN0YXRpYyBWT0lEIEluc2VydFRwY1JlcG9ydElFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IFR4UHdyLAorCUlOIFVJTlQ4IExpbmtNYXJnaW4pCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW4gPSBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKTsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVQT1JUOworCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBvcnRJRTsKKworCVRwY1JlcG9ydElFLlR4UHdyID0gVHhQd3I7CisJVHBjUmVwb3J0SUUuTGlua01hcmdpbiA9IExpbmtNYXJnaW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJCSZUcGNSZXBvcnRJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCisJCTQuIG5ldyBzZWxlY3RlZCBjaGFubmVsLgorCQk1LiBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgY291bnQuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydENoU3dBbm5JRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBOZXdDaGFubmVsLAorCUlOIFVJTlQ4IENoU3dDbnQpCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW4gPSBzaXplb2YoQ0hfU1dfQU5OX0lORk8pOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDsKKwlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSUU7CisKKwlDaFN3QW5uSUUuQ2hTd01vZGUgPSBDaFN3TW9kZTsKKwlDaFN3QW5uSUUuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJQ2hTd0FubklFLkNoU3dDbnQgPSBDaFN3Q250OworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCSZDaFN3QW5uSUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgTWVhc3VyZSBSZXF1ZXN0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIE1lYXN1cmUgVG9rZW4uCisJCTQuIE1lYXN1cmUgUmVxdWVzdCBNb2RlLgorCQk1LiBNZWFzdXJlIFJlcXVlc3QgVHlwZS4KKwkJNi4gTWVhc3VyZSBDaGFubmVsLgorCQk3LiBNZWFzdXJlIFN0YXJ0IHRpbWUuCisJCTguIE1lYXN1cmUgRHVyYXRpb24uCisKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcUlFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFBNRUFTVVJFX1JFUV9JTkZPIHBNZWFzdXJlUmVxSUUpCit7CisJVUxPTkcgVGVtcExlbjsKKwlVSU5UOCBMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVFfSU5GTyk7CisJVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXFJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgTWVhc3VyZSBSZXBvcnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gTWVhc3VyZSBUb2tlbi4KKwkJNC4gTWVhc3VyZSBSZXF1ZXN0IE1vZGUuCisJCTUuIE1lYXN1cmUgUmVxdWVzdCBUeXBlLgorCQk2LiBMZW5ndGggb2YgUmVwb3J0IEluZm9tYXRpb24KKwkJNy4gUG9pbnRlciBvZiBSZXBvcnQgSW5mb21hdGlvbiBCdWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydE1lYXN1cmVSZXBvcnRJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydElFLAorCUlOIFVJTlQ4IFJlcG9ydExuZm9MZW4sCisJSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKworCUxlbiA9IHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSArIFJlcG9ydExuZm9MZW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJCXBNZWFzdXJlUmVwb3J0SUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlpZiAoKFJlcG9ydExuZm9MZW4gPiAwKSAmJiAocFJlcG9ydEluZm8gIT0gTlVMTCkpCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYgKyAqcEZyYW1lTGVuLAkJJlRlbXBMZW4sCisJCQkJCQkJUmVwb3J0TG5mb0xlbiwJCQkJcFJlcG9ydEluZm8sCisJCQkJCQkJRU5EX09GX0FSR1MpOworCisJCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKwl9CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJRTsKKwlVSU5UOCBSbVJlcURhaWxvZ1Rva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lID0gR2V0Q3VycmVudFRpbWVTdGFtcChwQWQpOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUSk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKKworCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pKTsKKwlNZWFzdXJlUmVxSUUuVG9rZW4gPSBSbVJlcURhaWxvZ1Rva2VuOworCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBjcHUybGUxNihNZWFzdXJlRHVyYXRpb24pOworCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVxSUUpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggRGlhbG9nVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IFJlcG9ydEluZm9MZW4sCisJSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcElFOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUCk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcElFLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCU1lYXN1cmVSZXBJRS5Ub2tlbiA9IE1lYXN1cmVUb2tlbjsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CisJTWVhc3VyZVJlcElFLlJlcG9ydFR5cGUgPSBNZWFzdXJlUmVxVHlwZTsKKwlJbnNlcnRNZWFzdXJlUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCAmTWVhc3VyZVJlcElFLCBSZXBvcnRJbmZvTGVuLCBwUmVwb3J0SW5mbyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVQ0hBUiBEaWFsb2dUb2tlbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JRKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJSW5zZXJ0VHBjUmVxSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIFRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggRGlhbG9nVG9rZW4sCisJSU4gVUlOVDggVHhQd3IsCisJSU4gVUlOVDggTGlua01hcmdpbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JQKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJSW5zZXJ0VHBjUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBUeFB3ciwgTGlua01hcmdpbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKwkJMi4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCisJCTIuIGEgTmV3IHNlbGVjdGVkIGNoYW5uZWwuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZUNoU3dBbm4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBOZXdDaCkKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX0NIQU5ORUxfU1dJVENIKTsKKworCUluc2VydENoU3dBbm5JRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENoU3dNb2RlLCBOZXdDaCwgMCk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBCT09MRUFOIERmc1JlcXVpcmVtZW50Q2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggQ2hhbm5lbCkKK3sKKwlCT09MRUFOIFJlc3VsdCA9IEZBTFNFOworCUlOVCBpOworCisJZG8KKwl7CisJCS8vIGNoZWNrIERGUyBwcm9jZWR1cmUgaXMgcnVubmluZy4KKwkJLy8gbWFrZSBzdXJlIERGUyBwcm9jZWR1cmUgd29uJ3Qgc3RhcnQgdHdpY2UuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCisJCXsKKwkJCVJlc3VsdCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBjaGVjayB0aGUgbmV3IGNoYW5uZWwgY2FycmllZCBmcm9tIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbW5ldCBpcyB2YWxpZC4KKwkJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQl7CisJCQlpZiAoKENoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJCSYmKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9PSAwKSkKKwkJCXsKKwkJCQkvLyBmb3VuZCByYWRhciBzaWduYWwgaW4gdGhlIGNoYW5uZWwuIHRoZSBjaGFubmVsIGNhbid0IHVzZSBhdCBsZWFzdCBmb3IgMzAgbWludXRlcy4KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPSAxODAwOy8vMzAgbWluID0gMTgwMCBzZWMKKwkJCQlSZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitWT0lEIE5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBSQSwKKwlJTiBQVUNIQVIgcFRBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IENoYW5uZWwpCit7CisjaWZkZWYgV0RTX1NVUFBPUlQKKwlpZiAoISgocFJBWzBdICYgMHhmZikgPT0gMHhmZikpIC8vIGlzIHBSQSBhIGJyb2FkY2FzZSBhZGRyZXNzLgorCXsKKwkJSU5UIGk7CisJCS8vIGluZm8gbmVpZ2hib3IgQVBzIHRoYXQgUmFkYXIgc2lnbmFsIGZvdW5kIHRocm9naCBXRFMgbGluay4KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9XRFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKFZhbGlkV2RzRW50cnkocEFkLCBpKSkKKwkJCXsKKwkJCQlQVUNIQVIgcERBID0gcEFkLT5XZHNUYWIuV2RzRW50cnlbaV0uUGVlcldkc0FkZHI7CisKKwkJCQkvLyBEQSBlcXVhbCB0byBTQS4gaGF2ZSBubyBuZWNlc3Nhcnkgb3JpZ25hbCBBUCB3aGljaCBmb3VuZCBSYWRhciBzaWduYWwuCisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBUQSwgcERBKSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBzZW5kIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBmcmFtZSB0byBpbmZvIE5laWdoYnJvIEFQcy4KKwkJCQlFbnF1ZXVlQ2hTd0FubihwQWQsIHBEQSwgQ2hTd01vZGUsIENoYW5uZWwpOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCit9CisKK3N0YXRpYyBWT0lEIFN0YXJ0REZTUHJvY2VkdXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gVUlOVDggQ2hTd01vZGUpCit7CisJLy8gc3RhcnQgREZTIHByb2NlZHVyZQorCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU1dJVENISU5HX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGluZm9tYXRpb24gYnVmZmVyLgorCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgIHwgSUQgfCBMZW4gfENoIFN3IE1vZGUgfCBOZXcgQ2ggTnVtIHwgQ2ggU3cgQ250IHwKKyAgKy0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICAgIDEgICAgMSAgICAgICAgMSAgICAgICAgICAgMSAgICAgICAgICAgIDEKKyovCitzdGF0aWMgQk9PTEVBTiBQZWVyQ2hTd0FublNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUENIX1NXX0FOTl9JTkZPIHBDaFN3QW5uSW5mbykKK3sKKwlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisJUEVJRF9TVFJVQ1QgZWlkX3B0cjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocENoU3dBbm5JbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dNb2RlLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3Q250LCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBNZWFzdXJlbWVudCByZXF1ZXN0IGluZm9tYXRpb24gYnVmZmVyLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKKwlPVVQgUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocE1lYXN1cmVSZXFJbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcU1vZGUud29yZCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IFNXQVA2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gU1dBUDE2KE1lYXN1cmVEdXJhdGlvbik7CisKKwkJCQlyZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gTWVhc3VyZW1lbnQgcmVwb3J0IGluZm9tYXRpb24gYnVmZmVyLgorCQk0LiBiYXNpYyByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgTWVhc3VyZW1lbnQgUmVwb3J0IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBJRCB8IExlbiB8IFRva2VuIHwgUmVwb3J0IE1vZGUgfCBNZWFzdXJlIFR5cGUgfCBNZWFzdXJlIFJlcG9ydCB8CisgICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICAgIDEgICAgIDEgICAgICAxICAgICAgICAgIDEgICAgICAgICAgICAgMSAgICAgICAgICAgIHZhcmlhYmxlCisKKyAgQmFzaWMgUmVwb3J0LgorICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCisgIHwgQ2ggTnVtIHwgU3RhcnQgVGltZSB8IER1cmF0aW9uIHwgTWFwIHwKKyAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tKworICAgICAgMSAgICAgICAgICA4ICAgICAgICAgICAyICAgICAgICAxCisKKyAgTWFwIEZpZWxkIEJpdCBGb3JtYXQuCisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgIHwgQnNzIHwgT0ZETSBQcmVhbWJsZSB8IFVuaWRlbnRpZmllZCBzaWduYWwgfCBSYWRhciB8IFVubWVhc3VyZWQgfCBSZXNlcnZlZCB8CisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgICAgIDAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgIDUtNworKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydEluZm8sCisJT1VUIFBVSU5UOCBwUmVwb3J0QnVmKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisKKwkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBNZWFzdXJlUmVwb3J0SW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydE1vZGUsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKKwkJCQlpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7CisKKwkJCQl9CisJCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX0NDQV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9DQ0FfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sIHB0ciArIDExLCAxKTsKKworCQkJCX0KKwkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fUlBJX0hJU1RPR1JBTSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX1JQSV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9SUElfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+UlBJX0RlbnNpdHksIHB0ciArIDExLCA4KTsKKwkJCQl9CisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVFVRVNUOgorCQkJCXJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCQk0LiBUUEMgUmVwb3J0IElFLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVwU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQVFBDX1JFUE9SVF9JTkZPIHBUcGNSZXBJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVBPUlQ6CisJCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5UeFB3ciwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+TGlua01hcmdpbiwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJDaFN3QW5uQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSW5mbzsKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUiBpbmRleCA9IDAsIENoYW5uZWwgPSAwLCBOZXdDaGFubmVsID0gMDsKKwlVTE9ORyBCc3NpZHggPSAwOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTmRpc1plcm9NZW1vcnkoJkNoU3dBbm5JbmZvLCBzaXplb2YoQ0hfU1dfQU5OX0lORk8pKTsKKwlpZiAoISBQZWVyQ2hTd0FublNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmQ2hTd0FubkluZm8pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBDaGFubmVsIFN3aXRjaCBBY3Rpb24gRnJhbWUuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEZyLT5IZHIuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJDaFN3QW5uQWN0aW9uIC0gQnNzaWR4IGlzIG5vdCBmb3VuZFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7CisJCWhleF9kdW1wKCJTU0lEIixwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCAsNik7CisKKwkJQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCU5ld0NoYW5uZWwgPSBDaFN3QW5uSW5mby5DaGFubmVsOworCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCisJCXsKKwkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KKwkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7CisJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKworCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKKwkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCisJCQkJeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm47Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJbmZvOworCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKKworCWlmKFBlZXJNZWFzdXJlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXFJbmZvKSkKKwl7CisJCVJlcG9ydE1vZGUud29yZCA9IDA7CisJCVJlcG9ydE1vZGUuZmllbGQuSW5jYXBhYmxlID0gMTsKKwkJRW5xdWV1ZU1lYXN1cmVtZW50UmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBNZWFzdXJlUmVxSW5mby5Ub2tlbiwgUmVwb3J0TW9kZS53b3JkLCBNZWFzdXJlUmVxSW5mby5SZXFUeXBlLCAwLCBOVUxMKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgUmVwb3J0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBvcnRJbmZvOworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVBVSU5UOCBwTWVhc3VyZVJlcG9ydEluZm87CisKKy8vCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQorLy8JCXJldHVybjsKKworCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JWQpLlxuIiwgX19GVU5DVElPTl9fLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSkpOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCU5kaXNaZXJvTWVtb3J5KHBNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpOworCWlmIChQZWVyTWVhc3VyZVJlcG9ydFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVwb3J0SW5mbywgcE1lYXN1cmVSZXBvcnRJbmZvKSkKKwl7CisJCWRvIHsKKwkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJCQkvLyBOb3QgYSBhdXRvbm9tb3VzIG1lYXN1cmUgcmVwb3J0LgorCQkJLy8gY2hlY2sgdGhlIGRpYWxvZyB0b2tlbiBmaWVsZC4gZHJvcCBpdCBpZiB0aGUgZGlhbG9nIHRva2VuIGRvZXNuJ3QgbWF0Y2guCisJCQlpZiAoKERpYWxvZ1Rva2VuICE9IDApCisJCQkJJiYgKChwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSA9PSBOVUxMKSkKKwkJCQlicmVhazsKKworCQkJaWYgKHBFbnRyeSAhPSBOVUxMKQorCQkJCU1lYXN1cmVSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKKworCQkJaWYgKE1lYXN1cmVSZXBvcnRJbmZvLlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCisJCQl7CisJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBCYXNpY1JlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcE1lYXN1cmVSZXBvcnRJbmZvOworCQkJCWlmICgocEJhc2ljUmVwb3J0LT5NYXAuZmllbGQuUmFkYXIpCisJCQkJCSYmIChEZnNSZXF1aXJlbWVudENoZWNrKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSkgPT0gVFJVRSkpCisJCQkJeworCQkJCQlOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKHBBZCwgcEZyLT5IZHIuQWRkcjEsIHBGci0+SGRyLkFkZHIyLCAxLCBwQmFzaWNSZXBvcnQtPkNoTnVtKTsKKwkJCQkJU3RhcnRERlNQcm9jZWR1cmUocEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtLCAxKTsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIE1lYXN1cmVtZW50IFJlcG9ydCBGcmFtZS5cbiIpKTsKKworCWtmcmVlKHBNZWFzdXJlUmVwb3J0SW5mbyk7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlclRwY1JlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IHBGci0+T2N0ZXQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggVHhQd3IgPSBHZXRDdXJUeFB3cihwQWQsIEVsZW0tPldjaWQpOworCVVJTlQ4IExpbmtNYXJnaW4gPSAwOworCUNIQVIgUmVhbFJzc2k7CisKKwkvLyBsaW5rIG1hcmdpbjogUmF0aW8gb2YgdGhlIHJlY2VpdmVkIHNpZ25hbCBwb3dlciB0byB0aGUgbWluaW11bSBkZXNpcmVkIGJ5IHRoZSBzdGF0aW9uIChTVEEpLiBUaGUKKwkvLwkJCQlTVEEgbWF5IGluY29ycG9yYXRlIHJhdGUgaW5mb3JtYXRpb24gYW5kIGNoYW5uZWwgY29uZGl0aW9ucywgaW5jbHVkaW5nIGludGVyZmVyZW5jZSwgaW50byBpdHMgY29tcHV0YXRpb24KKwkvLwkJCQlvZiBsaW5rIG1hcmdpbi4KKworCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksCisJCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwKKwkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKworCS8vIHNraXAgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCisJLy8gRGlhbG9nIHRva2VuLgorCU5kaXNNb3ZlTWVtb3J5KCZEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKKworCUxpbmtNYXJnaW4gPSAoUmVhbFJzc2kgLyBNSU5fUkNWX1BXUik7CisJaWYgKFBlZXJUcGNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuKSkKKwkJRW5xdWV1ZVRQQ1JlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwgVHhQd3IsIExpbmtNYXJnaW4pOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlclRwY1JlcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVFBDX1JFUE9SVF9JTkZPIFRwY1JlcEluZm87CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCU5kaXNaZXJvTWVtb3J5KCZUcGNSZXBJbmZvLCBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKSk7CisJaWYgKFBlZXJUcGNSZXBTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmVHBjUmVwSW5mbykpCisJeworCQlpZiAoKHBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKSkgIT0gTlVMTCkKKwkJeworCQkJVHBjUmVxRGVsZXRlKHBBZCwgcEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogRGlhbG9nVG9rZW49JXgsIFR4UHdyPSVkLCBMaW5rTWFyZ2luPSVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgU1BFQ19NUlE6CisJCQkvLyBjdXJyZW50IHJ0Mjg2MCB1bmFibGUgZG8gc3VjaCBtZWFzdXJlIHNwZWNpZmllZCBpbiBNZWFzdXJlbWVudCBSZXF1ZXN0LgorCQkJLy8gcmVqZWN0IGFsbCBtZWFzdXJlbWVudCByZXF1ZXN0LgorCQkJUGVlck1lYXN1cmVSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19NUlA6CisJCQlQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JROgorCQkJUGVlclRwY1JlcUFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JQOgorCQkJUGVlclRwY1JlcEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX0NIQU5ORUxfU1dJVENIOgoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQlTRUNfQ0hBX09GRlNFVF9JRQlTZWNvbmRhcnk7CisJCQkJQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDaGFubmVsU3dpdGNoOworCisJCQkJLy8gODAyLjExaCBvbmx5IGhhcyBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCisJCQkJUlRNUE1vdmVNZW1vcnkoJkNoYW5uZWxTd2l0Y2gsICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs0XSwgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSk7CisKKwkJCQkvLyA4MDIuMTFuIEQzLjAzIGFkZHMgc2Vjb25kYXJ5IGNoYW5uZWwgb2Zmc2V0IGVsZW1lbnQgaW4gdGhlIGVuZC4KKwkJCQlpZiAoRWxlbS0+TXNnTGVuID09ICAoTEVOR1RIXzgwMl8xMSArIDIgKyBzaXplb2YgKENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUpICsgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJlNlY29uZGFyeSwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzldLCBzaXplb2YgKFNFQ19DSEFfT0ZGU0VUX0lFKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCkgJiYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzNdID09IDMpKQorCQkJCXsKKwkJCQkJQ2hhbm5lbFN3aXRjaEFjdGlvbihwQWQsIEVsZW0tPldjaWQsIENoYW5uZWxTd2l0Y2guTmV3Q2hhbm5lbCwgU2Vjb25kYXJ5LlNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCit9CisJCQlQZWVyQ2hTd0FubkFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0lOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZCA9IDE7CisJVUlOVCBBcmdJZHg7CisJUFVDSEFSIHRoaXNDaGFyOworCisJTUVBU1VSRV9SRVFfTU9ERSBNZWFzdXJlUmVxTW9kZTsKKwlVSU5UOCBNZWFzdXJlUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJVUlOVDggTWVhc3VyZVJlcVR5cGUgPSBSTV9CQVNJQzsKKwlVSU5UOCBNZWFzdXJlQ2ggPSAxOworCisJQXJnSWR4ID0gMTsKKwl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpCisJeworCQlzd2l0Y2goQXJnSWR4KQorCQl7CisJCQljYXNlIDE6CS8vIEFpZC4KKwkJCQlBaWQgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBUeXBlLgorCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19GVU5DVElPTl9fLCBNZWFzdXJlUmVxVHlwZSkpOworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy8gTWVhc3VyZW1lbnQgY2hhbm5lbC4KKwkJCQlNZWFzdXJlQ2ggPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisJCX0KKwkJQXJnSWR4Kys7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fRlVOQ1RJT05fXywgQWlkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoKSk7CisJaWYgKCFWQUxJRF9XQ0lEKEFpZCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCkpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlNZWFzdXJlUmVxTW9kZS53b3JkID0gMDsKKwlNZWFzdXJlUmVxTW9kZS5maWVsZC5FbmFibGUgPSAxOworCisJTWVhc3VyZVJlcUluc2VydChwQWQsIE1lYXN1cmVSZXFUb2tlbik7CisKKwlFbnF1ZXVlTWVhc3VyZW1lbnRSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwKKwkJTWVhc3VyZVJlcVRva2VuLCBNZWFzdXJlUmVxTW9kZS53b3JkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoLCAyMDAwKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1RwY1JlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZDsKKworCVVJTlQ4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCisJQWlkID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBBaWQpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7CisJCXJldHVybiBUUlVFOworCX0KKworCVRwY1JlcUluc2VydChwQWQsIFRwY1JlcVRva2VuKTsKKworCUVucXVldWVUUENSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwgVHBjUmVxVG9rZW4pOworCisJcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvZGZzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2Rmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmE2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2Rmcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIGRmcy5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBTdXBwb3J0IERGUyBmdW5jdGlvbi4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRm9uY2hpICAgIDAzLTEyLTIwMDcgICAgICBjcmVhdGVkCisqLworCisjZGVmaW5lIFJBREFSX1BVTFNFIDEKKyNkZWZpbmUgUkFEQVJfV0lEVEggMgorCisjZGVmaW5lIFdJRFRIX1JEX0lETEUgMAorI2RlZmluZSBXSURUSF9SRF9DSEVDSyAxCisKKworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBDVFNfUHJvdGVjdCwKKwlJTiBVSU5UOCBDVFNQZXJpb2QpOworCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUNoKTsKKworVUxPTkcgSmFwUmFkYXJUeXBlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUxPTkcgUlRNUEJicFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QUHJlcGFyZVJEQ1RTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVVMT05HCQkJRHVyYXRpb24sCisJSU4gIFVDSEFSICAgICAgICAgICBSVFNSYXRlLAorCUlOICBVTE9ORyAgICAgICAgICAgQ1RTQmFzZUFkZHIsCisJSU4gIFVDSEFSCQkJRnJhbWVHYXApOworCitWT0lEIFJUTVBQcmVwYXJlUmFkYXJEZXRlY3RQYXJhbXMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisKK0lOVCBTZXRfQ2hNb3ZpbmdUaW1lX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKK0lOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGVhcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9sZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxOGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGVhcC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWxlYXAuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKyNpZm5kZWYgX19MRUFQX0hfXworI2RlZmluZSBfX0xFQVBfSF9fCisKKy8vIE1lc3NhZ2VzIGZvciBBc3NvY2lhdGUgc3RhdGUgbWFjaGluZQorI2RlZmluZSBMRUFQX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgICAgICAzMAorCisjZGVmaW5lIExFQVBfTVNHX1JFUVVFU1RfSURFTlRJVFkgICAgICAgICAgIDMxCisjZGVmaW5lIExFQVBfTVNHX1JFUVVFU1RfTEVBUCAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIExFQVBfTVNHX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDMzCisjZGVmaW5lIExFQVBfTVNHX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDM0CisjZGVmaW5lIExFQVBfTVNHX1JFU1BPTlNFX0xFQVAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIExFQVBfTVNHX0VBUE9MS0VZICAgICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIExFQVBfTVNHX1VOS05PV04gICAgICAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIExFQVBfTVNHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CisvLyEgYXNzb2Mgc3RhdGUtbWFjaGluZSBzdGF0ZXMKKyNkZWZpbmUgTEVBUF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMRUFQX1dBSVRfSURFTlRJVFlfUkVRVUVTVCAgICAgICAgICAxCisjZGVmaW5lIExFQVBfV0FJVF9DSEFOTExFTkdFX1JFUVVFU1QgICAgICAgIDIKKyNkZWZpbmUgTEVBUF9XQUlUX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBMRUFQX1dBSVRfQ0hBTkxMRU5HRV9SRVNQT05TRSAgICAgICA0CisjZGVmaW5lIExFQVBfV0FJVF9FQVBPTEtFWSAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBMRUFQX1JFQVNPTl9JTlZBTElEX0FVVEggICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIExFQVBfUkVBU09OX0NIQUxMRU5HRV9GUk9NX0FQX0ZBSUxFRCAgICAgICAgMHgwMworI2RlZmluZSBMRUFQX1JFQVNPTl9DSEFMTEVOR0VfVE9fQVBfRkFJTEVEICAgICAgICAgIDB4MDQKKworI2RlZmluZSBDSVNDT19BdXRoTW9kZUxFQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0lTQ09fQXV0aE1vZGVMRUFQTm9uZSAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIExFQVBfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwMDAKKyNkZWZpbmUgTEVBUF9DSEFMTEVOR0VfUkVTUE9OU0VfTEVOR1RIICAgICAgICAgICAgICAyNAorI2RlZmluZSBMRUFQX0NIQUxMRU5HRV9SRVFVRVNUX0xFTkdUSCAgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQT0xfSEVBREVSXyB7CisgICAgVUNIQVIgICAgICAgVmVyc2lvbjsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKK30gTEVBUF9FQVBPTF9IRUFERVIsICpQTEVBUF9FQVBPTF9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0VBUE9MX1BBQ0tFVF8geworICAgIFVDSEFSICAgICAgIENvZGU7CisgICAgVUNIQVIgICAgICAgSWRlbnRpZmllcjsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGhbMl07CisgICAgVUNIQVIgICAgICAgVHlwZTsKK30gTEVBUF9FQVBPTF9QQUNLRVQsICpQTEVBUF9FQVBPTF9QQUNLRVQ7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0VBUF9DT05URU5UU18geworICAgIFVDSEFSICAgICAgIFZlcnNpb247CisgICAgVUNIQVIgICAgICAgUmVzZXJ2ZWQ7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoOworfSBMRUFQX0VBUF9DT05URU5UUywgKlBMRUFQX0VBUF9DT05URU5UUzsKKworLyoqKiBFQVBPTCBrZXkgKioqLwordHlwZWRlZiBzdHJ1Y3QgX0VBUE9MX0tFWV9IRUFERVJfIHsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKKyAgICBVQ0hBUiAgICAgICBDb3VudGVyWzhdOworICAgIFVDSEFSICAgICAgIElWWzE2XTsKKyAgICBVQ0hBUiAgICAgICBJbmRleDsKKyAgICBVQ0hBUiAgICAgICBTaWduYXR1cmVbMTZdOworfSBFQVBPTF9LRVlfSEVBREVSLCAqUEVBUE9MX0tFWV9IRUFERVI7CisKK0JPT0xFQU4gTGVhcE1zZ1R5cGVTdWJzdCgKKyAgICBJTiAgVUNIQVIgICBFQVBUeXBlLAorICAgIE9VVCBVTE9ORyAgICpNc2dUeXBlKTsKKworVk9JRCBMZWFwTWFjaGluZVBlcmZvcm1BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAgICAqUywKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwTWFjSGVhZGVySW5pdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisgICAgSU4gIE9VVCBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgICAgIHdlcCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBwQWRkcjMpOworCitWT0lEIExlYXBTdGFydEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwSWRlbnRpdHlBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcFBlZXJDaGFsbGVuZ2VBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgSGFzaFB3ZCgKKyAgICBJTiAgUFVDSEFSICBwd2QsCisgICAgSU4gIElOVCAgICAgcHdkbGVuLAorICAgIE9VVCBQVUNIQVIgIGhhc2gpOworCitWT0lEIFBlZXJDaGFsbGVuZ2VSZXNwb25zZSgKKyAgICBJTiAgUFVDSEFSICBzekNoYWxsZW5nZSwKKyAgICBJTiAgUFVDSEFSICBzbWJQYXNzd2QsCisgICAgT1VUIFBVQ0hBUiAgc3pSZXNwb25zZSk7CisKK1ZPSUQgUGFyaXR5S2V5KAorICAgIE9VVCBQVUNIQVIgIHN6T3V0LAorICAgIElOICBQVUNIQVIgIHN6SW4pOworCitWT0lEIERlc0tleSgKKyAgICBPVVQgVUxPTkcgICBrWzE2XVsyXSwKKyAgICBJTiAgUFVDSEFSICBrZXksCisgICAgSU4gIElOVCAgICAgZGVjcnlwdCk7CisKK1ZPSUQgRGVzKAorICAgIElOICBVTE9ORyAgIGtzWzE2XVsyXSwKKyAgICBPVVQgVUNIQVIgICBibG9ja1s4XSk7CisKK1ZPSUQgRGVzRW5jcnlwdCgKKyAgICBJTiAgUFVDSEFSICBzekNsZWFyLAorICAgIElOICBQVUNIQVIgIHN6S2V5LAorICAgIE9VVCBQVUNIQVIgIHN6T3V0KTsKKworVk9JRCBMZWFwTmV0d29ya0NoYWxsZW5nZUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwTmV0d29ya0NoYWxsZW5nZVJlc3BvbnNlKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIEhhc2hwd2RIYXNoKAorICAgIElOICBQVUNIQVIgIGhhc2gsCisgICAgSU4gIFBVQ0hBUiAgaGFzaGhhc2gpOworCitWT0lEIFByb2Nlc3NTZXNzaW9uS2V5KAorICAgIE9VVCBQVUNIQVIgIFNlc3Npb25LZXksCisgICAgSU4gIFBVQ0hBUiAgaGFzaDIsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlVG9SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlUmVzcG9uc2VGcm9tUmFkaXVzLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZUZyb21SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlUmVzcG9uc2VUb1JhZGl1cyk7CisKK1ZPSUQgTGVhcEVhcG9sS2V5QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIFJvZ3VlQXBUYWJsZUluaXQoCisgICAgSU4gUk9HVUVBUF9UQUJMRSAgICAqVGFiKTsKKworVUxPTkcgUm9ndWVBcFRhYmxlU2VhcmNoKAorICAgIElOIFJPR1VFQVBfVEFCTEUgICAgKlRhYiwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBSb2d1ZUFwRW50cnlTZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFJPR1VFQVBfRU5UUlkgICAqcFJvZ3VlQXAsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKKyAgICBJTiBVQ0hBUiAgICAgICAgICAgIEZhaWxlQ29kZSk7CisKK1VMT05HIFJvZ3VlQXBUYWJsZVNldEVudHJ5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIE9VVCBST0dVRUFQX1RBQkxFICAqVGFiLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICAgICBGYWlsZUNvZGUpOworCitWT0lEIFJvZ3VlQXBUYWJsZURlbGV0ZUVudHJ5KAorICAgIElOIE9VVCBST0dVRUFQX1RBQkxFICpUYWIsCisgICAgSU4gUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBMZWFwQXV0aFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMZWFwU2VuZFJvZ3VlQVBSZXBvcnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIENDS01Bc3NvY1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICpNc2csCisgICAgSU4gVUxPTkcgICAgICAgICAgICBNc2dMZW4pOworCisjZW5kaWYgIC8vIF9fTEVBUF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGlua19saXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2xpbmtfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTIxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2xpbmtfbGlzdC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTElOS19MSVNUX0hfXworI2RlZmluZSBfX0xJTktfTElTVF9IX18KKwordHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUlkKK3sKKwlzdHJ1Y3QgX0xJU1RfRU5UUlkgKnBOZXh0OworfSBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9MSVNUX0hFQURSCit7CisJUExJU1RfRU5UUlkgcEhlYWQ7CisJUExJU1RfRU5UUlkgcFRhaWw7CisJVUNIQVIgc2l6ZTsKK30gTElTVF9IRUFERVIsICpQTElTVF9IRUFERVI7CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBpbml0TGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QpCit7CisJcExpc3QtPnBIZWFkID0gcExpc3QtPnBUYWlsID0gTlVMTDsKKwlwTGlzdC0+c2l6ZSA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFZPSUQgaW5zZXJ0VGFpbExpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0LAorCUlOIFBMSVNUX0VOVFJZIHBFbnRyeSkKK3sKKwlwRW50cnktPnBOZXh0ID0gTlVMTDsKKwlpZiAocExpc3QtPnBUYWlsKQorCQlwTGlzdC0+cFRhaWwtPnBOZXh0ID0gcEVudHJ5OworCWVsc2UKKwkJcExpc3QtPnBIZWFkID0gcEVudHJ5OworCXBMaXN0LT5wVGFpbCA9IHBFbnRyeTsKKwlwTGlzdC0+c2l6ZSsrOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIHJlbW92ZUhlYWRMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlQTElTVF9FTlRSWSBwTmV4dDsKKwlQTElTVF9FTlRSWSBwRW50cnk7CisKKwlwRW50cnkgPSBwTGlzdC0+cEhlYWQ7CisJaWYgKHBMaXN0LT5wSGVhZCAhPSBOVUxMKQorCXsKKwkJcE5leHQgPSBwTGlzdC0+cEhlYWQtPnBOZXh0OworCQlwTGlzdC0+cEhlYWQgPSBwTmV4dDsKKwkJaWYgKHBOZXh0ID09IE5VTEwpCisJCQlwTGlzdC0+cFRhaWwgPSBOVUxMOworCQlwTGlzdC0+c2l6ZS0tOworCX0KKwlyZXR1cm4gcEVudHJ5OworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRMaXN0U2l6ZSgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QpCit7CisJcmV0dXJuIHBMaXN0LT5zaXplOworfQorCitzdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIGRlbEVudHJ5TGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QsCisJSU4gUExJU1RfRU5UUlkgcEVudHJ5KQoreworCVBMSVNUX0VOVFJZIHBDdXJFbnRyeTsKKwlQTElTVF9FTlRSWSBwUHJ2RW50cnk7CisKKwlpZihwTGlzdC0+cEhlYWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZihwRW50cnkgPT0gcExpc3QtPnBIZWFkKQorCXsKKwkJcEN1ckVudHJ5ID0gcExpc3QtPnBIZWFkOworCQlwTGlzdC0+cEhlYWQgPSBwQ3VyRW50cnktPnBOZXh0OworCisJCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQorCQkJcExpc3QtPnBUYWlsID0gTlVMTDsKKworCQlwTGlzdC0+c2l6ZS0tOworCQlyZXR1cm4gcEN1ckVudHJ5OworCX0KKworCXBQcnZFbnRyeSA9IHBMaXN0LT5wSGVhZDsKKwlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OworCXdoaWxlKHBDdXJFbnRyeSAhPSBOVUxMKQorCXsKKwkJaWYgKHBFbnRyeSA9PSBwQ3VyRW50cnkpCisJCXsKKwkJCXBQcnZFbnRyeS0+cE5leHQgPSBwQ3VyRW50cnktPnBOZXh0OworCisJCQlpZihwRW50cnkgPT0gcExpc3QtPnBUYWlsKQorCQkJCXBMaXN0LT5wVGFpbCA9IHBQcnZFbnRyeTsKKworCQkJcExpc3QtPnNpemUtLTsKKwkJCWJyZWFrOworCQl9CisJCXBQcnZFbnRyeSA9IHBDdXJFbnRyeTsKKwkJcEN1ckVudHJ5ID0gcFBydkVudHJ5LT5wTmV4dDsKKwl9CisKKwlyZXR1cm4gcEN1ckVudHJ5OworfQorCisjZW5kaWYgLy8gX19fTElOS19MSVNUX0hfXyAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU1YjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDQuaApAQCAtMCwwICsxLDQyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTUQ0X0hfXworI2RlZmluZSBfX01ENF9IX18KKworLyogTUQ0IGNvbnRleHQuICovCit0eXBlZGVmCXN0cnVjdAlfTUQ0X0NUWF8JeworCVVMT05HCXN0YXRlWzRdOyAgICAgICAgLyogc3RhdGUgKEFCQ0QpICovCisJVUxPTkcJY291bnRbMl07ICAgICAgICAvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KKwlVQ0hBUglidWZmZXJbNjRdOyAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworfQlNRDRfQ1RYOworCitWT0lEIE1ENEluaXQgKE1ENF9DVFggKik7CitWT0lEIE1ENFVwZGF0ZSAoTUQ0X0NUWCAqLCBQVUNIQVIsIFVJTlQpOworVk9JRCBNRDRGaW5hbCAoVUNIQVIgWzE2XSwgTUQ0X0NUWCAqKTsKKworI2VuZGlmIC8vX19NRDRfSF9fClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1ZGIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWQ1LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbWQ1LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlqYW4JCQkxMC0yOC0wMwkJSW5pdGlhbAorCVJpdGEgICAgCTExLTIzLTA0CQlNb2RpZnkgTUQ1IGFuZCBTSEEtMQorKi8KKworI2lmbmRlZgl1aW50OAorI2RlZmluZQl1aW50OCAgdW5zaWduZWQJY2hhcgorI2VuZGlmCisKKyNpZm5kZWYJdWludDMyCisjZGVmaW5lCXVpbnQzMiB1bnNpZ25lZAlsb25nIGludAorI2VuZGlmCisKKworI2lmbmRlZglfX01ENV9IX18KKyNkZWZpbmUJX19NRDVfSF9fCisKKyNkZWZpbmUgTUQ1X01BQ19MRU4gMTYKKwordHlwZWRlZiBzdHJ1Y3QgX01ENV9DVFggeworICAgIFVJTlQzMiAgIEJ1Zls0XTsgICAgICAgICAgICAgLy8gYnVmZmVycyBvZiBmb3VyIHN0YXRlcworCVVDSEFSICAgSW5wdXRbNjRdOyAgICAgICAgICAvLyBpbnB1dCBtZXNzYWdlCisJVUlOVDMyICAgTGVuSW5CaXRDb3VudFsyXTsgICAvLyBsZW5ndGggY291bnRlciBmb3IgaW5wdXQgbWVzc2FnZSwgMCB1cCB0byA2NCBiaXRzCit9ICAgTUQ1X0NUWDsKKworVk9JRCBNRDVJbml0KE1ENV9DVFggKnBDdHgpOworVk9JRCBNRDVVcGRhdGUoTUQ1X0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcyk7CitWT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpOworVk9JRCBNRDVUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls0XSwgVUlOVDMyIE1lc1sxNl0pOworCit2b2lkIG1kNV9tYWModTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpOwordm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7CisKKy8vCisvLyBTSEEgY29udGV4dAorLy8KK3R5cGVkZWYJc3RydWN0IF9TSEFfQ1RYCit7CisJVUlOVDMyICAgQnVmWzVdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZpdmUgc3RhdGVzCisJVUNIQVIgICBJbnB1dFs4MF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKKwlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKKworfQlTSEFfQ1RYOworCitWT0lEIFNIQUluaXQoU0hBX0NUWCAqcEN0eCk7CitVQ0hBUiBTSEFVcGRhdGUoU0hBX0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcyk7CitWT0lEIFNIQUZpbmFsKFNIQV9DVFggKnBDdHgsIFVDSEFSIERpZ2VzdFsyMF0pOworVk9JRCBTSEFUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls1XSwgVUlOVDMyIE1lc1syMF0pOworCisjZGVmaW5lIFNIQV9ESUdFU1RfTEVOIDIwCisjZW5kaWYgLy8gX19NRDVfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmCV9BRVNfSAorI2RlZmluZQlfQUVTX0gKKwordHlwZWRlZglzdHJ1Y3QKK3sKKwl1aW50MzIgZXJrWzY0XTsJCS8qIGVuY3J5cHRpb24gcm91bmQJa2V5cyAqLworCXVpbnQzMiBkcmtbNjRdOwkJLyogZGVjcnlwdGlvbiByb3VuZAlrZXlzICovCisJaW50CW5yOwkJCQkvKiBudW1iZXIgb2Ygcm91bmRzCSovCit9CithZXNfY29udGV4dDsKKworaW50CSBydG1wX2Flc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCAqa2V5LAlpbnQJbmJpdHMgKTsKK3ZvaWQgcnRtcF9hZXNfZW5jcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7Cit2b2lkIHJ0bXBfYWVzX2RlY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApOworCit2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpOworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7CisKKyNlbmRpZiAvKiBhZXMuaAkqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21sbWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWxtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZmI4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21sbWUuaApAQCAtMCwwICsxLDE0NzEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbWxtZS5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZwkyMDAzLTA4LTI4CQlDcmVhdGVkCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICAgIG1vZGlmaWVkIGZvciBSVDI2MDAKKworKi8KKyNpZm5kZWYgX19NTE1FX0hfXworI2RlZmluZSBfX01MTUVfSF9fCisKKy8vZXh0ZXJuIFVDSEFSIEJST0FEQ0FTVF9BRERSW107CisKKy8vIG1heGltdW0gc3VwcG9ydGVkIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gLQorLy8gRVNTLCBJQlNTLCBQcml2YWN5LCBTaG9ydCBQcmVhbWJsZSwgU3BlY3RydW0gbWdtdCwgU2hvcnQgU2xvdAorI2RlZmluZSBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPICAgMHgwNTMzCisKKyNkZWZpbmUgRU5EX09GX0FSR1MgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIExGU1JfTUFTSyAgICAgICAgICAgICAgICAgICAweDgwMDAwMDU3CisjZGVmaW5lIE1MTUVfVEFTS19FWEVDX0lOVFYgICAgICAgICAxMDAvKjIwMCovICAgICAgIC8vCisjZGVmaW5lIExFQURfVElNRSAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICAgICAgIDEwICAvKjUqLyAgICAgICAvLyBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIE1MTUVfVEFTS19FWEVDX0lOVFYgPSAxIHNlYworI2RlZmluZSBSRU9SREVSX0VYRUNfSU5UViAgICAgICAgIAkxMDAgICAgICAgLy8gMC4xIHNlYworLy8jZGVmaW5lIFRCVFRfUFJFTE9BRF9USU1FICAgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCisKKy8vIFRoZSBkZWZpbml0aW9uIG9mIFJhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24KKyNkZWZpbmUgQ0UJCTAKKyNkZWZpbmUgRkNDCQkxCisjZGVmaW5lIEpBUAkJMgorI2RlZmluZSBKQVBfVzUzCTMKKyNkZWZpbmUgSkFQX1c1Ngk0CisjZGVmaW5lIE1BWF9SRF9SRUdJT04gNQorCisjaWZkZWYJTkRJUzUxX01JTklQT1JUCisjZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0MDAwICAgICAgIC8vIDIwNDggbXNlYyA9IDIgc2VjCisjZWxzZQorI2RlZmluZSBCRUFDT05fTE9TVF9USU1FICAgICAgICAgICAgNCAqIE9TX0haICAgIC8vIDIwNDggbXNlYyA9IDIgc2VjCisjZW5kaWYKKworI2RlZmluZSBETFNfVElNRU9VVCAgICAgICAgICAgICAgICAgMTIwMCAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIEFTU09DX1RJTUVPVVQgICAgICAgICAgICAgICAzMDAgICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBKT0lOX1RJTUVPVVQgICAgICAgICAgICAgICAgMiAqIE9TX0haICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBTSE9SVF9DSEFOTkVMX1RJTUUgICAgICAgICAgOTAgICAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgTUlOX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDExMCAgICAgICAgLy8gdW5pdDogbXNlYywgZm9yIGR1YWwgYmFuZCBzY2FuCisjZGVmaW5lIE1BWF9DSEFOTkVMX1RJTUUgICAgICAgICAgICAxNDAgICAgICAgLy8gdW5pdDogbXNlYywgZm9yIHNpbmdsZSBiYW5kIHNjYW4KKyNkZWZpbmUJRkFTVF9BQ1RJVkVfU0NBTl9USU1FCSAgICAzMCAJCSAgLy8gQWN0aXZlIHNjYW4gd2FpdGluZyBmb3IgcHJvYmUgcmVzcG9uc2UgdGltZQorI2RlZmluZSBDV19NSU5fSU5fQklUUyAgICAgICAgICAgICAgNCAgICAgICAgIC8vIGFjdHVhbCBDd01pbiA9IDJeQ1dfTUlOX0lOX0JJVFMgLSAxCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmbmRlZiBDT05GSUdfQVBfU1VQUE9SVAorI2RlZmluZSBDV19NQVhfSU5fQklUUyAgICAgICAgICAgICAgMTAgICAgICAgIC8vIGFjdHVhbCBDd01heCA9IDJeQ1dfTUFYX0lOX0JJVFMgLSAxCisjZW5kaWYKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitleHRlcm4gVUlOVDMyIENXX01BWF9JTl9CSVRTOworI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKy8vIE5vdGU6IFJTU0lfVE9fREJNX09GRlNFVCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHZhcmlhYmxlIGZvciBuZXcgUkYgKDIwMDQtMDcyMCkuCisvLyBTSG91bGQgbm90IHJlZmVyIHRvIHRoaXMgY29uc3RhbnQgYW55bW9yZQorLy8jZGVmaW5lIFJTU0lfVE9fREJNX09GRlNFVCAgICAgICAgICAxMjAgLy8gZm9yIFJUMjUzMCBSU1NJLTExNSA9IGRCbQorI2RlZmluZSBSU1NJX0ZPUl9NSURfVFhfUE9XRVIgICAgICAgLTU1ICAvLyAtNTUgZGIgaXMgY29uc2lkZXJlZCBtaWQtZGlzdGFuY2UKKyNkZWZpbmUgUlNTSV9GT1JfTE9XX1RYX1BPV0VSICAgICAgIC00NSAgLy8gLTQ1IGRiIGlzIGNvbnNpZGVyZWQgdmVyeSBzaG9ydCBkaXN0YW5jZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGlnaWJsZSB0byB1c2UgYSBsb3dlciBUWCBwb3dlcgorI2RlZmluZSBSU1NJX0ZPUl9MT1dFU1RfVFhfUE9XRVIgICAgLTMwCisvLyNkZWZpbmUgTUlEX1RYX1BPV0VSX0RFTFRBICAgICAgICAgIDAgICAvLyAwIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIG1pZC1kaXN0YW5jZSB0byBBUAorI2RlZmluZSBMT1dfVFhfUE9XRVJfREVMVEEgICAgICAgICAgNiAgICAvLyAtMyBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiB2ZXJ5IHNob3J0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgorI2RlZmluZSBMT1dFU1RfVFhfUE9XRVJfREVMVEEgICAgICAgMTYgICAvLyAtOCBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiBzaG9ydGVzdCBkaXN0YW5jZS4gMSBncmFkZSBpcyAwLjUgZGIKKworI2RlZmluZSBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRCAgICAgMAorI2RlZmluZSBSU1NJX1RSSUdHRVJFRF9VUE9OX0VYQ0NFRURfVEhSRVNIT0xEICAgMQorI2RlZmluZSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORyAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgUlNTSV9ERUxUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKworLy8gQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24KKyNkZWZpbmUgQ1FJX0lTX0dPT0QoY3FpKSAgICAgICAgICAgICgoY3FpKSA+PSA1MCkKKy8vI2RlZmluZSBDUUlfSVNfRkFJUihjcWkpICAgICAgICAgICgoKGNxaSkgPj0gMjApICYmICgoY3FpKSA8IDUwKSkKKyNkZWZpbmUgQ1FJX0lTX1BPT1IoY3FpKSAgICAgICAgICAgIChjcWkgPCA1MCkgIC8vKCgoY3FpKSA+PSA1KSAmJiAoKGNxaSkgPCAyMCkpCisjZGVmaW5lIENRSV9JU19CQUQoY3FpKSAgICAgICAgICAgICAoY3FpIDwgNSkKKyNkZWZpbmUgQ1FJX0lTX0RFQUQoY3FpKSAgICAgICAgICAgIChjcWkgPT0gMCkKKworLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQorI2RlZmluZSBSU1NJX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICA1MAorI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBSWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICAyMAorCisvLyNkZWZpbmUgUEVFUl9LRVlfTk9UX1VTRUQgICAgICAgICAgICAgICAgMAorLy8jZGVmaW5lIFBFRVJfS0VZXzY0X0JJVCAgICAgICAgICAgICAgICAgIDY0CisvLyNkZWZpbmUgUEVFUl9LRVlfMTI4X0JJVCAgICAgICAgICAgICAgICAgMTI4CisKKy8vI2RlZmluZSBQRUVSX0tFWV82NEJJVF9MRU4gICAgICAgICAgICAgICA4CisvLyNkZWZpbmUgUEVFUl9LRVlfMTI4QklUX0xFTiAgICAgICAgICAgICAgMTYKKworI2RlZmluZSBCU1NfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBNQVhfTEVOX09GX01MTUVfUVVFVUUgICAgICAgICAgICA0MCAvLzEwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgU0NBTl9QQVNTSVZFICAgICAgICAgICAgICAgICAgICAgMTgJCS8vIHNjYW4gd2l0aCBubyBwcm9iZSByZXF1ZXN0LCBvbmx5IHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorI2RlZmluZSBTQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxOQkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKyNkZWZpbmUJU0NBTl9DSVNDT19QQVNTSVZFCQkJCSAyMAkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuCisjZGVmaW5lCVNDQU5fQ0lTQ09fQUNUSVZFCQkJCSAyMQkJLy8gU2luZ2xlIGNoYW5uZWwgYWN0aXZlIHNjYW4KKyNkZWZpbmUJU0NBTl9DSVNDT19OT0lTRQkJCQkgMjIJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3Igbm9pc2UgaGlzdG9ncmFtIGNvbGxlY3Rpb24KKyNkZWZpbmUJU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQJCQkgMjMJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3IgY2hhbm5lbCBsb2FkIGNvbGxlY3Rpb24KKyNkZWZpbmUgRkFTVF9TQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgMjQJCS8vIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIFNDQU5fMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgICAgIDI2CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvLyNkZWZpbmUgQlNTX1RBQkxFX0VNUFRZKHgpICAgICAgICAgICAgICgoeCkuQnNzTnIgPT0gMCkKKyNkZWZpbmUgTUFDX0FERFJfSVNfR1JPVVAoQWRkcikgICAgICAgKCgoQWRkclswXSkgJiAweDAxKSkKKyNkZWZpbmUgTUFDX0FERFJfSEFTSChBZGRyKSAgICAgICAgICAgIChBZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCisjZGVmaW5lIE1BQ19BRERSX0hBU0hfSU5ERVgoQWRkcikgICAgICAoTUFDX0FERFJfSEFTSChBZGRyKSAlIEhBU0hfVEFCTEVfU0laRSkKKyNkZWZpbmUgVElEX01BQ19IQVNIKEFkZHIsVElEKSAgICAgICAgICAgIChUSUReQWRkclswXSBeIEFkZHJbMV0gXiBBZGRyWzJdIF4gQWRkclszXSBeIEFkZHJbNF0gXiBBZGRyWzVdKQorI2RlZmluZSBUSURfTUFDX0hBU0hfSU5ERVgoQWRkcixUSUQpICAgICAgKFRJRF9NQUNfSEFTSChBZGRyLFRJRCkgJSBIQVNIX1RBQkxFX1NJWkUpCisKKy8vIExFRCBDb250cm9sCisvLyBhc3NvaWF0aW9uIE9OLiBvbmUgTEVEIE9OLiBhbm90aGVyIGJsaW5raW5nIHdoZW4gVFgsIE9GRiB3aGVuIGlkbGUKKy8vIG5vIGFzc29jaWF0aW9uLCBib3RoIExFRCBvZmYKKyNkZWZpbmUgQVNJQ19MRURfQUNUX09OKHBBZCkgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxNCwgMHgwMDAzMWU0NikKKyNkZWZpbmUgQVNJQ19MRURfQUNUX09GRihwQWQpICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxNCwgMHgwMDAwMWU0NikKKworLy8gYml0IGRlZmluaXRpb24gb2YgdGhlIDItYnl0ZSBwQkVBQ09OLT5DYXBhYmlsaXR5IGZpZWxkCisjZGVmaW5lIENBUF9JU19FU1NfT04oeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAxKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfSUJTU19PTih4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDAwMikgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0NGX1BPTExBQkxFX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDQpICE9IDApCisjZGVmaW5lIENBUF9JU19DRl9QT0xMX1JFUV9PTih4KSAgICAgICAgICgoKHgpICYgMHgwMDA4KSAhPSAwKQorI2RlZmluZSBDQVBfSVNfUFJJVkFDWV9PTih4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MDAxMCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHgpICAgICAgKCgoeCkgJiAweDAwMjApICE9IDApCisjZGVmaW5lIENBUF9JU19QQkNDX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDQwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQUdJTElUWV9PTih4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MDA4MCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1NQRUNUUlVNX01HTVQoeCkgICAgICAgICAgKCgoeCkgJiAweDAxMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19RT1MoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMjAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorI2RlZmluZSBDQVBfSVNfU0hPUlRfU0xPVCh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MDQwMCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0FQU0QoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDA4MDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19JTU1FRF9CQSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxMDAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorI2RlZmluZSBDQVBfSVNfRFNTU19PRkRNKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MjAwMCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0RFTEFZX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDQwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisKKyNkZWZpbmUgQ0FQX0dFTkVSQVRFKGVzcyxpYnNzLHByaXYsc19wcmUsc19zbG90LHNwZWN0cnVtKSAgKCgoZXNzKSA/IDB4MDAwMSA6IDB4MDAwMCkgfCAoKGlic3MpID8gMHgwMDAyIDogMHgwMDAwKSB8ICgocHJpdikgPyAweDAwMTAgOiAweDAwMDApIHwgKChzX3ByZSkgPyAweDAwMjAgOiAweDAwMDApIHwgKChzX3Nsb3QpID8gMHgwNDAwIDogMHgwMDAwKSB8ICgoc3BlY3RydW0pID8gMHgwMTAwIDogMHgwMDAwKSkKKworLy8jZGVmaW5lIFNUQV9RT1NfQ0FQQUJJTElUWSAgICAgICAgICAgICAgIDAgLy8gMS1ieXRlLiBzZWUgODAyLjExZSBkOS4wIGZvciBiaXQgZGVmaW5pdGlvbgorCisjZGVmaW5lIEVSUF9JU19OT05fRVJQX1BSRVNFTlQoeCkgICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfVVNFX1BST1RFQ1RJT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDIpICE9IDApICAgIC8vIDgwMi4xMWcKKyNkZWZpbmUgRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoeCkgICAgKCgoeCkgJiAweDA0KSAhPSAwKSAgICAvLyA4MDIuMTFnCisKKyNkZWZpbmUgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQgICAgICAgOC8vIDMgIC8vIGp1c3QgdGVzdCBieSBnYXJ5CisjZGVmaW5lIERSU19QRU5BTFRZICAgICAgICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBCQV9OT1RVU0UgCTIKKy8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lCisjZGVmaW5lIElNTUVEX0JBIAkxCisjZGVmaW5lIERFTEFZX0JBCTAKKworLy8gQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lCisjZGVmaW5lIE9SSUdJTkFUT1IJMQorI2RlZmluZSBSRUNJUElFTlQJMAorCisvLyBBRERCQSBTdGF0dXMgQ29kZQorI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1NVQ0NFU1MJCQkJCTAKKyNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9SRUZVU0VECQkJCQkzNworI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX0lOVkFMSURfUEFSQU1FVEVSUwkJCTM4CisKKy8vIERFTEJBIFJlYXNvbiBDb2RlCisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfUVNUQV9MRUFWSU5HCQkJCTM2CisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfRU5EX0JBCQkJCQkJMzcKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9VTktOT1dOX0JBCQkJCQkzOAorI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1RJTUVPVVQJCQkJCTM5CisKKy8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworI2RlZmluZSBSRVNFVF9PTkVfU0VDX1RYX0NOVChfX3BFbnRyeSkgXAoraWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSBcCit7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeEZhaWxDb3VudCA9IDA7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXAorfQorCisvLworLy8gODAyLjExIGZyYW1lIGZvcm1hdHMKKy8vCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKKwlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKKwlVU0hPUlQJUFNNUDoxOworCVVTSE9SVAlDQ0ttb2RlaW40MDoxOworCVVTSE9SVAlBTXNkdVNpemU6MTsKKwlVU0hPUlQJRGVsYXllZEJBOjE7CS8vcnQyODYwYyBub3Qgc3VwcG9ydAorCVVTSE9SVAlSeFNUQkM6MjsKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6CisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCU1pbW9QczoyOy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlBZHZDb2Rpbmc6MTsKKyNlbHNlCisJVVNIT1JUCUFkdkNvZGluZzoxOworCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKwlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVJ4U1RCQzoyOworCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0CisJVVNIT1JUCUFNc2R1U2l6ZToxOwkvLyBvbmx5IHN1cHBvcnQgYXMgemVybworCVVTSE9SVAlDQ0ttb2RlaW40MDoxOworCVVTSE9SVAlQU01QOjE7CisJVVNIT1JUCUZvcnR5X01oel9JbnRvbGVyYW50OjE7CisJVVNIT1JUCUxTSUdUeG9wUHJvU3VwOjE7CisjZW5kaWYJLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ0FQX0lORk8sICpQSFRfQ0FQX0lORk87CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKyNlbHNlCisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglyc3Y6MzsvL21vbWkgcG93ZXIgc2FmZQorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEhUX0NBUF9QQVJNLCAqUEhUX0NBUF9QQVJNOworCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworCVVDSEFSCU1DU1NldFsxMF07CisJVUNIQVIJU3VwUmF0ZVsyXTsgIC8vIHVuaXQgOiAxTWJwcworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6MzsKKwlVQ0hBUglNcGR1RGVuc2l0eToxOworCVVDSEFSCVR4U3RyZWFtOjI7CisJVUNIQVIJVHhSeE5vdEVxdWFsOjE7CisJVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7CisjZWxzZQorCVVDSEFSCVR4TUNTU2V0RGVmaW5lZDoxOworCVVDSEFSCVR4UnhOb3RFcXVhbDoxOworCVVDSEFSCVR4U3RyZWFtOjI7CisJVUNIQVIJTXBkdURlbnNpdHk6MTsKKwlVQ0hBUglyc3Y6MzsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUNIQVIJcnN2M1szXTsKK30gSFRfTUNTX1NFVCwgKlBIVF9NQ1NfU0VUOworCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2Mjo0OworCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKKwlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0CisJVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCisJVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCVRyYW5UaW1lOjI7CisJVVNIT1JUCVBjbzoxOworI2Vsc2UKKwlVU0hPUlQJUGNvOjE7CisJVVNIT1JUCVRyYW5UaW1lOjI7CisJVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCisJVVNIT1JUCVBsdXNIVEM6MTsJLy8rSFRDIGNvbnRyb2wgZmllbGQgc3VwcG9ydAorCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKKwlVU0hPUlQJcnN2Mjo0OworI2VuZGlmIC8qIFJUX0JJR19FTkRJQU4gKi8KK30gRVhUX0hUX0NBUF9JTkZPLCAqUEVYVF9IVF9DQVBfSU5GTzsKKworLy8gIEhUIEJlYW1mb3JtaW5nIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0JGX0NBUHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUxPTkcJcnN2OjM7CisJVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKKwlVTE9ORwlDU0lSb3dCRlN1cDoyOworCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlOb0NvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlDU0lCRkFudFN1cDoyOworCVVMT05HCU1pbkdyb3VwaW5nOjI7CisJVUxPTkcJRXhwQ29tQkY6MjsKKwlVTE9ORwlFeHBOb0NvbUJGOjI7CisJVUxPTkcJRXhwQ1NJRmJrOjI7CisJVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7CisJVUxPTkcJQ2FsaWJyYXRpb246MjsKKwlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOworCVVMT05HCVR4TkRQQ2FwYWJsZToxOworCVVMT05HCVJ4TkRQQ2FwYWJsZToxOworCVVMT05HCVR4U291bmRDYXBhYmxlOjE7CisJVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOworI2Vsc2UKKwlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOworCVVMT05HCVJ4U291bmRDYXBhYmxlOjE7CisJVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlSeE5EUENhcGFibGU6MTsKKwlVTE9ORwlUeE5EUENhcGFibGU6MTsKKwlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOworCVVMT05HCUNhbGlicmF0aW9uOjI7CisJVUxPTkcJRXhwQ1NJQ2FwYWJsZToxOworCVVMT05HCUV4cE5vQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwQ1NJRmJrOjI7CisJVUxPTkcJRXhwTm9Db21CRjoyOworCVVMT05HCUV4cENvbUJGOjI7CisJVUxPTkcJTWluR3JvdXBpbmc6MjsKKwlVTE9ORwlDU0lCRkFudFN1cDoyOworCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlDU0lSb3dCRlN1cDoyOworCVVMT05HCUNoYW5Fc3RpbWF0aW9uOjI7CisJVUxPTkcJcnN2OjM7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBIVF9CRl9DQVAsICpQSFRfQkZfQ0FQOworCisvLyAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQVNfQ0FQeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6MTsKKwlVQ0hBUglUeFNvdW5kUFBEVToxOworCVVDSEFSCVJ4QVNlbDoxOworCVVDSEFSCUFudEluZEZiazoxOworCVVDSEFSCUV4cENTSUZiazoxOworCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOworCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOworCVVDSEFSCUFudFNlbGVjdDoxOworI2Vsc2UKKwlVQ0hBUglBbnRTZWxlY3Q6MTsKKwlVQ0hBUglFeHBDU0lGYmtUeEFTRUw6MTsKKwlVQ0hBUglBbnRJbmRGYmtUeEFTRUw6MTsKKwlVQ0hBUglFeHBDU0lGYms6MTsKKwlVQ0hBUglBbnRJbmRGYms6MTsKKwlVQ0hBUglSeEFTZWw6MTsKKwlVQ0hBUglUeFNvdW5kUFBEVToxOworCVVDSEFSCXJzdjoxOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KK30gSFRfQVNfQ0FQLCAqUEhUX0FTX0NBUDsKKworLy8gRHJhZnQgMS4wIHNldCBJRSBsZW5ndGggMjYsIGJ1dCBpcyBleHRlbnNpYmxlLi4KKyNkZWZpbmUgU0laRV9IVF9DQVBfSUUJCTI2CisvLyBUaGUgc3RydWN0dXJlIGZvciBIVCBDYXBhYmlsaXR5IElFLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9DQVBBQklMSVRZX0lFeworCUhUX0NBUF9JTkZPCQlIdENhcEluZm87CisJSFRfQ0FQX1BBUk0JCUh0Q2FwUGFybTsKKy8vCUhUX01DU19TRVQJCUh0TUNTU2V0OworCVVDSEFSCQkJTUNTU2V0WzE2XTsKKwlFWFRfSFRfQ0FQX0lORk8JRXh0SHRDYXBJbmZvOworCUhUX0JGX0NBUAkJVHhCRkNhcDsJLy8gYmVhbWZvcm1pbmcgY2FwLiBydDI4NjBjIG5vdCBzdXBwb3J0IGJlYW1mb3JtaW5nLgorCUhUX0FTX0NBUAkJQVNDYXA7CS8vYW50ZW5uYSBzZWxlY3Rpb24uCit9IEhUX0NBUEFCSUxJVFlfSUUsICpQSFRfQ0FQQUJJTElUWV9JRTsKKworCisvLyA4MDIuMTFuIGRyYWZ0MyByZWxhdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KKy8vIDcuMy4yLjYwCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGwJCQkJCQkJMjAJLy8gaW4gVFUuIG1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLy8gaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIHBhc3NpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbAkJCQkJMzAwICAvLyBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8vIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4KKyNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLy9pbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbgorI2RlZmluZSBkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IJCQk1CS8vIG1pbiByYXRpbyBiZXR3ZWVuIHRoZSBkZWxheSB0aW1lIGluIHBlcmZvcm1pbmcgYSBzd2l0Y2ggZnJvbSAyME1IeiBCU1MgdG8gMjAvNDAgQlNTIG9wZXJhdGlvbiBhbmQgdGhlIG1heGltYQorCQkJCQkJCQkJCQkJCQkJCS8vCWludGVydmFsIGJldHdlZW4gb3ZlcmxhcHBpbmcgQlNTIHNjYW4gb3BlcmF0aW9ucy4KKyNkZWZpbmUgZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQJCQkJCQkyNQkvLyBpbiAlJSwgbWF4IHRvdGFsIHRpbWUgdGhhdCBhIFNUQSBtYXkgYmUgYWN0aXZlIG9uIHRoZSBtZWRpdW0gZHVyaW5nIGEgcGVyaW9kIG9mCisJCQkJCQkJCQkJCQkJCQkJLy8JKGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvciAqIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsKSBzZWNvbmRzIHdpdGhvdXQKKwkJCQkJCQkJCQkJCQkJCQkvLwliZWluZyBvYmxpZ2F0ZWQgdG8gcGVyZm9ybSBPQlNTIFNjYW4gb3BlcmF0aW9ucy4gZGVmYXVsdCBpcyAyNSg9PSAwLjI1JSkKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9PVkVSTEFQX0JTU19TQ0FOX0lFeworCVVTSE9SVAkJU2NhblBhc3NpdmVEd2VsbDsKKwlVU0hPUlQJCVNjYW5BY3RpdmVEd2VsbDsKKwlVU0hPUlQJCVRyaWdnZXJTY2FuSW50OwkJCQkvLyBUcmlnZ2VyIHNjYW4gaW50ZXJ2YWwKKwlVU0hPUlQJCVBhc3NpdmVUYWxQZXJDaGFubmVsOwkJLy8gcGFzc2l2ZSB0b3RhbCBwZXIgY2hhbm5lbAorCVVTSE9SVAkJQWN0aXZlVGFsUGVyQ2hhbm5lbDsJCS8vIGFjdGl2ZSB0b3RhbCBwZXIgY2hhbm5lbAorCVVTSE9SVAkJRGVsYXlGYWN0b3I7CQkJCS8vIEJTUyB3aWR0aCBjaGFubmVsIHRyYW5zaXRpb24gZGVsYXkgZmFjdG9yCisJVVNIT1JUCQlTY2FuQWN0VGhyZTsJCQkJLy8gU2NhbiBBY3Rpdml0eSB0aHJlc2hvbGQKK31PVkVSTEFQX0JTU19TQ0FOX0lFLCAqUE9WRVJMQVBfQlNTX1NDQU5fSUU7CisKKworLy8gIDcuMy4yLjU2LiAyMC80MCBDb2V4aXN0ZW5jZSBlbGVtZW50IHVzZWQgaW4gIEVsZW1lbnQgSUQgPSA3MiA9IElFXzIwNDBfQlNTX0NPRVhJU1QKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0lFeworIHN0cnVjdCBQQUNLRUQgeworICNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2OjU7CisJVUNIQVIJQlNTMjBXaWR0aFJlcToxOworCVVDSEFSCUludG9sZXJhbnQ0MDoxOworCVVDSEFSCUluZm9SZXE6MTsKKyAjZWxzZQorCVVDSEFSCUluZm9SZXE6MTsKKwlVQ0hBUglJbnRvbGVyYW50NDA6MTsJCQkvLyBJbnRlci1CU1MuIHNldCAxIHdoZW4gcHJvaGliaXRzIGEgcmVjZWl2aW5nIEJTUyBmcm9tIG9wZXJhdGluZyBhcyBhIDIwLzQwIE1oeiBCU1MuCisJVUNIQVIJQlNTMjBXaWR0aFJlcToxOwkJLy8gSW50cmEtQlNTIHNldCAxIHdoZW4gcHJvaGliaXRzIGEgcmVjZWl2aW5nIEFQIGZyb20gb3BlcmF0aW5nIGl0cyBCU1MgYXMgYSAyMC80ME1IeiBCU1MuCisJVUNIQVIJcnN2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworICAgIH0gZmllbGQ7CisgVUNIQVIgICB3b3JkOworfSBCU1NfMjA0MF9DT0VYSVNUX0lFLCAqUEJTU18yMDQwX0NPRVhJU1RfSUU7CisKKwordHlwZWRlZiBzdHJ1Y3QgIF9UUklHR0VSX0VWRU5UQXsKKwlCT09MRUFOCQkJYlZhbGlkOworCVVDSEFSCUJTU0lEWzZdOworCVVDSEFSCVJlZ0NsYXNzOwkvLyBSZWd1bGF0b3J5IENsYXNzCisJVVNIT1JUCUNoYW5uZWw7CisJVUxPTkcJQ0RDb3VudGVyOyAgIC8vIE1haW50YWluIGEgc2VwZXJhdGUgY291bnQgZG93biBjb3VudGVyIGZvciBlYWNoIEV2ZW50IEEuCit9IFRSSUdHRVJfRVZFTlRBLCAqUFRSSUdHRVJfRVZFTlRBOworCisvLyAyMC80MCB0cmlnZ2VyIGV2ZW50IHRhYmxlCisvLyBJZiBvbmUgRXZlbnQgQSBkZWxldGUgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgQiBpcyBkZXRlY3RlZCBvciBub3QgZGV0ZWN0ZWQsIFNUQSBzaG91bGQgc2VuZCAyMDQwQlNTQ29leGlzdGVuY2UgdG8gQVAuCisjZGVmaW5lIE1BWF9UUklHR0VSX0VWRU5UCQk2NAordHlwZWRlZiBzdHJ1Y3QgIF9UUklHR0VSX0VWRU5UX1RBQnsKKwlVQ0hBUglFdmVudEFObzsKKwlUUklHR0VSX0VWRU5UQQlFdmVudEFbTUFYX1RSSUdHRVJfRVZFTlRdOworCVVMT05HCQkJRXZlbnRCQ291bnREb3duOwkvLyBDb3VudCBkb3duIGNvdW50ZXIgZm9yIEV2ZW50IEIuCit9IFRSSUdHRVJfRVZFTlRfVEFCLCAqUFRSSUdHRVJfRVZFTlRfVEFCOworCisvLyA3LjMuMjcgMjAvNDAgQnNzIENvZXhpc3RlbmNlIE1nbXQgY2FwYWJpbGl0eSB1c2VkIGluIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBpbmZvcm1hdGlvbiBJRSggSUQgPSAxMjcgPSBJRV9FWFRfQ0FQQUJJTElUWSkuCisvLwlUaGlzIGlzIHRoZSBmaXJzdCBvY3RldCBhbmQgd2FzIGRlZmluZWQgaW4gODAyLjExbiBEMy4wMyBhbmQgODAyLjExeUQ5LjAKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRVhUX0NBUF9JTkZPX0VMRU1FTlR7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjI6NTsKKwlVQ0hBUglFeHRlbmRDaGFubmVsU3dpdGNoOjE7CisJVUNIQVIJcnN2OjE7CisJVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7CisjZWxzZQorCVVDSEFSCUJzc0NvZXhpc3RNZ210U3VwcG9ydDoxOworCVVDSEFSCXJzdjoxOworCVVDSEFSCUV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwlVQ0hBUglyc3YyOjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfUVYVF9DQVBfSU5GT19FTEVNRU5ULCAqUEVYVF9DQVBfSU5GT19FTEVNRU5UOworCisKKy8vIDgwMi4xMW4gNy4zLjIuNjEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UeworCVVDSEFSCQkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFXzIwNDBfQlNTX0NPRVhJU1QgPSA3MgorCVVDSEFSCQkJCQlMZW47CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdEllOworfUJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCwgKlBCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQ7CisKKworLy84MDIuMTFuIDcuMy4yLjU5Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0JTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUeworCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgPSA3MworCVVDSEFSCQkJCUxlbjsKKwlVQ0hBUgkJCQlSZWd1bGF0b3J5Q2xhc3M7CisJVUNIQVIJCQkJQ2hMaXN0WzBdOworfUJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JULCAqUEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUOworCisKKy8vIFRoZSBzdHJ1Y3R1cmUgZm9yIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRXsKKwlVQ0hBUgkJCVN3aXRjaE1vZGU7CS8vY2hhbm5lbCBzd2l0Y2ggbW9kZQorCVVDSEFSCQkJTmV3Q2hhbm5lbDsJLy8KKwlVQ0hBUgkJCVN3aXRjaENvdW50OwkvLworfSBDSEFfU1dJVENIX0FOTk9VTkNFX0lFLCAqUENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUU7CisKKworLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNfQ0hBX09GRlNFVF9JRXsKKwlVQ0hBUgkJCVNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CSAvLyAxOiBTZWNvbmRhcnkgYWJvdmUsIDM6IFNlY29uZGFyeSBiZWxvdywgMDogbm8gU2Vjb25kYXJ5Cit9IFNFQ19DSEFfT0ZGU0VUX0lFLCAqUFNFQ19DSEFfT0ZGU0VUX0lFOworCisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIGV4dHJhY3RlZCBmcm9tIHN0cnVjdCBSVF9IVF9DQVBBQklMSVRZCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTEVBTgkJCWJIdEVuYWJsZTsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwlCT09MRUFOCQkJYlByZU5IdDsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwkvL1N1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUKKwlVQ0hBUgkJCU1DU1NldFsxNl07CS8vb25seSBzdXBvb3J0IE1DUz0wLTE1LDMyICwKK30gUlRfSFRfUEhZX0lORk8sICpQUlRfSFRfUEhZX0lORk87CisKKy8vVGhpcyBzdHJ1Y3R1cmUgc3Vic3RyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLgorLy9GZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLgordHlwZWRlZiBzdHJ1Y3QgeworI2lmIDAJLy8gbW92ZSB0bworCUJPT0xFQU4JCQliSHRFbmFibGU7CSAvLyBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuCisJQk9PTEVBTgkJCWJQcmVOSHQ7CSAvLyBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuCisJLy9TdWJzdHJhY3QgZnJvbSBIVCBDYXBhYmlsaXR5IElFCisJVUNIQVIJCQlNQ1NTZXRbMTZdOwkvL29ubHkgc3Vwb29ydCBNQ1M9MC0xNSwzMiAsCisjZW5kaWYKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCXJzdjo1OworCVVTSE9SVAlBbXNkdVNpemU6MTsJLy8gTWF4IHJlY2VpdmluZyBBLU1TRFUgc2l6ZQorCVVTSE9SVAlBbXNkdUVuYWJsZToxOwkvLyBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5pZml0IG9mIDgwMi4xMW4KKwlVU0hPUlQJUnhTVEJDOjI7CS8vIDIgYml0cworCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7CisJVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKKwlVU0hPUlQJTWltb1BzOjI7Ly9taW1vIHBvd2VyIHNhZmUgTU1QU18KKwlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7CisjZWxzZQorCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKwlVU0hPUlQJTWltb1BzOjI7Ly9taW1vIHBvd2VyIHNhZmUgTU1QU18KKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVJ4U1RCQzoyOwkvLyAyIGJpdHMKKwlVU0hPUlQJQW1zZHVFbmFibGU6MTsJLy8gRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuCisJVVNIT1JUCUFtc2R1U2l6ZToxOwkvLyBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplCisJVVNIT1JUCXJzdjo1OworI2VuZGlmCisKKwkvL1N1YnN0cmFjdCBmcm9tIEFkZGlvbnQgSFQgSU5GTyBJRQorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwkvLyBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nIAlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworI2Vsc2UKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZyAJVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsgZnJvbSA4MDIuMTFuCisJVUNIQVIJUmVjb21XaWR0aDoxOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCXJzdjI6MTE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3YzOjE7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlPcGVyYWlvbk1vZGU6MjsKKyNlbHNlCisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworCVVTSE9SVAlOb25HZlByZXNlbnQ6MTsKKwlVU0hPUlQJcnN2MzoxOworCVVTSE9SVAlPQlNTX05vbkhURXhpc3Q6MTsKKwlVU0hPUlQJcnN2MjoxMTsKKyNlbmRpZgorCisJLy8gTmV3IEV4dGVuc2lvbiBDaGFubmVsIE9mZnNldCBJRQorCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLy8gRXh0ZW5zaW9uIENhcGFiaWxpdHkgSUUgPSAxMjcKKwlVQ0hBUglCU1NDb2V4aXN0MjA0MDsKK30gUlRfSFRfQ0FQQUJJTElUWSwgKlBSVF9IVF9DQVBBQklMSVRZOworCisvLyAgIGZpZWxkIGluIEFkZHRpb25hbCBIVCBJbmZvcm1hdGlvbiBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglTZXJJbnRlckdyYW51OjM7CisJVUNIQVIJU19QU01QU3VwOjE7CisJVUNIQVIJUmlmc01vZGU6MTsKKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOworI2Vsc2UKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CisJVUNIQVIJUmVjb21XaWR0aDoxOworCVVDSEFSCVJpZnNNb2RlOjE7CisJVUNIQVIJU19QU01QU3VwOjE7CSAvL0luZGljYXRlIHN1cHBvcnQgZm9yIHNjaGVkdWxlZCBQU01QCisJVUNIQVIJU2VySW50ZXJHcmFudTozOwkgLy9zZXJ2aWNlIGludGVydmFsIGdyYW51bGFyaXR5CisjZW5kaWYKK30gQUREX0hUSU5GTywgKlBBRERfSFRJTkZPOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUR7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3YyOjExOworCVVTSE9SVAlPQlNTX05vbkhURXhpc3Q6MTsKKwlVU0hPUlQJcnN2OjE7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlPcGVyYWlvbk1vZGU6MjsKKyNlbHNlCisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworCVVTSE9SVAlOb25HZlByZXNlbnQ6MTsKKwlVU0hPUlQJcnN2OjE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3YyOjExOworI2VuZGlmCit9IEFERF9IVElORk8yLCAqUEFERF9IVElORk8yOworCisKKy8vIFRPRE86IE5lZWQgc3luYyB3aXRoIHNwZWMgYWJvdXQgdGhlIGRlZmluaXRpb24gb2YgU3RiY01jcy4gSW4gRHJhZnQgMy4wMywgaXQncyByZXNlcnZlZC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCXJzdjo0OworCVVTSE9SVAlQY29QaGFzZToxOworCVVTSE9SVAlQY29BY3RpdmU6MTsKKwlVU0hPUlQJTHNpZ1R4b3BQcm90OjE7CisJVVNIT1JUCVNUQkNCZWFjb246MTsKKwlVU0hPUlQJRHVhbENUU1Byb3RlY3Q6MTsKKwlVU0hPUlQJRHVhbEJlYWNvbjoxOworCVVTSE9SVAlTdGJjTWNzOjY7CisjZWxzZQorCVVTSE9SVAlTdGJjTWNzOjY7CisJVVNIT1JUCUR1YWxCZWFjb246MTsKKwlVU0hPUlQJRHVhbENUU1Byb3RlY3Q6MTsKKwlVU0hPUlQJU1RCQ0JlYWNvbjoxOworCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsJLy8gTC1TSUcgVFhPUCBwcm90ZWN0aW9uIGZ1bGwgc3VwcG9ydAorCVVTSE9SVAlQY29BY3RpdmU6MTsKKwlVU0hPUlQJUGNvUGhhc2U6MTsKKwlVU0hPUlQJcnN2OjQ7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBBRERfSFRJTkZPMywgKlBBRERfSFRJTkZPMzsKKworI2RlZmluZSBTSVpFX0FERF9IVF9JTkZPX0lFCQkyMgordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKKwlVQ0hBUgkJCQlDb250cm9sQ2hhbjsKKwlBRERfSFRJTkZPCQkJQWRkSHRJbmZvOworCUFERF9IVElORk8yCQkJQWRkSHRJbmZvMjsKKwlBRERfSFRJTkZPMwkJCUFkZEh0SW5mbzM7CisJVUNIQVIJCQkJTUNTU2V0WzE2XTsJCS8vIEJhc2ljIE1DUyBzZXQKK30gQUREX0hUX0lORk9fSUUsICpQQUREX0hUX0lORk9fSUU7CisKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUR7CisJVUNIQVIJCQkJTmV3RXh0Q2hhbk9mZnNldDsKK30gTkVXX0VYVF9DSEFOX0lFLCAqUE5FV19FWFRfQ0hBTl9JRTsKKworCisvLyA0LWJ5dGUgSFRDIGZpZWxkLiAgbWF5YmUgaW5jbHVkZWQgaW4gYW55IGZyYW1lIGV4Y2VwdCBub24tUU9TIGRhdGEgZnJhbWUuICBUaGUgT3JkZXIgYml0IG11c3Qgc2V0IDEuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVSU5UMzIJCVJERzoxOwkvL1JERyAvIE1vcmUgUFBEVQorICAgIFVJTlQzMgkJQUNDb25zdHJhaW50OjE7CS8vZmVlZGJhY2sgcmVxdWVzdAorICAgIFVJTlQzMgkJcnN2OjU7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCisgICAgVUlOVDMyCQlaTEZBbm5vdWNlOjE7CS8vIFpMRiBhbm5vdW5jZW1lbnQKKyAgICBVSU5UMzIJCUNTSVNURUVSSU5HOjI7CS8vQ1NJLyBTVEVFUklORworICAgIFVJTlQzMgkJRkJLUmVxOjI7CS8vZmVlZGJhY2sgcmVxdWVzdAorICAgIFVJTlQzMgkJQ2FsU2VxOjI7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCisgICAgVUlOVDMyCQlDYWxQb3M6MjsJLy8gY2FsaWJyYXRpb24gcG9zaXRpb24KKyAgICBVSU5UMzIJCU1GQm9yQVNDOjc7CS8vTGluayBhZGFwdGF0aW9uIGZlZWRiYWNrIGNvbnRhaW5pbmcgcmVjb21tZW5kZWQgTUNTLiAweDdmIGZvciBubyBmZWVkYmFjayBvciBub3QgYXZhaWxhYmxlCisgICAgVUlOVDMyCQlNRlM6MzsJLy9TRVQgdG8gdGhlIHJlY2VpdmVkIHZhbHVlIG9mIE1SUy4gMHgxMTEgZm9yIHVuc29saWNpdGVkIE1GQi4KKyAgICBVSU5UMzIJCU1SU29yQVNJOjM7CS8vIE1SUSBTZXF1ZW5jZSBpZGVudGlmaWVyLiB1bmNoYW5nZWQgZHVyaW5nIGVudGlyZSBwcm9jZWR1cmUuIDB4MDAwLTB4MTEwLgorICAgIFVJTlQzMgkJTVJROjE7CS8vTUNTIGZlZWRiYWNrLiBSZXF1ZXN0IGZvciBhIE1DUyBmZWVkYmFjaworICAgIFVJTlQzMgkJVFJROjE7CS8vc291bmRpbmcgcmVxdWVzdAorICAgIFVJTlQzMgkJTUE6MTsJLy9tYW5hZ2VtZW50IGFjdGlvbiBwYXlsb2FkIGV4aXN0IGluIChRb1MgTnVsbCtIVEMpCisjZWxzZQorICAgIFVJTlQzMgkJTUE6MTsJLy9tYW5hZ2VtZW50IGFjdGlvbiBwYXlsb2FkIGV4aXN0IGluIChRb1MgTnVsbCtIVEMpCisgICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0CisgICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCisgICAgVUlOVDMyCQlNUlNvckFTSTozOwkvLyBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4KKyAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgorICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKKyAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgorICAgIFVJTlQzMgkJQ2FsU2VxOjI7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCisgICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlDU0lTVEVFUklORzoyOwkvL0NTSS8gU1RFRVJJTkcKKyAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAorICAgIFVJTlQzMgkJcnN2OjU7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCisgICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlSREc6MTsJLy9SREcgLyBNb3JlIFBQRFUKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBIVF9DT05UUk9MLCAqUEhUX0NPTlRST0w7CisKKy8vIDItYnl0ZSBRT1MgQ09OVFJPTCBmaWVsZAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKKyAgICBVU0hPUlQgICAgICBBTXNkdVByZXNlbnQ6MTsKKyAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCisgICAgVVNIT1JUICAgICAgRU9TUDoxOworICAgIFVTSE9SVCAgICAgIFRJRDo0OworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBFT1NQOjE7CisgICAgVVNIT1JUICAgICAgQWNrUG9saWN5OjI7ICAvLzA6IG5vcm1hbCBBQ0sgMTpObyBBQ0sgMjpzY2hlZHVsZWQgdW5kZXIgTVRCQS9QU01QICAzOiBCQQorICAgIFVTSE9SVCAgICAgIEFNc2R1UHJlc2VudDoxOworICAgIFVTSE9SVCAgICAgIFR4b3BfUXVldWVTaXplOjg7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUU9TX0NPTlRST0wsICpQUU9TX0NPTlRST0w7CisKKy8vIDItYnl0ZSBGcmFtZSBjb250cm9sIGZpZWxkCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCisJVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKKwlVU0hPUlQJCU1vcmVEYXRhOjE7CQkJLy8gTW9yZSBkYXRhIGJpdAorCVVTSE9SVAkJUHdyTWdtdDoxOwkJCS8vIFBvd2VyIG1hbmFnZW1lbnQgYml0CisJVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKKwlVU0hPUlQJCU1vcmVGcmFnOjE7CQkJLy8gTW9yZSBmcmFnbWVudCBiaXQKKwlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KKwlVU0hPUlQJCVN1YlR5cGU6NDsJCQkvLyBNU0RVIHN1YnR5cGUKKwlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCisJVVNIT1JUCQlWZXI6MjsJCQkJLy8gUHJvdG9jb2wgdmVyc2lvbgorI2Vsc2UKKwlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCisJVVNIT1JUCQlUeXBlOjI7CQkJCS8vIE1TRFUgdHlwZQorCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQorCVVTSE9SVAkJVG9EczoxOwkJCQkvLyBUbyBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlGckRzOjE7CQkJCS8vIEZyb20gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAorCVVTSE9SVAkJUmV0cnk6MTsJCQkvLyBSZXRyeSBzdGF0dXMgYml0CisJVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKKwlVU0hPUlQJCU1vcmVEYXRhOjE7CQkJLy8gTW9yZSBkYXRhIGJpdAorCVVTSE9SVAkJV2VwOjE7CQkJCS8vIFdlcCBkYXRhCisJVVNIT1JUCQlPcmRlcjoxOwkJCS8vIFN0cmljdCBvcmRlciBleHBlY3RlZAorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEZSQU1FX0NPTlRST0wsICpQRlJBTUVfQ09OVFJPTDsKKwordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9IRUFERVJfODAyXzExCXsKKyAgICBGUkFNRV9DT05UUk9MICAgRkM7CisgICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJQWRkcjNbTUFDX0FERFJfTEVOXTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCQkJU2VxdWVuY2U6MTI7CisJVVNIT1JUCQkJRnJhZzo0OworI2Vsc2UKKwlVU0hPUlQJCQlGcmFnOjQ7CisJVVNIT1JUCQkJU2VxdWVuY2U6MTI7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KKwlVQ0hBUgkJCU9jdGV0WzBdOworfQlIRUFERVJfODAyXzExLCAqUEhFQURFUl84MDJfMTE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfODAyXzExIHsKKyAgICBIRUFERVJfODAyXzExICAgSGRyOworICAgIFVDSEFSICAgICAgICAgICAgT2N0ZXRbMV07Cit9ICAgRlJBTUVfODAyXzExLCAqUEZSQU1FXzgwMl8xMTsKKworLy8gUW9TTnVsbCBlbWJlZGRpbmcgb2YgbWFuYWdlbWVudCBhY3Rpb24uIFdoZW4gSFQgQ29udHJvbCBNQSBmaWVsZCBzZXQgdG8gMS4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUFfQk9EWSB7CisgICAgVUNIQVIgICAgICAgICAgICBDYXRlZ29yeTsKKyAgICBVQ0hBUiAgICAgICAgICAgIEFjdGlvbjsKKyAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOworfSAgIE1BX0JPRFksICpQTUFfQk9EWTsKKwordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9IRUFERVJfODAyXzMJeworICAgIFVDSEFSICAgICAgICAgICBEQUFkZHIxW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIFNBQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgT2N0ZXRbMl07Cit9CUhFQURFUl84MDJfMywgKlBIRUFERVJfODAyXzM7CisvLy8vQmxvY2sgQUNLIHJlbGF0ZWQgZm9ybWF0CisvLyAyLWJ5dGUgQkEgUGFyYW1ldGVyICBmaWVsZCAgaW4gCURFTEJBIGZyYW1lcyB0byB0ZXJtaW5hdGUgYW4gYWxyZWFkeSBzZXQgdXAgYkEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisgICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKKyAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAorI2Vsc2UKKyAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAorICAgIFVTSE9SVCAgICAgIEluaXRpYXRvcjoxOwkvLyAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50CisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gREVMQkFfUEFSTSwgKlBERUxCQV9QQVJNOworCisvLyAyLWJ5dGUgQkEgUGFyYW1ldGVyIFNldCBmaWVsZCAgaW4gQUREQkEgZnJhbWVzIHRvIHNpZ25hbCBwYXJtIGZvciBzZXR0aW5nIHVwIGEgQkEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQorICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAorI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBTVNEVVN1cHBvcnRlZDoxOwkvLyAwOiBub3QgcGVybWl0dGVkCQkxOiBwZXJtaXR0ZWQKKyAgICBVU0hPUlQgICAgICBCQVBvbGljeToxOwkvLyAxOiBpbW1lZGlhdGVseSBCQSAgICAwOmRlbGF5ZWQgQkEKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyAgICBVU0hPUlQgICAgICBCdWZTaXplOjEwOwkvLyBudW1iZXIgb2YgYnVmZmUgb2Ygc2l6ZSAyMzA0IG9jdGV0c3IKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBCQV9QQVJNLCAqUEJBX1BBUk07CisKKy8vIDItYnl0ZSBCQSBTdGFydGluZyBTZXEgQ09OVFJPTCBmaWVsZAordHlwZWRlZiB1bmlvbiBQQUNLRUQgeworICAgIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBTdGFydFNlcToxMjsgICAvLyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIDFzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBUiBpcyBzZW50CisJVVNIT1JUICAgICAgRnJhZ051bTo0OwkvLyBhbHdheXMgc2V0IHRvIDAKKyNlbHNlCisgICAgVVNIT1JUICAgICAgRnJhZ051bTo0OwkvLyBhbHdheXMgc2V0IHRvIDAKKwlVU0hPUlQgICAgICBTdGFydFNlcToxMjsgICAvLyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIDFzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBUiBpcyBzZW50CisjZW5kaWYgLyogUlRfQklHX0VORElBTiAqLworICAgIH0gICBmaWVsZDsKKyAgICBVU0hPUlQgICAgICAgICAgIHdvcmQ7Cit9IEJBU0VRX0NPTlRST0wsICpQQkFTRVFfQ09OVFJPTDsKKworLy9CQUNvbnRyb2wgYW5kIEJBUkNvbnRyb2wgYXJlIHRoZSBzYW1lCisvLyAyLWJ5dGUgQkEgQ09OVFJPTCBmaWVsZCBpbiBCQSBmcmFtZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2Ojk7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0CisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL0VXQyBWMS4yNAorICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBSc3Y6OTsKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBCQV9DT05UUk9MLCAqUEJBX0NPTlRST0w7CisKKy8vIDItYnl0ZSBCQVIgQ09OVFJPTCBmaWVsZCBpbiBCQVIgZnJhbWUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9pZiB0aGlzIGJpdDEsIHVzZSAgRlJBTUVfTVRCQV9SRVEsICBpZiAwLCB1c2UgRlJBTUVfQkFfUkVRCisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyAwOm5vcm1hbCBhY2ssICAxOm5vIGFjay4KKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIFRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBUl9DT05UUk9MLCAqUEJBUl9DT05UUk9MOworCisvLyBCQVJDb250cm9sIGluIE1UQkFSIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgTnVtVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gTVRCQVJfQ09OVFJPTCwgKlBNVEJBUl9DT05UUk9MOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3YxOjEyOworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBSc3YxOjEyOworICAgIFVTSE9SVCAgICAgIFRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IFBFUl9USURfSU5GTywgKlBQRVJfVElEX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKwlQRVJfVElEX0lORk8gICAgICBQZXJUSUQ7CisJQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Cit9IEVBQ0hfVElELCAqUEVBQ0hfVElEOworCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUFNQT0xMX0ZSQU1FIHsKKyAgICBGUkFNRV9DT05UUk9MICAgRkM7CisgICAgVVNIT1JUICAgICAgICAgIEFpZDsKKyAgICBVQ0hBUiAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgVGFbTUFDX0FERFJfTEVOXTsKK30gICBQU1BPTExfRlJBTUUsICpQUFNQT0xMX0ZSQU1FOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JUU19GUkFNRQl7CisgICAgRlJBTUVfQ09OVFJPTCAgIEZDOworICAgIFVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKyAgICBVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKK31SVFNfRlJBTUUsICpQUlRTX0ZSQU1FOworCisvLyBCQVJFUSBBTkQgTVRCQVJFUSBoYXZlIHRoZSBzYW1lIHN1YnR5cGUgQkFSLCA4MDIuMTFuIEJBUiB1c2UgY29tcHJlc3NlZCBiaXRtYXAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBX1JFUSB7CisJRlJBTUVfQ09OVFJPTCAgIEZDOworCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCQVJfQ09OVFJPTCAgQkFSQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKK30gICBGUkFNRV9CQV9SRVEsICpQRlJBTUVfQkFfUkVROworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX01UQkFfUkVRIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCU1UQkFSX0NPTlRST0wgIE1UQkFSQ29udHJvbDsKKwlQRVJfVElEX0lORk8JUGVyVElESW5mbzsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKK30gICBGUkFNRV9NVEJBX1JFUSwgKlBGUkFNRV9NVEJBX1JFUTsKKworLy8gQ29tcHJlc3NlZCBmb3JtYXQgaXMgbWFuZGFudG9yeSBpbiBIVCBTVEEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfTVRCQSB7CisJRlJBTUVfQ09OVFJPTCAgIEZDOworCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCQV9DT05UUk9MICBCQUNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7CisJVUNIQVIJCUJpdE1hcFs4XTsKK30gICBGUkFNRV9NVEJBLCAqUEZSQU1FX01UQkE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfUFNNUF9BQ1RJT04geworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVBzbXA7CS8vIDcuMy4xLjI1Cit9ICAgRlJBTUVfUFNNUF9BQ1RJT04sICpQRlJBTUVfUFNNUF9BQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUNUSU9OX0hEUiB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247Cit9ICAgRlJBTUVfQUNUSU9OX0hEUiwgKlBGUkFNRV9BQ1RJT05fSERSOworCisvL0FjdGlvbiBGcmFtZQorLy9BY3Rpb24gRnJhbWUgIENhdGVnb3J5OlNwZWN0cnVtLCAgQWN0aW9uOkNoYW5uZWwgU3dpdGNoLiA3LjMuMi4yMAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFOX1NXSVRDSF9BTk5PVU5DRSB7CisJVUNIQVIJCQkJCUVsZW1lbnRJRDsJLy8gSUQgPSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQgPSAzNworCVVDSEFSCQkJCQlMZW47CisJQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDU0Fubm91bmNlSWU7Cit9ICAgQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UsICpQQ0hBTl9TV0lUQ0hfQU5OT1VOQ0U7CisKKworLy84MDIuMTFuIDogNy4zLjIuMjBhCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1NFQ09ORF9DSEFOX09GRlNFVCB7CisJVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUID0gNjIKKwlVQ0hBUgkJCQlMZW47CisJU0VDX0NIQV9PRkZTRVRfSUUJU2VjQ2hPZmZzZXRJZTsKK30gICBTRUNPTkRfQ0hBTl9PRkZTRVQsICpQU0VDT05EX0NIQU5fT0ZGU0VUOworCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfU1BFVFJVTV9DUyB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UJQ1NBbm5vdW5jZTsKKwlTRUNPTkRfQ0hBTl9PRkZTRVQJCVNlY29uZENoYW5uZWw7Cit9ICAgRlJBTUVfU1BFVFJVTV9DUywgKlBGUkFNRV9TUEVUUlVNX0NTOworCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUkVRIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlVQ0hBUglUb2tlbjsJLy8gMQorCUJBX1BBUk0JCUJhUGFybTsJICAgICAgLy8gIDIgLSAxMAorCVVTSE9SVAkJVGltZU91dFZhbHVlOwkvLyAwIC0gMAorCUJBU0VRX0NPTlRST0wJQmFTdGFydFNlcTsgLy8gMC0wCit9ICAgRlJBTUVfQUREQkFfUkVRLCAqUEZSQU1FX0FEREJBX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BRERCQV9SU1AgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOworCVVTSE9SVAlTdGF0dXNDb2RlOworCUJBX1BBUk0JCUJhUGFybTsgLy8wIC0gMgorCVVTSE9SVAkJVGltZU91dFZhbHVlOworfSAgIEZSQU1FX0FEREJBX1JTUCwgKlBGUkFNRV9BRERCQV9SU1A7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfREVMQkFfUkVRIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlERUxCQV9QQVJNCQlEZWxiYVBhcm07CisJVVNIT1JUCVJlYXNvbkNvZGU7Cit9ICAgRlJBTUVfREVMQkFfUkVRLCAqUEZSQU1FX0RFTEJBX1JFUTsKKworCisvLzcuMi4xLjcKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFSIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBUl9DT05UUk9MCQlCYXJDb250cm9sOworCUJBU0VRX0NPTlRST0wJU3RhcnRpbmdTZXE7Cit9ICAgRlJBTUVfQkFSLCAqUEZSQU1FX0JBUjsKKworLy83LjIuMS43Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBUl9DT05UUk9MCQlCYXJDb250cm9sOworCUJBU0VRX0NPTlRST0wJU3RhcnRpbmdTZXE7CisJVUNIQVIJCWJpdG1hc2tbOF07Cit9ICAgRlJBTUVfQkEsICpQRlJBTUVfQkE7CisKKworLy8gUmFkaW8gTWVhc3VlbWVudCBSZXF1ZXN0IEZyYW1lIEZvcm1hdAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9STV9SRVFfQUNUSU9OIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlVQ0hBUglUb2tlbjsKKwlVU0hPUlQJUmVwZXRpdGlvbjsKKwlVQ0hBUiAgIGRhdGFbMF07Cit9ICAgRlJBTUVfUk1fUkVRX0FDVElPTiwgKlBGUkFNRV9STV9SRVFfQUNUSU9OOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworCVVDSEFSCQlJRDsKKwlVQ0hBUgkJTGVuZ3RoOworCVVDSEFSCQlDaGFubmVsU3dpdGNoTW9kZTsKKwlVQ0hBUgkJTmV3UmVnQ2xhc3M7CisJVUNIQVIJCU5ld0NoYW5uZWxOdW07CisJVUNIQVIJCUNoYW5uZWxTd2l0Y2hDb3VudDsKK30gSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRSwgKlBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFOworCisKKy8vCisvLyBfTGltaXQgbXVzdCBiZSB0aGUgMioqbiAtIDEKKy8vIF9TRVExICwgX1NFUTIgbXVzdCBiZSB3aXRoaW4gMCB+IF9MaW1pdAorLy8KKyNkZWZpbmUgU0VRX1NURVBPTkUoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgPT0gKChfU0VRMisxKSAmIF9MaW1pdCkpKQorI2RlZmluZSBTRVFfU01BTExFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKCgoX1NFUTEtX1NFUTIpICYgKChfTGltaXQrMSk+PjEpKSkKKyNkZWZpbmUgU0VRX0xBUkdFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKChfU0VRMSAhPSBfU0VRMikgJiYgISgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpKQorI2RlZmluZSBTRVFfV0lUSElOX1dJTihfU0VRMSwgX1NFUTIsIF9XSU4sIF9MaW1pdCkgKFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpICYmICBcCisJCQkJCQkJCQkJCQlTRVFfU01BTExFUihfU0VRMSwgKChfU0VRMitfV0lOKzEpJl9MaW1pdCksIF9MaW1pdCkpCisKKy8vCisvLyBDb250ZW50aW9uLWZyZWUgcGFyYW1ldGVyICh3aXRob3V0IElEIGFuZCBMZW5ndGgpCisvLwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKKyAgICBVQ0hBUiAgICAgICBDZnBDb3VudDsKKyAgICBVQ0hBUiAgICAgICBDZnBQZXJpb2Q7CisgICAgVVNIT1JUICAgICAgQ2ZwTWF4RHVyYXRpb247CisgICAgVVNIT1JUICAgICAgQ2ZwRHVyUmVtYWluaW5nOworfSBDRl9QQVJNLCAqUENGX1BBUk07CisKK3R5cGVkZWYJc3RydWN0CV9DSVBIRVJfU1VJVEUJeworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVBhaXJDaXBoZXI7CQkvLyBVbmljYXN0IGNpcGhlciAxLCB0aGlzIG9uZSBoYXMgbW9yZSBzZWN1cmVkIGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVBhaXJDaXBoZXJBdXg7CS8vIFVuaWNhc3QgY2lwaGVyIDIgaWYgQVAgYW5ub3VuY2UgdHdvIHVuaWNhc3QgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJR3JvdXBDaXBoZXI7CS8vIEdyb3VwIGNpcGhlcgorCVVTSE9SVAkJCQkJCQlSc25DYXBhYmlsaXR5OwkvLyBSU04gY2FwYWJpbGl0eSBmcm9tIGJlYWNvbgorCUJPT0xFQU4JCQkJCQkJYk1peE1vZGU7CQkvLyBJbmRpY2F0ZSBQYWlyICYgR3JvdXAgY2lwaGVyIG1pZ2h0IGJlIGRpZmZlcmVudAorfQlDSVBIRVJfU1VJVEUsICpQQ0lQSEVSX1NVSVRFOworCisvLyBFRENBIGNvbmZpZ3VyYXRpb24gZnJvbSBBUCdzIEJFQUNPTi9Qcm9iZVJzcAordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJBZGQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKKyAgICBCT09MRUFOICAgICBiUUFjazsKKyAgICBCT09MRUFOICAgICBiUXVldWVSZXF1ZXN0OworICAgIEJPT0xFQU4gICAgIGJUeG9wUmVxdWVzdDsKKyAgICBCT09MRUFOICAgICBiQVBTRENhcGFibGU7CisvLyAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOworICAgIFVDSEFSICAgICAgIEVkY2FVcGRhdGVDb3VudDsKKyAgICBVQ0hBUiAgICAgICBBaWZzbls0XTsgICAgICAgLy8gMDpBQ19CSywgMTpBQ19CRSwgMjpBQ19WSSwgMzpBQ19WTworICAgIFVDSEFSICAgICAgIEN3bWluWzRdOworICAgIFVDSEFSICAgICAgIEN3bWF4WzRdOworICAgIFVTSE9SVCAgICAgIFR4b3BbNF07ICAgICAgLy8gaW4gdW5pdCBvZiAzMi11cworICAgIEJPT0xFQU4gICAgIGJBQ01bNF07ICAgICAgLy8gMTogQWRtaXNzaW9uIENvbnRyb2wgb2YgQUNfQksgaXMgbWFuZGF0dG9yeQorfSBFRENBX1BBUk0sICpQRURDQV9QQVJNOworCisvLyBRQlNTIExPQUQgaW5mb3JtYXRpb24gZnJvbSBRQVAncyBCRUFDT04vUHJvYmVSc3AKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKKyAgICBVU0hPUlQgICAgICBTdGFOdW07CisgICAgVUNIQVIgICAgICAgQ2hhbm5lbFV0aWxpemF0aW9uOworICAgIFVTSE9SVCAgICAgIFJlbWFpbmluZ0FkbWlzc2lvbkNvbnRyb2w7ICAvLyBpbiB1bml0IG9mIDMyLXVzCit9IFFCU1NfTE9BRF9QQVJNLCAqUFFCU1NfTE9BRF9QQVJNOworCisvLyBRQlNTIEluZm8gZmllbGQgaW4gUVNUQSdzIGFzc29jIHJlcQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJCVJzdjI6MTsKKwlVQ0hBUgkJTWF4U1BMZW5ndGg6MjsKKwlVQ0hBUgkJUnN2MToxOworCVVDSEFSCQlVQVBTRF9BQ19CRToxOworCVVDSEFSCQlVQVBTRF9BQ19CSzoxOworCVVDSEFSCQlVQVBTRF9BQ19WSToxOworCVVDSEFSCQlVQVBTRF9BQ19WTzoxOworI2Vsc2UKKyAgICBVQ0hBUgkJVUFQU0RfQUNfVk86MTsKKwlVQ0hBUgkJVUFQU0RfQUNfVkk6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfQks6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfQkU6MTsKKwlVQ0hBUgkJUnN2MToxOworCVVDSEFSCQlNYXhTUExlbmd0aDoyOworCVVDSEFSCQlSc3YyOjE7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUUJTU19TVEFfSU5GT19QQVJNLCAqUFFCU1NfU1RBX0lORk9fUEFSTTsKKworLy8gUUJTUyBJbmZvIGZpZWxkIGluIFFBUCdzIEJlYWNvbi9Qcm9iZVJzcAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJCVVBUFNEOjE7CisJVUNIQVIJCVJzdjozOworICAgIFVDSEFSCQlQYXJhbVNldENvdW50OjQ7CisjZWxzZQorICAgIFVDSEFSCQlQYXJhbVNldENvdW50OjQ7CisJVUNIQVIJCVJzdjozOworCVVDSEFSCQlVQVBTRDoxOworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IFFCU1NfQVBfSU5GT19QQVJNLCAqUFFCU1NfQVBfSU5GT19QQVJNOworCisvLyBRT1MgQ2FwYWJpbGl0eSByZXBvcnRlZCBpbiBRQVAncyBCRUFDT04vUHJvYmVSc3AKKy8vIFFPUyBDYXBhYmlsaXR5IHNlbnQgb3V0IGluIFFTVEEncyBBc3NvY2lhdGVSZXEvUmVBc3NvY2lhdGVSZXEKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKKyAgICBCT09MRUFOICAgICBiUUFjazsKKyAgICBCT09MRUFOICAgICBiUXVldWVSZXF1ZXN0OworICAgIEJPT0xFQU4gICAgIGJUeG9wUmVxdWVzdDsKKy8vICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7CisgICAgVUNIQVIgICAgICAgRWRjYVVwZGF0ZUNvdW50OworfSBRT1NfQ0FQQUJJTElUWV9QQVJNLCAqUFFPU19DQVBBQklMSVRZX1BBUk07CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVQ0hBUiAgICAgICBJRUxlbjsKKyAgICBVQ0hBUiAgICAgICBJRVtNQVhfQ1VTVE9NX0xFTl07Cit9IFdQQV9JRV87CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgIENoYW5uZWw7CisJVUNIQVIgICBDZW50cmFsQ2hhbm5lbDsJLy9TdG9yZSB0aGUgd2lkZS1iYW5kIGNlbnRyYWwgY2hhbm5lbCBmb3IgNDBNSHouICAudXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLgorICAgIFVDSEFSICAgQnNzVHlwZTsKKyAgICBVU0hPUlQgIEF0aW1XaW47CisgICAgVVNIT1JUICBCZWFjb25QZXJpb2Q7CisKKyAgICBVQ0hBUiAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworICAgIFVDSEFSICAgU3VwUmF0ZUxlbjsKKyAgICBVQ0hBUiAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworICAgIFVDSEFSICAgRXh0UmF0ZUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eTsKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlBRERfSFRfSU5GT19JRSBBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldDsKKwlDSEFSICAgIFJzc2k7CisgICAgVUNIQVIgICBQcml2YWN5OwkJCS8vIEluZGljYXRlIHNlY3VyaXR5IGZ1bmN0aW9uIE9OL09GRi4gRG9uJ3QgbWVzcyB1cCB3aXRoIGF1dGggbW9kZS4KKwlVQ0hBUglIaWRkZW47CisKKyAgICBVU0hPUlQgIER0aW1QZXJpb2Q7CisgICAgVVNIT1JUICBDYXBhYmlsaXR5SW5mbzsKKworICAgIFVTSE9SVCAgQ2ZwQ291bnQ7CisgICAgVVNIT1JUICBDZnBQZXJpb2Q7CisgICAgVVNIT1JUICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgIENmcER1clJlbWFpbmluZzsKKyAgICBVQ0hBUiAgIFNzaWRMZW47CisgICAgQ0hBUiAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisKKyAgICBVTE9ORyAgIExhc3RCZWFjb25SeFRpbWU7IC8vIE9TJ3MgdGltZXN0YW1wCisKKwlCT09MRUFOCWJTRVM7CisKKwkvLyBOZXcgZm9yIFdQQTIKKwlDSVBIRVJfU1VJVEUJCQkJCVdQQTsJCQkvLyBBUCBhbm5vdW5jZWQgV1BBIGNpcGhlciBzdWl0ZQorCUNJUEhFUl9TVUlURQkJCQkJV1BBMjsJCQkvLyBBUCBhbm5vdW5jZWQgV1BBMiBjaXBoZXIgc3VpdGUKKworCS8vIE5ldyBmb3IgbWljcm9zb2Z0IFdQQSBzdXBwb3J0CisJTkRJU184MDJfMTFfRklYRURfSUVzCUZpeElFczsKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlQXV4OwkvLyBBZGRpdGlvbiBtb2RlIGZvciBXUEEyIC8gV1BBIGNhcGFibGUgQVAKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJV2VwU3RhdHVzOwkJCQkvLyBVbmljYXN0IEVuY3J5cHRpb24gQWxnb3JpdGhtIGV4dHJhY3QgZnJvbSBWQVJfSUUKKwlVU0hPUlQJCQkJCVZhcklFTGVuOwkJCQkvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKKwlVQ0hBUgkJCQkJVmFySUVzW01BWF9WSUVfTEVOXTsKKworCS8vIENDWCBDa2lwIGluZm9ybWF0aW9uCisgICAgVUNIQVIgICBDa2lwRmxhZzsKKworCS8vIENDWCAyIFRTRgorCVVDSEFSCVBUU0ZbNF07CQkvLyBQYXJlbnQgVFNGCisJVUNIQVIJVFRTRls4XTsJCS8vIFRhcmdldCBUU0YKKworICAgIC8vIDgwMi4xMWUgZDksIGFuZCBXTU0KKwlFRENBX1BBUk0gICAgICAgICAgIEVkY2FQYXJtOworCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKKwlRQlNTX0xPQURfUEFSTSAgICAgIFFic3NMb2FkOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIFdQQV9JRV8gICAgIFdwYUlFOworICAgIFdQQV9JRV8gICAgIFJzbklFOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlVQ0hBUgkJQ291bnRyeVN0cmluZ1szXTsKKwlCT09MRUFOCQliSGFzQ291bnRyeUlFOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30gQlNTX0VOVFJZLCAqUEJTU19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSICAgICAgICAgICBCc3NOcjsKKyAgICBVQ0hBUiAgICAgICAgICAgQnNzT3ZlcmxhcE5yOworICAgIEJTU19FTlRSWSAgICAgICBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Cit9IEJTU19UQUJMRSwgKlBCU1NfVEFCTEU7CisKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfUVVFVUVfRUxFTSB7CisgICAgVUxPTkcgICAgICAgICAgICAgTWFjaGluZTsKKyAgICBVTE9ORyAgICAgICAgICAgICBNc2dUeXBlOworICAgIFVMT05HICAgICAgICAgICAgIE1zZ0xlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICBNc2dbTUdNVF9ETUFfQlVGRkVSX1NJWkVdOworICAgIExBUkdFX0lOVEVHRVIgICAgIFRpbWVTdGFtcDsKKyAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMDsKKyAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMTsKKyAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMjsKKyAgICBVQ0hBUiAgICAgICAgICAgICBTaWduYWw7CisgICAgVUNIQVIgICAgICAgICAgICAgQ2hhbm5lbDsKKyAgICBVQ0hBUiAgICAgICAgICAgICBXY2lkOworICAgIEJPT0xFQU4gICAgICAgICAgIE9jY3VwaWVkOworfSBNTE1FX1FVRVVFX0VMRU0sICpQTUxNRV9RVUVVRV9FTEVNOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRSB7CisgICAgVUxPTkcgICAgICAgICAgICAgTnVtOworICAgIFVMT05HICAgICAgICAgICAgIEhlYWQ7CisgICAgVUxPTkcgICAgICAgICAgICAgVGFpbDsKKyAgICBORElTX1NQSU5fTE9DSyAgIExvY2s7CisgICAgTUxNRV9RVUVVRV9FTEVNICBFbnRyeVtNQVhfTEVOX09GX01MTUVfUVVFVUVdOworfSBNTE1FX1FVRVVFLCAqUE1MTUVfUVVFVUU7CisKK3R5cGVkZWYgVk9JRCAoKlNUQVRFX01BQ0hJTkVfRlVOQykoVk9JRCAqQWRhcHRvciwgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NUQVRFX01BQ0hJTkUgeworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yU3RhdGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOck1zZzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJTdGF0ZTsKKyAgICBTVEFURV9NQUNISU5FX0ZVTkMgICAgICAgICAgICAgKlRyYW5zRnVuYzsKK30gU1RBVEVfTUFDSElORSwgKlBTVEFURV9NQUNISU5FOworCisKKy8vIE1MTUUgQVVYIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZCB0ZW1wb3JhcmxpeSBzZXR0aW5ncyBkdXJpbmcgYSBjb25uZWN0aW9uIGF0dGVtcHQuCisvLyBPbmNlIHRoaXMgYXR0ZW1wIHN1Y2NlZWRzLCBhbGwgc2V0dGluZ3Mgd2lsbCBiZSBjb3B5IHRvIHBBZC0+U3RhQWN0aXZlLgorLy8gQSBjb25uZWN0aW9uIGF0dGVtcHQgKHVzZXIgc2V0IE9JRCwgcm9hbWluZywgQ0NYIGZhc3Qgcm9hbWluZywuLikgY29uc2lzdHMgb2YKKy8vIHNldmVyYWwgc3RlcHMgKEpPSU4sIEFVVEgsIEFTU09DIG9yIFJFQVNTT0MpIGFuZCBtYXkgZmFpbCBhdCBhbnkgc3RlcC4gV2UgcHVycG9zZWx5CisvLyBzZXBhcmF0ZSB0aGlzIHVuZGVyLXRyaWFsIHNldHRpbmdzIGF3YXkgZnJvbSBwQWQtPlN0YUFjdGl2ZSBzbyB0aGF0IG9uY2UKKy8vIHRoaXMgbmV3IGF0dGVtcHQgZmFpbGVkLCBkcml2ZXIgY2FuIGF1dG8tcmVjb3ZlciBiYWNrIHRvIHRoZSBhY3RpdmUgc2V0dGluZ3MuCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVggeworICAgIFVDSEFSICAgICAgICAgICAgICAgQnNzVHlwZTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFNzaWRMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJCUF1dG9SZWNvbm5lY3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRMZW47CisgICAgVVNIT1JUICAgICAgICAgICAgICBBbGc7CisgICAgVUNIQVIgICAgICAgICAgICAgICBTY2FuVHlwZTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIENoYW5uZWw7CisJVUNIQVIgICAgICAgICAgICAgICBDZW50cmFsQ2hhbm5lbDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEFpZDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2ZwTWF4RHVyYXRpb247CisgICAgVVNIT1JUICAgICAgICAgICAgICBDZnBQZXJpb2Q7CisgICAgVVNIT1JUICAgICAgICAgICAgICBBdGltV2luOworCisJLy8gQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKKwkvLyBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4KKwlVQ0hBUgkJICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJICAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJICAgICAgICBTdXBSYXRlTGVuOworCVVDSEFSCQkgICAgICAgIEV4dFJhdGVMZW47CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCVVDSEFSCQkgICAgICAgIAlIdENhcGFiaWxpdHlMZW47CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0OworCS8vUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKKworICAgIC8vIG5ldyBmb3IgUU9TCisgICAgUU9TX0NBUEFCSUxJVFlfUEFSTSBBUFFvc0NhcGFiaWxpdHk7ICAgIC8vIFFPUyBjYXBhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKyAgICBFRENBX1BBUk0gICAgICAgICAgIEFQRWRjYVBhcm07ICAgICAgICAgLy8gRURDQSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKyAgICBRQlNTX0xPQURfUEFSTSAgICAgIEFQUWJzc0xvYWQ7ICAgICAgICAgLy8gUUJTUyBsb2FkIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKworICAgIC8vIG5ldyB0byBrZWVwIFJhbGluayBzcGVjaWZpYyBmZWF0dXJlCisgICAgVUxPTkcgICAgICAgICAgICAgICBBUFJhbGlua0llOworCisgICAgQlNTX1RBQkxFICAgICAgICAgICBTc2lkQnNzVGFiOyAgICAgLy8gQVAgbGlzdCBmb3IgdGhlIHNhbWUgU1NJRAorICAgIEJTU19UQUJMRSAgICAgICAgICAgUm9hbVRhYjsgICAgICAgIC8vIEFQIGxpc3QgZWxpZ2libGUgZm9yIHJvYW1pbmcKKyAgICBVTE9ORyAgICAgICAgICAgICAgIEJzc0lkeDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgIFJvYW1JZHg7CisKKwlCT09MRUFOCQkJCUN1cnJSZXFJc0Zyb21OZGlzOworCisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBCZWFjb25UaW1lciwgU2NhblRpbWVyOworICAgIFJBTElOS19USU1FUl9TVFJVQ1QgQXV0aFRpbWVyOworICAgIFJBTElOS19USU1FUl9TVFJVQ1QgQXNzb2NUaW1lciwgUmVhc3NvY1RpbWVyLCBEaXNhc3NvY1RpbWVyOworfSBNTE1FX0FVWCwgKlBNTE1FX0FVWDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQUREQkFfUkVRX1NUUlVDVHsKKwlVQ0hBUiAgIFdjaWQ7CS8vCisJVUNIQVIgICBwQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgQmFCdWZTaXplOworCVVTSE9SVAlUaW1lT3V0VmFsdWU7CisJVUNIQVIgICBUSUQ7CisJVUNIQVIgICBUb2tlbjsKKwlVU0hPUlQJQmFTdGFydFNlcTsKK30gTUxNRV9BRERCQV9SRVFfU1RSVUNULCAqUE1MTUVfQUREQkFfUkVRX1NUUlVDVDsKKworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9ERUxCQV9SRVFfU1RSVUNUeworCVVDSEFSICAgV2NpZDsJLy8KKwlVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgVElEOworCVVDSEFSCUluaXRpYXRvcjsKK30gTUxNRV9ERUxCQV9SRVFfU1RSVUNULCAqUE1MTUVfREVMQkFfUkVRX1NUUlVDVDsKKworLy8gYXNzb2Mgc3RydWN0IGlzIGVxdWFsIHRvIHJlYXNzb2MKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FTU09DX1JFUV9TVFJVQ1R7CisgICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgQ2FwYWJpbGl0eUluZm87CisgICAgVVNIT1JUICAgIExpc3RlbkludHY7CisgICAgVUxPTkcgICAgIFRpbWVvdXQ7Cit9IE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX0FTU09DX1JFUV9TVFJVQ1QsIE1MTUVfUkVBU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfUkVBU1NPQ19SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUeworICAgIFVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgIFJlYXNvbjsKK30gTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVVUSF9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICBBbGc7CisgICAgVUxPTkcgICAgICAgIFRpbWVvdXQ7Cit9IE1MTUVfQVVUSF9SRVFfU1RSVUNULCAqUE1MTUVfQVVUSF9SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCB7CisgICAgVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgUmVhc29uOworfSBNTE1FX0RFQVVUSF9SRVFfU1RSVUNULCAqUE1MTUVfREVBVVRIX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVTE9ORyAgICAgIEJzc0lkeDsKK30gTUxNRV9KT0lOX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1NDQU5fUkVRX1NUUlVDVCB7CisgICAgVUNIQVIgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgQnNzVHlwZTsKKyAgICBVQ0hBUiAgICAgIFNjYW5UeXBlOworICAgIFVDSEFSICAgICAgU3NpZExlbjsKKyAgICBDSEFSICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKK30gTUxNRV9TQ0FOX1JFUV9TVFJVQ1QsICpQTUxNRV9TQ0FOX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1NUQVJUX1JFUV9TVFJVQ1QgeworICAgIENIQVIgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKyAgICBVQ0hBUiAgICAgICBTc2lkTGVuOworfSBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QsICpQTUxNRV9TVEFSVF9SRVFfU1RSVUNUOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvLyBzdHJ1Y3R1cmUgZm9yIERMUwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFMgeworCVVTSE9SVAkJCQkJCVRpbWVPdXQ7CQkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgc2xpZW5jZSwgdW5pdDogc2Vjb25kICwgc2V0IGJ5IFVJCisJVVNIT1JUCQkJCQkJQ291bnREb3duVGltZXI7CS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBzbGllbmNlLHVuaXQ6IHNlY29uZCAsIHVzZWQgYnkgZHJpdmVyIG9ubHkKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJTWFjQWRkcjsJCS8vIHNldCBieSBVSQorCVVDSEFSCQkJCQkJU3RhdHVzOwkJCS8vIDA6IG5vbmUgLCAxOiB3YWl0IFNUQWtleSwgMjogZmluaXNoIERMUyBzZXR1cCAsIHNldCBieSBkcml2ZXIgb25seQorCUJPT0xFQU4JCQkJCQlWYWxpZDsJCQkvLyAxOiB2YWxpZCAsIDA6IGludmFsaWQgLCBzZXQgYnkgVUksIHVzZSB0byBzZXR1cCBvciB0ZWFyIGRvd24gRExTIGxpbmsKKwlSQUxJTktfVElNRVJfU1RSVUNUCQkJVGltZXI7CQkJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIGhhbmRzaGFrZQorCVVTSE9SVAkJCQkJCVNlcXVlbmNlOworCVVTSE9SVAkJCQkJCU1hY1RhYk1hdGNoV0NJRDsJLy8gQVNJQworCUJPT0xFQU4JCQkJCQliSFRDYXA7CisJUFZPSUQJCQkJCQlwQWQ7Cit9IFJUXzgwMl8xMV9ETFMsICpQUlRfODAyXzExX0RMUzsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfRExTX1JFUV9TVFJVQ1QgeworICAgIFBSVF84MDJfMTFfRExTCXBETFM7CisgICAgVVNIT1JUCQkJUmVhc29uOworfSBNTE1FX0RMU19SRVFfU1RSVUNULCAqUE1MTUVfRExTX1JFUV9TVFJVQ1Q7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisgICAgVUNIQVIgICBFaWQ7CisgICAgVUNIQVIgICBMZW47CisgICAgQ0hBUiAgIE9jdGV0WzFdOworfSBFSURfU1RSVUNULCpQRUlEX1NUUlVDVCwgQkVBQ09OX0VJRF9TVFJVQ1QsICpQQkVBQ09OX0VJRF9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRNUF9UWF9SQVRFX1NXSVRDSAoreworCVVDSEFSICAgSXRlbU5vOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglSc3YyOjI7CisJVUNIQVIJTW9kZToyOworCVVDSEFSCVJzdjE6MTsKKwlVQ0hBUglCVzoxOworCVVDSEFSCVNob3J0R0k6MTsKKwlVQ0hBUglTVEJDOjE7CisjZWxzZQorCVVDSEFSCVNUQkM6MTsKKwlVQ0hBUglTaG9ydEdJOjE7CisJVUNIQVIJQlc6MTsKKwlVQ0hBUglSc3YxOjE7CisJVUNIQVIJTW9kZToyOworCVVDSEFSCVJzdjI6MjsKKyNlbmRpZgorCVVDSEFSICAgQ3Vyck1DUzsKKwlVQ0hBUiAgIFRyYWluVXA7CisJVUNIQVIgICBUcmFpbkRvd247Cit9IFJSVE1QX1RYX1JBVEVfU1dJVENILCAqUFJUTVBfVFhfUkFURV9TV0lUQ0g7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIFRCVFRfUFJFTE9BRF9USU1FICAgICAgIDM4NCAgICAgICAgLy8gdXNlYy4gTG9tZ1ByZWFtYmxlICsgMjQtYnl0ZSBhdCAxTWJwcworI2RlZmluZSBERUZBVUxUX0RUSU1fUEVSSU9EICAgICAxCisKKy8vIHdlaWdodGluZyBmYWN0b3IgdG8gY2FsY3VsYXRlIENoYW5uZWwgcXVhbGl0eSwgdG90YWwgc2hvdWxkIGJlIDEwMCUKKy8vI2RlZmluZSBSU1NJX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAwCisvLyNkZWZpbmUgVFhfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgNDAKKy8vI2RlZmluZSBSWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICA2MAorCisjZGVmaW5lIE1BQ19UQUJMRV9BR0VPVVRfVElNRQkJCTMwMAkJCS8vIHVuaXQ6IHNlYworI2RlZmluZSBNQUNfVEFCTEVfQVNTT0NfVElNRU9VVAkJCTUJCQkvLyB1bml0OiBzZWMKKyNkZWZpbmUgTUFDX1RBQkxFX0ZVTEwoVGFiKQkJCQkoKFRhYikuc2l6ZSA9PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKworLy8gQVAgc2hhbGwgZHJvcCB0aGUgc3RhIGlmIGNvbnRpbmUgVHggZmFpbCBjb3VudCByZWFjaCBpdC4KKyNkZWZpbmUgTUFDX0VOVFJZX0xJRkVfQ0hFQ0tfQ05UCQkyMAkJCS8vIHBhY2tldCBjbnQuCisKKy8vIFZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPlNzdAordHlwZWRlZiBlbnVtIF9Tc3QgeworICAgIFNTVF9OT1RfQVVUSCwgICAvLyAwOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMQorICAgIFNTVF9BVVRILCAgICAgICAvLyAxOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMgorICAgIFNTVF9BU1NPQyAgICAgICAvLyAyOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMworfSBTU1Q7CisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPkF1dGhTdGF0ZQordHlwZWRlZiBlbnVtIF9BdXRoU3RhdGUgeworICAgIEFTX05PVF9BVVRILAorICAgIEFTX0FVVEhfT1BFTiwgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgT1BFTiBTWVNURU0KKyAgICBBU19BVVRIX0tFWSwgICAgICAgIC8vIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIFNIQVJFRCBLRVkKKyAgICBBU19BVVRIRU5USUNBVElORyAgIC8vIFNUQSBpcyB3YWl0aW5nIGZvciBBVVRIIHNlcSMzIHVzaW5nIFNIQVJFRCBLRVkKK30gQVVUSF9TVEFURTsKKworLy9mb3Itd3BhIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9BcFdwYVN0YXRlIHsKKyAgICBBU19OT1RVU0UsICAgICAgICAgICAgICAvLyAwCisgICAgQVNfRElTQ09OTkVDVCwgICAgICAgICAgLy8gMQorICAgIEFTX0RJU0NPTk5FQ1RFRCwgICAgICAgIC8vIDIKKyAgICBBU19JTklUSUFMSVpFLCAgICAgICAgICAvLyAzCisgICAgQVNfQVVUSEVOVElDQVRJT04sICAgICAgLy8gNAorICAgIEFTX0FVVEhFTlRJQ0FUSU9OMiwgICAgIC8vIDUKKyAgICBBU19JTklUUE1LLCAgICAgICAgICAgICAvLyA2CisgICAgQVNfSU5JVFBTSywgICAgICAgICAgICAgLy8gNworICAgIEFTX1BUS1NUQVJULCAgICAgICAgICAgIC8vIDgKKyAgICBBU19QVEtJTklUX05FR09USUFUSU5HLCAvLyA5CisgICAgQVNfUFRLSU5JVERPTkUsICAgICAgICAgLy8gMTAKKyAgICBBU19VUERBVEVLRVlTLCAgICAgICAgICAvLyAxMQorICAgIEFTX0lOVEVHUklUWV9GQUlMVVJFLCAgIC8vIDEyCisgICAgQVNfS0VZVVBEQVRFLCAgICAgICAgICAgLy8gMTMKK30gQVBfV1BBX1NUQVRFOworCisvLyBmb3Itd3BhIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9HVEtTdGF0ZSB7CisgICAgUkVLRVlfTkVHT1RJQVRJTkcsCisgICAgUkVLRVlfRVNUQUJMSVNIRUQsCisgICAgS0VZRVJST1IsCit9IEdUS19TVEFURTsKKworLy8gIGZvci13cGEgIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9XcGFHVEtTdGF0ZSB7CisgICAgU0VUS0VZUywKKyAgICBTRVRLRVlTX0RPTkUsCit9IFdQQV9HVEtfU1RBVEU7CisvLyA9PT09PT09PT09PT09PT09PT09PT09IGVuZCBvZiBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyNlbmRpZgkvLyBNTE1FX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9uZXRpZl9ibG9jay5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9uZXRpZl9ibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTE1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL25ldGlmX2Jsb2NrLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX05FVF9JRl9CTE9DS19IX18KKyNkZWZpbmUgX19ORVRfSUZfQkxPQ0tfSF9fCisKKy8vI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgImxpbmtfbGlzdC5oIgorI2luY2x1ZGUgInJ0bXAuaCIKKworI2RlZmluZSBGUkVFX05FVElGX1BPT0xfU0laRSAzMgorCit0eXBlZGVmIHN0cnVjdCBfTkVUSUZfRU5UUlkKK3sKKwlzdHJ1Y3QgX05FVElGX0VOVFJZICpwTmV4dDsKKwlQTkVUX0RFViBwTmV0RGV2OworfSBORVRJRl9FTlRSWSwgKlBORVRJRl9FTlRSWTsKKwordm9pZCBpbml0YmxvY2tRdWV1ZVRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gYmxvY2tOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSwKKwlJTiBQTkVUX0RFViBwTmV0RGV2KTsKKworVk9JRCByZWxlYXNlTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnkpOworCitWT0lEIFN0b3BOZXRJZlF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIFF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCk7CisjZW5kaWYgLy8gX19ORVRfSUZfQkxPQ0tfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvb2lkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL29pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODhkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL29pZC5oCkBAIC0wLDAgKzEsMTA5MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlvaWQuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKyNpZm5kZWYgX09JRF9IXworI2RlZmluZSBfT0lEX0hfCisKKyNkZWZpbmUgVFJVRQkJCQkxCisjZGVmaW5lIEZBTFNFCQkJCTAKKy8vCisvLyBJRUVFIDgwMi4xMSBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucworLy8KKyNkZWZpbmUgTUFYX1RYX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAxMDAgICAvKiBtVyAqLworI2RlZmluZSBNQVhfUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0xMCAgICAvKiBkQm0gKi8KKyNkZWZpbmUgTUlOX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMjAwICAgLyogZEJtICovCisjZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjM0NiAgLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDI1NiAgIC8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAyMzQ3ICAvKiBieXRlIGNvdW50ICovCisKKy8vIG5ldyB0eXBlcyBmb3IgTWVkaWEgU3BlY2lmaWMgSW5kaWNhdGlvbnMKKy8vIEV4dGVuc2lvbiBjaGFubmVsIG9mZnNldAorI2RlZmluZSBFWFRDSEFfTk9ORQkJCTAKKyNkZWZpbmUgRVhUQ0hBX0FCT1ZFCQkweDEKKyNkZWZpbmUgRVhUQ0hBX0JFTE9XCQkweDMKKworLy8gQlcKKyNkZWZpbmUgQkFORF9XSURUSF8yMAkJMAorI2RlZmluZSBCQU5EX1dJRFRIXzQwCQkxCisjZGVmaW5lIEJBTkRfV0lEVEhfQk9USAkJMgorI2RlZmluZSBCQU5EX1dJRFRIXzEwCQkzCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgorLy8gU0hPUlRHSQorI2RlZmluZSBHQVBfSU5URVJWQUxfNDAwCTEJLy8gb25seSBzdXBwb3J0IGluIEhUIG1vZGUKKyNkZWZpbmUgR0FQX0lOVEVSVkFMXzgwMAkwCisjZGVmaW5lIEdBUF9JTlRFUlZBTF9CT1RICTIKKworI2RlZmluZSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAkJCTEKKyNkZWZpbmUgTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQJCTAKKworI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCAgICAgICAgIDMyCisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFUyAgICAgICAgOAorI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVggICAgIDE2CisjZGVmaW5lIE1BQ19BRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQkJNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRVZFTlQJCQkJMTAgIC8vIGVudHJ5ICMgaW4gRVZFTlQgdGFibGUKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9NQUMJCQkJMzIgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9BQ0wJCQkJNjQKKyNkZWZpbmUgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTCQkxMiAgICAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCQkJNAorCisjaWZuZGVmIFVOREVSX0NFCisvLyBPSUQgZGVmaW5pdGlvbiwgc2luY2UgTkRJUyA1LjAgZGlkbid0IGRlZmluZSB0aGVzZSwgd2UgbmVlZCB0byBkZWZpbmUgZm9yIG91ciBvd24KKy8vI2lmIF9XSU4zMl9XSU5OVDw9MHgwNTAwCisKKyNkZWZpbmUgT0lEX0dFTl9NQUNISU5FX05BTUUgICAgICAgICAgICAgICAweDAwMDEwMjFBCisKKyNpZmRlZiBSQUxJTktfQVRFCisjZGVmaW5lIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQJCQkweDA0MDEKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZGVmaW5lIFJUX1FVRVJZX1NJR05BTF9DT05URVhUCQkJCTB4MDQwMgorI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQgICAgICAgICAgICAgICAgIAkweDA0MDQKKyNkZWZpbmUgUlRfU0VUX0FQRF9QSUQJCQkJCQkweDA0MDUKKyNkZWZpbmUgUlRfU0VUX0RFTF9NQUNfRU5UUlkJCQkJMHgwNDA2CisKKy8vCisvLyBJRUVFIDgwMi4xMSBPSURzCisvLworI2RlZmluZQlPSURfR0VUX1NFVF9UT0dHTEUJCQkweDgwMDAKKworI2RlZmluZQlPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVECQkJMHgwMTAzCisjZGVmaW5lCU9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRQkJCQkweDAxMDQKKyNkZWZpbmUJT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIJCQkJCQkweDAxMDcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJCQkJCQkJCTB4MDEwOCAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJXzEJCQkJCQkweDAxMDkgLy9ydDI4NjAJb25seSAsIGthdGh5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV8yCQkJCQkJMHgwMTBBIC8vcnQyODYwCW9ubHkgLCBrYXRoeQorI2RlZmluZQlPSURfODAyXzExX05VTUJFUl9PRl9BTlRFTk5BUwkJCQkweDAxMEIKKyNkZWZpbmUJT0lEXzgwMl8xMV9SWF9BTlRFTk5BX1NFTEVDVEVECQkJCTB4MDEwQworI2RlZmluZQlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQJCQkJMHgwMTBECisjZGVmaW5lCU9JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkJCQkweDAxMEUKKyNkZWZpbmUJT0lEXzgwMl8xMV9BRERfV0VQCQkJCQkJCTB4MDExMgorI2RlZmluZQlPSURfODAyXzExX1JFTU9WRV9XRVAJCQkJCQkweDAxMTMKKyNkZWZpbmUJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJCQkJCQkweDAxMTQKKyNkZWZpbmUJT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgkJCQkJMHgwMTE4CisjZGVmaW5lCU9JRF84MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04JCQkweDAxMUUKKyNkZWZpbmUJT0lEXzgwMl8xMV9URVNUCQkJCQkJCQkweDAxMUYKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTgkJCQkweDA1MDcKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4JCQkJCTB4MDUwOAorI2RlZmluZQlPSURfODAyXzExX1NTSUQJCQkJCQkJCTB4MDUwOQorI2RlZmluZQlPSURfODAyXzExX0JTU0lECQkJCQkJCTB4MDUwQQorI2RlZmluZQlSVF9PSURfODAyXzExX1JBRElPCQkJCQkJCTB4MDUwQgorI2RlZmluZQlSVF9PSURfODAyXzExX1BIWV9NT0RFCQkJCQkJMHgwNTBDCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1RBX0NPTkZJRwkJCQkJMHgwNTBECisjZGVmaW5lCU9JRF84MDJfMTFfREVTSVJFRF9SQVRFUwkJCQkJMHgwNTBFCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUFJFQU1CTEUJCQkJCQkweDA1MEYKKyNkZWZpbmUJT0lEXzgwMl8xMV9XRVBfU1RBVFVTCQkJCQkJMHgwNTEwCisjZGVmaW5lCU9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQkJCQkweDA1MTEKKyNkZWZpbmUJT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFCQkJCTB4MDUxMgorI2RlZmluZQlSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTCQkJCTB4MDUxMworI2RlZmluZQlPSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkJCTB4MDUxNAorI2RlZmluZQlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xECQkJMHgwNTE1CisjZGVmaW5lCU9JRF84MDJfMTFfUE9XRVJfTU9ERQkJCQkJCTB4MDUxNgorI2RlZmluZQlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkJCQkweDA1MTcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BRERfV1BBCQkJCQkJMHgwNTE4CisjZGVmaW5lCU9JRF84MDJfMTFfUkVNT1ZFX0tFWQkJCQkJCTB4MDUxOQorI2RlZmluZQlPSURfODAyXzExX0FERF9LRVkJCQkJCQkJMHgwNTIwCisjZGVmaW5lCU9JRF84MDJfMTFfQ09ORklHVVJBVElPTgkJCQkJMHgwNTIxCisjZGVmaW5lCU9JRF84MDJfMTFfVFhfUEFDS0VUX0JVUlNUCQkJCQkweDA1MjIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTAkJCQkweDA1MjMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPCQkJCQkweDA1MjQKKyNpZmRlZglEQkcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUgkJCQkweDA1MjUKKyNlbmRpZgorI2RlZmluZSBPSURfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTICAgICAgICAgICAgT0lEXzgwMl8xMV9XRVBfU1RBVFVTCisjZGVmaW5lIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAgICAgICAgICAgICAgICAgMHgwNTI2CisjZGVmaW5lIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAgICAgICAgICAgICAgICAgMHgwNTI3CisjZGVmaW5lIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FICAgICAgICAgMHgwNTI4CisKKy8vIEZvciA4MDIuMXggZGFlbWluIHVzaW5nIHRvIHJlcXVpcmUgY3VycmVudCBkcml2ZXIgY29uZmlndXJhdGlvbgorI2RlZmluZSBPSURfODAyXzExX1JBRElVU19RVUVSWV9TRVRUSU5HCQkJCTB4MDU0MAorCisjZGVmaW5lCVJUX09JRF9ERVZJQ0VfTkFNRQkJCQkJCQkweDA2MDcKKyNkZWZpbmUJUlRfT0lEX1ZFUlNJT05fSU5GTwkJCQkJCQkweDA2MDgKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUCQkJCQkJMHgwNjA5CisjZGVmaW5lCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MJCQkJCTB4MDYwQQorI2RlZmluZQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTCQkJCTB4MDYwQgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTCQkJCTB4MDYwQworI2RlZmluZQlPSURfODAyXzExX1JTU0kJCQkJCQkJCTB4MDYwRAorI2RlZmluZQlPSURfODAyXzExX1NUQVRJU1RJQ1MJCQkJCQkweDA2MEUKKyNkZWZpbmUJT0lEX0dFTl9SQ1ZfT0sJCQkJCQkJCTB4MDYwRgorI2RlZmluZQlPSURfR0VOX1JDVl9OT19CVUZGRVIJCQkJCQkweDA2MTAKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTgkJCTB4MDYxMQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT04JCTB4MDYxMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURQkJCTB4MDYxMworI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEJCQkJMHgwNjE0CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfUElEVklECQkJCQkweDA2MTUKKy8vZm9yIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgICAgICAgICAgICAgICAgICAgICAweDA2MTYKKyNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICAgICAgICAgICAgICAgICAgICAweDA2MTcKKyNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICAgICAgICAweDA2MTgKKyNkZWZpbmUgT0lEXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjAKKyNkZWZpbmUgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgICAgICAgICAgICAgICAweDA2MjEKKyNkZWZpbmUgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQgICAgICAgICAgICAgICAgICAweDA2MjIKKyNkZWZpbmUgUlRfT0lEX05FV19EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKKworCisvL3J0Mjg2MCAsIGthdGh5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU05SXzAJCQkJCQkJMHgwNjMwCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU05SXzEJCQkJCQkJMHgwNjMxCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFCQkJMHgwNjMyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERQkJCQkweDA2MzMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERQkJCQkweDA2MzQKKyNkZWZpbmUJT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCQkJCTB4MDYzNQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORwkJCTB4MDYzNgorI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkcJCQkJMHgwNjM3CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00JCQkJMHgwNjM4CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNCQkJCQkweDA2MzkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMJCQkJCQkweDA2M0EKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfRExTCQkJCQkJMHgwNjNCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNCQkJCTB4MDYzQworI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0JCQkJCTB4MDYzRAorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX1dNTSAgICAgICAgICAgICAgCQkweDA2M0UKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfV01NICAgICAgCQkJCQkweDA2M0YKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9JTU1FX0JBX0NBUAkJCQkweDA2NDAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVAJCQkJMHgwNjQxCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfQkFUQUJMRQkJCQkJMHgwNjQyCisjZGVmaW5lIFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEJCQkJCTB4MDY0MworI2RlZmluZSBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQQkJCQkJMHgwNjQ0CisjZGVmaW5lIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgICAgICAgICAgICAgICAgICAgMHgwNjQ1CisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREUgICAgICAgICAgMHgwNjQ2CisjZGVmaW5lIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQgICAgICAgICAgMHgwNjQ3CisKKy8vIFJhbGluayBkZWZpbmVkIE9JRHMKKy8vIERlbm5pcyBMZWUgbW92ZSB0byBwbGF0Zm9ybSBzcGVjaWZpYworCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQlNTSUQJCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQlNTSUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TU0lEKQorI2RlZmluZQlSVF9PSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XRVAJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BRERfV0VQKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9LRVkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BRERfS0VZKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JFTU9WRV9XRVAJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JFTU9WRV9XRVApCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX0tFWQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX0tFWSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0RJU0FTU09DSUFURSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4JCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOKQorI2RlZmluZQlSVF9PSURfODAyXzExX1dFUF9TVEFUVVMJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1dFUF9TVEFUVVMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JFTE9BRF9ERUZBVUxUUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTAkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JTU0lfVFJJR0dFUikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xECQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SWF9BTlRFTk5BX1NFTEVDVEVEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUwkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TVVBQT1JURURfUkFURVMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfREVTSVJFRF9SQVRFUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfREVTSVJFRF9SQVRFUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKQorI2RlZmluZQlSVF9PSURfODAyXzExX1BPV0VSX01PREUJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BPV0VSX01PREUpCisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfU1RBVFVTX1RZUEUKK3sKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9BdXRoZW50aWNhdGlvbiwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9NZWRpYVN0cmVhbU1vZGUsCisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfUE1LSURfQ2FuZGlkYXRlTGlzdCwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZU1heCAgICAvLyBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfU1RBVFVTX1RZUEUsICpQTkRJU184MDJfMTFfU1RBVFVTX1RZUEU7CisKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9NQUNfQUREUkVTU1s2XTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OCit7CisgICAgTkRJU184MDJfMTFfU1RBVFVTX1RZUEUgU3RhdHVzVHlwZTsKK30gTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04sICpQTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT047CisKKy8vIG1hc2sgZm9yIGF1dGhlbnRpY2F0aW9uL2ludGVncml0eSBmaWVsZHMKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0FVVEhfRklFTERTICAgICAgICAweDBmCisKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX1JFQVVUSCAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9LRVlVUERBVEUgICAgICAgICAgMHgwMgorI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUEFJUldJU0VfRVJST1IgICAgIDB4MDYKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0dST1VQX0VSUk9SICAgICAgICAweDBFCisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUCit7CisgICAgVUxPTkcgTGVuZ3RoOyAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKyAgICBVTE9ORyBGbGFnczsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUOworCisvL0FkZGVkIG5ldyB0eXBlcyBmb3IgUE1LSUQgQ2FuZGlkYXRlIGxpc3RzLgordHlwZWRlZiBzdHJ1Y3QgX1BNS0lEX0NBTkRJREFURSB7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisgICAgVUxPTkcgRmxhZ3M7Cit9IFBNS0lEX0NBTkRJREFURSwgKlBQTUtJRF9DQU5ESURBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVAoreworICAgIFVMT05HIFZlcnNpb247ICAgICAgIC8vIFZlcnNpb24gb2YgdGhlIHN0cnVjdHVyZQorICAgIFVMT05HIE51bUNhbmRpZGF0ZXM7IC8vIE5vLiBvZiBwbWtpZCBjYW5kaWRhdGVzCisgICAgUE1LSURfQ0FORElEQVRFIENhbmRpZGF0ZUxpc3RbMV07Cit9IE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNULCAqUE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUOworCisvL0ZsYWdzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdCBzdHJ1Y3R1cmUKKyNkZWZpbmUgTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX1BSRUFVVEhfRU5BQkxFRAkweDAxCisKKy8vIEFkZGVkIG5ldyB0eXBlcyBmb3IgT0ZETSA1RyBhbmQgMi40RwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUKK3sKKyAgIE5kaXM4MDJfMTFGSCwKKyAgIE5kaXM4MDJfMTFEUywKKyAgICBOZGlzODAyXzExT0ZETTUsCisgICAgTmRpczgwMl8xMU9GRE01X04sCisgICAgTmRpczgwMl8xMU9GRE0yNCwKKyAgICBOZGlzODAyXzExT0ZETTI0X04sCisgICBOZGlzODAyXzExQXV0b21vZGUsCisgICAgTmRpczgwMl8xMU5ldHdvcmtUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QKK3sKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIE5ldHdvcmtUeXBlIFsxXTsKK30gTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1Q7CisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUE9XRVJfTU9ERQoreworICAgIE5kaXM4MDJfMTFQb3dlck1vZGVDQU0sCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNYXggICAgICAvLyBub3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfUE9XRVJfTU9ERSwgKlBORElTXzgwMl8xMV9QT1dFUl9NT0RFOworCit0eXBlZGVmIFVMT05HICAgTkRJU184MDJfMTFfVFhfUE9XRVJfTEVWRUw7IC8vIGluIG1pbGxpd2F0dHMKKworLy8KKy8vIFJlY2VpdmVkIFNpZ25hbCBTdHJlbmd0aCBJbmRpY2F0aW9uCisvLwordHlwZWRlZiBMT05HICAgIE5ESVNfODAyXzExX1JTU0k7ICAgICAgICAgICAvLyBpbiBkQm0KKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgKK3sKKyAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgVUxPTkcgICAgICAgICAgIEhvcFBhdHRlcm47ICAgICAgICAvLyBBcyBkZWZpbmVkIGJ5IDgwMi4xMSwgTVNCIHNldAorICAgVUxPTkcgICAgICAgICAgIEhvcFNldDsgICAgICAgICAgICAvLyB0byBvbmUgaWYgbm9uLTgwMi4xMQorICAgVUxPTkcgICAgICAgICAgIER3ZWxsVGltZTsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKK30gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTgoreworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOyAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRJTVdpbmRvdzsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNDb25maWc7ICAgICAgICAgICAvLyBGcmVxdWVuY3ksIHVuaXRzIGFyZSBrSHoKKyAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkggICAgRkhDb25maWc7Cit9IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04sICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRJU1RJQ1MKK3sKKyAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgIExBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OworICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZW1vdGVNSUNFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUElDVkVycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVwbGF5czsKKyAgIExBUkdFX0lOVEVHRVIgICBDQ01QRm9ybWF0RXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBSZXBsYXlzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBEZWNyeXB0RXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKK30gTkRJU184MDJfMTFfU1RBVElTVElDUywgKlBORElTXzgwMl8xMV9TVEFUSVNUSUNTOworCit0eXBlZGVmICBVTE9ORyAgTkRJU184MDJfMTFfS0VZX0lOREVYOwordHlwZWRlZiBVTE9OR0xPTkcgICBORElTXzgwMl8xMV9LRVlfUlNDOworCisjZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJICAvLyA4MDIuMXggZmFpbG92ZXIgbnVtYmVyCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX1NSVl9JTkZPIHsKKwlVSU5UMzIJCQlyYWRpdXNfaXA7CisJVUlOVDMyCQkJcmFkaXVzX3BvcnQ7CisJVUNIQVIJCQlyYWRpdXNfa2V5WzY0XTsKKwlVQ0hBUgkJCXJhZGl1c19rZXlfbGVuOworfSBSQURJVVNfU1JWX0lORk8sICpQUkFESVVTX1NSVl9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19LRVlfSU5GTworeworCVVDSEFSCQkJcmFkaXVzX3Nydl9udW07CisJUkFESVVTX1NSVl9JTkZPCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOworCVVDSEFSCQkJaWVlZTgwMjF4V0VQOwkJIC8vIGR5bmFtaWMgV0VQCisgICAgVUNIQVIgICAgICAgICAgIGtleV9pbmRleDsKKyAgICBVQ0hBUiAgICAgICAgICAga2V5X2xlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgIFVDSEFSICAgICAgICAgICBrZXlfbWF0ZXJpYWxbMTNdOworfSBSQURJVVNfS0VZX0lORk8sICpQUkFESVVTX0tFWV9JTkZPOworCisvLyBJdCdzIHVzZWQgYnkgODAyLjF4IGRhZW1vbiB0byByZXF1aXJlIHJlbGF0aXZlIGNvbmZpZ3VyYXRpb24KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0NPTkYKK3sKKyAgICBVSU5UMzIgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVQ0hBUgkJCW1ic3NfbnVtOwkJCS8vIGluZGljYXRlIG11bHRpcGxlIEJTUyBudW1iZXIKKwlVSU5UMzIJCQlvd25faXBfYWRkcjsKKwlVSU5UMzIJCQlyZXRyeV9pbnRlcnZhbDsKKwlVSU5UMzIJCQlzZXNzaW9uX3RpbWVvdXRfaW50ZXJ2YWw7CisJVUNIQVIJCQlFQVBpZm5hbWVbSUZOQU1TSVpdOworCVVDSEFSCQkJRUFQaWZuYW1lX2xlbjsKKwlVQ0hBUiAJCQlQcmVBdXRoaWZuYW1lW0lGTkFNU0laXTsKKwlVQ0hBUgkJCVByZUF1dGhpZm5hbWVfbGVuOworCVJBRElVU19LRVlfSU5GTwlSYWRpdXNJbmZvWzgvKk1BWF9NQlNTSURfTlVNKi9dOworfSBSQURJVVNfQ09ORiwgKlBSQURJVVNfQ09ORjsKKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIEtleSBtYXBwaW5nIGtleXMgcmVxdWlyZSBhIEJTU0lECit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfS0VZCit7CisgICAgVUlOVCAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVSU5UICAgICAgICAgICBLZXlJbmRleDsKKyAgICBVSU5UICAgICAgICAgICBLZXlMZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBORElTXzgwMl8xMV9LRVlfUlNDIEtleVJTQzsKKyAgICBVQ0hBUiAgICAgICAgICAgS2V5TWF0ZXJpYWxbMV07ICAgICAvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCit9IE5ESVNfODAyXzExX0tFWSwgKlBORElTXzgwMl8xMV9LRVk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9SRU1PVkVfS0VZCit7CisgICAgVUlOVCAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVSU5UICAgICAgICAgICBLZXlJbmRleDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKK30gTkRJU184MDJfMTFfUkVNT1ZFX0tFWSwgKlBORElTXzgwMl8xMV9SRU1PVkVfS0VZOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfV0VQCit7CisgICBVSU5UICAgICBMZW5ndGg7ICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgIFVJTlQgICAgIEtleUluZGV4OyAgICAgICAgICAgLy8gMCBpcyB0aGUgcGVyLWNsaWVudCBrZXksIDEtTiBhcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIGtleXMKKyAgIFVJTlQgICAgIEtleUxlbmd0aDsgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKKyAgIFVDSEFSICAgICBLZXlNYXRlcmlhbFsxXTsvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCit9IE5ESVNfODAyXzExX1dFUCwgKlBORElTXzgwMl8xMV9XRVA7CisKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFCit7CisgICBOZGlzODAyXzExSUJTUywKKyAgIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSwKKyAgIE5kaXM4MDJfMTFBdXRvVW5rbm93biwKKyAgIE5kaXM4MDJfMTFNb25pdG9yLAorICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlTWF4ICAgICAvLyBOb3QgYSByZWFsIHZhbHVlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUsICpQTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRTsKKworLy8gQWRkIG5ldyBhdXRoZW50aWNhdGlvbiBtb2RlcwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCit7CisgICBOZGlzODAyXzExQXV0aE1vZGVPcGVuLAorICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkLAorICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwKKyAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEsCisgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLLAorICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUsCisgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyLAorICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSywKKyAgIAlOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMiwKKwlOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSywKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZU1heCAgICAgICAgICAgLy8gTm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERTsKKwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1JBVEVTW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU107ICAgICAgICAvLyBTZXQgb2YgOCBkYXRhIHJhdGVzCit0eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNfRVhbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsgIC8vIFNldCBvZiAxNiBkYXRhIHJhdGVzCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfU1NJRAoreworICAgIFVJTlQgICBTc2lkTGVuZ3RoOyAgICAgICAgIC8vIGxlbmd0aCBvZiBTU0lEIGZpZWxkIGJlbG93LCBpbiBieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW4gYmUgemVyby4KKyAgICBVQ0hBUiAgIFNzaWRbTkRJU184MDJfMTFfTEVOR1RIX1NTSURdOyAgICAgICAgICAgLy8gU1NJRCBpbmZvcm1hdGlvbiBmaWVsZAorfSBORElTXzgwMl8xMV9TU0lELCAqUE5ESVNfODAyXzExX1NTSUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSUQKK3sKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgTWFjQWRkcmVzczsgLy8gQlNTSUQKKyAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOworICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsgICAgICAgLy8gU1NJRAorICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmFjeTsgICAgLy8gV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQKKyAgIE5ESVNfODAyXzExX1JTU0kgICAgICAgICAgICAgICAgICAgIFJzc2k7ICAgICAgIC8vIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIGluIGRCbQorICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKKyAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZ3VyYXRpb247CisgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBJbmZyYXN0cnVjdHVyZU1vZGU7CisgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKK30gTkRJU19XTEFOX0JTU0lELCAqUE5ESVNfV0xBTl9CU1NJRDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9CU1NJRF9MSVNUCit7CisgICBVSU5UICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgICAgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKKyAgIE5ESVNfV0xBTl9CU1NJRCBCc3NpZFsxXTsKK30gTkRJU184MDJfMTFfQlNTSURfTElTVCwgKlBORElTXzgwMl8xMV9CU1NJRF9MSVNUOworCisvLyBBZGRlZCBDYXBhYmlsaXRpZXMsIElFTGVuZ3RoIGFuZCBJRXMgZm9yIGVhY2ggQlNTSUQKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU19XTEFOX0JTU0lEX0VYCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAgICAgICAgIC8vIEJTU0lECisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsgICAgICAgICAgICAgICAvLyBTU0lECisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmFjeTsgICAgICAgICAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAorICAgIE5ESVNfODAyXzExX1JTU0kgICAgICAgICAgICAgICAgICAgIFJzc2k7ICAgICAgICAgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVuZ3RoIGluIGRCbQorICAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldHdvcmtUeXBlSW5Vc2U7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBJbmZyYXN0cnVjdHVyZU1vZGU7CisgICAgTkRJU184MDJfMTFfUkFURVNfRVggICAgICAgICAgICAgICAgU3VwcG9ydGVkUmF0ZXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVMZW5ndGg7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVzWzFdOworfSBORElTX1dMQU5fQlNTSURfRVgsICpQTkRJU19XTEFOX0JTU0lEX0VYOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgKK3sKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgIE5ESVNfV0xBTl9CU1NJRF9FWCAgICAgIEJzc2lkWzFdOworfSBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYLCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVg7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfRklYRURfSUVzCit7CisgICAgVUNIQVIgVGltZXN0YW1wWzhdOworICAgIFVTSE9SVCBCZWFjb25JbnRlcnZhbDsKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworfSBORElTXzgwMl8xMV9GSVhFRF9JRXMsICpQTkRJU184MDJfMTFfRklYRURfSUVzOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCit7CisgICAgVUNIQVIgRWxlbWVudElEOworICAgIFVDSEFSIExlbmd0aDsgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIGRhdGEgZmllbGQKKyAgICBVQ0hBUiBkYXRhWzFdOworfSBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMsICpQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzOworCit0eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOworCit0eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQ7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfQU5URU5OQTsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgoreworICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGwsCisgICBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQCit9IE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSLCAqUE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSOworCisvLyBBZGRlZCBuZXcgZW5jcnlwdGlvbiB0eXBlcworLy8gQWxzbyBhbGlhc2VkIHR5cGVkZWYgdG8gbmV3IG5hbWUKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfV0VQX1NUQVRVUworeworICAgTmRpczgwMl8xMVdFUEVuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCA9IE5kaXM4MDJfMTFXRVBFbmFibGVkLAorICAgTmRpczgwMl8xMVdFUERpc2FibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQsCisgICBOZGlzODAyXzExV0VQS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUtleUFic2VudCA9IE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCisgICBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uTm90U3VwcG9ydGVkID0gTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMktleUFic2VudCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkLAkvLyBUS0lQIG9yIEFFUyBtaXgKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQsCisgICAgTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkLAorCU5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQsCit9IE5ESVNfODAyXzExX1dFUF9TVEFUVVMsICpQTkRJU184MDJfMTFfV0VQX1NUQVRVUywKKyAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMsICpQTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTCit7CisgICBOZGlzODAyXzExUmVsb2FkV0VQS2V5cworfSBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMsICpQTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTOworCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyAgICAgIDEKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfTElTVEVOSU5URVJWQUwgICAgMgorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9DVVJSRU5UQVBBRERSRVNTICA0CisKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQ0FQQUJJTElUSUVTICAgICAgMQorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9TVEFUVVNDT0RFICAgICAgICAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX0FTU09DSUFUSU9OSUQgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FJX1JFUUZJCit7CisgICAgVVNIT1JUIENhcGFiaWxpdGllczsKKyAgICBVU0hPUlQgTGlzdGVuSW50ZXJ2YWw7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgIEN1cnJlbnRBUEFkZHJlc3M7Cit9IE5ESVNfODAyXzExX0FJX1JFUUZJLCAqUE5ESVNfODAyXzExX0FJX1JFUUZJOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVTRkkKK3sKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworICAgIFVTSE9SVCBTdGF0dXNDb2RlOworICAgIFVTSE9SVCBBc3NvY2lhdGlvbklkOworfSBORElTXzgwMl8xMV9BSV9SRVNGSSwgKlBORElTXzgwMl8xMV9BSV9SRVNGSTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgTGVuZ3RoOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVJlcXVlc3RGaXhlZElFczsKKyAgICBORElTXzgwMl8xMV9BSV9SRVFGSSAgICBSZXF1ZXN0Rml4ZWRJRXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVxdWVzdElFTGVuZ3RoOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlcXVlc3RJRXM7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVzcG9uc2VGaXhlZElFczsKKyAgICBORElTXzgwMl8xMV9BSV9SRVNGSSAgICBSZXNwb25zZUZpeGVkSUVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlSUVMZW5ndGg7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVzcG9uc2VJRXM7Cit9IE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OLCAqUE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQKK3sKKyAgICBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiAgICAgICBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVCAgUmVxdWVzdFsxXTsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQ7CisKKy8qCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfVEVTVAoreworICAgIFVMT05HIExlbmd0aDsKKyAgICBVTE9ORyBUeXBlOworICAgIHVuaW9uCisgICAgeworICAgICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVCBBdXRoZW50aWNhdGlvbkV2ZW50OworICAgICAgICBORElTXzgwMl8xMV9SU1NJIFJzc2lUcmlnZ2VyOworICAgIH07Cit9IE5ESVNfODAyXzExX1RFU1QsICpQTkRJU184MDJfMTFfVEVTVDsKKyAqLworCisvLyA4MDIuMTEgTWVkaWEgc3RyZWFtIGNvbnN0cmFpbnRzLCBhc3NvY2lhdGVkIHdpdGggT0lEXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQoreworICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9mZiwKKyAgICBOZGlzODAyXzExTWVkaWFTdHJlYW1PbiwKK30gTkRJU184MDJfMTFfTUVESUFfU1RSRUFNX01PREUsICpQTkRJU184MDJfMTFfTUVESUFfU1RSRUFNX01PREU7CisKKy8vIFBNS0lEIFN0cnVjdHVyZXMKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRVsxNl07CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9CU1NJRF9JTkZPCit7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisgICAgTkRJU184MDJfMTFfUE1LSURfVkFMVUUgUE1LSUQ7Cit9IEJTU0lEX0lORk8sICpQQlNTSURfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lECit7CisgICAgVUlOVCAgICBMZW5ndGg7CisgICAgVUlOVCAgICBCU1NJREluZm9Db3VudDsKKyAgICBCU1NJRF9JTkZPIEJTU0lESW5mb1sxXTsKK30gTkRJU184MDJfMTFfUE1LSUQsICpQTkRJU184MDJfMTFfUE1LSUQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04KK3sKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIEF1dGhNb2RlU3VwcG9ydGVkOworICAgIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIEVuY3J5cHRTdGF0dXNTdXBwb3J0ZWQ7Cit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04sICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NBUEFCSUxJVFkKK3sKKyAgICAgVUxPTkcgTGVuZ3RoOworICAgICBVTE9ORyBWZXJzaW9uOworICAgICBVTE9ORyBOb09mUE1LSURzOworICAgICBVTE9ORyBOb09mQXV0aEVuY3J5cHRQYWlyc1N1cHBvcnRlZDsKKyAgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiBBdXRoZW50aWNhdGlvbkVuY3J5cHRpb25TdXBwb3J0ZWRbMV07Cit9IE5ESVNfODAyXzExX0NBUEFCSUxJVFksICpQTkRJU184MDJfMTFfQ0FQQUJJTElUWTsKKworLy8jZW5kaWYgLy9vZiBXSU4gMmsKKyNlbmRpZiAvL1VOREVSX0NFCisKKyNpZiBXSVJFTEVTU19FWFQgPD0gMTEKKyNpZm5kZWYgU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRTAKKyNlbmRpZgorI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJCQkJCQkJCVNJT0NERVZQUklWQVRFCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBSVFBSSVZfSU9DVExfU0VUCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDAyKQorCisjaWZkZWYgREJHCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9CQlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDMpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9NQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDUpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9FMlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDcpCisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorI2RlZmluZSBSVFBSSVZfSU9DVExfQVRFCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDA4KQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDkpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9BRERfUE1LSURfQ0FDSEUgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MEEpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9SQURJVVNfREFUQSAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MEMpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEQpCisjZGVmaW5lIFJUX1BSSVZfSU9DVEwJCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBFKSAvLyBTeW5jLiB3aXRoIFJUNjEgKGZvciB3cGFfc3VwcGxpY2FudCkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0dFVF9NQUNfVEFCTEUJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBGKQorCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TSE9XCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDExKQorZW51bSB7CisgICAgU0hPV19DT05OX1NUQVRVUyA9IDQsCisgICAgU0hPV19EUlZJRVJfVkVSSU9OID0gNSwKKyAgICBTSE9XX0JBX0lORk8gPSA2LAorCVNIT1dfREVTQ19JTkZPID0gNywKKyNpZmRlZiBSVDI4NzAKKwlTSE9XX1JYQlVMS19JTkZPID0gOCwKKwlTSE9XX1RYQlVMS19JTkZPID0gOSwKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKyAgICBSQUlPX09GRiA9IDEwLAorICAgIFJBSU9fT04gPSAxMSwKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlTSE9XX0RMU19FTlRSWV9JTkZPID0gMTksCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJU0hPV19DRkdfVkFMVUUgPSAyMCwKKwlTSE9XX0FESE9DX0VOVFJZX0lORk8gPSAyMSwKK307CisKKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgU05NUF9TVVBQT1JUCisvL1NOTVAgaWVlZSA4MDJkb3QxMSwga2F0aHkgLCAyMDA4XzAyMjAKKy8vIGRvdDExcmVzKDMpCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJCQkJMHgwNzAwCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRQkJCTB4MDcwMQorI2RlZmluZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRQkJMHgwNzAyCisKKy8vIGRvdDExc210KDEpCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVECTB4MDcwMworI2RlZmluZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUJCTB4MDcwNAorI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRQkJCTB4MDcwNSAvLyByZWFkICwgd3JpdGUKKyNkZWZpbmUgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQJCQkJMHgwNzA2CisjZGVmaW5lIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSAkJMHgwNzA3CisjZGVmaW5lIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUCQkJCTB4MDcwOAorI2RlZmluZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUCQkJCTB4MDcwOQorI2RlZmluZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRAkJCQkJMHgwNzEwCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRAkJCQkweDA3MTEKKworLy8gLy9kb3QxMVBoeSg0KQorI2RlZmluZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMCQkJCTB4MDcxMgorCisvL2RvdDExbWFjCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1MJCQkJMHgwNzEzCisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKyNkZWZpbmUgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYCQkJCTB4MDcxNAorI2RlZmluZSBPSURfODAyXzExX0dFVF9DSF9MSVNUCQkJCQkweDA3MTUKKyNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFCQkJCTB4MDcxNgorI2RlZmluZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWQkJMHgwNzE3CisKKyNpZmRlZiBMTFREX1NVUFBPUlQKKy8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEKKyNkZWZpbmUgUlRfT0lEX0dFVF9QSFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDc2MQorI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworCisvLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKK3R5cGVkZWYgdW5pb24gIF9IVFRSQU5TTUlUX1NFVFRJTkcgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QJeworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKy8vCVVTSE9SVAkJcnN2OjM7CisJVVNIT1JUCQlUeEJGOjE7CisJVVNIT1JUCQlyc3Y6MjsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorLy8JVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCXJzdjoyOworCVVTSE9SVAkJVHhCRjoxOworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKwl9CWZpZWxkOworI2VuZGlmCisJVVNIT1JUCQl3b3JkOworIH0gSFRUUkFOU01JVF9TRVRUSU5HLCAqUEhUVFJBTlNNSVRfU0VUVElORzsKKwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUFJFQU1CTEUgeworICAgIFJ0ODAyXzExUHJlYW1ibGVMb25nLAorICAgIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwKKyAgICBSdDgwMl8xMVByZWFtYmxlQXV0bworfSBSVF84MDJfMTFfUFJFQU1CTEUsICpQUlRfODAyXzExX1BSRUFNQkxFOworCisvLyBPbmx5IGZvciBTVEEsIG5lZWQgdG8gc3luYyB3aXRoIEFQCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QSFlfTU9ERSB7CisJUEhZXzExQkdfTUlYRUQgPSAwLAorCVBIWV8xMUIsCisJUEhZXzExQSwKKwlQSFlfMTFBQkdfTUlYRUQsCisJUEhZXzExRywKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlQSFlfMTFBQkdOX01JWEVELAkvLyBib3RoIGJhbmQgICA1CisJUEhZXzExTl8yXzRHLAkJLy8gMTFuLW9ubHkgd2l0aCAyLjRHIGJhbmQgICAJNgorCVBIWV8xMUdOX01JWEVELAkvLyAyLjRHIGJhbmQgICAgICA3CisJUEhZXzExQU5fTUlYRUQsCS8vIDVHICBiYW5kICAgICAgIDgKKwlQSFlfMTFCR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgOQorCVBIWV8xMUFHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICAxMAorCVBIWV8xMU5fNUcsCQkJLy8gMTFuLW9ubHkgd2l0aCA1RyBiYW5kCQkxMQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfSBSVF84MDJfMTFfUEhZX01PREU7CisKKy8vIHB1dCBhbGwgcHJvcHJpZXRlcnkgZm9yLXF1ZXJ5IG9iamVjdHMgaGVyZSB0byByZWR1Y2UgIyBvZiBRdWVyeV9PSUQKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTElOS19TVEFUVVMgeworICAgIFVMT05HICAgQ3VyclR4UmF0ZTsgICAgICAgICAvLyBpbiB1bml0cyBvZiAwLjVNYnBzCisgICAgVUxPTkcgICBDaGFubmVsUXVhbGl0eTsgICAgIC8vIDAuLjEwMCAlCisgICAgVUxPTkcgICBUeEJ5dGVDb3VudDsgICAgICAgIC8vIGJvdGggb2sgYW5kIGZhaWwKKyAgICBVTE9ORyAgIFJ4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAorICAgIFVMT05HCUNlbnRyYWxDaGFubmVsOwkJLy8gNDBNSHogY2VudHJhbCBjaGFubmVsIG51bWJlcgorfSBSVF84MDJfMTFfTElOS19TVEFUVVMsICpQUlRfODAyXzExX0xJTktfU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX0xPRyB7CisgICAgTEFSR0VfSU5URUdFUiAgIFN5c3RlbVRpbWU7ICAvLyB0aW1lc3RhbW1wIHZpYSBOZGlzR2V0Q3VycmVudFN5c3RlbVRpbWUoKQorICAgIFVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVVNIT1JUICAgICAgICAgIEV2ZW50OyAgICAgICAvLyBFVkVOVF94eHgKK30gUlRfODAyXzExX0VWRU5UX0xPRywgKlBSVF84MDJfMTFfRVZFTlRfTE9HOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX1RBQkxFIHsKKyAgICBVTE9ORyAgICAgICBOdW07CisgICAgVUxPTkcgICAgICAgUnN2OyAgICAgLy8gdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5CisgICAgUlRfODAyXzExX0VWRU5UX0xPRyAgIExvZ1tNQVhfTlVNQkVSX09GX0VWRU5UXTsKK30gUlRfODAyXzExX0VWRU5UX1RBQkxFLCBQUlRfODAyXzExX0VWRU5UX1RBQkxFOworCisvLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKK3R5cGVkZWYgdW5pb24gIF9NQUNIVFRSQU5TTUlUX1NFVFRJTkcgeworCXN0cnVjdAl7CisJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCisJfQlmaWVsZDsKKwlVU0hPUlQJCXdvcmQ7CisgfSBNQUNIVFRSQU5TTUlUX1NFVFRJTkcsICpQTUFDSFRUUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19FTlRSWSB7CisgICAgVUNIQVIgICAgICAgQWRkcltNQUNfQUREUl9MRU5HVEhdOworICAgIFVDSEFSICAgICAgIEFpZDsKKyAgICBVQ0hBUiAgICAgICBQc207ICAgICAvLyAwOlBXUl9BQ1RJVkUsIDE6UFdSX1NBVkUKKyAgICBVQ0hBUgkJTWltb1BzOyAgLy8gMDpNTVBTX1NUQVRJQywgMTpNTVBTX0RZTkFNSUMsIDM6TU1QU19FbmFibGVkCisgICAgQ0hBUgkJQXZnUnNzaTA7CisJQ0hBUgkJQXZnUnNzaTE7CisJQ0hBUgkJQXZnUnNzaTI7CisJVUlOVDMyCQlDb25uZWN0ZWRUaW1lOworICAgIE1BQ0hUVFJBTlNNSVRfU0VUVElORwlUeFJhdGU7Cit9IFJUXzgwMl8xMV9NQUNfRU5UUlksICpQUlRfODAyXzExX01BQ19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9NQUNfVEFCTEUgeworICAgIFVMT05HICAgICAgIE51bTsKKyAgICBSVF84MDJfMTFfTUFDX0VOVFJZIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsKK30gUlRfODAyXzExX01BQ19UQUJMRSwgKlBSVF84MDJfMTFfTUFDX1RBQkxFOworCisvLyBzdHJ1Y3R1cmUgZm9yIHF1ZXJ5L3NldCBoYXJkd2FyZSByZWdpc3RlciAtIE1BQywgQkJQLCBSRiByZWdpc3RlcgordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiB7CisgICAgVUxPTkcgICBIYXJkd2FyZVR5cGU7ICAgICAgIC8vIDA6TUFDLCAxOkJCUCwgMjpSRiByZWdpc3RlciwgMzpFRVBST00KKyAgICBVTE9ORyAgIE9mZnNldDsgICAgICAgICAgICAgLy8gUS9TIHJlZ2lzdGVyIG9mZnNldCBhZGRyCisgICAgVUxPTkcgICBEYXRhOyAgICAgICAgICAgICAgIC8vIFIvVyBkYXRhIGJ1ZmZlcgorfSBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIsICpQUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSOworCisvLyBzdHJ1Y3R1cmUgdG8gdHVuZSBCQlAgUjE3ICJSWCBBR0MgVkdDIGluaXQiCisvL3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfUlhfQUdDX1ZHQ19UVU5JTkcgeworLy8gICAgVUNIQVIgICBGYWxzZUNjYUxvd2VyVGhyZXNob2xkOyAgLy8gMC0yNTUsIGRlZiAxMAorLy8gICAgVUNIQVIgICBGYWxzZUNjYVVwcGVyVGhyZXNob2xkOyAgLy8gMC0yNTUsIGRlZiAxMDAKKy8vICAgIFVDSEFSICAgVmdjRGVsdGE7ICAgICAgICAgICAgICAgIC8vIFIxNyArLT0gVmdjRGVsdGEgd2hlbmV2ZXIgZmxhc2UgQ0NBIG92ZXIgVXBwclRocmVzaG9sZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgbG93ZXIgdGhhbiBMb3dlclRocmVzaG9sZHVwcGVyIHRocmVzaG9sZAorLy8gICAgVUNIQVIgICBWZ2NVcHBlckJvdW5kOyAgICAgICAgICAgLy8gbWF4IHZhbHVlIG9mIFIxNworLy99IFJUXzgwMl8xMV9SWF9BR0NfVkdDX1RVTklORywgKlBSVF84MDJfMTFfUlhfQUdDX1ZHQ19UVU5JTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQVBfQ09ORklHIHsKKyAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQorICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQorICAgIFVMT05HICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaXNvbGF0aW9uCisgICAgVUxPTkcgICBIaWRlU3NpZDsgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaGlkaW5nCisgICAgVUxPTkcgICBVc2VCR1Byb3RlY3Rpb247ICAgIC8vIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRgorICAgIFVMT05HICAgVXNlU2hvcnRTbG90VGltZTsgICAvLyAwLW5vIHVzZSwgMS11c2UgOS11cyBzaG9ydCBzbG90IHRpbWUKKyAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisgICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCit9IFJUXzgwMl8xMV9BUF9DT05GSUcsICpQUlRfODAyXzExX0FQX0NPTkZJRzsKKworLy8gc3RydWN0dXJlIHRvIHF1ZXJ5L3NldCBTVEFfQ09ORklHCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1NUQV9DT05GSUcgeworICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCisgICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCisgICAgVUxPTkcgICBVc2VCR1Byb3RlY3Rpb247ICAgIC8vIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRgorICAgIFVMT05HICAgVXNlU2hvcnRTbG90VGltZTsgICAvLyAwLW5vIHVzZSwgMS11c2UgOS11cyBzaG9ydCBzbG90IHRpbWUgd2hlbiBhcHBsaWNhYmxlCisgICAgVUxPTkcgICBBZGhvY01vZGU7IAkJCS8vIDAtMTFiIHJhdGVzIG9ubHkgKFdJRkkgc3BlYyksIDEgLSBiL2cgbWl4ZWQsIDIgLSBnIG9ubHkKKyAgICBVTE9ORyAgIEh3UmFkaW9TdGF0dXM7ICAgICAgLy8gMC1PRkYsIDEtT04sIGRlZmF1bHQgaXMgMSwgUmVhZC1Pbmx5CisgICAgVUxPTkcgICBSc3YxOyAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMAorICAgIFVMT05HICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAvLyBpZ25vcmUgdXBvbiBTRVQsIHJldHVybiBzeXN0ZW0gZXJyb3IgdXBvbiBRVUVSWQorfSBSVF84MDJfMTFfU1RBX0NPTkZJRywgKlBSVF84MDJfMTFfU1RBX0NPTkZJRzsKKworLy8KKy8vICBGb3IgT0lEIFF1ZXJ5IG9yIFNldCBhYm91dCBCQSBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmCXN0cnVjdAlfT0lEX0JBQ0FQX1NUUlVDCXsKKwkJVUNIQVIJCVJ4QkFXaW5MaW1pdDsKKwkJVUNIQVIJCVR4QkFXaW5MaW1pdDsKKwkJVUNIQVIJCVBvbGljeTsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZAorCQlVQ0hBUgkJTXBkdURlbnNpdHk7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKKwkJVUNIQVIgICAgICAgCUFtc2R1RW5hYmxlOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCisJCVVDSEFSICAgICAgIAlBbXNkdVNpemU7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07CisJCVVDSEFSICAgICAgIAlNTVBTbW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCisJCUJPT0xFQU4JCUF1dG9CQTsJLy8gQXV0byBCQSB3aWxsIGF1dG9tYXRpY2FsbHkKK30gT0lEX0JBQ0FQX1NUUlVDLCAqUE9JRF9CQUNBUF9TVFJVQzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BQ0xfRU5UUlkgeworICAgIFVDSEFSICAgQWRkcltNQUNfQUREUl9MRU5HVEhdOworICAgIFVTSE9SVCAgUnN2OworfSBSVF84MDJfMTFfQUNMX0VOVFJZLCAqUFJUXzgwMl8xMV9BQ0xfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX0FDTCB7CisgICAgVUxPTkcgICBQb2xpY3k7ICAgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1wb3NpdGl2ZSBsaXN0LCAyLW5lZ2F0aXZlIGxpc3QKKyAgICBVTE9ORyAgIE51bTsKKyAgICBSVF84MDJfMTFfQUNMX0VOVFJZIEVudHJ5W01BWF9OVU1CRVJfT0ZfQUNMXTsKK30gUlRfODAyXzExX0FDTCwgKlBSVF84MDJfMTFfQUNMOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1dEUyB7CisgICAgVUxPTkcJCQkJCQlOdW07CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCUVudHJ5WzI0LypNQVhfTlVNX09GX1dEU19MSU5LKi9dOworCVVMT05HCQkJCQkJS2V5TGVuZ3RoOworCVVDSEFSCQkJCQkJS2V5TWF0ZXJpYWxbMzJdOworfSBSVF84MDJfMTFfV0RTLCAqUFJUXzgwMl8xMV9XRFM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfVFhfUkFURVNfIHsKKyAgICBVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworICAgIFVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKKyAgICBVQ0hBUiAgICAgICBFeHRSYXRlTGVuOworICAgIFVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKK30gUlRfODAyXzExX1RYX1JBVEVTLCAqUFJUXzgwMl8xMV9UWF9SQVRFUzsKKworCisvLyBEZWZpbml0aW9uIG9mIGV4dHJhIGluZm9ybWF0aW9uIGNvZGUKKyNkZWZpbmUJR0VORVJBTF9MSU5LX1VQCQkJMHgwCQkJLy8gTGluayBpcyBVcAorI2RlZmluZQlHRU5FUkFMX0xJTktfRE9XTgkJMHgxCQkJLy8gTGluayBpcyBEb3duCisjZGVmaW5lCUhXX1JBRElPX09GRgkJCTB4MgkJCS8vIEhhcmR3YXJlIHJhZGlvIG9mZgorI2RlZmluZQlTV19SQURJT19PRkYJCQkweDMJCQkvLyBTb2Z0d2FyZSByYWRpbyBvZmYKKyNkZWZpbmUJQVVUSF9GQUlMCQkJCTB4NAkJCS8vIE9wZW4gYXV0aGVudGljYXRpb24gZmFpbAorI2RlZmluZQlBVVRIX0ZBSUxfS0VZUwkJCTB4NQkJCS8vIFNoYXJlZCBhdXRoZW50aWNhdGlvbiBmYWlsCisjZGVmaW5lCUFTU09DX0ZBSUwJCQkJMHg2CQkJLy8gQXNzb2NpYXRpb24gZmFpbGVkCisjZGVmaW5lCUVBUF9NSUNfRkFJTFVSRQkJCTB4NwkJCS8vIERlYXV0aGVuY2F0aW9uIGJlY2F1c2UgTUlDIGZhaWx1cmUKKyNkZWZpbmUJRUFQXzRXQVlfVElNRU9VVAkJMHg4CQkJLy8gRGVhdXRoZW5jYXRpb24gb24gNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQKKyNkZWZpbmUJRUFQX0dST1VQX0tFWV9USU1FT1VUCTB4OQkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIGdyb3VwIGtleSBoYW5kc2hha2UgdGltZW91dAorI2RlZmluZQlFQVBfU1VDQ0VTUwkJCQkweGEJCQkvLyBFQVAgc3VjY2VlZAorI2RlZmluZQlERVRFQ1RfUkFEQVJfU0lHTkFMCQkweGIgICAgICAgICAvLyBSYWRhciBzaWduYWwgb2NjdXIgaW4gY3VycmVudCBjaGFubmVsCisjZGVmaW5lIEVYVFJBX0lORk9fTUFYCQkJMHhiCQkJLy8gSW5kaWNhdGUgTGFzdCBPSUQKKworI2RlZmluZSBFWFRSQV9JTkZPX0NMRUFSCQkweGZmZmZmZmZmCisKKy8vIFRoaXMgaXMgT0lEIHNldHRpbmcgc3RydWN0dXJlLiBTbyBvbmx5IEdGIG9yIE1NIGFzIE1vZGUuIFRoaXMgaXMgdmFsaWQgd2hlbiBvdXIgd2lyZWxzcyBtb2RlIGhhcyA4MDIuMTFuIGluIHVzZS4KK3R5cGVkZWYgc3RydWN0IHsKKwlSVF84MDJfMTFfUEhZX01PREUJCVBoeU1vZGU7IAkvLworCVVDSEFSCQlUcmFuc21pdE5vOworCVVDSEFSCQlIdE1vZGU7IAkvL0hUTU9ERV9HRiBvciBIVE1PREVfTU0KKwlVQ0hBUgkJRXh0T2Zmc2V0OwkvL2V4dGVuc2lvbiBjaGFubmVsIGFib3ZlIG9yIGJlbG93CisJVUNIQVIJCU1DUzsKKwlVQ0hBUiAgIAlCVzsKKwlVQ0hBUgkJU1RCQzsKKwlVQ0hBUgkJU0hPUlRHSTsKKwlVQ0hBUgkJcnN2OworfSBPSURfU0VUX0hUX1BIWU1PREUsICpQT0lEX1NFVF9IVF9QSFlNT0RFOworCisjaWZkZWYgTklOVEVORE9fQVAKKyNkZWZpbmUgTklOVEVORE9fTUFYX0VOVFJZIDE2CisjZGVmaW5lIE5JTlRFTkRPX1NTSURfTkFNRV9MTiA4CisjZGVmaW5lIE5JTlRFTkRPX1NTSURfTkFNRSAiTldDVVNCQVAiCisjZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JFUV9GTEFHX01BU0sgMHgwMworI2RlZmluZSBOSU5URU5ET19QUk9CRV9SRVFfT04gMHgwMQorI2RlZmluZSBOSU5URU5ET19QUk9CRV9SRVFfU0lHTkFMIDB4MDIKKyNkZWZpbmUgTklOVEVORE9fUFJPQkVfUlNQX09OIDB4MDEKKyNkZWZpbmUgTklOVEVORE9fU1NJRF9OSUNLTkFNRV9MTiAyMAorCisjZGVmaW5lIE5JTlRFTkRPX1dFUEtFWV9MTiAxMworCit0eXBlZGVmIHN0cnVjdCBfTklOVEVORE9fU1NJRAoreworCVVDSEFSCU5JTlRFTkRPRml4Q2hhcltOSU5URU5ET19TU0lEX05BTUVfTE5dOworCVVDSEFSCXplcm8xOworCVVDSEFSCXJlZ2lzdGU7CisJVUNIQVIJSUQ7CisJVUNIQVIJemVybzI7CisJVUNIQVIJTklDS25hbWVbTklOVEVORE9fU1NJRF9OSUNLTkFNRV9MTl07Cit9IFJUX05JTlRFTkRPX1NTSUQsICpQUlRfTklOVEVORE9fU1NJRDsKKwordHlwZWRlZiBzdHJ1Y3QgX05JTlRFTkRPX0VOVFJZCit7CisJVUNIQVIJTklDS25hbWVbTklOVEVORE9fU1NJRF9OSUNLTkFNRV9MTl07CisgICAgVUNIQVIgICBEU19BZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisJVUNIQVIJcmVnaXN0ZTsKKwlVQ0hBUglVc2VyU3BhY2VBY2s7Cit9IFJUX05JTlRFTkRPX0VOVFJZLCAqUFJUX05JTlRFTkRPX0VOVFJZOworCisvL1JUUFJJVl9JT0NUTF9OSU5URU5ET19HRVRfVEFCTEUKKy8vUlRQUklWX0lPQ1RMX05JTlRFTkRPX1NFVF9UQUJMRQordHlwZWRlZiBzdHJ1Y3QgX05JTlRFTkRPX1RBQkxFCit7CisJVUlOVAkJCQludW1iZXI7CisJUlRfTklOVEVORE9fRU5UUlkJZW50cnlbTklOVEVORE9fTUFYX0VOVFJZXTsKK30gUlRfTklOVEVORE9fVEFCTEUsICpQUlRfTklOVEVORE9fVEFCTEU7CisKKy8vUlRQUklWX0lPQ1RMX05JTlRFTkRPX1NFRURfV0VQS0VZCit0eXBlZGVmIHN0cnVjdCBfTklOVEVORE9fU0VFRF9XRVBLRVkKK3sKKwlVQ0hBUglzZWVkW05JTlRFTkRPX1NTSURfTklDS05BTUVfTE5dOworCVVDSEFSCXdlcGtleVsxNl07Ly91c2UgMTMgZm9yIDEwNCBiaXRzIHdlcCBrZXkKK30gUlRfTklOVEVORE9fU0VFRF9XRVBLRVksICpQUlRfTklOVEVORE9fU0VFRF9XRVBLRVk7CisjZW5kaWYgLy8gTklOVEVORE9fQVAgLy8KKworI2lmZGVmIExMVERfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgeworICAgIFVDSEFSICAgICAgICAgICBBZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisgICAgdW5zaWduZWQgc2hvcnQgIE1PUjsgICAgICAgIC8vIG1heGltdW0gb3BlcmF0aW9uYWwgcmF0ZQorICAgIFVDSEFSICAgICAgICAgICBwaHlNb2RlOworfSBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFIHsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgTnVtOworICAgIFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgICBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Cit9IFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUsICpQUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRTsKKyNlbmRpZiAvLyBMTFREX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLy9ydDI4NjAsIGthdGh5IDIwMDctMDExOAorLy8gc3RydWN0dXJlIGZvciBETFMKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTX1VJIHsKKwlVU0hPUlQJCQkJCQlUaW1lT3V0OwkJLy8gdW5pdDogc2Vjb25kICwgc2V0IGJ5IFVJCisJVVNIT1JUCQkJCQkJQ291bnREb3duVGltZXI7CS8vIHVuaXQ6IHNlY29uZCAsIHVzZWQgYnkgZHJpdmVyIG9ubHkKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJTWFjQWRkcjsJCS8vIHNldCBieSBVSQorCVVDSEFSCQkJCQkJU3RhdHVzOwkJCS8vIDA6IG5vbmUgLCAxOiB3YWl0IFNUQWtleSwgMjogZmluaXNoIERMUyBzZXR1cCAsIHNldCBieSBkcml2ZXIgb25seQorCUJPT0xFQU4JCQkJCQlWYWxpZDsJCQkvLyAxOiB2YWxpZCAsIDA6IGludmFsaWQgLCBzZXQgYnkgVUksIHVzZSB0byBzZXR1cCBvciB0ZWFyIGRvd24gRExTIGxpbmsKK30gUlRfODAyXzExX0RMU19VSSwgKlBSVF84MDJfMTFfRExTX1VJOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMU19JTkZPIHsKKwlSVF84MDJfMTFfRExTX1VJCUVudHJ5W01BWF9OVU1CRVJfT0ZfRExTX0VOVFJZXTsKKwlVQ0hBUgkJCQludW07Cit9IFJUXzgwMl8xMV9ETFNfSU5GTywgKlBSVF84MDJfMTFfRExTX0lORk87CisKK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX0RMU19NT0RFIHsKKyAgICBETFNfTk9ORSwKKyAgICBETFNfV0FJVF9LRVksCisgICAgRExTX0ZJTklTSAorfSBSVF84MDJfMTFfRExTX01PREU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZGVmaW5lCVJUX0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxCisjZGVmaW5lCVJUX0RJU0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgMHgwMTAyCisjZGVmaW5lCVJUX1JFUUlFX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAzCisjZGVmaW5lCVJUX1JFU1BJRV9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0CisjZGVmaW5lCVJUX0FTU09DSU5GT19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgMHgwMTA1CisjZGVmaW5lIFJUX1BNS0lEQ0FORF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA2CisjZGVmaW5lIFJUX0lOVEVSRkFDRV9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA3CisjZGVmaW5lIFJUX0lOVEVSRkFDRV9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA4CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiAxMjgKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRF9DTElFTlRfTU9ERQoreworICAgUnQ4MDJfMTFfRF9Ob25lLAorICAgUnQ4MDJfMTFfRF9GbGV4aWJsZSwKKyAgIFJ0ODAyXzExX0RfU3RyaWN0LAorfSBSVF84MDJfMTFfRF9DTElFTlRfTU9ERSwgKlBSVF84MDJfMTFfRF9DTElFTlRfTU9ERTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0NIQU5ORUxfTElTVF9JTkZPCit7CisJVUNIQVIgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKKwlVQ0hBUiBDaGFubmVsTGlzdE51bTsgLy8gbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXQorfSBSVF9DSEFOTkVMX0xJU1RfSU5GTywgKlBSVF9DSEFOTkVMX0xJU1RfSU5GTzsKKworLy8gV1NDIGNvbmZpZ3VyZWQgY3JlZGVudGlhbAordHlwZWRlZglzdHJ1Y3QJX1dTQ19DUkVERU5USUFMCit7CisJTkRJU184MDJfMTFfU1NJRAlTU0lEOwkJCQkvLyBtYW5kYXRvcnkKKwlVU0hPUlQJCQkJQXV0aFR5cGU7CQkJLy8gbWFuZGF0b3J5LCAxOiBvcGVuLCAyOiB3cGEtcHNrLCA0OiBzaGFyZWQsIDg6d3BhLCAweDEwOiB3cGEyLCAweDIwOiB3cGEyLXBzaworCVVTSE9SVAkJCQlFbmNyVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG5vbmUsIDI6IHdlcCwgNDogdGtpcCwgODogYWVzCisJVUNIQVIJCQkJS2V5WzY0XTsJCQkvLyBtYW5kYXRvcnksIE1heGltdW0gNjQgYnl0ZQorCVVTSE9SVAkJCQlLZXlMZW5ndGg7CisJVUNIQVIJCQkJTWFjQWRkcls2XTsJCQkvLyBtYW5kYXRvcnksIEFQIE1BQyBhZGRyZXNzCisJVUNIQVIJCQkJS2V5SW5kZXg7CQkJLy8gb3B0aW9uYWwsIGRlZmF1bHQgaXMgMQorCVVDSEFSCQkJCVJzdmRbM107CQkJLy8gTWFrZSBhbGlnbm1lbnQKK30JV1NDX0NSRURFTlRJQUwsICpQV1NDX0NSRURFTlRJQUw7CisKKy8vIFdTQyBjb25maWd1cmVkIHByb2ZpbGVzCit0eXBlZGVmCXN0cnVjdAlfV1NDX1BST0ZJTEUKK3sKKwlVSU5UCQkJUHJvZmlsZUNudDsKKwlXU0NfQ1JFREVOVElBTAlQcm9maWxlWzhdOwkJCQkvLyBTdXBwb3J0IHVwIHRvIDggcHJvZmlsZXMKK30JV1NDX1BST0ZJTEUsICpQV1NDX1BST0ZJTEU7CisKKworI2VuZGlmIC8vIF9PSURfSF8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyODcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhZjRiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyODcwLmgKQEAgLTAsMCArMSw3NjEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19SVDI4NzBfSF9fCisjZGVmaW5lIF9fUlQyODcwX0hfXworCisvL3VzYiBoZWFkZXIgZmlsZXMKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworLyogcnRtcF9kZWYuaCAqLworLy8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIEJVTEtBR0dSRV9aSVNFICAgICAgICAgIDEwMAorI2RlZmluZSBSVDI4WFhfRFJWREFUQV9TRVQoX2EpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldF9pbnRmZGF0YShfYSwgcEFkKTsKKyNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9wdXRfZGV2CisjZGVmaW5lIFJUVVNCX0FMTE9DX1VSQihpc28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfYWxsb2NfdXJiKGlzbywgR0ZQX0FUT01JQykKKyNkZWZpbmUgUlRVU0JfU1VCTUlUX1VSQihwVXJiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zdWJtaXRfdXJiKHBVcmIsIEdGUF9BVE9NSUMpCisjZGVmaW5lCVJUVVNCX1VSQl9BTExPQ19CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBEbWFfYWRkcikgICAgICAgICAgICAgICB1c2JfYnVmZmVyX2FsbG9jKHBVc2JfRGV2LCBCdWZTaXplLCBHRlBfQVRPTUlDLCBwRG1hX2FkZHIpCisjZGVmaW5lCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikgICB1c2JfYnVmZmVyX2ZyZWUocFVzYl9EZXYsIEJ1ZlNpemUsIHBUcmFuc2ZlckJ1ZiwgRG1hX2FkZHIpCisjZWxzZQorI2RlZmluZSBCVUxLQUdHUkVfWklTRSAgICAgICAgICA2MAorI2RlZmluZSBSVDI4WFhfRFJWREFUQV9TRVQoX2EpCisjZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFKGRldl9wKQorI2RlZmluZSBSVFVTQl9BTExPQ19VUkIoaXNvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2FsbG9jX3VyYihpc28pCisjZGVmaW5lIFJUVVNCX1NVQk1JVF9VUkIocFVyYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc3VibWl0X3VyYihwVXJiKQorI2RlZmluZSBSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBVc2JfRGV2LCBCdWZTaXplLCBwRG1hX2FkZHIpICAgICAgICAgICAgICAga21hbGxvYyhCdWZTaXplLCBHRlBfQVRPTUlDKQorI2RlZmluZQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBUcmFuc2ZlckJ1ZiwgRG1hX2FkZHIpICAga2ZyZWUocFRyYW5zZmVyQnVmKQorI2VuZGlmCisKKyNkZWZpbmUgUlhCVUxLQUdHUkVfWklTRSAgICAgICAgMTIKKyNkZWZpbmUgTUFYX1RYQlVMS19MSU1JVCAgICAgICAgKExPQ0FMX1RYQlVGX1NJWkUqKEJVTEtBR0dSRV9aSVNFLTEpKQorI2RlZmluZSBNQVhfVFhCVUxLX1NJWkUgICAgICAgICAoTE9DQUxfVFhCVUZfU0laRSpCVUxLQUdHUkVfWklTRSkKKyNkZWZpbmUgTUFYX1JYQlVMS19TSVpFICAgICAgICAgKExPQ0FMX1RYQlVGX1NJWkUqUlhCVUxLQUdHUkVfWklTRSkKKyNkZWZpbmUgTUFYX01MTUVfSEFORExFUl9NRU1PUlkgMjAKKyNkZWZpbmUJUkVUUllfTElNSVQgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQlVGRkVSX1NJWkUJCQkJMjQwMAkvLzIwNDgKKyNkZWZpbmUJVFhfUklORwkJCQkJMHhhCisjZGVmaW5lCVBSSU9fUklORwkJCQkweGMKKworCisvLyBGbGFncyBmb3IgQnVsa2ZsYWdzIGNvbnRyb2wgZm9yIGJ1bGsgb3V0IGRhdGEKKy8vCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBmUlRVU0JfQlVMS19PVVRfUlRTCQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfTUxNRQkJCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTAkJCQkweDAwMDEwMDAwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8yCQkJMHgwMDAyMDAwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMwkJCTB4MDAwNDAwMDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQJCQkweDAwMDgwMDAwCisKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX1BTUE9MTAkJCQkJMHgwMDAwMDAyMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18yCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18zCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR180CQkJCTB4MDAwMDAyMDAKKworI2lmZGVmIFJBTElOS19BVEUKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFCQkJCTB4MDAxMDAwMDAKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNkZWZpbmUgUlQyODcwX1VTQl9ERVZJQ0VTCVwKK3sJXAorCXtVU0JfREVWSUNFKDB4MTQ4RiwweDI3NzApfSwgLyogUmFsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNDhGLDB4Mjg3MCl9LCAvKiBSYWxpbmsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0OEYsMHgzMDcwKX0sIC8qIFJhbGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MEIwNSwweDE3MzEpfSwgLyogQXN1cyAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDBCMDUsMHgxNzMyKX0sIC8qIEFzdXMgKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgwQjA1LDB4MTc0Mil9LCAvKiBBc3VzICovCQkJXAorCXtVU0JfREVWSUNFKDB4MERGNiwweDAwMTcpfSwgLyogU2l0ZWNvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MERGNiwweDAwMkIpfSwgLyogU2l0ZWNvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MERGNiwweDAwMkMpfSwgLyogU2l0ZWNvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MERGNiwweDAwMkQpfSwgLyogU2l0ZWNvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMDYpfSwgLyogQ29uY2VwdHJvbmljICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MyOCl9LCAvKiBDb25jZXB0cm9uaWMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDIwMTksMHhFRDA2KX0sIC8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiAqLwkJXAorCXtVU0JfREVWSUNFKDB4MjAxOSwweEFCMjUpfSwgLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuIFJUMzA3MCAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdEMSwweDNDMDkpfSwgLyogRC1MaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0QxLDB4M0MxMSl9LCAvKiBELUxpbmsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0QjIsMHgzQzA3KX0sIC8qIEFMICovCQkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMTIpfSwgLyogQUwgKi8gICAgICAgICAgIFwKKwl7VVNCX0RFVklDRSgweDA1MEQsMHg4MDUzKX0sIC8qIEJlbGtpbiAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMjMpfSwgLyogQWlybGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMjcpfSwgLyogQWlybGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdBQSwweDAwMkYpfSwgLyogQ29yZWdhICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0FBLDB4MDAzQyl9LCAvKiBDb3JlZ2EgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3QUEsMHgwMDNGKX0sIC8qIENvcmVnYSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MThDNSwweDAwMTIpfSwgLyogQ29yZWdhICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxMDQ0LDB4ODAwQil9LCAvKiBHaWdhYnl0ZSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTVBOSwweDAwMDYpfSwgLyogU3BhcmtsYW4gKi8JCVwKKwl7VVNCX0RFVklDRSgweDA4M0EsMHhCNTIyKX0sIC8qIFNNQyAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDA4M0EsMHhBNjE4KX0sIC8qIFNNQyAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDA4M0EsMHg3NTIyKX0sIC8qIEFyY2FkeWFuICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwQ0RFLDB4MDAyMil9LCAvKiBaQ09NICovCQkJXAorCXtVU0JfREVWSUNFKDB4MDU4NiwweDM0MTYpfSwgLyogWnl4ZWwgKi8JCVwKKwl7VVNCX0RFVklDRSgweDBDREUsMHgwMDI1KX0sIC8qIFp5eGVsICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNzQwLDB4OTcwMSl9LCAvKiBFbkdlbml1cyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTc0MCwweDk3MDIpfSwgLyogRW5HZW5pdXMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA0NzEsMHgyMDBmKX0sIC8qIFBoaWxpcHMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0QjIsMHgzQzI1KX0sIC8qIERyYXl0ZWsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDEzRDMsMHgzMjQ3KX0sIC8qIEF6dXJlV2F2ZSAqLwlcCisJe1VTQl9ERVZJQ0UoMHgwODNBLDB4NjYxOCl9LCAvKiBBY2N0b24gKi8JCVwKKwl7VVNCX0RFVklDRSgweDE1YzUsMHgwMDA4KX0sIC8qIEFtaXQgKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgwRTY2LDB4MDAwMSl9LCAvKiBIYXdraW5nICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwRTY2LDB4MDAwMyl9LCAvKiBIYXdraW5nICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxMjlCLDB4MTgyOCl9LCAvKiBTaWVtZW5zICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNTdFLDB4MzAwRSl9LAkvKiBVLU1lZGlhICovCVwKKwl7VVNCX0RFVklDRSgweDA1MGQsMHg4MDVjKX0sCQkJCQlcCisJe1VTQl9ERVZJQ0UoMHgxNDgyLDB4M0MwOSl9LCAvKiBBYm9jb20qLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMDkpfSwgLyogQWxwaGEgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA0RTgsMHgyMDE4KX0sIC8qIHNhbXN1bmcgKi8gIAlcCisJe1VTQl9ERVZJQ0UoMHgwN0I4LDB4MzA3MCl9LCAvKiBBYm9Db20gKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3QjgsMHgzMDcxKX0sIC8qIEFib0NvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdCOCwweDI4NzApfSwgLyogQWJvQ29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0I4LDB4Mjc3MCl9LCAvKiBBYm9Db20gKi8JCVwKKwl7VVNCX0RFVklDRSgweDczOTIsMHg3NzExKX0sIC8qIEVkaW1heCAqLwkJXAorCXtVU0JfREVWSUNFKDB4NUE1NywweDAyODApfSwgLyogWmlud2VsbCAqLwkJXAorCXtVU0JfREVWSUNFKDB4NUE1NywweDAyODIpfSwgLyogWmlud2VsbCAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDc4OSwweDAxNjIpfSwgLyogTG9naXRlYyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDc4OSwweDAxNjMpfSwgLyogTG9naXRlYyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDc4OSwweDAxNjQpfSwgLyogTG9naXRlYyAqLwkJXAorCXsgfS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZQlGUkVFX0hUVFhfUklORyhfcCwgX2IsIF90KQkJCVwKK3sJCQkJCQkJCQkJXAorCWlmICgoX3QpLT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSAoX3QpLT5DdXJXcml0ZVBvc2l0aW9uKQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkoX3QpLT5iUmluZ0VtcHR5ID0gVFJVRTsJCQlcCisJfQkJCQkJCQkJCQkJCQkJCQkJXAorCS8qTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCYoX3ApLT5UeENvdW50KTsgKi9cCit9CisKKy8vCisvLyBSWElORk8gYXBwZW5kcyBhdCB0aGUgZW5kIG9mIGVhY2ggcnggcGFja2V0LgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYSU5GT19TVFJVQyB7CisJVUlOVDMyCQlQbGNwU2lnbmFsOjEyOworCVVJTlQzMgkJTGFzdEFNU0RVOjE7CisJVUlOVDMyCQlDaXBoZXJBbGc6MTsKKwlVSU5UMzIJCVBsY3BSc3NpbDoxOworCVVJTlQzMgkJRGVjcnlwdGVkOjE7CisJVUlOVDMyCQlBTVBEVToxOwkJLy8gVG8gYmUgbW92ZWQKKwlVSU5UMzIJCUwyUEFEOjE7CisJVUlOVDMyCQlSU1NJOjE7CisJVUlOVDMyCQlIVEM6MTsKKwlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuCisJVUlOVDMyCQlDaXBoZXJFcnI6MjsgICAgICAgIC8vIDA6IGRlY3J5cHRpb24gb2theSwgMTpJQ1YgZXJyb3IsIDI6TUlDIGVycm9yLCAzOktFWSBub3QgdmFsaWQKKwlVSU5UMzIJCUNyYzoxOyAgICAgICAgICAgICAgLy8gMTogQ1JDIGVycm9yCisJVUlOVDMyCQlNeUJzczoxOyAgCS8vIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRAorCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCisJVUlOVDMyCQlNY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBtdWx0aWNhc3QgZnJhbWUKKwlVSU5UMzIJCVUyTToxOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCisJVUlOVDMyCQlGUkFHOjE7CisJVUlOVDMyCQlOVUxMREFUQToxOworCVVJTlQzMgkJREFUQToxOworCVVJTlQzMgkJQkE6MTsKK30JUlhJTkZPX1NUUlVDLCAqUFJYSU5GT19TVFJVQywgUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhJTkZPX1NUUlVDIHsKKwlVSU5UMzIJCUJBOjE7CisJVUlOVDMyCQlEQVRBOjE7CisJVUlOVDMyCQlOVUxMREFUQToxOworCVVJTlQzMgkJRlJBRzoxOworCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQorCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCisJVUlOVDMyCQlNeUJzczoxOyAgCS8vIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRAorCVVJTlQzMgkJQ3JjOjE7ICAgICAgICAgICAgICAvLyAxOiBDUkMgZXJyb3IKKwlVSU5UMzIJCUNpcGhlckVycjoyOyAgICAgICAgLy8gMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZAorCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4KKwlVSU5UMzIJCUhUQzoxOworCVVJTlQzMgkJUlNTSToxOworCVVJTlQzMgkJTDJQQUQ6MTsKKwlVSU5UMzIJCUFNUERVOjE7CQkvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJRGVjcnlwdGVkOjE7CisJVUlOVDMyCQlQbGNwUnNzaWw6MTsKKwlVSU5UMzIJCUNpcGhlckFsZzoxOworCVVJTlQzMgkJTGFzdEFNU0RVOjE7CisJVUlOVDMyCQlQbGNwU2lnbmFsOjEyOworfQlSWElORk9fU1RSVUMsICpQUlhJTkZPX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gVFhJTkZPCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CV9UWElORk9fU1RSVUMgeworCS8vIFdvcmQJMAorCVVJTlQzMgkJVVNCRE1BVHhidXJzdDoxOy8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlLiBGb3JjZSBVU0IgRE1BIHRyYW5zbWl0IGZyYW1lIGZyb20gY3VycmVudCBzZWxlY3RlZCBlbmRwb2ludAorCVVJTlQzMgkJVVNCRE1BTmV4dFZMRDoxOwkvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZWdhdGlvbiwgTmV4dFZhbGlkCisJVUlOVDMyCQlyc3YyOjI7ICAvLyBTb2Z0d2FyZSB1c2UuCisJVUlOVDMyCQlTd1VzZUxhc3RSb3VuZDoxOyAvLyBTb2Z0d2FyZSB1c2UuCisJVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQorCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCisJVUlOVDMyCQlyc3Y6ODsKKwlVSU5UMzIJCVVTQkRNQVR4UGt0TGVuOjE2OwkvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZWdhdGlvbiwgIFRvdGFsIGJ5dGUgY291bnRzIG9mIGFsbCBzdWItZnJhbWUuCit9CVRYSU5GT19TVFJVQywgKlBUWElORk9fU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJX1RYSU5GT19TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlVU0JETUFUeFBrdExlbjoxNjsJLy91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmVnYXRpb24sICBUb3RhbCBieXRlIGNvdW50cyBvZiBhbGwgc3ViLWZyYW1lLgorCVVJTlQzMgkJcnN2Ojg7CisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlTd1VzZUxhc3RSb3VuZDoxOyAvLyBTb2Z0d2FyZSB1c2UuCisJVUlOVDMyCQlyc3YyOjI7ICAvLyBTb2Z0d2FyZSB1c2UuCisJVUlOVDMyCQlVU0JETUFOZXh0VkxEOjE7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCBOZXh0VmFsaWQKKwlVSU5UMzIJCVVTQkRNQVR4YnVyc3Q6MTsvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZS4gRm9yY2UgVVNCIERNQSB0cmFuc21pdCBmcmFtZSBmcm9tIGN1cnJlbnQgc2VsZWN0ZWQgZW5kcG9pbnQKK30JVFhJTkZPX1NUUlVDLCAqUFRYSU5GT19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIFRYSU5GT19TSVpFCQkJCTQKKyNkZWZpbmUgUlhJTkZPX1NJWkUJCQkJNAorI2RlZmluZSBUWFBBRERJTkdfU0laRQkJCTExCisKKy8vCisvLyBNYW5hZ2VtZW50IHJpbmcgYnVmZmVyIGZvcm1hdAorLy8KK3R5cGVkZWYJc3RydWN0CV9NR01UX1NUUlVDCXsKKwlCT09MRUFOCQlWYWxpZDsKKwlQVUNIQVIJCXBCdWZmZXI7CisJVUxPTkcJCUxlbmd0aDsKK30JTUdNVF9TVFJVQywgKlBNR01UX1NUUlVDOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEVFUFJPTSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgb2Zmc2V0LCB2YXIpCQkJCQlcCisJZG8gewkJCQkJCQkJCQkJCQkJXAorCQlSVFVTQlJlYWRFRVBST00ocEFkLCBvZmZzZXQsIChQVUNIQVIpJih2YXIpLCAyKTsJCVwKKwkJdmFyID0gbGUyY3B1MTYodmFyKTsJCQkJCQkJCQlcCisJfXdoaWxlKDApCisKKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YXIpCQkJCQlcCisJZG97CQkJCQkJCQkJCQkJCQkJXAorCQlVU0hPUlQgX3RtcFZhcjsJCQkJCQkJCQkJCVwKKwkJX3RtcFZhciA9IGNwdTJsZTE2KHZhcik7CQkJCQkJCQlcCisJCVJUVVNCV3JpdGVFRVBST00ocEFkLCBvZmZzZXQsIChQVUNIQVIpJihfdG1wVmFyKSwgMik7CVwKKwl9d2hpbGUoMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVEFTSy9USFJFQUQgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cykJCVwKKwlTdGF0dXMgPSBDcmVhdGVUaHJlYWRzKG5ldF9kZXYpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEZyaW13YXJlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiAwCisjZGVmaW5lIFJUMjhYWF9GSVJNVURfSU5JVChwQWQpCQlcCisJewlVSU5UMzIJTWFjUmVnOwkJCQlcCisJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTUFDX0NTUjAsICZNYWNSZWcpOyB9CisKKyNkZWZpbmUgUlQyOFhYX0ZJUk1VRF9FTkQocEFkKQlcCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDE0LCAweGZmZmZmZmZmKTsJXAorCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIDB4NzAxYywgMHhmZmZmZmZmZik7CVwKKwlSVFVTQkZpcm13YXJlUnVuKHBBZCk7CisjZWxzZQorI2RlZmluZSBSVDI4WFhfV1JJVEVfRklSTVdBUkUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCQlcCisJUlRVU0JGaXJtd2FyZVdyaXRlKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFRYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCVwKKwkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJCVwKKwkJCQlpZiAocEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdKQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQlcCisJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7XAorCQkJCQlwcmludGsoIkRlUXVldWVSdW5uaW5nWyVkXT0gVFJVRSFcbiIsIFF1ZUlkeCk7CQlcCisJCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJXAorCQkJCX0JCQkJCQkJCQkJCQkJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQlcCisJCQkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbUXVlSWR4XSA9IFRSVUU7CQkJCQlcCisJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7XAorCQkJCX0JCQkJCQkJCQkJCQkJCVwKKwkJCX0KKyNkZWZpbmUgUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwkJXAorCQkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbUXVlSWR4XSA9IEZBTFNFOwkJCQkJXAorCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CVwKKwkJCX13aGlsZSgwKQorCisKKyNkZWZpbmUJUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBmcmVlTnVtLCBwUGFja2V0KSBcCisJCShSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdChwQWQsIHBUeEJsay0+UXVlSWR4LCAocFR4QmxrLT5Ub3RhbEZyYW1lTGVuICsgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpKSA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCisjZGVmaW5lIFJUMjhYWF9SRUxFQVNFX0RFU0NfUkVTT1VSQ0UocEFkLCBRdWVJZHgpCQkJXAorCQlkb3t9d2hpbGUoMCkKKworI2RlZmluZSBORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhfcEFkLCBfUXVlSWR4LCBfZnJlZU51bSwgX1R4RnJhbWVUeXBlKSAJCVwKKwkJKChfVHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKSAmJiAoUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKF9wQWQsIF9RdWVJZHgpKSkKKworCisKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgJCVwKKwkJKGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CVwKKwkJIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQgfCBcCisJCSBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8IGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTKQorCisKKyNkZWZpbmUgSEFMX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShwQWQsIHBUeEJsayxiSXNMYXN0LCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKKwkJCVJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFVTQl9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsayxmcmFtZU51bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkJXAorCQkJUnRtcFVTQl9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgVHhJZHgpCisKKyNkZWZpbmUgSEFMX0xhc3RUeElkeChwQWQsIFF1ZUlkeCxUeElkeCkgXAorCQkJLypSdG1wVVNCRGF0YUxhc3RUeElkeChwQWQsIFF1ZUlkeCxUeElkeCkqLworCisjZGVmaW5lIEhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIFF1ZUlkeCkJXAorCQkJUnRtcFVTQkRhdGFLaWNrT3V0KHBBZCwgcFR4QmxrLCBRdWVJZHgpCisKKworI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pCVwKKwkJCVJ0bXBVU0JNZ210S2lja091dChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pCisKKyNkZWZpbmUgSEFMX0tpY2tPdXROdWxsRnJhbWVUeChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQlcCisJCQlSdG1wVVNCTnVsbEZyYW1lS2lja091dChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQorCisjZGVmaW5lIFJUTVBfUEtUX1RBSUxfUEFERElORyAJMTEgLy8gMyhtYXggNCBieXRlIHBhZGRpbmcpICsgNCAobGFzdCBwYWNrZXQgcGFkZGluZykgKyA0IChNYXhCdWxrT3V0c2l6ZSBhbGlnbiBwYWRkaW5nKQorCitleHRlcm4gVUNIQVIgRXBUb1F1ZXVlWzZdOworCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkgCShfUXVlSWR4KSAvLyhfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHgpCisjZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkgCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vI2RlZmluZSBSVDI4WFhfUlhfRVJST1JfQ0hFQ0sJCQkJUlRNUENoZWNrUnhXSQorCisjaWYgMAorI2RlZmluZSBSVDI4WFhfUkNWX0lOSVQocEFkKQkJCQkJXAorCXBBZC0+VHJhbnNmZXJCdWZmZXJMZW5ndGggPSAwOwkJCQlcCisJcEFkLT5SZWFkUG9zaXRpb24gPSAwOwkJCQkJCVwKKwlwQWQtPnBDdXJyUnhDb250ZXh0ID0gTlVMTDsKKyNlbmRpZgorCisjZGVmaW5lIFJUMjhYWF9SVl9BTExfQlVGX0VORChiQnVsa1JlY2VpdmUpCQlcCisJLyogV2UgcmV0dXJuIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQgc28gdGhhdCB0aGUgY29tcGxldGlvbiAqLwlcCisJLyogcm91dGluZSAoSW9mQ29tcGxldGVSZXF1ZXN0KSB3aWxsIHN0b3Agd29ya2luZyBvbiB0aGUgaXJwLiAqLwkJXAorCWlmIChiQnVsa1JlY2VpdmUgPT0gVFJVRSkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEFTSUMgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIDAKKyNkZWZpbmUgUlQyOFhYX0RNQV9XUklURV9JTklUKEdsb0NmZykJCQlcCisJewlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsJXAorCQlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAxOwkJCVwKKwkJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsgfQorCisjZGVmaW5lIFJUMjhYWF9ETUFfUE9TVF9XUklURShfcEFkKQkJCQlcCisJZG97CVVTQl9ETUFfQ0ZHX1NUUlVDCVVzYkNmZzsJCQkJXAorCQlVc2JDZmcud29yZCA9IDA7CQkJCQkJXAorCQkvKiBmb3IgbGFzdCBwYWNrZXQsIFBCRiBtaWdodCB1c2UgbW9yZSB0aGFuIGxpbWl0ZWQsIHNvIG1pbnVzIDIgdG8gcHJldmVudCBmcm9tIGVycm9yICovIFwKKwkJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ0xtdCA9IChNQVhfUlhCVUxLX1NJWkUgLzEwMjQpLTM7CVwKKwkJVXNiQ2ZnLmZpZWxkLnBoeWNsZWFyID0gMDsJCQkJCQkJCVwKKwkJLyogdXNiIHZlcnNpb24gaXMgMS4xLGRvIG5vdCB1c2UgYnVsayBpbiBhZ2dyZWdhdGlvbiAqLwlcCisJCWlmIChfcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID09IDUxMikJCQkJCVwKKwkJCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dFbiA9IDE7CQkJCQkJXAorCQlVc2JDZmcuZmllbGQuUnhCdWxrRW4gPSAxOwkJCQkJCQkJXAorCQlVc2JDZmcuZmllbGQuVHhCdWxrRW4gPSAxOwkJCQkJCQkJXAorCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnVE91dCA9IDB4ODA7IC8qIDIwMDYtMTAtMTggKi8JCVwKKwkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKF9wQWQsIFVTQl9ETUFfQ0ZHLCBVc2JDZmcud29yZCk7IAlcCisJfXdoaWxlKDApCisjZW5kaWYKKworLy8gcmVzZXQgTUFDIG9mIGEgc3RhdGlvbiBlbnRyeSB0byAweEZGRkZGRkZGRkZGRgorI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIFdjaWQpCQkJCQlcCisJewlSVF9TRVRfQVNJQ19XQ0lECVNldEFzaWNXY2lkOwkJCQkJCVwKKwkJU2V0QXNpY1djaWQuV0NJRCA9IFdjaWQ7CQkJCQkJCQlcCisJCVNldEFzaWNXY2lkLlNldFRpZCA9IDB4ZmZmZmZmZmY7CQkJCQkJXAorCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAweGZmZmZmZmZmOwkJCQkJCVwKKwkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgCVwKKwkJCQkmU2V0QXNpY1djaWQsIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEKSk7CX0KKworLy8gYWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfQUREKHBBZCwgcEVudHJ5KQkJCQkJCQlcCisJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlksIAlcCisJCQkJCQkJcEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisKKy8vIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQworLy8geWV0IGltcGxlbWVudAorI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX0tFWV9ERUwocEFkLCBCc3NJZHgsIFdjaWQpCisKKy8vIGFkZCBDbGllbnQgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW50byBBU0lDIFdDSUQgdGFibGUgYW5kIElWRUlWIHRhYmxlCisjZGVmaW5lIFJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCQkJCQlcCisJewlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHBFbnRyeS0+QWlkKTsJCQkJCQkJCVwKKwkJaWYgKHBFbnRyeS0+QWlkID49IDEpIHsJCQkJCQkJCQkJCQkJCVwKKwkJCVJUX1NFVF9BU0lDX1dDSURfQVRUUkkJU2V0QXNpY1djaWRBdHRyaTsJCQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkQXR0cmkuV0NJRCA9IHBFbnRyeS0+QWlkOwkJCQkJCQkJCVwKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJgkJCQlcCisJCQkJKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpKQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGc7CVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCisJCQllbHNlIGlmIChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGc7CVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCisJCQllbHNlIFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gMDsJCQkJCQkJCQkJXAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYWlkIGNpcGhlciA9ICVsZFxuIixTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikpOyAgICAgICBcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiwgCQkJXAorCQkJCQkJCSZTZXRBc2ljV2NpZEF0dHJpLCBzaXplb2YoUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSkpOyB9IH0KKworLy8gSW5zZXJ0IHRoZSBCQSBiaXRtYXAgdG8gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKKyNkZWZpbmUgUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMoX3BBZCwgX0FpZCwgX1RJRCkJCQkJCVwKKwkJZG97CQkJCQkJCQkJCQkJCQkJCVwKKwkJCVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7CQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLldDSUQgPSAoX0FpZCk7CQkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuU2V0VGlkID0gKDB4MTAwMDA8PChfVElEKSk7CQkJCQkJXAorCQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gMHhmZmZmZmZmZjsJCQkJCQkJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoKF9wQWQpLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgJlNldEFzaWNXY2lkLCBzaXplb2YoUlRfU0VUX0FTSUNfV0NJRCkpOwlcCisJCX13aGlsZSgwKQorCisvLyBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5CisjZGVmaW5lIFJUMjhYWF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMoX3BBZCwgX1djaWQsIF9USUQpCQkJCVwKKwkJZG97CQkJCQkJCQkJCQkJCQkJCVwKKwkJCVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7CQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLldDSUQgPSAoX1djaWQpOwkJCQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLlNldFRpZCA9ICgweGZmZmZmZmZmKTsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gKDB4MTAwMDA8PChfVElEKSApOwkJCQkJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoKF9wQWQpLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgJlNldEFzaWNXY2lkLCBzaXplb2YoUlRfU0VUX0FTSUNfV0NJRCkpOwlcCisJCX13aGlsZSgwKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFBDSS9VU0IgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCkJCQlcCisJKChQT1NfQ09PS0lFKWhhbmRsZSktPnBVc2JfRGV2ID0gZGV2X3A7CisKKy8vIG5vIHVzZQorI2RlZmluZSBSVDI4WFhfVU5NQVAoKQorI2RlZmluZSBSVDI4WFhfSVJRX1JFUVVFU1QobmV0X2RldikKKyNkZWZpbmUgUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpCisjZGVmaW5lIFJUMjhYWF9JUlFfSU5JVChwQWQpCisjZGVmaW5lIFJUMjhYWF9JUlFfRU5BQkxFKHBBZCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBNTE1FIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX01MTUVfSEFORExFUihwQWQpCQkJUlRVU0JNbG1lVXAocEFkKQorCisjZGVmaW5lIFJUMjhYWF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKQkJCQkJCQkJXAorCXsJaWYgKChwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbyA9PSBUUlVFKSAmJiAJCQkJCVwKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgkJXAorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKSB7CVwKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX0NIRUNLX0dQSU8sIE5VTEwsIDApOyB9IH0KKworI2RlZmluZSBSVDI4WFhfTUxNRV9TVEFfUVVJQ0tfUlNQX1dBS0VfVVAocEFkKQlcCisJewlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9RS0VSSU9ESUNfRVhFQ1VULCBOVUxMLCAwKTsJXAorCQlSVFVTQk1sbWVVcChwQWQpOyB9CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWQpCVwKKwkJICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVTRVRfQ09ORiwgMCwgTlVMTCk7CVwKKwkJICAgICAgICBSVFVTQk1sbWVVcChwQWQpOworCisjZGVmaW5lIFJUMjhYWF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpCQlcCisJewlSVFVTQkVucXVldWVJbnRlcm5hbENtZChfcEFkLCBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRSwgX3BFbnRyeSwgc2l6ZW9mKE1BQ19UQUJMRV9FTlRSWSkpOwlcCisJCVJUVVNCTWxtZVVwKF9wQWQpOwkJCQkJCQkJCVwKKwl9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUG93ZXIgU2F2ZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9QU19QT0xMX0VOUVVFVUUocEFkKQkJCQkJCVwKKwl7CVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUFNQT0xMKTsJXAorCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7IH0KKworI2RlZmluZSBSVDI4eHhfQ0hJUF9OQU1FICAgICAgICAgICAgIlJUMjg3MCIKKyNkZWZpbmUgVVNCX0NZQ19DRkcgICAgICAgICAgICAgICAgIDB4MDJhNAorI2RlZmluZSBTVEFUVVNfU1VDQ0VTUwkJCQkweDAwCisjZGVmaW5lIFNUQVRVU19VTlNVQ0NFU1NGVUwgCQkweDAxCisjZGVmaW5lIE5UX1NVQ0NFU1Moc3RhdHVzKQkJCSgoKHN0YXR1cykgPiAwKSA/ICgxKTooMCkpCisjZGVmaW5lIEludGVybG9ja2VkSW5jcmVtZW50IAkgCWF0b21pY19pbmMKKyNkZWZpbmUgTmRpc0ludGVybG9ja2VkSW5jcmVtZW50IAlhdG9taWNfaW5jCisjZGVmaW5lIEludGVybG9ja2VkRGVjcmVtZW50CQlhdG9taWNfZGVjCisjZGVmaW5lIE5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCAJYXRvbWljX2RlYworI2RlZmluZSBJbnRlcmxvY2tlZEV4Y2hhbmdlCQkJYXRvbWljX3NldAorLy8jZGVmaW5lIE5kaXNNU2VuZENvbXBsZXRlCQkJUlRNUF9TZW5kQ29tcGxldGUKKyNkZWZpbmUgTmRpc01DYW5jZWxUaW1lcgkJCVJUTVBDYW5jZWxUaW1lcgorI2RlZmluZSBOZGlzQWxsb2NNZW1vcnkoX3B0ciwgX3NpemUsIF9mbGFnKQlcCisJCQkJCQkJCQlkb3tfcHRyID0ga21hbGxvYygoX3NpemUpLChfZmxhZykpO313aGlsZSgwKQorI2RlZmluZSBOZGlzRnJlZU1lbW9yeShhLCBiLCBjKSAJa2ZyZWUoKGEpKQorI2RlZmluZSBOZGlzTVNsZWVwCQkJCQlSVE1QdXNlY0RlbGF5CQkvKiB1bml0OiBtaWNyb3NlY29uZCAqLworCisKKyNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VUCQkwCisjZGVmaW5lIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOCQkwCisjZGVmaW5lIFVTQkRfU0hPUlRfVFJBTlNGRVJfT0sJCQkwCisjZGVmaW5lIFBVUkIJCQlwdXJiYl90CisKKyNkZWZpbmUgUlRVU0JfRlJFRV9VUkIocFVyYikJdXNiX2ZyZWVfdXJiKHBVcmIpCisKKy8vI3VuZGVmIE1sbWVBbGxvY2F0ZU1lbW9yeQorLy8jdW5kZWYgTWxtZUZyZWVNZW1vcnkKKwordHlwZWRlZiBpbnQJCQkJTlRTVEFUVVM7Cit0eXBlZGVmIHN0cnVjdCB1c2JfZGV2aWNlCSogUFVTQl9ERVY7CisKKy8qIE1BQ1JPIGZvciBsaW51eCB1c2IgKi8KK3R5cGVkZWYgc3RydWN0IHVyYiAqcHVyYmJfdDsKK3R5cGVkZWYgc3RydWN0IHVzYl9jdHJscmVxdWVzdCBkZXZjdHJscmVxdWVzdDsKKyNkZWZpbmUgUElSUAkJUFZPSUQKKyNkZWZpbmUgUE1ETAkJUFZPSUQKKyNkZWZpbmUgTkRJU19PSUQJVUlOVAorI2lmbmRlZiBVU0JfU1RfTk9FUlJPUgorI2RlZmluZSBVU0JfU1RfTk9FUlJPUiAgICAgMAorI2VuZGlmCisKKy8vIHZlbmRvci1zcGVjaWZpYyBjb250cm9sIG9wZXJhdGlvbnMKKyNkZWZpbmUgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMgKCAoMTAwICogSFopIC8gMTAwMCkKKyNkZWZpbmUgVU5MSU5LX1RJTUVPVVRfTVMJCTMKKworLyogdW5saW5rIHVyYgkqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsNykKKyNkZWZpbmUgUlRVU0JfVU5MSU5LX1VSQihwVXJiKQkJdXNiX2tpbGxfdXJiKHBVcmIpCisjZWxzZQorI2RlZmluZSBSVFVTQl9VTkxJTktfVVJCKHBVcmIpCQl1c2JfdW5saW5rX3VyYihwVXJiKQorI2VuZGlmCisKKy8vIFByb3RvdHlwZXMgb2YgY29tcGxldGlvbiBmdW51Yy4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmIsIHB0X3JlZ3MpICAgIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShwdXJiKQorI2RlZmluZSBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUocFVyYiwgcHRfcmVncykgICAgUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlKHBVcmIpCisjZGVmaW5lIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHBVcmIsIHB0X3JlZ3MpICAgICBSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZShwVXJiKQorI2RlZmluZSBSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKHBVcmIsIHB0X3JlZ3MpICAgICAgUlRVU0JCdWxrT3V0UlRTRnJhbWVDb21wbGV0ZShwVXJiKQorI2RlZmluZSBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwVXJiLCBwdF9yZWdzKSAgICAgICAgUlRVU0JCdWxrT3V0UHNQb2xsQ29tcGxldGUocFVyYikKKyNkZWZpbmUgUlRVU0JCdWxrUnhDb21wbGV0ZShwVXJiLCBwdF9yZWdzKSAgICAgICAgICAgICAgIFJUVVNCQnVsa1J4Q29tcGxldGUocFVyYikKKyNlbmRpZgorCisKK1ZPSUQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmJiX3QgcHVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworVk9JRCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworVk9JRCBSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKK1ZPSUQgUlRVU0JCdWxrUnhDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKKworCisjZGVmaW5lIFJUVVNCTWxtZVVwKHBBZCkJICAgICAgICBcCit7CQkJCQkJCQkgICAgXAorCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsJXAorCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5NTE1FVGhyX3BpZCkJCSAgICBcCisgICAgICAgIHVwKCYocEFkLT5tbG1lX3NlbWFwaG9yZSkpOyBcCit9CisKKyNkZWZpbmUgUlRVU0JDTURVcChwQWQpCSAgICAgICAgICAgICAgICBcCit7CQkJCQkJCQkJICAgIFwKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CVwKKwlDSEVDS19QSURfTEVHQUxJVFkocE9iai0+UlRVU0JDbWRUaHJfcGlkKQkgICAgXAorCSAgICB1cCgmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7IFwKK30KKworCitzdGF0aWMgaW5saW5lIE5ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU1lbW9yeSgKKwlPVVQgUFZPSUQgKnB0ciwKKwlJTiBzaXplX3Qgc2l6ZSkKK3sKKwkqcHRyID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZigqcHRyKQorCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwllbHNlCisJCXJldHVybiBORElTX1NUQVRVU19SRVNPVVJDRVM7Cit9CisKKy8qIHJ0bXAuaCAqLworI2RlZmluZQlCRUFDT05fUklOR19TSVpFICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCAgICAgICAweDQwCisjZGVmaW5lIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiAgICAgICAgMHhjMAorI2RlZmluZSBJTlRFUkZBQ0VfVkVORE9SX1JFUVVFU1RfT1VUICAgIDB4NDEKKyNkZWZpbmUgSU5URVJGQUNFX1ZFTkRPUl9SRVFVRVNUX0lOICAgICAweGMxCisjZGVmaW5lIE1HTVRQSVBFSURYCQkJCQkJMAkvLyBFUDYgaXMgaGlnaGVzdCBwcmlvcml0eQorCisjZGVmaW5lIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHCQkJCTB4ODAKKworI2RlZmluZSBSVFVTQl9TRVRfQlVMS19GTEFHKF9NLCBfRikJCQkJKChfTSktPkJ1bGtGbGFncyB8PSAoX0YpKQorI2RlZmluZSBSVFVTQl9DTEVBUl9CVUxLX0ZMQUcoX00sIF9GKQkJCSgoX00pLT5CdWxrRmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIFJUVVNCX1RFU1RfQlVMS19GTEFHKF9NLCBfRikJCQkoKChfTSktPkJ1bGtGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgRW5xdWV1ZUNtZChjbWRxLCBjbWRxZWxtdCkJCVwKK3sJCQkJCQkJCQkJXAorCWlmIChjbWRxLT5zaXplID09IDApCQkJCVwKKwkJY21kcS0+aGVhZCA9IGNtZHFlbG10OwkJCVwKKwllbHNlCQkJCQkJCQlcCisJCWNtZHEtPnRhaWwtPm5leHQgPSBjbWRxZWxtdDsJXAorCWNtZHEtPnRhaWwgPSBjbWRxZWxtdDsJCQkJXAorCWNtZHFlbG10LT5uZXh0ID0gTlVMTDsJCQkJXAorCWNtZHEtPnNpemUrKzsJCQkJCQlcCit9CisKK3R5cGVkZWYgc3RydWN0ICAgX1JUX1NFVF9BU0lDX1dDSUQgeworCVVMT05HIFdDSUQ7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCisJVUxPTkcgU2V0VGlkOyAgICAgICAgLy8gdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMKKwlVTE9ORyBEZWxldGVUaWQ7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cworCVVDSEFSIEFkZHJbTUFDX0FERFJfTEVOXTsJLy8gYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5Cit9IFJUX1NFVF9BU0lDX1dDSUQsKlBSVF9TRVRfQVNJQ19XQ0lEOworCit0eXBlZGVmIHN0cnVjdCAgIF9SVF9TRVRfQVNJQ19XQ0lEX0FUVFJJIHsKKwlVTE9ORwlXQ0lEOyAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZAorCVVMT05HCUNpcGhlcjsgICAgICAgIC8vIEFTSUMgQ2lwaGVyIGRlZmluaXRpb24KKwlVQ0hBUglBZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Cit9IFJUX1NFVF9BU0lDX1dDSURfQVRUUkksKlBSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9NRU1PUllfU1RSVUNUIHsKKwlQVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgIC8vUG9pbnRlciB0byB0aGUgYmFzZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkKKwlzdHJ1Y3QgX01MTUVfTUVNT1JZX1NUUlVDVCAgICAgICpOZXh0OyAgICAgIC8vUG9pbnRlciB0byB0aGUgbmV4dCB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkKK30gICBNTE1FX01FTU9SWV9TVFJVQ1QsICpQTUxNRV9NRU1PUllfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCAgX01MTUVfTUVNT1JZX0hBTkRMRVIgeworCUJPT0xFQU4gICAgICAgICAgICAgICAgIE1lbVJ1bm5pbmc7ICAgICAgICAgLy9UaGUgZmxhZyBvZiB0aGUgTWxtZSBtZW1vcnkgaGFuZGxlcidzIHN0YXR1cworCVVJTlQgICAgICAgICAgICAgICAgICAgIE1lbW9yeUNvdW50OyAgICAgICAgLy9Ub3RhbCBub25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IG5vdCBzaXplCisJVUlOVCAgICAgICAgICAgICAgICAgICAgSW5Vc2VDb3VudDsgICAgICAgICAvL05vbnBhZ2VkIHN5c3RlbS1zcGFjZSBtZW1vcnkgaW4gdXNlZCBjb3VudHMKKwlVSU5UICAgICAgICAgICAgICAgICAgICBVblVzZUNvdW50OyAgICAgICAgIC8vTm9ucGFnZWQgc3lzdGVtLXNwYWNlIG1lbW9yeSBhdmFpbGFibGUgY291bnRzCisJSU5UICAgICAgICAgICAgICAgICAgICBQZW5kaW5nQ291bnQ7ICAgICAgIC8vTm9ucGFnZWQgc3lzdGVtLXNwYWNlIG1lbW9yeSBmb3IgZnJlZSBjb3VudHMKKwlQTUxNRV9NRU1PUllfU1RSVUNUICAgICBwSW5Vc2VIZWFkOyAgICAgICAgIC8vUG9pbnRlciB0byB0aGUgZmlyc3Qgbm9ucGFlZCBtZW1vcnkgbm90IHVzZWQKKwlQTUxNRV9NRU1PUllfU1RSVUNUICAgICBwSW5Vc2VUYWlsOyAgICAgICAgIC8vUG9pbnRlciB0byB0aGUgbGFzdCBub25wYWdlZCBtZW1vcnkgbm90IHVzZWQKKwlQTUxNRV9NRU1PUllfU1RSVUNUICAgICBwVW5Vc2VIZWFkOyAgICAgICAgIC8vUG9pbnRlciB0byB0aGUgZmlyc3Qgbm9ucGFnZWQgbWVtb3J5IGluIHVzZWQKKwlQTUxNRV9NRU1PUllfU1RSVUNUICAgICBwVW5Vc2VUYWlsOyAgICAgICAgIC8vUG9pbnRlciB0byB0aGUgbGFzdCBub25wYWdlZCBtZW1vcnkgaW4gdXNlZAorCVBVTE9ORyAgICAgICAgICAgICAgICAgIE1lbUZyZWVQZW5kaW5nW01BWF9NTE1FX0hBTkRMRVJfTUVNT1JZXTsgICAvL2FuIGFycmF5IHRvIGtlZXAgcGVuZGluZyBmcmVlLW1lbW9yeSdzIHBvaW50ZXIgKDMyYml0cykKK30gICBNTE1FX01FTU9SWV9IQU5ETEVSLCAqUE1MTUVfTUVNT1JZX0hBTkRMRVI7CisKK3R5cGVkZWYJc3RydWN0IF9DbWRRRWxtdAl7CisJVUlOVAkJCQljb21tYW5kOworCVBWT0lECQkJCWJ1ZmZlcjsKKwlVTE9ORwkJCQlidWZmZXJsZW5ndGg7CisJQk9PTEVBTgkJCQlDbWRGcm9tTmRpczsKKwlCT09MRUFOCQkJCVNldE9wZXJhdGlvbjsKKwlzdHJ1Y3QgX0NtZFFFbG10CSpuZXh0OworfQlDbWRRRWxtdCwgKlBDbWRRRWxtdDsKKwordHlwZWRlZglzdHJ1Y3QJX0NtZFEJeworCVVJTlQJCXNpemU7CisJQ21kUUVsbXQJKmhlYWQ7CisJQ21kUUVsbXQJKnRhaWw7CisJVUlOVDMyCQlDbWRRU3RhdGU7Cit9Q21kUSwgKlBDbWRROworCisvLworLy8gRm9yIFdQQSBTVVBQTElDQU5UOiBXSVJFTEVTUyBFWFQgc3VwcG9ydCB3aXJlbGVzcyBldmVudHM6IHYxNCBvciBuZXdlcgorLy8KKyNpZiBXSVJFTEVTU19FWFQgPj0gMTQKKy8vI2RlZmluZSBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUICAxCisjZW5kaWYKKworLyogb2lkLmggKi8KKy8vIENpcGhlciBzdWl0ZSB0eXBlIGZvciBtaXhlZCBtb2RlIGdyb3VwIGNpcGhlciwgUDgwMi4xMWktMjAwNAordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEUgeworCUNpcGhlcl9UeXBlX05PTkUsCisJQ2lwaGVyX1R5cGVfV0VQNDAsCisJQ2lwaGVyX1R5cGVfVEtJUCwKKwlDaXBoZXJfVHlwZV9SU1ZELAorCUNpcGhlcl9UeXBlX0NDTVAsCisJQ2lwaGVyX1R5cGVfV0VQMTA0Cit9IFJUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRSwgKlBSVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEU7CisKKy8vQ01EVEhSRUFEX01VTFRJX1JFQURfTUFDCisvL0NNRFRIUkVBRF9NVUxUSV9XUklURV9NQUMKKy8vQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fUkVBRAorLy9DTURUSFJFQURfVkVORE9SX0VFUFJPTV9XUklURQordHlwZWRlZglzdHJ1Y3QJX0NNREhhbmRsZXJfVExWCXsKKwlVU0hPUlQJCU9mZnNldDsKKwlVU0hPUlQJCUxlbmd0aDsKKwlVQ0hBUgkJRGF0YUZpcnN0OworfQlDTURIYW5kbGVyX1RMViwgKlBDTURIYW5kbGVyX1RMVjsKKworLy8gTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMTAxCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1VOUExVRyAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDIJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfU1dJVENIX0ZVTkNUSU9OICAgICAgICAgICAgMHgwRDczMDEwMwkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX01VTFRJX1dSSVRFX01BQyAgICAgICAgICAgICAgICAgICAweDBENzMwMTA3CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfTVVMVElfUkVBRF9NQUMgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDgJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1dSSVRFICAgICAgICAgICAgICAgMHgwRDczMDEwQQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fUkVBRCAgICAgICAgICAgICAgICAweDBENzMwMTBCCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VOVEVSX1RFU1RNT0RFICAgICAgICAgICAgIDB4MEQ3MzAxMEMJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRVhJVF9URVNUTU9ERSAgICAgICAgICAgICAgMHgwRDczMDEwRAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9XUklURV9CQlAgICAgICAgICAgICAgICAgICAweDBENzMwMTE5CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1JFQURfQkJQICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMTgJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfV1JJVEVfUkYgICAgICAgICAgICAgICAgICAgMHgwRDczMDExQQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9GTElQX0lRICAgICAgICAgICAgICAgICAgICAweDBENzMwMTFECS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTAJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxMQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9QU01fQklUX1NBVkUgICAgICAgICAgICAgICAgICAweDBENzMwMjEyCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX1JBRElPICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTQJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9VUERBVEVfVFhfUkFURSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9BRERfS0VZX1dFUCAgICAgICAgICAgICAgICAweDBENzMwMjE4CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfUkVTRVRfRlJPTV9FUlJPUiAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUEJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9MSU5LX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0ZST01fTkRJUyAgICAgICAgICAgICAgICAgICAweDBENzMwMjFDCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfQ0hFQ0tfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTUJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9GT1JDRV9XQUtFX1VQICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyMgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9CVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjI1CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjYJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiAgICAgICAgICAgICAgMHgwRDczMDIyNwkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQgICAgICAgICAgICAgICAgICAweDBENzMwMjNECS8vIGNtZAorI2RlZmluZSBSVF9DTURfU0VUX0tFWV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjggIC8vIGNtZAorI2RlZmluZSBSVF9DTURfU0VUX1JYX1dDSURfVEFCTEUgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjkgIC8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlkgICAgICAgICAgICAgIDB4MEQ3MzAyM0UJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfUVVFUllfSEFSRFdBUkVfUkVHSVNURVIgICAgMHgwRDcxMDEwNQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfUEhZX01PREUgICAgICAgICAgICAgICAweDBENzkwMTBDCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9TVEFfQ09ORklHICAgICAgICAgICAgIDB4MEQ3OTAxMTEJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1BSRUFNQkxFICAgICAgICAgICAgICAgMHgwRDc5MDEwMQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkUJCQkweDBENzkwMTAyCS8vIGNtZAorCisKKyNkZWZpbmUgV1BBMUFLTUJJVAkgICAgMHgwMQorI2RlZmluZSBXUEEyQUtNQklUCSAgICAweDAyCisjZGVmaW5lIFdQQTFQU0tBS01CSVQgICAweDA0CisjZGVmaW5lIFdQQTJQU0tBS01CSVQgICAweDA4CisjZGVmaW5lIFRLSVBCSVQgICAgICAgICAweDAxCisjZGVmaW5lIENDTVBCSVQgICAgICAgICAweDAyCisKKworI2RlZmluZSBSVDI4WFhfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpIFwKKyAgICBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAocEFkLCBiRnJvbVR4KTsKKworI2RlZmluZSBSVDI4WFhfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSBcCisgICAgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworI2RlZmluZSBSVDI4WFhfTUxNRV9SQURJT19PTihwQWQpIFwKKyAgICBSVDI4eHhVc2JNbG1lUmFkaW9PbihwQWQpOworCisjZGVmaW5lIFJUMjhYWF9NTE1FX1JBRElPX09GRihwQWQpIFwKKyAgICBSVDI4eHhVc2JNbG1lUmFkaW9PRkYocEFkKTsKKworI2VuZGlmIC8vX19SVDI4NzBfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjh4eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTI3ZDIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4eHguaApAQCAtMCwwICsxLDI2ODkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnQyOHh4LmgKKworCUFic3RyYWN0OgorCVJUMjh4eCBBU0lDIHJlbGF0ZWQgZGVmaW5pdGlvbiAmIHN0cnVjdHVyZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJICBXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBKYW4gTGVlICAgICAgICAgICBKYW4tMy0yMDA2ICAgICBjcmVhdGVkIGZvciBSVDI4NjBjCisqLworCisjaWZuZGVmCV9fUlQyOFhYX0hfXworI2RlZmluZQlfX1JUMjhYWF9IX18KKworCisvLworLy8gUENJIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDAwMDAKKy8vCisjZGVmaW5lIFBDSV9DRkcJCQkweDAwMDAKKyNkZWZpbmUgUENJX0VFQ1RSTAkJCTB4MDAwNAorI2RlZmluZSBQQ0lfTUNVQ1RSTAkJCTB4MDAwOAorCisvLworLy8gU0NIL0RNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMjAwCisvLworLy8gSU5UX1NPVVJDRV9DU1I6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIuIFdyaXRlIG9uZSB0byBjbGVhciBjb3JyZXNwb25kaW5nIGJpdAorLy8KKyNkZWZpbmUgRE1BX0NTUjAgICAgICAweDIwMAorI2RlZmluZSBJTlRfU09VUkNFX0NTUiAgICAgIDB4MjAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSU5UX1NPVVJDRV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJOjE0OworCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJR1BUaW1lcjoxOworCQlVSU5UMzIgICAgICAgCUF1dG9XYWtldXA6MTsvL2JpdDE0CisJCVVJTlQzMiAgICAgICAJVFhGaWZvU3RhdHVzSW50OjE7Ly9GSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjCisJCVVJTlQzMiAgICAgICAJUHJlVEJUVDoxOworCQlVSU5UMzIgICAgICAgCVRCVFRJbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlSeFR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlUeERlbGF5SU5UOjE7CS8vZGVsYXllZCBpbnRlcnJ1cHQsIG5vdCBpbnRlcnJ1cHQgdW50aWwgc2V2ZXJhbCBpbnQgb3IgdGltZSBsaW1pdCBoaXQKKwkJVUlOVDMyCQlSeERlbGF5SU5UOjE7IC8vZGVhbHllZCBpbnRlcnJ1cHQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUlOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lOVF9TT1VSQ0VfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJ4RGVsYXlJTlQ6MTsKKwkJVUlOVDMyCQlUeERlbGF5SU5UOjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOy8vNAorCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7IC8vIGJpdDcKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsvL2JpdCA5CisJCVVJTlQzMiAgICAgICAJUnhUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJVEJUVEludDoxOworCQlVSU5UMzIgICAgICAgCVByZVRCVFQ6MTsKKwkJVUlOVDMyICAgICAgIAlUWEZpZm9TdGF0dXNJbnQ6MTsvL0ZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMKKwkJVUlOVDMyICAgICAgIAlBdXRvV2FrZXVwOjE7Ly9iaXQxNAorCQlVSU5UMzIgICAgICAgCUdQVGltZXI6MTsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7Ly9iaXQxNgorCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MTQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYKKy8vCisjZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MjA7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJVHhEZWxheToxOworCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31JTlRfTUFTS19DU1JfU1RSVUMsICpQSU5UX01BU0tfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lOVF9NQVNLX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSWERlbGF5X0lOVF9NU0s6MTsKKwkJVUlOVDMyCQlUeERlbGF5OjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJOjIwOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBJTlRfTUFTS19DU1JfU1RSVUMsICpQSU5UX01BU0tfQ1NSX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdQRE1BX0dMT19DRkcgCTB4MjA4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfV1BETUFfR0xPX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlIRFJfU0VHX0xFTjoxNjsKKwkJVUlOVDMyICAgICAgIAlSWEhkclNjYXRlcjo4OworCQlVSU5UMzIgICAgICAgCUJpZ0VuZGlhbjoxOworCQlVSU5UMzIgICAgICAgCUVuVFhXcml0ZUJhY2tERE9ORToxOworCQlVSU5UMzIgICAgICAgCVdQRE1BQnVyc3RTSVpFOjI7CisJCVVJTlQzMgkJUnhETUFCdXN5OjE7CisJCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKKwkJVUlOVDMyCQlUeERNQUJ1c3k6MTsKKwkJVUlOVDMyCQlFbmFibGVUeERNQToxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31XUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfV1BETUFfR0xPX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlFbmFibGVUeERNQToxOworCQlVSU5UMzIJCVR4RE1BQnVzeToxOworCQlVSU5UMzIJCUVuYWJsZVJ4RE1BOjE7CisJCVVJTlQzMgkJUnhETUFCdXN5OjE7CisJCVVJTlQzMiAgICAgICAJV1BETUFCdXJzdFNJWkU6MjsKKwkJVUlOVDMyICAgICAgIAlFblRYV3JpdGVCYWNrRERPTkU6MTsKKwkJVUlOVDMyICAgICAgIAlCaWdFbmRpYW46MTsKKwkJVUlOVDMyICAgICAgIAlSWEhkclNjYXRlcjo4OworCQlVSU5UMzIgICAgICAgCUhEUl9TRUdfTEVOOjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gV1BETUFfR0xPX0NGR19TVFJVQywgKlBXUERNQV9HTE9fQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdQRE1BX1JTVF9JRFggCTB4MjBjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAk6MTU7CisJCVVJTlQzMiAgICAgICAJUlNUX0RSWF9JRFgwOjE7CisJCVVJTlQzMiAgICAgICAJcnN2OjEwOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNToxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNDoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31XUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDA6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDE6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDI6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDM6MTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDQ6MTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDU6MTsKKwkJVUlOVDMyICAgICAgIAlyc3Y6MTA7CisJCVVJTlQzMiAgICAgICAJUlNUX0RSWF9JRFgwOjE7CisJCVVJTlQzMiAgICAgICAJOjE1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gV1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIERFTEFZX0lOVF9DRkcgIDB4MDIxMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJVFhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJUlhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJUlhNQVhfUElOVDo3OworCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfURFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJUlhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVJYRExZX0lOVF9FTjoxOworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVRYRExZX0lOVF9FTjoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdNTV9BSUZTTl9DRkcgICAweDAyMTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEFpZnNuMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEFpZnNuMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgUnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIENXTUlOX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQworLy8KKyNkZWZpbmUgV01NX0NXTUlOX0NGRyAgIDB4MDIxOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBDV01BWF9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKKy8vCisjZGVmaW5lIFdNTV9DV01BWF9DRkcgICAweDAyMWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgUnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBBQ19UWE9QX0NTUjA6IEFDX0JLL0FDX0JFIFRYT1AgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFdNTV9UWE9QMF9DRkcgICAgMHgwMjIwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjMVR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjMFR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IwX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJJTkdSRUdfRElGRgkJCTB4MTAKKyNkZWZpbmUgR1BJT19DVFJMX0NGRyAgICAweDAyMjgJLy9NQUNfQ1NSMTMKKyNkZWZpbmUgTUNVX0NNRF9DRkcgICAgMHgwMjJjCisjZGVmaW5lIFRYX0JBU0VfUFRSMCAgICAgMHgwMjMwCS8vQUNfQksgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQwICAgICAgMHgwMjM0CisjZGVmaW5lIFRYX0NUWF9JRFgwICAgICAgIDB4MDIzOAorI2RlZmluZSBUWF9EVFhfSURYMCAgICAgIDB4MDIzYworI2RlZmluZSBUWF9CQVNFX1BUUjEgICAgIDB4MDI0MCAJLy9BQ19CRSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDEgICAgICAweDAyNDQKKyNkZWZpbmUgVFhfQ1RYX0lEWDEgICAgICAgMHgwMjQ4CisjZGVmaW5lIFRYX0RUWF9JRFgxICAgICAgMHgwMjRjCisjZGVmaW5lIFRYX0JBU0VfUFRSMiAgICAgMHgwMjUwIAkvL0FDX1ZJIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMiAgICAgIDB4MDI1NAorI2RlZmluZSBUWF9DVFhfSURYMiAgICAgICAweDAyNTgKKyNkZWZpbmUgVFhfRFRYX0lEWDIgICAgICAweDAyNWMKKyNkZWZpbmUgVFhfQkFTRV9QVFIzICAgICAweDAyNjAgCS8vQUNfVk8gYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQzICAgICAgMHgwMjY0CisjZGVmaW5lIFRYX0NUWF9JRFgzICAgICAgIDB4MDI2OAorI2RlZmluZSBUWF9EVFhfSURYMyAgICAgIDB4MDI2YworI2RlZmluZSBUWF9CQVNFX1BUUjQgICAgIDB4MDI3MCAJLy9IQ0NBIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UNCAgICAgIDB4MDI3NAorI2RlZmluZSBUWF9DVFhfSURYNCAgICAgICAweDAyNzgKKyNkZWZpbmUgVFhfRFRYX0lEWDQgICAgICAweDAyN2MKKyNkZWZpbmUgVFhfQkFTRV9QVFI1ICAgICAweDAyODAgCS8vTUdNVCBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgIFRYX01BWF9DTlQ1ICAgICAweDAyODQKKyNkZWZpbmUgVFhfQ1RYX0lEWDUgICAgICAgMHgwMjg4CisjZGVmaW5lIFRYX0RUWF9JRFg1ICAgICAgMHgwMjhjCisjZGVmaW5lIFRYX01HTVRNQVhfQ05UICAgICAgVFhfTUFYX0NOVDUKKyNkZWZpbmUgVFhfTUdNVENUWF9JRFggICAgICAgVFhfQ1RYX0lEWDUKKyNkZWZpbmUgVFhfTUdNVERUWF9JRFggICAgICBUWF9EVFhfSURYNQorI2RlZmluZSBSWF9CQVNFX1BUUiAgICAgMHgwMjkwIAkvL1JYIGJhc2UgYWRkcmVzcworI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0CisjZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4CisjZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKKyNkZWZpbmUgVVNCX0RNQV9DRkcgICAgICAweDAyYTAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9VU0JfRE1BX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBUeEJ1c3k6MTsgICAJLy9VU0IgRE1BIFRYIEZTTSBidXN5IC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIFJ4QnVzeToxOyAgICAgICAgLy9VU0IgRE1BIFJYIEZTTSBidXN5IC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIEVwb3V0VmFsaWQ6NjsgICAgICAgIC8vT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQuIGRlYnVnIG9ubHkKKwkgICAgVUlOVDMyICBUeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBUeAorCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4CisJICAgIFVJTlQzMiAgUnhCdWxrQWdnRW46MTsgICAgICAgIC8vRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24KKwkgICAgVUlOVDMyICBUeG9wSGFsdDoxOyAgICAgICAgLy9IYWx0IFRYT1AgY291bnQgZG93biB3aGVuIFRYIGJ1ZmZlciBpcyBmdWxsLgorCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgcGh5Y2xlYXI6MTsgICAgICAgIAkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQorCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDEwMjQgYnl0ZXMKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dUT3V0Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gVGltZU91dCAgaW4gdW5pdCBvZiAzM25zCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlVU0JfRE1BX0NGR19TVFJVQywgKlBVU0JfRE1BX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9VU0JfRE1BX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dUT3V0Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gVGltZU91dCAgaW4gdW5pdCBvZiAzM25zCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnTG10Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgIGluIHVuaXQgb2YgMjU2IGJ5dGVzCisJICAgIFVJTlQzMiAgcGh5Y2xlYXI6MTsgICAgICAgIAkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQorCSAgICBVSU5UMzIgIHJzdjoyOworCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCisJICAgIFVJTlQzMiAgVHhvcEhhbHQ6MTsgICAgICAgIC8vSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgorCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4CisJICAgIFVJTlQzMiAgVHhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgVHgKKwkgICAgVUlOVDMyICBFcG91dFZhbGlkOjY7ICAgICAgICAvL09VVCBlbmRwb2ludCBkYXRhIHZhbGlkCisJICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kKKwkgICAgVUlOVDMyICBUeEJ1c3k6MTsgICAJLy9VU0IgRE1BIFRYIEZTTSBidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlVU0JfRE1BX0NGR19TVFJVQywgKlBVU0JfRE1BX0NGR19TVFJVQzsKKyNlbmRpZgorCisvLworLy8gIDMgIFBCRiAgcmVnaXN0ZXJzCisvLworLy8KKy8vIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLgorI2RlZmluZSAJUEJGX1NZU19DVFJMIAkgMHgwNDAwCisjZGVmaW5lICAgICBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKKyNkZWZpbmUgCVBCRl9NQVhfUENOVCAJIDB4MDQwQworI2RlZmluZSAJUEJGX0NUUkwJIAkweDA0MTAKKyNkZWZpbmUgCVBCRl9JTlRfU1RBCSAweDA0MTQKKyNkZWZpbmUgCVBCRl9JTlRfRU5BCSAweDA0MTgKKyNkZWZpbmUgCVRYUlhRX1BDTlQgIAkgMHgwNDM4CisjZGVmaW5lIAlQQkZfREJHIAkgCSAweDA0M2MKKyNkZWZpbmUgICAgIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCisKKy8vCisvLyAgNCAgTUFDICByZWdpc3RlcnMKKy8vCisvLworLy8gIDQuMSBNQUMgU1lTVEVNICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTAwMCkKKy8vCisjZGVmaW5lIE1BQ19DU1IwICAgICAgICAgICAgMHgxMDAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQVNJQ19WRVJfSURfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQVNJQ1ZlcjsgICAgICAgIC8vIHZlcnNpb24gOiAyODYwCisJICAgIFVTSE9SVCAgQVNJQ1JldjsgICAgICAgIC8vIHJldmVyc2lvbiAgOiAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKKwkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIE1BQ19TWVNfQ1RSTCAgICAgICAgICAgIDB4MTAwNAkJLy9NQUNfQ1NSMQorI2RlZmluZSBNQUNfQUREUl9EVzAgICAgICAgICAgICAJCTB4MTAwOAkJLy8gTUFDIEFERFIgRFcwCisjZGVmaW5lIE1BQ19BRERSX0RXMSAgICAgICAgICAgCQkgMHgxMDBjCQkvLyBNQUMgQUREUiBEVzEKKy8vCisvLyBNQUNfQ1NSMjogU1RBIE1BQyByZWdpc3RlciAwCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19EVzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMF9TVFJVQywgKlBNQUNfRFcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01BQ19EVzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMF9TVFJVQywgKlBNQUNfRFcwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBNQUNfQ1NSMzogU1RBIE1BQyByZWdpc3RlciAxCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19EVzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlSc3ZkMTsKKwkJVUNIQVIJCVUyTWVNYXNrOworCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKKwkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0RXMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJVTJNZU1hc2s7CisJCVVDSEFSCQlSc3ZkMTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIE1BQ19CU1NJRF9EVzAgICAgICAgICAgICAJCTB4MTAxMAkJLy8gTUFDIEJTU0lEIERXMAorI2RlZmluZSBNQUNfQlNTSURfRFcxICAgICAgICAgICAgCQkweDEwMTQJCS8vIE1BQyBCU1NJRCBEVzEKKworLy8KKy8vIE1BQ19DU1I1OiBCU1NJRCByZWdpc3RlciAxCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19DU1I1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCVJzdmQ6MTE7CisJCVVTSE9SVAkJTUJzc0Jjbk51bTozOworCQlVU0hPUlQJCUJzc0lkTW9kZToyOyAvLyAwOiBvbmUgQlNTSUQsIDEwOiA0IEJTU0lELCAgMDE6IDIgQlNTSUQgLCAxMTogOEJTU0lECisJCVVDSEFSCQlCeXRlNTsJCSAvLyBCU1NJRCBieXRlIDUKKwkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0NTUjVfU1RSVUMsICpQTUFDX0NTUjVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlNDsJCSAvLyBCU1NJRCBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQorCQlVU0hPUlQgICAgICAJQnNzSWRNYXNrOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKKwkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7CisJCVVTSE9SVAkJUnN2ZDoxMTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTUFYX0xFTl9DRkcgICAgICAgICAgICAgIDB4MTAxOAkJLy8gcnQyODYwYiBtYXggMTZrIGJ5dGVzLiBiaXQxMjoxMyBNYXhpbXVtIFBTRFUgbGVuZ3RoIChwb3dlciBmYWN0b3IpIDA6Ml4xMywgMToyXjE0LCAyOjJeMTUsIDM6Ml4xNgorI2RlZmluZSBCQlBfQ1NSX0NGRyAgICAgICAgICAgIAkJMHgxMDFjCQkvLworLy8KKy8vIEJCUF9DU1JfQ0ZHOiBCQlAgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJOjEyOworCQlVSU5UMzIJCUJCUF9SV19NT0RFOjE7CQkvLyAwOiB1c2Ugc2VyaWFsIG1vZGUgIDE6cGFyYWxsZWwKKwkJVUlOVDMyCQlCQlBfUEFSX0RVUjoxOwkJICAgIC8vIDA6IDQgTUFDIGNsb2NrIGN5Y2xlcyAgMTogOCBNQUMgY2xvY2sgY3ljbGVzCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCisJCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCisJCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQlBfQ1NSX0NGR19TVFJVQywgKlBCQlBfQ1NSX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9CQlBfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlWYWx1ZTo4OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQlSZWdOdW06ODsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlmUmVhZDoxOwkJICAgIC8vIDA6IFdyaXRlCUJCUCwgMToJUmVhZCBCQlAKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIEJCUCBwcm9ncmFtbWluZy4KKwkJVUlOVDMyCQlCQlBfUEFSX0RVUjoxOwkJICAgICAvLyAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcworCQlVSU5UMzIJCUJCUF9SV19NT0RFOjE7CQkvLyAwOiB1c2Ugc2VyaWFsIG1vZGUgIDE6cGFyYWxsZWwKKwkJVUlOVDMyCQk6MTI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQlBfQ1NSX0NGR19TVFJVQywgKlBCQlBfQ1NSX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSRl9DU1JfQ0ZHMCAgICAgICAgICAgIAkJMHgxMDIwCisvLworLy8gUkZfQ1NSX0NGRzogUkYgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKKwkJVUlOVDMyCQlTdGFuZGJ5TW9kZToxOwkJICAgIC8vIDA6IGhpZ2ggd2hlbiBzdGFuZCBieSAxOglsb3cgd2hlbiBzdGFuZGJ5CisJCVVJTlQzMgkJYml0d2lkdGg6NTsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKKwkJVUlOVDMyCQlTZWw6MTsJCQkJLy8gMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlCisJCVVJTlQzMgkJQnVzeToxOwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcwX1NUUlVDLCAqUFJGX0NTUl9DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcxICAgICAgICAgICAJCTB4MTAyNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCXJzdjo3OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwkJVUlOVDMyCQlSRkdhcDo1OwkJCS8vIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQlSRkdhcDo1OwkJCS8vIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykKKwkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMV9TVFJVQywgKlBSRl9DU1JfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSRl9DU1JfQ0ZHMiAgICAgICAgICAgCQkweDEwMjgJCS8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzJfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMl9TVFJVQywgKlBSRl9DU1JfQ0ZHMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExFRF9DRkcgICAgICAgICAgIAkJMHgxMDJjCQkvLyAgTUFDX0NTUjE0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTsKKwkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAorCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCisJCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQorCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCisJCVVJTlQzMgkJcnN2OjI7CisJCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCisJCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlPblBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9uIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCU9mZlBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMKKwkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKKwkJVUlOVDMyCQlyc3Y6MjsKKwkJVUlOVDMyCQlSTGVkTW9kZToyOwkJCS8vIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbgorCQlVSU5UMzIJCUdMZWRNb2RlOjI7CQkJLy8gZ3JlZW4gTGVkIE1vZGUKKwkJVUlOVDMyCQlZTGVkTW9kZToyOwkJCS8vIHllbGxvdyBMZWQgTW9kZQorCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCisJCVVJTlQzMgkJOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7CisjZW5kaWYKKy8vCisvLyAgNC4yIE1BQyBUSU1JTkcgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMTAwKQorLy8KKyNkZWZpbmUgWElGU19USU1FX0NGRyAgICAgICAgICAgICAweDExMDAJCSAvLyBNQUNfQ1NSOCAgTUFDX0NTUjkKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgorCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cworCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECisJICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAorCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCisJICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAorCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECisJICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCisJICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgorCSAgICBVSU5UMzIgIHJzdjoyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIEJLT0ZGX1NMT1RfQ0ZHICAgICAgICAgICAgIDB4MTEwNAkJIC8vICBtYWNfY3NyOSBsYXN0IDggYml0cworI2RlZmluZSBOQVZfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTA4CQkgLy8gTkFWICAoTUFDX0NTUjE1KQorI2RlZmluZSBDSF9USU1FX0NGRyAgICAgICAgICAgICAweDExMEMJCSAJLy8gQ291bnQgYXMgY2hhbm5lbCBidXN5CisjZGVmaW5lIFBCRl9MSUZFX1RJTUVSICAgICAgICAgICAgIDB4MTExMAkJIC8vVFgvUlggTVBEVSB0aW1lc3RhbXAgdGltZXIgKGZyZWUgcnVuKVVuaXQ6IDF1cworI2RlZmluZSBCQ05fVElNRV9DRkcgICAgICAgICAgICAgMHgxMTE0CQkgLy8gVFhSWF9DU1I5CisKKyNkZWZpbmUgQkNOX09GRlNFVDAJCQkJMHgwNDJDCisjZGVmaW5lIEJDTl9PRkZTRVQxCQkJCTB4MDQzMAorCisvLworLy8gQkNOX1RJTUVfQ0ZHIDogU3luY2hyb25pemF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQkNOX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVR4VGltZXN0YW1wQ29tcGVuc2F0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgOjM7CisJCVVJTlQzMgkJYkJlYWNvbkdlbjoxOwkJLy8gRW5hYmxlIGJlYWNvbiBnZW5lcmF0b3IKKyAgICAgICAgVUlOVDMyICAgICAgIGJUQlRURW5hYmxlOjE7CisJCVVJTlQzMgkJVHNmU3luY01vZGU6MjsJCS8vIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUKKwkJVUlOVDMyCQliVHNmVGlja2luZzoxOwkJLy8gRW5hYmxlIFRTRiBhdXRvIGNvdW50aW5nCisJCVVJTlQzMiAgICAgICBCZWFjb25JbnRlcnZhbDoxNjsgIC8vIGluIHVuaXQgb2YgMS8xNiBUVQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkNOX1RJTUVfQ0ZHX1NUUlVDLCAqUEJDTl9USU1FX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBCZWFjb25JbnRlcnZhbDoxNjsgIC8vIGluIHVuaXQgb2YgMS8xNiBUVQorCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKKwkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQorICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKKwkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgorICAgICAgICBVSU5UMzIgICAgICAgOjM7CisJCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRCVFRfU1lOQ19DRkcgICAgICAgICAgICAweDExMTggIAkJLy8gdHhyeF9jc3IxMAorI2RlZmluZSBUU0ZfVElNRVJfRFcwICAgICAgICAgICAgIDB4MTExQyAgCQkvLyBMb2NhbCBUU0YgdGltZXIgbHNiIDMyIGJpdHMuIFJlYWQtb25seQorI2RlZmluZSBUU0ZfVElNRVJfRFcxICAgICAgICAgICAgIDB4MTEyMCAgCQkvLyBtc2IgMzIgYml0cy4gUmVhZC1vbmx5LgorI2RlZmluZSBUQlRUX1RJTUVSICAgICAgICAgICAgIAkweDExMjQgIAkJLy8gVEltZXIgcmVtYWlucyB0aWxsIG5leHQgVEJUVC4gUmVhZC1vbmx5LiAgVFhSWF9DU1IxNAorI2RlZmluZSBJTlRfVElNRVJfQ0ZHICAgICAgICAgICAgICAJMHgxMTI4ICAJCS8vCisjZGVmaW5lIElOVF9USU1FUl9FTiAgICAgICAgICAgICAJMHgxMTJjICAJCS8vICBHUC10aW1lciBhbmQgcHJlLXRidHQgSW50IGVuYWJsZQorI2RlZmluZSBDSF9JRExFX1NUQSAgICAgICAgICAgICAgCTB4MTEzMCAgCQkvLyAgY2hhbm5lbCBpZGxlIHRpbWUKKyNkZWZpbmUgQ0hfQlVTWV9TVEEgICAgICAgICAgICAgIAkweDExMzQgIAkJLy8gIGNoYW5ubGUgYnVzeSB0aW1lCisvLworLy8gIDQuMiBNQUMgUE9XRVIgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMjAwKQorLy8KKyNkZWZpbmUgTUFDX1NUQVRVU19DRkcgICAgICAgICAgICAgMHgxMjAwCQkgLy8gb2xkIE1BQ19DU1IxMgorI2RlZmluZSBQV1JfUElOX0NGRyAgICAgICAgICAgICAweDEyMDQJCSAvLyBvbGQgTUFDX0NTUjEyCisjZGVmaW5lIEFVVE9fV0FLRVVQX0NGRyAgICAgICAgICAgICAweDEyMDgJCSAvLyBvbGQgTUFDX0NTUjEwCisvLworLy8gQVVUT19XQUtFVVBfQ0ZHOiBNYW51YWwgcG93ZXIgY29udHJvbCAvIHN0YXR1cyByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BVVRPX1dBS0VVUF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTY7CisJCVVJTlQzMgkJRW5hYmxlQXV0b1dha2V1cDoxOwkvLyAwOnNsZWVwLCAxOmF3YWtlCisJCVVJTlQzMiAgICAgICBOdW1vZlNsZWVwaW5nVGJ0dDo3OyAgICAgICAgICAvLyBGb3JjZVdha2UgaGFzIGhpZ2ggcHJpdmlsZWdlIHRoYW4gUHV0VG9TbGVlcCB3aGVuIGJvdGggc2V0CisJCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFVVE9fV0FLRVVQX1NUUlVDLCAqUEFVVE9fV0FLRVVQX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgQXV0b0xlYWRUaW1lOjg7CisJCVVJTlQzMiAgICAgICBOdW1vZlNsZWVwaW5nVGJ0dDo3OyAgICAgICAgICAvLyBGb3JjZVdha2UgaGFzIGhpZ2ggcHJpdmlsZWdlIHRoYW4gUHV0VG9TbGVlcCB3aGVuIGJvdGggc2V0CisJCVVJTlQzMgkJRW5hYmxlQXV0b1dha2V1cDoxOwkvLyAwOnNsZWVwLCAxOmF3YWtlCisJCVVJTlQzMgkJOjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7CisjZW5kaWYKKy8vCisvLyAgNC4zIE1BQyBUWCAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEzMDApCisvLworCisjZGVmaW5lIEVEQ0FfQUMwX0NGRwkweDEzMDAJCS8vQUNfVFhPUF9DU1IwIDB4MzQ3NAorI2RlZmluZSBFRENBX0FDMV9DRkcJMHgxMzA0CisjZGVmaW5lIEVEQ0FfQUMyX0NGRwkweDEzMDgKKyNkZWZpbmUgRURDQV9BQzNfQ0ZHCTB4MTMwYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIDoxMjsgICAgICAgIC8vCisJICAgIFVJTlQzMiAgQ3dtYXg6NDsgICAgICAgIC8vdW5pdCBwb3dlciBvZiAyCisJICAgIFVJTlQzMiAgQ3dtaW46NDsgICAgICAgIC8vCisJICAgIFVJTlQzMiAgQWlmc246NDsgICAgICAgIC8vICMgb2Ygc2xvdCB0aW1lCisJICAgIFVJTlQzMiAgQWNUeG9wOjg7ICAgICAgICAvLyAgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFRENBX0FDX0NGR19TVFJVQywgKlBFRENBX0FDX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRENBX0FDX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKKwkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKKwkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKKwkgICAgVUlOVDMyICA6MTI7ICAgICAgIC8vCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFRENBX0FDX0NGR19TVFJVQywgKlBFRENBX0FDX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIEVEQ0FfVElEX0FDX01BUAkweDEzMTAKKyNkZWZpbmUgVFhfUFdSX0NGR18wCTB4MTMxNAorI2RlZmluZSBUWF9QV1JfQ0ZHXzEJMHgxMzE4CisjZGVmaW5lIFRYX1BXUl9DRkdfMgkweDEzMUMKKyNkZWZpbmUgVFhfUFdSX0NGR18zCTB4MTMyMAorI2RlZmluZSBUWF9QV1JfQ0ZHXzQJMHgxMzI0CisjZGVmaW5lIFRYX1BJTl9DRkcJCTB4MTMyOAorI2RlZmluZSBUWF9CQU5EX0NGRwkweDEzMmMJCS8vIDB4MSB1c2UgdXBwZXIgMjBNSHouIDAganVzZSBsb3dlciAyME1IegorI2RlZmluZSBUWF9TV19DRkcwCQkweDEzMzAKKyNkZWZpbmUgVFhfU1dfQ0ZHMQkJMHgxMzM0CisjZGVmaW5lIFRYX1NXX0NGRzIJCTB4MTMzOAorI2RlZmluZSBUWE9QX1RIUkVTX0NGRwkJMHgxMzNjCisjZGVmaW5lIFRYT1BfQ1RSTF9DRkcJCTB4MTM0MAorI2RlZmluZSBUWF9SVFNfQ0ZHCQkweDEzNDQKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6NzsKKwkgICAgVUlOVDMyICAgICAgIFJ0c0Zia0VuOjE7ICAgIC8vIGVuYWJsZSBydHMgcmF0ZSBmYWxsYmFjaworCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQorCSAgICBVSU5UMzIgICAgICAgQXV0b1J0c1JldHJ5TGltaXQ6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUU19DRkdfU1RSVUMsICpQVFhfUlRTX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9SVFNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgQXV0b1J0c1JldHJ5TGltaXQ6ODsKKwkgICAgVUlOVDMyICAgICAgIFJ0c1RocmVzOjE2OyAgICAvLyB1bml0OmJ5dGUKKwkgICAgVUlOVDMyICAgICAgIFJ0c0Zia0VuOjE7ICAgIC8vIGVuYWJsZSBydHMgcmF0ZSBmYWxsYmFjaworCSAgICBVSU5UMzIgICAgICAgcnN2Ojc7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1RJTUVPVVRfQ0ZHCTB4MTM0OAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OworCSAgICBVSU5UMzIgICAgICAgVHhvcFRpbWVvdXQ6ODsJLy9UWE9QIHRpbWVvdXQgdmFsdWUgZm9yIFRYT1AgdHJ1bmNhdGlvbi4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKFNMT1RfVElNRSkgPiAoVFhfT1BfVElNRU9VVCkgPiAoUlhfQUNLX1RJTUVPVVQpCisJICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKKwkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCisJICAgIFVJTlQzMiAgICAgICByc3Y6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjQ7CisJICAgIFVJTlQzMiAgICAgICBNcGR1TGlmZVRpbWU6NDsgICAgLy8gIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cworCSAgICBVSU5UMzIgICAgICAgUnhBY2tUaW1lb3V0Ojg7CS8vIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlCisJICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKKwkgICAgVUlOVDMyICAgICAgIHJzdjI6ODsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9SVFlfQ0ZHCTB4MTM0YworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjE7CisJICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgQWdnUnR5TW9kZToxOwkvLyBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgTm9uQWdnUnR5TW9kZToxOwkvLyBOb24tQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIFNob3J0UnR5TGltaXQ6ODsJLy8gIHNob3J0IHJldHJ5IGxpbWl0CisKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUWV9DRkdfU1RSVUMsICpQVFhfUlRZX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIFNob3J0UnR5TGltaXQ6ODsJLy8gIHNob3J0IHJldHJ5IGxpbWl0CisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5TGltaXQ6ODsJLy9sb25nIHJldHJ5IGxpbWl0CisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5VGhyZToxMjsJLy8gTG9uZyByZXRyeSB0aHJlc2hvb2xkCisJICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgQWdnUnR5TW9kZToxOwkvLyBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgVHhhdXRvRkJFbmFibGU6MTsgICAgLy8gVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUWV9DRkdfU1RSVUMsICpQVFhfUlRZX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9MSU5LX0NGRwkweDEzNTAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCVBBQ0tFRCBfVFhfTElOS19DRkdfU1RSVUMJeworCXN0cnVjdCBQQUNLRUQgeworCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRlM6ODsJLy9yZW1vdGUgTUNTIGZlZWRiYWNrIHNlcXVlbmNlIG51bWJlcgorCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRkI6ODsgICAgLy8gIHJlbW90ZSBNQ1MgZmVlZGJhY2sKKwkgICAgVUlOVDMyICAgICAgIHJzdjozOwkvLworCSAgICBVSU5UMzIgICAgICAgVHhDRkFja0VuOjE7CS8vICAgUGlnZ3liYWNrIENGLUFDSyBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4UkRHRW46MTsJLy8gUkRHIFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVVTUZTRW5hYmxlOjE7CS8vICByZW1vdGUgdW5zb2xpY2l0ICBNRkIgZW5hYmxlLiAgMDogbm90IGFwcGx5IHJlbW90ZSByZW1vdGUgdW5zb2xpY2l0IChNRlM9NykKKwkgICAgVUlOVDMyICAgICAgIE1GQkVuYWJsZToxOwkvLyAgVFggYXBwbHkgcmVtb3RlIE1GQiAxOmVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgUmVtb3RlTUZCTGlmZVRpbWU6ODsJLy9yZW1vdGUgTUZCIGxpZmUgdGltZS4gdW5pdCA6IDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7CisJc3RydWN0IFBBQ0tFRCB7CisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cworCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVVTUZTRW5hYmxlOjE7CS8vICByZW1vdGUgdW5zb2xpY2l0ICBNRkIgZW5hYmxlLiAgMDogbm90IGFwcGx5IHJlbW90ZSByZW1vdGUgdW5zb2xpY2l0IChNRlM9NykKKwkgICAgVUlOVDMyICAgICAgIFR4TVJRRW46MTsJLy8gIE1DUyByZXF1ZXN0IFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjaworCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRlM6ODsJLy9yZW1vdGUgTUNTIGZlZWRiYWNrIHNlcXVlbmNlIG51bWJlcgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgSFRfRkJLX0NGRzAJMHgxMzU0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M3RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzZGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzBGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9IVF9GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzVGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M3RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMF9TVFJVQywgKlBIVF9GQktfQ0ZHMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBIVF9GQktfQ0ZHMQkweDEzNTgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9IVF9GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMV9TVFJVQywgKlBIVF9GQktfQ0ZHMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9IVF9GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEwRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzExRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE1RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMV9TVFJVQywgKlBIVF9GQktfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBMR19GQktfQ0ZHMAkweDEzNWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M3RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA2CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M0RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAzCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M1RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA0CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcwX1NUUlVDLCAqUExHX0ZCS19DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExHX0ZCS19DRkcxCQkweDEzNjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxNjsKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcxX1NUUlVDLCAqUExHX0ZCS19DRkcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT0gUHJvdGVjdGlvbiBQYXJhbWF0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIENDS19QUk9UX0NGRwkweDEzNjQJCS8vQ0NLIFByb3RlY3Rpb24KKyNkZWZpbmUgQVNJQ19TSE9SVE5BVgkJMQorI2RlZmluZSBBU0lDX0xPTkdOQVYJCTIKKyNkZWZpbmUgQVNJQ19SVFMJCTEKKyNkZWZpbmUgQVNJQ19DVFMJCTIKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9QUk9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjo1OworCSAgICBVSU5UMzIgICAgICAgUlRTVGhFbjoxOwkvL1JUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWAorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0Y0MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0YyMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU00MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU0yMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd09mZG06MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0NjazoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdE5hdjoyOwkvL1RYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdEN0cmw6MjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RSYXRlOjE2OwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQUk9UX0NGR19TVFJVQywgKlBQUk9UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9QUk9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RSYXRlOjE2OwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuCisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0Q3RybDoyOwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdE5hdjoyOwkvL1RYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93Q2NrOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU00MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0YyMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0Y0MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgUlRTVGhFbjoxOwkvL1JUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWAorCSAgICBVSU5UMzIgICAgICAgcnN2OjU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQUk9UX0NGR19TVFJVQywgKlBQUk9UX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIE9GRE1fUFJPVF9DRkcJMHgxMzY4CQkvL09GRE0gUHJvdGVjdGlvbgorI2RlZmluZSBNTTIwX1BST1RfQ0ZHCTB4MTM2QwkJLy9NTTIwIFByb3RlY3Rpb24KKyNkZWZpbmUgTU00MF9QUk9UX0NGRwkweDEzNzAJCS8vTU00MCBQcm90ZWN0aW9uCisjZGVmaW5lIEdGMjBfUFJPVF9DRkcJMHgxMzc0CQkvL0dGMjAgUHJvdGVjdGlvbgorI2RlZmluZSBHRjQwX1BST1RfQ0ZHCTB4MTM3OAkJLy9HUjQwIFByb3RlY3Rpb24KKyNkZWZpbmUgRVhQX0NUU19USU1FCTB4MTM3QwkJLy8KKyNkZWZpbmUgRVhQX0FDS19USU1FCTB4MTM4MAkJLy8KKworLy8KKy8vICA0LjQgTUFDIFJYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNDAwKQorLy8KKyNkZWZpbmUgUlhfRklMVFJfQ0ZHCTB4MTQwMAkJCS8vVFhSWF9DU1IwCisjZGVmaW5lIEFVVE9fUlNQX0NGRwkweDE0MDQJCQkvL1RYUlhfQ1NSNAorLy8KKy8vIFRYUlhfQ1NSNDogQXV0by1SZXNwb25kZXIvCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gX0FVVE9fUlNQX0NGR19TVFJVQyB7Cisgc3RydWN0IHsKKyAgICAgVUlOVDMyICAgICAgICA6MjQ7CisgICAgIFVJTlQzMiAgICAgICBBY2tDdHNQc21CaXQ6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIER1YWxDVFNFbjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1SZWY6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNTW9kZToxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBCQUNBY2tQb2xpY3lFbmFibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyRW5hYmxlOjE7CisgfSBmaWVsZDsKKyBVSU5UMzIgICB3b3JkOworfSBBVVRPX1JTUF9DRkdfU1RSVUMsICpQQVVUT19SU1BfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gX0FVVE9fUlNQX0NGR19TVFJVQyB7Cisgc3RydWN0IHsKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJFbmFibGU6MTsKKyAgICAgVUlOVDMyICAgICAgIEJBQ0Fja1BvbGljeUVuYWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgRHVhbENUU0VuOjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBBY2tDdHNQc21CaXQ6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgICA6MjQ7CisgfSBmaWVsZDsKKyBVSU5UMzIgICB3b3JkOworfSBBVVRPX1JTUF9DRkdfU1RSVUMsICpQQVVUT19SU1BfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTEVHQUNZX0JBU0lDX1JBVEUJMHgxNDA4CS8vICBUWFJYX0NTUjUgICAgICAgICAgIDB4MzA1NAorI2RlZmluZSBIVF9CQVNJQ19SQVRFCQkweDE0MGMKKyNkZWZpbmUgSFRfQ1RSTF9DRkcJCTB4MTQxMAorI2RlZmluZSBTSUZTX0NPU1RfQ0ZHCQkweDE0MTQKKyNkZWZpbmUgUlhfUEFSU0VSX0NGRwkJMHgxNDE4CS8vU2V0IE5BViBmb3IgYWxsIHJlY2VpdmVkIGZyYW1lcworCisvLworLy8gIDQuNSBNQUMgU2VjdXJpdHkgY29uZmlndXJhdGlvbiAob2Zmc2V0OjB4MTUwMCkKKy8vCisjZGVmaW5lIFRYX1NFQ19DTlQwCQkweDE1MDAJCS8vCisjZGVmaW5lIFJYX1NFQ19DTlQwCQkweDE1MDQJCS8vCisjZGVmaW5lIENDTVBfRkNfTVVURQkJMHgxNTA4CQkvLworLy8KKy8vICA0LjYgSENDQS9QU01QIChvZmZzZXQ6MHgxNjAwKQorLy8KKyNkZWZpbmUgVFhPUF9ITERSX0FERFIwCQkweDE2MDAKKyNkZWZpbmUgVFhPUF9ITERSX0FERFIxCQkweDE2MDQKKyNkZWZpbmUgVFhPUF9ITERSX0VUCQkweDE2MDgKKyNkZWZpbmUgUU9TX0NGUE9MTF9SQV9EVzAJCTB4MTYwYworI2RlZmluZSBRT1NfQ0ZQT0xMX0ExX0RXMQkJMHgxNjEwCisjZGVmaW5lIFFPU19DRlBPTExfUUMJCTB4MTYxNAorLy8KKy8vICA0LjcgTUFDIFN0YXRpc3RpcyByZWdpc3RlcnMgKG9mZnNldDoweDE3MDApCisvLworI2RlZmluZSBSWF9TVEFfQ05UMAkJMHgxNzAwCQkvLworI2RlZmluZSBSWF9TVEFfQ05UMQkJMHgxNzA0CQkvLworI2RlZmluZSBSWF9TVEFfQ05UMgkJMHgxNzA4CQkvLworCisvLworLy8gUlhfU1RBX0NOVDBfU1RSVUM6IFJYIFBMQ1AgZXJyb3IgY291bnQgJiBSWCBDUkMgZXJyb3IgY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUGh5RXJyOworCSAgICBVU0hPUlQgIENyY0VycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIENyY0VycjsKKwkgICAgVVNIT1JUICBQaHlFcnI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUlhfU1RBX0NOVDFfU1RSVUM6IFJYIEZhbHNlIENDQSBjb3VudCAmIFJYIExPTkcgZnJhbWUgY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUGxjcEVycjsKKwkgICAgVVNIT1JUICBGYWxzZUNjYTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQxX1NUUlVDLCAqUFJYX1NUQV9DTlQxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEZhbHNlQ2NhOworCSAgICBVU0hPUlQgIFBsY3BFcnI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUlhfU1RBX0NOVDJfU1RSVUM6CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFJ4Rmlmb092ZXJmbG93Q291bnQ7CisJICAgIFVTSE9SVCAgUnhEdXBsaUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUnhEdXBsaUNvdW50OworCSAgICBVU0hPUlQgIFJ4Rmlmb092ZXJmbG93Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMl9TVFJVQywgKlBSWF9TVEFfQ05UMl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfQ05UMAkJMHgxNzBDCQkvLworLy8KKy8vIFNUQV9DU1IzOiBUWCBCZWFjb24gY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhCZWFjb25Db3VudDsKKwkgICAgVVNIT1JUICBUeEZhaWxDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQwX1NUUlVDLCAqUFRYX1NUQV9DTlQwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4RmFpbENvdW50OworCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfQ05UMQkJMHgxNzEwCQkvLworLy8KKy8vIFRYX1NUQV9DTlQxOiBUWCB0eCBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7CisJICAgIFVTSE9SVCAgVHhTdWNjZXNzOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDFfU1RSVUMsICpQVFhfU1RBX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhTdWNjZXNzOworCSAgICBVU0hPUlQgIFR4UmV0cmFuc21pdDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQyCQkweDE3MTQJCS8vCisvLworLy8gVFhfU1RBX0NOVDI6IFRYIHR4IGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4VW5kZXJGbG93Q291bnQ7CisJICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMl9TVFJVQywgKlBUWF9TVEFfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFplcm9MZW5Db3VudDsKKwkgICAgVVNIT1JUICBUeFVuZGVyRmxvd0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0ZJRk8JCTB4MTcxOAkJLy8KKy8vCisvLyBUWF9TVEFfRklGT19TVFJVQzogVFggUmVzdWx0IGZvciBzcGVjaWZpYyBQSUQgc3RhdHVzIGZpZm8gcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlc2VydmU6MjsKKwkJVUlOVDMyCQlUeEJGOjE7IC8vIDMqMworCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorLy8JCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTY7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKKwkJVUlOVDMyICAgICAgIAlUeEFja1JlcXVpcmVkOjE7ICAgIC8vIGFjayByZXF1aXJlZAorCQlVSU5UMzIgICAgICAgCVR4QWdncmU6MTsgICAgLy8gVHggaXMgYWdncmVnYXRlZAorCQlVSU5UMzIgICAgICAgCVR4U3VjY2VzczoxOyAgIC8vIFR4IHN1Y2Nlc3MuIHdoZXRoZXIgc3VjY2VzcyBvciBub3QKKwkJVUlOVDMyICAgICAgIAlQaWRUeXBlOjQ7CisJCVVJTlQzMiAgICAgICAJYlZhbGlkOjE7ICAgLy8gMTpUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIGEgdmFsaWQgVFggcmVzdWx0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfU1RBX0ZJRk9fU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJYlZhbGlkOjE7ICAgLy8gMTpUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIGEgdmFsaWQgVFggcmVzdWx0CisJCVVJTlQzMiAgICAgICAJUGlkVHlwZTo0OworCQlVSU5UMzIgICAgICAgCVR4U3VjY2VzczoxOyAgIC8vIFR4IE5vIHJldHJ5IHN1Y2Nlc3MKKwkJVUlOVDMyICAgICAgIAlUeEFnZ3JlOjE7ICAgIC8vIFR4IFJldHJ5IFN1Y2Nlc3MKKwkJVUlOVDMyICAgICAgIAlUeEFja1JlcXVpcmVkOjE7ICAgIC8vIFR4IGZhaWwKKwkJVUlOVDMyCQl3Y2lkOjg7CQkvL3dpcmVsZXNzIGNsaWVudCBpbmRleAorLy8JCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTY7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTM7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJVHhCRjoxOworCQlVSU5UMzIJCVJlc2VydmU6MjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9GSUZPX1NUUlVDLCAqUFRYX1NUQV9GSUZPX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQJMHgxNzFjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dUeENvdW50OworCSAgICBVU0hPUlQgIE5vbkFnZ1R4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OworCSAgICBVU0hPUlQgIEFnZ1R4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDAJMHgxNzIwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTJDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDBfU1RSVUMsICpQVFhfQUdHX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDBfU1RSVUMsICpQVFhfQUdHX0NOVDBfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDEJMHgxNzI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplM0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDFfU1RSVUMsICpQVFhfQUdHX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTNDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDFfU1RSVUMsICpQVFhfQUdHX0NOVDFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDIJMHgxNzI4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDMJMHgxNzJjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDNfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZThDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplN0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDNfU1RSVUMsICpQVFhfQUdHX0NOVDNfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDNfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplOENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDNfU1RSVUMsICpQVFhfQUdHX0NOVDNfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDQJMHgxNzMwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEwQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTlDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ0X1NUUlVDLCAqUFRYX0FHR19DTlQ0X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEwQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNQkweDE3MzQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxMUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxMkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDYJCTB4MTczOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDZfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEzQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE0Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNwkJMHgxNzNjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UN19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTVDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTZDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIE1QRFVfREVOU0lUWV9DTlQJCTB4MTc0MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTVBEVV9ERU5fQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFRYWmVyb0RlbENvdW50OwkvL1RYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCSAgICBVU0hPUlQgIFJYWmVyb0RlbENvdW50OwkvL1JYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIFRYUlggY29udHJvbCByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgzMDAwCisvLworLy8gcnQyODYwYiAgVU5LTk9XTiByZWcgdXNlIFIvTyBSZWcgQWRkciAweDc3ZDAgZmlyc3QuLgorI2RlZmluZSBUWFJYX0NTUjEgICAgICAgICAgIDB4NzdkMAorCisvLworLy8gU2VjdXJpdHkga2V5IHRhYmxlIG1lbW9yeSwgYmFzZSBhZGRyZXNzID0gMHgxMDAwCisvLworI2RlZmluZSBNQUNfV0NJRF9CQVNFCQkweDE4MDAgLy84LWJ5dGVzKHVzZSBvbmx5IDYtYnl0ZXMpICogMjU2IGVudHJ5ID0KKyNkZWZpbmUgSFdfV0NJRF9FTlRSWV9TSVpFICAgOAorI2RlZmluZSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSAgICAgMHg0MDAwICAgICAgLy8gMzItYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBIV19LRVlfRU5UUllfU0laRSAgICAgICAgICAgMHgyMAorI2RlZmluZSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgTUFDX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMCAgICAgIC8vIDgtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBIV19JVkVJVl9FTlRSWV9TSVpFICAgOAorI2RlZmluZSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSAgICAgMHg2ODAwICAgICAgLy8gNC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX1dDSURfQVRUUklfU0laRSAgIDQKKyNkZWZpbmUgV0NJRF9SRVNFUlZFRCAgICAgICAgICAJCTB4NmJmYworI2RlZmluZSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgICAgICAgMHg2YzAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKKyNkZWZpbmUgU0hBUkVEX0tFWV9NT0RFX0JBU0UgICAgICAgMHg3MDAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKKyNkZWZpbmUgSFdfU0hBUkVEX0tFWV9NT0RFX1NJWkUgICA0CisjZGVmaW5lIFNIQVJFREtFWVRBQkxFCQkJMAorI2RlZmluZSBQQUlSV0lTRUtFWVRBQkxFCQkJMQorCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTBDaXBoZXJBbGc6MzsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1NIQVJFREtFWV9NT0RFX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgQnNzMEtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0hBUkVES0VZX01PREVfU1RSVUMsICpQU0hBUkVES0VZX01PREVfU1RSVUM7CisjZW5kaWYKKy8vIDY0LWVudHJ5IGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK3R5cGVkZWYgc3RydWN0IF9IV19XQ0lEX0VOVFJZIHsgIC8vIDgtYnl0ZSBwZXIgZW50cnkKKyAgICBVQ0hBUiAgIEFkZHJlc3NbNl07CisgICAgVUNIQVIgICBSc3ZbMl07Cit9IEhXX1dDSURfRU5UUlksIFBIV19XQ0lEX0VOVFJZOworCisKKworLy8KKy8vIE90aGVyIG9uLWNoaXAgc2hhcmVkIG1lbW9yeSBzcGFjZSwgYmFzZSA9IDB4MjAwMAorLy8KKworLy8gQ0lTIHNwYWNlIC0gYmFzZSBhZGRyZXNzID0gMHgyMDAwCisjZGVmaW5lIEhXX0NJU19CQVNFICAgICAgICAgICAgIDB4MjAwMAorCisvLyBDYXJyaWVyLXNlbnNlIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBjYXJyaWVyLXNlbnNlIGZyYW1lIGZvciBjYXJyaWVyLXNlbnNlIGZ1bmN0aW9uLgorI2RlZmluZSBIV19DU19DVFNfQkFTRQkJCTB4NzcwMAorLy8gREZTIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBDVFMgZnJhbWUgZm9yIERGUy4KKyNkZWZpbmUgSFdfREZTX0NUU19CQVNFCQkJMHg3NzgwCisjZGVmaW5lIEhXX0NUU19GUkFNRV9TSVpFCQkweDgwCisKKy8vIDIwMDQtMTEtMDggam9obiAtIHNpbmNlIE5VTEwgZnJhbWUgd29uJ3QgYmUgdGhhdCBsb25nICgyNTYgYnl0ZSkuIFdlIHN0ZWFsIDE2IHRhaWwgYnl0ZXMKKy8vIHRvIHNhdmUgZGVidWdnaW5nIHNldHRpbmdzCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRSAgIDB4NzdmMCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcworI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UyICAgMHg3NzcwICAvLyAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzCisKKyNpZiAwCisvLyBvbi1jaGlwIEJFQUNPTiBmcmFtZSBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4NzgwMAorI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDA4MDAgLyogdW5pdDogYnl0ZSAqLworI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3OTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N2EwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdiMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3YzAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4N2QwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDdlMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg3ZjAwCisvKiAxLiBIV19CRUFDT05fT0ZGU0VULzY0QiBtdXN0IGJlIDA7CisgICAyLiBCQ05fT0ZGU0VUMCBtdXN0IGFsc28gYmUgY2hhbmdlZCBpbiBOSUNJbml0aWFsaXplQXNpYygpOworICAgMy4gbWF4IDB4MDgwMCBmb3IgOCBiZWFjb24gZnJhbWVzOyAqLworI2Vsc2UKKy8vIEluIG9yZGVyIHRvIHN1cHBvcnQgbWF4aW11bSA4IE1CU1MgYW5kIGl0cyBtYXhpbXVtIGxlbmd0aCBpcyA1MTIgZm9yIGVhY2ggYmVhY29uCisvLyBUaHJlZSBzZWN0aW9uIGRpc2NvbnRpbnVlIG1lbW9yeSBzZWdtZW50cyB3aWxsIGJlIHVzZWQuCisvLyAxLiBUaGUgb3JpZ2luYWwgcmVnaW9uIGZvciBCQ04gMH4zCisvLyAyLiBFeHRyYWN0IG1lbW9yeSBmcm9tIEZDRSB0YWJsZSBmb3IgQkNOIDR+NQorLy8gMy4gRXh0cmFjdCBtZW1vcnkgZnJvbSBQYWlyLXdpc2Uga2V5IHRhYmxlIGZvciBCQ04gNn43CisvLwkgIEl0IG9jY3VwaWVkIHRob3NlIG1lbW9yeSBvZiB3Y2lkIDIzOH4yNTMgZm9yIEJDTiA2CisvLwkJCQkJCSAgICAgIGFuZCB3Y2lkIDIyMn4yMzcgZm9yIEJDTiA3CisjZGVmaW5lIEhXX0JFQUNPTl9NQVhfU0laRSAgICAgIDB4MTAwMCAvKiB1bml0OiBieXRlICovCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMCAgICAgICAgIDB4NzgwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTEgICAgICAgICAweDdBMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UyICAgICAgICAgMHg3QzAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMyAgICAgICAgIDB4N0UwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTQgICAgICAgICAweDcyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U1ICAgICAgICAgMHg3NDAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNiAgICAgICAgIDB4NURDMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTcgICAgICAgICAweDVCQzAKKyNlbmRpZgorCisjZGVmaW5lIEhXX0JFQUNPTl9NQVhfQ09VTlQgICAgIDgKKyNkZWZpbmUgSFdfQkVBQ09OX09GRlNFVAkJMHgwMjAwCisjZGVmaW5lIEhXX0JFQUNPTl9DT05URU5UX0xFTgkoSFdfQkVBQ09OX09GRlNFVCAtIFRYV0lfU0laRSkKKworLy8gSE9TVC1NQ1Ugc2hhcmVkIG1lbW9yeSAtIGJhc2UgYWRkcmVzcyA9IDB4MjEwMAorI2RlZmluZSBIT1NUX0NNRF9DU1IJCTB4NDA0CisjZGVmaW5lIEgyTV9NQUlMQk9YX0NTUiAgICAgICAgIDB4NzAxMAorI2RlZmluZSBIMk1fTUFJTEJPWF9DSUQgICAgICAgICAweDcwMTQKKyNkZWZpbmUgSDJNX01BSUxCT1hfU1RBVFVTICAgICAgMHg3MDFjCisjZGVmaW5lIEgyTV9JTlRfU1JDICAgICAgICAgICAgIDB4NzAyNAorI2RlZmluZSBIMk1fQkJQX0FHRU5UICAgICAgICAgICAweDcwMjgKKyNkZWZpbmUgTTJIX0NNRF9ET05FX0NTUiAgICAgICAgMHgwMDBjCisjZGVmaW5lIE1DVV9UWE9QX0FSUkFZX0JBU0UgICAgIDB4MDAwYyAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAorI2RlZmluZSBNQ1VfVFhPUF9FTlRSWV9TSVpFICAgICAzMiAgICAgICAvLyBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQKKyNkZWZpbmUgTUFYX05VTV9PRl9UWE9QX0VOVFJZICAgMTYgICAgICAgLy8gVE9ETzogbXVzdCBiZSBzYW1lIHdpdGggODA1MSBmaXJtd2FyZQorI2RlZmluZSBNQ1VfTUJPWF9WRVJTSU9OICAgICAgICAweDAxICAgICAvLyBUT0RPOiB0byBiZSBjb25maXJtZWQgYnkgQWxiZXJ0CisjZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT05fT0ZGU0VUIDUgICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAorCisvLworLy8gSG9zdCBETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MjAwIC4gIFRYMC0zPUVEQ0FRaWQwLTMsIFRYND1IQ0NBLCBUWDU9TUdNVCwKKy8vCisvLworLy8gIERNQSBSSU5HIERFU0NSSVBUT1IKKy8vCisjZGVmaW5lIEUyUFJPTV9DU1IgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIElPX0NOVExfQ1NSICAgICAgICAgMHg3N2QwCisKKyNpZmRlZiBSVDI4NzAKKy8vIDgwNTEgZmlybXdhcmUgaW1hZ2UgZm9yIHVzYiAtIHVzZSBsYXN0LWhhbGYgYmFzZSBhZGRyZXNzID0gMHgzMDAwCisjZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MzAwMAorI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDEwMDAgICAgLy8gNGtieXRlCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKy8vIFRPRE86ID8/Pz8/IG9sZCBSVDI1NjAgcmVnaXN0ZXJzLiB0byBrZWVwIHRoZW0gb3IgcmVtb3ZlIHRoZW0/CisvLyNkZWZpbmUgTUNBU1QwICAgICAgICAgICAgICAgICAgMHgwMTc4ICAvLyBtdWx0aWNhc3QgZmlsdGVyIHJlZ2lzdGVyIDAKKy8vI2RlZmluZSBNQ0FTVDEgICAgICAgICAgICAgICAgICAweDAxN2MgIC8vIG11bHRpY2FzdCBmaWx0ZXIgcmVnaXN0ZXIgMQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFR4IC8JUnggLyBNZ210IHJpbmcgZGVzY3JpcHRvciBkZWZpbml0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHRoZSBmb2xsb3dpbmcgUElEIHZhbHVlcyBhcmUgdXNlZCB0byBtYXJrIG91dGdvaW5nIGZyYW1lIHR5cGUgaW4gVFhELT5QSUQgc28gdGhhdAorLy8gcHJvcGVyIFRYIHN0YXRpc3RpY3MgY2FuIGJlIGNvbGxlY3RlZCBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzCisvLyBiMy0yIG9mIFBJRCBmaWVsZCAtCisjZGVmaW5lIFBJRF9NR01UCQkJMHgwNQorI2RlZmluZSBQSURfQkVBQ09OCQkJMHgwYworI2RlZmluZSBQSURfREFUQV9OT1JNQUxVQ0FTVAkgCTB4MDIKKyNkZWZpbmUgUElEX0RBVEFfQU1QRFUJIAkweDA0CisjZGVmaW5lIFBJRF9EQVRBX05PX0FDSyAgICAJMHgwOAorI2RlZmluZSBQSURfREFUQV9OT1RfTk9STV9BQ0sJIAkweDAzCisjaWYgMAorI2RlZmluZSBQVFlQRV9EQVRBX1JFUVVJUkVfQUNLICAweDAwIC8vIGI3LTY6MDAsIGI1LTA6IDB+NTkgaXMgTUFDIHRhYmxlIGluZGV4IChBSUQ/KSwgNjB+NjMgaXMgV0RTIGluZGV4CisjZGVmaW5lIFBUWVBFX05VTExfQVRfSElHSF9SQVRFIDB4MDQgLy8gYjctNjowMSwgYjUtMDogMH41OSBpcyBNQUMgdGFibGUgaW5kZXggKEFJRD8pLCA2MH42MyBpcyBXRFMgaW5kZXgKKyNkZWZpbmUgUFRZUEVfUkVTRVJWRUQgICAgICAgICAgMHgwOCAvLyBiNy02OjEwCisjZGVmaW5lIFBUWVBFX1NQRUNJQUwgICAgICAgICAgIDB4MGMgLy8gYjctNjoxMQorCisvLyB3aGVuIGIzLTI9MTEgKFBUWVBFX1NQRUNJQUwpLCBiMS0wIGNvdWJlIGJlIC4uLgorI2RlZmluZSBQU1VCVFlQRV9EQVRBX05PX0FDSyAgICAweDAwCisjZGVmaW5lIFBTVUJUWVBFX01HTVQgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUFNVQlRZUEVfT1RIRVJfQ05UTCAgICAgMHgwMgorI2RlZmluZSBQU1VCVFlQRV9SVFMgICAgICAgICAgICAweDAzCisjZW5kaWYKKy8vIHZhbHVlIGRvbWFpbiBvZiBwVHhELT5Ib3N0UUlkICg0LWJpdDogMH4xNSkKKyNkZWZpbmUgUUlEX0FDX0JLICAgICAgICAgICAgICAgMSAgIC8vIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZQorI2RlZmluZSBRSURfQUNfQkUgICAgICAgICAgICAgICAwICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCisjZGVmaW5lIFFJRF9BQ19WSSAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUUlEX0FDX1ZPICAgICAgICAgICAgICAgMworI2RlZmluZSBRSURfSENDQSAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9PRl9UWF9SSU5HICAgICAgICAgIDUKKyNkZWZpbmUgUUlEX01HTVQgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgUUlEX1JYICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUUlEX09USEVSICAgICAgICAgICAgICAgMTUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJCUCAmIFJGCWRlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZQlCVVNZCQkgICAgICAgICAgICAgICAgMQorI2RlZmluZQlJRExFCQkgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lCVJGX1IwMAkJCQkJICAgIDAKKyNkZWZpbmUJUkZfUjAxCQkJCQkgICAgMQorI2RlZmluZQlSRl9SMDIJCQkJCSAgICAyCisjZGVmaW5lCVJGX1IwMwkJCQkJICAgIDMKKyNkZWZpbmUJUkZfUjA0CQkJCQkgICAgNAorI2RlZmluZQlSRl9SMDUJCQkJCSAgICA1CisjZGVmaW5lCVJGX1IwNgkJCQkJICAgIDYKKyNkZWZpbmUJUkZfUjA3CQkJCQkgICAgNworI2RlZmluZQlSRl9SMDgJCQkJCSAgICA4CisjZGVmaW5lCVJGX1IwOQkJCQkJICAgIDkKKyNkZWZpbmUJUkZfUjEwCQkJCQkgICAgMTAKKyNkZWZpbmUJUkZfUjExCQkJCQkgICAgMTEKKyNkZWZpbmUJUkZfUjEyCQkJCQkgICAgMTIKKyNkZWZpbmUJUkZfUjEzCQkJCQkgICAgMTMKKyNkZWZpbmUJUkZfUjE0CQkJCQkgICAgMTQKKyNkZWZpbmUJUkZfUjE1CQkJCQkgICAgMTUKKyNkZWZpbmUJUkZfUjE2CQkJCQkgICAgMTYKKyNkZWZpbmUJUkZfUjE3CQkJCQkgICAgMTcKKyNkZWZpbmUJUkZfUjE4CQkJCQkgICAgMTgKKyNkZWZpbmUJUkZfUjE5CQkJCQkgICAgMTkKKyNkZWZpbmUJUkZfUjIwCQkJCQkgICAgMjAKKyNkZWZpbmUJUkZfUjIxCQkJCQkgICAgMjEKKyNkZWZpbmUJUkZfUjIyCQkJCQkgICAgMjIKKyNkZWZpbmUJUkZfUjIzCQkJCQkgICAgMjMKKyNkZWZpbmUJUkZfUjI0CQkJCQkgICAgMjQKKyNkZWZpbmUJUkZfUjI1CQkJCQkgICAgMjUKKyNkZWZpbmUJUkZfUjI2CQkJCQkgICAgMjYKKyNkZWZpbmUJUkZfUjI3CQkJCQkgICAgMjcKKyNkZWZpbmUJUkZfUjI4CQkJCQkgICAgMjgKKyNkZWZpbmUJUkZfUjI5CQkJCQkgICAgMjkKKyNkZWZpbmUJUkZfUjMwCQkJCQkgICAgMzAKKyNkZWZpbmUJUkZfUjMxCQkJCQkgICAgMzEKKworI2RlZmluZQlCQlBfUjAJCQkJCSAgICAwICAvLyB2ZXJzaW9uCisjZGVmaW5lCUJCUF9SMQkJCQkgICAgICAgIDEgIC8vIFRTU0kKKyNkZWZpbmUJQkJQX1IyICAgICAgICAgIAkJCTIgIC8vIFRYIGNvbmZpZ3VyZQorI2RlZmluZSBCQlBfUjMgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBCQlBfUjQgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBCQlBfUjUgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCQlBfUjYgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZQlCQlBfUjE0CQkJICAgICAgICAgICAgMTQgLy8gUlggY29uZmlndXJlCisjZGVmaW5lIEJCUF9SMTYgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBCQlBfUjE3ICAgICAgICAgICAgICAgICAgICAgMTcgLy8gUlggc2Vuc2liaWxpdHkKKyNkZWZpbmUgQkJQX1IxOCAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEJCUF9SMjEgICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBCQlBfUjIyICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgQkJQX1IyNCAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEJCUF9SMjUgICAgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBCQlBfUjQ5ICAgICAgICAgICAgICAgICAgICAgNDkgLy9UU1NJCisjZGVmaW5lIEJCUF9SNTAgICAgICAgICAgICAgICAgICAgICA1MAorI2RlZmluZSBCQlBfUjUxICAgICAgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgQkJQX1I1MiAgICAgICAgICAgICAgICAgICAgIDUyCisjZGVmaW5lIEJCUF9SNTUgICAgICAgICAgICAgICAgICAgICA1NQorI2RlZmluZSBCQlBfUjYyICAgICAgICAgICAgICAgICAgICAgNjIgLy8gUnggU1EwIFRocmVzaG9sZCBISUdICisjZGVmaW5lIEJCUF9SNjMgICAgICAgICAgICAgICAgICAgICA2MworI2RlZmluZSBCQlBfUjY0ICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgQkJQX1I2NSAgICAgICAgICAgICAgICAgICAgIDY1CisjZGVmaW5lIEJCUF9SNjYgICAgICAgICAgICAgICAgICAgICA2NgorI2RlZmluZSBCQlBfUjY3ICAgICAgICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgQkJQX1I2OCAgICAgICAgICAgICAgICAgICAgIDY4CisjZGVmaW5lIEJCUF9SNjkgICAgICAgICAgICAgICAgICAgICA2OQorI2RlZmluZSBCQlBfUjcwICAgICAgICAgICAgICAgICAgICAgNzAgLy8gUnggQUdDIFNRIENDSyBYY29yciB0aHJlc2hvbGQKKyNkZWZpbmUgQkJQX1I3MyAgICAgICAgICAgICAgICAgICAgIDczCisjZGVmaW5lIEJCUF9SNzUJCQkJCQk3NQorI2RlZmluZSBCQlBfUjc3ICAgICAgICAgICAgICAgICAgICAgNzcKKyNkZWZpbmUgQkJQX1I4MSAgICAgICAgICAgICAgICAgICAgIDgxCisjZGVmaW5lIEJCUF9SODIgICAgICAgICAgICAgICAgICAgICA4MgorI2RlZmluZSBCQlBfUjgzICAgICAgICAgICAgICAgICAgICAgODMKKyNkZWZpbmUgQkJQX1I4NCAgICAgICAgICAgICAgICAgICAgIDg0CisjZGVmaW5lIEJCUF9SODYJCQkJCQk4NgorI2RlZmluZSBCQlBfUjkxCQkJCQkJOTEKKyNkZWZpbmUgQkJQX1I5MgkJCQkJCTkyCisjZGVmaW5lIEJCUF9SOTQgICAgICAgICAgICAgICAgICAgICA5NCAvLyBUeCBHYWluIENvbnRyb2wKKyNkZWZpbmUgQkJQX1IxMDMgICAgICAgICAgICAgICAgICAgIDEwMworI2RlZmluZSBCQlBfUjEwNSAgICAgICAgICAgICAgICAgICAgMTA1CisjZGVmaW5lIEJCUF9SMTEzICAgICAgICAgICAgICAgICAgICAxMTMKKyNkZWZpbmUgQkJQX1IxMTQgICAgICAgICAgICAgICAgICAgIDExNAorI2RlZmluZSBCQlBfUjExNSAgICAgICAgICAgICAgICAgICAgMTE1CisjZGVmaW5lIEJCUF9SMTE2ICAgICAgICAgICAgICAgICAgICAxMTYKKyNkZWZpbmUgQkJQX1IxMTcgICAgICAgICAgICAgICAgICAgIDExNworI2RlZmluZSBCQlBfUjExOCAgICAgICAgICAgICAgICAgICAgMTE4CisjZGVmaW5lIEJCUF9SMTE5ICAgICAgICAgICAgICAgICAgICAxMTkKKyNkZWZpbmUgQkJQX1IxMjAgICAgICAgICAgICAgICAgICAgIDEyMAorI2RlZmluZSBCQlBfUjEyMSAgICAgICAgICAgICAgICAgICAgMTIxCisjZGVmaW5lIEJCUF9SMTIyICAgICAgICAgICAgICAgICAgICAxMjIKKyNkZWZpbmUgQkJQX1IxMjMgICAgICAgICAgICAgICAgICAgIDEyMworCisKKyNkZWZpbmUgQkJQUjk0X0RFRkFVTFQgICAgICAgICAgICAgIDB4MDYgLy8gQWRkIDEgdmFsdWUgd2lsbCBnYWluIDFkYgorCisvLyNkZWZpbmUgUEhZX1RSX1NXSVRDSF9USU1FICAgICAgICAgIDUgIC8vIHVzZWMKKworLy8jZGVmaW5lIEJCUF9SMTdfTE9XX1NFTlNJQklMSVRZICAgICAweDUwCisvLyNkZWZpbmUgQkJQX1IxN19NSURfU0VOU0lCSUxJVFkgICAgIDB4NDEKKy8vI2RlZmluZSBCQlBfUjE3X0RZTkFNSUNfVVBfQk9VTkQgICAgMHg0MAorI2RlZmluZSBSU1NJX0ZPUl9WRVJZX0xPV19TRU5TSUJJTElUWSAtMzUKKyNkZWZpbmUgUlNTSV9GT1JfTE9XX1NFTlNJQklMSVRZICAgICAgLTU4CisjZGVmaW5lIFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkgIC04MAorI2RlZmluZSBSU1NJX0ZPUl9NSURfU0VOU0lCSUxJVFkgICAgICAtOTAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFRVBST00gZGVmaW5pdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVFRE8gICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEVFREkgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEVFQ1MgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEVFU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVFUkwgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERSAgICAgICAgIDB4MDUKKyNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFICAgICAgICAgIDB4MDYKKyNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFICAgICAgICAgIDB4MTMKKworI2RlZmluZQlOVU1fRUVQUk9NX0JCUF9QQVJNUwkJMTkJCQkvLyBJbmNsdWRlIE5JQyBDb25maWcgMCwgMSwgQ1IsIFRYIEFMQyBzdGVwLCBCQlBzCisjZGVmaW5lCU5VTV9FRVBST01fVFhfR19QQVJNUwkJNworI2RlZmluZQlFRVBST01fTklDMV9PRkZTRVQgICAgICAgICAgMHgzNAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX05JQzJfT0ZGU0VUICAgICAgICAgIDB4MzYJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECisjZGVmaW5lCUVFUFJPTV9CQlBfQkFTRV9PRkZTRVQJCTB4ZjAJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECisjZGVmaW5lCUVFUFJPTV9HX1RYX1BXUl9PRkZTRVQJCTB4NTIKKyNkZWZpbmUJRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQJCTB4NjAKKyNkZWZpbmUgRUVQUk9NX0xFRDFfT0ZGU0VUCQkJMHgzYworI2RlZmluZSBFRVBST01fTEVEMl9PRkZTRVQJCQkweDNlCisjZGVmaW5lIEVFUFJPTV9MRUQzX09GRlNFVAkJCTB4NDAKKyNkZWZpbmUgRUVQUk9NX0xOQV9PRkZTRVQJCQkweDQ0CisjZGVmaW5lIEVFUFJPTV9SU1NJX0JHX09GRlNFVAkJMHg0NgorI2RlZmluZSBFRVBST01fUlNTSV9BX09GRlNFVAkJMHg0YQorI2RlZmluZSBFRVBST01fREVGSU5FX01BWF9UWFBXUgkJMHg0ZQorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RwkweGRlCS8vIDIwTUhaIDIuNEcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHCTB4ZWUJLy8gNDBNSFogMi40RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHCQkweGZhCS8vIDIwTUhaIDVHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcJCTB4MTBhCS8vIDQwTUhaIDVHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICAgICAgMHg3OAorI2RlZmluZSBFRVBST01fQV9UWDJfUFdSX09GRlNFVCAgICAgIDB4YTYKKy8vI2RlZmluZSBFRVBST01fSmFwYW5fVFhfUFdSX09GRlNFVCAgICAgIDB4OTAgLy8gODAyLjExagorLy8jZGVmaW5lIEVFUFJPTV9KYXBhbl9UWDJfUFdSX09GRlNFVCAgICAgIDB4YmUKKy8vI2RlZmluZSBFRVBST01fVFNTSV9SRUZfT0ZGU0VUCTB4NTQKKy8vI2RlZmluZSBFRVBST01fVFNTSV9ERUxUQV9PRkZTRVQJMHgyNAorLy8jZGVmaW5lIEVFUFJPTV9DQ0tfVFhfUFdSX09GRlNFVCAgMHg2MgorLy8jZGVmaW5lIEVFUFJPTV9DQUxJQlJBVEVfT0ZGU0VUCTB4N2MKKyNkZWZpbmUgRUVQUk9NX1ZFUlNJT05fT0ZGU0VUICAgICAgIDB4MDIKKyNkZWZpbmUJRUVQUk9NX0ZSRVFfT0ZGU0VUCQkJMHgzYQorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEUgCTB4ZGUJLy8gMjBNSFogcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0RFTFRBCQkweDUwCS8vIDIwTUhaIEFORCA0MCBNSFogdXNlIGRpZmZlcmVudCBwb3dlci4gVGhpcyBpcyBkZWx0YSBpbiA0ME1IWi4KKyNkZWZpbmUgVkFMSURfRUVQUk9NX1ZFUlNJT04gICAgICAgIDEKKworLy8gUGFpcktleU1vZGUgZGVmaW5pdGlvbgorI2RlZmluZSBQS01PREVfTk9ORSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQS01PREVfV0VQNjQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQS01PREVfV0VQMTI4ICAgICAgICAgICAgICAgMgorI2RlZmluZSBQS01PREVfVEtJUCAgICAgICAgICAgICAgICAgMworI2RlZmluZSBQS01PREVfQUVTICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBQS01PREVfQ0tJUDY0ICAgICAgICAgICAgICAgNQorI2RlZmluZSBQS01PREVfQ0tJUDEyOCAgICAgICAgICAgICAgNgorI2RlZmluZSBQS01PREVfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBXQ0lEICBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy83LjEJV0NJRCAgRU5UUlkgIGZvcm1hdCAgOiA4Ynl0ZXMKK3R5cGVkZWYJc3RydWN0CV9XQ0lEX0VOVFJZX1NUUlVDIHsKKwlVQ0hBUgkJUlhCQUJpdG1hcDc7ICAgIC8vIGJpdDAgZm9yIFRJRDgsIGJpdDcgZm9yIFRJRCAxNQorCVVDSEFSCQlSWEJBQml0bWFwMDsgICAgLy8gYml0MCBmb3IgVElEMCwgYml0NyBmb3IgVElEIDcKKwlVQ0hBUgkJTUFDWzZdOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCit9CVdDSURfRU5UUllfU1RSVUMsICpQV0NJRF9FTlRSWV9TVFJVQzsKKworLy84LjEuMQlTRUNVUklUWSAgS0VZICBmb3JtYXQgIDogOERXCisvLyAzMi1ieXRlIHBlciBlbnRyeSwgdG90YWwgMTYtZW50cnkgZm9yIHNoYXJlZCBrZXkgdGFibGUsIDY0LWVudHJ5IGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK3R5cGVkZWYgc3RydWN0IF9IV19LRVlfRU5UUlkgeyAgICAgICAgICAvLyAzMi1ieXRlIHBlciBlbnRyeQorICAgIFVDSEFSICAgS2V5WzE2XTsKKyAgICBVQ0hBUiAgIFR4TWljWzhdOworICAgIFVDSEFSICAgUnhNaWNbOF07Cit9IEhXX0tFWV9FTlRSWSwgKlBIV19LRVlfRU5UUlk7CisKKy8vOC4xLjIJSVYvRUlWICBmb3JtYXQgIDogMkRXCisKKy8vOC4xLjMJUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdCAgOiAxRFcKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlfTUFDX0FUVFJJQlVURV9TVFJVQyB7CisJVUlOVDMyCQlyc3Y6MjI7CisJVUlOVDMyCQlSWFdJVURGOjM7CisJVUlOVDMyCQlCU1NJRElkeDozOyAvL211bHRpcGxlQlNTIGluZGV4IGZvciB0aGUgV0NJRAorCVVJTlQzMgkJUGFpcktleU1vZGU6MzsKKwlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCit9CU1BQ19BVFRSSUJVVEVfU1RSVUMsICpQTUFDX0FUVFJJQlVURV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXN0cnVjdAlfTUFDX0FUVFJJQlVURV9TVFJVQyB7CisJVUlOVDMyCQlLZXlUYWI6MTsJLy8gMCBmb3Igc2hhcmVkIGtleSB0YWJsZS4gIDEgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQorCVVJTlQzMgkJUGFpcktleU1vZGU6MzsKKwlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECisJVUlOVDMyCQlSWFdJVURGOjM7CisJVUlOVDMyCQlyc3Y6MjI7Cit9CU1BQ19BVFRSSUJVVEVfU1RSVUMsICpQTUFDX0FUVFJJQlVURV9TVFJVQzsKKyNlbmRpZgorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVFggLyBSWCByaW5nIGRlc2NyaXB0b3IgZm9ybWF0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdGhlIGZpcnN0IDI0LWJ5dGUgaW4gVFhEIGlzIGNhbGxlZCBUWElORk8gYW5kIHdpbGwgYmUgRE1BZWQgdG8gTUFDIGJsb2NrIHRocm91Z2ggVFhGSUZPLgorLy8gTUFDIGJsb2NrIHVzZSB0aGlzIFRYSU5GTyB0byBjb250cm9sIHRoZSB0cmFuc21pc3Npb24gYmVoYXZpb3Igb2YgdGhpcyBmcmFtZS4KKyNkZWZpbmUgRklGT19NR01UICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEZJRk9fSENDQSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBGSUZPX0VEQ0EgICAgICAgICAgICAgICAgIDIKKworLy8KKy8vIFRYIGRlc2NyaXB0b3IgZm9ybWF0LCBUeAlyaW5nLCBNZ210IFJpbmcKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgeworCS8vIFdvcmQgMAorCVVJTlQzMgkJU0RQdHIwOworCS8vIFdvcmQgMQorCVVJTlQzMgkJRE1BRE9ORToxOworCVVJTlQzMgkJTGFzdFNlYzA6MTsKKwlVSU5UMzIJCVNETGVuMDoxNDsKKwlVSU5UMzIJCUJ1cnN0OjE7CisJVUlOVDMyCQlMYXN0U2VjMToxOworCVVJTlQzMgkJU0RMZW4xOjE0OworCS8vIFdvcmQgMgorCVVJTlQzMgkJU0RQdHIxOworCS8vIFdvcmQgMworCVVJTlQzMgkJSUNPOjE7CisJVUlOVDMyCQlVQ086MTsKKwlVSU5UMzIJCVRDTzoxOworCVVJTlQzMgkJcnN2OjI7CisJVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQorCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCisJVUlOVDMyCQlyc3YyOjI0OworfQlUWERfU1RSVUMsICpQVFhEX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhEX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVNEUHRyMDsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCVNETGVuMToxNDsKKwlVSU5UMzIJCUxhc3RTZWMxOjE7CisJVUlOVDMyCQlCdXJzdDoxOworCVVJTlQzMgkJU0RMZW4wOjE0OworCVVJTlQzMgkJTGFzdFNlYzA6MTsKKwlVSU5UMzIJCURNQURPTkU6MTsKKwkvL1dvcmQyCisJVUlOVDMyCQlTRFB0cjE7CisJLy9Xb3JkMworCVVJTlQzMgkJcnN2MjoyNDsKKwlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgorCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKKwlVSU5UMzIJCXJzdjoyOworCVVJTlQzMgkJVENPOjE7CS8vCisJVUlOVDMyCQlVQ086MTsJLy8KKwlVSU5UMzIJCUlDTzoxOwkvLworfQlUWERfU1RSVUMsICpQVFhEX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIFRYRCBXaXJlbGVzcyBJbmZvcm1hdGlvbiBmb3JtYXQgZm9yIFR4IHJpbmcgYW5kIE1nbXQgUmluZworLy8KKy8vdHhvcCA6IGZvciB0eG9wIG1vZGUKKy8vIDA6dHhvcCBmb3IgdGhlIE1QRFUgZnJhbWUgd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMgYnkgcmVnaXN0ZXIKKy8vIDEvMi8zOnRoZSBNUERVIGZyYW1lIGlzIHNlbmQgYWZ0ZXIgUElGUy9iYWNrb2ZmL1NJRlMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYV0lfU1RSVUMgeworCS8vIFdvcmQgMAorCVVJTlQzMgkJUEhZTU9ERToyOworCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKKwlVSU5UMzIJCXJzdjI6MTsKKy8vCVVJTlQzMgkJcnN2MjoyOworCVVJTlQzMgkJSWZzOjE7CS8vCisJVUlOVDMyCQlTVEJDOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlTaG9ydEdJOjE7CisJVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVJTlQzMgkJTUNTOjc7CisKKwlVSU5UMzIJCXJzdjo2OworCVVJTlQzMgkJdHhvcDoyOwkvL3R4IGJhY2sgb2ZmIG1vZGUgMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgorCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwlVSU5UMzIJCUFNUERVOjE7CisKKwlVSU5UMzIJCVRTOjE7CisJVUlOVDMyCQlDRkFDSzoxOworCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQorCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgorCS8vIFdvcmQgMQorCVVJTlQzMgkJUGFja2V0SWQ6NDsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCUJBV2luU2l6ZTo2OworCVVJTlQzMgkJTlNFUToxOworCVVJTlQzMgkJQUNLOjE7CisJLy8gV29yZCAyCisJVUlOVDMyCQlJVjsKKwkvLyBXb3JkIDMKKwlVSU5UMzIJCUVJVjsKK30JVFhXSV9TVFJVQywgKlBUWFdJX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlGUkFHOjE7CQkvLyAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuCisJVUlOVDMyCQlNSU1PcHM6MTsJLy8gdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlCisJVUlOVDMyCQlDRkFDSzoxOworCVVJTlQzMgkJVFM6MTsKKworCVVJTlQzMgkJQU1QRFU6MTsKKwlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJVUlOVDMyCQl0eG9wOjI7CS8vRk9SICJUSElTIiBmcmFtZS4gMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgorCVVJTlQzMgkJcnN2OjY7CisKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCVNUQkM6MjsJLy8gMTogU1RCQyBzdXBwb3J0IE1DUyA9MC03LCAgIDIsMyA6IFJFU0VSVkUKKwlVSU5UMzIJCUlmczoxOwkvLworLy8JVUlOVDMyCQlyc3YyOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlyc3YyOjE7CisJVUlOVDMyCQlUeEJGOjE7CS8vIDMqMworCVVJTlQzMgkJUEhZTU9ERToyOworCS8vIFdvcmQJMQorCVVJTlQzMgkJQUNLOjE7CisJVUlOVDMyCQlOU0VROjE7CisJVUlOVDMyCQlCQVdpblNpemU6NjsKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVBhY2tldElkOjQ7CisJLy9Xb3JkMgorCVVJTlQzMgkJSVY7CisJLy9Xb3JkMworCVVJTlQzMgkJRUlWOworfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7CisjZW5kaWYKKy8vCisvLyBSeCBkZXNjcmlwdG9yIGZvcm1hdCwgUngJUmluZworLy8KKy8vCisvLyBSWFdJIHdpcmVsZXNzIGluZm9ybWF0aW9uIGZvcm1hdCwgaW4gUEJGLiBpbnZpc2libGUgaW4gZHJpdmVyLgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYV0lfU1RSVUMgeworCS8vIFdvcmQgMAorCVVJTlQzMgkJVElEOjQ7CisJVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJVUlOVDMyCQlVREY6MzsKKwlVSU5UMzIJCUJTU0lEOjM7CisJVUlOVDMyCQlLZXlJbmRleDoyOworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCS8vIFdvcmQgMQorCVVJTlQzMgkJUEhZTU9ERToyOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCisJVUlOVDMyCQlyc3Y6MzsKKwlVSU5UMzIJCVNUQkM6MjsKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCUJXOjE7CisJVUlOVDMyCQlNQ1M6NzsKKwlVSU5UMzIJCVNFUVVFTkNFOjEyOworCVVJTlQzMgkJRlJBRzo0OworCS8vIFdvcmQgMgorCVVJTlQzMgkJcnN2MTo4OworCVVJTlQzMgkJUlNTSTI6ODsKKwlVSU5UMzIJCVJTU0kxOjg7CisJVUlOVDMyCQlSU1NJMDo4OworCS8vIFdvcmQgMworCVVJTlQzMgkJcnN2MjoxNjsKKwlVSU5UMzIJCVNOUjE6ODsKKwlVSU5UMzIJCVNOUjA6ODsKK30JUlhXSV9TVFJVQywgKlBSWFdJX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhXSV9TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlXaXJlbGVzc0NsaUlEOjg7CisJVUlOVDMyCQlLZXlJbmRleDoyOworCVVJTlQzMgkJQlNTSUQ6MzsKKwlVSU5UMzIJCVVERjozOworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJVElEOjQ7CisJLy8gV29yZAkxCisJVUlOVDMyCQlGUkFHOjQ7CisJVUlOVDMyCQlTRVFVRU5DRToxMjsKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJQlc6MTsKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCVNUQkM6MjsKKwlVSU5UMzIJCXJzdjozOworCVVJTlQzMgkJUEhZTU9ERToyOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCisJLy9Xb3JkMgorCVVJTlQzMgkJUlNTSTA6ODsKKwlVSU5UMzIJCVJTU0kxOjg7CisJVUlOVDMyCQlSU1NJMjo4OworCVVJTlQzMgkJcnN2MTo4OworCS8vV29yZDMKKwlVSU5UMzIJCVNOUjA6ODsKKwlVSU5UMzIJCVNOUjE6ODsKKwlVSU5UMzIJCXJzdjI6MTY7Cit9CVJYV0lfU1RSVUMsICpQUlhXSV9TVFJVQzsKKyNlbmRpZgorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSE9TVC1NQ1UgY29tbXVuaWNhdGlvbiBkYXRhIHN0cnVjdHVyZQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vCisvLyBIMk1fTUFJTEJPWF9DU1I6IEhvc3QtdG8tTUNVIE1haWxib3gKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZiB1bmlvbiAgX0gyTV9NQUlMQk9YX1NUUlVDIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuOjg7ICAgIC8vIDB4ZmYgdGVsbHMgTUNVIG5vdCB0byByZXBvcnQgQ21kRG9uZUludCBhZnRlciBleGN1dGluZyB0aGUgY29tbWFuZAorICAgICAgICBVSU5UMzIgICAgICAgSGlnaEJ5dGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKKyAgICB9ICAgZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiAgICAgICBMb3dCeXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsKKyAgICAgICAgVUlOVDMyICAgICAgIE93bmVyOjg7CisgICAgfSAgIGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gSDJNX01BSUxCT1hfU1RSVUMsICpQSDJNX01BSUxCT1hfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIE0ySF9DTURfRE9ORV9DU1I6IE1DVS10by1Ib3N0IGNvbW1hbmQgY29tcGxldGUgaW5kaWNhdGlvbgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uIF9NMkhfQ01EX0RPTkVfU1RSVUMgeworICAgIHN0cnVjdCAgeworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4zOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4yOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4xOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4wOworICAgIH0gZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBNMkhfQ01EX0RPTkVfU1RSVUMsICpQTTJIX0NNRF9ET05FX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7CisgICAgc3RydWN0ICB7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7CisgICAgfSBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7CisjZW5kaWYKKworCisKKy8vCisvLyBNQ1VfTEVEQ1M6IE1DVSBMRUQgQ29udHJvbCBTZXR0aW5nLgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJUG9sYXJpdHk6MTsKKwkJVUNIQVIJCUxlZE1vZGU6NzsKKwl9IGZpZWxkOworCVVDSEFSCQkJCXdvcmQ7Cit9IE1DVV9MRURDU19TVFJVQywgKlBNQ1VfTEVEQ1NfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiAgX01DVV9MRURDU19TVFJVQyB7CisJc3RydWN0CXsKKwkJVUNIQVIJCUxlZE1vZGU6NzsKKwkJVUNIQVIJCVBvbGFyaXR5OjE7CisJfSBmaWVsZDsKKwlVQ0hBUgkJCXdvcmQ7Cit9IE1DVV9MRURDU19TVFJVQywgKlBNQ1VfTEVEQ1NfU1RSVUM7CisjZW5kaWYKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUmVnaXN0ZXIgZm9ybWF0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisKKy8vTkFWX1RJTUVfQ0ZHIDpOQVYKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9OQVZfVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVAkJcnN2OjY7CisJCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKKwkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCisJCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlOQVZfVElNRV9DRkdfU1RSVUMsICpQTkFWX1RJTUVfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCisJCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCisJCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKKwkJVVNIT1JUCQlyc3Y6NjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7CisjZW5kaWYKKworCisKKworCisvLworLy8gUlhfRklMVFJfQ0ZHOiAgL1JYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglSWF9GSUxUUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJOjE1OworCQlVSU5UMzIgICAgICAgRHJvcFJzdkNudGxUeXBlOjE7CisKKyAgICAgICAgCVVJTlQzMiAgICAgICAJRHJvcEJBUjoxOyAgICAgICAvLworCQlVSU5UMzIJCURyb3BCQToxOwkJLy8KKwkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKworCQlVSU5UMzIJCURyb3BDdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcENGRW5kQWNrOjE7CQkvLyBEcm9wIFBzLVBvbGwKKworCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCisJCVVJTlQzMgkJRHJvcEJjYXN0OjE7CQkvLyBEcm9wIGJyb2FkY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wTWNhc3Q6MTsJCS8vIERyb3AgbXVsdGljYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BWZXJFcnI6MTsJICAgIC8vIERyb3AgdmVyc2lvbiBlcnJvciBmcmFtZQorCisJCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQorCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCisJCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgorCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9GSUxUUl9DRkdfU1RSVUMsICpQUlhfRklMVFJfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX0ZJTFRSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlEcm9wQ1JDRXJyOjE7CQkvLyBEcm9wIENSQyBlcnJvcgorCQlVSU5UMzIJCURyb3BQaHlFcnI6MTsJCS8vIERyb3AgcGh5c2ljYWwgZXJyb3IKKwkJVUlOVDMyCQlEcm9wTm90VG9NZToxOwkJLy8gRHJvcCBub3QgdG8gbWUgdW5pY2FzdCBmcmFtZQorCQlVSU5UMzIJCURyb3BOb3RNeUJTU0lEOjE7CQkJLy8gRHJvcCBmcmFtIFRvRHMgYml0IGlzIHRydWUKKworCQlVSU5UMzIJCURyb3BWZXJFcnI6MTsJICAgIC8vIERyb3AgdmVyc2lvbiBlcnJvciBmcmFtZQorCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcEJjYXN0OjE7CQkvLyBEcm9wIGJyb2FkY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wRHVwbGljYXRlOjE7CQkvLyBEcm9wIGR1cGxpY2F0ZSBmcmFtZQorCisJCVVJTlQzMgkJRHJvcENGRW5kQWNrOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ0ZFbmQ6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcFJ0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcFBzUG9sbDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEJBOjE7CQkvLworICAgICAgICAJVUlOVDMyICAgICAgIAlEcm9wQkFSOjE7ICAgICAgIC8vCisKKwkJVUlOVDMyICAgICAgIAlEcm9wUnN2Q250bFR5cGU6MTsKKwkJVUlOVDMyCQk6MTU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9GSUxUUl9DRkdfU1RSVUMsICpQUlhfRklMVFJfQ0ZHX1NUUlVDOworI2VuZGlmCisKKworCisKKy8vCisvLyBQSFlfQ1NSNDogUkYgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUEhZX0NTUjRfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBSRiBwcm9ncmFtbWluZy4KKwkJVUlOVDMyCQlQTExfTEQ6MTsJCQkvLyBSRiBQTExfTEQgc3RhdHVzCisJCVVJTlQzMgkJSUZTZWxlY3Q6MTsJCQkvLyAxOiBzZWxlY3QgSUYJdG8gcHJvZ3JhbSwJMDogc2VsZWN0IFJGIHRvCXByb2dyYW0KKwkJVUlOVDMyCQlOdW1iZXJPZkJpdHM6NTsJCS8vIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwJUkZNRDoyMikKKwkJVUlOVDMyCQlSRlJlZ1ZhbHVlOjI0OwkJLy8gUmVnaXN0ZXIJdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIJaWQpCXNlcmlhbCBvdXQgdG8gUkYvSUYJY2hpcC4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1BIWV9DU1I0X1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJGUmVnVmFsdWU6MjQ7CQkvLyBSZWdpc3Rlcgl2YWx1ZSAoaW5jbHVkZSByZWdpc3RlcglpZCkJc2VyaWFsIG91dCB0byBSRi9JRgljaGlwLgorCQlVSU5UMzIJCU51bWJlck9mQml0czo1OwkJLy8gTnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBSRlJlZ1ZhbHVlIChJOjIwLAlSRk1EOjIyKQorCQlVSU5UMzIJCUlGU2VsZWN0OjE7CQkJLy8gMTogc2VsZWN0IElGCXRvIHByb2dyYW0sCTA6IHNlbGVjdCBSRiB0bwlwcm9ncmFtCisJCVVJTlQzMgkJUExMX0xEOjE7CQkJLy8gUkYgUExMX0xEIHN0YXR1cworCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgUkYgcHJvZ3JhbW1pbmcuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQSFlfQ1NSNF9TVFJVQywgKlBQSFlfQ1NSNF9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBTRUNfQ1NSNTogc2hhcmVkIGtleSB0YWJsZSBzZWN1cml0eSBtb2RlIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1NFQ19DU1I1X1NUUlVDCXsKKwlzdHJ1Y3QJeworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5M0NpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MkNpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MUNpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MENpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5M0NpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MkNpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MUNpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MENpcGhlckFsZzozOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfU0VDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MENpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MUNpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MkNpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5M0NpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MENpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MUNpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MkNpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisgICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5M0NpcGhlckFsZzozOworICAgICAgICBVSU5UMzIgICAgICAgOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTRUNfQ1NSNV9TVFJVQywgKlBTRUNfQ1NSNV9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBIT1NUX0NNRF9DU1I6IEZvciBIT1NUIHRvIGludGVycnVwdCBlbWJlZGRlZCBwcm9jZXNzb3IKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSE9TVF9DTURfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBSc3Y6MjQ7CisJICAgIFVJTlQzMiAgIEhvc3RDb21tYW5kOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIT1NUX0NNRF9DU1JfU1RSVUMsICpQSE9TVF9DTURfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0hPU1RfQ01EX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgSG9zdENvbW1hbmQ6ODsKKwkgICAgVUlOVDMyICAgUnN2OjI0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSE9TVF9DTURfQ1NSX1NUUlVDLCAqUEhPU1RfQ01EX0NTUl9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBBSUZTTl9DU1I6IEFJRlNOIGZvciBlYWNoIEVEQ0EgQUMKKy8vCisKKworCisvLworLy8gRTJQUk9NX0NTUjogRUVQUk9NIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRTJQUk9NX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSc3ZkOjI1OworCQlVSU5UMzIgICAgICAgTG9hZFN0YXR1czoxOyAgIC8vIDE6bG9hZGluZywgMDpkb25lCisJCVVJTlQzMgkJVHlwZToxOwkJCS8vIDE6IDkzQzQ2LCAwOjkzQzY2CisJCVVJTlQzMgkJRWVwcm9tRE86MTsKKwkJVUlOVDMyCQlFZXByb21ESToxOworCQlVSU5UMzIJCUVlcHJvbUNTOjE7CisJCVVJTlQzMgkJRWVwcm9tU0s6MTsKKwkJVUlOVDMyCQlSZWxvYWQ6MTsJCS8vIFJlbG9hZCBFRVBST00gY29udGVudCwgd3JpdGUgb25lIHRvIHJlbG9hZCwgc2VsZi1jbGVhcmVkLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRTJQUk9NX0NTUl9TVFJVQywgKlBFMlBST01fQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0UyUFJPTV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVsb2FkOjE7CQkvLyBSZWxvYWQgRUVQUk9NIGNvbnRlbnQsIHdyaXRlIG9uZSB0byByZWxvYWQsIHNlbGYtY2xlYXJlZC4KKwkJVUlOVDMyCQlFZXByb21TSzoxOworCQlVSU5UMzIJCUVlcHJvbUNTOjE7CisJCVVJTlQzMgkJRWVwcm9tREk6MTsKKwkJVUlOVDMyCQlFZXByb21ETzoxOworCQlVSU5UMzIJCVR5cGU6MTsJCQkvLyAxOiA5M0M0NiwgMDo5M0M2NgorCQlVSU5UMzIgICAgICAgTG9hZFN0YXR1czoxOyAgIC8vIDE6bG9hZGluZywgMDpkb25lCisJCVVJTlQzMgkJUnN2ZDoyNTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUUyUFJPTV9DU1JfU1RSVUMsICpQRTJQUk9NX0NTUl9TVFJVQzsKKyNlbmRpZgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBFMlBST00gZGF0YSBsYXlvdXQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIEVFUFJPTSBhbnRlbm5hIHNlbGVjdCBmb3JtYXQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX0FOVEVOTkFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVCAgICAgIFJzdjo0OworCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50CisJCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAorCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fQU5URU5OQV9TVFJVQywgKlBFRVBST01fQU5URU5OQV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCQlSeFBhdGg6NDsJLy8gMTogMVIsIDI6IDJSLCAzOiAzUgorCQlVU0hPUlQJCVR4UGF0aDo0OwkvLyAxOiAxVCwgMjogMlQKKwkJVVNIT1JUICAgICAgUmZJY1R5cGU6NDsgICAgICAgICAgICAgLy8gc2VlIEUyUFJPTSBkb2N1bWVudAorCQlVU0hPUlQgICAgICBSc3Y6NDsKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIF9FRVBST01fTklDX0NJTkZJRzJfU1RSVUMJeworCXN0cnVjdAl7CisgICAgICAgIFVTSE9SVAkJUnN2Mjo2OwkJCQkJLy8gbXVzdCBiZSAwCisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckE6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckc6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJRW5hYmxlV1BTUEJDOjE7ICAgICAgICAgICAgICAgICAvLyBXUFMgUEJDIENvbnRyb2wgYml0CisJCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckE6MTsKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yRzoxOworCQlVU0hPUlQJCUNhcmRidXNBY2NlbGVyYXRpb246MTsJLy8gISEhIE5PVEU6IDAgLSBlbmFibGUsIDEgLSBkaXNhYmxlCisJCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JBOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgNUcKKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckc6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciAyLjRHCisJCVVTSE9SVAkJRHluYW1pY1R4QWdjQ29udHJvbDoxOwkJCS8vCisJCVVTSE9SVAkJSGFyZHdhcmVSYWRpb0NvbnRyb2w6MTsJLy8gV2hldGhlciBSRiBpcyBjb250cm9sbGVkIGJ5IGRyaXZlciBvciBIVy4gMTplbmFibGUgaHcgY29udHJvbCwgMDpkaXNhYmxlCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7CisJc3RydWN0IHsKKwkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyAxOmVuYWJsZSwgMDpkaXNhYmxlCisJCVVTSE9SVAkJRHluYW1pY1R4QWdjQ29udHJvbDoxOwkJCS8vCisJCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JHOjE7CQkJCS8vCisJCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JBOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RworCQlVU0hPUlQJCUNhcmRidXNBY2NlbGVyYXRpb246MTsJLy8gISEhIE5PVEU6IDAgLSBlbmFibGUsIDEgLSBkaXNhYmxlCisJCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckc6MTsKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOworCQlVU0hPUlQJCUVuYWJsZVdQU1BCQzoxOyAgICAgICAgICAgICAgICAgLy8gV1BTIFBCQyBDb250cm9sIGJpdAorCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JHOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQorCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JBOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQorCQlVU0hPUlQJCVJzdjI6NjsgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMAorCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gVFhfUFdSIFZhbHVlIHZhbGlkIHJhbmdlIDB4RkEoLTYpIH4gMHgyNCgzNikKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCisJCUNIQVIJQnl0ZTA7CQkJCS8vIExvdyBCeXRlCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWF9QV1JfU1RSVUMJeworCXN0cnVjdAl7CisJCUNIQVIJQnl0ZTA7CQkJCS8vIExvdyBCeXRlCisJCUNIQVIJQnl0ZTE7CQkJCS8vIEhpZ2ggQnl0ZQorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9UWF9QV1JfU1RSVUMsICpQRUVQUk9NX1RYX1BXUl9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX1ZFUlNJT05fU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCVZlcnNpb247CQkJLy8gSGlnaCBCeXRlCisJCVVDSEFSCUZhZVJlbGVhc2VOdW1iZXI7CS8vIExvdyBCeXRlCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX1ZFUlNJT05fU1RSVUMsICpQRUVQUk9NX1ZFUlNJT05fU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX1ZFUlNJT05fU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCUZhZVJlbGVhc2VOdW1iZXI7CS8vIExvdyBCeXRlCisJCVVDSEFSCVZlcnNpb247CQkJLy8gSGlnaCBCeXRlCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX1ZFUlNJT05fU1RSVUMsICpQRUVQUk9NX1ZFUlNJT05fU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9MRURfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVAlSc3ZkOjM7CQkJCS8vIFJlc2VydmVkCisJCVVTSE9SVAlMZWRNb2RlOjU7CQkJLy8gTGVkIG1vZGUuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18zOjE7CS8vIFBvbGFyaXR5IEdQSU8jMyBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzI6MTsJLy8gUG9sYXJpdHkgR1BJTyMyIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18wOjE7CS8vIFBvbGFyaXR5IEdQSU8jMCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlSRFlfQToxOwkJLy8gUG9sYXJpdHkgUkRZX0Egc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX0xFRF9TVFJVQywgKlBFRVBST01fTEVEX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9MRURfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVAlQb2xhcml0eVJEWV9HOjE7CQkvLyBQb2xhcml0eSBSRFlfRyBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlSRFlfQToxOwkJLy8gUG9sYXJpdHkgUkRZX0Egc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5QUNUOjE7CQkvLyBQb2xhcml0eSBBQ1Qgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18wOjE7CS8vIFBvbGFyaXR5IEdQSU8jMCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzE6MTsJLy8gUG9sYXJpdHkgR1BJTyMxIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18zOjE7CS8vIFBvbGFyaXR5IEdQSU8jMyBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzQ6MTsJLy8gUG9sYXJpdHkgR1BJTyM0IHNldHRpbmcuCisJCVVTSE9SVAlMZWRNb2RlOjU7CQkJLy8gTGVkIG1vZGUuCisJCVVTSE9SVAlSc3ZkOjM7CQkJCS8vIFJlc2VydmVkCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX0xFRF9TVFJVQywgKlBFRVBST01fTEVEX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQorCQlVQ0hBUglUeXBlOjE7CQkJLy8gMTogcGx1cyB0aGUgZGVsdGEgdmFsdWUsIDA6IG1pbnVzIHRoZSBkZWx0YSB2YWx1ZQorCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKKwl9CWZpZWxkOworCVVDSEFSCXZhbHVlOworfQlFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQywgKlBFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJRGVsdGFWYWx1ZTo2OwkvLyBUeCBQb3dlciBkYWx0YSB2YWx1ZSAoTUFYPTQpCisJCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCisJCVVDSEFSCVR4UG93ZXJFbmFibGU6MTsvLyBFbmFibGUKKwl9CWZpZWxkOworCVVDSEFSCXZhbHVlOworfQlFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQywgKlBFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUU9TX0NTUjA6IFRYT1AgaG9sZGVyIGFkZHJlc3MwIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1FPU19DU1IwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQorCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVFPU19DU1IwX1NUUlVDLCAqUFFPU19DU1IwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1FPU19DU1IwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgorCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVFPU19DU1IwX1NUUlVDLCAqUFFPU19DU1IwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBRT1NfQ1NSMTogVFhPUCBob2xkZXIgYWRkcmVzczEgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUU9TX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlSc3ZkMTsKKwkJVUNIQVIJCVJzdmQwOworCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKKwkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlRT1NfQ1NSMV9TVFJVQywgKlBRT1NfQ1NSMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJUnN2ZDA7CisJCVVDSEFSCQlSc3ZkMTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVFPU19DU1IxX1NUUlVDLCAqUFFPU19DU1IxX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUJUkZfQ1NSX0NGRwkweDUwMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQJUnN2ZDE6MTQ7CQkJCS8vIFJlc2VydmVkCisJCVVJTlQJUkZfQ1NSX0tJQ0s6MTsJCQkvLyBraWNrIFJGIHJlZ2lzdGVyIHJlYWQvd3JpdGUKKwkJVUlOVAlSRl9DU1JfV1I6MTsJCQkvLyAwOiByZWFkICAxOiB3cml0ZQorCQlVSU5UCVJzdmQyOjM7CQkJCS8vIFJlc2VydmVkCisJCVVJTlQJVEVTVENTUl9SRkFDQ19SRUdOVU06NTsJLy8gUkYgcmVnaXN0ZXIgSUQKKwkJVUlOVAlSRl9DU1JfREFUQTo4OwkJCS8vIERBVEEKKwl9CWZpZWxkOworCVVJTlQJd29yZDsKK30JUkZfQ1NSX0NGR19TVFJVQywgKlBSRl9DU1JfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQJUkZfQ1NSX0RBVEE6ODsJCQkvLyBEQVRBCisJCVVJTlQJVEVTVENTUl9SRkFDQ19SRUdOVU06NTsJLy8gUkYgcmVnaXN0ZXIgSUQKKwkJVUlOVAlSc3ZkMjozOwkJCQkvLyBSZXNlcnZlZAorCQlVSU5UCVJGX0NTUl9XUjoxOwkJCS8vIDA6IHJlYWQgIDE6IHdyaXRlCisJCVVJTlQJUkZfQ1NSX0tJQ0s6MTsJCQkvLyBraWNrIFJGIHJlZ2lzdGVyIHJlYWQvd3JpdGUKKwkJVUlOVAlSc3ZkMToxNDsJCQkJLy8gUmVzZXJ2ZWQKKwl9CWZpZWxkOworCVVJTlQJd29yZDsKK30JUkZfQ1NSX0NGR19TVFJVQywgKlBSRl9DU1JfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNlbmRpZgkvLyBfX1JUMjhYWF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWIzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5jCkBAIC0wLDAgKzEsNjQ1MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgVUNPUworSU5UIElvY3RsUmVzcG9uc2UoUFVDSEFSIHBheWxvYWQsIFBVQ0hBUiBtc2csIElOVCBsZW4pOworI2VuZGlmIC8vIFVDT1MgLy8KKworI2lmZGVmIFJBTElOS19BVEUKK1VDSEFSIFRlbXBsYXRlRnJhbWVbMjRdID0gezB4MDgvKiBEYXRhIHR5cGUgKi8sMHgwMCwweDAwLDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMCwweEFBLDB4QkIsMHgxMiwweDM0LDB4NTYsMHgwMCwweDExLDB4MjIsMHhBQSwweEJCLDB4Q0MsMHgwMCwweDAwfTsJLy8gODAyLjExIE1BQyBIZWFkZXIsIFR5cGU6RGF0YSwgTGVuZ3RoOjI0Ynl0ZXMKK2V4dGVybiBSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXTsKK2V4dGVybiBVQ0hBUiBOVU1fT0ZfMjg1MF9DSE5MOworCisjaWZkZWYgUlQyODcwCitleHRlcm4gVUNIQVIgRXBUb1F1ZXVlW107CitleHRlcm4gVk9JRAlSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKAlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBVQ09TCitleHRlcm4gSU5UIENvbnNvbGVSZXNwb25zZShJTiBQVUNIQVIgYnVmZik7CitleHRlcm4gaW50ICgqcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKik7CisjZW5kaWYgLy8gVUNPUyAvLworCitzdGF0aWMgQ0hBUiBDQ0tSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIC0xfTsgLyogQ0NLIE1vZGUuICovCitzdGF0aWMgQ0hBUiBPRkRNUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgLTF9OyAvKiBPRkRNIE1vZGUuICovCitzdGF0aWMgQ0hBUiBIVE1JWFJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xfTsgLyogSFQgTWl4IE1vZGUuICovCisKK3N0YXRpYyBJTlQgVHhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBSeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wRG1hRW5hYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBFbmFibGUpOworCitzdGF0aWMgVk9JRCBCYnBTb2Z0UmVzZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQzMiBUeElkeCk7CisKK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpOworCitzdGF0aWMgSU5UIEFURUNtZEhhbmRsZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAorCUlOIFVDSEFSIE1vZGUsCisJSU4gVUNIQVIgTWNzKTsKKworCisjaWZkZWYgUlQyODcwCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4SW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhJTkZPX1NUUlVDIAlwVHhJbmZvLAorCUlOCSAgVVNIT1JUCQlVU0JETUFwa3RMZW4sCisJSU4JICBCT09MRUFOCQliV2l2LAorCUlOCSAgVUNIQVIJCQlRdWV1ZVNlbCwKKwlJTgkgIFVDSEFSCQkJTmV4dFZhbGlkLAorCUlOCSAgVUNIQVIJCQlUeEJ1cnN0KTsKKworc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwVHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCU1JTU9wcywKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJVHJhbnNtaXQpOworCisjZW5kaWYgLy8gUlQyODcwIC8vCisKK3N0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09ZW5kIG9mIHByb3RvdHlwZT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNpZmRlZiBSVDI4NzAKK3N0YXRpYyBJTlQgVHhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCByZXN1bHQ7CisJVVNCX0RNQV9DRkdfU1RSVUMgVXNiQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBVU0JfRE1BX0NGRywgJlVzYkNmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlpZiAoVXNiQ2ZnLmZpZWxkLlR4QnVzeSkKKwkJcmVzdWx0ID0gMTsKKwllbHNlCisJCXJlc3VsdCA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgSU5UIFJ4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQgcmVzdWx0OworCVVTQl9ETUFfQ0ZHX1NUUlVDIFVzYkNmZzsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0RNQV9DRkcsICZVc2JDZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJaWYgKFVzYkNmZy5maWVsZC5SeEJ1c3kpCisJCXJlc3VsdCA9IDE7CisJZWxzZQorCQlyZXN1bHQgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFZPSUQgUnRtcERtYUVuYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgRW5hYmxlKQoreworCUJPT0xFQU4gdmFsdWU7CisJVUxPTkcgV2FpdENudDsKKwlVU0JfRE1BX0NGR19TVFJVQyBVc2JDZmc7CisKKwl2YWx1ZSA9IEVuYWJsZSA+IDAgPyAxIDogMDsKKworCS8vIGNoZWNrIERNQSBpcyBpbiBidXN5IG1vZGUuCisJV2FpdENudCA9IDA7CisJd2hpbGUgKFR4RG1hQnVzeShwQWQpIHx8IFJ4RG1hQnVzeShwQWQpKQorCXsKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJCWlmIChXYWl0Q250KysgPiAxMDApCisJCQlicmVhazsKKwl9CisKKwkvL1doeSBub3QgdG8gY2xlYXIgVVNCIERNQSBUWCBwYXRoIGZpcnN0ID8/PworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0RNQV9DRkcsICZVc2JDZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJVXNiQ2ZnLmZpZWxkLlR4QnVsa0VuID0gdmFsdWU7CisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0VuID0gdmFsdWU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0RNQV9DRkcsIFVzYkNmZy53b3JkKTsJLy8gYWJvcnQgYWxsIFRYIHJpbmdzCisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworc3RhdGljIFZPSUQgQmJwU29mdFJlc2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIEJicERhdGEgPSAwOworCisJLy8gU29mdCByZXNldCwgc2V0IEJCUCBSMjEgYml0MD0xLT4wCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCAmQmJwRGF0YSk7CisJQmJwRGF0YSB8PSAweDAwMDAwMDAxOyAvL3NldCBiaXQwPTEKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCBCYnBEYXRhKTsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOworCUJicERhdGEgJj0gfigweDAwMDAwMDAxKTsgLy9zZXQgYml0MD0wCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQorCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCisJVUNIQVIgTW9kZSwKKwlVQ0hBUiBNY3MpCit7CisJaW50IGk7CisJUENIQVIgcFJhdGVUYWI7CisKKwlzd2l0Y2goTW9kZSkKKwl7CisJCWNhc2UgMDoKKwkJCXBSYXRlVGFiID0gQ0NLUmF0ZVRhYmxlOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBSYXRlVGFiID0gT0ZETVJhdGVUYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJCXBSYXRlVGFiID0gSFRNSVhSYXRlVGFibGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInVucmVjb2duaXphYmxlIFR4IE1vZGUgJWRcbiIsIE1vZGUpKTsKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCX0KKworCWkgPSAwOworCXdoaWxlKHBSYXRlVGFiW2ldICE9IC0xKQorCXsKKwkJaWYgKHBSYXRlVGFiW2ldID09IE1jcykKKwkJCXJldHVybiAwOworCQlpKys7CisJfQorCisJcmV0dXJuIC0xOworfQorCisjaWYgMQorc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gY2hhciBpbmRleCkKK3sKKwlVTE9ORyBSOworCUNIQVIgVHhQb3dlcjsKKwlVQ0hBUiBCYnA5NCA9IDA7CisJQk9PTEVBTiBiUG93ZXJSZWR1Y2UgPSBGQUxTRTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJLyogV2hlbiBRQSBpcyB1c2VkIGZvciBUeCwgcEFkLT5hdGUuVHhQb3dlcjAvMSBhbmQgcmVhbCB0eCBwb3dlcgorCQkqKiBhcmUgbm90IHN5bmNocm9uaXplZC4KKwkJKi8KKy8qCisJCXBBZC0+YXRlLlR4UG93ZXIwID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisJCXBBZC0+YXRlLlR4UG93ZXIxID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWlmIChUeFBvd2VyID4gMzEpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzMSAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKKwkJCQkvLworCQkJCVIgPSAzMTsKKwkJCQlpZiAoVHhQb3dlciA8PSAzNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIChVQ0hBUikoVHhQb3dlciAtIDMxKTsKKwkJCX0KKwkJCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwLCAtMSB+IC02IHVzZWQgYnkgQkJQIDk0CisJCQkJLy8KKwkJCQlSID0gMDsKKwkJCQlpZiAoVHhQb3dlciA+PSAtNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gMCB+IDMxCisJCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKKwkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CisJCX0KKwkJZWxzZS8vIDUuNSBHSHoKKwkJeworCQkJaWYgKFR4UG93ZXIgPiAxNSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDE1ICgweDBGKQorCQkJCS8vCisJCQkJUiA9IDE1OworCQkJfQorCQkJZWxzZSBpZiAoVHhQb3dlciA8IDApCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAKKwkJCQkvLworCQkJCS8vIC0xIH4gLTcKKwkJCQlBU1NFUlQoKFR4UG93ZXIgPj0gLTcpKTsKKwkJCQlSID0gKFVMT05HKShUeFBvd2VyICsgNyk7CisJCQkJYlBvd2VyUmVkdWNlID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyAwIH4gMTUKKwkJCQlSID0gKFVMT05HKSBUeFBvd2VyOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIpKTsKKwkJfQorCisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCXsKKwkJCQlSID0gUiA8PCA5OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUiA9IFIgPDwgNjsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCQkJfQorCQl9CisJCWVsc2UvLyA1LjVHSHoKKwkJeworCQkJaWYgKGJQb3dlclJlZHVjZSA9PSBGQUxTRSkKKwkJCXsKKwkJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCA3KSB8ICgxIDw8IDYpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKGluZGV4ID09IDApCisJCQkJeworCQkJCQlSID0gKFIgPDwgMTApOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCisJCQkJCS8qIENsZWFyIGJpdCA5IG9mIFIzIHRvIHJlZHVjZSA3ZEIuICovCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSAoUiAmICh+KDEgPDwgOSkpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDcpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCisJCQkJCS8qIENsZWFyIGJpdCA2IG9mIFI0IHRvIHJlZHVjZSA3ZEIuICovCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSAoUiAmICh+KDEgPDwgNikpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwkJcmV0dXJuIDA7CisJfQorfQorI2Vsc2UvLyAxIC8vCitzdGF0aWMgSU5UIEFURVR4UHdySGFuZGxlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBjaGFyIGluZGV4KQoreworCVVMT05HIFI7CisJQ0hBUiBUeFBvd2VyOworCVVDSEFSIEJicDk0ID0gMDsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJLy8gVE9ETzogaG93IHRvIGdldCBjdXJyZW50IFR4UG93ZXIwLzEgZnJvbSBwQWQtPkxhdGNoUmZSZWdzID8KKwkJLyogV2hlbiBRQSBpcyB1c2VkIGZvciBUeCwgcEFkLT5hdGUuVHhQb3dlcjAvMSBhbmQgcmVhbCB0eCBwb3dlcgorCQkqKiBhcmUgbm90IHN5bmNocm9uaXplZC4KKwkJKi8KKy8qCisJCXBBZC0+YXRlLlR4UG93ZXIwID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisJCXBBZC0+YXRlLlR4UG93ZXIxID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7CisKKwlpZiAoVHhQb3dlciA+IDMxKQorCXsKKwkJLy8KKwkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMzYgKDB4MjQpLCAzMSB+IDM2IHVzZWQgYnkgQkJQIDk0CisJCS8vCisJCVIgPSAzMTsKKwkJaWYgKFR4UG93ZXIgPD0gMzYpCisJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgKFVDSEFSKShUeFBvd2VyIC0gMzEpOworCX0KKwllbHNlIGlmIChUeFBvd2VyIDwgMCkKKwl7CisJCS8vCisJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMCwgLTEgfiAtNiB1c2VkIGJ5IEJCUCA5NAorCQkvLworCQlSID0gMDsKKwkJaWYgKFR4UG93ZXIgPj0gLTYpCisJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgVHhQb3dlcjsKKwl9CisJZWxzZQorCXsKKwkJLy8gMCB+IDMxCisJCVIgPSAoVUxPTkcpIFR4UG93ZXI7CisJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFIzPSVsZCwgQkJQX1I5ND0lZClcbiIsIF9fRlVOQ1RJT05fXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKKworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCWlmIChpbmRleCA9PSAwKQorCXsKKwkJUiA9IFIgPDwgOTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJfQorCWVsc2UKKwl7CisJCVIgPSBSIDw8IDY7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJeworCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVIgPSAoUiA8PCA3KSB8ICgxIDw8IDYpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQl9CisJCX0KKworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiAwOworCX0KK30KKyNlbmRpZiAvLyAxIC8vCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgb3BlcmF0aW9uIG1vZGUgdG8KKyAgICAgICAgMC4gQVRFU1RBUlQgID0gU3RhcnQgQVRFIE1vZGUKKyAgICAgICAgMS4gQVRFU1RPUCAgID0gU3RvcCBBVEUgTW9kZQorICAgICAgICAyLiBUWENPTlQgICAgPSBDb250aW51b3VzIFRyYW5zbWl0CisgICAgICAgIDMuIFRYQ0FSUiAgICA9IFRyYW5zbWl0IENhcnJpZXIKKyAgICAgICAgNC4gVFhGUkFNRSAgID0gVHJhbnNtaXQgRnJhbWVzCisgICAgICAgIDUuIFJYRlJBTUUgICA9IFJlY2VpdmUgRnJhbWVzCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKyAgICAgICAgNi4gVFhTVE9QICAgID0gU3RvcCBBbnkgVHlwZSBvZiBUcmFuc21pdGlvbgorICAgICAgICA3LiBSWFNUT1AgICAgPSBTdG9wIFJlY2VpdmluZyBGcmFtZXMKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT1FbmQgb2YgUlQyODYwPT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PVN0YXJ0IG9mIFJUMjg3MD09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmIFJUMjg3MAorc3RhdGljIElOVAlBVEVDbWRIYW5kbGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIJCQlWYWx1ZTsKKwlVQ0hBUgkJCUJicERhdGE7CisJVUlOVDMyICAgICAgICAgIE1hY0RhdGE7CisJVUlOVAkJCWk9MCwgYXRlbW9kZTsKKwkvL05ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCS8vUFVDSEFSCQkJcERlc3Q7CisJVUlOVDMyIAkJCXRlbXA7CisJVUxPTkcJCQlJcnFGbGFnczsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQVRFQ21kSGFuZGxlcigpXG4iKSk7CisJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKwkvKiBBc2ljTG9ja0NoYW5uZWwoKSBpcyBlbXB0eSBmdW5jdGlvbiBzbyBmYXIgaW4gZmFjdCAqLworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+YXRlLkNoYW5uZWwpOworCisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJQmJwRGF0YSA9IDA7CisKKwkvKiBFbnRlciBBVEUgbW9kZSBhbmQgc2V0IFR4L1J4IElkbGUgKi8KKwlpZiAoIXN0cmNtcChhcmcsICJBVEVTVEFSVCIpKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQk9PTEVBTiAgICAgICBDYW5jZWxsZWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogQVRFU1RBUlRcbiIpKTsKKworCQluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7CisvLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSBwQWQtPmF0ZS5UeENvdW50OworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgYXV0byByZXNwb25kZXIKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZ0ZW1wKTsKKwkJdGVtcCA9IHRlbXAgJiAweEZGRkZGRkZFOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIHRlbXApOworCisJCS8vIHJlYWQgTUFDX1NZU19DVFJMIGFuZCBiYWNrdXAgTUFDX1NZU19DVFJMIHZhbHVlLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQkvLyBjbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCisJCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKKwkJLy8gU3RvcCBjb250aW51b3VzIFRYIHByb2R1Y3Rpb24gdGVzdC4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsvL2Rpc2FibGUgb3IgY2FuY2VsIHBlbmRpbmcgaXJwIGZpcnN0ID8/PworCisgICAgICAgIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUikKKwkJeworCQkJLy8gTm8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MCwgYml0Nj0wLCBiaXRbNX4wXT0weDAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJfQorCQllbHNlIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUlNVUFApCisJCXsKKwkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkJLy8gTm8gQ2FycmllciBTdXBwcmVzc2lvbiBzZXQgQkJQIFIyNCBiaXQwPTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRkZFOyAvL2NsZWFyIGJpdDAKKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIEJicERhdGEpOworCQl9CisJCS8vIFdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggYWxsb2NhdGUgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJLy8gVE9ETzpTaG91bGQgd2UgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQgd2hlbiBMb29wQmFjayBhbmQgQVRFX1NUT1AgPworCQllbHNlIGlmICgoYXRlbW9kZSAmIEFURV9UWEZSQU1FKSB8fCAoYXRlbW9kZSA9PSBBVEVfU1RPUCkpCisJCXsKKwkJCWlmIChhdGVtb2RlICYgQVRFX1RYQ09OVCkKKwkJCXsKKwkJCQkvLyBOb3QgQ29udC4gVFggYW55bW9yZSwgc28gc2V0IEJCUCBSMjIgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQkJfQorCQkJLy8gQWJvcnQgVHgsIFJ4IERNQS4KKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkJeworCQkJCS8vIEl0IHNlZW1zIG5vdGhpbmcgdG8gZnJlZSwKKwkJCQkvLyBiZWNhdXNlIHdlIGRpZG4ndCBhbGxvY2F0ZSBhbnkgcmVzb3VyY2Ugd2hlbiB3ZSBlbnRlcmVkIEFURV9UWEZSQU1FIG1vZGUgbGF0ZXN0bHkuCisJCQl9CisKKwkJCS8vIFN0YXJ0IFR4LCBSWCBETUEKKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKwkJfQorCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vCisJCS8vIEl0IHdpbGwgYmUgY2FsbGVkIGluIE1sbWVTdXNwZW5kKCkuCisJCS8vCisJCS8vIENhbmNlbCBwZW5kaW5nIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAgICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICAgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsJLyogbm90IHVzZWQgaW4gUlQyOHh4ICovCisJCVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUocEFkKTsKKworCQkvLyBTb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyBvbiwgc28gd2UgYXZvaWQgY2FsbGluZyBNbG1lU3VzcGVuZCgpLgorLy8JCU1sbWVTdXNwZW5kKHBBZCwgVFJVRSk7CisJCS8vUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgYnVsayBpbi9vdXQgSVJQcyBiZWZvcmUgd2UgZ28gb24uCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQkvKiBwQWQtPlBlbmRpbmdSeCBpcyBub3Qgb2YgdHlwZSBhdG9taWNfdCBhbnltb3JlIGluIDI4eHggKi8KKy8vCQl3aGlsZSAoKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKSkJLy9wQWQtPkJ1bGtGbGFncyAhPSAwIHdhaXQgYnVsayBvdXQgZmluaXNoCisJCXdoaWxlICgocEFkLT5QZW5kaW5nUnggPiAwKSkJLy9wQWQtPkJ1bGtGbGFncyAhPSAwIHdhaXQgYnVsayBvdXQgZmluaXNoCisJCXsKKyNpZiAxCisJCQlBVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisjZWxzZQorCQkJTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisjZW5kaWYKKwkJCS8qIGRlbGF5IDAuNSBzZWNvbmRzICovCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCQlwQWQtPlBlbmRpbmdSeCA9IDA7CisJCX0KKwkJLyogcGV0ZXIgOiB3aHkgZG9uJ3Qgd2UgaGF2ZSB0byBnZXQgQnVsa091dExvY2sgZmlyc3QgPyAqLworCQl3aGlsZSAoKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMV0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1syXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzNdID09IFRSVUUpKSAmJiAocEFkLT5CdWxrRmxhZ3MgIT0gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl7CisJCQlkbworCQkJeworCQkJCS8qIHBBZC0+QnVsa091dFBlbmRpbmdbeV0gd2lsbCBiZSBzZXQgdG8gRkFMU0UgaW4gUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpICovCisJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOworCQkJfSB3aGlsZSAoRkFMU0UpOworCisJCQkvKiB3ZSBoYXZlIGVub3VnaCB0aW1lIGRlbGF5IGluIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKQorCQkJKiogc28gdGhpcyBpcyBub3QgbmVjZXNzYXJ5CisJCQkqLworLy8JCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQkvKiBwQWQtPlBlbmRpbmdSeCBpcyBub3Qgb2YgdHlwZSBhdG9taWNfdCBhbnltb3JlIGluIDI4eHggKi8KKy8vCQlBU1NFUlQoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKTsKKwkJQVNTRVJUKHBBZC0+UGVuZGluZ1J4ID09IDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyByZXNldCBSeCBzdGF0aXN0aWNzLgorCQlwQWQtPmF0ZS5MYXN0U05SMCA9IDA7CisJCXBBZC0+YXRlLkxhc3RTTlIxID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kwID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kxID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kyID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTAgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMSA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTBYOCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxWDggPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMlg4ID0gMDsKKwkJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlID0gMDsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCS8vIFR4IGZyYW1lCisJCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOworCQlwQWQtPmF0ZS5zZXEgPSAwOworCisJCS8vIGNvdW50ZXJzCisJCXBBZC0+YXRlLlUyTSA9IDA7CisJCXBBZC0+YXRlLk90aGVyRGF0YSA9IDA7CisJCXBBZC0+YXRlLkJlYWNvbiA9IDA7CisJCXBBZC0+YXRlLk90aGVyQ291bnQgPSAwOworCQlwQWQtPmF0ZS5UeEFjMCA9IDA7CisJCXBBZC0+YXRlLlR4QWMxID0gMDsKKwkJcEFkLT5hdGUuVHhBYzIgPSAwOworCQlwQWQtPmF0ZS5UeEFjMyA9IDA7CisJCXBBZC0+YXRlLlR4SENDQSA9IDA7CisJCXBBZC0+YXRlLlR4TWdtdCA9IDA7CisJCXBBZC0+YXRlLlJTU0kwID0gMDsKKwkJcEFkLT5hdGUuUlNTSTEgPSAwOworCQlwQWQtPmF0ZS5SU1NJMiA9IDA7CisJCXBBZC0+YXRlLlNOUjAgPSAwOworCQlwQWQtPmF0ZS5TTlIxID0gMDsKKworCQkvLyBjb250cm9sCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOyAvLyB0YXNrIFR4IHN0YXR1cyAvLyAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisKKwkJLyoKKwkJKiogSWYgd2Ugc2tpcCAiTGlua0Rvd24oKSIsIHdlIHNob3VsZCBkaXNhYmxlIHByb3RlY3Rpb24KKwkJKiogdG8gcHJldmVudCBmcm9tIHNlbmRpbmcgb3V0IFJUUyBvciBDVFMtdG8tc2VsZi4KKwkJKi8KKwkJQVRFRGlzYWJsZUFzaWNQcm90ZWN0KHBBZCk7CisJCVJUTVBTdGF0aW9uU3RvcChwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJCUJicERhdGEgPSAwOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCisJCS8vIENsZWFuIGJpdDQgdG8gc3RvcCBjb250aW51b3VzIFR4IHByb2R1Y3Rpb24gdGVzdC4KKwkJTWFjRGF0YSAmPSAweEZGRkZGRkVGOworCSAgIAlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkgICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisJCS8vQ2xlYW4gQVRFIEJ1bGsgaW4vb3V0IGNvdW50ZXIgYW5kIGNvbnRpbnVlIHNldHVwCisJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+QnVsa091dFJlbWFpbmVkLCAwKTsKKworCQkvKiBOZGlzQWNxdWlyZVNwaW5Mb2NrKCkvTmRpc1JlbGVhc2VTcGluTG9jaygpIG5lZWQgb25seSBvbmUgYXJndW1lbnQgaW4gUlQyOHh4ICovCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBGQUxTRTsKKwkJcEFkLT5Db250aW5CdWxrSW4gPSBGQUxTRTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJBVEVTVE9QIikpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEUgOiBBVEVTVE9QID09PT5cbiIpKTsKKworCQkvLyBEZWZhdWx0IHZhbHVlIGluIEJCUCBSMjIgaXMgMHgwLgorCQlCYnBEYXRhID0gMDsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsvLzA4MjAKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOyAvLyByZWNvdmVyIHRoZSBNQUNfU1lTX0NUUkwgcmVnaXN0ZXIgYmFjay4KKworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8qCisJCSoqIEFib3J0IFR4LCBSWCBETUEuCisJCSoqIFEgICA6IEhvdyB0byBkbyB0aGUgZm9sbG93aW5nIEkvTyBpZiBUeCwgUnggRE1BIGlzIGFib3J0ZWQgPworCQkqKiBBbnMgOiBCdWxrIGVuZHBvaW50cyBhcmUgYWJvcnRlZCwgd2hpbGUgdGhlIGNvbnRyb2wgZW5kcG9pbnQgaXMgbm90LgorCQkqLworCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgYnVsayBpbi9vdXQgSVJQcyBiZWZvcmUgd2UgZ28gb24uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJd2hpbGUgKHBBZC0+UGVuZGluZ1J4ID4gMCkKKwkJeworI2lmIDEKKwkJCUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKyNlbHNlCisvLwkJCU5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJcEFkLT5QZW5kaW5nUngtLTsKKyNlbmRpZgorCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJd2hpbGUgKCgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzFdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMl0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1szXSA9PSBUUlVFKSkgJiYgKHBBZC0+QnVsa0ZsYWdzICE9IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJfQorCisvLwkJQVNTRVJUKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPT0gMCk7CisJCUFTU0VSVChwQWQtPlBlbmRpbmdSeCA9PSAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgIFJlc2V0IFJ4IFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8vCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlBlbmRpbmdSeCwgMCk7CisJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCA9IFJYX1JJTkdfU0laRSAtIDE7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJCXsKKwkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCQlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgTUFYX1JYQlVMS19TSVpFKTsKKwkJCS8qIHBldGVyIDogd2h5IGRvbid0IHdlIGhhdmUgdG8gZ2V0IEJ1bGtJbkxvY2sgZmlyc3QgPyAqLworCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOworCQkJcFJ4Q29udGV4dC0+cElycCA9IE5VTEw7CisgICAgICAgICAgICAvKiBwZXRlciBkZWJ1ZyArKyAqLworCQkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisgICAgICAgICAgICAvKiBwZXRlciBkZWJ1ZyAtLSAqLworCQkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOworLy8JCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKy8vCQkJcFJ4Q29udGV4dC0+UmVhZFBvc09mZnNldCA9IDA7CisJCX0KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgUmVzZXQgVHggUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQlkbworCQl7CisJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCX0gd2hpbGUgKEZBTFNFKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJLy8gRW5hYmxlIGF1dG8gcmVzcG9uZGVyLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJnRlbXApOworCQl0ZW1wID0gdGVtcCB8ICgweDAxKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCB0ZW1wKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCisJCS8qIFNvZnQgcmVzZXQgQkJQLiovCisJCS8qIEluIDI4NzAgY2hpcHNldCwgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKSA9PSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKSAqLworCQkvKiBCb3RoIHJ0Mjg3MGFwIGFuZCBydDI4NzBzdGEgdXNlIEJicFNvZnRSZXNldChwQWQpIHRvIGRvIEJCUCBzb2Z0IHJlc2V0ICovCisJCUJicFNvZnRSZXNldChwQWQpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQorCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlICAgPSBBU1NPQ19JRExFOworCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7CisJCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgICAgPSBTWU5DX0lETEU7CisJCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJLy8KKwkJCS8vID09PT4gcmVmZXIgdG8gTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoKS4KKwkJCS8vIFdoZW4gd2UgZW50ZXJlZCBBVEVfU1RBUlQgbW9kZSwgUGVyaW9kaWNUaW1lciB3YXMgbm90IGNhbmNlbGxlZC4KKwkJCS8vIFNvIHdlIGRvbid0IGhhdmUgdG8gc2V0IGl0IGhlcmUuCisJCQkvLworCQkJLy9SVE1QU2V0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIE1MTUVfVEFTS19FWEVDX0lOVFYpOworCisJCQlBU1NFUlQocEFkLT5Db21tb25DZmcuQ2hhbm5lbCAhPSAwKTsKKworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCSAgICBSVE1QU3RhdGlvblN0YXJ0KHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKy8vCisvLyBUaGVzZSB0d28gc3RlcHMgaGF2ZSBiZWVuIGRvbmUgd2hlbiBlbnRlcmluZyBBVEVfU1RPUCBtb2RlLgorLy8KKyNpZiAwCisJICAgIFJUVVNCV3JpdGVCQlBSZWdpc3RlcihwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCSAgIAlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOworI2VuZGlmCisJCS8vIENsZWFuIEFURSBCdWxrIGluL291dCBjb3VudGVyIGFuZCBjb250aW51ZSBzZXR1cC4KKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIDApOworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKwkJcEFkLT5Db250aW5CdWxrT3V0ID0gRkFMU0U7CisJCXBBZC0+Q29udGluQnVsa0luID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCS8qIFdhaXQgNTBtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgZHVyaW5nIEhXIHJlc2V0LiAqLworCQkvKiB0b2RvIDogcmVtb3ZlIHRoaXMgaWYgbm90IG5lY2Vzc2FyeSAqLworCQlOZGlzTVNsZWVwKDUwMDAwKTsKKworCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8qIHJlc3RvcmUgUlhfRklMVFJfQ0ZHICovCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8qIHJlc3RvcmUgUlhfRklMVFJfQ0ZHIGluIG9yZGVyIHRoYXQgUUEgbWF5YmUgc2V0IGl0IHRvIDB4MyAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJCS8vIEVuYWJsZSBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gV2FpdCAxMG1zIHRvIHdhaXQgYWxsIG9mIHRoZSBidWxrLWluIFVSQnMgdG8gY29tcGxldGUuCisJCS8qIHRvZG8gOiByZW1vdmUgdGhpcyBpZiBub3QgbmVjZXNzYXJ5ICovCisJCU5kaXNNU2xlZXAoMTAwMDApOworCisJCS8vIEV2ZXJ5dGhpbmcgaXMgcmVhZHkgdG8gc3RhcnQgbm9ybWFsIFR4L1J4LgorCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBBVEUgOiBBVEVTVE9QIFxuIikpOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ0FSUiIpKQkvLyBUeCBDYXJyaWVyCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYQ0FSUlxuIikpOworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlI7CisKKwkJLy8gRGlzYWJsZSBSeAorCQkvLyBNYXkgYmUgd2UgbmVlZCBub3QgdG8gZG8gdGhpcywgYmVjYXVzZSB0aGVzZSBoYXZlIGJlZW4gZG9uZSBpbiBBVEVfU1RBUlQgbW9kZSA/Pz8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gUUEgaGFzIGRvbmUgdGhlIGZvbGxvd2luZyBzdGVwcyBpZiBpdCBpcyB1c2VkLgorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gU29mdCByZXNldCBCQlAuCisJCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkJLy8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkJQmJwRGF0YSB8PSAweDAwMDAwMEMxOyAvL3NldCBiaXQ3PTEsIGJpdDY9MSwgYml0WzV+MF09MHgwMQorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCAoYml0NCkgPSAxCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCVZhbHVlID0gVmFsdWUgfCAweDAwMDAwMDEwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWENPTlQiKSkJLy8gVHggQ29udGludWUKKwl7CisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCS8qIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBiaXQ0KENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0KQorCQkJICAgYW5kIGJpdDIoTUFDIFRYIGVuYWJsZSkgYmFjayB0byB6ZXJvLiAqLworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJCU1hY0RhdGEgJj0gMHhGRkZGRkZFQjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJCS8vIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGN0Y7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKworCQkvKiBmb3IgVHhDb250IG1vZGUuCisJCSoqIFN0ZXAgMTogU2VuZCA1MCBwYWNrZXRzIGZpcnN0IHRoZW4gd2FpdCBmb3IgYSBtb21lbnQuCisJCSoqIFN0ZXAgMjogU2VuZCBtb3JlIDUwIHBhY2tldCB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCisJCSovCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDT05UXG4iKSk7CisJCS8vIFN0ZXAgMTogc2VuZCA1MCBwYWNrZXRzIGZpcnN0LgorCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENPTlQ7CisJCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCS8vIFNvZnQgcmVzZXQgQkJQLgorCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKworCQkvKiBPbmx5IG5lZWRlZCBpZiB3ZSBoYXZlIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLiAqLworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCS8vIFNldHVwIGZyYW1lIGZvcm1hdC4KKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gU3RhcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCisJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+QnVsa091dFJlbWFpbmVkLCBwQWQtPmF0ZS5UeENvdW50KTsKKworI2lmZGVmCVJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2VuZGlmCS8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7Ly8wODIwCisJCXBBZC0+Q29udGluQnVsa091dCA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKworCQkvLyBLaWNrIGJ1bGsgb3V0CisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCQkvKiBUbyBtYWtlIHN1cmUgYWxsIHRoZSA1MCBmcmFtZXMgaGF2ZSBiZWVuIGJ1bGsgb3V0IGJlZm9yZSBleGVjdXRpbmcgc3RlcCAyICovCisJCXdoaWxlIChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID4gMCkKKwkJeworCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJfQorCisJCS8vIFN0ZXAgMjogc2VuZCBtb3JlIDUwIHBhY2tldHMgdGhlbiBzdGFydCBjb250aW51ZSBtb2RlLgorCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0xCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQlCYnBEYXRhIHw9IDB4MDAwMDAwODA7IC8vc2V0IGJpdDc9MQorCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQlwQWQtPmF0ZS5UeENvdW50ID0gNTA7CisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCS8vIFNldHVwIGZyYW1lIGZvcm1hdC4KKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKworCQkvLyBTdGFydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIHBBZC0+YXRlLlR4Q291bnQpOworCisjaWZkZWYJUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOworCQkJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCQl9CisjZW5kaWYJLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsvLzA4MjAKKwkJcEFkLT5Db250aW5CdWxrT3V0ID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCQkvLyBLaWNrIGJ1bGsgb3V0CisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworI2lmIDEKKwkJUlRNUHVzZWNEZWxheSg1MDApOworI2Vsc2UKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKQorCQl7CisJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQl9CisjZW5kaWYgLy8gMSAvLworCisJCS8vIFNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCAoYml0NCkgPSAxLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQlNYWNEYXRhIHw9IDB4MDAwMDAwMTA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhGUkFNRSIpKQkvLyBUeCBGcmFtZXMKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhGUkFNRShDb3VudD0weCUwOHgpXG4iLCBwQWQtPmF0ZS5UeENvdW50KSk7CisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYRlJBTUU7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJCUJicERhdGEgPSAwOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisKKwkgICAJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkvLyBhZGQgdGhpcyBmb3IgTG9vcEJhY2sgbW9kZQorCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gRGlzYWJsZSBSeAorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJfQorCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2Vsc2UKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisgICAgICAgIFNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworICAgICAgICAvLyBTZXR1cCBmcmFtZSBmb3JtYXQKKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIFN0YXJ0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBDaGVjayBjb3VudCBpcyBjb250aW51b3VzIG9yIG5vdCB5ZXQuCisJCS8vCisJCS8vIER1ZSB0byB0aGUgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuICJwQWQtPkJ1bGtPdXRSZW1haW5lZCIoYXRvbWljX3QpIGFuZCAicEFkLT5hdGUuVHhDb3VudCIoVUlOVDMyKQorCQkvLworCQlpZiAocEFkLT5hdGUuVHhDb3VudCA9PSAwKQorCQl7CisJCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgcEFkLT5hdGUuVHhDb3VudCk7CisJCX0KKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYnVsayBvdXQgY291bnQgPSAlZFxuIiwgYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSkpOworCQlBU1NFUlQoKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPj0gMCkpOworCisJCWlmIChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID09IDApCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgcGFja2V0IGNvdW50aW51b3VzbHlcbiIpKTsKKworCQkJLyogSW4gMjh4eCwgTmRpc0FjcXVpcmVTcGluTG9jaygpID09IHNwaW5fbG9ja19iaCgpICovCisJCQkvKiBOZGlzQWNxdWlyZVNwaW5Mb2NrIG9ubHkgbmVlZCBvbmUgYXJndW1lbnQgaW4gMjh4eC4gKi8KKwkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCQkJcEFkLT5Db250aW5CdWxrT3V0ID0gVFJVRTsKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCQkvKiBJbiAyOHh4LCBCVUxLX09VVF9MT0NLKCkgPT0gc3Bpbl9sb2NrX2lycXNhdmUoKSAqLworCQkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOy8vIHBldGVyIDogTmRpc0FjcXVpcmVTcGluTG9jayA9PT4gQlVMS19PVVRfTE9DSworCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7Ly8gcGV0ZXIgOiBOZGlzQWNxdWlyZVNwaW5Mb2NrID09PiBCVUxLX09VVF9MT0NLCisJCX0KKwkJZWxzZQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIHBhY2tldHMgZGVwZW5kIG9uIGNvdW50ZXJcbiIpKTsKKworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisJCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBGQUxTRTsKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwkJfQorCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCisJCS8vIEtpY2sgYnVsayBvdXQKKwkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCX0KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhTVE9QIikpIAkJLy9FbnRlciBBVEUgbW9kZSBhbmQgc2V0IFR4L1J4IElkbGUKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhTVE9QXG4iKSk7CisKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1RYU1RPUDsKKwkJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSKQorCQl7CisJCQkvLyBObyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0wLCBiaXQ2PTAsIGJpdFs1fjBdPTB4MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGMDA7IC8vY2xlYXIgYml0NywgYml0NiwgYml0WzV+MF0KKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQl9CisJCWVsc2UgaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSU1VQUCkKKwkJeworCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vY2xlYXIgYml0MAorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgQmJwRGF0YSk7CisJCX0KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisJCQlpZiAoYXRlbW9kZSAmIEFURV9UWENPTlQpCisJCQl7CisJCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQkJfQorCQl9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisJCS8qIG5vdCB1c2VkIGluIFJUMjh4eCAqLworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsKKwkJLyogZW1wdHkgZnVuY3Rpb24gc28gZmFyICovCisJCVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUocEFkKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkJLyogSW4gMjh4eCwgcEFkLT5QZW5kaW5nUnggaXMgbm90IG9mIHR5cGUgYXRvbWljX3QgYW55bW9yZSAqLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJLyogcGV0ZXIgdG9kbyA6IEJ1bGtJbkxvY2sgKi8KKwkJd2hpbGUgKHBBZC0+UGVuZGluZ1J4ID4gMCkKKwkJeworI2lmIDEKKwkJCUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKyNlbHNlCisvLwkJCU5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJcEFkLT5QZW5kaW5nUngtLTsKKyNlbmRpZgorCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJd2hpbGUgKCgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzFdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMl0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1szXSA9PSBUUlVFKSkgJiYgKHBBZC0+QnVsa0ZsYWdzICE9IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJfQorCisJCUFTU0VSVChwQWQtPlBlbmRpbmdSeCA9PSAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8vIEVuYWJsZSBUeCwgUnggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLyogdGFzayBUeCBzdGF0dXMgOiAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZyAqLworCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIERpc2FibGUgVHgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJTWFjRGF0YSAmPSAoMHhmZmZmZmZmYik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJLy9DbGVhbiBBVEUgQnVsayBpbi9vdXQgY291bnRlciBhbmQgY29udGludWUgc2V0dXAKKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIDApOworCisJCXBBZC0+Q29udGluQnVsa091dCA9IEZBTFNFOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlJYU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWFNUT1BcbiIpKTsKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQlwQWQtPmF0ZS5Nb2RlICY9IEFURV9SWFNUT1A7CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisJCS8qIG5vdCB1c2VkIGluIFJUMjh4eCAqLworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsKKwkJUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZShwQWQpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQorCQl3aGlsZSAocEFkLT5QZW5kaW5nUnggPiAwKQorCQl7CisjaWYgMQorCQkJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworI2Vsc2UKKy8vCQkJTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQlwQWQtPlBlbmRpbmdSeC0tOworI2VuZGlmCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQl3aGlsZSAoKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMV0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1syXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzNdID09IFRSVUUpKSAmJiAocEFkLT5CdWxrRmxhZ3MgIT0gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl7CisJCQlkbworCQkJeworCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwkJCX0gd2hpbGUgKEZBTFNFKTsKKworCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJQVNTRVJUKHBBZC0+UGVuZGluZ1J4ID09IDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisJCXBBZC0+Q29udGluQnVsa0luID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWEZSQU1FIikpIC8vIFJ4IEZyYW1lcworCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWEZSQU1FXG4iKSk7CisKKwkJLy8gRGlzYWJsZSBSeCBvZiBNQUMgYmxvY2sKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRGVmYXVsdCB2YWx1ZSBpbiBCQlAgUjIyIGlzIDB4MC4KKwkJQmJwRGF0YSA9IDA7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisKKwkgICAJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfUlhGUkFNRTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUWCBvZiBNQUMgYmxvY2sKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gUmVzZXQgUnggUklORy4KKwkJZm9yICggaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCQl7CisJCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCisJCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKworCQkJLy8KKwkJCS8vIEdldCB0aGUgdXJiIGZyb20ga2VybmVsIGJhY2sgdG8gZHJpdmVyLgorCQkJLy8KKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisKKwkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrLiAqLworCQkJTmRpc01TbGVlcCgyMDApOworCQkJcEFkLT5CdWxrSW5SZXEgPSAwOworCisvLwkJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+UGVuZGluZ1J4LCAwKTsKKwkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IFJYX1JJTkdfU0laRSAtIDE7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisJCX0KKworCQkvLyByZWFkIHRvIGNsZWFyIGNvdW50ZXJzCisJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgUlhfU1RBX0NOVDAsICZ0ZW1wKTsgLy9SWCBQSFkgJiBSWCBDUkMgY291bnQKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSWF9TVEFfQ05UMSwgJnRlbXApOyAvL1JYIFBMQ1AgZXJyb3IgY291bnQgJiBDQ0EgZmFsc2UgYWxhcm0gY291bnQKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSWF9TVEFfQ05UMiwgJnRlbXApOyAvL1JYIEZJRk8gb3ZlcmZsb3cgZnJhbWUgY291bnQgJiBSWCBkdXBsaWNhdGVkIGZpbHRlcmVkIGZyYW1lIGNvdW50CisKKwkJcEFkLT5Db250aW5CdWxrSW4gPSBUUlVFOworCisJCS8vIEVuYWJsZSBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFJYIG9mIE1BQyBibG9jaworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIEtpY2sgYnVsayBpbgorCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogSW52YWxpZCBhcmchXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gQVRFQ21kSGFuZGxlcigpXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworSU5UCVNldF9BVEVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJaWYgKEFURUNtZEhhbmRsZXIocEFkLCBhcmcpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9Qcm9jIEZhaWxlZFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgQUREUjE9REEgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCisgICAgICAgIG9yCisgICAgICAgIFNldCBBVEUgQUREUjM9REEgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0RBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaTsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjNbaSsrXSwgMSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJaWYoaSAhPSA2KQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9EQV9Qcm9jIChEQSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkLT5hdGUuQWRkcjNbMF0sCisJCXBBZC0+YXRlLkFkZHIzWzFdLCBwQWQtPmF0ZS5BZGRyM1syXSwgcEFkLT5hdGUuQWRkcjNbM10sIHBBZC0+YXRlLkFkZHIzWzRdLCBwQWQtPmF0ZS5BZGRyM1s1XSkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0RBX1Byb2MgU3VjY2Vzc1xuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBBRERSMz1TQSBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKKyAgICAgICAgb3IKKyAgICAgICAgU2V0IEFURSBBRERSMj1TQSBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfU0FfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlpOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyMltpKytdLCAxKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwlpZihpICE9IDYpCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1NBX1Byb2MgKFNBID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWQtPmF0ZS5BZGRyMlswXSwKKwkJcEFkLT5hdGUuQWRkcjJbMV0sIHBBZC0+YXRlLkFkZHIyWzJdLCBwQWQtPmF0ZS5BZGRyMlszXSwgcEFkLT5hdGUuQWRkcjJbNF0sIHBBZC0+YXRlLkFkZHIyWzVdKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfU0FfUHJvYyBTdWNjZXNzXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIEFERFIyPUJTU0lEIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQorICAgICAgICBvcgorICAgICAgICBTZXQgQVRFIEFERFIxPUJTU0lEIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9CU1NJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWk7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIxW2krK10sIDEpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCWlmKGkgIT0gNikKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQlNTSURfUHJvYyAoQlNTSUQgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsCXBBZC0+YXRlLkFkZHIxWzBdLAorCQlwQWQtPmF0ZS5BZGRyMVsxXSwgcEFkLT5hdGUuQWRkcjFbMl0sIHBBZC0+YXRlLkFkZHIxWzNdLCBwQWQtPmF0ZS5BZGRyMVs0XSwgcEFkLT5hdGUuQWRkcjFbNV0pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9CU1NJRF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggQ2hhbm5lbAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIGNoYW5uZWw7CisKKwljaGFubmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMjE2KSkvLyB0byBhbGxvdyBBIGJhbmQgY2hhbm5lbCA6ICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMTQpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9DSEFOTkVMX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDF+MTQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcEFkLT5hdGUuQ2hhbm5lbCA9IGNoYW5uZWw7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0NIQU5ORUxfUHJvYyAoQVRFIENoYW5uZWwgPSAlZClcbiIsIHBBZC0+YXRlLkNoYW5uZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfQ0hBTk5FTF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBQb3dlcjAKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgVHhQb3dlcjsKKworCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJeworCQlpZiAoKFR4UG93ZXIgPiAzMSkgfHwgKFR4UG93ZXIgPCAwKSkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjBfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKwllbHNlLy8gNS41R0h6CisJeworCQlpZiAoKFR4UG93ZXIgPiAxNSkgfHwgKFR4UG93ZXIgPCAtNykpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIwX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlwQWQtPmF0ZS5UeFBvd2VyMCA9IFR4UG93ZXI7CisJQVRFVHhQd3JIYW5kbGVyKHBBZCwgMCk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBQb3dlcjEKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgVHhQb3dlcjsKKworCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJeworCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKChUeFBvd2VyID4gMTUpIHx8IChUeFBvd2VyIDwgLTcpKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcEFkLT5hdGUuVHhQb3dlcjEgPSBUeFBvd2VyOworCUFURVR4UHdySGFuZGxlcihwQWQsIDEpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9QT1dFUjFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggQW50ZW5uYQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgdmFsdWU7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKHZhbHVlID4gMikgfHwgKHZhbHVlIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0FudGVubmFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIHZhbHVlKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwQWQtPmF0ZS5UeEFudGVubmFTZWwgPSB2YWx1ZTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jIChBbnRlbm5hID0gJWQpXG4iLCBwQWQtPmF0ZS5UeEFudGVubmFTZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhbGluazogU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFJ4IEFudGVubmEKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIHZhbHVlOworCisJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKCh2YWx1ZSA+IDMpIHx8ICh2YWx1ZSA8IDApKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9SWF9BbnRlbm5hX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCB2YWx1ZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gdmFsdWU7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1JYX0FudGVubmFfUHJvYyAoQW50ZW5uYSA9ICVkKVxuIiwgcEFkLT5hdGUuUnhBbnRlbm5hU2VsKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1JYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUkYgZnJlcXVlbmNlIG9mZnNldAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIFJGRnJlcU9mZnNldDsKKwlVTE9ORyBSNDsKKworCVJGRnJlcU9mZnNldCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihSRkZyZXFPZmZzZXQgPj0gNjQpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH42My5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+YXRlLlJGRnJlcU9mZnNldCA9IFJGRnJlcU9mZnNldDsKKwlSNCA9IHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRiByZWdpc3RlciBiaXQgcG9zaXRpb24KKwlSNCB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmICgofjB4MDAxZjgwMDApKSk7CisJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OworCisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MgKFJGRnJlcU9mZnNldCA9ICVkKVxuIiwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0KSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUkYgQlcKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfQldfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJaW50IGk7CisJVUNIQVIgdmFsdWUgPSAwOworCVVDSEFSIEJCUEN1cnJlbnRCVzsKKworCUJCUEN1cnJlbnRCVyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihCQlBDdXJyZW50QlcgPT0gMCkKKwkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOworCWVsc2UKKwkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzQwOworCisJaWYocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkKKwl7CisJCWlmKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKyAJCWZvciAoaT0wOyBpPDU7IGkrKykKKyAJCXsKKwkJCQlpZiAocEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gIT0gMHhmZmZmZmZmZikKKyAJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldKTsKKyAJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKyAJCQl9CisgCQl9CisJCX0KKworCQkvL1NldCBCQlAgUjQgYml0WzQ6M109MDowCisgCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKyAJCXZhbHVlICY9ICh+MHgxOCk7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKKworICAJCS8vU2V0IEJCUCBSNjY9MHgzQworIAkJdmFsdWUgPSAweDNDOworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY4PTB4MEIKKwkJLy90byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5LgorCQl2YWx1ZSA9IDB4MEI7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OT0weDE2CisJCXZhbHVlID0gMHgxNjsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3MD0weDA4CisJCXZhbHVlID0gMHgwODsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3Mz0weDExCisJCXZhbHVlID0gMHgxMTsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKKworCSAgICAvLyBJZiBDaGFubmVsPTE0LCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgU2V0IEJCUCBSNCBiaXQ1PTEKKwkgICAgLy8gKEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMpCisJICAgIC8vIFRoaXMgc2VnbWVudCBvZiBjb2RlIHdpbGwgb25seSB3b3JrcyB3aGVuIEFURVRYTU9ERSBhbmQgQVRFQ0hBTk5FTAorCSAgICAvLyB3ZXJlIHNldCB0byBNT0RFX0NDSyBhbmQgMTQgcmVzcGVjdGl2ZWx5IGJlZm9yZSBBVEVUWEJXIGlzIHNldCB0byAwLgorCSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA9PSAxNCkKKwkJeworCQkJaW50IFR4TW9kZSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKKwkJCWlmIChUeE1vZGUgPT0gTU9ERV9DQ0spCisJCQl7CisJCQkJLy8gd2hlbiBDaGFubmVsPT0xNCAmJiBNb2RlPT1DQ0sgJiYgQmFuZFdpZHRoPT0yME0sIEJCUCBSNCBiaXQ1PTEKKyAJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7CisJCQkJdmFsdWUgfD0gMHgyMDsgLy9zZXQgYml0NT0xCisgCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCQkJfQorCQl9CisKKwkgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gSWYgYmFuZHdpZHRoICE9IDQwTSwgUkYgUmVnNCBiaXQgMjEgPSAwLgorCQlwQWQtPkxhdGNoUmZSZWdzLlI0ICY9IH4weDAwMjAwMDAwOworCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisJfQorCWVsc2UgaWYocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwl7CisJCWlmKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocEFkLT5hdGUuVHhXSS5NQ1MgPT0gNykpCisJCQl7CisgICAgCQkJdmFsdWUgPSAweDI4OworICAgIAkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjcsIHZhbHVlKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCisJCS8vU2V0IEJCUCBSNCBiaXRbNDozXT0xOjAKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7CisJCXZhbHVlICY9ICh+MHgxOCk7CisJCXZhbHVlIHw9IDB4MTA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCisJCS8vU2V0IEJCUCBSNjY9MHgzQworCQl2YWx1ZSA9IDB4M0M7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OD0weDBDCisJCS8vdG8gaW1wcm92ZSBSeCBzZW5zaXRpdml0eS4KKwkJdmFsdWUgPSAweDBDOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY4LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjk9MHgxQQorCQl2YWx1ZSA9IDB4MUE7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3MD0weDBBCisJCXZhbHVlID0gMHgwQTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjczPTB4MTYKKwkJdmFsdWUgPSAweDE2OworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCB2YWx1ZSk7CisKKwkJLy8gSWYgYmFuZHdpZHRoID0gNDBNLCBzZXQgUkYgUmVnNCBiaXQgMjEgPSAxLgorCQlwQWQtPkxhdGNoUmZSZWdzLlI0IHw9IDB4MDAyMDAwMDA7CisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0JXX1Byb2MgKEJCUEN1cnJlbnRCVyA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5CVykpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9CV19Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBsZW5ndGgKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4TGVuZ3RoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKChwQWQtPmF0ZS5UeExlbmd0aCA8IDI0KSB8fCAocEFkLT5hdGUuVHhMZW5ndGggPiAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKSkKKwl7CisJCXBBZC0+YXRlLlR4TGVuZ3RoID0gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKTsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9MRU5HVEhfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMjR+JWQuXG4iLCAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jIChUeExlbmd0aCA9ICVkKVxuIiwgcEFkLT5hdGUuVHhMZW5ndGgpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTEVOR1RIX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIGNvdW50CisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0NPVU5UX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4Q291bnQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9DT1VOVF9Qcm9jIChUeENvdW50ID0gJWQpXG4iLCBwQWQtPmF0ZS5UeENvdW50KSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0NPVU5UX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIE1DUworCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBNQ1M7CisJaW50IHJlc3VsdDsKKworCU1DUyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJcmVzdWx0ID0gQ2hlY2tNQ1NWYWxpZChwQWQtPmF0ZS5UeFdJLlBIWU1PREUsIE1DUyk7CisKKwlpZiAocmVzdWx0ICE9IC0xKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5NQ1MgPSAoVUNIQVIpTUNTOworCX0KKwllbHNlCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX01DU19Qcm9jOjpPdXQgb2YgcmFuZ2UsIHJlZmVyIHRvIHJhdGUgdGFibGUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01DU19Qcm9jIChNQ1MgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX01DU19Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBNb2RlCisgICAgICAgIDA6IE1PREVfQ0NLCisgICAgICAgIDE6IE1PREVfT0ZETQorICAgICAgICAyOiBNT0RFX0hUTUlYCisgICAgICAgIDM6IE1PREVfSFRHUkVFTkZJRUxECisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTU9ERV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYocEFkLT5hdGUuVHhXSS5QSFlNT0RFID4gMykKKwl7CisJCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IDA7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTU9ERV9Qcm9jOjpPdXQgb2YgcmFuZ2UuIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAwfjNcbiIpKTsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiMDogQ0NLLCAxOiBPRkRNLCAyOiBIVF9NSVgsIDM6IEhUX0dSRUVOX0ZJRUxELlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9NT0RFX1Byb2MgKFR4TW9kZSA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5QSFlNT0RFKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX01PREVfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgR0kKKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYocEFkLT5hdGUuVHhXSS5TaG9ydEdJID4gMSkKKwl7CisJCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IDA7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfR0lfUHJvYzo6T3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0dJX1Byb2MgKEdJID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlNob3J0R0kpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfR0lfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLmJSeEZlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuYlJ4RmVyID09IDEpCisJeworCQlwQWQtPmF0ZS5SeENudFBlclNlYyA9IDA7CisJCXBBZC0+YXRlLlJ4VG90YWxDbnQgPSAwOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfUlhfRkVSX1Byb2MgKGJSeEZlciA9ICVkKVxuIiwgcEFkLT5hdGUuYlJ4RmVyKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1JYX0ZFUl9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIxID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjIgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSMyA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SMyk7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlI0ID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkYyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlIyID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SMyA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBMb2FkIGFuZCBXcml0ZSBFRVBST00gZnJvbSBhIGJpbmFyeSBmaWxlIHByZXBhcmVkIGluIGFkdmFuY2UuCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmbmRlZiBVQ09TCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCQkgICAgcmV0ID0gRkFMU0U7CisJUFVDSEFSCQkJc3JjID0gRUVQUk9NX0JJTl9GSUxFX05BTUU7CisJc3RydWN0IGZpbGUJCSpzcmNmOworCUlOVDMyIAkJCXJldHZhbCwgb3JnZnN1aWQsIG9yZ2ZzZ2lkOworICAgCW1tX3NlZ21lbnRfdAlvcmdmczsKKwlVU0hPUlQgCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKKwlVSU5UMzIJCQlGaWxlTGVuZ3RoID0gMDsKKwlVSU5UMzIgCQkJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT09PiAlcyAodmFsdWU9JWQpXG5cbiIsIF9fRlVOQ1RJT05fXywgdmFsdWUpKTsKKworCWlmICh2YWx1ZSA+IDApCisJeworCQkvKiB6ZXJvIHRoZSBlMnAgYnVmZmVyICovCisJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpV3JpdGVFRVBST00sIEVFUFJPTV9TSVpFKTsKKworCQkvKiBzYXZlIHVpZCBhbmQgZ2lkIHVzZWQgZm9yIGZpbGVzeXN0ZW0gYWNjZXNzLgorCSAgICAqKiBzZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkKKwkgICAgKi8KKwkJb3JnZnN1aWQgPSBjdXJyZW50LT5mc3VpZDsKKwkJb3JnZnNnaWQgPSBjdXJyZW50LT5mc2dpZDsKKwkJLyogYXMgcm9vdCAqLworCQljdXJyZW50LT5mc3VpZCA9IGN1cnJlbnQtPmZzZ2lkID0gMDsKKyAgICAJb3JnZnMgPSBnZXRfZnMoKTsKKyAgICAJc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwkJZG8KKwkJeworCQkJLyogb3BlbiB0aGUgYmluIGZpbGUgKi8KKwkJCXNyY2YgPSBmaWxwX29wZW4oc3JjLCBPX1JET05MWSwgMCk7CisKKwkJCWlmIChJU19FUlIoc3JjZikpCisJCQl7CisJCQkJYXRlX3ByaW50KCIlcyAtIEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCBfX0ZVTkNUSU9OX18sIC1QVFJfRVJSKHNyY2YpLCBzcmMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiB0aGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kICovCisJCQlpZiAoKHNyY2YtPmZfb3AgPT0gTlVMTCkgfHwgKHNyY2YtPmZfb3AtPnJlYWQgPT0gTlVMTCkpCisJCQl7CisJCQkJYXRlX3ByaW50KCIlcyAtICVzIGRvZXMgbm90IGhhdmUgYSByZWFkIG1ldGhvZFxuIiwgX19GVU5DVElPTl9fLCBzcmMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiByZWFkIHRoZSBmaXJtd2FyZSBmcm9tIHRoZSBmaWxlICouYmluICovCisJCQlGaWxlTGVuZ3RoID0gc3JjZi0+Zl9vcC0+cmVhZChzcmNmLAorCQkJCQkJCQkJCSAgKFBVQ0hBUilXcml0ZUVFUFJPTSwKKwkJCQkJCQkJCQkgIEVFUFJPTV9TSVpFLAorCQkJCQkJCQkJCSAgJnNyY2YtPmZfcG9zKTsKKworCQkJaWYgKEZpbGVMZW5ndGggIT0gRUVQUk9NX1NJWkUpCisJCQl7CisJCQkJYXRlX3ByaW50KCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gZTJwLmJpblxuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCBGaWxlTGVuZ3RoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiB3cml0ZSB0aGUgY29udGVudCBvZiAuYmluIGZpbGUgdG8gRUVQUk9NICovCisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZCwgV3JpdGVFRVBST00pOworCQkJCXJldCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKwkJfSB3aGlsZShUUlVFKTsKKworCQkvKiBjbG9zZSBmaXJtd2FyZSBmaWxlICovCisJCWlmIChJU19FUlIoc3JjZikpCisJCXsKKwkJCQk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR2YWwgPSBmaWxwX2Nsb3NlKHNyY2YsIE5VTEwpOworCQkJaWYgKHJldHZhbCkKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7CisKKwkJCX0KKwkJfQorCisJCS8qIHJlc3RvcmUgKi8KKwkJc2V0X2ZzKG9yZ2ZzKTsKKwkJY3VycmVudC0+ZnN1aWQgPSBvcmdmc3VpZDsKKwkJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKwl9CisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPD09PSAlcyAocmV0PSVkKVxuIiwgX19GVU5DVElPTl9fLCByZXQpKTsKKworICAgIHJldHVybiByZXQ7CisKK30KKyNlbHNlCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKKwlzdHJ1Y3QgaXdyZXEJKndycSA9IChzdHJ1Y3QgaXdyZXEgKilhcmc7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzICh3cnEtPnUuZGF0YS5sZW5ndGggPSAlZClcblxuIiwgX19GVU5DVElPTl9fLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gRUVQUk9NX1NJWkUpCisJeworCQlhdGVfcHJpbnQoIiVzOiBlcnJvciBsZW5ndGggKD0lZCkgZnJvbSBob3N0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWVsc2UvKiAod3JxLT51LmRhdGEubGVuZ3RoID09IEVFUFJPTV9TSVpFKSAqLworCXsKKwkJLyogemVybyB0aGUgZTJwIGJ1ZmZlciAqLworCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCBFRVBST01fU0laRSk7CisKKwkJLyogZmlsbCB0aGUgbG9jYWwgYnVmZmVyICovCisJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpV3JpdGVFRVBST00sIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJZG8KKwkJeworCQkJCS8qIHdyaXRlIHRoZSBjb250ZW50IG9mIC5iaW4gZmlsZSB0byBFRVBST00gKi8KKwkJCQlydF9lZV93cml0ZV9hbGwocEFkLCBXcml0ZUVFUFJPTSk7CisKKwkJfSB3aGlsZShGQUxTRSk7CisJCX0KKworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCisgICAgcmV0dXJuIFRSVUU7CisKK30KKyNlbmRpZiAvLyAhVUNPUyAvLworCitJTlQgU2V0X0FURV9SZWFkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCVVTSE9SVCAqcDsKKwlpbnQgaTsKKworCXJ0X2VlX3JlYWRfYWxsKHBBZCwgKFVTSE9SVCAqKWJ1ZmZlcik7CisJcCA9IGJ1ZmZlcjsKKwlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9TSVpFLzIpOyBpKyspCisJeworCQlhdGVfcHJpbnQoIiU0LjR4ICIsICpwKTsKKwkJaWYgKCgoaSsxKSAlIDE2KSA9PSAwKQorCQkJYXRlX3ByaW50KCJcbiIpOworCQlwKys7CisJfQorCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0FURV9TaG93X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWF0ZV9wcmludCgiTW9kZT0lZFxuIiwgcEFkLT5hdGUuTW9kZSk7CisJYXRlX3ByaW50KCJUeFBvd2VyMD0lZFxuIiwgcEFkLT5hdGUuVHhQb3dlcjApOworCWF0ZV9wcmludCgiVHhQb3dlcjE9JWRcbiIsIHBBZC0+YXRlLlR4UG93ZXIxKTsKKwlhdGVfcHJpbnQoIlR4QW50ZW5uYVNlbD0lZFxuIiwgcEFkLT5hdGUuVHhBbnRlbm5hU2VsKTsKKwlhdGVfcHJpbnQoIlJ4QW50ZW5uYVNlbD0lZFxuIiwgcEFkLT5hdGUuUnhBbnRlbm5hU2VsKTsKKwlhdGVfcHJpbnQoIkJCUEN1cnJlbnRCVz0lZFxuIiwgcEFkLT5hdGUuVHhXSS5CVyk7CisJYXRlX3ByaW50KCJHST0lZFxuIiwgcEFkLT5hdGUuVHhXSS5TaG9ydEdJKTsKKwlhdGVfcHJpbnQoIk1DUz0lZFxuIiwgcEFkLT5hdGUuVHhXSS5NQ1MpOworCWF0ZV9wcmludCgiVHhNb2RlPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLlBIWU1PREUpOworCWF0ZV9wcmludCgiQWRkcjE9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIxWzBdLCBwQWQtPmF0ZS5BZGRyMVsxXSwgcEFkLT5hdGUuQWRkcjFbMl0sIHBBZC0+YXRlLkFkZHIxWzNdLCBwQWQtPmF0ZS5BZGRyMVs0XSwgcEFkLT5hdGUuQWRkcjFbNV0pOworCWF0ZV9wcmludCgiQWRkcjI9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIyWzBdLCBwQWQtPmF0ZS5BZGRyMlsxXSwgcEFkLT5hdGUuQWRkcjJbMl0sIHBBZC0+YXRlLkFkZHIyWzNdLCBwQWQtPmF0ZS5BZGRyMls0XSwgcEFkLT5hdGUuQWRkcjJbNV0pOworCWF0ZV9wcmludCgiQWRkcjM9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIzWzBdLCBwQWQtPmF0ZS5BZGRyM1sxXSwgcEFkLT5hdGUuQWRkcjNbMl0sIHBBZC0+YXRlLkFkZHIzWzNdLCBwQWQtPmF0ZS5BZGRyM1s0XSwgcEFkLT5hdGUuQWRkcjNbNV0pOworCWF0ZV9wcmludCgiQ2hhbm5lbD0lZFxuIiwgcEFkLT5hdGUuQ2hhbm5lbCk7CisJYXRlX3ByaW50KCJUeExlbmd0aD0lZFxuIiwgcEFkLT5hdGUuVHhMZW5ndGgpOworCWF0ZV9wcmludCgiVHhDb3VudD0ldVxuIiwgcEFkLT5hdGUuVHhDb3VudCk7CisJYXRlX3ByaW50KCJSRkZyZXFPZmZzZXQ9JWRcbiIsIHBBZC0+YXRlLlJGRnJlcU9mZnNldCk7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlNldF9BVEVfU2hvd19Qcm9jIFN1Y2Nlc3NcbiIpOworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0FURV9IZWxwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWF0ZV9wcmludCgiQVRFPUFURVNUQVJULCBBVEVTVE9QLCBUWENPTlQsIFRYQ0FSUiwgVFhGUkFNRSwgUlhGUkFNRVxuIik7CisJYXRlX3ByaW50KCJBVEVEQVxuIik7CisJYXRlX3ByaW50KCJBVEVTQVxuIik7CisJYXRlX3ByaW50KCJBVEVCU1NJRFxuIik7CisJYXRlX3ByaW50KCJBVEVDSEFOTkVMLCByYW5nZTowfjE0KHVubGVzcyBBIGJhbmQgISlcbiIpOworCWF0ZV9wcmludCgiQVRFVFhQT1cwLCBzZXQgcG93ZXIgbGV2ZWwgb2YgYW50ZW5uYSAxLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWFBPVzEsIHNldCBwb3dlciBsZXZlbCBvZiBhbnRlbm5hIDIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYQU5ULCBzZXQgVFggYW50ZW5uYS4gMDphbGwsIDE6YW50ZW5uYSBvbmUsIDI6YW50ZW5uYSB0d28uXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJYQU5ULCBzZXQgUlggYW50ZW5uYS4wOmFsbCwgMTphbnRlbm5hIG9uZSwgMjphbnRlbm5hIHR3bywgMzphbnRlbm5hIHRocmVlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEZSRVFPRkZTRVQsIHNldCBmcmVxdWVuY3kgb2Zmc2V0LCByYW5nZSAwfjYzXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYQlcsIHNldCBCYW5kV2lkdGgsIDA6MjBNSHosIDE6NDBNSHouXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYTEVOLCBzZXQgRnJhbWUgbGVuZ3RoLCByYW5nZSAyNH4lZFxuIiwgKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSk7CisJYXRlX3ByaW50KCJBVEVUWENOVCwgc2V0IGhvdyBtYW55IGZyYW1lIGdvaW5nIHRvIHRyYW5zbWl0LlxuIik7CisJYXRlX3ByaW50KCJBVEVUWE1DUywgc2V0IE1DUywgcmVmZXJlbmNlIHRvIHJhdGUgdGFibGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYTU9ERSwgc2V0IE1vZGUgMDpDQ0ssIDE6T0ZETSwgMjpIVC1NaXgsIDM6R3JlZW5GaWVsZCwgcmVmZXJlbmNlIHRvIHJhdGUgdGFibGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYR0ksIHNldCBHSSBpbnRlcnZhbCwgMDpMb25nLCAxOlNob3J0XG4iKTsKKwlhdGVfcHJpbnQoIkFURVJYRkVSLCAwOmRpc2FibGUgUnggRnJhbWUgZXJyb3IgcmF0ZS4gMTplbmFibGUgUnggRnJhbWUgZXJyb3IgcmF0ZS5cbiIpOworCWF0ZV9wcmludCgiQVRFUlJGLCBzaG93IGFsbCBSRiByZWdpc3RlcnMuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjEsIHNldCBSRjEgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjIsIHNldCBSRjIgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjMsIHNldCBSRjMgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjQsIHNldCBSRjQgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURUxERTJQLCBsb2FkIEVFUFJPTSBmcm9tIC5iaW4gZmlsZS5cbiIpOworCWF0ZV9wcmludCgiQVRFUkUyUCwgZGlzcGxheSBhbGwgRUVQUk9NIGNvbnRlbnQuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVNIT1csIGRpc3BsYXkgYWxsIHBhcmFtZXRlcnMgb2YgQVRFLlxuIik7CisJYXRlX3ByaW50KCJBVEVIRUxQLCBvbmxpbmUgaGVscC5cbiIpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUFzaWNTd2l0Y2hDaGFubmVsKCkgZGVkaWNhdGVkIGZvciBBVEUuCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQVRFQXNpY1N3aXRjaENoYW5uZWwoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUlOVDMyIFIyID0gMCwgUjMgPSBERUZBVUxUX1JGX1RYX1BPV0VSLCBSNCA9IDAsIFZhbHVlID0gMDsKKwlDSEFSIFR4UHdlciA9IDAsIFR4UHdlcjIgPSAwOworCVVDSEFSIGluZGV4LCBCYnBWYWx1ZSA9IDAsIFI2NiA9IDB4MzA7CisJUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOworCVVDSEFSIENoYW5uZWw7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsICE9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCkKKwkJeworCQkJcEFkLT5hdGUuQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKKwkJfQorCQlyZXR1cm47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCUNoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOworCisJLy8gU2VsZWN0IGFudGVubmEKKwlBc2ljQW50ZW5uYVNlbGVjdChwQWQsIENoYW5uZWwpOworCisJLy8gZmlsbCBUeCBwb3dlciB2YWx1ZQorCVR4UHdlciA9IHBBZC0+YXRlLlR4UG93ZXIwOworCVR4UHdlcjIgPSBwQWQtPmF0ZS5UeFBvd2VyMTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCS8qIEJ1dCBvbmx5IDI4NTAgYW5kIDI3NTAgc3VwcG9ydCA1LjVHSHogYmFuZC4uLiAqLworCQljYXNlIFJGSUNfMjgyMDoKKwkJY2FzZSBSRklDXzI4NTA6CisJCWNhc2UgUkZJQ18yNzIwOgorCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCVIyIHw9IDB4MTAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAxOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJUjIgfD0gMHg0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCS8qIE9ubHkgZW5hYmxlIHR3byBBbnRlbm5hIHRvIHJlY2VpdmUuICovCisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDg7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwkJCQkJeworCQkJCQkJaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAxKQorCQkJCQkJeworCQkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMSAsIGJpdCAxNCA9IDE7IERpc2FibGUgQW50IDIKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKKwkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OwkJLy8xMTEwMDExMUIKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAyKQorCQkJCQkJeworCQkJCQkJCVIyIHw9IDB4ODAwMDsJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMiAsIGJpdCAxNSA9IDE7IERpc2FibGUgQW50IDEKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKKwkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OworCQkJCQkJCUJicFZhbHVlIHw9IDB4MDg7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKKwkJCQkJCQlCYnBWYWx1ZSB8PSAweDEwOworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCVIyIHw9IDB4MTAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAxOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlSMiB8PSAweDMwMDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMjsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDEwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoQ2hhbm5lbCA+IDE0KQorCQkJCQl7CisJCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAorCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQkJCQkJLy8gNS41RyBiYW5kIHBvd2VyIHJhbmdlOiAweEY5fjBYMEYsIFRYMCBSZWczIGJpdDkvVFgxIFJlZzQgYml0Nj0iMCIgbWVhbnMgdGhlIFRYIHBvd2VyIHJlZHVjZSA3ZEIKKwkJCQkJCS8vIFIzCisJCQkJCQlpZiAoKFR4UHdlciA+PSAtNykgJiYgKFR4UHdlciA8IDApKQorCQkJCQkJeworCQkJCQkJCVR4UHdlciA9ICg3K1R4UHdlcik7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApOworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLCBUeFB3ZXIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCkgfCAoMSA8PCA5KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gUjQKKwkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykgJiYgKFR4UHdlcjIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKDcrVHhQd2VyMik7CisJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpOworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXIyPSVkIFxuIiwgVHhQd2VyMikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KSB8ICgxIDw8IDYpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKSB8IChUeFB3ZXIgPDwgOSk7IC8vIHNldCBUWCBwb3dlcjAKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8Nik7Ly8gU2V0IGZyZXEgb2Zmc2V0ICYgVHhQd3IxCisJCQkJCX0KKworCQkJCQkvLyBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLgorCQkJCQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwkJCQkJeworCQkJCQkJUjQgfD0weDIwMDAwMDsKKwkJCQkJfQorCisJCQkJCS8vIFVwZGF0ZSB2YXJpYWJsZXMKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OworCisJCQkJCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJLy8gQ2hhbmdlIEJCUCBzZXR0aW5nIGR1cmluZyBzd2l0Y2ggZnJvbSBhLT5nLCBnLT5hCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly8gMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MEEgPT0+IDB4MDAwNTBGMEEKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCisJCS8qIEZvciAxVC8yUiBjaGlwIG9ubHkuLi4gKi8KKwkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCisJICAgIHsKKwkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7CisJICAgIH0KKworICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7CisJCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCisJCXsKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOworCQl9CisKKwkJLy8gNS41R0h6IGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUi4KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KKwllbHNlCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly8yMDA3LjEwLjA5IGJ5IEJyaWFuIDogMHgwMDA1MDUwNSA9PT4gMHgwMDA1MEYwNQorCisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOworCisgICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKKwkJaWYgKChCYnBWYWx1ZSAhPSAweDAwKSkKKwkJeworCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMHgwMCk7CisJCX0KKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjkxLCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDQpKTsKKworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SOTIsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOworCisJCS8vIDUuNUdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJICAgIH0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisKKyAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJCS8vIEJHIGJhbmQKKwkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCX0KKwllbHNlCisJeworCQkvLyA1LjUgR0h6IGJhbmQKKwkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKyAgICAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisJfQorCisJLy8KKwkvLyBPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCisJLy8gYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMKKwkvLyAyMDA1LzA2LzA1IC0gT24gMTFHLCBXZSBhbHNvIG5lZWQgdGhpcyBkZWxheSB0aW1lLiBPdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gcGFzcyB0aGUgV0hRTC4KKwkvLworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwlpZiAoQ2hhbm5lbCA+IDE0KQorCXsKKwkJLy8gV2hlbiA1LjVHSHogYmFuZCB0aGUgTFNCIG9mIFR4UHdyIHdpbGwgYmUgdXNlZCB0byByZWR1Y2VkIDdkQiBvciBub3QuCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0ldSwgUHdyMT0ldSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkJICBwQWQtPlJmSWNUeXBlLAorCQkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCisJCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKKwkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKKyAgICB9Cit9CisKKy8vCisvLyBJbiBmYWN0LCBubyBvbmUgd2lsbCBjYWxsIHRoaXMgcm91dGluZSBzbyBmYXIgIQorLy8KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2l2ZXMgQ0NLIFRYIHJhdGUgMiBtb3JlIGRCIFRYIHBvd2VyLgorCQlUaGlzIHJvdXRpbmUgd29ya3Mgb25seSBpbiBBVEUgbW9kZS4KKworCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KKwkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQorCQkxLiBUeFBvd2VyUGVyY2VudGFnZQorCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKKwkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCisJCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCisKKwlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKKwkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJCQlpLCBqOworCUNIQVIJCURlbHRhUHdyID0gMDsKKwlCT09MRUFOCQliQXV0b1R4QWdjID0gRkFMU0U7CisJVUNIQVIJCVRzc2lSZWYsICpwVHNzaU1pbnVzQm91bmRhcnksICpwVHNzaVBsdXNCb3VuZGFyeSwgVHhBZ2NTdGVwOworCVVDSEFSCQlCYnBSNDkgPSAwLCBpZHg7CisJUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7CisJVUxPTkcJCVR4UHdyWzVdOworCUNIQVIJCVZhbHVlOworCisJLyogbm8gb25lIGNhbGxzIHRoaXMgcHJvY2VkdXJlIHNvIGZhciAqLworCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisKKwkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLgorCS8vIERvIGl0IHBlciA0IHNlY29uZHMuCisJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCS8qIGJnIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZHOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF07CisJCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEc7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogYSBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmQTsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQl7CisJCQkvKiBCYnBSNDkgaXMgdW5zaWduZWQgY2hhciAqLworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQ5LCAmQmJwUjQ5KTsKKworCQkJLyogKHApIFRzc2lQbHVzQm91bmRhcnlHWzBdID0gMCA9IChtKSBUc3NpTWludXNCb3VuZGFyeUdbMF0gKi8KKwkJCS8qIGNvbXBlbnNhdGU6ICs0ICAgICArMyAgICsyICAgKzEgICAgMCAgIC0xICAgLTIgICAtMyAgIC00ICogc3RlcHMgKi8KKwkJCS8qIHN0ZXAgdmFsdWUgaXMgZGVmaW5lZCBpbiBwQWQtPlR4QWdjU3RlcEcgZm9yIHR4IHBvd2VyIHZhbHVlICovCisKKwkJCS8qIFs0XSsxK1s0XSAgIHA0ICAgICBwMyAgIHAyICAgcDEgICBvMSAgIG0xICAgbTIgICBtMyAgIG00ICovCisJCQkvKiBleDogICAgICAgICAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkJICAgYWJvdmUgdmFsdWUgYXJlIGV4YW1pbmVkIGluIG1hc3MgZmFjdG9yeSBwcm9kdWN0aW9uICovCisJCQkvKiAgICAgICAgICAgICBbNF0gICAgWzNdICBbMl0gIFsxXSAgWzBdICBbMV0gIFsyXSAgWzNdICBbNF0gKi8KKworCQkJLyogcGx1cyBpcyAweDEwIH4gMHg0MCwgbWludXMgaXMgMHg2MCB+IDB4OTAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHg2NSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUuCisJCQkJLy8gQ2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlci4KKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKEJicFI0OSA8PSBwVHNzaU1pbnVzQm91bmRhcnlbaWR4XSkgIC8vIEZvdW5kIHRoZSByYW5nZQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgZGVjcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCisvLwkJCQlpZiAoUjMgPiAoVUxPTkcpIChUeEFnY1N0ZXAgKiAoaWR4LTEpKSkKKwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKFR4QWdjU3RlcCAqIChpZHgtMSkpOworLy8JCQkJZWxzZQorLy8JCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLSgoVUNIQVIpUjMpOworCisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLSBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSAtJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOworCQkJfQorCQkJZWxzZSBpZiAoQmJwUjQ5IDwgcFRzc2lQbHVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQorCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIKKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKEJicFI0OSA+PSBwVHNzaVBsdXNCb3VuZGFyeVtpZHhdKSAgIC8vIEZvdW5kIHRoZSByYW5nZQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgaW5jcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4LTEpOworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IDA7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiICAgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCX0KKworCS8qIGNhbGN1bGF0ZSBkZWx0YSBwb3dlciBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSSAqLworCS8vIEUyUFJPTSBzZXR0aW5nIGlzIGNhbGlicmF0ZWQgZm9yIG1heGltdW0gVFggcG93ZXIgKGkuZS4gMTAwJSkKKwkvLyBXZSBsb3dlciBUWCBwb3dlciBoZXJlIGFjY29yZGluZyB0byB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSQorCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9PSAweGZmZmZmZmZmKSAgICAgICAvLyBBVVRPIFRYIFBPV0VSIGNvbnRyb2wKKwkJOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOTApICAvLyA5MSB+IDEwMCUgJiBBVVRPLCB0cmVhdCBhcyAxMDAlIGluIHRlcm1zIG9mIG1XCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDYwKSAgLy8gNjEgfiA5MCUsIHRyZWF0IGFzIDc1JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8vIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSA2OworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkpICAgLy8gMTAgfiAxNSUsIHRyZWF0IGFzIDEyLjUlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSA5OworCX0KKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSAxMjsKKwl9CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvcihpPTA7IGk8NTsgaSsrKQorCXsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCXsKKwkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCXsKKwkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCisJCQkJfQorCisJCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLworCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQl9CisKKwkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLworCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KKwkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7CisKKworCQl9CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJV3JpdGUgVHhXSSBmb3IgQVRFIG1vZGUuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpZmRlZiBSVDI4NzAKK3N0YXRpYyBWT0lEIEFURVdyaXRlVHhXSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhXSV9TVFJVQyAJcFR4V0ksCisJSU4JQk9PTEVBTgkJCUZSQUcsCisJSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOIAkJQU1QRFUsCisJSU4JQk9PTEVBTiAJCUFjaywKKwlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTglVQ0hBUiAJCQlQSUQsCisJSU4JVUNIQVIJCQlNSU1PcHMsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCVRyYW5zbWl0KQoreworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCXBUeFdJLT5GUkFHPSBGUkFHOworCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOworCXBUeFdJLT5BTVBEVSA9IEFNUERVOworCisJcFR4V0ktPk1JTU9wcyA9IFBXUl9BQ1RJVkU7CisJcFR4V0ktPk1wZHVEZW5zaXR5ID0gNDsKKwlwVHhXSS0+QUNLID0gQWNrOworCXBUeFdJLT50eG9wID0gVHhvcG1vZGU7CisJcFR4V0ktPk5TRVEgPSBOU2VxOworCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CisKKwlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IFdDSUQ7CisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IExlbmd0aDsKKwlwVHhXSS0+UGFja2V0SWQgPSBQSUQ7CisKKwlwVHhXSS0+QlcgPSBUcmFuc21pdC5maWVsZC5CVzsKKwlwVHhXSS0+U2hvcnRHSSA9IFRyYW5zbWl0LmZpZWxkLlNob3J0R0k7CisJcFR4V0ktPlNUQkM9IFRyYW5zbWl0LmZpZWxkLlNUQkM7CisKKwlwVHhXSS0+TUNTID0gVHJhbnNtaXQuZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFPSBUcmFuc21pdC5maWVsZC5NT0RFOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8KKwkvLyBNTVBTIGlzIDgwMi4xMW4gZmVhdHVyZXMuIEJlY2F1c2UgVHhXSS0+TUNTID4gNyBtdXN0IGJlIEhUIG1vZGUsCisJLy8gc28gbmVlZCBub3QgY2hlY2sgaWYgaXQncyBIVCByYXRlLgorCS8vCisJaWYgKChNSU1PcHMgPT0gTU1QU19TVEFUSUMpICYmIChwVHhXSS0+TUNTID4gNykpCisJCXBUeFdJLT5NQ1MgPSA3OworCisJaWYgKChNSU1PcHMgPT0gTU1QU19EWU5BTUlDKSAmJiAocFR4V0ktPk1DUyA+IDcpKSAvLyBTTVBTIHByb3RlY3QgMiBzcGF0aWFsLgorCQlwVHhXSS0+TUlNT3BzID0gMTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5DRkFDSyA9IENmQWNrOworCisJcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCURpc2FibGUgcHJvdGVjdGlvbiBmb3IgQVRFLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUk9UX0NGR19TVFJVQwlQcm90Q2ZnLCBQcm90Q2ZnNDsKKwlVSU5UMzIgUHJvdGVjdFs2XTsKKwlVU0hPUlQJCQlvZmZzZXQ7CisJVUNIQVIJCQlpOworCVVJTlQzMiBNYWNSZWcgPSAwOworCisJLy8gQ29uZmlnIEFTSUMgUlRTIHRocmVzaG9sZCByZWdpc3RlcgorCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRTX0NGRywgJk1hY1JlZyk7CisJTWFjUmVnICY9IDB4RkYwMDAwRkY7CisJTWFjUmVnIHw9IChwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPDwgOCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRTX0NGRywgTWFjUmVnKTsKKworCS8vIEluaXRpYWwgY29tbW9uIHByb3RlY3Rpb24gc2V0dGluZ3MKKwlSVE1QWmVyb01lbW9yeShQcm90ZWN0LCBzaXplb2YoUHJvdGVjdCkpOworCVByb3RDZmc0LndvcmQgPSAwOworCVByb3RDZmcud29yZCA9IDA7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU00MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd09mZG0gPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93Q2NrID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlJUU1RoRW4gPSAxOworCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisKKwkvLyBIYW5kbGUgbGVnYWN5KEIvRykgcHJvdGVjdGlvbgorCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOworCVByb3RlY3RbMF0gPSBQcm90Q2ZnLndvcmQ7CisJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKworCS8vIE5PIFBST1RFQ1QKKwkvLyAxLkFsbCBTVEFzIGluIHRoZSBCU1MgYXJlIDIwLzQwIE1IeiBIVAorCS8vIDIuIGluIGFpIDIwLzQwTUh6IEJTUworCS8vIDMuIGFsbCBTVEFzIGFyZSAyME1IeiBpbiBhIDIwTUh6IEJTUworCS8vIFB1cmUgSFQuIG5vIHByb3RlY3Rpb24uCisKKwkvLyBNTTIwX1BST1RfQ0ZHCisJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJUHJvdGVjdFsyXSA9IDB4MDE3NDQwMDQ7CisKKwkvLyBNTTQwX1BST1RfQ0ZHCisJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCVByb3RlY3RbM10gPSAweDAzZjQ0MDg0OworCisJLy8gQ0YyMF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQorCVByb3RlY3RbNF0gPSAweDAxNzQ0MDA0OworCisJLy8gQ0Y0MF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKKwlQcm90ZWN0WzVdID0gMHgwM2Y0NDA4NDsKKworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKworCW9mZnNldCA9IENDS19QUk9UX0NGRzsKKwlmb3IgKGkgPSAwO2kgPCA2O2krKykKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgaSo0LCBQcm90ZWN0W2ldKTsKKworfQorCisjaWZkZWYgUlQyODcwCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVdyaXRlIFR4SW5mbyBmb3IgQVRFIG1vZGUuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4SW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhJTkZPX1NUUlVDIAlwVHhJbmZvLAorCUlOCVVTSE9SVAkJVVNCRE1BcGt0TGVuLAorCUlOCUJPT0xFQU4JCWJXaXYsCisJSU4JVUNIQVIJCQlRdWV1ZVNlbCwKKwlJTglVQ0hBUgkJCU5leHRWYWxpZCwKKwlJTglVQ0hBUgkJCVR4QnVyc3QpCit7CisJcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPSBVU0JETUFwa3RMZW47CisJcFR4SW5mby0+UVNFTCA9IFF1ZXVlU2VsOworCisJaWYgKFF1ZXVlU2VsICE9IEZJRk9fRURDQSkKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT4gUXVldWVTZWwgIT0gRklGT19FRENBPD09PT09PT1cbiIpKTsKKworCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSBOZXh0VmFsaWQ7CisJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IFR4QnVyc3Q7CisJcFR4SW5mby0+V0lWID0gYldpdjsKKwlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDA7CisJcFR4SW5mby0+cnN2ID0gMDsKKwlwVHhJbmZvLT5yc3YyID0gMDsKKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbnZlcnQgUnNzaSAqLworI2lmIDEKKy8vCisvLyBUaGUgd2F5IHVzZWQgd2l0aCBHRVRfTE5BX0dBSU4oKS4KKy8vCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUglSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOworCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKwl7CisJCWlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworCX0KKwllbHNlCisJeworCQlpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKwl9CisKKwlyZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Cit9CisjZWxzZQorLy8KKy8vIFRoZSB3YXkgb3JpZ2luYWxseSB1c2VkIGluIEFURSBvZiBydDI4NjBhcC4KKy8vCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUgkJCVJzc2ksCisJSU4gIFVDSEFSICAgUnNzaU51bWJlcikKK3sKKwlVQ0hBUglSc3NpT2Zmc2V0LCBMTkFHYWluOworCisJLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQorCWlmIChSc3NpID09IDApCisJCXJldHVybiAtOTk7CisKKyAgICBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisgICAgeworICAgICAgICBMTkFHYWluID0gcEFkLT5BTE5BR2FpbjsKKyAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExOQUdhaW4gPSBwQWQtPkJMTkFHYWluOworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKyAgICB9CisKKyAgICByZXR1cm4gKC0zMiAtIFJzc2lPZmZzZXQgKyBMTkFHYWluIC0gUnNzaSk7Cit9CisjZW5kaWYgLyogZW5kIG9mICNpZiAxICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgSmFwYW4gZmlsdGVyIGNvZWZmaWNpZW50cyBpZiBuZWVkZWQuCisJTm90ZToKKwkJVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCisJCWVudGVyaW5nIFRYRlJBTUUgbW9kZSBvciBUWENPTlQgbW9kZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCUJicERhdGEgPSAwOworCisJLy8KKwkvLyBJZiBDaGFubmVsPTE0IGFuZCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgc2V0IEJCUCBSNCBiaXQ1PTEKKwkvLyAoSmFwYW4gVHggZmlsdGVyIGNvZWZmaWNpZW50cyl3aGVuIChUWEZSQU1FIG9yIFRYQ09OVCkuCisJLy8KKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJicERhdGEpOworCisgICAgaWYgKChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPT0gTU9ERV9DQ0spICYmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KSAmJiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkpCisgICAgeworICAgICAgICBCYnBEYXRhIHw9IDB4MjA7ICAgIC8vIHR1cm4gb24KKyAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0SmFwYW5GaWx0ZXIhISFcbiIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkJQmJwRGF0YSAmPSAweGRmOyAgICAvLyB0dXJuIG9mZgorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbGVhckphcGFuRmlsdGVyISEhXG4iKSk7CisgICAgfQorCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCYnBEYXRhKTsKK30KKworVk9JRCBBVEVTYW1wbGVSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKK3sKKwkvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY29sbGVjdCBSU1NJLiAqLworI2lmIDEKKwkvL3BBZC0+TGFzdFJ4UmF0ZSA9IChVU0hPUlQpKChwUnhXSS0+TUNTKSArIChwUnhXSS0+QlcgPDw3KSArIChwUnhXSS0+U2hvcnRHSSA8PDgpKyAocFJ4V0ktPlBIWU1PREUgPDwxNCkpIDsKKwlpZiAocFJ4V0ktPlJTU0kwICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTAJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMCwgUlNTSV8wKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTBYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMFg4IC0gcEFkLT5hdGUuQXZnUnNzaTApICsgcEFkLT5hdGUuTGFzdFJzc2kwOworCQlwQWQtPmF0ZS5BdmdSc3NpMCAgCT0gcEFkLT5hdGUuQXZnUnNzaTBYOCA+PiAzOworCX0KKwlpZiAocFJ4V0ktPlJTU0kxICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTEJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMSwgUlNTSV8xKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTFYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMVg4IC0gcEFkLT5hdGUuQXZnUnNzaTEpICsgcEFkLT5hdGUuTGFzdFJzc2kxOworCQlwQWQtPmF0ZS5BdmdSc3NpMQk9IHBBZC0+YXRlLkF2Z1Jzc2kxWDggPj4gMzsKKwl9CisJaWYgKHBSeFdJLT5SU1NJMiAhPSAwKQorCXsKKwkJcEFkLT5hdGUuTGFzdFJzc2kyCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTIsIFJTU0lfMik7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyWDgJPSAocEFkLT5hdGUuQXZnUnNzaTJYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kyKSArIHBBZC0+YXRlLkxhc3RSc3NpMjsKKwkJcEFkLT5hdGUuQXZnUnNzaTIJPSBwQWQtPmF0ZS5BdmdSc3NpMlg4ID4+IDM7CisJfQorCisJcEFkLT5hdGUuTGFzdFNOUjAgPSAoQ0hBUikocFJ4V0ktPlNOUjApOy8vIENIQVIgPT0+IFVDSEFSID8KKwlwQWQtPmF0ZS5MYXN0U05SMSA9IChDSEFSKShwUnhXSS0+U05SMSk7Ly8gQ0hBUiA9PT4gVUNIQVIgPworCisJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOworI2Vsc2UKKwlwQWQtPmF0ZS5MYXN0U05SMCA9IChDSEFSKShwUnhXSS0+U05SMCk7CisJcEFkLT5hdGUuTGFzdFNOUjEgPSAoQ0hBUikocFJ4V0ktPlNOUjEpOworCXBBZC0+YXRlLlJ4Q250UGVyU2VjKys7CisJcEFkLT5hdGUuTGFzdFJzc2kwID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTAsIFJTU0lfMCk7CisJcEFkLT5hdGUuTGFzdFJzc2kxID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTEsIFJTU0lfMSk7CisJcEFkLT5hdGUuTGFzdFJzc2kyID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTIsIFJTU0lfMik7CisJcEFkLT5hdGUuQXZnUnNzaTBYOCA9IChwQWQtPmF0ZS5BdmdSc3NpMFg4IC0gcEFkLT5hdGUuQXZnUnNzaTApICsgcEFkLT5hdGUuTGFzdFJzc2kwOworCXBBZC0+YXRlLkF2Z1Jzc2kwID0gcEFkLT5hdGUuQXZnUnNzaTBYOCA+PiAzOworCXBBZC0+YXRlLkF2Z1Jzc2kxWDggPSAocEFkLT5hdGUuQXZnUnNzaTFYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kxKSArIHBBZC0+YXRlLkxhc3RSc3NpMTsKKwlwQWQtPmF0ZS5BdmdSc3NpMSA9IHBBZC0+YXRlLkF2Z1Jzc2kxWDggPj4gMzsKKwlwQWQtPmF0ZS5BdmdSc3NpMlg4ID0gKHBBZC0+YXRlLkF2Z1Jzc2kyWDggLSBwQWQtPmF0ZS5BdmdSc3NpMikgKyBwQWQtPmF0ZS5MYXN0UnNzaTI7CisJcEFkLT5hdGUuQXZnUnNzaTIgPSBwQWQtPmF0ZS5BdmdSc3NpMlg4ID4+IDM7CisJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUFN0YXRpb25TdG9wKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworLy8JQk9PTEVBTiAgICAgICBDYW5jZWxsZWQ7CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUFN0YXRpb25TdG9wXG4iKSk7CisKKyNpZiAwCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgICAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgICAgICAgJkNhbmNlbGxlZCk7CisjZW5kaWYKKwkvLyBGb3Igcnggc3RhdGlzdGljcywgd2UgbmVlZCB0byBrZWVwIHRoaXMgdGltZXIgcnVubmluZy4KKy8vCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsICAgICAgJkNhbmNlbGxlZCk7CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUFN0YXRpb25TdG9wXG4iKSk7Cit9CisKK1ZPSUQgUlRNUFN0YXRpb25TdGFydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUFN0YXRpb25TdGFydFxuIikpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0YXJ0XG4iKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2V0dXAgRnJhbWUgZm9ybWF0LgorCU5PVEU6CisJCVRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSB1c2VkIGluIEFURSBtb2RlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmZGVmIFJUMjg3MAorLyo9PT09PT09PT09PT09PT09PT09PT09U3RhcnQgb2YgUlQyODcwPT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQzMiBUeElkeCkKK3sKKwlVSU5UIGo7CisJUFRYX0NPTlRFWFQJcE51bGxDb250ZXh0OworCVBVQ0hBUgkJCXBEZXN0OworCUhUVFJBTlNNSVRfU0VUVElORwlUeEhUUGh5TW9kZTsKKwlQVFhXSV9TVFJVQwkJcFR4V0k7CisJUFRYSU5GT19TVFJVQwkJcFR4SW5mbzsKKwlVSU5UMzIJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCwgT3JnQnVmZmVyTGVuZ3RoID0gMDsKKwlVQ0hBUgkJCXBhZExlbiA9IDA7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTEgPSBOVUxMOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpIHx8CisJCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpIHx8CisJCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpIHx8CisJCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCXsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFdlIGFsd2F5cyB1c2UgUUlEX0FDX0JFIGFuZCBGSUZPX0VEQ0EgaW4gQVRFIG1vZGUuICovCisKKwlwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCUFTU0VSVChwTnVsbENvbnRleHQgIT0gTlVMTCk7CisKKwlpZiAocE51bGxDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkKKwl7CisJCS8vIFNldCB0aGUgaW4gdXNlIGJpdAorCQlwTnVsbENvbnRleHQtPkluVXNlID0gVFJVRTsKKwkJTmRpc1plcm9NZW1vcnkoJihwQWQtPk51bGxGcmFtZSksIHNpemVvZihIRUFERVJfODAyXzExKSk7CisKKwkJLy8gRmlsbCA4MDIuMTEgaGVhZGVyLgorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBIZWFkZXI4MDIxMSA9IE5kaXNNb3ZlTWVtb3J5KCYocEFkLT5OdWxsRnJhbWUpLCBwQWQtPmF0ZS5IZWFkZXIsIHBBZC0+YXRlLkhMZW4pOworLy8JCQlwRGVzdCA9IE5kaXNNb3ZlTWVtb3J5KCYocEFkLT5OdWxsRnJhbWUpLCBwQWQtPmF0ZS5IZWFkZXIsIHBBZC0+YXRlLkhMZW4pOworLy8JCQlwSGVhZGVyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpcERlc3Q7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCXsKKwkJCS8vIEZpbGwgODAyLjExIGhlYWRlci4KKwkJCU5kaXNNb3ZlTWVtb3J5KCYocEFkLT5OdWxsRnJhbWUpLCBUZW1wbGF0ZUZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQl9CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKSYocEFkLT5OdWxsRnJhbWUpLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCS8qIG1vZGlmeSBzZXF1ZW5jZSBudW1iZXIuLi4uICovCisJCQlpZiAocEFkLT5hdGUuVHhEb25lQ291bnQgPT0gMCkKKwkJCXsKKwkJCQlwQWQtPmF0ZS5zZXEgPSBwSGVhZGVyODAyMTEtPlNlcXVlbmNlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSArK3BBZC0+YXRlLnNlcTsKKwkJCX0KKwkJCS8qIFdlIGFscmVhZHkgZ290IGFsbCB0aGUgYWRkci4gZmllbGRzIGZyb20gUUEgR1VJLiAqLworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQl7CisJCQlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPmF0ZS5BZGRyMSk7CisJCQlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIyLCBwQWQtPmF0ZS5BZGRyMik7CisJCQlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIzLCBwQWQtPmF0ZS5BZGRyMyk7CisJCX0KKworCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF0sIFRYX0JVRkZFUl9OT1JNU0laRSk7Ly8/Pz8KKwkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCS8vIEF2b2lkIHRvIGV4Y2VlZCB0aGUgcmFuZ2Ugb2YgV2lyZWxlc3NQYWNrZXRbXS4KKwkJCUFTU0VSVChwQWQtPmF0ZS5UeEluZm8uVVNCRE1BVHhQa3RMZW4gPD0gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSk7CisJCQlOZGlzTW92ZU1lbW9yeShwVHhJbmZvLCAmKHBBZC0+YXRlLlR4SW5mbyksIHNpemVvZihwQWQtPmF0ZS5UeEluZm8pKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJeworCQkJLy8gQXZvaWQgdG8gZXhjZWVkIHRoZSByYW5nZSBvZiBXaXJlbGVzc1BhY2tldFtdLgorCQkJQVNTRVJUKHBBZC0+YXRlLlR4TGVuZ3RoIDw9IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpOworCisJCQkvLyBwVHhJbmZvLT5VU0JETUFUeFBrdExlbiB3aWxsIGJlIHVwZGF0ZWQgdG8gaW5jbHVkZSBwYWRkaW5nIGxhdGVyLgorCQkJQVRFV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShUWFdJX1NJWkUgKyBwQWQtPmF0ZS5UeExlbmd0aCksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOworCQkJcFR4SW5mby0+UVNFTCA9IEZJRk9fRURDQTsKKwkJfQorCisJCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWElORk9fU0laRV07CisKKwkJLy8gRmlsbCBUeFdJLgorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5CVyA9IHBBZC0+YXRlLlR4V0kuQlc7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOworCQkJVHhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IHBBZC0+YXRlLlR4V0kuU1RCQzsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOworCQkJVHhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKKwkJCUFURVdyaXRlVHhXSShwQWQsIHBUeFdJLCBwQWQtPmF0ZS5UeFdJLkZSQUcsIHBBZC0+YXRlLlR4V0kuVFMsIHBBZC0+YXRlLlR4V0kuQU1QRFUsIHBBZC0+YXRlLlR4V0kuQUNLLCBwQWQtPmF0ZS5UeFdJLk5TRVEsCisJCQkJcEFkLT5hdGUuVHhXSS5CQVdpblNpemUsIEJTU0lEX1dDSUQsIHBBZC0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50LyogaW5jbHVkZSA4MDIuMTEgaGVhZGVyICovLCBwQWQtPmF0ZS5UeFdJLlBhY2tldElkLCAwLCBwQWQtPmF0ZS5UeFdJLnR4b3AvKklGU19IVFRYT1AqLywgcEFkLT5hdGUuVHhXSS5DRkFDSy8qRkFMU0UqLywgVHhIVFBoeU1vZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOworCQkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCisJCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLyogTm8gYWNrIHJlcXVpcmVkLiAqLywgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIHBBZC0+YXRlLlR4TGVuZ3RoLAorCQkJCTAsIDAsIElGU19IVFRYT1AsIEZBTFNFLCBUeEhUUGh5TW9kZSk7Ly8gIk1NUFNfU1RBVElDIiBpbnN0ZWFkIG9mICJNTVBTX0RZTkFNSUMiID8/PworCQl9CisKKwkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFK1RYV0lfU0laRV0sICZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCQlwRGVzdCA9ICYocEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkUrVFhXSV9TSVpFK3NpemVvZihIRUFERVJfODAyXzExKV0pOworCisJCS8vIFByZXBhcmUgZnJhbWUgcGF5bG9hZAorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCS8vIGNvcHkgcGF0dGVybgorCQkJaWYgKChwQWQtPmF0ZS5QTGVuICE9IDApKQorCQkJeworCQkJCWZvciAoaiA9IDA7IGogPCBwQWQtPmF0ZS5ETGVuOyBqKz1wQWQtPmF0ZS5QTGVuKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkocERlc3QsIHBBZC0+YXRlLlBhdHRlcm4sIHBBZC0+YXRlLlBMZW4pOworCQkJCQlwRGVzdCArPSBwQWQtPmF0ZS5QTGVuOworCQkJCX0KKwkJCX0KKwkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBwQWQtPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJeworCQkgICAgZm9yIChqID0gMDsgaiA8IChwQWQtPmF0ZS5UeExlbmd0aCAtIHNpemVvZihIRUFERVJfODAyXzExKSk7IGorKykKKwkJICAgIHsKKwkJCQkqcERlc3QgPSAweEE1OworCQkJCXBEZXN0ICs9IDE7CisJCSAgICB9CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgcEFkLT5hdGUuVHhMZW5ndGg7CisJCX0KKworI2lmIDEKKwkJT3JnQnVmZmVyTGVuZ3RoID0gVHJhbnNmZXJCdWZmZXJMZW5ndGg7CisJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoID0gKFRyYW5zZmVyQnVmZmVyTGVuZ3RoICsgMykgJiAofjMpOworCisJCS8vIEFsd2F5cyBhZGQgNCBleHRyYSBieXRlcyBhdCBldmVyeSBwYWNrZXQuCisJCXBhZExlbiA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoIC0gT3JnQnVmZmVyTGVuZ3RoICsgNDsvKiA0ID09IGxhc3QgcGFja2V0IHBhZGRpbmcgKi8KKwkJQVNTRVJUKChwYWRMZW4gPD0gKFJUTVBfUEtUX1RBSUxfUEFERElORyAtIDQvKiA0ID09IE1heEJ1bGtPdXRzaXplIGFsaWdubWVudCBwYWRkaW5nICovKSkpOworCisJCS8qIE5vdyBtZW16ZXJvIGFsbCBleHRyYSBwYWRkaW5nIGJ5dGVzLiAqLworCQlOZGlzWmVyb01lbW9yeShwRGVzdCwgcGFkTGVuKTsKKwkJcERlc3QgKz0gcGFkTGVuOworI2Vsc2UKKwkJaWYgKChUcmFuc2ZlckJ1ZmZlckxlbmd0aCAlIDQpID09IDEpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCA3KTsKKwkJCXBEZXN0ICs9IDc7CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCAgKz0gMzsKKwkJfQorCQllbHNlIGlmICgoVHJhbnNmZXJCdWZmZXJMZW5ndGggJSA0KSA9PSAyKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGVzdCwgNik7CisJCQlwRGVzdCArPSA2OworCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGggICs9IDI7CisJCX0KKwkJZWxzZSBpZiAoKFRyYW5zZmVyQnVmZmVyTGVuZ3RoICUgNCkgPT0gMykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocERlc3QsIDUpOworCQkJcERlc3QgKz0gNTsKKwkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoICArPSAxOworCQl9CisjZW5kaWYgLy8gMSAvLworCisJCS8vIFVwZGF0ZSBwVHhJbmZvLT5VU0JETUFUeFBrdExlbiB0byBpbmNsdWRlIHBhZGRpbmcuCisJCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVHJhbnNmZXJCdWZmZXJMZW5ndGggLSBUWElORk9fU0laRTsKKworCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCArPSA0OworCisJCS8vIElmIFRyYW5zZmVyQnVmZmVyTGVuZ3RoIGlzIG11bHRpcGxlIG9mIDY0LCBhZGQgZXh0cmEgNCBieXRlcyBhZ2Fpbi4KKwkJaWYgKChUcmFuc2ZlckJ1ZmZlckxlbmd0aCAlIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpID09IDApCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCA0KTsKKwkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoICs9IDQ7CisJCX0KKworCQkvLyBGaWxsIG91dCBmcmFtZSBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGdsb2JhbCBCdWxrIG91dCBhcmJpdG9yCisJCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPSBUcmFuc2ZlckJ1ZmZlckxlbmd0aDsKKwl9CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOworCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsICgoKFBVQ0hBUilwVHhJbmZvKStUWFdJX1NJWkUrVFhJTkZPX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEluZm8sIFRZUEVfVFhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJcmV0dXJuIDA7Cit9CisKK1ZPSUQgQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQVFhfQ09OVEVYVAkJICAgIHBOdWxsQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkOworCU5UU1RBVFVTCQkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJCUlycUZsYWdzOworCVVMT05HCQkJICAgIE9sZFZhbHVlOworCisJcE51bGxDb250ZXh0ID0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcE51bGxDb250ZXh0LT5wQWQ7CisKKworCS8vIFJlc2V0IE51bGwgZnJhbWUgY29udGV4dCBmbGFncworCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCUJ1bGtPdXRQaXBlSWQgPSBwTnVsbENvbnRleHQtPkJ1bGtPdXRQaXBlSWQ7CisJcEFkLT5CdWxrT3V0RGF0YU9uZVNlY0NvdW50Kys7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAoKEFURV9PTihwQWQpKSAmJiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSkKKwkJeworCQkJaWYgKHBBZC0+YXRlLlFJRCA9PSBCdWxrT3V0UGlwZUlkKQorCQkJeworCQkJCS8vIExldCBSeCBjYW4gaGF2ZSBhIGNoYW5jZSB0byBicmVhayBpbiBkdXJpbmcgVHggcHJvY2VzcywKKwkJCQkvLyBlc3BlY2lhbGx5IGZvciBsb29wYmFjayBtb2RlIGluIFFBIEFURS4KKwkJCQkvLyBUbyB0cmFkZSBvZmYgYmV0d2VlbiB0eCBwZXJmb3JtYW5jZSBhbmQgbG9vcGJhY2sgbW9kZSBpbnRlZ3JpdHkuCisJCQkJLyogUSAgIDogTm93IFJ4IGlzIGhhbmRsZWQgYnkgdGFza2xldCwgZG8gd2Ugc3RpbGwgbmVlZCB0aGlzIGRlbGF5ID8gKi8KKwkJCQkvKiBBbnMgOiBFdmVuIHRhc2tsZXQgaXMgdXNlZCwgUngvVHggPCAxIGlmIHdlIGRvIG5vdCBkZWxheSBmb3IgYSB3aGlsZSByaWdodCBoZXJlLiAqLworCQkJCVJUTVB1c2VjRGVsYXkoNTAwKTsKKwkJCQlwQWQtPmF0ZS5UeERvbmVDb3VudCsrOworCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJCQlBU1NFUlQocEFkLT5hdGUuUUlEID09IDApOworCQkJCXBBZC0+YXRlLlR4QWMwKys7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZSsrOworCisJCXBBZC0+Q291bnRlcnM4MDIzLkdvb2RUcmFuc21pdHMrKzsKKworCQkvKiBEb24ndCB3b3JyeSBhYm91dCB0aGUgcXVldWUgaXMgZW1wdHkgb3Igbm90LiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaXRzZWxmLiAqLworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIFRSVUUsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKworCQkvKiBJbiAyOHh4LCBTZW5kVHhXYWl0UXVldWUgPT0+IFR4U3dRdWV1ZSAgKi8KKy8qCisJCWlmIChwQWQtPlNlbmRUeFdhaXRRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKQorCQl7CisJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEJ1bGtPdXRQaXBlSWQpOworCQl9CisqLworCX0KKwllbHNlCS8vIFNUQVRVU19PVEhFUgorCXsKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcisrOworCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGtPdXREYXRhUGFja2V0IEZhaWxlZCBTVEFUVVNfT1RIRVIgPSAweCV4IC4gXG4iLCBTdGF0dXMpKTsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0UmVxPTB4JWx4LCBCdWxrT3V0Q29tcGxldGU9MHglbHhcbiIsIHBBZC0+QnVsa091dFJlcSwgcEFkLT5CdWxrT3V0Q29tcGxldGUpKTsKKworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQkvKiBJbiAyOHh4LCBSVF9PSURfVVNCX1JFU0VUX0JVTEtfT1VUID09PiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQgKi8KKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJCS8vIENoZWNrCisJCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IEJ1bGtPdXRQaXBlSWQ7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCisKKwlpZiAoYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSA+IDApCisJeworCQlhdG9taWNfZGVjKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCk7CisJfQorCisJLy8gMXN0IC0gVHJhbnNtaXQgU3VjY2VzcworCU9sZFZhbHVlID0gcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydDsKKwlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0Kys7CisKKwlpZiAocEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQorCXsKKwkJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuSGlnaFBhcnQrKzsKKwl9CisKKwlpZigoKHBBZC0+Q29udGluQnVsa091dCA9PSBUUlVFICkgfHwoYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSA+IDApKSAmJiAocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwl7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCX0KKwllbHNlCisJeworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCX0KKworCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZS4KKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkKQoreworCVBUWF9DT05URVhUCQlwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKworCUFTU0VSVChCdWxrT3V0UGlwZUlkID09IDApOworCisJLyogQnVpbGQgdXAgdGhlIGZyYW1lIGZpcnN0LiAqLworLy8JQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJaWYgKHBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPT0gVFJVRSkKKwl7CisJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IFRSVUU7CisJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplOworCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBOdWxsQ29udGV4dC0+QnVsa091dFNpemU7CisKKwkvLyBDbGVhciBBVEUgZnJhbWUgYnVsayBvdXQgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0FURSk7CisKKwkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgorCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE51bGxDb250ZXh0LCBCdWxrT3V0UGlwZUlkLCAodXNiX2NvbXBsZXRlX3QpQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisJcFVyYiA9IHBOdWxsQ29udGV4dC0+cFVyYjsKKworCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0OiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCXJldHVybjsKKwl9CisKKwlwQWQtPkJ1bGtPdXRSZXErKzsKKwlyZXR1cm47CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCVVJTlQJCQlpOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlBcbiIpKTsKKyNpZiAxCisJZm9yICggaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCXsKKwkJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCQlpZihwUnhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCXsKKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJLy9OZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKwkJCS8vcEFkLT5QZW5kaW5nUngtLTsKKwkJfQorCX0KKyNlbHNlCisJZm9yICggaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCXsKKwkJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCQlpZihhdG9taWNfcmVhZCgmcFJ4Q29udGV4dC0+SXJwTG9jaykgPT0gSVJQTE9DS19DQU5DRUxBQkxFKQorCQl7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQl9CisJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBSeENvbnRleHQtPklycExvY2ssIElSUExPQ0tfQ0FOQ0VfU1RBUlQpOworCX0KKyNlbmRpZiAvLyAxIC8vCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlBcbiIpKTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgcnRfZWVfcmVhZF9hbGwoUFJUTVBfQURBUFRFUiBwQWQsIFVTSE9SVCAqRGF0YSkKK3sKKwlVU0hPUlQgaTsKKwlVU0hPUlQgdmFsdWU7CisKKwlmb3IgKGkgPSAwIDsgaSA8IEVFUFJPTV9TSVpFLzIgOyApCisJeworCQkvKiAidmFsdWUiIGlzIGV4cGVjaWFsbHkgZm9yIHNvbWUgY29tcGlsZXJzLi4uICovCisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgaSoyLCB2YWx1ZSk7CisJCURhdGFbaV0gPSB2YWx1ZTsKKwkJaSsrOworCX0KK30KKworVk9JRCBydF9lZV93cml0ZV9hbGwoUFJUTVBfQURBUFRFUiBwQWQsIFVTSE9SVCAqRGF0YSkKK3sKKwlVU0hPUlQgaTsKKwlVU0hPUlQgdmFsdWU7CisKKwlmb3IgKGkgPSAwIDsgaSA8IEVFUFJPTV9TSVpFLzIgOyApCisJeworCQkvKiAidmFsdWUiIGlzIGV4cGVjaWFsbHkgZm9yIHNvbWUgY29tcGlsZXJzLi4uICovCisJCXZhbHVlID0gRGF0YVtpXTsKKwkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgaSoyLCB2YWx1ZSk7CisJCWkgKys7CisJfQorfQorI2lmZGVmIFJBTElOS18yOHh4X1FBCitWT0lEIEFURV9RQV9TdGF0aXN0aWNzKAorCUlOIFBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4gUFJYV0lfU1RSVUMJCQkJcFJ4V0ksCisJSU4gUFJUMjhYWF9SWERfU1RSVUMJCXBSeEQsCisJSU4gUEhFQURFUl84MDJfMTEJCQlwSGVhZGVyKQoreworCS8vIHVwZGF0ZSBjb3VudGVyIGZpcnN0CisJaWYgKHBIZWFkZXIgIT0gTlVMTCkKKwl7CisJCWlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCisJCXsKKwkJCWlmIChwUnhELT5VMk0pCisJCQkJcEFkLT5hdGUuVTJNKys7CisJCQllbHNlCisJCQkJcEFkLT5hdGUuT3RoZXJEYXRhKys7CisJCX0KKwkJZWxzZSBpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKQorCQl7CisJCQlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKKwkJCQlwQWQtPmF0ZS5CZWFjb24rKzsKKwkJCWVsc2UKKwkJCQlwQWQtPmF0ZS5PdGhlckNvdW50Kys7CisJCX0KKwkJZWxzZSBpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKQorCQl7CisJCQlwQWQtPmF0ZS5PdGhlckNvdW50Kys7CisJCX0KKwl9CisJcEFkLT5hdGUuUlNTSTAgPSBwUnhXSS0+UlNTSTA7CisJcEFkLT5hdGUuUlNTSTEgPSBwUnhXSS0+UlNTSTE7CisJcEFkLT5hdGUuUlNTSTIgPSBwUnhXSS0+UlNTSTI7CisJcEFkLT5hdGUuU05SMCA9IHBSeFdJLT5TTlIwOworCXBBZC0+YXRlLlNOUjEgPSBwUnhXSS0+U05SMTsKK30KKworLyogY29tbWFuZCBpZCB3aXRoIENtZCBUeXBlID09IDB4MDAwOChmb3IgMjh4eCkvMHgwMDA1KGZvciBpTklDKSAqLworI2RlZmluZSBSQUNGR19DTURfUkZfV1JJVEVfQUxMCQkweDAwMDAKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTYJCTB4MDAwMQorI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTYJMHgwMDAyCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEwJMHgwMDAzCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEVfQUxMCTB4MDAwNAorI2RlZmluZSBSQUNGR19DTURfSU9fUkVBRAkJCTB4MDAwNQorI2RlZmluZSBSQUNGR19DTURfSU9fV1JJVEUJCQkweDAwMDYKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1JFQURfQlVMSwkJMHgwMDA3CisjZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfUkVBRDgJCQkweDAwMDgKKyNkZWZpbmUgUkFDRkdfQ01EX0JCUF9XUklURTgJCTB4MDAwOQorI2RlZmluZSBSQUNGR19DTURfQkJQX1JFQURfQUxMCQkweDAwMGEKKyNkZWZpbmUgUkFDRkdfQ01EX0dFVF9DT1VOVEVSCQkweDAwMGIKKyNkZWZpbmUgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIJCTB4MDAwYworCisjZGVmaW5lIFJBQ0ZHX0NNRF9SU1YxCQkJCTB4MDAwZAorI2RlZmluZSBSQUNGR19DTURfUlNWMgkJCQkweDAwMGUKKyNkZWZpbmUgUkFDRkdfQ01EX1JTVjMJCQkJMHgwMDBmCisKKyNkZWZpbmUgUkFDRkdfQ01EX1RYX1NUQVJUCQkJMHgwMDEwCisjZGVmaW5lIFJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTCQkweDAwMTEKKyNkZWZpbmUgUkFDRkdfQ01EX1RYX1NUT1AJCQkweDAwMTIKKyNkZWZpbmUgUkFDRkdfQ01EX1JYX1NUQVJUCQkJMHgwMDEzCisjZGVmaW5lIFJBQ0ZHX0NNRF9SWF9TVE9QCQkJMHgwMDE0CisjZGVmaW5lIFJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUwJMHgwMDE1CisKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVAkJCTB4MDA4MAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUT1AJCQkweDAwODEKKworI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVIJCTB4MDEwMAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlQJCQkweDAxMDEKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRQkJMHgwMTAyCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0JXCSAgICAgICAgICAgIDB4MDEwMworI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjAJICAgICAgICAweDAxMDQKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxCQkJMHgwMTA1CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUCQkweDAxMDYKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUwkJMHgwMTA3CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUgkJCTB4MDEwOAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BCQkweDAxMDkKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQQkJMHgwMTBhCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFCQkJMHgwMTBiCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUwJCQkweDAxMGMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjEJCQkJMHgwMTBkCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyCQkJCTB4MDEwZQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMwkJCQkweDAxMGYKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfUkFURQkJCQkweDAxMTAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOCQkweDAxMTEKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQJMHgwMTEyCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUUJCTB4MDExMworI2RlZmluZSBSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsJMHgwMTE0CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEsJMHgwMTE1CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSwkJMHgwMTE2CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSwkJMHgwMTE3CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfQkJQX1dSSVRFX0JVTEsJMHgwMTE4CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLCQkweDAxMTkKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLCQkweDAxMWEKKworCisKKyNkZWZpbmUgQTJIZXgoX1gsIF9wKSAJCQkJXAorewkJCQkJCQkJCVwKKwlVQ0hBUiAqcDsJCQkJCQlcCisJX1ggPSAwOwkJCQkJCQlcCisJcCA9IF9wOwkJCQkJCQlcCisJd2hpbGUgKCgoKnAgPj0gJ2EnKSAmJiAoKnAgPD0gJ2YnKSkgfHwgKCgqcCA+PSAnQScpICYmICgqcCA8PSAnRicpKSB8fCAoKCpwID49ICcwJykgJiYgKCpwIDw9ICc5JykpKQkJXAorCXsJCQkJCQkJCQkJCQlcCisJCWlmICgoKnAgPj0gJ2EnKSAmJiAoKnAgPD0gJ2YnKSkJCQkJXAorCQkJX1ggPSBfWCAqIDE2ICsgKnAgLSA4NzsJCQkJCVwKKwkJZWxzZSBpZiAoKCpwID49ICdBJykgJiYgKCpwIDw9ICdGJykpCQlcCisJCQlfWCA9IF9YICogMTYgKyAqcCAtIDU1OwkJCQkJXAorCQllbHNlIGlmICgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkJCVwKKwkJCV9YID0gX1ggKiAxNiArICpwIC0gNDg7CQkJCQlcCisJCXArKzsJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9CisKKworc3RhdGljIFZPSUQgbWVtY3B5X2V4bChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKTsKK3N0YXRpYyBWT0lEIG1lbWNweV9leHMoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbik7CitzdGF0aWMgVk9JRCBSVE1QX0lPX1JFQURfQlVMSyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUlOVDMyIGxlbik7CisKKyNpZmRlZiBVQ09TCitpbnQgYXRlX2NvcHlfdG9fdXNlcigKKwlJTiBQVUNIQVIgcGF5bG9hZCwKKwlJTiBQVUNIQVIgbXNnLAorCUlOIElOVCAgICBsZW4pCit7CisJbWVtbW92ZShwYXlsb2FkLCBtc2csIGxlbik7CisJcmV0dXJuIDA7Cit9CisKKyN1bmRlZgljb3B5X3RvX3VzZXIKKyNkZWZpbmUgY29weV90b191c2VyKHgseSx6KSBhdGVfY29weV90b191c2VyKChQVUNIQVIpeCwgKFBVQ0hBUil5LCB6KQorI2VuZGlmIC8vIFVDT1MgLy8KKworI2RlZmluZQlMRU5fT0ZfQVJHIDE2CisKK1ZPSUQgUnRtcERvQXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJdW5zaWduZWQgc2hvcnQgQ29tbWFuZF9JZDsKKwlzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmc7CisJSU5UCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKworCisJaWYoKHBSYUNmZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwl7CisJCVN0YXR1cyA9IC1FSU5WQUw7CisJCXJldHVybjsKKwl9CisKKwlOZGlzWmVyb01lbW9yeShwUmFDZmcsIHNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSk7CisKKyAgICBpZiAoY29weV9mcm9tX3VzZXIoKFBVQ0hBUilwUmFDZmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJeworCQlTdGF0dXMgPSAtRUZBVUxUOworCQlrZnJlZShwUmFDZmcpOworCQlyZXR1cm47CisJfQorCisKKwlDb21tYW5kX0lkID0gbnRvaHMocFJhQ2ZnLT5jb21tYW5kX2lkKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXG4lczogQ29tbWFuZF9JZCA9IDB4JTA0eCAhXG4iLCBfX0ZVTkNUSU9OX18sIENvbW1hbmRfSWQpKTsKKworCXN3aXRjaCAoQ29tbWFuZF9JZCkKKwl7CisgCQkvLyBXZSB3aWxsIGdldCB0aGlzIGNvbW1hbmQgd2hlbiBRQSBzdGFydHMuCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRcbiIpKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4KKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIkFURVNUQVJUIik7CisJCQl9CisJCQlicmVhazsKKworIAkJLy8gV2Ugd2lsbCBnZXQgdGhpcyBjb21tYW5kIGVpdGhlciBRQSBpcyBjbG9zZWQgb3IgYXRlZCBpcyBraWxsZWQgYnkgdXNlci4KKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUT1A6CisJCQl7CisjaWZuZGVmIFVDT1MKKwkJCQlJTlQzMiByZXQ7CisjZW5kaWYgLy8gIVVDT1MgLy8KKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVE9QXG4iKSk7CisKKwkJCQkvLyBEaXN0aW5ndWlzaCB0aGlzIGNvbW1hbmQgY2FtZSBmcm9tIFFBKHZpYSBhdGVkKQorCQkJCS8vIG9yIGF0ZSBkYWVtb24gYWNjb3JkaW5nIHRvIHRoZSBleGlzdGVuY2Ugb2YgcGlkIGluIHBheWxvYWQuCisJCQkJLy8gTm8gbmVlZCB0byBwcmVwYXJlIGZlZWRiYWNrIGlmIHRoaXMgY21kIGNhbWUgZGlyZWN0bHkgZnJvbSBhdGUgZGFlbW9uLgorCQkJCXBSYUNmZy0+bGVuZ3RoID0gbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJaWYgKHBSYUNmZy0+bGVuZ3RoID09IHNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpCisJCQkJeworCQkJCQkvLyBUaGlzIGNvbW1hbmQgY2FtZSBmcm9tIFFBLgorCQkJCQkvLyBHZXQgdGhlIHBpZCBvZiBBVEUgZGFlbW9uLgorCQkJCQltZW1jcHkoKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuQXRlUGlkLAorCQkJCQkJKCZwUmFDZmctPmRhdGFbMF0pIC0gMi8qID09ICYocFJhQ2ZnLT5zdGF0dXMpICovLAorCQkJCQkJc2l6ZW9mKHBBZGFwdGVyLT5hdGUuQXRlUGlkKSk7CisKKwkJCQkJLy8gcHJlcGFyZSBmZWVkYmFjayBhcyBzb29uIGFzIHdlIGNhbiB0byBhdm9pZCBRQSB0aW1lb3V0LgorCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworCSAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkgICAgICAgICAgICAJeworCSAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RPUFxuIikpOworCSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkgICAgICAgICAgICAJfQorCisJCQkJCS8vCisJCQkJCS8vIGtpbGwgQVRFIGRhZW1vbiB3aGVuIGxlYXZpbmcgQVRFIG1vZGUuCisJCQkJCS8vIFdlIG11c3Qga2lsbCBBVEUgZGFlbW9uIGZpcnN0IGJlZm9yZSBzZXR0aW5nIEFURVNUT1AsCisJCQkJCS8vIG9yIE1pY3Jvc29mdCB3aWxsIHJlcG9ydCBzdGguIHdyb25nLgorI2lmbmRlZiBVQ09TCisJCQkJCXJldCA9IEtJTExfVEhSRUFEX1BJRChwQWRhcHRlci0+YXRlLkF0ZVBpZCwgU0lHVEVSTSwgMSk7CisJCQkJCWlmIChyZXQpCisJCQkJCXsKKwkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmFibGUgdG8gc2lnbmFsIHRocmVhZFxuIiwgcEFkYXB0ZXItPm5ldF9kZXYtPm5hbWUpKTsKKwkJCQkJfQorI2VuZGlmIC8vICFVQ09TIC8vCisJCQkJfQorCisJCQkJLy8gQVAgbWlnaHQgaGF2ZSBpbiBBVEVfU1RPUCBtb2RlIGR1ZSB0byBjbWQgZnJvbSBRQS4KKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCS8vIFNvbWVvbmUgaGFzIGtpbGxlZCBhdGUgZGFlbW9uIHdoaWxlIFFBIEdVSSBpcyBzdGlsbCBvcGVuLgorCQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVE9QIik7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BUF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEw6CisJCQl7CisJCQkJVUlOVDMyIFIxLCBSMiwgUjMsIFI0OworCQkJCVVTSE9SVCBjaGFubmVsOworCisJCQkJbWVtY3B5KCZSMSwgcFJhQ2ZnLT5kYXRhLTIsIDQpOworCQkJCW1lbWNweSgmUjIsIHBSYUNmZy0+ZGF0YSsyLCA0KTsKKwkJCQltZW1jcHkoJlIzLCBwUmFDZmctPmRhdGErNiwgNCk7CisJCQkJbWVtY3B5KCZSNCwgcFJhQ2ZnLT5kYXRhKzEwLCA0KTsKKwkJCQltZW1jcHkoJmNoYW5uZWwsIHBSYUNmZy0+ZGF0YSsxNCwgMik7CisKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjEgPSBudG9obChSMSk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIyID0gbnRvaGwoUjIpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMyA9IG50b2hsKFIzKTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjQgPSBudG9obChSNCk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBudG9ocyhjaGFubmVsKTsKKworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMik7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjMpOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfUkZfV1JJVEVfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTY6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldCwgdmFsdWUsIHRtcDsKKworCQkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCQkvKiAidG1wIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBvZmZzZXQsIHRtcCk7CisJCQkJdmFsdWUgPSB0bXA7CisJCQkJdmFsdWUgPSBodG9ucyh2YWx1ZSk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVFUFJPTSBSZWFkIG9mZnNldCA9IDB4JTA0eCwgdmFsdWUgPSAweCUwNHhcbiIsIG9mZnNldCwgdmFsdWUpKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDQpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJbWVtY3B5KHBSYUNmZy0+ZGF0YSwgJnZhbHVlLCAyKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSA9ICVkXG4iLCBzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikpKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1JFQUQxNiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisgICAgICAgICAgIAl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNjoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0LCB2YWx1ZTsKKworCQkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGEsIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1dSSVRFMTYgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMOgorCQkJeworCQkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKWJ1ZmZlciwgRUVQUk9NX1NJWkUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitFRVBST01fU0laRSk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQkJTmRpc1plcm9NZW1vcnkoKFVDSEFSICopYnVmZmVyLCBFRVBST01fU0laRSk7CisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgKFVDSEFSICopYnVmZmVyLCAoVUNIQVIgKikmcFJhQ2ZnLT5zdGF0dXMsIEVFUFJPTV9TSVpFKTsKKwkJCQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEVfQUxMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9FMlBST01fV1JJVEVfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfSU9fUkVBRDoKKwkJCXsKKwkJCQlVSU5UMzIJb2Zmc2V0OworCQkJCVVJTlQzMgl2YWx1ZTsKKworCQkJCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOworCQkJCW9mZnNldCA9IG50b2hsKG9mZnNldCk7CisKKwkJCQkvLyBXZSBkbyBub3QgbmVlZCB0aGUgYmFzZSBhZGRyZXNzLgorCQkJCS8vIFNvIGp1c3QgZXh0cmFjdCB0aGUgb2Zmc2V0IG91dC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgb2Zmc2V0LCAmdmFsdWUpOworCQkJCXZhbHVlID0gaHRvbmwodmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoNik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQltZW1jcHkocFJhQ2ZnLT5kYXRhLCAmdmFsdWUsIDQpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0lPX1JFQURcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1JFQUQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfSU9fV1JJVEU6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldCwgdmFsdWU7CisKKwkJCQltZW1jcHkoJm9mZnNldCwgcFJhQ2ZnLT5kYXRhLTIsIDQpOworCQkJCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSsyLCA0KTsKKworCQkJCW9mZnNldCA9IG50b2hsKG9mZnNldCk7CisKKwkJCQkvLyBXZSBkbyBub3QgbmVlZCB0aGUgYmFzZSBhZGRyZXNzLgorCQkJCS8vIFNvIGp1c3QgZXh0cmFjdCBvdXQgdGhlIG9mZnNldC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9JT19XUklURTogb2Zmc2V0ID0gJXgsIHZhbHVlID0gJXhcbiIsIG9mZnNldCwgdmFsdWUpKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfSU9fV1JJVEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1dSSVRFIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1JFQURfQlVMSzoKKwkJCXsKKwkJCQlVSU5UMzIJb2Zmc2V0OworCQkJCVVTSE9SVAlsZW47CisKKwkJCQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3QgdGhlIG9mZnNldC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhKzIsIDIpOworCQkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCQlpZiAobGVuID4gMzcxKQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJsZW4gaXMgdG9vIGxhcmdlLCBtYWtlIGl0IHNtYWxsZXJcbiIpKTsKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJUlRNUF9JT19SRUFEX0JVTEsocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopb2Zmc2V0LCBsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbio0KTsvLyB1bml0IGluIGZvdXIgYnl0ZXMKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDg6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldDsKKwkJCQlVQ0hBUgl2YWx1ZTsKKworCQkJCXZhbHVlID0gMDsKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisKKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICAmdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgICZ2YWx1ZSk7CisJCQkJfQorCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDMpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJcFJhQ2ZnLT5kYXRhWzBdID0gdmFsdWU7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJCUCB2YWx1ZSA9ICV4XG4iLCB2YWx1ZSkpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEOFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1JFQUQ4IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQ7CisJCQkJVUNIQVIJdmFsdWU7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhLCAxKTsKKworCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCXsKKwkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICB2YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgIHZhbHVlKTsKKwkJCQl9CisKKwkJCQlpZiAoKG9mZnNldCA9PSBCQlBfUjEpIHx8IChvZmZzZXQgPT0gQkJQX1IzKSkKKwkJCQl7CisJCQkJCVN5bmNUeFJ4Q29uZmlnKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9CQlBfV1JJVEU4IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgajsKKworCQkJCWZvciAoaiA9IDA7IGogPCAxMzc7IGorKykKKwkJCQl7CisJCQkJCXBSYUNmZy0+ZGF0YVtqXSA9IDA7CisKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqXSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2pdKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrMTM3KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1JFQURfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCWlmIChvZmZzZXQgKyBsZW4gPD0gRUVQUk9NX1NJWkUpCisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilidWZmZXIrb2Zmc2V0LCBsZW4pOworCQkJZWxzZQorCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImV4Y2VlZCBFRVBST00gc2l6ZVxuIikpOworCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciArIG9mZnNldCwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhICsgMiwgbGVuKTsKKwkJCXJ0X2VlX3dyaXRlX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEs6CisJCXsKKwkJCVVJTlQzMiBvZmZzZXQsIGksIHZhbHVlOworCQkJVVNIT1JUIGxlbjsKKworCQkJbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7CisJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSsyLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkKKwkJCXsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKikmdmFsdWUsIHBSYUNmZy0+ZGF0YSs0K2ksIDQpOworCQkJCXByaW50aygiV3JpdGUgJXggJXhcbiIsIG9mZnNldCArIGksIHZhbHVlKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIChvZmZzZXQgK2kpICYgMHhmZmZmLCB2YWx1ZSk7CisJCQl9CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5Nb2RlID09IEFURV9TVE9QKQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCQkJVUNIQVIgKnZhbHVlOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXZhbHVlID0gcFJhQ2ZnLT5kYXRhICsgMiArIChqIC0gb2Zmc2V0KTsKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5Nb2RlID09IEFURV9TVE9QKQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICp2YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICp2YWx1ZSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCQl9CisJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19SQUxJTktfUlQzMDUyCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJZm9yIChqID0gb2Zmc2V0OyBqIDwgKG9mZnNldCtsZW4pOyBqKyspCisJCQl7CisJCQkJcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdID0gMDsKKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCQkJVUNIQVIgKnZhbHVlOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXZhbHVlID0gcFJhQ2ZnLT5kYXRhICsgMiArIChqIC0gb2Zmc2V0KTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKyNlbmRpZgorCisKKwkJY2FzZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMOgorCQkJeworCQkJCVVDSEFSCWNoYW5uZWw7CisJCQkJSU5UMzIgICBidWZmZXJbM11bMTBdOy8qIDMgOiBSeFBhdGggOyAxMCA6IG5vLiBvZiBwZXIgcnNzaSBzYW1wbGVzICovCisKKwkJCQljaGFubmVsID0gKG50b2hzKHBSYUNmZy0+c3RhdHVzKSAmIDB4MDBGRik7CisJCQkJQ2FsTm9pc2VMZXZlbChwQWRhcHRlciwgY2hhbm5lbCwgYnVmZmVyKTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKilwUmFDZmctPmRhdGEsIChVQ0hBUiAqKSYoYnVmZmVyWzBdWzBdKSwgKHNpemVvZihJTlQzMikqMyoxMCkpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMiArIChzaXplb2YoSU5UMzIpKjMqMTApKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUjoKKwkJCXsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5VMk0sIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLk90aGVyRGF0YSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuQmVhY29uLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzEyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuT3RoZXJDb3VudCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMwLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzIwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMzLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhIQ0NBLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhNZ210LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTAsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0OF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kyLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzUyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuU05SMCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Nl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjEsIDQpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzYwKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfR0VUX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUjoKKwkJCXsKKwkJCQlwQWRhcHRlci0+YXRlLlUyTSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuQmVhY29uID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLk90aGVyQ291bnQgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzAgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzEgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzIgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzMgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhIQ0NBID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4TWdtdCA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQ0xFQVJfQ09VTlRFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUOgorCQkJeworCQkJCVVTSE9SVCAqcDsKKwkJCQlVU0hPUlQJZXJyID0gMTsKKwkJCQlVQ0hBUiAgIEJicDIyVmFsdWUgPSAwLCBCYnAyNFZhbHVlID0gMDsKKworCQkJCWlmICgocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSAmJiAocEFkYXB0ZXItPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpKQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBdGUgVHggaXMgYWxyZWFkeSBydW5uaW5nLCB0byBydW4gbmV4dCBUeCwgeW91IG11c3Qgc3RvcCBpdCBmaXJzdFxuIikpOworCQkJCQllcnIgPSAyOworCQkJCQlnb3RvIFRYX1NUQVJUX0VSUk9SOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSAmJiAhKHBBZGFwdGVyLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCWludCBpID0gMDsKKworCQkJCQl3aGlsZSAoKGkrKyA8IDEwKSAmJiAocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSkKKwkJCQkJeworCQkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQkJfQorCisJCQkJCS8vIGZvcmNlIGl0IHRvIHN0b3AKKwkJCQkJcEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyA9IDA7CisJCQkJCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOworCQkJCQkvL3BBZGFwdGVyLT5hdGUuUmVwZWF0ID0gMDsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisJCQkJfQorCisJCQkJLy8gSWYgcFJhQ2ZnLT5sZW5ndGggPT0gMCwgdGhpcyAiUkFDRkdfQ01EX1RYX1NUQVJUIiBpcyBmb3IgQ2FycmllciB0ZXN0IG9yIENhcnJpZXIgU3VwcHJlc3Npb24uCisJCQkJaWYgKG50b2hzKHBSYUNmZy0+bGVuZ3RoKSAhPSAwKQorCQkJCXsKKwkJCQkJLy8gR2V0IGZyYW1lIGluZm8KKyNpZmRlZiBSVDI4NzAKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhJbmZvLCBwUmFDZmctPmRhdGEgLSAyLCA0KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpICZwQWRhcHRlci0+YXRlLlR4SW5mbywgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeFdJLCBwUmFDZmctPmRhdGEgKyAyLCAxNik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikmcEFkYXB0ZXItPmF0ZS5UeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeENvdW50LCBwUmFDZmctPmRhdGEgKyAxOCwgNCk7CisJCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IG50b2hsKHBBZGFwdGVyLT5hdGUuVHhDb3VudCk7CisKKwkJCQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyMl0pOworCQkJCQkvL3AgPSBwUmFDZmctPmRhdGEgKyAyMjsKKwkJCQkJLy8gYWx3YXlzIHVzZSBRSURfQUNfQkUKKwkJCQkJcEFkYXB0ZXItPmF0ZS5RSUQgPSAwOworCQkJCQlwID0gKFVTSE9SVCAqKSgmcFJhQ2ZnLT5kYXRhWzI0XSk7CisJCQkJCS8vcCA9IHBSYUNmZy0+ZGF0YSArIDI0OworCQkJCQlwQWRhcHRlci0+YXRlLkhMZW4gPSBudG9ocygqcCk7CisKKwkJCQkJaWYgKHBBZGFwdGVyLT5hdGUuSExlbiA+IDMyKQorCQkJCQl7CisJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBBZGFwdGVyLT5hdGUuSExlbiA+IDMyXG4iKSk7CisJCQkJCQllcnIgPSAzOworCQkJCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKKwkJCQkJfQorCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLkhlYWRlciwgcFJhQ2ZnLT5kYXRhICsgMjYsIHBBZGFwdGVyLT5hdGUuSExlbik7CisKKworCQkJCQlwQWRhcHRlci0+YXRlLlBMZW4gPSBudG9ocyhwUmFDZmctPmxlbmd0aCkgLSAocEFkYXB0ZXItPmF0ZS5ITGVuICsgMjgpOworCisJCQkJCWlmIChwQWRhcHRlci0+YXRlLlBMZW4gPiAzMikKKwkJCQkJeworCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLlBMZW4gPiAzMlxuIikpOworCQkJCQkJZXJyID0gNDsKKwkJCQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7CisJCQkJCX0KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5QYXR0ZXJuLCBwUmFDZmctPmRhdGEgKyAyNiArIHBBZGFwdGVyLT5hdGUuSExlbiwgcEFkYXB0ZXItPmF0ZS5QTGVuKTsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5ETGVuID0gcEFkYXB0ZXItPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCAtIHBBZGFwdGVyLT5hdGUuSExlbjsKKwkJCQl9CisKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IyMiwgJkJicDIyVmFsdWUpOworCisJCQkJc3dpdGNoIChCYnAyMlZhbHVlKQorCQkJCXsKKwkJCQkJY2FzZSBCQlAyMl9UWEZSQU1FOgorCQkJCQkJeworCQkJCQkJCWlmIChwQWRhcHRlci0+YXRlLlR4Q291bnQgPT0gMCkKKwkJCQkJCQl7CisJCQkJCQkJfQorCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhGUkFNRVxuIikpOworCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhGUkFNRSIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFA6CisJCQkJCQl7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFBcbiIpKTsKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgMjQsICZCYnAyNFZhbHVlKTsKKworCQkJCQkJCXN3aXRjaCAoQmJwMjRWYWx1ZSkKKwkJCQkJCQl7CisJCQkJCQkJCWNhc2UgQkJQMjRfVFhDT05UOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDT05UXG4iKSk7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENPTlQiKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJCWNhc2UgQkJQMjRfQ0FSUlNVUFA6CisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENBUlJTVVBQXG4iKSk7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJCQlwQWRhcHRlci0+YXRlLk1vZGUgfD0gQVRFX1RYQ0FSUlNVUFA7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiVW5rbm93biBTdGFydCBUWCBzdWJ0eXBlICEiKSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEJCUDIyX1RYQ0FSUjoKKwkJCQkJCXsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ0FSUlxuIikpOworCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDQVJSIik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJeworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiVW5rbm93biBTdGFydCBUWCBzdWJ0eXBlICEiKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCQkJeworCQkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIHdhcyBmYWlsZWQgaW4gY2FzZSBSQUNGR19DTURfVFhfU1RBUlRcbiIpKTsKKwkgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJICAgICAgICAgICAgCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfVFhfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCitUWF9TVEFSVF9FUlJPUjoKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKGVycik7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZlZWRiYWNrIG9mIFRYX1NUQVJUX0VSUk9SIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVM6CisJCQl7CisJCQkJVUlOVDMyIGNvdW50OworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoNik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQljb3VudCA9IGh0b25sKHBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBSYUNmZy0+ZGF0YSwgJmNvdW50LCA0KTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVU1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfR0VUX1RYX1NUQVRVUyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVE9QOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1RYX1NUT1BcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYU1RPUCIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfVFhfU1RPUFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfVFhfU1RPUCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9SWF9TVEFSVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworCisJCQkJcEFkYXB0ZXItPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJSWEZSQU1FIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfUlhfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUlhfU1RPUDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVE9QXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJSWFNUT1AiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JYX1NUT1BcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUT1AgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJLyogVGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgZm9yIG5ldyBBVEUgR1VJKG5vdCBRQSkuICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUjoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUlxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDQVJSIik7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENPTlQiKTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRVxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhGUkFNRSIpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQlc6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0JXXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCisJCQkJU2V0X0FURV9UWF9CV19Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9CV1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9CVyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMDoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjAgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQ6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1M6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTXG4iKSk7CisKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzIwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250LCA0KTsKKworCQkJCWlmIChwQWRhcHRlci0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQkJCXsKKwkJCQkJSU5UMzIgUlNTSTAgPSAwOworCQkJCQlJTlQzMiBSU1NJMSA9IDA7CisJCQkJCUlOVDMyIFJTU0kyID0gMDsKKworCQkJCQlSU1NJMCA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQlSU1NJMSA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTEgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQlSU1NJMiA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTIgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJlJTU0kwLCA0KTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0NF0sIChVQ0hBUiAqKSZSU1NJMSwgNCk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmUlNTSTIsIDQpOworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrNTIpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlJTlQzMiBSU1NJMCA9IDA7CisKKwkJCQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7CisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMis0NCk7CisJCQkJfQorCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDU1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMTsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVJcbiIpKTsKKworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX01PREVfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxXG4iKSk7CisKKwkJCQkvLyBBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAorCQkJCS8vIHNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KKwkJCQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMSwgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxIGlzIGRvbmUgIVxuIChBRERSMSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkYXB0ZXItPmF0ZS5BZGRyMVswXSwKKwkJCQkJCXBBZGFwdGVyLT5hdGUuQWRkcjFbMV0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbMl0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbM10sIHBBZGFwdGVyLT5hdGUuQWRkcjFbNF0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjJcbiIpKTsKKworCQkJCS8vIEFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCisJCQkJLy8gc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgorCQkJCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIyLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjIgaXMgZG9uZSAhXG4gKEFERFIyID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWRhcHRlci0+YXRlLkFkZHIyWzBdLAorCQkJCQkJcEFkYXB0ZXItPmF0ZS5BZGRyMlsxXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMlsyXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMlszXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMls0XSwgcEFkYXB0ZXItPmF0ZS5BZGRyMls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjM6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSM1xuIikpOworCisJCQkJLy8gQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKKwkJCQkvLyBzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCisJCQkJbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjMsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSM1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMyBpcyBkb25lICFcbiAoQUREUjMgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZGFwdGVyLT5hdGUuQWRkcjNbMF0sCisJCQkJCQlwQWRhcHRlci0+YXRlLkFkZHIzWzFdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzJdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzNdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzRdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfTUNTX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfUkFURSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTjoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4gaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVDoKKwkJCXsKKwkJCQlVU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXsKKwkJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvYyhwQWRhcHRlciwgc3RyKTsKKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorICAgIEFTU0VSVChwUmFDZmcgIT0gTlVMTCk7CisgICAgaWYgKHBSYUNmZyAhPSBOVUxMKQorICAgIHsKKyAgICBrZnJlZShwUmFDZmcpOworICAgIH0KKwlyZXR1cm47Cit9CisKK1ZPSUQgQnViYmxlU29ydChJTlQzMiBuLCBJTlQzMiBhW10pCit7CisJSU5UMzIgaywgaiwgdGVtcDsKKworCWZvciAoayA9IG4tMTsgIGs+MDsgIGstLSkKKwl7CisJCWZvciAoaiA9IDA7IGo8azsgaisrKQorCQl7CisJCQlpZihhW2pdID4gYVtqKzFdKQorCQkJeworCQkJCXRlbXAgPSBhW2pdOworCQkJCWFbal09YVtqKzFdOworCQkJCWFbaisxXT10ZW1wOworCQkJfQorCQl9CisJfQorfQorCitWT0lEIENhbE5vaXNlTGV2ZWwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSIGNoYW5uZWwsIElOVDMyIFJTU0lbM11bMTBdKQoreworCUlOVDMyCQlSU1NJMCwgUlNTSTEsIFJTU0kyOworIAlDSEFSCQlSc3NpME9mZnNldCwgUnNzaTFPZmZzZXQsIFJzc2kyT2Zmc2V0OworCVVDSEFSCQlCYnBSNTBSc3NpMCA9IDAsIEJicFI1MVJzc2kxID0gMCwgQmJwUjUyUnNzaTIgPSAwOworCVVDSEFSCQlPcmdfQkJQNjZ2YWx1ZSA9IDAsIE9yZ19CQlA2OXZhbHVlID0gMCwgT3JnX0JCUDcwdmFsdWUgPSAwLCBkYXRhID0gMDsKKwlVU0hPUlQJCUxOQV9HYWluID0gMDsKKwlJTlQzMiAgICAgICBqID0gMDsKKwlVQ0hBUgkJT3JnX0NoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOworCVVTSE9SVAkgICAgR2FpblZhbHVlID0gMCwgT2Zmc2V0VmFsdWUgPSAwOworCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JnX0JCUDY2dmFsdWUpOworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgJk9yZ19CQlA2OXZhbHVlKTsKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsICZPcmdfQkJQNzB2YWx1ZSk7CisKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyBSZWFkIHRoZSB2YWx1ZSBvZiBMTkEgZ2FpbiBhbmQgUnNzaSBvZmZzZXQKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCBHYWluVmFsdWUpOworCisJLy8gZm9yIE5vaXNlIExldmVsCisJaWYgKGNoYW5uZWwgPD0gMTQpCisJeworCQlMTkFfR2FpbiA9IEdhaW5WYWx1ZSAmIDB4MDBGRjsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0JHX09GRlNFVCwgT2Zmc2V0VmFsdWUpOworCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQkdfT0ZGU0VUICsgMikvKiAweDQ4ICovLCBPZmZzZXRWYWx1ZSk7CisJCVJzc2kyT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7CisJfQorCWVsc2UKKwl7CisJCUxOQV9HYWluID0gKEdhaW5WYWx1ZSAmIDB4RkYwMCkgPj4gODsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCBPZmZzZXRWYWx1ZSk7CisJCVJzc2kwT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7CisJCVJzc2kxT2Zmc2V0ID0gKE9mZnNldFZhbHVlICYgMHhGRjAwKSA+PiA4OworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCArIDIpLyogMHg0QyAqLywgT2Zmc2V0VmFsdWUpOworCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCX0KKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwl7CisJCXBBZC0+YXRlLkNoYW5uZWwgPSBjaGFubmVsOworCQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCQltZGVsYXkoNSk7CisKKwkJZGF0YSA9IDB4MTA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIGRhdGEpOworCQlkYXRhID0gMHg0MDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgZGF0YSk7CisJCWRhdGEgPSAweDQwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCBkYXRhKTsKKwkJbWRlbGF5KDUpOworCisJCS8vIFN0YXJ0IFJ4CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBUUlVFOworCQlTZXRfQVRFX1Byb2MocEFkLCAiUlhGUkFNRSIpOworCisJCW1kZWxheSg1KTsKKworCQlmb3IgKGogPSAwOyBqIDwgMTA7IGorKykKKwkJeworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUwLCAmQmJwUjUwUnNzaTApOworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUxLCAmQmJwUjUxUnNzaTEpOworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUyLCAmQmJwUjUyUnNzaTIpOworCisJCQltZGVsYXkoMTApOworCisJCQkvLyBDYWxjdWxhdGUgUlNTSSAwCisJCQlpZiAoQmJwUjUwUnNzaTAgPT0gMCkKKwkJCXsKKwkJCQlSU1NJMCA9IC0xMDA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUlNTSTAgPSAoSU5UMzIpKC0xMiAtIEJicFI1MFJzc2kwIC0gTE5BX0dhaW4gLSBSc3NpME9mZnNldCk7CisJCQl9CisJCQlSU1NJWzBdW2pdID0gUlNTSTA7CisKKwkJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJCXsKKwkJCQkvLyBDYWxjdWxhdGUgUlNTSSAxCisJCQkJaWYgKEJicFI1MVJzc2kxID09IDApCisJCQkJeworCQkJCQlSU1NJMSA9IC0xMDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJTU0kxID0gKElOVDMyKSgtMTIgLSBCYnBSNTFSc3NpMSAtIExOQV9HYWluIC0gUnNzaTFPZmZzZXQpOworCQkJCX0KKwkJCQlSU1NJWzFdW2pdID0gUlNTSTE7CisJCQl9CisKKwkJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJCXsKKwkJCQkvLyBDYWxjdWxhdGUgUlNTSSAyCisJCQkJaWYgKEJicFI1MlJzc2kyID09IDApCisJCQkJCVJTU0kyID0gLTEwMDsKKwkJCQllbHNlCisJCQkJCVJTU0kyID0gKElOVDMyKSgtMTIgLSBCYnBSNTJSc3NpMiAtIExOQV9HYWluIC0gUnNzaTJPZmZzZXQpOworCisJCQkJUlNTSVsyXVtqXSA9IFJTU0kyOworCQkJfQorCQl9CisKKwkJLy8gU3RvcCBSeAorCQlTZXRfQVRFX1Byb2MocEFkLCAiUlhTVE9QIik7CisKKwkJbWRlbGF5KDUpOworCisjaWYgMC8vIERlYnVnIE1lc3NhZ2UuLi4uLi4uLi4uLi4uLi4uCisJCWF0ZV9wcmludCgiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwkJYXRlX3ByaW50KCJOb2lzZSBMZXZlbDogQ2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCWF0ZV9wcmludCgiUlNTSTAgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCVJTU0lbMF1bMF0sIFJTU0lbMF1bMV0sIFJTU0lbMF1bMl0sCisJCQlSU1NJWzBdWzNdLCBSU1NJWzBdWzRdLCBSU1NJWzBdWzVdLAorCQkJUlNTSVswXVs2XSwgUlNTSVswXVs3XSwgUlNTSVswXVs4XSwKKwkJCVJTU0lbMF1bOV0pOworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTEgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzFdWzBdLCBSU1NJWzFdWzFdLCBSU1NJWzFdWzJdLAorCQkJCVJTU0lbMV1bM10sIFJTU0lbMV1bNF0sIFJTU0lbMV1bNV0sCisJCQkJUlNTSVsxXVs2XSwgUlNTSVsxXVs3XSwgUlNTSVsxXVs4XSwKKwkJCQlSU1NJWzFdWzldKTsKKwkJfQorCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTIgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzJdWzBdLCBSU1NJWzJdWzFdLCBSU1NJWzJdWzJdLAorCQkJCVJTU0lbMl1bM10sIFJTU0lbMl1bNF0sIFJTU0lbMl1bNV0sCisJCQkJUlNTSVsyXVs2XSwgUlNTSVsyXVs3XSwgUlNTSVsyXVs4XSwKKwkJCQlSU1NJWzJdWzldKTsKKwkJfQorI2VuZGlmIC8vIDAgLy8KKwkJQnViYmxlU29ydCgxMCwgUlNTSVswXSk7CS8vIDFSCisKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQl7CisJCQlCdWJibGVTb3J0KDEwLCBSU1NJWzFdKTsKKwkJfQorCisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJeworCQkJQnViYmxlU29ydCgxMCwgUlNTSVsyXSk7CisJCX0KKworI2lmIDAvLyBEZWJ1ZyBNZXNzYWdlLi4uLi4uLi4uLi4uLi4uLgorCQlhdGVfcHJpbnQoIlxuQWZ0ZXIgU29ydGluZy4uLi5DaGFubmVsICVkXG4iLCBjaGFubmVsKTsKKwkJYXRlX3ByaW50KCJSU1NJMCA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJUlNTSVswXVswXSwgUlNTSVswXVsxXSwgUlNTSVswXVsyXSwKKwkJCVJTU0lbMF1bM10sIFJTU0lbMF1bNF0sIFJTU0lbMF1bNV0sCisJCQlSU1NJWzBdWzZdLCBSU1NJWzBdWzddLCBSU1NJWzBdWzhdLAorCQkJUlNTSVswXVs5XSk7CisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJeworCQkJYXRlX3ByaW50KCJSU1NJMSA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJCVJTU0lbMV1bMF0sIFJTU0lbMV1bMV0sIFJTU0lbMV1bMl0sCisJCQkJUlNTSVsxXVszXSwgUlNTSVsxXVs0XSwgUlNTSVsxXVs1XSwKKwkJCQlSU1NJWzFdWzZdLCBSU1NJWzFdWzddLCBSU1NJWzFdWzhdLAorCQkJCVJTU0lbMV1bOV0pOworCQl9CisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJeworCQkJYXRlX3ByaW50KCJSU1NJMiA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJCVJTU0lbMl1bMF0sIFJTU0lbMl1bMV0sIFJTU0lbMl1bMl0sCisJCQkJUlNTSVsyXVszXSwgUlNTSVsyXVs0XSwgUlNTSVsyXVs1XSwKKwkJCQlSU1NJWzJdWzZdLCBSU1NJWzJdWzddLCBSU1NJWzJdWzhdLAorCQkJCVJTU0lbMl1bOV0pOworCQl9CisJCWF0ZV9wcmludCgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisjZW5kaWYgLy8gMCAvLworCX0KKworCXBBZC0+YXRlLkNoYW5uZWwgPSBPcmdfQ2hhbm5lbDsKKwlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCisJLy8gUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZQorICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIE9yZ19CQlA2NnZhbHVlKTsKKyAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCBPcmdfQkJQNjl2YWx1ZSk7CisgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgT3JnX0JCUDcwdmFsdWUpOworCisJcmV0dXJuOworfQorCitCT09MRUFOIFN5bmNUeFJ4Q29uZmlnKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgb2Zmc2V0LCBVQ0hBUiB2YWx1ZSkKK3sKKwlVQ0hBUiB0bXAgPSAwLCBiYnBfZGF0YSA9IDA7CisKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgJmJicF9kYXRhKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAmYmJwX2RhdGEpOworCX0KKworCS8qIGNvbmZpcm0gYWdhaW4gKi8KKwlBU1NFUlQoYmJwX2RhdGEgPT0gdmFsdWUpOworCisJc3dpdGNoKG9mZnNldCkKKwl7CisJCWNhc2UgQkJQX1IxOgorCQkJLyogTmVlZCB0byBzeW5jLiB0eCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KKwkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MTggKi8pID4+IDM7CisJCSAgICBzd2l0Y2godG1wKQorCQkgICAgeworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAyIDo6IEJvdGggREFDcyB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAyOgorCQkJCQkvKiBBbGwgKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMDsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDAgOjogREFDIDAgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMDoKKwkJCQkJLyogQW50ZW5uYSBvbmUgKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMTsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDEgOjogREFDIDEgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMToKKwkJCQkJLyogQW50ZW5uYSB0d28gKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMjsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgZGVmYXVsdDoKKwkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLS0gU3RoLiB3cm9uZyEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fRlVOQ1RJT05fXykpOworCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJCSAgICB9CisJCQlicmVhazsvKiBjYXNlIEJCUF9SMSAqLworCisJCWNhc2UgQkJQX1IzOgorCQkJLyogTmVlZCB0byBzeW5jLiByeCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KKwkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCAxKSB8ICgxIDw8IDApKS8qIDB4MDMgKi8pOworCQkgICAgc3dpdGNoKHRtcCkKKwkJICAgIHsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMyA6OiBBbGwgQURDcyB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAzOgorCQkJCQkvKiBBbGwgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMDsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDAgOjogQURDIDAgd2lsbCBiZSB1c2VkIGJ5IFFBLCAqLworCQkJCS8qIHVubGVzcyB0aGUgQkJQIFIzIGJpdFs0OjNdID0gMiAqLworCQkgICAgICAgIGNhc2UgMDoKKwkJCQkJLyogQW50ZW5uYSBvbmUgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMTsKKwkJCQkJdG1wID0gKChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MDMgKi8pID4+IDMpOworCQkJCQlpZiAodG1wID09IDIpLy8gM1IKKwkJCQkJeworCQkJCQkJLyogRGVmYXVsdCA6IEFsbCBBRENzIHdpbGwgYmUgdXNlZCBieSBRQSAqLworCQkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMDsKKwkJCQkJfQorCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMSA6OiBBREMgMSB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAxOgorCQkJCQkvKiBBbnRlbm5hIHR3byAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAyOworCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMiA6OiBBREMgMiB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAyOgorCQkJCQkvKiBBbnRlbm5hIHRocmVlICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDM7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgIGRlZmF1bHQ6CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIEltcG9zc2libGUhICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCQkgICAgfQorCQkJYnJlYWs7LyogY2FzZSBCQlBfUjMgKi8KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLS0gU3RoLiB3cm9uZyEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fRlVOQ1RJT05fXykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCit7CisJVUxPTkcgaSwgVmFsdWUgPSAwOworCVVMT05HICpwRHN0LCAqcFNyYzsKKwlVQ0hBUiAqcDg7CisKKwlwOCA9IHNyYzsKKwlwRHN0ID0gKFVMT05HICopIGRzdDsKKwlwU3JjID0gKFVMT05HICopIHNyYzsKKworCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQorCXsKKwkJLyogRm9yIGFsaWdubWVudCBpc3N1ZSwgd2UgbmVlZCBhIHZhcmlhYmxlICJWYWx1ZSIuICovCisJCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCA0KTsKKwkJVmFsdWUgPSBodG9ubChWYWx1ZSk7CisJCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKKwkJcERzdCsrOworCQlwU3JjKys7CisJfQorCWlmICgobGVuICUgNCkgIT0gMCkKKwl7CisJCS8qIHdpc2ggdGhhdCBpdCB3aWxsIG5ldmVyIHJlYWNoIGhlcmUgKi8KKwkJbWVtbW92ZSgmVmFsdWUsIHBTcmMsIChsZW4gJSA0KSk7CisJCVZhbHVlID0gaHRvbmwoVmFsdWUpOworCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgKGxlbiAlIDQpKTsKKwl9Cit9CisKK3N0YXRpYyBWT0lEIG1lbWNweV9leHMoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbikKK3sKKwlVTE9ORyBpOworCVVDSEFSICpwRHN0LCAqcFNyYzsKKworCXBEc3QgPSBkc3Q7CisJcFNyYyA9IHNyYzsKKworCWZvciAoaSA9IDA7IGkgPCAobGVuLzIpOyBpKyspCisJeworCQltZW1tb3ZlKHBEc3QsIHBTcmMsIDIpOworCQkqKChVU0hPUlQgKilwRHN0KSA9IGh0b25zKCooKFVTSE9SVCAqKXBEc3QpKTsKKwkJcERzdCs9MjsKKwkJcFNyYys9MjsKKwl9CisKKwlpZiAoKGxlbiAlIDIpICE9IDApCisJeworCQltZW1tb3ZlKHBEc3QsIHBTcmMsIDEpOworCX0KK30KKworc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pCit7CisJVUlOVDMyIGksIFZhbHVlOworCVVJTlQzMiAqcERzdCwgKnBTcmM7CisKKwlwRHN0ID0gKFVJTlQzMiAqKSBkc3Q7CisJcFNyYyA9IChVSU5UMzIgKikgc3JjOworCisJZm9yIChpID0gMCA7IGkgPCAobGVuLzQpOyBpKyspCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIChVTE9ORylwU3JjLCAmVmFsdWUpOworCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKKwkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIDQpOworCQlwRHN0Kys7CisJCXBTcmMrKzsKKwl9CisJcmV0dXJuOworfQorCisvLyBUT0RPOgorI2lmIDAKKy8qIFRoZXNlIHdvcmsgb25seSB3aGVuIFJBTElOS19BVEUgaXMgZGVmaW5lZCAqLworSU5UIFNldF9UeFN0YXJ0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlVQ0hBUiBidWZmZXJbMjZdID0gezB4ODgsIDB4MDIsIDB4MmMsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4MDAsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTEsIDB4YzAsIDB4MjIsIDB4MDAsIDB4MDB9OworCVBPU19DT09LSUUgcE9iajsKKworCWlmIChwQWQtPmF0ZS5UeFN0YXR1cyAhPSAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwQWQtPmF0ZS5UeEluZm8gPSAweDA0MDAwMDAwOworCWJ6ZXJvKCZwQWQtPmF0ZS5UeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IDA7Ly8gTU9ERV9DQ0sKKwlwQWQtPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCA9IDEyMjY7CisJcEFkLT5hdGUuVHhXSS5NQ1MgPSAzOworCS8vcEFkLT5hdGUuTW9kZSA9IEFURV9TVEFSVDsKKwlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWEZSQU1FOworCXBBZC0+YXRlLlR4Q291bnQgPSB2YWx1ZTsKKwlwQWQtPmF0ZS5RSUQgPSAwOworCXBBZC0+YXRlLkhMZW4gPSAyNjsKKwlwQWQtPmF0ZS5QTGVuID0gMDsKKwlwQWQtPmF0ZS5ETGVuID0gMTIwMDsKKwltZW1jcHkocEFkLT5hdGUuSGVhZGVyLCBidWZmZXIsIDI2KTsKKwlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkvL3BPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJLy90YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5BdGVUeFRhc2spOworCXJldHVybiBUUlVFOworfQorI2VuZGlmICAvKiBlbmQgb2YgI2lmIDAgKi8KKworSU5UIFNldF9UeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXRfVHhTdG9wX1Byb2NcbiIpKTsKKworCWlmIChTZXRfQVRFX1Byb2MocEFkLCAiVFhTVE9QIikpCisJeworCXJldHVybiBUUlVFOworfQorCWVsc2UKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKK0lOVCBTZXRfUnhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0X1J4U3RvcF9Qcm9jXG4iKSk7CisKKwlpZiAoU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpKQorCXsKKwlyZXR1cm4gVFJVRTsKK30KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisjaWYgMAorSU5UIFNldF9FRVdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVTSE9SVCBvZmZzZXQgPSAwLCB2YWx1ZTsKKwlQVUNIQVIgcDIgPSBhcmc7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiA9PSAnOicpCisJeworCQlBMkhleChvZmZzZXQsIGFyZyk7CisJCUEySGV4KHZhbHVlLCBwMisgMSk7CisJfQorCWVsc2UKKwl7CisJCUEySGV4KHZhbHVlLCBhcmcpOworCX0KKworCWlmIChvZmZzZXQgPj0gRUVQUk9NX1NJWkUpCisJeworCQlhdGVfcHJpbnQoIk9mZnNldCBjYW4gbm90IGV4Y2VlZCBFRVBST01fU0laRSggPT0gMHglMDR4KVxuIiwgRUVQUk9NX1NJWkUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJUlRNUF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFsdWUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQkJQUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiB2YWx1ZSA9IDAsIG9mZnNldDsKKworCUEySGV4KG9mZnNldCwgYXJnKTsKKworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKKwl9CisKKwlhdGVfcHJpbnQoIiV4XG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQgU2V0X0JCUFdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVTSE9SVCBvZmZzZXQgPSAwOworCVBVQ0hBUiBwMiA9IGFyZzsKKwlVQ0hBUiB2YWx1ZTsKKworCXdoaWxlKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQorCXsKKwkJcDIrKzsKKwl9CisKKwlpZiAoKnAyID09ICc6JykKKwl7CisJCUEySGV4KG9mZnNldCwgYXJnKTsKKwkJQTJIZXgodmFsdWUsIHAyKyAxKTsKKwl9CisJZWxzZQorCXsKKwkJQTJIZXgodmFsdWUsIGFyZyk7CisJfQorCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOworCX0KKwllbHNlCisJeworCQlSVE5QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOworCX0KKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1JGV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJUFVDSEFSIHAyLCBwMywgcDQ7CisJVUxPTkcgUjEsIFIyLCBSMywgUjQ7CisKKwlwMiA9IGFyZzsKKworCXdoaWxlKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQorCXsKKwkJcDIrKzsKKwl9CisKKwlpZiAoKnAyICE9ICc6JykKKwkJcmV0dXJuIEZBTFNFOworCisJcDMgPSBwMiArIDE7CisKKwl3aGlsZSgoKnAzICE9ICc6JykgJiYgKCpwMyAhPSAnXDAnKSkKKwl7CisJCXAzKys7CisJfQorCisJaWYgKCpwMyAhPSAnOicpCisJCXJldHVybiBGQUxTRTsKKworCXA0ID0gcDMgKyAxOworCisJd2hpbGUoKCpwNCAhPSAnOicpICYmICgqcDQgIT0gJ1wwJykpCisJeworCQlwNCsrOworCX0KKworCWlmICgqcDQgIT0gJzonKQorCQlyZXR1cm4gRkFMU0U7CisKKworCUEySGV4KFIxLCBhcmcpOworCUEySGV4KFIyLCBwMiArIDEpOworCUEySGV4KFIzLCBwMyArIDEpOworCUEySGV4KFI0LCBwNCArIDEpOworCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjQpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgIC8vIGVuZCBvZiAjaWYgMCAvLworI2VuZGlmCS8vIFJBTElOS18yOHh4X1FBIC8vCisKKyNlbmRpZgkvLyBSQUxJTktfQVRFIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MThjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5oCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fQVRFX0hfXworI2RlZmluZSBfX0FURV9IX18KKworI2lmbmRlZiBVQ09TCisjZGVmaW5lIGF0ZV9wcmludCBwcmludGsKKyNkZWZpbmUgQVRFREJHUFJJTlQgREJHUFJJTlQKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBFRVBST01fU0laRQkJCQkJCQkJMHg0MDAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgRUVQUk9NX0JJTl9GSUxFX05BTUUgICIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9lMnAuYmluIgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworI2Vsc2UgLy8gIVVDT1MgLy8KKyNkZWZpbmUgZkFURV9MT0FEX0VFUFJPTQkJCQkJCTB4MEM0MworI2lmZGVmIENPTkZJR19QUklOVEsKK2V4dGVybiBJTlQgQ29uc29sZVJlc3BvbnNlKElOIFBVQ0hBUiBidWZmKTsKK2V4dGVybiBpbnQgKCpyZW1vdGVfZGlzcGxheSkoY2hhciAqKTsKK2V4dGVybiB2b2lkIHB1dHMgKGNvbnN0IGNoYXIgKnMpOworCisvKiBzcGVjaWZpY2x5IGRlZmluZWQgdG8gcmVkaXJlY3QgYW5kIHNob3cgYXRlLXJlbGF0ZWQgbWVzc2FnZXMgdG8gaG9zdC4gKi8KKy8qIFRyeSB0byBkZWZpbmUgYXRlX3ByaW50IGFzIGEgbWFjcm8uICovCisjZGVmaW5lIGF0ZV9wcmludChmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICBcCitkb3sgICBpbnQgKCpvcmdfcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKikgPSBOVUxMOyAgIFwKKwlvcmdfcmVtb3RlX2Rpc3BsYXkgPSByZW1vdGVfZGlzcGxheTtcCisJLyogU2F2ZSBvcmlnaW5hbCAicmVtb3RlX2Rpc3BsYXkiICovXAorCXJlbW90ZV9kaXNwbGF5ID0gKGludCAoKikoY2hhciAqKSlDb25zb2xlUmVzcG9uc2U7ICAgICAgICAgICBcCisJcHJpbnRrKGZtdCwgIyMgYXJncyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisJLyogUmVzdG9yZSB0aGUgcmVtb3RlX2Rpc3BsYXkgZnVuY3Rpb24gcG9pbnRlciAqLyAgICAgICAgXAorCXJlbW90ZV9kaXNwbGF5ID0gb3JnX3JlbW90ZV9kaXNwbGF5OyB9d2hpbGUoMCkKKworI2RlZmluZSBBVEVEQkdQUklOVChMZXZlbCwgRm10KSAgICAJXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoTGV2ZWwpIDw9IFJURGVidWdMZXZlbCkgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF0ZV9wcmludCBGbXQ7CQkJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gQ09ORklHX1BSSU5USyAvLworI2VuZGlmIC8vICFVQ09TIC8vCisKKyNkZWZpbmUgQVRFX09OKF9wKSAgICAgICAgICAgICAgKCgoX3ApLT5hdGUuTW9kZSkgIT0gQVRFX1NUT1ApCisKKy8qIFJUMjg4MF9pTklDIHdpbGwgZGVmaW5lICJSVDI4NjAiLiAqLworCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSBSVDI4NjAuICovCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgRUVQUk9NX1NJWkUJCQkJCQkJCTB4NDAwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEVFUFJPTV9CSU5fRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NzBTVEEvZTJwLmJpbiIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQorI2RlZmluZSBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQorCisjZGVmaW5lIEJVTEtfT1VUX0xPQ0socExvY2ssIElycUZsYWdzKQlcCisJCWlmKDEgLyohKGluX2ludGVycnVwdCgpICYgMHhmZmZmMDAwMCkqLykJXAorCQkJUlRNUF9JUlFfTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKyNkZWZpbmUgQlVMS19PVVRfVU5MT0NLKHBMb2NrLCBJcnFGbGFncykJXAorCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKKwkJCVJUTVBfSVJRX1VOTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKy8vIFByb3RvdHlwZXMgb2YgY29tcGxldGlvbiBmdW51Yy4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShwdXJiLCBwdF9yZWdzKSAgICBBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmIpCisjZW5kaWYKKworVk9JRCBBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKAorCUlOIHB1cmJiX3QgcHVyYiwKKwlPVVQgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworCitWT0lEIEFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCk7CisKK1ZPSUQgQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgcnRfZWVfcmVhZF9hbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFVTSE9SVCAqRGF0YSk7CisKKworVk9JRCBydF9lZV93cml0ZV9hbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCAqRGF0YSk7CisKK0lOVCBTZXRfQVRFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfREFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9TQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX0JXX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQ09VTlRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9NQ1NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfR0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisKK0lOVAlTZXRfQVRFX1JYX0ZFUl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1JlYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfU2hvd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX0hlbHBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCitWT0lEIEFURV9RQV9TdGF0aXN0aWNzKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQUlhXSV9TVFJVQwkJCXBSeFdJLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDICAgIHAyOHh4UnhELAorCUlOIFBIRUFERVJfODAyXzExCQlwSGVhZGVyKTsKKworVk9JRCBSdG1wRG9BdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgQnViYmxlU29ydCgKKwlJTiAgSU5UMzIgbiwKKwlJTiAgSU5UMzIgYVtdKTsKKworVk9JRCBDYWxOb2lzZUxldmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisJSU4gIFVDSEFSICAgICAgICAgICBjaGFubmVsLAorCU9VVCBJTlQzMiAgICAgICAgICAgYnVmZmVyWzNdWzEwXSk7CisKK0JPT0xFQU4gU3luY1R4UnhDb25maWcoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglVU0hPUlQJCQlvZmZzZXQsCisJSU4JVUNIQVIJCQl2YWx1ZSk7CisKKyNpZiAwCitJTlQgU2V0X1R4U3RhcnRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmICAvLyAwIC8vCisKK0lOVCBTZXRfVHhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWYgMAorSU5UIFNldF9FRVJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0VFV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JCUFJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JCUFdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SRldyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBlbmQgb2YgI2lmIDAgLy8KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworVk9JRCBBVEVBc2ljU3dpdGNoQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpOworCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIENIQVIJCQkJUnNzaSwKKwlJTiBVQ0hBUiAgICBSc3NpTnVtYmVyKTsKKworVk9JRCBBVEVTYW1wbGVSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QU3RhdGlvblN0b3AoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBTdGF0aW9uU3RhcnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIF9fQVRFX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9jb25maWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmZTI2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfY29uZmlnLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRfY29uZmlnLmgKKworCUFic3RyYWN0OgorCUNlbnRyYWwgaGVhZGVyIGZpbGUgdG8gbWFpbnRhaW4gYWxsIGluY2x1ZGUgZmlsZXMgZm9yIGFsbCBORElTCisJbWluaXBvcnQgZHJpdmVyIHJvdXRpbmVzLgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKKworKi8KKyNpZm5kZWYJX19SVF9DT05GSUdfSF9fCisjZGVmaW5lCV9fUlRfQ09ORklHX0hfXworCisjaW5jbHVkZSAgICAicnRtcF90eXBlLmgiCisjaWZkZWYgVUNPUworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIAkicnRfdWNvcy5oIgorI2VuZGlmCisKKyNpZmRlZiBMSU5VWAorI2luY2x1ZGUJInJ0X2xpbnV4LmgiCisjZW5kaWYKKyNpbmNsdWRlICAgICJydG1wX2RlZi5oIgorI2luY2x1ZGUgICAgInJ0Mjh4eC5oIgorCisKKyNpZmRlZiBSVDI4NzAKKyNpbmNsdWRlCSJydDI4NzAuaCIKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2luY2x1ZGUgICAgIm9pZC5oIgorI2luY2x1ZGUgICAgIm1sbWUuaCIKKyNpbmNsdWRlICAgICJ3cGEuaCIKKyNpbmNsdWRlICAgICJtZDUuaCIKKyNpbmNsdWRlICAgICJydG1wLmgiCisjaW5jbHVkZQkiYXAuaCIKKyNpbmNsdWRlCSJkZnMuaCIKKyNpbmNsdWRlCSJjaGxpc3QuaCIKKyNpbmNsdWRlCSJzcGVjdHJ1bS5oIgorCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyNpbmNsdWRlICAgICJsZWFwLmgiCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCisjaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgorI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorI2luY2x1ZGUgInJ0X2F0ZS5oIgorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZXJyb3IgIkJ1aWxkIGZvciBiZWluZyBjb250cm9sbGVkIGJ5IE5ldHdvcmtNYW5hZ2VyIG9yIHdleHQsIHBsZWFzZSBzZXQgSEFTX1dQQV9TVVBQTElDQU5UPXkgYW5kIEhBU19OQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVD15IgorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisjaW5jbHVkZQkidnJfaWthbnMuaCIKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKyNlbmRpZgkvLyBfX1JUX0NPTkZJR19IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZWE4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmMKQEAgLTAsMCArMSwxMDk1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKK1VMT05HCVJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOworCitCVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKKy8vQlVJTERfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlQyODcwCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZQorY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7CisJLy8gc3lzdGVtIHN0YXR1cyBldmVudAorICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCisJIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLworCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCisJInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLworCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCisJImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLworCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLworCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKKyAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKKwkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLworCX07CisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlhZGRfdGltZXIocFRpbWVyKTsKK30KKworLyogY29udmVydCBOZGlzTUluaXRpYWxpemVUaW1lciAtLT4gUlRNUF9PU19Jbml0X1RpbWVyICovCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSkKK3sKKwlpbml0X3RpbWVyKHBUaW1lcik7CisgICAgcFRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKyAgICBwVGltZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247Cit9CisKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQorCQlyZXR1cm47CisKKwl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWFkZF90aW1lcihwVGltZXIpOworfQorCitWT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJbW9kX3RpbWVyKHBUaW1lciwgamlmZmllcyArIHRpbWVvdXQpOworfQorCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCisJeworCQkqcENhbmNlbGxlZCA9IGRlbF90aW1lcl9zeW5jKHBUaW1lcik7CisJfQorCWVsc2UKKwl7CisJCSpwQ2FuY2VsbGVkID0gVFJVRTsKKwl9CisKK30KKworVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KQoreworCS8vUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsKK30KKworLy8gVW5pZnkgYWxsIGRlbGF5IHJvdXRpbmUgYnkgdXNpbmcgdWRlbGF5CitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYykKK3sKKwlVTE9ORwlpOworCisJZm9yIChpID0gMDsgaSA8ICh1c2VjIC8gNTApOyBpKyspCisJCXVkZWxheSg1MCk7CisKKwlpZiAodXNlYyAlIDUwKQorCQl1ZGVsYXkodXNlYyAlIDUwKTsKK30KKwordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpCit7CisJdGltZS0+dS5Mb3dQYXJ0ID0gamlmZmllczsKK30KKworLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAorTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSkKK3sKKwkqbWVtID0gKFBVQ0hBUikga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoKm1lbSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwllbHNlCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKy8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pCit7CisKKwlBU1NFUlQobWVtKTsKKwlrZnJlZShtZW0pOworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgZnJhZyByeCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCX0KKworCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgdHggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCX0KKworCWlmIChwa3QpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBwa3QtPmRhdGE7CisJfQorCWVsc2UKKwl7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwl9CisKKwlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworfQorCisKK1ZPSUQgYnVpbGRfdHhfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUglwRnJhbWUsCisJSU4JVUxPTkcJRnJhbWVMZW4pCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFR4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBUeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJTmRpc01vdmVNZW1vcnkoc2tiX3B1dChwVHhQa3QsIEZyYW1lTGVuKSwgcEZyYW1lLCBGcmFtZUxlbik7Cit9CisKK1ZPSUQJUlRNUEZyZWVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFBPU19DT09LSUUgb3NfY29va2llOworCWludCBpbmRleDsKKworCW9zX2Nvb2tpZT0oUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKKworCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisKKwlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwl7CisgICAgCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7CisJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJfQorCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKworCXZmcmVlKHBBZCk7IC8vIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihSVE1QX0FEQVBURVIpLHBBZCxvc19jb29raWUtPnBBZF9wYSk7CisJa2ZyZWUob3NfY29va2llKTsKK30KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAorCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKKwkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCisJCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEluc0FNU0RVSGRyCUVXQyBBLU1TRFUgZm9ybWF0IGhhcyBleHRyYSAxNC1ieXRlcyBoZWFkZXIuIGlmIFRSVUUsIGluc2VydCB0aGlzIDE0LWJ5dGUgaGRyIGluIGZyb250IG9mIE1TRFUuCisJCSpwU3JjVG90YWxMZW4JCQlyZXR1cm4gdG90YWwgcGFja2V0IGxlbmd0aC4gVGhpcyBsZW5naHQgaXMgY2FsY3VsYXRlZCB3aXRoIDgwMi4zIGZvcm1hdCBwYWNrZXQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCXBJbnNBTVNEVUhkciwKKwlJTglQTkRJU19QQUNLRVQJcEluUGFja2V0LAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJQVNTRVJUKHBJblBhY2tldCk7CisJQVNTRVJUKHBwT3V0UGFja2V0KTsKKworCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworIAlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJKnBwT3V0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1QocGt0KTsKKworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7CisKKwlwcmludGsoIiMjI0Nsb25lIyMjXG4iKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8vIHRoZSBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgbXVzdCBiZSBmcmVlZCB2aWEgUlRNUEZyZWVOZGlzUGFja2V0KCkKK05ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyLAorCUlOCVVJTlQJCQlIZWFkZXJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUlOVAkJCURhdGFMZW4pCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQVNTRVJUKHBEYXRhKTsKKwlBU1NFUlQoRGF0YUxlbik7CisKKwkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAorCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUICopIGRldl9hbGxvY19za2IoSGVhZGVyTGVuICsgRGF0YUxlbiArIFRYUEFERElOR19TSVpFKTsKKwlpZiAocFBhY2tldCA9PSBOVUxMKQorIAl7CisJCSpwcFBhY2tldCA9IE5VTEw7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJSVE1QQWxsb2NhdGVOZGlzUGFja2V0IEZhaWxcblxuIik7CisjZW5kaWYKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQKKwlpZiAoSGVhZGVyTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpLCBwSGVhZGVyLCBIZWFkZXJMZW4pOworCWlmIChEYXRhTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpICsgSGVhZGVyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisKKwkvLyAzLiB1cGRhdGUgbGVuZ3RoIG9mIHBhY2tldAorIAlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgSGVhZGVyTGVuK0RhdGFMZW4pOworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CisvLwlwcmludGsoIiVzIDogcFBhY2tldCA9ICVwLCBsZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwUGFja2V0LCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk7CisJKnBwUGFja2V0ID0gcFBhY2tldDsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlc2NyaXB0aW9uOgorCVRoaXMgcm91dGluZSBmcmVlcyBhIG1pbmlwb3J0IGludGVybmFsbHkgYWxsb2NhdGVkIE5ESVNfUEFDS0VUIGFuZCBpdHMKKwljb3JyZXNwb25kaW5nIE5ESVNfQlVGRkVSIGFuZCBhbGxvY2F0ZWQgbWVtb3J5LgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCit7CisJZGV2X2tmcmVlX3NrYl9hbnkoUlRQS1RfVE9fT1NQS1QocFBhY2tldCkpOworfQorCisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorLy8gTk9URTogd2UgZG8gaGF2ZSBhbiBhc3N1bXB0aW9uIGhlcmUsIHRoYXQgQnl0ZTAgYW5kIEJ5dGUxIGFsd2F5cyByZWFzaWQgYXQgdGhlIHNhbWUKKy8vCQkJIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlcgorTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKKwlJTglQTkRJU19CVUZGRVIJcEZpcnN0QnVmZmVyLAorCUlOCVVDSEFSCQkJRGVzaXJlZE9mZnNldCwKKwlPVVQgUFVDSEFSCQkJcEJ5dGUwLAorCU9VVCBQVUNIQVIJCQlwQnl0ZTEpCit7CisgICAgKnBCeXRlMCA9ICooUFVDSEFSKShwRmlyc3RCdWZmZXIgKyBEZXNpcmVkT2Zmc2V0KTsKKyAgICAqcEJ5dGUxID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQgKyAxKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKK3ZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pCit7CisJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKKwlwUGFja2V0SW5mby0+cEZpcnN0QnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMTsKKwlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCSpwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJKnBTcmNCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKK30KKwordm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3sKKwlQTkRJU19QQUNLRVQgcFBhY2tldCA9IE5VTEw7CisKKwlpZiAoKnBwUGFja2V0KQorCQlwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKCpwcFBhY2tldCk7CisKKwlpZiAocFBhY2tldCkKKwl7CisJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7CisJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMTsKKwkJcFBhY2tldEluZm8tPlRvdGFsUGFja2V0TGVuZ3RoID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwkJKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJKnBTcmNCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJKnBwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAwOworCQlwUGFja2V0SW5mby0+cEZpcnN0QnVmZmVyID0gTlVMTDsKKwkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAwOworCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSAwOworCisJCSpwU3JjQnVmVkEgPSBOVUxMOworCQkqcFNyY0J1ZkxlbiA9IDA7CisJCSpwcFBhY2tldCA9IE5VTEw7CisJfQorfQorCisvLyBub3QgeWV0IHN1cHBvcnQgTUJTUworUE5FVF9ERVYgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisgICAgUE5FVF9ERVYgZGV2X3AgPSBOVUxMOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJZGV2X3AgPSBwQWQtPm5ldF9kZXY7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVNTRVJUKGRldl9wKTsKKwlyZXR1cm4gZGV2X3A7IC8qIHJldHVybiBvbmUgb2YgTUJTUyAqLworfQorCitQTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwlQTkRJU19QQUNLRVQJcFJldFBhY2tldCA9IE5VTEw7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUNIQVIJCQkqcERhdGE7CisKKwlEYXRhU2l6ZSA9IChVU0hPUlQpIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCisKKwlza2IgPSBza2JfY2xvbmUoUlRQS1RfVE9fT1NQS1QocFBhY2tldCksIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAoc2tiKQorCXsKKwkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJCXBSZXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOworCX0KKworI2lmIDAKKwlpZiAoKHNrYiA9IF9fZGV2X2FsbG9jX3NrYihEYXRhU2l6ZSArIDIrMzIsIE1FTV9BTExPQ19GTEFHKSkgIT0gTlVMTCkKKwl7CisJCXNrYl9yZXNlcnZlKHNrYiwgMiszMik7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcERhdGEsIERhdGFTaXplKTsKKwkJc2tiX3B1dChza2IsIERhdGFTaXplKTsKKwkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJCXBSZXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIHBSZXRQYWNrZXQ7CisKK30KKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVBORElTX1BBQ0tFVAlwUGFja2V0ID0gTlVMTDsKKworCisJaWYgKChza2IgPSBfX2Rldl9hbGxvY19za2IoSGRyTGVuICsgRGF0YVNpemUgKyAyLCBNRU1fQUxMT0NfRkxBRykpICE9IE5VTEwpCisJeworCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQlOZGlzTW92ZU1lbW9yeShza2ItPnRhaWwsIHBIZWFkZXI4MDJfMywgSGRyTGVuKTsKKwkJc2tiX3B1dChza2IsIEhkckxlbik7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcERhdGEsIERhdGFTaXplKTsKKwkJc2tiX3B1dChza2IsIERhdGFTaXplKTsKKwkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJCXBQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOworCX0KKworCXJldHVybiBwUGFja2V0OworfQorCisKKyNkZWZpbmUgVEtJUF9UWF9NSUNfU0laRQkJOAorUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiLCAqbmV3c2tiOworCisKKwlza2IgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKKwlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBUS0lQX1RYX01JQ19TSVpFKQorCXsKKwkJLy8gYWxsb2MgYSBuZXcgc2tiIGFuZCBjb3B5IHRoZSBwYWNrZXQKKwkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIFRLSVBfVFhfTUlDX1NJWkUsIEdGUF9BVE9NSUMpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZiAobmV3c2tiID09IE5VTEwpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkV4dGVuZCBUeC5NSUMgZm9yIHBhY2tldCBmYWlsZWQhLCBkcm9wcGluZyBwYWNrZXQhXG4iKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlza2IgPSBuZXdza2I7CisJfQorCisJcmV0dXJuIE9TUEtUX1RPX1JUUEtUKHNrYik7CisKKyNpZiAwCisJaWYgKChkYXRhID0gc2tiX3B1dChza2IsIFRLSVBfVFhfTUlDX1NJWkUpKSAhPSBOVUxMKQorCXsJLy8gSWYgd2UgY2FuIGV4dGVuZCBpdCwgd2VsbCwgY29weSBpdCBmaXJzdC4KKwkJTmRpc01vdmVNZW1vcnkoZGF0YSwgcEFkLT5Qcml2YXRlSW5mby5UeC5NSUMsIFRLSVBfVFhfTUlDX1NJWkUpOworCX0KKwllbHNlCisJeworCQkvLyBPdGhlcndpc2UsIGNvcHkgdGhlIHBhY2tldC4KKwkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIFRLSVBfVFhfTUlDX1NJWkUsIEdGUF9BVE9NSUMpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZiAobmV3c2tiID09IE5VTEwpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkV4dGVuZCBUeC5NSUMgdG8gcGFja2V0IGZhaWxlZCEsIGRyb3BwaW5nIHBhY2tldFxuIikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2tiID0gbmV3c2tiOworCisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcEFkLT5Qcml2YXRlSW5mby5UeC5NSUMsIFRLSVBfVFhfTUlDX1NJWkUpOworCQlza2JfcHV0KHNrYiwgVEtJUF9UWF9NSUNfU0laRSk7CisJfQorCisJcmV0dXJuIE9TUEtUX1RPX1JUUEtUKHNrYik7CisjZW5kaWYKKworfQorCisKKworCitQTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFJ4UGt0OworCXN0cnVjdCBza19idWZmCSpwQ2xvbmVkUGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJLy8gY2xvbmUgdGhlIHBhY2tldAorCXBDbG9uZWRQa3QgPSBza2JfY2xvbmUocFJ4UGt0LCBNRU1fQUxMT0NfRkxBRyk7CisKKwlpZiAocENsb25lZFBrdCkKKwl7CisgICAgCS8vIHNldCB0aGUgY29ycmVjdCBkYXRhcHRyIGFuZCBkYXRhIGxlbgorICAgIAlwQ2xvbmVkUGt0LT5kZXYgPSBwUnhQa3QtPmRldjsKKyAgICAJcENsb25lZFBrdC0+ZGF0YSA9IHBEYXRhOworICAgIAlwQ2xvbmVkUGt0LT5sZW4gPSBEYXRhU2l6ZTsKKyAgICAJcENsb25lZFBrdC0+dGFpbCA9IHBDbG9uZWRQa3QtPmRhdGEgKyBwQ2xvbmVkUGt0LT5sZW47CisJCUFTU0VSVChEYXRhU2l6ZSA8IDE1MzApOworCX0KKwlyZXR1cm4gcENsb25lZFBrdDsKK30KKworLy8KKy8vIGNoYW5nZSBPUyBwYWNrZXQgRGF0YVB0ciBhbmQgRGF0YUxlbgorLy8KK3ZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCXBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCXBPU1BrdC0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJcE9TUGt0LT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOworCXBPU1BrdC0+dGFpbCA9IHBPU1BrdC0+ZGF0YSArIHBPU1BrdC0+bGVuOworfQorCisKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCUFTU0VSVChwSGVhZGVyODAyXzMpOworCisJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CisJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47CisKKwkvLworCS8vIGNvcHkgODAyLjMgaGVhZGVyCisJLy8KKwkvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBMRU5HVEhfODAyXzMpLCBwSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisKKwordm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFJ4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCisJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgIC8qIFB1c2ggdXAgdGhlIHByb3RvY29sIHN0YWNrICovCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCUlLQU5PU19EYXRhRnJhbWVSeChwQWQsIHBSeFBrdC0+ZGV2LCBwUnhQa3QsIHBSeFBrdC0+bGVuKTsKKyNlbHNlCisJcFJ4UGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBSeFBrdCwgcFJ4UGt0LT5kZXYpOworCisvLyNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKKy8vCSooaW50KikocFJ4UGt0LT5jYikgPSBCUklER0VfVEFHOworLy8jZW5kaWYKKwluZXRpZl9yeChwUnhQa3QpOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KK30KKworCitQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCitydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZykKK3sKKwlzZy0+TnVtYmVyT2ZFbGVtZW50cyA9IDE7CisJc2ctPkVsZW1lbnRzWzBdLkFkZHJlc3MgPSAgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCXNnLT5FbGVtZW50c1swXS5MZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwlyZXR1cm4gKHNnKTsKK30KKwordm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1ZkxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdDsKKwlpbnQgeDsKKworCWlmIChSVERlYnVnTGV2ZWwgPCBSVF9ERUJVR19UUkFDRSkKKwkJcmV0dXJuOworCisJcHQgPSBwU3JjQnVmVkE7CisJcHJpbnRrKCIlczogJXAsIGxlbiA9ICVkXG4iLHN0ciwgIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKKwlmb3IgKHg9MDsgeDxTcmNCdWZMZW47IHgrKykKKwl7CisJCWlmICh4ICUgMTYgPT0gMCkKKwkJCXByaW50aygiMHglMDR4IDogIiwgeCk7CisJCXByaW50aygiJTAyeCAiLCAoKHVuc2lnbmVkIGNoYXIpcHRbeF0pKTsKKwkJaWYgKHglMTYgPT0gMTUpIHByaW50aygiXG4iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2VuZCBsb2cgbWVzc2FnZSB0aHJvdWdoIHdpcmVsZXNzIGV2ZW50CisKKwkJU3VwcG9ydCBzdGFuZGFyZCBpd19ldmVudCB3aXRoIElXRVZDVVNUT00uIEl0IGlzIHVzZWQgYmVsb3cuCisKKwkJaXdyZXFfZGF0YS5kYXRhLmZsYWdzIGlzIHVzZWQgdG8gc3RvcmUgZXZlbnRfZmxhZyB0aGF0IGlzIGRlZmluZWQgYnkgdXNlci4KKwkJaXdyZXFfZGF0YS5kYXRhLmxlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBldmVudCBsb2cuCisKKwkJVGhlIGZvcm1hdCBvZiB0aGUgZXZlbnQgbG9nIGlzIGNvbXBvc2VkIG9mIHRoZSBlbnRyeSdzIE1BQyBhZGRyZXNzIGFuZAorCQl0aGUgZGVzaXJlZCBsb2cgbWVzc2FnZSAocmVmZXIgdG8gcFdpcmVsZXNzRXZlbnRUZXh0KS4KKworCQkJZXg6IDExOjIyOjMzOjQ0OjU1OjY2IGhhcyBhc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseQorCisJCXAucy4gVGhlIHJlcXVpcmVtZW50IG9mIFdpcmVsZXNzIEV4dGVuc2lvbiBpcyB2MTUgb3IgbmV3ZXIuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAorCUlOCVBVQ0hBUiAJCQlwQWRkciwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTglDSEFSCQkJUnNzaSkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTUKKworCXVuaW9uIAlpd3JlcV9kYXRhICAgICAgd3JxdTsKKwlQVUNIQVIgCXBCdWYgPSBOVUxMLCBwQnVmUHRyID0gTlVMTDsKKwlVU0hPUlQJZXZlbnQsIHR5cGUsIEJ1ZkxlbjsKKwlVQ0hBUglldmVudF90YWJsZV9sZW4gPSAwOworCisJdHlwZSA9IEV2ZW50X2ZsYWcgJiAweEZGMDA7CisJZXZlbnQgPSBFdmVudF9mbGFnICYgMHgwMEZGOworCisJc3dpdGNoICh0eXBlKQorCXsKKwkJY2FzZSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVDoKKwkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX1NZU19FVkVOVF9UWVBFX05VTTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVDoKKwkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX1NQT09GX0VWRU5UX1RZUEVfTlVNOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU07CisJCQlicmVhazsKKwl9CisKKwlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCB0eXBlKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZXZlbnQgPj0gZXZlbnRfdGFibGVfbGVuKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgZXZlbnQoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KSk7CisJCXJldHVybjsKKwl9CisKKwkvL0FsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgbXNnLgorCWlmKChwQnVmID0ga21hbGxvYyhJV19DVVNUT01fTUFYX0xFTiwgR0ZQX0FUT01JQykpICE9IE5VTEwpCisJeworCQkvL1ByZXBhcmUgdGhlIHBheWxvYWQKKwkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKKworCQlwQnVmUHRyID0gcEJ1ZjsKKworCQlpZiAocEFkZHIpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7CisJCWVsc2UgaWYgKEJzc0lkeCA8IE1BWF9NQlNTSURfTlVNKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBCU1MocmElZCkgIiwgQnNzSWR4KTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKKworCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyAoUlNTST0lZCkiLCBwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtldmVudF0sIFJzc2kpOworCQllbHNlIGlmICh0eXBlID09IElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsICJ1bmtub3duIGV2ZW50Iik7CisKKwkJcEJ1ZlB0cltwQnVmUHRyIC0gcEJ1Zl0gPSAnXDAnOworCQlCdWZMZW4gPSBwQnVmUHRyIC0gcEJ1ZjsKKworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJICAgIHdycXUuZGF0YS5mbGFncyA9IEV2ZW50X2ZsYWc7CisJCXdycXUuZGF0YS5sZW5ndGggPSBCdWZMZW47CisKKwkJLy9zZW5kIHdpcmVsZXNzIGV2ZW50CisJICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgcEJ1Zik7CisKKwkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHBCdWYpKTsKKworCQlrZnJlZShwQnVmKTsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Igd2lyZWxlc3MgZXZlbnQuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyNlbHNlCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgV2lyZWxlc3MgRXh0ZW5zaW9uIE1VU1QgYmUgdjE1IG9yIG5ld2VyLlxuIiwgX19GVU5DVElPTl9fKSk7CisjZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworICAgIHdsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7CisgICAgaW50IHJhdGVfaW5kZXggPSAwOworICAgIFVTSE9SVCBoZWFkZXJfbGVuID0gMDsKKyAgICBVQ0hBUiB0ZW1wX2hlYWRlcls0MF0gPSB7MH07CisKKyAgICB1X2ludDMyX3QgcmFsaW5rcmF0ZVsyNTZdID0gezIsNCwxMSwyMiwgMTIsMTgsMjQsMzYsNDgsNzIsOTYsICAxMDgsICAgMTA5LCAxMTAsIDExMSwgMTEyLCAxMywgMjYsIDM5LCA1Miw3OCwxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4LDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAyNywgNTQsODEsMTA4LDE2MiwgMjE2LCAyNDMsIDI3MCwgLy8gTGFzdCAzOAorCTU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsICAxNCwgMjksIDQzLCA1NywgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSw4NywxMTUsIDE3MywgMjMwLDI2MCwgMjg4LCAzMCwgNjAsOTAsMTIwLDE4MCwyNDAsMjcwLDMwMCw2MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MCw2MDAsIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsCisJMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODB9OworCisKKyAgICBBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworICAgIGlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBSeEJsay0+RGF0YVNpemUpKTsKKwkJZ290byBlcnJfZnJlZV9za19idWZmOworICAgIH0KKworICAgIGlmIChwUnhCbGstPkRhdGFTaXplICsgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikgPiBSWF9CVUZGRVJfQUdHUkVTSVpFKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBTaXplIGlzIHRvbyBsYXJnZSEgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBwUnhCbGstPkRhdGFTaXplICsgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpKTsKKwkJZ290byBlcnJfZnJlZV9za19idWZmOworICAgIH0KKworICAgIHBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworICAgIGlmIChwUnhCbGstPnBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKyAgICB7CisgICAgICAgIHBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKKyAgICAgICAgaWYgKChwUnhCbGstPnBIZWFkZXItPkZDLlRvRHMgPT0gMSkgJiYKKyAgICAgICAgICAgIChwUnhCbGstPnBIZWFkZXItPkZDLkZyRHMgPT0gMSkpCisgICAgICAgICAgICBoZWFkZXJfbGVuID0gTEVOR1RIXzgwMl8xMV9XSVRIX0FERFI0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBoZWFkZXJfbGVuID0gTEVOR1RIXzgwMl8xMTsKKworICAgICAgICAvLyBRT1MKKyAgICAJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCisgICAgCXsKKyAgICAJICAgIGhlYWRlcl9sZW4gKz0gMjsKKyAgICAJCS8vIERhdGEgc2tpcCBRT1MgY29udG9ybCBmaWVsZAorICAgIAkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7CisgICAgCX0KKworICAgIAkvLyBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKKyAgICAJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpCisgICAgCXsKKyAgICAJICAgIGhlYWRlcl9sZW4gKz0gNDsKKwkJCS8vIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZAorCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA0OworICAgIAl9CisKKyAgICAgICAgLy8gQ29weSBIZWFkZXIKKyAgICAgICAgaWYgKGhlYWRlcl9sZW4gPD0gNDApCisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2hlYWRlciwgcFJ4QmxrLT5wRGF0YSwgaGVhZGVyX2xlbik7CisKKyAgICAgICAgLy8gc2tpcCBIVyBwYWRkaW5nCisgICAgCWlmIChwUnhCbGstPlJ4RC5MMlBBRCkKKyAgICAJICAgIHBSeEJsay0+cERhdGEgKz0gKGhlYWRlcl9sZW4gKyAyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcFJ4QmxrLT5wRGF0YSArPSBoZWFkZXJfbGVuOworICAgIH0gLy9lbmQgaWYKKworCisJaWYgKHBSeEJsay0+RGF0YVNpemUgPCBwT1NQa3QtPmxlbikgeworICAgICAgICBza2JfdHJpbShwT1NQa3QscFJ4QmxrLT5EYXRhU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2tiX3B1dChwT1NQa3QsKHBSeEJsay0+RGF0YVNpemUgLSBwT1NQa3QtPmxlbikpOworICAgIH0gLy9lbmQgaWYKKworICAgIGlmICgocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkgPiAwKSB7CisJICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSk7CisJICAgIHNrYl9wdWxsKHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworICAgIH0gLy9lbmQgaWYKKworICAgIGlmIChza2JfaGVhZHJvb20ocE9TUGt0KSA8IChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSsgaGVhZGVyX2xlbikpIHsKKyAgICAgICAgaWYgKHBza2JfZXhwYW5kX2hlYWQocE9TUGt0LCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikgKyBoZWFkZXJfbGVuKSwgMCwgR0ZQX0FUT01JQykpIHsKKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogUmVhbGxvY2F0ZSBoZWFkZXIgc2l6ZSBvZiBza19idWZmIGZhaWwhXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKwkgICAgfSAvL2VuZCBpZgorICAgIH0gLy9lbmQgaWYKKworICAgIGlmIChoZWFkZXJfbGVuID4gMCkKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCisgICAgcGggPSAod2xhbl9uZ19wcmlzbTJfaGVhZGVyICopIHNrYl9wdXNoKHBPU1BrdCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOworCU5kaXNaZXJvTWVtb3J5KHBoLCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisKKyAgICBwaC0+bXNnY29kZQkJICAgID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKKwlwaC0+bXNnbGVuCQkgICAgPSBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKKwlzdHJjcHkocGgtPmRldm5hbWUsIHBBZC0+bmV0X2Rldi0+bmFtZSk7CisKKyAgICBwaC0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKKwlwaC0+aG9zdHRpbWUuc3RhdHVzID0gMDsKKwlwaC0+aG9zdHRpbWUubGVuID0gNDsKKwlwaC0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7CisKKwlwaC0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7CisJcGgtPm1hY3RpbWUuc3RhdHVzID0gMDsKKwlwaC0+bWFjdGltZS5sZW4gPSAwOworCXBoLT5tYWN0aW1lLmRhdGEgPSAwOworCisgICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OworCXBoLT5pc3R4LnN0YXR1cyA9IDA7CisJcGgtPmlzdHgubGVuID0gMDsKKwlwaC0+aXN0eC5kYXRhID0gMDsKKworICAgIHBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKKwlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOworCXBoLT5jaGFubmVsLmxlbiA9IDQ7CisKKyAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOworCXBoLT5yc3NpLnN0YXR1cyA9IDA7CisJcGgtPnJzc2kubGVuID0gNDsKKyAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKKworCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CisJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOworCXBoLT5zaWduYWwubGVuID0gNDsKKwlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKKworCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOworCXBoLT5ub2lzZS5zdGF0dXMgPSAwOworCXBoLT5ub2lzZS5sZW4gPSA0OworCXBoLT5ub2lzZS5kYXRhID0gMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCisgICAgeworICAgIAlyYXRlX2luZGV4ID0gMTYgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPkJXICoxNikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPlNob3J0R0kgKjMyKSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+TUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7CisgICAgZWxzZQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisgICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCisgICAgICAgIHJhdGVfaW5kZXggPSAyNTU7CisKKwlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7CisJcGgtPnJhdGUuc3RhdHVzID0gMDsKKwlwaC0+cmF0ZS5sZW4gPSA0OworICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOworCisJcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKKyAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7CisJcGgtPmZybWxlbi5sZW4gPSA0OworCXBoLT5mcm1sZW4uZGF0YQk9ICh1X2ludDMyX3QpcFJ4QmxrLT5EYXRhU2l6ZTsKKworCisgICAgcE9TUGt0LT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisgICAgcE9TUGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBPU1BrdCwgcE9TUGt0LT5kZXYpOworICAgIHBPU1BrdC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICBuZXRpZl9yeChwT1NQa3QpOworCisgICAgcmV0dXJuOworCitlcnJfZnJlZV9za19idWZmOgorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJcmV0dXJuOworCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordm9pZCBydG1wX29zX3RocmVhZF9pbml0KFBVQ0hBUiBwVGhyZWFkTmFtZSwgUFZPSUQgcE5vdGlmeSkKK3sKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlkYWVtb25pemUocFRocmVhZE5hbWUgLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKKworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYWVtb25pemUoKTsKKwlyZXBhcmVudF90b19pbml0KCk7CisJc3RyY3B5KGN1cnJlbnQtPmNvbW0sIHBUaHJlYWROYW1lKTsKKworCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHVEVSTSkgfCBzaWdtYXNrKFNJR0tJTEwpKTsKKworCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBTSUdLSUxMIG9ubHkKKwkgKiBEb24ndCBhbGxvdyBvdGhlciBzaWduYWxzIHRvIGludGVycnVwdCB0aGUgdHJhbnNtaXNzaW9uICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIyKQorCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdtYXNrX2xvY2ssIGZsYWdzKTsKKwlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCXJlY2FsY19zaWdwZW5kaW5nKGN1cnJlbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qIHNpZ25hbCB0aGF0IHdlJ3ZlIHN0YXJ0ZWQgdGhlIHRocmVhZCAqLworCWNvbXBsZXRlKHBOb3RpZnkpOworCit9CisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDI5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmgKQEAgLTAsMCArMSw5MDggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUHJvZ3JhbTogICAgcnRfbGludXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ3JlYXRlZDogICAgNC8yMS8yMDA2IDE6MTc6MzggUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQXV0aG9yOiAgICAgV3UgWGktS3VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ29tbWVudHM6ICAgYGRlc2NyaXB0aW9uYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFJldmlzaW9uIDEuMSA0LzIxLzIwMDYgMToxNzozOCBQTSAgeHNpa3VuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluaXRpYWwgcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisvLyBsb2FkIGZpcm13YXJlCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKyNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCisKKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCisvLyNkZWZpbmUgQ09ORklHX0NLSVBfU1VQUE9SVAorCisjdW5kZWYgX19pbmxpbmUKKyNkZWZpbmUgX19pbmxpbmUJICAgc3RhdGljIGlubGluZQorCit0eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKy8vIGFkZCBieSBrYXRoeQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgU1RBX1BST0ZJTEVfUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9SVDI4NzBTVEEuZGF0IgorI2RlZmluZSBTVEFfUlQyODcwX0lNQUdFX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL3J0Mjg3MC5iaW4iCisjZGVmaW5lIFNUQV9OSUNfREVWSUNFX05BTUUJCQkiUlQyODcwU1RBIgorI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMS40LjAuMCIKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKyNkZWZpbmUgQ0FSRF9JTkZPX1BBVEgJCQkiL2V0Yy9XaXJlbGVzcy9SVDI4NzBTVEEvUlQyODcwU1RBQ2FyZC5kYXQiCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpCQlcCisJKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCisJIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCisJICgobG9uZykoYikgLSAobG9uZykoYSkgPCAwKSkKKworI2RlZmluZSBSVE1QX1RJTUVfQUZURVJfRVEoYSxiKQlcCisJKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCisJIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCisJICgobG9uZykoYSkgLSAobG9uZykoYikgPj0gMCkpCisjZGVmaW5lIFJUTVBfVElNRV9CRUZPUkUoYSxiKQlSVE1QX1RJTUVfQUZURVJfRVEoYixhKQorI2Vsc2UKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikgdGltZV9hZnRlcihhLCBiKQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAorCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCisJeyBcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fRlVOQ1RJT05fXykpOyBcCisJCXJldHVybiAtMTsgXAorCX0KKworI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIG1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworI2Vsc2UKKyNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKQlNT0RfSU5DX1VTRV9DT1VOVDsKKyNkZWZpbmUgUlRfTU9EX0RFQ19VU0VfQ09VTlQoKSBNT0RfREVDX1VTRV9DT1VOVDsKKyNlbmRpZgorCisjZGVmaW5lIE9TX0haCQkJSFoKKworI2RlZmluZSBFVEhfTEVOR1RIX09GX0FERFJFU1MJNgorCisjZGVmaW5lIElOCisjZGVmaW5lIE9VVAorCisjZGVmaW5lIE5ESVNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQKKyNkZWZpbmUgTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBCQkJCTB4MDIKKyNkZWZpbmUgTkRJU19TVEFUVVNfUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgIDB4MDMKKworI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQUlECQkJMHgwMAkJLy8weDAwfjB4M2YKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01CU1NJRAkJMHgwMAkJLy8weDAwLDB4MTAsMHgyMCwweDMwCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMJCQkweDEwCQkvLzB4NDAsMHg1MCwweDYwLDB4NzAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJCQkweDIwCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNICQkJMHgzMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfRExTCQkJMHg0MAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAkJMAorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAkJMQorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAkJMgorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QJMworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKK3R5cGVkZWYJc3RydWN0IHBpZCAqCVRIUkVBRF9QSUQ7CisjZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQlOVUxMCisjZGVmaW5lCUdFVF9QSUQoX3YpCWZpbmRfZ2V0X3BpZChfdikKKyNkZWZpbmUJR0VUX1BJRF9OVU1CRVIoX3YpCXBpZF9ucihfdikKKyNkZWZpbmUgQ0hFQ0tfUElEX0xFR0FMSVRZKF9waWQpCWlmIChwaWRfbnIoX3BpZCkgPj0gMCkKKyNkZWZpbmUgS0lMTF9USFJFQURfUElEKF9BLCBfQiwgX0MpCWtpbGxfcGlkKF9BLCBfQiwgX0MpCisjZWxzZQordHlwZWRlZglwaWRfdAlUSFJFQURfUElEOworI2RlZmluZQlUSFJFQURfUElEX0lOSVRfVkFMVUUJLTEKKyNkZWZpbmUJR0VUX1BJRChfdikJX3YKKyNkZWZpbmUJR0VUX1BJRF9OVU1CRVIoX3YpCV92CisjZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAoX3BpZCA+PSAwKQorI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9wcm9jKF9BLCBfQiwgX0MpCisjZW5kaWYKKworc3RydWN0IG9zX2xvY2sgIHsKKwlzcGlubG9ja190CQlsb2NrOworCXVuc2lnbmVkIGxvbmcgIAlmbGFnczsKK307CisKKworc3RydWN0IG9zX2Nvb2tpZSB7CisKKyNpZmRlZiBSVDI4NzAKKwlzdHJ1Y3QgdXNiX2RldmljZQkJKnBVc2JfRGV2OworCisJVEhSRUFEX1BJRAkJCQlNTE1FVGhyX3BpZDsKKwlUSFJFQURfUElECQkJCVJUVVNCQ21kVGhyX3BpZDsKKwlUSFJFQURfUElECQkJCVRpbWVyUVRocl9waWQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCXJ4X2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCW1nbXRfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMxX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzJfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjM19kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJaGNjYV9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YnR0X3Rhc2s7CisjaWZkZWYgUlQyODcwCisJc3RydWN0IHRhc2tsZXRfc3RydWN0CW51bGxfZnJhbWVfY29tcGxldGVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKwl1bnNpZ25lZCBsb25nCQkJYXBkX3BpZDsgLy84MDIuMXggZGFlbW9uIHBpZAorCUlOVAkJCQkJCWlvY3RsX2lmX3R5cGU7CisJSU5UIAkJCQkJaW9jdGxfaWY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVklSVFVBTF9BREFQVEVSCit7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpSdG1wRGV2OworCXN0cnVjdCBuZXRfZGV2aWNlCQkqVmlydHVhbERldjsKK30gVklSVFVBTF9BREFQVEVSLCBQVklSVFVBTF9BREFQVEVSOworCisjdW5kZWYgIEFTU0VSVAorI2RlZmluZSBBU1NFUlQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoISh4KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgX19GSUxFX18gIjolZCBhc3NlcnQgIiAjeCAiZmFpbGVkXG4iLCBfX0xJTkVfXyk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCit0eXBlZGVmIHN0cnVjdCBvc19jb29raWUJKiBQT1NfQ09PS0lFOwordHlwZWRlZiBzdHJ1Y3QgcGNpX2RldiAJCSogUFBDSV9ERVY7Cit0eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlCSogUE5FVF9ERVY7Cit0eXBlZGVmIHZvaWQJCQkJKiBQTkRJU19QQUNLRVQ7Cit0eXBlZGVmIGNoYXIJCQkJTkRJU19QQUNLRVQ7Cit0eXBlZGVmIFBORElTX1BBQ0tFVAkJKiBQUE5ESVNfUEFDS0VUOwordHlwZWRlZglkbWFfYWRkcl90CQkJTkRJU19QSFlTSUNBTF9BRERSRVNTOwordHlwZWRlZglkbWFfYWRkcl90CQkJKiBQTkRJU19QSFlTSUNBTF9BRERSRVNTOworLy90eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CVJBTElOS19USU1FUl9TVFJVQ1Q7CisvL3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJKiBQUkFMSU5LX1RJTUVSX1NUUlVDVDsKKy8vdHlwZWRlZiBzdHJ1Y3Qgb3NfbG9jawkJTkRJU19TUElOX0xPQ0s7Cit0eXBlZGVmIHNwaW5sb2NrX3QJCQlORElTX1NQSU5fTE9DSzsKK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJTkRJU19NSU5JUE9SVF9USU1FUjsKK3R5cGVkZWYgdm9pZAkJCQkqIE5ESVNfSEFORExFOwordHlwZWRlZiBjaGFyIAkJCQkqIFBORElTX0JVRkZFUjsKKworCisKK3ZvaWQgaGV4X2R1bXAoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpwU3JjQnVmVkEsIHVuc2lnbmVkIGludCBTcmNCdWZMZW4pOworCitkbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbik7Cit2b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTU9WRSBUTyBydG1wLmggPworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgUEtUU1JDX05ESVMgICAgICAgICAgICAgMHg3ZgorI2RlZmluZSBQS1RTUkNfRFJJVkVSICAgICAgICAgICAweDBmCisjZGVmaW5lIFBSSU5UX01BQyhhZGRyKQlcCisJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XQorCisKKyNkZWZpbmUgUlQyODYwX1BDSV9ERVZJQ0VfSUQJCTB4MDYwMQorCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgUENJX01BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpIChVTE9ORykwCisKKyNkZWZpbmUgUENJX1VOTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisjZGVmaW5lIEJFQUNPTl9GUkFNRV9ETUFfQ0FDSEVfV0JBQ0soX3B0ciwgX3NpemUpCVwKKwlkbWFfY2FjaGVfd2JhY2soX3B0ciwgX3NpemUpCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworI2RlZmluZSBOZGlzTUluZGljYXRlU3RhdHVzKF93LCBfeCwgX3ksIF96KQorCit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CVJUTVBfT1NfVElNRVI7CisKKyNpZmRlZiBSVDI4NzAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFRpbWVyIFJlbGF0ZWQgTUFSQ08gLS0tLS0tLS0tLS0tLS0tKi8KKy8vIEluIFJUMjg3MCwgd2UgaGF2ZSBhIGxvdCBvZiB0aW1lciBmdW5jdGlvbnMgYW5kIHdpbGwgcmVhZC93cml0ZSByZWdpc3RlciwgaXQncworLy8Jbm90IGFsbG93ZWQgaW4gTGludXggVVNCIHN1Yi1zeXN0ZW0gdG8gZG8gaXQgKCBiZWNhdXNlIG9mIHNsZWVwIGlzc3VlIHdoZW4gc3VibWl0CisvLyAgdG8gY3RybCBwaXBlKS4gU28gd2UgbmVlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gdGFrZSBjYXJlIGl0LgorCit0eXBlZGVmIFZPSUQgKCpSVDI4NzBfVElNRVJfSEFORExFKSgKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gIFBWT0lEICAgRnVuY3Rpb25Db250ZXh0LAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMiwKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzMpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKK3R5cGVkZWYgc3RydWN0ICBfUkFMSU5LX1RJTUVSX1NUUlVDVCAgICB7CisgICAgUlRNUF9PU19USU1FUgkJVGltZXJPYmo7ICAgICAgIC8vIE5kaXMgVGltZXIgb2JqZWN0CisJQk9PTEVBTgkJCQlWYWxpZDsJCQkvLyBTZXQgdG8gVHJ1ZSB3aGVuIGNhbGwgUlRNUEluaXRUaW1lcgorICAgIEJPT0xFQU4gICAgICAgICAgICAgU3RhdGU7ICAgICAgICAgIC8vIFRydWUgaWYgdGltZXIgY2FuY2VsbGVkCisgICAgQk9PTEVBTgkgICAgICAJCVBlcmlvZGljVHlwZTsJLy8gVHJ1ZSBpZiB0aW1lciBpcyBwZXJpb2RpYyB0aW1lcgorICAgIEJPT0xFQU4gICAgICAgICAgICAgUmVwZWF0OyAgICAgICAgIC8vIFRydWUgaWYgcGVyaW9kaWMgdGltZXIKKyAgICBVTE9ORyAgICAgICAgICAgICAgIFRpbWVyVmFsdWU7ICAgICAvLyBUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKKwlVTE9ORwkJCQljb29raWU7CQkJLy8gb3Mgc3BlY2lmaWMgb2JqZWN0CisjaWZkZWYgUlQyODcwCisJUlQyODcwX1RJTUVSX0hBTkRMRQloYW5kbGU7CisJdm9pZAkJCQkqcEFkOworI2VuZGlmIC8vIFJUMjg3MCAvLworfSAgIFJBTElOS19USU1FUl9TVFJVQ1QsICpQUkFMSU5LX1RJTUVSX1NUUlVDVDsKKworCisjaWZkZWYgUlQyODcwCisKK3R5cGVkZWYgZW51bSBfUlQyODcwX0tFUk5FTF9USFJFQURfU1RBVFVTXworeworCVJUMjg3MF9USFJFQURfVU5LTk9XTiA9IDAsCisJUlQyODcwX1RIUkVBRF9JTklURUQgPSAxLAorCVJUMjg3MF9USFJFQURfUlVOTklORyA9IDIsCisJUlQyODcwX1RIUkVBRF9TVE9QRUQgPSA0LAorfVJUMjg3MF9LRVJORUxfVEhSRUFEX1NUQVRVUzsKKworI2RlZmluZSBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQJCShSVDI4NzBfVEhSRUFEX0lOSVRFRCB8UlQyODcwX1RIUkVBRF9SVU5OSU5HKQorCit0eXBlZGVmIHN0cnVjdCBfUlQyODcwX1RJTUVSX0VOVFJZXworeworCVJBTElOS19USU1FUl9TVFJVQ1QgCQkJKnBSYVRpbWVyOworCXN0cnVjdCBfUlQyODcwX1RJTUVSX0VOVFJZXyAJKnBOZXh0OworfVJUMjg3MF9USU1FUl9FTlRSWTsKKworCisjZGVmaW5lIFRJTUVSX1FVRVVFX1NJWkVfTUFYCTEyOAordHlwZWRlZiBzdHJ1Y3QgX1JUMjg3MF9USU1FUl9RVUVVRV8KK3sKKwl1bnNpZ25lZCBpbnQJCXN0YXR1czsKKwkvL3dhaXRfcXVldWVfaGVhZF90IAl0aW1lcldhaXRROworCS8vYXRvbWljX3QJCQljb3VudDsKKwlVQ0hBUgkJCQkqcFRpbWVyUVBvbGw7CisJUlQyODcwX1RJTUVSX0VOVFJZCSpwUVBvbGxGcmVlTGlzdDsKKwlSVDI4NzBfVElNRVJfRU5UUlkgCSpwUUhlYWQ7CisJUlQyODcwX1RJTUVSX0VOVFJZIAkqcFFUYWlsOworfVJUMjg3MF9USU1FUl9RVUVVRTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisvLyNkZWZpbmUgREJHCTEKKworLy8KKy8vICBNQUNSTyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uCisvLworCisjaWZkZWYgREJHCitleHRlcm4gVUxPTkcgICAgUlREZWJ1Z0xldmVsOworCisjZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKExldmVsIDw9IFJURGVidWdMZXZlbCkgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ayBGbXQ7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorCisKKyNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIkVSUk9SISEhICIpOyAgICAgICAgICBcCisgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkJCVwKK3sJCQkJCQkJCQlcCisJcHJpbnRrIEZtdDsJCQkJCVwKK30KKworCisjZWxzZQorI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkKKyNlbmRpZgorCisKKy8vCisvLyAgc3Bpbl9sb2NrIGVuaGFuY2VkIGZvciBOZXN0ZWQgc3BpbiBsb2NrCisvLworI2RlZmluZSBOZGlzQWxsb2NhdGVTcGluTG9jayhfX2xvY2spICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcGluX2xvY2tfaW5pdCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTmRpc0ZyZWVTcGluTG9jayhsb2NrKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgUlRNUF9TRU1fTE9DSyhfX2xvY2spCQkJCQlcCit7CQkJCQkJCQkJCQkJXAorCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQkJXAorfQorCisjZGVmaW5lIFJUTVBfU0VNX1VOTE9DSyhfX2xvY2spCQkJCQlcCit7CQkJCQkJCQkJCQkJXAorCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCit9CisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKyNkZWZpbmUgUlRNUF9JUlFfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlzcGluX2xvY2tfaXJxc2F2ZSgoc3BpbmxvY2tfdCAqKV9fbG9jaywgX19pcnFmbGFncyk7CVwKKwlwQWQtPmlycV9kaXNhYmxlZCB8PSAxOyBcCit9CisKKyNkZWZpbmUgUlRNUF9JUlFfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCVwKKwlwQWQtPmlycV9kaXNhYmxlZCAmPSAwOyBcCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgoc3BpbmxvY2tfdCAqKShfX2xvY2spLCAoKHVuc2lnbmVkIGxvbmcpX19pcnFmbGFnKSk7CVwKK30KKyNlbHNlCisKKy8vIHNhbXBsZSwgdXNlIHNlbWFwaG9yZSBsb2NrIHRvIHJlcGxhY2UgSVJRIGxvY2ssIDIwMDcvMTEvMTUKKyNkZWZpbmUgUlRNUF9JUlFfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJX19pcnFmbGFncyA9IDA7CQkJCQkJCQkJXAorCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQlcCisJcEFkLT5pcnFfZGlzYWJsZWQgfD0gMTsgXAorfQorCisjZGVmaW5lIFJUTVBfSVJRX1VOTE9DSyhfX2xvY2ssIF9faXJxZmxhZykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlwQWQtPmlycV9kaXNhYmxlZCAmPSAwOyBcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJXAorfQorCisjZGVmaW5lIFJUTVBfSU5UX0xPQ0soX19sb2NrLCBfX2lycWZsYWdzKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fbG9ja19pcnFzYXZlKChzcGlubG9ja190ICopX19sb2NrLCBfX2lycWZsYWdzKTsJXAorfQorCisjZGVmaW5lIFJUTVBfSU5UX1VOTE9DSyhfX2xvY2ssIF9faXJxZmxhZykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopKF9fbG9jayksICgodW5zaWduZWQgbG9uZylfX2lycWZsYWcpKTsJXAorfQorI2VuZGlmCisKKworCisjaWZkZWYgUlQyODcwCisvL1BhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4CisjZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKF9BLCBfUiwgX3BWKQorCisjZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCVwKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIoX0EsIF9SLCBfVikKKworCisjZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlVU0hPUlQJX1ZhbCA9IF9WOwkJCQkJCQkJCQkJXAorCVJUVVNCU2luZ2xlV3JpdGUoX0EsIF9SLCBfVmFsKTsJCQkJCQkJCVwKK30KKworCisjZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJUlRVU0JTaW5nbGVXcml0ZShfQSwgX1IsIF9WKTsJCQkJCQkJCVwKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmbmRlZiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dAorI2RlZmluZSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHJldCkgXAorZG8geyBcCisgICAgICAgIHdhaXRfcXVldWVfdCBfX3dhaXQ7IFwKKyAgICAgICAgaW5pdF93YWl0cXVldWVfZW50cnkoJl9fd2FpdCwgY3VycmVudCk7IFwKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgXAorICAgICAgICBmb3IgKDs7KSB7IFwKKyAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbikgXAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHNjaGVkdWxlX3RpbWVvdXQocmV0KTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgcmV0ID0gLUVSRVNUQVJUU1lTOyBcCisgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOyBcCisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgdGltZW91dCkgXAorKHsgXAorICAgICAgICBsb25nIF9fcmV0ID0gdGltZW91dDsgXAorICAgICAgICBpZiAoIShjb25kaXRpb24pKSBcCisgICAgICAgICAgICAgICAgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCBfX3JldCk7IFwKKyAgICAgICAgX19yZXQ7IFwKK30pCisjZW5kaWYKKyNkZWZpbmUgT05FX1RJQ0sgMQorI2RlZmluZSBPU19XQUlUKF90aW1lKSBcCit7CWludCBfaTsgXAorCWxvbmcgX2xvb3AgPSAoKF90aW1lKS8oMTAwMC9PU19IWikpID4gMCA/ICgoX3RpbWUpLygxMDAwL09TX0haKSkgOiAxO1wKKwl3YWl0X3F1ZXVlX2hlYWRfdCBfd2FpdDsgXAorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJl93YWl0KTsgXAorCWZvciAoX2k9MDsgX2k8KF9sb29wKTsgX2krKykgXAorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChfd2FpdCwgMCwgT05FX1RJQ0spOyB9CisKKwordHlwZWRlZiB2b2lkICgqVElNRVJfRlVOQ1RJT04pKHVuc2lnbmVkIGxvbmcpOworCisjZGVmaW5lIENPUFlfTUFDX0FERFIoQWRkcjEsIEFkZHIyKSAgICAgICAgICAgICBtZW1jcHkoKEFkZHIxKSwgKEFkZHIyKSwgTUFDX0FERFJfTEVOKQorCisjZGVmaW5lIE1sbWVBbGxvY2F0ZU1lbW9yeShfcEFkLCBfcHBWQSkgb3NfYWxsb2NfbWVtKF9wQWQsIF9wcFZBLCBNR01UX0RNQV9CVUZGRVJfU0laRSkKKyNkZWZpbmUgTWxtZUZyZWVNZW1vcnkoX3BBZCwgX3BWQSkgICAgIG9zX2ZyZWVfbWVtKF9wQWQsIF9wVkEpCisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBCVUlMRF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJCQkJCQkJCQkJXAordm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVBSQUxJTktfVElNRVJfU1RSVUNUCV9wVGltZXIgPSAoUFJBTElOS19USU1FUl9TVFJVQ1QpZGF0YTsJCQkJCVwKKwlSVDI4NzBfVElNRVJfRU5UUlkJCSpfcFFOb2RlOwkJCQkJCQkJCQkJCVwKKwlSVE1QX0FEQVBURVIJCQkqX3BBZDsJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJX3BUaW1lci0+aGFuZGxlID0gX2Z1bmM7CQkJCQkJCQkJCQkJCQkJXAorCV9wQWQgPSAoUlRNUF9BREFQVEVSICopX3BUaW1lci0+cEFkOwkJCQkJCQkJCQkJCVwKKwlfcFFOb2RlID0gUlQyODcwX1RpbWVyUV9JbnNlcnQoX3BBZCwgX3BUaW1lcik7IAkJCQkJCQkJCVwKKwlpZiAoKF9wUU5vZGUgPT0gTlVMTCkgJiYgKF9wQWQtPlRpbWVyUS5zdGF0dXMgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpKQlcCisJCVJUTVBfT1NfQWRkX1RpbWVyKCZfcFRpbWVyLT5UaW1lck9iaiwgSFopOyAgICAgICAgICAgICAgIAkJCQkJXAorfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyNkZWZpbmUgREVDTEFSRV9USU1FUl9GVU5DVElPTihfZnVuYykJCQlcCit2b2lkIGxpbnV4XyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQorCisjZGVmaW5lIEdFVF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJXAorCQlsaW51eF8jI19mdW5jCisKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVSc3NpUmVwb3J0RXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQVBTRFBlcmlvZGljRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFzaWNSZlR1bmluZ0V4ZWMpOworI2lmZGVmIFJUMjg3MAorREVDTEFSRV9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOworI2lmZGVmIExFQVBfU1VQUE9SVAorREVDTEFSRV9USU1FUl9GVU5DVElPTihMZWFwQXV0aFRpbWVvdXQpOworI2VuZGlmCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit2b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSk7CisKKworLyoKKyAqIHBhY2tldCBoZWxwZXIKKyAqIAktIGNvbnZlcnQgaW50ZXJuYWwgcnQgcGFja2V0IHRvIG9zIHBhY2tldCBvcgorICogICAgICAgICAgICAgb3MgcGFja2V0IHRvIHJ0IHBhY2tldAorICovCisjZGVmaW5lIFJUUEtUX1RPX09TUEtUKF9wKQkJKChzdHJ1Y3Qgc2tfYnVmZiAqKShfcCkpCisjZGVmaW5lIE9TUEtUX1RPX1JUUEtUKF9wKQkJKChQTkRJU19QQUNLRVQpKF9wKSkKKworI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFQVFIoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRhdGEpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9MRU4oX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikKKworI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT50YWlsKQorCisjZGVmaW5lIEdFVF9PU19QS1RfSEVBRChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+aGVhZCkKKworI2RlZmluZSBHRVRfT1NfUEtUX0VORChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZW5kKQorCisjZGVmaW5lIEdFVF9PU19QS1RfTkVUREVWKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kZXYpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9UWVBFKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpKQorCisjZGVmaW5lIEdFVF9PU19QS1RfTkVYVChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bmV4dCkKKworCisjZGVmaW5lIE9TX05UT0hTKF9WYWwpIFwKKwkJKG50b2hzKF9WYWwpKQorI2RlZmluZSBPU19IVE9OUyhfVmFsKSBcCisJCShodG9ucyhfVmFsKSkKKyNkZWZpbmUgT1NfTlRPSEwoX1ZhbCkgXAorCQkobnRvaGwoX1ZhbCkpCisjZGVmaW5lIE9TX0hUT05MKF9WYWwpIFwKKwkJKGh0b25sKF9WYWwpKQorCisvKiBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1RBVFNfSU5DX1JYX1BBQ0tFVFMoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX1BBQ0tFVFMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0VSUk9SUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRVJST1JTKF9wQWQsIF9kZXYpCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0RST1BQRUQoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0RST1BQRUQoX3BBZCwgX2RldikKKworCisjZGVmaW5lIENCX09GRiAgMTAKKworCisvLyAgIGNoZWNrIERESyBORElTX1BBQ0tFVCBkYXRhIHN0cnVjdHVyZSBhbmQgZmluZCBvdXQgb25seSBNaW5pcG9ydFJlc2VydmVkRXhbMC4uN10gY2FuIGJlIHVzZWQgYnkgb3VyIGRyaXZlciB3aXRob3V0CisvLyAgIGFtYmlndWl0eS4gRmllbGRzIGFmdGVyIHBQYWNrZXQtPk1pbmlwb3J0UmVzZXJ2ZWRFeFs4XSBtYXkgYmUgdXNlZCBieSBvdGhlciB3cmFwcGVyIGxheWVyIHRodXMgY3Jhc2hlcyB0aGUgZHJpdmVyCisvLworLy8jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9NUihfcCkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApKQorCisvLyBVc2VyIFByaW9yaXR5CisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9VUChfcCwgX3ByaW8pCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdID0gX3ByaW8pCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9VUChfcCkJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiswXSkKKworLy8gRnJhZ21lbnQgIworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKF9wLCBfbnVtKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzFdID0gX251bSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhfcCkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0pCisKKy8vIDB4MCB+MHg3ZjogVFggdG8gQVAncyBvd24gQlNTIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIEFJRC4gaWYgQUlEPjEyNywgc2V0IGJpdCA3IGluIFJUTVBfU0VUX1BBQ0tFVF9FTUFDVEFCIHRvby4KKy8vKHRoaXMgdmFsdWUgYWxzbyBhcyBNQUMob24tY2hpcCBXQ0lEKSB0YWJsZSBpbmRleCkKKy8vIDB4ODB+MHhmZjogVFggdG8gYSBXRFMgbGluay4gYjB+NjogV0RTIGluZGV4CisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQ0lEKF9wLCBfd2RzaWR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdID0gX3dkc2lkeCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dDSUQoX3ApICAgICAgICAgIAkJKChVQ0hBUikoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0pKQorCisvLyAweGZmOiBQS1RTUkNfTkRJUywgb3RoZXJzOiBsb2NhbCBUWCBidWZmZXIgaW5kZXguIFRoaXMgdmFsdWUgYWZmZWN0cyBob3cgdG8gYSBwYWNrZXQKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShfcCwgX3BrdHNyYykJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiszXSA9IF9wa3RzcmMpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9TT1VSQ0UoX3ApICAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdKQorCisvLyBSVFMvQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiBtZXRob2QKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1JUUyhfcCwgX251bSkgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSA9IF9udW0pCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9SVFMoX3ApICAgICAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdKQorLy8gc2VlIFJUTVBfUyhHKUVUX1BBQ0tFVF9FTUFDVEFCCisKKy8vIFRYIHJhdGUgaW5kZXgKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1RYUkFURShfcCwgX3JhdGUpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0gPSBfcmF0ZSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1RYUkFURShfcCkJCSAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0pCisKKy8vIEZyb20gd2hpY2ggSW50ZXJmYWNlCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JRihfcCwgX2lmZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0gPSBfaWZkeCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lGKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksIChfYnNzKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfV0RTKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2JzcykgKyBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfQVBDTEkoX3AsIF9pZHgpICAgCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9pZHgpICsgTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUVTSChfcCwgX2lkeCkgICAJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2lkeCkgKyBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSCkpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChfcCkJCQlSVE1QX0dFVF9QQUNLRVRfSUYoKF9wKSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UoX3ApCQkJCQlSVE1QX0dFVF9QQUNLRVRfSUYoKF9wKSkKKworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTU9SRURBVEEoX3AsIF9tb3JlYml0KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddID0gX21vcmViaXQpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShfcCkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddKQorCisvLyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wLCBfYnNzKQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYls4XSA9IF9ic3MpCisvLyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbOF0pCisKKworCisKKyNpZiAwCisvLyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0RIQ1AoX3AsIF9mbGcpICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gPSBfZmxnKQorLy8jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ESENQKF9wKSAgICAgICAgIAkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKQorI2Vsc2UKKy8vCisvLwlTZXBjaWZpYyBQYWtjZXQgVHlwZSBkZWZpbml0aW9uCisvLworI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19DQl9PRkZTRVQJMTEKKworI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQCQkweDAxCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MCQkweDAyCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQJCTB4MDQKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJCQkweDA4CisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4JCTB4MTAKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUAkweDIwCisKKy8vU3BlY2lmaWMKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDKF9wLCBfZmxnKQkgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCisKKy8vREhDUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0RIQ1AoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCkKKworLy9FQVBPTAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRUFQT0woX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0VBUE9MKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MKQorCisvL1dBSQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfV0FJKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dBSShfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgKFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkpCisKKy8vVkxBTgorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVkxBTihfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1ZMQU4oX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTikKKworLy9MTEMvU05BUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTExDU05BUChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xMQ1NOQVAoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCkKKworLy8gSVAKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0lQVjQoX3AsIF9mbGcpCQkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQpOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CVwKKwkJCX13aGlsZSgwKQorCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9JUFY0KF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQpCisKKyNlbmRpZgorCisKKy8vIElmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgRUFQb0wgZnJhbWUgTVVTVCBiZSBjbGVhci4KKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdID0gX2ZsZykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdKQorCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF81VlQoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSA9IF9mbGcpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF81VlQoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSkKKworCisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisjZGVmaW5lIEJSSURHRV9UQUcgMHgzNTU2NDI1MiAgICAvLyBkZXBlbmRzIG9uIDVWVCBkZWZpbmUgaW4gYnJfaW5wdXQuYworI2VuZGlmCisKKworI2RlZmluZSBORElTX1NFVF9QQUNLRVRfU1RBVFVTKF9wLCBfc3RhdHVzKQorCisKKyNkZWZpbmUgR0VUX1NHX0xJU1RfRlJPTV9QQUNLRVQoX3AsIF9zYykJXAorICAgIHJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KF9wLCBfc2MpCisKKworI2RlZmluZSBOZGlzTW92ZU1lbW9yeShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpIG1lbW1vdmUoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKQorI2RlZmluZSBOZGlzWmVyb01lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoKSAgICAgICAgIG1lbXNldChEZXN0aW5hdGlvbiwgMCwgTGVuZ3RoKQorI2RlZmluZSBOZGlzRmlsbE1lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoLCBGaWxsKSAgIG1lbXNldChEZXN0aW5hdGlvbiwgRmlsbCwgTGVuZ3RoKQorI2RlZmluZSBOZGlzRXF1YWxNZW1vcnkoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSAgICghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCisjZGVmaW5lIFJUTVBFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpCSghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCisKKworI2RlZmluZSBSVE1QX0lOQ19SRUYoX0EpCQkwCisjZGVmaW5lIFJUTVBfREVDX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9HRVRfUkVGKF9BKQkJMAorCisKKworLyoKKyAqIFVMT05HCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MpOworICovCisjZGVmaW5lIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KFBoeXNpY2FsQWRkcmVzcykJCShQaHlzaWNhbEFkZHJlc3MpCisKKy8qCisgKiBVTE9ORworICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7CisgKi8KKyNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKFBoeXNpY2FsQWRkcmVzcykJCSgwKQorCisvKgorICogVk9JRAorICogUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAorICogICBJTiBVTE9ORyAgVmFsdWUpOworICovCisjZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KFBoeXNpY2FsQWRkcmVzcywgVmFsdWUpCVwKKwkJCVBoeXNpY2FsQWRkcmVzcyA9IFZhbHVlOworCisvKgorICogVk9JRAorICogUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcywKKyAqICAgSU4gVUxPTkcgIFZhbHVlKTsKKyAqLworI2RlZmluZSBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkKKworCisvL0NPTlRBSU5JTkdfUkVDT1JEKHBFbnRyeSwgTkRJU19QQUNLRVQsIE1pbmlwb3J0UmVzZXJ2ZWRFeCk7CisjZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpIFwKKwkoUE5ESVNfUEFDS0VUKShwRW50cnkpCisKKyNkZWZpbmUgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpIFwKKwkoUFFVRVVFX0VOVFJZKShwUGFja2V0KQorCisKKyNpZm5kZWYgQ09OVEFJTklOR19SRUNPUkQKKyNkZWZpbmUgQ09OVEFJTklOR19SRUNPUkQoYWRkcmVzcywgdHlwZSwgZmllbGQpCQkJXAorKCh0eXBlICopKChQQ0hBUikoYWRkcmVzcykgLSBvZmZzZXRvZih0eXBlLCBmaWVsZCkpKQorI2VuZGlmCisKKworI2RlZmluZSBSRUxFQVNFX05ESVNfUEFDS0VUKF9wQWQsIF9wUGFja2V0LCBfU3RhdHVzKSAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QRnJlZU5kaXNQYWNrZXQoX3BBZCwgX3BQYWNrZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgU1dJVENIX1BoeUFCKF9wQUEsIF9wQkIpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUxPTkcJQUFCYXNlUGFIaWdoOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlBQUJhc2VQYUxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUxPTkcJQkJCYXNlUGFIaWdoOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlCQkJhc2VQYUxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkJCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQkIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkJCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEJCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFBQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEFBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFBQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BBQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BBQSwgQkJCYXNlUGFIaWdoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQUEsIEJCQmFzZVBhTG93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEJCLCBBQUJhc2VQYUhpZ2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BCQiwgQUFCYXNlUGFMb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBOZGlzV3JpdGVFcnJvckxvZ0VudHJ5KF9hLCBfYiwgX2MsIF9kKQorI2RlZmluZSBOZGlzTUFsbG9jYXRlTWFwUmVnaXN0ZXJzKF9hLCBfYiwgX2MsIF9kLCBfZSkJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCisjZGVmaW5lIE5kaXNBY3F1aXJlU3BpbkxvY2sJCVJUTVBfU0VNX0xPQ0sKKyNkZWZpbmUgTmRpc1JlbGVhc2VTcGluTG9jawkJUlRNUF9TRU1fVU5MT0NLCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOZGlzR2V0U3lzdGVtVXBUaW1lKFVMT05HICp0aW1lKQoreworCSp0aW1lID0gamlmZmllczsKK30KKworLy9wUGFja2V0ID0gQ09OVEFJTklOR19SRUNPUkQocEVudHJ5LCBORElTX1BBQ0tFVCwgTWluaXBvcnRSZXNlcnZlZEV4KTsKKyNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSkgXAorCQkoKFBORElTX1BBQ0tFVCkgKHBFbnRyeSkpCisKK2ludCBydDI4eHhfcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKworCit2b2lkIHJ0bXBfb3NfdGhyZWFkX2luaXQoUFVDSEFSIHBUaHJlYWROYW1lLCBQVk9JRCBwTm90aWZ5KTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X21haW5fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5MGY4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDE4NjMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRfbWFpbl9kZXYuYworCisgICAgQWJzdHJhY3Q6CisgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVNhbXBsZQkJTWFyLzIxLzA3CQlNZXJnZSBSVDI4NzAgYW5kIFJUMjg2MCBkcml2ZXJzLgorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisjZGVmaW5lIEZPUlRZX01IWl9JTlRPTEVSQU5UX0lOVEVSVkFMCSg2MCoxMDAwKSAvLyAxIG1pbgorCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyByZWNvcmQgd2hldGhlciB0aGUgY2FyZCBpbiB0aGUgY2FyZCBsaXN0IGlzIHVzZWQgaW4gdGhlIGNhcmQgZmlsZQorVUlOVDggIE1DX0NhcmRVc2VkW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF07CisvLyByZWNvcmQgdXNlZCBjYXJkIG1hYyBhZGRyZXNzIGluIHRoZSBjYXJkIGxpc3QKK3N0YXRpYyBVSU5UOCAgTUNfQ2FyZE1hY1tNQVhfTlVNX09GX01VTFRJUExFX0NBUkRdWzZdOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIFZhcmlhYmxlcyBVc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvL3N0YXRpYyBSQUxJTktfVElNRVJfU1RSVUNUICAgICBQZXJpb2RpY1RpbWVyOworCitjaGFyICptYWMgPSAiIjsJCSAgIC8vIGRlZmF1bHQgMDA6MDA6MDA6MDA6MDA6MDAKK2NoYXIgKmhvc3RuYW1lID0gIiI7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMikKK01PRFVMRV9QQVJNIChtYWMsICJzIik7CisjZWxzZQorbW9kdWxlX3BhcmFtIChtYWMsIGNoYXJwLCAwKTsKKyNlbmRpZgorTU9EVUxFX1BBUk1fREVTQyAobWFjLCAicnQyOHh4OiB3aXJlbGVzcyBtYWMgYWRkciIpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByb3RvdHlwZXMgb2YgRnVuY3Rpb25zIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK2V4dGVybiBCT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSk7CitleHRlcm4gdm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworZXh0ZXJuIE5ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworCisvLyBwdWJsaWMgZnVuY3Rpb24gcHJvdG90eXBlCitJTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKKwkJCQkJCQlJTiBVSU5UIGFyZ2MsIE9VVCBQUlRNUF9BREFQVEVSICpwcEFkKTsKKworLy8gcHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGUKK3N0YXRpYyBpbnQgcnQyOHh4X2luaXQoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworSU5UIHJ0Mjh4eF9zZW5kX3BhY2tldHMoSU4gc3RydWN0IHNrX2J1ZmYgKnNrYl9wLCBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMgkvLyBSZWQgSGF0IDcuMQorc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX25ldGRldigKKwlpbnQgc2l6ZW9mX3ByaXYsCisJY29uc3QgY2hhciAqbWFzaywKKwl2b2lkICgqc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICopKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworc3RhdGljIHZvaWQgQ2ZnSW5pdEhvb2soUFJUTVBfQURBUFRFUiBwQWQpOworLy9zdGF0aWMgQk9PTEVBTiBSVDI4WFhBdmFpbFJBTmFtZUFzc2lnbihJTiBDSEFSICpuYW1lX3ApOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitleHRlcm4JY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKKyAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisjZW5kaWYKKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCisgICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBNYWluVmlydHVhbElGX2Nsb3NlKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKworCW5ldGlmX2NhcnJpZXJfb2ZmKHBBZC0+bmV0X2Rldik7CisJbmV0aWZfc3RvcF9xdWV1ZShwQWQtPm5ldF9kZXYpOworCisKKworCVZJUlRVQUxfSUZfRE9XTihwQWQpOworCisJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKKworCXJldHVybiAwOyAvLyBjbG9zZSBvaworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE9wZW4gcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6CisJMS4gaWYgb3BlbiBmYWlsLCBrZXJuZWwgd2lsbCBub3QgY2FsbCB0aGUgY2xvc2UgZnVuY3Rpb24uCisJMi4gRnJlZSBtZW1vcnkgZm9yCisJCSgxKSBNbG1lIE1lbW9yeSBIYW5kbGVyOgkJTWxtZUhhbHQoKQorCQkoMikgVFggJiBSWDoJCQkJCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoKQorCQkoMykgQkEgUmVvcmRlcmluZzogCQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgTWFpblZpcnR1YWxJRl9vcGVuKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKworCWlmIChWSVJUVUFMX0lGX1VQKHBBZCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLy8gaW5jcmVhc2UgTU9EVUxFIHVzZSBjb3VudAorCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKwluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBydDI4eHhfY2xvc2UoSU4gUE5FVF9ERVYgZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKyAgICBSVE1QX0FEQVBURVIJKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJQk9PTEVBTiAJCUNhbmNlbGxlZCA9IEZBTFNFOworCVVJTlQzMgkJCWkgPSAwOworI2lmZGVmIFJUMjg3MAorCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHVubGlua193YWtldXApOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJLy9SVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjh4eF9jbG9zZVxuIikpOworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKworCQkvLyBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsCisJCS8vIE5JQ0xvYWRGaXJtd2FyZSB3aWxsIGhhbmcgZm9yZXZlciB3aGVuIGludGVyZmFjZSBpcyB1cCBhZ2Fpbi4KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisgICAgICAgIHsKKwkJICAgIEFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworICAgICAgICB9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy8gc2VuZCBETFMtVEVBUl9ET1dOIG1lc3NhZ2UsCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJeworCQkJVUNIQVIgaTsKKworCQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCX0KKwkJCX0KKworCQkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCX0KKwkJCX0KKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWlmIChJTkZSQV9PTihwQWQpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJCXsKKwkJCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNSZXE7CisJCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQkJQ09QWV9NQUNfQUREUihEaXNSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJRGlzUmVxLlJlYXNvbiA9ICBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HOworCisJCQlNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCU1zZ0VsZW0tPk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLT5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBNc2dFbGVtKTsKKwkJCWtmcmVlKE1zZ0VsZW0pOworCisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQl9CisKKyNpZmRlZiBSVDI4NzAKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgQ0NYX1NVUFBPUlQKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5MZWFwQXV0aFRpbWVyLCAmQ2FuY2VsbGVkKTsKKyNlbmRpZgorCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJeworCQkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCB0byB3cGFfc3VwcGxpY2FudCBmb3IgaW5mcm9taW5nIGludGVyZmFjZSBkb3duLgorCQkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQkJd3JxdS5kYXRhLmZsYWdzID0gUlRfSU5URVJGQUNFX0RPV047CisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCQl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwkJTWxtZVJhZGlvT2ZmKHBBZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspCisJeworCQl3aGlsZSAocEFkLT5EZVF1ZXVlUnVubmluZ1tpXSA9PSBUUlVFKQorCQl7CisJCQlwcmludGsoIldhaXRpbmcgZm9yIFR4UXVldWVbJWRdIGRvbmUuLi4uLi4uLi4uXG4iLCBpKTsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCX0KKwl9CisKKyNpZmRlZiBSVDI4NzAKKwkvLyBlbnN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgYWN0aXZlIHVyYnMuCisJYWRkX3dhaXRfcXVldWUgKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CisJcEFkLT53YWl0ID0gJnVubGlua193YWtldXA7CisKKwkvLyBtYXliZSB3YWl0IGZvciBkZWxldGlvbnMgdG8gZmluaXNoLgorCWkgPSAwOworCS8vd2hpbGUoKGkgPCAyNSkgJiYgYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApCisJd2hpbGUoaSA8IDI1KQorCXsKKwkJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJaWYgKHBBZC0+UGVuZGluZ1J4ID09IDApCisJCXsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQlicmVhazsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDkpCisJCW1zbGVlcChVTkxJTktfVElNRU9VVF9NUyk7CS8vVGltZSBpbiBtaWxsaXNlY29uZAorI2Vsc2UKKwkJUlRNUHVzZWNEZWxheShVTkxJTktfVElNRU9VVF9NUyoxMDAwKTsJLy9UaW1lIGluIG1pY3Jvc2Vjb25kCisjZW5kaWYKKwkJaSsrOworCX0KKwlwQWQtPndhaXQgPSBOVUxMOworCXJlbW92ZV93YWl0X3F1ZXVlICgmdW5saW5rX3dha2V1cCwgJndhaXQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy9SVFVTQkNsZWFuVXBNTE1FV2FpdFF1ZXVlKHBBZCk7CS8qbm90IHVzZWQgaW4gUlQyOHh4Ki8KKworCisjaWZkZWYgUlQyODcwCisJLy8gV2UgbmVlZCBjbGVhciB0aW1lclEgcmVsYXRlZCBzdHJ1Y3R1cmUgYmVmb3JlIGV4aXRzIG9mIHRoZSB0aW1lciB0aHJlYWQuCisJUlQyODcwX1RpbWVyUV9FeGl0KHBBZCk7CisJLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKKwlSVDI4eHhUaHJlYWRUZXJtaW5hdGUocEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vIFN0b3AgTWxtZSBzdGF0ZSBtYWNoaW5lCisJTWxtZUhhbHQocEFkKTsKKworCS8vIENsb3NlIGtlcm5lbCB0aHJlYWRzIG9yIHRhc2tsZXRzCisJa2lsbF90aHJlYWRfdGFzayhwQWQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJTWFjVGFibGVSZXNldChwQWQpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJTWVhc3VyZVJlcVRhYkV4aXQocEFkKTsKKwlUcGNSZXFUYWJFeGl0KHBBZCk7CisKKworCisKKwkvLyBGcmVlIFJpbmcgb3IgVVNCIGJ1ZmZlcnMKKwlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gRnJlZSBCQSByZW9yZGVyIHJlc291cmNlCisJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCisJaWYgKHBBZC0+VXNiVmVuZG9yUmVxQnVmKQorCQlvc19mcmVlX21lbShwQWQsIHBBZC0+VXNiVmVuZG9yUmVxQnVmKTsKKyNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKTsKKworCXJldHVybiAwOyAvLyBjbG9zZSBvaworfSAvKiBFbmQgb2YgcnQyOHh4X2Nsb3NlICovCisKK3N0YXRpYyBpbnQgcnQyOHh4X2luaXQoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJUFJUTVBfQURBUFRFUiAJCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCVVJTlQJCQkJCWluZGV4OworCVVDSEFSCQkJCQlUbXBQaHk7CisJTkRJU19TVEFUVVMJCQkJU3RhdHVzOworCVVJTlQzMiAJCU1hY0NzcjAgPSAwOworCisjaWZkZWYgUlQyODcwCisjaWZkZWYgSU5GX0FNQVpPTl9TRQorCWluaXRfTVVURVgoJihwQWQtPlVzYlZlbmRvclJlcV9zZW1hcGhvcmUpKTsKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSKSZwQWQtPlVzYlZlbmRvclJlcUJ1ZiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFIC0gMSk7CisJaWYgKHBBZC0+VXNiVmVuZG9yUmVxQnVmID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBbGxvY2F0ZSB2ZW5kb3IgcmVxdWVzdCB0ZW1wIGJ1ZmZlciBmYWlsZWQhXG4iKSk7CisJCWdvdG8gZXJyMDsKKwl9CisjZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gQWxsb2NhdGUgQkEgUmVvcmRlcmluZyBtZW1vcnkKKwliYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQocEFkLCBNQVhfUkVPUkRFUklOR19NUERVX05VTSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBNYWtlIHN1cmUgTUFDIGdldHMgcmVhZHkuCisJaW5kZXggPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7CisJCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7CisKKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkgJiYgKHBBZC0+TUFDVmVyc2lvbiAhPSAweEZGRkZGRkZGKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTApOworCX0gd2hpbGUgKGluZGV4KysgPCAxMDApOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKKworCS8vIERpc2FibGUgRE1BCisJUlQyOFhYRE1BRGlzYWJsZShwQWQpOworCisKKwkvLyBMb2FkIDgwNTEgZmlybXdhcmUKKwlTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjE7CisJfQorCisJTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMocEFkKTsKKworCS8vIERpc2FibGUgaW50ZXJydXB0cyBoZXJlIHdoaWNoIGlzIGFzIHNvb24gYXMgcG9zc2libGUKKwkvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgbmV2ZXIgYmUgdHJ1ZS4gV2UgbWlnaHQgY29uc2lkZXIgdG8gcmVtb3ZlIGl0IGxhdGVyCisKKwlTdGF0dXMgPSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIlJUTVBBbGxvY0RNQU1lbW9yeSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKworCS8vIGluaXRpYWxpemUgTUxNRQorCS8vCisKKwlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVJbml0IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJZ290byBlcnIyOworCX0KKworCS8vIEluaXRpYWxpemUgcEFkLT5TdGFDZmcsIHBBZC0+QXBDZmcsIHBBZC0+Q29tbW9uQ2ZnIHRvIG1hbnVmYWN0dXJlIGRlZmF1bHQKKwkvLworCVVzZXJDZmdJbml0KHBBZCk7CisKKyNpZmRlZiBSVDI4NzAKKwkvLyBXZSBuZWVkIGluaXQgdGltZXJRIHJlbGF0ZWQgc3RydWN0dXJlIGJlZm9yZSBjcmVhdGUgdGhlIHRpbWVyIHRocmVhZC4KKwlSVDI4NzBfVGltZXJRX0luaXQocEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCVJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyMTsKKworLy8JQ09QWV9NQUNfQUREUihwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQsIG5ldGlmLT5od2FkZHIpOworLy8JcEFkLT5iRm9yY2VQcmludFRYID0gVFJVRTsKKworCUNmZ0luaXRIb29rKHBBZCk7CisKKworI2lmZGVmIEJMT0NLX05FVF9JRgorCWluaXRibG9ja1F1ZXVlVGFiKHBBZCk7CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCU1lYXN1cmVSZXFUYWJJbml0KHBBZCk7CisJVHBjUmVxVGFiSW5pdChwQWQpOworCisJLy8KKwkvLyBJbml0IHRoZSBoYXJkd2FyZSwgd2UgbmVlZCB0byBpbml0IGFzaWMgYmVmb3JlIHJlYWQgcmVnaXN0cnksIG90aGVyd2lzZSBtYWMgcmVnaXN0ZXIgd2lsbCBiZSByZXNldAorCS8vCisJU3RhdHVzID0gTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBUUlVFKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNJbml0aWFsaXplQWRhcHRlciBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnIzOworCX0KKworCS8vIFJlYWQgcGFyYW1ldGVycyBmcm9tIENvbmZpZyBGaWxlCisJU3RhdHVzID0gUlRNUFJlYWRQYXJhbWV0ZXJzSG9vayhwQWQpOworCisJcHJpbnRrKCIxLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNSZWFkUmVnUGFyYW1ldGVycyBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIixTdGF0dXMpKTsKKwkJZ290byBlcnI0OworCX0KKworI2lmZGVmIFJUMjg3MAorCXBBZC0+Q29tbW9uQ2ZnLmJNdWx0aXBsZUlSUCA9IEZBTFNFOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNdWx0aXBsZUlSUCkKKwkJcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlAgPSBSWF9SSU5HX1NJWkU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCA9IDE7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworICAgCS8vSW5pdCBCYSBDYXBhYmlsaXR5IHBhcmFtZXRlcnMuCisvLwlSVDI4WFhfQkFfSU5JVChwQWQpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJLy8gVVBkYXRhIHRvIEhUIElFCisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIGFmdGVyIHJlYWRpbmcgUmVnaXN0cnksIHdlIG5vdyBrbm93IGlmIGluIEFQIG1vZGUgb3IgU1RBIG1vZGUKKworCS8vIExvYWQgODA1MSBmaXJtd2FyZTsgY3Jhc2ggd2hlbiBGVyBpbWFnZSBub3QgZXhpc3RlbnQKKwkvLyBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKwkvLyBpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJLy8gICAgYnJlYWs7CisKKwlwcmludGsoIjIuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCisJLy8gV2Ugc2hvdWxkIHJlYWQgRUVQUk9NIGZvciBhbGwgY2FzZXMuICBydDI4NjBiCisJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCBtYWMpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcHJpbnRrKCIzLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKworCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOyAvL3J0Mjg2MGIKKworCS8vIFNldCBQSFkgdG8gYXBwcm9wcmlhdGUgbW9kZQorCVRtcFBoeSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBObyB2YWxpZCBjaGFubmVscy4KKwlpZiAocEFkLT5DaGFubmVsTGlzdE51bSA9PSAwKQorCXsKKwkJcHJpbnRrKCJXcm9uZyBjb25maWd1cmF0aW9uLiBObyB2YWxpZCBjaGFubmVsIGZvdW5kLiBDaGVjayBcIkNvbnRyeUNvZGVcIiBhbmQgXCJDaGFubmVsR2VvZ3JhcGh5XCIgc2V0dGluZy5cbiIpOworCQlnb3RvIGVycjQ7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcHJpbnRrKCJNQ1MgU2V0ID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdLAorICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdLAorICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzNdLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzRdKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg3MAorICAgIC8vSW5pdCBSVDMweHggUkZSZWdpc3RlcnMgYWZ0ZXIgcmVhZCBSRklDIHR5cGUgZnJvbSBFRVBST00KKwlOSUNJbml0UlQzMHh4UkZSZWdpc3RlcnMocEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmIDAKKwkvLyBQYXRjaCBjYXJkYnVzIGNvbnRyb2xsZXIgaWYgRUVQUk9NIHNhaWQgc28uCisJaWYgKHBBZC0+YlRlc3QxID09IEZBTFNFKQorCQlSVE1QUGF0Y2hDYXJkQnVzKHBBZCk7CisjZW5kaWYKKworCisvLwkJQVBJbml0aWFsaXplKHBBZCk7CisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJVlJfSUtBTk9TX0ZQX0luaXQocEFkLT5BcENmZy5Cc3NpZE51bSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKwkJLy8KKwkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwkvLworCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJLy8gODA1MSBmaXJtd2FyZSByZXF1aXJlIHRoZSBzaWduYWwgZHVyaW5nIGJvb3RpbmcgdGltZS4KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzIsIDB4RkYsIDB4MDAsIDB4MDApOworCisJaWYgKHBBZCAmJiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQorCXsKKwkJLy8KKwkJLy8gVW5kbyBldmVyeXRoaW5nIGlmIGl0IGZhaWxlZAorCQkvLworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCQl7CisvLwkJCU5kaXNNRGVyZWdpc3RlckludGVycnVwdCgmcEFkLT5JbnRlcnJ1cHQpOworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKwkJfQorLy8JCVJUTVBGcmVlQWRhcHRlcihwQWQpOyAvLyB3ZSB3aWxsIGZyZWUgaXQgaW4gZGlzY29ubmVjdCgpCisJfQorCWVsc2UgaWYgKHBBZCkKKwl7CisJCS8vIE1pY3Jvc29mdCBIQ1QgcmVxdWlyZSBkcml2ZXIgc2VuZCBhIGRpc2Nvbm5lY3QgZXZlbnQgYWZ0ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uLgorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworLy8JCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCIVxuIikpOworCisKKyNpZmRlZiBSVDI4NzAKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyk7CisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTKTsKKworCQkvLworCQkvLyBTdXBwb3J0IG11bHRpcGxlIEJ1bGtJbiBJUlAsCisJCS8vIHRoZSB2YWx1ZSBvbiBwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCBtYXkgYmUgbGFyZ2UgdGhhbiAxLgorCQkvLworCQlmb3IoaW5kZXg9MDsgaW5kZXg8cEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlA7IGluZGV4KyspCisJCXsKKwkJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUVVNCQnVsa1JlY2VpdmUhXG4iICkpOworCQl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisJfS8vIGVuZCBvZiBlbHNlCisKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjw9PT09IFJUTVBJbml0aWFsaXplLCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCisJcmV0dXJuIFRSVUU7CisKKworZXJyNDoKK2VycjM6CisJTWxtZUhhbHQocEFkKTsKK2VycjI6CisJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeShwQWQpOworLy8JUlRNUEZyZWVBZGFwdGVyKHBBZCk7CitlcnIxOgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPm1wZHVfYmxrX3Bvb2wubWVtKTsgLy8gZnJlZSBCQSBwb29sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpOworCisJLy8gc2hhbGwgbm90IHNldCBtbF9wcml2IHRvIE5VTEwgaGVyZSBiZWNhdXNlIHRoZSBtbF9wcml2IGRpZG4ndCBiZWVuIGZyZWUgeWV0LgorCS8vbmV0X2Rldi0+bWxfcHJpdiA9IDA7CisjaWZkZWYgSU5GX0FNQVpPTl9TRQorZXJyMDoKKyNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCisJcHJpbnRrKCIhISEgJXMgSW5pdGlhbGl6ZWQgZmFpbCAhISFcbiIsIFJUMjh4eF9DSElQX05BTUUpOworCXJldHVybiBGQUxTRTsKK30gLyogRW5kIG9mIHJ0Mjh4eF9pbml0ICovCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBPcGVuIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCWludCByZXR2YWwgPSAwOworIAlQT1NfQ09PS0lFIHBPYmo7CisKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtMTsKKwl9CisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJeworCQlDV19NQVhfSU5fQklUUyA9IDY7CisJfQorCWVsc2UgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJeworCQlDV19NQVhfSU5fQklUUyA9IDEwOworCX0KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwkJCW5ldF9kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOworCQllbHNlIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisJfQorI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCA+PSAxMiAvLworI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIEluaXQKKyAJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJLy8gcmVzZXQgQWRhcHRlciBmbGFncworCVJUTVBfQ0xFQVJfRkxBR1MocEFkKTsKKworCS8vIFJlcXVlc3QgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgUENJIGRldmljZQorCS8vIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aXRoIHRoZSBvcworCVJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KTsKKworCisJLy8gSW5pdCBCc3NUYWIgJiBDaGFubmVsSW5mbyB0YWJibGVzIGZvciBhdXRvIGNoYW5uZWwgc2VsZWN0LgorCisKKwkvLyBDaGlwICYgb3RoZXIgaW5pdAorCWlmIChydDI4eHhfaW5pdChuZXRfZGV2KSA9PSBGQUxTRSkKKwkJZ290byBlcnI7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsIHN0cmxlbihuZXRfZGV2LT5uYW1lKSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gU2V0IHVwIHRoZSBNYWMgYWRkcmVzcworCU5kaXNNb3ZlTWVtb3J5KG5ldF9kZXYtPmRldl9hZGRyLCAodm9pZCAqKSBwQWQtPkN1cnJlbnRBZGRyZXNzLCA2KTsKKworCS8vIEluaXQgSVJRIHBhcmFtZXRlcnMKKwlSVDI4WFhfSVJRX0lOSVQocEFkKTsKKworCS8vIFZhcmlvdXMgQVAgZnVuY3Rpb24gaW5pdAorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQl7CisJCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCisJCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlRFUkZBQ0VfVVA7CisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCQl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBFbmFibGUgSW50ZXJydXB0CisJUlQyOFhYX0lSUV9FTkFCTEUocEFkKTsKKworCS8vIE5vdyBFbmFibGUgUnhUeAorCVJUTVBFbmFibGVSeFR4KHBBZCk7CisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOworCisJeworCVVJTlQzMiByZWcgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgMHgxMzAwLCAmcmVnKTsgIC8vIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cworCXByaW50aygiMHgxMzAwID0gJTA4eFxuIiwgcmVnKTsKKwl9CisKKwl7CisvLwl1MzIgcmVnOworLy8JdTggIGJ5dGU7CisvLwl1MTYgdG1wOworCisvLwlSVE1QX0lPX1JFQUQzMihwQWQsIFhJRlNfVElNRV9DRkcsICZyZWcpOworCisvLwl0bXAgPSAweDA4MDU7CisvLwlyZWcgID0gKHJlZyAmIDB4ZmZmZjAwMDApIHwgdG1wOworLy8JUlRNUF9JT19XUklURTMyKHBBZCwgWElGU19USU1FX0NGRywgcmVnKTsKKworCX0KKworI2lmIDAKKwkvKgorCSAqIGRlYnVnZ2luZyBoZWxwZXIKKwkgKiAJCXNob3cgdGhlIHNpemUgb2YgbWFpbiB0YWJsZSBpbiBBZGFwdGVyIHN0cnVjdHVyZQorCSAqCQlNYWNUYWIgIC0tIDE4NUsKKwkgKgkJQkFUYWJsZSAtLSAxMzdLCisJICogCQlUb3RhbCAJLS0gMzg1SyAgISEhISEgKDUvMjYvMjAwNikKKwkgKi8KKwlwcmludGsoInNpemVvZihwQWQtPk1hY1RhYikgPSAlbGRcbiIsIHNpemVvZihwQWQtPk1hY1RhYikpOworCXByaW50aygic2l6ZW9mKHBBZC0+QWNjZXNzQ29udHJvbExpc3QpID0gJWxkXG4iLCBzaXplb2YocEFkLT5BY2Nlc3NDb250cm9sTGlzdCkpOworCXByaW50aygic2l6ZW9mKHBBZC0+QXBDZmcpID0gJWxkXG4iLCBzaXplb2YocEFkLT5BcENmZykpOworCXByaW50aygic2l6ZW9mKHBBZC0+QkFUYWJsZSkgPSAlbGRcbiIsIHNpemVvZihwQWQtPkJBVGFibGUpKTsKKwlCVUcoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gKHJldHZhbCk7CisKK2VycjoKKwlyZXR1cm4gKC0xKTsKK30gLyogRW5kIG9mIHJ0Mjh4eF9vcGVuICovCisKKworLyogTXVzdCBub3QgYmUgY2FsbGVkIGZvciBtZGV2IGFuZCBhcGRldiAqLworc3RhdGljIE5ESVNfU1RBVFVTIHJ0X2llZWU4MDIxMV9pZl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlORElTX1NUQVRVUyBTdGF0dXM7CisJSU5UICAgICBpPTA7CisJQ0hBUiAgICBzbG90X25hbWVbSUZOQU1TSVpdOworCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldmljZTsKKworCisJLy9ldGhlcl9zZXR1cChkZXYpOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gcnQyOHh4X3NlbmRfcGFja2V0czsKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IElLQU5PU19EYXRhRnJhbWVzVHg7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworCisvLwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGllZWU4MDIxMV9zZXRfbXVsdGljYXN0X2xpc3Q7CisvLwlkZXYtPmNoYW5nZV9tdHUgPSBpZWVlODAyMTFfY2hhbmdlX210dTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwl7CisJCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCX0KKyNlbmRpZiAvL1dJUkVMRVNTX0VYVCA+PSAxMgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCXsKKwkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7CisJfQorI2VuZGlmIC8vV0lSRUxFU1NfRVhUID49IDEyCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA8IDIxCisJCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZgorCWRldi0+Z2V0X3N0YXRzID0gUlQyOHh4X2dldF9ldGhlcl9zdGF0czsKKwlkZXYtPm9wZW4gPSBNYWluVmlydHVhbElGX29wZW47IC8vcnQyOHh4X29wZW47CisJZGV2LT5zdG9wID0gTWFpblZpcnR1YWxJRl9jbG9zZTsgLy9ydDI4eHhfY2xvc2U7CisvLwlkZXYtPnVuaW5pdCA9IGllZWU4MDIxMV9pZl9yZWluaXQ7CisvLwlkZXYtPmRlc3RydWN0b3IgPSBpZWVlODAyMTFfaWZfZnJlZTsKKwlkZXYtPnByaXZfZmxhZ3MgPSBJTlRfTUFJTjsKKwlkZXYtPmRvX2lvY3RsID0gcnQyOHh4X2lvY3RsOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgZGV2LT52YWxpZGF0ZV9hZGRyID0gTlVMTDsKKyNlbmRpZgorCS8vIGZpbmQgYXZhaWxhYmxlIGRldmljZSBuYW1lCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmIChwQWQtPk1DX1Jvd0lEID49IDApCisJCQlzcHJpbnRmKHNsb3RfbmFtZSwgInJhJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGkpOworCQllbHNlCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCXNwcmludGYoc2xvdF9uYW1lLCAicmElZCIsIGkpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNikKKyAgICAgICAgZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKGRldl9uZXQoZGV2KSwgc2xvdF9uYW1lKTsKKyNlbHNlCisgICAgICAgIGRldmljZSA9IGRldl9nZXRfYnlfbmFtZShkZXYtPm5kX25ldCwgc2xvdF9uYW1lKTsKKyNlbmRpZgorI2Vsc2UKKwkJZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKHNsb3RfbmFtZSk7CisjZW5kaWYKKwkJaWYgKGRldmljZSAhPSBOVUxMKSBkZXZfcHV0KGRldmljZSk7CisjZWxzZQorCQlmb3IgKGRldmljZSA9IGRldl9iYXNlOyBkZXZpY2UgIT0gTlVMTDsgZGV2aWNlID0gZGV2aWNlLT5uZXh0KQorCQl7CisJCQlpZiAoc3RybmNtcChkZXZpY2UtPm5hbWUsIHNsb3RfbmFtZSwgNCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWlmKGRldmljZSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCisJaWYoaSA9PSA4KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTm8gYXZhaWxhYmxlIHNsb3QgbmFtZVxuIikpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwllbHNlCisJeworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCQlpZiAocEFkLT5NQ19Sb3dJRCA+PSAwKQorCSAgICAgICAgc3ByaW50ZihkZXYtPm5hbWUsICJyYSUwMmRfJWQiLCBwQWQtPk1DX1Jvd0lELCBpKTsKKwkJZWxzZQorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCQlzcHJpbnRmKGRldi0+bmFtZSwgInJhJWQiLCBpKTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gU3RhdHVzOworCit9CisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBHZXQgY2FyZCBwcm9maWxlIHBhdGguCisKK0FyZ3VtZW50czoKKyAgICBwQWQKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCS0gRmluZCBhIGNhcmQgcHJvZmlsZQorCUZBTFNFCQktIHVzZSBkZWZhdWx0IHByb2ZpbGUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2V4dGVybiBJTlQgUlRNUEdldEtleVBhcmFtZXRlcigKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIpOworCitCT09MRUFOIFJUTVBfQ2FyZEluZm9SZWFkKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkKQoreworI2RlZmluZSBNQ19TRUxFQ1RfQ0FSRElECQkwCS8qIHVzZSBDQVJEIElEICgwIH4gMzEpIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBjYXJkcyAqLworI2RlZmluZSBNQ19TRUxFQ1RfTUFDCQkJMQkvKiB1c2UgQ0FSRCBNQUMgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisjZGVmaW5lIE1DX1NFTEVDVF9DQVJEVFlQRQkJMgkvKiB1c2UgQ0FSRCB0eXBlIChhYmduIG9yIGJnbikgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisKKyNkZWZpbmUgTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHR4dF9wLCBjYXJkX2lkKQkJCVwKKwl7CVVJTlQzMiBfbGVuOyBjaGFyIF9jaGFyOwkJCQkJCVwKKwkJZm9yKF9sZW49MDsgX2xlbjxzdHJsZW4oY2FyZF9pZCk7IF9sZW4rKykgewkJXAorCQkJX2NoYXIgPSAqKHR4dF9wICsgX2xlbik7CQkJCQlcCisJCQlpZiAoKCdBJyA8PSBfY2hhcikgJiYgKF9jaGFyIDw9ICdaJykpCQlcCisJCQkJKih0eHRfcCtfbGVuKSA9ICdhJysoX2NoYXItJ0EnKTsJCVwKKwkJfSB9CisKKwlzdHJ1Y3QgZmlsZSAqc3JjZjsKKwlJTlQgcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQ7CisgICAJbW1fc2VnbWVudF90IG9yZ2ZzOworCUNIQVIgKmJ1ZmZlciwgKnRtcGJ1ZiwgY2FyZF9pZF9idWZbMzBdLCBSRklDX3dvcmRbMzBdOworCUJPT0xFQU4gZmxnX21hdGNoX29rID0gRkFMU0U7CisJSU5UMzIgY2FyZF9zZWxlY3RfbWV0aG9kOworCUlOVDMyIGNhcmRfZnJlZV9pZCwgY2FyZF9ub3VzZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9tYXRjaF9pZDsKKwlFRVBST01fQU5URU5OQV9TVFJVQyBhbnRlbm5hOworCVVTSE9SVCBhZGRyMDEsIGFkZHIyMywgYWRkcjQ1OworCVVJTlQ4IG1hY1s2XTsKKwlVSU5UMzIgZGF0YSwgY2FyZF9pbmRleDsKKwlVQ0hBUiAqc3RhcnRfcHRyOworCisKKwkvLyBpbml0CisJYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKwl0bXBidWYgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmKHRtcGJ1ZiA9PSBOVUxMKQorCXsKKwkJa2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJb3JnZnN1aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlvcmdmc2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+ZnNnaWQgPSAwOworICAgIG9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwkvLyBnZXQgUkYgSUMgdHlwZQorCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJmRhdGEpOworCisJaWYgKChkYXRhICYgMHgzMCkgPT0gMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJLy8gOTNDNDYKKwllbHNlIGlmICgoZGF0YSAmIDB4MzApID09IDB4MTApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzY2CisJZWxzZQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvLyA5M0M4NgorCisJLy9hbnRlbm5hLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX05JQzFfT0ZGU0VULCBhbnRlbm5hLndvcmQpOworCisJaWYgKChhbnRlbm5hLmZpZWxkLlJmSWNUeXBlID09IFJGSUNfMjg1MCkgfHwKKwkJKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yNzUwKSkKKwl7CisJCS8qIEFCR04gY2FyZCAqLworCQlzdHJjcHkoUkZJQ193b3JkLCAiYWJnbiIpOworCX0KKwllbHNlCisJeworCQkvKiBCR04gY2FyZCAqLworCQlzdHJjcHkoUkZJQ193b3JkLCAiYmduIik7CisJfQorCisJLy8gZ2V0IE1BQyBhZGRyZXNzCisJLy9hZGRyMDEgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCAweDA0KTsKKwkvL2FkZHIyMyA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDYpOworCS8vYWRkcjQ1ID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA0LCBhZGRyMDEpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNiwgYWRkcjIzKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgsIGFkZHI0NSk7CisKKwltYWNbMF0gPSAoVUNIQVIpKGFkZHIwMSAmIDB4ZmYpOworCW1hY1sxXSA9IChVQ0hBUikoYWRkcjAxID4+IDgpOworCW1hY1syXSA9IChVQ0hBUikoYWRkcjIzICYgMHhmZik7CisJbWFjWzNdID0gKFVDSEFSKShhZGRyMjMgPj4gOCk7CisJbWFjWzRdID0gKFVDSEFSKShhZGRyNDUgJiAweGZmKTsKKwltYWNbNV0gPSAoVUNIQVIpKGFkZHI0NSA+PiA4KTsKKworCS8vIG9wZW4gY2FyZCBpbmZvcm1hdGlvbiBmaWxlCisJc3JjZiA9IGZpbHBfb3BlbihDQVJEX0lORk9fUEFUSCwgT19SRE9OTFksIDApOworCWlmIChJU19FUlIoc3JjZikpCisJeworCQkvKiBjYXJkIGluZm9ybWF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QgKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSwgQ0FSRF9JTkZPX1BBVEgpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPnJlYWQpCisJeworCQkvKiBjYXJkIGluZm9ybWF0aW9uIGZpbGUgZXhpc3RzIHNvIHJlYWRpbmcgdGhlIGNhcmQgaW5mb3JtYXRpb24gKi8KKwkJbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7CisJCXJldHZhbCA9IHNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFLCAmc3JjZi0+Zl9wb3MpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJeworCQkJLyogcmVhZCBmYWlsICovCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSgiLS0+IFJlYWQgJXMgZXJyb3IgJWRcbiIsIENBUkRfSU5GT19QQVRILCAtcmV0dmFsKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBnZXQgY2FyZCBzZWxlY3Rpb24gbWV0aG9kICovCisJCQltZW1zZXQodG1wYnVmLCAweDAwLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRUWVBFOyAvLyBkZWZhdWx0CisKKwkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJTRUxFQ1QiLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKKwkJCXsKKwkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkNBUkRJRCIpID09IDApCisJCQkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJESUQ7CisJCQkJZWxzZSBpZiAoc3RyY21wKHRtcGJ1ZiwgIk1BQyIpID09IDApCisJCQkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9NQUM7CisJCQkJZWxzZSBpZiAoc3RyY21wKHRtcGJ1ZiwgIkNBUkRUWVBFIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRUWVBFOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCJNQz4gQ2FyZCBTZWxlY3Rpb24gPSAlZFxuIiwgY2FyZF9zZWxlY3RfbWV0aG9kKSk7CisKKwkJCS8vIGluaXQKKwkJCWNhcmRfZnJlZV9pZCA9IC0xOworCQkJY2FyZF9ub3VzZV9pZCA9IC0xOworCQkJY2FyZF9zYW1lX21hY19pZCA9IC0xOworCQkJY2FyZF9tYXRjaF9pZCA9IC0xOworCisJCQkvLyBzZWFyY2ggY3VycmVudCBjYXJkIGluZm9ybWF0aW9uIHJlY29yZHMKKwkJCWZvcihjYXJkX2luZGV4PTA7CisJCQkJY2FyZF9pbmRleDxNQVhfTlVNX09GX01VTFRJUExFX0NBUkQ7CisJCQkJY2FyZF9pbmRleCsrKQorCQkJeworCQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgorCQkJCQkoKihVSU5UMTYgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVs0XSA9PSAwKSkKKwkJCQl7CisJCQkJCS8vIE1BQyBpcyBhbGwtMCBzbyB0aGUgZW50cnkgaXMgYXZhaWxhYmxlCisJCQkJCU1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID0gMDsKKworCQkJCQlpZiAoY2FyZF9mcmVlX2lkIDwgMCkKKwkJCQkJCWNhcmRfZnJlZV9pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBmcmVlIGVudHJ5CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChtZW1jbXAoTUNfQ2FyZE1hY1tjYXJkX2luZGV4XSwgbWFjLCA2KSA9PSAwKQorCQkJCQl7CisJCQkJCQkvLyB3ZSBmaW5kIHRoZSBlbnRyeSB3aXRoIHNhbWUgTUFDCisJCQkJCQlpZiAoY2FyZF9zYW1lX21hY19pZCA8IDApCisJCQkJCQkJY2FyZF9zYW1lX21hY19pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBzYW1lIGVudHJ5CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvLyBNQUMgaXMgbm90IGFsbC0wIGJ1dCB1c2VkIGZsYWcgPT0gMAorCQkJCQkJaWYgKChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKSAmJgorCQkJCQkJCShjYXJkX25vdXNlX2lkIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJY2FyZF9ub3VzZV9pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBhdmFpbGFibGUgZW50cnkKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSgiTUM+IEZyZWUgPSAlZCwgU2FtZSA9ICVkLCBOT1VTRSA9ICVkXG4iLAorCQkJCQljYXJkX2ZyZWVfaWQsIGNhcmRfc2FtZV9tYWNfaWQsIGNhcmRfbm91c2VfaWQpKTsKKworCQkJaWYgKChjYXJkX3NhbWVfbWFjX2lkID49IDApICYmCisJCQkJKChjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRJRCkgfHwKKwkJCQkoY2FyZF9zZWxlY3RfbWV0aG9kID09IE1DX1NFTEVDVF9DQVJEVFlQRSkpKQorCQkJeworCQkJCS8vIHNhbWUgTUFDIGVudHJ5IGlzIGZvdW5kCisJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfc2FtZV9tYWNfaWQ7CisKKwkJCQlpZiAoY2FyZF9zZWxlY3RfbWV0aG9kID09IE1DX1NFTEVDVF9DQVJEVFlQRSkKKwkJCQl7CisJCQkJCS8vIGZvciBDQVJEVFlQRQorCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAorCQkJCQkJCWNhcmRfbWF0Y2hfaWQsIFJGSUNfd29yZCk7CisKKwkJCQkJaWYgKChzdGFydF9wdHI9cnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLCBjYXJkX2lkX2J1ZikpICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJCS8vIHdlIGZvdW5kIHRoZSBjYXJkIElECisJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gdGhlIGNhcmQgaXMgMXN0IHBsdWctaW4sIHRyeSB0byBmaW5kIHRoZSBtYXRjaCBjYXJkIHByb2ZpbGUKKwkJCQlzd2l0Y2goY2FyZF9zZWxlY3RfbWV0aG9kKQorCQkJCXsKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRElEOiAvLyBDQVJESUQKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmIChjYXJkX2ZyZWVfaWQgPj0gMCkKKwkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9mcmVlX2lkOworCQkJCQkJZWxzZQorCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX25vdXNlX2lkOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfTUFDOiAvLyBNQUMKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICJNQUMlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkJCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sCisJCQkJCQkJCW1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworCisJCQkJCQkvKiB0cnkgdG8gZmluZCB0aGUga2V5IHdvcmQgaW4gdGhlIGNhcmQgZmlsZSAqLworCQkJCQkJaWYgKChzdGFydF9wdHI9cnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLCBjYXJkX2lkX2J1ZikpICE9IE5VTEwpCisJCQkJCQl7CisJCQkJCQkJTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHN0YXJ0X3B0ciwgY2FyZF9pZF9idWYpOworCisJCQkJCQkJLyogZ2V0IHRoZSByb3cgSUQgKDIgQVNDSUkgY2hhcmFjdGVycykgKi8KKwkJCQkJCQlzdGFydF9wdHIgLT0gMjsKKwkJCQkJCQljYXJkX2lkX2J1ZlswXSA9ICooc3RhcnRfcHRyKTsKKwkJCQkJCQljYXJkX2lkX2J1ZlsxXSA9ICooc3RhcnRfcHRyKzEpOworCQkJCQkJCWNhcmRfaWRfYnVmWzJdID0gMHgwMDsKKworCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBzaW1wbGVfc3RydG9sKGNhcmRfaWRfYnVmLCAwLCAxMCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJEVFlQRTogLy8gQ0FSRFRZUEUKKwkJCQkJCWNhcmRfbm91c2VfaWQgPSAtMTsKKworCQkJCQkJZm9yKGNhcmRfaW5kZXg9MDsKKwkJCQkJCQljYXJkX2luZGV4PE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRDsKKwkJCQkJCQljYXJkX2luZGV4KyspCisJCQkJCQl7CisJCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJEVFlQRSVzIiwKKwkJCQkJCQkJCWNhcmRfaW5kZXgsIFJGSUNfd29yZCk7CisKKwkJCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsCisJCQkJCQkJCQkJCQkJCWNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJCQl7CisJCQkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKKworCQkJCQkJCQlpZiAoTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPT0gMCkKKwkJCQkJCQkJeworCQkJCQkJCQkJLyogY3VycmVudCB0aGUgY2FyZCBwcm9maWxlIGlzIG5vdCB1c2VkICovCisJCQkJCQkJCQlpZiAoKCooVUlOVDMyICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bMF0gPT0gMCkgJiYKKwkJCQkJCQkJCQkoKihVSU5UMTYgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVs0XSA9PSAwKSkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQkvLyBmaW5kIGl0IGFuZCBubyBwcmV2aW91cyBjYXJkIHVzZSBpdAorCQkJCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX2luZGV4OworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vIGV2ZXIgYSBjYXJkIHVzZSBpdAorCQkJCQkJCQkJCWlmIChjYXJkX25vdXNlX2lkIDwgMCkKKwkJCQkJCQkJCQkJY2FyZF9ub3VzZV9pZCA9IGNhcmRfaW5kZXg7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIGlmIG5vdCBmaW5kIGEgZnJlZSBvbmUsIHVzZSB0aGUgYXZhaWxhYmxlIG9uZQorCQkJCQkJaWYgKGNhcmRfbWF0Y2hfaWQgPCAwKQorCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX25vdXNlX2lkOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY2FyZF9tYXRjaF9pZCA+PSAwKQorCQkJeworCQkJCS8vIG1ha2UgdXAgc2VhcmNoIGtleXdvcmQKKwkJCQlzd2l0Y2goY2FyZF9zZWxlY3RfbWV0aG9kKQorCQkJCXsKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRElEOiAvLyBDQVJESUQKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRElEIiwgY2FyZF9tYXRjaF9pZCk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9NQUM6IC8vIE1BQworCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwKKwkJCQkJCQkJIiUwMmRtYWMlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkJCQkJCWNhcmRfbWF0Y2hfaWQsCisJCQkJCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sCisJCQkJCQkJCW1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRFRZUEU6IC8vIENBUkRUWVBFCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZGNhcmR0eXBlJXMiLAorCQkJCQkJCQljYXJkX21hdGNoX2lkLCBSRklDX3dvcmQpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VhcmNoIEtleXdvcmQgPSAlc1xuIiwgY2FyZF9pZF9idWYpKTsKKworCQkJCS8vIHJlYWQgY2FyZCBmaWxlIHBhdGgKKwkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcihjYXJkX2lkX2J1ZiwgdG1wYnVmLCAyNTYsIGJ1ZmZlcikpCisJCQkJeworCQkJCQlpZiAoc3RybGVuKHRtcGJ1ZikgPCBzaXplb2YocEFkLT5NQ19GaWxlTmFtZSkpCisJCQkJCXsKKwkJCQkJCS8vIGJhY2t1cCBjYXJkIGluZm9ybWF0aW9uCisJCQkJCQlwQWQtPk1DX1Jvd0lEID0gY2FyZF9tYXRjaF9pZDsgLyogYmFzZSAwICovCisJCQkJCQlNQ19DYXJkVXNlZFtjYXJkX21hdGNoX2lkXSA9IDE7CisJCQkJCQltZW1jcHkoTUNfQ2FyZE1hY1tjYXJkX21hdGNoX2lkXSwgbWFjLCBzaXplb2YobWFjKSk7CisKKwkJCQkJCS8vIGJhY2t1cCBjYXJkIGZpbGUgcGF0aAorCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NQ19GaWxlTmFtZSwgdG1wYnVmICwgc3RybGVuKHRtcGJ1ZikpOworCQkJCQkJcEFkLT5NQ19GaWxlTmFtZVtzdHJsZW4odG1wYnVmKV0gPSAnXDAnOworCQkJCQkJZmxnX21hdGNoX29rID0gVFJVRTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJCSgiQ2FyZCBQcm9maWxlIE5hbWUgPSAlc1xuIiwgcEFkLT5NQ19GaWxlTmFtZSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJCSgiQ2FyZCBQcm9maWxlIE5hbWUgbGVuZ3RoIHRvbyBsYXJnZSFcbiIpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkoIkNhbiBub3QgZmluZCBzZWFyY2gga2V5IHdvcmQgaW4gY2FyZC5kYXQhXG4iKSk7CisJCQkJfQorCisJCQkJaWYgKChmbGdfbWF0Y2hfb2sgIT0gVFJVRSkgJiYKKwkJCQkJKGNhcmRfbWF0Y2hfaWQgPCBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQpKQorCQkJCXsKKwkJCQkJTUNfQ2FyZFVzZWRbY2FyZF9tYXRjaF9pZF0gPSAwOworCQkJCQltZW1zZXQoTUNfQ2FyZE1hY1tjYXJkX21hdGNoX2lkXSwgMCwgc2l6ZW9mKG1hYykpOworCQkJCX0KKwkJCX0gLy8gaWYgKGNhcmRfbWF0Y2hfaWQgPj0gMCkKKwkJfQorCX0KKworCS8vIGNsb3NlIGZpbGUKKwlyZXR2YWwgPSBmaWxwX2Nsb3NlKHNyY2YsIE5VTEwpOworCXNldF9mcyhvcmdmcyk7CisJY3VycmVudC0+ZnN1aWQgPSBvcmdmc3VpZDsKKwljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOworCWtmcmVlKGJ1ZmZlcik7CisJa2ZyZWUodG1wYnVmKTsKKwlyZXR1cm4gZmxnX21hdGNoX29rOworfQorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUHJvYmUgUlQyOFhYIGNoaXBzZXQuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisJX2Rldl9pZF9wCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlIElECisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlQcm9iZSBPSworCS1FTk9ERVYJCQkJUHJvYmUgRmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIF9fZGV2aW5pdCAgIHJ0Mjh4eF9wcm9iZSgKKyAgICBJTiAgdm9pZCAqX2Rldl9wLAorICAgIElOICB2b2lkICpfZGV2X2lkX3AsCisJSU4gIFVJTlQgYXJnYywKKwlPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCkKK3sKKyAgICBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXY7CisgICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgTlVMTDsKKyAgICBJTlQgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlQVk9JRAkJCQloYW5kbGU7CisjaWZkZWYgUlQyODcwCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldl9wID0gKHN0cnVjdCB1c2JfZGV2aWNlICopX2Rldl9wOworI2Vsc2UKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCisJZGV2X3AgPSB1c2JfZ2V0X2RldihkZXZfcCk7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNUQSBEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBDaGVjayBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElECisvLwlpZiAoUlQyOFhYQ2hpcHNldENoZWNrKF9kZXZfcCkgPT0gRkFMU0UpCisvLwkJZ290byBlcnJfb3V0OworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIgICAgICAgLy8gUmVkIEhhdCA3LjEKKyAgICBuZXRfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihQUlRNUF9BREFQVEVSKSwgImV0aCVkIiwgZXRoZXJfc2V0dXApOworI2Vsc2UKKyAgICBuZXRfZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKFBSVE1QX0FEQVBURVIpKTsKKyNlbmRpZgorICAgIGlmIChuZXRfZGV2ID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGsoImFsbG9jX25ldGRldiBmYWlsZWRcbiIpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisjZW5kaWYgLy9MSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTUpCisjZWxzZQorCQlNT0RfREVDX1VTRV9DT1VOVDsKKyNlbmRpZgorICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgfQorCisvLyBzYW1wbGUKKy8vCWlmIChydF9pZWVlODAyMTFfaWZfc2V0dXAobmV0X2RldikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKy8vCQlnb3RvIGVycl9vdXQ7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgU0VUX01PRFVMRV9PV05FUihuZXRfZGV2KTsKKyNlbmRpZgorCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorLyogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyICovCisvKiBTZXQgdGhlIHN5c2ZzIHBoeXNpY2FsIGRldmljZSByZWZlcmVuY2UgZm9yIHRoZSBuZXR3b3JrIGxvZ2ljYWwgZGV2aWNlCisgKiBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApKQorICAgIFNFVF9ORVRERVZfREVWKG5ldF9kZXYsICYoZGV2X3AtPmRldikpOworI2VuZGlmCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCS8vIEFsbG9jYXRlIFJUTVBfQURBUFRFUiBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZQorCWhhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc19jb29raWUpLCBHRlBfS0VSTkVMKTsKKwlSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCk7CisKKwlzdGF0dXMgPSBSVE1QQWxsb2NBZGFwdGVyQmxvY2soaGFuZGxlLCAmcEFkKTsKKwlpZiAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCW5ldF9kZXYtPm1sX3ByaXYgPSAoUFZPSUQpcEFkOworICAgIHBBZC0+bmV0X2RldiA9IG5ldF9kZXY7IC8vIG11c3QgYmUgYmVmb3JlIFJUMjhYWE5ldERldkluaXQoKQorCisJUlQyOFhYTmV0RGV2SW5pdChfZGV2X3AsIG5ldF9kZXYsIHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBwQWQtPlN0YUNmZy5PcmlEZXZUeXBlID0gbmV0X2Rldi0+dHlwZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIEZpbmQgYW5kIGFzc2lnbiBhIGZyZWUgaW50ZXJmYWNlIG5hbWUsIHJheHgKKy8vCVJUMjhYWEF2YWlsUkFOYW1lQXNzaWduKG5ldF9kZXYtPm5hbWUpOworCisJLy8gUG9zdCBjb25maWcKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpZiAoUlQyOFhYUHJvYmVQb3N0Q29uZmlnKF9kZXZfcCwgcEFkLCBhcmdjKSA9PSBGQUxTRSkKKwkJZ290byBlcnJfb3V0X3VubWFwOworI2Vsc2UKKwlpZiAoUlQyOFhYUHJvYmVQb3N0Q29uZmlnKF9kZXZfcCwgcEFkLCAwKSA9PSBGQUxTRSkKKwkJZ290byBlcnJfb3V0X3VubWFwOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJcEFkLT5PcE1vZGUgPSBPUE1PREVfU1RBOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkvLyBmaW5kIGl0cyBwcm9maWxlIHBhdGgKKwlwQWQtPk1DX1Jvd0lEID0gLTE7IC8vIHVzZSBkZWZhdWx0IHByb2ZpbGUgcGF0aAorCVJUTVBfQ2FyZEluZm9SZWFkKHBBZCk7CisKKwlpZiAocEFkLT5NQ19Sb3dJRCA9PSAtMSkKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJc3RyY3B5KHBBZC0+TUNfRmlsZU5hbWUsIFNUQV9QUk9GSUxFX1BBVEgpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkoIk1DPiBST1cgPSAlZCwgUEFUSCA9ICVzXG4iLCBwQWQtPk1DX1Jvd0lELCBwQWQtPk1DX0ZpbGVOYW1lKSk7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKwkvLyBzYW1wbGUgbW92ZQorCWlmIChydF9pZWVlODAyMTFfaWZfc2V0dXAobmV0X2RldiwgcEFkKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisKKyAgICAvLyBSZWdpc3RlciB0aGlzIGRldmljZQorICAgIHN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKKyAgICBpZiAoc3RhdHVzKQorICAgICAgICBnb3RvIGVycl9vdXRfdW5tYXA7CisKKyAgICAvLyBTZXQgZHJpdmVyIGRhdGEKKwlSVDI4WFhfRFJWREFUQV9TRVQoX2Rldl9wKTsKKworCisKKwkqcHBBZCA9IHBBZDsKKyAgICByZXR1cm4gMDsgLy8gcHJvYmUgb2sKKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Vycl9vdXRfdW5tYXA6CisJUlRNUEZyZWVBZGFwdGVyKHBBZCk7CisJUlQyOFhYX1VOTUFQKCk7CisKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIGZyZWVfbmV0ZGV2KG5ldF9kZXYpOworI2Vsc2UKKwlrZnJlZShuZXRfZGV2KTsKKyNlbmRpZgorCitlcnJfb3V0OgorCVJUMjhYWF9QVVRfREVWSUNFKGRldl9wKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXJldHVybiAoTE9ORylOVUxMOworI2Vsc2UKKyAgICByZXR1cm4gLUVOT0RFVjsgLyogcHJvYmUgZmFpbCAqLworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworfSAvKiBFbmQgb2YgcnQyOHh4X3Byb2JlICovCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBUaGUgZW50cnkgcG9pbnQgZm9yIExpbnV4IGtlcm5lbCBzZW50IHBhY2tldCB0byBvdXIgZHJpdmVyLgorCitBcmd1bWVudHM6CisgICAgc2tfYnVmZiAqc2tiCQl0aGUgcG9pbnRlciByZWZlciB0byBhIHNrX2J1ZmZlci4KKworUmV0dXJuIFZhbHVlOgorICAgIDAKKworTm90ZToKKwlUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBvZiBUeCBQYXRoIGZvciBPcyBkZWxpdmVyeSBwYWNrZXQgdG8KKwlvdXIgZHJpdmVyLiBZb3Ugb25seSBjYW4gcHV0IE9TLWRlcGVuZWQgJiBTVEEvQVAgY29tbW9uIGhhbmRsZSBwcm9jZWR1cmVzCisJaW4gaGVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBydDI4eHhfcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHNrYi0+ZGV2OworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlpbnQgc3RhdHVzID0gMDsKKwlQTkRJU19QQUNLRVQgcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHNrYjsKKworCS8qIFJUMjg3MFNUQSBkb2VzIHRoaXMgaW4gUlRNUFNlbmRQYWNrZXRzKCkgKi8KKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2Ugd2UgYXJlIGluIG1vbml0b3IgbW9kZQorCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICAgICAgLy8gRWFwb2xTdGFydCBzaXplIGlzIDE4CisJaWYgKHNrYi0+bGVuIDwgMTQpCisJeworCQkvL3ByaW50aygiYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgcGt0LT5sZW4pOworCQloZXhfZHVtcCgiYmFkIHBhY2tldCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKyNpZiAwCisvLwlpZiAoKHBrdC0+ZGF0YVswXSAmIDB4MSkgPT0gMCkKKwl7CisJCS8vaGV4X2R1bXAoX19GVU5DVElPTl9fLCBwa3QtPmRhdGEsIHBrdC0+bGVuKTsKKwkJcHJpbnRrKCJwUGFja2V0ID0gJXhcbiIsIHBQYWNrZXQpOworCX0KKyNlbmRpZgorCisJUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAwKTsKKy8vCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgcGt0LT5kYXRhLCBwa3QtPmxlbik7CisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisgICAgaWYgKCooaW50Kikoc2tiLT5jYikgPT0gQlJJREdFX1RBRykgeworCQlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDEpOworICAgIH0KKyNlbmRpZgorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCisJCVNUQVNlbmRQYWNrZXRzKChORElTX0hBTkRMRSlwQWQsIChQUE5ESVNfUEFDS0VUKSAmcFBhY2tldCwgMSk7CisJfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlzdGF0dXMgPSAwOworZG9uZToKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBTZW5kIGEgcGFja2V0IHRvIFdMQU4uCisKK0FyZ3VtZW50czoKKyAgICBza2JfcCAgICAgICAgICAgcG9pbnRzIHRvIG91ciBhZGFwdGVyCisgICAgZGV2X3AgICAgICAgICAgIHdoaWNoIFdMQU4gbmV0d29yayBpbnRlcmZhY2UKKworUmV0dXJuIFZhbHVlOgorICAgIDA6IHRyYW5zbWl0IHN1Y2Nlc3NmdWxseQorICAgIG90aGVyd2lzZTogdHJhbnNtaXQgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIHJ0Mjh4eF9zZW5kX3BhY2tldHMoCisJSU4gc3RydWN0IHNrX2J1ZmYgCQkqc2tiX3AsCisJSU4gc3RydWN0IG5ldF9kZXZpY2UgCSpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCWlmICghKG5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwl7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCAoUE5ESVNfUEFDS0VUKXNrYl9wLCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmc2tiX3AtPmNiW0NCX09GRl0sIDE1KTsKKwlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoc2tiX3AsIE1BSU5fTUJTU0lEKTsKKworCXJldHVybiBydDI4eHhfcGFja2V0X3htaXQoc2tiX3ApOworfSAvKiBFbmQgb2YgTUJTU19WaXJ0dWFsSUZfUGFja2V0U2VuZCAqLworCisKKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIJLy8gUmVkIEhhdCA3LjEKKy8vc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoaW50IHNpemVvZl9wcml2LCBjb25zdCBjaGFyICptYXNrLCB2b2lkICgqc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICopKSAvL3NhbXBsZQorc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX25ldGRldigKKwlpbnQgc2l6ZW9mX3ByaXYsCisJY29uc3QgY2hhciAqbWFzaywKKwl2b2lkICgqc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICopKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisgICAgSU5UCQkJCQlhbGxvY19zaXplOworCisKKyAgICAvKiBlbnN1cmUgMzItYnl0ZSBhbGlnbm1lbnQgb2YgdGhlIHByaXZhdGUgYXJlYSAqLworICAgIGFsbG9jX3NpemUgPSBzaXplb2YgKCpkZXYpICsgc2l6ZW9mX3ByaXYgKyAzMTsKKworICAgIGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBrbWFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOworICAgIGlmIChkZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSgiYWxsb2NfbmV0ZGV2OiBVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIG1lbW9yeS5cbiIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0KGRldiwgMCwgYWxsb2Nfc2l6ZSk7CisKKyAgICBpZiAoc2l6ZW9mX3ByaXYpCisgICAgICAgIGRldi0+cHJpdiA9ICh2b2lkICopICgoKGxvbmcpKGRldiArIDEpICsgMzEpICYgfjMxKTsKKworICAgIHNldHVwKGRldik7CisgICAgc3RyY3B5KGRldi0+bmFtZSwgbWFzayk7CisKKyAgICByZXR1cm4gZGV2OworfQorI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisKK3ZvaWQgQ2ZnSW5pdEhvb2soUFJUTVBfQURBUFRFUiBwQWQpCit7CisJcEFkLT5iQnJvYWRDb21IVCA9IFRSVUU7Cit9IC8qIEVuZCBvZiBDZmdJbml0SG9vayAqLworCisKKyNpZiAwCS8vIE5vdCB1c2VkIG5vdywgc2hvdWxkIGtlZXAgaXQgaW4gb3VyIHNvdXJjZSB0cmVlPz8KKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRmluZCBhbmQgYXNzaWduIGEgZnJlZSBpbnRlcmZhY2UgbmFtZSAocmF4eCkuCisKK0FyZ3VtZW50czoKKyAgICAqbmFtZV9wCQkJCXRoZSBpbnRlcmZhY2UgbmFtZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlUUlVFCQkJCU9LCisJRkFMU0UJCQkJRkFJTAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIEJPT0xFQU4gUlQyOFhYQXZhaWxSQU5hbWVBc3NpZ24oCisJSU4gQ0hBUgkJCSpuYW1lX3ApCit7CisgICAgQ0hBUgkJCQlzbG90X25hbWVbSUZOQU1TSVpdOworICAgIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXZpY2U7CisJVUlOVDMyCQkJCWlmX2lkOworCisKKyAgICBmb3IoaWZfaWQ9MDsgaWZfaWQ8ODsgaWZfaWQrKykKKyAgICB7CisgICAgICAgIHNwcmludGYoc2xvdF9uYW1lLCAicmElZCIsIGlmX2lkKTsKKworICAgICAgICBmb3IoZGV2aWNlPWRldl9iYXNlOyBkZXZpY2UhPU5VTEw7IGRldmljZT1kZXZpY2UtPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGRldmljZS0+bmFtZSwgc2xvdF9uYW1lLCA0KSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRldmljZSA9PSBOVUxMKQorCQkJYnJlYWs7CisgICAgfQorCisgICAgaWYgKGlmX2lkID09IDgpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJObyBhdmFpbGFibGUgc2xvdCBuYW1lXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBzcHJpbnRmKG5hbWVfcCwgInJhJWQiLCBpZl9pZCk7CisJcmV0dXJuIFRSVUU7Cit9IC8qIEVuZCBvZiBSVDI4WFhBdmFpbFJBTmFtZUFzc2lnbiAqLworI2VuZGlmCisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCisgICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC0tLT5cbiIpKTsKKworCXBBZC0+aXdfc3RhdHMuc3RhdHVzID0gMDsgLy8gU3RhdHVzIC0gZGV2aWNlIGRlcGVuZGVudCBmb3Igbm93CisKKwkvLyBsaW5rIHF1YWxpdHkKKwlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9ICgocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ICogMTIpLzEwICsgMTApOworCWlmKHBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID4gMTAwKQorCQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9IDEwMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQlwQWQtPml3X3N0YXRzLnF1YWwubGV2ZWwgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcEFkLT5pd19zdGF0cy5xdWFsLm5vaXNlID0gcEFkLT5CYnBXcml0ZUxhdGNoWzY2XTsgLy8gbm9pc2UgbGV2ZWwgKGRCbSkKKworCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSArPSAyNTYgLSAxNDM7CisJcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgPSAxOyAgICAgLy8gRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkCisjaWZkZWYgSVdfUVVBTF9EQk0KKwlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0RCTTsJLy8gTGV2ZWwgKyBOb2lzZSBhcmUgZEJtCisjZW5kaWYgLy8gSVdfUVVBTF9EQk0gLy8KKworCXBBZC0+aXdfc3RhdHMuZGlzY2FyZC5ud2lkID0gMDsgICAgIC8vIFJ4IDogV3JvbmcgbndpZC9lc3NpZAorCXBBZC0+aXdfc3RhdHMubWlzcy5iZWFjb24gPSAwOyAgICAgIC8vIE1pc3NlZCBiZWFjb25zL3N1cGVyZnJhbWUKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0c1xuIikpOworCXJldHVybiAmcEFkLT5pd19zdGF0czsKK30gLyogRW5kIG9mIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgKi8KKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQgLy8KKworCisKK3ZvaWQgdGJ0dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKyNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKKworfQorCitJTlQgcnQyOHh4X2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCQkJY21kKQoreworCVZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUlRNUF9BREFQVEVSCSpwQWQgPSBOVUxMOworCUlOVAkJCQlyZXQgPSAwOworCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlyZXQgPSBydDI4eHhfc3RhX2lvY3RsKG5ldF9kZXYsIHJxLCBjbWQpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICByZXR1cm4gZXRoZXJuZXQgc3RhdGlzdGljcyBjb3VudGVyCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIG5ldF9kZXYgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG5ldF9kZXZpY2UKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgbmV0X2RldmljZV9zdGF0cyoKKworICAgIE5vdGU6CisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKKyAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBOVUxMOworCisJaWYgKG5ldF9kZXYpCisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwlpZiAocEFkKQorCXsKKworCQlwQWQtPnN0YXRzLnJ4X3BhY2tldHMgPSBwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisJCXBBZC0+c3RhdHMudHhfcGFja2V0cyA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKworCQlwQWQtPnN0YXRzLnJ4X2J5dGVzID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudDsKKwkJcEFkLT5zdGF0cy50eF9ieXRlcyA9IHBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisKKwkJcEFkLT5zdGF0cy5yeF9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeEVycm9yczsKKwkJcEFkLT5zdGF0cy50eF9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5UeEVycm9yczsKKworCQlwQWQtPnN0YXRzLnJ4X2Ryb3BwZWQgPSAwOworCQlwQWQtPnN0YXRzLnR4X2Ryb3BwZWQgPSAwOworCisJICAgIHBBZC0+c3RhdHMubXVsdGljYXN0ID0gcEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OyAgIC8vIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkCisJICAgIHBBZC0+c3RhdHMuY29sbGlzaW9ucyA9IHBBZC0+Q291bnRlcnM4MDIzLk9uZUNvbGxpc2lvbiArIHBBZC0+Q291bnRlcnM4MDIzLk1vcmVDb2xsaXNpb25zOyAgLy8gQ29sbGlzaW9uIHBhY2tldHMKKworCSAgICBwQWQtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsgICAgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93CisJICAgIHBBZC0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IDA7Ly9wQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50OyAgICAgLy8gcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvcgorCSAgICBwQWQtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJjdkFsaWdubWVudEVycm9yczsgICAgICAgICAgLy8gcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvcgorCSAgICBwQWQtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsgICAgICAgICAgICAgICAgICAgLy8gcmVjdidyIGZpZm8gb3ZlcnJ1bgorCSAgICBwQWQtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZXIgbWlzc2VkIHBhY2tldAorCisJICAgIC8vIGRldGFpbGVkIHR4X2Vycm9ycworCSAgICBwQWQtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfZmlmb19lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSAwOworCisJICAgIC8vIGZvciBjc2xpcCBldGMKKwkgICAgcEFkLT5zdGF0cy5yeF9jb21wcmVzc2VkID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9jb21wcmVzc2VkID0gMDsKKworCQlyZXR1cm4gJnBBZC0+c3RhdHM7CisJfQorCWVsc2UKKyAgICAJcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0NzRhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfcHJvZmlsZS5jCkBAIC0wLDAgKzEsMjAyMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgdm9pZCBIVFBhcmFtZXRlcnNIb29rKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCSAgKnBWYWx1ZVN0ciwKKwlJTglDSEFSCQkgICpwSW5wdXQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjZGVmaW5lIEVUSF9NQUNfQUREUl9TVFJfTEVOIDE3ICAvLyBpbiBmb3JtYXQgb2YgeHg6eHg6eHg6eHg6eHg6eHgKKworLy8gV2UgYXNzdW1lIHRoZSBzMSBpcyBhIHN0aW5nLCBzMiBpcyBhIG1lbW9yeSBzcGFjZSB3aXRoIDYgYnl0ZXMuIGFuZCBjb250ZW50IG9mIHMxIHdpbGwgYmUgY2hhbmdlZC4KK0JPT0xFQU4gcnRzdHJtYWN0b2hleChjaGFyICpzMSwgY2hhciAqczIpCit7CisJaW50IGkgPSAwOworCWNoYXIgKnB0b2tTID0gczEsICpwdG9rRSA9IHMxOworCisJaWYgKHN0cmxlbihzMSkgIT0gRVRIX01BQ19BRERSX1NUUl9MRU4pCisJCXJldHVybiBGQUxTRTsKKworCXdoaWxlKCgqcHRva1MpICE9ICdcMCcpCisJeworCQlpZigocHRva0UgPSBzdHJjaHIocHRva1MsICc6JykpICE9IE5VTEwpCisJCQkqcHRva0UrKyA9ICdcMCc7CisJCWlmICgoc3RybGVuKHB0b2tTKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCpwdG9rUykpIHx8ICghaXN4ZGlnaXQoKihwdG9rUysxKSkpKQorCQkJYnJlYWs7IC8vIGZhaWwKKwkJQXRvSChwdG9rUywgJnMyW2krK10sIDEpOworCQlwdG9rUyA9IHB0b2tFOworCQlpZiAoaSA9PSA2KQorCQkJYnJlYWs7IC8vIHBhcnNpbmcgZmluaXNoZWQKKwl9CisKKwlyZXR1cm4gKCBpID09IDYgPyBUUlVFIDogRkFMU0UpOworCit9CisKKworLy8gd2UgYXNzdW1lIHRoZSBzMSBhbmQgczIgYm90aCBhcmUgc3RyaW5ncy4KK0JPT0xFQU4gcnRzdHJjYXNlY21wKGNoYXIgKnMxLCBjaGFyICpzMikKK3sKKwljaGFyICpwMSA9IHMxLCAqcDIgPSBzMjsKKworCWlmIChzdHJsZW4oczEpICE9IHN0cmxlbihzMikpCisJCXJldHVybiBGQUxTRTsKKworCXdoaWxlKCpwMSAhPSAnXDAnKQorCXsKKwkJaWYoKCpwMSAhPSAqcDIpICYmICgoKnAxIF4gKnAyKSAhPSAweDIwKSkKKwkJCXJldHVybiBGQUxTRTsKKwkJcDErKzsKKwkJcDIrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gd2UgYXNzdW1lIHRoZSBzMSAoYnVmZmVyKSBhbmQgczIgKGtleSkgYm90aCBhcmUgc3RyaW5ncy4KK2NoYXIgKiBydHN0cnN0cnVuY2FzZWNtcChjaGFyICogczEsIGNoYXIgKiBzMikKK3sKKwlJTlQgbDEsIGwyLCBpOworCWNoYXIgdGVtcDEsIHRlbXAyOworCisJbDIgPSBzdHJsZW4oczIpOworCWlmICghbDIpCisJCXJldHVybiAoY2hhciAqKSBzMTsKKworCWwxID0gc3RybGVuKHMxKTsKKworCXdoaWxlIChsMSA+PSBsMikKKwl7CisJCWwxLS07CisKKwkJZm9yKGk9MDsgaTxsMjsgaSsrKQorCQl7CisJCQl0ZW1wMSA9ICooczEraSk7CisJCQl0ZW1wMiA9ICooczIraSk7CisKKwkJCWlmICgoJ2EnIDw9IHRlbXAxKSAmJiAodGVtcDEgPD0gJ3onKSkKKwkJCQl0ZW1wMSA9ICdBJysodGVtcDEtJ2EnKTsKKwkJCWlmICgoJ2EnIDw9IHRlbXAyKSAmJiAodGVtcDIgPD0gJ3onKSkKKwkJCQl0ZW1wMiA9ICdBJysodGVtcDItJ2EnKTsKKworCQkJaWYgKHRlbXAxICE9IHRlbXAyKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gbDIpCisJCQlyZXR1cm4gKGNoYXIgKikgczE7CisKKwkJczErKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsgLy8gbm90IGZvdW5kCit9CisKKy8vYWRkIGJ5IGthdGh5CisKKyAvKioKKyAgKiBzdHJzdHIgLSBGaW5kIHRoZSBmaXJzdCBzdWJzdHJpbmcgaW4gYSAlTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCisgICogQHMxOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgICogQHMyOiBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IKKyAgKi8KK2NoYXIgKiBydHN0cnN0cihjb25zdCBjaGFyICogczEsY29uc3QgY2hhciAqIHMyKQoreworCUlOVCBsMSwgbDI7CisKKwlsMiA9IHN0cmxlbihzMik7CisJaWYgKCFsMikKKwkJcmV0dXJuIChjaGFyICopIHMxOworCisJbDEgPSBzdHJsZW4oczEpOworCisJd2hpbGUgKGwxID49IGwyKQorCXsKKwkJbDEtLTsKKwkJaWYgKCFtZW1jbXAoczEsczIsbDIpKQorCQkJcmV0dXJuIChjaGFyICopIHMxOworCQlzMSsrOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHJzdHJ0b2sgLSBTcGxpdCBhIHN0cmluZyBpbnRvIHRva2VucworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBjdDogVGhlIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvcgorICogKiBXQVJOSU5HOiBzdHJ0b2sgaXMgZGVwcmVjYXRlZCwgdXNlIHN0cnNlcCBpbnN0ZWFkLiBIb3dldmVyIHN0cnNlcCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG9sZCBhcmNoaXRlY3R1cmUuCisgKi8KK2NoYXIgKiBfX3JzdHJ0b2s7CitjaGFyICogcnN0cnRvayhjaGFyICogcyxjb25zdCBjaGFyICogY3QpCit7CisJY2hhciAqc2JlZ2luLCAqc2VuZDsKKworCXNiZWdpbiAgPSBzID8gcyA6IF9fcnN0cnRvazsKKwlpZiAoIXNiZWdpbikKKwl7CisJCXJldHVybiBOVUxMOworCX0KKworCXNiZWdpbiArPSBzdHJzcG4oc2JlZ2luLGN0KTsKKwlpZiAoKnNiZWdpbiA9PSAnXDAnKQorCXsKKwkJX19yc3RydG9rID0gTlVMTDsKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCisJc2VuZCA9IHN0cnBicmsoIHNiZWdpbiwgY3QpOworCWlmIChzZW5kICYmICpzZW5kICE9ICdcMCcpCisJCSpzZW5kKysgPSAnXDAnOworCisJX19yc3RydG9rID0gc2VuZDsKKworCXJldHVybiAoc2JlZ2luKTsKK30KKworLyoqCisgKiBkZWxpbWl0Y250IC0gcmV0dXJuIHRoZSBjb3VudCBvZiBhIGdpdmVuIGRlbGltaXRlciBpbiBhIGdpdmVuIHN0cmluZy4KKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkLgorICogQGN0OiBUaGUgZGVsaW1pdGVyIHRvIHNlYXJjaCBmb3IuCisgKiBOb3RpY2UgOiBXZSBzdXBwb3NlIHRoZSBkZWxpbWl0ZXIgaXMgYSBzaW5nbGUtY2hhciBzdHJpbmcoZm9yIGV4YW1wbGUgOiAiOyIpLgorICovCitJTlQgZGVsaW1pdGNudChjaGFyICogcyxjb25zdCBjaGFyICogY3QpCit7CisJSU5UIGNvdW50ID0gMDsKKwkvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCisJY29uc3QgY2hhciAqdG9rZW4gPSBzOworCisJZm9yICggOzsgKQorCXsKKwkJdG9rZW4gPSBzdHJwYnJrKHRva2VuLCBjdCk7IC8qIHNlYXJjaCBmb3IgZGVsaW1pdGVycyAqLworCisgICAgICAgIGlmICggdG9rZW4gPT0gTlVMTCApCisJCXsKKwkJCS8qIGFkdmFuY2VkIHRvIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciAqLworCQkJYnJlYWs7CisJCX0KKwkJLyogc2tpcCB0aGUgZGVsaW1pdGVyICovCisJICAgICsrdG9rZW47CisKKwkJLyoKKwkJICogUHJpbnQgdGhlIGZvdW5kIHRleHQ6IHVzZSBsZW4gd2l0aCAlLipzIHRvIHNwZWNpZnkgZmllbGQgd2lkdGguCisJCSAqLworCisJCS8qIGFjY3VtdWxhdGUgZGVsaW1pdGVyIGNvdW50ICovCisJICAgICsrY291bnQ7CisJfQorICAgIHJldHVybiBjb3VudDsKK30KKworLyoKKyAgKiBjb252ZXJ0cyB0aGUgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGZyb20gdGhlIHN0YW5kYXJkIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24KKyAgKiBpbnRvIGJpbmFyeSBkYXRhLgorICAqIHJldHVybnMgbm9uemVybyBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgemVybyBpZiBub3QuCisgICovCitpbnQgcnRpbmV0X2F0b24oY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgCXZhbDsKKwlpbnQgICAgICAgICAJYmFzZSwgbjsKKwljaGFyICAgICAgICAJYzsKKwl1bnNpZ25lZCBpbnQgICAgcGFydHNbNF07CisJdW5zaWduZWQgaW50ICAgICpwcCA9IHBhcnRzOworCisJZm9yICg7OykKKyAgICB7CisgICAgICAgICAvKgorICAgICAgICAgICogQ29sbGVjdCBudW1iZXIgdXAgdG8gYGAuJycuCisgICAgICAgICAgKiBWYWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBmb3IgQzoKKyAgICAgICAgICAqCTB4PWhleCwgMD1vY3RhbCwgb3RoZXI9ZGVjaW1hbC4KKyAgICAgICAgICAqLworICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgIGJhc2UgPSAxMDsKKyAgICAgICAgIGlmICgqY3AgPT0gJzAnKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmICgqKytjcCA9PSAneCcgfHwgKmNwID09ICdYJykKKyAgICAgICAgICAgICAgICAgYmFzZSA9IDE2LCBjcCsrOworICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgICB9CisgICAgICAgICB3aGlsZSAoKGMgPSAqY3ApICE9ICdcMCcpCisgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCAqIGJhc2UpICsgKGMgLSAnMCcpOworICAgICAgICAgICAgICAgICBjcCsrOworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYgKGJhc2UgPT0gMTYgJiYgaXN4ZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICAoYyArIDEwIC0gKGlzbG93ZXIoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSk7CisgICAgICAgICAgICAgICAgIGNwKys7CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgqY3AgPT0gJy4nKQorICAgICAgICAgeworICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICogSW50ZXJuZXQgZm9ybWF0OiBhLmIuYy5kIGEuYi5jICAgKHdpdGggYyB0cmVhdGVkIGFzIDE2LWJpdHMpCisgICAgICAgICAgICAgICogYS5iICAgICAod2l0aCBiIHRyZWF0ZWQgYXMgMjQgYml0cykKKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBpZiAocHAgPj0gcGFydHMgKyAzIHx8IHZhbCA+IDB4ZmYpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICpwcCsrID0gdmFsLCBjcCsrOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgLyoKKyAgICAgICogQ2hlY2sgZm9yIHRyYWlsaW5nIGp1bmsuCisgICAgICAqLworICAgICB3aGlsZSAoKmNwKQorICAgICAgICAgaWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqY3ArKykpCisgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgLyoKKyAgICAgICogQ29uY29jdCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBwYXJ0cyBzcGVjaWZpZWQuCisgICAgICAqLworICAgICBuID0gcHAgLSBwYXJ0cyArIDE7CisgICAgIHN3aXRjaCAobikKKyAgICAgeworCisgICAgICAgICBjYXNlIDE6ICAgICAgICAgLyogYSAtLSAzMiBiaXRzICovCisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMjogICAgICAgICAvKiBhLmIgLS0gOC4yNCBiaXRzICovCisgICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZmZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gcGFydHNbMF0gPDwgMjQ7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgMzogICAgICAgICAvKiBhLmIuYyAtLSA4LjguMTYgYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmYpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KTsKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSA0OiAgICAgICAgIC8qIGEuYi5jLmQgLS0gOC44LjguOCBiaXRzICovCisgICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmYpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KSB8IChwYXJ0c1syXSA8PCA4KTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgICphZGRyID0gaHRvbmwodmFsKTsKKyAgICAgcmV0dXJuIDE7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEZpbmQga2V5IHNlY3Rpb24gZm9yIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleSBzZWN0aW9uCisgICAgICAgIHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzZWNpb24gdG8gYmUgZmluZAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgRmFpbAorICAgICAgICBPdGhlcnMgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1BVQ0hBUiAgUlRNUEZpbmRTZWN0aW9uKAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKK3sKKyAgICBDSEFSIHRlbXBfYnVmWzMyXTsKKyAgICBQVUNIQVIgIHB0cjsKKworICAgIHN0cmNweSh0ZW1wX2J1ZiwgIkRlZmF1bHQiKTsKKworICAgIGlmKChwdHIgPSBydHN0cnN0cihidWZmZXIsIHRlbXBfYnVmKSkgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAocHRyK3N0cmxlbigiXG4iKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKKyAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKK3sKKyAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKKyAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKKyAgICBDSEFSICpzdGFydF9wdHI7CisgICAgQ0hBUiAqZW5kX3B0cjsKKyAgICBDSEFSICpwdHI7CisgICAgQ0hBUiAqb2Zmc2V0ID0gMDsKKyAgICBJTlQgIGxlbjsKKworCS8vdGVtcF9idWYxID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCS8vdGVtcF9idWYyID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworCX0KKworICAgIC8vZmluZCBzZWN0aW9uCisgICAgaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOworCisgICAgLy9zZWFyY2gga2V5CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7CisgICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCisgICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7CisKKyAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOworICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKKyAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKKyAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOworICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOworICAgIHB0ciA9IHRlbXBfYnVmMjsKKyAgICAvL3RyaW0gc3BhY2Ugb3IgdGFiCisgICAgd2hpbGUoKnB0ciAhPSAweDAwKQorICAgIHsKKyAgICAgICAgaWYoICgqcHRyID09ICcgJykgfHwgKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGVuID0gc3RybGVuKHB0cik7CisgICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKKyAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOworCisJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKKyAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKS4KKyAgICAgICAgSXQgaXMgY2FsbGVkIGZvciBwYXJzaW5nIFNTSUQgYW5kIGFueSBrZXkgc3RyaW5nLgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoCisgICAgSU4gIFBDSEFSICAga2V5LAorICAgIE9VVCBQQ0hBUiAgIGRlc3QsCisgICAgSU4gIElOVCAgICAgZGVzdHNpemUsCisgICAgSU4gIFBDSEFSICAgYnVmZmVyKQoreworICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOworICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOworICAgIENIQVIgKnN0YXJ0X3B0cjsKKyAgICBDSEFSICplbmRfcHRyOworICAgIENIQVIgKnB0cjsKKyAgICBDSEFSICpvZmZzZXQgPSAwOworICAgIElOVCAgbGVuOworCisJLy90ZW1wX2J1ZjEgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJaWYodGVtcF9idWYxID09IE5VTEwpCisgICAgICAgIHJldHVybiAoRkFMU0UpOworCisJLy90ZW1wX2J1ZjIgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisJfQorCisgICAgLy9maW5kIHNlY3Rpb24KKyAgICBpZigob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCisgICAgeworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7CisKKyAgICAvL3NlYXJjaCBrZXkKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKKyAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKKyAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKKworICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7CisgICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOworICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOworICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7CisgICAgcHRyID0gdGVtcF9idWYyOworCisgICAgLy90cmltIHRhYgorICAgIC8qIFdlIGNhbm5vdCB0cmltIHNwYWNlKCcgJykgZm9yIFNTSUQgYW5kIGtleSBzdHJpbmcuICovCisgICAgd2hpbGUoKnB0ciAhPSAweDAwKQorICAgIHsKKyAgICAgICAgLy9pZiggKCpwdHIgPT0gJyAnKSB8fCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgIGlmKCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOworICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7CisKKwlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgbXVsdGlwbGUga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZworICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgorICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcworICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAorCisgICAgTm90ZToKKyAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXJXaXRoT2Zmc2V0KAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIE9VVAlVU0hPUlQJKmVuZF9vZmZzZXQsCisgICAgSU4gIElOVCAgICAgZGVzdHNpemUsCisgICAgSU4gIFBDSEFSICAgYnVmZmVyLAorICAgIElOCUJPT0xFQU4JYlRyaW1TcGFjZSkKK3sKKyAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKKyAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKKyAgICBDSEFSICpzdGFydF9wdHI7CisgICAgQ0hBUiAqZW5kX3B0cjsKKyAgICBDSEFSICpwdHI7CisgICAgQ0hBUiAqb2Zmc2V0ID0gMDsKKyAgICBJTlQgIGxlbjsKKworCWlmICgqZW5kX29mZnNldCA+PSBNQVhfSU5JX0JVRkZFUl9TSVpFKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJaWYodGVtcF9idWYxID09IE5VTEwpCisgICAgICAgIHJldHVybiAoRkFMU0UpOworCisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJaWYodGVtcF9idWYyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKwl9CisKKyAgICAvL2ZpbmQgc2VjdGlvbgorCWlmKCplbmRfb2Zmc2V0ID09IDApCisgICAgeworCQlpZiAoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQorCQl7CisJCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworCSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAJICAgIHJldHVybiAoRkFMU0UpOworCQl9CisgICAgfQorCWVsc2UKKwkJb2Zmc2V0ID0gYnVmZmVyICsgKCplbmRfb2Zmc2V0KTsKKworICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKKworICAgIC8vc2VhcmNoIGtleQorICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOworICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQorICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOworCisgICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisJKmVuZF9vZmZzZXQgPSBlbmRfcHRyIC0gYnVmZmVyOworCisgICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKKyAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7CisgICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7CisgICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKKyAgICBwdHIgPSB0ZW1wX2J1ZjI7CisgICAgLy90cmltIHNwYWNlIG9yIHRhYgorICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIGlmKChiVHJpbVNwYWNlICYmICgqcHRyID09ICcgJykpIHx8ICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbiA9IHN0cmxlbihwdHIpOworICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7CisgICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgaW50IHJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLElOICBjaGFyICpidWZmZXIsSU4gIFVMT05HIEtleVR5cGUsSU4gIElOVCBCU1NJZHgsSU4gIElOVCBLZXlJZHgpCit7CisJUFVDSEFSCQlrZXlidWZmOworCUlOVAkJCWkgPSBCU1NJZHgsIGlkeCA9IEtleUlkeDsKKwlVTE9ORwkJS2V5TGVuOworCVVDSEFSCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisKKwlrZXlidWZmID0gYnVmZmVyOworCUtleUxlbiA9IHN0cmxlbihrZXlidWZmKTsKKworCWlmIChLZXlUeXBlID09IDEpCisJey8vQXNjaWkKKwkJaWYoIChLZXlMZW4gPT0gNSkgfHwgKEtleUxlbiA9PSAxMykpCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5TGVuID0gS2V5TGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXksIGtleWJ1ZmYsIEtleUxlbik7CisJCQlpZiAoS2V5TGVuID09IDUpCisJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSS9GKHJhJWQpIEtleSVkU3RyPSVzIGFuZCB0eXBlPSVzXG4iLCBpLCBpZHgrMSwga2V5YnVmZiwgKEtleVR5cGUgPT0gMCkgPyAiSGV4IjoiQXNjaWkiKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQllbHNlCisJCXsvL0ludmFsaWQga2V5IGxlbmd0aAorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5JWRTdHIgaXMgSW52YWxpZCBrZXkgbGVuZ3RoISBLZXlMZW4gPSAlbGQhXG4iLCBpZHgrMSwgS2V5TGVuKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlCisJey8vSGV4IHR5cGUKKwkJaWYoIChLZXlMZW4gPT0gMTApIHx8IChLZXlMZW4gPT0gMjYpKQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleUxlbiA9IEtleUxlbiAvIDI7CisJCQlBdG9IKGtleWJ1ZmYsIHBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5LCBLZXlMZW4gLyAyKTsKKwkJCWlmIChLZXlMZW4gPT0gMTApCisJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSS9GKHJhJWQpIEtleSVkU3RyPSVzIGFuZCB0eXBlPSVzXG4iLCBpLCBpZHgrMSwga2V5YnVmZiwgKEtleVR5cGUgPT0gMCkgPyAiSGV4IjoiQXNjaWkiKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQllbHNlCisJCXsvL0ludmFsaWQga2V5IGxlbmd0aAorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSS9GKHJhJWQpIEtleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCEgS2V5TGVuID0gJWxkIVxuIiwgaSwgaWR4KzEsIEtleUxlbikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZCBydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIGNoYXIgKnRtcGJ1ZiwgY2hhciAqYnVmZmVyKQoreworCWNoYXIJCXRva19zdHJbMTZdOworCVBVQ0hBUgkJbWFjcHRyOworCUlOVAkJCWkgPSAwLCBpZHg7CisJVUxPTkcJCUtleVR5cGVbTUFYX01CU1NJRF9OVU1dOworCVVMT05HCQlLZXlJZHg7CisKKwlOZGlzWmVyb01lbW9yeShLZXlUeXBlLCBNQVhfTUJTU0lEX05VTSk7CisKKwkvL0RlZmF1bHRLZXlJRAorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRlZmF1bHRLZXlJRCIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCUtleUlkeCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQlpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQorCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEpOworCQkJZWxzZQorCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJRCgwfjMpPSVkXG4iLCBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCisJZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykKKwl7CisJCXNwcmludGYodG9rX3N0ciwgIktleSVkVHlwZSIsIGlkeCArIDEpOworCQkvL0tleTFUeXBlCisJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKHRva19zdHIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQl7CisJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCSAgICB7CisJCQkgICAgS2V5VHlwZVtpXSA9IHNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7CisJCSAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQl7CisJCQkJc3ByaW50Zih0b2tfc3RyLCAiS2V5JWRTdHIiLCBpZHggKyAxKTsKKwkJCQlpZiAoUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKHRva19zdHIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCXsKKwkJCQkJcnRtcF9wYXJzZV9rZXlfYnVmZmVyX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgS2V5VHlwZVtCU1MwXSwgQlNTMCwgaWR4KTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKwl9Cit9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorc3RhdGljIHZvaWQgcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCwgY2hhciAqdG1wYnVmLCBjaGFyICpidWZmZXIpCit7CisJUFVDSEFSCQkJCQltYWNwdHI7CisJSU5UCQkJCQkJaT0wOworCUJPT0xFQU4JCQkJCWJXbW1FbmFibGUgPSBGQUxTRTsKKworCS8vV21tQ2FwYWJsZQorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldtbUNhcGFibGUiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCXsKKwkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAvL0VuYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7CisJCQliV21tRW5hYmxlID0gVFJVRTsKKwkJfQorCQllbHNlIC8vRGlzYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV21tQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwl9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkvL0RMU0NhcGFibGUKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJETFNDYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwl7CisJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlID0gVFJVRTsKKwkJfQorCQllbHNlIC8vRGlzYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IEZBTFNFOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYkRMU0NhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJLy9BY2tQb2xpY3kgZm9yIEFDX0JLLCBBQ19CRSwgQUNfVkksIEFDX1ZPCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQWNrUG9saWN5IiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwl7CisJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQWNrUG9saWN5W2ldID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFja1BvbGljeVslZF09JWRcbiIsIGksIHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSkpOworCQl9CisJfQorCisJaWYgKGJXbW1FbmFibGUpCisJeworCQkvL0FQU0RDYXBhYmxlCisJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RDYXBhYmxlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJeworCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBUUlVFOworCQkJZWxzZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlKSk7CisJCX0KKworCQkvL0FQU0RBQyBmb3IgQUNfQkUsIEFDX0JLLCBBQ19WSSwgQUNfVk8KKwkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQVBTREFDIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwkJeworCQkJQk9PTEVBTiBhcHNkX2FjWzRdOworCisJCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCQl7CisJCQkJYXBzZF9hY1tpXSA9IChCT09MRUFOKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQUMlZCAgJWRcbiIsIGksICBhcHNkX2FjW2ldKSk7CisJCQl9CisKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSBhcHNkX2FjWzBdOworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9IGFwc2RfYWNbMV07CisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJID0gYXBzZF9hY1syXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSBhcHNkX2FjWzNdOworCQl9CisJfQorCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQVUNIQVIJCQkJCXNyYyA9IE5VTEw7CisJc3RydWN0IGZpbGUJCQkJKnNyY2Y7CisJSU5UIAkJCQkJcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQ7CisgICAJbW1fc2VnbWVudF90CQkJb3JnZnM7CisJQ0hBUgkJCQkJKmJ1ZmZlcjsKKwlDSEFSCQkJCQkqdG1wYnVmOworCVVMT05HCQkJCQlSdHNUaHJlc2g7CisJVUxPTkcJCQkJCUZyYWdUaHJlc2g7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUNIQVIJICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJUFVDSEFSCQkJCQltYWNwdHI7CisJSU5UCQkJCQkJaSA9IDA7CisKKwlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZihidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKwl0bXBidWYgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmKHRtcGJ1ZiA9PSBOVUxMKQorCXsKKwkJa2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3JjID0gU1RBX1BST0ZJTEVfUEFUSDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwlzcmMgPSBwQWQtPk1DX0ZpbGVOYW1lOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisJLy8gU2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkvLyBTZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkKKwlvcmdmc3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKKwlvcmdmc2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKKwkvKiBIbSwgY2FuJ3QgcmVhbGx5IGRvIHRoaXMgbmljZWx5IGFueW1vcmUsIHNvIHJlbHkgb24gdGhlc2UgZmlsZXMKKwkgKiBiZWluZyBzZXQgdG8gdGhlIHByb3BlciBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlbS4uLiAqLworCS8qIGN1cnJlbnQtPmNyZWQtPmZzdWlkID0gY3VycmVudC0+Y3JlZC0+ZnNnaWQgPSAwOyAqLworICAgIG9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwlpZiAoc3JjICYmICpzcmMpCisJeworCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZAorCQkJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKKwkJCXsKKwkJCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKKwkJCQlyZXR2YWw9c3JjZi0+Zl9vcC0+cmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUsICZzcmNmLT5mX3Bvcyk7CisJCQkJaWYgKHJldHZhbCA8IDApCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUmVhZCAlcyBlcnJvciAlZFxuIiwgc3JjLCAtcmV0dmFsKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIHNldCBmaWxlIHBhcmFtZXRlciB0byBwb3J0Y2ZnCisJCQkJCS8vQ291bnRyeVJlZ2lvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5UmVnaW9uIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKKwkJCQkJfQorCQkJCQkvL0NvdW50cnlSZWdpb25BQmFuZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5UmVnaW9uQUJhbmQiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlSZWdpb25BQmFuZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7CisJCQkJCX0KKwkJCQkJLy9Db3VudHJ5Q29kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5Q29kZSIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlN0YU9yaUNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCQlpZiAoc3RybGVuKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSAhPSAwKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJDb3VudHJ5RmxhZyA9IFRSVUU7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5Q29kZT0lc1xuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpKTsKKwkJCQkJfQorCQkJCQkvL0NoYW5uZWxHZW9ncmFwaHkKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2hhbm5lbEdlb2dyYXBoeSIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCVVDSEFSIEdlb2dyYXBoeSA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWlmIChHZW9ncmFwaHkgPD0gQk9USCkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBHZW9ncmFwaHk7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPQorCQkJCQkJCQkocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IEJPVEgpID8gJyAnIDogKChwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gSURPUikgPyAnSScgOiAnTycpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQkJcEFkLT5TdGFDZmcuU3RhT3JpR2VvZ3JhcGh5ID0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5OworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsR2VvZ3JhcGh5PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEJPVEg7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVsyXSA9ICcgJzsKKwkJCQkJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9TU0lECisJCQkJCQlpZiAoUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKCJTU0lEIiwgdG1wYnVmLCAyNTYsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKHN0cmxlbih0bXBidWYpIDw9IDMyKQorCQkJCQkJCXsKKwkJCSAJCQkJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoVUNIQVIpIHN0cmxlbih0bXBidWYpOworCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHRtcGJ1ZiwgcEFkLT5Db21tb25DZmcuU3NpZExlbik7CisJCQkJCQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJCQkJCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgdG1wYnVmLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooU1NJRD0lcylcbiIsIF9fRlVOQ1RJT05fXywgdG1wYnVmKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9OZXR3b3JrVHlwZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ldHdvcmtUeXBlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKwkJCQkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkFkaG9jIikgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKwkJCQkJCQllbHNlIC8vRGVmYXVsdCBJbmZyYXN0cnVjdHVyZSBtb2RlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQkJCQkJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+U3RhQ2ZnLkJzc1R5cGUpKTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkvL0NoYW5uZWwKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2hhbm5lbCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJCX0KKwkJCQkJLy9XaXJlbGVzc01vZGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lyZWxlc3NNb2RlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaW50IHZhbHVlICA9IDAsIG1heFBoeU1vZGUgPSBQSFlfMTFHOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCQltYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQkJdmFsdWUgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCisJCQkJCQlpZiAodmFsdWUgPD0gbWF4UGh5TW9kZSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gdmFsdWU7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQaHlNb2RlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgLy9CYXNpY1JhdGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQmFzaWNSYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmFzaWNSYXRlPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwKSk7CisJCQkJCX0KKwkJCQkJLy9CZWFjb25QZXJpb2QKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQmVhY29uUGVyaW9kIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblBlcmlvZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSk7CisJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgLy9UeFBvd2VyCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UG93ZXIiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IChVTE9ORykgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UG93ZXI9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJCQl9CisJCQkJCS8vQkdQcm90ZWN0aW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkJHUHJvdGVjdGlvbiIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vQWx3YXlzIE9uCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjogLy9BbHdheXMgT0ZGCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9BVVRPCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCR1Byb3RlY3Rpb249JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pKTsKKwkJCQkJfQorCQkJCQkvL09MQkNEZXRlY3Rpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGlzYWJsZU9MQkMiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAxOiAvL2Rpc2FibGUgT0xCQyBEZXRlY3Rpb24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDA6IC8vZW5hYmxlIE9MQkMgRGV0ZWN0aW9uCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0ID0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3Q9IDA7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiT0xCQ0RldGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0KSk7CisJCQkJCX0KKwkJCQkJLy9UeFByZWFtYmxlCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UHJlYW1ibGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6CisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UHJlYW1ibGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7CisJCQkJCX0KKwkJCQkJLy9SVFNUaHJlc2hvbGQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUlRTVGhyZXNob2xkIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWlmKCAoUnRzVGhyZXNoID49IDEpICYmIChSdHNUaHJlc2ggPD0gTUFYX1JUU19USFJFU0hPTEQpICkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgID0gKFVTSE9SVClSdHNUaHJlc2g7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUU1RocmVzaG9sZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7CisJCQkJCX0KKwkJCQkJLy9GcmFnVGhyZXNob2xkCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZyYWdUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKworCQkJCQkJaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKKwkJCQkJCXsgLy9pbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCisJCQkJCQl7CisJCQkJCQkJLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGZyYWdtZW50IHNoYWxsIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlciBvZiBvY3RldHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKKwkJCQkJCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCisJCQkJCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7CisJCQkJCQl9CisJCQkJCQkvL3BBZC0+Q29tbW9uQ2ZnLkFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFnVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCQkJCQl9CisJCQkJCS8vVHhCdXJzdAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeEJ1cnN0IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworLy8jaWZkZWYgV0lGSV9URVNUCisvLwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7CisvLyNlbHNlCisJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKy8vI2VuZGlmCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeEJ1cnN0PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOworCQkJCQl9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJCQkJCS8vUGt0QWdncmVnYXRlCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBrdEFnZ3JlZ2F0ZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IFRSVUU7CisJCQkJCQllbHNlIC8vRGlzYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKKyNpZmRlZiBQSUdHWUJBQ0tfU1VQUE9SVAorCQkJCQkJcEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUgPSBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlOworI2VuZGlmIC8vIFBJR0dZQkFDS19TVVBQT1JUIC8vCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQa3RBZ2dyZWdhdGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKKwkJCQkJfQorI2Vsc2UKKwkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOworCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IEZBTFNFOworI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKworCQkJCQkvLyBXbW1DYXBhYmxlCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCQkvL1Nob3J0U2xvdAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJTaG9ydFNsb3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBGQUxTRTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRTbG90PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworCQkJCQl9CisJCQkJCS8vSUVFRTgwMjExSAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJJRUVFODAyMTFIIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkJCQkgICAgeworICAgIAkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisgICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKKyAgICAJCQkJCQllbHNlIC8vRGlzYWJsZQorICAgIAkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IEZBTFNFOworCisgICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUVFRTgwMjExSD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKKwkJCQkJICAgIH0KKwkJCQkJfQorCQkJCQkvL0NTUGVyaW9kCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNTUGVyaW9kIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IDA7CisKKyAgIAkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNTUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCkpOworCQkJCQl9CisKKwkJCQkJLy9SRFJlZ2lvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSRFJlZ2lvbiIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1MyIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTMiLCA3KSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTM7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUF9XNTYiLCA3KSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXBfdzU2IiwgNykgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBKQVBfVzU2OworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJKQVAiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXAiLCAzKSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUDsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlICBpZiAoKHN0cm5jbXAodG1wYnVmLCAiRkNDIiwgMykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiZmNjIiwgMykgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBGQ0M7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSA1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiQ0UiLCAyKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJjZSIsIDIpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7CisJCQkJCQl9CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJEUmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7CisJCQkJCX0KKworCQkJCQkvL1dpcmVsZXNzRXZlbnQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lyZWxlc3NFdmVudCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTUKKwkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCisjZWxzZQorCQkJCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCisjZW5kaWYKKyAgIAkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldpcmVsZXNzRXZlbnQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSk7CisJCQkJCX0KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lGaVRlc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0PSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IDA7CS8vIGRpc2FibGUKKworICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lGaVRlc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkpOworCQkJCQl9CisJCQkJCS8vQXV0aE1vZGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQXV0aE1vZGUiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQkJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3ZXBhdXRvIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAic2hhcmVkIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGFwc2siKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFOT05FIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGFub25lIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYTJwc2siKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQSIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMiIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KEVuY3J5cFR5cGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOworCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisJCQkJCS8vRW5jcnlwVHlwZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJFbmNyeXBUeXBlIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcCIpID09IDApKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgInRraXAiKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkFFUyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiYWVzIikgPT0gMCkpCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKwkJCQkJCQkvLyBVcGRhdGUgYWxsIHdlcHN0YXR1cyByZWxhdGVkCisJCQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlcgkJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQkJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQkJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgCQk9IEZBTFNFOworCisJCQkJCQkJLy9SVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19GVU5DVElPTl9fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZihSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIldQQVBTSyIsIHRtcGJ1ZiwgNTEyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWludCAgICAgZXJyPTA7CisKKwkJCQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0CisKKwkJCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQkpCisJCQkJCQkJeworCQkJCQkJCQllcnIgPSAxOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmICgoc3RybGVuKHRtcGJ1ZikgPj0gOCkgJiYgKHN0cmxlbih0bXBidWYpIDwgNjQpKQorCQkJCQkJCXsKKwkJCQkJCQkJUGFzc3dvcmRIYXNoKChjaGFyICopdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChzdHJsZW4odG1wYnVmKSA9PSA2NCkKKwkJCQkJCQl7CisJCQkJCQkJCUF0b0godG1wYnVmLCBrZXlNYXRlcmlhbCwgMzIpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWVyciA9IDE7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19GVU5DVElPTl9fKSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKGVyciA9PSAwKQorCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCXsKKwkgICAgICAgICAgICAgICAgICAgICAgICAJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJCQkJeworCS8qCisJCQkJCQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEFkLT5TdGFDZmcuUE1LLCBMRU5fVEtJUF9FSyk7CisJCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJCQkJCQkJCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJCQkJCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJKi8KKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCQkJCQkJCQl9CisKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihXUEFQU0s9JXMpXG4iLCBfX0ZVTkNUSU9OX18sIHRtcGJ1ZikpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vRGVmYXVsdEtleUlELCBLZXlUeXBlLCBLZXlTdHIKKwkJCQkJcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUocEFkLCB0bXBidWYsIGJ1ZmZlcik7CisKKworCQkJCQkvL0hTQ291bnRlcgorCQkJCQkvKmlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhTQ291bnRlciIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vRW5hYmxlCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVIU0NvdW50ZXIgPSBUUlVFOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDA6IC8vRGlzYWJsZQorCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVIU0NvdW50ZXIgPSBGQUxTRTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgIkhTQ291bnRlcj0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkVuYWJsZUhTQ291bnRlcik7CisJCQkJCX0qLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCUhUUGFyYW1ldGVyc0hvb2socEFkLCB0bXBidWYsIGJ1ZmZlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwkJCQkJCS8vQ2FycmllckRldGVjdAorCQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2FycmllckRldGVjdCIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICIwIiwgMSkgPT0gMCkpCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisJCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiMSIsIDEpID09IDApKQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FycmllckRldGVjdC5FbmFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9QU01vZGUKKwkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJQU01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJCQkJCQl7CisJCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIk1BWF9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIm1heF9wc3AiKSA9PSAwKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisJCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKwkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc20ocEFkLCBQV1JfU0FWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiRmFzdF9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImZhc3RfcHNwIikgPT0gMCkKKwkJCQkJCQkJCXx8IChzdHJjbXAodG1wYnVmLCAiRkFTVF9QU1AiKSA9PSAwKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisJCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKwkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJMZWdhY3lfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJsZWdhY3lfcHNwIikgPT0gMCkKKwkJCQkJCQkJCXx8IChzdHJjbXAodG1wYnVmLCAiTEVHQUNZX1BTUCIpID09IDApKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKwkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7IC8vRGVmYXVsdCBOZGlzODAyXzExUG93ZXJNb2RlQ0FNCisJCQkJCQkJCQkvLyBjbGVhciBQU00gYml0IGltbWVkaWF0ZWx5CisJCQkJCQkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQkJCQkJCQl9CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTW9kZT0lbGRcbiIsIHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBGYXN0Um9hbWluZworCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZhc3RSb2FtaW5nIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSA9PSAwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcgPSBGQUxTRTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZyA9IFRSVUU7CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGYXN0Um9hbWluZz0lZFxuIiwgcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKSk7CisJCQkJCQl9CisJCQkJCQkvLyBSb2FtVGhyZXNob2xkCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUm9hbVRocmVzaG9sZCIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJbG9uZyBsSW5mbyA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisKKwkJCQkJCQlpZiAobEluZm8gPiA5MCB8fCBsSW5mbyA8IDYwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5kQm1Ub1JvYW0gPSAtNzA7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5kQm1Ub1JvYW0gPSAoQ0hBUikoLTEpKmxJbmZvOworCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUm9hbVRocmVzaG9sZD0lZCAgZEJtXG4iLCBwQWQtPlN0YUNmZy5kQm1Ub1JvYW0pKTsKKwkJCQkJCX0KKworCQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVEduV2lmaVRlc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUR25XaWZpVGVzdD0lZFxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+ICVzIGRvZXMgbm90IGhhdmUgYSB3cml0ZSBtZXRob2RcbiIsIHNyYykpOworCQkJfQorCisJCQlyZXR2YWw9ZmlscF9jbG9zZShzcmNmLE5VTEwpOworCisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKKwkJCX0KKwkJfQorCX0KKworCXNldF9mcyhvcmdmcyk7CisjaWYgMAorCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKyNlbmRpZgorCisJa2ZyZWUoYnVmZmVyKTsKKwlrZnJlZSh0bXBidWYpOworCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIHZvaWQJSFRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkgICpwVmFsdWVTdHIsCisJSU4JQ0hBUgkJICAqcElucHV0KQoreworCisJSU5UIFZhbHVlOworCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1BST1RFQ1QiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFByb3RlY3Rpb24gID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNFbmFibGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QU0VuYWJsZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA+IE1NUFNfRU5BQkxFKQorICAgICAgICB7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzogYWRkIG1pbW8gcG93ZXIgc2F2aW5nIG1lY2hhbmlzbQorICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFMgTW9kZSAgPSAlZFxuIiwgVmFsdWUpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFEZWNsaW5lIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBEZWNsaW5lICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9EaXNhYmxlUmVvcmRlcmluZyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IERpc2FibGVSZW9yZGVyaW5nICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQXV0b0JBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQXV0byBCQSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisJLy8gVHhfK0hUQyBmcmFtZQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9IVEMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIAkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCArSFRDIGZyYW1lID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworCX0KKworCS8vIEVuYWJsZSBIVCBMaW5rIEFkYXB0YXRpb24gQ29udHJvbAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9MaW5rQWRhcHQiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5iTGlua0FkYXB0ID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBMaW5rIEFkYXB0YXRpb24gQ29udHJvbCA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSgrSFRDKSIpKTsKKwl9CisKKwkvLyBSZXZlcnNlIERpcmVjdGlvbiBNZWNoYW5pc20KKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUkRHIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSREcgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7CisJfQorCisKKworCisJLy8gVHggQS1NU1VEID8KKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQU1TRFUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCBBLU1TRFUgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisJfQorCisJLy8gTVBEVSBEZW5zaXR5CisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01wZHVEZW5zaXR5IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlIDw9NyAmJiBWYWx1ZSA+PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBWYWx1ZTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNUERVIERlbnNpdHkgPSAlZFxuIiwgVmFsdWUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IDQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWQgKERlZmF1bHQpXG4iLCA0KSk7CisJCX0KKwl9CisKKwkvLyBNYXggUnggQkEgV2luZG93IFNpemUKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFXaW5TaXplIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPj0xICYmIFZhbHVlIDw9IDY0KQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgV2luZHcgU2l6ZSA9ICVkXG4iLCBWYWx1ZSkpOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSA2NCAoRGVmdWFsdClcbiIpKTsKKwkJfQorCisJfQorCisJLy8gR3VhcmQgSW50ZXJ2YWwKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfR0kiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBHSV80MDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfNDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogR3VhcmQgSW50ZXJ2YWwgPSAlc1xuIiwgKFZhbHVlPT1HSV80MDApID8gIjQwMCIgOiAiODAwIiApKTsKKwl9CisKKwkvLyBIVCBPcGVyYXRpb24gTW9kZSA6IE1peGVkIE1vZGUgLCBHcmVlbiBGaWVsZAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9PcE1vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBIVE1PREVfR0YpCisJCXsKKworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9NTTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBPcGVyYXRlIE1vZGUgPSAlc1xuIiwgKFZhbHVlPT1IVE1PREVfR0YpID8gIkdyZWVuIEZpZWxkIiA6ICJNaXhlZCBNb2RlIiApKTsKKwl9CisKKwkvLyBGaXhlZCBUeCBtb2RlIDogQ0NLLCBPRkRNCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZpeGVkVHhNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVVDSEFSCWZpeF90eF9tb2RlOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCisJCQlpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIk9GRE0iKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJvZmRtIikgPT0gMCkKKwkJCXsKKwkJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9PRkRNOworCQkJfQorCQkJZWxzZSBpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIkNDSyIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImNjayIpID09IDApCisJCQl7CisJCSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfQ0NLOworCQkJfQorCQkJZWxzZSBpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIkhUIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAiaHQiKSA9PSAwKQorCQkJeworCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCQl9CisJCWVsc2UKKwkJeworCQkJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJCQkvLyAxIDogQ0NLCisJCQkJLy8gMiA6IE9GRE0KKwkJCQkvLyBvdGhlcndpc2UgOiBIVAorCQkJCWlmIChWYWx1ZSA9PSBGSVhFRF9UWE1PREVfQ0NLIHx8IFZhbHVlID09IEZJWEVEX1RYTU9ERV9PRkRNKQorCQkJCQlmaXhfdHhfbW9kZSA9IFZhbHVlOworCQkJCWVsc2UKKwkJCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisJCX0KKworCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRml4ZWQgVHggTW9kZSA9ICVkXG4iLCBmaXhfdHhfbW9kZSkpOworCisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCS8vIENoYW5uZWwgV2lkdGgKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQlciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBCV180MCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzQwOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQl9CisKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCXBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZS5maWVsZC5CVyA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IENoYW5uZWwgV2lkdGggPSAlc1xuIiwgKFZhbHVlPT1CV180MCkgPyAiNDAgTUh6IiA6ICIyMCBNSHoiICkpOworCX0KKworCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9FWFRDSEEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBFeHQgQ2hhbm5lbCA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkJFTE9XIiA6ICJBQk9WRSIgKSk7CisJfQorCisJLy8gTVNDCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01DUyIsIHBWYWx1ZVN0ciwgNTAsIHBJbnB1dCkpCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworLy8JCQlpZiAoKFZhbHVlID49IDAgJiYgVmFsdWUgPD0gMTUpIHx8IChWYWx1ZSA9PSAzMikpCisJCQlpZiAoKFZhbHVlID49IDAgJiYgVmFsdWUgPD0gMjMpIHx8IChWYWx1ZSA9PSAzMikpIC8vIDMqMworCQl7CisJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgID0gVmFsdWU7CisJCQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgID0gTUNTX0FVVE87CisJCQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNQ1MgPSBBVVRPXG4iKSk7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gU1RCQworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9TVEJDIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IFNUQkNfVVNFKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFNUQkMgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKKwl9CisKKwkvLyA0MF9NaHpfSW50b2xlcmFudAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF80ME1IWl9JTlRPTEVSQU5UIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogNDBNSFogSU5UT0xFUkFOVCA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQpKTsKKwl9CisJLy9IVF9UeFN0cmVhbQorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1R4U3RyZWFtIiwgcFZhbHVlU3RyLCAxMCwgcElucHV0KSkKKwl7CisJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKSkKKwkJeworCQkJY2FzZSAxOgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6IC8vIDMqMworCQkJZGVmYXVsdDoKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDM7CisKKwkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKKwkJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgdHggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJCWJyZWFrOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuVHhTdHJlYW0pKTsKKwl9CisJLy9IVF9SeFN0cmVhbQorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1J4U3RyZWFtIiwgcFZhbHVlU3RyLCAxMCwgcElucHV0KSkKKwl7CisJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKSkKKwkJeworCQkJY2FzZSAxOgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQlkZWZhdWx0OgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMzsKKworCQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKQorCQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDI7IC8vIG9ubHkgMiByeCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCisJCQkJYnJlYWs7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFJ4IFN0cmVhbSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSkpOworCX0KKworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYTQ3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXAuaApAQCAtMCwwICsxLDc1ODYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRtcC5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGF1bCBMaW4gICAgMjAwMi0wOC0wMSAgICBjcmVhdGVkCisgICAgSmFtZXMgVGFuICAgMjAwMi0wOS0wNiAgICBtb2RpZmllZCAoUmV2aXNlIE5UQ1JlZ1RhYmxlKQorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDktMDYgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAorKi8KKyNpZm5kZWYgX19SVE1QX0hfXworI2RlZmluZSBfX1JUTVBfSF9fCisKKyNpbmNsdWRlICJsaW5rX2xpc3QuaCIKKyNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaW5jbHVkZSAiYWlyb25ldC5oIgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyNkZWZpbmUgREJHCQkxCisKKy8vI2RlZmluZSBEQkdfRElBR05PU0UJCTEKKworI2lmIGRlZmluZWQoQ09ORklHX0FQX1NVUFBPUlQpICYmIGRlZmluZWQoQ09ORklHX1NUQV9TVVBQT1JUKQorI2RlZmluZSBJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9BUChfcEFkKQlpZihfcEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorI2RlZmluZSBJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEoX3BBZCkJaWYoX3BBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisjZWxzZQorI2RlZmluZSBJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9BUChfcEFkKQorI2RlZmluZSBJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEoX3BBZCkKKyNlbmRpZgorCisjZGVmaW5lIFZJUlRVQUxfSUZfSU5DKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KyspCisjZGVmaW5lIFZJUlRVQUxfSUZfREVDKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250LS0pCisjZGVmaW5lIFZJUlRVQUxfSUZfTlVNKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KQorCisjaWZkZWYgUlQyODcwCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGUgVFhfQlVGRkVSIHN0cnVjdHVyZSBmb3JtcyB0aGUgdHJhbnNtaXR0ZWQgVVNCIHBhY2tldCB0byB0aGUgZGV2aWNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit0eXBlZGVmIHN0cnVjdCBfX1RYX0JVRkZFUnsKKwl1bmlvbgl7CisJCVVDSEFSCQkJV2lyZWxlc3NQYWNrZXRbVFhfQlVGRkVSX05PUk1TSVpFXTsKKwkJSEVBREVSXzgwMl8xMQlOdWxsRnJhbWU7CisJCVBTUE9MTF9GUkFNRQlQc1BvbGxQYWNrZXQ7CisJCVJUU19GUkFNRQkJUlRTRnJhbWU7CisJfWZpZWxkOworCVVDSEFSCQkJQWdncmVnYXRpb25bNF07ICAvL0J1ZmZlciBmb3Igc2F2ZSBBZ2dyZWdhdGlvbiBzaXplLgorfSBUWF9CVUZGRVIsICpQVFhfQlVGRkVSOworCit0eXBlZGVmIHN0cnVjdCBfX0hUVFhfQlVGRkVSeworCXVuaW9uCXsKKwkJVUNIQVIJCQlXaXJlbGVzc1BhY2tldFtNQVhfVFhCVUxLX1NJWkVdOworCQlIRUFERVJfODAyXzExCU51bGxGcmFtZTsKKwkJUFNQT0xMX0ZSQU1FCVBzUG9sbFBhY2tldDsKKwkJUlRTX0ZSQU1FCQlSVFNGcmFtZTsKKwl9ZmllbGQ7CisJVUNIQVIJCQlBZ2dyZWdhdGlvbls0XTsgIC8vQnVmZmVyIGZvciBzYXZlIEFnZ3JlZ2F0aW9uIHNpemUuCit9IEhUVFhfQlVGRkVSLCAqUEhUVFhfQlVGRkVSOworCisKKy8vIHVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCB3cml0ZSBpcnBzCit0eXBlZGVmIHN0cnVjdCBfVFhfQ09OVEVYVAoreworCVBWT0lECQkJcEFkOwkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlQVVJCCQkJcFVyYjsJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVBJUlAJCQlwSXJwOwkJCS8vdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIG91dC4KKwkJCQkJCQkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJUFRYX0JVRkZFUgkJVHJhbnNmZXJCdWZmZXI7CS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJVUxPTkcJCQlCdWxrT3V0U2l6ZTsKKwlVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQ7CisJVUNIQVIJCQlTZWxmSWR4OworCUJPT0xFQU4JCQlJblVzZTsKKwlCT09MRUFOCQkJYldhaXRpbmdCdWxrT3V0OyAvLyBhdCBsZWFzdCBvbmUgcGFja2V0IGlzIGluIHRoaXMgVHhDb250ZXh0LCByZWFkeSBmb3IgbWFraW5nIElSUCBhbnl0aW1lLgorCUJPT0xFQU4JCQliRnVsbEZvckJ1bGtPdXQ7IC8vIGFsbCB0eCBidWZmZXIgYXJlIGZ1bGwgLCBzbyB3YWl0aW5nIGZvciB0eCBidWxrb3V0LgorCUJPT0xFQU4JCQlJUlBQZW5kaW5nOworCUJPT0xFQU4JCQlMYXN0T25lOworCUJPT0xFQU4JCQliQWdncmVnYXRpYmxlOworCVVDSEFSCQkJSGVhZGVyXzgwMl8zW0xFTkdUSF84MDJfM107CisJVUNIQVIJCQlSc3ZbMl07CisJVUxPTkcJCQlEYXRhT2Zmc2V0OworCVVJTlQJCQlUeFJhdGU7CisJZG1hX2FkZHJfdAkJZGF0YV9kbWE7CQkvLyB1cmIgZG1hIG9uIGxpbnV4CisKK30JVFhfQ09OVEVYVCwgKlBUWF9DT05URVhULCAqKlBQVFhfQ09OVEVYVDsKKworCisvLyB1c2VkIHRvIHRyYWNrIGRyaXZlci1nZW5lcmF0ZWQgd3JpdGUgaXJwcwordHlwZWRlZiBzdHJ1Y3QgX0hUX1RYX0NPTlRFWFQKK3sKKwlQVk9JRAkJCXBBZDsJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJUFVSQgkJCXBVcmI7CQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlQSVJQCQkJcElycDsJCQkvL3VzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBvdXQuCisJCQkJCQkJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVBIVFRYX0JVRkZFUglUcmFuc2ZlckJ1ZmZlcjsJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlVTE9ORwkJCUJ1bGtPdXRTaXplOwkvLyBJbmRpY2F0ZSB0aGUgdG90YWwgYnVsay1vdXQgc2l6ZSBpbiBieXRlcyBpbiBvbmUgYnVsay10cmFuc21pc3Npb24KKwlVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQ7CisJQk9PTEVBTgkJCUlSUFBlbmRpbmc7CisJQk9PTEVBTgkJCUxhc3RPbmU7CisJQk9PTEVBTgkJCWJDdXJXcml0aW5nOworCUJPT0xFQU4JCQliUmluZ0VtcHR5OworCUJPT0xFQU4JCQliQ29weVNhdmVQYWQ7CisJVUNIQVIJCQlTYXZlZFBhZFs4XTsKKwlVQ0hBUgkJCUhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOworCVVMT05HCQkJQ3VyV3JpdGVQb3NpdGlvbjsJCS8vIEluZGljYXRlIHRoZSBidWZmZXIgb2Zmc2V0IHdoaWNoIHBhY2tldCB3aWxsIGJlIGluc2VydGVkIHN0YXJ0IGZyb20uCisJVUxPTkcJCQlDdXJXcml0ZVJlYWxQb3M7CQkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIG9mZnNldCB3aGljaCBwYWNrZXQgbm93IGFyZSB3cml0aW5nIHRvLgorCVVMT05HCQkJTmV4dEJ1bGtPdXRQb3NpdGlvbjsJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBzdGFydCBvZmZzZXQgb2YgYSBidWxrLXRyYW5zbWlzc2lvbgorCVVMT05HCQkJRU5leHRCdWxrT3V0UG9zaXRpb247CS8vIEluZGljYXRlIHRoZSBidWZmZXIgZW5kIG9mZnNldCBvZiBhIGJ1bGstdHJhbnNtaXNzaW9uCisJVUlOVAkJCVR4UmF0ZTsKKwlkbWFfYWRkcl90CQlkYXRhX2RtYTsJCS8vIHVyYiBkbWEgb24gbGludXgKK30JSFRfVFhfQ09OVEVYVCwgKlBIVF9UWF9DT05URVhULCAqKlBQSFRfVFhfQ09OVEVYVDsKKworCisvLworLy8gU3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgcmVjZWl2ZSBwYWNrZXRzIGFuZCBidWZmZXJzIHRvIGluZGljYXRlCisvLyByZWNlaXZlIGRhdGEgdG8gdGhlIHByb3RvY29sLgorLy8KK3R5cGVkZWYgc3RydWN0IF9SWF9DT05URVhUCit7CisJUFVDSEFSCQkJCVRyYW5zZmVyQnVmZmVyOworCVBWT0lECQkJCXBBZDsKKwlQSVJQCQkJCXBJcnA7Ly91c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgaW4uCisJUFVSQgkJCQlwVXJiOworCS8vVGhlc2UgMiBCb29sZWFuIHNob3VsZG4ndCBib3RoIGJlIDEgYXQgdGhlIHNhbWUgdGltZS4KKwlVTE9ORwkJCQlCdWxrSW5PZmZzZXQ7CS8vIG51bWJlciBvZiBwYWNrZXRzIHdhaXRpbmcgZm9yIHJlb3JkZXJpbmcgLgorLy8JQk9PTEVBTgkJCQlSZW9yZGVySW5Vc2U7CS8vIEF0IGxlYXN0IG9uZSBwYWNrZXQgaW4gdGhpcyBidWZmZXIgYXJlIGluIHJlb3JkZXJpbmcgYnVmZmVyIGFuZCB3YWl0IGZvciByZWNlaXZlIGluZGljYXRpb24KKwlCT09MRUFOCQkJCWJSeEhhbmRsaW5nOwkvLyBOb3RpZnkgdGhpcyBwYWNrZXQgaXMgYmVpbmcgcHJvY2VzcyBub3cuCisJQk9PTEVBTgkJCQlJblVzZTsJCQkvLyBVU0IgSGFyZHdhcmUgT2NjdXBpZWQuIFdhaXQgZm9yIFVTQiBIVyB0byBwdXQgcGFja2V0LgorCUJPT0xFQU4JCQkJUmVhZGFibGU7CQkvLyBSZWNlaXZlIENvbXBsZXRlIGJhY2suIE9LIGZvciBkcml2ZXIgdG8gaW5kaWNhdGUgcmVjZWl2aW5nIHBhY2tldC4KKwlCT09MRUFOCQkJCUlSUFBlbmRpbmc7CQkvLyBUT0RPOiBUbyBiZSByZW1vdmVkCisJYXRvbWljX3QJCQlJcnBMb2NrOworCU5ESVNfU1BJTl9MT0NLCQlSeENvbnRleHRMb2NrOworCWRtYV9hZGRyX3QJCQlkYXRhX2RtYTsJCS8vIHVyYiBkbWEgb24gbGludXgKK30JUlhfQ09OVEVYVCwgKlBSWF9DT05URVhUOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8vCisvLyAgTkRJUyBWZXJzaW9uIGRlZmluaXRpb25zCisvLworI2lmZGVmICBORElTNTBfTUlOSVBPUlQKKyNkZWZpbmUgUlRNUF9ORElTX01BSk9SX1ZFUlNJT04gICAgIDUKKyNkZWZpbmUgUlRNUF9ORElTX01JTk9SX1ZFUlNJT04gICAgIDAKKyNlbmRpZgorCisjaWZkZWYgIE5ESVM1MV9NSU5JUE9SVAorI2RlZmluZSBSVE1QX05ESVNfTUFKT1JfVkVSU0lPTiAgICAgNQorI2RlZmluZSBSVE1QX05ESVNfTUlOT1JfVkVSU0lPTiAgICAgMQorI2VuZGlmCisKK2V4dGVybiAgY2hhciAgICBOSUNfVkVORE9SX0RFU0NbXTsKK2V4dGVybiAgaW50ICAgICBOSUNfVkVORE9SX0RFU0NfTEVOOworCitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBTTkFQX0FJUk9ORVRbXTsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ2lzY29DQ0tNW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKK2V4dGVybgl1bnNpZ25lZCBjaGFyCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRbXTsKK2V4dGVybgl1bnNpZ25lZCBjaGFyCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRMZW47CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNDWFRraXBbXTsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ0NYVGtpcExlbjsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENJU0NPX09VSVtdOworZXh0ZXJuICBVQ0hBUglCYVNpemVBcnJheVs0XTsKKworZXh0ZXJuIFVDSEFSIEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gVUNIQVIgTVVMVElDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKK2V4dGVybiBVQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gVUxPTkcgQklUMzJbMzJdOworZXh0ZXJuIFVDSEFSIEJJVDhbOF07CitleHRlcm4gY2hhciogQ2lwaGVyTmFtZVtdOworZXh0ZXJuIGNoYXIqIE1DU1RvTWJwc1tdOworZXh0ZXJuIFVDSEFSCSBSeHdpTUNTVG9PZmRtUmF0ZVsxMl07CitleHRlcm4gVUNIQVIgU05BUF84MDJfMUhbNl07CitleHRlcm4gVUNIQVIgU05BUF9CUklER0VfVFVOTkVMWzZdOworZXh0ZXJuIFVDSEFSIFNOQVBfQUlST05FVFs4XTsKK2V4dGVybiBVQ0hBUiBDS0lQX0xMQ19TTkFQWzhdOworZXh0ZXJuIFVDSEFSIEVBUE9MX0xMQ19TTkFQWzhdOworZXh0ZXJuIFVDSEFSIEVBUE9MWzJdOworZXh0ZXJuIFVDSEFSIElQWFsyXTsKK2V4dGVybiBVQ0hBUiBBUFBMRV9UQUxLWzJdOworZXh0ZXJuIFVDSEFSIFJhdGVJZFRvUGxjcFNpZ25hbFsxMl07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKK2V4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKK2V4dGVybiBVQ0hBUiBPZmRtU2lnbmFsVG9SYXRlSWRbMTZdIDsKK2V4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWluWzRdOworZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtYXhbNF07CitleHRlcm4gVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bNF07CitleHRlcm4gVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XTsKKworZXh0ZXJuIFVTSE9SVCBSYXRlVXBQRVJbXTsKK2V4dGVybiBVU0hPUlQgUmF0ZURvd25QRVJbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIENIQVIgICBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW107CitleHRlcm4gVUNIQVIgIFJhdGVJZFRvTWJwc1tdOworZXh0ZXJuIFVTSE9SVCBSYXRlSWRUbzUwMEticHNbXTsKKworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW107CitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBMZW47CisKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzW107CitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc0xlbjsKKworZXh0ZXJuIFVDSEFSICBTc2lkSWU7CitleHRlcm4gVUNIQVIgIFN1cFJhdGVJZTsKK2V4dGVybiBVQ0hBUiAgRXh0UmF0ZUllOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitleHRlcm4gVUNIQVIgIEh0Q2FwSWU7CitleHRlcm4gVUNIQVIgIEFkZEh0SW5mb0llOworZXh0ZXJuIFVDSEFSICBOZXdFeHRDaGFuSWU7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworZXh0ZXJuIFVDSEFSICBFeHRIdENhcEllOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworZXh0ZXJuIFVDSEFSICBFcnBJZTsKK2V4dGVybiBVQ0hBUiAgRHNJZTsKK2V4dGVybiBVQ0hBUiAgVGltSWU7CitleHRlcm4gVUNIQVIgIFdwYUllOworZXh0ZXJuIFVDSEFSICBXcGEySWU7CitleHRlcm4gVUNIQVIgIElic3NJZTsKK2V4dGVybiBVQ0hBUiAgQ2N4MkllOworCitleHRlcm4gVUNIQVIgIFdQQV9PVUlbXTsKK2V4dGVybiBVQ0hBUiAgUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSICBXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIgIFdNRV9QQVJNX0VMRU1bXTsKK2V4dGVybiBVQ0hBUiAgQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUiAgQ2N4MkllSW5mb1tdOworZXh0ZXJuIFVDSEFSICBSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIgIFBvd2VyQ29uc3RyYWludElFW107CisKKworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGVbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExR1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHW107CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFtdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4xU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4yU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW107CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK2V4dGVybiBVQ0hBUiAgUFJFX05fSFRfT1VJW107CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNkZWZpbmUJTUFYU0VRCQkoMHhGRkYpCisKKyNpZmRlZiBSQUxJTktfQVRFCit0eXBlZGVmCXN0cnVjdCBfQVRFX0lORk8geworCVVDSEFSCU1vZGU7CisJQ0hBUglUeFBvd2VyMDsKKwlDSEFSCVR4UG93ZXIxOworCUNIQVIgICAgVHhBbnRlbm5hU2VsOworCUNIQVIgICAgUnhBbnRlbm5hU2VsOworCVRYV0lfU1RSVUMgIFR4V0k7IAkgIC8vIFRYV0kKKwlVU0hPUlQJUUlEOworCVVDSEFSCUFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIJQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglBZGRyM1tNQUNfQUREUl9MRU5dOworCVVDSEFSCUNoYW5uZWw7CisJVUlOVDMyCVR4TGVuZ3RoOworCVVJTlQzMglUeENvdW50OworCVVJTlQzMglUeERvbmVDb3VudDsgLy8gVHggRE1BIERvbmUKKwlVSU5UMzIJUkZGcmVxT2Zmc2V0OworCUJPT0xFQU4JYlJ4RmVyOworCUJPT0xFQU4JYlFBVHhTdGFydDsgLy8gSGF2ZSBjb21waWxlZCBRQSBpbiBhbmQgdXNlIGl0IHRvIEFURSB0eC4KKwlCT09MRUFOCWJRQVJ4U3RhcnQ7CS8vIEhhdmUgY29tcGlsZWQgUUEgaW4gYW5kIHVzZSBpdCB0byBBVEUgcnguCisJVUlOVDMyCVJ4VG90YWxDbnQ7CisJVUlOVDMyCVJ4Q250UGVyU2VjOworCisJQ0hBUglMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIKKwlDSEFSICAgIExhc3RTTlIxOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFNOUiBmb3IgMm5kICBhbnRlbm5hCisJQ0hBUiAgICBMYXN0UnNzaTA7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUiAgICBMYXN0UnNzaTE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAybmQgIGFudGVubmEKKwlDSEFSICAgIExhc3RSc3NpMjsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kgZm9yIDNyZCAgYW50ZW5uYQorCUNIQVIgICAgQXZnUnNzaTA7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCUNIQVIgICAgQXZnUnNzaTE7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCUNIQVIgICAgQXZnUnNzaTI7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCVNIT1JUICAgQXZnUnNzaTBYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCisJU0hPUlQgICBBdmdSc3NpMVg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKKwlTSE9SVCAgIEF2Z1Jzc2kyWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQorCisJVUlOVDMyCU51bU9mQXZnUnNzaVNhbXBsZTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJLy8gVHggZnJhbWUKKyNpZmRlZiBSVDI4NzAKKwkvKiBub3QgdXNlZCBpbiBSVDI4NjAgKi8KKwlUWElORk9fU1RSVUMJCVR4SW5mbzsgLy8gVHhJbmZvCisjZW5kaWYgLy8gUlQyODcwIC8vCisJVVNIT1JUCQlITGVuOyAvLyBIZWFkZXIgTGVuZ3RoCisJVVNIT1JUCQlQTGVuOyAvLyBQYXR0ZXJuIExlbmd0aAorCVVDSEFSIAkJSGVhZGVyWzMyXTsgLy8gSGVhZGVyIGJ1ZmZlcgorCVVDSEFSCQlQYXR0ZXJuWzMyXTsgLy8gUGF0dGVybiBidWZmZXIKKwlVU0hPUlQJCURMZW47IC8vIERhdGEgTGVuZ3RoCisJVVNIT1JUCQlzZXE7CisJVUlOVDMyCQlDSUQ7CisJVEhSRUFEX1BJRCAJCUF0ZVBpZDsKKwkvLyBjb3VudGVycworCVVJTlQzMgkJVTJNOworCVVJTlQzMgkJT3RoZXJEYXRhOworCVVJTlQzMgkJQmVhY29uOworCVVJTlQzMgkJT3RoZXJDb3VudDsKKwlVSU5UMzIJCVR4QWMwOworCVVJTlQzMgkJVHhBYzE7CisJVUlOVDMyCQlUeEFjMjsKKwlVSU5UMzIJCVR4QWMzOworCVVJTlQzMgkJVHhIQ0NBOworCVVJTlQzMgkJVHhNZ210OworCVVJTlQzMgkJUlNTSTA7CisJVUlOVDMyCQlSU1NJMTsKKwlVSU5UMzIJCVJTU0kyOworCVVJTlQzMgkJU05SMDsKKwlVSU5UMzIJCVNOUjE7CisJLy8gY29udHJvbAorCS8vVUlOVDMyCQlSZXBlYXQ7IC8vIFR4IENwdSBjb3VudAorCVVDSEFSCQlUeFN0YXR1czsgLy8gdGFzayBUeCBzdGF0dXMgLy8gMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworfQlBVEVfSU5GTywgKlBBVEVfSU5GTzsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCitzdHJ1Y3QgYXRlX3JhY2ZnaGRyIHsKKyAJVUlOVDMyCQltYWdpY19ubzsKKwlVU0hPUlQJCWNvbW1hbmRfdHlwZTsKKwlVU0hPUlQJCWNvbW1hbmRfaWQ7CisJVVNIT1JUCQlsZW5ndGg7CisJVVNIT1JUCQlzZXF1ZW5jZTsKKwlVU0hPUlQJCXN0YXR1czsKKwlVQ0hBUgkJZGF0YVsyMDQ2XTsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1Cit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbmV4dDsKKwlQTkRJU19QQUNLRVQJCQlwUGFja2V0OwkJLyogY292ZXJ0ZWQgdG8gODAyLjMgZnJhbWUgKi8KKwlpbnQJCQkJCQlTZXF1ZW5jZTsJCS8qIHNlcXVlbmNlIG51bWJlciBvZiBNUERVICovCisJQk9PTEVBTgkJCQkJYkFNU0RVOworfTsKKworc3RydWN0IHJlb3JkZXJpbmdfbGlzdAoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm5leHQ7CisJaW50IAlxbGVuOworfTsKKworc3RydWN0IHJlb3JkZXJpbmdfbXBkdV9wb29sCit7CisJUFZPSUQJCQkJCW1lbTsKKwlORElTX1NQSU5fTE9DSwkJCWxvY2s7CisJc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAJZnJlZWxpc3Q7Cit9OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCAJX1JTU0lfU0FNUExFIHsKKwlDSEFSCQkJTGFzdFJzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKKwlDSEFSCQkJTGFzdFJzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKKwlDSEFSCQkJTGFzdFJzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKKwlDSEFSCQkJQXZnUnNzaTA7CisJQ0hBUgkJCUF2Z1Jzc2kxOworCUNIQVIJCQlBdmdSc3NpMjsKKwlTSE9SVAkJCUF2Z1Jzc2kwWDg7CisJU0hPUlQJCQlBdmdSc3NpMVg4OworCVNIT1JUCQkJQXZnUnNzaTJYODsKK30gUlNTSV9TQU1QTEU7CisKKy8vCisvLyAgUXVldWUgc3RydWN0dXJlIGFuZCBtYWNyb3MKKy8vCit0eXBlZGVmIHN0cnVjdCAgX1FVRVVFX0VOVFJZICAgIHsKKwlzdHJ1Y3QgX1FVRVVFX0VOVFJZICAgICAqTmV4dDsKK30gICBRVUVVRV9FTlRSWSwgKlBRVUVVRV9FTlRSWTsKKworLy8gUXVldWUgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCAgX1FVRVVFX0hFQURFUiAgIHsKKwlQUVVFVUVfRU5UUlkgICAgSGVhZDsKKwlQUVVFVUVfRU5UUlkgICAgVGFpbDsKKwlVTE9ORyAgICAgICAgICAgTnVtYmVyOworfSAgIFFVRVVFX0hFQURFUiwgKlBRVUVVRV9IRUFERVI7CisKKyNkZWZpbmUgSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKFF1ZXVlSGVhZGVyKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgIFwKKwkoUXVldWVIZWFkZXIpLT5OdW1iZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFJlbW92ZUhlYWRRdWV1ZShRdWV1ZUhlYWRlcikgICAgICAgICAgICAgICAgXAorKFF1ZXVlSGVhZGVyKS0+SGVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJUFFVRVVFX0VOVFJZIHBOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICgoUXVldWVIZWFkZXIpLT5IZWFkICE9IE5VTEwpCQkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlwTmV4dCA9IChRdWV1ZUhlYWRlciktPkhlYWQtPk5leHQ7ICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IHBOZXh0OyAgICAgICAgICAgICAgICBcCisJCWlmIChwTmV4dCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IE5VTEw7ICAgICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyLS07ICAgICAgICAgICAgICAgICAgICBcCisJfQkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBJbnNlcnRIZWFkUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoKFBRVUVVRV9FTlRSWSlRdWV1ZUVudHJ5KS0+TmV4dCA9IChRdWV1ZUhlYWRlciktPkhlYWQ7IFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICBcCisJCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgSW5zZXJ0VGFpbFF1ZXVlKFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPlRhaWwtPk5leHQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgXAorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICBcCisJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICAgICAgXAorCShRdWV1ZUhlYWRlciktPk51bWJlcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8KKy8vICBNYWNyb3MgZm9yIGZsYWcgYW5kIHJlZiBjb3VudCBvcGVyYXRpb25zCisvLworI2RlZmluZSBSVE1QX1NFVF9GTEFHKF9NLCBfRikgICAgICAgKChfTSktPkZsYWdzIHw9IChfRikpCisjZGVmaW5lIFJUTVBfQ0xFQVJfRkxBRyhfTSwgX0YpICAgICAoKF9NKS0+RmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIFJUTVBfQ0xFQVJfRkxBR1MoX00pICAgICAgICAoKF9NKS0+RmxhZ3MgPSAwKQorI2RlZmluZSBSVE1QX1RFU1RfRkxBRyhfTSwgX0YpICAgICAgKCgoX00pLT5GbGFncyAmIChfRikpICE9IDApCisjZGVmaW5lIFJUTVBfVEVTVF9GTEFHUyhfTSwgX0YpICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgPT0gKF9GKSkKKworI2RlZmluZSBPUFNUQVRVU19TRVRfRkxBRyhfcEFkLCBfRikgICAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIE9QU1RBVFVTX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIE9QU1RBVFVTX1RFU1RfRkxBRyhfcEFkLCBfRikgICAgKCgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzICYgKF9GKSkgIT0gMCkKKworI2RlZmluZSBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKF9wRW50cnksX0YpICAgICAgKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKF9wRW50cnksX0YpICAgICgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzICY9IH4oX0YpKQorI2RlZmluZSBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhfcEVudHJ5LF9GKSAgICAgKCgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzICYgKF9GKSkgIT0gMCkKKworI2RlZmluZSBSWF9GSUxURVJfU0VUX0ZMQUcoX3BBZCwgX0YpICAgICgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgfD0gKF9GKSkKKyNkZWZpbmUgUlhfRklMVEVSX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyICY9IH4oX0YpKQorI2RlZmluZSBSWF9GSUxURVJfVEVTVF9GTEFHKF9wQWQsIF9GKSAgICgoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyICYgKF9GKSkgIT0gMCkKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBTVEFfTk9fU0VDVVJJVFlfT04oX3ApICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorI2RlZmluZSBTVEFfV0VQX09OKF9wKSAgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorI2RlZmluZSBTVEFfVEtJUF9PTihfcCkgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorI2RlZmluZSBTVEFfQUVTX09OKF9wKSAgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCisjZGVmaW5lIFNUQV9UR05fV0lGSV9PTihfcCkgICAgICAgICAgICAgKF9wLT5TdGFDZmcuYlRHbldpZmlUZXN0ID09IFRSVUUpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgQ0tJUF9LUF9PTihfcCkJCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MTApICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCisjZGVmaW5lIENLSVBfQ01JQ19PTihfcCkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgwOCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKKworCisjZGVmaW5lIElOQ19SSU5HX0lOREVYKF9pZHgsIF9SaW5nU2l6ZSkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX2lkeCkgPSAoX2lkeCsxKSAlIChfUmluZ1NpemUpOyAgICAgICBcCit9CisKKyNkZWZpbmUgSVNfUlQzMDcwKF9wQWQpCQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcwMDAwMCkKKworI2RlZmluZSBSSU5HX1BBQ0tFVF9JTklUKF9UeFJpbmcsIF9pZHgpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1R4UmluZy0+Q2VsbFtfaWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9UeFJpbmctPkNlbGxbX2lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgVFhEVF9JTklUKF9UeEQpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc1plcm9NZW1vcnkoX1R4RCwgVFhEX1NJWkUpOwlcCisJX1R4RC0+RE1BRE9ORSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvL1NldCBsYXN0IGRhdGEgc2VnbWVudAorI2RlZmluZSBSSU5HX1NFVF9MQVNURFMoX1R4RCwgX0lzU0QwKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfSXNTRDApIHtfVHhELT5MYXN0U2VjMCA9IDE7fSAgICAgXAorICAgIGVsc2Uge19UeEQtPkxhc3RTZWMxID0gMTt9ICAgICBcCit9CisKKy8vIEluY3JlYXNlIFR4VHNjIHZhbHVlIGZvciBuZXh0IHRyYW5zbWlzc2lvbgorLy8gVE9ETzoKKy8vIFdoZW4gaT09NiwgbWVhbnMgVFNDIGhhcyBkb25lIG9uZSBmdWxsIGN5Y2xlLCBkbyByZS1rZXlpbmcgc3R1ZmYgZm9sbG93IHNwZWNzCisvLyBTaG91bGQgc2VuZCBhIHNwZWNpYWwgZXZlbnQgbWljcm9zb2Z0IGRlZmluZWQgdG8gcmVxdWVzdCByZS1rZXkKKyNkZWZpbmUgSU5DX1RYX1RTQyhfdHNjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoKytfdHNjW2ldID09IDB4MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGkgPT0gNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBpcyBjb3BpZWQgZnJvbSBBUCBiZWFjb24uICBEb24ndCBuZWVkIHRvIHVwZGF0ZSBoZXJlLgorI2RlZmluZSBDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1pbW9QcyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5HRiA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRjsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlNob3J0R0lmb3IyMCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjA7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuVHhTVEJDID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQzsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJ4U1RCQyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkM7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5FeHRDaGFuT2Zmc2V0ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQ7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5SZWNvbVdpZHRoID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5PcGVyYWlvbk1vZGUgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk5vbkdmUHJlc2VudCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OyAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUQ2FwYWJpbGl0eS5NQ1NTZXQsIChfcEFkKS0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBzaXplb2YoVUNIQVIpICogMTYpO1wKK30KKworI2RlZmluZSBDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04oX3BBZCwgX3BIdENhcGFiaWxpdHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplKTsJXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1tcHNNb2RlPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzKTsJXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heFJBbXBkdUZhY3RvciA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IpOwlcCit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vCisvLyBCQlAgJiBSRiBhcmUgdXNpbmcgaW5kaXJlY3QgYWNjZXNzLiBCZWZvcmUgd3JpdGUgYW55IHZhbHVlIGludG8gaXQuCisvLyBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBjb21tYW5kIHBlbmRpbmcgdmlhIGNoZWNraW5nIGJ1c3kgYml0LgorLy8KKyNkZWZpbmUgTUFYX0JVU1lfQ09VTlQgIDEwMCAgICAgICAgIC8vIE51bWJlciBvZiByZXRyeSBiZWZvcmUgZmFpbGluZyBhY2Nlc3MgQkJQICYgUkYgaW5kaXJlY3QgcmVnaXN0ZXIKKy8vCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgUlRNUF9SRl9JT19XUklURTMyKF9BLCBfVikgICAgICAgICAgICAgICAgIFJUVVNCV3JpdGVSRlJlZ2lzdGVyKF9BLCBfVikKKyNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgIFJUVVNCUmVhZEJCUFJlZ2lzdGVyKF9BLCBfSSwgX3BWKQorI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKF9BLCBfSSwgX1YpCisKKyNkZWZpbmUgQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoX0EsIF9JLCBfVikKKyNkZWZpbmUgQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAJCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKF9BLCBfSSwgX3BWKQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjZGVmaW5lICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIGtoeikgIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogICAgIGtoeiA9IDI0MTIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogICAgIGtoeiA9IDI0MTcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogICAgIGtoeiA9IDI0MjIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogICAgIGtoeiA9IDI0MjcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogICAgIGtoeiA9IDI0MzIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogICAgIGtoeiA9IDI0MzcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNzogICAgIGtoeiA9IDI0NDIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgODogICAgIGtoeiA9IDI0NDcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgOTogICAgIGtoeiA9IDI0NTIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6ICAgIGtoeiA9IDI0NTcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6ICAgIGtoeiA9IDI0NjIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6ICAgIGtoeiA9IDI0NjcwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6ICAgIGtoeiA9IDI0NzIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6ICAgIGtoeiA9IDI0ODQwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6ICAvKiBVTklJICovICBraHogPSA1MTgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOiAgLyogVU5JSSAqLyAga2h6ID0gNTIwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDogIC8qIFVOSUkgKi8gIGtoeiA9IDUyMjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6ICAvKiBVTklJICovICBraHogPSA1MjQwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOiAgLyogVU5JSSAqLyAga2h6ID0gNTI2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjogIC8qIFVOSUkgKi8gIGtoeiA9IDUyODAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6ICAvKiBVTklJICovICBraHogPSA1MzAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDY0OiAgLyogVU5JSSAqLyAga2h6ID0gNTMyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6IC8qIFVOSUkgKi8gIGtoeiA9IDU3NDUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOiAvKiBVTklJICovICBraHogPSA1NzY1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzogLyogVU5JSSAqLyAga2h6ID0gNTc4NTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjE6IC8qIFVOSUkgKi8gIGtoeiA9IDU4MDUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OiAvKiBVTklJICovICBraHogPSA1ODI1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDogLyogSGlwZXJMQU4yICovICBraHogPSA1NTAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwNDogLyogSGlwZXJMQU4yICovICBraHogPSA1NTIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwODogLyogSGlwZXJMQU4yICovICBraHogPSA1NTQwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDExMjogLyogSGlwZXJMQU4yICovICBraHogPSA1NTYwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDExNjogLyogSGlwZXJMQU4yICovICBraHogPSA1NTgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyMDogLyogSGlwZXJMQU4yICovICBraHogPSA1NjAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNDogLyogSGlwZXJMQU4yICovICBraHogPSA1NjIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyODogLyogSGlwZXJMQU4yICovICBraHogPSA1NjQwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMjogLyogSGlwZXJMQU4yICovICBraHogPSA1NjYwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEzNjogLyogSGlwZXJMQU4yICovICBraHogPSA1NjgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0MDogLyogSGlwZXJMQU4yICovICBraHogPSA1NzAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUxNzAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUxOTAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUyMTAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUyMzAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NDogLyogSmFwYW4gKi8gICBraHogPSA0OTIwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODg6IC8qIEphcGFuICovICAga2h6ID0gNDk0MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTkyOiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5NjAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE5NjogLyogSmFwYW4gKi8gICBraHogPSA0OTgwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDg6IC8qIEphcGFuLCBtZWFucyBKMDggKi8gICBraHogPSA1MDQwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTI6IC8qIEphcGFuLCBtZWFucyBKMTIgKi8gICBraHogPSA1MDYwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTY6IC8qIEphcGFuLCBtZWFucyBKMTYgKi8gICBraHogPSA1MDgwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAga2h6ID0gMjQxMjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworI2RlZmluZSAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKGtoeiwgY2gpICB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN3aXRjaCAoa2h6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MTIwMDA6ICAgIGNoID0gMTsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MTcwMDA6ICAgIGNoID0gMjsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjIwMDA6ICAgIGNoID0gMzsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjcwMDA6ICAgIGNoID0gNDsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzIwMDA6ICAgIGNoID0gNTsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzcwMDA6ICAgIGNoID0gNjsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDIwMDA6ICAgIGNoID0gNzsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDcwMDA6ICAgIGNoID0gODsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NTIwMDA6ICAgIGNoID0gOTsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NTcwMDA6ICAgIGNoID0gMTA7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjIwMDA6ICAgIGNoID0gMTE7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjcwMDA6ICAgIGNoID0gMTI7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NzIwMDA6ICAgIGNoID0gMTM7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0ODQwMDA6ICAgIGNoID0gMTQ7ICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUxODAwMDA6ICAgIGNoID0gMzY7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjAwMDAwOiAgICBjaCA9IDQwOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIyMDAwMDogICAgY2ggPSA0NDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyNDAwMDA6ICAgIGNoID0gNDg7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjYwMDAwOiAgICBjaCA9IDUyOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI4MDAwMDogICAgY2ggPSA1NjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUzMDAwMDA6ICAgIGNoID0gNjA7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzIwMDAwOiAgICBjaCA9IDY0OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc0NTAwMDogICAgY2ggPSAxNDk7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NjUwMDA6ICAgIGNoID0gMTUzOyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1Nzg1MDAwOiAgICBjaCA9IDE1NzsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTgwNTAwMDogICAgY2ggPSAxNjE7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU4MjUwMDA6ICAgIGNoID0gMTY1OyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTAwMDAwOiAgICBjaCA9IDEwMDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTIwMDAwOiAgICBjaCA9IDEwNDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTQwMDAwOiAgICBjaCA9IDEwODsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTYwMDAwOiAgICBjaCA9IDExMjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTgwMDAwOiAgICBjaCA9IDExNjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjAwMDAwOiAgICBjaCA9IDEyMDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjIwMDAwOiAgICBjaCA9IDEyNDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjQwMDAwOiAgICBjaCA9IDEyODsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjYwMDAwOiAgICBjaCA9IDEzMjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjgwMDAwOiAgICBjaCA9IDEzNjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzAwMDAwOiAgICBjaCA9IDE0MDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTcwMDAwOiAgICBjaCA9IDM0OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTkwMDAwOiAgICBjaCA9IDM4OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjEwMDAwOiAgICBjaCA9IDQyOyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjMwMDAwOiAgICBjaCA9IDQ2OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTIwMDAwOiAgICBjaCA9IDE4NDsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTQwMDAwOiAgICBjaCA9IDE4ODsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTYwMDAwOiAgICBjaCA9IDE5MjsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTgwMDAwOiAgICBjaCA9IDE5NjsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDQwMDAwOiAgICBjaCA9IDIwODsgLyogSmFwYW4sIG1lYW5zIEowOCAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUwNjAwMDA6ICAgIGNoID0gMjEyOyAvKiBKYXBhbiwgbWVhbnMgSjEyICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA4MDAwMDogICAgY2ggPSAyMTY7IC8qIEphcGFuLCBtZWFucyBKMTYgKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICBjaCA9IDE7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworLy8KKy8vIENvbW1vbiBmcmFnbWVudCBsaXN0IHN0cnVjdHVyZSAtICBJZGVudGljYWwgdG8gdGhlIHNjYXR0ZXIgZ2F0aGVyIGZyYWcgbGlzdCBzdHJ1Y3R1cmUKKy8vCisvLyNkZWZpbmUgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UICAgICAgICAgU0NBVFRFUl9HQVRIRVJfRUxFTUVOVAorLy8jZGVmaW5lIFBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgICAgICAgIFBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UCisjZGVmaW5lIE5JQ19NQVhfUEhZU19CVUZfQ09VTlQgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCB7CisgICAgUFZPSUQJCUFkZHJlc3M7CisgICAgVUxPTkcJCUxlbmd0aDsKKyAgICBQVUxPTkcJCVJlc2VydmVkOworfSBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UOworCisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgeworICAgIFVMT05HICBOdW1iZXJPZkVsZW1lbnRzOworICAgIFBVTE9ORyBSZXNlcnZlZDsKKyAgICBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgRWxlbWVudHNbTklDX01BWF9QSFlTX0JVRl9DT1VOVF07Cit9IFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCwgKlBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1Q7CisKKy8vCisvLyAgU29tZSB1dGlsaXR5IG1hY3JvcworLy8KKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihfYSwgX2IpICAgICAoKChfYSkgPCAoX2IpKSA/IChfYSkgOiAoX2IpKQorI2VuZGlmCisKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChfYSwgX2IpICAgICAoKChfYSkgPiAoX2IpKSA/IChfYSkgOiAoX2IpKQorI2VuZGlmCisKKyNkZWZpbmUgR0VUX0xOQV9HQUlOKF9wQWQpCSgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgPyAoX3BBZC0+QkxOQUdhaW4pIDogKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDY0KSA/IChfcEFkLT5BTE5BR2FpbjApIDogKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDEyOCkgPyAoX3BBZC0+QUxOQUdhaW4xKSA6IChfcEFkLT5BTE5BR2FpbjIpKSkpCisKKyNkZWZpbmUgSU5DX0NPVU5URVI2NChWYWwpICAgICAgICAgIChWYWwuUXVhZFBhcnQrKykKKworI2RlZmluZSBJTkZSQV9PTihfcCkgICAgICAgICAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhfcCwgZk9QX1NUQVRVU19JTkZSQV9PTikpCisjZGVmaW5lIEFESE9DX09OKF9wKSAgICAgICAgICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKF9wLCBmT1BfU1RBVFVTX0FESE9DX09OKSkKKyNkZWZpbmUgTU9OSVRPUl9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkJzc1R5cGUpID09IEJTU19NT05JVE9SKQorI2RlZmluZSBJRExFX09OKF9wKSAgICAgICAgICAgICAgICAgKCFJTkZSQV9PTihfcCkgJiYgIUFESE9DX09OKF9wKSkKKworLy8gQ2hlY2sgTEVBUCAmIENDS00gZmxhZ3MKKyNkZWZpbmUgTEVBUF9PTihfcCkgICAgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2RlZmluZSBMRUFQX0NDS01fT04oX3ApICAgICAgICAgICAgKCgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoSW5mby5DQ0tNID09IFRSVUUpKQorCisvLyBpZiBvcmdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLCB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCisjZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCWlmICgoKCooX3BCdWZWQSArIDEyKSA8PCA4KSArICooX3BCdWZWQSArIDEzKSkgPiAxNTAwKQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBICsgMTIsIDIpIHx8IAkJCVwKKwkJCU5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBfcEJ1ZlZBICsgMTIsIDIpKQkJXAorCQl7CQkJCQkJCQkJCQkJCQlcCisJCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF9CUklER0VfVFVOTkVMOwkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBOVUxMOwkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCit9CisKKy8vIE5ldyBEZWZpbmUgZm9yIG5ldyBUeCBQYXRoLgorI2RlZmluZSBFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoKCgqKF9wQnVmVkEpIDw8IDgpICsgKihfcEJ1ZlZBICsgMSkpID4gMTUwMCkJCQlcCisJewkJCQkJCQkJCQkJCQkJCVwKKwkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfODAyXzFIOwkJCQkJCVwKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShJUFgsIF9wQnVmVkEsIDIpIHx8IAkJCQlcCisJCQlOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgX3BCdWZWQSwgMikpCQkJXAorCQl7CQkJCQkJCQkJCQkJCQlcCisJCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF9CUklER0VfVFVOTkVMOwkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBOVUxMOwkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCit9CisKKworI2RlZmluZSBNQUtFXzgwMl8zX0hFQURFUihfcCwgX3BNYWMxLCBfcE1hYzIsIF9wVHlwZSkgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE5kaXNNb3ZlTWVtb3J5KF9wLCBfcE1hYzEsIE1BQ19BRERSX0xFTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE5kaXNNb3ZlTWVtb3J5KChfcCArIE1BQ19BRERSX0xFTiksIF9wTWFjMiwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgXAorICAgIE5kaXNNb3ZlTWVtb3J5KChfcCArIE1BQ19BRERSX0xFTiAqIDIpLCBfcFR5cGUsIExFTkdUSF84MDJfM19UWVBFKTsgXAorfQorCisvLyBpZiBwRGF0YSBoYXMgbm8gTExDL1NOQVAgKG5laXRoZXIgUkZDMTA0MiBub3IgQnJpZGdlIHR1bm5lbCksIGtlZXAgaXQgdGhhdCB3YXkuCisvLyBlbHNlIGlmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBMTEMvU05BUC1lbmNhcGVkIElQWCBvciBBUFBMRVRBTEssIHByZXNlcnZlIHRoZSBMTEMvU05BUCBmaWVsZAorLy8gZWxzZSByZW1vdmUgdGhlIExMQy9TTkFQIGZpZWxkIGZyb20gdGhlIHJlc3VsdCBFdGhlcm5ldCBmcmFtZQorLy8gUGF0Y2ggZm9yIFdIUUwgb25seSwgd2hpY2ggZGlkIG5vdCB0dXJuIG9uIE5ldGJpb3MgYnV0IHVzZSBJUFggd2l0aGluIGl0cyBwYXlsb2FkCisvLyBOb3RlOgorLy8gICAgIF9wRGF0YSAmIF9EYXRhU2l6ZSBtYXkgYmUgYWx0ZXJlZCAocmVtb3ZlIDgtYnl0ZSBMTEMvU05BUCkgYnkgdGhpcyBNQUNSTworLy8gICAgIF9wUmVtb3ZlZExMQ1NOQVA6IHBvaW50ZXIgdG8gcmVtb3ZlZCBMTEMvU05BUDsgTlVMTCBpcyBub3QgcmVtb3ZlZAorI2RlZmluZSBDT05WRVJUX1RPXzgwMl8zKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgX3BEYXRhLCBfRGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgTExDX0xlblsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9wUmVtb3ZlZExMQ1NOQVAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIF9wRGF0YSwgNikgIHx8ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVUNIQVIgcFByb3RvID0gX3BEYXRhICsgNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKE5kaXNFcXVhbE1lbW9yeShJUFgsIHBQcm90bywgMikgfHwgTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIHBQcm90bywgMikpICYmICBcCisgICAgICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIF9wRGF0YSwgNikpICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIHBQcm90byk7ICAgICAgICAgICBcCisgICAgICAgICAgICBfcFJlbW92ZWRMTENTTkFQID0gX3BEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfRGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xX0g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfcERhdGEgKz0gTEVOR1RIXzgwMl8xX0g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExMQ19MZW5bMF0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExMQ19MZW5bMV0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgTExDX0xlbik7ICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgU1dJVENIX0FCKCBfcEFBLCBfcEJCKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBWT0lEIHBDQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBDQyA9IF9wQkI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcEJCID0gX3BBQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9wQUEgPSBwQ0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gRW5xdWV1ZSB0aGlzIGZyYW1lIHRvIE1MTUUgZW5naW5lCisvLyBXZSBuZWVkIHRvIGVucXVldWUgdGhlIHdob2xlIGZyYW1lIGJlY2F1c2UgTUxNRSBuZWVkIHRvIHBhc3MgZGF0YSB0eXBlCisvLyBpbmZvcm1hdGlvbiBmcm9tIDgwMi4xMSBoZWFkZXIKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShfcEFkLCBXY2lkLCBfcEZyYW1lLCBfRnJhbWVTaXplLCBfUnNzaTAsIF9Sc3NpMSwgX1Jzc2kyLCBfUGxjcFNpZ25hbCkgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUlOVDMyIEhpZ2gzMlRTRj0wLCBMb3czMlRTRj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTWxtZUVucXVldWVGb3JSZWN2KF9wQWQsIFdjaWQsIEhpZ2gzMlRTRiwgTG93MzJUU0YsIChVQ0hBUilfUnNzaTAsIChVQ0hBUilfUnNzaTEsKFVDSEFSKV9Sc3NpMixfRnJhbWVTaXplLCBfcEZyYW1lLCAoVUNIQVIpX1BsY3BTaWduYWwpOyAgIFwKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2RlZmluZSBORElTX1FVRVJZX0JVRkZFUihfTmRpc0J1ZiwgX3BwVkEsIF9wQnVmTGVuKSAgICAgICAgICAgICAgICAgICAgXAorICAgIE5kaXNRdWVyeUJ1ZmZlcihfTmRpc0J1ZiwgX3BwVkEsIF9wQnVmTGVuKQorCisjZGVmaW5lIE1BQ19BRERSX0VRVUFMKHBBZGRyMSxwQWRkcjIpICAgICAgICAgICBSVE1QRXF1YWxNZW1vcnkoKFBWT0lEKShwQWRkcjEpLCAoUFZPSUQpKHBBZGRyMiksIE1BQ19BRERSX0xFTikKKyNkZWZpbmUgU1NJRF9FUVVBTChzc2lkMSwgbGVuMSwgc3NpZDIsIGxlbjIpICAgICgobGVuMT09bGVuMikgJiYgKFJUTVBFcXVhbE1lbW9yeShzc2lkMSwgc3NpZDIsIGxlbjEpKSkKKworLy8KKy8vIENoZWNrIGlmIGl0IGlzIEphcGFuIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVsLgorLy8KKyNkZWZpbmUgSmFwYW5DaGFubmVsQ2hlY2soY2hhbm5lbCkgICgoY2hhbm5lbCA9PSA1MikgfHwgKGNoYW5uZWwgPT0gNTYpIHx8IChjaGFubmVsID09IDYwKSB8fCAoY2hhbm5lbCA9PSA2NCkpCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgU1RBX1BPUlRfU0VDVVJFRChfcEFkKSBcCit7IFwKKwlfcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgXAorCU5kaXNBY3F1aXJlU3BpbkxvY2soJl9wQWQtPk1hY1RhYkxvY2spOyBcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBfcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7IFwKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZfcEFkLT5NYWNUYWJMb2NrKTsgXAorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKy8vCisvLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9SRUdfUEFJUgoreworCVVMT05HICAgUmVnaXN0ZXI7CisJVUxPTkcgICBWYWx1ZTsKK30gUlRNUF9SRUdfUEFJUiwgKlBSVE1QX1JFR19QQUlSOworCit0eXBlZGVmIHN0cnVjdCAgX1JFR19QQUlSCit7CisJVUNIQVIgICBSZWdpc3RlcjsKKwlVQ0hBUiAgIFZhbHVlOworfSBSRUdfUEFJUiwgKlBSRUdfUEFJUjsKKworLy8KKy8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JGX1JFR1MKK3sKKwlVQ0hBUiAgIENoYW5uZWw7CisJVUxPTkcgICBSMTsKKwlVTE9ORyAgIFIyOworCVVMT05HICAgUjM7CisJVUxPTkcgICBSNDsKK30gUlRNUF9SRl9SRUdTLCAqUFJUTVBfUkZfUkVHUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZSRVFVRU5DWV9JVEVNIHsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCU47CisJVUNIQVIJUjsKKwlVQ0hBUglLOworfSBGUkVRVUVOQ1lfSVRFTSwgKlBGUkVRVUVOQ1lfSVRFTTsKKworLy8KKy8vICBEYXRhIGJ1ZmZlciBmb3IgRE1BIG9wZXJhdGlvbiwgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5CisvLyAgQm90aCBETUEgdG8gLyBmcm9tIENQVSB1c2UgdGhlIHNhbWUgc3RydWN0dXJlLgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9ETUFCVUYKK3sKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7CisJUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBUeEJ1ZiB2aXJ0dWFsIGFkZHJlc3MKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIFR4QnVmIHBoeXNpY2FsIGFkZHJlc3MKK30gUlRNUF9ETUFCVUYsICpQUlRNUF9ETUFCVUY7CisKKwordHlwZWRlZgl1bmlvbglfSEVBREVSXzgwMl8xMV9TRVF7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIHN0cnVjdCB7CisgICAJVVNIT1JUCQkJU2VxdWVuY2U6MTI7CisJVVNIT1JUCQkJRnJhZzo0OworICAgIH0gICBmaWVsZDsKKyNlbHNlCisgICAgc3RydWN0IHsKKwlVU0hPUlQJCQlGcmFnOjQ7CisJVVNIT1JUCQkJU2VxdWVuY2U6MTI7CisgICAgfSAgIGZpZWxkOworI2VuZGlmCisgICAgVVNIT1JUICAgICAgICAgICB2YWx1ZTsKK30JSEVBREVSXzgwMl8xMV9TRVEsICpQSEVBREVSXzgwMl8xMV9TRVE7CisKKy8vCisvLyAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQorLy8gIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkVPUkRFUkJVRgoreworCUJPT0xFQU4JCQlJc0Z1bGw7CisJUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBUeEJ1ZiB2aXJ0dWFsIGFkZHJlc3MKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zWzE0XTsKKwlIRUFERVJfODAyXzExX1NFUQkJCVNlcXVlbmNlOwkvL3N1cHBvcnQgY29tcHJlc3NlZCBiaXRtYXAgQkEsIHNvIG5vIGNvbnNpZGVyIGZyYWdtZW50IGluIEJBCisJVUNIQVIgCQlEYXRhT2Zmc2V0OworCVVTSE9SVCAJCURhdGFzaXplOworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKKyNpZmRlZiBSVDI4NzAKKwlQVUNIQVIJCQkJCUFsbG9jUGE7CisjZW5kaWYgLy8gUlQyODcwIC8vCit9ICAgUlRNUF9SRU9SREVSQlVGLCAqUFJUTVBfUkVPUkRFUkJVRjsKKworLy8KKy8vIENvbnRyb2wgYmxvY2sgKERlc2NyaXB0b3IpIGZvciBhbGwgcmluZyBkZXNjcmlwdG9yIERNQSBvcGVyYXRpb24sIGJ1ZmZlciBtdXN0IGJlCisvLyBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4gTkRJU19QQUNLRVQgc3RvcmVkIHRoZSBiaW5kaW5nIFJ4IHBhY2tldCBkZXNjcmlwdG9yCisvLyB3aGljaCB3b24ndCBiZSByZWxlYXNlZCwgZHJpdmVyIGhhcyB0byB3YWl0IHVudGlsIHVwcGVyIGxheWVyIHJldHVybiB0aGUgcGFja2V0CisvLyBiZWZvcmUgZ2l2ZWluZyB1cCB0aGlzIHJ4IHJpbmcgZGVzY3JpcHRvciB0byBBU0lDLiBORElTX0JVRkZFUiBpcyBhc3NvY2FpdGVkIHBhaXIKKy8vIHRvIGRlc2NyaWJlIHRoZSBwYWNrZXQgYnVmZmVyLiBGb3IgVHgsIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgdHggcGFja2V0IGRlc2NyaXB0b3IKKy8vIHdoaWNoIGRyaXZlciBzaG91bGQgQUNLIHVwcGVyIGxheWVyIHdoZW4gdGhlIHR4IGlzIHBoeXNpY2FsbHkgZG9uZSBvciBmYWlsZWQuCisvLwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfRE1BQ0IKK3sKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7ICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgc2l6ZQorCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcworCVBORElTX1BBQ0tFVCBwTmRpc1BhY2tldDsKKwlQTkRJU19QQUNLRVQgcE5leHROZGlzUGFja2V0OworCisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgRG1hQnVmOyAgICAgICAgICAgICAvLyBBc3NvY2lhdGVkIERNQSBidWZmZXIgc3RydWN0dXJlCit9IFJUTVBfRE1BQ0IsICpQUlRNUF9ETUFDQjsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVFhfQlVGCit7CisJUFFVRVVFX0VOVFJZICAgIE5leHQ7CisJVUNIQVIgICAgICAgICAgIEluZGV4OworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBzaXplCisJUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzCit9IFJUTVBfVFhCVUYsICpQUlRNUF9UWEJVRjsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfUlhfQlVGCit7CisJQk9PTEVBTiAgICAgICAgICAgSW5Vc2U7CisJVUxPTkcgICAgICAgICAgIAlCeUJhUmVjSW5kZXg7CisJUlRNUF9SRU9SREVSQlVGCU1BUF9SWEJ1ZltNQVhfUlhfUkVPUkRFUkJVRl07Cit9IFJUTVBfUlhCVUYsICpQUlRNUF9SWEJVRjsKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1RYX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW1RYX1JJTkdfU0laRV07CisJVUlOVDMyCQlUeENwdUlkeDsKKwlVSU5UMzIJCVR4RG1hSWR4OworCVVJTlQzMgkJVHhTd0ZyZWVJZHg7IAkvLyBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXgKK30gUlRNUF9UWF9SSU5HLCAqUFJUTVBfVFhfUklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfUlhfUklORworeworCVJUTVBfRE1BQ0IgIENlbGxbUlhfUklOR19TSVpFXTsKKwlVSU5UMzIJCVJ4Q3B1SWR4OworCVVJTlQzMgkJUnhEbWFJZHg7CisJSU5UMzIJCVJ4U3dSZWFkSWR4OyAJLy8gc29mdHdhcmUgbmV4dCByZWFkIGluZGV4Cit9IFJUTVBfUlhfUklORywgKlBSVE1QX1JYX1JJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX01HTVRfUklORworeworCVJUTVBfRE1BQ0IgIENlbGxbTUdNVF9SSU5HX1NJWkVdOworCVVJTlQzMgkJVHhDcHVJZHg7CisJVUlOVDMyCQlUeERtYUlkeDsKKwlVSU5UMzIJCVR4U3dGcmVlSWR4OyAvLyBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXgKK30gUlRNUF9NR01UX1JJTkcsICpQUlRNUF9NR01UX1JJTkc7CisKKy8vCisvLyAgU3RhdGlzdGljIGNvdW50ZXIgc3RydWN0dXJlCisvLwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzMKK3sKKwkvLyBHZW5lcmFsIFN0YXRzCisJVUxPTkcgICAgICAgR29vZFRyYW5zbWl0czsKKwlVTE9ORyAgICAgICBHb29kUmVjZWl2ZXM7CisJVUxPTkcgICAgICAgVHhFcnJvcnM7CisJVUxPTkcgICAgICAgUnhFcnJvcnM7CisJVUxPTkcgICAgICAgUnhOb0J1ZmZlcjsKKworCS8vIEV0aGVybmV0IFN0YXRzCisJVUxPTkcgICAgICAgUmN2QWxpZ25tZW50RXJyb3JzOworCVVMT05HICAgICAgIE9uZUNvbGxpc2lvbjsKKwlVTE9ORyAgICAgICBNb3JlQ29sbGlzaW9uczsKKworfSBDT1VOVEVSXzgwMl8zLCAqUENPVU5URVJfODAyXzM7CisKK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8xMSB7CisJVUxPTkcgICAgICAgICAgIExlbmd0aDsKKwlMQVJHRV9JTlRFR0VSICAgTGFzdFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OworCUxBUkdFX0lOVEVHRVIgICBSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBNdWx0aXBsZVJldHJ5Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUlRTRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBBQ0tGYWlsdXJlQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OworfSBDT1VOVEVSXzgwMl8xMSwgKlBDT1VOVEVSXzgwMl8xMTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfUkFMSU5LIHsKKwlVTE9ORyAgICAgICAgICAgVHJhbnNtaXR0ZWRCeXRlQ291bnQ7ICAgLy8gYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0CisJVUxPTkcgICAgICAgICAgIFJlY2VpdmVkQnl0ZUNvdW50OyAgICAgIC8vIGJvdGggQ1JDIG9rYXkgYW5kIENSQyBlcnJvciwgdXNlZCB0byBjYWxjdWxhdGUgUlggdGhyb3VnaHB1dAorCVVMT05HICAgICAgICAgICBCZWVuRGlzYXNzb2NpYXRlZENvdW50OworCVVMT05HICAgICAgICAgICBCYWRDUUlBdXRvUmVjb3ZlcnlDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUG9vckNRSVJvYW1pbmdDb3VudDsKKwlVTE9ORyAgICAgICAgICAgTWdtdFJpbmdGdWxsQ291bnQ7CisJVUxPTkcgICAgICAgICAgIFJ4Q291bnRTaW5jZUxhc3ROVUxMOworCVVMT05HICAgICAgICAgICBSeENvdW50OworCVVMT05HICAgICAgICAgICBSeFJpbmdFcnJDb3VudDsKKwlVTE9ORyAgICAgICAgICAgS2lja1R4Q291bnQ7CisJVUxPTkcgICAgICAgICAgIFR4UmluZ0VyckNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSZWFsRmNzRXJyQ291bnQ7CisJVUxPTkcgICAgICAgICAgIFBlbmRpbmdOZGlzUGFja2V0Q291bnQ7CisKKwlVTE9ORyAgICAgICAgICAgT25lU2VjT3NUeENvdW50W05VTV9PRl9UWF9SSU5HXTsKKwlVTE9ORyAgICAgICAgICAgT25lU2VjRG1hRG9uZUNvdW50W05VTV9PRl9UWF9SSU5HXTsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhEb25lQ291bnQ7CisJVUxPTkcgICAgICAgICAgIE9uZVNlY1J4Q291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4QWdncmVnYXRpb25Db3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50OworCisJVUlOVDMyICAgCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OworCisjaWZkZWYgUlQyODcwCisJVUxPTkcgICAgICAgICAgIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjRmFsc2VDQ0FDbnQ7ICAgICAgLy8gQ0NBIGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rQ250OyAgICAgICAgICAvLyBSWCB3aXRob3V0IGVycm9yCisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4T2tEYXRhQ250OyAgICAgIC8vIHVuaWNhc3QtdG8tbWUgREFUQSBmcmFtZSBjb3VudAorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEZjc0VyckNudDsgICAgICAvLyBDUkMgZXJyb3IKKwlVSU5UMzIgICAgICAgICAgT25lU2VjQmVhY29uU2VudENudDsKKwlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1RvdGFsVHhDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKKwlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1J4T2tEYXRhQ250OyAgLy8gT25lU2VjUnhPa0RhdGFDbnQKKwlVTE9ORwkJRHVwbGljYXRlUmN2OworCVVMT05HCQlUeEFnZ0NvdW50OworCVVMT05HCQlUeE5vbkFnZ0NvdW50OworCVVMT05HCQlUeEFnZzFNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2czTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzRNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnNU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c2TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzdNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnOE1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c5TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEwTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzExTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEyTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEzTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE0TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE1TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE2TVBEVUNvdW50OworCisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1TRFU7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZEFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBSZWNlaXZlZE9jdGVzSW5BTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRBTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgTVBEVUluUmVjZWl2ZWRBTVBEVUNvdW50OworfSBDT1VOVEVSX1JBTElOSywgKlBDT1VOVEVSX1JBTElOSzsKKwordHlwZWRlZiBzdHJ1Y3QgX1BJRF9DT1VOVEVSIHsKKwlVTE9ORyAgICAgICAgICAgVHhBY2tSZXF1aXJlZENvdW50OyAgICAgIC8vIENSQyBlcnJvcgorCVVMT05HICAgICAgICAgICBUeEFnZ3JlQ291bnQ7CisJVUxPTkcgICAgICAgICAgIFR4U3VjY2Vzc0NvdW50OyAvLyBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQgKyBPbmVTZWNUeEZhaWxDb3VudAorCVVMT05HCQlMYXN0U3VjY2Vzc1JhdGU7Cit9IFBJRF9DT1VOVEVSLCAqUFBJRF9DT1VOVEVSOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9EUlMgeworCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCisJVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKKwlCT09MRUFOICAgICAgICAgZk5vaXN5RW52aXJvbm1lbnQ7CisJQk9PTEVBTiAgICAgICAgIGZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKKwlVQ0hBUiAgICAgICAgICAgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgLy8gMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duCisJVUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCisJVUxPTkcJCQlMYXN0VHhPa0NvdW50OworfSBDT1VOVEVSX0RSUywgKlBDT1VOVEVSX0RSUzsKKworLy8KKy8vICBBcmNmb3VyIFN0cnVjdHVyZSBBZGRlZCBieSBQYXVsV3UKKy8vCit0eXBlZGVmIHN0cnVjdCAgX0FSQ0ZPVVIKK3sKKwlVSU5UICAgICAgICAgICAgWDsKKwlVSU5UICAgICAgICAgICAgWTsKKwlVQ0hBUiAgICAgICAgICAgU1RBVEVbMjU2XTsKK30gQVJDRk9VUkNPTlRFWFQsICpQQVJDRk9VUkNPTlRFWFQ7CisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSSB0b28uIGp1c3QgY29weSB0byBUWFdJLgordHlwZWRlZiBzdHJ1Y3QgIF9SRUNFSVZFX1NFVFRJTkcgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCU1JTU86MTsKKwlVU0hPUlQJCU9GRE06MTsKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlNb2RlOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUICAgCU51bU9mUlg6MjsgICAgICAgICAgICAgICAgIC8vIE1JTU8uIFdFIEhBVkUgM1IKKyNlbHNlCisJVVNIT1JUICAgCU51bU9mUlg6MjsgICAgICAgICAgICAgICAgIC8vIE1JTU8uIFdFIEhBVkUgM1IKKwlVU0hPUlQJCU1vZGU6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJcnN2OjM7CisJVVNIT1JUCQlPRkRNOjE7CisJVVNIT1JUCQlNSU1POjE7CisjZW5kaWYKKyB9IFJFQ0VJVkVfU0VUVElORywgKlBSRUNFSVZFX1NFVFRJTkc7CisKKy8vIFNoYXJlZCBrZXkgZGF0YSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0ICBfV0VQX0tFWSB7CisJVUNIQVIgICBLZXlMZW47ICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKKwlVQ0hBUiAgIEtleVtNQVhfTEVOX09GX0tFWV07ICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4Cit9IFdFUF9LRVksICpQV0VQX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NJUEhFUl9LRVkgeworCVVDSEFSICAgS2V5WzE2XTsgICAgICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4CisJVUNIQVIgICBSeE1pY1s4XTsJCQkvLyBtYWtlIGFsaWdubWVudAorCVVDSEFSICAgVHhNaWNbOF07CisJVUNIQVIgICBUeFRzY1s2XTsgICAgICAgICAgIC8vIDQ4Yml0IFRTQyB2YWx1ZQorCVVDSEFSICAgUnhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKKwlVQ0hBUiAgIENpcGhlckFsZzsgICAgICAgICAgLy8gMC1ub25lLCAxOldFUDY0LCAyOldFUDEyOCwgMzpUS0lQLCA0OkFFUywgNTpDS0lQNjQsIDY6Q0tJUDEyOAorCVVDSEFSICAgS2V5TGVuOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSICAgQnNzSWRbNl07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICAvLyBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZAorCVVDSEFSICAgVHlwZTsgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBQYWlyd2lzZS9Hcm91cCB3aGVuIHJlcG9ydGluZyBNSUMgZXJyb3IKK30gQ0lQSEVSX0tFWSwgKlBDSVBIRVJfS0VZOworCit0eXBlZGVmIHN0cnVjdCBfQkJQX1RVTklOR19TVFJVQ1QgeworCUJPT0xFQU4gICAgIEVuYWJsZTsKKwlVQ0hBUiAgICAgICBGYWxzZUNjYUNvdW50VXBwZXJCb3VuZDsgIC8vIDEwMCBwZXIgc2VjCisJVUNIQVIgICAgICAgRmFsc2VDY2FDb3VudExvd2VyQm91bmQ7ICAvLyAxMCBwZXIgc2VjCisJVUNIQVIgICAgICAgUjE3TG93ZXJCb3VuZDsgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gRTJQUk9NCisJVUNIQVIgICAgICAgUjE3VXBwZXJCb3VuZDsgICAgICAgICAgICAvLyAweDY4IGFjY29yZGluZyB0byBEYXZpZCBUdW5nCisJVUNIQVIgICAgICAgQ3VycmVudFIxN1ZhbHVlOworfSBCQlBfVFVOSU5HLCAqUEJCUF9UVU5JTkc7CisKK3R5cGVkZWYgc3RydWN0IF9TT0ZUX1JYX0FOVF9ESVZFUlNJVFlfU1RSVUNUIHsKKwlVQ0hBUiAgICAgRXZhbHVhdGVQZXJpb2Q7CQkgLy8gMDpub3QgZXZhbHV0ZSBzdGF0dXMsIDE6IGV2YWx1YXRlIHN0YXR1cywgMjogc3dpdGNoaW5nIHN0YXR1cworCVVDSEFSICAgICBQYWlyMVByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgorCVVDSEFSICAgICBQYWlyMVNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgorCVVDSEFSICAgICBQYWlyMlByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAorCVVDSEFSICAgICBQYWlyMlNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAorCVNIT1JUICAgICBQYWlyMUF2Z1Jzc2lbMl07ICAgICAgIC8vIEF2Z1Jzc2lbMF06RTEsIEF2Z1Jzc2lbMV06RTIKKwlTSE9SVCAgICAgUGFpcjJBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUzLCBBdmdSc3NpWzFdOkU0CisJU0hPUlQgICAgIFBhaXIxTGFzdEF2Z1Jzc2k7ICAgICAgLy8KKwlTSE9SVCAgICAgUGFpcjJMYXN0QXZnUnNzaTsgICAgICAvLworCVVMT05HICAgICBSY3ZQa3ROdW1XaGVuRXZhbHVhdGU7CisJQk9PTEVBTiAgIEZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZTsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgIFJ4QW50RGl2ZXJzaXR5VGltZXI7Cit9IFNPRlRfUlhfQU5UX0RJVkVSU0lUWSwgKlBTT0ZUX1JYX0FOVF9ESVZFUlNJVFk7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0FVVEhfSU5GTyB7CisJQk9PTEVBTiAgICAgICAgIEVuYWJsZWQ7ICAgICAgICAvL1R1cmU6IEVuYWJsZSBMRUFQIEF1dGhlbnRpY2F0aW9uCisJQk9PTEVBTiAgICAgICAgIENDS007ICAgICAgICAgICAvL1R1cmU6IFVzZSBGYXN0IFJlYXV0aGVudGljYXRpb24gd2l0aCBDQ0tNCisJVUNIQVIgICAgICAgICAgIFJlc2VydmVbMl07CisJVUNIQVIgICAgICAgICAgIFVzZXJOYW1lWzI1Nl07ICAvL0xFQVAsIFVzZXIgbmFtZQorCVVMT05HICAgICAgICAgICBVc2VyTmFtZUxlbjsKKwlVQ0hBUiAgICAgICAgICAgUGFzc3dvcmRbMjU2XTsgIC8vTEVBUCwgVXNlciBQYXNzd29yZAorCVVMT05HICAgICAgICAgICBQYXNzd29yZExlbjsKK30gTEVBUF9BVVRIX0lORk8sICpQTEVBUF9BVVRIX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICBFcnJvckNvZGVbMl07ICAvLzAwIDAxLUludmFsaWQgYXV0aGVudGljYXRpb24gdHlwZQorCQkJCQkJCQkvLzAwIDAyLUF1dGhlbnRpY2F0aW9uIHRpbWVvdXQKKwkJCQkJCQkJLy8wMCAwMy1DaGFsbGVuZ2UgZnJvbSBBUCBmYWlsZWQKKwkJCQkJCQkJLy8wMCAwNC1DaGFsbGVuZ2UgdG8gQVAgZmFpbGVkCisJQk9PTEVBTiAgICAgIFJlcG9ydGVkOworfSBST0dVRUFQX0VOVFJZLCAqUFJPR1VFQVBfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVQ0hBUiAgICAgICAgICAgICAgIFJvZ3VlQXBOcjsKKwlST0dVRUFQX0VOVFJZICAgICAgIFJvZ3VlQXBFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Cit9IFJPR1VFQVBfVEFCTEUsICpQUk9HVUVBUF9UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJPT0xFQU4gICAgIEVuYWJsZTsKKwlVQ0hBUiAgICAgICBEZWx0YTsKKwlCT09MRUFOICAgICBQbHVzU2lnbjsKK30gQ0NLX1RYX1BPV0VSX0NBTElCUkFURSwgKlBDQ0tfVFhfUE9XRVJfQ0FMSUJSQVRFOworCisvLworLy8gUmVjZWl2ZSBUdXBsZSBDYWNoZSBGb3JtYXQKKy8vCit0eXBlZGVmIHN0cnVjdCAgX1RVUExFX0NBQ0hFICAgIHsKKwlCT09MRUFOICAgICAgICAgVmFsaWQ7CisJVUNIQVIgICAgICAgICAgIE1hY0FkZHJlc3NbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgICAgU2VxdWVuY2U7CisJVVNIT1JUICAgICAgICAgIEZyYWc7Cit9IFRVUExFX0NBQ0hFLCAqUFRVUExFX0NBQ0hFOworCisvLworLy8gRnJhZ21lbnQgRnJhbWUgc3RydWN0dXJlCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9GUkFHTUVOVF9GUkFNRSB7CisJUE5ESVNfUEFDS0VUICAgIHBGcmFnUGFja2V0OworCVVMT05HICAgICAgIFJ4U2l6ZTsKKwlVU0hPUlQgICAgICBTZXF1ZW5jZTsKKwlVU0hPUlQgICAgICBMYXN0RnJhZzsKKwlVTE9ORyAgICAgICBGbGFnczsgICAgICAgICAgLy8gU29tZSBleHRyYSBmcmFtZSBpbmZvcm1hdGlvbi4gYml0IDA6IExMQyBwcmVzZW50ZWQKK30gRlJBR01FTlRfRlJBTUUsICpQRlJBR01FTlRfRlJBTUU7CisKKworLy8KKy8vIFBhY2tldCBpbmZvcm1hdGlvbiBmb3IgTmRpc1F1ZXJ5UGFja2V0CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9QQUNLRVRfSU5GTyAgICB7CisJVUlOVCAgICAgICAgICAgIFBoeXNpY2FsQnVmZmVyQ291bnQ7ICAgIC8vIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcG9yIGNoYWluZWQKKwlVSU5UICAgICAgICAgICAgQnVmZmVyQ291bnQgOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIEJ1ZmZlciBkZXNjcmlwdG9yIGNoYWluZWQKKwlVSU5UICAgICAgICAgICAgVG90YWxQYWNrZXRMZW5ndGggOyAgICAgLy8gU2VsZiBleHBsYWluZWQKKwlQTkRJU19CVUZGRVIgICAgcEZpcnN0QnVmZmVyOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBmaXJzdCBidWZmZXIgZGVzY3JpcHRvcgorfSBQQUNLRVRfSU5GTywgKlBQQUNLRVRfSU5GTzsKKworLy8KKy8vIFRraXAgS2V5IHN0cnVjdHVyZSB3aGljaCBSQzQga2V5ICYgTUlDIGNhbGN1bGF0aW9uCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9US0lQX0tFWV9JTkZPICB7CisJVUlOVCAgICAgICAgbkJ5dGVzSW5NOyAgLy8gIyBieXRlcyBpbiBNIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBJVjE2OworCVVMT05HICAgICAgIElWMzI7CisJVUxPTkcgICAgICAgSzA7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBMb3cKKwlVTE9ORyAgICAgICBLMTsgICAgICAgICAvLyBmb3IgTUlDS0VZIEhpZworCVVMT05HICAgICAgIEw7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQorCVVMT05HICAgICAgIFI7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQorCVVMT05HICAgICAgIE07ICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgZm9yIE1JQ0tFWQorCVVDSEFSICAgICAgIFJDNEtFWVsxNl07CisJVUNIQVIgICAgICAgTUlDWzhdOworfSBUS0lQX0tFWV9JTkZPLCAqUFRLSVBfS0VZX0lORk87CisKKy8vCisvLyBQcml2YXRlIC8gTWlzYyBkYXRhLCBjb3VudGVycyBmb3IgZHJpdmVyIGludGVybmFsIHVzZQorLy8KK3R5cGVkZWYgc3RydWN0ICBfX1BSSVZBVEVfU1RSVUMgeworCVVJTlQgICAgICAgU3lzdGVtUmVzZXRDbnQ7ICAgICAgICAgLy8gU3lzdGVtIHJlc2V0IGNvdW50ZXIKKwlVSU5UICAgICAgIFR4UmluZ0Z1bGxDbnQ7ICAgICAgICAgIC8vIFR4IHJpbmcgZnVsbCBvY2N1cnJhbmNlIG51bWJlcgorCVVJTlQgICAgICAgUGh5UnhFcnJDbnQ7ICAgICAgICAgICAgLy8gUEhZIFJ4IGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgorCS8vIFZhcmlhYmxlcyBmb3IgV0VQIGVuY3J5cHRpb24gLyBkZWNyeXB0aW9uIGluIHJ0bXBfd2VwLmMKKwlVSU5UICAgICAgIEZDU0NSQzMyOworCUFSQ0ZPVVJDT05URVhUICBXRVBDT05URVhUOworCS8vIFRraXAgc3R1ZmYKKwlUS0lQX0tFWV9JTkZPICAgVHg7CisJVEtJUF9LRVlfSU5GTyAgIFJ4OworfSBQUklWQVRFX1NUUlVDLCAqUFBSSVZBVEVfU1RSVUM7CisKKy8vIHN0cnVjdHVyZSB0byB0dW5lIEJCUCBSNjYgKEJCUCBUVU5JTkcpCit0eXBlZGVmIHN0cnVjdCBfQkJQX1I2Nl9UVU5JTkcgeworCUJPT0xFQU4gICAgIGJFbmFibGU7CisJVVNIT1JUICAgICAgRmFsc2VDY2FMb3dlclRocmVzaG9sZDsgIC8vIGRlZmF1bHQgMTAwCisJVVNIT1JUICAgICAgRmFsc2VDY2FVcHBlclRocmVzaG9sZDsgIC8vIGRlZmF1bHQgNTEyCisJVUNIQVIgICAgICAgUjY2RGVsdGE7CisJVUNIQVIgICAgICAgUjY2Q3VycmVudFZhbHVlOworCUJPT0xFQU4JCVI2Nkxvd2VyVXBwZXJTZWxlY3Q7IC8vQmVmb3JlIExpbmtVcCwgVXNlZCBMb3dlckJvdW5kIG9yIFVwcGVyQm91bmQgYXMgUjY2IHZhbHVlLgorfSBCQlBfUjY2X1RVTklORywgKlBCQlBfUjY2X1RVTklORzsKKworLy8gc3RydWN0dXJlIHRvIHN0b3JlIGNoYW5uZWwgVFggcG93ZXIKK3R5cGVkZWYgc3RydWN0IF9DSEFOTkVMX1RYX1BPV0VSIHsKKwlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYworCVVDSEFSICAgICAgQ2hhbm5lbDsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJQk9PTEVBTiAgICAgICBiRWZmZWN0ZWRDaGFubmVsOwkvLyBGb3IgQlcgNDAgb3BlcmF0aW5nIGluIDIuNEdIeiAsIHRoZSAiZWZmZWN0ZWQgY2hhbm5lbCIgaXMgdGhlIGNoYW5uZWwgdGhhdCBpcyBjb3ZlcmVkIGluIDQwTWh6LgorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwlDSEFSICAgICAgIFBvd2VyOworCUNIQVIgICAgICAgUG93ZXIyOworCVVDSEFSICAgICAgTWF4VHhQd3I7CisJVUNIQVIgICAgICBEZnNSZXE7Cit9IENIQU5ORUxfVFhfUE9XRVIsICpQQ0hBTk5FTF9UWF9QT1dFUjsKKworLy8gc3RydWN0dXJlIHRvIHN0b3JlIDgwMi4xMWogY2hhbm5lbCBUWCBwb3dlcgordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfMTFKX1RYX1BPV0VSIHsKKwlVQ0hBUiAgICAgIENoYW5uZWw7CisJVUNIQVIgICAgICBCVzsJLy8gQldfMTAgb3IgQldfMjAKKwlDSEFSICAgICAgIFBvd2VyOworCUNIQVIgICAgICAgUG93ZXIyOworCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCit9IENIQU5ORUxfMTFKX1RYX1BPV0VSLCAqUENIQU5ORUxfMTFKX1RYX1BPV0VSOworCit0eXBlZGVmIGVudW0gX0FCR0JBTkRfU1RBVEVfIHsKKwlVTktOT1dOX0JBTkQsCisJQkdfQkFORCwKKwlBX0JBTkQsCit9IEFCR0JBTkRfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1NUUlVDVCB7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJLy8gU1RBIHN0YXRlIG1hY2hpbmVzCisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQ250bE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQXNzb2NNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhSc3BNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFN5bmNNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFdwYVBza01hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgTGVhcE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQWlyb25ldE1hY2hpbmU7CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXNzb2NGdW5jW0FTU09DX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXV0aEZ1bmNbQVVUSF9GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhSc3BGdW5jW0FVVEhfUlNQX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgU3luY0Z1bmNbU1lOQ19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFdwYVBza0Z1bmNbV1BBX1BTS19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFpcm9uZXRGdW5jW0FJUk9ORVRfRlVOQ19TSVpFXTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBY3RGdW5jW0FDVF9GVU5DX1NJWkVdOworCS8vIEFjdGlvbgorCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFjdE1hY2hpbmU7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVNUQVRFX01BQ0hJTkUJCQlEbHNNYWNoaW5lOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIERsc0Z1bmNbRExTX0ZVTkNfU0laRV07CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKworCisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBDaGFubmVsUXVhbGl0eTsgIC8vIDAuLjEwMCwgQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gZm9yIFJvYW1pbmcKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBOb3czMjsgICAgICAgICAgIC8vIGxhdGNoIHRoZSB2YWx1ZSBvZiBOZGlzR2V0U3lzdGVtVXBUaW1lKCkKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0U2VuZE5VTExwc21UaW1lOworCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYlJ1bm5pbmc7CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgVGFza0xvY2s7CisJTUxNRV9RVUVVRSAgICAgICAgICAgICAgUXVldWU7CisKKwlVSU5UICAgICAgICAgICAgICAgICAgICBTaGlmdFJlZzsKKworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgQVBTRFBlcmlvZGljVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua0Rvd25UaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rVXBUaW1lcjsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBQZXJpb2RpY1JvdW5kOworCVVMT05HICAgICAgICAgICAgICAgICAgIE9uZVNlY1BlcmlvZGljUm91bmQ7CisKKwlVQ0hBUgkJCQkJUmVhbFJ4UGF0aDsKKwlCT09MRUFOCQkJCQliTG93VGhyb3VnaHB1dDsKKwlCT09MRUFOCQkJCQliRW5hYmxlQXV0b0FudGVubmFDaGVjazsKKwlSQUxJTktfVElNRVJfU1RSVUNUCQlSeEFudEV2YWxUaW1lcjsKKworI2lmZGVmIFJUMjg3MAorCVVDSEFSIENhbGlCVzQwUmZSMjQ7CisJVUNIQVIgQ2FsaUJXMjBSZlIyNDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworfSBNTE1FX1NUUlVDVCwgKlBNTE1FX1NUUlVDVDsKKworLy8gc3RydWN0dXJlIGZvciByYWRhciBkZXRlY3Rpb24gYW5kIGNoYW5uZWwgc3dpdGNoCit0eXBlZGVmIHN0cnVjdCBfUkFEQVJfREVURUNUX1NUUlVDVCB7CisgICAgLy9CT09MRUFOCQlJRUVFODAyMTFIOwkJCS8vIDA6IGRpc2FibGUsIDE6IGVuYWJsZSBJRUVFODAyLjExaAorCVVDSEFSCQlDU0NvdW50OwkJCS8vQ2hhbm5lbCBzd2l0Y2ggY291bnRlcgorCVVDSEFSCQlDU1BlcmlvZDsJCQkvL0NoYW5uZWwgc3dpdGNoIHBlcmlvZCAoYmVhY29uIGNvdW50KQorCVVDSEFSCQlSRENvdW50OwkJCS8vUmFkYXIgZGV0ZWN0aW9uIGNvdW50ZXIKKwlVQ0hBUgkJUkRNb2RlOwkJCQkvL1JhZGFyIERldGVjdGlvbiBtb2RlCisJVUNIQVIJCVJERHVyUmVnaW9uOwkJLy9SYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uCisJVUNIQVIJCUJCUFIxNjsKKwlVQ0hBUgkJQkJQUjE3OworCVVDSEFSCQlCQlBSMTg7CisJVUNIQVIJCUJCUFIyMTsKKwlVQ0hBUgkJQkJQUjIyOworCVVDSEFSCQlCQlBSNjQ7CisJVUxPTkcJCUluU2VydmljZU1vbml0b3JDb3VudDsgLy8gdW5pdDogc2VjCisJVUlOVDgJCURmc1Nlc3Npb25UaW1lOworCUJPT0xFQU4JCWJGYXN0RGZzOworCVVJTlQ4CQlDaE1vdmluZ1RpbWU7CisJVUlOVDgJCUxvbmdQdWxzZVJhZGFyVGg7Cit9IFJBREFSX0RFVEVDVF9TVFJVQ1QsICpQUkFEQVJfREVURUNUX1NUUlVDVDsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK3R5cGVkZWYgZW51bSBDRF9TVEFURV9uCit7CisJQ0RfTk9STUFMLAorCUNEX1NJTEVOQ0UsCisJQ0RfTUFYX1NUQVRFCit9IENEX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBDQVJSSUVSX0RFVEVDVElPTl9zCit7CisJQk9PTEVBTgkJCQkJRW5hYmxlOworCVVJTlQ4CQkJCQlDRFNlc3Npb25UaW1lOworCVVJTlQ4CQkJCQlDRFBlcmlvZDsKKwlDRF9TVEFURQkJCQlDRF9TdGF0ZTsKK30gQ0FSUklFUl9ERVRFQ1RJT04sICpQQ0FSUklFUl9ERVRFQ1RJT047CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCit0eXBlZGVmIGVudW0gX1JFQ19CTE9DS0FDS19TVEFUVVMKK3sKKyAgICBSZWNpcGllbnRfTk9ORT0wLAorCVJlY2lwaWVudF9VU0VELAorCVJlY2lwaWVudF9IYW5kbGVSZXMsCisgICAgUmVjaXBpZW50X0FjY2VwdAorfSBSRUNfQkxPQ0tBQ0tfU1RBVFVTLCAqUFJFQ19CTE9DS0FDS19TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfT1JJX0JMT0NLQUNLX1NUQVRVUworeworICAgIE9yaWdpbmF0b3JfTk9ORT0wLAorCU9yaWdpbmF0b3JfVVNFRCwKKyAgICBPcmlnaW5hdG9yX1dhaXRSZXMsCisgICAgT3JpZ2luYXRvcl9Eb25lCit9IE9SSV9CTE9DS0FDS19TVEFUVVMsICpQT1JJX0JMT0NLQUNLX1NUQVRVUzsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX0JBX09SSV9FTlRSWXsKKwlVQ0hBUiAgIFdjaWQ7CisJVUNIQVIgICBUSUQ7CisJVUNIQVIgICBCQVdpblNpemU7CisJVUNIQVIgICBUb2tlbjsKKy8vIFNlcXVlbmNlIGlzIHRvIGZpbGwgZXZlcnkgb3V0Z29pbmcgUW9TIERBVEEgZnJhbWUncyBzZXF1ZW5jZSBmaWVsZCBpbiA4MDIuMTEgaGVhZGVyLgorCVVTSE9SVAlTZXF1ZW5jZTsKKwlVU0hPUlQJVGltZU91dFZhbHVlOworCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXM7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCBPUklCQVRpbWVyOworCVBWT0lECXBBZGFwdGVyOworfSBCQV9PUklfRU5UUlksICpQQkFfT1JJX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfQkFfUkVDX0VOVFJZIHsKKwlVQ0hBUiAgIFdjaWQ7CisJVUNIQVIgICBUSUQ7CisJVUNIQVIgICBCQVdpblNpemU7CS8vIDcuMy4xLjE0LiBlYWNoIGJ1ZmZlciBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgYSBtYXggQU1TRFUgb3IgTVNEVS4KKwkvL1VDSEFSCU51bU9mUnhQa3Q7CisJLy9VQ0hBUiAgICBDdXJpbmRpZHg7IC8vIHRoZSBoZWFkIGluIHRoZSBSWCByZW9yZGVyaW5nIGJ1ZmZlcgorCVVTSE9SVAkJTGFzdEluZFNlcTsKKy8vCVVTSE9SVAkJTGFzdEluZFNlcUF0VGltZXI7CisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCBSRUNCQVRpbWVyOworCVVMT05HCQlMYXN0SW5kU2VxQXRUaW1lcjsKKwlVTE9ORwkJbkRyb3BQYWNrZXQ7CisJVUxPTkcJCXJjdlNlcTsKKwlSRUNfQkxPQ0tBQ0tfU1RBVFVTICBSRUNfQkFfU3RhdHVzOworLy8JVUNIQVIJUnhCdWZJZHhVc2VkOworCS8vIGNvcnJlc3BvbmRpbmcgdmlydHVhbCBhZGRyZXNzIGZvciBSWCByZW9yZGVyaW5nIHBhY2tldCBzdG9yYWdlLgorCS8vUlRNUF9SRU9SREVSRE1BQlVGIE1BUF9SWEJ1ZltNQVhfUlhfUkVPUkRFUkJVRl07CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgUnhSZVJpbmdMb2NrOyAgICAgICAgICAgICAgICAgLy8gUnggUmluZyBzcGlubG9jaworLy8Jc3RydWN0IF9CQV9SRUNfRU5UUlkgKnBOZXh0OworCVBWT0lECXBBZGFwdGVyOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QJbGlzdDsKK30gQkFfUkVDX0VOVFJZLCAqUEJBX1JFQ19FTlRSWTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJVUxPTkcJCW51bUFzUmVjaXBpZW50OwkJLy8gSSBhbSByZWNpcGllbnQgb2YgbnVtQXNSZWNpcGllbnQgY2xpZW50cy4gVGhlc2UgY2xpZW50IGFyZSBpbiB0aGUgQkFSZWNFbnRyeVtdCisJVUxPTkcJCW51bUFzT3JpZ2luYXRvcjsJLy8gSSBhbSBvcmlnaW5hdG9yIG9mIAludW1Bc09yaWdpbmF0b3IgY2xpZW50cy4gVGhlc2UgY2xpZW50cyBhcmUgaW4gdGhlIEJBT3JpRW50cnlbXQorCUJBX09SSV9FTlRSWSAgICAgICBCQU9yaUVudHJ5W01BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFXTsKKwlCQV9SRUNfRU5UUlkgICAgICAgQkFSZWNFbnRyeVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07Cit9IEJBX1RBQkxFLCAqUEJBX1RBQkxFOworCisvL0ZvciBRdXJleUJBVGFibGVPSUQgdXNlOwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRCBfT0lEX0JBX1JFQ19FTlRSWXsKKwlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIEJhQml0bWFwOyAgIC8vIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplCisJVUNIQVIgICByc3Y7CisJVUNIQVIgICBCdWZTaXplWzhdOworCVJFQ19CTE9DS0FDS19TVEFUVVMJUkVDX0JBX1N0YXR1c1s4XTsKK30gT0lEX0JBX1JFQ19FTlRSWSwgKlBPSURfQkFfUkVDX0VOVFJZOworCisvL0ZvciBRdXJleUJBVGFibGVPSUQgdXNlOwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRCBfT0lEX0JBX09SSV9FTlRSWXsKKwlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIEJhQml0bWFwOyAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUsIHJlYWQgT1JJX0JBX1N0YXR1c1tUSURdIGZvciBzdGF0dXMKKwlVQ0hBUiAgIHJzdjsKKwlVQ0hBUiAgIEJ1ZlNpemVbOF07CisJT1JJX0JMT0NLQUNLX1NUQVRVUyAgT1JJX0JBX1N0YXR1c1s4XTsKK30gT0lEX0JBX09SSV9FTlRSWSwgKlBPSURfQkFfT1JJX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUVVFUllCQV9UQUJMRXsKKwlPSURfQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbMzJdOworCU9JRF9CQV9SRUNfRU5UUlkgICAgICAgQkFSZWNFbnRyeVszMl07CisJVUNIQVIgICBPcmlOdW07Ly8gTnVtYmVyIG9mIGJlbG93IEJBT3JpRW50cnkKKwlVQ0hBUiAgIFJlY051bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFSZWNFbnRyeQorfSBRVUVSWUJBX1RBQkxFLCAqUFFVRVJZQkFfVEFCTEU7CisKK3R5cGVkZWYJdW5pb24JX0JBQ0FQX1NUUlVDCXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0CXsKKwkJVUlOVDMyICAgICA6NDsKKwkJVUlOVDMyICAgICBiMjA0MENvZXhpc3RTY2FuU3VwOjE7CQkvL0FzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4KKwkJVUlOVDMyICAgICBiSHRBZGhvYzoxOwkJCS8vIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4KKwkJVUlOVDMyICAgICBNTVBTbW9kZToyOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKKwkJVUlOVDMyICAgICBBbXNkdVNpemU6MTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKKwkJVUlOVDMyICAgICBBbXNkdUVuYWJsZToxOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCisJCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwkJVUlOVDMyCQlQb2xpY3k6MjsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZQorCQlVSU5UMzIJCUF1dG9CQToxOwkvLyBhdXRvbWF0aWNhbGx5IEJBCisJCVVJTlQzMgkJVHhCQVdpbkxpbWl0Ojg7CisJCVVJTlQzMgkJUnhCQVdpbkxpbWl0Ojg7CisJfQlmaWVsZDsKKyNlbHNlCisJc3RydWN0CXsKKwkJVUlOVDMyCQlSeEJBV2luTGltaXQ6ODsKKwkJVUlOVDMyCQlUeEJBV2luTGltaXQ6ODsKKwkJVUlOVDMyCQlBdXRvQkE6MTsJLy8gYXV0b21hdGljYWxseSBCQQorCQlVSU5UMzIJCVBvbGljeToyOwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlCisJCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwkJVUlOVDMyICAgICAgIAlBbXNkdUVuYWJsZToxOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCisJCVVJTlQzMiAgICAgICAJQW1zZHVTaXplOjE7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07CisJCVVJTlQzMiAgICAgICAJTU1QU21vZGU6MjsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCisJCVVJTlQzMiAgICAgICAJYkh0QWRob2M6MTsJCQkvLyBhZGhvYyBjYW4gdXNlIGh0IHJhdGUuCisJCVVJTlQzMiAgICAgICAJYjIwNDBDb2V4aXN0U2NhblN1cDoxOwkJLy9BcyBTdGEsIHN1cHBvcnQgZG8gMjA0MCBjb2V4aXN0ZW5jZSBzY2FuIGZvciBBUC4gQXMgQXAsIHN1cHBvcnQgbW9uaXRvciB0cmlnZ2VyIGV2ZW50IHRvIGNoZWNrIGlmIGNhbiB1c2UgQlcgNDBNSHouCisJCVVJTlQzMiAgICAgICAJOjQ7CisJfQlmaWVsZDsKKyNlbmRpZgorCVVJTlQzMgkJCXdvcmQ7Cit9IEJBQ0FQX1NUUlVDLCAqUEJBQ0FQX1NUUlVDOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvL1RoaXMgc3RydWN0dXJlIGlzIGZvciBhbGwgODAyLjExbiBjYXJkIEludGVyT3B0aWJpbGl0eVRlc3QgYWN0aW9uLiBSZXNldCBhbGwgTnVtIGV2ZXJ5IG4gc2Vjb25kLiAgKERldGFpbHMgc2VlIE1MTUVQZXJpb2RpYykKK3R5cGVkZWYJc3RydWN0CV9JT1RfU1RSVUMJeworCVVDSEFSCQkJVGhyZXNob2xkWzJdOworCVVDSEFSCQkJUmVvcmRlclRpbWVPdXROdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzBdCisJVUNIQVIJCQlSZWZyZXNoTnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFsxXQorCVVMT05HCQkJT25lU2VjSW5XaW5kb3dDb3VudDsKKwlVTE9ORwkJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7CisJVUxPTkcJCQlPbmVTZWNPdXRXaW5kb3dDb3VudDsKKwlVQ0hBUgkJCURlbE9yaUFjdDsKKwlVQ0hBUgkJCURlbFJlY0FjdDsKKwlVQ0hBUgkJCVJUU1Nob3J0UHJvdDsKKwlVQ0hBUgkJCVJUU0xvbmdQcm90OworCUJPT0xFQU4JCQliUlRTTG9uZ1Byb3RPbjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlCT09MRUFOCQkJYkxhc3RBdGhlcm9zOworICAgIEJPT0xFQU4JCQliQ3VycmVudEF0aGVyb3M7CisgICAgQk9PTEVBTiAgICAgICAgIGJOb3dBdGhlcm9zQnVyc3RPbjsKKwlCT09MRUFOCQkJYk5leHREaXNhYmxlUnhCQTsKKyAgICBCT09MRUFOCQkJYlRvZ2dsZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30gSU9UX1NUUlVDLCAqUElPVF9TVFJVQzsKKworLy8gVGhpcyBpcyB0aGUgcmVnaXN0cnkgc2V0dGluZyBmb3IgODAyLjExbiB0cmFuc21pdCBzZXR0aW5nLiAgVXNlZCBpbiBhZHZhbmNlZCBwYWdlLgordHlwZWRlZiB1bmlvbiBfUkVHX1RSQU5TTUlUX1NFVFRJTkcgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyBzdHJ1Y3QgeworICAgICAgICAgVUlOVDMyICByc3Y6MTM7CisJCSBVSU5UMzIgIEVYVENIQToyOworCQkgVUlOVDMyICBIVE1PREU6MTsKKwkJIFVJTlQzMiAgVFJBTlNOTzoyOworCQkgVUlOVDMyICBTVEJDOjE7IC8vU1BBQ0UKKwkJIFVJTlQzMiAgU2hvcnRHSToxOworCQkgVUlOVDMyICBCVzoxOyAvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCQkgVUlOVDMyICBUeEJGOjE7IC8vIDMqMworCQkgVUlOVDMyICByc3YwOjEwOworCQkgLy9VSU5UMzIgIE1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisgICAgICAgICAvL1VJTlQzMiAgUGh5TW9kZTo0OworICAgIH0gZmllbGQ7CisjZWxzZQorIHN0cnVjdCB7CisgICAgICAgICAvL1VJTlQzMiAgUGh5TW9kZTo0OworICAgICAgICAgLy9VSU5UMzIgIE1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJCSBVSU5UMzIgIHJzdjA6MTA7CisJCSBVSU5UMzIgIFR4QkY6MTsKKyAgICAgICAgIFVJTlQzMiAgQlc6MTsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKyAgICAgICAgIFVJTlQzMiAgU2hvcnRHSToxOworICAgICAgICAgVUlOVDMyICBTVEJDOjE7IC8vU1BBQ0UKKyAgICAgICAgIFVJTlQzMiAgVFJBTlNOTzoyOworICAgICAgICAgVUlOVDMyICBIVE1PREU6MTsKKyAgICAgICAgIFVJTlQzMiAgRVhUQ0hBOjI7CisgICAgICAgICBVSU5UMzIgIHJzdjoxMzsKKyAgICB9IGZpZWxkOworI2VuZGlmCisgVUlOVDMyICAgd29yZDsKK30gUkVHX1RSQU5TTUlUX1NFVFRJTkcsICpQUkVHX1RSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgdW5pb24gIF9ERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QJeworCQkJVVNIT1JUCQlyc3Y6MzsKKwkJCVVTSE9SVAkJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCisJCQlVU0hPUlQJCVBoeU1vZGU6NDsKKwkJCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCX0JZmllbGQ7CisjZWxzZQorCXN0cnVjdAl7CisJCQlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAJLy8gTUNTCisJCQlVU0hPUlQJCVBoeU1vZGU6NDsKKwkJCVVTSE9SVAkgCUZpeGVkVHhNb2RlOjI7CQkJLy8gSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLgorCQkJVVNIT1JUCQlyc3Y6MzsKKwl9CWZpZWxkOworI2VuZGlmCisJVVNIT1JUCQl3b3JkOworIH0gREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HLCAqUERFU0lSRURfVFJBTlNNSVRfU0VUVElORzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJPT0xFQU4JCUlzUmVjaXBpZW50OworCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgVElEOworCVVDSEFSICAgbk1TRFU7CisJVVNIT1JUICAgVGltZU91dDsKKwlCT09MRUFOIGJBbGxUaWQ7ICAvLyBJZiBUcnVlLCBkZWxldGUgYWxsIFRJRCBmb3IgQkEgc2Vzc2lvbnMgd2l0aCB0aGlzIE1BQ2FkZHIuCit9IE9JRF9BRERfQkFfRU5UUlksICpQT0lEX0FERF9CQV9FTlRSWTsKKworLy8KKy8vIE11bHRpcGxlIFNTSUQgc3RydWN0dXJlCisvLworI2RlZmluZSBXTEFOX01BWF9OVU1fT0ZfVElNCQkJKChNQVhfTEVOX09GX01BQ19UQUJMRSA+PiAzKSArIDEpIC8qIC84ICsgMSAqLworI2RlZmluZSBXTEFOX0NUX1RJTV9CQ01DX09GRlNFVAkJMCAvKiB1bml0OiAzMkIgKi8KKworLyogY2xlYXIgYmNtYyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfQ0xFQVIoYXBpZHgpIFwKKwlwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1tXTEFOX0NUX1RJTV9CQ01DX09GRlNFVF0gJj0gfkJJVDhbMF07CisKKy8qIHNldCBiY21jIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQkNNQ19TRVQoYXBpZHgpIFwKKwlwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1tXTEFOX0NUX1RJTV9CQ01DX09GRlNFVF0gfD0gQklUOFswXTsKKworLyogY2xlYXIgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQklUX0NMRUFSKGFkX3AsIGFwaWR4LCB3Y2lkKSBcCisJewlVQ0hBUiB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCisJCVVDSEFSIGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCisJCWFkX3AtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1t0aW1fb2Zmc2V0XSAmPSAofkJJVDhbYml0X29mZnNldF0pOyB9CisKKy8qIHNldCBhIHN0YXRpb24gUFMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CSVRfU0VUKGFkX3AsIGFwaWR4LCB3Y2lkKSBcCisJewlVQ0hBUiB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCisJCVVDSEFSIGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCisJCWFkX3AtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1t0aW1fb2Zmc2V0XSB8PSBCSVQ4W2JpdF9vZmZzZXRdOyB9CisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgQkVBQ09OX0JJVE1BUF9NQVNLCQkweGZmCit0eXBlZGVmIHN0cnVjdCBfQkVBQ09OX1NZTkNfU1RSVUNUXworeworCVVDSEFSICAgICAgICAJCQlCZWFjb25CdWZbSFdfQkVBQ09OX01BWF9DT1VOVF1bSFdfQkVBQ09OX09GRlNFVF07CisJVUNIQVIJCQkJCUJlYWNvblR4V0lbSFdfQkVBQ09OX01BWF9DT1VOVF1bVFhXSV9TSVpFXTsKKwlVTE9ORyAJCQkJCVRpbUlFTG9jYXRpb25JbkJlYWNvbltIV19CRUFDT05fTUFYX0NPVU5UXTsKKwlVTE9ORwkJCQkJQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOworCUJPT0xFQU4JCQkJCUVuYWJsZUJlYWNvbjsJCS8vIHRyaWdnZXIgdG8gZW5hYmxlIGJlYWNvbiB0cmFuc21pc3Npb24uCisJVUNIQVIJCQkJCUJlYWNvbkJpdE1hcDsJCS8vIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkIHRvIGNoYW5nZS4KKwlVQ0hBUgkJCQkJRHRpbUJpdE9uOwkJCS8vIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkIHRvIGNoYW5nZS4KK31CRUFDT05fU1lOQ19TVFJVQ1Q7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK3R5cGVkZWYgc3RydWN0IF9NVUxUSVNTSURfU1RSVUNUIHsKKwlVQ0hBUgkJCQkJCQkJQnNzaWRbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2lkTGVuOworICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKworICAgIFBORVRfREVWICAgICAgICAgICAgICAgICAgIAkJCU1TU0lERGV2OworCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJR3JvdXBLZXlXZXBTdGF0dXM7CisJV1BBX01JWF9QQUlSX0NJUEhFUgkJCQkJV3BhTWl4UGFpckNpcGhlcjsKKworCVVMT05HCQkJCQkJCQlUeENvdW50OworCVVMT05HCQkJCQkJCQlSeENvdW50OworCVVMT05HCQkJCQkJCQlSZWNlaXZlZEJ5dGVDb3VudDsKKwlVTE9ORwkJCQkJCQkJVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisJVUxPTkcJCQkJCQkJCVJ4RXJyb3JDb3VudDsKKwlVTE9ORwkJCQkJCQkJUnhEcm9wQ291bnQ7CisKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisJUlRfSFRfUEhZX0lORk8JCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4gdGhpcyBpcyBmb3IgcmVhZGluZyByZWdpc3RyeSBzZXR0aW5nIG9ubHkuIG5vdCB1c2VmdWwuCisJQk9PTEVBTgkJCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisKKwkvL0NJUEhFUl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZEtleVtTSEFSRV9LRVlfTlVNXTsgLy8gcmVmIHBBZC0+U2hhcmVkS2V5W0JTU11bNF0KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5SWQ7CisKKwlVQ0hBUgkJCQkJCQkJVHhSYXRlOyAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEsIC4uLgorCVVDSEFSICAgICAJCQkJCQkJRGVzaXJlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsvLyBPSURfODAyXzExX0RFU0lSRURfUkFURVMKKwlVQ0hBUgkJCQkJCQkJRGVzaXJlZFJhdGVzSW5kZXg7CisJVUNIQVIgICAgIAkJCQkJCQlNYXhUeFJhdGU7ICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCisKKy8vCVVMT05HICAgICAgICAgICAJCQkJCVRpbUJpdG1hcDsgICAgICAvLyBiaXQwIGZvciBicm9hZGNhc3QsIDEgZm9yIEFJRDEsIDIgZm9yIEFJRDIsIC4uLnNvIG9uCisvLyAgICBVTE9ORyAgICAgICAgICAgCQkJCQlUaW1CaXRtYXAyOyAgICAgLy8gYjAgZm9yIEFJRDMyLCBiMSBmb3IgQUlEMzMsIC4uLiBhbmQgc28gb24KKwlVQ0hBUgkJCQkJCQkJVGltQml0bWFwc1tXTEFOX01BWF9OVU1fT0ZfVElNXTsKKworICAgIC8vIFdQQQorICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNS1szMl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1LWzMyXTsKKwlVQ0hBUgkJCQkJCQkJR1RLWzMyXTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMVg7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlQXV0aDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTm9uY2VbMzJdOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRTZWN1cmVkOworICAgIE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICAgICAgICAgIFByaXZhY3lGaWx0ZXI7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFOQ2xhc3MzRGF0YTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOworCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOSUVfTGVuWzJdOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTl9JRVsyXVtNQVhfTEVOX09GX1JTTklFXTsKKworCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgCQkJVGltSUVMb2NhdGlvbkluQmVhY29uOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIAkJCUNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbjsKKyAgICAvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYV0kKKwkvLyBQVFhXSV9TVFJVQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvblR4V0k7IC8vCisgICAgQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uQnVmW01BWF9CRUFDT05fU0laRV07IC8vIE5PVEU6IEJlYWNvbkJ1ZiBzaG91bGQgYmUgNC1ieXRlIGFsaWduZWQKKworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIaWRlU3NpZDsKKwlVSU5UMTYJCQkJCQkJCVN0YXRpb25LZWVwQWxpdmVUaW1lOyAvLyB1bml0OiBzZWNvbmQKKworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZMQU5fVklEOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZMQU5fUHJpb3JpdHk7CisKKyAgICBSVF84MDJfMTFfQUNMCQkJCQkJQWNjZXNzQ29udHJvbExpc3Q7CisKKwkvLyBFRENBIFFvcworICAgIEJPT0xFQU4JCQkJCQkJCWJXbW1DYXBhYmxlOwkvLyAwOmRpc2FibGUgV01NLCAxOmVuYWJsZSBXTU0KKyAgICBCT09MRUFOCQkJCQkJCQliRExTQ2FwYWJsZTsJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCisKKwlVQ0hBUiAgICAgICAgICAgCQkJCQlEbHNQVEtbNjRdOwkJLy8gRHVlIHRvIHdpbmRvd3MgZGlydmVyIGNvdW50IG9uIG1lZXRpbmdob3VzZSB0byBoYW5kbGUgNC13YXkgc2hha2UKKworCS8vIEZvciA4MDIuMXggZGFlbW9uIHNldHRpbmcgcGVyIEJTUworCVVDSEFSCQkJCQkJCQlyYWRpdXNfc3J2X251bTsKKwlSQURJVVNfU1JWX0lORk8JCQkJCQlyYWRpdXNfc3J2X2luZm9bTUFYX1JBRElVU19TUlZfTlVNXTsKKworI2lmZGVmIFJUTDg2NVhfU09DCisJdW5zaWduZWQgaW50CQkJCQkJbXlsaW5raWQ7CisjZW5kaWYKKworCisJVUlOVDMyCQkJCQlSY3ZkQ29uZmxpY3RTc2lkQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEFzc29jUmVzcENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRSZWFzc29jUmVzcENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRQcm9iZVJlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQmVhY29uQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZERpc2Fzc29jQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEF1dGhDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkRGVhdXRoQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFVua25vd25NZ210Q291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkUmVwbGF5QXR0YWNrQ291bnQ7CisKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkQ29uZmxpY3RTc2lkOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQXNzb2NSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkUmVhc3NvY1Jlc3A7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRQcm9iZVJlc3A7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRCZWFjb247CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWREaXNhc3NvYzsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEF1dGg7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWREZWF1dGg7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRVbmtub3duTWdtdDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkUmVwbGF5QXR0YWNrOworCisJQk9PTEVBTgkJCQkJYkJjblNudFJlcTsKKwlVQ0hBUgkJCQkJQmNuQnVmSWR4OworfSBNVUxUSVNTSURfU1RSVUNULCAqUE1VTFRJU1NJRF9TVFJVQ1Q7CisKKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMwordHlwZWRlZiBlbnVtIF9CU1MyMDQwQ09FWElTVF9GTEFHeworCUJTU18yMDQwX0NPRVhJU1RfRElTQUJMRSA9IDAsCisJQlNTXzIwNDBfQ09FWElTVF9USU1FUl9GSVJFRCAgPSAxLAorCUJTU18yMDQwX0NPRVhJU1RfSU5GT19TWU5DID0gMiwKKwlCU1NfMjA0MF9DT0VYSVNUX0lORk9fTk9USUZZID0gNCwKK31CU1MyMDQwQ09FWElTVF9GTEFHOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworLy8gY29uZmlndXJhdGlvbiBjb21tb24gdG8gT1BNT0RFX0FQIGFzIHdlbGwgYXMgT1BNT0RFX1NUQQordHlwZWRlZiBzdHJ1Y3QgX0NPTU1PTl9DT05GSUcgeworCisJQk9PTEVBTgkJYkNvdW50cnlGbGFnOworCVVDSEFSCQlDb3VudHJ5Q29kZVszXTsKKwlVQ0hBUgkJR2VvZ3JhcGh5OworCVVDSEFSICAgICAgIENvdW50cnlSZWdpb247ICAgICAgLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiwgMDpGQ0MsIDE6SUMsIDI6RVRTSSwgMzpTUEFJTiwgNDpGcmFuY2UsIDU6TUtLLCA2Ok1LSzEsIDc6SXNyYWVsCisJVUNIQVIgICAgICAgQ291bnRyeVJlZ2lvbkZvckFCYW5kOwkvLyBFbnVtIG9mIGNvdW50cnkgcmVnaW9uIGZvciBBIGJhbmQKKwlVQ0hBUiAgICAgICBQaHlNb2RlOyAgICAgICAgICAgIC8vIFBIWV8xMUEsIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfQUJHX01JWEVECisJVVNIT1JUICAgICAgRHNpZnM7ICAgICAgICAgICAgICAvLyBpbiB1bml0cyBvZiB1c2VjCisJVUxPTkcgICAgICAgUGFja2V0RmlsdGVyOyAgICAgICAvLyBQYWNrZXQgZmlsdGVyIGZvciByZWNlaXZpbmcKKworCUNIQVIgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy8gTk9UIE5VTEwtdGVybWluYXRlZAorCVVDSEFSICAgICAgIFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCisJVUNIQVIgICAgICAgTGFzdFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCisJQ0hBUiAgICAgICAgTGFzdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy8gTk9UIE5VTEwtdGVybWluYXRlZAorCVVDSEFSCQlMYXN0QnNzaWRbTUFDX0FERFJfTEVOXTsKKworCVVDSEFSICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgQmVhY29uUGVyaW9kOworCVVDSEFSICAgICAgIENoYW5uZWw7CisJVUNIQVIgICAgICAgQ2VudHJhbENoYW5uZWw7ICAgIAkvLyBDZW50cmFsIENoYW5uZWwgd2hlbiB1c2luZyA0ME1IeiBpcyBpbmRpY2F0aW5nLiBub3QgcmVhbCBjaGFubmVsLgorCisjaWYgMAkvLyBtb3ZlIHRvIFNUQV9BRE1JTl9DT05GSUcKKwlVQ0hBUiAgICAgICBEZWZhdWx0S2V5SWQ7CisKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOyAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlPcmlnV2VwU3RhdHVzOwkvLyBPcmlnaW5hbCB3ZXAgc3RhdHVzIHNldCBmcm9tIE9JRAorCisJLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQorCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCisJVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OworCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgR3JvdXBLZXlXZXBTdGF0dXM7CisjZW5kaWYKKworCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBEZXNpcmVSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsgICAgICAvLyBPSURfODAyXzExX0RFU0lSRURfUkFURVMKKwlVQ0hBUiAgICAgICBNYXhEZXNpcmVkUmF0ZTsKKwlVQ0hBUiAgICAgICBFeHBlY3RlZEFDS1JhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCisJVUxPTkcgICAgICAgQmFzaWNSYXRlQml0bWFwOyAgICAgICAgLy8gYmFja3VwIGJhc2ljIHJhdGViaXRtYXAKKworCUJPT0xFQU4JCWJBUFNEQ2FwYWJsZTsKKwlCT09MRUFOCQliSW5TZXJ2aWNlUGVyaW9kOworCUJPT0xFQU4JCWJBUFNEQUNfQkU7CisJQk9PTEVBTgkJYkFQU0RBQ19CSzsKKwlCT09MRUFOCQliQVBTREFDX1ZJOworCUJPT0xFQU4JCWJBUFNEQUNfVk87CisJQk9PTEVBTgkJYk5lZWRTZW5kVHJpZ2dlckZyYW1lOworCUJPT0xFQU4JCWJBUFNERm9yY2VQb3dlclNhdmU7CS8vIEZvcmNlIHBvd2VyIHNhdmUgbW9kZSwgc2hvdWxkIG9ubHkgdXNlIGluIEFQU0QtU1RBVVQKKwlVTE9ORwkJVHJpZ2dlclRpbWVyQ291bnQ7CisJVUNIQVIJCU1heFNQTGVuZ3RoOworCVVDSEFSCQlCQlBDdXJyZW50Qlc7CS8vIEJXXzEwLCAJQldfMjAsIEJXXzQwCisJLy8gbW92ZSB0byBNVUxUSVNTSURfU1RSVUNUIGZvciBNQlNTCisJLy9IVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KKwlSRUdfVFJBTlNNSVRfU0VUVElORyAgICAgICAgUmVnVHJhbnNtaXRTZXR0aW5nOyAvL3JlZ2lzdHJ5IHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgorCS8vVUNIQVIgICAgICAgRml4ZWRUeE1vZGU7ICAgICAgICAgICAgICAvLyBGaXhlZCBUeCBNb2RlIChDQ0ssIE9GRE0pLCBmb3IgSFQgZml4ZWQgdHggbW9kZSAoR0YsIE1JWCkgLCByZWZlciB0byBSZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNb2RlCisJVUNIQVIgICAgICAgVHhSYXRlOyAgICAgICAgICAgICAgICAgLy8gU2FtZSB2YWx1ZSB0byBmaWxsIGluIFRYRC4gVHhSYXRlIGlzIDYtYml0CisJVUNIQVIgICAgICAgTWF4VHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCisJVUNIQVIgICAgICAgVHhSYXRlSW5kZXg7ICAgICAgICAgICAgLy8gVHggcmF0ZSBpbmRleCBpbiBSYXRlU3dpdGNoVGFibGUKKwlVQ0hBUiAgICAgICBUeFJhdGVUYWJsZVNpemU7ICAgICAgICAvLyBWYWxpZCBUeCByYXRlIHRhYmxlIHNpemUgaW4gUmF0ZVN3aXRjaFRhYmxlCisJLy9CT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwlVQ0hBUiAgICAgICBNaW5UeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKwlVQ0hBUiAgICAgICBSdHNSYXRlOyAgICAgICAgICAgICAgICAvLyBSQVRFX3h4eAorCUhUVFJBTlNNSVRfU0VUVElORwlNbG1lVHJhbnNtaXQ7ICAgLy8gTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4KKwlVQ0hBUiAgICAgICBNbG1lUmF0ZTsgICAgICAgICAgICAgICAvLyBSQVRFX3h4eCwgdXNlZCB0byBzZW5kIE1MTUUgZnJhbWVzCisJVUNIQVIgICAgICAgQmFzaWNNbG1lUmF0ZTsgICAgICAgICAgLy8gRGVmYXVsdCBSYXRlIGZvciBzZW5kaW5nIE1MTUUgZnJhbWVzCisKKwlVU0hPUlQgICAgICBSdHNUaHJlc2hvbGQ7ICAgICAgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKKwlVU0hPUlQgICAgICBGcmFnbWVudFRocmVzaG9sZDsgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKKworCVVDSEFSICAgICAgIFR4UG93ZXI7ICAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgbVcKKwlVTE9ORyAgICAgICBUeFBvd2VyUGVyY2VudGFnZTsgICAgICAvLyAwfjEwMCAlCisJVUxPTkcgICAgICAgVHhQb3dlckRlZmF1bHQ7ICAgICAgICAgLy8ga2VlcCBmb3IgVHhQb3dlclBlcmNlbnRhZ2UKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJBQ0FQX1NUUlVDICAgICAgICBCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKKwlCQUNBUF9TVFJVQyAgICAgICAgUkVHQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJSU9UX1NUUlVDCQlJT1Rlc3RQYXJtOwkvLyA4MDIuMTFuIEludGVyT3BiaWxpdHkgVGVzdCBQYXJhbWV0ZXI7CisJVUxPTkcgICAgICAgVHhQcmVhbWJsZTsgICAgICAgICAgICAgLy8gUnQ4MDJfMTFQcmVhbWJsZUxvbmcsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KKwlCT09MRUFOICAgICBiVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50OyAgICAgLy8gTWljcm9zb2Z0IHVzZSAwIGFzIGRpc2FibGUKKwlVTE9ORyAgICAgICBVc2VCR1Byb3RlY3Rpb247ICAgICAgICAvLyAwOiBhdXRvLCAxOiBhbHdheXMgdXNlLCAyOiBhbHdheXMgbm90IHVzZQorCUJPT0xFQU4gICAgIGJVc2VTaG9ydFNsb3RUaW1lOyAgICAgIC8vIDA6IGRpc2FibGUsIDEgLSB1c2Ugc2hvcnQgc2xvdCAoOXVzKQorCUJPT0xFQU4gICAgIGJFbmFibGVUeEJ1cnN0OyAgICAgICAgIC8vIDE6IGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCwgMDogZGlzYWJsZSBUWCBQQUNLRVQgQlVSU1QKKwlCT09MRUFOICAgICBiQWdncmVnYXRpb25DYXBhYmxlOyAgICAgIC8vIDE6IGVuYWJsZSBUWCBhZ2dyZWdhdGlvbiB3aGVuIHRoZSBwZWVyIHN1cHBvcnRzIGl0CisJQk9PTEVBTiAgICAgYlBpZ2d5QmFja0NhcGFibGU7CQkvLyAxOiBlbmFibGUgVFggcGlnZ3ktYmFjayBhY2NvcmRpbmcgTUFDJ3MgdmVyc2lvbgorCUJPT0xFQU4gICAgIGJJRUVFODAyMTFIOwkJCS8vIDE6IGVuYWJsZSBJRUVFODAyLjExaCBzcGVjLgorCVVMT05HCQlEaXNhYmxlT0xCQ0RldGVjdDsJCS8vIDA6IGVuYWJsZSBPTEJDIGRldGVjdDsgMSBkaXNhYmxlIE9MQkMgZGV0ZWN0CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOCQkJCWJSZGc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJQk9PTEVBTiAgICAgICAgICAgICBiV21tQ2FwYWJsZTsgICAgICAgIC8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQorCVFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJVUNIQVIgICAgICAgICAgICAgICBBY2tQb2xpY3lbNF07ICAgICAgIC8vIEFDSyBwb2xpY3kgb2YgdGhlIHNwZWNpZmllZCBBQy4gc2VlIEFDS194eHgKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlCT09MRUFOCQkJCWJETFNDYXBhYmxlOwkJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCisJLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQorCS8vIE9QU1RBVFVTX1RFU1RfRkxBRygpLCBPUFNUQVRVU19TRVRfRkxBRygpLCBPUF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KKwkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uCisJVUxPTkcgICAgICAgICAgICAgICBPcFN0YXR1c0ZsYWdzOworCisJQk9PTEVBTgkJCQlOZGlzUmFkaW9TdGF0ZU9mZjsgLy9Gb3IgSENUIDEyLjAsIHNldCB0aGlzIGZsYWcgdG8gVFJVRSBpbnN0ZWFkIG9mIGNhbGxlZCBNbG1lUmFkaW9PZmYuCisJQUJHQkFORF9TVEFURQkJQmFuZFN0YXRlOwkJLy8gRm9yIHNldHRpbmcgQkJQIHVzZWQgb24gQi9HIG9yIEEgbW9kZS4KKworCS8vIElFRUU4MDIuMTFILS1ERlMuCisJUkFEQVJfREVURUNUX1NUUlVDVAlSYWRhckRldGVjdDsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwlDQVJSSUVSX0RFVEVDVElPTgkJQ2FycmllckRldGVjdDsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBIVAorCVVDSEFSCQkJQkFTaXplOwkJLy8gVVNlciBkZXNpcmVkIEJBV2luZG93U2l6ZS4gU2hvdWxkIG5vdCBleGNlZWQgb3VyIG1heCBjYXBhYmlsaXR5CisJLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCVJUX0hUX0NBUEFCSUxJVFkJRGVzaXJlZEh0UGh5OworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSFRJbmZvOwkvLyBVc2VmdWwgYXMgQVAuCisJLy9UaGlzIElFIGlzIHVzZWQgd2l0aCBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgZWxlbWVudCB3aGVuIGNoYW5naW5nIHRvIGEgbmV3IDQwTUh6LgorCS8vVGhpcyBJRSBpcyBpbmNsdWRlZCBpbiBjaGFubmVsIHN3aXRjaCBhbW1vdW5jZW1lbnQgZnJhbWVzIDcuNC4xLjUsIGJlYWNvbnMsIHByb2JlIFJzcC4KKwlORVdfRVhUX0NIQU5fSUUJTmV3RXh0Q2hhbk9mZnNldDsJLy83LjMuMi4yMEEsIDEgaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbCwgMyBpZiBiZWxvdywgMCBpZiBub3QgcHJlc2VudAorCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCVVDSEFSCQkJCQlCc3MyMDQwQ29leGlzdEZsYWc7CQkvLyBiaXQgMDogYkJzc0NvZXhpc3RUaW1lclJ1bm5pbmcsIGJpdCAxOiBOZWVkU3luY0FkZEh0SW5mby4KKwlSQUxJTktfVElNRVJfU1RSVUNUCUJzczIwNDBDb2V4aXN0VGltZXI7CisKKwkvL1RoaXMgSUUgaXMgdXNlZCBmb3IgMjAvNDAgQlNTIENvZXhpc3RlbmNlLgorCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJTUzIwNDBDb2V4aXN0SW5mbzsKKwkvLyA9PT09PT0gMTFuIEQzLjAgPT09PT09PT09PT09PT09PT09PT09PT0+CisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsOwkJCQkvLyBVbml0IDogVFUuIDV+MTAwMAorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2ZUR3ZWxsOwkJCQkvLyBVbml0IDogVFUuIDEwfjEwMDAKKwlVU0hPUlQJCQkJCURvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludDsJCQkvLyBVbml0IDogU2Vjb25kCisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjB+MTAwMDAKKwlVU0hPUlQJCQkJCURvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yOworCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2aXR5VGhyZTsJCQkJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKKworCVVMT05HCQkJCQlEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsJCQkvLyBtdWx0aXBsZSBvZiAoRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpCisJVUxPTkcJCQkJCUNvdW50RG93bkN0cjsJLy8gQ291bnREb3duIENvdW50ZXIgZnJvbSAoRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpCisKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBUcmlnZ2VyRXZlbnRUYWJMb2NrOworCUJTU18yMDQwX0NPRVhJU1RfSUUJCUxhc3RCU1NDb2V4aXN0MjA0MDsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCU1NDb2V4aXN0MjA0MDsKKwlUUklHR0VSX0VWRU5UX1RBQgkJVHJpZ2dlckV2ZW50VGFiOworCVVDSEFSCQkJCQlDaGFubmVsTGlzdElkeDsKKwkvLyA8PT09PT09IDExbiBEMy4wID09PT09PT09PT09PT09PT09PT09PT09CisJQk9PTEVBTgkJCQkJYk92ZXJsYXBTY2FubmluZzsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiSFRQcm90ZWN0OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJNSU1PUFNFbmFibGU7CisgICAgQk9PTEVBTgkJCQkJYkJBRGVjbGluZTsKKwlCT09MRUFOCQkJCQliRGlzYWJsZVJlb3JkZXJpbmc7CisJQk9PTEVBTgkJCQkJYkZvcnR5X01oel9JbnRvbGVyYW50OworCUJPT0xFQU4JCQkJCWJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50OworCUJPT0xFQU4JCQkJCWJSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHM7CisJVUxPTkcJCQkJCUxhc3RSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHNUaW1lOworCisJVUNIQVIJCQkJCVR4QkFTaXplOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gRW5hYmxlIHdpcmVsZXNzIGV2ZW50CisJQk9PTEVBTgkJCQliV2lyZWxlc3NFdmVudDsKKwlCT09MRUFOCQkJCWJXaUZpVGVzdDsJCQkJLy8gRW5hYmxlIHRoaXMgcGFyYW1ldGVyIGZvciBXaUZpIHRlc3QKKworCS8vIFR4ICYgUnggU3RyZWFtIG51bWJlciBzZWxlY3Rpb24KKwlVQ0hBUgkJCQlUeFN0cmVhbTsKKwlVQ0hBUgkJCQlSeFN0cmVhbTsKKworCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJVUNIQVIJCQkJTWNhc3RUcmFuc21pdE1jczsKKwlVQ0hBUgkJCQlNY2FzdFRyYW5zbWl0UGh5TW9kZTsKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKwlCT09MRUFOICAgICAJCWJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCisKKyNpZmRlZiBSVDI4NzAKKwlCT09MRUFOICAgICAJCWJNdWx0aXBsZUlSUDsgICAgICAgLy8gTXVsdGlwbGUgQnVsayBJTiBmbGFnCisJVUNIQVIgICAgICAgCQlOdW1PZkJ1bGtJbklSUDsgICAgIC8vIGlmIGJNdWx0aXBsZUlSUCA9PSBUUlVFLCBOdW1PZkJ1bGtJbklSUCB3aWxsIGJlIDQgb3RoZXJ3aXNlIGJlIDEKKyAJUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKKwlVTE9ORwkJCQlNYXhQa3RPbmVUeEJ1bGs7CisJVUNIQVIJCQkJVHhCdWxrRmFjdG9yOworCVVDSEFSCQkJCVJ4QnVsa0ZhY3RvcjsKKworCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7CisJUkFMSU5LX1RJTUVSX1NUUlVDVAlCZWFjb25VcGRhdGVUaW1lcjsKKwlVSU5UMzIJCQkJQmVhY29uQWRqdXN0OworCVVJTlQzMgkJCQlCZWFjb25GYWN0b3I7CisJVUlOVDMyCQkJCUJlYWNvblJlbWFpbjsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisgCU5ESVNfU1BJTl9MT0NLCQkJTWVhc3VyZVJlcVRhYkxvY2s7CisJUE1FQVNVUkVfUkVRX1RBQgkJcE1lYXN1cmVSZXFUYWI7CisKKwlORElTX1NQSU5fTE9DSwkJCVRwY1JlcVRhYkxvY2s7CisJUFRQQ19SRVFfVEFCCQkJcFRwY1JlcVRhYjsKKworCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJSFRUUkFOU01JVF9TRVRUSU5HCQlNQ2FzdFBoeU1vZGU7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisjaWZkZWYgU0lOR0xFX1NLVQorCVVJTlQxNgkJCQkJRGVmaW5lTWF4VHhQd3I7CisjZW5kaWYgLy8gU0lOR0xFX1NLVSAvLworCisKK30gQ09NTU9OX0NPTkZJRywgKlBDT01NT05fQ09ORklHOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KKy8vIFNUQSBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMKK3R5cGVkZWYgc3RydWN0IF9TVEFfQURNSU5fQ09ORklHIHsKKwkvLyBHUk9VUCAxIC0KKwkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCisJLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBidXQgbm90IG5lY2Vzc2FyeSBmdWxseSBlcXVhbCB0byB0aGUgZmluYWwKKwkvLyAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWl6ZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIKKwkvLyAgIEFQIG9yIElCU1MgaG9sZGVyKS4KKwkvLyAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4CisJVUNIQVIgICAgICAgQnNzVHlwZTsgICAgICAgICAgICAgIC8vIEJTU19JTkZSQSBvciBCU1NfQURIT0MKKwlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAvLyB1c2VkIHdoZW4gc3RhcnRpbmcgYSBuZXcgSUJTUworCisJLy8gR1JPVVAgMiAtCisJLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQorCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYW5kIHNob3VsZCBiZSBhbHdheXMgYXBwbGllZCB0byB0aGUgZmluYWwKKwkvLyAgIHNldHRpbmdzIGluIEFDVElWRSBCU1Mgd2l0aG91dCBjb21wcm9taXNpbmcgd2l0aCB0aGUgQlNTIGhvbGRlci4KKwkvLyAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4CisJVUNIQVIgICAgICAgUnNzaVRyaWdnZXI7CisJVUNIQVIgICAgICAgUnNzaVRyaWdnZXJNb2RlOyAgICAgIC8vIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEIG9yIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQKKwlVU0hPUlQgICAgICBEZWZhdWx0TGlzdGVuQ291bnQ7ICAgLy8gZGVmYXVsdCBsaXN0ZW4gY291bnQ7CisJVUxPTkcgICAgICAgV2luZG93c1Bvd2VyTW9kZTsgICAgICAgICAgIC8vIFBvd2VyIG1vZGUgZm9yIEFDIHBvd2VyCisJVUxPTkcgICAgICAgV2luZG93c0JhdHRlcnlQb3dlck1vZGU7ICAgIC8vIFBvd2VyIG1vZGUgZm9yIGJhdHRlcnkgaWYgZXhpc3RzCisJQk9PTEVBTiAgICAgYldpbmRvd3NBQ0NBTUVuYWJsZTsgICAgICAgIC8vIEVuYWJsZSBDQU0gcG93ZXIgbW9kZSB3aGVuIEFDIG9uCisJQk9PTEVBTiAgICAgYkF1dG9SZWNvbm5lY3Q7ICAgICAgICAgLy8gU2V0IHRvIFRSVUUgd2hlbiBzZXR0aW5nIE9JRF84MDJfMTFfU1NJRCB3aXRoIG5vIG1hdGNoaW5nIEJTU0lECisJVUxPTkcgICAgICAgV2luZG93c1Bvd2VyUHJvZmlsZTsgICAgLy8gV2luZG93cyBwb3dlciBwcm9maWxlLCBmb3IgTkRJUzUuMSBQblAKKworCS8vIE1JQjppZWVlODAyZG90MTEuZG90MTFzbXQoMSkuZG90MTFTdGF0aW9uQ29uZmlnVGFibGUoMSkKKwlVU0hPUlQgICAgICBQc207ICAgICAgICAgICAgICAgICAgLy8gcG93ZXIgbWFuYWdlbWVudCBtb2RlICAgKFBXUl9BQ1RJVkV8UFdSX1NBVkUpCisJVVNIT1JUICAgICAgRGlzYXNzb2NSZWFzb247CisJVUNIQVIgICAgICAgRGlzYXNzb2NTdGFbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICBEZWF1dGhSZWFzb247CisJVUNIQVIgICAgICAgRGVhdXRoU3RhW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgQXV0aEZhaWxSZWFzb247CisJVUNIQVIgICAgICAgQXV0aEZhaWxTdGFbTUFDX0FERFJfTEVOXTsKKworCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICAgICAgICAgIFByaXZhY3lGaWx0ZXI7ICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgICAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCU9yaWdXZXBTdGF0dXM7CS8vIE9yaWdpbmFsIHdlcCBzdGF0dXMgc2V0IGZyb20gT0lECisKKwkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCisJQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKKwlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBHcm91cEtleVdlcFN0YXR1czsKKworCVVDSEFSCQlQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCisJVUNIQVIgICAgICAgUFRLWzY0XTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBUSworCVVDSEFSCQlHVEtbMzJdOwkJCQkvLyBHVEsgZnJvbSBhdXRoZW50aWNhdG9yCisJQlNTSURfSU5GTwlTYXZlZFBNS1tQTUtJRF9OT107CisJVUlOVAkJU2F2ZWRQTUtOdW07CQkJLy8gU2F2ZWQgUE1LSUQgbnVtYmVyCisKKwlVQ0hBUgkJRGVmYXVsdEtleUlkOworCisKKwkvLyBXUEEgODAyLjF4IHBvcnQgY29udHJvbCwgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQsIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRAorCVVDSEFSICAgICAgIFBvcnRTZWN1cmVkOworCisJLy8gRm9yIFdQQSBjb3VudGVybWVhc3VyZXMKKwlVTE9ORyAgICAgICBMYXN0TWljRXJyb3JUaW1lOyAgIC8vIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lCisJVUxPTkcgICAgICAgTWljRXJyQ250OyAgICAgICAgICAvLyBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLgorCUJPT0xFQU4gICAgIGJCbG9ja0Fzc29jOyAgICAgICAgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgorCS8vIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUKKwlXUEFfU1RBVEUgICBXcGFTdGF0ZTsgICAgICAgICAgIC8vIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXgKKwlVQ0hBUiAgICAgICBSZXBsYXlDb3VudGVyWzhdOworCVVDSEFSICAgICAgIEFOb25jZVszMl07ICAgICAgICAgLy8gQU5vbmNlIGZvciBXUEEtUFNLIGZyb20gYXVyaGVudGljYXRvcgorCVVDSEFSICAgICAgIFNOb25jZVszMl07ICAgICAgICAgLy8gU05vbmNlIGZvciBXUEEtUFNLCisKKwlVQ0hBUiAgICAgICBMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIKKwlVQ0hBUiAgICAgICBMYXN0U05SMTsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUiBmb3IgMm5kICBhbnRlbm5hCisJUlNTSV9TQU1QTEUgUnNzaVNhbXBsZTsKKwlVTE9ORyAgICAgICBOdW1PZkF2Z1Jzc2lTYW1wbGU7CisKKwlVTE9ORyAgICAgICBMYXN0QmVhY29uUnhUaW1lOyAgICAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgQkVBQ09OIFJYIHRpbWUKKwlVTE9ORyAgICAgICBMYXN0MTFiQmVhY29uUnhUaW1lOyAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFCIEJFQUNPTiBSWCB0aW1lCisJVUxPTkcJCUxhc3QxMWdCZWFjb25SeFRpbWU7CS8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExRyBCRUFDT04gUlggdGltZQorCVVMT05HCQlMYXN0MjBOQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAyME1IeiBOIEJFQUNPTiBSWCB0aW1lCisKKwlVTE9ORyAgICAgICBMYXN0U2NhblRpbWU7ICAgICAgIC8vIFJlY29yZCBsYXN0IHNjYW4gdGltZSBmb3IgaXNzdWUgQlNTSURfU0NBTl9MSVNUCisJVUxPTkcgICAgICAgU2NhbkNudDsgICAgICAgICAgICAvLyBTY2FuIGNvdW50cyBzaW5jZSBtb3N0IHJlY2VudCBTU0lELCBCU1NJRCwgU0NBTiBPSUQgcmVxdWVzdAorCUJPT0xFQU4gICAgIGJTd1JhZGlvOyAgICAgICAgICAgLy8gU29mdHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCisJQk9PTEVBTiAgICAgYkh3UmFkaW87ICAgICAgICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24KKwlCT09MRUFOICAgICBiUmFkaW87ICAgICAgICAgICAgIC8vIFJhZGlvIHN0YXRlLCBBbmQgb2YgU3cgJiBIdyByYWRpbyBzdGF0ZQorCUJPT0xFQU4gICAgIGJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCisJQk9PTEVBTiAgICAgYlNob3dIaWRkZW5TU0lEOyAgICAvLyBTaG93IGFsbCBrbm93biBTU0lEIGluIFNTSUQgbGlzdCBnZXQgb3BlcmF0aW9uCisKKworCS8vIE5ldyBmb3IgV1BBLCB3aW5kb3dzIHdhbnQgdXMgdG8gdG8ga2VlcCBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbiBhbmQKKwkvLyBGaXhlZCBJRXMgZnJvbSBsYXN0IGFzc29jaWF0aW9uIHJlc3BvbnNlCisJTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04gICAgIEFzc29jSW5mbzsKKwlVU0hPUlQgICAgICAgUmVxVmFySUVMZW47ICAgICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSICAgICAgIFJlcVZhcklFc1tNQVhfVklFX0xFTl07CQkvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwlVU0hPUlQgICAgICAgUmVzVmFySUVMZW47ICAgICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSICAgICAgIFJlc1ZhcklFc1tNQVhfVklFX0xFTl07CisKKwlVQ0hBUiAgICAgICBSU05JRV9MZW47CisJVUNIQVIgICAgICAgUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOwkvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKworCS8vIE5ldyB2YXJpYWJsZXMgdXNlZCBmb3IgQ0NYIDEuMAorCUJPT0xFQU4gICAgICAgICAgICAgYkNraXBPbjsKKwlCT09MRUFOICAgICAgICAgICAgIGJDa2lwQ21pY09uOworCVVDSEFSICAgICAgICAgICAgICAgQ2tpcEZsYWc7CisJVUNIQVIgICAgICAgICAgICAgICBHSVZbM107ICAvL2ZvciBDQ1ggaXYKKwlVQ0hBUiAgICAgICAgICAgICAgIFJ4U0VRWzRdOworCVVDSEFSICAgICAgICAgICAgICAgVHhTRVFbNF07CisJVUNIQVIgICAgICAgICAgICAgICBDS0lQTUlDWzRdOworCVVDSEFSICAgICAgICAgICAgICAgTGVhcEF1dGhNb2RlOworCUxFQVBfQVVUSF9JTkZPICAgICAgTGVhcEF1dGhJbmZvOworCVVDSEFSICAgICAgICAgICAgICAgSGFzaFB3ZFsxNl07CisJVUNIQVIgICAgICAgICAgICAgICBOZXR3b3JrQ2hhbGxlbmdlWzhdOworCVVDSEFSICAgICAgICAgICAgICAgTmV0d29ya0NoYWxsZW5nZVJlc3BvbnNlWzI0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIFBlZXJDaGFsbGVuZ2VbOF07CisKKwlVQ0hBUiAgICAgICAgICAgICAgIFBlZXJDaGFsbGVuZ2VSZXNwb25zZVsyNF07CisJVUNIQVIgICAgICAgICAgICAgICBTZXNzaW9uS2V5WzE2XTsgLy9OZXR3b3JrIHNlc3Npb24ga2V5cyAoTlNLKQorCVJBTElOS19USU1FUl9TVFJVQ1QgTGVhcEF1dGhUaW1lcjsKKwlST0dVRUFQX1RBQkxFICAgICAgIFJvZ3VlQXBUYWI7ICAgLy9DaXNjbyBDQ1gxIFJvZ3VlIEFQIERldGVjdGlvbgorCisJLy8gTmV3IGNvbnRyb2wgZmxhZ3MgZm9yIENDWAorCUNDWF9DT05UUk9MICAgICAgICAgQ0NYQ29udHJvbDsgICAgICAgICAgICAgICAgIC8vIE1hc3RlciBhZG1pbmlzdHJhdGlvbiBzdGF0ZQorCUJPT0xFQU4gICAgICAgICAgICAgQ0NYRW5hYmxlOyAgICAgICAgICAgICAgICAgIC8vIEFjdHVhbCBDQ1ggc3RhdGUKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFNjYW5DaGFubmVsOyAgICAgICAgICAgICAvLyBTZWxlY3RlZCBjaGFubmVsIGZvciBDQ1ggYmVhY29uIHJlcXVlc3QKKwlVU0hPUlQgICAgICAgICAgICAgIENDWFNjYW5UaW1lOyAgICAgICAgICAgICAgICAvLyBUaW1lIG91dCB0byB3YWl0IGZvciBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hSZXFUeXBlOyAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBwcm9jZXNzaW5nIENDWCByZXF1ZXN0IHR5cGUKKwlCU1NfVEFCTEUgICAgICAgICAgIENDWEJzc1RhYjsgICAgICAgICAgICAgICAgICAvLyBCU1MgVGFibGUKKwlVQ0hBUiAgICAgICAgICAgICAgIEZyYW1lUmVwb3J0QnVmWzIwNDhdOyAgICAgICAvLyBCdWZmZXIgZm9yIGNyZWF0aW5nIGZyYW1lIHJlcG9ydAorCVVTSE9SVCAgICAgICAgICAgICAgRnJhbWVSZXBvcnRMZW47ICAgICAgICAgICAgIC8vIEN1cnJlbnQgRnJhbWUgcmVwb3J0IGxlbmd0aAorCVVMT05HICAgICAgICAgICAgICAgQ0xCdXN5Qnl0ZXM7ICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIGR1cm5pbmcgY2hhbm5lbCBsb2FkIHNjYW4gdGltZQorCVVTSE9SVCAgICAgICAgICAgICAgUlBJRGVuc2l0eVs4XTsgICAgICAgICAgICAgIC8vIEFycmF5IGZvciBSUEkgZGVuc2l0eSBjb2xsZWN0aW9uCisJLy8gU3RhcnQgYWRkcmVzcyBvZiBlYWNoIEJTUyB0YWJsZSB3aXRoaW4gRnJhbWVSZXBvcnRCdWYKKwkvLyBJdCdzIGltcG9ydGFudCB0byB1cGRhdGUgdGhlIFJ4UG93ZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgQnNzCisJVVNIT1JUICAgICAgICAgICAgICBCc3NSZXBvcnRPZmZzZXRbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworCVVTSE9SVCAgICAgICAgICAgICAgQmVhY29uVG9rZW47ICAgICAgICAgICAgICAgIC8vIFRva2VuIGZvciBiZWFjb24gcmVwb3J0CisJVUxPTkcgICAgICAgICAgICAgICBMYXN0QnNzSW5kZXg7ICAgICAgICAgICAgICAgLy8gTW9zdCBjdXJyZW50IHJlcG9ydGVkIEJzcyBpbmRleAorCVJNX1JFUVVFU1RfQUNUSU9OICAgTWVhc3VyZW1lbnRSZXF1ZXN0WzE2XTsgICAgIC8vIFNhdmVkIG1lYXN1cmVtZW50IHJlcXVlc3QKKwlVQ0hBUiAgICAgICAgICAgICAgIFJNUmVxQ250OyAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4KKwlVQ0hBUiAgICAgICAgICAgICAgIEN1cnJlbnRSTVJlcUlkeDsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4KKwlCT09MRUFOICAgICAgICAgICAgIFBhcmFsbGVsUmVxOyAgICAgICAgICAgICAgICAvLyBQYXJhbGxlbCBtZWFzdXJlbWVudCwgb25seSBvbmUgcmVxdWVzdCBwZXJmb3JtZWQsCisJCQkJCQkJCQkJCQkJLy8gSXQgbXVzdCBiZSB0aGUgc2FtZSBjaGFubmVsIHdpdGggbWF4aW11bSBkdXJhdGlvbgorCVVTSE9SVCAgICAgICAgICAgICAgUGFyYWxsZWxEdXJhdGlvbjsgICAgICAgICAgIC8vIE1heGltdW0gZHVyYXRpb24gZm9yIHBhcmFsbGVsIG1lYXN1cmVtZW50CisJVUNIQVIgICAgICAgICAgICAgICBQYXJhbGxlbENoYW5uZWw7ICAgICAgICAgICAgLy8gT25seSBvbmUgY2hhbm5lbCB3aXRoIHBhcmFsbGVsIG1lYXN1cmVtZW50CisJVVNIT1JUICAgICAgICAgICAgICBJQVBQVG9rZW47ICAgICAgICAgICAgICAgICAgLy8gSUFQUCBkaWFsb2cgdG9rZW4KKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFFvc0VDV01pbjsgICAgICAgICAgICAgICAvLyBDaXNjbyBRT1MgRUNXTWluIGZvciBBQyAwCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hRb3NFQ1dNYXg7ICAgICAgICAgICAgICAgLy8gQ2lzY28gUU9TIEVDV01heCBmb3IgQUMgMAorCS8vIEhhY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdG9ncmFtIHBhcmFtZXRlcnMKKwlVQ0hBUiAgICAgICAgICAgICAgIE5IRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIE5vaXNlIGhpc3RvZ3JhbQorCVVDSEFSICAgICAgICAgICAgICAgQ0xGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgY2hhbm5lbCBsb2FkCisKKwlVQ0hBUiAgICAgICAgICAgICAgIEtSS1sxNl07ICAgICAgICAvL0tleSBSZWZyZXNoIEtleS4KKwlVQ0hBUiAgICAgICAgICAgICAgIEJUS1szMl07ICAgICAgICAvL0Jhc2UgVHJhbnNpZW50IEtleQorCUJPT0xFQU4gICAgICAgICAgICAgQ0NLTUxpbmtVcEZsYWc7CisJVUxPTkcgICAgICAgICAgICAgICBDQ0tNUk47ICAgIC8vKFJlKUFzc29jaWF0aW9uIHJlcXVlc3QgbnVtYmVyLgorCUxBUkdFX0lOVEVHRVIgICAgICAgQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcDsgIC8vVFNGIHRpbWVyIGZvciBSZS1hc3NvY2FpdGUgdG8gdGhlIG5ldyBBUAorCVVDSEFSICAgICAgICAgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0OyAgICAgIC8vaW4gZEJtCisJVUNIQVIgICAgICAgICAgICAgICBBaXJvbmV0SVBBZGRyZXNzWzRdOyAgICAgICAgLy9lZy4gMTkyLjE2OC4xLjEKKwlCT09MRUFOICAgICAgICAgICAgIENDWEFkamFjZW50QVBSZXBvcnRGbGFnOyAgICAvL2ZsYWcgZm9yIGRldGVybWluaW5nIHJlcG9ydCBBc3NvYyBMb3N0IHRpbWUKKwlDSEFSICAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vQWRqYWNlbnQgQVAncyBTU0lEIHJlcG9ydAorCVVDSEFSICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQQnNzaWRbTUFDX0FERFJfTEVOXTsgICAgICAgICAvL0FkamFjZW50IEFQJ3MgQlNTSUQgcmVwb3J0CisJVVNIT1JUICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQQ2hhbm5lbDsKKwlVTE9ORyAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBMaW5rRG93blRpbWU7ICAvL2ZvciBTcGVjIFMzMi4KKworCVJBTElOS19USU1FUl9TVFJVQ1QJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXI7CisJQk9PTEVBTgkJCQlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmc7CisKKwlVQ0hBUiAgICAgICAgICAgCUR0aW1Db3VudDsgICAgICAvLyAwLi4gRHRpbVBlcmlvZC0xCisJVUNIQVIgICAgICAgICAgIAlEdGltUGVyaW9kOyAgICAgLy8gZGVmYXVsdCA9IDMKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVJUXzgwMl8xMV9ETFMJCURMU0VudHJ5W01BWF9OVU1fT0ZfRExTX0VOVFJZXTsKKwlVQ0hBUgkJCQlEbHNSZXBsYXlDb3VudGVyWzhdOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUaGlzIGlzIG9ubHkgZm9yIFdIUUwgdGVzdC4KKwlCT09MRUFOCQkJCVdocWxUZXN0OworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIFJBTElOS19USU1FUl9TVFJVQ1QgV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXI7CisgICAgLy8gRmFzdCBSb2FtaW5nCisJQk9PTEVBTgkJICAgICAgICBiRmFzdFJvYW1pbmc7ICAgICAgIC8vIDA6ZGlzYWJsZSBmYXN0IHJvYW1pbmcsIDE6ZW5hYmxlIGZhc3Qgcm9hbWluZworCUNIQVIJCSAgICAgICAgZEJtVG9Sb2FtOyAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uIHRvIHJvYW0gd2hlbiByZWNlaXZpbmcgUnNzaSBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gSXQncyBuZWdhdGl2ZSB2YWx1ZS4KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBCT09MRUFOICAgICAgICAgICAgIElFRUU4MDIxWDsKKyAgICBCT09MRUFOICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworICAgIENJUEhFUl9LRVkJICAgICAgICBEZXNpcmVTaGFyZWRLZXlbNF07CS8vIFJlY29yZCB1c2VyIGRlc2lyZWQgV0VQIGtleXMKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIERlc2lyZVNoYXJlZEtleUlkOworCisgICAgLy8gMDogZHJpdmVyIGlnbm9yZXMgd3BhX3N1cHBsaWNhbnQKKyAgICAvLyAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbgorICAgIC8vIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzCisgICAgVUNIQVIgICAgICAgICAgICAgICBXcGFTdXBwbGljYW50VVA7CisJVUNIQVIJCQkJV3BhU3VwcGxpY2FudFNjYW5Db3VudDsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICBDSEFSICAgICAgICAgICAgICAgIGRldl9uYW1lWzE2XTsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIE9yaURldlR5cGU7CisKKyAgICBCT09MRUFOICAgICAgICAgICAgIGJUR25XaWZpVGVzdDsKKwlCT09MRUFOCQkJICAgIGJTY2FuUmVxSXNGcm9tV2ViVUk7CisKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7CisJUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCVVDSEFSCQkJCUlFRUU4MDIxMWRDbGllbnRNb2RlOworCVVDSEFSCQkJCVN0YU9yaUNvdW50cnlDb2RlWzNdOworCVVDSEFSCQkJCVN0YU9yaUdlb2dyYXBoeTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCit9IFNUQV9BRE1JTl9DT05GSUcsICpQU1RBX0FETUlOX0NPTkZJRzsKKworLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSBrZWVwIHRoZSBjdXJyZW50IGFjdGl2ZSBCU1MvSUJTUydzIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGlzIFNUQQorLy8gaGFkIGFncmVlZCB1cG9uIGpvaW5pbmcgdGhlIG5ldHdvcmsuIFdoaWNoIG1lYW5zIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHVzdWFsbHkgZGVjaWRlZAorLy8gYnkgdGhlIEJTUy9JQlNTIGNyZWF0b3IgaW5zdGVhZCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24uIERhdGEgaW4gdGhpcyBkYXRhIHN0cnVjdHVycmUKKy8vIGlzIHZhbGlkIG9ubHkgd2hlbiBlaXRoZXIgQURIT0NfT04ocEFkKSBvciBJTkZSQV9PTihwQWQpIGlzIFRSVUUuCisvLyBOb3JtYWxseSwgYWZ0ZXIgU0NBTiBvciBmYWlsZWQgcm9hbWluZyBhdHRlbXB0cywgd2UgbmVlZCB0byByZWNvdmVyIGJhY2sgdG8KKy8vIHRoZSBjdXJyZW50IGFjdGl2ZSBzZXR0aW5ncy4KK3R5cGVkZWYgc3RydWN0IF9TVEFfQUNUSVZFX0NPTkZJRyB7CisJVVNIT1JUICAgICAgQWlkOworCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgICAgICAgIC8vIGluIGt1c2VjOyBJQlNTIHBhcmFtZXRlciBzZXQgZWxlbWVudAorCVVTSE9SVCAgICAgIENhcGFiaWxpdHlJbmZvOworCVVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOworCVVTSE9SVCAgICAgIENmcFBlcmlvZDsKKworCS8vIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCisJLy8gQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuCisJVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOworCS8vIENvcHkgc3VwcG9ydGVkIGh0IGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCVJUX0hUX1BIWV9JTkZPCQlTdXBwb3J0ZWRQaHlJbmZvOworCVJUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7Cit9IFNUQV9BQ1RJVkVfQ09ORklHLCAqUFNUQV9BQ1RJVkVfQ09ORklHOworCisjaWZkZWYgUlQyODcwCisvLyBmb3IgVVNCIGludGVyZmFjZSwgYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5Cit0eXBlZGVmIHN0cnVjdCAgIFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkgeworICAgICAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgIE1hY0FkZHI7CisgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjVGFiTWF0Y2hXQ0lEOyAgICAgICAgLy8gQVNJQworICAgICAgICBDSVBIRVJfS0VZICAgICAgICAgICAgICAgICAgICAgIENpcGhlcktleTsKK30gUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSwqUFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIC0tLS0tLS0tLS0tIHN0YXJ0IG9mIEFQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBVVRILVJTUCBTdGF0ZSBNYWNoaW5lIEF1eCBkYXRhIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgX0FQX01MTUVfQVVYIHsKKwlVQ0hBUiAgICAgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgICAgICAgIEFsZzsKKwlDSEFSICAgICAgICAgICAgICAgIENoYWxsZW5nZVtDSVBIRVJfVEVYVF9MRU5dOworfSBBUF9NTE1FX0FVWCwgKlBBUF9NTE1FX0FVWDsKKworLy8gc3RydWN0dXJlIHRvIGRlZmluZSBXUEEgR3JvdXAgS2V5IFJla2V5IEludGVydmFsCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9XUEFfUkVLRVkgeworCVVMT05HIFJlS2V5TWV0aG9kOyAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZAorCVVMT05HIFJlS2V5SW50ZXJ2YWw7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cworfSBSVF9XUEFfUkVLRVksKlBSVF9XUEFfUkVLRVksIFJUXzgwMl8xMV9XUEFfUkVLRVksICpQUlRfODAyXzExX1dQQV9SRUtFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSB7CisJLy9DaG9vc2UgMSBmcm9tIFZhbGlkQXNXRFMgYW5kIFZhbGlkQXNDTEkgIHRvIHZhbGlkaXplLgorCUJPT0xFQU4JCVZhbGlkQXNDTEk7CQkvLyBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLgorCUJPT0xFQU4JCVZhbGlkQXNXRFM7CS8vIFRoaXMgaXMgV0RTIEVudHJ5LiBvbmx5IGZvciBBUCBtb2RlLgorCUJPT0xFQU4JCVZhbGlkQXNBcENsaTsgICAvL1RoaXMgaXMgYSBBUC1DbGllbnQgZW50cnksIG9ubHkgZm9yIEFQIG1vZGUgd2hpY2ggZW5hYmxlIEFQLUNsaWVudCBmdW5jdGlvbnMuCisJQk9PTEVBTgkJVmFsaWRBc01lc2g7CisJQk9PTEVBTgkJVmFsaWRBc0RsczsJLy8gVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLgorCUJPT0xFQU4JCWlzQ2FjaGVkOworCUJPT0xFQU4JCWJJQW1CYWRBdGhlcm9zOwkvLyBGbGFnIGlmIHRoaXMgaXMgQXRoZXJvcyBjaGlwIHRoYXQgaGFzIElPVCBwcm9ibGVtLiAgV2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgcHJvdGVjdGlvbi4KKworCVVDSEFSICAgICAgICAgCUVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nOyAgLy8gRW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBFQVAgU00KKwkvL2phbiBmb3Igd3BhCisJLy8gcmVjb3JkIHdoaWNoIGVudHJ5IHJldm9rZSBNSUMgRmFpbHVyZSAsIGlmIGl0IGxlYXZlcyB0aGUgQlNTIGl0c2VsZiwgQVAgd29uJ3QgdXBkYXRlIGFNSUNGYWlsVGltZSBNSUIKKwlVQ0hBUiAgICAgICAgICAgQ01UaW1lclJ1bm5pbmc7CisJVUNIQVIgICAgICAgICAgIGFwaWR4OwkJCS8vIE1CU1MgbnVtYmVyCisJVUNIQVIgICAgICAgICAgIFJTTklFX0xlbjsKKwlVQ0hBUiAgICAgICAgICAgUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOworCVVDSEFSICAgICAgICAgICBBTm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKKwlVQ0hBUiAgICAgICAgICAgUl9Db3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSICAgICAgICAgICBQVEtbNjRdOworCVVDSEFSICAgICAgICAgICBSZVRyeUNvdW50ZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgICAgICAgICAgICAgUmV0cnlUaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUCQkJCQlFbnF1ZXVlU3RhcnRGb3JQU0tUaW1lcjsJLy8gQSB0aW1lciB3aGljaCBlbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIFBTSyBTTQorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCUFQX1dQQV9TVEFURSAgICBXcGFTdGF0ZTsKKwlHVEtfU1RBVEUgICAgICAgR1RLU3RhdGU7CisJVVNIT1JUICAgICAgICAgIFBvcnRTZWN1cmVkOworCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICBQcml2YWN5RmlsdGVyOyAgICAgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCisJQ0lQSEVSX0tFWSAgICAgIFBhaXJ3aXNlS2V5OworCVBWT0lEICAgICAgICAgICBwQWQ7CisgICAgSU5UCQkJCVBNS0lEX0NhY2hlSWR4OworICAgIFVDSEFSCQkJUE1LSURbTEVOX1BNS0lEXTsKKworCisJVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgUHNNb2RlOworCVNTVCAgICAgICAgICAgICBTc3Q7CisJQVVUSF9TVEFURSAgICAgIEF1dGhTdGF0ZTsgLy8gZm9yIFNIQVJFRCBLRVkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSB1c2VkIG9ubHkKKwlCT09MRUFOCQkJSXNSZWFzc29jU3RhOwkvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFzc29jaWF0aW9uIHByb2NlZHVyZQorCVVTSE9SVCAgICAgICAgICBBaWQ7CisJVVNIT1JUICAgICAgICAgIENhcGFiaWxpdHlJbmZvOworCVVDSEFSICAgICAgICAgICBMYXN0UnNzaTsKKwlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OworCVVJTlQxNgkJCVN0YXRpb25LZWVwQWxpdmVDb3VudDsgLy8gdW5pdDogc2Vjb25kCisJVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKKwlRVUVVRV9IRUFERVIgICAgUHNRdWV1ZTsKKworCVVJTlQzMgkJCVN0YUNvbm5lY3RUaW1lOwkJLy8gdGhlIGxpdmUgdGltZSBvZiB0aGlzIHN0YXRpb24gc2luY2UgYXNzb2NpYXRlZCB3aXRoIEFQCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJPT0xFQU4JCQliU2VuZEJBUjsKKwlVU0hPUlQJCQlOb0JBRGF0YUNvdW50RG93bjsKKworCVVJTlQzMiAgIAkJQ2FjaGVkQnVmWzE2XTsJCS8vIFVJTlQgKDQgYnl0ZXMpIGZvciBhbGlnbm1lbnQKKwlVSU5UCQkJVHhCRkNvdW50OyAvLyAzKjMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlVSU5UCQkJRklGT0NvdW50OworCVVJTlQJCQlEZWJ1Z0ZJRk9Db3VudDsKKwlVSU5UCQkJRGVidWdUeENvdW50OworICAgIEJPT0xFQU4JCQliRGxzSW5pdDsKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vV0RTIGVudHJ5IG5lZWRzIHRoZXNlCisvLyBydDI4NjAgYWRkIHRoaXMuIGlmIFZhbGlkQXNXRFM9PVRSVUUsIE1hdGNoV0RTVGFiSWR4IGlzIHRoZSBpbmRleCBpbiBXZHNUYWIuTWFjVGFiCisJVUlOVAkJCU1hdGNoV0RTVGFiSWR4OworCVVDSEFSICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlSW5kZXg7CisJLy8gdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLgorCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworLy8JVVNIT1JUICAgICAgICAgIE9uZVNlY1R4T2tDb3VudDsKKwlVSU5UMzIJCQlPbmVTZWNUeE5vUmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7CisJVUlOVDMyCQkJQ29udGludWVUeEZhaWxDbnQ7CisJVUlOVDMyICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKKwlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlVSU5UCQkJTWF0Y2hEbHNFbnRyeUlkeDsgLy8gaW5kaWNhdGUgdGhlIGluZGV4IGluIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlCT09MRUFOICAgICAgICAgZk5vaXN5RW52aXJvbm1lbnQ7CisJQk9PTEVBTgkJCWZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKKwlVQ0hBUiAgICAgICAgICAgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgLy8gMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duCisJQ0hBUgkJCUxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uOyAvL0tlZXAgbGFzdCB0aW1lIHZhbHVlIG9mIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24KKwlVTE9ORwkJCUxhc3RUeE9rQ291bnQ7CisJVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisKKwkvLyBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIKKwkvLyBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhCisJLy8gQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygpLCBDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuCisJLy8gc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbi4gZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECisJVUxPTkcgICAgICAgICAgIENsaWVudFN0YXR1c0ZsYWdzOworCisJLy8gVE9ETzogU2hhbGwgd2UgbW92ZSB0aGF0IHRvIERPVDExX05fU1VQUE9SVD8/PworCUhUVFJBTlNNSVRfU0VUVElORwlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gSFQgRVdDIE1JTU8tTiB1c2VkIHBhcmFtZXRlcnMKKwlVU0hPUlQJCVJYQkFiaXRtYXA7CS8vIGZpbGwgdG8gb24tY2hpcCAgUlhXSV9CQV9CSVRNQVNLIGluIDguMS4zUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdAorCVVTSE9SVAkJVFhCQWJpdG1hcDsJLy8gVGhpcyBiaXRtYXAgYXMgb3JpZ2luYXRvciwgb25seSBrZWVwIGluIHNvZnR3YXJlIHVzZWQgdG8gbWFyayBBTVBEVSBiaXQgaW4gVFhXSQorCVVTSE9SVAkJVFhBdXRvQkFiaXRtYXA7CisJVVNIT1JUCQlCQURlY2xpbmVCaXRtYXA7CisJVVNIT1JUCQlCQVJlY1djaWRBcnJheVtOVU1fT0ZfVElEXTsJLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiByZWNpcGllbnQgc2Vzc2lvbi4gaWYgUlhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCisJVVNIT1JUCQlCQU9yaVdjaWRBcnJheVtOVU1fT0ZfVElEXTsgLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAorCVVTSE9SVAkJQkFPcmlTZXF1ZW5jZVtOVU1fT0ZfVElEXTsgLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAorCisJLy8gODAyLjExbiBmZWF0dXJlcy4KKwlVQ0hBUgkJTXBkdURlbnNpdHk7CisJVUNIQVIJCU1heFJBbXBkdUZhY3RvcjsKKwlVQ0hBUgkJQU1zZHVTaXplOworCVVDSEFSCQlNbXBzTW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUuCisKKwlIVF9DQVBBQklMSVRZX0lFCQlIVENhcGFiaWxpdHk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJVUNIQVIJCUJTUzIwNDBDb2V4aXN0ZW5jZU1nbXRTdXBwb3J0OworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCUJPT0xFQU4JCWJBdXRvVHhSYXRlU3dpdGNoOworCisJVUNIQVIgICAgICAgUmF0ZUxlbjsKKwlzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSAqcE5leHQ7CisgICAgVVNIT1JUICAgICAgVHhTZXFbTlVNX09GX1RJRF07CisJVVNIT1JUCQlOb25Rb3NEYXRhU2VxOworCisJUlNTSV9TQU1QTEUJUnNzaVNhbXBsZTsKKworCVVJTlQzMgkJCVRYTUNTRXhwZWN0ZWRbMTZdOworCVVJTlQzMgkJCVRYTUNTU3VjY2Vzc2Z1bFsxNl07CisJVUlOVDMyCQkJVFhNQ1NGYWlsZWRbMTZdOworCVVJTlQzMgkJCVRYTUNTQXV0b0ZhbGxCYWNrWzE2XVsxNl07CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVTE9ORyAgIAkJTGFzdEJlYWNvblJ4VGltZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30gTUFDX1RBQkxFX0VOVFJZLCAqUE1BQ19UQUJMRV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRSB7CisJVVNIT1JUCQkJU2l6ZTsKKwlNQUNfVEFCTEVfRU5UUlkgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKKwlNQUNfVEFCTEVfRU5UUlkgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07CisJUVVFVUVfSEVBREVSICAgIE1jYXN0UHNRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkluUHNtOworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkJhZEF0aGVyb3M7CS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIGF0aGVyb3MgODAyLjExbiBDaGlwLiAgV2UgbmVlZCB0byB1c2UgUlRTL0NUUyB3aXRoIEF0aGVyb3MgODAyLC4xMW4gY2hpcC4KKwlCT09MRUFOCQkJZkFueVR4T1BGb3JjZURpc2FibGU7CS8vIENoZWNrIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIEJFIFR4T1AKKwlCT09MRUFOCQkJZkFsbFN0YXRpb25Bc1JhbGluazsgCS8vIENoZWNrIGlmIGFsbCBzdGF0aW9ucyBhcmUgcmFsaW5rLWNoaXBzZXQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Jc0xlZ2FjeTsJLy8gQ2hlY2sgaWYgSSB1c2UgbGVnYWN5IHJhdGUgdG8gdHJhbnNtaXQgdG8gbXkgQlNTIFN0YXRpb24vCisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uTm9uR0Y7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgorCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbjIwT25seTsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCisJQk9PTEVBTgkJCWZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYzsgLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgTUlNTyBEeW5hbWljCisJQk9PTEVBTiAgICAgICAgIGZBbnlCQVNlc3Npb247ICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgQkEgc2Vzc2lvbi4gIEZvcmNlIHR1cm4gb24gUlRTL0NUUworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfSBNQUNfVEFCTEUsICpQTUFDX1RBQkxFOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZGVmaW5lIElTX0hUX1NUQShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKyNkZWZpbmUgSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKyNkZWZpbmUgUEVFUl9JU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX1dEU19FTlRSWSB7CisJQk9PTEVBTiAgICAgICAgIFZhbGlkOworCVVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUxPTkcgICAgICAgICAgIE5vRGF0YUlkbGVDb3VudDsKKwlzdHJ1Y3QgX1dEU19FTlRSWSAqcE5leHQ7Cit9IFdEU19FTlRSWSwgKlBXRFNfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0ICBfV0RTX1RBQkxFX0VOVFJZIHsKKwlVU0hPUlQJCQlTaXplOworCVVDSEFSICAgICAgICAgICBXZHNBZGRyW01BQ19BRERSX0xFTl07CisJV0RTX0VOVFJZICAgICAgICpIYXNoW0hBU0hfVEFCTEVfU0laRV07CisJV0RTX0VOVFJZICAgICAgIENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOworCVVDSEFSICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlOworCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeE9rQ291bnQ7CisJVVNIT1JUICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVTE9ORyAgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQorCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KK30gV0RTX1RBQkxFX0VOVFJZLCAqUFdEU19UQUJMRV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFNfRU5UUlkgeworCVBORVRfREVWCQkJZGV2OworCVVDSEFSCQkJCVZhbGlkOworCVVDSEFSCQkJCVBoeU1vZGU7CisJVUNIQVIJCQkJUGVlcldkc0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICBXZXBTdGF0dXM7CisJVUNIQVIJCQkJCUtleUlkeDsKKwlDSVBIRVJfS0VZICAgICAgICAgIAlXZHNLZXk7CisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7CisJUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4KK30gUlRfODAyXzExX1dEU19FTlRSWSwgKlBSVF84MDJfMTFfV0RTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfV0RTX1RBQkxFIHsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1vZGU7CisJVUxPTkcgICAgICAgICAgICAgICBTaXplOworCVJUXzgwMl8xMV9XRFNfRU5UUlkJV2RzRW50cnlbTUFYX1dEU19FTlRSWV07Cit9IFdEU19UQUJMRSwgKlBXRFNfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IF9BUENMSV9TVFJVQ1QgeworCVBORVRfREVWCQkJCWRldjsKKyNpZmRlZiBSVEw4NjVYX1NPQworCXVuc2lnbmVkIGludCAgICAgICAgICAgIG15bGlua2lkOworI2VuZGlmCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgRW5hYmxlOwkvLyBTZXQgaXQgYXMgMSBpZiB0aGUgYXBjbGkgaW50ZXJmYWNlIHdhcyBjb25maWd1cmVkIHRvICIxIiAgb3IgYnkgaXdwcml2IGNtZCAiQXBDbGlFbmFibGUiCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgVmFsaWQ7CS8vIFNldCBpdCBhcyAxIGlmIHRoZSBhcGNsaSBpbnRlcmZhY2UgYXNzb2NpYXRlZCBzdWNjZXNzIHRvIHJlbW90ZSBBUC4KKwlVQ0hBUgkJCQkJTWFjVGFiV0NJRDsJLy9XQ0lEIHZhbHVlLCB3aGljaCBwb2ludCB0byB0aGUgZW50cnkgb2YgQVNJQyBNYWMgdGFibGUuCisJVUNIQVIgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKKwlDSEFSICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDZmdTc2lkTGVuOworCUNIQVIgICAgICAgICAgICAgICAgICAgIENmZ1NzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDZmdBcENsaUJzc2lkW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ3VycmVudEFkZHJlc3NbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIEFwQ2xpUmN2QmVhY29uVGltZTsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIEN0cmxDdXJyU3RhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgU3luY0N1cnJTdGF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBdXRoQ3VyclN0YXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIEFzc29jQ3VyclN0YXRlOworCVVMT05HCQkJCQlXcGFQc2tDdXJyU3RhdGU7CisKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBBdXRoUmVxQ250OworCVVTSE9SVCAgICAgICAgICAgICAgICAgIEFzc29jUmVxQ250OworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgTXBkdURlbnNpdHk7CisKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKworCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcworCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKworCVVDSEFSCQlQU0tbMTAwXTsJCQkJLy8gcmVzZXJ2ZSBQU0sga2V5IG1hdGVyaWFsCisJVUNIQVIgICAgICAgUFNLTGVuOworCVVDSEFSICAgICAgIFBNS1szMl07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQTUsKKwkvL1VDSEFSICAgICAgIFBUS1s2NF07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQVEsKKwlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgorCisJLy9DSVBIRVJfS0VZCQlQYWlyd2lzZUtleTsKKwlDSVBIRVJfS0VZICAgICAgU2hhcmVkS2V5W1NIQVJFX0tFWV9OVU1dOworCVVDSEFSICAgICAgICAgICBEZWZhdWx0S2V5SWQ7CisKKwkvLyBXUEEgODAyLjF4IHBvcnQgY29udHJvbCwgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQsIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRAorCS8vVUNIQVIgICAgICAgUG9ydFNlY3VyZWQ7CisKKwkvLyBzdG9yZSBSU05fSUUgYnVpbHQgYnkgZHJpdmVyCisJVUNIQVIJCVJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsgIC8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGNvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJVUNIQVIJCVJTTklFX0xlbjsKKworCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCisJVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQorCS8vVUxPTkcgICAgICAgTWljRXJyQ250OyAgICAgICAgICAvLyBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJCbG9ja0Fzc29jOyAvLyBCbG9jayBhc3NvY2lhdGUgYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcyBhZnRlciBjb3VudGVyIG1lYXN1cmUgb2NjdXJyZWQuCisKKwkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCisJLy9XUEFfU1RBVEUgICAJV3BhU3RhdGU7ICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFNTX05PVFVTRQorCS8vVUNIQVIgICAgICAgCVJlcGxheUNvdW50ZXJbOF07CisJLy9VQ0hBUiAgICAgICAJQU5vbmNlWzMyXTsgICAgICAgICAvLyBBTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXRoZW50aWNhdG9yCisJVUNIQVIgICAgICAgCVNOb25jZVszMl07ICAgICAgICAgLy8gU05vbmNlIGZvciBXUEEtUFNLCisJVUNIQVIJCQlHTm9uY2VbMzJdOwkJCS8vIEdOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1dGhlbnRpY2F0b3IKKworCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOworCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuCit9IEFQQ0xJX1NUUlVDVCwgKlBBUENMSV9TVFJVQ1Q7CisKKy8vIC0tLS0tLS0tLS0tIGVuZCBvZiBBUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKK3R5cGVkZWYgc3RydWN0IF9CTE9DS19RVUVVRV9FTlRSWQoreworCUJPT0xFQU4gU3dUeFF1ZXVlQmxvY2tGbGFnOworCUxJU1RfSEVBREVSIE5ldElmTGlzdDsKK30gQkxPQ0tfUVVFVUVfRU5UUlksICpQQkxPQ0tfUVVFVUVfRU5UUlk7CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisKK3N0cnVjdCB3aWZpY29uZgoreworCUJPT0xFQU4JYlNob3J0R0k7CisJQk9PTEVBTiBiR3JlZW5GaWVsZDsKK307CisKKworCit0eXBlZGVmIHN0cnVjdCBfSU5GX1BDSV9DT05GSUcKK3sKKwlQVUNIQVIgICAgICAgICAgICAgICAgICBDU1JCYXNlQWRkcmVzczsgICAgIC8vIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZQorfUlORl9QQ0lfQ09ORklHOworCit0eXBlZGVmIHN0cnVjdCBfSU5GX1VTQl9DT05GSUcKK3sKKwlVSU5UICAgICAgICAgICAgICAgIEJ1bGtJbkVwQWRkcjsJCS8vIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcworCVVJTlQgICAgICAgICAgICAgICAgQnVsa091dEVwQWRkcls2XTsJLy8gYnVsay1vdXQgZW5kcG9pbnQgYWRkcmVzcworCit9SU5GX1VTQl9DT05GSUc7CisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJdHlwZWRlZiB2b2lkICgqSWthbm9zV2xhblR4Q2JGdW5jUCkodm9pZCAqLCB2b2lkICopOworCisJc3RydWN0IElLQU5PU19UWF9JTkZPCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCQlJa2Fub3NXbGFuVHhDYkZ1bmNQICpmcDsKKwl9OworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworI2lmZGVmIE5JTlRFTkRPX0FQCit0eXBlZGVmIHN0cnVjdCBfTklORE9fQ1RSTF9CTE9DSyB7CisKKwlSVF9OSU5URU5ET19UQUJMRQlEU19UQUJMRTsKKworI2lmZGVmIENISVAyNVhYCisJc3BpbmxvY2tfdAkJCU5JTlRFTkRPX1RBQkxFX0xvY2s7CisjZWxzZQorCU5ESVNfU1BJTl9MT0NLCQlOSU5URU5ET19UQUJMRV9Mb2NrOworI2VuZGlmIC8vIENISVAyNVhYIC8vCisKKwlVQ0hBUgkJCQlOSU5URU5ET19VUF9CVUZGRVJbNTEyXTsKKwlVQ0hBUgkJCQlMb2NhbF9LZXlJZHg7CisJQ0lQSEVSX0tFWQkJCUxvY2FsX1NoYXJlZEtleTsKKwlVQ0hBUgkJCQlMb2NhbF9iSGlkZVNzaWQ7CisJVUNIQVIJCQkJTG9jYWxfQXV0aE1vZGU7CisJVUNIQVIJCQkJTG9jYWxfV2VwU3RhdHVzOworCVVTSE9SVAkJCQlMb2NhbF9DYXBhYmlsaXR5SW5mbzsKK30gTklORE9fQ1RSTF9CTE9DSzsKKyNlbmRpZiAvLyBOSU5URU5ET19BUCAvLworCisKKyNpZmRlZiBEQkdfRElBR05PU0UKKyNkZWZpbmUgRElBR05PU0VfVElNRQkxMCAgIC8vIDEwIHNlYwordHlwZWRlZiBzdHJ1Y3QgX1J0bXBEaWFnU3RyY3V0XworewkvLyBEaWFnbm9zaXMgUmVsYXRlZCBlbGVtZW50CisJdW5zaWduZWQgY2hhcgkJaW5pdGVkOworCXVuc2lnbmVkIGNoYXIgCXFJZHg7CisJdW5zaWduZWQgY2hhciAJQXJyYXlTdGFydElkeDsKKwl1bnNpZ25lZCBjaGFyCQlBcnJheUN1cklkeDsKKwkvLyBUeCBSZWxhdGVkIENvdW50CisJVVNIT1JUCQkJVHhEYXRhQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVR4RmFpbENudFtESUFHTk9TRV9USU1FXTsKKy8vCVVTSE9SVAkJCVR4RGVzY0NudFtESUFHTk9TRV9USU1FXVsxNl07CQkvLyBUeERlc2MgcXVldWUgbGVuZ3RoIGluIHNjYWxlIG9mIDB+MTQsID49MTUKKwlVU0hPUlQJCQlUeERlc2NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMJLy8gVHhEZXNjIHF1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwfjE0LCA+PTE1CisvLwlVU0hPUlQJCQlUeE1jc0NudFtESUFHTk9TRV9USU1FXVsxNl07CQkJLy8gVHhEYXRlIE1DUyBDb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIHN0ZXAgaW4gMS4KKwlVU0hPUlQJCQlUeE1jc0NudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMworCVVTSE9SVAkJCVR4U1dRdWVDbnRbRElBR05PU0VfVElNRV1bOV07CQkvLyBUeFN3UXVldWUgbGVuZ3RoIGluIHNjYWxlIG9mIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsID49OAorCisJVVNIT1JUCQkJVHhBZ2dDbnRbRElBR05PU0VfVElNRV07CisJVVNIT1JUCQkJVHhOb25BZ2dDbnRbRElBR05PU0VfVElNRV07CisvLwlVU0hPUlQJCQlUeEFNUERVQ250W0RJQUdOT1NFX1RJTUVdWzE2XTsJCS8vIDEwIHNlYywgVHhETUEgQVBNRFUgQWdncmVnYXRpb24gY291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBpbiBzZXRwIG9mIDEuCisJVVNIT1JUCQkJVHhBTVBEVUNudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMyAvLyAxMCBzZWMsIFR4RE1BIEFQTURVIEFnZ3JlZ2F0aW9uIGNvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgaW4gc2V0cCBvZiAxLgorCVVTSE9SVAkJCVR4UmFsaW5rQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFR4UmFsaW5rIEFnZ3JlZ2F0aW9uIENvdW50IGluIDEgc2VjIHNjYWxlLgorCVVTSE9SVAkJCVR4QU1TRFVDbnRbRElBR05PU0VfVElNRV07CQkJLy8gVHhBTVNVRCBBZ2dyZWdhdGlvbiBDb3VudCBpbiAxIHNlYyBzY2FsZS4KKworCS8vIFJ4IFJlbGF0ZWQgQ291bnQKKwlVU0hPUlQJCQlSeERhdGFDbnRbRElBR05PU0VfVElNRV07CQkJLy8gUnggVG90YWwgRGF0YSBjb3VudC4KKwlVU0hPUlQJCQlSeENyY0VyckNudFtESUFHTk9TRV9USU1FXTsKKy8vCVVTSE9SVAkJCVJ4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzE2XTsJCS8vIFJ4IE1DUyBDb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIHN0ZXAgaW4gMS4KKwlVU0hPUlQJCQlSeE1jc0NudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMworfVJ0bXBEaWFnU3RydWN0OworI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisKKy8vCisvLyAgVGhlIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCisvLwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfQURBUFRFUgoreworCVBWT0lECQkJCQlPU19Db29raWU7CS8vIHNhdmUgc3BlY2lmaWMgc3RydWN0dXJlIHJlbGF0aXZlIHRvIE9TCisJUE5FVF9ERVYJCQkJbmV0X2RldjsKKwlVTE9ORwkJCQkJVmlydHVhbElmQ250OworCisKKworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIGlycV9sb2NrOworCVVDSEFSICAgICAgICAgICAgICAgICAgIGlycV9kaXNhYmxlZDsKKworI2lmZGVmIFJUMjg3MAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBVU0IgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXN0cnVjdCB1c2JfY29uZmlnX2Rlc2NyaXB0b3IJCSpjb25maWc7CisJVUlOVAkJCQkJCQkJQnVsa0luRXBBZGRyOwkJLy8gYnVsay1pbiBlbmRwb2ludCBhZGRyZXNzCisJVUlOVAkJCQkJCQkJQnVsa091dEVwQWRkcls2XTsJLy8gYnVsay1vdXQgZW5kcG9pbnQgYWRkcmVzcworCisJVUlOVAkJCQkJCQkJTnVtYmVyT2ZQaXBlczsKKwlVU0hPUlQJCQkJCQkJCUJ1bGtPdXRNYXhQYWNrZXRTaXplOworCVVTSE9SVAkJCQkJCQkJQnVsa0luTWF4UGFja2V0U2l6ZTsKKworCS8vPT09PT09Q29udHJvbCBGbGFncworCUxPTkcgICAgICAgICAgICAgICAgICAgIAlQZW5kaW5nSW9Db3VudDsKKwlVTE9ORwkJCQkJCUJ1bGtGbGFnczsKKwlCT09MRUFOICAgICAgICAgICAgICAgICAgICAgYlVzYlR4QnVsa0FnZ3JlOwkvLyBGbGFncyBmb3IgYnVsayBvdXQgZGF0YSBwcmlvcml0eQorCisKKwkvLz09PT09PVRpbWVyIFRocmVhZAorCVJUMjg3MF9USU1FUl9RVUVVRQkJVGltZXJROworCU5ESVNfU1BJTl9MT0NLCQkJVGltZXJRTG9jazsKKworCisJLy89PT09PT1DbWQgVGhyZWFkCisJQ21kUQkJCQkJQ21kUTsKKwlORElTX1NQSU5fTE9DSwkJCUNtZFFMb2NrOwkJCQkvLyBDbWRRTG9jayBzcGlubG9jaworCisJQk9PTEVBTgkJCQkJVGltZXJGdW5jX2tpbGw7CisJQk9PTEVBTgkJCQkJbWxtZV9raWxsOworCisKKwkvLz09PT09PVNlbWFwaG9yZXMgKGV2ZW50KQorCXN0cnVjdCBzZW1hcGhvcmUJCQltbG1lX3NlbWFwaG9yZTsJCQkvKiB0byBzbGVlcCB0aHJlYWQgb24JKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlCQkJUlRVU0JDbWRfc2VtYXBob3JlOwkJLyogdG8gc2xlZXAgdGhyZWFkIG9uCSovCisJc3RydWN0IHNlbWFwaG9yZQkJCVJUVVNCVGltZXJfc2VtYXBob3JlOworI2lmZGVmIElORl9BTUFaT05fU0UKKwlzdHJ1Y3Qgc2VtYXBob3JlCQkJVXNiVmVuZG9yUmVxX3NlbWFwaG9yZTsKKwlQVk9JRAkJCQkJCVVzYlZlbmRvclJlcUJ1ZjsKKyNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCisJc3RydWN0IGNvbXBsZXRpb24JCQlUaW1lclFDb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbgkJCW1sbWVDb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbgkJCUNtZFFDb21wbGV0ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJCSp3YWl0OworCisJLy89PT09PT1Mb2NrIGZvciAyODcwIEFURQorI2lmZGVmIFJBTElOS19BVEUKKwlORElTX1NQSU5fTE9DSwkJCUdlbmVyaWNMb2NrOwkJLy8gQVRFIFR4L1J4IGdlbmVyaWMgc3BpbmxvY2sKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogICAgICBCb3RoIFBDSS9VU0IgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgVHggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCUJPT0xFQU4gICAgICAgICAgICAgICAgIERlUXVldWVSdW5uaW5nW05VTV9PRl9UWF9SSU5HXTsgIC8vIGZvciBlbnN1cmluZyBSVFVTQkRlUXVldWVQYWNrZXQgZ2V0IGNhbGwgb25jZQorCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIERlUXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsKKworI2lmZGVmIFJUMjg3MAorCS8vIERhdGEgcmVsYXRlZCBjb250ZXh0IGFuZCBBQyBzcGVjaWZpZWQsIDQgQUMgc3VwcG9ydGVkCisJTkRJU19TUElOX0xPQ0sJCQlCdWxrT3V0TG9ja1s2XTsJCQkvLyBCdWxrT3V0IHNwaW5sb2NrIGZvciA0IEFDcworCU5ESVNfU1BJTl9MT0NLCQkJTUxNRUJ1bGtPdXRMb2NrOwkvLyBNTE1FIEJ1bGtPdXQgbG9jaworCisJSFRfVFhfQ09OVEVYVAkJCVR4Q29udGV4dFtOVU1fT0ZfVFhfUklOR107CisJTkRJU19TUElOX0xPQ0sJCQlUeENvbnRleHRRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkJLy8gVHhDb250ZXh0UXVldWUgc3BpbmxvY2sKKworCS8vIDQgc2V0cyBvZiBCdWxrIE91dCBpbmRleCBhbmQgcGVuZGluZyBmbGFnCisJVUNIQVIJCQkJCU5leHRCdWxrT3V0SW5kZXhbNF07CS8vIG9ubHkgdXNlZCBmb3IgNCBFRENBIGJ1bGtvdXQgcGlwZQorCisJQk9PTEVBTgkJCQkJQnVsa091dFBlbmRpbmdbNl07CS8vIHVzZWQgZm9yIHRvdGFsIDYgYnVsa291dCBwaXBlCisJVUNIQVIJCQkJCWJ1bGtSZXNldFBpcGVpZDsKKwlCT09MRUFOCQkJCQlNZ210QnVsa1BlbmRpbmc7CisJVUxPTkcJCQkJCWJ1bGtSZXNldFJlcVs2XTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vIHJlc291cmNlIGZvciBzb2Z0d2FyZSBiYWNrbG9nIHF1ZXVlcworCVFVRVVFX0hFQURFUiAgICAgICAgICAgIFR4U3dRdWV1ZVtOVU1fT0ZfVFhfUklOR107ICAvLyA0IEFDICsgMSBIQ0NBCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgVHhTd1F1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CS8vIFR4U3dRdWV1ZSBzcGlubG9jaworCisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgTWdtdERlc2NSaW5nOyAgICAgICAgICAgICAgIAkvLyBTaGFyZWQgbWVtb3J5IGZvciBNR01UIGRlc2NyaXB0b3JzCisJUlRNUF9NR01UX1JJTkcgICAgICAgICAgTWdtdFJpbmc7CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWdtdFJpbmdMb2NrOyAgICAgICAgICAgICAgIAkvLyBQcmlvIFJpbmcgc3BpbmxvY2sKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFJ4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgUlQyODcwCisJUlhfQ09OVEVYVAkJCQlSeENvbnRleHRbUlhfUklOR19TSVpFXTsgIC8vIDEgZm9yIHJlZHVuZGFudCBtdWx0aXBsZSBJUlAgYnVsayBpbi4KKwlORElTX1NQSU5fTE9DSwkJCUJ1bGtJbkxvY2s7CQkJCS8vIEJ1bGtJbiBzcGlubG9jayBmb3IgNCBBQ3MKKwlVQ0hBUgkJCQkJUGVuZGluZ1J4OwkJCQkvLyBUaGUgTWF4aW1hIHBlbmRpbmcgUnggdmFsdWUgc2hvdWxkIGJlIAlSWF9SSU5HX1NJWkUuCisJVUNIQVIJCQkJCU5leHRSeEJ1bGtJbkluZGV4OwkJLy8gSW5kaWNhdGUgdGhlIGN1cnJlbnQgUnhDb250ZXh0IEluZGV4IHdoaWNoIGhvbGQgYnkgSG9zdCBjb250cm9sbGVyLgorCVVDSEFSCQkJCQlOZXh0UnhCdWxrSW5SZWFkSW5kZXg7CS8vIEluZGljYXRlIHRoZSBjdXJyZW50IFJ4Q29udGV4dCBJbmRleCB3aGljaCBkcml2ZXIgY2FuIHJlYWQgJiBwcm9jZXNzIGl0LgorCVVMT05HCQkJCQlOZXh0UnhCdWxrSW5Qb3NpdGlvbjsgICAvLyBXYW50IHRvIGNvbnRhdGVuYXRlIDIgVVJCIGJ1ZmZlciB3aGlsZSAxc3QgaXMgYnVsa2luIGZhaWxlZCBVUkIuIFRoaXMgUG9zaXRpb24gaXMgMXN0IFVSQiBUcmFuc2Zlckxlbmd0aC4KKwlVTE9ORwkJCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGg7CS8vIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgYnVmZmVyCisJVUxPTkcJCQkJCVJlYWRQb3NpdGlvbjsJCQkvLyBjdXJyZW50IHJlYWQgcG9zaXRpb24gaW4gYSBwYWNrZXQgYnVmZmVyCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBBU0lDIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCVVJTlQzMiAgICAgICAgICAgICAgIAlNQUNWZXJzaW9uOyAgICAgIAkvLyBNQUMgdmVyc2lvbi4gUmVjb3JkIHJ0Mjg2MEMoMHgyODYwMDEwMCkgb3IgcnQyODYwRCAoMHgyODYwMDEwMSkuLgorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gRTJQUk9NCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUxPTkcgICAgICAgICAgICAgICAgICAgRWVwcm9tVmVyc2lvbjsgICAgICAgICAgLy8gYnl0ZSAwOiB2ZXJzaW9uLCBieXRlIDE6IHJldmlzaW9uLCBieXRlIDJ+MzogdW51c2VkCisJVUNIQVIgICAgICAgICAgICAgICAgICAgRUVQUk9NQWRkcmVzc051bTsgICAgICAgLy8gOTNjNDY9NiAgOTNjNjY9OAorCVVTSE9SVCAgICAgICAgICAgICAgICAgIEVFUFJPTURlZmF1bHRWYWx1ZVtOVU1fRUVQUk9NX0JCUF9QQVJNU107CisJVUxPTkcgICAgICAgICAgICAgICAgICAgRmlybXdhcmVWZXJzaW9uOyAgICAgICAgLy8gYnl0ZSAwOiBNaW5vciB2ZXJzaW9uLCBieXRlIDE6IE1ham9yIHZlcnNpb24sIG90aGVyd2lzZSB1bnVzZWQuCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBCQlAgQ29udHJvbAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVDSEFSICAgICAgICAgICAgICAgICAgIEJicFdyaXRlTGF0Y2hbMTQwXTsgICAgIC8vIHJlY29yZCBsYXN0IEJCUCByZWdpc3RlciB2YWx1ZSB3cml0dGVuIHZpYSBCQlBfSU9fV1JJVEUvQkJQX0lPX1dSSVRFX1ZZX1JFR19JRAorCVVDSEFSICAgICAgICAgICAgICAgICAgIEJicFJzc2lUb0RibURlbHRhOworCUJCUF9SNjZfVFVOSU5HICAgICAgICAgIEJicFR1bmluZzsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBSRklDIGNvbnRyb2wKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUmZJY1R5cGU7ICAgICAgIC8vIFJGSUNfeHh4CisJVUxPTkcgICAgICAgICAgICAgICAgICAgUmZGcmVxT2Zmc2V0OyAgIC8vIEZyZXF1ZW5jeSBvZmZzZXQgZm9yIGNoYW5uZWwgc3dpdGNoaW5nCisJUlRNUF9SRl9SRUdTICAgICAgICAgICAgTGF0Y2hSZlJlZ3M7ICAgIC8vIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRAorCisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgICAgQW50ZW5uYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgQU50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKworCS8vIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQKKwkvLyBSWCBBbnRlbm5hID0gRElWRVJTSVRZIE9OCisJU09GVF9SWF9BTlRfRElWRVJTSVRZICAgUnhBbnQ7CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBSRlByb2dTZXE7CisJQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgVHhQb3dlcltNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAgICAgLy8gU3RvcmUgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscy4KKwlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisJQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgVHhQb3dlcjExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAgICAgLy8gODAyLjExaiBjaGFubmVsIGFuZCBidworCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIENoYW5uZWxMaXN0MTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKKworCVVDSEFSICAgICAgICAgICAgICAgICAgIENoYW5uZWxMaXN0TnVtOyAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KKwlVQ0hBUgkJCQkJQmJwOTQ7CisJQk9PTEVBTgkJCQkJQmJwRm9yQ0NLOworCVVMT05HCQlUeDIwTVB3ckNmZ0FCYW5kWzVdOworCVVMT05HCQlUeDIwTVB3ckNmZ0dCYW5kWzVdOworCVVMT05HCQlUeDQwTVB3ckNmZ0FCYW5kWzVdOworCVVMT05HCQlUeDQwTVB3ckNmZ0dCYW5kWzVdOworCisJQk9PTEVBTiAgICAgYkF1dG9UeEFnY0E7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAorCVVDSEFSCSAgICBUc3NpUmVmQTsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgorCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCisJVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCisJVUNIQVIJICAgIFR4QWdjU3RlcEE7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQorCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUE7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKKworCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NHOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKKwlVQ0hBUgkgICAgVHNzaVJlZkc7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KKwlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUeEFnY1N0ZXBHOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKKwlDSEFSCQlUeEFnY0NvbXBlbnNhdGVHOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCisKKwkvLysrK0ZvciBSVDI4NzAsIHRoZSBwYXJhbWV0ZXJlcyBpcyBzdGFydCBmcm9tIEJHUnNzaU9mZnNldDEgfiBCR1Jzc2lPZmZzZXQzCisJQ0hBUgkJQkdSc3NpT2Zmc2V0MDsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMCBPZmZzZXQgdmFsdWUgb24gRUVQUk9NIDB4NDZoCisJQ0hBUgkJQkdSc3NpT2Zmc2V0MTsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMSBPZmZzZXQgdmFsdWUKKwlDSEFSCQlCR1Jzc2lPZmZzZXQyOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMyIE9mZnNldCB2YWx1ZQorCS8vLS0tCisKKwkvLysrK0ZvciBSVDI4NzAsIHRoZSBwYXJhbWV0ZXJlcyBpcyBzdGFydCBmcm9tIEFSc3NpT2Zmc2V0MSB+IEFSc3NpT2Zmc2V0MworCUNIQVIJCUFSc3NpT2Zmc2V0MDsJCQkJLy8gU3RvcmUgQSBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDRBaAorCUNIQVIJCUFSc3NpT2Zmc2V0MTsJCQkJLy8gU3RvcmUgQSBSU1NJIzEgT2Zmc2V0IHZhbHVlCisJQ0hBUgkJQVJzc2lPZmZzZXQyOwkJCQkvLyBTdG9yZSBBIFJTU0kjMiBPZmZzZXQgdmFsdWUKKwkvLy0tLQorCisJQ0hBUgkJQkxOQUdhaW47CQkJCQkvLyBTdG9yZSBCL0cgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgb24gRUVQUk9NIDB4NDRoCisJQ0hBUgkJQUxOQUdhaW4wOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMCB2YWx1ZSBmb3IgY2gzNn42NAorCUNIQVIJCUFMTkFHYWluMTsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzEgdmFsdWUgZm9yIGNoMTAwfjEyOAorCUNIQVIJCUFMTkFHYWluMjsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzIgdmFsdWUgZm9yIGNoMTMyfjE2NQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIExFRCBjb250cm9sCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU1DVV9MRURDU19TVFJVQwkJTGVkQ250bDsKKwlVU0hPUlQJCQkJTGVkMTsJLy8gcmVhZCBmcm9tIEVFUFJPTSAweDNjCisJVVNIT1JUCQkJCUxlZDI7CS8vIEVFUFJPTSAweDNlCisJVVNIT1JUCQkJCUxlZDM7CS8vIEVFUFJPTSAweDQwCisJVUNIQVIJCQkJTGVkSW5kaWNhdG9yU3RyZWd0aDsKKwlVQ0hBUgkJCQlSc3NpU2luZ2Fsc3RyZW5ndGhPZmZldDsKKyAgICBCT09MRUFOCQkJCWJMZWRPblNjYW5uaW5nOworCVVDSEFSCQkJCUxlZFN0YXR1czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICA4MDIuMTEgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8vIG91dGdvaW5nIEJFQUNPTiBmcmFtZSBidWZmZXIgYW5kIGNvcnJlc3BvbmRpbmcgVFhECisJVFhXSV9TVFJVQyAgICAgICAgICAgICAgCUJlYWNvblR4V0k7CisJUFVDSEFSCQkJCQkJQmVhY29uQnVmOworCVVTSE9SVAkJCQkJCUJlYWNvbk9mZnNldFtIV19CRUFDT05fTUFYX0NPVU5UXTsKKworCS8vIHByZS1idWlsZCBQUy1QT0xMIGFuZCBOVUxMIGZyYW1lIHVwb24gbGluayB1cC4gZm9yIGVmZmljaWVuY3kgcHVycG9zZS4KKwlQU1BPTExfRlJBTUUgICAgICAgICAgICAJUHNQb2xsRnJhbWU7CisJSEVBREVSXzgwMl8xMSAgICAgICAgICAgCU51bGxGcmFtZTsKKworI2lmZGVmIFJUMjg3MAorCVRYX0NPTlRFWFQJCQkJQmVhY29uQ29udGV4dFtCRUFDT05fUklOR19TSVpFXTsKKwlUWF9DT05URVhUCQkJCU51bGxDb250ZXh0OworCVRYX0NPTlRFWFQJCQkJUHNQb2xsQ29udGV4dDsKKwlUWF9DT05URVhUCQkJCVJUU0NvbnRleHQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworCisvLz09PT09PT09PUFQPT09PT09PT09PT0KKworCisvLz09PT09PT1TVEE9PT09PT09PT09PQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RBIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gJiBvcGVyYXRpb24gc3RhdHVzCisJLy8gdXNlZCBvbmx5IHdoZW4gcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU1RBX0FETUlOX0NPTkZJRyAgICAgICAgU3RhQ2ZnOyAgICAgICAgICAgLy8gdXNlciBkZXNpcmVkIHNldHRpbmdzCisJU1RBX0FDVElWRV9DT05GSUcgICAgICAgU3RhQWN0aXZlOyAgICAgICAgIC8vIHZhbGlkIG9ubHkgd2hlbiBBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkKKwlDSEFSICAgICAgICAgICAgICAgICAgICBuaWNrbmFtZVtJV19FU1NJRF9NQVhfU0laRSsxXTsgLy8gbmlja25hbWUsIG9ubHkgdXNlZCBpbiB0aGUgaXdjb25maWcgaS9mCisJTkRJU19NRURJQV9TVEFURSAgICAgICAgUHJlTWVkaWFTdGF0ZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy89PT09PT09Q29tbW9uPT09PT09PT09PT0KKwkvLyBPUCBtb2RlOiBlaXRoZXIgQVAgb3IgU1RBCisJVUNIQVIgICAgICAgICAgICAgICAgICAgT3BNb2RlOyAgICAgICAgICAgICAgICAgICAgIC8vIE9QTU9ERV9TVEEsIE9QTU9ERV9BUAorCisJTkRJU19NRURJQV9TVEFURSAgICAgICAgSW5kaWNhdGVNZWRpYVN0YXRlOwkJCS8vIEJhc2Ugb24gSW5kaWNhdGlvbiBzdGF0ZSwgZGVmYXVsdCBpcyBOZGlzTWVkaWFTdGF0ZURpc0Nvbm5lY3RlZAorCisKKwkvLyBjb25maWd1cmF0aW9uOiByZWFkIGZyb20gUmVnaXN0cnkgJiBFMlBST00KKwlCT09MRUFOICAgICAgICAgICAgICAgICBiTG9jYWxBZG1pbk1BQzsgICAgICAgICAgICAgLy8gVXNlIHVzZXIgY2hhbmdlZCBNQUMKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBQZXJtYW5lbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgIC8vIEZhY3RvcnkgZGVmYXVsdCBNQUMgYWRkcmVzcworCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgICAgLy8gVXNlciBjaGFuZ2VkIE1BQyBhZGRyZXNzCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBjb21tb24gY29uZmlndXJhdGlvbiB0byBib3RoIE9QTU9ERV9TVEEgYW5kIE9QTU9ERV9BUAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUNPTU1PTl9DT05GSUcgICAgICAgICAgIENvbW1vbkNmZzsKKwlNTE1FX1NUUlVDVCAgICAgICAgICAgICBNbG1lOworCisJLy8gQVAgbmVlZHMgdGhvc2UgdmFpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuCisJTUxNRV9BVVggICAgICAgICAgICAgICAgTWxtZUF1eDsgICAgICAgICAgIC8vIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUKKwlCU1NfVEFCTEUgICAgICAgICAgICAgICBTY2FuVGFiOyAgICAgICAgICAgLy8gc3RvcmUgdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdAorCisJLy9BYm91dCBNYWNUYWIsIHRoZSBzdGEgZHJpdmVyIHdpbGwgdXNlICMwIGFuZCAjMSBmb3IgbXVsdGljYXN0IGFuZCBBUC4KKwlNQUNfVEFCTEUgICAgICAgICAgICAgICAgIE1hY1RhYjsgICAgIC8vIEFTSUMgb24tY2hpcCBXQ0lEIGVudHJ5IHRhYmxlLiAgQXQgVFgsIEFTSUMgYWx3YXlzIHVzZSBrZXkgYWNjb3JkaW5nIHRvIHRoaXMgb24tY2hpcCB0YWJsZS4KKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBNYWNUYWJMb2NrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQkFfVEFCTEUJCQlCQVRhYmxlOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIEJBVGFiTG9jazsKKwlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7CisKKwkvLyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gS0VZIHRhYmxlcworCUNJUEhFUl9LRVkgICAgICAgICAgICAgIFNoYXJlZEtleVtNQVhfTUJTU0lEX05VTV1bNF07IC8vIFNUQSBhbHdheXMgdXNlIFNoYXJlZEtleVtCU1MwXVswLi4zXQorCisJCS8vIFJYIHJlLWFzc2VtYmx5IGJ1ZmZlciBmb3IgZnJhZ21lbnRhdGlvbgorCUZSQUdNRU5UX0ZSQU1FICAgICAgICAgIEZyYWdGcmFtZTsgICAgICAgICAgICAgICAgICAvLyBGcmFtZSBzdG9yYWdlIGZvciBmcmFnbWVudCBmcmFtZQorCisJLy8gdmFyaW91cyBDb3VudGVycworCUNPVU5URVJfODAyXzMgICAgICAgICAgIENvdW50ZXJzODAyMzsgICAgICAgICAgICAgICAvLyA4MDIuMyBjb3VudGVycworCUNPVU5URVJfODAyXzExICAgICAgICAgIFdsYW5Db3VudGVyczsgICAgICAgICAgICAgICAvLyA4MDIuMTEgTUlCIGNvdW50ZXJzCisJQ09VTlRFUl9SQUxJTksgICAgICAgICAgUmFsaW5rQ291bnRlcnM7ICAgICAgICAgICAgIC8vIFJhbGluayBwcm9wcmlldHkgY291bnRlcnMKKwlDT1VOVEVSX0RSUyAgICAgICAgICAgICBEcnNDb3VudGVyczsgICAgICAgICAgICAgICAgLy8gY291bnRlcnMgZm9yIER5bmFtaWMgVFggUmF0ZSBTd2l0Y2hpbmcKKwlQUklWQVRFX1NUUlVDICAgICAgICAgICBQcml2YXRlSW5mbzsgICAgICAgICAgICAgICAgLy8gUHJpdmF0ZSBpbmZvcm1hdGlvbiAmIGNvdW50ZXJzCisKKwkvLyBmbGFncywgc2VlIGZSVE1QX0FEQVBURVJfeHh4IGZsYWdzCisJVUxPTkcgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcHJlc2VudCBjdXJyZW50IGRldmljZSBzdGF0dXMKKworCS8vIGN1cnJlbnQgVFggc2VxdWVuY2UgIworCVVTSE9SVCAgICAgICAgICAgICAgICAgIFNlcXVlbmNlOworCisJLy8gQ29udHJvbCBkaXNjb25uZWN0IC8gY29ubmVjdCBldmVudCBnZW5lcmF0aW9uCisJLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGlua0Rvd25UaW1lOworCS8vLS0tCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFJ4UmF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0VHhSYXRlOworCS8vKysrVXNlZCBvbmx5IGZvciBTdGF0aW9uCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYkNvbmZpZ0NoYW5nZWQ7ICAgICAgICAgLy8gQ29uZmlnIENoYW5nZSBmbGFnIGZvciB0aGUgc2FtZSBTU0lEIHNldHRpbmcKKwkvLy0tLQorCisJVUxPTkcgICAgICAgICAgICAgICAgICAgRXh0cmFJbmZvOyAgICAgICAgICAgICAgLy8gRXh0cmEgaW5mb3JtYXRpb24gZm9yIGRpc3BsYXlpbmcgc3RhdHVzCisJVUxPTkcgICAgICAgICAgICAgICAgICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAgICAgLy8gYjA6IEUyUFJPTSB2ZXJzaW9uIGVycm9yCisKKwkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBNYWNJY1ZlcnNpb247ICAgICAgICAgICAvLyBNQUMvQkJQIHNlcmlhbCBpbnRlcmZhY2UgaXNzdWUgc29sdmVkIGFmdGVyIHZlci5ECisJLy8tLS0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFN5c3RlbSBldmVudCBsb2cKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlSVF84MDJfMTFfRVZFTlRfVEFCTEUgICBFdmVudFRhYjsKKworCisJQk9PTEVBTgkJSFRDRW5hYmxlOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qICAgICAgU3RhdGlzdGljIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgUlQyODcwCisJVUxPTkcJCQkJCQlCdWxrT3V0RGF0YU9uZVNlY0NvdW50OworCVVMT05HCQkJCQkJQnVsa0luRGF0YU9uZVNlY0NvdW50OworCVVMT05HCQkJCQkJQnVsa0xhc3RPbmVTZWNDb3VudDsgLy8gQnVsa091dERhdGFPbmVTZWNDb3VudCArIEJ1bGtJbkRhdGFPbmVTZWNDb3VudAorCVVMT05HCQkJCQkJd2F0Y2hEb2dSeENudDsKKwlVTE9ORwkJCQkJCXdhdGNoRG9nUnhPdmVyRmxvd0NudDsKKwlVTE9ORwkJCQkJCXdhdGNoRG9nVHhQZW5kaW5nQ250W05VTV9PRl9UWF9SSU5HXTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCUJPT0xFQU4JCQkJCQliVXBkYXRlQmNuQ250RG9uZTsKKwlVTE9ORwkJCQkJCXdhdGNoRG9nTWFjRGVhZGxvY2s7CS8vIHByZXZlbnQgTUFDL0JCUCBpbnRvIGRlYWRsb2NrIGNvbmRpdGlvbgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBERUJVRyBwYXJhbWVydHMKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy9VTE9ORwkJRGVidWdTZXR0aW5nWzRdOworCUJPT0xFQU4JCWJCYW5BbGxCYVNldHVwOworCUJPT0xFQU4JCWJQcm9taXNjdW91czsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBydDI4NjBjIGVtdWxhdGlvbi11c2UgUGFyYW1ldGVycworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVTE9ORwkJcnRzYWNjdVszMF07CisJVUxPTkcJCWN0c2FjY3VbMzBdOworCVVMT05HCQljZmVuZGFjY3VbMzBdOworCVVMT05HCQliYWNvbnRlbnRbMTZdOworCVVMT05HCQlyeGludFtSWF9SSU5HX1NJWkUrMV07CisJVUNIQVIJCXJjdmJhWzYwXTsKKwlCT09MRUFOCQliTGlua0FkYXB0OworCUJPT0xFQU4JCWJGb3JjZVByaW50VFg7CisJQk9PTEVBTgkJYkZvcmNlUHJpbnRSWDsKKwlCT09MRUFOCQliRGlzYWJsZXNjYW5uaW5nOwkJLy9kZWZpbmVkIGluIFJUMjg3MCBVU0IKKwlCT09MRUFOCQliU3RhRmlmb1Rlc3Q7CisJQk9PTEVBTgkJYlByb3RlY3Rpb25UZXN0OworCUJPT0xFQU4JCWJIQ0NBVGVzdDsKKwlCT09MRUFOCQliR2VuT25lSENDQTsKKwlCT09MRUFOCQliQnJvYWRDb21IVDsKKwkvLysrK0ZvbGxvd2luZyBhZGQgZnJvbSBSVDI4NzAgVVNCLgorCVVMT05HCQlCdWxrT3V0UmVxOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGU7CisJVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZU90aGVyOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8vIHNlZW1zIG5vdCB1c2Ugbm93PworCVVMT05HCQlCdWxrSW5SZXE7CisJVUxPTkcJCUJ1bGtJbkNvbXBsZXRlOworCVVMT05HCQlCdWxrSW5Db21wbGV0ZUZhaWw7CisJLy8tLS0KKworICAgIHN0cnVjdCB3aWZpY29uZgkJCVdJRkl0ZXN0YmVkOworCisjaWZkZWYgUkFMSU5LX0FURQorCUFURV9JTkZPCQkJCWF0ZTsKKyNpZmRlZiBSVDI4NzAKKwlCT09MRUFOCQkJCQlDb250aW5CdWxrT3V0OwkJLy9BVEUgYnVsayBvdXQgY29udHJvbAorCUJPT0xFQU4JCQkJCUNvbnRpbkJ1bGtJbjsJCS8vQVRFIGJ1bGsgaW4gY29udHJvbAorCWF0b21pY190CQkJCUJ1bGtPdXRSZW1haW5lZDsKKwlhdG9taWNfdAkJCQlCdWxrSW5SZW1haW5lZDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wgbXBkdV9ibGtfcG9vbDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVVMT05HCQkJCQlPbmVTZWNvbmRub25CRXBhY2tldHM7CQkvLyByZWNvcmQgbm9uIEJFIHBhY2tldHMgcGVyIHNlY29uZAorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgICAgaXdfc3RhdHM7CisjZW5kaWYKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJQkxPQ0tfUVVFVUVfRU5UUlkJCWJsb2NrUXVldWVUYWJbTlVNX09GX1RYX1JJTkddOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCUlOVDMyCQkJCQlNQ19Sb3dJRDsKKwlVQ0hBUgkJCQkJTUNfRmlsZU5hbWVbMjU2XTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCVVMT05HCQkJCQlUYnR0VGlja0NvdW50OworI2lmZGVmIFBDSV9NU0lfU1VQUE9SVAorCUJPT0xFQU4JCQkJCUhhdmVNc2k7CisjZW5kaWYgLy8gUENJX01TSV9TVVBQT1JUIC8vCisKKworCVVDSEFSCQkJCQlpc19vbjsKKworI2RlZmluZSBUSU1FX0JBU0UJCQkoMTAwMDAwMC9PU19IWikKKyNkZWZpbmUgVElNRV9PTkVfU0VDT05ECQkoMTAwMDAwMC9USU1FX0JBU0UpCisJVUNIQVIJCQkJCWZsZ19iZV9hZGp1c3Q7CisJVUxPTkcJCQkJCWJlX2FkanVzdF9sYXN0X3RpbWU7CisKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8JSWthbm9zVHhJbmZvOworCXN0cnVjdCBJS0FOT1NfVFhfSU5GTwlJa2Fub3NSeEluZm9bTUFYX01CU1NJRF9OVU0gKyBNQVhfV0RTX0VOVFJZICsgTUFYX0FQQ0xJX05VTSArIE1BWF9NRVNIX05VTV07CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworCisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwlSdG1wRGlhZ1N0cnVjdAlEaWFnU3RydWN0OworI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisKKwlVSU5UOAkJCQkJUE1fRmxnU3VzcGVuZDsKK30gUlRNUF9BREFQVEVSLCAqUFJUTVBfQURBUFRFUjsKKworLy8KKy8vIENpc2NvIElBUFAgZm9ybWF0CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9DSVNDT19JQVBQX0NPTlRFTlRfCit7CisJVVNIT1JUICAgICBMZW5ndGg7ICAgICAgICAvL0lBUFAgTGVuZ3RoCisJVUNIQVIgICAgICBNZXNzYWdlVHlwZTsgICAgICAvL0lBUFAgdHlwZQorCVVDSEFSICAgICAgRnVuY3Rpb25Db2RlOyAgICAgLy9JQVBQIGZ1bmN0aW9uIHR5cGUKKwlVQ0hBUiAgICAgIERlc3RpbmFpb25NQUNbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgIFNvdXJjZU1BQ1tNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgVGFnOyAgICAgICAgICAgLy9UYWcoZWxlbWVudCBJRSkgLSBBZGphY2VudCBBUCByZXBvcnQKKwlVU0hPUlQgICAgIFRhZ0xlbmd0aDsgICAgIC8vTGVuZ3RoIG9mIGVsZW1lbnQgbm90IGluY2x1ZGluZyA0IGJ5dGUgaGVhZGVyCisJVUNIQVIgICAgICBPVUlbNF07ICAgICAgICAgICAvLzB4MDAsIDB4NDAsIDB4OTYsIDB4MDAKKwlVQ0hBUiAgICAgIFByZXZpb3VzQVBbTUFDX0FERFJfTEVOXTsgICAgICAgLy9NQUMgQWRkcmVzcyBvZiBhY2Nlc3MgcG9pbnQKKwlVU0hPUlQgICAgIENoYW5uZWw7CisJVVNIT1JUICAgICBTc2lkTGVuOworCVVDSEFSICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCVVTSE9SVCAgICAgU2Vjb25kczsgICAgICAgICAgLy9TZWNvbmRzIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbiBkaXNhc3NvY2lhdGVkLgorfSBDSVNDT19JQVBQX0NPTlRFTlQsICpQQ0lTQ09fSUFQUF9DT05URU5UOworCisjZGVmaW5lIERFTEFZSU5UTUFTSwkJMHgwMDAzZmZmYgorI2RlZmluZSBJTlRNQVNLCQkJCTB4MDAwM2ZmZmIKKyNkZWZpbmUgSW5kTWFzawkJCQkweDAwMDNmZmZjCisjZGVmaW5lIFJ4SU5UCQkJCTB4MDAwMDAwMDUJLy8gRGVsYXllZCBSeCBvciBpbmRpdmkgcngKKyNkZWZpbmUgVHhEYXRhSW50CQkJMHgwMDAwMDBmYQkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAorI2RlZmluZSBUeE1nbXRJbnQJCQkweDAwMDAwMTAyCS8vIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4CisjZGVmaW5lIFR4Q29oZXJlbnQJCQkweDAwMDIwMDAwCS8vIHR4IGNvaGVyZW50CisjZGVmaW5lIFJ4Q29oZXJlbnQJCQkweDAwMDEwMDAwCS8vIHJ4IGNvaGVyZW50CisjZGVmaW5lIE1jdUNvbW1hbmQJCQkweDAwMDAwMjAwCS8vIG1jdQorI2RlZmluZSBQcmVUQlRUSW50CQkJMHgwMDAwMTAwMAkvLyBQcmUtVEJUVCBpbnRlcnJ1cHQKKyNkZWZpbmUgVEJUVEludAkJCQkweDAwMDAwODAwCQkvLyBUQlRUIGludGVycnVwdAorI2RlZmluZSBHUFRpbWVPdXRJbnQJCQkweDAwMDA4MDAwCQkvLyBHUHRpbWVvdXQgaW50ZXJydXB0CisjZGVmaW5lIEF1dG9XYWtldXBJbnQJCTB4MDAwMDQwMDAJCS8vIEF1dG9XYWtldXBJbnQgaW50ZXJydXB0CisjZGVmaW5lIEZpZm9TdGFGdWxsSW50CQkJMHgwMDAwMjAwMAkvLyAgZmlmbyBzdGF0aXN0aWNzIGZ1bGwgaW50ZXJydXB0CisKKwordHlwZWRlZiBzdHJ1Y3QgX1JYX0JMS18KK3sKKy8vCVJYRF9TVFJVQwkJUnhEOyAvLyBzYW1wbGUKKwlSVDI4WFhfUlhEX1NUUlVDCVJ4RDsKKwlQUlhXSV9TVFJVQwkJCXBSeFdJOworCVBIRUFERVJfODAyXzExCQlwSGVhZGVyOworCVBORElTX1BBQ0tFVAkJcFJ4UGFja2V0OworCVVDSEFSCQkJCSpwRGF0YTsKKwlVU0hPUlQJCQkJRGF0YVNpemU7CisJVVNIT1JUCQkJCUZsYWdzOworCVVDSEFSCQkJCVVzZXJQcmlvcml0eTsJLy8gZm9yIGNhbGN1bGF0ZSBUS0lQIE1JQyB1c2luZworfSBSWF9CTEs7CisKKworI2RlZmluZSBSWF9CTEtfU0VUX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCQkoX3BSeEJsay0+RmxhZ3MgfD0gX2ZsYWcpCisjZGVmaW5lIFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCShfcFJ4QmxrLT5GbGFncyAmIF9mbGFnKQorI2RlZmluZSBSWF9CTEtfQ0xFQVJfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQorCisKKyNkZWZpbmUgZlJYX1dEUwkJCTB4MDAwMQorI2RlZmluZSBmUlhfQU1TRFUgICAgICAgMHgwMDAyCisjZGVmaW5lIGZSWF9BUkFMSU5LICAgICAweDAwMDQKKyNkZWZpbmUgZlJYX0hUQyAgICAgICAgIDB4MDAwOAorI2RlZmluZSBmUlhfUEFEICAgICAgICAgMHgwMDEwCisjZGVmaW5lIGZSWF9BTVBEVSAgICAgICAweDAwMjAKKyNkZWZpbmUgZlJYX1FPUwkJCTB4MDA0MAorI2RlZmluZSBmUlhfSU5GUkEJCTB4MDA4MAorI2RlZmluZSBmUlhfRUFQCQkJMHgwMTAwCisjZGVmaW5lIGZSWF9NRVNICQkweDAyMDAKKyNkZWZpbmUgZlJYX0FQQ0xJCQkweDA0MDAKKyNkZWZpbmUgZlJYX0RMUwkJCTB4MDgwMAorI2RlZmluZSBmUlhfV1BJCQkJMHgxMDAwCisKKyNkZWZpbmUgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRAkxNAorI2RlZmluZSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQJMTQKKyNkZWZpbmUgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxECSAyCisKKyNkZWZpbmUgVFhfVU5LT1dOX0ZSQU1FCQkJMHgwMAorI2RlZmluZSBUWF9NQ0FTVF9GUkFNRQkJCTB4MDEKKyNkZWZpbmUgVFhfTEVHQUNZX0ZSQU1FCQkJMHgwMgorI2RlZmluZSBUWF9BTVBEVV9GUkFNRQkJCTB4MDQKKyNkZWZpbmUgVFhfQU1TRFVfRlJBTUUJCQkweDA4CisjZGVmaW5lIFRYX1JBTElOS19GUkFNRQkJCTB4MTAKKyNkZWZpbmUgVFhfRlJBR19GUkFNRQkJCTB4MjAKKworCisvLwlDdXJyZW50bHkgdGhlIHNpemVvZihUWF9CTEspIGlzIDE0OCBieXRlcy4KK3R5cGVkZWYgc3RydWN0IF9UWF9CTEtfCit7CisJVUNIQVIJCQkJUXVlSWR4OworCVVDSEFSCQkJCVR4RnJhbWVUeXBlOwkJCQkvLyBJbmRpY2F0ZSB0aGUgVHJhbnNtaXNzaW9uIHR5cGUgb2YgdGhlIGFsbCBmcmFtZXMgaW4gb25lIGJhdGNoCisJVUNIQVIJCQkJVG90YWxGcmFtZU51bTsJCQkJLy8gVG90YWwgZnJhbWUgbnVtYmVyIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCisJVVNIT1JUCQkJCVRvdGFsRnJhZ051bTsJCQkJLy8gVG90YWwgZnJhbWUgZnJhZ21lbnRzIHJlcXVpcmVkIGluIG9uZSBiYXRjaAorCVVTSE9SVAkJCQlUb3RhbEZyYW1lTGVuOwkJCQkvLyBUb3RhbCBsZW5ndGggb2YgYWxsIGZyYW1lcyB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaAorCisJUVVFVUVfSEVBREVSCQlUeFBhY2tldExpc3Q7CisJTUFDX1RBQkxFX0VOVFJZCQkqcE1hY0VudHJ5OwkJCQkJLy8gTlVMTDogcGFja2V0IHdpdGggODAyLjExIFJBIGZpZWxkIGlzIG11bHRpY2FzdC9icm9hZGNhc3QgYWRkcmVzcworCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0OworCisJLy8gRm9sbG93aW5nIHN0cnVjdHVyZSB1c2VkIGZvciB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgc3BlY2lmaWMgcGFja2V0LgorCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKwlQVUNIQVIJCQkJcFNyY0J1ZkhlYWRlcjsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBoZWFkIG9mIHNrX2J1ZmYtPmRhdGEKKwlQVUNIQVIJCQkJcFNyY0J1ZkRhdGE7CQkJCS8vIFJlZmVyZW5jZSB0byB0aGUgc2tfYnVmZi0+ZGF0YSwgd2lsbCBjaGFuZ2VkIGRlcGVuZHMgb24gaGFubGRpbmcgcHJvZ3Jlc3NzCisJVUlOVAkJCQlTcmNCdWZMZW47CQkJCQkvLyBMZW5ndGggb2YgcGFja2V0IHBheWxvYWQgd2hpY2ggbm90IGluY2x1ZGluZyBMYXllciAyIGhlYWRlcgorCVBVQ0hBUgkJCQlwRXh0cmFMbGNTbmFwRW5jYXA7CQkJLy8gTlVMTCBtZWFucyBubyBleHRyYSBMTEMvU05BUCBpcyByZXF1aXJlZAorCVVDSEFSCQkJCUhlYWRlckJ1Zls4MF07CQkJCS8vIFRlbXBCdWZmZXIgZm9yIFRYX0lORk8gKyBUWF9XSSArIDgwMi4xMSBIZWFkZXIgKyBwYWRkaW5nICsgQU1TRFUgU3ViSGVhZGVyICsgTExDL1NOQVAKKwlVQ0hBUgkJCQlNcGR1SGVhZGVyTGVuOwkJCQkvLyA4MDIuMTEgaGVhZGVyIGxlbmd0aCBOT1QgaW5jbHVkaW5nIHRoZSBwYWRkaW5nCisJVUNIQVIJCQkJSGRyUGFkTGVuOwkJCQkJLy8gcmVjb3JkaW5nIEhlYWRlciBQYWRkaW5nIExlbmd0aDsKKwlVQ0hBUgkJCQlhcGlkeDsJCQkJCQkvLyBUaGUgaW50ZXJmYWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQKKwlVQ0hBUgkJCQlXY2lkOwkJCQkJCS8vIFRoZSBNQUMgZW50cnkgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAorCVVDSEFSCQkJCVVzZXJQcmlvcml0eTsJCQkJLy8gcHJpb3JpdHkgY2xhc3Mgb2YgcGFja2V0CisJVUNIQVIJCQkJRnJhbWVHYXA7CQkJCQkvLyB3aGF0IGtpbmQgb2YgSUZTIHRoaXMgcGFja2V0IHVzZQorCVVDSEFSCQkJCU1wZHVSZXFOdW07CQkJCQkvLyBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIHRoaXMgZnJhbWUKKwlVQ0hBUgkJCQlUeFJhdGU7CQkJCQkJLy8gVE9ETzogT2Jzb2xldGVkPyBTaG91bGQgY2hhbmdlIHRvIE1DUz8KKwlVQ0hBUgkJCQlDaXBoZXJBbGc7CQkJCQkvLyBjaXBoZXIgYWxvZ3JpdGhtCisJUENJUEhFUl9LRVkJCQlwS2V5OworCisKKworCVVTSE9SVAkJCQlGbGFnczsJCQkJCQkvL1NlZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIGRldGFpbC4KKworCS8vWU9VIFNIT1VMRCBOT1QgVE9VQ0ggSVQhIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBoYXJkd2FyZS1kZXBlbmRlZCBsYXllci4KKwlVTE9ORwkJCQlQcml2OwkJCQkJCS8vIEhhcmR3YXJlIHNwZWNpZmljIHZhbHVlIHNhdmVkIGluIGhlcmUuCit9IFRYX0JMSywgKlBUWF9CTEs7CisKKworI2RlZmluZSBmVFhfYlJ0c1JlcXVpcmVkCQkweDAwMDEJLy8gSW5kaWNhdGUgaWYgbmVlZCBzZW5kIFJUUyBmcmFtZSBmb3IgcHJvdGVjdGlvbi4gTm90IHVzZWQgaW4gUlQyODYwL1JUMjg3MC4KKyNkZWZpbmUgZlRYX2JBY2tSZXF1aXJlZCAgICAgICAJMHgwMDAyCS8vIHRoZSBwYWNrZXQgbmVlZCBhY2sgcmVzcG9uc2UKKyNkZWZpbmUgZlRYX2JQaWdneUJhY2sgICAgIAkJMHgwMDA0CS8vIExlZ2FjeSBkZXZpY2UgdXNlIFBpZ2diYWNrIG9yIG5vdAorI2RlZmluZSBmVFhfYkhUUmF0ZSAgICAgICAgIAkweDAwMDgJLy8gYWxsb3cgdG8gdXNlIEhUIHJhdGUKKy8vI2RlZmluZSBmVFhfYkZvcmNlTG93UmF0ZSAgICAgICAweDAwMTAJLy8gZm9yY2UgdG8gdXNlIExvdyBSYXRlCisjZGVmaW5lIGZUWF9iRm9yY2VOb25Rb1MgICAgICAgCTB4MDAxMAkvLyBmb3JjZSB0byB0cmFuc21pdCBmcmFtZSB3aXRob3V0IFdNTS1Rb1MgaW4gSFQgbW9kZQorI2RlZmluZSBmVFhfYkFsbG93RnJhZyAgICAgICAJMHgwMDIwCS8vIGFsbG93IHRvIGZyYWdtZW50IHRoZSBwYWNrZXQsIEEtTVBEVSwgQS1NU0RVLCBBLVJhbGluayBpcyBub3QgYWxsb3dlZCB0byBmcmFnbWVudAorI2RlZmluZSBmVFhfYk1vcmVEYXRhCQkJMHgwMDQwCS8vIHRoZXJlIGFyZSBtb3JlIGRhdGEgcGFja2V0cyBpbiBQb3dlclNhdmUgUXVldWUKKyNkZWZpbmUgZlRYX2JXTU0JCQkJMHgwMDgwCS8vIFFPUyBEYXRhCisKKyNkZWZpbmUgZlRYX2JDbGVhckVBUEZyYW1lCQkweDAxMDAKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisjZGVmaW5lIFRYX0JMS19BU1NJR05fRkxBRyhfcFR4QmxrLCBfZmxhZywgdmFsdWUpCVwKKwkJZG8gewkJCQkJCQkJCQlcCisJCQlpZiAodmFsdWUpIAkJCQkJCQkJXAorCQkJCShfcFR4QmxrLT5GbGFncyB8PSBfZmxhZykgCQkJXAorCQkJZWxzZSAJCQkJCQkJCQlcCisJCQkJKF9wVHhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQkJXAorCQl9d2hpbGUoMCkKKworI2RlZmluZSBUWF9CTEtfU0VUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpCisjZGVmaW5lIFRYX0JMS19URVNUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCSgoKF9wVHhCbGstPkZsYWdzICYgX2ZsYWcpID09IF9mbGFnKSA/IDEgOiAwKQorI2RlZmluZSBUWF9CTEtfQ0xFQVJfRkxBRyhfcFR4QmxrLCBfZmxhZykJKF9wVHhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQorCisKKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisjaWZkZWYgUlRfQklHX0VORElBTgorc3RhdGljIGlubGluZSBWT0lECVdyaXRlQmFja1RvRGVzY3JpcHRvcigKKwlJTiAgUFVDSEFSCQkJRGVzdCwKKyAJSU4JUFVDSEFSCQkJU3JjLAorICAgIElOICBCT09MRUFOCQkJRG9FbmNyeXB0LAorCUlOICBVTE9ORyAgICAgICAgICAgRGVzY3JpcHRvclR5cGUpCit7CisJVUlOVDMyICpwMSwgKnAyOworCisJcDEgPSAoKFVJTlQzMiAqKURlc3QpOworCXAyID0gKChVSU5UMzIgKilTcmMpOworCisJKnAxID0gKnAyOworCSoocDErMikgPSAqKHAyKzIpOworCSoocDErMykgPSAqKHAyKzMpOworCSoocDErMSkgPSAqKHAyKzEpOyAvLyBXb3JkIDE7IHRoaXMgbXVzdCBiZSB3cml0dGVuIGJhY2sgbGFzdAorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5kaWFuIGNvbnZlcnNpb24gb2YgVHgvUnggZGVzY3JpcHRvciAuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJCVBvaW50ZXIgdG8gVHgvUnggZGVzY3JpcHRvcgorCQlEZXNjcmlwdG9yVHlwZQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGRlc2NyaXB0b3IKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW5saW5lIFZPSUQJUlRNUFdJRW5kaWFuQ2hhbmdlKAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCit7CisJaW50IHNpemU7CisJaW50IGk7CisKKwlzaXplID0gKChEZXNjcmlwdG9yVHlwZSA9PSBUWVBFX1RYV0kpID8gVFhXSV9TSVpFIDogUlhXSV9TSVpFKTsKKworCWlmKERlc2NyaXB0b3JUeXBlID09IFRZUEVfVFhXSSkKKwl7CisJCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsJCS8vIEJ5dGUgMH4zCisJCSooKFVJTlQzMiAqKShwRGF0YSArIDQpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGErNCkpKTsJLy8gQnl0ZSA0fjcKKwl9CisJZWxzZQorCXsKKwkJZm9yKGk9MDsgaSA8IHNpemUvNCA7IGkrKykKKwkJCSooKChVSU5UMzIgKilwRGF0YSkgK2kpID0gU1dBUDMyKCooKChVSU5UMzIgKilwRGF0YSkraSkpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIFR4L1J4IGRlc2NyaXB0b3IgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIFR4L1J4IGRlc2NyaXB0b3IKKwkJRGVzY3JpcHRvclR5cGUJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBkZXNjcmlwdG9yCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWZkZWYgUlQyODcwCitzdGF0aWMgaW5saW5lIFZPSUQJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEZXNjcmlwdG9yVHlwZSkKK3sKKwkqKChVSU5UMzIgKikocERhdGEpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEpKSk7Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5kaWFuIGNvbnZlcnNpb24gb2YgYWxsIGtpbmRzIG9mIDgwMi4xMSBmcmFtZXMgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIHRoZSA4MDIuMTEgZnJhbWUgc3RydWN0dXJlCisJCURpciAJCQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCisJCUZyb21SeERvbmVJbnQJQ2FsbGVyIGlzIGZyb20gUnhEb25lIGludGVycnVwdAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBidWZmZXIgZGF0YQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbmxpbmUgVk9JRAlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEaXIsCisJSU4JQk9PTEVBTiAJCUZyb21SeERvbmVJbnQpCit7CisJUEhFQURFUl84MDJfMTEgcEZyYW1lOworCVBVQ0hBUglwTWFjSGRyOworCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRnJhbWUgQ29udHJvbCBmaWVsZAorCWlmKERpciA9PSBESVJfUkVBRCkKKwl7CisJCSooVVNIT1JUICopcERhdGEgPSBTV0FQMTYoKihVU0hPUlQgKilwRGF0YSk7CisJfQorCisJcEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwRGF0YTsKKwlwTWFjSGRyID0gKFBVQ0hBUikgcEZyYW1lOworCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRHVyYXRpb24vSUQgZmllbGQKKwkqKFVTSE9SVCAqKShwTWFjSGRyICsgMikgPSBTV0FQMTYoKihVU0hPUlQgKikocE1hY0hkciArIDIpKTsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFNlcXVlbmNlIENvbnRyb2wgZmllbGQKKwkqKFVTSE9SVCAqKShwTWFjSGRyICsgMjIpID0gU1dBUDE2KCooVVNIT1JUICopKHBNYWNIZHIgKyAyMikpOworCisJaWYocEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX01HTVQpCisJeworCQlzd2l0Y2gocEZyYW1lLT5GQy5TdWJUeXBlKQorCQl7CisJCQljYXNlIFNVQlRZUEVfQVNTT0NfUkVROgorCQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUkVROgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBMaXN0ZW4gSW50ZXJ2YWwgZmllbGQKKwkJCQlwTWFjSGRyICs9IDI7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6CisJCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFN0YXR1cyBDb2RlIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQUlEIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQVVUSDoKKwkJCQkvLyBJZiBmcm9tIEFQSGFuZGxlUnhEb25lSW50ZXJydXB0IHJvdXRpbmUsIGl0IGlzIHN0aWxsIGEgZW5jcnlwdCBmb3JtYXQuCisJCQkJLy8gVGhlIGNvbnZlcnRpb24gaXMgZGVsYXllZCB0byBSVE1QSGFuZGxlRGVjcnlwdGlvbkRvbmVJbnRlcnJ1cHQuCisJCQkJaWYoIUZyb21SeERvbmVJbnQgJiYgcEZyYW1lLT5GQy5XZXAgPT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQXV0aCBBbGcgTm8uIGZpZWxkCisJCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBdXRoIFNlcSBOby4gZmllbGQKKwkJCQkJcE1hY0hkciArPSAyOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTdGF0dXMgQ29kZSBmaWVsZAorCQkJCQlwTWFjSGRyICs9IDI7CisJCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0JFQUNPTjoKKwkJCWNhc2UgU1VCVFlQRV9QUk9CRV9SU1A6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQmVhY29uSW50ZXJ2YWwgZmllbGQKKwkJCQlwTWFjSGRyICs9IChzaXplb2YoSEVBREVSXzgwMl8xMSkgKyBUSU1FU1RBTVBfTEVOKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoVVNIT1JUKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0RFQVVUSDoKKwkJCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBSZWFzb24gY29kZSBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCQl9CisJfQorCWVsc2UgaWYoIHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBICkKKwl7CisJfQorCWVsc2UgaWYocEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCisJeworCQlzd2l0Y2gocEZyYW1lLT5GQy5TdWJUeXBlKQorCQl7CisJCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKKwkJCQl7CisJCQkJCVBGUkFNRV9CQV9SRVEgcEJBUmVxID0gKFBGUkFNRV9CQV9SRVEpcEZyYW1lOworCQkJCQkqKFVTSE9SVCAqKSgmcEJBUmVxLT5CQVJDb250cm9sKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmcEJBUmVxLT5CQVJDb250cm9sKSk7CisJCQkJCXBCQVJlcS0+QkFTdGFydGluZ1NlcS53b3JkID0gU1dBUDE2KHBCQVJlcS0+QkFTdGFydGluZ1NlcS53b3JkKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLOgorCQkJCS8vIEZvciBCbG9jayBBY2sgcGFja2V0LCB0aGUgSFRfQ09OVFJPTCBmaWVsZCBpcyBpbiB0aGUgc2FtZSBvZmZzZXQgd2l0aCBBZGRyMworCQkJCSooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIzWzBdKSA9IFNXQVAzMigqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyM1swXSkpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQUNLOgorCQkJCS8vRm9yIEFDSyBwYWNrZXQsIHRoZSBIVF9DT05UUk9MIGZpZWxkIGlzIGluIHRoZSBzYW1lIG9mZnNldCB3aXRoIEFkZHIyCisJCQkJKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjJbMF0pPQlTV0FQMzIoKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjJbMF0pKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkludmFsaWQgRnJhbWUgVHlwZSEhIVxuIikpOworCX0KKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEZyYW1lIENvbnRyb2wKKwlpZihEaXIgPT0gRElSX1dSSVRFKQorCXsKKwkJKihVU0hPUlQgKilwRGF0YSA9IFNXQVAxNigqKFVTSE9SVCAqKXBEYXRhKTsKKwl9Cit9CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisKK3N0YXRpYyBpbmxpbmUgVk9JRCBDb252ZXJ0TXVsdGljYXN0SVAyTUFDKAorCUlOIFBVQ0hBUiBwSXBBZGRyLAorCUlOIFBVQ0hBUiAqcHBNYWNBZGRyLAorCUlOIFVJTlQxNiBQcm90b1R5cGUpCit7CisJaWYgKHBJcEFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHBwTWFjQWRkciA9PSBOVUxMIHx8ICpwcE1hY0FkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChQcm90b1R5cGUpCisJeworCQljYXNlIEVUSF9QX0lQVjY6CisvLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCQkJKigqcHBNYWNBZGRyKSA9IDB4MzM7CisJCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MzM7CisJCQkqKCpwcE1hY0FkZHIgKyAyKSA9IHBJcEFkZHJbMTJdOworCQkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzEzXTsKKwkJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsxNF07CisJCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbMTVdOworCQkJYnJlYWs7CisKKwkJY2FzZSBFVEhfUF9JUDoKKwkJZGVmYXVsdDoKKy8vCQkJbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCQkqKCpwcE1hY0FkZHIpID0gMHgwMTsKKwkJCSooKnBwTWFjQWRkciArIDEpID0gMHgwMDsKKwkJCSooKnBwTWFjQWRkciArIDIpID0gMHg1ZTsKKwkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxXSAmIDB4N2Y7CisJCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMl07CisJCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbM107CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKK0JPT0xFQU4gUlRNUENoZWNrRm9ySGFuZygKKwlJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dAorCSk7CisKK1ZPSUQgIFJUTVBIYWx0KAorCUlOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CisJKTsKKworLy8KKy8vICBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfaW5pdC5jCisvLworTkRJU19TVEFUVVMgUlRNUEFsbG9jQWRhcHRlckJsb2NrKAorCUlOIFBWT0lECQkJaGFuZGxlLAorCU9VVCBQUlRNUF9BREFQVEVSICAgKnBwQWRhcHRlcgorCSk7CisKK05ESVNfU1RBVFVTIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkCisJKTsKKworTkRJU19TVEFUVVMgUlRNUEZpbmRBZGFwdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBORElTX0hBTkRMRSAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKTsKKworTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZAorCSk7CisKK1ZPSUQgUlRNUEZyZWVBZGFwdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkCisJKTsKKworTkRJU19TVEFUVVMgTklDUmVhZFJlZ1BhcmFtZXRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBORElTX0hBTkRMRSAgICAgICAgIFdyYXBwZXJDb25maWd1cmF0aW9uQ29udGV4dAorCSk7CisKKyNpZmRlZiBSVDI4NzAKK1ZPSUQgTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworVk9JRCBOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4JUFVDSEFSCQkJCW1hY19hZGRyKTsKKworVk9JRCBOSUNJbml0QXNpY0Zyb21FRVBST00oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKKworVk9JRCBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCk7CisKK05ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBc2ljKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBCT09MRUFOCQliSGFyZFJlc2V0KTsKKworVk9JRCBOSUNJc3N1ZVJlc2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUmluZ0NsZWFuVXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSk7CisKK1ZPSUQgUnhUZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgRGJnU2VuZFBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitWT0lEIFVzZXJDZmdJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBOSUNSZXNldEZyb21FcnJvcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTklDRXJhc2VGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK05ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBOSUNDaGVja0ZvckhhbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCisjaWYgMAorVUxPTkcgUlRNUEVxdWFsTWVtb3J5KAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisjZW5kaWYKKworVUxPTkcJUlRNUE5vdEFsbFplcm8oCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JVUxPTkcJTGVuZ3RoKTsKKworVk9JRCBSVE1QWmVyb01lbW9yeSgKKwlJTiAgUFZPSUQgICBwU3JjLAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1VMT05HIFJUTVBDb21wYXJlTWVtb3J5KAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgUlRNUE1vdmVNZW1vcnkoCisJT1VUIFBWT0lEICAgcERlc3QsCisJSU4gIFBWT0lEICAgcFNyYywKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEIEF0b0goCisJY2hhcgkqc3JjLAorCVVDSEFSCSpkZXN0LAorCWludAkJZGVzdGxlbik7CisKK1VDSEFSIEJ0b0goCisJY2hhciBjaCk7CisKK1ZPSUQgUlRNUFBhdGNoTWFjQmJwQnVnKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUGF0Y2hDYXJkQnVzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIpOworCitWT0lEIFJUTVBQYXRjaFJhbGlua0NhcmRCdXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglVTE9ORwkJCUJ1cyk7CisKK1VMT05HIFJUTVBSZWFkQ0JDb25maWcoCisJSU4JVUxPTkcJQnVzLAorCUlOCVVMT05HCVNsb3QsCisJSU4JVUxPTkcJRnVuYywKKwlJTglVTE9ORwlPZmZzZXQpOworCitWT0lEIFJUTVBXcml0ZUNCQ29uZmlnKAorCUlOCVVMT05HCUJ1cywKKwlJTglVTE9ORwlTbG90LAorCUlOCVVMT05HCUZ1bmMsCisJSU4JVUxPTkcJT2Zmc2V0LAorCUlOCVVMT05HCVZhbHVlKTsKKworVk9JRCBSVE1QSW5pdFRpbWVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgICAgICBwQWQsCisJSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKKwlJTiAgUFZPSUQgICAgICAgICAgICAgICAgICAgcFRpbWVyRnVuYywKKwlJTglQVk9JRAkJCQkJcERhdGEsCisJSU4gIEJPT0xFQU4gICAgICAgICAgICAgICAgIFJlcGVhdCk7CisKK1ZPSUQgUlRNUFNldFRpbWVyKAorCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCisJSU4gIFVMT05HICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKKworCitWT0lEIFJUTVBNb2RUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKTsKKworVk9JRCBSVE1QQ2FuY2VsVGltZXIoCisJSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKKwlPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgKnBDYW5jZWxsZWQpOworCitWT0lEIFJUTVBTZXRMRUQoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFVDSEFSCQkJU3RhdHVzKTsKKworVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBORElTXzgwMl8xMV9SU1NJIERibSk7CisKK1ZPSUQgUlRNUEVuYWJsZVJ4VHgoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLworLy8gcHJvdG90eXBlIGluIGFjdGlvbi5jCisvLworVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgTWxtZUFEREJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZURFTEJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZURMU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVJbnZhbGlkQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZVFPU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEZWxCQUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFNlbmRQU01QQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJV2NpZCwKKwlJTiBVQ0hBUgkJCVBzbXApOworCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIFNlbmRCU1MyMDQwQ29leGlzdE1nbXRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJV2NpZCwKKwlJTglVQ0hBUglhcGlkeCwKKwlJTglVQ0hBUglJbmZvUmVxKTsKKworVk9JRCBTZW5kTm90aWZ5QldBY3Rpb25GcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgV2NpZCwKKwlJTiBVQ0hBUiBhcGlkeCk7CisKK0JPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpOworCitWT0lEIENoYW5uZWxTd2l0Y2hBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIENoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSk7CisKK1VMT05HIEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgUFVDSEFSICBwRGVzdCk7CisKK1ZPSUQgVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKTsKKworVk9JRCBTZW5kMjA0MENvZXhpc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCitWT0lEIFBlZXJSTUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBTdGFQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK1ZPSUQgUGVlckJTU1RyYW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBQZWVySFRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBQZWVyUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK1ZPSUQgUGVlckRMU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIERsc1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0RMU19SRVFfU1RSVUNUICpwRGxzUmVxLAorCUlOIFBSVF84MDJfMTFfRExTIHBEbHMsCisJSU4gVVNIT1JUIHJlYXNvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUkVDQkFUaW1lclRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBPUklCQVRpbWVyVGltZW91dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgU2VuZFJlZnJlc2hCQVIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEFjdEhlYWRlckluaXQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKyAgICBJTiBQVUNIQVIgQWRkcjEsCisgICAgSU4gUFVDSEFSIEFkZHIyLAorICAgIElOIFBVQ0hBUiBBZGRyMyk7CisKK1ZPSUQgQmFySGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEZSQU1FX0JBUiBwQ250bEJhciwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwU0EpOworCitWT0lEIEluc2VydEFjdEZpZWxkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IENhdGVnb3J5LAorCUlOIFVJTlQ4IEFjdENvZGUpOworCitCT09MRUFOIFFvc0JBRGF0YVBhcnNlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIEJPT0xFQU4gYkFNU0RVLAorCUlOIFBVQ0hBUiBwODAyM0hlYWRlciwKKwlJTiBVQ0hBUglXQ0lELAorCUlOIFVDSEFSCVRJRCwKKwlJTiBVU0hPUlQgU2VxdWVuY2UsCisJSU4gVUNIQVIgRGF0YU9mZnNldCwKKwlJTiBVU0hPUlQgRGF0YXNpemUsCisJSU4gVUlOVCAgIEN1clJ4SW5kZXgpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVTE9ORyBXY2lkLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlJTiBQRlJBTUVfQkFfUkVRIHBNc2cpOworCitWT0lEIEJhQXV0b01hblN3aXRjaCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgSFRJT1RDaGVjaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgICAgQmF0UmVjSWR4KTsKKworLy8KKy8vIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9kYXRhLmMKKy8vCitCT09MRUFOIFJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBIYW5kbGVUeERvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBJTlRfU09VUkNFX0NTUl9TVFJVQyBUeFJpbmdCaXRtYXApOworCitWT0lEIFJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK3ZvaWQgUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lECVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwUHJldkFkZHIxLAorCUlOICBQVUNIQVIgICAgICAgICAgcDgwMjNoZHIpOworCitCT09MRUFOIFBlZXJJc0FnZ3JlT24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFVMT05HICAgICAgICAgIFR4UmF0ZSwKKyAgICBJTiAgUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkpOworCisjaWYgMAkvLyBJdCdzIG5vdCBiZSB1c2VkCitIVFRSQU5TTUlUX1NFVFRJTkcgICpHZXRUeE1vZGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsayk7CisjZW5kaWYKKworTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKKwlJTiAgUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlciwKKwlJTiAgVUNIQVIgICAgICAgICAgIERlc2lyZWRPZmZzZXQsCisJT1VUIFBVQ0hBUiAgICAgICAgICBwQnl0ZTAsCisJT1VUIFBVQ0hBUiAgICAgICAgICBwQnl0ZTEpOworCitORElTX1NUQVRVUyBTVEFTZW5kUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK1ZPSUQgU1RBU2VuZFBhY2tldHMoCisJSU4gIE5ESVNfSEFORExFICAgICBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorCUlOICBQUE5ESVNfUEFDS0VUICAgcHBQYWNrZXRBcnJheSwKKwlJTiAgVUlOVCAgICAgICAgICAgIE51bWJlck9mUGFja2V0cyk7CisKK1ZPSUQgUlRNUERlUXVldWVQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAJSU4JQk9PTEVBTgkJCWJJbnRDb250ZXh0LAorCUlOICBVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVQ0hBUgkJCU1heF9UeF9QYWNrZXRzKTsKKworTkRJU19TVEFUVVMJUlRNUEhhcmRUcmFuc21pdCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4gIFVDSEFSCQkJUXVlSWR4LAorCU9VVAlQVUxPTkcJCQlwRnJlZVRYRExlZnQpOworCitORElTX1NUQVRVUwlTVEFIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVFhfQkxLCQkJKnBUeEJsaywKKwlJTiAgVUNIQVIJCQlRdWVJZHgpOworCitWT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK05ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJpbmdUeXBlLAorCUlOICBVQ0hBUiAgICAgICAgICAgTnVtYmVyUmVxdWlyZWQsCisJSU4gCVBVQ0hBUiAgICAgICAgICBGcmVlTnVtYmVySXMpOworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUglRdWVJZHgsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUglRdWVJZHgsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK1VTSE9SVCAgUlRNUENhbGNEdXJhdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJhdGUsCisJSU4gIFVMT05HICAgICAgICAgICBTaXplKTsKKworVk9JRCBSVE1QV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTiAgQk9PTEVBTiAgICAJCUZSQUcsCisJSU4gIEJPT0xFQU4gICAgCQlDRkFDSywKKwlJTiAgQk9PTEVBTiAgICAJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOCQkJQU1QRFUsCisJSU4JQk9PTEVBTgkJCUFjaywKKwlJTglCT09MRUFOCQkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTiAgVUNIQVIgICAgICAJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCk7CisKKworVk9JRCBSVE1QV3JpdGVUeFdJX0RhdGEoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspOworCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9DYWNoZSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTglUWF9CTEsJCQkJKnBUeEJsayk7CisKK1ZPSUQgUlRNUFdyaXRlVHhEZXNjcmlwdG9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWERfU1RSVUMJCXBUeEQsCisJSU4JQk9PTEVBTgkJCWJXSVYsCisJSU4JVUNIQVIJCQlRU0VMKTsKKworVk9JRCBSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgTWluaXBvcnRNTVJlcXVlc3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW5ndGgpOworCitORElTX1NUQVRVUyBNaW5pcG9ydERhdGFNTVJlcXVlc3QoCisJIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCSBJTiAgVUNIQVIgICAgICAgICAgIFF1ZUlkeCwKKwkgSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwkgSU4gIFVJTlQgICAgICAgICAgICBMZW5ndGgpOworCitWT0lEIFJUTVBTZW5kTnVsbEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOCUJPT0xFQU4JCQliUW9zTnVsbCk7CisKK1ZPSUQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QU2VuZFJUU0ZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOCXVuc2lnbmVkIGludAlOZXh0TXBkdVNpemUsCisJSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisJSU4gIFVDSEFSICAgICAgICAgICBSVFNSYXRlLAorCUlOICBVU0hPUlQgICAgICAgICAgQWNrRHVyYXRpb24sCisJSU4gIFVDSEFSICAgICAgICAgICBRdWVJZHgsCisJSU4gIFVDSEFSCQkJRnJhbWVHYXApOworCisKK05ESVNfU1RBVFVTIFJUTVBBcHBseVBhY2tldEZpbHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFJUMjhYWF9SWERfU1RSVUMgICAgICBwUnhELAorCUlOICBQSEVBREVSXzgwMl8xMSAgcEhlYWRlcik7CisKK1BRVUVVRV9IRUFERVIgICBSVE1QQ2hlY2tUeFN3UXVldWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFVDSEFSICAgICAgICAgICAqUXVlSWR4KTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QUmVwb3J0TWljRXJyb3IoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBDSVBIRVJfS0VZICAgICBwV3BhS2V5KTsKKworVk9JRAlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKAorICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitORElTX1NUQVRVUyBSVE1QQ2xvbmVOZGlzUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUJPT0xFQU4gICAgcEluc0FNU0RVSGRyLAorCUlOICBQTkRJU19QQUNLRVQgICAgcEluUGFja2V0LAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpOworCitORElTX1NUQVRVUyBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgKnBQYWNrZXQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyLAorCUlOICBVSU5UICAgICAgICAgICAgSGVhZGVyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuKTsKKworVk9JRCBSVE1QRnJlZU5kaXNQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworQk9PTEVBTiBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gVUNIQVIgICAgICAgICAgICBRdWVJZHgpOworCitCT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK1ZPSUQgUlRNUENja0JicFR1bmluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVSU5UCQkJVHhSYXRlKTsKKworLy8KKy8vIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF93ZXAuYworLy8KK1ZPSUQgUlRNUEluaXRXZXBFbmdpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCk7CisKK1ZPSUQgUlRNUEVuY3J5cHREYXRhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworQk9PTEVBTglSVE1QRGVjcnlwdERhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVVJTlQJCQlMZW4sCisJSU4JVUlOVAkJCWlkeCk7CisKK0JPT0xFQU4JUlRNUFNvZnREZWNyeXB0V0VQKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBQVUNIQVIJCQlwRGF0YSwKKwlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpOworCitWT0lEIFJUTVBTZXRJQ1YoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCk7CisKK1ZPSUQgQVJDRk9VUl9JTklUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgVUlOVCAgICAgICAgICAgIEtleUxlbik7CisKK1VDSEFSICAgQVJDRk9VUl9CWVRFKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgICAgIEN0eCk7CisKK1ZPSUQgQVJDRk9VUl9ERUNSWVBUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCBBUkNGT1VSX0VOQ1JZUFQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEIFdQQUFSQ0ZPVVJfRU5DUllQVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1VJTlQgUlRNUF9DQUxDX0ZDUzMyKAorCUlOICBVSU5UICAgRmNzLAorCUlOICBQVUNIQVIgIENwLAorCUlOICBJTlQgICAgIExlbik7CisKKy8vCisvLyBNTE1FIHJvdXRpbmVzCisvLworCisvLyBBc2ljL1JGL0JCUCByZWxhdGVkIGZ1bmN0aW9ucworCitWT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIAkJVVNIT1JUCQkJT3BlcmFpb25Nb2RlLAorCUlOIAkJVUNIQVIJCQlTZXRNYXNrLAorCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCisJSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCk7CisKK1ZPSUQgQXNpY1N3aXRjaENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsLAorCUlOCUJPT0xFQU4JCQliU2Nhbik7CisKK1ZPSUQgQXNpY0xvY2tDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIENoYW5uZWwpIDsKKworVk9JRCBBc2ljQW50ZW5uYVNlbGVjdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIENoYW5uZWwpOworCitWT0lEIEFzaWNBbnRlbm5hU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglBQkdCQU5EX1NUQVRFCUJhbmRTdGF0ZSk7CisKK1ZPSUQgQXNpY1JmVHVuaW5nRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKK1ZPSUQgQXNpY0ZvcmNlU2xlZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgIGJGcm9tVHgpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitWT0lEIEFzaWNTZXRCc3NpZCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBCc3NpZCk7CisKK1ZPSUQgQXNpY1NldE1jYXN0V0MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisjaWYgMAkvLyByZW1vdmVkIGJ5IEFsYmVydFkKK1ZPSUQgQXNpY1NldEJzc2lkV0MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBCc3NpZCk7CisjZW5kaWYKKworVk9JRCBBc2ljRGVsV2NpZFRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUglXY2lkKTsKKworVk9JRCBBc2ljRW5hYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRGlzYWJsZVJERygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0Rpc2FibGVTeW5jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljRW5hYmxlQnNzU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljU2V0RWRjYVBhcm0oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVEQ0FfUEFSTSAgICBwRWRjYVBhcm0pOworCitWT0lEIEFzaWNTZXRTbG90VGltZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKTsKKworI2lmIDAKK1ZPSUQgQXNpY0FkZFdjaWRDaXBoZXJFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIFdDSUQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleVRhYmxlLAorCUlOIFVDSEFSCQkgQ2lwaGVyQWxnLAorCUlOIFBVQ0hBUgkJIHBBZGRyLAorCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSk7CisjZW5kaWYKKworVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCwKKwlJTiBVQ0hBUiAgICAgICAgIENpcGhlckFsZywKKwlJTiBQVUNIQVIgICAgICAgIHBLZXksCisJSU4gUFVDSEFSICAgICAgICBwVHhNaWMsCisJSU4gUFVDSEFSICAgICAgICBwUnhNaWMpOworCitWT0lEIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICAgS2V5SWR4KTsKKworVk9JRCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICBDaXBoZXJBbGcsCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKworVk9JRCBBc2ljVXBkYXRlV0NJRElWRUlWKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVTE9ORyAgICAgICAgdUlWLAorCUlOIFVMT05HICAgICAgICB1RUlWKTsKKworVk9JRCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpOworCitWT0lEIEFzaWNBZGRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSCQlLZXlJZHgsCisJSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCisJSU4gQk9PTEVBTgkJYlR4S2V5KTsKKworVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSCQlXQ0lELAorCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSk7CisKK1ZPSUQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIFVDSEFSCQkgQnNzSWR4LAorCUlOIFVDSEFSCQkgV2NpZCk7CisKK0JPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3UoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBDb21tYW5kLAorCUlOIFVDSEFSICAgICAgICAgVG9rZW4sCisJSU4gVUNIQVIgICAgICAgICBBcmcwLAorCUlOIFVDSEFSICAgICAgICAgQXJnMSk7CisKKworVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFBVQ0hBUiBwQWRkcik7CisKK1ZPSUQgTWd0TWFjSGVhZGVySW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgcEFkLAorCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisJSU4gVUNIQVIgU3ViVHlwZSwKKwlJTiBVQ0hBUiBUb0RzLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBCc3NpZCk7CisKK1ZPSUQgTWxtZVJhZGlvT2ZmKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKworVk9JRCBCc3NUYWJsZUluaXQoCisJSU4gQlNTX1RBQkxFICpUYWIpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIEJBX1RBQkxFICpUYWIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitVTE9ORyBCc3NUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIFVDSEFSIENoYW5uZWwpOworCitVTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSICAgIHBCc3NpZCwKKwlJTiBQVUNIQVIgICAgcFNzaWQsCisJSU4gVUNIQVIgICAgIFNzaWRMZW4sCisJSU4gVUNIQVIgICAgIENoYW5uZWwpOworCitVTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiAgICBCc3NpZCwKKwlJTiBQVUNIQVIgICAgcFNzaWQsCisJSU4gVUNIQVIgICAgIFNzaWRMZW4sCisJSU4gVUNIQVIgICAgIENoYW5uZWwpOworCitWT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCisJSU4gT1VUICBQQlNTX1RBQkxFIHBUYWIsCisJSU4gICAgICBQVUNIQVIgcEJzc2lkLAorCUlOICAgICAgVUNIQVIgQ2hhbm5lbCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSk7CisKK1ZPSUQgQkFUYWJsZURlbGV0ZVJFQ0VudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfUkVDX0VOVFJZCSpwQkFSRUNFbnRyeSk7CisKK1ZPSUQgQkFUYWJsZVRlYXJPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCVVDSEFSIFRJRCwKKwlJTgkJVUNIQVIgV2NpZCwKKwlJTgkJQk9PTEVBTiBiRm9yY2VEZWxldGUsCisJSU4JCUJPT0xFQU4gQUxMKTsKKworVk9JRCBCQVRhYmxlVGVhclJFQ0VudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJVUNIQVIgVElELAorCUlOCQlVQ0hBUiBXQ0lELAorCUlOCQlCT09MRUFOIEFMTCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgIEJzc0VudHJ5U2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQQlNTX0VOVFJZIHBCc3MsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBQQ0ZfUEFSTSBDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworVUxPTkcgIEJzc1RhYmxlU2V0RW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFBCU1NfVEFCTEUgcFRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIENGX1BBUk0gKkNmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbnNlcnRFbnRyeSgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVU0hPUlQgQWlkLAorICAgIElOIFVTSE9SVAkJVGltZU91dFZhbHVlLAorCUlOIFVTSE9SVAkJU3RhcnRpbmdTZXEsCisgICAgSU4gVUNIQVIgVElELAorCUlOIFVDSEFSIEJBV2luU2l6ZSwKKwlJTiBVQ0hBUiBPcmlnaW5hdG9yU3RhdHVzLAorICAgIElOIEJPT0xFQU4gSXNSZWNpcGllbnQpOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBCc3MyMDQwQ29leGlzdFRpbWVPdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitWT0lEICBUcmlFdmVudEluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitVTE9ORyBUcmlFdmVudFRhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFRSSUdHRVJfRVZFTlRfVEFCICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJUmVnQ2xhc3MsCisJSU4gVUNIQVIgQ2hhbm5lbE5vKTsKKworVk9JRCBUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEJzc1RhYmxlU3NpZFNvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIEJTU19UQUJMRSAqT3V0VGFiLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbik7CisKK1ZPSUQgIEJzc1RhYmxlU29ydEJ5UnNzaSgKKwlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpOworCitWT0lEIEJzc0NpcGhlclBhcnNlKAorCUlOIE9VVCAgUEJTU19FTlRSWSAgcEJzcyk7CisKK05ESVNfU1RBVFVTICBNbG1lUXVldWVJbml0KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworVk9JRCAgTWxtZVF1ZXVlRGVzdHJveSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gTWxtZUVucXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTWFjaGluZSwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2cpOworCitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVTE9ORyBXY2lkLAorCUlOIFVMT05HIFRpbWVTdGFtcEhpZ2gsCisJSU4gVUxPTkcgVGltZVN0YW1wTG93LAorCUlOIFVDSEFSIFJzc2kwLAorCUlOIFVDSEFSIFJzc2kxLAorCUlOIFVDSEFSIFJzc2kyLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBQVk9JRCBNc2csCisJSU4gVUNIQVIgU2lnbmFsKTsKKworCitCT09MRUFOIE1sbWVEZXF1ZXVlKAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAorCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKTsKKworVk9JRCAgICBNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gIE1sbWVRdWV1ZUVtcHR5KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworQk9PTEVBTiAgTWxtZVF1ZXVlRnVsbCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gIE1zZ1R5cGVTdWJzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKwlPVVQgSU5UICpNYWNoaW5lLAorCU9VVCBJTlQgKk1zZ1R5cGUpOworCitWT0lEIFN0YXRlTWFjaGluZUluaXQoCisJSU4gU1RBVEVfTUFDSElORSAqU20sCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10sCisJSU4gVUxPTkcgU3ROciwKKwlJTiBVTE9ORyBNc2dOciwKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRGVmRnVuYywKKwlJTiBVTE9ORyBJbml0U3RhdGUsCisJSU4gVUxPTkcgQmFzZSk7CisKK1ZPSUQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gVUxPTkcgU3QsCisJVUxPTkcgTXNnLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBGKTsKKworVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBEcm9wKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFJlYXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXNzb2NSc3BBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclJlYXNzb2NSc3BBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRpc2Fzc29jQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIFJlYXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBDbHMzZXJyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIpOworCitWT0lEIFN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCAgSW52YWxpZFN0YXRlV2hlbkFzc29jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIFJUMjg3MAorVk9JRCBNbG1lQ250bENvbmZpcm0oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTXNnVHlwZSwKKwlJTiBVU0hPUlQgTXNnKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworVk9JRCAgQ29tcG9zZVBzUG9sbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgIENvbXBvc2VOdWxsRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCAgQXNzb2NQb3N0UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBBZGRyMiwKKwlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOICBVU0hPUlQgQWlkLAorCUlOICBVQ0hBUiBTdXBSYXRlW10sCisJSU4gIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiAgVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiAgVUNIQVIgSHRDYXBhYmlsaXR5TGVuLAorCUlOIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7CisKK1ZPSUQgQXV0aFN0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gUFNUQVRFX01BQ0hJTkUgc20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBdXRoVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENsczJlcnJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQWRkcik7CisKK1ZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVk9JRCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFNUQVRFX01BQ0hJTkUgU20sCisJSU4gIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAorCUlOICBVU0hPUlQgQWxnLAorCUlOICBVU0hPUlQgU2VxLAorCUlOICBVU0hPUlQgUmVhc29uLAorCUlOICBVU0hPUlQgU3RhdHVzKTsKKworLy8KKy8vIFByaXZhdGUgcm91dGluZXMgaW4gZGxzLmMKKy8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK3ZvaWQgRGxzU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIE1sbWVEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7CisKK1ZPSUQgUGVlckRsc1JzcEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOworCitWT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOworCitWT0lEIFJUTVBDaGVja0RMU1RpbWVPdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitCT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4gVUxPTkcJCQlMZW4sCisJSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCk7CisKK0lOVAlSVE1QQ2hlY2tETFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSk7CisKK1ZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKTsKKworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSk7CisKK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSk7CisKK1ZPSUQgRGxzVGltZW91dEFjdGlvbigKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitCT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCisgICAgT1VUIFBVU0hPUlQgcFJlYXNvbik7CisKK0lOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKTsKKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydERsc0VudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIJcEFkZHIsCisJSU4gIFVJTlQJRGxzRW50cnlJZHgpOworCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRGxzRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisJSU4gUFVDSEFSIHBBZGRyKTsKKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCk7CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgl3Y2lkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCk7CisKK0lOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCT09MRUFOIFBlZXJEbHNSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcERsc1RpbWVvdXQsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisgICAgT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGxzUnNwU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisgICAgT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGxzVGVhckRvd25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQmVhY29uVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFNjYW5UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlblNjYW4oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkpvaW4oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgRW5xdWV1ZVByb2JlUmVxdWVzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gU2NhblJ1bm5pbmcoCisJCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVk9JRCBNbG1lQ250bEluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxJZGxlUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsT2lkU2NhblByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxPaWRTc2lkUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7CisKK1ZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKKworVk9JRCBDbnRsTWxtZVJvYW1pbmdQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKKworVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRTdGFydFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRBdXRoUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEF1dGhQcm9jMigKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK1ZPSUQgQ250bE9pZERMU1NldHVwUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCitWT0lEIExpbmtVcCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgQnNzVHlwZSk7CisKK1ZPSUQgTGlua0Rvd24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4gICAgICAgICBJc1JlcUZyb21BUCk7CisKK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBJdGVyYXRlT25Cc3NUYWIyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTs7CisKK1ZPSUQgSm9pblBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKkpvaW5SZXEsCisJSU4gIFVMT05HIEJzc0lkeCk7CisKK1ZPSUQgQXNzb2NQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKKwlJTiAgUFVDSEFSIHBBZGRyLAorCUlOICBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gIFVMT05HIFRpbWVvdXQsCisJSU4gIFVTSE9SVCBMaXN0ZW5JbnR2KTsKKworVk9JRCBTY2FuUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX1NDQU5fUkVRX1NUUlVDVCAqU2NhblJlcSwKKwlJTiAgQ0hBUiBTc2lkW10sCisJSU4gIFVDSEFSIFNzaWRMZW4sCisJSU4gIFVDSEFSIEJzc1R5cGUsCisJSU4gIFVDSEFSIFNjYW5UeXBlKTsKKworVk9JRCBEaXNhc3NvY1Bhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKKwlJTiAgUFVDSEFSIHBBZGRyLAorCUlOICBVU0hPUlQgUmVhc29uKTsKKworVk9JRCBTdGFydFBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKKwlJTiAgQ0hBUiBTc2lkW10sCisJSU4gIFVDSEFSIFNzaWRMZW4pOworCitWT0lEIEF1dGhQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAorCUlOICBQVUNIQVIgcEFkZHIsCisJSU4gIFVTSE9SVCBBbGcpOworCitWT0lEIEVucXVldWVQc1BvbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEVucXVldWVCZWFjb25GcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZVN0YXJ0UmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBTY2FuTmV4dENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVTE9ORyBNYWtlSWJzc0JlYWNvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQ0NYQWRqYWNlbnRBUFJlcG9ydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gTWxtZVNjYW5SZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAqQnNzVHlwZSwKKwlPVVQgQ0hBUiBzc2lkW10sCisJT1VUIFVDSEFSICpTc2lkTGVuLAorCU9VVCBVQ0hBUiAqU2NhblR5cGUpOworCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJSU4gIFVDSEFSIE1zZ0NoYW5uZWwsCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFBVQ0hBUiBwQnNzaWQsCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCisJT1VUIFVDSEFSICpwQnNzVHlwZSwKKwlPVVQgVVNIT1JUICpwQmVhY29uUGVyaW9kLAorCU9VVCBVQ0hBUiAqcENoYW5uZWwsCisJT1VUIFVDSEFSICpwTmV3Q2hhbm5lbCwKKwlPVVQgTEFSR0VfSU5URUdFUiAqcFRpbWVzdGFtcCwKKwlPVVQgQ0ZfUEFSTSAqcENmUGFybSwKKwlPVVQgVVNIT1JUICpwQXRpbVdpbiwKKwlPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisJT1VUIFVDSEFSICpwRXJwLAorCU9VVCBVQ0hBUiAqcER0aW1Db3VudCwKKwlPVVQgVUNIQVIgKnBEdGltUGVyaW9kLAorCU9VVCBVQ0hBUiAqcEJjYXN0RmxhZywKKwlPVVQgVUNIQVIgKnBNZXNzYWdlVG9NZSwKKwlPVVQgVUNIQVIgU3VwUmF0ZVtdLAorCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisJT1VUIFVDSEFSIEV4dFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorCU9VVAlVQ0hBUiAqcENraXBGbGFnLAorCU9VVAlVQ0hBUiAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwlPVVQgUEVEQ0FfUEFSTSAgICAgICBwRWRjYVBhcm0sCisJT1VUIFBRQlNTX0xPQURfUEFSTSAgcFFic3NMb2FkLAorCU9VVCBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlPVVQgVUxPTkcgKnBSYWxpbmtJZSwKKwlPVVQgVUNIQVIJCSAqcEh0Q2FwYWJpbGl0eUxlbiwKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlPVVQgVUNIQVIJCSAqcFByZU5IdENhcGFiaWxpdHlMZW4sCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJT1VUIFVDSEFSCQkgKkFkZEh0SW5mb0xlbiwKKwlPVVQgQUREX0hUX0lORk9fSUUgKkFkZEh0SW5mbywKKwlPVVQgVUNIQVIgKk5ld0V4dENoYW5uZWwsCisJT1VUIFVTSE9SVCAqTGVuZ3RoVklFLAorCU9VVCBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOworCitCT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMik7CisKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKTsKKworQk9PTEVBTiBQZWVyRGVsQkFBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVUNIQVIgV2NpZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbik7CisKK0JPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBcEFkZHIsCisJT1VUIFVTSE9SVCAqQ2FwYWJpbGl0eUluZm8sCisJT1VUIFVMT05HICpUaW1lb3V0LAorCU9VVCBVU0hPUlQgKkxpc3RlbkludHYpOworCitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyLAorCU9VVCBVTE9ORyAqVGltZW91dCwKKwlPVVQgVVNIT1JUICpBbGcpOworCitCT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqU3NpZGxlbik7CisKK0JPT0xFQU4gUGVlckF1dGhTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIsCisJT1VUIFVTSE9SVCAqQWxnLAorCU9VVCBVU0hPUlQgKlNlcSwKKwlPVVQgVVNIT1JUICpTdGF0dXMsCisJT1VUIENIQVIgQ2hsZ1RleHRbXSk7CisKK0JPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisJT1VUIFVTSE9SVCAqcFN0YXR1cywKKwlPVVQgVVNIT1JUICpwQWlkLAorCU9VVCBVQ0hBUiBTdXBSYXRlW10sCisJT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKwlPVVQgVUNIQVIgRXh0UmF0ZVtdLAorCU9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorICAgIE9VVCBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorICAgIE9VVCBVQ0hBUgkJCSpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBVQ0hBUgkJCSpwQWRkSHRJbmZvTGVuLAorICAgIE9VVCBVQ0hBUgkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwlPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJT1VUIFVDSEFSICpwQ2tpcEZsYWcpOworCitCT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFVTSE9SVCAqUmVhc29uKTsKKworQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKKyAgICBJTiAJUFJUTVBfQURBUFRFUiAJCXBBZCwKKyAgICBJTiAJUEVBUE9MX1BBQ0tFVCAJCXBNc2csCisgICAgSU4gCVVMT05HIAkJCQlNc2dMZW4sCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4gCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnkpOworCitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBVU0hPUlQgKlJlYXNvbik7CisKK0JPT0xFQU4gUGVlclByb2JlUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbik7CisKK0JPT0xFQU4gR2V0VGltQml0KAorCUlOICBDSEFSICpQdHIsCisJSU4gIFVTSE9SVCBBaWQsCisJT1VUIFVDSEFSICpUaW1MZW4sCisJT1VUIFVDSEFSICpCY2FzdEZsYWcsCisJT1VUIFVDSEFSICpEdGltQ291bnQsCisJT1VUIFVDSEFSICpEdGltUGVyaW9kLAorCU9VVCBVQ0hBUiAqTWVzc2FnZVRvTWUpOworCitVQ0hBUiBDaGFubmVsU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIGNoYW5uZWwpOworCitORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZVNhbml0eSgKKwlJTiBQQlNTX0VOVFJZIHBCc3MpOworCisjaWYgMAkvLyBJdCdzIG9taXR0ZWQKK05ESVNfU1RBVFVTCVJUTVBXZXBLZXlTYW5pdHkoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVk9JRAkJCXBCdWYpOworI2VuZGlmCisKK0JPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyKTsKKworVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCisJT1VUIENIQVIgKkJ1ZmZlciwKKwlPVVQgVUxPTkcgKkxlbmd0aCwgLi4uKTsKKworVk9JRCAgTGZzckluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HIFNlZWQpOworCitVQ0hBUiBSYW5kb21CeXRlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFR4UmF0ZSk7CisKK1ZPSUQgIE1sbWVQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMaW5rRG93bkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMaW5rVXBFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgU1RBTWxtZVBlcmlvZGljRXhlYygKKwlQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZUF1dG9TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAorCUlOIFBVQ0hBUiBwU3NpZCwKKwlJTiBVQ0hBUiAgU3NpZExlbik7CisKK1ZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyAgICBOb3czMik7CisKK1ZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICBOb3cpOworCitWT0lEIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7CisKK1ZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7CisKK1ZPSUQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE5vdyk7CisKK1ZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HICAgIE5vdzMyKTsKKworVk9JRCBNbG1lU2V0UHNtQml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBwc20pOworCitWT0lEIE1sbWVTZXRUeFByZWFtYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUeFByZWFtYmxlKTsKKworVk9JRCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiAJQk9PTEVBTgkJIAliTGlua1VwLAorCUlOCVVDSEFSCQkJYXBpZHgpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCisJSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgICAgUlRNUENoZWNrUmF0ZXMoCisJSU4gICAgICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE9VVCAgVUNIQVIgICAgICAgICAgIFN1cFJhdGVbXSwKKwlJTiBPVVQgIFVDSEFSICAgICAgICAgICAqU3VwUmF0ZUxlbik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCisJSU4gVUNIQVIJCUNoYW5uZWwpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitCT09MRUFOIAlSVE1QQ2hlY2tIdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCVdjaWQsCisJSU4gT1VUCUhUX0NBUEFCSUxJVFlfSUUJCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiBPVVQJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbyk7CisKK1ZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFzaWNCYnBUdW5pbmcxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljQmJwVHVuaW5nMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUlRNUFVwZGF0ZU1sbWVSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworQ0hBUiBSVE1QTWF4UnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBDSEFSCQkJCVJzc2kwLAorCUlOIENIQVIJCQkJUnNzaTEsCisJSU4gQ0hBUgkJCQlSc3NpMik7CisKK1ZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQVBTRFBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworCitVQ0hBUiBSVE1QU3RhRml4ZWRUeE1vZGUoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworCitWT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCisJCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCisJCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE1sbWVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lSGFuZGxlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZUhhbHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBCdWlsZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUNIQVIgRmlyc3RDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVUNIQVIgTmV4dENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSIGNoYW5uZWwpOworCitWT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCitWT0lEIFJhaXNlQ2xvY2soCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVJTlQzMiAqeCk7CisKK1ZPSUQgTG93ZXJDbG9jaygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUlOVDMyICp4KTsKKworVVNIT1JUIFNoaWZ0SW5CaXRzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBTaGlmdE91dEJpdHMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBkYXRhLAorCUlOICBVU0hPUlQgY291bnQpOworCitWT0lEIEVFcHJvbUNsZWFudXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEVXRFMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEVXRU4oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVU0hPUlQgUlRNUF9FRVBST01fUkVBRDE2KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgT2Zmc2V0KTsKKworVk9JRCBSVE1QX0VFUFJPTV9XUklURTE2KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgT2Zmc2V0LAorCUlOICBVU0hPUlQgRGF0YSk7CisKKy8vCisvLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gcnRtcF90a2lwLmMKKy8vCitWT0lEICAgIFJUTVBJbml0VGtpcEVuZ2luZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBUS2V5LAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwVEEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAorCUlOICBQVUNIQVIgICAgICAgICAgcFRTQywKKwlPVVQgUFVMT05HICAgICAgICAgIHBJVjE2LAorCU9VVCBQVUxPTkcgICAgICAgICAgcElWMzIpOworCitWT0lEICAgIFJUTVBJbml0TUlDRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXkpOworCitCT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCisJSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEICAgIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRW5jYXAsCisJSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAorCUlOCVVDSEFSCQkJYXBpZHgpOworCitCT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBMTEMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgICAgUlRNUFRraXBBcHBlbmRCeXRlKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCisJSU4gIFVDSEFSICAgICAgICAgICB1Q2hhcik7CisKK1ZPSUQgICAgUlRNUFRraXBBcHBlbmQoCisJSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBuQnl0ZXMpOworCitWT0lEICAgIFJUTVBUa2lwR2V0TUlDKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXApOworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKKwlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOworCisjaWYgMAkvLyByZW1vdmVkIGJ5IEFsYmVydFkKK05ESVNfU1RBVFVTIFJUTVBXUEFBZGRLZXlQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVk9JRCAgICAgICAgICAgcEJ1Zik7CisjZW5kaWYKKworLy8KKy8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jCisvLworTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBWT0lEICAgICAgICAgICBwQnVmKTsKKworVk9JRCAgICBSVE1QV1BBUmVtb3ZlQWxsS2V5cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gUlRNUENoZWNrU3RyUHJpbnRBYmxlKAorICAgIElOICBDSEFSICpwSW5QdXRTdHIsCisgICAgSU4gIFVDSEFSIHN0ckxlbik7CisKK1ZPSUQgICAgUlRNUFNldFBoeU1vZGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HIHBoeW1vZGUpOworCitWT0lECVJUTVBVcGRhdGVIVElFKAorCUlOCVJUX0hUX0NBUEFCSUxJVFkJKnBSdEh0LAorCUlOCQlVQ0hBUgkJCQkqcE1jc1NldCwKKwlPVVQJCUhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJT1VUCQlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOworCitWT0lECVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCc3NJZHgsCisJSU4gCVVDSEFSCQkgCUtleUlkeCwKKwlJTiAJVUNIQVIJCSAJQ2lwaGVyQWxnLAorCUlOIAlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7CisKK0NIQVIgKkdldEVuY3J5cHRUeXBlKAorCUNIQVIgZW5jKTsKKworQ0hBUiAqR2V0QXV0aE1vZGUoCisJQ0hBUiBhdXRoKTsKKworVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bEdldE1hY1RhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIHN0cnVjdCBpd3JlcSAqd3JxKTsKKworVk9JRCBSVE1QSW5kaWNhdGVXUEEyU3RhdHVzKAorCUlOICBQUlRNUF9BREFQVEVSICBwQWRhcHRlcik7CisKK1ZPSUQJUlRNUE9QTW9kZVN3aXRjaGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgICAgUlRNUEFkZEJTU0lEQ2lwaGVyKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCUFpZCwKKyAgICBJTiAgUE5ESVNfODAyXzExX0tFWSAgICBwS2V5LAorICAgIElOICBVQ0hBUiAgIENpcGhlckFsZyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQJUlRNUFNldEhUKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU9JRF9TRVRfSFRfUEhZTU9ERSAqcEhUUGh5TW9kZSk7CisKK1ZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAorCUlOCVBVQ0hBUiAJCQlwQWRkciwKKwlJTiAgVUNIQVIJCQlCc3NJZHgsCisJSU4JQ0hBUgkJCVJzc2kpOworCitWT0lECU5JQ1VwZGF0ZUNudGxDb3VudGVycygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAorCUlOICAgIFVDSEFSCQkJU3ViVHlwZSwKKwlJTglQUlhXSV9TVFJVQyAJcFJ4V0kpOworLy8KKy8vIHByb3RvdHlwZSBpbiB3cGEuYworLy8KK0JPT0xFQU4gV3BhTXNnVHlwZVN1YnN0KAorCUlOICBVQ0hBUiAgIEVBUFR5cGUsCisJT1VUIElOVAkJKk1zZ1R5cGUpOworCitWT0lEIFdwYVBza1N0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICAgICAgICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhUGFpck1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhUGFpck1zZzNBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhR3JvdXBNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYU1hY0hlYWRlckluaXQoCisJSU4gICAgICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE9VVCAgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKKwlJTiAgICAgIFVDSEFSICAgICAgICAgICB3ZXAsCisJSU4gICAgICBQVUNIQVIgICAgICAgICAgcEFkZHIxKTsKKworVk9JRCAgICBXcGEyUGFpck1zZzFBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhMlBhaXJNc2czQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitCT09MRUFOIFBhcnNlS2V5RGF0YSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCWJQYWlyZXdpc2UpOworCitWT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOCUJPT0xFQU4JCQlpczR3YXlGcmFtZSk7CisKK1ZPSUQgICAgSE1BQ19TSEExKAorCUlOICBVQ0hBUiAgICp0ZXh0LAorCUlOICBVSU5UICAgIHRleHRfbGVuLAorCUlOICBVQ0hBUiAgICprZXksCisJSU4gIFVJTlQgICAga2V5X2xlbiwKKwlJTiAgVUNIQVIgICAqZGlnZXN0KTsKKworVk9JRCAgICBQUkYoCisJSU4gIFVDSEFSICAgKmtleSwKKwlJTiAgSU5UICAgICBrZXlfbGVuLAorCUlOICBVQ0hBUiAgICpwcmVmaXgsCisJSU4gIElOVCAgICAgcHJlZml4X2xlbiwKKwlJTiAgVUNIQVIgICAqZGF0YSwKKwlJTiAgSU5UICAgICBkYXRhX2xlbiwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBJTlQgICAgIGxlbik7CisKK1ZPSUQgICAgQ0NLTVBSRigKKwlJTiAgVUNIQVIgICAqa2V5LAorCUlOICBJTlQgICAgIGtleV9sZW4sCisJSU4gIFVDSEFSICAgKmRhdGEsCisJSU4gIElOVCAgICAgZGF0YV9sZW4sCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgSU5UICAgICBsZW4pOworCitWT0lEIFdwYUNvdW50UFRLKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICpQTUssCisJSU4gIFVDSEFSICAgKkFOb25jZSwKKwlJTiAgVUNIQVIgICAqQUEsCisJSU4gIFVDSEFSICAgKlNOb25jZSwKKwlJTiAgVUNIQVIgICAqU0EsCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgVUlOVCAgICBsZW4pOworCitWT0lEICAgIEdlblJhbmRvbSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCSptYWNBZGRyLAorCU9VVAlVQ0hBUgkJCSpyYW5kb20pOworCisvLworLy8gcHJvdG90eXBlIGluIGFpcm9uZXQuYworLy8KK1ZPSUQgICAgQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICAgICAgICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgIFRyYW5zW10pOworCitWT0lEICAgIEFpcm9uZXRNc2dBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgQWlyb25ldFJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIE5vaXNlSGlzdFJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQmVhY29uUmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBBaXJvbmV0UmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIENoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIE5vaXNlSGlzdFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEICAgIEJlYWNvblJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBBaXJvbmV0QWRkQmVhY29uUmVwb3J0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgVUxPTkcgICAgICAgICAgICAgICBJbmRleCwKKwlJTiAgUE1MTUVfUVVFVUVfRUxFTSAgICBwRWxlbSk7CisKK1ZPSUQgICAgQWlyb25ldENyZWF0ZUJlYWNvblJlcG9ydEZyb21Cc3NUYWJsZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOworCitWT0lEICAgIERCR1BSSU5UX1RYX1JJTkcoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIFVDSEFSICAgICAgICAgIFF1ZUlkeCk7CisKK1ZPSUQgREJHUFJJTlRfUlhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQpOworCitDSEFSICAgIENvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIENIQVIJCQkJUnNzaSwKKwlJTiBVQ0hBUiAgICBSc3NpTnVtYmVyKTsKKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCitWT0lEIEFQQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisKK1ZPSUQgQVBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKy8vCisvLyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gY21tX3dwYS5jCisvLworQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKKwlJTiBQVUNIQVIgCQkJcERhdGEsCisJSU4gVUxPTkcgCQkJRGF0YUJ5dGVDb3VudCwKKwlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBBRVNfR1RLX0tFWV9VTldSQVAoCisJSU4gIFVDSEFSICAgKmtleSwKKwlPVVQgVUNIQVIgICAqcGxhaW50ZXh0LAorCUlOCVVDSEFSCWNfbGVuLAorCUlOICBVQ0hBUiAgICpjaXBoZXJ0ZXh0KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJT1VUCVVDSEFSCQkJKk9mZnNldCk7CisKK0JPT0xFQU4gUlRNUFBhcnNlRWFwb2xLZXlEYXRhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlJbmRleCwKKwlJTglVQ0hBUgkJCU1zZ1R5cGUsCisJSU4JQk9PTEVBTgkJCWJXUEEyLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7CisKK1ZPSUQJQ29uc3RydWN0RWFwb2xNc2coCisJSU4gCVBSVE1QX0FEQVBURVIgICAgCXBBZCwKKyAgICBJTiAJVUNIQVIJCQkJUGVlckF1dGhNb2RlLAorICAgIElOIAlVQ0hBUgkJCQlQZWVyV2VwU3RhdHVzLAorICAgIElOIAlVQ0hBUgkJCQlNeUdyb3VwS2V5V2VwU3RhdHVzLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOCVVDSEFSCQkJCURlZmF1bHRLZXlJZHgsCisgICAgSU4gCVVDSEFSCQkJCSpSZXBsYXlDb3VudGVyLAorCUlOIAlVQ0hBUgkJCQkqS2V5Tm9uY2UsCisJSU4JVUNIQVIJCQkJKlR4UlNDLAorCUlOCVVDSEFSCQkJCSpQVEssCisJSU4JVUNIQVIJCQkJKkdUSywKKwlJTglVQ0hBUgkJCQkqUlNOSUUsCisJSU4JVUNIQVIJCQkJUlNOSUVfTGVuLAorICAgIE9VVCBQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cpOworCitWT0lECUNhbGN1bGF0ZU1JQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVBlZXJXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQkqUFRLLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZyk7CisKK05ESVNfU1RBVFVTCVJUTVBTb2Z0RGVjcnlwdEJyb2FkQ2FzdERhdGEoCisJSU4JUFJUTVBfQURBUFRFUgkJCQkJcEFkLAorCUlOCVJYX0JMSwkJCQkJCQkqcFJ4QmxrLAorCUlOICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyAJR3JvdXBDaXBoZXIsCisJSU4gIFBDSVBIRVJfS0VZCQkJCQkJcFNoYXJkX2tleSk7CisKK1ZPSUQJQ29uc3RydWN0RWFwb2xLZXlEYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlckF1dGhNb2RlLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCUdyb3VwS2V5V2VwU3RhdHVzLAorCUlOIAlVQ0hBUgkJCU1zZ1R5cGUsCisJSU4JVUNIQVIJCQlEZWZhdWx0S2V5SWR4LAorCUlOCUJPT0xFQU4JCQliV1BBMkNhcGFibGUsCisJSU4JVUNIQVIJCQkqUFRLLAorCUlOCVVDSEFSCQkJKkdUSywKKwlJTglVQ0hBUgkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCVJTTklFX0xFTiwKKwlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpOworCitWT0lEIFJUTVBNYWtlUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVJTlQgICAgICAgICAgICBBdXRoTW9kZSwKKwlJTiAgVUlOVCAgICAgICAgICAgIFdlcFN0YXR1cywKKwlJTglVQ0hBUgkJCWFwaWR4KTsKKworLy8KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiBhcF93cGEuYworLy8KKworQk9PTEVBTiBBUFdwYU1zZ1R5cGVTdWJzdCgKKwlJTiBVQ0hBUiAgICBFQVBUeXBlLAorCU9VVCBJTlQgKk1zZ1R5cGUpIDsKKworTUFDX1RBQkxFX0VOVFJZICpQQUNJbnF1aXJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyAgICAgICAgICAgV2NpZCk7CisKK0JPT0xFQU4gUlRNUENoZWNrTWNhc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVJRF9TVFJVQ1QgICAgICBlaWRfcHRyLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK0JPT0xFQU4gUlRNUENoZWNrVWNhc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVJRF9TVFJVQ1QgICAgICBlaWRfcHRyLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK0JPT0xFQU4gUlRNUENoZWNrQVVUSCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRUlEX1NUUlVDVCAgICAgIGVpZF9wdHIsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworVk9JRCBXUEFTdGFydDRXYXlIUygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJSU4JVUxPTkcJCQlUaW1lSW50ZXJ2YWwpOworCitWT0lEIFdQQVN0YXJ0MldheUdyb3VwSFMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKworVk9JRCBBUFdwYUVBUFBhY2tldEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xTdGFydEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xMb2dvZmZBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MS2V5QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTEFTRkFsZXJ0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgSGFuZGxlQ291bnRlck1lYXN1cmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworVk9JRCBQZWVyUGFpck1zZzJBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclBhaXJNc2c0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENNVGltZXJFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgV1BBUmV0cnlFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgRW5xdWV1ZVN0YXJ0Rm9yUFNLRXhlYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFJUTVBIYW5kbGVTVEFLZXkoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWRhcHRlciwKKyAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKKyNpZiAwIC8vIG1lcmdlIGludG8gUGVlclBhaXJNc2c0QWN0aW9uCitWT0lEIFdwYTFQZWVyUGFpck1zZzRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgV3BhMlBlZXJQYWlyTXNnNEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKyNlbmRpZiAvLyAwIC8vCisKK1ZPSUQgUGVlckdyb3VwTXNnMkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBWT0lEICAgICAgICAgICAgICpNc2csCisJSU4gIFVJTlQgICAgICAgICAgICAgTXNnTGVuKTsKKworI2lmIDAJLy8gcmVwbGFjZWQgYnkgV1BBU3RhcnQyV2F5R3JvdXBIUworTkRJU19TVEFUVVMgQVBXcGFIYXJkVHJhbnNtaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSk7CisjZW5kaWYgLy8gMCAvLworCitWT0lEIFBhaXJEaXNBc3NvY0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7CisKK1ZPSUQgTWxtZURlQXV0aEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7CisKK1ZPSUQgR1JFS0VZUGVyaW9kaWNFeGVjKAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKKwlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQ291bnRHVEsoCisJSU4gIFVDSEFSICAgKlBNSywKKwlJTiAgVUNIQVIgICAqR05vbmNlLAorCUlOICBVQ0hBUiAgICpBQSwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBVSU5UICAgIGxlbik7CisKK1ZPSUQgICAgR2V0U21hbGwoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJT1VUIFBVQ0hBUiAgb3V0LAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgICAgR2V0TGFyZ2UoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJT1VUIFBVQ0hBUiAgb3V0LAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgQVBHZW5SYW5kb20oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFVDSEFSICAgICAgICpyYW5kb20pOworCitWT0lEIEFFU19HVEtfS0VZX1dSQVAoCisJSU4gVUNIQVIgKmtleSwKKwlJTiBVQ0hBUiAqcGxhaW50ZXh0LAorCUlOIFVDSEFSIHBfbGVuLAorCU9VVCBVQ0hBUiAqY2lwaGVydGV4dCk7CisKK1ZPSUQgICAgV3BhU2VuZCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcFBhY2tldCwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgIExlbik7CisKK1ZPSUQgICAgQVBUb1dpcmVsZXNzU3RhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKKwlJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTglCT09MRUFOCQkJYkNsZWFyRnJhbWUpOworCitWT0lEIFJUTVBBZGRQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCisJSU4JSU5UCQkJCQkJYXBpZHgsCisJSU4JUFVDSEFSCQkJCXBBZGRyLAorCUlOCVVDSEFSCQkJCQkqUE1LSUQsCisJSU4JVUNIQVIJCQkJCSpQTUspOworCitJTlQgUlRNUFNlYXJjaFBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JSU5UCQkJCWFwaWR4LAorCUlOCVBVQ0hBUgkJcEFkZHIpOworCitWT0lEIFJUTVBEZWxldGVQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCwKKwlJTiAgSU5UCQkJCWlkeCk7CisKK1ZPSUQgUlRNUE1haW50YWluUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQJUlRNUFNlbmRUcmlnZ2VyRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFZPSUQJCQlwQnVmZmVyLAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOCUJPT0xFQU4JCQliUW9zTnVsbCk7CisKKworLy90eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7CisKKworLyogdGltZW91dCAtLSBtcyAqLworVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKK1ZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKKwlJTglQVk9JRCBkYXRhKTsKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworVk9JRCBSVE1QX09TX01vZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkgKnBDYW5jZWxsZWQpOworCisKK1ZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSk7CisKK1ZPSUQgUlRNUHVzZWNEZWxheSgKKwlJTglVTE9ORwl1c2VjKTsKKworTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSk7CisKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pOworCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitWT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeSgKKwlJTiBQVk9JRAloYW5kbGUsCisJT1VUCVBWT0lECSpwcEFkKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoKTsKKwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7CisKK3ZvaWQgUlRNUF9RdWVyeU5leHRQYWNrZXRJbmZvKAorCUlOICBQTkRJU19QQUNLRVQgKnBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOworCisKK0JPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSyAqcFR4QmxrKTsKKworCitQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCitydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZyk7CisKKworIHZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitVSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitVSU5UIEhhbmRsZV9BTVNEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKwordm9pZCBjb252ZXJ0XzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcDgwMjNoZHIsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5FVF9ERVYgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBPbGRQa3QpOworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1ZMQU4oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfV1BJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVJTlQzMgkJCWV4dF9oZWFkX2xlbiwKKwlJTglVSU5UMzIJCQlleHRfdGFpbF9sZW4pOworCitVQ0hBUiBWTEFOXzgwMjNfSGVhZGVyX0NvcHkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOCVVJTlQgICAgICAgICAgICBIZHJMZW4sCisJT1VUIFBVQ0hBUgkJCXBEYXRhLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAorCUlOIFVMT05HCQkJTm93MzIpOworCisKK1ZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCisJCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCUlOIE1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCQkJSU4gVUNIQVIJCQlUSUQsCisJCQlJTiBVU0hPUlQJCQlUaW1lT3V0LAorCQkJSU4gVUxPTkcJCQlEZWxheVRpbWUsCisJCQlJTiBCT09MRUFOCQlpc0ZvcmNlZCk7CisKK1ZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlVQ0hBUiBXY2lkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKTsKKworCitWT0lEIGJ1aWxkX3R4X3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJcEZyYW1lLAorCUlOCVVMT05HCUZyYW1lTGVuKTsKKworCitWT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJCQlXY2lkLAorCUlOCQlVQ0hBUgkJCVRJRCwKKwlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlLAorCUlOCQlCT09MRUFOCQkJYkZvcmNlU2VuZCk7CisKK1ZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCisJSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUgkJCVdjaWQsCisJSU4JCVVDSEFSCQkJVElELAorCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUpOworCitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSk7Cit2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VMT05HIEF1dG9DaEJzc0luc2VydEVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBDaGFubmVsTm8sCisJSU4gQ0hBUiBSc3NpKTsKKwordm9pZCBBdXRvQ2hCc3NUYWJsZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIENoYW5uZWxJbmZvSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgQXV0b0NoQnNzVGFibGVEZXN0cm95KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBDaGFubmVsSW5mb0Rlc3Ryb3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVQ0hBUiBOZXdfQXBBdXRvU2VsZWN0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gcnRzdHJtYWN0b2hleCgKKwlJTiBjaGFyICpzMSwKKwlJTiBjaGFyICpzMik7CisKK0JPT0xFQU4gcnRzdHJjYXNlY21wKAorCUlOIGNoYXIgKnMxLAorCUlOIGNoYXIgKnMyKTsKKworY2hhciAqcnRzdHJzdHJ1bmNhc2VjbXAoCisJSU4gY2hhciAqczEsCisJSU4gY2hhciAqczIpOworCitjaGFyICAgICpydHN0cnN0cigKKwlJTgljb25zdCBjaGFyICogczEsCisJSU4JY29uc3QgY2hhciAqIHMyKTsKKworY2hhciAqcnN0cnRvaygKKwlJTiBjaGFyICogcywKKwlJTiBjb25zdCBjaGFyICogY3QpOworCitpbnQgcnRpbmV0X2F0b24oCisJY29uc3QgY2hhciAqY3AsCisJdW5zaWduZWQgaW50ICphZGRyKTsKKworLy8vLy8vLy8vLyBjb21tb24gaW9jdGwgZnVuY3Rpb25zIC8vLy8vLy8vLy8KK0lOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NoYW5uZWxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UeFByZWFtYmxlX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SVFNUaHJlc2hvbGRfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1R4QnVyc3RfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNldF9Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVAlTZXRfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBEQkcKK0lOVAlTZXRfRGVidWdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNldF9CQVNldHVwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQURlY2xpbmVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRTdGJjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEh0Y19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRMaW5rQWRhcHRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdFByb3RlY3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TWltb1BzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworCitJTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfRm9yY2VHRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRDb21tb25IVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0lOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vRGxzICwJa2F0aHkKK1ZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vQmxvY2sgQUNLCitWT0lEIFF1ZXJ5QkFUQUJMRSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBRVUVSWUJBX1RBQkxFIHBCQVQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAJcEFkLAorCUlOICBQVUNIQVIJCQkJcEZyYW1lLAorCUlOICBVU0hPUlQJCQkJRnJhbWVMZW4sCisJSU4gIFVTSE9SVAkJCQlPZmZTZXQpOworCitWT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdCk7CisKK1ZPSUQgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2ludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYygKKwlJTiAgUlRNUF9BREFQVEVSICpwQWQpOworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgSGFuZGxlX0JTU19XaWR0aF9UcmlnZ2VyX0V2ZW50cygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgYnVpbGRfZXh0X2NoYW5uZWxfc3dpdGNoX2llKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUgKnBJRSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBBUFJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUJPT0xFQU4JCQlhcmdjKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy8gQU1QRFUgcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKy8vIEFNU0RVIHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKwordm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gcmVtb3ZlIExMQyBhbmQgZ2V0IDgwMl8zIEhlYWRlcgorI2RlZmluZSAgUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhfcFJ4QmxrLCBfcEhlYWRlcjgwMl8zKQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJUFVDSEFSIF9wUmVtb3ZlZExMQ1NOQVAgPSBOVUxMLCBfcERBLCBfcFNBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9NRVNIKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlfcFNBID0gKFBVQ0hBUilfcFJ4QmxrLT5wSGVhZGVyICsgc2l6ZW9mKEhFQURFUl84MDJfMTEpOyAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9JTkZSQSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9ETFMpKQkJCQkJCQkJCVwKKwkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsJCQkJCQkJCQkJXAorCQllbHNlCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJQ09OVkVSVF9UT184MDJfMyhfcEhlYWRlcjgwMl8zLCBfcERBLCBfcFNBLCBfcFJ4QmxrLT5wRGF0YSwgCQkJCVwKKwkJX3BSeEJsay0+RGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQVBGb3dhcmRXaXJlbGVzc1N0YVRvV2lyZWxlc3NTdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUxPTkcJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpXAorCQkJU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKTsKKwkJCS8vYW5ub3VuY2VfODAyXzNfcGFja2V0KF9wQWQsIF9wUGFja2V0KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitQTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKTsKKworCisvLyBOb3JtYWwsIEFNUERVIG9yIEFNU0RVCitWT0lEIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIENtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7CisKK1BORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCQlwU2F2ZVJ4RCwKKwlPVVQJCUJPT0xFQU4JCQkqcGJSZXNjaGVkdWxlLAorCUlOIE9VVAlVSU5UMzIJCQkqcFJ4UGVuZGluZyk7CisKK1BORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKy8vZm9yIHNubXAgLCBrYXRoeQordHlwZWRlZiBzdHJ1Y3QgX0RlZmF1bHRLZXlJZHhWYWx1ZQoreworCVVDSEFSCUtleUlkeDsKKwlVQ0hBUglWYWx1ZVsxNl07Cit9IERlZmF1bHRLZXlJZHhWYWx1ZSwgKlBEZWZhdWx0S2V5SWR4VmFsdWU7CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitlbnVtIHsKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtCQk9IDB4MDAwMDAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZQk9IDB4MDAwMTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lCT0gMHgwMDAyMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWwJPSAweDAwMDMwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaQkJPSAweDAwMDQwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc3EJCT0gMHgwMDA1MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbAk9IDB4MDAwNjAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZQkJPSAweDAwMDcwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZQkJPSAweDAwMDgwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eAkJPSAweDAwMDkwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuCT0gMHgwMDBBMDA0NAorfTsKK2VudW0geworCVA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWUJPSAweDAwCit9OworZW51bSB7CisJUDgwMjExRU5VTV90cnV0aF9mYWxzZQkJCT0gMHgwMCwKKwlQODAyMTFFTlVNX3RydXRoX3RydWUJCQk9IDB4MDEKK307CisKKy8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiBkaWQ7CisgICAgICAgIFVJTlQxNiBzdGF0dXM7CisgICAgICAgIFVJTlQxNiBsZW47CisgICAgICAgIFVJTlQzMiBkYXRhOworfSBwODAyMTFpdGVtX3VpbnQzMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiBtc2djb2RlOworICAgICAgICBVSU5UMzIgbXNnbGVuOworI2RlZmluZSBXTEFOX0RFVk5BTUVMRU5fTUFYIDE2CisgICAgICAgIFVJTlQ4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgaG9zdHRpbWU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgbWFjdGltZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBjaGFubmVsOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHJzc2k7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgc3E7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgc2lnbmFsOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG5vaXNlOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHJhdGU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgaXN0eDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBmcm1sZW47Cit9IHdsYW5fbmdfcHJpc20yX2hlYWRlcjsKKworLyogVGhlIHJhZGlvIGNhcHR1cmUgaGVhZGVyIHByZWNlZGVzIHRoZSA4MDIuMTEgaGVhZGVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHsKKyAgICBVSU5UOAlpdF92ZXJzaW9uOwkvKiBWZXJzaW9uIDAuIE9ubHkgaW5jcmVhc2VzCisJCQkJICogZm9yIGRyYXN0aWMgY2hhbmdlcywKKwkJCQkgKiBpbnRyb2R1Y3Rpb24gb2YgY29tcGF0aWJsZQorCQkJCSAqIG5ldyBmaWVsZHMgZG9lcyBub3QgY291bnQuCisJCQkJICovCisgICAgVUlOVDgJaXRfcGFkOworICAgIFVJTlQxNiAgICAgaXRfbGVuOyAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgd2hvbGUKKwkJCQkgKiBoZWFkZXIgaW4gYnl0ZXMsIGluY2x1ZGluZworCQkJCSAqIGl0X3ZlcnNpb24sIGl0X3BhZCwKKwkJCQkgKiBpdF9sZW4sIGFuZCBkYXRhIGZpZWxkcy4KKwkJCQkgKi8KKyAgICBVSU5UMzIgICBpdF9wcmVzZW50OwkvKiBBIGJpdG1hcCB0ZWxsaW5nIHdoaWNoCisJCQkJCSAqIGZpZWxkcyBhcmUgcHJlc2VudC4gU2V0IGJpdCAzMQorCQkJCQkgKiAoMHg4MDAwMDAwMCkgdG8gZXh0ZW5kIHRoZQorCQkJCQkgKiBiaXRtYXAgYnkgYW5vdGhlciAzMiBiaXRzLgorCQkJCQkgKiBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgYXJlIG1hZGUKKwkJCQkJICogYnkgc2V0dGluZyBiaXQgMzEuCisJCQkJCSAqLworfWllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgOworCitlbnVtIGllZWU4MDIxMV9yYWRpb3RhcF90eXBlIHsKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCA9IDAsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTID0gMSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfUkFURSA9IDIsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUwgPSAzLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9GSFNTID0gNCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCA9IDUsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlROT0lTRSA9IDYsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0xPQ0tfUVVBTElUWSA9IDcsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX1RYX0FUVEVOVUFUSU9OID0gOCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfVFhfQVRURU5VQVRJT04gPSA5LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fVFhfUE9XRVIgPSAxMCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfQU5URU5OQSA9IDExLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwgPSAxMiwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0UgPSAxMworfTsKKworI2RlZmluZSBXTEFOX1JBRElPVEFQX1BSRVNFTlQgKAkJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCkJfAlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTKSB8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkgIHwgCVwKKwkgMCkKKwordHlwZWRlZiBzdHJ1Y3QgX3dsYW5fcmFkaW90YXBfaGVhZGVyIHsKKwlpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHd0X2loZHI7CisJSU5UNjQgd3RfdHNmdDsKKwlVSU5UOCB3dF9mbGFnczsKKwlVSU5UOCB3dF9yYXRlOworfSB3bGFuX3JhZGlvdGFwX2hlYWRlcjsKKy8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCisKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsayk7CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCisgICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworI2VuZGlmCisKK1ZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitJTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitJTlQJU2V0X09wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworc3RhdGljIGlubGluZSBjaGFyKiBHZXRQaHlNb2RlKAorCWludCBNb2RlKQoreworCXN3aXRjaChNb2RlKQorCXsKKwkJY2FzZSBNT0RFX0NDSzoKKwkJCXJldHVybiAiQ0NLIjsKKworCQljYXNlIE1PREVfT0ZETToKKwkJCXJldHVybiAiT0ZETSI7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgTU9ERV9IVE1JWDoKKwkJCXJldHVybiAiSFRNSVgiOworCisJCWNhc2UgTU9ERV9IVEdSRUVORklFTEQ6CisJCQlyZXR1cm4gIkdSRUVOIjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiTi9BIjsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSBjaGFyKiBHZXRCVygKKwlpbnQgQlcpCit7CisJc3dpdGNoKEJXKQorCXsKKwkJY2FzZSBCV18xMDoKKwkJCXJldHVybiAiMTBNIjsKKworCQljYXNlIEJXXzIwOgorCQkJcmV0dXJuICIyME0iOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIEJXXzQwOgorCQkJcmV0dXJuICI0ME0iOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJOL0EiOworCX0KK30KKworCitWT0lEIFJUMjh4eFRocmVhZFRlcm1pbmF0ZSgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAorCUlOIHZvaWQgKl9kZXZfcCk7CisKK0JPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKKworQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAorCUlOIElOVDMyCQkJCWFyZ2MpOworCitWT0lEIFJUMjhYWERNQURpc2FibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7CisKK1ZPSUQgUlQyOFhYRE1BRW5hYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOworCitWT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCisJSU4gUlRNUF9BREFQVEVSICogcEFkLAorCUlOIElOVCBhcGlkeCwKKwlJTiBVTE9ORyBCZWFjb25MZW4sCisJSU4gVUxPTkcgVXBkYXRlUG9zKTsKKworSU5UIHJ0Mjh4eF9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQljbWQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVCBydDI4eHhfc3RhX2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCWNtZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0JPT0xFQU4gUlQyOFhYU2VjdXJpdHlLZXlBZGQoCisJSU4JCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTgkJVUxPTkcJCQkJYXBpZHgsCisJSU4JCVVMT05HCQkJCUtleUlkeCwKKwlJTgkJTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5KTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpOworCisKK3ZvaWQga2lsbF90aHJlYWRfdGFzayhQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgdGJ0dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKworVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOCVVDSEFSICAgICAgICAgICBDaGFubmVsKTsKKworVk9JRCBBc2ljVHVybk9uUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCk7CisKKyNpZmRlZiBSVDI4NzAKKy8vCisvLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfYnVsay5jCisvLworVk9JRAlSVFVTQkluaXRUeERlc2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYX0NPTlRFWFQJCXBUeENvbnRleHQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAorCUlOCXVzYl9jb21wbGV0ZV90CUZ1bmMpOworCitWT0lECVJUVVNCSW5pdEhUVHhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIVF9UWF9DT05URVhUCXBUeENvbnRleHQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAorCUlOCVVMT05HCQkJQnVsa091dFNpemUsCisJSU4JdXNiX2NvbXBsZXRlX3QJRnVuYyk7CisKK1ZPSUQJUlRVU0JJbml0UnhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBSWF9DT05URVhUCQlwUnhDb250ZXh0KTsKKworVk9JRCBSVFVTQkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTglVQ0hBUgkJCUluZGV4KTsKKworVk9JRCBSVFVTQkJ1bGtPdXROdWxsRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCQnVsa091dFJUU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCQ2FuY2VsUGVuZGluZ0lSUHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCk7CisKK1ZPSUQgUlRVU0JCdWxrT3V0UHNQb2xsKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQktpY2tCdWxrT3V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRAlSVFVTQkJ1bGtSZWNlaXZlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBEb0J1bGtJbigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK1ZPSUQgUlRVU0JJbml0UnhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dCk7CisKK1ZPSUQgUlRVU0JCdWxrUnhIYW5kbGUoCisJSU4gdW5zaWduZWQgbG9uZyBkYXRhKTsKKworLy8KKy8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9pby5jCisvLworTlRTVEFUVVMgUlRVU0JNdWx0aVJlYWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCU9VVAlQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpOworCitOVFNUQVRVUyBSVFVTQk11bHRpV3JpdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCk7CisKK05UU1RBVFVTIFJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSk7CisKK05UU1RBVFVTIFJUVVNCUmVhZEJCUFJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSWQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKTsKKworTlRTVEFUVVMgUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSWQsCisJSU4JVUNIQVIJCQlWYWx1ZSk7CisKK05UU1RBVFVTIFJUVVNCV3JpdGVSRlJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVJTlQzMgkJCVZhbHVlKTsKKworTlRTVEFUVVMJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmVnSUQsCisJSU4JVUNIQVIJCQlWYWx1ZSk7CisKK05UU1RBVFVTCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmVnSUQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKTsKKworTlRTVEFUVVMgUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVSU5UMzIJCQlUcmFuc2ZlckZsYWdzLAorCUlOCVVDSEFSCQkJUmVzZXJ2ZWRCaXRzLAorCUlOCVVDSEFSCQkJUmVxdWVzdCwKKwlJTglVU0hPUlQJCQlWYWx1ZSwKKwlJTglVU0hPUlQJCQlJbmRleCwKKwlJTglQVk9JRAkJCVRyYW5zZmVyQnVmZmVyLAorCUlOCVVJTlQzMgkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKworTlRTVEFUVVMgUlRVU0JSZWFkRUVQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlPVVQJUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKTsKKworTlRTVEFUVVMgUlRVU0JXcml0ZUVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKTsKKworVk9JRCBSVFVTQlB1dFRvU2xlZXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitOVFNUQVRVUyBSVFVTQldha2VVcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JJbml0aWFsaXplQ21kUSgKKwlJTglQQ21kUQljbWRxKTsKKworTkRJU19TVEFUVVMJUlRVU0JFbnF1ZXVlQ21kRnJvbU5kaXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTkRJU19PSUQJCU9pZCwKKwlJTglCT09MRUFOCQkJU2V0SW5mb3JtYXRpb24sCisJSU4JUFZPSUQJCQlwSW5mb3JtYXRpb25CdWZmZXIsCisJSU4JVUlOVDMyCQkJSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCitORElTX1NUQVRVUyBSVFVTQkVucXVldWVJbnRlcm5hbENtZCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBORElTX09JRAkJCU9pZCwKKwlJTiBQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKKwlJTiBVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisKK1ZPSUQgUlRVU0JEZXF1ZXVlQ21kKAorCUlOCVBDbWRRCQljbWRxLAorCU9VVAlQQ21kUUVsbXQJKnBjbWRxZWxtdCk7CisKK0lOVCBSVFVTQkNtZFRocmVhZCgKKwlJTiBPVVQgUFZPSUQgQ29udGV4dCk7CisKK0lOVCBUaW1lclFUaHJlYWQoCisJSU4gT1VUIFBWT0lEIENvbnRleHQpOworCitSVDI4NzBfVElNRVJfRU5UUlkgKlJUMjg3MF9UaW1lclFfSW5zZXJ0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcik7CisKK0JPT0xFQU4gUlQyODcwX1RpbWVyUV9SZW1vdmUoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gUkFMSU5LX1RJTUVSX1NUUlVDVCAqcFRpbWVyKTsKKwordm9pZCBSVDI4NzBfVGltZXJRX0V4aXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCit2b2lkIFJUMjg3MF9UaW1lclFfSW5pdCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvbkV4aXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25TdG9wKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RhcnQoCisJSU4gUlRNUF9BREFQVEVSICogcEFkKTsKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uSW5pdCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK1ZPSUQgUlQyODcwX1dhdGNoRG9nKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworTlRTVEFUVVMgUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglVSU5UMzIJCQlWYWx1ZSk7CisKK05UU1RBVFVTIFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlPVVQJUFVJTlQzMgkJCXBWYWx1ZSk7CisKK05UU1RBVFVTIFJUVVNCU2luZ2xlV3JpdGUoCisJSU4gCVJUTVBfQURBUFRFUiAJKnBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJSU4JVVNIT1JUCQkJVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQkZpcm13YXJlUnVuKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworTlRTVEFUVVMgUlRVU0JGaXJtd2FyZVdyaXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUgkJcEZ3SW1hZ2UsCisJSU4gVUxPTkcJCUZ3TGVuKTsKKworTlRTVEFUVVMJUlRVU0JGaXJtd2FyZU9wbW9kZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVJTlQzMgkJCXBWYWx1ZSk7CisKK05UU1RBVFVTCVJUVVNCVmVuZGVyUmVzZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitORElTX1NUQVRVUyBSVFVTQlNldEhhcmRXYXJlUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVk9JRAkJCXBCdWYpOworCitORElTX1NUQVRVUyBSVFVTQlF1ZXJ5SGFyZFdhcmVSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBWT0lECQkJcEJ1Zik7CisKK1ZPSUQgQ01ESGFuZGxlcigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKworTkRJU19TVEFUVVMJIENyZWF0ZVRocmVhZHMoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgKTsKKworCitWT0lEIE1hY1RhYmxlSW5pdGlhbGl6ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZVNldFBzbSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKTsKKworTkRJU19TVEFUVVMgUlRNUFdQQUFkZEtleVByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBWT0lEICAgICAgICAgICBwQnVmKTsKKworVk9JRCBBc2ljUnhBbnRFdmFsQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworI2lmIDAgLy8gTWFyayBiZWNhdXNlIG5vdCB1c2VkIGluIFJUMjh4eC4KK05UU1RBVFVTIFJUVVNCUnhQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOICAgIEJPT0xFQU4gICAgICAgICAgYkJ1bGtSZWNlaXZlKTsKKworVk9JRCBSVFVTQkRlcXVldWVNTE1FUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkNsZWFuVXBNTE1FV2FpdFF1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZgorCit2b2lkIGFwcGVuZF9wa3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJT1VUICBQTkRJU19QQUNLRVQJKnBwUGFja2V0KTsKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSk7CisKK05ESVNfU1RBVFVTCVJUTVBDaGVja1J4RXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTglQUlhXSV9TVFJVQwlwUnhXSSwKKwlJTglQUlQyOFhYX1JYRF9TVFJVQwlwUnhJTkZPKTsKKworCitWT0lEIFJUVVNCTWxtZUhhcmRUcmFuc21pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTUdNVF9TVFJVQwkJcE1nbXQpOworCitJTlQgTWxtZVRocmVhZCgKKwlJTiBQVk9JRCBDb250ZXh0KTsKKworI2lmIDAKK1ZPSUQgICAgUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCAgICBSVFVTQlN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZgorCisvLworLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2RhdGEuYworLy8KK05ESVNfU1RBVFVTCVJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTglVSU5UMzIJCQlOdW1iZXJSZXF1aXJlZCk7CisKKworQk9PTEVBTglSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVUNIQVIJCUJ1bGtPdXRQaXBlSWQpOworCisKK1ZPSUQgUlRNUFdyaXRlVHhJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCisJSU4JICBVU0hPUlQJCVVTQkRNQXBrdExlbiwKKwlJTgkgIEJPT0xFQU4JCWJXaXYsCisJSU4JICBVQ0hBUgkJCVF1ZXVlU2VsLAorCUlOCSAgVUNIQVIJCQlOZXh0VmFsaWQsCisJSU4JICBVQ0hBUgkJCVR4QnVyc3QpOworCisvLworLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIGNtbV9kYXRhXzI4NzAuYworLy8KK1VTSE9SVCBSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVAlSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYWdOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUIFJ0bXBVU0JfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYW1lTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1ZPSUQgUnRtcFVTQl9GaW5hbFdyaXRlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVTSE9SVAkJCXRvdGFsTVBEVVNpemUsCisJSU4JVVNIT1JUCQkJVHhJZHgpOworCitWT0lEIFJ0bXBVU0JEYXRhTGFzdFR4SWR4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVVTSE9SVAkJCVR4SWR4KTsKKworVk9JRCBSdG1wVVNCRGF0YUtpY2tPdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCk7CisKKworaW50IFJ0bXBVU0JNZ210S2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4gVUNIQVIgCQkJUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCisJSU4gVUlOVCAJCQlTcmNCdWZMZW4pOworCitWT0lEIFJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlRdWVJZHgsCisJSU4gVUNIQVIJCSpwTnVsbEZyYW1lLAorCUlOIFVJTlQzMgkJZnJhbWVMZW4pOworCitWT0lEIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpOworCitWT0lEIFJUMjh4eFVzYlN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworVk9JRCBSVDI4eHhVc2JNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitWT0lEIFFCU1NfTG9hZEluaXQoCisgCUlOCQlSVE1QX0FEQVBURVIJKnBBZCk7CisKK1VJTlQzMiBRQlNTX0xvYWRFbGVtZW50QXBwZW5kKAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQsCisJT1VUCQlVSU5UOAkJCSpidWZfcCk7CisKK1ZPSUQgUUJTU19Mb2FkVXBkYXRlKAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0lOVCBSVE1QU2hvd0NmZ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBOYW1lLAorCUlOCVBVQ0hBUgkJCXBCdWYpOworCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtBdXRoTW9kZVN0cigKKyAgICBJTiAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBhdXRoTW9kZSk7CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKKyAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSk7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIEFzaWNTdGFCYnBUdW5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIFN0YUFkZE1hY1RhYmxlRW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisJSU4gIFVDSEFSCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCisJSU4gIEhUX0NBUEFCSUxJVFlfSUUJKnBIdENhcGFiaWxpdHksCisJSU4gIFVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiAgVVNIT1JUICAgICAgICAJCUNhcGFiaWxpdHlJbmZvKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordm9pZCBSVE1QX0luZGljYXRlTWVkaWFTdGF0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUmVTeW5jQmVhY29uVGltZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFNldEFHQ0luaXRWYWx1ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUJhbmRXaWR0aCk7CisKK2ludCBydDI4eHhfY2xvc2UoSU4gUE5FVF9ERVYgZGV2KTsKK2ludCBydDI4eHhfb3BlbihJTiBQTkVUX0RFViBkZXYpOworCitfX2lubGluZSBJTlQgVklSVFVBTF9JRl9VUChQUlRNUF9BREFQVEVSIHBBZCkKK3sKK2V4dGVybiBWT0lEIE1lc2hNYWtlQmVhY29uKElOIFBSVE1QX0FEQVBURVIgcEFkLCBJTiBVQ0hBUiBpZHgpOworZXh0ZXJuIFZPSUQgTWVzaFVwZGF0ZUJlYWNvbkZyYW1lKElOIFBSVE1QX0FEQVBURVIgcEFkLCBJTiBVQ0hBUiBpZHgpOworCisJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkKKwl7CisJCWlmIChydDI4eHhfb3BlbihwQWQtPm5ldF9kZXYpICE9IDApCisJCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwl7CisJfQorCVZJUlRVQUxfSUZfSU5DKHBBZCk7CisJcmV0dXJuIDA7Cit9CisKK19faW5saW5lIFZPSUQgVklSVFVBTF9JRl9ET1dOKFBSVE1QX0FEQVBURVIgcEFkKQoreworCVZJUlRVQUxfSUZfREVDKHBBZCk7CisJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkKKwkJcnQyOHh4X2Nsb3NlKHBBZC0+bmV0X2Rldik7CisJcmV0dXJuOworfQorCisKKyNlbmRpZiAgLy8gX19SVE1QX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfY2tpcG1pYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2NraXBtaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Q5NDlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2NraXBtaWMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX2NraXBtaWMuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKyNpZm5kZWYJX19SVE1QX0NLSVBNSUNfSF9fCisjZGVmaW5lCV9fUlRNUF9DS0lQTUlDX0hfXworCit0eXBlZGVmCXN0cnVjdAlfTUlDX0NPTlRFWFQJeworCS8qIC0tLSBNTUggY29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCVVDSEFSCQlDS1sxNl07CQkJCS8qIHRoZSBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCVVDSEFSCQljb2VmZmljaWVudFsxNl07CS8qIGN1cnJlbnQgYWVzIGNvdW50ZXIgbW9kZSBjb2VmZmljaWVudHMgICAgICAqLworCVVMT05HTE9ORwlhY2N1bTsJCQkJLyogYWNjdW11bGF0ZWQgbWljLCByZWR1Y2VkIHRvIHUzMiBpbiBmaW5hbCgpICovCisJVUlOVAkJcG9zaXRpb247CQkJLyogY3VycmVudCBwb3NpdGlvbiAoYnl0ZSBvZmZzZXQpIGluIG1lc3NhZ2UgICovCisJVUNIQVIJCXBhcnRbNF07CQkJLyogZm9yIGNvbnZlcnNpb24gb2YgbWVzc2FnZSB0byB1MzIgZm9yIG1taCAgICovCit9CU1JQ19DT05URVhULCAqUE1JQ19DT05URVhUOworCitWT0lECUNLSVBfa2V5X3Blcm11dGUoCisJT1VUCVVDSEFSCSpQSywJCQkvKiBvdXRwdXQgcGVybXV0ZWQga2V5ICovCisJSU4JVUNIQVIJKkNLLAkJCS8qIGlucHV0IENLSVAga2V5ICovCisJSU4JVUNIQVIJdG9Ec0Zyb21EcywJCS8qIGlucHV0IHRvRHMvRnJvbURzIGJpdHMgKi8KKwlJTglVQ0hBUgkqcGl2KTsJCQkvKiBpbnB1dCBwb2ludGVyIHRvIElWICovCisKK1ZPSUQJUlRNUENraXBNaWNJbml0KAorCUlOCVBNSUNfQ09OVEVYVAkJcENvbnRleHQsCisJSU4JUFVDSEFSCQkJCUNLKTsKKworVk9JRCBSVE1QTWljVXBkYXRlKAorICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgIHBDb250ZXh0LAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIHBPY3RldHMsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgbGVuKTsKKworVUxPTkcgUlRNUE1pY0dldENvZWZmaWNpZW50KAorICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgICBwQ29udGV4dCk7CisKK1ZPSUQgeG9yXzEyOCgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGIsCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVUNIQVIgUlRNUENraXBTYm94KAorICAgIElOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOworCitWT0lEIHhvcl8zMigKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGIsCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBuZXh0X2tleSgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgcm91bmQpOworCitWT0lEIGJ5dGVfc3ViKAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgc2hpZnRfcm93KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbWl4X2NvbHVtbigKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIFJUTVBBZXNFbmNyeXB0KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGtleSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBkYXRhLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGNpcGhlcnRleHQpOworCitWT0lEIFJUTVBNaWNGaW5hbCgKKyAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICBwQ29udGV4dCwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICAgICBkaWdlc3RbNF0pOworCitWT0lEIFJUTVBDa2lwSW5zZXJ0Q01JQygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgIHBNSUMsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwODAyMTFoZHIsCisgICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0LAorICAgIElOICBQQ0lQSEVSX0tFWSAgICAgcEtleSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIG1pY19zbmFwKTsKKworI2VuZGlmIC8vX19SVE1QX0NLSVBNSUNfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NjMyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9kZWYuaApAQCAtMCwwICsxLDE2MjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRtcF9kZWYuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgcmVsYXRlZCBkZWZpbml0aW9uIGhlYWRlcgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKKyAgICBKb2huIENoYW5nICAwOC0wNS0yMDAzICAgIGFkZCBkZWZpbml0aW9uIGZvciAxMWcgJiBvdGhlciBkcmFmdHMKKyovCisjaWZuZGVmIF9fUlRNUF9ERUZfSF9fCisjZGVmaW5lIF9fUlRNUF9ERUZfSF9fCisKKyNpbmNsdWRlICJvaWQuaCIKKworLy8KKy8vICBEZWJ1ZyBpbmZvcm1hdGlvbiB2ZXJib3NpdHk6IGxvd2VyIHZhbHVlcyBpbmRpY2F0ZSBoaWdoZXIgdXJnZW5jeQorLy8KKyNkZWZpbmUgUlRfREVCVUdfT0ZGICAgICAgICAwCisjZGVmaW5lIFJUX0RFQlVHX0VSUk9SICAgICAgMQorI2RlZmluZSBSVF9ERUJVR19XQVJOICAgICAgIDIKKyNkZWZpbmUgUlRfREVCVUdfVFJBQ0UgICAgICAzCisjZGVmaW5lIFJUX0RFQlVHX0lORk8gICAgICAgNAorI2RlZmluZSBSVF9ERUJVR19MT1VEICAgICAgIDUKKworI2RlZmluZSBOSUNfVEFHICAgICAgICAgICAgICgoVUxPTkcpJzA2ODInKQorI2RlZmluZSBOSUNfREJHX1NUUklORyAgICAgICgiKipSVDI4eHgqKiIpCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKy8vIGZvciBzbm1wCisvLyB0byBnZXQgbWFudWZhY3R1cmVyIE9VSSwga2F0aHksIDIwMDhfMDIyMAorI2RlZmluZSBNYW51ZmFjdHVyZXJPVUlfTEVOCQkJMworI2RlZmluZSBNYW51ZmFjdHVyZXJOQU1FCQkJKCJSYWxpbmsgVGVjaG5vbG9neSBDb21wYW55LiIpCisjZGVmaW5lCVJlc291cmNlVHlwZUlkTmFtZQkJCSgiUmFsaW5rX0lEIikKKyNlbmRpZgorCisKKy8vI2RlZmluZSBQQUNLRUQKKworI2RlZmluZSBSQUxJTktfMjg4M19WRVJTSU9OCQkoKFVJTlQzMikweDI4ODMwMzAwKQorI2RlZmluZSBSQUxJTktfMjg4MEVfVkVSU0lPTgkoKFVJTlQzMikweDI4NzIwMjAwKQorI2RlZmluZSBSQUxJTktfMzA3MF9WRVJTSU9OCQkoKFVJTlQzMikweDMwNzAwMjAwKQorCisvLworLy8gTkRJUyB2ZXJzaW9uIGluIHVzZSBieSB0aGUgTklDIGRyaXZlci4KKy8vIFRoZSBoaWdoIGJ5dGUgaXMgdGhlIG1ham9yIHZlcnNpb24uIFRoZSBsb3cgYnl0ZSBpcyB0aGUgbWlub3IgdmVyc2lvbi4KKy8vCisjaWZkZWYgIE5ESVM1MV9NSU5JUE9SVAorI2RlZmluZSBOSUNfRFJJVkVSX1ZFUlNJT04gICAgICAweDA1MDEKKyNlbHNlCisjZGVmaW5lIE5JQ19EUklWRVJfVkVSU0lPTiAgICAgIDB4MDUwMAorI2VuZGlmCisKKy8vCisvLyBORElTIG1lZGlhIHR5cGUsIGN1cnJlbnQgaXMgZXRoZXJuZXQsIGNoYW5nZSBpZiBuYXRpdmUgd2lyZWxlc3Mgc3VwcG9ydGVkCisvLworI2RlZmluZSBOSUNfTUVESUFfVFlQRSAgICAgICAgICBOZGlzTWVkaXVtODAyXzMKKyNkZWZpbmUgTklDX1BDSV9IRFJfTEVOR1RIICAgICAgMHhlMgorI2RlZmluZSBOSUNfTUFYX1BBQ0tFVF9TSVpFICAgICAyMzA0CisjZGVmaW5lIE5JQ19IRUFERVJfU0laRSAgICAgICAgIDE0CisjZGVmaW5lIE1BWF9NQVBfUkVHSVNURVJTX05FRURFRCAzMgorI2RlZmluZSBNSU5fTUFQX1JFR0lTVEVSU19ORUVERUQgMiAgIC8vVG9kbzogc2hvdWxkIGNvbnNpZGVyIGZyYWdtZW50IGlzc3VlLgorCisvLworLy8gaW50ZXJmYWNlIHR5cGUsIHdlIHVzZSBQQ0kKKy8vCisjZGVmaW5lIE5JQ19JTlRFUkZBQ0VfVFlQRSAgICAgIE5kaXNJbnRlcmZhY2VQY2kKKyNkZWZpbmUgTklDX0lOVEVSUlVQVF9NT0RFICAgICAgTmRpc0ludGVycnVwdExldmVsU2Vuc2l0aXZlCisKKy8vCisvLyBidWZmZXIgc2l6ZSBwYXNzZWQgaW4gTmRpc01RdWVyeUFkYXB0ZXJSZXNvdXJjZXMKKy8vIFdlIHNob3VsZCBvbmx5IG5lZWQgdGhyZWUgYWRhcHRlciByZXNvdXJjZXMgKElPLCBpbnRlcnJ1cHQgYW5kIG1lbW9yeSksCisvLyBTb21lIGRldmljZXMgZ2V0IGV4dHJhIHJlc291cmNlcywgc28gaGF2ZSByb29tIGZvciAxMCByZXNvdXJjZXMKKy8vICAgICAgICAgICAgICAgICAgICBVRl9TSVpFICAgKHNpemVvZihORElTX1JFU09VUkNFX0xJU1QpICsgKDEwKnNpemVvZihDTV9QQVJUSUFMX1JFU09VUkNFX0RFU0NSSVBUT1IpKSkKKworCisjZGVmaW5lIE5JQ19SRVNPVVJDRV9CLy8KKy8vIElPIHNwYWNlIGxlbmd0aAorLy8KKyNkZWZpbmUgTklDX01BUF9JT1NQQUNFX0xFTkdUSCAgc2l6ZW9mKENTUl9TVFJVQykKKworI2RlZmluZSBNQVhfUlhfUEtUX0xFTgkxNTIwCisKKy8vCisvLyBFbnRyeSBudW1iZXIgZm9yIGVhY2ggRE1BIGRlc2NyaXB0b3IgcmluZworLy8KKworCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgICAgICAgIDggLy8gMQorI2RlZmluZSBQUklPX1JJTkdfU0laRSAgICAgICAgICA4CisjZGVmaW5lIE1HTVRfUklOR19TSVpFICAgICAgIDMyIC8vIFBSSU9fUklOR19TSVpFCisjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAgICAgICAgIDgKKyNkZWZpbmUgTUFYX1RYX1BST0NFU1MgICAgICAgICAgNAorI2RlZmluZSBMT0NBTF9UWEJVRl9TSVpFICAgICAgICAyMDQ4CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKy8vIE1DOiBNdWx0cGxlIENhcmRzCisjZGVmaW5lIE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRAkJMzIKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworI2RlZmluZSBNQVhfUlhfUFJPQ0VTUyAgICAgICAgICAxMjggLy82NCAvLzMyCisjZGVmaW5lIE5VTV9PRl9MT0NBTF9UWEJVRiAgICAgIDIKKyNkZWZpbmUgVFhEX1NJWkUgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFhXSV9TSVpFICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUlhEX1NJWkUgICAgICAgICAgICAgICAJMTYKKyNkZWZpbmUgUlhXSV9TSVpFICAgICAgICAgICAgIAkxNgorLy8gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyA4MDIuMTEgSGVhZGVyIFNpemUgKyBBTVNEVSBzdWIgZnJhbWUgaGVhZGVyCisjZGVmaW5lIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkUgIDk2ICAgIC8vIG9ubHkgdGhlIDFzdCBwaHlzaWNhbCBidWZmZXIgaXMgcHJlLWFsbG9jYXRlZAorI2RlZmluZSBNR01UX0RNQV9CVUZGRVJfU0laRSAgICAxNTM2IC8vMjA0OAorI2RlZmluZSBSWF9CVUZGRVJfQUdHUkVTSVpFICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKKyNkZWZpbmUgUlhfQlVGRkVSX05PUk1TSVpFICAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2CisjZGVmaW5lIFRYX0JVRkZFUl9OT1JNU0laRQkJUlhfQlVGRkVSX05PUk1TSVpFCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAgICAgICAgIDIzNDYgICAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gODAyLjExIGZyYW1lIHNpemUKKyNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX1NJWkUgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NgorI2RlZmluZSBNQVhfTlVNX09GX1RVUExFX0NBQ0hFICAyCisjZGVmaW5lIE1BWF9NQ0FTVF9MSVNUX1NJWkUgICAgIDMyCisjZGVmaW5lIE1BWF9MRU5fT0ZfVkVORE9SX0RFU0MgIDY0CisvLyNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgKE5VTV9PRl9MT0NBTF9UWEJVRiA+PiAyKSAvLyBBUCB3b24ndCBzcGVuZCBtb3JlIHRoYW4gMS80IG9mIHRvdGFsIGJ1ZmZlcnMgb24gTS9CQ0FTVCBQU1EKKyNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBNQVhfUlhfUFJPQ0VTU19DTlQJKFJYX1JJTkdfU0laRSkKKworCisjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1FVRVVFCQkJCSg1MTIpIC8vKDUxMikgICAgLy8gdG8gcGFzcyBXTU0gQTUtV1BBUFNLCisjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX01DQVNUX1BTX1FVRVVFCQkzMgorI2RlZmluZSBNQVhfUEFDS0VUU19JTl9QU19RVUVVRQkJCQkxMjgJLy8zMgorI2RlZmluZSBXTU1fTlVNX09GX0FDICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBQzAsIEFDMSwgQUMyLCBhbmQgQUMzICovCisKKworCisvLyBSeEZpbHRlcgorI2RlZmluZSBTVEFOT1JNQUwJIDB4MTdmOTcKKyNkZWZpbmUgQVBOT1JNQUwJIDB4MTVmOTcKKy8vCisvLyAgUlRNUF9BREFQVEVSIGZsYWdzCisvLworI2RlZmluZSBmUlRNUF9BREFQVEVSX01BUF9SRUdJU1RFUiAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUiAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQVRURVJfR0FUSEVSICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU0VORF9QQUNLRVRfRVJST1IgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NTE1FX1JFU0VUX0lOX1BST0dSRVNTIDB4MDAwMDAwMjAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTICAgICAweDAwMDAwMDgwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9UWF9SSU5HX0FMTE9DQVRFRCAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyAgICAweDAwMDAwNDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUlNT1JBVEVfSU5VU0VEICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SWF9SSU5HX0FMTE9DQVRFRCAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MgIDB4MDAwMDQwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9SRUFTU09DX0lOX1BST0dSRVNTCTB4MDAwMDgwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9QRU5ESU5HCTB4MDAwMTAwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9SQURJT19PRkYJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQJCQkweDAwMDQwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUCQkJMHgwMDA4MDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1JER19BQ1RJVkUJCQkweDAwMTAwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSAweDAwMjAwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU0NBTl8yMDQwIAkJCTB4MDQwMDAwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVAkJMHgwODAwMDAwMAorCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU1RBUlRfVVAgICAgICAgICAJCTB4MTAwMDAwMDAJLy9EZXZpdmUgYWxyZWFkeSBpbml0aWFsaXplZCBhbmQgZW5hYmxlZCBUeC9SeC4KKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UgICAgMHgyMDAwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGICAgICAgICAweDQwMDAwMDAwCisKKy8vIExvY2sgYml0IGZvciBhY2Nlc3NpbmcgZGlmZmVyZW50IHJpbmcgYnVmZmVycworLy8jZGVmaW5lIGZSVE1QX0FEQVBURVJfVFhfUklOR19CVVNZICAgICAgICAweDgwMDAwMDAwCisvLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NR01UX1JJTkdfQlVTWSAgICAgIDB4NDAwMDAwMDAKKy8vI2RlZmluZSBmUlRNUF9BREFQVEVSX0FUSU1fUklOR19CVVNZICAgICAgMHgyMDAwMDAwMAorLy8jZGVmaW5lIGZSVE1QX0FEQVBURVJfUlhfUklOR19CVVNZICAgICAgICAweDEwMDAwMDAwCisKKy8vIExvY2sgYml0IGZvciBhY2Nlc3NpbmcgZGlmZmVyZW50IHF1ZXVlCisvLyNkZWZpbmUgICBmUlRNUF9BREFQVEVSX1RYX1FVRVVFX0JVU1kgICAgIDB4MDgwMDAwMDAKKy8vI2RlZmluZSAgIGZSVE1QX0FEQVBURVJfTUdNVF9RVUVVRV9CVVNZICAgMHgwNDAwMDAwMAorCisvLworLy8gIFNUQSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzCisvLworI2RlZmluZSBmT1BfU1RBVFVTX0lORlJBX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIGZPUF9TVEFUVVNfQURIT0NfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0gICAgICAgICAgICAgMHgwMDAwMDAyMAorLy8jZGVmaW5lIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgICAgMHgwMDAwMDA4MAorI2RlZmluZSBmT1BfU1RBVFVTX1dNTV9JTlVTRUQgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19ET1pFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgLy8gZGVidWcgcHVycG9zZQorI2RlZmluZSBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQgICAgICAgICAweDAwMDAwODAwICAvLyBwaWdneS1iYWNrLCBhbmQgYWdncmVnYXRpb24KKyNkZWZpbmUgZk9QX1NUQVRVU19BUFNEX0lOVVNFRAkJCQkweDAwMDAxMDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfVFhfQU1TRFVfSU5VU0VECQkJMHgwMDAwMjAwMAorI2RlZmluZSBmT1BfU1RBVFVTX01BWF9SRVRSWV9FTkFCTEVECQkweDAwMDA0MDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfV0FLRVVQX05PVyAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UgICAgICAgMHgwMDAyMDAwMAorCisjaWZkZWYgRE9UMTFOX0RSQUZUMworI2RlZmluZSBmT1BfU1RBVFVTX1NDQU5fMjA0MCAgICAgICAgICAgICAgIAkgICAgMHgwMDA0MDAwMAorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworI2RlZmluZSBDQ0tTRVRQUk9URUNUCQkweDEKKyNkZWZpbmUgT0ZETVNFVFBST1RFQ1QJCTB4MgorI2RlZmluZSBNTTIwU0VUUFJPVEVDVAkJMHg0CisjZGVmaW5lIE1NNDBTRVRQUk9URUNUCQkweDgKKyNkZWZpbmUgR0YyMFNFVFBST1RFQ1QJCTB4MTAKKyNkZWZpbmUgR1I0MFNFVFBST1RFQ1QJCTB4MjAKKyNkZWZpbmUgQUxMTl9TRVRQUk9URUNUCQkoR1I0MFNFVFBST1RFQ1QgfCBHRjIwU0VUUFJPVEVDVCB8IE1NNDBTRVRQUk9URUNUIHwgTU0yMFNFVFBST1RFQ1QpCisKKy8vCisvLyAgQVAncyBjbGllbnQgdGFibGUgb3BlcmF0aW9uIHN0YXR1cyBmbGFncworLy8KKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUgICAgICAgICAgMHgwMDAwMDAwMSAgLy8gQ0xJRU5UIGNhbiBwYXJzZSBRT1MgREFUQSBmcmFtZQorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFICAweDAwMDAwMDAyICAvLyBDTElFTlQgY2FuIHJlY2VpdmUgUmFsaW5rJ3MgcHJvcHJpZXRhcnkgVFggYWdncmVnYXRpb24gZnJhbWUKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUgICAgMHgwMDAwMDAwNCAgLy8gQ0xJRU5UIHN1cHBvcnQgcGlnZ3ktYmFjaworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQJCQkweDAwMDAwMDA4CisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUJCTB4MDAwMDAwMTAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRQkJMHgwMDAwMDAyMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRQkJMHgwMDAwMDA0MAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRQkJMHgwMDAwMDA4MAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUJCQkweDAwMDAwMjAwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUgIDB4MDAwMDA0MDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQVBTRF9DQVBBQkxFICAgICAgICAgMHgwMDAwMDgwMCAgLyogVUFQU0QgU1RBVElPTiAqLworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19CU1NDT0VYSVNUX0NBUEFCTEUJMHgwMDAwMTAwMAorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVAkJMHgwMDEwMDAwMAorLy8KKy8vICBTVEEgY29uZmlndXJhdGlvbiBmbGFncworLy8KKy8vI2RlZmluZSBmU1RBX0NGR19FTkFCTEVfVFhfQlVSU1QgICAgICAgICAgMHgwMDAwMDAwMQorCisvLyA4MDIuMTFuIE9wZXJhdGluZyBNb2RlIERlZmluaXRpb24uIDAtMyBhbHNvIHVzZWQgaW4gQVNJQ1VQZGF0ZVByb3RlY3Qgc3dpdGNoIGNhc2UKKyNkZWZpbmUgSFRfTk9fUFJPVEVDVAkwCisjZGVmaW5lIEhUX0xFR0FDWV9QUk9URUNUCTEKKyNkZWZpbmUgSFRfNDBfUFJPVEVDVAkyCisjZGVmaW5lIEhUXzIwNDBfUFJPVEVDVAkzCisjZGVmaW5lIEhUX1JUU0NUU182TQk3CisvL2ZvbGxvd2luZyBpcyBvdXIgb3duIGRlZmluaXRpb24gaW4gb3JkZXIgdG8gdHVybiBvbiBvdXIgQVNJQyBwcm90ZWN0aW9uIHJlZ2lzdGVyIGluIElORlJBU1RSVUNUVVJFLgorI2RlZmluZSBIVF9BVEhFUk9TCTgJLy8gcnQyODYwYyBoYXMgcHJvYmxlbSB3aXRoIGF0aGVyb3MgY2hpcC4gd2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgLgorI2RlZmluZSBIVF9GT1JDRVJUU0NUUwk5CS8vIEZvcmNlIHR1cm4gb24gUlRTL0NUUyBmaXJzdC4gdGhlbiBnbyB0byBldmFsdWF0ZSBpZiB0aGlzIGZvcmNlIFJUUyBpcyBuZWNlc3NhcnkuCisKKy8vCisvLyBSWCBQYWNrZXQgRmlsdGVyIGNvbnRyb2wgZmxhZ3MuIEFwcGx5IG9uIHBBZC0+UGFja2V0RmlsdGVyCisvLworI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9ESVJFQ1QgICAgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX01VTFRJQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0JST0FEQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0FMTF9NVUxUSUNBU1QgICAgIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAorCisvLworLy8gRXJyb3IgY29kZSBzZWN0aW9uCisvLworLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfTk9UX0ZPVU5ECisjZGVmaW5lIEVSUkxPR19SRUFEX1BDSV9TTE9UX0ZBSUxFRCAgICAgMHgwMDAwMDEwMUwKKyNkZWZpbmUgRVJSTE9HX1dSSVRFX1BDSV9TTE9UX0ZBSUxFRCAgICAweDAwMDAwMTAyTAorI2RlZmluZSBFUlJMT0dfVkVORE9SX0RFVklDRV9OT01BVENIICAgIDB4MDAwMDAxMDNMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX0RJU0FCTEVECisjZGVmaW5lIEVSUkxPR19CVVNfTUFTVEVSX0RJU0FCTEVEICAgICAgMHgwMDAwMDIwMUwKKworLy8gTkRJU19FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgRVJSTE9HX0lOVkFMSURfU1BFRURfRFVQTEVYICAgICAweDAwMDAwMzAxTAorI2RlZmluZSBFUlJMT0dfU0VUX1NFQ09OREFSWV9GQUlMRUQgICAgIDB4MDAwMDAzMDJMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgMHgwMDAwMDQwMUwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZICAgICAweDAwMDAwNDAyTAorI2RlZmluZSBFUlJMT0dfT1VUX09GX01BUF9SRUdJU1RFUlMgICAgIDB4MDAwMDA0MDNMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfQlVGRkVSX1BPT0wgICAgICAgMHgwMDAwMDQwNEwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX0JVRkZFUiAgICAgICAweDAwMDAwNDA1TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX1BBQ0tFVF9QT09MICAgICAgIDB4MDAwMDA0MDZMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19QQUNLRVQgICAgICAgMHgwMDAwMDQwN0wKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9MT09LQVNJREVfTUVNT1JZICAweDAwMDAwNDA4TAorCisvLyBORElTX0VSUk9SX0NPREVfSEFSRFdBUkVfRkFJTFVSRQorI2RlZmluZSBFUlJMT0dfU0VMRlRFU1RfRkFJTEVEICAgICAgICAgIDB4MDAwMDA1MDFMCisjZGVmaW5lIEVSUkxPR19JTklUSUFMSVpFX0FEQVBURVIgICAgICAgMHgwMDAwMDUwMkwKKyNkZWZpbmUgRVJSTE9HX1JFTU9WRV9NSU5JUE9SVCAgICAgICAgICAweDAwMDAwNTAzTAorCisvLyBORElTX0VSUk9SX0NPREVfUkVTT1VSQ0VfQ09ORkxJQ1QKKyNkZWZpbmUgRVJSTE9HX01BUF9JT19TUEFDRSAgICAgICAgICAgICAweDAwMDAwNjAxTAorI2RlZmluZSBFUlJMT0dfUVVFUllfQURBUFRFUl9SRVNPVVJDRVMgIDB4MDAwMDA2MDJMCisjZGVmaW5lIEVSUkxPR19OT19JT19SRVNPVVJDRSAgICAgICAgICAgMHgwMDAwMDYwM0wKKyNkZWZpbmUgRVJSTE9HX05PX0lOVEVSUlVQVF9SRVNPVVJDRSAgICAweDAwMDAwNjA0TAorI2RlZmluZSBFUlJMT0dfTk9fTUVNT1JZX1JFU09VUkNFICAgICAgIDB4MDAwMDA2MDVMCisKKworLy8gV0RTIGRlZmluaXRpb24KKyNkZWZpbmUJTUFYX1dEU19FTlRSWSAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCisKKyNkZWZpbmUJV0RTX0RJU0FCTEVfTU9ERSAgICAgICAgICAgIDAKKyNkZWZpbmUJV0RTX1JFU1RSSUNUX01PREUgICAgICAgICAgIDEKKyNkZWZpbmUJV0RTX0JSSURHRV9NT0RFICAgICAgICAgICAgIDIKKyNkZWZpbmUJV0RTX1JFUEVBVEVSX01PREUgICAgICAgICAgIDMKKyNkZWZpbmUJV0RTX0xBWllfTU9ERSAgICAgICAgICAgICAgIDQKKworCisjZGVmaW5lIE1BWF9NRVNIX05VTQkJCQkwCisKKyNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkwCisjaWZkZWYgQVBDTElfU1VQUE9SVAorI3VuZGVmCU1BWF9BUENMSV9OVU0KKyNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkxCisjZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLworCisjZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCTEKKworLyogc2FuaXR5IGNoZWNrIGZvciBhcGlkeCAqLworI2RlZmluZSBNQlNTX01SX0FQSURYX1NBTklUWV9DSEVDSyhhcGlkeCkgXAorICAgIHsgaWYgKGFwaWR4ID4gTUFYX01CU1NJRF9OVU0pIHsgXAorICAgICAgICAgIHByaW50aygiJXM+IEVycm9yISBhcGlkeCA9ICVkID4gTUFYX01CU1NJRF9OVU0hXG4iLCBfX0ZVTkNUSU9OX18sIGFwaWR4KTsgXAorCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9CisKKyNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCisKKyNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKKworCisjZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKKy8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAorLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KKy8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KKy8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KKyNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKKyNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIzOAorI2Vsc2UKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKKyNlbmRpZgorCisvLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgorI2RlZmluZSBERlNfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDEpCisjZGVmaW5lIENTX0NUU19XQ0lEIAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorI2RlZmluZSBMQVNUX1NQRUNJRklDX1dDSUQJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorCisvLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4KKy8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LgorI2RlZmluZSBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECShMQVNUX1NQRUNJRklDX1dDSUQgLSBNQVhfTUJTU0lEX05VTSAtIDEpCisKKy8vIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkKKy8vIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LgorI2RlZmluZSBHRVRfR3JvdXBLZXlfV0NJRChfX3djaWQsIF9fYnNzaWR4KSBcCisJewkJCQkJCQkJCQlcCisJCV9fd2NpZCA9IExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkgKyBfX2Jzc2lkeDsJXAorCX0KKworI2RlZmluZSBJc0dyb3VwS2V5V0NJRChfX3djaWQpICgoKF9fd2NpZCkgPCBMQVNUX1NQRUNJRklDX1dDSUQpICYmICgoX193Y2lkKSA+PSAoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSkpKQorCisKKy8vIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRAorI2RlZmluZSBCU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQlNTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJTUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCU1M2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQlNTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExlbmd0aCBkZWZpbml0aW9ucworI2RlZmluZSBQRUVSX0tFWV9OTyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRJTUVTVEFNUF9MRU4gICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUyAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKKyNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KKyNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBBU0lDIFdDSUQgVGFibGUgZGVmaW5pdGlvbi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEJTU0lEX1dDSUQJCTEJLy8gaW4gaW5mcmEgbW9kZSwgYWx3YXlzIHB1dCBic3NpZCB3aXRoIHRoaXMgV0NJRAorI2RlZmluZSBNQ0FTVF9XQ0lECTB4MAorI2RlZmluZSBCU1MwTWNhc3RfV0NJRAkweDAKKyNkZWZpbmUgQlNTMU1jYXN0X1dDSUQJMHhmOAorI2RlZmluZSBCU1MyTWNhc3RfV0NJRAkweGY5CisjZGVmaW5lIEJTUzNNY2FzdF9XQ0lECTB4ZmEKKyNkZWZpbmUgQlNTNE1jYXN0X1dDSUQJMHhmYgorI2RlZmluZSBCU1M1TWNhc3RfV0NJRAkweGZjCisjZGVmaW5lIEJTUzZNY2FzdF9XQ0lECTB4ZmQKKyNkZWZpbmUgQlNTN01jYXN0X1dDSUQJMHhmZQorI2RlZmluZSBSRVNFUlZFRF9XQ0lECQkweGZmCisKKyNkZWZpbmUgTUFYX05VTV9PRl9BQ0xfTElTVAkJCQlNQVhfTlVNQkVSX09GX0FDTAorCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUFDX1RBQkxFICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9NQUMgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKworI2lmIE1BWF9MRU5fT0ZfTUFDX1RBQkxFPk1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQKKyNlcnJvciBNQVhfTEVOX09GX01BQ19UQUJMRSBjYW4gbm90IGJlIGxhcmdlciB0aGFuIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQhISEhCisjZW5kaWYKKworI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lECSAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX05VTV9PRl9XRFNfTElOSwkgICAgICAgICAgICAoTUFYX05VTV9PRl9XRFNfTElOS19QRVJCU1NJRCpNQVhfTUJTU0lEX05VTSkKKyNkZWZpbmUgTUFYX05VTV9PRl9FVkVOVCAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX0VWRU5UCisjZGVmaW5lIFdEU19MSU5LX1NUQVJUX1dDSUQJCQkJKE1BWF9MRU5fT0ZfTUFDX1RBQkxFLTEpCisKKyNkZWZpbmUgTlVNX09GX1RJRAkJCTgKKyNkZWZpbmUgTUFYX0FJRF9CQSAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikJIC8vQmxvY2sgQUNLIHJlY2lwaWVudAorI2RlZmluZSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAvLyBCbG9jayBBQ0sgb3JpZ2luYXRvcgorI2RlZmluZSBNQVhfTEVOX09GX0JTU19UQUJMRSAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfUkVPUkRFUklOR19NUERVX05VTQkJCSA1MTIKKworLy8ga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgU0hBUkVfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9MRU5fT0ZfU0hBUkVfS0VZICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAorI2RlZmluZSBNQVhfTEVOX09GX1BFRVJfS0VZICAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKKyNkZWZpbmUgUEFJUldJU0VfS0VZX05VTSAgICAgICAgICAgICAgICA2NCAgICAvLyBpbiBNQUMgQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKyNkZWZpbmUgR1JPVVBfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBNS19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZQlQTUtJRF9OTyAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8vIE51bWJlciBvZiBQTUtJRCBzYXZlZCBzdXBwb3J0ZWQKKyNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX0JVRkZFUiAgICAgICAgICAyMDQ4CisKKy8vIHBvd2VyIHN0YXR1cyByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIFBXUl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQV1JfU0FWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUFdSX01NUFMgICAgICAgICAgICAgICAgICAgICAgICAyCQkJLy9NSU1PIHBvd2VyIHNhdmUKKy8vI2RlZmluZSBQV1JfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAyCisKKy8vIEF1dGggYW5kIEFzc29jIG1vZGUgcmVsYXRlZCBkZWZpbml0aW9ucworI2RlZmluZSBBVVRIX01PREVfT1BFTiAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVVUSF9NT0RFX0tFWSAgICAgICAgICAgICAgICAgICAweDAxCisvLyNkZWZpbmUgQVVUSF9NT0RFX0FVVE9fU1dJVENIICAgICAgICAgMHgwMworLy8jZGVmaW5lIEFVVEhfTU9ERV9ERUFVVEggICAgICAgICAgICAgIDB4MDQKKy8vI2RlZmluZSBBVVRIX01PREVfVVBMQVlFUiAgICAgICAgICAgICAweDA1IC8vIHJlc2VydmVkIGZvciA4MDIuMTFpIHVzZQorCisvLyBCU1MgVHlwZSBkZWZpbml0aW9ucworI2RlZmluZSBCU1NfQURIT0MgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vID0gTmRpczgwMl8xMUlCU1MKKyNkZWZpbmUgQlNTX0lORlJBICAgICAgICAgICAgICAgICAgICAgICAxICAvLyA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZQorI2RlZmluZSBCU1NfQU5ZICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8vID0gTmRpczgwMl8xMUF1dG9Vbmtub3duCisjZGVmaW5lIEJTU19NT05JVE9SCQkJICAgICAgICAgICAgMyAgLy8gPSBOZGlzODAyXzExTW9uaXRvcgorCisKKy8vIFJlYXNvbiBjb2RlIGRlZmluaXRpb25zCisjZGVmaW5lIFJFQVNPTl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSRUFTT05fVU5TUEVDSUZZICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkVBU09OX05PX0xPTkdFUl9WQUxJRCAgICAgICAgICAyCisjZGVmaW5lIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkcgICAgICAgMworI2RlZmluZSBSRUFTT05fRElTQVNTT0NfSU5BQ1RJVkUgICAgICAgIDQKKyNkZWZpbmUgUkVBU09OX0RJU0FTU1BDX0FQX1VOQUJMRSAgICAgICA1CisjZGVmaW5lIFJFQVNPTl9DTFMyRVJSICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSRUFTT05fQ0xTM0VSUiAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HICAgICA4CisjZGVmaW5lIFJFQVNPTl9TVEFfUkVRX0FTU09DX05PVF9BVVRIICAgOQorI2RlZmluZSBSRUFTT05fSU5WQUxJRF9JRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFJFQVNPTl9NSUNfRkFJTFVSRSAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUkVBU09OXzRfV0FZX1RJTUVPVVQgICAgICAgICAgICAxNQorI2RlZmluZSBSRUFTT05fR1JPVVBfS0VZX0hTX1RJTUVPVVQgICAgIDE2CisjZGVmaW5lIFJFQVNPTl9JRV9ESUZGRVJFTlQgICAgICAgICAgICAgMTcKKyNkZWZpbmUgUkVBU09OX01DSVBIRVJfTk9UX1ZBTElEICAgICAgICAxOAorI2RlZmluZSBSRUFTT05fVUNJUEhFUl9OT1RfVkFMSUQgICAgICAgIDE5CisjZGVmaW5lIFJFQVNPTl9BS01QX05PVF9WQUxJRCAgICAgICAgICAgMjAKKyNkZWZpbmUgUkVBU09OX1VOU1VQUE9SVF9SU05FX1ZFUiAgICAgICAyMQorI2RlZmluZSBSRUFTT05fSU5WQUxJRF9SU05FX0NBUCAgICAgICAgIDIyCisjZGVmaW5lIFJFQVNPTl84MDIxWF9BVVRIX0ZBSUwgICAgICAgICAgMjMKKyNkZWZpbmUgUkVBU09OX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCAgICAyNAorI2RlZmluZSBSRUFTT05fREVDTElORUQgICAgICAgICAgICAgICAgIDM3CisKKyNkZWZpbmUgUkVBU09OX1FPU19VTlNQRUNJRlkgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFJFQVNPTl9RT1NfTEFDS19CQU5EV0lEVEggICAgICAgICAzMworI2RlZmluZSBSRUFTT05fUE9PUl9DSEFOTkVMX0NPTkRJVElPTiAgICAgMzQKKyNkZWZpbmUgUkVBU09OX1FPU19PVVRTSURFX1RYT1BfTElNSVRJT04gIDM1CisjZGVmaW5lIFJFQVNPTl9RT1NfUVNUQV9MRUFWSU5HX1FCU1MgICAgICAzNgorI2RlZmluZSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTSAgICAgMzcKKyNkZWZpbmUgUkVBU09OX1FPU19NRUNIX1NFVFVQX1JFUVVJUkVEICAgIDM4CisjZGVmaW5lIFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUICAgICAgICAzOQorI2RlZmluZSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVCAgICAgNDUKKworLy8gU3RhdHVzIGNvZGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgTUxNRV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1MTUVfVU5TUEVDSUZZX0ZBSUwgICAgICAgICAgICAgMQorI2RlZmluZSBNTE1FX0NBTk5PVF9TVVBQT1JUX0NBUCAgICAgICAgIDEwCisjZGVmaW5lIE1MTUVfUkVBU1NPQ19ERU5ZX0FTU09DX0VYSVNUICAgMTEKKyNkZWZpbmUgTUxNRV9BU1NPQ19ERU5ZX09VVF9TQ09QRSAgICAgICAxMgorI2RlZmluZSBNTE1FX0FMR19OT1RfU1VQUE9SVCAgICAgICAgICAgIDEzCisjZGVmaW5lIE1MTUVfU0VRX05SX09VVF9PRl9TRVFVRU5DRSAgICAgMTQKKyNkZWZpbmUgTUxNRV9SRUpfQ0hBTExFTkdFX0ZBSUxVUkUgICAgICAxNQorI2RlZmluZSBNTE1FX1JFSl9USU1FT1VUICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfVU5BQkxFX0hBTkRMRV9TVEEgIDE3CisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX0RBVEFfUkFURSAgICAgICAgICAxOAorCisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0VYVF9SQVRFICAgICAgICAyMgorI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19FWFRfUkFURV9QQkNDICAgMjMKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fQ0NLX09GRE0gICAgICAgIDI0CisKKyNkZWZpbmUgTUxNRV9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1MTUVfUkVRVUVTVF9ERUNMSU5FRCAgICAgICAgICAgICAzNworI2RlZmluZSBNTE1FX1JFUVVFU1RfV0lUSF9JTlZBTElEX1BBUkFNICAgMzgKKyNkZWZpbmUgTUxNRV9ETFNfTk9UX0FMTE9XX0lOX1FCU1MgICAgICAgIDQ4CisjZGVmaW5lIE1MTUVfREVTVF9TVEFfTk9UX0lOX1FCU1MgICAgICAgICA0OQorI2RlZmluZSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEEgICAgICAgNTAKKworI2RlZmluZSBNTE1FX0lOVkFMSURfRk9STUFUICAgICAgICAgICAgIDB4NTEKKyNkZWZpbmUgTUxNRV9GQUlMX05PX1JFU09VUkNFICAgICAgICAgICAweDUyCisjZGVmaW5lIE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1QgICAgICAgMHg1MworI2RlZmluZSBNTE1FX01BQ19UQUJMRV9GQUlMICAgICAgICAgICAgIDB4NTQKKworLy8gSUUgY29kZQorI2RlZmluZSBJRV9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSUVfU1VQUF9SQVRFUyAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElFX0ZIX1BBUk0gICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJRV9EU19QQVJNICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSUVfQ0ZfUEFSTSAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElFX1RJTSAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJRV9JQlNTX1BBUk0gICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSUVfQ09VTlRSWSAgICAgICAgICAgICAgICAgICAgICA3ICAgICAvLyA4MDIuMTFkCisjZGVmaW5lIElFXzgwMl8xMURfUkVRVUVTVCAgICAgICAgICAgICAgMTAgICAgLy8gODAyLjExZAorI2RlZmluZSBJRV9RQlNTX0xPQUQgICAgICAgICAgICAgICAgICAgIDExICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfRURDQV9QQVJBTUVURVIgICAgICAgICAgICAgICAxMiAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1RTUEVDICAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UQ0xBUyAgICAgICAgICAgICAgICAgICAgICAgIDE0ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICAxNSAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX0NIQUxMRU5HRV9URVhUICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSUVfUE9XRVJfQ09OU1RSQUlOVCAgICAgICAgICAgICAzMiAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfUE9XRVJfQ0FQQUJJTElUWSAgICAgICAgICAgICAzMyAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfVFBDX1JFUVVFU1QgICAgICAgICAgICAgICAgICAzNCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfVFBDX1JFUE9SVCAgICAgICAgICAgICAgICAgICAzNSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfU1VQUF9DSEFOTkVMUyAgICAgICAgICAgICAgICAzNiAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UICAzNyAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVCAgICAgICAgICAzOCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVQT1JUICAgICAgICAgICAzOSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfUVVJRVQgICAgICAgICAgICAgICAgICAgICAgICA0MCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfSUJTU19ERlMgICAgICAgICAgICAgICAgICAgICA0MSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfRVJQICAgICAgICAgICAgICAgICAgICAgICAgICA0MiAgICAvLyA4MDIuMTFnCisjZGVmaW5lIElFX1RTX0RFTEFZICAgICAgICAgICAgICAgICAgICAgNDMgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UQ0xBU19QUk9DRVNTSU5HICAgICAgICAgICAgIDQ0ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfUU9TX0NBUEFCSUxJVFkgICAgICAgICAgICAgICA0NiAgICAvLyA4MDIuMTFlIGQ2CisjZGVmaW5lIElFX0hUX0NBUCAgICAgICAgICAgICAgICAgICAgICAgNDUgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfQVBfQ0hBTk5FTF9SRVBPUlQJCQk1MSAgICAvLyA4MDIuMTFrIGQ2CisjZGVmaW5lIElFX0hUX0NBUDIgICAgICAgICAgICAgICAgICAgICAgICAgNTIgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfUlNOICAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyA4MDIuMTFpIGQzLjAKKyNkZWZpbmUgSUVfV1BBMiAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyBXUEEyCisjZGVmaW5lIElFX0VYVF9TVVBQX1JBVEVTICAgICAgICAgICAgICAgNTAgICAgLy8gODAyLjExZworI2RlZmluZSBJRV9TVVBQX1JFR19DTEFTUyAgICAgICAgICAgICAgIDU5ICAgIC8vIDgwMi4xMXkuIFN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMuCisjZGVmaW5lIElFX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQJNjAJLy8gODAyLjExbgorI2RlZmluZSBJRV9BRERfSFQgICAgICAgICAgICAgICAgICAgICAgICAgNjEgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorI2RlZmluZSBJRV9BRERfSFQyICAgICAgICAgICAgICAgICAgICAgICAgNTMgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorCisKKy8vIEZvciA4MDIuMTFuIEQzLjAzCisvLyNkZWZpbmUgSUVfTkVXX0VYVF9DSEFfT0ZGU0VUICAgICAgICAgICAgIDYyICAgIC8vIDgwMi4xMW4gZDEuIE5ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgZWxlbWV0CisjZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8vIDgwMi4xMW4gRDMuMDMJU2Vjb25kYXJ5IENoYW5uZWwgT2Zmc2V0IGVsZW1lbnQKKyNkZWZpbmUgSUVfV0FQSQkJCQkJCQk2OAkJLy8gV0FQSSBpbmZvcm1hdGlvbiBlbGVtZW50CisjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MiAgICAvLyA4MDIuMTFuIEQzLjAuMworI2RlZmluZSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCAgICAgNzMgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9PVkVSTEFQQlNTX1NDQU5fUEFSTSAgICAgICAgICAgNzQgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9FWFRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAxMjcgICAvLyA4MDIuMTFuIEQzLjAzCisKKworI2RlZmluZSBJRV9XUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMSAgIC8vIFdQQQorI2RlZmluZSBJRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgIDIyMSAgIC8vIFdpZmkgV01NIChXTUUpCisKKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUICAgICAgICAgICAgICA1MSAgIC8vCisjZGVmaW5lIE9VSV9CUk9BRENPTV9IVEFERCAgICAgICAgICAgICAgNTIgICAvLworI2RlZmluZSBPVUlfUFJFTl9IVF9DQVAgICAgICAgICAgICAgIDUxICAgLy8KKyNkZWZpbmUgT1VJX1BSRU5fQUREX0hUICAgICAgICAgICAgICA1MiAgIC8vCisKKy8vIENDWCBpbmZvcm1hdGlvbgorI2RlZmluZSBJRV9BSVJPTkVUX0NLSVAgICAgICAgICAgICAgICAgIDEzMyAgIC8vIENDWDEuMCBJRCA4NUggZm9yIENLSVAKKyNkZWZpbmUgSUVfQVBfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAxNTAgICAvLyBDQ1ggMi4wIGZvciBBUCB0cmFuc21pdCBwb3dlcgorI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZICAgICAgIDIyMSAgIC8vIENDWCAyLjAKKyNkZWZpbmUgSUVfQ0NYX1YyICAgICAgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgSUVfQUlST05FVF9JUEFERFJFU1MgICAgICAgICAgICAxNDkgICAvLyBDQ1ggSUQgOTVIIGZvciBJUCBBZGRyZXNzCisjZGVmaW5lIElFX0FJUk9ORVRfQ0NLTVJFQVNTT0MgICAgICAgICAgMTU2ICAgLy8gQ0NYIElEIDlDSCBmb3IgQ0NLTSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgZWxlbWVudAorI2RlZmluZSBDS0lQX05FR09USUFUSU9OX0xFTkdUSCAgICAgICAgIDMwCisjZGVmaW5lIEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSCAgICAgICAgMTAKKyNkZWZpbmUgQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEggICAgICAyNAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTUxNRSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFNUQSBNTE1FIHN0YXRlIG1haGNpbmVzCisjZGVmaW5lIEFTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgMQorI2RlZmluZSBBVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAgICAzCisjZGVmaW5lIFNZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNAorI2RlZmluZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgIDUKKyNkZWZpbmUgV1BBX1BTS19TVEFURV9NQUNISU5FICAgICAgICAgICA2CisjZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNworI2RlZmluZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDgKKyNkZWZpbmUgQUNUSU9OX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDkKKworLy8gQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcworI2RlZmluZSBBUF9BU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgIDExCisjZGVmaW5lIEFQX0FVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTIKKyNkZWZpbmUgQVBfQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAxMworI2RlZmluZSBBUF9TWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE0CisjZGVmaW5lIEFQX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTUKKyNkZWZpbmUgQVBfV1BBX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAxNgorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisjZGVmaW5lIERMU19TVEFURV9NQUNISU5FICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLy8KKy8vIFNUQSdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQ05UTF9JRExFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENOVExfV0FJVF9ESVNBU1NPQyAgICAgICAgICAgICAgMQorI2RlZmluZSBDTlRMX1dBSVRfSk9JTiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ05UTF9XQUlUX1JFQVNTT0MgICAgICAgICAgICAgICAzCisjZGVmaW5lIENOVExfV0FJVF9TVEFSVCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDTlRMX1dBSVRfQVVUSCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ05UTF9XQUlUX0FTU09DICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENOVExfV0FJVF9BVVRIMiAgICAgICAgICAgICAgICAgNworI2RlZmluZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTiAgICAgICAgIDgKKyNkZWZpbmUgQ05UTF9XQUlUX09JRF9ESVNBU1NPQyAgICAgICAgICA5CisjaWZkZWYgUlQyODcwCisjZGVmaW5lIENOVExfV0FJVF9TQ0FOX0ZPUl9DT05ORUNUICAgICAgMTAKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2RlZmluZSBNVDJfQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAgIDM0CisjZGVmaW5lIE1UMl9BVVRIX0NPTkYgICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgTVQyX0RFQVVUSF9DT05GICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBNVDJfRElTQVNTT0NfQ09ORiAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIE1UMl9SRUFTU09DX0NPTkYgICAgICAgICAgICAgICAgMzgKKyNkZWZpbmUgTVQyX1BXUl9NR01UX0NPTkYgICAgICAgICAgICAgICAzOQorI2RlZmluZSBNVDJfSk9JTl9DT05GICAgICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIE1UMl9TQ0FOX0NPTkYgICAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgTVQyX1NUQVJUX0NPTkYgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBNVDJfR0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQzCisjZGVmaW5lIE1UMl9TRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDQKKyNkZWZpbmUgTVQyX1JFU0VUX0NPTkYgICAgICAgICAgICAgICAgICA0NQorI2RlZmluZSBNVDJfTUxNRV9ST0FNSU5HX1JFUSAgICAgICAgICAgIDUyCisKKyNkZWZpbmUgQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAxCisKKy8vCisvLyBTVEEncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSRUFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRElTQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIEFTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9BU1NPQ19SRVEgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfUkVBU1NPQ19SRVEgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX0FTU09DX1JTUCAgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfUEVFUl9SRUFTU09DX1JFUSAgICAgICAgICAgIDYKKyNkZWZpbmUgTVQyX1BFRVJfUkVBU1NPQ19SU1AgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9ESVNBU1NPQ19USU1FT1VUICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTVQyX1JFQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAxMAorI2RlZmluZSBNQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgICAgIDExCisKKyNkZWZpbmUgQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FTU09DX1NUQVRFICogTUFYX0FTU09DX01TRykKKworLy8KKy8vIEFDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQUNUX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfQUNUX1NUQVRFICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQUNUX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAorCisvL1Rob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4KKy8vQ2F0ZWdvcnkKKyNkZWZpbmUgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfUEVFUl9RT1NfQ0FURSAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ETFNfQ0FURSAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9QRUVSX0JBX0NBVEUgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfUEVFUl9QVUJMSUNfQ0FURSAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX1JNX0NBVEUgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfUEVFUl9IVF9DQVRFICAgICAgICAgICAgIDcJLy8JNy40LjcKKyNkZWZpbmUgTUFYX1BFRVJfQ0FURV9NU0cgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBNVDJfTUxNRV9BRERfQkFfQ0FURSAgICAgICAgICAgICA4CisjZGVmaW5lIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFICAgICAgICAgICAgIDkKKyNkZWZpbmUgTVQyX01MTUVfUkVDX0RFTEJBX0NBVEUgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTVQyX01MTUVfUU9TX0NBVEUgICAgICAgICAgICAgIDExCisjZGVmaW5lIE1UMl9NTE1FX0RMU19DQVRFICAgICAgICAgICAgIDEyCisjZGVmaW5lIE1UMl9BQ1RfSU5WQUxJRCAgICAgICAgICAgICAxMworI2RlZmluZSBNQVhfQUNUX01TRyAgICAgICAgICAgICAgICAgICAxNAorCisvL0NhdGVnb3J5IGZpZWxkCisjZGVmaW5lIENBVEVHT1JZX1NQRUNUUlVNCQkwCisjZGVmaW5lIENBVEVHT1JZX1FPUwkJCTEKKyNkZWZpbmUgQ0FURUdPUllfRExTCQkJMgorI2RlZmluZSBDQVRFR09SWV9CQQkJCTMKKyNkZWZpbmUgQ0FURUdPUllfUFVCTElDCQk0CisjZGVmaW5lIENBVEVHT1JZX1JNCQkJNQorI2RlZmluZSBDQVRFR09SWV9IVAkJCTcKKworCisvLyBETFMgQWN0aW9uIGZyYW1lIGRlZmluaXRpb24KKyNkZWZpbmUgQUNUSU9OX0RMU19SRVFVRVNUCQkJMAorI2RlZmluZSBBQ1RJT05fRExTX1JFU1BPTlNFCQkJMQorI2RlZmluZSBBQ1RJT05fRExTX1RFQVJET1dOCQkJMgorCisvL1NwZWN0cnVtICBBY3Rpb24gZmllbGQgdmFsdWUgODAyLjExaCA3LjQuMQorI2RlZmluZSBTUEVDX01SUQkwCS8vIFJlcXVlc3QKKyNkZWZpbmUgU1BFQ19NUlAJMQkvL1JlcG9ydAorI2RlZmluZSBTUEVDX1RQQ1JRCTIKKyNkZWZpbmUgU1BFQ19UUENSUAkzCisjZGVmaW5lIFNQRUNfQ0hBTk5FTF9TV0lUQ0gJNAorCisKKy8vQkEgIEFjdGlvbiBmaWVsZCB2YWx1ZQorI2RlZmluZSBBRERCQV9SRVEJMAorI2RlZmluZSBBRERCQV9SRVNQCTEKKyNkZWZpbmUgREVMQkEgICAyCisKKy8vUHVibGljJ3MgIEFjdGlvbiBmaWVsZCB2YWx1ZSBpbiBQdWJsaWMgQ2F0ZWdvcnkuICBTb21lIGluIDgwMi4xMXkgYW5kIHNvbWUgaW4gMTFuCisjZGVmaW5lIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUCQkJCTAJLy8gMTFuCisjZGVmaW5lIEFDVElPTl9EU0VfRU5BQkxFTUVOVAkJCQkJMQkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX0RFRU5BQkxFTUVOVAkJCQkyCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfUkVHX0xPQ0FUSU9OX0FOTk9VTkNFCTMJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0VYVF9DSF9TV0lUQ0hfQU5OT1VOQ0UJCTQJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVEJCQk1CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVQT1JUCQk2CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9NRUFTVVJFTUVOVF9QSUxPVF9BQ1RJT04JCTcgIAkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX1BPV0VSX0NPTlNUUkFJTlQJCQk4CS8vIDExeSBEOS4wCisKKworLy9IVCAgQWN0aW9uIGZpZWxkIHZhbHVlCisjZGVmaW5lIE5PVElGWV9CV19BQ1RJT04JCQkJMAorI2RlZmluZSBTTVBTX0FDVElPTgkJCQkJCTEKKyNkZWZpbmUgUFNNUF9BQ1RJT04gICAJCQkJCTIKKyNkZWZpbmUgU0VUUENPX0FDVElPTgkJCQkJMworI2RlZmluZSBNSU1PX0NIQV9NRUFTVVJFX0FDVElPTgkJCTQKKyNkZWZpbmUgTUlNT19OX0JFQUNPTkZPUk0JCQkJNQorI2RlZmluZSBNSU1PX0JFQUNPTkZPUk0JCQkJCTYKKyNkZWZpbmUgQU5URU5OQV9TRUxFQ1QJCQkJCTcKKyNkZWZpbmUgSFRfSU5GT19FWENIQU5HRQkJCQk4CisKKyNkZWZpbmUgQUNUX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BQ1RfU1RBVEUgKiBNQVhfQUNUX01TRykKKy8vCisvLyBTVEEncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2dmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfQVVUSF9FVkVOICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfQVVUSF9TVEFURSAqIE1BWF9BVVRIX01TRykKKworLy8KKy8vIFNUQSdzIEFVVEhfUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVUSF9SU1BfV0FJVF9DSEFMICAgICAgICAgICAgICAxCisjZGVmaW5lIE1BWF9BVVRIX1JTUF9TVEFURSAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9SU1BfTVNHICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX1JTUF9GVU5DX1NJWkUgICAgICAgICAgICAgIChNQVhfQVVUSF9SU1BfU1RBVEUgKiBNQVhfQVVUSF9SU1BfTVNHKQorCisvLworLy8gU1RBJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBKT0lOX1dBSVRfQkVBQ09OICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0NBTl9MSVNURU4gICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFNZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9TQ0FOX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfSk9JTl9SRVEgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9NTE1FX1NUQVJUX1JFUSAgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUlNQICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX0FUSU0gICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfU0NBTl9USU1FT1VUICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTVQyX0JFQUNPTl9USU1FT1VUICAgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9BVElNX1RJTUVPVVQgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIFNZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgKE1BWF9TWU5DX1NUQVRFICogTUFYX1NZTkNfTVNHKQorCisvL01lc3NhZ2VzIGZvciB0aGUgRExTIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgRExTX0lETEUJCQkJCQkwCisjZGVmaW5lIE1BWF9ETFNfU1RBVEUJCQkJCTEKKworI2RlZmluZSBETFNfTUFDSElORV9CQVNFCQkJCTAKKyNkZWZpbmUgTVQyX01MTUVfRExTX1JFUQkJCSAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0RMU19SRVEJCQkgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ETFNfUlNQCQkJICAgIDIKKyNkZWZpbmUgTVQyX01MTUVfRExTX1RFQVJfRE9XTgkJICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfRExTX1RFQVJfRE9XTgkJICAgIDQKKyNkZWZpbmUgTUFYX0RMU19NU0cJCQkJICAgICAgICA1CisKKyNkZWZpbmUgRExTX0ZVTkNfU0laRQkJCQkJKE1BWF9ETFNfU1RBVEUgKiBNQVhfRExTX01TRykKKworLy8KKy8vIFNUQSdzIFdQQS1QU0sgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIFdQQV9QU0tfSURMRQkJCQkJMAorI2RlZmluZSBNQVhfV1BBX1BTS19TVEFURQkJCQkxCisKKyNkZWZpbmUgV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9FQVBQYWNrZXQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQT0xTdGFydCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX0VBUE9MTG9nb2ZmICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9FQVBPTEtleSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfRUFQT0xBU0ZBbGVydCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1dQQV9QU0tfTVNHICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUJV1BBX1BTS19GVU5DX1NJWkUJCQkJKE1BWF9XUEFfUFNLX1NUQVRFICogTUFYX1dQQV9QU0tfTVNHKQorCisvLworLy8gU1RBJ3MgQ0lTQ08tQUlST05FVCBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQUlST05FVF9JRExFCQkJCQkwCisjZGVmaW5lCUFJUk9ORVRfU0NBTk5JTkcJCQkJMQorI2RlZmluZSBNQVhfQUlST05FVF9TVEFURQkJCQkyCisKKyNkZWZpbmUgQUlST05FVF9NQUNISU5FX0JBU0UJCSAgICAwCisjZGVmaW5lIE1UMl9BSVJPTkVUX01TRwkJCQkgICAgMAorI2RlZmluZSBNVDJfQUlST05FVF9TQ0FOX1JFUQkJICAgIDEKKyNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9ET05FCQkgICAgMgorI2RlZmluZSBNQVhfQUlST05FVF9NU0cJCQkJICAgIDMKKworI2RlZmluZQlBSVJPTkVUX0ZVTkNfU0laRQkJCQkoTUFYX0FJUk9ORVRfU1RBVEUgKiBNQVhfQUlST05FVF9NU0cpCisKKy8vCisvLyBBUCdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAxCisKKy8vCisvLyBBUCdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgMworI2RlZmluZSBBUE1UMl9DTFMzRVJSICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBfTUFYX0FTU09DX1NUQVRFICogQVBfTUFYX0FTU09DX01TRykKKworLy8KKy8vIEFQJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0NMUzJFUlIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUF9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUF9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfQVVUSF9TVEFURSAqIEFQX01BWF9BVVRIX01TRykKKworLy8KKy8vIEFQJ3MgQVVUSC1SU1Agc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FVVEhfUlNQX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVBfQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAoQVBfTUFYX0FVVEhfUlNQX1NUQVRFICogQVBfTUFYX0FVVEhfUlNQX01TRykKKworLy8KKy8vIEFQJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX1NDQU5fTElTVEVOCQkJCQkxCisjZGVmaW5lIEFQX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFQX1NZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JFUSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9SRVEJCQkJMgorI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JTUAkJCTMKKyNkZWZpbmUgQVBNVDJfU0NBTl9USU1FT1VUCQkJCTQKKyNkZWZpbmUgQVBNVDJfTUxNRV9TQ0FOX0NOQ0wJCQk1CisjZGVmaW5lIEFQX01BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgNgorCisjZGVmaW5lIEFQX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQX01BWF9TWU5DX1NUQVRFICogQVBfTUFYX1NZTkNfTVNHKQorCisvLworLy8gQVAncyBXUEEgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX1dQQV9QVEsgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfV1BBX1BUS19TVEFURSAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9XUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgNAorI2RlZmluZSBBUF9NQVhfV1BBX01TRyAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUF9XUEFfRlVOQ19TSVpFICAgICAgICAgICAgICAgIChBUF9NQVhfV1BBX1BUS19TVEFURSAqIEFQX01BWF9XUEFfTVNHKQorCisjaWZkZWYgQVBDTElfU1VQUE9SVAorLy9BcENsaSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9BVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQQ0xJX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfTVQyX0FVVEhfVElNRU9VVCAgICAgICAgICAgICA0CisjZGVmaW5lIEFQQ0xJX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQQ0xJX0FVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQQ0xJX01BWF9BVVRIX1NUQVRFICogQVBDTElfTUFYX0FVVEhfTVNHKQorCisvL0FwQ2xpIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUENMSV9BU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX01UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUENMSV9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfQVNTT0NfU1RBVEUgKiBBUENMSV9NQVhfQVNTT0NfTVNHKQorCisvL0FwQ2xpIHN5bmMgc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9TWU5DX0lETEUgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgQVBDTElfSk9JTl9XQUlUX1BST0JFX1JTUCAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUENMSV9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9QUk9CRV9SRVEgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9QUk9CRV9SU1AgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUFJPQkVfVElNRU9VVCAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQQ0xJX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX1NZTkNfU1RBVEUgKiBBUENMSV9NQVhfU1lOQ19NU0cpCisKKy8vQXBDbGkgY3RybCBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVEVEICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBBUENMSV9DVFJMX1BST0JFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9DVFJMX0FVVEggICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfMiAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUENMSV9DVFJMX0FTU09DICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0MgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBUENMSV9DVFJMX0NPTk5FQ1RFRCAgICAgICAgICAgICAgNgorI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9TVEFURSAgICAgICAgICAgICAgNworCisjZGVmaW5lIEFQQ0xJX0NUUkxfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0NUUkxfUFJPQkVfUlNQICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SU1AgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVF9SRVEgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX0NUUkxfUEVFUl9ESVNDT05ORUNUX1JFUSAgICA0CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUlNQICAgICAgICAgICAgICA1CisjZGVmaW5lIEFQQ0xJX0NUUkxfREVBU1NPQ19SU1AgICAgICAgICAgICA2CisjZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVFfVElNRU9VVCAgICAgICA3CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SRVFfVElNRU9VVCAgICAgICA4CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUkVRX1RJTUVPVVQgICAgICA5CisjZGVmaW5lIEFQQ0xJX01BWF9DVFJMX01TRyAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIEFQQ0xJX0NUUkxfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0NUUkxfU1RBVEUgKiBBUENMSV9NQVhfQ1RSTF9NU0cpCisKKyNpZiAwCS8vIHJlbW92ZSB0aG9zZSB2YXJpYWJsZXMgYnkgQWxiZXJ0WQorLy8gQXBDbGkgV1BBIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfV1BBX1BTS19JRExFCQkJCTAKKyNkZWZpbmUgQVBDTElfTUFYX1dQQV9QU0tfU1RBVEUJCQkxCisKKy8vIEFwQ2xpIFdQQSBNU0cgVHlwZQorI2RlZmluZSBBUENMSV9XUEFfTUFDSElORV9CQVNFCQkJMAorI2RlZmluZSBBUENMSV9NVDJfRUFQUGFja2V0CQkJCTAKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MU3RhcnQJCQkxCisjZGVmaW5lIEFQQ0xJX01UMl9FQVBPTExvZ29mZgkJCTIKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MS2V5CQkJCTMKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MQVNGQWxlcnQJCQk0CisjZGVmaW5lIEFQQ0xJX01BWF9XUEFfUFNLX01TRwkJCTUKKworI2RlZmluZQlBUENMSV9XUEFfUFNLX0ZVTkNfU0laRQkJCShBUENMSV9NQVhfV1BBX1BTS19TVEFURSAqIEFQQ0xJX01BWF9XUEFfUFNLX01TRykKKyNlbmRpZiAvLyBlbmQgLSAwIC8vCisKKyNlbmRpZgkvLyBBUENMSV9TVVBQT1JUIC8vCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBoZWFkZXIgRkMuVHl0ZSwgd2hpY2ggaXMgYjMuLmIyIG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIEJUWVBFX01HTVQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJUWVBFX0NOVEwgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJUWVBFX0RBVEEgICAgICAgICAgICAgICAgICAyCisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgTUdNVCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUkVRICAgICAgICAgICAwCisjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUlNQICAgICAgICAgICAxCisjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SRVEgICAgICAgICAyCisjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SU1AgICAgICAgICAzCisjZGVmaW5lIFNVQlRZUEVfUFJPQkVfUkVRICAgICAgICAgICA0CisjZGVmaW5lIFNVQlRZUEVfUFJPQkVfUlNQICAgICAgICAgICA1CisjZGVmaW5lIFNVQlRZUEVfQkVBQ09OICAgICAgICAgICAgICA4CisjZGVmaW5lIFNVQlRZUEVfQVRJTSAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFNVQlRZUEVfRElTQVNTT0MgICAgICAgICAgICAxMAorI2RlZmluZSBTVUJUWVBFX0FVVEggICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgU1VCVFlQRV9ERUFVVEggICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNVQlRZUEVfQUNUSU9OICAgICAgICAgICAgICAxMworI2RlZmluZSBTVUJUWVBFX0FDVElPTl9OT19BQ0sgICAgICAgICAgICAgIDE0CisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgQ05UTCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfV1JBUFBFUiAgICAgICAJNworI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDS19SRVEgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDSyAgICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX1BTX1BPTEwgICAgICAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9SVFMgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNVQlRZUEVfQ1RTICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX0FDSyAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9DRkVORCAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNVQlRZUEVfQ0ZFTkRfQ0ZBQ0sgICAgICAgICAxNQorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIERBVEEgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX0RBVEEgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0sgICAgICAgICAgMQorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZQT0xMICAgICAgICAgMgorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0tfQ0ZQT0xMICAgMworI2RlZmluZSBTVUJUWVBFX05VTExfRlVOQyAgICAgICAgICAgNAorI2RlZmluZSBTVUJUWVBFX0NGQUNLICAgICAgICAgICAgICAgNQorI2RlZmluZSBTVUJUWVBFX0NGUE9MTCAgICAgICAgICAgICAgNgorI2RlZmluZSBTVUJUWVBFX0NGQUNLX0NGUE9MTCAgICAgICAgNworI2RlZmluZSBTVUJUWVBFX1FEQVRBICAgICAgICAgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGQUNLICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGUE9MTCAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRkFDS19DRlBPTEwgIDExCisjZGVmaW5lIFNVQlRZUEVfUU9TX05VTEwgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDSyAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZQT0xMICAgICAgICAgIDE0CisjZGVmaW5lIFNVQlRZUEVfUU9TX0NGQUNLX0NGUE9MTCAgICAxNQorCisvLyBBQ0sgcG9saWN5IG9mIFFPUyBDb250cm9sIGZpZWxkIGJpdCA2OjUKKyNkZWZpbmUgTk9STUFMX0FDSyAgICAgICAgICAgICAgICAgIDB4MDAgIC8vIGI2OjUgPSAwMAorI2RlZmluZSBOT19BQ0sgICAgICAgICAgICAgICAgICAgICAgMHgyMCAgLy8gYjY6NSA9IDAxCisjZGVmaW5lIE5PX0VYUExJQ0lUX0FDSyAgICAgICAgICAgICAweDQwICAvLyBiNjo1ID0gMTAKKyNkZWZpbmUgQkxPQ0tfQUNLICAgICAgICAgICAgICAgICAgIDB4NjAgIC8vIGI2OjUgPSAxMQorCisvLworLy8gcnRtcF9kYXRhLmMgdXNlIHRoZXNlIGRlZmluaXRpb24KKy8vCisjZGVmaW5lIExFTkdUSF84MDJfMTEgICAgICAgICAgICAgICAyNAorI2RlZmluZSBMRU5HVEhfODAyXzExX0FORF9IICAgICAgICAgMzAKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9DUkNfSCAgICAgICAgIDM0CisjZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDICAgICAgICAgICAyOAorI2RlZmluZSBMRU5HVEhfODAyXzExX1dJVEhfQUREUjQgICAgMzAKKyNkZWZpbmUgTEVOR1RIXzgwMl8zICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIExFTkdUSF84MDJfM19UWVBFICAgICAgICAgICAyCisjZGVmaW5lIExFTkdUSF84MDJfMV9IICAgICAgICAgICAgICA4CisjZGVmaW5lIExFTkdUSF9FQVBPTF9IICAgICAgICAgICAgICA0CisjZGVmaW5lIExFTkdUSF9XTU1RT1NfSAkJCQkyCisjZGVmaW5lIExFTkdUSF9DUkMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9TRVFfTlVNQkVSICAgICAgICAgICAgICAweDBmZmYKKyNkZWZpbmUgTEVOR1RIXzgwMl8zX05PX1RZUEUJCTEyCisjZGVmaW5lIExFTkdUSF84MDJfMVEJCQkJNCAvKiBWTEFOIHJlbGF0ZWQgKi8KKworLy8gU1RBX0NTUjQuZmllbGQuVHhSZXN1bHQKKyNkZWZpbmUgVFhfUkVTVUxUX1NVQ0NFU1MgICAgICAgICAgIDAKKyNkZWZpbmUgVFhfUkVTVUxUX1pFUk9fTEVOR1RIICAgICAgIDEKKyNkZWZpbmUgVFhfUkVTVUxUX1VOREVSX1JVTiAgICAgICAgIDIKKyNkZWZpbmUgVFhfUkVTVUxUX09IWV9FUlJPUiAgICAgICAgIDQKKyNkZWZpbmUgVFhfUkVTVUxUX1JFVFJZX0ZBSUwgICAgICAgIDYKKworLy8gQWxsIFBIWSByYXRlIHN1bW1hcnkgaW4gVFhECisvLyBQcmVhbWJsZSBNT0RFIGluIFR4RAorI2RlZmluZSBNT0RFX0NDSwkwCisjZGVmaW5lIE1PREVfT0ZETSAgIDEKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgTU9ERV9IVE1JWAkyCisjZGVmaW5lIE1PREVfSFRHUkVFTkZJRUxECTMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKy8vIE1DUyBmb3IgQ0NLLiAgQlcuU0dJLlNUQkMgYXJlIHJlc2VydmVkCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICAxCS8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgNAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMuIHNob3J0IGlzIGZvcmJpZGRlbiBpbiAxTWJwcworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICA1CS8vIHNob3J0IHByZWFtYmxlIENDSyAyTWJwcworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDcKKy8vIFRvIHNlbmQgZHVwbGljYXRlIGxlZ2FjeSBPRkRNLiBzZXQgQlc9QldfNDAuICBTR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKKyNkZWZpbmUgTUNTX1JBVEVfNiAgICAgICAgICAgICAgICAgICAgICAwICAgLy8gbGVnYWN5IE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfOSAgICAgICAgICAgICAgICAgICAgICAxICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDIgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgMyAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMjQgICAgICAgICAgICAgICAgICAgICA0ICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgNSAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfNDggICAgICAgICAgICAgICAgICAgICA2ICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgNyAvLyBPRkRNCisvLyBIVAorI2RlZmluZSBNQ1NfMAkJMAkvLyAxUworI2RlZmluZSBNQ1NfMQkJMQorI2RlZmluZSBNQ1NfMgkJMgorI2RlZmluZSBNQ1NfMwkJMworI2RlZmluZSBNQ1NfNAkJNAorI2RlZmluZSBNQ1NfNQkJNQorI2RlZmluZSBNQ1NfNgkJNgorI2RlZmluZSBNQ1NfNwkJNworI2RlZmluZSBNQ1NfOAkJOAkvLyAyUworI2RlZmluZSBNQ1NfOQkJOQorI2RlZmluZSBNQ1NfMTAJCTEwCisjZGVmaW5lIE1DU18xMQkJMTEKKyNkZWZpbmUgTUNTXzEyCQkxMgorI2RlZmluZSBNQ1NfMTMJCTEzCisjZGVmaW5lIE1DU18xNAkJMTQKKyNkZWZpbmUgTUNTXzE1CQkxNQorI2RlZmluZSBNQ1NfMTYJCTE2CS8vIDMqMworI2RlZmluZSBNQ1NfMTcJCTE3CisjZGVmaW5lIE1DU18xOAkJMTgKKyNkZWZpbmUgTUNTXzE5CQkxOQorI2RlZmluZSBNQ1NfMjAJCTIwCisjZGVmaW5lIE1DU18yMQkJMjEKKyNkZWZpbmUgTUNTXzIyCQkyMgorI2RlZmluZSBNQ1NfMjMJCTIzCisjZGVmaW5lIE1DU18zMgkJMzIKKyNkZWZpbmUgTUNTX0FVVE8JCTMzCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIE9JRF9IVFBIWU1PREUKKy8vIE1PREUKKyNkZWZpbmUgSFRNT0RFX01NCTAKKyNkZWZpbmUgSFRNT0RFX0dGCTEKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gRml4ZWQgVHggTU9ERSAtIEhULCBDQ0sgb3IgT0ZETQorI2RlZmluZSBGSVhFRF9UWE1PREVfSFQJCTAKKyNkZWZpbmUgRklYRURfVFhNT0RFX0NDSwkxCisjZGVmaW5lIEZJWEVEX1RYTU9ERV9PRkRNIAkyCisvLyBCVworI2RlZmluZSBCV18yMAkJQkFORF9XSURUSF8yMAorI2RlZmluZSBCV180MAkJQkFORF9XSURUSF80MAorI2RlZmluZSBCV19CT1RICQlCQU5EX1dJRFRIX0JPVEgKKyNkZWZpbmUgQldfMTAJCUJBTkRfV0lEVEhfMTAJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIFNIT1JUR0kKKyNkZWZpbmUgR0lfNDAwCQlHQVBfSU5URVJWQUxfNDAwCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisjZGVmaW5lIEdJX0JPVEgJCUdBUF9JTlRFUlZBTF9CT1RICisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZGVmaW5lIEdJXzgwMAkJR0FQX0lOVEVSVkFMXzgwMAorLy8gU1RCQworI2RlZmluZSBTVEJDX05PTkUJMAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2RlZmluZSBTVEJDX1VTRQkxCS8vIGxpbWl0ZWQgdXNlIGluIHJ0Mjg2MGIgcGh5CisjZGVmaW5lIFJYU1RCQ19PTkUJMQkvLyByeCBzdXBwb3J0IG9mIG9uZSBzcGF0aWFsIHN0cmVhbQorI2RlZmluZSBSWFNUQkNfVFdPCTIJLy8gcnggc3VwcG9ydCBvZiAxIGFuZCAyIHNwYXRpYWwgc3RyZWFtCisjZGVmaW5lIFJYU1RCQ19USFIJMwkvLyByeCBzdXBwb3J0IG9mIDF+MyBzcGF0aWFsIHN0cmVhbQorLy8gTUNTIEZFRURCQUNLCisjZGVmaW5lIE1DU0ZCS19OT05FCTAgIC8vIG5vdCBzdXBwb3J0IG1jcyBmZWVkYmFjayAvCisjZGVmaW5lIE1DU0ZCS19SU1YJMQkvLyByZXNlcnZlZAorI2RlZmluZSBNQ1NGQktfVU5TT0xJQ0lUCTIJLy8gb25seSBzdXBwb3J0IHVuc29saWN0IG1jcyBmZWVkYmFjaworI2RlZmluZSBNQ1NGQktfTVJRCTMJLy8gcmVzcG9uc2UgdG8gYm90aCBNUlEgYW5kIHVuc29saWN0IG1jcyBmZWVkYmFjaworCisvLyBNSU1PIHBvd2VyIHNhZmUKKyNkZWZpbmUJTU1QU19TVEFUSUMJMAorI2RlZmluZQlNTVBTX0RZTkFNSUMJCTEKKyNkZWZpbmUgICBNTVBTX1JTVgkJMgorI2RlZmluZSBNTVBTX0VOQUJMRQkJMworCisKKy8vIEEtTVNEVSBzaXplCisjZGVmaW5lCUFNU0RVXzAJMAorI2RlZmluZQlBTVNEVV8xCQkxCisKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gTUNTIHVzZSA3IGJpdHMKKyNkZWZpbmUgVFhSQVRFTUlNTwkJMHg4MAorI2RlZmluZSBUWFJBVEVNQ1MJCTB4N0YKKyNkZWZpbmUgVFhSQVRFT0ZETQkJMHg3RgorI2RlZmluZSBSQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSQVRFXzExICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBSQVRFXzYgICAgICAgICAgICAgICAgICAgICAgNCAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMTIgICAgICAgICAgICAgICAgICAgICA2ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgNyAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDggICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMzYgICAgICAgICAgICAgICAgICAgICA5ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgMTAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDExICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfRklSU1RfT0ZETV9SQVRFICAgICAgICBSQVRFXzYKKyNkZWZpbmUgUkFURV9MQVNUX09GRE1fUkFURSAgICAgICAgCVJBVEVfNTQKKyNkZWZpbmUgUkFURV82XzUgICAgICAgICAgICAgICAgICAgIDEyICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMyAgICAgICAgICAgICAgICAgICAgIDEzICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xOV81ICAgICAgICAgICAgICAgICAgIDE0ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8yNiAgICAgICAgICAgICAgICAgICAgIDE1ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8zOSAgICAgICAgICAgICAgICAgICAgIDE2ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV81MiAgICAgICAgICAgICAgICAgICAgIDE3ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV81OF81ICAgICAgICAgICAgICAgICAgIDE4ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV82NSAgICAgICAgICAgICAgICAgICAgIDE5ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV83OCAgICAgICAgICAgICAgICAgICAgIDIwICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMDQgICAgICAgICAgICAgICAgICAgIDIxICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMTcgICAgICAgICAgICAgICAgICAgIDIyICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMzAgICAgICAgICAgICAgICAgICAgIDIzICAvLyBIVCBtaXgKKy8vI2RlZmluZSBSQVRFX0FVVE9fU1dJVENIICAgICAgICAgICAgMjU1IC8vIGZvciBTdGFDZmcuRml4ZWRUeFJhdGUgb25seQorI2RlZmluZSBIVFJBVEVfMCAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBSQVRFX0ZJUlNUX01NX1JBVEUgICAgICAgIEhUUkFURV8wCisjZGVmaW5lIFJBVEVfRklSU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKKyNkZWZpbmUgUkFURV9MQVNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCisKKy8vIHBUeFdJLT50eG9wCisjZGVmaW5lIElGU19IVFRYT1AgICAgICAgICAgICAgICAgIDAJLy8gVGhlIHR4b3Agd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMuCisjZGVmaW5lIElGU19QSUZTICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElGU19TSUZTICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElGU19CQUNLT0ZGICAgICAgICAgICAgICAgICAzCisKKy8vIHBUeEQtPlJldHJ5TW9kZQorI2RlZmluZSBMT05HX1JFVFJZICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTSE9SVF9SRVRSWSAgICAgICAgICAgICAgICAgMAorCisvLyBDb3VudHJ5IFJlZ2lvbiBkZWZpbml0aW9uCisjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0JHX0JBTkQgICAgICAgICAgICAwCisjZGVmaW5lIFJFR0lPTl8wX0JHX0JBTkQgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDEtMTEKKyNkZWZpbmUgUkVHSU9OXzFfQkdfQkFORCAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMS0xMworI2RlZmluZSBSRUdJT05fMl9CR19CQU5EICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAxMC0xMQorI2RlZmluZSBSRUdJT05fM19CR19CQU5EICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAxMC0xMworI2RlZmluZSBSRUdJT05fNF9CR19CQU5EICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNAorI2RlZmluZSBSRUdJT05fNV9CR19CQU5EICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxLTE0CisjZGVmaW5lIFJFR0lPTl82X0JHX0JBTkQgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDMtOQorI2RlZmluZSBSRUdJT05fN19CR19CQU5EICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl8zMV9CR19CQU5EICAgICAgICAgICAgICAgICAzMSAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQgICAgICAgICAgICA3CisKKyNkZWZpbmUgUkVHSU9OX01JTklNVU1fQV9CQU5EICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVHSU9OXzBfQV9CQU5EICAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMV9BX0JBTkQgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCisjZGVmaW5lIFJFR0lPTl8yX0FfQkFORCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NAorI2RlZmluZSBSRUdJT05fM19BX0JBTkQgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxCisjZGVmaW5lIFJFR0lPTl80X0FfQkFORCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl81X0FfQkFORCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MQorI2RlZmluZSBSRUdJT05fNl9BX0JBTkQgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OAorI2RlZmluZSBSRUdJT05fN19BX0JBTkQgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fOF9BX0JBTkQgICAgICAgICAgICAgICAgICAgOCAgICAgICAvLyA1MiwgNTYsIDYwLCA2NAorI2RlZmluZSBSRUdJT05fOV9BX0JBTkQgICAgICAgICAgICAgICAgICAgOSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMTBfQV9CQU5EICAgICAgICAgICAgICAgICAgMTAJICAvLyAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzExX0FfQkFORCAgICAgICAgICAgICAgICAgIDExCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjEKKyNkZWZpbmUgUkVHSU9OX01BWElNVU1fQV9CQU5EICAgICAgICAgICAgIDExCisKKy8vIHBUeEQtPkNpcGhlckFsZworI2RlZmluZSBDSVBIRVJfTk9ORSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDSVBIRVJfV0VQNjQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDSVBIRVJfV0VQMTI4ICAgICAgICAgICAgICAgMgorI2RlZmluZSBDSVBIRVJfVEtJUCAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDSVBIRVJfQUVTICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDSVBIRVJfQ0tJUDY0ICAgICAgICAgICAgICAgNQorI2RlZmluZSBDSVBIRVJfQ0tJUDEyOCAgICAgICAgICAgICAgNgorI2RlZmluZSBDSVBIRVJfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKKyNkZWZpbmUgQ0lQSEVSX1NNUzQJCQkJCTgKKworLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+UmZJY1R5cGUKKyNkZWZpbmUgUkZJQ18yODIwICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMi40RyAyVDNSCisjZGVmaW5lIFJGSUNfMjg1MCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDIuNEcvNUcgMlQzUgorI2RlZmluZSBSRklDXzI3MjAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAyLjRHIDFUMlIKKyNkZWZpbmUgUkZJQ18yNzUwICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMi40Ry81RyAxVDJSCisjZGVmaW5lIFJGSUNfMzAyMCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDIuNEcgMVQxUgorI2RlZmluZSBSRklDXzIwMjAgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAyLjRHIEIvRworCisvLyBMRUQgU3RhdHVzLgorI2RlZmluZSBMRURfTElOS19ET1dOICAgICAgICAgICAgICAgMAorI2RlZmluZSBMRURfTElOS19VUCAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMRURfUkFESU9fT0ZGICAgICAgICAgICAgICAgMgorI2RlZmluZSBMRURfUkFESU9fT04gICAgICAgICAgICAgICAgMworI2RlZmluZSBMRURfSEFMVCAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBMRURfV1BTICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMRURfT05fU0lURV9TVVJWRVkgICAgICAgICAgNgorI2RlZmluZSBMRURfUE9XRVJfVVAgICAgICAgICAgICAgICAgNworCisvLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5MZWRDbnRsLkxlZE1vZGUgYW5kIEUyUFJPTQorI2RlZmluZSBMRURfTU9ERV9ERUZBVUxUICAgICAgICAgICAgMAorI2RlZmluZSBMRURfTU9ERV9UV09fTEVECQkJMQorI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSAkJOCAgLy8gRUVQUk9NIGRlZmluZSA9OAorCisvLyBSQzQgaW5pdCB2YWx1ZSwgdXNlZCBmcm8gV0VQICYgVEtJUAorI2RlZmluZSBQUFBJTklURkNTMzIgICAgICAgICAgICAgICAgMHhmZmZmZmZmZiAgIC8qIEluaXRpYWwgRkNTIHZhbHVlICovCisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZC4gODAyLjFYIGNvbnRyb2xsZWQgcG9ydCBkZWZpbml0aW9uCisjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEICAgICAxCisjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCAyCisKKyNkZWZpbmUgUEFJUldJU0VfS0VZICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1JPVVBfS0VZICAgICAgICAgICAgICAgICAgIDIKKworLy9kZWZpbml0aW9uIG9mIERSUworI2RlZmluZSBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSAkzMgorCisKKy8vIHByZS1hbGxvY2F0ZWQgZnJlZSBORElTIFBBQ0tFVC9CVUZGRVIgcG9sbCBmb3IgaW50ZXJuYWwgdXNhZ2UKKyNkZWZpbmUgTUFYX05VTV9PRl9GUkVFX05ESVNfUEFDS0VUIDEyOAorCisvL0Jsb2NrIEFDSworI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRiAgIDY0CisjZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGICAgNjQKKyNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUICAgMzAKKyNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUICAgMzAKKworLy8gZGVmaW5pdGlvbiBvZiBSZWNpcGllbnQgb3IgT3JpZ2luYXRvcgorI2RlZmluZSBJX1JFQ0lQSUVOVCAgICAgICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgSV9PUklHSU5BVE9SICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgREVGQVVMVF9CQlBfVFhfUE9XRVIgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SRl9UWF9QT1dFUiAgICAgICAgIDUKKworI2RlZmluZSBNQVhfSU5JX0JVRkZFUl9TSVpFCQkJNDA5NgorI2RlZmluZSBNQVhfUEFSQU1fQlVGRkVSX1NJWkUJCSgyMDQ4KSAvLyBlbm91Z2ggZm9yIEFDTCAoMTgqNjQpCisJCQkJCQkJCQkJCS8vMTggOiB0aGUgbGVuZ3RoIG9mIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0ICIwMTowMjowMzowNDowNTowNjsiKQorCQkJCQkJCQkJCQkvLzY0IDogTUFYX05VTV9PRl9BQ0xfTElTVAorLy8gZGVmaW5pdGlvbiBvZiBwQWQtPk9wTW9kZQorI2RlZmluZSBPUE1PREVfU1RBICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBPUE1PREVfQVAgICAgICAgICAgICAgICAgICAgMQorLy8jZGVmaW5lIE9QTU9ERV9MM19CUkcgICAgICAgICAgICAgICAyICAgICAgIC8vIGFzIEFQIGFuZCBTVEEgYXQgdGhlIHNhbWUgdGltZQorCisjaWZkZWYgUlRfQklHX0VORElBTgorI2RlZmluZSBESVJfUkVBRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBESVJfV1JJVEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWVBFX1RYRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUWVBFX1JYRCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWVBFX1RYSU5GTwkJCQkJMAorI2RlZmluZSBUWVBFX1JYSU5GTwkJCQkJMQorI2RlZmluZSBUWVBFX1RYV0kJCQkJCTAKKyNkZWZpbmUgVFlQRV9SWFdJCQkJCQkxCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBydG1wX2RlZi5oID09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdmFsdWUgZG9tYWluIGZvciBwQWQtPkV2ZW50VGFiLkxvZ1tdLkV2ZW50CisjZGVmaW5lIEVWRU5UX1JFU0VUX0FDQ0VTU19QT0lOVCAgICAwIC8vIExvZyA9ICJoaDptbTpzcyAgIFJlc3RhcnQgQWNjZXNzIFBvaW50IgorI2RlZmluZSBFVkVOVF9BU1NPQ0lBVEVEICAgICAgICAgICAgMSAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgYXNzb2NpYXRlZCIKKyNkZWZpbmUgRVZFTlRfRElTQVNTT0NJQVRFRCAgICAgICAgIDIgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGxlZnQgdGhpcyBCU1MiCisjZGVmaW5lIEVWRU5UX0FHRURfT1VUICAgICAgICAgICAgICAzIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSB3YXMgYWdlZC1vdXQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIEJTUyIKKyNkZWZpbmUgRVZFTlRfQ09VTlRFUl9NICAgICAgICAgICAgIDQKKyNkZWZpbmUgRVZFTlRfSU5WQUxJRF9QU0sgICAgICAgICAgIDUKKyNkZWZpbmUgRVZFTlRfTUFYX0VWRU5UX1RZUEUgICAgICAgIDYKKy8vID09PT0gZW5kIG9mIEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09CisKKy8vIGRlZmluaXRpb24gUlNTSSBOdW1iZXIKKyNkZWZpbmUgUlNTSV8wCQkJCQkwCisjZGVmaW5lIFJTU0lfMQkJCQkJMQorI2RlZmluZSBSU1NJXzIJCQkJCTIKKworLy8gZGVmaW5pdGlvbiBvZiByYWRhciBkZXRlY3Rpb24KKyNkZWZpbmUgUkRfTk9STUFMX01PREUJCQkJMAkvLyBOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisjZGVmaW5lIFJEX1NXSVRDSElOR19NT0RFCQkJMQkvLyBGb3VuZCByYWRhciBzaWduYWwsIGFuZCBkb2luZyBjaGFubmVsIHN3aXRjaAorI2RlZmluZSBSRF9TSUxFTkNFX01PREUJCQkJMgkvLyBBZnRlciBjaGFubmVsIHN3aXRjaCwgbmVlZCB0byBiZSBzaWxlbmNlIGEgd2hpbGUgdG8gZW5zdXJlIHJhZGFyIG5vdCBmb3VuZAorCisvL0RyaXZlciBkZWZpbmVkIGNpZCBmb3IgbWFwcGluZyBzdGF0dXMgYW5kIGNvbW1hbmQuCisjZGVmaW5lICBTTEVFUENJRAkweDExCisjZGVmaW5lICBXQUtFQ0lECTB4MjIKKyNkZWZpbmUgIFFVRVJZUE9XRVJDSUQJMHgzMworI2RlZmluZSAgT1dORVJNQ1UJMHgxCisjZGVmaW5lICBPV05FUkNQVQkweDAKKworLy8gTUJTU0lEIGRlZmluaXRpb24KKyNkZWZpbmUgRU5UUllfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4RkYKKworCisvKiBBZnRlciBMaW51eCAyLjYuOSwKKyAqIFZMQU4gbW9kdWxlIHVzZSBQcml2YXRlIChmcm9tIHVzZXIpIGludGVyZmFjZSBmbGFncyAobmV0ZGV2aWNlLT5wcml2X2ZsYWdzKS4KKyAqICNkZWZpbmUgSUZGXzgwMl8xUV9WTEFOIDB4MSAgICAgICAgIC0tICAgIDgwMi4xUSBWTEFOIGRldmljZS4gIGluIGlmLmgKKyAqIHJlZiB0byBpcF9zYWJvdGFnZV9vdXQoKSBbIG91dC0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTiBdIGluIGJyX25ldGZpbHRlci5jCisgKgorICogRm9yIHRoaXMgcmVhc29uLCB3ZSBNVVNUIHVzZSBFVkVOIHZhbHVlIGluIHByaXZfZmxhZ3MKKyAqLworI2RlZmluZSBJTlRfTUFJTiAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIElOVF9NQlNTSUQgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSU5UX1dEUyAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBJTlRfQVBDTEkgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElOVF9NRVNIICAgICAgICAgICAgICAgICAgIAkweDA1MDAKKworLy8gVXNlIGJpdG1hcCB0byBhbGxvdyBjb2V4aXN0IG9mIEFURV9UWEZSQU1FIGFuZCBBVEVfUlhGUkFNRShpLmUuLHRvIHN1cHBvcnQgTG9vcEJhY2sgbW9kZSkKKyNpZmRlZiBSQUxJTktfQVRFCisjZGVmaW5lCUFURV9TVEFSVCAgICAgICAgICAgICAgICAgICAweDAwICAgLy8gU3RhcnQgQVRFCisjZGVmaW5lCUFURV9TVE9QICAgICAgICAgICAgICAgICAgICAweDgwICAgLy8gU3RvcCBBVEUKKyNkZWZpbmUJQVRFX1RYQ09OVCAgICAgICAgICAgICAgICAgIDB4MDUgICAvLyBDb250aW51b3VzIFRyYW5zbWl0CisjZGVmaW5lCUFURV9UWENBUlIgICAgICAgICAgICAgICAgICAweDA5ICAgLy8gVHJhbnNtaXQgQ2FycmllcgorI2RlZmluZQlBVEVfVFhDQVJSU1VQUCAgICAgICAgICAgICAgMHgxMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIgU3VwcHJlc3Npb24KKyNkZWZpbmUJQVRFX1RYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDEgICAvLyBUcmFuc21pdCBGcmFtZXMKKyNkZWZpbmUJQVRFX1JYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDIgICAvLyBSZWNlaXZlIEZyYW1lcworI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIEFURV9UWFNUT1AgICAgICAgICAgICAgICAgICAweGUyICAgLy8gU3RvcCBUcmFuc21pdGlvbihpLmUuLCBUWENPTlQsIFRYQ0FSUiwgVFhDQVJSU1VQUCwgYW5kIFRYRlJBTUUpCisjZGVmaW5lIEFURV9SWFNUT1AJCQkJCTB4ZmQgICAvLyBTdG9wIHJlY2VpdmluZyBGcmFtZXMKKyNkZWZpbmUJQkJQMjJfVFhGUkFNRSAgICAgCQkJMHgwMCAgIC8vIFRyYW5zbWl0IEZyYW1lcworI2RlZmluZQlCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFAgICAgMHg4MCAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQgb3IgQ2FycmllciBTdXBwcmVzc2lvbgorI2RlZmluZQlCQlAyMl9UWENBUlIgICAgICAgICAgICAgICAgMHhjMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIKKyNkZWZpbmUJQkJQMjRfVFhDT05UICAgICAgICAgICAgICAgIDB4MDAgICAvLyBDb250aW51b3VzIFRyYW5zbWl0CisjZGVmaW5lCUJCUDI0X0NBUlJTVVBQICAgICAgICAgICAgICAweDAxICAgLy8gQ2FycmllciBTdXBwcmVzc2lvbgorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisvLyBXRVAgS2V5IFRZUEUKKyNkZWZpbmUgV0VQX0hFWEFERUNJTUFMX1RZUEUgICAgMAorI2RlZmluZSBXRVBfQVNDSUlfVFlQRSAgICAgICAgICAxCisKKworCisvLyBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgorLyogTWF4IG51bWJlciBvZiBjaGFyIGluIGN1c3RvbSBldmVudCwgcmVmZXIgdG8gd2lyZWxlc3NfdG9vbHMuMjgvd2lyZWxlc3MuMjAuaCAqLworI2RlZmluZSBJV19DVVNUT01fTUFYX0xFTgkJCQkgIAkJCTI1NQkvKiBJbiBieXRlcyAqLworCisvLyBGb3Igc3lzdGVtIGV2ZW50IC0gc3RhcnQKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJSVdfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUJSVdfREVBVVRIX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgCTB4MDIwMgorI2RlZmluZQlJV19BR0VPVVRfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAJMHgwMjAzCisjZGVmaW5lCUlXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lCUlXX1JFUExBWV9DT1VOVEVSX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lCUlXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgCQkJMHgwMjA2CisjZGVmaW5lCUlXX01JQ19ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIAkJCTB4MDIwNworI2RlZmluZSBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOAorI2RlZmluZSBJV19NSUNfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOQorI2RlZmluZSBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkJMHgwMjBBCisjZGVmaW5lCUlXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRwkJCTB4MDIwQgorI2RlZmluZSBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIwQworI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHCQkJCTB4MDIwRAorI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHCQkJCTB4MDIwRQorI2RlZmluZSBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcJCQkJCTB4MDIwRgorI2RlZmluZSBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRwkJCQkJMHgwMjEwCisjZGVmaW5lIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcJCQkJMHgwMjExCisjZGVmaW5lIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjEyCisvLyBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQKKworLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIHN0YXJ0CisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRwkJCQkJMHgwMzAwCisjZGVmaW5lIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDEKKyNkZWZpbmUgSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkweDAzMDIKKyNkZWZpbmUgSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMworI2RlZmluZSBJV19TUE9PRl9CRUFDT05fRVZFTlRfRkxBRwkJCQkJMHgwMzA0CisjZGVmaW5lIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwMzA1CisjZGVmaW5lIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA2CisjZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKKyNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKKyNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKKy8vIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMzA5CisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gZW5kCisKKy8vIEZvciBmbG9vZGluZyBhdHRhY2sgZXZlbnQgLSBzdGFydAorI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwMAorI2RlZmluZSBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDEKKyNkZWZpbmUgSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDIKKyNkZWZpbmUgSVdfRkxPT0RfUFJPQkVfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAzCisjZGVmaW5lIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwNDA0CisjZGVmaW5lIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDUKKyNkZWZpbmUgSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHCQkJCQkweDA0MDYKKy8vIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgIAkweDA0MDYKKyNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgLSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQKKworLy8gRW5kIC0gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gZGVmaW5pdGlvbiBmb3IgRExTLCBrYXRoeQorI2RlZmluZQlNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZICAgMQorI2RlZmluZQlNQVhfTlVNX09GX0RMU19FTlRSWSAgICAgICAgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkKKworLy9CbG9jayBBQ0sgLCBydDI4NjAsIGthdGh5CisjZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGCQk2NAorI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRgkJNjQKKyNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUCQkzMAorI2RlZmluZSBERUZBVUxUX1JYX1RJTUVPVVQJCTMwCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIE1BWF9CQVJFQ0lfU0VTU0lPTgkJOAorI2VuZGlmCisKKyNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgRVNTSUQgYW5kIHBBZC0+bmlja25hbWUgc3RyaW5ncyAqLworI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRSAgIAkJMzIKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworI2RlZmluZSBNQ0FTVF9ESVNBQkxFCTAKKyNkZWZpbmUgTUNBU1RfQ0NLCQkxCisjZGVmaW5lIE1DQVNUX09GRE0JCTIKKyNkZWZpbmUgTUNBU1RfSFRNSVgJCTMKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKy8vIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24gZnVuY3Rpb24KKyNkZWZpbmUgRE9UMTFQT1dFUlNBVkUJCTAKKyNkZWZpbmUgR1VJUkFESU9fT0ZGCQkxCisjZGVmaW5lIFJUTVBfSEFMVAkJICAgIDIKKyNkZWZpbmUgR1VJX0lETEVfUE9XRVJfU0FWRQkJMworLy8gLS0KKworCisvLyBkZWZpbml0aW9uIGZvciBXcGFTdXBwb3J0IGZsYWcKKyNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRElTQUJMRQkJCQkwCisjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0VOQUJMRQkJCQkxCisjZGVmaW5lCVdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSQkyCisKKy8vIEVuZGlhbiBieXRlIHN3YXBwaW5nIGNvZGVzCisjZGVmaW5lIFNXQVAxNih4KSBcCisgICAgKChVSU5UMTYpKCBcCisgICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4MDBmZlUpIDw8IDgpIHwgXAorICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweGZmMDBVKSA+PiA4KSApKQorCisjZGVmaW5lIFNXQVAzMih4KSBcCisgICAgKChVSU5UMzIpKCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCisKKyNkZWZpbmUgU1dBUDY0KHgpIFwKKyAgICAoKFVJTlQ2NCkoIFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCisjZGVmaW5lIGNwdTJsZTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGxlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGNwdTJsZTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGNwdTJsZTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGxlMmNwdTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGNwdTJiZTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgYmUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBjcHUyYmUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGJlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgY3B1MmJlMTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBiZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisKKyNlbHNlICAgLy8gTGl0dGxlX0VuZGlhbgorCisjZGVmaW5lIGNwdTJsZTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgbGUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBjcHUybGUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgY3B1MmxlMTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBsZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisjZGVmaW5lIGNwdTJiZTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGJlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGNwdTJiZTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGJlMmNwdTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGNwdTJiZTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGJlMmNwdTE2KHgpIFNXQVAxNigoeCkpCisKKyNlbmRpZiAgLy8gUlRfQklHX0VORElBTgorCisjZW5kaWYgIC8vIF9fUlRNUF9ERUZfSF9fCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX3R5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkN2RmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF90eXBlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wX3R5cGUuaAorCisgICAgQWJzdHJhY3Q6CisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKyAgICBQYXVsIExpbiAgICAxLTItMjAwNAorKi8KKyNpZm5kZWYgX19SVE1QX1RZUEVfSF9fCisjZGVmaW5lIF9fUlRNUF9UWVBFX0hfXworCisjZGVmaW5lIFBBQ0tFRCAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8vIFB1dCBwbGF0Zm9ybSBkZXBlbmRlbnQgZGVjbGFyYXRpb24gaGVyZQorLy8gRm9yIGV4YW1wbGUsIGxpbnV4IHR5cGUgZGVmaW5pdGlvbgordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQlVSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCVVJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlVSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVSU5UNjQ7Cit0eXBlZGVmIGludAkJCQkJSU5UMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyAJCQlJTlQ2NDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICoJCQlQVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICoJCVBVSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAqCQkJUFVJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICoJUFVJTlQ2NDsKK3R5cGVkZWYgaW50CSoJCQkJCVBJTlQzMjsKK3R5cGVkZWYgbG9uZyBsb25nICogCQkJUElOVDY0OworCit0eXBlZGVmIHNpZ25lZCBjaGFyCQkJQ0hBUjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0CQlTSE9SVDsKK3R5cGVkZWYgc2lnbmVkIGludAkJCUlOVDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcJCQlMT05HOwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nCUxPTkdMT05HOworCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUNIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVU0hPUlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJVUxPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVTE9OR0xPTkc7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJQk9PTEVBTjsKK3R5cGVkZWYgdm9pZAkJCQlWT0lEOworCit0eXBlZGVmIFZPSUQgKgkJCQlQVk9JRDsKK3R5cGVkZWYgQ0hBUiAqCQkJCVBDSEFSOwordHlwZWRlZiBVQ0hBUiAqIAkJCVBVQ0hBUjsKK3R5cGVkZWYgVVNIT1JUICoJCQlQVVNIT1JUOwordHlwZWRlZiBMT05HICoJCQkJUExPTkc7Cit0eXBlZGVmIFVMT05HICoJCQkJUFVMT05HOwordHlwZWRlZiBVSU5UICoJCQkJUFVJTlQ7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50CU5ESVNfTUVESUFfU1RBVEU7CisKK3R5cGVkZWYgdW5pb24gX0xBUkdFX0lOVEVHRVIgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQgTG93UGFydDsKKyAgICAgICAgSU5UMzIgSGlnaFBhcnQ7CisgICAgfSB1OworICAgIElOVDY0IFF1YWRQYXJ0OworfSBMQVJHRV9JTlRFR0VSOworCisjZW5kaWYgIC8vIF9fUlRNUF9UWVBFX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3NwZWN0cnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjZmE1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW0uaApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0hfXworI2RlZmluZSBfX1NQRUNUUlVNX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfVFBDX1JFUE9SVF9JTkZPCit7CisJVUlOVDggVHhQd3I7CisJVUlOVDggTGlua01hcmdpbjsKK30gVFBDX1JFUE9SVF9JTkZPLCAqUFRQQ19SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSF9TV19BTk5fSU5GTworeworCVVJTlQ4IENoU3dNb2RlOworCVVJTlQ4IENoYW5uZWw7CisJVUlOVDggQ2hTd0NudDsKK30gQ0hfU1dfQU5OX0lORk8sICpQQ0hfU1dfQU5OX0lORk87CisKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUV9NT0RFCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjE6NDsKKwkJVUlOVDggUmVwb3J0OjE7CisJCVVJTlQ4IFJlcXVlc3Q6MTsKKwkJVUlOVDggRW5hYmxlOjE7CisJCVVJTlQ4IFJldjA6MTsKKwl9IGZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXYwOjE7CisJCVVJTlQ4IEVuYWJsZToxOworCQlVSU5UOCBSZXF1ZXN0OjE7CisJCVVJTlQ4IFJlcG9ydDoxOworCQlVSU5UOCBSZXYxOjQ7CisJfSBmaWVsZDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKK30gTUVBU1VSRV9SRVEsICpQTUVBU1VSRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVFfSU5GTworeworCVVJTlQ4IFRva2VuOworCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKKwlVSU5UOCBSZXFUeXBlOworCU1FQVNVUkVfUkVRIE1lYXN1cmVSZXE7Cit9IE1FQVNVUkVfUkVRX0lORk8sICpQTUVBU1VSRV9SRVFfSU5GTzsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUAoreworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXY6MzsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJhZGFyOjE7CisJCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOworCQlVSU5UOCBPZmRtUHJlYW1ibGU6MTsKKwkJVUlOVDggQlNTOjE7CisJfSBmaWVsZDsKKyNlbHNlCisJc3RydWN0IFBBQ0tFRAorCXsKKwkJVUlOVDggQlNTOjE7CisJCVVJTlQ4IE9mZG1QcmVhbWJsZToxOworCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKKwkJVUlOVDggUmFkYXI6MTsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJldjozOworCX0gZmllbGQ7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCVVJTlQ4IHdvcmQ7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlQKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCU1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCBNYXA7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JULCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQ0NBX1JFUE9SVAoreworCVVJTlQ4IENoTnVtOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOworCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJVUlOVDggQ0NBX0J1c3lfRnJhY3Rpb247Cit9IE1FQVNVUkVfQ0NBX1JFUE9SVCwgKlBNRUFTVVJFX0NDQV9SRVBPUlQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SUElfUkVQT1JUCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlVSU5UOCBSUElfRGVuc2l0eVs4XTsKK30gTUVBU1VSRV9SUElfUkVQT1JULCAqUE1FQVNVUkVfUlBJX1JFUE9SVDsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX01PREUKK3sKKwlzdHJ1Y3QgUEFDS0VECisJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJVUlOVDggUmV2OjU7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IExhdGU6MTsKKyNlbHNlCisJCVVJTlQ4IExhdGU6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggUmV2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCX0gZmllbGQ7CisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVBPUlRfTU9ERSwgKlBNRUFTVVJFX1JFUE9SVF9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX0lORk8KK3sKKwlVSU5UOCBUb2tlbjsKKwlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7CisJVUlOVDggUmVwb3J0VHlwZTsKKwlVSU5UOCBPY3RlY3RbMF07Cit9IE1FQVNVUkVfUkVQT1JUX0lORk8sICpQTUVBU1VSRV9SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9RVUlFVF9JTkZPCit7CisJVUlOVDggUXVpZXRDbnQ7CisJVUlOVDggUXVpZXRQZXJpb2Q7CisJVUlOVDggUXVpZXREdXJhdGlvbjsKKwlVSU5UOCBRdWlldE9mZnNldDsKK30gUVVJRVRfSU5GTywgKlBRVUlFVF9JTkZPOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUNIQVIgRGlhbG9nVG9rZW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlQ2hTd0FubigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKKwkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UcGNSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitWT0lEIE1lYXN1cmVSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCk7CisjZW5kaWYgLy8gX19TUEVDVFJVTV9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zcGVjdHJ1bV9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW1fZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNDgxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW1fZGVmLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwlzcGVjdHJ1bV9kZWYuaAorCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlGb25jaGkgV3UgICAgMjAwOAkgIAkgICBjcmVhdGVkIGZvciA4MDIuMTFoCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0RFRl9IX18KKyNkZWZpbmUgX19TUEVDVFJVTV9ERUZfSF9fCisKKyNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzCisjZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMworI2RlZmluZSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFCQlNQVhfVFBDX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1JTl9SQ1ZfUFdSCQkJCTEwMAkJLyogTmVnYXRpdmUgdmFsdWUgKChkQm0pICovCisKKyNkZWZpbmUgUk1fVFBDX1JFUQkJCQkwCisjZGVmaW5lIFJNX01FQVNVUkVfUkVRCQkJMQorCisjZGVmaW5lIFJNX0JBU0lDCQkJCTAKKyNkZWZpbmUgUk1fQ0NBCQkJCQkxCisjZGVmaW5lIFJNX1JQSV9ISVNUT0dSQU0JCTIKKworI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCisjZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLworCisjZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKKyNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCisKK3R5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQoreworCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OworCVVMT05HIGxhc3RUaW1lOworCUJPT0xFQU4JVmFsaWQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCit9IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCit7CisJVUNIQVIgU2l6ZTsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07CisJTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9FTlRSWQoreworCXN0cnVjdCBfVFBDX1JFUV9FTlRSWSAqcE5leHQ7CisJVUxPTkcgbGFzdFRpbWU7CisJQk9PTEVBTiBWYWxpZDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKK30gVFBDX1JFUV9FTlRSWSwgKlBUUENfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9UQUIKK3sKKwlVQ0hBUiBTaXplOworCVBUUENfUkVRX0VOVFJZIEhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07CisJVFBDX1JFUV9FTlRSWSBDb250ZW50W01BWF9UUENfUkVRX1RBQl9TSVpFXTsKK30gVFBDX1JFUV9UQUIsICpQVFBDX1JFUV9UQUI7CisKKyNlbmRpZiAvLyBfX1NQRUNUUlVNX0RFRl9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYWlyb25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYWlyb25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjRhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9haXJvbmV0LmMKQEAgLTAsMCArMSwxMzEyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWFpcm9uZXQuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQJQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUJCSpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMJVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfQUlST05FVF9TVEFURSwgTUFYX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFJUk9ORVRfSURMRSwgQUlST05FVF9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0TXNnQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVxdWVzdEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfU0NBTk5JTkcsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVwb3J0QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldE1zZ0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCit7CisJVVNIT1JUCQkJCQkJCUxlbmd0aDsKKwlVQ0hBUgkJCQkJCQlJbmRleCwgaTsKKwlQVUNIQVIJCQkJCQkJcERhdGE7CisJUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRQkJcFJNUmVxOworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxRWxlbTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7CisKKwkvLyAwLiBHZXQgQWlyb25ldCBJQVBQIGhlYWRlciBmaXJzdAorCXBSTVJlcSA9IChQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCXBEYXRhICA9IChQVUNIQVIpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisKKwkvLyAxLiBDaGFuZ2UgZW5kaWFuIGZvcm1hdCBmb3JtIG5ldHdvcmsgdG8gbGl0dGxlIGVuZGlhbgorCUxlbmd0aCA9IGJlMmNwdTE2KHBSTVJlcS0+SUFQUC5MZW5ndGgpOworCisJLy8gMi4wIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBDQ1ggMi4wIHN1cHBvcnQgaXMgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5DQ1hFbmFibGUgIT0gVFJVRSkKKwkJcmV0dXJuOworCisJLy8gMi4xIFJhZGlvIG1lYXN1cmVtZW50IG11c3QgYmUgb24KKwlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5STUVuYWJsZSAhPSAxKQorCQlyZXR1cm47CisKKwkvLyAyLjIuIERlYnVnIHByaW50IGFsbCBiaXQgaW5mb3JtYXRpb24KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIElEICYgTGVuZ3RoICVkXG4iLCBMZW5ndGgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5UeXBlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBTdWJUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuU3ViVHlwZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgRGlhbG9nIFRva2VuICV4XG4iLCBwUk1SZXEtPklBUFAuVG9rZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIEFjdGl2YXRpb24gRGVsYXkgJXhcbiIsIHBSTVJlcS0+RGVsYXkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIE1lYXN1cmVtZW50IE9mZnNldCAleFxuIiwgcFJNUmVxLT5PZmZzZXQpKTsKKworCS8vIDMuIENoZWNrIElBUFAgZnJhbWUgdHlwZSwgaXQgbXVzdCBiZSAweDMyIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbgorCWlmIChwUk1SZXEtPklBUFAuVHlwZSAhPSBBSVJPTkVUX0lBUFBfVFlQRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgdHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDQuIENoZWNrIElBUFAgZnJhbWUgc3VidHlwZSwgaXQgbXVzdCBiZSAweDAxIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiByZXF1ZXN0LgorCS8vICAgIFNpbmNlIHdlIGFyZSBhY3RpbmcgYXMgY2xpZW50IG9ubHksIHdlIHdpbGwgZGlzcmVnYXJkcyByZXBseSBzdWJ0eXBlLgorCWlmIChwUk1SZXEtPklBUFAuU3ViVHlwZSAhPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBzdWJ0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gNS4gVmVyaWZ5IERlc3RpbmF0aW9uIE1BQyBhbmQgU291cmNlIE1BQywgYm90aCBzaG91bGQgYmUgYWxsIHplcm9zLgorCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5EQSwgWkVST19NQUNfQUREUikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIERBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLlNBLCBaRVJPX01BQ19BRERSKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgU0EgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyA2LiBSZWluaXQgYWxsIHJlcG9ydCByZWxhdGVkIGZpZWxkcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLCAyMDQ4KTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXQsIHNpemVvZihVU0hPUlQpICogTUFYX0xFTl9PRl9CU1NfVEFCTEUpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdCwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSAqIDQpOworCisJLy8gNy4gUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGZpcnN0IGVsZW1lbnQgcmVwb3J0IGVsZW1lbnQKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAgID0gTEVOR1RIXzgwMl8xMSArIHNpemVvZihBSVJPTkVUX0lBUFBfSEVBREVSKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggICAgID0gMHhmZjsKKwlwQWQtPlN0YUNmZy5STVJlcUNudCAgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSAgICAgID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxEdXJhdGlvbiA9IDA7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxDaGFubmVsICA9IDA7CisJcEFkLT5TdGFDZmcuSUFQUFRva2VuICAgICAgICA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKwlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggID0gMDsKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICAgID0gMDsKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJSW5kZXggPSAwOworCisJLy8gOC4gU2F2ZSBkaWFsb2cgdG9rZW4gZm9yIHJlcG9ydAorCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKworCS8vIFNhdmUgQWN0aXZhdGlvbiBkZWxheSAmIG1lYXN1cmVtZW50IG9mZnNldCwgTm90IHJlYWxseSBuZWVkZWQKKworCS8vIDkuIFBvaW50IHRvIHRoZSBmaXJzdCByZXF1ZXN0IGVsZW1lbnQKKwlwRGF0YSArPSBzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKTsKKwkvLyAgICBMZW5ndGggc2hvdWxkIGV4Y2x1ZGUgdGhlIENJU0NPIEFpcm9uZXQgU05BUCBoZWFkZXIKKwlMZW5ndGggLT0gKHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpIC0gTEVOR1RIXzgwMl8xX0gpOworCisJLy8gMTAuIFN0YXJ0IFBhcnNpbmcgdGhlIE1lYXN1cmVtZW50IGVsZW1lbnRzLgorCS8vICAgIEJlIGNhcmVmdWwgYWJvdXQgbXVsdGlwbGUgTVIgZWxlbWVudHMgd2l0aGluIG9uZSBmcmFtZXMuCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQlwUmVxRWxlbSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pIHBEYXRhOworCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCS8vIEZyb20gdGhlIGV4YW1wbGUsIGl0IHNlZW1zIHdlIG9ubHkgbmVlZCB0byBzdXBwb3J0IG9uZSByZXF1ZXN0IGluIG9uZSBmcmFtZQorCQkJCS8vIFRoZXJlIGlzIG5vIG11bHRpcGxlIHJlcXVlc3QgaW4gb25lIGZyYW1lLgorCQkJCS8vIEJlc2lkZXMsIGxvb2tzIGxpa2Ugd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhlIG1lYXN1cmVtZW50IHJlcXVlc3Qgb25seS4KKwkJCQkvLyBUaGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBpcyBhbHdheXMgNCBieXRlcy4KKworCQkJCS8vIFN0YXJ0IHBhcnNpbmcgdGhpcyB0eXBlIG9mIHJlcXVlc3QuCisJCQkJLy8gMC4gRWlkIGlzIElFX01FQVNVUkVNRU5UX1JFUVVFU1QKKwkJCQkvLyAxLiBMZW5ndGggZGlkbid0IGluY2x1ZGUgRWlkIGFuZCBMZW5ndGggZmllbGQsIGl0IGFsd2F5cyBiZSA4LgorCQkJCS8vIDIuIE1lYXN1cmVtZW50IFRva2VuLCB3ZSBubmVkIHRvIHNhdmUgaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJlcG9ydC4KKwkJCQkvLyAzLiBNZWFzdXJlbWVudCBNb2RlLCBBbHRob3VnaCB0aGVyZSBhcmUgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkaW4ndCBzZWUgdmFsdWUgb3RoZXIgdGhhbgorCQkJCS8vICAgIDAgZnJvbSB0ZXN0IHNwZWNzIGV4YW1wbGVzLgorCQkJCS8vIDQuIE1lYXN1cmVtZW50IFR5cGUsIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGRvLgorCQkJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uVHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE6CisJCQkJCWNhc2UgTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROgorCQkJCQljYXNlIE1TUk5fVFlQRV9CRUFDT05fUkVROgorCQkJCQkJLy8gQ2hlY2sgdGhlIEVuYWJsZSBub24tc2VydmluZyBjaGFubmVsIG1lYXN1cmVtZW50IGNvbnRyb2wKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkRDUk1FbmFibGUgPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBDaGVjayBjaGFubmVsIGJlZm9yZSBlbnF1ZXVlIHRoZSBhY3Rpb24KKwkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gSWYgb2ZmIGNoYW5uZWwgbWVhc3VyZW1lbnQsIGNoZWNrIHRoZSBUVSBkdXJhdGlvbiBsaW1pdAorCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5UdUxpbWl0KQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIFNhdmUgcmVxdWVzdHMgYW5kIGV4ZWN1dGUgYWN0aW9ucyBsYXRlcgorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0sIHBSZXFFbGVtLCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pKTsKKwkJCQkJCUluZGV4ICs9IDE7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1TUk5fVFlQRV9GUkFNRV9SRVE6CisJCQkJCQkvLyBTaW5jZSBpdCdzIG9wdGlvbiwgd2Ugd2lsbCBzdXBwb3J0IGxhdGVyCisJCQkJCQkvLyBGcmFtZVJlcXVlc3RBY3Rpb24ocEFkLCBwRGF0YSk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gUG9pbnQgdG8gbmV4dCBNZWFzdXJlbWVudCByZXF1ZXN0CisJCQkJcERhdGEgICs9IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJTGVuZ3RoIC09IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJYnJlYWs7CisKKwkJCS8vIFdlIGFjY2VwdCByZXF1ZXN0IG9ubHksIGFsbCBvdGhlcnMgYXJlIGRyb3BwZWQKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJY2FzZSBJRV9BUF9UWF9QT1dFUjoKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuOworCQl9CisJfQorCisJLy8gMTEuIFVwZGF0ZSBzb21lIGZsYWdzIGFuZCBpbmRleAorCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ID0gSW5kZXg7CisKKwlpZiAoSW5kZXgpCisJeworCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKK3sKKwlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKKworCS8vIDEuIFBvaW50IHRvIG5leHQgcmVxdWVzdCBlbGVtZW50CisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCS8vIDIuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCisJaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKKwkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UKKwkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJcmV0dXJuOworCisJLy8gMy4gUGVlayBpbnRvIHRoZSBuZXh0IHJlcXVlc3QsIGlmIGl0J3MgcGFyYWxsZWwsIHdlIHdpbGwgdXBkYXRlIHRoZSBzY2FuIHRpbWUgdG8gdGhlIGxhcmdlc3Qgb25lCisJaWYgKChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxKSA8IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQorCXsKKwkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMV07CisJCS8vIENoZWNrIGZvciBwYXJhbGxlbCBiaXQKKwkJaWYgKChwUmVxLT5SZXFFbGVtLk1vZGUgJiAweDAxKSAmJiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCisJCXsKKwkJCS8vIFVwZGF0ZSBwYXJhbGxlbCBtb2RlIHJlcXVlc3QgaW5mb3JtYXRpb24KKwkJCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gVFJVRTsKKwkJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lID0gKChwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSA/CisJCQkocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pIDogKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSk7CisJCX0KKwl9CisKKwkvLyA0LiBDYWxsIFJUMjhYWF9NTE1FX0hBTkRMRVIgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBtbG1lIGNvbW1hbmRzLCBTY2FuIHJlcXVlc3QgaXMgdGhlIG9ubHkgb25lIHVzZWQKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBjaGFubmVsIGxvYWQgcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKwlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7CisJUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOworCisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOworCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7CisKKwkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAorCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCisJLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgorCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KKwkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KKwkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KKwkvLyBQYXNzaXZlIHNjYW4gTW9kZQorCisJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCisJCXJldHVybjsKKworCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KKwlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOworCisJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOzsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgCT0gQlRZUEVfREFUQTsKKwkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOworCisJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCX0KKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7CisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgPSAwOworCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKKworCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKKworCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKwlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl0sIGk7CisJTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCS8vIFBhc3NpdmUgc2NhbiBNb2RlCisKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKKwkJcmV0dXJuOworCisJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19OT0lTRSk7CisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOworCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKKworCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgorCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm47CisKKwkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgIAk9IEJUWVBFX0RBVEE7CisJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKKworCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwl9CisKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOworCisJLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQmVhY29uUmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCWlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9QQVNTSVZFKQorCXsKKwkJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFzc2l2ZSBTY2FuIE1vZGUhXG4iKSk7CisKKwkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwkJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQorCQkJcmV0dXJuOworCisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX1BBU1NJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQUNUSVZFKQorCXsKKwkJLy8gQWN0aXZlIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY3RpdmUgU2NhbiBNb2RlIVxuIikpOworCisJCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJCXJldHVybjsKKworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19BQ1RJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFKQorCXsKKwkJLy8gQmVhY29uIHJlcG9ydCBNb2RlLCByZXBvcnQgYWxsIHRoZSBBUFMgaW4gY3VycmVudCBic3MgdGFibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uIFJlcG9ydCBNb2RlIVxuIikpOworCisJCS8vIENvcHkgY3VycmVudCBCU1MgdGFibGUgdG8gQ0NYIHRhYmxlLCB3ZSBjYW4gb21pdCB0aGlzIHN0ZXAgbGF0ZXIgb24uCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsICZwQWQtPlNjYW5UYWIsIHNpemVvZihCU1NfVEFCTEUpKTsKKworCQkvLyBDcmVhdGUgYmVhY29uIHJlcG9ydCBmcm9tIEJzcyB0YWJsZQorCQlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKHBBZCk7CisKKwkJLy8gU2V0IHN0YXRlIHRvIHNjYW5uaW5nCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJCS8vIEVucXVldWUgcmVwb3J0IHJlcXVlc3QKKwkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFdyb25nIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcm9uZyBTY2FuIE1vZGUhXG4iKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQoreworCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOworCVVMT05HCQkJCU5vdzMyOworCisgICAgTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3czMjsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMS4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKKwlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQorCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKKwkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZQorCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4KKwkJOworCisJLy8gMi4gUG9pbnQgdG8gdGhlIGNvcnJlY3QgaW5kZXggb2YgYWN0aW9uIGVsZW1lbnQsIHN0YXJ0IGZyb20gMAorCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOworCisJLy8gMy4gQ2hlY2sgZm9yIHBhcmFsbGVsIGFjdGlvbnMKKwlpZiAocEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPT0gVFJVRSkKKwl7CisJCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwkJLy8gUHJvY2VzcyBuZXh0IGFjdGlvbiByaWdodCBhd2F5CisJCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCisJCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisKKwkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7CisJfQorCisJaWYgKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCA+PSBwQWQtPlN0YUNmZy5STVJlcUNudCkKKwl7CisJCS8vIDQuIFRoZXJlIGlzIG5vIG1vcmUgdW5wcm9jZXNzZWQgbWVhc3VyZW1lbnQgcmVxdWVzdCwgZ28gZm9yIHRyYW5zbWl0IHRoaXMgcmVwb3J0CisJCUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbihwQWQpOworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOworCX0KKwllbHNlCisJeworCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOworCisJCWlmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKKwkJfQorCisJCS8vIDUuIFRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIHRvIGJlIG1lYXN1cmUKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFVDSEFSCQkJCQlwRGVzdDsKKwlQQUlST05FVF9JQVBQX0hFQURFUglwSUFQUDsKKwlQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXI7CisJVUNIQVIJCQkJCUFja1JhdGUgPSBSQVRFXzI7CisJVVNIT1JUCQkJCQlBY2tEdXJhdGlvbiA9IDA7CisJTkRJU19TVEFUVVMJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HCQkJCQlGcmFtZUxlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAwLiBTZXQgdXAgdGhlIGZyYW1lIHBvaW50ZXIsIEZyYW1lIHdhcyBpbml0ZWQgYXQgdGhlIGVuZCBvZiBtZXNzYWdlIGFjdGlvbgorCXBEZXN0ID0gJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW0xFTkdUSF84MDJfMTFdOworCisJLy8gMS4gVXBkYXRlIHJlcG9ydCBJQVBQIGZpZWxkcworCXBJQVBQID0gKFBBSVJPTkVUX0lBUFBfSEVBREVSKSBwRGVzdDsKKworCS8vIDIuIENvcHkgQ2lzY28gU05BUCBoZWFkZXIKKwlOZGlzTW92ZU1lbW9yeShwSUFQUC0+Q2lzY29TbmFwSGVhZGVyLCBTTkFQX0FJUk9ORVQsIExFTkdUSF84MDJfMV9IKTsKKworCS8vIDMuIG5ldHdvcmsgb3JkZXIgZm9yIHRoaXMgMTZiaXQgbGVuZ3RoCisJcElBUFAtPkxlbmd0aCAgPSBjcHUyYmUxNihwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSCk7CisKKwkvLyAzLjEgc2FuaXR5IGNoZWNrIHRoZSByZXBvcnQgbGVuZ3RoLCBpZ25vcmUgaXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQKKwlpZiAoYmUyY3B1MTYocElBUFAtPkxlbmd0aCkgPD0gMTgpCisJCXJldHVybjsKKworCS8vIDQuIFR5cGUgbXVzdCBiZSAweDMyCisJcElBUFAtPlR5cGUgICAgPSBBSVJPTkVUX0lBUFBfVFlQRTsKKworCS8vIDUuIFN1YlR5cGUgZm9yIHJlcG9ydCBtdXN0IGJlIDB4ODEKKwlwSUFQUC0+U3ViVHlwZSA9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVDsKKworCS8vIDYuIERBIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIHplcm8sIGFsdGhvdWdoIHRoZSB3aG9sZSBmcmFtZSB3YXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24KKwkvLyAgICBXZSB3aWxsIGRvIGl0IGFnYWluIGhlcmUuIFdlIGNhbiB1c2UgQlNTSUQgaW5zdGVhZAorCUNPUFlfTUFDX0FERFIocElBUFAtPkRBLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyA3LiBTQSBpcyB0aGUgY2xpZW50IHJlcG9ydGluZyB3aGljaCBtdXN0IGJlIG91ciBNQUMKKwlDT1BZX01BQ19BRERSKHBJQVBQLT5TQSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwkvLyA4LiBDb3B5IHRoZSBzYXZlZCBkaWFsb2cgdG9rZW4KKwlwSUFQUC0+VG9rZW4gPSBwQWQtPlN0YUNmZy5JQVBQVG9rZW47CisKKwkvLyA5LiBNYWtlIHRoZSBSZXBvcnQgZnJhbWUgODAyLjExIGhlYWRlcgorCS8vICAgIFJldXNlIGZ1bmN0aW9uIGluIHdwYS5jCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWY7CisJcEFkLT5TZXF1ZW5jZSArKzsKKwlXcGFNYWNIZWFkZXJJbml0KHBBZCwgcEhlYWRlciwgMCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQUNLIHNpemUJaXMgMTQgaW5jbHVkZSBDUkMsIGFuZCBpdHMgcmF0ZQlpcyBiYXNlZCBvbiByZWFsIHRpbWUgaW5mb3JtYXRpb24KKwlBY2tSYXRlICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgQWNrUmF0ZSwgMTQpOworCXBIZWFkZXItPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKworCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisKKwkvLyAxMC4gUHJlcGFyZSByZXBvcnQgZnJhbWUgd2l0aCBkeW5hbWljIG91dGJ1ZmZlci4gSnVzdCBzaW1wbHkgY29weSBldmVyeXRoaW5nLgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4sIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIDExLiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPSBNU1JOX1RZUEVfVU5VU0VEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQQ0hBTk5FTF9MT0FEX1JFUE9SVAkJcExvYWQ7CisJUFVDSEFSCQkJCQkJcERlc3Q7CisJVUNIQVIJCQkJCQlDQ0FCdXN5RnJhY3Rpb247CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDEuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCA5LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKKwlwUmVwb3J0LT5MZW5ndGggPSA5OworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKKwlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKKwlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKKworCS8vIDIuIEZpbGwgY2hhbm5lbCByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQorCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcExvYWQgID0gKFBDSEFOTkVMX0xPQURfUkVQT1JUKSBwRGVzdDsKKwlwTG9hZC0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcExvYWQtPlNwYXJlICAgID0gMDsKKwlwTG9hZC0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJLy8gMy4gQ2FsY3VsYXRlIHRoZSBDQ0EgQnVzeSBGcmFjdGlvbgorCS8vICAgIChCeXRlcyArIEFDSyBzaXplKSAqIDggLyBUeCBzcGVlZCAqIDI1NSAvIDEwMDAgLyBtZWFzdXJlbWVudCBkdXJhdGlvbiwgdXNlIDI0IHVzIFR4IHNwZWVkCisJLy8gICAgID0gIChCeXRlcyArIEFDSykgLyAxMiAvIGR1cmF0aW9uCisJLy8gICAgIDkgaXMgdGhlIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yCisJLy8gQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyA5IC8gcExvYWQtPkR1cmF0aW9uKTsKKwlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yIC8gcExvYWQtPkR1cmF0aW9uKTsKKwlpZiAoQ0NBQnVzeUZyYWN0aW9uIDwgMTApCisJCQlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDMgLyBwTG9hZC0+RHVyYXRpb24pICsgMTsKKworCXBMb2FkLT5DQ0FCdXN5ID0gQ0NBQnVzeUZyYWN0aW9uOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNMQnVzeUJ5dGUgJWxkLCBEdXJhdGlvbiAlZCwgUmVzdWx0LCAlZFxuIiwgcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMsIHBMb2FkLT5EdXJhdGlvbiwgQ0NBQnVzeUZyYWN0aW9uKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihDSEFOTkVMX0xPQURfUkVQT1JUKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwkvLyA0LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJLy8gNS4gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5vaXNlSGlzdFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBOT0lTRV9ISVNUX1JFUE9SVAkJCXBOb2lzZTsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlVQ0hBUgkJCQkJCWksTm9pc2VDbnQ7CisJVVNIT1JUCQkJCQkJVG90YWxSUElDbnQsIFRvdGFsUlBJU3VtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMC4gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwkvLyAxLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCAxNiwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCisJcFJlcG9ydC0+TGVuZ3RoID0gMTY7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOworCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCS8vIDMuIEZpbGwgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCisJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwTm9pc2UgID0gKFBOT0lTRV9ISVNUX1JFUE9SVCkgcERlc3Q7CisJcE5vaXNlLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwTm9pc2UtPlNwYXJlICAgID0gMDsKKwlwTm9pc2UtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwkvLyA0LiBGaWxsIE5vaXNlIGhpc3RvZ3JhbSwgdGhlIHRvdGFsIFJQSSBjb3VudHMgc2hvdWxkIGJlIDAuNCAqIFRVCisJLy8gICAgV2UgZXN0aW1hdGUgNDAwMCBub3JtYWwgcGFja2V0cyByZWNlaXZlZCBkdXJuaW5nIDEwIHNlY29uZHMgdGVzdC4KKwkvLyAgICBBZGp1c3QgaXQgaWYgcmVxdWlyZWQuCisJLy8gMyBpcyBhIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yCisJLy8gVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogMyAvIDEwOworCVRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yIC8gMTA7CisJVG90YWxSUElTdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVRvdGFsUlBJU3VtICs9IHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV07CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJQSSAlZCBDb251dHMgJWRcbiIsIGksIHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0pKTsKKwl9CisKKwkvLyBEb3VibGUgY2hlY2sgaWYgdGhlIGNvdW50ZXIgaXMgbGFyZ2VyIHRoYW4gb3VyIGV4cGVjdGF0aW9uLgorCS8vIFdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSB0b3RhbCBudW1iZXIgcGx1cyBhIGZyYWN0aW9uLgorCWlmIChUb3RhbFJQSVN1bSA+IFRvdGFsUlBJQ250KQorCQlUb3RhbFJQSUNudCA9IFRvdGFsUlBJU3VtICsgcE5vaXNlLT5EdXJhdGlvbiAvIDIwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgUlBJIENvbnV0cyAlZFxuIiwgVG90YWxSUElDbnQpKTsKKworCS8vIDUuIEluaXRpYWxpemUgbm9pc2UgY291bnQgZm9yIHRoZSB0b3RhbCBzdW1tYXRpb24gb2YgMHhmZgorCU5vaXNlQ250ID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorCXsKKwkJcE5vaXNlLT5EZW5zaXR5W2ldID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAqIDI1NSAvIFRvdGFsUlBJQ250KTsKKwkJaWYgKChwTm9pc2UtPkRlbnNpdHlbaV0gPT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gIT0gMCkpCisJCQlwTm9pc2UtPkRlbnNpdHlbaV0rKzsKKwkJTm9pc2VDbnQgKz0gcE5vaXNlLT5EZW5zaXR5W2ldOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbJWRdICA9IDB4JTAyeFxuIiwgaSwgcE5vaXNlLT5EZW5zaXR5W2ldKSk7CisJfQorCisJLy8gNi4gUlBJWzBdIHJlcHJlc2VudHMgdGhlIHJlc3Qgb2YgY291bnRzCisJcE5vaXNlLT5EZW5zaXR5WzBdID0gMHhmZiAtIE5vaXNlQ250OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVswXSAgPSAweCUwMnhcbiIsIHBOb2lzZS0+RGVuc2l0eVswXSkpOworCisJcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoTk9JU0VfSElTVF9SRVBPUlQpKTsKKworCS8vIDcuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwkvLyA4LiByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUJlYWNvblJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIExvb2tzIGxpa2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0aGluZyBuZWVkIHRvIGRvIGhlcmUuCisJLy8gQWxsIG1lYXN1cmVtZW50IHJlcG9ydCBhbHJlYWR5IGZpbmlzaGVkIGluIEFkZEJlYWNvblJlcG9ydAorCS8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIEZyYW1lUmVwb3J0TGVuCisKKwkvLyByZXNldCBCZWFjb24gaW5kZXggZm9yIG5leHQgYmVhY29uIHJlcXVlc3QKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSAweGZmOworCisJLy8gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVMT05HCQkJCUluZGV4LAorCUlOCVBNTE1FX1FVRVVFX0VMRU0JcEVsZW0pCit7CisJUFZPSUQJCQkJCQlwTXNnOworCVBVQ0hBUgkJCQkJCXBTcmMsIHBEZXN0OworCVVDSEFSCQkJCQkJUmVxSWR4OworCVVMT05HCQkJCQkJTXNnTGVuOworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQRlJBTUVfODAyXzExCQkJCXBGcmFtZTsKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQRUlEX1NUUlVDVAkJCSAgICAgICAgcEVpZDsKKwlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OworCVBCU1NfRU5UUlkJCQkJCXBCc3M7CisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcE1zZyAgID0gcEVsZW0tPk1zZzsKKwlNc2dMZW4gPSBwRWxlbS0+TXNnTGVuOworCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBwTXNnOworCXBTcmMgICA9IHBGcmFtZS0+T2N0ZXQ7CQkJCS8vIFN0YXJ0IGZyb20gQVAgVFNGCisJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKKworCS8vIDEgQ2hlY2sgdGhlIEluZGV4LCBpZiB3ZSBhbHJlYWR5IGNyZWF0ZSB0aGlzIGVudHJ5LCBvbmx5IHVwZGF0ZSB0aGUgYXZlcmFnZSBSU1NJCisJaWYgKChJbmRleCA8PSBwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXgpICYmIChwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggIT0gMHhmZikpCisJeworCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XV07CisJCS8vIFBvaW50IHRvIGJzcyByZXBvcnQgaW5mb3JtYXRpb24KKwkJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisKKwkJLy8gVXBkYXRlIFJ4IHBvd2VyLCBpbiBkQm0KKwkJLy8gR2V0IHRoZSBvcmlnaW5hbCBSU1NJIHJlYWRiYWNrIGZyb20gQkJQCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKz0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJLy8gQXZlcmFnZSB0aGUgUnNzaSByZWFkaW5nCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgID0gKHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKyBwQnNzLT5Sc3NpKSAvIDI7CisJCS8vIEdldCB0byBkQm0gZm9ybWF0CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLT0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKKwkJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdIFJzc2kgJWQsIEF2ZyBSc3NpICVkXG4iLCBJbmRleCwgKHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdKSk7CisKKwkJLy8gVXBkYXRlIG90aGVyIGluZm9ybWF0aW9uIGhlcmUKKworCQkvLyBEb25lCisJCXJldHVybjsKKwl9CisKKwkvLyAyLiBVcGRhdGUgcmVwb3J0ZWQgSW5kZXgKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSBJbmRleDsKKworCS8vIDMuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCisJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisKKwkvLyA0LiBTYXZlIHRoZSBzdGFydCBvZmZzZXQgb2YgZWFjaCBCc3MgaW4gcmVwb3J0IGZyYW1lCisJcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSA9IHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuOworCisJLy8gNS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCXBSZXBvcnQtPkVpZCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKwlwUmVwb3J0LT5MZW5ndGggPSAwOworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47CisJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKworCS8vIDYuIFN0YXJ0IHRoZWJlYWNvbiByZXBvcnQgZm9ybWF0CisJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCisJLy8gNy4gQ29weSBDaGFubmVsIG51bWJlcgorCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7CisJcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJLy8gOC4gUnggcG93ZXIsIGluIGRCbQorCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdLCBSc3NpICVkXG4iLCBJbmRleCwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKKwlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwRnJhbWUtPkhkci5BZGRyMyk7CisJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwU3JjLCA0KTsKKwlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsICZwRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJTmRpc01vdmVNZW1vcnkoJnBCZWFjb25SZXBvcnQtPlRhcmdldFRTRls0XSwgJnBFbGVtLT5UaW1lU3RhbXAudS5IaWdoUGFydCwgNCk7CisKKwkvLyA5LiBTa2lwIHRoZSBiZWFjb24gZnJhbWUgYW5kIG9mZnNldCB0byBzdGFydCBvZiBjYXBhYmlsaXR5aW5mbyBzaW5jZSB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBjYXBhYmlsaXR5aW5mbworCXBTcmMgKz0gKFRJTUVTVEFNUF9MRU4gKyAyKTsKKwlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9ICooVVNIT1JUICopcFNyYzsKKworCS8vIDEwLiBQb2ludCB0byBzdGFydCBvZiBlbGVtZW50IElECisJcFNyYyArPSAyOworCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisKKwkvLyAxMS4gU3RhcnQgcHJvY2VzcyBhbGwgdmFyaWFibGUgRWlkIG9heWxvYWQgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgdG8gdGhlIGZyYW1lIHJlcG9ydAorCXdoaWxlICgoKFBVQ0hBUikgcEVpZCArIHBFaWQtPkxlbiArIDEpIDwgKChQVUNIQVIpIHBGcmFtZSArIE1zZ0xlbikpCisJeworCQkvLyBPbmx5IGxpbWl0ZWQgRUlEIGFyZSByZXF1aXJlZCB0byByZXBvcnQgZm9yIENDWCAyLiBJdCBpbmNsdWRlcyBTU0lELCBTdXBwb3J0ZWQgcmF0ZSwKKwkJLy8gRkggcGFyYW1lbnRlciBzZXQsIERTIHBhcmFtZXRlciBzZXQsIENGIHBhcmFtZXRlciBzZXQsIElCU1MgcGFyYW1ldGVyIHNldCwKKwkJLy8gVElNIChyZXBvcnQgZmlyc3QgNCBieXRlcyBvbmx5LCByYWRpbyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1NTSUQ6CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisJCQljYXNlIElFX0ZIX1BBUk06CisJCQljYXNlIElFX0RTX1BBUk06CisJCQljYXNlIElFX0NGX1BBUk06CisJCQljYXNlIElFX0lCU1NfUEFSTToKKwkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworCisJCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6CisJCQkJLy8gU2luY2UgdGhpcyBJRSBpcyBkdXBsaWNhdGVkIHdpdGggV1BBIHNlY3VyaXR5IElFLCB3ZSBoYXMgdG8gZG8gc2FuaXR5IGNoZWNrIGJlZm9yZQorCQkJCS8vIHJlY29nbml6ZSBpdC4KKwkJCQkvLyAxLiBJdCBhbHNvIGhhcyBmaXhlZCA2IGJ5dGVzIElFIGxlbmd0aC4KKwkJCQlpZiAocEVpZC0+TGVuICE9IDYpCisJCQkJCWJyZWFrOworCQkJCS8vIDIuIENoZWNrIHRoZSBDaXNjbyBBaXJvbmV0IE9VSQorCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQ0lTQ09fT1VJLCAocFNyYyArIDIpLCAzKSkKKwkJCQl7CisJCQkJCS8vIE1hdGNoZWQsIHRoaXMgaXMgd2hhdCB3ZSB3YW50CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfVElNOgorCQkJCWlmIChwRWlkLT5MZW4gPiA0KQorCQkJCXsKKwkJCQkJLy8gTWF5IHRydW5jYXRlIGFuZCByZXBvcnQgdGhlIGZpcnN0IDQgYnl0ZXMgb25seSwgd2l0aCB0aGUgZWlkICYgbGVuLCB0b3RhbCBzaG91bGQgYmUgNgorCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgNik7CisJCQkJCXBEZXN0ICArPSA2OworCQkJCQlMZW5ndGggKz0gNjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQkvLyAxMi4gTW92ZSB0byBuZXh0IGVsZW1lbnQgSUQKKwkJcFNyYyArPSAoMiArIHBFaWQtPkxlbik7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisJfQorCisJLy8gMTMuIFVwZGF0ZSB0aGUgbGVuZ3RoIGluIHRoZSBoZWFkZXIsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKKworCS8vIDE0LiBVcGRhdGUgdGhlIGZyYW1lIHJlcG9ydCBidWZmZXIgZGF0YSBsZW5ndGgKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkKQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7CisJVUNIQVIJCQkJCQlJbmRleCwgUmVxSWR4OworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlQQlNTX0VOVFJZCQkJCQlwQnNzOworCisJLy8gMC4gc2V0dXAgYmFzZSBwb2ludGVyCisJUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc05yOyBJbmRleCsrKQorCXsKKwkJLy8gMS4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKKwkJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKKwkJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCQlMZW5ndGggPSAwOworCisJCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcworCQlwUmVwb3J0ICAgICAgICAgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKwkJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCQlwUmVwb3J0LT5MZW5ndGggPSAwOworCQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOworCQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7CisJCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCQlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCisJCS8vIDMuIFN0YXJ0IHRoZSBiZWFjb24gcmVwb3J0IGZvcm1hdAorCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKwkJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwkJTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKworCQkvLyA0LiBDb3B5IENoYW5uZWwgbnVtYmVyCisJCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwkJcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOworCQlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOworCQlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9IHBCc3MtPkNhcGFiaWxpdHlJbmZvOworCQlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwQnNzLT5Cc3NpZCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcEJzcy0+UFRTRiwgNCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgcEJzcy0+VFRTRiwgOCk7CisKKwkJLy8gNS4gQ3JlYXRlIFNTSUQKKwkJKnBEZXN0KysgPSAweDAwOworCQkqcERlc3QrKyA9IHBCc3MtPlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlNzaWRMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlNzaWRMZW4pOworCisJCS8vIDYuIENyZWF0ZSBTdXBwb3J0UmF0ZXMKKwkJKnBEZXN0KysgPSAweDAxOworCQkqcERlc3QrKyA9IHBCc3MtPlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5TdXBSYXRlLCBwQnNzLT5TdXBSYXRlTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlN1cFJhdGVMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlN1cFJhdGVMZW4pOworCisJCS8vIDcuIERTIFBhcmFtZXRlcgorCQkqcERlc3QrKyA9IDB4MDM7CisJCSpwRGVzdCsrID0gMTsKKwkJKnBEZXN0KysgPSBwQnNzLT5DaGFubmVsOworCQlMZW5ndGggICs9IDM7CisKKwkJLy8gOC4gSUJTUyBwYXJhbWV0ZXIgaWYgcHJlc2VudHMKKwkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQl7CisJCQkqcERlc3QrKyA9IDB4MDY7CisJCQkqcERlc3QrKyA9IDI7CisJCQkqKFBVU0hPUlQpIHBEZXN0ID0gcEJzcy0+QXRpbVdpbjsKKwkJCXBEZXN0ICAgKz0gMjsKKwkJCUxlbmd0aCAgKz0gNDsKKwkJfQorCisJCS8vIDkuIFVwZGF0ZSBsZW5ndGggZmllbGQsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7CisKKwkJLy8gMTAuIFVwZGF0ZSB0b3RhbCBmcmFtZSBzaXplCisJCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hc3NvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXNzb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzZkYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXNzb2MuYwpAQCAtMCwwICsxLDIwMzkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXNzb2MuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJXcGFUZW1wbGF0ZVtdID0geworCQkweGRkLCAJCQkJCS8vIFdQQSBJRQorCQkweDE2LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJXcGEyVGVtcGxhdGVbXSA9IHsKKwkJMHgzMCwJCQkJCS8vIFJTTiBJRQorCQkweDE0LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gZ3JvdXAgY2lwaGVyLCBUS0lQCisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBwYWlyd2lzZQorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gYXV0aGVudGljYXRpb24KKwkJMHgwMCwgMHgwMCwJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJfTsKKworVUNIQVIJQ2N4MkllSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAyfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisJUGFyYW1ldGVyczoKKwkJUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCBUcmFucywgTUFYX0FTU09DX1NUQVRFLCBNQVhfQVNTT0NfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFTU09DX0lETEUsIEFTU09DX01BQ0hJTkVfQkFTRSk7CisKKwkvLyBmaXJzdCBjb2x1bW4KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVSZWFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEaXNhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCisJLy8gc2Vjb25kIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCS8vCisJLy8gUGF0Y2ggM0NvbSBBUCBNT2RlOjNDUldFNDU0RzcyCisJLy8gV2Ugc2VuZCBBc3NvYyByZXF1ZXN0IGZyYW1lIHRvIHRoaXMgQVAsIGl0IGFsd2F5cyBzZW5kIFJlYXNzb2MgUnNwIG5vdCBBc3NvY2lhdGUgUnNwLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXNzb2NUaW1lb3V0QWN0aW9uKTsKKworCS8vIHRoaXJkIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJLy8KKwkvLyBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9SRUFTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVhc3NvY1RpbWVvdXRBY3Rpb24pOworCisJLy8gZm91cnRoIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKURpc2Fzc29jVGltZW91dEFjdGlvbik7CisKKwkvLyBpbml0aWFsaXplIHRoZSB0aW1lcgorCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgYXNzb2NpYXRpb24gdGltZW91dCwgdGhpcyBmdW5jdGlvbgorCQl3aWxsIGJlIGNhbGxlZCBhbmQgaXQgd2lsbCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgcmVhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7CisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURpc2Fzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBkaXNhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWxtZSBhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIEFkYXB0ZXIgcG9pbnRlcgorCQlFbGVtIC0gTUxNRSBRdWV1ZSBFbGVtZW50CisJUHJlOgorCQl0aGUgc3RhdGlvbiBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGFuZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgY29uZmlnCisJCQktIyBTU0lECisJCQktIyBzdXBwb3J0ZWQgcmF0ZXMgYW5kIHRoZWlyIGxlbmd0aAorCQkJLSMgbGlzdGVuIGludGVydmFsIChBZGFwdGVyLT5TdGFDZmcuZGVmYXVsdF9saXN0ZW5fY291bnQpCisJCQktIyBUcmFuc21pdCBwb3dlciAgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKwlQb3N0ICA6CisJCS0jIEFuIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgaXMgZ2VuZXJhdGVkIGFuZCBzZW50IHRvIHRoZSBhaXIKKwkJLSMgQXNzb2NpYXRpb24gdGltZXIgc3RhcnRzCisJCS0jIEFzc29jaWF0aW9uIHN0YXRlIC0+IEFTU09DX1dBSVRfUlNQCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCUFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUxpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0Q2tpcEllID0gSUVfQUlST05FVF9DS0lQOworCVVDSEFSCQkJQWlyb25ldENraXBMZW4gPSBDS0lQX05FR09USUFUSU9OX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NJRSA9IElFX0FJUk9ORVRfSVBBRERSRVNTOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0xlbiA9IEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXJbQUlST05FVF9JUEFERFJFU1NfTEVOR1RIXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyBjaGVjayBzYW5pdHkgZmlyc3QKKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwkJLy8gQXNzb2NpYXRpb24gZG9uJ3QgbmVlZCB0byByZXBvcnQgTUFDIGFkZHJlc3MKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkF2YWlsYWJsZVJlcXVlc3RGaXhlZElFcyA9CisJCQlORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgfCBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTDsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9IExpc3RlbkludHY7CisJCS8vIE9ubHkgcmVhc3NvY2lhdGUgbmVlZCB0aGlzCisJCS8vQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkN1cnJlbnRBUEFkZHJlc3MsIEFwQWRkcik7CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXF1ZXN0SUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKKwkJLy8gRmlyc3QgYWRkIFNTSUQKKwkJVmFySWVzT2Zmc2V0ID0gMDsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCisJCS8vIFNlY29uZCBhZGQgU3VwcG9ydGVkIHJhdGVzCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlN1cFJhdGVJZSwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKKwkJLy8gRW5kIEFkZCBieSBKYW1lcworCisgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQorICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisKKwkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKKwkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCisJCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAJcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gSFQKKwkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIEh0TGVuOworCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKKwkJCXsKKwkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkgICAgICAgIEhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbik7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKyAgICAgICAgCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgJlRtcExlbiwKKyAgICAgICAgCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisgICAgICAgIAkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorICAgICAgICAJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwmSHRDYXBhYmlsaXR5VG1wLAorICAgICAgICAJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCQkJeworCQkJCVFCU1NfU1RBX0lORk9fUEFSTSBRb3NJbmZvOworCisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sIHNpemVvZihRQlNTX1NUQV9JTkZPX1BBUk0pKTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKKwkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7CisJCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQl9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy8gVGhlIFBhcmFtZXRlciBTZXQgQ291bnQgaXMgc2V0IHRvIKGnMKGoIGluIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcworICAgICAgICAgICAgICAgIC8vIFdtZUllWzhdIHw9IChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgJiAweDBmKTsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQkvLworCQkvLyBMZXQgV1BBKCMyMjEpIEVsZW1lbnQgSUQgb24gdGhlIGVuZCBvZiB0aGlzIGFzc29jaWF0aW9uIGZyYW1lLgorCQkvLyBPdGhlcndpc2Ugc29tZSBBUCB3aWxsIGZhaWwgb24gcGFyc2luZyBFbGVtZW50IElEIGFuZCBzZXQgc3RhdHVzIGZhaWwgb24gQXNzb2MgUnNwLgorCQkvLyBGb3IgZXhhbXBsZTogUHV0IFZlbmRvciBTcGVjaWZpYyBJRSBvbiB0aGUgZnJvbnQgb2YgV1BBIElFLgorCQkvLyBUaGlzIGhhcHBlbnMgb24gQVAgKE1vZGVsIE5vOkxpbmtzeXMgV1JLNTRHKQorCQkvLworCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCSkKKyAgICAgICAgICAgICkKKwkJeworCQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQl7CisJCQkJUlNOSWUgPSBJRV9XUEEyOworCQkJfQorCisgICAgICAgICAgICAJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgV1BBIFBNSyBjYWNoZSBsaXN0CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCXsKKwkJCSAgICBJTlQgICAgIGlkeDsKKyAgICAgICAgICAgICAgICBCT09MRUFOIEZvdW5kUE1LID0gRkFMU0U7CisJCQkJLy8gU2VhcmNoIGNoY2hlZCBQTUtJRCwgYXBwZW5kIGl0IGlmIGV4aXN0ZWQKKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFBNS0lEX05POyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQXBBZGRyLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRCwgNikpCisJCQkJCXsKKwkJCQkJCUZvdW5kUE1LID0gVFJVRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKEZvdW5kUE1LKQorCQkJCXsKKwkJCQkJLy8gU2V0IFBNSyBudW1iZXIKKwkJCQkJKihQVVNIT1JUKSAmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbl0gPSAxOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDJdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRCwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKz0gMTg7CisJCQkJfQorCQkJfQorCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCisJCQkJICAgICAgICAgICAgICAJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkllLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAkJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgCUVORF9PRl9BUkdTKTsKKwkJCX0KKworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQl7CisJICAgICAgICAgICAgLy8gQXBwZW5kIFZhcmlhYmxlIElFCisJICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmUlNOSWUsIDEpOworCSAgICAgICAgICAgIFZhckllc09mZnNldCArPSAxOworCSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgMSk7CisJICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7CisJCQl9CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwkJCVZhckllc09mZnNldCArPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisKKwkJCS8vIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoCisJCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKKwkJfQorCisJCS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQorCQlDa2lwRmxhZyA9IHBBZC0+U3RhQ2ZnLkNraXBGbGFnOworCQlpZiAoQ2tpcEZsYWcgIT0gMCkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7CisJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbMl0gPSAweDY2OworCQkJLy8gTWFrZSBpdCB0cnkgS1AgJiBNSUMsIHNpbmNlIHdlIGhhdmUgdG8gZm9sbG93IHRoZSByZXN1bHQgZnJvbSBBc3NvY1JzcAorCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKKwkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDFdID0gMHgyMjsKKwkJCUNraXBGbGFnID0gMHgxODsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAJJnRtcCwKKwkJCQkJCTEsCQkJCQkJICAJCSZBaXJvbmV0Q2tpcEllLAorCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwTGVuLAorCQkJCQkJQWlyb25ldENraXBMZW4sIAkJICAJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlciwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCS8vIEFkZCBDQ1ggdjIgcmVxdWVzdCBpZiBDQ1gyIGFkbWluIHN0YXRlIGlzIG9uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQorCQl7CisKKwkJCS8vCisJCQkvLyBBZGQgQWlyb25ldElQQWRkcmVzc0lFIGZvciBDaXNjbyBDQ1ggMi5YCisJCQkvLyBBZGQgQ0NYIFZlcnNpb24KKwkJCS8vCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0lFLAorCQkJCQkJMSwJCQkJCQkJJkFpcm9uZXRJUEFkZHJlc3NMZW4sCisJCQkJCQlBaXJvbmV0SVBBZGRyZXNzTGVuLAkJQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKKwkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKKwkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkvLworCQkJLy8gQWRkIENpcGhlclN1aXRlIENDS00gb3IgTGVhcFRraXAgaWYgc2V0dGluZy4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4sCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCQkvLyBUaGlyZCBhZGQgUlNOCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4pOyAvL1NhdmUgQ2lwaGVyU3VpdGUKKwkJCQlWYXJJZXNPZmZzZXQgKz0gQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47CisJCQl9CisJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQlDaXBoZXJTdWl0ZUNDWFRraXBMZW4sCSAgICBDaXBoZXJTdWl0ZUNDWFRraXAsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkJLy8gVGhpcmQgYWRkIFJTTgorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgQ2lwaGVyU3VpdGVDQ1hUa2lwLCBDaXBoZXJTdWl0ZUNDWFRraXBMZW4pOworCQkJCVZhckllc09mZnNldCArPSBDaXBoZXJTdWl0ZUNDWFRraXBMZW47CisJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OworCQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RJRUxlbmd0aCA9IFZhckllc09mZnNldDsKKworCQkJLy8gT2Zmc2V0UmVzcG9uc2VJRXMgZm9sbG93IFJlcVZhcklFCisJCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVzcG9uc2VJRXMgPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pICsgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisJCQkvLyBFbmQgQWRkIGJ5IEphbWVzCisJCX0KKworCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIFRpbWVvdXQpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX1dBSVRfUlNQOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHISEhISEhIFxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltbG1lIHJlYXNzb2MgcmVxIGhhbmRsaW5nIHByb2NlZHVyZQorCVBhcmFtZXRlcnM6CisJCUVsZW0gLQorCVByZToKKwkJLSMgU1NJRCAgKEFkYXB0ZXItPlN0YUNmZy5zc2lkW10pCisJCS0jIEJTU0lEIChBUCBhZGRyZXNzLCBBZGFwdGVyLT5TdGFDZmcuYnNzaWQpCisJCS0jIFN1cHBvcnRlZCByYXRlcyAoQWRhcHRlci0+U3RhQ2ZnLnN1cHBvcnRlZF9yYXRlc1tdKQorCQktIyBTdXBwb3J0ZWQgcmF0ZXMgbGVuZ3RoIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzX2xlbikKKwkJLSMgVHggcG93ZXIgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lUmVhc3NvY1JlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJCQlBcEFkZHJbNl07CisJSEVBREVSXzgwMl8xMQlSZWFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvLCBMaXN0ZW5JbnR2OworCVVMT05HCQkJVGltZW91dDsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQl0bXA7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisvL0NDWCAyLlgKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwlVQ0hBUgkJCUNraXBGbGFnOworCVVDSEFSCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIXTsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwSWUgPSBJRV9BSVJPTkVUX0NLSVA7CisJVUNIQVIJCQlBaXJvbmV0Q2tpcExlbiA9IENLSVBfTkVHT1RJQVRJT05fTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0lFID0gSUVfQUlST05FVF9JUEFERFJFU1M7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzTGVuID0gQUlST05FVF9JUEFERFJFU1NfTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0J1ZmZlcltBSVJPTkVUX0lQQUREUkVTU19MRU5HVEhdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDB9OworCVVDSEFSCQkJQWlyb25ldENDS01SZWFzc29jSUUgPSBJRV9BSVJPTkVUX0NDS01SRUFTU09DOworCVVDSEFSCQkJQWlyb25ldENDS01SZWFzc29jTGVuID0gQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXJbQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEhdOworCVVDSEFSCQkJQWlyb25ldE9VSVtdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDB9OworCVVDSEFSCQkJTUlDTU5bMTZdOworCVVDSEFSCQkJQ2FsY01pY0J1ZmZlcls4MF07CisJVUxPTkcJCQlDYWxjTWljQnVmZmVyTGVuID0gMDsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisJLy8gdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBhc3NvY2lhdGlvbgorCWVsc2UgaWYoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQorCXsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVSZWFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisKKwkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFwQWRkcik7CisKKwkJLy8gbWFrZSBmcmFtZSwgdXNlIGJzc2lkIGFzIHRoZSBBUCBhZGRyZXNzPz8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIFJFLUFTU09DIHJlcXVlc3QuLi5cbiIpKTsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZSZWFzc29jSGRyLCBTVUJUWVBFX1JFQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZSZWFzc29jSGRyLAorCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmTGlzdGVuSW50diwKKwkJCQkJCSAgTUFDX0FERFJfTEVOLCAgICAgICAgICAgICBBcEFkZHIsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwJICAgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisJCQl7CisJCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOworCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKKwkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBIVAorCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgSHRMZW47CisJCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQorCQkJeworCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQl7CisJCQlDa2lwRmxhZyA9IHBBZC0+U3RhQ2ZnLkNraXBGbGFnOwkvLyBXZSBoYXZlIHVwZGF0ZSB0aGF0IGF0IFBlZXJCZWFjb25BdEpvaW5SZXF1ZXN0KCkKKwkJCWlmIChDa2lwRmxhZyAhPSAwKQorCQkJeworCQkJCU5kaXNaZXJvTWVtb3J5KENraXBOZWdvdGlhdGlvbkJ1ZmZlciwgQ0tJUF9ORUdPVElBVElPTl9MRU5HVEgpOworCQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlclsyXSA9IDB4NjY7CisJCQkJLy8gTWFrZSBpdCB0cnkgS1AgJiBNSUMsIHNpbmNlIHdlIGhhdmUgdG8gZm9sbG93IHRoZSByZXN1bHQgZnJvbSBBc3NvY1JzcAorCQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcls4XSA9IDB4MTg7CisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMV0gPSAweDIyOworCisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZ0bXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q2tpcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENraXBMZW4sCisJCQkJCQkJCQlBaXJvbmV0Q2tpcExlbiwgICAgICAgICAgICAgICAgIENraXBOZWdvdGlhdGlvbkJ1ZmZlciwKKwkJCQkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisJCQl9CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0SVBBZGRyZXNzSUUsCisJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldElQQWRkcmVzc0xlbiwKKwkJCQkJCQlBaXJvbmV0SVBBZGRyZXNzTGVuLCAgICAgICAgICAgIEFpcm9uZXRJUEFkZHJlc3NCdWZmZXIsCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkvLworCQkJLy8gVGhlIFJOIGlzIGluY3JlbWVudGVkIGJlZm9yZSBlYWNoIHJlYXNzb2NpYXRpb24gcmVxdWVzdC4KKwkJCS8vCisJCQlwQWQtPlN0YUNmZy5DQ0tNUk4rKzsKKwkJCS8vCisJCQkvLyBDYWxjdWxhdGUgTUlDID0gaG1hYy1tZDUoa3JrLCBTVEEtSUR8QlNTSUR8UlNOSUV8VFNGfFJOKTsKKwkJCS8vCisJCQlDT1BZX01BQ19BRERSKENhbGNNaWNCdWZmZXIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ2FsY01pY0J1ZmZlckxlbiA9IE1BQ19BRERSX0xFTjsKKwkJCUNPUFlfTUFDX0FERFIoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IE1BQ19BRERSX0xFTjsKKwkJCU5kaXNNb3ZlTWVtb3J5KENhbGNNaWNCdWZmZXIgKyBDYWxjTWljQnVmZmVyTGVuLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4pOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KENhbGNNaWNCdWZmZXIgKyBDYWxjTWljQnVmZmVyTGVuLCAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCwgc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXApKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXApOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIChQVUNIQVIpJnBBZC0+U3RhQ2ZnLkNDS01STiwgc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01STikpOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTVJOKTsKKwkJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLktSSywgTEVOX0VBUF9NSUNLLCBDYWxjTWljQnVmZmVyLCBDYWxjTWljQnVmZmVyTGVuLCBNSUNNTik7CisKKwkJCS8vCisJCQkvLyBmaWxsIHVwIENDS00gcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGVsZW1lbnQKKwkJCS8vCisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIsIEFpcm9uZXRPVUksIDQpOworCQkJTmRpc01vdmVNZW1vcnkoQWlyb25ldENDS01SZWFzc29jQnVmZmVyICsgNCwgKFBVQ0hBUikmcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCwgOCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKyAxMiwgKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkNDS01STiwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKzE2LCBNSUNNTiwgOCk7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENDS01SZWFzc29jSUUsCisJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDQ0tNUmVhc3NvY0xlbiwKKwkJCQkJCQlBaXJvbmV0Q0NLTVJlYXNzb2NMZW4sICBBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIsCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4sQ2lwaGVyU3VpdGVDaXNjb0NDS00sCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJLy8gQWRkIENDWCB2MiByZXF1ZXN0IGlmIENDWDIgYWRtaW4gc3RhdGUgaXMgb24KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisJCXsKKwkJCS8vCisJCQkvLyBBZGQgQ0NYIFZlcnNpb24KKwkJCS8vCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkllLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJMZW4sCisJCQkJCQlDY3gyTGVuLAkJCQkgICAgQ2N4MkllSW5mbywKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBSRUFTU09DX1dBSVRfUlNQOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhIFxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlVcHBlciBsYXllciBpc3N1ZXMgZGlzYXNzb2MgcmVxdWVzdAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUIHBEaXNhc3NvY1JlcTsKKwlIRUFERVJfODAyXzExICAgICAgICAgRGlzYXNzb2NIZHI7CisJUEhFQURFUl84MDJfMTEgICAgICAgIHBEaXNhc3NvY0hkcjsKKwlQVUNIQVIgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUxPTkcgICAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlORElTX1NUQVRVUyAgICAgICAgICAgTlN0YXR1czsKKwlCT09MRUFOICAgICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUxPTkcgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSAwOworCVVTSE9SVCAgICAgICAgICAgICAgICBTdGF0dXM7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZSwKKwlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJeworCQlVQ0hBUiBpOworCisJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCXsKKwkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJfQorCQl9CisKKwkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJeworCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkvLyBza2lwIHNhbml0eSBjaGVjaworCXBEaXNhc3NvY1JlcSA9IChQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKShFbGVtLT5Nc2cpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKworCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBESVNBU1NPQyByZXF1ZXN0W0JTU0lEOjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAoUmVhc29uPSVkKVxuIiwKKwkJCQlwRGlzYXNzb2NSZXEtPkFkZHJbMF0sIHBEaXNhc3NvY1JlcS0+QWRkclsxXSwgcERpc2Fzc29jUmVxLT5BZGRyWzJdLAorCQkJCXBEaXNhc3NvY1JlcS0+QWRkclszXSwgcERpc2Fzc29jUmVxLT5BZGRyWzRdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNV0sIHBEaXNhc3NvY1JlcS0+UmVhc29uKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcERpc2Fzc29jUmVxLT5BZGRyLCBwRGlzYXNzb2NSZXEtPkFkZHIpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmcERpc2Fzc29jUmVxLT5SZWFzb24sCisJCQkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJLy8gVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAKKwkvLyBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lCisJLy8gVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4KKwlwRGlzYXNzb2NIZHIgPSAoUEhFQURFUl84MDJfMTEpcE91dEJ1ZmZlcjsKKwlwRGlzYXNzb2NIZHItPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0RFQVVUSDsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlwQWQtPlN0YUNmZy5EaXNhc3NvY1JlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKKwlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwRGlzYXNzb2NSZXEtPkFkZHIpOworCisJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IERJU0FTU09DX1dBSVRfUlNQOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwl7CisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7CisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIGFzc29jIHJzcCBiYWNrCisJUGFyYW1ldGVyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgU3RhdHVzLCBBaWQ7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7CisJRURDQV9QQVJNICAgICBFZGNhUGFybTsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCWlmIChQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAorCQkmSHRDYXBhYmlsaXR5LCZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/CisJCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BBY3Rpb24oKTpBU1NPQyAtIHJlY2VpdmUgQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJaWYoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKKwkJCXsKKwkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworCQkJCVVDSEFSCQkJaWR4OworCisJCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKwkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCisJCQkgICAgeworCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKKwkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOworCQkJICAgIH0KKworCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKKwkJCSAgICB7CisJCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkgICAgfQorCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKworCQkJCVN0YUFkZE1hY1RhYmxlRW50cnkocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBDYXBhYmlsaXR5SW5mbyk7CisKKwkJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJeworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5UeFNFUSwgNCk7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkdJVlswXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBUUlVFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRmFpbGUgb24gQXNzb2NpYXRpb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBjb2RlCisJCQkJLy8gSXMgdGhhdCBhIFJvZ3VlIEFQPworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCWlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKFN0YXR1cyA9PSBNTE1FX0FMR19OT1RfU1VQUE9SVCkpCisJCQkJeyAvL1Bvc3NpYmx5IFJvZ3VlIEFQCisJCQkJCVJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl9CisJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyQXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIHJlYXNzb2MgcnNwCisJUGFyYW1ldHJzOgorCQlFbGVtIC0gTUxNRSBtZXNzYWdlIGNudGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgU3RhdHVzOworCVVTSE9SVCAgICAgIEFpZDsKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgIENraXBGbGFnOworCUJPT0xFQU4gICAgIFRpbWVyQ2FuY2VsbGVkOworCUVEQ0FfUEFSTSAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwJJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIC8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPworCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIHJlY2VpdmUgUkVBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJfQorCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCWlmIChDQ0tNQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikgPT0gVFJVRSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisJCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJCXsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkNLSVBNSUMsIDQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzJdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQkJfQorCisJCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQ0NLTUFzc29jUnNwU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQorCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJSZWFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwcm9jZWR1cmVzIG9uIElFRUUgODAyLjExLzE5OTkgcC4zNzYKKwlQYXJhbWV0cnM6CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NQb3N0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEFkZHIyLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVU0hPUlQgQWlkLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQoreworCVVMT05HIElkeDsKKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0lORlJBOworCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQWRkcjIpOworCXBBZC0+TWxtZUF1eC5BaWQgPSBBaWQ7CisJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uCisJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKKwkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7CisJCXBFZGNhUGFybS0+QWlmc25bMl0gPSAyOworCQlwRWRjYVBhcm0tPkFpZnNuWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWluWzBdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21pblsxXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtaW5bMl0gPSAzOworCQlwRWRjYVBhcm0tPkN3bWluWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWF4WzBdID0gMTA7CisJCXBFZGNhUGFybS0+Q3dtYXhbMV0gPSAxMDsKKwkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOworCisJCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOworCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKKwkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OworCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7CisKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCisJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKKwlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisKKwkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQorCXsKKwkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gIEFQLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgorCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIEluaXQgdmFyaWFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisKKwkJLy8gU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkKKwkJeworCQkJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCQkJVVNIT1JUICAgICAgICAgICAgICBsZW47CisJCQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisKKwkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7CisJCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisKKwkJCXdoaWxlIChsZW4gPiAwKQorCQkJeworCQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCQkJLy8gRm9yIFdQQS9XUEFQU0sKKwkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJCX0KKwkJCQkvLyBGb3IgV1BBMi9XUEEyUFNLCisJCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBMiBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCQl9CisKKwkJCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0KKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBubyBSU05fSUUgXG4iKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloZXhfZHVtcCgiUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlsZWZ0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwLjM3NAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgIFJlYXNvbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKClcbiIpKTsKKwlpZihQZWVyRGlzYXNzb2NTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBSZWFzb24gPSAlZFxuIiwgUmVhc29uKSk7CisJCWlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpCisJCXsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorCQkJCS8vIFdlIHNob3VsZCBjYW5jZWwgaXQgaWYgdXNpbmcgTEVBUAorCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKwkJCQkvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEFzc29jaWF0aW9uLgorCQkJCWlmICgocEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSAhPSBMRUFQX0lETEUpICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJeworCQkJCQlSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKwkJCQl9CisJCQl9CisjZW5kaWYJLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkvLworCQkJLy8gR2V0IEN1cnJlbnQgU3lzdGVtIHRpbWUgYW5kIFR1cm4gb24gQWRqYWNlbnRBUFJlcG9ydAorCQkJLy8KKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBMaW5rRG93blRpbWUpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJTGlua0Rvd24ocEFkLCBUUlVFKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwkJCXsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBhc3NvYyB0aW1lb3V0CisJUGFyYW1ldGVyczoKKwkJRWxtZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEFzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgcmVhc3NvYyB0aW1lb3V0CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUmVhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgZGlzYXNzb2MgdGltZW91dAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlblJlYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJpZ2h0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwYWdlIDM3NAorCU5vdGU6CisJCVRoaXMgZXZlbnQgc2hvdWxkIG5ldmVyIGNhdXNlIEFTU09DIHN0YXRlIG1hY2hpbmUgcGVyZm9ybSBzdGF0ZQorCQl0cmFuc2l0aW9uLCBhbmQgaGFzIG5vIHJlbGF0aW9uc2hpcCB3aXRoIENOVEwgbWFjaGluZS4gU28gd2Ugc2VwYXJhdGUKKwkJdGhpcyByb3V0aW5lIGFzIGEgc2VydmljZSBvdXRzaWRlIG9mIEFTU09DIHN0YXRlIHRyYW5zaXRpb24gdGFibGUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2xzM2VyckFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCVVTSE9SVCAgICAgICAgICAgICAgICBSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBDbGFzcyAzIEVycm9yLCBTZW5kIERJU0FTU09DIGZyYW1lXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcEFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcEFkZHIpOworfQorCisgLyoKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgRGVzY3JpcHRpb246CisJCSBTd2l0Y2ggYmV0d2VlbiBXRVAgYW5kIENLSVAgdXBvbiBuZXcgYXNzb2NpYXRpb24gdXAuCisJIFBhcmFtZXRlcnM6CisKKwkgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKi8KK1ZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50ICAgICAgICAgICAgaTsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyAgY3NyMTsKKworCS8vIGlmIEtQIGlzIHJlcXVpcmVkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBXRVAKKwkvLyB0byBDS0lQLiBlbHNlIHJlbWFpbiBhcyBXRVAKKwlpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSkKKwl7CisJCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7CisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7CisKKwkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAorCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKwkJfQorCX0KKworCS8vIGVsc2UgaWYgS1AgTk9UIGludXNlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gQ0tJUAorCS8vIHRvIFdFUC4KKwllbHNlCisJeworCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKKwkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEtTk9ORSwgbXVzdCB1cGRhdGUgQ2lwaGVyQWxnLgorCQkvLyBCZWNhdXNlIHRoZSBPSURfODAyXzExX1dFUF9TVEFUVVMgd2FzIGJlZW4gc2V0IGFmdGVyIE9JRF84MDJfMTFfQUREX0tFWQorCQkvLyBhbmQgQ2lwaGVyQWxnIHdpbGwgYmUgQ0lQSEVSX05PTkUgYnkgV2luZG93cyBaZXJvQ29uZmlnLgorCQkvLyBTbyB3ZSBuZWVkIHRvIHVwZGF0ZSBDaXBoZXJBbGcgYWZ0ZXIgY29ubmVjdC4KKwkJLy8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiAhPSAwKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQl7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQkJeworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQl9CisJCQl9CisKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnOworCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZzsKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKKwl9Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIHVuc2lnbmVkIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisgICAgaWYgKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3KSA8PSBJV19DVVNUT01fTUFYKQorICAgIHsKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk9fUmVxSUVzPSIpOworCSAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20rMTcsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworCSAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3OworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9SRVFJRV9FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3ID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCisgICAgeworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisgICAgICAgIG1lbWNweShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkFTU09DUkVRSUUsICZ3cnF1LCBjdXN0b20pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKyNlbHNlCisgICAgaWYgKCgocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNykgPD0gSVdfQ1VTVE9NX01BWCkKKyAgICB7CisgICAgICAgIFVDSEFSICAgaWR4OworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTc7CisgICAgICAgIHNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKKyAgICAgICAgZm9yIChpZHg9MDsgaWR4PHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzW2lkeF0pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTcgPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAorCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gIFVTSE9SVCAgICAgICAgCQlDYXBhYmlsaXR5SW5mbykKK3sKKwlVQ0hBUiAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJaWYgKEFESE9DX09OKHBBZCkpCisJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKyAgICB7CisgICAgICAgIGNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKyAgICAgICAgY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworICAgICAgICBjYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKyAgICAgICAgY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworICAgICAgICBjYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworICAgICAgICBjYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKyAgICAgICAgY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIDExbiBvbmx5CisJaWYgKCgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSYmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCWlmICghcEVudHJ5KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWlmIChwRW50cnkpCisJeworCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCWlmICgoTWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSB8fAorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikpCisJCXsKKwkJCXBFbnRyeS0+UmF0ZUxlbiA9IDQ7CisJCQlpZiAoTWF4U3VwcG9ydGVkUmF0ZSA+PSBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKwkJfQorCQllbHNlCisJCQlwRW50cnktPlJhdGVMZW4gPSAxMjsKKworCQlwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gMDsKKwkJcEVudHJ5LT5NaW5IVFBoeU1vZGUud29yZCA9IDA7CisJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSAwOworCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBNYXhTdXBwb3J0ZWRSYXRlOworCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJfQorCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm87CisJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOworCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJeworCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJQ0hBUiAgICBpOworCisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJaWYgKChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJfQorCisJCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCX0KKworCQkvLyAzKjMKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pCisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5UeEJGID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CisKKwkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJCXsKKwkJCWogPSBpLzg7CisJCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBIdENhcGFiaWxpdHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQkJeworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaT09MCkKKwkJCQlicmVhazsKKwkJfQorCisKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQl7CisJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQl9CisJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJeworCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJfQorCQl9CisKKwkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHM7CisJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gRkFMU0UpKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CisJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQykKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJaWYgKHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCX0KKwllbHNlCisJeworCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbklzTGVnYWN5ID0gVFJVRTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisKKwkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjaworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCXsKKwkJUFVDSEFSCQkJCQlwVGFibGU7CisJCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCisJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCS8vIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LgorCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCX0KKworCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKKwlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX0FVVEhfT1BFTjsKKwlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisgICAgeworICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZiOGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGguYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhdXRoLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkyMDA0LTktMwkJcG9ydGluZyBmcm9tIFJUMjUwMAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBhdXRoZW50aWNhdGUgc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gcG9pbnRlciB0byB0aGUgYXV0aCBzdGF0ZSBtYWNoaW5lCisgICAgTm90ZToKKyAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGlzCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfUkVRX0lETEUgICAgICAgICAgIEFVVEhfV0FJVF9TRVEyICAgICAgICAgICAgICAgICAgIEFVVEhfV0FJVF9TRVE0CisgICAgTVQyX01MTUVfQVVUSF9SRVEgICBtbG1lX2F1dGhfcmVxX2FjdGlvbiAgICBpbnZhbGlkX3N0YXRlX3doZW5fYXV0aCAgICAgICAgICBpbnZhbGlkX3N0YXRlX3doZW5fYXV0aAorICAgIE1UMl9QRUVSX0FVVEhfRVZFTiAgZHJvcCAgICAgICAgICAgICAgICAgICAgcGVlcl9hdXRoX2V2ZW5fYXRfc2VxMl9hY3Rpb24gICAgcGVlcl9hdXRoX2V2ZW5fYXRfc2VxNF9hY3Rpb24KKyAgICBNVDJfQVVUSF9USU1FT1VUICAgIERyb3AgICAgICAgICAgICAgICAgICAgIGF1dGhfdGltZW91dF9hY3Rpb24gICAgICAgICAgICAgIGF1dGhfdGltZW91dF9hY3Rpb24KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3ZvaWQgQXV0aFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9TVEFURSwgTUFYX0FVVEhfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUkVRX0lETEUsIEFVVEhfTUFDSElORV9CQVNFKTsKKworICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUkVRX0lETEUsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBdXRoUmVxQWN0aW9uKTsKKworICAgIC8vIHRoZSBzZWNvbmQgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7CisKKyAgICAvLyB0aGUgdGhpcmQgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7CisKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRpbWVyIHRocmVhZCB3aGVuIGF1dGggdGltZXIgZXhwaXJlcworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEF1dGhUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEggLSBBdXRoVGltZW91dFxuIikpOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJLy8gc2VuZCBhIGRlLWF1dGggdG8gcmVzZXQgQVAncyBzdGF0ZSBtYWNoaW5lIChQYXRjaCBBUC1EaXI2MzUpCisJaWYgKHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPT0gQVVUSF9XQUlUX1NFUTIpCisJCUNsczJlcnJBY3Rpb24ocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCisKKyAgICBNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfVElNRU9VVCwgMCwgTlVMTCk7CisgICAgUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVUNIQVIgICAgICAgICAgICAgIEFkZHJbNl07CisgICAgVVNIT1JUICAgICAgICAgICAgIEFsZywgU2VxLCBTdGF0dXM7CisgICAgVUxPTkcgICAgICAgICAgICAgIFRpbWVvdXQ7CisgICAgSEVBREVSXzgwMl8xMSAgICAgIEF1dGhIZHI7CisgICAgQk9PTEVBTiAgICAgICAgICAgIFRpbWVyQ2FuY2VsbGVkOworICAgIE5ESVNfU1RBVFVTICAgICAgICBOU3RhdHVzOworICAgIFBVQ0hBUiAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCisJLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCisJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCisJeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKyAgICBlbHNlIGlmKE1sbWVBdXRoUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIsICZUaW1lb3V0LCAmQWxnKSkKKyAgICB7CisgICAgICAgIC8vIHJlc2V0IHRpbWVyCisgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKyAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIpOworICAgICAgICBwQWQtPk1sbWVBdXguQWxnICA9IEFsZzsKKyAgICAgICAgU2VxID0gMTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCisgICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIE1sbWVBdXRoUmVxQWN0aW9uKEFsZzolZCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIiwgQWxnKSk7CisgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMxIChBbGc9JWQpLi4uXG4iLCBBbGcpKTsKKyAgICAgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmQXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgICAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKyAgICAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIFRpbWVvdXQpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UX0VSUigoIkFVVEggLSBNbG1lQXV0aFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWRcbiIpKTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgICBTZXEsIFN0YXR1cywgUmVtb3RlU3RhdHVzLCBBbGc7CisgICAgVUNIQVIgICAgICAgICBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworICAgIFVDSEFSICAgICAgICAgQ3lwZXJDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU4gKyA4ICsgOF07CisgICAgVUNIQVIgICAgICAgICBFbGVtZW50WzJdOworICAgIEhFQURFUl84MDJfMTEgQXV0aEhkcjsKKyAgICBCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgU3RhdHVzMjsKKworICAgIGlmIChQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQorICAgIHsKKyAgICAgICAgaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjMiB0byBtZSAoQWxnPSVkLCBTdGF0dXM9JWQpXG4iLCBBbGcsIFN0YXR1cykpOworICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisgICAgICAgICAgICBpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBdXRoZW50aWNhdGlvbiBNb2RlICJMRUFQIiBoYXMgYWxsb3cgZm9yIENDWCAxLlgKKyAgICAgICAgICAgICAgICBpZiAoKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCQkJfHwgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkJKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5MZWFwTWFjaGluZS5DdXJyU3RhdGUgPSBMRUFQX0lETEU7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAyLiBzaGFyZWQga2V5LCBuZWVkIHRvIGJlIGNoYWxsZW5nZWQKKyAgICAgICAgICAgICAgICAgICAgU2VxKys7CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKworCQkJCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czIgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisgICAgICAgICAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzMuLi5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgICAgICAgICAgICAgICAgICBBdXRoSGRyLkZDLldlcCA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgY2hhbGxlbmdlIHRleHQgJiBhdXRoIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgIFJUTVBJbml0V2VwRW5naW5lKAorICAgICAgICAgICAgICAgICAgICAJcEFkLAorICAgICAgICAgICAgICAgICAgICAJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgICAgICAgICAgICAgIAlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKyAgICAgICAgICAgICAgICAgICAgCUN5cGVyQ2hsZ1RleHQpOworCisJCQkJCUFsZyA9IGNwdTJsZTE2KCooVVNIT1JUICopJkFsZyk7CisJCQkJCVNlcSA9IGNwdTJsZTE2KCooVVNIT1JUICopJlNlcSk7CisJCQkJCVJlbW90ZVN0YXR1cz0gY3B1MmxlMTYoKihVU0hPUlQgKikmUmVtb3RlU3RhdHVzKTsKKworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmQWxnLCBDeXBlckNobGdUZXh0ICsgNCwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZTZXEsIEN5cGVyQ2hsZ1RleHQgKyA2LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlJlbW90ZVN0YXR1cywgQ3lwZXJDaGxnVGV4dCArIDgsIDIpOworCQkJCQlFbGVtZW50WzBdID0gMTY7CisJCQkJCUVsZW1lbnRbMV0gPSAxMjg7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIEVsZW1lbnQsIEN5cGVyQ2hsZ1RleHQgKyAxMCwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIENobGdUZXh0LCBDeXBlckNobGdUZXh0ICsgMTIsIDEyOCk7CisJCQkJCVJUTVBTZXRJQ1YocEFkLCBDeXBlckNobGdUZXh0ICsgMTQwKTsKKyAgICAgICAgICAgICAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9URVhUX0xFTiArIDE2LCAgICAgQ3lwZXJDaGxnVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgICAgICAgICAgICAgICAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKyAgICAgICAgICAgICAgICAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgICAgICAgICAgICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIEFVVEhfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1dBSVRfU0VRNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0ludmFsaWQgQXV0aGVudGljYXRpb24gcG9zc2libGUgcm9ndWUgQVAKKyAgICAgICAgICAgICAgICAgICAgLy9BZGQgdGhpcyBBcCB0byBSb2d1ZSBBUC4KKyAgICAgICAgICAgICAgICAgICAgUm9ndWVBcFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TdGFDZmcuUm9ndWVBcFRhYiwgQWRkcjIsIExFQVBfUkVBU09OX0lOVkFMSURfQVVUSCk7CisJCQkJfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKyAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhTYW5pdHkoKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgICBBbGcsIFNlcSwgU3RhdHVzOworICAgIENIQVIgICAgICAgICAgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKKyAgICBCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCisgICAgaWYoUGVlckF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsIENobGdUZXh0KSkKKyAgICB7CisgICAgICAgIGlmKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjNCB0byBtZVxuIikpOworICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisgICAgICAgICAgICBpZiAoU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKKyAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKKyAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKKyAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKyAgICBVU0hPUlQgICAgICAgIFN0YXR1czsKKworICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisKKyAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gTWxtZURlYXV0aFJlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBERS1BVVRIIHJlcXVlc3QgKFJlYXNvbj0lZCkuLi5cbiIsIHBJbmZvLT5SZWFzb24pKTsKKyAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBJbmZvLT5BZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZwSW5mby0+UmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gcEluZm8tPlJlYXNvbjsKKyAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEluZm8tPkFkZHIpOworICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVU0hPUlQgU3RhdHVzOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBBdXRoVGltZW91dEFjdGlvblxuIikpOworICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgIFN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVVNIT1JUIFN0YXR1czsKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gSW52YWxpZFN0YXRlV2hlbkF1dGggKHN0YXRlPSVsZCksIHJlc2V0IEFVVEggc3RhdGUgbWFjaGluZVxuIiwgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSkpOworICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU29tZSBTVEEvQVAKKyAgICBOb3RlOgorICAgICAgICBUaGlzIGFjdGlvbiBzaG91bGQgbmV2ZXIgdHJpZ2dlciBBVVRIIHN0YXRlIHRyYW5zaXRpb24sIHRoZXJlZm9yZSB3ZQorICAgICAgICBzZXBhcmF0ZSBpdCBmcm9tIEFVVEggc3RhdGUgbWFjaGluZSwgYW5kIG1ha2UgaXQgYXMgYSBzdGFuZGFsb25lIHNlcnZpY2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBDbHMyZXJyQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBVQ0hBUiBwQWRkcikKK3sKKyAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKKyAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKyAgICBVU0hPUlQgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMyRVJSOworCisgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQ2xhc3MgMiBlcnJvciwgU2VuZCBERUFVVEggZnJhbWUuLi5cbiIpKTsKKyAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBSZWFzb247CisgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBBZGRyKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hdXRoX3JzcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXV0aF9yc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTNjMmQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXV0aF9yc3AuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhdXRoX3JzcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJMjAwNC0xMC0xCQljb3B5IGZyb20gUlQyNTYwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCBwcm9jZWR1cmUKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTbSAtIHRoZSBzdGF0ZSBtYWNoaW5lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQU1RBVEVfTUFDSElORSBTbSwKKyAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKyAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfUlNQX1NUQVRFLCBNQVhfQVVUSF9SU1BfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUlNQX0lETEUsIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSk7CisKKyAgICAvLyBjb2x1bW4gMQorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfSURMRSwgTVQyX1BFRVJfREVBVVRILCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEZWF1dGhBY3Rpb24pOworCisgICAgLy8gY29sdW1uIDIKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUlNQX1dBSVRfQ0hBTCwgTVQyX1BFRVJfREVBVVRILCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEZWF1dGhBY3Rpb24pOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gVVNIT1JUIEFsZywKKyAgICBJTiBVU0hPUlQgU2VxLAorICAgIElOIFVTSE9SVCBSZWFzb24sCisgICAgSU4gVVNIT1JUIFN0YXR1cykKK3sKKyAgICBIRUFERVJfODAyXzExICAgICBBdXRoSGRyOworICAgIFVMT05HICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKyAgICBQVUNIQVIgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgICAgICBOU3RhdHVzOworCisgICAgaWYgKFJlYXNvbiAhPSBNTE1FX1NVQ0NFU1MpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyIEFVVEggZmFpbC4uLlxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisJLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisgICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBBVVRIIHJlc3BvbnNlIChzZXEjMikuLi5cbiIpKTsKKyAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgcEhkcjgwMjExLT5BZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZBdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkFsZywKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZTZXEsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBNTE1FX1FVRVVFX0VMRU0gRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgIFJlYXNvbjsKKworICAgIGlmIChQZWVyRGVhdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmUmVhc29uKSkKKyAgICB7CisgICAgICAgIGlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSF9SU1AgLSByZWNlaXZlIERFLUFVVEggZnJvbSBvdXIgQVAgKFJlYXNvbj0lZClcbiIsIFJlYXNvbikpOworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisgICAgICAgICAgICBMaW5rRG93bihwQWQsIFRSVUUpOworCisgICAgICAgICAgICAvLyBBdXRoZW50aWNhdGlvbiBNb2RlIENpc2NvX0xFQVAgaGFzIHN0YXJ0IGEgdGltZXIKKyAgICAgICAgICAgIC8vIFdlIHNob3VsZCBjYW5jZWwgaXQgaWYgdXNpbmcgTEVBUAorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5MZWFwQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworICAgICAgICAgICAgICAgIC8vQ2hlY2sgaXMgaXQgbWFjaCB0aGUgTEVBUCBBdXRoZW50aWNhdGlvbiBmYWlsZWQgYXMgcG9zc2libGUgYSBSb2d1ZSBBUAorICAgICAgICAgICAgICAgIC8vb24gaXQncyBQb3J0U2VjdXJlZCBub3QgZXF1YWwgdG8gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQgd2hpbGUgcHJvY2VzcyB0aGUgQXV0aGVudGljYXRvbi4KKyAgICAgICAgICAgICAgICBpZiAoKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSAmJiAocEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSAhPSBMRUFQX0lETEUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUm9ndWVBcFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TdGFDZmcuUm9ndWVBcFRhYiwgQWRkcjIsIExFQVBfUkVBU09OX0FVVEhfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSF9SU1AgLSBQZWVyRGVhdXRoQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Nvbm5lY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Nvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTMxNDBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvY29ubmVjdC5jCkBAIC0wLDAgKzEsMjgyMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljb25uZWN0LmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkJMjAwNC0wOC0wOAkJCU1ham9yIG1vZGlmaWNhdGlvbiBmcm9tIFJUMjU2MAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdID0geworCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZVRraXApIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZUFlc1tdID0geworCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZUFlc0xlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVXcGFOb25lQWVzKSAvIHNpemVvZihVQ0hBUikpOworCisvLyBUaGUgZm9sbG93aW5nIE1BQ1JPIGlzIGNhbGxlZCBhZnRlciAxLiBzdGFydGluZyBhbiBuZXcgSUJTUywgMi4gc3VjY2VzZnVsbHkgSk9JTiBhbiBJQlNTLAorLy8gb3IgMy4gc3VjY2VzZnVsbHkgQVNTT0NJQVRFIHRvIGEgQlNTLCA0LiBzdWNjZXNzZnVsbHkgUkVfQVNTT0NJQVRFIHRvIGEgQlNTCisvLyBBbGwgc2V0dGluZ3Mgc3VjY2Vzc2Z1bHkgbmVnb3RpYXRlZCBmdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lcyBiZWNvbWUgZmluYWwgc2V0dGluZ3MKKy8vIGFuZCBhcmUgY29waWVkIHRvIHBBZC0+U3RhQWN0aXZlCisjZGVmaW5lIENPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5Tc2lkTGVuID0gKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5Db21tb25DZmcuU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWQsIChfcEFkKS0+TWxtZUF1eC5Tc2lkTGVuKTsgXAorCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5Db21tb25DZmcuQnNzaWQsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5DaGFubmVsID0gKF9wQWQpLT5NbG1lQXV4LkNoYW5uZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAoX3BBZCktPk1sbWVBdXguQ2VudHJhbENoYW5uZWw7ICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkFpZCA9IChfcEFkKS0+TWxtZUF1eC5BaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5BdGltV2luID0gKF9wQWQpLT5NbG1lQXV4LkF0aW1XaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8gPSAoX3BBZCktPk1sbWVBdXguQ2FwYWJpbGl0eUluZm87ICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChfcEFkKS0+TWxtZUF1eC5CZWFjb25QZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5DZnBNYXhEdXJhdGlvbiA9IChfcEFkKS0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbjsgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQ2ZwUGVyaW9kID0gKF9wQWQpLT5NbG1lQXV4LkNmcFBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZSwgKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGVMZW4pO1wKKwkoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGUsIChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlTGVuKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sICYoX3BBZCktPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LCAmKF9wQWQpLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUWJzc0xvYWQsICYoX3BBZCktPk1sbWVBdXguQVBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7XAorCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgIFwKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFpZCA9IChfcEFkKS0+TWxtZUF1eC5BaWQ7ICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSAoX3BBZCktPlN0YUNmZy5QYWlyQ2lwaGVyO1wKKwlDT1BZX01BQ19BRERSKChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQnNzSWQsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7XAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUmF0ZUxlbiA9IChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyAoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlTGVuO1wKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBNbG1lQ250bEluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGRpZmZlcnMgZnJvbSBvdGhlciBzdGF0ZSBtYWNoaW5lcywgdGhlIGludGVyZmFjZQorCS8vIGZvbGxvd3MgdGhlIHN0YW5kYXJkIGludGVyZmFjZQorCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJc3dpdGNoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUpCisJeworCQljYXNlIENOVExfSURMRToKKwkJCQlDbnRsSWRsZVByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9ESVNBU1NPQzoKKwkJCUNudGxXYWl0RGlzYXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfSk9JTjoKKwkJCUNudGxXYWl0Sm9pblByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCS8vIENOVExfV0FJVF9SRUFTU09DIGlzIHRoZSBvbmx5IHN0YXRlIGluIENOVEwgbWFjaGluZSB0aGF0IGRvZXMKKwkJLy8gbm90IHRyaWdnZXJlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5ICJSVE1QU2V0SW5mb3JtYXRpb24oT0lEX3h4eCkiLgorCQkvLyBUaGVyZWZvcmUgbm90IHByb3RlY3RlZCBieSBORElTJ3MgIm9ubHkgb25lIG91dHN0YW5kaW5nIE9JRCByZXF1ZXN0IgorCQkvLyBydWxlLiBXaGljaCBtZWFucyBORElTIG1heSBTRVQgT0lEIGluIHRoZSBtaWRkbGUgb2YgUk9BTWluZyBhdHRlbXB0cy4KKwkJLy8gQ3VycmVudCBhcHByb2FjaCBpcyB0byBibG9jayBuZXcgU0VUIHJlcXVlc3QgYXQgUlRNUFNldEluZm9ybWF0aW9uKCkKKwkJLy8gd2hlbiBDbnRsTWFjaGluZS5DdXJyU3RhdGUgaXMgbm90IENOVExfSURMRQorCQljYXNlIENOVExfV0FJVF9SRUFTU09DOgorCQkJQ250bFdhaXRSZWFzc29jUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTlRMX1dBSVRfU1RBUlQ6CisJCQlDbnRsV2FpdFN0YXJ0UHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0FVVEg6CisJCQlDbnRsV2FpdEF1dGhQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfQVVUSDI6CisJCQlDbnRsV2FpdEF1dGhQcm9jMihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0FTU09DOgorCQkJQ250bFdhaXRBc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU46CisJCQlpZihFbGVtLT5Nc2dUeXBlID09IE1UMl9TQ0FOX0NPTkYpCisJCQl7CisJCQkJLy8gUmVzdW1lIFR4UmluZyBhZnRlciBTQ0FOSU5HIGNvbXBsZXRlLiBXZSBob3BlIHRoZSBvdXQtb2Ytc2VydmljZSB0aW1lCisJCQkJLy8gd29uJ3QgYmUgdG9vIGxvbmcgdG8gbGV0IHVwcGVyIGxheWVyIHRpbWUtb3V0IHRoZSB3YWl0aW5nIGZyYW1lcworCQkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgIT0gTVNSTl9UWVBFX1VOVVNFRCkKKwkJCQl7CisJCQkJCS8vIENpc2NvIHNjYW4gcmVxdWVzdCBpcyBmaW5pc2hlZCwgcHJlcGFyZSBiZWFjb24gcmVwb3J0CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIDAsIE5VTEwpOworCQkJCX0KKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTZXQgTEVEIHN0YXR1cyB0byBwcmV2aW91cyBzdGF0dXMuCisJCQkJLy8KKwkJCQlpZiAocEFkLT5iTGVkT25TY2FubmluZykKKwkJCQl7CisJCQkJCXBBZC0+YkxlZE9uU2Nhbm5pbmcgPSBGQUxTRTsKKwkJCQkJUlRNUFNldExFRChwQWQsIHBBZC0+TGVkU3RhdHVzKTsKKwkJCQl9CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJCS8vIEFQIHNlbnQgYSAyMDQwQ29leGlzdGVuY2UgbWdtdCBmcmFtZSwgdGhlbiBzdGF0aW9uIHBlcmZvcm0gYSBzY2FuLCBhbmQgdGhlbiBzZW5kIGJhY2sgdGhlIHJlc3BvbmUuCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkluZm9SZXEgPT0gMSkKKwkJCQl7CisJCQkJCVVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkocEFkLCBCU1NJRF9XQ0lELCBUUlVFKTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOgorCQkJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0RJU0FTU09DX0NPTkYpCisJCQl7CisJCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIFJUMjg3MAorCQkvLworCQkvLyBUaGlzIHN0YXRlIGlzIGZvciB0aGF0IHdlIHdhbnQgdG8gY29ubmVjdCB0byBhbiBBUCBidXQKKwkJLy8gaXQgZGlkbid0IGZpbmQgb24gQlNTIExpc3QgdGFibGUuIFNvIHdlIG5lZWQgdG8gc2NhbiB0aGUgYWlyIGZpcnN0LAorCQkvLyBhZnRlciB0aGF0IHdlIGNhbiB0cnkgdG8gY29ubmVjdCB0byB0aGUgZGVzaXJlZCBBUCBpZiBhdmFpbGFibGUuCisJCS8vCisJCWNhc2UgQ05UTF9XQUlUX1NDQU5fRk9SX0NPTk5FQ1Q6CisJCQlpZihFbGVtLT5Nc2dUeXBlID09IE1UMl9TQ0FOX0NPTkYpCisJCQl7CisJCQkJLy8gUmVzdW1lIFR4UmluZyBhZnRlciBTQ0FOSU5HIGNvbXBsZXRlLiBXZSBob3BlIHRoZSBvdXQtb2Ytc2VydmljZSB0aW1lCisJCQkJLy8gd29uJ3QgYmUgdG9vIGxvbmcgdG8gbGV0IHVwcGVyIGxheWVyIHRpbWUtb3V0IHRoZSB3YWl0aW5nIGZyYW1lcworCQkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisjaWZkZWYgQ0NYX1NVUFBPUlQKKwkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKQorCQkJCXsKKwkJCQkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJCQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJCQkJfQorI2VuZGlmIC8vIENDWF9TVVBQT1JUIC8vCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKworCQkJCS8vCisJCQkJLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QgdG8uCisJCQkJLy8KKwkJCQlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisJCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID4gMCkKKwkJCQl7CisJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UX0VSUigoIiFFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwgRWxlbS0+TXNnVHlwZSkpOworCQkJYnJlYWs7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxJZGxlUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCXN3aXRjaChFbGVtLT5Nc2dUeXBlKQorCXsKKwkJY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKwkJCUNudGxPaWRSVEJzc2lkUHJvYyhwQWQsRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorCQkJQ250bE9pZFNjYW5Qcm9jKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYoQVRFX09OKHBBZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisgICAgCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorICAgIAkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisgICAgCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworICAgICAgICAgICAgfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNVDJfTUxNRV9ST0FNSU5HX1JFUToKKwkJCUNudGxNbG1lUm9hbWluZ1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUU6CisgICAgICAgICAgICBXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUocEFkLCBFbGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJQ250bE9pZERMU1NldHVwUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgaW4gQ250bElkbGVQcm9jKE1zZ1R5cGU9JWxkKVxuIixFbGVtLT5Nc2dUeXBlKSk7CisJCQlicmVhazsKKwl9Cit9CisKK1ZPSUQgQ250bE9pZFNjYW5Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOworCVVMT05HICAgICAgICAgICAgICAgICAgICAgIEJzc0lkeCA9IEJTU19OT1RfRk9VTkQ7CisJQlNTX0VOVFJZICAgICAgICAgICAgICAgICAgQ3VyckJzczsKKworI2lmZGVmIFJBTElOS19BVEUKKy8qIERpc2FibGUgc2Nhbm5pbmcgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCS8vIHJlY29yZCBjdXJyZW50IEJTUyBpZiBuZXR3b3JrIGlzIGNvbm5lY3RlZC4KKwkvLyAyMDAzLTItMTMgZG8gbm90IGluY2x1ZGUgY3VycmVudCBJQlNTIGlmIHRoaXMgaXMgdGhlIG9ubHkgU1RBIGluIHRoaXMgSUJTUy4KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJQnNzSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmQ3VyckJzcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCX0KKwl9CisKKwkvLyBjbGVhbiB1cCBwcmV2aW91cyBTQ0FOIHJlc3VsdCwgYWRkIGN1cnJlbnQgQlNTIGJhY2sgdG8gdGFibGUgaWYgYW55CisJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKKwl7CisJCS8vIERESyBOb3RlOiBJZiB0aGUgTklDIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQlNTSUQgYW5kIFNTSUQKKwkJLy8gICAgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgbGlzdCBvZiBCU1NJRHMgZ2VuZXJhdGVkIGJ5IHRoaXMgc2NhbiwgdGhlCisJCS8vICAgIEJTU0lEIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBCU1NJRCBhbmQgU1NJRCBzaG91bGQgYmUKKwkJLy8gICAgYXBwZW5kZWQgdG8gdGhlIGxpc3Qgb2YgQlNTSURzIGluIHRoZSBOSUMncyBkYXRhYmFzZS4KKwkJLy8gVG8gZW5zdXJlIHRoaXMsIHdlIGFwcGVuZCB0aGlzIEJTUyBhcyB0aGUgZmlyc3QgZW50cnkgaW4gU0NBTiByZXN1bHQKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVswXSwgJkN1cnJCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJcEFkLT5TY2FuVGFiLkJzc05yID0gMTsKKwl9CisKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgIiIsIDAsIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsCisJCXNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLCB1c2VyIGRlc2lyZWQgU1NJRCBzaG91bGQgYWxyZWFkeSBiZWVuCisJCXJlY29yZGVkIGluIENvbW1vbkNmZy5Tc2lkW10KKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkU3NpZFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICogRWxlbSkKK3sKKwlQTkRJU184MDJfMTFfU1NJRCAgICAgICAgICBwT2lkU3NpZCA9IChORElTXzgwMl8xMV9TU0lEICopRWxlbS0+TXNnOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgIERpc2Fzc29jUmVxOworCVVMT05HCQkJCQkgICBOb3c7CisKKwkvLyBTdGVwIDEuIHJlY29yZCB0aGUgZGVzaXJlZCB1c2VyIHNldHRpbmdzIHRvIE1sbWVBdXgKKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcE9pZFNzaWQtPlNzaWQsIHBPaWRTc2lkLT5Tc2lkTGVuZ3RoKTsKKwlwQWQtPk1sbWVBdXguU3NpZExlbiA9IChVQ0hBUilwT2lkU3NpZC0+U3NpZExlbmd0aDsKKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOworCisKKwkvLworCS8vIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4KKwkvLworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisKKwkvLyBzdGVwIDIuIGZpbmQgYWxsIG1hdGNoaW5nIEJTUyBpbiB0aGUgbGFzdGVzdCBTQ0FOIHJlc3VsdCAoaW5Cc3NUYWIpCisJLy8gICAgJiBsb2cgdGhlbSBpbnRvIE1sbWVBdXguU3NpZEJzc1RhYiBmb3IgbGF0ZXItb24gaXRlcmF0aW9uLiBTb3J0IGJ5IFJTU0kgb3JkZXIKKwlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtICVkIEJTUyBvZiAlZCBCU1MgbWF0Y2ggdGhlIGRlc2lyZSAoJWQpU1NJRCAtICVzXG4iLAorCQkJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIsIHBBZC0+U2NhblRhYi5Cc3NOciwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKKwkJKHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZExlbikgJiYKKwkJTmRpc0VxdWFsTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pICYmCisJCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Cc3NpZCkpCisJeworCQkvLyBDYXNlIDEuIGFscmVhZHkgY29ubmVjdGVkIHdpdGggYW4gQVAgd2hvIGhhcyB0aGUgZGVzaXJlZCBTU0lECisJCS8vICAgICAgICAgd2l0aCBoaWdoZXN0IFJTU0kKKworCQkvLyBBZGQgY2hlY2tpbmcgTW9kZSAiTEVBUCIgZm9yIENDWCAxLjAKKwkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkgfHwgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkgKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCS8vIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8KKwkJCS8vICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkLT5iQ29uZmlnQ2hhbmdlZCA9PSBUUlVFKQorCQl7CisJCQkvLyBjYXNlIDEuMiBJbXBvcnRhbnQgQ29uZmlnIGhhcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29ubmVjdCB0byB0aGUgc2FtZSBBUAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgQmVjYXVzZSBjb25maWcgY2hhbmdlZC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIGNhc2UgMS4zLiBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NJRCB3aXRoIGhpZ2hlc3QgUlNTSS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBhbHJlYWR5IHdpdGggdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX1NTSUQgcmVxdWVzdFxuIikpOworCQkJLy8KKwkJCS8vIChIQ1QgMTIuMSkgMWNfd2xhbl9tZWRpYWV2ZW50cyByZXF1aXJlZAorCQkJLy8gbWVkaWEgY29ubmVjdCBldmVudHMgYXJlIGluZGljYXRlZCB3aGVuIGFzc29jaWF0aW5nIHdpdGggdGhlIHNhbWUgQVAKKwkJCS8vCisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAorCQkJCS8vIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4KKwkJCQkvLworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCQkJfQorCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZSBpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisJCS8vCisJCS8vIEZvciBSVDYxCisJCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCisJCS8vIFJUNjEgbWF5IGxvc3QgU1NJRCwgYW5kIG5vdCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGFuZCB3aWxsIGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYnkgQXV0b3JlY29ubmVjdAorCQkvLyBCdXQgbWVkaWEgc3RhdHVzIGlzIGNvbm5lY3RlZCwgc28gdGhlIFNTSUQgbm90IHJlcG9ydCBjb3JyZWN0bHkuCisJCS8vCisJCWlmICghU1NJRF9FUVVBTChwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pKQorCQl7CisJCQkvLworCQkJLy8gRGlmZmVyZW50IFNTSUQgbWVhbnMgbm90IFJvYW1pbmcgY2FzZSwgc28gd2UgbGV0IExpbmtEb3duKCkgdG8gSW5kaWNhdGUgYSBkaXNjb25uZWN0IGV2ZW50LgorCQkJLy8KKwkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisJCX0KKwkJLy8gY2FzZSAyLiBhY3RpdmUgSU5GUkEgYXNzb2NpYXRpb24gZXhpc3RlbnQKKwkJLy8gICAgcm9hbWluZyBpcyBkb25lIHdpdGhpbiBtaW5pcG9ydCBkcml2ZXIsIG5vdGhpbmcgdG8gZG8gd2l0aCBjb25maWd1cmF0aW9uCisJCS8vICAgIHV0aWxpdHkuIHNvIHVwb24gYSBuZXcgU0VUKE9JRF84MDJfMTFfU1NJRCkgaXMgcmVjZWl2ZWQsIHdlIGp1c3QKKwkJLy8gICAgZGlzYXNzb2NpYXRlIHdpdGggdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCwKKwkJLy8gICAgdGhlbiBwZXJmb3JtIGEgbmV3IGFzc29jaWF0aW9uIHdpdGggdGhpcyBuZXcgU1NJRCwgbm8gbWF0dGVyIHRoZQorCQkvLyAgICBuZXcvb2xkIFNTSUQgYXJlIHRoZSBzYW1lIG9yIG5vdC4KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwl9CisJZWxzZQorCXsKKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKKwkJfQorCisJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPT0gMCkgJiYKKwkJCShwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgorCQkJKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKKwkJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikgPT0gVFJVRSkKKwkJCSkKKwkJeworCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgc2NhblxuIikpOworCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCit7CisJVUxPTkcgICAgICAgQnNzSWR4OworCVBVQ0hBUiAgICAgIHBPaWRCc3NpZCA9IChQVUNIQVIpRWxlbS0+TXNnOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKKwlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICAgICAgSm9pblJlcTsKKworI2lmZGVmIFJBTElOS19BVEUKKy8qIE5vIG5lZWQgdG8gcGVyZm9ybSB0aGlzIHJvdXRpbmUgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvLyByZWNvcmQgdXNlciBkZXNpcmVkIHNldHRpbmdzCisJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBPaWRCc3NpZCk7CisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOworCisJLy8KKwkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCisJLy8KKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCisJLy8gZmluZCB0aGUgZGVzaXJlZCBCU1MgaW4gdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCB0YWJsZQorCUJzc0lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBPaWRCc3NpZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChCc3NJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBCU1NJRCBub3QgZm91bmQuIHJlcGx5IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRFxuIikpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQlyZXR1cm47CisJfQorCisJLy8gY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PworCS8vIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lCisJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSAxOworCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXSwgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisKKwkvL3BBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW47CisJLy9OZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW4pOworCisJLy8gQWRkIFNTSUQgaW50byBNbG1lQXV4IGZvciBzaXRlIHN1cmV5IGpvaW5pbmcgaGlkZGVuIFNTSUQKKwkvL3BBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKKwkvL05kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisKKwkvLyAyMDAyLTExLTI2IHNraXAgdGhlIGZvbGxvd2luZyBjaGVja2luZy4gaS5lLiBpZiB1c2VyIHdhbnRzIHRvIHJlLWNvbm5lY3QgdG8gc2FtZSBBUAorCS8vICAgd2UganVzdCBmb2xsb3cgbm9ybWFsIHByb2NlZHVyZS4gVGhlIHJlYXNvbiBvZiB1c2VyIGRvaW5nIHRoaXMgbWF5IGJlY2F1c2UgaGUvc2hlIGNoYW5nZWQKKwkvLyAgIEFQIHRvIGFub3RoZXIgY2hhbm5lbCwgYnV0IHdlIHN0aWxsIHJlY2VpdmVkIEJFQUNPTiBmcm9tIGl0IHRodXMgZG9uJ3QgY2xhaW0gTGluayBEb3duLgorCS8vICAgU2luY2UgdXNlciBrbm93cyBoZSdzIGNoYW5nZWQgQVAgY2hhbm5lbCwgaGUnbGwgcmUtY29ubmVjdCBhZ2Fpbi4gQnkgc2tpcHBpbmcgdGhlIGZvbGxvd2luZworCS8vICAgY2hlY2tpbmcsIHdlJ2xsIGRpc2Fzc29jaWF0ZSB0aGVuIHJlLWRvIG5vcm1hbCBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgQVAgYXQgdGhlIG5ldyBjaGFubmVsLgorCS8vIDIwMDMtMS02IFJlLWVuYWJsZSB0aGlzIGZlYXR1cmUgYmFzZWQgb24gbWljcm9zb2Z0IHJlcXVpcmVtZW50IHdoaWNoIHByZWZlciBub3QgdG8gcmUtZG8KKwkvLyAgIGNvbm5lY3Rpb24gd2hlbiBzZXR0aW5nIHRoZSBzYW1lIEJTU0lELgorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKKwkJTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIHBPaWRCc3NpZCkpCisJeworCQkvLyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBCU1NJRCwgZ28gYmFjayB0byBpZGxlIHN0YXRlIGRpcmVjdGx5CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBhbHJlYWR5IGluIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9CU1NJRCByZXF1ZXN0XG4iKSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl9CisJZWxzZQorCXsKKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKwkJCS8vIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CisJCQl9CisKKwkJCS8vIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cworCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCisJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKKwkJCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKKwkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKKwkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLkdyb3VwQ2lwaGVyOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7CisJCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKKwkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJCS8vIFJTTiBjYXBhYmlsaXR5CisJCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKKwkJCX0KKworCQkJLy8gU2V0IE1peCBjaXBoZXIgZmxhZworCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKKwkJCWlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCisJCQl7CisJCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKKwkJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCQl9CisJCQkvLyBObyBhY3RpdmUgYXNzb2NpYXRpb24sIGpvaW4gdGhlIEJTUyBpbW1lZGlhdGVseQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW5pbmcgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBPaWRCc3NpZFswXSxwT2lkQnNzaWRbMV0scE9pZEJzc2lkWzJdLHBPaWRCc3NpZFszXSxwT2lkQnNzaWRbNF0scE9pZEJzc2lkWzVdKSk7CisKKwkJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBwQWQtPk1sbWVBdXguQnNzSWR4KTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwgJkpvaW5SZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47CisJCX0KKwl9Cit9CisKKy8vIFJvYW1pbmcgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgcmVxdWVzdCB0cmlnZ2VyaW5nIENOVEwgc3RhdGUgbWFjaGluZQorLy8gZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb2VyYXRpb25zCisvLyBoYXBwZW4gaW4gc2VxdWVuY2UsIGJlY2F1c2Ugbm8gb3RoZXIgU0VUIE9JRCB3aWxsIGJlIHNlbnQgdG8gdGhpcyBkZXZpY2UKKy8vIHVudGlsIHRoZSB0aGUgcHJldmlvdXMgU0VUIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoc3VjY2Vzc2Z1bCBvIGZhaWxlZCkuCisvLyBTbywgaG93IGRvIHdlIHF1YXJhbnRlZSB0aGlzIFJPQU1JTkcgcmVxdWVzdCB3b24ndCBjb3JydXB0IG90aGVyICJTRVQgT0lEIj8KKy8vIG9yIGJlZW4gY29ycnVwdGVkIGJ5IG90aGVyICJTRVQgT0lEIj8KKy8vCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJLy8gVE9ETzoKKwkvLyBBUCBpbiBkaWZmZXJlbnQgY2hhbm5lbCBtYXkgc2hvdyBsb3dlciBSU1NJIHRoYW4gYWN0dWFsIHZhbHVlPz8KKwkvLyBzaG91bGQgd2UgYWRkIGEgd2VpZ2h0aW5nIGZhY3RvciB0byBjb21wZW5zYXRlIGl0PworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIFJvYW1pbmcgaW4gTWxtZUF1eC5Sb2FtVGFiLi4uXG4iKSk7CisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsICZwQWQtPk1sbWVBdXguUm9hbVRhYiwgc2l6ZW9mKHBBZC0+TWxtZUF1eC5Sb2FtVGFiKSk7CisJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcjsKKworCUJzc1RhYmxlU29ydEJ5UnNzaSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIpOworCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkRExTU2V0dXBQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQUlRfODAyXzExX0RMUwkJcERMUyA9IChQUlRfODAyXzExX0RMUylFbGVtLT5Nc2c7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCUlOVAkJCQkJaTsKKwlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1VOU1BFQ0lGWTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIChPSUQgc2V0ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggVmFsaWQ9JWQsIFN0YXR1cz0lZCwgVGltZU91dD0lZCwgQ291bnREb3duVGltZXI9JWQpXG4iLAorCQlwRExTLT5NYWNBZGRyWzBdLCBwRExTLT5NYWNBZGRyWzFdLCBwRExTLT5NYWNBZGRyWzJdLCBwRExTLT5NYWNBZGRyWzNdLCBwRExTLT5NYWNBZGRyWzRdLCBwRExTLT5NYWNBZGRyWzVdLAorCQlwRExTLT5WYWxpZCwgcERMUy0+U3RhdHVzLCBwRExTLT5UaW1lT3V0LCBwRExTLT5Db3VudERvd25UaW1lcikpOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJLy8gRExTIHdpbGwgbm90IGJlIHN1cHBvcnRlZCB3aGVuIEFkaG9jIG1vZGUKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCShwRExTLT5UaW1lT3V0ID09IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpICYmIE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDEuIFNhbWUgc2V0dGluZywganVzdCBkcm9wIGl0CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gc2V0dGluZyB1bmNoYW5nZWRcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCFwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gMi4gRGlzYWJsZSBETFMgbGluayBjYXNlLCBqdXN0IHRlYXIgZG93biBETFMgbGluaworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIHN0YXJ0IHRlYXIgZG93biBwcm9jZWR1cmVcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKChpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlkpICYmIHBETFMtPlZhbGlkICYmICFwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkKKwkJCXsKKwkJCQkvLyAzLiBFbmFibGUgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcERMUywgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKworCQkJCS8vVXBkYXRlIGNvdW50ZG93biB0aW1lcgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHNldHVwIGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKChpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlkpICYmIHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJiAhTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gNC4gdXBkYXRlIG1hYyBjYXNlLCB0ZWFyIGRvd24gb2xkIERMUyBhbmQgc2V0dXAgbmV3IERMUworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcERMUywgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHRlYXIgZG93biBhbmQgcmVzdGFydCBjYXNlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IHBETFMtPlRpbWVPdXQpKQorCQkJeworCQkJCS8vIDUuIHVwZGF0ZSB0aW1lb3V0IGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUgKG5vIHRlYXIgZG93bikKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0CT0gcERMUy0+VGltZU91dDsKKwkJCQkvL1VwZGF0ZSBjb3VudGRvd24gdGltZXIKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyB1cGRhdGUgdGltZW91dCBjYXNlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgorCQkJCShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgIT0gRExTX0ZJTklTSCkgJiYgTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gNi4gcmUtc2V0dXAgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZSAobm8gdGVhciBkb3duKQorCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgcmV0cnkgc2V0dXAgcHJvY2VkdXJlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoIkNOVEwgLSBETFMgbm90IGNoYW5nZWQgaW4gZW50cnkgLSAlZCAtIFZhbGlkPSVkLCBTdGF0dXM9JWQsIFRpbWVPdXQ9JWRcbiIsCisJCQkJCWksIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXREaXNhc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWxcbiIpKTsKKworCSAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKworCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkvLyBjYXNlIDEuIG5vIG1hdGNoaW5nIEJTUywgYW5kIHVzZXIgd2FudHMgQURIT0MsIHNvIHdlIGp1c3Qgc3RhcnQgYSBuZXcgb25lCisJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnI9PTApICYmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBObyBtYXRjaGluZyBCU1MsIHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCQkvLyBjYXNlIDIuIHRyeSBlYWNoIG1hdGNoZWQgQlNTCisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0pPSU5fQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJLy8gMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUKKwkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQl7CisJCQkgICAgLy8KKwkJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKKwkJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCisJCQkJLy8KKwkJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkgICApCisJCQkJeworCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgSm9pbiBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbiB0aGUgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOworCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCX0KKwkJCS8vIDIuIGpvaW5lZCBhIG5ldyBJTkZSQSBuZXR3b3JrLCBzdGFydCBmcm9tIGF1dGhlbnRpY2F0aW9uCisJCQllbHNlCisJCQl7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJLy8gQWRkIEF1dGhNb2RlICJMRUFQIiBmb3IgQ0NYIDEuWAorCQkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJCXsKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQ0lTQ09fQXV0aE1vZGVMRUFQKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJCXsKKwkJCQkJLy8gZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwKKwkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKKwkJCQkJeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCQl9CisJCQkJfQorCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEg7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyAzLiBmYWlsZWQsIHRyeSBuZXh0IEJTUworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRTdGFydFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlc3VsdDsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9TVEFSVF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlc3VsdCwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZXN1bHQgPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCSAgICAvLworCQkJLy8gNUcgYmFuZHMgcnVsZXMgb2YgSmFwYW46CisJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCisJCQkvLworCQkJaWYgKCAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCSAgICkKKwkJCXsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBTdGFydCBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlyZXR1cm47CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSwgMTYpOworCQkJCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKworCQkJCWlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgorCQkJCQkocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCisJCQkJeworCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKKwkJCQkJCSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCisJCQkJeworCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQl7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCX0KKwkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJLy8gQmVmb3JlIHNlbmQgYmVhY29uLCBkcml2ZXIgbmVlZCBkbyByYWRhciBkZXRlY3Rpb24KKwkJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0ICkKKwkJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX1NJTEVOQ0VfTU9ERTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50ID0gMDsKKyNpZmRlZiBERlNfU1VQUE9SVAorCQkJCUJicFJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkKTsKKyNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gc3RhcnQgYSBuZXcgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFN0YXJ0IElCU1MgZmFpbC4gQlVHISEhISFcbiIpKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0QXV0aFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKKwkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCS8vaWYgQ0NLTSBpcyB0dXJuIG9uICwgdGhhdCdzIG1lYW4gRmFzdCBSZWF1dGhlbnRpY2F0aW9uCisJCQkJLy9Vc2UgQ0NLTSBSZWFzc29jaWF0aW9uIGluc3RlYWQgb2Ygbm9ybWFsIGFzc29jaWF0aW9uIGZvciBGYXN0IFJvYW1pbmcuCisJCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfUkVBU1NPQzsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVNTT0M7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBUaGlzIGZhaWwgbWF5IGJlY2F1c2Ugb2YgdGhlIEFQIGFscmVhZHkga2VlcCB1cyBpbiBpdHMgTUFDIHRhYmxlIHdpdGhvdXQKKwkJCS8vIGFnZWluZy1vdXQuIFRoZSBwcmV2aW91cyBhdXRoZW50aWNhdGlvbiBhdHRlbXB0IG11c3QgaGF2ZSBsZXQgaXQgcmVtb3ZlIHVzLgorCQkJLy8gc28gdHJ5IEF1dGhlbnRpY2F0aW9uIGFnYWluIG1heSBoZWxwLiBGb3IgRC1MaW5rIERXTC05MDBBUCsgY29tcGF0aWJpbGl0eS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBhZ2Fpbi4uLlxuIikpOworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy9BZGQgQXV0aE1vZGUgIkxFQVAiIGZvciBDQ1ggMS5YCisJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCXsKKwkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBDSVNDT19BdXRoTW9kZUxFQVApOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJeworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAorCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpCisJCQkJeworCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCX0KKwkJCX0KKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKKwkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vIFByb2Nlc3MgTEVBUCBmaXJzdCwgc2luY2UgaXQgdXNlIGRpZmZlcmVudCBjb250cm9sIHZhcmlhYmxlCisJCQkvLyBXZSBkb24ndCB3YW50IHRvIGFmZmVjdCBvdGhlciBwb3ZlbiBvcGVyYXRpb24KKwkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJeworCQkJCS8vIExFQVAgQXV0aCBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtICpMRUFQKiBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRvdGFsIG1hdGNoIEJTU0lEIFs9JWRdXG4iLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJgorCQkJCSAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBPUEVOIHN5c3RlbS4uLlxuIikpOworCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCBnaXZlIHVwOyB0cnkgbmV4dCBCU1NcbiIpKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOyAvLz8/Pz8/Pz8KKwkJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0QXNzb2NQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBSZWFzb247CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVNTT0NfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJTGlua1VwKHBBZCwgQlNTX0lORlJBKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCXsKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFzc29jaWF0aW9uIGZhaWxzIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdFJlYXNzb2NQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBSZXN1bHQ7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfUkVBU1NPQ19DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlc3VsdCwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZXN1bHQgPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQkvLworCQkJLy8gTkRJUyByZXF1aXJlcyBhIG5ldyBMaW5rIFVQIGluZGljYXRpb24gYnV0IG5vIExpbmsgRG93biBmb3IgUkUtQVNTT0MKKwkJCS8vCisJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOworCisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGFzc29jaWF0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSZS1hc3NvY2l0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyByZWFzc29jIGZhaWxlZCwgdHJ5IHRvIHBpY2sgbmV4dCBCU1MgaW4gdGhlIEJTUyBUYWJsZQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCQlwQWQtPk1sbWVBdXguUm9hbUlkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiMihwQWQpOworCQl9CisJfQorfQorCisKK1ZPSUQJQWRob2NUdXJuT25Rb3MoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkKQoreworI2RlZmluZSBBQzBfREVGX1RYT1AJCTAKKyNkZWZpbmUgQUMxX0RFRl9UWE9QCQkwCisjZGVmaW5lIEFDMl9ERUZfVFhPUAkJOTQKKyNkZWZpbmUgQUMzX0RFRl9UWE9QCQk0NworCisJLy8gVHVybiBvbiBRT3MgaWYgdXNlIEhUIHJhdGUuCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID09IEZBTFNFKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPSBUUlVFOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzBdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsxXSA9IDc7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMl0gPSAxOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzNdID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzBdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsxXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMl0gPSAzOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzNdID0gMjsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzBdID0gMTA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSA2OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzJdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFszXSA9IDM7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdICA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gID0gQUMyX0RFRl9UWE9QOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gQUMzX0RFRl9UWE9QOworCX0KKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIExpbmtVcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3NUeXBlKQoreworCVVMT05HCU5vdzsKKwlVSU5UMzIJRGF0YTsKKwlCT09MRUFOCUNhbmNlbGxlZDsKKwlVQ0hBUglWYWx1ZSA9IDAsIGlkeDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisKKwkvLworCS8vIEFTU09DIC0gRGlzYXNzb2NUaW1lb3V0QWN0aW9uCisJLy8gQ05UTCAtIERpcy1hc3NvY2lhdGUgc3VjY2Vzc2Z1bAorCS8vICEhISBMSU5LIERPV04gISEhCisJLy8gWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkKKwkvLworCS8vIFRvIHByZXZlbnQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uIHRvIGNhbGwgTGluayBkb3duIGFmdGVyIHdlIGxpbmsgdXAsCisJLy8gY2FuY2VsIHRoZSBEaXNhc3NvY1RpbWVyIG5vIG1hdHRlciB3aGF0IGl0IHN0YXJ0IG9yIG5vdC4KKwkvLworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAmQ2FuY2VsbGVkKTsKKworCUNPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJLy8gSXQncyBxdWl0ZSBkaWZmaWN1bHQgdG8gdGVsbCBpZiBhIG5ld2x5IGFkZGVkIEtFWSBpcyBXRVAgb3IgQ0tJUCB1bnRpbCBhIG5ldyBCU1MKKwkvLyBpcyBmb3JtZWQgKGVpdGhlciBBU1NPQy9SRS1BU1NPQyBkb25lIG9yIElCU1Mgc3RhcnRlZC4gTGlua1VQIHNob3VsZCBiZSBhIHNhZmUgcGxhY2UKKwkvLyB0byBleGFtaW5lIGlmIGNpcGhlciBhbGdvcml0aG0gc3dpdGNoaW5nIGlzIHJlcXVpcmVkLgorCS8vcnQyODYwYi4gRG9uJ3Qga25vdyB3aHkgbmVlZCB0aGlzCisJU3dpdGNoQmV0d2VlbldlcEFuZENraXAocEFkKTsKKworCisJaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJLy8gTm8gY2FycmllciBkZXRlY3Rpb24gd2hlbiBhZGhvYworCQkvLyBDYXJyaWVyRGV0ZWN0aW9uU3RvcChwQWQpOworCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkNEX1N0YXRlID0gQ0RfTk9STUFMOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJQWRob2NUdXJuT25Rb3MocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFBZGhvYyBMSU5LIFVQICEhISBcbiIgKSk7CisJfQorCWVsc2UKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFJbmZyYSBMSU5LIFVQICEhISBcbiIgKSk7CisJfQorCisJLy8gMyozCisJLy8gcmVzZXQgVHggYmVhbWZvcm1pbmcgYml0CisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCVZhbHVlICY9ICh+MHgwMSk7CisJVmFsdWUgfD0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gQ2hhbmdlIHRvIEFQIGNoYW5uZWwKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJeworCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlWYWx1ZSB8PSAweDEwOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKwkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSAmPSAweGZmZmZmZmZlOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworCX0KKwllbHNlIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKyAgICB7CisJICAgIC8vIE11c3QgdXNpbmcgNDBNSHouCisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVZhbHVlIHw9IDB4MTA7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7CisJCURhdGEgfD0gMHgxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCSAgICBWYWx1ZSB8PSAoMHgyMCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKKwkJCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICB7CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7CisJCURhdGEgJj0gMHhmZmZmZmZmZTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIDIwTUh6IExJTksgVVAgISEhIFxuIiApKTsKKyAgICB9CisKKwlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKKwkvLworCS8vIFNhdmUgQkJQX1I2NiB2YWx1ZSwgaXQgd2lsbCBiZSB1c2VkIGluIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbgorCS8vCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJnBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgKEJzc1R5cGU9JWQsIEFJRD0lZCwgc3NpZD0lcywgQ2hhbm5lbD0lZCwgQ2VudHJhbENoYW5uZWwgPSAlZClcbiIsCisJCUJzc1R5cGUsIHBBZC0+U3RhQWN0aXZlLkFpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoRGVuc2l0eSA9JWQsIClcbiIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTXBkdURlbnNpdHkpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsKKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7CisKKwkvLyBDYWxsIHRoaXMgZm9yIFJUUyBwcm90ZWN0aW9uZm9yIGxlZ2FjeSByYXRlLCB3ZSB3aWxsIGFsd2F5cyBlbmFibGUgUlRTIHRocmVzaG9sZCwgYnV0IG5vcm1hbGx5IGl0IHdpbGwgbm90IGhpdAorCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKE9GRE1TRVRQUk9URUNUIHwgQ0NLU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkpCisJeworCQkvLyBVcGRhdGUgSFQgcHJvdGVjdGlvbmZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLgorICAgIAlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQorICAgIAl7CisgICAgCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKKyAgICAJfQorICAgIAllbHNlCisgICAJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RHJzQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX0RSUykpOworCisJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgIT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpICYmCisJCUNBUF9JU19TSE9SVF9QUkVBTUJMRV9PTihwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbykpCisJeworCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisJfQorCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPT0gUkRfU0lMRU5DRV9NT0RFKQorCXsKKyNpZmRlZiBERlNfU1VQUE9SVAorCQlSYWRhckRldGVjdGlvblN0b3AocEFkKTsKKyNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLworCX0KKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKKwl7CisJCU1ha2VJYnNzQmVhY29uKHBBZCk7CisJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQl7CisJCQk7IC8vRG8gbm90aGluZworCQl9CisJCWVsc2UKKwkJeworCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7CisJCX0KKworCQkvLyBJbiBhZCBob2MgbW9kZSwgdXNlIE1BQyB0YWJsZSBmcm9tIGluZGV4IDEuCisJCS8vIHAucyBBU0lDIHVzZSBhbGwgMHhmZiBhcyB0ZXJtaW5hdGlvbiBvZiBXQ0lEIHRhYmxlIHNlYXJjaC5UbyBwcmV2ZW50IGl0J3MgMHhmZi1mZi1mZi1mZi1mZi1mZiwgV3JpdGUgMCBoZXJlLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9CQVNFLCAweDAwKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgMHgxODA4LCAweDAwKTsKKworCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYworCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCisKKwkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKwkJeworCQkJUFVDSEFSCUtleTsKKwkJCVVDSEFSIAlDaXBoZXJBbGc7CisKKwkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQorICAgICAgICAJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKKwkJCQl7CisJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJCQl7CisJCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKwkJCQkJfQorCQkJCX0KKworCisJCQl9CisJCX0KKwkJLy8gSWYgV1BBTm9uZSBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCisJCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsJLy8gYWx3YXlzIGJlIHplcm8KKworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7CisgICAgCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QTUtbMTZdLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgfQorCisJCQkvLyBEZWNpZGUgaXRzIENoaXBlckFsZworCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVua25vdyBDaXBoZXIgKD0lZCksIHNldCBDaXBoZXIgdG8gQUVTXG4iLCBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyKSk7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKyAgICAgICAgICAgIH0KKworCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKwkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJICAwLAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisgICAgICAgICAgICAvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIDAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywgTlVMTCk7CisKKwkJfQorCisJfQorCWVsc2UgLy8gQlNTX0lORlJBCisJeworCQkvLyBDaGVjayB0aGUgbmV3IFNTSUQgd2l0aCBsYXN0IFNTSUQKKwkJd2hpbGUgKENhbmNlbGxlZCA9PSBUUlVFKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4gPT0gcEFkLT5Db21tb25DZmcuU3NpZExlbikKKwkJCXsKKwkJCQlpZiAoUlRNUENvbXBhcmVNZW1vcnkocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKSA9PSAwKQorCQkJCXsKKwkJCQkJLy8gTGluayB0byB0aGUgb2xkIG9uZSBubyBsaW5rZG93biBpcyByZXF1aXJlZC4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gU2VuZCBsaW5rIGRvd24gZXZlbnQgYmVmb3JlIHNldCB0byBsaW5rIHVwCisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEFBIVxuIikpOworCQkJYnJlYWs7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEgbW9kZSwgUmVtb3ZlIEFsbCBLZXlzIGlmIG5vdCBjb25uZWN0IHRvIHRoZSBsYXN0IEJTU0lECisJCS8vIEtleSB3aWxsIGJlIHNldCBhZnRlciA0LXdheSBoYW5kc2hha2UuCisJCS8vCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwkJeworCQkJVUxPTkcgCQlJVjsKKworCQkJLy8gUmVtb3ZlIGFsbCBXUEEga2V5cworCQkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKKwkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisKKwkJCS8vIEZpeGVkIGNvbm5lY3Rpb24gZmFpbGVkIHdpdGggUmFuZ2UgTWF4aW1pemVyIC0gNTE1IEFQIChNYXJ2ZWxsIENoaXApIHdoZW4gc2VjdXJpdHkgaXMgV1BBUFNLL1RLSVAKKwkJCS8vIElmIElWIHJlbGF0ZWQgdmFsdWVzIGFyZSB0b28gbGFyZ2UgaW4gR3JvdXBNc2cyLCBBUCB3b3VsZCBpZ25vcmUgdGhpcyBtZXNzYWdlLgorCQkJSVYgPSAwOworCQkJSVYgfD0gKHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCAzMCk7CisJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgQlNTSURfV0NJRCwgSVYsIDApOworCQl9CisJCS8vIE5PVEU6CisJCS8vIHRoZSBkZWNpc2lvbiBvZiB1c2luZyAic2hvcnQgc2xvdCB0aW1lIiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseSBkdWUgdG8KKwkJLy8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKKworCQkvLyBOT1RFOgorCQkvLyB0aGUgZGVjaXNpb24gdG8gdXNlICJSVEMvQ1RTIiBvciAiQ1RTLXRvLXNlbGYiIHByb3RlY3Rpb24gb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkKKwkJLy8gZHVlIHRvIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCisKKwkJQ29tcG9zZVBzUG9sbChwQWQpOworCQlDb21wb3NlTnVsbEZyYW1lKHBBZCk7CisKKwkJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisKKwkJLy8gQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlCisJCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIEJTU0lEX1dDSUQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCQkvLyBhZGQgdGhpcyBCU1NJRCBlbnRyeSBpbnRvIEhBU0ggdGFibGUKKwkJeworCQkJVUNIQVIgSGFzaElkeDsKKworCQkJLy9wRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCWlmIChwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID09IE5VTEwpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQ3VyckVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKwkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKKwkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OworCQkJfQorCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKworCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIHBhaWV3aXNlIGFuZCBzaGFyZWQga2V5CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICBpZiAoKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApJiYKKyAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSYmCisgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKKyAgICAgICAgICAgICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpJiYKKyAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpKQorI2Vsc2UKKwkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCXsKKwkJCVBVQ0hBUglLZXk7CisJCQlVQ0hBUiAJQ2lwaGVyQWxnOworCisJCQlmb3IgKGlkeD0wOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykKKyAgICAgICAgCXsKKwkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleTsKKworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApCisJCQkJeworCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCQlpZiAoaWR4ID09IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCQkJeworCQkJCQkJLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBuZWVkIHRvIGluZGljYXRlIGNvbm5lY3Rpdml0eSBpbW1lZGlhdGVseTsgQURIT0MgbW9kZQorCQkvLyBzaG91bGQgd2FpdCB1bnRpbCBhdCBsZWFzdCAyIGFjdGl2ZSBub2RlcyBpbiB0aGlzIEJTU0lELgorCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKworICAgICAgICAvLyBGb3IgR1VJICsrCisJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJeworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKwkJfQorICAgICAgICAvLyAtLQorCisJCS8vIEFkZCBCU1NJRCBpbiBteSBNQUMgVGFibGUuCisgICAgICAgIE5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gQlNTSURfV0NJRDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5wQWQgPSBwQWQ7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVmFsaWRBc0NMSSA9IFRSVUU7CS8vQWx0aG91Z2ggdGhpcyBpcyBic3NpZC4uc3RpbGwgc2V0IFZhbGlkQXNDbAorCQlwQWQtPk1hY1RhYi5TaXplID0gMTsJLy8gaW5mcmEgbW9kZSBhbHdheXMgc2V0IE1BQ3RhYiBzaXplID0xLgorCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlNzdCA9IFNTVF9BU1NPQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BdXRoU3RhdGUgPSBTU1RfQVNTT0M7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICBOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAgQ2xpZW50U3RhdHVzRmxhZ3M9JWx4KVxuIiwKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKworCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIFRSVUUsIEJTUzApOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhIChTdGFBY3RpdmUuYkh0RW5hYmxlID0lZCwgKVxuIiwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBSZXBvcnQgQWRqYWNlbnQgQVAgcmVwb3J0LgorCQkvLworI2lmZGVmIExFQVBfU1VQUE9SVAorCQlDQ1hBZGphY2VudEFQUmVwb3J0KHBBZCk7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpCisJCQl7CisKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCk7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisgICAgICAgICAgICAgICAgUlRNUFNldFBpZ2d5QmFjayhwQWQsIFRSVUUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR1cm4gb24gUGlnZ3ktQmFja1xuIikpOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCQkJfQorCQl9CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCisJCQl7CisJCQkJQXNpY0VuYWJsZVJERyhwQWQpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOworCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCX0KKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9DT05ORUNUIEV2ZW50IEIhLkJBQ2FwYWJpbGl0eSA9ICV4LiBDbGllbnRTdGF0dXNGbGFncyA9ICVseFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfVVApOworCisJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgPSAwOworCXBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kID0gMDsKKwlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7ICAgICAgICAvLyBSZXNldCBjb25maWcgZmxhZworCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOyAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisKKwkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjaworCXsKKwkJUFVDSEFSCQkJCQlwVGFibGU7CisJCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCisJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpOworCQlBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUocEFkLCBwVGFibGUpOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisgICAgcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworICAgIHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKwlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpCisJeworCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMzIpCisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID4gTUNTXzcpIHx8IChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMzIpKQorCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJLy8gSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuCisJCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkKKwkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJfQorCWVsc2UKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCS8vICBMZXQgTGluayBTdGF0dXMgUGFnZSBkaXNwbGF5IGZpcnN0IGluaXRpYWwgcmF0ZS4KKwlwQWQtPkxhc3RUeFJhdGUgPSAoVVNIT1JUKShwRW50cnktPkhUUGh5TW9kZS53b3JkKTsKKwkvLyBTZWxlY3QgREFDIGFjY29yZGluZyB0byBIVCBvciBMZWdhY3kKKwlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gIT0gMHgwMCkKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwkJeworCQkgICAgVmFsdWUgfD0gMHgxMDsKKwkJfQorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKKwl7CisJfQorCWVsc2UgaWYgKHBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID09IDApCisJeworCSAgICAvLyBJZiBIVCBBUCBkb2Vzbid0IHN1cHBvcnQgTWF4UkFtcGR1RmFjdG9yID0gMSwgd2UgbmVlZCB0byBzZXQgbWF4IFBTRFUgdG8gMC4KKwkgICAgLy8gQmVjYXVzZSBvdXIgSW5pdCB2YWx1ZSBpcyAxIGF0IE1BQ1JlZ1RhYmxlLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgwZmZmKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBQYXRjaCBmb3IgTWFydmVsIEFQIHRvIGdhaW4gaGlnaCB0aHJvdWdocHV0CisJLy8gTmVlZCB0byBzZXQgYXMgZm9sbG93aW5nLAorCS8vIDEuIFNldCB0eG9wIGluIHJlZ2lzdGVyLUVEQ0FfQUMwX0NGRyBhcyAweDYwCisJLy8gMi4gU2V0IEVuVFhXcml0ZUJhY2tERE9ORSBpbiByZWdpc3Rlci1XUERNQV9HTE9fQ0ZHIGFzIHplcm8KKwkvLyAzLiBQQkZfTUFYX1BDTlQgYXMgMHgxRjNGQkY5RgorCS8vIDQuIGtpY2sgcGVyIHR3byBwYWNrZXRzIHdoZW4gZGVxdWV1ZQorCS8vCisJLy8gVHhvcCBjYW4gb25seSBiZSBtb2RpZmllZCB3aGVuIFJERyBpcyBvZmYsIFdNTSBpcyBkaXNhYmxlIGFuZCBUeEJ1cnN0IGlzIGVuYWJsZQorCS8vCisJLy8gaWYgMS4gTGVnYWN5IEFQIFdNTSBvbiwgIG9yIDIuIDExbiBBUCwgQU1QRFUgZGlzYWJsZS4gIEZvcmNlIHR1cm4gb2ZmIGJ1cnN0IG5vIG1hdHRlciB3aGF0IGJFbmFibGVUeEJ1cnN0IGlzLgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkpCisJCXx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGN0Y5Rik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMVxuIikpOworCX0KKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKwkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwkJRGF0YSAgfD0gMHg2MDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKwkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBUUlVFOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGQkY5Rik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMlxuIikpOworCX0KKwllbHNlCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGN0Y5Rik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgM1xuIikpOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIFJlLWNoZWNrIHRvIHR1cm4gb24gVFggYnVyc3Qgb3Igbm90LgorCWlmICgocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPT0gVFJVRSkgJiYgKChTVEFfV0VQX09OKHBBZCkpfHwoU1RBX1RLSVBfT04ocEFkKSkpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gVFJVRTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCQl7CisJCSAgICBVSU5UMzIgTUFDVmFsdWUgPSAwOworCQkJLy8gRm9yY2UgZGlzYWJsZSAgVFhPUCB2YWx1ZSBpbiB0aGlzIGNhc2UuIFRoZSBzYW1lIGFjdGlvbiBpbiBNTE1FVXBkYXRlUHJvdGVjdCB0b28uCisJCQkvLyBJIGRpZG4ndCBjaGFuZ2UgUEJGX01BWF9QQ05UIHNldHRpbmcuCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlICAmPSAweEZGRkZGRjAwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBNQUNWYWx1ZSk7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IEZBTFNFOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSA9IEZBTFNFOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gRkFMU0U7CisJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFwQWQtPmJOZXh0RGlzYWJsZVJ4QkE9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBKSk7CisJLy8gQlNTSUQgYWRkIGluIG9uZSBNQUMgZW50cnkgdG9vLiAgQmVjYXVzZSBpbiBUeCwgQVNJQyBuZWVkIHRvIGNoZWNrIENpcGhlciBhbmQgSVYvRUlWLCBCQWJpdG1hcAorCS8vIFB0aGVyIGluZm9ybWF0aW9uIGluIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGRyaXZlci4KKwkvLyBOb3RlOiBBcyBTVEEsIFRoZSBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4gUGFpcndpc2VLZXkgYW5kIFNoYXJlZCBLZXkgZm9yIEJTUzAgYXJlIHRoZSBzYW1lLgorCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisgICAgeworICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwlwRW50cnktPlBvcnRTZWN1cmVkID0gcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworICAgIC8vCisJLy8gUGF0Y2ggQXRoZXJvcyBBUCBUWCB3aWxsIGJyZWFrZG93biBpc3N1ZS4KKwkvLyBBUCBNb2RlbDogRExpbmsgRFdMLTgyMDBBUAorCS8vCisJaWYgKElORlJBX09OKHBBZCkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBTVEFfVEtJUF9PTihwQWQpKQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDApOworCX0KKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTEpKQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCk7CisJCUJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdChwQWQpOworCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCURpc2Nvbm5lY3QgY3VycmVudCBCU1NJRAorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCUlzUmVxRnJvbUFQCQktIFJlcXVlc3QgZnJvbSBBUAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCVdlIG5lZWQgbW9yZSBpbmZvcm1hdGlvbiB0byBrbm93IGl0J3MgdGhpcyByZXF1c3QgZnJvbSBBUC4KKwkJSWYgeWVzISB3ZSBuZWVkIHRvIGRvIGV4dHJhIGhhbmRsaW5nLCBmb3IgZXhhbXBsZSwgcmVtb3ZlIHRoZSBXUEEga2V5LgorCQlPdGhlcndpc2Ugb24gNC13YXkgaGFuZHNoYWtpbmcgd2lsbCBmYWllZCwgc2luY2UgdGhlIFdQQSBrZXkgZGlkbid0IGJlCisJCXJlbW92ZSB3aGlsZSBhdXRvIHJlY29ubmVjdC4KKwkJRGlzY29ubmVjdCByZXF1ZXN0IGZyb20gQVAsIGl0IG1lYW5zIHdlIHdpbGwgc3RhcnQgYWZyZXNoIDQtd2F5IGhhbmRzaGFraW5nCisJCW9uIFdQQSBtb2RlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIExpbmtEb3duKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBCT09MRUFOICAgICAgSXNSZXFGcm9tQVApCit7CisJVUNIQVIJCQkgICAgaSwgQnl0ZVZhbHVlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUuCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAhISFcbiIpKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCisJaWYgKEFESE9DX09OKHBBZCkpCQkvLyBBZGhvYyBtb2RlIGxpbmsgZG93bgorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAxISEhXG4iKSk7CisKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1hY1RhYi5TaXplPSVkICEhIVxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCX0KKwllbHNlCQkJCQkvLyBJbmZyYSBzdHJ1Y3R1cmUgbW9kZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAyISEhXG4iKSk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy8gRExTIHRlYXIgZG93biBmcmFtZSBtdXN0IGJlIHNlbnQgYmVmb3JlIGxpbmsgZG93bgorCQkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZQorCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXsKKwkJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSAgRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCisJCS8vIFNhdmVkIGxhc3QgU1NJRCBmb3IgbGlua3VwIGNvbXBhcmlzb24KKwkJcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pOworCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQlpZiAocEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID09IFRSVUUpCisJCXsKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQSFcbiIpKTsKKwkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgLy8KKwkJCS8vIElmIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgaXMgZnJvbSBORElTLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIEJTU0lEIGZyb20gZW50cnkuCisJCQkvLyBPdGhlcndpc2UgbG9zdCBiZWFjb24gb3IgcmVjZWl2ZSBEZS1BdXRoZW50aWNhdGlvbiBmcm9tIEFQLAorCQkJLy8gdGhlbiB3ZSBzaG91bGQgZGVsZXRlIEJTU0lEIGZyb20gQnNzVGFibGUuCisJCQkvLyBJZiB3ZSBkb24ndCBkZWxldGUgZnJvbSBlbnRyeSwgcm9hbWluZyB3aWxsIGZhaWwuCisJCQkvLworCQkJQnNzVGFibGVEZWxldGVFbnRyeSgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCX0KKworCQkvLyByZXN0b3JlIGJhY2sgdG8gLQorCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKKwkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCisJCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9PSBUUlVFKQorCQl7CisJCQkvLworCQkJLy8gUmVjb3JkIGN1cnJlbnQgQVAncyBpbmZvcm1hdGlvbi4KKwkJCS8vIGZvciBsYXRlciB1c2VkIHJlcG9ydGluZyBBZGphY2VudCBBUCByZXBvcnQuCisJCQkvLworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkTGVuKTsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCX0KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJLy8gQ291bnRyeSBJRSBvZiB0aGUgQVAgd2lsbCBiZSBldmFsdWF0ZWQgYW5kIHdpbGwgYmUgdXNlZC4KKwkJaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlICE9IFJ0ODAyXzExX0RfTm9uZSkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzBdLCAmcEFkLT5TdGFDZmcuU3RhT3JpQ291bnRyeUNvZGVbMF0sIDIpOworCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gcEFkLT5TdGFDZmcuU3RhT3JpR2VvZ3JhcGh5OworCQkJQnVpbGRDaGFubmVsTGlzdEV4KHBBZCk7CisJCX0KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwl9CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQorCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCX0KKworCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01pbgk9IDQ7CisJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisKKwlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsgLy9GQUxTRSk7CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgTlVMTCk7CisKKwkvLyBTZXQgTEVECisJUlRNUFNldExFRChwQWQsIExFRF9MSU5LX0RPV04pOworICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RjA7CisgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgorCisJCUFzaWNEaXNhYmxlU3luYyhwQWQpOworCisJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgPSAwOworCXBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kID0gMDsKKworCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwl7CisJCS8vIFJlbW92ZSBTdGFDZmcgSW5mb3JtYXRpb24gYWZ0ZXIgbGluayBkb3duCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBNQUNfQUREUl9MRU4pOworCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gMDsKKwl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOworCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFJlc2V0IFdQQS1QU0sgc3RhdGUuIE9ubHkgcmVzZXQgd2hlbiBzdXBwbGljYW50IGVuYWJsZWQKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3RhdGUgIT0gU1NfTk9UVVNFKQorCXsKKwkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKwkJLy8gQ2xlYXIgUmVwbGF5IGNvdW50ZXIKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgOCk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorCisKKwkvLworCS8vIGlmIGxpbmsgZG93biBjb21lIGZyb20gQVAsIHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBXUEEga2V5cyBvbiBXUEEgbW9kZS4KKwkvLyBvdGhlcndpc2Ugd2lsbCBjYXVzZSA0LXdheSBoYW5kc2hha2luZyBmYWlsZWQsIHNpbmNlIHRoZSBXUEEga2V5IG5vdCBlbXB0eS4KKwkvLworCWlmICgoSXNSZXFGcm9tQVApICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJLy8gUmVtb3ZlIGFsbCBXUEEga2V5cworCQlSVE1QV1BBUmVtb3ZlQWxsS2V5cyhwQWQpOworCX0KKworCS8vIDgwMi4xeCBwb3J0IGNvbnRyb2wKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJLy8gUHJldmVudCBjbGVhciBQb3J0U2VjdXJlZCBoZXJlIHdpdGggc3RhdGljIFdFUAorCS8vIE5ldHdvcmtNYW5nZXIgc2V0IHNlY3VyaXR5IHBvbGljeSBmaXJzdCB0aGVuIHNldCBTU0lEIHRvIGNvbm5lY3QgQVAuCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgorCQkocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IEZBTFNFKSkKKwl7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9IDA7CisKKwkvLyBUdXJuIG9mZiBDa2lwIGNvbnRyb2wgZmxhZworCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBGQUxTRTsKKwlwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBGQUxTRTsKKworICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKwlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCisgICAgLy9wQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID0gRkFMU0U7CisJLy9wQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkID0gRkFMU0U7CisJLy9wQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9IEZBTFNFOworICAgIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisKKwkvLyBSZXNldCB0aGUgQ3VycmVudCBBUCdzIElQIGFkZHJlc3MKKwlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5BaXJvbmV0SVBBZGRyZXNzLCA0KTsKKyNpZmRlZiBSVDI4NzAKKwlwQWQtPmJVc2JUeEJ1bGtBZ2dyZSA9IEZBTFNFOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8gQ2xlYW4gYXNzb2NpYXRpb24gaW5mb3JtYXRpb24KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuQXNzb2NJbmZvLCBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pKTsKKwlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IDA7CisJcEFkLT5TdGFDZmcuUmVzVmFySUVMZW4gPSAwOworCisJLy8KKwkvLyBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93bgorCS8vCisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDggPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOCA9IDA7CisKKwkvLyBSZXN0b3JlIE1sbWVSYXRlCisJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8KKwkvLyBBZnRlciBMaW5rIGRvd24sIHJlc2V0IHBpZ2d5LWJhY2sgc2V0dGluZyBpbiBBU0lDLiBEaXNhYmxlIFJERy4KKwkvLworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQnl0ZVZhbHVlKTsKKwkJQnl0ZVZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJ5dGVWYWx1ZSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCS8vIFJlc2V0IERBQworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJ5dGVWYWx1ZSk7CisJQnl0ZVZhbHVlICY9ICh+MHgxOCk7CisJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwl7CisJCUJ5dGVWYWx1ZSB8PSAweDEwOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCeXRlVmFsdWUpOworCisJUlRNUFNldFBpZ2d5QmFjayhwQWQsRkFMU0UpOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQgPSBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFJlc3RvcmUgYWxsIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcuCisJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8T0ZETVNFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisJQXNpY0Rpc2FibGVSREcocEFkKTsKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKTsKKwlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkID0gMDsKKwlUcmlFdmVudEluaXQocEFkKTsKKwlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQorCXsKKwkJcEFkLT5DaGFubmVsTGlzdFtpXS5iRWZmZWN0ZWRDaGFubmVsID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDFmZmYpOworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApIHsKKwkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQkvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKwl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCXsKKwkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgIFN0YXJ0UmVxOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgIEpvaW5SZXE7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQnNzSWR4OworCisJLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCisJcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisKKwlCc3NJZHggPSBwQWQtPk1sbWVBdXguQnNzSWR4OworCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikKKwl7CisJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCisJCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQl7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOworCisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXI7CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKKwkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCX0KKwkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7CisKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOworCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKKwkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisKKwkJCS8vIFJTTiBjYXBhYmlsaXR5CisJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7CisJCX0KKworCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCisJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7CisJCWlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCisJCXsKKwkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCisJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7CisJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBCc3NJZHgpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksCisJCQkJCSZKb2luUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9KT0lOOworCX0KKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgQlNTIGZhaWw7IHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOworCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwl9CisJZWxzZSAvLyBubyBtb3JlIEJTUworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCByb2FtaW5nIGZhaWxlZCwgc3RheSBAIGNoICMlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJfQorfQorCisvLyBmb3IgcmUtYXNzb2NpYXRpb24gb25seQorLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QgUmVhc3NvY1JlcTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7CisJQlNTX0VOVFJZICAgICAgICAgICAgICAgKnBCc3M7CisKKwlCc3NJZHggPSBwQWQtPk1sbWVBdXguUm9hbUlkeDsKKwlwQnNzID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc0VudHJ5W0Jzc0lkeF07CisKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKSk7CisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwpOworCisJCS8vIHJlYXNzb2NpYXRlIG1lc3NhZ2UgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBhc3NvY2lhdGUgbWVzc2FnZQorCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJlJlYXNzb2NSZXEsIHBCc3MtPkJzc2lkLCBwQnNzLT5DYXBhYmlsaXR5SW5mbywKKwkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAorCQkJCQlzaXplb2YoTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QpLCAmUmVhc3NvY1JlcSk7CisKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOworCX0KKwllbHNlIC8vIG5vIG1vcmUgQlNTCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIGZhc3Qgcm9hbWluZyBmYWlsZWQsIGJhY2sgdG8gY2ggIyVkXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgSm9pblBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKKwlJTiBVTE9ORyBCc3NJZHgpCit7CisJSm9pblJlcS0+QnNzSWR4ID0gQnNzSWR4OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTY2FuUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVQ0hBUiBTY2FuVHlwZSkKK3sKKyAgICBOZGlzWmVyb01lbW9yeShTY2FuUmVxLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCVNjYW5SZXEtPlNzaWRMZW4gPSBTc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KFNjYW5SZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCVNjYW5SZXEtPkJzc1R5cGUgPSBCc3NUeXBlOworCVNjYW5SZXEtPlNjYW5UeXBlID0gU2NhblR5cGU7Cit9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIERsc1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0RMU19SRVFfU1RSVUNUICpwRGxzUmVxLAorCUlOIFBSVF84MDJfMTFfRExTIHBEbHMsCisJSU4gVVNIT1JUIHJlYXNvbikKK3sKKwlwRGxzUmVxLT5wRExTID0gcERsczsKKwlwRGxzUmVxLT5SZWFzb24gPSByZWFzb247Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFN0YXJ0UGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbikKK3sKKwlBU1NFUlQoU3NpZExlbiA8PSBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KFN0YXJ0UmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwlTdGFydFJlcS0+U3NpZExlbiA9IFNzaWRMZW47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEF1dGhQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCisJSU4gUFVDSEFSIHBBZGRyLAorCUlOIFVTSE9SVCBBbGcpCit7CisJQ09QWV9NQUNfQUREUihBdXRoUmVxLT5BZGRyLCBwQWRkcik7CisJQXV0aFJlcS0+QWxnID0gQWxnOworCUF1dGhSZXEtPlRpbWVvdXQgPSBBVVRIX1RJTUVPVVQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisKKyNpZmRlZiBSVDI4NzAKKworVk9JRCBNbG1lQ250bENvbmZpcm0oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTXNnVHlwZSwKKwlJTiBVU0hPUlQgTXNnKQoreworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1zZ1R5cGUsIHNpemVvZihVU0hPUlQpLCAmTXNnKTsKK30KKworVk9JRCBDb21wb3NlUHNQb2xsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBUWElORk9fU1RSVUMJCXBUeEluZm87CisJUFRYV0lfU1RSVUMJCXBUeFdJOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ29tcG9zZVBzUG9sbFxuIikpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7CisKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlB3ck1nbXQgPSAwOworCXBBZC0+UHNQb2xsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0NOVEw7CisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9QU19QT0xMOworCXBBZC0+UHNQb2xsRnJhbWUuQWlkID0gcEFkLT5TdGFBY3RpdmUuQWlkIHwgMHhDMDAwOworCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5UYSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgMTAwKTsKKwlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF07CisJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKFBTUE9MTF9GUkFNRSkrVFhXSV9TSVpFKSwgVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsICBGQUxTRSk7CisJcFR4V0kgPSAoUFRYV0lfU1RSVUMpJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOworCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKFBTUE9MTF9GUkFNRSkpLAorCQkwLCAgMCwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJUlRNUE1vdmVNZW1vcnkoJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhXSV9TSVpFK1RYSU5GT19TSVpFXSwgJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKKwkvLyBBcHBlbmQgNCBleHRyYSB6ZXJvIGJ5dGVzLgorCXBBZC0+UHNQb2xsQ29udGV4dC5CdWxrT3V0U2l6ZSA9ICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHNpemVvZihQU1BPTExfRlJBTUUpICsgNDsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIENvbXBvc2VOdWxsRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUFRYSU5GT19TVFJVQwkJcFR4SW5mbzsKKwlQVFhXSV9TVFJVQwkJcFR4V0k7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJcEFkLT5OdWxsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJcEFkLT5OdWxsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfTlVMTF9GVU5DOworCXBBZC0+TnVsbEZyYW1lLkZDLlRvRHMgPSAxOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCAxMDApOworCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF07CisJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKEhFQURFUl84MDJfMTEpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOworCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWElORk9fU0laRV07CisJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIChzaXplb2YoSEVBREVSXzgwMl8xMSkpLAorCQkwLCAwLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwlSVE1QTW92ZU1lbW9yeSgmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhXSV9TSVpFK1RYSU5GT19TSVpFXSwgJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZS1idWlsZCBhIEJFQUNPTiBmcmFtZSBpbiB0aGUgc2hhcmVkIG1lbW9yeQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcgTWFrZUlic3NCZWFjb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOworCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB4MDR9OworCUhFQURFUl84MDJfMTEgQmNuSGRyOworCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm87CisJTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOworCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBUWFdJX1NUUlVDCSAgcFR4V0kgPSAmcEFkLT5CZWFjb25UeFdJOworCUNIQVIgICAgICAgICAqcEJlYWNvbkZyYW1lID0gcEFkLT5CZWFjb25CdWY7CisJQk9PTEVBTiAgICAgICBQcml2YWN5OworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgICBTdXBSYXRlTGVuID0gMDsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICBSU05JZSA9IElFX1dQQTsKKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkpCisJeworCQlTdXBSYXRlWzBdID0gMHg4MjsgLy8gMSBtYnBzCisJCVN1cFJhdGVbMV0gPSAweDg0OyAvLyAyIG1icHMKKwkJU3VwUmF0ZVsyXSA9IDB4OGI7IC8vIDUuNSBtYnBzCisJCVN1cFJhdGVbM10gPSAweDk2OyAvLyAxMSBtYnBzCisJCVN1cFJhdGVMZW4gPSA0OworCQlFeHRSYXRlTGVuID0gMDsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCXsKKwkJU3VwUmF0ZVswXSAgPSAweDhDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbMV0gID0gMHgxMjsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzJdICA9IDB4OTg7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbM10gID0gMHgyNDsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs0XSAgPSAweGIwOyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQlTdXBSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlTGVuICA9IDg7CisJCUV4dFJhdGVMZW4gID0gMDsKKworCQkvLworCQkvLyBBbHNvIFVwZGF0ZSBNbG1lUmF0ZSAmIFJ0c1JhdGUgZm9yIEcgb25seSAmIEEgb25seQorCQkvLworCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0KKwllbHNlCisJeworCQlTdXBSYXRlWzBdID0gMHg4MjsgLy8gMSBtYnBzCisJCVN1cFJhdGVbMV0gPSAweDg0OyAvLyAyIG1icHMKKwkJU3VwUmF0ZVsyXSA9IDB4OGI7IC8vIDUuNSBtYnBzCisJCVN1cFJhdGVbM10gPSAweDk2OyAvLyAxMSBtYnBzCisJCVN1cFJhdGVMZW4gPSA0OworCisJCUV4dFJhdGVbMF0gID0gMHgwQzsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbMl0gID0gMHgxODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCisJCUV4dFJhdGVbM10gID0gMHgyNDsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVs0XSAgPSAweDMwOyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVs1XSAgPSAweDQ4OyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzZdICA9IDB4NjA7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbN10gID0gMHg2YzsgICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZUxlbiAgPSA4OworCX0KKworCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCXBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCisJLy8gY29tcG9zZSBJQlNTIGJlYWNvbiBmcmFtZQorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQmNuSGRyLCBTVUJUWVBFX0JFQUNPTiwgMCwgQlJPQURDQVNUX0FERFIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAorCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUsICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAgICAmQmNuSGRyLAorCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlTGVuLAorCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIFN1cFJhdGUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzTGVuLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NMZW4sCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCisJCQkJCSAgRU5EX09GX0FSR1MpOworCisJLy8gYWRkIEVSUF9JRSBhbmQgRVhUX1JBRSBJRSBvZiBpbiA4MDIuMTFnCisJaWYgKEV4dFJhdGVMZW4pCisJeworCQlVTE9ORwl0bXA7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICAgICAgICAgJnRtcCwKKwkJCQkJCSAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxFcnBJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCisJCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIEV4dFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworCS8vIElmIGFkaG9jIHNlY3J1aXR5IGlzIHNldCBmb3IgV1BBLU5vbmUsIGFwcGVuZCB0aGUgY2lwaGVyIHN1aXRlIElFCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJeworCQlVTE9ORyB0bXA7CisgICAgICAgIFJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBCU1MwKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmUlNOSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCQlwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwl7CisJCVVMT05HIFRtcExlbjsKKwkJVUNIQVIgSHRMZW4sIEh0TGVuMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisJCUFERF9IVF9JTkZPX0lFCWFkZEhUSW5mb1RtcDsKKwkJVVNIT1JUCWIybFRtcCwgYjJsVG1wMjsKKyNlbmRpZgorCisJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCUh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSk7CisJCUh0TGVuMSA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKKwkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkgIEh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKKwkJCQkJCSAgSHRMZW4xLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOworCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJTmRpc01vdmVNZW1vcnkoJmFkZEhUSW5mb1RtcCwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgSHRMZW4xKTsKKwkJKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8yKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzIpKTsKKwkJKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8zKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzMpKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUrRnJhbWVMZW4sCSZUbXBMZW4sCisJCQkJCQkgIDEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuLAorCQkJCQkJICBIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkgIDEsCQkJCQkJJkFkZEh0SW5mb0llLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbjEsCisJCQkJCQkgIEh0TGVuMSwJCQkJCSZhZGRIVEluZm9UbXAsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQlGcmFtZUxlbiArPSBUbXBMZW47CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy9iZWFjb24gdXNlIHJlc2VydmVkIFdDSUQgMHhmZgorICAgIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisgICAgeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgIFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSwgMCwgMHhmZiwgRnJhbWVMZW4sCisJCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFNldCB0byB1c2UgMU1icHMgZm9yIEFkaG9jIGJlYWNvbi4KKwkJSFRUUkFOU01JVF9TRVRUSU5HIFRyYW5zbWl0OworICAgICAgICBUcmFuc21pdC53b3JkID0gMDsKKyAgICAgICAgUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAorICAgIAkJUElEX01HTVQsIFBJRF9CRUFDT04sIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZUcmFuc21pdCk7CisgICAgfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIHBCZWFjb25GcmFtZSwgRElSX1dSSVRFLCBGQUxTRSk7CisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1ha2VJYnNzQmVhY29uIChsZW49JWxkKSwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZCwgQ2hhbm5lbD0lZCwgUGh5TW9kZT0lZFxuIiwKKwkJCQkJRnJhbWVMZW4sIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW4sIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwlyZXR1cm4gRnJhbWVMZW47Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvZGxzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9kbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmJmYmMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvZGxzLmMKQEAgLTAsMCArMSwyMjEwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIGRscy5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgV01NLURMUyBzdGF0ZSBtYWNoaW5lCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJvcnkgQ2hlbiAgIDAyLTE0LTIwMDYKKwlBcnZpbiBUYWkJMDYtMDMtMjAwOAkgIE1vZGlmaWVkIGZvciBSVDI4eHgKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgZGxzIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTbSAtIHBvaW50ZXIgdG8gdGhlIGRscyBzdGF0ZSBtYWNoaW5lCisgICAgTm90ZToKKyAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGlzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBETFNfSURMRQorICAgIE1UMl9NTE1FX0RMU19SRVFVRVNUICAgTWxtZURsc1JlcUFjdGlvbgorICAgIE1UMl9QRUVSX0RMU19SRVFVRVNUICAgUGVlckRsc1JlcUFjdGlvbgorICAgIE1UMl9QRUVSX0RMU19SRVNQT05TRSAgUGVlckRsc1JzcEFjdGlvbgorICAgIE1UMl9NTE1FX0RMU19URUFSRE9XTiAgTWxtZVRlYXJEb3duQWN0aW9uCisgICAgTVQyX1BFRVJfRExTX1RFQVJET1dOICBQZWVyVGVhckRvd25BY3Rpb24KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIERsc1N0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVVDSEFSCWk7CisKKyAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCAoU1RBVEVfTUFDSElORV9GVU5DKilUcmFucywgTUFYX0RMU19TVEFURSwgTUFYX0RMU19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgRExTX0lETEUsIERMU19NQUNISU5FX0JBU0UpOworCisgICAgLy8gdGhlIGZpcnN0IGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9NTE1FX0RMU19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURsc1JlcUFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzUmVxQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNSc3BBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURsc1RlYXJEb3duQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfVEVBUl9ET1dOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNUZWFyRG93bkFjdGlvbik7CisKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0ucEFkID0gcEFkOworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbiksIHBBZCwgRkFMU0UpOworCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCUhFQURFUl84MDJfMTEJRGxzUmVxSGRyOworCVBSVF84MDJfMTFfRExTCXBETFMgPSBOVUxMOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1JFUVVFU1Q7CisJVUxPTkcJCQl0bXA7CisJVVNIT1JUCQkJcmVhc29uOworCVVMT05HCQkJVGltZW91dDsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisKKwlpZighTWxtZURsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmcERMUywgJnJlYXNvbikpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gTWxtZURsc1JlcUFjdGlvbigpIFxuIikpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBNbG1lRGxzUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzUmVxSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSZXFIZHIsCisJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJNiwJCQkJCQkJJnBETFMtPk1hY0FkZHIsCisJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCTIsCQkJCQkJCSZwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbywKKwkJCQkJMiwJCQkJCQkJJnBETFMtPlRpbWVPdXQsCisJCQkJCTEsCQkJCQkJCSZTdXBSYXRlSWUsCisJCQkJCTEsCQkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5TdXBSYXRlLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCSAgMSwJCQkJCQkmRXh0UmF0ZUllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCUZyYW1lTGVuICs9IHRtcDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJeworCQlVQ0hBUiBIdExlbjsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisjZW5kaWYKKworCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQlIdExlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQlIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOworCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCUh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJRnJhbWVMZW4gPSBGcmFtZUxlbiArIHRtcDsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCVRpbWVvdXQgPSBETFNfVElNRU9VVDsKKwlSVE1QU2V0VGltZXIoJnBETFMtPlRpbWVyLCBUaW1lb3V0KTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVTSE9SVAkJCVN0YXR1c0NvZGUgPSBNTE1FX1NVQ0NFU1M7CisJSEVBREVSXzgwMl8xMQlEbHNSc3BIZHI7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfUkVTUE9OU0U7CisJVUxPTkcJCQl0bXA7CisJVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm87CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOworCVVTSE9SVAkJCURMU1RpbWVPdXQ7CisJU0hPUlQJCQlpOworCVVMT05HCQkJVGltZW91dDsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJUFJUXzgwMl8xMV9ETFMJcERMUyA9IE5VTEw7CisJVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKKyAgICBVQ0hBUgkJCVN1cHBvcnRlZFJhdGVzTGVuOworICAgIFVDSEFSCQkJU3VwcG9ydGVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCUhUX0NBUEFCSUxJVFlfSUUJSHRDYXBhYmlsaXR5OworCisJaWYgKCFQZWVyRGxzUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJkNhcGFiaWxpdHlJbmZvLCAmRExTVGltZU91dCwKKwkJCQkJCQkmU3VwcG9ydGVkUmF0ZXNMZW4sICZTdXBwb3J0ZWRSYXRlc1swXSwgJkh0Q2FwYWJpbGl0eUxlbiwgJkh0Q2FwYWJpbGl0eSkpCisJCXJldHVybjsKKworICAgIC8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCisgICAgZm9yIChpID0gMDsgaSA8IFN1cHBvcnRlZFJhdGVzTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2YpKQorICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZjsKKyAgICB9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCXsKKwkJU3RhdHVzQ29kZSA9IE1MTUVfUkVRVUVTVF9ERUNMSU5FRDsKKwl9CisJZWxzZSBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorCXsKKwkJU3RhdHVzQ29kZSA9IE1MTUVfREVTVF9TVEFfSVNfTk9UX0FfUVNUQTsKKwl9CisJZWxzZSBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCXsKKwkJU3RhdHVzQ29kZSA9IE1MTUVfUkVRVUVTVF9ERUNMSU5FRDsKKwl9CisJZWxzZQorCXsKKwkJLy8gZmluZCB0YWJsZSB0byB1cGRhdGUgcGFyYW1ldGVycworCQlmb3IgKGkgPSAoTUFYX05VTV9PRl9ETFNfRU5UUlktMSk7IGkgPj0gMDsgaS0tKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCX0KKworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ID0gRExTVGltZU91dDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IERMU1RpbWVPdXQ7CisJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCWVsc2UKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQkJcERMUyA9ICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIGNhbiBub3QgZmluZCBpbiB0YWJsZSwgY3JlYXRlIGEgbmV3IG9uZQorCQlpZiAoaSA8IDApCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGNhbiBub3QgZmluZCBzYW1lIGVudHJ5IFxuIikpOworCQkJZm9yIChpPShNQVhfTlVNX09GX0RMU19FTlRSWSAtIDEpOyBpID49IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGktLSkKKwkJCXsKKwkJCQlpZiAoIXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKQorCQkJCXsKKwkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJCXsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCQl9CisKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCA9IFRSVUU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgPSBETFNUaW1lT3V0OworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IERMU1RpbWVPdXQ7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFNBLCBNQUNfQUREUl9MRU4pOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCQllbHNlCisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCQkJcERMUyA9ICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXTsKKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKKworCQkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCisJCQkJCXsKKwkJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKwkJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKKwkJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKKwkJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKwkJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKKwkJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKKwkJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKwkJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKKwkJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOworCisJCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOworCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOworCisJCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgorCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQkJeworCQkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7CisJCQkJCQlDSEFSICAgIGlpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOworCQkJCQkJfQorCisJCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOworCQkJCQkJfQorCisJCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCisJCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKKwkJCQkJCXsKKwkJCQkJCQlqID0gaWkvODsKKwkJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOworCQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQorCQkJCQkJCXsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoaWk9PTApCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKKwkJCQkJCXsKKworCQkJCQkJCXByaW50aygiQEBAIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSAlZFxuIiwKKwkJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKKwkJCQkJCQl7CisJCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCisJCQkJCQkJeworCQkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7CisJCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlQVUNIQVIgcFRhYmxlOworCQkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKKworCQkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCQkJCQl9CisJCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlTdGF0dXNDb2RlID0gTUxNRV9TVUNDRVNTOworCisJCS8vIGNhbiBub3QgZmluZCBpbiB0YWJsZSwgY3JlYXRlIGEgbmV3IG9uZQorCQlpZiAoaSA8IDApCisJCXsKKwkJCVN0YXR1c0NvZGUgPSBNTE1FX1FPU19VTlNQRUNJRlk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBETFNFbnRyeSB0YWJsZSBmdWxsKG9ubHkgY2FuIHN1cHBvcnQgJWQgRExTIHNlc3Npb24pIFxuIiwgTUFYX05VTV9PRl9ETFNfRU5UUlkgLSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSB1c2UgZW50cnkoJWQpICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCWksIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKwkJfQorCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzUnNwSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUnNwSGRyLAorCQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJCTIsCQkJCQkJCSZTdGF0dXNDb2RlLAorCQkJCQkJNiwJCQkJCQkJU0EsCisJCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkJMiwJCQkJCQkJJnBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJMSwJCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJCTEsCQkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAlwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCSAgMSwJCQkJCQkmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgCXBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQl7CisJCQlVQ0hBUiBIdExlbjsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKwkJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCQlIdExlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQkJSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOworCQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJCUh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCQlGcmFtZUxlbiA9IEZyYW1lTGVuICsgdG1wOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJaWYgKHBETFMgJiYgKHBETFMtPlN0YXR1cyAhPSBETFNfRklOSVNIKSkKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCVRpbWVvdXQgPSBETFNfVElNRU9VVDsKKwkJCVJUTVBTZXRUaW1lcigmcERMUy0+VGltZXIsIFRpbWVvdXQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSc3BIZHIsCisJCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQkJMiwJCQkJCQkJJlN0YXR1c0NvZGUsCisJCQkJCQk2LAkJCQkJCQlTQSwKKwkJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJfQorCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckRsc1JzcEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUCQlDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUgkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJCVN0YXR1c0NvZGU7CisJU0hPUlQJCWk7CisJQk9PTEVBTgkJVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworICAgIFVDSEFSCQlTdXBwb3J0ZWRSYXRlc0xlbjsKKyAgICBVQ0hBUgkJU3VwcG9ydGVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQlIdENhcGFiaWxpdHlMZW47CisJSFRfQ0FQQUJJTElUWV9JRQlIdENhcGFiaWxpdHk7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJCXJldHVybjsKKworCWlmICghUGVlckRsc1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1c0NvZGUsCisJCQkJCQkJJlN1cHBvcnRlZFJhdGVzTGVuLCAmU3VwcG9ydGVkUmF0ZXNbMF0sICZIdENhcGFiaWxpdHlMZW4sICZIdENhcGFiaWxpdHkpKQorCQlyZXR1cm47CisKKyAgICAvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQorICAgIGZvciAoaT0wOyBpPFN1cHBvcnRlZFJhdGVzTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2YpKQorICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZjsKKyAgICB9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggU3RhdHVzQ29kZT0lZCwgQ2FwYWJpbGl0eUluZm89MHgleFxuIiwKKwkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSwgU3RhdHVzQ29kZSwgQ2FwYWJpbGl0eUluZm8pKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCisJCQl7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOworCisJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorCQkJCXsKKwkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOworCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKKwkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOworCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKKwkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOworCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOworCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKKwkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCX0KKworCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOworCisJCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQl9CisKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOworCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7CisKKwkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQl7CisJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQkJCQlDSEFSICAgIGlpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOworCQkJCQl9CisKKwkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKKwkJCQkJeworCQkJCQkJaiA9IGlpLzg7CisJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOworCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoaWk9PTApCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCisJCQkJCXsKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKKwkJCQkJCXsKKwkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCisJCQkJCQl7CisJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7CisJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJUFVDSEFSIHBUYWJsZTsKKwkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKKworCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CisJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKworCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCQkJCX0KKwkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJeworCQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKKwkJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCisJCQkJCWlmIChSVE1QU2VuZFNUQUtleVJlcXVlc3QocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQl7CisJCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7CisKKwkJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aGVuIGNhbGwgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0IFxuIikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSB3YWl0aW5nIGZvciBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZVxuIikpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggU3VjY2VlZCB3aXRoIFdFUCBvciBubyBzZWN1cml0eVxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCQkJCX0KKworCQkJCS8vaW5pdGlhbGl6ZSBzZXEgbm8gZm9yIERMUyBmcmFtZXMuCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQllbHNlCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIERMUyBzZXR1cCBwcm9jZWR1cmUgZmFpbGVkLgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdpdGggU3RhdHVzQ29kZT0lZCBcbiIsIFN0YXR1c0NvZGUpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChpID49IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSB1cGRhdGUgdGltZW91dCB2YWx1ZSBcbiIpKTsKKwkJZm9yIChpPShNQVhfTlVNX09GX0RMU19FTlRSWS0xKTsgaT49TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaS0tKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKKwkJCQl7CisJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOworCisJCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKwkJCQkJeworCQkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOworCQkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworCQkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOworCQkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOworCQkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworCQkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOworCQkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOworCQkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7CisKKwkJCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7CisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7CisKKwkJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCQl7CisJCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJCQkJCUNIQVIgICAgaWk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOworCQkJCQkJfQorCisJCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOworCQkJCQkJfQorCisJCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCisJCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKKwkJCQkJCXsKKwkJCQkJCQlqID0gaWkvODsKKwkJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOworCQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQorCQkJCQkJCXsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoaWk9PTApCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCisJCQkJCQl7CisJCQkJCQkJcHJpbnRrKCJAQEAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9ICVkXG4iLAorCQkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKKwkJCQkJCQl7CisJCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKKwkJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCQkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkJCXsKKwkJCQkJCVBVQ0hBUiBwVGFibGU7CisJCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOworCisJCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJeworCQkJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCisJCQkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKKwkJCQkJCWlmIChSVE1QU2VuZFNUQUtleVJlcXVlc3QocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQkJeworCQkJCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwkJCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7CisKKwkJCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdoZW4gY2FsbCBSVE1QU2VuZFNUQUtleVJlcXVlc3QgXG4iKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gd2FpdGluZyBmb3IgU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmVcbiIpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBTdWNjZWVkIHdpdGggV0VQIG9yIG5vIHNlY3VyaXR5XG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisJCQkJCX0KKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCQllbHNlCisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gRExTIHNldHVwIHByb2NlZHVyZSBmYWlsZWQuCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdpdGggU3RhdHVzQ29kZT0lZCBcbiIsIFN0YXR1c0NvZGUpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1RFQVJET1dOOworCVVTSE9SVAkJCVJlYXNvbkNvZGUgPSBSRUFTT05fUU9TX1VOU1BFQ0lGWTsKKwlIRUFERVJfODAyXzExCURsc1RlYXJEb3duSGRyOworCVBSVF84MDJfMTFfRExTCXBETFM7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCVVDSEFSCQkJaTsKKworCWlmKCFNbG1lRGxzUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZwRExTLCAmUmVhc29uQ29kZSkpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gTWxtZURsc1RlYXJEb3duQWN0aW9uKCkgd2l0aCBSZWFzb25Db2RlPSVkIFxuIiwgUmVhc29uQ29kZSkpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBNbG1lRGxzVGVhckRvd25BY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNUZWFyRG93bkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzVGVhckRvd25IZHIsCisJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJNiwJCQkJCQkJJnBETFMtPk1hY0FkZHIsCisJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCTIsCQkJCQkJCSZSZWFzb25Db2RlLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCS8vIFJlbW92ZSBrZXkgaW4gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwkvLyBjbGVhciBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaSA9IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJCQlSZWFzb25Db2RlOworCVVJTlQJCQlpOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCWlmICghSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuOworCisJaWYgKCFQZWVyRGxzVGVhckRvd25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmUmVhc29uQ29kZSkpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1RlYXJEb3duQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFJlYXNvbkNvZGU9JWRcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0sIFJlYXNvbkNvZGUpKTsKKworCS8vIGNsZWFyIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCS8vQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwkvLyBjbGVhciBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQkvL0FzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUlRNUENoZWNrRExTVGltZU91dCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVTE9ORwkJCQlpOworCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19VTlNQRUNJRlk7CisKKwlpZiAoISBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCEgSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuOworCisJLy8gSWYgdGltZW91dCB2YWx1ZSBpcyBlcXVhbGVkIHRvIHplcm8sIGl0IG1lYW5zIGFsd2F5cyBub3QgYmUgdGltZW91dC4KKworCS8vIHVwZGF0ZSBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSAwKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgLS07CisKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9PSAwKQorCQkJeworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJfQorCQl9CisJfQorCisJLy8gdXBkYXRlIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IDApKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciAtLTsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID09IDApCisJCQl7CisJCQkJcmVhc29uID0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBSVE1QUmN2RnJhbWVETFNDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAorCUlOIFVMT05HCQkJTGVuLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCXBSeEQpCit7CisJVUxPTkcJCQlpOworCUJPT0xFQU4JCQliRmluZEVudHJ5ID0gRkFMU0U7CisJQk9PTEVBTgkJCWJTVEFLZXlGcmFtZSA9IEZBTFNFOworCVBFQVBPTF9QQUNLRVQJcEVhcDsKKwlQVUNIQVIJCQlwUHJvdG8sIHBBZGRyID0gTlVMTDsKKwlQVUNIQVIJCQlwU1RBS2V5ID0gTlVMTDsKKwlVQ0hBUgkJCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIJCQlNaWNbMTZdLCBPbGRNaWNbMTZdOworCVVDSEFSCQkJZGlnZXN0WzgwXTsKKwlVQ0hBUgkJCURsc1BUS1s4MF07CisJVUNIQVIJCQl0ZW1wWzY0XTsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJQ0lQSEVSX0tFWQkJUGFpcndpc2VLZXk7CisKKworCWlmICghIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJaWYgKCEgSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCWlmICghIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlpZiAoTGVuIDwgTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMikKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCXBQcm90bwk9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTEgKyAyICsgNjsJLy8gUU9TIENvbnRyb2wgZmllbGQgLCAweEFBIDB4QUEgMHhBQSAweDAwIDB4MDAgMHgwMAorCXBBZGRyCT0gcEhlYWRlci0+QWRkcjI7CisKKwkvLyBMMlBBRCBiaXQgb24gd2lsbCBwYWQgMiBieXRlcyBhdCBMTEMKKwlpZiAocFJ4RC0+TDJQQUQpCisJeworCQlwUHJvdG8gKz0gMjsKKwl9CisKKwlpZiAoUlRNUEVxdWFsTWVtb3J5KEVBUE9MLCBwUHJvdG8sIDIpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSAgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwl7CisJCXBFYXAgPSAoUEVBUE9MX1BBQ0tFVCkgKHBQcm90byArIDIpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgTGVuPSVsZCwgRGF0YUxlbj0lZCwgS2V5TWljPSVkLCBJbnN0YWxsPSVkLCBLZXlBY2s9JWQsIFNlY3VyZT0lZCwgRUtEX0RMPSVkLCBFcnJvcj0lZCwgUmVxdWVzdD0lZFxuIiwgTGVuLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFICsgMTYpLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlNaWMsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleUFjaywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uU2VjdXJlLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5FS0RfREwsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVycm9yLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5SZXF1ZXN0KSk7CisKKwkJaWYgKChMZW4gPj0gKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyAxNikpICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlNaWMKKwkJCSYmIHBFYXAtPktleURlc2MuS2V5SW5mby5JbnN0YWxsICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlBY2sgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZQorCQkJJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCAmJiAhcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVycm9yICYmICFwRWFwLT5LZXlEZXNjLktleUluZm8uUmVxdWVzdCkKKwkJeworCQkJLy8gRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIKKwkJCS8vIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIKKwkJCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJaWYgKChSVE1QQ29tcGFyZU1lbW9yeShwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCisJCQkJKFJUTVBDb21wYXJlTWVtb3J5KHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMCkpCisJCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCQkJLy9SVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgcmVwbGF5IGNvdW50ZXIgKCUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCkgTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzBdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzFdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzJdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbM10sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNF0sCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNV0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls2XSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls3XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQkJLy8gcHV0IHRoZXNlIGNvZGUgc2VnbWVudCB0byBnZXQgdGhlIHJlcGxheSBjb3VudGVyCisJCQlpZiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKQorCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwkJCS8vIENoZWNrIE1JQyB2YWx1ZQorCQkJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCQkJLy8gdXNlIHByb3ByaWV0YXJ5IFBUSworCQkJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOworCQkJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOworCQkJV3BhQ291bnRQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKKworCQkJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwRWFwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCQlOZGlzWmVyb01lbW9yeShwRWFwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJLy8gQUVTCisJCQkJSE1BQ19TSEExKChQVUNIQVIpIHBFYXAsIHBFYXAtPkJvZHlfTGVuWzFdICsgNCwgRGxzUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCQkJTmRpc01vdmVNZW1vcnkoTWljLAlkaWdlc3QsCUxFTl9LRVlfREVTQ19NSUMpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWhtYWNfbWQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwRWFwLCBwRWFwLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJCQl9CisKKwkJCWlmICghTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIE1zZzEgb2YgU1RBS2V5IGhhbmRzaGFrZSEgXG4iKSk7CisJCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNSUMgVkFMSUQgaW4gTXNnMSBvZiBTVEFLZXkgaGFuZHNoYWtlISBcbiIpKTsKKyNpZiAxCisJCQlpZiAoKHBFYXAtPktleURlc2MuS2V5RGF0YVswXSA9PSAweEREKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzJdID09IDB4MDApICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbM10gPT0gMHgwQykKKwkJCQkmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzRdID09IDB4NDMpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNV0gPT0gMHgwMikpCisJCQl7CisJCQkJcEFkZHIJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDg7CQkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMikKKwkJCQlwU1RBS2V5CQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyAxNDsJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpLCBTVEFLZXlfTWFjX0FkZHIoNikKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQkJcEFkZHJbMF0sIHBBZGRyWzFdLCBwQWRkclsyXSwgcEFkZHJbM10sIHBBZGRyWzRdLCBwQWRkcls1XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQkJCWJTVEFLZXlGcmFtZSA9IFRSVUU7CisJCQl9CisjZWxzZQorCQkJaWYgKChwRWFwLT5LZXlEZXNjLktleURhdGFbMF0gPT0gMHhERCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVsyXSA9PSAweDAwKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzNdID09IDB4MEYpCisJCQkJJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs0XSA9PSAweEFDKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzVdID09IDB4MDIpKQorCQkJeworCQkJCXBBZGRyCQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyA4OwkJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpCisJCQkJcFNUQUtleQkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgMTQ7CS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKSwgU1RBS2V5X01hY19BZGRyKDYpCisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IExlbj0lZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQkJcEFkZHJbMF0sIHBBZGRyWzFdLCBwQWRkclsyXSwgcEFkZHJbM10sIHBBZGRyWzRdLCBwQWRkcls1XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQkJCWJTVEFLZXlGcmFtZSA9IFRSVUU7CisJCQl9CisjZW5kaWYKKworCQl9CisJCWVsc2UgaWYgKExlbiA+PSAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSkpCisJCXsKKyNpZiAwCisJCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisjZW5kaWYKKwkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIHJlcGxheSBjb3VudGVyIDIoJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4KSBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMF0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMV0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMl0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclszXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls0XSwJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls1XSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzZdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzddLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCX0KKwl9CisKKwkvLyBJZiB0aW1lb3V0IHZhbHVlIGlzIGVxdWFsZWQgdG8gemVybywgaXQgbWVhbnMgYWx3YXlzIG5vdCBiZSB0aW1lb3V0LgorCS8vIHVwZGF0ZSBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwocEFkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlpZiAoYlNUQUtleUZyYW1lKQorCQkJeworCQkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5OworCisJCQkJLy8gU1RBS2V5IGZyYW1lLCBhZGQgcGFpcndpc2Uga2V5IHRhYmxlCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkJUGFpcndpc2VLZXkuS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuS2V5LCAmcFNUQUtleVswXSwgTEVOX1RLSVBfRUspOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlR4TWljLCAmcFNUQUtleVsxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuUnhNaWMsICZwU1RBS2V5WzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOworCisJCQkJcEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOworCQkJCS8vQXNpY0FkZEtleUVudHJ5KHBBZCwgKFVTSE9SVCkoaSArIDIpLCBCU1MwLCAwLCAmUGFpcndpc2VLZXksIFRSVUUsIFRSVUUpOwkvLyByZXNlcnZlIDAgZm9yIG11bHRpY2FzdCwgMSBmb3IgdW5pY2FzdAorCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7CisJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworI2lmZGVmIFJUMjg3MAorCQkJCXsKKwkJCQkJUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSBLZXlJbmZvOworCQkJCQlDT1BZX01BQ19BRERSKEtleUluZm8uTWFjQWRkcixwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJS2V5SW5mby5NYWNUYWJNYXRjaFdDSUQ9cEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmS2V5SW5mby5DaXBoZXJLZXksICAmUGFpcndpc2VLZXksc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBSVF9DTURfU0VUX0tFWV9UQUJMRSwgJktleUluZm8sIHNpemVvZihSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZKSk7CisJCQkJfQorCQkJCXsKKwkJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRExTRW50cnk7CisJCQkJCXBETFNFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkJcERMU0VudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGc9UGFpcndpc2VLZXkuQ2lwaGVyQWxnOworCQkJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRSwgcERMU0VudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQkJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCAmUGFpcndpc2VLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgKFBlZXIgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSkgXG4iKSk7CisKKwkJCQlSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBGaW5pc2ggU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmUgKEluaXRpYXRvciBzaWRlKVxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCX0KKwkJCX0KKworCQkJYkZpbmRFbnRyeSA9IFRSVUU7CisJCX0KKwl9CisKKwkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKGJTVEFLZXlGcmFtZSkKKwkJCXsKKwkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwkJCQkvLyBTVEFLZXkgZnJhbWUsIGFkZCBwYWlyd2lzZSBrZXkgdGFibGUsIGFuZCBzZW5kIFNUQWtleSBNc2ctMgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJCQlQYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZzsKKworCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKKwkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKyNpZmRlZiBSVDI4NzAKKwkJCQl7CisJCQkJCVJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkgS2V5SW5mbzsKKwkJCQkJQ09QWV9NQUNfQUREUihLZXlJbmZvLk1hY0FkZHIscEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCUtleUluZm8uTWFjVGFiTWF0Y2hXQ0lEPXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRDsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJktleUluZm8uQ2lwaGVyS2V5LCAgJlBhaXJ3aXNlS2V5LHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgUlRfQ01EX1NFVF9LRVlfVEFCTEUsICZLZXlJbmZvLCBzaXplb2YoUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSkpOworCQkJCX0KKwkJCQl7CisJCQkJCVBNQUNfVEFCTEVfRU5UUlkgcERMU0VudHJ5OworCQkJCQlwRExTRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgVFJVRSk7CisJCQkJCXBETFNFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnPVBhaXJ3aXNlS2V5LkNpcGhlckFsZzsKKwkJCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBSVF9DTURfU0VUX1JYX1dDSURfVEFCTEUsIHBETFNFbnRyeSwgc2l6ZW9mKE1BQ19UQUJMRV9FTlRSWSkpOworCQkJCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleSwgJlBhaXJ3aXNlS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIChJbml0aWF0b3IgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSlcbiIpKTsKKworCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCWlmIChSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXsKKwkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7CisKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gRmluaXNoIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlIChQZWVyIHNpZGUpXG4iKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCX0KKwkJCX0KKworCQkJYkZpbmRFbnRyeSA9IFRSVUU7CisJCX0KKwl9CisKKworCXJldHVybiBiU1RBS2V5RnJhbWU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlcgl0byBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCURMUyBlbnRyeSBpbmRleAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlSVE1QQ2hlY2tETFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSkKK3sKKwlJTlQgcnZhbCA9IC0xOworCUlOVAlpOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJCXJldHVybiBydmFsOworCisJZG97CisJCS8vIGNoZWNrIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlydmFsID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIGNoZWNrIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlydmFsID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKworCXJldHVybiBydmFsOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVVNIT1JUCQkJUmVhc29uID0gUkVBU09OX1FPU19RU1RBX0xFQVZJTkdfUUJTUzsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19URUFSRE9XTjsKKwlVQ0hBUgkJCWkgPSAwOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIERMUyBUZWFyRG93biBGcmFtZSBcbiIpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQVNTT0MgLSBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNUZWFyRG93bkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQlwREEsCisJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCTIsCQkJCQkJCSZSZWFzb24sCisJCQkJCUVORF9PRl9BUkdTKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkvLyBSZW1vdmUga2V5IGluIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwkvLyBSZW1vdmUga2V5IGluIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgRExTIFRlYXJEb3duIEZyYW1lIGFuZCByZW1vdmUga2V5IGluIChpPSVkKSBcbiIsIGkpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleVJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKQoreworCVVDSEFSCQkJCUhlYWRlcjgwMl8zWzE0XTsKKwlORElTX1NUQVRVUwkJCU5TdGF0dXM7CisJVUxPTkcJCQkJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVAkJUGFja2V0OworCVVDSEFSCQkJCU1pY1sxNl07CisJVUNIQVIJCQkJZGlnZXN0WzgwXTsKKwlQVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUE5ESVNfUEFDS0VUCQlwTmRpc1BhY2tldDsKKwlVQ0hBUgkJCQl0ZW1wWzY0XTsKKwlVQ0hBUgkJCQlEbHNQVEtbODBdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSVE1QU2VuZFNUQUtleVJlcXVlc3QoKSB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgcERBWzBdLCBwREFbMV0sIHBEQVsyXSwgcERBWzNdLCBwREFbNF0sIHBEQVs1XSkpOworCisJcEFkLT5TZXF1ZW5jZSArKzsKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUgICAgPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyA2ICsgTUFDX0FERFJfTEVOOwkJLy8gZGF0YSBmaWVsZCBjb250YWluIEtERSBhbmRQZWVyIE1BQyBhZGRyZXNzCisKKwkvLyBTVEFLZXkgTWVzc2FnZSBpcyBhcyBFQVBPTC1LZXkoMSwxLDAsMCxHLzAsMCwwLCBNSUMsIDAsUGVlciBNQUMgS0RFKQorCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworICAgIH0KKyAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisgICAgfQorCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbgorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9CisJCSgoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOworCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMJPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlCT0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QJPSAxOworCisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXQk9IDEyOworCisJLy8gdXNlIG91ciBvd24gT1VJIHRvIGRpc3Rpbmd1aXNoIHByb3ByaWV0YXJ5IHdpdGggc3RhbmRhcmQuCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXQkJPSAweEREOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0JCT0gMHgwQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdCQk9IDB4MDA7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVszXQkJPSAweDBDOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNF0JCT0gMHg0MzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzVdCQk9IDB4MDM7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbNl0sIHBEQSwgTUFDX0FERFJfTEVOKTsKKworCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIE5TdGF0dXM7CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOworCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJLy8gY2FsY3VsYXRlIE1JQworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlOZGlzWmVyb01lbW9yeShkaWdlc3QsCXNpemVvZihkaWdlc3QpKTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlOZGlzWmVyb01lbW9yeShNaWMsCXNpemVvZihNaWMpKTsKKwkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkgICAgICAgICAgICAgICAgICBzaXplb2YoSGVhZGVyODAyXzMpLAlIZWFkZXI4MDJfMywKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LAkmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5TdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBOZGlzUGFja2V0LCBOVUxMLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBOZGlzUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJU1RBU2VuZFBhY2tldChwQWQsIHBOZGlzUGFja2V0KTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNlbmRTVEFLZXlSZXF1ZXN0LSBTZW5kIFNUQUtleSByZXF1ZXN0IChOU3RhdHVzPSV4LCBGcmFtZUxlbj0lbGQpXG4iLCBOU3RhdHVzLCBGcmFtZUxlbikpOworCisJcmV0dXJuIE5TdGF0dXM7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKQoreworCVVDSEFSCQkJCUhlYWRlcjgwMl8zWzE0XTsKKwlORElTX1NUQVRVUwkJCU5TdGF0dXM7CisJVUxPTkcJCQkJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVAkJUGFja2V0OworCVVDSEFSCQkJCU1pY1sxNl07CisJVUNIQVIJCQkJZGlnZXN0WzgwXTsKKwlQVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUE5ESVNfUEFDS0VUCQlwTmRpc1BhY2tldDsKKwlVQ0hBUgkJCQl0ZW1wWzY0XTsKKwlVQ0hBUgkJCQlEbHNQVEtbODBdOwkJCS8vIER1ZSB0byBkaXJ2ZXIgY2FuIG5vdCBnZXQgUFRLLCB1c2UgcHJvcHJpZXRhcnkgUFRLCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBEQVswXSwgcERBWzFdLCBwREFbMl0sIHBEQVszXSwgcERBWzRdLCBwREFbNV0pKTsKKworCXBBZC0+U2VxdWVuY2UgKys7CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyID0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlICAgID0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgNiArIE1BQ19BRERSX0xFTjsJCS8vIGRhdGEgZmllbGQgY29udGFpbiBLREUgYW5kIFBlZXIgTUFDIGFkZHJlc3MKKworCS8vIFNUQUtleSBNZXNzYWdlIGlzIGFzIEVBUE9MLUtleSgxLDEsMCwwLEcvMCwwLDAsIE1JQywgMCxQZWVyIE1BQyBLREUpCisJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisgICAgfQorICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKyAgICB9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0KKwkJKCgocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fCAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYwk9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUJPSAxOworCisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXQk9IDEyOworCisJLy8gdXNlIG91ciBvd24gT1VJIHRvIGRpc3Rpbmd1aXNoIHByb3ByaWV0YXJ5IHdpdGggc3RhbmRhcmQuCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXQkJPSAweEREOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0JCT0gMHgwQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdCQk9IDB4MDA7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVszXQkJPSAweDBDOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNF0JCT0gMHg0MzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzVdCQk9IDB4MDM7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbNl0sIHBEQSwgTUFDX0FERFJfTEVOKTsKKworCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIE5TdGF0dXM7CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOworCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJLy8gY2FsY3VsYXRlIE1JQworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlOZGlzWmVyb01lbW9yeShkaWdlc3QsCXNpemVvZihkaWdlc3QpKTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlOZGlzWmVyb01lbW9yeShNaWMsCXNpemVvZihNaWMpKTsKKwkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkgICAgICAgICAgICAgICAgICBzaXplb2YoSGVhZGVyODAyXzMpLAlIZWFkZXI4MDJfMywKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LAkmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5TdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBOZGlzUGFja2V0LCBOVUxMLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBOZGlzUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJU1RBU2VuZFBhY2tldChwQWQsIHBOZGlzUGFja2V0KTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UtIFNlbmQgU1RBS2V5IE1lc3NhZ2UtMiAoTlN0YXR1cz0leCwgRnJhbWVMZW49JWxkKVxuIiwgTlN0YXR1cywgRnJhbWVMZW4pKTsKKworCXJldHVybiBOU3RhdHVzOworfQorCitWT0lEIERsc1RpbWVvdXRBY3Rpb24oCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCU1MTUVfRExTX1JFUV9TVFJVQ1QJCU1sbWVEbHNSZXE7CisJVVNIT1JUCQkJCQlyZWFzb247CisJUFJUXzgwMl8xMV9ETFMJCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUZ1bmN0aW9uQ29udGV4dDsKKwlQUlRNUF9BREFQVEVSCQkJcEFkID0gcERMUy0+cEFkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGxzVGltZW91dCAtIFRlYXIgZG93biBETFMgbGlua3MgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKKwkJcERMUy0+TWFjQWRkclswXSwgcERMUy0+TWFjQWRkclsxXSwgcERMUy0+TWFjQWRkclsyXSwgcERMUy0+TWFjQWRkclszXSwgcERMUy0+TWFjQWRkcls0XSwgcERMUy0+TWFjQWRkcls1XSkpOworCisJaWYgKChwRExTKSAmJiAocERMUy0+VmFsaWQpKQorCXsKKwkJcmVhc29uCQkJPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJcERMUy0+VmFsaWQJCT0gRkFMU0U7CisJCXBETFMtPlN0YXR1cwk9IERMU19OT05FOworCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCBwRExTLCByZWFzb24pOworCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0Rlc2NyaXB0aW9uIDogYmVjYXVzZSBETFMgYW5kIENMSSBzaGFyZSB0aGUgc2FtZSBXQ0lEIHRhYmxlIGluIEFTSUMuCitNZXNoIGVudHJ5IGFsc28gaW5zZXJ0IHRvIHBBZC0+TWFjVGFiLmNvbnRlbnRbXS4gIFN1Y2ggaXMgbWFya2VkIGFzIFZhbGlkQXNEbHMgPSBUUlVFLgorQWxzbyBmaWxscyB0aGUgcGFpcndpc2Uga2V5LgorQmVjYXVzZSBmcm9udCBNQVhfQUlEX0JBIGVudHJpZXMgaGF2ZSBkaXJlY3QgbWFwcGluZyB0byBCQUVudHJ5LCB3aGljaCBpcyBvbmx5IHVzZWQgYXMgQ0xJLiBTbyB3ZSBpbnNlcnQgRGxzCitmcm9tIGluZGV4IE1BWF9BSURfQkEuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydERsc0VudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIJcEFkZHIsCisJSU4gIFVJTlQJRGxzRW50cnlJZHgpCit7CisJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTWFjVGFibGVJbnNlcnREbHNFbnRyeVxuIikpOworCS8vIGlmIEZVTEwsIHJldHVybgorCWlmIChwQWQtPk1hY1RhYi5TaXplID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gTlVMTDsKKworCWRvCisJeworCQlpZigocEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZGRyLCBUUlVFKSkgIT0gTlVMTCkKKwkJCWJyZWFrOworCisJCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsIHBBZGRyLCBEbHNFbnRyeUlkeCArIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMsIFRSVUUpOworCQlpZiAocEVudHJ5KQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtEbHNFbnRyeUlkeF0uTWFjVGFiTWF0Y2hXQ0lEID0gcEVudHJ5LT5BaWQ7CisJCQlwRW50cnktPk1hdGNoRGxzRW50cnlJZHggPSBEbHNFbnRyeUlkeDsKKwkJCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKKwkJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydERsc0VudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIscEVudHJ5LT5BaWQsIHBBZC0+TWFjVGFiLlNpemUpKTsKKworCQkJLy8gSWYgbGVnYWN5IFdFUCBpcyB1c2VkLCBzZXQgcGFpci13aXNlIGNpcGhlckFsZyBpbnRvIFdDSUQgYXR0cmlidXRlIHRhYmxlIGZvciB0aGlzIGVudHJ5CisJCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0RscykgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkKKwkJCXsKKwkJCQlVQ0hBUiBLZXlJZHggPSAwOworCQkJCVVDSEFSIENpcGhlckFsZyA9IDA7CisKKwkJCQlLZXlJZHgJPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisKKwkJCQlDaXBoZXJBbGcgCT0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCQkJQlNTMCwKKwkJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkJCQkJcEVudHJ5KTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT09IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnlcbiIpKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlEZWxldGUgYWxsIE1lc2ggRW50cnkgaW4gcEFkLT5NYWNUYWIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRGxzRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisJSU4gUFVDSEFSIHBBZGRyKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IE1hY1RhYmxlRGVsZXRlRGxzRW50cnlcbiIpKTsKKworCWlmICghVkFMSURfV0NJRCh3Y2lkKSkKKwkJcmV0dXJuIEZBTFNFOworCisJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHdjaWQsIHBBZGRyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT09IE1hY1RhYmxlRGVsZXRlRGxzRW50cnlcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJUlRNUF9TRU1fTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKwlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKworCXdoaWxlIChwRW50cnkpCisJeworCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQorCQkJJiYgTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKwkJCWlmKGJSZXNldElkZWxDb3VudCkKKwkJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKwlyZXR1cm4gcEVudHJ5OworfQorCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJd2NpZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpCit7CisJVUxPTkcgRExzSW5kZXg7CisJUE1BQ19UQUJMRV9FTlRSWSBwQ3VyRW50cnkgPSBOVUxMOworCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCWlmICghVkFMSURfV0NJRCh3Y2lkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCisJZG8KKwl7CisJCXBDdXJFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOworCisJCURMc0luZGV4ID0gMHhmZjsKKwkJaWYgKChwQ3VyRW50cnkpICYmIChwQ3VyRW50cnktPlZhbGlkQXNEbHM9PSBUUlVFKSkKKwkJeworCQkJRExzSW5kZXggPSBwQ3VyRW50cnktPk1hdGNoRGxzRW50cnlJZHg7CisJCX0KKworCQlpZiAoRExzSW5kZXggPT0gMHhmZikKKwkJCWJyZWFrOworCisJCWlmIChNQUNfQUREUl9FUVVBTChwQ3VyRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCQkJaWYoYlJlc2V0SWRlbENvdW50KQorCQkJCXBDdXJFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeSA9IHBDdXJFbnRyeTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCitJTlQgU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlJTlQgaTsKKworCXByaW50aygiXG4lLTE5cyUtOHNcbiIsICJNQUMiLCAiVElNRU9VVFxuIik7CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCXsKKwkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEXTsKKworCQkJcHJpbnRrKCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgIiwKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzBdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzFdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzJdLAorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbM10sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbNF0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbNV0pOworCQkJcHJpbnRrKCIlLThkXG4iLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KTsKKworCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKCJcbiUtMTlzJS00cyUtNHMlLTRzJS00cyUtN3MlLTdzJS03cyIsIk1BQyIsICJBSUQiLCAiQlNTIiwgIlBTTSIsICJXTU0iLCAiUlNTSTAiLCAiUlNTSTEiLCAiUlNTSTIiKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXByaW50aygiJS04cyUtMTBzJS02cyUtNnMlLTZzJS02cyIsICJNSU1PUFMiLCAiUGhNZCIsICJCVyIsICJNQ1MiLCAiU0dJIiwgIlNUQkMiKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXByaW50aygiXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJcHJpbnRrKCIlLTRkIiwgKGludClwRW50cnktPkFpZCk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+YXBpZHgpOworCQkJcHJpbnRrKCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKTsKKwkJCXByaW50aygiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7CisJCQlwcmludGsoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEpOworCQkJcHJpbnRrKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXByaW50aygiJS04ZCIsIChpbnQpcEVudHJ5LT5NbXBzTW9kZSk7CisJCQlwcmludGsoIiUtMTBzIiwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSk7CisJCQlwcmludGsoIiUtNnMiLCBHZXRCVyhwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVykpOworCQkJcHJpbnRrKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKTsKKwkJCXByaW50aygiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpOworCQkJcHJpbnRrKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlwcmludGsoIiUtMTBkLCAlZCwgJWQlJVxuIiwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCisJCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCk7CisJCQlwcmludGsoIlxuIik7CisKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0Rsc0FkZEVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSCW1hY1tNQUNfQUREUl9MRU5dOworCVVTSE9SVAlUaW1lb3V0OworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIFJUXzgwMl8xMV9ETFMJRGxzOworCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGltZW91dCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJVGltZW91dCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCSAgICBwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJWQiLCBtYWNbMF0sIG1hY1sxXSwKKwkgICAgICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgKGludClUaW1lb3V0KTsKKworCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCQlEbHMuVGltZU91dCA9IFRpbWVvdXQ7CisJCUNPUFlfTUFDX0FERFIoRGxzLk1hY0FkZHIsIG1hYyk7CisJCURscy5WYWxpZCA9IDE7CisKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJCSZEbHMpOworCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIJCQltYWNBZGRyW01BQ19BRERSX0xFTl07CisJQ0hBUgkJCSp2YWx1ZTsKKwlJTlQJCQkJaTsKKwlSVF84MDJfMTFfRExTCURsczsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisJZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisJCUF0b0godmFsdWUsICZtYWNBZGRyW2krK10sIDIpOworCX0KKworCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIG1hY0FkZHJbMF0sIG1hY0FkZHJbMV0sCisJICAgICAgICAgICBtYWNBZGRyWzJdLCBtYWNBZGRyWzNdLCBtYWNBZGRyWzRdLCBtYWNBZGRyWzVdKTsKKworCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjQWRkcik7CisJRGxzLlZhbGlkID0gMDsKKworCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCSZEbHMpOworCisJcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3J0bXBfZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvcnRtcF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0MmVjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3J0bXBfZGF0YS5jCkBAIC0wLDAgKzEsMjYxOSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX2RhdGEuYworCisJQWJzdHJhY3Q6CisJRGF0YSBwYXRoIHN1YnJvdXRpbmVzCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCSAgICAgIEF1Zy8xNy8wNAkJbWFqb3IgbW9kaWZpY2F0aW9uIGZvciBSVDI1NjEvMjY2MQorCUphbiBMZWUJICAgICAgTWFyLzE3LzA2CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjg2MCBOZXcgUmluZyBEZXNpZ24KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJVUNIQVIJCQkqcFRtcEJ1ZjsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCXsKKwkJLy8gQWxsIEVBUG9MIGZyYW1lcyBoYXZlIHRvIHBhc3MgdG8gdXBwZXIgbGF5ZXIgKGV4LiBXUEFfU1VQUExJQ0FOVCBkYWVtb24pCisJCS8vIFRCRCA6IHByb2Nlc3MgZnJhZ21lbnRlZCBFQVBvbCBmcmFtZXMKKwkJeworCQkJLy8gSW4gODAyLjF4IG1vZGUsIGlmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtU1VDQ0VTUyBwYWNrZXQsIHR1cm4gb24gdGhlIFBvcnRTZWN1cmVkIHZhcmlhYmxlCisJCQlpZiAoIHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFICYmCisJCQkJIChFQVBfQ09ERV9TVUNDRVNTID09IFdwYUNoZWNrRWFwQ29kZShwQWQsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIExFTkdUSF84MDJfMV9IKSkpCisJCQl7CisJCQkJUFVDSEFSCUtleTsKKwkJCQlVQ0hBUiAJQ2lwaGVyQWxnOworCQkJCWludCAgICAgaWR4ID0gMDsKKworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1TVUNDRVNTIFBhY2tldFxuIikpOworCQkJCS8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZHggPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZDsKKyAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uQ2lwaGVyQWxnOworCQkJCQlLZXkgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbiA+IDApCisgICAgCQkJCXsKKyNpZmRlZiBSVDI4NzAKKwkJCQkJCXVuaW9uCisJCQkJCQl7CisJCQkJCQkJY2hhciBidWZbc2l6ZW9mKE5ESVNfODAyXzExX1dFUCkrTUFYX0xFTl9PRl9LRVktIDFdOworCQkJCQkJCU5ESVNfODAyXzExX1dFUCBrZXlpbmZvOworCQkJCQkJfSAgV2VwS2V5OworCQkJCQkJaW50IGxlbjsKKworCisJCQkJCQlOZGlzWmVyb01lbW9yeSgmV2VwS2V5LCBzaXplb2YoV2VwS2V5KSk7CisJCQkJCQlsZW4gPXBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKKworCQkJCQkJTmRpc01vdmVNZW1vcnkoV2VwS2V5LmtleWluZm8uS2V5TWF0ZXJpYWwsCisJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5LAorCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbik7CisKKwkJCQkJCVdlcEtleS5rZXlpbmZvLktleUluZGV4ID0gMHg4MDAwMDAwMCArIGlkeDsKKwkJCQkJCVdlcEtleS5rZXlpbmZvLktleUxlbmd0aCA9IGxlbjsKKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID0oVUNIQVIpIChsZW4gPD0gNSA/IDUgOiAxMyk7CisKKwkJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCQkJCS8vIG5lZWQgdG8gZW5xdWV1ZSBjbWQgdG8gdGhyZWFkCisJCQkJCQlSVFVTQkVucXVldWVDbWRGcm9tTmRpcyhwQWQsIE9JRF84MDJfMTFfQUREX1dFUCwgVFJVRSwgJldlcEtleSwgc2l6ZW9mKFdlcEtleS5rZXlpbmZvKSArIGxlbiAtIDEpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJCQkJLy8gRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4KKyAgICAJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleSwKKwkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleSwKKwkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbik7CisgICAgCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJLy8gU3BlY2lhbCBEQVRBIGZyYW1lIHRoYXQgaGFzIHRvIHBhc3MgdG8gTUxNRQorCQkvLwkgMS4gQ2lzY28gQWlyb25ldCBmcmFtZXMgZm9yIENDWDIuIFdlIG5lZWQgcGFzcyBpdCB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKKwkJLy8JIDIuIEVBUE9MIGhhbmRzaGFraW5nIGZyYW1lcyB3aGVuIGRyaXZlciBzdXBwbGljYW50IGVuYWJsZWQsIHBhc3MgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCisJCXsKKwkJCXBUbXBCdWYgPSBwUnhCbGstPnBEYXRhIC0gTEVOR1RIXzgwMl8xMTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBUbXBCdWYsIHBSeEJsay0+cEhlYWRlciwgTEVOR1RIXzgwMl8xMSk7CisJCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBUbXBCdWYsIHBSeEJsay0+RGF0YVNpemUgKyBMRU5HVEhfODAyXzExLCBwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVwb3J0IEVBUE9ML0FJUk9ORVQgREFUQSB0byBNTE1FIChsZW49JWQpICEhIVxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQl9CisJfQorCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlyZXR1cm47CisKK30KKworVk9JRCBTVEFSeERhdGFGcmFtZUFubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKworCS8vIG5vbi1FQVAgZnJhbWUKKwlpZiAoIVJUTVBDaGVja1dQQWZyYW1lKHBBZCwgcEVudHJ5LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBGcm9tV2hpY2hCU1NJRCkpCisJeworCQl7CisJCQkvLyBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlCisJCQkvLyB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZAorCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKQorCQkJeworCQkJCS8vIHVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZQorCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCQl7CisJCQkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdAorCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpICYmCisJCQkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQkJCXsKKwkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9FQVApOworCQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSykpCisJCXsKKwkJCS8vIE5vcm1hbCBsZWdhY3ksIEFNUERVIG9yIEFNU0RVCisJCQlDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gQVJBTElOSworCQkJQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9ETFMpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKwllbHNlCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCisJCXsKKwkJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJLy8gRGV0ZXJtaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUKKwkJCS8vICB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllcgorCQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJfQorfQorCisKKy8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQorQk9PTEVBTiBTVEFDaGVja1RraXBNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJVUNIQVIJCQkqcERhdGEgPSBwUnhCbGstPnBEYXRhOworCVVTSE9SVAkJCURhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlVQ0hBUgkJCVVzZXJQcmlvcml0eSA9IHBSeEJsay0+VXNlclByaW9yaXR5OworCVBDSVBIRVJfS0VZCQlwV3BhS2V5OworCVVDSEFSCQkJKnBEQSwgKnBTQTsKKworCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4QmxrLT5wUnhXSS0+S2V5SW5kZXhdOworCisJcERBID0gcEhlYWRlci0+QWRkcjE7CisJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpKQorCXsKKwkJcFNBID0gcEhlYWRlci0+QWRkcjM7CisJfQorCWVsc2UKKwl7CisJCXBTQSA9IHBIZWFkZXItPkFkZHIyOworCX0KKworCWlmIChSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZShwQWQsCisJCQkJCQkJCXBEYXRhLAorCQkJCQkJCQlwREEsCisJCQkJCQkJCXBTQSwKKwkJCQkJCQkJcFdwYUtleS0+UnhNaWMsCisJCQkJCQkJCVVzZXJQcmlvcml0eSwKKwkJCQkJCQkJRGF0YVNpemUpID09IEZBTFNFKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yIDJcbiIpKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKwkJeworCQkJV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLCAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFIDogRkFMU0UpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCXsKKwkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCQl9CisKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8vCisvLyBBbGwgUnggcm91dGluZXMgdXNlIFJYX0JMSyBzdHJ1Y3R1cmUgdG8gaGFuZGUgcnggZXZlbnRzCisvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBidWlsZCBwUnhCbGsgYXR0cmlidXRlcworLy8gIDEuIHBIZWFkZXIgcG9pbnRlciB0byA4MDIuMTEgSGVhZGVyCisvLyAgMi4gcERhdGEgcG9pbnRlciB0byBwYXlsb2FkIGluY2x1ZGluZyBMTEMgKGp1c3Qgc2tpcCBIZWFkZXIpCisvLyAgMy4gc2V0IHBheWxvYWQgc2l6ZSBpbmNsdWRpbmcgTExDIHRvIERhdGFTaXplCisvLyAgNC4gc2V0IHNvbWUgZmxhZ3Mgd2l0aCBSWF9CTEtfU0VUX0ZMQUcoKQorLy8KK1ZPSUQgU1RBSGFuZGxlUnhEYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwkJCQlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCQkJCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJUEhFQURFUl84MDJfMTEJCQkJCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCQkJCQlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlCT09MRUFOIAkJCQkJCWJGcmFnbWVudCA9IEZBTFNFOworCU1BQ19UQUJMRV9FTlRSWQkgICAgCQkJKnBFbnRyeSA9IE5VTEw7CisJVUNIQVIJCQkJCQkJRnJvbVdoaWNoQlNTSUQgPSBCU1MwOworCVVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlclByaW9yaXR5ID0gMDsKKworCXsKKwkJLy8gYmVmb3JlIExJTksgVVAsIGFsbCBEQVRBIGZyYW1lcyBhcmUgcmVqZWN0ZWQKKwkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQorCQlpZiAoUlRNUFJjdkZyYW1lRExTQ2hlY2socEFkLCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBwUnhEKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lcworCQlpZiAocFJ4RC0+TXlCc3MgPT0gMCkKKwkJeworCQkJeworCQkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCsrOworCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpCisJCXsKKwkJCVVDSEFSICpwRGF0YTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiYkFQU0RDYXBhYmxlXG4iKSk7CisKKwkJCS8vIFFvcyBiaXQgNAorCQkJcERhdGEgPSAoUFVDSEFSKXBIZWFkZXIgKyBMRU5HVEhfODAyXzExOworCQkJaWYgKCgqcERhdGEgPj4gNCkgJiAweDAxKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUnhEb25lLSBSY3YgRU9TUCBmcmFtZSwgZHJpdmVyIG1heSBmYWxsIGludG8gc2xlZXBcbiIpKTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gRkFMU0U7CisKKwkJCQkvLyBGb3JjZSBkcml2ZXIgdG8gZmFsbCBpbnRvIHNsZWVwIG1vZGUgd2hlbiByY3YgRU9TUCBmcmFtZQorCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCQl7CisJCQkJCVVTSE9SVCAgVGJ0dE51bVRvTmV4dFdha2VVcDsKKwkJCQkJVVNIT1JUICBOZXh0RHRpbSA9IHBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2Q7CisJCQkJCVVMT05HICAgTm93OworCisJCQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQkJCU5leHREdGltIC09IChVU0hPUlQpKE5vdyAtIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUpL3BBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKworCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQorCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOworCisJCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCQkJCS8vIGlmIFdNTS1BUFNEIGlzIGZhaWxlZCwgdHJ5IHRvIGRpc2FibGUgZm9sbG93aW5nIGxpbmUKKwkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgocEhlYWRlci0+RkMuTW9yZURhdGEpICYmIChwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgYW5vdGhlciB0cmlnZ2VyIGZyYW1lIHdoZW4gTW9yZSBEYXRhIGJpdCBpcyBzZXQgdG8gMVxuIikpOworCQkJfQorCQl9CisKKwkJLy8gRHJvcCBOVUxMLCBDRi1BQ0sobm8gZGF0YSksIENGLVBPTEwobm8gZGF0YSksIGFuZCBDRi1BQ0srQ0YtUE9MTChubyBkYXRhKSBkYXRhIGZyYW1lCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDQpKSAvLyBiaXQgMiA6IG5vIERBVEEKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkgICAgLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lICh3ZSBjYW4gbm90IG9ubHkgY2hlY2sgdGhlIE15QnNzIGJpdCBpbiBSeEQpCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJICAgIGlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJICAgIHsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKwkJCS8vIEluZnJhc3RydWN0dXJlIG1vZGUsIGNoZWNrIGFkZHJlc3MgMiBmb3IgQlNTSUQKKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMiwgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKKwkJCXsKKwkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAorCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0CisJICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWVsc2UJLy8gQWQtSG9jIG1vZGUgb3IgTm90IGFzc29jaWF0ZWQKKwkJeworCQkJLy8gQWQtSG9jIG1vZGUsIGNoZWNrIGFkZHJlc3MgMyBmb3IgQlNTSUQKKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMywgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKKwkJCXsKKwkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAorCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0CisJICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJICAgIH0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBmaW5kIHBFbnRyeQorCQkvLworCQlpZiAocFJ4V0ktPldpcmVsZXNzQ2xpSUQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFJ4V0ktPldpcmVsZXNzQ2xpSURdOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gMS4gcmVsZWFzZSBwYWNrZXQgaWYgaW5mcmEgbW9kZQorCQkJLy8gMi4gbmV3IGEgcEVudHJ5IGlmIGFkLWhvYyBtb2RlCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGluZnJhIG9yIGFkLWhvYworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmICgocEhlYWRlci0+RkMuRnJEcyA9PSAwKSAmJiAocEhlYWRlci0+RkMuVG9EcyA9PSAwKSkKKwkJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCUFTU0VSVChwUnhXSS0+V2lyZWxlc3NDbGlJRCA9PSBCU1NJRF9XQ0lEKTsKKwkJfQorCisJCS8vIGNoZWNrIEF0aGVyb3MgQ2xpZW50CisJCWlmICgocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBGQUxTRSkgJiYgIChwUnhELT5BTVBEVSA9PSAxKSAmJiAocEhlYWRlci0+RkMuUmV0cnkgKSkKKwkJeworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IFRSVUU7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IFRSVUU7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IFRSVUU7CisJCQlpZiAoIVNUQV9BRVNfT04ocEFkKSkKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDgsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgRkFMU0UpOworCQkJfQorCQl9CisJfQorCisJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBIZWFkZXI7CisKKwkvLworCS8vIHVwZGF0ZSBSeEJsay0+cERhdGEsIERhdGFTaXplCisJLy8gODAyLjExIEhlYWRlciwgUU9TLCBIVEMsIEh3IFBhZGRpbmcKKwkvLworCisJLy8gMS4gc2tpcCA4MDIuMTEgSEVBREVSCisJeworCQlwUnhCbGstPnBEYXRhICs9IExFTkdUSF84MDJfMTE7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKKwl9CisKKwkvLyAyLiBRT1MKKwlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfUU9TKTsKKwkJVXNlclByaW9yaXR5ID0gKihwUnhCbGstPnBEYXRhKSAmIDB4MGY7CisJCS8vIGJpdCA3IGluIFFvUyBDb250cm9sIGZpZWxkIHNpZ25hbHMgdGhlIEhUIEEtTVNEVSBmb3JtYXQKKwkJaWYgKCgqcFJ4QmxrLT5wRGF0YSkgJiAweDgwKQorCQl7CisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpOworCQl9CisKKwkJLy8gc2tpcCBRT1MgY29udG9ybCBmaWVsZAorCQlwUnhCbGstPnBEYXRhICs9IDI7CisJCXBSeEJsay0+RGF0YVNpemUgLT0yOworCX0KKwlwUnhCbGstPlVzZXJQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8vIDMuIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKworCWlmIChwSGVhZGVyLT5GQy5PcmRlcikKKwl7CisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoKHBSeFdJLT5QSFlNT0RFIDw9IE1PREVfT0ZETSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkpCisJCXsKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0hUQyk7CisJCQkvLyBza2lwIEhUQyBjb250b3JsIGZpZWxkCisJCQlwUnhCbGstPnBEYXRhICs9IDQ7CisJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCX0KKwl9CisKKwkvLyA0LiBza2lwIEhXIHBhZGRpbmcKKwlpZiAocFJ4RC0+TDJQQUQpCisJeworCQkvLyBqdXN0IG1vdmUgcERhdGEgcG9pbnRlcgorCQkvLyBiZWNhdXNlIERhdGFTaXplIGV4Y2x1ZGluZyBIVyBwYWRkaW5nCisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9QQUQpOworCQlwUnhCbGstPnBEYXRhICs9IDI7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBSeEQtPkJBKQorCXsKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCS8vCisJLy8gQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lCisJLy8KKwlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpCisJeworCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudCk7CisKKwkJLy8gRHJvcCBNY2FzdC9CY2FzdCBmcmFtZSB3aXRoIGZyYWdtZW50IGJpdCBvbgorCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEZpbHRlciBvdXQgQmNhc3QgZnJhbWUgd2hpY2ggQVAgcmVsYXllZCBmb3IgdXMKKwkJaWYgKHBIZWFkZXItPkZDLkZyRHMgJiYgTUFDX0FERFJfRVFVQUwocEhlYWRlci0+QWRkcjMsIHBBZC0+Q3VycmVudEFkZHJlc3MpKQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAocFJ4RC0+VTJNKQorCXsKKwkJcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKyAgICAgICAgaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKSkKKwkJeworCQkJTUFDX1RBQkxFX0VOVFJZICpwRGxzRW50cnkgPSBOVUxMOworCisJCQlwRGxzRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXItPkFkZHIyLCBUUlVFKTsKKwkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGxzRW50cnkpCisJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcERsc0VudHJ5LT5Sc3NpU2FtcGxlLCBwUnhXSSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7CisJCQlpZiAocEVudHJ5KQorCQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKKwkJfQorCisKKwkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKKworCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9IChVQ0hBUikocFJ4V0ktPlNOUjApOworCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQrKzsKKworCisgICAgCWlmICghKChwSGVhZGVyLT5GcmFnID09IDApICYmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSAwKSkpCisgICAgCXsKKyAgICAJCS8vIHJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMKKyAgICAJCS8vIHJldHVybiBjb21wbGV0ZSBmcmFtZSAocFJ4UGFja2V0KSBvciBOVUxMCisgICAgCQliRnJhZ21lbnQgPSBUUlVFOworICAgIAkJcFJ4UGFja2V0ID0gUlRNUERlRnJhZ21lbnREYXRhRnJhbWUocEFkLCBwUnhCbGspOworICAgIAl9CisKKyAgICAJaWYgKHBSeFBhY2tldCkKKyAgICAJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFJ4V0ktPldpcmVsZXNzQ2xpSURdOworCisgICAgCQkvLyBwcm9jZXNzIGNvbXBsZXRlIGZyYW1lCisgICAgCQlpZiAoYkZyYWdtZW50ICYmIChwUnhELT5EZWNyeXB0ZWQpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKyAgICAJCXsKKwkJCQkvLyBNaW51cyBNSUMgbGVuZ3RoCisJCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA4OworCisgICAgCQkJLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCisgICAgCQkJaWYgKFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKHBBZCwgcEVudHJ5LCBwUnhCbGspID09IEZBTFNFKQorICAgIAkJCXsKKyAgICAJCQkJcmV0dXJuOworICAgIAkJCX0KKyAgICAJCX0KKworICAgIAkJU1RBUnhEYXRhRnJhbWVBbm5vdW5jZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCQlyZXR1cm47CisgICAgCX0KKyAgICAJZWxzZQorICAgIAl7CisgICAgCQkvLyBqdXN0IHJldHVybgorICAgIAkJLy8gYmVjYXVzZSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgpIHdpbGwgcmVsZWFzZSByeCBwYWNrZXQsCisgICAgCQkvLyBpZiBwYWNrZXQgaXMgZnJhZ21lbnRlZAorICAgIAkJcmV0dXJuOworICAgIAl9CisJfQorCisJQVNTRVJUKDApOworCS8vIHJlbGVhc2UgcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKK1ZPSUQgU1RBSGFuZGxlUnhNZ210RnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCWRvCisJeworCisJCS8vIFdlIHNob3VsZCBjb2xsZWN0IFJTU0kgbm90IG9ubHkgVTJNIGRhdGEgYnV0IGFsc28gbXkgYmVhY29uCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkpCisJCXsKKwkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBwUnhXSSk7CisKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7CisJCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOworCQl9CisKKwkJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJCXsKKwkJCURCR1BSSU5UX0VSUigoIlNUQUhhbmRsZVJ4TWdtdEZyYW1lOiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlZCBcbiIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LAorCQkJCQkJCQkJcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7CisJfSB3aGlsZSAoRkFMU0UpOworCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK1ZPSUQgU1RBSGFuZGxlUnhDb250cm9sRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCisJc3dpdGNoIChwSGVhZGVyLT5GQy5TdWJUeXBlKQorCXsKKwkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQl7CisJCQkJQ250bEVucXVldWVGb3JSZWN2KHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSwgKFBGUkFNRV9CQV9SRVEpcEhlYWRlcik7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKKwkJY2FzZSBTVUJUWVBFX0FDSzoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFJ4RG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJVGhpcyByb3V0aW5lIGhhcyB0byBtYWludGFpbiBSeCByaW5nIHJlYWQgcG9pbnRlci4KKwkJTmVlZCB0byBjb25zaWRlciBRT1MgREFUQSBmb3JtYXQgd2hlbiBjb252ZXJ0aW5nIHRvIDgwMi4zCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCWFyZ2MpCit7CisJTkRJU19TVEFUVVMJCQlTdGF0dXM7CisJVUlOVDMyCQkJUnhQcm9jZXNzZWQsIFJ4UGVuZGluZzsKKwlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwlSVDI4WFhfUlhEX1NUUlVDCSpwUnhEOworCVVDSEFSCQkJKnBEYXRhOworCVBSWFdJX1NUUlVDCQlwUnhXSTsKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0OworCVBIRUFERVJfODAyXzExCXBIZWFkZXI7CisJUlhfQkxLCQkJUnhDZWxsOworCisJUnhQcm9jZXNzZWQgPSBSeFBlbmRpbmcgPSAwOworCisJLy8gcHJvY2VzcyB3aG9sZSByeCByaW5nCisJd2hpbGUgKDEpCisJeworCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgfHwKKwkJCSFSVE1QX1RFU1RfRkxBRyhwQWQsZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKworCQlSeFByb2Nlc3NlZCArKzsgLy8gdGVzdAorCisJCS8vIDEuIGFsbG9jYXRlIGEgbmV3IGRhdGEgcGFja2V0IGludG8gcnggcmluZyB0byByZXBsYWNlIHJlY2VpdmVkIHBhY2tldAorCQkvLyAgICB0aGVuIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIHBhY2tldAorCQkvLyAyLiB0aGUgY2FsbGVlIG11c3QgdGFrZSBjaGFyZ2Ugb2YgcmVsZWFzZSBvZiBwYWNrZXQKKwkJLy8gMy4gQXMgZmFyIGFzIGRyaXZlciBpcyBjb25jZXJuZWQgLAorCQkvLyAgICB0aGUgcnggcGFja2V0IG11c3QKKwkJLy8gICAgICBhLiBiZSBpbmRpY2F0ZWQgdG8gdXBwZXIgbGF5ZXIgb3IKKwkJLy8gICAgICBiLiBiZSByZWxlYXNlZCBpZiBpdCBpcyBkaXNjYXJkZWQKKwkJcFJ4UGFja2V0ID0gR2V0UGFja2V0RnJvbVJ4UmluZyhwQWQsICYoUnhDZWxsLlJ4RCksICZiUmVzY2hlZHVsZSwgJlJ4UGVuZGluZyk7CisJCWlmIChwUnhQYWNrZXQgPT0gTlVMTCkKKwkJeworCQkJLy8gbm8gbW9yZSBwYWNrZXQgdG8gcHJvY2VzcworCQkJYnJlYWs7CisJCX0KKworCQkvLyBnZXQgcnggcmluZyBkZXNjcmlwdG9yCisJCXBSeEQgPSAmKFJ4Q2VsbC5SeEQpOworCQkvLyBnZXQgcnggZGF0YSBidWZmZXIKKwkJcERhdGEJPSBHRVRfT1NfUEtUX0RBVEFQVFIocFJ4UGFja2V0KTsKKwkJcFJ4V0kJPSAoUFJYV0lfU1RSVUMpIHBEYXRhOworCQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSAocERhdGErUlhXSV9TSVpFKSA7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJICAgIFJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlciwgRElSX1JFQUQsIFRSVUUpOworCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhXSSwgVFlQRV9SWFdJKTsKKyNlbmRpZgorCisJCS8vIGJ1aWxkIFJ4Q2VsbAorCQlSeENlbGwucFJ4V0kgPSBwUnhXSTsKKwkJUnhDZWxsLnBIZWFkZXIgPSBwSGVhZGVyOworCQlSeENlbGwucFJ4UGFja2V0ID0gcFJ4UGFja2V0OworCQlSeENlbGwucERhdGEgPSAoVUNIQVIgKikgcEhlYWRlcjsKKwkJUnhDZWxsLkRhdGFTaXplID0gcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJUnhDZWxsLkZsYWdzID0gMDsKKworCQkvLyBJbmNyZWFzZSBUb3RhbCByZWNlaXZlIGJ5dGUgY291bnRlciBhZnRlciByZWFsIGRhdGEgcmVjZWl2ZWQgbm8gbWF0ZXIgYW55IGVycm9yIG9yIG5vdAorCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50ICs9ICBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgKys7CisKKwkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQpOworCisJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IDwgMTQpCisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCisgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCisJCXsKKyAgICAgICAgICAgIHNlbmRfbW9uaXRvcl9wYWNrZXRzKHBBZCwgJlJ4Q2VsbCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBSVDI4NzAgaW52b2tlcyBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoKSBpbiBydHVzYl9idWxrLmMgKi8KKyNpZmRlZiBSQUxJTktfQVRFCisJCWlmIChBVEVfT04ocEFkKSkKKwkJeworCQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMrKzsKKwkJCUFURVNhbXBsZVJzc2kocEFkLCBwUnhXSSk7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJCWlmIChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpCisJCQl7CisJCQkJLyogKCpwUnhEKSBoYXMgYmVlbiBzd2FwcGVkIGluIEdldFBhY2tldEZyb21SeFJpbmcoKSAqLworCQkJCUFURV9RQV9TdGF0aXN0aWNzKHBBZCwgcFJ4V0ksIHBSeEQsCXBIZWFkZXIpOworCQkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vIENoZWNrIGZvciBhbGwgUnhEIGVycm9ycworCQlTdGF0dXMgPSBSVE1QQ2hlY2tSeEVycm9yKHBBZCwgcEhlYWRlciwgcFJ4V0ksIHBSeEQpOworCisJCS8vIEhhbmRsZSB0aGUgcmVjZWl2ZWQgZnJhbWUKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlzd2l0Y2ggKHBIZWFkZXItPkZDLlR5cGUpCisJCQl7CisJCQkJLy8gQ0FTRSBJLCByZWNlaXZlIGEgREFUQSBmcmFtZQorCQkJCWNhc2UgQlRZUEVfREFUQToKKwkJCQl7CisJCQkJCS8vIHByb2Nlc3MgREFUQSBmcmFtZQorCQkJCQlTVEFIYW5kbGVSeERhdGFGcmFtZShwQWQsICZSeENlbGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkvLyBDQVNFIElJLCByZWNlaXZlIGEgTUdNVCBmcmFtZQorCQkJCWNhc2UgQlRZUEVfTUdNVDoKKwkJCQl7CisJCQkJCVNUQUhhbmRsZVJ4TWdtdEZyYW1lKHBBZCwgJlJ4Q2VsbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCS8vIENBU0UgSUlJLiByZWNlaXZlIGEgQ05UTCBmcmFtZQorCQkJCWNhc2UgQlRZUEVfQ05UTDoKKwkJCQl7CisJCQkJCVNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKHBBZCwgJlJ4Q2VsbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCS8vIGRpc2NhcmQgb3RoZXIgdHlwZQorCQkJCWRlZmF1bHQ6CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzKys7CisJCQkvLyBkaXNjYXJkIHRoaXMgZnJhbWUKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJfQorCisJcmV0dXJuIGJSZXNjaGVkdWxlOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUFzaWNGb3JjZVdha2V1cChwQWQsIEZBTFNFKTsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBFYXJseSBjaGVja2luZyBhbmQgT1MtZGVwZW5lZCBwYXJzaW5nIGZvciBUeCBwYWNrZXQgc2VuZCB0byBvdXIgU1RBIGRyaXZlci4KKworQXJndW1lbnRzOgorICAgIE5ESVNfSEFORExFIAlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CVBvaW50ZXIgcmVmZXIgdG8gdGhlIGRldmljZSBoYW5kbGUsIGkuZS4sIHRoZSBwQWQuCisJUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5CQkJVGhlIHBhY2tldCBhcnJheSBuZWVkIHRvIGRvIHRyYW5zbWlzc2lvbi4KKwlVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzCQkJTnVtYmVyIG9mIHBhY2tldCBpbiBwYWNrZXQgYXJyYXkuCisKK1JldHVybiBWYWx1ZToKKwlOT05FCisKK05vdGU6CisJVGhpcyBmdW5jdGlvbiBkbyBlYXJseSBjaGVja2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIHNlbmQtb3V0IHBhY2tldC4KKwlZb3Ugb25seSBjYW4gcHV0IE9TLWRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFNUQVNlbmRQYWNrZXRzKAorCUlOCU5ESVNfSEFORExFCQlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorCUlOCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheSwKKwlJTglVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzKQoreworCVVJTlQJCQlJbmRleDsKKwlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0OworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCUJPT0xFQU4JCQlhbGxvd1RvU2VuZCA9IEZBTFNFOworCisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOdW1iZXJPZlBhY2tldHM7IEluZGV4KyspCisJeworCQlwUGFja2V0ID0gcHBQYWNrZXRBcnJheVtJbmRleF07CisKKwkJZG8KKwkJeworCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKKwkJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJCXsKKwkJCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSBoYXJkd2FyZSBpcyBpbiByZXNldCBzdGF0ZQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCFJTkZSQV9PTihwQWQpICYmICFBREhPQ19PTihwQWQpKQorCQkJeworCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIHRoZXJlIGFyZSBubyBwaHlzaWNhbCBjb25uZWN0aW9uIHlldAorCQkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBSZWNvcmQgdGhhdCBvcmlnbmFsIHBhY2tldCBzb3VyY2UgaXMgZnJvbSBORElTIGxheWVyLHNvIHRoYXQKKwkJCQkvLyBsYXRlciBvbiBkcml2ZXIga25vd3MgaG93IHRvIHJlbGVhc2UgdGhpcyBORElTIFBBQ0tFVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCVBVQ0hBUiBwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBTcmNCdWZWQSk7CisJCQkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpKQorCQkJCXsKKwkJCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgcEVudHJ5LT5BaWQpOworCQkJCX0KKwkJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgMCk7IC8vIHRoaXMgZmllbGQgaXMgdXNlbGVzcyB3aGVuIGluIFNUQSBtb2RlCisJCQkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CisJCQkJTkRJU19TRVRfUEFDS0VUX1NUQVRVUyhwUGFja2V0LCBORElTX1NUQVRVU19QRU5ESU5HKTsKKwkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQrKzsKKworCQkJCWFsbG93VG9TZW5kID0gVFJVRTsKKwkJCX0KKwkJfSB3aGlsZShGQUxTRSk7CisKKwkJaWYgKGFsbG93VG9TZW5kID09IFRSVUUpCisJCQlTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCWVsc2UKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwkvLyBEZXF1ZXVlIG91dGdvaW5nIGZyYW1lcyBmcm9tIFR4U3dRdWV1ZVtdIGFuZCBwcm9jZXNzIGl0CisJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisJVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZG8gcGFja2V0IHBhcnNpbmcgYW5kIGNsYXNzaWZpY2F0aW9uIGZvciBUeCBwYWNrZXQKKwl0byBTVEEgZGV2aWNlLCBhbmQgaXQgd2lsbCBlbi1xdWV1ZSBwYWNrZXRzIHRvIG91ciBUeFN3UXVldWUgZGVwZW5kcyBvbiBBQworCWNsYXNzLgorCitBcmd1bWVudHM6CisJcEFkICAgIAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCXBQYWNrZXQgCVBvaW50ZXIgdG8gc2VuZCBwYWNrZXQKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCQlJZiBzdWNjZXMgdG8gcXVldWUgdGhlIHBhY2tldCBpbnRvIFR4U3dRdWV1ZS4KKwlORElTX1NUQVRVU19GQUlMVVJFCQkJSWYgZmFpbGVkIHRvIGRvIGVuLXF1ZXVlLgorCitOb3RlOgorCVlvdSBvbmx5IGNhbiBwdXQgT1MtaW5kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKKwlQVUNIQVIJCQlwU3JjQnVmVkE7CisJVUlOVAkJCVNyY0J1ZkxlbjsKKwlVSU5UCQkJQWxsb3dGcmFnU2l6ZTsKKwlVQ0hBUgkJCU51bWJlck9mRnJhZzsKKy8vCVVDSEFSCQkJUlRTUmVxdWlyZWQ7CisJVUNIQVIJCQlRdWVJZHgsIFVzZXJQcmlvcml0eTsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7CisJdW5zaWduZWQgaW50IAlJcnFGbGFnczsKKwlVQ0hBUgkJCUZsZ0lzSVAgPSAwOworCVVDSEFSCQkJUmF0ZTsKKworCS8vIFByZXBhcmUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgYnVmZmVyIGRlc2NyaXB0b3IKKwkvLyBjaGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBORElTIHBhY2tldC4KKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwlpZiAocFNyY0J1ZlZBID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IHBTcmNCdWZWQSA9PSBOVUxMICEhIVNyY0J1Zkxlbj0leFxuIixTcmNCdWZMZW4pKTsKKwkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCisJCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKwlpZiAoU3JjQnVmTGVuIDwgMTQpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IE5kaXMgUGFja2V0IGJ1ZmZlciBlcnJvciAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuCisJLy8gTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LgorCXsKKwkJaWYoSU5GUkFfT04ocEFkKSkKKwkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJVVNIT1JUCXRtcFdjaWQ7CisKKwkJCXRtcFdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwkJCWlmIChWQUxJRF9XQ0lEKHRtcFdjaWQpICYmCisJCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uVmFsaWRBc0Rscz09IFRSVUUpKQorCQkJeworCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdOworCQkJCVJhdGUgPSBwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdLkN1cnJUeFJhdGU7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIEJTU0lEX1dDSUQpOworCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJfQorCQl9CisJCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkKKwkJCXsKKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBNQ0FTVF9XQ0lEKTsKKwkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBTcmNCdWZWQSk7CisJCQl9CisJCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQl9CisJfQorCisJaWYgKCFwRW50cnkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQtPkNhbm5vdCBmaW5kIHBFbnRyeSglMng6JTJ4OiUyeDolMng6JTJ4OiUyeCkgaW4gTWFjVGFiIVxuIiwgUFJJTlRfTUFDKHBTcmNCdWZWQSkpKTsKKwkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCisJCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJaWYgKEFESE9DX09OKHBBZCkKKwkJKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKKwl9CisKKwkvLworCS8vIENoZWNrIHRoZSBFdGhlcm5ldCBGcmFtZSB0eXBlIG9mIHRoaXMgcGFja2V0LCBhbmQgc2V0IHRoZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMgZmxhZ3MuCisJLy8JCUhlcmUgd2Ugc2V0IHRoZSBQQUNLRVRfU1BFQ0lGSUMgZmxhZ3MoTExDLCBWTEFOLCBESENQL0FSUCwgRUFQT0wpLgorCVJUTVBDaGVja0V0aGVyVHlwZShwQWQsIHBQYWNrZXQpOworCisKKworCS8vCisJLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbCAtIGRyb3AgYWxsIG5vbi04MDIuMXggZnJhbWUgYmVmb3JlIHBvcnQgc2VjdXJlZAorCS8vCisJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCSAgfHwgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCSAgKQorCQkgICYmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSB8fCAocEFkLT5TdGFDZmcuTWljRXJyQ250ID49IDIpKQorCQkgICYmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCk9PSBGQUxTRSkKKwkJICApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVNlbmRQYWNrZXQgLS0+IERyb3AgcGFja2V0IGJlZm9yZSBwb3J0IHNlY3VyZWQgISEhXG4iKSk7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCisJLy8gU1RFUCAxLiBEZWNpZGUgbnVtYmVyIG9mIGZyYWdtZW50cyByZXF1aXJlZCB0byBkZWxpdmVyIHRoaXMgTVNEVS4KKwkvLwkgICBUaGUgZXN0aW1hdGlvbiBoZXJlIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGJlY2F1c2UgZGlmZmljdWx0IHRvCisJLy8JICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0CisJLy8JICAgIk51bWJlck9mRnJhZyIgaXMgdGhlbiBqdXN0IHVzZWQgdG8gcHJlLWNoZWNrIGlmIGVub3VnaCBmcmVlCisJLy8JICAgVFhEIGFyZSBhdmFpbGFibGUgdG8gaG9sZCB0aGlzIE1TRFUuCisKKworCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkJLy8gZnJhZ21lbnRhdGlvbiBub3QgYWxsb3dlZCBvbiBtdWx0aWNhc3QgJiBicm9hZGNhc3QKKwkJTnVtYmVyT2ZGcmFnID0gMTsKKwllbHNlIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorCWVsc2UgaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRNSVgpIHx8IChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8vIE1JTU8gUkFURSBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJeworCQkvLyBUaGUgY2FsY3VsYXRlZCAiTnVtYmVyT2ZGcmFnIiBpcyBhIHJvdWdoIGVzdGltYXRpb24gYmVjYXVzZSBvZiB2YXJpb3VzCisJCS8vIGVuY3J5cHRpb24vZW5jYXBzdWxhdGlvbiBvdmVyaGVhZCBub3QgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGlzIG51bWJlciBpcyBqdXN0CisJCS8vIHVzZWQgdG8gbWFrZSBzdXJlIGVub3VnaCBmcmVlIFRYRCBhcmUgYXZhaWxhYmxlIGJlZm9yZSBmcmFnbWVudGF0aW9uIHRha2VzIHBsYWNlLgorCQkvLyBJbiBjYXNlIHRoZSBhY3R1YWwgcmVxdWlyZWQgbnVtYmVyIG9mIGZyYWdtZW50cyBvZiBhbiBORElTIHBhY2tldAorCQkvLyBleGNjZWVkcyAiTnVtYmVyT2ZGcmFnImNhY3VsYXRlZCBoZXJlIGFuZCBub3QgZW5vdWdoIGZyZWUgVFhEIGF2YWlsYWJsZSwgdGhlCisJCS8vIGxhc3QgZnJhZ21lbnQgKGkuZS4gbGFzdCBNUERVKSB3aWxsIGJlIGRyb3BwZWQgaW4gUlRNUEhhcmRUcmFuc21pdCgpIGR1ZSB0byBvdXQgb2YKKwkJLy8gcmVzb3VyY2UsIGFuZCB0aGUgTkRJUyBwYWNrZXQgd2lsbCBiZSBpbmRpY2F0ZWQgTkRJU19TVEFUVVNfRkFJTFVSRS4gVGhpcyBzaG91bGQKKwkJLy8gcmFyZWx5IGhhcHBlbiBhbmQgdGhlIHBlbmFsdHkgaXMganVzdCBsaWtlIGEgVFggUkVUUlkgZmFpbC4gQWZmb3JkYWJsZS4KKworCQlBbGxvd0ZyYWdTaXplID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfQ1JDOworCQlOdW1iZXJPZkZyYWcgPSAoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgLyBBbGxvd0ZyYWdTaXplKSArIDE7CisJCS8vIFRvIGdldCBhY2N1cmF0ZSBudW1iZXIgb2YgZnJhZ21lbnRhdGlvbiwgTWludXMgMSBpZiB0aGUgc2l6ZSBqdXN0IG1hdGNoIHRvIGFsbG93YWJsZSBmcmFnbWVudCBzaXplCisJCWlmICgoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgJSBBbGxvd0ZyYWdTaXplKSA9PSAwKQorCQl7CisJCQlOdW1iZXJPZkZyYWctLTsKKwkJfQorCX0KKworCS8vIFNhdmUgZnJhZ21lbnQgbnVtYmVyIHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkCisJUlRNUF9TRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0LCBOdW1iZXJPZkZyYWcpOworCisKKwkvLyBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6CisJLy8JICAgSWYgbXVsdGlwbGUgZnJhZ21lbnQgcmVxdWlyZWQsIFJUUyBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgZmlyc3QgZnJhZ21lbnQKKwkvLwkgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQKKwkvLyAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTCisJUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCAwKTsKKwlSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSk7CisKKwkvLworCS8vIFNURVAgMy4gVHJhZmZpYyBjbGFzc2lmaWNhdGlvbi4gb3V0Y29tZSA9IDxVc2VyUHJpb3JpdHksIFF1ZUlkeD4KKwkvLworCVVzZXJQcmlvcml0eSA9IDA7CisJUXVlSWR4CQkgPSBRSURfQUNfQkU7CisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYKKwkJQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpCisJeworCQlVU0hPUlQgUHJvdG9jb2w7CisJCVVDSEFSICBMbGNTbmFwTGVuID0gMCwgQnl0ZTAsIEJ5dGUxOworCQlkbworCQl7CisJCQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKKwkJCVByb3RvY29sID0gKFVTSE9SVCkoKHBTcmNCdWZWQVsxMl0gPDwgOCkgKyBwU3JjQnVmVkFbMTNdKTsKKwkJCWlmIChQcm90b2NvbCA8PSAxNTAwKQorCQkJeworCQkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCBmcm9tIExMQy9TTkFQCisJCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIDYsICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlicmVhazsKKworCQkJCVByb3RvY29sID0gKFVTSE9SVCkoKEJ5dGUwIDw8IDgpICsgQnl0ZTEpOworCQkJCUxsY1NuYXBMZW4gPSA4OworCQkJfQorCisJCQkvLyBhbHdheXMgQUNfQkUgZm9yIG5vbi1JUCBwYWNrZXQKKwkJCWlmIChQcm90b2NvbCAhPSAweDA4MDApCisJCQkJYnJlYWs7CisKKwkJCS8vIGdldCBJUCBoZWFkZXIKKwkJCWlmIChTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyBMbGNTbmFwTGVuLCAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQlicmVhazsKKworCQkJLy8gcmV0dXJuIEFDX0JFIGlmIHBhY2tldCBpcyBub3QgSVB2NAorCQkJaWYgKChCeXRlMCAmIDB4ZjApICE9IDB4NDApCisJCQkJYnJlYWs7CisKKwkJCUZsZ0lzSVAgPSAxOworCQkJVXNlclByaW9yaXR5ID0gKEJ5dGUxICYgMHhlMCkgPj4gNTsKKwkJCVF1ZUlkeCA9IE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbVXNlclByaW9yaXR5XTsKKworCQkJLy8gVE9ETzogaGF2ZSB0byBjaGVjayBBQ00gYml0LiBhcHBseSBUU1BFQyBpZiBBQ00gaXMgT04KKwkJCS8vIFRPRE86IGRvd25ncmFkZSBVUCAmIFF1ZUlkeCBiZWZvcmUgcGFzc2luZyBBQ00KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBQ01bUXVlSWR4XSkKKwkJCXsKKwkJCQlVc2VyUHJpb3JpdHkgPSAwOworCQkJCVF1ZUlkeAkJID0gUUlEX0FDX0JFOworCQkJfQorCQl9IHdoaWxlIChGQUxTRSk7CisJfQorCisJUlRNUF9TRVRfUEFDS0VUX1VQKHBQYWNrZXQsIFVzZXJQcmlvcml0eSk7CisKKworCisJLy8gTWFrZSBzdXJlIFNlbmRUeFdhaXQgcXVldWUgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCisJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCWlmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA+PSBNQVhfUEFDS0VUU19JTl9RVUVVRSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2lmZGVmIEJMT0NLX05FVF9JRgorCQlTdG9wTmV0SWZRdWV1ZShwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJZWxzZQorCXsKKwkJSW5zZXJ0VGFpbFF1ZXVlKCZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCX0KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBUUlVFKSYmCisgICAgICAgIElTX0hUX1NUQShwRW50cnkpKQorCXsKKwkgICAgLy9QTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQlpZiAoKChwRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8VXNlclByaW9yaXR5KSkgPT0gMCkgJiYKKyAgICAgICAgICAgICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VXNlclByaW9yaXR5KSkgPT0gMCkgJiYKKyAgICAgICAgICAgIChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorCQkJIC8vIEZvciBJT1QgY29tcGF0aWJpbGl0eSwgaWYKKwkJCSAvLyAxLiBJdCBpcyBSYWxpbmsgY2hpcCBvcgorCQkJIC8vIDIuIEl0IGlzIE9QRU4gb3IgQUVTIG1vZGUsCisJCQkgLy8gdGhlbiBCQSBzZXNzaW9uIGNhbiBiZSBidWxpdC4KKwkJCSAmJiAoKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiBwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApIHx8CisJCQkgCSAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkIHx8IHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQkJKQorCQl7CisJCQlCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgMCwgMCwgMTAsIEZBTFNFKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1F1ZUlkeF0rKzsgLy8gVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVGhpcyBzdWJyb3V0aW5lIHdpbGwgc2NhbiB0aHJvdWdoIHJlbGVhdGl2ZSByaW5nIGRlc2NyaXB0b3IgdG8gZmluZAorCQlvdXQgYXZhbGlhYmxlIGZyZWUgcmluZyBkZXNjcmlwdG9yIGFuZCBjb21wYXJlIHdpdGggcmVxdWVzdCBzaXplLgorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlRdWVJZHgJCVNlbGVjdGVkIFRYIFJpbmcKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAJTm90IGVub3VnaCBmcmVlIGRlc2NyaXB0b3IKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAJRW5vdWdoIGZyZWUgZGVzY3JpcHRvcgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpZmRlZiBSVDI4NzAKKy8qCisJQWN0dWFsbHksIHRoaXMgZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0aGUgVHhIYXJkd2FyZSBRdWV1ZSBzdGlsbCBoYXMgZnJhbWUgbmVlZCB0byBzZW5kLgorCUlmIG5vIGZyYW1lIG5lZWQgdG8gc2VuZCwgZ28gdG8gc2xlZXAsIGVsc2UsIHN0aWxsIHdha2UgdXAuCisqLworTkRJU19TVEFUVVMgUlRNUEZyZWVUWERSZXF1ZXN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJCQlRdWVJZHgsCisJSU4JCVVDSEFSCQkJTnVtYmVyUmVxdWlyZWQsCisJSU4JCVBVQ0hBUgkJCUZyZWVOdW1iZXJJcykKK3sKKwkvL1VMT05HCQlGcmVlTnVtYmVyID0gMDsKKwlORElTX1NUQVRVUyAJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCisJc3dpdGNoIChRdWVJZHgpCisJeworCQljYXNlIFFJRF9BQ19CSzoKKwkJY2FzZSBRSURfQUNfQkU6CisJCWNhc2UgUUlEX0FDX1ZJOgorCQljYXNlIFFJRF9BQ19WTzoKKwkJY2FzZSBRSURfSENDQToKKwkJCXsKKwkJCQlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKwkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisJCQkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikgfHwKKwkJCQkJKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJfQorCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfTUdNVDoKKwkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICE9IE1HTVRfUklOR19TSVpFKQorCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQllbHNlCisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJUTVBGcmVlVFhEUmVxdWVzdDo6SW52YWxpZCBRdWVJZHgoPSVkKVxuIiwgUXVlSWR4KSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKFN0YXR1cyk7CisKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCitWT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKK30KKworVk9JRAlSVE1QU2VuZE51bGxGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglCT09MRUFOIAkJYlFvc051bGwpCit7CisJVUNIQVIJTnVsbEZyYW1lWzQ4XTsKKwlVTE9ORwlMZW5ndGg7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7CisKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZihBVEVfT04ocEFkKSkKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisgICAgLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbAorICAgIGlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorI2VuZGlmCisgICAgICAgICkgJiYKKyAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlOZGlzWmVyb01lbW9yeShOdWxsRnJhbWUsIDQ4KTsKKwlMZW5ndGggPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgTnVsbEZyYW1lOworCisJcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7CisJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOworCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKKwl7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJfQorCWVsc2UKKwl7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgPyAxOiAwOworCX0KKwlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBUeFJhdGUsIDE0KTsKKworCXBBZC0+U2VxdWVuY2UrKzsKKwlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOworCisJLy8gUHJlcGFyZSBRb3NOdWxsIGZ1bmN0aW9uIGZyYW1lCisJaWYgKGJRb3NOdWxsKQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX1FPU19OVUxMOworCisJCS8vIGNvcHkgUU9TIGNvbnRyb2wgYnl0ZXMKKwkJTnVsbEZyYW1lW0xlbmd0aF0JPSAgMDsKKwkJTnVsbEZyYW1lW0xlbmd0aCsxXSA9ICAwOworCQlMZW5ndGggKz0gMjsvLyBpZiBwYWQgd2l0aCAyIGJ5dGVzIGZvciBhbGlnbm1lbnQsIEFQU0Qgd2lsbCBmYWlsCisJfQorCisJSEFMX0tpY2tPdXROdWxsRnJhbWVUeChwQWQsIDAsIE51bGxGcmFtZSwgTGVuZ3RoKTsKKworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQJUlRNUFNlbmRSVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVJUU1JhdGUsCisJSU4JVVNIT1JUCQkJQWNrRHVyYXRpb24sCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JVUNIQVIJCQlGcmFtZUdhcCkKK3sKK30KKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0KKy8vCQlGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5CisvLwkJTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdAorLy8gSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uCisvLwkJICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkKKy8vCQkgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uCitWT0lEIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlDaXBoZXI7CQkJCS8vIFRvIGluZGljYXRlIGNpcGhlciB1c2VkIGZvciB0aGlzIHBhY2tldAorCVVDSEFSCQkJCQkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOwkJLy8gY2lwaGVyIGFsb2dyaXRobQorCVVDSEFSCQkJCQkJCUtleUlkeCA9IDB4ZmY7CisJUFVDSEFSCQkJCQkJCXBTcmNCdWZWQTsKKwlQQ0lQSEVSX0tFWQkJCQkJCXBLZXkgPSBOVUxMOworCisJcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBUeEJsay0+cFBhY2tldCk7CisKKwl7CisJICAgIC8vIFNlbGVjdCBDaXBoZXIKKwkgICAgaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQorCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7IC8vIENpcGhlciBmb3IgTXVsdGljYXN0IG9yIEJyb2FkY2FzdAorCSAgICBlbHNlCisJICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIFVuaWNhc3QKKworCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCisJCXsKKwkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0gQ0lQSEVSX0NLSVAxMjgpOworCisJCQkvLyA0LXdheSBoYW5kc2hha2luZyBmcmFtZSBtdXN0IGJlIGNsZWFyCisJCQlpZiAoIShUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKSkgJiYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZykgJiYKKwkJCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKSkKKwkJCXsKKwkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQkJS2V5SWR4ID0gMDsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKwkJeworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgxMCkgLy8gQ2lzY28gQ0tJUCBLUCBpcyBvbgorCQkJeworCQkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCQl7CisJCQkJCWlmICgoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpKQorCQkJCQkJS2V5SWR4ID0gMTsKKwkJCQkJZWxzZQorCQkJCQkJS2V5SWR4ID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Da2lwRmxhZyAmIDB4MDgpIC8vIG9ubHkgQ0tJUCBDTUlDCisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJZWxzZSBpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQorCQkJCQlLZXlJZHggPSAxOworCQkJCWVsc2UKKwkJCQkJS2V5SWR4ID0gMDsKKwkJCX0KKwkJCWVsc2UJLy8gc3RhbmRhcmQgV0VQNjQgb3IgV0VQMTI4CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQl9CisJCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKSAvLyBtdWx0aWNhc3QKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pCisJCQkJS2V5SWR4ID0gMDsKKwkJCWVsc2UKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCX0KKworCQlpZiAoS2V5SWR4ID09IDB4ZmYpCisJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSB8fCAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPT0gMCkpCisJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgIGVsc2UgaWYgKCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKKwkgICAgICAgICAgICAgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSAmJgorCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpICYmCisJICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCSAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQllbHNlCisJCXsKKwkJCS8vSGVhZGVyXzgwMl8xMS5GQy5XZXAgPSAxOworCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCQlwS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF07CisJCX0KKwl9CisKKwlwVHhCbGstPkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwlwVHhCbGstPnBLZXkgPSBwS2V5OworfQorCisKK1ZPSUQgU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFRYX0JMSyAgICAgICAgICAqcFR4QmxrKQoreworCisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJQk9PTEVBTgliRExTRnJhbWUgPSBGQUxTRTsKKwlJTlQJRGxzRW50cnlJbmRleCA9IDA7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkvLworCS8vIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUgorCS8vCisKKwkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cworCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKworCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJfODAyXzExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhlYWRlcl84MDJfMTEtPkZDLkZyRHMgPSAwOworCXBIZWFkZXJfODAyXzExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9ICgoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkgPyBTVUJUWVBFX1FEQVRBIDogU1VCVFlQRV9EQVRBKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQorCQkvLyBJZiBwYWNrZXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMsIHRoZW4gZm9yY2UgYWdncmVnYXRpb24gZGlzYWJsZS4gKEhhcmQgdG8gZGV0ZXJtaW5lIHBlZXIgU1RBJ3MgY2FwYWJpbGl0eSkKKwkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKKwkJCWJETFNGcmFtZSA9IFRSVUU7CisJCWVsc2UKKwkJCWJETFNGcmFtZSA9IEZBTFNFOworCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworICAgIGlmIChwVHhCbGstPnBNYWNFbnRyeSkKKwl7CisJCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUykpCisJCXsKKwkJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxOworCQkJcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXEgPSAocFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXErMSkgJiBNQVhTRVE7CisJCX0KKwkJZWxzZQorCQl7CisgICAgCSAgICBwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworICAgIAkgICAgcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSA9IChwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROworICAgIAl9CisJfQorCWVsc2UKKwl7CisJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7CisJCXBBZC0+U2VxdWVuY2UgPSAocEFkLT5TZXF1ZW5jZSsxKSAmIE1BWFNFUTsgLy8gbmV4dCBzZXF1ZW5jZQorCX0KKworCXBIZWFkZXJfODAyXzExLT5GcmFnID0gMDsKKworCXBIZWFkZXJfODAyXzExLT5GQy5Nb3JlRGF0YSA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKworCXsKKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChiRExTRnJhbWUpCisJCQl7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAwOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJeworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOworCQl9CisJCX0KKwkJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAwOworCQl9CisJfQorCisJaWYgKHBUeEJsay0+Q2lwaGVyQWxnICE9IENJUEhFUl9OT05FKQorCQlwSGVhZGVyXzgwMl8xMS0+RkMuV2VwID0gMTsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAyLiBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIgU0hBUkVEIEJZIEVOVElSRSBGUkFHTUVOVCBCVVJTVC4gRmlsbCBzZXF1ZW5jZSBsYXRlci4KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQorICAgIAlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCWVsc2UKKyAgICAJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKAorCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKKwlJTiBUWF9CTEsJCQkqcFR4QmxrLAorCUlOIFVDSEFSCQkJKnBIZWFkZXIpCit7CisJTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOworCisJcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBIZWFkZXI7CisJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKwkvLworCS8vIFVwZGF0ZSB0aGUgY2FjaGVkIDgwMi4xMSBIRUFERVIKKwkvLworCisJLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwkvLyBNb3JlIEJpdAorCXBIZWFkZXI4MDIxMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisKKwkvLyBTZXF1ZW5jZQorCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSBwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XTsKKyAgICBwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSA9IChwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKKworCXsKKwkJLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQorCQkvLyBJZiBwYWNrZXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMsIHRoZW4gZm9yY2UgYWdncmVnYXRpb24gZGlzYWJsZS4gKEhhcmQgdG8gZGV0ZXJtaW5lIHBlZXIgU1RBJ3MgY2FwYWJpbGl0eSkKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJQk9PTEVBTgliRExTRnJhbWUgPSBGQUxTRTsKKwkJSU5UCURsc0VudHJ5SW5kZXggPSAwOworCisJCURsc0VudHJ5SW5kZXggPSBSVE1QQ2hlY2tETFNGcmFtZShwQWQsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCWlmIChEbHNFbnRyeUluZGV4ID49IDApCisJCQliRExTRnJhbWUgPSBUUlVFOworCQllbHNlCisJCQliRExTRnJhbWUgPSBGQUxTRTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLyBUaGUgYWRkcjMgb2Ygbm9ybWFsIHBhY2tldCBzZW5kIGZyb20gRFMgaXMgRGVzdCBNYWMgYWRkcmVzcy4KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJaWYgKGJETFNGcmFtZSkKKwkJeworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlwSGVhZGVyODAyMTEtPkZDLlRvRHMgPSAwOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAyLiBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIgU0hBUkVEIEJZIEVOVElSRSBGUkFHTUVOVCBCVVJTVC4gRmlsbCBzZXF1ZW5jZSBsYXRlci4KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQorICAgIAlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwllbHNlCisgICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitzdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUE5ESVNfUEFDS0VUCXBOZXh0UGFja2V0OworCVVJTlQzMgkJCW5leHRCdWZMZW47CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCS8vIHN0ZWFsICJvcmRlciIgYml0IHRvIG1hcmsgImFnZ3JlZ2F0aW9uIgorCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7CisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQorCXsKKwkJLy8KKwkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkJLy8KKwkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisJfQorCisJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdtZW50LgorCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCS8vIEZvciBSQSBBZ2dyZWdhdGlvbiwKKwkvLyBwdXQgdGhlIDJuZCBNU0RVIGxlbmd0aChleHRyYSAyLWJ5dGUgZmllbGQpIGFmdGVyIFFPU19DT05UUk9MIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0CisJcFFFbnRyeSA9IHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQ7CisJcE5leHRQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocFFFbnRyeSk7CisJbmV4dEJ1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBOZXh0UGFja2V0KTsKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocE5leHRQYWNrZXQpKQorCQluZXh0QnVmTGVuIC09IExFTkdUSF84MDJfMVE7CisKKwkqcEhlYWRlckJ1ZlB0ciA9IChVQ0hBUiluZXh0QnVmTGVuICYgMHhmZjsKKwkqKHBIZWFkZXJCdWZQdHIrMSkgPSAoVUNIQVIpKG5leHRCdWZMZW4gPj4gOCk7CisKKwlwSGVhZGVyQnVmUHRyICs9IDI7CisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisKKwlyZXR1cm4gcEhlYWRlckJ1ZlB0cjsKKworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSwkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOy8vLCBwU2F2ZUJ1ZlB0cjsKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKworCisJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwkvLworCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJLy8KKwkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJLy8KKwkvLyBBLU1TRFUgcGFja2V0CisJLy8KKwkqcEhlYWRlckJ1ZlB0ciB8PSAweDgwOworCisJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwlwSGVhZGVyQnVmUHRyICs9MjsKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKworCS8vcFNhdmVCdWZQdHIgPSBwSGVhZGVyQnVmUHRyOworCisJLy8KKwkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKKwkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwkvLworCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAorCS8vCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCXJldHVybiBwSGVhZGVyQnVmUHRyOworCit9CisKKworVk9JRCBTVEFfQU1QRFVfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJQVNTRVJUKHBUeEJsayk7CisKKwl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQorCXsKKwkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCWlmICggUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKQorCQl7CisJCQkvLyBOT1RFOiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaXplIG9mIHBNYWNFbnRyeS0+Q2FjaGVkQnVmW10gaXMgc21hbGxlciB0aGFuIHBUeEJsay0+SGVhZGVyQnVmW10hISEhCisJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0sIChQVUNIQVIpJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdLCBUWFdJX1NJWkUgKyBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV0pOworCQkJU1RBQnVpbGRDYWNoZTgwMl8xMUhlYWRlcihwQWQsIHBUeEJsaywgcEhlYWRlckJ1ZlB0cik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwkJCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJCX0KKworCisJCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwkJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwkJLy8KKwkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkJLy8KKwkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKwkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCisJCS8vCisJCS8vIGJ1aWxkIEhUQysKKwkJLy8gSFRDIGNvbnRyb2wgZmlsZWQgZm9sbG93aW5nIFFvUyBmaWVsZAorCQkvLworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPT0gVFJVRSkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocFR4QmxrLT5wTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkKKwkJeworCQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQgPT0gRkFMU0UpCisJCQl7CisJCQkJLy8gbWFyayBIVEMgYml0CisJCQkJcEhlYWRlcl84MDJfMTEtPkZDLk9yZGVyID0gMTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJCdWZQdHIsIDQpOworCQkJCSoocEhlYWRlckJ1ZlB0ciszKSB8PSAweDgwOworCQkJfQorCQkJcEhlYWRlckJ1ZlB0ciArPSA0OworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDQ7CisJCX0KKworCQkvL3BUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhlYWRlckJ1ZiAtIFRYV0lfU0laRSAtIFRYSU5GT19TSVpFOworCQlBU1NFUlQocFR4QmxrLT5NcGR1SGVhZGVyTGVuID49IDI0KTsKKworCQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisJCS8vIHNraXAgdmxhbiB0YWcKKwkJaWYgKGJWTEFOUGt0KQorCQl7CisJCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQl9CisKKwkJLy8KKwkJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCisJCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCQkvLworCQkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKKwkJLy8KKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwkJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJCXsKKworCQkJLy8KKwkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJCS8vCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJCX0KKworCQl9CisKKwkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCisJCXsKKyAgICAgICAgICAgIFJUTVBXcml0ZVR4V0lfQ2FjaGUocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgc2l6ZW9mKHBNYWNFbnRyeS0+Q2FjaGVkQnVmKSk7CisJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgKHBIZWFkZXJCdWZQdHIgLSAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSkpOworCQkJcE1hY0VudHJ5LT5pc0NhY2hlZCA9IFRSVUU7CisJCX0KKworCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1QRFUgY291bnQgYW5kIEJ5dGVDb3VudAorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQudS5Mb3dQYXJ0ICsrOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudC5RdWFkUGFydCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJfQorCisJCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworCQlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7CisKKwkJLy8KKwkJLy8gS2ljayBvdXQgVHgKKwkJLy8KKwkJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCX0KKworfQorCisKK1ZPSUQgU1RBX0FNU0RVX0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCVVTSE9SVAkJCXN1YkZyYW1lUGF5bG9hZExlbiA9IDA7CS8vIEFNU0RVIFN1YmZyYW1lIGxlbmd0aCB3aXRob3V0IEFNU0RVLUhlYWRlciAvIFBhZGRpbmcuCisJVVNIT1JUCQkJdG90YWxNUERVU2l6ZT0wOworCVVDSEFSCQkJKnN1YkZyYW1lSGVhZGVyOworCVVDSEFSCQkJcGFkZGluZyA9IDA7CisJVVNIT1JUCQkJRmlyc3RUeCA9IDAsIExhc3RUeElkeCA9IDA7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCWludCAJCQlmcmFtZU51bSA9IDA7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKworCUFTU0VSVChwVHhCbGspOworCisJQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPiAxKSk7CisKKwl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQorCXsKKwkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJY29udGludWU7CisJCX0KKworCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisJCS8vIHNraXAgdmxhbiB0YWcKKwkJaWYgKGJWTEFOUGt0KQorCQl7CisJCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQl9CisKKwkJaWYgKGZyYW1lTnVtID09IDApCisJCXsKKwkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCQkJLy8gTk9URTogVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOworCQkJcGFkZGluZyA9IFJPVU5EX1VQKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBzdWJGcmFtZVBheWxvYWRMZW4sIDQpIC0gKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBzdWJGcmFtZVBheWxvYWRMZW4pOworCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgcGFkZGluZyArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQpOworCQkJcEhlYWRlckJ1ZlB0ciArPSBwYWRkaW5nOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcGFkZGluZzsKKwkJfQorCisJCS8vCisJCS8vIEEtTVNEVSBzdWJmcmFtZQorCQkvLyAgIERBKDYpK1NBKDYpK0xlbmd0aCgyKSArIExMQy9TTkFQIEVuY2FwCisJCS8vCisJCXN1YkZyYW1lSGVhZGVyID0gcEhlYWRlckJ1ZlB0cjsKKwkJc3ViRnJhbWVQYXlsb2FkTGVuID0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJTmRpc01vdmVNZW1vcnkoc3ViRnJhbWVIZWFkZXIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgMTIpOworCisKKwkJcEhlYWRlckJ1ZlB0ciArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKworCisJCS8vCisJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJLy8KKwkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisKKwkJc3ViRnJhbWVQYXlsb2FkTGVuID0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCQlzdWJGcmFtZVBheWxvYWRMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCX0KKworCQkvLyB1cGRhdGUgc3ViRnJhbWUgTGVuZ3RoIGZpZWxkCisJCXN1YkZyYW1lSGVhZGVyWzEyXSA9IChzdWJGcmFtZVBheWxvYWRMZW4gJiAweEZGMDApID4+IDg7CisJCXN1YkZyYW1lSGVhZGVyWzEzXSA9IHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkY7CisKKwkJdG90YWxNUERVU2l6ZSArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlpZiAoZnJhbWVOdW0gPT0wKQorCQkJRmlyc3RUeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKwkJZWxzZQorCQkJTGFzdFR4SWR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCisJCWZyYW1lTnVtKys7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkJLy8gY2FsY3VsYXRlIFRyYW5zbWl0dGVkIEFNU0RVIENvdW50IGFuZCBCeXRlQ291bnQKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNU0RVQ291bnQudS5Mb3dQYXJ0ICsrOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1TRFUuUXVhZFBhcnQgKz0gdG90YWxNUERVU2l6ZTsKKwkJfQorCisJfQorCisJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKKwlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgU1RBX0xlZ2FjeV9GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlBU1NFUlQocFR4QmxrKTsKKworCisJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9NQ0FTVF9GUkFNRSkKKwl7CisJCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50KTsKKwl9CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX1JUUyhwVHhCbGstPnBQYWNrZXQpKQorCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKKwllbHNlCisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JSdHNSZXF1aXJlZCk7CisKKwliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCWlmIChwVHhCbGstPlR4UmF0ZSA8IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSkKKwkJcFR4QmxrLT5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7CisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKworCS8vIHNraXAgODAyLjMgaGVhZGVyCisJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisJLy8gc2tpcCB2bGFuIHRhZworCWlmIChiVkxBTlBrdCkKKwl7CisJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwl9CisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQorCXsKKwkJLy8KKwkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkJLy8KKwkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKwkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCX0KKworCS8vIFRoZSByZW1haW5pbmcgY29udGVudCBvZiBNUERVIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCXsKKworCQkvLworCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJCS8vCisJCS8vCisgICAJCS8vIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLAorCQkvLyB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCisJCS8vCisJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJeworCQkJVUNIQVIgdmxhbl9zaXplOworCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkvLyBza2lwIHZsYW4gdGFnCisJCQl2bGFuX3NpemUgPSAgKGJWTEFOUGt0KSA/IExFTkdUSF84MDJfMVEgOiAwOworCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIrMTIrdmxhbl9zaXplLCAyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJfQorCisJfQorCisJLy8KKwkvLyBwcmVwYXJlIGZvciBUWFdJCisJLy8gdXNlIFdjaWQgYXMgS2V5IEluZGV4CisJLy8KKworCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKwkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisKKwlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7CisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJLy8KKwkvLyBLaWNrIG91dCBUeAorCS8vCisJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworfQorCisKK1ZPSUQgU1RBX0FSYWxpbmtfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJVVNIT1JUCQkJdG90YWxNUERVU2l6ZT0wOworCVVTSE9SVAkJCUZpcnN0VHgsIExhc3RUeElkeDsKKwlpbnQgCQkJZnJhbWVOdW0gPSAwOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCisJQVNTRVJUKHBUeEJsayk7CisKKwlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcj09IDIpKTsKKworCisJRmlyc3RUeCA9IExhc3RUeElkeCA9IDA7ICAvLyBJcyBpdCBvayBpbml0IHRoZXkgYXMgMD8KKwl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQorCXsKKwkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisKKwkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQlpZiAoZnJhbWVOdW0gPT0gMCkKKwkJewkvLyBGb3IgZmlyc3QgZnJhbWUsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyICsgcGFkZGluZyhvcHRpb25hbCkgKyBSQS1BR0ctTEVOICsgU05BUCBIZWFkZXIKKworCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CisKKwkJCS8vIEl0J3Mgb2sgd3JpdGUgdGhlIFR4V0kgaGVyZSwgYmVjYXVzZSB0aGUgVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CisJCQkvLwl3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuCisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisKKwkJCS8vCisJCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJCQkvLworCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisKKwkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsJLy8gRm9yIHNlY29uZCBhZ2dyZWdhdGVkIGZyYW1lLCB3ZSBuZWVkIGNyZWF0ZSB0aGUgODAyLjMgaGVhZGVyIHRvIGhlYWRlckJ1ZiwgYmVjYXVzZSBQQ0kgd2lsbCBjb3B5IGl0IHRvIFNEUHRyMC4KKworCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZlswXTsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IDA7CisKKwkJCS8vIEEtUmFsaW5rIHN1Yi1zZXF1ZW50IGZyYW1lIGhlYWRlciBpcyB0aGUgc2FtZSBhcyA4MDIuMyBoZWFkZXIuCisJCQkvLyAgIERBKDYpK1NBKDYpK0ZyYW1lVHlwZSgyKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDEyOworCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFEOworCQl9CisKKwkJdG90YWxNUERVU2l6ZSArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCWlmIChmcmFtZU51bSA9PTApCisJCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCQllbHNlCisJCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisKKwkJZnJhbWVOdW0rKzsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4QWdncmVnYXRpb25Db3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCX0KKworCUhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgRmlyc3RUeCk7CisJSEFMX0xhc3RUeElkeChwQWQsIHBUeEJsay0+UXVlSWR4LCBMYXN0VHhJZHgpOworCisJLy8KKwkvLyBLaWNrIG91dCBUeAorCS8vCisJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworCit9CisKKworVk9JRCBTVEFfRnJhZ21lbnRfRnJhbWVfVHgoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlVQ0hBUiAJCQlmcmFnTnVtID0gMDsKKwlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKKwlVU0hPUlQJCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOworCVVJTlQzMgkJCUZyZWVNcGR1U2l6ZSwgU3JjUmVtYWluaW5nQnl0ZXM7CisJVVNIT1JUCQkJQWNrRHVyYXRpb247CisJVUlOVCAJCQlOZXh0TXBkdVNpemU7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisKKwlBU1NFUlQocFR4QmxrKTsKKworCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwl7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJQVNTRVJUKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZykpOworCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisJaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCXsKKwkJcFR4QmxrLT5wUGFja2V0ID0gZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKHBBZCwgcFR4QmxrLT5wUGFja2V0KTsKKwkJaWYgKHBUeEJsay0+cFBhY2tldCA9PSBOVUxMKQorCQkJcmV0dXJuOworCQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwVHhCbGstPnBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCX0KKworCS8vIHNraXAgODAyLjMgaGVhZGVyCisJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisKKwkvLyBza2lwIHZsYW4gdGFnCisJaWYgKGJWTEFOUGt0KQorCXsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCX0KKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKilwSGVhZGVyQnVmUHRyOworCisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQorCXsKKwkJLy8KKwkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkJLy8KKwkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisJfQorCisJLy8KKwkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKKwkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwkvLworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKworCisJLy8KKwkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJLy8KKwkvLworICAgCS8vIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLAorCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKwkvLworCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCXsKKwkJVUNIQVIgdmxhbl9zaXplOworCisJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkvLyBza2lwIHZsYW4gdGFnCisJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIrMTIrdmxhbl9zaXplLCAyKTsKKwkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJfQorCisKKwkvLyBJZiBUS0lQIGlzIHVzZWQgYW5kIGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQuIERyaXZlciBoYXMgdG8KKwkvLwlhcHBlbmQgVEtJUCBNSUMgYXQgdGFpbCBvZiB0aGUgc2NhdHRlciBidWZmZXIKKwkvLwlNQUMgQVNJQyB3aWxsIG9ubHkgcGVyZm9ybSBJVi9FSVYvSUNWIGluc2VydGlvbiBidXQgbm8gVEtJUCBNSUMKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJeworCisJCS8vIE5PVEU6IERPTidUIHJlZmVyIHRoZSBza2ItPmxlbiBkaXJlY3RseSBhZnRlciBmb2xsb3dpbmcgY29weS4gQmVjYXN1ZSB0aGUgbGVuZ3RoIGlzIG5vdCBhZGp1c3QKKwkJLy8JCQl0byBjb3JyZWN0IGxlbmdodCwgcmVmZXIgdG8gcFR4QmxrLT5TcmNCdWZMZW4gZm9yIHRoZSBwYWNrZXQgbGVuZ3RoIGluIGZvbGxvd2luZyBwcm9ncmVzcy4KKwkJTmRpc01vdmVNZW1vcnkocFR4QmxrLT5wU3JjQnVmRGF0YSArIHBUeEJsay0+U3JjQnVmTGVuLCAmcEFkLT5Qcml2YXRlSW5mby5UeC5NSUNbMF0sIDgpOworCQkvL3NrYl9wdXQoKFJUUEtUX1RPX09TUEtUKHBUeEJsay0+cFBhY2tldCkpLT50YWlsLCA4KTsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gKz0gODsKKwkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IDg7CisJCXBUeEJsay0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVBfTk9fTUlDOworCX0KKworCS8vCisJLy8gY2FsY3VhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcworCS8vIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkCisJLy8KKwlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkgfHwgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSA4OyAvL1dFUDogSVZbNF0gKyBJQ1ZbNF07CisJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxMjsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdLCBNSUMgd2lsbCBiZSBhZGRlZCB0byBUb3RhbFBhY2tldExlbmd0aAorCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAyMDsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdICsgTUlDWzhdCisJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMTY7CS8vIEFFUzogSVZbNF0gKyBFSVZbNF0gKyBNSUNbOF0KKwllbHNlCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7CisKKwkvLyBkZWNpZGUgaG93IG11Y2ggdGltZSBhbiBBQ0svQ1RTIGZyYW1lIHdpbGwgY29uc3VtZSBpbiB0aGUgYWlyCisJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW3BUeEJsay0+VHhSYXRlXSwgMTQpOworCisJLy8gSW5pdCB0aGUgdG90YWwgcGF5bG9hZCBsZW5ndGggb2YgdGhpcyBmcmFtZS4KKwlTcmNSZW1haW5pbmdCeXRlcyA9IHBUeEJsay0+U3JjQnVmTGVuOworCisJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gPSAweGZmOworCisJZG8geworCisJCUZyZWVNcGR1U2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkIC0gTEVOR1RIX0NSQzsKKworCQlGcmVlTXBkdVNpemUgLT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJCWlmIChTcmNSZW1haW5pbmdCeXRlcyA8PSBGcmVlTXBkdVNpemUpCisJCXsJLy8gdGhpcyBpcyB0aGUgbGFzdCBvciBvbmx5IGZyYWdtZW50CisKKwkJCXBUeEJsay0+U3JjQnVmTGVuID0gU3JjUmVtYWluaW5nQnl0ZXM7CisKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Nb3JlRnJhZyA9IDA7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIEFja0R1cmF0aW9uOworCisJCQkvLyBJbmRpY2F0ZSB0aGUgbG93ZXIgbGF5ZXIgdGhhdCB0aGlzJ3MgdGhlIGxhc3QgZnJhZ21lbnQuCisJCQlwVHhCbGstPlRvdGFsRnJhZ051bSA9IGZyYWdOdW07CisJCX0KKwkJZWxzZQorCQl7CS8vIG1vcmUgZnJhZ21lbnQgaXMgcmVxdWlyZWQKKworCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBGcmVlTXBkdVNpemU7CisKKwkJCU5leHRNcGR1U2l6ZSA9IG1pbigoKFVJTlQpU3JjUmVtYWluaW5nQnl0ZXMgLSBwVHhCbGstPlNyY0J1ZkxlbiksICgoVUlOVClwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9ICgzICogcEFkLT5Db21tb25DZmcuRHNpZnMpICsgKDIgKiBBY2tEdXJhdGlvbikgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgcFR4QmxrLT5UeFJhdGUsIE5leHRNcGR1U2l6ZSArIEVuY3J5cHRpb25PdmVyaGVhZCk7CisJCX0KKworCQlpZiAoZnJhZ051bSA9PSAwKQorCQkJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19IVFRYT1A7CisJCWVsc2UKKwkJCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfU0lGUzsKKworCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisJCUhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCAmRnJlZU51bWJlcik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkJLy8gVXBkYXRlIHRoZSBmcmFtZSBudW1iZXIsIHJlbWFpbmluZyBzaXplIG9mIHRoZSBORElTIHBhY2tldCBwYXlsb2FkLgorCisJCS8vIHNwYWNlIGZvciA4MDIuMTEgaGVhZGVyLgorCQlpZiAoZnJhZ051bSA9PSAwICYmIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC09IExFTkdUSF84MDJfMV9IOworCisJCWZyYWdOdW0rKzsKKwkJU3JjUmVtYWluaW5nQnl0ZXMgLT0gcFR4QmxrLT5TcmNCdWZMZW47CisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJcEhlYWRlcl84MDJfMTEtPkZyYWcrKzsJIC8vIGluY3JlYXNlIEZyYWcgIworCisJfXdoaWxlKFNyY1JlbWFpbmluZ0J5dGVzID4gMCk7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Cit9CisKKworI2RlZmluZSBSRUxFQVNFX0ZSQU1FU19PRl9UWEJMSyhfcEFkLCBfcFR4QmxrLCBfcFFFbnRyeSwgX1N0YXR1cykgCQkJCQkJCQkJCVwKKwkJd2hpbGUoX3BUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCQkJCQkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJX3BRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJl9wVHhCbGstPlR4UGFja2V0TGlzdCk7CQkJCQkJCQkJXAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBRVUVVRV9FTlRSWV9UT19QQUNLRVQoX3BRRW50cnkpLCBfU3RhdHVzKTsJXAorCQl9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSBlbmNyeXB0aW9uIGJlZm9yZSByZWFsbHkKKwlzZW50IG91dCB0byBhaXIuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCisJCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgU1RBSGFyZFRyYW5zbWl0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFRYX0JMSyAJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KQoreworCU5ESVNfUEFDS0VUCQkqcFBhY2tldDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNURVAgMC4gRE8gU0FOSVRZIENIRUNLIEFORCBTT01FIEVBUkxZIFBSRVBBUkFUSU9OLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vCisJQVNTRVJUKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcik7CisJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUeEJsay0+VG90YWxGcmFtZU51bSA9PSAlbGQhXG4iLCBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKTsKKworI2lmIDAgLy9kZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKSAmJiAoaXNDYXJyaWVyRGV0ZWN0RXhpc3QocEFkKSA9PSBUUlVFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sKCJTVEFIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAxLiBXQUtFIFVQIFBIWQorCS8vCQlvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QgYW5kCisJLy8JCXR1cm4gb2ZmIFBTTSBiaXQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIG5vdCB0byBjaGFuZ2UgUFNNIGJpdCwganVzdCBzZW5kIHRoaXMgZnJhbWUgb3V0PworCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCXsKKwkgICAgREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNGb3JjZVdha2V1cCBBdCBIYXJkVHhcbiIpKTsKKwkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJfQorCisJLy8gSXQgc2hvdWxkIG5vdCBjaGFuZ2UgUFNNIGJpdCwgd2hlbiBBUFNEIHR1cm4gb24uCisJaWYgKCghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPT0gRkFMU0UpKQorCQl8fCAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCisJCXx8IChSVE1QX0dFVF9QQUNLRVRfV0FJKHBUeEJsay0+cFBhY2tldCkpKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmCisgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApKQorCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9BQ1RJVkUpOworCX0KKworCXN3aXRjaCAocFR4QmxrLT5UeEZyYW1lVHlwZSkKKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgVFhfQU1QRFVfRlJBTUU6CisJCQkJU1RBX0FNUERVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX0FNU0RVX0ZSQU1FOgorCQkJCVNUQV9BTVNEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBUWF9MRUdBQ1lfRlJBTUU6CisJCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJY2FzZSBUWF9NQ0FTVF9GUkFNRToKKwkJCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX1JBTElOS19GUkFNRToKKwkJCQlTVEFfQVJhbGlua19GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJY2FzZSBUWF9GUkFHX0ZSQU1FOgorCQkJCVNUQV9GcmFnbWVudF9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNlbmQgYSBwYWNla3Qgd2FzIG5vdCBjbGFzc2lmaWVkISEgSXQgc2hvdWxkIG5vdCBoYXBwZW4hXG4iKSk7CisJCQkJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKQorCQkJCXsKKwkJCQkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCQkJCQlpZiAocFBhY2tldCkKKwkJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCit9CisKK1VMT05HICBIYXNoQnl0ZXNQb2x5bm9taWFsKFVDSEFSICp2YWx1ZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgIHVuc2lnbmVkIGNoYXIgKndvcmQgPSB2YWx1ZTsKKyAgIHVuc2lnbmVkIGludCByZXQgPSAwOworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIGZvcihpPTA7IGkgPCBsZW47IGkrKykKKyAgIHsKKwkgIGludCBtb2QgPSBpICUgMzI7CisJICByZXQgXj0odW5zaWduZWQgaW50KSAod29yZFtpXSkgPDwgbW9kOworCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pID4+ICgzMiAtIG1vZCk7CisgICB9CisgICByZXR1cm4gcmV0OworfQorCitWT0lEIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCWlmIChUUlVFCisJCSkKKwl7CisJCWFubm91bmNlXzgwMl8zX3BhY2tldChwQWQsIHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9zYW5pdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3Nhbml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTg3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9zYW5pdHkuYwpAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzYW5pdHkuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK2V4dGVybiBVQ0hBUglDSVNDT19PVUlbXTsKKworZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKK2V4dGVybiBVQ0hBUglSU05fT1VJW107CitleHRlcm4gVUNIQVIJV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIFVDSEFSCVdNRV9QQVJNX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglDY3gyUW9zSW5mb1tdOworZXh0ZXJuIFVDSEFSCVJBTElOS19PVUlbXTsKK2V4dGVybiBVQ0hBUglCUk9BRENPTV9PVUlbXTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpwU3NpZExlbikKK3sKKyAgICBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKkluZm87CisKKyAgICBJbmZvID0gKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqKShNc2cpOworCisgICAgaWYgKEluZm8tPlNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgbGVuZ3RoXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOworICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKyAgICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVU0hPUlQgKnBBaWQsCisgICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCisgICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisgICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisgICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCisgICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAorICAgIE9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKKyAgICBPVVQgVUNIQVIgKnBDa2lwRmxhZykKK3sKKyAgICBDSEFSICAgICAgICAgIEllVHlwZSwgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7CisgICAgUEVJRF9TVFJVQ1QgICBwRWlkOworICAgIFVMT05HICAgICAgICAgTGVuZ3RoID0gMDsKKworCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJKnBIdENhcGFiaWxpdHlMZW4gPSAwOworCSpwQWRkSHRJbmZvTGVuID0gMDsKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIFB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisgICAgTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKyAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKyAgICBMZW5ndGggKz0gMjsKKyAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCAgICAgICAgICZwRnJhbWUtPk9jdGV0WzJdLCAyKTsKKyAgICBMZW5ndGggKz0gMjsKKyAgICAqcENraXBGbGFnID0gMDsKKyAgICAqcEV4dFJhdGVMZW4gPSAwOworICAgIHBFZGNhUGFybS0+YlZhbGlkID0gRkFMU0U7CisKKyAgICBpZiAoKnBTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHBBaWQsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKKyAgICBMZW5ndGggKz0gMjsKKworICAgIC8vIEFpZCBhbHJlYWR5IHN3YXBlZCBieXRlIG9yZGVyIGluIFJUTVBGcmFtZUVuZGlhbkNoYW5nZSgpIGZvciBiaWcgZW5kaWFuIHBsYXRmb3JtCisgICAgKnBBaWQgPSAoKnBBaWQpICYgMHgzZmZmOyAvLyBBSUQgaXMgbG93IDE0LWJpdAorCisgICAgLy8gLS0gZ2V0IHN1cHBvcnRlZCByYXRlcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBJZVR5cGUgPSBwRnJhbWUtPk9jdGV0WzZdOworICAgICpwU3VwUmF0ZUxlbiA9IHBGcmFtZS0+T2N0ZXRbN107CisgICAgaWYgKChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykgfHwgKCpwU3VwUmF0ZUxlbiA+IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcFNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydGVkUmF0ZXMgSUVcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsICZwRnJhbWUtPk9jdGV0WzhdLCAqcFN1cFJhdGVMZW4pOworCisgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArICpwU3VwUmF0ZUxlbjsKKworICAgIC8vIG1hbnkgQVAgaW1wbGVtZW50IHByb3ByaWV0YXJ5IElFcyBpbiBub24tc3RhbmRhcmQgb3JkZXIsIHdlJ2QgYmV0dGVyCisgICAgLy8gdG9sZXJhdGUgbWlzLW9yZGVyZWQgSUVzIHRvIGdldCBiZXN0IGNvbXBhdGliaWxpdHkKKyAgICBwRWlkID0gKFBFSURfU1RSVUNUKSAmcEZyYW1lLT5PY3RldFs4ICsgKCpwU3VwUmF0ZUxlbildOworCisgICAgLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICB3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKKyAgICB7CisgICAgICAgIHN3aXRjaCAocEVpZC0+RWlkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgorICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVAyOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIFNJWkVfSFRfQ0FQX0lFKTsKKworCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOworCisJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKKyAgICAgICAgICAgIGNhc2UgSUVfQUREX0hUMjoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKKwkJCXsKKwkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQorCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKworCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7CisJCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKKworCQkJCSpwQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpCisJCQl7CisJCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfQ0tJUDoKKyAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gMjgKKyAgICAgICAgICAgICAgICAvLyAgICBDaXNjbydzIEFQIFZ4V29yayB2ZXJzaW9uKHdpbGwgbm90IGJlIHN1cHBvcnRlZCkgdXNlZCB0aGlzIElFIGxlbmd0aCBhcyAyOAorICAgICAgICAgICAgICAgIC8vICAgIENpc2NvJ3MgQVAgSU9TIHZlcnNpb24gdXNlZCB0aGlzIElFIGxlbmd0aCBhcyAzMAorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPCAoQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAyKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIDEuIENvcHkgQ0tJUCBmbGFnIGJ5dGUgdG8gYnVmZmVyIGZvciBwcm9jZXNzCisgICAgICAgICAgICAgICAgKnBDa2lwRmxhZyA9ICoocEVpZC0+T2N0ZXQgKyA4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0lQQUREUkVTUzoKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDB4MEEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgQ2lzY28gQWlyb25ldCBJUCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQWlyb25ldElQQWRkcmVzcywgcEVpZC0+T2N0ZXQgKyA0LCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gQ0NYMiwgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWx1ZQorICAgICAgICAgICAgLy8gY2FzZSBJRV9DQ1hfVjI6CisgICAgICAgICAgICBjYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgV01FIFBBUkFNVEVSIEVMRU1FTlQKKyAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgLy9wRWRjYVBhcm0tPmJNb3JlRGF0YUFjayAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4ODA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwRWlkLT5PY3RldFs4XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7IC8vIGI1fjYgaXMgQUMgSU5ERVgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVthY2ldICA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7ICAgLy8gYjUgaXMgQUNNCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOyAgICAgICAgICAgICAgIC8vIGIwfjMgaXMgQUlGU04KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyKzEpICYgMHgwZjsgICAgICAgICAgICAgLy8gYjB+NCBpcyBDd21pbgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFthY2ldID0gKihwdHIrMSkgPj4gNDsgICAgICAgICAgICAgICAvLyBiNX44IGlzIEN3bWF4CisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbYWNpXSAgPSAqKHB0cisyKSArIDI1NiAqICgqKHB0ciszKSk7IC8vIGluIHVuaXQgb2YgMzItdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA0OyAvLyBwb2ludCB0byBuZXh0IEFDCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgQ0NYIElFCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgdGhlIHNpemUgYW5kIENDWCBhZG1pbiBjb250cm9sCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gNSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIFR1cm4gQ0NYMiBpZiBtYXRjaGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENjeDJJZUluZm8sIDUpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IC0gaWdub3JlIHVucmVjb2duaXplZCBFSUQgPSAlZFxuIiwgcEVpZC0+RWlkKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgcEVpZC0+TGVuOworICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKyAgICB9CisKKyAgICAvLyBGb3JjZSBDQ1gyIGVuYWJsZSB0byBUUlVFIGZvciB0aG9zZSBBUCBkaWRuJ3QgcmVwbGF5IENDWCB2MiBJRSwgd2Ugc3RpbGwgZm9yY2UgaXQgdG8gYmUgb24KKyAgICBpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKKyAgICAgICAgcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gVFJVRTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpwU3NpZExlbikKK3sKKyAgICBVQ0hBUiAgICAgICAgIElkeDsKKyAgICBVQ0hBUgkgICAgICBSYXRlTGVuOworICAgIENIQVIgICAgICAgICAgSWVUeXBlOworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKworICAgIGlmICgocEZyYW1lLT5PY3RldFswXSAhPSBJRV9TU0lEKSB8fCAocEZyYW1lLT5PY3RldFsxXSA+IE1BWF9MRU5fT0ZfU1NJRCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgSUUoVHlwZT0lZCxMZW49JWQpXG4iLHBGcmFtZS0+T2N0ZXRbMF0scEZyYW1lLT5PY3RldFsxXSkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgKnBTc2lkTGVuID0gcEZyYW1lLT5PY3RldFsxXTsKKyAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCAmcEZyYW1lLT5PY3RldFsyXSwgKnBTc2lkTGVuKTsKKworICAgIElkeCA9ICpwU3NpZExlbiArIDI7CisKKyAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbSWR4XTsKKyAgICBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFtJZHggKyAxXTsKKyAgICBpZiAoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRSYXRlcyBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFtJZHhdLHBGcmFtZS0+T2N0ZXRbSWR4KzFdKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChSYXRlTGVuIDwgOCkpCisgICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIEdldFRpbUJpdCgKKyAgICBJTiBDSEFSICpQdHIsCisgICAgSU4gVVNIT1JUIEFpZCwKKyAgICBPVVQgVUNIQVIgKlRpbUxlbiwKKyAgICBPVVQgVUNIQVIgKkJjYXN0RmxhZywKKyAgICBPVVQgVUNIQVIgKkR0aW1Db3VudCwKKyAgICBPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCisgICAgT1VUIFVDSEFSICpNZXNzYWdlVG9NZSkKK3sKKyAgICBVQ0hBUiAgICAgICAgICBCaXRDbnRsLCBOMSwgTjIsIE15Qnl0ZSwgTXlCaXQ7CisgICAgQ0hBUiAgICAgICAgICAqSWR4UHRyOworCisgICAgSWR4UHRyID0gUHRyOworCisgICAgSWR4UHRyICsrOworICAgICpUaW1MZW4gPSAqSWR4UHRyOworCisgICAgLy8gZ2V0IERUSU0gQ291bnQgZnJvbSBUSU0gZWxlbWVudAorICAgIElkeFB0ciArKzsKKyAgICAqRHRpbUNvdW50ID0gKklkeFB0cjsKKworICAgIC8vIGdldCBEVElNIFBlcmlvZCBmcm9tIFRJTSBlbGVtZW50CisgICAgSWR4UHRyKys7CisgICAgKkR0aW1QZXJpb2QgPSAqSWR4UHRyOworCisgICAgLy8gZ2V0IEJpdG1hcCBDb250cm9sIGZyb20gVElNIGVsZW1lbnQKKyAgICBJZHhQdHIrKzsKKyAgICBCaXRDbnRsID0gKklkeFB0cjsKKworICAgIGlmICgoKkR0aW1Db3VudCA9PSAwKSAmJiAoQml0Q250bCAmIDB4MDEpKQorICAgICAgICAqQmNhc3RGbGFnID0gVFJVRTsKKyAgICBlbHNlCisgICAgICAgICpCY2FzdEZsYWcgPSBGQUxTRTsKKworICAgIC8vIFBhcnNlIFBhcnRpYWwgVmlydHVhbCBCaXRtYXAgZnJvbSBUSU0gZWxlbWVudAorICAgIE4xID0gQml0Q250bCAmIDB4ZmU7ICAgIC8vIE4xIGlzIHRoZSBmaXJzdCBiaXRtYXAgYnl0ZSMKKyAgICBOMiA9ICpUaW1MZW4gLSA0ICsgTjE7ICAvLyBOMiBpcyB0aGUgbGFzdCBiaXRtYXAgYnl0ZSMKKworICAgIGlmICgoQWlkIDwgKE4xIDw8IDMpKSB8fCAoQWlkID49ICgoTjIgKyAxKSA8PCAzKSkpCisgICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIE15Qnl0ZSA9IChBaWQgPj4gMykgLSBOMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG15IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGJpdG1hcCBieXRlLXN0cmVhbQorICAgICAgICBNeUJpdCA9IEFpZCAlIDE2IC0gKChNeUJ5dGUgJiAweDAxKT8gODowKTsKKworICAgICAgICBJZHhQdHIgKz0gKE15Qnl0ZSArIDEpOworCisgICAgICAgIC8vaWYgKCpJZHhQdHIpCisgICAgICAgIC8vICAgIERCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiVElNIGJpdG1hcCA9IDB4JTAyeFxuIiwgKklkeFB0cikpOworCisgICAgICAgIGlmICgqSWR4UHRyICYgKDB4MDEgPDwgTXlCaXQpKQorICAgICAgICAgICAgKk1lc3NhZ2VUb01lID0gVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg5NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc3luYy5jCkBAIC0wLDAgKzEsMTc1MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzeW5jLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDQtMDktMDEgICAgICBtb2RpZmllZCBmb3IgcnQyNTYxLzI2NjEKKwlKYW4gTGVlCQkyMDA2LTA4LTAxICAgICAgbW9kaWZpZWQgZm9yIHJ0Mjg2MCBmb3IgODAyLjExbgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2RlZmluZSBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FCSgyKk9TX0haKQkvLyAyIHNlYworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoZSBzeW5jIHN0YXRlIG1hY2hpbmUsCisJUGFyYW1ldGVyczoKKwkJU20gLSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCisJTm90ZToKKwkJdGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX1NZTkNfU1RBVEUsIE1BWF9TWU5DX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBTWU5DX0lETEUsIFNZTkNfTUFDSElORV9CQVNFKTsKKworCS8vIGNvbHVtbiAxCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTY2FuUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUpvaW5SZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVN0YXJ0UmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9QUk9CRV9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclByb2JlUmVxQWN0aW9uKTsKKworCS8vY29sdW1uIDIKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdEpvaW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX0JFQUNPTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24pOworCisJLy8gY29sdW1uIDMKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU2Nhbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9QUk9CRV9SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1NDQU5fVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylTY2FuVGltZW91dEFjdGlvbik7CisKKwkvLyB0aW1lciBpbml0CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlCZWFjb24gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCZWFjb25UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNZTkMgLSBCZWFjb25UaW1lb3V0XG4iKSk7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwkJKQorCXsKKwkJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX0JFQUNPTl9USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiB0aW1lb3V0IGhhbmRsZXIsIGV4ZWN1dGVkIGluIHRpbWVyIHRocmVhZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworCWlmIChNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fVElNRU9VVCwgMCwgTlVMTCkpCisJeworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFRvIHByZXZlbnQgU3luY01hY2hpbmUuQ3VyclN0YXRlIGlzIFNDQU5fTElTVEVOIGZvcmV2ZXIuCisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKKwkJU2Nhbk5leHRDaGFubmVsKHBBZCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNTE1FIFNDQU4gcmVxIHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBTY2FuVHlwZSwgQnNzVHlwZSwgQkJQVmFsdWUgPSAwOworCUJPT0xFQU4gICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVMT05HCQkgICBOb3c7CisJVVNIT1JUICAgICAgICAgU3RhdHVzOworCVBIRUFERVJfODAyXzExIHBIZHI4MDIxMTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICBOU3RhdHVzOworCisJLy8gQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQKKwkvLyBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEKKwlpZiAoICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uIGJlZm9yZSBTdGFydHVwXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBJbmNyZWFzZSB0aGUgc2NhbiByZXRyeSBjb3VudGVycy4KKwlwQWQtPlN0YUNmZy5TY2FuQ250Kys7CisKKworCS8vIGZpcnN0IGNoZWNrIHRoZSBwYXJhbWV0ZXIgc2FuaXR5CisJaWYgKE1sbWVTY2FuUmVxU2FuaXR5KHBBZCwKKwkJCQkJCSAgRWxlbS0+TXNnLAorCQkJCQkJICBFbGVtLT5Nc2dMZW4sCisJCQkJCQkgICZCc3NUeXBlLAorCQkJCQkJICBTc2lkLAorCQkJCQkJICAmU3NpZExlbiwKKwkJCQkJCSAgJlNjYW5UeXBlKSkKKwl7CisKKwkJLy8gQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0CisJCS8vIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQKKwkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsJCQkvLyBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQorCQkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisJCX0KKworCQkvLworCQkvLyBUbyBwcmV2ZW50IGRhdGEgbG9zdC4KKwkJLy8gU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuCisJCS8vIEFuZCBzaG91bGQgc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lCisJCS8vCisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYgKElORlJBX09OKHBBZCkpKQorCQl7CisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKKwkJCWlmIChOU3RhdHVzCT09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwSGRyODAyMTEsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOworCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJCQkJcEhkcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisKKwkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CisJCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJfQorCQl9CisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCS8vIHJlY29yZCBkZXNpcmVkIEJTUyBwYXJhbWV0ZXJzCisJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQnNzVHlwZTsKKwkJcEFkLT5NbG1lQXV4LlNjYW5UeXBlID0gU2NhblR5cGU7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKworCQkvLyBzdGFydCBmcm9tIHRoZSBmaXJzdCBjaGFubmVsCisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7CisKKwkJLy8gQ2hhbmdlIHRoZSBzY2FuIGNoYW5uZWwgd2hlbiBkZWFsaW5nIHdpdGggQ0NYIGJlYWNvbiByZXBvcnQKKwkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkgfHwKKwkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKQorCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbDsKKworCQkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOworCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgSk9JTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVKb2luUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOworCUJTU19FTlRSWSAgICAqcEJzczsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCUhFQURFUl84MDJfMTEgSGRyODAyMTE7CisJTkRJU19TVEFUVVMgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUFVDSEFSICAgICAgICBwU3VwUmF0ZSA9IE5VTEw7CisJVUNIQVIgICAgICAgICBTdXBSYXRlTGVuOworCVBVQ0hBUiAgICAgICAgcEV4dFJhdGUgPSBOVUxMOworCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIEFTdXBSYXRlW10gPSB7MHg4QywgMHgxMiwgMHg5OCwgMHgyNCwgMHhiMCwgMHg0OCwgMHg2MCwgMHg2Q307CisJVUNIQVIgICAgICAgICBBU3VwUmF0ZUxlbiA9IHNpemVvZihBU3VwUmF0ZSkvc2l6ZW9mKFVDSEFSKTsKKwlNTE1FX0pPSU5fUkVRX1NUUlVDVCAqcEluZm8gPSAoTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKikoRWxlbS0+TXNnKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lSm9pblJlcUFjdGlvbihCU1MgIyVsZClcbiIsIHBJbmZvLT5Cc3NJZHgpKTsKKworCisJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwlwQnNzID0gJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W3BJbmZvLT5Cc3NJZHhdOworCisJLy8gcmVjb3JkIHRoZSBkZXNpcmVkIFNTSUQgJiBCU1NJRCB3ZSdyZSB3YWl0aW5nIGZvcgorCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzLT5Cc3NpZCk7CisKKwkvLyBJZiBBUCdzIFNTSUQgaXMgbm90IGhpZGRlbiwgaXQgaXMgT0sgZm9yIHVwZGF0aW5nIHNzaWQgdG8gTWxtZUF1eCBhZ2Fpbi4KKwlpZiAocEJzcy0+SGlkZGVuID09IDApCisJeworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEJzcy0+U3NpZExlbjsKKwl9CisKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBCc3MtPkJzc1R5cGU7CisJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQnNzLT5DaGFubmVsOworCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBCc3MtPkNlbnRyYWxDaGFubmVsOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCS8vIENvdW50cnkgSUUgb2YgdGhlIEFQIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCB3aWxsIGJlIHVzZWQuCisJaWYgKChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSAhPSBSdDgwMl8xMV9EX05vbmUpICYmCisJCShwQnNzLT5iSGFzQ291bnRyeUlFID09IFRSVUUpKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzBdLCAmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgMik7CisJCWlmIChwQnNzLT5Db3VudHJ5U3RyaW5nWzJdID09ICdJJykKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IElET1I7CisJCWVsc2UgaWYgKHBCc3MtPkNvdW50cnlTdHJpbmdbMl0gPT0gJ08nKQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gT0RPUjsKKwkJZWxzZQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gQk9USDsKKwkJQnVpbGRDaGFubmVsTGlzdEV4KHBBZCk7CisJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgorCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwlCQlBWYWx1ZSAmPSAofjB4MTgpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQkJQIFI0IHRvIDIwTUh6LmxcbiIpKTsKKworCS8vIHN3aXRjaCBjaGFubmVsIGFuZCB3YWl0aW5nIGZvciBiZWFjb24gdGltZXIKKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBKT0lOX1RJTUVPVVQpOworCisgICAgZG8KKwl7CisJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKyAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICkKKwkJeworCQkJLy8KKwkJCS8vIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLgorCQkJLy8KKwkJCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8vCisJCS8vIHNlbmQgcHJvYmUgcmVxdWVzdAorCQkvLworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJcFN1cFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlOworCQkJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQkJCXBFeHRSYXRlID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZTsKKwkJCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLworCQkJCS8vIE92ZXJ3cml0ZSBTdXBwb3J0IFJhdGUsIENDSyByYXRlIGFyZSBub3QgYWxsb3dlZAorCQkJCS8vCisJCQkJcFN1cFJhdGUgPSBBU3VwUmF0ZTsKKwkJCQlTdXBSYXRlTGVuID0gQVN1cFJhdGVMZW47CisJCQkJRXh0UmF0ZUxlbiA9IDA7CisJCQl9CisKKwkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCWVsc2UKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sCSAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCisJCQkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgIHBTdXBSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQlpZiAoRXh0UmF0ZUxlbikKKwkJCXsKKwkJCQlVTE9ORyBUbXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAorCQkJCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgICBwRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJfQorCisKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorICAgIH0gd2hpbGUgKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTd2l0Y2ggdG8gY2ggJWQsIFdhaXQgQkVBQ09OIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBCc3MtPkNoYW5uZWwsIHBCc3MtPkJzc2lkWzBdLCBwQnNzLT5Cc3NpZFsxXSwgcEJzcy0+QnNzaWRbMl0sIHBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBKT0lOX1dBSVRfQkVBQ09OOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgU1RBUlQgUmVxdWVzdCBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZSwgc3RhcnRpbmcgYW4gSUJTUworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZVN0YXJ0UmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbjsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCisJLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07IAkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJTEFSR0VfSU5URUdFUgkJCQlUaW1lU3RhbXA7CisJQk9PTEVBTiBQcml2YWN5OworCVVTSE9SVCBTdGF0dXM7CisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKwlUaW1lU3RhbXAudS5Mb3dQYXJ0ICA9IDA7CisJVGltZVN0YW1wLnUuSGlnaFBhcnQgPSAwOworCisJaWYgKE1sbWVTdGFydFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBTc2lkLCAmU3NpZExlbikpCisJeworCQkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCS8vCisJCS8vIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLgorCQkvLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4gXG4iKSk7CisJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlICAgICAgICAgICA9IEJTU19BREhPQzsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCQlwQWQtPk1sbWVBdXguU3NpZExlbiAgICAgICAgICAgPSBTc2lkTGVuOworCisJCS8vIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lECisJCU1hY0FkZHJSYW5kb21Cc3NpZChwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lEIFxuIikpOworCisJCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gICAgPSBDQVBfR0VORVJBVEUoMCwxLFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDEsIDApOworCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kICAgICAgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisJCXBBZC0+TWxtZUF1eC5BdGltV2luICAgICAgICAgICA9IHBBZC0+U3RhQ2ZnLkF0aW1XaW47CisJCXBBZC0+TWxtZUF1eC5DaGFubmVsICAgICAgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsICAgID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisKKwkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW49IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJeworCQkJUlRNUFVwZGF0ZUhUSUUoJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSwgJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0WzBdLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8pOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKwkJCS8vIE5vdCB0dXJuIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUUgaGVyZS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUVcbiIpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOworCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJfQorCQkvLyB0ZW1wb3JhcmlseSBub3Qgc3VwcG9ydCBRT1MgaW4gSUJTUworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbihjaD0gJWQsc3VwIHJhdGVzPSAlZCwgZXh0IHJhdGVzPSVkKVxuIiwKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsLlxuIikpOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgYmVhY29uIGJhY2sgd2hlbiBzY2FubmluZworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwKKwkJCQkJU3NpZExlbiwgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE1lc3NhZ2VUb01lOworCUNGX1BBUk0gICAgICAgICBDZlBhcm07CisJVVNIT1JUICAgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJUEZSQU1FXzgwMl8xMSAgIHBGcmFtZTsKKwlMQVJHRV9JTlRFR0VSICAgVGltZVN0YW1wOworCVVDSEFSICAgICAgICAgICBFcnA7CisJVUNIQVIgICAgICAgICAJU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIAlTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCVVTSE9SVCAJCQlMZW5WSUU7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKKwlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07CisJUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOworCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKKwlVTE9ORwkJCQkJCVJhbGlua0llOworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiA9IDAsIFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisKKworCS8vIE5kaXNGaWxsTWVtb3J5KFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCwgMHgwMCk7CisJcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpIEVsZW0tPk1zZzsKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKKwkJCQkJCQkJRWxlbS0+TXNnLAorCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCQkJCUFkZHIyLAorCQkJCQkJCQlCc3NpZCwKKwkJCQkJCQkJU3NpZCwKKwkJCQkJCQkJJlNzaWRMZW4sCisJCQkJCQkJCSZCc3NUeXBlLAorCQkJCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkJCQkmQ2hhbm5lbCwKKwkJCQkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCQkJCSZUaW1lU3RhbXAsCisJCQkJCQkJCSZDZlBhcm0sCisJCQkJCQkJCSZBdGltV2luLAorCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJCSZFcnAsCisJCQkJCQkJCSZEdGltQ291bnQsCisJCQkJCQkJCSZEdGltUGVyaW9kLAorCQkJCQkJCQkmQmNhc3RGbGFnLAorCQkJCQkJCQkmTWVzc2FnZVRvTWUsCisJCQkJCQkJCVN1cFJhdGUsCisJCQkJCQkJCSZTdXBSYXRlTGVuLAorCQkJCQkJCQlFeHRSYXRlLAorCQkJCQkJCQkmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkNraXBGbGFnLAorCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCQkJCQkmRWRjYVBhcm0sCisJCQkJCQkJCSZRYnNzTG9hZCwKKwkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJCSZSYWxpbmtJZSwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZIdENhcGFiaWxpdHksCisJCQkJCQkJCSZBZGRIdEluZm9MZW4sCisJCQkJCQkJCSZBZGRIdEluZm8sCisJCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCQkmTGVuVklFLAorCQkJCQkJCQlwVklFKSkKKwl7CisJCVVMT05HIElkeDsKKwkJQ0hBUiBSc3NpID0gMDsKKworCQlJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCVJzc2kgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5Sc3NpOworCisJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQorCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWlmICgocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKSAmJiAoQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCisJCXsKKwkJCUlkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLEV4dFJhdGUsIEV4dFJhdGVMZW4sICZIdENhcGFiaWxpdHksCisJCQkJCQkgJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsCisJCQkJCQkgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCQkJCUFpcm9uZXRBZGRCZWFjb25SZXBvcnQocEFkLCBJZHgsIEVsZW0pOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKKwkJCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbcEFkLT5Db21tb25DZmcuQ2hhbm5lbExpc3RJZHhdLmJFZmZlY3RlZENoYW5uZWwgPT0gVFJVRSkKKwkJCXsKKwkJCQlVQ0hBUgkJUmVnQ2xhc3M7CisJCQkJUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MihwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmUmVnQ2xhc3MpOworCQkJCVRyaUV2ZW50VGFibGVTZXRFbnRyeShwQWQsICZwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIsIEJzc2lkLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sIFJlZ0NsYXNzLCBDaGFubmVsKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCX0KKwkJfQorCX0KKwkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlZAorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVdoZW4gd2FpdGluZyBqb2luaW5nIHRoZSAoSSlCU1MsIGJlYWNvbiByZWNlaXZlZCBmcm9tIGV4dGVybmFsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIEJzc1R5cGUsIENoYW5uZWwsIE1lc3NhZ2VUb01lLAorCQkJCSAgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE5ld0NoYW5uZWw7CisJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7CisJVVNIT1JUICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOworCUNGX1BBUk0gICAgICAgQ2Y7CisJQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUiAgICAgICAgIEVycDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7CisJVVNIT1JUIAkJICBMZW5WSUU7CisJVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVTSE9SVCAgICAgICAgU3RhdHVzOworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKKwlVTE9ORyAgICAgICAgIElkeDsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlVQ0hBUgkJCUNlbnRyYWxDaGFubmVsOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKKwlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCXBWSUUtPkxlbmd0aCA9IDA7CisgICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisKKwlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKKwkJCQkJCQkJRWxlbS0+TXNnLAorCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCQkJCUFkZHIyLAorCQkJCQkJCQlCc3NpZCwKKwkJCQkJCQkJU3NpZCwKKwkJCQkJCQkJJlNzaWRMZW4sCisJCQkJCQkJCSZCc3NUeXBlLAorCQkJCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkJCQkmQ2hhbm5lbCwKKwkJCQkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCQkJCSZUaW1lU3RhbXAsCisJCQkJCQkJCSZDZiwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJLy8gRGlzcXVhbGlmeSAxMWIgb25seSBhZGhvYyB3aGVuIHdlIGFyZSBpbiAxMWcgb25seSBhZGhvYyBtb2RlCisJCWlmICgoQnNzVHlwZSA9PSBCU1NfQURIT0MpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuKTwgMTIpKQorCQkJcmV0dXJuOworCisJCS8vIEJFQUNPTiBmcm9tIGRlc2lyZWQgQlNTL0lCU1MgZm91bmQuIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlY2lkZSBtb3N0CisJCS8vIEJTUyBwYXJhbWV0ZXJzIGhlcmUuCisJCS8vIFEuIEJ1dCB3aGF0IGhhcHBlbiBpZiB0aGlzIEpPSU4gZG9lc24ndCBjb25jbHVkZSBhIHN1Y2Nlc3NmdWwgQVNTT0NJQVRFSU9OPworCQkvLyAgICBEbyB3ZSBuZWVkIHRvIHJlY2VvdmVyIGJhY2sgYWxsIHBhcmFtZXRlcnMgYmVsb25naW5nIHRvIHByZXZpb3VzIEJTUz8KKwkJLy8gQS4gU2hvdWxkIGJlIG5vdC4gVGhlcmUncyBubyBiYWNrLWRvb3IgcmVjb3ZlciB0byBwcmV2aW91cyBBUC4gSXQgc3RpbGwgbmVlZAorCQkvLyAgICBhIG5ldyBKT0lOLUFVVEgtQVNTT0Mgc2VxdWVuY2UuCisJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIHJlY2VpdmUgZGVzaXJlZCBCRUFDT04gYXQgSm9pbldhaXRCZWFjb24uLi4gQ2hhbm5lbCA9ICVkXG4iLCBDaGFubmVsKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkJLy8gVXBkYXRlIFJTU0kgdG8gcHJldmVudCBObyBzaWduYWwgZGlzcGxheSB3aGVuIGNhcmRzIGZpcnN0IGluaXRpYWxpemVkCisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMAk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMik7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIDw8IDM7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxIDw8IDM7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyIDw8IDM7CisKKwkJCS8vCisJCQkvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIFNTSUQgb25seSBzZXQgdG8gYW55LCB0aGVuIHdlIGNhbiByZWNvcmQgdGhlIGN1cnJlbnQgU1NJRC4KKwkJCS8vIE90aGVyd2lzZSB3aWxsIGNhdXNlIGhpZGRlbiBTU0lEIGFzc29jaWF0aW9uIGZhaWxlZC4KKwkJCS8vCisJCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRMZW4gPT0gMCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7CisJCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBDaGFubmVsKTsKKworCQkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCQl7CisJCQkJCS8vCisJCQkJCS8vIE11bHRpcGxlIFNTSUQgY2FzZSwgdXNlZCBjb3JyZWN0IENhcGFiaWxpdHlJbmZvCisJCQkJCS8vCisJCQkJCUNhcGFiaWxpdHlJbmZvID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uQ2FwYWJpbGl0eUluZm87CisJCQkJfQorCQkJfQorCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQnNzVHlwZTsKKwkJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7CisJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IENoYW5uZWw7CisJCQlwQWQtPk1sbWVBdXguQXRpbVdpbiA9IEF0aW1XaW47CisJCQlwQWQtPk1sbWVBdXguQ2ZwUGVyaW9kID0gQ2YuQ2ZwUGVyaW9kOworCQkJcEFkLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uID0gQ2YuQ2ZwTWF4RHVyYXRpb247CisJCQlwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSA9IFJhbGlua0llOworCisJCQkvLyBDb3B5IEFQJ3Mgc3VwcG9ydGVkIHJhdGUgdG8gTWxtZUF1eCBmb3IgY3JlYXRpbmcgYXNzb2ljYXRpb24gcmVxdWVzdAorCQkJLy8gQWxzbyBmaWx0ZXIgb3V0IG5vdCBzdXBwb3J0ZWQgcmF0ZQorCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKwkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbik7CisKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCAxNik7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IE5ld0V4dENoYW5uZWxPZmZzZXQ7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gSHRDYXBhYmlsaXR5TGVuOworCisJCQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCBodCByYXRlcworCQkJaWYgKCgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQl7CisJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKyAgIAkJCQlSVE1QTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7CisKKwkJCQkvLyBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IHN0b3JlcyBQZWVyIEFQJ3MgMTFuIFJ4IGNhcGFiaWxpdHkKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgSHRDYXBhYmlsaXR5Lk1DU1NldCwgMTYpOworCQkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOworCQkJCWlmIChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkKKwkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID0gVFJVRTsKKwkJCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsICZIdENhcGFiaWxpdHksICZBZGRIdEluZm8pOworCQkJCS8vIENvcHkgQVAgUGFyYW1ldGVyIHRvIFN0YUFjdGl2ZS4gIFRoaXMgaXMgYWxzbyBpbiBMaW5rVXAuCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiEgKE1wZHVEZW5zaXR5PSVkLCBNYXhSQW1wZHVGYWN0b3I9JWQsIEJXPSVkKVxuIiwKKwkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTXBkdURlbnNpdHksIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciwgSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpKTsKKworCQkJCWlmIChBZGRIdEluZm9MZW4gPiAwKQorCQkJCXsKKwkJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47CisJCSAJCQkvLyBDaGVjayBhZ2FpbiB0aGUgQmFuZHdpZHRoIGNhcGFiaWxpdHkgb2YgdGhpcyBBUC4KKwkJIAkJCWlmICgoQWRkSHRJbmZvLkNvbnRyb2xDaGFuID4gMikmJiAoQWRkSHRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykgJiYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkJIAkJCXsKKwkJIAkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbiAtIDI7CisJCSAJCQl9CisJCSAJCQllbHNlIGlmICgoQWRkSHRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkJIAkJCXsKKwkJIAkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbiArIDI7CisJCSAJCQl9CisKKwkJCQkJLy8gQ2hlY2sgRXJyb3IgLgorCQkJCQlpZiAocEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsICE9IENlbnRyYWxDaGFubmVsKQorCQkgCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+QmVhY29uIENlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZC4gTWxtZWF1eCBDZW50cmFsQ2hhbm5lbCA9ICVkXG4iLCBDZW50cmFsQ2hhbm5lbCwgQWRkSHRJbmZvLkNvbnRyb2xDaGFuLCBwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwpKTsKKworCQkgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5DZW50cmFsIENoYW5uZWwgPSAlZCwgQ29udHJvbCBDaGFubmVsID0gJWQsICAuXG4iLCBDZW50cmFsQ2hhbm5lbCwgQWRkSHRJbmZvLkNvbnRyb2xDaGFuKSk7CisKKwkJCQl9CisKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsKKyAgIAkJCQkvLyBUbyBwcmV2ZW50IGVycm9yLCBsZXQgbGVnYWN5IEFQIG11c3QgaGF2ZSBzYW1lIENlbnRyYWxDaGFubmVsIGFuZCBDaGFubmVsLgorCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuID09IDApICYmIChQcmVOSHRDYXBhYmlsaXR5TGVuID09IDApKQorCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPk1sbWVBdXguQ2hhbm5lbDsKKworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7CisJCQl9CisKKwkJCVJUTVBVcGRhdGVNbG1lUmF0ZShwQWQpOworCisJCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCSkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sICZFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIGFmdGVyIEpPSU4sIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWRcbiIsCisJCQkJCQkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7CisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vIFVwZGF0ZSBDa2lwRmxhZworCQkJcEFkLT5TdGFDZmcuQ2tpcEZsYWcgPSBDa2lwRmxhZzsKKworCQkJLy8gS2VlcCBUaW1lU3RhbXAgZm9yIFJlLUFzc29jaWF0aW9uIHVzZWQuCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJCXBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXAgPSBUaW1lU3RhbXA7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKKwkJCXsKKwkJCQkvL1dlIG5lZWQgdG8gY2hhbmdlIG91ciBUeFBvd2VyIGZvciBDQ1ggMi4wIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCisJCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisJCQl9CisJCQllbHNlICAvL1VzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZS4KKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCisJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKwkJLy8gbm90IHRvIG1lIEJFQUNPTiwgaWdub3JlZAorCX0KKwkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlyZWNlaXZlIEJFQUNPTiBmcm9tIHBlZXIKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQmVhY29uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJQ0ZfUEFSTSAgICAgICBDZlBhcm07CisJVUNIQVIgICAgICAgICBTc2lkTGVuLCBNZXNzYWdlVG9NZT0wLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLCBpbmRleD0wOworCVVDSEFSICAgICAgICAgRHRpbUNvdW50PTAsIER0aW1QZXJpb2Q9MCwgQmNhc3RGbGFnPTA7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgQXRpbVdpbiwgQmVhY29uUGVyaW9kOworCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOworCVVTSE9SVCAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcDsKKwlVQ0hBUiAgICAgICAgIEVycDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCVVDSEFSCQkgIENraXBGbGFnOworCVVTSE9SVCAgICAgICAgTGVuVklFOworCVVDSEFSCQkgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKKwlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07CisJUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOworCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKKwlVTE9ORyAgICAgICAgICAgUmFsaW5rSWU7CisJLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLCBQcmVOSHRDYXBhYmlsaXR5TGVuOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisKKworI2lmZGVmIFJBTElOS19BVEUKKyAgICBpZiAoQVRFX09OKHBBZCkpCisgICAgeworCQlyZXR1cm47CisgICAgfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCWlmICghKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQorCQkpKQorCQlyZXR1cm47CisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKyAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKwlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKKwkJCQkJCQkJRWxlbS0+TXNnLAorCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCQkJCUFkZHIyLAorCQkJCQkJCQlCc3NpZCwKKwkJCQkJCQkJU3NpZCwKKwkJCQkJCQkJJlNzaWRMZW4sCisJCQkJCQkJCSZCc3NUeXBlLAorCQkJCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkJCQkmQ2hhbm5lbCwKKwkJCQkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCQkJCSZUaW1lU3RhbXAsCisJCQkJCQkJCSZDZlBhcm0sCisJCQkJCQkJCSZBdGltV2luLAorCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJCSZFcnAsCisJCQkJCQkJCSZEdGltQ291bnQsCisJCQkJCQkJCSZEdGltUGVyaW9kLAorCQkJCQkJCQkmQmNhc3RGbGFnLAorCQkJCQkJCQkmTWVzc2FnZVRvTWUsCisJCQkJCQkJCVN1cFJhdGUsCisJCQkJCQkJCSZTdXBSYXRlTGVuLAorCQkJCQkJCQlFeHRSYXRlLAorCQkJCQkJCQkmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkNraXBGbGFnLAorCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCQkJCQkmRWRjYVBhcm0sCisJCQkJCQkJCSZRYnNzTG9hZCwKKwkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJCSZSYWxpbmtJZSwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZIdENhcGFiaWxpdHksCisJCQkJCQkJCSZBZGRIdEluZm9MZW4sCisJCQkJCQkJCSZBZGRIdEluZm8sCisJCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCQkmTGVuVklFLAorCQkJCQkJCQlwVklFKSkKKwl7CisJCUJPT0xFQU4gaXNfbXlfYnNzaWQsIGlzX215X3NzaWQ7CisJCVVMT05HICAgQnNzaWR4LCBOb3c7CisJCUJTU19FTlRSWSAqcEJzczsKKwkJQ0hBUgkJUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOworCisJCWlzX215X2Jzc2lkID0gTUFDX0FERFJfRVFVQUwoQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKT8gVFJVRSA6IEZBTFNFOworCQlpc19teV9zc2lkID0gU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKT8gVFJVRTpGQUxTRTsKKworCisJCS8vIGlnbm9yZSBCRUFDT04gbm90IGZvciBteSBTU0lECisJCWlmICgoISBpc19teV9zc2lkKSAmJiAoISBpc19teV9ic3NpZCkpCisJCQlyZXR1cm47CisKKwkJLy8gSXQgbWVhbnMgU1RBIHdhaXRzIGRpc2Fzc29jIGNvbXBsZXRlbHkgZnJvbSB0aGlzIEFQLCBpZ25vcmVzIHRoaXMgYmVhY29uLgorCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX1dBSVRfRElTQVNTT0MpCisJCQlyZXR1cm47CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gQ29weSBDb250cm9sIGNoYW5uZWwgZm9yIHRoaXMgQlNTSUQuCisJCWlmIChBZGRIdEluZm9MZW4gIT0gMCkKKwkJCUNoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47CisKKwkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQorCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJLy8KKwkJLy8gSG91c2VrZWVwaW5nICJTc2lkQnNzVGFiIiB0YWJsZSBmb3IgbGF0ZXItb24gUk9BTWluZyB1c2FnZS4KKwkJLy8KKwkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCS8vIGRpc2NvdmVyIG5ldyBBUCBvZiB0aGlzIG5ldHdvcmssIGNyZWF0ZSBCU1MgZW50cnkKKwkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAorCQkJCQkJJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sQWRkSHRJbmZvTGVuLE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsCisJCQkJCQlSZWFsUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCSZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKwkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgLy8gcmV0dXJuIGlmIEJTUyB0YWJsZSBmdWxsCisJCQkJcmV0dXJuOworCisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKworCisKKwkJfQorCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCisJCXsKKwkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KKwkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7CisJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKworCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKKwkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCisJCQkJeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwgTmV3Q2hhbm5lbCkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQkJeworCQkJCURCR1BSSU5UX0VSUigoIlBlZXJCZWFjb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSkpOworCQkJfQorCQl9CisKKwkJLy8gaWYgdGhlIHNzaWQgbWF0Y2hlZCAmIGJzc2lkIHVubWF0Y2hlZCwgd2Ugc2hvdWxkIHNlbGVjdCB0aGUgYnNzaWQgd2l0aCBsYXJnZSB2YWx1ZS4KKwkJLy8gVGhpcyBtaWdodCBoYXBwZW5lZCB3aGVuIHR3byBTVEEgc3RhcnQgYXQgdGhlIHNhbWUgdGltZQorCQlpZiAoKCEgaXNfbXlfYnNzaWQpICYmIEFESE9DX09OKHBBZCkpCisJCXsKKwkJCUlOVAlpOworCisJCQkvLyBBZGQgdGhlIHNhZmVndWFyZCBhZ2FpbnN0IHRoZSBtaXNtYXRjaCBvZiBhZGhvYyB3ZXAgc3RhdHVzCisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLldlcFN0YXR1cykKKwkJCXsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIGNvbGxhcHNlIGludG8gdGhlIEFESE9DIG5ldHdvcmsgd2hpY2ggaGFzIGJpZ2dlciBCU1NJRCB2YWx1ZS4KKwkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl7CisJCQkJaWYgKEJzc2lkW2ldID4gcEFkLT5Db21tb25DZmcuQnNzaWRbaV0pCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gbWVyZ2UgdG8gdGhlIElCU1Mgd2l0aCBiaWdnZXIgQlNTSUQ9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQlCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisJCQkJCUFzaWNEaXNhYmxlU3luYyhwQWQpOworCQkJCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBCc3NpZCk7CisJCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSBCRUFDT04gZnJhbWUgdG8gb24tY2hpcCBtZW1vcnkKKwkJCQkJaXNfbXlfYnNzaWQgPSBUUlVFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoQnNzaWRbaV0gPCBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF07CisJCXBCc3MtPlJzc2kgPSBSZWFsUnNzaTsgICAgICAgLy8gbGFzdGVzdCBSU1NJCisJCXBCc3MtPkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKKworCQkvLworCQkvLyBCRUFDT04gZnJvbSBteSBCU1NJRCAtIGVpdGhlciBJQlNTIG9yIElORlJBIG5ldHdvcmsKKwkJLy8KKwkJaWYgKGlzX215X2Jzc2lkKQorCQl7CisJCQlSWFdJX1NUUlVDCVJ4V0k7CisKKwkJCXBBZC0+U3RhQ2ZnLkR0aW1Db3VudCA9IER0aW1Db3VudDsKKwkJCXBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2QgPSBEdGltUGVyaW9kOworCQkJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKKworCisJCQlSeFdJLlJTU0kwID0gRWxlbS0+UnNzaTA7CisJCQlSeFdJLlJTU0kxID0gRWxlbS0+UnNzaTE7CisJCQlSeFdJLlJTU0kyID0gRWxlbS0+UnNzaTI7CisKKwkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCAmUnhXSSk7CisJCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBXZSBnZXQgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiByZXF1aXJlZAorCQkJCS8vIENoYW5nZWQgdG8gYXBwcm9wcmlhdGUgVHhQb3dlciBMaW1pdCBmb3IgQ2lzbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMKKwkJCQkvLworCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vCisJCQkJLy8gQWlyb25ldENlbGxQb3dlckxpbWl0IGVxdWFsIHRvIDB4RkYgbWVhbnMgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiBub3QgZXhpc3QuCisJCQkJLy8gVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLCB0aGF0IHNldCBmcm9tIFVJLgorCQkJCS8vCisJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJCX0KKworCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKENBUF9JU19JQlNTX09OKENhcGFiaWxpdHlJbmZvKSkpCisJCQl7CisJCQkJVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKKwkJCQlVQ0hBUgkJCWlkeDsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCQkJCS8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCisJCQkgICAgZm9yIChpZHg9MDsgaWR4PFN1cFJhdGVMZW47IGlkeCsrKQorCQkJICAgIHsKKwkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwUmF0ZVtpZHhdICYgMHg3ZikpCisJCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwUmF0ZVtpZHhdICYgMHg3ZjsKKwkJCSAgICB9CisKKwkJCQlmb3IgKGlkeD0wOyBpZHg8RXh0UmF0ZUxlbjsgaWR4KyspCisJCQkgICAgeworCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChFeHRSYXRlW2lkeF0gJiAweDdmKSkKKwkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBFeHRSYXRlW2lkeF0gJiAweDdmOworCQkJICAgIH0KKworCQkJCS8vIGxvb2sgdXAgdGhlIGV4aXN0aW5nIHRhYmxlCisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBBZGRyMik7CisKKwkJCQkvLyBBZC1ob2MgbW9kZSBpcyB1c2luZyBNQUMgYWRkcmVzcyBhcyBCQSBzZXNzaW9uLiBTbyB3ZSBuZWVkIHRvIGNvbnRpbnVvdXNseSBmaW5kIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uIGJ5IHJlY2VpdmluZyBiZWFjb24uCisJCQkJLy8gVG8gcHJldmVudCBhbHdheXMgY2hlY2sgdGhpcywgd2UgdXNlIHdjaWQgPT0gUkVTRVJWRURfV0NJRCB0byByZWNvZ25pemUgaXQgYXMgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24uCisJCQkJaWYgKChBREhPQ19PTihwQWQpICYmIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKSB8fAorCQkJCQkocEVudHJ5ICYmICgocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRSkgPCBOb3cpKSkKKwkJCQl7CisJCQkJCWlmIChwRW50cnkgPT0gTlVMTCkKKwkJCQkJCS8vIEFub3RoZXIgYWRob2Mgam9pbmluZywgYWRkIHRvIG91ciBNQUMgdGFibGUuCisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgQWRkcjIsIEJTUzAsIEZBTFNFKTsKKworCQkJCQlpZiAoU3RhQWRkTWFjVGFibGVFbnRyeShwQWQsIHBFbnRyeSwgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBDYXBhYmlsaXR5SW5mbykgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DIC0gQWRkIEVudHJ5IGZhaWxlZC5cbiIpKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCisJCQkJCWlmIChwRW50cnkgJiYKKwkJCQkJCShFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKQorCQkJCQl7CisJCQkJCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQkJCQlSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgQlNTMCwgaWR4LCBwRW50cnkpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNDTEkpCisJCQkJCXBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKKworCQkJCS8vIEF0IGxlYXN0IGFub3RoZXIgcGVlciBpbiB0aGlzIElCU1MsIGRlY2xhcmUgTWVkaWFTdGF0ZSBhcyBDT05ORUNURUQKKwkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQl7CisJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCisJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkJCQkJLy8gMjAwMy8wMy8xMiAtIGpvaG4KKwkJCQkJLy8gTWFrZSBzdXJlIHRoaXMgZW50cnkgaW4gIlNjYW5UYWIiIHRhYmxlLCB0aHVzIGNvbXBsaWVzIHRvIE1pY3Jvc29mdCdzIHBvbGljeSB0aGF0CisJCQkJCS8vICJzaXRlIHN1cnZleSIgcmVzdWx0IHNob3VsZCBhbHdheXMgaW5jbHVkZSB0aGUgY3VycmVudCBjb25uZWN0ZWQgbmV0d29yay4KKwkJCQkJLy8KKwkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOworCQkJCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCQkJCXsKKwkJCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJCQkJJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICZIdENhcGFiaWxpdHksCisJCQkJCQkJCQkmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUmVhbFJzc2ksIFRpbWVTdGFtcCwgMCwKKwkJCQkJCQkJCSZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKwkJCQkJfQorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQuXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCQlCT09MRUFOIGJVc2VTaG9ydFNsb3QsIGJVc2VCR1Byb3RlY3Rpb247CisKKwkJCQkvLyBkZWNpZGUgdG8gdXNlL2NoYW5nZSB0byAtCisJCQkJLy8gICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lCisJCQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCisJCQkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCisJCQkJLy9iVXNlU2hvcnRTbG90ID0gcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgJiYgQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOworCQkJCWJVc2VTaG9ydFNsb3QgPSBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7CisJCQkJaWYgKGJVc2VTaG9ydFNsb3QgIT0gT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpCisJCQkJCUFzaWNTZXRTbG90VGltZShwQWQsIGJVc2VTaG9ydFNsb3QpOworCisJCQkJYlVzZUJHUHJvdGVjdGlvbiA9IChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMSkgfHwgICAgLy8gYWx3YXlzIHVzZQorCQkJCQkJCQkgICAoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAwKSAmJiBFUlBfSVNfVVNFX1BST1RFQ1RJT04oRXJwKSk7CisKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAvLyBhbHdheXMgbm8gQkcgcHJvdGVjdGlvbiBpbiBBLWJhbmQuIGZhbHNlbHkgaGFwcGVuZWQgd2hlbiBzd2l0Y2hpbmcgQS9HIGJhbmQgdG8gYSBkdWFsLWJhbmQgQVAKKwkJCQkJYlVzZUJHUHJvdGVjdGlvbiA9IEZBTFNFOworCisJCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24gIT0gT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCisJCQkJeworCQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbikKKwkJCQkJeworCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxGQUxTRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksVFJVRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7CisJCQkJCX0KKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIEIvRyBwcm90ZWN0aW9uIHRvICVkXG4iLCBiVXNlQkdQcm90ZWN0aW9uKSk7CisJCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJLy8gY2hlY2sgSHQgcHJvdGVjdGlvbiBtb2RlLiBhbmQgYWRoZXJlIHRvIHRoZSBOb24tR0YgZGV2aWNlIGluZGljYXRpb24gYnkgQVAuCisJCQkJaWYgKChBZGRIdEluZm9MZW4gIT0gMCkgJiYKKwkJCQkJKChBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgIT0gcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSkgfHwKKwkJCQkJKEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KSkpCisJCQkJeworCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OworCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOworCQkJCQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQorCQkJCXsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZWQgTiBPcGVyYWlvbk1vZGUgdG8gJWRcbiIsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpKTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpICYmCisJCQkJCUVSUF9JU19VU0VfQkFSS0VSX1BSRUFNQkxFKEVycCkpCisJCQkJeworCQkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGZvcmNlZCB0byB1c2UgTE9ORyBwcmVhbWJsZVxuIikpOworCQkJCX0KKworCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICAgICYmCisJCQkJCShFZGNhUGFybS5iVmFsaWQgPT0gVFJVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisJCQkJCShFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgIT0gcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZSBFRENBIHBhcmFtZXRlcnMoZnJvbSAlZCB0byAlZClcbiIsCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCwKKwkJCQkJCUVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpOworCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmRWRjYVBhcm0pOworCQkJCX0KKworCQkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCX0KKworCQkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIHN1cHBvcnQgcG93ZXItc2F2aW5nIGZlYXR1cmUKKwkJCWlmICgoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKQorCQkJeworCQkJCVVDSEFSIEZyZWVOdW1iZXI7CisJCQkJLy8gIDEuIEFQIGhhcyBiYWNrbG9nZ2VkIHVuaWNhc3QtdG8tbWUgZnJhbWUsIHN0YXkgQVdBS0UsIHNlbmQgUFNQT0xMCisJCQkJLy8gIDIuIEFQIGhhcyBiYWNrbG9nZ2VkIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWUgYW5kIHdlIHdhbnQgdGhvc2UgZnJhbWVzLCBzdGF5IEFXQUtFCisJCQkJLy8gIDMuIHdlIGhhdmUgb3V0Z29pbmcgZnJhbWVzIGluIFR4UmluZyBvciBNZ210UmluZywgYmV0dGVyIHN0YXkgQVdBS0UKKwkJCQkvLyAgNC4gUHNtIGNoYW5nZSB0byBQV1JfU0FWRSwgYnV0IEFQIG5vdCBiZWVuIGluZm9ybWVkIHlldCwgd2UgYmV0dGVyIHN0YXkgQVdBS0UKKwkJCQkvLyAgNS4gb3RoZXJ3aXNlLCBwdXQgUEhZIGJhY2sgdG8gc2xlZXAgdG8gc2F2ZSBiYXR0ZXJ5LgorCQkJCWlmIChNZXNzYWdlVG9NZSkKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUgJiYKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSA9IFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpOworCQkJCX0KKwkJCQllbHNlIGlmIChCY2FzdEZsYWcgJiYgKER0aW1Db3VudCA9PSAwKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkpCisJCQkJeworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJfHwKKwkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKKwkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKKwkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfQkssIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX1ZJLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVk8sIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9NR01ULCBNR01UX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKKwkJCQl7CisJCQkJCS8vIFRPRE86IGNvbnNpZGVyIHNjaGVkdWxlZCBIQ0NBLiBtaWdodCBub3QgYmUgcHJvcGVyIHRvIHVzZSB0cmFkaXRpb25hbCBEVElNLWJhc2VkIHBvd2VyLXNhdmluZyBzY2hlbWUKKwkJCQkJLy8gY2FuIHdlIGNoZWF0IGhlcmUgKGkuZS4ganVzdCBjaGVjayBNR01UICYgQUNfQkUpIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2U/CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVVTSE9SVCBOZXh0RHRpbSA9IER0aW1Db3VudDsKKworCQkJCQlpZiAoTmV4dER0aW0gPT0gMCkKKwkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKKworCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQorCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOworCisJCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCQkJeworCQkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdAorCX0KKwkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZWNlaXZlIFBST0JFIFJFUSBmcm9tIHJlbW90ZSBwZWVyIHdoZW4gb3BlcmF0aW5nIGluIElCU1MgbW9kZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVUNIQVIgICAgICAgICBTc2lkTGVuOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkgIEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUhFQURFUl84MDJfMTEgUHJvYmVSc3BIZHI7CisJTkRJU19TVEFUVVMgICBOU3RhdHVzOworCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOworCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKKwlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAwfTsKKwlCT09MRUFOICAgICAgIFByaXZhY3k7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUgkJICBSU05JZSA9IElFX1dQQTsKKworCWlmICghIEFESE9DX09OKHBBZCkpCisJCXJldHVybjsKKworCWlmIChQZWVyUHJvYmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsIFNzaWQsICZTc2lkTGVuKSkKKwl7CisJCWlmICgoU3NpZExlbiA9PSAwKSB8fCBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKQorCQl7CisJCQkvLyBhbGxvY2F0ZSBhbmQgc2VuZCBvdXQgUHJvYmVSc3AgZnJhbWUKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJLy9wQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PworCisJCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAorCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCQkJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICZQcm9iZVJzcEhkciwKKwkJCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKKwkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQlpZiAocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbikKKwkJCXsKKwkJCQlVTE9ORyB0bXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKKwkJCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKworCQkJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJeworCQkJCVVMT05HIHRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAJJnRtcCwKKwkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCisJCQkJCQkgIAkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICAJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJVUxPTkcgVG1wTGVuOworCQkJCVVDSEFSCUJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisJCQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKKwkJCQlBZGRIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworCQkJCU5ld0V4dExlbiA9IDE7CisJCQkJLy9OZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZQorCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCisJCQkJeworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdEluZm9JZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0TGVuLAorCQkJCQkJCQkgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dENoYW5JZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dExlbiwKKwkJCQkJCQkJIHNpemVvZihORVdfRVhUX0NIQU5fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJfQorCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKworVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uXG4iKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNjYW4gdGltZW91dCBwcm9jZWR1cmUuIGJhc2ljYWxseSBhZGQgY2hhbm5lbCBpbmRleCBieSAxIGFuZCByZXNjYW4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IE5leHRDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisJLy8gT25seSBvbmUgY2hhbm5lbCBzY2FubmVkIGZvciBDSVNDTyBiZWFjb24gcmVxdWVzdAorCWlmICgocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOworCisJLy8gdGhpcyByb3V0aW5lIHdpbGwgc3RvcCBpZiBwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwCisJU2Nhbk5leHRDaGFubmVsKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFZTkMgLSBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5TdGFydChzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVBzUG9sbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyNpZmRlZiBSQUxJTktfQVRFCisgICAgaWYgKEFURV9PTihwQWQpKQorICAgIHsKKwkJcmV0dXJuOworICAgIH0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorICAgIAlwQWQtPlBzUG9sbEZyYW1lLkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIChQVUNIQVIpJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5ESVNfU1RBVFVTICAgICBOU3RhdGU7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXI7CisJVUxPTkcgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmb3JjZSBvdXQgYSBQcm9iZVJlcXVlc3QgLi4uXG4iKSk7CisKKwlOU3RhdGUgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0ZSA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CisKKwkJLy8gdGhpcyBQcm9iZVJlcXVlc3QgZXhwbGljaXRseSBzcGVjaWZ5IFNTSUQgdG8gcmVkdWNlIHVud2FudGVkIFByb2JlUmVzcG9uc2UKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgJkhkcjgwMjExLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCX0KKworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJCUVDaGFubmVsWzExXTsKKwlVQ0hBUgkJaSwgaiwgazsKKwlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKKworCVJUTVBaZXJvTWVtb3J5KEVDaGFubmVsLCAxMSk7CisJaSA9IDA7CisJLy8gRmluZCB1cHBlciBjaGFubmVsIGFuZCBsb3dlciBjaGFubmVsLgorCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlMb3dlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisJCUxvd2VyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorCWVsc2UKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBiZWxvdyBsb3dlciBjaGFubmVsLi4KKwlpZiAoTG93ZXJDaGFubmVsID4gMSkKKwl7CisJCUVDaGFubmVsWzBdID0gTG93ZXJDaGFubmVsIC0gMTsKKwkJaSA9IDE7CisJCWlmIChMb3dlckNoYW5uZWwgPiAyKQorCQl7CisJCQlFQ2hhbm5lbFsxXSA9IExvd2VyQ2hhbm5lbCAtIDI7CisJCQlpID0gMjsKKwkJCWlmIChMb3dlckNoYW5uZWwgPiAzKQorCQkJeworCQkJCUVDaGFubmVsWzJdID0gTG93ZXJDaGFubmVsIC0gMzsKKwkJCQlpID0gMzsKKwkJCX0KKwkJfQorCX0KKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBiZXR3ZWVuICBsb3dlciBjaGFubmVsIGFuZCB1cHBlciBjaGFubmVsLgorCWZvciAoayA9IExvd2VyQ2hhbm5lbDtrIDwgVXBwZXJDaGFubmVsO2srKykKKwl7CisJCUVDaGFubmVsW2ldID0gazsKKwkJaSsrOworCX0KKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBhYm92ZSB1cHBlciBjaGFubmVsLi4KKwlpZiAoTG93ZXJDaGFubmVsIDwgMTEpCisJeworCQlFQ2hhbm5lbFtpXSA9IFVwcGVyQ2hhbm5lbCArIDE7CisJCWkrKzsKKwkJaWYgKExvd2VyQ2hhbm5lbCA8IDEwKQorCQl7CisJCQlFQ2hhbm5lbFtpXSA9IExvd2VyQ2hhbm5lbCArIDI7CisJCQlpKys7CisJCQlpZiAoTG93ZXJDaGFubmVsIDwgOSkKKwkJCXsKKwkJCQlFQ2hhbm5lbFtpXSA9IExvd2VyQ2hhbm5lbCArIDM7CisJCQkJaSsrOworCQkJfQorCQl9CisJfQorCS8vCisJZm9yIChqID0gMDtqIDwgaTtqKyspCisJeworCQlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKKwkJeworCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBFQ2hhbm5lbFtqXSkKKwkJCXsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2tdLmJFZmZlY3RlZENoYW5uZWwgPSBUUlVFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiIEVmZmVjdGVkQ2hhbm5lbCggPSVkKVxuIiwgRUNoYW5uZWxbal0pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0JPT0xFQU4gU2NhblJ1bm5pbmcoCisJCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiAocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTQ0FOX0xJU1RFTikgPyBUUlVFIDogRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvd3BhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyNmRjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3dwYS5jCkBAIC0wLDAgKzEsMjEwNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCisJUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2RlZmluZQkJV1BBUlNOSUUJMHhkZAorI2RlZmluZQkJV1BBMlJTTklFCTB4MzAKKworLy9leHRlcm4gVUNIQVIgQklUOFtdOworVUNIQVIJQ2lwaGVyV3BhUHNrVGtpcFtdID0geworCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJXcGFQc2tUa2lwTGVuID0gKHNpemVvZihDaXBoZXJXcGFQc2tUa2lwKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJXcGFQc2tBZXNbXSA9IHsKKwkJMHhERCwgMHgxNiwgCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMgkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyV3BhUHNrQWVzTGVuID0gKHNpemVvZihDaXBoZXJXcGFQc2tBZXMpIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNW10gPSB7CisJCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLCAvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVpY2FzdAorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCAgLy8gQXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNpc2NvQ0NLTSkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNFtdID0geworCQkweERELCAweDE4LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwgLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1aWNhc3QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsCisJCTB4MjgsIDB4MDAvLyBBdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0TGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0KSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZUNDWFRraXBbXSA9IHsKKwkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNDWFRraXApIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNDWF9MTENfSERSW10gPSB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMn07CitVQ0hBUglMTENfTk9STUFMW10gPSB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07CisKK1VDSEFSCUVBUE9MX0ZSQU1FW10gPSB7MHg4OCwgMHg4RX07CisKK0JPT0xFQU4gQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KTsKKwordm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDbGFzc2lmeSBXUEEgRUFQIG1lc3NhZ2UgdHlwZQorCisJQXJndW1lbnRzOgorCQlFQVBUeXBlCQlWYWx1ZSBvZiBFQVAgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUJCUludGVybmFsIE1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgTUxNRSBzdGF0ZSBtYWNoaW5lCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJCUZvdW5kIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQorCQlGQUxTRQkJTm8gYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCUFsbCB0aGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gd3BhLmgKKwkJRm9yIHN1cHBsaWNhbnQsIHRoZXJlIGlzIG9ubHkgRUFQT0wgS2V5IG1lc3NhZ2UgYXZhbGlhYmxlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVdwYU1zZ1R5cGVTdWJzdCgKKwlJTglVQ0hBUglFQVBUeXBlLAorCU9VVAlJTlQJCSpNc2dUeXBlKQoreworCXN3aXRjaCAoRUFQVHlwZSkKKwl7CisJCWNhc2UgRUFQUGFja2V0OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQUGFja2V0OworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xTdGFydDoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MU3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTExvZ29mZjoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MTG9nb2ZmOworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xLZXk6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEtleTsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MQVNGQWxlcnQ6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEFTRkFsZXJ0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgV3BhUHNrU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglTVEFURV9NQUNISU5FICpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfV1BBX1BTS19TVEFURSwgTUFYX1dQQV9QU0tfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFdQQV9QU0tfSURMRSwgV1BBX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QU0tfSURMRSwgTVQyX0VBUE9MS2V5LCAoU1RBVEVfTUFDSElORV9GVU5DKVdwYUVBUE9MS2V5QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQorCit7CisJSU5UICAgICAgICAgICAgIE1zZ1R5cGUgPSBFQVBPTF9NU0dfSU5WQUxJRDsKKwlQS0VZX0RFU0NSSVBURVIgcEtleURlc2M7CisJUEhFQURFUl84MDJfMTEgIHBIZWFkZXI7IC8vcmVkCisJVUNIQVIgICAgICAgICAgIFplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIgRWFwb2xWcjsKKwlLRVlfSU5GTwkJcGVlcktleUluZm87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0tLT4gV3BhRUFQT0xLZXlBY3Rpb25cbiIpKTsKKworCS8vIEdldCA4MDIuMTEgaGVhZGVyIGZpcnN0CisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gR2V0IEVBUG9MLUtleSBEZXNjcmlwdG9yCisJcEtleURlc2MgPSAoUEtFWV9ERVNDUklQVEVSKSAmRWxlbS0+TXNnWyhMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCldOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwS2V5RGVzYy0+S2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQgKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSk7CisKKworCS8vIDEuIENoZWNrIEVBUE9MIGZyYW1lIHZlcnNpb24gYW5kIHR5cGUKKwlFYXBvbFZyCT0gKFVDSEFSKSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMStMRU5HVEhfODAyXzFfSF07CisKKyAgICBpZiAoKChFYXBvbFZyICE9IEVBUE9MX1ZFUikgJiYgKEVhcG9sVnIgIT0gRUFQT0xfVkVSMikpIHx8ICgocEtleURlc2MtPlR5cGUgIT0gV1BBMV9LRVlfREVTQykgJiYgKHBLZXlEZXNjLT5UeXBlICE9IFdQQTJfS0VZX0RFU0MpKSkKKwl7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIGRvZXMgbm90IG1hdGNoIHdpdGggV1BBIHJ1bGVcbiIpKTsKKwkJCXJldHVybjsKKwl9CisKKwkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlcgorCS8vIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIKKwlOZGlzWmVyb01lbW9yeShaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCWlmKChSVE1QQ29tcGFyZU1lbW9yeShwS2V5RGVzYy0+UmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJKFJUTVBDb21wYXJlTWVtb3J5KHBLZXlEZXNjLT5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiAgIFJlcGxheUNvdW50ZXIgbm90IG1hdGNoICAgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcm9jZXNzIFdQQTJQU0sgZnJhbWUKKwlpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCXsKKwkJaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDApICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgMVxuIikpOworCQl9IGVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMICA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDNcbiIpKTsKKwkJfSBlbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IEdST1VQS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX0dST1VQX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgR3JvdXAgTWVzc2FnZSAxXG4iKSk7CisJCX0KKworCQkvLyBXZSB3aWxsIGFzc3VtZSBsaW5rIGlzIHVwIChhc3NvYyBzdWNlZXNzIGFuZCBwb3J0IG5vdCBzZWN1cmVkKS4KKwkJLy8gQWxsIHN0YXRlIGhhcyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHByZXZpb3VzIHN0YXRlCisJCXN3aXRjaChwQWQtPlN0YUNmZy5XcGFTdGF0ZSkKKwkJeworCQljYXNlIFNTX1NUQVJUOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9NU0dfMzoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQlXcGEyUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfR1JPVVA6CQkvLyBXaGVuIGRvaW5nIGdyb3VwIGtleSBleGNoYW5nZQorCQljYXNlIFNTX0ZJTklTSDoJCQkvLyBUaGlzIGhhcHBlbmVkIHdoZW4gdXBkYXRlIGdyb3VwIGtleQorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJICAgIC8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJICAgIC8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJCVdwYTJQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKwkJCQlXcGFHcm91cE1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX0ZJTklTSDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwkvLyBQcm9jZXNzIFdQQVBTSyBGcmFtZQorCS8vIENsYXNzaWZ5IG1lc3NhZ2UgVHlwZSwgZWl0aGVyIHBhaXJ3aXNlIG1lc3NhZ2UgMSwgMywgb3IgZ3JvdXAgbWVzc2FnZSAxIGZvciBzdXBwbGljYW50CisJZWxzZSBpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisJeworCQlpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlJbmRleCA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDFcbiIpKTsKKwkJfQorCQllbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgM1xuIikpOworCQl9CisJCWVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpICYmCisJCQkocGVlcktleUluZm8uS2V5SW5kZXggIT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9HUk9VUF9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IEdyb3VwIE1lc3NhZ2UgMVxuIikpOworCQl9CisKKwkJLy8gV2Ugd2lsbCBhc3N1bWUgbGluayBpcyB1cCAoYXNzb2Mgc3VjZWVzcyBhbmQgcG9ydCBub3Qgc2VjdXJlZCkuCisJCS8vIEFsbCBzdGF0ZSBoYXMgdG8gYmUgYWJsZSB0byBwcm9jZXNzIG1lc3NhZ2UgZnJvbSBwcmV2aW91cyBzdGF0ZQorCQlzd2l0Y2gocEFkLT5TdGFDZmcuV3BhU3RhdGUpCisJCXsKKwkJY2FzZSBTU19TVEFSVDoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9NU0dfMzoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYVBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX0dST1VQOgkJLy8gV2hlbiBkb2luZyBncm91cCBrZXkgZXhjaGFuZ2UKKwkJY2FzZSBTU19GSU5JU0g6CQkJLy8gVGhpcyBoYXBwZW5lZCB3aGVuIHVwZGF0ZSBncm91cCBrZXkKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCQkvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYVBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJCS8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQorCQkJeworCQkJCVdwYUdyb3VwTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIFdwYUVBUE9MS2V5QWN0aW9uXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFBhaXJ3aXNlIGtleSA0LXdheSBoYW5kc2hha2luZworCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhUGFpck1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJVUNIQVIJCQkJKm1wb29sLCAqUFRLLCAqZGlnZXN0OworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMTsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMjU2KTsKKworCWlmIChtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBQVEsgTGVuID0gODAuCisJUFRLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKFBUSyArIDgwLCA0KTsKKworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIFByb2Nlc3MgbWVzc2FnZSAxIGZyb20gYXV0aGVudGljYXRvcgorCXBNc2cxID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCS8vIDEuIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIHZlcmlmeSBtZXNzYWdlIDMgYW5kIGNvbnN0cnVjdCBtZXNzYWdlIDIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMS0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDIuIFNhdmUgQU5vbmNlCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMS0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIEdlbmVyYXRlIHJhbmRvbSBTTm9uY2UKKwlHZW5SYW5kb20ocEFkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlN0YUNmZy5TTm9uY2UpOworCisJLy8gQ2FsYyBQVEsoQU5vbmNlLCBTTm9uY2UpCisJV3BhQ291bnRQVEsocEFkLAorCQlwQWQtPlN0YUNmZy5QTUssCisJCXBBZC0+U3RhQ2ZnLkFOb25jZSwKKwkJcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCXBBZC0+U3RhQ2ZnLlNOb25jZSwKKwkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJUFRLLAorCQlMRU5fUFRLKTsKKworCS8vIFNhdmUga2V5IHRvIFBUSyBlbnRyeQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgUFRLLCBMRU5fUFRLKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBNZXNzYWdlIDIgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJLy8KKwkvLyBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisJLy8gMS4gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7CisJfQorCisJLy8gZmlsbCBpbiBEYXRhIE1hdGVyaWFsIGFuZCBpdHMgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXSA9IElFX1dQQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdLCBwQWQtPlN0YUNmZy5SU05fSUUsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisKKwkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAorCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIFBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV07CisKKwkvLyBVcGRhdGUgS2V5IGxlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisJLy8gMi4gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gMy4gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvL0NvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCisJLy8gNC4gRmlsbCBTTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlOb25jZSwgcEFkLT5TdGFDZmcuU05vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gNS4gS2V5IFJlcGxheSBDb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gU2VuZCBFQVBPTCgwLCAxLCAwLCAwLCAwLCBQLCAwLCBTTm9uY2UsIE1JQywgUlNOX0lFKQorCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDIKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisJCXJldHVybjsKKwl9CisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyA2LiBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CS8vIEFFUworCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsJLy8gVEtJUAorCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkvL2hleF9kdW1wKCJNSUMiLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHNlbmQgTXNnIDIgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKK1ZPSUQgV3BhMlBhaXJNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVVDSEFSCQkJCSptcG9vbCwgKlBUSywgKmRpZ2VzdDsKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzE7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAyNTYpOworCisJaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFBUSyBMZW4gPSA4MC4KKwlQVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoUFRLICsgODAsIDQpOworCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gUHJvY2VzcyBtZXNzYWdlIDEgZnJvbSBhdXRoZW50aWNhdG9yCisJCXBNc2cxID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCS8vIDEuIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIHZlcmlmeSBtZXNzYWdlIDMgYW5kIGNvbnN0cnVjdCBtZXNzYWdlIDIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMS0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDIuIFNhdmUgQU5vbmNlCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMS0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIEdlbmVyYXRlIHJhbmRvbSBTTm9uY2UKKwlHZW5SYW5kb20ocEFkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlN0YUNmZy5TTm9uY2UpOworCisJaWYocE1zZzEtPktleURlc2MuS2V5RGF0YUxlblsxXSA+IDAgKQorCXsKKwkJLy8gY2FjaGVkIFBNS0lECisJfQorCisJLy8gQ2FsYyBQVEsoQU5vbmNlLCBTTm9uY2UpCisJV3BhQ291bnRQVEsocEFkLAorCQlwQWQtPlN0YUNmZy5QTUssCisJCXBBZC0+U3RhQ2ZnLkFOb25jZSwKKwkJcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCXBBZC0+U3RhQ2ZnLlNOb25jZSwKKwkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJUFRLLAorCQlMRU5fUFRLKTsKKworCS8vIFNhdmUga2V5IHRvIFBUSyBlbnRyeQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgUFRLLCBMRU5fUFRLKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIDIgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJLy8KKwkvLyBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisKKwkvLyAxLiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOworCX0KKworCS8vIGZpbGwgaW4gRGF0YSBNYXRlcmlhbCBhbmQgaXRzIGxlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0gPSBJRV9XUEEyOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbMl0sIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKworCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXTsKKworCS8vIDIuIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIDMuIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSAwOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIDQuIEZpbGwgU05vbmNlCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5Tm9uY2UsIHBBZC0+U3RhQ2ZnLlNOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIDUuIEtleSBSZXBsYXkgQ291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIFNlbmQgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgMgorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIDYuIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKworCS8vIE1ha2UgIFRyYW5zbWl0dGluZyBmcmFtZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IDQtd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFQYWlyTXNnM0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJUFVDSEFSICAgICAgICAgIAlwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgCUZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2czOworCVVDSEFSICAgICAgICAgICAJTWljWzE2XSwgT2xkTWljWzE2XTsKKwlNQUNfVEFCTEVfRU5UUlkgCSpwRW50cnkgPSBOVUxMOworCVVDSEFSCQkJCXNraXBfb2Zmc2V0OworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnM0FjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIFJlY29yZCA4MDIuMTEgaGVhZGVyICYgdGhlIHJlY2VpdmVkIEVBUE9MIHBhY2tldCBNc2czCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcE1zZzMtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisKKwkvLyAxLiBWZXJpZnkgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDIpKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFZlcmlmeSBSU04gSUUKKwkvL2lmICghUlRNUEVxdWFsTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpCisJaWYgKCFDaGVja1JTTklFKHBBZCwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSwgJnNraXBfb2Zmc2V0KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gTXNnIDMgb2YgV1BBMSA0LXdheSBoYW5kc2hha2UhISBcbiIpKTsKKwkJaGV4X2R1bXAoIlRoZSBvcmlnaW5hbCBSU05fSUUiLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOworCQloZXhfZHVtcCgiVGhlIHJlY2VpdmVkIFJTTl9JRSIsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlNOX0lFIFZBTElEIGluIE1zZyAzIG9mIFdQQTEgNC13YXkgaGFuZHNoYWtlISEgXG4iKSk7CisKKworCS8vIDIuIENoZWNrIE1JQyB2YWx1ZQorCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJVUNIQVIgZGlnZXN0WzgwXTsKKworCQlITUFDX1NIQTEoKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UJLy8gVEtJUAorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCX0KKworCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKworCS8vIDMuIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCisJCXJldHVybjsKKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDQuIERvdWJsZSBjaGVjayBBTm9uY2UKKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpCisJCXJldHVybjsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBNZXNzYWdlIDQgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBNZXNzYWdlIDQgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLDAsTUlDLDApCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vIEluIE1zZzMsICBLZXlJbmZvLnNlY3VyZSA9MCBpZiBHcm91cCBLZXkgSFMgdG8gY29tZS4gMSBpZiBubyBncm91cCBrZXkgSFMKKwkvLyBTdGF0aW9uIHNlbmRzIE1zZzQgIEtleUluZm8uc2VjdXJlIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGF0IGluIE1zZy4zCisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmU9IHBlZXJLZXlJbmZvLlNlY3VyZTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEtleSBSZXBsYXkgY291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDQKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCVVDSEFSIGRpZ2VzdFs4MF07CisKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vIFVwZGF0ZSBQVEsKKwkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCWVsc2UKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKwkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKwkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIDAsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgMCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkgIHBFbnRyeSk7CisKKwkvLyBNYWtlIHRyYW5zbWl0dGluZyBmcmFtZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgU2VuZCBNZXNzYWdlIDQgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2czQWN0aW9uIDwtLS0tLVxuIikpOworfQorCitWT0lEICAgIFdwYTJQYWlyTXNnM0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMzsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIgICAgICAgICAgICAgICAqbXBvb2wsICpLRVlEQVRBLCAqZGlnZXN0OworCVVDSEFSICAgICAgICAgICAgICAgS2V5WzMyXTsKKwlNQUNfVEFCTEVfRU5UUlkgCSpwRW50cnkgPSBOVUxMOworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxMDI0KTsKKworCWlmKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIEtFWURBVEEgTGVuID0gNTEyLgorCUtFWURBVEEgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoS0VZREFUQSArIDUxMiwgNCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzNBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBQcm9jZXNzIG1lc3NhZ2UgMyBmcmFtZS4KKwlwTXNnMyA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBNc2czLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKKworCS8vIDEuIFZlcmlmeSBjaXBoZXIgdHlwZSBtYXRjaAorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciE9IDIpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDIuIENoZWNrIE1JQyB2YWx1ZQorCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisJLy8gMy4gQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCisJaWYoUlRNUENvbXBhcmVNZW1vcnkocE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyA0LiBEb3VibGUgY2hlY2sgQU5vbmNlCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2czLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIE9idGFpbiBHVEsKKwkvLyA1LiBEZWNyeXB0IEdUSyBmcm9tIEtleSBEYXRhCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkVLRCA9ICVkXG4iLCBwZWVyS2V5SW5mby5FS0RfREwpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIERlY3J5cHQgQUVTIEdUSworCQlBRVNfR1RLX0tFWV9VTldSQVAoJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0scE1zZzMtPktleURlc2MuS2V5RGF0YSk7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlJTlQgaTsKKwkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQlOZGlzTW92ZU1lbW9yeShLZXksIHBNc2czLT5LZXlEZXNjLktleUl2LCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEFkLT5TdGFDZmcuUFRLWzE2XSwgMTYpOworCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90CisJCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwl9CisKKwlpZiAoIVBhcnNlS2V5RGF0YShwQWQsIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBHVEsgdG8gQVNJQworCS8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkJICBOVUxMKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIDQgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICAJPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsJCS8vIE5vIGRhdGEgZmllbGQKKworCS8vCisJLy8gTWVzc2FnZSA0IGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCwwLE1JQywwKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUgPSAxOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgNAorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkvLyBVcGRhdGUgUFRLCisJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisKKwkvLyBEZWNpZGUgaXRzIENoaXBlckFsZworCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwllbHNlCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisJLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICAwLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIDAsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkJICBwRW50cnkpOworCisJLy8gTWFrZSAgVHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBTZW5kIE1lc3NhZ2UgNCB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisKKworCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgQlNTMCwgMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcGEyUGFpck1zZzNBY3Rpb24gPC0tLS0tXG4iKSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgR3JvdXAga2V5IDItd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFHcm91cE1zZzFBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQorCit7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBHcm91cDsKKwlVQ0hBUiAgICAgICAgICAgICAgICptcG9vbCwgKmRpZ2VzdCwgKktFWURBVEE7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdLCBPbGRNaWNbMTZdOworCVVDSEFSICAgICAgICAgICAgICAgR1RLWzMyXSwgS2V5WzMyXTsKKwlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOworCisJLy8gYWxsb2NhdGUgbWVtb3J5CisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTAyNCk7CisKKwlpZihtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBLRVlEQVRBIExlbiA9IDUxMi4KKwlLRVlEQVRBID0gKFVDSEFSICopIFJPVU5EX1VQKGRpZ2VzdCArIDgwLCA0KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUdyb3VwTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIFByb2Nlc3MgR3JvdXAgTWVzc2FnZSAxIGZyYW1lLiBza2lwIDgwMi4xMSBoZWFkZXIoMjQpICYgTExDX1NOQVAgaGVhZGVyKDgpCisJcEdyb3VwID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcEdyb3VwLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKKworCS8vIDAuIENoZWNrIGNpcGhlciB0eXBlIG1hdGNoCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDIpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyAxLiBWZXJpZnkgUmVwbGF5IGNvdW50ZXIKKwkvLyAgICBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKKwlpZihSVE1QQ29tcGFyZU1lbW9yeShwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gMi4gVmVyaWZ5IE1JQyBpcyB2YWxpZAorCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBHcm91cC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCU5kaXNaZXJvTWVtb3J5KHBHcm91cC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsJLy8gQUVTCisJCUhNQUNfU0hBMSgoUFVDSEFSKSBwR3JvdXAsIHBHcm91cC0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwR3JvdXAsIHBHcm91cC0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCX0KKworCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnIDEgb2YgMi13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gZ3JvdXAgbXNnIDEgb2YgMi13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKworCisJLy8gMy4gRGVjcnlwdCBHVEsgZnJvbSBLZXkgRGF0YQorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIERlY3J5cHQgQUVTIEdUSworCQlBRVNfR1RLX0tFWV9VTldSQVAoJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIEtFWURBVEEsICBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGEpOworCX0KKwllbHNlCS8vIFRLSVAKKwl7CisJCUlOVCBpOworCisJCS8vIERlY3J5cHQgVEtJUCBHVEsKKwkJLy8gQ29uc3RydWN0IDMyIGJ5dGVzIFJDNCBLZXkKKwkJTmRpc01vdmVNZW1vcnkoS2V5LCBwR3JvdXAtPktleURlc2MuS2V5SXYsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwQWQtPlN0YUNmZy5QVEtbMTZdLCAxNik7CisJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLZXksIDMyKTsKKwkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCUFSQ0ZPVVJfQllURSgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhUKTsKKwkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJfQorCisJLy8gUHJvY2VzcyBkZWNyeXB0ZWQga2V5IGRhdGEgbWF0ZXJpYWwKKwkvLyBQYXJzZSBrZXlEYXRhIHRvIGhhbmRsZSBLREUgZm9ybWF0IGZvciBXUEEyUFNLCisJaWYgKHBlZXJLZXlJbmZvLkVLRF9ETCkKKwl7CisJCWlmICghUGFyc2VLZXlEYXRhKHBBZCwgS0VZREFUQSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIDApKQorCQl7CisJCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UJLy8gV1BBUFNLCisJeworCQkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgZm9yIFdQQVBTSworCQlOZGlzTW92ZU1lbW9yeShHVEssIEtFWURBVEEsIDMyKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBHVEssIDMyKTsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gcGVlcktleUluZm8uS2V5SW5kZXg7CisKKwkJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQorCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIEdUSywgTEVOX1RLSVBfRUspOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCAmR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgJkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQorCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKyAgICAJLy9oZXhfZHVtcCgiR3JvdXAgS2V5IDoiLCBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgTEVOX1RLSVBfRUspOworCX0KKworCS8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkJICBOVUxMKTsKKworCS8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKworCS8vIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBHcm91cCBtZXNzYWdlIDEgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBHcm91cCBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgxLDAsMCwwLEcsMCwwLE1JQywwKQorCS8vCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJeworCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwl9CisJZWxzZQorCXsKKwkJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisJfQorCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcEdyb3VwLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gS2V5IEluZGV4IGFzIEctTXNnIDEKKwlpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKKworCS8vIEtleSBUeXBlIEdyb3VwIGtleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvLyBTZWN1cmUgYml0CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUgID0gMTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEtleSBSZXBsYXkgY291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgZ3JvdXAgbWVzc2FnZSAyCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgIAkJJkZyYW1lTGVuLAorCQkJCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHByZXBhcmUgZm9yIGVuY3J5cHRpb24KKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgRkFMU0UpOworCisJLy8gNiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0IFdQQSBNQUMgaGVhZGVyCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYU1hY0hlYWRlckluaXQoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVAlQSEVBREVSXzgwMl8xMQlwSGRyODAyMTEsCisJSU4JCVVDSEFSCQkJd2VwLAorCUlOCQlQVUNIQVIJCSAgICBwQWRkcjEpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCXBIZHI4MDIxMS0+RkMuVHlwZQk9IEJUWVBFX0RBVEE7CisJcEhkcjgwMjExLT5GQy5Ub0RzCT0gMTsKKwlpZiAod2VwCT09IDEpCisJCXBIZHI4MDIxMS0+RkMuV2VwID0gMTsKKworCSAvLwlBZGRyMTogQlNTSUQsIEFkZHIyOiBTQSwgQWRkcjM6CURBCisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwQWRkcjEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJcEhkcjgwMjExLT5TZXF1ZW5jZSA9CXBBZC0+U2VxdWVuY2U7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5CisJc2VudCBvdXQgdG8gYWlyLgorCisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQorCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOCUJPT0xFQU4JCQlpczR3YXlGcmFtZSkKKworeworCU5ESVNfU1RBVFVTICAgICBTdGF0dXM7CisJUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQ7CisJVUNIQVIgICBJbmRleDsKKworCWRvCisJeworCQkvLyAxLiBidWlsZCBhIE5ESVMgcGFja2V0IGFuZCBjYWxsIFJUTVBTZW5kUGFja2V0KCk7CisJCS8vICAgIGJlIGNhcmVmdWwgYWJvdXQgaG93L3doZW4gdG8gcmVsZWFzZSB0aGlzIGludGVybmFsIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBidWZmZXIKKwkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCBwSGVhZGVyODAyXzMsIEhkckxlbiwgcERhdGEsIERhdGFMZW4pOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAoaXM0d2F5RnJhbWUpCisJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDEpOworCQllbHNlCisJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDApOworCisJCS8vIDIuIHNlbmQgb3V0IHRoZSBwYWNrZXQKKwkJU3RhdHVzID0gU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOworCQlpZihTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJLy8gRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0CisJCQkvLyBUaGVyZSBhcmUgdGhyZWUgcGxhY2UgY2FsbGluZyBkZXF1ZXVlIGZvciBUWCByaW5nLgorCQkJLy8gMS4gSGVyZSwgcmlnaHQgYWZ0ZXIgcXVldWVpbmcgdGhlIGZyYW1lLgorCQkJLy8gMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLgorCQkJLy8gMy4gVXBvbiBORElTIGNhbGwgUlRNUFNlbmRQYWNrZXRzCisJCQlpZigoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCisJCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkKKwkJCXsKKwkJCQlmb3IoSW5kZXggPSAwOyBJbmRleCA8IDU7IEluZGV4ICsrKQorCQkJCQlpZihwQWQtPlR4U3dRdWV1ZVtJbmRleF0uTnVtYmVyID4gMCkKKwkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEluZGV4LCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIGZvcm0gQVAKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpCit7CisJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCVVDSEFSICAgICAgICAgICAgICAgbGVuOworCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKwlCT09MRUFOCQkJCXJlc3VsdCA9IEZBTFNFOworCisJcFZJRSA9IHBEYXRhOworCWxlbgkgPSBEYXRhTGVuOworCSpPZmZzZXQgPSAwOworCisJd2hpbGUgKGxlbiA+IHNpemVvZihSU05JRTIpKQorCXsKKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJLy8gV1BBIFJTTiBJRQorCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKSkKKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkgJiYKKwkJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gV1BBL1dQQVBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQkvLyBXUEEyIFJTTiBJRQorCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgorCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQorCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCAocEVpZC0+TGVuICsgMikpKTsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBza2lwX29mZnNldCglZCkgXG4iLCAqT2Zmc2V0KSk7CisKKwlyZXR1cm4gcmVzdWx0OworCit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCisgICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisgICAgTm90ZToKKyAgICAgICAgODAyLjExaSBEMTAKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUGFyc2VLZXlEYXRhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJYlBhaXJld2lzZSkKK3sKKyAgICBQS0RFX0VOQ0FQICAgICAgICAgIHBLREUgPSBOVUxMOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgcE15S2V5RGF0YSA9IHBLZXlEYXRhOworICAgIFVDSEFSICAgICAgICAgICAgICAgS2V5RGF0YUxlbmd0aCA9IEtleURhdGFMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgICBHVEtMRU47CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisKKwkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gUGFpcmV3aXNlLU1zZyAzIGFuZCBza2lwIGl0CisJaWYgKGJQYWlyZXdpc2UpCisgICAgeworCQkvLyBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sKKwkJaWYgKCFDaGVja1JTTklFKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sICZza2lwX29mZnNldCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBhcnNlS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtaXNtYXRjaGVkIFxuIikpOworCQkJaGV4X2R1bXAoIkdldCBLRVlEQVRBIDoiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQlyZXR1cm4gRkFMU0U7CisgICAgCX0KKyAgICAJZWxzZQorCQl7CisJCQkvLyBza2lwIFJTTiBJRQorCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKKwkJCUtleURhdGFMZW5ndGggLT0gc2tpcF9vZmZzZXQ7CisKKwkJCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCBza2lwX29mZnNldCkpOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJQYXJzZUtleURhdGEgPT0+IEtleURhdGFMZW5ndGggJWQgd2l0aG91dCBSU05fSUUgXG4iLCBLZXlEYXRhTGVuZ3RoKSk7CisKKwkvLyBQYXJzZSBFS0QgZm9ybWF0CisJaWYgKEtleURhdGFMZW5ndGggPj0gOCkKKyAgICB7CisgICAgICAgIHBLREUgPSAoUEtERV9FTkNBUCkgcE15S2V5RGF0YTsKKyAgICB9CisJZWxzZQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEtleURhdGFMZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKwkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IHNob3VsZCBub3QgYmUgMAorCWlmIChwS0RFLT5HVEtFbmNhcC5LaWQgPT0gMCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGluZGV4IHplcm8gXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvLyBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoCisJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvLyBHZXQgR1RLIGxlbmd0aCAtIHJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IHAuODIKKwlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7CisKKwlpZiAoR1RLTEVOIDwgTUlOX0xFTl9PRl9HVEspCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBsZW5ndGggaXMgdG9vIHNob3J0ICglZCkgXG4iLCBHVEtMRU4pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdUSyBLZXkgd2l0aCBLREUgZm9ybWV0IGdvdCBpbmRleD0lZCwgbGVuPSVkIFxuIiwgcEtERS0+R1RLRW5jYXAuS2lkLCBHVEtMRU4pKTsKKworCS8vIFVwZGF0ZSBHVEsKKwkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgZm9yIFdQQVBTSworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgcEtERS0+R1RLRW5jYXAuR1RLLCAzMik7CisJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gcEtERS0+R1RLRW5jYXAuS2lkOworCisJLy8gVXBkYXRlIHNoYXJlZCBrZXkgdGFibGUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS0RFLT5HVEtFbmNhcC5HVEssIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJcmV0dXJuIFRSVUU7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNpc2NvIENDS00gUFJGIGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCWtleQkJCQlDaXNjbyBCYXNlIFRyYW5zaWVudCBLZXkgKEJUSykKKwkJa2V5X2xlbgkJCVRoZSBrZXkgbGVuZ3RoIG9mIHRoZSBCVEsKKwkJZGF0YQkJCVJ1cXVlc3QgTnVtYmVyKFJOKSArIEJTU0lECisJCWRhdGFfbGVuCQlUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCisJCW91dHB1dAkJCVN0b3JlIGZvciBQVEsoUGFpcndpc2UgdHJhbnNpZW50IGtleXMpCisJCWxlbgkJCQlUaGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCTgwMi4xaQlBbm5leCBGLjkKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ0NLTVBSRigKKwlJTglVQ0hBUgkqa2V5LAorCUlOCUlOVAkJa2V5X2xlbiwKKwlJTglVQ0hBUgkqZGF0YSwKKwlJTglJTlQJCWRhdGFfbGVuLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCUlOVAkJbGVuKQoreworCUlOVAkJaTsKKwlVQ0hBUglpbnB1dFsxMDI0XTsKKwlJTlQJCWN1cnJlbnRpbmRleCA9IDA7CisJSU5UCQl0b3RhbF9sZW47CisKKwlOZGlzTW92ZU1lbW9yeShpbnB1dCwgZGF0YSwgZGF0YV9sZW4pOworCXRvdGFsX2xlbiA9IGRhdGFfbGVuOworCWlucHV0W3RvdGFsX2xlbl0gPSAwOworCXRvdGFsX2xlbisrOworCWZvcgkoaSA9IDA7CWkgPAkobGVuICsgMTkpIC8gMjA7IGkrKykKKwl7CisJCUhNQUNfU0hBMShpbnB1dCwgdG90YWxfbGVuLAlrZXksIGtleV9sZW4sICZvdXRwdXRbY3VycmVudGluZGV4XSk7CisJCWN1cnJlbnRpbmRleCArPQkyMDsKKwkJaW5wdXRbdG90YWxfbGVuIC0gMV0rKzsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIE1JQyBlcnJvciBpbmRpY2F0aW9uIGFuZCByZWNvcmQgTUlDIGVycm9yIHRpbWVyLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFdwYUtleSAJCVBvaW50ZXIgdG8gdGhlIFdQQSBrZXkgc3RydWN0dXJlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlcG9ydE1pY0Vycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSVBIRVJfS0VZIAlwV3BhS2V5KQoreworCVVMT05HCU5vdzsKKyAgICBVQ0hBUiAgIHVuaWNhc3RLZXkgPSAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRV9LRVkgPyAxOjApOworCisJLy8gUmVjb3JkIExhc3QgTUlDIGVycm9yIHRpbWUgYW5kIGNvdW50CisJTm93ID0gamlmZmllczsKKwlpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDApCisJeworCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKKwkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAxKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopKSA8IE5vdykKKwkJeworCQkJLy8gVXBkYXRlIExhc3QgTUlDIGVycm9yIHRpbWUsIHRoaXMgZGlkIG5vdCB2aW9sYXRlIHR3byBNSUMgZXJyb3JzIHdpdGhpbiA2MCBzZWNvbmRzCisJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworCQl9CisJCWVsc2UKKwkJeworCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworCQkJLy8gVmlvbGF0ZSBNSUMgZXJyb3IgY291bnRzLCBNSUMgY291bnRlcm1lYXN1cmVzIGtpY2tzIGluCisJCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKKwkJCS8vIFdlIHNoYWxsIGJsb2NrIGFsbCByZWNlcHRpb24KKwkJCS8vIFdlIHNoYWxsIGNsZWFuIGFsbCBUeCByaW5nIGFuZCBkaXNhc3NvaWNhdGUgZnJvbSBBUCBhZnRlciBuZXh0IEVBUE9MIGZyYW1lCisJCQkvLworCQkJLy8gTm8gbmVjZXNzYXJ5IHRvIGNsZWFuIGFsbCBUeCByaW5nLCBvbiBSVE1QSGFyZFRyYW5zbWl0IHdpbGwgc3RvcCBzZW5kaW5nIG5vbi04MDIuMVggRUFQT0wgcGFja2V0cworCQkJLy8gaWYgcEFkLT5TdGFDZmcuTWljRXJyQ250IGdyZWF0ZXIgdGhhbiAyLgorCQkJLy8KKwkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7CisJCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gTUlDIGVycm9yIGNvdW50ID49IDIKKwkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgorCQk7CisJfQorICAgIE1sbWVFbnF1ZXVlKHBBZCwKKwkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQlPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRSwKKwkJCQkxLAorCQkJCSZ1bmljYXN0S2V5KTsKKworICAgIGlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMikKKyAgICB7CisgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsIDEwMCk7CisgICAgfQorfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZGVmaW5lCUxFTkdUSF9FQVBfSCAgICA0CisvLyBJZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVBhY2tldCAsZmluZCBvdXQgaXRzIEVBUC1Db2RlIChSZXF1ZXN0KDB4MDEpLCBSZXNwb25zZSgweDAyKSwgU3VjY2VzcygweDAzKSwgRmFpbHVyZSgweDA0KSkuCitJTlQJICAgIFdwYUNoZWNrRWFwQ29kZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIAkJcEFkLAorCUlOICBQVUNIQVIJCQkJcEZyYW1lLAorCUlOICBVU0hPUlQJCQkJRnJhbWVMZW4sCisJSU4gIFVTSE9SVAkJCQlPZmZTZXQpCit7CisKKwlQVUNIQVIJcERhdGE7CisJSU5UCXJlc3VsdCA9IDA7CisKKwlpZiggRnJhbWVMZW4gPCBPZmZTZXQgKyBMRU5HVEhfRUFQT0xfSCArIExFTkdUSF9FQVBfSCApCisJCXJldHVybiByZXN1bHQ7CisKKwlwRGF0YSA9IHBGcmFtZSArIE9mZlNldDsgLy8gc2tpcCBvZmZzZXQgYnl0ZXMKKworCWlmKCoocERhdGErMSkgPT0gRUFQUGFja2V0KSAJLy8gODAyLjF4IGhlYWRlciAtIFBhY2tldCBUeXBlCisJeworCQkgcmVzdWx0ID0gKihwRGF0YSs0KTsJCS8vIEVBUCBoZWFkZXIgLSBDb2RlCisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICAgYlVuaWNhc3QpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisgICAgc3ByaW50ZihjdXN0b20sICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iKTsKKyAgICBpZiAoYlVuaWNhc3QpCisgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMgdW5pY2FzdCIsIGN1c3RvbSk7CisgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihjdXN0b20pOworICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgY3VzdG9tKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKK1ZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKKyAgICBCT09MRUFOICAgICAgICAgICAgIGJVbmljYXN0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIC0tLS0tPlxuIikpOworCisgICAgYlVuaWNhc3QgPSAoRWxlbS0+TXNnWzBdID09IDEgPyBUUlVFOkZBTFNFKTsKKwlwQWQtPlNlcXVlbmNlID0gKChwQWQtPlNlcXVlbmNlKSArIDEpICYgKE1BWF9TRVFfTlVNQkVSKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCisgICAgLy8gUmVxdWVzdCBmaWVsZCBwcmVzZW50ZWQKKyAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QgPSAxOworCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7CisJfQorCisgICAgUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gKGJVbmljYXN0ID8gUEFJUldJU0VLRVkgOiBHUk9VUEtFWSk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworICAgIC8vIEVycm9yIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uRXJyb3IgID0gMTsKKworCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOworCisJLy8gS2V5IFJlcGxheSBDb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworICAgIGluY19ieXRlX2FycmF5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsJLy8gQUVTCisgICAgICAgIFVDSEFSIGRpZ2VzdFsyMF0gPSB7MH07CisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsJLy8gVEtJUAorCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKyAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKyAgICAJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCQkmSGVhZGVyODAyXzMsCisgICAgCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICAmUGFja2V0LAorICAgIAkJCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNSUMgZmFpbHVyZSByZXBvcnQgZnJhbWUgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBGQUxTRSk7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUgPC0tLS0tXG4iKSk7Cit9CisKKy8qKiBmcm9tIHdwYV9zdXBwbGljYW50CisgKiBpbmNfYnl0ZV9hcnJheSAtIEluY3JlbWVudCBhcmJpdHJhcnkgbGVuZ3RoIGJ5dGUgYXJyYXkgYnkgb25lCisgKiBAY291bnRlcjogUG9pbnRlciB0byBieXRlIGFycmF5CisgKiBAbGVuOiBMZW5ndGggb2YgdGhlIGNvdW50ZXIgaW4gYnl0ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgY291bnRlciBieSBvbmUgYW5kIGNvbnRpbnVlcworICogcm9sbGluZyBvdmVyIHRvIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZXMgaWYgdGhlIGJ5dGUgd2FzIGluY3JlbWVudGVkIGZyb20KKyAqIDB4ZmYgdG8gMHgwMC4KKyAqLwordm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbikKK3sKKwlpbnQgcG9zID0gbGVuIC0gMTsKKwl3aGlsZSAocG9zID49IDApIHsKKwkJY291bnRlcltwb3NdKys7CisJCWlmIChjb3VudGVyW3Bvc10gIT0gMCkKKwkJCWJyZWFrOworCQlwb3MtLTsKKwl9Cit9CisKK1ZPSUQgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworICAgIFJUTVBfQURBUFRFUiAgICAgICAgICAgICAgICAqcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OworICAgIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKKworCS8vIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBSZXBvcnRNaWNFcnJvciAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgYWZ0ZXIgc2VuZGluZyBzZWNvbmQgY29udGludW91cyBFQVBPTCBmcmFtZVxuIikpOworCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fTUlDX0ZBSUxVUkUpOworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKworCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjJmMzlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYwpAQCAtMCwwICsxLDcwNjggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgc3RhX2lvY3RsLmMKKworICAgIEFic3RyYWN0OgorICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCisJUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisqLworCisjaW5jbHVkZQkicnRfY29uZmlnLmgiCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisjZW5kaWYKKworI2RlZmluZSBOUl9XRVBfS0VZUyAJCQkJNAorI2RlZmluZSBXRVBfU01BTExfS0VZX0xFTiAJCQkoNDAvOCkKKyNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4gCQkJKDEwNC84KQorCisjZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbHNlCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQorI2VuZGlmCisKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcExlbjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF9WRVJTSU9OX0lORk97CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblc7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblg7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblk7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblo7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRZZWFyOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkTW9udGg7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGREYXk7Cit9IFJUX1ZFUlNJT05fSU5GTywgKlBSVF9WRVJTSU9OX0lORk87CisKK3N0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0geworeyBSVFBSSVZfSU9DVExfU0VULAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIDAsCisgICJzZXQifSwKKworeyBSVFBSSVZfSU9DVExfU0hPVywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAoreyBSVFBSSVZfSU9DVExfU0hPVywgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCisvKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KKyAgICB7IFNIT1dfQ09OTl9TVEFUVVMsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiY29ublN0YXR1cyIgfSwKKwl7IFNIT1dfRFJWSUVSX1ZFUklPTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkcml2ZXJWZXIiIH0sCisgICAgeyBTSE9XX0JBX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYmFpbmZvIiB9LAorCXsgU0hPV19ERVNDX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGVzY2luZm8iIH0sCisgICAgeyBSQUlPX09GRiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vZmYiIH0sCisJeyBSQUlPX09OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29uIiB9LAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsgU0hPV19ETFNfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkbHNlbnRyeWluZm8iIH0sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyBTSE9XX0NGR19WQUxVRSwKKwkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInNob3ciIH0sCisJeyBTSE9XX0FESE9DX0VOVFJZX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYWRob2NFbnRyeSIgfSwKKworLyogLS0tIHN1Yi1pb2N0bHMgcmVsYXRpb25zIC0tLSAqLworCisjaWZkZWYgREJHCit7IFJUUFJJVl9JT0NUTF9CQlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJiYnAifSwKK3sgUlRQUklWX0lPQ1RMX01BQywKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJtYWMifSwKK3sgUlRQUklWX0lPQ1RMX0UyUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJlMnAifSwKKyNlbmRpZiAgLyogREJHICovCisKK3sgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MsCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJzdGF0In0sCit7IFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWSwKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZ2V0X3NpdGVfc3VydmV5In0sCit9OworCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKK1ZPSUQgUlRNUElvY3RsQkJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxFMlBST00oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgc3RydWN0IGl3cmVxICAgICp3cnEpOworI2VuZGlmIC8vIERCRyAvLworCisKK05ESVNfU1RBVFVTIFJUTVBXUEFOb25lQWRkS2V5UHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTglQVk9JRAkJCXBCdWYpOworCitJTlQgU2V0X0ZyYWdUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENIQVIJCQlleHRyYSk7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2V0X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOworfSAqUFJUTVBfUFJJVkFURV9TRVRfUFJPQywgUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQ1tdID0geworCXsiRHJpdmVyVmVyc2lvbiIsCQkJCVNldF9Ecml2ZXJWZXJzaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbiIsCQkJCVNldF9Db3VudHJ5UmVnaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbkFCYW5kIiwJCQlTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2N9LAorCXsiU1NJRCIsCQkJCQkJU2V0X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCQlTZXRfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTZXRfVHhCdXJzdF9Qcm9jfSwKKwl7IlR4UHJlYW1ibGUiLAkJCQlTZXRfVHhQcmVhbWJsZV9Qcm9jfSwKKwl7IlR4UG93ZXIiLAkJCQkJU2V0X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNldF9DaGFubmVsX1Byb2N9LAorCXsiQkdQcm90ZWN0aW9uIiwJCQkJU2V0X0JHUHJvdGVjdGlvbl9Qcm9jfSwKKwl7IlJUU1RocmVzaG9sZCIsCQkJCVNldF9SVFNUaHJlc2hvbGRfUHJvY30sCisJeyJGcmFnVGhyZXNob2xkIiwJCQkJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvY30sCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJeyJIdEJ3IiwJCSAgICAgICAgICAgICAgICBTZXRfSHRCd19Qcm9jfSwKKwl7Ikh0TWNzIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRNY3NfUHJvY30sCisJeyJIdEdpIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRHaV9Qcm9jfSwKKwl7Ikh0T3BNb2RlIiwJCSAgICAgICAgICAgIFNldF9IdE9wTW9kZV9Qcm9jfSwKKwl7Ikh0RXh0Y2hhIiwJCSAgICAgICAgICAgIFNldF9IdEV4dGNoYV9Qcm9jfSwKKwl7Ikh0TXBkdURlbnNpdHkiLAkJICAgICAgICBTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKKwl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgCVNldF9IdEJhV2luU2l6ZV9Qcm9jfSwKKwl7Ikh0UmRnIiwJCSAgICAgICAgCQlTZXRfSHRSZGdfUHJvY30sCisJeyJIdEFtc2R1IiwJCSAgICAgICAgCQlTZXRfSHRBbXNkdV9Qcm9jfSwKKwl7Ikh0QXV0b0JhIiwJCSAgICAgICAgCVNldF9IdEF1dG9CYV9Qcm9jfSwKKwl7Ikh0QmFEZWNsaW5lIiwJCQkJCVNldF9CQURlY2xpbmVfUHJvY30sCisJeyJIdFByb3RlY3QiLAkJICAgICAgICAJU2V0X0h0UHJvdGVjdF9Qcm9jfSwKKwl7Ikh0TWltb1BzIiwJCSAgICAgICAgCVNldF9IdE1pbW9Qc19Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwl7IlBrdEFnZ3JlZ2F0ZSIsCQkJCVNldF9Qa3RBZ2dyZWdhdGVfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFdNTV9TVVBQT1JUCisJeyJXbW1DYXBhYmxlIiwJCQkJCVNldF9XbW1DYXBhYmxlX1Byb2N9LAorI2VuZGlmCisJeyJJRUVFODAyMTFIIiwJCQkJCVNldF9JRUVFODAyMTFIX1Byb2N9LAorICAgIHsiTmV0d29ya1R5cGUiLCAgICAgICAgICAgICAgICAgU2V0X05ldHdvcmtUeXBlX1Byb2N9LAorCXsiQXV0aE1vZGUiLAkJCQkJU2V0X0F1dGhNb2RlX1Byb2N9LAorCXsiRW5jcnlwVHlwZSIsCQkJCQlTZXRfRW5jcnlwVHlwZV9Qcm9jfSwKKwl7IkRlZmF1bHRLZXlJRCIsCQkJCVNldF9EZWZhdWx0S2V5SURfUHJvY30sCisJeyJLZXkxIiwJCQkJCQlTZXRfS2V5MV9Qcm9jfSwKKwl7IktleTIiLAkJCQkJCVNldF9LZXkyX1Byb2N9LAorCXsiS2V5MyIsCQkJCQkJU2V0X0tleTNfUHJvY30sCisJeyJLZXk0IiwJCQkJCQlTZXRfS2V5NF9Qcm9jfSwKKwl7IldQQVBTSyIsCQkJCQkJU2V0X1dQQVBTS19Qcm9jfSwKKwl7IlJlc2V0Q291bnRlciIsCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2N9LAorCXsiUFNNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgU2V0X1BTTW9kZV9Qcm9jfSwKKyNpZmRlZiBEQkcKKwl7IkRlYnVnIiwJCQkJCQlTZXRfRGVidWdfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKwl7IkFURSIsCQkJCQkJCVNldF9BVEVfUHJvY30sCisJeyJBVEVEQSIsCQkJCQkJU2V0X0FURV9EQV9Qcm9jfSwKKwl7IkFURVNBIiwJCQkJCQlTZXRfQVRFX1NBX1Byb2N9LAorCXsiQVRFQlNTSUQiLAkJCQkJU2V0X0FURV9CU1NJRF9Qcm9jfSwKKwl7IkFURUNIQU5ORUwiLAkJCQkJU2V0X0FURV9DSEFOTkVMX1Byb2N9LAorCXsiQVRFVFhQT1cwIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2N9LAorCXsiQVRFVFhQT1cxIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIxX1Byb2N9LAorCXsiQVRFVFhBTlQiLAkJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFUlhBTlQiLAkJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFVFhGUkVRT0ZGU0VUIiwJCQkJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2N9LAorCXsiQVRFVFhCVyIsCQkJCQkJU2V0X0FURV9UWF9CV19Qcm9jfSwKKwl7IkFURVRYTEVOIiwJCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2N9LAorCXsiQVRFVFhDTlQiLAkJCQkJU2V0X0FURV9UWF9DT1VOVF9Qcm9jfSwKKwl7IkFURVRYTUNTIiwJCQkJCVNldF9BVEVfVFhfTUNTX1Byb2N9LAorCXsiQVRFVFhNT0RFIiwJCQkJCVNldF9BVEVfVFhfTU9ERV9Qcm9jfSwKKwl7IkFURVRYR0kiLAkJCQkJCVNldF9BVEVfVFhfR0lfUHJvY30sCisJeyJBVEVSWEZFUiIsCQkJCQlTZXRfQVRFX1JYX0ZFUl9Qcm9jfSwKKwl7IkFURVJSRiIsCQkJCQkJU2V0X0FURV9SZWFkX1JGX1Byb2N9LAorCXsiQVRFV1JGMSIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjFfUHJvY30sCisJeyJBVEVXUkYyIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jfSwKKwl7IkFURVdSRjMiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYzX1Byb2N9LAorCXsiQVRFV1JGNCIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjRfUHJvY30sCisJeyJBVEVMREUyUCIsCQkJCSAgICBTZXRfQVRFX0xvYWRfRTJQX1Byb2N9LAorCXsiQVRFUkUyUCIsCQkJCQkJU2V0X0FURV9SZWFkX0UyUF9Qcm9jfSwKKwl7IkFURVNIT1ciLAkJCQkJCVNldF9BVEVfU2hvd19Qcm9jfSwKKwl7IkFURUhFTFAiLAkJCQkJCVNldF9BVEVfSGVscF9Qcm9jfSwKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJeyJUeFN0b3AiLAkJCQkJCVNldF9UeFN0b3BfUHJvY30sCisJeyJSeFN0b3AiLAkJCQkJCVNldF9SeFN0b3BfUHJvY30sCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgeyJXcGFTdXBwb3J0IiwgICAgICAgICAgICAgICAgICBTZXRfV3BhX1N1cHBvcnR9LAorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKwl7IkZpeGVkVHhNb2RlIiwgICAgICAgICAgICAgICAgIFNldF9GaXhlZFR4TW9kZV9Qcm9jfSwKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCXsiT3BNb2RlIiwJCQkJCQlTZXRfT3BNb2RlX1Byb2N9LAorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgeyJUR25XaWZpVGVzdCIsICAgICAgICAgICAgICAgICBTZXRfVEduV2lmaVRlc3RfUHJvY30sCisgICAgeyJGb3JjZUdGIiwJCSAgICAgICAgCQlTZXRfRm9yY2VHRl9Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IkRsc0FkZEVudHJ5IiwJCQkJCVNldF9EbHNBZGRFbnRyeV9Qcm9jfSwKKwl7IkRsc1RlYXJEb3duRW50cnkiLAkJCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2N9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsiTG9uZ1JldHJ5IiwJICAgICAgICAJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKKwl7IlNob3J0UmV0cnkiLAkgICAgICAgIAkJU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jfSwKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJeyIxMWRDbGllbnRNb2RlIiwJCQkJU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2N9LAorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJeyJDYXJyaWVyRGV0ZWN0IiwJCQkJU2V0X0NhcnJpZXJEZXRlY3RfUHJvY30sCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJe05VTEwsfQorfTsKKworCitWT0lEIFJUTVBBZGRLZXkoCisJSU4JUFJUTVBfQURBUFRFUgkgICAgcEFkLAorCUlOCVBORElTXzgwMl8xMV9LRVkgICAgcEtleSkKK3sKKwlVTE9ORwkJCQlLZXlJZHg7CisJTUFDX1RBQkxFX0VOVFJZICAJKnBFbnRyeTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOworCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwl7CisJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCXsKKwkJICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisJCSAgICAvLyBVcGRhdGUgUFRLCisJCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKyAgICAgICAgCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgICAgIAllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKyAgICAgICAgCWVsc2UKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisgICAgICAgIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgIAlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworICAgICAgICAJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIHBFbnRyeSk7CisKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJICAgICAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKwkJfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBHVEsKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgTlVMTCk7CisKKyAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICB9CisJfQorCWVsc2UJLy8gZHluYW1pYyBXRVAgZnJvbSB3cGFfc3VwcGxpY2FudAorCXsKKwkJVUNIQVIJQ2lwaGVyQWxnOworICAgIAlQVUNIQVIJS2V5OworCisJCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKKwkJCWdvdG8gZW5kOworCisJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQlpZiAoS2V5SWR4IDwgNCkKKwkJeworCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZworCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKKworCQkJCWlmIChwRW50cnkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOworCisJCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKKwkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJCWVsc2UKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAorICAgICAgICAgICAgICAgIAkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCisJCQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCUJTUzAsCisJCQkJCQlLZXlJZHgsIC8vIFRoZSB2YWx1ZSBtYXkgYmUgbm90IHplcm8KKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJcEVudHJ5KTsKKworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyAgICAgICAgICAgIHsKKwkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisKKwkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJLy8gU2V0IENpcGVyIHR5cGUKKwkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCWVsc2UKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisgICAgCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKwkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKKyAgICAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJfQorCQl9CisJfQorZW5kOgorCXJldHVybjsKK30KKworY2hhciAqIHJ0c3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKK3sKKyAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQorICAgICAgICBpZiAoKnMgPT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKSBzOworfQorCisvKgorVGhpcyBpcyByZXF1aXJlZCBmb3IgTGluRVgyMDA0L2tlcm5lbDIuNi43IHRvIHByb3ZpZGUgaXdsaXN0IHNjYW5uaW5nIGZ1bmN0aW9uCisqLworCitpbnQKK3J0X2lvY3RsX2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisvLwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisjaWZkZWYgUlQyODcwCisJc3RybmNweShuYW1lLCAiUlQyODcwIFdpcmVsZXNzIiwgSUZOQU1TSVopOworI2VuZGlmIC8vIFJUMjg3MCAvLworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCWludCAJY2hhbiA9IC0xOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisKKwlpZiAoZnJlcS0+ZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCisJCWNoYW4gPSBmcmVxLT5tOwkvLyBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyCisJZWxzZQorCQlNQVBfS0haX1RPX0NIQU5ORUxfSUQoIChmcmVxLT5tIC8xMDApICwgY2hhbik7IC8vIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsCisKKyAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKKyAgICB7CisJcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KK2ludCBydF9pb2N0bF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBOVUxMOworCVVDSEFSIGNoOworCVVMT05HCW07CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkJY2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCisgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKKwlmcmVxLT5tID0gbSAqIDEwMDsKKwlmcmVxLT5lID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKCptb2RlKQorCXsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCWJyZWFrOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsICptb2RlKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICAqbW9kZSA9IElXX01PREVfTU9OSVRPUjsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgICptb2RlID0gSVdfTU9ERV9BVVRPOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3bW9kZShtb2RlPSVkKVxuIiwgKm1vZGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1MTYgdmFsOworCWludCBpOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7CisJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisJaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7CisJCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG10ID0gMTAwMCAqIDEwMjQ7CisJCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfAorCQkJSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7CisJfQorCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7CisKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5taW5fcmV0cnkgPSAwOworCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKworCXZhbCA9IDA7CisJZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCisJeworCQl1MzIgbTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKKwkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOworCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBIWiAqLworCisJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCXZhbCsrOworCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvKiB3aGF0IGlzIGNvcnJlY3QgbWF4PyBUaGlzIHdhcyBub3QKKwkJCQkJKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSogNjkgaGFzIGJlZW4gb2JzZXJ2ZWQuICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsgLyogZEIgKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOyAvKiBkQiAqLworCisJLyogV2hhdCB3b3VsZCBiZSBzdWl0YWJsZSB2YWx1ZXMgZm9yICJhdmVyYWdlL3R5cGljYWwiIHF1YWw/ICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAyMDsKKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtNjA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gLTk1OworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDM7CisKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE5SX1dFUF9LRVlTOworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKKwkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICB7CisgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgfQorCisgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOworICAgIG1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKyAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgICAgICBtZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7CisgICAgfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJV0FQKD1FTVBUWSlcbiIpKTsKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVuaXRzIGFyZSBpbiBkYiBhYm92ZSB0aGUgbm9pc2UgZmxvb3IuIFRoYXQgbWVhbnMgdGhlCisgKiByc3NpIHZhbHVlcyByZXBvcnRlZCBpbiB0aGUgdHgvcnggZGVzY3JpcHRvcnMgaW4gdGhlCisgKiBkcml2ZXIgYXJlIHRoZSBTTlIgZXhwcmVzc2VkIGluIGRiLgorICoKKyAqIElmIHlvdSBhc3N1bWUgdGhhdCB0aGUgbm9pc2UgZmxvb3IgaXMgLTk1LCB3aGljaCBpcyBhbgorICogZXhjZWxsZW50IGFzc3VtcHRpb24gOTkuNSAlIG9mIHRoZSB0aW1lLCB0aGVuIHlvdSBjYW4KKyAqIGRlcml2ZSB0aGUgYWJzb2x1dGUgc2lnbmFsIGxldmVsIChpLmUuIC05NSArIHJzc2kpLgorICogVGhlcmUgYXJlIHNvbWUgb3RoZXIgc2xpZ2h0IGZhY3RvcnMgdG8gdGFrZSBpbnRvIGFjY291bnQKKyAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByc3NpIG1lYXN1cmVtZW50IGlzIGZyb20gMTFiLAorICogMTFnLCBvciAxMWEuICAgVGhlc2UgZGlmZmVyZW5jZXMgYXJlIGF0IG1vc3QgMmRiIGFuZAorICogY2FuIGJlIGRvY3VtZW50ZWQuCisgKgorICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCisgKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQorICovCitzdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKK3sKKwlfX3U4IENoYW5uZWxRdWFsaXR5OworCisJLy8gTm9ybWFsaXplIFJzc2kKKwlpZiAocnNzaSA+PSAtNTApCisJCUNoYW5uZWxRdWFsaXR5ID0gMTAwOworCWVsc2UgaWYgKHJzc2kgPj0gLTgwKSAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQorCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgyNCArICgocnNzaSArIDgwKSAqIDI2KS8xMCk7CisJZWxzZSBpZiAocnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KKyAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoKHJzc2kgKyA5MCkgKiAyNikvMTA7CisJZWxzZQorCQlDaGFubmVsUXVhbGl0eSA9IDA7CisKKyAgICBpcS0+cXVhbCA9IChfX3U4KUNoYW5uZWxRdWFsaXR5OworCisgICAgaXEtPmxldmVsID0gKF9fdTgpKHJzc2kpOworICAgIGlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KXBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7IAkvLyBub2lzZSBsZXZlbCAoZEJtKQorICAgIGlxLT5ub2lzZSArPSAyNTYgLSAxNDM7CisgICAgaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOworfQorCitpbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworIAlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CisJaW50IGk7CisKKyAgIAkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisgICAgICAgIC8vcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDxJV19NQVhfQVAgOyBpKyspCisJeworCQlpZiAoaSA+PSAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpCisJCQlicmVhazsKKwkJYWRkcltpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQltZW1jcHkoYWRkcltpXS5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmcXVhbFtpXSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisJfQorCWRhdGEtPmxlbmd0aCA9IGk7CisJbWVtY3B5KGV4dHJhLCAmYWRkciwgaSpzaXplb2YoYWRkclswXSkpOworCWRhdGEtPmZsYWdzID0gMTsJCS8qIHNpZ25hbCBxdWFsaXR5IHByZXNlbnQgKHNvcnQgb2YpICovCisJbWVtY3B5KGV4dHJhICsgaSpzaXplb2YoYWRkclswXSksICZxdWFsLCBpKnNpemVvZihxdWFsW2ldKSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NHSVdTQ0FOCitpbnQgcnRfaW9jdGxfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCVVMT05HCQkJCQkJCQlOb3c7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlyZXR1cm4gMDsKKwlkb3sKKwkJTm93ID0gamlmZmllczsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJeworCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCX0KKworCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKwkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKwkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkJLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorCQkJMCwKKwkJCU5VTEwpOworCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCX13aGlsZSgwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlpbnQgaT0wOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYSwgKnByZXZpb3VzX2V2ID0gZXh0cmE7CisJY2hhciAqZW5kX2J1ZjsKKwljaGFyICpjdXJyZW50X3ZhbCwgY3VzdG9tW01BWF9DVVNUT01fTEVOXSA9IHswfTsKKyNpZm5kZWYgSVdFVkdFTklFCisJY2hhciBpZHg7CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgeworCQkvKgorCQkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorCQkgKi8KKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA9IDA7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA9PSAwKQorCXsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgaWYgKGRhdGEtPmxlbmd0aCA+IDApCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIGRhdGEtPmxlbmd0aDsKKyAgICBlbHNlCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZWxzZQorICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKGN1cnJlbnRfZXYgPj0gZW5kX2J1ZikKKyAgICAgICAgeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKwkJLy9NQUMgYWRkcmVzcworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQkJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgRVRIX0FMRU4pOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0VTU0lECisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL05ldHdvcmsgVHlwZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FVVE87CisJCX0KKwkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBJV19FVl9VSU5UX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vQ2hhbm5lbCBhbmQgRnJlcXVlbmN5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7CisJCWVsc2UKKwkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWl3ZS51LmZyZXEuaSA9IDA7CisKKwkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisgICAgICAgIC8vQWRkIHF1YWxpdHkgc3RhdGlzdGljcworICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKyAgICAJaXdlLnUucXVhbC5sZXZlbCA9IDA7CisgICAgCWl3ZS51LnF1YWwubm9pc2UgPSAwOworICAgICAgICBzZXRfcXVhbGl0eShwQWRhcHRlciwgJml3ZS51LnF1YWwsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworICAgIAljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0VuY3lwdGlvbiBrZXkKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwkJaWYgKENBUF9JU19QUklWQUNZX09OIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DYXBhYmlsaXR5SW5mbyApKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9SVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJCWVsc2UKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgICAgICBjdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwmaXdlLCAoY2hhciAqKXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bKGl3ZS51LmRhdGEuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpLTFdLktleSk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vQml0IFJhdGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbikKKyAgICAgICAgeworICAgICAgICAgICAgVUNIQVIgdG1wUmF0ZSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVbcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbi0xXTsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQlpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisgICAgCQljdXJyZW50X3ZhbCA9IGN1cnJlbnRfZXYgKyBJV19FVl9MQ1BfTEVOOworICAgICAgICAgICAgaWYgKHRtcFJhdGUgPT0gMHg4MikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDEgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDg0KQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMiAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OEIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICA1LjUgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDk2KQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMTEgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZQorICAgIAkJICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgKHRtcFJhdGUvMikgKiAxMDAwMDAwOworCisJCQlpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwkJCWN1cnJlbnRfdmFsID0gSVdFX1NUUkVBTV9BRERfVkFMVUUoaW5mbywgY3VycmVudF9ldiwKKwkJCQljdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwKKyAgICAJCQlJV19FVl9QQVJBTV9MRU4pOworCisgICAgICAgIAlpZigoY3VycmVudF92YWwtY3VycmVudF9ldik+SVdfRVZfTENQX0xFTikKKyAgICAgICAgICAgIAljdXJyZW50X2V2ID0gY3VycmVudF92YWw7CisgICAgICAgIAllbHNlCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgSVdFVkdFTklFCisJCS8vV1BBIElFCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisJCXsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKwkJfQorCisJCS8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgICAgIAltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIC8vV1BBIElFCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJ3cGFfaWU9IiwgNyk7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAicnNuX2llPSIsIDcpOworCQkJZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCX0KKworCWRhdGEtPmxlbmd0aCA9IGN1cnJlbnRfZXYgLSBleHRyYTsKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiAsKCI9PT0+cnRfaW9jdGxfZ2l3c2Nhbi4gJWQoJWQpIEJTUyByZXR1cm5lZCwgZGF0YS0+bGVuZ3RoID0gJWRcbiIsaSAsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yLCBkYXRhLT5sZW5ndGgpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgcnRfaW9jdGxfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5mbGFncykKKwl7CisJCVBDSEFSCXBTc2lkU3RyaW5nID0gTlVMTDsKKworCQkvLyBJbmNsdWRlcyBudWxsIGNoYXJhY3Rlci4KKwkJaWYgKGRhdGEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSArIDEpKQorCQkJcmV0dXJuIC1FMkJJRzsKKworCQlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBTc2lkU3RyaW5nKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIGVzc2lkLCBkYXRhLT5sZW5ndGgpOworCQkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKSA9PSBGQUxTRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZWxzZQorCXsKKwkJLy8gQU5ZIHNzaWQKKwkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKSA9PSBGQUxTRSkKKwkJCXJldHVybiAtRUlOVkFMOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJZGF0YS0+ZmxhZ3MgPSAxOworICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIGRhdGEtPmxlbmd0aCAgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOworCQlkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworCWVsc2UKKwl7Ly90aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZAorCQlkYXRhLT5sZW5ndGggID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQgcnRfaW9jdGxfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQocEFkYXB0ZXItPm5pY2tuYW1lLCAwLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOworCW1lbWNweShwQWRhcHRlci0+bmlja25hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOworCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMSkKKwkJZGF0YS0+bGVuZ3RoID0gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxOworCWlmIChkYXRhLT5sZW5ndGggPiAwKSB7CisJCW1lbWNweShuaWNrbmFtZSwgcEFkYXB0ZXItPm5pY2tuYW1lLCBkYXRhLT5sZW5ndGgtMSk7CisJCW5pY2tuYW1lW2RhdGEtPmxlbmd0aC0xXSA9ICdcMCc7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJdTE2IHZhbDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChydHMtPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZQorCQl2YWwgPSBydHMtPnZhbHVlOworCisJaWYgKHZhbCAhPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkKKwkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSB2YWw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJcnRzLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA9PSBNQVhfUlRTX1RIUkVTSE9MRCk7CisJcnRzLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJdTE2IHZhbDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoZnJhZy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgfHwgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICB2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gdmFsOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKwlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOworCWZyYWctPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKKyNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1CitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCWVsc2UgaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSkKKwl7CisJICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIAllbHNlCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKworICAgIGlmIChlcnEtPmxlbmd0aCA+IDApCisJeworCQlpbnQga2V5SWR4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBNQVhfV0VQX0tFWV9TSVpFKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayBrZXkgaW5kZXggKi8KKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXcm9uZyBrZXlJZHg9JWQhIFVzaW5nIGRlZmF1bHQga2V5IGluc3RlYWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJZHgsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICAgICAgICAgIC8vVXNpbmcgZGVmYXVsdCBrZXkKKwkJCWtleUlkeCA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkOworICAgICAgICB9CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKKworCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJfQorCQllbHNlIGlmIChlcnEtPmxlbmd0aCA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCX0KKwkJZWxzZQorCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKworCQkvKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZighKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0cmEsIGVycS0+bGVuZ3RoKTsKKyAgICAgICAgfQorCX0KKyAgICBlbHNlCisJCQl7CisJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/ICovCisJCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgNCkpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQlpZighZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKK2RvbmU6CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjplcnEtPmZsYWdzPSV4XG4iLGVycS0+ZmxhZ3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkF1dGhNb2RlPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkRlZmF1bHRLZXlJZD0leCwgS2V5TGVuID0gJWRcbiIscEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OldlcFN0YXR1cz0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCXJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQoreworCWludCBraWQ7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWtpZCA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX2dpd2VuY29kZSAlZFxuIiwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkpOworCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwl7CisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisJZWxzZSBpZiAoKGtpZCA+IDApICYmIChraWQgPD00KSkKKwl7CisJCS8vIGNvcHkgd2VwIGtleQorCQllcnEtPmZsYWdzID0ga2lkIDsJCQkvKiBOQjogYmFzZSAxICovCisJCWlmIChlcnEtPmxlbmd0aCA+IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbikKKwkJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy9pZiAoKGtpZCA9PSBwQWRhcHRlci0+UG9ydENmZy5EZWZhdWx0S2V5SWQpKQorCQkvL2VycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKworCX0KKwllbHNlIGlmIChraWQgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vIGNvcHkgZGVmYXVsdCBrZXkgSUQKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+ZmxhZ3MgPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCArIDE7CQkJLyogTkI6IGJhc2UgMSAqLworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50CitydF9pb2N0bF9zZXRwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlcjsKKwlQT1NfQ09PS0lFIHBPYmo7CisJY2hhciAqdGhpc19jaGFyID0gZXh0cmE7CisJY2hhciAqdmFsdWU7CisJaW50ICBTdGF0dXM9MDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZGFwdGVyLT5PU19Db29raWU7CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCQlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoISp0aGlzX2NoYXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkgICAgKnZhbHVlKysgPSAwOworCisJaWYgKCF2YWx1ZSkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkvLyByZWplY3Qgc2V0dGluZyBub3RoaW5nIGJlc2lkZXMgQU5ZIHNzaWQoc3NpZExlbj0wKQorICAgIGlmICghKnZhbHVlICYmIChzdHJjbXAodGhpc19jaGFyLCAiU1NJRCIpICE9IDApKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWZvciAoUFJUTVBfUFJJVkFURV9TRVRfUFJPQyA9IFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0M7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MrKykKKwl7CisJICAgIGlmIChzdHJjbXAodGhpc19jaGFyLCBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lKSA9PSAwKQorCSAgICB7CisJICAgICAgICBpZighUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+c2V0X3Byb2MocEFkYXB0ZXIsIHZhbHVlKSkKKwkgICAgICAgIHsJLy9GQUxTRTpTZXQgcHJpdmF0ZSBmYWlsZWQgdGhlbiByZXR1cm4gSW52YWxpZCBhcmd1bWVudAorCQkJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgICAgICB9CisJCSAgICBicmVhazsJLy9FeGl0IGZvciBsb29wLgorCSAgICB9CisJfQorCisJaWYoUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSA9PSBOVUxMKQorCXsgIC8vTm90IGZvdW5kIGFyZ3VtZW50CisJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zZXRwYXJhbTo6IChpd3ByaXYpIE5vdCBTdXBwb3J0IFNldCBDb21tYW5kIFslcz0lc11cbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwl9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworCUlOVAkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAoZXh0cmEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisgICAgc3ByaW50ZihleHRyYSwgIlxuXG4iKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCSAgICAvL3NwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3Mgd2l0aG91dCByZXRyeSAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJeworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3Mgd2l0aG91dCByZXRyeSAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgLSAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisJfQorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgYWZ0ZXIgcmV0cnkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBmYWlsIHRvIFJjdiBBQ0sgYWZ0ZXIgcmV0cnkgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJUUyBTdWNjZXNzIFJjdiBDVFMgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJUUyBGYWlsIFJjdiBDVFMgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggd2l0aCBDUkMgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGRyb3AgZHVlIHRvIG91dCBvZiByZXNvdXJjZSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyKTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkdXBsaWNhdGUgZnJhbWUgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJGYWxzZSBDQ0EgKG9uZSBzZWNvbmQpICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCk7CisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCWlmIChwQWQtPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwkJZWxzZQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJeworICAgIAlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJXcGFTdXBwbGljYW50VVAgICAgICAgICAgICAgICAgID0gJWRcblxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCB3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordm9pZAlnZXRCYUluZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE91dEJ1ZikKK3sKKwlJTlQgaSwgajsKKwlCQV9PUklfRU5UUlkgKnBPcmlCQUVudHJ5OworCUJBX1JFQ19FTlRSWSAqcFJlY0JBRW50cnk7CisKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJaWYgKCgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJCXx8IChwRW50cnktPlZhbGlkQXNXRFMpIHx8IChwRW50cnktPlZhbGlkQXNNZXNoKSkKKwkJeworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIChBaWQgPSAlZCkgKEFQKSAtXG4iLAorICAgICAgICAgICAgICAgIHBPdXRCdWYsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW1JlY2lwaWVudF1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBSZWNCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbcEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIExhc3RJbmRTZXE9JWQsIFJlb3JkZXJpbmdQa3RzPSVkXG4iLCBwT3V0QnVmLCBqLCBwUmVjQkFFbnRyeS0+QkFXaW5TaXplLCBwUmVjQkFFbnRyeS0+TGFzdEluZFNlcSwgcFJlY0JBRW50cnktPmxpc3QucWxlbik7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiIsIHBPdXRCdWYpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tPcmlnaW5hdG9yXVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcE9yaUJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgU3RhcnRTZXE9JWQsIEN1clR4U2VxPSVkXG4iLCBwT3V0QnVmLCBqLCBwT3JpQkFFbnRyeS0+QkFXaW5TaXplLCBwT3JpQkFFbnRyeS0+U2VxdWVuY2UsIHBFbnRyeS0+VHhTZXFbal0pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG5cbiIsIHBPdXRCdWYpOworCQl9CisgICAgICAgIGlmIChzdHJsZW4ocE91dEJ1ZikgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitzdGF0aWMgaW50CitydF9wcml2YXRlX3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworICAgIElOVAkJCQlTdGF0dXMgPSAwOworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZDsKKwlQT1NfQ09PS0lFCQlwT2JqOworICAgIHUzMiAgICAgICAgICAgICBzdWJjbWQgPSB3cnEtPmZsYWdzOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwkJcEFkID0gZGV2LT5tbF9wcml2OworCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoZXh0cmEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisgICAgc3dpdGNoKHN1YmNtZCkKKyAgICB7CisKKyAgICAgICAgY2FzZSBTSE9XX0NPTk5fU1RBVFVTOgorICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDZW50cmFsQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGlmIChJTkZSQV9PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWQoQVA6ICVzWyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiU3NpZD0lcyAsU3NpZGxlbiA9ICVkXG4iLHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJZWxzZQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgc3ByaW50ZihleHRyYSwgIkRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIkNvbm5TdGF0dXMgaXMgbm90IGNvbm5lY3RlZFxuIikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0hPV19EUlZJRVJfVkVSSU9OOgorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkRyaXZlciB2ZXJzaW9uLSVzLCAlcyAlc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OLCBfX0RBVEVfXywgX19USU1FX18gKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGNhc2UgU0hPV19CQV9JTkZPOgorICAgICAgICAgICAgZ2V0QmFJbmZvKHBBZCwgZXh0cmEpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBTSE9XX0RFU0NfSU5GTzoKKwkJCXsKKwkJCQlTaG93X0Rlc2NJbmZvX1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PRkY6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPZmZcbiIpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09OOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gVFJVRTsKKyAgICAgICAgICAgIC8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT25cbiIpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgU0hPV19ETFNfRU5UUllfSU5GTzoKKwkJCXsKKwkJCQlTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQljYXNlIFNIT1dfQ0ZHX1ZBTFVFOgorCQkJeworCQkJCVN0YXR1cyA9IFJUTVBTaG93Q2ZnVmFsdWUocEFkLCB3cnEtPnBvaW50ZXIsIGV4dHJhKTsKKwkJCQlpZiAoU3RhdHVzID09IDApCisJCQkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0hPV19BREhPQ19FTlRSWV9JTkZPOgorCQkJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKHBBZCwgZXh0cmEpOworCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN1YmNtZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIFNJT0NTSVdNTE1FCitpbnQgcnRfaW9jdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBpd19tbG1lICpwTWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKXdycXUtPmRhdGEucG9pbnRlcjsKKwlNTE1FX1FVRVVFX0VMRU0JCQkJTXNnRWxlbTsKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QJRGlzQXNzb2NSZXE7CisJTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgIERlQXV0aFJlcTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKworCWlmIChwTWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChwTWxtZS0+Y21kKQorCXsKKyNpZmRlZiBJV19NTE1FX0RFQVVUSAorCQljYXNlIElXX01MTUVfREVBVVRIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlDT1BZX01BQ19BRERSKERlQXV0aFJlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRlQXV0aFJlcSwgc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKTsKKwkJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCSAgICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLworI2lmZGVmIElXX01MTUVfRElTQVNTT0MKKwkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCUNPUFlfTUFDX0FERFIoRGlzQXNzb2NSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJRGlzQXNzb2NSZXEuUmVhc29uID0gIHBNbG1lLT5yZWFzb25fY29kZTsKKworCQkJTXNnRWxlbS5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCU1zZ0VsZW0uTXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRpc0Fzc29jUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOworCQkJYnJlYWs7CisjZW5kaWYgLy8gSVdfTUxNRV9ESVNBU1NPQyAvLworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBVbmtub3cgQ29tbWFuZFxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKK2ludCBydF9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0tFWV9NR01UOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdFUCAxeAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IFRSVUU7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9LRVlfTUdNVCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKyAgICAgICAgICAgIC8qaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorCQkJeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfSovCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9QUklWQUNZX0lOVk9LRUQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJCX0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworCQkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKyAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWRlZmF1bHQ6CisgICAgCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOworCXJldHVybiAwOworfQorCit2b2lkIGZuU2V0Q2lwaGVyS2V5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAorICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQoreworICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBMRU5fVEtJUF9FSyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIGtleUlkeCwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOworCisgICAgaWYgKGJHVEspCisgICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAorICAgIAkJCQkJCQkgIEJTUzAsCisgICAgCQkJCQkJCSAga2V5SWR4LAorICAgIAkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisgICAgCQkJCQkJCSAgTlVMTCk7CisgICAgZWxzZQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0pOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQorCQkJeworICAgIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKyAgICBpbnQga2V5SWR4LCBhbGcgPSBleHQtPmFsZzsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKKwl7CisgICAgICAgIGtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAgICAgLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQorCSAgICBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgQlNTSURfV0NJRCk7CisgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKWtleUlkeCk7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpSZW1vdmUgYWxsIGtleXMhKGVuY29kaW5nLT5mbGFncyA9ICV4KVxuIiwgX19GVU5DVElPTl9fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbGcpIHsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX05PTkVcbiIsIF9fRlVOQ1RJT05fXykpOworICAgIAkJCWJyZWFrOworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJfQorICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworCisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkIHx8CisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJCQl7CisJCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwga2V5SWR4LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKworICAgIAkJCQkvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIAkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJfQorICAgIAkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBrZXlJZHgsIGV4dC0+a2V5X2xlbikpOworICAgICAgICAgICAgICAgIGlmIChleHQtPmtleV9sZW4gPT0gMzIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgICAgICAJICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICAgICAgICAgIAkvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICAgICAgCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAJICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkJZGVmYXVsdDoKKyAgICAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlQQ0hBUiBwS2V5ID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0XG4iKSk7CisKKwltYXhfa2V5X2xlbiA9IGVuY29kaW5nLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7CisJaWYgKG1heF9rZXlfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkKKwl7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4LS07CisKKwkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCWlmIChpZHggIT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlleHQtPmtleV9sZW4gPSAwOworCXN3aXRjaChwQWQtPlN0YUNmZy5XZXBTdGF0dXMpIHsKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiBtYXhfa2V5X2xlbikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOworCQkJCXBLZXkgPSAmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJCWVsc2UKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKworCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAzMjsKKwkJCQlwS2V5ID0gJnBBZC0+U3RhQ2ZnLlBNS1swXTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KQorCXsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQltZW1jcHkoZXh0LT5rZXksIHBLZXksIGV4dC0+a2V5X2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DU0lXR0VOSUUKK2ludCBydF9pb2N0bF9zaXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gTUFYX0xFTl9PRl9SU05JRSB8fAorCSAgICAod3JxdS0+ZGF0YS5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoKQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIGV4dHJhLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBNQVhfTEVOX09GX1JTTklFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKworaW50IHJ0X2lvY3RsX2dpd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCisJaWYgKChwQWQtPlN0YUNmZy5SU05JRV9MZW4gPT0gMCkgfHwKKwkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwl7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZmRlZiBTSU9DU0lXR0VOSUUKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKQorCQlyZXR1cm4gLUUyQklHOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJbWVtY3B5KGV4dHJhLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCVVDSEFSIFJTTkllID0gSUVfV1BBOworCisJCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IChwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyKSkgLy8gSUQsIExlbgorCQkJcmV0dXJuIC1FMkJJRzsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKKwkJCVJTTkllID0gSUVfUlNOOworCisJCWV4dHJhWzBdID0gKGNoYXIpUlNOSWU7CisJCWV4dHJhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCQltZW1jcHkoZXh0cmErMiwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3Bta3NhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOworCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCisJaWYgKHBQbWtzYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKKwlzd2l0Y2gocFBta3NhLT5jbWQpCisJeworCQljYXNlIElXX1BNS1NBX0ZMVVNIOgorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9SRU1PVkU6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkgICAgICAgIHsKKwkJICAgICAgICAJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRCwgMTYpOworCQkJCQlmb3IgKGlkeCA9IENhY2hlZElkeDsgaWR4IDwgKHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtIC0gMSk7IGlkeCsrKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5CU1NJRFswXSwgTUFDX0FERFJfTEVOKTsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLlBNS0lEWzBdLCAxNik7CisJCQkJCX0KKwkJCQkJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0tLTsKKwkJCSAgICAgICAgYnJlYWs7CisJCSAgICAgICAgfQorCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX1JFTU9WRVxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfQUREOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJCSAgICAgICAgYnJlYWs7CisJICAgICAgICB9CisKKwkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJICAgICAgICB7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOworCSAgICAgICAgfQorCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0FERFxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIFVua25vdyBDb21tYW5kISFcbiIpKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vICNpZiBXSVJFTEVTU19FWFQgPiAxNworCisjaWZkZWYgREJHCitzdGF0aWMgaW50CitydF9wcml2YXRlX2lvY3RsX2JicChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCisJCQl7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlID0gTlVMTDsKKwlVQ0hBUgkJCQlyZWdCQlAgPSAwOworLy8JQ0hBUgkJCQlhcmdbMjU1XT17MH07CisJVUlOVDMyCQkJCWJicElkOworCVVJTlQzMgkJCQliYnBWYWx1ZTsKKwlCT09MRUFOCQkJCWJJc1ByaW50QWxsQkJQID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKworCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJaWYgKHdycS0+bGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCQkJCXsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gd3JxLT5wb2ludGVyOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXNcbiIsIHRoaXNfY2hhcikpOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXMsIHZhbHVlPSVzXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQlpZiAoKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKSAmJiAoc3NjYW5mKHZhbHVlLCAiJXgiLCAmKGJicFZhbHVlKSkgPT0gMSkpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworCQkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQkgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKyAgICAJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisgICAgCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJfQorCWVsc2UKKwkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCituZXh0OgorCWlmIChiSXNQcmludEFsbEJCUCkKKwl7CisJCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKwkJZm9yIChiYnBJZCA9IDA7IGJicElkIDw9IDEzNjsgYmJwSWQrKykKKwkJeworCQkgICAgaWYgKHN0cmxlbihleHRyYSkgPj0gKElXX1BSSVZfU0laRV9NQVNLIC0gMTApKQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlggICAgIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisJCQlpZiAoYmJwSWQlNSA9PSA0KQorCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlxuIik7CisJCX0KKworICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1ydF9wcml2YXRlX2lvY3RsX2JicFxuXG4iKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorI2VuZGlmIC8vIERCRyAvLworCitpbnQgcnRfaW9jdGxfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisgICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKKyAgICAvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCisgICAgICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQorICAgICovCisgICAgaWYgKHJhdGUgPT0gLTEpCisgICAgeworCQkvL0F1dG8gUmF0ZQorCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKwkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGZpeGVkKQorICAgICAgICB7CisgICAgICAgIAlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisgICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKyAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKKyAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKyAgICBpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOworICAgIEhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOworICAgIF9fczMyIHJhbGlua3JhdGVbXSA9CisJezIsICA0LCAgIDExLCAgMjIsIC8vIENDSworCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KKwkxMywgMjYsICAgMzksICA1MiwgIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgIDUyLCAgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJMzksIDc4LCAgMTE3LCAxNTYsIDIzNCwgMzEyLCAzNTEsIDM5MCwJCQkJCQkJCQkJICAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTI3LCA1NCwgICA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLAkJCQkJCQkJCQkgIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMTQsIDI5LCAgIDQzLCAgNTcsICA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LCAgIDg3LCAxMTUsIDE3MywgMjMwLCAyNjAsIDI4OCwgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKworICAgIHJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkvc2l6ZW9mKF9fczMyKTsKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSAmJgorICAgICAgICAoSU5GUkFfT04ocEFkKSkgJiYKKyAgICAgICAgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8IChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpKQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKyAgICBlbHNlCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisgICAgeworLy8gICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMTYpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjMyKSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUykgKyA0OworICAgIGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCisgICAgaWYgKHJhdGVfaW5kZXggPCAwKQorICAgICAgICByYXRlX2luZGV4ID0gMDsKKworICAgIGlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CisKKyAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKyAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQoreworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLworI2lmZGVmIFNJT0NTSVdNTE1FCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21sbWUsCSAgICAgICAgLyogU0lPQ1NJV01MTUUgICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLworI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2l3YXBsaXN0LAkJICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KKyNpZmRlZiBTSU9DR0lXU0NBTgorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZW5kaWYgLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCQkgICAgLyogU0lPQ1NJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJCSAgICAvKiBTSU9DR0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd25pY2tuLAkJICAgIC8qIFNJT0NTSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCQkgICAgLyogU0lPQ0dJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCQkgICAgLyogU0lPQ1NJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCQkgICAgLyogU0lPQ0dJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmFnLAkJICAgIC8qIFNJT0NTSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJCSAgICAvKiBTSU9DR0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKyAgICAoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ1NJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwgICAgICAgICAvKiBTSU9DR0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2F1dGgsCQkgICAgLyogU0lPQ1NJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhdXRoLAkJICAgIC8qIFNJT0NHSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGVleHQsCQkvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3Bta3NhLCAgICAgICAgIC8qIFNJT0NTSVdQTUtTQSAgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0geworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMiAqLworI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCisjaWZkZWYgREJHCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfaW9jdGxfYmJwLCAvKiArIDB4MDMgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMyAqLworI2VuZGlmCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE4ICovCit9OworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0KK3sKKyNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcnRfcHJpdl9oYW5kbGVycywKKwkubnVtX3ByaXZhdGUJCT0gTihydF9wcml2X2hhbmRsZXJzKSwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpdnRhYiwKKwkubnVtX3ByaXZhdGVfYXJncwk9IE4ocHJpdnRhYiksCisjaWYgSVdfSEFORExFUl9WRVJTSU9OID49IDcKKyAgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorfTsKKworSU5UIFJUTVBTZXRJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnNzaWQ7CisgICAgUlRfODAyXzExX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgUGh5TW9kZTsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICBTdGFDb25maWc7CisgICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXM7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1ibGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIFBORElTXzgwMl8xMV9LRVkgICAgICAgICAgICAgICAgICAgIHBLZXkgPSBOVUxMOworICAgIFBORElTXzgwMl8xMV9XRVAJCQkgICAgICAgIHBXZXBLZXkgPU5VTEw7CisgICAgUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgICAgICAgICAgICAgcFJlbW92ZUtleSA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlnLCAqcENvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0VHlwZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3c7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gMDsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTLCBNYXhQaHlNb2RlID0gUEhZXzExRzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlclRlbXA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJT0lEX1NFVF9IVF9QSFlNT0RFCQkJCQlIVF9QaHlNb2RlOwkvLzExbiAsa2F0aHkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgUE5ESVNfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgcFBta0lkID0gTlVMTDsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhTdGF0ZSA9IEZBTFNFOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZW5hYmxlID0gMDsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQljdG1wOworI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLworCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5SVE1QU2V0SW5mb3JtYXRpb24oKSwJMHglMDh4XG4iLCBjbWQmMHg3RkZGKSk7CisgICAgc3dpdGNoKGNtZCAmIDB4N0ZGRikgeworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoIDwgc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworCQkJLy8gT25seSBhdmFsaWFibGUgd2hlbiBFRVBST00gbm90IHByb2dyYW1taW5nCisgICAgICAgICAgICBlbHNlIGlmICghKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4ODApICYmICEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTE9ORyAgIENvdW50cnk7CisgICAgICAgICAgICAgICAgVUNIQVIJVG1wUGh5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvdW50cnksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKShDb3VudHJ5ICYgMHgwMDAwMDBGRik7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpKChDb3VudHJ5ID4+IDgpICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgVG1wUGh5ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCQkJLy8gQnVpbGQgYWxsIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbgorCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gKEE6JWQgIEIvRzolZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLAorCQkJCSAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorICNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIE5vdyA9IGppZmZpZXM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLCBUeENudCA9ICVkIFxuIiwgcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQpKTsKKworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJLy9CZW5zb24gYWRkIDIwMDgwNTI3LCB3aGVuIHJhZGlvIG9mZiwgc3RhIGRvbid0IG5lZWQgdG8gc2NhbgorCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCQkJYnJlYWs7CisKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQl7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBzY2FubmluZyBub3cgISEhXG4iKSk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQlpZiAocEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPiAxMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisgICAgICAgICAgICBSVE1QX1NFVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlQQ0hBUiBwU3NpZFN0cmluZyA9IE5VTEw7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgICAgICAgICAgICAgIGlmIChTc2lkLlNzaWRMZW5ndGggPiBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAJaWYgKFNzaWQuU3NpZExlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIik7CisgICAgICAgICAgICAgICAgCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgICAgIAlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJCQkJCWlmIChwU3NpZFN0cmluZykKKwkJCQkJCXsKKwkJCQkJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBTc2lkLlNzaWQsIFNzaWQuU3NpZExlbmd0aCk7CisJICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpOworCQkJCQkJCWtmcmVlKHBTc2lkU3RyaW5nKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisKKwkJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyAhPSBSYWRpb1N0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyA9IFJhZGlvU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BIWV9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUGh5TW9kZSA8PSBNYXhQaHlNb2RlKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVkKVxuIiwgUGh5TW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTdGFDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFN0YUNvbmZpZy5FbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gU3RhQ29uZmlnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gMTsgLy8gMjAwMy0xMC0zMCBhbHdheXMgU0hPUlQgU0xPVCBjYXBhYmxlCisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gU3RhQ29uZmlnLkFkaG9jTW9kZSkgJiYKKwkJCQkJKFN0YUNvbmZpZy5BZGhvY01vZGUgPD0gTWF4UGh5TW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBkeW5hbWljIGNoYW5nZSBvZiAiVVNFIE9GRE0gcmF0ZSBvciBub3QiIGluIEFESE9DIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2V0dGluZyBjaGFuZ2VkLCBuZWVkIHRvIHJlc2V0IGN1cnJlbnQgVFggcmF0ZSBhcyB3ZWxsIGFzIEJFQUNPTiBmcmFtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgICAgIHsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IFN0YUNvbmZpZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgTWFrZUlic3NCZWFjb24ocEFkYXB0ZXIpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBBc2ljRW5hYmxlSWJzc1N5bmMocEFkYXB0ZXIpOyAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgKEJ1cnN0PSVkLCBQcm90ZWN0aW9uPSVsZCxTaG9ydFNsb3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFU0lSRURfUkFURVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFyeVJhdGVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVTSVJFRF9SQVRFUyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSApKTsKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2luZyBEZXNpcmVkUmF0ZSBtYXkgYWZmZWN0IHRoZSBNQVggVFggcmF0ZSB3ZSB1c2VkIHRvIFRYIGZyYW1lcyBvdXQKKyAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QUkVBTUJMRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlByZWFtYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlTG9uZykgfHwgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVBdXRvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCisgICAgICAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgdXBvbiBhc3NvY2lhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUgKD0lZClcbiIsIFByZWFtYmxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9XRVBfU1RBVFVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIFNpbmNlIFRLSVAsIEFFUywgV0VQIGFyZSBhbGwgc3VwcG9ydGVkLiBJdCBzaG91bGQgbm90IGhhdmUgYW55IGludmFsaWQgc2V0dGluZworICAgICAgICAgICAgICAgIGlmIChXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICE9IFdlcFN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyAoPSVkKVxuIixXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZBdXRoTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoQXV0aE1vZGUgPiBOZGlzODAyXzExQXV0aE1vZGVNYXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IEF1dGhNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IEF1dGhNb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICg9JWQpIFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzVHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFNb25pdG9yKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgID0gLUVJTlZBTDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUgKHVua25vd24pXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfV0VQOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9XRVBcbiIpKTsKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0tFWV9JTkRFWCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJCQlLZXlJZHggPSAqKE5ESVNfODAyXzExX0tFWV9JTkRFWCAqKSB3cnEtPnUuZGF0YS5wb2ludGVyOworCisJCQkJaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworCQkJCQlpZiAoS2V5SWR4ID49IDQpeworCQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKwkJCQkJfQorCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlM6CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOworICAgICAgICAgICAgcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXMgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworI2lmZGVmIFJUMjg3MAorCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZQk9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlT3RoZXI9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlQ2FuY2VsID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0UmVxID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5SZXE9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGUgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJbkNvbXBsZXRlRmFpbCA9IDA7CisjZW5kaWYgLy8gUlQyODcwIC8vCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChSdHNUaHJlc2ggPiBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IChVU0hPUlQpUnRzVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQgKD0lbGQpXG4iLFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAoPSVsZCkgXG4iLEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1BPV0VSX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkNBTSIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTWF4X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkZhc3RfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJMZWdhY3lfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1BPV0VSX01PREUgKD0lZClcbiIsUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAgPCBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyVGVtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUG93ZXJUZW1wID4gMTAwKQorCQkJCQlQb3dlclRlbXAgPSAweGZmZmZmZmZmOyAgLy8gQVVUTworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBQb3dlclRlbXA7IC8va2VlcCBjdXJyZW50IHNldHRpbmcuCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJfQorCSAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19UWVBFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZOZXRUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMURTKQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQik7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTI0KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQkdfTUlYRUQpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQSk7CisJCQkJZWxzZQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFICg9JWQpXG4iLE5ldFR5cGUpKTsKKwkJICAgIH0KKwkJCWJyZWFrOworICAgICAgICAvLyBGb3IgV1BBIFBTSyBQTUsga2V5CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9BRERfV1BBOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISEgW0F1dGhNb2RlICE9IFdQQVBTSy9XUEEyUFNLL1dQQU5PTkVdXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkgICAgIC8vIE9ubHkgZm9yIFdQQSBQU0sgbW9kZQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFJhQ29uZmlnIGFzIFBTSyBhZ2VudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfS0VZOgorICAgICAgICAgICAgcFJlbW92ZUtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwUmVtb3ZlS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFJlbW92ZUtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwUmVtb3ZlS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUTVBXUEFSZW1vdmVLZXlQcm9jKHBBZGFwdGVyLCBwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIFJlbW92ZSBXUEEgS2V5ISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gcFJlbW92ZUtleS0+S2V5SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleSlcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoS2V5SWRbJWRdIG91dCBvZiByYW5nZSlcbiIsIEtleUlkeCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBSZW1vdmVLZXktPktleUluZGV4LCBwUmVtb3ZlS2V5LT5MZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBSZW1vdmVLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIE5ldyBmb3IgV1BBCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BRERfS0VZOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QQWRkS2V5KHBBZGFwdGVyLCBwS2V5KTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcENvbmZpZyA9ICZDb25maWc7CisKKyAgICAgICAgICAgICAgICBpZiAoKHBDb25maWctPkJlYWNvblBlcmlvZCA+PSAyMCkgJiYgKHBDb25maWctPkJlYWNvblBlcmlvZCA8PTQwMCkpCisgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChVU0hPUlQpIHBDb25maWctPkJlYWNvblBlcmlvZDsKKworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChVU0hPUlQpIHBDb25maWctPkFUSU1XaW5kb3c7CisgICAgICAgICAgICAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKHBDb25maWctPkRTQ29uZmlnLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgICAgIC8vCisJCQkJLy8gU2F2ZSB0aGUgY2hhbm5lbCBvbiBNbG1lQXV4IGZvciBDbnRsT2lkUlRCc3NpZFByb2MgdXNlZC4KKwkJCQkvLworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAoQmVhY25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaD0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkJlYWNvblBlcmlvZCwgcENvbmZpZy0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREU6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkgICAgUE9JRF9TRVRfSFRfUEhZTU9ERQlwSFRQaHlNb2RlID0gJkhUX1BoeU1vZGU7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSFRfUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnBIVFBoeU1vZGUJKFBoeU1vZGUgPSAlZCxUcmFuc21pdE5vID0gJWQsIEh0TW9kZSA9CSVkLAlFeHRPZmZzZXQgPQklZCAsIE1DUyA9ICVkLCBCVyA9CSVkLAlTVEJDID0gJWQsIFNIT1JUR0kgPSAlZCkgXG4iLAorCQkJCXBIVFBoeU1vZGUtPlBoeU1vZGUsIHBIVFBoeU1vZGUtPlRyYW5zbWl0Tm8scEhUUGh5TW9kZS0+SHRNb2RlLHBIVFBoeU1vZGUtPkV4dE9mZnNldCwKKwkJCQlwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLAlwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZQk+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJCQlSVE1QU2V0SFQocEFkYXB0ZXIsCXBIVFBoeU1vZGUpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFKE1DUz0lZCxCVz0lZCxTR0k9JWQsU1RCQz0lZClcbiIsCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDKSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkc6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVTE9ORyBhcHNkIDsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXBzZCwgd3JxLT51LmRhdGEucG9pbnRlciwJd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXxCMzF+QjcJfAlCNn5CNQkgfAkgQjQJIHwJIEIzCSB8CUIyCSB8CUIxCSB8CSAgIEIwCQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfCBSc3ZkCXwgTWF4IFNQIExlbiB8IEFDX1ZPIHwgQUNfVkkgfCBBQ19CSyB8IEFDX0JFIHwgQVBTRAlDYXBhYmxlCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gKGFwc2QgJiAweDAwMDAwMDAxKSA/IFRSVUUgOglGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSAoKGFwc2QJJiAweDAwMDAwMDAyKSA+PiAxKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSAoKGFwc2QJJiAweDAwMDAwMDA0KSA+PiAyKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSAoKGFwc2QJJiAweDAwMDAwMDA4KSA+PiAzKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSAoKGFwc2QJJiAweDAwMDAwMDEwKSA+PiA0KQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoCT0gKFVDSEFSKSgoYXBzZAkmIDB4MDAwMDAwNjApID4+IDUpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkcgKGFwc2Q9MHglbHgsIEFQU0RDYXA9JWQsIFtCRSxCSyxWSSxWT109WyVkLyVkLyVkLyVkXSwJTWF4U1BMZW49JWQpXG4iLCBhcHNkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSwKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkssCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJLy8gRHJpdmVyIG5lZWRzCXRvIG5vdGlmeSBBUCB3aGVuIFBTTSBjaGFuZ2VzCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlCSE9IHBBZGFwdGVyLT5TdGFDZmcuUHNtKQorCQkJCXsKKwkJCQkJTWxtZVNldFBzbUJpdChwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKTsKKwkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlLAlUUlVFKTsKKwkJCQl9CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTSAoYkFQU0RGb3JjZVBvd2VyU2F2ZTolZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJQk9PTEVBTglvbGR2YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGU7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKG9sZHZhbHVlICYmCSFwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQkJCXsKKwkJCQkJaW50CWk7CisJCQkJCS8vIHRlYXIJZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCQkJZm9yCShpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy8gdGVhcglkb3duIHBlZXIgZGxzIHRhYmxlCWVudHJ5CisJCQkJCWZvcgkoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUlRfODAyXzExX0RMUwlEbHM7CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCQkJCVJUTVBNb3ZlTWVtb3J5KCZEbHMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJCQkmRGxzKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNIFxuIikpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfV01NOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1dNTSAoPSVkKQlcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkvLworCQkJLy8gU2V0IE5kaXNSYWRpb1N0YXRlT2ZmIHRvCVRSVUUsIGluc3RlYWQgb2YgY2FsbGVkCU1sbWVSYWRpb09mZi4KKwkJCS8vIExhdGVyIG9uLCBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYLT5OdW1iZXJPZkl0ZW1zIHNob3VsZCBiZQkwCisJCQkvLyB3aGVuCXF1ZXJ5IE9JRF84MDJfMTFfQlNTSURfTElTVC4KKwkJCS8vCisJCQkvLyBUUlVFOiAgTnVtYmVyT2ZJdGVtcwl3aWxsIHNldCB0bwkwLgorCQkJLy8gRkFMU0U6IE51bWJlck9mSXRlbXMJbm8gY2hhbmdlLgorCQkJLy8KKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPQlUUlVFOworCQkJLy8gU2V0IHRvIGltbWVkaWF0ZWx5IHNlbmQgdGhlIG1lZGlhIGRpc2Nvbm5lY3QJZXZlbnQKKwkJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzCT0gVFJVRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJXG4iKSk7CisKKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPQlDTlRMX0lETEUpCisJCQkJeworCQkJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUJYnVzeSwgcmVzZXQJTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkJCX0KKworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUsCisJCQkJCTAsCisJCQkJCU5VTEwpOworCisJCQkJU3RhdGVNYWNoaW5lVG91Y2hlZAk9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0lNTUVfQkFfQ0FQOgorCQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9CQUNBUF9TVFJVQykpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJT0lEX0JBQ0FQX1NUUlVDIE9yZGUgOworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmT3JkZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJaWYgKE9yZGUuUG9saWN5ID4gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoT3JkZS5Qb2xpY3kgPT0gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBPcmRlLkF1dG9CQTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOyAvLyB3ZSBvbmx5IHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCisJCQkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID4gTUFYX1JYX1JFT1JERVJCVUYpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gTUFYX1JYX1JFT1JERVJCVUY7CisKKwkJCQkJfQorCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihPcmRlLkF1dG9CQSA9ICVkKSAoUG9saWN5PSVkKShSZUJBV2luTGltaXQ9JWQpKFR4QkFXaW5MaW1pdD0lZCkoQXV0b01vZGU9JWQpXG4iLE9yZGUuQXV0b0JBLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3ksCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQscEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooTWltb1BzID0gJWQpKEFtc2R1RW5hYmxlID0gJWQpIChBbXNkdVNpemU9JWQpKE1wZHVEZW5zaXR5PSVkKVxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlLAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgU2V0IDo6IFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVQ0hBUgkJICAgICAgICBpbmRleDsKKwkJCQlPSURfQUREX0JBX0VOVFJZICAgIEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAgICAgKnBFbnRyeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoQkEuVElEID4gMTUpCisJCQkJeworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeQorCQkJCQkvL0FzIGFkLWhvYyBtb2RlLCBCQSBwYWlyIGlzIG5vdCBsaW1pdGVkIHRvIG9ubHkgQlNTSUQuIHNvIGFkZCB2aWEgT0lELgorCQkJCQlpbmRleCA9IEJBLlRJRDsKKwkJCQkJLy8gaW4gYWQgaG9jIG1vZGUsIHdoZW4gYWRkaW5nIEJBIHBhaXIsIHdlIHNob3VsZCBpbnNlcnQgdGhpcyBlbnRyeSBpbnRvIE1BQ0VudHJ5IHRvbworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgQkEuTUFDQWRkcik7CisJCQkJCWlmICghcEVudHJ5KQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBicmVhayBvbiBubyBjb25uZWN0aW9uLi0tLS06JXg6JXhcbiIsIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChCQS5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkgICAgaWYgKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gVFJVRSkKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSAweDEwOworCisJCQkJCQlCQU9yaVNlc3Npb25TZXRVcChwQWRhcHRlciwgcEVudHJ5LCBpbmRleCwgMCwgMTAwLCBUUlVFKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5KHBBZGFwdGVyLCBwRW50cnktPkFpZCwgQkEuTUFDQWRkciwgMCwgMHhmZmZmLCBCQS5USUQsIEJBLm5NU0RVLCBCQS5Jc1JlY2lwaWVudCk7CisJCQkJCX0KKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIFJlYyA9ICVkLiBNYWMgPSAleDoleDoleDoleDoleDoleCAuIFxuIiwKKwkJCQkJCUJBLklzUmVjaXBpZW50LCBCQS5NQUNBZGRyWzBdLCBCQS5NQUNBZGRyWzFdLCBCQS5NQUNBZGRyWzJdLCBCQS5NQUNBZGRyWzJdCisJCQkJCQksIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUE9JRF9BRERfQkFfRU5UUlkJcEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisJCQkJcEJBID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCQkJCWlmIChwQkEgPT0gTlVMTCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBrbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIikpOworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQShUSUQ9JWQsIGJBbGxUaWQ9JWQpXG4iLCBwQkEtPlRJRCwgcEJBLT5iQWxsVGlkKSk7CisKKwkJCQkJaWYgKCFwQkEtPmJBbGxUaWQgJiYgKHBCQS0+VElEID4gTlVNX09GX1RJRCkpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0VcbiIpKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+cEVudHJ5XG4iKSk7CisJCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgRkFMU0UsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKCBwQWRhcHRlciwgKFVDSEFSKXBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJa2ZyZWUocEJBKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBGb3IgV1BBX1NVUFBMSUNBTlQgdG8gc2V0IHN0YXRpYyB3ZXAga2V5CisgICAgCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgorICAgIAkgICAgcFdlcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAJICAgIGlmKHBXZXBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdlcEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAobGVuZ3RoIG1pc21hdGNoKSEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCSAgICAgICAgS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgIC8vIEtleUlkeCBtdXN0IGJlIDAgfiAzCisgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDQpCisgICAgCQkJeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAoS2V5SWR4IG11c3QgYmUgc21hbGxlciB0aGFuIDQpISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgQ2lwaGVyQWxnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIEtleTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBXZXBLZXktPktleUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIG9ubHkgc3VwcG9ydCBDSVBIRVJfV0VQNjQobGVuOjUpICYgQ0lQSEVSX1dFUDEyOChsZW46MTMpISFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZCA9IEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSAmJgorCQkJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwkJCQkJeworCQkJCQkJS2V5ID0gcFdlcEtleS0+S2V5TWF0ZXJpYWw7CisKKwkJCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworICAgIAkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisKKyAgICAgICAgCQkJCS8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgIAkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisgICAgCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAgKGlkPTB4JXgsIExlbj0lZC1ieXRlKSwgJXNcbiIsIHBXZXBLZXktPktleUluZGV4LCBwV2VwS2V5LT5LZXlMZW5ndGgsIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/ICJQb3J0IFNlY3VyZWQiOiJQb3J0IE5PVCBTZWN1cmVkIikpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBXZXBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICBjYXNlIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTIGJCbG9ja0Fzc29jPSVzXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID8gIlRSVUUiOiJGQUxTRSIpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZ3cGFfc3VwcGxpY2FudF9lbmFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgCQkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSB3cGFfc3VwcGxpY2FudF9lbmFibGU7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICAqcEluZm87CisJCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAgICAgICAgICAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopIE1zZ0VsZW0tPk1zZzsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwSW5mbywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZGFwdGVyLCBNc2dFbGVtKTsKKwkJCQlrZnJlZShNc2dFbGVtKTsKKworICAgICAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT04gKFJlYXNvbj0lZClcbiIsIHBJbmZvLT5SZWFzb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworCQkJCXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVg6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4U3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBJRUVFODAyMXhTdGF0ZTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAoPSVkKVxuIiwgSUVFRTgwMjF4U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCSBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICglZClcbiIsIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzKSk7CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BNS0lEOgorCSAgICAgICAgcFBta0lkID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCSAgICAgICAgaWYocFBta0lkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFBta0lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJICAgICAgICAvLyBjaGVjayB0aGUgUE1LSUQgaW5mb3JtYXRpb24KKwkgICAgICAgIGlmIChwUG1rSWQtPkJTU0lESW5mb0NvdW50ID09IDApCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICBQQlNTSURfSU5GTwlwQnNzSWRJbmZvOworCQkgICAgICAgIFVJTlQJCUJzc0lkeDsKKwkJICAgICAgICBVSU5UCQlDYWNoZWRJZHg7CisKKwkJICAgICAgICBmb3IgKEJzc0lkeCA9IDA7IEJzc0lkeCA8IHBQbWtJZC0+QlNTSURJbmZvQ291bnQ7IEJzc0lkeCsrKQorCQkgICAgICAgIHsKKwkJCSAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGluZGV4ZWQgQlNTSURfSU5GTyBzdHJ1Y3R1cmUKKwkJCSAgICAgICAgcEJzc0lkSW5mbyA9IChQQlNTSURfSU5GTykgKChQVUNIQVIpIHBQbWtJZCArIDIgKiBzaXplb2YoVUlOVCkgKyBCc3NJZHggKiBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICAvLyBGaW5kIHRoZSBlbnRyeSBpbiB0aGUgc2F2ZWQgZGF0YSBiYXNlLgorCQkJICAgICAgICBmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwQnNzSWRJbmZvLT5CU1NJRCwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKSkKKwkJCQkJICAgICAgICBicmVhazsKKwkJCSAgICAgICAgfQorCisJCQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJCQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bSsrOworCQkJICAgICAgICB9CisJCQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkJCSAgICAgICAgZWxzZQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBCc3NJZEluZm8tPkJTU0lEWzVdICUgUE1LSURfTk8pOworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICB9CisJCSAgICAgICAgfQorCQkJfQorCQkJaWYocFBta0lkKQorCQkJCWtmcmVlKHBQbWtJZCk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkLCBTaG9ydFJldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0LCBTaG9ydFJldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSZXRyeUxpbWl0PSAlZCxMb25nUmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCwgTG9uZ1JldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFXG4iKSk7CisJCQlwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCS8vcEtleSA9ICZXZXBLZXk7CisKKwkJCWlmICggcEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUsIEZhaWxlZCEhXG4iKSk7CisJCQl9CisJCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInBLZXktPktleUluZGV4ID0lZCwgcEtleS0+S2V5TGVuZ3RoPSVkXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisKKwkJCS8vIGl0IGlzIGEgc2hhcmVkIGtleQorCQkJaWYgKEtleUlkeCA+IDQpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisJCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKwkJCQl9CisJCQkJLy9SZXN0YXJ0QVBJc1JlcXVpcmVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmY3RtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlzcHJpbnRmKCZjdG1wLCIlZCIsIGN0bXApOworCQkJCVNldF9DaGFubmVsX1Byb2MocEFkYXB0ZXIsICZjdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisKKworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBSVE1QUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVggICAgICAgICAgICpwQnNzaWRMaXN0ID0gTlVMTDsKKyAgICBQTkRJU19XTEFOX0JTU0lEX0VYICAgICAgICAgICAgICAgICBwQnNzOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgKnBDb25maWd1cmF0aW9uID0gTlVMTDsKKyAgICBSVF84MDJfMTFfTElOS19TVEFUVVMgICAgICAgICAgICAgICAqcExpbmtTdGF0dXMgPSBOVUxMOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgICpwU3RhQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9TVEFUSVNUSUNTICAgICAgICAgICAgICAqcFN0YXRpc3RpY3MgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtVHlwZTsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU19NRURJQV9TVEFURSAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NCdWZTaXplLCB1bEluZm89MCwgTmV0d29ya1R5cGVMaXN0WzRdLCBhcHNkID0gMDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgPSBOVUxMLCBwUHRyOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQYWRkaW5nID0gMDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworCVVDSEFSCWRyaXZlclZlcnNpb25bOF07CisgICAgT0lEX1NFVF9IVF9QSFlNT0RFCQkJICAgICAgICAqcEhUUGh5TW9kZSA9IE5VTEw7CisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCS8vZm9yIHNubXAsIGthdGh5CisJRGVmYXVsdEtleUlkeFZhbHVlCQkJKnBLZXlJZHhWYWx1ZTsKKwlJTlQJCQkJCQkJdmFsdWVMZW47CisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJdG1wWzY0XTsKKyNlbmRpZiAvL1NOTVAKKworICAgIHN3aXRjaChjbWQpCisgICAgeworICAgICAgICBjYXNlIFJUX09JRF9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihTVEFfTklDX0RFVklDRV9OQU1FKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBTVEFfTklDX0RFVklDRV9OQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1ZFUlNJT05fSU5GTzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfVkVSU0lPTl9JTkZPIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gOCpzaXplb2YoVUNIQVIpOworCQkJc3ByaW50ZigmZHJpdmVyVmVyc2lvblswXSwgIiVzIiwgU1RBX0RSSVZFUl9WRVJTSU9OKTsKKwkJCWRyaXZlclZlcnNpb25bN10gPSAnXDAnOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZHJpdmVyVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQljYXNlIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UMzIpOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVDoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJLyoKKyAgICAgICAgICAgIAkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorICAgICAgICAgICAgCSAqLworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKFN0aWxsIHNjYW5uaW5nKVxuIikpOworCQkJCXJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoJWQgQlNTIHJldHVybmVkKVxuIixwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikpOworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisgICAgICAgICAgICAvLyBDbGFjdWxhdGUgdG90YWwgYnVmZmVyIHNpemUgcmVxdWlyZWQKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgPSBzaXplb2YoVUxPTkcpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBbGlnbiBwb2ludGVyIHRvIDQgYnl0ZXMgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgLy9QYWRkaW5nID0gNCAtIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgLy9pZiAoUGFkZGluZyA9PSA0KQorICAgICAgICAgICAgICAgIC8vICAgIFBhZGRpbmcgPSAwOworICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9yIHNhZmV0eSBpc3N1ZSwgd2UgYWRkIDI1NiBieXRlcyBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gMjU2OworICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHNhbWUgc2l6ZSBhcyBwYXNzZWQgZnJvbSBoaWdoZXIgbGF5ZXIKKyAgICAgICAgICAgIHBCdWYgPSBrbWFsbG9jKEJzc0J1ZlNpemUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBCdWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW5pdCA4MDJfMTFfQlNTSURfTElTVF9FWCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBCdWYsIEJzc0J1ZlNpemUpOworICAgICAgICAgICAgcEJzc2lkTGlzdCA9IChQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCkgcEJ1ZjsKKyAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJ1ZmZlciBsZW5ndGgKKyAgICAgICAgICAgIEJzc0xlbiA9IDQ7IC8vIENvbnNpc3Qgb2YgTnVtYmVyT2ZJdGVtcworICAgICAgICAgICAgLy8gUG9pbnQgdG8gc3RhcnQgb2YgTkRJU19XTEFOX0JTU0lEX0VYCisgICAgICAgICAgICAvLyBwUHRyID0gcEJ1ZiArIHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBwUHRyID0gKFBVQ0hBUikgJnBCc3NpZExpc3QtPkJzc2lkWzBdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzcyA9IChQTkRJU19XTEFOX0JTU0lEX0VYKSBwUHRyOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5NYWNBZGRyZXNzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IaWRkZW4gPT0gMSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID09IEZBTFNFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vCisJCQkJCS8vIFdlIG11c3QgcmV0dXJuIHRoaXMgU1NJRCBkdXJpbmcgNHdheSBoYW5kc2hha2luZywgb3RoZXJ3aXNlIEFlZ2lzIHdpbGwgZmFpbGVkIHRvIHBhcnNlIFdQQSBpbmZvbWF0aW9uCisJCQkJCS8vIGFuZCB0aGVuIGZhaWxlZCB0byBzZW5kIEVBUE9sIGZhcmFtZS4KKwkJCQkJLy8KKwkJCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKQorCQkJCQl7CisJCQkJCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJCQkJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgICAgIAlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5Qcml2YWN5ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUHJpdmFjeTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Sc3NpID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgICAgICBwQnNzLT5OZXR3b3JrVHlwZUluVXNlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF0aW1XaW47CisKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCwgcEJzcy0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJQlNTOworCisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGUsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGVMZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyksIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyICs9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5MZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICAgICAgaWYgKChCc3NMZW4gKyBwQnNzLT5MZW5ndGgpIDwgd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbHNlCisgICAgICAgICAgICBpZiAoQnNzTGVuID4gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2VuZGlmCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEJzc2lkTGlzdCwgQnNzTGVuKTsKKyAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTX01FRElBX1NUQVRFKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWVkaWFTdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEKD1FTVBUWSlcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PVENPTk47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KFNzaWQuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCW1lbWNweShTc2lkLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwJU3NpZC5Tc2lkTGVuZ3RoKTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU3NpZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCwgc3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCxTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVM6CisgICAgICAgICAgICBwTGlua1N0YXR1cyA9IChSVF84MDJfMTFfTElOS19TVEFUVVMgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBMaW5rU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DdXJyVHhSYXRlID0gUmF0ZUlkVG81MDBLYnBzW3BBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlXTsgICAvLyB1bml0IDogNTAwIGticHMKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q2hhbm5lbFF1YWxpdHkgPSBwQWRhcHRlci0+TWxtZS5DaGFubmVsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+UnhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlR4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworICAgICAgICAJCXBMaW5rU3RhdHVzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBMaW5rU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBMaW5rU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVU1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBwQ29uZmlndXJhdGlvbiA9IChORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW47CisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgcENvbmZpZ3VyYXRpb24tPkRTQ29uZmlnKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDb25maWd1cmF0aW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oQmVhY29uUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2hhbm5lbD0lZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QsIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlrZnJlZShwQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMDoKKwkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjApICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzAoMHg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzE6CisJCQlpZiAoKHBBZGFwdGVyLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aAk+IDEpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEoMHg9JWx4KVxuIix1bEluZm8pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMShwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxPSVkKVxuIixwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JTU0lfVFJJR0dFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlNTSV9UUklHR0VSKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfUlNTSToKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0k6CisJCQl1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUlNTSV8xOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TVEFUSVNUSUNTOgorICAgICAgICAgICAgcFN0YXRpc3RpY3MgPSAoTkRJU184MDJfMTFfU1RBVElTVElDUyAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGF0aXN0aWNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1MgXG4iKSk7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIGNvdW50ZXJzCisJCQkgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBjYWxjdWxhdGlvbiBvZiBzdWNlc3NmdWwgY291bnQKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPCBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RmFpbGVkQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworI2lmZGVmIERCRworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCAvIDEwMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YXRpc3RpY3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YXRpc3RpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1Moa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX09LOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBwU3RhQ29uZmlnID0gKFJUXzgwMl8xMV9TVEFfQ09ORklHICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGFDb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJR1xuIikpOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR4QnVyc3QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR1cmJvUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlQkdQcm90ZWN0aW9uID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlU2hvcnRTbG90VGltZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWU7CisgICAgICAgICAgICAgICAgLy9wU3RhQ29uZmlnLT5BZGhvY01vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Id1JhZGlvU3RhdHVzID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gPT0gVFJVRSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Sc3YxID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5TeXN0ZW1FcnJvckJpdG1hcCA9IHBBZGFwdGVyLT5TeXN0ZW1FcnJvckJpdG1hcDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGFDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIFJ0c1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJ0c1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQoPSVsZClcbiIsIFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIEZyYWdUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9PSBUUlVFKQorICAgICAgICAgICAgICAgIEZyYWdUaHJlc2ggPSAwOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEZyYWdUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQoPSVsZClcbiIsIEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIFBvd2VyTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQb3dlck1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQb3dlck1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFKD0lZClcbiIsIFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIFJhZGlvU3RhdGUgPSAoQk9PTEVBTikgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbzsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSYWRpb1N0YXRlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUlCU1M7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX01PTklUT1IpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFNb25pdG9yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExQXV0b1Vua25vd247CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCc3NUeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQnNzVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUoPSVkKVxuIiwgQnNzVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIFByZWFtVHlwZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQcmVhbVR5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQcmVhbVR5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSg9JWQpXG4iLCBQcmVhbVR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIEF1dGhNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihBdXRoTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSg9JWQpXG4iLCBBdXRoTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoV2VwU3RhdHVzKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyg9JWQpXG4iLCBXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCAleFxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRDoKKwkJCWlmICgocEFkYXB0ZXItPlJmSWNUeXBlCT09IFJGSUNfMjg1MCkgfHwgKHBBZGFwdGVyLT5SZkljVHlwZSA9PQlSRklDXzI3NTApKQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDM7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMworCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJCU5ldHdvcmtUeXBlTGlzdFszXSA9IE5kaXM4MDJfMTFPRkRNNTsgICAvLyBOZXR3b3JrVHlwZVszXSA9IDExYQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMgorCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDEyOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURURcbiIpKTsKKwkJCQlicmVhazsKKwkgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNNTsKKwkJCWVsc2UgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQkdfTUlYRUQpIHx8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCWVsc2UKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExRFM7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0UnhSYXRlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURSAoPSVsZClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEU6CisJCQkvL3VsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFR4UmF0ZTsKKwkJCXVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFICg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkVlcHJvbVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMICg9JWQpXG4iLCBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfRVhUUkFfSU5GTzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FeHRyYUluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPICg9JWxkKVxuIiwgcEFkYXB0ZXItPkV4dHJhSW5mbykpOworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVCk7CisJICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ3ZV92ZXJzaW9uX2NvbXBpbGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkc6CisJCQlhcHNkID0gKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA8PCAxKSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPDwgMikKKwkJCQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPDwgMykJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPIDw8IDQpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPDwgNSkpOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhcHNkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HICg9MHglbHgsQVBTRENhcD0lZCxBQ19CRT0lZCxBQ19CSz0lZCxBQ19WST0lZCxBQ19WTz0lZCxNQVhTUExlbj0lZClcbiIsCisJCQkJYXBzZCxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8scEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfV01NOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfV01NICg9JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQlicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGNhc2UgUlRfT0lEX05FV19EUklWRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUNIQVIgZW5hYmxlZCA9IDE7CisgICAgCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmVuYWJsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9ORVdfRFJJVkVSICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgICAgIGNhc2UgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBBZGFwdGVyLT5TdGFDZmcuZGV2X25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKworICAgIAkJCXBIVFBoeU1vZGUtPkV4dE9mZnNldCA9ICgocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkgPyAoRVhUQ0hBX0JFTE9XKSA6IChFWFRDSEFfQUJPVkUpKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKKyAgICAgICAgICAgIHVsSW5mbyA9ICh1bEluZm8gPDwgOCl8KHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAgICAgICAgIGkgPSAwOworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorICAgICAgICAgICAgaSA9IDE7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZpLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCg9JWQpIFxuIiwgaSkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IE1hbnVmYWN0dXJlck9VSV9MRU47CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihSZXNvdXJjZVR5cGVJZE5hbWUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFJlc291cmNlVHlwZUlkTmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgXG4iKSk7CisJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHN1cHBvcnQgd2VwIGVsc2UgMiBpcyBub3Qgc3VwcG9ydC4KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUgXG4iKSk7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Qc20gPT0gUFNNUF9BQ1RJT04pCisJCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBwb3dlciBhY3RpdmUgZWxzZSAyIGlzIHBvd2VyIHNhdmUuCisJCQllbHNlCisJCQkJdWxJbmZvID0gMjsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUgXG4iKSk7CisJCQkvL0tleUlkeFZhbHVlLktleUlkeCA9IHBBZC0+UG9ydENmZy5NQlNTSURbcEFkLT5Jb2N0bElGXS5EZWZhdWx0S2V5SWQ7CisJCQlwS2V5SWR4VmFsdWUgPSB3cnEtPnUuZGF0YS5wb2ludGVyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJLZXlJZHhWYWx1ZS5LZXlJZHggPSAlZCwgXG4iLHBLZXlJZHhWYWx1ZS0+S2V5SWR4KSk7CisJCQl2YWx1ZUxlbiA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBLZXlJZHhWYWx1ZS0+VmFsdWUsCisJCQkJCQkgICAmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICAgdmFsdWVMZW4pOworCQkJcEtleUlkeFZhbHVlLT5WYWx1ZVt2YWx1ZUxlbl09J1wwJzsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKERlZmF1bHRLZXlJZHhWYWx1ZSk7CisKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwS2V5SWR4VmFsdWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRlZmF1bHRLZXlJZCA9ICVkLCB0b3RhbCBsZW4gPSAlZCwgc3RyIGxlbj0lZCwgS2V5VmFsdWU9ICUwMnggJTAyeCAlMDJ4ICUwMnggXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleVswXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlkID0lZCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEggXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCQkJCQkmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJCQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJU2hvcnRSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZFxuIiwgU2hvcnRSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJTG9uZ1JldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxvbmdSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdD0lZFxuIiwgTG9uZ1JldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BST0RVQ1RJRCBcbiIpKTsKKworI2lmZGVmIFJUMjg3MAorCQkJc3ByaW50Zih0bXAsICIlMDR4ICUwNHhcbiIsICgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cFVzYl9EZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgLCgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cFVzYl9EZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKHRtcCk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgdG1wLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2YgVUNIQVI9JWQsIGNoYW5uZWw9JWQgXG4iLCBzaXplb2YoVUNIQVIpLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vU05NUF9TVVBQT1JUCisKKwkJY2FzZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVg6CisJCQl7CisJCQkJVUNIQVIgdmFsdWU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWCBcbiIpKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAxOworI2Vsc2UKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEb2Vzbid0IHN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdmFsdWUsIDEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIX0xJU1Q6CisJCQl7CisJCQkJUFJUX0NIQU5ORUxfTElTVF9JTkZPIHBDaExpc3RCdWY7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hfTElTVCBcbiIpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtID09IDApCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmID0gKFJUX0NIQU5ORUxfTElTVF9JTkZPICopIGttYWxsb2Moc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCWlmIChwQ2hMaXN0QnVmID09IE5VTEwpCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwkJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3RbaV0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbDsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDaExpc3RCdWYsIHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTykpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisKKwkJCQlpZiAocENoTGlzdEJ1ZikKKwkJCQkJa2ZyZWUocENoTGlzdEJ1Zik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAyOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCAyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5HZW9ncmFwaHksIDEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMUzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMUyg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNOgorCQkJeworCQkJCVBSVF84MDJfMTFfRExTX0lORk8JcERsc0luZm8gPSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAocERsc0luZm8gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJnBEbHNJbmZvLT5FbnRyeVtpXSwgJnBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0sIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJfQorCisJCQkJcERsc0luZm8tPm51bSA9IE1BWF9OVU1fT0ZfRExTX0VOVFJZOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwRGxzSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU1cbiIpKTsKKworCQkJCWlmIChwRGxzSW5mbykKKwkJCQkJa2ZyZWUocERsc0luZm8pOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlWSVJUVUFMX0FEQVBURVIJCSpwVmlydHVhbEFkID0gTlVMTDsKKwlSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBOVUxMOworCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVTSE9SVAkJCQlzdWJjbWQ7CisKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCSAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQorCSAgICB7CisJCSAgICByZXR1cm4gU3RhdHVzOworCSAgICB9CisKKwkgICAgaWYgKHN0cnN0cih3cnEtPnUuZGF0YS5wb2ludGVyLCAiT3BNb2RlIikgPT0gTlVMTCkKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCSAgICByZXR1cm4gLUVORVRET1dOOworICAgICAgICB9CisgICAgfQorCisJewkvLyBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuCisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKwkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwlzd2l0Y2goY21kKQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJY2FzZSBSVFBSSVZfSU9DVExfQVRFOgorCQkJeworCQkJCVJ0bXBEb0F0ZShwQWQsIHdycSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKKwkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV05BTUU6CisgICAgICAgIHsKKyAgICAgICAgCWNoYXIgKm5hbWU9JndycS0+dS5uYW1lWzBdOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0VTU0lEOiAgLy9HZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV0VTU0lEOiAgLy9TZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50CSplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQorCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0ZSRVE6ICAgLy8gZ2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05JQ0tOOiAvL3NldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTklDS046IC8vZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdSQVRFOiAgIC8vZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkJICAgIHJ0X2lvY3RsX2dpd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBTSU9DU0lXUkFURTogIC8vc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkgICAgICAgIHJ0X2lvY3RsX3Npd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSU9DR0lXUlRTOiAgLy8gZ2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9naXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV1JUUzogIC8vc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0ZSQUc6ICAvL2dldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdFTkNPREU6ICAvL2dldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9naXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRU5DT0RFOiAgLy9zZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0FQOiAgICAgLy9nZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdNT0RFOiAgIC8vZ2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdNT0RFOiAgIC8vc2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCisJCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFJUX1BSSVZfSU9DVEw6CisJCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsKKwkJCWlmKCBzdWJjbWQgJiBPSURfR0VUX1NFVF9UT0dHTEUpCisJCQkJU3RhdHVzID0gUlRNUFNldEluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQllbHNlCisJCQkJU3RhdHVzID0gUlRNUFF1ZXJ5SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdQUklWOgorCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCisJCQl7CisJCQkJaWYgKCBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YocHJpdnRhYikpICE9IFRSVUUpCisJCQkJCWJyZWFrOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKKwkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfU0VUOgorCQkJaWYoYWNjZXNzX29rKFZFUklGWV9SRUFELCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpICE9IFRSVUUpCisJCQkJYnJlYWs7CisJCQlydF9pb2N0bF9zZXRwYXJhbShuZXRfZGV2LCBOVUxMLCBOVUxMLCB3cnEtPnUuZGF0YS5wb2ludGVyKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWToKKwkJCVJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkocEFkLCB3cnEpOworCQkgICAgYnJlYWs7CisjaWZkZWYgREJHCisJCWNhc2UgUlRQUklWX0lPQ1RMX01BQzoKKwkJCVJUTVBJb2N0bE1BQyhwQWQsIHdycSk7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfRTJQOgorCQkJUlRNUElvY3RsRTJQUk9NKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERCRyAvLworICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgorICAgICAgICAgICAgICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwl9CisKKyAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU1NJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisKKyAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgIHsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisgICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKKyAgICAgICAgeworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKKwkJICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJfQorICAgICAgICBwU3NpZCA9ICZTc2lkOworCisgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICB7CisgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisKKyAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKKyAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7CisKKyAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworCisgICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCisjaWZkZWYgV01NX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCWJXbW1DYXBhYmxlOworCisJYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChiV21tQ2FwYWJsZSA9PSAxKQorI2lmZGVmIFJUMjg3MAorCQkmJiAocEFkLT5OdW1iZXJPZlBpcGVzID49IDUpCisjZW5kaWYgLy8gUlQyODcwIC8vCisJCSkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCWVsc2UgaWYgKGJXbW1DYXBhYmxlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XbW1DYXBhYmxlX1Byb2M6OihiV21tQ2FwYWJsZT0lZClcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBOZXR3b3JrIFR5cGUoSW5mcmFzdHJ1Y3R1cmUvQWRob2MgbW9kZSkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVJTlQzMglWYWx1ZSA9IDA7CisKKyAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KElORlJBKVxuIikpOworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIk1vbml0b3IiKSA9PSAwKQorICAgIHsKKwkJVUNIQVIJYmJwVmFsdWUgPSAwOworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKyAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCS8vIGRpc2FibGUgYWxsIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUKKwkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOworCQkvLyByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lCisJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7CisgICAgICAgIH0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlICY9IDB4ZmZmZmZmZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9CRUxPVykKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCB1cHBlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlIHw9IDB4MTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSB8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCS8vIDIwTUh6CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQl9CisJCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgMHgzKTsKKwkJLy8gQVNJQyBzdXBwb3JzdHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLgorCQkvL1JUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCS8vVmFsdWUgfD0gKDB4ODApOworCQkvL1JUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCS8vIGRpc2FibGUgc3luYworCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisKKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX01PTklUT1I7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTTsgLy9BUlBIUkRfSUVFRTgwMjExOyAvLyBJRUVFODAyMTEKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTU9OSVRPUilcbiIpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBdXRoZW50aWNhdGlvbiBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXBhdXRvIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiT1BFTiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAib3BlbiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAic2hhcmVkIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYXBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3Bhbm9uZSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTJwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTIiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BdXRoTW9kZV9Qcm9jOjooQXV0aE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRW5jcnlwdGlvbiBUeXBlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIk5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm5vbmUiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInRraXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkFFUyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiYWVzIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9FbmNyeXBUeXBlX1Byb2M6OihFbmNyeXBUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBEZWZhdWx0IEtleSBJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeDsKKworICAgIEtleUlkeCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisgICAgaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9EZWZhdWx0S2V5SURfUHJvYzo6KERlZmF1bHRLZXlJRD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTEKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTMKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVk0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdQQSBQU0sga2V5CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAga2V5TWF0ZXJpYWxbNDBdOworCisgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKyAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dQQVBTS19Qcm9jOjooV1BBUFNLPSVzKVxuIiwgYXJnKSk7CisKKyAgICBOZGlzWmVyb01lbW9yeShrZXlNYXRlcmlhbCwgNDApOworCisgICAgaWYgKChzdHJsZW4oYXJnKSA8IDgpIHx8IChzdHJsZW4oYXJnKSA+IDY0KSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBmYWlsZWQhIShXUEFQU0s9JXMpLCBXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyBcbiIsIGFyZykpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHN0cmxlbihhcmcpID09IDY0KQorICAgIHsKKyAgICAgICAgQXRvSChhcmcsIGtleU1hdGVyaWFsLCAzMik7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBhc3N3b3JkSGFzaCgoY2hhciAqKWFyZywgcEFkYXB0ZXItPk1sbWVBdXguU3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguU3NpZExlbiwga2V5TWF0ZXJpYWwpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICB9CisKKworCisgICAgaWYocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyAmJgorICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICB7CisgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUG93ZXIgU2F2aW5nIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICB7CisgICAgICAgIGlmICgoc3RyY21wKGFyZywgIk1heF9QU1AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJtYXhfcHNwIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAiTUFYX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkZhc3RfUFNQIikgPT0gMCkgfHwKKwkJCQkgKHN0cmNtcChhcmcsICJmYXN0X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiRkFTVF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJMZWdhY3lfUFNQIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJsZWdhY3lfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJMRUdBQ1lfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRGVmYXVsdCBOZGlzODAyXzExUG93ZXJNb2RlQ0FNCisgICAgICAgICAgICAvLyBjbGVhciBQU00gYml0IGltbWVkaWF0ZWx5CisgICAgICAgICAgICBNbG1lU2V0UHNtQml0KHBBZGFwdGVyLCBQV1JfQUNUSVZFKTsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgfQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9QU01vZGVfUHJvYzo6KFBTTW9kZT0lbGQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKworICAgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV3BhU3VwcG9ydCBmbGFnLgorICAgIFZhbHVlOgorICAgICAgICAwOiBEcml2ZXIgaWdub3JlIHdwYV9zdXBwbGljYW50LgorICAgICAgICAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbi4KKyAgICAgICAgMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMuCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworICAgIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUk7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dwYV9TdXBwb3J0OjooV3BhU3VwcGxpY2FudFVQPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIE1BQworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgbWFjIDAgICAgICAgID09PiByZWFkIE1BQyB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgbWFjIDA9MTIgICAgID09PiB3cml0ZSBNQUMgd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVMT05HCQkJCW1hY0FkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVUlOVDMyCQkJCW1hY1ZhbHVlID0gMDsKKwlJTlQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkgICAgdGhpc19jaGFyID0gYXJnOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBNYWMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKG1hY0FkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgbWFjQWRkciwgJm1hY1ZhbHVlKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lbHgsIE1hY1ZhbHVlPSV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyICwgbWFjVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls4LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDgpCisJCQkJdGVtcDJbNy1rKytdPScwJzsKKwkJCXRlbXAyWzhdPSdcMCc7CisKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCQlBdG9IKHRlbXAyLCB0ZW1wLCA0KTsKKwkJCQltYWNWYWx1ZSA9ICp0ZW1wKjI1NioyNTYqMjU2ICsgdGVtcFsxXSoyNTYqMjU2ICsgdGVtcFsyXSoyNTYgKyB0ZW1wWzNdOworCisJCQkJLy8gZGVidWcgbW9kZQorCQkJCWlmIChtYWNBZGRyID09IChIV19ERUJVR19TRVRUSU5HX0JBU0UgKyA0KSkKKwkJCQl7CisJCQkJCS8vIDB4MmJmNDogYnl0ZTAgbm9uLXplcm86IGVuYWJsZSBSMTcgdHVuaW5nLCAwOiBkaXNhYmxlIFIxNyB0dW5pbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY1ZhbHVlICYgMHgwMDAwMDBmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvbiBSMTcgdHVuaW5nXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBSNjY7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFI2NiA9IDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpOworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb2ZmIFIxNyB0dW5pbmcsIHJlc3RvcmUgdG8gMHglMDJ4XG4iLCBSNjYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lMDJseCwgTWFjVmFsdWU9MHgleFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCX0KKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxNQUNcblxuIikpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBFMlBST00KKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIGUycCAwICAgICAJPT0+IHJlYWQgRTJQUk9NIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBlMnAgMD0xMjM0ICAgID09PiB3cml0ZSBFMlBST00gd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyMzQKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVVNIT1JUCQkJCWVlcEFkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVVNIT1JUCQkJCWVlcFZhbHVlOworCWludAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCSAgICAvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSBhcmc7CisKKworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIEUyUFJPTSBhZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAoZWVwQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA0WF06MHglMDRYICAiLCBlZXBBZGRyICwgZWVwVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbNC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRlbXAyWzMtaysrXT0nMCc7CisJCQl0ZW1wMls0XT0nXDAnOworCisJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJQXRvSCh0ZW1wMiwgdGVtcCwgMik7CisJCQllZXBWYWx1ZSA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDJYXTolMDJYICAiLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxFMlBST01cbiIpKTsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworCisKKworSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9UR25XaWZpVGVzdF9Qcm9jOjooYlRHbldpZmlUZXN0PSVkKVxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJTG9uZ1JldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlTaG9ydFJldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfTm9uZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX0ZsZXhpYmxlOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfU3RyaWN0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0llZWU4MDJkTW9kZV9Qcm9jOjooSUVFRUUwMjExZE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlKSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2M6OihDYXJyaWVyRGV0ZWN0LkVuYWJsZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisKK0lOVAlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENIQVIJCQlleHRyYSkKK3sKKwlJTlQgaTsKKworCXNwcmludGYoZXh0cmEsICJcbiIpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJc3ByaW50ZihleHRyYSwgIiVzSFQgT3BlcmF0aW5nIE1vZGUgOiAlZFxuIiwgZXh0cmEsIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlzcHJpbnRmKGV4dHJhLCAiJXNcbiUtMTlzJS00cyUtNHMlLTdzJS03cyUtN3MlLTEwcyUtNnMlLTZzJS02cyUtNnNcbiIsIGV4dHJhLAorCQkJIk1BQyIsICJBSUQiLCAiQlNTIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIik7CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQlpZiAoc3RybGVuKGV4dHJhKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKwkJICAgIGJyZWFrOworCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLCBleHRyYSwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPmFwaWR4KTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBzIiwgZXh0cmEsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02cyIsIGV4dHJhLCBHZXRCVyhwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVykpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwZCwgJWQsICVkJSVcbiIsIGV4dHJhLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKKwkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKKwkJCXNwcmludGYoZXh0cmEsICIlc1xuIiwgZXh0cmEpOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYy5wYXRjaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhX2lvY3RsLmMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3MmIxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhX2lvY3RsLmMucGF0Y2gKQEAgLTAsMCArMSwxOCBAQAorLS0tIHN0YV9pb2N0bC5jCTIwMDgtMDktMTkgMTQ6Mzc6NTIuMDAwMDAwMDAwICswODAwCisrKysgc3RhX2lvY3RsLmMuZmM5CTIwMDgtMDktMTkgMTQ6Mzg6MjAuMDAwMDAwMDAwICswODAwCitAQCAtNDksMTUgKzQ5LDkgQEAKKworICNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKKworLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQorICNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorICNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorICNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikKKy0jZWxzZQorLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCistI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQiwgX0MsIF9ELCBfRSkKKy0jZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9CLCBfQywgX0QsIF9FLCBfRikKKy0jZW5kaWYKKworIGV4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKKyBleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcFtdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyMDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjAKQEAgLTAsMCArMSw3MDM3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHN0YV9pb2N0bC5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBJT0NUTCByZWxhdGVkIHN1YnJvdXRpbmVzCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJvcnkgQ2hlbiAgIDAxLTAzLTIwMDMgICAgY3JlYXRlZAorCVJvcnkgQ2hlbiAgIDAyLTE0LTIwMDUgICAgbW9kaWZ5IHRvIHN1cHBvcnQgUlQ2MQorKi8KKworI2luY2x1ZGUJInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgREJHCitleHRlcm4gVUxPTkcgICAgUlREZWJ1Z0xldmVsOworI2VuZGlmCisKKyNkZWZpbmUgTlJfV0VQX0tFWVMgCQkJCTQKKyNkZWZpbmUgV0VQX1NNQUxMX0tFWV9MRU4gCQkJKDQwLzgpCisjZGVmaW5lIFdFUF9MQVJHRV9LRVlfTEVOIAkJCSgxMDQvOCkKKworI2RlZmluZSBHUk9VUF9LRVlfTk8gICAgICAgICAgICAgICAgNAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCisjZWxzZQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbmRpZgorCitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhMlRlbXBsYXRlW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcFtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBMZW47CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfVkVSU0lPTl9JTkZPeworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25XOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25YOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25ZOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25aOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkWWVhcjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZE1vbnRoOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkRGF5OworfSBSVF9WRVJTSU9OX0lORk8sICpQUlRfVkVSU0lPTl9JTkZPOworCitzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKK3sgUlRQUklWX0lPQ1RMX1NFVCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCAwLAorICAic2V0In0sCisKK3sgUlRQUklWX0lPQ1RMX1NIT1csIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKK3sgUlRQUklWX0lPQ1RMX1NIT1csIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAorLyogLS0tIHN1Yi1pb2N0bHMgZGVmaW5pdGlvbnMgLS0tICovCisgICAgeyBTSE9XX0NPTk5fU1RBVFVTLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImNvbm5TdGF0dXMiIH0sCisJeyBTSE9XX0RSVklFUl9WRVJJT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZHJpdmVyVmVyIiB9LAorICAgIHsgU0hPV19CQV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImJhaW5mbyIgfSwKKwl7IFNIT1dfREVTQ19JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRlc2NpbmZvIiB9LAorICAgIHsgUkFJT19PRkYsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb2ZmIiB9LAorCXsgUkFJT19PTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vbiIgfSwKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IFNIT1dfRExTX0VOVFJZX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGxzZW50cnlpbmZvIiB9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsgU0hPV19DRkdfVkFMVUUsCisJICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJzaG93IiB9LAorCXsgU0hPV19BREhPQ19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImFkaG9jRW50cnkiIH0sCisKKy8qIC0tLSBzdWItaW9jdGxzIHJlbGF0aW9ucyAtLS0gKi8KKworI2lmZGVmIERCRworeyBSVFBSSVZfSU9DVExfQkJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiYmJwIn0sCit7IFJUUFJJVl9JT0NUTF9NQUMsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAibWFjIn0sCit7IFJUUFJJVl9JT0NUTF9FMlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZTJwIn0sCisjZW5kaWYgIC8qIERCRyAqLworCit7IFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAic3RhdCJ9LAoreyBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVksCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImdldF9zaXRlX3N1cnZleSJ9LAorfTsKKworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisKK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCitWT0lEIFJUTVBJb2N0bEJCUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKKyNlbmRpZiAvLyBEQkcgLy8KKworCitORElTX1NUQVRVUyBSVE1QV1BBTm9uZUFkZEtleVByb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4JUFZPSUQJCQlwQnVmKTsKKworSU5UIFNldF9GcmFnVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCitJTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSEFSCQkJZXh0cmEpOworCitzdGF0aWMgc3RydWN0IHsKKwlDSEFSICpuYW1lOworCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU0VUX1BST0MsIFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0NbXSA9IHsKKwl7IkRyaXZlclZlcnNpb24iLAkJCQlTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb24iLAkJCQlTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQkJU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKKwl7IlNTSUQiLAkJCQkJCVNldF9TU0lEX1Byb2N9LAorCXsiV2lyZWxlc3NNb2RlIiwJCQkJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jfSwKKwl7IlR4QnVyc3QiLAkJCQkJU2V0X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2V0X1R4UHJlYW1ibGVfUHJvY30sCisJeyJUeFBvd2VyIiwJCQkJCVNldF9UeFBvd2VyX1Byb2N9LAorCXsiQ2hhbm5lbCIsCQkJCQlTZXRfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJCVNldF9CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCQlTZXRfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJCVNldF9GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkgICAgICAgICAgICAgICAgU2V0X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkgICAgICAgICAgICBTZXRfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkgICAgICAgICAgICBTZXRfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCSAgICAgICAgU2V0X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIAlTZXRfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAkJU2V0X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAkJU2V0X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIAlTZXRfSHRBdXRvQmFfUHJvY30sCisJeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAorCXsiSHRQcm90ZWN0IiwJCSAgICAgICAgCVNldF9IdFByb3RlY3RfUHJvY30sCisJeyJIdE1pbW9QcyIsCQkgICAgICAgIAlTZXRfSHRNaW1vUHNfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJeyJQa3RBZ2dyZWdhdGUiLAkJCQlTZXRfUGt0QWdncmVnYXRlX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorCXsiV21tQ2FwYWJsZSIsCQkJCQlTZXRfV21tQ2FwYWJsZV9Qcm9jfSwKKyNlbmRpZgorCXsiSUVFRTgwMjExSCIsCQkJCQlTZXRfSUVFRTgwMjExSF9Qcm9jfSwKKyAgICB7Ik5ldHdvcmtUeXBlIiwgICAgICAgICAgICAgICAgIFNldF9OZXR3b3JrVHlwZV9Qcm9jfSwKKwl7IkF1dGhNb2RlIiwJCQkJCVNldF9BdXRoTW9kZV9Qcm9jfSwKKwl7IkVuY3J5cFR5cGUiLAkJCQkJU2V0X0VuY3J5cFR5cGVfUHJvY30sCisJeyJEZWZhdWx0S2V5SUQiLAkJCQlTZXRfRGVmYXVsdEtleUlEX1Byb2N9LAorCXsiS2V5MSIsCQkJCQkJU2V0X0tleTFfUHJvY30sCisJeyJLZXkyIiwJCQkJCQlTZXRfS2V5Ml9Qcm9jfSwKKwl7IktleTMiLAkJCQkJCVNldF9LZXkzX1Byb2N9LAorCXsiS2V5NCIsCQkJCQkJU2V0X0tleTRfUHJvY30sCisJeyJXUEFQU0siLAkJCQkJCVNldF9XUEFQU0tfUHJvY30sCisJeyJSZXNldENvdW50ZXIiLAkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jfSwKKwl7IlBTTW9kZSIsICAgICAgICAgICAgICAgICAgICAgIFNldF9QU01vZGVfUHJvY30sCisjaWZkZWYgREJHCisJeyJEZWJ1ZyIsCQkJCQkJU2V0X0RlYnVnX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBSQUxJTktfQVRFCisJeyJBVEUiLAkJCQkJCQlTZXRfQVRFX1Byb2N9LAorCXsiQVRFREEiLAkJCQkJCVNldF9BVEVfREFfUHJvY30sCisJeyJBVEVTQSIsCQkJCQkJU2V0X0FURV9TQV9Qcm9jfSwKKwl7IkFURUJTU0lEIiwJCQkJCVNldF9BVEVfQlNTSURfUHJvY30sCisJeyJBVEVDSEFOTkVMIiwJCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jfSwKKwl7IkFURVRYUE9XMCIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jfSwKKwl7IkFURVRYUE9XMSIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jfSwKKwl7IkFURVRYQU5UIiwJCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVJYQU5UIiwJCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVRYRlJFUU9GRlNFVCIsCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jfSwKKwl7IkFURVRYQlciLAkJCQkJCVNldF9BVEVfVFhfQldfUHJvY30sCisJeyJBVEVUWExFTiIsCQkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jfSwKKwl7IkFURVRYQ05UIiwJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvY30sCisJeyJBVEVUWE1DUyIsCQkJCQlTZXRfQVRFX1RYX01DU19Qcm9jfSwKKwl7IkFURVRYTU9ERSIsCQkJCQlTZXRfQVRFX1RYX01PREVfUHJvY30sCisJeyJBVEVUWEdJIiwJCQkJCQlTZXRfQVRFX1RYX0dJX1Byb2N9LAorCXsiQVRFUlhGRVIiLAkJCQkJU2V0X0FURV9SWF9GRVJfUHJvY30sCisJeyJBVEVSUkYiLAkJCQkJCVNldF9BVEVfUmVhZF9SRl9Qcm9jfSwKKwl7IkFURVdSRjEiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYxX1Byb2N9LAorCXsiQVRFV1JGMiIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjJfUHJvY30sCisJeyJBVEVXUkYzIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGM19Qcm9jfSwKKwl7IkFURVdSRjQiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkY0X1Byb2N9LAorCXsiQVRFTERFMlAiLAkJCQkgICAgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jfSwKKwl7IkFURVJFMlAiLAkJCQkJCVNldF9BVEVfUmVhZF9FMlBfUHJvY30sCisJeyJBVEVTSE9XIiwJCQkJCQlTZXRfQVRFX1Nob3dfUHJvY30sCisJeyJBVEVIRUxQIiwJCQkJCQlTZXRfQVRFX0hlbHBfUHJvY30sCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCXsiVHhTdG9wIiwJCQkJCQlTZXRfVHhTdG9wX1Byb2N9LAorCXsiUnhTdG9wIiwJCQkJCQlTZXRfUnhTdG9wX1Byb2N9LAorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisJeyJGaXhlZFR4TW9kZSIsICAgICAgICAgICAgICAgICBTZXRfRml4ZWRUeE1vZGVfUHJvY30sCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwl7Ik9wTW9kZSIsCQkJCQkJU2V0X09wTW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIHsiVEduV2lmaVRlc3QiLCAgICAgICAgICAgICAgICAgU2V0X1RHbldpZmlUZXN0X1Byb2N9LAorICAgIHsiRm9yY2VHRiIsCQkgICAgICAgIAkJU2V0X0ZvcmNlR0ZfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyJEbHNBZGRFbnRyeSIsCQkJCQlTZXRfRGxzQWRkRW50cnlfUHJvY30sCisJeyJEbHNUZWFyRG93bkVudHJ5IiwJCQlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IkxvbmdSZXRyeSIsCSAgICAgICAgCQlTZXRfTG9uZ1JldHJ5TGltaXRfUHJvY30sCisJeyJTaG9ydFJldHJ5IiwJICAgICAgICAJCVNldF9TaG9ydFJldHJ5TGltaXRfUHJvY30sCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXsiMTFkQ2xpZW50TW9kZSIsCQkJCVNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCXsiQ2FycmllckRldGVjdCIsCQkJCVNldF9DYXJyaWVyRGV0ZWN0X1Byb2N9LAorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCXtOVUxMLH0KK307CisKKworVk9JRCBSVE1QQWRkS2V5KAorCUlOCVBSVE1QX0FEQVBURVIJICAgIHBBZCwKKwlJTglQTkRJU184MDJfMTFfS0VZICAgIHBLZXkpCit7CisJVUxPTkcJCQkJS2V5SWR4OworCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5IC0tLS0tLT5cbiIpKTsKKworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJeworCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQl7CisJCSAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5QTUssIDMyKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIHBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCQkgICAgLy8gVXBkYXRlIFBUSworCQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisgICAgICAgIAlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgICAgICAJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisgICAgICAgIAllbHNlCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorICAgICAgICAJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBMRU5fVEtJUF9FSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBwRW50cnkpOworCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCSAgICAgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgR1RLCisgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAocEtleS0+S2V5SW5kZXggJiAweEZGKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKyAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisgICAgCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgIAkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIE5VTEwpOworCisgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCSAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgfQorCX0KKwllbHNlCS8vIGR5bmFtaWMgV0VQIGZyb20gd3BhX3N1cHBsaWNhbnQKKwl7CisJCVVDSEFSCUNpcGhlckFsZzsKKyAgICAJUFVDSEFSCUtleTsKKworCQlpZihwS2V5LT5LZXlMZW5ndGggPT0gMzIpCisJCQlnb3RvIGVuZDsKKworCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisKKwkJaWYgKEtleUlkeCA8IDQpCisJCXsKKwkJCS8vIGl0IGlzIGEgZGVmYXVsdCBzaGFyZWQga2V5LCBmb3IgUGFpcndpc2Uga2V5IHNldHRpbmcKKwkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQl7CisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwS2V5LT5CU1NJRCk7CisKKwkJCQlpZiAocEVudHJ5KQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleTogU2V0IFBhaXItd2lzZSBLZXlcbiIpKTsKKworCQkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IChVQ0hBUilwS2V5LT5LZXlMZW5ndGg7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkJLy8gc2V0IENpcGhlciB0eXBlCisJCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCQllbHNlCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCXBFbnRyeS0+QWRkciwKKwkJCQkJCShVQ0hBUilwRW50cnktPkFpZCwKKyAgICAgICAgICAgICAgICAJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKKworCQkJCQkvLyB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5CisJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlCU1MwLAorCQkJCQkJS2V5SWR4LCAvLyBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCXBFbnRyeSk7CisKKwkJCQl9CisJCQl9CisJCQllbHNlCisgICAgICAgICAgICB7CisJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCisJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCS8vIFNldCBDaXBlciB0eXBlCisJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQllbHNlCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworICAgIAkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisJCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCisgICAgCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCX0KKwkJfQorCX0KK2VuZDoKKwlyZXR1cm47Cit9CisKK2NoYXIgKiBydHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCit7CisgICAgZm9yKDsgKnMgIT0gKGNoYXIpIGM7ICsrcykKKyAgICAgICAgaWYgKCpzID09ICdcMCcpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKGNoYXIgKikgczsKK30KKworLyoKK1RoaXMgaXMgcmVxdWlyZWQgZm9yIExpbkVYMjAwNC9rZXJuZWwyLjYuNyB0byBwcm92aWRlIGl3bGlzdCBzY2FubmluZyBmdW5jdGlvbgorKi8KKworaW50CitydF9pb2N0bF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworLy8JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKyNpZmRlZiBSVDI4NzAKKwlzdHJuY3B5KG5hbWUsICJSVDI4NzAgV2lyZWxlc3MiLCBJRk5BTVNJWik7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCWludCAJY2hhbiA9IC0xOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisKKwlpZiAoZnJlcS0+ZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCisJCWNoYW4gPSBmcmVxLT5tOwkvLyBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyCisJZWxzZQorCQlNQVBfS0haX1RPX0NIQU5ORUxfSUQoIChmcmVxLT5tIC8xMDApICwgY2hhbik7IC8vIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsCisKKyAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKKyAgICB7CisJcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KK2ludCBydF9pb2N0bF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBOVUxMOworCVVDSEFSIGNoOworCVVMT05HCW07CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkJY2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCisgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKKwlmcmVxLT5tID0gbSAqIDEwMDsKKwlmcmVxLT5lID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoICgqbW9kZSkKKwl7CisJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfSU5GUkE6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQlicmVhazsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICAgICAgY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2l3bW9kZTo6U0lPQ1NJV01PREUgKHVua25vd24gJWQpXG4iLCAqbW9kZSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJKm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgIGVsc2UgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJKm1vZGUgPSBJV19NT0RFX0lORlJBOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgIGVsc2UgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX01PTklUT1I7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgICAgICAqbW9kZSA9IElXX01PREVfQVVUTzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PnJ0X2lvY3RsX2dpd21vZGUobW9kZT0lZClcbiIsICptb2RlKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXUxNiB2YWw7CisJaW50IGk7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+cnRfaW9jdGxfZ2l3cmFuZ2VcbiIpKTsKKwlkYXRhLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpfHxBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlyYW5nZS0+bWluX3BtcCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1ICogMTAyNDsKKwkJcmFuZ2UtPm1pbl9wbXQgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXQgPSAxMDAwICogMTAyNDsKKwkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8CisJCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKKwl9CisKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNDsKKworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAgcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCisJdmFsID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IHJhbmdlLT5udW1fY2hhbm5lbHM7IGkrKykKKwl7CisJCXUzMiBtOworCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsOworCQlNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbCwgbSk7CisJCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IG0gKiAxMDA7IC8qIEhaICovCisKKwkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJdmFsKys7CisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7IC8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAorCQkJCQkqIGRvY3VtZW50ZWQgZXhhY3RseS4gQXQgbGVhc3QKKwkJCQkJKiA2OSBoYXMgYmVlbiBvYnNlcnZlZC4gKi8KKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOyAvKiBkQiAqLworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7IC8qIGRCICovCisKKwkvKiBXaGF0IHdvdWxkIGJlIHN1aXRhYmxlIHZhbHVlcyBmb3IgImF2ZXJhZ2UvdHlwaWNhbCIgcXVhbD8gKi8KKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDIwOworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IC02MDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAtOTU7CisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMzsKKworCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gTlJfV0VQX0tFWVM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisKKwlyYW5nZS0+bWluX3J0cyA9IDA7CisJcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworCXJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKwkvKiBJV19FTkNfQ0FQQV8qIGJpdCBmaWVsZCAqLworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX1dQQTIgfAorCQkJCQlJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICB7CisgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgfQorCisgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOworICAgIG1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKyAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgICAgICBtZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7CisgICAgfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJV0FQKD1FTVBUWSlcbiIpKTsKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVuaXRzIGFyZSBpbiBkYiBhYm92ZSB0aGUgbm9pc2UgZmxvb3IuIFRoYXQgbWVhbnMgdGhlCisgKiByc3NpIHZhbHVlcyByZXBvcnRlZCBpbiB0aGUgdHgvcnggZGVzY3JpcHRvcnMgaW4gdGhlCisgKiBkcml2ZXIgYXJlIHRoZSBTTlIgZXhwcmVzc2VkIGluIGRiLgorICoKKyAqIElmIHlvdSBhc3N1bWUgdGhhdCB0aGUgbm9pc2UgZmxvb3IgaXMgLTk1LCB3aGljaCBpcyBhbgorICogZXhjZWxsZW50IGFzc3VtcHRpb24gOTkuNSAlIG9mIHRoZSB0aW1lLCB0aGVuIHlvdSBjYW4KKyAqIGRlcml2ZSB0aGUgYWJzb2x1dGUgc2lnbmFsIGxldmVsIChpLmUuIC05NSArIHJzc2kpLgorICogVGhlcmUgYXJlIHNvbWUgb3RoZXIgc2xpZ2h0IGZhY3RvcnMgdG8gdGFrZSBpbnRvIGFjY291bnQKKyAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByc3NpIG1lYXN1cmVtZW50IGlzIGZyb20gMTFiLAorICogMTFnLCBvciAxMWEuICAgVGhlc2UgZGlmZmVyZW5jZXMgYXJlIGF0IG1vc3QgMmRiIGFuZAorICogY2FuIGJlIGRvY3VtZW50ZWQuCisgKgorICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCisgKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQorICovCitzdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKK3sKKwlfX3U4IENoYW5uZWxRdWFsaXR5OworCisJLy8gTm9ybWFsaXplIFJzc2kKKwlpZiAocnNzaSA+PSAtNTApCisJCUNoYW5uZWxRdWFsaXR5ID0gMTAwOworCWVsc2UgaWYgKHJzc2kgPj0gLTgwKSAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQorCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgyNCArICgocnNzaSArIDgwKSAqIDI2KS8xMCk7CisJZWxzZSBpZiAocnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KKyAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoKHJzc2kgKyA5MCkgKiAyNikvMTA7CisJZWxzZQorCQlDaGFubmVsUXVhbGl0eSA9IDA7CisKKyAgICBpcS0+cXVhbCA9IChfX3U4KUNoYW5uZWxRdWFsaXR5OworCisgICAgaXEtPmxldmVsID0gKF9fdTgpKHJzc2kpOworICAgIGlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KXBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7IAkvLyBub2lzZSBsZXZlbCAoZEJtKQorICAgIGlxLT5ub2lzZSArPSAyNTYgLSAxNDM7CisgICAgaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOworfQorCitpbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworIAlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCXN0cnVjdCBzb2NrYWRkciBhZGRyW0lXX01BWF9BUF07CisJc3RydWN0IGl3X3F1YWxpdHkgcXVhbFtJV19NQVhfQVBdOworCWludCBpOworCisgICAJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworICAgICAgICAvL3JldHVybiAtRU5FVERPV047CisJfQorCisJZm9yIChpID0gMDsgaSA8SVdfTUFYX0FQIDsgaSsrKQorCXsKKwkJaWYgKGkgPj0gIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKQorCQkJYnJlYWs7CisJCWFkZHJbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJnF1YWxbaV0sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworCX0KKwlkYXRhLT5sZW5ndGggPSBpOworCW1lbWNweShleHRyYSwgJmFkZHIsIGkqc2l6ZW9mKGFkZHJbMF0pKTsKKwlkYXRhLT5mbGFncyA9IDE7CQkvKiBzaWduYWwgcXVhbGl0eSBwcmVzZW50IChzb3J0IG9mKSAqLworCW1lbWNweShleHRyYSArIGkqc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSpzaXplb2YocXVhbFtpXSkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DR0lXU0NBTgoraW50IHJ0X2lvY3RsX3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJVUxPTkcJCQkJCQkJCU5vdzsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCsrOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCXJldHVybiAwOworCWRveworCQlOb3cgPSBqaWZmaWVzOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIFdwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorCQl7CisJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJfQorCisJCS8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworCQkvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCQkvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCQlwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkwLAorCQkJTlVMTCk7CisKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisJfXdoaWxlKDApOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlpbnQgaT0wOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYSwgKnByZXZpb3VzX2V2ID0gZXh0cmE7CisJY2hhciAqZW5kX2J1ZjsKKwljaGFyICpjdXJyZW50X3ZhbCwgY3VzdG9tW01BWF9DVVNUT01fTEVOXSA9IHswfTsKKyNpZm5kZWYgSVdFVkdFTklFCisJY2hhciBpZHg7CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgeworCQkvKgorCQkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorCQkgKi8KKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA9IDA7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA9PSAwKQorCXsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgaWYgKGRhdGEtPmxlbmd0aCA+IDApCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIGRhdGEtPmxlbmd0aDsKKyAgICBlbHNlCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZWxzZQorICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKGN1cnJlbnRfZXYgPj0gZW5kX2J1ZikKKyAgICAgICAgeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKwkJLy9NQUMgYWRkcmVzcworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQkJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgRVRIX0FMRU4pOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0VTU0lECisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL05ldHdvcmsgVHlwZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FVVE87CisJCX0KKwkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBJV19FVl9VSU5UX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vQ2hhbm5lbCBhbmQgRnJlcXVlbmN5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7CisJCWVsc2UKKwkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWl3ZS51LmZyZXEuaSA9IDA7CisKKwkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisgICAgICAgIC8vQWRkIHF1YWxpdHkgc3RhdGlzdGljcworICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKyAgICAJaXdlLnUucXVhbC5sZXZlbCA9IDA7CisgICAgCWl3ZS51LnF1YWwubm9pc2UgPSAwOworICAgICAgICBzZXRfcXVhbGl0eShwQWRhcHRlciwgJml3ZS51LnF1YWwsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworICAgIAljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0VuY3lwdGlvbiBrZXkKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwkJaWYgKENBUF9JU19QUklWQUNZX09OIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DYXBhYmlsaXR5SW5mbyApKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9SVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJCWVsc2UKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgICAgICBjdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwmaXdlLCAoY2hhciAqKXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bKGl3ZS51LmRhdGEuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpLTFdLktleSk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vQml0IFJhdGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbikKKyAgICAgICAgeworICAgICAgICAgICAgVUNIQVIgdG1wUmF0ZSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVbcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbi0xXTsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQlpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisgICAgCQljdXJyZW50X3ZhbCA9IGN1cnJlbnRfZXYgKyBJV19FVl9MQ1BfTEVOOworICAgICAgICAgICAgaWYgKHRtcFJhdGUgPT0gMHg4MikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDEgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDg0KQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMiAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OEIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICA1LjUgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDk2KQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMTEgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZQorICAgIAkJICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgKHRtcFJhdGUvMikgKiAxMDAwMDAwOworCisJCQlpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwkJCWN1cnJlbnRfdmFsID0gSVdFX1NUUkVBTV9BRERfVkFMVUUoaW5mbywgY3VycmVudF9ldiwKKwkJCQljdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwKKyAgICAJCQlJV19FVl9QQVJBTV9MRU4pOworCisgICAgICAgIAlpZigoY3VycmVudF92YWwtY3VycmVudF9ldik+SVdfRVZfTENQX0xFTikKKyAgICAgICAgICAgIAljdXJyZW50X2V2ID0gY3VycmVudF92YWw7CisgICAgICAgIAllbHNlCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgSVdFVkdFTklFCisJCS8vV1BBIElFCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisJCXsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKwkJfQorCisJCS8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgICAgIAltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIC8vV1BBIElFCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJ3cGFfaWU9IiwgNyk7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAicnNuX2llPSIsIDcpOworCQkJZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCX0KKworCWRhdGEtPmxlbmd0aCA9IGN1cnJlbnRfZXYgLSBleHRyYTsKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiAsKCI9PT0+cnRfaW9jdGxfZ2l3c2Nhbi4gJWQoJWQpIEJTUyByZXR1cm5lZCwgZGF0YS0+bGVuZ3RoID0gJWRcbiIsaSAsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yLCBkYXRhLT5sZW5ndGgpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgcnRfaW9jdGxfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+ZmxhZ3MpCisJeworCQlQQ0hBUglwU3NpZFN0cmluZyA9IE5VTEw7CisKKwkJLy8gSW5jbHVkZXMgbnVsbCBjaGFyYWN0ZXIuCisJCWlmIChkYXRhLT5sZW5ndGggPiAoSVdfRVNTSURfTUFYX1NJWkUgKyAxKSkKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCWlmIChwU3NpZFN0cmluZykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBlc3NpZCwgZGF0YS0+bGVuZ3RoKTsKKwkJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZykgPT0gRkFMU0UpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVsc2UKKwl7CisJCS8vIEFOWSBzc2lkCisJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIikgPT0gRkFMU0UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWRhdGEtPmZsYWdzID0gMTsKKyAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBjb25uZWN0ZWRcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisjaWZkZWYgUlQyODcwCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIC8vIEFkZCBmb3IgUlQyODcwCisgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIGRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwllbHNlCisJey8vdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQKKwkJZGF0YS0+bGVuZ3RoICA9IDA7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgbm90IGNvbm5lY3RlZCwgZXNzXG4iKSk7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworaW50IHJ0X2lvY3RsX3Npd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChwQWRhcHRlci0+bmlja25hbWUsIDAsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CisJbWVtY3B5KHBBZGFwdGVyLT5uaWNrbmFtZSwgbmlja25hbWUsIGRhdGEtPmxlbmd0aCk7CisKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQorCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7CisJaWYgKGRhdGEtPmxlbmd0aCA+IDApIHsKKwkJbWVtY3B5KG5pY2tuYW1lLCBwQWRhcHRlci0+bmlja25hbWUsIGRhdGEtPmxlbmd0aC0xKTsKKwkJbmlja25hbWVbZGF0YS0+bGVuZ3RoLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJdTE2IHZhbDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChydHMtPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZQorCQl2YWwgPSBydHMtPnZhbHVlOworCisJaWYgKHZhbCAhPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkKKwkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSB2YWw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJcnRzLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA9PSBNQVhfUlRTX1RIUkVTSE9MRCk7CisJcnRzLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXUxNiB2YWw7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKGZyYWctPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPj0gTUlOX0ZSQUdfVEhSRVNIT0xEIHx8IGZyYWctPnZhbHVlIDw9IE1BWF9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgdmFsID0gX19jcHVfdG9fbGUxNihmcmFnLT52YWx1ZSAmIH4weDEpOyAvKiBldmVuIG51bWJlcnMgb25seSAqLworCWVsc2UgaWYgKGZyYWctPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmcmFnLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisJZnJhZy0+ZGlzYWJsZWQgPSAoZnJhZy0+dmFsdWUgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKTsKKwlmcmFnLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVhfV0VQX0tFWV9TSVpFIDEzCisjZGVmaW5lIE1JTl9XRVBfS0VZX1NJWkUgNQoraW50IHJ0X2lvY3RsX3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisJZWxzZSBpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCB8fCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pKQorCXsKKwkgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgCWVsc2UKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCisgICAgaWYgKGVycS0+bGVuZ3RoID4gMCkKKwl7CisJCWludCBrZXlJZHggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCWlmIChlcnEtPmxlbmd0aCA+IE1BWF9XRVBfS0VZX1NJWkUpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENoZWNrIGtleSBpbmRleCAqLworCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgICAgICAgICAgLy9Vc2luZyBkZWZhdWx0IGtleQorCQkJa2V5SWR4ID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisgICAgICAgIH0KKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCisJCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQl9CisJCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlCisJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOworICAgICAgICB9CisJfQorICAgIGVsc2UKKwkJCXsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCWlmKCFlcnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworZG9uZToKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisJaW50IGtpZDsKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJa2lkID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfZ2l3ZW5jb2RlICVkXG4iLCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSk7CisKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCXsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0KKwllbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PTQpKQorCXsKKwkJLy8gY29weSB3ZXAga2V5CisJCWVycS0+ZmxhZ3MgPSBraWQgOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuKQorCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleSwgZXJxLT5sZW5ndGgpOworCQkvL2lmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpCisJCS8vZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCisJfQorCWVsc2UgaWYgKGtpZCA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy8gY29weSBkZWZhdWx0IGtleSBJRAorCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJCQkvKiBOQjogYmFzZSAxICovCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQKK3J0X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyOworCVBPU19DT09LSUUgcE9iajsKKwljaGFyICp0aGlzX2NoYXIgPSBleHRyYTsKKwljaGFyICp2YWx1ZTsKKwlpbnQgIFN0YXR1cz0wOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkYXB0ZXItPk9TX0Nvb2tpZTsKKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICghKnRoaXNfY2hhcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCSAgICAqdmFsdWUrKyA9IDA7CisKKwlpZiAoIXZhbHVlKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKworCS8vIHJlamVjdCBzZXR0aW5nIG5vdGhpbmcgYmVzaWRlcyBBTlkgc3NpZChzc2lkTGVuPTApCisgICAgaWYgKCEqdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTU0lEIikgIT0gMCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NFVF9QUk9DID0gUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQzsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQysrKQorCXsKKwkgICAgaWYgKHN0cmNtcCh0aGlzX2NoYXIsIFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUpID09IDApCisJICAgIHsKKwkgICAgICAgIGlmKCFQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5zZXRfcHJvYyhwQWRhcHRlciwgdmFsdWUpKQorCSAgICAgICAgewkvL0ZBTFNFOlNldCBwcml2YXRlIGZhaWxlZCB0aGVuIHJldHVybiBJbnZhbGlkIGFyZ3VtZW50CisJCQkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgICAgIH0KKwkJICAgIGJyZWFrOwkvL0V4aXQgZm9yIGxvb3AuCisJICAgIH0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lID09IE5VTEwpCisJeyAgLy9Ob3QgZm91bmQgYXJndW1lbnQKKwkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3NldHBhcmFtOjogKGl3cHJpdikgTm90IFN1cHBvcnQgU2V0IENvbW1hbmQgWyVzPSVzXVxuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCX0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisJSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKyAgICBpZiAoZXh0cmEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisgICAgc3ByaW50ZihleHRyYSwgIlxuXG4iKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCSAgICAvL3NwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3Mgd2l0aG91dCByZXRyeSAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJeworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3Mgd2l0aG91dCByZXRyeSAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgLSAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisJfQorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgYWZ0ZXIgcmV0cnkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBmYWlsIHRvIFJjdiBBQ0sgYWZ0ZXIgcmV0cnkgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJUUyBTdWNjZXNzIFJjdiBDVFMgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJUUyBGYWlsIFJjdiBDVFMgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggd2l0aCBDUkMgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGRyb3AgZHVlIHRvIG91dCBvZiByZXNvdXJjZSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyKTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkdXBsaWNhdGUgZnJhbWUgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJGYWxzZSBDQ0EgKG9uZSBzZWNvbmQpICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCk7CisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCWlmIChwQWQtPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwkJZWxzZQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJeworICAgIAlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJXcGFTdXBwbGljYW50VVAgICAgICAgICAgICAgICAgID0gJWRcblxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCB3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordm9pZAlnZXRCYUluZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE91dEJ1ZikKK3sKKwlJTlQgaSwgajsKKwlCQV9PUklfRU5UUlkgKnBPcmlCQUVudHJ5OworCUJBX1JFQ19FTlRSWSAqcFJlY0JBRW50cnk7CisKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJaWYgKCgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJCXx8IChwRW50cnktPlZhbGlkQXNXRFMpIHx8IChwRW50cnktPlZhbGlkQXNNZXNoKSkKKwkJeworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIChBaWQgPSAlZCkgKEFQKSAtXG4iLAorICAgICAgICAgICAgICAgIHBPdXRCdWYsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW1JlY2lwaWVudF1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBSZWNCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbcEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIExhc3RJbmRTZXE9JWQsIFJlb3JkZXJpbmdQa3RzPSVkXG4iLCBwT3V0QnVmLCBqLCBwUmVjQkFFbnRyeS0+QkFXaW5TaXplLCBwUmVjQkFFbnRyeS0+TGFzdEluZFNlcSwgcFJlY0JBRW50cnktPmxpc3QucWxlbik7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiIsIHBPdXRCdWYpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tPcmlnaW5hdG9yXVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcE9yaUJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgU3RhcnRTZXE9JWQsIEN1clR4U2VxPSVkXG4iLCBwT3V0QnVmLCBqLCBwT3JpQkFFbnRyeS0+QkFXaW5TaXplLCBwT3JpQkFFbnRyeS0+U2VxdWVuY2UsIHBFbnRyeS0+VHhTZXFbal0pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG5cbiIsIHBPdXRCdWYpOworCQl9CisgICAgICAgIGlmIChzdHJsZW4ocE91dEJ1ZikgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitzdGF0aWMgaW50CitydF9wcml2YXRlX3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworICAgIElOVAkJCQlTdGF0dXMgPSAwOworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZDsKKwlQT1NfQ09PS0lFCQlwT2JqOworICAgIHUzMiAgICAgICAgICAgICBzdWJjbWQgPSB3cnEtPmZsYWdzOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwkJcEFkID0gZGV2LT5wcml2OworCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoZXh0cmEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisgICAgc3dpdGNoKHN1YmNtZCkKKyAgICB7CisKKyAgICAgICAgY2FzZSBTSE9XX0NPTk5fU1RBVFVTOgorICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDZW50cmFsQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGlmIChJTkZSQV9PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWQoQVA6ICVzWyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiU3NpZD0lcyAsU3NpZGxlbiA9ICVkXG4iLHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJZWxzZQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgc3ByaW50ZihleHRyYSwgIkRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIkNvbm5TdGF0dXMgaXMgbm90IGNvbm5lY3RlZFxuIikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0hPV19EUlZJRVJfVkVSSU9OOgorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkRyaXZlciB2ZXJzaW9uLSVzLCAlcyAlc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OLCBfX0RBVEVfXywgX19USU1FX18gKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGNhc2UgU0hPV19CQV9JTkZPOgorICAgICAgICAgICAgZ2V0QmFJbmZvKHBBZCwgZXh0cmEpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBTSE9XX0RFU0NfSU5GTzoKKwkJCXsKKwkJCQlTaG93X0Rlc2NJbmZvX1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PRkY6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPZmZcbiIpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09OOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gVFJVRTsKKyAgICAgICAgICAgIC8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT25cbiIpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgU0hPV19ETFNfRU5UUllfSU5GTzoKKwkJCXsKKwkJCQlTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQljYXNlIFNIT1dfQ0ZHX1ZBTFVFOgorCQkJeworCQkJCVN0YXR1cyA9IFJUTVBTaG93Q2ZnVmFsdWUocEFkLCB3cnEtPnBvaW50ZXIsIGV4dHJhKTsKKwkJCQlpZiAoU3RhdHVzID09IDApCisJCQkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0hPV19BREhPQ19FTlRSWV9JTkZPOgorCQkJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKHBBZCwgZXh0cmEpOworCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN1YmNtZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIFNJT0NTSVdNTE1FCitpbnQgcnRfaW9jdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOworCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKwlpZiAocE1sbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2gocE1sbWUtPmNtZCkKKwl7CisjaWZkZWYgSVdfTUxNRV9ERUFVVEgKKwkJY2FzZSBJV19NTE1FX0RFQVVUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKKwkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEZUF1dGhSZXEsIHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSk7CisJCQlNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gSVdfTUxNRV9ERUFVVEggLy8KKyNpZmRlZiBJV19NTE1FX0RJU0FTU09DCisJCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19GVU5DVElPTl9fKSk7CisJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisKKwkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CitpbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV0VQIDF4CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorICAgICAgICAgICAgLyppZiAocGFyYW0tPnZhbHVlID09IDApCisJCQl7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgIT0gMCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQkJfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQkJaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisJCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJZGVmYXVsdDoKKyAgICAJCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOworCXJldHVybiAwOworfQorCit2b2lkIGZuU2V0Q2lwaGVyS2V5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAorICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQoreworICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBMRU5fVEtJUF9FSyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIGtleUlkeCwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOworCisgICAgaWYgKGJHVEspCisgICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAorICAgIAkJCQkJCQkgIEJTUzAsCisgICAgCQkJCQkJCSAga2V5SWR4LAorICAgIAkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisgICAgCQkJCQkJCSAgTlVMTCk7CisgICAgZWxzZQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0pOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQorCQkJeworICAgIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fRlVOQ1RJT05fXywgZW5jb2RpbmctPmZsYWdzKSk7CisgICAgfQorCQkJCQllbHNlCisgICAgeworICAgICAgICAvLyBHZXQgS2V5IEluZGV4IGFuZCBjb252ZXQgdG8gb3VyIG93biBkZWZpbmVkIGtleSBpbmRleAorICAgIAlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWxnKSB7CisgICAgCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCX0KKyAgICAgICAgCQllbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJfQorICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworICAgIAkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBrZXlJZHgsIGV4dC0+a2V5X2xlbikpOworICAgICAgICAgICAgICAgIGlmIChleHQtPmtleV9sZW4gPT0gMzIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgICAgICAJICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICAgICAgICAgIAkvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICAgICAgCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAJICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkJZGVmYXVsdDoKKyAgICAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJUENIQVIgcEtleSA9IE5VTEw7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGlkeCwgbWF4X2tleV9sZW47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX2dpd2VuY29kZWV4dFxuIikpOworCisJbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOworCWlmIChtYXhfa2V5X2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpZHgpCisJeworCQlpZiAoaWR4IDwgMSB8fCBpZHggPiA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCisJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlpZiAoaWR4ICE9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCWVsc2UKKwkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCisJZW5jb2RpbmctPmZsYWdzID0gaWR4ICsgMTsKKwltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOworCisJZXh0LT5rZXlfbGVuID0gMDsKKwlzd2l0Y2gocEFkLT5TdGFDZmcuV2VwU3RhdHVzKSB7CisJCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7CisJCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gbWF4X2tleV9sZW4pCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbjsKKwkJCQlwS2V5ID0gJihwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleVswXSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1RLSVA7CisJCQllbHNlCisJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7CisKKwkJCWlmIChtYXhfa2V5X2xlbiA8IDMyKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMzI7CisJCQkJcEtleSA9ICZwQWQtPlN0YUNmZy5QTUtbMF07CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChleHQtPmtleV9sZW4gJiYgcEtleSkKKwl7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJbWVtY3B5KGV4dC0+a2V5LCBwS2V5LCBleHQtPmtleV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ1NJV0dFTklFCitpbnQgcnRfaW9jdGxfc2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfTEVOX09GX1JTTklFIHx8CisJICAgICh3cnF1LT5kYXRhLmxlbmd0aCAmJiBleHRyYSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIE1BWF9MRU5fT0ZfUlNOSUUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworCitpbnQgcnRfaW9jdGxfZ2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJaWYgKChwQWQtPlN0YUNmZy5SU05JRV9MZW4gPT0gMCkgfHwKKwkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwl7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZmRlZiBTSU9DU0lXR0VOSUUKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKQorCQlyZXR1cm4gLUUyQklHOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJbWVtY3B5KGV4dHJhLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCVVDSEFSIFJTTkllID0gSUVfV1BBOworCisJCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IChwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyKSkgLy8gSUQsIExlbgorCQkJcmV0dXJuIC1FMkJJRzsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKKwkJCVJTTkllID0gSUVfUlNOOworCisJCWV4dHJhWzBdID0gKGNoYXIpUlNOSWU7CisJCWV4dHJhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCQltZW1jcHkoZXh0cmErMiwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3Bta3NhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wbWtzYSAqcFBta3NhID0gKHN0cnVjdCBpd19wbWtzYSAqKXdycXUtPmRhdGEucG9pbnRlcjsKKwlJTlQJQ2FjaGVkSWR4ID0gMCwgaWR4ID0gMDsKKworCWlmIChwUG1rc2EgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX3Npd3Bta3NhXG4iKSk7CisJc3dpdGNoKHBQbWtzYS0+Y21kKQorCXsKKwkJY2FzZSBJV19QTUtTQV9GTFVTSDoKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9GTFVTSFxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfUkVNT1ZFOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJICAgICAgICB7CisJCSAgICAgICAgCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTik7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSUQsIDE2KTsKKwkJCQkJZm9yIChpZHggPSBDYWNoZWRJZHg7IGlkeCA8IChwQWQtPlN0YUNmZy5TYXZlZFBNS051bSAtIDEpOyBpZHgrKykKKwkJCQkJeworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uQlNTSURbMF0sIE1BQ19BRERSX0xFTik7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5QTUtJRFswXSwgMTYpOworCQkJCQl9CisJCQkJCXBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtLS07CisJCQkgICAgICAgIGJyZWFrOworCQkgICAgICAgIH0KKwkgICAgICAgIH0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9SRU1PVkVcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX0FERDoKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCQkgICAgICAgIGJyZWFrOworCSAgICAgICAgfQorCisJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCSAgICAgICAgeworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJCSAgICAgICAgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkgICAgICAgIH0KKwkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkgICAgICAgIENhY2hlZElkeCA9IChwUG1rc2EtPmJzc2lkLnNhX2RhdGFbNV0gJSBQTUtJRF9OTyk7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkgICAgICAgIH0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9BRERcbiIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBVbmtub3cgQ29tbWFuZCEhXG4iKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyAjaWYgV0lSRUxFU1NfRVhUID4gMTcKKworI2lmZGVmIERCRworc3RhdGljIGludAorcnRfcHJpdmF0ZV9pb2N0bF9iYnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQorCQkJeworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZSA9IE5VTEw7CisJVUNIQVIJCQkJcmVnQkJQID0gMDsKKy8vCUNIQVIJCQkJYXJnWzI1NV09ezB9OworCVVJTlQzMgkJCQliYnBJZDsKKwlVSU5UMzIJCQkJYmJwVmFsdWU7CisJQk9PTEVBTgkJCQliSXNQcmludEFsbEJCUCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCisJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwlpZiAod3JxLT5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJCQkJeworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSB3cnEtPnBvaW50ZXI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lc1xuIiwgdGhpc19jaGFyKSk7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lcywgdmFsdWU9JXNcbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwkJCWlmIChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCWlmICgoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpICYmIChzc2NhbmYodmFsdWUsICIleCIsICYoYmJwVmFsdWUpKSA9PSAxKSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCSAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworICAgIAkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKyAgICAJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQl9CisJZWxzZQorCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisKK25leHQ6CisJaWYgKGJJc1ByaW50QWxsQkJQKQorCXsKKwkJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCQlmb3IgKGJicElkID0gMDsgYmJwSWQgPD0gMTM2OyBiYnBJZCsrKQorCQl7CisJCSAgICBpZiAoc3RybGVuKGV4dHJhKSA+PSAoSVdfUFJJVl9TSVpFX01BU0sgLSAxMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWCAgICAiLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKwkJCWlmIChiYnBJZCU1ID09IDQpCisJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiXG4iKTsKKwkJfQorCisgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PXJ0X3ByaXZhdGVfaW9jdGxfYmJwXG5cbiIpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKK2ludCBydF9pb2N0bF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisgICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKKyAgICAvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCisgICAgICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQorICAgICovCisgICAgaWYgKHJhdGUgPT0gLTEpCisgICAgeworCQkvL0F1dG8gUmF0ZQorCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKwkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGZpeGVkKQorICAgICAgICB7CisgICAgICAgIAlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisgICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKyAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKKyAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisgICAgaW50IHJhdGVfaW5kZXggPSAwLCByYXRlX2NvdW50ID0gMDsKKyAgICBIVFRSQU5TTUlUX1NFVFRJTkcgaHRfc2V0dGluZzsKKyAgICBfX3MzMiByYWxpbmtyYXRlW10gPQorCXsyLCAgNCwgICAxMSwgIDIyLCAvLyBDQ0sKKwkxMiwgMTgsICAgMjQsICAzNiwgNDgsIDcyLCA5NiwgMTA4LCAvLyBPRkRNCisJMTMsIDI2LCAgIDM5LCAgNTIsICA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsICA1MiwgIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTM5LCA3OCwgIDExNywgMTU2LCAyMzQsIDMxMiwgMzUxLCAzOTAsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkyNywgNTQsICAgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJCQkJCQkJCQkJICAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTE0LCAyOSwgICA0MywgIDU3LCAgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgICA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk0MywgODcsICAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMzAsIDYwLCAgIDkwLCAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDYwMCwgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTkwLCAxODAsIDI3MCwgMzYwLCA1NDAsIDcyMCwgODEwLCA5MDB9OwkJCQkJCQkJCQkgIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCisKKyAgICByYXRlX2NvdW50ID0gc2l6ZW9mKHJhbGlua3JhdGUpL3NpemVvZihfX3MzMik7CisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkgJiYKKyAgICAgICAgKElORlJBX09OKHBBZCkpICYmCisgICAgICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fCAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKSkKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisgICAgZWxzZQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorICAgIHsKKy8vICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjE2KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICozMikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoyNCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqNDgpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpICsgNDsKKyAgICBlbHNlIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKTsKKworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisKKyAgICBpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCisgICAgICAgIHJhdGVfaW5kZXggPSByYXRlX2NvdW50OworCisgICAgd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IHJhbGlua3JhdGVbcmF0ZV9pbmRleF0gKiA1MDAwMDA7CisgICAgd3JxdS0+Yml0cmF0ZS5kaXNhYmxlZCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfaGFuZGxlcltdID0KK3sKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25hbWUsCQkJLyogU0lPQ0dJV05BTUUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyZXEsCQkgICAgLyogU0lPQ1NJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmVxLAkJICAgIC8qIFNJT0NHSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bW9kZSwJCSAgICAvKiBTSU9DU0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd21vZGUsCQkgICAgLyogU0lPQ0dJV01PREUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhbmdlLAkJICAgIC8qIFNJT0NHSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhcCwgICAgICAgICAgICAvKiBTSU9DU0lXQVAgICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2FwLAkJICAgIC8qIFNJT0NHSVdBUCAgICAgKi8KKyNpZmRlZiBTSU9DU0lXTUxNRQorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkgICAgICAgIC8qIFNJT0NTSVdNTE1FICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV01MTUUgKi8KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJCSAgICAvKiBTSU9DR0lXQVBMSVNUICovCisjaWZkZWYgU0lPQ0dJV1NDQU4KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3c2NhbiwJCSAgICAvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3NjYW4sCQkgICAgLyogU0lPQ0dJV1NDQU4gICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1NDQU4gICAqLworI2VuZGlmIC8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2Vzc2lkLAkJICAgIC8qIFNJT0NTSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCQkgICAgLyogU0lPQ0dJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJCSAgICAvKiBTSU9DU0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25pY2tuLAkJICAgIC8qIFNJT0NHSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdyYXRlLCAgICAgICAgICAvKiBTSU9DU0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhdGUsICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cnRzLAkJICAgIC8qIFNJT0NTSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkJICAgIC8qIFNJT0NHSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJCSAgICAvKiBTSU9DU0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyYWcsCQkgICAgLyogU0lPQ0dJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2dlbmllLCAgICAgICAgIC8qIFNJT0NTSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ0dJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkJICAgIC8qIFNJT0NTSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXV0aCwJCSAgICAvKiBTSU9DR0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZWV4dCwJICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgICovCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X3ByaXZfaGFuZGxlcnNbXSA9IHsKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAwICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMSAqLworI2lmbmRlZiBDT05GSUdfQVBfU1VQUE9SVAorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zZXRwYXJhbSwgLyogKyAweDAyICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDIgKi8KKyNlbmRpZiAvLyBDT05GSUdfQVBfU1VQUE9SVCAvLworI2lmZGVmIERCRworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2lvY3RsX2JicCwgLyogKyAweDAzICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDMgKi8KKyNlbmRpZgorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA4ICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIC8qICsgMHgwOSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEEgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBCICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTAgKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9zaG93LCAvKiArIDB4MTEgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEyICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxOCAqLworfTsKKworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZiA9Cit7CisjZGVmaW5lCU4oYSkJKHNpemVvZiAoYSkgLyBzaXplb2YgKGFbMF0pKQorCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIHJ0X2hhbmRsZXIsCisJLm51bV9zdGFuZGFyZAk9IHNpemVvZihydF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIHJ0X3ByaXZfaGFuZGxlcnMsCisJLm51bV9wcml2YXRlCQk9IE4ocnRfcHJpdl9oYW5kbGVycyksCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHByaXZ0YWIsCisJLm51bV9wcml2YXRlX2FyZ3MJPSBOKHByaXZ0YWIpLAorI2lmIElXX0hBTkRMRVJfVkVSU0lPTiA+PSA3CisgICAgLmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMsCisjZW5kaWYKK307CisKK0lOVCBSVE1QU2V0SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIEJzc2lkOworICAgIFJUXzgwMl8xMV9QSFlfTU9ERSAgICAgICAgICAgICAgICAgIFBoeU1vZGU7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgU3RhQ29uZmlnOworICAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtYmxlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU1heDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBQTkRJU184MDJfMTFfS0VZICAgICAgICAgICAgICAgICAgICBwS2V5ID0gTlVMTDsKKyAgICBQTkRJU184MDJfMTFfV0VQCQkJICAgICAgICBwV2VwS2V5ID1OVUxMOworICAgIFBORElTXzgwMl8xMV9SRU1PVkVfS0VZICAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBOVUxMOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZywgKnBDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldFR5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm93OworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IDA7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUywgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXJUZW1wOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU9JRF9TRVRfSFRfUEhZTU9ERQkJCQkJSFRfUGh5TW9kZTsJLy8xMW4gLGthdGh5CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIFBORElTXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgIHBQbWtJZCA9IE5VTEw7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4U3RhdGUgPSBGQUxTRTsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IEZBTFNFOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2VuYWJsZSA9IDA7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJY3RtcDsKKyNlbmRpZiAvLyBTTk1QX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+UlRNUFNldEluZm9ybWF0aW9uKCksCTB4JTA4eFxuIiwgY21kJjB4N0ZGRikpOworICAgIHN3aXRjaChjbWQgJiAweDdGRkYpIHsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA8IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkJCS8vIE9ubHkgYXZhbGlhYmxlIHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWluZworICAgICAgICAgICAgZWxzZSBpZiAoIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKSAmJiAhKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxPTkcgICBDb3VudHJ5OworICAgICAgICAgICAgICAgIFVDSEFSCVRtcFBoeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb3VudHJ5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikoQ291bnRyeSAmIDB4MDAwMDAwRkYpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSgoQ291bnRyeSA+PiA4KSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgICAgIFRtcFBoeSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOworCQkJCS8vIEJ1aWxkIGFsbCBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaW5mb3JtYXRpb24KKwkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIChBOiVkICBCL0c6JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwKKwkJCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKyAjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBOb3cgPSBqaWZmaWVzOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwgVHhDbnQgPSAlZCBcbiIsIHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50KSk7CisKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCS8vQmVuc29uIGFkZCAyMDA4MDUyNywgd2hlbiByYWRpbyBvZmYsIHN0YSBkb24ndCBuZWVkIHRvIHNjYW4KKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQkJCWJyZWFrOworCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgc2Nhbm5pbmcgbm93ICEhIVxuIikpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJaWYgKHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50ID4gMTAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworICAgICAgICAgICAgUlRNUF9TRVRfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJUENIQVIgcFNzaWRTdHJpbmcgPSBOVUxMOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoU3NpZC5Tc2lkTGVuZ3RoID4gTUFYX0xFTl9PRl9TU0lEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCWlmIChTc2lkLlNzaWRMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpOworICAgICAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAJeworCSAgICAgICAgICAgICAgICAJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJCQlpZiAocFNzaWRTdHJpbmcpCisJCQkJCQl7CisJCQkJCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgpOworCSAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKTsKKwkJCQkJCQlrZnJlZShwU3NpZFN0cmluZyk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCisJCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gIT0gUmFkaW9TdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gPSBSYWRpb1N0YXRlOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gIT0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QSFlfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBoeU1vZGUgPD0gTWF4UGh5TW9kZSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCX0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lZClcbiIsIFBoeU1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBTdGFDb25maWcuRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IFN0YUNvbmZpZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IDE7IC8vIDIwMDMtMTAtMzAgYWx3YXlzIFNIT1JUIFNMT1QgY2FwYWJsZQorICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlICE9IFN0YUNvbmZpZy5BZGhvY01vZGUpICYmCisJCQkJCShTdGFDb25maWcuQWRob2NNb2RlIDw9IE1heFBoeU1vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgIlVTRSBPRkRNIHJhdGUgb3Igbm90IiBpbiBBREhPQyBtb2RlCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNldHRpbmcgY2hhbmdlZCwgbmVlZCB0byByZXNldCBjdXJyZW50IFRYIHJhdGUgYXMgd2VsbCBhcyBCRUFDT04gZnJhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgICAgICB7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBTdGFDb25maWcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VJYnNzQmVhY29uKHBBZGFwdGVyKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgQXNpY0VuYWJsZUlic3NTeW5jKHBBZGFwdGVyKTsgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9TVEFfQ09ORklHIChCdXJzdD0lZCwgUHJvdGVjdGlvbj0lbGQsU2hvcnRTbG90PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcnlSYXRlcywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFU0lSRURfUkFURVMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7CisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0CisgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUFJFQU1CTEUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQcmVhbWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpIHx8IChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlQXV0bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworICAgICAgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BSRUFNQkxFICg9JWQpXG4iLCBQcmVhbWJsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfV0VQX1NUQVRVUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJldlcFN0YXR1cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBUS0lQLCBBRVMsIFdFUCBhcmUgYWxsIHN1cHBvcnRlZC4gSXQgc2hvdWxkIG5vdCBoYXZlIGFueSBpbnZhbGlkIHNldHRpbmcKKyAgICAgICAgICAgICAgICBpZiAoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBXZXBTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIAlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUF9TVEFUVVMgKD0lZClcbiIsV2VwU3RhdHVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQXV0aE1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKEF1dGhNb2RlID4gTmRpczgwMl8xMUF1dGhNb2RlTWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBBdXRoTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBBdXRoTW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAoPSVkKSBcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc1R5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExTW9uaXRvcikKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzICA9IC1FSU5WQUw7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICh1bmtub3duKVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCSBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX1dFUDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfV0VQXG4iKSk7CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9LRVlfSU5ERVgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCQkJS2V5SWR4ID0gKihORElTXzgwMl8xMV9LRVlfSU5ERVggKikgd3JxLT51LmRhdGEucG9pbnRlcjsKKworCQkJCWlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKwkJCQkJaWYgKEtleUlkeCA+PSA0KXsKKwkJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQkJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisJCQkJCX0KKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTOgorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9SQUxJTkspKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKyNpZmRlZiBSVDI4NzAKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGUJPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZU90aGVyPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZUNhbmNlbCA9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dFJlcSA9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luUmVxPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJbkNvbXBsZXRlID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5Db21wbGV0ZUZhaWwgPSAwOworI2VuZGlmIC8vIFJUMjg3MCAvLworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTIFxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUnRzVGhyZXNoID4gTUFYX1JUU19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEICg9JWxkKVxuIixSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgKD0lbGQpIFxuIixGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9QT1dFUl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlck1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJDQU0iKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1ApCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIk1heF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJGYXN0X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTGVnYWN5X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFICg9JWQpXG4iLFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIDwgc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlclRlbXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBvd2VyVGVtcCA+IDEwMCkKKwkJCQkJUG93ZXJUZW1wID0gMHhmZmZmZmZmZjsgIC8vIEFVVE8KKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gUG93ZXJUZW1wOyAvL2tlZXAgY3VycmVudCBzZXR0aW5nLgorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCX0KKwkgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfVFlQRSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTmV0VHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFEUykKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUIpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUJHX01JWEVEKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNNSkKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUEpOworCQkJCWVsc2UKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRSAoPSVkKVxuIixOZXRUeXBlKSk7CisJCSAgICB9CisJCQlicmVhazsKKyAgICAgICAgLy8gRm9yIFdQQSBQU0sgUE1LIGtleQorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQUREX1dQQToKKyAgICAgICAgICAgIHBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhIFtBdXRoTW9kZSAhPSBXUEFQU0svV1BBMlBTSy9XUEFOT05FXVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSApICAgICAvLyBPbmx5IGZvciBXUEEgUFNLIG1vZGUKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBSYUNvbmZpZyBhcyBQU0sgYWdlbnQuCisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX0tFWToKKyAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocFJlbW92ZUtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBSZW1vdmVLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocFJlbW92ZUtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVE1QV1BBUmVtb3ZlS2V5UHJvYyhwQWRhcHRlciwgcFJlbW92ZUtleSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBSZW1vdmUgV1BBIEtleSEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IHBSZW1vdmVLZXktPktleUluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkpXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKEtleUlkWyVkXSBvdXQgb2YgcmFuZ2UpXG4iLCBLZXlJZHgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwUmVtb3ZlS2V5LT5LZXlJbmRleCwgcFJlbW92ZUtleS0+TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICBjYXNlIE9JRF84MDJfMTFfQUREX0tFWToKKyAgICAgICAgICAgIHBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUEFkZEtleShwQWRhcHRlciwgcEtleSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBDb25maWcgPSAmQ29uZmlnOworCisgICAgICAgICAgICAgICAgaWYgKChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPj0gMjApICYmIChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPD00MDApKQorICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBwQ29uZmlnLT5CZWFjb25QZXJpb2Q7CisKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoVVNIT1JUKSBwQ29uZmlnLT5BVElNV2luZG93OworICAgICAgICAgICAgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChwQ29uZmlnLT5EU0NvbmZpZywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAvLworCQkJCS8vIFNhdmUgdGhlIGNoYW5uZWwgb24gTWxtZUF1eCBmb3IgQ250bE9pZFJUQnNzaWRQcm9jIHVzZWQuCisJCQkJLy8KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5DaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04gKEJlYWNuUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2g9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5CZWFjb25QZXJpb2QsIHBDb25maWctPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJICAgIFBPSURfU0VUX0hUX1BIWU1PREUJcEhUUGh5TW9kZSA9ICZIVF9QaHlNb2RlOworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkhUX1BoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpwSFRQaHlNb2RlCShQaHlNb2RlID0gJWQsVHJhbnNtaXRObyA9ICVkLCBIdE1vZGUgPQklZCwJRXh0T2Zmc2V0ID0JJWQgLCBNQ1MgPSAlZCwgQlcgPQklZCwJU1RCQyA9ICVkLCBTSE9SVEdJID0gJWQpIFxuIiwKKwkJCQlwSFRQaHlNb2RlLT5QaHlNb2RlLCBwSFRQaHlNb2RlLT5UcmFuc21pdE5vLHBIVFBoeU1vZGUtPkh0TW9kZSxwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywJcEhUUGh5TW9kZS0+U0hPUlRHSSkpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUJPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCQkJUlRNUFNldEhUKHBBZGFwdGVyLAlwSFRQaHlNb2RlKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERShNQ1M9JWQsQlc9JWQsU0dJPSVkLFNUQkM9JWQpXG4iLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuQlcsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0ksCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQykpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJVUxPTkcgYXBzZCA7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFwc2QsIHdycS0+dS5kYXRhLnBvaW50ZXIsCXdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8QjMxfkI3CXwJQjZ+QjUJIHwJIEI0CSB8CSBCMwkgfAlCMgkgfAlCMQkgfAkgICBCMAkJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXwgUnN2ZAl8IE1heCBTUCBMZW4gfCBBQ19WTyB8IEFDX1ZJIHwgQUNfQksgfCBBQ19CRSB8IEFQU0QJQ2FwYWJsZQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IChhcHNkICYgMHgwMDAwMDAwMSkgPyBUUlVFIDoJRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gKChhcHNkCSYgMHgwMDAwMDAwMikgPj4gMSkJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gKChhcHNkCSYgMHgwMDAwMDAwNCkgPj4gMikJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJID0gKChhcHNkCSYgMHgwMDAwMDAwOCkgPj4gMykJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gKChhcHNkCSYgMHgwMDAwMDAxMCkgPj4gNCkJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aAk9IChVQ0hBUikoKGFwc2QJJiAweDAwMDAwMDYwKSA+PiA1KTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HIChhcHNkPTB4JWx4LCBBUFNEQ2FwPSVkLCBbQkUsQkssVkksVk9dPVslZC8lZC8lZC8lZF0sCU1heFNQTGVuPSVkKVxuIiwgYXBzZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUsCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkksCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTywJcEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCS8vIERyaXZlciBuZWVkcwl0byBub3RpZnkgQVAgd2hlbiBQU00gY2hhbmdlcworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZQkhPSBwQWRhcHRlci0+U3RhQ2ZnLlBzbSkKKwkJCQl7CisJCQkJCU1sbWVTZXRQc21CaXQocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSk7CisJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZSwJVFJVRSk7CisJCQkJfQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU00gKGJBUFNERm9yY2VQb3dlclNhdmU6JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMUzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCUJPT0xFQU4Jb2xkdmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChvbGR2YWx1ZSAmJgkhcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJCQl7CisJCQkJCWludAlpOworCQkJCQkvLyB0ZWFyCWRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQkJCWZvcgkoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIHRlYXIJZG93biBwZWVyIGRscyB0YWJsZQllbnRyeQorCQkJCQlmb3IJKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMUyAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihSVF84MDJfMTFfRExTX1VJKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVJUXzgwMl8xMV9ETFMJRGxzOworCisJCQkJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwkJCQlSVE1QTW92ZU1lbW9yeSgmRGxzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJCQkJJkRscyk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSBcbiIpKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX1dNTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9XTU0gKD0lZCkJXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJLy8KKwkJCS8vIFNldCBOZGlzUmFkaW9TdGF0ZU9mZiB0bwlUUlVFLCBpbnN0ZWFkIG9mIGNhbGxlZAlNbG1lUmFkaW9PZmYuCisJCQkvLyBMYXRlciBvbiwgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWC0+TnVtYmVyT2ZJdGVtcyBzaG91bGQgYmUJMAorCQkJLy8gd2hlbglxdWVyeSBPSURfODAyXzExX0JTU0lEX0xJU1QuCisJCQkvLworCQkJLy8gVFJVRTogIE51bWJlck9mSXRlbXMJd2lsbCBzZXQgdG8JMC4KKwkJCS8vIEZBTFNFOiBOdW1iZXJPZkl0ZW1zCW5vIGNoYW5nZS4KKwkJCS8vCisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0JVFJVRTsKKwkJCS8vIFNldCB0byBpbW1lZGlhdGVseSBzZW5kIHRoZSBtZWRpYSBkaXNjb25uZWN0CWV2ZW50CisJCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcwk9IFRSVUU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRElTQVNTT0NJQVRFCVxuIikpOworCisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0JQ05UTF9JRExFKQorCQkJCXsKKwkJCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FCWJ1c3ksIHJlc2V0CU1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJCQl9CisKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFLAorCQkJCQkwLAorCQkJCQlOVUxMKTsKKworCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQJPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUDoKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQkFDQVBfU1RSVUMpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCU9JRF9CQUNBUF9TVFJVQyBPcmRlIDsKKwkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk9yZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCWlmIChPcmRlLlBvbGljeSA+IEJBX05PVFVTRSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKE9yZGUuUG9saWN5ID09IEJBX05PVFVTRSkKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9Qcz0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gT3JkZS5BdXRvQkE7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsgLy8gd2Ugb25seSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKworCQkJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA+IE1BWF9SWF9SRU9SREVSQlVGKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IE1BWF9SWF9SRU9SREVSQlVGOworCisJCQkJCX0KKworCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooT3JkZS5BdXRvQkEgPSAlZCkgKFBvbGljeT0lZCkoUmVCQVdpbkxpbWl0PSVkKShUeEJBV2luTGltaXQ9JWQpKEF1dG9Nb2RlPSVkKVxuIixPcmRlLkF1dG9CQSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5LAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0LHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE1pbW9QcyA9ICVkKShBbXNkdUVuYWJsZSA9ICVkKSAoQW1zZHVTaXplPSVkKShNcGR1RGVuc2l0eT0lZClcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkpKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFNldCA6OiBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJVUNIQVIJCSAgICAgICAgaW5kZXg7CisJCQkJT0lEX0FERF9CQV9FTlRSWSAgICBCQTsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgICAgICpwRW50cnk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKEJBLlRJRCA+IDE1KQorCQkJCXsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkKKwkJCQkJLy9BcyBhZC1ob2MgbW9kZSwgQkEgcGFpciBpcyBub3QgbGltaXRlZCB0byBvbmx5IEJTU0lELiBzbyBhZGQgdmlhIE9JRC4KKwkJCQkJaW5kZXggPSBCQS5USUQ7CisJCQkJCS8vIGluIGFkIGhvYyBtb2RlLCB3aGVuIGFkZGluZyBCQSBwYWlyLCB3ZSBzaG91bGQgaW5zZXJ0IHRoaXMgZW50cnkgaW50byBNQUNFbnRyeSB0b28KKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIEJBLk1BQ0FkZHIpOworCQkJCQlpZiAoIXBFbnRyeSkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gYnJlYWsgb24gbm8gY29ubmVjdGlvbi4tLS0tOiV4OiV4XG4iLCBCQS5NQUNBZGRyWzRdLCBCQS5NQUNBZGRyWzVdKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoQkEuSXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJICAgIGlmIChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IFRSVUUpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gMHgxMDsKKworCQkJCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkYXB0ZXIsIHBFbnRyeSwgaW5kZXgsIDAsIDEwMCwgVFJVRSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeShwQWRhcHRlciwgcEVudHJ5LT5BaWQsIEJBLk1BQ0FkZHIsIDAsIDB4ZmZmZiwgQkEuVElELCBCQS5uTVNEVSwgQkEuSXNSZWNpcGllbnQpOworCQkJCQl9CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBSZWMgPSAlZC4gTWFjID0gJXg6JXg6JXg6JXg6JXg6JXggLiBcbiIsCisJCQkJCQlCQS5Jc1JlY2lwaWVudCwgQkEuTUFDQWRkclswXSwgQkEuTUFDQWRkclsxXSwgQkEuTUFDQWRkclsyXSwgQkEuTUFDQWRkclsyXQorCQkJCQkJLCBCQS5NQUNBZGRyWzRdLCBCQS5NQUNBZGRyWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVBPSURfQUREX0JBX0VOVFJZCXBCQTsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCQkJCXBCQSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkJCQlpZiAocEJBID09IE5VTEwpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEga21hbGxvYygpIGNhbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIpKTsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEoVElEPSVkLCBiQWxsVGlkPSVkKVxuIiwgcEJBLT5USUQsIHBCQS0+YkFsbFRpZCkpOworCisJCQkJCWlmICghcEJBLT5iQWxsVGlkICYmIChwQkEtPlRJRCA+IE5VTV9PRl9USUQpKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFXG4iKSk7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPnBFbnRyeVxuIikpOworCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZGFwdGVyLCBwRW50cnktPkFpZCwgcEJBLT5USUQsIEZBTFNFLCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlCQVJlY1Nlc3Npb25UZWFyRG93biggcEFkYXB0ZXIsIChVQ0hBUilwRW50cnktPkFpZCwgcEJBLT5USUQsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWtmcmVlKHBCQSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyAgICAgICAgLy8gRm9yIFdQQV9TVVBQTElDQU5UIHRvIHNldCBzdGF0aWMgd2VwIGtleQorICAgIAljYXNlIE9JRF84MDJfMTFfQUREX1dFUDoKKyAgICAJICAgIHBXZXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgCSAgICBpZihwV2VwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBXZXBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKGxlbmd0aCBtaXNtYXRjaCkhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkgICAgICAgIEtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAvLyBLZXlJZHggbXVzdCBiZSAwIH4gMworICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiA0KQorICAgIAkJCXsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKEtleUlkeCBtdXN0IGJlIHNtYWxsZXIgdGhhbiA0KSEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVDSEFSIENpcGhlckFsZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBLZXk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChwV2VwS2V5LT5LZXlMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBvbmx5IHN1cHBvcnQgQ0lQSEVSX1dFUDY0KGxlbjo1KSAmIENJUEhFUl9XRVAxMjgobGVuOjEzKSEhXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQgPSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBncm91cCBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKyAgICAJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpLCAlc1xuIiwgcFdlcEtleS0+S2V5SW5kZXgsIHBXZXBLZXktPktleUxlbmd0aCwgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gIlBvcnQgU2VjdXJlZCI6IlBvcnQgTk9UIFNlY3VyZWQiKSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFdlcEtleSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgIGNhc2UgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgYkJsb2NrQXNzb2M9JXNcbiIsIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPyAiVFJVRSI6IkZBTFNFIikpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJndwYV9zdXBwbGljYW50X2VuYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAJCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IHdwYV9zdXBwbGljYW50X2VuYWJsZTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgICpwSW5mbzsKKwkJCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworICAgICAgICAgICAgICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKikgTXNnRWxlbS0+TXNnOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBJbmZvLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkYXB0ZXIsIE1zZ0VsZW0pOworCQkJCWtmcmVlKE1zZ0VsZW0pOworCisgICAgICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAoUmVhc29uPSVkKVxuIiwgcEluZm8tPlJlYXNvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisJCQkJcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwkJCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhTdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IElFRUU4MDIxeFN0YXRlOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICg9JWQpXG4iLCBJRUVFODAyMXhTdGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhfcmVxdWlyZWRfa2V5cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVkgKCVkKVxuIiwgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMpKTsKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE1LSUQ6CisJICAgICAgICBwUG1rSWQgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJICAgICAgICBpZihwUG1rSWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUG1rSWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkgICAgICAgIC8vIGNoZWNrIHRoZSBQTUtJRCBpbmZvcm1hdGlvbgorCSAgICAgICAgaWYgKHBQbWtJZC0+QlNTSURJbmZvQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIFBCU1NJRF9JTkZPCXBCc3NJZEluZm87CisJCSAgICAgICAgVUlOVAkJQnNzSWR4OworCQkgICAgICAgIFVJTlQJCUNhY2hlZElkeDsKKworCQkgICAgICAgIGZvciAoQnNzSWR4ID0gMDsgQnNzSWR4IDwgcFBta0lkLT5CU1NJREluZm9Db3VudDsgQnNzSWR4KyspCisJCSAgICAgICAgeworCQkJICAgICAgICAvLyBwb2ludCB0byB0aGUgaW5kZXhlZCBCU1NJRF9JTkZPIHN0cnVjdHVyZQorCQkJICAgICAgICBwQnNzSWRJbmZvID0gKFBCU1NJRF9JTkZPKSAoKFBVQ0hBUikgcFBta0lkICsgMiAqIHNpemVvZihVSU5UKSArIEJzc0lkeCAqIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIC8vIEZpbmQgdGhlIGVudHJ5IGluIHRoZSBzYXZlZCBkYXRhIGJhc2UuCisJCQkgICAgICAgIGZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCQkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBCc3NJZEluZm8tPkJTU0lELCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpKQorCQkJCQkgICAgICAgIGJyZWFrOworCQkJICAgICAgICB9CisKKwkJCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkJCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJCQkgICAgICAgIH0KKwkJCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCQkJICAgICAgICBlbHNlCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCQkJICAgICAgICBDYWNoZWRJZHggPSAocEJzc0lkSW5mby0+QlNTSURbNV0gJSBQTUtJRF9OTyk7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIH0KKwkJICAgICAgICB9CisJCQl9CisJCQlpZihwUG1rSWQpCisJCQkJa2ZyZWUocFBta0lkKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWQsIFNob3J0UmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQsIFNob3J0UmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuTG9uZ1JldHJ5TGltaXQ9ICVkLExvbmdSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0LCBMb25nUmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUVcbiIpKTsKKwkJCXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJLy9wS2V5ID0gJldlcEtleTsKKworCQkJaWYgKCBwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorCQkJeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSwgRmFpbGVkISFcbiIpKTsKKwkJCX0KKwkJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicEtleS0+S2V5SW5kZXggPSVkLCBwS2V5LT5LZXlMZW5ndGg9JWRcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKworCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5CisJCQlpZiAoS2V5SWR4ID4gNCkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCQkJCX0KKwkJCQkvL1Jlc3RhcnRBUElzUmVxdWlyZWQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZjdG1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXNwcmludGYoJmN0bXAsIiVkIiwgY3RtcCk7CisJCQkJU2V0X0NoYW5uZWxfUHJvYyhwQWRhcHRlciwgJmN0bXApOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIFJUTVBRdWVyeUluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCAgICAgICAgICAgKnBCc3NpZExpc3QgPSBOVUxMOworICAgIFBORElTX1dMQU5fQlNTSURfRVggICAgICAgICAgICAgICAgIHBCc3M7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICAqcENvbmZpZ3VyYXRpb24gPSBOVUxMOworICAgIFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICpwTGlua1N0YXR1cyA9IE5VTEw7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgKnBTdGFDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICpwU3RhdGlzdGljcyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1UeXBlOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTX01FRElBX1NUQVRFICAgICAgICAgICAgICAgICAgICBNZWRpYVN0YXRlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUsIHVsSW5mbz0wLCBOZXR3b3JrVHlwZUxpc3RbNF0sIGFwc2QgPSAwOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0xlbiA9IDA7CisgICAgUFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiA9IE5VTEwsIHBQdHI7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIFBhZGRpbmcgPSAwOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisJVUNIQVIJZHJpdmVyVmVyc2lvbls4XTsKKyAgICBPSURfU0VUX0hUX1BIWU1PREUJCQkgICAgICAgICpwSFRQaHlNb2RlID0gTlVMTDsKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJLy9mb3Igc25tcCwga2F0aHkKKwlEZWZhdWx0S2V5SWR4VmFsdWUJCQkqcEtleUlkeFZhbHVlOworCUlOVAkJCQkJCQl2YWx1ZUxlbjsKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQl0bXBbNjRdOworI2VuZGlmIC8vU05NUAorCisgICAgc3dpdGNoKGNtZCkKKyAgICB7CisgICAgICAgIGNhc2UgUlRfT0lEX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFNUQV9OSUNfREVWSUNFX05BTUUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFNUQV9OSUNfREVWSUNFX05BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfVkVSU0lPTl9JTkZPOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9WRVJTSU9OX0lORk8gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA4KnNpemVvZihVQ0hBUik7CisJCQlzcHJpbnRmKCZkcml2ZXJWZXJzaW9uWzBdLCAiJXMiLCBTVEFfRFJJVkVSX1ZFUlNJT04pOworCQkJZHJpdmVyVmVyc2lvbls3XSA9ICdcMCc7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkcml2ZXJWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCWNhc2UgUlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQzMik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50LCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkvKgorICAgICAgICAgICAgCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisgICAgICAgICAgICAJICovCisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoU3RpbGwgc2Nhbm5pbmcpXG4iKSk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUICglZCBCU1MgcmV0dXJuZWQpXG4iLHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKSk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIENsYWN1bGF0ZSB0b3RhbCBidWZmZXIgc2l6ZSByZXF1aXJlZAorICAgICAgICAgICAgQnNzQnVmU2l6ZSA9IHNpemVvZihVTE9ORyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFsaWduIHBvaW50ZXIgdG8gNCBieXRlcyBib3VuZGFyeS4KKyAgICAgICAgICAgICAgICAvL1BhZGRpbmcgPSA0IC0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICYgMHgwMDAzKTsKKyAgICAgICAgICAgICAgICAvL2lmIChQYWRkaW5nID09IDQpCisgICAgICAgICAgICAgICAgLy8gICAgUGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3Igc2FmZXR5IGlzc3VlLCB3ZSBhZGQgMjU2IGJ5dGVzIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAyNTY7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgc2FtZSBzaXplIGFzIHBhc3NlZCBmcm9tIGhpZ2hlciBsYXllcgorICAgICAgICAgICAgcEJ1ZiA9IGttYWxsb2MoQnNzQnVmU2l6ZSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbml0IDgwMl8xMV9CU1NJRF9MSVNUX0VYIHN0cnVjdHVyZQorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEJ1ZiwgQnNzQnVmU2l6ZSk7CisgICAgICAgICAgICBwQnNzaWRMaXN0ID0gKFBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYKSBwQnVmOworICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOworCisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYnVmZmVyIGxlbmd0aAorICAgICAgICAgICAgQnNzTGVuID0gNDsgLy8gQ29uc2lzdCBvZiBOdW1iZXJPZkl0ZW1zCisgICAgICAgICAgICAvLyBQb2ludCB0byBzdGFydCBvZiBORElTX1dMQU5fQlNTSURfRVgKKyAgICAgICAgICAgIC8vIHBQdHIgPSBwQnVmICsgc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIHBQdHIgPSAoUFVDSEFSKSAmcEJzc2lkTGlzdC0+QnNzaWRbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzID0gKFBORElTX1dMQU5fQlNTSURfRVgpIHBQdHI7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBCc3MtPk1hY0FkZHJlc3MsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkhpZGRlbiA9PSAxKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPT0gRkFMU0UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKwkJCQkJLy8gV2UgbXVzdCByZXR1cm4gdGhpcyBTU0lEIGR1cmluZyA0d2F5IGhhbmRzaGFraW5nLCBvdGhlcndpc2UgQWVnaXMgd2lsbCBmYWlsZWQgdG8gcGFyc2UgV1BBIGluZm9tYXRpb24KKwkJCQkJLy8gYW5kIHRoZW4gZmFpbGVkIHRvIHNlbmQgRUFQT2wgZmFyYW1lLgorCQkJCQkvLworCQkJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJCXsKKwkJCQkJCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworCQkJCQl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPlByaXZhY3kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Qcml2YWN5OworICAgICAgICAgICAgICAgIHBCc3MtPlJzc2kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgICAgIHBCc3MtPk5ldHdvcmtUeXBlSW5Vc2UgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXSk7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQXRpbVdpbjsKKworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsLCBwQnNzLT5Db25maWd1cmF0aW9uLkRTQ29uZmlnKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUlCU1M7CisKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZUxlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgKz0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPkxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgICAgICBpZiAoKEJzc0xlbiArIHBCc3MtPkxlbmd0aCkgPCB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChCc3NMZW4gPiB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZW5kaWYKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQnNzaWRMaXN0LCBCc3NMZW4pOworICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfTUVESUFfU1RBVEUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNZWRpYVN0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSUQoPUVNUFRZKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9UQ09OTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKwkJCU5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworCQkJTmRpc1plcm9NZW1vcnkoU3NpZC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJbWVtY3B5KFNzaWQuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLAlTc2lkLlNzaWRMZW5ndGgpOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTc2lkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLCBzc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLFNzaWQuU3NpZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUzoKKyAgICAgICAgICAgIHBMaW5rU3RhdHVzID0gKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocExpbmtTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkN1cnJUeFJhdGUgPSBSYXRlSWRUbzUwMEticHNbcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGVdOyAgIC8vIHVuaXQgOiA1MDAga2JwcworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DaGFubmVsUXVhbGl0eSA9IHBBZGFwdGVyLT5NbG1lLkNoYW5uZWxRdWFsaXR5OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5SeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudDsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+VHhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisgICAgICAgIAkJcExpbmtTdGF0dXMtPkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcExpbmtTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocExpbmtTdGF0dXMpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVMoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHBDb25maWd1cmF0aW9uID0gKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+TGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbjsKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBwQ29uZmlndXJhdGlvbi0+RFNDb25maWcpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENvbmZpZ3VyYXRpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihCZWFjb25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaGFubmVsPSVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCwgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCWtmcmVlKHBDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8wOgorCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMCgweD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCSAgICBTdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMToKKwkJCWlmICgocEFkYXB0ZXItPkFudGVubmEuZmllbGQuUnhQYXRoCT4gMSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMSgweD0lbHgpXG4iLHVsSW5mbykpOworCQkJfQorCQkJZWxzZQorCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjE9JWQpXG4iLHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlNTSV9UUklHR0VSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9SU1NJOgorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSToKKwkJCXVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzE6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSV8yOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NUQVRJU1RJQ1M6CisgICAgICAgICAgICBwU3RhdGlzdGljcyA9IChORElTXzgwMl8xMV9TVEFUSVNUSUNTICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YXRpc3RpY3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyBcbiIpKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKKwkJCSAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWRhcHRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIGNhbGN1bGF0aW9uIG9mIHN1Y2Vzc2Z1bCBjb3VudAorICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA8IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GYWlsZWRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuQUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisjaWZkZWYgREJHCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50OworI2Vsc2UKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0IC8gMTAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhdGlzdGljcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhdGlzdGljcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfT0s6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlczsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIHBTdGFDb25maWcgPSAoUlRfODAyXzExX1NUQV9DT05GSUcgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YUNvbmZpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHXG4iKSk7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHhCdXJzdCA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHVyYm9SYXRlID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VCR1Byb3RlY3Rpb24gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VTaG9ydFNsb3RUaW1lID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZTsKKyAgICAgICAgICAgICAgICAvL3BTdGFDb25maWctPkFkaG9jTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkh3UmFkaW9TdGF0dXMgPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyA9PSBUUlVFKSA/IDEgOiAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlJzdjEgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlN5c3RlbUVycm9yQml0bWFwID0gcEFkYXB0ZXItPlN5c3RlbUVycm9yQml0bWFwOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGFDb25maWcsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YUNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgUnRzVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUnRzVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCg9JWxkKVxuIiwgUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgRnJhZ1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID09IFRSVUUpCisgICAgICAgICAgICAgICAgRnJhZ1RocmVzaCA9IDA7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRnJhZ1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCg9JWxkKVxuIiwgRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgUG93ZXJNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFBvd2VyTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1BPV0VSX01PREUoPSVkKVxuIiwgUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgUmFkaW9TdGF0ZSA9IChCT09MRUFOKSBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJhZGlvU3RhdGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSUJTUzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMU1vbml0b3I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bjsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJzc1R5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZCc3NUeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSg9JWQpXG4iLCBCc3NUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgUHJlYW1UeXBlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFByZWFtVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlByZWFtVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSRUFNQkxFKD0lZClcbiIsIFByZWFtVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgQXV0aE1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEF1dGhNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQXV0aE1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKD0lZClcbiIsIEF1dGhNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihXZXBTdGF0dXMpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTKD0lZClcbiIsIFdlcFN0YXR1cykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMICV4XG4iLHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlcikpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEOgorCQkJaWYgKChwQWRhcHRlci0+UmZJY1R5cGUJPT0gUkZJQ18yODUwKSB8fCAocEFkYXB0ZXItPlJmSWNUeXBlID09CVJGSUNfMjc1MCkpCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMzsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAzCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkJTmV0d29ya1R5cGVMaXN0WzNdID0gTmRpczgwMl8xMU9GRE01OyAgIC8vIE5ldHdvcmtUeXBlWzNdID0gMTFhCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMjsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAyCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTI7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRFxuIikpOworCQkJCWJyZWFrOworCSAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE01OworCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCR19NSVhFRCkgfHwgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTI0OworCQkJZWxzZQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFEUzsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RSeFJhdGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURToKKwkJCS8vdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0VHhSYXRlOworCQkJdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEUgKD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRUVQUk9NX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RWVwcm9tVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUwgKD0lZClcbiIsIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSkpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkV4dHJhSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0VYVFJBX0lORk8gKD0lbGQpXG4iLCBwQWRhcHRlci0+RXh0cmFJbmZvKSk7CisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UKTsKKwkgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJndlX3ZlcnNpb25fY29tcGlsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORzoKKwkJCWFwc2QgPSAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFIDw8IDEpIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA8PCAyKQorCQkJCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA8PCAzKQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPDwgNCkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCA8PCA1KSk7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmFwc2QsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcgKD0weCVseCxBUFNEQ2FwPSVkLEFDX0JFPSVkLEFDX0JLPSVkLEFDX1ZJPSVkLEFDX1ZPPSVkLE1BWFNQTGVuPSVkKVxuIiwKKwkJCQlhcHNkLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyxwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00gKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU06CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0gKD0lZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCWJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgY2FzZSBSVF9PSURfTkVXX0RSSVZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVQ0hBUiBlbmFibGVkID0gMTsKKyAgICAJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgIAkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZW5hYmxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX05FV19EUklWRVIgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICAgICAgY2FzZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEFkYXB0ZXItPlN0YUNmZy5kZXZfbmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDOworCisgICAgCQkJcEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID0gKChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSA/IChFWFRDSEFfQkVMT1cpIDogKEVYVENIQV9BQk9WRSkpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kOworICAgICAgICAgICAgdWxJbmZvID0gKHVsSW5mbyA8PCA4KXwocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOworCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQ6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgICAgICAgICAgaSA9IDA7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisgICAgICAgICAgICBpID0gMTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmksIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUKD0lZCkgXG4iLCBpKSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX01BQ19BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gTWFudWZhY3R1cmVyT1VJX0xFTjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKFJlc291cmNlVHlwZUlkTmFtZSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgUmVzb3VyY2VUeXBlSWROYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRCBcbiIpKTsKKwkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgc3VwcG9ydCB3ZXAgZWxzZSAyIGlzIG5vdCBzdXBwb3J0LgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERSBcbiIpKTsKKwkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLlBzbSA9PSBQU01QX0FDVElPTikKKwkJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHBvd2VyIGFjdGl2ZSBlbHNlIDIgaXMgcG93ZXIgc2F2ZS4KKwkJCWVsc2UKKwkJCQl1bEluZm8gPSAyOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSBcbiIpKTsKKwkJCS8vS2V5SWR4VmFsdWUuS2V5SWR4ID0gcEFkLT5Qb3J0Q2ZnLk1CU1NJRFtwQWQtPklvY3RsSUZdLkRlZmF1bHRLZXlJZDsKKwkJCXBLZXlJZHhWYWx1ZSA9IHdycS0+dS5kYXRhLnBvaW50ZXI7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIktleUlkeFZhbHVlLktleUlkeCA9ICVkLCBcbiIscEtleUlkeFZhbHVlLT5LZXlJZHgpKTsKKwkJCXZhbHVlTGVuID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQkJTmRpc01vdmVNZW1vcnkocEtleUlkeFZhbHVlLT5WYWx1ZSwKKwkJCQkJCSAgICZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgICB2YWx1ZUxlbik7CisJCQlwS2V5SWR4VmFsdWUtPlZhbHVlW3ZhbHVlTGVuXT0nXDAnOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRGVmYXVsdEtleUlkeFZhbHVlKTsKKworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBLZXlJZHhWYWx1ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRGVmYXVsdEtleUlkID0gJWQsIHRvdGFsIGxlbiA9ICVkLCBzdHIgbGVuPSVkLCBLZXlWYWx1ZT0gJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5WzBdKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SWQgPSVkIFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCQkJCSZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQkJCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlTaG9ydFJldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFJldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkXG4iLCBTaG9ydFJldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlMb25nUmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTG9uZ1JldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0PSVkXG4iLCBMb25nUmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJPRFVDVElEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJPRFVDVElEIFxuIikpOworCisjaWZkZWYgUlQyODcwCisJCQlzcHJpbnRmKHRtcCwgIiUwNHggJTA0eFxuIiwgKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wVXNiX0Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciAsKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wVXNiX0Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4odG1wKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCB0bXAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZiBVQ0hBUj0lZCwgY2hhbm5lbD0lZCBcbiIsIHNpemVvZihVQ0hBUiksIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisjZW5kaWYgLy9TTk1QX1NVUFBPUlQKKworCQljYXNlIE9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWDoKKwkJCXsKKwkJCQlVQ0hBUiB2YWx1ZTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYIFxuIikpOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDE7CisjZWxzZQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRvZXNuJ3Qgc3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ2YWx1ZSwgMSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hfTElTVDoKKwkJCXsKKwkJCQlQUlRfQ0hBTk5FTF9MSVNUX0lORk8gcENoTGlzdEJ1ZjsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSF9MSVNUIFxuIikpOworCQkJCWlmIChwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYgPSAoUlRfQ0hBTk5FTF9MSVNUX0lORk8gKikga21hbGxvYyhzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJaWYgKHBDaExpc3RCdWYgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCQkJCWZvciAoaSA9IDA7IGkgPCBwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdFtpXSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENoTGlzdEJ1Ziwgc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKworCQkJCWlmIChwQ2hMaXN0QnVmKQorCQkJCQlrZnJlZShwQ2hMaXN0QnVmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDI7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIDIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSwgMSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU06CisJCQl7CisJCQkJUFJUXzgwMl8xMV9ETFNfSU5GTwlwRGxzSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyksIEdGUF9BVE9NSUMpOworCQkJCWlmIChwRGxzSW5mbyA9PSBOVUxMKQorCQkJCQlicmVhazsKKworCQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJeworCQkJCQlSVE1QTW92ZU1lbW9yeSgmcERsc0luZm8tPkVudHJ5W2ldLCAmcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXSwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQl9CisKKwkJCQlwRGxzSW5mby0+bnVtID0gTUFYX05VTV9PRl9ETFNfRU5UUlk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBEbHNJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTVxuIikpOworCisJCQkJaWYgKHBEbHNJbmZvKQorCQkJCQlrZnJlZShwRGxzSW5mbyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBydDI4eHhfc3RhX2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCQkJY21kKQoreworCVBPU19DT09LSUUJCQlwT2JqOworCVZJUlRVQUxfQURBUFRFUgkJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUiAgICAgICAgKnBBZCA9IE5VTEw7CisJc3RydWN0IGl3cmVxICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwlCT09MRUFOCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVVNIT1JUCQkJCXN1YmNtZDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPnByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJICAgIGlmICh3cnEtPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCisJICAgIHsKKwkJICAgIHJldHVybiBTdGF0dXM7CisJICAgIH0KKworCSAgICBpZiAoc3Ryc3RyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJPcE1vZGUiKSA9PSBOVUxMKQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJICAgIHJldHVybiAtRU5FVERPV047CisgICAgICAgIH0KKyAgICB9CisKKwl7CS8vIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4KKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworCQlwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCXN3aXRjaChjbWQpCisJeworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQljYXNlIFJUUFJJVl9JT0NUTF9BVEU6CisJCQl7CisJCQkJUnRtcERvQXRlKHBBZCwgd3JxKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIFNJT0NHSUZIV0FERFI6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJRkhXQUREUlxuIikpOworCQkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgICAgeworICAgICAgICAJY2hhciAqbmFtZT0md3JxLT51Lm5hbWVbMF07CisgICAgICAgIAlydF9pb2N0bF9naXduYW1lKG5ldF9kZXYsIE5VTEwsIG5hbWUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRVNTSUQ6ICAvL0dldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXRVNTSUQ6ICAvL1NldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQJKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9zaXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTldJRDogICAvLyBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpCisJCWNhc2UgU0lPQ0dJV05XSUQ6ICAgLy8gZ2V0IG5ldHdvcmsgaWQKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ1NJV0ZSRVE6ICAgLy9zZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRlJFUTogICAvLyBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTklDS046IC8vc2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfc2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdOSUNLTjogLy9nZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9naXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1JBVEU6ICAgLy9nZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCQkgICAgcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFNJT0NTSVdSQVRFOiAgLy9zZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCSAgICAgICAgcnRfaW9jdGxfc2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJT0NHSVdSVFM6ICAvLyBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXUlRTOiAgLy9zZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRlJBRzogIC8vZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdGUkFHOiAgLy9zZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0VOQ09ERTogIC8vZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdFTkNPREU6ICAvL3NldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9zaXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCSAgICBjYXNlIFNJT0NTSVdBUDogIC8vc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9zaXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV01PREU6ICAgLy9nZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1NFTlM6ICAgLy9nZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DU0lXU0VOUzoJLy9zZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUE9XRVI6ICAvL2dldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ1NJV1BPV0VSOiAgLy9zZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NHSVdUWFBPVzogIC8vZ2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ1NJV1RYUE9XOiAgLy9zZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUkFOR0U6CS8vR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMKKwkJY2FzZSBTSU9DR0lXUkVUUlk6CS8vZ2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJY2FzZSBTSU9DU0lXUkVUUlk6CS8vc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgUlRfUFJJVl9JT0NUTDoKKwkJCXN1YmNtZCA9IHdycS0+dS5kYXRhLmZsYWdzOworCQkJaWYoIHN1YmNtZCAmIE9JRF9HRVRfU0VUX1RPR0dMRSkKKwkJCQlTdGF0dXMgPSBSVE1QU2V0SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBSVE1QUXVlcnlJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV1BSSVY6CisJCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwkJCXsKKwkJCQlpZiAoIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihwcml2dGFiKSkgIT0gVFJVRSkKKwkJCQkJYnJlYWs7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOworCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6CisJCQlpZihhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkgIT0gVFJVRSkKKwkJCQlicmVhazsKKwkJCXJ0X2lvY3RsX3NldHBhcmFtKG5ldF9kZXYsIE5VTEwsIE5VTEwsIHdycS0+dS5kYXRhLnBvaW50ZXIpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZOgorCQkJUlRNUElvY3RsR2V0U2l0ZVN1cnZleShwQWQsIHdycSk7CisJCSAgICBicmVhazsKKyNpZmRlZiBEQkcKKwkJY2FzZSBSVFBSSVZfSU9DVExfTUFDOgorCQkJUlRNUElvY3RsTUFDKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9FMlA6CisJCQlSVE1QSW9jdGxFMlBST00ocEFkLCB3cnEpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gREJHIC8vCisgICAgICAgIGNhc2UgU0lPQ0VUSFRPT0w6CisgICAgICAgICAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJT0NUTDo6dW5rbm93biBJT0NUTCdzIGNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCX0KKworICAgIGlmKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBTU0lECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQsICpwU3NpZD1OVUxMOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKKworICAgIGlmKCBzdHJsZW4oYXJnKSA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgeworICAgICAgICBOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKyAgICAgICAgaWYgKHN0cmxlbihhcmcpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLy9BTlkgc3NpZAorICAgICAgICB7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSAwOworCQkgICAgbWVtY3B5KFNzaWQuU3NpZCwgIiIsIDApOworCQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQl9CisgICAgICAgIHBTc2lkID0gJlNzaWQ7CisKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKworICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKXBTc2lkKTsKKworICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1NTSURfUHJvYzo6KExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gRkFMU0U7CisKKyAgICBpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV21tQ2FwYWJsZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUJPT0xFQU4JYldtbUNhcGFibGU7CisKKwliV21tQ2FwYWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKGJXbW1DYXBhYmxlID09IDEpCisjaWZkZWYgUlQyODcwCisJCSYmIChwQWQtPk51bWJlck9mUGlwZXMgPj0gNSkKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7CisJZWxzZSBpZiAoYldtbUNhcGFibGUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dtbUNhcGFibGVfUHJvYzo6KGJXbW1DYXBhYmxlPSVkKVxuIiwKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IE5ldHdvcmsgVHlwZShJbmZyYXN0cnVjdHVyZS9BZGhvYyBtb2RlKQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUlOVDMyCVZhbHVlID0gMDsKKworICAgIGlmIChzdHJjbXAoYXJnLCAiQWRob2MiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfQURIT0MpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy9CT09MRUFOIENhbmNlbGxlZDsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQkIhXG4iKSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiSW5mcmEiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfSU5GUkEpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooSU5GUkEpXG4iKSk7CisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApCisgICAgeworCQlVQ0hBUgliYnBWYWx1ZSA9IDA7CisJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJLy8gZGlzYWJsZSBhbGwgcGVyaW9kaWMgc3RhdGUgbWFjaGluZQorCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gRkFMU0U7CisJCS8vIHJlc2V0IGFsbCBtbG1lIHN0YXRlIG1hY2hpbmUKKwkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEIFxuIikpOworICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKQorICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gNjsKKyAgICAgICAgfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBlbHNlCisgICAgICAgICAgICBOX0NoYW5uZWxDaGVjayhwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgJj0gMHhmZmZmZmZmZTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IHVwcGVyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlIHw9ICgweDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJLy8gMjBNSHoKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCX0KKwkJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOworCQkvLyBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuCisJCS8vUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJLy9WYWx1ZSB8PSAoMHg4MCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJLy8gZGlzYWJsZSBzeW5jCisJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwkJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfTU9OSVRPUjsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihNT05JVE9SKVxuIikpOworICAgIH0KKworICAgIC8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X05ldHdvcmtUeXBlX1Byb2M6OihOZXR3b3JrVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcGF1dG8iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJPUEVOIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJvcGVuIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJzaGFyZWQiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQVBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhcHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFub25lIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMnBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0F1dGhNb2RlX1Byb2M6OihBdXRoTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBFbmNyeXB0aW9uIFR5cGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4OworCisgICAgS2V5SWR4ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKyAgICBpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEgKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0RlZmF1bHRLZXlJRF9Qcm9jOjooRGVmYXVsdEtleUlEPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV1BBIFBTSyBrZXkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisKKyAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV1BBUFNLX1Byb2M6OihXUEFQU0s9JXMpXG4iLCBhcmcpKTsKKworICAgIE5kaXNaZXJvTWVtb3J5KGtleU1hdGVyaWFsLCA0MCk7CisKKyAgICBpZiAoKHN0cmxlbihhcmcpIDwgOCkgfHwgKHN0cmxlbihhcmcpID4gNjQpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IGZhaWxlZCEhKFdQQVBTSz0lcyksIFdQQVBTSyBrZXktc3RyaW5nIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzIFxuIiwgYXJnKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoc3RybGVuKGFyZykgPT0gNjQpCisgICAgeworICAgICAgICBBdG9IKGFyZywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUGFzc3dvcmRIYXNoKChjaGFyICopYXJnLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworICAgIH0KKworCisKKyAgICBpZihwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCisgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgIHsKKyAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBQb3dlciBTYXZpbmcgbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgIHsKKyAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAorCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KKyAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIE1sbWVTZXRQc21CaXQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICB9CisKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXcGFTdXBwb3J0IGZsYWcuCisgICAgVmFsdWU6CisgICAgICAgIDA6IERyaXZlciBpZ25vcmUgd3BhX3N1cHBsaWNhbnQuCisgICAgICAgIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uLgorICAgICAgICAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycy4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisgICAgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV3BhX1N1cHBvcnQ6OihXcGFTdXBwbGljYW50VVA9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgTUFDCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBtYWMgMCAgICAgICAgPT0+IHJlYWQgTUFDIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBtYWMgMD0xMiAgICAgPT0+IHdyaXRlIE1BQyB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVUxPTkcJCQkJbWFjQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVSU5UMzIJCQkJbWFjVmFsdWUgPSAwOworCUlOVAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCSAgICB0aGlzX2NoYXIgPSBhcmc7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIE1hYyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAobWFjQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBtYWNBZGRyLCAmbWFjVmFsdWUpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSVseCwgTWFjVmFsdWU9JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIgLCBtYWNWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzgtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgOCkKKwkJCQl0ZW1wMls3LWsrK109JzAnOworCQkJdGVtcDJbOF09J1wwJzsKKworCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJCUF0b0godGVtcDIsIHRlbXAsIDQpOworCQkJCW1hY1ZhbHVlID0gKnRlbXAqMjU2KjI1NioyNTYgKyB0ZW1wWzFdKjI1NioyNTYgKyB0ZW1wWzJdKjI1NiArIHRlbXBbM107CisKKwkJCQkvLyBkZWJ1ZyBtb2RlCisJCQkJaWYgKG1hY0FkZHIgPT0gKEhXX0RFQlVHX1NFVFRJTkdfQkFTRSArIDQpKQorCQkJCXsKKwkJCQkJLy8gMHgyYmY0OiBieXRlMCBub24temVybzogZW5hYmxlIFIxNyB0dW5pbmcsIDA6IGRpc2FibGUgUjE3IHR1bmluZworICAgICAgICAgICAgICAgICAgICBpZiAobWFjVmFsdWUgJiAweDAwMDAwMGZmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9uIFIxNyB0dW5pbmdcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIFI2NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgUjY2ID0gMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcik7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCQl7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvZmYgUjE3IHR1bmluZywgcmVzdG9yZSB0byAweCUwMnhcbiIsIFI2NikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSUwMmx4LCBNYWNWYWx1ZT0weCV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJfQorCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bE1BQ1xuXG4iKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIEUyUFJPTQorICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgZTJwIDAgICAgIAk9PT4gcmVhZCBFMlBST00gd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIGUycCAwPTEyMzQgICAgPT0+IHdyaXRlIEUyUFJPTSB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIzNAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxFMlBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVU0hPUlQJCQkJZWVwQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVU0hPUlQJCQkJZWVwVmFsdWU7CisJaW50CQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IGFyZzsKKworCisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gRTJQUk9NIGFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChlZXBBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDRYXToweCUwNFggICIsIGVlcEFkZHIgLCBlZXBWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls0LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGVtcDJbMy1rKytdPScwJzsKKwkJCXRlbXAyWzRdPSdcMCc7CisKKwkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlBdG9IKHRlbXAyLCB0ZW1wLCAyKTsKKwkJCWVlcFZhbHVlID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwMlhdOiUwMlggICIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bEUyUFJPTVxuIikpOworfQorI2VuZGlmIC8vIERCRyAvLworCisKKworCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1RHbldpZmlUZXN0X1Byb2M6OihiVEduV2lmaVRlc3Q9JWQpXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlMb25nUmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCVNob3J0UmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfRmxleGlibGU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9TdHJpY3Q7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSWVlZTgwMmRNb2RlX1Byb2M6OihJRUVFRTAyMTFkTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUpKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYzo6KENhcnJpZXJEZXRlY3QuRW5hYmxlPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKQoreworCUlOVCBpOworCisJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlzcHJpbnRmKGV4dHJhLCAiJXNIVCBPcGVyYXRpbmcgTW9kZSA6ICVkXG4iLCBleHRyYSwgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXNwcmludGYoZXh0cmEsICIlc1xuJS0xOXMlLTRzJS00cyUtN3MlLTdzJS03cyUtMTBzJS02cyUtNnMlLTZzJS02c1xuIiwgZXh0cmEsCisJCQkiTUFDIiwgIkFJRCIsICJCU1MiLCAiUlNTSTAiLCAiUlNTSTEiLCAiUlNTSTIiLCAiUGhNZCIsICJCVyIsICJNQ1MiLCAiU0dJIiwgIlNUQkMiKTsKKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCWlmIChzdHJsZW4oZXh0cmEpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorCQkgICAgYnJlYWs7CisJCWlmICgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJc3ByaW50ZihleHRyYSwgIiVzJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggICIsIGV4dHJhLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5BaWQpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+YXBpZHgpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTApOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMHMiLCBleHRyYSwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZzIiwgZXh0cmEsIEdldEJXKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXKSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBkLCAlZCwgJWQlJVxuIiwgZXh0cmEsIHBFbnRyeS0+RGVidWdGSUZPQ291bnQsIHBFbnRyeS0+RGVidWdUeENvdW50LAorCQkJCQkJKHBFbnRyeS0+RGVidWdUeENvdW50KSA/ICgocEVudHJ5LT5EZWJ1Z1R4Q291bnQtcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCkqMTAwL3BFbnRyeS0+RGVidWdUeENvdW50KSA6IDApOworCQkJc3ByaW50ZihleHRyYSwgIiVzXG4iLCBleHRyYSk7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYxIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTIwOTZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MQpAQCAtMCwwICsxLDcwMzcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgc3RhX2lvY3RsLmMKKworICAgIEFic3RyYWN0OgorICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCisJUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisqLworCisjaW5jbHVkZQkicnRfY29uZmlnLmgiCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisjZW5kaWYKKworI2RlZmluZSBOUl9XRVBfS0VZUyAJCQkJNAorI2RlZmluZSBXRVBfU01BTExfS0VZX0xFTiAJCQkoNDAvOCkKKyNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4gCQkJKDEwNC84KQorCisjZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbHNlCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQorI2VuZGlmCisKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcExlbjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF9WRVJTSU9OX0lORk97CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblc7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblg7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblk7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblo7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRZZWFyOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkTW9udGg7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGREYXk7Cit9IFJUX1ZFUlNJT05fSU5GTywgKlBSVF9WRVJTSU9OX0lORk87CisKK3N0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0geworeyBSVFBSSVZfSU9DVExfU0VULAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIDAsCisgICJzZXQifSwKKworeyBSVFBSSVZfSU9DVExfU0hPVywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAoreyBSVFBSSVZfSU9DVExfU0hPVywgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCisvKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KKyAgICB7IFNIT1dfQ09OTl9TVEFUVVMsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiY29ublN0YXR1cyIgfSwKKwl7IFNIT1dfRFJWSUVSX1ZFUklPTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkcml2ZXJWZXIiIH0sCisgICAgeyBTSE9XX0JBX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYmFpbmZvIiB9LAorCXsgU0hPV19ERVNDX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGVzY2luZm8iIH0sCisgICAgeyBSQUlPX09GRiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vZmYiIH0sCisJeyBSQUlPX09OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29uIiB9LAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsgU0hPV19ETFNfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkbHNlbnRyeWluZm8iIH0sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyBTSE9XX0NGR19WQUxVRSwKKwkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInNob3ciIH0sCisJeyBTSE9XX0FESE9DX0VOVFJZX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYWRob2NFbnRyeSIgfSwKKworLyogLS0tIHN1Yi1pb2N0bHMgcmVsYXRpb25zIC0tLSAqLworCisjaWZkZWYgREJHCit7IFJUUFJJVl9JT0NUTF9CQlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJiYnAifSwKK3sgUlRQUklWX0lPQ1RMX01BQywKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJtYWMifSwKK3sgUlRQUklWX0lPQ1RMX0UyUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJlMnAifSwKKyNlbmRpZiAgLyogREJHICovCisKK3sgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MsCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJzdGF0In0sCit7IFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWSwKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZ2V0X3NpdGVfc3VydmV5In0sCit9OworCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKK1ZPSUQgUlRNUElvY3RsQkJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxFMlBST00oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgc3RydWN0IGl3cmVxICAgICp3cnEpOworI2VuZGlmIC8vIERCRyAvLworCisKK05ESVNfU1RBVFVTIFJUTVBXUEFOb25lQWRkS2V5UHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTglQVk9JRAkJCXBCdWYpOworCitJTlQgU2V0X0ZyYWdUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENIQVIJCQlleHRyYSk7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2V0X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOworfSAqUFJUTVBfUFJJVkFURV9TRVRfUFJPQywgUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQ1tdID0geworCXsiRHJpdmVyVmVyc2lvbiIsCQkJCVNldF9Ecml2ZXJWZXJzaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbiIsCQkJCVNldF9Db3VudHJ5UmVnaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbkFCYW5kIiwJCQlTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2N9LAorCXsiU1NJRCIsCQkJCQkJU2V0X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCQlTZXRfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTZXRfVHhCdXJzdF9Qcm9jfSwKKwl7IlR4UHJlYW1ibGUiLAkJCQlTZXRfVHhQcmVhbWJsZV9Qcm9jfSwKKwl7IlR4UG93ZXIiLAkJCQkJU2V0X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNldF9DaGFubmVsX1Byb2N9LAorCXsiQkdQcm90ZWN0aW9uIiwJCQkJU2V0X0JHUHJvdGVjdGlvbl9Qcm9jfSwKKwl7IlJUU1RocmVzaG9sZCIsCQkJCVNldF9SVFNUaHJlc2hvbGRfUHJvY30sCisJeyJGcmFnVGhyZXNob2xkIiwJCQkJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvY30sCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJeyJIdEJ3IiwJCSAgICAgICAgICAgICAgICBTZXRfSHRCd19Qcm9jfSwKKwl7Ikh0TWNzIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRNY3NfUHJvY30sCisJeyJIdEdpIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRHaV9Qcm9jfSwKKwl7Ikh0T3BNb2RlIiwJCSAgICAgICAgICAgIFNldF9IdE9wTW9kZV9Qcm9jfSwKKwl7Ikh0RXh0Y2hhIiwJCSAgICAgICAgICAgIFNldF9IdEV4dGNoYV9Qcm9jfSwKKwl7Ikh0TXBkdURlbnNpdHkiLAkJICAgICAgICBTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKKwl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgCVNldF9IdEJhV2luU2l6ZV9Qcm9jfSwKKwl7Ikh0UmRnIiwJCSAgICAgICAgCQlTZXRfSHRSZGdfUHJvY30sCisJeyJIdEFtc2R1IiwJCSAgICAgICAgCQlTZXRfSHRBbXNkdV9Qcm9jfSwKKwl7Ikh0QXV0b0JhIiwJCSAgICAgICAgCVNldF9IdEF1dG9CYV9Qcm9jfSwKKwl7Ikh0QmFEZWNsaW5lIiwJCQkJCVNldF9CQURlY2xpbmVfUHJvY30sCisJeyJIdFByb3RlY3QiLAkJICAgICAgICAJU2V0X0h0UHJvdGVjdF9Qcm9jfSwKKwl7Ikh0TWltb1BzIiwJCSAgICAgICAgCVNldF9IdE1pbW9Qc19Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwl7IlBrdEFnZ3JlZ2F0ZSIsCQkJCVNldF9Qa3RBZ2dyZWdhdGVfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFdNTV9TVVBQT1JUCisJeyJXbW1DYXBhYmxlIiwJCQkJCVNldF9XbW1DYXBhYmxlX1Byb2N9LAorI2VuZGlmCisJeyJJRUVFODAyMTFIIiwJCQkJCVNldF9JRUVFODAyMTFIX1Byb2N9LAorICAgIHsiTmV0d29ya1R5cGUiLCAgICAgICAgICAgICAgICAgU2V0X05ldHdvcmtUeXBlX1Byb2N9LAorCXsiQXV0aE1vZGUiLAkJCQkJU2V0X0F1dGhNb2RlX1Byb2N9LAorCXsiRW5jcnlwVHlwZSIsCQkJCQlTZXRfRW5jcnlwVHlwZV9Qcm9jfSwKKwl7IkRlZmF1bHRLZXlJRCIsCQkJCVNldF9EZWZhdWx0S2V5SURfUHJvY30sCisJeyJLZXkxIiwJCQkJCQlTZXRfS2V5MV9Qcm9jfSwKKwl7IktleTIiLAkJCQkJCVNldF9LZXkyX1Byb2N9LAorCXsiS2V5MyIsCQkJCQkJU2V0X0tleTNfUHJvY30sCisJeyJLZXk0IiwJCQkJCQlTZXRfS2V5NF9Qcm9jfSwKKwl7IldQQVBTSyIsCQkJCQkJU2V0X1dQQVBTS19Qcm9jfSwKKwl7IlJlc2V0Q291bnRlciIsCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2N9LAorCXsiUFNNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgU2V0X1BTTW9kZV9Qcm9jfSwKKyNpZmRlZiBEQkcKKwl7IkRlYnVnIiwJCQkJCQlTZXRfRGVidWdfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKwl7IkFURSIsCQkJCQkJCVNldF9BVEVfUHJvY30sCisJeyJBVEVEQSIsCQkJCQkJU2V0X0FURV9EQV9Qcm9jfSwKKwl7IkFURVNBIiwJCQkJCQlTZXRfQVRFX1NBX1Byb2N9LAorCXsiQVRFQlNTSUQiLAkJCQkJU2V0X0FURV9CU1NJRF9Qcm9jfSwKKwl7IkFURUNIQU5ORUwiLAkJCQkJU2V0X0FURV9DSEFOTkVMX1Byb2N9LAorCXsiQVRFVFhQT1cwIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2N9LAorCXsiQVRFVFhQT1cxIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIxX1Byb2N9LAorCXsiQVRFVFhBTlQiLAkJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFUlhBTlQiLAkJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFVFhGUkVRT0ZGU0VUIiwJCQkJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2N9LAorCXsiQVRFVFhCVyIsCQkJCQkJU2V0X0FURV9UWF9CV19Qcm9jfSwKKwl7IkFURVRYTEVOIiwJCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2N9LAorCXsiQVRFVFhDTlQiLAkJCQkJU2V0X0FURV9UWF9DT1VOVF9Qcm9jfSwKKwl7IkFURVRYTUNTIiwJCQkJCVNldF9BVEVfVFhfTUNTX1Byb2N9LAorCXsiQVRFVFhNT0RFIiwJCQkJCVNldF9BVEVfVFhfTU9ERV9Qcm9jfSwKKwl7IkFURVRYR0kiLAkJCQkJCVNldF9BVEVfVFhfR0lfUHJvY30sCisJeyJBVEVSWEZFUiIsCQkJCQlTZXRfQVRFX1JYX0ZFUl9Qcm9jfSwKKwl7IkFURVJSRiIsCQkJCQkJU2V0X0FURV9SZWFkX1JGX1Byb2N9LAorCXsiQVRFV1JGMSIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjFfUHJvY30sCisJeyJBVEVXUkYyIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jfSwKKwl7IkFURVdSRjMiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYzX1Byb2N9LAorCXsiQVRFV1JGNCIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjRfUHJvY30sCisJeyJBVEVMREUyUCIsCQkJCSAgICBTZXRfQVRFX0xvYWRfRTJQX1Byb2N9LAorCXsiQVRFUkUyUCIsCQkJCQkJU2V0X0FURV9SZWFkX0UyUF9Qcm9jfSwKKwl7IkFURVNIT1ciLAkJCQkJCVNldF9BVEVfU2hvd19Qcm9jfSwKKwl7IkFURUhFTFAiLAkJCQkJCVNldF9BVEVfSGVscF9Qcm9jfSwKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJeyJUeFN0b3AiLAkJCQkJCVNldF9UeFN0b3BfUHJvY30sCisJeyJSeFN0b3AiLAkJCQkJCVNldF9SeFN0b3BfUHJvY30sCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgeyJXcGFTdXBwb3J0IiwgICAgICAgICAgICAgICAgICBTZXRfV3BhX1N1cHBvcnR9LAorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKwl7IkZpeGVkVHhNb2RlIiwgICAgICAgICAgICAgICAgIFNldF9GaXhlZFR4TW9kZV9Qcm9jfSwKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCXsiT3BNb2RlIiwJCQkJCQlTZXRfT3BNb2RlX1Byb2N9LAorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgeyJUR25XaWZpVGVzdCIsICAgICAgICAgICAgICAgICBTZXRfVEduV2lmaVRlc3RfUHJvY30sCisgICAgeyJGb3JjZUdGIiwJCSAgICAgICAgCQlTZXRfRm9yY2VHRl9Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IkRsc0FkZEVudHJ5IiwJCQkJCVNldF9EbHNBZGRFbnRyeV9Qcm9jfSwKKwl7IkRsc1RlYXJEb3duRW50cnkiLAkJCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2N9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsiTG9uZ1JldHJ5IiwJICAgICAgICAJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKKwl7IlNob3J0UmV0cnkiLAkgICAgICAgIAkJU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jfSwKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJeyIxMWRDbGllbnRNb2RlIiwJCQkJU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2N9LAorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJeyJDYXJyaWVyRGV0ZWN0IiwJCQkJU2V0X0NhcnJpZXJEZXRlY3RfUHJvY30sCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJe05VTEwsfQorfTsKKworCitWT0lEIFJUTVBBZGRLZXkoCisJSU4JUFJUTVBfQURBUFRFUgkgICAgcEFkLAorCUlOCVBORElTXzgwMl8xMV9LRVkgICAgcEtleSkKK3sKKwlVTE9ORwkJCQlLZXlJZHg7CisJTUFDX1RBQkxFX0VOVFJZICAJKnBFbnRyeTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOworCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwl7CisJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCXsKKwkJICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisJCSAgICAvLyBVcGRhdGUgUFRLCisJCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKyAgICAgICAgCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgICAgIAllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKyAgICAgICAgCWVsc2UKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisgICAgICAgIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgIAlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworICAgICAgICAJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIHBFbnRyeSk7CisKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJICAgICAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKwkJfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBHVEsKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgTlVMTCk7CisKKyAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICB9CisJfQorCWVsc2UJLy8gZHluYW1pYyBXRVAgZnJvbSB3cGFfc3VwcGxpY2FudAorCXsKKwkJVUNIQVIJQ2lwaGVyQWxnOworICAgIAlQVUNIQVIJS2V5OworCisJCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKKwkJCWdvdG8gZW5kOworCisJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQlpZiAoS2V5SWR4IDwgNCkKKwkJeworCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZworCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKKworCQkJCWlmIChwRW50cnkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOworCisJCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKKwkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJCWVsc2UKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAorICAgICAgICAgICAgICAgIAkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCisJCQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCUJTUzAsCisJCQkJCQlLZXlJZHgsIC8vIFRoZSB2YWx1ZSBtYXkgYmUgbm90IHplcm8KKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJcEVudHJ5KTsKKworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyAgICAgICAgICAgIHsKKwkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisKKwkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJLy8gU2V0IENpcGVyIHR5cGUKKwkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCWVsc2UKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisgICAgCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKwkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKKyAgICAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJfQorCQl9CisJfQorZW5kOgorCXJldHVybjsKK30KKworY2hhciAqIHJ0c3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKK3sKKyAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQorICAgICAgICBpZiAoKnMgPT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKSBzOworfQorCisvKgorVGhpcyBpcyByZXF1aXJlZCBmb3IgTGluRVgyMDA0L2tlcm5lbDIuNi43IHRvIHByb3ZpZGUgaXdsaXN0IHNjYW5uaW5nIGZ1bmN0aW9uCisqLworCitpbnQKK3J0X2lvY3RsX2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisvLwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworI2lmZGVmIFJUMjg3MAorCXN0cm5jcHkobmFtZSwgIlJUMjg3MCBXaXJlbGVzcyIsIElGTkFNU0laKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJaW50IAljaGFuID0gLTE7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKworCWlmIChmcmVxLT5lID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZigoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKKwkJY2hhbiA9IGZyZXEtPm07CS8vIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKKwllbHNlCisJCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKKworICAgIGlmIChDaGFubmVsU2FuaXR5KHBBZGFwdGVyLCBjaGFuKSA9PSBUUlVFKQorICAgIHsKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQoraW50IHJ0X2lvY3RsX2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IE5VTEw7CisJVUNIQVIgY2g7CisJVUxPTkcJbTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCQljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7CisKKyAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOworCWZyZXEtPm0gPSBtICogMTAwOworCWZyZXEtPmUgPSAxOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKCptb2RlKQorCXsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCWJyZWFrOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsICptb2RlKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICAqbW9kZSA9IElXX01PREVfTU9OSVRPUjsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgICptb2RlID0gSVdfTU9ERV9BVVRPOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3bW9kZShtb2RlPSVkKVxuIiwgKm1vZGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJdTE2IHZhbDsKKwlpbnQgaTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT5ydF9pb2N0bF9naXdyYW5nZVxuIikpOworCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKworCWlmIChJTkZSQV9PTihwQWRhcHRlcil8fEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCXJhbmdlLT5taW5fcG1wID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG1wID0gNjU1MzUgKiAxMDI0OworCQlyYW5nZS0+bWluX3BtdCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtdCA9IDEwMDAgKiAxMDI0OworCQlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwKKwkJCUlXX1BPV0VSX1VOSUNBU1RfUiB8IElXX1BPV0VSX0FMTF9SOworCX0KKworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE0OworCisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMDsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OworCisJcmFuZ2UtPm51bV9jaGFubmVscyA9ICBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisKKwl2YWwgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2UtPm51bV9jaGFubmVsczsgaSsrKQorCXsKKwkJdTMyIG07CisJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWw7CisJCU1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsLCBtKTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsgLyogSFogKi8KKworCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOworCQl2YWwrKzsKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90CisJCQkJCSogZG9jdW1lbnRlZCBleGFjdGx5LiBBdCBsZWFzdAorCQkJCQkqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7IC8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsgLyogZEIgKi8KKworCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7CisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTYwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IC05NTsKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOworCisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBOUl9XRVBfS0VZUzsKKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworCS8qIElXX0VOQ19DQVBBXyogYml0IGZpZWxkICovCisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisJCQkJCUlXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgIHsKKyAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICB9CisKKyAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICBtZW1zZXQoQnNzaWQsIDAsIE1BQ19BRERSX0xFTik7CisgICAgbWVtY3B5KEJzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ1NJV0FQICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBFVEhfQUxFTik7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKKyAgICB9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lXQVAoPUVNUFRZKVxuIikpOworCQlyZXR1cm4gLUVOT1RDT05OOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVW5pdHMgYXJlIGluIGRiIGFib3ZlIHRoZSBub2lzZSBmbG9vci4gVGhhdCBtZWFucyB0aGUKKyAqIHJzc2kgdmFsdWVzIHJlcG9ydGVkIGluIHRoZSB0eC9yeCBkZXNjcmlwdG9ycyBpbiB0aGUKKyAqIGRyaXZlciBhcmUgdGhlIFNOUiBleHByZXNzZWQgaW4gZGIuCisgKgorICogSWYgeW91IGFzc3VtZSB0aGF0IHRoZSBub2lzZSBmbG9vciBpcyAtOTUsIHdoaWNoIGlzIGFuCisgKiBleGNlbGxlbnQgYXNzdW1wdGlvbiA5OS41ICUgb2YgdGhlIHRpbWUsIHRoZW4geW91IGNhbgorICogZGVyaXZlIHRoZSBhYnNvbHV0ZSBzaWduYWwgbGV2ZWwgKGkuZS4gLTk1ICsgcnNzaSkuCisgKiBUaGVyZSBhcmUgc29tZSBvdGhlciBzbGlnaHQgZmFjdG9ycyB0byB0YWtlIGludG8gYWNjb3VudAorICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJzc2kgbWVhc3VyZW1lbnQgaXMgZnJvbSAxMWIsCisgKiAxMWcsIG9yIDExYS4gICBUaGVzZSBkaWZmZXJlbmNlcyBhcmUgYXQgbW9zdCAyZGIgYW5kCisgKiBjYW4gYmUgZG9jdW1lbnRlZC4KKyAqCisgKiBOQjogdmFyaW91cyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBvcmlub2NvL3dhdmVsYW4KKyAqICAgICBkcml2ZXJzIGZvciBjb21wYXRpYmlsaXR5CisgKi8KK3N0YXRpYyB2b2lkIHNldF9xdWFsaXR5KFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciByc3NpKQoreworCV9fdTggQ2hhbm5lbFF1YWxpdHk7CisKKwkvLyBOb3JtYWxpemUgUnNzaQorCWlmIChyc3NpID49IC01MCkKKwkJQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJZWxzZSBpZiAocnNzaSA+PSAtODApIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKDI0ICsgKChyc3NpICsgODApICogMjYpLzEwKTsKKwllbHNlIGlmIChyc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQorICAgICAgICBDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgocnNzaSArIDkwKSAqIDI2KS8xMDsKKwllbHNlCisJCUNoYW5uZWxRdWFsaXR5ID0gMDsKKworICAgIGlxLT5xdWFsID0gKF9fdTgpQ2hhbm5lbFF1YWxpdHk7CisKKyAgICBpcS0+bGV2ZWwgPSAoX191OCkocnNzaSk7CisgICAgaXEtPm5vaXNlID0gKHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSA+IHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgPyAoKF9fdTgpcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA6ICgoX191OCkgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKTsgCS8vIG5vaXNlIGxldmVsIChkQm0pCisgICAgaXEtPm5vaXNlICs9IDI1NiAtIDE0MzsKKyAgICBpcS0+dXBkYXRlZCA9IHBBZGFwdGVyLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQ7Cit9CisKK2ludCBydF9pb2N0bF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CisJaW50IGk7CisKKyAgIAkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisgICAgICAgIC8vcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDxJV19NQVhfQVAgOyBpKyspCisJeworCQlpZiAoaSA+PSAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpCisJCQlicmVhazsKKwkJYWRkcltpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQltZW1jcHkoYWRkcltpXS5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmcXVhbFtpXSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisJfQorCWRhdGEtPmxlbmd0aCA9IGk7CisJbWVtY3B5KGV4dHJhLCAmYWRkciwgaSpzaXplb2YoYWRkclswXSkpOworCWRhdGEtPmZsYWdzID0gMTsJCS8qIHNpZ25hbCBxdWFsaXR5IHByZXNlbnQgKHNvcnQgb2YpICovCisJbWVtY3B5KGV4dHJhICsgaSpzaXplb2YoYWRkclswXSksICZxdWFsLCBpKnNpemVvZihxdWFsW2ldKSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NHSVdTQ0FOCitpbnQgcnRfaW9jdGxfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlVTE9ORwkJCQkJCQkJTm93OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50Kys7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuIDA7CisJZG97CisJCU5vdyA9IGppZmZpZXM7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDMpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDNcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisJCXsKKwkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQl9CisKKwkJLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisJCS8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisJCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCTAsCisJCQlOVUxMKTsKKworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKwl9d2hpbGUoMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCWludCBpPTA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhLCAqcHJldmlvdXNfZXYgPSBleHRyYTsKKwljaGFyICplbmRfYnVmOworCWNoYXIgKmN1cnJlbnRfdmFsLCBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0gezB9OworI2lmbmRlZiBJV0VWR0VOSUUKKwljaGFyIGlkeDsKKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICB7CisJCS8qCisJCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisJCSAqLworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID0gMDsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCisJeworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworICAgIGVsc2UKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbHNlCisgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQorICAgICAgICB7CisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworCQkvL01BQyBhZGRyZXNzCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRVNTSUQKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vTmV0d29yayBUeXBlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworCQl9CisJCWVsc2UKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQVVUTzsKKwkJfQorCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIElXX0VWX1VJTlRfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9DaGFubmVsIGFuZCBGcmVxdWVuY3kKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJZWxzZQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJaXdlLnUuZnJlcS5pID0gMDsKKworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKyAgICAgICAgLy9BZGQgcXVhbGl0eSBzdGF0aXN0aWNzCisgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAJaXdlLmNtZCA9IElXRVZRVUFMOworICAgIAlpd2UudS5xdWFsLmxldmVsID0gMDsKKyAgICAJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisgICAgICAgIHNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisgICAgCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRW5jeXB0aW9uIGtleQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCisJCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJZWxzZQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgICAgIGN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCZpd2UsIChjaGFyICopcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCktMV0uS2V5KTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9CaXQgUmF0ZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKyAgICAJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisgICAgICAgICAgICBpZiAodG1wUmF0ZSA9PSAweDgyKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4ODQpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAyICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDUuNSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlCisgICAgCQkgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAodG1wUmF0ZS8yKSAqIDEwMDAwMDA7CisKKwkJCWl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCQkJY3VycmVudF92YWwgPSBJV0VfU1RSRUFNX0FERF9WQUxVRShpbmZvLCBjdXJyZW50X2V2LAorCQkJCWN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLAorICAgIAkJCUlXX0VWX1BBUkFNX0xFTik7CisKKyAgICAgICAgCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQorICAgICAgICAgICAgCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKyAgICAgICAgCWVsc2UKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBJV0VWR0VOSUUKKwkJLy9XUEEgSUUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKwkJeworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgLy9XUEEgSUUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgIndwYV9pZT0iLCA3KTsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJyc25faWU9IiwgNyk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJfQorCisJZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SICwoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIixpICwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBydF9pb2N0bF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5mbGFncykKKwl7CisJCVBDSEFSCXBTc2lkU3RyaW5nID0gTlVMTDsKKworCQkvLyBJbmNsdWRlcyBudWxsIGNoYXJhY3Rlci4KKwkJaWYgKGRhdGEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSArIDEpKQorCQkJcmV0dXJuIC1FMkJJRzsKKworCQlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBTc2lkU3RyaW5nKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIGVzc2lkLCBkYXRhLT5sZW5ndGgpOworCQkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKSA9PSBGQUxTRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZWxzZQorCXsKKwkJLy8gQU5ZIHNzaWQKKwkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKSA9PSBGQUxTRSkKKwkJCXJldHVybiAtRUlOVkFMOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJZGF0YS0+ZmxhZ3MgPSAxOworICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIGRhdGEtPmxlbmd0aCAgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOworCQlkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworCWVsc2UKKwl7Ly90aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZAorCQlkYXRhLT5sZW5ndGggID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQgcnRfaW9jdGxfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHBBZGFwdGVyLT5uaWNrbmFtZSwgMCwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKKwltZW1jcHkocEFkYXB0ZXItPm5pY2tuYW1lLCBuaWNrbmFtZSwgZGF0YS0+bGVuZ3RoKTsKKworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChkYXRhLT5sZW5ndGggPiBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDEpCisJCWRhdGEtPmxlbmd0aCA9IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMTsKKwlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgeworCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoLTEpOworCQluaWNrbmFtZVtkYXRhLT5sZW5ndGgtMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwl1MTYgdmFsOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHJ0cy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlCisJCXZhbCA9IHJ0cy0+dmFsdWU7CisKKwlpZiAodmFsICE9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKQorCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlydHMtPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisJcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID09IE1BWF9SVFNfVEhSRVNIT0xEKTsKKwlydHMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJdTE2IHZhbDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoZnJhZy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgfHwgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICB2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gdmFsOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKwlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOworCWZyYWctPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKKyNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1CitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKwllbHNlIGlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEIHx8IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikpCisJeworCSAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICAJZWxzZQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisKKyAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQorCXsKKwkJaW50IGtleUlkeCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogQ2hlY2sga2V5IGluZGV4ICovCisJCWlmICgoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V3Jvbmcga2V5SWR4PSVkISBVc2luZyBkZWZhdWx0IGtleSBpbnN0ZWFkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgICAgICAgICAvL1VzaW5nIGRlZmF1bHQga2V5CisJCQlrZXlJZHggPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisKKwkJaWYgKGVycS0+bGVuZ3RoID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKwkJZWxzZSBpZiAoZXJxLT5sZW5ndGggPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQl9CisJCWVsc2UKKwkJCS8qIERpc2FibGUgdGhlIGtleSAqLworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisKKwkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dHJhLCBlcnEtPmxlbmd0aCk7CisgICAgICAgIH0KKwl9CisgICAgZWxzZQorCQkJeworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLworCQlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJaWYoIWVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCitkb25lOgorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6ZXJxLT5mbGFncz0leFxuIixlcnEtPmZsYWdzKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpBdXRoTW9kZT0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpEZWZhdWx0S2V5SWQ9JXgsIEtleUxlbiA9ICVkXG4iLHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXZXBTdGF0dXM9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKK3sKKwlpbnQga2lkOworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlraWQgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKKworCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJfQorCWVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9NCkpCisJeworCQkvLyBjb3B5IHdlcCBrZXkKKwkJZXJxLT5mbGFncyA9IGtpZCA7CQkJLyogTkI6IGJhc2UgMSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW4pCisJCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkKKwkJLy9lcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisKKwl9CisJZWxzZSBpZiAoa2lkID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgZXJxLT5sZW5ndGgpOworCQkvLyBjb3B5IGRlZmF1bHQga2V5IElECisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludAorcnRfaW9jdGxfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB2b2lkICp3LCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXI7CisJUE9TX0NPT0tJRSBwT2JqOworCWNoYXIgKnRoaXNfY2hhciA9IGV4dHJhOworCWNoYXIgKnZhbHVlOworCWludCAgU3RhdHVzPTA7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWRhcHRlci0+T1NfQ29va2llOworCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKCEqdGhpc19jaGFyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJICAgICp2YWx1ZSsrID0gMDsKKworCWlmICghdmFsdWUpCisJICAgIHJldHVybiAtRUlOVkFMOworCisJLy8gcmVqZWN0IHNldHRpbmcgbm90aGluZyBiZXNpZGVzIEFOWSBzc2lkKHNzaWRMZW49MCkKKyAgICBpZiAoISp2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNTSUQiKSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCisJeworCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCisJICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKKwkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICAgICAgfQorCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KKwkgICAgfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAorCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworCitzdGF0aWMgaW50CitydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKwlJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKyAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKwl9CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIldwYVN1cHBsaWNhbnRVUCAgICAgICAgICAgICAgICAgPSAlZFxuXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIHdycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkCWdldEJhSW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwT3V0QnVmKQoreworCUlOVCBpLCBqOworCUJBX09SSV9FTlRSWSAqcE9yaUJBRW50cnk7CisJQkFfUkVDX0VOVFJZICpwUmVjQkFFbnRyeTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAoKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQkJfHwgKHBFbnRyeS0+VmFsaWRBc1dEUykgfHwgKHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCQl7CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCisgICAgICAgICAgICAgICAgcE91dEJ1ZiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbUmVjaXBpZW50XVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcFJlY0JBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgTGFzdEluZFNlcT0lZCwgUmVvcmRlcmluZ1BrdHM9JWRcbiIsIHBPdXRCdWYsIGosIHBSZWNCQUVudHJ5LT5CQVdpblNpemUsIHBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLCBwUmVjQkFFbnRyeS0+bGlzdC5xbGVuKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuIiwgcE91dEJ1Zik7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW09yaWdpbmF0b3JdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwT3JpQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsIHBPdXRCdWYsIGosIHBPcmlCQUVudHJ5LT5CQVdpblNpemUsIHBPcmlCQUVudHJ5LT5TZXF1ZW5jZSwgcEVudHJ5LT5UeFNlcVtqXSk7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CisJCX0KKyAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkOworCVBPU19DT09LSUUJCXBPYmo7CisgICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCQlwQWQgPSBkZXYtPnByaXY7CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKyAgICBzd2l0Y2goc3ViY21kKQorICAgIHsKKworICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorICAgICAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgaWYgKElORlJBX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAllbHNlCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSE9XX0RSVklFUl9WRVJJT046CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiRHJpdmVyIHZlcnNpb24tJXMsICVzICVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyApOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgY2FzZSBTSE9XX0JBX0lORk86CisgICAgICAgICAgICBnZXRCYUluZm8ocEFkLCBleHRyYSk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNIT1dfREVTQ19JTkZPOgorCQkJeworCQkJCVNob3dfRGVzY0luZm9fUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09GRjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9mZlxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT046CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOworICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBTSE9XX0RMU19FTlRSWV9JTkZPOgorCQkJeworCQkJCVNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWNhc2UgU0hPV19DRkdfVkFMVUU6CisJCQl7CisJCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOworCQkJCWlmIChTdGF0dXMgPT0gMCkKKwkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTSE9XX0FESE9DX0VOVFJZX0lORk86CisJCQlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MocEFkLCBleHRyYSk7CisJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCWJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3ViY21kKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgU0lPQ1NJV01MTUUKK2ludCBydF9pb2N0bF9zaXdtbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19tbG1lICpwTWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKXdycXUtPmRhdGEucG9pbnRlcjsKKwlNTE1FX1FVRVVFX0VMRU0JCQkJTXNnRWxlbTsKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QJRGlzQXNzb2NSZXE7CisJTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgIERlQXV0aFJlcTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKworCWlmIChwTWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChwTWxtZS0+Y21kKQorCXsKKyNpZmRlZiBJV19NTE1FX0RFQVVUSAorCQljYXNlIElXX01MTUVfREVBVVRIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlDT1BZX01BQ19BRERSKERlQXV0aFJlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRlQXV0aFJlcSwgc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKTsKKwkJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCSAgICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLworI2lmZGVmIElXX01MTUVfRElTQVNTT0MKKwkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCUNPUFlfTUFDX0FERFIoRGlzQXNzb2NSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJRGlzQXNzb2NSZXEuUmVhc29uID0gIHBNbG1lLT5yZWFzb25fY29kZTsKKworCQkJTXNnRWxlbS5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCU1zZ0VsZW0uTXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRpc0Fzc29jUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOworCQkJYnJlYWs7CisjZW5kaWYgLy8gSVdfTUxNRV9ESVNBU1NPQyAvLworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBVbmtub3cgQ29tbWFuZFxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKK2ludCBydF9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisgICAgICAgICAgICAvKmlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKwkJCXsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIAkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0qLworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQl9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworCQkJfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKwkJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAlkZWZhdWx0OgorICAgIAkJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSA/IDAgOiAxOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKyAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSA/IElXX0FVVEhfQUxHX1NIQVJFRF9LRVkgOiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisJCXBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgPyAxIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX2dpd2F1dGg6OnBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgcGFyYW0tPnZhbHVlKSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZm5TZXRDaXBoZXJLZXkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgSU5UICAgICAgICAgICAgIGtleUlkeCwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgIENpcGhlckFsZywKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgIGJHVEssCisgICAgSU4gIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQpCit7CisgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIExFTl9US0lQX0VLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uVHhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAga2V5SWR4LAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uVHhNaWMsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYyk7CisKKyAgICBpZiAoYkdUSykKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICBOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAorICAgIAkJCQkJCQkgIEJTUzAsCisgICAgCQkJCQkJCSAga2V5SWR4LAorICAgIAkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisgICAgCQkJCQkJCSAgJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSk7Cit9CisKK2ludCBydF9pb2N0bF9zaXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCisJCQl7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKyAgICBpbnQga2V5SWR4LCBhbGcgPSBleHQtPmFsZzsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKKwl7CisgICAgICAgIGtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAgICAgLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQorCSAgICBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgQlNTSURfV0NJRCk7CisgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKWtleUlkeCk7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpSZW1vdmUgYWxsIGtleXMhKGVuY29kaW5nLT5mbGFncyA9ICV4KVxuIiwgX19GVU5DVElPTl9fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbGcpIHsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX05PTkVcbiIsIF9fRlVOQ1RJT05fXykpOworICAgIAkJCWJyZWFrOworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQl9CisgICAgICAgIAkJZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisgICAgCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKwkJeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgCS8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCQlkZWZhdWx0OgorICAgIAkJCXJldHVybiAtRUlOVkFMOworCQl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlQQ0hBUiBwS2V5ID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0XG4iKSk7CisKKwltYXhfa2V5X2xlbiA9IGVuY29kaW5nLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7CisJaWYgKG1heF9rZXlfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkKKwl7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4LS07CisKKwkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCWlmIChpZHggIT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlleHQtPmtleV9sZW4gPSAwOworCXN3aXRjaChwQWQtPlN0YUNmZy5XZXBTdGF0dXMpIHsKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiBtYXhfa2V5X2xlbikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOworCQkJCXBLZXkgPSAmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJCWVsc2UKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKworCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAzMjsKKwkJCQlwS2V5ID0gJnBBZC0+U3RhQ2ZnLlBNS1swXTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KQorCXsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQltZW1jcHkoZXh0LT5rZXksIHBLZXksIGV4dC0+a2V5X2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DU0lXR0VOSUUKK2ludCBydF9pb2N0bF9zaXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IE1BWF9MRU5fT0ZfUlNOSUUgfHwKKwkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIGV4dHJhID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisKK2ludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAorCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCXJldHVybiAtRTJCSUc7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCisJCQlyZXR1cm4gLUUyQklHOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkJUlNOSWUgPSBJRV9SU047CisKKwkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKKwkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOworCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCisJaWYgKHBQbWtzYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKKwlzd2l0Y2gocFBta3NhLT5jbWQpCisJeworCQljYXNlIElXX1BNS1NBX0ZMVVNIOgorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9SRU1PVkU6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkgICAgICAgIHsKKwkJICAgICAgICAJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRCwgMTYpOworCQkJCQlmb3IgKGlkeCA9IENhY2hlZElkeDsgaWR4IDwgKHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtIC0gMSk7IGlkeCsrKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5CU1NJRFswXSwgTUFDX0FERFJfTEVOKTsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLlBNS0lEWzBdLCAxNik7CisJCQkJCX0KKwkJCQkJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0tLTsKKwkJCSAgICAgICAgYnJlYWs7CisJCSAgICAgICAgfQorCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX1JFTU9WRVxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfQUREOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJCSAgICAgICAgYnJlYWs7CisJICAgICAgICB9CisKKwkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJICAgICAgICB7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOworCSAgICAgICAgfQorCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0FERFxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIFVua25vdyBDb21tYW5kISFcbiIpKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vICNpZiBXSVJFTEVTU19FWFQgPiAxNworCisjaWZkZWYgREJHCitzdGF0aWMgaW50CitydF9wcml2YXRlX2lvY3RsX2JicChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCisJCQl7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlID0gTlVMTDsKKwlVQ0hBUgkJCQlyZWdCQlAgPSAwOworLy8JQ0hBUgkJCQlhcmdbMjU1XT17MH07CisJVUlOVDMyCQkJCWJicElkOworCVVJTlQzMgkJCQliYnBWYWx1ZTsKKwlCT09MRUFOCQkJCWJJc1ByaW50QWxsQkJQID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisKKwltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCWlmICh3cnEtPmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwkJCQl7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IHdycS0+cG9pbnRlcjsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzXG4iLCB0aGlzX2NoYXIpKTsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzLCB2YWx1ZT0lc1xuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCQkJaWYgKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJaWYgKChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkgJiYgKHNzY2FuZih2YWx1ZSwgIiV4IiwgJihiYnBWYWx1ZSkpID09IDEpKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKwkJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisgICAgCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworICAgIAkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCX0KKwllbHNlCisJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKworbmV4dDoKKwlpZiAoYklzUHJpbnRBbGxCQlApCisJeworCQltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisJCWZvciAoYmJwSWQgPSAwOyBiYnBJZCA8PSAxMzY7IGJicElkKyspCisJCXsKKwkJICAgIGlmIChzdHJsZW4oZXh0cmEpID49IChJV19QUklWX1NJWkVfTUFTSyAtIDEwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYICAgICIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworCQkJaWYgKGJicElkJTUgPT0gNCkKKwkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJcbiIpOworCQl9CisKKyAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09cnRfcHJpdmF0ZV9pb2N0bF9iYnBcblxuIikpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworaW50IHJ0X2lvY3RsX3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBVSU5UMzIgICAgICAgICAgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihyYXRlID0gJWQsIGZpeGVkID0gJWQpXG4iLCByYXRlLCBmaXhlZCkpOworICAgIC8qIHJhdGUgPSAtMSA9PiBhdXRvIHJhdGUKKyAgICAgICByYXRlID0gWCwgZml4ZWQgPSAxID0+IChmaXhlZCByYXRlIFgpCisgICAgKi8KKyAgICBpZiAocmF0ZSA9PSAtMSkKKyAgICB7CisJCS8vQXV0byBSYXRlCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZml4ZWQpCisgICAgICAgIHsKKyAgICAgICAgCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorICAgICAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKQorICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOworICAgIEhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOworICAgIF9fczMyIHJhbGlua3JhdGVbXSA9CisJezIsICA0LCAgIDExLCAgMjIsIC8vIENDSworCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KKwkxMywgMjYsICAgMzksICA1MiwgIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgIDUyLCAgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJMzksIDc4LCAgMTE3LCAxNTYsIDIzNCwgMzEyLCAzNTEsIDM5MCwJCQkJCQkJCQkJICAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTI3LCA1NCwgICA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLAkJCQkJCQkJCQkgIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMTQsIDI5LCAgIDQzLCAgNTcsICA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LCAgIDg3LCAxMTUsIDE3MywgMjMwLCAyNjAsIDI4OCwgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKworICAgIHJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkvc2l6ZW9mKF9fczMyKTsKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSAmJgorICAgICAgICAoSU5GUkFfT04ocEFkKSkgJiYKKyAgICAgICAgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8IChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpKQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKyAgICBlbHNlCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisgICAgeworLy8gICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMTYpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjMyKSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUykgKyA0OworICAgIGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCisgICAgaWYgKHJhdGVfaW5kZXggPCAwKQorICAgICAgICByYXRlX2luZGV4ID0gMDsKKworICAgIGlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CisKKyAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKyAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQoreworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLworI2lmZGVmIFNJT0NTSVdNTE1FCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21sbWUsCSAgICAgICAgLyogU0lPQ1NJV01MTUUgICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLworI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2l3YXBsaXN0LAkJICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KKyNpZmRlZiBTSU9DR0lXU0NBTgorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZW5kaWYgLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCQkgICAgLyogU0lPQ1NJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJCSAgICAvKiBTSU9DR0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd25pY2tuLAkJICAgIC8qIFNJT0NTSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCQkgICAgLyogU0lPQ0dJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCQkgICAgLyogU0lPQ1NJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCQkgICAgLyogU0lPQ0dJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmFnLAkJICAgIC8qIFNJT0NTSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJCSAgICAvKiBTSU9DR0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKyAgICAoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ1NJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwgICAgICAgICAvKiBTSU9DR0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2F1dGgsCQkgICAgLyogU0lPQ1NJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhdXRoLAkJICAgIC8qIFNJT0NHSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGVleHQsCQkvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3Bta3NhLCAgICAgICAgIC8qIFNJT0NTSVdQTUtTQSAgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0geworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMiAqLworI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCisjaWZkZWYgREJHCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfaW9jdGxfYmJwLCAvKiArIDB4MDMgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMyAqLworI2VuZGlmCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE4ICovCit9OworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0KK3sKKyNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcnRfcHJpdl9oYW5kbGVycywKKwkubnVtX3ByaXZhdGUJCT0gTihydF9wcml2X2hhbmRsZXJzKSwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpdnRhYiwKKwkubnVtX3ByaXZhdGVfYXJncwk9IE4ocHJpdnRhYiksCisjaWYgSVdfSEFORExFUl9WRVJTSU9OID49IDcKKyAgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorfTsKKworSU5UIFJUTVBTZXRJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnNzaWQ7CisgICAgUlRfODAyXzExX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgUGh5TW9kZTsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICBTdGFDb25maWc7CisgICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXM7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1ibGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIFBORElTXzgwMl8xMV9LRVkgICAgICAgICAgICAgICAgICAgIHBLZXkgPSBOVUxMOworICAgIFBORElTXzgwMl8xMV9XRVAJCQkgICAgICAgIHBXZXBLZXkgPU5VTEw7CisgICAgUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgICAgICAgICAgICAgcFJlbW92ZUtleSA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlnLCAqcENvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0VHlwZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3c7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gMDsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTLCBNYXhQaHlNb2RlID0gUEhZXzExRzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlclRlbXA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJT0lEX1NFVF9IVF9QSFlNT0RFCQkJCQlIVF9QaHlNb2RlOwkvLzExbiAsa2F0aHkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgUE5ESVNfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgcFBta0lkID0gTlVMTDsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhTdGF0ZSA9IEZBTFNFOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZW5hYmxlID0gMDsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQljdG1wOworI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLworCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5SVE1QU2V0SW5mb3JtYXRpb24oKSwJMHglMDh4XG4iLCBjbWQmMHg3RkZGKSk7CisgICAgc3dpdGNoKGNtZCAmIDB4N0ZGRikgeworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoIDwgc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworCQkJLy8gT25seSBhdmFsaWFibGUgd2hlbiBFRVBST00gbm90IHByb2dyYW1taW5nCisgICAgICAgICAgICBlbHNlIGlmICghKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4ODApICYmICEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTE9ORyAgIENvdW50cnk7CisgICAgICAgICAgICAgICAgVUNIQVIJVG1wUGh5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvdW50cnksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKShDb3VudHJ5ICYgMHgwMDAwMDBGRik7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpKChDb3VudHJ5ID4+IDgpICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgVG1wUGh5ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCQkJLy8gQnVpbGQgYWxsIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbgorCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gKEE6JWQgIEIvRzolZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLAorCQkJCSAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorICNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIE5vdyA9IGppZmZpZXM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLCBUeENudCA9ICVkIFxuIiwgcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQpKTsKKworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJLy9CZW5zb24gYWRkIDIwMDgwNTI3LCB3aGVuIHJhZGlvIG9mZiwgc3RhIGRvbid0IG5lZWQgdG8gc2NhbgorCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCQkJYnJlYWs7CisKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQl7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBzY2FubmluZyBub3cgISEhXG4iKSk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQlpZiAocEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPiAxMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisgICAgICAgICAgICBSVE1QX1NFVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlQQ0hBUiBwU3NpZFN0cmluZyA9IE5VTEw7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgICAgICAgICAgICAgIGlmIChTc2lkLlNzaWRMZW5ndGggPiBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAJaWYgKFNzaWQuU3NpZExlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIik7CisgICAgICAgICAgICAgICAgCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgICAgIAlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJCQkJCWlmIChwU3NpZFN0cmluZykKKwkJCQkJCXsKKwkJCQkJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBTc2lkLlNzaWQsIFNzaWQuU3NpZExlbmd0aCk7CisJICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpOworCQkJCQkJCWtmcmVlKHBTc2lkU3RyaW5nKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisKKwkJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyAhPSBSYWRpb1N0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyA9IFJhZGlvU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BIWV9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUGh5TW9kZSA8PSBNYXhQaHlNb2RlKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVkKVxuIiwgUGh5TW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTdGFDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFN0YUNvbmZpZy5FbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gU3RhQ29uZmlnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gMTsgLy8gMjAwMy0xMC0zMCBhbHdheXMgU0hPUlQgU0xPVCBjYXBhYmxlCisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gU3RhQ29uZmlnLkFkaG9jTW9kZSkgJiYKKwkJCQkJKFN0YUNvbmZpZy5BZGhvY01vZGUgPD0gTWF4UGh5TW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBkeW5hbWljIGNoYW5nZSBvZiAiVVNFIE9GRE0gcmF0ZSBvciBub3QiIGluIEFESE9DIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2V0dGluZyBjaGFuZ2VkLCBuZWVkIHRvIHJlc2V0IGN1cnJlbnQgVFggcmF0ZSBhcyB3ZWxsIGFzIEJFQUNPTiBmcmFtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgICAgIHsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IFN0YUNvbmZpZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgTWFrZUlic3NCZWFjb24ocEFkYXB0ZXIpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBBc2ljRW5hYmxlSWJzc1N5bmMocEFkYXB0ZXIpOyAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgKEJ1cnN0PSVkLCBQcm90ZWN0aW9uPSVsZCxTaG9ydFNsb3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFU0lSRURfUkFURVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFyeVJhdGVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVTSVJFRF9SQVRFUyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSApKTsKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2luZyBEZXNpcmVkUmF0ZSBtYXkgYWZmZWN0IHRoZSBNQVggVFggcmF0ZSB3ZSB1c2VkIHRvIFRYIGZyYW1lcyBvdXQKKyAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QUkVBTUJMRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlByZWFtYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlTG9uZykgfHwgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVBdXRvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCisgICAgICAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgdXBvbiBhc3NvY2lhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUgKD0lZClcbiIsIFByZWFtYmxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9XRVBfU1RBVFVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIFNpbmNlIFRLSVAsIEFFUywgV0VQIGFyZSBhbGwgc3VwcG9ydGVkLiBJdCBzaG91bGQgbm90IGhhdmUgYW55IGludmFsaWQgc2V0dGluZworICAgICAgICAgICAgICAgIGlmIChXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICE9IFdlcFN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyAoPSVkKVxuIixXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZBdXRoTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoQXV0aE1vZGUgPiBOZGlzODAyXzExQXV0aE1vZGVNYXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IEF1dGhNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IEF1dGhNb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICg9JWQpIFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzVHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFNb25pdG9yKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgID0gLUVJTlZBTDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUgKHVua25vd24pXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfV0VQOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9XRVBcbiIpKTsKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0tFWV9JTkRFWCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJCQlLZXlJZHggPSAqKE5ESVNfODAyXzExX0tFWV9JTkRFWCAqKSB3cnEtPnUuZGF0YS5wb2ludGVyOworCisJCQkJaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworCQkJCQlpZiAoS2V5SWR4ID49IDQpeworCQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKwkJCQkJfQorCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlM6CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOworICAgICAgICAgICAgcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXMgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworI2lmZGVmIFJUMjg3MAorCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZQk9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlT3RoZXI9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlQ2FuY2VsID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0UmVxID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5SZXE9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGUgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJbkNvbXBsZXRlRmFpbCA9IDA7CisjZW5kaWYgLy8gUlQyODcwIC8vCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChSdHNUaHJlc2ggPiBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IChVU0hPUlQpUnRzVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQgKD0lbGQpXG4iLFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAoPSVsZCkgXG4iLEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1BPV0VSX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkNBTSIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTWF4X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkZhc3RfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJMZWdhY3lfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1BPV0VSX01PREUgKD0lZClcbiIsUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAgPCBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyVGVtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUG93ZXJUZW1wID4gMTAwKQorCQkJCQlQb3dlclRlbXAgPSAweGZmZmZmZmZmOyAgLy8gQVVUTworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBQb3dlclRlbXA7IC8va2VlcCBjdXJyZW50IHNldHRpbmcuCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJfQorCSAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19UWVBFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZOZXRUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMURTKQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQik7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTI0KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQkdfTUlYRUQpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQSk7CisJCQkJZWxzZQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFICg9JWQpXG4iLE5ldFR5cGUpKTsKKwkJICAgIH0KKwkJCWJyZWFrOworICAgICAgICAvLyBGb3IgV1BBIFBTSyBQTUsga2V5CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9BRERfV1BBOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISEgW0F1dGhNb2RlICE9IFdQQVBTSy9XUEEyUFNLL1dQQU5PTkVdXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkgICAgIC8vIE9ubHkgZm9yIFdQQSBQU0sgbW9kZQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFJhQ29uZmlnIGFzIFBTSyBhZ2VudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfS0VZOgorICAgICAgICAgICAgcFJlbW92ZUtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwUmVtb3ZlS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFJlbW92ZUtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwUmVtb3ZlS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUTVBXUEFSZW1vdmVLZXlQcm9jKHBBZGFwdGVyLCBwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIFJlbW92ZSBXUEEgS2V5ISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gcFJlbW92ZUtleS0+S2V5SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleSlcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoS2V5SWRbJWRdIG91dCBvZiByYW5nZSlcbiIsIEtleUlkeCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBSZW1vdmVLZXktPktleUluZGV4LCBwUmVtb3ZlS2V5LT5MZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBSZW1vdmVLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIE5ldyBmb3IgV1BBCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BRERfS0VZOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QQWRkS2V5KHBBZGFwdGVyLCBwS2V5KTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcENvbmZpZyA9ICZDb25maWc7CisKKyAgICAgICAgICAgICAgICBpZiAoKHBDb25maWctPkJlYWNvblBlcmlvZCA+PSAyMCkgJiYgKHBDb25maWctPkJlYWNvblBlcmlvZCA8PTQwMCkpCisgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChVU0hPUlQpIHBDb25maWctPkJlYWNvblBlcmlvZDsKKworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChVU0hPUlQpIHBDb25maWctPkFUSU1XaW5kb3c7CisgICAgICAgICAgICAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKHBDb25maWctPkRTQ29uZmlnLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgICAgIC8vCisJCQkJLy8gU2F2ZSB0aGUgY2hhbm5lbCBvbiBNbG1lQXV4IGZvciBDbnRsT2lkUlRCc3NpZFByb2MgdXNlZC4KKwkJCQkvLworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAoQmVhY25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaD0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkJlYWNvblBlcmlvZCwgcENvbmZpZy0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREU6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkgICAgUE9JRF9TRVRfSFRfUEhZTU9ERQlwSFRQaHlNb2RlID0gJkhUX1BoeU1vZGU7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSFRfUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnBIVFBoeU1vZGUJKFBoeU1vZGUgPSAlZCxUcmFuc21pdE5vID0gJWQsIEh0TW9kZSA9CSVkLAlFeHRPZmZzZXQgPQklZCAsIE1DUyA9ICVkLCBCVyA9CSVkLAlTVEJDID0gJWQsIFNIT1JUR0kgPSAlZCkgXG4iLAorCQkJCXBIVFBoeU1vZGUtPlBoeU1vZGUsIHBIVFBoeU1vZGUtPlRyYW5zbWl0Tm8scEhUUGh5TW9kZS0+SHRNb2RlLHBIVFBoeU1vZGUtPkV4dE9mZnNldCwKKwkJCQlwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLAlwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZQk+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJCQlSVE1QU2V0SFQocEFkYXB0ZXIsCXBIVFBoeU1vZGUpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFKE1DUz0lZCxCVz0lZCxTR0k9JWQsU1RCQz0lZClcbiIsCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDKSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkc6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVTE9ORyBhcHNkIDsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXBzZCwgd3JxLT51LmRhdGEucG9pbnRlciwJd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXxCMzF+QjcJfAlCNn5CNQkgfAkgQjQJIHwJIEIzCSB8CUIyCSB8CUIxCSB8CSAgIEIwCQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfCBSc3ZkCXwgTWF4IFNQIExlbiB8IEFDX1ZPIHwgQUNfVkkgfCBBQ19CSyB8IEFDX0JFIHwgQVBTRAlDYXBhYmxlCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gKGFwc2QgJiAweDAwMDAwMDAxKSA/IFRSVUUgOglGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSAoKGFwc2QJJiAweDAwMDAwMDAyKSA+PiAxKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSAoKGFwc2QJJiAweDAwMDAwMDA0KSA+PiAyKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSAoKGFwc2QJJiAweDAwMDAwMDA4KSA+PiAzKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSAoKGFwc2QJJiAweDAwMDAwMDEwKSA+PiA0KQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoCT0gKFVDSEFSKSgoYXBzZAkmIDB4MDAwMDAwNjApID4+IDUpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkcgKGFwc2Q9MHglbHgsIEFQU0RDYXA9JWQsIFtCRSxCSyxWSSxWT109WyVkLyVkLyVkLyVkXSwJTWF4U1BMZW49JWQpXG4iLCBhcHNkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSwKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkssCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJLy8gRHJpdmVyIG5lZWRzCXRvIG5vdGlmeSBBUCB3aGVuIFBTTSBjaGFuZ2VzCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlCSE9IHBBZGFwdGVyLT5TdGFDZmcuUHNtKQorCQkJCXsKKwkJCQkJTWxtZVNldFBzbUJpdChwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKTsKKwkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlLAlUUlVFKTsKKwkJCQl9CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTSAoYkFQU0RGb3JjZVBvd2VyU2F2ZTolZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJQk9PTEVBTglvbGR2YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGU7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKG9sZHZhbHVlICYmCSFwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQkJCXsKKwkJCQkJaW50CWk7CisJCQkJCS8vIHRlYXIJZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCQkJZm9yCShpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy8gdGVhcglkb3duIHBlZXIgZGxzIHRhYmxlCWVudHJ5CisJCQkJCWZvcgkoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUlRfODAyXzExX0RMUwlEbHM7CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCQkJCVJUTVBNb3ZlTWVtb3J5KCZEbHMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJCQkmRGxzKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNIFxuIikpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfV01NOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1dNTSAoPSVkKQlcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkvLworCQkJLy8gU2V0IE5kaXNSYWRpb1N0YXRlT2ZmIHRvCVRSVUUsIGluc3RlYWQgb2YgY2FsbGVkCU1sbWVSYWRpb09mZi4KKwkJCS8vIExhdGVyIG9uLCBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYLT5OdW1iZXJPZkl0ZW1zIHNob3VsZCBiZQkwCisJCQkvLyB3aGVuCXF1ZXJ5IE9JRF84MDJfMTFfQlNTSURfTElTVC4KKwkJCS8vCisJCQkvLyBUUlVFOiAgTnVtYmVyT2ZJdGVtcwl3aWxsIHNldCB0bwkwLgorCQkJLy8gRkFMU0U6IE51bWJlck9mSXRlbXMJbm8gY2hhbmdlLgorCQkJLy8KKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPQlUUlVFOworCQkJLy8gU2V0IHRvIGltbWVkaWF0ZWx5IHNlbmQgdGhlIG1lZGlhIGRpc2Nvbm5lY3QJZXZlbnQKKwkJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzCT0gVFJVRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJXG4iKSk7CisKKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPQlDTlRMX0lETEUpCisJCQkJeworCQkJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUJYnVzeSwgcmVzZXQJTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkJCX0KKworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUsCisJCQkJCTAsCisJCQkJCU5VTEwpOworCisJCQkJU3RhdGVNYWNoaW5lVG91Y2hlZAk9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0lNTUVfQkFfQ0FQOgorCQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9CQUNBUF9TVFJVQykpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJT0lEX0JBQ0FQX1NUUlVDIE9yZGUgOworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmT3JkZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJaWYgKE9yZGUuUG9saWN5ID4gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoT3JkZS5Qb2xpY3kgPT0gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBPcmRlLkF1dG9CQTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOyAvLyB3ZSBvbmx5IHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCisJCQkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID4gTUFYX1JYX1JFT1JERVJCVUYpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gTUFYX1JYX1JFT1JERVJCVUY7CisKKwkJCQkJfQorCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihPcmRlLkF1dG9CQSA9ICVkKSAoUG9saWN5PSVkKShSZUJBV2luTGltaXQ9JWQpKFR4QkFXaW5MaW1pdD0lZCkoQXV0b01vZGU9JWQpXG4iLE9yZGUuQXV0b0JBLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3ksCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQscEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooTWltb1BzID0gJWQpKEFtc2R1RW5hYmxlID0gJWQpIChBbXNkdVNpemU9JWQpKE1wZHVEZW5zaXR5PSVkKVxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlLAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgU2V0IDo6IFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVQ0hBUgkJICAgICAgICBpbmRleDsKKwkJCQlPSURfQUREX0JBX0VOVFJZICAgIEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAgICAgKnBFbnRyeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoQkEuVElEID4gMTUpCisJCQkJeworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeQorCQkJCQkvL0FzIGFkLWhvYyBtb2RlLCBCQSBwYWlyIGlzIG5vdCBsaW1pdGVkIHRvIG9ubHkgQlNTSUQuIHNvIGFkZCB2aWEgT0lELgorCQkJCQlpbmRleCA9IEJBLlRJRDsKKwkJCQkJLy8gaW4gYWQgaG9jIG1vZGUsIHdoZW4gYWRkaW5nIEJBIHBhaXIsIHdlIHNob3VsZCBpbnNlcnQgdGhpcyBlbnRyeSBpbnRvIE1BQ0VudHJ5IHRvbworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgQkEuTUFDQWRkcik7CisJCQkJCWlmICghcEVudHJ5KQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBicmVhayBvbiBubyBjb25uZWN0aW9uLi0tLS06JXg6JXhcbiIsIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChCQS5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkgICAgaWYgKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gVFJVRSkKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSAweDEwOworCisJCQkJCQlCQU9yaVNlc3Npb25TZXRVcChwQWRhcHRlciwgcEVudHJ5LCBpbmRleCwgMCwgMTAwLCBUUlVFKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5KHBBZGFwdGVyLCBwRW50cnktPkFpZCwgQkEuTUFDQWRkciwgMCwgMHhmZmZmLCBCQS5USUQsIEJBLm5NU0RVLCBCQS5Jc1JlY2lwaWVudCk7CisJCQkJCX0KKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIFJlYyA9ICVkLiBNYWMgPSAleDoleDoleDoleDoleDoleCAuIFxuIiwKKwkJCQkJCUJBLklzUmVjaXBpZW50LCBCQS5NQUNBZGRyWzBdLCBCQS5NQUNBZGRyWzFdLCBCQS5NQUNBZGRyWzJdLCBCQS5NQUNBZGRyWzJdCisJCQkJCQksIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUE9JRF9BRERfQkFfRU5UUlkJcEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisJCQkJcEJBID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCQkJCWlmIChwQkEgPT0gTlVMTCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBrbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIikpOworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQShUSUQ9JWQsIGJBbGxUaWQ9JWQpXG4iLCBwQkEtPlRJRCwgcEJBLT5iQWxsVGlkKSk7CisKKwkJCQkJaWYgKCFwQkEtPmJBbGxUaWQgJiYgKHBCQS0+VElEID4gTlVNX09GX1RJRCkpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0VcbiIpKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+cEVudHJ5XG4iKSk7CisJCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgRkFMU0UsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKCBwQWRhcHRlciwgKFVDSEFSKXBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJa2ZyZWUocEJBKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBGb3IgV1BBX1NVUFBMSUNBTlQgdG8gc2V0IHN0YXRpYyB3ZXAga2V5CisgICAgCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgorICAgIAkgICAgcFdlcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAJICAgIGlmKHBXZXBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdlcEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAobGVuZ3RoIG1pc21hdGNoKSEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCSAgICAgICAgS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgIC8vIEtleUlkeCBtdXN0IGJlIDAgfiAzCisgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDQpCisgICAgCQkJeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAoS2V5SWR4IG11c3QgYmUgc21hbGxlciB0aGFuIDQpISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgQ2lwaGVyQWxnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIEtleTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBXZXBLZXktPktleUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIG9ubHkgc3VwcG9ydCBDSVBIRVJfV0VQNjQobGVuOjUpICYgQ0lQSEVSX1dFUDEyOChsZW46MTMpISFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZCA9IEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgICAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworICAgIAkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQIChpZD0weCV4LCBMZW49JWQtYnl0ZSksICVzXG4iLCBwV2VwS2V5LT5LZXlJbmRleCwgcFdlcEtleS0+S2V5TGVuZ3RoLCAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyAiUG9ydCBTZWN1cmVkIjoiUG9ydCBOT1QgU2VjdXJlZCIpKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwV2VwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgY2FzZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV1BBIE1JQyBlcnJvciBzaG91bGQgYmxvY2sgYXNzb2NpYXRpb24gYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfU0VUX0NPVU5URVJNRUFTVVJFUyBiQmxvY2tBc3NvYz0lc1xuIiwgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA/ICJUUlVFIjoiRkFMU0UiKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmd3BhX3N1cHBsaWNhbnRfZW5hYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgIAkJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gd3BhX3N1cHBsaWNhbnRfZW5hYmxlOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgKnBJbmZvOworCQkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgICAgICAgICAgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKSBNc2dFbGVtLT5Nc2c7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEluZm8sIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTWxtZURlYXV0aFJlcUFjdGlvbihwQWRhcHRlciwgTXNnRWxlbSk7CisJCQkJa2ZyZWUoTXNnRWxlbSk7CisKKyAgICAgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OIChSZWFzb249JWQpXG4iLCBwSW5mby0+UmVhc29uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKwkJCQlwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeFN0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gSUVFRTgwMjF4U3RhdGU7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVggKD0lZClcbiIsIElFRUU4MDIxeFN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVk6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKwkJCQkgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAoJWQpXG4iLCBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cykpOworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QTUtJRDoKKwkgICAgICAgIHBQbWtJZCA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkgICAgICAgIGlmKHBQbWtJZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBQbWtJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCSAgICAgICAgLy8gY2hlY2sgdGhlIFBNS0lEIGluZm9ybWF0aW9uCisJICAgICAgICBpZiAocFBta0lkLT5CU1NJREluZm9Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgUEJTU0lEX0lORk8JcEJzc0lkSW5mbzsKKwkJICAgICAgICBVSU5UCQlCc3NJZHg7CisJCSAgICAgICAgVUlOVAkJQ2FjaGVkSWR4OworCisJCSAgICAgICAgZm9yIChCc3NJZHggPSAwOyBCc3NJZHggPCBwUG1rSWQtPkJTU0lESW5mb0NvdW50OyBCc3NJZHgrKykKKwkJICAgICAgICB7CisJCQkgICAgICAgIC8vIHBvaW50IHRvIHRoZSBpbmRleGVkIEJTU0lEX0lORk8gc3RydWN0dXJlCisJCQkgICAgICAgIHBCc3NJZEluZm8gPSAoUEJTU0lEX0lORk8pICgoUFVDSEFSKSBwUG1rSWQgKyAyICogc2l6ZW9mKFVJTlQpICsgQnNzSWR4ICogc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgLy8gRmluZCB0aGUgZW50cnkgaW4gdGhlIHNhdmVkIGRhdGEgYmFzZS4KKwkJCSAgICAgICAgZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEJzc0lkSW5mby0+QlNTSUQsIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkpCisJCQkJCSAgICAgICAgYnJlYWs7CisJCQkgICAgICAgIH0KKworCQkJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCQkJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkJCSAgICAgICAgfQorCQkJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJCQkgICAgICAgIGVsc2UKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJCQkgICAgICAgIENhY2hlZElkeCA9IChwQnNzSWRJbmZvLT5CU1NJRFs1XSAlIFBNS0lEX05PKTsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgfQorCQkgICAgICAgIH0KKwkJCX0KKwkJCWlmKHBQbWtJZCkKKwkJCQlrZnJlZShwUG1rSWQpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZCwgU2hvcnRSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCwgU2hvcnRSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5Mb25nUmV0cnlMaW1pdD0gJWQsTG9uZ1JldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQsIExvbmdSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRVxuIikpOworCQkJcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkvL3BLZXkgPSAmV2VwS2V5OworCisJCQlpZiAoIHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisJCQl7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFLCBGYWlsZWQhIVxuIikpOworCQkJfQorCQkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJwS2V5LT5LZXlJbmRleCA9JWQsIHBLZXktPktleUxlbmd0aD0lZFxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworCisJCQkvLyBpdCBpcyBhIHNoYXJlZCBrZXkKKwkJCWlmIChLZXlJZHggPiA0KQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCQkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQkJfQorCQkJCS8vUmVzdGFydEFQSXNSZXF1aXJlZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmN0bXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJc3ByaW50ZigmY3RtcCwiJWQiLCBjdG1wKTsKKwkJCQlTZXRfQ2hhbm5lbF9Qcm9jKHBBZGFwdGVyLCAmY3RtcCk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgUlRNUFF1ZXJ5SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYICAgICAgICAgICAqcEJzc2lkTGlzdCA9IE5VTEw7CisgICAgUE5ESVNfV0xBTl9CU1NJRF9FWCAgICAgICAgICAgICAgICAgcEJzczsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgICpwQ29uZmlndXJhdGlvbiA9IE5VTEw7CisgICAgUlRfODAyXzExX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgKnBMaW5rU3RhdHVzID0gTlVMTDsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICAqcFN0YUNvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfU1RBVElTVElDUyAgICAgICAgICAgICAgKnBTdGF0aXN0aWNzID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbVR5cGU7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfTUVESUFfU1RBVEUgICAgICAgICAgICAgICAgICAgIE1lZGlhU3RhdGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSwgdWxJbmZvPTAsIE5ldHdvcmtUeXBlTGlzdFs0XSwgYXBzZCA9IDA7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzTGVuID0gMDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmID0gTlVMTCwgcFB0cjsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQ7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgUGFkZGluZyA9IDA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKwlVQ0hBUglkcml2ZXJWZXJzaW9uWzhdOworICAgIE9JRF9TRVRfSFRfUEhZTU9ERQkJCSAgICAgICAgKnBIVFBoeU1vZGUgPSBOVUxMOworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkvL2ZvciBzbm1wLCBrYXRoeQorCURlZmF1bHRLZXlJZHhWYWx1ZQkJCSpwS2V5SWR4VmFsdWU7CisJSU5UCQkJCQkJCXZhbHVlTGVuOworCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCXRtcFs2NF07CisjZW5kaWYgLy9TTk1QCisKKyAgICBzd2l0Y2goY21kKQorICAgIHsKKyAgICAgICAgY2FzZSBSVF9PSURfREVWSUNFX05BTUU6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoU1RBX05JQ19ERVZJQ0VfTkFNRSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgU1RBX05JQ19ERVZJQ0VfTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9WRVJTSU9OX0lORk86CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1ZFUlNJT05fSU5GTyBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDgqc2l6ZW9mKFVDSEFSKTsKKwkJCXNwcmludGYoJmRyaXZlclZlcnNpb25bMF0sICIlcyIsIFNUQV9EUklWRVJfVkVSU0lPTik7CisJCQlkcml2ZXJWZXJzaW9uWzddID0gJ1wwJzsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRyaXZlclZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJY2FzZSBSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVDMyKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1Q6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCS8qCisgICAgICAgICAgICAJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIAkgKi8KKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUIChTdGlsbCBzY2FubmluZylcbiIpKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKCVkIEJTUyByZXR1cm5lZClcbiIscEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworICAgICAgICAgICAgLy8gQ2xhY3VsYXRlIHRvdGFsIGJ1ZmZlciBzaXplIHJlcXVpcmVkCisgICAgICAgICAgICBCc3NCdWZTaXplID0gc2l6ZW9mKFVMT05HKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWxpZ24gcG9pbnRlciB0byA0IGJ5dGVzIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIC8vUGFkZGluZyA9IDQgLSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gJiAweDAwMDMpOworICAgICAgICAgICAgICAgIC8vaWYgKFBhZGRpbmcgPT0gNCkKKyAgICAgICAgICAgICAgICAvLyAgICBQYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICBCc3NCdWZTaXplICs9IChzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvciBzYWZldHkgaXNzdWUsIHdlIGFkZCAyNTYgYnl0ZXMganVzdCBpbiBjYXNlCisgICAgICAgICAgICBCc3NCdWZTaXplICs9IDI1NjsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBzYW1lIHNpemUgYXMgcGFzc2VkIGZyb20gaGlnaGVyIGxheWVyCisgICAgICAgICAgICBwQnVmID0ga21hbGxvYyhCc3NCdWZTaXplLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwQnVmID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEluaXQgODAyXzExX0JTU0lEX0xJU1RfRVggc3RydWN0dXJlCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQnVmLCBCc3NCdWZTaXplKTsKKyAgICAgICAgICAgIHBCc3NpZExpc3QgPSAoUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgpIHBCdWY7CisgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBidWZmZXIgbGVuZ3RoCisgICAgICAgICAgICBCc3NMZW4gPSA0OyAvLyBDb25zaXN0IG9mIE51bWJlck9mSXRlbXMKKyAgICAgICAgICAgIC8vIFBvaW50IHRvIHN0YXJ0IG9mIE5ESVNfV0xBTl9CU1NJRF9FWAorICAgICAgICAgICAgLy8gcFB0ciA9IHBCdWYgKyBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgcFB0ciA9IChQVUNIQVIpICZwQnNzaWRMaXN0LT5Cc3NpZFswXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBCc3MgPSAoUE5ESVNfV0xBTl9CU1NJRF9FWCkgcFB0cjsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEJzcy0+TWFjQWRkcmVzcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uSGlkZGVuID09IDEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9PSBGQUxTRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLworCQkJCQkvLyBXZSBtdXN0IHJldHVybiB0aGlzIFNTSUQgZHVyaW5nIDR3YXkgaGFuZHNoYWtpbmcsIG90aGVyd2lzZSBBZWdpcyB3aWxsIGZhaWxlZCB0byBwYXJzZSBXUEEgaW5mb21hdGlvbgorCQkJCQkvLyBhbmQgdGhlbiBmYWlsZWQgdG8gc2VuZCBFQVBPbCBmYXJhbWUuCisJCQkJCS8vCisJCQkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkKKwkJCQkJeworCQkJCQkJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisJCQkJCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgICAgICAJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+UHJpdmFjeSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlByaXZhY3k7CisgICAgICAgICAgICAgICAgcEJzcy0+UnNzaSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICAgICAgcEJzcy0+TmV0d29ya1R5cGVJblVzZSA9IE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5BdGltV2luOworCisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwsIHBCc3MtPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSUJTUzsKKworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcyArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcyArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciArPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+TGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgICAgIGlmICgoQnNzTGVuICsgcEJzcy0+TGVuZ3RoKSA8IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZWxzZQorICAgICAgICAgICAgaWYgKEJzc0xlbiA+IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbmRpZgorICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBCc3NpZExpc3QsIEJzc0xlbik7CisgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU19NRURJQV9TVEFURSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1lZGlhU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRCg9RU1QVFkpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT1RDT05OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQkJTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisJCQlOZGlzWmVyb01lbW9yeShTc2lkLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQltZW1jcHkoU3NpZC5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsCVNzaWQuU3NpZExlbmd0aCk7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNzaWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsIHNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTOgorICAgICAgICAgICAgcExpbmtTdGF0dXMgPSAoUlRfODAyXzExX0xJTktfU1RBVFVTICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwTGlua1N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q3VyclR4UmF0ZSA9IFJhdGVJZFRvNTAwS2Jwc1twQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZV07ICAgLy8gdW5pdCA6IDUwMCBrYnBzCisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkNoYW5uZWxRdWFsaXR5ID0gcEFkYXB0ZXItPk1sbWUuQ2hhbm5lbFF1YWxpdHk7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlJ4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5UeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKKyAgICAgICAgCQlwTGlua1N0YXR1cy0+Q2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwTGlua1N0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwTGlua1N0YXR1cyk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24gPSAoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93ID0gcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luOworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBDb25maWd1cmF0aW9uLT5EU0NvbmZpZyk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ29uZmlndXJhdGlvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKEJlYWNvblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoYW5uZWw9JWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kLCBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJa2ZyZWUocENvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzA6CisJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjAgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8wKDB4PSVseClcbiIsIHVsSW5mbykpOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8xOgorCQkJaWYgKChwQWRhcHRlci0+QW50ZW5uYS5maWVsZC5SeFBhdGgJPiAxKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKDB4PSVseClcbiIsdWxJbmZvKSk7CisJCQl9CisJCQllbHNlCisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMT0lZClcbiIscEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JTU0lfVFJJR0dFUig9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX1JTU0k6CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJOgorCQkJdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMToKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1RBVElTVElDUzoKKyAgICAgICAgICAgIHBTdGF0aXN0aWNzID0gKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhdGlzdGljcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTIFxuIikpOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycworCQkJICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZGFwdGVyKTsKKworICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgY2FsY3VsYXRpb24gb2Ygc3VjZXNzZnVsIGNvdW50CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IDwgcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZhaWxlZENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+QUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyNpZmRlZiBEQkcKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgLyAxMDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGF0aXN0aWNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9PSzoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgcFN0YUNvbmZpZyA9IChSVF84MDJfMTFfU1RBX0NPTkZJRyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhQ29uZmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUdcbiIpKTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUeEJ1cnN0ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUdXJib1JhdGUgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZUJHUHJvdGVjdGlvbiA9IHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZVNob3J0U2xvdFRpbWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lOworICAgICAgICAgICAgICAgIC8vcFN0YUNvbmZpZy0+QWRob2NNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+SHdSYWRpb1N0YXR1cyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvID09IFRSVUUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+UnN2MSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+U3lzdGVtRXJyb3JCaXRtYXAgPSBwQWRhcHRlci0+U3lzdGVtRXJyb3JCaXRtYXA7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YUNvbmZpZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhQ29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBSdHNUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSdHNUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKD0lbGQpXG4iLCBSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBGcmFnVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICBGcmFnVGhyZXNoID0gMDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihGcmFnVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKD0lbGQpXG4iLCBGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBQb3dlck1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUG93ZXJNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSg9JWQpXG4iLCBQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBSYWRpb1N0YXRlID0gKEJPT0xFQU4pIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW87CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUmFkaW9TdGF0ZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJQlNTOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19NT05JVE9SKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExTW9uaXRvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUF1dG9Vbmtub3duOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQnNzVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkJzc1R5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKD0lZClcbiIsIEJzc1R5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBQcmVhbVR5cGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUHJlYW1UeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUHJlYW1UeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUoPSVkKVxuIiwgUHJlYW1UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBBdXRoTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQXV0aE1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZBdXRoTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUoPSVkKVxuIiwgQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIFdlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFdlcFN0YXR1cyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJldlcFN0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUF9TVEFUVVMoPSVkKVxuIiwgV2VwU3RhdHVzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwgJXhcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURUQ6CisJCQlpZiAoKHBBZGFwdGVyLT5SZkljVHlwZQk9PSBSRklDXzI4NTApIHx8IChwQWRhcHRlci0+UmZJY1R5cGUgPT0JUkZJQ18yNzUwKSkKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAzOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDMKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCQlOZXR3b3JrVHlwZUxpc3RbM10gPSBOZGlzODAyXzExT0ZETTU7ICAgLy8gTmV0d29ya1R5cGVbM10gPSAxMWEKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAyOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCSAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxMjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEXG4iKSk7CisJCQkJYnJlYWs7CisJICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTU7CisJCQllbHNlIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUJHX01JWEVEKSB8fCAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNMjQ7CisJCQllbHNlCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMURTOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFJ4UmF0ZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFOgorCQkJLy91bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RUeFJhdGU7CisJCQl1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURSAoPSVseClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FZXByb21WZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTCAoPSVkKVxuIiwgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKSk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX0VYVFJBX0lORk86CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RXh0cmFJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfRVhUUkFfSU5GTyAoPSVsZClcbiIsIHBBZGFwdGVyLT5FeHRyYUluZm8pKTsKKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQpOworCSAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmd2VfdmVyc2lvbl9jb21waWxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HOgorCQkJYXBzZCA9IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPDwgMSkgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLIDw8IDIpCisJCQkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJIDw8IDMpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA8PCA0KQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoIDw8IDUpKTsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmYXBzZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORyAoPTB4JWx4LEFQU0RDYXA9JWQsQUNfQkU9JWQsQUNfQks9JWQsQUNfVkk9JWQsQUNfVk89JWQsTUFYU1BMZW49JWQpXG4iLAorCQkJCWFwc2QscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU006CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTSAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX1dNTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1dNTSAoPSVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICBjYXNlIFJUX09JRF9ORVdfRFJJVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVDSEFSIGVuYWJsZWQgPSAxOworICAgIAkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZlbmFibGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfTkVXX0RSSVZFUiAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgICAgICBjYXNlIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUU6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQWRhcHRlci0+U3RhQ2ZnLmRldl9uYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisKKyAgICAJCQlwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPSAoKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpID8gKEVYVENIQV9CRUxPVykgOiAoRVhUQ0hBX0FCT1ZFKSk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7CisgICAgICAgICAgICB1bEluZm8gPSAodWxJbmZvIDw8IDgpfChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RBVF9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgICAgICAgICBpID0gMDsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKyAgICAgICAgICAgIGkgPSAxOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmaSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQoPSVkKSBcbiIsIGkpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBNYW51ZmFjdHVyZXJPVUlfTEVOOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oUmVzb3VyY2VUeXBlSWROYW1lKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBSZXNvdXJjZVR5cGVJZE5hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEIFxuIikpOworCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBzdXBwb3J0IHdlcCBlbHNlIDIgaXMgbm90IHN1cHBvcnQuCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFIFxuIikpOworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuUHNtID09IFBTTVBfQUNUSU9OKQorCQkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgcG93ZXIgYWN0aXZlIGVsc2UgMiBpcyBwb3dlciBzYXZlLgorCQkJZWxzZQorCQkJCXVsSW5mbyA9IDI7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFIFxuIikpOworCQkJLy9LZXlJZHhWYWx1ZS5LZXlJZHggPSBwQWQtPlBvcnRDZmcuTUJTU0lEW3BBZC0+SW9jdGxJRl0uRGVmYXVsdEtleUlkOworCQkJcEtleUlkeFZhbHVlID0gd3JxLT51LmRhdGEucG9pbnRlcjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiS2V5SWR4VmFsdWUuS2V5SWR4ID0gJWQsIFxuIixwS2V5SWR4VmFsdWUtPktleUlkeCkpOworCQkJdmFsdWVMZW4gPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwS2V5SWR4VmFsdWUtPlZhbHVlLAorCQkJCQkJICAgJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgIHZhbHVlTGVuKTsKKwkJCXBLZXlJZHhWYWx1ZS0+VmFsdWVbdmFsdWVMZW5dPSdcMCc7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihEZWZhdWx0S2V5SWR4VmFsdWUpOworCisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEtleUlkeFZhbHVlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJEZWZhdWx0S2V5SWQgPSAlZCwgdG90YWwgbGVuID0gJWQsIHN0ciBsZW49JWQsIEtleVZhbHVlPSAlMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlbMF0pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJZCA9JWQgXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEg6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkJCQkJJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCQkJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCVNob3J0UmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNob3J0UmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWRcbiIsIFNob3J0UmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCUxvbmdSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ9JWRcbiIsIExvbmdSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQgXG4iKSk7CisKKyNpZmRlZiBSVDI4NzAKKwkJCXNwcmludGYodG1wLCAiJTA0eCAlMDR4XG4iLCAoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBVc2JfRGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yICwoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBVc2JfRGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbih0bXApOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHRtcCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgic2l6ZW9mIFVDSEFSPSVkLCBjaGFubmVsPSVkIFxuIiwgc2l6ZW9mKFVDSEFSKSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKyNlbmRpZiAvL1NOTVBfU1VQUE9SVAorCisJCWNhc2UgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYOgorCQkJeworCQkJCVVDSEFSIHZhbHVlOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVggXG4iKSk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMTsKKyNlbHNlCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRG9lc24ndCBzdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAwOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnZhbHVlLCAxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSF9MSVNUOgorCQkJeworCQkJCVBSVF9DSEFOTkVMX0xJU1RfSU5GTyBwQ2hMaXN0QnVmOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIX0xJU1QgXG4iKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bSA9PSAwKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1ZiA9IChSVF9DSEFOTkVMX0xJU1RfSU5GTyAqKSBrbWFsbG9jKHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyksIE1FTV9BTExPQ19GTEFHKTsKKwkJCQlpZiAocENoTGlzdEJ1ZiA9PSBOVUxMKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisJCQkJZm9yIChpID0gMDsgaSA8IHBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0W2ldID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWw7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ2hMaXN0QnVmLCBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCisJCQkJaWYgKHBDaExpc3RCdWYpCisJCQkJCWtmcmVlKHBDaExpc3RCdWYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuR2VvZ3JhcGh5LCAxKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFM6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTToKKwkJCXsKKwkJCQlQUlRfODAyXzExX0RMU19JTkZPCXBEbHNJbmZvID0ga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKSwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKHBEbHNJbmZvID09IE5VTEwpCisJCQkJCWJyZWFrOworCisJCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KCZwRGxzSW5mby0+RW50cnlbaV0sICZwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCX0KKworCQkJCXBEbHNJbmZvLT5udW0gPSBNQVhfTlVNX09GX0RMU19FTlRSWTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcERsc0luZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNXG4iKSk7CisKKwkJCQlpZiAocERsc0luZm8pCisJCQkJCWtmcmVlKHBEbHNJbmZvKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIHJ0Mjh4eF9zdGFfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJCQljbWQpCit7CisJUE9TX0NPT0tJRQkJCXBPYmo7CisJVklSVFVBTF9BREFQVEVSCQkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUlRNUF9BREFQVEVSICAgICAgICAqcEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdyZXEgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCUJPT0xFQU4JCQkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVU0hPUlQJCQkJc3ViY21kOworCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWQgPSBuZXRfZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gbmV0X2Rldi0+cHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwkgICAgaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKKwkgICAgeworCQkgICAgcmV0dXJuIFN0YXR1czsKKwkgICAgfQorCisJICAgIGlmIChzdHJzdHIod3JxLT51LmRhdGEucG9pbnRlciwgIk9wTW9kZSIpID09IE5VTEwpCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICAgICAgfQorICAgIH0KKworCXsJLy8gZGV0ZXJtaW5lIHRoaXMgaW9jdGwgY29tbWFuZCBpcyBjb21taW5nIGZyb20gd2hpY2ggaW50ZXJmYWNlLgorCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisJCXBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJc3dpdGNoKGNtZCkKKwl7CisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWNhc2UgUlRQUklWX0lPQ1RMX0FURToKKwkJCXsKKwkJCQlSdG1wRG9BdGUocEFkLCB3cnEpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lGSFdBRERSXG4iKSk7CisJCQltZW1jcHkod3JxLT51Lm5hbWUsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdOQU1FOgorICAgICAgICB7CisgICAgICAgIAljaGFyICpuYW1lPSZ3cnEtPnUubmFtZVswXTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25hbWUobmV0X2RldiwgTlVMTCwgbmFtZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdFU1NJRDogIC8vR2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdFU1NJRDogIC8vU2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOV0lEOiAgIC8vIHNldCBuZXR3b3JrIGlkICh0aGUgY2VsbCkKKwkJY2FzZSBTSU9DR0lXTldJRDogICAvLyBnZXQgbmV0d29yayBpZAorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DU0lXRlJFUTogICAvL3NldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdGUkVROiAgIC8vIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOSUNLTjogLy9zZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV05JQ0tOOiAvL2dldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXUkFURTogICAvL2dldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJCSAgICBydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgU0lPQ1NJV1JBVEU6ICAvL3NldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJICAgICAgICBydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lPQ0dJV1JUUzogIC8vIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfZ2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdSVFM6ICAvL3NldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfc2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdGUkFHOiAgLy9nZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0ZSQUc6ICAvL3NldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRU5DT0RFOiAgLy9nZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0VOQ09ERTogIC8vc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX3Npd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdBUDogICAgIC8vZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9naXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJICAgIGNhc2UgU0lPQ1NJV0FQOiAgLy9zZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTU9ERTogICAvL3NldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9zaXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXU0VOUzogICAvL2dldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NTSVdTRU5TOgkvL3NldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NHSVdQT1dFUjogIC8vZ2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DU0lXUE9XRVI6ICAvL3NldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ0dJV1RYUE9XOiAgLy9nZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DU0lXVFhQT1c6ICAvL3NldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NHSVdSQU5HRToJLy9HZXQgcmFuZ2Ugb2YgcGFyYW1ldGVycworCQljYXNlIFNJT0NHSVdSRVRSWToJLy9nZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQljYXNlIFNJT0NTSVdSRVRSWToJLy9zZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBSVF9QUklWX0lPQ1RMOgorCQkJc3ViY21kID0gd3JxLT51LmRhdGEuZmxhZ3M7CisJCQlpZiggc3ViY21kICYgT0lEX0dFVF9TRVRfVE9HR0xFKQorCQkJCVN0YXR1cyA9IFJUTVBTZXRJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IFJUTVBRdWVyeUluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXUFJJVjoKKwkJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCQkJeworCQkJCWlmICggYWNjZXNzX29rKFZFUklGWV9XUklURSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKHByaXZ0YWIpKSAhPSBUUlVFKQorCQkJCQlicmVhazsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocHJpdnRhYikgLyBzaXplb2YocHJpdnRhYlswXSk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX1NFVDoKKwkJCWlmKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSAhPSBUUlVFKQorCQkJCWJyZWFrOworCQkJcnRfaW9jdGxfc2V0cGFyYW0obmV0X2RldiwgTlVMTCwgTlVMTCwgd3JxLT51LmRhdGEucG9pbnRlcik7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6CisJCQlSVE1QSW9jdGxHZXRTaXRlU3VydmV5KHBBZCwgd3JxKTsKKwkJICAgIGJyZWFrOworI2lmZGVmIERCRworCQljYXNlIFJUUFJJVl9JT0NUTF9NQUM6CisJCQlSVE1QSW9jdGxNQUMocEFkLCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0UyUDoKKwkJCVJUTVBJb2N0bEUyUFJPTShwQWQsIHdycSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBEQkcgLy8KKyAgICAgICAgY2FzZSBTSU9DRVRIVE9PTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIklPQ1RMOjp1bmtub3duIElPQ1RMJ3MgY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJfQorCisgICAgaWYoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNTSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZCwgKnBTc2lkPU5VTEw7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworCisgICAgaWYoIHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworICAgICAgICBpZiAoc3RybGVuKGFyZykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZC5Tc2lkLCBhcmcsIHN0cmxlbihhcmcpKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvL0FOWSBzc2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IDA7CisJCSAgICBtZW1jcHkoU3NpZC5Tc2lkLCAiIiwgMCk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCX0KKyAgICAgICAgcFNzaWQgPSAmU3NpZDsKKworICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgeworICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworCisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9TU0lELAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCisgICAgICAgICAgICAgICAgICAgIChWT0lEICopcFNzaWQpOworCisgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU1NJRF9Qcm9jOjooTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKworICAgIGlmIChTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworI2lmZGVmIFdNTV9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXbW1DYXBhYmxlIEVuYWJsZSBvciBEaXNhYmxlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQk9PTEVBTgliV21tQ2FwYWJsZTsKKworCWJXbW1DYXBhYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgoYldtbUNhcGFibGUgPT0gMSkKKyNpZmRlZiBSVDI4NzAKKwkJJiYgKHBBZC0+TnVtYmVyT2ZQaXBlcyA+PSA1KQorI2VuZGlmIC8vIFJUMjg3MCAvLworCQkpCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChiV21tQ2FwYWJsZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV21tQ2FwYWJsZV9Qcm9jOjooYldtbUNhcGFibGU9JWQpXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgTmV0d29yayBUeXBlKEluZnJhc3RydWN0dXJlL0FkaG9jIG1vZGUpCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVSU5UMzIJVmFsdWUgPSAwOworCisgICAgaWYgKHN0cmNtcChhcmcsICJBZGhvYyIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19BREhPQykKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvL0JPT0xFQU4gQ2FuY2VsbGVkOworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCQiFcbiIpKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfQURIT0M7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihBRC1IT0MpXG4iKSk7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJJbmZyYSIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19JTkZSQSkKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKKyAgICB7CisJCVVDSEFSCWJicFZhbHVlID0gMDsKKwkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCisJCXBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBGQUxTRTsKKwkJLy8gcmVzZXQgYWxsIG1sbWUgc3RhdGUgbWFjaGluZQorCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgXG4iKSk7CisgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID09IDApCisgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDM2OworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSA2OworICAgICAgICB9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE5fQ2hhbm5lbENoZWNrKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSAweGZmZmZmZmZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQkVMT1cpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyAyME1IegorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJfQorCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7CisJCS8vIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4KKwkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkvL1ZhbHVlIHw9ICgweDgwKTsKKwkJLy9SVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCQkvLyBkaXNhYmxlIHN5bmMKKwkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOworCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007IC8vQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7CisgICAgfQorCisgICAgLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfTmV0d29ya1R5cGVfUHJvYzo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQXV0aGVudGljYXRpb24gbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEyIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJub25lIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ0a2lwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImFlcyIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRW5jcnlwVHlwZV9Qcm9jOjooRW5jcnlwVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRGVmYXVsdCBLZXkgSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHg7CisKKyAgICBLZXlJZHggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworICAgIGlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRGVmYXVsdEtleUlEX1Byb2M6OihEZWZhdWx0S2V5SUQ9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkxCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkzCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZNAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXUEEgUFNLIGtleQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKKworICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOworCisgICAgTmRpc1plcm9NZW1vcnkoa2V5TWF0ZXJpYWwsIDQwKTsKKworICAgIGlmICgoc3RybGVuKGFyZykgPCA4KSB8fCAoc3RybGVuKGFyZykgPiA2NCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgZmFpbGVkISEoV1BBUFNLPSVzKSwgV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMgXG4iLCBhcmcpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChzdHJsZW4oYXJnKSA9PSA2NCkKKyAgICB7CisgICAgICAgIEF0b0goYXJnLCBrZXlNYXRlcmlhbCwgMzIpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQYXNzd29yZEhhc2goKGNoYXIgKilhcmcsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisgICAgfQorCisKKworICAgIGlmKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgJiYKKyAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgeworICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgeworICAgICAgICBpZiAoKHN0cmNtcChhcmcsICJNYXhfUFNQIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAibWF4X3BzcCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIk1BWF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJGYXN0X1BTUCIpID09IDApIHx8CisJCQkJIChzdHJjbXAoYXJnLCAiZmFzdF9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkZBU1RfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiTGVnYWN5X1BTUCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAibGVnYWN5X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiTEVHQUNZX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorICAgICAgICAgICAgLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgTWxtZVNldFBzbUJpdChwQWRhcHRlciwgUFdSX0FDVElWRSk7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUFNNb2RlX1Byb2M6OihQU01vZGU9JWxkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KKyAgICBWYWx1ZToKKyAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KKyAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCisgICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBNQUMKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIG1hYyAwICAgICAgICA9PT4gcmVhZCBNQUMgd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIG1hYyAwPTEyICAgICA9PT4gd3JpdGUgTUFDIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVTE9ORwkJCQltYWNBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVJTlQzMgkJCQltYWNWYWx1ZSA9IDA7CisJSU5UCQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJICAgIHRoaXNfY2hhciA9IGFyZzsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gTWFjIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChtYWNBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG1hY0FkZHIsICZtYWNWYWx1ZSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JWx4LCBNYWNWYWx1ZT0leFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciAsIG1hY1ZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbOC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA4KQorCQkJCXRlbXAyWzctaysrXT0nMCc7CisJCQl0ZW1wMls4XT0nXDAnOworCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQkJQXRvSCh0ZW1wMiwgdGVtcCwgNCk7CisJCQkJbWFjVmFsdWUgPSAqdGVtcCoyNTYqMjU2KjI1NiArIHRlbXBbMV0qMjU2KjI1NiArIHRlbXBbMl0qMjU2ICsgdGVtcFszXTsKKworCQkJCS8vIGRlYnVnIG1vZGUKKwkJCQlpZiAobWFjQWRkciA9PSAoSFdfREVCVUdfU0VUVElOR19CQVNFICsgNCkpCisJCQkJeworCQkJCQkvLyAweDJiZjQ6IGJ5dGUwIG5vbi16ZXJvOiBlbmFibGUgUjE3IHR1bmluZywgMDogZGlzYWJsZSBSMTcgdHVuaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChtYWNWYWx1ZSAmIDB4MDAwMDAwZmYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb24gUjE3IHR1bmluZ1xuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgUjY2OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBSNjYgPSAweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKTsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJCXsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9mZiBSMTcgdHVuaW5nLCByZXN0b3JlIHRvIDB4JTAyeFxuIiwgUjY2KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JTAybHgsIE1hY1ZhbHVlPTB4JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQl9CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsTUFDXG5cbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgRTJQUk9NCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBlMnAgMCAgICAgCT09PiByZWFkIEUyUFJPTSB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgZTJwIDA9MTIzNCAgICA9PT4gd3JpdGUgRTJQUk9NIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMjM0CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVTSE9SVAkJCQllZXBBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVTSE9SVAkJCQllZXBWYWx1ZTsKKwlpbnQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkgICAgLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gYXJnOworCisKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBFMlBST00gYWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKGVlcEFkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwNFhdOjB4JTA0WCAgIiwgZWVwQWRkciAsIGVlcFZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzQtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0ZW1wMlszLWsrK109JzAnOworCQkJdGVtcDJbNF09J1wwJzsKKworCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCUF0b0godGVtcDIsIHRlbXAsIDIpOworCQkJZWVwVmFsdWUgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTAyWF06JTAyWCAgIiwgZWVwQWRkciwgZWVwVmFsdWUpOworCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsRTJQUk9NXG4iKSk7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKKworCisKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCUxvbmdSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX05vbmU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9GbGV4aWJsZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX1N0cmljdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JZWVlODAyZE1vZGVfUHJvYzo6KElFRUVFMDIxMWRNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSkpOworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQ2FycmllckRldGVjdF9Qcm9jOjooQ2FycmllckRldGVjdC5FbmFibGU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCitJTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSEFSCQkJZXh0cmEpCit7CisJSU5UIGk7CisKKwlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXNwcmludGYoZXh0cmEsICIlc0hUIE9wZXJhdGluZyBNb2RlIDogJWRcbiIsIGV4dHJhLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJc3ByaW50ZihleHRyYSwgIiVzXG4lLTE5cyUtNHMlLTRzJS03cyUtN3MlLTdzJS0xMHMlLTZzJS02cyUtNnMlLTZzXG4iLCBleHRyYSwKKwkJCSJNQUMiLCAiQUlEIiwgIkJTUyIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOworCisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJaWYgKHN0cmxlbihleHRyYSkgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCisJCSAgICBicmVhazsKKwkJaWYgKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQl7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwgZXh0cmEsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPkFpZCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5hcGlkeCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwcyIsIGV4dHJhLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNnMiLCBleHRyYSwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMGQsICVkLCAlZCUlXG4iLCBleHRyYSwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCisJCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXNcbiIsIGV4dHJhKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvd3BhLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3dwYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMzRhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3dwYS5oCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXdwYS5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworCisjaWZuZGVmCV9fV1BBX0hfXworI2RlZmluZQlfX1dQQV9IX18KKworLy8gRUFQT0wgS2V5IGRlc2NyaXB0ZXIgZnJhbWUgZm9ybWF0IHJlbGF0ZWQgbGVuZ3RoCisjZGVmaW5lIExFTl9LRVlfREVTQ19OT05DRQkJCTMyCisjZGVmaW5lIExFTl9LRVlfREVTQ19JVgkJCQkxNgorI2RlZmluZSBMRU5fS0VZX0RFU0NfUlNDCQkJOAorI2RlZmluZSBMRU5fS0VZX0RFU0NfSUQJCQkJOAorI2RlZmluZSBMRU5fS0VZX0RFU0NfUkVQTEFZCQkJOAorI2RlZmluZSBMRU5fS0VZX0RFU0NfTUlDCQkJMTYKKworLy8gVGhlIGxlbmd0aCBpcyB0aGUgRUFQb0wtS2V5IGZyYW1lIGV4Y2VwdCBrZXkgZGF0YSBmaWVsZC4KKy8vIFBsZWFzZSByZWZlciB0byA4MDIuMTFpLTIwMDQgLEZpZ3VyZSA0M3UgaW4gcC43OAorI2RlZmluZSBMRU5fRUFQT0xfS0VZX01TRwkJCShzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSkKKworLy8gRUFQIENvZGUgVHlwZS4KKyNkZWZpbmUgRUFQX0NPREVfUkVRVUVTVAkxCisjZGVmaW5lIEVBUF9DT0RFX1JFU1BPTlNFCTIKKyNkZWZpbmUgRUFQX0NPREVfU1VDQ0VTUyAgICAzCisjZGVmaW5lIEVBUF9DT0RFX0ZBSUxVUkUgICAgNAorCisvLyBFQVBPTCBmcmFtZSBQcm90b2NvbCBWZXJzaW9uCisjZGVmaW5lCUVBUE9MX1ZFUgkJCQkJMQorI2RlZmluZQlFQVBPTF9WRVIyCQkJCQkyCisKKy8vIEVBUE9MLUtFWSBEZXNjcmlwdG9yIFR5cGUKKyNkZWZpbmUJV1BBMV9LRVlfREVTQwkJCQkweGZlCisjZGVmaW5lIFdQQTJfS0VZX0RFU0MgICAgICAgICAgICAgICAweDAyCisKKy8vIEtleSBEZXNjcmlwdG9yIFZlcnNpb24gb2YgS2V5IEluZm9ybWF0aW9uCisjZGVmaW5lCURFU0NfVFlQRV9US0lQCQkJCTEKKyNkZWZpbmUJREVTQ19UWVBFX0FFUwkJCQkyCisjZGVmaW5lIERFU0NfVFlQRV9NRVNICQkJCTMKKworI2RlZmluZSBMRU5fTVNHMV8yV0FZICAgICAgICAgICAgICAgMHg3ZgorI2RlZmluZSBNQVhfTEVOX09GX0VBUF9IUyAgICAgICAgICAgMjU2CisKKyNkZWZpbmUgTEVOX01BU1RFUl9LRVkJCQkJMzIKKworLy8gRUFQT0wgRUssIE1LCisjZGVmaW5lIExFTl9FQVBfRUsJCQkJCTE2CisjZGVmaW5lIExFTl9FQVBfTUlDSwkJCQkxNgorI2RlZmluZSBMRU5fRUFQX0tFWQkJCQkJKChMRU5fRUFQX0VLKSsoTEVOX0VBUF9NSUNLKSkKKy8vIFRLSVAga2V5IHJlbGF0ZWQKKyNkZWZpbmUgTEVOX1BNS0lECQkJCQkxNgorI2RlZmluZSBMRU5fVEtJUF9FSwkJCQkJMTYKKyNkZWZpbmUgTEVOX1RLSVBfUlhNSUNLCQkJCTgKKyNkZWZpbmUgTEVOX1RLSVBfVFhNSUNLCQkJCTgKKyNkZWZpbmUgTEVOX0FFU19FSwkJCQkJMTYKKyNkZWZpbmUgTEVOX0FFU19LRVkJCQkJCUxFTl9BRVNfRUsKKyNkZWZpbmUgTEVOX1RLSVBfS0VZCQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQorI2RlZmluZSBUS0lQX0FQX1RYTUlDS19PRkZTRVQJCSgoTEVOX0VBUF9LRVkpKyhMRU5fVEtJUF9FSykpCisjZGVmaW5lIFRLSVBfQVBfUlhNSUNLX09GRlNFVAkJKFRLSVBfQVBfVFhNSUNLX09GRlNFVCtMRU5fVEtJUF9UWE1JQ0spCisjZGVmaW5lIFRLSVBfR1RLX0xFTkdUSAkJCQkoKExFTl9US0lQX0VLKSsoTEVOX1RLSVBfUlhNSUNLKSsoTEVOX1RLSVBfVFhNSUNLKSkKKyNkZWZpbmUgTEVOX1BUSwkJCQkJCSgoTEVOX0VBUF9LRVkpKyhMRU5fVEtJUF9LRVkpKQorI2RlZmluZSBNSU5fTEVOX09GX0dUSwkJCQk1CisKKy8vIFJTTiBJRSBMZW5ndGggZGVmaW5pdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1JTTklFICAgICAgICAgCTkwCisjZGVmaW5lIE1JTl9MRU5fT0ZfUlNOSUUgICAgICAgICAJOAorCisvL0VBUCBQYWNrZXQgVHlwZQorI2RlZmluZQlFQVBQYWNrZXQJCTAKKyNkZWZpbmUJRUFQT0xTdGFydAkJMQorI2RlZmluZQlFQVBPTExvZ29mZgkJMgorI2RlZmluZQlFQVBPTEtleQkJMworI2RlZmluZQlFQVBPTEFTRkFsZXJ0CTQKKyNkZWZpbmUJRUFQVHR5cGVNYXgJCTUKKworI2RlZmluZQlFQVBPTF9NU0dfSU5WQUxJRAkwCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzEJMQorI2RlZmluZQlFQVBPTF9QQUlSX01TR18yCTIKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMwkzCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzQJNAorI2RlZmluZQlFQVBPTF9HUk9VUF9NU0dfMQk1CisjZGVmaW5lCUVBUE9MX0dST1VQX01TR18yCTYKKworI2RlZmluZSBQQUlSV0lTRUtFWQkJCQkJMQorI2RlZmluZSBHUk9VUEtFWQkJCQkJMAorCisvLyBSZXRyeSB0aW1lciBjb3VudGVyIGluaXRpYWwgdmFsdWUKKyNkZWZpbmUgUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMAorI2RlZmluZSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAxMAorI2RlZmluZSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAyMAorCisKKyNkZWZpbmUgRUFQT0xfU1RBUlRfRElTQUJMRQkJCQkJMAorI2RlZmluZSBFQVBPTF9TVEFSVF9QU0sJCQkJCQkxCisjZGVmaW5lIEVBUE9MX1NUQVJUXzFYCQkJCQkJMgorCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBX1RLSVBfT04oeCkgICAgICAgKCgoeCkgJiAweDA4KSAhPSAwKQorI2RlZmluZSBNSVhfQ0lQSEVSX1dQQV9BRVNfT04oeCkgICAgICAgICgoKHgpICYgMHgwNCkgIT0gMCkKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oeCkgICAgICAoKCh4KSAmIDB4MDIpICE9IDApCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9BRVNfT04oeCkgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKQorCisjZGVmaW5lIFJPVU5EX1VQKF9feCwgX195KSBcCisJKCgoVUxPTkcpKChfX3gpKygoX195KS0xKSkpICYgKChVTE9ORyl+KChfX3kpLTEpKSkKKworI2RlZmluZQlBRERfT05FX1RvXzY0QklUX1ZBUihfVikJCVwKK3sJCQkJCQkJCQkJXAorCVVDSEFSCWNudCA9IExFTl9LRVlfREVTQ19SRVBMQVk7CVwKKwlkbwkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJXAorCQljbnQtLTsJCQkJCQkJXAorCQlfVltjbnRdKys7CQkJCQkJXAorCQlpZiAoY250ID09IDApCQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJfXdoaWxlIChfVltjbnRdID09IDApOwkJCQlcCit9CisKKyNkZWZpbmUgSVNfV1BBX0NBUEFCSUxJVFkoYSkgICAgICAgKCgoYSkgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAoKGEpIDw9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKKworLy8gRUFQT0wgS2V5IEluZm9ybWF0aW9uIGRlZmluaXRpb24gd2l0aGluIEtleSBkZXNjcmlwdG9yIGZvcm1hdAordHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9LRVlfSU5GTworeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglLZXlBY2s6MTsKKyAgICBVQ0hBUglJbnN0YWxsOjE7CisgICAgVUNIQVIJS2V5SW5kZXg6MjsKKyAgICBVQ0hBUglLZXlUeXBlOjE7CisgICAgVUNIQVIJS2V5RGVzY1ZlcjozOworICAgIFVDSEFSCVJzdmQ6MzsKKyAgICBVQ0hBUglFS0RfREw6MTsJCS8vIEVLRCBmb3IgQVA7IERMIGZvciBTVEEKKyAgICBVQ0hBUglSZXF1ZXN0OjE7CisgICAgVUNIQVIJRXJyb3I6MTsKKyAgICBVQ0hBUglTZWN1cmU6MTsKKyAgICBVQ0hBUglLZXlNaWM6MTsKKyNlbHNlCisJVUNIQVIJS2V5TWljOjE7CisJVUNIQVIJU2VjdXJlOjE7CisJVUNIQVIJRXJyb3I6MTsKKwlVQ0hBUglSZXF1ZXN0OjE7CisJVUNIQVIJRUtEX0RMOjE7ICAgICAgIC8vIEVLRCBmb3IgQVA7IERMIGZvciBTVEEKKwlVQ0hBUglSc3ZkOjM7CisJVUNIQVIJS2V5RGVzY1ZlcjozOworCVVDSEFSCUtleVR5cGU6MTsKKwlVQ0hBUglLZXlJbmRleDoyOworCVVDSEFSCUluc3RhbGw6MTsKKwlVQ0hBUglLZXlBY2s6MTsKKyNlbmRpZgorfQlLRVlfSU5GTywgKlBLRVlfSU5GTzsKKworLy8gRUFQT0wgS2V5IGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9ERVNDUklQVEVSCit7CisJVUNIQVIJCVR5cGU7CisJS0VZX0lORk8JS2V5SW5mbzsKKwlVQ0hBUgkJS2V5TGVuZ3RoWzJdOworCVVDSEFSCQlSZXBsYXlDb3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSCQlLZXlOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOworCVVDSEFSCQlLZXlJdltMRU5fS0VZX0RFU0NfSVZdOworCVVDSEFSCQlLZXlSc2NbTEVOX0tFWV9ERVNDX1JTQ107CisJVUNIQVIJCUtleUlkW0xFTl9LRVlfREVTQ19JRF07CisJVUNIQVIJCUtleU1pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKwlVQ0hBUgkJS2V5RGF0YUxlblsyXTsKKwlVQ0hBUgkJS2V5RGF0YVtNQVhfTEVOX09GX1JTTklFXTsKK30JS0VZX0RFU0NSSVBURVIsICpQS0VZX0RFU0NSSVBURVI7CisKK3R5cGVkZWYJc3RydWN0IFBBQ0tFRCBfRUFQT0xfUEFDS0VUCit7CisJVUNIQVIJIAkJCVByb1ZlcjsKKwlVQ0hBUgkgCQkJUHJvVHlwZTsKKwlVQ0hBUgkgCQkJQm9keV9MZW5bMl07CisJS0VZX0RFU0NSSVBURVIJCUtleURlc2M7Cit9CUVBUE9MX1BBQ0tFVCwgKlBFQVBPTF9QQUNLRVQ7CisKKy8vODAyLjExaSBEMTAgcGFnZSA4MwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9HVEtfRU5DQVAKK3sKKyNpZm5kZWYgUlRfQklHX0VORElBTgorICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7CisgICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOworICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOworI2Vsc2UKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjo1OworICAgIFVDSEFSICAgICAgICAgICAgICAgdHg6MTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtpZDoyOworICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2MTsKKyNlbmRpZgorICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLW1RLSVBfR1RLX0xFTkdUSF07Cit9ICAgR1RLX0VOQ0FQLCAqUEdUS19FTkNBUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9LREVfRU5DQVAKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgICAgICAgICBMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgICBPVUlbM107CisgICAgVUNIQVIgICAgICAgICAgICAgICBEYXRhVHlwZTsKKyAgICBHVEtfRU5DQVAgICAgICBHVEtFbmNhcDsKK30gICBLREVfRU5DQVAsICpQS0RFX0VOQ0FQOworCisvLyBGb3IgV1BBMQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRSB7CisgICAgVUNIQVIgICBvdWlbNF07CisgICAgVVNIT1JUICB2ZXJzaW9uOworICAgIFVDSEFSICAgbWNhc3RbNF07CisgICAgVVNIT1JUICB1Y291bnQ7CisgICAgc3RydWN0IFBBQ0tFRCB7CisgICAgICAgIFVDSEFSIG91aVs0XTsKKyAgICB9dWNhc3RbMV07Cit9IFJTTklFLCAqUFJTTklFOworCisvLyBGb3IgV1BBMgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRTIgeworICAgIFVTSE9SVCAgdmVyc2lvbjsKKyAgICBVQ0hBUiAgIG1jYXN0WzRdOworICAgIFVTSE9SVCAgdWNvdW50OworICAgIHN0cnVjdCBQQUNLRUQgeworICAgICAgICBVQ0hBUiBvdWlbNF07CisgICAgfXVjYXN0WzFdOworfSBSU05JRTIsICpQUlNOSUUyOworCisvLyBBS00gU3VpdGUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUVfQVVUSCB7CisgICAgVVNIT1JUIGFjb3VudDsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyAgICAgICAgVUNIQVIgb3VpWzRdOworICAgIH1hdXRoWzFdOworfSBSU05JRV9BVVRILCpQUlNOSUVfQVVUSDsKKwordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1JTTl9DQVBBQklMSVRJRVMJeworCXN0cnVjdAlQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgVVNIT1JUCQlSc3ZkOjEwOworICAgICAgICBVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOworICAgICAgICBVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOworICAgICAgICBVU0hPUlQJCU5vX1BhaXJ3aXNlOjE7CisJCVVTSE9SVAkJUHJlQXV0aDoxOworI2Vsc2UKKyAgICAgICAgVVNIT1JUCQlQcmVBdXRoOjE7CisJCVVTSE9SVAkJTm9fUGFpcndpc2U6MTsKKwkJVVNIT1JUCQlQVEtTQV9SX0NvdW50ZXI6MjsKKwkJVVNIT1JUCQlHVEtTQV9SX0NvdW50ZXI6MjsKKwkJVVNIT1JUCQlSc3ZkOjEwOworI2VuZGlmCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlSU05fQ0FQQUJJTElUSUVTLCAqUFJTTl9DQVBBQklMSVRJRVM7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRUFQX0hEUiB7CisgICAgVUNIQVIgICBQcm9WZXI7CisgICAgVUNIQVIgICBQcm9UeXBlOworICAgIFVDSEFSICAgQm9keV9MZW5bMl07CisgICAgVUNIQVIgICBjb2RlOworICAgIFVDSEFSICAgaWRlbnRpZmllcjsKKyAgICBVQ0hBUiAgIGxlbmd0aFsyXTsgLy8gaW5jbHVkaW5nIGNvZGUgYW5kIGlkZW50aWZpZXIsIGZvbGxvd2VkIGJ5IGxlbmd0aC0yIG9jdGV0cyBvZiBkYXRhCit9IEVBUF9IRFIsICpQRUFQX0hEUjsKKworLy8gRm9yIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZSBzdGF0ZXMuIDgwMi4xMWkgRHJhZnQgNC4xLCBwLiA5NworLy8gV2Ugc2ltcGxpZmllZCBpdAordHlwZWRlZgllbnVtCV9XcGFTdGF0ZQoreworCVNTX05PVFVTRSwJCQkJLy8gMAorCVNTX1NUQVJULAkJCQkvLyAxCisJU1NfV0FJVF9NU0dfMywJCQkvLyAyCisJU1NfV0FJVF9HUk9VUCwJCQkvLyAzCisJU1NfRklOSVNILCAgCQkJLy8gNAorCVNTX0tFWVVQREFURSwJCQkvLyA1Cit9CVdQQV9TVEFURTsKKworLy8KKy8vCVRoZSBkZWZpbml0aW9uIG9mIHRoZSBjaXBoZXIgY29tYmluYXRpb24KKy8vCisvLyAJIGJpdDMJYml0MiAgYml0MSAgIGJpdDAKKy8vCSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKworLy8gCXwJICBXUEEJIHwJICAgV1BBMiAgIHwKKy8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKworLy8JfCBUS0lQIHwgQUVTIHwgVEtJUCB8IEFFUyB8CisvLwl8CTAgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MDYKKy8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwNworLy8JfAkxICB8ICAwICB8ICAgMCAgfCAgMSAgfCAtPiAweDA5CisvLwl8CTEgIHwgIDAgIHwgICAxICB8ICAxICB8IC0+IDB4MEIKKy8vCXwJMSAgfCAgMSAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwRAorLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDBFCisvLwl8CTEgIHwgIDEgIHwgICAxICB8ICAxICB8CS0+IDB4MEYKKy8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKworLy8KK3R5cGVkZWYJZW51bQlfV3BhTWl4UGFpckNpcGhlcgoreworCU1JWF9DSVBIRVJfTk9UVVNFIAkJCT0gMHgwMCwKKwlXUEFfTk9ORV9XUEEyX1RLSVBBRVMJCT0gMHgwMywJCS8vIFdQQTItVEtJUEFFUworCVdQQV9BRVNfV1BBMl9US0lQIAkJCT0gMHgwNiwKKwlXUEFfQUVTX1dQQTJfVEtJUEFFUwkJPSAweDA3LAorCVdQQV9US0lQX1dQQTJfQUVTCQkJPSAweDA5LAorCVdQQV9US0lQX1dQQTJfVEtJUEFFUwkJPSAweDBCLAorCVdQQV9US0lQQUVTX1dQQTJfTk9ORQkJPSAweDBDLAkJLy8gV1BBLVRLSVBBRVMKKwlXUEFfVEtJUEFFU19XUEEyX0FFUwkJPSAweDBELAorCVdQQV9US0lQQUVTX1dQQTJfVEtJUAkJPSAweDBFLAorCVdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUwk9IDB4MEYsCit9CVdQQV9NSVhfUEFJUl9DSVBIRVI7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOX0lFX0hFQURFUl9TVFJVQ1QJeworCVVDSEFSCQlFaWQ7CisJVUNIQVIJCUxlbmd0aDsKKwlVU0hPUlQJCVZlcnNpb247CS8vIExpdHRsZSBlbmRpYW4gZm9ybWF0Cit9CVJTTl9JRV9IRUFERVJfU1RSVUNULCAqUFJTTl9JRV9IRUFERVJfU1RSVUNUOworCisvLyBDaXBoZXIgc3VpdGUgc2VsZWN0b3IgdHlwZXMKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0lQSEVSX1NVSVRFX1NUUlVDVAl7CisJVUNIQVIJCU91aVszXTsKKwlVQ0hBUgkJVHlwZTsKK30JQ0lQSEVSX1NVSVRFX1NUUlVDVCwgKlBDSVBIRVJfU1VJVEVfU1RSVUNUOworCisvLyBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgc3VpdGUgc2VsZWN0b3IKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQUtNX1NVSVRFX1NUUlVDVAl7CisJVUNIQVIJCU91aVszXTsKKwlVQ0hBUgkJVHlwZTsKK30JQUtNX1NVSVRFX1NUUlVDVCwgKlBBS01fU1VJVEVfU1RSVUNUOworCisvLyBSU04gY2FwYWJpbGl0eQordHlwZWRlZiBzdHJ1Y3QJUEFDS0VEIF9SU05fQ0FQQUJJTElUWQl7CisJVVNIT1JUCQlSc3Y6MTA7CisJVVNIT1JUCQlHVEtTQVJlcGxheUNudDoyOworCVVTSE9SVAkJUFRLU0FSZXBsYXlDbnQ6MjsKKwlVU0hPUlQJCU5vUGFpcndpc2U6MTsKKwlVU0hPUlQJCVByZUF1dGg6MTsKK30JUlNOX0NBUEFCSUxJVFksICpQUlNOX0NBUEFCSUxJVFk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzIyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcKQEAgLTAsMCArMSw1IEBACitjb25maWcgUlRMODE4N1NFCisJdHJpc3RhdGUgIlJlYWxUZWsgUlRMODE4N1NFIFdpcmVsZXNzIExBTiBOSUMgZHJpdmVyIgorCWRlcGVuZHMgb24gUENJCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjN2UyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTWFrZWZpbGUKQEAgLTAsMCArMSw1NSBAQAorCisjRVhUUkFfQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMV9OT1dFUD15CisjRVhUUkFfQ0ZMQUdTICs9IC1EQ09ORklHX1JUTDgxODBfSU9NQVAKKyNFWFRSQV9DRkxBR1MgKz0gLXN0ZD1nbnU4OQorI0VYVFJBX0NGTEFHUyArPSAtTzIKKyNDQyAgICAgICAgICAgID0gZ2NjCitFWFRSQV9DRkxBR1MgKz0gLURUSE9NQVNfVFVSQk8KKyNDRkxBR1MgKz0gLURDT05GSUdfUlRMODE4NUIKKyNDRkxBR1MgKz0gLURDT05GSUdfUlRMODE4eF9TCisKKyNhZGRlZCBmb3IgRWVlUEMgdGVzdGluZworRVhUUkFfQ0ZMQUdTICs9IC1ERU5BQkxFX0lQUworRVhUUkFfQ0ZMQUdTICs9IC1EU1dfQU5URQorRVhUUkFfQ0ZMQUdTICs9IC1EVFhfVFJBQ0sKK0VYVFJBX0NGTEFHUyArPSAtREhJR0hfUE9XRVIKK0VYVFJBX0NGTEFHUyArPSAtRFNXX0RJRworRVhUUkFfQ0ZMQUdTICs9IC1EUkFURV9BREFQVAorRVhUUkFfQ0ZMQUdTICs9IC1EQ09ORklHX1JUTDgxODBfUE0KKworIytZSiwwODA2MjYKK0VYVFJBX0NGTEFHUyArPSAtREVOQUJMRV9ET1QxMUQKKworI2VuYWJsZSBpdCBmb3IgbGVnYWN5IHBvd2VyIHNhdmUsIGRpc2FibGUgaXQgZm9yIGxlaXN1cmUgIHBvd2VyIHNhdmUKK0VYVFJBX0NGTEFHUyArPSAtREVOQUJMRV9MUFMKKworCisjRVhUUkFfQ0ZMQUdTICs9IC1taGFyZC1mbG9hdCAtRENPTkZJR19GT1JDRV9IQVJEX0ZMT0FUPXkKKworcnRsODE4N3NlLW9ianMgOj0JCQlcCisJCXI4MTgwX2NvcmUubwkJXAorCQlyODE4MF9zYTI0MDAubwkJXAorCQlyODE4MF85M2N4Ni5vCQlcCisJCXI4MTgwX3d4Lm8JCVwKKwkJcjgxODBfbWF4MjgyMC5vCQlcCisJCXI4MTgwX2djdC5vCQlcCisJCXI4MTgwX3J0bDgyMjUubwkJXAorCQlyODE4MF9ydGw4MjU1Lm8JCVwKKwkJcjgxODBfcnRsODIyNXoyLm8JXAorCQlyODE4NWJfaW5pdC5vCQlcCisJCXI4MTgwX2RtLm8JCVwKKwkJcjgxODBfcG0ubwkJXAorCQlpZWVlODAyMTEvZG90MTFkLm8JCQlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5vCQlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfcngubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX3R4Lm8JCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV93eC5vCQlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLm8JCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4Lm8JXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0Lm8JCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLm8JXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAubwlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLm8KKworb2JqLSQoQ09ORklHX1JUTDgxODdTRSkJKz0gcnRsODE4N3NlLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvZG90MTFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNTNmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvZG90MTFkLmgKQEAgLTAsMCArMSwxMDEgQEAKKyNpZm5kZWYgX19JTkNfRE9UMTFEX0gNCisjZGVmaW5lIF9fSU5DX0RPVDExRF9IDQorDQorI2luY2x1ZGUgImllZWU4MDIxMS5oIg0KKw0KKy8vI2RlZmluZSBFTkFCTEVfRE9UMTFEDQorDQorLy8jZGVmaW5lIERPVDExRF9NQVhfQ0hOTF9OVU0gODMNCisNCit0eXBlZGVmIHN0cnVjdCBfQ0hOTF9UWFBPV0VSX1RSSVBMRSB7DQorCXU4IEZpcnN0Q2hubDsNCisJdTggIE51bUNobmxzOw0KKwl1OCAgTWF4VHhQb3dlckluRGJtOw0KK31DSE5MX1RYUE9XRVJfVFJJUExFLCAqUENITkxfVFhQT1dFUl9UUklQTEU7DQorDQordHlwZWRlZiBlbnVtIF9ET1QxMURfU1RBVEUgew0KKwlET1QxMURfU1RBVEVfTk9ORSA9IDAsDQorCURPVDExRF9TVEFURV9MRUFSTkVELA0KKwlET1QxMURfU1RBVEVfRE9ORSwNCit9RE9UMTFEX1NUQVRFOw0KKw0KK3R5cGVkZWYgc3RydWN0IF9SVF9ET1QxMURfSU5GTyB7DQorCS8vREVDTEFSRV9SVF9PQkpFQ1QoUlRfRE9UMTFEX0lORk8pOw0KKw0KKwlib29sIGJFbmFibGVkOyAvLyBkb3QxMU11bHRpRG9tYWluQ2FwYWJpbGl0eUVuYWJsZWQNCisNCisJdTE2IENvdW50cnlJZUxlbjsgLy8gPiAwIGlmIENvdW50cnlJZUJ1ZltdIGNvbnRhaW5zIHZhbGlkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudC4NCisJdTggIENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsNCisJdTggIENvdW50cnlJZVNyY0FkZHJbNl07IC8vIFNvdXJjZSBBUCBvZiB0aGUgY291bnRyeSBJRS4NCisJdTggIENvdW50cnlJZVdhdGNoZG9nOyANCisNCisJdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsgIC8vISEhVmFsdWUgMDogSW52YWxpZCwgMTogVmFsaWQgKGFjdGl2ZSBzY2FuKSwgMjogVmFsaWQgKHBhc3NpdmUgc2NhbikNCisJLy91OCAgQ2hubExpc3RMZW47IC8vICNCeXRlcyB2YWxpZCBpbiBDaG5sTGlzdFtdLg0KKwkvL3U4ICBDaG5sTGlzdFtET1QxMURfTUFYX0NITkxfTlVNXTsNCisJdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07DQorDQorCURPVDExRF9TVEFURSBTdGF0ZTsNCit9UlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87DQorI2RlZmluZSBlcU1hY0FkZHIoYSxiKQkJKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkNCisjZGVmaW5lIGNwTWFjQWRkcihkZXMsc3JjKQkgICAgICAoKGRlcylbMF09KHNyYylbMF0sKGRlcylbMV09KHNyYylbMV0sKGRlcylbMl09KHNyYylbMl0sKGRlcylbM109KHNyYylbM10sKGRlcylbNF09KHNyYylbNF0sKGRlcylbNV09KHNyYylbNV0pDQorI2RlZmluZSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldikgKChQUlRfRE9UMTFEX0lORk8pKChfX3BJZWVlRGV2KS0+cERvdDExZEluZm8pKQ0KKw0KKyNkZWZpbmUgSVNfRE9UMTFEX0VOQUJMRShfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPmJFbmFibGVkDQorI2RlZmluZSBJU19DT1VOVFJZX0lFX1ZBTElEKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbiA+IDApDQorDQorI2RlZmluZSBJU19FUVVBTF9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBlcU1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkgDQorI2RlZmluZSBVUERBVEVfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgY3BNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpDQorDQorI2RlZmluZSBJU19DT1VOVFJZX0lFX0NIQU5HRUQoX19wSWVlZURldiwgX19JZSkgXA0KKwkoKChfX0llKS5MZW5ndGggPT0gMCB8fCAoX19JZSkuTGVuZ3RoICE9IEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuKSA/IFwNCisJRkFMU0UgOiBcDQorCSghbWVtY21wKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllQnVmLCAoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkNCisNCisjZGVmaW5lIENJRV9XQVRDSERPR19USCAxDQorI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cNCisjZGVmaW5lIFJFU0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpID0gMCANCisjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpDQorDQorI2RlZmluZSBJU19ET1QxMURfU1RBVEVfRE9ORShfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5TdGF0ZSA9PSBET1QxMURfU1RBVEVfRE9ORSkNCisNCisNCit2b2lkDQorRG90MTFkX0luaXQoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYNCisJKTsNCisNCit2b2lkDQorRG90MTFkX1Jlc2V0KA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2DQorCSk7DQorDQordm9pZA0KK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsDQorCXU4ICoJCXBUYWRkciwNCisJdTE2CUNvdXRyeUllTGVuLA0KKwl1OCAqIHBDb3V0cnlJZQkgDQorCSk7DQorDQordTgNCitET1QxMURfR2V0TWF4VHhQd3JJbkRibSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggQ2hhbm5lbA0KKwkpOw0KKw0KK3ZvaWQNCitET1QxMURfU2NhbkNvbXBsZXRlKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldg0KKwkpOw0KKw0KK2ludCBJc0xlZ2FsQ2hhbm5lbCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsDQorCXU4IGNoYW5uZWwNCispOw0KKw0KK2ludCBUb0xlZ2FsQ2hhbm5lbCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsDQorCXU4IGNoYW5uZWwNCispOw0KKw0KKyNlbmRpZiAvLyAjaWZuZGVmIF9fSU5DX0RPVDExRF9IDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwNmFiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExLmgKQEAgLTAsMCArMSwxNzU1IEBACisvKgorICogTWVyZ2VkIHdpdGggbWFpbmxpbmUgaWVlZTgwMjExLmggaW4gQXVnIDIwMDQuICBPcmlnaW5hbCBpZWVlODAyXzExCisgKiByZW1haW5zIGNvcHlyaWdodCBieSB0aGUgb3JpZ2luYWwgYXV0aG9ycworICoKKyAqIFBvcnRpb25zIG9mIHRoZSBtZXJnZWQgY29kZSBhcmUgYmFzZWQgb24gSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MKKyAqIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlciBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogQWRhcHRpb24gdG8gYSBnZW5lcmljIElFRUUgODAyLjExIHN0YWNrIGJ5IEphbWVzIEtldHJlbm9zCisgKiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIE1vZGlmaWVkIGZvciBSZWFsdGVrJ3Mgd2ktZmkgY2FyZHMgYnkgQW5kcmVhIE1lcmVsbG8KKyAqIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIElFRUU4MDIxMV9ICisjZGVmaW5lIElFRUU4MDIxMV9ICisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4gLyogRVRIX0FMRU4gKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gICAvKiBBUlJBWV9TSVpFICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNlbmRpZgorCisvKgorI2lmbmRlZiBib29sCisjZGVmaW5lIGJvb2wgaW50CisjZW5kaWYKKworI2lmbmRlZiB0cnVlCisjZGVmaW5lIHRydWUgICAxCisjZW5kaWYKKworI2lmbmRlZiBmYWxzZQorI2RlZmluZSBmYWxzZSAgMAorI2VuZGlmCisqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApKQorI2lmbmRlZiBib29sCit0eXBlZGVmIGVudW17ZmFsc2UgPSAwLCB0cnVlfSBib29sOworI2VuZGlmCisjZW5kaWYKKy8vI2lmZGVmIEpPSE5fSFdTRUMKKyNkZWZpbmUgS0VZX1RZUEVfTkEJCTB4MAorI2RlZmluZSBLRVlfVFlQRV9XRVA0MCAJCTB4MQorI2RlZmluZSBLRVlfVFlQRV9US0lQCQkweDIKKyNkZWZpbmUgS0VZX1RZUEVfQ0NNUAkJMHg0CisjZGVmaW5lIEtFWV9UWVBFX1dFUDEwNAkJMHg1CisvLyNlbmRpZgorCisKKyNkZWZpbmUgYVNpZnNUaW1lCQkJCQkxMAorCisjZGVmaW5lIE1HTVRfUVVFVUVfTlVNIDUKKworCisjZGVmaW5lIElFRUVfQ01EX1NFVF9XUEFfUEFSQU0JCQkxCisjZGVmaW5lCUlFRUVfQ01EX1NFVF9XUEFfSUUJCQkyCisjZGVmaW5lIElFRUVfQ01EX1NFVF9FTkNSWVBUSU9OCQkJMworI2RlZmluZSBJRUVFX0NNRF9NTE1FCQkJCTQKKworI2RlZmluZSBJRUVFX1BBUkFNX1dQQV9FTkFCTEVECQkJMQorI2RlZmluZSBJRUVFX1BBUkFNX1RLSVBfQ09VTlRFUk1FQVNVUkVTCQkyCisjZGVmaW5lIElFRUVfUEFSQU1fRFJPUF9VTkVOQ1JZUFRFRAkJMworI2RlZmluZSBJRUVFX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRAkJNAorI2RlZmluZSBJRUVFX1BBUkFNX0FVVEhfQUxHUwkJCTUKKyNkZWZpbmUgSUVFRV9QQVJBTV9JRUVFXzgwMl8xWAkJCTYKKy8vSXQgc2hvdWxkIGNvbnNpc3RlbnQgd2l0aCB0aGUgZHJpdmVyX1hYWC5jCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QQVJBTV9XUEFYX1NFTEVDVAkJCTcKKy8vQWRkZWQgZm9yIG5vdGlmeSB0aGUgZW5jcnlwdGlvbiB0eXBlIHNlbGVjdGlvbgorLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfUFJPVE9fV1BBCQkJCTEKKyNkZWZpbmUgSUVFRV9QUk9UT19SU04JCQkJMgorLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9XUEFYX1VTRUdST1VQCQkJMAorI2RlZmluZSBJRUVFX1dQQVhfV0VQNDAJCQkJMQorI2RlZmluZSBJRUVFX1dQQVhfVEtJUAkJCQkyCisjZGVmaW5lIElFRUVfV1BBWF9XUkFQICAgCQkJMworI2RlZmluZSBJRUVFX1dQQVhfQ0NNUAkJCQk0CisjZGVmaW5lIElFRUVfV1BBWF9XRVAxMDQJCQk1CisKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9JRUVFODAyMVgJCQkxCisjZGVmaW5lIElFRUVfS0VZX01HTVRfUFNLCQkJMgorCisKKworI2RlZmluZSBJRUVFX01MTUVfU1RBX0RFQVVUSAkJCTEKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ESVNBU1NPQwkJCTIKKworCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHCQkyCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUREUgkJMworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRAkJNAorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRAkJNQorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9UWF9LRVlfU0VUX0ZBSUxFRAkJNgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVECQk3CisKKworI2RlZmluZQlJRUVFX0NSWVBUX0FMR19OQU1FX0xFTgkJCTE2CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKSkKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9zY2FuIGllZWU4MDIxMV93eF9nZXRfc2Nhbl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX3J0bAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGFkZGVkIGZvciBrZXJuZWwgY29uZmxpY3QgdW5kZXIgRkM1CisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbmFtZSAgIGllZWU4MDIxMV93eF9nZXRfbmFtZV9ydGwKKyNkZWZpbmUgZnJlZV9pZWVlODAyMTEgICAgICAgICAgZnJlZV9pZWVlODAyMTFfcnRsCisjZGVmaW5lIGFsbG9jX2llZWU4MDIxMSAgICAgICAgYWxsb2NfaWVlZTgwMjExX3J0bAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2VuZGlmCisvL2Vycm9yIGluIHVidW50dTIuNi4yMixzbyBhZGQgdGhlc2UKKyNkZWZpbmUgaWVlZTgwMjExX3dha2VfcXVldWUgaWVlZTgwMjExX3dha2VfcXVldWVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3F1ZXVlIGllZWU4MDIxMV9zdG9wX3F1ZXVlX3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV9yeCBpZWVlODAyMTFfcnhfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMJaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzCWllZWU4MDIxMV9nZXRfY3J5cHRvX29wc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0CWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdF9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfdHhiX2ZyZWUJaWVlZTgwMjExX3R4Yl9mcmVlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkCWllZWU4MDIxMV93eF9nZXRfZXNzaWRfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZXNzaWQJaWVlZTgwMjExX3d4X3NldF9lc3NpZF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXRlCWllZWU4MDIxMV93eF9zZXRfcmF0ZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9yYXRlCWllZWU4MDIxMV93eF9nZXRfcmF0ZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF93YXAJaWVlZTgwMjExX3d4X3NldF93YXBfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfd2FwCWllZWU4MDIxMV93eF9nZXRfd2FwX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21vZGUJaWVlZTgwMjExX3d4X3NldF9tb2RlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X21vZGUJaWVlZTgwMjExX3d4X2dldF9tb2RlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3NjYW4JaWVlZTgwMjExX3d4X3NldF9zY2FuX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEJaWVlZTgwMjExX3d4X2dldF9mcmVxX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2ZyZXEJaWVlZTgwMjExX3d4X3NldF9mcmVxX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4CWllZWU4MDIxMV93eF9zZXRfcmF3dHhfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcG93ZXIJaWVlZTgwMjExX3d4X3NldF9wb3dlcl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9wb3dlcglpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llcwlpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbAlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbF9ydGwKKyNkZWZpbmUJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbF9ydGwKKyNkZWZpbmUJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2wJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfcnhfbWd0CQlpZWVlODAyMTFfcnhfbWd0X3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfYXV0aCBpZWVlODAyMTFfd3hfc2V0X2F1dGhfcnRsCisvL2J5IGFteSBmb3IgcHMKKyNkZWZpbmUgbm90aWZ5X3d4X2Fzc29jX2V2ZW50ICBub3RpZnlfd3hfYXNzb2NfZXZlbnRfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9kaXNhc3NvY2lhdGUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NjYW4gaWVlZTgwMjExX3N0YXJ0X3NjYW5fcnRsCisvL2J5IGFteSBmb3IgcHMKK3R5cGVkZWYgc3RydWN0IGllZWVfcGFyYW0geworCXUzMiBjbWQ7CisJdTggc3RhX2FkZHJbRVRIX0FMRU5dOworICAgICAgICB1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBuYW1lOworCQkJdTMyIHZhbHVlOworCQl9IHdwYV9wYXJhbTsKKwkJc3RydWN0IHsKKwkJCXUzMiBsZW47CisJCQl1OCByZXNlcnZlZFszMl07CisJCQl1OCBkYXRhWzBdOworCQl9IHdwYV9pZTsKKwkgICAgICAgIHN0cnVjdHsKKwkJCWludCBjb21tYW5kOworICAgIAkJCWludCByZWFzb25fY29kZTsKKwkJfSBtbG1lOworCQlzdHJ1Y3QgeworCQkJdTggYWxnW0lFRUVfQ1JZUFRfQUxHX05BTUVfTEVOXTsKKwkJCXU4IHNldF90eDsKKwkJCXUzMiBlcnI7CisJCQl1OCBpZHg7CisJCQl1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCisJCQl1MTYga2V5X2xlbjsKKwkJCXU4IGtleVswXTsKKwkJfSBjcnlwdDsKKworCX0gdTsKK31pZWVlX3BhcmFtOworCisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworI2RlZmluZSBJV19RVUFMX1FVQUxfSU5WQUxJRCAgIDB4MTAKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9JTlZBTElEICAweDIwCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfSU5WQUxJRCAgMHg0MAorI2RlZmluZSBJV19RVUFMX1FVQUxfVVBEQVRFRCAgIDB4MQorI2RlZmluZSBJV19RVUFMX0xFVkVMX1VQREFURUQgIDB4MgorI2RlZmluZSBJV19RVUFMX05PSVNFX1VQREFURUQgIDB4NAorI2VuZGlmCisKKy8vIGxpbnV4IHVuZGVyIDIuNi45IHJlbGVhc2UgbWF5IG5vdCBzdXBwb3J0IGl0LCBzbyBtb2RpZnkgaXQgZm9yIGNvbW1vbiB1c2UKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDkpKQorI2RlZmluZSBNU0VDUyh0KQkoMTAwMCAqICgodCkgLyBIWikgKyAxMDAwICogKCh0KSAlIEhaKSAvIEhaKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1zbGVlcF9pbnRlcnJ1cHRpYmxlX3J0bCh1bnNpZ25lZCBpbnQgbXNlY3MpCit7CisgICAgICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBNU0VDUyhtc2VjcykgKyAxOworCisgICAgICAgICB3aGlsZSAodGltZW91dCkgeworICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIHRpbWVvdXQ7Cit9CisjZWxzZQorI2RlZmluZSBNU0VDUyh0KSBtc2Vjc190b19qaWZmaWVzKHQpCisjZGVmaW5lIG1zbGVlcF9pbnRlcnJ1cHRpYmxlX3J0bCAgbXNsZWVwX2ludGVycnVwdGlibGUKKyNlbmRpZgorCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKworCisjZGVmaW5lIElFRUU4MDIxMV9ITEVOCQkJMzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZSQU1FX0xFTgkJKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorCisvKiB0aGlzIGlzIHN0b2xlbiBhbmQgbW9kaWZpZWQgZnJvbSB0aGUgbWFkd2lmaSBkcml2ZXIqLworI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSwkJMHgwYworI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfREFUQQkJMHgwOAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSwkweEIwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykgXAorCSgoKGZjKSAmIChJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKSkgPT0gXAorCSAoSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSkKKworLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciAqLworI2RlZmluZSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRSAzMQorc3RydWN0IGllZWVfaWJzc19zZXEgeworCXU4IG1hY1tFVEhfQUxFTl07CisJdTE2IHNlcV9udW1bMTddOworCXUxNiBmcmFnX251bVsxN107CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZVsxN107CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGllZWU4MDIxMV9oZHIgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwl1MTYgUU9TX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1MTYgUU9TX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitlbnVtIGVhcF90eXBlIHsKKwlFQVBfUEFDS0VUID0gMCwKKwlFQVBPTF9TVEFSVCwKKwlFQVBPTF9MT0dPRkYsCisJRUFQT0xfS0VZLAorCUVBUE9MX0VOQ0FQX0FTRl9BTEVSVAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmVhcF90eXBlc1tdID0geworCVtFQVBfUEFDS0VUXQkJPSAiRUFQLVBhY2tldCIsCisJW0VBUE9MX1NUQVJUXQkJPSAiRUFQT0wtU3RhcnQiLAorCVtFQVBPTF9MT0dPRkZdCQk9ICJFQVBPTC1Mb2dvZmYiLAorCVtFQVBPTF9LRVldCQk9ICJFQVBPTC1LZXkiLAorCVtFQVBPTF9FTkNBUF9BU0ZfQUxFUlRdCT0gIkVBUE9MLUVuY2FwLUFTRi1BbGVydCIKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZWFwX2dldF90eXBlKGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA+PSBBUlJBWV9TSVpFKGVhcF90eXBlcykpID8gIlVua25vd24iIDogZWFwX3R5cGVzW3R5cGVdOworfQorCitzdHJ1Y3QgZWFwb2wgeworCXU4IHNuYXBbNl07CisJdTE2IGV0aGVydHlwZTsKKwl1OCB2ZXJzaW9uOworCXU4IHR5cGU7CisJdTE2IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElFRUU4MDIxMV8zQUREUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAzMAorI2RlZmluZSBJRUVFODAyMTFfRkNTX0xFTiAgICA0CisKKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCisjZGVmaW5lCU1BWF9GUkFHX1RIUkVTSE9MRCAgICAgMjM0NlUKKworLyogRnJhbWUgY29udHJvbCBmaWVsZCBjb25zdGFudHMgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVkVSUwkJMHgwMDAyCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZUWVBFCQkweDAwMGMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfU1RZUEUJCTB4MDBmMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9UT0RTCQkweDAxMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlJPTURTCQkweDAyMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRFNUT0RTCQkweDAzMDAgLy9hZGRlZCBieSBkYXZpZAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MJMHgwNDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1JFVFJZCQkweDA4MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUE0JCTB4MTAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9NT1JFREFUQQkweDIwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfV0VQCQkweDQwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfT1JERVIJCTB4ODAwMAorCisjZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9NR01UCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0NUTAkJMHgwMDA0CisjZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9EQVRBCQkweDAwMDgKKworLyogbWFuYWdlbWVudCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCAJMHgwMDEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUQkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUAkweDAwMzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUQkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AJMHgwMDUwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9CRUFDT04JCTB4MDA4MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVRJTQkJMHgwMDkwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQwkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FVVEgJCTB4MDBCMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREVBVVRICQkweDAwQzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX01BTkFHRV9BQ1QJMHgwMEQwCisKKy8qIGNvbnRyb2wgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1BTUE9MTAkJMHgwMEEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SVFMJCTB4MDBCMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ1RTCQkweDAwQzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FDSwkJMHgwMEQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkVORAkJMHgwMEUwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkVOREFDSwkweDAwRjAKKworLyogZGF0YSAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQQkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTAkweDAwMzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0sJCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZQT0xMCQkweDAwNjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLUE9MTAkweDAwNzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBCTB4MDA4MCAvL2FkZGVkIGZvciBXTU0gMjAwNi84LzIKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMCTB4MDBDMAorCisKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfRlJBRwkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX1NFUQkJMHhGRkYwCisKKworLyogZGVidWcgbWFjcm9zICovCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCitleHRlcm4gdTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbDsKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK2RvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKKyAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogJWMgJXMgIiBmbXQsIFwKKyAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CisgKgorICogI2RlZmluZSBJRUVFODAyMTFfRExfeHh4eCBWQUxVRQorICoKKyAqIHNoaWZ0aW5nIHZhbHVlIHRvIHRoZSBsZWZ0IG9uZSBiaXQgZnJvbSB0aGUgcHJldmlvdXMgZW50cnkuICB4eHh4IHNob3VsZCBiZQorICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWZpY2F0aW9uIChmb3IgZXhhbXBsZSwgV0VQKQorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElFRUU4MDIxMV94eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgorICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVG8gYWRkIHlvdXIgZGVidWcgbGV2ZWwgdG8gdGhlIGxpc3Qgb2YgbGV2ZWxzIHNlZW4gd2hlbiB5b3UgcGVyZm9ybQorICoKKyAqICUgY2F0IC9wcm9jL25ldC9pcHcvZGVidWdfbGV2ZWwKKyAqCisgKiB5b3Ugc2ltcGx5IG5lZWQgdG8gYWRkIHlvdXIgZW50cnkgdG8gdGhlIGlwd19kZWJ1Z19sZXZlbHMgYXJyYXkuCisgKgorICogSWYgeW91IGRvIG5vdCBzZWUgZGVidWdfbGV2ZWwgaW4gL3Byb2MvbmV0L2lwdyB0aGVuIHlvdSBkbyBub3QgaGF2ZQorICogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBkZWZpbmVkIGluIHlvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworI2RlZmluZSBJRUVFODAyMTFfRExfSU5GTyAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1dYICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9TQ0FOICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfRExfU1RBVEUgICAgICAgICAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX0RMX01HTVQgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9GUkFHICAgICAgICAgICgxPDw1KQorI2RlZmluZSBJRUVFODAyMTFfRExfRUFQICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0RST1AgICAgICAgICAgKDE8PDcpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1RYICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SWCAgICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIElFRUU4MDIxMV9FUlJPUihmLCBhLi4uKSBwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfV0FSTklORyhmLCBhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0lORk8oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0lORk8sIGYsICMjIGEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1dYKGYsIGEuLi4pICAgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1dYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU0NBTihmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU0NBTiwgZiwgIyMgYSkKKy8vI2RlZmluZSBJRUVFX0RFQlVHX1NDQU4gIElFRUU4MDIxMV9XQVJOSU5HCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TVEFURShmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TVEFURSwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX01HTVQoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfTUdNVCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0ZSQUcoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRlJBRywgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0VBUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FQVAsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EUk9QKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0RST1AsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19UWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1JYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JYLCBmLCAjIyBhKQorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+IC8qIEFSUEhSRF9FVEhFUiAqLworCisjaWZuZGVmIFdJUkVMRVNTX1NQWQorI2RlZmluZSBXSVJFTEVTU19TUFkJCS8vIGVuYWJsZSBpd3NweSBzdXBwb3J0CisjZW5kaWYKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkvLyBuZXcgZHJpdmVyIEFQSQorCisjaWZuZGVmIEVUSF9QX1BBRQorI2RlZmluZSBFVEhfUF9QQUUgMHg4ODhFIC8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCisjZW5kaWYgLyogRVRIX1BfUEFFICovCisKKyNkZWZpbmUgRVRIX1BfUFJFQVVUSCAweDg4QzcgLyogSUVFRSA4MDIuMTFpIHByZS1hdXRoZW50aWNhdGlvbiAqLworCisjaWZuZGVmIEVUSF9QXzgwMjExX1JBVworI2RlZmluZSBFVEhfUF84MDIxMV9SQVcgKEVUSF9QX0VDT05FVCArIDEpCisjZW5kaWYKKworLyogSUVFRSA4MDIuMTEgZGVmaW5lcyAqLworCisjZGVmaW5lIFA4MDIxMV9PVUlfTEVOIDMKKworc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciB7CisKKyAgICAgICAgdTggICAgZHNhcDsgICAvKiBhbHdheXMgMHhBQSAqLworICAgICAgICB1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisgICAgICAgIHU4ICAgIGN0cmw7ICAgLyogYWx3YXlzIDB4MDMgKi8KKyAgICAgICAgdTggICAgb3VpW1A4MDIxMV9PVUlfTEVOXTsgICAgLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICovCisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFNOQVBfU0laRSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkcikKKworI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKKworI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJBRyhzZXEpICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVEoc2VxKSAgKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKQorCisvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCisjZGVmaW5lIFdMQU5fQVVUSF9PUEVOIDAKKyNkZWZpbmUgV0xBTl9BVVRIX1NIQVJFRF9LRVkgMQorCisjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAorCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9CU1MgKDE8PDApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICgxPDw0KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCAoMTw8MTApCisKKy8qIFN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBXTEFOX1NUQVRVU19TVUNDRVNTIDAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSAxCisjZGVmaW5lIFdMQU5fU1RBVFVTX0NBUFNfVU5TVVBQT1JURUQgMTAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfUkVBU1NPQ19OT19BU1NPQyAxMQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDIDEyCisjZGVmaW5lIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEcgMTMKKyNkZWZpbmUgV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OIDE0CisjZGVmaW5lIFdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMIDE1CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FVVEhfVElNRU9VVCAxNgorI2RlZmluZSBXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEEgMTcKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTIDE4CisvKiA4MDIuMTFiICovCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUIDE5CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1BCQ0MgMjAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSAyMQorCisvKiBSZWFzb24gY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgMQorI2RlZmluZSBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEIDIKKyNkZWZpbmUgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgMworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA0CisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX0FQX0JVU1kgNQorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA2CisjZGVmaW5lIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA3CisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCA4CisjZGVmaW5lIFdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIIDkKKworCisvKiBJbmZvcm1hdGlvbiBFbGVtZW50IElEcyAqLworI2RlZmluZSBXTEFOX0VJRF9TU0lEIDAKKyNkZWZpbmUgV0xBTl9FSURfU1VQUF9SQVRFUyAxCisjZGVmaW5lIFdMQU5fRUlEX0ZIX1BBUkFNUyAyCisjZGVmaW5lIFdMQU5fRUlEX0RTX1BBUkFNUyAzCisjZGVmaW5lIFdMQU5fRUlEX0NGX1BBUkFNUyA0CisjZGVmaW5lIFdMQU5fRUlEX1RJTSA1CisjZGVmaW5lIFdMQU5fRUlEX0lCU1NfUEFSQU1TIDYKKyNkZWZpbmUgV0xBTl9FSURfQ0hBTExFTkdFIDE2CisjZGVmaW5lIFdMQU5fRUlEX1JTTiA0OAorI2RlZmluZSBXTEFOX0VJRF9HRU5FUklDIDIyMQorCisjZGVmaW5lIElFRUU4MDIxMV9NR01UX0hEUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSM19MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSNF9MRU4gMzAKKworCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NworCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0JBTkQgICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQkFORCAgICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFX0xFTiAgCQk0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIJCSAgICAgICAgMHgwMgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkgICAgICAgIDB4MDQKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQgkJICAgICAgICAweDBCCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CCQkgICAgICAgIDB4MTYKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4gCQk4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkgICAgICAgIDB4MEMKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUIJCSAgICAgICAgMHgxMgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIJCTB4MTgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CCQkweDI0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQgkJMHgzMAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUIJCTB4NDgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CCQkweDYwCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQgkJMHg2QworI2RlZmluZSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCQkweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLCQkoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLCQkoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLCQkoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSwkJKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0sJCSgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLCQkoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sJCSgxPDw2KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSwkJKDE8PDcpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLCQkoMTw8OCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sJCSgxPDw5KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSwkJKDE8PDEwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSwkJKDE8PDExKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURVNfTUFTSwkgICAgICAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCisJSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CX01BU0sgfCBcCisgICAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURVNfTUFTSwkJMHgwMDAwMEZGMAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSyAgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0spCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1JBVEVTX01BU0sgKElFRUU4MDIxMV9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4CisjZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCSAgICAgICAgICAgIDQKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fU0hJRlRfTUFTS19BICAgICAgICAgNAorCisKKworCisvKiBOT1RFOiBUaGlzIGRhdGEgaXMgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzOyBub3QgYWxsIGhhcmR3YXJlIHByb3ZpZGVzIHRoaXMKKyAqICAgICAgIGluZm9ybWF0aW9uIGZvciBmcmFtZXMgcmVjZWl2ZWQuICBOb3Qgc2V0dGluZyB0aGVzZSB3aWxsIG5vdCBjYXVzZQorICogICAgICAgYW55IGFkdmVyc2UgYWZmZWN0cy4gKi8KK3N0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgeworCXUzMiBtYWNfdGltZVsyXTsKKwl1OCBzaWduYWxzdHJlbmd0aDsKKwlzOCByc3NpOworCXU4IHNpZ25hbDsKKwl1OCBub2lzZTsKKwl1MTYgcmF0ZTsgLyogaW4gMTAwIGticHMgKi8KKwl1OCByZWNlaXZlZF9jaGFubmVsOworCXU4IGNvbnRyb2w7CisJdTggbWFzazsKKwl1OCBmcmVxOworCXUxNiBsZW47CisJdTggbmljX3R5cGU7Cit9OworCisvKiBJRUVFIDgwMi4xMSByZXF1aXJlcyB0aGF0IFNUQSBzdXBwb3J0cyBjb25jdXJyZW50IHJlY2VwdGlvbiBvZiBhdCBsZWFzdAorICogdGhyZWUgZnJhZ21lbnRlZCBmcmFtZXMuIFRoaXMgZGVmaW5lIGNhbiBiZSBpbmNyZWFzZWQgdG8gc3VwcG9ydCBtb3JlCisgKiBjb25jdXJyZW50IGZyYW1lcywgYnV0IGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGVhY2ggZW50cnkgY2FuIGNvbnN1bWUgYWJvdXQKKyAqIDIga0Igb2YgUkFNIGFuZCBpbmNyZWFzaW5nIGNhY2hlIHNpemUgd2lsbCBzbG93IGRvd24gZnJhbWUgcmVhc3NlbWJseS4gKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOIDQKKworc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X2ZyYWdfdGltZTsKKwl1bnNpZ25lZCBpbnQgc2VxOworCXVuc2lnbmVkIGludCBsYXN0X2ZyYWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCBzcmNfYWRkcltFVEhfQUxFTl07CisJdTggZHN0X2FkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGllZWU4MDIxMV9zdGF0cyB7CisJdW5zaWduZWQgaW50IHR4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHR4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCB0eF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCB0eF9kZWZlcnJlZF90cmFuc21pc3Npb25zOworCXVuc2lnbmVkIGludCB0eF9zaW5nbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9tdWx0aXBsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X3JldHJ5X2xpbWl0X2V4Y2VlZGVkOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkczsKKwl1bnNpZ25lZCBpbnQgcnhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHJ4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHJ4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgcnhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHJ4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHJ4X2Zjc19lcnJvcnM7CisJdW5zaWduZWQgaW50IHJ4X2Rpc2NhcmRzX25vX2J1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHNfd3Jvbmdfc2E7CisJdW5zaWduZWQgaW50IHJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGU7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fbXNnX2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9iYWRfbXNnX2ZyYWdtZW50czsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0c3sKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX29rOworCXVuc2lnbmVkIGludCByeF9hc3NfZXJyOworCXVuc2lnbmVkIGludCByeF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnM7CisJdW5zaWduZWQgaW50IHR4X2JlYWNvbnM7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfb2s7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfZXJyOworCXVuc2lnbmVkIGludCB0eF9hdXRoX3JxOworCXVuc2lnbmVkIGludCBub19hdXRoX3JzOworCXVuc2lnbmVkIGludCBub19hc3NfcnM7CisJdW5zaWduZWQgaW50IHR4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgcmVhc3NvYzsKKwl1bnNpZ25lZCBpbnQgc3d0eHN0b3A7CisJdW5zaWduZWQgaW50IHN3dHhhd2FrZTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlOworCisjaW5jbHVkZSAiaWVlZTgwMjExX2NyeXB0LmgiCisKKyNkZWZpbmUgU0VDX0tFWV8xICAgICAgICAgKDE8PDApCisjZGVmaW5lIFNFQ19LRVlfMiAgICAgICAgICgxPDwxKQorI2RlZmluZSBTRUNfS0VZXzMgICAgICAgICAoMTw8MikKKyNkZWZpbmUgU0VDX0tFWV80ICAgICAgICAgKDE8PDMpCisjZGVmaW5lIFNFQ19BQ1RJVkVfS0VZICAgICgxPDw0KQorI2RlZmluZSBTRUNfQVVUSF9NT0RFICAgICAoMTw8NSkKKyNkZWZpbmUgU0VDX1VOSUNBU1RfR1JPVVAgKDE8PDYpCisjZGVmaW5lIFNFQ19MRVZFTCAgICAgICAgICgxPDw3KQorI2RlZmluZSBTRUNfRU5BQkxFRCAgICAgICAoMTw8OCkKKworI2RlZmluZSBTRUNfTEVWRUxfMCAgICAgIDAgLyogTm9uZSAqLworI2RlZmluZSBTRUNfTEVWRUxfMSAgICAgIDEgLyogV0VQIDQwIGFuZCAxMDQgYml0ICovCisjZGVmaW5lIFNFQ19MRVZFTF8yICAgICAgMiAvKiBMZXZlbCAxICsgVEtJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMl9DS0lQIDMgLyogTGV2ZWwgMSArIENLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzMgICAgICA0IC8qIExldmVsIDIgKyBDQ01QICovCisKKyNkZWZpbmUgV0VQX0tFWVMgNAorI2RlZmluZSBXRVBfS0VZX0xFTiAxMworCisjZGVmaW5lIFdFUF9LRVlfTEVOX01PRElGIDMyCisKK3N0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgeworCXUxNiBhY3RpdmVfa2V5OjIsCisgICAgICAgICAgICBlbmFibGVkOjEsCisJICAgIGF1dGhfbW9kZToyLAorICAgICAgICAgICAgYXV0aF9hbGdvOjQsCisgICAgICAgICAgICB1bmljYXN0X3VzZXNfZ3JvdXA6MTsKKwl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOworCXU4IGtleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOX01PRElGXTsKKwl1OCBsZXZlbDsKKwl1MTYgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKgorCisgODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAorCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisKK1RvdGFsOiAyOC0yMzQwIGJ5dGVzCisKKyovCisKK3N0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxWzZdOworCXU4IGFkZHIyWzZdOworCXU4IGFkZHIzWzZdOworCXUxNiBzZXFfY3RybDsKK307CisKKyNkZWZpbmUgQkVBQ09OX1BST0JFX1NTSURfSURfUE9TSVRJT04gMTIKKworLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCisjZGVmaW5lIE1GSUVfVFlQRV9TU0lEICAgICAgIDAKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTICAgICAgMQorI2RlZmluZSBNRklFX1RZUEVfRkhfU0VUICAgICAyCisjZGVmaW5lIE1GSUVfVFlQRV9EU19TRVQgICAgIDMKKyNkZWZpbmUgTUZJRV9UWVBFX0NGX1NFVCAgICAgNAorI2RlZmluZSBNRklFX1RZUEVfVElNICAgICAgICA1CisjZGVmaW5lIE1GSUVfVFlQRV9JQlNTX1NFVCAgIDYKKyNkZWZpbmUgTUZJRV9UWVBFX0NPVU5UUlkgIDcgLy8rWUosMDgwNjI1CisjZGVmaW5lIE1GSUVfVFlQRV9DSEFMTEVOR0UgIDE2CisjZGVmaW5lIE1GSUVfVFlQRV9FUlAgICAgICAgIDQyCisjZGVmaW5lIE1GSUVfVFlQRV9SU04JICAgICA0OAorI2RlZmluZSBNRklFX1RZUEVfUkFURVNfRVggICA1MAorI2RlZmluZSBNRklFX1RZUEVfR0VORVJJQyAgICAyMjEKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKK3R5cGVkZWYgZW51bQoreworCUNPVU5UUllfQ09ERV9GQ0MgPSAwLAorCUNPVU5UUllfQ09ERV9JQyA9IDEsCisJQ09VTlRSWV9DT0RFX0VUU0kgPSAyLAorCUNPVU5UUllfQ09ERV9TUEFJTiA9IDMsCisJQ09VTlRSWV9DT0RFX0ZSQU5DRSA9IDQsCisJQ09VTlRSWV9DT0RFX01LSyA9IDUsCisJQ09VTlRSWV9DT0RFX01LSzEgPSA2LAorCUNPVU5UUllfQ09ERV9JU1JBRUwgPSA3LAorCUNPVU5UUllfQ09ERV9URUxFQyA9IDgsCisJQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4gPSA5LAorCUNPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzX0lOREVYID0gMTAKK31jb3VudHJ5X2NvZGVfdHlwZV90OworI2VuZGlmCisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciB7CisJdTggaWQ7CisJdTggbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsKKwl1OCBsZW47CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogVGhlc2UgYXJlIHRoZSBkYXRhIHR5cGVzIHRoYXQgY2FuIG1ha2UgdXAgbWFuYWdlbWVudCBwYWNrZXRzCisgKgorCXUxNiBhdXRoX2FsZ29yaXRobTsKKwl1MTYgYXV0aF9zZXF1ZW5jZTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBjYXBhYmlsaXR5OworCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJc3RydWN0IHsKKwkJdTE2IGFzc29jaWF0aW9uX2lkOjE0LCByZXNlcnZlZDoyOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXUzMiB0aW1lX3N0YW1wWzJdOworCXUxNiByZWFzb247CisJdTE2IHN0YXR1czsKKyovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQgIlBlbmd1aW4iCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEUgMTAKKworc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiB7CisJc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7CisJdTE2IGFsZ29yaXRobTsKKwl1MTYgdHJhbnNhY3Rpb247CisJdTE2IHN0YXR1czsKKwkvL3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBjYXBhYmlsaXR5OworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgeworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCS8qc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OyovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTE2IGNhcGFiaWxpdHk7CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwkvL3U4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiBzdGF0dXM7CisJdTE2IGFpZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7IC8qIHN1cHBvcnRlZCByYXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWV7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKyAgICAgICAgdTE2ICAgIHJlYXNvbmNvZGU7Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiB7CisJdTggbnJfZnJhZ3M7CisJdTggZW5jcnlwdGVkOworCXUxNiByZXNlcnZlZDsKKwl1MTYgZnJhZ19zaXplOworCXUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX2FjX3BhcmFtIHsKKwl1OCBhY19hY2lfYWNtX2FpZnNuOworCXU4IGFjX2Vjd21pbl9lY3dtYXg7CisJdTE2IGFjX3R4b3BfbGltaXQ7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c19pbmZvIHsKKwl1OCBhY19kaXJfdGlkOworCXU4IGFjX3VwX3BzYjsKKwl1OCByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c3BlY19lbGVtIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c19pbmZvIHRzX2luZm87CisJdTE2IG5vcm1fbXNkdV9zaXplOworCXUxNiBtYXhfbXNkdV9zaXplOworCXUzMiBtaW5fc2Vydl9pbnRlcjsKKwl1MzIgbWF4X3NlcnZfaW50ZXI7CisJdTMyIGluYWN0X2ludGVyOworCXUzMiBzdXNwZW5faW50ZXI7CisJdTMyIHNlcnZfc3RhcnRfdGltZTsKKwl1MzIgbWluX2RhdGFfcmF0ZTsKKwl1MzIgbWVhbl9kYXRhX3JhdGU7CisJdTMyIHBlYWtfZGF0YV9yYXRlOworCXUzMiBtYXhfYnVyc3Rfc2l6ZTsKKwl1MzIgZGVsYXlfYm91bmQ7CisJdTMyIG1pbl9waHlfcmF0ZTsKKwl1MTYgc3VycF9iYW5kX2FsbG93OworCXUxNiBtZWRpdW1fdGltZTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSB7V01NX2FsbF9mcmFtZSwgV01NX3R3b19mcmFtZSwgV01NX2ZvdXJfZnJhbWUsIFdNTV9zaXhfZnJhbWV9OworI2RlZmluZSBNQVhfU1BfTGVuICAoV01NX2FsbF9mcmFtZSA8PCA0KQorI2RlZmluZSBJRUVFODAyMTFfUU9TX1RJRCAweDBmCisjZGVmaW5lIFFPU19DVExfTk9UQ09OVEFJTl9BQ0sgKDB4MDEgPDwgNSkKKworLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLworI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKKy8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcworICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAorICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KKyNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCisjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQorI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAorLy8jZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTYxCisjZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTY1IC8vWUosbW9kaWZpZWQsMDgwNjI1CisjZGVmaW5lIE1BWF9JRV9MRU4JCQkJCQkweEZGIC8vK1lKLDA4MDYyNQorCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9MSVNUeworCXU4CUNoYW5uZWxbTUFYX0NIQU5ORUxfTlVNQkVSICsgMV07CisJdTgJTGVuOworfUNIQU5ORUxfTElTVCwgKlBDSEFOTkVMX0xJU1Q7CisKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FCSAgMTAwLy80MDAKKy8vKEhaIC8gMikKKy8vYnkgYW15IGZvciBwcworI2RlZmluZSBJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUgICAgMjAwMAorLy9ieSBhbXkgZm9yIHBzCisvL2J5IGFteSBmb3IgYW50ZW5uYQorI2RlZmluZSBBTlRFTk5BX0RJVkVSU0lUWV9USU1FUl9QRVJJT0QJCTEwMDAgLy8gMTAwMCBtCisvL2J5IGFteSBmb3IgYW50ZW5uYQorI2RlZmluZSBJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FIChIWiAqIDIpCisKKyNkZWZpbmUgQ1JDX0xFTkdUSCAgICAgICAgICAgICAgICAgNFUKKworI2RlZmluZSBNQVhfV1BBX0lFX0xFTiA2NAorCisjZGVmaW5lIE5FVFdPUktfRU1QVFlfRVNTSUQgKDE8PDApCisjZGVmaW5lIE5FVFdPUktfSEFTX09GRE0gICAgKDE8PDEpCisjZGVmaW5lIE5FVFdPUktfSEFTX0NDSyAgICAgKDE8PDIpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fTUJDQVNUIDQKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVUNBU1QgMgorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9WQUxJRCAxCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX0lOVkFMSUQgMAorCisjZGVmaW5lIElFRUU4MDIxMV9QU19ESVNBQkxFRCAwCisjZGVmaW5lIElFRUU4MDIxMV9QU19VTklDQVNUIElFRUU4MDIxMV9EVElNX1VDQVNUCisjZGVmaW5lIElFRUU4MDIxMV9QU19NQkNBU1QgSUVFRTgwMjExX0RUSU1fTUJDQVNUCisjZGVmaW5lIElFRUU4MDIxMV9QU19FTkFCTEUgICBJRUVFODAyMTFfRFRJTV9WQUxJRAorLy9hZGRlZCBieSBEYXZpZCBmb3IgUW9TIDIwMDYvNi8zMAorLy8jZGVmaW5lIFdNTV9IYW5nXzgxODcKKyNpZmRlZiBXTU1fSGFuZ184MTg3CisjdW5kZWYgV01NX0hhbmdfODE4NworI2VuZGlmCisKKyNkZWZpbmUgV01FX0FDX0JFICAgMHgwMAorI2RlZmluZSBXTUVfQUNfQksgICAweDAxCisjZGVmaW5lIFdNRV9BQ19WSSAgIDB4MDIKKyNkZWZpbmUgV01FX0FDX1ZPICAgMHgwMworI2RlZmluZSBXTUVfQUNJX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUlGU05fTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BQ19QUkFNX0xFTiAxNgorCisvL1VQIE1hcHBpbmcgdG8gQUMsIHVzaW5nIGluIE1nbnRRdWVyeV9TZXF1ZW5jZU51bWJlcigpIGFuZCBtYXliZSBmb3IgRFNDUAorLy8jZGVmaW5lIFVQMkFDKHVwKQkoKHVwPDMpID8gKCh1cD09MCk/MTowKSA6ICh1cD4+MSkpCisjZGVmaW5lIFVQMkFDKHVwKSAoCQkgICBcCisJKCh1cCkgPCAxKSA/IFdNRV9BQ19CRSA6IFwKKwkoKHVwKSA8IDMpID8gV01FX0FDX0JLIDogXAorCSgodXApIDwgNCkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCA2KSA/IFdNRV9BQ19WSSA6IFwKKwlXTUVfQUNfVk8pCisvL0FDIE1hcHBpbmcgdG8gVVAsIHVzaW5nIGluIFR4IHBhcnQgZm9yIHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBUWCBxdWV1ZQorI2RlZmluZSBBQzJVUChfYWMpCSggICAgICAgXAorCSgoX2FjKSA9PSBXTUVfQUNfVk8pID8gNiA6IFwKKwkoKF9hYykgPT0gV01FX0FDX1ZJKSA/IDUgOiBcCisJKChfYWMpID09IFdNRV9BQ19CSykgPyAxIDogXAorCTApCisKKyNkZWZpbmUJRVRIRVJfQUREUl9MRU4JCTYJLyogbGVuZ3RoIG9mIGFuIEV0aGVybmV0IGFkZHJlc3MgKi8KK3N0cnVjdAlldGhlcl9oZWFkZXIgeworCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTE2IGV0aGVyX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjaWZuZGVmIEVUSEVSVFlQRV9QQUUKKyNkZWZpbmUJRVRIRVJUWVBFX1BBRQkweDg4OGUJCS8qIEVBUE9MIFBBRS84MDIuMXggKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVAKKyNkZWZpbmUJRVRIRVJUWVBFX0lQCTB4MDgwMAkJLyogSVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgeworCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IHNzaWRfbGVuOworCisJLyogVGhlc2UgYXJlIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHM7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggcmF0ZXNbTUFYX1JBVEVTX0xFTkdUSF07CisJdTggcmF0ZXNfbGVuOworCXU4IHJhdGVzX2V4W01BWF9SQVRFU19FWF9MRU5HVEhdOworCXU4IHJhdGVzX2V4X2xlbjsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKKwl1OCBtb2RlOworCXU4IGZsYWdzOworCXUzMiBsYXN0X2Fzc29jaWF0ZTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTE2IGF0aW1fd2luZG93OworCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggcnNuX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3QgcnNuX2llX2xlbjsKKwl1OCBkdGltX3BlcmlvZDsKKwl1OCBkdGltX2RhdGE7CisJdTMyIGxhc3RfZHRpbV9zdGFfdGltZVsyXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLy9hcHBlZGVkIGZvciBRb1MKKwl1OCB3bW1faW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB3bW1fcGFyYW1bNF07CisJdTggUW9TX0VuYWJsZTsKKwl1OCBTaWduYWxTdHJlbmd0aDsKKy8vYnkgYW15IDA4MDMxMgorCXU4IEhpZ2hlc3RPcGVyYVJhdGU7CisvL2J5IGFteSAwODAzMTIKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwl1OCBUdXJib19FbmFibGU7Ly9lbmFibGUgdHVyYm8gbW9kZSwgYWRkZWQgYnkgdGhvbWFzCisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTE2IENvdW50cnlJZUxlbjsKKwl1OCBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07CisjZW5kaWYKK307CisKK2VudW0gaWVlZTgwMjExX3N0YXRlIHsKKworCS8qIHRoZSBjYXJkIGlzIG5vdCBsaW5rZWQgYXQgYWxsICovCisJSUVFRTgwMjExX05PTElOSyA9IDAsCisKKwkvKiBJRUVFODAyMTFfQVNTT0NJQVRJTkcqIGFyZSBmb3IgQlNTIGNsaWVudCBtb2RlCisJICogdGhlIGRyaXZlciBzaGFsbCBub3QgcGVyZm9ybSBSWCBmaWx0ZXJpbmcgdW5sZXNzCisJICogdGhlIHN0YXRlIGlzIExJTktFRC4KKwkgKiBUaGUgZHJpdmVyIHNoYWxsIGp1c3QgY2hlY2sgZm9yIHRoZSBzdGF0ZSBMSU5LRUQgYW5kCisJICogZGVmYXVsdHMgdG8gTk9MSU5LIGZvciBBTEwgdGhlIG90aGVyIHN0YXRlcyAoaW5jbHVkaW5nCisJICogTElOS0VEX1NDQU5OSU5HKQorCSAqLworCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aWxsIHN0YXJ0ICh3cSBzY2hlZHVsaW5nKSovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HLAorCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWSwKKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgaXMgc2VuZGluZyBBVVRIIHJlcXVlc3QqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORywKKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgaGFzIHN1Y2Nlc3NmdWxseSBhdXRoZW50Y2F0ZWQKKwkgKiBhbmQgaXMgc2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0CisJICovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQsCisKKwkvKiB0aGUgbGluayBpcyBvay4gdGhlIGNhcmQgYXNzb2NpYXRlZCB0byBhIEJTUyBvciBsaW5rZWQKKwkgKiB0byBhIGlic3MgY2VsbCBvciBhY3RpbmcgYXMgYW4gQVAgYW5kIGNyZWF0aW5nIHRoZSBic3MKKwkgKi8KKwlJRUVFODAyMTFfTElOS0VELAorCisJLyogc2FtZSBhcyBMSU5LRUQsIGJ1dCB0aGUgZHJpdmVyIHNoYWxsIGFwcGx5IFJYIGZpbHRlcgorCSAqIHJ1bGVzIGFzIHdlIGFyZSBpbiBOT19MSU5LIG1vZGUuIEFzIHRoZSBjYXJkIGlzIHN0aWxsCisJICogbG9naWNhbGx5IGxpbmtlZCwgYnV0IGl0IGlzIGRvaW5nIGEgc3luY3JvIHNpdGUgc3VydmV5CisJICogdGhlbiBpdCB3aWxsIGJlIGJhY2sgdG8gTElOS0VEIHN0YXRlLgorCSAqLworCUlFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcsCisKK307CisKKyNkZWZpbmUgREVGQVVMVF9NQVhfU0NBTl9BR0UgKDE1ICogSFopCisjZGVmaW5lIERFRkFVTFRfRlRTIDIzNDYKKyNkZWZpbmUgTUFDX0ZNVCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiCisjZGVmaW5lIE1BQ19BUkcoeCkgKCh1OCopKHgpKVswXSwoKHU4KikoeCkpWzFdLCgodTgqKSh4KSlbMl0sKCh1OCopKHgpKVszXSwoKHU4KikoeCkpWzRdLCgodTgqKSh4KSlbNV0KKworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMTEpKQorZXh0ZXJuIGlubGluZSBpbnQgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoY29uc3QgdTggKmFkZHIpCit7CisgICAgICAgIHJldHVybiAoKGFkZHJbMF0gIT0gMHhmZikgJiYgKDB4MDEgJiBhZGRyWzBdKSk7Cit9CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSkKK2V4dGVybiBpbmxpbmUgaW50IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworCXJldHVybiAoKGFkZHJbMF0gPT0gMHhmZikgJiYgKGFkZHJbMV0gPT0gMHhmZikgJiYgKGFkZHJbMl0gPT0gMHhmZikgJiYgICBcCisJCShhZGRyWzNdID09IDB4ZmYpICYmIChhZGRyWzRdID09IDB4ZmYpICYmIChhZGRyWzVdID09IDB4ZmYpKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MgKDE8PDApCisjZGVmaW5lIENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgKDE8PDEpCisKK3R5cGVkZWYgc3RydWN0IHR4X3BlbmRpbmdfdHsKKwlpbnQgZnJhZzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOworfXR4X3BlbmRpbmdfdDsKKworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qIEJvb2trZWVwaW5nIHN0cnVjdHVyZXMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIGllZWVfc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zb2Z0bWFjX3N0YXRzIHNvZnRtYWNfc3RhdHM7CisKKwkvKiBQcm9iZSAvIEJlYWNvbiBtYW5hZ2VtZW50ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2ZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmtzOworCWludCBzY2FuczsKKwlpbnQgc2Nhbl9hZ2U7CisKKwlpbnQgaXdfbW9kZTsgLyogb3BlcmF0aW5nIG1vZGUgKElXX01PREVfKikgKi8KKworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IHdwYXhfc3VpdGxpc3RfbG9jazsKKworCWludCB0eF9oZWFkcm9vbTsgLyogU2V0IHRvIHNpemUgb2YgYW55IGFkZGl0aW9uYWwgcm9vbSBuZWVkZWQgYXQgZnJvbnQKKwkJCSAgKiBvZiBhbGxvY2F0ZWQgVHggU0tCcyAqLworCXUzMiBjb25maWc7CisKKwkvKiBXRVAgYW5kIG90aGVyIGVuY3J5cHRpb24gcmVsYXRlZCBzZXR0aW5ncyBhdCB0aGUgZGV2aWNlIGxldmVsICovCisJaW50IG9wZW5fd2VwOyAvKiBTZXQgdG8gMSB0byBhbGxvdyB1bmVuY3J5cHRlZCBmcmFtZXMgKi8KKworCWludCByZXNldF9vbl9rZXljaGFuZ2U7IC8qIFNldCB0byAxIGlmIHRoZSBIVyBuZWVkcyB0byBiZSByZXNldCBvbgorCQkJCSAqIFdFUCBrZXkgY2hhbmdlcyAqLworCisJLyogSWYgdGhlIGhvc3QgcGVyZm9ybXMge2VuLGRlfWNyeXB0aW9uLCB0aGVuIHNldCB0byAxICovCisJaW50IGhvc3RfZW5jcnlwdDsKKwlpbnQgaG9zdF9kZWNyeXB0OworCWludCBpZWVlODAyXzF4OyAvKiBpcyBJRUVFIDgwMi4xWCB1c2VkICovCisKKwkvKiBXUEEgZGF0YSAqLworCWludCB3cGFfZW5hYmxlZDsKKwlpbnQgZHJvcF91bmVuY3J5cHRlZDsKKwlpbnQgdGtpcF9jb3VudGVybWVhc3VyZXM7CisJaW50IHByaXZhY3lfaW52b2tlZDsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCAqd3BhX2llOworCisJdTggYXBfbWFjX2FkZHJbNl07CisJdTE2IHBhaXJ3aXNlX2tleV90eXBlOworCXUxNiBicm9hZGNhc3Rfa2V5X3R5cGU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X2RlaW5pdF9saXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHRbV0VQX0tFWVNdOworCWludCB0eF9rZXlpZHg7IC8qIGRlZmF1bHQgVFgga2V5IGluZGV4IChjcnlwdFt0eF9rZXlpZHhdKSAqLworCXN0cnVjdCB0aW1lcl9saXN0IGNyeXB0X2RlaW5pdF90aW1lcjsKKworCWludCBiY3J4X3N0YV9rZXk7IC8qIHVzZSBpbmRpdmlkdWFsIGtleXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGV2ZW4KKwkJCSAgICogd2l0aCBSWCBvZiBicm9hZC9tdWx0aWNhc3QgZnJhbWVzICovCisKKwkvKiBGcmFnbWVudGF0aW9uIHN0cnVjdHVyZXMgKi8KKwkvLyBlYWNoIHN0cmVhbWluZyBjb250YWluIGEgZW50cnkKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgZnJhZ19jYWNoZVsxN11bSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOXTsKKwl1bnNpZ25lZCBpbnQgZnJhZ19uZXh0X2lkeFsxN107CisJdTE2IGZ0czsgLyogRnJhZ21lbnRhdGlvbiBUaHJlc2hvbGQgKi8KKworCS8qIFRoaXMgc3RvcmVzIGluZm9zIGZvciB0aGUgY3VycmVudCBuZXR3b3JrLgorCSAqIEVpdGhlciB0aGUgbmV0d29yayB3ZSBhcmUgYXNzb2NpYXRlZCBpbiBJTkZSQVNUUlVDVFVSRQorCSAqIG9yIHRoZSBuZXR3b3JrIHRoYXQgd2UgYXJlIGNyZWF0aW5nIGluIE1BU1RFUiBtb2RlLgorCSAqIGFkLWhvYyBpcyBhIG1peHR1cmUgOy0pLgorCSAqIE5vdGUgdGhhdCBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlLCBldmVuIHdoZW4gbm90IGFzc29jaWF0ZWQsCisJICogZmllbGRzIGJzc2lkIGFuZCBlc3NpZCBtYXkgYmUgdmFsaWQgKGlmIHdwYV9zZXQgYW5kIGVzc2lkX3NldAorCSAqIGFyZSB0cnVlKSBhcyB0aHkgY2FycnkgdGhlIHZhbHVlIHNldCBieSB0aGUgdXNlciB2aWEgaXdjb25maWcKKwkgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgY3VycmVudF9uZXR3b3JrOworCisKKwllbnVtIGllZWU4MDIxMV9zdGF0ZSBzdGF0ZTsKKworCWludCBzaG9ydF9zbG90OworCWludCBtb2RlOyAgICAgICAvKiBBLCBCLCBHICovCisJaW50IG1vZHVsYXRpb247IC8qIENDSywgT0ZETSAqLworCWludCBmcmVxX2JhbmQ7ICAvKiAyLjRHaHosIDUuMkdoeiwgTWl4ZWQgKi8KKwlpbnQgYWJnX3RydWU7ICAgLyogQUJHIGZsYWcgICAgICAgICAgICAgICovCisKKwkvKiB1c2VkIGZvciBmb3JjaW5nIHRoZSBpYnNzIHdvcmtxdWV1ZSB0byB0ZXJtaW5hdGUKKwkgKiB3aXRob3V0IHdhaXQgZm9yIHRoZSBzeW5jcm8gc2NhbiB0byB0ZXJtaW5hdGUKKwkgKi8KKwlzaG9ydCBzeW5jX3NjYW5faHVycnl1cDsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl2b2lkICogcERvdDExZEluZm87CisJYm9vbCBiR2xvYmFsRG9tYWluOworCisJLy8gRm9yIExpdGVvbiBDaDEyfjEzIHBhc3NpdmUgc2NhbgorCXU4CU1pblBhc3NpdmVDaG5sTnVtOworCXU4CUlic3NTdGFydENobmw7CisjZWxzZQorCS8qIG1hcCBvZiBhbGxvd2VkIGNoYW5uZWxzLiAwIGlzIGR1bW15ICovCisJLy8gRklYTUU6IHJlbWViZXIgdG8gZGVmYXVsdCB0byBhIGJhc2ljIGNoYW5uZWwgcGxhbiBkZXBlbmRpbmcgb2YgdGhlIFBIWSB0eXBlCisJaW50IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKyNlbmRpZgorCisJaW50IHJhdGU7ICAgICAgIC8qIGN1cnJlbnQgcmF0ZSAqLworCWludCBiYXNpY19yYXRlOworCS8vRklYTUU6IHBsZWFjZSBjYWxsYmFjaywgc2VlIGlmIHJlZHVuZGFudCB3aXRoIHNvZnRtYWNfZmVhdHVyZXMKKwlzaG9ydCBhY3RpdmVfc2NhbjsKKworCS8qIHRoaXMgY29udGFpbnMgZmxhZ3MgZm9yIHNlbGVjdGl2ZWx5IGVuYWJsZSBzb2Z0bWFjIHN1cHBvcnQgKi8KKwl1MTYgc29mdG1hY19mZWF0dXJlczsKKworCS8qIGlmIHRoZSBzZXF1ZW5jZSBjb250cm9sIGZpZWxkIGlzIG5vdCBmaWxsZWQgYnkgSFcgKi8KKwl1MTYgc2VxX2N0cmxbNV07CisKKwkvKiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVyICovCisJdTE2IGFzc29jaWF0ZV9zZXE7CisKKwkvKiBBSUQgZm9yIFJUWGVkIGFzc29jaWF0aW9uIHJlc3BvbnNlcyAqLworCXUxNiBhc3NvY19pZDsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkKi8KKwlzaG9ydCBwczsKKwlzaG9ydCBzdGFfc2xlZXA7CisJaW50IHBzX3RpbWVvdXQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHBzX3Rhc2s7CisJdTMyIHBzX3RoOworCXUzMiBwc190bDsKKworCXNob3J0IHJhd190eDsKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KKwlzaG9ydCBxdWV1ZV9zdG9wOworCXNob3J0IHNjYW5uaW5nOworCXNob3J0IHByb3RvX3N0YXJ0ZWQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNjYW5fc2VtOworCisJc3BpbmxvY2tfdCBtZ210X3R4X2xvY2s7CisJc3BpbmxvY2tfdCBiZWFjb25fbG9jazsKKworCXNob3J0IGJlYWNvbl90eGluZzsKKworCXNob3J0IHdhcF9zZXQ7CisJc2hvcnQgc3NpZF9zZXQ7CisKKwl1OCAgd3BheF90eXBlX3NldDsgICAgLy97YWRkZWQgYnkgRGF2aWQsIDIwMDYuOS4yOH0KKwl1MzIgd3BheF90eXBlX25vdGlmeTsgLy97YWRkZWQgYnkgRGF2aWQsIDIwMDYuOS4yNn0KKworCS8qIFFvUyByZWxhdGVkIGZsYWcgKi8KKwljaGFyIGluaXRfd21tcGFyYW1fZmxhZzsKKworCS8qIGZvciBkaXNjYXJkaW5nIGR1cGxpY2F0ZWQgcGFja2V0cyBpbiBJQlNTICovCisJc3RydWN0IGxpc3RfaGVhZCBpYnNzX21hY19oYXNoW0lFRUVfSUJTU19NQUNfSEFTSF9TSVpFXTsKKworCS8qIGZvciBkaXNjYXJkaW5nIGR1cGxpY2F0ZWQgcGFja2V0cyBpbiBCU1MgKi8KKwl1MTYgbGFzdF9yeHNlcV9udW1bMTddOyAvKiByeCBzZXEgcHJldmlvdXMgcGVyLXRpZCAqLworCXUxNiBsYXN0X3J4ZnJhZ19udW1bMTddOy8qIHR4IGZyYWcgcHJldmlvdXMgcGVyLXRpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9wYWNrZXRfdGltZVsxN107CisKKwkvKiBmb3IgUFMgbW9kZSAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yeF9wc190aW1lOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCBza19idWZmICptZ210X3F1ZXVlX3JpbmdbTUdNVF9RVUVVRV9OVU1dOworCWludCBtZ210X3F1ZXVlX2hlYWQ7CisJaW50IG1nbXRfcXVldWVfdGFpbDsKKworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc3RydWN0ICB0eF9wZW5kaW5nX3QgdHhfcGVuZGluZzsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBhc3NvY2lhdGVfdGltZXI7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19CRUFDT05TIGlzIHNldCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGJlYWNvbl90aW1lcjsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfY29tcGxldGVfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3JldHJ5X3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2Nhbl93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3hfc3luY19zY2FuX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3bW1fcGFyYW1fdXBkYXRlX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwc19yZXF1ZXN0X3R4X2Fja193cTsvL2ZvciBwcworLy8Jc3RydWN0IHdvcmtfc3RydWN0IGh3X3dha2V1cF93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBod19zbGVlcF93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaF9kb2dfd3E7CisJYm9vbCBiSW5hY3RpdmVQczsKKwlib29sIGFjdHNjYW5uaW5nOworCWJvb2wgYmVpbnJldHJ5OworCXUxNiBMaXN0ZW5JbnRlcnZhbDsKKwl1bnNpZ25lZCBsb25nIE51bVJ4RGF0YUluUGVyaW9kOyAvL1lKLGFkZCwwODA4MjgKKwl1bnNpZ25lZCBsb25nIE51bVJ4QmNuSW5QZXJpb2Q7ICAvL1lKLGFkZCwwODA4MjgKKwl1bnNpZ25lZCBsb25nIE51bVJ4T2tUb3RhbDsKKwl1bnNpZ25lZCBsb25nIE51bVJ4VW5pY2FzdDsvL1lKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUKKwlib29sIGJId1JhZGlvT2ZmOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgc29mdG1hY19zY2FuX3dxOworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3dha2V1cF93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3NsZWVwX3dxOy8vK2J5IGFteSAwODAzMjQKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdhdGNoX2RvZ193cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHN3X2FudGVubmFfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayAgc3RhcnRfaWJzc193cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlIDA4MDMxMgorICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgcmF0ZV9hZGFwdGVyX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X2RpZ193cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHR4X3B3X3dxOworCisvL0FkZGVkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIEdQSU9DaGFuZ2VSRldvcmtJdGVtOworI2Vsc2UKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBzdGFydF9pYnNzX3dxOworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc29mdG1hY19zY2FuX3dxOworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3JldHJ5X3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBod193YWtldXBfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IGh3X3NsZWVwX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaF9kb2dfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHN3X2FudGVubmFfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZSAwODAzMTIKKyAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmF0ZV9hZGFwdGVyX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfZGlnX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF9wd193cTsKKworLy9BZGRlZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJc3RydWN0IHdvcmtfc3RydWN0IEdQSU9DaGFuZ2VSRldvcmtJdGVtOworI2VuZGlmCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCisJLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCisJdm9pZCAoKnNldF9zZWN1cml0eSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSAqc2VjKTsKKworCS8qIFVzZWQgdG8gVFggZGF0YSBmcmFtZSBieSB1c2luZyB0eGIgc3RydWN0cy4KKwkgKiB0aGlzIGlzIG5vdCB1c2VkIGlmIGluIHRoZSBzb2Z0bWFjX2ZlYXR1cmVzCisJICogaXMgc2V0IHRoZSBmbGFnIElFRUVfU09GVE1BQ19UWF9RVUVVRQorCSAqLworCWludCAoKmhhcmRfc3RhcnRfeG1pdCkoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCWludCAoKnJlc2V0X3BvcnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogU29mdG1hYy1nZW5lcmF0ZWQgZnJhbWVzIChtYW1hZ2VtZW50KSBhcmUgVFhlZCB2aWEgdGhpcworCSAqIGNhbGxiYWNrIGlmIHRoZSBmbGFnIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMKKwkgKiBub3Qgc2V0LiBBcyBzb21lIGNhcmRzIG1heSBoYXZlIGRpZmZlcmVudCBIVyBxdWV1ZXMgdGhhdAorCSAqIG9uZSBtaWdodCB3YW50IHRvIHVzZSBmb3IgZGF0YSBhbmQgbWFuYWdlbWVudCBmcmFtZXMKKwkgKiB0aGUgb3B0aW9uIHRvIGhhdmUgdHdvIGNhbGxiYWNrcyBtaWdodCBiZSB1c2VmdWwuCisJICogVGhpcyBmdWNudGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwlpbnQgKCpzb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHVzZWQgaW5zdGVhZCBvZiBoYXJkX3N0YXJ0X3htaXQgKG5vdCBzb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdCkKKwkgKiBpZiB0aGUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGZlYXR1cmUgaXMgdXNlZCB0byBUWCBkYXRhCisJICogZnJhbWVzLiBJIHRoZSBvcHRpb24gSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBhbHNvIHNldAorCSAqIHRoZW4gYWxzbyBtYW5hZ2VtZW50IGZyYW1lcyBhcmUgc2VudCB2aWEgdGhpcyBjYWxsYmFjay4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbid0IHNsZWVwLgorCSAqLworCXZvaWQgKCpzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IHJhdGUpOworCisJLyogc3RvcHMgdGhlIEhXIHF1ZXVlIGZvciBEQVRBIGZyYW1lcy4gVXNlZnVsIHRvIGF2b2lkCisJICogd2FzdGUgdGltZSB0byBUWCBkYXRhIGZyYW1lIHdoZW4gd2UgYXJlIHJlYXNzb2NpYXRpbmcKKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4KKwkgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3N0b3ApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogT0sgdGhpcyBpcyBjb21wbGVtZW50YXIgdG8gZGF0YV9wb2xsX2hhcmRfc3RvcCAqLworCXZvaWQgKCpkYXRhX2hhcmRfcmVzdW1lKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGFzayB0byB0aGUgZHJpdmVyIHRvIHJldHVuZSB0aGUgcmFkaW8gLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLiB0aGUgZHJpdmVyIHNob3VsZCBlbnN1cmUKKwkgKiB0aGUgcmFkaW8gaGFzIGJlZW4gc3dpdGhjZWQgYmVmb3JlIHJldHVybi4KKwkgKi8KKwl2b2lkICgqc2V0X2NoYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOworCisJLyogVGhlc2UgYXJlIG5vdCB1c2VkIGlmIHRoZSBpZWVlIHN0YWNrIHRha2VzIGNhcmUgb2YKKwkgKiBzY2FubmluZyAoSUVFRV9TT0ZUTUFDX1NDQU4gZmVhdHVyZSBzZXQpLgorCSAqIEluIHRoaXMgY2FzZSBvbmx5IHRoZSBzZXRfY2hhbiBpcyB1c2VkLgorCSAqCisJICogVGhlIHN5bmNybyB2ZXJzaW9uIGlzIHNpbWlsYXIgdG8gdGhlIHN0YXJ0X3NjYW4gYnV0CisJICogZG9lcyBub3QgcmV0dXJuIHVudGlsIGFsbCBjaGFubmVscyBoYXMgYmVlbiBzY2FubmVkLgorCSAqIHRoaXMgaXMgY2FsbGVkIGluIHVzZXIgY29udGV4dCBhbmQgc2hvdWxkIHNsZWVwLAorCSAqIGl0IGlzIGNhbGxlZCBpbiBhIHdvcmtfcXVldWUgd2hlbiBzd2l0aGNpbmcgdG8gYWQtaG9jIG1vZGUKKwkgKiBvciBpbiBiZWhhbGYgb2YgaXdsaXN0IHNjYW4gd2hlbiB0aGUgY2FyZCBpcyBhc3NvY2lhdGVkCisJICogYW5kIHJvb3QgdXNlciBhc2sgZm9yIGEgc2Nhbi4KKwkgKiB0aGUgZnVjbnRpb24gc3RvcF9zY2FuIHNob3VsZCBzdG9wIGJvdGggdGhlIHN5bmNybyBhbmQKKwkgKiBiYWNrZ3JvdW5kIHNjYW5uaW5nIGFuZCBjYW4gc2xlZXAuCisJICogVGhlIGZ1Y250aW9uIHN0YXJ0X3NjYW4gc2hvdWxkIGluaXRpYXRlIHRoZSBiYWNrZ3JvdW5kCisJICogc2Nhbm5pbmcgYW5kIGNhbid0IHNsZWVwLgorCSAqLworCXZvaWQgKCpzY2FuX3N5bmNybykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0YXJ0X3NjYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdG9wX3NjYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogaW5kaWNhdGUgdGhlIGRyaXZlciB0aGF0IHRoZSBsaW5rIHN0YXRlIGlzIGNoYW5nZWQKKwkgKiBmb3IgZXhhbXBsZSBpdCBtYXkgaW5kaWNhdGUgdGhlIGNhcmQgaXMgYXNzb2NpYXRlZCBub3cuCisJICogRHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gdGhpcyB0byBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBvciBzaW1wbHkgbGlnaHQgdGhlIExJTksgbGVkCisJICovCisJdm9pZCAoKmxpbmtfY2hhbmdlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHRoZXNlIHR3byBmdW5jdGlvbiBpbmRpY2F0ZXMgdG8gdGhlIEhXIHdoZW4gdG8gc3RhcnQKKwkgKiBhbmQgc3RvcCB0byBzZW5kIGJlYWNvbnMuIFRoaXMgaXMgdXNlZCB3aGVuIHRoZQorCSAqIElFRUVfU09GVE1BQ19CRUFDT05TIGlzIG5vdCBzZXQuIEZvciBub3cgdGhlCisJICogc3RvcF9zZW5kX2JhY29ucyBpcyBOT1QgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgb25seQorCSAqIGFmdGVyIHN0YXJ0X3NlbmRfYmVhY29ucy4KKwkgKi8KKwl2b2lkICgqc3RhcnRfc2VuZF9iZWFjb25zKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0b3Bfc2VuZF9iZWFjb25zKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCAqLworCXZvaWQgKCpzdGFfd2FrZV91cCkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpwc19yZXF1ZXN0X3R4X2FjaykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCplbnRlcl9zbGVlcF9zdGF0ZSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aCwgdTMyIHRsKTsKKwlzaG9ydCAoKnBzX2lzX3F1ZXVlX2VtcHR5KSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBRb1MgcmVsYXRlZCAqLworCS8vdm9pZCAoKndtbV9wYXJhbV91cGRhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYWNfcGFyYW0pOworCS8vdm9pZCAoKndtbV9wYXJhbV91cGRhdGUpIChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKwkvKiBUaGlzIG11c3QgYmUgdGhlIGxhc3QgaXRlbSBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgZGF0YQorCSAqIGFsbG9jYXRlZCBiZXlvbmQgdGhpcyBzdHJ1Y3R1cmUgYnkgYWxsb2NfaWVlZTgwMjExICovCisJdTggcHJpdlswXTsKK307CisKKyNkZWZpbmUgSUVFRV9BICAgICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUVfQiAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFX0cgICAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRV9NT0RFX01BU0sgICAgKElFRUVfQXxJRUVFX0J8SUVFRV9HKQorCisvKiBHZW5lcmF0ZSBhIDgwMi4xMSBoZWFkZXIgKi8KKworLyogVXNlcyB0aGUgY2hhbm5lbCBjaGFuZ2UgY2FsbGJhY2sgZGlyZWN0bHkKKyAqIGluc3RlYWQgb2YgW3N0YXJ0L3N0b3BdIHNjYW4gY2FsbGJhY2tzCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1NDQU4gKDE8PDIpCisKKy8qIFBlcmZvcm0gYXV0aGVudGljYXRpb24gYW5kIGFzc29jaWF0aW9uIGhhbmRzaGFrZSAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFICgxPDwzKQorCisvKiBHZW5lcmF0ZSBwcm9iZSByZXF1ZXN0cyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUSAoMTw8NCkKKworLyogR2VuZXJhdGUgcmVzcG9uZXMgdG8gcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlMgKDE8PDUpCisKKy8qIFRoZSBpZWVlODAyLjExIHN0YWNrIHdpbGwgbWFuYWdlcyB0aGUgbmV0aWYgcXVldWUKKyAqIHdha2Uvc3RvcCBmb3IgdGhlIGRyaXZlciwgdGFraW5nIGNhcmUgb2YgODAyLjExCisgKiBmcmFnbWVudGF0aW9uLiBTZWUgc29mdG1hYy5jIGZvciBkZXRhaWxzLiAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgKDE8PDcpCisKKy8qIFVzZXMgb25seSB0aGUgc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdAorICogZXZlbiBmb3IgVFggbWFuYWdlbWVudCBmcmFtZXMuCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSAoMTw8OCkKKworLyogR2VuZXJhdGUgYmVhY29ucy4gIFRoZSBzdGFjayB3aWxsIGVucXVldWUgYmVhY29ucworICogdG8gdGhlIGNhcmQKKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfQkVBQ09OUyAoMTw8NikKKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaWVlZTgwMjExX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wcml2OworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCit7CisJLyogU2luZ2xlIHdoaXRlIHNwYWNlIGlzIGZvciBMaW5rc3lzIEFQcyAqLworCWlmIChlc3NpZF9sZW4gPT0gMSAmJiBlc3NpZFswXSA9PSAnICcpCisJCXJldHVybiAxOworCisJLyogT3RoZXJ3aXNlLCBpZiB0aGUgZW50aXJlIGVzc2lkIGlzIDAsIHdlIGFzc3VtZSBpdCBpcyBoaWRkZW4gKi8KKwl3aGlsZSAoZXNzaWRfbGVuKSB7CisJCWVzc2lkX2xlbi0tOworCQlpZiAoZXNzaWRbZXNzaWRfbGVuXSAhPSAnXDAnKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9pc192YWxpZF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgbW9kZSkKK3sKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAorCSAqIGNvbWJpbmF0aW9ucyBvZiBtb2Rlcywgc28gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgdmFsaWQgY29tYmluYXRpb24KKwkgKiBvZiBhcC9kZXZpY2Ugc3VwcG9ydGVkIG1vZGVzLCB0aGVuIHJldHVybiBzdWNjZXNzCisJICoKKwkgKi8KKwlpZiAoKG1vZGUgJiBJRUVFX0EpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0cpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0IpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X2hkcmxlbih1MTYgZmMpCit7CisJaW50IGhkcmxlbiA9IDI0OworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSkgeworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpKQorCQkJaGRybGVuID0gMzA7IC8qIEFkZHI0ICovCisJCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpCisJCQloZHJsZW4gKz0gMjsgLyogUU9TIGN0cmwqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6CisJCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpKSB7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NUUzoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNLOgorCQkJaGRybGVuID0gMTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhkcmxlbiA9IDE2OworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhkcmxlbjsKK30KKworCisKKy8qIGllZWU4MDIxMS5jICovCitleHRlcm4gdm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaWVlZTgwMjExKGludCBzaXplb2ZfcHJpdik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLyogaWVlZTgwMjExX3R4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKKwlpbnQgaGRyX2xlbik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfdHhiX2ZyZWUoc3RydWN0IGllZWU4MDIxMV90eGIgKik7CisKKworLyogaWVlZTgwMjExX3J4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOworCisvKiBpZWVlODAyMTFfd3guYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhKiB3cnF1LCBjaGFyICpleHRyYSk7CitpbnQgaWVlZTgwMjExX3d4X3NldF9hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpkYXRhLCBjaGFyICpleHRyYSk7CitpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitpbnQgaWVlZTgwMjExX3d4X3NldF9nZW5faWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICppZSwgc2l6ZV90IGxlbik7CisvKiBpZWVlODAyMTFfc29mdG1hYy5jICovCitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7CisKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4Yiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfbWFzdGVyX2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3BvaW50ICpwKTsKK2V4dGVybiB2b2lkIG5vdGlmeV93eF9hc3NvY19ldmVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcHNfdHhfYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBzdWNjZXNzKTsKK2V4dGVybiB2b2lkIFNlbmREaXNhc3NvY2lhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSx1OCogYXNTdGEsdTggYXNSc24pOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvL0FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCitleHRlcm4gdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgCQkJIHU4KiAgICAgICAgICAgICAgICAgICAgIGFzU3RhLAorICAgICAgICAJCSB1OCAgICAgICAgICAgICAgICAgICAgICBhc1Jzbik7CisKKy8qIGllZWU4MDIxMV9jcnlwdF9jY21wJnRraXAmd2VwLmMgKi8KK2V4dGVybiB2b2lkIGllZWU4MDIxMV90a2lwX251bGwodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfd2VwX251bGwodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2NtcF9udWxsKHZvaWQpOworLyogaWVlZTgwMjExX3NvZnRtYWNfd3guYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQorZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKKyBleHRlcm4gdm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKyNlbmRpZgorLy9leHRlcm4gdm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2lwc19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpOworCitleHRlcm4gY29uc3QgbG9uZyBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tdOworCitleHRlcm4gaW5saW5lIHZvaWQgaWVlZTgwMjExX2luY3JlbWVudF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zY2FucysrOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXJldHVybiBpZWVlLT5zY2FuczsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplc2NhcGVfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIHU4IGVzc2lkX2xlbikgeworCXN0YXRpYyBjaGFyIGVzY2FwZWRbSVdfRVNTSURfTUFYX1NJWkUgKiAyICsgMV07CisJY29uc3QgY2hhciAqcyA9IGVzc2lkOworCWNoYXIgKmQgPSBlc2NhcGVkOworCisJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChlc3NpZCwgZXNzaWRfbGVuKSkgeworCQltZW1jcHkoZXNjYXBlZCwgIjxoaWRkZW4+Iiwgc2l6ZW9mKCI8aGlkZGVuPiIpKTsKKwkJcmV0dXJuIGVzY2FwZWQ7CisJfQorCisJZXNzaWRfbGVuID0gbWluKGVzc2lkX2xlbiwgKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKKwl3aGlsZSAoZXNzaWRfbGVuLS0pIHsKKwkJaWYgKCpzID09ICdcMCcpIHsKKwkJCSpkKysgPSAnXFwnOworCQkJKmQrKyA9ICcwJzsKKwkJCXMrKzsKKwkJfSBlbHNlIHsKKwkJCSpkKysgPSAqcysrOworCQl9CisJfQorCSpkID0gJ1wwJzsKKwlyZXR1cm4gZXNjYXBlZDsKK30KKyNlbmRpZiAvKiBJRUVFODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDhiNzUyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5jCkBAIC0wLDAgKzEsMjQ2IEBACisjaWZkZWYgRU5BQkxFX0RPVDExRA0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLwlGaWxlOg0KKy8vCQlEb3QxMWQuYw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCUltcGxlbWVudCA4MDIuMTFkLiANCisvLw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjaW5jbHVkZSAiZG90MTFkLmgiDQorDQordm9pZA0KK0RvdDExZF9Jbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOw0KKw0KKwlwRG90MTFkSW5mby0+YkVuYWJsZWQgPSAwOw0KKw0KKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsNCisJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7DQorCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsgIA0KKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7DQorDQorCXByaW50aygiRG90MTFkX0luaXQoKVxuIik7DQorfQ0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVJlc2V0IHRvIHRoZSBzdGF0ZSBhcyB3ZSBhcmUganVzdCBlbnRlcmluZyBhIHJlZ3VsYXRvcnkgZG9tYWluLg0KKy8vDQordm9pZA0KK0RvdDExZF9SZXNldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkNCit7DQorCXUzMiBpOw0KKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oaWVlZSk7DQorDQorCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcA0KKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7DQorCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7DQorCS8vIFNldCBuZXcgY2hhbm5lbCBtYXANCisJZm9yIChpPTE7IGk8PTExOyBpKyspIHsNCisJCShwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXApW2ldID0gMTsNCisJfQ0KKwlmb3IgKGk9MTI7IGk8PTE0OyBpKyspIHsNCisJCShwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXApW2ldID0gMjsNCisJfQ0KKw0KKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsNCisJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7DQorCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsNCisNCisJLy9wcmludGsoIkRvdDExZF9SZXNldCgpXG4iKTsNCit9DQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJVXBkYXRlIGNvdW50cnkgSUUgZnJvbSBCZWFjb24gb3IgUHJvYmUgUmVzb3Buc2UgDQorLy8JCWFuZCBjb25maWd1cmUgUEhZIGZvciBvcGVyYXRpb24gaW4gdGhlIHJlZ3VsYXRvcnkgZG9tYWluLg0KKy8vDQorLy8JVE9ETzogDQorLy8JCUNvbmZpZ3VyZSBUeCBwb3dlci4NCisvLw0KKy8vCUFzc3VtcHRpb246DQorLy8JCTEuIElTX0RPVDExRF9FTkFCTEUoKSBpcyBUUlVFLg0KKy8vCQkyLiBJbnB1dCBJRSBpcyBhbiB2YWxpZCBvbmUuDQorLy8NCit2b2lkDQorRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggKgkJcFRhZGRyLA0KKwl1MTYJQ291dHJ5SWVMZW4sDQorCXU4ICogcENvdXRyeUllCSANCisJKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7DQorCXU4IGksIGosIE51bVRyaXBsZXMsIE1heENobmxOdW07DQorCVBDSE5MX1RYUE9XRVJfVFJJUExFIHBUcmlwbGU7DQorDQorCWlmKChDb3V0cnlJZUxlbiAtIDMpJTMgIT0gMCkNCisJew0KKwkJcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMVxuIik7DQorCQlEb3QxMWRfUmVzZXQoZGV2KTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7DQorCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7DQorCU1heENobmxOdW0gPSAwOw0KKwlOdW1UcmlwbGVzID0gKENvdXRyeUllTGVuIC0gMykgLyAzOyAvLyBza2lwIDMtYnl0ZSBjb3VudHJ5IHN0cmluZy4NCisJcFRyaXBsZSA9IChQQ0hOTF9UWFBPV0VSX1RSSVBMRSkocENvdXRyeUllICsgMyk7DQorCWZvcihpID0gMDsgaSA8IE51bVRyaXBsZXM7IGkrKykNCisJew0KKwkJaWYoTWF4Q2hubE51bSA+PSBwVHJpcGxlLT5GaXJzdENobmwpDQorCQl7IC8vIEl0IGlzIG5vdCBpbiBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvcmRlciwgc28gc3RvcCBwcm9jZXNzaW5nLg0KKwkJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOw0KKwkJCURvdDExZF9SZXNldChkZXYpOw0KKwkJCXJldHVybjsgDQorCQl9DQorCQlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCAocFRyaXBsZS0+Rmlyc3RDaG5sICsgcFRyaXBsZS0+TnVtQ2hubHMpKQ0KKwkJeyAvLyBJdCBpcyBub3QgYSB2YWxpZCBzZXQgb2YgY2hhbm5lbCBpZCwgc28gc3RvcCBwcm9jZXNzaW5nLg0KKwkJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjJcbiIpOw0KKwkJCURvdDExZF9SZXNldChkZXYpOw0KKwkJCXJldHVybjsgDQorCQl9DQorDQorCQlmb3IoaiA9IDAgOyBqIDwgcFRyaXBsZS0+TnVtQ2hubHM7IGorKykNCisJCXsNCisJCQlwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSAxOw0KKwkJCXBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSBwVHJpcGxlLT5NYXhUeFBvd2VySW5EYm07DQorCQkJTWF4Q2hubE51bSA9IHBUcmlwbGUtPkZpcnN0Q2hubCArIGo7DQorCQl9CQ0KKw0KKwkJcFRyaXBsZSA9IChQQ0hOTF9UWFBPV0VSX1RSSVBMRSkoKHU4KilwVHJpcGxlICsgMyk7DQorCX0NCisjaWYgMQ0KKwkvL3ByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBDaGFubmVsIExpc3Q6XG4iKTsNCisJcHJpbnRrKCJDaGFubmVsIExpc3Q6Iik7DQorCWZvcihpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykNCisJCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApDQorCQkJcHJpbnRrKCIgJWQiLCBpKTsNCisJcHJpbnRrKCJcbiIpOw0KKyNlbmRpZg0KKw0KKwlVUERBVEVfQ0lFX1NSQyhkZXYsIHBUYWRkcik7DQorDQorCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSBDb3V0cnlJZUxlbjsNCisJbWVtY3B5KHBEb3QxMWRJbmZvLT5Db3VudHJ5SWVCdWYsIHBDb3V0cnlJZSxDb3V0cnlJZUxlbik7DQorCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9MRUFSTkVEOw0KK30NCisNCit2b2lkIGR1bXBfY2hubF9tYXAodTggKiBjaGFubmVsX21hcCkNCit7DQorCWludCBpOw0KKwlwcmludGsoIkNoYW5uZWwgTGlzdDoiKTsNCisJZm9yKGk9MTsgaTw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQ0KKwkJaWYoY2hhbm5lbF9tYXBbaV0gPiAwKQ0KKwkJCXByaW50aygiICVkKCVkKSIsIGksIGNoYW5uZWxfbWFwW2ldKTsNCisJcHJpbnRrKCJcbiIpOw0KK30NCisNCit1OA0KK0RPVDExRF9HZXRNYXhUeFB3ckluRGJtKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LA0KKwl1OCBDaGFubmVsDQorCSkNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOw0KKwl1OCBNYXhUeFB3ckluRGJtID0gMjU1Ow0KKw0KKwlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBDaGFubmVsKQ0KKwl7IA0KKwkJcHJpbnRrKCJET1QxMURfR2V0TWF4VHhQd3JJbkRibSgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOw0KKwkJcmV0dXJuIE1heFR4UHdySW5EYm07IA0KKwl9DQorCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtDaGFubmVsXSkNCisJew0KKwkJTWF4VHhQd3JJbkRibSA9IHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbQ2hhbm5lbF07CQ0KKwl9DQorDQorCXJldHVybiBNYXhUeFB3ckluRGJtOw0KK30NCisNCisNCit2b2lkDQorRE9UMTFEX1NjYW5Db21wbGV0ZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYNCisJKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7DQorDQorCXN3aXRjaChwRG90MTFkSW5mby0+U3RhdGUpDQorCXsNCisJY2FzZSBET1QxMURfU1RBVEVfTEVBUk5FRDoNCisJCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9ET05FOw0KKwkJYnJlYWs7DQorDQorCWNhc2UgRE9UMTFEX1NUQVRFX0RPTkU6DQorCQlpZiggR0VUX0NJRV9XQVRDSERPRyhkZXYpID09IDAgKQ0KKwkJeyAvLyBSZXNldCBjb3VudHJ5IElFIGlmIHByZXZpb3VzIG9uZSBpcyBnb25lLiANCisJCQlEb3QxMWRfUmVzZXQoZGV2KTsgDQorCQl9DQorCQlicmVhazsNCisJY2FzZSBET1QxMURfU1RBVEVfTk9ORToNCisJCWJyZWFrOw0KKwl9DQorfQ0KKw0KK2ludCBJc0xlZ2FsQ2hhbm5lbCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsDQorCXU4IGNoYW5uZWwNCispDQorew0KKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsNCisNCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkNCisJeyANCisJCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsNCisJCXJldHVybiAwOyANCisJfQ0KKwlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQ0KKwkJcmV0dXJuIDE7DQorCXJldHVybiAwOw0KK30NCisNCitpbnQgVG9MZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7DQorCXU4IGRlZmF1bHRfY2huID0gMDsNCisJdTMyIGkgPSAwOw0KKw0KKwlmb3IgKGk9MTsgaTw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQ0KKwl7DQorCQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQ0KKwkJew0KKwkJCWRlZmF1bHRfY2huID0gaTsNCisJCQlicmVhazsNCisJCX0NCisJfQ0KKw0KKwlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKQ0KKwl7IA0KKwkJcHJpbnRrKCJJc0xlZ2FsQ2hhbm5lbCgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOw0KKwkJcmV0dXJuIGRlZmF1bHRfY2huOyANCisJfQ0KKwkNCisJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkNCisJCXJldHVybiBjaGFubmVsOw0KKwkNCisJcmV0dXJuIGRlZmF1bHRfY2huOw0KK30NCisNCisjaWYgMA0KK0VYUE9SVF9TWU1CT0woRG90MTFkX0luaXQpOw0KK0VYUE9SVF9TWU1CT0woRG90MTFkX1Jlc2V0KTsNCitFWFBPUlRfU1lNQk9MKERvdDExZF9VcGRhdGVDb3VudHJ5SWUpOw0KK0VYUE9SVF9TWU1CT0woRE9UMTFEX0dldE1heFR4UHdySW5EYm0pOw0KK0VYUE9SVF9TWU1CT0woRE9UMTFEX1NjYW5Db21wbGV0ZSk7DQorRVhQT1JUX1NZTUJPTChJc0xlZ2FsQ2hhbm5lbCk7DQorRVhQT1JUX1NZTUJPTChUb0xlZ2FsQ2hhbm5lbCk7DQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGJjZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgX19JTkNfRE9UMTFEX0gNCisjZGVmaW5lIF9fSU5DX0RPVDExRF9IDQorDQorI2luY2x1ZGUgImllZWU4MDIxMS5oIg0KKw0KKy8vI2RlZmluZSBFTkFCTEVfRE9UMTFEDQorDQorLy8jZGVmaW5lIERPVDExRF9NQVhfQ0hOTF9OVU0gODMNCisNCit0eXBlZGVmIHN0cnVjdCBfQ0hOTF9UWFBPV0VSX1RSSVBMRSB7DQorCXU4IEZpcnN0Q2hubDsNCisJdTggIE51bUNobmxzOw0KKwl1OCAgTWF4VHhQb3dlckluRGJtOw0KK31DSE5MX1RYUE9XRVJfVFJJUExFLCAqUENITkxfVFhQT1dFUl9UUklQTEU7DQorDQordHlwZWRlZiBlbnVtIF9ET1QxMURfU1RBVEUgew0KKwlET1QxMURfU1RBVEVfTk9ORSA9IDAsDQorCURPVDExRF9TVEFURV9MRUFSTkVELA0KKwlET1QxMURfU1RBVEVfRE9ORSwNCit9RE9UMTFEX1NUQVRFOw0KKw0KK3R5cGVkZWYgc3RydWN0IF9SVF9ET1QxMURfSU5GTyB7DQorCS8vREVDTEFSRV9SVF9PQkpFQ1QoUlRfRE9UMTFEX0lORk8pOw0KKw0KKwlib29sIGJFbmFibGVkOyAvLyBkb3QxMU11bHRpRG9tYWluQ2FwYWJpbGl0eUVuYWJsZWQNCisNCisJdTE2IENvdW50cnlJZUxlbjsgLy8gPiAwIGlmIENvdW50cnlJZUJ1ZltdIGNvbnRhaW5zIHZhbGlkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudC4NCisJdTggIENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsNCisJdTggIENvdW50cnlJZVNyY0FkZHJbNl07IC8vIFNvdXJjZSBBUCBvZiB0aGUgY291bnRyeSBJRS4NCisJdTggIENvdW50cnlJZVdhdGNoZG9nOyANCisNCisJdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsgIC8vISEhVmFsdWUgMDogSW52YWxpZCwgMTogVmFsaWQgKGFjdGl2ZSBzY2FuKSwgMjogVmFsaWQgKHBhc3NpdmUgc2NhbikNCisJLy91OCAgQ2hubExpc3RMZW47IC8vICNCeXRlcyB2YWxpZCBpbiBDaG5sTGlzdFtdLg0KKwkvL3U4ICBDaG5sTGlzdFtET1QxMURfTUFYX0NITkxfTlVNXTsNCisJdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07DQorDQorCURPVDExRF9TVEFURSBTdGF0ZTsNCit9UlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87DQorI2RlZmluZSBlcU1hY0FkZHIoYSxiKQkJKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkNCisjZGVmaW5lIGNwTWFjQWRkcihkZXMsc3JjKQkgICAgICAoKGRlcylbMF09KHNyYylbMF0sKGRlcylbMV09KHNyYylbMV0sKGRlcylbMl09KHNyYylbMl0sKGRlcylbM109KHNyYylbM10sKGRlcylbNF09KHNyYylbNF0sKGRlcylbNV09KHNyYylbNV0pDQorI2RlZmluZSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldikgKChQUlRfRE9UMTFEX0lORk8pKChfX3BJZWVlRGV2KS0+cERvdDExZEluZm8pKQ0KKw0KKyNkZWZpbmUgSVNfRE9UMTFEX0VOQUJMRShfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPmJFbmFibGVkDQorI2RlZmluZSBJU19DT1VOVFJZX0lFX1ZBTElEKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbiA+IDApDQorDQorI2RlZmluZSBJU19FUVVBTF9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBlcU1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkgDQorI2RlZmluZSBVUERBVEVfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgY3BNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpDQorDQorI2RlZmluZSBJU19DT1VOVFJZX0lFX0NIQU5HRUQoX19wSWVlZURldiwgX19JZSkgXA0KKwkoKChfX0llKS5MZW5ndGggPT0gMCB8fCAoX19JZSkuTGVuZ3RoICE9IEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuKSA/IFwNCisJRkFMU0UgOiBcDQorCSghbWVtY21wKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllQnVmLCAoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkNCisNCisjZGVmaW5lIENJRV9XQVRDSERPR19USCAxDQorI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cNCisjZGVmaW5lIFJFU0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpID0gMCANCisjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpDQorDQorI2RlZmluZSBJU19ET1QxMURfU1RBVEVfRE9ORShfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5TdGF0ZSA9PSBET1QxMURfU1RBVEVfRE9ORSkNCisNCisNCit2b2lkDQorRG90MTFkX0luaXQoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYNCisJKTsNCisNCit2b2lkDQorRG90MTFkX1Jlc2V0KA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2DQorCSk7DQorDQordm9pZA0KK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsDQorCXU4ICoJCXBUYWRkciwNCisJdTE2CUNvdXRyeUllTGVuLA0KKwl1OCAqIHBDb3V0cnlJZQkgDQorCSk7DQorDQordTgNCitET1QxMURfR2V0TWF4VHhQd3JJbkRibSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggQ2hhbm5lbA0KKwkpOw0KKw0KK3ZvaWQNCitET1QxMURfU2NhbkNvbXBsZXRlKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldg0KKwkpOw0KKw0KK2ludCBJc0xlZ2FsQ2hhbm5lbCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsDQorCXU4IGNoYW5uZWwNCispOw0KKw0KK2ludCBUb0xlZ2FsQ2hhbm5lbCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsDQorCXU4IGNoYW5uZWwNCispOw0KKw0KK3ZvaWQgZHVtcF9jaG5sX21hcCh1OCAqIGNoYW5uZWxfbWFwKTsNCisjZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19ET1QxMURfSA0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwNmFiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsMTc1NSBAQAorLyoKKyAqIE1lcmdlZCB3aXRoIG1haW5saW5lIGllZWU4MDIxMS5oIGluIEF1ZyAyMDA0LiAgT3JpZ2luYWwgaWVlZTgwMl8xMQorICogcmVtYWlucyBjb3B5cmlnaHQgYnkgdGhlIG9yaWdpbmFsIGF1dGhvcnMKKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgbWVyZ2VkIGNvZGUgYXJlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzCisgKiBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIgZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBNb2RpZmllZCBmb3IgUmVhbHRlaydzIHdpLWZpIGNhcmRzIGJ5IEFuZHJlYSBNZXJlbGxvCisgKiA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfSAorI2RlZmluZSBJRUVFODAyMTFfSAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+IC8qIEVUSF9BTEVOICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgLyogQVJSQVlfU0laRSAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTMpKQorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjZW5kaWYKKworLyoKKyNpZm5kZWYgYm9vbAorI2RlZmluZSBib29sIGludAorI2VuZGlmCisKKyNpZm5kZWYgdHJ1ZQorI2RlZmluZSB0cnVlICAgMQorI2VuZGlmCisKKyNpZm5kZWYgZmFsc2UKKyNkZWZpbmUgZmFsc2UgIDAKKyNlbmRpZgorKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKKyNpZm5kZWYgYm9vbAordHlwZWRlZiBlbnVte2ZhbHNlID0gMCwgdHJ1ZX0gYm9vbDsKKyNlbmRpZgorI2VuZGlmCisvLyNpZmRlZiBKT0hOX0hXU0VDCisjZGVmaW5lIEtFWV9UWVBFX05BCQkweDAKKyNkZWZpbmUgS0VZX1RZUEVfV0VQNDAgCQkweDEKKyNkZWZpbmUgS0VZX1RZUEVfVEtJUAkJMHgyCisjZGVmaW5lIEtFWV9UWVBFX0NDTVAJCTB4NAorI2RlZmluZSBLRVlfVFlQRV9XRVAxMDQJCTB4NQorLy8jZW5kaWYKKworCisjZGVmaW5lIGFTaWZzVGltZQkJCQkJMTAKKworI2RlZmluZSBNR01UX1FVRVVFX05VTSA1CisKKworI2RlZmluZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNCQkJMQorI2RlZmluZQlJRUVFX0NNRF9TRVRfV1BBX0lFCQkJMgorI2RlZmluZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTgkJCTMKKyNkZWZpbmUgSUVFRV9DTURfTUxNRQkJCQk0CisKKyNkZWZpbmUgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRAkJCTEKKyNkZWZpbmUgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkJMgorI2RlZmluZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQJCTMKKyNkZWZpbmUgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQJCTQKKyNkZWZpbmUgSUVFRV9QQVJBTV9BVVRIX0FMR1MJCQk1CisjZGVmaW5lIElFRUVfUEFSQU1fSUVFRV84MDJfMVgJCQk2CisvL0l0IHNob3VsZCBjb25zaXN0ZW50IHdpdGggdGhlIGRyaXZlcl9YWFguYworLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1QJCQk3CisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BST1RPX1dQQQkJCQkxCisjZGVmaW5lIElFRUVfUFJPVE9fUlNOCQkJCTIKKy8vQWRkZWQgZm9yIG5vdGlmeSB0aGUgZW5jcnlwdGlvbiB0eXBlIHNlbGVjdGlvbgorLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfV1BBWF9VU0VHUk9VUAkJCTAKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDQwCQkJCTEKKyNkZWZpbmUgSUVFRV9XUEFYX1RLSVAJCQkJMgorI2RlZmluZSBJRUVFX1dQQVhfV1JBUCAgIAkJCTMKKyNkZWZpbmUgSUVFRV9XUEFYX0NDTVAJCQkJNAorI2RlZmluZSBJRUVFX1dQQVhfV0VQMTA0CQkJNQorCisjZGVmaW5lIElFRUVfS0VZX01HTVRfSUVFRTgwMjFYCQkJMQorI2RlZmluZSBJRUVFX0tFWV9NR01UX1BTSwkJCTIKKworCisKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ERUFVVEgJCQkxCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfRElTQVNTT0MJCQkyCisKKworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRwkJMgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FERFIJCTMKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQJCTQKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQJCTUKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVFhfS0VZX1NFVF9GQUlMRUQJCTYKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRAkJNworCisKKyNkZWZpbmUJSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4JCQkxNgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkpCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfc2NhbiBpZWVlODAyMTFfd3hfZ2V0X3NjYW5fcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9ydGwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBhZGRlZCBmb3Iga2VybmVsIGNvbmZsaWN0IHVuZGVyIEZDNQorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X25hbWUgICBpZWVlODAyMTFfd3hfZ2V0X25hbWVfcnRsCisjZGVmaW5lIGZyZWVfaWVlZTgwMjExICAgICAgICAgIGZyZWVfaWVlZTgwMjExX3J0bAorI2RlZmluZSBhbGxvY19pZWVlODAyMTEgICAgICAgIGFsbG9jX2llZWU4MDIxMV9ydGwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNlbmRpZgorLy9lcnJvciBpbiB1YnVudHUyLjYuMjIsc28gYWRkIHRoZXNlCisjZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlIGllZWU4MDIxMV93YWtlX3F1ZXVlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9xdWV1ZSBpZWVlODAyMTFfc3RvcF9xdWV1ZV9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfcnggaWVlZTgwMjExX3J4X3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzCWllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcwlpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcglpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdAlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXRfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3R4Yl9mcmVlCWllZWU4MDIxMV90eGJfZnJlZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lc3NpZAlpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkCWllZWU4MDIxMV93eF9zZXRfZXNzaWRfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF0ZQlpZWVlODAyMTFfd3hfc2V0X3JhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcmF0ZQlpZWVlODAyMTFfd3hfZ2V0X3JhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfd2FwCWllZWU4MDIxMV93eF9zZXRfd2FwX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3dhcAlpZWVlODAyMTFfd3hfZ2V0X3dhcF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9tb2RlCWllZWU4MDIxMV93eF9zZXRfbW9kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9tb2RlCWllZWU4MDIxMV93eF9nZXRfbW9kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9zY2FuCWllZWU4MDIxMV93eF9zZXRfc2Nhbl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9mcmVxCWllZWU4MDIxMV93eF9nZXRfZnJlcV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9mcmVxCWllZWU4MDIxMV93eF9zZXRfZnJlcV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXd0eAlpZWVlODAyMTFfd3hfc2V0X3Jhd3R4X3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyCWllZWU4MDIxMV93eF9zZXRfcG93ZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcG93ZXIJaWVlZTgwMjExX3d4X2dldF9wb3dlcl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMJaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbAlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbF9ydGwKKyNkZWZpbmUJaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2F1dGggaWVlZTgwMjExX3d4X3NldF9hdXRoX3J0bAorLy9ieSBhbXkgZm9yIHBzCisjZGVmaW5lIG5vdGlmeV93eF9hc3NvY19ldmVudCAgbm90aWZ5X3d4X2Fzc29jX2V2ZW50X3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zX3J0bAorI2RlZmluZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlIGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zdGFydF9zY2FuIGllZWU4MDIxMV9zdGFydF9zY2FuX3J0bAorLy9ieSBhbXkgZm9yIHBzCit0eXBlZGVmIHN0cnVjdCBpZWVlX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKyAgICAgICAgdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggbmFtZTsKKwkJCXUzMiB2YWx1ZTsKKwkJfSB3cGFfcGFyYW07CisJCXN0cnVjdCB7CisJCQl1MzIgbGVuOworCQkJdTggcmVzZXJ2ZWRbMzJdOworCQkJdTggZGF0YVswXTsKKwkJfSB3cGFfaWU7CisJICAgICAgICBzdHJ1Y3R7CisJCQlpbnQgY29tbWFuZDsKKyAgICAJCQlpbnQgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IGFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1OCBzZXRfdHg7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbMF07CisJCX0gY3J5cHQ7CisKKwl9IHU7Cit9aWVlZV9wYXJhbTsKKworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX0lOVkFMSUQgICAweDEwCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfSU5WQUxJRCAgMHgyMAorI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQgIDB4NDAKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQgICAweDEKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVEICAweDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVEICAweDQKKyNlbmRpZgorCisvLyBsaW51eCB1bmRlciAyLjYuOSByZWxlYXNlIG1heSBub3Qgc3VwcG9ydCBpdCwgc28gbW9kaWZ5IGl0IGZvciBjb21tb24gdXNlCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw5KSkKKyNkZWZpbmUgTVNFQ1ModCkJKDEwMDAgKiAoKHQpIC8gSFopICsgMTAwMCAqICgodCkgJSBIWikgLyBIWikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwodW5zaWduZWQgaW50IG1zZWNzKQoreworICAgICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gTVNFQ1MobXNlY3MpICsgMTsKKworICAgICAgICAgd2hpbGUgKHRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiB0aW1lb3V0OworfQorI2Vsc2UKKyNkZWZpbmUgTVNFQ1ModCkgbXNlY3NfdG9famlmZmllcyh0KQorI2RlZmluZSBtc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlCisjZW5kaWYKKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9MRU4JCTIzMDQKKy8qIE1heGltdW0gc2l6ZSBmb3IgdGhlIE1BLVVOSVREQVRBIHByaW1pdGl2ZSwgODAyLjExIHN0YW5kYXJkIHNlY3Rpb24KKyAgIDYuMi4xLjEuMi4KKworICAgVGhlIGZpZ3VyZSBpbiBzZWN0aW9uIDcuMS4yIHN1Z2dlc3RzIGEgYm9keSBzaXplIG9mIHVwIHRvIDIzMTIKKyAgIGJ5dGVzIGlzIGFsbG93ZWQsIHdoaWNoIGlzIGEgYml0IGNvbmZ1c2luZywgSSBzdXNwZWN0IHRoaXMKKyAgIHJlcHJlc2VudHMgdGhlIDIzMDQgYnl0ZXMgb2YgcmVhbCBkYXRhLCBwbHVzIGEgcG9zc2libGUgOCBieXRlcyBvZgorICAgV0VQIElWIGFuZCBJQ1YuICh0aGlzIGludGVycHJldGF0aW9uIHN1Z2dlc3RlZCBieSBSYW1pcm8gQmFycmVpcm8pICovCisKKworI2RlZmluZSBJRUVFODAyMTFfSExFTgkJCTMwCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4JCShJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKKworLyogdGhpcyBpcyBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIG1hZHdpZmkgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sJCTB4MGMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEJCTB4MDgKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0sJMHhCMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TCTB4ODAKKworI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpIFwKKwkoKChmYykgJiAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykpID09IFwKKwkgKElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykpCisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KKyNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKK3N0cnVjdCBpZWVlX2lic3Nfc2VxIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBzZXFfbnVtWzE3XTsKKwl1MTYgZnJhZ19udW1bMTddOworCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWVbMTddOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07CisJdTE2IFFPU19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTE2IFFPU19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSBlYXBfdHlwZSB7CisJRUFQX1BBQ0tFVCA9IDAsCisJRUFQT0xfU1RBUlQsCisJRUFQT0xfTE9HT0ZGLAorCUVBUE9MX0tFWSwKKwlFQVBPTF9FTkNBUF9BU0ZfQUxFUlQKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICplYXBfdHlwZXNbXSA9IHsKKwlbRUFQX1BBQ0tFVF0JCT0gIkVBUC1QYWNrZXQiLAorCVtFQVBPTF9TVEFSVF0JCT0gIkVBUE9MLVN0YXJ0IiwKKwlbRUFQT0xfTE9HT0ZGXQkJPSAiRUFQT0wtTG9nb2ZmIiwKKwlbRUFQT0xfS0VZXQkJPSAiRUFQT0wtS2V5IiwKKwlbRUFQT0xfRU5DQVBfQVNGX0FMRVJUXQk9ICJFQVBPTC1FbmNhcC1BU0YtQWxlcnQiCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVhcF9nZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPj0gQVJSQVlfU0laRShlYXBfdHlwZXMpKSA/ICJVbmtub3duIiA6IGVhcF90eXBlc1t0eXBlXTsKK30KKworc3RydWN0IGVhcG9sIHsKKwl1OCBzbmFwWzZdOworCXUxNiBldGhlcnR5cGU7CisJdTggdmVyc2lvbjsKKwl1OCB0eXBlOworCXUxNiBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBJRUVFODAyMTFfM0FERFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV80QUREUl9MRU4gMzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDU19MRU4gICAgNAorCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCisKKy8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMgorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GVFlQRQkJMHgwMDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1NUWVBFCQkweDAwZjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0RTVE9EUwkJMHgwMzAwIC8vYWRkZWQgYnkgZGF2aWQKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9SRVRSWQkJMHgwODAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1BNCQkweDEwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEJMHgyMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1dFUAkJMHg0MDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX09SREVSCQkweDgwMDAKKworI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfTUdNVAkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9DVEwJCTB4MDAwNAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfREFUQQkJMHgwMDA4CisKKy8qIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1AgCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OCQkweDAwODAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FUSU0JCTB4MDA5MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MJMHgwMEEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVVRICQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RFQVVUSAkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUCTB4MDBEMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisKKy8qIGRhdGEgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEEJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSwkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQwkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLCQkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGUE9MTAkJMHgwMDYwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDS1BPTEwJMHgwMDcwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQQkweDAwODAgLy9hZGRlZCBmb3IgV01NIDIwMDYvOC8yCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9RT1NfTlVMTAkweDAwQzAKKworCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX0ZSQUcJCTB4MDAwRgorI2RlZmluZSBJRUVFODAyMTFfU0NUTF9TRVEJCTB4RkZGMAorCisKKy8qIGRlYnVnIG1hY3JvcyAqLworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworZXh0ZXJuIHUzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWw7CisjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCitkbyB7IGlmIChpZWVlODAyMTFfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSBcCisgIHByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVjICVzICIgZm10LCBcCisgICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19GVU5DVElPTl9fICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYJLyogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLworCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19JTkZPKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19XWChmLCBhLi4uKSAgICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NDQU4oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NDQU4sIGYsICMjIGEpCisvLyNkZWZpbmUgSUVFRV9ERUJVR19TQ0FOICBJRUVFODAyMTFfV0FSTklORworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPiAvKiBBUlBIUkRfRVRIRVIgKi8KKworI2lmbmRlZiBXSVJFTEVTU19TUFkKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gbmV3IGRyaXZlciBBUEkKKworI2lmbmRlZiBFVEhfUF9QQUUKKyNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2VuZGlmIC8qIEVUSF9QX1BBRSAqLworCisjZGVmaW5lIEVUSF9QX1BSRUFVVEggMHg4OEM3IC8qIElFRUUgODAyLjExaSBwcmUtYXV0aGVudGljYXRpb24gKi8KKworI2lmbmRlZiBFVEhfUF84MDIxMV9SQVcKKyNkZWZpbmUgRVRIX1BfODAyMTFfUkFXIChFVEhfUF9FQ09ORVQgKyAxKQorI2VuZGlmCisKKy8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KKworI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCisKK3N0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgeworCisgICAgICAgIHU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKyAgICAgICAgdTggICAgc3NhcDsgICAvKiBhbHdheXMgMHhBQSAqLworICAgICAgICB1OCAgICBjdHJsOyAgIC8qIGFsd2F5cyAweDAzICovCisgICAgICAgIHU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19HRVRfU1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpCisKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSQUcoc2VxKSAoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9GUkFHKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRKHNlcSkgICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKworI2RlZmluZSBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTiAxMjgKKworI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQlNTICgxPDwwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfSUJTUyAoMTw8MSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExBQkxFICgxPDwyKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTF9SRVFVRVNUICgxPDwzKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSAoMTw8NCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFICgxPDw1KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUEJDQyAoMTw8NikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NIQU5ORUxfQUdJTElUWSAoMTw8NykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorCisvKiBTdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9TVEFUVVNfU1VDQ0VTUyAwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgMQorI2RlZmluZSBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEIDEwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgMTEKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQyAxMgorI2RlZmluZSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHIDEzCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiAxNAorI2RlZmluZSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTCAxNQorI2RlZmluZSBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgMTYKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBIDE3CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyAxOAorLyogODAyLjExYiAqLworI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVCAxOQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDIDIwCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT0FHSUxJVFkgMjEKKworLyogUmVhc29uIGNvZGVzICovCisjZGVmaW5lIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEIDEKKyNkZWZpbmUgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCAyCisjZGVmaW5lIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HIDMKKyNkZWZpbmUgV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkgNAorI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZIDUKKyNkZWZpbmUgV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgNgorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEgNworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQgOAorI2RlZmluZSBXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA5CisKKworLyogSW5mb3JtYXRpb24gRWxlbWVudCBJRHMgKi8KKyNkZWZpbmUgV0xBTl9FSURfU1NJRCAwCisjZGVmaW5lIFdMQU5fRUlEX1NVUFBfUkFURVMgMQorI2RlZmluZSBXTEFOX0VJRF9GSF9QQVJBTVMgMgorI2RlZmluZSBXTEFOX0VJRF9EU19QQVJBTVMgMworI2RlZmluZSBXTEFOX0VJRF9DRl9QQVJBTVMgNAorI2RlZmluZSBXTEFOX0VJRF9USU0gNQorI2RlZmluZSBXTEFOX0VJRF9JQlNTX1BBUkFNUyA2CisjZGVmaW5lIFdMQU5fRUlEX0NIQUxMRU5HRSAxNgorI2RlZmluZSBXTEFOX0VJRF9SU04gNDgKKyNkZWZpbmUgV0xBTl9FSURfR0VORVJJQyAyMjEKKworI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSAoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX05PSVNFICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUkFURSAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1dFTUFTSyAweDcKKworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkgICAgICAgIDB4MDIKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQgkJICAgICAgICAweDA0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCSAgICAgICAgMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJICAgICAgICAweDE2CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfTEVOIAkJOAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAorI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWVbMl07CisJdTggc2lnbmFsc3RyZW5ndGg7CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworCXU4IG5pY190eXBlOworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHN7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX2VycjsKKwl1bnNpZ25lZCBpbnQgcnhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JzOworCXVuc2lnbmVkIGludCB0eF9iZWFjb25zOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JxOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX29rOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX2VycjsKKwl1bnNpZ25lZCBpbnQgdHhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgbm9fYXV0aF9yczsKKwl1bnNpZ25lZCBpbnQgbm9fYXNzX3JzOworCXVuc2lnbmVkIGludCB0eF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHJlYXNzb2M7CisJdW5zaWduZWQgaW50IHN3dHhzdG9wOworCXVuc2lnbmVkIGludCBzd3R4YXdha2U7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgorCisjZGVmaW5lIFNFQ19LRVlfMSAgICAgICAgICgxPDwwKQorI2RlZmluZSBTRUNfS0VZXzIgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgU0VDX0tFWV8zICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFNFQ19LRVlfNCAgICAgICAgICgxPDwzKQorI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKKyNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCisjZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQorI2RlZmluZSBTRUNfTEVWRUwgICAgICAgICAoMTw8NykKKyNkZWZpbmUgU0VDX0VOQUJMRUQgICAgICAgKDE8PDgpCisKKyNkZWZpbmUgU0VDX0xFVkVMXzAgICAgICAwIC8qIE5vbmUgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzEgICAgICAxIC8qIFdFUCA0MCBhbmQgMTA0IGJpdCAqLworI2RlZmluZSBTRUNfTEVWRUxfMiAgICAgIDIgLyogTGV2ZWwgMSArIFRLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzJfQ0tJUCAzIC8qIExldmVsIDEgKyBDS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8zICAgICAgNCAvKiBMZXZlbCAyICsgQ0NNUCAqLworCisjZGVmaW5lIFdFUF9LRVlTIDQKKyNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKKworI2RlZmluZSBXRVBfS0VZX0xFTl9NT0RJRiAzMgorCitzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKKwl1MTYgYWN0aXZlX2tleToyLAorICAgICAgICAgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKyAgICAgICAgICAgIGF1dGhfYWxnbzo0LAorICAgICAgICAgICAgdW5pY2FzdF91c2VzX2dyb3VwOjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtXRVBfS0VZX0xFTl9NT0RJRl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKworIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKKworICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCitUb3RhbDogMjgtMjM0MCBieXRlcworCisqLworCitzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVs2XTsKKwl1OCBhZGRyMls2XTsKKwl1OCBhZGRyM1s2XTsKKwl1MTYgc2VxX2N0cmw7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKKy8qIE1hbmFnZW1lbnQgRnJhbWUgSW5mb3JtYXRpb24gRWxlbWVudCBUeXBlcyAqLworI2RlZmluZSBNRklFX1RZUEVfU1NJRCAgICAgICAwCisjZGVmaW5lIE1GSUVfVFlQRV9SQVRFUyAgICAgIDEKKyNkZWZpbmUgTUZJRV9UWVBFX0ZIX1NFVCAgICAgMgorI2RlZmluZSBNRklFX1RZUEVfRFNfU0VUICAgICAzCisjZGVmaW5lIE1GSUVfVFlQRV9DRl9TRVQgICAgIDQKKyNkZWZpbmUgTUZJRV9UWVBFX1RJTSAgICAgICAgNQorI2RlZmluZSBNRklFX1RZUEVfSUJTU19TRVQgICA2CisjZGVmaW5lIE1GSUVfVFlQRV9DT1VOVFJZICA3IC8vK1lKLDA4MDYyNQorI2RlZmluZSBNRklFX1RZUEVfQ0hBTExFTkdFICAxNgorI2RlZmluZSBNRklFX1RZUEVfRVJQICAgICAgICA0MgorI2RlZmluZSBNRklFX1RZUEVfUlNOCSAgICAgNDgKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTX0VYICAgNTAKKyNkZWZpbmUgTUZJRV9UWVBFX0dFTkVSSUMgICAgMjIxCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECit0eXBlZGVmIGVudW0KK3sKKwlDT1VOVFJZX0NPREVfRkNDID0gMCwKKwlDT1VOVFJZX0NPREVfSUMgPSAxLAorCUNPVU5UUllfQ09ERV9FVFNJID0gMiwKKwlDT1VOVFJZX0NPREVfU1BBSU4gPSAzLAorCUNPVU5UUllfQ09ERV9GUkFOQ0UgPSA0LAorCUNPVU5UUllfQ09ERV9NS0sgPSA1LAorCUNPVU5UUllfQ09ERV9NS0sxID0gNiwKKwlDT1VOVFJZX0NPREVfSVNSQUVMID0gNywKKwlDT1VOVFJZX0NPREVfVEVMRUMgPSA4LAorCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOID0gOSwKKwlDT1VOVFJZX0NPREVfV09STERfV0lERV8xM19JTkRFWCA9IDEwCit9Y291bnRyeV9jb2RlX3R5cGVfdDsKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgeworCXU4IGlkOworCXU4IGxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEICJQZW5ndWluIgorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFIDEwCisKK3N0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24geworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCXUxNiBhbGdvcml0aG07CisJdTE2IHRyYW5zYWN0aW9uOworCXUxNiBzdGF0dXM7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwkvKnN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJLy91OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgc3RhdHVzOworCXUxNiBhaWQ7CisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1leworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisgICAgICAgIHUxNiAgICByZWFzb25jb2RlOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV90eGIgeworCXU4IG5yX2ZyYWdzOworCXU4IGVuY3J5cHRlZDsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTE2IGZyYWdfc2l6ZTsKKwl1MTYgcGF5bG9hZF9zaXplOworCXN0cnVjdCBza19idWZmICpmcmFnbWVudHNbMF07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7CisJdTggYWNfYWNpX2FjbV9haWZzbjsKKwl1OCBhY19lY3dtaW5fZWN3bWF4OworCXUxNiBhY190eG9wX2xpbWl0OworfTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB7CisJdTggYWNfZGlyX3RpZDsKKwl1OCBhY191cF9wc2I7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7CisJc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOworCXUxNiBub3JtX21zZHVfc2l6ZTsKKwl1MTYgbWF4X21zZHVfc2l6ZTsKKwl1MzIgbWluX3NlcnZfaW50ZXI7CisJdTMyIG1heF9zZXJ2X2ludGVyOworCXUzMiBpbmFjdF9pbnRlcjsKKwl1MzIgc3VzcGVuX2ludGVyOworCXUzMiBzZXJ2X3N0YXJ0X3RpbWU7CisJdTMyIG1pbl9kYXRhX3JhdGU7CisJdTMyIG1lYW5fZGF0YV9yYXRlOworCXUzMiBwZWFrX2RhdGFfcmF0ZTsKKwl1MzIgbWF4X2J1cnN0X3NpemU7CisJdTMyIGRlbGF5X2JvdW5kOworCXUzMiBtaW5fcGh5X3JhdGU7CisJdTE2IHN1cnBfYmFuZF9hbGxvdzsKKwl1MTYgbWVkaXVtX3RpbWU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0ge1dNTV9hbGxfZnJhbWUsIFdNTV90d29fZnJhbWUsIFdNTV9mb3VyX2ZyYW1lLCBXTU1fc2l4X2ZyYW1lfTsKKyNkZWZpbmUgTUFYX1NQX0xlbiAgKFdNTV9hbGxfZnJhbWUgPDwgNCkKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19USUQgMHgwZgorI2RlZmluZSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLICgweDAxIDw8IDUpCisKKy8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTCQkgIDQyCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFU19QRVJfUEFDS0VUICA3CisvKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKKyAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKKyAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQorICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCisjZGVmaW5lIE1BWF9SQVRFU19MRU5HVEggICAgICAgICAgICAgICAgICAoKHU4KTEyKQorI2RlZmluZSBNQVhfUkFURVNfRVhfTEVOR1RIICAgICAgICAgICAgICAgKCh1OCkxNikKKyNkZWZpbmUgTUFYX05FVFdPUktfQ09VTlQgICAgICAgICAgICAgICAgICAxMjgKKy8vI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2MQorI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2NSAvL1lKLG1vZGlmaWVkLDA4MDYyNQorI2RlZmluZSBNQVhfSUVfTEVOCQkJCQkJMHhGRiAvLytZSiwwODA2MjUKKwordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVHsKKwl1OAlDaGFubmVsW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOworCXU4CUxlbjsKK31DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOworCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgIDEwMC8vNDAwCisvLyhIWiAvIDIpCisvL2J5IGFteSBmb3IgcHMKKyNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKKy8vYnkgYW15IGZvciBwcworLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgQU5URU5OQV9ESVZFUlNJVFlfVElNRVJfUEVSSU9ECQkxMDAwIC8vIDEwMDAgbQorLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX01CQ0FTVCA0CisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1VDQVNUIDIKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVkFMSUQgMQorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9JTlZBTElEIDAKKworI2RlZmluZSBJRUVFODAyMTFfUFNfRElTQUJMRUQgMAorI2RlZmluZSBJRUVFODAyMTFfUFNfVU5JQ0FTVCBJRUVFODAyMTFfRFRJTV9VQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfTUJDQVNUIElFRUU4MDIxMV9EVElNX01CQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfRU5BQkxFICAgSUVFRTgwMjExX0RUSU1fVkFMSUQKKy8vYWRkZWQgYnkgRGF2aWQgZm9yIFFvUyAyMDA2LzYvMzAKKy8vI2RlZmluZSBXTU1fSGFuZ184MTg3CisjaWZkZWYgV01NX0hhbmdfODE4NworI3VuZGVmIFdNTV9IYW5nXzgxODcKKyNlbmRpZgorCisjZGVmaW5lIFdNRV9BQ19CRSAgIDB4MDAKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMQorI2RlZmluZSBXTUVfQUNfVkkgICAweDAyCisjZGVmaW5lIFdNRV9BQ19WTyAgIDB4MDMKKyNkZWZpbmUgV01FX0FDSV9NQVNLIDB4MDMKKyNkZWZpbmUgV01FX0FJRlNOX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUNfUFJBTV9MRU4gMTYKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCitzdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKKwl1OCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTggZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOworCXUxNiBldGhlcl90eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2lmbmRlZiBFVEhFUlRZUEVfUEFFCisjZGVmaW5lCUVUSEVSVFlQRV9QQUUJMHg4ODhlCQkvKiBFQVBPTCBQQUUvODAyLjF4ICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0lQCisjZGVmaW5lCUVUSEVSVFlQRV9JUAkweDA4MDAJCS8qIElQIHByb3RvY29sICovCisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIHsKKwkvKiBUaGVzZSBlbnRyaWVzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGEgdW5pcXVlIG5ldHdvcmsgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTggY2hhbm5lbDsKKwkvKiBFbnN1cmUgbnVsbC10ZXJtaW5hdGVkIGZvciBhbnkgZGVidWcgbXNncyAqLworCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwl1OCBzc2lkX2xlbjsKKworCS8qIFRoZXNlIGFyZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzOworCXUxNiBjYXBhYmlsaXR5OworCXU4IHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOworCXU4IHJhdGVzX2xlbjsKKwl1OCByYXRlc19leFtNQVhfUkFURVNfRVhfTEVOR1RIXTsKKwl1OCByYXRlc19leF9sZW47CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdTggbW9kZTsKKwl1OCBmbGFnczsKKwl1MzIgbGFzdF9hc3NvY2lhdGU7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXUxNiBhdGltX3dpbmRvdzsKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4IHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHJzbl9pZV9sZW47CisJdTggZHRpbV9wZXJpb2Q7CisJdTggZHRpbV9kYXRhOworCXUzMiBsYXN0X2R0aW1fc3RhX3RpbWVbMl07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8vYXBwZWRlZCBmb3IgUW9TCisJdTggd21tX2luZm87CisJc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gd21tX3BhcmFtWzRdOworCXU4IFFvU19FbmFibGU7CisJdTggU2lnbmFsU3RyZW5ndGg7CisvL2J5IGFteSAwODAzMTIKKwl1OCBIaWdoZXN0T3BlcmFSYXRlOworLy9ieSBhbXkgMDgwMzEyCisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdTggVHVyYm9fRW5hYmxlOy8vZW5hYmxlIHR1cmJvIG1vZGUsIGFkZGVkIGJ5IHRob21hcworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXUxNiBDb3VudHJ5SWVMZW47CisJdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworI2VuZGlmCit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCUlFRUU4MDIxMV9OT0xJTksgPSAwLAorCisJLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJSUVFRTgwMjExX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAorCit9OworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisjZGVmaW5lIE1BQ19GTVQgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorI2RlZmluZSBNQUNfQVJHKHgpICgodTgqKSh4KSlbMF0sKCh1OCopKHgpKVsxXSwoKHU4KikoeCkpWzJdLCgodTgqKSh4KSlbM10sKCh1OCopKHgpKVs0XSwoKHU4KikoeCkpWzVdCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDExKSkKK2V4dGVybiBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworICAgICAgICByZXR1cm4gKChhZGRyWzBdICE9IDB4ZmYpICYmICgweDAxICYgYWRkclswXSkpOworfQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCitleHRlcm4gaW5saW5lIGludCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihjb25zdCB1OCAqYWRkcikKK3sKKwlyZXR1cm4gKChhZGRyWzBdID09IDB4ZmYpICYmIChhZGRyWzFdID09IDB4ZmYpICYmIChhZGRyWzJdID09IDB4ZmYpICYmICAgXAorCQkoYWRkclszXSA9PSAweGZmKSAmJiAoYWRkcls0XSA9PSAweGZmKSAmJiAoYWRkcls1XSA9PSAweGZmKSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTICgxPDwwKQorI2RlZmluZSBDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTICgxPDwxKQorCit0eXBlZGVmIHN0cnVjdCB0eF9wZW5kaW5nX3R7CisJaW50IGZyYWc7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKK310eF9wZW5kaW5nX3Q7CisKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCB3cGF4X3N1aXRsaXN0X2xvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZGVjcnlwdDsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlpbnQgd3BhX2VuYWJsZWQ7CisJaW50IGRyb3BfdW5lbmNyeXB0ZWQ7CisJaW50IHRraXBfY291bnRlcm1lYXN1cmVzOworCWludCBwcml2YWN5X2ludm9rZWQ7CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggKndwYV9pZTsKKworCXU4IGFwX21hY19hZGRyWzZdOworCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKKwl1MTYgYnJvYWRjYXN0X2tleV90eXBlOworCisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisKKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJLy8gZWFjaCBzdHJlYW1pbmcgY29udGFpbiBhIGVudHJ5CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisKKwkvKiBUaGlzIHN0b3JlcyBpbmZvcyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yay4KKwkgKiBFaXRoZXIgdGhlIG5ldHdvcmsgd2UgYXJlIGFzc29jaWF0ZWQgaW4gSU5GUkFTVFJVQ1RVUkUKKwkgKiBvciB0aGUgbmV0d29yayB0aGF0IHdlIGFyZSBjcmVhdGluZyBpbiBNQVNURVIgbW9kZS4KKwkgKiBhZC1ob2MgaXMgYSBtaXh0dXJlIDstKS4KKwkgKiBOb3RlIHRoYXQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgZXZlbiB3aGVuIG5vdCBhc3NvY2lhdGVkLAorCSAqIGZpZWxkcyBic3NpZCBhbmQgZXNzaWQgbWF5IGJlIHZhbGlkIChpZiB3cGFfc2V0IGFuZCBlc3NpZF9zZXQKKwkgKiBhcmUgdHJ1ZSkgYXMgdGh5IGNhcnJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgdmlhIGl3Y29uZmlnCisJICovCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIGN1cnJlbnRfbmV0d29yazsKKworCisJZW51bSBpZWVlODAyMTFfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgbW9kZTsgICAgICAgLyogQSwgQiwgRyAqLworCWludCBtb2R1bGF0aW9uOyAvKiBDQ0ssIE9GRE0gKi8KKwlpbnQgZnJlcV9iYW5kOyAgLyogMi40R2h6LCA1LjJHaHosIE1peGVkICovCisJaW50IGFiZ190cnVlOyAgIC8qIEFCRyBmbGFnICAgICAgICAgICAgICAqLworCisJLyogdXNlZCBmb3IgZm9yY2luZyB0aGUgaWJzcyB3b3JrcXVldWUgdG8gdGVybWluYXRlCisJICogd2l0aG91dCB3YWl0IGZvciB0aGUgc3luY3JvIHNjYW4gdG8gdGVybWluYXRlCisJICovCisJc2hvcnQgc3luY19zY2FuX2h1cnJ5dXA7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdm9pZCAqIHBEb3QxMWRJbmZvOworCWJvb2wgYkdsb2JhbERvbWFpbjsKKworCS8vIEZvciBMaXRlb24gQ2gxMn4xMyBwYXNzaXZlIHNjYW4KKwl1OAlNaW5QYXNzaXZlQ2hubE51bTsKKwl1OAlJYnNzU3RhcnRDaG5sOworI2Vsc2UKKwkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLworCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQorCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisjZW5kaWYKKworCWludCByYXRlOyAgICAgICAvKiBjdXJyZW50IHJhdGUgKi8KKwlpbnQgYmFzaWNfcmF0ZTsKKwkvL0ZJWE1FOiBwbGVhY2UgY2FsbGJhY2ssIHNlZSBpZiByZWR1bmRhbnQgd2l0aCBzb2Z0bWFjX2ZlYXR1cmVzCisJc2hvcnQgYWN0aXZlX3NjYW47CisKKwkvKiB0aGlzIGNvbnRhaW5zIGZsYWdzIGZvciBzZWxlY3RpdmVseSBlbmFibGUgc29mdG1hYyBzdXBwb3J0ICovCisJdTE2IHNvZnRtYWNfZmVhdHVyZXM7CisKKwkvKiBpZiB0aGUgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpcyBub3QgZmlsbGVkIGJ5IEhXICovCisJdTE2IHNlcV9jdHJsWzVdOworCisJLyogYXNzb2NpYXRpb24gcHJvY2VkdXJlIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciAqLworCXUxNiBhc3NvY2lhdGVfc2VxOworCisJLyogQUlEIGZvciBSVFhlZCBhc3NvY2lhdGlvbiByZXNwb25zZXMgKi8KKwl1MTYgYXNzb2NfaWQ7CisKKwkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCovCisJc2hvcnQgcHM7CisJc2hvcnQgc3RhX3NsZWVwOworCWludCBwc190aW1lb3V0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXUzMiBwc190aDsKKwl1MzIgcHNfdGw7CisKKwlzaG9ydCByYXdfdHg7CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc2hvcnQgcXVldWVfc3RvcDsKKwlzaG9ydCBzY2FubmluZzsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKKworCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOworCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CisKKwlzaG9ydCBiZWFjb25fdHhpbmc7CisKKwlzaG9ydCB3YXBfc2V0OworCXNob3J0IHNzaWRfc2V0OworCisJdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9CisJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CisKKwkvKiBRb1MgcmVsYXRlZCBmbGFnICovCisJY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gSUJTUyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaWJzc19tYWNfaGFzaFtJRUVFX0lCU1NfTUFDX0hBU0hfU0laRV07CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gQlNTICovCisJdTE2IGxhc3RfcnhzZXFfbnVtWzE3XTsgLyogcnggc2VxIHByZXZpb3VzIHBlci10aWQgKi8KKwl1MTYgbGFzdF9yeGZyYWdfbnVtWzE3XTsvKiB0eCBmcmFnIHByZXZpb3VzIHBlci10aWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFja2V0X3RpbWVbMTddOworCisJLyogZm9yIFBTIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHNfdGltZTsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqbWdtdF9xdWV1ZV9yaW5nW01HTVRfUVVFVUVfTlVNXTsKKwlpbnQgbWdtdF9xdWV1ZV9oZWFkOworCWludCBtZ210X3F1ZXVlX3RhaWw7CisKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX2NvbXBsZXRlX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBzb2Z0bWFjX3NjYW5fd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHd4X3N5bmNfc2Nhbl93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd21tX3BhcmFtX3VwZGF0ZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHNfcmVxdWVzdF90eF9hY2tfd3E7Ly9mb3IgcHMKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBod193YWtldXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfc2xlZXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCWJvb2wgYkluYWN0aXZlUHM7CisJYm9vbCBhY3RzY2FubmluZzsKKwlib29sIGJlaW5yZXRyeTsKKwl1MTYgTGlzdGVuSW50ZXJ2YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeERhdGFJblBlcmlvZDsgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeEJjbkluUGVyaW9kOyAgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeE9rVG90YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeFVuaWNhc3Q7Ly9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJYm9vbCBiSHdSYWRpb09mZjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBhc3NvY2lhdGVfcmV0cnlfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod193YWtldXBfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod19zbGVlcF93cTsvLytieSBhbXkgMDgwMzI0CisJc3RydWN0IGRlbGF5ZWRfd29yayB3YXRjaF9kb2dfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzd19hbnRlbm5hX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgIHN0YXJ0X2lic3Nfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZSAwODAzMTIKKyAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IGRlbGF5ZWRfd29yayBod19kaWdfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0eF9wd193cTsKKworLy9BZGRlZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJc3RydWN0IGRlbGF5ZWRfd29yayBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbHNlCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhcnRfaWJzc193cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfd2FrZXVwX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBod19zbGVlcF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzd19hbnRlbm5hX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUgMDgwMzEyCisgICAgc3RydWN0IHdvcmtfc3RydWN0IHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IHdvcmtfc3RydWN0IGh3X2RpZ193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfcHdfd3E7CisKKy8vQWRkZWQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCXN0cnVjdCB3b3JrX3N0cnVjdCBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbmRpZgorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKworCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXZvaWQgKCpzZXRfc2VjdXJpdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKnNlYyk7CisKKwkvKiBVc2VkIHRvIFRYIGRhdGEgZnJhbWUgYnkgdXNpbmcgdHhiIHN0cnVjdHMuCisJICogdGhpcyBpcyBub3QgdXNlZCBpZiBpbiB0aGUgc29mdG1hY19mZWF0dXJlcworCSAqIGlzIHNldCB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfVFhfUVVFVUUKKwkgKi8KKwlpbnQgKCpoYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIFNvZnRtYWMtZ2VuZXJhdGVkIGZyYW1lcyAobWFtYWdlbWVudCkgYXJlIFRYZWQgdmlhIHRoaXMKKwkgKiBjYWxsYmFjayBpZiB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzCisJICogbm90IHNldC4gQXMgc29tZSBjYXJkcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSFcgcXVldWVzIHRoYXQKKwkgKiBvbmUgbWlnaHQgd2FudCB0byB1c2UgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQgZnJhbWVzCisJICogdGhlIG9wdGlvbiB0byBoYXZlIHR3byBjYWxsYmFja3MgbWlnaHQgYmUgdXNlZnVsLgorCSAqIFRoaXMgZnVjbnRpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJaW50ICgqc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB1c2VkIGluc3RlYWQgb2YgaGFyZF9zdGFydF94bWl0IChub3Qgc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpCisJICogaWYgdGhlIElFRUVfU09GVE1BQ19UWF9RVUVVRSBmZWF0dXJlIGlzIHVzZWQgdG8gVFggZGF0YQorCSAqIGZyYW1lcy4gSSB0aGUgb3B0aW9uIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgYWxzbyBzZXQKKwkgKiB0aGVuIGFsc28gbWFuYWdlbWVudCBmcmFtZXMgYXJlIHNlbnQgdmlhIHRoaXMgY2FsbGJhY2suCisJICogVGhpcyBmdW5jdGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCByYXRlKTsKKworCS8qIHN0b3BzIHRoZSBIVyBxdWV1ZSBmb3IgREFUQSBmcmFtZXMuIFVzZWZ1bCB0byBhdm9pZAorCSAqIHdhc3RlIHRpbWUgdG8gVFggZGF0YSBmcmFtZSB3aGVuIHdlIGFyZSByZWFzc29jaWF0aW5nCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisJICovCisJdm9pZCAoKmRhdGFfaGFyZF9zdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIE9LIHRoaXMgaXMgY29tcGxlbWVudGFyIHRvIGRhdGFfcG9sbF9oYXJkX3N0b3AgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3Jlc3VtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvIC4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4gdGhlIGRyaXZlciBzaG91bGQgZW5zdXJlCisJICogdGhlIHJhZGlvIGhhcyBiZWVuIHN3aXRoY2VkIGJlZm9yZSByZXR1cm4uCisJICovCisJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKworCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCisJICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KKwkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KKwkgKgorCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAorCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KKwkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKKwkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCisJICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAorCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCisJICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCisJICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgorCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAorCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCisJICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgorCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAorCSAqLworCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0CisJICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKKwkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQorCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKKwkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCisJICovCisJdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdG9wX3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KKwl2b2lkICgqc3RhX3dha2VfdXApIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcHNfcmVxdWVzdF90eF9hY2spIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqZW50ZXJfc2xlZXBfc3RhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGgsIHUzMiB0bCk7CisJc2hvcnQgKCpwc19pc19xdWV1ZV9lbXB0eSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogUW9TIHJlbGF0ZWQgKi8KKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmFjX3BhcmFtKTsKKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGRhdGEKKwkgKiBhbGxvY2F0ZWQgYmV5b25kIHRoaXMgc3RydWN0dXJlIGJ5IGFsbG9jX2llZWU4MDIxMSAqLworCXU4IHByaXZbMF07Cit9OworCisjZGVmaW5lIElFRUVfQSAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFX0IgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRV9HICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIElFRUVfTU9ERV9NQVNLICAgIChJRUVFX0F8SUVFRV9CfElFRUVfRykKKworLyogR2VuZXJhdGUgYSA4MDIuMTEgaGVhZGVyICovCisKKy8qIFVzZXMgdGhlIGNoYW5uZWwgY2hhbmdlIGNhbGxiYWNrIGRpcmVjdGx5CisgKiBpbnN0ZWFkIG9mIFtzdGFydC9zdG9wXSBzY2FuIGNhbGxiYWNrcworICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TQ0FOICgxPDwyKQorCisvKiBQZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGFuZCBhc3NvY2lhdGlvbiBoYW5kc2hha2UgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSAoMTw8MykKKworLyogR2VuZXJhdGUgcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlEgKDE8PDQpCisKKy8qIEdlbmVyYXRlIHJlc3BvbmVzIHRvIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJTICgxPDw1KQorCisvKiBUaGUgaWVlZTgwMi4xMSBzdGFjayB3aWxsIG1hbmFnZXMgdGhlIG5ldGlmIHF1ZXVlCisgKiB3YWtlL3N0b3AgZm9yIHRoZSBkcml2ZXIsIHRha2luZyBjYXJlIG9mIDgwMi4xMQorICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFICgxPDw3KQorCisvKiBVc2VzIG9ubHkgdGhlIHNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQKKyAqIGV2ZW4gZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKDE8PDgpCisKKy8qIEdlbmVyYXRlIGJlYWNvbnMuICBUaGUgc3RhY2sgd2lsbCBlbnF1ZXVlIGJlYWNvbnMKKyAqIHRvIHRoZSBjYXJkCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgKDE8PDYpCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSAyNDsKKworCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRShmYykpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSkKKwkJCWhkcmxlbiA9IDMwOyAvKiBBZGRyNCAqLworCQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKQorCQkJaGRybGVuICs9IDI7IC8qIFFPUyBjdHJsKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9DVFM6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDSzoKKwkJCWhkcmxlbiA9IDEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSAxNjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBoZHJsZW47Cit9CisKKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pOworCitleHRlcm4gaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICopOworCisKKy8qIGllZWU4MDIxMV9yeC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKKworLyogaWVlZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworLyogaWVlZTgwMjExX3NvZnRtYWMuYyAqLworZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CitleHRlcm4gdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsdTgqIGFzU3RhLHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLy9BZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorZXh0ZXJuIHZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgIAkJCSB1OCogICAgICAgICAgICAgICAgICAgICBhc1N0YSwKKyAgICAgICAgCQkgdTggICAgICAgICAgICAgICAgICAgICAgYXNSc24pOworCisvKiBpZWVlODAyMTFfY3J5cHRfY2NtcCZ0a2lwJndlcC5jICovCitleHRlcm4gdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKTsKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCisgZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisjZW5kaWYKKy8vZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKTsKKworZXh0ZXJuIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXTsKKworZXh0ZXJuIGlubGluZSB2b2lkIGllZWU4MDIxMV9pbmNyZW1lbnRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c2NhbnMrKzsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gaWVlZS0+c2NhbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pIHsKKwlzdGF0aWMgY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOworCWNvbnN0IGNoYXIgKnMgPSBlc3NpZDsKKwljaGFyICpkID0gZXNjYXBlZDsKKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoZXNzaWQsIGVzc2lkX2xlbikpIHsKKwkJbWVtY3B5KGVzY2FwZWQsICI8aGlkZGVuPiIsIHNpemVvZigiPGhpZGRlbj4iKSk7CisJCXJldHVybiBlc2NhcGVkOworCX0KKworCWVzc2lkX2xlbiA9IG1pbihlc3NpZF9sZW4sICh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJd2hpbGUgKGVzc2lkX2xlbi0tKSB7CisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQkqZCsrID0gJ1xcJzsKKwkJCSpkKysgPSAnMCc7CisJCQlzKys7CisJCX0gZWxzZSB7CisJCQkqZCsrID0gKnMrKzsKKwkJfQorCX0KKwkqZCA9ICdcMCc7CisJcmV0dXJuIGVzY2FwZWQ7Cit9CisjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2NGNmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogSG9zdCBBUCBjcnlwdG8gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREU8S0VSTkVMX1ZFUlNJT04oMiw2LDE4KSkKKyNpbmNsdWRlPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0QVAgY3J5cHRvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworfTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byB7CisJc3RydWN0IGxpc3RfaGVhZCBhbGdzOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byAqaGNyeXB0OworCit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgaW50IGZvcmNlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICplbnRyeTsKKworCWZvciAocHRyID0gaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QubmV4dCwgbiA9IHB0ci0+bmV4dDsKKwkgICAgIHB0ciAhPSAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3Q7IHB0ciA9IG4sIG4gPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhLCBsaXN0KTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmVudHJ5LT5yZWZjbnQpICE9IDAgJiYgIWZvcmNlKQorCQkJY29udGludWU7CisKKwkJbGlzdF9kZWwocHRyKTsKKworCQlpZiAoZW50cnktPm9wcykgeworCQkJZW50cnktPm9wcy0+ZGVpbml0KGVudHJ5LT5wcml2KTsKKwkJCW1vZHVsZV9wdXQoZW50cnktPm9wcy0+b3duZXIpOworCQl9CisJCWtmcmVlKGVudHJ5KTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGllZWUsIDApOworCWlmICghbGlzdF9lbXB0eSgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50cmllcyByZW1haW5pbmcgaW4gZGVsYXllZCBjcnlwdCAiCisJCSAgICAgICAiZGVsZXRpb24gbGlzdFxuIiwgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCWFkZF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCpjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl0bXAgPSAqY3J5cHQ7CisJKmNyeXB0ID0gTlVMTDsKKworCS8qIG11c3Qgbm90IHJ1biBvcHMtPmRlaW5pdCgpIHdoaWxlIHRoZXJlIG1heSBiZSBwZW5kaW5nIGVuY3J5cHQgb3IKKwkgKiBkZWNyeXB0IG9wZXJhdGlvbnMuIFVzZSBhIGxpc3Qgb2YgZGVsYXllZCBkZWluaXRzIHRvIGF2b2lkIG5lZWRpbmcKKwkgKiBsb2NraW5nLiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmdG1wLT5saXN0LCAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKSkgeworCQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlhbGcgPSBrbWFsbG9jKHNpemVvZigqYWxnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFsZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChhbGcsIDAsIHNpemVvZigqYWxnKSk7CisJYWxnLT5vcHMgPSBvcHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmFsZy0+bGlzdCwgJmhjcnlwdC0+YWxncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiByZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnXG4iLAorCSAgICAgICBvcHMtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZGVsX2FsZyA9IE5VTEw7CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlpZiAoYWxnLT5vcHMgPT0gb3BzKSB7CisJCQlsaXN0X2RlbCgmYWxnLT5saXN0KTsKKwkJCWRlbF9hbGcgPSBhbGc7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkZWxfYWxnKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgorCQkgICAgICAgIiclcydcbiIsIG9wcy0+bmFtZSk7CisJCWtmcmVlKGRlbF9hbGcpOworCX0KKworCXJldHVybiBkZWxfYWxnID8gMCA6IC0xOworfQorCisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZm91bmRfYWxnID0gTlVMTDsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7IHB0ciA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJaWYgKHN0cmNtcChhbGctPm9wcy0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJZm91bmRfYWxnID0gYWxnOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZm91bmRfYWxnKQorCQlyZXR1cm4gZm91bmRfYWxnLT5vcHM7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQoaW50IGtleWlkeCkgeyByZXR1cm4gKHZvaWQgKikgMTsgfQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0KHZvaWQgKnByaXYpIHt9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X251bGwgPSB7CisJLm5hbWUJCQk9ICJOVUxMIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX2NyeXB0X251bGxfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfY3J5cHRfbnVsbF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBOVUxMLAorCS5kZWNyeXB0X21wZHUJCT0gTlVMTCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IE5VTEwsCisJLmdldF9rZXkJCT0gTlVMTCwKKwkuZXh0cmFfcHJlZml4X2xlbgk9IDAsCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gMCwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitpbnQgaWVlZTgwMjExX2NyeXB0b19pbml0KHZvaWQpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwloY3J5cHQgPSBrbWFsbG9jKHNpemVvZigqaGNyeXB0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoY3J5cHQpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KGhjcnlwdCwgMCwgc2l6ZW9mKCpoY3J5cHQpKTsKKwlJTklUX0xJU1RfSEVBRCgmaGNyeXB0LT5hbGdzKTsKKwlzcGluX2xvY2tfaW5pdCgmaGNyeXB0LT5sb2NrKTsKKworCXJldCA9IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfbnVsbCk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoaGNyeXB0KTsKKwkJaGNyeXB0ID0gTlVMTDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCit2b2lkIGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dCwgbiA9IHB0ci0+bmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7CisJICAgICBwdHIgPSBuLCBuID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlsaXN0X2RlbChwdHIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKKwkJICAgICAgICInJXMnIChkZWluaXQpXG4iLCBhbGctPm9wcy0+bmFtZSk7CisJCWtmcmVlKGFsZyk7CisJfQorCisJa2ZyZWUoaGNyeXB0KTsKK30KKworI2lmIDAKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KTsKKworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMpOworI2VuZGlmCisKKy8vbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b19pbml0KTsKKy8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b19kZWluaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhM2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIE9yaWdpbmFsIGNvZGUgYmFzZWQgb24gSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MgTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyCisgKiBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogQWRhcHRpb24gdG8gYSBnZW5lcmljIElFRUUgODAyLjExIHN0YWNrIGJ5IEphbWVzIEtldHJlbm9zCisgKiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBpZWVlODAyMTEgY3J5cHRvIG1vZHVsZS4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfQ1JZUFRfSAorI2RlZmluZSBJRUVFODAyMTFfQ1JZUFRfSAorCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGluaXQgbmV3IGNyeXB0byBjb250ZXh0IChlLmcuLCBhbGxvY2F0ZSBwcml2YXRlIGRhdGEgc3BhY2UsCisJICogc2VsZWN0IElWLCBldGMuKTsgcmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgb3IgcG9pbnRlciB0byBhbGxvY2F0ZWQKKwkgKiBwcml2YXRlIGRhdGEgb24gc3VjY2VzcyAqLworCXZvaWQgKiAoKmluaXQpKGludCBrZXlpZHgpOworCisJLyogZGVpbml0aWFsaXplIGNyeXB0byBjb250ZXh0IGFuZCBmcmVlIGFsbG9jYXRlZCBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICgqZGVpbml0KSh2b2lkICpwcml2KTsKKworCS8qIGVuY3J5cHQvZGVjcnlwdCByZXR1cm4gPCAwIG9uIGVycm9yIG9yID49IDAgb24gc3VjY2Vzcy4gVGhlIHJldHVybgorCSAqIHZhbHVlIGZyb20gZGVjcnlwdF9tcGR1IGlzIHBhc3NlZCBhcyB0aGUga2V5aWR4IHZhbHVlIGZvcgorCSAqIGRlY3J5cHRfbXNkdS4gc2tiIG11c3QgaGF2ZSBlbm91Z2ggaGVhZCBhbmQgdGFpbCByb29tIGZvciB0aGUKKwkgKiBlbmNyeXB0aW9uOyBpZiBub3QsIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQ7IHRoZXNlIGZ1bmN0aW9ucyBhcmUKKwkgKiBjYWxsZWQgZm9yIGFsbCBNUERVcyAoaS5lLiwgZnJhZ21lbnRzKS4KKwkgKi8KKwlpbnQgKCplbmNyeXB0X21wZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKwlpbnQgKCpkZWNyeXB0X21wZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKworCS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZvciBmdWxsIE1TRFVzLCBpLmUuIGZ1bGwgZnJhbWVzLgorCSAqIFRoZXNlIGNhbiBiZSBOVUxMIGlmIGZ1bGwgTVNEVSBvcGVyYXRpb25zIGFyZSBub3QgbmVlZGVkLiAqLworCWludCAoKmVuY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwgaW50IGhkcl9sZW4sCisJCQkgICAgdm9pZCAqcHJpdik7CisKKwlpbnQgKCpzZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOworCWludCAoKmdldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisKKwkvKiBwcm9jZnMgaGFuZGxlciBmb3IgcHJpbnRpbmcgb3V0IGtleSBpbmZvcm1hdGlvbiBhbmQgcG9zc2libGUKKwkgKiBzdGF0aXN0aWNzICovCisJY2hhciAqICgqcHJpbnRfc3RhdHMpKGNoYXIgKnAsIHZvaWQgKnByaXYpOworCisJLyogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYWRkZWQgYnkgZW5jcnlwdGlvbjsgZW5jcnlwdCBidWYgaXMKKwkgKiBhbGxvY2F0ZWQgd2l0aCBleHRyYV9wcmVmaXhfbGVuIGJ5dGVzLCBjb3B5IG9mIGluX2J1ZiwgYW5kCisJICogZXh0cmFfcG9zdGZpeF9sZW47IGVuY3J5cHQgbmVlZCBub3QgdXNlIGFsbCB0aGlzIHNwYWNlLCBidXQKKwkgKiB0aGUgcmVzdWx0IG11c3Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZCBjb3JyZWN0CisJICogbGVuZ3RoIG11c3QgYmUgcmV0dXJuZWQgKi8KKwlpbnQgZXh0cmFfcHJlZml4X2xlbiwgZXh0cmFfcG9zdGZpeF9sZW47CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBkZWxheWVkIGRlbGV0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwl2b2lkICpwcml2OworCWF0b21pY190IHJlZmNudDsKK307CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcyk7CitpbnQgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcyk7CitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKiBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqLCBpbnQpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODkwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCkBAIC0wLDAgKzEsNTMzIEBACisvKgorICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBDQ01QIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKyAgICAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjZWxzZQorICAgICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2VuZGlmCisKKy8vI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IENDTVAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIE9QRU5TVVNFX1NMRUQKKyNpZm5kZWYgSU5fT1BFTlNVU0VfU0xFRAorI2RlZmluZSBJTl9PUEVOU1VTRV9TTEVEIDEKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQUVTX0JMT0NLX0xFTiAxNgorI2RlZmluZSBDQ01QX0hEUl9MRU4gOAorI2RlZmluZSBDQ01QX01JQ19MRU4gOAorI2RlZmluZSBDQ01QX1RLX0xFTiAxNgorI2RlZmluZSBDQ01QX1BOX0xFTiA2CisKK3N0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhIHsKKwl1OCBrZXlbQ0NNUF9US19MRU5dOworCWludCBrZXlfc2V0OworCisJdTggdHhfcG5bQ0NNUF9QTl9MRU5dOworCXU4IHJ4X3BuW0NDTVBfUE5fTEVOXTsKKworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnM7CisJdTMyIGRvdDExUlNOQVN0YXRzQ0NNUFJlcGxheXM7CisJdTMyIGRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnM7CisKKwlpbnQga2V5X2lkeDsKKworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisKKwkvKiBzY3JhdGNoIGJ1ZmZlcnMgZm9yIHZpcnRfdG9fcGFnZSgpIChjcnlwdG8gQVBJKSAqLworCXU4IHR4X2IwW0FFU19CTE9DS19MRU5dLCB0eF9iW0FFU19CTE9DS19MRU5dLAorCQl0eF9lW0FFU19CTE9DS19MRU5dLCB0eF9zMFtBRVNfQkxPQ0tfTEVOXTsKKwl1OCByeF9iMFtBRVNfQkxPQ0tfTEVOXSwgcnhfYltBRVNfQkxPQ0tfTEVOXSwgcnhfYVtBRVNfQkxPQ0tfTEVOXTsKK307CisKK3ZvaWQgaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgICAgY29uc3QgdTggcHRbMTZdLCB1OCBjdFsxNl0pCit7CisgICAgICAJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSl8fChJTl9PUEVOU1VTRV9TTEVEKSkKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKCh2b2lkICopdGZtLCBjdCwgcHQpOworCSNlbHNlCisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyYywgZHN0OworCisJc3JjLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHQpOworCXNyYy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwdCk7CisJc3JjLmxlbmd0aCA9IEFFU19CTE9DS19MRU47CisKKwlkc3QucGFnZSA9IHZpcnRfdG9fcGFnZShjdCk7CisJZHN0Lm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGN0KTsKKwlkc3QubGVuZ3RoID0gQUVTX0JMT0NLX0xFTjsKKworCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0Zm0sICZkc3QsICZzcmMsIEFFU19CTE9DS19MRU4pOworCSNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jY21wX2luaXQoaW50IGtleV9pZHgpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKnByaXY7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OworCisgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIUlOX09QRU5TVVNFX1NMRUQpKQorCXByaXYtPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oImFlcyIsIDApOworCWlmIChwcml2LT50Zm0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X2NjbXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhZXNcbiIpOworCQlnb3RvIGZhaWw7CisJfQorICAgICAgICNlbHNlCisgICAgICAgcHJpdi0+dGZtID0gKHZvaWQgKiljcnlwdG9fYWxsb2NfY2lwaGVyKCJhZXMiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnRmbSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF9jY21wOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYWVzXG4iKTsKKwkJcHJpdi0+dGZtID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKwkjZW5kaWYKKwlyZXR1cm4gcHJpdjsKKworZmFpbDoKKwlpZiAocHJpdikgeworCQlpZiAocHJpdi0+dGZtKQorCQkJLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKyAgICAgICAJCQkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghSU5fT1BFTlNVU0VfU0xFRCkpCisJCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtKTsKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKwkJCWNyeXB0b19mcmVlX2NpcGhlcigodm9pZCAqKXByaXYtPnRmbSk7CisJCSAgICAgICNlbmRpZgorCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfY2NtcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqX3ByaXYgPSBwcml2OworCWlmIChfcHJpdiAmJiBfcHJpdi0+dGZtKQorCQkvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorICAgICAgIAkJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIUlOX09QRU5TVVNFX1NMRUQpKQorCQljcnlwdG9fZnJlZV90Zm0oX3ByaXYtPnRmbSk7CisgICAgICAgICAgICAgI2Vsc2UKKwkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkICopX3ByaXYtPnRmbSk7CisJCSNlbmRpZgorCWtmcmVlKHByaXYpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4b3JfYmxvY2sodTggKmIsIHU4ICphLCBzaXplX3QgbGVuKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJYltpXSBePSBhW2ldOworfQorCisjaWZuZGVmIEpPSE5fQ0NNUAorc3RhdGljIHZvaWQgY2NtcF9pbml0X2Jsb2NrcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICB1OCAqcG4sIHNpemVfdCBkbGVuLCB1OCAqYjAsIHU4ICphdXRoLAorCQkJICAgICB1OCAqczApCit7CisJdTggKnBvcywgcWMgPSAwOworCXNpemVfdCBhYWRfbGVuOworCXUxNiBmYzsKKwlpbnQgYTRfaW5jbHVkZWQsIHFjX2luY2x1ZGVkOworCXU4IGFhZFsyICogQUVTX0JMT0NLX0xFTl07CisKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwlhNF9pbmNsdWRlZCA9ICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgICAgICAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpOworCS8qCisJcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSAmJgorCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4MDgpKTsKKyAgICAgICAgKi8KKwkvLyBmaXhlZCBieSBEYXZpZCA6MjAwNi45LjYKKwlxY19pbmNsdWRlZCA9ICgoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCisJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHg4MCkpOworCWFhZF9sZW4gPSAyMjsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCWFhZF9sZW4gKz0gNjsKKwlpZiAocWNfaW5jbHVkZWQpIHsKKwkJcG9zID0gKHU4ICopICZoZHItPmFkZHI0OworCQlpZiAoYTRfaW5jbHVkZWQpCisJCQlwb3MgKz0gNjsKKwkJcWMgPSAqcG9zICYgMHgwZjsKKwkJYWFkX2xlbiArPSAyOworCX0KKwkvKiBDQ00gSW5pdGlhbCBCbG9jazoKKwkgKiBGbGFnIChJbmNsdWRlIGF1dGhlbnRpY2F0aW9uIGhlYWRlciwgTT0zICg4LW9jdGV0IE1JQyksCisJICogICAgICAgTD0xICgyLW9jdGV0IERsZW4pKQorCSAqIE5vbmNlOiAweDAwIHwgQTIgfCBQTgorCSAqIERsZW4gKi8KKwliMFswXSA9IDB4NTk7CisJYjBbMV0gPSBxYzsKKwltZW1jcHkoYjAgKyAyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJbWVtY3B5KGIwICsgOCwgcG4sIENDTVBfUE5fTEVOKTsKKwliMFsxNF0gPSAoZGxlbiA+PiA4KSAmIDB4ZmY7CisJYjBbMTVdID0gZGxlbiAmIDB4ZmY7CisKKwkvKiBBQUQ6CisJICogRkMgd2l0aCBiaXRzIDQuLjYgYW5kIDExLi4xMyBtYXNrZWQgdG8gemVybzsgMTQgaXMgYWx3YXlzIG9uZQorCSAqIEExIHwgQTIgfCBBMworCSAqIFNDIHdpdGggYml0cyA0Li4xNSAoc2VxIykgbWFza2VkIHRvIHplcm8KKwkgKiBBNCAoaWYgcHJlc2VudCkKKwkgKiBRQyAoaWYgcHJlc2VudCkKKwkgKi8KKwlwb3MgPSAodTggKikgaGRyOworCWFhZFswXSA9IDA7IC8qIGFhZF9sZW4gPj4gOCAqLworCWFhZFsxXSA9IGFhZF9sZW4gJiAweGZmOworCWFhZFsyXSA9IHBvc1swXSAmIDB4OGY7CisJYWFkWzNdID0gcG9zWzFdICYgMHhjNzsKKwltZW1jcHkoYWFkICsgNCwgaGRyLT5hZGRyMSwgMyAqIEVUSF9BTEVOKTsKKwlwb3MgPSAodTggKikgJmhkci0+c2VxX2N0bDsKKwlhYWRbMjJdID0gcG9zWzBdICYgMHgwZjsKKwlhYWRbMjNdID0gMDsgLyogYWxsIGJpdHMgbWFza2VkICovCisJbWVtc2V0KGFhZCArIDI0LCAwLCA4KTsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCW1lbWNweShhYWQgKyAyNCwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCWlmIChxY19pbmNsdWRlZCkgeworCQlhYWRbYTRfaW5jbHVkZWQgPyAzMCA6IDI0XSA9IHFjOworCQkvKiByZXN0IG9mIFFDIG1hc2tlZCAqLworCX0KKworCS8qIFN0YXJ0IHdpdGggdGhlIGZpcnN0IGJsb2NrIGFuZCBBQUQgKi8KKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBhdXRoKTsKKwl4b3JfYmxvY2soYXV0aCwgYWFkLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCXhvcl9ibG9jayhhdXRoLCAmYWFkW0FFU19CTE9DS19MRU5dLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCWIwWzBdICY9IDB4MDc7CisJYjBbMTRdID0gYjBbMTVdID0gMDsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBzMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICprZXkgPSBwcml2OworCWludCBkYXRhX2xlbiwgaTsKKwl1OCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisjaWZuZGVmIEpPSE5fQ0NNUAorCWludCBibG9ja3MsIGxhc3QsIGxlbjsKKwl1OCAqbWljOworCXU4ICpiMCA9IGtleS0+dHhfYjA7CisJdTggKmIgPSBrZXktPnR4X2I7CisJdTggKmUgPSBrZXktPnR4X2U7CisJdTggKnMwID0ga2V5LT50eF9zMDsKKyNlbmRpZgorCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IENDTVBfSERSX0xFTiB8fAorCSAgICBza2JfdGFpbHJvb20oc2tiKSA8IENDTVBfTUlDX0xFTiB8fAorCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJCXJldHVybiAtMTsKKworCWRhdGFfbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgQ0NNUF9IRFJfTEVOKTsKKwltZW1tb3ZlKHBvcywgcG9zICsgQ0NNUF9IRFJfTEVOLCBoZHJfbGVuKTsKKwlwb3MgKz0gaGRyX2xlbjsKKy8vCW1pYyA9IHNrYl9wdXQoc2tiLCBDQ01QX01JQ19MRU4pOworCisJaSA9IENDTVBfUE5fTEVOIC0gMTsKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWtleS0+dHhfcG5baV0rKzsKKwkJaWYgKGtleS0+dHhfcG5baV0gIT0gMCkKKwkJCWJyZWFrOworCQlpLS07CisJfQorCisJKnBvcysrID0ga2V5LT50eF9wbls1XTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzRdOworCSpwb3MrKyA9IDA7CisJKnBvcysrID0gKGtleS0+a2V5X2lkeCA8PCA2KSB8ICgxIDw8IDUpIC8qIEV4dCBJViBpbmNsdWRlZCAqLzsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzNdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bMl07CisJKnBvcysrID0ga2V5LT50eF9wblsxXTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzBdOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKyNpZm5kZWYgSk9ITl9DQ01QCisJLy9taWMgaXMgbW92ZWQgdG8gaGVyZSBieSBqb2huCisJbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CisKKwljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIGtleS0+dHhfcG4sIGRhdGFfbGVuLCBiMCwgYiwgczApOworCisJYmxvY2tzID0gKGRhdGFfbGVuICsgQUVTX0JMT0NLX0xFTiAtIDEpIC8gQUVTX0JMT0NLX0xFTjsKKwlsYXN0ID0gZGF0YV9sZW4gJSBBRVNfQkxPQ0tfTEVOOworCisJZm9yIChpID0gMTsgaSA8PSBibG9ja3M7IGkrKykgeworCQlsZW4gPSAoaSA9PSBibG9ja3MgJiYgbGFzdCkgPyBsYXN0IDogQUVTX0JMT0NLX0xFTjsKKwkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJeG9yX2Jsb2NrKGIsIHBvcywgbGVuKTsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIsIGIpOworCQkvKiBFbmNyeXB0aW9uLCB3aXRoIGNvdW50ZXIgKi8KKwkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOworCQliMFsxNV0gPSBpICYgMHhmZjsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBlKTsKKwkJeG9yX2Jsb2NrKHBvcywgZSwgbGVuKTsKKwkJcG9zICs9IGxlbjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0NNUF9NSUNfTEVOOyBpKyspCisJCW1pY1tpXSA9IGJbaV0gXiBzMFtpXTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKKwl1OCBrZXlpZHgsICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwl1OCBwbls2XTsKKyNpZm5kZWYgSk9ITl9DQ01QCisJc2l6ZV90IGRhdGFfbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gQ0NNUF9IRFJfTEVOIC0gQ0NNUF9NSUNfTEVOOworCXU4ICptaWMgPSBza2ItPmRhdGEgKyBza2ItPmxlbiAtIENDTVBfTUlDX0xFTjsKKwl1OCAqYjAgPSBrZXktPnJ4X2IwOworCXU4ICpiID0ga2V5LT5yeF9iOworCXU4ICphID0ga2V5LT5yeF9hOworCWludCBpLCBibG9ja3MsIGxhc3QsIGxlbjsKKyNlbmRpZgorCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyBDQ01QX0hEUl9MRU4gKyBDQ01QX01JQ19MRU4pIHsKKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnMrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlpZHggPSBwb3NbM107CisJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViIKKwkJCSAgICAgICAiIGZsYWcgZnJvbSAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnMrKzsKKwkJcmV0dXJuIC0yOworCX0KKwlrZXlpZHggPj49IDY7CisJaWYgKGtleS0+a2V5X2lkeCAhPSBrZXlpZHgpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IFJYIHRrZXktPmtleV9pZHg9JWQgZnJhbWUgIgorCQkgICAgICAgImtleWlkeD0lZCBwcml2PSVwXG4iLCBrZXktPmtleV9pZHgsIGtleWlkeCwgcHJpdik7CisJCXJldHVybiAtNjsKKwl9CisJaWYgKCFrZXktPmtleV9zZXQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IHJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVAorCQkJICAgICAgICIgd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIgorCQkJICAgICAgICIga2V5XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQl9CisJCXJldHVybiAtMzsKKwl9CisKKwlwblswXSA9IHBvc1s3XTsKKwlwblsxXSA9IHBvc1s2XTsKKwlwblsyXSA9IHBvc1s1XTsKKwlwblszXSA9IHBvc1s0XTsKKwlwbls0XSA9IHBvc1sxXTsKKwlwbls1XSA9IHBvc1swXTsKKwlwb3MgKz0gODsKKworCWlmIChtZW1jbXAocG4sIGtleS0+cnhfcG4sIENDTVBfUE5fTEVOKSA8PSAwKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0iIE1BQ19GTVQKKwkJCSAgICAgICAiIHByZXZpb3VzIFBOICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCQkgICAgICAgInJlY2VpdmVkIFBOICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCSAgICAgICBNQUNfQVJHKGhkci0+YWRkcjIpLCBNQUNfQVJHKGtleS0+cnhfcG4pLAorCQkJICAgICAgIE1BQ19BUkcocG4pKTsKKwkJfQorCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUFJlcGxheXMrKzsKKwkJcmV0dXJuIC00OworCX0KKworI2lmbmRlZiBKT0hOX0NDTVAKKwljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIHBuLCBkYXRhX2xlbiwgYjAsIGEsIGIpOworCXhvcl9ibG9jayhtaWMsIGIsIENDTVBfTUlDX0xFTik7CisKKwlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOworCWxhc3QgPSBkYXRhX2xlbiAlIEFFU19CTE9DS19MRU47CisKKwlmb3IgKGkgPSAxOyBpIDw9IGJsb2NrczsgaSsrKSB7CisJCWxlbiA9IChpID09IGJsb2NrcyAmJiBsYXN0KSA/IGxhc3QgOiBBRVNfQkxPQ0tfTEVOOworCQkvKiBEZWNyeXB0LCB3aXRoIGNvdW50ZXIgKi8KKwkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOworCQliMFsxNV0gPSBpICYgMHhmZjsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBiKTsKKwkJeG9yX2Jsb2NrKHBvcywgYiwgbGVuKTsKKwkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJeG9yX2Jsb2NrKGEsIHBvcywgbGVuKTsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGEsIGEpOworCQlwb3MgKz0gbGVuOworCX0KKworCWlmIChtZW1jbXAobWljLCBhLCBDQ01QX01JQ19MRU4pICE9IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IGRlY3J5cHQgZmFpbGVkOiBTVEE9IgorCQkJICAgICAgIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzKys7CisJCXJldHVybiAtNTsKKwl9CisKKwltZW1jcHkoa2V5LT5yeF9wbiwgcG4sIENDTVBfUE5fTEVOKTsKKworI2VuZGlmCisJLyogUmVtb3ZlIGhkciBhbmQgTUlDICovCisJbWVtbW92ZShza2ItPmRhdGEgKyBDQ01QX0hEUl9MRU4sIHNrYi0+ZGF0YSwgaGRyX2xlbik7CisJc2tiX3B1bGwoc2tiLCBDQ01QX0hEUl9MRU4pOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBDQ01QX01JQ19MRU4pOworCisJcmV0dXJuIGtleWlkeDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpkYXRhID0gcHJpdjsKKwlpbnQga2V5aWR4OworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkYXRhLT50Zm07CisKKwlrZXlpZHggPSBkYXRhLT5rZXlfaWR4OworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKwlkYXRhLT5rZXlfaWR4ID0ga2V5aWR4OworCWRhdGEtPnRmbSA9IHRmbTsKKwlpZiAobGVuID09IENDTVBfVEtfTEVOKSB7CisJCW1lbWNweShkYXRhLT5rZXksIGtleSwgQ0NNUF9US19MRU4pOworCQlkYXRhLT5rZXlfc2V0ID0gMTsKKwkJaWYgKHNlcSkgeworCQkJZGF0YS0+cnhfcG5bMF0gPSBzZXFbNV07CisJCQlkYXRhLT5yeF9wblsxXSA9IHNlcVs0XTsKKwkJCWRhdGEtPnJ4X3BuWzJdID0gc2VxWzNdOworCQkJZGF0YS0+cnhfcG5bM10gPSBzZXFbMl07CisJCQlkYXRhLT5yeF9wbls0XSA9IHNlcVsxXTsKKwkJCWRhdGEtPnJ4X3BuWzVdID0gc2VxWzBdOworCQl9CisJCWNyeXB0b19jaXBoZXJfc2V0a2V5KCh2b2lkICopZGF0YS0+dGZtLCBkYXRhLT5rZXksIENDTVBfVEtfTEVOKTsKKwl9IGVsc2UgaWYgKGxlbiA9PSAwKQorCQlkYXRhLT5rZXlfc2V0ID0gMDsKKwllbHNlCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmRhdGEgPSBwcml2OworCisJaWYgKGxlbiA8IENDTVBfVEtfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWRhdGEtPmtleV9zZXQpCisJCXJldHVybiAwOworCW1lbWNweShrZXksIGRhdGEtPmtleSwgQ0NNUF9US19MRU4pOworCisJaWYgKHNlcSkgeworCQlzZXFbMF0gPSBkYXRhLT50eF9wbls1XTsKKwkJc2VxWzFdID0gZGF0YS0+dHhfcG5bNF07CisJCXNlcVsyXSA9IGRhdGEtPnR4X3BuWzNdOworCQlzZXFbM10gPSBkYXRhLT50eF9wblsyXTsKKwkJc2VxWzRdID0gZGF0YS0+dHhfcG5bMV07CisJCXNlcVs1XSA9IGRhdGEtPnR4X3BuWzBdOworCX0KKworCXJldHVybiBDQ01QX1RLX0xFTjsKK30KKworCitzdGF0aWMgY2hhciAqIGllZWU4MDIxMV9jY21wX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmNjbXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAiZm9ybWF0X2Vycm9ycz0lZCByZXBsYXlzPSVkIGRlY3J5cHRfZXJyb3JzPSVkXG4iLAorCQkgICAgIGNjbXAtPmtleV9pZHgsIGNjbXAtPmtleV9zZXQsCisJCSAgICAgTUFDX0FSRyhjY21wLT50eF9wbiksIE1BQ19BUkcoY2NtcC0+cnhfcG4pLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycywKKwkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnMpOworCisJcmV0dXJuIHA7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKQoreworLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm47Cit9CitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF9jY21wID0geworCS5uYW1lCQkJPSAiQ0NNUCIsCisJLmluaXQJCQk9IGllZWU4MDIxMV9jY21wX2luaXQsCisJLmRlaW5pdAkJCT0gaWVlZTgwMjExX2NjbXBfZGVpbml0LAorCS5lbmNyeXB0X21wZHUJCT0gaWVlZTgwMjExX2NjbXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IGllZWU4MDIxMV9jY21wX2RlY3J5cHQsCisJLmVuY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5kZWNyeXB0X21zZHUJCT0gTlVMTCwKKwkuc2V0X2tleQkJPSBpZWVlODAyMTFfY2NtcF9zZXRfa2V5LAorCS5nZXRfa2V5CQk9IGllZWU4MDIxMV9jY21wX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IGllZWU4MDIxMV9jY21wX3ByaW50X3N0YXRzLAorCS5leHRyYV9wcmVmaXhfbGVuCT0gQ0NNUF9IRFJfTEVOLAorCS5leHRyYV9wb3N0Zml4X2xlbgk9IENDTVBfTUlDX0xFTiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitpbnQgaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9jY21wKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X2NjbXApOworfQorCisjaWYgMAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9jY21wX251bGwpOworI2Vsc2UKK0VYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9jY21wX251bGwpOworI2VuZGlmCisjZW5kaWYKKworLy9tb2R1bGVfaW5pdChpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCk7CisvL21vZHVsZV9leGl0KGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjBiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCkBAIC0wLDAgKzEsMTAwMSBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgVEtJUCBlbmNyeXB0aW9uIGltcGxlbWVudGF0aW9uIGZvciBIb3N0IEFQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2VuZGlmCisvLyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKKyAgICAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjZWxzZQorICAgICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IFRLSVAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIE9QRU5TVVNFX1NMRUQKKyNpZm5kZWYgSU5fT1BFTlNVU0VfU0xFRAorI2RlZmluZSBJTl9PUEVOU1VTRV9TTEVEIDEKKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhIHsKKyNkZWZpbmUgVEtJUF9LRVlfTEVOIDMyCisJdTgga2V5W1RLSVBfS0VZX0xFTl07CisJaW50IGtleV9zZXQ7CisKKwl1MzIgdHhfaXYzMjsKKwl1MTYgdHhfaXYxNjsKKwl1MTYgdHhfdHRha1s1XTsKKwlpbnQgdHhfcGhhc2UxX2RvbmU7CisKKwl1MzIgcnhfaXYzMjsKKwl1MTYgcnhfaXYxNjsKKwl1MTYgcnhfdHRha1s1XTsKKwlpbnQgcnhfcGhhc2UxX2RvbmU7CisJdTMyIHJ4X2l2MzJfbmV3OworCXUxNiByeF9pdjE2X25ldzsKKworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzOworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnM7CisJdTMyIGRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXM7CisKKwlpbnQga2V5X2lkeDsKKworICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpfHwoSU5fT1BFTlNVU0VfU0xFRCkpCisJICAgCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpyeF90Zm1fYXJjNDsKKwkgICAgICAgc3RydWN0IGNyeXB0b19oYXNoICpyeF90Zm1fbWljaGFlbDsKKwkgICAgICAgc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnR4X3RmbV9hcmM0OworCSAgICAgICBzdHJ1Y3QgY3J5cHRvX2hhc2ggKnR4X3RmbV9taWNoYWVsOworICAgICAgICNlbmRpZgorCisJc3RydWN0IGNyeXB0b190Zm0gKnRmbV9hcmM0OworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm1fbWljaGFlbDsKKworCS8qIHNjcmF0Y2ggYnVmZmVycyBmb3IgdmlydF90b19wYWdlKCkgKGNyeXB0byBBUEkpICovCisJdTggcnhfaGRyWzE2XSwgdHhfaGRyWzE2XTsKK307CisKK3N0YXRpYyB2b2lkICogaWVlZTgwMjExX3RraXBfaW5pdChpbnQga2V5X2lkeCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleV9pZHg7CisKKyAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJcHJpdi0+dGZtX2FyYzQgPSBjcnlwdG9fYWxsb2NfdGZtKCJhcmM0IiwgMCk7CisJaWYgKHByaXYtPnRmbV9hcmM0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcml2LT50Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY190Zm0oIm1pY2hhZWxfbWljIiwgMCk7CisJaWYgKHByaXYtPnRmbV9taWNoYWVsID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJI2Vsc2UKKwlwcml2LT50eF90Zm1fYXJjNCA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsCisJCQkJCQlDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9hcmM0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJpdi0+dHhfdGZtX2FyYzQgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+dHhfdGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLAorCQkJCQkJIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtX21pY2hhZWwpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJcHJpdi0+dHhfdGZtX21pY2hhZWwgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+cnhfdGZtX2FyYzQgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLAorCQkJCQkJQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fYXJjNCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnJ4X3RmbV9hcmM0ID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnJ4X3RmbV9taWNoYWVsID0gY3J5cHRvX2FsbG9jX2hhc2goIm1pY2hhZWxfbWljIiwgMCwKKwkJCQkJCSBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJ4X3RmbV9taWNoYWVsKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CisJCXByaXYtPnJ4X3RmbV9taWNoYWVsID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKyAgICAgICAjZW5kaWYKKwlyZXR1cm4gcHJpdjsKKworZmFpbDoKKwlpZiAocHJpdikgeworCQkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCQlpZiAocHJpdi0+dGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtX21pY2hhZWwpOworCQlpZiAocHJpdi0+dGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtX2FyYzQpOworICAgICAgICAgICAgICNlbHNlCisJCWlmIChwcml2LT50eF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2gocHJpdi0+dHhfdGZtX21pY2hhZWwpOworCQlpZiAocHJpdi0+dHhfdGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+dHhfdGZtX2FyYzQpOworCQlpZiAocHJpdi0+cnhfdGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV9oYXNoKHByaXYtPnJ4X3RmbV9taWNoYWVsKTsKKwkJaWYgKHByaXYtPnJ4X3RmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnJ4X3RmbV9hcmM0KTsKKwkJI2VuZGlmCisJCWtmcmVlKHByaXYpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV90a2lwX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICpfcHJpdiA9IHByaXY7CisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlpZiAoX3ByaXYgJiYgX3ByaXYtPnRmbV9taWNoYWVsKQorCQljcnlwdG9fZnJlZV90Zm0oX3ByaXYtPnRmbV9taWNoYWVsKTsKKwlpZiAoX3ByaXYgJiYgX3ByaXYtPnRmbV9hcmM0KQorCQljcnlwdG9fZnJlZV90Zm0oX3ByaXYtPnRmbV9hcmM0KTsKKwkjZWxzZQorCWlmIChfcHJpdikgeworCQlpZiAoX3ByaXYtPnR4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChfcHJpdi0+dHhfdGZtX21pY2hhZWwpOworCQlpZiAoX3ByaXYtPnR4X3RmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT50eF90Zm1fYXJjNCk7CisJCWlmIChfcHJpdi0+cnhfdGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV9oYXNoKF9wcml2LT5yeF90Zm1fbWljaGFlbCk7CisJCWlmIChfcHJpdi0+cnhfdGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnJ4X3RmbV9hcmM0KTsKKwl9CisJI2VuZGlmCisJa2ZyZWUocHJpdik7Cit9CisKKworc3RhdGljIGlubGluZSB1MTYgUm90UjEodTE2IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCA+PiAxKSB8ICh2YWwgPDwgMTUpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTggTG84KHUxNiB2YWwpCit7CisJcmV0dXJuIHZhbCAmIDB4ZmY7Cit9CisKKworc3RhdGljIGlubGluZSB1OCBIaTgodTE2IHZhbCkKK3sKKwlyZXR1cm4gdmFsID4+IDg7Cit9CisKKworc3RhdGljIGlubGluZSB1MTYgTG8xNih1MzIgdmFsKQoreworCXJldHVybiB2YWwgJiAweGZmZmY7Cit9CisKKworc3RhdGljIGlubGluZSB1MTYgSGkxNih1MzIgdmFsKQoreworCXJldHVybiB2YWwgPj4gMTY7Cit9CisKKworc3RhdGljIGlubGluZSB1MTYgTWsxNih1OCBoaSwgdTggbG8pCit7CisJcmV0dXJuIGxvIHwgKCgodTE2KSBoaSkgPDwgOCk7Cit9CisKKworc3RhdGljIGlubGluZSB1MTYgTWsxNl9sZSh1MTYgKnYpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KCp2KTsKK30KKworCitzdGF0aWMgY29uc3QgdTE2IFNib3hbMjU2XSA9Cit7CisJMHhDNkE1LCAweEY4ODQsIDB4RUU5OSwgMHhGNjhELCAweEZGMEQsIDB4RDZCRCwgMHhERUIxLCAweDkxNTQsCisJMHg2MDUwLCAweDAyMDMsIDB4Q0VBOSwgMHg1NjdELCAweEU3MTksIDB4QjU2MiwgMHg0REU2LCAweEVDOUEsCisJMHg4RjQ1LCAweDFGOUQsIDB4ODk0MCwgMHhGQTg3LCAweEVGMTUsIDB4QjJFQiwgMHg4RUM5LCAweEZCMEIsCisJMHg0MUVDLCAweEIzNjcsIDB4NUZGRCwgMHg0NUVBLCAweDIzQkYsIDB4NTNGNywgMHhFNDk2LCAweDlCNUIsCisJMHg3NUMyLCAweEUxMUMsIDB4M0RBRSwgMHg0QzZBLCAweDZDNUEsIDB4N0U0MSwgMHhGNTAyLCAweDgzNEYsCisJMHg2ODVDLCAweDUxRjQsIDB4RDEzNCwgMHhGOTA4LCAweEUyOTMsIDB4QUI3MywgMHg2MjUzLCAweDJBM0YsCisJMHgwODBDLCAweDk1NTIsIDB4NDY2NSwgMHg5RDVFLCAweDMwMjgsIDB4MzdBMSwgMHgwQTBGLCAweDJGQjUsCisJMHgwRTA5LCAweDI0MzYsIDB4MUI5QiwgMHhERjNELCAweENEMjYsIDB4NEU2OSwgMHg3RkNELCAweEVBOUYsCisJMHgxMjFCLCAweDFEOUUsIDB4NTg3NCwgMHgzNDJFLCAweDM2MkQsIDB4RENCMiwgMHhCNEVFLCAweDVCRkIsCisJMHhBNEY2LCAweDc2NEQsIDB4Qjc2MSwgMHg3RENFLCAweDUyN0IsIDB4REQzRSwgMHg1RTcxLCAweDEzOTcsCisJMHhBNkY1LCAweEI5NjgsIDB4MDAwMCwgMHhDMTJDLCAweDQwNjAsIDB4RTMxRiwgMHg3OUM4LCAweEI2RUQsCisJMHhENEJFLCAweDhENDYsIDB4NjdEOSwgMHg3MjRCLCAweDk0REUsIDB4OThENCwgMHhCMEU4LCAweDg1NEEsCisJMHhCQjZCLCAweEM1MkEsIDB4NEZFNSwgMHhFRDE2LCAweDg2QzUsIDB4OUFENywgMHg2NjU1LCAweDExOTQsCisJMHg4QUNGLCAweEU5MTAsIDB4MDQwNiwgMHhGRTgxLCAweEEwRjAsIDB4Nzg0NCwgMHgyNUJBLCAweDRCRTMsCisJMHhBMkYzLCAweDVERkUsIDB4ODBDMCwgMHgwNThBLCAweDNGQUQsIDB4MjFCQywgMHg3MDQ4LCAweEYxMDQsCisJMHg2M0RGLCAweDc3QzEsIDB4QUY3NSwgMHg0MjYzLCAweDIwMzAsIDB4RTUxQSwgMHhGRDBFLCAweEJGNkQsCisJMHg4MTRDLCAweDE4MTQsIDB4MjYzNSwgMHhDMzJGLCAweEJFRTEsIDB4MzVBMiwgMHg4OENDLCAweDJFMzksCisJMHg5MzU3LCAweDU1RjIsIDB4RkM4MiwgMHg3QTQ3LCAweEM4QUMsIDB4QkFFNywgMHgzMjJCLCAweEU2OTUsCisJMHhDMEEwLCAweDE5OTgsIDB4OUVEMSwgMHhBMzdGLCAweDQ0NjYsIDB4NTQ3RSwgMHgzQkFCLCAweDBCODMsCisJMHg4Q0NBLCAweEM3MjksIDB4NkJEMywgMHgyODNDLCAweEE3NzksIDB4QkNFMiwgMHgxNjFELCAweEFENzYsCisJMHhEQjNCLCAweDY0NTYsIDB4NzQ0RSwgMHgxNDFFLCAweDkyREIsIDB4MEMwQSwgMHg0ODZDLCAweEI4RTQsCisJMHg5RjVELCAweEJENkUsIDB4NDNFRiwgMHhDNEE2LCAweDM5QTgsIDB4MzFBNCwgMHhEMzM3LCAweEYyOEIsCisJMHhENTMyLCAweDhCNDMsIDB4NkU1OSwgMHhEQUI3LCAweDAxOEMsIDB4QjE2NCwgMHg5Q0QyLCAweDQ5RTAsCisJMHhEOEI0LCAweEFDRkEsIDB4RjMwNywgMHhDRjI1LCAweENBQUYsIDB4RjQ4RSwgMHg0N0U5LCAweDEwMTgsCisJMHg2RkQ1LCAweEYwODgsIDB4NEE2RiwgMHg1QzcyLCAweDM4MjQsIDB4NTdGMSwgMHg3M0M3LCAweDk3NTEsCisJMHhDQjIzLCAweEExN0MsIDB4RTg5QywgMHgzRTIxLCAweDk2REQsIDB4NjFEQywgMHgwRDg2LCAweDBGODUsCisJMHhFMDkwLCAweDdDNDIsIDB4NzFDNCwgMHhDQ0FBLCAweDkwRDgsIDB4MDYwNSwgMHhGNzAxLCAweDFDMTIsCisJMHhDMkEzLCAweDZBNUYsIDB4QUVGOSwgMHg2OUQwLCAweDE3OTEsIDB4OTk1OCwgMHgzQTI3LCAweDI3QjksCisJMHhEOTM4LCAweEVCMTMsIDB4MkJCMywgMHgyMjMzLCAweEQyQkIsIDB4QTk3MCwgMHgwNzg5LCAweDMzQTcsCisJMHgyREI2LCAweDNDMjIsIDB4MTU5MiwgMHhDOTIwLCAweDg3NDksIDB4QUFGRiwgMHg1MDc4LCAweEE1N0EsCisJMHgwMzhGLCAweDU5RjgsIDB4MDk4MCwgMHgxQTE3LCAweDY1REEsIDB4RDczMSwgMHg4NEM2LCAweEQwQjgsCisJMHg4MkMzLCAweDI5QjAsIDB4NUE3NywgMHgxRTExLCAweDdCQ0IsIDB4QThGQywgMHg2REQ2LCAweDJDM0EsCit9OworCisKK3N0YXRpYyBpbmxpbmUgdTE2IF9TXyh1MTYgdikKK3sKKwl1MTYgdCA9IFNib3hbSGk4KHYpXTsKKwlyZXR1cm4gU2JveFtMbzgodildIF4gKCh0IDw8IDgpIHwgKHQgPj4gOCkpOworfQorCisjaWZuZGVmIEpPSE5fVEtJUAorI2RlZmluZSBQSEFTRTFfTE9PUF9DT1VOVCA4CisKK3N0YXRpYyB2b2lkIHRraXBfbWl4aW5nX3BoYXNlMSh1MTYgKlRUQUssIGNvbnN0IHU4ICpUSywgY29uc3QgdTggKlRBLCB1MzIgSVYzMikKK3sKKwlpbnQgaSwgajsKKworCS8qIEluaXRpYWxpemUgdGhlIDgwLWJpdCBUVEFLIGZyb20gVFNDIChJVjMyKSBhbmQgVEFbMC4uNV0gKi8KKwlUVEFLWzBdID0gTG8xNihJVjMyKTsKKwlUVEFLWzFdID0gSGkxNihJVjMyKTsKKwlUVEFLWzJdID0gTWsxNihUQVsxXSwgVEFbMF0pOworCVRUQUtbM10gPSBNazE2KFRBWzNdLCBUQVsyXSk7CisJVFRBS1s0XSA9IE1rMTYoVEFbNV0sIFRBWzRdKTsKKworCWZvciAoaSA9IDA7IGkgPCBQSEFTRTFfTE9PUF9DT1VOVDsgaSsrKSB7CisJCWogPSAyICogKGkgJiAxKTsKKwkJVFRBS1swXSArPSBfU18oVFRBS1s0XSBeIE1rMTYoVEtbMSArIGpdLCBUS1swICsgal0pKTsKKwkJVFRBS1sxXSArPSBfU18oVFRBS1swXSBeIE1rMTYoVEtbNSArIGpdLCBUS1s0ICsgal0pKTsKKwkJVFRBS1syXSArPSBfU18oVFRBS1sxXSBeIE1rMTYoVEtbOSArIGpdLCBUS1s4ICsgal0pKTsKKwkJVFRBS1szXSArPSBfU18oVFRBS1syXSBeIE1rMTYoVEtbMTMgKyBqXSwgVEtbMTIgKyBqXSkpOworCQlUVEFLWzRdICs9IF9TXyhUVEFLWzNdIF4gTWsxNihUS1sxICsgal0sIFRLWzAgKyBqXSkpICsgaTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgdGtpcF9taXhpbmdfcGhhc2UyKHU4ICpXRVBTZWVkLCBjb25zdCB1OCAqVEssIGNvbnN0IHUxNiAqVFRBSywKKwkJCSAgICAgICB1MTYgSVYxNikKK3sKKwkvKiBNYWtlIHRlbXBvcmFyeSBhcmVhIG92ZXJsYXAgV0VQIHNlZWQgc28gdGhhdCB0aGUgZmluYWwgY29weSBjYW4gYmUKKwkgKiBhdm9pZGVkIG9uIGxpdHRsZSBlbmRpYW4gaG9zdHMuICovCisJdTE2ICpQUEsgPSAodTE2ICopICZXRVBTZWVkWzRdOworCisJLyogU3RlcCAxIC0gbWFrZSBjb3B5IG9mIFRUQUsgYW5kIGJyaW5nIGluIFRTQyAqLworCVBQS1swXSA9IFRUQUtbMF07CisJUFBLWzFdID0gVFRBS1sxXTsKKwlQUEtbMl0gPSBUVEFLWzJdOworCVBQS1szXSA9IFRUQUtbM107CisJUFBLWzRdID0gVFRBS1s0XTsKKwlQUEtbNV0gPSBUVEFLWzRdICsgSVYxNjsKKworCS8qIFN0ZXAgMiAtIDk2LWJpdCBiaWplY3RpdmUgbWl4aW5nIHVzaW5nIFMtYm94ICovCisJUFBLWzBdICs9IF9TXyhQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzBdKSk7CisJUFBLWzFdICs9IF9TXyhQUEtbMF0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzJdKSk7CisJUFBLWzJdICs9IF9TXyhQUEtbMV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzRdKSk7CisJUFBLWzNdICs9IF9TXyhQUEtbMl0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzZdKSk7CisJUFBLWzRdICs9IF9TXyhQUEtbM10gXiBNazE2X2xlKCh1MTYgKikgJlRLWzhdKSk7CisJUFBLWzVdICs9IF9TXyhQUEtbNF0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzEwXSkpOworCisJUFBLWzBdICs9IFJvdFIxKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMTJdKSk7CisJUFBLWzFdICs9IFJvdFIxKFBQS1swXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMTRdKSk7CisJUFBLWzJdICs9IFJvdFIxKFBQS1sxXSk7CisJUFBLWzNdICs9IFJvdFIxKFBQS1syXSk7CisJUFBLWzRdICs9IFJvdFIxKFBQS1szXSk7CisJUFBLWzVdICs9IFJvdFIxKFBQS1s0XSk7CisKKwkvKiBTdGVwIDMgLSBicmluZyBpbiBsYXN0IG9mIFRLIGJpdHMsIGFzc2lnbiAyNC1iaXQgV0VQIElWIHZhbHVlCisJICogV0VQU2VlZFswLi4yXSBpcyB0cmFuc21pdHRlZCBhcyBXRVAgSVYgKi8KKwlXRVBTZWVkWzBdID0gSGk4KElWMTYpOworCVdFUFNlZWRbMV0gPSAoSGk4KElWMTYpIHwgMHgyMCkgJiAweDdGOworCVdFUFNlZWRbMl0gPSBMbzgoSVYxNik7CisJV0VQU2VlZFszXSA9IExvOCgoUFBLWzVdIF4gTWsxNl9sZSgodTE2ICopICZUS1swXSkpID4+IDEpOworCisjaWZkZWYgX19CSUdfRU5ESUFOCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCVBQS1tpXSA9IChQUEtbaV0gPDwgOCkgfCAoUFBLW2ldID4+IDgpOworCX0KKyNlbmRpZgorfQorI2VuZGlmCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKyAgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSl8fChJTl9PUEVOU1VTRV9TTEVEKSkKKyAgICAgICAgc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7LnRmbSA9IHRrZXktPnR4X3RmbV9hcmM0fTsKKyAgICAgICAgI2VuZGlmCisJaW50IGxlbjsKKwl1OCAgKnBvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworI2lmbmRlZiBKT0hOX1RLSVAKKwl1OCByYzRrZXlbMTZdLCppY3Y7CisJdTMyIGNyYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisjZW5kaWYKKwlpbnQgcmV0OworCisJcmV0ID0gMDsKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCA4IHx8IHNrYl90YWlscm9vbShza2IpIDwgNCB8fAorCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJCXJldHVybiAtMTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisjaWYgMAorcHJpbnRrKCJAQCB0a2V5XG4iKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbMF0pOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVsxXSk7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzJdKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbM10pOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVs0XSk7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzVdKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbNl0pOworcHJpbnRrKCIleFxuIiwgKCh1MzIqKXRrZXktPmtleSlbN10pOworI2VuZGlmCisKKyNpZm5kZWYgSk9ITl9US0lQCisJaWYgKCF0a2V5LT50eF9waGFzZTFfZG9uZSkgeworCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+dHhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLAorCQkJCSAgIHRrZXktPnR4X2l2MzIpOworCQl0a2V5LT50eF9waGFzZTFfZG9uZSA9IDE7CisJfQorCXRraXBfbWl4aW5nX3BoYXNlMihyYzRrZXksIHRrZXktPmtleSwgdGtleS0+dHhfdHRhaywgdGtleS0+dHhfaXYxNik7CisKKyNlbHNlCisJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAxOworI2VuZGlmICAvKkpPSE5fVEtJUCovCisKKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJcG9zID0gc2tiX3B1c2goc2tiLCA4KTsKKwltZW1tb3ZlKHBvcywgcG9zICsgOCwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisKKyNpZmRlZiBKT0hOX1RLSVAKKwkqcG9zKysgPSBIaTgodGtleS0+dHhfaXYxNik7CisJKnBvcysrID0gKEhpOCh0a2V5LT50eF9pdjE2KSB8IDB4MjApICYgMHg3RjsKKwkqcG9zKysgPSBMbzgodGtleS0+dHhfaXYxNik7CisjZWxzZQorCSpwb3MrKyA9IHJjNGtleVswXTsKKwkqcG9zKysgPSByYzRrZXlbMV07CisJKnBvcysrID0gcmM0a2V5WzJdOworI2VuZGlmCisJKnBvcysrID0gKHRrZXktPmtleV9pZHggPDwgNikgfCAoMSA8PCA1KSAvKiBFeHQgSVYgaW5jbHVkZWQgKi87CisJKnBvcysrID0gdGtleS0+dHhfaXYzMiAmIDB4ZmY7CisJKnBvcysrID0gKHRrZXktPnR4X2l2MzIgPj4gOCkgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDE2KSAmIDB4ZmY7CisJKnBvcysrID0gKHRrZXktPnR4X2l2MzIgPj4gMjQpICYgMHhmZjsKKyNpZm5kZWYgSk9ITl9US0lQCisJaWN2ID0gc2tiX3B1dChza2IsIDQpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIGxlbik7CisjZWxzZQorCWNyYyA9IH5ldGhlcl9jcmNfbGUobGVuLCBwb3MpOworI2VuZGlmCisJaWN2WzBdID0gY3JjOworCWljdlsxXSA9IGNyYyA+PiA4OworCWljdlsyXSA9IGNyYyA+PiAxNjsKKwlpY3ZbM10gPSBjcmMgPj4gMjQ7CisgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWNyeXB0b19jaXBoZXJfc2V0a2V5KHRrZXktPnRmbV9hcmM0LCByYzRrZXksIDE2KTsKKwlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKwlzZy5sZW5ndGggPSBsZW4gKyA0OworCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0a2V5LT50Zm1fYXJjNCwgJnNnLCAmc2csIGxlbiArIDQpOworICAgICAgI2Vsc2UKKwljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0a2V5LT50eF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisgICAgICAgICNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpKQorICAgICAgICAgIHNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworICAgICAgICAgIHNnLmxlbmd0aCA9IGxlbiArIDQ7CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF9vbmUoJnNnLCBwb3MsIGxlbis0KTsKKyAgICAgICAgI2VuZGlmCisJcmV0PSBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZywgJnNnLCBsZW4gKyA0KTsKKyAgICAgICNlbmRpZgorI2VuZGlmCisJdGtleS0+dHhfaXYxNisrOworCWlmICh0a2V5LT50eF9pdjE2ID09IDApIHsKKwkJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAwOworCQl0a2V5LT50eF9pdjMyKys7CisJfQorI2lmbmRlZiBKT0hOX1RLSVAKKyAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDxLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwkgICByZXR1cm4gMDsKKyAgICAgICNlbHNlCisJICAgcmV0dXJuIHJldDsKKyAgICAgICNlbmRpZgorI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2RlY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKyAgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgfHwoSU5fT1BFTlNVU0VfU0xFRCkpCisgICAgICAgIHN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB0a2V5LT5yeF90Zm1fYXJjNH07CisgICAgICAgICNlbmRpZgorCXU4IGtleWlkeCwgKnBvczsKKwl1MzIgaXYzMjsKKwl1MTYgaXYxNjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworI2lmbmRlZiBKT0hOX1RLSVAKKwl1OCBpY3ZbNF07CisJdTMyIGNyYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJdTggcmM0a2V5WzE2XTsKKwlpbnQgcGxlbjsKKyNlbmRpZgorCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyA4ICsgNCkKKwkJcmV0dXJuIC0xOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCWtleWlkeCA9IHBvc1szXTsKKwlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlY2VpdmVkIHBhY2tldCB3aXRob3V0IEV4dElWIgorCQkJICAgICAgICIgZmxhZyBmcm9tICIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlyZXR1cm4gLTI7CisJfQorCWtleWlkeCA+Pj0gNjsKKwlpZiAodGtleS0+a2V5X2lkeCAhPSBrZXlpZHgpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IFJYIHRrZXktPmtleV9pZHg9JWQgZnJhbWUgIgorCQkgICAgICAgImtleWlkeD0lZCBwcml2PSVwXG4iLCB0a2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOworCQlyZXR1cm4gLTY7CisJfQorCWlmICghdGtleS0+a2V5X3NldCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UCisJCQkgICAgICAgIiB3aXRoIGtleWlkPSVkIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvbmZpZ3VyZWQiCisJCQkgICAgICAgIiBrZXlcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCX0KKwkJcmV0dXJuIC0zOworCX0KKwlpdjE2ID0gKHBvc1swXSA8PCA4KSB8IHBvc1syXTsKKwlpdjMyID0gcG9zWzRdIHwgKHBvc1s1XSA8PCA4KSB8IChwb3NbNl0gPDwgMTYpIHwgKHBvc1s3XSA8PCAyNCk7CisJcG9zICs9IDg7CisjaWZuZGVmIEpPSE5fVEtJUAorCisJaWYgKGl2MzIgPCB0a2V5LT5yeF9pdjMyIHx8CisJICAgIChpdjMyID09IHRrZXktPnJ4X2l2MzIgJiYgaXYxNiA8PSB0a2V5LT5yeF9pdjE2KSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogcmVwbGF5IGRldGVjdGVkOiBTVEE9IiBNQUNfRk1UCisJCQkgICAgICAgIiBwcmV2aW91cyBUU0MgJTA4eCUwNHggcmVjZWl2ZWQgVFNDICIKKwkJCSAgICAgICAiJTA4eCUwNHhcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksCisJCQkgICAgICAgdGtleS0+cnhfaXYzMiwgdGtleS0+cnhfaXYxNiwgaXYzMiwgaXYxNik7CisJCX0KKwkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5cysrOworCQlyZXR1cm4gLTQ7CisJfQorCisJaWYgKGl2MzIgIT0gdGtleS0+cnhfaXYzMiB8fCAhdGtleS0+cnhfcGhhc2UxX2RvbmUpIHsKKwkJdGtpcF9taXhpbmdfcGhhc2UxKHRrZXktPnJ4X3R0YWssIHRrZXktPmtleSwgaGRyLT5hZGRyMiwgaXYzMik7CisJCXRrZXktPnJ4X3BoYXNlMV9kb25lID0gMTsKKwl9CisJdGtpcF9taXhpbmdfcGhhc2UyKHJjNGtleSwgdGtleS0+a2V5LCB0a2V5LT5yeF90dGFrLCBpdjE2KTsKKworCXBsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSAxMjsKKyAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8S0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkodGtleS0+dGZtX2FyYzQsIHJjNGtleSwgMTYpOworCXNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKwlzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworCXNnLmxlbmd0aCA9IHBsZW4gKyA0OworCWNyeXB0b19jaXBoZXJfZGVjcnlwdCh0a2V5LT50Zm1fYXJjNCwgJnNnLCAmc2csIHBsZW4gKyA0KTsKKwkjZWxzZQorCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRrZXktPnJ4X3RmbV9hcmM0LCByYzRrZXksIDE2KTsKKyAgICAgICAgI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8S0VSTkVMX1ZFUlNJT04oMiw2LDI0KSkKKyAgICAgICAgICBzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisgICAgICAgICAgc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5sZW5ndGggPSBwbGVuICsgNDsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICBzZ19pbml0X29uZSgmc2csIHBvcywgcGxlbis0KTsKKyAgICAgICAgI2VuZGlmCisJaWYgKGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgJnNnLCAmc2csIHBsZW4gKyA0KSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiOiBUS0lQOiBmYWlsZWQgdG8gZGVjcnlwdCAiCisJCQkgICAgICAgInJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVCAiXG4iLAorCQkJICAgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCXJldHVybiAtNzsKKwl9CisJI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBwbGVuKTsKKyNlbHNlCisJY3JjID0gfmV0aGVyX2NyY19sZShwbGVuLCBwb3MpOworI2VuZGlmCisJaWN2WzBdID0gY3JjOworCWljdlsxXSA9IGNyYyA+PiA4OworCWljdlsyXSA9IGNyYyA+PiAxNjsKKwlpY3ZbM10gPSBjcmMgPj4gMjQ7CisJaWYgKG1lbWNtcChpY3YsIHBvcyArIHBsZW4sIDQpICE9IDApIHsKKwkJaWYgKGl2MzIgIT0gdGtleS0+cnhfaXYzMikgeworCQkJLyogUHJldmlvdXNseSBjYWNoZWQgUGhhc2UxIHJlc3VsdCB3YXMgYWxyZWFkeSBsb3N0LCBzbworCQkJICogaXQgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkIGZvciB0aGUgbmV4dCBwYWNrZXQuICovCisJCQl0a2V5LT5yeF9waGFzZTFfZG9uZSA9IDA7CisJCX0KKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IElDViBlcnJvciBkZXRlY3RlZDogU1RBPSIKKwkJCSAgICAgICBNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUElDVkVycm9ycysrOworCQlyZXR1cm4gLTU7CisJfQorCisjZW5kaWYgCS8qIEpPSE5fVEtJUCAqLworCisJLyogVXBkYXRlIHJlYWwgY291bnRlcnMgb25seSBhZnRlciBNaWNoYWVsIE1JQyB2ZXJpZmljYXRpb24gaGFzCisJICogY29tcGxldGVkICovCisJdGtleS0+cnhfaXYzMl9uZXcgPSBpdjMyOworCXRrZXktPnJ4X2l2MTZfbmV3ID0gaXYxNjsKKworCS8qIFJlbW92ZSBJViBhbmQgSUNWICovCisJbWVtbW92ZShza2ItPmRhdGEgKyA4LCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgOCk7CisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOworCisvL2pvaG4ncyB0ZXN0CisjaWZkZWYgSk9ITl9EVU1QCitpZiggKCh1MTYqKXNrYi0+ZGF0YSlbMF0gJiAweDQwMDApeworICAgICAgICBwcmludGsoIkBAIHJ4IGRlY3J5cHRlZCBza2ItPmRhdGEiKTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTA7aTxza2ItPmxlbjtpKyspeworICAgICAgICAgICAgICAgIGlmKCAoaSUyNCk9PTAgKSBwcmludGsoIlxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlMnggIiwgKCh1OCopc2tiLT5kYXRhKVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRrKCJcbiIpOworfQorI2VuZGlmIC8qSk9ITl9EVU1QKi8KKwlyZXR1cm4ga2V5aWR4OworfQorCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghSU5fT1BFTlNVU0VfU0xFRCkpCitzdGF0aWMgaW50IG1pY2hhZWxfbWljKHN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5LCB1OCAqa2V5LCB1OCAqaGRyLAorCQkgICAgICAgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1pYykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CisJaW50IHJldD0wOworI2VuZGlmCisJaWYgKHRrZXktPnRmbV9taWNoYWVsID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWljaGFlbF9taWM6IHRmbV9taWNoYWVsID09IE5VTExcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaGRyKTsKKwlzZ1swXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShoZHIpOworCXNnWzBdLmxlbmd0aCA9IDE2OworCisJc2dbMV0ucGFnZSA9IHZpcnRfdG9fcGFnZShkYXRhKTsKKwlzZ1sxXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShkYXRhKTsKKwlzZ1sxXS5sZW5ndGggPSBkYXRhX2xlbjsKKworCS8vY3J5cHRvX2RpZ2VzdF9pbml0KHRrZXktPnRmbV9taWNoYWVsKTsKKwkvL2NyeXB0b19kaWdlc3Rfc2V0a2V5KHRrZXktPnRmbV9taWNoYWVsLCBrZXksIDgpOworCS8vY3J5cHRvX2RpZ2VzdF91cGRhdGUodGtleS0+dGZtX21pY2hhZWwsIHNnLCAyKTsKKwkvL2NyeXB0b19kaWdlc3RfZmluYWwodGtleS0+dGZtX21pY2hhZWwsIG1pYyk7CisKKwkvL3JldHVybiAwOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwljcnlwdG9fZGlnZXN0X2luaXQodGtleS0+dGZtX21pY2hhZWwpOworCWNyeXB0b19kaWdlc3Rfc2V0a2V5KHRrZXktPnRmbV9taWNoYWVsLCBrZXksIDgpOworCWNyeXB0b19kaWdlc3RfdXBkYXRlKHRrZXktPnRmbV9taWNoYWVsLCBzZywgMik7CisJY3J5cHRvX2RpZ2VzdF9maW5hbCh0a2V5LT50Zm1fbWljaGFlbCwgbWljKTsKKworCXJldHVybiAwOworI2Vsc2UKK2lmIChjcnlwdG9faGFzaF9zZXRrZXkodGtleS0+dGZtX21pY2hhZWwsIGtleSwgOCkpCisJCXJldHVybiAtMTsKKworLy8JcmV0dXJuIDA7CisJZGVzYy50Zm0gPSB0a2V5LT50Zm1fbWljaGFlbDsKKwlkZXNjLmZsYWdzID0gMDsKKwlyZXQgPSBjcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsIHNnLCBkYXRhX2xlbiArIDE2LCBtaWMpOworCXJldHVybiByZXQ7CisjZW5kaWYKK30KKyNlbHNlCitzdGF0aWMgaW50IG1pY2hhZWxfbWljKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtX21pY2hhZWwsIHU4ICoga2V5LCB1OCAqIGhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgdTggKiBkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICogbWljKQoreworICAgICAgICBzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CisgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKKworICAgICAgICBpZiAodGZtX21pY2hhZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCisgICAgICAgICAgc2dbMF0ucGFnZSA9IHZpcnRfdG9fcGFnZShoZHIpOworICAgICAgICAgIHNnWzBdLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGhkcik7CisgICAgICAgICAgc2dbMF0ubGVuZ3RoID0gMTY7CisgICAgICAgICAgc2dbMV0ucGFnZSA9IHZpcnRfdG9fcGFnZShkYXRhKTsKKyAgICAgICAgICBzZ1sxXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShkYXRhKTsKKyAgICAgICAgICBzZ1sxXS5sZW5ndGggPSBkYXRhX2xlbjsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICBzZ19pbml0X3RhYmxlKHNnLCAyKTsKKyAgICAgICAgICBzZ19zZXRfYnVmKCZzZ1swXSwgaGRyLCAxNik7CisgICAgICAgICAgc2dfc2V0X2J1Zigmc2dbMV0sIGRhdGEsIGRhdGFfbGVuKTsKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgaWYgKGNyeXB0b19oYXNoX3NldGtleSh0Zm1fbWljaGFlbCwga2V5LCA4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZGVzYy50Zm0gPSB0Zm1fbWljaGFlbDsKKyAgICAgICAgZGVzYy5mbGFncyA9IDA7CisgICAgICAgIHJldHVybiBjcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsIHNnLCBkYXRhX2xlbiArIDE2LCBtaWMpOworfQorI2VuZGlmCisKKworCitzdGF0aWMgdm9pZCBtaWNoYWVsX21pY19oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmhkcikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyMTE7CisKKwloZHIxMSA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJc3dpdGNoIChsZTE2X3RvX2NwdShoZHIxMS0+ZnJhbWVfY3RsKSAmCisJCShJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKSkgeworCWNhc2UgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIzLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHIyLCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTOgorCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjEsIEVUSF9BTEVOKTsgLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsgLyogU0EgKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsgLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjQsIEVUSF9BTEVOKTsgLyogU0EgKi8KKwkJYnJlYWs7CisJY2FzZSAwOgorCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjEsIEVUSF9BTEVOKTsgLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjIsIEVUSF9BTEVOKTsgLyogU0EgKi8KKwkJYnJlYWs7CisJfQorCisJaGRyWzEyXSA9IDA7IC8qIHByaW9yaXR5ICovCisKKwloZHJbMTNdID0gaGRyWzE0XSA9IGhkclsxNV0gPSAwOyAvKiByZXNlcnZlZCAqLworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX21pY2hhZWxfbWljX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJdTggKnBvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IDggfHwgc2tiLT5sZW4gPCBoZHJfbGVuKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJJbnZhbGlkIHBhY2tldCBmb3IgTWljaGFlbCBNSUMgYWRkICIKKwkJICAgICAgICIodGFpbHJvb209JWQgaGRyX2xlbj0lZCBza2ItPmxlbj0lZClcbiIsCisJCSAgICAgICBza2JfdGFpbHJvb20oc2tiKSwgaGRyX2xlbiwgc2tiLT5sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJbWljaGFlbF9taWNfaGRyKHNrYiwgdGtleS0+dHhfaGRyKTsKKworCS8vIHsgZGF2aWQsIDIwMDYuOS4xCisJLy8gZml4IHRoZSB3cGEgcHJvY2VzcyB3aXRoIHdtbSBlbmFibGVkLgorCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJCXRrZXktPnR4X2hkclsxMl0gPSAqKHNrYi0+ZGF0YSArIGhkcl9sZW4gLSAyKSAmIDB4MDc7CisJfQorCS8vIH0KKwlwb3MgPSBza2JfcHV0KHNrYiwgOCk7CisgICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJaWYgKG1pY2hhZWxfbWljKHRrZXksICZ0a2V5LT5rZXlbMTZdLCB0a2V5LT50eF9oZHIsCisJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBwb3MpKQorICAgICAgICAjZWxzZQorICAgICAgICBpZiAobWljaGFlbF9taWModGtleS0+dHhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMTZdLCB0a2V5LT50eF9oZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBwb3MpKQorICAgICAgICAjZW5kaWYKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAorc3RhdGljIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCQkgICAgICAgaW50IGtleWlkeCkKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlIGV2OworCisJLyogVE9ETzogbmVlZGVkIHBhcmFtZXRlcnM6IGNvdW50LCBrZXlpZCwga2V5IHR5cGUsIFRTQyAqLworCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOworCWV2LmZsYWdzID0ga2V5aWR4ICYgSVdfTUlDRkFJTFVSRV9LRVlfSUQ7CisJaWYgKGhkci0+YWRkcjFbMF0gJiAweDAxKQorCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX0dST1VQOworCWVsc2UKKwkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKKwlldi5zcmNfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGV2LnNyY19hZGRyLnNhX2RhdGEsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZihldik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZNSUNIQUVMTUlDRkFJTFVSRSwgJndycXUsIChjaGFyICopICZldik7Cit9CisjZWxpZiBXSVJFTEVTU19FWFQgPj0gMTUKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkJICAgICAgIGludCBrZXlpZHgpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWNoYXIgYnVmWzEyOF07CisKKwkvKiBUT0RPOiBuZWVkZWQgcGFyYW1ldGVyczogY291bnQsIGtleWlkLCBrZXkgdHlwZSwgVFNDICovCisJc3ByaW50ZihidWYsICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24oa2V5aWQ9JWQgJXNjYXN0IGFkZHI9IgorCQlNQUNfRk1UICIpIiwga2V5aWR4LCBoZHItPmFkZHIxWzBdICYgMHgwMSA/ICJicm9hZCIgOiAidW5pIiwKKwkJTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7Cit9CisjZWxzZSAvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJCQkgICAgICBpbnQga2V5aWR4KQoreworfQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX21pY2hhZWxfbWljX3ZlcmlmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LAorCQkJCSAgICAgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCXU4IG1pY1s4XTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKworCWlmICghdGtleS0+a2V5X3NldCkKKwkJcmV0dXJuIC0xOworCisJbWljaGFlbF9taWNfaGRyKHNrYiwgdGtleS0+cnhfaGRyKTsKKwkvLyB7IGRhdmlkLCAyMDA2LjkuMQorCS8vIGZpeCB0aGUgd3BhIHByb2Nlc3Mgd2l0aCB3bW0gZW5hYmxlZC4KKwlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCQl0a2V5LT5yeF9oZHJbMTJdID0gKihza2ItPmRhdGEgKyBoZHJfbGVuIC0gMikgJiAweDA3OworCX0KKwkvLyB9CisgICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJaWYgKG1pY2hhZWxfbWljKHRrZXksICZ0a2V5LT5rZXlbMjRdLCB0a2V5LT5yeF9oZHIsCisJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBtaWMpKQorICAgICAgICAjZWxzZQorCWlmIChtaWNoYWVsX21pYyh0a2V5LT5yeF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsyNF0sIHRrZXktPnJ4X2hkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIG1pYykpCisgICAgICAgICNlbmRpZgorICAgICAgICAgICAgCXJldHVybiAtMTsKKwlpZiAobWVtY21wKG1pYywgc2tiLT5kYXRhICsgc2tiLT5sZW4gLSA4LCA4KSAhPSAwKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCBmb3IgIgorCQkgICAgICAgIk1TRFUgZnJvbSAiIE1BQ19GTVQgIiBrZXlpZHg9JWRcbiIsCisJCSAgICAgICBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIk4vQSIsIE1BQ19BUkcoaGRyLT5hZGRyMiksCisJCSAgICAgICBrZXlpZHgpOworCQlpZiAoc2tiLT5kZXYpCisJCQlpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShza2ItPmRldiwgaGRyLCBrZXlpZHgpOworCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBVcGRhdGUgVFNDIGNvdW50ZXJzIGZvciBSWCBub3cgdGhhdCB0aGUgcGFja2V0IHZlcmlmaWNhdGlvbiBoYXMKKwkgKiBjb21wbGV0ZWQuICovCisJdGtleS0+cnhfaXYzMiA9IHRrZXktPnJ4X2l2MzJfbmV3OworCXRrZXktPnJ4X2l2MTYgPSB0a2V5LT5yeF9pdjE2X25ldzsKKworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA4KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCWludCBrZXlpZHg7CisJI2lmICgoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IHRrZXktPnRmbV9taWNoYWVsOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0yID0gdGtleS0+dGZtX2FyYzQ7CisJI2Vsc2UKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSA9IHRrZXktPnR4X3RmbV9taWNoYWVsOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0yID0gdGtleS0+dHhfdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b19oYXNoICp0Zm0zID0gdGtleS0+cnhfdGZtX21pY2hhZWw7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTQgPSB0a2V5LT5yeF90Zm1fYXJjNDsKKwkjZW5kaWYKKworCWtleWlkeCA9IHRrZXktPmtleV9pZHg7CisJbWVtc2V0KHRrZXksIDAsIHNpemVvZigqdGtleSkpOworCXRrZXktPmtleV9pZHggPSBrZXlpZHg7CisKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCXRrZXktPnRmbV9taWNoYWVsID0gdGZtOworCXRrZXktPnRmbV9hcmM0ID0gdGZtMjsKKyAgICAgICAjZWxzZQorCXRrZXktPnR4X3RmbV9taWNoYWVsID0gdGZtOworCXRrZXktPnR4X3RmbV9hcmM0ID0gdGZtMjsKKwl0a2V5LT5yeF90Zm1fbWljaGFlbCA9IHRmbTM7CisJdGtleS0+cnhfdGZtX2FyYzQgPSB0Zm00OworCSNlbmRpZgorCisJaWYgKGxlbiA9PSBUS0lQX0tFWV9MRU4pIHsKKwkJbWVtY3B5KHRrZXktPmtleSwga2V5LCBUS0lQX0tFWV9MRU4pOworCQl0a2V5LT5rZXlfc2V0ID0gMTsKKwkJdGtleS0+dHhfaXYxNiA9IDE7IC8qIFRTQyBpcyBpbml0aWFsaXplZCB0byAxICovCisJCWlmIChzZXEpIHsKKwkJCXRrZXktPnJ4X2l2MzIgPSAoc2VxWzVdIDw8IDI0KSB8IChzZXFbNF0gPDwgMTYpIHwKKwkJCQkoc2VxWzNdIDw8IDgpIHwgc2VxWzJdOworCQkJdGtleS0+cnhfaXYxNiA9IChzZXFbMV0gPDwgOCkgfCBzZXFbMF07CisJCX0KKwl9IGVsc2UgaWYgKGxlbiA9PSAwKQorCQl0a2V5LT5rZXlfc2V0ID0gMDsKKwllbHNlCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCisJaWYgKGxlbiA8IFRLSVBfS0VZX0xFTikKKwkJcmV0dXJuIC0xOworCisJaWYgKCF0a2V5LT5rZXlfc2V0KQorCQlyZXR1cm4gMDsKKwltZW1jcHkoa2V5LCB0a2V5LT5rZXksIFRLSVBfS0VZX0xFTik7CisKKwlpZiAoc2VxKSB7CisJCS8qIFJldHVybiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IHRyYW5zbWl0dGVkIGZyYW1lLiAqLworCQl1MTYgaXYxNiA9IHRrZXktPnR4X2l2MTY7CisJCXUzMiBpdjMyID0gdGtleS0+dHhfaXYzMjsKKwkJaWYgKGl2MTYgPT0gMCkKKwkJCWl2MzItLTsKKwkJaXYxNi0tOworCQlzZXFbMF0gPSB0a2V5LT50eF9pdjE2OworCQlzZXFbMV0gPSB0a2V5LT50eF9pdjE2ID4+IDg7CisJCXNlcVsyXSA9IHRrZXktPnR4X2l2MzI7CisJCXNlcVszXSA9IHRrZXktPnR4X2l2MzIgPj4gODsKKwkJc2VxWzRdID0gdGtleS0+dHhfaXYzMiA+PiAxNjsKKwkJc2VxWzVdID0gdGtleS0+dHhfaXYzMiA+PiAyNDsKKwl9CisKKwlyZXR1cm4gVEtJUF9LRVlfTEVOOworfQorCisKK3N0YXRpYyBjaGFyICogaWVlZTgwMjExX3RraXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtpcCA9IHByaXY7CisJcCArPSBzcHJpbnRmKHAsICJrZXlbJWRdIGFsZz1US0lQIGtleV9zZXQ9JWQgIgorCQkgICAgICJ0eF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgICJyeF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgICJyZXBsYXlzPSVkIGljdl9lcnJvcnM9JWQgbG9jYWxfbWljX2ZhaWx1cmVzPSVkXG4iLAorCQkgICAgIHRraXAtPmtleV9pZHgsIHRraXAtPmtleV9zZXQsCisJCSAgICAgKHRraXAtPnR4X2l2MzIgPj4gMjQpICYgMHhmZiwKKwkJICAgICAodGtpcC0+dHhfaXYzMiA+PiAxNikgJiAweGZmLAorCQkgICAgICh0a2lwLT50eF9pdjMyID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT50eF9pdjMyICYgMHhmZiwKKwkJICAgICAodGtpcC0+dHhfaXYxNiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+dHhfaXYxNiAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MzIgPj4gMjQpICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYzMiA+PiAxNikgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjMyID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT5yeF9pdjMyICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYxNiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+cnhfaXYxNiAmIDB4ZmYsCisJCSAgICAgdGtpcC0+ZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5cywKKwkJICAgICB0a2lwLT5kb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnMsCisJCSAgICAgdGtpcC0+ZG90MTFSU05BU3RhdHNUS0lQTG9jYWxNSUNGYWlsdXJlcyk7CisJcmV0dXJuIHA7Cit9CisKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfdGtpcCA9IHsKKwkubmFtZQkJCT0gIlRLSVAiLAorCS5pbml0CQkJPSBpZWVlODAyMTFfdGtpcF9pbml0LAorCS5kZWluaXQJCQk9IGllZWU4MDIxMV90a2lwX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IGllZWU4MDIxMV90a2lwX2VuY3J5cHQsCisJLmRlY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfdGtpcF9kZWNyeXB0LAorCS5lbmNyeXB0X21zZHUJCT0gaWVlZTgwMjExX21pY2hhZWxfbWljX2FkZCwKKwkuZGVjcnlwdF9tc2R1CQk9IGllZWU4MDIxMV9taWNoYWVsX21pY192ZXJpZnksCisJLnNldF9rZXkJCT0gaWVlZTgwMjExX3RraXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBpZWVlODAyMTFfdGtpcF9nZXRfa2V5LAorCS5wcmludF9zdGF0cwkJPSBpZWVlODAyMTFfdGtpcF9wcmludF9zdGF0cywKKwkuZXh0cmFfcHJlZml4X2xlbgk9IDQgKyA0LCAvKiBJViArIEV4dElWICovCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gOCArIDQsIC8qIE1JQyArIElDViAqLworCS5vd25lcgkJICAgICAgICA9IFRISVNfTU9EVUxFLAorfTsKKworCitpbnQgaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3RraXApOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKQoreworLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworfQorCisjaWYgMAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV90a2lwX251bGwpOworI2Vsc2UKK0VYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV90a2lwX251bGwpOworI2VuZGlmCisjZW5kaWYKKworCisvL21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KTsKKy8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzNkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIFdFUCBlbmNyeXB0aW9uIGltcGxlbWVudGF0aW9uIGZvciBIb3N0IEFQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorICAgICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjZW5kaWYKKy8vI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogV0VQIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBPUEVOU1VTRV9TTEVECisjaWZuZGVmIElOX09QRU5TVVNFX1NMRUQKKyNkZWZpbmUgSU5fT1BFTlNVU0VfU0xFRCAxCisjZW5kaWYKKyNlbmRpZgorCisKK3N0cnVjdCBwcmlzbTJfd2VwX2RhdGEgeworCXUzMiBpdjsKKyNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAxXTsKKwl1OCBrZXlfbGVuOworCXU4IGtleV9pZHg7CisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOworCSNlbHNlCisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnR4X3RmbTsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtOworCSNlbmRpZgorfTsKKworCitzdGF0aWMgdm9pZCAqIHByaXNtMl93ZXBfaW5pdChpbnQga2V5aWR4KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKnByaXY7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPmtleV9pZHggPSBrZXlpZHg7CisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlwcml2LT50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJhcmM0IiwgMCk7CisgICAgIAlpZiAocHJpdi0+dGZtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJZ290byBmYWlsOworCX0KKwkjZWxzZQorCXByaXYtPnR4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT50eF90Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCXByaXYtPnJ4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT5yeF90Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCSNlbmRpZgorCisJLyogc3RhcnQgV0VQIElWIGZyb20gYSByYW5kb20gdmFsdWUgKi8KKwlnZXRfcmFuZG9tX2J5dGVzKCZwcml2LT5pdiwgNCk7CisKKwlyZXR1cm4gcHJpdjsKKworZmFpbDoKKwkvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnRmbSkKKwkJCWNyeXB0b19mcmVlX3RmbShwcml2LT50Zm0pOworCQlrZnJlZShwcml2KTsKKwl9CisgICAgICAgI2Vsc2UKKwlpZiAocHJpdikgeworCQlpZiAocHJpdi0+dHhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbSk7CisJCWlmIChwcml2LT5yeF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtKTsKKwkJa2ZyZWUocHJpdik7CisJfQorCSNlbmRpZgorCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl93ZXBfZGVpbml0KHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqX3ByaXYgPSBwcml2OworCS8vI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlpZiAoX3ByaXYgJiYgX3ByaXYtPnRmbSkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm0pOworCSNlbHNlCisJaWYgKF9wcml2KSB7CisJCWlmIChfcHJpdi0+dHhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT50eF90Zm0pOworCQlpZiAoX3ByaXYtPnJ4X3RmbSkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+cnhfdGZtKTsKKwl9CisgICAgICAgICNlbmRpZgorCWtmcmVlKHByaXYpOworfQorCisKKy8qIFBlcmZvcm0gV0VQIGVuY3J5cHRpb24gb24gZ2l2ZW4gc2tiIHRoYXQgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgb2YgaGVhZHJvb20KKyAqIGZvciBJViBhbmQgNCBieXRlcyBvZiB0YWlscm9vbSBmb3IgSUNWLiBCb3RoIElWIGFuZCBJQ1Ygd2lsbCBiZSB0cmFuc21pdHRlZCwKKyAqIHNvIHRoZSBwYXlsb2FkIGxlbmd0aCBpbmNyZWFzZXMgd2l0aCA4IGJ5dGVzLgorICoKKyAqIFdFUCBmcmFtZSBwYXlsb2FkOiBJViArIFRYIGtleSBpZHgsIFJDNChkYXRhKSwgSUNWID0gUkM0KENSQzMyKGRhdGEpKQorICovCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKXx8KElOX09QRU5TVVNFX1NMRUQpKQorICAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT50eF90Zm19OworI2VuZGlmCisJdTMyIGtsZW4sIGxlbjsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKwl1OCAqcG9zOworI2lmbmRlZiBKT0hOX0hXU0VDCisJdTMyIGNyYzsKKwl1OCAqaWN2OworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKyNlbmRpZgorCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IDQgfHwgc2tiX3RhaWxyb29tKHNrYikgPCA0IHx8CisJICAgIHNrYi0+bGVuIDwgaGRyX2xlbikKKwkJcmV0dXJuIC0xOworCisJbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgNCk7CisJbWVtbW92ZShwb3MsIHBvcyArIDQsIGhkcl9sZW4pOworCXBvcyArPSBoZHJfbGVuOworCisJa2xlbiA9IDMgKyB3ZXAtPmtleV9sZW47CisKKwl3ZXAtPml2Kys7CisKKwkvKiBGbHVocmVyLCBNYW50aW4sIGFuZCBTaGFtaXIgaGF2ZSByZXBvcnRlZCB3ZWFrbmVzc2VzIGluIHRoZSBrZXkKKwkgKiBzY2hlZHVsaW5nIGFsZ29yaXRobSBvZiBSQzQuIEF0IGxlYXN0IElWcyAoS2V5Qnl0ZSArIDMsIDB4ZmYsIE4pCisJICogY2FuIGJlIHVzZWQgdG8gc3BlZWR1cCBhdHRhY2tzLCBzbyBhdm9pZCB1c2luZyB0aGVtLiAqLworCWlmICgod2VwLT5pdiAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB7CisJCXU4IEIgPSAod2VwLT5pdiA+PiAxNikgJiAweGZmOworCQlpZiAoQiA+PSAzICYmIEIgPCBrbGVuKQorCQkJd2VwLT5pdiArPSAweDAxMDA7CisJfQorCisJLyogUHJlcGVuZCAyNC1iaXQgSVYgdG8gUkM0IGtleSBhbmQgVFggZnJhbWUgKi8KKwkqcG9zKysgPSBrZXlbMF0gPSAod2VwLT5pdiA+PiAxNikgJiAweGZmOworCSpwb3MrKyA9IGtleVsxXSA9ICh3ZXAtPml2ID4+IDgpICYgMHhmZjsKKwkqcG9zKysgPSBrZXlbMl0gPSB3ZXAtPml2ICYgMHhmZjsKKwkqcG9zKysgPSB3ZXAtPmtleV9pZHggPDwgNjsKKworCS8qIENvcHkgcmVzdCBvZiB0aGUgV0VQIGtleSAodGhlIHNlY3JldCBwYXJ0KSAqLworCW1lbWNweShrZXkgKyAzLCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworI2lmbmRlZiBKT0hOX0hXU0VDCisJLyogQXBwZW5kIGxpdHRsZS1lbmRpYW4gQ1JDMzIgYW5kIGVuY3J5cHQgaXQgdG8gcHJvZHVjZSBJQ1YgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOworI2Vsc2UKKwljcmMgPSB+ZXRoZXJfY3JjX2xlKGxlbiwgcG9zKTsKKyNlbmRpZgorCWljdiA9IHNrYl9wdXQoc2tiLCA0KTsKKwlpY3ZbMF0gPSBjcmM7CisJaWN2WzFdID0gY3JjID4+IDg7CisJaWN2WzJdID0gY3JjID4+IDE2OworCWljdlszXSA9IGNyYyA+PiAyNDsKKworICAgICAgICAvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkod2VwLT50Zm0sIGtleSwga2xlbik7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisJc2cubGVuZ3RoID0gbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHQod2VwLT50Zm0sICZzZywgJnNnLCBsZW4gKyA0KTsKKworCXJldHVybiAwOworCSNlbHNlCisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkod2VwLT50eF90Zm0sIGtleSwga2xlbik7CisgICAgICAgICNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpKQorICAgICAgICAgIHNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworICAgICAgICAgIHNnLmxlbmd0aCA9IGxlbiArIDQ7CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF9vbmUoJnNnLCBwb3MsIGxlbis0KTsKKyAgICAgICAgI2VuZGlmCisJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOworCSNlbmRpZgorI2VuZGlmIC8qIEpPSE5fSFdTRUMgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKiBQZXJmb3JtIFdFUCBkZWNyeXB0aW9uIG9uIGdpdmVuIGJ1ZmZlci4gQnVmZmVyIGluY2x1ZGVzIHdob2xlIFdFUCBwYXJ0IG9mCisgKiB0aGUgZnJhbWU6IElWICg0IGJ5dGVzKSwgZW5jcnlwdGVkIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQIGhlYWRlciksCisgKiBJQ1YgKDQgYnl0ZXMpLiBsZW4gaW5jbHVkZXMgYm90aCBJViBhbmQgSUNWLgorICoKKyAqIFJldHVybnMgMCBpZiBmcmFtZSB3YXMgZGVjcnlwdGVkIHN1Y2Nlc3NmdWxseSBhbmQgSUNWIHdhcyBjb3JyZWN0IGFuZCAtMSBvbgorICogZmFpbHVyZS4gSWYgZnJhbWUgaXMgT0ssIElWIGFuZCBJQ1Ygd2lsbCBiZSByZW1vdmVkLgorICovCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworICAgICAgICAvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKXx8KElOX09QRU5TVVNFX1NMRUQpKQorICAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT5yeF90Zm19OworICAgICAgICAjZW5kaWYKKwl1MzIga2xlbiwgcGxlbjsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKwl1OCBrZXlpZHgsICpwb3M7CisjaWZuZGVmIEpPSE5fSFdTRUMKKwl1MzIgY3JjOworCXU4IGljdls0XTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisjZW5kaWYKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCkKKwkJcmV0dXJuIC0xOworCisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlbMF0gPSAqcG9zKys7CisJa2V5WzFdID0gKnBvcysrOworCWtleVsyXSA9ICpwb3MrKzsKKwlrZXlpZHggPSAqcG9zKysgPj4gNjsKKwlpZiAoa2V5aWR4ICE9IHdlcC0+a2V5X2lkeCkKKwkJcmV0dXJuIC0xOworCisJa2xlbiA9IDMgKyB3ZXAtPmtleV9sZW47CisKKwkvKiBDb3B5IHJlc3Qgb2YgdGhlIFdFUCBrZXkgKHRoZSBzZWNyZXQgcGFydCkgKi8KKwltZW1jcHkoa2V5ICsgMywgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CisKKwkvKiBBcHBseSBSQzQgdG8gZGF0YSBhbmQgY29tcHV0ZSBDUkMzMiBvdmVyIGRlY3J5cHRlZCBkYXRhICovCisJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIDg7CisjaWZuZGVmIEpPSE5fSFdTRUMKKy8vI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwljcnlwdG9fY2lwaGVyX3NldGtleSh3ZXAtPnRmbSwga2V5LCBrbGVuKTsKKwlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKwlzZy5sZW5ndGggPSBwbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2RlY3J5cHQod2VwLT50Zm0sICZzZywgJnNnLCBwbGVuICsgNCk7CisjZWxzZQorCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHdlcC0+cnhfdGZtLCBrZXksIGtsZW4pOworICAgICAgICAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCisgICAgICAgICAgc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworICAgICAgICAgIHNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisgICAgICAgICAgc2cubGVuZ3RoID0gcGxlbiArIDQ7CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7CisgICAgICAgICNlbmRpZgorCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpCisJCXJldHVybiAtNzsKKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgcGxlbik7CisjZWxzZQorCWNyYyA9IH5ldGhlcl9jcmNfbGUocGxlbiwgcG9zKTsKKyNlbmRpZgorCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworCisJaWYgKG1lbWNtcChpY3YsIHBvcyArIHBsZW4sIDQpICE9IDApIHsKKwkJLyogSUNWIG1pc21hdGNoIC0gZHJvcCBmcmFtZSAqLworCQlyZXR1cm4gLTI7CisJfQorI2VuZGlmIAkvKiBKT0hOX0hXU0VDICovCisKKwkvKiBSZW1vdmUgSVYgYW5kIElDViAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgNCwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlza2JfcHVsbChza2IsIDQpOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2VwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisKKwlpZiAobGVuIDwgMCB8fCBsZW4gPiBXRVBfS0VZX0xFTikKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KHdlcC0+a2V5LCBrZXksIGxlbik7CisJd2VwLT5rZXlfbGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2VwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisKKwlpZiAobGVuIDwgd2VwLT5rZXlfbGVuKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkoa2V5LCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworCXJldHVybiB3ZXAtPmtleV9sZW47Cit9CisKKworc3RhdGljIGNoYXIgKiBwcmlzbTJfd2VwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVdFUCBsZW49JWRcbiIsCisJCSAgICAgd2VwLT5rZXlfaWR4LCB3ZXAtPmtleV9sZW4pOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3dlcCA9IHsKKwkubmFtZQkJCT0gIldFUCIsCisJLmluaXQJCQk9IHByaXNtMl93ZXBfaW5pdCwKKwkuZGVpbml0CQkJPSBwcmlzbTJfd2VwX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IHByaXNtMl93ZXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBwcmlzbTJfd2VwX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IHByaXNtMl93ZXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0LCAvKiBJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDQsIC8qIElDViAqLworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCisKK2ludCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKK30KKworCit2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKQoreworLy8JcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworfQorI2lmIDAKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd2VwX251bGwpOworI2Vsc2UKK0VYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93ZXBfbnVsbCk7CisjZW5kaWYKKyNlbmRpZgorLy9tb2R1bGVfaW5pdChpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KTsKKy8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5ZmVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtMCwwICsxLDMwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBDb3B5cmlnaHQoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGJhc2VkIG9uIHRoZSBXRVAgZW5hYmxlbWVudCBjb2RlIHByb3ZpZGVkIGJ5IHRoZQorICBIb3N0IEFQIHByb2plY3QgaG9zdGFwLWRyaXZlcnMgdjAuMS4zCisgIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICA8amttYWxpbmVAY2MuaHV0LmZpPgorICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIjgwMi4xMSBkYXRhL21hbmFnZW1lbnQvY29udHJvbCBzdGFjayIpOworTU9EVUxFX0FVVEhPUigiQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnBvcmF0aW9uIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgRFJWX05BTUUgImllZWU4MDIxMSIKKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtzX2FsbG9jYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5uZXR3b3JrcykKKwkJcmV0dXJuIDA7CisKKwlpZWVlLT5uZXR3b3JrcyA9IGttYWxsb2MoCisJCU1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayksCisJCUdGUF9LRVJORUwpOworCWlmICghaWVlZS0+bmV0d29ya3MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBiZWFjb25zXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGllZWUtPm5ldHdvcmtzLCAwLAorCSAgICAgICBNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX25ldHdvcmtzX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKCFpZWVlLT5uZXR3b3JrcykKKwkJcmV0dXJuOworCWtmcmVlKGllZWUtPm5ldHdvcmtzKTsKKwlpZWVlLT5uZXR3b3JrcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbmV0d29ya3NfaW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPm5ldHdvcmtfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9ORVRXT1JLX0NPVU5UOyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJmllZWUtPm5ldHdvcmtzW2ldLmxpc3QsICZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7Cit9CisKKworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSxlcnI7CisKKwlJRUVFODAyMTFfREVCVUdfSU5GTygiSW5pdGlhbGl6aW5nLi4uXG4iKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSkgKyBzaXplb2ZfcHJpdik7CisJaWYgKCFkZXYpIHsKKwkJSUVFRTgwMjExX0VSUk9SKCJVbmFibGUgdG8gbmV0d29yayBkZXZpY2UuXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaWVlZTgwMjExX3htaXQ7CisKKwlpZWVlLT5kZXYgPSBkZXY7CisKKwllcnIgPSBpZWVlODAyMTFfbmV0d29ya3NfYWxsb2NhdGUoaWVlZSk7CisJaWYgKGVycikgeworCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBiZWFjb24gc3RvcmFnZTogJWRcbiIsCisJCQkJZXJyKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWllZWU4MDIxMV9uZXR3b3Jrc19pbml0aWFsaXplKGllZWUpOworCisJLyogRGVmYXVsdCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBpcyBtYXhpbXVtIHBheWxvYWQgc2l6ZSAqLworCWllZWUtPmZ0cyA9IERFRkFVTFRfRlRTOworCWllZWUtPnNjYW5fYWdlID0gREVGQVVMVF9NQVhfU0NBTl9BR0U7CisJaWVlZS0+b3Blbl93ZXAgPSAxOworCisJLyogRGVmYXVsdCB0byBlbmFibGluZyBmdWxsIG9wZW4gV0VQIHdpdGggaG9zdCBiYXNlZCBlbmNyeXB0L2RlY3J5cHQgKi8KKwlpZWVlLT5ob3N0X2VuY3J5cHQgPSAxOworCWllZWUtPmhvc3RfZGVjcnlwdCA9IDE7CisJaWVlZS0+aWVlZTgwMl8xeCA9IDE7IC8qIERlZmF1bHQgdG8gc3VwcG9ydGluZyA4MDIuMXggKi8KKworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCk7CisJaW5pdF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7CisJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyOworCisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2spOworCisJaWVlZS0+d3BheF90eXBlX3NldCA9IDA7CisgCWllZWUtPndwYV9lbmFibGVkID0gMDsKKyAJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSAwOworIAlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gMDsKKyAJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gMDsKKyAJaWVlZS0+aWVlZTgwMl8xeCA9IDE7CisJaWVlZS0+cmF3X3R4ID0gMDsKKworCWllZWU4MDIxMV9zb2Z0bWFjX2luaXQoaWVlZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJmllZWUtPmlic3NfbWFjX2hhc2hbaV0pOworCisJZm9yIChpID0gMDsgaSA8IDE3OyBpKyspIHsKKwkgIGllZWUtPmxhc3RfcnhzZXFfbnVtW2ldID0gLTE7CisJICBpZWVlLT5sYXN0X3J4ZnJhZ19udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcGFja2V0X3RpbWVbaV0gPSAwOworCX0KKy8vVGhlc2UgZnVuY3Rpb24gd2VyZSBhZGRlZCB0byBsb2FkIGNyeXB0ZSBtb2R1bGUgYXV0b2x5CisJaWVlZTgwMjExX3RraXBfbnVsbCgpOworCWllZWU4MDIxMV93ZXBfbnVsbCgpOworCWllZWU4MDIxMV9jY21wX251bGwoKTsKKwlyZXR1cm4gZGV2OworCisgZmFpbGVkOgorCWlmIChkZXYpCisJCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWludCBpOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpxOworCisKKwlpZWVlODAyMTFfc29mdG1hY19mcmVlKGllZWUpOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhpZWVlLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBpZWVlLT5jcnlwdFtpXTsKKwkJaWYgKGNyeXB0KSB7CisJCQlpZiAoY3J5cHQtPm9wcykgeworCQkJCWNyeXB0LT5vcHMtPmRlaW5pdChjcnlwdC0+cHJpdik7CisJCQkJbW9kdWxlX3B1dChjcnlwdC0+b3BzLT5vd25lcik7CisJCQl9CisJCQlrZnJlZShjcnlwdCk7CisJCQlpZWVlLT5jcnlwdFtpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlpZWVlODAyMTFfbmV0d29ya3NfZnJlZShpZWVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRTsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBxLCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpXSkgeworCQkJa2ZyZWUobGlzdF9lbnRyeShwLCBzdHJ1Y3QgaWVlZV9pYnNzX3NlcSwgbGlzdCkpOworCQkJbGlzdF9kZWwocCk7CisJCX0KKwl9CisKKworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKy8vI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKyNpZiAwCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOwordTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbCA9IDA7CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmllZWU4MDIxMV9wcm9jID0gTlVMTDsKKworc3RhdGljIGludCBzaG93X2RlYnVnX2xldmVsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIGNvdW50LCAiMHglMDhYXG4iLCBpZWVlODAyMTFfZGVidWdfbGV2ZWwpOworfQorCitzdGF0aWMgaW50IHN0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbXSA9ICIweDAwMDAwMDAwIjsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IG1pbihzaXplb2YoYnVmKSAtIDEsICh1MzIpY291bnQpOworCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgbGVuKSkKKwkJcmV0dXJuIGNvdW50OworCWJ1ZltsZW5dID0gMDsKKwlpZiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcgfHwgcFswXSA9PSAneCcgfHwgcFswXSA9PSAnWCcpIHsKKwkJcCsrOworCQlpZiAocFswXSA9PSAneCcgfHwgcFswXSA9PSAnWCcpCisJCQlwKys7CisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxNik7CisJfSBlbHNlCisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CisJaWYgKHAgPT0gYnVmKQorCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCSAgICAgICAiOiAlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZQorCQlpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSB2YWw7CisKKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworc3RhdGljIGludCBfX2luaXQgaWVlZTgwMjExX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CisKKwlpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSBkZWJ1ZzsKKwlpZWVlODAyMTFfcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBTX0lGRElSLCBwcm9jX25ldCk7CisJaWYgKGllZWU4MDIxMV9wcm9jID09IE5VTEwpIHsKKwkJSUVFRTgwMjExX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlICIgRFJWX05BTUUKKwkJCQkiIHByb2MgZGlyZWN0b3J5XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWUgPSBjcmVhdGVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgICAgICBpZWVlODAyMTFfcHJvYyk7CisJaWYgKCFlKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBwcm9jX25ldCk7CisJCWllZWU4MDIxMV9wcm9jID0gTlVMTDsKKwkJcmV0dXJuIC1FSU87CisJfQorCWUtPnJlYWRfcHJvYyA9IHNob3dfZGVidWdfbGV2ZWw7CisJZS0+d3JpdGVfcHJvYyA9IHN0b3JlX2RlYnVnX2xldmVsOworCWUtPmRhdGEgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpZWVlODAyMTFfZXhpdCh2b2lkKQoreworCWlmIChpZWVlODAyMTFfcHJvYykgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBpZWVlODAyMTFfcHJvYyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBwcm9jX25ldCk7CisJCWllZWU4MDIxMV9wcm9jID0gTlVMTDsKKwl9Cit9CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG91dHB1dCBtYXNrIik7CisKKworbW9kdWxlX2V4aXQoaWVlZTgwMjExX2V4aXQpOworbW9kdWxlX2luaXQoaWVlZTgwMjExX2luaXQpOworI2VuZGlmCisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGFsbG9jX2llZWU4MDIxMSk7CitFWFBPUlRfU1lNQk9MKGZyZWVfaWVlZTgwMjExKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVjNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTAsMCArMSwxOTcxIEBACisvKgorICogT3JpZ2luYWwgY29kZSBiYXNlZCBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKKyAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMgLSBob3N0YXAubyBtb2R1bGUsIGNvbW1vbiByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBGZXcgbW9kaWZpY2F0aW9ucyBmb3IgUmVhbHRlaydzIFdpLUZpIGRyaXZlcnMgYnkKKyAgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIEEgc3BlY2lhbCB0aGFua3MgZ29lcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0ICEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX21vbml0b3Jfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikKKyAgICAgICAgc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKyNlbHNlCisgICAgICAgIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKyNlbmRpZgorCXNrYl9wdWxsKHNrYiwgaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpKTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxMV9SQVcpOworCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOworCW5ldGlmX3J4KHNrYik7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICoKK2llZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHVuc2lnbmVkIGludCBzZXEsCisJCQkgIHVuc2lnbmVkIGludCBmcmFnLCB1OCB0aWQsdTggKnNyYywgdTggKmRzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTjsgaSsrKSB7CisJCWVudHJ5ID0gJmllZWUtPmZyYWdfY2FjaGVbdGlkXVtpXTsKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBlbnRyeS0+Zmlyc3RfZnJhZ190aW1lICsgMiAqIEhaKSkgeworCQkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoCisJCQkJImV4cGlyaW5nIGZyYWdtZW50IGNhY2hlIGVudHJ5ICIKKwkJCQkic2VxPSV1IGxhc3RfZnJhZz0ldVxuIiwKKwkJCQllbnRyeS0+c2VxLCBlbnRyeS0+bGFzdF9mcmFnKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOworCQkJZW50cnktPnNrYiA9IE5VTEw7CisJCX0KKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmIGVudHJ5LT5zZXEgPT0gc2VxICYmCisJCSAgICAoZW50cnktPmxhc3RfZnJhZyArIDEgPT0gZnJhZyB8fCBmcmFnID09IC0xKSAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5zcmNfYWRkciwgc3JjLCBFVEhfQUxFTikgPT0gMCAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5kc3RfYWRkciwgZHN0LCBFVEhfQUxFTikgPT0gMCkKKwkJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgoraWVlZTgwMjExX2ZyYWdfY2FjaGVfZ2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJdW5zaWduZWQgaW50IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJdW5zaWduZWQgaW50IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICpoZHJfM2FkZHJfUW9TOworCXN0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyAqaGRyXzRhZGRyX1FvUzsKKwl1OCB0aWQ7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwl7CisJCXRpZCA9IChoZHItPmFkZHIyW0VUSF9BTEVOLTJdIF4gaGRyLT5hZGRyMltFVEhfQUxFTi0xXSkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwl9CisJZWxzZQorI2VuZGlmCisJaWYgKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9EU1RPRFMpID09IElFRUU4MDIxMV9GQ1RMX0RTVE9EUykmJklFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl80YWRkcl9Rb1MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRyX1FvUy0+UU9TX2N0bCkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIGlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfM2FkZHJfUW9TID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSB7CisJICB0aWQgPSAwOworCX0KKworCWlmIChmcmFnID09IDApIHsKKwkJLyogUmVzZXJ2ZSBlbm91Z2ggc3BhY2UgdG8gZml0IG1heGltdW0gZnJhbWUgbGVuZ3RoICovCisJCXNrYiA9IGRldl9hbGxvY19za2IoaWVlZS0+ZGV2LT5tdHUgKworCQkJCSAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHIpICsKKwkJCQkgICAgOCAvKiBMTEMgKi8gKworCQkJCSAgICAyIC8qIGFsaWdubWVudCAqLyArCisJCQkJICAgIDggLyogV0VQICovICsKKwkJCQkgICAgRVRIX0FMRU4gLyogV0RTICovICsKKwkJCQkgICAgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYyk/MjowKSAvKiBRT1MgQ29udHJvbCAqLyk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCWVudHJ5ID0gJmllZWUtPmZyYWdfY2FjaGVbdGlkXVtpZWVlLT5mcmFnX25leHRfaWR4W3RpZF1dOworCQlpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0rKzsKKwkJaWYgKGllZWUtPmZyYWdfbmV4dF9pZHhbdGlkXSA+PSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4pCisJCQlpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0gPSAwOworCisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShlbnRyeS0+c2tiKTsKKworCQllbnRyeS0+Zmlyc3RfZnJhZ190aW1lID0gamlmZmllczsKKwkJZW50cnktPnNlcSA9IHNlcTsKKwkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCWVudHJ5LT5za2IgPSBza2I7CisJCW1lbWNweShlbnRyeS0+c3JjX2FkZHIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGVudHJ5LT5kc3RfYWRkciwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCS8qIHJlY2VpdmVkIGEgZnJhZ21lbnQgb2YgYSBmcmFtZSBmb3Igd2hpY2ggdGhlIGhlYWQgZnJhZ21lbnQKKwkJICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlY2VpdmVkICovCisJCWVudHJ5ID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIGZyYWcsIHRpZCxoZHItPmFkZHIyLAorCQkJCQkJICBoZHItPmFkZHIxKTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJCWVudHJ5LT5sYXN0X2ZyYWcgPSBmcmFnOworCQkJc2tiID0gZW50cnktPnNrYjsKKwkJfQorCX0KKworCXJldHVybiBza2I7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgaW50IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJdW5zaWduZWQgaW50IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICpoZHJfM2FkZHJfUW9TOworCXN0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyAqaGRyXzRhZGRyX1FvUzsKKwl1OCB0aWQ7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwl7CisJCXRpZCA9IChoZHItPmFkZHIyW0VUSF9BTEVOLTJdIF4gaGRyLT5hZGRyMltFVEhfQUxFTi0xXSkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwl9CisJZWxzZQorI2VuZGlmCisJaWYoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzRhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKiloZHI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJfUW9TLT5RT1NfY3RsKSAmIElFRUU4MDIxMV9RT1NfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl8zYWRkcl9Rb1MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRyX1FvUy0+UU9TX2N0bCkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIHsKKwkgIHRpZCA9IDA7CisJfQorCisJZW50cnkgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKGllZWUsIHNlcSwgLTEsIHRpZCxoZHItPmFkZHIyLAorCQkJCQkgIGhkci0+YWRkcjEpOworCisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoCisJCQkiY291bGQgbm90IGludmFsaWRhdGUgZnJhZ21lbnQgY2FjaGUgIgorCQkJImVudHJ5IChzZXE9JXUpXG4iLCBzZXEpOworCQlyZXR1cm4gLTE7CisJfQorCisJZW50cnktPnNrYiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiBpZWVlODAyMTFfcnhfZnJhbWVfbWd0bXQKKyAqCisgKiBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgbWFuYWdlbWVudCBjb250cm9sIGZyYW1lcworICoKKyAqIENhbGxlZCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCisJLy8gY2hlYXQgdGhlIHRoZSBoZHIgdHlwZQorCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKworCS8qIE9uIHRoZSBzdHJ1Y3Qgc3RhdHMgZGVmaW5pdGlvbiB0aGVyZSBpcyB3cml0dGVuIHRoYXQKKwkgKiB0aGlzIGlzIG5vdCBtYW5kYXRvcnkuLi4uIGJ1dCBzZWVtcyB0aGF0IHRoZSBwcm9iZQorCSAqIHJlc3BvbnNlIHBhcnNlciB1c2VzIGl0CisJICovCisJcnhfc3RhdHMtPmxlbiA9IHNrYi0+bGVuOworCWllZWU4MDIxMV9yeF9tZ3QoaWVlZSwoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGEscnhfc3RhdHMpOworCisJaWYoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpJiYobWVtY21wKGhkci0+YWRkcjMsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLEVUSF9BTEVOKSkpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoaWVlZSwgc2tiLCByeF9zdGF0cywgdHlwZSwgc3R5cGUpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCXJldHVybiAwOworCisJI2lmZGVmIE5PVF9ZRVQKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1hc3RlciBtb2RlIG5vdCB5ZXQgc3VwcHBvcnRlZC5cbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKy8qCisgIGhvc3RhcF91cGRhdGVfc3RhX3BzKGllZWUsIChzdHJ1Y3QgaG9zdGFwX2llZWU4MDIxMV9oZHIgKikKKyAgc2tiLT5kYXRhKTsqLworCX0KKworCWlmIChpZWVlLT5ob3N0YXBkICYmIHR5cGUgPT0gSUVFRTgwMjExX1RZUEVfTUdNVCkgeworCQlpZiAoc3R5cGUgPT0gV0xBTl9GQ19TVFlQRV9CRUFDT04gJiYKKwkJICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IyOworCQkJLyogUHJvY2VzcyBiZWFjb24gZnJhbWVzIGFsc28gaW4ga2VybmVsIGRyaXZlciB0bworCQkJICogdXBkYXRlIFNUQShBUCkgdGFibGUgc3RhdGlzdGljcyAqLworCQkJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYjIpCisJCQkJaG9zdGFwX3J4KHNrYjItPmRldiwgc2tiMiwgcnhfc3RhdHMpOworCQl9CisKKwkJLyogc2VuZCBtYW5hZ2VtZW50IGZyYW1lcyB0byB0aGUgdXNlciBzcGFjZSBkYWVtb24gZm9yCisJCSAqIHByb2Nlc3NpbmcgKi8KKwkJaWVlZS0+YXBkZXZzdGF0cy5yeF9wYWNrZXRzKys7CisJCWllZWUtPmFwZGV2c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXByaXNtMl9yeF84MDIxMShpZWVlLT5hcGRldiwgc2tiLCByeF9zdGF0cywgUFJJU00yX1JYX01HTVQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkgICAgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJaWYgKHR5cGUgIT0gV0xBTl9GQ19UWVBFX01HTVQgJiYgdHlwZSAhPSBXTEFOX0ZDX1RZUEVfQ1RSTCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmtub3duIG1hbmFnZW1lbnQgZnJhbWUgIgorCQkJICAgICAgICIodHlwZT0weCUwMngsIHN0eXBlPTB4JTAyeCkgZHJvcHBlZFxuIiwKKwkJCSAgICAgICBza2ItPmRldi0+bmFtZSwgdHlwZSwgc3R5cGUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaG9zdGFwX3J4KHNrYi0+ZGV2LCBza2IsIHJ4X3N0YXRzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBob3N0YXBfcnhfZnJhbWVfbWdtdDogbWFuYWdlbWVudCBmcmFtZSAiCisJICAgICAgICJyZWNlaXZlZCBpbiBub24tSG9zdCBBUCBtb2RlXG4iLCBza2ItPmRldi0+bmFtZSk7CisJcmV0dXJuIC0xOworCSNlbmRpZgorfQorCisKKworLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KKy8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByZmMxMDQyX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworLyogQnJpZGdlLVR1bm5lbCBoZWFkZXIgKGZvciBFdGhlclR5cGVzIEVUSF9QX0FBUlAgYW5kIEVUSF9QX0lQWCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJyaWRnZV90dW5uZWxfaGVhZGVyW10gPQoreyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CisvKiBObyBlbmNhcHN1bGF0aW9uIGhlYWRlciBpZiBFdGhlclR5cGUgPCAweDYwMCAoPWxlbmd0aCkgKi8KKworLyogQ2FsbGVkIGJ5IGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0ICovCitzdGF0aWMgaW50IGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2l6ZV90IGhkcmxlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXUxNiBmYywgZXRoZXJ0eXBlOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJdTggKnBvczsKKworCWlmIChza2ItPmxlbiA8IDI0KQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwkvKiBjaGVjayB0aGF0IHRoZSBmcmFtZSBpcyB1bmljYXN0IGZyYW1lIHRvIHVzICovCisJaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkgICAgSUVFRTgwMjExX0ZDVExfVE9EUyAmJgorCSAgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDAgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjMsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCS8qIFRvRFMgZnJhbWUgd2l0aCBvd24gYWRkciBCU1NJRCBhbmQgREEgKi8KKwl9IGVsc2UgaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkJICAgSUVFRTgwMjExX0ZDVExfRlJPTURTICYmCisJCSAgIG1lbWNtcChoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBGcm9tRFMgZnJhbWUgd2l0aCBvd24gYWRkciBhcyBEQSAqLworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCWlmIChza2ItPmxlbiA8IDI0ICsgOCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGVjayBmb3IgcG9ydCBhY2Nlc3MgZW50aXR5IEV0aGVybmV0IHR5cGUgKi8KKy8vCXBvcyA9IHNrYi0+ZGF0YSArIDI0OworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKKwlldGhlcnR5cGUgPSAocG9zWzZdIDw8IDgpIHwgcG9zWzddOworCWlmIChldGhlcnR5cGUgPT0gRVRIX1BfUEFFKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IGllZWU4MDIxMV9yeCAqLworc3RhdGljIGlubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCWludCByZXMsIGhkcmxlbjsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiAoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9nZXRfaGRybGVuKSkKKwl7CisJCWhkcmxlbiA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbihpZWVlLCBza2IpOworCX0KKwllbHNlCisjZW5kaWYKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQCisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCisJICAgIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgInJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVCAiXG4iLAorCQkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1KHNrYiwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkiZGVjcnlwdGlvbiBmYWlsZWQgKFNBPSIgTUFDX0ZNVAorCQkJIikgcmVzPSVkXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCByZXMpOworCQlpZiAocmVzID09IC0yKQorCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIkRlY3J5cHRpb24gZmFpbGVkIElDViAiCisJCQkJCSAgICAgIm1pc21hdGNoIChrZXkgJWQpXG4iLAorCQkJCQkgICAgIHNrYi0+ZGF0YVtoZHJsZW4gKyAzXSA+PiA2KTsKKwkJaWVlZS0+aWVlZV9zdGF0cy5yeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J4ICovCitzdGF0aWMgaW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgaW50IGtleWlkeCwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCWludCByZXMsIGhkcmxlbjsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiAoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9nZXRfaGRybGVuKSkKKwl7CisJCWhkcmxlbiA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbihpZWVlLCBza2IpOworCX0KKwllbHNlCisjZW5kaWYKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1KHNrYiwga2V5aWR4LCBoZHJsZW4sIGNyeXB0LT5wcml2KTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1TRFUgZGVjcnlwdGlvbi9NSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCIKKwkJICAgICAgICIgKFNBPSIgTUFDX0ZNVCAiIGtleWlkeD0lZClcbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHN0b2xlbiBmcm9tIGlwdzIyMDAgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRV9QQUNLRVRfUkVUUllfVElNRSAoNSpIWikKK3N0YXRpYyBpbnQgaXNfZHVwbGljYXRlX3BhY2tldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQoreworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKTsKKwl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZWFkZXItPnNlcV9jdGwpOworCXUxNiBzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwl1MTYgZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKwl1MTYgKmxhc3Rfc2VxLCAqbGFzdF9mcmFnOworCXVuc2lnbmVkIGxvbmcgKmxhc3RfdGltZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKmhkcl8zYWRkcl9Rb1M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TICpoZHJfNGFkZHJfUW9TOworCXU4IHRpZDsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCXsKKwkJdGlkID0gKGhlYWRlci0+YWRkcjJbRVRIX0FMRU4tMl0gXiBoZWFkZXItPmFkZHIyW0VUSF9BTEVOLTFdKSAmIElFRUU4MDIxMV9RT1NfVElEOworCX0KKwllbHNlCisjZW5kaWYKKwkvL1RPMkRTIGFuZCBRb1MKKwlpZigoKGZjICYgSUVFRTgwMjExX0ZDVExfRFNUT0RTKSA9PSBJRUVFODAyMTFfRkNUTF9EU1RPRFMpJiZJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfNGFkZHJfUW9TID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyAqKWhlYWRlcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl80YWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSBpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7IC8vUW9TCisJICBoZHJfM2FkZHJfUW9TID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyopaGVhZGVyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRyX1FvUy0+UU9TX2N0bCkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIHsgLy8gbm8gUW9TCisJICB0aWQgPSAwOworCX0KKwlzd2l0Y2ggKGllZWUtPml3X21vZGUpIHsKKwljYXNlIElXX01PREVfQURIT0M6CisJeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCQlzdHJ1Y3QgaWVlZV9pYnNzX3NlcSAqZW50cnkgPSBOVUxMOworCQl1OCAqbWFjID0gaGVhZGVyLT5hZGRyMjsKKwkJaW50IGluZGV4ID0gbWFjWzVdICUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7CisJCS8vZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHBvcy0+bmV4dCkKKwkJX19saXN0X2Zvcl9lYWNoKHAsICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSkgeworCQkJZW50cnkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBpZWVlX2lic3Nfc2VxLCBsaXN0KTsKKwkJCWlmICghbWVtY21wKGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pKQorCQkJCWJyZWFrOworCQl9CisJLy8JaWYgKG1lbWNtcChlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKSl7CisJCWlmIChwID09ICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSkgeworCQkJZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZV9pYnNzX3NlcSksIEdGUF9BVE9NSUMpOworCQkJaWYgKCFlbnRyeSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbm5vdCBtYWxsb2MgbmV3IG1hYyBlbnRyeVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltZW1jcHkoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTik7CisJCQllbnRyeS0+c2VxX251bVt0aWRdID0gc2VxOworCQkJZW50cnktPmZyYWdfbnVtW3RpZF0gPSBmcmFnOworCQkJZW50cnktPnBhY2tldF90aW1lW3RpZF0gPSBqaWZmaWVzOworCQkJbGlzdF9hZGQoJmVudHJ5LT5saXN0LCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGFzdF9zZXEgPSAmZW50cnktPnNlcV9udW1bdGlkXTsKKwkJbGFzdF9mcmFnID0gJmVudHJ5LT5mcmFnX251bVt0aWRdOworCQlsYXN0X3RpbWUgPSAmZW50cnktPnBhY2tldF90aW1lW3RpZF07CisJCWJyZWFrOworCX0KKworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJbGFzdF9zZXEgPSAmaWVlZS0+bGFzdF9yeHNlcV9udW1bdGlkXTsKKwkJbGFzdF9mcmFnID0gJmllZWUtPmxhc3RfcnhmcmFnX251bVt0aWRdOworCQlsYXN0X3RpbWUgPSAmaWVlZS0+bGFzdF9wYWNrZXRfdGltZVt0aWRdOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCQlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCQl7CisJCQlsYXN0X3NlcSA9ICZpZWVlLT5sYXN0X3J4c2VxX251bVt0aWRdOworCQkJbGFzdF9mcmFnID0gJmllZWUtPmxhc3RfcnhmcmFnX251bVt0aWRdOworCQkJbGFzdF90aW1lID0gJmllZWUtPmxhc3RfcGFja2V0X3RpbWVbdGlkXTsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKy8vCWlmKHRpZCAhPSAwKSB7CisvLwkJcHJpbnRrKEtFUk5fV0FSTklORyAiOikpKSkpKSkpKSkpJXggJXggJXgsIGZjKCV4KVxuIiwgdGlkLCAqbGFzdF9zZXEsIHNlcSwgaGVhZGVyLT5mcmFtZV9jdGwpOworLy8JfQorCWlmICgoKmxhc3Rfc2VxID09IHNlcSkgJiYKKwkgICAgdGltZV9hZnRlcigqbGFzdF90aW1lICsgSUVFRV9QQUNLRVRfUkVUUllfVElNRSwgamlmZmllcykpIHsKKwkJaWYgKCpsYXN0X2ZyYWcgPT0gZnJhZyl7CisJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlsxXSBnbyBkcm9wIVxuIik7CisJCQlnb3RvIGRyb3A7CisKKwkJfQorCQlpZiAoKmxhc3RfZnJhZyArIDEgIT0gZnJhZykKKwkJCS8qIG91dC1vZi1vcmRlciBmcmFnbWVudCAqLworCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMl0gZ28gZHJvcCFcbiIpOworCQkJZ290byBkcm9wOworCX0gZWxzZQorCQkqbGFzdF9zZXEgPSBzZXE7CisKKwkqbGFzdF9mcmFnID0gZnJhZzsKKwkqbGFzdF90aW1lID0gamlmZmllczsKKwlyZXR1cm4gMDsKKworZHJvcDoKKy8vCUJVR19PTighKGZjICYgSUVFRTgwMjExX0ZDVExfUkVUUlkpKTsKKy8vCXByaW50aygiRFVQXG4iKTsKKworCXJldHVybiAxOworfQorCisKKy8qIEFsbCByZWNlaXZlZCBmcmFtZXMgYXJlIHNlbnQgdG8gdGhpcyBmdW5jdGlvbi4gQHNrYiBjb250YWlucyB0aGUgZnJhbWUgaW4KKyAqIElFRUUgODAyLjExIGZvcm1hdCwgaS5lLiwgaW4gdGhlIGZvcm1hdCBpdCB3YXMgc2VudCBvdmVyIGFpci4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLiAqLworaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwkvL3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqaGRyOworCisJc2l6ZV90IGhkcmxlbjsKKwl1MTYgZmMsIHR5cGUsIHN0eXBlLCBzYzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJdW5zaWduZWQgaW50IGZyYWc7CisJdTggKnBheWxvYWQ7CisJdTE2IGV0aGVydHlwZTsKKyNpZmRlZiBOT1RfWUVUCisJc3RydWN0IG5ldF9kZXZpY2UgKndkcyA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICp3ZHMgPSBOVUxMOworCWludCBmcmFtZV9hdXRob3JpemVkID0gMDsKKwlpbnQgZnJvbV9hc3NvY19hcCA9IDA7CisJdm9pZCAqc3RhID0gTlVMTDsKKyNlbmRpZgorLy8JdTE2IFFPU19jdGwgPSAwOworCXU4IGRzdFtFVEhfQUxFTl07CisJdTggc3JjW0VUSF9BTEVOXTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCA9IE5VTEw7CisJaW50IGtleWlkeCA9IDA7CisKKwkvL0FkZGVkIGZvciBtZXNoIGJ5IExhd3JlbmNlLgorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwl1OCBzdGF0dXM7CisJdTMyIGZsYWdzOworI2VuZGlmCisJLy8gY2hlYXQgdGhlIHRoZSBoZHIgdHlwZQorCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlzdGF0cyA9ICZpZWVlLT5zdGF0czsKKworCWlmIChza2ItPmxlbiA8IDEwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTS0IgbGVuZ3RoIDwgMTBcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCXN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmMpOworCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKworCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisKKy8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZQorCWlmKChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpICE9IElFRUU4MDIxMV9GQ1RMX1RPRFMpCisJeworCQlpZighbWVtY21wKGhkci0+YWRkcjEsZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKQorCQl7CisJCQlpZWVlLT5OdW1SeFVuaWNhc3QrKzsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZighbWVtY21wKGhkci0+YWRkcjMsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKKwkJeworCQkJaWVlZS0+TnVtUnhVbmljYXN0Kys7CisJCX0KKwl9CisvL1lKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUsZW5kCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIChpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX2dldF9oZHJsZW4pKQorCXsKKwkJaGRybGVuID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9nZXRfaGRybGVuKGllZWUsIHNrYik7CisJCWlmKHNrYi0+bGVuIDwgaGRybGVuKQorCQkJZ290byByeF9kcm9wcGVkOworCX0KKwllbHNlCisjZW5kaWYKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihmYyk7CisKKyNpZmRlZiBOT1RfWUVUCisjaWYgV0lSRUxFU1NfRVhUID4gMTUKKwkvKiBQdXQgdGhpcyBjb2RlIGhlcmUgc28gdGhhdCB3ZSBhdm9pZCBkdXBsaWNhdGluZyBpdCBpbiBhbGwKKwkgKiBSeCBwYXRocy4gLSBKZWFuIElJICovCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCQkvKiBkZWZpbmVkIGluIGl3X2hhbmRsZXIuaCAqLworCS8qIElmIHNweSBtb25pdG9yaW5nIG9uICovCisJaWYgKGlmYWNlLT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkgeworCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCXdzdGF0cy5sZXZlbCA9IHJ4X3N0YXRzLT5zaWduYWw7CisJCXdzdGF0cy5ub2lzZSA9IHJ4X3N0YXRzLT5ub2lzZTsKKwkJd3N0YXRzLnVwZGF0ZWQgPSA2OwkvKiBObyBxdWFsIHZhbHVlICovCisJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworCQl3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgaGRyLT5hZGRyMiwgJndzdGF0cyk7CisJfQorI2VuZGlmIC8qIElXX1dJUkVMRVNTX1NQWSAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE1ICovCisJaG9zdGFwX3VwZGF0ZV9yeF9zdGF0cyhsb2NhbC0+YXAsIGhkciwgcnhfc3RhdHMpOworI2VuZGlmCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNQorCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQlpZWVlODAyMTFfbW9uaXRvcl9yeChpZWVlLCBza2IsIHJ4X3N0YXRzKTsKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0KSB7CisJCWludCBpZHggPSAwOworCQlpZiAoc2tiLT5sZW4gPj0gaGRybGVuICsgMykKKwkJCWlkeCA9IHNrYi0+ZGF0YVtoZHJsZW4gKyAzXSA+PiA2OworCQljcnlwdCA9IGllZWUtPmNyeXB0W2lkeF07CisjaWZkZWYgTk9UX1lFVAorCQlzdGEgPSBOVUxMOworCisJCS8qIFVzZSBzdGF0aW9uIHNwZWNpZmljIGtleSB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgaWYgdGhlCisJCSAqIHJlY2VpdmVyIGFkZHJlc3MgaXMgYSB1bmljYXN0IGFkZHJlc3MgKCJpbmRpdmlkdWFsIFJBIikuIElmCisJCSAqIGJjcnhfc3RhX2tleSBwYXJhbWV0ZXIgaXMgc2V0LCBzdGF0aW9uIHNwZWNpZmljIGtleSBpcyB1c2VkCisJCSAqIGV2ZW4gd2l0aCBicm9hZC9tdWx0aWNhc3QgdGFyZ2V0cyAodGhpcyBpcyBhZ2FpbnN0IElFRUUKKwkJICogODAyLjExLCBidXQgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZSBkaWZmZXJlbnQga2V5cyB3aXRoCisJCSAqIHN0YXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgV0VQIGtleSBtYXBwaW5nKS4gKi8KKworCQlpZiAoIShoZHItPmFkZHIxWzBdICYgMHgwMSkgfHwgbG9jYWwtPmJjcnhfc3RhX2tleSkKKwkJCSh2b2lkKSBob3N0YXBfaGFuZGxlX3N0YV9jcnlwdG8obG9jYWwsIGhkciwgJmNyeXB0LAorCQkJCQkJCSZzdGEpOworI2VuZGlmCisKKwkJLyogYWxsb3cgTlVMTCBkZWNyeXB0IHRvIGluZGljYXRlIGFuIHN0YXRpb24gc3BlY2lmaWMgb3ZlcnJpZGUKKwkJICogZm9yIGRlZmF1bHQgZW5jcnlwdGlvbiAqLworCQlpZiAoY3J5cHQgJiYgKGNyeXB0LT5vcHMgPT0gTlVMTCB8fAorCQkJICAgICAgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1ID09IE5VTEwpKQorCQkJY3J5cHQgPSBOVUxMOworCisJCWlmICghY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSkgeworCQkJLyogVGhpcyBzZWVtcyB0byBiZSB0cmlnZ2VyZWQgYnkgc29tZSAobXVsdGljYXN0PykKKwkJCSAqIGZyYW1lcyBmcm9tIG90aGVyIHRoYW4gY3VycmVudCBCU1MsIHNvIGp1c3QgZHJvcCB0aGUKKwkJCSAqIGZyYW1lcyBzaWxlbnRseSBpbnN0ZWFkIG9mIGZpbGxpbmcgc3lzdGVtIGxvZyB3aXRoCisJCQkgKiB0aGVzZSByZXBvcnRzLiAqLworCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIkRlY3J5cHRpb24gZmFpbGVkIChub3Qgc2V0KSIKKwkJCQkJICAgICAiIChTQT0iIE1BQ19GTVQgIilcbiIsCisJCQkJCSAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCQlpZWVlLT5pZWVlX3N0YXRzLnJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGUrKzsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKworCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoIGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9tZ3RfdXBkYXRlX2V4cGlyZSApCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfbWd0X3VwZGF0ZV9leHBpcmUoIGllZWUsIHNrYiApOworI2VuZGlmCisKKwkvLyBpZiBRb1MgZW5hYmxlZCwgc2hvdWxkIGNoZWNrIHRoZSBzZXF1ZW5jZSBmb3IgZWFjaCBvZiB0aGUgQUMKKwlpZiAoaXNfZHVwbGljYXRlX3BhY2tldChpZWVlLCBoZHIpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKworCWlmICh0eXBlID09IElFRUU4MDIxMV9GVFlQRV9NR01UKSB7CisKKwkjaWYgMAorCQlpZiAoIHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9BVVRIICYmCisJCSAgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCAmJiBpZWVlLT5ob3N0X2RlY3J5cHQgJiYKKwkJICAgIChrZXlpZHggPSBob3N0YXBfcnhfZnJhbWVfZGVjcnlwdChpZWVlLCBza2IsIGNyeXB0KSkgPCAwKQorCQl7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBkZWNyeXB0IG1nbXQ6OmF1dGggIgorCQkJICAgICAgICJmcm9tICIgTUFDX0ZNVCAiXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCQkvKiBUT0RPOiBjb3VsZCBpbmZvcm0gaG9zdGFwZCBhYm91dCB0aGlzIHNvIHRoYXQgaXQKKwkJCSAqIGNvdWxkIHNlbmQgYXV0aCBmYWlsdXJlIHJlcG9ydCAqLworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisJI2VuZGlmCisKKworCQlpZiAoaWVlZTgwMjExX3J4X2ZyYW1lX21nbXQoaWVlZSwgc2tiLCByeF9zdGF0cywgdHlwZSwgc3R5cGUpKQorCQkJZ290byByeF9kcm9wcGVkOworCQllbHNlCisJCQlnb3RvIHJ4X2V4aXQ7CisJfQorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9vbl9yeCkKKwl7CisJCWlmKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfb25fcngoaWVlZSwgc2tiLCByeF9zdGF0cywgdHlwZSwgc3R5cGUpPT0wKQorCQl7CisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIERhdGEgZnJhbWUgLSBleHRyYWN0IHNyYy9kc3QgYWRkcmVzc2VzICovCisJc3dpdGNoIChmYyAmIChJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKSkgeworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLGhkci0+YWRkcjIsRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsaGRyLT5hZGRyMSxFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJaWYgKHNrYi0+bGVuIDwgSUVFRTgwMjExX0RBVEFfSERSNF9MRU4pCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsaGRyLT5hZGRyMyxFVEhfQUxFTik7CisJCWJyZWFrOworCX0KKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAoaG9zdGFwX3J4X2ZyYW1lX3dkcyhpZWVlLCBoZHIsIGZjLCAmd2RzKSkKKwkJZ290byByeF9kcm9wcGVkOworCWlmICh3ZHMpIHsKKwkJc2tiLT5kZXYgPSBkZXYgPSB3ZHM7CisJCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOworCX0KKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYKKwkgICAgKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgJiYKKwkgICAgaWVlZS0+c3RhZGV2ICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIyLCBpZWVlLT5hc3NvY19hcF9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBGcmFtZSBmcm9tIEJTU0lEIG9mIHRoZSBBUCBmb3Igd2hpY2ggd2UgYXJlIGEgY2xpZW50ICovCisJCXNrYi0+ZGV2ID0gZGV2ID0gaWVlZS0+c3RhZGV2OworCQlzdGF0cyA9IGhvc3RhcF9nZXRfc3RhdHMoZGV2KTsKKwkJZnJvbV9hc3NvY19hcCA9IDE7CisJfQorI2VuZGlmCisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisjaWZkZWYgTk9UX1lFVAorCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiB8fAorCSAgICAgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX1JFUEVBVCkgJiYKKwkgICAgIWZyb21fYXNzb2NfYXApIHsKKwkJc3dpdGNoIChob3N0YXBfaGFuZGxlX3N0YV9yeChpZWVlLCBkZXYsIHNrYiwgcnhfc3RhdHMsCisJCQkJCSAgICAgd2RzICE9IE5VTEwpKSB7CisJCWNhc2UgQVBfUlhfQ09OVElOVUVfTk9UX0FVVEhPUklaRUQ6CisJCQlmcmFtZV9hdXRob3JpemVkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEFQX1JYX0NPTlRJTlVFOgorCQkJZnJhbWVfYXV0aG9yaXplZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBBUF9SWF9EUk9QOgorCQkJZ290byByeF9kcm9wcGVkOworCQljYXNlIEFQX1JYX0VYSVQ6CisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9pc192YWxpZF9mcmFtZWN0bCkKKwl7CisJCWlmKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfaXNfdmFsaWRfZnJhbWVjdGwoaWVlZSwgZmMsIHR5cGUsIHN0eXBlKT09MCkKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisJZWxzZQorI2VuZGlmCisJLyogTnVsbGZ1bmMgZnJhbWVzIG1heSBoYXZlIFBTLWJpdCBzZXQsIHNvIHRoZXkgbXVzdCBiZSBwYXNzZWQgdG8KKwkgKiBob3N0YXBfaGFuZGxlX3N0YV9yeCgpIGJlZm9yZSBiZWluZyBkcm9wcGVkIGhlcmUuICovCisJaWYgKHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBICYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLICYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTCAmJgorCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwmJgorCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEvL2FkZCBieSBEYXZpZCwyMDA2LjguNAorCSAgICApIHsKKwkJaWYgKHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQykKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAorCQkJCSJSWDogZHJvcHBlZCBkYXRhIGZyYW1lICIKKwkJCQkid2l0aCBubyBkYXRhICh0eXBlPTB4JTAyeCwgIgorCQkJCSJzdWJ0eXBlPTB4JTAyeCwgbGVuPSVkKVxuIiwKKwkJCQl0eXBlLCBzdHlwZSwgc2tiLT5sZW4pOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCWlmKG1lbWNtcChic3NpZCxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsRVRIX0FMRU4pKSB7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwlpZWVlLT5OdW1SeERhdGFJblBlcmlvZCsrOworCWllZWUtPk51bVJ4T2tUb3RhbCsrOworCS8qIHNrYjogaGRyICsgKHBvc3NpYmx5IGZyYWdtZW50ZWQsIHBvc3NpYmx5IGVuY3J5cHRlZCkgcGF5bG9hZCAqLworCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCisJICAgIChrZXlpZHggPSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdChpZWVlLCBza2IsIGNyeXB0KSkgPCAwKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCisJLyogc2tiOiBoZHIgKyAocG9zc2libHkgZnJhZ21lbnRlZCkgcGxhaW50ZXh0IHBheWxvYWQgKi8KKwkvLyBQUjogRklYTUU6IGhvc3RhcCBoYXMgYWRkaXRpb25hbCBjb25kaXRpb25zIGluIHRoZSAiaWYiIGJlbG93OgorCS8vIGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCisJaWYgKChmcmFnICE9IDAgfHwgKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkpIHsKKwkJaW50IGZsZW47CisJCXN0cnVjdCBza19idWZmICpmcmFnX3NrYiA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2dldChpZWVlLCBoZHIpOworCQlJRUVFODAyMTFfREVCVUdfRlJBRygiUnggRnJhZ21lbnQgcmVjZWl2ZWQgKCV1KVxuIiwgZnJhZyk7CisKKwkJaWYgKCFmcmFnX3NrYikgeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCB8IElFRUU4MDIxMV9ETF9GUkFHLAorCQkJCQkiUnggY2Fubm90IGdldCBza2IgZnJvbSBmcmFnbWVudCAiCisJCQkJCSJjYWNoZSAobW9yZWZyYWc9JWQgc2VxPSV1IGZyYWc9JXUpXG4iLAorCQkJCQkoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpICE9IDAsCisJCQkJCVdMQU5fR0VUX1NFUV9TRVEoc2MpLCBmcmFnKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCQlmbGVuID0gc2tiLT5sZW47CisJCWlmIChmcmFnICE9IDApCisJCQlmbGVuIC09IGhkcmxlbjsKKworCQlpZiAoZnJhZ19za2ItPnRhaWwgKyBmbGVuID4gZnJhZ19za2ItPmVuZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhvc3QgZGVjcnlwdGVkIGFuZCAiCisJCQkgICAgICAgInJlYXNzZW1ibGVkIGZyYW1lIGRpZCBub3QgZml0IHNrYlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisKKwkJaWYgKGZyYWcgPT0gMCkgeworCQkJLyogY29weSBmaXJzdCBmcmFnbWVudCAoaW5jbHVkaW5nIGZ1bGwgaGVhZGVycykgaW50bworCQkJICogYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBjYWNoZSBza2IgKi8KKwkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhLCBmbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGFwcGVuZCBmcmFtZSBwYXlsb2FkIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50CisJCQkgKiBjYWNoZSBza2IgKi8KKwkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhICsgaGRybGVuLAorCQkJICAgICAgIGZsZW4pOworCQl9CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNrYiA9IE5VTEw7CisKKwkJaWYgKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSB7CisJCQkvKiBtb3JlIGZyYWdtZW50cyBleHBlY3RlZCAtIGxlYXZlIHRoZSBza2IgaW4gZnJhZ21lbnQKKwkJCSAqIGNhY2hlIGZvciBub3c7IGl0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHVwcGVyIGxheWVycworCQkJICogYWZ0ZXIgYWxsIGZyYWdtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQgKi8KKwkJCWdvdG8gcnhfZXhpdDsKKwkJfQorCisJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGZyYWdtZW50IGFuZCB0aGUgZnJhbWUgd2lsbCBiZQorCQkgKiBkZWxpdmVyZWQsIHNvIHJlbW92ZSBza2IgZnJvbSBmcmFnbWVudCBjYWNoZSAqLworCQlza2IgPSBmcmFnX3NrYjsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwkJaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOworCX0KKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIE1TRFUgcGF5bG9hZDsgcG9zc2libHkgc3RpbGwKKwkgKiBlbmNyeXB0ZWQvYXV0aGVudGljYXRlZCAqLworCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCSAgICBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KGllZWUsIHNrYiwga2V5aWR4LCBjcnlwdCkpCisJCWdvdG8gcnhfZHJvcHBlZDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmICFpZWVlLT5vcGVuX3dlcCkgeworCQlpZiAoLyppZWVlLT5pZWVlODAyXzF4ICYmKi8KKwkJICAgIGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCS8qIHBhc3MgdW5lbmNyeXB0ZWQgRUFQT0wgZnJhbWVzIGV2ZW4gaWYgZW5jcnlwdGlvbiBpcworCQkJICogY29uZmlndXJlZCAqLworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJMjQpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiUlg6IElFRUUgODAyLjFYIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkJImVuY3J5cHRpb24gY29uZmlndXJlZCwgYnV0IFJYICIKKwkJCQkiZnJhbWUgbm90IGVuY3J5cHRlZCAoU0E9IiBNQUNfRk1UICIpXG4iLAorCQkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCSAgICBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKKwkJCQkyNCk7CisJCQlJRUVFODAyMTFfREVCVUdfRUFQKCJSWDogSUVFRSA4MDIuMVggRUFQT0wgZnJhbWU6ICVzXG4iLAorCQkJCQkJZWFwX2dldF90eXBlKGVhcC0+dHlwZSkpOworCX0KKyNlbmRpZgorCisJaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmICFpZWVlLT5vcGVuX3dlcCAmJgorCSAgICAhaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCQlJRUVFODAyMTFfREVCVUdfRFJPUCgKKwkJCSJkcm9wcGVkIHVuZW5jcnlwdGVkIFJYIGRhdGEgIgorCQkJImZyYW1lIGZyb20gIiBNQUNfRk1UCisJCQkiIChkcm9wX3VuZW5jcnlwdGVkPTEpXG4iLAorCQkJTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisvKgorCWlmKGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlg6IElFRUU4MDIuMVggRVBBT0wgZnJhbWUhXG4iKTsKKwl9CisqLworCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIHBsYWludGV4dCBwYXlsb2FkICovCisJcGF5bG9hZCA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKKwlldGhlcnR5cGUgPSAocGF5bG9hZFs2XSA8PCA4KSB8IHBheWxvYWRbN107CisKKyNpZmRlZiBOT1RfWUVUCisJLyogSWYgSUVFRSA4MDIuMVggaXMgdXNlZCwgY2hlY2sgd2hldGhlciB0aGUgcG9ydCBpcyBhdXRob3JpemVkIHRvIHNlbmQKKwkgKiB0aGUgcmVjZWl2ZWQgZnJhbWUuICovCisJaWYgKGllZWUtPmllZWU4MDJfMXggJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQlpZiAoZXRoZXJ0eXBlID09IEVUSF9QX1BBRSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWDogSUVFRSA4MDIuMVggZnJhbWVcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWlmIChpZWVlLT5ob3N0YXBkICYmIGllZWUtPmFwZGV2KSB7CisJCQkJLyogU2VuZCBJRUVFIDgwMi4xWCBmcmFtZXMgdG8gdGhlIHVzZXIKKwkJCQkgKiBzcGFjZSBkYWVtb24gZm9yIHByb2Nlc3NpbmcgKi8KKwkJCQlwcmlzbTJfcnhfODAyMTEoaWVlZS0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsCisJCQkJCQlQUklTTTJfUlhfTUdNVCk7CisJCQkJaWVlZS0+YXBkZXZzdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJaWVlZS0+YXBkZXZzdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQlnb3RvIHJ4X2V4aXQ7CisJCQl9CisJCX0gZWxzZSBpZiAoIWZyYW1lX2F1dGhvcml6ZWQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZHJvcHBlZCBmcmFtZSBmcm9tICIKKwkJCSAgICAgICAidW5hdXRob3JpemVkIHBvcnQgKElFRUUgODAyLjFYKTogIgorCQkJICAgICAgICJldGhlcnR5cGU9MHglMDR4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXRoZXJ0eXBlKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKyNlbmRpZgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X3Byb2Nlc3NfZGF0YWZyYW1lKQorCXsKKwkvL0FkZGVkIGZvciBtZXNoIHJ4IGludGVycnVwdC4KKwkJLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJCXN0YXR1cyA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfcHJvY2Vzc19kYXRhZnJhbWUoaWVlZSwgc2tiLCByeF9zdGF0cyk7CisJCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKKwkJaWYoc3RhdHVzKQorLy8JaWYoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9wcm9jZXNzX2RhdGFmcmFtZShpZWVlLCBza2IsIHJ4X3N0YXRzKSkKKwkJCWdvdG8gcnhfZXhpdDsKKwkJZWxzZQorCQkJZ290byByeF9kcm9wcGVkOworCX0KKyNlbmRpZgorCisJLyogY29udmVydCBoZHIgKyBwb3NzaWJsZSBMTEMgaGVhZGVycyBpbnRvIEV0aGVybmV0IGhlYWRlciAqLworCWlmIChza2ItPmxlbiAtIGhkcmxlbiA+PSA4ICYmCisJICAgICgobWVtY21wKHBheWxvYWQsIHJmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpID09IDAgJiYKKwkgICAgICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAorCSAgICAgbWVtY21wKHBheWxvYWQsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpID09IDApKSB7CisJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKKwkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJc2tiX3B1bGwoc2tiLCBoZHJsZW4gKyBTTkFQX1NJWkUpOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCXUxNiBsZW47CisJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCisJCXNrYl9wdWxsKHNrYiwgaGRybGVuKTsKKwkJbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCAyKSwgJmxlbiwgMik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgZHN0LCBFVEhfQUxFTik7CisJfQorCisjaWZkZWYgTk9UX1lFVAorCWlmICh3ZHMgJiYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkJICAgIElFRUU4MDIxMV9GQ1RMX1RPRFMpICYmCisJICAgIHNrYi0+bGVuID49IEVUSF9ITEVOICsgRVRIX0FMRU4pIHsKKwkJLyogTm9uLXN0YW5kYXJkIGZyYW1lOiBnZXQgYWRkcjQgZnJvbSBpdHMgYm9ndXMgbG9jYXRpb24gYWZ0ZXIKKwkJICogdGhlIHBheWxvYWQgKi8KKwkJbWVtY3B5KHNrYi0+ZGF0YSArIEVUSF9BTEVOLAorCQkgICAgICAgc2tiLT5kYXRhICsgc2tiLT5sZW4gLSBFVEhfQUxFTiwgRVRIX0FMRU4pOworCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gRVRIX0FMRU4pOworCX0KKyNlbmRpZgorCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKyNpZmRlZiBOT1RfWUVUCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgIXdkcyAmJgorCSAgICBpZWVlLT5hcC0+YnJpZGdlX3BhY2tldHMpIHsKKwkJaWYgKGRzdFswXSAmIDB4MDEpIHsKKwkJCS8qIGNvcHkgbXVsdGljYXN0IGZyYW1lIGJvdGggdG8gdGhlIGhpZ2hlciBsYXllcnMgYW5kCisJCQkgKiB0byB0aGUgd2lyZWxlc3MgbWVkaWEgKi8KKwkJCWllZWUtPmFwLT5icmlkZ2VkX211bHRpY2FzdCsrOworCQkJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYjIgPT0gTlVMTCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNrYl9jbG9uZSBmYWlsZWQgZm9yICIKKwkJCQkgICAgICAgIm11bHRpY2FzdCBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKKwkJfSBlbHNlIGlmIChob3N0YXBfaXNfc3RhX2Fzc29jKGllZWUtPmFwLCBkc3QpKSB7CisJCQkvKiBzZW5kIGZyYW1lIGRpcmVjdGx5IHRvIHRoZSBhc3NvY2lhdGVkIFNUQSB1c2luZworCQkJICogd2lyZWxlc3MgbWVkaWEgYW5kIG5vdCBwYXNzaW5nIHRvIGhpZ2hlciBsYXllcnMgKi8KKwkJCWllZWUtPmFwLT5icmlkZ2VkX3VuaWNhc3QrKzsKKwkJCXNrYjIgPSBza2I7CisJCQlza2IgPSBOVUxMOworCQl9CisJfQorCisJaWYgKHNrYjIgIT0gTlVMTCkgeworCQkvKiBzZW5kIHRvIHdpcmVsZXNzIG1lZGlhICovCisJCXNrYjItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDJfMyk7CisJCXNrYjItPm1hYy5yYXcgPSBza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCQkvKiBza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhICsgRVRIX0hMRU47ICovCisJCXNrYjItPmRldiA9IGRldjsKKwkJZGV2X3F1ZXVlX3htaXQoc2tiMik7CisJfQorCisjZW5kaWYKKwlpZiAoc2tiKSB7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOyAvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCisJCWllZWUtPmxhc3RfcnhfcHNfdGltZSA9IGppZmZpZXM7CisJCW5ldGlmX3J4KHNrYik7CisJfQorCisgcnhfZXhpdDoKKyNpZmRlZiBOT1RfWUVUCisJaWYgKHN0YSkKKwkJaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZShzdGEpOworI2VuZGlmCisJcmV0dXJuIDE7CisKKyByeF9kcm9wcGVkOgorCXN0YXRzLT5yeF9kcm9wcGVkKys7CisKKwkvKiBSZXR1cm5pbmcgMCBpbmRpY2F0ZXMgdG8gY2FsbGVyIHRoYXQgd2UgaGF2ZSBub3QgaGFuZGxlZCB0aGUgU0tCLS0KKwkgKiBzbyBpdCBpcyBzdGlsbCBhbGxvY2F0ZWQgYW5kIGNhbiBiZSB1c2VkIGFnYWluIGJ5IHVuZGVybHlpbmcKKwkgKiBoYXJkd2FyZSBhcyBhIERNQSB0YXJnZXQgKi8KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KK2ludCBpZWVlX2V4dF9za2JfcDgwMjExX3RvX2V0aGVyKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJsZW4sIHU4ICpkc3QsIHU4ICpzcmMpCit7CisJdTggKnBheWxvYWQ7CisJdTE2IGV0aGVydHlwZTsKKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIHBsYWludGV4dCBwYXlsb2FkICovCisJcGF5bG9hZCA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKKwlldGhlcnR5cGUgPSAocGF5bG9hZFs2XSA8PCA4KSB8IHBheWxvYWRbN107CisKKwkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCisJaWYgKHNrYi0+bGVuIC0gaGRybGVuID49IDggJiYKKwkgICAgKChtZW1jbXAocGF5bG9hZCwgcmZjMTA0Ml9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCAmJgorCSAgICAgIGV0aGVydHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aGVydHlwZSAhPSBFVEhfUF9JUFgpIHx8CisJICAgICBtZW1jbXAocGF5bG9hZCwgYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCkpIHsKKwkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZAorCQkgKiByZXBsYWNlIEV0aGVyVHlwZSAqLworCQlza2JfcHVsbChza2IsIGhkcmxlbiArIFNOQVBfU0laRSk7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgZHN0LCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJdTE2IGxlbjsKKwkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KKwkJc2tiX3B1bGwoc2tiLCBoZHJsZW4pOworCQlsZW4gPSBodG9ucyhza2ItPmxlbik7CisJCW1lbWNweShza2JfcHVzaChza2IsIDIpLCAmbGVuLCAyKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKKworI2RlZmluZSBNR01UX0ZSQU1FX0ZJWEVEX1BBUlRfTEVOR1RICQkweDI0CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9pc19vZmRtX3JhdGUodTggcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUgJiB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykgeworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV82TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKKwkJcmV0dXJuIDE7CisJfQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX1NpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKAorCWludCAgQ3VyclNTCisJKQoreworCWludCBSZXRTUzsKKworCS8vIFN0ZXAgMS4gU2NhbGUgbWFwcGluZy4KKwlpZihDdXJyU1MgPj0gNzEgJiYgQ3VyclNTIDw9IDEwMCkKKwl7CisJCVJldFNTID0gOTAgKyAoKEN1cnJTUyAtIDcwKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSA0MSAmJiBDdXJyU1MgPD0gNzApCisJeworCQlSZXRTUyA9IDc4ICsgKChDdXJyU1MgLSA0MCkgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gMzEgJiYgQ3VyclNTIDw9IDQwKQorCXsKKwkJUmV0U1MgPSA2NiArIChDdXJyU1MgLSAzMCk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDIxICYmIEN1cnJTUyA8PSAzMCkKKwl7CisJCVJldFNTID0gNTQgKyAoQ3VyclNTIC0gMjApOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSA1ICYmIEN1cnJTUyA8PSAyMCkKKwl7CisJCVJldFNTID0gNDIgKyAoKChDdXJyU1MgLSA1KSAqIDIpIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDQpCisJeworCQlSZXRTUyA9IDM2OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAzKQorCXsKKwkJUmV0U1MgPSAyNzsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMikKKwl7CisJCVJldFNTID0gMTg7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDEpCisJeworCQlSZXRTUyA9IDk7CisJfQorCWVsc2UKKwl7CisJCVJldFNTID0gQ3VyclNTOworCX0KKwkvL1JUX1RSQUNFKENPTVBfREJHLCBEQkdfTE9VRCwgKCIjIyMjIyBBZnRlciBNYXBwaW5nOiAgTGFzdFNTOiAlZCwgQ3VyclNTOiAlZCwgUmV0U1M6ICVkXG4iLCBMYXN0U1MsIEN1cnJTUywgUmV0U1MpKTsKKworCS8vIFN0ZXAgMi4gU21vb3RoaW5nLgorCisJLy9SVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsICgiJCQkJCQgQWZ0ZXIgU21vb3RoaW5nOiAgTGFzdFNTOiAlZCwgQ3VyclNTOiAlZCwgUmV0U1M6ICVkXG4iLCBMYXN0U1MsIEN1cnJTUywgUmV0U1MpKTsKKworCXJldHVybiBSZXRTUzsKK30KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfZXh0cmFjdF9jb3VudHJ5X2llKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCXU4ICogYWRkcjIKKykKK3sKKyNpZiAwCisJdTMyIGkgPSAwOworCXU4ICogcCA9ICh1OCopaW5mb19lbGVtZW50LT5kYXRhOworCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50aygiJXMgQ291bnRyeSBJRToiLCBuZXR3b3JrLT5zc2lkKTsKKwlmb3IoaT0wOyBpPGluZm9fZWxlbWVudC0+bGVuOyBpKyspCisJCXByaW50aygiXHQlMi4yeCIsICoocCtpKSk7CisJcHJpbnRrKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyNlbmRpZgorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJeworCQlpZihpbmZvX2VsZW1lbnQtPmxlbiE9IDApCisJCXsKKwkJCW1lbWNweShuZXR3b3JrLT5Db3VudHJ5SWVCdWYsIGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pOworCQkJbmV0d29yay0+Q291bnRyeUllTGVuID0gaW5mb19lbGVtZW50LT5sZW47CisKKwkJCWlmKCFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCQkJeworCQkJCURvdDExZF9VcGRhdGVDb3VudHJ5SWUoaWVlZSwgYWRkcjIsIGluZm9fZWxlbWVudC0+bGVuLCBpbmZvX2VsZW1lbnQtPmRhdGEpOworCQkJfQorCQl9CisKKwkJLy8KKwkJLy8gMDcwMzA1LCByY25qa286IEkgdXBkYXRlIGNvdW50cnkgSUUgd2F0Y2ggZG9nIGhlcmUgYmVjYXVzZQorCQkvLyBzb21lIEFQIChlLmcuIENpc2NvIDEyNDIpIGRvbid0IGluY2x1ZGUgY291bnRyeSBJRSBpbiB0aGVpcgorCQkvLyBwcm9iZSByZXNwb25zZSBmcmFtZS4KKwkJLy8KKwkJaWYoSVNfRVFVQUxfQ0lFX1NSQyhpZWVlLCBhZGRyMikgKQorCQl7CisJCQlVUERBVEVfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorCit9CisjZW5kaWYKKworaW50CitpZWVlODAyMTFfVHJhbnNsYXRlVG9EYm0oCisJdW5zaWduZWQgY2hhciBTaWduYWxTdHJlbmd0aEluZGV4CS8vIDAtMTAwIGluZGV4LgorCSkKK3sKKwl1bnNpZ25lZCBjaGFyIFNpZ25hbFBvd2VyOyAvLyBpbiBkQm0uCisKKwkvLyBUcmFuc2xhdGUgdG8gZEJtICh4PTAuNXktOTUpLgorCVNpZ25hbFBvd2VyID0gKGludClTaWduYWxTdHJlbmd0aEluZGV4ICogNyAvIDEwOworCVNpZ25hbFBvd2VyIC09IDk1OworCisJcmV0dXJuIFNpZ25hbFBvd2VyOworfQoraW5saW5lIGludCBpZWVlODAyMTFfbmV0d29ya19pbml0KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbiwKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCWNoYXIgcmF0ZXNfc3RyWzY0XTsKKwljaGFyICpwOworI2VuZGlmCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudDsKKyAJdTE2IGxlZnQ7CisJdTggaTsKKwlzaG9ydCBvZmZzZXQ7CisJdTggY3VyUmF0ZSA9IDAsaE9wUmF0ZSA9IDAsY3VyUmF0ZV9leCA9IDA7CisKKwkvKiBQdWxsIG91dCBmaXhlZCBmaWVsZCBkYXRhICovCisJbWVtY3B5KG5ldHdvcmstPmJzc2lkLCBiZWFjb24tPmhlYWRlci5hZGRyMywgRVRIX0FMRU4pOworCW5ldHdvcmstPmNhcGFiaWxpdHkgPSBiZWFjb24tPmNhcGFiaWxpdHk7CisJbmV0d29yay0+bGFzdF9zY2FubmVkID0gamlmZmllczsKKwluZXR3b3JrLT50aW1lX3N0YW1wWzBdID0gYmVhY29uLT50aW1lX3N0YW1wWzBdOworCW5ldHdvcmstPnRpbWVfc3RhbXBbMV0gPSBiZWFjb24tPnRpbWVfc3RhbXBbMV07CisJbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gYmVhY29uLT5iZWFjb25faW50ZXJ2YWw7CisJLyogV2hlcmUgdG8gcHVsbCB0aGlzPyBiZWFjb24tPmxpc3Rlbl9pbnRlcnZhbDsqLworCW5ldHdvcmstPmxpc3Rlbl9pbnRlcnZhbCA9IDB4MEE7CisJbmV0d29yay0+cmF0ZXNfbGVuID0gbmV0d29yay0+cmF0ZXNfZXhfbGVuID0gMDsKKwluZXR3b3JrLT5sYXN0X2Fzc29jaWF0ZSA9IDA7CisJbmV0d29yay0+c3NpZF9sZW4gPSAwOworCW5ldHdvcmstPmZsYWdzID0gMDsKKwluZXR3b3JrLT5hdGltX3dpbmRvdyA9IDA7CisJbmV0d29yay0+UW9TX0VuYWJsZSA9IDA7CisvL2J5IGFteSAwODAzMTIKKwluZXR3b3JrLT5IaWdoZXN0T3BlcmFSYXRlID0gMDsKKy8vYnkgYW15IDA4MDMxMgorI2lmZGVmIFRIT01BU19UVVJCTworCW5ldHdvcmstPlR1cmJvX0VuYWJsZSA9IDA7CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJbmV0d29yay0+Q291bnRyeUllTGVuID0gMDsKKwltZW1zZXQobmV0d29yay0+Q291bnRyeUllQnVmLCAwLCBNQVhfSUVfTEVOKTsKKyNlbmRpZgorCisJaWYgKHN0YXRzLT5mcmVxID09IElFRUU4MDIxMV81MkdIWl9CQU5EKSB7CisJCS8qIGZvciBBIGJhbmQgKE5vIERTIGluZm8pICovCisJCW5ldHdvcmstPmNoYW5uZWwgPSBzdGF0cy0+cmVjZWl2ZWRfY2hhbm5lbDsKKwl9IGVsc2UKKwkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfQ0NLOworCisgCW5ldHdvcmstPndwYV9pZV9sZW4gPSAwOworIAluZXR3b3JrLT5yc25faWVfbGVuID0gMDsKKworIAlpbmZvX2VsZW1lbnQgPSAmYmVhY29uLT5pbmZvX2VsZW1lbnQ7CisJbGVmdCA9IHN0YXRzLT5sZW4gLSAoKHZvaWQgKilpbmZvX2VsZW1lbnQgLSAodm9pZCAqKWJlYWNvbik7CisJd2hpbGUgKGxlZnQgPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikpIHsKKwkJaWYgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsgaW5mb19lbGVtZW50LT5sZW4gPiBsZWZ0KSB7CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiU0NBTjogcGFyc2UgZmFpbGVkOiBpbmZvX2VsZW1lbnQtPmxlbiArIDIgPiBsZWZ0IDogaW5mb19lbGVtZW50LT5sZW4rMj0lZCBsZWZ0PSVkLlxuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCksCisJCQkJCSAgICAgbGVmdCk7CisJCQlyZXR1cm4gMTsKKyAgICAgICAgICAgICAgIAl9CisKKwkJc3dpdGNoIChpbmZvX2VsZW1lbnQtPmlkKSB7CisJCWNhc2UgTUZJRV9UWVBFX1NTSUQ6CisJCQlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pKSB7CisJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19FTVBUWV9FU1NJRDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbmV0d29yay0+c3NpZF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkodTgpSVdfRVNTSURfTUFYX1NJWkUpOworCQkJbWVtY3B5KG5ldHdvcmstPnNzaWQsIGluZm9fZWxlbWVudC0+ZGF0YSwgbmV0d29yay0+c3NpZF9sZW4pOworICAgICAgICAJCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA8IElXX0VTU0lEX01BWF9TSVpFKQorICAgICAgICAgICAgICAgIAkJbWVtc2V0KG5ldHdvcmstPnNzaWQgKyBuZXR3b3JrLT5zc2lkX2xlbiwgMCwKKwkJCQkgICAgICAgSVdfRVNTSURfTUFYX1NJWkUgLSBuZXR3b3JrLT5zc2lkX2xlbik7CisKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfU1NJRDogJyVzJyBsZW49JWQuXG4iLAorCQkJCQkgICAgIG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1JBVEVTOgorI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCXAgPSByYXRlc19zdHI7CisjZW5kaWYKKwkJCW5ldHdvcmstPnJhdGVzX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwgTUFYX1JBVEVTX0xFTkdUSCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOyBpKyspIHsKKwkJCQluZXR3b3JrLT5yYXRlc1tpXSA9IGluZm9fZWxlbWVudC0+ZGF0YVtpXTsKKwkJCQljdXJSYXRlID0gbmV0d29yay0+cmF0ZXNbaV0gJiAweDdmOworCQkJCWlmKCBoT3BSYXRlIDwgY3VyUmF0ZSApCisJCQkJCWhPcFJhdGUgPSBjdXJSYXRlOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihyYXRlc19zdHIpIC0gKHAgLSByYXRlc19zdHIpLCAiJTAyWCAiLCBuZXR3b3JrLT5yYXRlc1tpXSk7CisjZW5kaWYKKwkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZShpbmZvX2VsZW1lbnQtPmRhdGFbaV0pKSB7CisJCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX09GRE07CisJCQkJCWlmIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0gJgorCQkJCQkgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykKKwkJCQkJCW5ldHdvcmstPmZsYWdzICY9CisJCQkJCQkJfk5FVFdPUktfSEFTX0NDSzsKKwkJCQl9CisJCQl9CisKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfUkFURVM6ICclcycgKCVkKVxuIiwKKwkJCQkJICAgICByYXRlc19zdHIsIG5ldHdvcmstPnJhdGVzX2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SQVRFU19FWDoKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQlwID0gcmF0ZXNfc3RyOworI2VuZGlmCisJCQluZXR3b3JrLT5yYXRlc19leF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sIE1BWF9SQVRFU19FWF9MRU5HVEgpOworCQkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbjsgaSsrKSB7CisJCQkJbmV0d29yay0+cmF0ZXNfZXhbaV0gPSBpbmZvX2VsZW1lbnQtPmRhdGFbaV07CisJCQkJY3VyUmF0ZV9leCA9IG5ldHdvcmstPnJhdGVzX2V4W2ldICYgMHg3ZjsKKwkJCQlpZiggaE9wUmF0ZSA8IGN1clJhdGVfZXggKQorCQkJCQloT3BSYXRlID0gY3VyUmF0ZV9leDsKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkJcCArPSBzbnByaW50ZihwLCBzaXplb2YocmF0ZXNfc3RyKSAtIChwIC0gcmF0ZXNfc3RyKSwgIiUwMlggIiwgbmV0d29yay0+cmF0ZXNbaV0pOworI2VuZGlmCisJCQkJaWYgKGllZWU4MDIxMV9pc19vZmRtX3JhdGUoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgeworCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOworCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKKwkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCisJCQkJCQluZXR3b3JrLT5mbGFncyAmPQorCQkJCQkJCX5ORVRXT1JLX0hBU19DQ0s7CisJCQkJfQorCQkJfQorCisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX1JBVEVTX0VYOiAnJXMnICglZClcbiIsCisJCQkJCSAgICAgcmF0ZXNfc3RyLCBuZXR3b3JrLT5yYXRlc19leF9sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfRFNfU0VUOgorICAJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0RTX1NFVDogJWRcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdKTsKKwkJCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfMjRHSFpfQkFORCkKKwkJCQluZXR3b3JrLT5jaGFubmVsID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJYnJlYWs7CisKKwkgCWNhc2UgTUZJRV9UWVBFX0ZIX1NFVDoKKyAgCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9GSF9TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQ0ZfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9DRl9TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfVElNOgorCisJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA8IDQpCisJCQkJYnJlYWs7CisKKwkJCW5ldHdvcmstPmR0aW1fcGVyaW9kID0gaW5mb19lbGVtZW50LT5kYXRhWzFdOworCisJCQlpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorCQkJCWJyZWFrOworI2lmIDAKKwkJCW5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZVswXSA9IHN0YXRzLT5tYWNfdGltZVswXTsKKyNlbHNlCisJCQluZXR3b3JrLT5sYXN0X2R0aW1fc3RhX3RpbWVbMF0gPSBqaWZmaWVzOworI2VuZGlmCisJCQluZXR3b3JrLT5sYXN0X2R0aW1fc3RhX3RpbWVbMV0gPSBzdGF0cy0+bWFjX3RpbWVbMV07CisKKwkJCW5ldHdvcmstPmR0aW1fZGF0YSA9IElFRUU4MDIxMV9EVElNX1ZBTElEOworCisJCQlpZihpbmZvX2VsZW1lbnQtPmRhdGFbMF0gIT0gMCkKKwkJCQlicmVhazsKKworCQkJaWYoaW5mb19lbGVtZW50LT5kYXRhWzJdICYgMSkKKwkJCQluZXR3b3JrLT5kdGltX2RhdGEgfD0gSUVFRTgwMjExX0RUSU1fTUJDQVNUOworCisJCQlvZmZzZXQgPSAoaW5mb19lbGVtZW50LT5kYXRhWzJdID4+IDEpKjI7CisKKwkJCS8vcHJpbnRrKCJvZmZzZXQxOiV4IGFpZDoleFxuIixvZmZzZXQsIGllZWUtPmFzc29jX2lkKTsKKworCQkJLyogYWRkIGFuZCBtb2RpZmllZCBmb3IgcHMgMjAwOC4xLjIyICovCisJCQlpZihpZWVlLT5hc3NvY19pZCA8IDgqb2Zmc2V0IHx8CisJCQkJaWVlZS0+YXNzb2NfaWQgPiA4KihvZmZzZXQgKyBpbmZvX2VsZW1lbnQtPmxlbiAtMykpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJb2Zmc2V0ID0gKGllZWUtPmFzc29jX2lkLzgpIC0gb2Zmc2V0Oy8vICsgKChhaWQgJSA4KT8gMCA6IDEpIDsKKworCQkvLwlwcmludGsoIm9mZnNldDoleCBkYXRhOiV4LCB1Y2FzdDolZFxuIiwgb2Zmc2V0LAorCQkJLy8JaW5mb19lbGVtZW50LT5kYXRhWzMrb2Zmc2V0XSAsCisJCQkvLwlpbmZvX2VsZW1lbnQtPmRhdGFbMytvZmZzZXRdICYgKDE8PChpZWVlLT5hc3NvY19pZCU4KSkpOworCisJCQlpZihpbmZvX2VsZW1lbnQtPmRhdGFbMytvZmZzZXRdICYgKDE8PChpZWVlLT5hc3NvY19pZCU4KSkpIHsKKwkJCQluZXR3b3JrLT5kdGltX2RhdGEgfD0gSUVFRTgwMjExX0RUSU1fVUNBU1Q7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9JQlNTX1NFVDoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfSUJTU19TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQ0hBTExFTkdFOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9DSEFMTEVOR0U6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfR0VORVJJQzoKKwkJCS8vbmljIGlzIDg3QgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9HRU5FUklDOiAlZCBieXRlc1xuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPj0gNCAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSkgeworCQkJCW5ldHdvcmstPndwYV9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAorCQkJCQkJCSBNQVhfV1BBX0lFX0xFTik7CisJCQkJbWVtY3B5KG5ldHdvcmstPndwYV9pZSwgaW5mb19lbGVtZW50LAorCQkJCSAgICAgICBuZXR3b3JrLT53cGFfaWVfbGVuKTsKKwkJCX0KKworI2lmZGVmIFRIT01BU19UVVJCTworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID09IDcgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweGUwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NGMgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVs0XSA9PSAweDAyKSB7CisJCQkJbmV0d29yay0+VHVyYm9fRW5hYmxlID0gMTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKDEgPT0gc3RhdHMtPm5pY190eXBlKSB7Ly9uaWMgODcKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDUgICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMCkgeworCQkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAid21tIGluZm8gdXBkYXRlZDogJXhcbiIsIGluZm9fZWxlbWVudC0+ZGF0YVs2XSk7CisJCQkJLy9XTU0gSW5mb3JtYXRpb24gRWxlbWVudAorCQkJCW5ldHdvcmstPndtbV9pbmZvID0gaW5mb19lbGVtZW50LT5kYXRhWzZdOworCQkJCW5ldHdvcmstPlFvU19FbmFibGUgPSAxOworCQkJfQorCisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPj0gOCAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVs0XSA9PSAweDAxKSB7CisJCQkJLy8gTm90IGNhcmUgYWJvdXQgdmVyc2lvbiBhdCBwcmVzZW50LgorCQkJCS8vV01NIEluZm9ybWF0aW9uIEVsZW1lbnQKKwkJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIndtbSBpbmZvJnBhcmFtIHVwZGF0ZWQ6ICV4XG4iLCBpbmZvX2VsZW1lbnQtPmRhdGFbNl0pOworCQkJCW5ldHdvcmstPndtbV9pbmZvID0gaW5mb19lbGVtZW50LT5kYXRhWzZdOworCQkJCS8vV01NIFBhcmFtZXRlciBFbGVtZW50CisJCQkJbWVtY3B5KG5ldHdvcmstPndtbV9wYXJhbSwgKHU4ICopKGluZm9fZWxlbWVudC0+ZGF0YSArIDgpLChpbmZvX2VsZW1lbnQtPmxlbiAtIDgpKTsKKwkJCQluZXR3b3JrLT5Rb1NfRW5hYmxlID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1JTTjoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfUlNOOiAlZCBieXRlc1xuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQluZXR3b3JrLT5yc25faWVfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuICsgMiwKKwkJCQkJCSBNQVhfV1BBX0lFX0xFTik7CisJCQltZW1jcHkobmV0d29yay0+cnNuX2llLCBpbmZvX2VsZW1lbnQsCisJCQkgICAgICAgbmV0d29yay0+cnNuX2llX2xlbik7CisJCQlicmVhazsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWNhc2UgTUZJRV9UWVBFX0NPVU5UUlk6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0NPVU5UUlk6ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKy8vCQkJcHJpbnRrKCI9PT09PT5SZWNlaXZlIDwlcz4gQ291bnRyeSBJRVxuIixuZXR3b3JrLT5zc2lkKTsKKwkJCWllZWU4MDIxMV9leHRyYWN0X2NvdW50cnlfaWUoaWVlZSwgaW5mb19lbGVtZW50LCBuZXR3b3JrLCBiZWFjb24tPmhlYWRlci5hZGRyMik7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oInVuc3VwcG9ydGVkIElFICVkXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgIAkJfQorCisJCWxlZnQgLT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikgKworCQkJaW5mb19lbGVtZW50LT5sZW47CisJCWluZm9fZWxlbWVudCA9IChzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqKQorICAgICAgICAgICAgICAgIAkmaW5mb19lbGVtZW50LT5kYXRhW2luZm9fZWxlbWVudC0+bGVuXTsKKyAgCX0KKy8vYnkgYW15IDA4MDMxMgorCW5ldHdvcmstPkhpZ2hlc3RPcGVyYVJhdGUgPSBoT3BSYXRlOworLy9ieSBhbXkgMDgwMzEyCisJbmV0d29yay0+bW9kZSA9IDA7CisJaWYgKHN0YXRzLT5mcmVxID09IElFRUU4MDIxMV81MkdIWl9CQU5EKQorCQluZXR3b3JrLT5tb2RlID0gSUVFRV9BOworCWVsc2UgeworCQlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19PRkRNKQorCQkJbmV0d29yay0+bW9kZSB8PSBJRUVFX0c7CisJCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX0NDSykKKwkJCW5ldHdvcmstPm1vZGUgfD0gSUVFRV9COworCX0KKworCWlmIChuZXR3b3JrLT5tb2RlID09IDApIHsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkZpbHRlcmVkIG91dCAnJXMgKCIgTUFDX0ZNVCAiKScgIgorCQkJCSAgICAgIm5ldHdvcmsuXG4iLAorCQkJCSAgICAgZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsCisJCQkJCQkgIG5ldHdvcmstPnNzaWRfbGVuKSwKKwkJCQkgICAgIE1BQ19BUkcobmV0d29yay0+YnNzaWQpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbikpCisJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfRU1QVFlfRVNTSUQ7CisjaWYgMAorCXN0YXRzLT5zaWduYWwgPSBpZWVlODAyMTFfU2lnbmFsU3RyZW5ndGhUcmFuc2xhdGUoc3RhdHMtPnNpZ25hbCk7CisjZW5kaWYKKwlzdGF0cy0+c2lnbmFsID0gaWVlZTgwMjExX1RyYW5zbGF0ZVRvRGJtKHN0YXRzLT5zaWduYWxzdHJlbmd0aCk7CisJLy9zdGF0cy0+bm9pc2UgPSBzdGF0cy0+c2lnbmFsIC0gc3RhdHMtPm5vaXNlOworCXN0YXRzLT5ub2lzZSA9IGllZWU4MDIxMV9UcmFuc2xhdGVUb0RibSgxMDAgLSBzdGF0cy0+c2lnbmFsc3RyZW5ndGgpIC0gMjU7CisJbWVtY3B5KCZuZXR3b3JrLT5zdGF0cywgc3RhdHMsIHNpemVvZihuZXR3b3JrLT5zdGF0cykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NhbWVfbmV0d29yayhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnNyYywKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBpZWVlKQoreworCS8qIEEgbmV0d29yayBpcyBvbmx5IGEgZHVwbGljYXRlIGlmIHRoZSBjaGFubmVsLCBCU1NJRCwgRVNTSUQKKwkgKiBhbmQgdGhlIGNhcGFiaWxpdHkgZmllbGQgKGluIHBhcnRpY3VsYXIgSUJTUyBhbmQgQlNTKSBhbGwgbWF0Y2guCisJICogV2UgdHJlYXQgYWxsIDxoaWRkZW4+IHdpdGggdGhlIHNhbWUgQlNTSUQgYW5kIGNoYW5uZWwKKwkgKiBhcyBvbmUgbmV0d29yayAqLworCXJldHVybiAoKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pIHx8IChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSAmJiAgLy9ZSixtb2QsMDgwODE5LGZvciBoaWRkZW4gYXAKKwkJLy8oKHNyYy0+c3NpZF9sZW4gPT0gZHN0LT5zc2lkX2xlbikgJiYKKwkJKHNyYy0+Y2hhbm5lbCA9PSBkc3QtPmNoYW5uZWwpICYmCisJCSFtZW1jbXAoc3JjLT5ic3NpZCwgZHN0LT5ic3NpZCwgRVRIX0FMRU4pICYmCisJCSghbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSB8fCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYgLy9ZSixtb2QsMDgwODE5LGZvciBoaWRkZW4gYXAKKwkJLy8hbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSAmJgorCQkoKHNyYy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA9PQorCQkoZHN0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSAmJgorCQkoKHNyYy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpID09CisJCShkc3QtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSkpOworfQorCitpbmxpbmUgdm9pZCB1cGRhdGVfbmV0d29yayhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmRzdCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqc3JjKQoreworCXVuc2lnbmVkIGNoYXIgcXVhbGl0eSA9IHNyYy0+c3RhdHMuc2lnbmFsc3RyZW5ndGg7CisJdW5zaWduZWQgY2hhciBzaWduYWwgPSAwOworCXVuc2lnbmVkIGNoYXIgbm9pc2UgPSAwOworICAgICAgICBpZihkc3QtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHF1YWxpdHkgPSAoZHN0LT5zdGF0cy5zaWduYWxzdHJlbmd0aCAqIDUgKyBzcmMtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoICsgNSkvNjsKKyAgICAgICAgfQorCXNpZ25hbCA9IGllZWU4MDIxMV9UcmFuc2xhdGVUb0RibShxdWFsaXR5KTsKKwkvL25vaXNlID0gc2lnbmFsIC0gc3JjLT5zdGF0cy5ub2lzZTsKKwlpZihkc3QtPnN0YXRzLm5vaXNlID4gMCkKKwkJbm9pc2UgPSAoZHN0LT5zdGF0cy5ub2lzZSAqIDUgKyBzcmMtPnN0YXRzLm5vaXNlKS82OworICAgICAgICAvL2lmKHN0cmNtcChkc3QtPnNzaWQsICJsaW5rc3lzX2x6bTAwMCIpID09IDApCisvLwlwcmludGsoInNzaWQ6JXMsIHF1YWxpdHk6JWQsIHNpZ25hbDolZFxuIiwgZHN0LT5zc2lkLCBxdWFsaXR5LCBzaWduYWwpOworCW1lbWNweSgmZHN0LT5zdGF0cywgJnNyYy0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzKSk7CisJZHN0LT5zdGF0cy5zaWduYWxzdHJlbmd0aCA9IHF1YWxpdHk7CisJZHN0LT5zdGF0cy5zaWduYWwgPSBzaWduYWw7CisvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT5zdGF0cy5zaWduYWwgaXMgJWRcbiIsZHN0LT5zdGF0cy5zaWduYWwpOworCWRzdC0+c3RhdHMubm9pc2UgPSBub2lzZTsKKworCisJZHN0LT5jYXBhYmlsaXR5ID0gc3JjLT5jYXBhYmlsaXR5OworCW1lbWNweShkc3QtPnJhdGVzLCBzcmMtPnJhdGVzLCBzcmMtPnJhdGVzX2xlbik7CisJZHN0LT5yYXRlc19sZW4gPSBzcmMtPnJhdGVzX2xlbjsKKwltZW1jcHkoZHN0LT5yYXRlc19leCwgc3JjLT5yYXRlc19leCwgc3JjLT5yYXRlc19leF9sZW4pOworCWRzdC0+cmF0ZXNfZXhfbGVuID0gc3JjLT5yYXRlc19leF9sZW47CisJZHN0LT5IaWdoZXN0T3BlcmFSYXRlPSBzcmMtPkhpZ2hlc3RPcGVyYVJhdGU7CisJLy9wcmludGsoIj09PT09PT09PT0+aW4gJXM6IHNyYy0+c3NpZCBpcyAlcyxjaGFuIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxzcmMtPnNzaWQsc3JjLT5jaGFubmVsKTsKKworCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJaWYoc3JjLT5zc2lkX2xlbiA+IDApCisJeworCQkvL2lmKHNyYy0+c3NpZF9sZW4gPT0gMTMpCisJCS8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09Pj4+Pj4+Pj4gRHN0IHNzaWQ6ICVzIFNyYyBzc2lkOiAlc1xuIiwgZHN0LT5zc2lkLCBzcmMtPnNzaWQpOworCQltZW1zZXQoZHN0LT5zc2lkLCAwLCBkc3QtPnNzaWRfbGVuKTsKKwkJZHN0LT5zc2lkX2xlbiA9IHNyYy0+c3NpZF9sZW47CisJCW1lbWNweShkc3QtPnNzaWQsIHNyYy0+c3NpZCwgc3JjLT5zc2lkX2xlbik7CisJfQorCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwLGVuZAorCisJZHN0LT5jaGFubmVsID0gc3JjLT5jaGFubmVsOworCWRzdC0+bW9kZSA9IHNyYy0+bW9kZTsKKwlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKwlkc3QtPnRpbWVfc3RhbXBbMF0gPSBzcmMtPnRpbWVfc3RhbXBbMF07CisJZHN0LT50aW1lX3N0YW1wWzFdID0gc3JjLT50aW1lX3N0YW1wWzFdOworCisJZHN0LT5iZWFjb25faW50ZXJ2YWwgPSBzcmMtPmJlYWNvbl9pbnRlcnZhbDsKKwlkc3QtPmxpc3Rlbl9pbnRlcnZhbCA9IHNyYy0+bGlzdGVuX2ludGVydmFsOworCWRzdC0+YXRpbV93aW5kb3cgPSBzcmMtPmF0aW1fd2luZG93OworCWRzdC0+ZHRpbV9wZXJpb2QgPSBzcmMtPmR0aW1fcGVyaW9kOworCWRzdC0+ZHRpbV9kYXRhID0gc3JjLT5kdGltX2RhdGE7CisJZHN0LT5sYXN0X2R0aW1fc3RhX3RpbWVbMF0gPSBzcmMtPmxhc3RfZHRpbV9zdGFfdGltZVswXTsKKwlkc3QtPmxhc3RfZHRpbV9zdGFfdGltZVsxXSA9IHNyYy0+bGFzdF9kdGltX3N0YV90aW1lWzFdOworLy8JcHJpbnRrKCJ1cGRhdGU6JXMsIGR0aW1fcGVyaW9kOiV4LCBkdGltX2RhdGE6JXhcbiIsIHNyYy0+c3NpZCwgc3JjLT5kdGltX3BlcmlvZCwgc3JjLT5kdGltX2RhdGEpOworCW1lbWNweShkc3QtPndwYV9pZSwgc3JjLT53cGFfaWUsIHNyYy0+d3BhX2llX2xlbik7CisJZHN0LT53cGFfaWVfbGVuID0gc3JjLT53cGFfaWVfbGVuOworCW1lbWNweShkc3QtPnJzbl9pZSwgc3JjLT5yc25faWUsIHNyYy0+cnNuX2llX2xlbik7CisJZHN0LT5yc25faWVfbGVuID0gc3JjLT5yc25faWVfbGVuOworCisJZHN0LT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOworCS8qIGRzdC0+bGFzdF9hc3NvY2lhdGUgaXMgbm90IG92ZXJ3cml0dGVuICovCisvLyBkaXNhYmxlIFFvUyBwcm9jZXNzIG5vdywgYWRkZWQgYnkgRGF2aWQgMjAwNi83LzI1CisjaWYgMQorCWRzdC0+d21tX2luZm8gPSBzcmMtPndtbV9pbmZvOyAvL3N1cmUgdG8gZXhpc3QgaW4gYmVhY29uIG9yIHByb2JlIHJlc3BvbnNlIGZyYW1lLgorLyoKKwlpZigoZHN0LT53bW1faW5mb15zcmMtPndtbV9pbmZvKSYweDBmKSB7Ly9QYXJhbSBTZXQgQ291bnQgY2hhbmdlLCB1cGRhdGUgUGFyYW1ldGVyCisJICBtZW1jcHkoZHN0LT53bW1fcGFyYW0sIHNyYy0+d21tX3BhcmFtLCBJRUVFODAyMTFfQUNfUFJBTV9MRU4pOworCX0KKyovCisJaWYoc3JjLT53bW1fcGFyYW1bMF0uYWNfYWNpX2FjbV9haWZzbnx8IFwKKwkgICBzcmMtPndtbV9wYXJhbVsxXS5hY19hY2lfYWNtX2FpZnNufHwgXAorCSAgIHNyYy0+d21tX3BhcmFtWzJdLmFjX2FjaV9hY21fYWlmc258fCBcCisJICAgc3JjLT53bW1fcGFyYW1bMV0uYWNfYWNpX2FjbV9haWZzbikgeworCSAgbWVtY3B5KGRzdC0+d21tX3BhcmFtLCBzcmMtPndtbV9wYXJhbSwgV01FX0FDX1BSQU1fTEVOKTsKKwl9CisJZHN0LT5Rb1NfRW5hYmxlID0gc3JjLT5Rb1NfRW5hYmxlOworI2Vsc2UKKwlkc3QtPlFvU19FbmFibGUgPSAxOy8vZm9yIFJ0bDgxODcgc2ltdWxhdGlvbgorI2VuZGlmCisJZHN0LT5TaWduYWxTdHJlbmd0aCA9IHNyYy0+U2lnbmFsU3RyZW5ndGg7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJZHN0LT5UdXJib19FbmFibGUgPSBzcmMtPlR1cmJvX0VuYWJsZTsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlkc3QtPkNvdW50cnlJZUxlbiA9IHNyYy0+Q291bnRyeUllTGVuOworCW1lbWNweShkc3QtPkNvdW50cnlJZUJ1Ziwgc3JjLT5Db3VudHJ5SWVCdWYsIHNyYy0+Q291bnRyeUllTGVuKTsKKyNlbmRpZgorfQorCisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0d29yazsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnRhcmdldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm9sZGVzdCA9IE5VTEw7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQgPSAmYmVhY29uLT5pbmZvX2VsZW1lbnQ7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNob3J0IHJlbmV3OworCXU4IHdtbV9pbmZvOworCXU4IGlzX2JlYWNvbiA9IChXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pPyAxOjA7ICAvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCisJbWVtc2V0KCZuZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisvL3J6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2VfMSkgeworCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2VfMShpZWVlLCBiZWFjb24sIHN0YXRzKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJSUVFRTgwMjExX0RFQlVHX1NDQU4oCisJCSInJXMnICgiIE1BQ19GTVQgIik6ICVjJWMlYyVjICVjJWMlYyVjLSVjJWMlYyVjICVjJWMlYyVjXG4iLAorCQllc2NhcGVfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLCBpbmZvX2VsZW1lbnQtPmxlbiksCisJCU1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MCkpID8gJzEnIDogJzAnKTsKKyNpZiAwCisJaWYoc3RyY21wKGVzY2FwZV9lc3NpZChiZWFjb24tPmluZm9fZWxlbWVudC5kYXRhLCBiZWFjb24tPmluZm9fZWxlbWVudC5sZW4pLCAicnRsX3NvZnRhcCIpID09IDApCisJeworCQlpZihXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pCisJCXsKKwkJCXUzMiBpID0gMCwgbGVuID0gc3RhdHMtPmxlbjsKKwkJCXU4ICogcCA9ICh1OCopYmVhY29uOworCQkJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCQlwcmludGsoInJ0bF9zb2Z0YXAgQmVhY29uOiIpOworCQkJZm9yKGk9MDsgaTxsZW47IGkrKykKKwkJCQlwcmludGsoIlx0JTIuMngiLCAqKHAraSkpOworCQkJcHJpbnRrKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChpZWVlODAyMTFfbmV0d29ya19pbml0KGllZWUsIGJlYWNvbiwgJm5ldHdvcmssIHN0YXRzKSkgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRHJvcHBlZCAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgIGluZm9fZWxlbWVudC0+bGVuKSwKKwkJCQkgICAgIE1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkvLyBGb3IgQXN1cyBFZWVQYyByZXF1ZXN0LAorCS8vICgxKSBpZiB3aXJlbGVzcyBhZGFwdGVyIHJlY2VpdmUgZ2V0IGFueSA4MDIuMTFkIGNvdW50cnkgY29kZSBpbiBBUCBiZWFjb24sCisJLy8JICAgd2lyZWxlc3MgYWRhcHRlciBzaG91bGQgZm9sbG93IHRoZSBjb3VudHJ5IGNvZGUuCisJLy8gKDIpICBJZiB0aGVyZSBpcyBubyBhbnkgY291bnRyeSBjb2RlIGluIGJlYWNvbiwKKwkvLyAgICAgICB0aGVuIHdpcmVsZXNzIGFkYXB0ZXIgc2hvdWxkIGRvIGFjdGl2ZSBzY2FuIGZyb20gY2gxfjExIGFuZAorCS8vICAgICAgIHBhc3NpdmUgc2NhbiBmcm9tIGNoMTJ+MTQKKwlpZihpZWVlLT5iR2xvYmFsRG9tYWluKQorCXsKKwkJaWYgKFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0gSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApCisJCXsKKwkJCS8vIENhc2UgMTogQ291bnRyeSBjb2RlCisJCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpICkKKwkJCXsKKwkJCQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgQ291bnRyeSBjb2RlLCBmaWx0ZXIgcHJvYmUgcmVzcG9uc2UgYXQgY2hhbm5lbCglZCkuXG4iLCBuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gQ2FzZSAyOiBObyBhbnkgY291bnRyeSBjb2RlLgorCQkJZWxzZQorCQkJeworCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAorCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDExKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwgbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIENhc2UgMTogQ291bnRyeSBjb2RlCisJCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpICkKKwkJCXsKKwkJCQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgQ291bnRyeSBjb2RlLCBmaWx0ZXIgYmVhY29uIGF0IGNoYW5uZWwoJWQpLlxuIixuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gQ2FzZSAyOiBObyBhbnkgY291bnRyeSBjb2RlLgorCQkJZWxzZQorCQkJeworCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAorCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDE0KQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIGJlYWNvbiBhdCBjaGFubmVsKCVkKS5cbiIsbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCS8qIFRoZSBuZXR3b3JrIHBhcnNlZCBjb3JyZWN0bHkgLS0gc28gbm93IHdlIHNjYW4gb3VyIGtub3duIG5ldHdvcmtzCisJICogdG8gc2VlIGlmIHdlIGNhbiBmaW5kIGl0IGluIG91ciBsaXN0LgorCSAqCisJICogTk9URTogIFRoaXMgc2VhcmNoIGlzIGRlZmluaXRlbHkgbm90IG9wdGltaXplZC4gIE9uY2UgaXRzIGRvaW5nCisJICogICAgICAgIHRoZSAicmlnaHQgdGhpbmciIHdlJ2xsIG9wdGltaXplIGl0IGZvciBlZmZpY2llbmN5IGlmCisJICogICAgICAgIG5lY2Vzc2FyeSAqLworCisJLyogU2VhcmNoIGZvciB0aGlzIGVudHJ5IGluIHRoZSBsaXN0IGFuZCB1cGRhdGUgaXQgaWYgaXQgaXMKKwkgKiBhbHJlYWR5IHRoZXJlLiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmKGlzX3NhbWVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yaywgaWVlZSkpIHsKKwkJd21tX2luZm8gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm87CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCWlmKGlzX2JlYWNvbiA9PSAwKQorCQkJbmV0d29yay5mbGFncyA9ICh+TkVUV09SS19FTVBUWV9FU1NJRCAmIG5ldHdvcmsuZmxhZ3MpfChORVRXT1JLX0VNUFRZX0VTU0lEICYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmZsYWdzKTsKKwkJZWxzZSBpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQkJaWVlZS0+TnVtUnhCY25JblBlcmlvZCsrOworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcCxlbmQKKwkJLy9wcmludGsoIj09PT0+bmV0d29yay5zc2lkPSVzIGN1cl9zc2lkPSVzXG4iLCBuZXR3b3JrLnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkKTsKKwkJdXBkYXRlX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmspOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCWlmIChpc19zYW1lX25ldHdvcmsodGFyZ2V0LCAmbmV0d29yaywgaWVlZSkpCisJCQlicmVhazsKKwkJaWYgKChvbGRlc3QgPT0gTlVMTCkgfHwKKwkJICAgICh0YXJnZXQtPmxhc3Rfc2Nhbm5lZCA8IG9sZGVzdC0+bGFzdF9zY2FubmVkKSkKKwkJCW9sZGVzdCA9IHRhcmdldDsKKwl9CisKKwkvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB0aGVuIGdldCBhIG5ldyBuZXR3b3JrIHNsb3QgdG8gaW5pdGlhbGl6ZQorCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbiAqLworCWlmICgmdGFyZ2V0LT5saXN0ID09ICZpZWVlLT5uZXR3b3JrX2xpc3QpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KSkgeworCQkJLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2xvdHMsIGV4cGlyZSB0aGUgb2xkZXN0ICovCisJCQlsaXN0X2RlbCgmb2xkZXN0LT5saXN0KTsKKwkJCXRhcmdldCA9IG9sZGVzdDsKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJFeHBpcmVkICclcycgKCIgTUFDX0ZNVCAiKSBmcm9tICIKKwkJCQkJICAgICAibmV0d29yayBsaXN0LlxuIiwKKwkJCQkJICAgICBlc2NhcGVfZXNzaWQodGFyZ2V0LT5zc2lkLAorCQkJCQkJCSAgdGFyZ2V0LT5zc2lkX2xlbiksCisJCQkJCSAgICAgTUFDX0FSRyh0YXJnZXQtPmJzc2lkKSk7CisJCX0gZWxzZSB7CisJCQkvKiBPdGhlcndpc2UganVzdCBwdWxsIGZyb20gdGhlIGZyZWUgbGlzdCAqLworCQkJdGFyZ2V0ID0gbGlzdF9lbnRyeShpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0LAorCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrLCBsaXN0KTsKKwkJCWxpc3RfZGVsKGllZWUtPm5ldHdvcmtfZnJlZV9saXN0Lm5leHQpOworCQl9CisKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkFkZGluZyAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChuZXR3b3JrLnNzaWQsCisJCQkJCQkgIG5ldHdvcmsuc3NpZF9sZW4pLAorCQkJCSAgICAgTUFDX0FSRyhuZXR3b3JrLmJzc2lkKSwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KKwkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CisjZW5kaWYKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwluZXR3b3JrLmV4dF9lbnRyeSA9IHRhcmdldC0+ZXh0X2VudHJ5OworI2VuZGlmCisJCW1lbWNweSh0YXJnZXQsICZuZXR3b3JrLCBzaXplb2YoKnRhcmdldCkpOworCQlsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmxpc3QsICZpZWVlLT5uZXR3b3JrX2xpc3QpOworCQlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwmbmV0d29yayk7CisJfSBlbHNlIHsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlVwZGF0aW5nICclcycgKCIgTUFDX0ZNVCAiKSB2aWEgJXMuXG4iLAorCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCSAgdGFyZ2V0LT5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKHRhcmdldC0+YnNzaWQpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKworCQkvKiB3ZSBoYXZlIGFuIGVudHJ5IGFuZCB3ZSBhcmUgZ29pbmcgdG8gdXBkYXRlIGl0LiBCdXQgdGhpcyBlbnRyeSBtYXkKKwkJICogYmUgYWxyZWFkeSBleHBpcmVkLiBJbiB0aGlzIGNhc2Ugd2UgZG8gdGhlIHNhbWUgYXMgd2UgZm91bmQgYSBuZXcKKwkJICogbmV0IGFuZCBjYWxsIHRoZSBuZXdfbmV0IGhhbmRsZXIKKwkJICovCisJCXJlbmV3ID0gIXRpbWVfYWZ0ZXIodGFyZ2V0LT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcyk7CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCWlmKGlzX2JlYWNvbiA9PSAwKQorCQkJbmV0d29yay5mbGFncyA9ICh+TkVUV09SS19FTVBUWV9FU1NJRCAmIG5ldHdvcmsuZmxhZ3MpfChORVRXT1JLX0VNUFRZX0VTU0lEICYgdGFyZ2V0LT5mbGFncyk7CisJCS8vaWYoc3RybmNtcChuZXR3b3JrLnNzaWQsICJsaW5rc3lzLWMiLDkpID09IDApCisJCS8vCXByaW50aygiPT09PT4yIG5ldHdvcmsuc3NpZD0lcyBGTEFHPSVkIHRhcmdldC5zc2lkPSVzIEZMQUc9JWRcbiIsIG5ldHdvcmsuc3NpZCwgbmV0d29yay5mbGFncywgdGFyZ2V0LT5zc2lkLCB0YXJnZXQtPmZsYWdzKTsKKwkJaWYoKChuZXR3b3JrLmZsYWdzICYgTkVUV09SS19FTVBUWV9FU1NJRCkgPT0gTkVUV09SS19FTVBUWV9FU1NJRCkgXAorCQkgICAgJiYgKCgobmV0d29yay5zc2lkX2xlbiA+IDApICYmIChzdHJuY21wKHRhcmdldC0+c3NpZCwgbmV0d29yay5zc2lkLCBuZXR3b3JrLnNzaWRfbGVuKSkpXAorCQkgICAgfHwoKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSBuZXR3b3JrLnNzaWRfbGVuKSYmKHN0cm5jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIG5ldHdvcmsuc3NpZCwgbmV0d29yay5zc2lkX2xlbikgPT0gMCkmJihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSkpKQorCQkJcmVuZXcgPSAxOworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcCxlbmQKKwkJdXBkYXRlX25ldHdvcmsodGFyZ2V0LCAmbmV0d29yayk7CisJCWlmKHJlbmV3ICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkpCisJCQlpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KGllZWUsJm5ldHdvcmspOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSkgeworCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgQkVBQ09OICglZClcbiIsCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiQmVhY29uXG4iKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCisJCQlpZWVlLCAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBQUk9CRSBSRVNQT05TRSAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlByb2JlIHJlc3BvbnNlXG4iKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCisJCQlpZWVlLCAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKy8vcnoKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgUFJPQkUgUkVRVUVTVCAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlByb2JlIHJlcXVlc3RcbiIpOworCQkvLy8KKwkJaWYoIGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9tZ3Rfb25fcHJvYmVfcmVxICkKKwkJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfbWd0X29uX3Byb2JlX3JlcSggaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKKwl9Cit9CisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yeF9tZ3QpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcngpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfbmV0d29ya19pbml0KTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitFWFBPUlRfU1lNQk9MKGllZWVfZXh0X3NrYl9wODAyMTFfdG9fZXRoZXIpOworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZmZlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0wLDAgKzEsNDAyOSBAQAorLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCisgKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgorICoKKyAqIEZldyBsaW5lcyBtaWdodCBiZSBzdG9sZW4gZnJvbSBvdGhlciBwYXJ0IG9mIHRoZSBpZWVlODAyMTEKKyAqIHN0YWNrLiBDb3B5cmlnaHQgd2hvIG93biBpdCdzIGNvcHlyaWdodAorICoKKyAqIFdQQSBjb2RlIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlci4KKyAqIENvcHlyaWdodCB3aG8gb3duIGl0J3MgY29weXJpZ2h0LgorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKK3U4IHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzE2XVs0XSA9IHsKKwl7MHgwMCwweDBGLDB4QUMsMHgwMH0sIC8vVXNlIGdyb3VwIGtleSwgLy9SZXNlcnZlZAorCXsweDAwLDB4MEYsMHhBQywweDAxfSwgLy9XRVAtNDAgICAgICAgICAvL1JTTkEgZGVmYXVsdAorCXsweDAwLDB4MEYsMHhBQywweDAyfSwgLy9US0lQICAgICAgICAgICAvL05PTkUJCS8ve3VzZWQganVzdCBhcyBkZWZhdWx0fQorCXsweDAwLDB4MEYsMHhBQywweDAzfSwgLy9XUkFQLWhpc3RvcmljYWwKKwl7MHgwMCwweDBGLDB4QUMsMHgwNH0sIC8vQ0NNUAorCXsweDAwLDB4MEYsMHhBQywweDA1fSwgLy9XRVAtMTA0Cit9OworCitzaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCit7CisJcmV0dXJuICgobmV0LnJhdGVzX2V4X2xlbiA+IDApIHx8IChuZXQucmF0ZXNfbGVuID4gNCkpOworfQorCitzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCit7CisJcmV0dXJuIChuZXQuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKK30KKworLyogcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG5lZWRlZCBmb3IgcGxlYWNpbmcgdGhlIFJBVEUgTUZJRQorICogdGFnIGFuZCB0aGUgRVhURU5ERUQgUkFURSBNRklFIHRhZyBpZiBuZWVkZWQuCisgKiBJdCBlbmNsdWRlcyB0d28gYnl0ZXMgcGVyIHRhZyBmb3IgdGhlIHRhZyBpdHNlbGYgYW5kIGl0cyBsZW4KKyAqLwordW5zaWduZWQgaW50IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IDA7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikKKwkJcmF0ZV9sZW4gPSBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOICsgMjsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKworCQlyYXRlX2xlbiArPSBJRUVFODAyMTFfT0ZETV9SQVRFX0xFTiArIDI7CisKKwlyZXR1cm4gcmF0ZV9sZW47Cit9CisKKy8qIHBsZWFjZSB0aGUgTUZJRSByYXRlLCB0YWcgdG8gdGhlIG1lbW9yeSAoZG91YmxlKSBwb2luZWQuCisgKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdAorICogaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX01GSUVfQnJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTOworCQkqdGFnKysgPSA0OworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CisJfQorCisJLyogV2UgbWF5IGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSByYXRlcyB0aGF0IHNwZWNpZmljIEhXIG1pZ2h0IHN1cHBvcnQgKi8KKwkqdGFnX3AgPSB0YWc7Cit9CisKK3ZvaWQgaWVlZTgwMjExX01GSUVfR3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCisJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKnRhZysrID0gODsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV85TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisKKwl9CisKKwkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcgbWlnaHQgc3VwcG9ydCAqLworCSp0YWdfcCA9IHRhZzsKK30KKworCit2b2lkIGllZWU4MDIxMV9XTU1fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCisJKnRhZysrID0gNzsKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4NTA7CisJKnRhZysrID0gMHhmMjsKKwkqdGFnKysgPSAweDAyOy8vNQorCSp0YWcrKyA9IDB4MDA7CisJKnRhZysrID0gMHgwMTsKKyNpZmRlZiBTVVBQT1JUX1VTUEQKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm8gJiAweDgwKSB7CisJCSp0YWcrKyA9IDB4MGZ8TUFYX1NQX0xlbjsKKwl9IGVsc2UgeworCQkqdGFnKysgPSBNQVhfU1BfTGVuOworCX0KKyNlbHNlCisJKnRhZysrID0gTUFYX1NQX0xlbjsKKyNlbmRpZgorCSp0YWdfcCA9IHRhZzsKK30KKworI2lmZGVmIFRIT01BU19UVVJCTwordm9pZCBpZWVlODAyMTFfVFVSQk9fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworCXU4ICp0YWcgPSAqdGFnX3A7CisKKyAgICAgICAgKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7IC8vMAorICAgICAgICAqdGFnKysgPSA3OworICAgICAgICAqdGFnKysgPSAweDAwOworICAgICAgICAqdGFnKysgPSAweGUwOworICAgICAgICAqdGFnKysgPSAweDRjOworICAgICAgICAqdGFnKysgPSAweDAxOy8vNQorICAgICAgICAqdGFnKysgPSAweDAyOworICAgICAgICAqdGFnKysgPSAweDExOworCSp0YWcrKyA9IDB4MDA7CisKKwkqdGFnX3AgPSB0YWc7CisJcHJpbnRrKEtFUk5fQUxFUlQgIlRoaXMgaXMgZW5hYmxlIHR1cmJvIG1vZGUgSUUgcHJvY2Vzc1xuIik7Cit9CisjZW5kaWYKKwordm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG5oOworCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArMSkgJSBNR01UX1FVRVVFX05VTTsKKworLyoKKyAqIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGJ1dCB3ZSBoYXZlIG5ld2VyIGZyYW1lcyB0aGVuCisgKiBqdXN0IG92ZXJ3cml0ZXMgdGhlIG9sZGVzdC4KKyAqCisgKiBpZiAobmggPT0gaWVlZS0+bWdtdF9xdWV1ZV90YWlsKQorICoJCXJldHVybiAtMTsKKyAqLworCWllZWUtPm1nbXRfcXVldWVfaGVhZCA9IG5oOworCWllZWUtPm1nbXRfcXVldWVfcmluZ1tuaF0gPSBza2I7CisKKwkvL3JldHVybiAwOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpyZXQ7CisKKwlpZihpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IGllZWUtPm1nbXRfcXVldWVfcmluZ1tpZWVlLT5tZ210X3F1ZXVlX3RhaWxdOworCisJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0KKwkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCsxKSAlIE1HTVRfUVVFVUVfTlVNOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpbml0X21nbXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkID0gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCk7CisKK2lubGluZSB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXI9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJLyogY2FsbGVkIHdpdGggMm5kIHBhcmFtIDAsIG5vIG1nbXQgbG9jayByZXF1aXJlZCAqLworCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMCk7CisKKwlpZihzaW5nbGUpeworCQlpZihpZWVlLT5xdWV1ZV9zdG9wKXsKKworCQkJZW5xdWV1ZV9tZ210KGllZWUsc2tiKTsKKwkJfWVsc2V7CisJCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCk7CisKKwkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCQllbHNlCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCX1lbHNleworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzKTsKKworCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCWVsc2UKKwkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOworCX0KK30KKworCitpbmxpbmUgdm9pZCBzb2Z0bWFjX3BzX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CisKKworCWlmKHNpbmdsZSl7CisKKwkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQllbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYsaWVlZS0+YmFzaWNfcmF0ZSk7CisKKwl9ZWxzZXsKKworCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCWVsc2UKKwkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOworCisJfQorLy8JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCit9CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQoraW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZGlzYXNzb2NpYXRlX3NrYigKKwkJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKKwkJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJCQl1OAlhc1JzbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUgKmRpc2FzczsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlkaXNhc3MgPSAoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZSAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZSkpOworCWRpc2Fzcy0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyk7CisJZGlzYXNzLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOworCisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisKKwlkaXNhc3MtPnJlYXNvbmNvZGUgPSBhc1JzbjsKKwlyZXR1cm4gc2tiOworfQordm9pZAorU2VuZERpc2Fzc29jaWF0aW9uKAorICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgdTgqICAgICAgICAgICAgICAgICAgICAgYXNTdGEsCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIGFzUnNuCispCit7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICAgICAgc2tiID0gaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoYmVhY29uLGllZWUsYXNSc24pOworICAgICAgICBpZiAoc2tiKXsKKyAgICAgICAgICAgICAgICBzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworICAgICAgICAgICAgICAgIC8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisgICAgICAgIH0KK30KKworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLHJhdGVfbGVuOworCXU4ICp0YWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKnJlcTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlzaG9ydCBleHRNb3JlID0gMDsKKwlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8xKQorCQlleHRNb3JlID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9iZV9yZXFfMShpZWVlKTsKKyNlbmRpZgorCisJbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOworCisJcmF0ZV9sZW4gPSBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihpZWVlKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZighZXh0TW9yZSkKKyNlbmRpZgorCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkgKworCQkJICAgIDIgKyBsZW4gKyByYXRlX2xlbik7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWVsc2UKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSArCisJCQkgICAgMiArIGxlbiArIHJhdGVfbGVuKzEyOCk7IC8vIE1FU0hJRCArIENBUAorI2VuZGlmCisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXEgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpKTsKKwlyZXEtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKKwlyZXEtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUU6IGlzIHRoaXMgT0sgPworCisJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIxLCAweGZmLCBFVEhfQUxFTik7CisJbWVtY3B5KHJlcS0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIzLCAweGZmLCBFVEhfQUxFTik7CisKKwl0YWcgPSAodTggKikgc2tiX3B1dChza2IsbGVuKzIrcmF0ZV9sZW4pOworCisJKnRhZysrID0gTUZJRV9UWVBFX1NTSUQ7CisJKnRhZysrID0gbGVuOworCW1lbWNweSh0YWcsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBsZW4pOworCXRhZyArPSBsZW47CisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCZ0YWcpOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGV4dE1vcmUpCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcHJvYmVfcmVxXzIoaWVlZSwgc2tiLCB0YWcpOworI2VuZGlmCisJcmV0dXJuIHNrYjsKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8vI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCisvL3ZvaWQgZXh0X2llZWU4MDIxMV9zZW5kX2JlYWNvbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCisvL3sKKy8vCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBleHRfc2VuZF9iZWFjb25fd3EpOworLy8jZWxzZQordm9pZCBleHRfaWVlZTgwMjExX3NlbmRfYmVhY29uX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworLy8jZW5kaWYKKworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CisKKwlpZiAoc2tiKXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KKworCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMV0gYmVhY29uIHNlbmRpbmchXG4iKTsKKwlpZWVlLT5iZWFjb25fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKKworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlpZihpZWVlLT5iZWFjb25fdHhpbmcpCisJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKKworCWlmIChza2IpeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2JlYWNvbnMrKzsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMV0gYmVhY29uIHNlbmRpbmchXG4iKTsKKwlpZWVlLT5iZWFjb25fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKKworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlpZihpZWVlLT5iZWFjb25fdHhpbmcpCisJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYih1bnNpZ25lZCBsb25nIF9pZWVlKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIF9pZWVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKKwlpZWVlODAyMTFfc2VuZF9iZWFjb24oaWVlZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVfcmVxX3dpdGhfU1NJRChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2hhciAqc3NpZCwgaW50IGxlbl9zc2lkKQoreworCXVuc2lnbmVkIGludCBsZW4scmF0ZV9sZW47CisJdTggKnRhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqcmVxOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCXNob3J0IGV4dE1vcmUgPSAwOworCWlmKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcHJvYmVfcmVxXzEpCisJCWV4dE1vcmUgPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8xKGllZWUpOworI2VuZGlmCisKKwlsZW4gPSBsZW5fc3NpZDsKKworCXJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoIWV4dE1vcmUpCisjZW5kaWYKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpICsKKwkJCSAgICAyICsgbGVuICsgcmF0ZV9sZW4pOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwllbHNlCisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkgKworCQkJICAgIDIgKyBsZW4gKyByYXRlX2xlbisxMjgpOyAvLyBNRVNISUQgKyBDQVAKKyNlbmRpZgorCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSk7CisJcmVxLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7CisJcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FOiBpcyB0aGlzIE9LID8KKworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMSwgMHhmZiwgRVRIX0FMRU4pOworCW1lbWNweShyZXEtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOworCisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLGxlbisyK3JhdGVfbGVuKTsKKworCSp0YWcrKyA9IE1GSUVfVFlQRV9TU0lEOworCSp0YWcrKyA9IGxlbjsKKwlpZihsZW4pCisJeworCQltZW1jcHkodGFnLCBzc2lkLCBsZW4pOworCQl0YWcgKz0gbGVuOworCX0KKworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwmdGFnKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihleHRNb3JlKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8yKGllZWUsIHNrYiwgdGFnKTsKKyNlbmRpZgorCXJldHVybiBza2I7Cit9CisKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKKwordm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXFfd2l0aF9TU0lEKGllZWUsIE5VTEwsIDApOworCWVsc2UKKyNlbmRpZgorCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXEoaWVlZSk7CisJaWYgKHNrYil7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfcHJvYmVfcnErKzsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPmFjdGl2ZV9zY2FuICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1BST0JFUlEpKXsKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmUoaWVlZSk7CisJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOworCX0KK30KKworLyogdGhpcyBwZXJmb3JtcyBzeW5jcm8gc2NhbiBibG9ja2luZyB0aGUgY2FsbGVyIHVudGlsIGFsbCBjaGFubmVscworICogaW4gdGhlIGFsbG93ZWQgY2hhbm5lbCBtYXAgaGFzIGJlZW4gY2hlY2tlZC4KKyAqLwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzaG9ydCBjaCA9IDA7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKwltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKyNlbmRpZgorCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKy8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PiBTeW5jIHNjYW5cbiIpOworLy8JZHVtcF9jaG5sX21hcChjaGFubmVsX21hcCk7CisKKwl3aGlsZSgxKQorCXsKKworCQlkb3sKKwkJCWNoKys7CisJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJZ290byBvdXQ7IC8qIHNjYW4gY29tcGxldGVkICovCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCX13aGlsZSghY2hhbm5lbF9tYXBbY2hdKTsKKyNlbHNlCisJCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbY2hdKTsKKyNlbmRpZgorCQkvKiB0aGlzIGZ1Y3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucworCQkgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKKwkJICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQorCQkgKiAgICB0aGVyZSBhcmUgbm8gaW50ZXJlc3RpbmcgY2VsbCBhbmQgdG8gY3JlYXRlIGEKKwkJICogICAgbmV3IG9uZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5rIHN0YXRlIGlzCisJCSAqICAgIElFRUU4MDIxMV9OT0xJTksgdW50aWwgd2UgZm91bmQgYW4gaW50ZXJlc3RpbmcgY2VsbC4KKwkJICogICAgSWYgc28gdGhlIGllZWU4MDIxX25ld19uZXQsIGNhbGxlZCBieSB0aGUgUlggcGF0aAorCQkgKiAgICB3aWxsIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwgc28gd2Ugc3RvcAorCQkgKiAgICBzY2FubmluZworCQkgKiAyLSBXZSBhcmUgbGlua2VkIGFuZCB0aGUgcm9vdCB1c2VzIHJ1biBpd2xpc3Qgc2Nhbi4KKwkJICogICAgU28gd2Ugc3dpdGNoIHRvIElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgdG8gcmVtZW1iZXIKKwkJICogICAgdGhhdCB3ZSBhcmUgc3RpbGwgbG9naWNhbGx5IGxpbmtlZCAobm90IGludGVyZXN0ZWQgaW4KKwkJICogICAgbmV3IG5ldHdvcmsgZXZlbnRzLCBkZXNwaXRlIGZvciB1cGRhdGluZyB0aGUgbmV0IGxpc3QsCisJCSAqICAgIGJ1dCB3ZSBhcmUgdGVtcG9yYXJseSAndW5saW5rZWQnIGFzIHRoZSBkcml2ZXIgc2hhbGwKKwkJICogICAgbm90IGZpbHRlciBSWCBmcmFtZXMgYW5kIHRoZSBjaGFubmVsIGlzIGNoYW5naW5nLgorCQkgKiBTbyB0aGUgb25seSBzaXR1YXRpb24gaW4gd2l0Y2ggYXJlIGludGVyZXN0ZWQgaXMgdG8gY2hlY2sKKwkJICogaWYgdGhlIHN0YXRlIGJlY29tZSBMSU5LRUQgYmVjYXVzZSBvZiB0aGUgIzEgc2l0dWF0aW9uCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQkJZ290byBvdXQ7CisKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaCk7CisvLwkJcHJpbnRrKCI9PT09PT5jaGFubmVsPSVkICAgIixjaCk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQlpZihjaGFubmVsX21hcFtjaF0gPT0gMSkKKyNlbmRpZgorCQl7CisvLwkJCXByaW50aygiPT09PXNlbmQgcHJvYmUgcmVxdWVzdFxuIik7CisJCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKKwkJfQorCQkvKiB0aGlzIHByZXZlbnQgZXhjZXNzaXZlIHRpbWUgd2FpdCB3aGVuIHdlCisJCSAqIG5lZWQgdG8gd2FpdCBmb3IgYSBzeW5jcm8gc2NhbiB0byBlbmQuLgorCQkgKi8KKwkJaWYgKGllZWUtPnN5bmNfc2Nhbl9odXJyeXVwKQorCQkJZ290byBvdXQ7CisKKworCQltc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwoSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKKworCX0KK291dDoKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2lwc19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgY2g7CisgICAgICAgIHVuc2lnbmVkIGludCB3YXRjaF9kb2cgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKyAgICAgICAgZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCWNoID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisvLyAgICAgIAlpZihpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKKy8vCXsKKworLy8JCXByaW50aygic3RvcCBzY2FuIHN5bmNcbiIpOworLy8gICAJCWdvdG8gb3V0OworLy8gIAl9CisvLwlwcmludGsoIj09PT09PT1oaD09PT09PT09PT09PT09PT5pcHMgc2NhblxuIik7CisgICAgIAl3aGlsZSgxKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogdGhpcyBmdWN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnMKKyAgICAgICAgICAgICAgICAgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgKiAgICBwZXJmb3JtaW5nIGEgY29tcGxldGUgc3luY3JvIHNjYW4gYmVmb3JlIGNvbmNsdWRlCisgICAgICAgICAgICAgICAgICogICAgdGhlcmUgYXJlIG5vIGludGVyZXN0aW5nIGNlbGwgYW5kIHRvIGNyZWF0ZSBhCisgICAgICAgICAgICAgICAgICogICAgbmV3IG9uZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5rIHN0YXRlIGlzCisgICAgICAgICAgICAgICAgICogICAgSUVFRTgwMjExX05PTElOSyB1bnRpbCB3ZSBmb3VuZCBhbiBpbnRlcmVzdGluZyBjZWxsLgorICAgICAgICAgICAgICAgICAqICAgIElmIHNvIHRoZSBpZWVlODAyMV9uZXdfbmV0LCBjYWxsZWQgYnkgdGhlIFJYIHBhdGgKKyAgICAgICAgICAgICAgICAgKiAgICB3aWxsIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwgc28gd2Ugc3RvcAorICAgICAgICAgICAgICAgICAqICAgIHNjYW5uaW5nCisgICAgICAgICAgICAgICAgICogMi0gV2UgYXJlIGxpbmtlZCBhbmQgdGhlIHJvb3QgdXNlcyBydW4gaXdsaXN0IHNjYW4uCisgICAgICAgICAgICAgICAgICogICAgU28gd2Ugc3dpdGNoIHRvIElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgdG8gcmVtZW1iZXIKKyAgICAgICAgICAgICAgICAgKiAgICB0aGF0IHdlIGFyZSBzdGlsbCBsb2dpY2FsbHkgbGlua2VkIChub3QgaW50ZXJlc3RlZCBpbgorICAgICAgICAgICAgICAgICAqICAgIG5ldyBuZXR3b3JrIGV2ZW50cywgZGVzcGl0ZSBmb3IgdXBkYXRpbmcgdGhlIG5ldCBsaXN0LAorICAgICAgICAgICAgICAgICAqICAgIGJ1dCB3ZSBhcmUgdGVtcG9yYXJseSAndW5saW5rZWQnIGFzIHRoZSBkcml2ZXIgc2hhbGwKKyAgICAgICAgICAgICAgICAgKiAgICBub3QgZmlsdGVyIFJYIGZyYW1lcyBhbmQgdGhlIGNoYW5uZWwgaXMgY2hhbmdpbmcuCisgICAgICAgICAgICAgICAgICogU28gdGhlIG9ubHkgc2l0dWF0aW9uIGluIHdpdGNoIGFyZSBpbnRlcmVzdGVkIGlzIHRvIGNoZWNrCisgICAgICAgICAgICAgICAgICogaWYgdGhlIHN0YXRlIGJlY29tZSBMSU5LRUQgYmVjYXVzZSBvZiB0aGUgIzEgc2l0dWF0aW9uCisgICAgICAgICAgICAgICAgICovCisJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQl7CisJCQlnb3RvIG91dDsKKwkJfQorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID4gMCkKKyNlbmRpZgorCQl7CisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKy8vCQkJcHJpbnRrKCI9PT09PT0+Y2hhbm5lbD0lZCAgIixpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJCX0KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQorI2VuZGlmCisJCXsKKy8vCQkJcHJpbnRrKCI9PT09c2VuZCBwcm9iZSByZXF1ZXN0XG4iKTsKKwkJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOworICAgICAgICAgICAgICAgIH0KKwkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQorICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gd2FpdCBmb3IgYSBzeW5jcm8gc2NhbiB0byBlbmQuLgorICAgICAgICAgICAgICAgICAqLworLy8gICAgICAgICAgICAgICAgaWYgKGllZWUtPnN5bmNfc2Nhbl9odXJyeXVwKQorLy8gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworCQltc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwoSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKKworCQlkb3sKKwkJCWlmICh3YXRjaF9kb2crKyA+PSBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCS8vCWlmICgrK3dhdGNoX2RvZyA+PSAxNSk7Ly9NQVhfQ0hBTk5FTF9OVU1CRVIpICAvL1lKLG1vZGlmaWVkLDA4MDYzMAorCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCArIDEpJU1BWF9DSEFOTkVMX05VTUJFUjsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCX13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbHNlCisJCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbmRpZgorICAgICAgICB9CitvdXQ6CisJLy9pZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisgICAJLy9pZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoKTsKKyAgIAkvL2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gY2g7CisJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOworI2VuZGlmCit9CisKKworI2lmIDAKKy8qIGNhbGxlZCBib3RoIGJ5IHdxIHdpdGggaWVlZS0+bG9jayBoZWxkICovCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgd2F0Y2hkb2cgPSAwOworCisJZG97CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0KKwkJCShpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCArIDEpICUgTUFYX0NIQU5ORUxfTlVNQkVSOworCQlpZiAod2F0Y2hkb2crKyA+IE1BWF9DSEFOTkVMX05VTUJFUikKKwkJCQlyZXR1cm47IC8qIG5vIGdvb2QgY2hhbnMgKi8KKworCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKworCisJc2NoZWR1bGVfd29yaygmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKK30KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9JUFMKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKwlzdGF0aWMgc2hvcnQgd2F0Y2hkb2cgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKy8vCXByaW50aygiaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cSBFTkFCTEVfSVBTXG4iKTsKKy8vCXByaW50aygiaW4gJXNcbiIsX19GVU5DVElPTl9fKTsKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisKKwlkb3sKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPQorCQkJKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMSkgJSBNQVhfQ0hBTk5FTF9OVU1CRVI7CisJCWlmICh3YXRjaGRvZysrID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkJCWdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisgCX13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbHNlCisgCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbmRpZgorCisJLy9wcmludGsoImN1cnJlbnRfbmV0d29yay5jaGFubmVsOiVkXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJaWYgKGllZWUtPnNjYW5uaW5nID09IDAgKQorCXsKKwkJcHJpbnRrKCJlcnJvciBvdXQsIHNjYW5uaW5nID0gMFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCisjZW5kaWYKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKwlyZXR1cm47CitvdXQ6CisJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwl3YXRjaGRvZyA9IDA7CisJaWVlZS0+c2Nhbm5pbmcgPSAwOworCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorCXJldHVybjsKK30KKyNlbHNlCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzb2Z0bWFjX3NjYW5fd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorCisgICAgICAgIHNob3J0IHdhdGNoZG9nID0gMDsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworI2VuZGlmCisvLyAgICAgIHByaW50aygiZW50ZXIgc2NhbiB3cSx3YXRjaGRvZyBpcyAlZFxuIix3YXRjaGRvZyk7CisgICAgICAgIGRvd24oJmllZWUtPnNjYW5fc2VtKTsKKworICAgICAgICBkb3sKKyAgICAgICAgICAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKKyAgICAgICAgICAgICAgICBpZiAod2F0Y2hkb2crKyA+IE1BWF9DSEFOTkVMX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7IC8qIG5vIGdvb2QgY2hhbnMgKi8KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyAgICAgICAgfXdoaWxlKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworI2Vsc2UKKyAgICAgICAgfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworI2VuZGlmCisKKy8vICAgICAgcHJpbnRrKCJjdXJyZW50X25ldHdvcmsuY2hhbm5lbDolZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworICAgICAgICBpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoImVycm9yIG91dCwgc2Nhbm5pbmcgPSAwXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCisjZW5kaWYKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CitvdXQ6CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorfQorCisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9jYih1bnNpZ25lZCBsb25nIF9kZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKV9kZXY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW4oaWVlZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKKwordm9pZCBpZWVlODAyMTFfYmVhY29uc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKworCWllZWUtPmJlYWNvbl90eGluZyA9IDE7CisJaWVlZTgwMjExX3NlbmRfYmVhY29uKGllZWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworfQorCit2b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisKKwlpZWVlLT5iZWFjb25fdHhpbmcgPSAwOworIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YmVhY29uX3RpbWVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKQorCQlpZWVlLT5zdG9wX3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCWllZWU4MDIxMV9iZWFjb25zX3N0b3AoaWVlZSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucykKKwkJaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKGllZWUtPmRldik7CisJaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19CRUFDT05TKQorCQlpZWVlODAyMTFfYmVhY29uc19zdGFydChpZWVlKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKy8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvL2llZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKworCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKy8vCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMSl7CisJCWllZWUtPnNjYW5uaW5nID0gMDsKKwkJLy9kZWxfdGltZXJfc3luYygmaWVlZS0+c2Nhbl90aW1lcik7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CisJfQorCisvLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKK30KKwordm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCisJCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihpZWVlKTsKKwllbHNlCisJCWllZWUtPnN0b3Bfc2NhbihpZWVlLT5kZXYpOworfQorCisvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCXsKKwkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJeworCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorI2VuZGlmCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTil7CisJCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKQorCQl7CisJCQlpZWVlLT5zY2FubmluZyA9IDE7CisJCQkvL2llZWU4MDIxMV9zb2Z0bWFjX3NjYW4oaWVlZSk7CisJCS8vCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EpOworCQkvL2NhcmUgdGhpcywxMjAzLDIwMDcsYnkgbGF3cmVuY2UKKyNpZiAxCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsMCk7CisjZW5kaWYKKwkJfQorCX1lbHNlCisJCWllZWUtPnN0YXJ0X3NjYW4oaWVlZS0+ZGV2KTsKKworfQorCisvKiBjYWxsZWQgd2l0aCB3eF9zZW0gaGVsZCAqLwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCXsKKwkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJeworCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorI2VuZGlmCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikKKwkJaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oaWVlZSk7CisJZWxzZQorCQlpZWVlLT5zY2FuX3N5bmNybyhpZWVlLT5kZXYpOworCit9CisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IGNoYWxsZW5nZWxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmF1dGg7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArIGNoYWxsZW5nZWxlbik7CisKKwlpZiAoIXNrYikgcmV0dXJuIE5VTEw7CisKKwlhdXRoID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSk7CisKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gSUVFRTgwMjExX1NUWVBFX0FVVEg7CisJaWYgKGNoYWxsZW5nZWxlbikgYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCB8PSBJRUVFODAyMTFfRkNUTF9XRVA7CisKKwlhdXRoLT5oZWFkZXIuZHVyYXRpb25faWQgPSAweDAxM2E7IC8vRklYTUUKKworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJYXV0aC0+YWxnb3JpdGhtID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCisJYXV0aC0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUxNihpZWVlLT5hc3NvY2lhdGVfc2VxKTsKKwlpZWVlLT5hc3NvY2lhdGVfc2VxKys7CisKKwlhdXRoLT5zdGF0dXMgPSBjcHVfdG9fbGUxNihXTEFOX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybiBza2I7CisKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfcHJvYmVfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCit7CisJdTggKnRhZzsKKwlpbnQgYmVhY29uX3NpemU7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uX2J1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlbmNyeXB0OworCWludCBhdGltX2xlbixlcnBfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisKKwljaGFyICpzc2lkID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQ7CisJaW50IHNzaWRfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOworCWludCByYXRlX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4rMjsKKwlpbnQgcmF0ZV9leF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuOworCWludCB3cGFfaWVfbGVuID0gaWVlZS0+d3BhX2llX2xlbjsKKwlpZihyYXRlX2V4X2xlbiA+IDApIHJhdGVfZXhfbGVuKz0yOworCisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykKKwkJYXRpbV9sZW4gPSA0OworCWVsc2UKKwkJYXRpbV9sZW4gPSAwOworCisJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspKQorCQllcnBfbGVuID0gMzsKKwllbHNlCisJCWVycF9sZW4gPSAwOworCisJYmVhY29uX3NpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSkrCisJCXNzaWRfbGVuCisJCSszIC8vY2hhbm5lbAorCQkrcmF0ZV9sZW4KKwkJK3JhdGVfZXhfbGVuCisJCSthdGltX2xlbgorCQkrd3BhX2llX2xlbgorCQkrZXJwX2xlbjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoYmVhY29uX3NpemUpOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYmVhY29uX2J1ZiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKikgc2tiX3B1dChza2IsIGJlYWNvbl9zaXplKTsKKworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCWJlYWNvbl9idWYtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUUKKwliZWFjb25fYnVmLT5iZWFjb25faW50ZXJ2YWwgPQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsKKwliZWFjb25fYnVmLT5jYXBhYmlsaXR5ID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKwlpZihpZWVlLT5zaG9ydF9zbG90ICYmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSkKKwkJY3B1X3RvX2xlMTYoKGJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKTsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJgorCQkoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSkgfHwgd3BhX2llX2xlbik7CisKKwlpZiAoZW5jcnlwdCkKKwkJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisKKworCWJlYWNvbl9idWYtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7CisKKwliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuaWQgPSBNRklFX1RZUEVfU1NJRDsKKwliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQubGVuID0gc3NpZF9sZW47CisKKwl0YWcgPSAodTgqKSBiZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuZGF0YTsKKworCW1lbWNweSh0YWcsIHNzaWQsIHNzaWRfbGVuKTsKKworCXRhZyArPSBzc2lkX2xlbjsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTOworCSoodGFnKyspID0gcmF0ZV9sZW4tMjsKKwltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlcyxyYXRlX2xlbi0yKTsKKwl0YWcrPXJhdGVfbGVuLTI7CisKKwkqKHRhZysrKSA9IE1GSUVfVFlQRV9EU19TRVQ7CisJKih0YWcrKykgPSAxOworCSoodGFnKyspID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisKKwlpZihhdGltX2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0lCU1NfU0VUOworCQkqKHRhZysrKSA9IDI7CisJCSooKHUxNiopKHRhZykpID0gY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsKKwkJdGFnKz0yOworCX0KKworCWlmKGVycF9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9FUlA7CisJCSoodGFnKyspID0gMTsKKwkJKih0YWcrKykgPSAwOworCX0KKworCWlmKHJhdGVfZXhfbGVuKXsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVNfRVg7CisJCSoodGFnKyspID0gcmF0ZV9leF9sZW4tMjsKKwkJbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXgscmF0ZV9leF9sZW4tMik7CisJCXRhZys9cmF0ZV9leF9sZW4tMjsKKwl9CisKKwlpZiAod3BhX2llX2xlbikKKwl7CisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCXsvL2FzIFdpbmRvd3Mgd2lsbCBzZXQgcGFpcndpc2Uga2V5IHNhbWUgYXMgdGhlIGdyb3VwIGtleSB3aGljaCBpcyBub3QgYWxsb3dlZCBpbiBMaW51eCwgc28gc2V0IHRoaXMgZm9yIElPVCBpc3N1ZS4gV0IgMjAwOC4wNy4wNworCQkJbWVtY3B5KCZpZWVlLT53cGFfaWVbMTRdLCAmaWVlZS0+d3BhX2llWzhdLCA0KTsKKwkJfQorCisJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CisJfQorCisJc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisJcmV0dXJuIHNrYjsKK30KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2V4dF9wcm9iZV9yZXNwX2J5X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KQoreworCXU4ICp0YWc7CisJaW50IGJlYWNvbl9zaXplOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbl9idWY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZW5jcnlwdDsKKwlpbnQgYXRpbV9sZW4sZXJwX2xlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCXU4IGJyb2FkY2FzdF9hZGRyW10gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCWludCB3cGFfaWVfbGVuID0gaWVlZS0+d3BhX2llX2xlbjsKKwljaGFyICpzc2lkID0gbmV0LT5zc2lkOworCWludCBzc2lkX2xlbiA9IG5ldC0+c3NpZF9sZW47CisKKwlpbnQgcmF0ZV9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuKzI7CisJaW50IHJhdGVfZXhfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsKKwlpZihyYXRlX2V4X2xlbiA+IDApIHJhdGVfZXhfbGVuKz0yOworCisJaWYoIGllZWUtPm1lc2hTY2FuTW9kZSY0KQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cV9zZXRfY2hhbm5lbChpZWVlKTsKKwlpZiggaWVlZS0+bWVzaFNjYW5Nb2RlJjYpCisJeworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5leHRfc3RvcF9zY2FuX3dxKTsKKyNlbHNlCisJCXNjaGVkdWxlX3Rhc2soJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworI2VuZGlmCisJfQorCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpIC8vIHVzZSBjdXJyZW50X25ldHdvcmsgaGVyZQorCQlhdGltX2xlbiA9IDQ7CisJZWxzZQorCQlhdGltX2xlbiA9IDA7CisKKwlpZihpZWVlODAyMTFfaXNfNTRnKCpuZXQpKQorCQllcnBfbGVuID0gMzsKKwllbHNlCisJCWVycF9sZW4gPSAwOworCisJYmVhY29uX3NpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSkrCisJCXNzaWRfbGVuCisJCSszIC8vY2hhbm5lbAorCQkrcmF0ZV9sZW4KKwkJK3JhdGVfZXhfbGVuCisJCSthdGltX2xlbgorCQkrZXJwX2xlbjsKKy8vYgorCXNrYiA9IGRldl9hbGxvY19za2IoYmVhY29uX3NpemUrMTk2KTsKKworCWlmICghc2tiKQorIAkJcmV0dXJuIE5VTEw7CisKKwliZWFjb25fYnVmID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UqKSBza2JfcHV0KHNrYiwgYmVhY29uX3NpemUpOworCisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRQorCisJYmVhY29uX2J1Zi0+YmVhY29uX2ludGVydmFsID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7ICAvLyB1c2UgY3VycmVudF9uZXR3b3JrIGhlcmUKKwliZWFjb25fYnVmLT5jYXBhYmlsaXR5ID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKwlpZihpZWVlLT5zaG9ydF9zbG90ICYmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSkKKwkJY3B1X3RvX2xlMTYoKGJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKTsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJgorCQkoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSl8fHdwYV9pZV9sZW4pOworCisJaWYgKGVuY3J5cHQpCisJCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisKKwliZWFjb25fYnVmLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOworCisJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmlkID0gTUZJRV9UWVBFX1NTSUQ7CisJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmxlbiA9IHNzaWRfbGVuOworCisJdGFnID0gKHU4KikgYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmRhdGE7CisKKwkvLyBicm9jYWQgY2FzdCAvIHByb2JlIHJzcAorCWlmKG1lbWNtcChkZXN0LCBicm9hZGNhc3RfYWRkciwgRVRIX0FMRU4gKSkKKwkJbWVtY3B5KHRhZywgc3NpZCwgc3NpZF9sZW4pOworCWVsc2UKKwkJc3NpZF9sZW49MDsKKworCXRhZyArPSBzc2lkX2xlbjsKKworLy9nZXRfYnNzcmF0ZV9zZXQocHJpdiwgX1NVUFBPUlRFRFJBVEVTX0lFXywgJnBic3NyYXRlLCAmYnNzcmF0ZV9sZW4pOworLy9wYnVmID0gc2V0X2llKHBidWYsIF9TVVBQT1JURURSQVRFU19JRV8sIGJzc3JhdGVfbGVuLCBwYnNzcmF0ZSwgJmZybGVuKTsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTOworCSoodGFnKyspID0gcmF0ZV9sZW4tMjsKKwltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlcyxyYXRlX2xlbi0yKTsKKwl0YWcrPXJhdGVfbGVuLTI7CisKKwkqKHRhZysrKSA9IE1GSUVfVFlQRV9EU19TRVQ7CisJKih0YWcrKykgPSAxOworCSoodGFnKyspID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7ICAvLyB1c2UgY3VycmVudF9uZXR3b3JrIGhlcmUKKworCisJaWYoYXRpbV9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9JQlNTX1NFVDsKKwkJKih0YWcrKykgPSAyOworCQkqKCh1MTYqKSh0YWcpKSA9IGNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7IC8vIHVzZSBjdXJyZW50X25ldHdvcmsgaGVyZQorCQl0YWcrPTI7CisJfQorCisJaWYoZXJwX2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0VSUDsKKwkJKih0YWcrKykgPSAxOworCQkqKHRhZysrKSA9IDA7CisJfQorCisJaWYocmF0ZV9leF9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKih0YWcrKykgPSByYXRlX2V4X2xlbi0yOworCQltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCxyYXRlX2V4X2xlbi0yKTsKKwkJdGFnKz1yYXRlX2V4X2xlbi0yOworCX0KKwlpZiAod3BhX2llX2xlbikKKwkJbWVtY3B5KHRhZywgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKworCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OworCXJldHVybiBza2I7Cit9CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2Fzc29jX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTgqIHRhZzsKKworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2M7CisJc2hvcnQgZW5jcnlwdDsKKworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCWludCBsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkgKyByYXRlX2xlbjsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWFzc29jID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKikKKwkJc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKTsKKworCWFzc29jLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMywgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJYXNzb2MtPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSID8KKwkJV0xBTl9DQVBBQklMSVRZX0JTUyA6IFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKworCisJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCisJaWYgKGllZWUtPmhvc3RfZW5jcnlwdCkKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWVsc2UgY3J5cHQgPSBOVUxMOworCisJZW5jcnlwdCA9ICggY3J5cHQgJiYgY3J5cHQtPm9wcyk7CisKKwlpZiAoZW5jcnlwdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisJYXNzb2MtPnN0YXR1cyA9IDA7CisJYXNzb2MtPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkKTsKKwlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KSBpZWVlLT5hc3NvY19pZD0wOworCWVsc2UgaWVlZS0+YXNzb2NfaWQrKzsKKworCXRhZyA9ICh1OCopIHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfYXV0aF9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLGludCBzdGF0dXMsIHU4ICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pKzEpOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiLT5sZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbik7CisKKwlhdXRoID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKilza2ItPmRhdGE7CisKKwlhdXRoLT5zdGF0dXMgPSBjcHVfdG9fbGUxNihzdGF0dXMpOworCWF1dGgtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoMik7CisJYXV0aC0+YWxnb3JpdGhtID0gY3B1X3RvX2xlMTYoV0xBTl9BVVRIX09QRU4pOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjMsIGRlc3QsIEVUSF9BTEVOKTsKKyNlbHNlCisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMywgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworI2VuZGlmCisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOworCXJldHVybiBza2I7CisKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX251bGxfZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxzaG9ydCBwd3IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogaGRyOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisKKwltZW1jcHkoaGRyLT5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwloZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJSUVFRTgwMjExX1NUWVBFX05VTExGVU5DIHwgSUVFRTgwMjExX0ZDVExfVE9EUyB8CisJCShwd3IgPyBJRUVFODAyMTFfRkNUTF9QTTowKSk7CisKKwlyZXR1cm4gc2tiOworCisKK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2Fzc29jX3Jlc3AoaWVlZSwgZGVzdCk7CisKKwlpZiAoYnVmKXsKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHMsIHU4KiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXV0aF9yZXNwKGllZWUsIHMsIGRlc3QpOworCisJaWYgKGJ1Zil7CisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7CisJCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfcHJvYmVfcmVzcChpZWVlLCBkZXN0KTsKKworCWlmIChidWYpIHsKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbixzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqaGRyOworCXU4ICp0YWc7CisJLy9zaG9ydCBpbmZvX2FkZHIgPSAwOworCS8vaW50IGk7CisJLy91MTYgc3VpdGVfY291bnQgPSAwOworCS8vdTggc3VpdF9zZWxlY3QgPSAwOworCXVuc2lnbmVkIGludCB3cGFfbGVuID0gYmVhY29uLT53cGFfaWVfbGVuOworCS8vc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwkvL3VuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkvL3U4ICpidWZmOworCS8vdTggKnA7CisjaWYgMQorCS8vIGZvciB0ZXN0aW5nIHB1cnBvc2UKKwl1bnNpZ25lZCBpbnQgcnNuX2xlbiA9IGJlYWNvbi0+cnNuX2llX2xlbjsKKyNlbHNlCisJdW5zaWduZWQgaW50IHJzbl9sZW4gPSBiZWFjb24tPnJzbl9pZV9sZW4gLSA0OworI2VuZGlmCisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisJdW5zaWduZWQgaW50IHdtbV9pbmZvX2xlbiA9IGJlYWNvbi0+UW9TX0VuYWJsZT85OjA7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdW5zaWduZWQgaW50IHR1cmJvX2luZm9fbGVuID0gYmVhY29uLT5UdXJib19FbmFibGU/OTowOworI2VuZGlmCisKKwl1OCAgZW5jcnlfcHJvdG8gPSBpZWVlLT53cGF4X3R5cGVfbm90aWZ5ICYgMHhmZjsKKwkvL3U4ICBwYWlyd2lzZV90eXBlID0gKGllZWUtPndwYXhfdHlwZV9ub3RpZnkgPj4gOCkgJiAweGZmOworCS8vdTggIGF1dGhlbl90eXBlID0gKGllZWUtPndwYXhfdHlwZV9ub3RpZnkgPj4gMTYpICYgMHhmZjsKKworCWludCBsZW4gPSAwOworCisJLy9bMF0gTm90aWZ5IHR5cGUgb2YgZW5jcnlwdGlvbjogV1BBL1dQQTIKKwkvL1sxXSBwYWlyIHdpc2UgdHlwZQorCS8vWzJdIGF1dGhlbiB0eXBlCisJaWYoaWVlZS0+d3BheF90eXBlX3NldCkgeworCQlpZiAoSUVFRV9QUk9UT19XUEEgPT0gZW5jcnlfcHJvdG8pIHsKKwkJCXJzbl9sZW4gPSAwOworCQl9IGVsc2UgaWYgKElFRUVfUFJPVE9fUlNOID09IGVuY3J5X3Byb3RvKSB7CisJCQl3cGFfbGVuID0gMDsKKwkJfQorCX0KKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsKKwkJKyBiZWFjb24tPnNzaWRfbGVuLy9lc3NpZCB0YWdnZWQgdmFsCisJCSsgcmF0ZV9sZW4vL3JhdGVzIHRhZ2dlZCB2YWwKKwkJKyB3cGFfbGVuCisJCSsgcnNuX2xlbgorCQkrIHdtbV9pbmZvX2xlbgorCQkrIHR1cmJvX2luZm9fbGVuOworI2Vsc2UKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsKKwkJKyBiZWFjb24tPnNzaWRfbGVuLy9lc3NpZCB0YWdnZWQgdmFsCisJCSsgcmF0ZV9sZW4vL3JhdGVzIHRhZ2dlZCB2YWwKKwkJKyB3cGFfbGVuCisJCSsgcnNuX2xlbgorCQkrIHdtbV9pbmZvX2xlbjsKKyNlbmRpZgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuKzI1Nik7IC8vIHN0YW5sZXkKKwllbHNlCisjZW5kaWYKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICopCisJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSk7CisKKworCWhkci0+aGVhZGVyLmZyYW1lX2N0bCA9IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE7CisJaGRyLT5oZWFkZXIuZHVyYXRpb25faWQ9IDM3OyAvL0ZJWE1FCisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGllZWUtPmFwX21hY19hZGRyLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7Ly9mb3IgSFcgc2VjdXJpdHksIEpvaG4KKworCWhkci0+Y2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9CU1MpOworCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSApCisJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKKwkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSk7CisKKwlpZihpZWVlLT5zaG9ydF9zbG90KQorCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcV8xKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcV8xKGhkcik7CisjZW5kaWYKKworCWhkci0+bGlzdGVuX2ludGVydmFsID0gMHhhOyAvL0ZJWE1FCisKKwloZHItPmluZm9fZWxlbWVudC5pZCA9IE1GSUVfVFlQRV9TU0lEOworCisJaGRyLT5pbmZvX2VsZW1lbnQubGVuID0gYmVhY29uLT5zc2lkX2xlbjsKKwl0YWcgPSBza2JfcHV0KHNrYiwgYmVhY29uLT5zc2lkX2xlbik7CisJbWVtY3B5KHRhZywgYmVhY29uLT5zc2lkLCBiZWFjb24tPnNzaWRfbGVuKTsKKworCXRhZyA9IHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKKworCS8vYWRkIHJzbj09MCBjb25kaXRpb24gZm9yIGFwJ3MgbWl4IHNlY3VyaXR5IG1vZGUod3BhK3dwYTIpLCBqb2huMjAwNy44LjkKKwkvL2Nob29zZSBBRVMgZW5jcnlwdGlvbiBhcyBkZWZhdWx0IGFsZ29yaXRobSB3aGlsZSB1c2luZyBtaXhlZCBtb2RlCisjaWYgMAorCWlmKHJzbl9sZW4gPT0gMCl7CisKKwkJdGFnID0gc2tiX3B1dChza2Isd3BhX2xlbik7CisKKwkJaWYod3BhX2xlbikgeworCisKKwkJICAvL3thZGQgYnkgZGF2aWQuIDIwMDYuOC4zMQorCQkgIC8vZml4IGxpbmtzeXMgY29tcGF0aWJpbGl0eSBidWcKKwkJICAvL30KKwkJICBpZih3cGFfbGVuID4gMjQpIHsvLzIyKzIsIG1lYW4gaW5jbHVkZSB0aGUgY2FwYWJpbGl0eQorCQkJYmVhY29uLT53cGFfaWVbd3BhX2xlbiAtIDJdID0gMDsKKwkJICB9CisJCS8vbXVsdGljYXN0IGNpcGhlciBPVUkKKyAgICAgICAgICAgICAgICAgIGlmKCAgYmVhY29uLT53cGFfaWVbMTFdPT0weDIgICAgICApeyAvLzB4MDA1MGYyMDIgaXMgdGhlIG91aSBvZiB0a2lwCisgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9US0lQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICBiZWFjb24tPndwYV9pZVsxMV09PTB4NCAgICAgICl7Ly8weDAwNTBmMjA0IGlzIHRoZSBvdWkgb2YgY2NtcAorICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICB9CisgCQkvL3VuaWNhc3QgY2lwaGVyIE9VSQorCQkgIGlmKAliZWFjb24tPndwYV9pZVsxNF09PTAKKwkJCSYmIGJlYWNvbi0+d3BhX2llWzE1XT09MHg1MAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmVhY29uLT53cGFfaWVbMTZdPT0weGYyCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBiZWFjb24tPndwYV9pZVsxN109PTB4MiAgCSl7IC8vMHgwMDUwZjIwMiBpcyB0aGUgb3VpIG9mIHRraXAKKyAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKwkJfQorCisgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAgIGJlYWNvbi0+d3BhX2llWzE0XT09MAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmVhY29uLT53cGFfaWVbMTVdPT0weDUwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBiZWFjb24tPndwYV9pZVsxNl09PTB4ZjIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGJlYWNvbi0+d3BhX2llWzE3XT09MHg0ICAgICAgKXsvLzB4MDA1MGYyMDQgaXMgdGhlIG91aSBvZiBjY21wCisgICAgICAgICAgICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisJCX0KKwkJLy9pbmRpY2F0ZSB0aGUgd3BhX2llIGNvbnRlbnQgdG8gV1BBX1NVUFBMSUNBTlQKKwkJYnVmZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWCwgR0ZQX0FUT01JQyk7CisJCW1lbXNldChidWZmLCAwLCBJV19DVVNUT01fTUFYKTsKKwkJcD1idWZmOworCQlwICs9IHNwcmludGYocCwgIkFTU09DSU5GTyhSZXFJRXM9Iik7CisJCWZvcihpPTA7aTx3cGFfbGVuO2krKyl7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBiZWFjb24tPndwYV9pZVtpXSk7CisJCX0KKwkJcCArPSBzcHJpbnRmKHAsICIpIik7CisJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpICk7CisJCXdycXUuZGF0YS5sZW5ndGggPSBwIC0gYnVmZjsKKworCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1ZmYpOworCQkgIG1lbWNweSh0YWcsYmVhY29uLT53cGFfaWUsd3BhX2xlbik7CisJCX0KKworCX0KKworCWlmKHJzbl9sZW4gPiAyMikgeworCisJICAJCQkJCWlmKCAgICAgYmVhY29uLT5yc25faWVbNF09PTB4MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVs1XT09MHhmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbi0+cnNuX2llWzZdPT0weGFjKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYmVhY29uLT5yc25faWVbN10peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDEwNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImZhdWx0IHN1aXRlIHR5cGUgaW4gUlNOIGJyb2FkY2FzdCBrZXlcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICAgICBiZWFjb24tPnJzbl9pZVsxMF09PTB4MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVsxMV09PTB4ZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVsxMl09PTB4YWMpeworCQkJCWlmKGJlYWNvbi0+cnNuX2llWzhdPT0xKXsvL25vdCBtaXhlZCBtb2RlCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYmVhY29uLT5yc25faWVbMTNdKXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDI6CisgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBjYXNlIDB4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJmYXVsdCBzdWl0ZSB0eXBlIGluIFJTTiBwYWlyd2lzZSBrZXlcbiIpOworICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJfQorCQkJCX0KKwkJCQllbHNlIGlmKGJlYWNvbi0+cnNuX2llWzhdPT0yKXsvL21peGVkIG1vZGUKKwkJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisKKwkJdGFnID0gc2tiX3B1dChza2IsMjIpOworCQltZW1jcHkodGFnLChiZWFjb24tPnJzbl9pZSArIGluZm9fYWRkciksOCk7CisJCXRhZ1sxXSA9ICAyMDsKKwkJdGFnICs9IDg7CisJCWluZm9fYWRkciArPSA4OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQl0YWdbMF0gPSAxOworCQkJdGFnWzFdID0gMDsKKwkJCXRhZyArPSAyOworCQkJc3VpdGVfY291bnQgPSBiZWFjb24tPnJzbl9pZVtpbmZvX2FkZHJdICsgXAorCQkJCSAgICAgIChiZWFjb24tPnJzbl9pZVtpbmZvX2FkZHIgKyAxXSA8PCA4KTsKKwkJCWluZm9fYWRkciArPSAyOworCQkJaWYoMSA9PSBzdWl0ZV9jb3VudCkgeworCQkJCW1lbWNweSh0YWcsKGJlYWNvbi0+cnNuX2llICsgaW5mb19hZGRyKSw0KTsKKwkJCQlpbmZvX2FkZHIgKz0gNDsKKwkJCX0gZWxzZSB7CisJCQkJLy8gaWYgdGhlIHdwYXhfdHlwZV9ub3RpZnkgaGFzIGJlZW4gc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiwKKwkJCQkvLyBqdXN0IHVzZSBpdCwgb3RoZXJ3aXNlIGp1c3QgdXNlIHRoZSBkZWZhdWx0IG9uZS4KKwkJCQlpZihpZWVlLT53cGF4X3R5cGVfc2V0KSB7CisJCQkJCXN1aXRfc2VsZWN0ID0gKCgwID09IGkpID8gcGFpcndpc2VfdHlwZTphdXRoZW5fdHlwZSkmMHgwZiA7CisJCQkJCW1lbWNweSh0YWcscnNuX2F1dGhlbl9jaXBoZXJfc3VpdGVbc3VpdF9zZWxlY3RdLDQpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vZGVmYXVsdCBzZXQgYXMgY2NtcCwgb3Igbm9uZSBhdXRoZW50aWNhdGlvbgorCQkJCQlpZihpID09IDApIHsKKwkJCQkJCW1lbWNweSh0YWcscnNuX2F1dGhlbl9jaXBoZXJfc3VpdGVbNF0sNCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltZW1jcHkodGFnLHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzJdLDQpOworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlpbmZvX2FkZHIgKz0gKHN1aXRlX2NvdW50ICogNCk7CisJCQl9CisJCQl0YWcgKz0gNDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCisJCXRhZ1swXSA9IDA7CisJCXRhZ1sxXSA9IGJlYWNvbi0+cnNuX2llW2luZm9fYWRkcisxXTsKKworCX0gZWxzZSB7CisJCXRhZyA9IHNrYl9wdXQoc2tiLHJzbl9sZW4pOworCQlpZihyc25fbGVuKSB7CisKKworCQkJaWYoIAliZWFjb24tPnJzbl9pZVs0XT09MHgwICYmCisJCQkJYmVhY29uLT5yc25faWVbNV09PTB4ZiAmJgorCQkJCWJlYWNvbi0+cnNuX2llWzZdPT0weGFjKXsKKwkJCQlzd2l0Y2goYmVhY29uLT5yc25faWVbN10peworCQkJCQljYXNlIDB4MToKKwkJCQkJCWllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWNhc2UgMHgyOgorCQkJCQkJaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDB4NDoKKyAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfV0VQMTA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlwcmludGsoImZhdWx0IHN1aXRlIHR5cGUgaW4gUlNOIGJyb2FkY2FzdCBrZXlcbiIpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICAgICBiZWFjb24tPnJzbl9pZVsxMF09PTB4MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVsxMV09PTB4ZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVsxMl09PTB4YWMpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiZWFjb24tPnJzbl9pZVs4XT09MSl7Ly9ub3QgbWl4ZWQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChiZWFjb24tPnJzbl9pZVsxM10peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmF1bHQgc3VpdGUgdHlwZSBpbiBSU04gcGFpcndpc2Uga2V5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl9CisKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYmVhY29uLT5yc25faWVbOF09PTIpey8vbWl4ZWQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKwkJCWJlYWNvbi0+cnNuX2llW3Jzbl9sZW4gLSAyXSA9IDA7CisJCQltZW1jcHkodGFnLGJlYWNvbi0+cnNuX2llLHJzbl9sZW4pOworCQl9CisJfQorI2Vsc2UKKwl0YWcgPSBza2JfcHV0KHNrYixpZWVlLT53cGFfaWVfbGVuKTsKKwltZW1jcHkodGFnLGllZWUtPndwYV9pZSxpZWVlLT53cGFfaWVfbGVuKTsKKyNlbmRpZgorCXRhZyA9IHNrYl9wdXQoc2tiLHdtbV9pbmZvX2xlbik7CisJaWYod21tX2luZm9fbGVuKSB7CisJICBpZWVlODAyMTFfV01NX0luZm8oaWVlZSwgJnRhZyk7CisJfQorI2lmZGVmIFRIT01BU19UVVJCTworCXRhZyA9IHNrYl9wdXQoc2tiLHR1cmJvX2luZm9fbGVuKTsKKyAgICAgICAgaWYodHVyYm9faW5mb19sZW4pIHsKKyAgICAgICAgICAgICAgICBpZWVlODAyMTFfVFVSQk9fSW5mbyhpZWVlLCAmdGFnKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxXzIpCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxXzIoaWVlZSwgYmVhY29uLCBza2IpOworI2VuZGlmCisKKwlyZXR1cm4gc2tiOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZWVlLT5hc3NvY2lhdGVfc2VxKys7CisKKwkvKiBkb24ndCBzY2FuLCBhbmQgYXZvaWQgdG8gaGF2ZSB0aGUgUlggcGF0aCBwb3NzaWJpbHkKKwkgKiB0cnkgYWdhaW4gdG8gYXNzb2NpYXRlLiBFdmVuIGRvIG5vdCByZWFjdCB0byBBVVRIIG9yCisJICogQVNTT0MgcmVzcG9uc2UuIEp1c3Qgd2FpdCBmb3IgdGhlIHJldHJ5IHdxIHRvIGJlIHNjaGVkdWxlZC4KKwkgKiBIZXJlIHdlIHdpbGwgY2hlY2sgaWYgdGhlcmUgYXJlIGdvb2QgbmV0cyB0byBhc3NvY2lhdGUKKwkgKiB3aXRoLCBzbyB3ZSByZXRyeSBvciBqdXN0IGdldCBiYWNrIHRvIE5PX0xJTksgYW5kIHNjYW5uaW5nCisJICovCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2F1dGhfcnMrKzsKKwl9ZWxzZXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkFzc29jaWF0aW9uIGZhaWxlZFxuIik7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMubm9fYXNzX3JzKys7CisJfQorCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydF9jYih1bnNpZ25lZCBsb25nIGRldikKK3sKKwlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKSBkZXYpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTdG9wcGluZyBzY2FuXG4iKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKKwlza2I9aWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIDApOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlICkJeworCQlpZihza2IpCisJCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlyZXR1cm47CisJfWVsc2UKKyNlbmRpZgorCWlmICghc2tiKXsKKworCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCX0KKwllbHNleworCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyA7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RcbiIpOworCQkvL3ByaW50aygiLS0tU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJLy9CVUdPTiB3aGVuIHlvdSB0cnkgdG8gYWRkX3RpbWVyIHR3aWNlLCB1c2luZyBtb2RfdGltZXIgbWF5IGJlIGJldHRlciwgam9objA3MDkKKwkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CisJCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCX0KKwkJLy9JZiBjYWxsIGRldl9rZnJlZV9za2JfYW55LGEgd2FybmluZyB3aWxsIG9jdXIuLi4uCisJCS8vS0VSTkVMOiBhc3NlcnRpb24gKCFhdG9taWNfcmVhZCgmc2tiLT51c2VycykpIGZhaWxlZCBhdCBuZXQvY29yZS9kZXYuYyAoMTcwOCkKKwkJLy9TbyAuLi4gMTIwNCBieSBsYXdyZW5jZS4KKwkJLy9wcmludGsoIlxuSW4gJXMsbGluZSAlZCBjYWxsIGtmcmVlIHNrYi4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCit2b2lkIGllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmNoYWxsZW5nZSwgaW50IGNobGVuKQoreworCXU4ICpjOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworLy8JaW50IGhsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbik7CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXV0aF9ycSsrOworCisJc2tiID0gaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIGNobGVuKzIpOworCWlmICghc2tiKQorCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCWVsc2V7CisJCWMgPSBza2JfcHV0KHNrYiwgY2hsZW4rMik7CisJCSooYysrKSA9IE1GSUVfVFlQRV9DSEFMTEVOR0U7CisJCSooYysrKSA9IGNobGVuOworCQltZW1jcHkoYywgY2hhbGxlbmdlLCBjaGxlbik7CisKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gY2hhbGxlbmdlIHJlc3BvbnNlXG4iKTsKKworCQlpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKSk7CisKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKKwkJLy9wcmludGsoIj09PT09PT09PT5hZGQgdGltZXIgYWdhaW4sIHRvIGNyYXNoXG4iKTsKKwkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CisJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9CisJa2ZyZWUoY2hhbGxlbmdlKTsKK30KKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworLy8gYmFzZWQgb24gaWVlZTgwMjExX2Fzc29jX3Jlc3AKK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfYXNzb2NfcmVzcF9ieV9uZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0LCB1bnNpZ25lZCBzaG9ydCBzdGF0dXMsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqcHN0YXQsIGludCBwa3RfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4KiB0YWc7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jOworCXNob3J0IGVuY3J5cHQ7CisKKwl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihpZWVlKTsKKwlpbnQgbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpICsgcmF0ZV9sZW47CisKKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisyNTYpOyAvLyBzdGFubGV5CisJZWxzZQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlhc3NvYyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopCisJCXNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSk7CisKKwlhc3NvYy0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KHBrdF90eXBlKTsKKworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMywgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJYXNzb2MtPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSID8KKwkJV0xBTl9DQVBBQklMSVRZX0JTUyA6IFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jX3Jlc3BfYnlfbmV0XzEpCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NfcmVzcF9ieV9uZXRfMShhc3NvYyk7CisKKwlpZihpZWVlLT5zaG9ydF9zbG90KQorCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7CisKKwlpZiAoaWVlZS0+aG9zdF9lbmNyeXB0KQorCQljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJZWxzZSBjcnlwdCA9IE5VTEw7CisKKwllbmNyeXB0ID0gKCBjcnlwdCAmJiBjcnlwdC0+b3BzKTsKKworCWlmIChlbmNyeXB0KQorCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisKKwlhc3NvYy0+c3RhdHVzID0gMDsKKwlhc3NvYy0+YWlkID0gY3B1X3RvX2xlMTYoaWVlZS0+YXNzb2NfaWQpOworCWlmIChpZWVlLT5hc3NvY19pZCA9PSAweDIwMDcpIGllZWUtPmFzc29jX2lkPTA7CisJZWxzZSBpZWVlLT5hc3NvY19pZCsrOworCisJYXNzb2MtPmluZm9fZWxlbWVudC5pZCA9IDIzMDsgLy8gU3RhbmxleSwgYW4gdW51c2VkIGlkIChqdXN0IGEgaG90IGZpeCkKKwlhc3NvYy0+aW5mb19lbGVtZW50LmxlbiA9IDA7CisKKwl0YWcgPSAodTgqKSBza2JfcHV0KHNrYiwgcmF0ZV9sZW4pOworCisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CisKKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldF8yKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jX3Jlc3BfYnlfbmV0XzIoaWVlZSwgcHN0YXQsIHBrdF90eXBlLCBza2IpOworCisJcmV0dXJuIHNrYjsKK30KKworLy8gYmFzZWQgb24gaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEKK3ZvaWQgaWVlZTgwMjExX2V4dF9pc3N1ZV9hc3NvY19yc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0LCB1bnNpZ25lZCBzaG9ydCBzdGF0dXMsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqcHN0YXQsIGludCBwa3RfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2Fzc29jX3Jlc3BfYnlfbmV0KGllZWUsIGRlc3QsIHN0YXR1cywgcHN0YXQsIHBrdF90eXBlKTsKKworCWlmIChidWYpCisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Cit9CisKKy8vIGJhc2VkIG9uIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIKK3ZvaWQgaWVlZTgwMjExX2V4dF9pc3N1ZV9hc3NvY19yZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqcHN0YXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworCisJLy8gcHJpbnRrKCJAQEBAQCBpZWVlODAyMTFfZXh0X2lzc3VlX2Fzc29jX3JlcSBvbiBjaGFubmVsOiAlZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hc3NfcnErKzsKKwlza2I9aWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShwc3RhdCwgaWVlZSk7CisJaWYgKHNrYikKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKK30KKwordm9pZCBpZWVlODAyMTFfZXh0X2lzc3VlX2Rpc2Fzc29jKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBzdGF0LCBpbnQgcmVhc29uLCB1bnNpZ25lZCBjaGFyIGV4dFJlYXNvbikKK3sKKwkvLyBkbyBub3RoaW5nCisJLy8gcHJpbnRrKCJAQEBAQCBpZWVlODAyMTFfZXh0X2lzc3VlX2Rpc2Fzc29jXG4iKTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKworCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGFzc29jaWF0aW9uIHJlcXVlc3RcbiIpOworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXNzX3JxKys7CisJc2tiPWllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoYmVhY29uLCBpZWVlKTsKKwlpZiAoIXNrYikKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNleworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsKKwkJYWRkX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCQl9CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJBc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseVxuIik7CisJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpeworCisJCWllZWUtPnJhdGUgPSA1NDA7CisJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlc1xuIik7CisJfWVsc2V7CisJCWllZWUtPnJhdGUgPSAxMTA7CisJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7CisJfQorCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGk7CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwlmb3IoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkgIC8vaWVlZS0+c2VxX2N0cmxbaV0gPSAwOworCX0KKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJSUVFRTgwMjExX0RFQlVHX01HTVQoIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkXG4iKTsKKworCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EpOworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwlpZWVlLT5hc3NvY2lhdGVfc2VxID0gMTsKKwlpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKGllZWUpOworCisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworLy8gYmFzZWQgb24gaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCit2b2lkIGllZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgZXh0X3N0b3Bfc2Nhbl93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorCSAgaWYgKGllZWUtPnNjYW5uaW5nID09IDApCisJeworCQlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxX3NldF9jaGFubmVsCisJCQkJJiYgKCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Ffc2V0X2NoYW5uZWwoaWVlZSkgKSApCisJCXJldHVybjsKKwl9CisKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJLy8gcHJpbnRrKCJAQEBAQEBAQEBAIGllZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxXG4iKTsKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCisJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisKKwlpZWVlODAyMTFfc3RvcF9zY2FuKGllZWUpOworCisJLy8gc2V0IGNoYW5uZWwKKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxX3NldF9jaGFubmVsKQorCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cV9zZXRfY2hhbm5lbChpZWVlKSk7CisJZWxzZQorCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkvLworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCisKK3ZvaWQgaWVlZTgwMjExX2V4dF9zZW5kXzExc19iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxKTsKKwkjZWxzZQorCQlzY2hlZHVsZV90YXNrKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EpOworCSNlbmRpZgorCit9CisKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KQoreworCXU4IHRtcF9zc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCWludCB0bXBfc3NpZF9sZW4gPSAwOworCisJc2hvcnQgYXBzZXQsc3NpZHNldCxzc2lkYnJvYWQsYXBtYXRjaCxzc2lkbWF0Y2g7CisKKwkvKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBuZXcgbmV3IG9ubHkgaWYgd2UgYXJlIG5vdCBhc3NvY2lhdGVkCisJICogYW5kIHdlIGFyZSBub3QgYXNzb2NpYXRpbmcgLyBhdXRoZW50aWNhdGluZworCSAqLworCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQorCQlyZXR1cm47CisKKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgJiYgIShuZXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSkKKwkJcmV0dXJuOworCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmICEobmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpKQorCQlyZXR1cm47CisKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKXsKKwkJLyogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBBUCBNQUMsIHdlIG5lZWQgYWxzbyB0aGUgZXNzaWQKKwkJICogVGhpcyBjb3VsZCBiZSBvYnRhaW5lZCBieSBiZWFjb25zIG9yLCBpZiB0aGUgbmV0d29yayBkb2VzIG5vdAorCQkgKiBicm9hZGNhc3QgaXQsIGl0IGNhbiBiZSBwdXQgbWFudWFsbHkuCisJCSAqLworCQlhcHNldCA9IGllZWUtPndhcF9zZXQ7Ly8obWVtY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgemVybyxFVEhfQUxFTikhPTAgKTsKKwkJc3NpZHNldCA9IGllZWUtPnNzaWRfc2V0Oy8vaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRbMF0gIT0gJ1wwJzsKKwkJc3NpZGJyb2FkID0gICEobmV0LT5zc2lkX2xlbiA9PSAwIHx8IG5ldC0+c3NpZFswXT09ICdcMCcpOworCQlhcG1hdGNoID0gKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIG5ldC0+YnNzaWQsIEVUSF9BTEVOKT09MCk7CisKKwkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuICE9IG5ldC0+c3NpZF9sZW4pCisJCQlzc2lkbWF0Y2ggPSAwOworCQllbHNlCisJCQlzc2lkbWF0Y2ggPSAoMD09c3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0LT5zc2lkLCBuZXQtPnNzaWRfbGVuKSk7CisKKwkJLy9wcmludGsoImN1cjogJXMsICVkLCBuZXQ6JXMsICVkXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuLCBuZXQtPnNzaWQsIG5ldC0+c3NpZF9sZW4pOworCQkvL3ByaW50aygiYXBzZXQ9JWQgYXBtYXRjaD0lZCBzc2lkc2V0PSVkIHNzaWRicm9hZD0lZCBzc2lkbWF0Y2g9JWRcbiIsYXBzZXQsYXBtYXRjaCxzc2lkc2V0LHNzaWRicm9hZCxzc2lkbWF0Y2gpOworCisJCWlmICgJLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBBUCBjaGVjayBpZiBtYXRjaC4KKwkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90IGJyb2FkY2FzdCBlc3NpZCB3ZSBjaGVjayB0aGUgdXNlciBzdXBwbHllZCBBTlkgZXNzaWQKKwkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkb2VzIG5vdCBzZXQgZXNzaWQgaXQgaXMgT0sKKwkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkaWQgc2V0IGVzc2lkIGNoZWNoIGlmIGVzc2lkIG1hdGNoCisJCQkgKi8KKwkJCQkoIGFwc2V0ICYmIGFwbWF0Y2ggJiYKKwkJCQkgICgoc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSB8fCAoc3NpZGJyb2FkICYmICFzc2lkc2V0KSB8fCAoIXNzaWRicm9hZCAmJiBzc2lkc2V0KSkgKSB8fAorCQkJCS8qIGlmIHRoZSBhcCBpcyBub3Qgc2V0LCBjaGVjayB0aGF0IHRoZSB1c2VyIHNldCB0aGUgYnNzaWQKKwkJCQkgKiBhbmQgdGhlIG5ldHdvcmsgZG9lcyBicmFkY2FzdCBhbmQgdGhhdCB0aG9zZSB0d28gYnNzaWQgbWF0Y2hlcworCQkJCSAqLworCQkJCSghYXBzZXQgJiYgc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKQorCQkgICApeworCisKKwkJCS8qIGlmIHRoZSBlc3NpZCBpcyBoaWRkZW4gcmVwbGFjZSBpdCB3aXRoIHRoZQorCQkJICogZXNzaWQgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCisJCQkgKi8KKwkJCWlmICghc3NpZGJyb2FkKXsKKwkJCQlzdHJuY3B5KHRtcF9zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOworCQkJCXRtcF9zc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwkJCX0KKwkJCW1lbWNweSgmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBuZXQsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKworCQkJaWYgKCFzc2lkYnJvYWQpeworCQkJCXN0cm5jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIHRtcF9zc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7CisJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gdG1wX3NzaWRfbGVuOworCQkJfQorCQkJcHJpbnRrKEtFUk5fSU5GTyJMaW5raW5nIHdpdGggJXM6IGNoYW5uZWwgaXMgJWRcbiIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKKwkJCQlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKKwkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCQl9ZWxzZXsKKwkJCQlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwkJCQkJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpeworCQkJCQlpZWVlLT5yYXRlID0gNTQwOworCQkJCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEcgcmF0ZXNcbiIpOworCQkJCX1lbHNleworCQkJCQlpZWVlLT5yYXRlID0gMTEwOworCQkJCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXNcbiIpOworCQkJCX0KKwkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJCQkJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CisJCQl9CisKKwkJfQorCX0KKworfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisKKwkJLyogaWYgdGhlIHN0YXRlIGJlY29tZSBkaWZmZXJlbnQgdGhhdCBOT0xJTksgbWVhbnMKKwkJICogd2UgaGFkIGZvdW5kIHdoYXQgd2UgYXJlIHNlYXJjaGluZyBmb3IKKwkJICovCisKKwkJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCisJCQlicmVhazsKKworCQlpZiAoaWVlZS0+c2Nhbl9hZ2UgPT0gMCB8fCB0aW1lX2FmdGVyKHRhcmdldC0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpKQorCQkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCB0YXJnZXQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IGF1dGhfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTgqKiBjaGFsbGVuZ2UsIGludCAqY2hsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKKwl1OCAqdDsKKwlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLHNrYi0+bGVuKTsKKwkJcmV0dXJuIDB4Y2FmZTsKKwl9CisJKmNoYWxsZW5nZSA9IE5VTEw7CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKikgc2tiLT5kYXRhOworCWlmKHNrYi0+bGVuID4gKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArMykpeworCQl0ID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOworCisJCWlmKCoodCsrKSA9PSBNRklFX1RZUEVfQ0hBTExFTkdFKXsKKwkJCSpjaGxlbiA9ICoodCsrKTsKKwkJCSpjaGFsbGVuZ2UgPSAodTgqKWttYWxsb2MoKmNobGVuLCBHRlBfQVRPTUlDKTsKKwkJCW1lbWNweSgqY2hhbGxlbmdlLCB0LCAqY2hsZW4pOworCQl9CisJfQorCisJcmV0dXJuIGNwdV90b19sZTE2KGEtPnN0YXR1cyk7CisKK30KKworCitpbnQgYXV0aF9ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHU4KiBkZXN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CisKKwlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6ICVkXG4iLHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24qKSBza2ItPmRhdGE7CisKKwltZW1jcHkoZGVzdCxhLT5oZWFkZXIuYWRkcjIsIEVUSF9BTEVOKTsKKworCWlmIChsZTE2X3RvX2NwdShhLT5hbGdvcml0aG0pICE9IFdMQU5fQVVUSF9PUEVOKQorCQlyZXR1cm4gIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEc7CisKKwlyZXR1cm4gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHNob3J0IHByb2JlX3JxX3BhcnNlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqc3JjKQoreworCXU4ICp0YWc7CisJdTggKnNrYmVuZDsKKwl1OCAqc3NpZD1OVUxMOworCXU4IHNzaWRsZW4gPSAwOworCisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICAqaGVhZGVyID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAgKikgc2tiLT5kYXRhOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKSkKKwkJcmV0dXJuIC0xOyAvKiBjb3JydXB0ZWQgKi8KKworCW1lbWNweShzcmMsaGVhZGVyLT5hZGRyMiwgRVRIX0FMRU4pOworCisJc2tiZW5kID0gKHU4Kilza2ItPmRhdGEgKyBza2ItPmxlbjsKKworCXRhZyA9IHNrYi0+ZGF0YSArIHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICk7CisKKwl3aGlsZSAodGFnKzEgPCBza2JlbmQpeworCQlpZiAoKnRhZyA9PSAwKXsKKwkJCXNzaWQgPSB0YWcrMjsKKwkJCXNzaWRsZW4gPSAqKHRhZysxKTsKKwkJCWJyZWFrOworCQl9CisJCXRhZysrOyAvKiBwb2ludCB0byB0aGUgbGVuIGZpZWxkICovCisJCXRhZyA9IHRhZyArICoodGFnKTsgLyogcG9pbnQgdG8gdGhlIGxhc3QgZGF0YSBieXRlIG9mIHRoZSB0YWcgKi8KKwkJdGFnKys7IC8qIHBvaW50IHRvIHRoZSBuZXh0IHRhZyAqLworCX0KKworCS8vSUVFRTgwMjExRE1FU0coIkNhcmQgTUFDIGFkZHJlc3MgaXMgIk1BQ1NUUiwgTUFDMlNUUihzcmMpKTsKKwlpZiAoc3NpZGxlbiA9PSAwKSByZXR1cm4gMTsKKworCWlmICghc3NpZCkgcmV0dXJuIDE7IC8qIHNzaWQgbm90IGZvdW5kIGluIHRhZ2dlZCBwYXJhbSAqLworCXJldHVybiAoIXN0cm5jbXAoc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIHNzaWRsZW4pKTsKKworfQorCitpbnQgYXNzb2NfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYix1OCogZGVzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmE7CisKKwlpZiAoc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkgLQorCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSkgeworCisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6JWQgXG4iLCBza2ItPmxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSopIHNrYi0+ZGF0YTsKKworCW1lbWNweShkZXN0LGEtPmhlYWRlci5hZGRyMixFVEhfQUxFTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXNzb2NfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICphaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYTsKKwlpZiAoc2tiLT5sZW4gPCAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsIHNrYi0+bGVuKTsKKwkJcmV0dXJuIDB4Y2FmZTsKKwl9CisKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKSBza2ItPmRhdGE7CisJKmFpZCA9IGxlMTZfdG9fY3B1KGEtPmFpZCkgJiAweDNmZmY7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGEtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWVlZTgwMjExX3J4X3Byb2JlX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IGRlc3RbRVRIX0FMRU5dOworCisJLy9JRUVFODAyMTFETUVTRygiUnggcHJvYmUiKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X3Byb2JlX3JxKys7CisJLy9ETUVTRygiRGVzdCBpcyAiTUFDU1RSLCBNQUMyU1RSKGRlc3QpKTsKKwlpZiAocHJvYmVfcnFfcGFyc2UoaWVlZSwgc2tiLCBkZXN0KSl7CisJCS8vSUVFRTgwMjExRE1FU0coIldhcyBmb3IgbWUhIik7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfcHJvYmVfcnMrKzsKKwkJaWVlZTgwMjExX3Jlc3BfdG9fcHJvYmUoaWVlZSwgZGVzdCk7CisJfQorfQorCitpbmxpbmUgdm9pZAoraWVlZTgwMjExX3J4X2F1dGhfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggZGVzdFtFVEhfQUxFTl07CisJaW50IHN0YXR1czsKKwkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9ycSsrOworCisJaWYgKChzdGF0dXMgPSBhdXRoX3JxX3BhcnNlKHNrYiwgZGVzdCkpIT0gLTEpeworCQlpZWVlODAyMTFfcmVzcF90b19hdXRoKGllZWUsIHN0YXR1cywgZGVzdCk7CisJfQorCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7CisKK30KKworIGlubGluZSB2b2lkCitpZWVlODAyMTFfcnhfYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19ycSsrOworCWlmIChhc3NvY19ycV9wYXJzZShza2IsZGVzdCkgIT0gLTEpeworCQlpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycShpZWVlLCBkZXN0KTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIk5ldyBjbGllbnQgYXNzb2NpYXRlZDogIk1BQ19GTVQiXG4iLCBNQUNfQVJHKGRlc3QpKTsKKwkvL0ZJWE1FCisJI2lmIDAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJYWRkX2Fzc29jaWF0ZShpZWVlLGRlc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCSNlbmRpZgorfQorCisKKwordm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKQoreworCisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9udWxsX2Z1bmMoaWVlZSwgcHdyKTsKKworCWlmIChidWYpCisJCXNvZnRtYWNfcHNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7CisKK30KKworCitzaG9ydCBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1MzIgKnRpbWVfaCwgdTMyICp0aW1lX2wpCit7CisjaWYgMAorICAgICAgICBpbnQgdGltZW91dCA9IGllZWUtPnBzX3RpbWVvdXQ7CisjZWxzZQorICAgICAgICBpbnQgdGltZW91dCA9IDA7CisjZW5kaWYKKwl1OCBkdGltOworCS8qaWYoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8CisJCWllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorCisJCXJldHVybiAwOworCSovCisJZHRpbSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX2RhdGE7CisJLy9wcmludGsoIkRUSU1cbiIpOworCisJaWYoIShkdGltICYgSUVFRTgwMjExX0RUSU1fVkFMSUQpKQorCQlyZXR1cm4gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsOworCisJLy9wcmludGsoIlZBTElEXG4iKTsKKwlpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhID0gSUVFRTgwMjExX0RUSU1fSU5WQUxJRDsKKworCWlmKGR0aW0gJiAoKElFRUU4MDIxMV9EVElNX1VDQVNUIHwgSUVFRTgwMjExX0RUSU1fTUJDQVNUKSYgaWVlZS0+cHMpKQorCQlyZXR1cm4gMjsKKworCWlmKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmRldi0+dHJhbnNfc3RhcnQgKyBNU0VDUyh0aW1lb3V0KSkpCisJCXJldHVybiAwOworCisJaWYoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+bGFzdF9yeF9wc190aW1lICsgTVNFQ1ModGltZW91dCkpKQorCQlyZXR1cm4gMDsKKworCWlmKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSApICYmCisJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwgIT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKSkKKwkJcmV0dXJuIDA7CisjaWYgMAorCWlmKHRpbWVfbCl7CisJCSp0aW1lX2wgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdCisJCQkrIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsCisJCQkqIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkgKiAxMDAwOworCX0KKyNlbHNlCisJaWYodGltZV9sKXsKKwkJKnRpbWVfbCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0KKwkJCSsgTVNFQ1MoKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpKTsKKwkJCS8vKiBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QpKTsKKwkJCS8vcHJpbnRrKCJiZWFjb25faW50ZXJ2YWw6JXgsIGR0aW1fcGVyaW9kOiV4LCB0b3RvbCB0byBNc2VjczoleCwgSFo6JXhcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwsIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCwgTVNFQ1MoKChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kKSkpLCBIWik7CisJfQorCisjZW5kaWYKKwlpZih0aW1lX2gpeworCQkqdGltZV9oID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVsxXTsKKwkJaWYodGltZV9sICYmICp0aW1lX2wgPCBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdKQorCQkJKnRpbWVfaCArPSAxOworCX0KKworCXJldHVybiAxOworCisKK30KKworaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YV9wcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXUzMiB0aCx0bDsKKwlzaG9ydCBzbGVlcDsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsZmxhZ3MyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmKChpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQgfHwKKworCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpeworCisJCS8vI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwgMSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCX0KKworCXNsZWVwID0gaWVlZTgwMjExX3N0YV9wc19zbGVlcChpZWVlLCZ0aCwgJnRsKTsKKy8vCXByaW50aygiPT09PiVzLCVkWzIgd2FrZSwgMSBzbGVlcCwgMCBkbyBub3RoaW5nXSwgaWVlZS0+c3RhX3NsZWVwID0gJWRcbiIsX19GVU5DVElPTl9fLCBzbGVlcCxpZWVlLT5zdGFfc2xlZXApOworCS8qIDIgd2FrZSwgMSBzbGVlcCwgMCBkbyBub3RoaW5nICovCisJaWYoc2xlZXAgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZihzbGVlcCA9PSAxKXsKKworCQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMSkKKwkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldix0aCx0bCk7CisKKwkJZWxzZSBpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7CisJLy8JCXByaW50aygic2VuZCBudWxsIDFcbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQkJaWYoaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkoaWVlZS0+ZGV2KSl7CisKKworCQkJCWllZWUtPnN0YV9zbGVlcCA9IDI7CisKKwkJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCisJCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwxKTsKKworCQkJCWllZWUtPnBzX3RoID0gdGg7CisJCQkJaWVlZS0+cHNfdGwgPSB0bDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQl9CisKKworCX1lbHNlIGlmKHNsZWVwID09IDIpeworLy8jd2FybmluZyBDSEVDS19MT0NLX0hFUkUKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCS8vCXByaW50aygic2VuZCB3YWtldXAgcGFja2V0XG4iKTsKKwkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwxKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YV93YWtldXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IG5sKQoreworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAwKXsKKwkJaWYobmwpeworCQkvLwlwcmludGsoIldhcm5pbmc6IGRyaXZlciBpcyBwcm9iYWJseSBmYWlsaW5nIHRvIHJlcG9ydCBUWCBwcyBlcnJvclxuIik7CisJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJCX0KKwkJcmV0dXJuOworCisJfQorCisJaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJCWllZWUtPnN0YV93YWtlX3VwKGllZWUtPmRldik7CisKKwlpZWVlLT5zdGFfc2xlZXAgPSAwOworCisJaWYobmwpeworCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2VzcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLGZsYWdzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWYoaWVlZS0+c3RhX3NsZWVwID09IDIpeworCQkvKiBOdWxsIGZyYW1lIHdpdGggUFMgYml0IHNldCAqLworCQlpZihzdWNjZXNzKXsKKworCQkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT4gJXM6OmVudGVyIHNsZWVwIHN0YXRlXG4iLF9fRlVOQ1RJT05fXyk7CisJCQlpZWVlLT5zdGFfc2xlZXAgPSAxOworCQkJaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUoaWVlZS0+ZGV2LGllZWUtPnBzX3RoLGllZWUtPnBzX3RsKTsKKwkJfQorCQkvKiBpZiB0aGUgY2FyZCByZXBvcnQgbm90IHN1Y2Nlc3Mgd2UgY2FuJ3QgYmUgc3VyZSB0aGUgQVAKKwkJICogaGFzIG5vdCBSWGVkIHNvIHdlIGNhbid0IGFzc3VtZSB0aGUgQVAgYmVsaWV2ZSB1cyBhd2FrZQorCQkgKi8KKwl9CisJLyogMjExMTIwMDUgLSB0eCBhZ2FpbiBudWxsIHdpdGhvdXQgUFMgYml0IGlmIGxvc3QgKi8KKwllbHNlIHsKKworCQlpZigoaWVlZS0+c3RhX3NsZWVwID09IDApICYmICFzdWNjZXNzKXsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK2lubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAorCQkJdTE2IHN0eXBlKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikgc2tiLT5kYXRhOworCXUxNiBlcnJjb2RlOworCXU4KiBjaGFsbGVuZ2U9TlVMTDsKKwlpbnQgY2hsZW49MDsKKwlpbnQgYWlkPTA7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2NfcmVzcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50OworCisJaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybiAwOworCisJaWYoaWVlZS0+c3RhX3NsZWVwIHx8IChpZWVlLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQgJiYKKwkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmCisJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKQorCisJCXRhc2tsZXRfc2NoZWR1bGUoJmllZWUtPnBzX3Rhc2spOworCisJaWYoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpICE9IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQICYmCisJCVdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSAhPSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKQorCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6CisKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBbUkVdQVNTT0NJQVRJT04gUkVTUE9OU0UgKCVkKVxuIiwKKwkJCQkJV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCisJCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQkJCWlmICgwID09IChlcnJjb2RlPWFzc29jX3BhcnNlKHNrYiwgJmFpZCkpKXsKKwkJCQkJdTE2IGxlZnQ7CisKKwkJCQkJaWVlZS0+c3RhdGU9SUVFRTgwMjExX0xJTktFRDsKKwkJCQkJaWVlZS0+YXNzb2NfaWQgPSBhaWQ7CisJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX29rKys7CisKKwkJCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJuaWNfdHlwZSA9ICVzIiwgKHJ4X3N0YXRzLT5uaWNfdHlwZSA9PSAxKT8icnRsODE4NyI6InJ0bDgxODdCIik7CisJCQkJCWlmKDEgPT0gcnhfc3RhdHMtPm5pY190eXBlKSAvL2NhcmQgdHlwZSBpcyA4MTg3CisJCQkJCXsKKwkJCQkJCWdvdG8gYXNzb2NpYXRlX2NvbXBsZXRlOworCQkJCQl9CisJCQkJCWFzc29jX3Jlc3AgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopc2tiLT5kYXRhOworCQkJCQlpbmZvX2VsZW1lbnQgPSAJJmFzc29jX3Jlc3AtPmluZm9fZWxlbWVudDsKKwkJCQkJbGVmdCA9IHNrYi0+bGVuIC0gKCh2b2lkKilpbmZvX2VsZW1lbnQgLSAodm9pZCopYXNzb2NfcmVzcCk7CisKKwkJCQkJd2hpbGUgKGxlZnQgPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikpIHsKKwkJCQkJCWlmIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVmdCkgeworCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIltyZV1hc3NvY2lhdGUgcmVlcG9uc2UgZXJyb3IhIik7CisJCQkJCQkJcmV0dXJuIDE7CisJCQkJCQl9CisJCQkJCQlzd2l0Y2ggKGluZm9fZWxlbWVudC0+aWQpIHsKKwkJCQkJCSAgY2FzZSBNRklFX1RZUEVfR0VORVJJQzoKKwkJCQkJCSAgICAgICAgIElFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfR0VORVJJQzogJWQgYnl0ZXNcbiIsIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCQkJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPj0gOCAgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDIgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDEpIHsKKwkJCQkJCQkgICAgLy8gTm90IGNhcmUgYWJvdXQgdmVyc2lvbiBhdCBwcmVzZW50LgorCQkJCQkJCSAgICAvL1dNTSBQYXJhbWV0ZXIgRWxlbWVudAorCQkJCQkJCSAgICBtZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9wYXJhbSwodTgqKShpbmZvX2VsZW1lbnQtPmRhdGFcCisJCQkJCQkJCQkJICAgICsgOCksKGluZm9fZWxlbWVudC0+bGVuIC0gOCkpOworCisJCQkJCSAJICAgICAgICAgICAgaWYgKCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvXmluZm9fZWxlbWVudC0+ZGF0YVs2XSkmIFwKKwkJCQkJCQkJCQkgICAgMHgwZil8fCghaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnKSkgeworCQkJCQkJICAgCSAgICAgIC8vcmVmcmVzaCBwYXJhbWV0ZSBlbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKKwkJCQkJCQkgICAgICAvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIHBhcmFtZXRlciBmb3IgaGFyZHdhcmUKKwkJCQkJCQkgICAgICBpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAxOworCQkJCQkJCSAgICAgIHF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKKworCQkJCQkJICAgICAgICAgICAgfQorCQkJCQkJICAgICAgICAgICAgLy91cGRhdGUgaW5mb19lbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKKwkJCQkJCSAgICAgICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mbyAgPSBpbmZvX2VsZW1lbnQtPmRhdGFbNl07CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJICBkZWZhdWx0OgorCQkJCQkJCS8vbm90aGluZyB0byBkbyBhdCBwcmVzZW50ISEhCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWxlZnQgLT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikgKworCQkJCQkJCWluZm9fZWxlbWVudC0+bGVuOworCQkJCQkJaW5mb19lbGVtZW50ID0gKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICopCisJCQkJCQkJJmluZm9fZWxlbWVudC0+ZGF0YVtpbmZvX2VsZW1lbnQtPmxlbl07CisJCQkJCX0KKwkJCQkJaWYoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykgLy9sZWdhY3kgQVAsIHJlc2V0IHRoZSBBQ194eF9wYXJhbSByZWdpc3RlcgorCQkJCQl7CisJCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKKwkJCQkJCWllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDE7Ly9pbmRpY2F0ZSBBQ194eF9wYXJhbSB1cGF0ZWQgc2luY2UgbGFzdCBhc3NvY2lhdGUKKwkJCQkJfQorYXNzb2NpYXRlX2NvbXBsZXRlOgorCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKGllZWUpOworCQkJCX1lbHNleworCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19lcnIrKzsKKwkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoCisJCQkJCQkiQXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleFxuIiwKKwkJCQkJCWVycmNvZGUpOworCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCQkJCX0KKwkJCX0KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCQllbHNlIGlmICgoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2Fzc29jX3JzcCkKKwkJCXsKKwkJCQkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2Fzc29jX3JzcChpZWVlLCBza2IpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgorCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisKKwkJCQlpZWVlODAyMTFfcnhfYXNzb2NfcnEoaWVlZSwgc2tiKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCQllbHNlIGlmICgoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2Fzc29jX3JlcSkKKwkJCXsKKwkJCQkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2Fzc29jX3JlcShpZWVlLCBza2IpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworcHJpbnRrKCJJRUVFODAyMTFfU1RZUEVfQVVUSFxuIik7CisJCQlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2F1dGgpCisJCQlpZiggaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2F1dGgoaWVlZSwgc2tiLCByeF9zdGF0cykgKTsKKyNlbmRpZgorCQkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKXsKKwkJCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HICYmCisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKworCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlJlY2VpdmVkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIik7CisKKwkJCQkJCWlmICgwID09IChlcnJjb2RlPWF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pKSl7CisJCQkJCQkJaWYoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSl7CisJCQkJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7CisJCQkJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19vaysrOworCisJCQkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7CisJCQkJCQkJfWVsc2V7CisJCQkJCQkJCWllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShpZWVlLCBjaGFsbGVuZ2UsIGNobGVuKTsKKwkJCQkJCQl9CisJCQkJCQl9ZWxzZXsKKwkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7CisJCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3Bvc2Ugc3RhdHVzIGNvZGUgMHgleCIsZXJyY29kZSk7CisJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwkJCQkJCX0KKworCQkJCQl9ZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCQkJCQlpZWVlODAyMTFfcnhfYXV0aF9ycShpZWVlLCBza2IpOworCQkJCQl9CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgorCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUykgJiYKKwkJCQkoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpCisKKwkJCQlpZWVlODAyMTFfcnhfcHJvYmVfcnEoaWVlZSwgc2tiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworcHJpbnRrKCJJRUVFODAyMTFfU1RZUEVfREVBVVRIXG4iKTsKKwkJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9kZWF1dGgpCisJCWlmKCBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fZGVhdXRoKGllZWUsIHNrYiwgcnhfc3RhdHMpICkJOworI2VuZGlmCisJCQkvKiBGSVhNRSBmb3Igbm93IHJlcGVhdCBhbGwgdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZQorCQkJKiBib3RoIGZvciBkaXNhc3NvY2lhdGlvbiBhbmQgZGVhdXRoZW50aWNhdGlvbgorCQkJKi8KKwkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCisJCQkJKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmCisJCQkJKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgJiYKKwkJCQkoIW1lbWNtcChoZWFkZXItPmFkZHIyLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCxFVEhfQUxFTikpKXsKKwkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKKwkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJlYXNzb2MrKzsKKworCQkJCS8vbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOyAgLy9ZSixkZWwsMDgwODI4LCBkbyBub3Qgbm90aWZ5IG9zIGhlcmUKKwkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwl9CisKKwkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiBmb2xsb3dpbmcgYXJlIGZvciBhIHNpbXBsaWVyIFRYIHF1ZXVlIG1hbmFnZW1lbnQuCisgKiBJbnN0ZWFkIG9mIHVzaW5nIG5ldGlmX1tzdG9wL3dha2VdX3F1ZXVlIHRoZSBkcml2ZXIKKyAqIHdpbGwgdXNlcyB0aGVzZSB0d28gZnVuY3Rpb24gKHBsdXMgYSByZXNldCBvbmUpLCB0aGF0CisgKiB3aWxsIGludGVybmFsbHkgdXNlcyB0aGUga2VybmVsIG5ldGlmXyogYW5kIHRha2VzCisgKiBjYXJlIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCisgKiBTbyB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgcGVyIHRpbWUgYW5kIG1pZ2h0CisgKiBjYWxsIHRoZSBzdG9wIGZ1bmN0aW9uIHdoZW4gaXQgd2FudCB3aXRob3V0IHRha2UgY2FyZQorICogdG8gaGF2ZSBlbm91Z2h0IHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KKyAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgorICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KKyAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0cmVzaG9sZCBpcyBub3QgZW5vdWdodC4uIElmIHRoZQorICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAorICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKKyAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRAorICogSW4gdGhpcyB3YXkgeW91IG5lZWQganVzdCBvbmUgYW5kIHRoZSA4MDIuMTEgc3RhY2sKKyAqIHdpbGwgdGFrZSBjYXJlIG9mIGJ1ZmZlcmluZyBmcmFnbWVudHMgYW5kIHBhc3MgdGhlbSB0bworICogdG8gdGhlIGRyaXZlciBsYXRlciwgd2hlbiBpdCB3YWtlcyB0aGUgcXVldWUuCisgKi8KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgaTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaW50IHJhdGUgPSBpZWVlLT5yYXRlOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJI2lmIDAKKwlpZihpZWVlLT5xdWV1ZV9zdG9wKXsKKwkJSUVFRTgwMjExRE1FU0coIkVFOiBJRUVFIGhhcmRfc3RhcnRfeG1pdCBpbnZva2VkIHdoZW4ga2VybmVsIHF1ZXVlIHNob3VsZCBiZSBzdG9wcGVkIik7CisJCW5ldGlmX3N0b3BfcXVldWUoaWVlZS0+ZGV2KTsKKwkJaWVlZS0+aWVlZV9zdGF0cy5zd3R4c3RvcCsrOworCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWVyciA9IDE7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZWVlLT5zdGF0cy50eF9ieXRlcys9c2tiLT5sZW47CisKKworCXR4Yj1pZWVlODAyMTFfc2tiX3RvX3R4YihpZWVlLHNrYik7CisKKworCWlmKHR4Yj09TlVMTCl7CisJCUlFRUU4MDIxMURNRVNHKCJXVzogSUVFRSBzdGFjayBmYWlsZWQgdG8gcHJvdmlkZSB0eGIiKTsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQllcnIgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCSNlbmRpZgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3NvZnRtYWNfeG1pdF9nZXRfcmF0ZSAmJiB0eGItPm5yX2ZyYWdzKQorCXsKKwkJcmF0ZSA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfc29mdG1hY194bWl0X2dldF9yYXRlKGllZWUsIHR4Yi0+ZnJhZ21lbnRzWzBdKTsKKwl9CisjZW5kaWYKKwkvKiBjYWxsZWQgd2l0aCAybmQgcGFybSAwLCBubyB0eCBtZ210IGxvY2sgcmVxdWlyZWQgKi8KKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCisJZm9yKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKSB7CisKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApeworCQkJaWVlZS0+dHhfcGVuZGluZy50eGIgPSB0eGI7CisJCQlpZWVlLT50eF9wZW5kaW5nLmZyYWcgPSBpOworCQkJZ290byBleGl0OworCQl9ZWxzZXsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCisJCQkJdHhiLT5mcmFnbWVudHNbaV0sCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCQkJCWllZWUtPmRldiwgcmF0ZSk7CisjZWxzZQorCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKKyNlbmRpZgorCQkJCS8vKGkrMSk8dHhiLT5ucl9mcmFncyk7CisJCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZWVlLT5zdGF0cy50eF9ieXRlcyArPSB0eGItPmZyYWdtZW50c1tpXS0+bGVuOworCQkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKwl9CisKKwlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKKworCWV4aXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKworLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBhY3F1aXJlZCAqLwordm9pZCBpZWVlODAyMTFfcmVzdW1lX3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCWZvcihpID0gaWVlZS0+dHhfcGVuZGluZy5mcmFnOyBpIDwgaWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzOyBpKyspIHsKKworCQlpZiAoaWVlZS0+cXVldWVfc3RvcCl7CisJCQlpZWVlLT50eF9wZW5kaW5nLmZyYWcgPSBpOworCQkJcmV0dXJuOworCQl9ZWxzZXsKKworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKKwkJCQlpZWVlLT50eF9wZW5kaW5nLnR4Yi0+ZnJhZ21lbnRzW2ldLAorCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKKwkJCQkvLyhpKzEpPGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFncyk7CisJCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0KKworCisJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKKwlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7Cit9CisKKwordm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlpbml0X21nbXRfcXVldWUoaWVlZSk7CisJaWYgKGllZWUtPnR4X3BlbmRpbmcudHhiKXsKKwkJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKKwkJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworCX0KKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworfQorCit2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCWlmICghIGllZWUtPnF1ZXVlX3N0b3ApIGdvdG8gZXhpdDsKKworCWllZWUtPnF1ZXVlX3N0b3AgPSAwOworCisJaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpeworCQl3aGlsZSAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgKHNrYiA9IGRlcXVldWVfbWdtdChpZWVlKSkpeworCisJCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKKworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCQllbHNlCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkJLy9wcmludGsoS0VSTl9BTEVSVCAiaWVlZTgwMjExX3dha2VfcXVldWUgXG4iKTsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQl9CisJfQorCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBpZWVlLT50eF9wZW5kaW5nLnR4YikKKwkJaWVlZTgwMjExX3Jlc3VtZV90eChpZWVlKTsKKworCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpeworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhhd2FrZSsrOworCQluZXRpZl93YWtlX3F1ZXVlKGllZWUtPmRldik7CisJfQorCitleGl0IDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworCWlmICghIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSl7CisJCW5ldGlmX3N0b3BfcXVldWUoaWVlZS0+ZGV2KTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4c3RvcCsrOworCX0KKwlpZWVlLT5xdWV1ZV9zdG9wID0gMTsKKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCit9CisKKworaW5saW5lIHZvaWQgaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJZ2V0X3JhbmRvbV9ieXRlcyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCS8qIGFuIElCU1MgY2VsbCBhZGRyZXNzIG11c3QgaGF2ZSB0aGUgdHdvIGxlc3Mgc2lnbmlmaWNhbnQKKwkgKiBiaXRzIG9mIHRoZSBmaXJzdCBieXRlID0gMgorCSAqLworCWllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFswXSAmPSB+MHgwMTsKKwlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMF0gfD0gMHgwMjsKK30KKworLyogY2FsbGVkIGluIHVzZXIgY29udGV4dCBvbmx5ICovCit2b2lkIGllZWU4MDIxMV9zdGFydF9tYXN0ZXJfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPmFzc29jX2lkID0gMTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJCXN0cm5jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCisJCQlJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCwKKwkJCUlXX0VTU0lEX01BWF9TSVpFKTsKKworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisJfQorCisJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKK30KKwordm9pZCBpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnJhd190eCl7CisKKwkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwkJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCX0KK30KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHN0YXJ0X2lic3Nfd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKworCS8qIGl3Y29uZmlnIG1vZGUgYWQtaG9jIHdpbGwgc2NoZWR1bGUgdGhpcyBhbmQgcmV0dXJuCisJICogb24gdGhlIG90aGVyIGhhbmQgdGhpcyB3aWxsIGJsb2NrIGZ1cnRoZXIgaXdjb25maWcgU0VUCisJICogb3BlcmF0aW9ucyBiZWNhdXNlIG9mIHRoZSB3eF9zZW0gaG9sZC4KKwkgKiBBbnl3YXkgc29tZSBtb3N0IHNldCBvcGVyYXRpb25zIHNldCBhIGZsYWcgdG8gc3BlZWQtdXAKKwkgKiAoYWJvcnQpIHRoaXMgd3EgKHdoZW4gc3luY3JvIHNjYW5uaW5nKSBiZWZvcmUgc2xlZXBpbmcKKwkgKiBvbiB0aGUgc2VtYXBob3JlCisJICovCisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlzdHJjcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisJfQorCisJLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGlzIGNlbGwgaW4gb3VyIG5ldHdvcmsgbGlzdCAqLworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gMTA7CisjZW5kaWYKKwkvKiBpZiBub3QgdGhlbiB0aGUgc3RhdGUgaXMgbm90IGxpbmtlZC4gTWF5YmUgdGhlIHVzZXIgc3dpdGhjZWQgdG8KKwkgKiBhZC1ob2MgbW9kZSBqdXN0IGFmdGVyIGJlaW5nIGluIG1vbml0b3IgbW9kZSwgb3IganVzdCBhZnRlcgorCSAqIGJlaW5nIHZlcnkgZmV3IHRpbWUgaW4gbWFuYWdlZCBtb2RlIChzbyB0aGUgY2FyZCBoYXZlIGhhZCBubworCSAqIHRpbWUgdG8gc2NhbiBhbGwgdGhlIGNoYW5zLi4pIG9yIHdlIGhhdmUganVzdCBydW4gdXAgdGhlIGlmYWNlCisJICogYWZ0ZXIgc2V0dGluZyBhZC1ob2MgbW9kZS4gU28gd2UgaGF2ZSB0byBnaXZlIGFub3RoZXIgdHJ5Li4KKwkgKiBIZXJlLCBpbiBpYnNzIG1vZGUsIHNob3VsZCBiZSBzYWZlIHRvIGRvIHRoaXMgd2l0aG91dCBleHRyYSBjYXJlCisJICogKGluIGJzcyBtb2RlIHdlIGhhZCB0byBtYWtlIHN1cmUgbm8tb25lIHRyeWVkIHRvIGFzc29jaWF0ZSB3aGVuCisJICogd2UgaGFkIGp1c3QgY2hlY2tlZCB0aGUgaWVlZS0+c3RhdGUgYW5kIHdlIHdhcyBnb2luZyB0byBzdGFydCB0aGUKKwkgKiBzY2FuKSBiZWFjYXVzZSBpbiBpYnNzIG1vZGUgdGhlIGllZWU4MDIxMV9uZXdfbmV0IGZ1bmN0aW9uLCB3aGVuCisJICogZmluZHMgYSBnb29kIG5ldCwganVzdCBzZXQgdGhlIGllZWUtPnN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsCisJICogc28sIGF0IHdvcnN0LCB3ZSB3YXN0ZSBhIGJpdCBvZiB0aW1lIHRvIGluaXRpYXRlIGFuIHVubmVlZGVkIHN5bmNybworCSAqIHNjYW4sIHRoYXQgd2lsbCBzdG9wIGF0IHRoZSBmaXJzdCByb3VuZCBiZWNhdXNlIGl0IHNlZXMgdGhlIHN0YXRlCisJICogYXNzb2NpYXRlZC4KKwkgKi8KKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwkJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOworCisJLyogdGhlIG5ldHdvcmsgZGVmaW5pdGl2ZWx5IGlzIG5vdCBoZXJlLi4gY3JlYXRlIGEgbmV3IGNlbGwgKi8KKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJCXByaW50aygiY3JlYXRpbmcgbmV3IElCU1MgY2VsbFxuIik7CisJCWlmKCFpZWVlLT53YXBfc2V0KQorCQkJaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKGllZWUpOworCisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gNDsKKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzBdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzJNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1syXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzNdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COworCisJCX1lbHNlCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gMDsKKworCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTil7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gODsKKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzBdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzFdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzJdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFszXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzVdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs2XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbN10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV81NE1COworCisJCQlpZWVlLT5yYXRlID0gNTQwOworCQl9ZWxzZXsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSAwOworCQkJaWVlZS0+cmF0ZSA9IDExMDsKKwkJfQorCisJCS8vIEJ5IGRlZmF1bHQsIFdNTSBmdW5jdGlvbiB3aWxsIGJlIGRpc2FibGVkIGluIElCU1MgbW9kZQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSA9IDA7CisKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93ID0gMDsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKKwkJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UOworCisJfQorCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImFmdGVyIHNlbmRpbmcgYmVhY29uIHBhY2tldCFcbiIpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKworCXVwKCZpZWVlLT53eF9zZW0pOworfQoraW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c3RhcnRfaWJzc193cSwgMTAwKTsKK30KKworLyogdGhpcyBpcyBjYWxsZWQgb25seSBpbiB1c2VyIGNvbnRleHQsIHdpdGggd3hfc2VtIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkvLworCS8vIFJlZjogODAyLjExZCAxMS4xLjMuMworCS8vIFNUQSBzaGFsbCBub3Qgc3RhcnQgYSBCU1MgdW5sZXNzIHByb3Blcmx5IGZvcm1lZCBCZWFjb24gZnJhbWUgaW5jbHVkaW5nIGEgQ291bnRyeSBJRS4KKwkvLworCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgJiYgIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJeworCQlpZighIGllZWUtPmJHbG9iYWxEb21haW4pCisJCXsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZgorCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCB0aGUgbmV0IHdlCisJICogYXJlIGludGVyZXN0ZWQgaW4gKGlmIGFueSkuCisJICogaWYgbm90ICh3ZSBhcmUgZGlzYXNzb2NpYXRlZCBhbmQgd2UgYXJlIG5vdAorCSAqIGluIGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcgcGhhc2UpIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nLgorCSAqLworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisJLyogZW5zdXJlIG5vLW9uZSBzdGFydCBhbiBhc3NvY2lhdGluZyBwcm9jZXNzICh0aHVzIHNldHRpbmcKKwkgKiB0aGUgaWVlZS0+c3RhdGUgdG8gaWVlZTgwMjExX0FTU09DSUFUSU5HKSB3aGlsZSB3ZQorCSAqIGhhdmUganVzdCBjaGVrZWQgaXQgYW5kIHdlIGFyZSBnb2luZyB0byBlbmFibGUgc2Nhbi4KKwkgKiBUaGUgaWVlZTgwMjExX25ld19uZXQgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB3aXRoCisJICogbG9jayBoZWxkIChmcm9tIGJvdGggaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kCisJICogdGhlIHJ4IHBhdGgpLCBzbyB3ZSBjYW5ub3QgYmUgaW4gdGhlIG1pZGRsZSBvZiBzdWNoIGZ1bmN0aW9uCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworLy8jaWZkZWYgRU5BQkxFX0lQUworLy8JcHJpbnRrKCJzdGFydCBic3MgRU5BQkxFX0lQU1xuIik7CisvLyNlbHNlCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7CisJCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCX0KKy8vI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorCisvKiBjYWxsZWQgb25seSBpbiB1c2Vyc3BhY2UgY29udGV4dCAqLwordm9pZCBpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCW5ldGlmX2NhcnJpZXJfb2ZmKGllZWUtPmRldik7CisKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkKKwkJCWllZWU4MDIxMV9yZXNldF9xdWV1ZShpZWVlKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRG90MTFkX1Jlc2V0KGllZWUpOworI2VuZGlmCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCit9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9yZXRyeV93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlnb3RvIGV4aXQ7CisJaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZKQorCQlnb3RvIGV4aXQ7CisJLyogdW50aWwgd2UgZG8gbm90IHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX05PTElOSworCSogdGhlcmUgYXJlIG5vIHBvc3NpYmlsaXR5IHRvIGhhdmUgc29tZW9uZSBlbHNlIHRyeWluZworCSogdG8gc3RhcnQgYW4gYXNzb2NpYXRpb24gcHJvY2R1cmUgKHdlIGdldCBoZXJlIHdpdGgKKwkqIGllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HKS4KKwkqIFdoZW4gd2Ugc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTk9MSU5LIGl0IGlzIHBvc3NpYmxlCisJKiB0aGF0IHRoZSBSWCBwYXRoIHJ1biBhbiBhdHRlbXB0IHRvIGFzc29jaWF0ZSwgYnV0CisJKiBib3RoIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzIGFuZCB0aGUKKwkqIFJYIHBhdGggd29ya3Mgd2l0aCBpZWVlLT5sb2NrIGhlbGQgc28gdGhlcmUgYXJlIG5vCisJKiBwcm9ibGVtcy4gSWYgd2UgYXJlIHN0aWxsIGRpc2Fzc29jaWF0ZWQgdGhlbiBzdGFydCBhIHNjYW4uCisJKiB0aGUgbG9jayBoZXJlIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgbm8gb25lIHRyeSB0byBzdGFydAorCSogYW4gYXNzb2NpYXRpb24gcHJvY2VkdXJlIHdoZW4gd2UgaGF2ZSBqdXN0IGNoZWNrZWQgdGhlCisJKiBzdGF0ZSBhbmQgd2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHRoZSBzY2FuLgorCSovCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCWllZWUtPmJlaW5yZXRyeSA9IHRydWU7CisJaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7CisJCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCX0KKwkvL1lKLGFkZCwwODA4MjgsIG5vdGlmeSBvcyBoZXJlCisJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwl7CisJCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKwl9CisJLy9ZSixhZGQsMDgwODI4LGVuZAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1OCBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmI7CisKKy8vcnoKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9nZXRfYmVhY29uX2dldF9wcm9iZXJzcCApCisJCXNrYiA9IGllZWUtPmV4dF9wYXRjaF9nZXRfYmVhY29uX2dldF9wcm9iZXJzcChpZWVlLCBicm9hZGNhc3RfYWRkciwgJihpZWVlLT5jdXJyZW50X25ldHdvcmspKTsKKwllbHNlCisJCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGJyb2FkY2FzdF9hZGRyKTsKKyNlbHNlCisJc2tiID0gaWVlZTgwMjExX3Byb2JlX3Jlc3AoaWVlZSwgYnJvYWRjYXN0X2FkZHIpOworI2VuZGlmCisvLworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWIgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKSBza2ItPmRhdGE7CisJYi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOworCisJcmV0dXJuIHNrYjsKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOworCisJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOworCWlmKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYi0+ZGF0YTsKKwliLT5oZWFkZXIuc2VxX2N0cmwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCWVsc2UKKwkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCXJldHVybiBza2I7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwkJcmV0dXJuOworCisJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDA7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9zdG9wX3Byb3RvY29sKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisvL2lmIGNhbGwgcXVldWVfZGVsYXllZF93b3JrLGNhbiBjYWxsIHRoaXMsb3IgZG8gbm90aGluZy4uCisvL2VkaXQgYnkgbGF3cmVuY2UsMjAwNzExMTgKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8vCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworLy8JY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxKTsKKyNlbmRpZgorI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSYmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKSB7CisJCVNlbmREaXNhc3NvY2lhdGlvbihpZWVlLE5VTEwsV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUKTsKKwl9CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5zdGFydF9pYnNzX3dxKTsKKwlpZWVlODAyMTFfc3RvcF9zY2FuKGllZWUpOworCisJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXNob3J0IGNoID0gMDsKKyAJaW50IGkgPSAwOworCisJaWYgKGllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybjsKKworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApeworCQlkb3sKKwkJCWNoKys7CisJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJcmV0dXJuOyAvKiBubyBjaGFubmVsIGZvdW5kICovCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCX13aGlsZSghR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtjaF0pOworI2Vsc2UKKwkJfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtjaF0pOworI2VuZGlmCisKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBjaDsKKwl9CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9PSAwKQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0gMTAwOworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldixpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKyAgICAgICAJZm9yKGkgPSAwOyBpIDwgMTc7IGkrKykgeworCSAgaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcnhmcmFnX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CisJfQorCisJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsvL3JlaW5pdGlhbGl6ZSBBQ194eF9QQVJBTSByZWdpc3RlcnMuCisKKworCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgTUFDIG9mIHRoZSBhZC1ob2MgY2VsbCBhbmQgdGhlbgorCSAqIHN3aXRjaCB0byBtYW5hZ2VkIG1vZGUsIHNoYWxsIHdlICBtYWtlIHN1cmUgdGhhdCBhc3NvY2lhdGlvbgorCSAqIGF0dGVtcHRzIGRvZXMgbm90IGZhaWwganVzdCBiZWNhdXNlIHRoZSB1c2VyIHByb3ZpZGUgdGhlIGVzc2lkCisJICogYW5kIHRoZSBuaWMgaXMgc3RpbGwgY2hlY2tpbmcgZm9yIHRoZSBBUCBNQUMgPz8KKwkgKi8KKwlzd2l0Y2ggKGllZWUtPml3X21vZGUpIHsKKwkJY2FzZSBJV19NT0RFX0FVVE86CisJCQlpZWVlLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJCS8vbm90IHNldCBicmVhayBoZXJlIGludGVudGlvbmx5CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCWllZWU4MDIxMV9zdGFydF9ic3MoaWVlZSk7CisJCQlicmVhazsKKworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlpZWVlODAyMTFfc3RhcnRfaWJzcyhpZWVlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfTU9ERV9NQVNURVI6CisJCQlpZWVlODAyMTFfc3RhcnRfbWFzdGVyX2JzcyhpZWVlKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKGllZWUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCQlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiZcCisJCQkgICAgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9zdGFydF9wcm90b2NvbCAmJlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworI2VuZGlmCisJCQkJLy8gQnkgZGVmYXVsdCwgV01NIGZ1bmN0aW9uIHdpbGwgYmUgZGlzYWJsZWQgaW4KKwkJCQkvLyBFWFRFTlNJT04gbW9kZQorCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlID0gMDsKKworCQkJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gNDsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzBdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBcCisJCQkJCSAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1sxXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzJNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzJdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbM10gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COworCQkJCX1lbHNlCisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSAwOworCisJCQkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gODsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzBdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzFdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzJdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFszXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzRdID1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzVdID1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzZdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs3XSA9XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisJCQkJCWllZWUtPnJhdGUgPSA1NDA7CisJCQkJfWVsc2V7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSAwOworCQkJCQlpZWVlLT5yYXRlID0gMTEwOworCQkJCX0KKworCQkJCS8qCisJCQkJICAgc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwkJCQkgICBpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwkJCQkgICBpZWVlODAyMTFfc3RhcnRfc2NhbihpZWVlKTsKKwkJCQkvLyBpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIDgpOworCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCQkJCSovCisJCQkJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgaWVlZS0+ZGV2LT5kZXZfYWRkcixcCisJCQkJICAgICAgCSBFVEhfQUxFTik7CisJCQkJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwkJCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwkJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJCQkJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCQkJfSBlbHNlIHsKKwkJCQlpZWVlLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJCQlpZWVlODAyMTFfc3RhcnRfYnNzKGllZWUpOworCQkJfQorI2Vsc2UKKwkJCWllZWUtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQkJaWVlZTgwMjExX3N0YXJ0X2JzcyhpZWVlKTsKKworI2VuZGlmCisJCQlicmVhazsKKwl9Cit9CisKKworI2RlZmluZSBEUlZfTkFNRSAgIkllZWU4MDIxMSIKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKwltZW1zZXQoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKKwlmb3IoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkgIGllZWUtPnNlcV9jdHJsW2ldID0gMDsKKwl9CisKKwlpZWVlLT5hc3NvY19pZCA9IDA7CisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisJaWVlZS0+c2Nhbm5pbmcgPSAwOworCWllZWUtPnNvZnRtYWNfZmVhdHVyZXMgPSAwOyAvL3NvIElFRUUyMTAwLWxpa2UgZHJpdmVyIGFyZSBoYXBweQorCWllZWUtPndhcF9zZXQgPSAwOworCWllZWUtPnNzaWRfc2V0ID0gMDsKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKKwlpZWVlLT5iYXNpY19yYXRlID0gSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURTsKKwlpZWVlLT5yYXRlID0gMzsKKy8vI2lmZGVmIEVOQUJMRV9MUFMKKwlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19NQkNBU1R8SUVFRTgwMjExX1BTX1VOSUNBU1Q7CisvLyNlbHNlCisvLwlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKy8vI2VuZGlmCisJaWVlZS0+c3RhX3NsZWVwID0gMDsKKy8vYnkgYW15CisJaWVlZS0+YkluYWN0aXZlUHMgPSBmYWxzZTsKKwlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOworCWllZWUtPkxpc3RlbkludGVydmFsID0gMjsKKwlpZWVlLT5OdW1SeERhdGFJblBlcmlvZCA9IDA7IC8vWUosYWRkLDA4MDgyOAorCWllZWUtPk51bVJ4QmNuSW5QZXJpb2QgPSAwOyAvL1lKLGFkZCwwODA4MjgKKwlpZWVlLT5OdW1SeE9rVG90YWwgPSAwOy8vK2J5IGFteSAwODAzMTIKKwlpZWVlLT5OdW1SeFVuaWNhc3QgPSAwOy8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZQorCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCWllZWUtPmJId1JhZGlvT2ZmID0gZmFsc2U7CisvL2J5IGFteQorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZWVlLT5pd19leHRfbW9kZSA9IDk5OTsKKyNlbmRpZgorCisJaW5pdF9tZ210X3F1ZXVlKGllZWUpOworI2lmIDAKKwlpbml0X3RpbWVyKCZpZWVlLT5zY2FuX3RpbWVyKTsKKwlpZWVlLT5zY2FuX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPnNjYW5fdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfc29mdG1hY19zY2FuX2NiOworI2VuZGlmCisJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworCisJaW5pdF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7CisJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydF9jYjsKKworCWluaXRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7CisJaWVlZS0+YmVhY29uX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaWVlZTsKKwlpZWVlLT5iZWFjb25fdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2I7CisKKyNpZmRlZiBQRl9TWU5DVEhSRUFECisJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FLDApOworI2Vsc2UKKwlpZWVlLT53cSA9IGNyZWF0ZV93b3JrcXVldWUoRFJWX05BTUUpOworI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkvL2FkZGVkIGJ5IGxhd3JlbmNlLDA3MDcwMgorCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zdGFydF9pYnNzX3dxLCh2b2lkKikgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cSk7CisJSU5JVF9XT1JLKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKTsKKy8vCUlOSVRfV09SSygmaWVlZS0+d2F0Y2hfZG9nX3dxLCh2b2lkKikgaWVlZTgwMjExX3dhdGNoX2RvZ193cSk7CisvL2FkZGVkIGJ5IGxhd3JlbmNlLDIwMDcxMTE4CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCUlOSVRfV09SSygmaWVlZS0+ZXh0X3N0b3Bfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxKTsKKwkvL0lOSVRfV09SSygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxLCh2b2lkKikgaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EsKHZvaWQqKSBleHRfaWVlZTgwMjExX3NlbmRfYmVhY29uX3dxKTsKKyNlbmRpZiAvL19SVEw4MTg3X0VYVF9QQVRDSF8KKyNlbHNlCisJSU5JVF9XT1JLKCZpZWVlLT5zdGFydF9pYnNzX3dxLCh2b2lkKikgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxLGllZWUpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cSxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cSxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxLGllZWUpOworLy8JSU5JVF9XT1JLKCZpZWVlLT53YXRjaF9kb2dfd3EsKHZvaWQqKSBpZWVlODAyMTFfd2F0Y2hfZG9nX3dxLGllZWUpOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlJTklUX1dPUksoJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cSxpZWVlKTsKKwkvL0lOSVRfV09SSygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxLCh2b2lkKikgaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EsKHZvaWQqKSBleHRfaWVlZTgwMjExX3NlbmRfYmVhY29uX3dxLGllZWUpOworI2VuZGlmCisjZW5kaWYKKwlzZW1hX2luaXQoJmllZWUtPnd4X3NlbSwgMSk7CisJc2VtYV9pbml0KCZpZWVlLT5zY2FuX3NlbSwgMSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bWdtdF90eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+YmVhY29uX2xvY2spOworCisJdGFza2xldF9pbml0KCZpZWVlLT5wc190YXNrLAorCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpIGllZWU4MDIxMV9zdGFfcHMsCisJICAgICAodW5zaWduZWQgbG9uZylpZWVlKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWVlZS0+cERvdDExZEluZm8gPSBrbWFsbG9jKHNpemVvZihSVF9ET1QxMURfSU5GTyksIEdGUF9BVE9NSUMpOworI2VuZGlmCit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKworCisJLy9hZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0pOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSk7CisjZW5kaWYKKwlkZXN0cm95X3dvcmtxdWV1ZShpZWVlLT53cSk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKE5VTEwgIT0gaWVlZS0+cERvdDExZEluZm8pCisJCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKKyNlbmRpZgorCXVwKCZpZWVlLT53eF9zZW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0YXJ0IG9mIFdQQSBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogdGhpcyBpcyBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHZhbHVlKQoreworCS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd3BhX3N1cHBsaWNhbnQgbG9hZHMgYW5kIGNsb3NlcyB0aGUgZHJpdmVyCisJICogaW50ZXJmYWNlLiAqLworCXByaW50aygiJXMgV1BBXG4iLHZhbHVlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKwlpZWVlLT53cGFfZW5hYmxlZCA9IHZhbHVlOworCXJldHVybiAwOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2hhciAqd3BhX2llLCBpbnQgd3BhX2llX2xlbikKK3sKKwkvKiBtYWtlIHN1cmUgV1BBIGlzIGVuYWJsZWQgKi8KKwlpZWVlODAyMTFfd3BhX2VuYWJsZShpZWVlLCAxKTsKKworCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjb21tYW5kLCBpbnQgcmVhc29uKQoreworCisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIElFRUVfTUxNRV9TVEFfREVBVVRIOgorCQkvLyBzaWxlbnRseSBpZ25vcmUKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfTUxNRV9TVEFfRElTQVNTT0M6CisJCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIE1MTUUgcmVxdWVzdDogJWRcbiIsIGNvbW1hbmQpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGxlbikKK3sKKwl1OCAqYnVmOworCisJaWYgKHBhcmFtLT51LndwYV9pZS5sZW4gPiBNQVhfV1BBX0lFX0xFTiB8fAorCSAgICAocGFyYW0tPnUud3BhX2llLmxlbiAmJiBwYXJhbS0+dS53cGFfaWUuZGF0YSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyYW0tPnUud3BhX2llLmxlbikgeworCQlidWYgPSBrbWFsbG9jKHBhcmFtLT51LndwYV9pZS5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1jcHkoYnVmLCBwYXJhbS0+dS53cGFfaWUuZGF0YSwgcGFyYW0tPnUud3BhX2llLmxlbik7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IGJ1ZjsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IHBhcmFtLT51LndwYV9pZS5sZW47CisJfSBlbHNlIHsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gTlVMTDsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IDA7CisJfQorCisJaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShpZWVlLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCXJldHVybiAwOworfQorCisjZGVmaW5lIEFVVEhfQUxHX09QRU5fU1lTVEVNCQkJMHgxCisjZGVmaW5lIEFVVEhfQUxHX1NIQVJFRF9LRVkJCQkweDIKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKK3sKKworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSBTRUNfQVVUSF9NT0RFLAorCX07CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsdWUgJiBBVVRIX0FMR19TSEFSRURfS0VZKSB7CisJCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwkJaWVlZS0+b3Blbl93ZXAgPSAwOworCX0gZWxzZSB7CisJCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfT1BFTjsKKwkJaWVlZS0+b3Blbl93ZXAgPSAxOworCX0KKworCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X3BhcmFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCBuYW1lLCB1MzIgdmFsdWUpCit7CisJaW50IHJldD0wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzd2l0Y2ggKG5hbWUpIHsKKwljYXNlIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQ6CisJCXJldCA9IGllZWU4MDIxMV93cGFfZW5hYmxlKGllZWUsIHZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisJCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzPXZhbHVlOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVEOiB7CisJCS8qIEhBQ0s6CisJCSAqCisJCSAqIHdwYV9zdXBwbGljYW50IGNhbGxzIHNldF93cGFfZW5hYmxlZCB3aGVuIHRoZSBkcml2ZXIKKwkJICogaXMgbG9hZGVkIGFuZCB1bmxvYWRlZCwgcmVnYXJkbGVzcyBvZiBpZiBXUEEgaXMgYmVpbmcKKwkJICogdXNlZC4gIE5vIG90aGVyIGNhbGxzIGFyZSBtYWRlIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisJCSAqIGRldGVybWluZSBpZiBlbmNyeXB0aW9uIHdpbGwgYmUgdXNlZCBvciBub3QgcHJpb3IgdG8KKwkJICogYXNzb2NpYXRpb24gYmVpbmcgZXhwZWN0ZWQuICBJZiBlbmNyeXB0aW9uIGlzIG5vdCBiZWluZworCQkgKiB1c2VkLCBkcm9wX3VuZW5jcnlwdGVkIGlzIHNldCB0byBmYWxzZSwgZWxzZSB0cnVlIC0tIHdlCisJCSAqIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgdGhlIENBUF9QUklWQUNZX09OIGJpdCBzaG91bGQKKwkJICogYmUgc2V0LgorCQkgKi8KKwkJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisJCQkuZmxhZ3MgPSBTRUNfRU5BQkxFRCwKKwkJCS5lbmFibGVkID0gdmFsdWUsCisJCX07CisgCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gdmFsdWU7CisJCS8qIFdlIG9ubHkgY2hhbmdlIFNFQ19MRVZFTCBmb3Igb3BlbiBtb2RlLiBPdGhlcnMKKwkJICogYXJlIHNldCBieSBpcHdfd3BhX3NldF9lbmNyeXB0aW9uLgorCQkgKi8KKwkJaWYgKCF2YWx1ZSkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQl9CisJCWVsc2UgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOworCQl9CisJCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJRUVFX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRDoKKwkJaWVlZS0+cHJpdmFjeV9pbnZva2VkPXZhbHVlOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9BVVRIX0FMR1M6CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2F1dGhfYWxncyhpZWVlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYOgorCQlpZWVlLT5pZWVlODAyXzF4PXZhbHVlOworCQlicmVhazsKKwljYXNlIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1Q6CisJCS8vIGFkZGVkIGZvciBXUEEyIG1peGVkIG1vZGUKKwkJLy9wcmludGsoS0VSTl9XQVJOSU5HICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+d3BheCB2YWx1ZSA9ICV4XG4iLCB2YWx1ZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlpZWVlLT53cGF4X3R5cGVfc2V0ID0gMTsKKwkJaWVlZS0+d3BheF90eXBlX25vdGlmeSA9IHZhbHVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLG5hbWUpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbXBsZW1lbnRhdGlvbiBib3Jyb3dlZCBmcm9tIGhvc3RhcCBkcml2ZXIgKi8KKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGFyYW1fbGVuKQoreworCWludCByZXQgPSAwOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMCwKKwl9OworCisJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKKwlwYXJhbS0+dS5jcnlwdC5hbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisKKwlpZiAocGFyYW1fbGVuICE9CisJICAgIChpbnQpICgoY2hhciAqKSBwYXJhbS0+dS5jcnlwdC5rZXkgLSAoY2hhciAqKSBwYXJhbSkgKworCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKSB7CisJCXByaW50aygiTGVuIG1pc21hdGNoICVkLCAlZFxuIiwgcGFyYW1fbGVuLAorCQkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHBhcmFtLT5zdGFfYWRkclswXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclsxXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkclsyXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclszXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkcls0XSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkcls1XSA9PSAweGZmKSB7CisJCWlmIChwYXJhbS0+dS5jcnlwdC5pZHggPj0gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3J5cHQgPSAmaWVlZS0+Y3J5cHRbcGFyYW0tPnUuY3J5cHQuaWR4XTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSA9PSAwKSB7CisJCWlmIChjcnlwdCkgeworCQkJc2VjLmVuYWJsZWQgPSAwOworCQkJLy8gRklYTUUgRklYTUUKKwkJCS8vc2VjLmVuY3J5cHQgPSAwOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQgfCBTRUNfTEVWRUw7CisJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisJc2VjLmVuYWJsZWQgPSAxOworLy8gRklYTUUgRklYTUUKKy8vCXNlYy5lbmNyeXB0ID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwkvKiBJUFcgSFcgY2Fubm90IGJ1aWxkIFRLSVAgTUlDLCBob3N0IGRlY3J5cHRpb24gc3RpbGwgbmVlZGVkLiAqLworCWlmICghKGllZWUtPmhvc3RfZW5jcnlwdCB8fCBpZWVlLT5ob3N0X2RlY3J5cHQpICYmCisJICAgIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikpCisJCWdvdG8gc2tpcF9ob3N0X2NyeXB0OworCisJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfdGtpcCIpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9IGVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkgeworCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X2NjbXAiKTsKKwkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJfQorCWlmIChvcHMgPT0gTlVMTCkgeworCQlwcmludGsoInVua25vd24gY3J5cHRvIGFsZyAnJXMnXG4iLCBwYXJhbS0+dS5jcnlwdC5hbGcpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRzsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisJCW5ld19jcnlwdCA9IChzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKikKKwkJCWttYWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CisJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKKwkJbmV3X2NyeXB0LT5vcHMgPSBvcHM7CisJCWlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQorCQkJbmV3X2NyeXB0LT5wcml2ID0KKwkJCQluZXdfY3J5cHQtPm9wcy0+aW5pdChwYXJhbS0+dS5jcnlwdC5pZHgpOworCisJCWlmIChuZXdfY3J5cHQtPnByaXYgPT0gTlVMTCkgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVEOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCSpjcnlwdCA9IG5ld19jcnlwdDsKKwl9CisKKwlpZiAocGFyYW0tPnUuY3J5cHQua2V5X2xlbiA+IDAgJiYgKCpjcnlwdCktPm9wcy0+c2V0X2tleSAmJgorCSAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHBhcmFtLT51LmNyeXB0LmtleSwKKwkJCQkgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuLCBwYXJhbS0+dS5jcnlwdC5zZXEsCisJCQkJICAgKCpjcnlwdCktPnByaXYpIDwgMCkgeworCQlwcmludGsoImtleSBzZXR0aW5nIGZhaWxlZFxuIik7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVEOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisgc2tpcF9ob3N0X2NyeXB0OgorCWlmIChwYXJhbS0+dS5jcnlwdC5zZXRfdHgpIHsKKwkJaWVlZS0+dHhfa2V5aWR4ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQlzZWMuYWN0aXZlX2tleSA9IHBhcmFtLT51LmNyeXB0LmlkeDsKKwkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCX0gZWxzZQorCQlzZWMuZmxhZ3MgJj0gflNFQ19BQ1RJVkVfS0VZOworCisJaWYgKHBhcmFtLT51LmNyeXB0LmFsZyAhPSBOVUxMKSB7CisJCW1lbWNweShzZWMua2V5c1twYXJhbS0+dS5jcnlwdC5pZHhdLAorCQkgICAgICAgcGFyYW0tPnUuY3J5cHQua2V5LAorCQkgICAgICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbik7CisJCXNlYy5rZXlfc2l6ZXNbcGFyYW0tPnUuY3J5cHQuaWR4XSA9IHBhcmFtLT51LmNyeXB0LmtleV9sZW47CisJCXNlYy5mbGFncyB8PSAoMSA8PCBwYXJhbS0+dS5jcnlwdC5pZHgpOworCisJCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOworCQl9IGVsc2UgaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8yOworCQl9IGVsc2UgaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8zOworCQl9CisJfQorIGRvbmU6CisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisKKwkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAorCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKKwkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAorCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgorCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCisJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQoaWVlZS0+ZGV2KSkgeworCQlwcmludGsoInJlc2V0X3BvcnQgZmFpbGVkXG4iKTsKKwkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3BvaW50ICpwKQoreworCXN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbTsKKwlpbnQgcmV0PTA7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCS8vSUVFRV9ERUJVR19JTkZPKCJ3cGFfc3VwcGxpY2FudDogbGVuPSVkXG4iLCBwLT5sZW5ndGgpOworCisJaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwYXJhbSA9IChzdHJ1Y3QgaWVlZV9wYXJhbSAqKWttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAocGFyYW0gPT0gTlVMTCl7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKKwkJa2ZyZWUocGFyYW0pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtLT5jbWQpIHsKKworCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9QQVJBTToKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oaWVlZSwgcGFyYW0tPnUud3BhX3BhcmFtLm5hbWUsCisJCQkJCXBhcmFtLT51LndwYV9wYXJhbS52YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9TRVRfV1BBX0lFOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF93cGFfaWUoaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTjoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfZW5jcnlwdGlvbihpZWVlLCBwYXJhbSwgcC0+bGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfQ01EX01MTUU6CisJCXJldCA9IGllZWU4MDIxMV93cGFfbWxtZShpZWVlLCBwYXJhbS0+dS5tbG1lLmNvbW1hbmQsCisJCQkJICAgcGFyYW0tPnUubWxtZS5yZWFzb25fY29kZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIFdQQSBzdXBwbGljYW50IHJlcXVlc3Q6ICVkXG4iLHBhcmFtLT5jbWQpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA9PSAwICYmIGNvcHlfdG9fdXNlcihwLT5wb2ludGVyLCBwYXJhbSwgcC0+bGVuZ3RoKSkKKwkJcmV0ID0gLUVGQVVMVDsKKworCWtmcmVlKHBhcmFtKTsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChpZWVlLT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworfQorCisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfYmVhY29uKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dha2VfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yZXNldF9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9pc19zaG9ydHNsb3QpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfaXNfNTRnKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3BzX3R4X2Fjayk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKTsKK0VYUE9SVF9TWU1CT0wobm90aWZ5X3d4X2Fzc29jX2V2ZW50KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKTsKK0VYUE9SVF9TWU1CT0woU2VuZERpc2Fzc29jaWF0aW9uKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NvZnRtYWNfaXBzX3NjYW5fc3luY3JvKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcmVxKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9pc3N1ZV9kaXNhc3NvYyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcnNwKTsKK0VYUE9SVF9TWU1CT0woc29mdG1hY19tZ210X3htaXQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X3Byb2JlX3Jlc3BfYnlfbmV0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9zZW5kXzExc19iZWFjb24pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcnhfYXV0aF9ycSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEpOworI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2I4YWVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwpAQCAtMCwwICsxLDYwMiBAQAorLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCisgKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgorICoKKyAqIFNvbWUgcGllY2VzIG9mIGNvZGUgbWlnaHQgYmUgc3RvbGVuIGZyb20gaXB3MjEwMCBkcml2ZXIKKyAqIGNvcHlyaWdodCBvZiB3aG8gb3duIGl0J3MgY29weXJpZ2h0IDstKQorICoKKyAqIFBTIHd4IGhhbmRsZXIgbW9zdGx5IHN0b2xlbiBmcm9tIGhvc3RhcCwgY29weXJpZ2h0IHdobworICogb3duIGl0J3MgY29weXJpZ2h0IDstKQorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworLyogRklYTUU6IGFkZCBBIGZyZXFzICovCisKK2NvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXSA9IHsKKwkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LAorCTI0MzIsIDI0MzcsIDI0NDIsIDI0NDcsCisJMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywKKwkyNDcyLCAyNDg0Cit9OworCisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICYgd3JxdS0+ZnJlcTsKKy8vCXByaW50aygiaW4gJXNcbiIsX19GVU5DVElPTl9fKTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGlmIHNldHRpbmcgYnkgZnJlcSBjb252ZXJ0IHRvIGNoYW5uZWwgKi8KKwlpZiAoZndycS0+ZSA9PSAxKSB7CisJCWlmICgoZndycS0+bSA+PSAoaW50KSAyLjQxMmU4ICYmCisJCSAgICAgZndycS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkgeworCQkJaW50IGYgPSBmd3JxLT5tIC8gMTAwMDAwOworCQkJaW50IGMgPSAwOworCisJCQl3aGlsZSAoKGMgPCAxNCkgJiYgKGYgIT0gaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbY10pKQorCQkJCWMrKzsKKworCQkJLyogaGFjayB0byBmYWxsIHRocm91Z2ggKi8KKwkJCWZ3cnEtPmUgPSAwOworCQkJZndycS0+bSA9IGMgKyAxOworCQl9CisJfQorCisJaWYgKGZ3cnEtPmUgPiAwIHx8IGZ3cnEtPm0gPiAxNCB8fCBmd3JxLT5tIDwgMSApeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisKKwl9ZWxzZSB7IC8qIFNldCB0aGUgY2hhbm5lbCAqLworCisKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBmd3JxLT5tOworCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCQlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCisJCQlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoaWVlZSk7CisJCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCQkJfQorCX0KKworCXJldCA9IDA7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitpbnQgaWVlZTgwMjExX3d4X2dldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJiB3cnF1LT5mcmVxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApCisJCXJldHVybiAtMTsKKworCWZ3cnEtPm0gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKwlmd3JxLT5lID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCS8qIFdlIHdhbnQgYXZvaWQgdG8gZ2l2ZSB0byB0aGUgdXNlciBpbmNvbnNpc3RlbnQgaW5mb3MqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HICYmCisJCWllZWUtPndhcF9zZXQgPT0gMCkKKworCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLAorCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCisJaW50IHJldCA9IDA7CisJdTggemVyb1tdID0gezAsMCwwLDAsMCwwfTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2hvcnQgaWZ1cCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7Ly9kZXYtPmZsYWdzICYgSUZGX1VQOworCXN0cnVjdCBzb2NrYWRkciAqdGVtcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhd3JxOworCisJLy9wcmludGsoIj09PT09PT1TZXQgV0FQOiIpOworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJLyogdXNlIGlmY29uZmlnIGh3IGV0aGVyICovCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHRlbXAtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaWZ1cCkKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisKKwkvKiBqdXN0IHRvIGF2b2lkIHRvIGdpdmUgaW5jb25zaXN0ZW50IGluZm9zIGluIHRoZQorCSAqIGdldCB3eCBtZXRob2QuIG5vdCByZWFsbHkgbmVlZGVkIG90aGVyd2lzZQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCB0ZW1wLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJaWVlZS0+d2FwX3NldCA9IG1lbWNtcCh0ZW1wLT5zYV9kYXRhLCB6ZXJvLEVUSF9BTEVOKSE9MDsKKwkvL3ByaW50aygiICV4OiV4OiV4OiV4OiV4OiV4XG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMF0saWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzFdLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFsyXSxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbM10saWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzRdLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFs1XSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWZ1cCkKKwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYikKK3sKKwlpbnQgbGVuLHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIC0xOworCisJLyogV2Ugd2FudCBhdm9pZCB0byBnaXZlIHRvIHRoZSB1c2VyIGluY29uc2lzdGVudCBpbmZvcyovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSA9PSAnXDAnIHx8CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEICYmCisJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgJiYKKwkJaWVlZS0+c3NpZF9zZXQgPT0gMCl7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisJbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOworCXdycXUtPmVzc2lkLmxlbmd0aCA9IGxlbjsKKwlzdHJuY3B5KGIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsbGVuKTsKKwl3cnF1LT5lc3NpZC5mbGFncyA9IDE7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworCit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJdTMyIHRhcmdldF9yYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZTsKKworCS8vYWRkZWQgYnkgbGl6aGFvbWluZyBmb3IgYXV0byBtb2RlCisJaWYodGFyZ2V0X3JhdGUgPT0gLTEpeworCWllZWUtPnJhdGUgPSAxMTA7CisJfSBlbHNlIHsKKwlpZWVlLT5yYXRlID0gdGFyZ2V0X3JhdGUvMTAwMDAwOworCX0KKwkvL0ZJWE1FOiB3ZSBtaWdodCB3YW50IHRvIGxpbWl0IHJhdGUgYWxzbyBpbiBtYW5hZ2VtZW50IHByb3RvY29scy4KKwlyZXR1cm4gMDsKK30KKworCisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IGllZWUtPnJhdGUgKiAxMDAwMDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBpZWVlLT5pd19tb2RlKQorCQlnb3RvIG91dDsKKworCWlmICh3cnF1LT5tb2RlID09IElXX01PREVfTU9OSVRPUil7CisKKwkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKKwl9ZWxzZXsKKwkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOworCX0KKworCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCl7CisJCWllZWUtPml3X21vZGUgPSB3cnF1LT5tb2RlOworCX1lbHNleworCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKwkJaWVlZS0+aXdfbW9kZSA9IHdycXUtPm1vZGU7CisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKKwl9CisKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3ZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHd4X3N5bmNfc2Nhbl93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisvL3ZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKKy8veworCXNob3J0IGNoYW47CisKKwljaGFuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisKKwluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOworCisJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oaWVlZSk7CisKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoYW4pOworCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoaWVlZSk7CisKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisKKwkvL1lKLGFkZCwwODA4MjgsIEluIHByZXZlbnQgb2YgbG9zc2luZyBwaW5nIHBhY2tldCBkdXJpbmcgc2Nhbm5pbmcKKwkvL2llZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIGZhbHNlKTsKKwkvL1lKLGFkZCwwODA4MjgsZW5kCisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQgPSAwOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiB8fCAhKGllZWUtPnByb3RvX3N0YXJ0ZWQpKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwkvL1lKLGFkZCwwODA4MjgKKwkvL0luIHByZXZlbnQgb2YgbG9zc2luZyBwaW5nIHBhY2tldCBkdXJpbmcgc2Nhbm5pbmcKKwkvL2llZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIHRydWUpOworCS8vWUosYWRkLDA4MDgyOCxlbmQKKworCWlmICggaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7CisJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53eF9zeW5jX3NjYW5fd3EpOworCQkvKiBpbnRlbnRpb25hbGx5IGZvcmdldCB0byB1cCBzZW0gKi8KKwkJcmV0dXJuIDA7CisJfQorCitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0PTAsbGVuOworCXNob3J0IHByb3RvX3N0YXJ0ZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlwcm90b19zdGFydGVkID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsKKworCWlmICh3cnF1LT5lc3NpZC5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSl7CisJCXJldD0gLUUyQklHOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCQlyZXQ9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZihwcm90b19zdGFydGVkKQorCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKworCS8qIHRoaXMgaXMganVzdCB0byBiZSBzdXJlIHRoYXQgdGhlIEdFVCB3eCBjYWxsYmFjaworCSAqIGhhcyBjb25zaXN0ZW4gaW5mb3MuIG5vdCBuZWVkZWQgb3RoZXJ3aXNlCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmICh3cnF1LT5lc3NpZC5mbGFncyAmJiB3cnF1LT5lc3NpZC5sZW5ndGgpIHsKKy8vWUosbW9kaWZpZWQsMDgwODE5CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgIEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwkJbGVuID0gKCh3cnF1LT5lc3NpZC5sZW5ndGgtMSkgPCBJV19FU1NJRF9NQVhfU0laRSkgPyAod3JxdS0+ZXNzaWQubGVuZ3RoLTEpIDogSVdfRVNTSURfTUFYX1NJWkU7CisjZWxzZQorCQlsZW4gPSAod3JxdS0+ZXNzaWQubGVuZ3RoIDwgSVdfRVNTSURfTUFYX1NJWkUpID8gKHdycXUtPmVzc2lkLmxlbmd0aCkgOiBJV19FU1NJRF9NQVhfU0laRTsKKyNlbmRpZgorCQltZW1zZXQoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIDAsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbik7IC8vWUosYWRkLDA4MDgxOQorCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBleHRyYSwgbGVuKTsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gbGVuOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisvL1lKLG1vZGlmaWVkLDA4MDgxOSxlbmQKKworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCQlpZihsZW4gPT0gMCl7CisJCQltZW1zZXQoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCAwLCBFVEhfQUxFTik7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSA9IDA7CisJCX0KKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAsZW5kCisJfQorCWVsc2V7CisJCWllZWUtPnNzaWRfc2V0ID0gMDsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRbMF0gPSAnXDAnOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSAwOworCX0KKwkvL3ByaW50aygiPT09PT09PT09PXNldCBlc3NpZCAlcyFcbiIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChwcm90b19zdGFydGVkKQorCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworIGludCBpZWVlODAyMTFfd3hfZ2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisKKwl3cnF1LT5tb2RlID0gaWVlZS0+aXdfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworIGludCBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgKnBhcm1zID0gKGludCAqKWV4dHJhOworCWludCBlbmFibGUgPSAocGFybXNbMF0gPiAwKTsKKwlzaG9ydCBwcmV2ID0gaWVlZS0+cmF3X3R4OworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGVuYWJsZSkKKwkJaWVlZS0+cmF3X3R4ID0gMTsKKwllbHNlCisJCWllZWUtPnJhd190eCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPInJhdyBUWCBpcyAlc1xuIiwKKwkgICAgICBpZWVlLT5yYXdfdHggPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCXsKKwkJaWYocHJldiA9PSAwICYmIGllZWUtPnJhd190eCl7CisJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwkJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKwkJfQorCisJCWlmKHByZXYgJiYgaWVlZS0+cmF3X3R4ID09IDEpCisJCQluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOworCX0KKworCXVwKCZpZWVlLT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cmNweSh3cnF1LT5uYW1lLCAiODAyLjExIik7CisJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisJCXN0cmNhdCh3cnF1LT5uYW1lLCAiYiIpOworCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKwkJCXN0cmNhdCh3cnF1LT5uYW1lLCAiL2ciKTsKKwl9ZWxzZSBpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKwkJc3RyY2F0KHdycXUtPm5hbWUsICJnIik7CisKKwlpZigoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgfHwKKwkJKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcpKQorCQlzdHJjYXQod3JxdS0+bmFtZSwiIGxpbmtlZCIpOworCWVsc2UgaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX05PTElOSykKKwkJc3RyY2F0KHdycXUtPm5hbWUsIiBsaW5rLi4iKTsKKworCisJcmV0dXJuIDA7Cit9CisKKworLyogdGhpcyBpcyBtb3N0bHkgc3RvbGVuIGZyb20gaG9zdGFwICovCitpbnQgaWVlZTgwMjExX3d4X3NldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisKKwlpZigKKwkJKCFpZWVlLT5zdGFfd2FrZV91cCkgfHwKKwkJKCFpZWVlLT5wc19yZXF1ZXN0X3R4X2FjaykgfHwKKwkJKCFpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZSkgfHwKKwkJKCFpZWVlLT5wc19pc19xdWV1ZV9lbXB0eSkpeworCisJCXByaW50aygiRVJST1IuIFBTIG1vZGUgaXMgdHJ5aWVkIHRvIGJlIHVzZSBidXRcCitkcml2ZXIgbWlzc2VkIGEgY2FsbGJhY2tcblxuIik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAod3JxdS0+cG93ZXIuZGlzYWJsZWQpeworCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKworCQlnb3RvIGV4aXQ7CisJfQorCXN3aXRjaCAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7CisJY2FzZSBJV19QT1dFUl9VTklDQVNUX1I6CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX1VOSUNBU1Q7CisKKwkJYnJlYWs7CisJY2FzZSBJV19QT1dFUl9BTExfUjoKKwkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfVU5JQ0FTVCB8IElFRUU4MDIxMV9QU19NQkNBU1Q7CisJCWJyZWFrOworCisJY2FzZSBJV19QT1dFUl9PTjoKKwkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmICh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX1RJTUVPVVQpIHsKKworCQlpZWVlLT5wc190aW1lb3V0ID0gd3JxdS0+cG93ZXIudmFsdWUgLyAxMDAwOworCQlwcmludGsoIlRpbWVvdXQgJWRcbiIsaWVlZS0+cHNfdGltZW91dCk7CisJfQorCisJaWYgKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfUEVSSU9EKSB7CisKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXhpdDsKKwkJLy93cnEtPnZhbHVlIC8gMTAyNDsKKworCX0KK2V4aXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorCisvKiB0aGlzIGlzIHN0b2xlbiBmcm9tIGhvc3RhcCAqLworaW50IGllZWU4MDIxMV93eF9nZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPTA7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKXsKKwkJd3JxdS0+cG93ZXIuZGlzYWJsZWQgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCisJd3JxdS0+cG93ZXIuZGlzYWJsZWQgPSAwOworCisvLwlpZiAoKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgeworCQl3cnF1LT5wb3dlci5mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXdycXUtPnBvd2VyLnZhbHVlID0gaWVlZS0+cHNfdGltZW91dCAqIDEwMDA7CisvLwl9IGVsc2UgeworLy8JCXJldCA9IC1FT1BOT1RTVVBQOworLy8JCWdvdG8gZXhpdDsKKwkJLy93cnF1LT5wb3dlci5mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJLy93cnF1LT5wb3dlci52YWx1ZSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCAqCisJCS8vCWllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgKiAxMDI0OworLy8JfQorCisKKwlpZiAoaWVlZS0+cHMgJiBJRUVFODAyMTFfUFNfTUJDQVNUKQorCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9BTExfUjsKKwllbHNlCisJCXdycXUtPnBvd2VyLmZsYWdzIHw9IElXX1BPV0VSX1VOSUNBU1RfUjsKKworZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfZXNzaWQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2Vzc2lkKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9yYXRlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9yYXRlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF93YXApOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X3dhcCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfbW9kZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfbW9kZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfZnJlcSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZnJlcSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcmF3dHgpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X25hbWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9wb3dlcik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2EwNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTAsMCArMSw4MjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgIEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisKKy8qCisKKworODAyLjExIERhdGEgRnJhbWUKKworCis4MDIuMTEgZnJhbWVfY29udG9ybCBmb3IgZGF0YSBmcmFtZXMgLSAyIGJ5dGVzCisgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK2JpdHMgfCAwICB8ICAxICB8ICAyICB8ICAzICB8ICA0ICB8ICA1ICB8ICA2ICB8ICA3ICB8ICA4ICB8ICA5ICB8ICBhICB8ICBiICB8ICBjICB8ICBkICB8ICBlICAgfAorICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18Cit2YWwgIHwgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgeCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgMCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgIHwKKyAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAorZGVzYyB8IF4tdmVyLV4gIHwgIF50eXBlLV4gIHwgIF4tLS0tLXN1YnR5cGUtLS0tLV4gIHwgdG8gIHxmcm9tIHxtb3JlIHxyZXRyeXwgcHdyIHxtb3JlIHx3ZXAgICB8CisgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCB4PTAgZGF0YSx4PTEgZGF0YSthY2sgfCBEUyAgfCBEUyAgfGZyYWcgfCAgICAgfCBtZ20gfGRhdGEgfCAgICAgIHwKKyAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzgwMi4xMSBEYXRhIEZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICwtLS0tLS0tLS0gJ2N0cmwnIGV4cGFuZHMgdG8gPi0tLS0tLS0tLS0tJworICAgICAgICAgIHwKKyAgICAgICwtLSctLS0sLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBGcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwtLS0tLS0nCitUb3RhbDogMjggbm9uLWRhdGEgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLi0gJ0ZyYW1lIGRhdGEnIGV4cGFuZHMgdG8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAgICAgICB8CisgICAgICAgVgorICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDEgICB8ICAxICAgfCAgICAxICAgIHwgICAgMyAgICAgfCAgMiAgIHwgIDAtMjMwNCB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfAorRGVzYy4gfCBTTkFQIHwgU05BUCB8IENvbnRyb2wgfEV0aCBUdW5uZWx8IFR5cGUgfCBJUCAgICAgIHwKKyAgICAgIHwgRFNBUCB8IFNTQVAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwgUGFja2V0ICB8CisgICAgICB8IDB4QUEgfCAweEFBIHwweDAzIChVSSl8MHgwMC0wMC1GOHwgICAgICB8ICAgICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwKK1RvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLi0tLS0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAuLSAnSVAgUGFja2V0JyBleHBhbmRzLCBpZiBXRVAgZW5hYmxlZCwgdG8gPC0tJworICAgICAgIHwKKyAgICAgICBWCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICA0ICB8ICAgMC0yMjk2ICB8ICA0ICB8CisgICAgICB8LS0tLS18LS0tLS0tLS0tLS18LS0tLS18CitEZXNjLiB8IElWICB8IEVuY3J5cHRlZCB8IElDViB8CisgICAgICB8ICAgICB8IElQIFBhY2tldCB8ICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogOCBub24tZGF0YSBieXRlcworCisKKzgwMi4zIEV0aGVybmV0IERhdGEgRnJhbWUKKworICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgIDYgICB8ICAgNiAgIHwgIDIgICB8ICBWYXJpYWJsZSB8ICAgNCAgfAorICAgICAgfC0tLS0tLS18LS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBEZXN0LiB8IFNvdXJjZXwgVHlwZSB8IElQIFBhY2tldCB8ICBmY3MgfAorICAgICAgfCAgTUFDICB8ICBNQUMgIHwgICAgICB8ICAgICAgICAgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworVG90YWw6IDE4IG5vbi1kYXRhIGJ5dGVzCisKK0luIHRoZSBldmVudCB0aGF0IGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQsIHRoZSBpbmNvbWluZyBwYXlsb2FkIGlzIHNwbGl0IGludG8KK04gcGFydHMgb2Ygc2l6ZSBpZWVlLT5mdHMuICBUaGUgZmlyc3QgZnJhZ21lbnQgY29udGFpbnMgdGhlIFNOQVAgaGVhZGVyIGFuZCB0aGUKK3JlbWFpbmluZyBwYWNrZXRzIGFyZSBqdXN0IGRhdGEuCisKK0lmIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgZWFjaCBmcmFnbWVudCBwYXlsb2FkIHNpemUgaXMgcmVkdWNlZCBieSBlbm91Z2ggc3BhY2UKK3RvIGFkZCB0aGUgcHJlZml4IGFuZCBwb3N0Zml4IChJViBhbmQgSUNWIHRvdGFsbGluZyA4IGJ5dGVzIGluIHRoZSBjYXNlIG9mIFdFUCkKK1NvIGlmIHlvdSBoYXZlIDE1MDAgYnl0ZXMgb2YgcGF5bG9hZCB3aXRoIGllZWUtPmZ0cyBzZXQgdG8gNTAwIHdpdGhvdXQKK2VuY3J5cHRpb24gaXQgd2lsbCB0YWtlIDMgZnJhbWVzLiAgV2l0aCBXRVAgaXQgd2lsbCB0YWtlIDQgZnJhbWVzIGFzIHRoZQorcGF5bG9hZCBvZiBlYWNoIGZyYW1lIGlzIHJlZHVjZWQgdG8gNDkyIGJ5dGVzLgorCisqIFNLQiB2aXN1YWxpemF0aW9uCisqCisqICAsLSBza2ItPmRhdGEKKyogfAorKiB8ICAgIEVUSEVSTkVUIEhFQURFUiAgICAgICAgLC08LS0gUEFZTE9BRAorKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMTQgYnl0ZXMgZnJvbSBza2ItPmRhdGEKKyogfCAgMiBieXRlcyBmb3IgVHlwZSAtLT4gLFQuIHwgICAgIChzaXplb2YgZXRoaGRyKQorKiB8ICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorKiB8LC1EZXN0Li0tLiAsLS1TcmMuLS0tLiB8IHwgfAorKiB8ICA2IGJ5dGVzfCB8IDYgYnl0ZXMgfCB8IHwgfAorKiB2ICAgICAgICAgfCB8ICAgICAgICAgfCB8IHwgfAorKiAwICAgICAgICAgfCB2ICAgICAgIDEgfCB2IHwgdiAgICAgICAgICAgMgorKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyogICAgIF4gICAgIHwgXiAgICAgICAgIHwgXiB8CisqICAgICB8ICAgICB8IHwgICAgICAgICB8IHwgfAorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCBgVCcgPC0tLS0gMiBieXRlcyBmb3IgVHlwZQorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfAorKiAgICAgfCAgICAgfCAnLS0tU05BUC0tJyA8LS0tLS0tLS0gNiBieXRlcyBmb3IgU05BUAorKiAgICAgfCAgICAgfAorKiAgICAgYC1JVi0tJyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0gNCBieXRlcyBmb3IgSVYgKFdFUCkKKyoKKyogICAgICBTTkFQIEhFQURFUgorKgorKi8KKworc3RhdGljIHU4IFA4MDJfMUhfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHhmOCB9Oworc3RhdGljIHU4IFJGQzEwNDJfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfcHV0X3NuYXAodTggKmRhdGEsIHUxNiBoX3Byb3RvKQoreworCXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKnNuYXA7CisJdTggKm91aTsKKworCXNuYXAgPSAoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqKWRhdGE7CisJc25hcC0+ZHNhcCA9IDB4YWE7CisJc25hcC0+c3NhcCA9IDB4YWE7CisJc25hcC0+Y3RybCA9IDB4MDM7CisKKwlpZiAoaF9wcm90byA9PSAweDgxMzcgfHwgaF9wcm90byA9PSAweDgwZjMpCisJCW91aSA9IFA4MDJfMUhfT1VJOworCWVsc2UKKwkJb3VpID0gUkZDMTA0Ml9PVUk7CisJc25hcC0+b3VpWzBdID0gb3VpWzBdOworCXNuYXAtPm91aVsxXSA9IG91aVsxXTsKKwlzbmFwLT5vdWlbMl0gPSBvdWlbMl07CisKKwkqKHUxNiAqKShkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOworCisJcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworfQorCitpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJaW50IHJlczsKKworIC8qYWRkZWQgdG8gY2FyZSBhYm91dCBudWxsIGNyeXB0IGNvbmRpdGlvbiwgdG8gc29sdmUgdGhhdCBzeXN0ZW0gaGFuZ3Mgd2hlbiBzaGFyZWQga2V5cyBlcnJvciovCisgICAgICAgIGlmICghY3J5cHQgfHwgIWNyeXB0LT5vcHMpCisgICAgICAgIHJldHVybiAtMTsKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUAorCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7CisKKwlpZiAoaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgJiYKKwkgICAgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJiBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIlRLSVAiKSA9PSAwKSB7CisJCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBmcmFnLT5kYXRhOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRLSVAgY291bnRlcm1lYXN1cmVzOiBkcm9wcGVkICIKKwkJCSAgICAgICAiVFggcGFja2V0IHRvICIgTUFDX0ZNVCAiXG4iLAorCQkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgTUFDX0FSRyhoZWFkZXItPmFkZHIxKSk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCS8qIFRvIGVuY3J5cHQsIGZyYW1lIGZvcm1hdCBpczoKKwkgKiBJViAoNCBieXRlcyksIGNsZWFyIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQKSwgSUNWICg0IGJ5dGVzKSAqLworCisJLy8gUFI6IEZJWE1FOiBDb3BpZWQgZnJvbSBob3N0YXAuIENoZWNrIGZyYWdtZW50YXRpb24vTVNEVS9NUERVIGVuY3J5cHRpb24uCisJLyogSG9zdC1iYXNlZCBJRUVFIDgwMi4xMSBmcmFnbWVudGF0aW9uIGZvciBUWCBpcyBub3QgeWV0IHN1cHBvcnRlZCwgc28KKwkgKiBjYWxsIGJvdGggTVNEVSBhbmQgTVBEVSBlbmNyeXB0aW9uIGZ1bmN0aW9ucyBmcm9tIGhlcmUuICovCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gMDsKKwlpZiAoY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KQorCQlyZXMgPSBjcnlwdC0+b3BzLT5lbmNyeXB0X21zZHUoZnJhZywgaGRyX2xlbiwgY3J5cHQtPnByaXYpOworCWlmIChyZXMgPT0gMCAmJiBjcnlwdC0+b3BzLT5lbmNyeXB0X21wZHUpCisJCXJlcyA9IGNyeXB0LT5vcHMtPmVuY3J5cHRfbXBkdShmcmFnLCBoZHJfbGVuLCBjcnlwdC0+cHJpdik7CisKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5jcnlwdGlvbiBmYWlsZWQ6IGxlbj0lZC5cbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIGZyYWctPmxlbik7CisJCWllZWUtPmllZWVfc3RhdHMudHhfZGlzY2FyZHMrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIpIHsKKwlpbnQgaTsKKwlpZiAodW5saWtlbHkoIXR4YikpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKQorCQlpZiAodHhiLT5mcmFnbWVudHNbaV0pCisJCQlkZXZfa2ZyZWVfc2tiX2FueSh0eGItPmZyYWdtZW50c1tpXSk7CisJa2ZyZWUodHhiKTsKK30KKworc3RydWN0IGllZWU4MDIxMV90eGIgKmllZWU4MDIxMV9hbGxvY190eGIoaW50IG5yX2ZyYWdzLCBpbnQgdHhiX3NpemUsCisJCQkJCSAgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGI7CisJaW50IGk7CisJdHhiID0ga21hbGxvYygKKwkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdHhiKSArIChzaXplb2YodTgqKSAqIG5yX2ZyYWdzKSwKKwkJZ2ZwX21hc2spOworCWlmICghdHhiKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldCh0eGIsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3R4YikpOworCXR4Yi0+bnJfZnJhZ3MgPSBucl9mcmFnczsKKwl0eGItPmZyYWdfc2l6ZSA9IHR4Yl9zaXplOworCisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJdHhiLT5mcmFnbWVudHNbaV0gPSBkZXZfYWxsb2Nfc2tiKHR4Yl9zaXplKTsKKwkJaWYgKHVubGlrZWx5KCF0eGItPmZyYWdtZW50c1tpXSkpIHsKKwkJCWktLTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICh1bmxpa2VseShpICE9IG5yX2ZyYWdzKSkgeworCQl3aGlsZSAoaSA+PSAwKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhiLT5mcmFnbWVudHNbaS0tXSk7CisJCWtmcmVlKHR4Yik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gdHhiOworfQorCisvLyBDbGFzc2lmeSB0aGUgdG8tYmUgc2VuZCBkYXRhIHBhY2tldAorLy8gTmVlZCB0byBhY3F1aXJlIHRoZSBzZW50IHF1ZXVlIGluZGV4Lgorc3RhdGljIGludAoraWVlZTgwMjExX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKK3sKKyAgc3RydWN0IGV0aGVyX2hlYWRlciAqZWggPSAoc3RydWN0IGV0aGVyX2hlYWRlciopc2tiLT5kYXRhOworICB1bnNpZ25lZCBpbnQgd21lX1VQID0gMDsKKworICBpZighbmV0d29yay0+UW9TX0VuYWJsZSkgeworICAgICBza2ItPnByaW9yaXR5ID0gMDsKKyAgICAgcmV0dXJuKHdtZV9VUCk7CisgIH0KKworICBpZihlaC0+ZXRoZXJfdHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSEVSVFlQRV9JUCkpIHsKKyAgICBjb25zdCBzdHJ1Y3QgaXBoZHIgKmloID0gKHN0cnVjdCBpcGhkciopKHNrYi0+ZGF0YSArIFwKKwkJICAgIHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSk7CisgICAgd21lX1VQID0gKGloLT50b3MgPj4gNSkmMHgwNzsKKyAgfSBlbHNlIGlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsvL3Z0YWcgcGFja2V0CisjaWZuZGVmIFZMQU5fUFJJX1NISUZUCisjZGVmaW5lIFZMQU5fUFJJX1NISUZUICAxMyAgICAgICAgICAgICAgLyogU2hpZnQgdG8gZmluZCBWTEFOIHVzZXIgcHJpb3JpdHkgKi8KKyNkZWZpbmUgVkxBTl9QUklfTUFTSyAgIDcgICAgICAgICAgICAgICAvKiBNYXNrIGZvciB1c2VyIHByaW9yaXR5IGJpdHMgaW4gVkxBTiAqLworI2VuZGlmCisJdTMyIHRhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCXdtZV9VUCA9ICh0YWcgPj4gVkxBTl9QUklfU0hJRlQpICYgVkxBTl9QUklfTUFTSzsKKyAgfSBlbHNlIGlmKEVUSF9QX1BBRSA9PSAgbnRvaHMoKChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKS0+aF9wcm90bykpIHsKKyAgICAvL3ByaW50ayhLRVJOX1dBUk5JTkcgInR5cGUgPSBub3JtYWwgcGFja2V0XG4iKTsKKyAgICB3bWVfVVAgPSA3OworICB9CisKKyAgc2tiLT5wcmlvcml0eSA9IHdtZV9VUDsKKyAgcmV0dXJuKHdtZV9VUCk7Cit9CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisvLyBiYXNlZCBvbiBwYXJ0IG9mIGllZWU4MDIxMV94bWl0LiBNYWlubHkgYWxsb2NhdGUgdHhiLiBpZWVlLT5sb2NrIGlzIGhlbGQKK3N0cnVjdCBpZWVlODAyMTFfdHhiICppZWVlODAyMTFfZXh0X2FsbG9jX3R4YihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGVhZGVyLCBpbnQgaGRyX2xlbiwgdTggaXNRb1MsIHUxNiAqcFFPU19jdGwsIGludCBpc0VuY3J5cHQsIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQpCit7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworI2Vsc2UKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRldi0+cHJpdjsKKyNlbmRpZgorCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpmcmFnX2hkcjsKKwlpbnQgaSwgYnl0ZXNfcGVyX2ZyYWcsIG5yX2ZyYWdzLCBieXRlc19sYXN0X2ZyYWcsIGZyYWdfc2l6ZTsKKwlpbnQgZXRoZXJfdHlwZTsKKwlpbnQgYnl0ZXMsIFFPU19jdGw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnOworCisJZXRoZXJfdHlwZSA9IG50b2hzKCgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG8pOworCisJLyogQWR2YW5jZSB0aGUgU0tCIHRvIHRoZSBzdGFydCBvZiB0aGUgcGF5bG9hZCAqLworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCS8qIERldGVybWluZSB0b3RhbCBhbW91bnQgb2Ygc3RvcmFnZSByZXF1aXJlZCBmb3IgVFhCIHBhY2tldHMgKi8KKwlieXRlcyA9IHNrYi0+bGVuICsgU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisKKwkvKiBEZXRlcm1pbmUgZnJhZ21lbnRhdGlvbiBzaXplIGJhc2VkIG9uIGRlc3RpbmF0aW9uIChtdWx0aWNhc3QKKwkgKiBhbmQgYnJvYWRjYXN0IGFyZSBub3QgZnJhZ21lbnRlZCkgKi8KKwkvLyBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgfHwKKwkvLyBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIxKSB8fAorCQkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMSkpIHsKKwkJZnJhZ19zaXplID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQlRT1NfY3RsID0gUU9TX0NUTF9OT1RDT05UQUlOX0FDSzsKKwl9CisJZWxzZSB7CisJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmZnJhZ19zaXplID0gJWRcbiIsIGZyYWdfc2l6ZSk7CisJCWZyYWdfc2l6ZSA9IGllZWUtPmZ0czsvL2RlZmF1bHQ6MzkyCisJCVFPU19jdGwgPSAwOworCX0KKworCWlmKGlzUW9TKSB7CisJCVFPU19jdGwgfD0gc2tiLT5wcmlvcml0eTsgLy9zZXQgaW4gdGhlIGllZWU4MDIxMV9jbGFzc2lmeQorCQkqcFFPU19jdGwgPSBjcHVfdG9fbGUxNihRT1NfY3RsKTsKKwl9CisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJoZWFkZXIgc2l6ZSA9ICVkLCBRT1NfY3RsID0gJXhcbiIsIGhkcl9sZW4sUU9TX2N0bCk7CisJLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBwYXlsb2FkIHBlciBmcmFnbWVudC4gIFJlZ2FyZGxlc3Mgb2YgaWYKKwkgKiB0aGlzIHN0YWNrIGlzIHByb3ZpZGluZyB0aGUgZnVsbCA4MDIuMTEgaGVhZGVyLCBvbmUgd2lsbAorCSAqIGV2ZW50dWFsbHkgYmUgYWZmaXhlZCB0byB0aGlzIGZyYWdtZW50IC0tIHNvIHdlIG11c3QgYWNjb3VudCBmb3IKKwkgKiBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KKwkvL2J5dGVzX3Blcl9mcmFnID0gZnJhZ19zaXplIC0gKElFRUU4MDIxMV8zQUREUl9MRU4gKyAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLT5Rb1NfRW5hYmxlID8gMjowKSk7CisJYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSBoZHJfbGVuOworCWlmIChpZWVlLT5jb25maWcgJgorCQkJKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKKwkJYnl0ZXNfcGVyX2ZyYWcgLT0gSUVFRTgwMjExX0ZDU19MRU47CisKKwkvKiBFYWNoIGZyYWdtZW50IG1heSBuZWVkIHRvIGhhdmUgcm9vbSBmb3IgZW5jcnlwdGlvbmcgcHJlL3Bvc3RmaXggKi8KKwlpZiAoaXNFbmNyeXB0KQorCQlieXRlc19wZXJfZnJhZyAtPSBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuICsKKwkJCWNyeXB0LT5vcHMtPmV4dHJhX3Bvc3RmaXhfbGVuOworCisJLyogTnVtYmVyIG9mIGZyYWdtZW50cyBpcyB0aGUgdG90YWwgYnl0ZXNfcGVyX2ZyYWcgLworCSAqIHBheWxvYWRfcGVyX2ZyYWdtZW50ICovCisJbnJfZnJhZ3MgPSBieXRlcyAvIGJ5dGVzX3Blcl9mcmFnOworCWJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzICUgYnl0ZXNfcGVyX2ZyYWc7CisJaWYgKGJ5dGVzX2xhc3RfZnJhZykKKwkJbnJfZnJhZ3MrKzsKKwllbHNlCisJCWJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzX3Blcl9mcmFnOworCisJLyogV2hlbiB3ZSBhbGxvY2F0ZSB0aGUgVFhCIHdlIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGhlIHJlc2VydmUKKwkgKiBhbmQgZnVsbCBmcmFnbWVudCBieXRlcyAoYnl0ZXNfcGVyX2ZyYWcgZG9lc24ndCBpbmNsdWRlIHByZWZpeCwKKwkgKiBwb3N0Zml4LCBoZWFkZXIsIEZDUywgZXRjLikgKi8KKwl0eGIgPSBpZWVlODAyMTFfYWxsb2NfdHhiKG5yX2ZyYWdzLCBmcmFnX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseSghdHhiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwl0eGItPmVuY3J5cHRlZCA9IGlzRW5jcnlwdDsKKwl0eGItPnBheWxvYWRfc2l6ZSA9IGJ5dGVzOworCisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJc2tiX2ZyYWcgPSB0eGItPmZyYWdtZW50c1tpXTsKKwkJc2tiX2ZyYWctPnByaW9yaXR5ID0gVVAyQUMoc2tiLT5wcmlvcml0eSk7CisJCWlmIChpc0VuY3J5cHQpCisJCQlza2JfcmVzZXJ2ZShza2JfZnJhZywgY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbik7CisKKwkJZnJhZ19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2JfcHV0KHNrYl9mcmFnLCBoZHJfbGVuKTsKKwkJbWVtY3B5KGZyYWdfaGRyLCAodm9pZCAqKWhlYWRlciwgaGRyX2xlbik7CisKKwkJLyogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgZnJhZ21lbnQsIHRoZW4gYWRkIHRoZSBNT1JFRlJBR1MKKwkJICogYml0IHRvIHRoZSBmcmFtZSBjb250cm9sICovCisJCWlmIChpICE9IG5yX2ZyYWdzIC0gMSkgeworCQkJZnJhZ19oZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KAorCQkJCQloZWFkZXItPmZyYW1lX2N0bCB8IElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7CisJCQlieXRlcyA9IGJ5dGVzX3Blcl9mcmFnOworCisJCX0gZWxzZSB7CisJCQkvKiBUaGUgbGFzdCBmcmFnbWVudCB0YWtlcyB0aGUgcmVtYWluaW5nIGxlbmd0aCAqLworCQkJYnl0ZXMgPSBieXRlc19sYXN0X2ZyYWc7CisJCX0KKworCQlmcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdPDw0IHwgaSk7CisJCS8vZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybDw8NCB8IGkpOworCQkvLworCisJCS8qIFB1dCBhIFNOQVAgaGVhZGVyIG9uIHRoZSBmaXJzdCBmcmFnbWVudCAqLworCQlpZiAoaSA9PSAwKSB7CisJCQlpZWVlODAyMTFfcHV0X3NuYXAoCisJCQkJc2tiX3B1dChza2JfZnJhZywgU05BUF9TSVpFICsgc2l6ZW9mKHUxNikpLCBldGhlcl90eXBlKTsKKwkJCWJ5dGVzIC09IFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCQl9CisKKwkJbWVtY3B5KHNrYl9wdXQoc2tiX2ZyYWcsIGJ5dGVzKSwgc2tiLT5kYXRhLCBieXRlcyk7CisKKwkJLyogQWR2YW5jZSB0aGUgU0tCLi4uICovCisJCXNrYl9wdWxsKHNrYiwgYnl0ZXMpOworCisJCS8qIEVuY3J5cHRpb24gcm91dGluZSB3aWxsIG1vdmUgdGhlIGhlYWRlciBmb3J3YXJkIGluIG9yZGVyCisJCSAqIHRvIGluc2VydCB0aGUgSVYgYmV0d2VlbiB0aGUgaGVhZGVyIGFuZCB0aGUgcGF5bG9hZCAqLworCQlpZiAoaXNFbmNyeXB0KQorCQkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiX2ZyYWcsIGhkcl9sZW4pOworCQlpZiAoaWVlZS0+Y29uZmlnICYKKwkJCQkoQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyB8IENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MpKQorCQkJc2tiX3B1dChza2JfZnJhZywgNCk7CisJfQorCS8vIEFkdmFuY2Ugc2VxdWVuY2UgbnVtYmVyIGluIGRhdGEgZnJhbWUuCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJRb1MgRW5hbGJlZD8gJXNcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlPyJZIjoiTiIpOworCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCWVsc2UKKwkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKwkvLyBzdGFubGV5LCBqdXN0IGZvciBkZWJ1ZworLyoKK3sKKwlpbnQgaj0wOworCWZvcihqPTA7ajxucl9mcmFncztqKyspCisJeworCQkJaW50IGk7CisJCXN0cnVjdCBza19idWZmICpza2IgPSB0eGItPmZyYWdtZW50c1tqXTsKKwkJCXByaW50aygic2VuZCglZCk6ICIsIGopOworCQkJZm9yIChpPTA7aTxza2ItPmxlbjtpKyspCisJCQkJcHJpbnRrKCIlMDJYICIsIHNrYi0+ZGF0YVtpXSYweGZmKTsKKwkJCXByaW50aygiXG4iKTsKKwl9Cit9CisqLworCisJcmV0dXJuIHR4YjsKK30KKworCisvLyBiYXNlZCBvbiBwYXJ0IG9mIGllZWU4MDIxMV94bWl0LiBNYWlubHkgYWxsb2NhdGUgdHhiLiBpZWVlLT5sb2NrIGlzIGhlbGQKKy8vIEFzc3VtZSBubyBlbmNyeXB0aW9uLCBubyBGQ1MgY29tcHV0aW5nCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqaWVlZTgwMjExX2V4dF9yZXVzZV90eGIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhlYWRlciwgaW50IGhkcl9sZW4sIHU4IGlzUW9TLCB1MTYgKnBRT1NfY3RsLCBpbnQgaXNFbmNyeXB0LCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0KQoreworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNlbHNlCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilkZXYtPnByaXY7CisjZW5kaWYKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqZnJhZ19oZHI7CisJaW50IGV0aGVyX3R5cGU7CisJaW50IGJ5dGVzLCBRT1NfY3RsOworCisJZXRoZXJfdHlwZSA9IG50b2hzKCgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG8pOworCisJLyogQWR2YW5jZSB0aGUgU0tCIHRvIHRoZSBzdGFydCBvZiB0aGUgcGF5bG9hZCAqLworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCS8qIERldGVybWluZSB0b3RhbCBhbW91bnQgb2Ygc3RvcmFnZSByZXF1aXJlZCBmb3IgVFhCIHBhY2tldHMgKi8KKwlieXRlcyA9IHNrYi0+bGVuICsgU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMSkgfHwKKwkJCWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpKSB7CisJCVFPU19jdGwgPSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLOworCX0KKwllbHNlIHsKKwkJUU9TX2N0bCA9IDA7CisJfQorCisJaWYoaXNRb1MpIHsKKwkJUU9TX2N0bCB8PSBza2ItPnByaW9yaXR5OyAvL3NldCBpbiB0aGUgaWVlZTgwMjExX2NsYXNzaWZ5CisJCSpwUU9TX2N0bCA9IGNwdV90b19sZTE2KFFPU19jdGwpOworCX0KKworCXR4YiA9IGttYWxsb2MoIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3R4YikgKyBzaXplb2YodTgqKSwgR0ZQX0FUT01JQyApOworCWlmICh1bmxpa2VseSghdHhiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXR4Yi0+bnJfZnJhZ3MgPSAxOworCXR4Yi0+ZnJhZ19zaXplID0gYnl0ZXM7CisJdHhiLT5lbmNyeXB0ZWQgPSBpc0VuY3J5cHQ7CisJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKKworCXR4Yi0+ZnJhZ21lbnRzWzBdID0gc2tiOworCWllZWU4MDIxMV9wdXRfc25hcCgKKwkJCXNrYl9wdXNoKHNrYiwgU05BUF9TSVpFICsgc2l6ZW9mKHUxNikpLCBldGhlcl90eXBlKTsKKwlmcmFnX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXNrYl9wdXNoKHNrYiwgaGRyX2xlbik7CisJbWVtY3B5KGZyYWdfaGRyLCAodm9pZCAqKWhlYWRlciwgaGRyX2xlbik7CisJZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCB8IDApOworCXNrYi0+cHJpb3JpdHkgPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKKworCS8vIEFkdmFuY2Ugc2VxdWVuY2UgbnVtYmVyIGluIGRhdGEgZnJhbWUuCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJRb1MgRW5hbGJlZD8gJXNcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlPyJZIjoiTiIpOworCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCWVsc2UKKwkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCXJldHVybiB0eGI7Cit9CisKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKKy8qIFNLQnMgYXJlIGFkZGVkIHRvIHRoZSBpZWVlLT50eF9xdWV1ZS4gKi8KK2ludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKmZyYWdfaGRyOworCWludCBpLCBieXRlc19wZXJfZnJhZywgbnJfZnJhZ3MsIGJ5dGVzX2xhc3RfZnJhZywgZnJhZ19zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmllZWUtPnN0YXRzOworCWludCBldGhlcl90eXBlLCBlbmNyeXB0OworCWludCBieXRlcywgZmMsIFFPU19jdGwsIGhkcl9sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnOworCS8vc3RydWN0IGllZWU4MDIxMV9oZHIgaGVhZGVyID0geyAvKiBFbnN1cmUgemVybyBpbml0aWFsaXplZCAqLworCS8vCS5kdXJhdGlvbl9pZCA9IDAsCisJLy8JLnNlcV9jdGwgPSAwCisJLy99OworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyBoZWFkZXIgPSB7IC8qIEVuc3VyZSB6ZXJvIGluaXRpYWxpemVkICovCisJCS5kdXJhdGlvbl9pZCA9IDAsCisJCS5zZXFfY3RsID0gMCwKKwkJLlFPU19jdGwgPSAwCisJfTsKKwl1OCBkZXN0W0VUSF9BTEVOXSwgc3JjW0VUSF9BTEVOXTsKKworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisKKwkvL3ByaW50ayhLRVJOX1dBUk5JTkcgInVwcGVyIGxheWVyIHBhY2tldCFcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBkcml2ZXIgaGFuZGxlciB0byB0YWtlIHRoZSBUWEIsIGRvbnQnIGJvdGhlcgorCSAqIGNyZWF0aW5nIGl0Li4uICovCisJaWYgKCghaWVlZS0+aGFyZF9zdGFydF94bWl0ICYmICEoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpfHwKKwkgICAoKCFpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0ICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKSkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyB4bWl0IGhhbmRsZXIuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJZ290byBzdWNjZXNzOworCX0KKworCWllZWU4MDIxMV9jbGFzc2lmeShza2IsJmllZWUtPmN1cnJlbnRfbmV0d29yayk7CisJaWYobGlrZWx5KGllZWUtPnJhd190eCA9PSAwKSl7CisKKwkJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgU05BUF9TSVpFICsgc2l6ZW9mKHUxNikpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJZ290byBzdWNjZXNzOworCQl9CisKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwkJLy8gbm90ZSwgc2tiLT5wcmlvcml0eSB3aGljaCB3YXMgc2V0IGJ5IGllZWU4MDIxMV9jbGFzc2lmeSwgYW5kIHVzZWQgYnkgcGh5c2ljYWwgdHgKKwkJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIChpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3htaXQpKQorCQl7CisJCQl0eGIgPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3htaXQoc2tiLCBkZXYpOworCQkJZ290byBzdWNjZXNzOworCQl9CisjZW5kaWYKKworCQlldGhlcl90eXBlID0gbnRvaHMoKChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKS0+aF9wcm90byk7CisKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCisJCWVuY3J5cHQgPSAhKGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFICYmIGllZWUtPmllZWU4MDJfMXgpICYmCisJCQlpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wczsKKworCQlpZiAoIWVuY3J5cHQgJiYgaWVlZS0+aWVlZTgwMl8xeCAmJgorCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkICYmIGV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSB7CisJCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQkJZ290byBzdWNjZXNzOworCQl9CisKKwkjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQlpZiAoY3J5cHQgJiYgIWVuY3J5cHQgJiYgZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUpIHsKKwkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKworCQkJCXNpemVvZihzdHJ1Y3QgZXRoaGRyKSAtIFNOQVBfU0laRSAtIHNpemVvZih1MTYpKTsKKwkJCUlFRUU4MDIxMV9ERUJVR19FQVAoIlRYOiBJRUVFIDgwMi4xMSBFQVBPTCBmcmFtZTogJXNcbiIsCisJCQkJZWFwX2dldF90eXBlKGVhcC0+dHlwZSkpOworCQl9CisJI2VuZGlmCisKKwkJLyogU2F2ZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyAqLworCQltZW1jcHkoJmRlc3QsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQltZW1jcHkoJnNyYywgc2tiLT5kYXRhK0VUSF9BTEVOLCBFVEhfQUxFTik7CisKKwkJLyogQWR2YW5jZSB0aGUgU0tCIHRvIHRoZSBzdGFydCBvZiB0aGUgcGF5bG9hZCAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkJLyogRGV0ZXJtaW5lIHRvdGFsIGFtb3VudCBvZiBzdG9yYWdlIHJlcXVpcmVkIGZvciBUWEIgcGFja2V0cyAqLworCQlieXRlcyA9IHNrYi0+bGVuICsgU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisKKwkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpIHsKKwkJCWlmIChlbmNyeXB0KQorCQkJCWZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEgfAorCQkJCQlJRUVFODAyMTFfRkNUTF9XRVA7CisJCQllbHNlCisJCQkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQTsKKworCQl9IGVsc2UgeworCQkJaWYgKGVuY3J5cHQpCisJCQkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9EQVRBIHwKKwkJCQkJSUVFRTgwMjExX0ZDVExfV0VQOworCQkJZWxzZQorCQkJCWZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfREFUQTsKKwkJfQorCisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJCWZjIHw9IElFRUU4MDIxMV9GQ1RMX1RPRFM7CisJCQkvKiBUbyBEUzogQWRkcjEgPSBCU1NJRCwgQWRkcjIgPSBTQSwKKwkJCUFkZHIzID0gREEgKi8KKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCAmc3JjLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMywgJmRlc3QsIEVUSF9BTEVOKTsKKwkJfSBlbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJCS8qIG5vdCBGcm9tL1RvIERTOiBBZGRyMSA9IERBLCBBZGRyMiA9IFNBLAorCQkJQWRkcjMgPSBCU1NJRCAqLworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCBzcmMsIEVUSF9BTEVOKTsKKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwkJfQorCS8vCXByaW50ayhLRVJOX1dBUk5JTkcgImVzc2lkIE1BQyBhZGRyZXNzIGlzICJNQUNfRk1ULCBNQUNfQVJHKCZoZWFkZXIuYWRkcjEpKTsKKwkJaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KGZjKTsKKwkJLy9oZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTjsKKworCQkvKiBEZXRlcm1pbmUgZnJhZ21lbnRhdGlvbiBzaXplIGJhc2VkIG9uIGRlc3RpbmF0aW9uIChtdWx0aWNhc3QKKwkJKiBhbmQgYnJvYWRjYXN0IGFyZSBub3QgZnJhZ21lbnRlZCkgKi8KKy8vCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgfHwKKy8vCQlpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLmFkZHIxKSB8fAorCQlpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpKSB7CisJCQlmcmFnX3NpemUgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJCQlRT1NfY3RsID0gUU9TX0NUTF9OT1RDT05UQUlOX0FDSzsKKwkJfQorCQllbHNlIHsKKwkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmZnJhZ19zaXplID0gJWRcbiIsIGZyYWdfc2l6ZSk7CisJCQlmcmFnX3NpemUgPSBpZWVlLT5mdHM7Ly9kZWZhdWx0OjM5MgorCQkJUU9TX2N0bCA9IDA7CisJCX0KKworCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpCXsKKwkJCWhkcl9sZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOICsgMjsKKwkJCVFPU19jdGwgfD0gc2tiLT5wcmlvcml0eTsgLy9zZXQgaW4gdGhlIGllZWU4MDIxMV9jbGFzc2lmeQorCQkJaGVhZGVyLlFPU19jdGwgPSBjcHVfdG9fbGUxNihRT1NfY3RsKTsKKwkJfSBlbHNlIHsKKwkJCWhkcl9sZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOworCQl9CisJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiaGVhZGVyIHNpemUgPSAlZCwgUU9TX2N0bCA9ICV4XG4iLCBoZHJfbGVuLFFPU19jdGwpOworCQkvKiBEZXRlcm1pbmUgYW1vdW50IG9mIHBheWxvYWQgcGVyIGZyYWdtZW50LiAgUmVnYXJkbGVzcyBvZiBpZgorCQkqIHRoaXMgc3RhY2sgaXMgcHJvdmlkaW5nIHRoZSBmdWxsIDgwMi4xMSBoZWFkZXIsIG9uZSB3aWxsCisJCSogZXZlbnR1YWxseSBiZSBhZmZpeGVkIHRvIHRoaXMgZnJhZ21lbnQgLS0gc28gd2UgbXVzdCBhY2NvdW50IGZvcgorCQkqIGl0IHdoZW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvZiBwYXlsb2FkIHNwYWNlLiAqLworCQkvL2J5dGVzX3Blcl9mcmFnID0gZnJhZ19zaXplIC0gKElFRUU4MDIxMV8zQUREUl9MRU4gKyAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLT5Rb1NfRW5hYmxlID8gMjowKSk7CisJCWJ5dGVzX3Blcl9mcmFnID0gZnJhZ19zaXplIC0gaGRyX2xlbjsKKwkJaWYgKGllZWUtPmNvbmZpZyAmCisJCShDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCQlieXRlc19wZXJfZnJhZyAtPSBJRUVFODAyMTFfRkNTX0xFTjsKKworCQkvKiBFYWNoIGZyYWdtZW50IG1heSBuZWVkIHRvIGhhdmUgcm9vbSBmb3IgZW5jcnlwdGlvbmcgcHJlL3Bvc3RmaXggKi8KKwkJaWYgKGVuY3J5cHQpCisJCQlieXRlc19wZXJfZnJhZyAtPSBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuICsKKwkJCQljcnlwdC0+b3BzLT5leHRyYV9wb3N0Zml4X2xlbjsKKworCQkvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIGlzIHRoZSB0b3RhbCBieXRlc19wZXJfZnJhZyAvCisJCSogcGF5bG9hZF9wZXJfZnJhZ21lbnQgKi8KKwkJbnJfZnJhZ3MgPSBieXRlcyAvIGJ5dGVzX3Blcl9mcmFnOworCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlcyAlIGJ5dGVzX3Blcl9mcmFnOworCQlpZiAoYnl0ZXNfbGFzdF9mcmFnKQorCQkJbnJfZnJhZ3MrKzsKKwkJZWxzZQorCQkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkJLyogV2hlbiB3ZSBhbGxvY2F0ZSB0aGUgVFhCIHdlIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGhlIHJlc2VydmUKKwkJKiBhbmQgZnVsbCBmcmFnbWVudCBieXRlcyAoYnl0ZXNfcGVyX2ZyYWcgZG9lc24ndCBpbmNsdWRlIHByZWZpeCwKKwkJKiBwb3N0Zml4LCBoZWFkZXIsIEZDUywgZXRjLikgKi8KKwkJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4Yihucl9mcmFncywgZnJhZ19zaXplLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHVubGlrZWx5KCF0eGIpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQl0eGItPmVuY3J5cHRlZCA9IGVuY3J5cHQ7CisJCXR4Yi0+cGF5bG9hZF9zaXplID0gYnl0ZXM7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJCXNrYl9mcmFnID0gdHhiLT5mcmFnbWVudHNbaV07CisJCQlza2JfZnJhZy0+cHJpb3JpdHkgPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKKwkJCWlmIChlbmNyeXB0KQorCQkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLCBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuKTsKKworCQkJZnJhZ19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICopc2tiX3B1dChza2JfZnJhZywgaGRyX2xlbik7CisJCQltZW1jcHkoZnJhZ19oZHIsICZoZWFkZXIsIGhkcl9sZW4pOworCisJCQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBmcmFnbWVudCwgdGhlbiBhZGQgdGhlIE1PUkVGUkFHUworCQkJKiBiaXQgdG8gdGhlIGZyYW1lIGNvbnRyb2wgKi8KKwkJCWlmIChpICE9IG5yX2ZyYWdzIC0gMSkgeworCQkJCWZyYWdfaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNigKKwkJCQkJZmMgfCBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpOworCQkJCWJ5dGVzID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhlIGxhc3QgZnJhZ21lbnQgdGFrZXMgdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KKwkJCQlieXRlcyA9IGJ5dGVzX2xhc3RfZnJhZzsKKwkJCX0KKwkJCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKSB7CisJCQkgIC8vIGFkZCAxIG9ubHkgaW5kaWNhdGUgdG8gY29ycmVzcG9uZGluZyBzZXEgbnVtYmVyIGNvbnRyb2wgMjAwNi83LzEyCisJCQkgIGZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkrMV08PDQgfCBpKTsKKwkJCSAgLy9wcmludGsoS0VSTl9XQVJOSU5HICJza2ItPnByaW9yaXR5ID0gJWQsIiwgc2tiLT5wcmlvcml0eSk7CisJCQkgIC8vcHJpbnRrKEtFUk5fV0FSTklORyAidHlwZTolZDogc2VxID0gJWRcbiIsVVAyQUMoc2tiLT5wcmlvcml0eSksaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkrMV0pOworCQkJfSBlbHNlIHsKKwkJCSAgZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCB8IGkpOworCQkJfQorCQkJLy9mcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsPDw0IHwgaSk7CisJCQkvLworCisJCQkvKiBQdXQgYSBTTkFQIGhlYWRlciBvbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KKwkJCWlmIChpID09IDApIHsKKwkJCQlpZWVlODAyMTFfcHV0X3NuYXAoCisJCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwKKwkJCQkJZXRoZXJfdHlwZSk7CisJCQkJYnl0ZXMgLT0gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisJCQl9CisKKwkJCW1lbWNweShza2JfcHV0KHNrYl9mcmFnLCBieXRlcyksIHNrYi0+ZGF0YSwgYnl0ZXMpOworCisJCQkvKiBBZHZhbmNlIHRoZSBTS0IuLi4gKi8KKwkJCXNrYl9wdWxsKHNrYiwgYnl0ZXMpOworCisJCQkvKiBFbmNyeXB0aW9uIHJvdXRpbmUgd2lsbCBtb3ZlIHRoZSBoZWFkZXIgZm9yd2FyZCBpbiBvcmRlcgorCQkJKiB0byBpbnNlcnQgdGhlIElWIGJldHdlZW4gdGhlIGhlYWRlciBhbmQgdGhlIHBheWxvYWQgKi8KKwkJCWlmIChlbmNyeXB0KQorCQkJCWllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYl9mcmFnLCBoZHJfbGVuKTsKKwkJCWlmIChpZWVlLT5jb25maWcgJgorCQkJKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKKwkJCQlza2JfcHV0KHNrYl9mcmFnLCA0KTsKKwkJfQorCQkvLyBBZHZhbmNlIHNlcXVlbmNlIG51bWJlciBpbiBkYXRhIGZyYW1lLgorCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlFvUyBFbmFsYmVkPyAlc1xuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGU/IlkiOiJOIik7CisJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkgeworCQkgIGlmIChpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSArIDFdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkgKyAxXSA9IDA7CisJCSAgZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkgKyAxXSsrOworCQl9IGVsc2UgeworICAJCSAgaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkgIGVsc2UKKwkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisJCX0KKwkJLy8tLS0KKwl9ZWxzZXsKKwkJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBza2IgdG9vIHNtYWxsICglZCkuXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKworCQl0eGIgPSBpZWVlODAyMTFfYWxsb2NfdHhiKDEsIHNrYi0+bGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYoIXR4Yil7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCXR4Yi0+ZW5jcnlwdGVkID0gMDsKKwkJdHhiLT5wYXlsb2FkX3NpemUgPSBza2ItPmxlbjsKKwkJbWVtY3B5KHNrYl9wdXQodHhiLT5mcmFnbWVudHNbMF0sc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl9CisKKyBzdWNjZXNzOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJLy8gU29tZXRpbWVzLCBleHRlbnNpb24gbW9kZSBjYW4gcmV1c2Ugc2tiIChieSB0eGItPmZyYWdtZW50c1swXSkKKwlpZiggISAoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIHR4YiAmJiAodHhiLT5mcmFnbWVudHNbMF0gPT0gc2tiKSkgKQorI2VuZGlmCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWYgKHR4YikgeworCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSl7CisJCQlpZWVlODAyMTFfc29mdG1hY194bWl0KHR4YiwgaWVlZSk7CisJCX1lbHNleworCQkJaWYgKCgqaWVlZS0+aGFyZF9zdGFydF94bWl0KSh0eGIsIGRldikgPT0gMCkgeworCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnR4X2J5dGVzICs9IHR4Yi0+cGF5bG9hZF9zaXplOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWVlZTgwMjExX3R4Yl9mcmVlKHR4Yik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworIGZhaWxlZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlyZXR1cm4gMTsKKworfQorCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdHhiX2ZyZWUpOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2FsbG9jX3R4Yik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfYWxsb2NfdHhiKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9yZXVzZV90eGIpOworI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q5ZjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKQEAgLTAsMCArMSw4ODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBDb3B5cmlnaHQoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGJhc2VkIG9uIHRoZSBXRVAgZW5hYmxlbWVudCBjb2RlIHByb3ZpZGVkIGJ5IHRoZQorICBIb3N0IEFQIHByb2plY3QgaG9zdGFwLWRyaXZlcnMgdjAuMS4zCisgIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICA8amttYWxpbmVAY2MuaHV0LmZpPgorICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKK3N0YXRpYyBjb25zdCBjaGFyICppZWVlODAyMTFfbW9kZXNbXSA9IHsKKwkiPyIsICJhIiwgImIiLCAiYWIiLCAiZyIsICJhZyIsICJiZyIsICJhYmciCit9OworCisjaWZkZWYgRkVET1JBQ09SRV85CisjZGVmaW5lIElOX0ZFRE9SQUNPUkVfOSAxCisjZWxzZQorI2RlZmluZSBJTl9GRURPUkFDT1JFXzkgMAorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0NVU1RPTV9MRU4gNjQKK3N0YXRpYyBpbmxpbmUgY2hhciAqcnRsODE4eF90cmFuc2xhdGVfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RhcnQsIGNoYXIgKnN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8pCit7CisJY2hhciBjdXN0b21bTUFYX0NVU1RPTV9MRU5dOworCWNoYXIgKnA7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKwlpbnQgaSwgajsKKwl1OCBtYXhfcmF0ZSwgcmF0ZTsKKworCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0FQOworCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIG5ldHdvcmstPmJzc2lkLCBFVEhfQUxFTik7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyNlbHNlCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworI2VuZGlmCisKKwkvKiBSZW1haW5pbmcgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgcHJvdmlkZSB0aGVtICovCisKKwkvKiBBZGQgdGhlIEVTU0lEICovCisJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwkvL1lKLG1vZGlmaWVkLDA4MDkwMyxmb3IgaGlkZGVuIGFwCisJLy9pZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSB7CisJaWYgKG5ldHdvcmstPnNzaWRfbGVuID09IDApIHsKKwkvL1lKLG1vZGlmaWVkLDA4MDkwMyxlbmQKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBzaXplb2YoIjxoaWRkZW4+Iik7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsICI8aGlkZGVuPiIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBtaW4obmV0d29yay0+c3NpZF9sZW4sICh1OCkzMik7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOworI2VuZGlmCisJfQorCS8vcHJpbnRrKCJFU1NJRDogJXNcbiIsbmV0d29yay0+c3NpZCk7CisJLyogQWRkIHRoZSBwcm90b2NvbCBuYW1lICovCisJaXdlLmNtZCA9IFNJT0NHSVdOQU1FOworCXNucHJpbnRmKGl3ZS51Lm5hbWUsIElGTkFNU0laLCAiSUVFRSA4MDIuMTElcyIsIGllZWU4MDIxMV9tb2Rlc1tuZXR3b3JrLT5tb2RlXSk7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0NIQVJfTEVOKTsKKyNlbHNlCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQ0hBUl9MRU4pOworI2VuZGlmCisKKyAgICAgICAgLyogQWRkIG1vZGUgKi8KKyAgICAgICAgaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworICAgICAgICBpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmCisJICAgIChXTEFOX0NBUEFCSUxJVFlfQlNTIHwgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSB7CisJCWlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJZWxzZQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKyNlbmRpZgorCX0KKworICAgICAgICAvKiBBZGQgZnJlcXVlbmN5L2NoYW5uZWwgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisvKglpd2UudS5mcmVxLm0gPSBpZWVlODAyMTFfZnJlcXVlbmN5KG5ldHdvcmstPmNoYW5uZWwsIG5ldHdvcmstPm1vZGUpOworCWl3ZS51LmZyZXEuZSA9IDM7ICovCisJaXdlLnUuZnJlcS5tID0gbmV0d29yay0+Y2hhbm5lbDsKKwlpd2UudS5mcmVxLmUgPSAwOworCWl3ZS51LmZyZXEuaSA9IDA7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyNlbHNlCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworI2VuZGlmCisKKwkvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCWVsc2UKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOworI2Vsc2UKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKyNlbmRpZgorCisJLyogQWRkIGJhc2ljIGFuZCBleHRlbmRlZCByYXRlcyAqLworCW1heF9yYXRlID0gMDsKKwlwID0gY3VzdG9tOworCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksICIgUmF0ZXMgKE1iL3MpOiAiKTsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2xlbjsgKSB7CisJCWlmIChqIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuICYmCisJCSAgICAoKG5ldHdvcmstPnJhdGVzX2V4W2pdICYgMHg3RikgPAorCQkgICAgIChuZXR3b3JrLT5yYXRlc1tpXSAmIDB4N0YpKSkKKwkJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc19leFtqKytdICYgMHg3RjsKKwkJZWxzZQorCQkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzW2krK10gJiAweDdGOworCQlpZiAocmF0ZSA+IG1heF9yYXRlKQorCQkJbWF4X3JhdGUgPSByYXRlOworCQlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLAorCQkJICAgICAgIiVkJXMgIiwgcmF0ZSA+PiAxLCAocmF0ZSAmIDEpID8gIi41IiA6ICIiKTsKKwl9CisJZm9yICg7IGogPCBuZXR3b3JrLT5yYXRlc19leF9sZW47IGorKykgeworCQlyYXRlID0gbmV0d29yay0+cmF0ZXNfZXhbal0gJiAweDdGOworCQlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLAorCQkJICAgICAgIiVkJXMgIiwgcmF0ZSA+PiAxLCAocmF0ZSAmIDEpID8gIi41IiA6ICIiKTsKKwkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKKwkJCW1heF9yYXRlID0gcmF0ZTsKKwl9CisKKwlpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisJaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCWl3ZS51LmJpdHJhdGUudmFsdWUgPSBtYXhfcmF0ZSAqIDUwMDAwMDsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKKyNlbHNlCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKKyNlbmRpZgorCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2VuZGlmCisKKwkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJLyogVE9ETzogRml4IHRoZXNlIHZhbHVlcy4uLiAqLworCWlmIChuZXR3b3JrLT5zdGF0cy5zaWduYWwgPT0gMCB8fCBuZXR3b3JrLT5zdGF0cy5yc3NpID09IDApCisJcHJpbnRrKCI9PT09PT09PT5zaWduYWw6JWQsIHJzc2k6JWRcbiIsIG5ldHdvcmstPnN0YXRzLnNpZ25hbCwgbmV0d29yay0+c3RhdHMucnNzaSk7CisJaXdlLmNtZCA9IElXRVZRVUFMOworLy8JcHJpbnRrKCJTSUdOQUw6ICVkLFJTU0k6ICVkLE5PSVNFOiAlZFxuIixuZXR3b3JrLT5zdGF0cy5zaWduYWwsbmV0d29yay0+c3RhdHMucnNzaSxuZXR3b3JrLT5zdGF0cy5ub2lzZSk7CisJaXdlLnUucXVhbC5xdWFsID0gbmV0d29yay0+c3RhdHMuc2lnbmFsc3RyZW5ndGg7CisJaXdlLnUucXVhbC5sZXZlbCA9IG5ldHdvcmstPnN0YXRzLnNpZ25hbDsKKwlpd2UudS5xdWFsLm5vaXNlID0gbmV0d29yay0+c3RhdHMubm9pc2U7CisJaXdlLnUucXVhbC51cGRhdGVkID0gbmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19XRU1BU0s7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJKSkKKwkJaXdlLnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTEVWRUxfSU5WQUxJRDsKKwlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX05PSVNFKSkKKwkJaXdlLnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKKwlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX1NJR05BTCkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX1FVQUxfSU5WQUxJRDsKKwlpd2UudS5xdWFsLnVwZGF0ZWQgPSA3OworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKyNlbmRpZgorCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJcCA9IGN1c3RvbTsKKworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbmRpZgorCisjaWYgMAorCWlmIChpZWVlLT53cGFfZW5hYmxlZCAmJiBuZXR3b3JrLT53cGFfaWVfbGVuKXsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU4gKiAyICsgMzBdOworCS8vCXByaW50aygiV1BBIElFXG4iKTsKKwkJdTggKnAgPSBidWY7CisJCXAgKz0gc3ByaW50ZihwLCAid3BhX2llPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+d3BhX2llX2xlbjsgaSsrKSB7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBuZXR3b3JrLT53cGFfaWVbaV0pOworCQl9CisKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKyNlbmRpZgorCX0KKworCWlmIChpZWVlLT53cGFfZW5hYmxlZCAmJiBuZXR3b3JrLT5yc25faWVfbGVuKXsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU4gKiAyICsgMzBdOworCisJCXU4ICpwID0gYnVmOworCQlwICs9IHNwcmludGYocCwgInJzbl9pZT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJzbl9pZV9sZW47IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgbmV0d29yay0+cnNuX2llW2ldKTsKKwkJfQorCisKKyNlbHNlCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgICAgIGlmIChuZXR3b3JrLT53cGFfaWVfbGVuKSB7CisJLy8JcHJpbnRrKCJ3cGFfaWVfbGVuOiVkXG4iLCBuZXR3b3JrLT53cGFfaWVfbGVuKTsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTl07CisgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgbmV0d29yay0+d3BhX2llLCBuZXR3b3JrLT53cGFfaWVfbGVuKTsKKyAgICAgICAgICAgICAgICBpd2UuY21kID0gSVdFVkdFTklFOworICAgICAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gbmV0d29yay0+d3BhX2llX2xlbjsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisgICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAgICAgaWYgKG5ldHdvcmstPnJzbl9pZV9sZW4pIHsKKwkvLwlwcmludGsoIj09PT09PnJzbl9pZV9sZW46XG4iLCBuZXR3b3JrLT5yc25faWVfbGVuKTsKKwkJI2lmIDAKKwkJeworCQkJaW50IGk7CisJCQlmb3IgKGk9MDsgaTxuZXR3b3JrLT5yc25faWVfbGVuOyBpKyspOworCQkJcHJpbnRrKCIlMnggIiwgbmV0d29yay0+cnNuX2llW2ldKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCQkjZW5kaWYKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTl07CisgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgbmV0d29yay0+cnNuX2llLCBuZXR3b3JrLT5yc25faWVfbGVuKTsKKyAgICAgICAgICAgICAgICBpd2UuY21kID0gSVdFVkdFTklFOworICAgICAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gbmV0d29yay0+cnNuX2llX2xlbjsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworI2VuZGlmCisJfQorCisjZW5kaWYKKworCS8qIEFkZCBFWFRSQTogQWdlIHRvIGRpc3BsYXkgc2Vjb25kcyBzaW5jZSBsYXN0IGJlYWNvbi9wcm9iZSByZXNwb25zZQorCSAqIGZvciBnaXZlbiBuZXR3b3JrLiAqLworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCXAgPSBjdXN0b207CisJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJICAgICAgIiBMYXN0IGJlYWNvbjogJWx1bXMgYWdvIiwgKGppZmZpZXMgLSBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpIC8gKEhaIC8gMTAwKSk7CisJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2VuZGlmCisKKwlyZXR1cm4gc3RhcnQ7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwOworCWNoYXIgKmV2ID0gZXh0cmE7CisJY2hhciAqc3RvcCA9IGV2ICsgd3JxdS0+ZGF0YS5sZW5ndGg7Ly9JV19TQ0FOX01BWF9EQVRBOworCS8vY2hhciAqc3RvcCA9IGV2ICsgSVdfU0NBTl9NQVhfREFUQTsKKwlpbnQgaSA9IDA7CisKKwlJRUVFODAyMTFfREVCVUdfV1goIkdldHRpbmcgc2NhblxuIik7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoIWllZWUtPmJId1JhZGlvT2ZmKQorCXsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXR3b3JrLCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCQlpKys7CisKKwkJCWlmKChzdG9wLWV2KTwyMDApCisJCQl7CisJCQkJZXJyID0gLUUyQklHOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwKKwkJCSAgICB0aW1lX2FmdGVyKG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKKwkJCXsKKwkJCQlldiA9IHJ0bDgxOHhfdHJhbnNsYXRlX3NjYW4oaWVlZSwgZXYsIHN0b3AsIG5ldHdvcmssIGluZm8pOworCQkJfQorCQkJZWxzZQorCQkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKAorCQkJCQkiTm90IHNob3dpbmcgbmV0d29yayAnJXMgKCIKKwkJCQkJTUFDX0ZNVCAiKScgZHVlIHRvIGFnZSAoJWx1bXMpLlxuIiwKKwkJCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsCisJCQkJCQkgICAgIG5ldHdvcmstPnNzaWRfbGVuKSwKKwkJCQkJTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCksCisJCQkJCShqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9zY2FubmVkKSAvIChIWiAvIDEwMCkpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGV2IC0gIGV4dHJhOworCXdycXUtPmRhdGEuZmxhZ3MgPSAwOworCUlFRUU4MDIxMV9ERUJVR19XWCgiZXhpdDogJWQgbmV0d29ya3MgcmV0dXJuZWQuXG4iLCBpKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisJCS5mbGFncyA9IDAKKwl9OworCWludCBpLCBrZXksIGtleV9wcm92aWRlZCwgbGVuOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJTRVRfRU5DT0RFXG4iKTsKKworCWtleSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGtleSkgeworCQlpZiAoa2V5ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2V5LS07CisJCWtleV9wcm92aWRlZCA9IDE7CisJfSBlbHNlIHsKKwkJa2V5X3Byb3ZpZGVkID0gMDsKKwkJa2V5ID0gaWVlZS0+dHhfa2V5aWR4OworCX0KKworCUlFRUU4MDIxMV9ERUJVR19XWCgiS2V5OiAlZCBbJXNdXG4iLCBrZXksIGtleV9wcm92aWRlZCA/CisJCQkgICAicHJvdmlkZWQiIDogImRlZmF1bHQiKTsKKworCWNyeXB0ID0gJmllZWUtPmNyeXB0W2tleV07CisKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlpZiAoa2V5X3Byb3ZpZGVkICYmICpjcnlwdCkgeworCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbiBvbiBrZXkgJWQuXG4iLAorCQkJCQkgICBrZXkpOworCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwkJfSBlbHNlCisJCQlJRUVFODAyMTFfREVCVUdfV1goIkRpc2FibGluZyBlbmNyeXB0aW9uLlxuIik7CisKKwkJLyogQ2hlY2sgYWxsIHRoZSBrZXlzIHRvIHNlZSBpZiBhbnkgYXJlIHN0aWxsIGNvbmZpZ3VyZWQsCisJCSAqIGFuZCBpZiBubyBrZXkgaW5kZXggd2FzIHByb3ZpZGVkLCBkZS1pbml0IHRoZW0gYWxsICovCisJCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCQlpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkgeworCQkJCWlmIChrZXlfcHJvdmlkZWQpCisJCQkJCWJyZWFrOworCQkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCgKKwkJCQkJaWVlZSwgJmllZWUtPmNyeXB0W2ldKTsKKwkJCX0KKwkJfQorCisJCWlmIChpID09IFdFUF9LRVlTKSB7CisJCQlzZWMuZW5hYmxlZCA9IDA7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19MRVZFTDsKKwkJfQorCisJCWdvdG8gZG9uZTsKKwl9CisKKworCisJc2VjLmVuYWJsZWQgPSAxOworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKKworCWlmICgqY3J5cHQgIT0gTlVMTCAmJiAoKmNyeXB0KS0+b3BzICE9IE5VTEwgJiYKKwkgICAgc3RyY21wKCgqY3J5cHQpLT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CisJCS8qIGNoYW5naW5nIHRvIHVzZSBXRVA7IGRlaW5pdCBwcmV2aW91c2x5IHVzZWQgYWxnb3JpdGhtCisJCSAqIG9uIHRoaXMga2V5ICovCisJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCS8qIHRha2UgV0VQIGludG8gdXNlICovCisJCW5ld19jcnlwdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSksCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSkpOworCQluZXdfY3J5cHQtPm9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcygiV0VQIik7CisJCWlmICghbmV3X2NyeXB0LT5vcHMpIHsKKwkJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJCQluZXdfY3J5cHQtPm9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcygiV0VQIik7CisJCX0KKworCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGtleSk7CisKKwkJaWYgKCFuZXdfY3J5cHQtPm9wcyB8fCAhbmV3X2NyeXB0LT5wcml2KSB7CisJCQlrZnJlZShuZXdfY3J5cHQpOworCQkJbmV3X2NyeXB0ID0gTlVMTDsKKworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBpbml0aWFsaXplIFdFUDogIgorCQkJICAgICAgICJsb2FkIG1vZHVsZSBpZWVlODAyMTFfY3J5cHRfd2VwXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCX0KKworCS8qIElmIGEgbmV3IGtleSB3YXMgcHJvdmlkZWQsIHNldCBpdCB1cCAqLworCWlmIChlcnEtPmxlbmd0aCA+IDApIHsKKwkJbGVuID0gZXJxLT5sZW5ndGggPD0gNSA/IDUgOiAxMzsKKwkJbWVtY3B5KHNlYy5rZXlzW2tleV0sIGtleWJ1ZiwgZXJxLT5sZW5ndGgpOworCQlpZiAobGVuID4gZXJxLT5sZW5ndGgpCisJCQltZW1zZXQoc2VjLmtleXNba2V5XSArIGVycS0+bGVuZ3RoLCAwLAorCQkJICAgICAgIGxlbiAtIGVycS0+bGVuZ3RoKTsKKwkJSUVFRTgwMjExX0RFQlVHX1dYKCJTZXR0aW5nIGtleSAlZCB0byAnJXMnICglZDolZCBieXRlcylcbiIsCisJCQkJICAga2V5LCBlc2NhcGVfZXNzaWQoc2VjLmtleXNba2V5XSwgbGVuKSwKKwkJCQkgICBlcnEtPmxlbmd0aCwgbGVuKTsKKwkJc2VjLmtleV9zaXplc1trZXldID0gbGVuOworIAkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShzZWMua2V5c1trZXldLCBsZW4sIE5VTEwsCisJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CisJCS8qIFRoaXMgZW5zdXJlcyBhIGtleSB3aWxsIGJlIGFjdGl2YXRlZCBpZiBubyBrZXkgaXMKKwkJICogZXhwbGljaXRlbHkgc2V0ICovCisJCWlmIChrZXkgPT0gc2VjLmFjdGl2ZV9rZXkpCisJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJCWllZWUtPnR4X2tleWlkeCA9IGtleTsvL2J5IHdiIDA4MDMxMgorCX0gZWxzZSB7CisJCWxlbiA9ICgqY3J5cHQpLT5vcHMtPmdldF9rZXkoc2VjLmtleXNba2V5XSwgV0VQX0tFWV9MRU4sCisJCQkJCSAgICAgTlVMTCwgKCpjcnlwdCktPnByaXYpOworCQlpZiAobGVuID09IDApIHsKKwkJCS8qIFNldCBhIGRlZmF1bHQga2V5IG9mIGFsbCAwICovCisJCQlJRUVFODAyMTFfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvIGFsbCB6ZXJvLlxuIiwKKwkJCQkJICAga2V5KTsKKwkJCW1lbXNldChzZWMua2V5c1trZXldLCAwLCAxMyk7CisJCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIDEzLCBOVUxMLAorCQkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOworCQkJc2VjLmtleV9zaXplc1trZXldID0gMTM7CisJCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKKwkJfQorCisJCS8qIE5vIGtleSBkYXRhIC0ganVzdCBzZXQgdGhlIGRlZmF1bHQgVFgga2V5IGluZGV4ICovCisJCWlmIChrZXlfcHJvdmlkZWQpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19XWCgKKwkJCQkiU2V0dGluZyBrZXkgJWQgdG8gZGVmYXVsdCBUeCBrZXkuXG4iLCBrZXkpOworCQkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5OworCQkJc2VjLmFjdGl2ZV9rZXkgPSBrZXk7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJCX0KKwl9CisKKyBkb25lOgorCWllZWUtPm9wZW5fd2VwID0gIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpOworCXNlYy5hdXRoX21vZGUgPSBpZWVlLT5vcGVuX3dlcCA/IFdMQU5fQVVUSF9PUEVOIDogV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJc2VjLmZsYWdzIHw9IFNFQ19BVVRIX01PREU7CisJSUVFRTgwMjExX0RFQlVHX1dYKCJBdXRoOiAlc1xuIiwgc2VjLmF1dGhfbW9kZSA9PSBXTEFOX0FVVEhfT1BFTiA/CisJCQkgICAiT1BFTiIgOiAiU0hBUkVEIEtFWSIpOworCisJLyogRm9yIG5vdyB3ZSBqdXN0IHN1cHBvcnQgV0VQLCBzbyBvbmx5IHNldCB0aGF0IHNlY3VyaXR5IGxldmVsLi4uCisJICogVE9ETzogV2hlbiBXUEEgaXMgYWRkZWQgdGhpcyBpcyBvbmUgcGxhY2UgdGhhdCBuZWVkcyB0byBjaGFuZ2UgKi8KKwlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOyAvKiA0MCBhbmQgMTA0IGJpdCBXRVAgKi8KKworCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCWllZWUtPnNldF9zZWN1cml0eShkZXYsICZzZWMpOworCisJLyogRG8gbm90IHJlc2V0IHBvcnQgaWYgY2FyZCBpcyBpbiBNYW5hZ2VkIG1vZGUgc2luY2UgcmVzZXR0aW5nIHdpbGwKKwkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCisJICogd2l0aCBJRUVFIDgwMi4xWC4gIElmIHlvdXIgaGFyZHdhcmUgcmVxdWlyZXMgYSByZXNldCBhZnRlciBXRVAKKwkgKiBjb25maWd1cmF0aW9uIChmb3IgZXhhbXBsZS4uLiBQcmlzbTIpLCBpbXBsZW1lbnQgdGhlIHJlc2V0X3BvcnQgaW4KKwkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suICovCisJaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJiBpZWVlLT5yZXNldF9wb3J0KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXNldF9wb3J0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCit7CisJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKKwlpbnQgbGVuLCBrZXk7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdDsKKworCUlFRUU4MDIxMV9ERUJVR19XWCgiR0VUX0VOQ09ERVxuIik7CisKKwlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIC0xOworCisJa2V5ID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoa2V5KSB7CisJCWlmIChrZXkgPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlrZXktLTsKKwl9IGVsc2UKKwkJa2V5ID0gaWVlZS0+dHhfa2V5aWR4OworCisJY3J5cHQgPSBpZWVlLT5jcnlwdFtrZXldOworCWVycS0+ZmxhZ3MgPSBrZXkgKyAxOworCisJaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcyA9PSBOVUxMKSB7CisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIldFUCIpICE9IDApIHsKKwkJLyogb25seSBXRVAgaXMgc3VwcG9ydGVkIHdpdGggd2lyZWxlc3MgZXh0ZW5zaW9ucywgc28ganVzdAorCQkgKiByZXBvcnQgdGhhdCBlbmNyeXB0aW9uIGlzIHVzZWQgKi8KKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQlyZXR1cm4gMDsKKwl9CisKKwlsZW4gPSBjcnlwdC0+b3BzLT5nZXRfa2V5KGtleWJ1ZiwgV0VQX0tFWV9MRU4sIE5VTEwsIGNyeXB0LT5wcml2KTsKKwllcnEtPmxlbmd0aCA9IChsZW4gPj0gMCA/IGxlbiA6IDApOworCisJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKworCWlmIChpZWVlLT5vcGVuX3dlcCkKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsKKwllbHNlCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisgICAgICAgIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKyAgICAgICAgaW50IGksIGlkeCwgcmV0ID0gMDsKKyAgICAgICAgaW50IGdyb3VwX2tleSA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIgKmFsZywgKm1vZHVsZTsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OworCisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworICAgICAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgIH07CisJLy9wcmludGsoIj09PT09PT5lbmNvZGluZyBmbGFnOiV4LGV4dCBmbGFnOiV4LCBleHQgYWxnOiVkXG4iLCBlbmNvZGluZy0+ZmxhZ3MsZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKKyAgICAgICAgaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworICAgICAgICBpZiAoaWR4KSB7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDEgfHwgaWR4ID4gV0VQX0tFWVMpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZHgtLTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaWR4ID0gaWVlZS0+dHhfa2V5aWR4OworCisgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKSB7CisgICAgICAgICAgICAgICAgY3J5cHQgPSAmaWVlZS0+Y3J5cHRbaWR4XTsKKyAgICAgICAgICAgICAgICBncm91cF9rZXkgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHNvbWUgQ2lzY28gQVBzIHVzZSBpZHg+MCBmb3IgdW5pY2FzdCBpbiBkeW5hbWljIFdFUCAqLworCQkvL3ByaW50aygibm90IGdyb3VwIGtleSwgZmxhZ3M6JXgsIGV4dC0+YWxnOiVkXG4iLCBleHQtPmV4dF9mbGFncywgZXh0LT5hbGcpOworICAgICAgICAgICAgICAgIGlmIChpZHggIT0gMCAmJiBleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOy8vIHwgU0VDX0VOQ1JZUFQ7CisgICAgICAgIGlmICgoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB8fAorICAgICAgICAgICAgZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19OT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKCpjcnlwdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZWVlLT5jcnlwdFtpXSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGlmIChpID09IFdFUF9LRVlTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMuZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgLy8gIHNlYy5lbmNyeXB0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKyAgICAgICAgICAgICAgICB9CisJCS8vcHJpbnRrKCJkaXNhYmxlZDogZmxhZzoleFxuIiwgZW5jb2RpbmctPmZsYWdzKTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworCXNlYy5lbmFibGVkID0gMTsKKyAgICAvLyAgICBzZWMuZW5jcnlwdCA9IDE7CisjaWYgMAorICAgICAgICBpZiAoZ3JvdXBfa2V5ID8gIWllZWUtPmhvc3RfbWNfZGVjcnlwdCA6CisgICAgICAgICAgICAhKGllZWUtPmhvc3RfZW5jcnlwdCB8fCBpZWVlLT5ob3N0X2RlY3J5cHQgfHwKKyAgICAgICAgICAgICAgaWVlZS0+aG9zdF9lbmNyeXB0X21zZHUpKQorICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9ob3N0X2NyeXB0OworI2VuZGlmCisgICAgICAgIHN3aXRjaCAoZXh0LT5hbGcpIHsKKyAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKKyAgICAgICAgICAgICAgICBhbGcgPSAiV0VQIjsKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X3dlcCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorICAgICAgICAgICAgICAgIGFsZyA9ICJUS0lQIjsKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X3RraXAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKyAgICAgICAgICAgICAgICBhbGcgPSAiQ0NNUCI7CisgICAgICAgICAgICAgICAgbW9kdWxlID0gImllZWU4MDIxMV9jcnlwdF9jY21wIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBJRUVFODAyMTFfREVCVUdfV1goIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZXh0LT5hbGcpOworICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisvLwlwcmludGsoIjgtMDktMDgtOT09PT09PiVzLCBhbGcgbmFtZTolc1xuIixfX0ZVTkNUSU9OX18sIGFsZyk7CisKKwkgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CisgICAgICAgIGlmIChvcHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RfbW9kdWxlKG1vZHVsZSk7CisgICAgICAgICAgICAgICAgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKKwkJcHJpbnRrKCI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsIGV4dC0+YWxnKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisgICAgICAgICAgICAgICAgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKworICAgICAgICAgICAgICAgIG5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld19jcnlwdC0+b3BzID0gb3BzOworICAgICAgICAgICAgICAgIGlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NyeXB0LT5wcml2ID0gbmV3X2NyeXB0LT5vcHMtPmluaXQoaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0LT5wcml2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKG5ld19jcnlwdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY3J5cHQgPSBuZXdfY3J5cHQ7CisKKyAJfQorCisgICAgICAgIGlmIChleHQtPmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKKyAgICAgICAgICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkoZXh0LT5rZXksIGV4dC0+a2V5X2xlbiwgZXh0LT5yeF9zZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKKyAgICAgICAgICAgICAgICBJRUVFODAyMTFfREVCVUdfV1goIiVzOiBrZXkgc2V0dGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorI2lmIDEKKyAvL3NraXBfaG9zdF9jcnlwdDoKKwkvL3ByaW50aygic2tpcF9ob3N0X2NyeXB0OmV4dF9mbGFnczoleFxuIiwgZXh0LT5leHRfZmxhZ3MpOworICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKKyAgICAgICAgICAgICAgICBpZWVlLT50eF9rZXlpZHggPSBpZHg7CisgICAgICAgICAgICAgICAgc2VjLmFjdGl2ZV9rZXkgPSBpZHg7CisgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfTk9ORSkgeworICAgICAgICAgICAgICAgIG1lbWNweShzZWMua2V5c1tpZHhdLCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKyAgICAgICAgICAgICAgICBzZWMua2V5X3NpemVzW2lkeF0gPSBleHQtPmtleV9sZW47CisgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9ICgxIDw8IGlkeCk7CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7CisgICAgICAgICAgICAgICAgICAgICAgLy8gIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX1dFUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkgeworICAgICAgICAgICAgICAgICAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5sZXZlbCA9IFNFQ19MRVZFTF8yOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERvbid0IHNldCBzZWMgbGV2ZWwgZm9yIGdyb3VwIGtleXMuICovCisgICAgICAgICAgICAgICAgaWYgKGdyb3VwX2tleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyAmPSB+U0VDX0xFVkVMOworICAgICAgICB9CisjZW5kaWYKK2RvbmU6CisgICAgICAgIGlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisgICAgICAgICAgICAgICAgaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisKKwkgaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorICAgICAgICAgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisgICAgICAgICAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgeworICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKK30KK2ludCBpZWVlODAyMTFfd3hfc2V0X21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfbWxtZSAqbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKSBleHRyYTsKKy8vCXByaW50aygiXG5ka2dhZGZzbGtkamdhbHNrZGY9PT09PT09PT09PT09PT0+JXMoKSwgY21kOiV4XG4iLCBfX0ZVTkNUSU9OX18sIG1sbWUtPmNtZCk7CisjaWYgMQorCXN3aXRjaCAobWxtZS0+Y21kKSB7CisgICAgICAgIGNhc2UgSVdfTUxNRV9ERUFVVEg6CisJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCS8vCXByaW50aygiZGlzYXNzb2Mgbm93XG4iKTsKKwkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKKwkJYnJlYWs7CisJIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisvKgorCSBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSBTRUNfQVVUSF9NT0RFLAorCX0KKyovCisJLy9wcmludGsoInNldCBhdXRoOmZsYWc6JXgsIGRhdGEgdmFsdWU6JXhcbiIsIGRhdGEtPmZsYWdzLCBkYXRhLT52YWx1ZSk7CisJc3dpdGNoIChkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKyAgICAgICAgY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCSAgICAgLypuZWVkIHRvIHN1cHBvcnQgd3BhMiBoZXJlKi8KKwkJLy9wcmludGsoIndwYSB2ZXJzaW9uOiV4XG4iLCBkYXRhLT52YWx1ZSk7CisJCWJyZWFrOworICAgICAgICBjYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorICAgICAgICBjYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICBjYXNlIElXX0FVVEhfS0VZX01HTVQ6CisgICAgICAgICAgICAgICAgLyoKKyAqICAgICAgICAgICAgICAgICAgKiBIb3N0IEFQIGRyaXZlciBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycyBhbmQgYWxsb3dzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cGFfc3VwcGxpY2FudCB0byBjb250cm9sIHRoZW0gaW50ZXJuYWxseS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKyAgICAgICAgICAgICAgICBpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IGRhdGEtPnZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgICAgICBpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQlpZWVlLT5vcGVuX3dlcCA9IChkYXRhLT52YWx1ZSZJV19BVVRIX0FMR19PUEVOX1NZU1RFTSk/MTowOworCQkvL3ByaW50aygib3Blbl93ZXA6JWRcbiIsIGllZWUtPm9wZW5fd2VwKTsKKwkJYnJlYWs7CisKKyNpZiAxCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlpZWVlLT53cGFfZW5hYmxlZCA9IChkYXRhLT52YWx1ZSk/MTowOworCQkvL3ByaW50aygiZW5hbGJlIHdwYTolZFxuIiwgaWVlZS0+d3BhX2VuYWJsZWQpOworCQlicmVhazsKKworI2VuZGlmCisJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorICAgICAgICAgICAgICAgIGllZWUtPmllZWU4MDJfMXggPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwkJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmIDEKK2ludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKQoreworI2lmIDAKKwlwcmludGsoIj09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwl7CisJCWludCBpOworCQlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJcHJpbnRrKCIlMnggIiwgaWVbaV0mMHhmZik7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKwl1OCAqYnVmID0gTlVMTDsKKworCWlmIChsZW4+TUFYX1dQQV9JRV9MRU4gfHwgKGxlbiAmJiBpZSA9PSBOVUxMKSkKKwl7CisJCXByaW50aygicmV0dXJuIGVycm9yIG91dCwgbGVuOiVkXG4iLCBsZW4pOworCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsZW4pCisJeworCQlpZiAobGVuICE9IGllWzFdKzIpeworCQkJcHJpbnRrKCJsZW46JWQsIGllOiVkXG4iLCBsZW4sIGllWzFdKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbWNweShidWYsIGllLCBsZW4pOworCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBidWY7CisJCWllZWUtPndwYV9pZV9sZW4gPSBsZW47CisJfQorCWVsc2V7CisJCWlmIChpZWVlLT53cGFfaWUpCisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IE5VTEw7CisJCWllZWUtPndwYV9pZV9sZW4gPSAwOworCX0KKy8vCXByaW50aygiPD09PT09b3V0ICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmCisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9tbG1lKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9hdXRoKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lbmNvZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2VuY29kZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzIyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9DUllQVE9fSU5URVJOQUxfSAorI2RlZmluZSBfQ1JZUFRPX0lOVEVSTkFMX0gKKworCisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NvZnRpcnEuaD4KKyNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpCQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KTsJCQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAJCQkJCVwKKwkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25kX3Jlc2NoZWQodm9pZCkKK3sKKwlpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJc2NoZWR1bGUoKTsKKwl9Cit9CisjZW5kaWYKKworZXh0ZXJuIGVudW0ga21fdHlwZSBjcnlwdG9fa21fdHlwZXNbXTsKKworc3RhdGljIGlubGluZSBlbnVtIGttX3R5cGUgY3J5cHRvX2ttYXBfdHlwZShpbnQgb3V0KQoreworCXJldHVybiBjcnlwdG9fa21fdHlwZXNbKGluX3NvZnRpcnEoKSA/IDIgOiAwKSArIG91dF07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX2ttYXAoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvdXQpCit7CisJcmV0dXJuIGttYXBfYXRvbWljKHBhZ2UsIGNyeXB0b19rbWFwX3R5cGUob3V0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fa3VubWFwKHZvaWQgKnZhZGRyLCBpbnQgb3V0KQoreworCWt1bm1hcF9hdG9taWModmFkZHIsIGNyeXB0b19rbWFwX3R5cGUob3V0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9feWllbGQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlpZiAoIWluX3NvZnRpcnEoKSkKKwkJY29uZF9yZXNjaGVkKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX3RmbV9jdHgoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gKHZvaWQgKikmdGZtWzFdOworfQorCitzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisKKyNpZmRlZiBDT05GSUdfS01PRAordm9pZCBjcnlwdG9fYWxnX2F1dG9sb2FkKGNvbnN0IGNoYXIgKm5hbWUpOworc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gY3J5cHRvX2FsZ19sb29rdXAobmFtZSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQworaW50IGNyeXB0b19hbGxvY19obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwordm9pZCBjcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19hbGxvY19obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7IH0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3ZvaWQgX19pbml0IGNyeXB0b19pbml0X3Byb2Modm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19pbml0X3Byb2Modm9pZCkKK3sgfQorI2VuZGlmCisKK2ludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKK2ludCBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKK2ludCBjcnlwdG9faW5pdF9jb21wcmVzc19mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOworCitpbnQgY3J5cHRvX2luaXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK2ludCBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworaW50IGNyeXB0b19pbml0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKwordm9pZCBjcnlwdG9fZXhpdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwordm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwordm9pZCBjcnlwdG9fZXhpdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisKKyNlbmRpZgkvKiBfQ1JZUFRPX0lOVEVSTkFMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvcnRsX2NyeXB0by5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvcnRsX2NyeXB0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDBjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9ydGxfY3J5cHRvLmgKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSBDcnlwdG9hcGksIGJ5IEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqIGFuZCBOZXR0bGUsIGJ5IE5pZWxzIE3psIhsZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICisjZGVmaW5lIF9MSU5VWF9DUllQVE9fSAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2RlZmluZSBjcnlwdG9fcmVnaXN0ZXJfYWxnIGNyeXB0b19yZWdpc3Rlcl9hbGdfcnRsCisjZGVmaW5lIGNyeXB0b191bnJlZ2lzdGVyX2FsZyBjcnlwdG9fdW5yZWdpc3Rlcl9hbGdfcnRsCisjZGVmaW5lIGNyeXB0b19hbGxvY190Zm0gY3J5cHRvX2FsbG9jX3RmbV9ydGwKKyNkZWZpbmUgY3J5cHRvX2ZyZWVfdGZtIGNyeXB0b19mcmVlX3RmbV9ydGwKKyNkZWZpbmUgY3J5cHRvX2FsZ19hdmFpbGFibGUgY3J5cHRvX2FsZ19hdmFpbGFibGVfcnRsCisKKy8qCisgKiBBbGdvcml0aG0gbWFza3MgYW5kIHR5cGVzLgorICovCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9DSVBIRVIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwMgorI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MJMHgwMDAwMDAwNAorCisvKgorICogVHJhbnNmb3JtIG1hc2tzIGFuZCB2YWx1ZXMgKGZvciBjcnRfZmxhZ3MpLgorICovCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfTUFTSwkJMHhmZmYwMDAwMAorCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9FQ0IJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NCQwkJMHgwMDAwMDAwMgorI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0ZCCQkweDAwMDAwMDA0CisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9DVFIJCTB4MDAwMDAwMDgKKworI2RlZmluZSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWQkJMHgwMDAwMDEwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWQkJMHgwMDEwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTiAgIAkweDAwMjAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfU0NIRUQgCTB4MDA0MDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTiAJMHgwMDgwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfRkxBR1MgCTB4MDEwMDAwMDAKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgc3R1ZmYuCisgKi8KKyNkZWZpbmUgQ1JZUFRPX1VOU1BFQwkJCTAKKyNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKKworc3RydWN0IHNjYXR0ZXJsaXN0OworCisvKgorICogQWxnb3JpdGhtczogbW9kdWxhciBjcnlwdG8gYWxnb3JpdGhtIGltcGxlbWVudGF0aW9ucywgbWFuYWdlZAorICogdmlhIGNyeXB0b19yZWdpc3Rlcl9hbGcoKSBhbmQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCkuCisgKi8KK3N0cnVjdCBjaXBoZXJfYWxnIHsKKwl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOworCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7CisJaW50ICgqY2lhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAorCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOworCXZvaWQgKCpjaWFfZW5jcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKKwl2b2lkICgqY2lhX2RlY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cit9OworCitzdHJ1Y3QgZGlnZXN0X2FsZyB7CisJdW5zaWduZWQgaW50IGRpYV9kaWdlc3RzaXplOworCXZvaWQgKCpkaWFfaW5pdCkodm9pZCAqY3R4KTsKKwl2b2lkICgqZGlhX3VwZGF0ZSkodm9pZCAqY3R4LCBjb25zdCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7CisJdm9pZCAoKmRpYV9maW5hbCkodm9pZCAqY3R4LCB1OCAqb3V0KTsKKwlpbnQgKCpkaWFfc2V0a2V5KSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCisJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7Cit9OworCitzdHJ1Y3QgY29tcHJlc3NfYWxnIHsKKwlpbnQgKCpjb2FfaW5pdCkodm9pZCAqY3R4KTsKKwl2b2lkICgqY29hX2V4aXQpKHZvaWQgKmN0eCk7CisJaW50ICgqY29hX2NvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb2FfZGVjb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKK307CisKKyNkZWZpbmUgY3JhX2NpcGhlcgljcmFfdS5jaXBoZXIKKyNkZWZpbmUgY3JhX2RpZ2VzdAljcmFfdS5kaWdlc3QKKyNkZWZpbmUgY3JhX2NvbXByZXNzCWNyYV91LmNvbXByZXNzCisKK3N0cnVjdCBjcnlwdG9fYWxnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyYV9saXN0OworCXUzMiBjcmFfZmxhZ3M7CisJdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7CisJdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOworCWNvbnN0IGNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CisKKwl1bmlvbiB7CisJCXN0cnVjdCBjaXBoZXJfYWxnIGNpcGhlcjsKKwkJc3RydWN0IGRpZ2VzdF9hbGcgZGlnZXN0OworCQlzdHJ1Y3QgY29tcHJlc3NfYWxnIGNvbXByZXNzOworCX0gY3JhX3U7CisKKwlzdHJ1Y3QgbW9kdWxlICpjcmFfbW9kdWxlOworfTsKKworLyoKKyAqIEFsZ29yaXRobSByZWdpc3RyYXRpb24gaW50ZXJmYWNlLgorICovCitpbnQgY3J5cHRvX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKK2ludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CisKKy8qCisgKiBBbGdvcml0aG0gcXVlcnkgaW50ZXJmYWNlLgorICovCitpbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKTsKKworLyoKKyAqIFRyYW5zZm9ybXM6IHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMgd2hpY2ggZW5jYXBzdWxhdGUgYWxnb3JpdGhtcworICogYW5kIGNvcmUgcHJvY2Vzc2luZyBsb2dpYy4gIE1hbmFnZWQgdmlhIGNyeXB0b19hbGxvY190Zm0oKSBhbmQKKyAqIGNyeXB0b19mcmVlX3RmbSgpLCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzIGhlbHBlcnMgYmVsb3cuCisgKi8KK3N0cnVjdCBjcnlwdG9fdGZtOworCitzdHJ1Y3QgY2lwaGVyX3RmbSB7CisJdm9pZCAqY2l0X2l2OworCXVuc2lnbmVkIGludCBjaXRfaXZzaXplOworCXUzMiBjaXRfbW9kZTsKKwlpbnQgKCpjaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOworCWludCAoKmNpdF9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOworCWludCAoKmNpdF9lbmNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7CisJaW50ICgqY2l0X2RlY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CisJaW50ICgqY2l0X2RlY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKKwl2b2lkICgqY2l0X3hvcl9ibG9jaykodTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cit9OworCitzdHJ1Y3QgZGlnZXN0X3RmbSB7CisJdm9pZCAoKmRpdF9pbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKwl2b2lkICgqZGl0X3VwZGF0ZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7CisJdm9pZCAoKmRpdF9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7CisJdm9pZCAoKmRpdF9kaWdlc3QpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOworCWludCAoKmRpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7CisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCisJdm9pZCAqZGl0X2htYWNfYmxvY2s7CisjZW5kaWYKK307CisKK3N0cnVjdCBjb21wcmVzc190Zm0geworCWludCAoKmNvdF9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb3RfZGVjb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cit9OworCisjZGVmaW5lIGNydF9jaXBoZXIJY3J0X3UuY2lwaGVyCisjZGVmaW5lIGNydF9kaWdlc3QJY3J0X3UuZGlnZXN0CisjZGVmaW5lIGNydF9jb21wcmVzcwljcnRfdS5jb21wcmVzcworCitzdHJ1Y3QgY3J5cHRvX3RmbSB7CisKKwl1MzIgY3J0X2ZsYWdzOworCisJdW5pb24geworCQlzdHJ1Y3QgY2lwaGVyX3RmbSBjaXBoZXI7CisJCXN0cnVjdCBkaWdlc3RfdGZtIGRpZ2VzdDsKKwkJc3RydWN0IGNvbXByZXNzX3RmbSBjb21wcmVzczsKKwl9IGNydF91OworCisJc3RydWN0IGNyeXB0b19hbGcgKl9fY3J0X2FsZzsKK307CisKKy8qCisgKiBUcmFuc2Zvcm0gdXNlciBpbnRlcmZhY2UuCisgKi8KKworLyoKKyAqIGNyeXB0b19hbGxvY190Zm0oKSB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gbG9jYXRlIGFuIGFscmVhZHkgbG9hZGVkIGFsZ29yaXRobS4KKyAqIElmIHRoYXQgZmFpbHMgYW5kIHRoZSBrZXJuZWwgc3VwcG9ydHMgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcywgaXQKKyAqIHdpbGwgdGhlbiBhdHRlbXB0IHRvIGxvYWQgYSBtb2R1bGUgb2YgdGhlIHNhbWUgbmFtZSBvciBhbGlhcy4gIEEgcmVmY291bnQKKyAqIGlzIGdyYWJiZWQgb24gdGhlIGFsZ29yaXRobSB3aGljaCBpcyB0aGVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zZm9ybS4KKyAqCisgKiBjcnlwdG9fZnJlZV90Zm0oKSBmcmVlcyB1cCB0aGUgdHJhbnNmb3JtIGFuZCBhbnkgYXNzb2NpYXRlZCByZXNvdXJjZXMsCisgKiB0aGVuIGRyb3BzIHRoZSByZWZjb3VudCBvbiB0aGUgYXNzb2NpYXRlZCBhbGdvcml0aG0uCisgKi8KK3N0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfdGZtKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdGZtX2ZsYWdzKTsKK3ZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCisvKgorICogVHJhbnNmb3JtIGhlbHBlcnMgd2hpY2ggcXVlcnkgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtLgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX25hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9uYW1lOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX21vZG5hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gdGZtLT5fX2NydF9hbGc7CisKKwlpZiAoYWxnLT5jcmFfbW9kdWxlKQorCQlyZXR1cm4gYWxnLT5jcmFfbW9kdWxlLT5uYW1lOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b190Zm1fYWxnX3R5cGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19taW5fa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9taW5fa2V5c2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXZzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9ibG9ja3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZTsKK30KKworLyoKKyAqIEFQSSB3cmFwcGVycy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9pbml0KHRmbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5zZykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfdXBkYXRlKHRmbSwgc2csIG5zZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwl0Zm0tPmNydF9kaWdlc3QuZGl0X2ZpbmFsKHRmbSwgb3V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9kaWdlc3QodGZtLCBzZywgbnNnLCBvdXQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fZGlnZXN0X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCWlmICh0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1NZUzsKKwlyZXR1cm4gdGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCW1lbWNweSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBzcmMsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwltZW1jcHkoZHN0LCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOworCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUyk7CisJcmV0dXJuIHRmbS0+Y3J0X2NvbXByZXNzLmNvdF9kZWNvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOworfQorCisvKgorICogSE1BQyBzdXBwb3J0LgorICovCisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCit2b2lkIGNyeXB0b19obWFjX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4pOwordm9pZCBjcnlwdG9faG1hY191cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOwordm9pZCBjcnlwdG9faG1hY19maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmtleWxlbiwgdTggKm91dCk7Cit2b2lkIGNyeXB0b19obWFjKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuLAorICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKKyNlbmRpZgkvKiBDT05GSUdfQ1JZUFRPX0hNQUMgKi8KKworI2VuZGlmCS8qIF9MSU5VWF9DUllQVE9fSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMV9jcnlwdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTFfY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhM2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTFfY3J5cHQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogT3JpZ2luYWwgY29kZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKKyAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGllZWU4MDIxMSBjcnlwdG8gbW9kdWxlLgorICovCisjaWZuZGVmIElFRUU4MDIxMV9DUllQVF9ICisjZGVmaW5lIElFRUU4MDIxMV9DUllQVF9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogaW5pdCBuZXcgY3J5cHRvIGNvbnRleHQgKGUuZy4sIGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzcGFjZSwKKwkgKiBzZWxlY3QgSVYsIGV0Yy4pOyByZXR1cm5zIE5VTEwgb24gZmFpbHVyZSBvciBwb2ludGVyIHRvIGFsbG9jYXRlZAorCSAqIHByaXZhdGUgZGF0YSBvbiBzdWNjZXNzICovCisJdm9pZCAqICgqaW5pdCkoaW50IGtleWlkeCk7CisKKwkvKiBkZWluaXRpYWxpemUgY3J5cHRvIGNvbnRleHQgYW5kIGZyZWUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKCpkZWluaXQpKHZvaWQgKnByaXYpOworCisJLyogZW5jcnlwdC9kZWNyeXB0IHJldHVybiA8IDAgb24gZXJyb3Igb3IgPj0gMCBvbiBzdWNjZXNzLiBUaGUgcmV0dXJuCisJICogdmFsdWUgZnJvbSBkZWNyeXB0X21wZHUgaXMgcGFzc2VkIGFzIHRoZSBrZXlpZHggdmFsdWUgZm9yCisJICogZGVjcnlwdF9tc2R1LiBza2IgbXVzdCBoYXZlIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gZm9yIHRoZQorCSAqIGVuY3J5cHRpb247IGlmIG5vdCwgZXJyb3Igd2lsbCBiZSByZXR1cm5lZDsgdGhlc2UgZnVuY3Rpb25zIGFyZQorCSAqIGNhbGxlZCBmb3IgYWxsIE1QRFVzIChpLmUuLCBmcmFnbWVudHMpLgorCSAqLworCWludCAoKmVuY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCisJLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZm9yIGZ1bGwgTVNEVXMsIGkuZS4gZnVsbCBmcmFtZXMuCisJICogVGhlc2UgY2FuIGJlIE5VTEwgaWYgZnVsbCBNU0RVIG9wZXJhdGlvbnMgYXJlIG5vdCBuZWVkZWQuICovCisJaW50ICgqZW5jcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LCBpbnQgaGRyX2xlbiwKKwkJCSAgICB2b2lkICpwcml2KTsKKworCWludCAoKnNldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisJaW50ICgqZ2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKworCS8qIHByb2NmcyBoYW5kbGVyIGZvciBwcmludGluZyBvdXQga2V5IGluZm9ybWF0aW9uIGFuZCBwb3NzaWJsZQorCSAqIHN0YXRpc3RpY3MgKi8KKwljaGFyICogKCpwcmludF9zdGF0cykoY2hhciAqcCwgdm9pZCAqcHJpdik7CisKKwkvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZGRlZCBieSBlbmNyeXB0aW9uOyBlbmNyeXB0IGJ1ZiBpcworCSAqIGFsbG9jYXRlZCB3aXRoIGV4dHJhX3ByZWZpeF9sZW4gYnl0ZXMsIGNvcHkgb2YgaW5fYnVmLCBhbmQKKwkgKiBleHRyYV9wb3N0Zml4X2xlbjsgZW5jcnlwdCBuZWVkIG5vdCB1c2UgYWxsIHRoaXMgc3BhY2UsIGJ1dAorCSAqIHRoZSByZXN1bHQgbXVzdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIGNvcnJlY3QKKwkgKiBsZW5ndGggbXVzdCBiZSByZXR1cm5lZCAqLworCWludCBleHRyYV9wcmVmaXhfbGVuLCBleHRyYV9wb3N0Zml4X2xlbjsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGRlbGF5ZWQgZGVsZXRpb24gbGlzdCAqLworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXZvaWQgKnByaXY7CisJYXRvbWljX3QgcmVmY250OworfTsKKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICosIGludCk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMjE1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKQEAgLTAsMCArMSw3NjEgQEAKKy8qCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNpZm5kZWYgUjgxODBICisjZGVmaW5lIFI4MTgwSAorCisKKyNkZWZpbmUgUlRMODE4MF9NT0RVTEVfTkFNRSAicnRsODE4MCIKKyNkZWZpbmUgRE1FU0coeCxhLi4uKSBwcmludGsoS0VSTl9JTkZPIFJUTDgxODBfTU9EVUxFX05BTUUgIjogIiB4ICJcbiIsICMjIGEpCisjZGVmaW5lIERNRVNHVyh4LGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUlRMODE4MF9NT0RVTEVfTkFNRSAiOiBXVzoiIHggIlxuIiwgIyMgYSkKKyNkZWZpbmUgRE1FU0dFKHgsYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBSVEw4MTgwX01PRFVMRV9OQU1FICI6IEVFOiIgeCAiXG4iLCAjIyBhKQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CS8vZm9yIHJ0bmxfbG9jaygpCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4JLy8gTmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIHRoZSBwcm9jIGZzCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaW5jbHVkZSA8YXNtL2lvLmg+CisvLyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNkZWZpbmUgRVBST01fOTNjNDYgMAorI2RlZmluZSBFUFJPTV85M2M1NiAxCisKKyNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCQlTSU9DSVdGSVJTVFBSSVYrMzAKKworI2RlZmluZSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEIDIzNDJVCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorLy8jZGVmaW5lCU1BWF9GUkFHX1RIUkVTSE9MRCAgICAgMjM0MlUKKyNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEIDIzNDJVCisjZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEIDBVCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEIDIzNDJVCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OSU5URVJWQUwgMHg2NFUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fRVNTSUQgIlJ0bDgxODAiCisKKyNkZWZpbmUgREVGQVVMVF9TU0lEICIiCisjZGVmaW5lIERFRkFVTFRfUkVUUllfUlRTIDcKKyNkZWZpbmUgREVGQVVMVF9SRVRSWV9EQVRBIDcKKyNkZWZpbmUgUFJJU01fSERSX1NJWkUgNjQKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCisjZGVmaW5lIE1HTlRfUVVFVUUJCQkJCQkwCisjZGVmaW5lIEJLX1FVRVVFCQkJCQkJMQorI2RlZmluZSBCRV9RVUVVRQkJCQkJCTIKKyNkZWZpbmUgVklfUVVFVUUJCQkJCQkzCisjZGVmaW5lIFZPX1FVRVVFCQkJCQkJNAorI2RlZmluZSBISUdIX1FVRVVFCQkJCQkJNQorI2RlZmluZSBCRUFDT05fUVVFVUUJCQkJCTYKKworI2RlZmluZSBMT1dfUVVFVUUJCQkJCQlCRV9RVUVVRQorI2RlZmluZSBOT1JNQUxfUVVFVUUJCQkJCU1HTlRfUVVFVUUKKworI2RlZmluZSBhU2lmc1RpbWUgCTEwCisKKyNkZWZpbmUgc0NyY0xuZyAgICAgICAgIDQKKyNkZWZpbmUgc0Fja0N0c0xuZwkxMTIJCS8vIGJpdHMgaW4gQUNLIGFuZCBDVFMgZnJhbWVzCisvLytieSBhbXkgMDgwMzEyCisjZGVmaW5lIFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9ECTMwMAorCit0eXBlZGVmIGVudW0gX1dJUkVMRVNTX01PREUgeworCVdJUkVMRVNTX01PREVfVU5LTk9XTiA9IDB4MDAsCisJV0lSRUxFU1NfTU9ERV9BID0gMHgwMSwKKwlXSVJFTEVTU19NT0RFX0IgPSAweDAyLAorCVdJUkVMRVNTX01PREVfRyA9IDB4MDQsCisJV0lSRUxFU1NfTU9ERV9BVVRPID0gMHgwOCwKK30gV0lSRUxFU1NfTU9ERTsKKwordHlwZWRlZiBlbnVtIF9WRVJTSU9OXzgxODV7CisJLy8gUlRMODE4NQorCVZFUlNJT05fODE4NV9VTktOT1dOLAorCVZFUlNJT05fODE4NV9DLCAvLyBDLWN1dAorCVZFUlNJT05fODE4NV9ELCAvLyBELWN1dAorCS8vIFJUTDgxODVCCisJVkVSU0lPTl84MTg1Ql9CLCAvLyBCLWN1dAorCVZFUlNJT05fODE4NUJfRCwgLy8gRC1jdXQKKwlWRVJTSU9OXzgxODVCX0UsIC8vIEUtY3V0CisJLy9SVEw4MTg3Uy1QQ0lFCisJVkVSU0lPTl84MTg3U19CLCAvLyBCLWN1dAorCVZFUlNJT05fODE4N1NfQywgLy8gQy1jdXQKKwlWRVJTSU9OXzgxODdTX0QsIC8vIEQtY3V0CisKK31WRVJTSU9OXzgxODUsKlBWRVJTSU9OXzgxODU7Cit0eXBlZGVmIHN0cnVjdCAJQ2hubEFjY2Vzc1NldHRpbmcgeworCXUxNiBTSUZTX1RpbWVyOworCXUxNiBESUZTX1RpbWVyOworCXUxNiBTbG90VGltZVRpbWVyOworCXUxNiBFSUZTX1RpbWVyOworCXUxNiBDV21pbkluZGV4OworCXUxNiBDV21heEluZGV4OworfSpQQ0hBTk5FTF9BQ0NFU1NfU0VUVElORyxDSEFOTkVMX0FDQ0VTU19TRVRUSU5HOworCit0eXBlZGVmIGVudW17CisgICAgICAgIE5JQ184MTg1ID0gMSwKKyAgICAgICAgTklDXzgxODVCCisgICAgICAgIH0gbmljX3Q7CisKK3R5cGVkZWYgdTMyIEFDX0NPRElORzsKKyNkZWZpbmUgQUMwX0JFCTAJCS8vIEFDSTogMHgwMAkvLyBCZXN0IEVmZm9ydAorI2RlZmluZSBBQzFfQksJMQkJLy8gQUNJOiAweDAxCS8vIEJhY2tncm91bmQKKyNkZWZpbmUgQUMyX1ZJCTIJCS8vIEFDSTogMHgxMAkvLyBWaWRlbworI2RlZmluZSBBQzNfVk8JMwkJLy8gQUNJOiAweDExCS8vIFZvaWNlCisjZGVmaW5lIEFDX01BWAk0CQkvLyBNYXg6IGRlZmluZSB0b3RhbCBudW1iZXI7IFNob3VsZCBub3QgdG8gYmUgdXNlZCBhcyBhIHJlYWwgZW51bS4KKworLy8KKy8vIEVDV21pbi9FQ1dtYXggZmllbGQuCisvLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTMuCisvLwordHlwZWRlZgl1bmlvbiBfRUNXeworCXU4CWNoYXJEYXRhOworCXN0cnVjdAorCXsKKwkJdTgJRUNXbWluOjQ7CisJCXU4CUVDV21heDo0OworCX1mOwkvLyBGaWVsZAorfUVDVywgKlBFQ1c7CisKKy8vCisvLyBBQ0kvQUlGU04gRmllbGQuCisvLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTIuCisvLwordHlwZWRlZgl1bmlvbiBfQUNJX0FJRlNOeworCXU4CWNoYXJEYXRhOworCisJc3RydWN0CisJeworCQl1OAlBSUZTTjo0OworCQl1OAlBQ006MTsKKwkJdTgJQUNJOjI7CisJCXU4CVJlc2VydmVkOjE7CisJfWY7CS8vIEZpZWxkCit9QUNJX0FJRlNOLCAqUEFDSV9BSUZTTjsKKworLy8KKy8vIEFDIFBhcmFtZXRlcnMgUmVjb3JkIEZvcm1hdC4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KKy8vCit0eXBlZGVmCXVuaW9uIF9BQ19QQVJBTXsKKwl1MzIJbG9uZ0RhdGE7CisJdTgJY2hhckRhdGFbNF07CisKKwlzdHJ1Y3QKKwl7CisJCUFDSV9BSUZTTglBY2lBaWZzbjsKKwkJRUNXCQlFY3c7CisJCXUxNgkJVFhPUExpbWl0OworCX1mOwkvLyBGaWVsZAorfUFDX1BBUkFNLCAqUEFDX1BBUkFNOworCisvKiBpdCBpcyBhIHdyb25nIGRlZmluaXRpb24uIC14aW9uZy0yMDA2LTExLTE3Cit0eXBlZGVmIHN0cnVjdCBUaHJlZVdpcmVSZWcgeworCXUxNglsb25nRGF0YTsKKwlzdHJ1Y3QgeworCQl1OAllbmFibGVCOworCQl1OAlkYXRhOworCQl1OAljbGs7CisJCXU4CXJlYWRfd3JpdGU7CisJfSBzdHJ1YzsKK30gVGhyZWVXaXJlUmVnOworKi8KKwordHlwZWRlZgl1bmlvbiBfVGhyZWVXaXJleworCXN0cnVjdCBfVGhyZWVXaXJlU3RydWN7CisJCXUxNgkJZGF0YToxOworCQl1MTYJCWNsazoxOworCQl1MTYJCWVuYWJsZUI6MTsKKwkJdTE2CQlyZWFkX3dyaXRlOjE7CisJCXUxNgkJcmVzdjE6MTI7CisvLwkJdTJCeXRlCXJlc3YyOjE0OworLy8JCXUyQnl0ZQlUaHJlZVdpcmVFbmFibGU6MTsKKy8vCQl1MkJ5dGUJcmVzdjM6MTsKKwl9c3RydWM7CisJdTE2CQkJbG9uZ0RhdGE7Cit9VGhyZWVXaXJlUmVnOworCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgYnVmZmVyCit7CisJc3RydWN0IGJ1ZmZlciAqbmV4dDsKKwl1MzIgKmJ1ZjsKKwlkbWFfYWRkcl90IGRtYTsKK30gYnVmZmVyOworCisvL1lKLG1vZGlmaWVkLDA4MDgyOAordHlwZWRlZiBzdHJ1Y3QgU3RhdHMKK3sKKwl1bnNpZ25lZCBsb25nIHR4cmR1OworCXVuc2lnbmVkIGxvbmcgcnhyZHU7CisJdW5zaWduZWQgbG9uZyByeG5vbGFzdDsKKwl1bnNpZ25lZCBsb25nIHJ4bm9kYXRhOworLy8JdW5zaWduZWQgbG9uZyByeHJlc2V0OworLy8JdW5zaWduZWQgbG9uZyByeHdya2Fyb3VuZDsKKwl1bnNpZ25lZCBsb25nIHJ4bm9wb2ludGVyOworCXVuc2lnbmVkIGxvbmcgdHhucGVycjsKKwl1bnNpZ25lZCBsb25nIHR4cmVzdW1lZDsKKwl1bnNpZ25lZCBsb25nIHJ4ZXJyOworCXVuc2lnbmVkIGxvbmcgcnhvdmVyZmxvdzsKKwl1bnNpZ25lZCBsb25nIHJ4aW50OworCXVuc2lnbmVkIGxvbmcgdHhia3Bva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4YmVwb2tpbmc7CisJdW5zaWduZWQgbG9uZyB0eGJrcGVycjsKKwl1bnNpZ25lZCBsb25nIHR4YmVwZXJyOworCXVuc2lnbmVkIGxvbmcgdHhucG9raW50OworCXVuc2lnbmVkIGxvbmcgdHhocG9raW50OworCXVuc2lnbmVkIGxvbmcgdHhocGVycjsKKwl1bnNpZ25lZCBsb25nIGludHM7CisJdW5zaWduZWQgbG9uZyBzaGludHM7CisJdW5zaWduZWQgbG9uZyB0eG92ZXJmbG93OworCXVuc2lnbmVkIGxvbmcgcnhkbWFmYWlsOworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb247CisJdW5zaWduZWQgbG9uZyB0eGJlYWNvbmVycjsKKwl1bnNpZ25lZCBsb25nIHR4bHBva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4bHBlcnI7CisJdW5zaWduZWQgbG9uZyB0eHJldHJ5Oy8vcmV0cnkgbnVtYmVyICB0b255IDIwMDYwNjAxCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pbjsvL2NyYyBlcnJvciAoMC01MDApCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pZDsvL2NyYyBlcnJvciAoNTAwLTEwMDApCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1heDsvL2NyYyBlcnJvciAoPjEwMDApCisJdW5zaWduZWQgbG9uZyByeGljdmVycjsvL0lDViBlcnJvcgorfSBTdGF0czsKKworI2RlZmluZSBNQVhfTERfU0xPVF9OVU0gMTAKKyNkZWZpbmUgS0VFUF9BTElWRV9JTlRFUlZBTCAJCQkJMjAgLy8gaW4gc2Vjb25kcy4KKyNkZWZpbmUgQ0hFQ0tfRk9SX0hBTkdfUEVSSU9ECQkJMiAvL2JlIGVxdWFsIHRvIHdhdGNoZG9nIGNoZWNrIHRpbWUKKyNkZWZpbmUgREVGQVVMVF9LRUVQX0FMSVZFX0xFVkVMCQkJMQorI2RlZmluZSBERUZBVUxUX1NMT1RfTlVNCQkJCQkyCisjZGVmaW5lIFBPV0VSX1BST0ZJTEVfQUMJCQkJCTAKKyNkZWZpbmUgUE9XRVJfUFJPRklMRV9CQVRURVJZCQkJMQorCit0eXBlZGVmIHN0cnVjdCBfbGlua19kZXRlY3RfdAoreworCXUzMgkJCQlSeEZyYW1lTnVtW01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBGcmFtZSAvIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworCXUxNgkJCQlTbG90TnVtOwkvLyBudW1iZXIgb2YgQ2hlY2tGb3JIYW5nIHBlcmlvZCB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMsIGRlZmF1bHQgaXMgMgorCXUxNgkJCQlTbG90SW5kZXg7CisKKwl1MzIJCQkJTnVtVHhPa0luUGVyaW9kOyAgLy9udW1iZXIgb2YgcGFja2V0IHRyYW5zbWl0dGVkIGR1cmluZyBDaGVja0ZvckhhbmcKKwl1MzIJCQkJTnVtUnhPa0luUGVyaW9kOyAgLy9udW1iZXIgb2YgcGFja2V0IHJlY2VpdmVkIGR1cmluZyBDaGVja0ZvckhhbmcKKworCXU4CQkJCUlkbGVDb3VudDsgICAgIC8vIChLRUVQX0FMSVZFX0lOVEVSVkFMIC8gQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EKQorCXUzMgkJCQlMYXN0TnVtVHhVbmljYXN0OworCXUzMgkJCQlMYXN0TnVtUnhVbmljYXN0OworCisJYm9vbAkJCQliQnVzeVRyYWZmaWM7ICAgIC8vd2hlbiBpdCBpcyBzZXQgdG8gMSwgVUkgY2Fubid0IHNjYW4gYXQgd2lsbC4KK31saW5rX2RldGVjdF90LCAqcGxpbmtfZGV0ZWN0X3Q7CisKKy8vWUosbW9kaWZpZWQsMDgwODI4LGVuZAorCisvL2J5IGFteSBmb3IgbGVkCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBMRUQgY3VzdG9taXphdGlvbi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordHlwZWRlZgllbnVtIF9MRURfU1RSQVRFR1lfODE4NXsKKwlTV19MRURfTU9ERTAsIC8vCisJU1dfTEVEX01PREUxLCAvLworCUhXX0xFRCwgLy8gSFcgY29udHJvbCAyIExFRHMsIExFRDAgYW5kIExFRDEgKHRoZXJlIGFyZSA0IGRpZmZlcmVudCBjb250cm9sIG1vZGVzKQorfUxFRF9TVFJBVEVHWV84MTg1LCAqUExFRF9TVFJBVEVHWV84MTg1OworLy9ieSBhbXkgZm9yIGxlZAorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK3R5cGVkZWYJZW51bSBfTEVEX0NUTF9NT0RFeworCUxFRF9DVExfUE9XRVJfT04gPSAxLAorCUxFRF9DVExfTElOSyA9IDIsCisJTEVEX0NUTF9OT19MSU5LID0gMywKKwlMRURfQ1RMX1RYID0gNCwKKwlMRURfQ1RMX1JYID0gNSwKKwlMRURfQ1RMX1NJVEVfU1VSVkVZID0gNiwKKwlMRURfQ1RMX1BPV0VSX09GRiA9IDcKK31MRURfQ1RMX01PREU7CisKK3R5cGVkZWYJZW51bSBfUlRfUkZfUE9XRVJfU1RBVEUKK3sKKwllUmZPbiwKKwllUmZTbGVlcCwKKwllUmZPZmYKK31SVF9SRl9QT1dFUl9TVEFURTsKKworZW51bQlfUmVhc29uQ29kZXsKKwl1bnNwZWNfcmVhc29uCT0gMHgxLAorCWF1dGhfbm90X3ZhbGlkCT0gMHgyLAorCWRlYXV0aF9sdl9zcwk9IDB4MywKKwlpbmFjdGl2aXR5CQk9IDB4NCwKKwlhcF9vdmVybG9hZAkJPSAweDUsCisJY2xhc3MyX2VycgkJPSAweDYsCisJY2xhc3MzX2VycgkJPSAweDcsCisJZGlzYXNfbHZfc3MJCT0gMHg4LAorCWFzb2Nfbm90X2F1dGgJPSAweDksCisKKwkvLy0tLS1NSUNfQ0hFQ0sKKwltaWNfZmFpbHVyZQkJPSAweGUsCisJLy8tLS0tRU5EIE1JQ19DSEVDSworCisJLy8gUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA4MDIuMTFpIEQxMC4wIHAuMjguCisJaW52YWxpZF9JRQkJPSAweDBkLAorCWZvdXJfd2F5X3Rtb3V0CT0gMHgwZiwKKwl0d29fd2F5X3Rtb3V0CT0gMHgxMCwKKwlJRV9kaXNtYXRjaAkJPSAweDExLAorCWludmFsaWRfR2NpcGhlcgk9IDB4MTIsCisJaW52YWxpZF9QY2lwaGVyCT0gMHgxMywKKwlpbnZhbGlkX0FLTVAJPSAweDE0LAorCXVuc3VwX1JTTklFdmVyID0gMHgxNSwKKwlpbnZhbGlkX1JTTklFCT0gMHgxNiwKKwlhdXRoXzgwMl8xeF9mYWlsPSAweDE3LAorCWNpcGVyX3JlamVjdAkJPSAweDE4LAorCisJLy8gUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA3LjMuMS43LCA4MDIuMWUgRDEzLjAsIHAuNDIuIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTE1LgorCVFvU191bnNwZWMJCT0gMHgyMCwJLy8gMzIKKwlRQVBfYmFuZHdpZHRoCT0gMHgyMSwJLy8gMzMKKwlwb29yX2NvbmRpdGlvbgk9IDB4MjIsCS8vIDM0CisJbm9fZmFjaWxpdHkJCT0gMHgyMywJLy8gMzUKKwkJCQkJCQkvLyBXaGVyZSBpcyAzNj8/PworCXJlcV9kZWNsaW5lZAk9IDB4MjUsCS8vIDM3CisJaW52YWxpZF9wYXJhbQk9IDB4MjYsCS8vIDM4CisJcmVxX25vdF9ob25vcmVkPSAweDI3LAkvLyAzOQorCVRTX25vdF9jcmVhdGVkCT0gMHgyRiwJLy8gNDcKKwlETF9ub3RfYWxsb3dlZAk9IDB4MzAsCS8vIDQ4CisJZGVzdF9ub3RfZXhpc3QJPSAweDMxLAkvLyA0OQorCWRlc3Rfbm90X1FTVEEJPSAweDMyLAkvLyA1MAorfTsKK3R5cGVkZWYJZW51bSBfUlRfUFNfTU9ERQoreworCWVBY3RpdmUsCS8vIEFjdGl2ZS9Db250aW51b3VzIGFjY2Vzcy4KKwllTWF4UHMsCQkvLyBNYXggcG93ZXIgc2F2ZSBtb2RlLgorCWVGYXN0UHMJCS8vIEZhc3QgcG93ZXIgc2F2ZSBtb2RlLgorfVJUX1BTX01PREU7CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQordHlwZWRlZiBzdHJ1Y3QgcjgxODBfcHJpdgoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJc2hvcnQgZXByb210eXBlOworCWludCBpcnE7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMTsKKworICAgICAgICBzaG9ydCBjYXJkXzgxODU7IC8qIE86IHJ0bDgxODAsIDE6cnRsODE4NSBWIEIvQywgMjpydGw4MTg1IFYgRCwgMzpydGw4MTg1QiAqLworCXNob3J0IGNhcmRfODE4NV9CdmVyc2lvbjsgLyogaWYgVENSIHJlcG9ydHMgY2FyZCBWIEIvQyB0aGlzIGRpc2NyaW1pbmF0ZXMgKi8KKwlzaG9ydCBwaHlfdmVyOyAvKiBtZWFuaW5nZnVsIGZvciBydGw4MjI1IDE6QSAyOkIgMzpDICovCisJc2hvcnQgZW5hYmxlX2dwaW8wOworCWVudW0gY2FyZF90eXBlIHtQQ0ksTUlOSVBDSSxDQVJEQlVTLFVTQi8qcnRsODE4NyovfWNhcmRfdHlwZTsKKwlzaG9ydCBod19wbGNwX2xlbjsKKwlzaG9ydCBwbGNwX3ByZWFtYmxlX21vZGU7IC8vIDA6YXV0byAxOnNob3J0IDI6bG9uZworCisJc3BpbmxvY2tfdCBpcnFfbG9jazsKKwlzcGlubG9ja190IGlycV90aF9sb2NrOworCXNwaW5sb2NrX3QgdHhfbG9jazsKKwlzcGlubG9ja190IHBzX2xvY2s7CisJc3BpbmxvY2tfdCByZl9wc19sb2NrOworCisJdTE2IGlycV9tYXNrOworCXNob3J0IGlycV9lbmFibGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc2hvcnQgY2hhbjsKKwlzaG9ydCBzZW5zOworCXNob3J0IG1heF9zZW5zOworCXU4IGNodHhwd3JbMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAorCXU4IGNodHhwd3Jfb2ZkbVsxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCisJLy91OCBjaGFsbG93WzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKKwl1OCBjaGFubmVsX3BsYW47ICAvLyBpdCdzIHRoZSBjaGFubmVsIHBsYW4gaW5kZXgKKwlzaG9ydCB1cDsKKwlzaG9ydCBjcmNtb247IC8vaWYgMSBhbGxvdyBiYWQgY3JjIGZyYW1lIHJlY2VwdGlvbiBpbiBtb25pdG9yIG1vZGUKKwlzaG9ydCBwcmlzbV9oZHI7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzY2FuX3RpbWVyOworCS8qc2hvcnQgc2NhbnBlbmRpbmc7CisJc2hvcnQgc3RvcHNjYW47Ki8KKwlzcGlubG9ja190IHNjYW5fbG9jazsKKwl1OCBhY3RpdmVfcHJvYmU7CisJLy91OCBhY3RpdmVfc2Nhbl9udW07CisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSByZl9zdGF0ZTsKKwlzaG9ydCBod193ZXA7CisKKwlzaG9ydCBkaWdwaHk7CisJc2hvcnQgYW50YjsKKwlzaG9ydCBkaXZlcnNpdHk7CisJdTggY3NfdHJlc2hvbGQ7CisJc2hvcnQgcmNyX2NzZW5zZTsKKwlzaG9ydCByZl9jaGlwOworCXUzMiBrZXkwWzRdOworCXNob3J0ICgqcmZfc2V0X3NlbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgc2Vucyk7CisJdm9pZCAoKnJmX3NldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKwl2b2lkICgqcmZfY2xvc2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZl9pbml0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfc2xlZXApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZl93YWtldXApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCS8vc2hvcnQgcmF0ZTsKKwlzaG9ydCBwcm9taXNjOworCS8qc3RhdHMqLworCXN0cnVjdCBTdGF0cyBzdGF0czsKKwlzdHJ1Y3QgX2xpbmtfZGV0ZWN0X3QgbGlua19kZXRlY3Q7ICAvL1lKLGFkZCwwODA4MjgKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXJfZGV2OworCisJLypSWCBzdHVmZiovCisJdTMyICpyeHJpbmc7CisJdTMyICpyeHJpbmd0YWlsOworCWRtYV9hZGRyX3QgcnhyaW5nZG1hOworCXN0cnVjdCBidWZmZXIgKnJ4YnVmZmVyOworCXN0cnVjdCBidWZmZXIgKnJ4YnVmZmVyaGVhZDsKKwlpbnQgcnhyaW5nY291bnQ7CisJdTE2IHJ4YnVmZmVyc2l6ZTsKKworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisKKwlzaG9ydCByeF9za2JfY29tcGxldGU7CisKKwl1MzIgcnhfcHJldmxlbjsKKworCS8qVFggc3R1ZmYqLworLyoKKwl1MzIgKnR4bHByaW5nOworCXUzMiAqdHhocHJpbmc7CisJdTMyICp0eG5wcmluZzsKKwlkbWFfYWRkcl90IHR4bHByaW5nZG1hOworCWRtYV9hZGRyX3QgdHhocHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eG5wcmluZ2RtYTsKKwl1MzIgKnR4bHByaW5ndGFpbDsKKwl1MzIgKnR4aHByaW5ndGFpbDsKKwl1MzIgKnR4bnByaW5ndGFpbDsKKwl1MzIgKnR4bHByaW5naGVhZDsKKwl1MzIgKnR4aHByaW5naGVhZDsKKwl1MzIgKnR4bnByaW5naGVhZDsKKwlzdHJ1Y3QgYnVmZmVyICp0eGxwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGhwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eG5wYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGxwYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHhocGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4bnBidWZzdGFpbDsKKyovCisJdTMyICp0eG1hcHJpbmc7CisJdTMyICp0eGJrcHJpbmc7CisJdTMyICp0eGJlcHJpbmc7CisJdTMyICp0eHZpcHJpbmc7CisJdTMyICp0eHZvcHJpbmc7CisJdTMyICp0eGhwcmluZzsKKwlkbWFfYWRkcl90IHR4bWFwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4YmtwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4YmVwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4dmlwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4dm9wcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4aHByaW5nZG1hOworCXUzMiAqdHhtYXByaW5ndGFpbDsKKwl1MzIgKnR4YmtwcmluZ3RhaWw7CisJdTMyICp0eGJlcHJpbmd0YWlsOworCXUzMiAqdHh2aXByaW5ndGFpbDsKKwl1MzIgKnR4dm9wcmluZ3RhaWw7CisJdTMyICp0eGhwcmluZ3RhaWw7CisJdTMyICp0eG1hcHJpbmdoZWFkOworCXUzMiAqdHhia3ByaW5naGVhZDsKKwl1MzIgKnR4YmVwcmluZ2hlYWQ7CisJdTMyICp0eHZpcHJpbmdoZWFkOworCXUzMiAqdHh2b3ByaW5naGVhZDsKKwl1MzIgKnR4aHByaW5naGVhZDsKKwlzdHJ1Y3QgYnVmZmVyICp0eG1hcGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHhia3BidWZzOworCXN0cnVjdCBidWZmZXIgKnR4YmVwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eHZpcGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHh2b3BidWZzOworCXN0cnVjdCBidWZmZXIgKnR4aHBidWZzOworCXN0cnVjdCBidWZmZXIgKnR4bWFwYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHhia3BidWZzdGFpbDsKKwlzdHJ1Y3QgYnVmZmVyICp0eGJlcGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4dmlwYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHh2b3BidWZzdGFpbDsKKwlzdHJ1Y3QgYnVmZmVyICp0eGhwYnVmc3RhaWw7CisKKwlpbnQgdHhyaW5nY291bnQ7CisJaW50IHR4YnVmZnNpemU7CisJLy9zdHJ1Y3QgdHhfcGVuZGluZ2J1ZiB0eG5wX3BlbmRpbmc7CisJLy9zdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3R4X3Rhc2tsZXQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV9yeF90YXNrbGV0OworCXU4IGRtYV9wb2xsX21hc2s7CisJLy9zaG9ydCB0eF9zdXNwZW5kOworCisJLyogYWRob2MvbWFzdGVyIG1vZGUgc3R1ZmYgKi8KKwl1MzIgKnR4YmVhY29ucmluZ3RhaWw7CisJZG1hX2FkZHJfdCB0eGJlYWNvbnJpbmdkbWE7CisJdTMyICp0eGJlYWNvbnJpbmc7CisJaW50IHR4YmVhY29uY291bnQ7CisJc3RydWN0IGJ1ZmZlciAqdHhiZWFjb25idWZzOworCXN0cnVjdCBidWZmZXIgKnR4YmVhY29uYnVmc3RhaWw7CisJLy9jaGFyICptYXN0ZXJfZXNzaWQ7CisJLy91MTYgbWFzdGVyX2JlYWNvbmludGVydmFsOworCS8vdTMyIG1hc3Rlcl9iZWFjb25zaXplOworCS8vdTE2IGJlYWNvbl9pbnRlcnZhbDsKKworCXU4IHJldHJ5X2RhdGE7CisJdTggcmV0cnlfcnRzOworCXUxNiBydHM7CisKKy8vYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwl1OAkgUmVnVGhyZWVXaXJlTW9kZTsgLy8gU2VlICJUaHJlZSB3aXJlIG1vZGUiIGRlZmluZWQgYWJvdmUsIDIwMDYuMDUuMzEsIGJ5IHJjbmprby4KKworLy9ieSBhbXkgZm9yIGxlZAorCUxFRF9TVFJBVEVHWV84MTg1IExlZFN0cmF0ZWd5OworLy9ieSBhbXkgZm9yIGxlZAorCisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoX2RvZ190aW1lcjsKKwlib29sIGJJbmFjdGl2ZVBzOworCWJvb2wgYlN3UmZQcm9jZXNzaW5nOworCVJUX1JGX1BPV0VSX1NUQVRFCWVJbmFjdGl2ZVBvd2VyU3RhdGU7CisJUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZTsKKwl1MzIgUmZPZmZSZWFzb247CisJYm9vbCBSRkNoYW5nZUluUHJvZ3Jlc3M7CisJYm9vbCBiSW5IY3RUZXN0OworCWJvb2wgU2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzczsKKwl1OCAgIFJGUHJvZ1R5cGU7CisJYm9vbCBiTGVpc3VyZVBzOworCVJUX1BTX01PREUgZG90MTFQb3dlclNhdmVNb2RlOworCS8vdTMyIE51bVJ4T2tJblBlcmlvZDsgICAvL1lKLGRlbCwwODA4MjgKKwkvL3UzMiBOdW1UeE9rSW5QZXJpb2Q7ICAgLy9ZSixkZWwsMDgwODI4CisJdTggICBUeFBvbGxpbmdUaW1lczsKKworCWJvb2wJYkFwQnVmT3VyRnJhbWU7Ly8gVFJVRSBpZiBBUCBidWZmZXIgb3VyIHVuaWNhc3QgZGF0YSAsIHdlIHdpbGwga2VlcCBlQXdha2UgdW50aWxsIHJlY2VpdmUgZGF0YSBvciB0aW1lb3V0LgorCXU4CVdhaXRCdWZEYXRhQmNuQ291bnQ7CisJdTgJV2FpdEJ1ZkRhdGFUaW1lT3V0OworCisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorLy9ieSBhbXkgZm9yIGFudGVubmEKKwl1OCBFRVBST01Td0FudGVubmFEaXZlcnNpdHk7CisJYm9vbCBFRVBST01EZWZhdWx0QW50ZW5uYTE7CisJdTggUmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtOworCWJvb2wgYlN3QW50ZW5uYURpdmVyaXR5OworCXU4IFJlZ0RlZmF1bHRBbnRlbm5hOworCWJvb2wgYkRlZmF1bHRBbnRlbm5hMTsKKwl1OCBTaWduYWxTdHJlbmd0aDsKKwlsb25nIFN0YXRzX1NpZ25hbFN0cmVuZ3RoOworCWxvbmcgTGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50OyAvLyBJbiBwZXJjZW50YW5nZSwgdXNlZCBmb3Igc21vb3RoaW5nLCBlLmcuIE1vdmluZyBBdmVyYWdlLgorCXU4CSBTaWduYWxRdWFsaXR5OyAvLyBpbiAwLTEwMCBpbmRleC4KKwlsb25nIFN0YXRzX1NpZ25hbFF1YWxpdHk7CisJbG9uZyBSZWN2U2lnbmFsUG93ZXI7IC8vIGluIGRCbS4KKwlsb25nIFN0YXRzX1JlY3ZTaWduYWxQb3dlcjsKKwl1OAkgTGFzdFJ4UGt0QW50ZW5uYTsJLy8gK2J5IGFteSAwODAzMTIgQW50ZW5uIHdoaWNoIHJlY2VpdmVkIHRoZSBsYXN0ZWQgcGFja2V0LiAwOiBBdXgsIDE6TWFpbi4gQWRkZWQgYnkgUm9nZXIsIDIwMDguMDEuMjUuCisJdTMyIEFkUnhPa0NudDsKKwlsb25nIEFkUnhTaWduYWxTdHJlbmd0aDsKKwl1OCBDdXJyQW50ZW5uYUluZGV4OwkJCS8vIEluZGV4IHRvIGN1cnJlbnQgQW50ZW5uYSAoYm90aCBUeCBhbmQgUngpLgorCXU4IEFkVGlja0NvdW50OwkJCQkvLyBUaW1lcyBvZiBTd0FudGVubmFEaXZlcnNpdHlUaW1lciBoYXBwZW5lZC4KKwl1OCBBZENoZWNrUGVyaW9kOwkJCQkvLyAjIG9mIHBlcmlvZCBTd0FudGVubmFEaXZlcnNpdHlUaW1lciB0byBjaGVjayBSeCBzaWduYWwgc3RyZW5ndGggZm9yIFNXIEFudGVubmEgRGl2ZXJzaXR5LgorCXU4IEFkTWluQ2hlY2tQZXJpb2Q7CQkJLy8gTWluIHZhbHVlIG9mIEFkQ2hlY2tQZXJpb2QuCisJdTggQWRNYXhDaGVja1BlcmlvZDsJCQkvLyBNYXggdmFsdWUgb2YgQWRDaGVja1BlcmlvZC4KKwlsb25nIEFkUnhTc1RocmVzaG9sZDsJCQkvLyBTaWduYWwgc3RyZW5ndGggdGhyZXNob2xkIHRvIHN3aXRjaCBhbnRlbm5hLgorCWxvbmcgQWRNYXhSeFNzVGhyZXNob2xkOwkJCS8vIE1heCB2YWx1ZSBvZiBBZFJ4U3NUaHJlc2hvbGQuCisJYm9vbCBiQWRTd2l0Y2hlZENoZWNraW5nOwkJLy8gVFJVRSBpZiB3ZSBzaGFsbCBzaGFsbCBjaGVjayBSeCBzaWduYWwgc3RyZW5ndGggZm9yIGxhc3QgdGltZSBzd2l0Y2hpbmcgYW50ZW5uYS4KKwlsb25nIEFkUnhTc0JlZm9yZVN3aXRjaGVkOwkJLy8gUnggc2lnbmFsIHN0cmVuZ3RoIGJlZm9yZSB3ZSBzd2l0aGVkIGFudGVubmEuCisJc3RydWN0IHRpbWVyX2xpc3QgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXI7CisvL2J5IGFteSBmb3IgYW50ZW5uYQorLy97YnkgYW15IDA4MDMxMgorLy8KKwkvLyBDcnlzdGFsIGNhbGlicmF0aW9uLgorCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCS8vCisJYm9vbAkJYlh0YWxDYWxpYnJhdGlvbjsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbi4KKwl1OAkJCVh0YWxDYWxfWGluOyAvLyBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYaW4uIDB+Ny41cEYKKwl1OAkJCVh0YWxDYWxfWG91dDsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWG91dC4gMH43LjVwRgorCS8vCisJLy8gVHggcG93ZXIgdHJhY2tpbmcgd2l0aCB0aGVybWFsIG1ldGVyIGluZGljYXRpb24uCisJLy8gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCisJLy8KKwlib29sCQliVHhQb3dlclRyYWNrOyAvLyBUeCBQb3dlciB0cmFja2luZy4KKwl1OAkJCVRoZXJtYWxNZXRlcjsgLy8gVGhlcm1hbCBtZXRlciByZWZlcmVuY2UgaW5kaWNhdGlvbi4KKwkvLworCS8vIER5bmFtaWMgSW5pdGlhbCBHYWluIEFkanVzdG1lbnQgTWVjaGFuaXNtLiBBZGRlZCBieSBCcnVjZSwgMjAwNy0wMi0xNC4KKwkvLworCWJvb2wJCQkJYkRpZ01lY2hhbmlzbTsgLy8gVFJVRSBpZiBESUcgaXMgZW5hYmxlZCwgRkFMU0Ugb3cuCisJYm9vbAkJCQliUmVnSGlnaFBvd2VyTWVjaGFuaXNtOyAvLyBGb3IgSGlnaCBQb3dlciBNZWNoYW5pc20uIDA2MTAxMCwgYnkgcmNuamtvLgorCXUzMgkJCQkJRmFsc2VBbGFybVJlZ1ZhbHVlOworCXU4CQkJCQlSZWdEaWdPZmRtRmFVcFRoOyAvLyBVcHBlciB0aHJlaG9sZCBvZiBPRkRNIGZhbHNlIGFsYXJtLCB3aGljaCBpcyB1c2VkIGluIERJRy4KKwl1OAkJCQkJRElHX051bWJlckZhbGxiYWNrVm90ZTsKKwl1OAkJCQkJRElHX051bWJlclVwZ3JhZGVWb3RlOworCS8vIEZvciBIVyBhbnRlbm5hIGRpdmVyc2l0eSwgYWRkZWQgYnkgUm9nZXIsIDIwMDguMDEuMzAuCisJdTMyCQkJQWRNYWluQW50ZW5uYVJ4T2tDbnQ7CQkvLyBNYWluIGFudGVubmEgUnggT0sgY291bnQuCisJdTMyCQkJQWRBdXhBbnRlbm5hUnhPa0NudDsJCS8vIEF1eCBhbnRlbm5hIFJ4IE9LIGNvdW50LgorCWJvb2wJCWJIV0FkU3dpdGNoZWQ7CQkJCS8vIFRSVUUgaWYgd2UgaGFzIHN3aXRjaGVkIGRlZmF1bHQgYW50ZW5uYSBieSBIVyBldmFsdWF0aW9uLgorCS8vIFJGIEhpZ2ggUG93ZXIgdXBwZXIvbG93ZXIgdGhyZXNob2xkLgorCXU4CQkJCQlSZWdIaVB3clVwcGVyVGg7CisJdTgJCQkJCVJlZ0hpUHdyTG93ZXJUaDsKKwkvLyBSRiBSU1NJIEhpZ2ggUG93ZXIgdXBwZXIvbG93ZXIgVGhyZXNob2xkLgorCXU4CQkJCQlSZWdSU1NJSGlQd3JVcHBlclRoOworCXU4CQkJCQlSZWdSU1NJSGlQd3JMb3dlclRoOworCS8vIEN1cnJlbnQgQ0NLIFJTU0kgdmFsdWUgdG8gZGV0ZXJtaW5lIENDSyBoaWdoIHBvd2VyLCBhc2tlZCBieSBTRDMgRFosIGJ5IEJydWNlLCAyMDA3LTA0LTEyLgorCXU4CQkJQ3VyQ0NLUlNTSTsKKwlib29sICAgICAgICBiQ3VyQ0NLUGt0OworCS8vCisJLy8gSGlnaCBQb3dlciBNZWNoYW5pc20uIEFkZGVkIGJ5IGFteSwgMDgwMzEyLgorCS8vCisJYm9vbAkJCQkJYlRvVXBkYXRlVHhQd3I7CisJbG9uZwkJCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFNTOworCWxvbmcJCQkJCVVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyOworCXU4CQkJCQkJUlNTSTsKKwljaGFyCQkJCQlSeFBvd2VyOworCSB1OCBJbml0aWFsR2FpbjsKKwkgLy9Gb3IgYWRqdXN0IERpZyBUaHJlc2hob2xkIGR1cmluZyBMZWdhY3kvTGVpc3VyZSBQb3dlciBTYXZlIE1vZGUKKwl1MzIJCQkJRG96ZVBlcmlvZEluUGFzdDJTZWM7CisJIC8vIERvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBkaXNhYmxlIFBMTCBzaXR1YXRpb24uCisJdTgJCQkJCUluaXRpYWxHYWluQmFja1VwOworCSB1OCBSZWdCTW9kZUdhaW5TdGFnZTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisgICAgc3RydWN0IHRpbWVyX2xpc3QgcmF0ZWFkYXB0ZXJfdGltZXI7CisJdTMyICAgIFJhdGVBZGFwdGl2ZVBlcmlvZDsKKwlib29sICAgYkVuaGFuY2VUeFB3cjsKKwlib29sICAgYlVwZGF0ZUFSRlI7CisJaW50CSAgIEZvcmNlZERhdGFSYXRlOyAvLyBGb3JjZSBEYXRhIFJhdGUuIDA6IEF1dG8sIDB4MDI6IDFNIH4gMHg2QzogNTRNLikKKwl1MzIgICAgIE51bVR4VW5pY2FzdDsgLy9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJdTggICAgICBrZWVwQWxpdmVMZXZlbDsgLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUKKwl1bnNpZ25lZCBsb25nIAlOdW1UeE9rVG90YWw7CisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFJldHJ5Q250OworICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFJldHJ5UmF0ZTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICBMYXN0VHhva0NudDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgTGFzdFJ4b2tDbnQ7CisgICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyUmV0cnlDbnQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIExhc3RUeE9LQnl0ZXM7CisJdW5zaWduZWQgbG9uZyAJCSAgICBOdW1UeE9rQnl0ZXNUb3RhbDsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RGYWlsVHhSYXRlOworICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgTGFzdEZhaWxUeFJhdGVTUzsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWxUeFJhdGVDb3VudDsKKyAgICAgICAgdTMyICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RUeFRocm91Z2hwdXQ7CisgICAgICAgIC8vZm9yIHVwIHJhdGUKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgYlRyeXVwaW5nOworICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclR4UmF0ZTsgICAgIC8vdGhlIHJhdGUgYmVmb3JlIHVwCisgICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyUmV0cnlSYXRlOworICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ5dXBpbmdDb3VudDsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyeURvd25Db3VudExvd0RhdGE7CisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnl1cGluZ0NvdW50Tm9EYXRhOworCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgQ3VycmVudE9wZXJhUmF0ZTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisvL2J5IGFteSAwODAzMTJ9CisvLwlzaG9ydCB3cV9odXJyeXVwOworLy8Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHdhdGNoX2RvZ193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfaXJxX3dxOworCXNob3J0IGFja190eF90b19pZWVlOworCisJdTggUG93ZXJQcm9maWxlOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXUzMiBDU01ldGhvZDsKKwl1OCBjY2tfdHhwd3JfYmFzZTsKKwl1OCBvZmRtX3R4cHdyX2Jhc2U7CisJdTggZG1hX3BvbGxfc3RvcF9tYXNrOworCisJLy91OCBSZWdUaHJlZVdpcmVNb2RlOworCXU4IE1XSUVuYWJsZTsKKwl1MTYgU2hvcnRSZXRyeUxpbWl0OworCXUxNiBMb25nUmV0cnlMaW1pdDsKKwl1MTYgRWFybHlSeFRocmVzaG9sZDsKKwl1MzIgVHJhbnNtaXRDb25maWc7CisJdTMyIFJlY2VpdmVDb25maWc7CisJdTMyIEludHJNYXNrOworCisJc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyAgQ2hhbm5lbEFjY2Vzc1NldHRpbmc7CisjZW5kaWYKK31yODE4MF9wcml2OworCisjZGVmaW5lIE1BTkFHRV9QUklPUklUWSAwCisjZGVmaW5lIEJLX1BSSU9SSVRZIDEKKyNkZWZpbmUgQkVfUFJJT1JJVFkgMgorI2RlZmluZSBWSV9QUklPUklUWSAzCisjZGVmaW5lIFZPX1BSSU9SSVRZIDQKKyNkZWZpbmUgSElfUFJJT1JJVFkgNQorI2RlZmluZSBCRUFDT05fUFJJT1JJVFkgNgorCisjZGVmaW5lIExPV19QUklPUklUWSBWSV9QUklPUklUWQorI2RlZmluZSBOT1JNX1BSSU9SSVRZIFZPX1BSSU9SSVRZCisvL0FDMlF1ZXVlIG1hcHBpbmcKKyNkZWZpbmUgQUMyUShfYWMpICgoKF9hYykgPT0gV01FX0FDX1ZPKSA/IFZPX1BSSU9SSVRZIDogXAorCQkoKF9hYykgPT0gV01FX0FDX1ZJKSA/IFZJX1BSSU9SSVRZIDogXAorCQkoKF9hYykgPT0gV01FX0FDX0JLKSA/IEJLX1BSSU9SSVRZIDogXAorCQlCRV9QUklPUklUWSkKKworc2hvcnQgcnRsODE4MF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4KiBza2J1ZiwgaW50IGxlbixpbnQgcHJpb3JpdHksCisJc2hvcnQgbW9yZWZyYWcsc2hvcnQgZnJhZ2Rlc2MsaW50IHJhdGUpOworCit1OCByZWFkX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkgOwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KTsKK3ZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTE2IHkpOwordm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTMyIHkpOwordm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MTgwX3J0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBydGw4MTgwX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgcnRsODE4MF90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIHJ0bDgxODBfc3RhcnRfc2Nhbm5pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc3RhcnRfc2Nhbm5pbmdfcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zdG9wX3NjYW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vdm9pZCBmaXhfcnhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zZXRfYW5hcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgYSk7Cit2b2lkIHJ0bDgxODVfc2V0X2FuYXBhcmFtMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhKTsKK3ZvaWQgcnRsODE4MF9zZXRfaHdfd2VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX25vX2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF91cGRhdGVfbXNyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLy92b2lkIHJ0bDgxODBfQlNTX2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9iZWFjb25fcnhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9jb250dHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2NvbnR0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHJ0bDgxODBfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTgwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKK3ZvaWQgcnRsODE4MF9zZXRfbWFzdGVyX2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsY2hhciAqZXNzaWQpOwordm9pZCBydGw4MTgwX3VwZGF0ZV9iZWFjb25fc2VjdXJpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHdyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHU4IGRhdGEpOwordm9pZCB3cml0ZV9waHlfY2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpOwordm9pZCB3cml0ZV9waHlfb2ZkbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKTsKK3ZvaWQgcnRsODE4NV90eF9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFudCk7Cit2b2lkIHJ0bDgxODVfcmZfcGluc19lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIElCU1NfcmFuZG9taXplX2NlbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIElQU0VudGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBJUFNMZWF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBnZXRfY3Vycl90eF9mcmVlX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaW9yaXR5KTsKK3ZvaWQgVXBkYXRlSW5pdGlhbEdhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Citib29sIFNldEFudGVubmFDb25maWc4N1NFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICBEZWZhdWx0QW50LCBib29sIGJBbnREaXZlcnNpdHkpOworCisvLyNpZmRlZiBDT05GSUdfUlRMODE4NUIKK3ZvaWQgcnRsODE4NWJfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4NWJfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTg1Yl90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODViX2lycV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGZpeF9yeF9maWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBmaXhfdHhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODIyNXoyX1NldFRYUG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49S0VSTkVMX1ZFUlNJT04oMiw2LDIwKQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKTsKKyNlbHNlCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisvLyNlbmRpZgorYm9vbCBNZ250QWN0U2V0X1JGX1N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFJUX1JGX1BPV0VSX1NUQVRFIFN0YXRlVG9TZXQsIHUzMiBDaGFuZ2VTb3VyY2UpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ3MTFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF85M2N4Ni5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICAgVGhpcyBmaWxlcyBjb250YWlucyBjYXJkIGVlcHJvbSAoOTNjNDYgb3IgOTNjNTYpIHByb2dyYW1taW5nIHJvdXRpbmVzLAorICAgbWVtb3J5IGlzIGFkZHJlc3NlZCBieSAxNiBiaXRzIHdvcmRzLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIKKwordm9pZCBlcHJvbV9jcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBiaXQpCit7CisJaWYoYml0KQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwKKwkJCSAgICAgICAoMTw8RVBST01fQ1NfU0hJRlQpIHwgXAorCQkJICAgICAgIHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpKTsgLy9lbmFibGUgRVBST00KKwllbHNlCisJCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCByZWFkX25pY19ieXRlKGRldiwgRVBST01fQ01EKVwKKwkJCSAgICAgICAmfigxPDxFUFJPTV9DU19TSElGVCkpOyAvL2Rpc2FibGUgRVBST00KKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKK30KKworCit2b2lkIGVwcm9tX2NrX2N5Y2xlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICAoMTw8RVBST01fQ0tfU0hJRlQpIHwgcmVhZF9uaWNfYnl0ZShkZXYsRVBST01fQ01EKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgcmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCkgJn4gKDE8PEVQUk9NX0NLX1NISUZUKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3ZvaWQgZXByb21fdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGJpdCkKK3sKKwlpZihiaXQpCisJCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCAoMTw8RVBST01fV19TSElGVCkgfCBcCisJCQkgICAgICAgcmVhZF9uaWNfYnl0ZShkZXYsRVBST01fQ01EKSk7CisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgcmVhZF9uaWNfYnl0ZShkZXYsRVBST01fQ01EKVwKKwkJCSAgICAgICAmfigxPDxFUFJPTV9XX1NISUZUKSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7Cit9CisKKworc2hvcnQgZXByb21fcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGJpdDsKKworCWJpdD0ocmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCkgJiAoMTw8RVBST01fUl9TSElGVCkgKTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCisJaWYoYml0KSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGVwcm9tX3NlbmRfYml0c19zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYltdLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yKGk9MDsgaTxsZW47IGkrKyl7CisJCWVwcm9tX3coZGV2LCBiW2ldKTsKKwkJZXByb21fY2tfY3ljbGUoZGV2KTsKKwl9Cit9CisKKwordTMyIGVwcm9tX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkZHIpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXNob3J0IHJlYWRfY21kW109ezEsMSwwfTsKKwlzaG9ydCBhZGRyX3N0cls4XTsKKwlpbnQgaTsKKwlpbnQgYWRkcl9sZW47CisJdTMyIHJldDsKKworCXJldD0wOworICAgICAgICAvL2VuYWJsZSBFUFJPTSBwcm9ncmFtbWluZworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKEVQUk9NX0NNRF9QUk9HUkFNPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7CisKKwlpZiAocHJpdi0+ZXByb210eXBlPT1FUFJPTV85M2M1Nil7CisJCWFkZHJfc3RyWzddPWFkZHIgJiAxOworCQlhZGRyX3N0cls2XT1hZGRyICYgKDE8PDEpOworCQlhZGRyX3N0cls1XT1hZGRyICYgKDE8PDIpOworCQlhZGRyX3N0cls0XT1hZGRyICYgKDE8PDMpOworCQlhZGRyX3N0clszXT1hZGRyICYgKDE8PDQpOworCQlhZGRyX3N0clsyXT1hZGRyICYgKDE8PDUpOworCQlhZGRyX3N0clsxXT1hZGRyICYgKDE8PDYpOworCQlhZGRyX3N0clswXT1hZGRyICYgKDE8PDcpOworCQlhZGRyX2xlbj04OworCX1lbHNleworCQlhZGRyX3N0cls1XT1hZGRyICYgMTsKKwkJYWRkcl9zdHJbNF09YWRkciAmICgxPDwxKTsKKwkJYWRkcl9zdHJbM109YWRkciAmICgxPDwyKTsKKwkJYWRkcl9zdHJbMl09YWRkciAmICgxPDwzKTsKKwkJYWRkcl9zdHJbMV09YWRkciAmICgxPDw0KTsKKwkJYWRkcl9zdHJbMF09YWRkciAmICgxPDw1KTsKKwkJYWRkcl9sZW49NjsKKwl9CisJZXByb21fY3MoZGV2LCAxKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCWVwcm9tX3NlbmRfYml0c19zdHJpbmcoZGV2LCByZWFkX2NtZCwgMyk7CisJZXByb21fc2VuZF9iaXRzX3N0cmluZyhkZXYsIGFkZHJfc3RyLCBhZGRyX2xlbik7CisKKwkvL2tlZXAgY2hpcCBwaW4gRCB0byBsb3cgc3RhdGUgd2hpbGUgcmVhZGluZy4KKwkvL0knbSB1bnN1cmUgaWYgaXQgaXMgbmVjZXNzYXJ5LCBidXQgYW55d2F5IHNob3VsZG4ndCBodXJ0CisJZXByb21fdyhkZXYsIDApOworCisJZm9yKGk9MDtpPDE2O2krKyl7CisJCS8vZWVwcm9tIG5lZWRzIGEgY2xrIGN5Y2xlIGJldHdlZW4gd3JpdGluZyBvcGNvZGUmYWRyCisJCS8vYW5kIHJlYWRpbmcgZGF0YS4gKGVlcHJvbSBvdXRzIGEgZHVtbXkgMCkKKwkJZXByb21fY2tfY3ljbGUoZGV2KTsKKwkJcmV0IHw9IChlcHJvbV9yKGRldik8PCgxNS1pKSk7CisJfQorCisJZXByb21fY3MoZGV2LCAwKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCisJLy9kaXNhYmxlIEVQUk9NIHByb2dyYW1taW5nCisJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICAoRVBST01fQ01EX05PUk1BTDw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDI4YTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF85M2N4Ni5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKlRoaXMgZmlsZXMgY29udGFpbnMgY2FyZCBlZXByb20gKDkzYzQ2IG9yIDkzYzU2KSBwcm9ncmFtbWluZyByb3V0aW5lcyovCisvKm1lbW9yeSBpcyBhZGRyZXNzZWQgYnkgV09SRFMqLworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorCisjZGVmaW5lIEVQUk9NX0RFTEFZIDEwCisKKyNkZWZpbmUgRVBST01fQU5BUEFSQU1fQUREUkxXT1JEIDB4ZAorI2RlZmluZSBFUFJPTV9BTkFQQVJBTV9BRERSSFdPUkQgMHhlCisKKyNkZWZpbmUgUkZDSElQSUQgMHg2CisjZGVmaW5lCVJGQ0hJUElEX0lOVEVSU0lMIDEKKyNkZWZpbmUJUkZDSElQSURfUkZNRCAyCisjZGVmaW5lCVJGQ0hJUElEX1BISUxJUFMgMworI2RlZmluZQlSRkNISVBJRF9NQVhJTSA0CisjZGVmaW5lCVJGQ0hJUElEX0dDVCA1CisjZGVmaW5lIFJGQ0hJUElEX1JUTDgyMjUgOQorI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2RlZmluZSBSRl9aRUJSQTIgMTEKKyNkZWZpbmUgRVBST01fVFhQV19CQVNFIDB4MDUKKyNkZWZpbmUgUkZfWkVCUkE0IDEyCisjZW5kaWYKKyNkZWZpbmUgUkZDSElQSURfUlRMODI1NSAweGEKKyNkZWZpbmUgUkZfUEFSQU0gMHgxOQorI2RlZmluZSBSRl9QQVJBTV9ESUdQSFlfU0hJRlQgMAorI2RlZmluZSBSRl9QQVJBTV9BTlRCREVGQVVMVF9TSElGVCAxCisjZGVmaW5lIFJGX1BBUkFNX0NBUlJJRVJTRU5TRV9TSElGVCAyCisjZGVmaW5lIFJGX1BBUkFNX0NBUlJJRVJTRU5TRV9NQVNLICgzPDwyKQorI2RlZmluZSBFTkVSR1lfVFJFU0hPTEQgMHgxNworI2RlZmluZSBFUFJPTV9WRVJTSU9OIDB4MUUKKyNkZWZpbmUgTUFDX0FEUiAweDcKKworI2RlZmluZSBDSVMgMHgxOAorCisjZGVmaW5lCUVQUk9NX1RYUFdfT0ZETV9DSDFfMiAweDIwCisKKy8vI2RlZmluZQlFUFJPTV9UWFBXX0NIMV8yIDB4MTAKKyNkZWZpbmUgIEVQUk9NX1RYUFdfQ0gxXzIgMHgzMAorI2RlZmluZQlFUFJPTV9UWFBXX0NIM180IDB4MTEKKyNkZWZpbmUJRVBST01fVFhQV19DSDVfNiAweDEyCisjZGVmaW5lCUVQUk9NX1RYUFdfQ0g3XzggMHgxMworI2RlZmluZQlFUFJPTV9UWFBXX0NIOV8xMCAweDE0CisjZGVmaW5lCUVQUk9NX1RYUFdfQ0gxMV8xMiAweDE1CisjZGVmaW5lCUVQUk9NX1RYUFdfQ0gxM18xNCAweDE2CisKK3UzMiBlcHJvbV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGFkZHIpOyAvL3JlYWRzIGEgMTYgYml0cyB3b3JkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjRkZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKQEAgLTAsMCArMSw2ODI4IEBACisvKgorICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxOHggcGNpIE9wZW5Tb3VyY2UgZHJpdmVyIC0gdiAwLjEKKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbAorICAgUmVhbHRlayBkcml2ZXIuCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBQYXJ0cyBvZiBCQi9SRiBjb2RlIGFyZSBkZXJpdmVkIGZyb20gRGF2aWQgWW91bmcgcnRsODE4MCBuZXRic2QgZHJpdmVyLgorCisgICBSU1NJIGNhbGMgZnVuY3Rpb24gZnJvbSAnVGhlIERldWNlJworCisgICBTb21lIGlkZWFzIGJvcnJvd2VkIGZyb20gdGhlIDgxMzl0b28uYyBkcml2ZXIgaW5jbHVkZWQgaW4gbGludXgga2VybmVsLgorCisgICBXZSAoST8pIHdhbnQgdG8gdGhhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3MgYW5kIGFsc28gdGhlCisgICBOZGlzd3JhcHBlcidzIHByb2plY3QgQXV0aG9ycy4KKworICAgQSBiaWcgYmlnIHRoYW5rcyBnb2VzIGFsc28gdG8gUmVhbHRlayBjb3JwLiBmb3IgdGhlaXIgaGVscCBpbiBteSBhdHRlbXB0IHRvCisgICBhZGQgUlRMODE4NSBhbmQgUlRMODIyNSBzdXBwb3J0LCBhbmQgdG8gRGF2aWQgWW91bmcgYWxzby4KKyovCisKKyNpZiAwCitkb3VibGUgX19mbG9hdHNpZGYgKGludCBpKSB7IHJldHVybiBpOyB9Cit1bnNpZ25lZCBpbnQgX19maXh1bnNkZnNpIChkb3VibGUgZCkgeyByZXR1cm4gZDsgfQorZG91YmxlIF9fYWRkZGYzKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gYStiOyB9Citkb3VibGUgX19hZGRzZjMoZmxvYXQgYSwgZmxvYXQgYikgeyByZXR1cm4gYStiOyB9Citkb3VibGUgX19zdWJkZjMoZG91YmxlIGEsIGRvdWJsZSBiKSB7IHJldHVybiBhLWI7IH0KK2RvdWJsZSBfX2V4dGVuZHNmZGYyKGZsb2F0IGEpIHtyZXR1cm4gYTt9CisjZW5kaWYKKworCisjdW5kZWYgREVCVUdfVFhfREVTQzIKKyN1bmRlZiBSWF9ET05UX1BBU1NfVUwKKyN1bmRlZiBERUJVR19FUFJPTQorI3VuZGVmIERFQlVHX1JYX1ZFUkJPU0UKKyN1bmRlZiBEVU1NWV9SWAorI3VuZGVmIERFQlVHX1pFUk9fUlgKKyN1bmRlZiBERUJVR19SWF9TS0IKKyN1bmRlZiBERUJVR19UWF9GUkFHCisjdW5kZWYgREVCVUdfUlhfRlJBRworI3VuZGVmIERFQlVHX1RYX0ZJTExERVNDCisjdW5kZWYgREVCVUdfVFgKKyN1bmRlZiBERUJVR19JUlEKKyN1bmRlZiBERUJVR19SWAorI3VuZGVmIERFQlVHX1JYQUxMT0MKKyN1bmRlZiBERUJVR19SRUdJU1RFUlMKKyN1bmRlZiBERUJVR19SSU5HCisjdW5kZWYgREVCVUdfSVJRX1RBU0tMRVQKKyN1bmRlZiBERUJVR19UWF9BTExPQworI3VuZGVmIERFQlVHX1RYX0RFU0MKKworLy8jZGVmaW5lIERFQlVHX1RYCisvLyNkZWZpbmUgREVCVUdfVFhfREVTQzIKKy8vI2RlZmluZSBERUJVR19SWAorLy8jZGVmaW5lIERFQlVHX1JYX1NLQgorCisvLyNkZWZpbmUgQ09ORklHX1JUTDgxODBfSU9fTUFQCisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisvLyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9zYTI0MDAuaCIgIC8qIFBISUxJUFMgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9tYXgyODIwLmgiIC8qIE1BWElNIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfZ2N0LmgiICAgICAvKiBHQ1QgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9ydGw4MjI1LmgiIC8qIFJUTDgyMjUgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9ydGw4MjU1LmgiIC8qIFJUTDgyNTUgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIiAgIC8qIENhcmQgRUVQUk9NICovCisjaW5jbHVkZSAicjgxODBfd3guaCIKKyNpbmNsdWRlICJyODE4MF9kbS5oIgorCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKyNpbmNsdWRlICJyODE4MF9wbS5oIgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorLy8jZGVmaW5lIENPTkZJR19SVEw4MTgwX0lPX01BUAorI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9CRUxLSU4KKwkjZGVmaW5lIFBDSV9WRU5ET1JfSURfQkVMS0lOIDB4MTc5OQorI2VuZGlmCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfRExJTksKKwkjZGVmaW5lIFBDSV9WRU5ET1JfSURfRExJTksgMHgxMTg2CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxODBfcGNpX2lkX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAorLy8gICAgICAgICAgICAgICAgLmRldmljZSA9IDB4ODE4MCwKKyAgICAgICAgICAgICAgICAuZGV2aWNlID0gMHg4MTk5LAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSA9IDAsCisgICAgICAgIH0sCisjaWYgMAorICAgICAgICB7CisgICAgICAgICAgICAgICAgLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQkVMS0lOLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAweDYwMDEsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhID0gMSwKKyAgICAgICAgfSwKKyAgICAgICAgeyAgICAgICAvKiBCZWxraW4gRjVENjAyMCB2MyAqLworCSAgICAgICAgLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQkVMS0lOLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAweDYwMjAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhID0gMiwKKyAgICAgICAgfSwKKyAgICAgICAgeyAgICAgICAvKiBELUxpbmsgRFdMLTYxMCAqLworICAgICAgICAgICAgICAgIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0RMSU5LLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAweDMzMDAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhID0gMywKKyAgICAgICAgfSwKKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1JFQUxURUssCisJCS5kZXZpY2UgPSAweDgxODUsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gNCwKKwl9LAorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudmVuZG9yID0gMCwKKyAgICAgICAgICAgICAgICAuZGV2aWNlID0gMCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yID0gMCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gMCwKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgPSAwLAorICAgICAgICB9Cit9OworCisKK3N0YXRpYyBjaGFyKiBpZm5hbWUgPSAid2xhbiVkIjsKK3N0YXRpYyBpbnQgaHdzZXFudW0gPSAwOworLy9zdGF0aWMgY2hhciogaWZuYW1lID0gImF0aCVkIjsKK3N0YXRpYyBpbnQgaHd3ZXAgPSAwOworc3RhdGljIGludCBjaGFubmVscyA9IDB4M2ZmZjsKKworI2RlZmluZSBlcU1hY0FkZHIoYSxiKQkJKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkKKyNkZWZpbmUgY3BNYWNBZGRyKGRlcyxzcmMpCSAgICAgICgoZGVzKVswXT0oc3JjKVswXSwoZGVzKVsxXT0oc3JjKVsxXSwoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSwoZGVzKVs0XT0oc3JjKVs0XSwoZGVzKVs1XT0oc3JjKVs1XSkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBydGw4MTgwX3BjaV9pZF90YmwpOworTU9EVUxFX0FVVEhPUigiQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBkcml2ZXIgZm9yIFJlYWx0ZWsgUlRMODE4MCAvIFJUTDgxODUgV2lGaSBjYXJkcyIpOworCisKKworLyoKK01PRFVMRV9QQVJNKGlmbmFtZSwgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2bmFtZSwiIE5ldCBpbnRlcmZhY2UgbmFtZSwgd2xhbiVkPWRlZmF1bHQiKTsKKworTU9EVUxFX1BBUk0oaHdzZXFudW0sImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoaHdzZXFudW0sIiBUcnkgdG8gdXNlIGhhcmR3YXJlIDgwMi4xMSBoZWFkZXIgc2VxdWVuY2UgbnVtYmVycy4gWmVybz1kZWZhdWx0Iik7CisKK01PRFVMRV9QQVJNKGh3d2VwLCJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGh3d2VwLCIgVHJ5IHRvIHVzZSBoYXJkd2FyZSBXRVAgc3VwcG9ydC4gU3RpbGwgYnJva2VuIGFuZCBub3QgYXZhaWxhYmxlIG9uIGFsbCBjYXJkcyIpOworCitNT0RVTEVfUEFSTShjaGFubmVscywiaSIpOworTU9EVUxFX1BBUk1fREVTQyhjaGFubmVscywiIENoYW5uZWwgYml0bWFzayBmb3Igc3BlY2lmaWMgbG9jYWxlcy4gTllJIik7CisqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDkpCittb2R1bGVfcGFyYW0oaWZuYW1lLCBjaGFycCwgU19JUlVHT3xTX0lXVVNSICk7Cittb2R1bGVfcGFyYW0oaHdzZXFudW0saW50LCBTX0lSVUdPfFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGh3d2VwLGludCwgU19JUlVHT3xTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShjaGFubmVscyxpbnQsIFNfSVJVR098U19JV1VTUik7CisjZWxzZQorTU9EVUxFX1BBUk0oaWZuYW1lLCAicyIpOworTU9EVUxFX1BBUk0oaHdzZXFudW0sImkiKTsKK01PRFVMRV9QQVJNKGh3d2VwLCJpIik7CitNT0RVTEVfUEFSTShjaGFubmVscywiaSIpOworI2VuZGlmCisKK01PRFVMRV9QQVJNX0RFU0MoZGV2bmFtZSwiIE5ldCBpbnRlcmZhY2UgbmFtZSwgd2xhbiVkPWRlZmF1bHQiKTsKKy8vTU9EVUxFX1BBUk1fREVTQyhkZXZuYW1lLCIgTmV0IGludGVyZmFjZSBuYW1lLCBhdGglZD1kZWZhdWx0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGh3c2VxbnVtLCIgVHJ5IHRvIHVzZSBoYXJkd2FyZSA4MDIuMTEgaGVhZGVyIHNlcXVlbmNlIG51bWJlcnMuIFplcm89ZGVmYXVsdCIpOworTU9EVUxFX1BBUk1fREVTQyhod3dlcCwiIFRyeSB0byB1c2UgaGFyZHdhcmUgV0VQIHN1cHBvcnQuIFN0aWxsIGJyb2tlbiBhbmQgbm90IGF2YWlsYWJsZSBvbiBhbGwgY2FyZHMiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbHMsIiBDaGFubmVsIGJpdG1hc2sgZm9yIHNwZWNpZmljIGxvY2FsZXMuIE5ZSSIpOworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxODBfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnRsODE4MF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIHZvaWQgcnRsODE4MF9zaHV0ZG93biAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlkZXYtPnN0b3AoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydGw4MTgwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gUlRMODE4MF9NT0RVTEVfTkFNRSwJICAgICAgICAgIC8qIERyaXZlciBuYW1lICAgKi8KKwkuaWRfdGFibGUJPSBydGw4MTgwX3BjaV9pZF90YmwsCSAgICAgICAgICAvKiBQQ0lfSUQgdGFibGUgICovCisJLnByb2JlCQk9IHJ0bDgxODBfcGNpX3Byb2JlLAkgICAgICAgICAgLyogcHJvYmUgZm4gICAgICAqLworCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocnRsODE4MF9wY2lfcmVtb3ZlKSwvKiByZW1vdmUgZm4gICAgICovCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKwkuc3VzcGVuZAk9IHJ0bDgxODBfc3VzcGVuZCwJICAgICAgICAgIC8qIFBNIHN1c3BlbmQgZm4gKi8KKwkucmVzdW1lCQk9IHJ0bDgxODBfcmVzdW1lLCAgICAgICAgICAgICAgICAgLyogUE0gcmVzdW1lIGZuICAqLworI2Vsc2UKKwkuc3VzcGVuZAk9IE5VTEwsCQkJICAgICAgICAgIC8qIFBNIHN1c3BlbmQgZm4gKi8KKwkucmVzdW1lICAgICAgCT0gTlVMTCwJCQkgICAgICAgICAgLyogUE0gcmVzdW1lIGZuICAqLworI2VuZGlmCisJLnNodXRkb3duCT0gcnRsODE4MF9zaHV0ZG93biwKK307CisKKworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisKK3U4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiAweGZmJmluYihkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKyAgICAgICAgcmV0dXJuIGlubChkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3UxNiByZWFkX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQoreworICAgICAgICByZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICt4KTsKK30KKwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KQoreworICAgICAgICBvdXRiKHkmMHhmZixkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTE2IHkpCit7CisgICAgICAgIG91dHcoeSxkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUzMiB5KQoreworICAgICAgICBvdXRsKHksZGV2LT5iYXNlX2FkZHIgK3gpOworfQorCisjZWxzZSAvKiBSVExfSU9fTUFQICovCisKK3U4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiAweGZmJnJlYWRiKCh1OCopZGV2LT5tZW1fc3RhcnQgK3gpOworfQorCit1MzIgcmVhZF9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiByZWFkbCgodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKK30KKwordTE2IHJlYWRfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiByZWFkdygodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKK30KKwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KQoreworICAgICAgICB3cml0ZWIoeSwodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKKwl1ZGVsYXkoMjApOworfQorCit2b2lkIHdyaXRlX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1MzIgeSkKK3sKKyAgICAgICAgd3JpdGVsKHksKHU4KilkZXYtPm1lbV9zdGFydCAreCk7CisJdWRlbGF5KDIwKTsKK30KKwordm9pZCB3cml0ZV9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1MTYgeSkKK3sKKyAgICAgICAgd3JpdGV3KHksKHU4KilkZXYtPm1lbV9zdGFydCAreCk7CisJdWRlbGF5KDIwKTsKK30KKworI2VuZGlmIC8qIFJUTF9JT19NQVAgKi8KKworCisKKworCitpbmxpbmUgdm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJlYWRfbmljX2J5dGUoZGV2LEVQUk9NX0NNRCk7CisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCW1iKCk7CisjZW5kaWYKK30KKworCitpcnFyZXR1cm5fdCBydGw4MTgwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpuZXRkZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3ZvaWQgc2V0X25pY19yeHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHNldF9uaWNfdHhyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpydGw4MTgwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zdGFydF90eF9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVBST0NGUyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpydGw4MTgwX3Byb2MgPSBOVUxMOworCitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ2lzdGVycyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworCWludCBpLG47CisKKwlpbnQgbWF4PTB4ZmY7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWZvcihuPTA7bjw9bWF4OykKKwl7CisJCS8vcHJpbnRrKCAiXG5EOiAlMng+ICIsIG4pOworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG5EOiAgJTJ4ID4gIixuKTsKKworCQlmb3IoaT0wO2k8MTYgJiYgbjw9bWF4O2krKyxuKyspCisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisKKwkJLy8JcHJpbnRrKCIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisJfQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwiXG4iKTsKKworCisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworCit9CisKK2ludCBnZXRfY3Vycl90eF9mcmVlX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaW9yaXR5KTsKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19odyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwkvL3N0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisjaWZkZWYgCUNPTkZJR19SVEw4MTg1QgorCisjZWxzZQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIk5JQyBpbnQ6ICVsdVxuIgorCQkiVG90YWwgaW50OiAlbHVcbiIKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCSJMUCBhdmFpbCBkZXNjICVkXG4iCisJCSJOUCBhdmFpbCBkZXNjICVkXG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkiTFAgcGh5cyBkbWEgYWRkciAleFxuIgorCQkiTFAgTklDIHB0ciAleFxuIgorCQkiTFAgdmlydCAzMmJhc2UgJXhcbiIKKwkJIkxQIHZpcnQgMzJ0YWlsICV4XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkiTlAgcGh5cyBkbWEgYWRkciAleFxuIgorCQkiTlAgTklDIHB0ciAleFxuIgorCQkiTlAgdmlydCAzMmJhc2UgJXhcbiIKKwkJIk5QIHZpcnQgMzJ0YWlsICV4XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkiQlAgcGh5cyBkbWEgYWRkciAleFxuIgorCQkiQlAgTklDIHB0ciAleFxuIgorCQkiQlAgdmlydCAzMmJhc2UgJXhcbiIKKwkJIkJQIHZpcnQgMzJ0YWlsICV4XG4iLAorCQlwcml2LT5zdGF0cy5pbnRzLAorCQlwcml2LT5zdGF0cy5zaGludHMsCisJCWdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsTE9XX1BSSU9SSVRZKSwKKwkJZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixOT1JNX1BSSU9SSVRZKSwKKwkJKHUzMilwcml2LT50eHZpcHJpbmdkbWEsCisJCXJlYWRfbmljX2R3b3JkKGRldixUTFBEQSksCisJCSh1MzIpcHJpdi0+dHh2aXByaW5nLAorCQkodTMyKXByaXYtPnR4dmlwcmluZ3RhaWwsCisJCSh1MzIpcHJpdi0+dHh2b3ByaW5nZG1hLAorCQlyZWFkX25pY19kd29yZChkZXYsVE5QREEpLAorCQkodTMyKXByaXYtPnR4dm9wcmluZywKKwkJKHUzMilwcml2LT50eHZvcHJpbmd0YWlsLAorCQkodTMyKXByaXYtPnR4YmVhY29ucmluZ2RtYSwKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFRCREEpLAorCQkodTMyKXByaXYtPnR4YmVhY29ucmluZywKKwkJKHUzMilwcml2LT50eGJlYWNvbnJpbmd0YWlsKTsKKyNlbmRpZgorCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19yeChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkvKgkiUlggZGVzY3JpcHRvciBub3QgYXZhaWxhYmxlOiAlbHVcbiIKKwkJIlJYIGluY29tcGxldGUgKG1pc3NpbmcgbGFzdCBkZXNjcmlwdG9yKTogJWx1XG4iCisJCSJSWCBub3QgZGF0YTogJWx1XG4iCisJCS8vIlJYIGRlc2NyaXB0b3IgcG9pbnRlciByZXNldDogJWx1XG4iCisJCSJSWCBkZXNjcmlwdG9yIHBvaW50ZXIgbG9zdDogJWx1XG4iCisJCS8vIlJYIHBvaW50ZXIgd29ya2Fyb3VuZDogJWx1XG4iCisJCSJSWCBlcnJvciBpbnQ6ICVsdVxuIgorCQkiUlggZmlmbyBvdmVyZmxvdzogJWx1XG4iCisJCSJSWCBpbnQ6ICVsdVxuIgorCQkiUlggcGFja2V0OiAlbHVcbiIKKwkJIlJYIGJ5dGVzOiAlbHVcbiIKKwkJIlJYIERNQSBmYWlsOiAlbHVcbiIsCisJCXByaXYtPnN0YXRzLnJ4cmR1LAorCQlwcml2LT5zdGF0cy5yeG5vbGFzdCwKKwkJcHJpdi0+c3RhdHMucnhub2RhdGEsCisJCS8vcHJpdi0+c3RhdHMucnhyZXNldCwKKwkJcHJpdi0+c3RhdHMucnhub3BvaW50ZXIsCisJCS8vcHJpdi0+c3RhdHMucnh3cmthcm91bmQsCisJCXByaXYtPnN0YXRzLnJ4ZXJyLAorCQlwcml2LT5zdGF0cy5yeG92ZXJmbG93LAorCQlwcml2LT5zdGF0cy5yeGludCwKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy5yeF9wYWNrZXRzLAorCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnJ4X2J5dGVzLAorCQlwcml2LT5zdGF0cy5yeGRtYWZhaWwgICovCisJCSJSWCBPSzogJWx1XG4iCisJCSJSWCBSZXRyeTogJWx1XG4iCisJCSJSWCBDUkMgRXJyb3IoMC01MDApOiAlbHVcbiIKKwkJIlJYIENSQyBFcnJvcig1MDAtMTAwMCk6ICVsdVxuIgorCQkiUlggQ1JDIEVycm9yKD4xMDAwKTogJWx1XG4iCisJCSJSWCBJQ1YgRXJyb3I6ICVsdVxuIiwKKwkJcHJpdi0+c3RhdHMucnhpbnQsCisJCXByaXYtPnN0YXRzLnJ4ZXJyLAorCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1pbiwKKwkJcHJpdi0+c3RhdHMucnhjcmNlcnJtaWQsCisJCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWF4LAorCQlwcml2LT5zdGF0cy5yeGljdmVycgorCQkpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfaWVlZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIlRYZWQgYXNzb2NpYXRpb24gcmVxdWVzdHM6ICV1XG4iCisJCSJUWGVkIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzOiAldVxuIgorCQkiUlhlZCBzdWNjZXNzZnVsIGFzc29jaWF0aW9uIHJlc3BvbnNlOiAldVxuIgorCQkiUlhlZCBmYWlsZWQgYXNzb2NpYXRpb24gcmVzcG9uc2U6ICV1XG4iCisJCSJSWGVkIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gcmVzcG9uc2U6ICV1XG4iCisJCSJSWGVkIGZhaWxlZCBhdXRoZW50aWNhdGlvbiByZXNwb25zZTogJXVcbiIKKwkJIkFzc29jaWF0aW9uIHJlcXVlc3RzIHdpdGhvdXQgcmVzcG9uc2U6ICV1XG4iCisJCSJBdXRoZW50aWNhdGlvbiByZXF1ZXN0cyB3aXRob3V0IHJlc3BvbnNlOiAldVxuIgorCQkiVFggcHJvYmUgcmVzcG9uc2U6ICV1XG4iCisJCSJSWCBwcm9iZSByZXF1ZXN0OiAldVxuIgorCQkiVFggcHJvYmUgcmVxdWVzdDogJWx1XG4iCisJCSJSWCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0czogJWx1XG4iCisJCSJSWCBhc3NvY2lhdGlvbiByZXF1ZXN0czogJWx1XG4iCisJCSJSZWFzc29jaWF0aW9uczogJWx1XG4iLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMudHhfYXNzLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMudHhfYXV0LAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfYXNzX29rLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfYXNzX2VyciwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2F1dF9vaywKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2F1dF9lcnIsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5hc3Nfbm9yZXNwLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMuYXV0X25vcmVzcCwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnR4X3Byb2JlLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfcHJvYmUsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy50eF9wcm9iZV9ycSwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2F1dGhfcnEsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yeF9hc3NvY19ycSwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJlYXNzb2MpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorI2lmIDAKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfYXAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBtYWNfaHRhYmxlX3QgKmxpc3Q7CisJaW50IGk7CisJaW50IGxlbiA9IDA7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIpeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJDYXJkIGlzIG5vdCBhY3RpbmcgYXMgQVAuLi5cbiIKKwkJKTsKKwl9ZWxzZXsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkiTGlzdCBvZiBhc3NvY2lhdGVkIFNUQTpcbiIKKwkJKTsKKworCQlmb3IoaT0wO2k8TUFDX0hUQUJMRV9FTlRSWTtpKyspCisJCQlmb3IgKGxpc3QgPSBwcml2LT5pZWVlODAyMTEtPmFzc29jX2h0YWJsZVtpXTsgbGlzdCE9TlVMTDsgbGlzdCA9IGxpc3QtPm5leHQpeworCQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkJTUFDU1RSIlxuIixNQUMyU1RSKGxpc3QtPmFkcikpOworCQkJfQorCisJfQorCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisjZW5kaWYKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c190eChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsT0s7CisKKwl0b3RhbE9LPXByaXYtPnN0YXRzLnR4bnBva2ludCtwcml2LT5zdGF0cy50eGhwb2tpbnQrcHJpdi0+c3RhdHMudHhscG9raW50OworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkvKgkiVFggbm9ybWFsIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBub3JtYWwgcHJpb3JpdHkgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIGhpZ2ggcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIGhpZ2ggcHJpb3JpdHkgZmFpbGVkIGVycm9yIGludDogJWx1XG4iCisJCSJUWCBsb3cgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIGxvdyBwcmlvcml0eSBmYWlsZWQgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIGJ5dGVzOiAlbHVcbiIKKwkJIlRYIHBhY2tldHM6ICVsdVxuIgorCQkiVFggcXVldWUgcmVzdW1lOiAlbHVcbiIKKwkJIlRYIHF1ZXVlIHN0b3BwZWQ/OiAlZFxuIgorCQkiVFggZmlmbyBvdmVyZmxvdzogJWx1XG4iCisJCS8vIlNXIFRYIHN0b3A6ICVsdVxuIgorCQkvLyJTVyBUWCB3YWtlOiAlbHVcbiIKKwkJIlRYIGJlYWNvbjogJWx1XG4iCisJCSJUWCBiZWFjb24gYWJvcnRlZDogJWx1XG4iLAorCQlwcml2LT5zdGF0cy50eG5wb2tpbnQsCisJCXByaXYtPnN0YXRzLnR4bnBlcnIsCisJCXByaXYtPnN0YXRzLnR4aHBva2ludCwKKwkJcHJpdi0+c3RhdHMudHhocGVyciwKKwkJcHJpdi0+c3RhdHMudHhscG9raW50LAorCQlwcml2LT5zdGF0cy50eGxwZXJyLAorCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2J5dGVzLAorCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMsCisJCXByaXYtPnN0YXRzLnR4cmVzdW1lZCwKKwkJbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpLAorCQlwcml2LT5zdGF0cy50eG92ZXJmbG93LAorCQkvL3ByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5zd3R4c3RvcCwKKwkJLy9wcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMuc3d0eGF3YWtlLAorCQlwcml2LT5zdGF0cy50eGJlYWNvbiwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIgICovCisJCSJUWCBPSzogJWx1XG4iCisJCSJUWCBFcnJvcjogJWx1XG4iCisJCSJUWCBSZXRyeTogJWx1XG4iCisJCSJUWCBiZWFjb24gT0s6ICVsdVxuIgorCQkiVFggYmVhY29uIGVycm9yOiAlbHVcbiIsCisJCXRvdGFsT0ssCisJCXByaXYtPnN0YXRzLnR4bnBlcnIrcHJpdi0+c3RhdHMudHhocGVycitwcml2LT5zdGF0cy50eGxwZXJyLAorCQlwcml2LT5zdGF0cy50eHJldHJ5LAorCQlwcml2LT5zdGF0cy50eGJlYWNvbiwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIKKwkpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjgxODBfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisgICAgICAgcmV0dXJuICZwcml2LT53c3RhdHM7Cit9CisjZW5kaWYKK3ZvaWQgcnRsODE4MF9wcm9jX21vZHVsZV9pbml0KHZvaWQpCit7CisJRE1FU0coIkluaXRpYWxpemluZyBwcm9jIGZpbGVzeXN0ZW0iKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgICAgIHJ0bDgxODBfcHJvYz1jcmVhdGVfcHJvY19lbnRyeShSVEw4MTgwX01PRFVMRV9OQU1FLCBTX0lGRElSLCBwcm9jX25ldCk7CisjZWxzZQorICAgICAgICBydGw4MTgwX3Byb2M9Y3JlYXRlX3Byb2NfZW50cnkoUlRMODE4MF9NT0RVTEVfTkFNRSwgU19JRkRJUiwgaW5pdF9uZXQucHJvY19uZXQpOworI2VuZGlmCit9CisKKwordm9pZCBydGw4MTgwX3Byb2NfbW9kdWxlX3JlbW92ZSh2b2lkKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE4MF9NT0RVTEVfTkFNRSwgcHJvY19uZXQpOworI2Vsc2UKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE4MF9NT0RVTEVfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOworI2VuZGlmCit9CisKKwordm9pZCBydGw4MTgwX3Byb2NfcmVtb3ZlX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpZiAocHJpdi0+ZGlyX2RldikgeworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtaHciLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLXR4IiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy1yeCIsIHByaXYtPmRpcl9kZXYpOworLy8JCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy1pZWVlIiwgcHJpdi0+ZGlyX2Rldik7CisvLwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWFwIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoZGV2LT5uYW1lLCBydGw4MTgwX3Byb2MpOworCQlwcml2LT5kaXJfZGV2ID0gTlVMTDsKKwl9Cit9CisKKwordm9pZCBydGw4MTgwX3Byb2NfaW5pdF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXByaXYtPmRpcl9kZXYgPSBjcmVhdGVfcHJvY19lbnRyeShkZXYtPm5hbWUsCisJCQkJCSAgU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLAorCQkJCQkgIHJ0bDgxODBfcHJvYyk7CisJaWYgKCFwcml2LT5kaXJfZGV2KSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgL3Byb2MvbmV0L3J0bDgxODAvJXNcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtaHciLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c19odywgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3N0YXRzLWh3XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1yeCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX3J4LCBkZXYpOworCisJaWYgKCFlKSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxODAvJXMvc3RhdHMtcnhcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtdHgiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c190eCwgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3N0YXRzLXR4XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKwkjaWYgMAorCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1pZWVlIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfaWVlZSwgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3N0YXRzLWllZWVcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCSNlbmRpZgorCSNpZiAwCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzLWFwIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfYXAsIGRldik7CisKKwlpZiAoIWUpIHsKKwkJRE1FU0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE4MC8lcy9zdGF0cy1hcFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9CisJI2VuZGlmCisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzLCBkZXYpOworCisJaWYgKCFlKSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxODAvJXMvcmVnaXN0ZXJzXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1JU0MgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgIEZJWE1FOiBjaGVjayBpZiB3ZSBjYW4gdXNlIHNvbWUgc3RhbmRhcmQgYWxyZWFkeS1leGlzdGVudAorICBkYXRhIHR5cGUrZnVuY3Rpb25zIGluIGtlcm5lbAorKi8KKworc2hvcnQgYnVmZmVyX2FkZChzdHJ1Y3QgYnVmZmVyICoqYnVmZmVyLCB1MzIgKmJ1ZiwgZG1hX2FkZHJfdCBkbWEsCisJCXN0cnVjdCBidWZmZXIgKipidWZmZXJoZWFkKQoreworI2lmZGVmIERFQlVHX1JJTkcKKwlETUVTRygiYWRkaW5nIGJ1ZmZlciB0byBUWC9SWCBzdHJ1Y3QiKTsKKyNlbmRpZgorCisgICAgICAgIHN0cnVjdCBidWZmZXIgKnRtcDsKKworCWlmKCEgKmJ1ZmZlcil7CisKKwkJKmJ1ZmZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXIpLEdGUF9LRVJORUwpOworCisJCWlmICgqYnVmZmVyID09IE5VTEwpIHsKKwkJCURNRVNHRSgiRmFpbGVkIHRvIGttYWxsb2MgaGVhZCBvZiBUWC9SWCBzdHJ1Y3QiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkoKmJ1ZmZlciktPm5leHQ9KmJ1ZmZlcjsKKwkJKCpidWZmZXIpLT5idWY9YnVmOworCQkoKmJ1ZmZlciktPmRtYT1kbWE7CisJCWlmKGJ1ZmZlcmhlYWQgIT1OVUxMKQorCQkJKCpidWZmZXJoZWFkKSA9ICgqYnVmZmVyKTsKKwkJcmV0dXJuIDA7CisJfQorCXRtcD0qYnVmZmVyOworCisJd2hpbGUodG1wLT5uZXh0IT0oKmJ1ZmZlcikpIHRtcD10bXAtPm5leHQ7CisJaWYgKCh0bXAtPm5leHQ9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXIpLEdGUF9LRVJORUwpKSA9PSBOVUxMKXsKKwkJRE1FU0dFKCJGYWlsZWQgdG8ga21hbGxvYyBUWC9SWCBzdHJ1Y3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0bXAtPm5leHQtPmJ1Zj1idWY7CisJdG1wLT5uZXh0LT5kbWE9ZG1hOworCXRtcC0+bmV4dC0+bmV4dD0qYnVmZmVyOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBidWZmZXJfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHN0cnVjdCBidWZmZXIgKipidWZmZXIsaW50IGxlbixzaG9ydAorY29uc2lzdGVudCkKK3sKKworCXN0cnVjdCBidWZmZXIgKnRtcCwqbmV4dDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY9cHJpdi0+cGRldjsKKwkvL2ludCBpOworCisJaWYoISAqYnVmZmVyKSByZXR1cm47CisKKwkvKmZvcih0bXA9KmJ1ZmZlcjsgdG1wLT5uZXh0ICE9ICpidWZmZXI7IHRtcD10bXAtPm5leHQpCisKKwkqLworCXRtcD0qYnVmZmVyOworCWRveworCQluZXh0PXRtcC0+bmV4dDsKKwkJaWYoY29uc2lzdGVudCl7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsbGVuLAorCQkJCSAgICB0bXAtPmJ1Zix0bXAtPmRtYSk7CisJCX1lbHNleworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCB0bXAtPmRtYSwKKwkJCWxlbixQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJa2ZyZWUodG1wLT5idWYpOworCQl9CisJCWtmcmVlKHRtcCk7CisJCXRtcCA9IG5leHQ7CisJfQorCXdoaWxlKG5leHQgIT0gKmJ1ZmZlcik7CisKKwkqYnVmZmVyPU5VTEw7Cit9CisKKwordm9pZCBwcmludF9idWZmZXIodTMyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisJdTggKmJ1ZiA9KHU4KilidWZmZXI7CisKKwlwcmludGsoIkFTQ0lJIEJVRkZFUiBEVU1QIChsZW46ICV4KTpcbiIsbGVuKTsKKworCWZvcihpPTA7aTxsZW47aSsrKQorCQlwcmludGsoIiVjIixidWZbaV0pOworCisJcHJpbnRrKCJcbkJJTkFSWSBCVUZGRVIgRFVNUCAobGVuOiAleCk6XG4iLGxlbik7CisKKwlmb3IoaT0wO2k8bGVuO2krKykKKwkJcHJpbnRrKCIlMDJ4IixidWZbaV0pOworCisJcHJpbnRrKCJcbiIpOworfQorCisKK2ludCBnZXRfY3Vycl90eF9mcmVlX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaW9yaXR5KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIqIHRhaWw7CisJdTMyKiBoZWFkOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHByaW9yaXR5KXsKKwkJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHhtYXByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eG1hcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgQktfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHhia3ByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eGJrcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgQkVfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHhiZXByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eGJlcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgVklfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHh2aXByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eHZpcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgVk9fUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHh2b3ByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eHZvcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgSElfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHhocHJpbmdoZWFkOworCQkJdGFpbCA9IHByaXYtPnR4aHByaW5ndGFpbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCX0KKworCS8vRE1FU0coIiV4ICV4IiwgaGVhZCwgdGFpbCk7CisKKwkvKiBGSVhNRSBGSVhNRSBGSVhNRSBGSVhNRSAqLworCisjaWYgMAorCWlmKCBoZWFkIDw9IHRhaWwgKSByZXR1cm4gcHJpdi0+dHhyaW5nY291bnQtMSAtICh0YWlsIC0gaGVhZCkvODsKKwlyZXR1cm4gKGhlYWQgLSB0YWlsKS84LzQ7CisjZWxzZQorCWlmKCBoZWFkIDw9IHRhaWwgKQorCQlyZXQgPSBwcml2LT50eHJpbmdjb3VudCAtICh0YWlsIC0gaGVhZCkvODsKKwllbHNlCisJCXJldCA9IChoZWFkIC0gdGFpbCkvODsKKworCWlmKHJldCA+IHByaXYtPnR4cmluZ2NvdW50ICkgRE1FU0coIkJVRyIpOworCXJldHVybiByZXQ7CisjZW5kaWYKK30KKworCitzaG9ydCBjaGVja19uaWNfZW5vdWdodF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaW50IHJlcXVpcmVkYnl0ZSwgcmVxdWlyZWQ7CisJcmVxdWlyZWRieXRlID0gcHJpdi0+aWVlZTgwMjExLT5mdHMgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSk7CisKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkgeworCQlyZXF1aXJlZGJ5dGUgKz0gMjsKKwl9OworCisJcmVxdWlyZWQgPSByZXF1aXJlZGJ5dGUgLyAocHJpdi0+dHhidWZmc2l6ZS00KTsKKwlpZiAocmVxdWlyZWRieXRlICUgcHJpdi0+dHhidWZmc2l6ZSkgcmVxdWlyZWQrKzsKKwkvKiBmb3Igbm93IHdlIGtlZXAgdHdvIGZyZWUgZGVzY3JpcHRvciBhcyBhIHNhZmV0eSBib3VuZGFyeQorCSAqIGJldHdlZW4gdGhlIHRhaWwgYW5kIHRoZSBoZWFkCisJICovCisKKwlyZXR1cm4gKHJlcXVpcmVkKzIgPCBnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LHByaW9yaXR5KSk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciBkZWJ1Z2luZyBwdXJwb3NlICovCit2b2lkIGNoZWNrX3R4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSkKK3sKKwlzdGF0aWMgaW50IG1heGxvZyA9MzsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyKiB0bXA7CisJc3RydWN0IGJ1ZmZlciAqYnVmOworCWludCBpOworCWludCBuaWM7CisJdTMyKiB0YWlsOworCXUzMiogaGVhZDsKKwl1MzIqIGJlZ2luOworCXUzMiBuaWNiZWdpbjsKKwlzdHJ1Y3QgYnVmZmVyKiBidWZmZXI7CisKKwltYXhsb2cgLS07CisJaWYgKG1heGxvZyA8MCApIHJldHVybjsKKworCXN3aXRjaChwcmkpIHsKKwljYXNlIE1BTkFHRV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4bWFwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhtYXByaW5nOworCQloZWFkID0gcHJpdi0+dHhtYXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4bWFwYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eG1hcHJpbmdkbWE7CisJCWJyZWFrOworCisKKwljYXNlIEJLX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhia3ByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eGJrcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eGJrcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfQktQUklPUklUWV9SSU5HX0FERFIpOworCQlidWZmZXIgPSBwcml2LT50eGJrcGJ1ZnM7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhia3ByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgQkVfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGJlcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4YmVwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4YmVwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9CRVBSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4YmVwYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eGJlcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBWSV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4dmlwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHh2aXByaW5nOworCQloZWFkID0gcHJpdi0+dHh2aXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX1ZJUFJJT1JJVFlfUklOR19BRERSKTsKKwkJYnVmZmVyID0gcHJpdi0+dHh2aXBidWZzOworCQluaWNiZWdpbiA9IHByaXYtPnR4dmlwcmluZ2RtYTsKKwkJYnJlYWs7CisKKworCWNhc2UgVk9fUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eHZvcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4dm9wcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4dm9wcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9WT1BSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4dm9wYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eHZvcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBISV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4aHByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eGhwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4aHByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFIpOworCQlidWZmZXIgPSBwcml2LT50eGhwYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eGhwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gOworCQlicmVhazsKKwl9CisKKwlpZighcHJpdi0+dHh2b3BidWZzKQorCQlETUVTR0UgKCJOSUMgVFggYWNrLCBidXQgVFggcXVldWUgY29ycnVwdGVkISIpOworCWVsc2V7CisKKwkJZm9yKGk9MCxidWY9YnVmZmVyLCB0bXA9YmVnaW47CisJCQl0bXA8YmVnaW4rKHByaXYtPnR4cmluZ2NvdW50KSo4OworCQkJdG1wKz04LGJ1Zj1idWYtPm5leHQsaSsrKQorCisJCQlETUVTRygiQlVGJWQgJXMgJXggJXMuIE5leHQgOiAleCIsaSwKKwkJCSAgICAgICp0bXAgJiAoMTw8MzEpID8gImZpbGxlZCIgOiAiZW1wdHkiLAorCQkJICAgICAgKihidWYtPmJ1ZiksCisJCQkgICAgICAqdG1wICYgKDE8PDE1KT8gIm9rIjogImVyciIsICoodG1wKzQpKTsKKwl9CisKKwlETUVTRygibmljIGF0ICVkIiwKKwkJKG5pYy1uaWNiZWdpbikgLyA4IC80KTsKKwlETUVTRygidGFpbCBhdCAlZCIsICgoaW50KXRhaWwgLSAoaW50KWJlZ2luKSAvOCAvNCk7CisJRE1FU0coImhlYWQgYXQgJWQiLCAoKGludCloZWFkIC0gKGludCliZWdpbikgLzggLzQpOworCURNRVNHKCJjaGVjayBmcmVlIGRlc2MgcmV0dXJucyAlZCIsIGNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LHByaSkpOworCURNRVNHKCJmcmVlIGRlc2MgaXMgJWRcbiIsIGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYscHJpKSk7CisJLy9ydGw4MTgwX3Jlc2V0KGRldik7CisJcmV0dXJuOworfQorCisKKworLyogdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZSAqLwordm9pZCBjaGVja19yeGJ1ZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIqIHRtcDsKKwlzdHJ1Y3QgYnVmZmVyICpidWY7CisJdTggcnhfZGVzY19zaXplOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcnhfZGVzY19zaXplID0gODsKKyNlbHNlCisJcnhfZGVzY19zaXplID0gNDsKKyNlbmRpZgorCisJaWYoIXByaXYtPnJ4YnVmZmVyKQorCQlETUVTR0UgKCJOSUMgUlggYWNrLCBidXQgUlggcXVldWUgY29ycnVwdGVkISIpOworCisJZWxzZXsKKworCQlmb3IoYnVmPXByaXYtPnJ4YnVmZmVyLCB0bXA9cHJpdi0+cnhyaW5nOworCQkgICAgdG1wIDwgcHJpdi0+cnhyaW5nKyhwcml2LT5yeHJpbmdjb3VudCkqcnhfZGVzY19zaXplOworCQkgICAgdG1wKz1yeF9kZXNjX3NpemUsIGJ1Zj1idWYtPm5leHQpCisKKwkJCURNRVNHKCJCVUYgJXMgJXgiLAorCQkJICAgICAgKnRtcCAmICgxPDwzMSkgPyAiZW1wdHkiIDogImZpbGxlZCIsCisJCQkgICAgICAqKGJ1Zi0+YnVmKSk7CisJfQorCisJcmV0dXJuOworfQorCisKK3ZvaWQgZHVtcF9lcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWZvcihpPTA7IGk8NjM7IGkrKykKKwkJRE1FU0coIkVFUFJPTSBhZGRyICV4IDogJXgiLCBpLCBlcHJvbV9yZWFkKGRldixpKSk7Cit9CisKKwordm9pZCBydGw4MTgwX2R1bXBfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJaW50IG47CisJaW50IG1heD0weGZmOworCisJRE1FU0coIkR1bXBpbmcgTklDIHJlZ2lzdGVyIG1hcCIpOworCisJZm9yKG49MDtuPD1tYXg7KQorCXsKKwkJcHJpbnRrKCAiXG5EOiAlMng+ICIsIG4pOworCQlmb3IoaT0wO2k8MTYgJiYgbjw9bWF4O2krKyxuKyspCisJCQlwcmludGsoIiUyeCAiLHJlYWRfbmljX2J5dGUoZGV2LG4pKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisKK3ZvaWQgZml4X3R4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyICp0bXA7CisJaW50IGk7CisjaWZkZWYgREVCVUdfVFhfQUxMT0MKKwlETUVTRygiRklYSU5HIFRYIEZJRk9zIik7CisjZW5kaWYKKwlmb3IgKHRtcD1wcml2LT50eG1hcHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisKKwlmb3IgKHRtcD1wcml2LT50eGJrcHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKSB7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCisJZm9yICh0bXA9cHJpdi0+dHhiZXByaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhyaW5nY291bnQ7CisJICAgICB0bXArPTgsIGkrKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCWZvciAodG1wPXByaXYtPnR4dmlwcmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4cmluZ2NvdW50OworCSAgICAgdG1wKz04LCBpKyspIHsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisKKwlmb3IgKHRtcD1wcml2LT50eHZvcHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisKKwlmb3IgKHRtcD1wcml2LT50eGhwcmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4cmluZ2NvdW50OworCSAgICAgdG1wKz04LGkrKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCisJZm9yICh0bXA9cHJpdi0+dHhiZWFjb25yaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhiZWFjb25jb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisjaWZkZWYgREVCVUdfVFhfQUxMT0MKKwlETUVTRygiVFggRklGT3MgRklYRUQiKTsKKyNlbmRpZgorCXByaXYtPnR4bWFwcmluZ3RhaWwgPSBwcml2LT50eG1hcHJpbmc7CisJcHJpdi0+dHhtYXByaW5naGVhZCA9IHByaXYtPnR4bWFwcmluZzsKKwlwcml2LT50eG1hcGJ1ZnN0YWlsID0gcHJpdi0+dHhtYXBidWZzOworCisJcHJpdi0+dHhia3ByaW5ndGFpbCA9IHByaXYtPnR4YmtwcmluZzsKKwlwcml2LT50eGJrcHJpbmdoZWFkID0gcHJpdi0+dHhia3ByaW5nOworCXByaXYtPnR4YmtwYnVmc3RhaWwgPSBwcml2LT50eGJrcGJ1ZnM7CisKKwlwcml2LT50eGJlcHJpbmd0YWlsID0gcHJpdi0+dHhiZXByaW5nOworCXByaXYtPnR4YmVwcmluZ2hlYWQgPSBwcml2LT50eGJlcHJpbmc7CisJcHJpdi0+dHhiZXBidWZzdGFpbCA9IHByaXYtPnR4YmVwYnVmczsKKworCXByaXYtPnR4dmlwcmluZ3RhaWwgPSBwcml2LT50eHZpcHJpbmc7CisJcHJpdi0+dHh2aXByaW5naGVhZCA9IHByaXYtPnR4dmlwcmluZzsKKwlwcml2LT50eHZpcGJ1ZnN0YWlsID0gcHJpdi0+dHh2aXBidWZzOworCisJcHJpdi0+dHh2b3ByaW5ndGFpbCA9IHByaXYtPnR4dm9wcmluZzsKKwlwcml2LT50eHZvcHJpbmdoZWFkID0gcHJpdi0+dHh2b3ByaW5nOworCXByaXYtPnR4dm9wYnVmc3RhaWwgPSBwcml2LT50eHZvcGJ1ZnM7CisKKwlwcml2LT50eGhwcmluZ3RhaWwgPSBwcml2LT50eGhwcmluZzsKKwlwcml2LT50eGhwcmluZ2hlYWQgPSBwcml2LT50eGhwcmluZzsKKwlwcml2LT50eGhwYnVmc3RhaWwgPSBwcml2LT50eGhwYnVmczsKKworCXByaXYtPnR4YmVhY29ucmluZ3RhaWwgPSBwcml2LT50eGJlYWNvbnJpbmc7CisJcHJpdi0+dHhiZWFjb25idWZzdGFpbCA9IHByaXYtPnR4YmVhY29uYnVmczsKKwlzZXRfbmljX3R4cmluZyhkZXYpOworCisJaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAwOworfQorCisKK3ZvaWQgZml4X3J4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyICp0bXA7CisJc3RydWN0IGJ1ZmZlciAqcnhidWY7CisJdTggcnhfZGVzY19zaXplOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcnhfZGVzY19zaXplID0gODsgLy8gNCo4ID0gMzIgYnl0ZXMKKyNlbHNlCisJcnhfZGVzY19zaXplID0gNDsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUlhBTExPQworCURNRVNHKCJGSVhJTkcgUlggRklGTyIpOworCWNoZWNrX3J4YnVmKGRldik7CisjZW5kaWYKKworCWZvciAodG1wPXByaXYtPnJ4cmluZywgcnhidWY9cHJpdi0+cnhidWZmZXJoZWFkOworCSAgICAgKHRtcCA8IChwcml2LT5yeHJpbmcpKyhwcml2LT5yeHJpbmdjb3VudCkqcnhfZGVzY19zaXplKTsKKwkgICAgIHRtcCs9cnhfZGVzY19zaXplLHJ4YnVmPXJ4YnVmLT5uZXh0KXsKKwkJKih0bXArMikgPSByeGJ1Zi0+ZG1hOworCQkqdG1wPSp0bXAgJn4gMHhmZmY7CisJCSp0bXA9KnRtcCB8IHByaXYtPnJ4YnVmZmVyc2l6ZTsKKwkJKnRtcCB8PSAoMTw8MzEpOworCX0KKworI2lmZGVmIERFQlVHX1JYQUxMT0MKKwlETUVTRygiUlggRklGTyBGSVhFRCIpOworCWNoZWNrX3J4YnVmKGRldik7CisjZW5kaWYKKworCXByaXYtPnJ4cmluZ3RhaWw9cHJpdi0+cnhyaW5nOworCXByaXYtPnJ4YnVmZmVyPXByaXYtPnJ4YnVmZmVyaGVhZDsKKwlwcml2LT5yeF9za2JfY29tcGxldGU9MTsKKwlzZXRfbmljX3J4cmluZyhkZXYpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1IVyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIGNoYXIgUVVBTElUWV9NQVBbXSA9IHsKKyAgMHg2NCwgMHg2NCwgMHg2NCwgMHg2MywgMHg2MywgMHg2MiwgMHg2MiwgMHg2MSwKKyAgMHg2MSwgMHg2MCwgMHg2MCwgMHg1ZiwgMHg1ZiwgMHg1ZSwgMHg1ZCwgMHg1YywKKyAgMHg1YiwgMHg1YSwgMHg1OSwgMHg1NywgMHg1NiwgMHg1NCwgMHg1MiwgMHg0ZiwKKyAgMHg0YywgMHg0OSwgMHg0NSwgMHg0MSwgMHgzYywgMHgzNywgMHgzMSwgMHgyOSwKKyAgMHgyNCwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgMHgyMiwgMHgyMiwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMCwKKyAgMHgyMCwgMHgyMCwgMHgyMCwgMHgxZiwgMHgxZiwgMHgxZSwgMHgxZSwgMHgxZSwKKyAgMHgxZCwgMHgxZCwgMHgxYywgMHgxYywgMHgxYiwgMHgxYSwgMHgxOSwgMHgxOSwKKyAgMHgxOCwgMHgxNywgMHgxNiwgMHgxNSwgMHgxNCwgMHgxMiwgMHgxMSwgMHgwZiwKKyAgMHgwZSwgMHgwYywgMHgwYSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMSwgMHgwMAorfTsKKwordW5zaWduZWQgY2hhciBTVFJFTkdUSF9NQVBbXSA9IHsKKyAgMHg2NCwgMHg2NCwgMHg2MywgMHg2MiwgMHg2MSwgMHg2MCwgMHg1ZiwgMHg1ZSwKKyAgMHg1ZCwgMHg1YywgMHg1YiwgMHg1YSwgMHg1NywgMHg1NCwgMHg1MiwgMHg1MCwKKyAgMHg0ZSwgMHg0YywgMHg0YSwgMHg0OCwgMHg0NiwgMHg0NCwgMHg0MSwgMHgzZiwKKyAgMHgzYywgMHgzYSwgMHgzNywgMHgzNiwgMHgzNiwgMHgxYywgMHgxYywgMHgxYiwKKyAgMHgxYiwgMHgxYSwgMHgxYSwgMHgxOSwgMHgxOSwgMHgxOCwgMHgxOCwgMHgxNywKKyAgMHgxNywgMHgxNiwgMHgxNiwgMHgxNSwgMHgxNSwgMHgxNCwgMHgxNCwgMHgxMywKKyAgMHgxMywgMHgxMiwgMHgxMiwgMHgxMSwgMHgxMSwgMHgxMCwgMHgxMCwgMHgwZiwKKyAgMHgwZiwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwYiwKKyAgMHgwYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwNywKKyAgMHgwNywgMHgwNiwgMHgwNiwgMHgwNSwgMHgwNCwgMHgwMywgMHgwMiwgMHgwMAorfTsKKwordm9pZCBydGw4MTgwX1JTU0lfY2FsYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcnNzaSwgdTggKnF1YWwpeworCS8vdm9pZCBNbG1lX1VwZGF0ZVJzc2lTUShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcnNzaSwgdTggKnF1YWwpeworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgdGVtcDsKKwl1MzIgdGVtcDI7CisJdTMyIHRlbXAzOworCXUzMiBsc2I7CisJdTMyIHE7CisJdTMyIG9yaWdfcXVhbDsKKwl1OCAgX3Jzc2k7CisKKwlxID0gKnF1YWw7CisJb3JpZ19xdWFsID0gKnF1YWw7CisJX3Jzc2kgPSAwOyAvLyBhdm9pZCBnY2MgY29tcGxhaW5zLi4KKworCWlmIChxIDw9IDB4NGUpIHsKKwkJdGVtcCA9IFFVQUxJVFlfTUFQW3FdOworCX0gZWxzZSB7CisJCWlmKCBxICYgMHg4MCApIHsKKwkJCXRlbXAgPSAweDMyOworCQl9IGVsc2UgeworCQkJdGVtcCA9IDE7CisJCX0KKwl9CisKKwkqcXVhbCA9IHRlbXA7CisJdGVtcDIgPSAqcnNzaTsKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKXsKKwljYXNlIFJGQ0hJUElEX1JGTUQ6CisJCWxzYiA9IHRlbXAyICYgMTsKKwkJdGVtcDIgJj0gMHg3ZTsKKwkJaWYgKCAhbHNiIHx8ICEodGVtcDIgPD0gMHgzYykgKSB7CisJCQl0ZW1wMiA9IDB4NjQ7CisJCX0gZWxzZSB7CisJCQl0ZW1wMiA9IDEwMCAqIHRlbXAyIC8gMHgzYzsKKwkJfQorCQkqcnNzaSA9IHRlbXAyICYgMHhmZjsKKwkJX3Jzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCWJyZWFrOworCWNhc2UgUkZDSElQSURfSU5URVJTSUw6CisJCWxzYiA9IHRlbXAyOworCQl0ZW1wMiAmPSAweGZmZmZmZmZlOworCQl0ZW1wMiAqPSAyNTE7CisJCXRlbXAzID0gdGVtcDI7CisJCXRlbXAyIDw8PSA2OworCQl0ZW1wMyArPSB0ZW1wMjsKKwkJdGVtcDMgPDw9IDE7CisJCXRlbXAyID0gMHg0OTUwZGY7CisJCXRlbXAyIC09IHRlbXAzOworCQlsc2IgJj0gMTsKKwkJaWYgKCB0ZW1wMiA8PSAweDNlMDAwMCApIHsKKwkJCWlmICggdGVtcDIgPCAweGZmZWYwMDAwICkKKwkJCQl0ZW1wMiA9IDB4ZmZlZjAwMDA7CisJCX0gZWxzZSB7CisJCQl0ZW1wMiA9IDB4M2UwMDAwOworCQl9CisJCWlmICggIWxzYiApIHsKKwkJCXRlbXAyIC09IDB4ZjAwMDA7CisJCX0gZWxzZSB7CisJCQl0ZW1wMiArPSAweGYwMDAwOworCQl9CisKKwkJdGVtcDMgPSAweDRkMDAwMDsKKwkJdGVtcDMgLT0gdGVtcDI7CisJCXRlbXAzICo9IDEwMDsKKwkJdGVtcDMgPSB0ZW1wMyAvIDB4NmQ7CisJCXRlbXAzID4+PSAweDEwOworCQlfcnNzaSA9IHRlbXAzICYgMHhmZjsKKwkJKnJzc2kgPSB0ZW1wMyAmIDB4ZmY7CisJCWJyZWFrOworCWNhc2UgUkZDSElQSURfR0NUOgorCSAgICAgICAgbHNiID0gdGVtcDIgJiAxOworCQl0ZW1wMiAmPSAweDdlOworCQlpZiAoICEgbHNiIHx8ICEodGVtcDIgPD0gMHgzYykgKXsKKwkJCXRlbXAyID0gMHg2NDsKKwkJfSBlbHNlIHsKKwkJCXRlbXAyID0gKDEwMCAqIHRlbXAyKSAvIDB4M2M7CisJCX0KKwkJKnJzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCV9yc3NpID0gdGVtcDIgJiAweGZmOworCQlicmVhazsKKwljYXNlIFJGQ0hJUElEX1BISUxJUFM6CisJCWlmKCBvcmlnX3F1YWwgPD0gMHg0ZSApeworCQkJX3Jzc2kgPSBTVFJFTkdUSF9NQVBbb3JpZ19xdWFsXTsKKwkJCSpyc3NpID0gX3Jzc2k7CisJCX0gZWxzZSB7CisJCQlvcmlnX3F1YWwgLT0gMHg4MDsKKwkJCWlmICggIW9yaWdfcXVhbCApeworCQkJCV9yc3NpID0gMTsKKwkJCQkqcnNzaSA9IDE7CisJCQl9IGVsc2UgeworCQkJCV9yc3NpID0gMHgzMjsKKwkJCQkqcnNzaSA9IDB4MzI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkvKiBjYXNlIDQgKi8KKwljYXNlIFJGQ0hJUElEX01BWElNOgorCQlsc2IgPSB0ZW1wMiAmIDE7CisJCXRlbXAyICY9IDB4N2U7CisJCXRlbXAyID4+PSAxOworCQl0ZW1wMiArPSAweDQyOworCQlpZiggbHNiICE9IDAgKXsKKwkJCXRlbXAyICs9IDB4YTsKKwkJfQorCQkqcnNzaSA9IHRlbXAyICYgMHhmZjsKKwkJX3Jzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCWJyZWFrOworCX0KKworCWlmICggX3Jzc2kgPCAweDY0ICl7CisJCWlmICggX3Jzc2kgPT0gMCApIHsKKwkJCSpyc3NpID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCSpyc3NpID0gMHg2NDsKKwl9CisKKwlyZXR1cm47Cit9CisKKwordm9pZCBydGw4MTgwX2lycV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJcHJpdi0+aXJxX2VuYWJsZWQgPSAxOworLyoKKwl3cml0ZV9uaWNfd29yZChkZXYsSU5UQV9NQVNLLElOVEFfUlhPSyB8IElOVEFfUlhERVNDRVJSIHwgSU5UQV9SWE9WRVJGTE9XIHxcCisJSU5UQV9UWE9WRVJGTE9XIHwgSU5UQV9ISVBSSU9SSVRZREVTQ0VSUiB8IElOVEFfSElQUklPUklUWURFU0NPSyB8XAorCUlOVEFfTk9STVBSSU9SSVRZREVTQ0VSUiB8IElOVEFfTk9STVBSSU9SSVRZREVTQ09LIHxcCisJSU5UQV9MT1dQUklPUklUWURFU0NFUlIgfCBJTlRBX0xPV1BSSU9SSVRZREVTQ09LIHwgSU5UQV9USU1FT1VUKTsKKyovCisJd3JpdGVfbmljX3dvcmQoZGV2LElOVEFfTUFTSywgcHJpdi0+aXJxX21hc2spOworfQorCisKK3ZvaWQgcnRsODE4MF9pcnFfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXdyaXRlX25pY19kd29yZChkZXYsSU1SLDApOworI2Vsc2UKKwl3cml0ZV9uaWNfd29yZChkZXYsSU5UQV9NQVNLLDApOworI2VuZGlmCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwlwcml2LT5pcnFfZW5hYmxlZCA9IDA7Cit9CisKKwordm9pZCBydGw4MTgwX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IG1vZGUpCit7CisJdTggZWNtZDsKKwllY21kPXJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpOworCWVjbWQ9ZWNtZCAmfiBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSzsKKwllY21kPWVjbWQgfCAobW9kZTw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKTsKKwllY21kPWVjbWQgJn4gKDE8PEVQUk9NX0NTX1NISUZUKTsKKwllY21kPWVjbWQgJn4gKDE8PEVQUk9NX0NLX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgZWNtZCk7Cit9CisKK3ZvaWQgcnRsODE4MF9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2JlYWNvbl90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgcnRsODE4MF91cGRhdGVfbXNyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IG1zcjsKKwl1MzIgcnhjb25mOworCisJbXNyICA9IHJlYWRfbmljX2J5dGUoZGV2LCBNU1IpOworCW1zciAmPSB+IE1TUl9MSU5LX01BU0s7CisKKwlyeGNvbmY9cmVhZF9uaWNfZHdvcmQoZGV2LFJYX0NPTkYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQltc3IgfD0gKE1TUl9MSU5LX0FESE9DPDxNU1JfTElOS19TSElGVCk7CisJCWVsc2UgaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJCW1zciB8PSAoTVNSX0xJTktfTUFTVEVSPDxNU1JfTElOS19TSElGVCk7CisJCWVsc2UgaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQkJbXNyIHw9IChNU1JfTElOS19NQU5BR0VEPDxNU1JfTElOS19TSElGVCk7CisJCWVsc2UKKwkJCW1zciB8PSAoTVNSX0xJTktfTk9ORTw8TVNSX0xJTktfU0hJRlQpOworCQlyeGNvbmYgfD0gKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKworCX1lbHNlIHsKKwkJbXNyIHw9IChNU1JfTElOS19OT05FPDxNU1JfTElOS19TSElGVCk7CisJCXJ4Y29uZiAmPSB+KDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE1TUiwgbXNyKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSWF9DT05GLCByeGNvbmYpOworCit9CisKKworCit2b2lkIHJ0bDgxODBfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZigoY2ggPiAxNCkgfHwgKGNoIDwgMSkpCisJeworCQlwcmludGsoIkluICVzOiBJbnZhbGlkIGNobmFuZWwgJWRcbiIsIF9fRlVOQ1RJT05fXywgY2gpOworCQlyZXR1cm47CisJfQorCisJcHJpdi0+Y2hhbj1jaDsKKwkvL3ByaW50aygiaW4gJXM6Y2hhbm5lbCBpcyAlZFxuIixfX0ZVTkNUSU9OX18sY2gpOworCXByaXYtPnJmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKKworfQorCisKK3ZvaWQgcnRsODE4MF9yeF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBjbWQ7CisJdTMyIHJ4Y29uZjsKKwkvKiBmb3Igbm93IHdlIGFjY2VwdCBkYXRhLCBtYW5hZ2VtZW50ICYgY3RsIGZyYW1lKi8KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlyeGNvbmY9cmVhZF9uaWNfZHdvcmQoZGV2LFJYX0NPTkYpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQUNfRklMVEVSX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9NTkdfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfREFUQV9GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9CQ0FTVF9GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9NQ0FTVF9GUkFNRV9TSElGVCk7CisvLwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NSQ0VSUl9GUkFNRV9TSElGVCk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgRE1FU0cgKCJOSUMgaW4gcHJvbWlzYyBtb2RlIik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8IFwKKwkgICBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCk7CisJfWVsc2V7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTklDTUFDX0ZSQU1FX1NISUZUKTsKKwkJaWYocHJpdi0+Y2FyZF84MTg1ID09IDApCisJCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0KKworCS8qaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0qLworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1RMX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9JQ1ZFUlJfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX1BXUl9GUkFNRV9TSElGVCk7CisJfQorCisJaWYoIHByaXYtPmNyY21vbiA9PSAxICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1JDRVJSX0ZSQU1FX1NISUZUKTsKKworCS8vaWYoIXByaXYtPmNhcmRfODE4NSl7CisJCXJ4Y29uZiA9IHJ4Y29uZiAmfiBSWF9GSUZPX1RIUkVTSE9MRF9NQVNLOworCQlyeGNvbmYgPSByeGNvbmYgfCAoUlhfRklGT19USFJFU0hPTERfTk9ORTw8UlhfRklGT19USFJFU0hPTERfU0hJRlQpOworCS8vfQorCisJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0FVVE9SRVNFVFBIWV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mICZ+IE1BWF9SWF9ETUFfTUFTSzsKKwlyeGNvbmYgPSByeGNvbmYgfCAoTUFYX1JYX0RNQV8yMDQ4PDxNQVhfUlhfRE1BX1NISUZUKTsKKworCS8vaWYoIXByaXYtPmNhcmRfODE4NSkKKwkJcnhjb25mID0gcnhjb25mIHwgUkNSX09OTFlFUkxQS1Q7CisKKwlyeGNvbmYgPSByeGNvbmYgJn4gUkNSX0NTX01BU0s7CisJaWYoIXByaXYtPmNhcmRfODE4NSkKKwkJcnhjb25mIHw9IChwcml2LT5yY3JfY3NlbnNlPDxSQ1JfQ1NfU0hJRlQpOworLy8Jcnhjb25mICY9fiAweGZmZjAwMDAwOworLy8Jcnhjb25mIHw9IDB4OTAxMDAwMDA7Ly85MDE0Zjc2ZjsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSWF9DT05GLCByeGNvbmYpOworCisJZml4X3J4X2ZpZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX1JYCisJRE1FU0coInJ4Y29uZjogJXggJXgiLHJ4Y29uZiAscmVhZF9uaWNfZHdvcmQoZGV2LFJYX0NPTkYpKTsKKyNlbmRpZgorCWNtZD1yZWFkX25pY19ieXRlKGRldixDTUQpOworCXdyaXRlX25pY19ieXRlKGRldixDTUQsY21kIHwgKDE8PENNRF9SWF9FTkFCTEVfU0hJRlQpKTsKKworCS8qIEluIHJ0bDgxMzkgZHJpdmVyIHNlZW1zIHRoYXQgRE1BIHRocmVzaG9sZCBoYXMgdG8gYmUgd3JpdHRlbgorCSAqICBhZnRlciBlbmFibGluZyBSWCwgc28gd2UgcmV3cml0ZSBSWF9DT05GSUcgcmVnaXN0ZXIKKwkgKi8KKwkvL21kZWxheSgxMDApOworLy8Jd3JpdGVfbmljX2R3b3JkKGRldiwgUlhfQ09ORiwgcnhjb25mKTsKKworfQorCisKK3ZvaWQgc2V0X25pY190eHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisvLwkJRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHhtYXByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX0JLUFJJT1JJVFlfUklOR19BRERSLCBwcml2LT50eGJrcHJpbmdkbWEpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgVFhfQkVQUklPUklUWV9SSU5HX0FERFIsIHByaXYtPnR4YmVwcmluZ2RtYSk7CisvLwkJRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHh2aXByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX1ZPUFJJT1JJVFlfUklOR19BRERSLCBwcml2LT50eHZvcHJpbmdkbWEpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHhocHJpbmdkbWEpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9CRUFDT05fUklOR19BRERSLCBwcml2LT50eGJlYWNvbnJpbmdkbWEpOworfQorCisKK3ZvaWQgcnRsODE4MF9jb250dHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHR4Y29uZjsKKwl0eGNvbmYgPSByZWFkX25pY19kd29yZChkZXYsVFhfQ09ORik7CisJdHhjb25mID0gdHhjb25mICZ+IFRYX0xPT1BCQUNLX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKFRYX0xPT1BCQUNLX0NPTlRJTlVFIDw8VFhfTE9PUEJBQ0tfU0hJRlQpOworCXdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworfQorCisKK3ZvaWQgcnRsODE4MF9jb250dHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiB0eGNvbmY7CisJdHhjb25mID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUWF9MT09QQkFDS19NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUWF9MT09QQkFDS19OT05FIDw8VFhfTE9PUEJBQ0tfU0hJRlQpOworCXdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworfQorCisKK3ZvaWQgcnRsODE4MF90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBjbWQ7CisJdTggdHhfYWdjX2N0bDsKKwl1OCBieXRlOworCXUzMiB0eGNvbmY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXR4Y29uZj0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworCisKKwlpZihwcml2LT5jYXJkXzgxODUpeworCisKKwkJYnl0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LENXX0NPTkYpOworCQlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfQ1dfU0hJRlQpOworCQlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfUkVUUllfU0hJRlQpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENXX0NPTkYsIGJ5dGUpOworCisJCXR4X2FnY19jdGwgPSByZWFkX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCk7CisJCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9HQUlOX1NISUZUKTsKKwkJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVCk7CisJCXR4X2FnY19jdGwgfD0oMTw8VFhfQUdDX0NUTF9GRUVEQkFDS19BTlQpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwsIHR4X2FnY19jdGwpOworCQkvKgorCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4NWUsIDB4MDEpOworCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgMHhmZSwgMHgxMCk7CisJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDVlLCAweDAwKTsKKwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEpOworCQkqLworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4ZWMsIDB4M2YpOyAvKiBEaXNhYmxlIGVhcmx5IFRYICovCisJfQorCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKworCQl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRDUl9QUk9CRV9OT1RJTUVTVEFNUF9TSElGVCk7CisKKwl9ZWxzZXsKKworCQlpZihod3NlcW51bSkKKwkJCXR4Y29uZj0gdHhjb25mICZ+ICgxPDxUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQpOworCQllbHNlCisJCQl0eGNvbmY9IHR4Y29uZiB8ICgxPDxUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQpOworCX0KKworCXR4Y29uZiA9IHR4Y29uZiAmfiBUWF9MT09QQkFDS19NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUWF9MT09QQkFDS19OT05FIDw8VFhfTE9PUEJBQ0tfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfRFBSRVRSWV9NQVNLOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfUlRTUkVUUllfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAocHJpdi0+cmV0cnlfZGF0YTw8VFhfRFBSRVRSWV9TSElGVCk7CisJdHhjb25mID0gdHhjb25mIHwgKHByaXYtPnJldHJ5X3J0czw8VFhfUlRTUkVUUllfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiAmfiAoMTw8VFhfTk9DUkNfU0hJRlQpOworCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJaWYocHJpdi0+aHdfcGxjcF9sZW4pCisJCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1BMQ1BfTEVOOworCQllbHNlCisJCQl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfUExDUF9MRU47CisJfWVsc2V7CisJCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfU0FUOworCX0KKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX01YRE1BX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKFRDUl9NWERNQV8yMDQ4PDxUQ1JfTVhETUFfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiB8IFRDUl9DV01JTjsKKwl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfRElTQ1c7CisKKy8vCWlmKHByaXYtPmllZWU4MDIxMS0+aHdfd2VwKQorLy8JCXR4Y29uZj10eGNvbmYgJn4gKDE8PFRYX05PSUNWX1NISUZUKTsKKy8vCWVsc2UKKwkJdHhjb25mPXR4Y29uZiB8ICgxPDxUWF9OT0lDVl9TSElGVCk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKKworCisJZml4X3R4X2ZpZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX1RYCisJRE1FU0coInR4Y29uZjogJXggJXgiLHR4Y29uZixyZWFkX25pY19kd29yZChkZXYsVFhfQ09ORikpOworI2VuZGlmCisKKwljbWQ9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNtZCB8ICgxPDxDTURfVFhfRU5BQkxFX1NISUZUKSk7CisKKy8vCW1kZWxheSgxMDApOworCXdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworLy8JI2VuZGlmCisvKgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfRE1BX1BPTExJTkcsIHByaXYtPmRtYV9wb2xsX21hc2spOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworCSovCit9CisKKwordm9pZCBydGw4MTgwX2JlYWNvbl90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwcml2LT5kbWFfcG9sbF9zdG9wX21hc2sgJj0gfihUUFBPTExTVE9QX0JRKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFBQb2xsU3RvcCwgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisjZWxzZQorCXByaXYtPmRtYV9wb2xsX21hc2sgJj1+KDE8PFRYX0RNQV9TVE9QX0JFQUNPTl9TSElGVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLHByaXYtPmRtYV9wb2xsX21hc2spOworI2VuZGlmCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7Cit9CisKKwordm9pZCBydGw4MTgwX2JlYWNvbl90eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrIHw9IFRQUE9MTFNUT1BfQlE7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRQUG9sbFN0b3AsIHByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayk7CisjZWxzZQorCXByaXYtPmRtYV9wb2xsX21hc2sgfD0gKDE8PFRYX0RNQV9TVE9QX0JFQUNPTl9TSElGVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLHByaXYtPmRtYV9wb2xsX21hc2spOworI2VuZGlmCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisKK30KKworCit2b2lkIHJ0bDgxODBfcnR4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBjbWQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDTUQsIGNtZCAmfiBcCisJCSAgICAgICAoKDE8PENNRF9SWF9FTkFCTEVfU0hJRlQpfCgxPDxDTURfVFhfRU5BQkxFX1NISUZUKSkpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEwKTsKKwkvKndoaWxlIChyZWFkX25pY19ieXRlKGRldixDTUQpICYgKDE8PENNRF9SWF9FTkFCTEVfU0hJRlQpKQorCSAgdWRlbGF5KDEwKTsKKwkqLworCisJaWYoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tiKTsKK30KKworI2lmIDAKK2ludCBhbGxvY190eF9iZWFjb25fZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwl1MzIgKnRtcDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT50eGJlYWNvbnJpbmcgPSAodTMyKilwY2lfYWxsb2NfY29uc2lzdGVudChwcml2LT5wZGV2LAorCQkJCQkgIHNpemVvZih1MzIpKjgqY291bnQsCisJCQkJCSAgJnByaXYtPnR4YmVhY29ucmluZ2RtYSk7CisJaWYgKCFwcml2LT50eGJlYWNvbnJpbmcpIHJldHVybiAtMTsKKwlmb3IgKHRtcD1wcml2LT50eGJlYWNvbnJpbmcsaT0wO2k8Y291bnQ7aSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsgLy8gZGVzY3JpcHRvciBlbXB0eSwgb3duZWQgYnkgdGhlIGRydgorCQkvKgorCQkqKHRtcCsyKSA9ICh1MzIpZG1hX3RtcDsKKwkJKih0bXArMykgPSBidWZzaXplOworCQkqLworCQlpZihpKzE8Y291bnQpCisJCQkqKHRtcCs0KSA9ICh1MzIpcHJpdi0+dHhiZWFjb25yaW5nZG1hKygoaSsxKSo4KjQpOworCQllbHNlCisJCQkqKHRtcCs0KSA9ICh1MzIpcHJpdi0+dHhiZWFjb25yaW5nZG1hOworCisJCXRtcD10bXArODsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc2hvcnQgYWxsb2NfdHhfZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZzaXplLCBpbnQgY291bnQsCisJCQkgaW50IGFkZHIpCit7CisJaW50IGk7CisJdTMyICpkZXNjOworCXUzMiAqdG1wOworCWRtYV9hZGRyX3QgZG1hX2Rlc2MsIGRtYV90bXA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcHJpdi0+cGRldjsKKwl2b2lkICpidWY7CisKKwlpZigoYnVmc2l6ZSAmIDB4ZmZmKSAhPSBidWZzaXplKSB7CisJCURNRVNHRSAoIlRYIGJ1ZmZlciBhbGxvY2F0aW9uIHRvbyBsYXJnZSIpOworCQlyZXR1cm4gMDsKKwl9CisJZGVzYyA9ICh1MzIqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJCSAgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsICZkbWFfZGVzYyk7CisJaWYoZGVzYz09TlVMTCkgcmV0dXJuIC0xOworCWlmKGRtYV9kZXNjICYgMHhmZil7CisKKwkJLyoKKwkJICogZGVzY3JpcHRvcidzIGJ1ZmZlciBtdXN0IGJlIDI1NiBieXRlIGFsaWduZWQKKwkJICogd2Ugc2hvdWxkbid0IGJlIGhlcmUsIHNpbmNlIHdlIHNldCBETUEgbWFzayAhCisJCSAqLworCQlETUVTR1coIkZpeGluZyBUWCBhbGlnbm1lbnQiKTsKKwkJZGVzYyA9ICh1MzIqKSgodTgqKWRlc2MgKyAyNTYpOworI2lmIChkZWZpbmVkKENPTkZJR19ISUdITUVNNjRHKSB8fCBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpKQorCQlkZXNjID0gKHUzMiopKCh1NjQpZGVzYyAmfiAweGZmKTsKKwkJZG1hX2Rlc2MgPSAoZG1hX2FkZHJfdCkoKHU4KilkbWFfZGVzYyArIDI1Nik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1NjQpZG1hX2Rlc2MgJn4gMHhmZik7CisjZWxzZQorCQlkZXNjID0gKHUzMiopKCh1MzIpZGVzYyAmfiAweGZmKTsKKwkJZG1hX2Rlc2MgPSAoZG1hX2FkZHJfdCkoKHU4KilkbWFfZGVzYyArIDI1Nik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1MzIpZG1hX2Rlc2MgJn4gMHhmZik7CisjZW5kaWYKKwl9CisJdG1wPWRlc2M7CisJZm9yIChpPTA7aTxjb3VudDtpKyspCisJeworCQlidWYgPSAodm9pZCopcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldixidWZzaXplLCZkbWFfdG1wKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSByZXR1cm4gLUVOT01FTTsKKworCQlzd2l0Y2goYWRkcikgeworI2lmIDAKKwkJY2FzZSBUWF9OT1JNUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4bnBidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFhfTE9XUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4bHBidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTFAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGhwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIEhQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4bWFwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRYX0JLUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4YmtwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIExQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUWF9CRVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJlcGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBOUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eHZpcGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBMUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVFhfVk9QUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHh2b3BidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGhwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIEhQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUWF9CRUFDT05fUklOR19BRERSOgorCQkgICAgICAgIGlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJlYWNvbmJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIEJQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOyAvLyBkZXNjcmlwdG9yIGVtcHR5LCBvd25lZCBieSB0aGUgZHJ2CisJCSoodG1wKzIpID0gKHUzMilkbWFfdG1wOworCQkqKHRtcCszKSA9IGJ1ZnNpemU7CisKKwkJaWYoaSsxPGNvdW50KQorCQkJKih0bXArNCkgPSAodTMyKWRtYV9kZXNjKygoaSsxKSo4KjQpOworCQllbHNlCisJCQkqKHRtcCs0KSA9ICh1MzIpZG1hX2Rlc2M7CisKKwkJdG1wPXRtcCs4OworCX0KKworCXN3aXRjaChhZGRyKSB7CisJY2FzZSBUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4bWFwcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHhtYXByaW5nPWRlc2M7CisJCWJyZWFrOworCisJY2FzZSBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUjoKKwkJcHJpdi0+dHhia3ByaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eGJrcHJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwljYXNlIFRYX0JFUFJJT1JJVFlfUklOR19BRERSOgorCQlwcml2LT50eGJlcHJpbmdkbWE9ZG1hX2Rlc2M7CisJCXByaXYtPnR4YmVwcmluZz1kZXNjOworCQlicmVhazsKKworCWNhc2UgVFhfVklQUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4dmlwcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHh2aXByaW5nPWRlc2M7CisJCWJyZWFrOworCisJY2FzZSBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUjoKKwkJcHJpdi0+dHh2b3ByaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eHZvcHJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwljYXNlIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4aHByaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eGhwcmluZz1kZXNjOworCQlicmVhazsKKworCWNhc2UgVFhfQkVBQ09OX1JJTkdfQUREUjoKKwkJcHJpdi0+dHhiZWFjb25yaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eGJlYWNvbnJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwl9CisKKyNpZmRlZiBERUJVR19UWAorCURNRVNHKCJUeCBkbWEgcGh5c2ljYWwgYWRkcmVzczogJXgiLGRtYV9kZXNjKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBmcmVlX3R4X2Rlc2NfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldj1wcml2LT5wZGV2OworCWludCBjb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eG1hcHJpbmcsIHByaXYtPnR4bWFwcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHhtYXBidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eGJrcHJpbmcsIHByaXYtPnR4YmtwcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHhia3BidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eGJlcHJpbmcsIHByaXYtPnR4YmVwcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHhiZXBidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eHZpcHJpbmcsIHByaXYtPnR4dmlwcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHh2aXBidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eHZvcHJpbmcsIHByaXYtPnR4dm9wcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHh2b3BidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eGhwcmluZywgcHJpdi0+dHhocHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4aHBidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJY291bnQgPSBwcml2LT50eGJlYWNvbmNvdW50OworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhiZWFjb25yaW5nLCBwcml2LT50eGJlYWNvbnJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4YmVhY29uYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKK30KKworI2lmIDAKK3ZvaWQgZnJlZV9iZWFjb25fZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IGNvdW50KQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2PXByaXYtPnBkZXY7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKjgqY291bnQrMjU2LAorCQkJICAgIHByaXYtPnR4YmVhY29ucmluZywgcHJpdi0+dHhiZWFjb25yaW5nZG1hKTsKKworCWlmIChwcml2LT5iZWFjb25fYnVmKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBkZXYsCisJCQlwcml2LT5tYXN0ZXJfYmVhY29uc2l6ZSxwcml2LT5iZWFjb25fYnVmLHByaXYtPmJlYWNvbmRtYWJ1Zik7CisKK30KKyNlbmRpZgordm9pZCBmcmVlX3J4X2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHByaXYtPnBkZXY7CisKKwlpbnQgY291bnQgPSBwcml2LT5yeHJpbmdjb3VudDsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+cnhyaW5nLCBwcml2LT5yeHJpbmdkbWEpOworI2Vsc2UKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKjQqY291bnQrMjU2LAorCQkJICAgIHByaXYtPnJ4cmluZywgcHJpdi0+cnhyaW5nZG1hKTsKKyNlbmRpZgorCisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+cnhidWZmZXIpLHByaXYtPnJ4YnVmZmVyc2l6ZSwwKTsKK30KKworCitzaG9ydCBhbGxvY19yeF9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGJ1ZnNpemUsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwl1MzIgKmRlc2M7CisJdTMyICp0bXA7CisJZG1hX2FkZHJfdCBkbWFfZGVzYyxkbWFfdG1wOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldj1wcml2LT5wZGV2OworCXZvaWQgKmJ1ZjsKKwl1OCByeF9kZXNjX3NpemU7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlyeF9kZXNjX3NpemUgPSA4OyAvLyA0KjggPSAzMiBieXRlcworI2Vsc2UKKwlyeF9kZXNjX3NpemUgPSA0OworI2VuZGlmCisKKwlpZigoYnVmc2l6ZSAmIDB4ZmZmKSAhPSBidWZzaXplKXsKKwkJRE1FU0dFICgiUlggYnVmZmVyIGFsbG9jYXRpb24gdG9vIGxhcmdlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXNjID0gKHUzMiopcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldixzaXplb2YodTMyKSpyeF9kZXNjX3NpemUqY291bnQrMjU2LAorCQkJCQkgICZkbWFfZGVzYyk7CisKKwlpZihkbWFfZGVzYyAmIDB4ZmYpeworCisJCS8qCisJCSAqIGRlc2NyaXB0b3IncyBidWZmZXIgbXVzdCBiZSAyNTYgYnl0ZSBhbGlnbmVkCisJCSAqIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2Ugc3BlY2lmeSB0aGUgRE1BIG1hc2sKKwkJICovCisKKwkJRE1FU0dXKCJGaXhpbmcgUlggYWxpZ25tZW50Iik7CisJCWRlc2MgPSAodTMyKikoKHU4KilkZXNjICsgMjU2KTsKKyNpZiAoZGVmaW5lZChDT05GSUdfSElHSE1FTTY0RykgfHwgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSkKKwkJZGVzYyA9ICh1MzIqKSgodTY0KWRlc2MgJn4gMHhmZik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1OCopZG1hX2Rlc2MgKyAyNTYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTY0KWRtYV9kZXNjICZ+IDB4ZmYpOworI2Vsc2UKKwkJZGVzYyA9ICh1MzIqKSgodTMyKWRlc2MgJn4gMHhmZik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1OCopZG1hX2Rlc2MgKyAyNTYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTMyKWRtYV9kZXNjICZ+IDB4ZmYpOworI2VuZGlmCisJfQorCisJcHJpdi0+cnhyaW5nPWRlc2M7CisJcHJpdi0+cnhyaW5nZG1hPWRtYV9kZXNjOworCXRtcD1kZXNjOworCisJZm9yIChpPTA7aTxjb3VudDtpKyspeworCisJCWlmICgoYnVmPSBrbWFsbG9jKGJ1ZnNpemUgKiBzaXplb2YodTgpLEdGUF9BVE9NSUMpKSA9PSBOVUxMKXsKKwkJCURNRVNHRSgiRmFpbGVkIHRvIGttYWxsb2MgUlggYnVmZmVyIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlkbWFfdG1wID0gcGNpX21hcF9zaW5nbGUocGRldixidWYsYnVmc2l6ZSAqIHNpemVvZih1OCksCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisjaWZkZWYgREVCVUdfWkVST19SWAorCQlpbnQgajsKKwkJZm9yKGo9MDtqPGJ1ZnNpemU7aisrKSAoKHU4KilidWYpW2ldID0gMDsKKyNlbmRpZgorCisJCS8vYnVmID0gKHZvaWQqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsYnVmc2l6ZSwmZG1hX3RtcCk7CisJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT5yeGJ1ZmZlciksIGJ1ZixkbWFfdG1wLAorCQkJICAgJihwcml2LT5yeGJ1ZmZlcmhlYWQpKSl7CisJCQkgICBETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gUlggYnVmIik7CisJCQkgICByZXR1cm4gLTE7CisJCX0KKwkJKnRtcCA9IDA7IC8vemVybyBwYWRzIHRoZSBoZWFkZXIgb2YgdGhlIGRlc2NyaXB0b3IKKwkJKnRtcCA9ICp0bXAgfCggYnVmc2l6ZSYweGZmZik7CisJCSoodG1wKzIpID0gKHUzMilkbWFfdG1wOworCQkqdG1wID0gKnRtcCB8KDE8PDMxKTsgLy8gZGVzY3JpcHRvciB2b2lkLCBvd25lZCBieSB0aGUgTklDCisKKyNpZmRlZiBERUJVR19SWEFMTE9DCisJCURNRVNHKCJBbGxvYyAleCBzaXplIGJ1ZmZlciwgRE1BIG1lbSBAICV4LCB2aXJ0dWFsIG1lbSBAICV4IiwKKwkJICAgICAgKHUzMikoYnVmc2l6ZSYweGZmZiksICh1MzIpZG1hX3RtcCwgKHUzMilidWYpOworI2VuZGlmCisKKwkJdG1wPXRtcCtyeF9kZXNjX3NpemU7CisJfQorCisJKih0bXAtcnhfZGVzY19zaXplKSA9ICoodG1wLXJ4X2Rlc2Nfc2l6ZSkgfCAoMTw8MzApOyAvLyB0aGlzIGlzIHRoZSBsYXN0IGRlc2NyaXB0b3IKKworCisjaWZkZWYgREVCVUdfUlhBTExPQworCURNRVNHKCJSWCBETUEgcGh5c2ljYWwgYWRkcmVzczogJXgiLGRtYV9kZXNjKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBzZXRfbmljX3J4cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IHBncmVnOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCisJcGdyZWc9cmVhZF9uaWNfYnl0ZShkZXYsIFBHU0VMRUNUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFBHU0VMRUNULCBwZ3JlZyAmfiAoMTw8UEdTRUxFQ1RfUEdfU0hJRlQpKTsKKworCS8vcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlhSSU5HX0FERFIscHJpdi0+cnhyaW5nZG1hKTsKK30KKworCit2b2lkIHJ0bDgxODBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvL3UzMiB0eGNvbmYgPSAweDgwZTAwNzA3OyAvL0ZJWE1FOiBNYWtlIG1lIHVuZGVyc3RhbmRhYmxlCisJdTggY3I7CisKKwkvL3dyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworCisJcnRsODE4MF9pcnFfZGlzYWJsZShkZXYpOworCisJY3I9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwljciA9IGNyICYgMjsKKwljciA9IGNyIHwgKDE8PENNRF9SU1RfU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldixDTUQsY3IpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKworCW1kZWxheSgyMDApOworCisJaWYocmVhZF9uaWNfYnl0ZShkZXYsQ01EKSAmICgxPDxDTURfUlNUX1NISUZUKSkKKwkJRE1FU0dXKCJDYXJkIHJlc2V0IHRpbWVvdXQhIik7CisJZWxzZQorCQlETUVTRygiQ2FyZCBzdWNjZXNzZnVsbHkgcmVzZXQiKTsKKworLy8jaWZuZGVmIENPTkZJR19SVEw4MTg1QgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9MT0FEKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgyMDApOworLy8jZW5kaWYKK30KKworaW5saW5lIHUxNiBpZWVlcmF0ZTJydGxyYXRlKGludCByYXRlKQoreworCXN3aXRjaChyYXRlKXsKKwljYXNlIDEwOgorCXJldHVybiAwOworCWNhc2UgMjA6CisJcmV0dXJuIDE7CisJY2FzZSA1NToKKwlyZXR1cm4gMjsKKwljYXNlIDExMDoKKwlyZXR1cm4gMzsKKwljYXNlIDYwOgorCXJldHVybiA0OworCWNhc2UgOTA6CisJcmV0dXJuIDU7CisJY2FzZSAxMjA6CisJcmV0dXJuIDY7CisJY2FzZSAxODA6CisJcmV0dXJuIDc7CisJY2FzZSAyNDA6CisJcmV0dXJuIDg7CisJY2FzZSAzNjA6CisJcmV0dXJuIDk7CisJY2FzZSA0ODA6CisJcmV0dXJuIDEwOworCWNhc2UgNTQwOgorCXJldHVybiAxMTsKKwlkZWZhdWx0OgorCXJldHVybiAzOworCisJfQorfQorCitzdGF0aWMgdTE2IHJ0bF9yYXRlW10gPSB7MTAsMjAsNTUsMTEwLDYwLDkwLDEyMCwxODAsMjQwLDM2MCw0ODAsNTQwLDcyMH07CitpbmxpbmUgdTE2IHJ0bDgxODBfcmF0ZTJyYXRlKHNob3J0IHJhdGUpCit7CisJaWYgKHJhdGUgPjEyKSByZXR1cm4gMTA7CisJcmV0dXJuIHJ0bF9yYXRlW3JhdGVdOworfQoraW5saW5lIHU4IHJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKHUxNiByYXRlKQoreworCWlmKCAoKHJhdGUgPD0gMTEwKSAmJiAocmF0ZSAhPSA2MCkgJiYgKHJhdGUgIT0gOTApKSB8fCAocmF0ZSA9PSAyMjApICkKKwkJcmV0dXJuIDE7CisJZWxzZSByZXR1cm4gMDsKK30KK3UxNiBOX0RCUFNPZlJhdGUodTE2IERhdGFSYXRlKTsKK3UxNiBDb21wdXRlVHhUaW1lKAorCXUxNgkJRnJhbWVMZW5ndGgsCisJdTE2CQlEYXRhUmF0ZSwKKwl1OAkJYk1hbmFnZW1lbnRGcmFtZSwKKwl1OAkJYlNob3J0UHJlYW1ibGUKKykKK3sKKwl1MTYJRnJhbWVUaW1lOworCXUxNglOX0RCUFM7CisJdTE2CUNlaWxpbmc7CisKKwlpZiggcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoRGF0YVJhdGUpICkKKwl7CisJCWlmKCBiTWFuYWdlbWVudEZyYW1lIHx8ICFiU2hvcnRQcmVhbWJsZSB8fCBEYXRhUmF0ZSA9PSAxMCApCisJCXsJLy8gbG9uZyBwcmVhbWJsZQorCQkJRnJhbWVUaW1lID0gKHUxNikoMTQ0KzQ4KyhGcmFtZUxlbmd0aCo4LyhEYXRhUmF0ZS8xMCkpKTsKKwkJfQorCQllbHNlCisJCXsJLy8gU2hvcnQgcHJlYW1ibGUKKwkJCUZyYW1lVGltZSA9ICh1MTYpKDcyKzI0KyhGcmFtZUxlbmd0aCo4LyhEYXRhUmF0ZS8xMCkpKTsKKwkJfQorCQlpZiggKCBGcmFtZUxlbmd0aCo4ICUgKERhdGFSYXRlLzEwKSApICE9IDAgKSAvL0dldCB0aGUgQ2VpbGxpbmcKKwkJCQlGcmFtZVRpbWUgKys7CisJfSBlbHNlIHsJLy84MDIuMTFnIERTU1MtT0ZETSBQTENQIGxlbmd0aCBmaWVsZCBjYWxjdWxhdGlvbi4KKwkJTl9EQlBTID0gTl9EQlBTT2ZSYXRlKERhdGFSYXRlKTsKKwkJQ2VpbGluZyA9ICgxNiArIDgqRnJhbWVMZW5ndGggKyA2KSAvIE5fREJQUworCQkJCSsgKCgoMTYgKyA4KkZyYW1lTGVuZ3RoICsgNikgJSBOX0RCUFMpID8gMSA6IDApOworCQlGcmFtZVRpbWUgPSAodTE2KSgxNiArIDQgKyA0KkNlaWxpbmcgKyA2KTsKKwl9CisJcmV0dXJuIEZyYW1lVGltZTsKK30KK3UxNiBOX0RCUFNPZlJhdGUodTE2IERhdGFSYXRlKQoreworCSB1MTYgTl9EQlBTID0gMjQ7CisKKwkgc3dpdGNoKERhdGFSYXRlKQorCSB7CisJIGNhc2UgNjA6CisJICBOX0RCUFMgPSAyNDsKKwkgIGJyZWFrOworCisJIGNhc2UgOTA6CisJICBOX0RCUFMgPSAzNjsKKwkgIGJyZWFrOworCisJIGNhc2UgMTIwOgorCSAgTl9EQlBTID0gNDg7CisJICBicmVhazsKKworCSBjYXNlIDE4MDoKKwkgIE5fREJQUyA9IDcyOworCSAgYnJlYWs7CisKKwkgY2FzZSAyNDA6CisJICBOX0RCUFMgPSA5NjsKKwkgIGJyZWFrOworCisJIGNhc2UgMzYwOgorCSAgTl9EQlBTID0gMTQ0OworCSAgYnJlYWs7CisKKwkgY2FzZSA0ODA6CisJICBOX0RCUFMgPSAxOTI7CisJICBicmVhazsKKworCSBjYXNlIDU0MDoKKwkgIE5fREJQUyA9IDIxNjsKKwkgIGJyZWFrOworCisJIGRlZmF1bHQ6CisJICBicmVhazsKKwkgfQorCisJIHJldHVybiBOX0RCUFM7Cit9CisKKy8ve2J5IGFteSAwODAzMTIKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vIAlGb3IgTmV0Z2VhciBjYXNlLCB0aGV5IHdhbnQgZ29vZC1sb29raW5nIHNpbmdhbCBzdHJlbmd0aC4KKy8vCQkyMDA0LjEyLjA1LCBieSByY25qa28uCisvLworbG9uZworTmV0Z2VhclNpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKAorCWxvbmcgTGFzdFNTLAorCWxvbmcgQ3VyclNTCisJKQoreworCWxvbmcgUmV0U1M7CisKKwkvLyBTdGVwIDEuIFNjYWxlIG1hcHBpbmcuCisJaWYoQ3VyclNTID49IDcxICYmIEN1cnJTUyA8PSAxMDApCisJeworCQlSZXRTUyA9IDkwICsgKChDdXJyU1MgLSA3MCkgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNDEgJiYgQ3VyclNTIDw9IDcwKQorCXsKKwkJUmV0U1MgPSA3OCArICgoQ3VyclNTIC0gNDApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDMxICYmIEN1cnJTUyA8PSA0MCkKKwl7CisJCVJldFNTID0gNjYgKyAoQ3VyclNTIC0gMzApOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAyMSAmJiBDdXJyU1MgPD0gMzApCisJeworCQlSZXRTUyA9IDU0ICsgKEN1cnJTUyAtIDIwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNSAmJiBDdXJyU1MgPD0gMjApCisJeworCQlSZXRTUyA9IDQyICsgKCgoQ3VyclNTIC0gNSkgKiAyKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSA0KQorCXsKKwkJUmV0U1MgPSAzNjsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMykKKwl7CisJCVJldFNTID0gMjc7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDIpCisJeworCQlSZXRTUyA9IDE4OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAxKQorCXsKKwkJUmV0U1MgPSA5OworCX0KKwllbHNlCisJeworCQlSZXRTUyA9IEN1cnJTUzsKKwl9CisJLy9SVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsICgiIyMjIyMgQWZ0ZXIgTWFwcGluZzogIExhc3RTUzogJWQsIEN1cnJTUzogJWQsIFJldFNTOiAlZFxuIiwgTGFzdFNTLCBDdXJyU1MsIFJldFNTKSk7CisKKwkvLyBTdGVwIDIuIFNtb290aGluZy4KKwlpZihMYXN0U1MgPiAwKQorCXsKKwkJUmV0U1MgPSAoKExhc3RTUyAqIDUpICsgKFJldFNTKSsgNSkgLyA2OworCX0KKwkvL1JUX1RSQUNFKENPTVBfREJHLCBEQkdfTE9VRCwgKCIkJCQkJCBBZnRlciBTbW9vdGhpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJcmV0dXJuIFJldFNTOworfQorLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVRyYW5zbGF0ZSAwLTEwMCBzaWduYWwgc3RyZW5ndGggaW5kZXggaW50byBkQm0uCisvLworbG9uZworVHJhbnNsYXRlVG9EYm04MTg1KAorCXU4IFNpZ25hbFN0cmVuZ3RoSW5kZXgJLy8gMC0xMDAgaW5kZXguCisJKQoreworCWxvbmcJU2lnbmFsUG93ZXI7IC8vIGluIGRCbS4KKworCS8vIFRyYW5zbGF0ZSB0byBkQm0gKHg9MC41eS05NSkuCisJU2lnbmFsUG93ZXIgPSAobG9uZykoKFNpZ25hbFN0cmVuZ3RoSW5kZXggKyAxKSA+PiAxKTsKKwlTaWduYWxQb3dlciAtPSA5NTsKKworCXJldHVybiBTaWduYWxQb3dlcjsKK30KKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlQZXJmb3JtIHNpZ25hbCBzbW9vdGhpbmcgZm9yIGR5bmFtaWMgbWVjaGFuaXNtLgorLy8JCVRoaXMgaXMgZGlmZmVyZW50IHdpdGggUGVyZm9ybVNpZ25hbFNtb290aGluZzgxODUgaW4gc21vb3RoaW5nIGZvbXVsYS4KKy8vCQlObyBkcmFtYXRpYyBhZGp1c3Rpb24gaXMgYXBwbHkgYmVjYXVzZSBkeW5hbWljIG1lY2hhbmlzbSBuZWVkIHNvbWUgZGVncmVlCisvLwkJb2YgY29ycmVjdG5lc3MuIFBvcnRlZCBmcm9tIDgxODdCLgorLy8JMjAwNy0wMi0yNiwgYnkgQnJ1Y2UuCisvLwordm9pZAorUGVyZm9ybVVuZGVjb3JhdGVkU2lnbmFsU21vb3RoaW5nODE4NSgKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwKKwlib29sICAgIGJDY2tSYXRlCisJKQoreworCisKKwkvLyBEZXRlcm1pbiB0aGUgY3VycmVudCBwYWNrZXQgaXMgQ0NLIHJhdGUuCisJcHJpdi0+YkN1ckNDS1BrdCA9IGJDY2tSYXRlOworCisJaWYocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID49IDApCisJeworCQlwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPSAoIChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgKiA1KSArIChwcml2LT5TaWduYWxTdHJlbmd0aCAqIDEwKSApIC8gNjsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gcHJpdi0+U2lnbmFsU3RyZW5ndGggKiAxMDsKKwl9CisKKwlwcml2LT5VbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlciA9ICggKHByaXYtPlVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyICogNTApICsgKHByaXYtPlJ4UG93ZXIqIDExKSkgLyA2MDsKKworLy8JcHJpbnRrKCJTb21tdGhpbmcgU2lnbmFsU3Rlcm5ndGggKCVkKSA9PiBVbmRlY29yYXRlZFNtb290aGVkU1MgKCVkKVxuIiwgcHJpdi0+U2lnbmFsU3RyZW5ndGgsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyk7CisvLwlwcmludGsoIlNvbW10aGluZyBSeFBvd2VyICglZCkgPT4gVW5kZWNvcmF0ZWRSeFBvd2VyICglZClcbiIsIHByaXYtPlJ4UG93ZXIsIHByaXYtPlVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyKTsKKworCS8vaWYocHJpdi0+Q3VyQ0NLUlNTSSA+PSAwICYmIGJDY2tSYXRlKQorCWlmKGJDY2tSYXRlKQorCXsKKwkJcHJpdi0+Q3VyQ0NLUlNTSSA9IHByaXYtPlJTU0k7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPkN1ckNDS1JTU0kgPSAwOworCX0KKworCS8vIEJvdW5kYXJ5IGNoZWNraW5nLgorCS8vIFRPRE86IFRoZSBvdmVyZmxvdyBjb25kaXRpb24gZG9lcyBoYXBwZW4sIGlmIHdlIHdhbnQgdG8gZml4LAorCS8vIHdlIHNoYWxsIHJlY2FsY3VsYXRlIHRocmVzaG9sZHMgZmlyc3QuCisJaWYocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID4gMTAwKQorCXsKKy8vCQlwcmludGsoIlVuZGVjb3JhdGVkU21vb3RoZWRTUyglZCkgb3ZlcmZsb3csIFNpZ25hbFN0cmVuZ3RoKCVkKVxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBwcml2LT5TaWduYWxTdHJlbmd0aCk7CisJfQorCWlmKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA8IDApCisJeworLy8JCXByaW50aygiVW5kZWNvcmF0ZWRTbW9vdGhlZFNTKCVkKSB1bmRlcmZsb3csIFNpZ25hbFN0cmVuZ3RoKCVkKVxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBwcml2LT5TaWduYWxTdHJlbmd0aCk7CisJfQorCit9CisKKy8vYnkgYW15IDA4MDMxMn0KKworLyogVGhpcyBpcyByb3VnaCBSWCBpc3IgaGFuZGxpbmcgcm91dGluZSovCit2b2lkIHJ0bDgxODBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnRtcF9za2I7CisKKwkvL3N0cnVjdCBza19idWZmICpza2I7CisJc2hvcnQgZmlyc3QsbGFzdDsKKwl1MzIgbGVuOworCWludCBsYXN0bGVuOworCXVuc2lnbmVkIGNoYXIgcXVhbGl0eSwgc2lnbmFsOworCXU4IHJhdGU7CisJLy91MzIgKnByaXNtX2hkcjsKKwl1MzIgKnRtcCwqdG1wMjsKKwl1OCByeF9kZXNjX3NpemU7CisJdTggcGFkZGluZzsKKwkvL3UzMiBjb3VudD0wOworCWNoYXIgcnhwb3dlciA9IDA7CisJdTMyIFJYQUdDID0gMDsKKwlsb25nIFJ4QUdDX2RCbSA9IDA7CisJdTgJTE5BPTAsIEJCPTA7CisJdTggCUxOQV9nYWluWzRdPXswMiwgMTcsIDI5LCAzOX07CisJdTggIEFudGVubmEgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ly9ieSBhbXkKKwl1MTYgZmMsdHlwZTsKKwl1OCBiSHdFcnJvciA9IDAsYkNSQyA9IDAsYklDViA9IDA7CisJLy9iSHdFcnJvciA9IDA7CisJLy9iQ1JDID0gMDsKKwkvL2JJQ1YgPSAwOworCWJvb2wJYkNja1JhdGUgPSBmYWxzZTsKKwl1OCAgICAgUlNTSSA9IDA7CisJbG9uZwlTaWduYWxTdHJlbmd0aEluZGV4ID0gMDsvLytieSBhbXkgMDgwMzEyCisvLwl1OCBTaWduYWxTdHJlbmd0aCA9IDA7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyBzdGF0cyA9IHsKKwkJLnNpZ25hbCA9IDAsCisJCS5ub2lzZSA9IC05OCwKKwkJLnJhdGUgPSAwLAorCS8vCS5tYWNfdGltZSA9IGppZmZpZXMsCisJCS5mcmVxID0gSUVFRTgwMjExXzI0R0haX0JBTkQsCisJfTsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXN0YXRzLm5pY190eXBlID0gTklDXzgxODVCOworCXJ4X2Rlc2Nfc2l6ZSA9IDg7CisKKyNlbHNlCisJc3RhdHMubmljX3R5cGUgPSBOSUNfODE4NTsKKwlyeF9kZXNjX3NpemUgPSA0OworI2VuZGlmCisJLy9wcmludGsoInJlY2VpdmUgZnJhbWUhJWRcbiIsY291bnQrKyk7CisJLy9pZiAoIXByaXYtPnJ4YnVmZmVyKSBETUVTRyAoIkVFOiBOSUMgUlggYWNrLCBidXQgUlggcXVldWUgY29ycnVwdGVkISIpOworCS8vZWxzZSB7CisKKwlpZiAoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYgKDE8PDMxKSkgeworCisJCS8qIHdlIGhhdmUgZ290IGFuIFJYIGludCwgYnV0IHRoZSBkZXNjcmlwdG9yCisJCSAqIHdlIGFyZSBwb2ludGluZyBpcyBlbXB0eSovCisKKwkJcHJpdi0+c3RhdHMucnhub2RhdGErKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCS8qCWlmICghICoocHJpdi0+cnhyaW5nKSAmICgxPDwzMSkpIHsKKworCQkJcHJpdi0+c3RhdHMucnhyZXNldCsrOworCQkJcHJpdi0+cnhyaW5ndGFpbD1wcml2LT5yeHJpbmc7CisJCQlwcml2LT5yeGJ1ZmZlcj1wcml2LT5yeGJ1ZmZlcmhlYWQ7CisKKwkJfWVsc2V7Ki8KKworCQkjaWYgMAorCQkvKiBNYXliZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBOSUMgaGFzIHNraXBwZWQgc29tZSBkZXNjcmlwdG9ycyBvcgorCQkgKiBpdCBoYXMgcmVzZXQgaXRzIGludGVybmFsIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmluZworCQkgKiB3ZSBzZWFyY2ggZm9yIHRoZSBmaXJzdCBmaWxsZWQgZGVzY3JpcHRvciBpbiB0aGUgcmluZywgb3Igd2UgYnJlYWsKKwkJICogcHV0dGluZyBhZ2FpbiB0aGUgcG9pbnRlciBpbiB0aGUgb2xkIGxvY2F0aW9uIGlmIHdlIGRvIG5vdCBmb3VuZCBhbnkuCisJCSAqIFRoaXMgaXMgcXVpdGUgZGFuZ2Vyb3VzLCB3aGF0IGRvZXMgaGFwcGVuIGlmIHRoZSBuaWMgd3JpdGVzCisJCSAqIHR3byBkZXNjcmlwdG9yIChzYXkgQSBhbmQgQikgd2hlbiB3ZSBoYXZlIGp1c3QgY2hlY2tlZCB0aGUgZGVzY3JpcHRvcgorCQkgKiBBIGFuZCB3ZSBhcmUgZ29pbmcgdG8gY2hlY2sgdGhlIGRlc2NyaXB0b3IgQi4uVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlCisJCSAqIGludGVycnVwdCB3YXMgZHVtbXksIHRoZXJlIHdhcyBub3QgcmVhbGx5IGZpbGxlZCBkZXNjcmlwdG9ycyBhbmQKKwkJICogdGhlIE5JQyBkaWRuJ3QgbG9zZSBwb2ludGVyCisJCSAqLworCisJCS8vcHJpdi0+c3RhdHMucnh3cmthcm91bmQrKzsKKworCQl0bXAgPSBwcml2LT5yeHJpbmd0YWlsOworCQl3aGlsZSAoKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwzMSkpeworCisJCQlwcml2LT5yeHJpbmd0YWlsKz00OworCisJCQlpZihwcml2LT5yeHJpbmd0YWlsID49CisJCQkJKHByaXYtPnJ4cmluZykrKHByaXYtPnJ4cmluZ2NvdW50ICkqNCkKKwkJCQlwcml2LT5yeHJpbmd0YWlsPXByaXYtPnJ4cmluZzsKKworCQkJcHJpdi0+cnhidWZmZXI9KHByaXYtPnJ4YnVmZmVyLT5uZXh0KTsKKworCQkJaWYocHJpdi0+cnhyaW5ndGFpbCA9PSB0bXAgKXsKKwkJCQkvL0RNRVNHKCJFRTogQ291bGQgbm90IGZpbmQgUlggcG9pbnRlciIpOworCQkJCXByaXYtPnN0YXRzLnJ4bm9wb2ludGVyKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJI2Vsc2UKKworCQl0bXAyID0gTlVMTDsKKwkJdG1wID0gcHJpdi0+cnhyaW5ndGFpbDsKKwkJZG97CisJCQlpZih0bXAgPT0gcHJpdi0+cnhyaW5nKQorCQkJCS8vdG1wICA9IHByaXYtPnJ4cmluZyArIChwcml2LT5yeHJpbmdjb3VudCApKnJ4X2Rlc2Nfc2l6ZTsgeGlvbmctMjAwNi0xMS0xNQorCQkJCXRtcCAgPSBwcml2LT5yeHJpbmcgKyAocHJpdi0+cnhyaW5nY291bnQgLSAxKSpyeF9kZXNjX3NpemU7CisJCQllbHNlCisJCQkJdG1wIC09IHJ4X2Rlc2Nfc2l6ZTsKKworCQkJaWYoISAoKnRtcCAmICgxPDwzMSkpKQorCQkJCXRtcDIgPSB0bXA7CisJCX13aGlsZSh0bXAgIT0gcHJpdi0+cnhyaW5nKTsKKworCQlpZih0bXAyKSBwcml2LT5yeHJpbmd0YWlsID0gdG1wMjsKKwkJI2VuZGlmCisJCS8vfQorCX0KKworCS8qIHdoaWxlIHRoZXJlIGFyZSBmaWxsZWQgZGVzY3JpcHRvcnMgKi8KKwl3aGlsZSghKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MzEpKSl7CisJCWlmKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MjYpKQorCQkJRE1FU0dXKCJSWCBidWZmZXIgb3ZlcmZsb3ciKTsKKwkJaWYoKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwxMikpCisJCQlwcml2LT5zdGF0cy5yeGljdmVycisrOworCisJCWlmKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MjcpKXsKKwkJCXByaXYtPnN0YXRzLnJ4ZG1hZmFpbCsrOworCQkJLy9ETUVTRygiRUU6IFJYIERNQSBGQUlMRUQgYXQgYnVmZmVyIHBvaW50ZWQgYnkgZGVzY3JpcHRvciAleCIsKHUzMilwcml2LT5yeHJpbmd0YWlsKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwcml2LT5wZGV2LAorCQkJCSAgICBwcml2LT5yeGJ1ZmZlci0+ZG1hLAorCQkJCSAgICBwcml2LT5yeGJ1ZmZlcnNpemUgKiBcCisJCQkJICAgIHNpemVvZih1OCksCisJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJZmlyc3QgPSAqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDI5KSA/IDE6MDsKKwkJaWYoZmlyc3QpIHByaXYtPnJ4X3ByZXZsZW49MDsKKworCQlsYXN0ID0gKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwyOCkgPyAxOjA7CisJCWlmKGxhc3QpeworCQkJbGFzdGxlbj0oKCpwcml2LT5yeHJpbmd0YWlsKSAmMHhmZmYpOworCisJCQkvKiBpZiB0aGUgbGFzdCBkZXNjcmlwdG9yICh0aGF0IHNob3VsZAorCQkJICogdGVsbCB1cyB0aGUgdG90YWwgcGFja2V0IGxlbikgdGVsbAorCQkJICogdXMgc29tZXRoaW5nIGxlc3MgdGhhbiB0aGUgZGVzY3JpcHRvcnMKKwkJCSAqIGxlbiB3ZSBoYWQgdW50aWwgbm93LCB0aGVuIHRoZXJlIGlzIHNvbWUKKwkJCSAqIHByb2JsZW0uLgorCQkJICogd29ya2Fyb3VuZCB0byBwcmV2ZW50IGtlcm5lbCBwYW5pYworCQkJICovCisJCQlpZihsYXN0bGVuIDwgcHJpdi0+cnhfcHJldmxlbikKKwkJCQlsZW49MDsKKwkJCWVsc2UKKwkJCQlsZW49bGFzdGxlbi1wcml2LT5yeF9wcmV2bGVuOworCisJCQlpZigqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDEzKSkgeworLy9sYXN0bGVuPSgoKnByaXYtPnJ4cmluZ3RhaWwpICYweGZmZik7CisJCQkJaWYgKCgqKHByaXYtPnJ4cmluZ3RhaWwpICYgMHhmZmYpIDw1MDApCisJCQkJCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWluKys7CisJCQkJZWxzZSBpZiAoKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAweDBmZmYpID4xMDAwKQorCQkJCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1heCsrOworCQkJCWVsc2UKKwkJCQkJcHJpdi0+c3RhdHMucnhjcmNlcnJtaWQrKzsKKworCQkJfQorCisJCX1lbHNleworCQkJbGVuID0gcHJpdi0+cnhidWZmZXJzaXplOworCQl9CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJaWYoZmlyc3QgJiYgbGFzdCkgeworCQkJcGFkZGluZyA9ICgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSYoMHgwNDAwMDAwMCkpPj4yNjsKKwkJfWVsc2UgaWYoZmlyc3QpIHsKKwkJCXBhZGRpbmcgPSAoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkmKDB4MDQwMDAwMDApKT4+MjY7CisJCQlpZihwYWRkaW5nKSB7CisJCQkJbGVuIC09IDI7CisJCQl9CisJCX1lbHNlIHsKKwkJCXBhZGRpbmcgPSAwOworCQl9CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7CisjZW5kaWYKKyNlbmRpZgorCQlwcml2LT5yeF9wcmV2bGVuKz1sZW47CisKKwkJaWYocHJpdi0+cnhfcHJldmxlbiA+IE1BWF9GUkFHX1RIUkVTSE9MRCArIDEwMCl7CisJCQkvKiBIVyBpcyBwcm9iYWJseSBwYXNzaW5nIHNldmVyYWwgYnVnZ3kgZnJhbWVzCisJCQkqIHdpdGhvdXQgRkQgb3IgTEQgZmxhZyBzZXQuCisJCQkqIFRocm93IHRoaXMgZ2FyYmFnZSBhd2F5IHRvIHByZXZlbnQgc2tiCisJCQkqIG1lbW9yeSBleGF1c3RpbmcKKwkJCSovCisJCQlpZighcHJpdi0+cnhfc2tiX2NvbXBsZXRlKQorCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CisJCQlwcml2LT5yeF9za2JfY29tcGxldGUgPSAxOworCQl9CisKKyNpZmRlZiBERUJVR19SWF9GUkFHCisJCURNRVNHKCJJdGVyYXRpb24uLiBsZW4gJXgiLGxlbik7CisJCWlmKGZpcnN0KSBETUVTRyAoIkZpcnN0IGRlc2NyaXB0b3IiKTsKKwkJaWYobGFzdCkgRE1FU0coIkxhc3QgZGVzY3JpcHRvciIpOworCisjZW5kaWYKKyNpZmRlZiBERUJVR19SWF9WRVJCT1NFCisJCXByaW50X2J1ZmZlciggcHJpdi0+cnhidWZmZXItPmJ1ZiwgbGVuKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCXNpZ25hbD0odW5zaWduZWQgY2hhcikoKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpJiAoMHgwMGZmMDAwMCkpPj4xNik7CisJCXNpZ25hbD0oc2lnbmFsJjB4ZmUpPj4xOwkvLyBNb2RpZnkgYnkgaGlrYXJ1IDYuNgorCisJCXF1YWxpdHk9KHVuc2lnbmVkIGNoYXIpKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpICYgKDB4ZmYpKTsKKworCQlzdGF0cy5tYWNfdGltZVswXSA9ICoocHJpdi0+cnhyaW5ndGFpbCsxKTsKKwkJc3RhdHMubWFjX3RpbWVbMV0gPSAqKHByaXYtPnJ4cmluZ3RhaWwrMik7CisJCXJ4cG93ZXIgPSgoY2hhcikoKCgqKHByaXYtPnJ4cmluZ3RhaWwrNCkpJiAoMHgwMGZmMDAwMCkpPj4xNikpLzIgLSA0MjsKKwkJUlNTSSA9ICgodTgpKCgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSAmICgweDAwMDBmZjAwKSk+PiA4KSkgJiAoMHg3Zik7CisKKyNlbHNlCisJCXNpZ25hbD0oKCoocHJpdi0+cnhyaW5ndGFpbCsxKSkmICgweGZmMDAwMCkpPj4xNjsKKwkJc2lnbmFsPShzaWduYWwmMHhmZSk+PjE7CS8vIE1vZGlmeSBieSBoaWthcnUgNi42CisKKwkJcXVhbGl0eT0oKCoocHJpdi0+cnhyaW5ndGFpbCsxKSkgJiAoMHhmZikpOworCisJCXN0YXRzLm1hY190aW1lWzBdID0gKihwcml2LT5yeHJpbmd0YWlsKzIpOworCQlzdGF0cy5tYWNfdGltZVsxXSA9ICoocHJpdi0+cnhyaW5ndGFpbCszKTsKKyNlbmRpZgorCQlyYXRlPSgoKihwcml2LT5yeHJpbmd0YWlsKSkgJgorCQkJKCgxPDwyMyl8KDE8PDIyKXwoMTw8MjEpfCgxPDwyMCkpKT4+MjA7CisKKwkJc3RhdHMucmF0ZSA9IHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpOworCQkvL0RNRVNHKCIlZCIscmF0ZSk7CisJCUFudGVubmEgPSAoKCgqKHByaXYtPnJ4cmluZ3RhaWwgKzMpKSYgKDB4MDAwMDgwMDApKSA9PSAwICk/IDA6MSA7CisvLwkJcHJpbnRrKCJpbiBydGw4MTgwX3J4KCk6QW50ZW5uYSBpcyAlZFxuIixBbnRlbm5hKTsKKy8vYnkgYW15IGZvciBhbnRlbm5hCisJCWlmKCFydGw4MTgwX0lzV2lyZWxlc3NCTW9kZShzdGF0cy5yYXRlKSkKKwkJeyAvLyBPRkRNIHJhdGUuCisKKwkJCVJ4QUdDX2RCbSA9IHJ4cG93ZXIrMTsJLy9iaWFzCisJCX0KKwkJZWxzZQorCQl7IC8vIENDSyByYXRlLgorCQkJUnhBR0NfZEJtID0gc2lnbmFsOy8vYml0IDAgZGlzY2FyZAorCisJCQlMTkEgPSAodTgpIChSeEFHQ19kQm0gJiAweDYwICkgPj4gNSA7IC8vYml0IDZ+IGJpdCA1CisJCQlCQiAgPSAodTgpIChSeEFHQ19kQm0gJiAweDFGKTsgIC8vIGJpdCA0IH4gYml0IDAKKworICAgCQkJUnhBR0NfZEJtID0gLSggTE5BX2dhaW5bTE5BXSArIChCQiAqMikgKTsgLy9QaW5fMTFiPS0oTE5BX2dhaW4rQkJfZ2FpbikgKGRCbSkKKworCQkJUnhBR0NfZEJtICs9NDsgLy9iaWFzCisJCX0KKworCQlpZihSeEFHQ19kQm0gJiAweDgwKSAvL2Fic29sdXRlIHZhbHVlCisgICAJCQlSWEFHQz0gfihSeEFHQ19kQm0pKzE7CisJCWJDY2tSYXRlID0gcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoc3RhdHMucmF0ZSk7CisJCS8vIFRyYW5zbGF0ZSBSWEFHQyBpbnRvIDEtMTAwLgorCQlpZighcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoc3RhdHMucmF0ZSkpCisJCXsgLy8gT0ZETSByYXRlLgorCQkJaWYoUlhBR0M+OTApCisJCQkJUlhBR0M9OTA7CisJCQllbHNlIGlmKFJYQUdDPDI1KQorCQkJCVJYQUdDPTI1OworCQkJUlhBR0M9KDkwLVJYQUdDKSoxMDAvNjU7CisJCX0KKwkJZWxzZQorCQl7IC8vIENDSyByYXRlLgorCQkJaWYoUlhBR0M+OTUpCisJCQkJUlhBR0M9OTU7CisJCQllbHNlIGlmKFJYQUdDPDMwKQorCQkJCVJYQUdDPTMwOworCQkJUlhBR0M9KDk1LVJYQUdDKSoxMDAvNjU7CisJCX0KKwkJcHJpdi0+U2lnbmFsU3RyZW5ndGggPSAodTgpUlhBR0M7CisJCXByaXYtPlJlY3ZTaWduYWxQb3dlciA9IFJ4QUdDX2RCbSA7ICAvLyBJdCBjYW4gdXNlIGRpcmVjdGx5IGJ5IFNEMyBDTUxpbgorCQlwcml2LT5SeFBvd2VyID0gcnhwb3dlcjsKKwkJcHJpdi0+UlNTSSA9IFJTU0k7CisvL3tieSBhbXkgMDgwMzEyCisJCS8vIFNRIHRyYW5zbGF0aW9uIGZvcm11bGFyIGlzIHByb3ZpZGVkIGJ5IFNEMyBEWi4gMjAwNi4wNi4yNywgYnkgcmNuamtvLgorCQlpZihxdWFsaXR5ID49IDEyNykKKwkJCXF1YWxpdHkgPSAxOy8vMDsgLy8wIHdpbGwgY2F1c2UgZXBjIHRvIHNob3cgc2lnbmFsIHplcm8gLCB3YWxrIGFyb3VkIG5vdzsKKwkJZWxzZSBpZihxdWFsaXR5IDwgMjcpCisJCQlxdWFsaXR5ID0gMTAwOworCQllbHNlCisJCQlxdWFsaXR5ID0gMTI3IC0gcXVhbGl0eTsKKwkJcHJpdi0+U2lnbmFsUXVhbGl0eSA9IHF1YWxpdHk7CisJCWlmKCFwcml2LT5jYXJkXzgxODUpCisJCQlwcmludGsoImNoZWNrIHlvdXIgY2FyZCB0eXBlXG4iKTsKKworCQlzdGF0cy5zaWduYWwgPSAodTgpcXVhbGl0eTsvL3ByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gcHJpdi0+U2lnbmFsU3RyZW5ndGg7CisJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gUlhBR0M7CisJCWlmKHN0YXRzLnNpZ25hbHN0cmVuZ3RoID4gMTAwKQorCQkJc3RhdHMuc2lnbmFsc3RyZW5ndGggPSAxMDA7CisJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gKHN0YXRzLnNpZ25hbHN0cmVuZ3RoICogNzApLzEwMCArIDMwOworCS8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT0+cnggOiBSWEFHQyBpcyAlZCxzaWduYWxzdHJlbmd0aCBpcyAlZFxuIixSWEFHQyxzdGF0cy5zaWduYWxzdHJlbmd0aCk7CisJCXN0YXRzLnJzc2kgPSBwcml2LT53c3RhdHMucXVhbC5xdWFsID0gcHJpdi0+U2lnbmFsUXVhbGl0eTsKKwkJc3RhdHMubm9pc2UgPSBwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9IDEwMCAtIHByaXYgLT53c3RhdHMucXVhbC5xdWFsOworLy9ieSBhbXkgMDgwMzEyfQorCQliSHdFcnJvciA9ICgoKCoocHJpdi0+cnhyaW5ndGFpbCkpJiAoMHgwMDAwMGZmZikpID09IDQwODApfCAoKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSYgKDB4MDQwMDAwMDApKSAhPSAwICkKKwkJCXwgKCgoKihwcml2LT5yeHJpbmd0YWlsKSkmICgweDA4MDAwMDAwKSkgIT0gMCApfCAoKCh+KCoocHJpdi0+cnhyaW5ndGFpbCkpKSYgKDB4MTAwMDAwMDApKSAhPSAwICl8ICgoKH4oKihwcml2LT5yeHJpbmd0YWlsKSkpJiAoMHgyMDAwMDAwMCkpICE9IDAgKTsKKwkJYkNSQyA9ICgoKihwcml2LT5yeHJpbmd0YWlsKSkgJiAoMHgwMDAwMjAwMCkpID4+IDEzOworCQliSUNWID0gKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmICgweDAwMDAxMDAwKSkgPj4gMTI7CisgICAgICAgICAgICBoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwcml2LT5yeGJ1ZmZlci0+YnVmOworCQkgICAgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJICAgICAgICB0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisKKwkJCWlmKChJRUVFODAyMTFfRlRZUEVfQ1RMICE9IHR5cGUpICYmCisJCQkJKGVxTWFjQWRkcihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUyk/IGhkci0+YWRkcjEgOiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgKT8gaGRyLT5hZGRyMiA6IGhkci0+YWRkcjMpKQorCQkJCSAmJiAoIWJId0Vycm9yKSAmJiAoIWJDUkMpJiYgKCFiSUNWKSkKKwkJCXsKKy8vYnkgYW15IDA4MDMxMgorCQkJCS8vIFBlcmZvcm0gc2lnbmFsIHNtb290aGluZyBmb3IgZHluYW1pYyBtZWNoYW5pc20gb24gZGVtYW5kLgorCQkJCS8vIFRoaXMgaXMgZGlmZmVyZW50IHdpdGggUGVyZm9ybVNpZ25hbFNtb290aGluZzgxODUgaW4gc21vb3RoaW5nIGZvbXVsYS4KKwkJCQkvLyBObyBkcmFtYXRpYyBhZGp1c3Rpb24gaXMgYXBwbHkgYmVjYXVzZSBkeW5hbWljIG1lY2hhbmlzbSBuZWVkIHNvbWUgZGVncmVlCisJCQkJLy8gb2YgY29ycmVjdG5lc3MuIDIwMDcuMDEuMjMsIGJ5IHNoaWVuIGNoYW5nLgorCQkJCVBlcmZvcm1VbmRlY29yYXRlZFNpZ25hbFNtb290aGluZzgxODUocHJpdixiQ2NrUmF0ZSk7CisJCQkJLy8KKwkJCQkvLyBGb3IgZ29vZC1sb29raW5nIHNpbmdhbCBzdHJlbmd0aC4KKwkJCQkvLworCQkJCVNpZ25hbFN0cmVuZ3RoSW5kZXggPSBOZXRnZWFyU2lnbmFsU3RyZW5ndGhUcmFuc2xhdGUoCisJCQkJCQkJCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCwKKwkJCQkJCQkJcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCisJCQkJcHJpdi0+TGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50ID0gU2lnbmFsU3RyZW5ndGhJbmRleDsKKwkJCQlwcml2LT5TdGF0c19TaWduYWxTdHJlbmd0aCA9IFRyYW5zbGF0ZVRvRGJtODE4NSgodTgpU2lnbmFsU3RyZW5ndGhJbmRleCk7CisJCS8vCisJCS8vIFdlIG5lZWQgbW9yZSBjb3JyZWN0IHBvd2VyIG9mIHJlY2VpdmVkIHBhY2tldHMgYW5kIHRoZSAgIlNpZ25hbFN0cmVuZ3RoIiBvZiBSeFN0YXRzIGlzIGJlYXV0aWZpZWQsCisJCS8vIHNvIHdlIHJlY29yZCB0aGUgY29ycmVjdCBwb3dlciBoZXJlLgorCQkvLworCQkJCXByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgPShsb25nKSAocHJpdi0+U3RhdHNfU2lnbmFsUXVhbGl0eSAqIDUgKyAobG9uZylwcml2LT5TaWduYWxRdWFsaXR5ICsgNSkgLyA2OworCQkJCXByaXYtPlN0YXRzX1JlY3ZTaWduYWxQb3dlciA9IChsb25nKShwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgKiA1ICsgcHJpdi0+UmVjdlNpZ25hbFBvd2VyIC0xKSAvIDY7CisKKwkJLy8gRmlndXJlIG91dCB3aGljaCBhbnRlbm5hIHRoYXQgcmVjZWl2ZWQgdGhlIGxhc3RlZCBwYWNrZXQuCisJCQkJcHJpdi0+TGFzdFJ4UGt0QW50ZW5uYSA9IEFudGVubmEgPyAxIDogMDsgLy8gMDogYXV4LCAxOiBtYWluLgorLy9ieSBhbXkgMDgwMzEyCisJCQkgICAgU3dBbnRlbm5hRGl2ZXJzaXR5UnhPazgxODUoZGV2LCBwcml2LT5TaWduYWxTdHJlbmd0aCk7CisJCQl9CisKKy8vYnkgYW15IGZvciBhbnRlbm5hCisKKworCisKKworCisjaWZuZGVmIERVTU1ZX1JYCisJCWlmKGZpcnN0KXsKKwkJCWlmKCFwcml2LT5yeF9za2JfY29tcGxldGUpeworCQkJCS8qIHNlZW1zIHRoYXQgSFcgc29tZXRpbWVzIGZhaWxzIHRvIHJlaWNldmUgYW5kCisJCQkJICAgZG9lc24ndCBwcm92aWRlIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygiZ29pbmcgdG8gZnJlZSBpbmNvbXBsZXRlIHNrYiIpOworI2VuZGlmCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tiKTsKKwkJCQlwcml2LT5zdGF0cy5yeG5vbGFzdCsrOworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJmcmVlIGluY29tcGxldGUgc2tiIE9LIik7CisjZW5kaWYKKwkJCX0KKwkJCS8qIHN1cHBvcnQgZm9yIHByaXNtIGhlYWRlciBoYXMgYmVlbiBvcmlnaW5hbGx5IGFkZGVkIGJ5IENocmlzdGlhbiAqLworCQkJaWYocHJpdi0+cHJpc21faGRyICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCisjaWYgMAorCQkJCXByaXYtPnJ4X3NrYiA9IGRldl9hbGxvY19za2IobGVuKzIrUFJJU01fSERSX1NJWkUpOworCQkJCWlmKCEgcHJpdi0+cnhfc2tiKSBnb3RvIGRyb3A7CisKKwkJCQlwcmlzbV9oZHIgPSAodTMyKikgc2tiX3B1dChwcml2LT5yeF9za2IsUFJJU01fSERSX1NJWkUpOworCQkJCXByaXNtX2hkclswXT1odG9ubCgweDgwMjExMDAxKTsgICAgICAgIC8vdmVyc2lvbgorCQkJCXByaXNtX2hkclsxXT1odG9ubCgweDQwKTsgICAgICAgICAgICAgIC8vbGVuZ3RoCisJCQkJcHJpc21faGRyWzJdPWh0b25sKHN0YXRzLm1hY190aW1lWzFdKTsgICAgLy9tYWN0aW1lIChISUdIKQorCQkJCXByaXNtX2hkclszXT1odG9ubChzdGF0cy5tYWNfdGltZVswXSk7ICAgIC8vbWFjdGltZSAoTE9XKQorCQkJCXJkdHNjKHByaXNtX2hkcls1XSwgcHJpc21faGRyWzRdKTsgICAgICAgICAvL2hvc3RpbWUgKExPVytISUdIKQorCQkJCXByaXNtX2hkcls0XT1odG9ubChwcmlzbV9oZHJbNF0pOyAgICAgICAgICAvL0J5dGUtT3JkZXIgYWVuZGVybgorCQkJCXByaXNtX2hkcls1XT1odG9ubChwcmlzbV9oZHJbNV0pOyAgICAgICAgICAvL0J5dGUtT3JkZXIgYWVuZGVybgorCQkJCXByaXNtX2hkcls2XT0weDAwOyAgICAgICAgICAgICAgICAgICAgIC8vcGh5dHlwZQorCQkJCXByaXNtX2hkcls3XT1odG9ubChwcml2LT5jaGFuKTsgICAgICAgIC8vY2hhbm5lbAorCQkJCXByaXNtX2hkcls4XT1odG9ubChzdGF0cy5yYXRlKTsgICAgICAgIC8vZGF0YXJhdGUKKwkJCQlwcmlzbV9oZHJbOV09MHgwMDsgICAgICAgICAgICAgICAgICAgICAvL2FudGVubmEKKwkJCQlwcmlzbV9oZHJbMTBdPTB4MDA7ICAgICAgICAgICAgICAgICAgICAvL3ByaW9yaXR5CisJCQkJcHJpc21faGRyWzExXT0weDAwOyAgICAgICAgICAgICAgICAgICAgLy9zc2lfdHlwZQorCQkJCXByaXNtX2hkclsxMl09aHRvbmwoc3RhdHMuc2lnbmFsKTsgICAgIC8vc3NpX3NpZ25hbAorCQkJCXByaXNtX2hkclsxM109aHRvbmwoc3RhdHMubm9pc2UpOyAgICAgIC8vc3NpX25vaXNlCisJCQkJcHJpc21faGRyWzE0XT0weDAwOyAgICAgICAgICAgICAgICAgICAgLy9wcmVhbWJsZQorCQkJCXByaXNtX2hkclsxNV09MHgwMDsgICAgICAgICAgICAgICAgICAgIC8vZW5jb2RpbmcKKworI2VuZGlmCisJCQl9ZWxzZXsKKwkJCQlwcml2LT5yeF9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisyKTsKKwkJCQlpZiggIXByaXYtPnJ4X3NrYikgZ290byBkcm9wOworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJBbGxvYyBpbml0aWFsIHNrYiAleCIsbGVuKzIpOworI2VuZGlmCisJCQl9CisKKwkJCXByaXYtPnJ4X3NrYl9jb21wbGV0ZT0wOworCQkJcHJpdi0+cnhfc2tiLT5kZXY9ZGV2OworCQl9ZWxzZXsKKwkJCS8qIGlmIHdlIGFyZSBoZXJlIHdlIHNob3VsZCAgaGF2ZSBhbHJlYWR5IFJYZWQKKwkJCSogdGhlIGZpcnN0IGZyYW1lLgorCQkJKiBJZiB3ZSBnZXQgaGVyZSBhbmQgdGhlIHNrYiBpcyBub3QgYWxsb2NhdGVkIHRoZW4KKwkJCSogd2UgaGF2ZSBqdXN0IHRocm93IG91dCBnYXJiYWdlIChza2Igbm90IGFsbG9jYXRlZCkKKwkJCSogYW5kIHdlIGFyZSBzdGlsbCByeGluZyBnYXJiYWdlLi4uLgorCQkJKi8KKwkJCWlmKCFwcml2LT5yeF9za2JfY29tcGxldGUpeworCisJCQkJdG1wX3NrYj0gZGV2X2FsbG9jX3NrYihwcml2LT5yeF9za2ItPmxlbiArbGVuKzIpOworCisJCQkJaWYoIXRtcF9za2IpIGdvdG8gZHJvcDsKKworCQkJCXRtcF9za2ItPmRldj1kZXY7CisjaWZkZWYgREVCVUdfUlhfU0tCCisJCQkJRE1FU0coIlJlYWxsb2Mgc2tiICV4IixsZW4rMik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJnb2luZyBjb3B5IHByZXYgZnJhZyAleCIscHJpdi0+cnhfc2tiLT5sZW4pOworI2VuZGlmCisJCQkJbWVtY3B5KHNrYl9wdXQodG1wX3NrYixwcml2LT5yeF9za2ItPmxlbiksCisJCQkJCXByaXYtPnJ4X3NrYi0+ZGF0YSwKKwkJCQkJcHJpdi0+cnhfc2tiLT5sZW4pOworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJza2IgY29weSBwcmV2IGZyYWcgY29tcGxldGUiKTsKKyNlbmRpZgorCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tiKTsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygicHJldiBza2IgZnJlZSBvayIpOworI2VuZGlmCisKKwkJCQlwcml2LT5yeF9za2I9dG1wX3NrYjsKKwkJCX0KKwkJfQorI2lmZGVmIERFQlVHX1JYX1NLQgorCQlETUVTRygiZ29pbmcgdG8gY29weSBjdXJyZW50IHBheWxvYWQgJXgiLGxlbik7CisjZW5kaWYKKwkJaWYoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkgeworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQkJaWYocGFkZGluZykgeworCQkJCW1lbWNweShza2JfcHV0KHByaXYtPnJ4X3NrYixsZW4pLAorCQkJCQkoKCh1bnNpZ25lZCBjaGFyICopcHJpdi0+cnhidWZmZXItPmJ1ZikgKyAyKSxsZW4pOworCQkJfSBlbHNlIHsKKyNlbmRpZgorCQkJCW1lbWNweShza2JfcHV0KHByaXYtPnJ4X3NrYixsZW4pLAorCQkJCQlwcml2LT5yeGJ1ZmZlci0+YnVmLGxlbik7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCQl9CisjZW5kaWYKKwkJfQorI2lmZGVmIERFQlVHX1JYX1NLQgorCQlETUVTRygiY3VycmVudCBmcmFnbWVudCBza2IgY29weSBjb21wbGV0ZSIpOworI2VuZGlmCisKKwkJaWYobGFzdCAmJiAhcHJpdi0+cnhfc2tiX2NvbXBsZXRlKXsKKworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJRE1FU0coIkdvdCBsYXN0IGZyYWdtZW50Iik7CisjZW5kaWYKKworCQkJaWYocHJpdi0+cnhfc2tiLT5sZW4gPiA0KQorCQkJCXNrYl90cmltKHByaXYtPnJ4X3NrYixwcml2LT5yeF9za2ItPmxlbi00KTsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCURNRVNHKCJ5YW5rZWQgb3V0IGNyYywgcGFzc2luZyB0byB0aGUgdXBwZXIgbGF5ZXIiKTsKKyNlbmRpZgorCisjaWZuZGVmIFJYX0RPTlRfUEFTU19VTAorCQkJaWYoIWllZWU4MDIxMV9yeChwcml2LT5pZWVlODAyMTEsCisJCQkJCSBwcml2LT5yeF9za2IsICZzdGF0cykpeworI2lmZGVmIERFQlVHX1JYCisJCQkJRE1FU0dXKCJQYWNrZXQgbm90IGNvbnN1bWVkIik7CisjZW5kaWYKKyNlbmRpZiAvLyBSWF9ET05UX1BBU1NfVUwKKworCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CisjaWZuZGVmIFJYX0RPTlRfUEFTU19VTAorCQkJfQorI2VuZGlmCisjaWZkZWYgREVCVUdfUlgKKwkJCWVsc2V7CisJCQkJCURNRVNHKCJSY3YgZnJhZyIpOworCQkJfQorI2VuZGlmCisJCQlwcml2LT5yeF9za2JfY29tcGxldGU9MTsKKwkJfQorCisjZW5kaWYgLy9EVU1NWV9SWAorCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShwcml2LT5wZGV2LAorCQkJCSAgICBwcml2LT5yeGJ1ZmZlci0+ZG1hLAorCQkJCSAgICBwcml2LT5yeGJ1ZmZlcnNpemUgKiBcCisJCQkJICAgIHNpemVvZih1OCksCisJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKworZHJvcDogLy8gdGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBub3QgZW5vdWdodCBtZW0KKworCQkvKiByZXN0b3JlIHRoZSBkZXNjcmlwdG9yICovCisJCSoocHJpdi0+cnhyaW5ndGFpbCsyKT1wcml2LT5yeGJ1ZmZlci0+ZG1hOworCQkqKHByaXYtPnJ4cmluZ3RhaWwpPSoocHJpdi0+cnhyaW5ndGFpbCkgJn4gMHhmZmY7CisJCSoocHJpdi0+cnhyaW5ndGFpbCk9CisJCQkqKHByaXYtPnJ4cmluZ3RhaWwpIHwgcHJpdi0+cnhidWZmZXJzaXplOworCisJCSoocHJpdi0+cnhyaW5ndGFpbCk9CisJCQkqKHByaXYtPnJ4cmluZ3RhaWwpIHwgKDE8PDMxKTsKKwkJCS8vXmVtcHR5IGRlc2NyaXB0b3IKKworCQkJLy93bWIoKTsKKworI2lmZGVmIERFQlVHX1JYCisJCURNRVNHKCJDdXJyZW50IGRlc2NyaXB0b3I6ICV4IiwodTMyKXByaXYtPnJ4cmluZ3RhaWwpOworI2VuZGlmCisJCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJLy9zcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX2xvY2ssZmxhZ3MpOworCisJCXByaXYtPnJ4cmluZ3RhaWwrPXJ4X2Rlc2Nfc2l6ZTsKKwkJaWYocHJpdi0+cnhyaW5ndGFpbCA+PQorCQkgICAocHJpdi0+cnhyaW5nKSsocHJpdi0+cnhyaW5nY291bnQgKSpyeF9kZXNjX3NpemUpCisJCQlwcml2LT5yeHJpbmd0YWlsPXByaXYtPnJ4cmluZzsKKworCQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV9sb2NrLGZsYWdzKTsKKworCisJCXByaXYtPnJ4YnVmZmVyPShwcml2LT5yeGJ1ZmZlci0+bmV4dCk7CisKKwl9CisKKworCisvLwlpZihnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LHByaW9yaXR5KSkKKy8vCWllZWU4MDIxMV9zdGFfcHNfc2xlZXAocHJpdi0+aWVlZTgwMjExLCAmdG1wLCAmdG1wMik7CisKKworCit9CisKKwordm9pZCBydGw4MTgwX2RtYV9raWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKy8qCisKKwlzd2l0Y2gocHJpb3JpdHkpeworCisJCWNhc2UgTE9XX1BSSU9SSVRZOgorCisJCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORywKKwkJICAgICAgICgxPDwgVFhfRE1BX1BPTExJTkdfTE9XUFJJT1JJVFlfU0hJRlQpIHwKKwkJCSAgICAgICAgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJCWJyZWFrOworCisJCWNhc2UgTk9STV9QUklPUklUWToKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcsCisJCSAgICAgICAoMTw8IFRYX0RNQV9QT0xMSU5HX05PUk1QUklPUklUWV9TSElGVCkgfAorCQkJICAgICAgICBwcml2LT5kbWFfcG9sbF9tYXNrKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBISV9QUklPUklUWToKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcsCisJCSAgICAgICAoMTw8IFRYX0RNQV9QT0xMSU5HX0hJUFJJT1JJVFlfU0hJRlQpIHwKKwkJCSAgICAgICAgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJCWJyZWFrOworCisJfQorKi8KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0RNQV9QT0xMSU5HLAorCQkJKDEgPDwgKHByaW9yaXR5ICsgMSkpIHwgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworfQorCisjaWYgMAordm9pZCBydGw4MTgwX3R4X3F1ZXVlc19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTggZG1hX3BvbGxfbWFzayA9ICgxPDxUWF9ETUFfU1RPUF9MT1dQUklPUklUWV9TSElGVCk7CisJZG1hX3BvbGxfbWFzayB8PSAoMTw8VFhfRE1BX1NUT1BfSElQUklPUklUWV9TSElGVCk7CisJZG1hX3BvbGxfbWFzayB8PSAoMTw8VFhfRE1BX1NUT1BfTk9STVBSSU9SSVRZX1NISUZUKTsKKwlkbWFfcG9sbF9tYXNrIHw9ICgxPDxUWF9ETUFfU1RPUF9CRUFDT05fU0hJRlQpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLGRtYV9wb2xsX21hc2spOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworfQorI2VuZGlmCisKK3ZvaWQgcnRsODE4MF9kYXRhX2hhcmRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayB8PSBUUFBPTExTVE9QX0FDX1ZJUTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFBQb2xsU3RvcCwgcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrKTsKKyNlbHNlCisJcHJpdi0+ZG1hX3BvbGxfbWFzayB8PSAoMTw8VFhfRE1BX1NUT1BfTE9XUFJJT1JJVFlfU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORyxwcml2LT5kbWFfcG9sbF9tYXNrKTsKKyNlbmRpZgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworfQorCisKK3ZvaWQgcnRsODE4MF9kYXRhX2hhcmRfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisjaWZkZWYgIENPTkZJR19SVEw4MTg1QgorCXByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayAmPSB+KFRQUE9MTFNUT1BfQUNfVklRKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFBQb2xsU3RvcCwgcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrKTsKKyNlbHNlCisJcHJpdi0+ZG1hX3BvbGxfbWFzayAmPSB+KDE8PFRYX0RNQV9TVE9QX0xPV1BSSU9SSVRZX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcscHJpdi0+ZG1hX3BvbGxfbWFzayk7CisjZW5kaWYKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKK30KKworCisvKiB0aGlzIGZ1bmN0aW9uIFRYIGRhdGEgZnJhbWVzIHdoZW4gdGhlIGllZWU4MDIxMSBzdGFjayByZXF1aXJlcyB0aGlzLgorICogSXQgY2hlY2tzIGFsc28gaWYgd2UgbmVlZCB0byBzdG9wIHRoZSBpZWVlIHR4IHF1ZXVlLCBldmVudHVhbGx5IGRvIGl0CisgKi8KK3ZvaWQgcnRsODE4MF9oYXJkX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludAorcmF0ZSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJaW50IG1vZGU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CisJc2hvcnQgbW9yZWZyYWcgPSAoaC0+ZnJhbWVfY3RsKSAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwcmlvcml0eTsKKwkvL3N0YXRpYyBpbnQgY291bnQgPSAwOworCisJbW9kZSA9IHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZTsKKworCXJhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKHJhdGUpOworCS8qCisJKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVxdWlyZSBsb2NrIGJlY2F1c2Ugd2UgbWFrZQorCSogc3VyZSBpdCdzIGNhbGxlZCB3aXRoIHRoZSB0eF9sb2NrIGFscmVhZHkgYWNxdWlyZWQuCisJKiB0aGlzIGNvbWUgZnJvbSB0aGUga2VybmVsJ3MgaGFyZF94bWl0IGNhbGxiYWNrICh0cm91Z2h0CisJKiB0aGUgaWVlZSBzdGFjaywgb3IgZnJvbSB0aGUgdHJ5X3dha2VfcXVldWUgKGFnYWluIHRyb3VnaHQKKwkqIHRoZSBpZWVlIHN0YWNrLgorCSovCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpb3JpdHkgPSBBQzJRKHNrYi0+cHJpb3JpdHkpOworI2Vsc2UKKwlwcmlvcml0eSA9IExPV19QUklPUklUWTsKKyNlbmRpZgorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCQlyZXR1cm47CisJfQorCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJwcmlvcml0eSA9ICVkQCVkXG4iLCBwcmlvcml0eSwgY291bnQrKyk7CisJaWYgKCFjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldiwgcHJpb3JpdHkpKXsKKwkJLy9ETUVTRygiRXJyb3I6IG5vIGRlc2NyaXB0b3IgbGVmdCBieSBwcmV2aW91cyBUWCAoYXZhaWwgJWQpICIsCisJCS8vCWdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsIHByaW9yaXR5KSk7CisJCURNRVNHVygiRXJyb3I6IG5vIGRlc2NyaXB0b3IgbGVmdCBieSBwcmV2aW91cyBUWCAoYXZhaWwgJWQpICIsCisJCQlnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBwcmlvcml0eSkpOworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+IFxuIik7CisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisJfQorCXJ0bDgxODBfdHgoZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBwcmlvcml0eSwgbW9yZWZyYWcsMCxyYXRlKTsKKwlpZiAoIWNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LCBwcmlvcml0eSkpCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisKKwkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKK30KKworLyogVGhpcyBpcyBhIHJvdWdoIGF0dGVtcHQgdG8gVFggYSBmcmFtZQorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGllZWUgODAyMTEgc3RhY2sgdG8gVFggbWFuYWdlbWVudCBmcmFtZXMuCisgKiBJZiB0aGUgcmluZyBpcyBmdWxsIHBhY2tldCBhcmUgZHJvcHBlZCAoZm9yIGRhdGEgZnJhbWUgdGhlIHF1ZXVlCisgKiBpcyBzdG9wcGVkIGJlZm9yZSB0aGlzIGNhbiBoYXBwZW4pLiBGb3IgdGhpcyByZWFzb24gaXQgaXMgYmV0dGVyCisgKiBpZiB0aGUgZGVzY3JpcHRvcnMgYXJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IG1hbmFnZW1lbnQgZnJhbWUKKyAqIHdlIGludGVuZCB0byBUWDogaSdtIHVuc3VyZSB3aGF0IHRoZSBIVyBkb2VzIGlmIGl0IHdpbGwgbm90IGZvdW5kCisgKiB0aGUgbGFzdCBmcmFnbWVudCBvZiBhIGZyYW1lIGJlY2F1c2UgaXQgaGFzIGJlZW4gZHJvcHBlZC4uLgorICogU2luY2UgcXVldWVzIGZvciBNYW5hZ2VtZW50IGFuZCBEYXRhIGZyYW1lcyBhcmUgZGlmZmVyZW50IHdlCisgKiBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbG9jayB0aGFuIHR4X2xvY2sgKGZvciBleGFtcGxlIG1nbXRfdHhfbG9jaykKKyAqLworLyogdGhlc2UgZnVuY3Rpb24gbWF5IGxvb3BzIGlmIGludm9rZWQgd2l0aCAwIGRlc2NyaXB0b3JzIG9yIDAgbGVuIGJ1ZmZlciovCitpbnQgcnRsODE4MF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbnQgcHJpb3JpdHk7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwcmlvcml0eSA9IE1BTkFHRV9QUklPUklUWTsKKyNlbHNlCisJcHJpb3JpdHkgPSBOT1JNX1BSSU9SSVRZOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcnRsODE4MF90eChkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIHByaW9yaXR5LAorCQkwLCAwLGllZWVyYXRlMnJ0bHJhdGUocHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKSk7CisKKwlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2J5dGVzKz1za2ItPmxlbjsKKwlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8vIGxvbmdwcmUgMTQ0KzQ4IHNob3J0cHJlIDcyKzI0Cit1MTYgcnRsODE4MF9sZW4yZHVyYXRpb24odTMyIGxlbiwgc2hvcnQgcmF0ZSxzaG9ydCogZXh0KQoreworCXUxNiBkdXJhdGlvbjsKKwl1MTYgZHJpZnQ7CisJKmV4dD0wOworCisJc3dpdGNoKHJhdGUpeworCWNhc2UgMDovLzFtYnBzCisJCSpleHQ9MDsKKwkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLzB4MjsKKwkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDI7CisJCWlmKGRyaWZ0ID09MCApIGJyZWFrOworCQlkdXJhdGlvbisrOworCQlicmVhazsKKworCWNhc2UgMTovLzJtYnBzCisJCSpleHQ9MDsKKwkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLzB4NDsKKwkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDQ7CisJCWlmKGRyaWZ0ID09MCApIGJyZWFrOworCQlkdXJhdGlvbisrOworCQlicmVhazsKKworCWNhc2UgMjogLy81LjVtYnBzCisJCSpleHQ9MDsKKwkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLzB4YjsKKwkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweGI7CisJCWlmKGRyaWZ0ID09MCApCisJCQlicmVhazsKKwkJZHVyYXRpb24rKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCWNhc2UgMzovLzExbWJwcworCQkqZXh0PTA7CisJCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8weDE2OworCQlkcmlmdCA9ICgobGVuKzQpPDw0KSAlIDB4MTY7CisJCWlmKGRyaWZ0ID09MCApCisJCQlicmVhazsKKwkJZHVyYXRpb24rKzsKKwkJaWYoZHJpZnQgPiA2KQorCQkJYnJlYWs7CisJCSpleHQ9MTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGR1cmF0aW9uOworfQorCisKK3ZvaWQgcnRsODE4MF9wcmVwYXJlX2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXUxNiB3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCY25JdHYpOworCXdvcmQgJj0gfkJjbkl0dl9CY25JdHY7IC8vIGNsZWFyIEJjbl9JdHYKKwl3b3JkIHw9IGNwdV90b19sZTE2KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7Ly8weDY0OworCXdyaXRlX25pY193b3JkKGRldiwgQmNuSXR2LCB3b3JkKTsKKworCisJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb24ocHJpdi0+aWVlZTgwMjExKTsKKwlpZihza2IpeworCQlydGw4MTgwX3R4KGRldixza2ItPmRhdGEsc2tiLT5sZW4sQkVBQ09OX1BSSU9SSVRZLAorCQkJMCwwLGllZWVyYXRlMnJ0bHJhdGUocHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKSk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCSNpZiAwCisJLy9ETUVTRygic2l6ZSAleCIsbGVuKTsKKwlpZigqdGFpbCAmICgxPDwzMSkpeworCisJCS8vRE1FU0coIk5vIG1vcmUgYmVhY29uIFRYIGRlc2MiKTsKKwkJcmV0dXJuIDsKKworCX0KKwkvL3doaWxlKCEgKnRhaWwgJiAoMTw8MzEpKXsKKwkJKnRhaWw9IDA7IC8vIHplcm9lcyBoZWFkZXIKKworCQkqdGFpbCA9ICp0YWlsfCAoMTw8MjkpIDsgLy9maXN0IHNlZ21lbnQgb2YgdGhlIHBhY2tldAorCQkqdGFpbCA9ICgqdGFpbCkgfCAoMTw8MjgpOyAvLyBsYXN0IHNlZ21lbnQKKwkvLwkqdGFpbCA9ICp0YWlsIHwgKDE8PDE4KTsgLy8gdGhpcyBpcyAgYSBiZWFjb24gZnJhbWUKKwkJKih0YWlsKzMpPSoodGFpbCszKSAmfiAweGZmZjsKKwkJKih0YWlsKzMpPSoodGFpbCszKSB8IGxlbjsgLy8gYnVmZmVyIGxlbmdodAorCQkqdGFpbCA9ICp0YWlsIHxsZW47CisJCS8vIHplcm9lcyB0aGUgc2Vjb25kIDMyLWJpdHMgZHdvcmQgb2YgdGhlIGRlc2NyaXB0b3IKKwkJKih0YWlsKzEpPSAwOworCQkqdGFpbCA9ICp0YWlsIHwgKHJhdGUgPDwgMjQpOworCisJCQlkdXJhdGlvbiA9IHJ0bDgxODBfbGVuMmR1cmF0aW9uKGxlbixyYXRlLCZleHQpOworCisJCSoodGFpbCsxKSA9ICoodGFpbCsxKSB8ICgoZHVyYXRpb24gJiAweDdmZmYpPDwxNik7CisKKwkJKnRhaWwgPSAqdGFpbCB8ICgxPDwzMSk7CisJCS8vXiBkZXNjcmlwdG9yIHJlYWR5IHRvIGJlIHR4ZWQKKwkJaWYoKHRhaWwgLSBiZWdpbikvOCA9PSBwcml2LT50eGJlYWNvbmNvdW50LTEpCisJCQl0YWlsPWJlZ2luOworCQllbHNlCisJCQl0YWlsPXRhaWwrODsKKwkvL30KKyNlbmRpZgorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRvIHRoZSByZWFsIGRpcnR5IHdvcms6IGl0IGVucXVldWVzIGEgVFggY29tbWFuZAorICogZGVzY3JpcHRvciBpbiB0aGUgcmluZyBidWZmZXIsIGNvcHllcyB0aGUgZnJhbWUgaW4gYSBUWCBidWZmZXIKKyAqIGFuZCBraWNrcyB0aGUgTklDIHRvIGVuc3VyZSBpdCBkb2VzIHRoZSBETUEgdHJhbnNmZXIuCisgKi8KK3Nob3J0IHJ0bDgxODBfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgqIHR4YnVmLCBpbnQgbGVuLCBpbnQgcHJpb3JpdHksCisJCSBzaG9ydCBtb3JlZnJhZywgc2hvcnQgZGVzY2ZyYWcsIGludCByYXRlKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgKnRhaWwsKnRlbXBfdGFpbDsKKwl1MzIgKmJlZ2luOworCXUzMiAqYnVmOworCWludCBpOworCWludCByZW1haW47CisJaW50IGJ1ZmxlbjsKKwlpbnQgY291bnQ7CisJLy91MTYJQWNrQ3RzVGltZTsKKwkvL3UxNglGcmFtZVRpbWU7CisJdTE2IGR1cmF0aW9uOworCXNob3J0IGV4dDsKKwlzdHJ1Y3QgYnVmZmVyKiBidWZsaXN0OworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqZnJhZ19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKil0eGJ1ZjsKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwl1OAkJCWJVc2VTaG9ydFByZWFtYmxlID0gMDsKKwl1OAkJCWJDVFNFbmFibGUgPSAwOworCXU4CQkJYlJUU0VuYWJsZSA9IDA7CisJLy91MTYJCQlSVFNSYXRlID0gMjI7CisJLy91OAkJCVJldHJ5TGltaXQgPSAwOworCXUxNiAJCQlEdXJhdGlvbiA9IDA7CisJdTE2CQkJUnRzRHVyID0gMDsKKwl1MTYJCQlUaGlzRnJhbWVUaW1lID0gMDsKKwl1MTYJCQlUeERlc2NEdXJhdGlvbiA9IDA7CisJdTggCQkJb3duYml0X2ZsYWcgPSBmYWxzZTsgLy9hZGRlZCBieSBkYXZpZCB3b28gZm9yIHN5bmMgVHgsIDIwMDcuMTIuMTQKKyNlbmRpZgorCisJc3dpdGNoKHByaW9yaXR5KSB7CisJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CisJCXRhaWw9cHJpdi0+dHhtYXByaW5ndGFpbDsKKwkJYmVnaW49cHJpdi0+dHhtYXByaW5nOworCQlidWZsaXN0ID0gcHJpdi0+dHhtYXBidWZzdGFpbDsKKwkJY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIEJLX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4YmtwcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4YmtwcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4YmtwYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhyaW5nY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBCRV9QUklPUklUWToKKwkJdGFpbD1wcml2LT50eGJlcHJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eGJlcHJpbmc7CisJCWJ1Zmxpc3QgPSBwcml2LT50eGJlcGJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCQlicmVhazsKKworCWNhc2UgVklfUFJJT1JJVFk6CisJCXRhaWw9cHJpdi0+dHh2aXByaW5ndGFpbDsKKwkJYmVnaW49cHJpdi0+dHh2aXByaW5nOworCQlidWZsaXN0ID0gcHJpdi0+dHh2aXBidWZzdGFpbDsKKwkJY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIFZPX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4dm9wcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4dm9wcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4dm9wYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhyaW5nY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBISV9QUklPUklUWToKKwkJdGFpbD1wcml2LT50eGhwcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4aHByaW5nOworCQlidWZsaXN0ID0gcHJpdi0+dHhocGJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCQlicmVhazsKKworCWNhc2UgQkVBQ09OX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4YmVhY29ucmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4YmVhY29ucmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4YmVhY29uYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhiZWFjb25jb3VudDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJCWJyZWFrOworIAl9CisKKwkvL3ByaW50aygiaW4gcnRsODE4MF90eCgpOiByYXRlIGlzICVkXG4iLHByaXYtPmllZWU4MDIxMS0+cmF0ZSk7CisjaWYgMQorCQltZW1jcHkoJmRlc3QsIGZyYWdfaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgfHwKKwkJCQlpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkKKwkJeworCQkJRHVyYXRpb24gPSAwOworCQkJUnRzRHVyID0gMDsKKwkJCWJSVFNFbmFibGUgPSAwOworCQkJYkNUU0VuYWJsZSA9IDA7CisKKwkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsIHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7CisJCQlUeERlc2NEdXJhdGlvbiA9IFRoaXNGcmFtZVRpbWU7CisJCX0gZWxzZSB7Ly8gVW5pY2FzdCBwYWNrZXQKKwkJCS8vdTggQWNrUmF0ZTsKKwkJCXUxNiBBY2tUaW1lOworCisJCQkvL1lKLGFkZCwwODA4MjgsZm9yIEtlZXAgYWxpdmUKKwkJCXByaXYtPk51bVR4VW5pY2FzdCsrOworCisJCQkvLyBGaWd1cmUgb3V0IEFDSyByYXRlIGFjY29yZGluZyB0byBCU1MgYmFzaWMgcmF0ZSBhbmQgVHggcmF0ZSwgMjAwNi4wMy4wOCBieSByY25qa28uCisJCQkvL0Fja1JhdGUgPSBDb21wdXRlQWNrUmF0ZSggcE1nbnRJbmZvLT5tQnJhdGVzLCAodTFCeXRlKShwVGNiLT5EYXRhUmF0ZSkgKTsKKwkJCS8vIEZpZ3VyZSBvdXQgQUNLIHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBBY2tSYXRlIGFuZCBhc3N1bWUgbG9uZyBwcmVhbWJsZSBpcyB1c2VkIG9uIHJlY2VpdmVyLCAyMDA2LjAzLjA4LCBieSByY25qa28uCisJCQkvL0Fja1RpbWUgPSBDb21wdXRlVHhUaW1lKCBzQWNrQ3RzTG5nLzgsIEFja1JhdGUsIEZBTFNFLCBGQUxTRSk7CisJCQkvL0ZvciBzaW1wbGljaXR5LCBqdXN0IHVzZSB0aGUgMU0gYmFzaWMgcmF0ZQorCQkJLy9BY2tUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgNTQwLDAsIDApOwkvLyBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQKKwkJCUFja1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwwLCAwKTsJLy8gQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisJCQkvL0Fja1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAyLGZhbHNlLCBmYWxzZSk7CS8vIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZAorCisJCQlpZiAoICgobGVuICsgc0NyY0xuZykgPiBwcml2LT5ydHMpICYmIHByaXYtPnJ0cyApCisJCQl7IC8vIFJUUy9DVFMuCisJCQkJdTE2IFJ0c1RpbWUsIEN0c1RpbWU7CisJCQkJLy91MTYgQ3RzUmF0ZTsKKwkJCQliUlRTRW5hYmxlID0gMTsKKwkJCQliQ1RTRW5hYmxlID0gMDsKKworCQkJCS8vIFJhdGUgYW5kIHRpbWUgcmVxdWlyZWQgZm9yIFJUUy4KKwkJCQlSdHNUaW1lID0gQ29tcHV0ZVR4VGltZSggc0Fja0N0c0xuZy84LHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSwgMCwgMCk7CisJCQkJLy8gUmF0ZSBhbmQgdGltZSByZXF1aXJlZCBmb3IgQ1RTLgorCQkJCUN0c1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwwLCAwKTsJLy8gQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisKKwkJCQkvLyBGaWd1cmUgb3V0IHRpbWUgcmVxdWlyZWQgdG8gdHJhbnNtaXQgdGhpcyBmcmFtZS4KKwkJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLAorCQkJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksCisJCQkJCQkwLAorCQkJCQkJYlVzZVNob3J0UHJlYW1ibGUpOworCisJCQkJLy8gUlRTLUNUUy1UaGlzRnJhbWUtQUNLLgorCQkJCVJ0c0R1ciA9IEN0c1RpbWUgKyBUaGlzRnJhbWVUaW1lICsgQWNrVGltZSArIDMqYVNpZnNUaW1lOworCisJCQkJVHhEZXNjRHVyYXRpb24gPSBSdHNUaW1lICsgUnRzRHVyOworCQkJfQorCQkJZWxzZSB7Ly8gTm9ybWFsIGNhc2UuCisJCQkJYkNUU0VuYWJsZSA9IDA7CisJCQkJYlJUU0VuYWJsZSA9IDA7CisJCQkJUnRzRHVyID0gMDsKKworCQkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsIHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7CisJCQkJVHhEZXNjRHVyYXRpb24gPSBUaGlzRnJhbWVUaW1lICsgYVNpZnNUaW1lICsgQWNrVGltZTsKKwkJCX0KKworCQkJaWYoIShmcmFnX2hkci0+ZnJhbWVfY3RsICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkgeyAvL25vIG1vcmUgZnJhZ21lbnQKKwkJCQkvLyBUaGlzRnJhbWUtQUNLLgorCQkJCUR1cmF0aW9uID0gYVNpZnNUaW1lICsgQWNrVGltZTsKKwkJCX0gZWxzZSB7IC8vIE9uZSBvciBtb3JlIGZyYWdtZW50cyByZW1haW5lZC4KKwkJCQl1MTYgTmV4dEZyYWdUaW1lOworCQkJCU5leHRGcmFnVGltZSA9IENvbXB1dGVUeFRpbWUoIGxlbiArIHNDcmNMbmcsIC8vcHJldGVuZCBmb2xsb3dpbmcgcGFja2V0IGxlbmd0aCBlcXVhbCBjdXJyZW50IHBhY2tldAorCQkJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksCisJCQkJCQkwLAorCQkJCQkJYlVzZVNob3J0UHJlYW1ibGUgKTsKKworCQkJCS8vVGhpc0ZyYWctQUNrLU5leHRGcmFnLUFDSy4KKwkJCQlEdXJhdGlvbiA9IE5leHRGcmFnVGltZSArIDMqYVNpZnNUaW1lICsgMipBY2tUaW1lOworCQkJfQorCisJCX0gLy8gRW5kIG9mIFVuaWNhc3QgcGFja2V0CisKKwkJZnJhZ19oZHItPmR1cmF0aW9uX2lkID0gRHVyYXRpb247CisjZW5kaWYKKworCWJ1Zmxlbj1wcml2LT50eGJ1ZmZzaXplOworCXJlbWFpbj1sZW47CisJdGVtcF90YWlsID0gdGFpbDsKKy8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5idWZsZW4gPSAlZCwgcmVtYWluID0gJWQhXG4iLCBidWZsZW4scmVtYWluKTsKKwl3aGlsZShyZW1haW4hPTApeworI2lmZGVmIERFQlVHX1RYX0ZSQUcKKwkJRE1FU0coIlRYIGl0ZXJhdGlvbiIpOworI2VuZGlmCisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0coIlRYOiBmaWxsaW5nIGRlc2NyaXB0b3IgJXgiLCh1MzIpdGFpbCk7CisjZW5kaWYKKwkJbWIoKTsKKwkJaWYoIWJ1Zmxpc3QpeworCQkJRE1FU0dFKCJUWCBidWZmZXIgZXJyb3IsIGNhbm5vdCBUWCBmcmFtZXMuIHByaSAlZC4iLCBwcmlvcml0eSk7CisJCQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJ1Zj1idWZsaXN0LT5idWY7CisKKwkJaWYoICgqdGFpbCAmICgxPDwzMSkpICYmIChwcmlvcml0eSAhPSBCRUFDT05fUFJJT1JJVFkpKXsKKworCQkJCURNRVNHVygiTm8gbW9yZSBUWCBkZXNjLCByZXR1cm5pbmcgJXggb2YgJXgiLAorCQkJCXJlbWFpbixsZW4pOworCQkJCXByaXYtPnN0YXRzLnR4cmR1Kys7CisjaWZkZWYgREVCVUdfVFhfREVTQworCQkJCWNoZWNrX3R4X3JpbmcoZGV2LHByaW9yaXR5KTsKKwkJCS8vCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCS8vCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisjZW5kaWYKKwkJCS8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJCQlyZXR1cm4gcmVtYWluOworCisJCX0KKworCQkqdGFpbD0gMDsgLy8gemVyb2VzIGhlYWRlcgorCQkqKHRhaWwrMSkgPSAwOworCQkqKHRhaWwrMykgPSAwOworCQkqKHRhaWwrNSkgPSAwOworCQkqKHRhaWwrNikgPSAwOworCQkqKHRhaWwrNykgPSAwOworCisJCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCQkvL0ZJWE1FOiB0aGlzIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgSFcgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzLgorCQkJKnRhaWwgfD0gKDE8PDE1KTsgLy9ubyBlbmNyeXB0CisvLwkJCSp0YWlsIHw9ICgxPDwzMCk7IC8vcmFpc2UgaW50IHdoZW4gY29tcGxldGVkCisJCX0KKwkvLwkqdGFpbCA9ICp0YWlsIHwgKDE8PDE2KTsKKwkJaWYocmVtYWluPT1sZW4gJiYgIWRlc2NmcmFnKSB7CisJCQlvd25iaXRfZmxhZyA9IGZhbHNlOwkvL2FkZGVkIGJ5IGRhdmlkIHdvbywyMDA3LjEyLjE0CisjaWZkZWYgREVCVUdfVFhfRlJBRworCQkJRE1FU0coIkZpcnN0IGRlc2NyaXB0b3IiKTsKKyNlbmRpZgorCQkJKnRhaWwgPSAqdGFpbHwgKDE8PDI5KSA7IC8vZmlzdCBzZWdtZW50IG9mIHRoZSBwYWNrZXQKKwkJCSp0YWlsID0gKnRhaWwgfChsZW4pOworCQl9IGVsc2UgeworCQkJb3duYml0X2ZsYWcgPSB0cnVlOworCQl9CisKKwkJZm9yKGk9MDtpPGJ1ZmxlbiYmIHJlbWFpbiA+MDtpKysscmVtYWluLS0peworCQkJKCh1OCopYnVmKVtpXT10eGJ1ZltpXTsgLy9jb3B5IGRhdGEgaW50byBkZXNjcmlwdG9yIHBvaW50ZWQgRE1BYmxlIGJ1ZmZlcgorCQkJaWYocmVtYWluID09IDQgJiYgaSs0ID49IGJ1ZmxlbikgYnJlYWs7CisJCQkvKiBlbnN1cmUgdGhlIGxhc3QgZGVzYyBoYXMgYXQgbGVhc3QgNCBieXRlcyBwYXlsb2FkICovCisKKwkJfQorCQl0eGJ1ZiA9IHR4YnVmICsgaTsKKwkJKih0YWlsKzMpPSoodGFpbCszKSAmfiAweGZmZjsKKwkJKih0YWlsKzMpPSoodGFpbCszKSB8IGk7IC8vIGJ1ZmZlciBsZW5naHQKKwkJLy8gVXNlIHNob3J0IHByZWFtYmxlIG9yIG5vdAorCQlpZiAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSZXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJCQlpZiAocHJpdi0+cGxjcF9wcmVhbWJsZV9tb2RlPT0xICYmIHJhdGUhPTApCS8vICBzaG9ydCBtb2RlIG5vdywgbm90IGxvbmchCisJCQkvLwkqdGFpbCB8PSAoMTw8MTYpOwkJCQkvLyBlbmFibGUgc2hvcnQgcHJlYW1ibGUgbW9kZS4KKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQlpZihiQ1RTRW5hYmxlKSB7CisJCQkqdGFpbCB8PSAoMTw8MTgpOworCQl9CisKKwkJaWYoYlJUU0VuYWJsZSkgLy9ydHMgZW5hYmxlCisJCXsKKwkJCSp0YWlsIHw9ICgoaWVlZXJhdGUycnRscmF0ZShwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUpKTw8MTkpOy8vUlRTIFJBVEUKKwkJCSp0YWlsIHw9ICgxPDwyMyk7Ly9ydHMgZW5hYmxlCisJCQkqKHRhaWwrMSkgfD0oUnRzRHVyJjB4ZmZmZik7Ly9SVFMgRHVyYXRpb24KKwkJfQorCQkqKHRhaWwrMykgfD0gKChUeERlc2NEdXJhdGlvbiYweGZmZmYpPDwxNik7IC8vRFVSQVRJT04KKy8vCSAgICAgICAgKih0YWlsKzMpIHw9ICgweGU2PDwxNik7CisgICAgICAgIAkqKHRhaWwrNSkgfD0gKDExPDw4KTsvLyhwcml2LT5yZXRyeV9kYXRhPDw4KTsgLy9yZXRyeSBsaW0gOworI2Vsc2UKKwkJLy9Vc2UgUlRTIG9yIG5vdAorI2lmZGVmIENPTkZJR19SVEw4MTg3QgorCQlpZiAoIChsZW4+cHJpdi0+cnRzKSAmJiBwcml2LT5ydHMgJiYgcHJpb3JpdHkhPU1BTkFHRV9QUklPUklUWSl7CisjZWxzZQorCQlpZiAoIChsZW4+cHJpdi0+cnRzKSAmJiBwcml2LT5ydHMgJiYgcHJpb3JpdHk9PUxPV19QUklPUklUWSl7CisjZW5kaWYKKwkJCSp0YWlsIHw9ICgxPDwyMyk7CS8vZW5hbGJlIFJUUyBmdW5jdGlvbgorCQkJKnRhaWwgfD0gKDA8PDE5KTsJLy91c2UgMU0gYnBzIHNlbmQgUlRTIHBhY2tldAorCQkJQWNrQ3RzVGltZSA9IENvbXB1dGVUeFRpbWUoMTQsIDEwLDAsIDApOwkvLyBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQKKwkJCUZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgNCwgcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksIDAsICp0YWlsJigxPDwxNikpOworCQkJLy8gUlRTL0NUUyB0aW1lIGlzIGNhbGN1bGF0ZSBhcyBmb2xsb3cKKwkJCWR1cmF0aW9uID0gRnJhbWVUaW1lICsgMyoxMCArIDIqQWNrQ3RzVGltZTsJLy8xMHVzIGlzIHRoZSBTaWZzVGltZTsKKwkJCSoodGFpbCsxKSB8PSBkdXJhdGlvbjsgCS8vTmVlZCB0byBlZGl0IGhlcmUhICAtLS0taGlrYXJ1CisJCX1lbHNleworCQkJKih0YWlsKzEpPSAwOyAvLyB6ZXJvZXMgdGhlIHNlY29uZCAzMi1iaXRzIGR3b3JkIG9mIHRoZSBkZXNjcmlwdG9yCisJCX0KKyNlbmRpZgorCisJCSp0YWlsID0gKnRhaWwgfCAoKHJhdGUmMHhmKSA8PCAyNCk7CisJCS8vRE1FU0coInJhdGUgJWQiLHJhdGUpOworCisJCWlmKHByaXYtPmNhcmRfODE4NSl7CisKKwkJCSNpZiAwCisJCQkqKHRhaWwrNSkmPSB+KDE8PDI0KTsgLyogdHggYW50IDAgKi8KKworCQkJKih0YWlsKzUpICY9IH4oMTw8MjMpOyAvKiByYW5kb20gdHggYWdjIDIzLTE2ICovCisJCQkqKHRhaWwrNSkgfD0gKDE8PDIyKXwoMTw8MjEpfCgxPDwyMCl8KDE8PDE5KXwoMTw8MTgpfCgxPDwxNyl8KDE8PDE2KTsKKworCQkJKih0YWlsKzUpICY9Cit+KCgxPDwxNSl8KDE8PDE0KXwoMTw8MTMpfCgxPDwxMil8KDE8PDExKXwoMTw8MTApfCgxPDw5KXwoMTw8OCkpOworCQkJKih0YWlsKzUpIHw9ICg3PDw4KTsgLy8gTWF4IHJldHJ5IGxpbWl0CisKKwkJCSoodGFpbCs1KSAmPSB+KCgxPDw3KXwoMTw8Nil8KDE8PDUpfCgxPDw0KXwoMTw8Myl8KDE8PDIpfCgxPDwxKXwoMTw8MCkpOworCQkJKih0YWlsKzUpIHw9ICg4PDw0KTsgLy8gTWF4IGNvbnRlbnRpb24gd2luZG93CisJCQkqKHRhaWwrNikgfD0gNDsgLy8gTWluIGNvbnRlbnRpb24gd2luZG93CisJCQkjZW5kaWYKKyAgICAgICAgICAgLy8gICAgCSoodGFpbCs1KSA9IDA7CisJCX0KKworCQkvKiBod19wbGNwX2xlbiBpcyBub3QgdXNlZCBmb3IgcnRsODE4MCBjaGlwICovCisJCS8qIEZJWE1FICovCisJCWlmKHByaXYtPmNhcmRfODE4NSA9PSAwIHx8ICFwcml2LT5od19wbGNwX2xlbil7CisKKwkJCWR1cmF0aW9uID0gcnRsODE4MF9sZW4yZHVyYXRpb24obGVuLAorCQkJCXJhdGUsJmV4dCk7CisKKworI2lmZGVmIERFQlVHX1RYCisJCQlETUVTRygiUExDUCBkdXJhdGlvbiAlZCIsZHVyYXRpb24gKTsKKwkJCS8vRE1FU0coImRyaWZ0ICVkIixkcmlmdCk7CisJCQlETUVTRygiZXh0ZW5zaW9uICVzIiwgKGV4dD09MSkgPyAib24iOiJvZmYiKTsKKyNlbmRpZgorCQkJKih0YWlsKzEpID0gKih0YWlsKzEpIHwgKChkdXJhdGlvbiAmIDB4N2ZmZik8PDE2KTsKKwkJCWlmKGV4dCkgKih0YWlsKzEpID0gKih0YWlsKzEpIHwoMTw8MzEpOyAvL3BsY3AgbGVuZ3RoIGV4dGVuc2lvbgorCQl9CisKKwkJaWYobW9yZWZyYWcpICp0YWlsID0gKCp0YWlsKSB8ICgxPDwxNyk7IC8vIG1vcmUgZnJhZ21lbnQKKwkJaWYoIXJlbWFpbikgKnRhaWwgPSAoKnRhaWwpIHwgKDE8PDI4KTsgLy8gbGFzdCBzZWdtZW50IG9mIGZyYW1lCisKKyNpZmRlZiBERUJVR19UWF9GUkFHCisJCWlmKCFyZW1haW4pRE1FU0coIkxhc3QgZGVzY3JpcHRvciIpOworCQlpZihtb3JlZnJhZylETUVTRygiTW9yZSBmcmFnIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICoodGFpbCs1KSA9ICoodGFpbCs1KXwoMjw8MjcpOworICAgICAgICAgICAgICAgICoodGFpbCs3KSA9ICoodGFpbCs3KXwoMTw8NCk7CisKKwkJd21iKCk7CisJCWlmKG93bmJpdF9mbGFnKQorCQl7CisJCQkqdGFpbCA9ICp0YWlsIHwgKDE8PDMxKTsgLy8gZGVzY3JpcHRvciByZWFkeSB0byBiZSB0eGVkCisJCX0KKworI2lmZGVmIERFQlVHX1RYX0RFU0MyCisgICAgICAgICAgICAgICAgcHJpbnRrKCJ0eCBkZXNjIGlzOlxuIik7CisJCURNRVNHKCIlOHggJTh4ICU4eCAlOHggJTh4ICU4eCAlOHggJTh4IiwgdGFpbFswXSwgdGFpbFsxXSwgdGFpbFsyXSwgdGFpbFszXSwKKwkJCXRhaWxbNF0sIHRhaWxbNV0sIHRhaWxbNl0sIHRhaWxbN10pOworI2VuZGlmCisKKwkJaWYoKHRhaWwgLSBiZWdpbikvOCA9PSBjb3VudC0xKQorCQkJdGFpbD1iZWdpbjsKKworCQllbHNlCisJCQl0YWlsPXRhaWwrODsKKworCQlidWZsaXN0PWJ1Zmxpc3QtPm5leHQ7CisKKwkJbWIoKTsKKworCQlzd2l0Y2gocHJpb3JpdHkpIHsKKwkJCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgorCQkJCXByaXYtPnR4bWFwcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eG1hcGJ1ZnN0YWlsPWJ1Zmxpc3Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQktfUFJJT1JJVFk6CisJCQkJcHJpdi0+dHhia3ByaW5ndGFpbD10YWlsOworCQkJCXByaXYtPnR4YmtwYnVmc3RhaWw9YnVmbGlzdDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBCRV9QUklPUklUWToKKwkJCQlwcml2LT50eGJlcHJpbmd0YWlsPXRhaWw7CisJCQkJcHJpdi0+dHhiZXBidWZzdGFpbD1idWZsaXN0OworCQkJCWJyZWFrOworCisJCQljYXNlIFZJX1BSSU9SSVRZOgorCQkJCXByaXYtPnR4dmlwcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eHZpcGJ1ZnN0YWlsPWJ1Zmxpc3Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVk9fUFJJT1JJVFk6CisJCQkJcHJpdi0+dHh2b3ByaW5ndGFpbD10YWlsOworCQkJCXByaXYtPnR4dm9wYnVmc3RhaWw9YnVmbGlzdDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBISV9QUklPUklUWToKKwkJCQlwcml2LT50eGhwcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eGhwYnVmc3RhaWwgPSBidWZsaXN0OworCQkJCWJyZWFrOworCisJCQljYXNlIEJFQUNPTl9QUklPUklUWToKKwkJCQkvKiB0aGUgSFcgc2VlbXMgdG8gYmUgaGFwcHkgd2l0aCB0aGUgMXN0CisJCQkJICogZGVzY3JpcHRvciBmaWxsZWQgYW5kIHRoZSAybmQgZW1wdHkuLi4KKwkJCQkgKiBTbyBhbHdheXMgdXBkYXRlIGRlc2NyaXB0b3IgMSBhbmQgbmV2ZXIKKwkJCQkgKiB0b3VjaCAybmQKKwkJCQkgKi8KKwkJCS8vCXByaXYtPnR4YmVhY29ucmluZ3RhaWw9dGFpbDsKKwkJCS8vCXByaXYtPnR4YmVhY29uYnVmc3RhaWw9YnVmbGlzdDsKKworCQkJCWJyZWFrOworCisJCX0KKworCQkvL3J0bDgxODBfZG1hX2tpY2soZGV2LHByaW9yaXR5KTsKKwl9CisJKnRlbXBfdGFpbCA9ICp0ZW1wX3RhaWwgfCAoMTw8MzEpOyAvLyBkZXNjcmlwdG9yIHJlYWR5IHRvIGJlIHR4ZWQKKwlydGw4MTgwX2RtYV9raWNrKGRldixwcmlvcml0eSk7CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworCit9CisKKwordm9pZCBydGw4MTgwX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE4MF9wcml2ICogcHJpdik7CisKKwordm9pZCBydGw4MTgwX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKKy8vCXJ0bDgxODBfYWRhcHRlcl9zdGFydChkZXYpOworCXJ0bDgxODBfdXBkYXRlX21zcihkZXYpOworCisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsQlNTSUQsKCh1MzIqKW5ldC0+YnNzaWQpWzBdKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsQlNTSUQrNCwoKHUxNiopbmV0LT5ic3NpZClbMl0pOworCisKKwliZWFjb25faW50ZXJ2YWwgID0gcmVhZF9uaWNfZHdvcmQoZGV2LEJFQUNPTl9JTlRFUlZBTCk7CisJYmVhY29uX2ludGVydmFsICY9IH4gQkVBQ09OX0lOVEVSVkFMX01BU0s7CisJYmVhY29uX2ludGVydmFsIHw9IG5ldC0+YmVhY29uX2ludGVydmFsOworCXdyaXRlX25pY19kd29yZChkZXYsIEJFQUNPTl9JTlRFUlZBTCwgYmVhY29uX2ludGVydmFsKTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKworCisJLyoKKwl1MTYgYXRpbSA9IHJlYWRfbmljX2R3b3JkKGRldixBVElNKTsKKwl1MTYgPSB1MTYgJn4gQVRJTV9NQVNLOworCXUxNiA9IHUxNiB8IGJlYWNvbi0+YXRpbTsKKwkqLworI2lmIDAKKwlpZiAobmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpIHsKKwkJaWYgKHByaXYtPmh3X3dlcCkgeworCQkJRE1FU0coIkVuYWJsaW5nIGhhcmR3YXJlIFdFUCBzdXBwb3J0Iik7CisJCQlydGw4MTgwX3NldF9od193ZXAoZGV2KTsKKwkJCXByaXYtPmllZWU4MDIxMS0+aG9zdF9lbmNyeXB0PTA7CisJCQlwcml2LT5pZWVlODAyMTEtPmhvc3RfZGVjcnlwdD0wOworCQl9CisjaWZuZGVmIENPTkZJR19JRUVFODAyMTFfTk9XRVAKKwkJZWxzZSB7CisJCQlwcml2LT5pZWVlODAyMTEtPmhvc3RfZW5jcnlwdD0xOworCQkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQ9MTsKKwkJfQorI2VuZGlmCisJfQorI2lmbmRlZiBDT05GSUdfSUVFRTgwMjExX05PV0VQCisJZWxzZXsKKwkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2VuY3J5cHQ9MDsKKwkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQ9MDsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisKKwlpZihwcml2LT5jYXJkXzgxODUpCisJCXJ0bDgxODBfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKKworCit9CisKK3ZvaWQgcnRsODE4MF9ycV90eF9hY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldil7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PiVzXG4iLF9fRlVOQ1RJT05fXyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzQscmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHNCl8Q09ORklHNF9QV1JNR1QpOworCXByaXYtPmFja190eF90b19pZWVlID0gMTsKK30KKworc2hvcnQgcnRsODE4MF9pc190eF9xdWV1ZV9lbXB0eShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KXsKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIqIGQ7CisKKwlmb3IgKGQgPSBwcml2LT50eG1hcHJpbmc7CisJCWQgPCBwcml2LT50eG1hcHJpbmcgKyBwcml2LT50eHJpbmdjb3VudDtkKz04KQorCQkJaWYoKmQgJiAoMTw8MzEpKSByZXR1cm4gMDsKKworCWZvciAoZCA9IHByaXYtPnR4YmtwcmluZzsKKwkJZCA8IHByaXYtPnR4YmtwcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCisJZm9yIChkID0gcHJpdi0+dHhiZXByaW5nOworCQlkIDwgcHJpdi0+dHhiZXByaW5nICsgcHJpdi0+dHhyaW5nY291bnQ7ZCs9OCkKKwkJCWlmKCpkICYgKDE8PDMxKSkgcmV0dXJuIDA7CisKKwlmb3IgKGQgPSBwcml2LT50eHZpcHJpbmc7CisJCWQgPCBwcml2LT50eHZpcHJpbmcgKyBwcml2LT50eHJpbmdjb3VudDtkKz04KQorCQkJaWYoKmQgJiAoMTw8MzEpKSByZXR1cm4gMDsKKworCWZvciAoZCA9IHByaXYtPnR4dm9wcmluZzsKKwkJZCA8IHByaXYtPnR4dm9wcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCisJZm9yIChkID0gcHJpdi0+dHhocHJpbmc7CisJCWQgPCBwcml2LT50eGhwcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCXJldHVybiAxOworfQorLyogRklYTUUgRklYTUUgNW1zZWNzIGlzIHJhbmRvbSAqLworI2RlZmluZSBIV19XQUtFX0RFTEFZIDUKKwordm9pZCBydGw4MTgwX2h3X3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7CisJLy9ETUVTRygiV2FrZW4gdXAhIik7CisJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzQscmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHNCkmfkNPTkZJRzRfUFdSTUdUKTsKKworCWlmKHByaXYtPnJmX3dha2V1cCkKKwkJcHJpdi0+cmZfd2FrZXVwKGRldik7CisvLwltZGVsYXkoSFdfV0FLRV9ERUxBWSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7Cit9CisKK3ZvaWQgcnRsODE4MF9od19zbGVlcF9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKKyAgICAgICAvL0RNRVNHKCJTbGVlcCEiKTsKKworICAgICAgICBpZihwcml2LT5yZl9zbGVlcCkKKyAgICAgICAgICAgICAgICBwcml2LT5yZl9zbGVlcChkZXYpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKK30KKworCit2b2lkIHJ0bDgxODBfaHdfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRoLCB1MzIgdGwpCit7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl1MzIgcmIgPSBqaWZmaWVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7CisKKwkvKiBXcml0aW5nIEhXIHJlZ2lzdGVyIHdpdGggMCBlcXVhbHMgdG8gZGlzYWJsZQorCSAqIHRoZSB0aW1lciwgdGhhdCBpcyBub3QgcmVhbGx5IHdoYXQgd2Ugd2FudAorCSAqLworCXRsIC09IE1TRUNTKDQrMTYrNyk7CisKKwkvL2lmKHRsID09IDApIHRsID0gMTsKKworCS8qIEZJWE1FIEhBQ0sgRklYTUUgSEFDSyAqLworLy8JZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkvL21kZWxheSgxKTsKKworLy8JcmIgPSByZWFkX25pY19kd29yZChkZXYsIFRTRlRSKTsKKworCS8qIElmIHRoZSBpbnRlcnZhbCBpbiB3aXRjaCB3ZSBhcmUgcmVxdWVzdGVkIHRvIHNsZWVwIGlzIHRvbworCSAqIHNob3J0IHRoZW4gZ2l2ZSB1cCBhbmQgcmVtYWluIGF3YWtlCisJICovCisJaWYoKCh0bD49cmIpJiYgKHRsLXJiKSA8PSBNU0VDUyhNSU5fU0xFRVBfVElNRSkpCisJCXx8KChyYj50bCkmJiAocmItdGwpIDwgTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKKwkJcHJpbnRrKCJ0b28gc2hvcnQgdG8gc2xlZXBcbiIpOworCQlyZXR1cm47CisJfQorCisvLwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUaW1lckludCwgdGwpOworLy8JcmIgPSByZWFkX25pY19kd29yZChkZXYsIFRTRlRSKTsKKwl7CisJCXUzMiB0bXAgPSAodGw+cmIpPyh0bC1yYik6KHJiLXRsKTsKKwkvLwlpZiAodGw8cmIpCisKKwkJLy9sem0sYWRkLDA4MDgyOAorCQlwcml2LT5Eb3plUGVyaW9kSW5QYXN0MlNlYyArPSBqaWZmaWVzX3RvX21zZWNzKHRtcCk7CisKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSwgdG1wKTsgLy9hcyB0bCBtYXkgYmUgbGVzcyB0aGFuIHJiCisJfQorCS8qIGlmIHdlIHN1c3BlY3QgdGhlIFRpbWVySW50IGlzIGdvbmUgYmV5b25kIHRsCisJICogd2hpbGUgc2V0dGluZyBpdCwgdGhlbiBnaXZlIHVwCisJICovCisjaWYgMQorCWlmKCgodGwgPiByYikgJiYgKCh0bC1yYikgPiBNU0VDUyhNQVhfU0xFRVBfVElNRSkpKXx8CisJCSgodGwgPCByYikgJiYgKChyYi10bCkgPiBNU0VDUyhNQVhfU0xFRVBfVElNRSkpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorLy8JaWYocHJpdi0+cmZfc2xlZXApCisvLwkJcHJpdi0+cmZfc2xlZXAoZGV2KTsKKworCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5od19zbGVlcF93cSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7Cit9CisKKworLy92b2lkIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4ICphY19wYXJhbSkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj1LRVJORUxfVkVSU0lPTigyLDYsMjApCit2b2lkIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSx3bW1fcGFyYW1fdXBkYXRlX3dxKTsKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2KikoaWVlZS0+cHJpdik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKyNlbHNlCit2b2lkIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbmRpZgorCXU4ICphY19wYXJhbSA9ICh1OCAqKShpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX3BhcmFtKTsKKwl1OCBtb2RlID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGU7CisJQUNfQ09ESU5HCWVBQ0k7CisJQUNfUEFSQU0JQWNQYXJhbTsKKwlQQUNfUEFSQU0JcEFjUGFyYW07CisJdTggaTsKKworI2lmbmRlZiBDT05GSUdfUlRMODE4NUIKKyAgICAgICAgLy9mb3IgbGVnYWN5IDgxODUga2VlcCB0aGUgUEFSQU0gdW5jaGFuZ2UuCisJcmV0dXJuOworI2Vsc2UKKwlpZighaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpeworCQkvL2xlZ2FjeSBhY194eF9wYXJhbSB1cGRhdGUKKwkJQWNQYXJhbS5sb25nRGF0YSA9IDA7CisJCUFjUGFyYW0uZi5BY2lBaWZzbi5mLkFJRlNOID0gMjsgLy8gRm9sbG93IDgwMi4xMSBESUZTLgorCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BQ00gPSAwOworCQlBY1BhcmFtLmYuRWN3LmYuRUNXbWluID0gMzsgLy8gRm9sbG93IDgwMi4xMSBDV21pbi4KKwkJQWNQYXJhbS5mLkVjdy5mLkVDV21heCA9IDc7IC8vIEZvbGxvdyA4MDIuMTEgQ1dtYXguCisJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAwOworCQlmb3IoZUFDSSA9IDA7IGVBQ0kgPCBBQ19NQVg7IGVBQ0krKyl7CisJCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BQ0kgPSAodTgpZUFDSTsKKwkJCXsKKwkJCQl1OAkJdTFiQUlGUzsKKwkJCQl1MzIJCXU0YkFjUGFyYW07CisJCQkJcEFjUGFyYW0gPSAoUEFDX1BBUkFNKSgmQWNQYXJhbSk7CisJCQkJLy8gUmV0cml2ZSBwYXJhbXRlcnMgdG8gdWRwYXRlLgorCQkJCXUxYkFJRlMgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFJRlNOICooKChtb2RlJklFRUVfRykgPT0gSUVFRV9HKT85OjIwKSArIGFTaWZzVGltZTsKKwkJCQl1NGJBY1BhcmFtID0gKCgoKHUzMikocEFjUGFyYW0tPmYuVFhPUExpbWl0KSk8PEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKXwKKwkJCQkJICAgICAgKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtYXgpKTw8QUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpfAorCQkJCQkgICAgICAoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21pbikpPDxBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCl8CisJCQkJCSAgICAgICAoKCh1MzIpdTFiQUlGUykgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKwkJCQlzd2l0Y2goZUFDSSl7CisJCQkJCWNhc2UgQUMxX0JLOgorCQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQktfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQzBfQkU6CisJCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CRV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEFDMl9WSToKKwkJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZJX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUMzX1ZPOgorCQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVk9fUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNldEh3UmVnODE4NSgpOmludmFsaWQgQUNJOiAlZCFcbiIsIGVBQ0kpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybjsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBBQ19NQVg7IGkrKyl7CisJCS8vQWNQYXJhbS5sb25nRGF0YSA9IDA7CisJCXBBY1BhcmFtID0gKEFDX1BBUkFNICogKWFjX3BhcmFtOworCQl7CisJCQlBQ19DT0RJTkcJZUFDSTsKKwkJCXU4CQl1MWJBSUZTOworCQkJdTMyCQl1NGJBY1BhcmFtOworCisJCQkvLyBSZXRyaXZlIHBhcmFtdGVycyB0byB1ZHBhdGUuCisJCQllQUNJID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BQ0k7CisJCQkvL01vZGUgRy9BOiBzbG90VGltZVRpbWVyID0gOTsgTW9kZSBCOiAyMAorCQkJdTFiQUlGUyA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUlGU04gKiAoKChtb2RlJklFRUVfRykgPT0gSUVFRV9HKT85OjIwKSArIGFTaWZzVGltZTsKKwkJCXU0YkFjUGFyYW0gPSAoCSgoKHUzMikocEFjUGFyYW0tPmYuVFhPUExpbWl0KSkgPDwgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpCXwKKwkJCQkJKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtYXgpKSA8PCBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCkJfAorCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21pbikpIDw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKQl8CisJCQkJCSgoKHUzMil1MWJBSUZTKSA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOworCisJCQlzd2l0Y2goZUFDSSl7CisJCQkJY2FzZSBBQzFfQks6CisJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JLX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFDMF9CRToKKwkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQkVfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQUMyX1ZJOgorCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WSV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBQzNfVk86CisJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZPX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZXRId1JlZzgxODUoKTogaW52YWxpZCBBQ0k6ICVkICFcbiIsIGVBQ0kpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlhY19wYXJhbSArPSAoc2l6ZW9mKEFDX1BBUkFNKSk7CisJfQorI2VuZGlmCit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfdHhfaXJxX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX3R4X2lycV93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisKKworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3Jlc3RhcnRfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKy8vdm9pZCBydGw4MTgwX3JxX3R4X2FjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKKyB2b2lkIHJ0bDgxODBfcmVzdGFydF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vdm9pZCBydGw4MTgwX3JxX3R4X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF93YXRjaF9kb2dfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCit2b2lkIHJ0bDgxODBfd2F0Y2hfZG9nX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX2h3X3dha2V1cF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKK3ZvaWQgcnRsODE4MF9od193YWtldXBfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9od19zbGVlcF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKK3ZvaWQgcnRsODE4MF9od19zbGVlcF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9zd19hbnRlbm5hX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX3N3X2FudGVubmFfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKyB2b2lkIHJ0bDgxODBfd2F0Y2hfZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCB3YXRjaF9kb2dfYWRhcHRpdmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworICAgIHN0cnVjdCByODE4MF9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CisvLwlETUVTRygiLS0tLT53YXRjaF9kb2dfYWRhcHRpdmUoKVxuIik7CisJaWYoIXByaXYtPnVwKQorCXsKKwkJRE1FU0coIjwtLS0td2F0Y2hfZG9nX2FkYXB0aXZlKCk6ZHJpdmVyIGlzIG5vdCB1cCFcbiIpOworCQlyZXR1cm47CisJfQorCisgIC8vICAgICAgcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCZwcml2LT5pZWVlODAyMTEtPndhdGNoX2RvZ193cSk7CisvL3tieSBhbXkgMDgwMzEyCisjaWYgMQorCS8vIFR4IEhpZ2ggUG93ZXIgTWVjaGFuaXNtLgorI2lmZGVmIEhJR0hfUE9XRVIKKwlpZihDaGVja0hpZ2hQb3dlcigoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKSkKKwl7CisJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gVHggUG93ZXIgVHJhY2tpbmcgb24gODdTRS4KKyNpZmRlZiBUWF9UUkFDSworCS8vaWYoIHByaXYtPmJUeFBvd2VyVHJhY2sgKQkvL2x6bSBtb2QgMDgwODI2CisJaWYoIENoZWNrVHhQd3JUcmFja2luZygoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKSk7CisJCVR4UHdyVHJhY2tpbmc4N1NFKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOworI2VuZGlmCisjZW5kaWYKKworCS8vIFBlcmZvcm0gRElHIGltbWVkaWF0ZWx5LgorI2lmZGVmIFNXX0RJRworCWlmKENoZWNrRGlnKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpID09IHRydWUpCisJeworCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorLy9ieSBhbXkgMDgwMzEyfQorICAgCXJ0bDgxODBfd2F0Y2hfZG9nKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOworCisKKwlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0pOworCisgICAJcHJpdi0+d2F0Y2hfZG9nX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MoSUVFRTgwMjExX1dBVENIX0RPR19USU1FKTsKKwlhZGRfdGltZXIoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisvLyAgICAgICAgRE1FU0coIjwtLS0td2F0Y2hfZG9nX2FkYXB0aXZlKClcbiIpOworfQorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCitzdGF0aWMgQ0hBTk5FTF9MSVNUIENoYW5uZWxQbGFuW10gPSB7CisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMTl9LCAgCQkvL0ZDQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTF9LDExfSwgICAgICAgICAgICAgICAgICAgIAkJCQkvL0lDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LCAgCS8vRVRTSQorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgICAgLy9TcGFpbi4gQ2hhbmdlIHRvIEVUU0kuCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LCAgCS8vRnJhbmNlLiBDaGFuZ2UgdG8gRVRTSS4KKwl7ezE0LDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSw5fSwJCQkJCQkvL01LSworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsIDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMn0sLy9NS0sxCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LAkvL0lzcmFlbC4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM0LDM4LDQyLDQ2fSwxN30sCQkJLy8gRm9yIDExYSAsIFRFTEVDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sMTR9LCAgLy9Gb3IgR2xvYmFsIERvbWFpbi4gMS0xMTphY3RpdmUgc2NhbiwgMTItMTQgcGFzc2l2ZSBzY2FuLiAvLytZSiwgMDgwNjI2CisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM30sMTN9IC8vd29ybGQgd2lkZSAxMzogY2gxfmNoMTEgYWN0aXZlIHNjYW4sIGNoMTJ+MTMgcGFzc2l2ZSAvL2x6bSBhZGQgMDgwODI2Cit9OworCitzdGF0aWMgdm9pZCBydGw4MTgwX3NldF9jaGFubmVsX21hcCh1OCBjaGFubmVsX3BsYW4sIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCisJLy9sem0gYWRkIDA4MDgyNgorCWllZWUtPk1pblBhc3NpdmVDaG5sTnVtPU1BWF9DSEFOTkVMX05VTUJFUisxOworCWllZWUtPklic3NTdGFydENobmw9MDsKKworCXN3aXRjaCAoY2hhbm5lbF9wbGFuKQorCXsKKwkJY2FzZSBDT1VOVFJZX0NPREVfRkNDOgorCQljYXNlIENPVU5UUllfQ09ERV9JQzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfRVRTSToKKwkJY2FzZSBDT1VOVFJZX0NPREVfU1BBSU46CisJCWNhc2UgQ09VTlRSWV9DT0RFX0ZSQU5DRToKKwkJY2FzZSBDT1VOVFJZX0NPREVfTUtLOgorCQljYXNlIENPVU5UUllfQ09ERV9NS0sxOgorCQljYXNlIENPVU5UUllfQ09ERV9JU1JBRUw6CisJCWNhc2UgQ09VTlRSWV9DT0RFX1RFTEVDOgorCQl7CisJCQlEb3QxMWRfSW5pdChpZWVlKTsKKwkJCWllZWUtPmJHbG9iYWxEb21haW4gPSBmYWxzZTsKKwkJCWlmIChDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbiAhPSAwKXsKKwkJCQkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXAKKwkJCQltZW1zZXQoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgMCwgc2l6ZW9mKEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXApKTsKKwkJCQkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwCisJCQkJZm9yIChpPTA7aTxDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbjtpKyspCisJCQkJeworCQkJCQlpZihDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV0gPD0gMTQpCisJCQkJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW0NoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXV0gPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU46CisJCXsKKwkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+YkVuYWJsZWQgPSAwOworCQkJRG90MTFkX1Jlc2V0KGllZWUpOworCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQljYXNlIENPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzX0lOREVYOi8vbHptIGFkZCAwODA4MjYKKwkJeworCQlpZWVlLT5NaW5QYXNzaXZlQ2hubE51bT0xMjsKKwkJaWVlZS0+SWJzc1N0YXJ0Q2hubD0gMTA7CisJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCURvdDExZF9Jbml0KGllZWUpOworCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IGZhbHNlOworCQkJbWVtc2V0KEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIDAsIHNpemVvZihHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwKSk7CisJCQlmb3IgKGk9MTtpPD0xNDtpKyspCisJCQl7CisJCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtpXSA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbmRpZgorCisvL0FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKyNlbmRpZgorCisvL1lKLGFkZCwwODA4MjgKK3N0YXRpYyB2b2lkIHJ0bDgxODBfc3RhdGlzdGljc19pbml0KHN0cnVjdCBTdGF0cyAqcHN0YXRzKQoreworCW1lbXNldChwc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgU3RhdHMpKTsKK30KK3N0YXRpYyB2b2lkIHJ0bDgxODBfbGlua19kZXRlY3RfaW5pdChwbGlua19kZXRlY3RfdCBwbGlua19kZXRlY3QpCit7CisJbWVtc2V0KHBsaW5rX2RldGVjdCwgMCwgc2l6ZW9mKGxpbmtfZGV0ZWN0X3QpKTsKKwlwbGlua19kZXRlY3QtPlNsb3ROdW0gPSBERUZBVUxUX1NMT1RfTlVNOworfQorLy9ZSixhZGQsMDgwODI4LGVuZAorCitzaG9ydCBydGw4MTgwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHdvcmQ7CisJdTE2IHZlcnNpb247CisJdTggaHdfdmVyc2lvbjsKKwkvL3U4IGNvbmZpZzM7CisJdTMyIHVzVmFsdWU7CisJdTE2IHRtcHUxNjsKKwlpbnQgaSwgajsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpZiAwCisJZm9yKGk9MDtpPDB4RkY7aSsrKSB7CisJCWlmKGklMTYgPT0gMCkKKwkJCXByaW50aygiXG5bJXhdOiAiLCBpLzE2KTsKKwkJcHJpbnRrKCJcdCU0LjR4IiwgZXByb21fcmVhZChkZXYsaSkpOworCX0KKyNlbmRpZgorCXByaXYtPmNoYW5uZWxfcGxhbiA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fQ09VTlRSWV9DT0RFPj4xKSAmIDB4RkY7CisJaWYocHJpdi0+Y2hhbm5lbF9wbGFuID4gQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4peworCQlwcmludGsoInJ0bDgxODBfaW5pdDpFcnJvciBjaGFubmVsIHBsYW4hIFNldCB0byBkZWZhdWx0LlxuIik7CisJCXByaXYtPmNoYW5uZWxfcGxhbiA9IDA7CisJfQorCS8vcHJpdi0+Y2hhbm5lbF9wbGFuID0gOTsgIC8vR2xvYmFsIERvbWFpbgorCisJRE1FU0coIkNoYW5uZWwgcGxhbiBpcyAlZFxuIixwcml2LT5jaGFubmVsX3BsYW4pOworCXJ0bDgxODBfc2V0X2NoYW5uZWxfbWFwKHByaXYtPmNoYW5uZWxfcGxhbiwgcHJpdi0+aWVlZTgwMjExKTsKKyNlbHNlCisJaW50IGNoOworCS8vU2V0IERlZmF1bHQgQ2hhbm5lbCBQbGFuCisJaWYoIWNoYW5uZWxzKXsKKwkJRE1FU0coIk5vIGNoYW5uZWxzLCBhYm9ydGluZyIpOworCQlyZXR1cm4gLTE7CisJfQorCWNoPWNoYW5uZWxzOworCXByaXYtPmNoYW5uZWxfcGxhbiA9IDA7Ly9oaWthcnUKKwkgLy8gc2V0IGNoYW5uZWxzIDEuLjE0IGFsbG93ZWQgaW4gZ2l2ZW4gbG9jYWxlCisJZm9yIChpPTE7IGk8PTE0OyBpKyspIHsKKwkJKHByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXApW2ldID0gKHU4KShjaCAmIDB4MDEpOworCQljaCA+Pj0gMTsKKwl9CisjZW5kaWYKKworCS8vbWVtY3B5KHByaXYtPnN0YXRzLDAsc2l6ZW9mKHN0cnVjdCBTdGF0cykpOworCisJLy9GSVhNRTogdGhlc2UgY29uc3RhbnRzIGFyZSBwbGFjZWQgaW4gYSBiYWQgcGxlYWNlLgorCXByaXYtPnR4YnVmZnNpemUgPSAyMDQ4Oy8vMTAyNDsKKwlwcml2LT50eHJpbmdjb3VudCA9IDMyOy8vMzI7CisJcHJpdi0+cnhidWZmZXJzaXplID0gMjA0ODsvLzEwMjQ7CisJcHJpdi0+cnhyaW5nY291bnQgPSA2NDsvLzMyOworCXByaXYtPnR4YmVhY29uY291bnQgPSAyOworCXByaXYtPnJ4X3NrYl9jb21wbGV0ZSA9IDE7CisJLy9wcml2LT50eG5wX3BlbmRpbmcuaXNwZW5kaW5nPTA7CisJLyogXl4gdGhlIFNLQiBkb2VzIG5vdCBjb250YWludCBhIHBhcnRpYWwgUlhlZAorCSAqIHBhY2tldCAoaXMgZW1wdHkpCisJICovCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJcHJpdi0+UmVnVGhyZWVXaXJlTW9kZSA9IEhXX1RIUkVFX1dJUkVfU0k7CisjZWxzZQorICAgICAgICBwcml2LT5SZWdUaHJlZVdpcmVNb2RlID0gU1dfVEhSRUVfV0lSRTsKKyNlbmRpZgorI2VuZGlmCisKKy8vQWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gZmFsc2U7CisJcHJpdi0+UkZQcm9nVHlwZSA9IDA7CisJcHJpdi0+YkluSGN0VGVzdCA9IGZhbHNlOworCisJcHJpdi0+aXJxX2VuYWJsZWQ9MDsKKworLy9ZSixtb2RpZmllZCwwODA4MjgKKyNpZiAwCisJcHJpdi0+c3RhdHMucnhkbWFmYWlsPTA7CisJcHJpdi0+c3RhdHMudHhyZHU9MDsKKwlwcml2LT5zdGF0cy5yeHJkdT0wOworCXByaXYtPnN0YXRzLnJ4bm9sYXN0PTA7CisJcHJpdi0+c3RhdHMucnhub2RhdGE9MDsKKwkvL3ByaXYtPnN0YXRzLnJ4cmVzZXQ9MDsKKwkvL3ByaXYtPnN0YXRzLnJ4d3JrYXJvdW5kPTA7CisJcHJpdi0+c3RhdHMucnhub3BvaW50ZXI9MDsKKwlwcml2LT5zdGF0cy50eG5wZXJyPTA7CisJcHJpdi0+c3RhdHMudHhyZXN1bWVkPTA7CisJcHJpdi0+c3RhdHMucnhlcnI9MDsKKwlwcml2LT5zdGF0cy5yeG92ZXJmbG93PTA7CisJcHJpdi0+c3RhdHMucnhpbnQ9MDsKKwlwcml2LT5zdGF0cy50eG5wb2tpbnQ9MDsKKwlwcml2LT5zdGF0cy50eGhwb2tpbnQ9MDsKKwlwcml2LT5zdGF0cy50eGhwZXJyPTA7CisJcHJpdi0+c3RhdHMuaW50cz0wOworCXByaXYtPnN0YXRzLnNoaW50cz0wOworCXByaXYtPnN0YXRzLnR4b3ZlcmZsb3c9MDsKKwlwcml2LT5zdGF0cy50eGJlYWNvbj0wOworCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyPTA7CisJcHJpdi0+c3RhdHMudHhscGVycj0wOworCXByaXYtPnN0YXRzLnR4bHBva2ludD0wOworCXByaXYtPnN0YXRzLnR4cmV0cnk9MDsvL3RvbnkgMjAwNjA2MDEKKwlwcml2LT5zdGF0cy5yeGNyY2Vycm1pbj0wOworCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWlkPTA7CisJcHJpdi0+c3RhdHMucnhjcmNlcnJtYXg9MDsKKwlwcml2LT5zdGF0cy5yeGljdmVycj0wOworI2Vsc2UKKwlydGw4MTgwX3N0YXRpc3RpY3NfaW5pdCgmcHJpdi0+c3RhdHMpOworCXJ0bDgxODBfbGlua19kZXRlY3RfaW5pdCgmcHJpdi0+bGlua19kZXRlY3QpOworI2VuZGlmCisvL1lKLG1vZGlmaWVkLDA4MDgyOCxlbmQKKworCisJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAwOworCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9IERFRkFVTFRfQkVBQ09OSU5URVJWQUw7CisJcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfZmVhdHVyZXMgID0gSUVFRV9TT0ZUTUFDX1NDQU4gfAorCQlJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIHwgSUVFRV9TT0ZUTUFDX1BST0JFUlEgfAorCQlJRUVFX1NPRlRNQUNfUFJPQkVSUyB8IElFRUVfU09GVE1BQ19UWF9RVUVVRTsKKwlwcml2LT5pZWVlODAyMTEtPmFjdGl2ZV9zY2FuID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPnJhdGUgPSAxMTA7IC8vMTEgbWJwcworCXByaXYtPmllZWU4MDIxMS0+bW9kdWxhdGlvbiA9IElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTjsKKwlwcml2LT5pZWVlODAyMTEtPmhvc3RfZW5jcnlwdCA9IDE7CisJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQgPSAxOworCXByaXYtPmllZWU4MDIxMS0+c3RhX3dha2VfdXAgPSBydGw4MTgwX2h3X3dha2V1cDsKKwlwcml2LT5pZWVlODAyMTEtPnBzX3JlcXVlc3RfdHhfYWNrID0gcnRsODE4MF9ycV90eF9hY2s7CisJcHJpdi0+aWVlZTgwMjExLT5lbnRlcl9zbGVlcF9zdGF0ZSA9IHJ0bDgxODBfaHdfc2xlZXA7CisJcHJpdi0+aWVlZTgwMjExLT5wc19pc19xdWV1ZV9lbXB0eSA9IHJ0bDgxODBfaXNfdHhfcXVldWVfZW1wdHk7CisKKwlwcml2LT5od193ZXAgPSBod3dlcDsKKwlwcml2LT5wcmlzbV9oZHI9MDsKKwlwcml2LT5kZXY9ZGV2OworCXByaXYtPnJldHJ5X3J0cyA9IERFRkFVTFRfUkVUUllfUlRTOworCXByaXYtPnJldHJ5X2RhdGEgPSBERUZBVUxUX1JFVFJZX0RBVEE7CisJcHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7CisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworCXByaXYtPlJGUHJvZ1R5cGUgPSAwOworCXByaXYtPmJJbkhjdFRlc3QgPSBmYWxzZTsKKwlwcml2LT5iSW5hY3RpdmVQcyA9IHRydWU7Ly9mYWxzZTsKKwlwcml2LT5pZWVlODAyMTEtPmJJbmFjdGl2ZVBzID0gcHJpdi0+YkluYWN0aXZlUHM7CisJcHJpdi0+YlN3UmZQcm9jZXNzaW5nID0gZmFsc2U7CisJcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSZk9mZjsKKwlwcml2LT5SZk9mZlJlYXNvbiA9IDA7CisJcHJpdi0+TGVkU3RyYXRlZ3kgPSBTV19MRURfTU9ERTA7CisJLy9wcml2LT5OdW1SeE9rSW5QZXJpb2QgPSAwOyAgLy9ZSixkZWwsMDgwODI4CisJLy9wcml2LT5OdW1UeE9rSW5QZXJpb2QgPSAwOyAgLy9ZSixkZWwsMDgwODI4CisJcHJpdi0+VHhQb2xsaW5nVGltZXMgPSAwOy8vbHptIGFkZCAwODA4MjYKKwlwcml2LT5iTGVpc3VyZVBzID0gdHJ1ZTsKKwlwcml2LT5kb3QxMVBvd2VyU2F2ZU1vZGUgPSBlQWN0aXZlOworLy9ieSBhbXkgZm9yIGFudGVubmEKKwlwcml2LT5BZE1pbkNoZWNrUGVyaW9kID0gNTsKKwlwcml2LT5BZE1heENoZWNrUGVyaW9kID0gMTA7CisvLyBMb3dlciBzaWduYWwgc3RyZW5ndGggdGhyZXNob2xkIHRvIGZpdCB0aGUgSFcgcGFydGljaXBhdGlvbiBpbiBhbnRlbm5hIGRpdmVyc2l0eS4gK2J5IGFteSAwODAzMTIKKwlwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQgPSAzMDsvLzYwLT4zMAorCXByaXYtPkFkUnhTc1RocmVzaG9sZCA9IDIwOy8vNTAtPjIwCisJcHJpdi0+QWRDaGVja1BlcmlvZCA9IHByaXYtPkFkTWluQ2hlY2tQZXJpb2Q7CisJcHJpdi0+QWRUaWNrQ291bnQgPSAwOworCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA9IC0xOworCXByaXYtPlJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbSA9IDA7CisJcHJpdi0+UmVnRGVmYXVsdEFudGVubmEgPSAwOworCXByaXYtPlNpZ25hbFN0cmVuZ3RoID0gMDsKKwlwcml2LT5BZFJ4T2tDbnQgPSAwOworCXByaXYtPkN1cnJBbnRlbm5hSW5kZXggPSAwOworCXByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkID0gMDsKKwlpbml0X3RpbWVyKCZwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lcik7CisJcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lci5mdW5jdGlvbiA9ICh2b2lkICopU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjazsKKy8vYnkgYW15IGZvciBhbnRlbm5hCisvL3tieSBhbXkgMDgwMzEyCisJcHJpdi0+YkRpZ01lY2hhbmlzbSA9IDE7CisJcHJpdi0+SW5pdGlhbEdhaW4gPSA2OworCXByaXYtPmJYdGFsQ2FsaWJyYXRpb24gPSBmYWxzZTsKKwlwcml2LT5YdGFsQ2FsX1hpbiA9IDA7CisJcHJpdi0+WHRhbENhbF9Yb3V0ID0gMDsKKwlwcml2LT5iVHhQb3dlclRyYWNrID0gZmFsc2U7CisJcHJpdi0+VGhlcm1hbE1ldGVyID0gMDsKKwlwcml2LT5GYWxzZUFsYXJtUmVnVmFsdWUgPSAwOworCXByaXYtPlJlZ0RpZ09mZG1GYVVwVGggPSAweGM7IC8vIFVwcGVyIHRocmVob2xkIG9mIE9GRE0gZmFsc2UgYWxhcm0sIHdoaWNoIGlzIHVzZWQgaW4gRElHLgorCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUgPSAwOworCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZSA9IDA7CisJcHJpdi0+TGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50ID0gMDsKKwlwcml2LT5TdGF0c19TaWduYWxTdHJlbmd0aCA9IDA7CisJcHJpdi0+TGFzdFJ4UGt0QW50ZW5uYSA9IDA7CisJcHJpdi0+U2lnbmFsUXVhbGl0eSA9IDA7IC8vIGluIDAtMTAwIGluZGV4LgorCXByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgPSAwOworCXByaXYtPlJlY3ZTaWduYWxQb3dlciA9IDA7IC8vIGluIGRCbS4KKwlwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgPSAwOworCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250ID0gMDsKKwlwcml2LT5BZEF1eEFudGVubmFSeE9rQ250ID0gMDsKKwlwcml2LT5iSFdBZFN3aXRjaGVkID0gZmFsc2U7CisJcHJpdi0+YlJlZ0hpZ2hQb3dlck1lY2hhbmlzbSA9IHRydWU7CisJcHJpdi0+UmVnSGlQd3JVcHBlclRoID0gNzc7CisJcHJpdi0+UmVnSGlQd3JMb3dlclRoID0gNzU7CisJcHJpdi0+UmVnUlNTSUhpUHdyVXBwZXJUaCA9IDcwOworCXByaXYtPlJlZ1JTU0lIaVB3ckxvd2VyVGggPSAyMDsKKwlwcml2LT5iQ3VyQ0NLUGt0ID0gZmFsc2U7CisJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gLTE7CisJcHJpdi0+YlRvVXBkYXRlVHhQd3IgPSBmYWxzZTsKKwlwcml2LT5DdXJDQ0tSU1NJID0gMDsKKwlwcml2LT5SeFBvd2VyID0gMDsKKwlwcml2LT5SU1NJID0gMDsKKwkvL1lKLGFkZCwwODA4MjgKKwlwcml2LT5OdW1UeE9rVG90YWwgPSAwOworCXByaXYtPk51bVR4VW5pY2FzdCA9IDA7CisJcHJpdi0+a2VlcEFsaXZlTGV2ZWwgPSBERUZBVUxUX0tFRVBfQUxJVkVfTEVWRUw7CisJcHJpdi0+UG93ZXJQcm9maWxlID0gUE9XRVJfUFJPRklMRV9BQzsKKwkvL1lKLGFkZCwwODA4MjgsZW5kCisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorICAgIHByaXYtPkN1cnJSZXRyeUNudD0wOworICAgIHByaXYtPkxhc3RSZXRyeUNudD0wOworICAgIHByaXYtPkxhc3RUeG9rQ250PTA7CisgICAgcHJpdi0+TGFzdFJ4b2tDbnQ9MDsKKyAgICBwcml2LT5MYXN0UmV0cnlSYXRlPTA7CisgICAgcHJpdi0+YlRyeXVwaW5nPTA7CisgICAgcHJpdi0+Q3VyclR4UmF0ZT0wOworICAgIHByaXYtPkN1cnJSZXRyeVJhdGU9MDsKKyAgICBwcml2LT5Ucnl1cGluZ0NvdW50PTA7CisgICAgcHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YT0wOworICAgIHByaXYtPlRyeURvd25Db3VudExvd0RhdGE9MDsKKyAgICBwcml2LT5MYXN0VHhPS0J5dGVzPTA7CisgICAgcHJpdi0+TGFzdEZhaWxUeFJhdGU9MDsKKyAgICBwcml2LT5MYXN0RmFpbFR4UmF0ZVNTPTA7CisgICAgcHJpdi0+RmFpbFR4UmF0ZUNvdW50PTA7CisgICAgcHJpdi0+TGFzdFR4VGhyb3VnaHB1dD0wOworICAgIHByaXYtPk51bVR4T2tCeXRlc1RvdGFsPTA7CisJcHJpdi0+Rm9yY2VkRGF0YVJhdGUgPSAwOworCXByaXYtPlJlZ0JNb2RlR2FpblN0YWdlID0gMTsKKworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKy8vYnkgYW15IDA4MDMxMn0KKwlwcml2LT5wcm9taXNjID0gKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxOjA7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmlycV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxX3RoX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cHNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJmX3BzX2xvY2spOworCXNlbWFfaW5pdCgmcHJpdi0+d3hfc2VtLDEpOworCXNlbWFfaW5pdCgmcHJpdi0+cmZfc3RhdGUsMSk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQorCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd3EsKHZvaWQqKSBydGw4MTgwX3Jlc3RhcnRfd3EpOworCUlOSVRfV09SSygmcHJpdi0+dHhfaXJxX3dxLCh2b2lkKikgcnRsODE4MF90eF9pcnFfd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSwodm9pZCopIHJ0bDgxODBfaHdfd2FrZXVwX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od19zbGVlcF93cSwodm9pZCopIHJ0bDgxODBfaHdfc2xlZXBfd3EpOworCS8vSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+d2F0Y2hfZG9nX3dxLCh2b2lkKikgcnRsODE4MF93YXRjaF9kb2dfd3EpOworCS8vSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+c3dfYW50ZW5uYV93cSwodm9pZCopIHJ0bDgxODBfc3dfYW50ZW5uYV93cSk7CisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPndtbV9wYXJhbV91cGRhdGVfd3EsKHZvaWQqKSBydGw4MTgwX3dtbV9wYXJhbV91cGRhdGUpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPnJhdGVfYWRhcHRlcl93cSwodm9pZCopcnRsODE4MF9yYXRlX2FkYXB0ZXIpOy8vK2J5IGFteSAwODAzMTIKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EsKHZvaWQqKXJ0bDgxODBfaHdfZGlnX3dxKTsvLytieSBhbXkgMDgwMzEyCisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EsKHZvaWQqKXJ0bDgxODBfdHhfcHdfd3EpOy8vK2J5IGFteSAwODAzMTIKKworCS8vYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSwodm9pZCopIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2spOworI2Vsc2UKKwlJTklUX1dPUksoJnByaXYtPnJlc2V0X3dxLCh2b2lkKikgcnRsODE4MF9yZXN0YXJ0X3dxLGRldik7CisJSU5JVF9XT1JLKCZwcml2LT50eF9pcnFfd3EsKHZvaWQqKSBydGw4MTgwX3R4X2lycV93cSxkZXYpOworCS8vSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPndhdGNoX2RvZ193cSwodm9pZCopIHJ0bDgxODBfd2F0Y2hfZG9nX3dxLGRldik7CisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSwodm9pZCopIHJ0bDgxODBfaHdfd2FrZXVwX3dxLGRldik7CisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X3NsZWVwX3dxLCh2b2lkKikgcnRsODE4MF9od19zbGVlcF93cSxkZXYpOworCS8vSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPnN3X2FudGVubmFfd3EsKHZvaWQqKSBydGw4MTgwX3N3X2FudGVubmFfd3EsZGV2KTsKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+d21tX3BhcmFtX3VwZGF0ZV93cSwodm9pZCopIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZSxwcml2LT5pZWVlODAyMTEpOworICAgIElOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT5yYXRlX2FkYXB0ZXJfd3EsKHZvaWQqKXJ0bDgxODBfcmF0ZV9hZGFwdGVyLGRldik7Ly8rYnkgYW15IDA4MDMxMgorCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EsKHZvaWQqKXJ0bDgxODBfaHdfZGlnX3dxLGRldik7Ly8rYnkgYW15IDA4MDMxMgorCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSwodm9pZCopcnRsODE4MF90eF9wd193cSxkZXYpOy8vK2J5IGFteSAwODAzMTIKKworCS8vYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0sKHZvaWQqKSBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrLCBwcml2LT5pZWVlODAyMTEpOworI2VuZGlmCisJLy9JTklUX1dPUksoJnByaXYtPnJlc2V0X3dxLCh2b2lkKikgcnRsODE4MF9yZXN0YXJ0X3dxLGRldik7CisKKwl0YXNrbGV0X2luaXQoJnByaXYtPmlycV9yeF90YXNrbGV0LAorCQkgICAgICh2b2lkKCopKHVuc2lnbmVkIGxvbmcpKSBydGw4MTgwX2lycV9yeF90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXByaXYpOworLy9ieSBhbXkKKyAgICBpbml0X3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCXByaXYtPndhdGNoX2RvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXByaXYtPndhdGNoX2RvZ190aW1lci5mdW5jdGlvbiA9IHdhdGNoX2RvZ19hZGFwdGl2ZTsKKy8vYnkgYW15CisKKy8ve2J5IGFteSAwODAzMTIKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisgICAgaW5pdF90aW1lcigmcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIpOworICAgICAgICBwcml2LT5yYXRlYWRhcHRlcl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworICAgICAgICBwcml2LT5yYXRlYWRhcHRlcl90aW1lci5mdW5jdGlvbiA9IHRpbWVyX3JhdGVfYWRhcHRpdmU7CisJCXByaXYtPlJhdGVBZGFwdGl2ZVBlcmlvZD0gUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0Q7CisJCXByaXYtPmJFbmhhbmNlVHhQd3I9ZmFsc2U7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorLy9ieSBhbXkgMDgwMzEyfQorCS8vcHJpdi0+aWVlZTgwMjExLT5mdW5jID0KKwkvLwlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hlbHBlcl9mdW5jdGlvbnMpLEdGUF9LRVJORUwpOworCS8vbWVtc2V0KHByaXYtPmllZWU4MDIxMS0+ZnVuYywgMCwKKwkgIC8vICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZWxwZXJfZnVuY3Rpb25zKSk7CisKKwlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0ID0gcnRsODE4MF9oYXJkX3N0YXJ0X3htaXQ7CisJcHJpdi0+aWVlZTgwMjExLT5zZXRfY2hhbiA9IHJ0bDgxODBfc2V0X2NoYW47CisJcHJpdi0+aWVlZTgwMjExLT5saW5rX2NoYW5nZSA9IHJ0bDgxODBfbGlua19jaGFuZ2U7CisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0ID0gcnRsODE4MF9oYXJkX2RhdGFfeG1pdDsKKwlwcml2LT5pZWVlODAyMTEtPmRhdGFfaGFyZF9zdG9wID0gcnRsODE4MF9kYXRhX2hhcmRfc3RvcDsKKwlwcml2LT5pZWVlODAyMTEtPmRhdGFfaGFyZF9yZXN1bWUgPSBydGw4MTgwX2RhdGFfaGFyZF9yZXN1bWU7CisKKyAgICAgICAgcHJpdi0+aWVlZTgwMjExLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAwOworCisJcHJpdi0+aWVlZTgwMjExLT5zdGFydF9zZW5kX2JlYWNvbnMgPSBydGw4MTgwX3N0YXJ0X3R4X2JlYWNvbjsKKwlwcml2LT5pZWVlODAyMTEtPnN0b3Bfc2VuZF9iZWFjb25zID0gcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZTsKKwlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwcml2LT5NV0lFbmFibGUgPSAwOworCisJcHJpdi0+U2hvcnRSZXRyeUxpbWl0ID0gNzsKKwlwcml2LT5Mb25nUmV0cnlMaW1pdCA9IDc7CisJcHJpdi0+RWFybHlSeFRocmVzaG9sZCA9IDc7CisKKwlwcml2LT5DU01ldGhvZCA9ICgweDAxIDw8IDI5KTsKKworCXByaXYtPlRyYW5zbWl0Q29uZmlnCT0KKwkJCQkJCQkJCTE8PFRDUl9EdXJQcm9jTW9kZV9PRkZTRVQgfAkJLy9mb3IgUlRMODE4NUIsIGR1cmF0aW9uIHNldHRpbmcgYnkgSFcKKwkJCQkJCQkJCSg3PDxUQ1JfTVhETUFfT0ZGU0VUKSB8CS8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgVHggRE1BIEJ1cnN0LCA3OiByZXNlcnZpZWQuCisJCQkJCQkJCQkocHJpdi0+U2hvcnRSZXRyeUxpbWl0PDxUQ1JfU1JMX09GRlNFVCkgfAkvLyBTaG9ydCByZXRyeSBsaW1pdAorCQkJCQkJCQkJKHByaXYtPkxvbmdSZXRyeUxpbWl0PDxUQ1JfTFJMX09GRlNFVCkgfAkvLyBMb25nIHJldHJ5IGxpbWl0CisJCQkJCQkJCQkoMCA/IFRDUl9TQVQgOiAwKTsJLy8gRkFMU0U6IEhXIHByb3ZpZXMgUExDUCBsZW5ndGggYW5kIExFTkdFWFQsIFRVUkU6IFNXIHByb2l2ZWRzIHRoZW0KKworCXByaXYtPlJlY2VpdmVDb25maWcJPQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPkNTTWV0aG9kIHwKKyNlbmRpZgorLy8JCQkJCQkJCVJDUl9FTk1BUlAgfAorCQkJCQkJCQlSQ1JfQU1GIHwgUkNSX0FERiB8CQkJCS8vYWNjZXB0IG1hbmFnZW1lbnQvZGF0YQorCQkJCQkJCQlSQ1JfQUNGIHwJCQkJCQkvL2FjY2VwdCBjb250cm9sIGZyYW1lIGZvciBTVyBBUCBuZWVkcyBQUy1wb2xsLCAyMDA1LjA3LjA3LCBieSByY25qa28uCisJCQkJCQkJCVJDUl9BQiB8IFJDUl9BTSB8IFJDUl9BUE0gfAkJLy9hY2NlcHQgQkMvTUMvVUMKKwkJCQkJCQkJLy9SQ1JfQUlDViB8IFJDUl9BQ1JDMzIgfCAJCS8vYWNjZXB0IElDVi9DUkMgZXJyb3IgcGFja2V0CisJCQkJCQkJCSg3PDxSQ1JfTVhETUFfT0ZGU0VUKSB8IC8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgUnggRE1BIEJ1cnN0LCA3OiB1bmxpbWl0ZWQuCisJCQkJCQkJCShwcml2LT5FYXJseVJ4VGhyZXNob2xkPDxSQ1JfRklGT19PRkZTRVQpIHwgLy8gUnggRklGTyBUaHJlc2hvbGQsIDc6IE5vIFJ4IHRocmVzaG9sZC4KKwkJCQkJCQkJKHByaXYtPkVhcmx5UnhUaHJlc2hvbGQgPT0gNyA/IFJDUl9PTkxZRVJMUEtUOjApOworCisJcHJpdi0+SW50ck1hc2sJCT0gSU1SX1RNR0RPSyB8IElNUl9UQkRFUiB8IElNUl9USFBERVIgfAorCQkJCQkJCQlJTVJfVEhQREVSIHwgSU1SX1RIUERPSyB8CisJCQkJCQkJCUlNUl9UVk9ERVIgfCBJTVJfVFZPRE9LIHwKKwkJCQkJCQkJSU1SX1RWSURFUiB8IElNUl9UVklET0sgfAorCQkJCQkJCQlJTVJfVEJFREVSIHwgSU1SX1RCRURPSyB8CisJCQkJCQkJCUlNUl9UQktERVIgfCBJTVJfVEJLRE9LIHwKKwkJCQkJCQkJSU1SX1JEVSB8CQkJCQkJLy8gVG8gaGFuZGxlIHRoZSBkZWZyYWdtZW50YXRpb24gbm90IGVub3VnaCBSeCBkZXNjcmlwdG9ycyBjYXNlLiBBbm5pZSwgMjAwNi0wMy0yNy4KKwkJCQkJCQkJSU1SX1JFUiB8IElNUl9ST0sgfAorCQkJCQkJCQlJTVJfUlFvU09LOyAvLyA8Tk9URT4gUk9LIGFuZCBSUW9TT0sgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28sIHdlIG11c3QgaGFuZGxlIFJRb1NPSyBpbnRlcnJ1cHQgdG8gcmVjZWl2ZSBRb1MgZnJhbWVzLCAyMDA1LjEyLjA5LCBieSByY25qa28uCisKKwlwcml2LT5Jbml0aWFsR2FpbiA9IDY7CisjZW5kaWYKKworCWh3X3ZlcnNpb24gPSggcmVhZF9uaWNfZHdvcmQoZGV2LCBUQ1IpICYgVENSX0hXVkVSSURfTUFTSyk+PlRDUl9IV1ZFUklEX1NISUZUOworCisJc3dpdGNoIChod192ZXJzaW9uKXsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJY2FzZSBIV19WRVJJRF9SODE4NUJfQjoKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5jYXJkXzgxODUgPSBWRVJTSU9OXzgxODdTX0M7CisJCSAgICAgICAgRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4N1NFIGIvZyIpOworCQkJcHJpdi0+cGh5X3ZlciA9IDI7CisJCQlicmVhazsKKyNlbHNlCisJCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1QiBiL2ciKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDM7CisJCQlwcml2LT5waHlfdmVyID0gMjsKKwkJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKwkJY2FzZSBIV19WRVJJRF9SODE4NV9BQkM6CisJCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1IGIvZyIpOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMTsKKwkJCS8qIHlvdSBzaG91bGQgbm90IGZpbmQgYSBjYXJkIHdpdGggODIyNSBQSFkgdmVyIDwgQyovCisJCQlwcml2LT5waHlfdmVyID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgSFdfVkVSSURfUjgxODVfRDoKKwkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODUgYi9nIChWLiBEKSIpOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMjsKKwkJCS8qIHlvdSBzaG91bGQgbm90IGZpbmQgYSBjYXJkIHdpdGggODIyNSBQSFkgdmVyIDwgQyovCisJCQlwcml2LT5waHlfdmVyID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgSFdfVkVSSURfUjgxODBfQUJDRDoKKwkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODAiKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEhXX1ZFUklEX1I4MTgwX0Y6CisJCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTgwICh2LiBGKSIpOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlETUVTR1coIk1BQyBjaGlwIG5vdCByZWNvZ25pemVkOiB2ZXJzaW9uICV4LiBBc3N1bWluZyBSVEw4MTgwIixod192ZXJzaW9uKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDA7CisJCQlicmVhazsKKwl9CisKKwlpZihwcml2LT5jYXJkXzgxODUpeworCQlwcml2LT5pZWVlODAyMTEtPm1vZHVsYXRpb24gfD0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjsKKwkJcHJpdi0+aWVlZTgwMjExLT5zaG9ydF9zbG90ID0gMTsKKwl9CisJLyogeW91IHNob3VsZCBub3QgZm91bmQgYW55IDgxODUgVmVyIEIgQ2FyZCAqLworCXByaXYtPmNhcmRfODE4NV9CdmVyc2lvbiA9IDA7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8ganVzdCBmb3Igc3luYyA4NQorCXByaXYtPmNhcmRfdHlwZSA9IFBDSTsKKyAgICAgICAgRE1FU0coIlRoaXMgaXMgYSBQQ0kgTklDIik7CisjZWxzZQorCWNvbmZpZzMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJaWYoY29uZmlnMyAmIDB4OCl7CisJCXByaXYtPmNhcmRfdHlwZSA9IENBUkRCVVM7CisJCURNRVNHKCJUaGlzIGlzIGEgQ0FSREJVUyBOSUMiKTsKKwl9CisJZWxzZSBpZiggY29uZmlnMyAmIDB4NCl7CisJCXByaXYtPmNhcmRfdHlwZSA9IE1JTklQQ0k7CisJCURNRVNHKCJUaGlzIGlzIGEgTUlOSS1QQ0kgTklDIik7CisJfWVsc2V7CisJCXByaXYtPmNhcmRfdHlwZSA9IFBDSTsKKwkJRE1FU0coIlRoaXMgaXMgYSBQQ0kgTklDIik7CisJfQorI2VuZGlmCisjZW5kaWYKKwlwcml2LT5lbmFibGVfZ3BpbzAgPSAwOworCisvL2J5IGFteSBmb3IgYW50ZW5uYQorI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXVzVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX1NXX1JFVkRfT0ZGU0VUKTsKKwlETUVTRygidXNWYWx1ZSBpcyAweCV4XG4iLHVzVmFsdWUpOworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLzNSZWFkIEFudGVubmFEaXZlcnNpdHkKKwkvLyBTVyBBbnRlbm5hIERpdmVyc2l0eS4KKwlpZigJKHVzVmFsdWUgJiBFRVBST01fU1dfQURfTUFTSykgIT0gRUVQUk9NX1NXX0FEX0VOQUJMRSApCisJeworCQlwcml2LT5FRVBST01Td0FudGVubmFEaXZlcnNpdHkgPSBmYWxzZTsKKwkJLy9wcmludGsoIkVFUFJPTSBEaXNhYmxlIFNXIEFudGVubmEgRGl2ZXJzaXR5XG4iKTsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+RUVQUk9NU3dBbnRlbm5hRGl2ZXJzaXR5ID0gdHJ1ZTsKKwkJLy9wcmludGsoIkVFUFJPTSBFbmFibGUgU1cgQW50ZW5uYSBEaXZlcnNpdHlcbiIpOworCX0KKwkvLyBEZWZhdWx0IEFudGVubmEgdG8gdXNlLgorCWlmKCAodXNWYWx1ZSAmIEVFUFJPTV9ERUZfQU5UX01BU0spICE9IEVFUFJPTV9ERUZfQU5UXzEgKQorCXsKKwkJcHJpdi0+RUVQUk9NRGVmYXVsdEFudGVubmExID0gZmFsc2U7CisJCS8vcHJpbnRrKCJFRVBST00gRGVmYXVsdCBBbnRlbm5hIDBcbiIpOworCX0KKwllbHNlCisJeworCQlwcml2LT5FRVBST01EZWZhdWx0QW50ZW5uYTEgPSB0cnVlOworCQkvL3ByaW50aygiRUVQUk9NIERlZmF1bHQgQW50ZW5uYSAxXG4iKTsKKwl9CisKKwkvLworCS8vIEFudGVubmEgZGl2ZXJzaXR5IG1lY2hhbmlzbS4gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTEuMDUuCisJLy8KKwlpZiggcHJpdi0+UmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtID09IDAgKSAvLyBBdXRvCisJey8vIDA6IGRlZmF1bHQgZnJvbSBFRVBST00uCisJCXByaXYtPmJTd0FudGVubmFEaXZlcml0eSA9IHByaXYtPkVFUFJPTVN3QW50ZW5uYURpdmVyc2l0eTsKKwl9CisJZWxzZQorCXsvLyAxOmRpc2FibGUgYW50ZW5uYSBkaXZlcnNpdHksIDI6IGVuYWJsZSBhbnRlbm5hIGRpdmVyc2l0eS4KKwkJcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5ID0gKChwcml2LT5SZWdTd0FudGVubmFEaXZlcnNpdHlNZWNoYW5pc20gPT0gMSk/IGZhbHNlIDogdHJ1ZSk7CisJfQorCS8vcHJpbnRrKCJiU3dBbnRlbm5hRGl2ZXJpdHkgPSAlZFxuIiwgcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5KTsKKworCisJLy8KKwkvLyBEZWZhdWx0IGFudGVubmEgc2V0dGluZ3MuIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjExLjA1LgorCS8vCisJaWYoIHByaXYtPlJlZ0RlZmF1bHRBbnRlbm5hID09IDApCisJey8vIDA6IGRlZmF1bHQgZnJvbSBFRVBST00uCisJCXByaXYtPmJEZWZhdWx0QW50ZW5uYTEgPSBwcml2LT5FRVBST01EZWZhdWx0QW50ZW5uYTE7CisJfQorCWVsc2UKKwl7Ly8gMTogbWFpbiwgMjogYXV4LgorCQlwcml2LT5iRGVmYXVsdEFudGVubmExID0gKChwcml2LT5SZWdEZWZhdWx0QW50ZW5uYT09IDIpID8gdHJ1ZSA6IGZhbHNlKTsKKwl9CisJLy9wcmludGsoImJEZWZhdWx0QW50ZW5uYTEgPSAlZFxuIiwgcHJpdi0+YkRlZmF1bHRBbnRlbm5hMSk7CisjZW5kaWYKKyNlbmRpZgorLy9ieSBhbXkgZm9yIGFudGVubmEKKwkvKiBydGw4MTg1IGNhbiBjYWxjIHBsY3AgbGVuIGluIEhXLiovCisJcHJpdi0+aHdfcGxjcF9sZW4gPSAxOworCisJcHJpdi0+cGxjcF9wcmVhbWJsZV9tb2RlID0gMjsKKwkvKnRoZSBlZXByb20gdHlwZSBpcyBzdG9yZWQgaW4gUkNSIHJlZ2lzdGVyIGJpdCAjNiAqLworCWlmIChSQ1JfOTM1NlNFTCAmIHJlYWRfbmljX2R3b3JkKGRldiwgUkNSKSl7CisJCXByaXYtPmVwcm9tdHlwZT1FUFJPTV85M2M1NjsKKwkJLy9ETUVTRygiUmVwb3J0ZWQgRUVQUk9NIGNoaXAgaXMgYSA5M2M1NiAoMktiaXQpIik7CisJfWVsc2V7CisJCXByaXYtPmVwcm9tdHlwZT1FUFJPTV85M2M0NjsKKwkJLy9ETUVTRygiUmVwb3J0ZWQgRUVQUk9NIGNoaXAgaXMgYSA5M2M0NiAoMUtiaXQpIik7CisJfQorCisJZGV2LT5nZXRfc3RhdHMgPSBydGw4MTgwX3N0YXRzOworCisJZGV2LT5kZXZfYWRkclswXT1lcHJvbV9yZWFkKGRldixNQUNfQURSKSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkclsxXT0oZXByb21fcmVhZChkZXYsTUFDX0FEUikgJiAweGZmMDApPj44OworCWRldi0+ZGV2X2FkZHJbMl09ZXByb21fcmVhZChkZXYsTUFDX0FEUisxKSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkclszXT0oZXByb21fcmVhZChkZXYsTUFDX0FEUisxKSAmIDB4ZmYwMCk+Pjg7CisJZGV2LT5kZXZfYWRkcls0XT1lcHJvbV9yZWFkKGRldixNQUNfQURSKzIpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdPShlcHJvbV9yZWFkKGRldixNQUNfQURSKzIpICYgMHhmZjAwKT4+ODsKKwkvL0RNRVNHKCJDYXJkIE1BQyBhZGRyZXNzIGlzICJNQUNfRk1ULCBNQUNfQVJHKGRldi0+ZGV2X2FkZHIpKTsKKworCisJZm9yKGk9MSxqPTA7IGk8MTQ7IGkrPTIsaisrKXsKKworCQl3b3JkID0gZXByb21fcmVhZChkZXYsRVBST01fVFhQV19DSDFfMiArIGopOworCQlwcml2LT5jaHR4cHdyW2ldPXdvcmQgJiAweGZmOworCQlwcml2LT5jaHR4cHdyW2krMV09KHdvcmQgJiAweGZmMDApPj44OworI2lmZGVmIERFQlVHX0VQUk9NCisJCURNRVNHKCJ0eCB3b3JkICV4OiV4IixqLHdvcmQpOworCQlETUVTRygiY2ggJWQgcHdyICV4IixpLHByaXYtPmNodHhwd3JbaV0pOworCQlETUVTRygiY2ggJWQgcHdyICV4IixpKzEscHJpdi0+Y2h0eHB3cltpKzFdKTsKKyNlbmRpZgorCX0KKwlpZihwcml2LT5jYXJkXzgxODUpeworCQlmb3IoaT0xLGo9MDsgaTwxNDsgaSs9MixqKyspeworCisJCQl3b3JkID0gZXByb21fcmVhZChkZXYsRVBST01fVFhQV19PRkRNX0NIMV8yICsgaik7CisJCQlwcml2LT5jaHR4cHdyX29mZG1baV09d29yZCAmIDB4ZmY7CisJCQlwcml2LT5jaHR4cHdyX29mZG1baSsxXT0od29yZCAmIDB4ZmYwMCk+Pjg7CisjaWZkZWYgREVCVUdfRVBST00KKwkJCURNRVNHKCJvZmRtIHR4IHdvcmQgJXg6JXgiLGosd29yZCk7CisJCQlETUVTRygib2ZkbSBjaCAlZCBwd3IgJXgiLGkscHJpdi0+Y2h0eHB3cl9vZmRtW2ldKTsKKwkJCURNRVNHKCJvZmRtIGNoICVkIHB3ciAleCIsaSsxLHByaXYtPmNodHhwd3Jfb2ZkbVtpKzFdKTsKKyNlbmRpZgorCQl9CisJfQorLy97YnkgYW15IDA4MDMxMgorCS8vM1JlYWQgY3J5c3RhbCBjYWxpYnRyYXRpb24gYW5kIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbiBvbiA4N1NFLgorCisJLy8gQnkgU0QzIFNZJ3MgcmVxdWVzdC4gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCisKKwl0bXB1MTYgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX1JTVj4+MSk7CisKKwkvL3ByaW50aygiUmVhZEFkYXB0ZXJJbmZvODE4NSgpOiBFRVBST01fUlNWKCUwNHgpXG4iLCB0bXB1MTYpOworCisJCS8vIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhpbiBhbmQgWG91dCByZXNwLgorCQlwcml2LT5YdGFsQ2FsX1hvdXQgPSB0bXB1MTYgJiBFRVBST01fWFRBTF9DQUxfWE9VVF9NQVNLOyAvLyAwfjcuNXBGCisJCXByaXYtPlh0YWxDYWxfWGluID0gKHRtcHUxNiAmIEVFUFJPTV9YVEFMX0NBTF9YSU5fTUFTSyk+PjQ7IC8vIDB+Ny41cEYKKwkJaWYoKHRtcHUxNiAmIEVFUFJPTV9YVEFMX0NBTF9FTkFCTEUpPj4xMikKKwkJCXByaXYtPmJYdGFsQ2FsaWJyYXRpb24gPSB0cnVlOworCisJCS8vIFRoZXJtYWwgbWV0ZXIgcmVmZXJlbmNlIGluZGljYXRpb24uCisJCXByaXYtPlRoZXJtYWxNZXRlciA9ICAodTgpKCh0bXB1MTYgJiBFRVBST01fVEhFUk1BTF9NRVRFUl9NQVNLKT4+OCk7CisJCWlmKCh0bXB1MTYgJiBFRVBST01fVEhFUk1BTF9NRVRFUl9FTkFCTEUpPj4xMykKKwkJCXByaXYtPmJUeFBvd2VyVHJhY2sgPSB0cnVlOworCisvL2J5IGFteSAwODAzMTJ9CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJd29yZCA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1RYUFdfQkFTRSk7CisJcHJpdi0+Y2NrX3R4cHdyX2Jhc2UgPSB3b3JkICYgMHhmOworCXByaXYtPm9mZG1fdHhwd3JfYmFzZSA9ICh3b3JkPj40KSAmIDB4ZjsKKyNlbmRpZgorCisJdmVyc2lvbiA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1ZFUlNJT04pOworCURNRVNHKCJFRVBST00gdmVyc2lvbiAleCIsdmVyc2lvbik7CisJaWYoICghcHJpdi0+Y2FyZF84MTg1KSAmJiB2ZXJzaW9uIDwgMHgwMTAxKXsKKwkJRE1FU0cgKCJFRVBST00gdmVyc2lvbiB0b28gb2xkLCBhc3N1bWluZyBkZWZhdWx0cyIpOworCQlETUVTRyAoIklmIHlvdSBzZWUgdGhpcyBtZXNzYWdlICpwbGFzZSogc2VuZCB5b3VyIFwKK0RNRVNHIG91dHB1dCB0byBhbmRyZWFtcmxAdGlzY2FsaS5pdCBUSEFOS1MiKTsKKwkJcHJpdi0+ZGlncGh5PTE7CisJCXByaXYtPmFudGI9MDsKKwkJcHJpdi0+ZGl2ZXJzaXR5PTE7CisJCXByaXYtPmNzX3RyZXNob2xkPTB4YzsKKwkJcHJpdi0+cmNyX2NzZW5zZT0xOworCQlwcml2LT5yZl9jaGlwPVJGQ0hJUElEX1BISUxJUFM7CisJfWVsc2V7CisJCWlmKCFwcml2LT5jYXJkXzgxODUpeworCQkJdTggcmZwYXJhbSA9IGVwcm9tX3JlYWQoZGV2LFJGX1BBUkFNKTsKKwkJCURNRVNHKCJSZlBhcmFtOiAleCIscmZwYXJhbSk7CisKKwkJCXByaXYtPmRpZ3BoeSA9IHJmcGFyYW0gJiAoMTw8UkZfUEFSQU1fRElHUEhZX1NISUZUKSA/IDA6MTsKKwkJCXByaXYtPmFudGIgPSAgcmZwYXJhbSAmICgxPDxSRl9QQVJBTV9BTlRCREVGQVVMVF9TSElGVCkgPyAxOjA7CisKKwkJCXByaXYtPnJjcl9jc2Vuc2UgPSAocmZwYXJhbSAmIFJGX1BBUkFNX0NBUlJJRVJTRU5TRV9NQVNLKSA+PgorCQkJCQlSRl9QQVJBTV9DQVJSSUVSU0VOU0VfU0hJRlQ7CisKKwkJCXByaXYtPmRpdmVyc2l0eSA9CisJCQkJKHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzIpJigxPDxDT05GSUcyX0FOVEVOTkFfU0hJRlQpKSA/IDE6MDsKKwkJfWVsc2V7CisJCQlwcml2LT5yY3JfY3NlbnNlID0gMzsKKwkJfQorCisJCXByaXYtPmNzX3RyZXNob2xkID0gKGVwcm9tX3JlYWQoZGV2LEVORVJHWV9UUkVTSE9MRCkmMHhmZjAwKSA+Pjg7CisKKwkJcHJpdi0+cmZfY2hpcCA9IDB4ZmYgJiBlcHJvbV9yZWFkKGRldixSRkNISVBJRCk7CisJfQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCXByaXYtPnJmX2NoaXAgPSBSRl9aRUJSQTQ7CisJcHJpdi0+cmZfc2xlZXAgPSBydGw4MjI1ejRfcmZfc2xlZXA7CisJcHJpdi0+cmZfd2FrZXVwID0gcnRsODIyNXo0X3JmX3dha2V1cDsKKyNlbHNlCisgICAgICAgIHByaXYtPnJmX2NoaXAgPSBSRl9aRUJSQTI7CisjZW5kaWYKKwkvL0RNRVNHKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgUmVhbHRlayA4MjI1ejIiKTsKKwkvL0RNRVNHVygiVGhpcyBkcml2ZXIgaGFzIEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciB0aGlzIGNoaXBzZXQuIik7CisJLy9ETUVTR1coInVzZSBpdCB3aXRoIGNhcmUgYW5kIGF0IHlvdXIgb3duIHJpc2sgYW5kIik7CisJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTRlVML1VOU1VDQ0VTU0ZVTCBUTyBSZWFsdGVrISIpOworCisJcHJpdi0+cmZfY2xvc2UgPSBydGw4MjI1ejJfcmZfY2xvc2U7CisJcHJpdi0+cmZfaW5pdCA9IHJ0bDgyMjV6Ml9yZl9pbml0OworCXByaXYtPnJmX3NldF9jaGFuID0gcnRsODIyNXoyX3JmX3NldF9jaGFuOworCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkvL3ByaXYtPnJmX3NsZWVwID0gcnRsODIyNV9yZl9zbGVlcDsKKwkvL3ByaXYtPnJmX3dha2V1cCA9IHJ0bDgyMjVfcmZfd2FrZXVwOworCisjZWxzZQorCS8qIGNoZWNrIFJGIGZyb250ZW5kIGNoaXBzZXQgKi8KKwlzd2l0Y2ggKHByaXYtPnJmX2NoaXApIHsKKworCQljYXNlIFJGQ0hJUElEX1JUTDgyMjU6CisKKwkJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJCURNRVNHKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgUmVhbHRlayA4MjI1Iik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJRE1FU0dXKCJ1c2UgaXQgd2l0aCBjYXJlIGFuZCBhdCB5b3VyIG93biByaXNrIGFuZCIpOworCQkJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTL0lOU1VDQ0VTUyBUTyBhbmRyZWFtcmxAdGlzY2FsaS5pdCIpOworCisJCQlwcml2LT5yZl9jbG9zZSA9IHJ0bDgyMjVfcmZfY2xvc2U7CisJCQlwcml2LT5yZl9pbml0ID0gcnRsODIyNV9yZl9pbml0OworCQkJcHJpdi0+cmZfc2V0X2NoYW4gPSBydGw4MjI1X3JmX3NldF9jaGFuOworCQkJcHJpdi0+cmZfc2V0X3NlbnMgPSBOVUxMOworCQkJcHJpdi0+cmZfc2xlZXAgPSBydGw4MjI1X3JmX3NsZWVwOworCQkJcHJpdi0+cmZfd2FrZXVwID0gcnRsODIyNV9yZl93YWtldXA7CisKKwkJfWVsc2V7CisJCQlETUVTR1coIkRldGVjdGVkIFJUTDgyMjUgcmFkaW8gb24gYSBjYXJkIHJlY29nbml6ZWQgYXMgUlRMODE4MCIpOworCQkJRE1FU0dXKCJUaGlzIGNvdWxkIG5vdCBiZS4uLiBzb21ldGhpbmcgd2VudCB3cm9uZy4uLi4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJGQ0hJUElEX1JUTDgyNTU6CisJCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCQlETUVTRygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIFJlYWx0ZWsgODI1NSIpOworCQkJRE1FU0dXKCJUaGlzIGRyaXZlciBoYXMgRVhQRVJJTUVOVEFMIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCURNRVNHVygidXNlIGl0IHdpdGggY2FyZSBhbmQgYXQgeW91ciBvd24gcmlzayBhbmQiKTsKKwkJCURNRVNHVygiKipQTEVBU0UqKiBSRVBPUlQgU1VDQ0VTUy9JTlNVQ0NFU1MgVE8gYW5kcmVhbXJsQHRpc2NhbGkuaXQiKTsKKworCQkJcHJpdi0+cmZfY2xvc2UgPSBydGw4MjU1X3JmX2Nsb3NlOworCQkJcHJpdi0+cmZfaW5pdCA9IHJ0bDgyNTVfcmZfaW5pdDsKKwkJCXByaXYtPnJmX3NldF9jaGFuID0gcnRsODI1NV9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkJCXByaXYtPnJmX3NsZWVwID0gTlVMTDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IE5VTEw7CisKKwkJfWVsc2V7CisJCQlETUVTR1coIkRldGVjdGVkIFJUTDgyNTUgcmFkaW8gb24gYSBjYXJkIHJlY29nbml6ZWQgYXMgUlRMODE4MCIpOworCQkJRE1FU0dXKCJUaGlzIGNvdWxkIG5vdCBiZS4uLiBzb21ldGhpbmcgd2VudCB3cm9uZy4uLi4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgUkZDSElQSURfSU5URVJTSUw6CisJCQlETUVTR1coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBieSBJbnRlcnNpbC4iKTsKKwkJCURNRVNHVygiVGhpcyBkcml2ZXIgaGFzIE5PIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRkNISVBJRF9SRk1EOgorCQkJRE1FU0dXKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgYnkgUkZNRC4iKTsKKwkJCURNRVNHVygiVGhpcyBkcml2ZXIgaGFzIE5PIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRkNISVBJRF9HQ1Q6CisJCQlETUVTR1coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBieSBHQ1QuIik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJRE1FU0dXKCJ1c2UgaXQgd2l0aCBjYXJlIGFuZCBhdCB5b3VyIG93biByaXNrIGFuZCIpOworCQkJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTL0lOU1VDQ0VTUyBUTyBhbmRyZWFtcmxAdGlzY2FsaS5pdCIpOworCQkJcHJpdi0+cmZfY2xvc2UgPSBnY3RfcmZfY2xvc2U7CisJCQlwcml2LT5yZl9pbml0ID0gZ2N0X3JmX2luaXQ7CisJCQlwcml2LT5yZl9zZXRfY2hhbiA9IGdjdF9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkJCXByaXYtPnJmX3NsZWVwID0gTlVMTDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IE5VTEw7CisJCQlicmVhazsKKworCQljYXNlIFJGQ0hJUElEX01BWElNOgorCQkJRE1FU0dXKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgYnkgTUFYSU0uIik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJRE1FU0dXKCJ1c2UgaXQgd2l0aCBjYXJlIGFuZCBhdCB5b3VyIG93biByaXNrIGFuZCIpOworCQkJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTL0lOU1VDQ0VTUyBUTyBhbmRyZWFtcmxAdGlzY2FsaS5pdCIpOworCQkJcHJpdi0+cmZfY2xvc2UgPSBtYXhpbV9yZl9jbG9zZTsKKwkJCXByaXYtPnJmX2luaXQgPSBtYXhpbV9yZl9pbml0OworCQkJcHJpdi0+cmZfc2V0X2NoYW4gPSBtYXhpbV9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkJCXByaXYtPnJmX3NsZWVwID0gTlVMTDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IE5VTEw7CisJCQlicmVhazsKKworCQljYXNlIFJGQ0hJUElEX1BISUxJUFM6CisJCQlETUVTRygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIGJ5IFBoaWxpcHMuIik7CisJCQlETUVTRygiT0shIFBoaWxpcHMgU0EyNDAwIHJhZGlvIGNoaXBzZXQgaXMgc3VwcG9ydGVkLiIpOworCQkJcHJpdi0+cmZfY2xvc2UgPSBzYTI0MDBfcmZfY2xvc2U7CisJCQlwcml2LT5yZl9pbml0ID0gc2EyNDAwX3JmX2luaXQ7CisJCQlwcml2LT5yZl9zZXRfY2hhbiA9IHNhMjQwMF9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gc2EyNDAwX3JmX3NldF9zZW5zOworCQkJcHJpdi0+c2VucyA9IFNBMjQwMF9SRl9ERUZfU0VOUzsgLyogZGVmYXVsdCBzZW5zaXRpdml0eSAqLworCQkJcHJpdi0+bWF4X3NlbnMgPSBTQTI0MDBfUkZfTUFYX1NFTlM7IC8qIG1heGltdW0gc2Vuc2l0aXZpdHkgKi8KKwkJCXByaXYtPnJmX3NsZWVwID0gTlVMTDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IE5VTEw7CisKKwkJCWlmKHByaXYtPmRpZ3BoeSl7CisJCQkJRE1FU0dXKCJEaWdpdGFsIFBIWSBmb3VuZCIpOworCQkJCURNRVNHVygiUGhpbGlwcyBESUdJVEFMIFBIWSBpcyB1bnRlc3RlZCEgKlBsZWFzZSpcCisJcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Iik7CisJCQl9ZWxzZXsKKwkJCQlETUVTRyAoIkFuYWxvZyBQSFkgZm91bmQiKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURNRVNHVygiVW5rbm93biBSRiBtb2R1bGUgJXgiLHByaXYtPnJmX2NoaXApOworCQkJRE1FU0dXKCJFeGl0aW5nLi4uIik7CisJCQlyZXR1cm4gLTE7CisKKwl9CisjZW5kaWYKKworCisJaWYoIXByaXYtPmNhcmRfODE4NSl7CisJCWlmKHByaXYtPmFudGIpCisJCQlETUVTRyAoIkFudGVubmEgQiBpcyBkZWZhdWx0IGFudGVubmEiKTsKKwkJZWxzZQorCQkJRE1FU0cgKCJBbnRlbm5hIEEgaXMgZGVmYXVsdCBhbnRlbm5hIik7CisKKwkJaWYocHJpdi0+ZGl2ZXJzaXR5KQorCQkJRE1FU0cgKCJBbnRlbm5hIGRpdmVyc2l0eSBpcyBlbmFibGVkIik7CisJCWVsc2UKKwkJCURNRVNHKCJBbnRlbm5hIGRpdmVyc2l0eSBpcyBkaXNhYmxlZCIpOworCisJCURNRVNHKCJDYXJyaWVyIHNlbnNlICVkIixwcml2LT5yY3JfY3NlbnNlKTsKKwl9CisKKwlpZiAoMCE9YWxsb2NfcnhfZGVzY19yaW5nKGRldiwgcHJpdi0+cnhidWZmZXJzaXplLCBwcml2LT5yeHJpbmdjb3VudCkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4cmluZ2NvdW50LAorCQkJCSAgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJIFRYX0JLUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJIFRYX0JFUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJICBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4cmluZ2NvdW50LAorCQkJCSAgVFhfVk9QUklPUklUWV9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eHJpbmdjb3VudCwKKwkJCQkgIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eGJlYWNvbmNvdW50LAorCQkJCSAgVFhfQkVBQ09OX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisKKwkvL3ByaXYtPmJlYWNvbl9idWY9TlVMTDsKKworCWlmKCFwcml2LT5jYXJkXzgxODUpeworCisJCWlmKHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUcwKSAmICgxPDxDT05GSUcwX1dFUDQwX1NISUZUKSkKKwkJCURNRVNHICgiNDAtYml0IFdFUCBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKKwkJZWxzZQorCQkJRE1FU0cgKCI0MC1iaXQgV0VQIGlzIE5PVCBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKKworCQlpZihyZWFkX25pY19ieXRlKGRldixDT05GSUcwKSAmICgxPDxDT05GSUcwX1dFUDEwNF9TSElGVCkpCisJCQlETUVTRyAoIjEwNC1iaXQgV0VQIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSIpOworCQllbHNlCisJCQlETUVTRyAoIjEwNC1iaXQgV0VQIGlzIE5PVCBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKKwl9CisjaWYgIWRlZmluZWQoU0FfU0hJUlEpCisgICAgICAgIGlmKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKXJ0bDgxODBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpKXsKKyNlbHNlCisgICAgICAgIGlmKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKXJ0bDgxODBfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKXsKKyNlbmRpZgorICAgICAgICAgICAgICAgIERNRVNHRSgiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWQiLGRldi0+aXJxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJfWVsc2V7CisJCXByaXYtPmlycT1kZXYtPmlycTsKKwkJRE1FU0coIklSUSAlZCIsZGV2LT5pcnEpOworCX0KKworI2lmZGVmIERFQlVHX0VQUk9NCisJZHVtcF9lcHJvbShkZXYpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorCisKK3ZvaWQgcnRsODE4MF9ub19od193ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZighcHJpdi0+Y2FyZF84MTg1KQorCXsKKwkJdTggc2VjdXJpdHk7CisKKwkJc2VjdXJpdHkgID0gcmVhZF9uaWNfYnl0ZShkZXYsIFNFQ1VSSVRZKTsKKwkJc2VjdXJpdHkgJj1+KDE8PFNFQ1VSSVRZX1dFUF9UWF9FTkFCTEVfU0hJRlQpOworCQlzZWN1cml0eSAmPX4oMTw8U0VDVVJJVFlfV0VQX1JYX0VOQUJMRV9TSElGVCk7CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBTRUNVUklUWSwgc2VjdXJpdHkpOworCisJfWVsc2V7CisKKwkJLy9GSVhNRSEhIQorCX0KKwkvKgorCSAgd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHJlYWRfbmljX2R3b3JkKGRldixUWF9DT05GKSB8CisJICAoMTw8VFhfTk9JQ1ZfU0hJRlQpICk7CisJKi8KKy8vCXByaXYtPmllZWU4MDIxMS0+aHdfd2VwPTA7Cit9CisKKwordm9pZCBydGw4MTgwX3NldF9od193ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggcGdyZWc7CisJdTggc2VjdXJpdHk7CisJdTMyIGtleTBfd29yZDQ7CisKKwlwZ3JlZz1yZWFkX25pY19ieXRlKGRldiwgUEdTRUxFQ1QpOworCXdyaXRlX25pY19ieXRlKGRldiwgUEdTRUxFQ1QsIHBncmVnICZ+ICgxPDxQR1NFTEVDVF9QR19TSElGVCkpOworCisJa2V5MF93b3JkNCA9IHJlYWRfbmljX2R3b3JkKGRldiwgS0VZMCs0KzQrNCk7CisJa2V5MF93b3JkNCAmPSB+IDB4ZmY7CisJa2V5MF93b3JkNCB8PSBwcml2LT5rZXkwWzNdJiAweGZmOworCXdyaXRlX25pY19kd29yZChkZXYsS0VZMCwocHJpdi0+a2V5MFswXSkpOworCXdyaXRlX25pY19kd29yZChkZXYsS0VZMCs0LChwcml2LT5rZXkwWzFdKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldixLRVkwKzQrNCwocHJpdi0+a2V5MFsyXSkpOworCXdyaXRlX25pY19kd29yZChkZXYsS0VZMCs0KzQrNCwoa2V5MF93b3JkNCkpOworCisJLyoKKwkgIFRYX0NPTkYscmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpICZ+KDE8PFRYX05PSUNWX1NISUZUKSk7CisJKi8KKworCXNlY3VyaXR5ICA9IHJlYWRfbmljX2J5dGUoZGV2LFNFQ1VSSVRZKTsKKwlzZWN1cml0eSB8PSAoMTw8U0VDVVJJVFlfV0VQX1RYX0VOQUJMRV9TSElGVCk7CisJc2VjdXJpdHkgfD0gKDE8PFNFQ1VSSVRZX1dFUF9SWF9FTkFCTEVfU0hJRlQpOworCXNlY3VyaXR5ICY9IH4gU0VDVVJJVFlfRU5DUllQX01BU0s7CisJc2VjdXJpdHkgfD0gKFNFQ1VSSVRZX0VOQ1JZUF8xMDQ8PFNFQ1VSSVRZX0VOQ1JZUF9TSElGVCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFNFQ1VSSVRZLCBzZWN1cml0eSk7CisKKwlETUVTRygia2V5ICV4ICV4ICV4ICV4IixyZWFkX25pY19kd29yZChkZXYsS0VZMCs0KzQrNCksCisJICAgICAgcmVhZF9uaWNfZHdvcmQoZGV2LEtFWTArNCs0KSxyZWFkX25pY19kd29yZChkZXYsS0VZMCs0KSwKKwkgICAgICByZWFkX25pY19kd29yZChkZXYsS0VZMCkpOworCisJLy9wcml2LT5pZWVlODAyMTEtPmh3X3dlcD0xOworfQorCisKK3ZvaWQgcnRsODE4NV9yZl9waW5zX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworLy8JdTE2IHRtcDsKKy8vCXRtcCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDFmZmYpOy8vIHwgdG1wKTsKKy8vCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLDcgfCB0bXApOworfQorCisKK3ZvaWQgcnRsODE4NV9zZXRfYW5hcGFyYW0yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhKQoreworCXU4IGNvbmYzOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCisJY29uZjMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCBjb25mMyB8ICgxPDxDT05GSUczX0FOQVBBUkFNX1dfU0hJRlQpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTTIsIGEpOworCisJY29uZjMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCBjb25mMyAmfigxPDxDT05GSUczX0FOQVBBUkFNX1dfU0hJRlQpKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisKK30KKworCit2b2lkIHJ0bDgxODBfc2V0X2FuYXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhKQoreworCXU4IGNvbmYzOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCisJY29uZjMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCBjb25mMyB8ICgxPDxDT05GSUczX0FOQVBBUkFNX1dfU0hJRlQpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTSwgYSk7CisKKwljb25mMyA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIGNvbmYzICZ+KDE8PENPTkZJRzNfQU5BUEFSQU1fV19TSElGVCkpOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKK30KKworCit2b2lkIHJ0bDgxODVfdHhfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhbnQpCit7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BTlRFTk5BLCBhbnQpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworfQorCisKK3ZvaWQgcnRsODE4NV93cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKK3sKKwkvL3U4IHBoeXI7CisJdTMyIHBoeXc7CisJLy9pbnQgaTsKKworCWFkciB8PSAweDgwOworCisJcGh5dz0gKChkYXRhPDw4KSB8IGFkcik7CisjaWYgMAorCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgcGh5dyk7CisKKwkvL3JlYWRfbmljX2R3b3JkKGRldiwgUEhZX0FEUik7CisJZm9yKGk9MDtpPDEwO2krKyl7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIDB4ZmZmZmZmN2YgJiBwaHl3KTsKKwkJcGh5ciA9IHJlYWRfbmljX2J5dGUoZGV2LCBQSFlfUkVBRCk7CisJCWlmKHBoeXIgPT0gKGRhdGEmMHhmZikpIGJyZWFrOworCisJfQorI2Vsc2UKKwkvLyBOb3RlIHRoYXQsIHdlIG11c3Qgd3JpdGUgMHhmZjdjIGFmdGVyIDB4N2QtMHg3ZiB0byB3cml0ZSBCQiByZWdpc3Rlci4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2YsICgocGh5dyAmIDB4ZmYwMDAwMDApID4+IDI0KSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdlLCAoKHBoeXcgJiAweDAwZmYwMDAwKSA+PiAxNikpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHg3ZCwgKChwaHl3ICYgMHgwMDAwZmYwMCkgPj4gOCkpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHg3YywgKChwaHl3ICYgMHgwMDAwMDBmZikgKSk7CisjZW5kaWYKKwkvKiB0aGlzIGlzIG9rIHRvIGZhaWwgd2hlbiB3ZSB3cml0ZSBBR0MgdGFibGUuIGNoZWNrIGZvciBBR0MgdGFibGUgbWlnaHQgYmUKKwkgKiBkb25lIGJ5IG1hc2tpbmcgd2l0aCAweDdmIGluc3RlYWQgb2YgMHhmZgorCSAqLworCS8vaWYocGh5ciAhPSAoZGF0YSYweGZmKSkgRE1FU0dXKCJQaHkgd3JpdGUgdGltZW91dCAleCAleCAleCIsIHBoeXIsIGRhdGEsYWRyKTsKK30KKworCitpbmxpbmUgdm9pZCB3cml0ZV9waHlfb2ZkbSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKK3sKKwlkYXRhID0gZGF0YSAmIDB4ZmY7CisJcnRsODE4NV93cml0ZV9waHkoZGV2LCBhZHIsIGRhdGEpOworfQorCisKK3ZvaWQgd3JpdGVfcGh5X2NjayAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKK3sKKwlkYXRhID0gZGF0YSAmIDB4ZmY7CisJcnRsODE4NV93cml0ZV9waHkoZGV2LCBhZHIsIGRhdGEgfCAweDEwMDAwKTsKK30KKworCisvKiA3MCozID0gMjEwIG1zCisgKiBJIGhvcGUgdGhpcyBpcyBlbm91Z3RoCisgKi8KKyNkZWZpbmUgTUFYX1BIWSA3MAordm9pZCB3cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1OCBkYXRhKQoreworCXUzMiBwaHk7CisJaW50IGk7CisKKwlwaHkgPSAweGZmMDAwMDsKKwlwaHkgfD0gYWRyOworCXBoeSB8PSAweDgwOyAvKiB0aGlzIHNob3VsZCBlbmFibGUgd3JpdGluZyAqLworCXBoeSB8PSAoZGF0YTw8OCk7CisKKwkvL1BIWV9BRFIsIFBIWV9SIGFuZCBQSFlfVyAgYXJlIGNvbnRpZyBhbmQgdHJlYXRlZCBhcyBvbmUgZHdvcmQKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsIHBoeSk7CisKKwlwaHk9IDB4ZmZmZjAwOworCXBoeSB8PSBhZHI7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsIHBoeSk7CisJZm9yKGk9MDtpPE1BWF9QSFk7aSsrKXsKKwkJcGh5PXJlYWRfbmljX2R3b3JkKGRldixQSFlfQURSKTsKKwkJcGh5PSBwaHkgJiAweGZmMDAwMDsKKwkJcGh5PSBwaHkgPj4gMTY7CisJCWlmKHBoeSA9PSBkYXRhKXsgLy9TVUNDRVNTIQorCQkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJCW1kZWxheSgzKTsgLy9yYW5kb20gdmFsdWUKKyNpZmRlZiBERUJVR19CQgorCQkJRE1FU0coIlBoeSB3ciAleCwleCIsYWRyLGRhdGEpOworI2VuZGlmCisJCQlyZXR1cm47CisJCX1lbHNleworCQkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJCW1kZWxheSgzKTsgLy9yYW5kb20gdmFsdWUKKwkJfQorCX0KKwlETUVTR1cgKCJQaHkgd3JpdGluZyAleCAleCBmYWlsZWQhIiwgYWRyLGRhdGEpOworfQorCit2b2lkIHJ0bDgxODVfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwl1MTYgd29yZDsKKwlpbnQgYmFzaWNfcmF0ZSxtaW5fcnJfcmF0ZSxtYXhfcnJfcmF0ZTsKKworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy9pZiAoaWVlZTgwMjExX2lzXzU0Zyhwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykgJiYKKy8vCQlwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCWJhc2ljX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDI0MCk7CisJbWluX3JyX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDYwKTsKKwltYXhfcnJfcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUoMjQwKTsKKworLy8KKy8vCX1lbHNleworLy8JCWJhc2ljX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDIwKTsKKy8vCQltaW5fcnJfcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUoMTApOworLy8JCW1heF9ycl9yYXRlID0gaWVlZXJhdGUycnRscmF0ZSgxMTApOworLy8JfQorCisJd3JpdGVfbmljX2J5dGUoZGV2LCBSRVNQX1JBVEUsCisJCQltYXhfcnJfcmF0ZTw8TUFYX1JFU1BfUkFURV9TSElGVHwgbWluX3JyX3JhdGU8PE1JTl9SRVNQX1JBVEVfU0hJRlQpOworCisJd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQlJTUik7CisJd29yZCAmPSB+QlJTUl9NQlJfODE4NTsKKworCisJZm9yKGk9MDtpPD1iYXNpY19yYXRlO2krKykKKwkJd29yZCB8PSAoMTw8aSk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIHdvcmQpOworCS8vRE1FU0coIlJSOiV4IEJSU1I6ICV4IiwgcmVhZF9uaWNfYnl0ZShkZXYsUkVTUF9SQVRFKSxyZWFkX25pY193b3JkKGRldixCUlNSKSk7Cit9CisKKworCit2b2lkIHJ0bDgxODBfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGFuYXBhcmFtOworCXUxNiB3b3JkOworCXU4IGNvbmZpZzM7CisvLwlpbnQgaTsKKworCXJ0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKKwlydGw4MTgwX3Jlc2V0KGRldik7CisKKwkvKiBzZWVtcyB0aGF0IDB4ZmZmZiBvciAweGFmZmYgd2lsbCBjYXVzZQorCSAqIEhXIGludGVycnVwdCBsaW5lIGNyYXNoCisJICovCisKKwkvL3ByaXYtPmlycV9tYXNrID0gMHhhZmZmOworLy8JcHJpdi0+aXJxX21hc2sgPSAweDRmY2Y7CisKKwkvKiBlbmFibGUgYmVhY29uIHRpbWVvdXQsIGJlYWNvbiBUWCBvayBhbmQgZXJyCisJICogTFAgdHggb2sgYW5kIGVyciwgSFAgVFggb2sgYW5kIGVyciwgTlAgVFggb2sgYW5kIGVyciwKKwkgKiBSWCBvayBhbmQgRVJSLCBhbmQgR1AgdGltZXIgKi8KKwlwcml2LT5pcnFfbWFzayA9IDB4NmZjZjsKKworCXByaXYtPmRtYV9wb2xsX21hc2sgPSAwOworCisJcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZShkZXYpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IENBUkRCVVMgKXsKKwkJY29uZmlnMz1yZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJCXdyaXRlX25pY19ieXRlKGRldixDT05GSUczLGNvbmZpZzMgfCBDT05GSUczX0Z1bmNSZWdFbik7CisJCXdyaXRlX25pY193b3JkKGRldixGRU1SLCBGRU1SX0lOVFIgfCBGRU1SX1dLVVAgfCBGRU1SX0dXQUtFIHwKKwkJCXJlYWRfbmljX3dvcmQoZGV2LCBGRU1SKSk7CisJfQorCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBNQUMwLCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMF0pOworCXdyaXRlX25pY193b3JkKGRldiwgTUFDNCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzFdICYgMHhmZmZmICk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCisJcnRsODE4MF91cGRhdGVfbXNyKGRldik7CisKKwlpZighcHJpdi0+Y2FyZF84MTg1KXsKKwkJYW5hcGFyYW0gID0gZXByb21fcmVhZChkZXYsRVBST01fQU5BUEFSQU1fQUREUkxXT1JEKTsKKwkJYW5hcGFyYW0gfD0gZXByb21fcmVhZChkZXYsRVBST01fQU5BUEFSQU1fQUREUkhXT1JEKTw8MTY7CisKKwkJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LGFuYXBhcmFtKTsKKwl9CisJLyogVGhlc2UgbWlnaHQgYmUgdW5uZWNlc3Nhcnkgc2luY2Ugd2UgZG8gaW4gcnhfZW5hYmxlIC8gdHhfZW5hYmxlICovCisJZml4X3J4X2ZpZm8oZGV2KTsKKwlmaXhfdHhfZmlmbyhkZXYpOworCS8qc2V0X25pY19yeHJpbmcoZGV2KTsKKwkgIHNldF9uaWNfdHhyaW5nKGRldik7Ki8KKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKworCS8qCisJICAgVGhlIGZvbGxvd2luZyBpcyB2ZXJ5IHN0cmFuZ2UuIHNlZW1zIHRvIGJlIHRoYXQgMSBtZWFucyB0ZXN0IG1vZGUsCisJICAgYnV0IHdlIG5lZWQgdG8gYWNrbm9sd2xlZGdlcyB0aGUgbmljIHdoZW4gYSBwYWNrZXQgaXMgcmVhZHkKKwkgICBhbHRvdWdodCB3ZSBzZXQgaXQgdG8gMAorCSovCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsCisJCSAgICAgICBDT05GSUcyLCByZWFkX25pY19ieXRlKGRldixDT05GSUcyKSAmflwKKwkJICAgICAgICgxPDxDT05GSUcyX0RNQV9QT0xMSU5HX01PREVfU0hJRlQpKTsKKwkvL150aGUgbmljIGlzbid0IGluIHRlc3QgbW9kZQorCWlmKHByaXYtPmNhcmRfODE4NSkKKwkJCXdyaXRlX25pY19ieXRlKGRldiwKKwkJICAgICAgIENPTkZJRzIsIHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzIpfCgxPDw0KSk7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsSU5UX1RJTUVPVVQsMCk7CisjaWZkZWYgREVCVUdfUkVHSVNURVJTCisJcnRsODE4MF9kdW1wX3JlZyhkZXYpOworI2VuZGlmCisKKwlpZighcHJpdi0+Y2FyZF84MTg1KQorCXsKKwkJLyoKKwkJZXhwZXJpbWVudGFsIC0gdGhpcyBtaWdodCBiZSBuZWVkZWQgdG8gY2FsaWJyYXRlIEFHQywKKwkJYW55d2F5IGl0IHNob3VsZG4ndCBodXJ0CisJCSovCisJCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNSwKKwkJCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KSB8ICgxPDxBR0NSRVNFVF9TSElGVCkpOworCQlyZWFkX25pY19ieXRlKGRldiwgQ09ORklHNSk7CisJCXVkZWxheSgxNSk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNSwKKwkJCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KSAmfiAoMTw8QUdDUkVTRVRfU0hJRlQpKTsKKwl9ZWxzZXsKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFdQQV9DT05GSUcsIDApOworCQkvL3dyaXRlX25pY19ieXRlKGRldiwgVEVTVFIsIDB4ZCk7CisJfQorCisJcnRsODE4MF9ub19od193ZXAoZGV2KTsKKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCXJ0bDgxODVfc2V0X3JhdGUoZGV2KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBSQVRFX0ZBTExCQUNLLCAweDgxKTsKKwkvLwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4ZGYsIDB4MTUpOworCX1lbHNleworCQl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKKwkJd29yZCAmPSB+QlJTUl9NQlI7CisJCXdvcmQgJj0gfkJSU1JfQlBMQ1A7CisJCXdvcmQgfD0gaWVlZXJhdGUycnRscmF0ZShwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUpOworLy9ieSBhbXkKKyAgICAgICAgICAgICAgd29yZCB8PSAweDBmOworLy9ieSBhbXkKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCB3b3JkKTsKKwl9CisKKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCXdyaXRlX25pY19ieXRlKGRldiwgR1BfRU5BQkxFLHJlYWRfbmljX2J5dGUoZGV2LCBHUF9FTkFCTEUpICYgfigxPDw2KSk7CisKKwkJLy9GSVhNRSBjZmcgMyBDbGtSdW4gZW5hYmxlIC0gaXNuJ3QgaXQgUmVhZE9ubHkgPworCQlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisJCXdyaXRlX25pY19ieXRlKGRldixDT05GSUczLCByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMykKK3woMTw8Q09ORklHM19DTEtSVU5fU0hJRlQpKTsKKwkJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCisJfQorCisJcHJpdi0+cmZfaW5pdChkZXYpOworCisJaWYocHJpdi0+cmZfc2V0X3NlbnMgIT0gTlVMTCkKKwkJcHJpdi0+cmZfc2V0X3NlbnMoZGV2LHByaXYtPnNlbnMpOworCXJ0bDgxODBfaXJxX2VuYWJsZShkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkvKkRNRVNHICgibGZyZWUgJWQiLGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsTE9XX1BSSU9SSVRZKSk7CisKKwlETUVTRyAoIm5mcmVlICVkIixnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LE5PUk1fUFJJT1JJVFkpKTsKKworCURNRVNHICgiaGZyZWUgJWQiLGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsSElfUFJJT1JJVFkpKTsKKwlpZihjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldixOT1JNX1BSSU9SSVRZKSkgRE1FU0coIk5PUk0gT0siKTsKKwlpZihjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldixISV9QUklPUklUWSkpIERNRVNHKCJISSBPSyIpOworCWlmKGNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LExPV19QUklPUklUWSkpIERNRVNHKCJMT1cgT0siKTsqLworfQorCisKKworLyogdGhpcyBjb25maWd1cmVzIHJlZ2lzdGVycyBmb3IgYmVhY29uIHR4IGFuZCBlbmFibGVzIGl0IHZpYQorICogcnRsODE4MF9iZWFjb25fdHhfZW5hYmxlKCkuIHJ0bDgxODBfYmVhY29uX3R4X2Rpc2FibGUoKSBtaWdodAorICogYmUgdXNlZCB0byBzdG9wIGJlYWNvbiB0cmFuc21pc3Npb24KKyAqLwordm9pZCBydGw4MTgwX3N0YXJ0X3R4X2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNiB3b3JkOworLy8JRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKworCURNRVNHKCJFbmFibGluZyBiZWFjb24gVFgiKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgMHg0MiwweGU2KTsvLyBUQ1IKKy8vCXNldF9uaWNfdHhyaW5nKGRldik7CisvLwlmaXhfdHhfZmlmbyhkZXYpOworCXJ0bDgxODBfcHJlcGFyZV9iZWFjb24oZGV2KTsKKwlydGw4MTgwX2lycV9kaXNhYmxlKGRldik7CisJcnRsODE4MF9iZWFjb25fdHhfZW5hYmxlKGRldik7CisjaWYgMAorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LDB4OWQsMHgyMCk7IC8vRE1BIFBvbGwKKwkvL3dyaXRlX25pY193b3JkKGRldiwweDdhLDApOworCS8vd3JpdGVfbmljX3dvcmQoZGV2LDB4N2EsMHg4MDAwKTsKKworI2lmIDAKKwl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCY25JdHYpOworCXdvcmQgJj0gfkJjbkl0dl9CY25JdHY7IC8vIGNsZWFyIEJjbl9JdHYKKwl3b3JkIHw9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsvLzB4NjQ7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBCY25JdHYsIHdvcmQpOworI2VuZGlmCisjZW5kaWYKKwl3b3JkID0gcmVhZF9uaWNfd29yZChkZXYsIEF0aW1XbmQpICZ+IEF0aW1XbmRfQXRpbVduZDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEF0aW1XbmQsd29yZCk7Ly8gd29yZCB8PQorLy9wcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7CisKKwl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCaW50ckl0dik7CisJd29yZCAmPSB+QmludHJJdHZfQmludHJJdHY7CisJd29yZCB8PSAxMDAwOy8qcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICoKKwkJKChwcml2LT50eGJlYWNvbmNvdW50ID4gMSk/KHByaXYtPnR4YmVhY29uY291bnQtMSk6MSk7CisJLy8gRklYTUU6IGNoZWNrIGlmIGNvcnJlY3QgXl4gd29ya2VkIHdpdGggMHgzZTg7CisJKi8KKwl3cml0ZV9uaWNfd29yZChkZXYsIEJpbnRySXR2LCB3b3JkKTsKKworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCisvLwlydGw4MTgwX2JlYWNvbl90eF9lbmFibGUoZGV2KTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyAgICAgICAgcnRsODE4NWJfaXJxX2VuYWJsZShkZXYpOworI2Vsc2UKKwlydGw4MTgwX2lycV9lbmFibGUoZGV2KTsKKyNlbmRpZgorCS8qIFZWICEhISEhISEhISEgVlYqLworCS8qCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LDB4OWQsMHgwMCk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisqLworLy8JRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ORVQgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE4MF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiAmcHJpdi0+aWVlZTgwMjExLT5zdGF0czsKK30KKy8vCisvLyBDaGFuZ2UgY3VycmVudCBhbmQgZGVmYXVsdCBwcmVhbWJsZSBtb2RlLgorLy8gMjAwNS4wMS4wNiwgYnkgcmNuamtvLgorLy8KK2Jvb2wKK01nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUoCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsCisJUlRfUFNfTU9ERQkJcnRQc01vZGUKKykKK3sKKworCS8vIEN1cnJlbnRseSwgd2UgZG8gbm90IGNoYW5nZSBwb3dlciBzYXZlIG1vZGUgb24gSUJTUyBtb2RlLgorCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vCisJLy8gPFJKX05PVEU+IElmIHdlIG1ha2UgSFcgdG8gZmlsbCB1cCB0aGUgUHdyTWd0IGJpdCBmb3IgdXMsCisJLy8gc29tZSBBUCB3aWxsIG5vdCByZXNwb25zZSB0byBvdXIgbWdudCBmcmFtZXMgd2l0aCBQd3JNZ3QgYml0IHNldCwKKwkvLyBlLmcuIGNhbm5vdCBhc3NvY2lhdGUgdGhlIEFQLgorCS8vIFNvIEkgY29tbWVudGVkIG91dCBpdC4gMjAwNS4wMi4xNiwgYnkgcmNuamtvLgorCS8vCisvLwkvLyBDaGFuZ2UgZGV2aWNlJ3MgcG93ZXIgc2F2ZSBtb2RlLgorLy8JQWRhcHRlci0+SGFsRnVuYy5TZXRQU01vZGVIYW5kbGVyKCBBZGFwdGVyLCBydFBzTW9kZSApOworCisJLy8gVXBkYXRlIHBvd2VyIHNhdmUgbW9kZSBjb25maWd1cmVkLgorLy8JcHJpdi0+ZG90MTFQb3dlclNhdmVNb2RlID0gcnRQc01vZGU7CisJcHJpdi0+aWVlZTgwMjExLT5wcyA9IHJ0UHNNb2RlOworCS8vIERldGVybWluZSBMaXN0ZW5JbnRlcnZhbC4KKyNpZiAwCisJaWYocHJpdi0+ZG90MTFQb3dlclNhdmVNb2RlID09IGVNYXhQcykKKwl7CisJCXByaXYtPmllZWU4MDIxMS0+TGlzdGVuSW50ZXJ2YWwgPSAxMDsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+aWVlZTgwMjExLT5MaXN0ZW5JbnRlcnZhbCA9IDI7CisJfQorI2VuZGlmCisJcmV0dXJuIHRydWU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExlaXN1cmUgUG93ZXIgU2F2ZSBpbiBsaW5rZWQgc3RhdGUuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlFbnRlciB0aGUgbGVpc3VyZSBwb3dlciBzYXZlIG1vZGUuCisvLwordm9pZAorTGVpc3VyZVBTRW50ZXIoCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYKKwkpCit7CisJaWYgKHByaXYtPmJMZWlzdXJlUHMpCisJeworCQlpZiAocHJpdi0+aWVlZTgwMjExLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpCisJCXsKKwkJCS8vcHJpbnRrKCItLS0tRW50ZXIgUFNcbiIpOworCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShwcml2LCBJRUVFODAyMTFfUFNfTUJDQVNUfElFRUU4MDIxMV9QU19VTklDQVNUKTsvL0lFRUU4MDIxMV9QU19FTkFCTEUKKwkJfQorCX0KK30KKworCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJTGVhdmUgdGhlIGxlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlLgorLy8KK3ZvaWQKK0xlaXN1cmVQU0xlYXZlKAorCXN0cnVjdCByODE4MF9wcml2ICpwcml2CisJKQoreworCWlmIChwcml2LT5iTGVpc3VyZVBzKQorCXsKKwkJaWYgKHByaXYtPmllZWU4MDIxMS0+cHMgIT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKQorCQl7CisJCQkvL3ByaW50aygiLS0tLUxlYXZlIFBTXG4iKTsKKwkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUocHJpdiwgSUVFRTgwMjExX1BTX0RJU0FCTEVEKTsKKwkJfQorCX0KK30KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfaHdfd2FrZXVwX3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgd2F0Y2hfZG9nX3dxKTsKKy8vCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSopCisvLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdhdGNoX2RvZ193cSk7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLGh3X3dha2V1cF93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKyNlbHNlCit2b2lkIHJ0bDgxODBfaHdfd2FrZXVwX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisKKy8vCXByaW50aygiZGV2IGlzICVkXG4iLGRldik7CisvLwlwcmludGsoIiYqJiheKigmKCY9PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlydGw4MTgwX2h3X3dha2V1cChkZXYpOworCit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfaHdfc2xlZXBfd3EgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKy8vICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHdhdGNoX2RvZ193cSk7CisvLyAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSopCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd2F0Y2hfZG9nX3dxKTsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSxod19zbGVlcF93cSk7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisjZWxzZQordm9pZCBydGw4MTgwX2h3X3NsZWVwX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbmRpZgorCisgICAgICAgIHJ0bDgxODBfaHdfc2xlZXBfZG93bihkZXYpOworfQorCisvL1lKLGFkZCwwODA4MjgsZm9yIEtlZXBBbGl2ZQorc3RhdGljIHZvaWQgTWdudExpbmtLZWVwQWxpdmUoc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgKQoreworCWlmIChwcml2LT5rZWVwQWxpdmVMZXZlbCA9PSAwKQorCQlyZXR1cm47CisKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJeworCQkvLworCQkvLyBLZWVwLUFsaXZlLgorCQkvLworCQkvL3ByaW50aygiTGFzdFR4OiVkIFR4OiVkIExhc3RSeDolZCBSeDolbGQgSWRsZTolZFxuIixwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtVHhVbmljYXN0LHByaXYtPk51bVR4VW5pY2FzdCwgcHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVJ4VW5pY2FzdCwgcHJpdi0+aWVlZTgwMjExLT5OdW1SeFVuaWNhc3QsIHByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCk7CisKKwkJaWYgKCAocHJpdi0+a2VlcEFsaXZlTGV2ZWw9PSAyKSB8fAorCQkJKHByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1UeFVuaWNhc3QgPT0gcHJpdi0+TnVtVHhVbmljYXN0ICYmCisJCQlwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtUnhVbmljYXN0ID09IHByaXYtPmllZWU4MDIxMS0+TnVtUnhVbmljYXN0ICkKKwkJCSkKKwkJeworCQkJcHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50Kys7CisKKwkJCS8vCisJCQkvLyBTZW5kIGEgS2VlcC1BbGl2ZSBwYWNrZXQgcGFja2V0IHRvIEFQIGlmIHdlIGhhZCBiZWVuIGlkbGUgZm9yIGEgd2hpbGUuCisJCQkvLworCQkJaWYocHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50ID49ICgoS0VFUF9BTElWRV9JTlRFUlZBTCAvIENIRUNLX0ZPUl9IQU5HX1BFUklPRCktMSkgKQorCQkJeworCQkJCXByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCA9IDA7CisJCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUocHJpdi0+aWVlZTgwMjExLCBmYWxzZSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQgPSAwOworCQl9CisJCXByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1UeFVuaWNhc3QgPSBwcml2LT5OdW1UeFVuaWNhc3Q7CisJCXByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1SeFVuaWNhc3QgPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4VW5pY2FzdDsKKwl9Cit9CisvL1lKLGFkZCwwODA4MjgsZm9yIEtlZXBBbGl2ZSxlbmQKKworc3RhdGljIHU4IHJlYWRfYWNhZGFwdGVyX2ZpbGUoY2hhciAqZmlsZW5hbWUpOwordm9pZCBydGw4MTgwX3dhdGNoX2RvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlib29sIGJFbnRlclBTID0gZmFsc2U7CisJYm9vbCBiQnVzeVRyYWZmaWMgPSBmYWxzZTsKKwl1MzIgVG90YWxSeE51bSA9IDA7CisJdTE2IFNsb3RJbmRleCA9IDA7CisJdTE2IGkgPSAwOworI2lmZGVmIEVOQUJMRV9JUFMKKwlpZihwcml2LT5pZWVlODAyMTEtPmFjdHNjYW5uaW5nID09IGZhbHNlKXsKKwkJaWYoKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKSAmJiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSAmJiAocHJpdi0+aWVlZTgwMjExLT5iZWlucmV0cnkgPT0gZmFsc2UpICYmIChwcml2LT5lUkZQb3dlclN0YXRlID09IGVSZk9uKSl7CisJCQlJUFNFbnRlcihkZXYpOworCQl9CisJfQorI2VuZGlmCisJLy9ZSixhZGQsMDgwODI4LGZvciBsaW5rIHN0YXRlIGNoZWNrCisJaWYoKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgJiYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSl7CisJCVNsb3RJbmRleCA9IChwcml2LT5saW5rX2RldGVjdC5TbG90SW5kZXgrKykgJSBwcml2LT5saW5rX2RldGVjdC5TbG90TnVtOworCQlwcml2LT5saW5rX2RldGVjdC5SeEZyYW1lTnVtW1Nsb3RJbmRleF0gPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YUluUGVyaW9kICsgcHJpdi0+aWVlZTgwMjExLT5OdW1SeEJjbkluUGVyaW9kOworCQlmb3IoIGk9MDsgaTxwcml2LT5saW5rX2RldGVjdC5TbG90TnVtOyBpKysgKQorCQkJVG90YWxSeE51bSs9IHByaXYtPmxpbmtfZGV0ZWN0LlJ4RnJhbWVOdW1baV07CisJCS8vcHJpbnRrKCImJiYmJj09PSBUb3RhbFJ4TnVtID0gJWRcbiIsIFRvdGFsUnhOdW0pOworCQlpZihUb3RhbFJ4TnVtID09IDApeworCQkJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKKwkJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgJnByaXYtPmllZWU4MDIxMS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCX0KKwl9CisKKwkvL1lKLGFkZCwwODA4MjgsZm9yIEtlZXBBbGl2ZQorCU1nbnRMaW5rS2VlcEFsaXZlKHByaXYpOworCisJLy9ZSixhZGQsMDgwODI4LGZvciBMUFMKKyNpZmRlZiBFTkFCTEVfTFBTCisJaWYocHJpdi0+UG93ZXJQcm9maWxlID09IFBPV0VSX1BST0ZJTEVfQkFUVEVSWSApCisJeworCQkvL1R1cm4gb24gTGVpc3VyZVBTIG9uIGJhdHRlcnkgcG93ZXIKKwkJLy9wcmludGsoIiEhISEhT24gYmF0dGVyeSBwb3dlclxuIik7CisJCXByaXYtPmJMZWlzdXJlUHMgPSB0cnVlOworCX0KKwllbHNlIGlmKHByaXYtPlBvd2VyUHJvZmlsZSA9PSBQT1dFUl9QUk9GSUxFX0FDICkKKwl7CisJCS8vIFR1cm4gb2ZmIExlaXN1cmVQUyBvbiBBQyBwb3dlcgorCQkvL3ByaW50aygiLS0tLU9uIEFDIHBvd2VyXG4iKTsKKwkJTGVpc3VyZVBTTGVhdmUocHJpdik7CisJCXByaXYtPmJMZWlzdXJlUHM9IGZhbHNlOworCX0KKyNlbmRpZgorCisjaWYgMAorI2lmbmRlZiBFTkFCTEVfTFBTCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKwkJaWYoCXByaXYtPk51bVJ4T2tJblBlcmlvZD4gNjY2IHx8CisJCQlwcml2LT5OdW1UeE9rSW5QZXJpb2QgPiA2NjYgKSB7CisJCQliQnVzeVRyYWZmaWMgPSB0cnVlOworCQl9CisJCWlmKChwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YSArIHByaXYtPk51bVR4T2tJblBlcmlvZCk8OCkgeworCQkJYkVudGVyUFM9IHRydWU7CisJCX0KKwkJaWYoYkVudGVyUFMpIHsKKwkJCUxlaXN1cmVQU0VudGVyKHByaXYpOworCQl9CisJCWVsc2UgeworCQkJTGVpc3VyZVBTTGVhdmUocHJpdik7CisJCX0KKwl9CisJZWxzZQl7CisJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCX0KKyNlbmRpZgorCXByaXYtPk51bVJ4T2tJblBlcmlvZCA9IDA7CisJcHJpdi0+TnVtVHhPa0luUGVyaW9kID0gMDsKKwlwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YSA9IDA7CisjZWxzZQorI2lmZGVmIEVOQUJMRV9MUFMKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCQlwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YUluUGVyaW9kOworCQkvL3ByaW50aygiVHhPaz0lZCBSeE9rPSVkXG4iLCBwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QsIHByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCk7CisJCWlmKAlwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2Q+IDY2NiB8fAorCQkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kPiA2NjYgKSB7CisJCQliQnVzeVRyYWZmaWMgPSB0cnVlOworCQl9CisJCWlmKCgocHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kICsgcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKSA+IDgpCisJCQl8fCAocHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kID4gMikpIHsKKwkJCWJFbnRlclBTPSBmYWxzZTsKKwkJfQorCQllbHNlIHsKKwkJCWJFbnRlclBTPSB0cnVlOworCQl9CisKKwkJaWYoYkVudGVyUFMpIHsKKwkJCUxlaXN1cmVQU0VudGVyKHByaXYpOworCQl9CisJCWVsc2UgeworCQkJTGVpc3VyZVBTTGVhdmUocHJpdik7CisJCX0KKwl9CisJZWxzZXsKKwkJTGVpc3VyZVBTTGVhdmUocHJpdik7CisJfQorI2VuZGlmCisJcHJpdi0+bGlua19kZXRlY3QuYkJ1c3lUcmFmZmljID0gYkJ1c3lUcmFmZmljOworCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCA9IDA7CisJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kID0gMDsKKwlwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YUluUGVyaW9kID0gMDsKKwlwcml2LT5pZWVlODAyMTEtPk51bVJ4QmNuSW5QZXJpb2QgPSAwOworI2VuZGlmCit9CitpbnQgX3J0bDgxODBfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9pbnQgaTsKKworCXByaXYtPnVwPTE7CisKKwlETUVTRygiQnJpbmdpbmcgdXAgaWZhY2UiKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlydGw4MTg1Yl9hZGFwdGVyX3N0YXJ0KGRldik7CisJcnRsODE4NWJfcnhfZW5hYmxlKGRldik7CisJcnRsODE4NWJfdHhfZW5hYmxlKGRldik7CisjZWxzZQorCXJ0bDgxODBfYWRhcHRlcl9zdGFydChkZXYpOworCXJ0bDgxODBfcnhfZW5hYmxlKGRldik7CisJcnRsODE4MF90eF9lbmFibGUoZGV2KTsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9JUFMKKwlpZihwcml2LT5iSW5hY3RpdmVQcyl7CisJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJSVBTTGVhdmUoZGV2KTsKKwl9CisjZW5kaWYKKy8vYnkgYW15IDA4MDMxMgorI2lmZGVmIFJBVEVfQURBUFQKKyAgICAgICB0aW1lcl9yYXRlX2FkYXB0aXZlKCh1bnNpZ25lZCBsb25nKWRldik7CisjZW5kaWYKKy8vYnkgYW15IDA4MDMxMgorCXdhdGNoX2RvZ19hZGFwdGl2ZSgodW5zaWduZWQgbG9uZylkZXYpOworI2lmZGVmIFNXX0FOVEUKKyAgICAgICAgaWYocHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5KQorCQkJU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjayhkZXYpOworI2VuZGlmCisvLwlJUFNFbnRlcihkZXYpOworCWllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisKKy8vQWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKy8vCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBlUmZPbjsKKy8vCXByaW50aygiXG4tLS0tLS0tLVN0YXJ0IHF1ZXVlX3dvcms6R1BJT0NoYW5nZVJGV29ya0l0ZW0iKTsKKy8vCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCZwcml2LT5pZWVlODAyMTEtPkdQSU9DaGFuZ2VSRldvcmtJdGVtLDEwMDApOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IHJ0bDgxODBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBydGw4MTgwX3VwKGRldik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorCisKK2ludCBydGw4MTgwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYgKHByaXYtPnVwID09IDEpIHJldHVybiAtMTsKKworCXJldHVybiBfcnRsODE4MF91cChkZXYpOworfQorCisKK2ludCBydGw4MTgwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IHJ0bDgxODBfZG93bihkZXYpOworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorCitpbnQgcnRsODE4MF9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYgKHByaXYtPnVwID09IDApIHJldHVybiAtMTsKKworCXByaXYtPnVwPTA7CisKKwlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisJLyogRklYTUUgKi8KKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJ0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKKwlydGw4MTgwX2lycV9kaXNhYmxlKGRldik7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisJLy9jYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPndhdGNoX2RvZ193cSk7CisvL3tieSBhbXkgMDgwMzEyCisgICAgZGVsX3RpbWVyX3N5bmMoJnByaXYtPnJhdGVhZGFwdGVyX3RpbWVyKTsKKyAgICBjYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPnJhdGVfYWRhcHRlcl93cSk7CisvL2J5IGFteSAwODAzMTJ9CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfc2xlZXBfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxKTsKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIpOworCVNldFplYnJhUkZQb3dlclN0YXRlODE4NShkZXYsZVJmT2ZmKTsKKwkvL2llZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKKwltZW1zZXQoJihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yayksMCxzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisJcmV0dXJuIDA7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfcmVzdGFydF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHJlc2V0X3dxKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+ZGV2OworI2Vsc2UKK3ZvaWQgcnRsODE4MF9yZXN0YXJ0X3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJ0bDgxODBfY29tbWl0KGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKK30KKwordm9pZCBydGw4MTgwX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9ydGw4MTgwX2NvbW1pdChkZXYpOworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKKwkvL0RNRVNHKCJUWFRJTUVPVVQiKTsKK30KKworCit2b2lkIHJ0bDgxODBfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYgKHByaXYtPnVwID09IDApIHJldHVybiA7CisvLytieSBhbXkgMDgwMzEyCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisJLy9jYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPndhdGNoX2RvZ193cSk7CisvL3tieSBhbXkgMDgwMzEyCisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorICAgIGRlbF90aW1lcl9zeW5jKCZwcml2LT5yYXRlYWRhcHRlcl90aW1lcik7CisgICAgY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5yYXRlX2FkYXB0ZXJfd3EpOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKy8vYnkgYW15IDA4MDMxMn0KKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5od19zbGVlcF93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EpOworCWRlbF90aW1lcl9zeW5jKCZwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lcik7CisJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChwcml2LT5pZWVlODAyMTEpOworCXJ0bDgxODBfaXJxX2Rpc2FibGUoZGV2KTsKKwlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJX3J0bDgxODBfdXAoZGV2KTsKK30KKworCitzdGF0aWMgdm9pZCByODE4MF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXNob3J0IHByb21pc2M7CisKKwkvL2Rvd24oJnByaXYtPnd4X3NlbSk7CisKKwlwcm9taXNjID0gKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxOjA7CisKKwlpZiAocHJvbWlzYyAhPSBwcml2LT5wcm9taXNjKQorCQlydGw4MTgwX3Jlc3RhcnQoZGV2KTsKKworCXByaXYtPnByb21pc2MgPSBwcm9taXNjOworCisJLy91cCgmcHJpdi0+d3hfc2VtKTsKK30KKworI2lmIDAKKy8qIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgd2hlbiBpdCBuZWVkcyB0byBUWCBhIDgwMi4zIGVuY2Fwc3VsYXRlZCBmcmFtZSovCitpbnQgcnRsODE4MF84MDIzX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisJcmV0ID0gaWVlZTgwMjExX3I4MTgwXzgwMjNfaGFyZHN0YXJ0eG1pdChza2IscHJpdi0+aWVlZTgwMjExKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK2ludCByODE4MF9zZXRfbWFjX2FkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICptYWMpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IG1hYzsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQltZW1jcHkocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCWlmIChwcml2LT51cCkgeworCQlydGw4MTgwX2Rvd24oZGV2KTsKKwkJcnRsODE4MF91cChkZXYpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGJhc2VkIG9uIGlwdzIyMDAgZHJpdmVyICovCitpbnQgcnRsODE4MF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwlpbnQgcmV0PS0xOworCXN3aXRjaCAoY21kKSB7CisJICAgIGNhc2UgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwocHJpdi0+aWVlZTgwMjExLCAmd3JxLT51LmRhdGEpOworCQlyZXR1cm4gcmV0OworCisJICAgIGRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVBDSSBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBfX2RldmluaXQgcnRsODE4MF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXY9IE5VTEw7CisJLy91OCAqcHRyOworCXU4IHVuaXQgPSAwOworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJdW5zaWduZWQgbG9uZyBwaW9fc3RhcnQsIHBpb19sZW4sIHBpb19mbGFnczsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBwbWVtX3N0YXJ0LCBwbWVtX2xlbiwgcG1lbV9mbGFnczsKKyNlbmRpZiAvL2VuZCAjaWZkZWYgUlRMX0lPX01BUAorCisJRE1FU0coIkNvbmZpZ3VyaW5nIGNoaXAgcmVzb3VyY2VzIik7CisKKwlpZiggcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpICl7CisJCURNRVNHKCJGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJLy9wY2lfc2V0X3dtaShwZGV2KTsKKwlwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmMDBVTEwpOworCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LDB4ZmZmZmZmMDBVTEwpOworCWRldiA9IGFsbG9jX2llZWU4MDIxMShzaXplb2Yoc3RydWN0IHI4MTgwX3ByaXYpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcHJpdi0+aWVlZTgwMjExID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICAgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworI2VuZGlmCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworLy8JbWVtc2V0KHByaXYsMCxzaXplb2Yoc3RydWN0IHI4MTgwX3ByaXYpKTsKKwlwcml2LT5wZGV2PXBkZXY7CisKKworI2lmZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCisJcGlvX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwlwaW9fbGVuID0gKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX2xlbiAocGRldiwgMCk7CisJcGlvX2ZsYWdzID0gKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX2ZsYWdzIChwZGV2LCAwKTsKKworICAgICAgCWlmICghKHBpb19mbGFncyAmIElPUkVTT1VSQ0VfSU8pKSB7CisJCURNRVNHKCJyZWdpb24gIzAgbm90IGEgUElPIHJlc291cmNlLCBhYm9ydGluZyIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLy9ETUVTRygiSU8gc3BhY2UgQCAweCUwOGx4IiwgcGlvX3N0YXJ0ICk7CisJaWYoICEgcmVxdWVzdF9yZWdpb24oIHBpb19zdGFydCwgcGlvX2xlbiwgUlRMODE4MF9NT0RVTEVfTkFNRSApICl7CisJCURNRVNHKCJyZXF1ZXN0X3JlZ2lvbiBmYWlsZWQhIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpb2FkZHIgPSBwaW9fc3RhcnQ7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7IC8vIGRldmljZSBJL08gYWRkcmVzcworCisjZWxzZQorCisJcG1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlwbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CisJcG1lbV9mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyAocGRldiwgMSk7CisKKwlpZiAoIShwbWVtX2ZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCURNRVNHKCJyZWdpb24gIzEgbm90IGEgTU1JTyByZXNvdXJjZSwgYWJvcnRpbmciKTsKKwkJZ290byBmYWlsOworCX0KKworCS8vRE1FU0coIk1lbW9yeSBtYXBwZWQgc3BhY2UgQCAweCUwOGx4ICIsIHBtZW1fc3RhcnQpOworCWlmKCAhIHJlcXVlc3RfbWVtX3JlZ2lvbihwbWVtX3N0YXJ0LCBwbWVtX2xlbiwgUlRMODE4MF9NT0RVTEVfTkFNRSkpIHsKKwkJRE1FU0coInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQhIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKworCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXBfbm9jYWNoZSggcG1lbV9zdGFydCwgcG1lbV9sZW4pOworCWlmKCBpb2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpTlVMTCApeworCQlETUVTRygiaW9yZW1hcCBmYWlsZWQhIik7CisJICAgICAgIC8vIHJlbGVhc2VfbWVtX3JlZ2lvbiggcG1lbV9zdGFydCwgcG1lbV9sZW4gKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlkZXYtPm1lbV9zdGFydCA9IGlvYWRkcjsgLy8gc2hhcmVkIG1lbSBzdGFydAorCWRldi0+bWVtX2VuZCA9IGlvYWRkciArIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7IC8vIHNoYXJlZCBtZW0gZW5kCisKKyNlbmRpZiAvL2VuZCAjaWZkZWYgUlRMX0lPX01BUAorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJLy9wY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDA1LCBwdHIpOworCS8vcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDUsICgqcHRyKSAmICh+MHgwNCkpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDUsICZ1bml0KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHgwNSwgdW5pdCAmICh+MHgwNCkpOworI2VuZGlmCisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlwcml2LT5pcnEgPSAwOworCisJZGV2LT5vcGVuID0gcnRsODE4MF9vcGVuOworCWRldi0+c3RvcCA9IHJ0bDgxODBfY2xvc2U7CisJLy9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGllZWU4MDIxMV94bWl0OworCWRldi0+dHhfdGltZW91dCA9IHJ0bDgxODBfcmVzdGFydDsKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnI4MTgwX3d4X2hhbmRsZXJzX2RlZjsKKwlkZXYtPmRvX2lvY3RsID0gcnRsODE4MF9pb2N0bDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHI4MTgwX3NldF9tdWx0aWNhc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSByODE4MF9zZXRfbWFjX2FkcjsKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSByODE4MF9nZXRfd2lyZWxlc3Nfc3RhdHM7CisjZW5kaWYKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcjgxODBfd3hfaGFuZGxlcnNfZGVmOworI2VuZGlmCisKKwlkZXYtPnR5cGU9QVJQSFJEX0VUSEVSOworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBIWiozOyAvL2FkZGVkIGJ5IGRhdmlkIHdvbywgMjAwNy4xMi4xMworCisJaWYgKGRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKSA8IDApeworICAgICAgICAgICAgICAgIERNRVNHKCJPb3BzOiBkZXZuYW1lIGFscmVhZHkgdGFrZW4hIFRyeWluZyB3bGFuJSVkLi4uXG4iKTsKKwkJaWZuYW1lID0gIndsYW4lZCI7CisJLy8JaWZuYW1lID0gImF0aCVkIjsKKwkJZGV2X2FsbG9jX25hbWUoZGV2LCBpZm5hbWUpOworICAgICAgICB9CisKKworCWlmKHJ0bDgxODBfaW5pdChkZXYpIT0wKXsKKwkJRE1FU0coIkluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQlnb3RvIGZhaWwxOworCX0KKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlyZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCXJ0bDgxODBfcHJvY19pbml0X29uZShkZXYpOworCisJRE1FU0coIkRyaXZlciBwcm9iZSBjb21wbGV0ZWRcbiIpOworCXJldHVybiAwOworCitmYWlsMToKKworI2lmZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCisJaWYoIGRldi0+YmFzZV9hZGRyICE9IDAgKXsKKworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwKKwkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSApOworCX0KKyNlbHNlCisJaWYoIGRldi0+bWVtX3N0YXJ0ICE9ICh1bnNpZ25lZCBsb25nKU5VTEwgKXsKKwkJaW91bm1hcCggKHZvaWQgKilkZXYtPm1lbV9zdGFydCApOworCQlyZWxlYXNlX21lbV9yZWdpb24oIHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwKKwkJCQkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSApOworCX0KKyNlbmRpZiAvL2VuZCAjaWZkZWYgUlRMX0lPX01BUAorCisKK2ZhaWw6CisJaWYoZGV2KXsKKworCQlpZiAocHJpdi0+aXJxKSB7CisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCWRldi0+aXJxPTA7CisJCX0KKwkJZnJlZV9pZWVlODAyMTEoZGV2KTsKKwl9CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlETUVTRygid2xhbiBkcml2ZXIgbG9hZCBmYWlsZWRcbiIpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBydGw4MTgwX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKyAJaWYoZGV2KXsKKworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCXByaXY9aWVlZTgwMjExX3ByaXYoZGV2KTsKKworCQlydGw4MTgwX3Byb2NfcmVtb3ZlX29uZShkZXYpOworCQlydGw4MTgwX2Rvd24oZGV2KTsKKwkJcHJpdi0+cmZfY2xvc2UoZGV2KTsKKwkJcnRsODE4MF9yZXNldChkZXYpOworCQkvL3J0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKKwkJLy9ydGw4MTgwX2lycV9kaXNhYmxlKGRldik7CisJCW1kZWxheSgxMCk7CisJCS8vd3JpdGVfbmljX3dvcmQoZGV2LElOVEEscmVhZF9uaWNfd29yZChkZXYsSU5UQSkpOworCQkvL2ZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCS8vbWRlbGF5KDEwKTsKKworCQlpZihwcml2LT5pcnEpeworCisJCQlETUVTRygiRnJlZWluZyBpcnEgJWQiLGRldi0+aXJxKTsKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJcHJpdi0+aXJxPTA7CisKKwkJfQorCisJCWZyZWVfcnhfZGVzY19yaW5nKGRldik7CisJCWZyZWVfdHhfZGVzY19yaW5ncyhkZXYpOworCS8vCWZyZWVfYmVhY29uX2Rlc2NfcmluZyhkZXYscHJpdi0+dHhiZWFjb25jb3VudCk7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKworCQlpZiggZGV2LT5iYXNlX2FkZHIgIT0gMCApeworCisJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwKKwkJCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSApOworCQl9CisjZWxzZQorCQlpZiggZGV2LT5tZW1fc3RhcnQgIT0gKHVuc2lnbmVkIGxvbmcpTlVMTCApeworCQkJaW91bm1hcCggKHZvaWQgKilkZXYtPm1lbV9zdGFydCApOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksCisJCQkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpICk7CisJCX0KKyNlbmRpZiAvKmVuZCAjaWZkZWYgUlRMX0lPX01BUCovCisKKwkJZnJlZV9pZWVlODAyMTEoZGV2KTsKKwl9CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJRE1FU0coIndsYW4gZHJpdmVyIHJlbW92ZWRcbiIpOworfQorCisKKy8qIGZ1biB3aXRoIHRoZSBidWlsdC1pbiBpZWVlODAyMTEgc3RhY2suLi4gKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX2NyeXB0b19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b19kZWluaXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBydGw4MTgwX3BjaV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpZWVlODAyMTFfY3J5cHRvX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b19pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJcbkxpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIFJUTDgxODAgXAorLyBSVEw4MTg1IGJhc2VkIFdMQU4gY2FyZHNcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkNvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBBbmRyZWEgTWVyZWxsb1xuIik7CisJRE1FU0coIkluaXRpYWxpemluZyBtb2R1bGUiKTsKKwlETUVTRygiV2lyZWxlc3MgZXh0ZW5zaW9ucyB2ZXJzaW9uICVkIiwgV0lSRUxFU1NfRVhUKTsKKwlydGw4MTgwX3Byb2NfbW9kdWxlX2luaXQoKTsKKworI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikpCisgICAgICBpZigwIT1wY2lfbW9kdWxlX2luaXQoJnJ0bDgxODBfcGNpX2RyaXZlcikpCisjZWxzZQorICAgICAgaWYoMCE9cGNpX3JlZ2lzdGVyX2RyaXZlcigmcnRsODE4MF9wY2lfZHJpdmVyKSkKKyNlbmRpZgorCS8vaWYoMCE9cGNpX21vZHVsZV9pbml0KCZydGw4MTgwX3BjaV9kcml2ZXIpKQorCXsKKwkJRE1FU0coIk5vIGRldmljZSBmb3VuZCIpOworCQkvKnBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnJ0bDgxODBfcGNpX2RyaXZlcik7Ki8KKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydGw4MTgwX3BjaV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnJ0bDgxODBfcGNpX2RyaXZlcik7CisJcnRsODE4MF9wcm9jX21vZHVsZV9yZW1vdmUoKTsKKwlpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCgpOworCWllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KCk7CisJaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQoKTsKKwlpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KCk7CisJRE1FU0coIkV4aXRpbmciKTsKK30KKworCit2b2lkIHJ0bDgxODBfdHJ5X3dha2VfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNob3J0IGVub3VnaF9kZXNjOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKwllbm91Z2hfZGVzYyA9IGNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LHByaSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlpZihlbm91Z2hfZGVzYykKKwkJaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUlSUSBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHJ0bDgxODBfdHhfaXNyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmksc2hvcnQgZXJyb3IpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJdTMyICp0YWlsOyAvL3RhaWwgdmlydHVhbCBhZGRyCisJdTMyICpoZWFkOyAvL2hlYWQgdmlydHVhbCBhZGRyCisJdTMyICpiZWdpbjsvL3N0YXJ0IG9mIHJpbmcgdmlydHVhbCBhZGRyCisJdTMyICpuaWN2OyAvL25pYyBwb2ludGVyIHZpcnR1YWwgYWRkcgorLy8JdTMyICp0eGR2OyAvL3BhY2tldCBqdXN0IFRYZWQKKwl1MzIgbmljOyAvL25pYyBwb2ludGVyIHBoeXNpY2FsIGFkZHIKKwl1MzIgbmljYmVnaW47Ly8gc3RhcnQgb2YgcmluZyBwaHlzaWNhbCBhZGRyCisvLwlzaG9ydCB0eGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwkvKiBwaHlzaWNhbCBhZGRyIGFyZSBvayBvbiAzMiBiaXRzIHNpbmNlIHdlIHNldCBETUEgbWFzayovCisKKwlpbnQgb2ZmczsKKwlpbnQgaixpOworCWludCBoZDsKKwlpZiAoZXJyb3IpIHByaXYtPnN0YXRzLnR4cmV0cnkrKzsgLy90b255IDIwMDYwNjAxCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZyk7CisJc3dpdGNoKHByaSkgeworCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhtYXByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eG1hcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eG1hcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSKTsKKwkJbmljYmVnaW4gPSBwcml2LT50eG1hcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBCS19QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4YmtwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhia3ByaW5nOworCQloZWFkID0gcHJpdi0+dHhia3ByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0JLUFJJT1JJVFlfUklOR19BRERSKTsKKwkJbmljYmVnaW4gPSBwcml2LT50eGJrcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBCRV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4YmVwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhiZXByaW5nOworCQloZWFkID0gcHJpdi0+dHhiZXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0JFUFJJT1JJVFlfUklOR19BRERSKTsKKwkJbmljYmVnaW4gPSBwcml2LT50eGJlcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBWSV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4dmlwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHh2aXByaW5nOworCQloZWFkID0gcHJpdi0+dHh2aXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX1ZJUFJJT1JJVFlfUklOR19BRERSKTsKKwkJbmljYmVnaW4gPSBwcml2LT50eHZpcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBWT19QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4dm9wcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHh2b3ByaW5nOworCQloZWFkID0gcHJpdi0+dHh2b3ByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX1ZPUFJJT1JJVFlfUklOR19BRERSKTsKKwkJbmljYmVnaW4gPSBwcml2LT50eHZvcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBISV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4aHByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eGhwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4aHByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFIpOworCQluaWNiZWdpbiA9IHByaXYtPnR4aHByaW5nZG1hOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZyk7CisJCXJldHVybiA7CisJfQorLyoJRE1FU0coIiV4ICVzICV4ICV4IiwoKGludCluaWMgJiAweGZmZikvOC80LAorCSoocHJpdi0+dHhucHJpbmcgKyAoKGludCluaWMmMHhmZmYpLzQvOCkgJiAoMTw8MzEpID8gImZpbGxlZCIgOiAiZW1wdHkiLAorCShwcml2LT50eG5wcmluZ3RhaWwgLSBwcml2LT50eG5wcmluZykvOCwocHJpdi0+dHhucHJpbmdoZWFkIC0KK3ByaXYtPnR4bnByaW5nKS84KTsKKyovCisJLy9uaWN2ID0gKHUzMiopICgobmljIC0gbmljYmVnaW4pICsgKGludCliZWdpbik7CisJbmljdiA9ICh1MzIqKSAoKG5pYyAtIG5pY2JlZ2luKSArICh1OCopYmVnaW4pOworCWlmKChoZWFkIDw9IHRhaWwgJiYgKG5pY3YgPiB0YWlsIHx8IG5pY3YgPCBoZWFkKSkgfHwKKwkJKGhlYWQgPiB0YWlsICYmIChuaWN2ID4gdGFpbCAmJiBuaWN2IDwgaGVhZCkpKXsKKworCQkJRE1FU0dXKCJuaWMgaGFzIGxvc3QgcG9pbnRlciIpOworI2lmZGVmIERFQlVHX1RYX0RFU0MKKwkJCS8vY2hlY2tfdHhfcmluZyhkZXYsTk9STV9QUklPUklUWSk7CisJCQljaGVja190eF9yaW5nKGRldixwcmkpOworI2VuZGlmCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWcpOworCQkJcnRsODE4MF9yZXN0YXJ0KGRldik7CisJCQlyZXR1cm47CisJCX0KKworCS8qIHdlIGNoZWNrIGFsbCB0aGUgZGVzY3JpcHRvcnMgYmV0d2VlbiB0aGUgaGVhZCBhbmQgdGhlIG5pYywKKwkgKiBidXQgbm90IHRoZSBjdXJyZW5seSBwb2ludGVkIGJ5IHRoZSBuaWMgKHRoZSBuZXh0IHRvIGJlIHR4ZWQpCisJICogYW5kIHRoZSBwcmV2aW91cyBvZiB0aGUgcG9pbnRlZCAobWlnaHQgYmUgaW4gcHJvY2VzcyA/PykKKwkqLworCS8vaWYgKGhlYWQgPT0gbmljKSByZXR1cm47CisJLy9ETUVTRygiJXggJXgiLGhlYWQsbmljKTsKKwlvZmZzID0gKG5pYyAtIG5pY2JlZ2luKTsKKwkvL0RNRVNHKCIleCAleCAleCIsbmljICwodTMyKW5pY2JlZ2luLCAoaW50KW5pYyAtbmljYmVnaW4pOworCisJb2ZmcyA9IG9mZnMgLyA4IC80OworCisJaGQgPSAoaGVhZCAtIGJlZ2luKSAvODsKKworCWlmKG9mZnMgPj0gaGQpCisJCWogPSBvZmZzIC0gaGQ7CisJZWxzZQorCQlqID0gb2ZmcyArIChwcml2LT50eHJpbmdjb3VudCAtMSAtaGQpOworCS8vCWo9IHByaXYtPnR4cmluZ2NvdW50IC0xLSAoaGQgLSBvZmZzKTsKKworCWotPTI7CisJaWYoajwwKSBqPTA7CisKKworCWZvcihpPTA7aTxqO2krKykKKwl7CisvLwkJcHJpbnRrKCIrKysrKysrKysrKysrY2hlY2sgc3RhdHVzIGRlc2NcbiIpOworCQlpZigoKmhlYWQpICYgKDE8PDMxKSkKKwkJCWJyZWFrOworCQlpZigoKCpoZWFkKSYoMHgxMDAwMDAwMCkpICE9IDApeworLy8JCQlwcmludGsoIisrKysrKysrKysrKysrbGFzdCBkZXNjLHJldHJ5IGNvdW50IGlzICVkXG4iLCgoKmhlYWQpICYgKDB4MDAwMDAwZmYpKSk7CisJCQlwcml2LT5DdXJyUmV0cnlDbnQgKz0gKHUxNikoKCpoZWFkKSAmICgweDAwMDAwMGZmKSk7CisjaWYgMQorCQkJaWYoIWVycm9yKQorCQkJeworCQkJCXByaXYtPk51bVR4T2tUb3RhbCsrOworLy8JCQkJcHJpbnRrKCJOdW1UeE9rVG90YWwgaXMgJWRcbiIscHJpdi0+TnVtVHhPa1RvdGFsKyspOworCQkJfQorI2VuZGlmCisJCQkvLwlwcmludGsoImluIGZ1bmN0aW9uICVzOmN1cnJfcmV0cnlfY291bnQgaXMgJWRcbiIsX19GVU5DVElPTl9fLCgoKmhlYWQpICYgKDB4MDAwMDAwZmYpKSk7CisJCX0KKwkJaWYoIWVycm9yKXsKKwkJCXByaXYtPk51bVR4T2tCeXRlc1RvdGFsICs9ICgqKGhlYWQrMykpICYgKDB4MDAwMDBmZmYpOworCQl9CisvLwkJcHJpbnRrKCJpbiBmdW5jdGlvbiAlczpjdXJyX3R4b2tieXRlX2NvdW50IGlzICVkXG4iLF9fRlVOQ1RJT05fXywoKihoZWFkKzMpKSAmICgweDAwMDAwZmZmKSk7CisJCSpoZWFkID0gKmhlYWQgJn4gKDE8PDMxKTsKKworCQlpZigoaGVhZCAtIGJlZ2luKS84ID09IHByaXYtPnR4cmluZ2NvdW50LTEpCisJCQloZWFkPWJlZ2luOworCisJCWVsc2UKKwkJCWhlYWQrPTg7CisJfQorI2lmIDAKKwlpZihuaWN2ID09IGJlZ2luKQorCQl0eGR2ID0gYmVnaW4gKyAocHJpdi0+dHhyaW5nY291bnQgLTEpKjg7CisJZWxzZQorCQl0eGR2ID0gbmljdiAtIDg7CisKKwl0eGVkID0gISh0eGR2WzBdICYoMTw8MzEpKTsKKworCWlmKHR4ZWQpeworCQlpZighKHR4ZHZbMF0gJiAoMTw8MTUpKSkgZXJyb3IgPSAxOworCQkvL2lmKCEodHhkdlswXSAmICgxPDwzMCkpKSBlcnJvciA9IDE7CisJCWlmKGVycm9yKURNRVNHKCIleCIsdHhkdlswXSk7CisgCX0KKyNlbmRpZgorCS8vRE1FU0coIiV4Iix0eGR2WzBdKTsKKwkvKiB0aGUgaGVhZCBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgbGFzdCBjZXJ0YWlubHkgVFhlZAorCSAqIChvciBhdCBsZWFzdCBwcm9jZXNzZWQgYnkgdGhlIG5pYykgcGFja2V0LgorCSAqIFRoZSBkcml2ZXIgdGFrZSBmb3JjZWZ1bGx5IG93bmluZyBvZiBhbGwgdGhlc2UgcGFja2V0cworCSAqIElmIHRoZSBwYWNrZXQgcHJldmlvdXMgb2YgdGhlIG5pYyBwb2ludGVyIGhhcyBiZWVuCisJICogcHJvY2Vzc2VkIHRoaXMgZG9lc24ndCBtYXR0ZXI6IGl0IHdpbGwgYmUgY2hlY2tlZAorCSAqIGhlcmUgYXQgdGhlIG5leHQgcm91bmQuIEFueXdheSBpZiBubyBtb3JlIHBhY2tldCBhcmUKKwkgKiBUWGVkIG5vIG1lbW9yeSBsZWFrIG9jY291ciBhdCBhbGwuCisJICovCisKKwlzd2l0Y2gocHJpKSB7CisJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CisJCXByaXYtPnR4bWFwcmluZ2hlYWQgPSBoZWFkOworCQkJLy9wcmludGsoIjE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+IHByaW9yaXR5IGNoZWNrIVxuIik7CisJCWlmKHByaXYtPmFja190eF90b19pZWVlKXsKKwkJCQkvLyB0cnkgdG8gaW1wbGVtZW50IHBvd2VyLXNhdmUgbW9kZSAyMDA4LjEuMjIKKwkJLy8JcHJpbnRrKCIyPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiBwcmlvcml0eSBjaGVjayFcbiIpOworI2lmIDEKKwkJCWlmKHJ0bDgxODBfaXNfdHhfcXVldWVfZW1wdHkoZGV2KSl7CisJCQkvLwlwcmludGsoInR4IHF1ZXVlIGVtcHR5LCBhZnRlciBzZW5kIG51bGwgc2xlZXAgcGFja2V0LCB0cnkgdG8gc2xlZXAgIVxuIik7CisJCQkJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAwOworCQkJCWllZWU4MDIxMV9wc190eF9hY2socHJpdi0+aWVlZTgwMjExLCFlcnJvcik7CisJCQl9CisjZW5kaWYKKwkJfQorCQlicmVhazsKKworCWNhc2UgQktfUFJJT1JJVFk6CisJCXByaXYtPnR4YmtwcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKworCWNhc2UgQkVfUFJJT1JJVFk6CisJCXByaXYtPnR4YmVwcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKworCWNhc2UgVklfUFJJT1JJVFk6CisJCXByaXYtPnR4dmlwcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKworCWNhc2UgVk9fUFJJT1JJVFk6CisJCXByaXYtPnR4dm9wcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKworCWNhc2UgSElfUFJJT1JJVFk6CisJCXByaXYtPnR4aHByaW5naGVhZCA9IGhlYWQ7CisJCWJyZWFrOworCX0KKworCS8qRE1FU0coIiV4ICV4ICV4IiwgKHByaXYtPnR4bnByaW5naGVhZCAtIHByaXYtPnR4bnByaW5nKSAvOCAsCisJCShwcml2LT50eG5wcmluZ3RhaWwgLSBwcml2LT50eG5wcmluZykgLzgsCisJCW9mZnMgKTsKKwkqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFnKTsKKworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3R4X2lycV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgcmVzZXRfd3EpOworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBpZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKikKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3YXRjaF9kb2dfd3EpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisjZWxzZQordm9pZCBydGw4MTgwX3R4X2lycV93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisJcnRsODE4MF90eF9pc3IoZGV2LE1BTkFHRV9QUklPUklUWSwwKTsKK30KK2lycXJldHVybl90IHJ0bDgxODBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm5ldGRldiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuZXRkZXY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGludGE7CisKKwkvKiBXZSBzaG91bGQgcmV0dXJuIElSUV9OT05FLCBidXQgZm9yIG5vdyBsZXQgbWUga2VlcCB0aGlzICovCisJaWYocHJpdi0+aXJxX2VuYWJsZWQgPT0gMCkgcmV0dXJuIElSUV9IQU5ETEVEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCS8vSVNSOiA0Ynl0ZXMKKwlpbnRhID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBJU1IpOy8vICYgcHJpdi0+SW50ck1hc2s7CisJd3JpdGVfbmljX2R3b3JkKGRldixJU1IsaW50YSk7IC8vIHJlc2V0IGludCBzaXR1YXRpb24KKyNlbHNlCisJaW50YSA9IHJlYWRfbmljX3dvcmQoZGV2LElOVEEpICYgcHJpdi0+aXJxX21hc2s7CisJd3JpdGVfbmljX3dvcmQoZGV2LElOVEEsaW50YSk7IC8vIHJlc2V0IGludCBzaXR1YXRpb24KKyNlbmRpZgorCisJcHJpdi0+c3RhdHMuc2hpbnRzKys7CisKKwkvL0RNRVNHKCJFbnRlciBpbnRlcnJ1cHQsIElTUiB2YWx1ZSA9IDB4JTA4eCIsIGludGEpOworCisJaWYoIWludGEpeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jayxmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwkvKgorCSAgIG1vc3QgcHJvYmFibHkgd2UgY2FuIHNhZmVseSByZXR1cm4gSVJRX05PTkUsCisJICAgYnV0IGZvciBub3cgaXMgYmV0dGVyIHRvIGF2b2lkIHByb2JsZW1zCisJKi8KKwl9CisKKwlpZihpbnRhID09IDB4ZmZmZil7CisJCQkvKiBIVyBkaXNhcHBhcmVkICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jayxmbGFncyk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcHJpdi0+c3RhdHMuaW50cysrOworI2lmZGVmIERFQlVHX0lSUQorCURNRVNHKCJOSUMgaXJxICV4IixpbnRhKTsKKyNlbmRpZgorCS8vcHJpdi0+aXJxcGVuZGluZyA9IGludGE7CisKKworCWlmKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYoaW50YSAmIElTUl9UaW1lT3V0KXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgVGltZXJJbnQsIDApOworCQkvL0RNRVNHKCI9PT09PT09PT09PT09PT09PT53YWtpbmcgdXAiKTsKKy8vCQlydGw4MTgwX2h3X3dha2V1cChkZXYpOworCX0KKworCWlmKGludGEgJiBJU1JfVEJET0speworCQlwcml2LT5zdGF0cy50eGJlYWNvbisrOworCX0KKworCWlmKGludGEgJiBJU1JfVEJERVIpeworCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycisrOworCX0KKworCWlmKGludGEgICYgSU1SX1RNR0RPSyApIHsKKy8vCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKwkJcnRsODE4MF90eF9pc3IoZGV2LE1BTkFHRV9QUklPUklUWSwwKTsKKy8vCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+dHhfaXJxX3dxKTsKKworCX0KKworCWlmKGludGEgJiBJU1JfVEhQREVSKXsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTRyAoIlRYIGhpZ2ggcHJpb3JpdHkgRVJSIik7CisjZW5kaWYKKwkJcHJpdi0+c3RhdHMudHhocGVycisrOworCQlydGw4MTgwX3R4X2lzcihkZXYsSElfUFJJT1JJVFksMSk7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfZXJyb3JzKys7CisJfQorCisJaWYoaW50YSAmIElTUl9USFBET0speyAvL0hpZ2ggcHJpb3JpdHkgdHggb2sKKyNpZmRlZiBERUJVR19UWAorCQlETUVTRyAoIlRYIGhpZ2ggcHJpb3JpdHkgT0siKTsKKyNlbmRpZgorLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvL1lKLGFkZCwwODA4MjgKKwkJcHJpdi0+c3RhdHMudHhocG9raW50Kys7CisJCXJ0bDgxODBfdHhfaXNyKGRldixISV9QUklPUklUWSwwKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1JFUikgeworCQlwcml2LT5zdGF0cy5yeGVycisrOworI2lmZGVmIERFQlVHX1JYCisJCURNRVNHVygiUlggZXJyb3IgaW50Iik7CisjZW5kaWYKKwl9CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJaWYoaW50YSAmIElTUl9UQktERVIpeyAvL2NvcnJlc3BvbmRpbmcgdG8gQktfUFJJT1JJVFkKKwkJcHJpdi0+c3RhdHMudHhia3BlcnIrKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIGJrcCBlcnJvciBpbnQiKTsKKyNlbmRpZgorCQkvL3Rhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKKwkJcnRsODE4MF90eF9pc3IoZGV2LEJLX1BSSU9SSVRZLDEpOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgQkVfUFJJT1JJVFkpOworCX0KKworCWlmKGludGEgJiBJU1JfVEJFREVSKXsgLy9jb3JyZXNwb25kaW5nIHRvIEJFX1BSSU9SSVRZCisJCXByaXYtPnN0YXRzLnR4YmVwZXJyKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBiZXAgZXJyb3IgaW50Iik7CisjZW5kaWYKKwkJcnRsODE4MF90eF9pc3IoZGV2LEJFX1BSSU9SSVRZLDEpOworCQkvL3Rhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIEJFX1BSSU9SSVRZKTsKKwl9CisjZW5kaWYKKwlpZihpbnRhICYgSVNSX1ROUERFUil7IC8vY29ycmVzcG9uZGluZyB0byBWT19QUklPUklUWQorCQlwcml2LT5zdGF0cy50eG5wZXJyKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBucCBlcnJvciBpbnQiKTsKKyNlbmRpZgorCQkvL3Rhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKKwkJcnRsODE4MF90eF9pc3IoZGV2LE5PUk1fUFJJT1JJVFksMSk7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBOT1JNX1BSSU9SSVRZKTsKKyNlbmRpZgorCX0KKworCWlmKGludGEgJiBJU1JfVExQREVSKXsgLy9jb3JyZXNwb25kaW5nIHRvIFZJX1BSSU9SSVRZCisJCXByaXYtPnN0YXRzLnR4bHBlcnIrKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIGxwIGVycm9yIGludCIpOworI2VuZGlmCisJCXJ0bDgxODBfdHhfaXNyKGRldixMT1dfUFJJT1JJVFksMSk7CisJCS8vdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3R4X3Rhc2tsZXQpOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgTE9XX1BSSU9SSVRZKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1JPSyl7CisjaWZkZWYgREVCVUdfUlgKKwkJRE1FU0coIkZyYW1lIGFycml2ZWQgISIpOworI2VuZGlmCisJCS8vcHJpdi0+TnVtUnhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+c3RhdHMucnhpbnQrKzsKKwkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQpOworCX0KKworCWlmKGludGEgJiBJU1JfUlFvU09LICl7CisjaWZkZWYgREVCVUdfUlgKKwkJRE1FU0coIlFvUyBGcmFtZSBhcnJpdmVkICEiKTsKKyNlbmRpZgorCQkvL3ByaXYtPk51bVJ4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPnN0YXRzLnJ4aW50Kys7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKwl9CisJaWYoaW50YSAmIElTUl9CY25JbnQpIHsKKwkJLy9ETUVTRygiUHJlcGFyaW5nIEJlYWNvbnMiKTsKKwkJcnRsODE4MF9wcmVwYXJlX2JlYWNvbihkZXYpOworCX0KKworCWlmKGludGEgJiBJU1JfUkRVKXsKKy8vI2lmZGVmIERFQlVHX1JYCisJCURNRVNHVygiTm8gUlggZGVzY3JpcHRvciBhdmFpbGFibGUiKTsKKwkJcHJpdi0+c3RhdHMucnhyZHUrKzsKKy8vI2VuZGlmCisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKwkJLypxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSAsJnByaXYtPnJlc3RhcnRfd29yayk7Ki8KKworCX0KKwlpZihpbnRhICYgSVNSX1JYRk9WVyl7CisjaWZkZWYgREVCVUdfUlgKKwkJRE1FU0dXKCJSWCBmaWZvIG92ZXJmbG93Iik7CisjZW5kaWYKKwkJcHJpdi0+c3RhdHMucnhvdmVyZmxvdysrOworCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfcnhfdGFza2xldCk7CisJCS8vcXVldWVfd29yayhwcml2LT53b3JrcXVldWUgLCZwcml2LT5yZXN0YXJ0X3dvcmspOworCX0KKworCWlmKGludGEgJiBJU1JfVFhGT1ZXKSBwcml2LT5zdGF0cy50eG92ZXJmbG93Kys7CisKKwlpZihpbnRhICYgSVNSX1ROUERPSyl7IC8vTm9ybWFsIHByaW9yaXR5IHR4IG9rCisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0cgKCJUWCBub3JtYWwgcHJpb3JpdHkgT0siKTsKKyNlbmRpZgorLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvL1lKLGFkZCwwODA4MjgKKwkJLy8JcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXByaXYtPnN0YXRzLnR4bnBva2ludCsrOworCQlydGw4MTgwX3R4X2lzcihkZXYsTk9STV9QUklPUklUWSwwKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RMUERPSyl7IC8vTG93IHByaW9yaXR5IHR4IG9rCisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0cgKCJUWCBsb3cgcHJpb3JpdHkgT0siKTsKKyNlbmRpZgorLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvL1lKLGFkZCwwODA4MjgKKwkJLy8JcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXByaXYtPnN0YXRzLnR4bHBva2ludCsrOworCQlydGw4MTgwX3R4X2lzcihkZXYsTE9XX1BSSU9SSVRZLDApOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgTE9XX1BSSU9SSVRZKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlpZihpbnRhICYgSVNSX1RCS0RPSyl7IC8vY29ycmVzcG9uZGluZyB0byBCS19QUklPUklUWQorCQlwcml2LT5zdGF0cy50eGJrcG9raW50Kys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBiayBwcmlvcml0eSBvayIpOworI2VuZGlmCisvLwkJcHJpdi0+TnVtVHhPa1RvdGFsKys7CisJCS8vcHJpdi0+TnVtVHhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8vWUosYWRkLDA4MDgyOAorCQlydGw4MTgwX3R4X2lzcihkZXYsQktfUFJJT1JJVFksMCk7CisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBCRV9QUklPUklUWSk7CisJfQorCisJaWYoaW50YSAmIElTUl9UQkVET0speyAvL2NvcnJlc3BvbmRpbmcgdG8gQkVfUFJJT1JJVFkKKwkJcHJpdi0+c3RhdHMudHhiZXBlcnIrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIGJlIHByaW9yaXR5IG9rIik7CisjZW5kaWYKKy8vCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKwkJLy9wcml2LT5OdW1UeE9rSW5QZXJpb2QrKzsgIC8vWUosZGVsLDA4MDgyOAorCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLy9ZSixhZGQsMDgwODI4CisJCXJ0bDgxODBfdHhfaXNyKGRldixCRV9QUklPUklUWSwwKTsKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIEJFX1BSSU9SSVRZKTsKKwl9CisjZW5kaWYKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCit2b2lkIHJ0bDgxODBfaXJxX3J4X3Rhc2tsZXQoc3RydWN0IHI4MTgwX3ByaXYqIHByaXYpCit7CisvLwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisvKglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5pcnFfbWFzayAmPX5JTVJfUk9LOworCXByaXYtPmlycV9tYXNrICY9fklNUl9SRFU7CisKKwlydGw4MTgwX2lycV9lbmFibGUocHJpdi0+ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfbG9jaywgZmxhZ3MpOworKi8KKwlydGw4MTgwX3J4KHByaXYtPmRldik7CisKKy8qCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFfbG9jaywgZmxhZ3MpOworCXByaXYtPmlycV9tYXNrIHw9IElNUl9ST0s7CisJcHJpdi0+aXJxX21hc2sgfD0gSU1SX1JEVTsKKwlydGw4MTgwX2lycV9lbmFibGUocHJpdi0+ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfbG9jaywgZmxhZ3MpOworKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2xpemhhb21pbmctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUkYgcG93ZXIgb24vcG93ZXIgb2ZmIC0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJLy9zdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgR1BJT0NoYW5nZVJGV29ya0l0ZW0ud29yayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZWxzZQordm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisKKwkvL3UxNiB0bXAyYnl0ZTsKKwl1OCBidFBTUjsKKwl1OCBidENvbmZpZzA7CisJUlRfUkZfUE9XRVJfU1RBVEUJZVJmUG93ZXJTdGF0ZVRvU2V0OworCWJvb2wgCWJBY3R1YWxseVNldD1mYWxzZTsKKworCWNoYXIgKmFyZ3ZbM107CisgICAgICAgIHN0YXRpYyBjaGFyICpSYWRpb1Bvd2VyUGF0aCA9ICIvZXRjL2FjcGkvZXZlbnRzL1JhZGlvUG93ZXIuc2giOworICAgICAgICBzdGF0aWMgY2hhciAqZW52cFtdID0geyJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS91c3IvYmluOi9iaW4iLCBOVUxMfTsKKwlzdGF0aWMgaW50IHJlYWRmX2NvdW50ID0gMDsKKwkvL3ByaW50aygiPT09PT09PT09PT09PiVzIGluIFxuIiwgX19mdW5jX18pOworCisjaWZkZWYgRU5BQkxFX0xQUworCWlmKHJlYWRmX2NvdW50ICUgMTAgPT0gMCkKKwkJcHJpdi0+UG93ZXJQcm9maWxlID0gcmVhZF9hY2FkYXB0ZXJfZmlsZSgiL3Byb2MvYWNwaS9hY19hZGFwdGVyL0FDMC9zdGF0ZSIpOworCisJcmVhZGZfY291bnQgPSAocmVhZGZfY291bnQrMSklMHhmZmZmOworI2VuZGlmCisjaWYgMAorCWlmKHByaXYtPnVwID09IDApLy9kcml2ZXIgc3RvcHBlZAorCQl7CisJCQlwcmludGsoIlxuRG8gbm90aGluZy4uLiIpOworCQkJZ290byBvdXQ7CisJCX0KKwllbHNlCisjZW5kaWYKKwkJeworCQkJLy8gV2Ugc2hvdWxkIHR1cm4gb2ZmIExFRCBiZWZvcmUgcG9sbGluZyBGRjUxWzRdLgorCisJCQkvL1R1cm4gb2ZmIExFRC4KKwkJCWJ0UFNSID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKGJ0UFNSICYgfkJJVDMpKTsKKworCQkJLy9JdCBuZWVkIHRvIGRlbGF5IDR1cyBzdWdnZXN0ZWQgYnkgSm9uZywgMjAwOC0wMS0xNgorCQkJdWRlbGF5KDQpOworCisJCQkvL0hXIHJhZGlvIE9uL09mZiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIEZGNTFbNF0oY29uZmlnMCkKKwkJCWJ0Q29uZmlnMCA9IGJ0UFNSID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzApOworCisJCQkvL1R1cm4gb24gTEVELgorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIGJ0UFNSfCBCSVQzKTsKKworCQkJZVJmUG93ZXJTdGF0ZVRvU2V0ID0gKGJ0Q29uZmlnMCAmIEJJVDQpID8gIGVSZk9uIDogZVJmT2ZmOworCisJCQlpZigocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9PSB0cnVlKSAmJiAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IGVSZk9uKSkKKwkJCXsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID0gZmFsc2U7CisJCQkJYkFjdHVhbGx5U2V0ID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UgaWYoKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPT0gZmFsc2UpICYmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT2ZmKSkKKwkJCXsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID0gdHJ1ZTsKKwkJCQliQWN0dWFsbHlTZXQgPSB0cnVlOworCQkJfQorCisJCQlpZihiQWN0dWFsbHlTZXQpCisJCQl7CisJCQkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZlBvd2VyU3RhdGVUb1NldCwgUkZfQ0hBTkdFX0JZX0hXKTsKKworCQkJCS8qIFRvIHVwZGF0ZSB0aGUgVUkgc3RhdHVzIGZvciBQb3dlciBzdGF0dXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID09IHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlsxXSA9ICJSRk9GRiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZighcHJpdi0+UmZPZmZSZWFzb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzFdID0gIlJGT04iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYXJndlsxXSA9ICJSRk9GRiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlswXSA9IFJhZGlvUG93ZXJQYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzJdID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3VzZXJtb2RlaGVscGVyKFJhZGlvUG93ZXJQYXRoLGFyZ3YsZW52cCwxKTsKKwkJCX0KKworCQl9CisKK30KKworc3RhdGljIHU4IHJlYWRfYWNhZGFwdGVyX2ZpbGUoY2hhciAqZmlsZW5hbWUpCit7CisvLyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisjaWYgMAorCWludCBmZDsKKwljaGFyIGJ1ZlsxXTsKKwljaGFyIHJldFs1MF07CisJaW50IGkgPSAwOworCWludCBuID0gMDsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwlmZCA9IHN5c19vcGVuKGZpbGVuYW1lLCBPX1JET05MWSwgMCk7CisJaWYgKGZkID49IDApIHsKKwkJd2hpbGUgKHN5c19yZWFkKGZkLCBidWYsIDEpID09IDEpCisJCXsKKwkJCWkrKzsKKwkJCWlmKGk+MTApCisJCQl7CisJCQkJaWYoYnVmWzBdIT0nICcpCisJCQkJeworCQkJCQlyZXRbbl09YnVmWzBdOworCQkJCQluKys7CisJCQkJfQorCQkJfQorCQl9CisJCXN5c19jbG9zZShmZCk7CisJfQorCXJldFtuXT0nXDAnOworLy8JcHJpbnRrKCIlcyBcbiIsIHJldCk7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlpZihzdHJuY21wKHJldCwgIm9mZi1saW5lIiw4KSA9PSAwKQorCXsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBtb2R1bGUgaW5pdCAvIGV4aXQgc3R1YnMgLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK21vZHVsZV9pbml0KHJ0bDgxODBfcGNpX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHJ0bDgxODBfcGNpX21vZHVsZV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MmRjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKQEAgLTAsMCArMSwxNzI1IEBACisvLyNpbmNsdWRlICJyODE4MC5oIg0KKyNpbmNsdWRlICJyODE4MF9kbS5oIg0KKyNpbmNsdWRlICJyODE4MF9ody5oIg0KKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIg0KKy8ve2J5IGFteSAwODAzMTINCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlSZXR1cm4gVFJVRSBpZiB3ZSBzaGFsbCBwZXJmb3JtIEhpZ2ggUG93ZXIgTWVjYWhuaXNtLCBGQUxTRSBvdGhlcndpc2UuCQ0KKy8vDQorLy8rYnkgYW15IDA4MDMxMg0KKyNkZWZpbmUgUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0QgICAgICAzMDANCisNCitib29sIENoZWNrSGlnaFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOw0KKw0KKwlpZighcHJpdi0+YlJlZ0hpZ2hQb3dlck1lY2hhbmlzbSkNCisJew0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorCQkNCisJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORykNCisJew0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlVcGRhdGUgVHggcG93ZXIgbGV2ZWwgaWYgbmVjZXNzYXJ5Lg0KKy8vCQlTZWUgYWxzbyBEb1J4SGlnaFBvd2VyKCkgYW5kIFNldFR4UG93ZXJMZXZlbDgxODUoKSBmb3IgcmVmZXJlbmNlLg0KKy8vDQorLy8JTm90ZToNCisvLwkJVGhlIHJlYXNvbiB3aHkgd2UgdWRwYXRlIFR4IHBvd2VyIGxldmVsIGhlcmUgaW5zdGVhZCBvZiBEb1J4SGlnaFBvd2VyKCkgDQorLy8JCWlzIHRoZSBudW1iZXIgb2YgSU8gdG8gY2hhbmdlIFR4IHBvd2VyIGlzIG11Y2ggbW9yZSB0aGFuIGNoYW5lIFRSIHN3aXRjaCANCisvLwkJYW5kIHRoZXkgYXJlIHJlbGF0ZWQgdG8gT0ZETSBhbmQgTUFDIHJlZ2lzdGVycy4gDQorLy8JCVNvLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSBpdCBzbyBmcmVxdWVudGx5IGluIHBlci1SeCBwYWNrZXQgYmFzZS4gDQorLy8NCit2b2lkDQorRG9UeEhpZ2hQb3dlcigNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorCXUxNgkJCUhpUHdyVXBwZXJUaCA9IDA7DQorCXUxNgkJCUhpUHdyTG93ZXJUaCA9IDA7DQorCXU4CQkJUlNTSUhpUHdyVXBwZXJUaDsNCisJdTgJCQlSU1NJSGlQd3JMb3dlclRoOw0KKwl1OAkJCXUxYlRtcDsNCisJY2hhcgkJCU9mZG1UeFB3cklkeCwgQ2NrVHhQd3JJZHg7DQorDQorCS8vcHJpbnRrKCItLS0tPiBEb1R4SGlnaFBvd2VyKClcbiIpOw0KKw0KKwlIaVB3clVwcGVyVGggPSBwcml2LT5SZWdIaVB3clVwcGVyVGg7DQorCUhpUHdyTG93ZXJUaCA9IHByaXYtPlJlZ0hpUHdyTG93ZXJUaDsJCQkJCQkNCisJDQorCUhpUHdyVXBwZXJUaCA9IEhpUHdyVXBwZXJUaCAqIDEwOw0KKwlIaVB3ckxvd2VyVGggPSBIaVB3ckxvd2VyVGggKiAxMDsNCisJUlNTSUhpUHdyVXBwZXJUaCA9IHByaXYtPlJlZ1JTU0lIaVB3clVwcGVyVGg7DQorCVJTU0lIaVB3ckxvd2VyVGggPSBwcml2LT5SZWdSU1NJSGlQd3JMb3dlclRoOw0KKw0KKwkvL2x6bSBhZGQgMDgwODI2DQorCU9mZG1UeFB3cklkeCAgPSBwcml2LT5jaHR4cHdyX29mZG1bcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF07IA0KKwlDY2tUeFB3cklkeCAgPSBwcml2LT5jaHR4cHdyW3ByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdOyANCisNCisJLy8JcHJpbnRrKCJEb1R4SGlnaFBvd2VyKCkgLSBVbmRlY29yYXRlZFNtb290aGVkU1M6JWQsIEN1ckNDS1JTU0kgPSAlZCAsIGJDdXJDQ0tQa3Q9ICVkIFxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBwcml2LT5DdXJDQ0tSU1NJLCBwcml2LT5iQ3VyQ0NLUGt0ICk7DQorCQ0KKwlpZigocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID4gSGlQd3JVcHBlclRoKSB8fA0KKwkJKHByaXYtPmJDdXJDQ0tQa3QgJiYgKHByaXYtPkN1ckNDS1JTU0kgPiBSU1NJSGlQd3JVcHBlclRoKSkpDQorCXsNCisJCS8vIFN0ZXZlbmwgc3VnZ2VzdGVkIHRoYXQgZGVncmFkZSA4ZGJtIGluIGhpZ2ggcG93ZXIgc2F0ZS4gMjAwNy0xMi0wNCBJc2FpYWggDQorCQkNCisJLy8JcHJpbnRrKCI9PT09PT5Eb1R4SGlnaFBvd2VyKCkgLSBIaWdoIFBvd2VyIC0gVW5kZWNvcmF0ZWRTbW9vdGhlZFNTOiVkLCAgSGlQd3JVcHBlclRoID0gJWQgXG4iLCBwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MsIEhpUHdyVXBwZXJUaCApOw0KKwkJcHJpdi0+YlRvVXBkYXRlVHhQd3IgPSB0cnVlOw0KKwkJdTFiVG1wPSByZWFkX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDKTsNCisNCisJCS8vIElmIGl0IG5ldmVyIGVudGVyIEhpZ2ggUG93ZXIuDQorCQlpZiggQ2NrVHhQd3JJZHggPT0gdTFiVG1wKQ0KKwkJew0KKwkJdTFiVG1wID0gKHUxYlRtcCA+IDE2KSA/ICh1MWJUbXAgLTE2KTogMDsgIC8vIDhkYm0NCisJCXdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCB1MWJUbXApOw0KKw0KKwkJdTFiVG1wPSByZWFkX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQyk7DQorCQl1MWJUbXAgPSAodTFiVG1wID4gMTYpID8gKHUxYlRtcCAtMTYpOiAwOyAgLy8gOGRibQ0KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCB1MWJUbXApOw0KKwkJfQ0KKwkJDQorCX0NCisJZWxzZSBpZigocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTIDwgSGlQd3JMb3dlclRoKSAmJg0KKwkJKCFwcml2LT5iQ3VyQ0NLUGt0IHx8IHByaXYtPkN1ckNDS1JTU0kgPCBSU1NJSGlQd3JMb3dlclRoKSkNCisJew0KKwkvLwkgcHJpbnRrKCJEb1R4SGlnaFBvd2VyKCkgLSBsb3dlciBQb3dlciAtIFVuZGVjb3JhdGVkU21vb3RoZWRTUzolZCwgIEhpUHdyVXBwZXJUaCA9ICVkIFxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBIaVB3ckxvd2VyVGggKTsNCisJCWlmKHByaXYtPmJUb1VwZGF0ZVR4UHdyKQ0KKwkJew0KKwkJCXByaXYtPmJUb1VwZGF0ZVR4UHdyID0gZmFsc2U7DQorCQkJLy9TRDMgcmVxdWlyZWQuDQorCQkJdTFiVG1wPSByZWFkX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDKTsJCQkNCisJCQlpZih1MWJUbXAgPCBDY2tUeFB3cklkeCkNCisJCQl7DQorCQkJLy91MWJUbXAgPSAoKHUxYlRtcCsxNikgPiAzNSkgPyAzNTogKHUxYlRtcCsxNik7ICAvLyA4ZGJtDQorCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgdTFiVG1wKTsNCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgQ2NrVHhQd3JJZHgpOw0KKwkJCX0NCisNCisJCQl1MWJUbXA9IHJlYWRfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDKTsNCisJCQlpZih1MWJUbXAgPCBPZmRtVHhQd3JJZHgpDQorCQkJew0KKwkJCS8vdTFiVG1wID0gKCh1MWJUbXArMTYpID4gMzUpID8gMzU6ICh1MWJUbXArMTYpOyAgLy8gOGRibQ0KKwkJCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCB1MWJUbXApOw0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgT2ZkbVR4UHdySWR4KTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLy9wcmludGsoIjwtLS0tIERvVHhIaWdoUG93ZXIoKVxuIik7DQorfQ0KKw0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCUNhbGxiYWNrIGZ1bmN0aW9uIG9mIFVwZGF0ZVR4UG93ZXJXb3JrSXRlbS4NCisvLwkJQmVjYXVzZSBvZiBzb21lIGV2ZW50IGhhcHBlbmQsIGUuZy4gQ0NYIFRQQywgSGlnaCBQb3dlciBNZWNoYW5pc20sIA0KKy8vCQlXZSB1cGRhdGUgVHggcG93ZXIgb2YgY3VycmVudCBjaGFubmVsIGFnYWluLiANCisvLw0KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpDQordm9pZCBydGw4MTgwX3R4X3B3X3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspDQorew0KKy8vICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHdhdGNoX2RvZ193cSk7DQorLy8gICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqKQ0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3YXRjaF9kb2dfd3EpOw0KKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOw0KKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsdHhfcHdfd3EpOw0KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF90eF9wd193cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KK3sNCisJLy8gc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKyNlbmRpZg0KKw0KKy8vCXByaW50aygiLS0tLT4gVXBkYXRlVHhQb3dlcldvcmtJdGVtQ2FsbGJhY2soKVxuIik7DQorCQ0KKwlEb1R4SGlnaFBvd2VyKGRldik7CQ0KKwkNCisvLwlwcmludGsoIjwtLS0tIFVwZGF0ZVR4UG93ZXJXb3JrSXRlbUNhbGxiYWNrKClcbiIpOw0KK30NCisNCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlSZXR1cm4gVFJVRSBpZiB3ZSBzaGFsbCBwZXJmb3JtIERJRyBNZWNhaG5pc20sIEZBTFNFIG90aGVyd2lzZS4JDQorLy8NCitib29sDQorQ2hlY2tEaWcoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsNCisNCisJaWYoIXByaXYtPmJEaWdNZWNoYW5pc20pDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlmKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCS8vaWYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA8IDM2KSAvLyBTY2hlZHVsZSBEaWcgdW5kZXIgYWxsIE9GRE0gcmF0ZXMuIEJ5IEJydWNlLCAyMDA3LTA2LTAxLg0KKwlpZigocHJpdi0+aWVlZTgwMjExLT5yYXRlLzUpIDwgMzYpIC8vIFNjaGVkdWxlIERpZyB1bmRlciBhbGwgT0ZETSByYXRlcy4gQnkgQnJ1Y2UsIDIwMDctMDYtMDEuDQorCQlyZXR1cm4gZmFsc2U7DQorCXJldHVybiB0cnVlOw0KK30NCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlJbXBsZW1lbnRhdGlvbiBvZiBESUcgZm9yIFplYnJhIGFuZCBaZWJyYTIuCQ0KKy8vDQordm9pZA0KK0RJR19aZWJyYSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorCXUxNgkJCUNDS0ZhbHNlQWxhcm0sIE9GRE1GYWxzZUFsYXJtOw0KKwl1MTYJCQlPZmRtRkExLCBPZmRtRkEyOw0KKwlpbnQJCQlJbml0aWFsR2FpblN0ZXAgPSA3OyAvLyBUaGUgbnVtYmVyIG9mIGluaXRpYWwgZ2FpbiBzdGFnZXMuDQorCWludAkJCUxvd2VzdEdhaW5TdGFnZSA9IDQ7IC8vIFRoZSBjYXBhYmxlIGxvd2VzdCBzdGFnZSBvZiBwZXJmb3JtaW5nIGRpZyB3b3JraXRlbS4NCisJdTMyIAkJCUF3YWtlUGVyaW9kSW4yU2VjPTA7DQorDQorCS8vcHJpbnRrKCItLS0tLS0tLS0+IERJR19aZWJyYSgpXG4iKTsNCisNCisJQ0NLRmFsc2VBbGFybSA9ICh1MTYpKHByaXYtPkZhbHNlQWxhcm1SZWdWYWx1ZSAmIDB4MDAwMGZmZmYpOw0KKwlPRkRNRmFsc2VBbGFybSA9ICh1MTYpKChwcml2LT5GYWxzZUFsYXJtUmVnVmFsdWUgPj4gMTYpICYgMHgwMDAwZmZmZik7DQorCU9mZG1GQTEgPSAgMHgxNTsNCisJT2ZkbUZBMiA9ICgodTE2KShwcml2LT5SZWdEaWdPZmRtRmFVcFRoKSkgPDwgODsNCisNCisvLwlwcmludGsoIkRJRyoqKioqKioqKipDQ0sgRmFsc2UgQWxhcm06ICUjWCBcbiIsQ0NLRmFsc2VBbGFybSk7DQorLy8JcHJpbnRrKCJESUcqKioqKioqKioqT0ZETSBGYWxzZSBBbGFybTogJSNYIFxuIixPRkRNRmFsc2VBbGFybSk7DQorDQorICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGluaXRpYWwgZ2FpbiBzdGVwcyBpcyBkaWZmZXJlbnQsIGJ5IEJydWNlLCAyMDA3LTA0LTEzLg0KKwlpZiAocHJpdi0+SW5pdGlhbEdhaW4gPT0gMCApIC8vYXV0b0RJRw0KKwl7IC8vIEFkdmlzZWQgZnJvbSBTRDMgRFoNCisJCXByaXYtPkluaXRpYWxHYWluID0gNDsgLy8gSW4gODdCLCBtNzRkQm0gbWVhbnMgU3RhdGUgNCAobTgyZEJtKQ0KKwl9DQorCS8vaWYocEhhbERhdGEtPlZlcnNpb25JRCAhPSBWRVJTSU9OXzgxODdCX0IpDQorCXsgLy8gQWR2aXNlZCBmcm9tIFNEMyBEWg0KKwkJT2ZkbUZBMSA9ICAweDIwOw0KKwl9DQorCQ0KKyNpZiAxIC8vbHptIHJlc2VydmVkIDA4MDgyNg0KKwlBd2FrZVBlcmlvZEluMlNlYyA9ICgyMDAwLXByaXYgLT5Eb3plUGVyaW9kSW5QYXN0MlNlYyk7DQorCS8vcHJpbnRrKCImJiYgRG96ZVBlcmlvZD0lZCBBd2FrZVBlcmlvZD0lZFxuIiwgcHJpdi0+RG96ZVBlcmlvZEluUGFzdDJTZWMsIEF3YWtlUGVyaW9kSW4yU2VjKTsNCisJcHJpdiAtPkRvemVQZXJpb2RJblBhc3QyU2VjPTA7DQorCQ0KKwlpZihBd2FrZVBlcmlvZEluMlNlYykNCisJewkNCisJCS8vUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19UUkFDRSwgKCJESUc6IEF3YWtlUGVyaW9kSW4yU2VjKCVkKSAtIEZBVGgoMHglWCAsIDB4JVgpIC0+IixBd2FrZVBlcmlvZEluMlNlYywgT2ZkbUZBMSwgT2ZkbUZBMikpOw0KKwkJLy8gYWRqdWVzdCBESUcgdGhyZXNob2xkLg0KKwkJT2ZkbUZBMSA9ICAodTE2KSgoT2ZkbUZBMSpBd2FrZVBlcmlvZEluMlNlYykgIC8gMjAwMCkgOyAgCQ0KKwkJT2ZkbUZBMiA9ICAodTE2KSgoT2ZkbUZBMipBd2FrZVBlcmlvZEluMlNlYykgIC8gMjAwMCkgOw0KKwkJLy9SVF9UUkFDRShDT01QX0RJRywgREJHX1RSQUNFLCAoIiggMHglWCAsIDB4JVgpXG4iLCBPZmRtRkExLCBPZmRtRkEyKSk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQk7Ly9SVF9UUkFDRShDT01QX0RJRywgREJHX1dBUk5JTkcsICgiRVJST1IhISAgQXdha2VQZXJpb2RJbjJTZWMgc2hvdWxkIG5vdCBiZSBaRVJPISFcbiIpKTsNCisJfQ0KKyNlbmRpZg0KKw0KKwlJbml0aWFsR2FpblN0ZXAgPSA4Ow0KKwlMb3dlc3RHYWluU3RhZ2UgPSBwcml2LT5SZWdCTW9kZUdhaW5TdGFnZTsgLy8gTG93ZXN0IGdhaW4gc3RhZ2UuDQorDQorCWlmIChPRkRNRmFsc2VBbGFybSA+IE9mZG1GQTEpDQorCXsNCisJCWlmIChPRkRNRmFsc2VBbGFybSA+IE9mZG1GQTIpDQorCQl7DQorCQkJcHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSsrOw0KKwkJCWlmIChwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlID4xKQ0KKwkJCXsNCisJCQkJLy9zZXJpb3VzIE9GRE0gIEZhbHNlIEFsYXJtLCBuZWVkIGZhbGxiYWNrDQorCQkJCWlmIChwcml2LT5Jbml0aWFsR2FpbiA8IEluaXRpYWxHYWluU3RlcCkNCisJCQkJew0KKwkJCQkJcHJpdi0+SW5pdGlhbEdhaW5CYWNrVXA9IHByaXYtPkluaXRpYWxHYWluOw0KKw0KKwkJCQkJcHJpdi0+SW5pdGlhbEdhaW4gPSAocHJpdi0+SW5pdGlhbEdhaW4gKyAxKTsNCisvLwkJCQkJcHJpbnRrKCJESUcqKioqKioqKioqT0ZETSBGYWxzZSBBbGFybTogJSNYLCAgT2ZkbUZBMTogJSNYLCBPZmRtRkEyOiAlI1hcbiIsIE9GRE1GYWxzZUFsYXJtLCBPZmRtRkExLCBPZmRtRkEyKTsNCisvLwkJCQkJcHJpbnRrKCJESUcrKysrKysrIGZhbGxiYWNrIE9GRE06JWQgXG4iLCBwcml2LT5Jbml0aWFsR2Fpbik7DQorCQkJCQlVcGRhdGVJbml0aWFsR2FpbihkZXYpOyANCisJCQkJfQ0KKwkJCQlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlID0gMDsNCisJCQkJcHJpdi0+RElHX051bWJlclVwZ3JhZGVWb3RlPTA7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWlmIChwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlKQ0KKwkJCQlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlLS07DQorCQl9DQorCQlwcml2LT5ESUdfTnVtYmVyVXBncmFkZVZvdGU9MDsJCQ0KKwl9DQorCWVsc2UJDQorCXsNCisJCWlmIChwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlKQ0KKwkJCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUtLTsNCisJCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZSsrOw0KKw0KKwkJaWYgKHByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZT45KQ0KKwkJew0KKwkJCWlmIChwcml2LT5Jbml0aWFsR2FpbiA+IExvd2VzdEdhaW5TdGFnZSkgLy8gSW4gODdCLCBtNzhkQm0gbWVhbnMgU3RhdGUgNCAobTg2NGRCbSkNCisJCQl7DQorCQkJCXByaXYtPkluaXRpYWxHYWluQmFja1VwPSBwcml2LT5Jbml0aWFsR2FpbjsNCisNCisJCQkJcHJpdi0+SW5pdGlhbEdhaW4gPSAocHJpdi0+SW5pdGlhbEdhaW4gLSAxKTsNCisvLwkJCQlwcmludGsoIkRJRyoqKioqKioqKipPRkRNIEZhbHNlIEFsYXJtOiAlI1gsICBPZmRtRkExOiAlI1gsIE9mZG1GQTI6ICUjWFxuIiwgT0ZETUZhbHNlQWxhcm0sIE9mZG1GQTEsIE9mZG1GQTIpOw0KKy8vCQkJCXByaW50aygiRElHLS0tLS0tLS0tIFVwZ3JhZGUgT0ZETTolZCBcbiIsIHByaXYtPkluaXRpYWxHYWluKTsNCisJCQkJVXBkYXRlSW5pdGlhbEdhaW4oZGV2KTsgDQorCQkJfQ0KKwkJCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUgPSAwOw0KKwkJCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZT0wOw0KKwkJfQ0KKwl9DQorDQorLy8JcHJpbnRrKCJESUcrKysrKysrIE9GRE06JWRcbiIsIHByaXYtPkluaXRpYWxHYWluKTsJDQorCS8vcHJpbnRrKCI8LS0tLS0tLS0tIERJR19aZWJyYSgpXG4iKTsNCit9DQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJRGlzcGF0Y2ggRElHIGltcGxlbWVudGF0aW9uIGFjY29yZGluZyB0byBSRi4gCQ0KKy8vDQordm9pZA0KK0R5bmFtaWNJbml0R2FpbigNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorDQorCXN3aXRjaChwcml2LT5yZl9jaGlwKQ0KKwl7DQorCQljYXNlIFJGX1pFQlJBMjogIC8vIFtBbm5pZVdvcmthcm91bmRdIEZvciBaZWJyYTIsIDIwMDUtMDgtMDEuDQorCQljYXNlIFJGX1pFQlJBNDoNCisJCQlESUdfWmVicmEoIGRldiApOw0KKwkJCWJyZWFrOw0KKwkJDQorCQlkZWZhdWx0Og0KKwkJCXByaW50aygiRHluYW1pY0luaXRHYWluKCk6IHVua25vd24gUkZDaGlwSUQoJWQpICEhIVxuIiwgcHJpdi0+cmZfY2hpcCk7DQorCQkJYnJlYWs7DQorCX0NCit9DQorDQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkNCit2b2lkIHJ0bDgxODBfaHdfZGlnX3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspDQorew0KKy8vICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHdhdGNoX2RvZ193cSk7DQorLy8gICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqKQ0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3YXRjaF9kb2dfd3EpOw0KKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOw0KKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsaHdfZGlnX3dxKTsNCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7DQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfaHdfZGlnX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQorew0KKwkNCisjZW5kaWYNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKw0KKwkvLyBSZWFkIENDSyBhbmQgT0ZETSBGYWxzZSBBbGFybS4NCisJcHJpdi0+RmFsc2VBbGFybVJlZ1ZhbHVlID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDQ0tfRkFMU0VfQUxBUk0pOw0KKwkNCisNCisJLy8gQWRqdXN0IEluaXRpYWwgR2FpbiBkeW5hbWljYWxseS4NCisJRHluYW1pY0luaXRHYWluKGRldik7DQorCQ0KK30NCisNCitpbnQNCitJbmNsdWRlZEluU3VwcG9ydGVkUmF0ZXMoDQorICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAgICAgICAqcHJpdiwNCisgICAgICAgIHU4ICAgICAgICAgICAgICBUeFJhdGUgICkNCit7DQorICAgIHU4IHJhdGVfbGVuOw0KKyAgICAgICAgdTggcmF0ZV9leF9sZW47DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBSYXRlTWFzayA9IDB4N0Y7DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBpZHg7DQorICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBGb3VuZCA9IDA7DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBOYWl2ZVR4UmF0ZSA9IFR4UmF0ZSZSYXRlTWFzazsNCisNCisgICAgcmF0ZV9sZW4gPSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW47DQorICAgICAgICByYXRlX2V4X2xlbiA9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsNCisgICAgICAgIGZvciggaWR4PTA7IGlkeDwgcmF0ZV9sZW47IGlkeCsrICkNCisgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYoIChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5yYXRlc1tpZHhdICYgUmF0ZU1hc2spID09IE5haXZlVHhSYXRlICkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX3JhdGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgZm9yKCBpZHg9MDsgaWR4PCByYXRlX2V4X2xlbjsgaWR4KysgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiggKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4W2lkeF0gJiBSYXRlTWFzaykgPT0gTmFpdmVUeFJhdGUgKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfcmF0ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZvdW5kOw0KKyAgICAgICAgZm91bmRfcmF0ZToNCisgICAgICAgIHJldHVybiBGb3VuZDsNCit9DQorDQorLy8NCisvLyAgICAgIERlc2NyaXB0aW9uOg0KKy8vICAgICAgICAgICAgICBHZXQgdGhlIFR4IHJhdGUgb25lIGRlZ3JlZSB1cCBmb3JtIHRoZSBpbnB1dCByYXRlIGluIHRoZSBzdXBwb3J0ZWQgcmF0ZXMuDQorLy8gICAgICAgICAgICAgIFJldHVybiB0aGUgdXBncmFkZSByYXRlIGlmIGl0IGlzIHN1Y2Nlc3NlZCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgaW5wdXQgcmF0ZS4NCisvLyAgICAgIEJ5IEJydWNlLCAyMDA3LTA2LTA1Lg0KKy8vIA0KK3U4DQorR2V0VXBncmFkZVR4UmF0ZSgNCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsDQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUNCisgICAgICAgICkNCit7DQorICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBVcFJhdGU7DQorDQorICAgICAgICAvLyBVcGdyYWRlIDEgZGVncmVlLg0KKyAgICAgICAgc3dpdGNoKHJhdGUpDQorICAgICAgICB7DQorICAgICAgICBjYXNlIDEwODogLy8gVXAgdG8gNTRNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSAxMDg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA5NjogLy8gVXAgdG8gNTRNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSAxMDg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA3MjogLy8gVXAgdG8gNDhNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSA5NjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDQ4OiAvLyBVcCB0byAzNk1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDcyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMzY6IC8vIFVwIHRvIDI0TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gNDg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAyMjogLy8gVXAgdG8gMThNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSAzNjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDExOiAvLyBVcCB0byAxMU1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDIyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNDogLy8gVXAgdG8gNS41TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gMTE7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAyOiAvLyBVcCB0byAyTWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gNDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBwcmludGsoIkdldFVwZ3JhZGVUeFJhdGUoKTogSW5wdXQgVHggUmF0ZSglZCkgaXMgdW5kZWZpbmVkIVxuIiwgcmF0ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiByYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJhdGUgaXMgdmFsaWQuDQorICAgICAgICBpZihJbmNsdWRlZEluU3VwcG9ydGVkUmF0ZXMocHJpdiwgVXBSYXRlKSkNCisgICAgICAgIHsNCisvLyAgICAgICAgICAgICAgcHJpbnRrKCJHZXRVcGdyYWRlVHhSYXRlKCk6IEdldFVwZ3JhZGUgVHggcmF0ZSglZCkgZnJvbSAlZCAhXG4iLCBVcFJhdGUsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVXBSYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvL3ByaW50aygiR2V0VXBncmFkZVR4UmF0ZSgpOiBUeCByYXRlICglZCkgaXMgbm90IGluIHN1cHBvcnRlZCByYXRlc1xuIiwgVXBSYXRlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJhdGU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmF0ZTsNCit9DQorLy8NCisvLyAgICAgIERlc2NyaXB0aW9uOg0KKy8vICAgICAgICAgICAgICBHZXQgdGhlIFR4IHJhdGUgb25lIGRlZ3JlZSBkb3duIGZvcm0gdGhlIGlucHV0IHJhdGUgaW4gdGhlIHN1cHBvcnRlZCByYXRlcy4NCisvLyAgICAgICAgICAgICAgUmV0dXJuIHRoZSBkZWdyYWRlIHJhdGUgaWYgaXQgaXMgc3VjY2Vzc2VkLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBpbnB1dCByYXRlLg0KKy8vICAgICAgQnkgQnJ1Y2UsIDIwMDctMDYtMDUuDQorLy8gDQordTgNCitHZXREZWdyYWRlVHhSYXRlKA0KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwNCisgICAgICAgIHU4ICAgICAgICAgcmF0ZQ0KKyAgICAgICAgKQ0KK3sNCisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIERvd25SYXRlOw0KKw0KKyAgICAgICAgLy8gVXBncmFkZSAxIGRlZ3JlZS4NCisgICAgICAgIHN3aXRjaChyYXRlKQ0KKyAgICAgICAgew0KKyAgICAgICAgY2FzZSAxMDg6IC8vIERvd24gdG8gNDhNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDk2Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgOTY6IC8vIERvd24gdG8gMzZNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDcyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNzI6IC8vIERvd24gdG8gMjRNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDQ4Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNDg6IC8vIERvd24gdG8gMThNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDM2Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMzY6IC8vIERvd24gdG8gMTFNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDIyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMjI6IC8vIERvd24gdG8gNS41TWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSAxMTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDExOiAvLyBEb3duIHRvIDJNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA0OiAvLyBEb3duIHRvIDFNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAyOiAvLyBEb3duIHRvIDFNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgcHJpbnRrKCJHZXREZWdyYWRlVHhSYXRlKCk6IElucHV0IFR4IFJhdGUoJWQpIGlzIHVuZGVmaW5lZCFcbiIsIHJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSByYXRlIGlzIHZhbGlkLg0KKyAgICAgICAgaWYoSW5jbHVkZWRJblN1cHBvcnRlZFJhdGVzKHByaXYsIERvd25SYXRlKSkNCisgICAgICAgIHsNCisvLyAgICAgICAgICAgICAgcHJpbnRrKCJHZXREZWdyYWRlVHhSYXRlKCk6IEdldERlZ3JhZGUgVHggcmF0ZSglZCkgZnJvbSAlZCFcbiIsIERvd25SYXRlLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIERvd25SYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvL3ByaW50aygiR2V0RGVncmFkZVR4UmF0ZSgpOiBUeCByYXRlICglZCkgaXMgbm90IGluIHN1cHBvcnRlZCByYXRlc1xuIiwgRG93blJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByYXRlOw0KK30NCisvLw0KKy8vICAgICAgSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBzcGVjaWZpZWQgZGF0YSByYXRlIGlzIA0KKy8vICAgICAgQ0NLIHJhdGUuDQorLy8gICAgICAyMDA1LjAxLjI1LCBieSByY25qa28uDQorLy8NCitib29sDQorTWdudElzQ2NrUmF0ZSgNCisgICAgICAgIHUxNiAgICAgcmF0ZQ0KKyAgICAgICAgKQ0KK3sNCisgICAgICAgIGJvb2wgYlJldHVybiA9IGZhbHNlOw0KKw0KKyAgICAgICAgaWYoKHJhdGUgPD0gMjIpICYmIChyYXRlICE9IDEyKSAmJiAocmF0ZSAhPSAxOCkpDQorICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJSZXR1cm4gPSB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIGJSZXR1cm47DQorfQ0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJVHggUG93ZXIgdHJhY2tpbmcgbWVjaGFuaXNtIHJvdXRpbmUgb24gODdTRS4NCisvLyAJQ3JlYXRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4NCisvLw0KK3ZvaWQNCitUeFB3clRyYWNraW5nODdTRSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKykNCit7CQkNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKwl1OAl0bXB1MUJ5dGUsIEN1cnJlbnRUaGVybWFsLCBJZHg7CQ0KKwljaGFyCUNja1R4UHdySWR4LCBPZmRtVHhQd3JJZHg7CQ0KKwkvL3UzMgl1NGJSZlJlZzsNCisJDQorCXRtcHUxQnl0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBFTl9MUEZfQ0FMKTsNCisJQ3VycmVudFRoZXJtYWwgPSAodG1wdTFCeXRlICYgMHhmMCk+PjQ7IC8vWyA3OjRdOiB0aGVybWFsIG1ldGVyIGluZGljYXRpb24uDQorCUN1cnJlbnRUaGVybWFsID0gKEN1cnJlbnRUaGVybWFsPjB4MGMpPyAweDBjOkN1cnJlbnRUaGVybWFsOy8vbHptIGFkZCAwODA4MjYNCisNCisJLy9wcmludGsoIlR4UHdyVHJhY2tpbmc4N1NFKCk6IEN1cnJlbnRUaGVybWFsKCVkKVxuIiwgQ3VycmVudFRoZXJtYWwpOw0KKwkNCisJaWYoIEN1cnJlbnRUaGVybWFsICE9IHByaXYtPlRoZXJtYWxNZXRlcikNCisJewkNCisvLwkJcHJpbnRrKCJUeFB3clRyYWNraW5nODdTRSgpOiBUaGVybWFsIG1ldGVyIGNoYW5nZWQhISFcbiIpOw0KKw0KKwkJLy8gVXBkYXRlIFR4IFBvd2VyIGxldmVsIG9uIGVhY2ggY2hhbm5lbC4NCisJCWZvcihJZHggPSAxOyBJZHg8MTU7IElkeCsrKQ0KKwkJewkJCQ0KKwkJCUNja1R4UHdySWR4ID0gcHJpdi0+Y2h0eHB3cltJZHhdOw0KKwkJCU9mZG1UeFB3cklkeCA9IHByaXYtPmNodHhwd3Jfb2ZkbVtJZHhdOwkJCQ0KKwkJCQ0KKwkJCWlmKCBDdXJyZW50VGhlcm1hbCA+IHByaXYtPlRoZXJtYWxNZXRlciApDQorCQkJeyAvLyBoaWdoZXIgdGhlcm1hbCBtZXRlci4JCQ0KKwkJCQlDY2tUeFB3cklkeCArPSAoQ3VycmVudFRoZXJtYWwgLSBwcml2LT5UaGVybWFsTWV0ZXIpKjI7DQorCQkJCU9mZG1UeFB3cklkeCArPSAoQ3VycmVudFRoZXJtYWwgLSBwcml2LT5UaGVybWFsTWV0ZXIpKjI7DQorCQkJDQorCQkJCWlmKENja1R4UHdySWR4ID4zNSkNCisJCQkJCUNja1R4UHdySWR4ID0gMzU7IC8vIEZvcmNlIFR4UG93ZXIgdG8gbWF4aW1hbCBpbmRleC4NCisJCQkJaWYoT2ZkbVR4UHdySWR4ID4zNSkNCisJCQkJCU9mZG1UeFB3cklkeCA9IDM1OwkJCQkNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsgLy8gbG93ZXIgdGhlcm1hbCBtZXRlci4JCQkJDQorCQkJCUNja1R4UHdySWR4IC09IChwcml2LT5UaGVybWFsTWV0ZXIgLSBDdXJyZW50VGhlcm1hbCkqMjsNCisJCQkJT2ZkbVR4UHdySWR4IC09IChwcml2LT5UaGVybWFsTWV0ZXIgLSBDdXJyZW50VGhlcm1hbCkqMjsNCisNCisJCQkJaWYoQ2NrVHhQd3JJZHggPDApDQorCQkJCQlDY2tUeFB3cklkeCA9IDA7CQkNCisJCQkJaWYoT2ZkbVR4UHdySWR4IDwwKQ0KKwkJCQkJT2ZkbVR4UHdySWR4ID0gMDsJCQkJDQorCQkJfQkJCQkJDQorCQkJDQorCQkJLy8gVXBkYXRlIFR4UG93ZXIgbGV2ZWwgb24gQ0NLIGFuZCBPRkRNIHJlc3AuDQorCQkJcHJpdi0+Y2h0eHB3cltJZHhdID0gQ2NrVHhQd3JJZHg7DQorCQkJcHJpdi0+Y2h0eHB3cl9vZmRtW0lkeF0gPSBPZmRtVHhQd3JJZHg7CQkJCQ0KKwkJfQkNCisNCisJCS8vIFVwZGF0ZSBUeFBvd2VyIGxldmVsIGltbWVkaWF0ZWx5Lg0KKwkJcnRsODIyNXoyX1NldFRYUG93ZXJMZXZlbChkZXYsIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOw0KKwl9CQ0KKwlwcml2LT5UaGVybWFsTWV0ZXIgPSBDdXJyZW50VGhlcm1hbDsJCQkJCQ0KK30NCit2b2lkDQorU3RhUmF0ZUFkYXB0aXZlODdTRSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorCXVuc2lnbmVkIGxvbmcgCQkJQ3VyclR4b2tDbnQ7DQorCXUxNgkJCUN1cnJSZXRyeUNudDsNCisJdTE2CQkJQ3VyclJldHJ5UmF0ZTsNCisJLy91MTYJCQlpLGlkeDsNCisJdW5zaWduZWQgbG9uZyAgICAgICAJQ3VyclJ4b2tDbnQ7DQorCWJvb2wJCQliVHJ5VXAgPSBmYWxzZTsNCisJYm9vbAkJCWJUcnlEb3duID0gZmFsc2U7DQorCXU4CQkJVHJ5VXBUaCA9IDE7DQorCXU4CQkJVHJ5RG93blRoID0gMjsNCisJdTMyCQkJVHhUaHJvdWdocHV0Ow0KKwlsb25nCQlDdXJyU2lnbmFsU3RyZW5ndGg7DQorCWJvb2wJCWJVcGRhdGVJbml0aWFsR2FpbiA9IGZhbHNlOw0KKyAgICAJdTgJCQl1MWJPZmRtPTAsIHUxYkNjayA9IDA7DQorCWNoYXIJCU9mZG1UeFB3cklkeCwgQ2NrVHhQd3JJZHg7CQ0KKw0KKwlwcml2LT5SYXRlQWRhcHRpdmVQZXJpb2Q9IFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9EOw0KKw0KKw0KKwlDdXJyUmV0cnlDbnQJPSBwcml2LT5DdXJyUmV0cnlDbnQ7DQorCUN1cnJUeG9rQ250CT0gcHJpdi0+TnVtVHhPa1RvdGFsIC0gcHJpdi0+TGFzdFR4b2tDbnQ7DQorCUN1cnJSeG9rQ250CT0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeE9rVG90YWwgLSBwcml2LT5MYXN0Unhva0NudDsNCisJQ3VyclNpZ25hbFN0cmVuZ3RoID0gcHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyOw0KKwlUeFRocm91Z2hwdXQgPSAodTMyKShwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbCAtIHByaXYtPkxhc3RUeE9LQnl0ZXMpOw0KKwlwcml2LT5MYXN0VHhPS0J5dGVzID0gcHJpdi0+TnVtVHhPa0J5dGVzVG90YWw7DQorCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPSBwcml2LT5pZWVlODAyMTEtPnJhdGUvNTsNCisJLy9wcmludGsoInByaXYtPkN1cnJlbnRPcGVyYVJhdGUgaXMgJWRcbiIscHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorCS8vMiBDb21wdXRlIHJldHJ5IHJhdGlvLg0KKwlpZiAoQ3VyclR4b2tDbnQ+MCkNCisJew0KKwkJQ3VyclJldHJ5UmF0ZSA9ICh1MTYpKEN1cnJSZXRyeUNudCoxMDAvQ3VyclR4b2tDbnQpOw0KKwl9DQorCWVsc2UNCisJeyAvLyBJdCBtYXkgYmUgc2VyaW91cyByZXRyeS4gVG8gZGlzdGluZ3Vpc2ggc2VyaW91cyByZXRyeSBvciBubyBwYWNrZXRzIG1vZGlmaWVkIGJ5IEJydWNlDQorCQlDdXJyUmV0cnlSYXRlID0gKHUxNikoQ3VyclJldHJ5Q250KjEwMC8xKTsNCisJfQ0KKw0KKw0KKwkvLw0KKwkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4wMS4wMi4NCisJLy8gRm9yIGRlYnVnIGluZm9ybWF0aW9uLg0KKwkvLw0KKwkvL3ByaW50aygiXG4oMSkgcEhhbERhdGEtPkxhc3RSZXRyeVJhdGU6ICVkIFxuIixwcml2LT5MYXN0UmV0cnlSYXRlKTsNCisJLy9wcmludGsoIigyKSBSZXRyeUNudCA9ICVkICBcbiIsIEN1cnJSZXRyeUNudCk7CQ0KKwkvL3ByaW50aygiKDMpIFR4b2tDbnQgPSAlZCBcbiIsIEN1cnJUeG9rQ250KTsNCisJLy9wcmludGsoIig0KSBDdXJyUmV0cnlSYXRlID0gJWQgXG4iLCBDdXJyUmV0cnlSYXRlKTsJDQorCS8vcHJpbnRrKCIoNSkgQ3VyclNpZ25hbFN0cmVuZ3RoID0gJWQgXG4iLEN1cnJTaWduYWxTdHJlbmd0aCk7DQorCS8vcHJpbnRrKCIoNikgVHhUaHJvdWdocHV0IGlzICVkXG4iLFR4VGhyb3VnaHB1dCk7DQorCS8vcHJpbnRrKCJwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbCBpcyAlZFxuIixwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbCk7CQkNCisNCisJcHJpdi0+TGFzdFJldHJ5Q250ID0gcHJpdi0+Q3VyclJldHJ5Q250Ow0KKwlwcml2LT5MYXN0VHhva0NudCA9IHByaXYtPk51bVR4T2tUb3RhbDsNCisJcHJpdi0+TGFzdFJ4b2tDbnQgPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4T2tUb3RhbDsNCisJcHJpdi0+Q3VyclJldHJ5Q250ID0gMDsNCisNCisJLy8yTm8gVHggcGFja2V0cywgcmV0dXJuIHRvIGluaXRfcmF0ZSBvciBub3Q/DQorCWlmIChDdXJyUmV0cnlSYXRlPT0wICYmIEN1cnJUeG9rQ250ID09IDApDQorCXsJDQorCQkvLw0KKwkJLy9BZnRlciA5ICgzMCozMDBtcykgc2Vjb25kcyBpbiB0aGlzIGNvbmRpdGlvbiwgd2UgdHJ5IHRvIHJhaXNlIHJhdGUuDQorCQkvLw0KKwkJcHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YSsrOw0KKwkJDQorLy8JCXByaW50aygiTm8gVHggcGFja2V0cywgVHJ5dXBpbmdDb3VudE5vRGF0YSglZClcbiIsIHByaXYtPlRyeXVwaW5nQ291bnROb0RhdGEpOw0KKwkJLy9bVFJDIERlbGwgTGFiXSBFeHRlbmQgcmFpc2VkIHBlcmlvZCBmcm9tIDQuNXNlYyB0byA5c2VjLCBJc2FpYWggMjAwOC0wMi0xNSAxODowMCANCisJCWlmIChwcml2LT5Ucnl1cGluZ0NvdW50Tm9EYXRhPjMwKQ0KKwkJew0KKwkJCXByaXYtPlRyeXVwaW5nQ291bnROb0RhdGEgPSAwOw0KKwkJIAlwcml2LT5DdXJyZW50T3BlcmFSYXRlID0gR2V0VXBncmFkZVR4UmF0ZShkZXYsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOwkJDQorCQkJLy8gUmVzZXQgRmFpbCBSZWNvcmQNCisJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZSA9IDA7DQorCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGVTUyA9IC0yMDA7DQorCQkJcHJpdi0+RmFpbFR4UmF0ZUNvdW50ID0gMDsNCisJCX0NCisJCWdvdG8gU2V0SW5pdGlhbEdhaW47DQorCX0NCisgICAgICAgIGVsc2UNCisJew0KKwkJcHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YT0wOyAvL1Jlc2V0IHRyeWluZyB1cCB0aW1lcy4NCisJfQ0KKw0KKw0KKwkvLw0KKwkvLyBGb3IgTmV0Z2VhciBjYXNlLCBJIGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgc2lnbmFsIHN0cmVuZ3RoIGVzdGltYXRpb24sDQorCS8vIHdoaWNoIGNhbiByZXN1bHRzIGluIGxvd2VyIHJhdGUgdG8gdHJhbnNtaXQgd2hlbiBzYW1wbGUgaXMgTk9UIGVub3VnaCAoZS5nLiBQSU5HIHJlcXVlc3QpLiAgDQorCS8vIDIwMDcuMDQuMDksIGJ5IFJvZ2VyLgkNCisJLy8JDQorDQorCS8vDQorCS8vIFJlc3RydWN0dXJlIHJhdGUgYWRhcHRpdmUgYXMgdGhlIGZvbGxvd2luZyBtYWluIHN0YWdlczoNCisJLy8gKDEpIEFkZCByZXRyeSB0aHJlc2hvbGQgaW4gNTRNIHVwZ3JhZGluZyBjb25kaXRpb24gd2l0aCBzaWduYWwgc3RyZW5ndGguDQorCS8vICgyKSBBZGQgdGhlIG1lY2hhbmlzbSB0byBkZWdyYWRlIHRvIENDSyByYXRlIGFjY29yZGluZyB0byBzaWduYWwgc3RyZW5ndGggDQorCS8vCQlhbmQgcmV0cnkgcmF0ZS4NCisJLy8gKDMpIFJlbW92ZSBhbGwgSW5pdGlhbCBHYWluIFVwZGF0ZXMgb3ZlciBPRkRNIHJhdGUuIFRvIGF2b2lkIHRoZSBjb21wbGljYXRlZCANCisJLy8JCXNpdHVhdGlvbiwgSW5pdGlhbCBHYWluIFVwZGF0ZSBpcyB1cG9uIG9uIERJRyBtZWNoYW5pc20gZXhjZXB0IENDSyByYXRlLg0KKwkvLyAoNCkgQWRkIHRoZSBtZWhhbmlzbSBvZiB0cnlpbmcgdG8gdXBncmFkZSB0eCByYXRlLg0KKwkvLyAoNSkgUmVjb3JkIHRoZSBpbmZvcm1hdGlvbiBvZiB1cHBpbmcgdHggcmF0ZSB0byBhdm9pZCB0cnlpbmcgdXBwaW5nIHR4IHJhdGUgY29uc3RhbnRseS4NCisJLy8gQnkgQnJ1Y2UsIDIwMDctMDYtMDUuDQorCS8vCQ0KKwkvLw0KKw0KKwkvLyAxMU1icHMgb3IgMzZNYnBzDQorCS8vIENoZWNrIG1vcmUgdGltZXMgaW4gdGhlc2UgcmF0ZShrZXkgcmF0ZXMpLg0KKwkvLw0KKwlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDIyIHx8IHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gNzIpDQorCXsgDQorCQlUcnlVcFRoICs9IDk7DQorCX0NCisJLy8NCisJLy8gTGV0IHRoZXNlIHJhdGVzIGRvd24gbW9yZSBkaWZmaWN1bHQuDQorCS8vDQorCWlmKE1nbnRJc0Nja1JhdGUocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSkgfHwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAzNikNCisJew0KKwkJCVRyeURvd25UaCArPSAxOw0KKwl9DQorDQorCS8vMSBBZGp1c3QgUmF0ZS4NCisJaWYgKHByaXYtPmJUcnl1cGluZyA9PSB0cnVlKQ0KKwl7CQ0KKwkJLy8yIEZvciBUZXN0IFVwZ3JhZGluZyBtZWNoYW5pc20NCisJCS8vIE5vdGU6DQorCQkvLyAJU29tZXRpbWVzIHRoZSB0aHJvdWdocHV0IGlzIHVwb24gb24gdGhlIGNhcGFiaWxpdHkgYnd0d2VlbiB0aGUgQVAgYW5kIE5JQywNCisJCS8vIAl0aHVzIHRoZSBsb3cgZGF0YSByYXRlIGRvZXMgbm90IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlLg0KKwkJLy8gCVdlIHJhbmRvbWx5IHVwZ3JhZGUgdGhlIGRhdGEgcmF0ZSBhbmQgY2hlY2sgaWYgdGhlIHJldHJ5IHJhdGUgaXMgaW1wcm92ZWQuDQorCQkNCisJCS8vIFVwZ3JhZGluZyByYXRlIGRpZCBub3QgaW1wcm92ZSB0aGUgcmV0cnkgcmF0ZSwgZmFsbGJhY2sgdG8gdGhlIG9yaWdpbmFsIHJhdGUuDQorCQlpZiAoIChDdXJyUmV0cnlSYXRlID4gMjUpICYmIFR4VGhyb3VnaHB1dCA8IHByaXYtPkxhc3RUeFRocm91Z2hwdXQpDQorCQl7DQorCQkJLy9Ob3QgbmVjZXNzYXJ5IHJhaXNpbmcgcmF0ZSwgZmFsbCBiYWNrIHJhdGUuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCS8vcHJpbnRrKCJjYXNlMS0xOiBOb3QgbmVjZXNzYXJ5IHJhaXNpbmcgcmF0ZSwgZmFsbCBiYWNrIHJhdGUuLi4uXG4iKTsNCisJCQkvL3ByaW50aygiY2FzZTEtMTogcE1nbnRJbmZvLT5DdXJyZW50T3BlcmFSYXRlID0lZCwgVHhUaHJvdWdocHV0ID0gJWQsIExhc3RUaHJvdWdocHV0ID0gJWRcbiIsDQorCQkJLy8JCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUsIFR4VGhyb3VnaHB1dCwgcHJpdi0+TGFzdFR4VGhyb3VnaHB1dCk7CQkJDQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcHJpdi0+YlRyeXVwaW5nID0gZmFsc2U7DQorCQl9DQorCX0JDQorCWVsc2UgaWYgKEN1cnJTaWduYWxTdHJlbmd0aCA+IC00NyAmJiAoQ3VyclJldHJ5UmF0ZSA8IDUwKSkNCisJew0KKwkJLy8yRm9yIEhpZ2ggUG93ZXINCisJCS8vDQorCQkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4wNC4wOS4NCisJCS8vIFJldHVybiB0byBoaWdoZXN0IGRhdGEgcmF0ZSwgaWYgc2lnbmFsIHN0cmVuZ3RoIGlzIGdvb2QgZW5vdWdoLg0KKwkJLy8gU2lnbmFsU3RyZW5ndGggdGhyZXNob2xkKC01MGRibSkgaXMgZm9yIFJUTDgxODYuDQorCQkvLyBSZXZpc2UgU2lnbmFsU3RyZW5ndGggdGhyZXNob2xkIHRvIC01MWRibS4JDQorCQkvLw0KKwkJLy8gQWxzbyBuZWVkIHRvIGNoZWNrIHJldHJ5IHJhdGUgZm9yIHNhZmV0eSwgYnkgQnJ1Y2UsIDIwMDctMDYtMDUuDQorCQlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlICE9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLkhpZ2hlc3RPcGVyYVJhdGUgKQ0KKwkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQkJLy8gVXBncmFkZSBUeCBSYXRlIGRpcmVjdGx5Lg0KKwkJCXByaXYtPlRyeXVwaW5nQ291bnQgKz0gVHJ5VXBUaDsNCisJCX0NCisvLwkJcHJpbnRrKCJjYXNlMjogU3RhUmF0ZUFkYXB0aXZlODdTRTogUG93ZXIoJWQpIGlzIGhpZ2ggZW5vdWdoISEuIFxuIiwgQ3VyclNpZ25hbFN0cmVuZ3RoKTsJCQkNCisJCQkJCQ0KKwl9DQorCWVsc2UgaWYoQ3VyclR4b2tDbnQgPiA5ICYmIEN1cnJUeG9rQ250PCAxMDAgJiYgQ3VyclJldHJ5UmF0ZSA+PSA2MDApIA0KKwl7DQorCQkvLzIgRm9yIFNlcmlvdXMgUmV0cnkNCisJCS8vDQorCQkvLyBUcmFmZmljIGlzIG5vdCBidXN5IGJ1dCBvdXIgVHggcmV0cnkgaXMgc2VyaW91cy4gDQorCQkvLw0KKwkJYlRyeURvd24gPSB0cnVlOw0KKwkJLy8gTGV0IFJhdGUgTWVjaGFuaXNtIHRvIGRlZ3JhZGUgdHggcmF0ZSBkaXJlY3RseS4NCisJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKy8vCQlwcmludGsoImNhc2UzOiBSQTogVHggUmV0cnkgaXMgc2VyaW91cy4gRGVncmFkZSBUeCBSYXRlIHRvICVkIGRpcmVjdGx5Li4uXG4iLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMTA4ICkNCisJew0KKwkJLy8yRm9yIDU0TWJwcw0KKwkJLy8gQWlyIExpbmsNCisJCWlmICggKEN1cnJSZXRyeVJhdGU+MjYpJiYocHJpdi0+TGFzdFJldHJ5UmF0ZT4yNSkpDQorLy8JCWlmICggKEN1cnJSZXRyeVJhdGU+NDApJiYocHJpdi0+TGFzdFJldHJ5UmF0ZT4zOSkpDQorCQl7DQorCQkJLy9Eb3duIHRvIHJhdGUgNDhNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCS8vIENhYmxlIExpbmsNCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZT4xNykmJihwcml2LT5MYXN0UmV0cnlSYXRlPjE2KSAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTcyKSkgDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZT4xNykmJihwcml2LT5MYXN0UmV0cnlSYXRlPjE2KSAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTcyKSkNCisJCXsNCisJCQkvL0Rvd24gdG8gcmF0ZSA0OE1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKw0KKwkJaWYoYlRyeURvd24gJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA8IC03NSkpIC8vY2FibGUgbGluaw0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2U0LS0tNTRNIFxuIik7CQ0KKw0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDk2ICkNCisJew0KKwkJLy8yRm9yIDQ4TWJwcw0KKwkJLy9BaXIgTGluaw0KKwkJaWYgKCAoKEN1cnJSZXRyeVJhdGU+NDgpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjQ3KSkpDQorLy8JCWlmICggKChDdXJyUmV0cnlSYXRlPjY1KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT42NCkpKQ0KKw0KKwkJewkNCisJCQkvL0Rvd24gdG8gcmF0ZSAzNk1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJLy9DYWJsZSBMaW5rDQorCQllbHNlIGlmICggKChDdXJyUmV0cnlSYXRlPjIxKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT4yMCkpICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPiAtNzQpKQ0KKwkJew0KKwkJCS8vRG93biB0byByYXRlIDM2TWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA1MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorLy8JCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDcwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisJCXsNCisJCQliVHJ5RG93biA9IHRydWU7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8OCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8OCkgKSAvL1RPIERPOiBuZWVkIHRvIGNvbnNpZGVyIChSU1NJKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MjgpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDgpICkgDQorCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCX0NCisNCisJCWlmKGJUcnlEb3duICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPCAtNzUpKQ0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2U1LS0tNDhNIFxuIik7CQ0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDcyICkNCisJew0KKwkJLy8yRm9yIDM2TWJwcw0KKwkJaWYgKCAoQ3VyclJldHJ5UmF0ZT40MykgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+NDEpKSANCisvLwkJaWYgKCAoQ3VyclJldHJ5UmF0ZT42MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+NTkpKQ0KKwkJewkNCisJCQkvL0Rvd24gdG8gcmF0ZSAyNE1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNTAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKy8vCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA3MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDE1KSAmJiAgKHByaXYtPkxhc3RSZXRyeVJhdGU8MTYpKSAvL1RPIERPOiBuZWVkIHRvIGNvbnNpZGVyIChSU1NJKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MzUpICYmICAocHJpdi0+TGFzdFJldHJ5UmF0ZTwzNikpDQorCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCX0NCisNCisJCWlmKGJUcnlEb3duICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPCAtODApKQ0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2U2LS0tMzZNIFxuIik7CQ0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDQ4ICkNCisJew0KKwkJLy8yRm9yIDI0TWJwcw0KKwkJLy8gQWlyIExpbmsNCisJCWlmICggKChDdXJyUmV0cnlSYXRlPjYzKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT42MikpKQ0KKy8vCQlpZiAoICgoQ3VyclJldHJ5UmF0ZT44MykgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+ODIpKSkNCisJCXsJDQorCQkJLy9Eb3duIHRvIHJhdGUgMThNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCS8vQ2FibGUgTGluaw0KKwkJZWxzZSBpZiAoICgoQ3VyclJldHJ5UmF0ZT4zMykgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+MzIpKSAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTgyKSApDQorLy8JCSBlbHNlIGlmICggKChDdXJyUmV0cnlSYXRlPjUwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT40OSkpICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPiAtODIpICkNCisJCXsNCisJCQkvL0Rvd24gdG8gcmF0ZSAxOE1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNTAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKy8vCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA3MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKyAgCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MjApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDIxKSkgLy9UTyBETzogbmVlZCB0byBjb25zaWRlciAoUlNTSSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDQwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTw0MSkpDQorCQl7CQ0KKwkJCWJUcnlVcCA9IHRydWU7CQ0KKwkJfQ0KKw0KKwkJaWYoYlRyeURvd24gJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA8IC04MikpDQorCQl7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQkvL3ByaW50aygiY2FzZTctLS0yNE0gXG4iKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMzYgKQ0KKwl7DQorCQkvLzJGb3IgMThNYnBzDQorCQkvLyBvcmlnaW5hbCAoMTA5LCAxMDkpIA0KKwkJLy9bVFJDIERlbGwgTGFiXSAoOTAsIDkxKSwgSXNhaWFoIDIwMDgtMDItMTggMjM6MjQNCisJCS8vCQkJICAgICAoODUsIDg2KSwgSXNhaWFoIDIwMDgtMDItMTggMjQ6MDANCisJCWlmICggKChDdXJyUmV0cnlSYXRlPjg1KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT44NikpKQ0KKy8vCQlpZiAoICgoQ3VyclJldHJ5UmF0ZT4xMTUpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjExNikpKQ0KKwkJew0KKwkJCS8vRG93biB0byByYXRlIDExTWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQkvL1tUUkMgRGVsbCBMYWJdICBJc2FpYWggMjAwOC0wMi0xOCAyMzoyNA0KKwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNTAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKy8vCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA3MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDIyKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTwyMykpIC8vVE8gRE86IG5lZWQgdG8gY29uc2lkZXIgKFJTU0kpDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTw0MikgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8NDMpKQ0KKwkJewkNCisJCQliVHJ5VXAgPSB0cnVlOwkNCisJCX0NCisJCS8vcHJpbnRrKCJjYXNlOC0tLTE4TSBcbiIpOwkNCisJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAyMiApDQorCXsNCisJCS8vMkZvciAxMU1icHMNCisJCWlmIChDdXJyUmV0cnlSYXRlPjk1KQ0KKy8vCQlpZiAoQ3VyclJldHJ5UmF0ZT4xNTUpDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDI5KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8MzApICkvL1RPIERPOiBuZWVkIHRvIGNvbnNpZGVyIChSU1NJKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8NDkpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlIDw1MCkgKQ0KKwkJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJCX0NCisJCS8vcHJpbnRrKCJjYXNlOS0tLTExTSBcbiIpOwkNCisJCX0JDQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDExICkNCisJew0KKwkJLy8yRm9yIDUuNU1icHMNCisJCWlmIChDdXJyUmV0cnlSYXRlPjE0OSkgDQorLy8JCWlmIChDdXJyUmV0cnlSYXRlPjE4OSkNCisJCXsJDQorCQkJYlRyeURvd24gPSB0cnVlOwkJCQ0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDYwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8IDY1KSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDgwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8IDg1KSkNCisNCisJCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCQl9CQkNCisJCS8vcHJpbnRrKCJjYXNlMTAtLS01LjVNIFxuIik7CQ0KKwkJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA0ICkNCisJew0KKwkJLy8yRm9yIDIgTWJwcw0KKwkJaWYoKEN1cnJSZXRyeVJhdGU+OTkpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjk5KSkNCisvLwkJaWYoKEN1cnJSZXRyeVJhdGU+MTk5KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT4xOTkpKQ0KKwkJew0KKwkJCWJUcnlEb3duID0gdHJ1ZTsJCQkNCisJCX0NCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZSA8IDY1KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8IDcwKSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlIDwgODUpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlIDwgOTApKQ0KKwkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQl9DQorCQkvL3ByaW50aygiY2FzZTExLS0tMk0gXG4iKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMiApDQorCXsNCisJCS8vMkZvciAxIE1icHMNCisJCWlmKCAoQ3VyclJldHJ5UmF0ZTw3MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8NzUpKQ0KKy8vCQlpZiggKEN1cnJSZXRyeVJhdGU8OTApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDk1KSkNCisJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2UxMi0tLTFNIFxuIik7CQ0KKwl9DQorDQorCWlmKGJUcnlVcCAmJiBiVHJ5RG93bikNCisgICAgCXByaW50aygiU3RhUmF0ZUFkYXB0aXZlODdCKCk6IFR4IFJhdGUgdHJpZWQgdXBwaW5nIGFuZCBkb3duaW5nIHNpbXVsdGFuZW91c2x5IVxuIik7DQorCQkJCQ0KKwkvLzEgVGVzdCBVcGdyYWRpbmcgVHggUmF0ZQ0KKwkvLyBTb21ldGltZXMgdGhlIGNhdXNlIG9mIHRoZSBsb3cgdGhyb3VnaHB1dCAoaGlnaCByZXRyeSByYXRlKSBpcyB0aGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBBUCBhbmQgTklDLg0KKwkvLyBUbyB0ZXN0IGlmIHRoZSB1cHBlciByYXRlIG1heSBjYXVzZSBsb3dlciByZXRyeSByYXRlLCB0aGlzIG1lY2hhbmlzbSByYW5kb21seSBvY2N1cnMgdG8gdGVzdCB1cGdyYWRpbmcgdHggcmF0ZS4NCisJaWYoIWJUcnlVcCAmJiAhYlRyeURvd24gJiYgKHByaXYtPlRyeXVwaW5nQ291bnQgPT0gMCkgJiYgKHByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPT0gMCkNCisJCSYmIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgIT0gcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuSGlnaGVzdE9wZXJhUmF0ZSAmJiBwcml2LT5GYWlsVHhSYXRlQ291bnQgPCAyKQ0KKwl7DQorCQlpZihqaWZmaWVzJSAoQ3VyclJldHJ5UmF0ZSArIDEwMSkgPT0gMCkNCisJCXsNCisJCQliVHJ5VXAgPSB0cnVlOwkNCisJCQlwcml2LT5iVHJ5dXBpbmcgPSB0cnVlOw0KKwkJCS8vcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N1NFKCk6IFJhbmRvbWx5IHRyeSB1cGdyYWRpbmcuLi5cbiIpOw0KKwkJfQ0KKwl9DQorDQorCS8vMSBSYXRlIE1lY2hhbmlzbQ0KKwlpZihiVHJ5VXApDQorCXsNCisJCXByaXYtPlRyeXVwaW5nQ291bnQrKzsNCisJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPSAwOw0KKwkJCQ0KKwkJew0KKy8vCQkJcHJpbnRrKCJVUDogcEhhbERhdGEtPlRyeXVwaW5nQ291bnQgPSAlZFxuIiwgcHJpdi0+VHJ5dXBpbmdDb3VudCk7DQorLy8JCQlwcmludGsoIlVQOiBUcnlVcFRoKCVkKSsgKEZhaWxUeFJhdGVDb3VudCglZCkpXjIgPSVkXG4iLCANCisvLwkJCQlUcnlVcFRoLCBwcml2LT5GYWlsVHhSYXRlQ291bnQsIChUcnlVcFRoICsgcHJpdi0+RmFpbFR4UmF0ZUNvdW50ICogcHJpdi0+RmFpbFR4UmF0ZUNvdW50KSApOw0KKy8vCQkJcHJpbnRrKCJVUDogcEhhbERhdGEtPmJUcnl1cGluZz0lZFxuIiwgIHByaXYtPmJUcnl1cGluZyk7DQorDQorCQl9DQorCQkNCisJCS8vDQorCQkvLyBDaGVjayBtb3JlIHRpbWVzIGlmIHdlIG5lZWQgdG8gdXBncmFkZSBpbmRlZWQuDQorCQkvLyBCZWNhdXNlIHRoZSBsYXJnZXN0IHZhbHVlIG9mIHBIYWxEYXRhLT5Ucnl1cGluZ0NvdW50IGlzIDB4RkZGRiBhbmQgDQorCQkvLyB0aGUgbGFyZ2VzdCB2YWx1ZSBvZiBwSGFsRGF0YS0+RmFpbFR4UmF0ZUNvdW50IGlzIDB4MTQsDQorCQkvLyB0aGlzIGNvbmRpdGlvbiB3aWxsIGJlIHNhdGlzZmllZCBhdCBtb3N0IGV2ZXJ5IDIgbWluLg0KKwkJLy8NCisNCisJCWlmKChwcml2LT5Ucnl1cGluZ0NvdW50ID4gKFRyeVVwVGggKyBwcml2LT5GYWlsVHhSYXRlQ291bnQgKiBwcml2LT5GYWlsVHhSYXRlQ291bnQpKSB8fA0KKwkJCShDdXJyU2lnbmFsU3RyZW5ndGggPiBwcml2LT5MYXN0RmFpbFR4UmF0ZVNTKSB8fCBwcml2LT5iVHJ5dXBpbmcpDQorCQl7DQorCQkJcHJpdi0+VHJ5dXBpbmdDb3VudCA9IDA7DQorCQkJLy8gDQorCQkJLy8gV2hlbiB0cmFuc2ZlcmluZyBmcm9tIENDSyB0byBPRkRNLCBESUcgaXMgYW4gaW1wb3J0YW50IGlzc3VlLg0KKwkJCS8vDQorCQkJaWYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAyMikNCisJCQkJYlVwZGF0ZUluaXRpYWxHYWluID0gdHJ1ZTsNCisNCisJCQkvLyBUaGUgZGlmZmVyZW5jZSBpbiB0aHJvdWdocHV0IGJldHdlZW4gNDhNYnBzIGFuZCAzNk1icHMgaXMgOE0uDQorCQkJLy8gU28sIHdlIG11c3QgYmUgY2FyZWZ1bGx5IGluIHRoaXMgcmF0ZSBzY2FsZS4gSXNhaWFoIDIwMDgtMDItMTUuDQorCQkJLy8NCisJCQlpZiggICgocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA3MikgfHwgKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gNDgpIHx8IChwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDM2KSkgJiYNCisJCQkJKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+IDIpICkNCisJCQkJcHJpdi0+UmF0ZUFkYXB0aXZlUGVyaW9kPSAoUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0QvMik7DQorCQkJDQorCQkJLy8gKDEpVG8gYXZvaWQgdXBncmFkZSBmcmVxdWVudGx5IHRvIHRoZSBmYWlsIHR4IHJhdGUsIGFkZCB0aGUgRmFpbFR4UmF0ZUNvdW50IGludG8gdGhlIHRocmVzaG9sZC4NCisJCQkvLyAoMilJZiB0aGUgc2lnbmFsIHN0cmVuZ3RoIGlzIGluY3JlYXNlZCwgaXQgbWF5IGJlIGFibGUgdG8gdXBncmFkZS4NCisNCisJCQlwcml2LT5DdXJyZW50T3BlcmFSYXRlID0gR2V0VXBncmFkZVR4UmF0ZShkZXYsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKy8vCQkJcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N1NFKCk6IFVwZ3JhZGUgVHggUmF0ZSB0byAlZFxuIiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorDQorCQkJLy9bVFJDIERlbGwgTGFiXSBCeXBhc3MgMTIvOS82LCBJc2FpYWggMjAwOC0wMi0xOCAyMDowMCANCisJCQlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlID09MzYpDQorCQkJew0KKwkJCQlwcml2LT5iVXBkYXRlQVJGUj10cnVlOw0KKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIEFSRlIsIDB4MEY4Rik7IC8vYnlwYXNzIDEyLzkvNg0KKy8vCQkJCXByaW50aygiVVA6IEFSRlI9MHhGOEZcbiIpOw0KKwkJCX0NCisJCQllbHNlIGlmKHByaXYtPmJVcGRhdGVBUkZSKQ0KKwkJCXsNCisJCQkJcHJpdi0+YlVwZGF0ZUFSRlI9ZmFsc2U7DQorCQkJCXdyaXRlX25pY193b3JkKGRldiwgQVJGUiwgMHgwRkZGKTsgLy9zZXQgMU0gfiA1NE1icHMuDQorLy8JCQkJcHJpbnRrKCJVUDogQVJGUj0weEZGRlxuIik7DQorCQkJfQ0KKwkJCQkNCisJCQkvLyBVcGRhdGUgRmFpbCBUeCByYXRlIGFuZCBjb3VudC4NCisJCQlpZihwcml2LT5MYXN0RmFpbFR4UmF0ZSAhPSBwcml2LT5DdXJyZW50T3BlcmFSYXRlKQ0KKwkJCXsNCisJCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGUgPSBwcml2LT5DdXJyZW50T3BlcmFSYXRlOw0KKwkJCQlwcml2LT5GYWlsVHhSYXRlQ291bnQgPSAwOw0KKwkJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZVNTID0gLTIwMDsgLy8gU2V0IGxvd2VzdCBwb3dlci4NCisJCQl9DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7CQ0KKwkJaWYocHJpdi0+VHJ5dXBpbmdDb3VudCA+IDApDQorCQkJcHJpdi0+VHJ5dXBpbmdDb3VudCAtLTsNCisJfQ0KKwkNCisJaWYoYlRyeURvd24pDQorCXsNCisJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGErKzsNCisJCXByaXYtPlRyeXVwaW5nQ291bnQgPSAwOw0KKwkJew0KKy8vCQkJcHJpbnRrKCJETjogcEhhbERhdGEtPlRyeURvd25Db3VudExvd0RhdGEgPSAlZFxuIixwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhKTsNCisvLwkJCXByaW50aygiRE46IFRyeURvd25UaCA9JWRcbiIsIFRyeURvd25UaCk7DQorLy8JCQlwcmludGsoIkROOiBwSGFsRGF0YS0+YlRyeXVwaW5nPSVkXG4iLCAgcHJpdi0+YlRyeXVwaW5nKTsNCisJCX0NCisJCQkJCQkNCisJCS8vQ2hlY2sgaWYgVHggcmF0ZSBjYW4gYmUgZGVncmFkZWQgb3IgVGVzdCB0cnlpbmcgdXBncmFkaW5nIHNob3VsZCBmYWxsYmFjay4NCisJCWlmKHByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPiBUcnlEb3duVGggfHwgcHJpdi0+YlRyeXVwaW5nKQ0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPSAwOw0KKwkJCXByaXYtPmJUcnl1cGluZyA9IGZhbHNlOw0KKwkJCS8vIFVwZGF0ZSBmYWlsIGluZm9ybWF0aW9uLg0KKwkJCWlmKHByaXYtPkxhc3RGYWlsVHhSYXRlID09IHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpDQorCQkJew0KKwkJCQlwcml2LT5GYWlsVHhSYXRlQ291bnQgKys7DQorCQkJCS8vIFJlY29yZCB0aGUgVHggZmFpbCByYXRlIHNpZ25hbCBzdHJlbmd0aC4NCisJCQkJaWYoQ3VyclNpZ25hbFN0cmVuZ3RoID4gcHJpdi0+TGFzdEZhaWxUeFJhdGVTUykNCisJCQkJew0KKwkJCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGVTUyA9IEN1cnJTaWduYWxTdHJlbmd0aDsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZSA9IHByaXYtPkN1cnJlbnRPcGVyYVJhdGU7DQorCQkJCXByaXYtPkZhaWxUeFJhdGVDb3VudCA9IDE7DQorCQkJCXByaXYtPkxhc3RGYWlsVHhSYXRlU1MgPSBDdXJyU2lnbmFsU3RyZW5ndGg7DQorCQkJfQ0KKwkJCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPSBHZXREZWdyYWRlVHhSYXRlKGRldiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorDQorCQkJLy8gUmVkdWNlIGNoYXJpb3QgdHJhaW5pbmcgdGltZSBhdCB3ZWFrIHNpZ25hbCBzdHJlbmd0aCBzaXR1YXRpb24uIFNEMyBFRCBkZW1hbmQuIA0KKwkJCS8vW1RSQyBEZWxsIExhYl0gUmV2aXNlIFNpZ25hbCBUaHJlc2hvbGQgZnJvbSAtNzUgdG8gLTgwICwgSXNhaWFoIDIwMDgtMDItMTggMjA6MDAgDQorCQkJaWYoIChDdXJyU2lnbmFsU3RyZW5ndGggPCAtODApICYmIChwcml2LT5DdXJyZW50T3BlcmFSYXRlID4gNzIgKSkNCisJCQl7DQorCQkJCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPSA3MjsNCisvLwkJCQlwcmludGsoIkROOiB3ZWFrIHNpZ25hbCBzdHJlbmd0aCAoJWQpLCBkZWdyYWRlIHRvIDM2TWJwc1xuIiwgQ3VyclNpZ25hbFN0cmVuZ3RoKTsNCisJCQl9DQorDQorCQkJLy9bVFJDIERlbGwgTGFiXSBCeXBhc3MgMTIvOS82LCBJc2FpYWggMjAwOC0wMi0xOCAyMDowMCANCisJCQlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlID09MzYpDQorCQkJew0KKwkJCQlwcml2LT5iVXBkYXRlQVJGUj10cnVlOw0KKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIEFSRlIsIDB4MEY4Rik7IC8vYnlwYXNzIDEyLzkvNg0KKy8vCQkJCXByaW50aygiRE46IEFSRlI9MHhGOEZcbiIpOw0KKwkJCX0NCisJCQllbHNlIGlmKHByaXYtPmJVcGRhdGVBUkZSKQ0KKwkJCXsNCisJCQkJcHJpdi0+YlVwZGF0ZUFSRlI9ZmFsc2U7DQorCQkJCXdyaXRlX25pY193b3JkKGRldiwgQVJGUiwgMHgwRkZGKTsgLy9zZXQgMU0gfiA1NE1icHMuDQorLy8JCQkJcHJpbnRrKCJETjogQVJGUj0weEZGRlxuIik7DQorCQkJfQ0KKwkJCQkNCisJCQkvLw0KKwkJCS8vIFdoZW4gaXQgaXMgQ0NLIHJhdGUsIGl0IG1heSBuZWVkIHRvIHVwZGF0ZSBpbml0aWFsIGdhaW4gdG8gcmVjZWl2ZSBsb3dlciBwb3dlciBwYWNrZXRzLg0KKwkJCS8vDQorCQkJaWYoTWdudElzQ2NrUmF0ZShwcml2LT5DdXJyZW50T3BlcmFSYXRlKSkNCisJCQl7DQorCQkJCWJVcGRhdGVJbml0aWFsR2FpbiA9IHRydWU7DQorCQkJfQ0KKy8vCQkJcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N1NFKCk6IERlZ3JhZGUgVHggUmF0ZSB0byAlZFxuIiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlpZihwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhID4gMCkNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhIC0tOw0KKwl9DQorCQkJDQorCS8vIEtlZXAgdGhlIFR4IGZhaWwgcmF0ZSBjb3VudCB0byBlcXVhbCB0byAweDE1IGF0IG1vc3QuDQorCS8vIFJlZHVjZSB0aGUgZmFpbCBjb3VudCBhdCBsZWFzdCB0byAxMCBzZWMgaWYgdHggcmF0ZSBpcyB0ZW5kaW5nIHN0YWJsZS4NCisJaWYocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID49IDB4MTUgfHwgDQorCQkoIWJUcnlVcCAmJiAhYlRyeURvd24gJiYgcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSA9PSAwICYmIHByaXYtPlRyeXVwaW5nQ291bnQgJiYgcHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4gMHg2KSkNCisJew0KKwkJcHJpdi0+RmFpbFR4UmF0ZUNvdW50IC0tOw0KKwl9CQkNCisNCisNCisJT2ZkbVR4UHdySWR4ICA9IHByaXYtPmNodHhwd3Jfb2ZkbVtwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXTsgDQorCUNja1R4UHdySWR4ICA9IHByaXYtPmNodHhwd3JbcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF07IA0KKwkNCisJLy9bVFJDIERlbGwgTGFiXSBNYWMweDllIGluY3JlYXNlIDIgbGV2ZWwgaW4gMzZNfjE4TSBzaXR1YXRpb24sIElzYWlhaCAyMDA4LTAyLTE4IDI0OjAwIA0KKwlpZigocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA8IDk2KSAmJihwcml2LT5DdXJyZW50T3BlcmFSYXRlID4gMjIpKQ0KKwl7DQorCQl1MWJDY2sgPSByZWFkX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDKTsNCisJCXUxYk9mZG0gPSByZWFkX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQyk7DQorDQorCQkvLyBjYXNlIDE6IE5ldmVyIGVudGVyIEhpZ2ggcG93ZXINCisJCWlmKHUxYkNjayA9PSBDY2tUeFB3cklkeCApDQorCQl7DQorCQkJaWYodTFiT2ZkbSAhPSAoT2ZkbVR4UHdySWR4KzIpICkNCisJCQl7DQorCQkJcHJpdi0+YkVuaGFuY2VUeFB3cj0gdHJ1ZTsNCisJCQl1MWJPZmRtID0gKCh1MWJPZmRtKzIpID4gMzUpID8gMzU6ICh1MWJPZmRtKzIpOw0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgdTFiT2ZkbSk7DQorLy8JCQlwcmludGsoIkVuaGFuY2UgT0ZETV9UWEFHQyA6ICsrKysrIHUxYk9mZG09IDB4JXhcbiIsIHUxYk9mZG0pOw0KKwkJCX0NCisJCX0NCisJCS8vIGNhc2UgMjogZW50ZXIgaGlnaCBwb3dlcg0KKwkJZWxzZSBpZih1MWJDY2sgPCBDY2tUeFB3cklkeCkNCisJCXsNCisJCQlpZighcHJpdi0+YkVuaGFuY2VUeFB3cikNCisJCQl7DQorCQkJCXByaXYtPmJFbmhhbmNlVHhQd3I9IHRydWU7DQorCQkJCXUxYk9mZG0gPSAoKHUxYk9mZG0rMikgPiAzNSkgPyAzNTogKHUxYk9mZG0rMik7DQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgdTFiT2ZkbSk7DQorCQkJCS8vUlRfVFJBQ0UoQ09NUF9SQVRFLCBEQkdfVFJBQ0UsICgiRW5oYW5jZSBPRkRNX1RYQUdDKDIpIDogKysrKysgdTFiT2ZkbT0gMHgleFxuIiwgdTFiT2ZkbSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKwllbHNlIGlmKHByaXYtPmJFbmhhbmNlVHhQd3IpICAvLzU0LzQ4LzExLzUuNS8yLzENCisJew0KKwkJdTFiQ2NrID0gcmVhZF9uaWNfYnl0ZShkZXYsIENDS19UWEFHQyk7DQorCQl1MWJPZmRtID0gcmVhZF9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MpOw0KKw0KKwkJLy8gY2FzZSAxOiBOZXZlciBlbnRlciBIaWdoIHBvd2VyDQorCQlpZih1MWJDY2sgPT0gQ2NrVHhQd3JJZHggKQ0KKwkJew0KKwkJcHJpdi0+YkVuaGFuY2VUeFB3cj0gZmFsc2U7DQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIE9mZG1UeFB3cklkeCk7DQorCQkvL3ByaW50aygiUmVjb3ZlciBPRkRNX1RYQUdDIDogPT09PT0gdTFiT2ZkbT0gMHgleFxuIiwgT2ZkbVR4UHdySWR4KTsNCisJCX0NCisJCS8vIGNhc2UgMjogZW50ZXIgaGlnaCBwb3dlcg0KKwkJZWxzZSBpZih1MWJDY2sgPCBDY2tUeFB3cklkeCkNCisJCXsNCisJCQlwcml2LT5iRW5oYW5jZVR4UHdyPSBmYWxzZTsNCisJCQl1MWJPZmRtID0gKCh1MWJPZmRtLTIpID4gMCkgPyAodTFiT2ZkbS0yKTogMDsNCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIHUxYk9mZG0pOw0KKwkJCS8vUlRfVFJBQ0UoQ09NUF9SQVRFLCBEQkdfVFJBQ0UsICgiUmVjb3ZlciBPRkRNX1RYQUdDKDIpOiA9PT09PSB1MWJPZmRtPSAweCV4XG4iLCB1MWJPZmRtKSk7DQorDQorCQl9DQorCX0NCisNCisJLy8NCisJLy8gV2UgbmVlZCB1cGRhdGUgaW5pdGlhbCBnYWluIHdoZW4gd2Ugc2V0IHR4IHJhdGUgImZyb20gT0ZETSB0byBDQ0siIG9yDQorCS8vICJmcm9tIENDSyB0byBPRkRNIi4gDQorCS8vDQorU2V0SW5pdGlhbEdhaW46DQorCWlmKGJVcGRhdGVJbml0aWFsR2FpbikNCisJew0KKwkJaWYoTWdudElzQ2NrUmF0ZShwcml2LT5DdXJyZW50T3BlcmFSYXRlKSkgLy8gQ0NLDQorCQl7DQorCQkJaWYocHJpdi0+SW5pdGlhbEdhaW4gPiBwcml2LT5SZWdCTW9kZUdhaW5TdGFnZSkNCisJCQl7DQorCQkJCXByaXYtPkluaXRpYWxHYWluQmFja1VwPSBwcml2LT5Jbml0aWFsR2FpbjsNCisNCisJCQkJaWYoQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTg1KSAvLyBMb3cgcG93ZXIsIE9GRE0gWzB4MTddID0gMjYuDQorCQkJCXsNCisJCQkJCS8vU0QzIFNZcyBzdWdnZXN0IHRoYXQgQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTY1LCBvZmRtIDB4MTc9MjYuDQorCQkJCQlwcml2LT5Jbml0aWFsR2FpbiA9IHByaXYtPlJlZ0JNb2RlR2FpblN0YWdlOw0KKwkJCQl9DQorCQkJCWVsc2UgaWYocHJpdi0+SW5pdGlhbEdhaW4gPiBwcml2LT5SZWdCTW9kZUdhaW5TdGFnZSArIDEpDQorCQkJCXsNCisJCQkJCXByaXYtPkluaXRpYWxHYWluIC09IDI7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlwcml2LT5Jbml0aWFsR2FpbiAtLTsNCisJCQkJfQ0KKwkJCQlwcmludGsoIlN0YVJhdGVBZGFwdGl2ZTg3U0UoKTogdXBkYXRlIGluaXRfZ2FpbiB0byBpbmRleCAlZCBmb3IgZGF0ZSByYXRlICVkXG4iLHByaXYtPkluaXRpYWxHYWluLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsJCQkNCisJCQkJVXBkYXRlSW5pdGlhbEdhaW4oZGV2KTsNCisJCQl9DQorCQl9DQorCQllbHNlIC8vIE9GRE0NCisJCXsJCQkNCisJCQlpZihwcml2LT5Jbml0aWFsR2FpbiA8IDQpDQorCQkJew0KKwkJCQlwcml2LT5Jbml0aWFsR2FpbkJhY2tVcD0gcHJpdi0+SW5pdGlhbEdhaW47DQorDQorCQkJCXByaXYtPkluaXRpYWxHYWluICsrOw0KKwkJCQlwcmludGsoIlN0YVJhdGVBZGFwdGl2ZTg3U0UoKTogdXBkYXRlIGluaXRfZ2FpbiB0byBpbmRleCAlZCBmb3IgZGF0ZSByYXRlICVkXG4iLHByaXYtPkluaXRpYWxHYWluLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsJCQkNCisJCQkJVXBkYXRlSW5pdGlhbEdhaW4oZGV2KTsNCisJCQl9CQkJCQkNCisJCX0NCisJfQ0KKw0KKwkvL1JlY29yZCB0aGUgcmVsYXRlZCBpbmZvDQorCXByaXYtPkxhc3RSZXRyeVJhdGUgPSBDdXJyUmV0cnlSYXRlOw0KKwlwcml2LT5MYXN0VHhUaHJvdWdocHV0ID0gVHhUaHJvdWdocHV0Ow0KKwlwcml2LT5pZWVlODAyMTEtPnJhdGUgPSBwcml2LT5DdXJyZW50T3BlcmFSYXRlICogNTsNCit9DQorDQorI2VuZGlmDQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PUtFUk5FTF9WRVJTSU9OKDIsNiwyMCkNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspDQorew0KKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7DQorICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSxyYXRlX2FkYXB0ZXJfd3EpOw0KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikNCit7DQorDQorI2VuZGlmDQorICAgICAgICAvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisvLyAgICBETUVTRygiLS0tLT5ydGw4MTgwX3JhdGVfYWRhcHRlciIpOw0KKyAgICAgICAgU3RhUmF0ZUFkYXB0aXZlODdTRShkZXYpOw0KKy8vICAgRE1FU0coIjwtLS0tcnRsODE4MF9yYXRlX2FkYXB0ZXIiKTsNCit9DQordm9pZCB0aW1lcl9yYXRlX2FkYXB0aXZlKHVuc2lnbmVkIGxvbmcgZGF0YSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7DQorCS8vRE1FU0coIi0tLS0+dGltZXJfcmF0ZV9hZGFwdGl2ZSgpXG4iKTsNCisJaWYoIXByaXYtPnVwKQ0KKwl7DQorLy8JCURNRVNHKCI8LS0tLXRpbWVyX3JhdGVfYWRhcHRpdmUoKTpkcml2ZXIgaXMgbm90IHVwIVxuIik7DQorCQlyZXR1cm47DQorCX0NCisJaWYoKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUikNCisJCQkmJiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSAmJg0KKwkJCShwcml2LT5Gb3JjZWREYXRhUmF0ZSA9PSAwKSApDQorCXsNCisvLwlETUVTRygidGltZXJfcmF0ZV9hZGFwdGl2ZSgpOnNjaGVkdWxlIHJhdGVfYWRhcHRlcl93cVxuIik7DQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5yYXRlX2FkYXB0ZXJfd3EpOw0KKy8vCQlTdGFSYXRlQWRhcHRpdmU4N1NFKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOw0KKyNlbmRpZg0KKwl9DQorCXByaXYtPnJhdGVhZGFwdGVyX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MocHJpdi0+UmF0ZUFkYXB0aXZlUGVyaW9kKTsNCisJYWRkX3RpbWVyKCZwcml2LT5yYXRlYWRhcHRlcl90aW1lcik7DQorCS8vRE1FU0coIjwtLS0tdGltZXJfcmF0ZV9hZGFwdGl2ZSgpXG4iKTsNCit9DQorLy9ieSBhbXkgMDgwMzEyfQ0KK3ZvaWQNCitTd0FudGVubmFEaXZlcnNpdHlSeE9rODE4NSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgDQorCXU4IFNpZ25hbFN0cmVuZ3RoDQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisNCisvLwlwcmludGsoIitTd0FudGVubmFEaXZlcnNpdHlSeE9rODE4NTogUnhTczogJWRcbiIsIFNpZ25hbFN0cmVuZ3RoKTsNCisNCisJcHJpdi0+QWRSeE9rQ250Kys7DQorDQorCWlmKCBwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggIT0gLTEpDQorCXsNCisJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA9ICgocHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoKjcpICsgKFNpZ25hbFN0cmVuZ3RoKjMpKSAvIDEwOw0KKwl9DQorCWVsc2UNCisJeyAvLyBJbml0aWFsaXphdGlvbiBjYXNlLg0KKwkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoID0gU2lnbmFsU3RyZW5ndGg7DQorCX0NCisvL3srYnkgYW15IDA4MDMxMg0KKwlpZiggcHJpdi0+TGFzdFJ4UGt0QW50ZW5uYSApIC8vTWFpbiBhbnRlbm5hLgkNCisJCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250Kys7CQ0KKwllbHNlCSAvLyBBdXggYW50ZW5uYS4NCisJCXByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQrKzsNCisvLytieSBhbXkgMDgwMzEyDQorLy8JcHJpbnRrKCItU3dBbnRlbm5hRGl2ZXJzaXR5UnhPazgxODU6IEFkUnhPa0NudDogJWQgQWRSeFNpZ25hbFN0cmVuZ3RoOiAlZFxuIiwgcHJpdi0+QWRSeE9rQ250LCBwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgpOw0KK30NCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlDaGFuZ2UgQW50ZW5uYSBTd2l0Y2guDQorLy8NCitib29sDQorU2V0QW50ZW5uYTgxODUoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsDQorCXU4CQl1MWJBbnRlbm5hSW5kZXgNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKwlib29sIGJBbnRlbm5hU3dpdGNoZWQgPSBmYWxzZTsNCisNCisvLwlwcmludGsoIitTZXRBbnRlbm5hODE4NSgpOiBBbnRlbm5hIGlzIHN3aXRjaGluZyB0bzogJWQgXG4iLCB1MWJBbnRlbm5hSW5kZXgpOw0KKw0KKwlzd2l0Y2godTFiQW50ZW5uYUluZGV4KQ0KKwl7DQorCWNhc2UgMDoNCisJCXN3aXRjaChwcml2LT5yZl9jaGlwKQ0KKwkJew0KKwkJY2FzZSBSRl9aRUJSQTI6DQorCQljYXNlIFJGX1pFQlJBNDoNCisjaWZkZWYgQ09ORklHX1JUTDgxODVCDQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQ0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsgDQorCQkJLy9iYXNlIGJhbmQNCisJCQl3cml0ZV9waHlfY2NrKGRldiwweDExLCAweDliKTsgLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLg0KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1Yyk7IC8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuDQorDQorI2Vsc2UNCisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQ0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsgDQorCQkJLy9iYXNlIGJhbmQNCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Yik7IC8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4NCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NWMpOyAvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLg0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKwkJCWJBbnRlbm5hU3dpdGNoZWQgPSB0cnVlOw0KKwkJCWJyZWFrOw0KKw0KKwkJZGVmYXVsdDoNCisJCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtvd24gUkZDaGlwSUQoJWQpXG4iLCBwcml2LT5yZl9jaGlwKTsNCisJCQlicmVhazsNCisJCX0NCisJCWJyZWFrOw0KKw0KKwljYXNlIDE6DQorCQlzd2l0Y2gocHJpdi0+cmZfY2hpcCkNCisJCXsNCisJCWNhc2UgUkZfWkVCUkEyOg0KKwkJY2FzZSBSRl9aRUJSQTQ6DQorI2lmZGVmIENPTkZJR19SVEw4MTg1Qg0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorCQkJLy8gTWFjIHJlZ2lzdGVyLCBhdXggYW50ZW5uYQ0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsgDQorCQkJLy9iYXNlIGJhbmQNCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHhiYik7IC8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4NCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NTQpOyAvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLg0KKyNlbHNlDQorCQkJLy8gTWFjIHJlZ2lzdGVyLCBhdXggYW50ZW5uYQ0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsgDQorCQkJLy9iYXNlIGJhbmQNCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHhiYik7IC8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4NCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NTQpOyAvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLg0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKwkJCWJBbnRlbm5hU3dpdGNoZWQgPSB0cnVlOw0KKwkJCWJyZWFrOw0KKw0KKwkJZGVmYXVsdDoNCisJCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtvd24gUkZDaGlwSUQoJWQpXG4iLCBwcml2LT5yZl9jaGlwKTsNCisJCQlicmVhazsNCisJCX0NCisJCWJyZWFrOw0KKw0KKwlkZWZhdWx0Og0KKwkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rb3duIHUxYkFudGVubmFJbmRleCglZClcbiIsIHUxYkFudGVubmFJbmRleCk7DQorCQlicmVhazsNCisJfQ0KKw0KKwlpZihiQW50ZW5uYVN3aXRjaGVkKQ0KKwl7DQorCQlwcml2LT5DdXJyQW50ZW5uYUluZGV4ID0gdTFiQW50ZW5uYUluZGV4Ow0KKwl9DQorDQorLy8JcHJpbnRrKCItU2V0QW50ZW5uYTgxODUoKTogcmV0dXJuICglI1gpXG4iLCBiQW50ZW5uYVN3aXRjaGVkKTsNCisNCisJcmV0dXJuIGJBbnRlbm5hU3dpdGNoZWQ7DQorfQ0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVRvZ2dsZSBBbnRlbm5hIHN3aXRjaC4NCisvLw0KK2Jvb2wNCitTd2l0Y2hBbnRlbm5hKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisNCisJYm9vbAkJYlJlc3VsdDsNCisNCisJaWYocHJpdi0+Q3VyckFudGVubmFJbmRleCA9PSAwKQ0KKwl7DQorI2lmIDAvL2x6bSBkZWwgMDgwODI2DQorLy9ieSBhbXkgMDgwMzEyDQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisJCWlmKHByaXYtPmJTd0FudGVubmFEaXZlcml0eSkNCisJCQliUmVzdWx0ID0gU2V0QW50ZW5uYUNvbmZpZzg3U0UoZGV2LCAxLCB0cnVlKTsNCisJCWVsc2UJCQkNCisjZW5kaWYNCisjZW5kaWYNCisJCQliUmVzdWx0ID0gU2V0QW50ZW5uYTgxODUoZGV2LCAxKTsNCisvL2J5IGFteSAwODAzMTINCisvLwkJcHJpbnRrKCJTd2l0Y2hBbnRlbm5hKCk6IHN3aXRjaGluZyB0byBhbnRlbm5hIDEgLi4uLi4uXG4iKTsNCisvLwkJYlJlc3VsdCA9IFNldEFudGVubmE4MTg1KGRldiwgMSk7Ly8tYnkgYW15IDA4MDMxMg0KKwl9DQorCWVsc2UNCisJew0KKyNpZiAwLy9sem0gZGVsIDA4MDgyNg0KKy8vYnkgYW15IDA4MDMxMg0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorCQlpZihwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkpDQorCQkJYlJlc3VsdCA9IFNldEFudGVubmFDb25maWc4N1NFKGRldiwgMCwgdHJ1ZSk7DQorCQllbHNlCQ0KKyNlbmRpZg0KKyNlbmRpZg0KKwkJCWJSZXN1bHQgPSBTZXRBbnRlbm5hODE4NShkZXYsIDApOw0KKy8vYnkgYW15IDA4MDMxMg0KKy8vCQlwcmludGsoIlN3aXRjaEFudGVubmEoKTogc3dpdGNoaW5nIHRvIGFudGVubmEgMCAuLi4uLi5cbiIpOw0KKy8vCQliUmVzdWx0ID0gU2V0QW50ZW5uYTgxODUoZGV2LCAwKTsvLy1ieSBhbXkgMDgwMzEyDQorCX0NCisNCisJcmV0dXJuIGJSZXN1bHQ7DQorfQ0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCUVuZ2luZSBvZiBTVyBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20uDQorLy8JCVNpbmNlIDgxODcgaGFzIG5vIFR4IHBhcnQgaW5mb3JtYXRpb24sIA0KKy8vCQl0aGlzIGltcGxlbWVudGF0aW9uIGlzIG9ubHkgZGVwZW5kZW5kIG9uIFJ4IHBhcnQgaW5mb3JtYXRpb24uIA0KKy8vDQorLy8JMjAwNi4wNC4xNywgYnkgcmNuamtvLg0KKy8vDQordm9pZA0KK1N3QW50ZW5uYURpdmVyc2l0eSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorCWJvb2wgICBiU3dDaGVja1NTPWZhbHNlOw0KKy8vCXByaW50aygiK1N3QW50ZW5uYURpdmVyc2l0eSgpOiBDdXJyQW50ZW5uYUluZGV4OiAlZFxuIiwgcHJpdi0+Q3VyckFudGVubmFJbmRleCk7DQorLy8JcHJpbnRrKCJBZFRpY2tDb3VudCBpcyAlZFxuIixwcml2LT5BZFRpY2tDb3VudCk7DQorLy9ieSBhbXkgMDgwMzEyDQorCWlmKGJTd0NoZWNrU1MpDQorCXsNCisJCXByaXYtPkFkVGlja0NvdW50Kys7DQorCQ0KKwkJcHJpbnRrKCIoMSkgQWRUaWNrQ291bnQ6ICVkLCBBZENoZWNrUGVyaW9kOiAlZFxuIiwgDQorCQkJcHJpdi0+QWRUaWNrQ291bnQsIHByaXYtPkFkQ2hlY2tQZXJpb2QpOw0KKwkJcHJpbnRrKCIoMikgQWRSeFNpZ25hbFN0cmVuZ3RoOiAlbGQsIEFkUnhTc1RocmVzaG9sZDogJWxkXG4iLCANCisJCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgsIHByaXYtPkFkUnhTc1RocmVzaG9sZCk7DQorCX0NCisvLwlwcml2LT5BZFRpY2tDb3VudCsrOy8vLWJ5IGFteSAwODAzMTINCisJDQorCS8vIENhc2UgMS4gTm8gTGluay4NCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQ0KKwl7DQorCS8vCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IENhc2UgMS4gTm8gTGluay5cbiIpOw0KKw0KKwkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOw0KKwkJLy8gSSBzd2l0Y2ggYW50ZW5uYSBoZXJlIHRvIHByZXZlbnQgYW55IG9uZSBvZiBhbnRlbm5hIGlzIGJyb2tlbiBiZWZvcmUgbGluayBlc3RhYmxpc2hlZCwgMjAwNi4wNC4xOCwgYnkgcmNuamtvLi4NCisJCVN3aXRjaEFudGVubmEoZGV2KTsNCisJfQ0KKwkvLyBDYXNlIDIuIExpbmtlZCBidXQgbm8gcGFja2V0IHJlY2VpdmVkLg0KKwllbHNlIGlmKHByaXYtPkFkUnhPa0NudCA9PSAwKQ0KKwl7DQorCS8vCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IENhc2UgMi4gTGlua2VkIGJ1dCBubyBwYWNrZXQgcmVjZWl2ZWQuXG4iKTsNCisNCisJCXByaXYtPmJBZFN3aXRjaGVkQ2hlY2tpbmcgPSBmYWxzZTsNCisJCVN3aXRjaEFudGVubmEoZGV2KTsNCisJfQ0KKwkvLyBDYXNlIDMuIEV2YWx1YXRlIGxhc3QgYW50ZW5uYSBzd2l0Y2ggYWN0aW9uIGFuZCB1bmRvIGl0IGlmIG5lY2Vzc2FyeS4NCisJZWxzZSBpZihwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID09IHRydWUpDQorCXsNCisJLy8JcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogQ2FzZSAzLiBFdmFsdWF0ZSBsYXN0IGFudGVubmEgc3dpdGNoIGFjdGlvbi5cbiIpOw0KKw0KKwkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOw0KKw0KKwkJLy8gQWRqdXN0IFJ4IHNpZ25hbCBzdHJlbmd0aCB0aHJlYXNob2xkLg0KKwkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCArIHByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkKSAvIDI7DQorDQorCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAocHJpdi0+QWRSeFNzVGhyZXNob2xkID4gcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkKSA/CQ0KKwkJCQkJcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkOiBwcml2LT5BZFJ4U3NUaHJlc2hvbGQ7DQorCQlpZihwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggPCBwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCkNCisJCXsgLy8gUnggc2lnbmFsIHN0cmVuZ3RoIGlzIG5vdCBpbXByb3ZlZCBhZnRlciB3ZSBzd3RpY2hlZCBhbnRlbm5hLiA9PiBTd2ljaCBiYWNrLg0KKy8vCQkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogUnggU2lnbmFsIFN0cmVuZ3RoIGlzIG5vdCBpbXByb3ZlZCwgQ3VyclJ4U3M6ICVkLCBMYXN0UnhTczogJWRcbiIsIA0KKy8vCQkJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCwgcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQpOw0KKy8vYnkgYW15IDA4MDMxMg0KKwkJCS8vIEluY3JlYXNlIEFudGVubmEgRGl2ZXJzaXR5IGNoZWNraW5nIHBlcmlvZCBkdWUgdG8gYmFkIGRlY2lzaW9uLg0KKwkJCXByaXYtPkFkQ2hlY2tQZXJpb2QgKj0gMjsNCisvL2J5IGFteSAwODAzMTINCisJCQkvLyBJbmNyZWFzZSBBbnRlbm5hIERpdmVyc2l0eSBjaGVja2luZyBwZXJpb2QuDQorCQkJaWYocHJpdi0+QWRDaGVja1BlcmlvZCA+IHByaXYtPkFkTWF4Q2hlY2tQZXJpb2QpDQorCQkJCXByaXYtPkFkQ2hlY2tQZXJpb2QgPSBwcml2LT5BZE1heENoZWNrUGVyaW9kOw0KKwkNCisJCQkvLyBXcm9uZyBkZWNlaXNpb24gPT4gc3dpdGNoIGJhY2suDQorCQkJU3dpdGNoQW50ZW5uYShkZXYpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJeyAvLyBSeCBTaWduYWwgU3RyZW5ndGggaXMgaW1wcm92ZWQuIA0KKy8vCQkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogUnggU2lnbmFsIFN0cmVuZ3RoIGlzIGltcHJvdmVkLCBDdXJyUnhTczogJWQsIExhc3RSeFNzOiAlZFxuIiwgDQorLy8JCQkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoLCBwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCk7DQorDQorCQkJLy8gUmVzZXQgQW50ZW5uYSBEaXZlcnNpdHkgY2hlY2tpbmcgcGVyaW9kIHRvIGl0cyBtaW4gdmFsdWUuDQorCQkJcHJpdi0+QWRDaGVja1BlcmlvZCA9IHByaXYtPkFkTWluQ2hlY2tQZXJpb2Q7DQorCQl9DQorDQorLy8JCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IEFkUnhTc1RocmVzaG9sZDogJWQsIEFkQ2hlY2tQZXJpb2Q6ICVkXG4iLA0KKy8vCQkJcHJpdi0+QWRSeFNzVGhyZXNob2xkLCBwcml2LT5BZENoZWNrUGVyaW9kKTsNCisJfQ0KKwkvLyBDYXNlIDQuIEV2YWx1YXRlIGlmIHdlIHNoYWxsIHN3aXRjaCBhbnRlbm5hIG5vdy4NCisJLy8gQ2F1c2UgVGFibGUgU3BlZWQgaXMgdmVyeSBmYXN0IGluIFRSQyBEZWxsIExhYiwgd2UgY2hlY2sgaXQgZXZlcnkgdGltZS4gDQorCWVsc2UvLyBpZihwcml2LT5BZFRpY2tDb3VudCA+PSBwcml2LT5BZENoZWNrUGVyaW9kKS8vLWJ5IGFteSAwODAzMTINCisJew0KKy8vCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBDYXNlIDQuIEV2YWx1YXRlIGlmIHdlIHNoYWxsIHN3aXRjaCBhbnRlbm5hIG5vdy5cbiIpOw0KKw0KKwkJcHJpdi0+QWRUaWNrQ291bnQgPSAwOw0KKw0KKwkJLy8NCisJCS8vIDxSb2dlcl9Ob3Rlcz4gV2UgZXZhbHVhdGUgUnhPayBjb3VudHMgZm9yIGVhY2ggYW50ZW5uYSBmaXJzdCBhbmQgdGhhbiANCisJCS8vIGV2YWx1YXRlIHNpZ25hbCBzdHJlbmd0aC4gDQorCQkvLyBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbiBjYW4gb3ZlcmNvbWUgdGhlIGRpc2FiaWxpdHkgb2YgQ0NBIG9uIGJvdGggdHdvIGFudGVubmFzDQorCQkvLyBXaGVuIHNpZ25hbCBzdHJlbmd0aCB3YXMgZXh0cmVtZWx5IGxvdyBvciBoaWdoLg0KKwkJLy8gMjAwOC4wMS4zMC4NCisJCS8vIA0KKwkJDQorCQkvLw0KKwkJLy8gRXZhbHVhdGUgUnhPayBjb3VudCBmcm9tIGVhY2ggYW50ZW5uYSBpZiB3ZSBzaGFsbCBzd2l0Y2ggZGVmYXVsdCBhbnRlbm5hIG5vdy4NCisJCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAyLjIxLg0KKy8ve2J5IGFteSAwODAzMTINCisJCWlmKChwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCA8IHByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQpIA0KKwkJCSYmIChwcml2LT5DdXJyQW50ZW5uYUluZGV4ID09IDApKQ0KKwkJeyAvLyBXZSBzZXQgTWFpbiBhbnRlbm5hIGFzIGRlZmF1bHQgYnV0IFJ4T2sgY291bnQgd2FzIGxlc3MgdGhhbiBBdXggb25lcy4NCisNCisJLy8JCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IE1haW4gYW50ZW5uYSBSeE9LIGlzIHBvb3IsIEFkTWFpbkFudGVubmFSeE9rQ250OiAlZCwgQWRBdXhBbnRlbm5hUnhPa0NudDogJWRcbiIsIA0KKwkvLwkJCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250LCBwcml2LT5BZEF1eEFudGVubmFSeE9rQ250KTsNCisJCQkNCisJCQkvLyBTd2l0Y2ggdG8gQXV4IGFudGVubmEuDQorCQkJU3dpdGNoQW50ZW5uYShkZXYpOwkNCisJCQlwcml2LT5iSFdBZFN3aXRjaGVkID0gdHJ1ZTsNCisJCX0NCisJCWVsc2UgaWYoKHByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQgPCBwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCkgDQorCQkJJiYgKHByaXYtPkN1cnJBbnRlbm5hSW5kZXggPT0gMSkpDQorCQl7IC8vIFdlIHNldCBBdXggYW50ZW5uYSBhcyBkZWZhdWx0IGJ1dCBSeE9rIGNvdW50IHdhcyBsZXNzIHRoYW4gTWFpbiBvbmVzLg0KKw0KKwkvLwkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogQXV4IGFudGVubmEgUnhPSyBpcyBwb29yLCBBZE1haW5BbnRlbm5hUnhPa0NudDogJWQsIEFkQXV4QW50ZW5uYVJ4T2tDbnQ6ICVkXG4iLCANCisJLy8JCQlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCwgcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCk7DQorCQkJDQorCQkJLy8gU3dpdGNoIHRvIE1haW4gYW50ZW5uYS4NCisJCQlTd2l0Y2hBbnRlbm5hKGRldik7DQorCQkJcHJpdi0+YkhXQWRTd2l0Y2hlZCA9IHRydWU7DQorCQl9DQorCQllbHNlDQorCQl7Ly8gRGVmYXVsdCBhbnRlbm5hIGlzIGJldHRlci4NCisNCisJLy8JCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IERlZmF1bHQgYW50ZW5uYSBpcyBiZXR0ZXIuLCBBZE1haW5BbnRlbm5hUnhPa0NudDogJWQsIEFkQXV4QW50ZW5uYVJ4T2tDbnQ6ICVkXG4iLCANCisJLy8JCQlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCwgcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCk7DQorDQorCQkJLy8gU3RpbGwgbmVlZCB0byBjaGVjayBjdXJyZW50IHNpZ25hbCBzdHJlbmd0aC4NCisJCQlwcml2LT5iSFdBZFN3aXRjaGVkID0gZmFsc2U7CQ0KKwkJfQ0KKwkJLy8NCisJCS8vIDxSb2dlcl9Ob3Rlcz4gV2UgZXZhbHVhdGUgUnggc2lnbmFsIHN0cmVuZ3RoIE9OTFkgd2hlbiBkZWZhdWx0IGFudGVubmEgDQorCQkvLyBkaWRuJ3QgY2hhbmdlZCBieSBIVyBldmFsdWF0aW9uLiANCisJCS8vIDIwMDguMDIuMjcuDQorCQkvLw0KKwkJLy8gW1RSQyBEZWxsIExhYl0gU2lnbmFsU3RyZW5ndGggaXMgaW5hY2N1cmFjeS4gSXNhaWFoIDIwMDgtMDMtMDUgDQorCQkvLyBGb3IgZXhhbXBsZSwgVGhyb3VnaHB1dCBvZiBhdXggaXMgYmV0dGVyIHRoYW4gbWFpbiBhbnRlbm5hKGFib3V0IDEwTSB2LnMgMk0pLCANCisJCS8vIGJ1dCBBZFJ4U2lnbmFsU3RyZW5ndGggaXMgbGVzcyB0aGFuIG1haW4uIA0KKwkJLy8gT3VyIGd1ZXNzIGlzIHRoYXQgbWFpbiBhbnRlbm5hIGhhdmUgbG93ZXIgdGhyb3VnaHB1dCBhbmQgZ2V0IG1hbnkgY2hhbmdlIA0KKwkJLy8gdG8gcmVjZWl2ZSBtb3JlIENDSyBwYWNrZXRzKGV4LkJlYWNvbikgd2hpY2ggaGF2ZSBzdHJvbmdlciBTaWduYWxTdHJlbmd0aC4NCisJCS8vDQorCQlpZiggKCFwcml2LT5iSFdBZFN3aXRjaGVkKSAmJiAoYlN3Q2hlY2tTUykpDQorCQl7DQorLy9ieSBhbXkgMDgwMzEyfQ0KKwkJLy8gRXZhbHVhdGUgUnggc2lnbmFsIHN0cmVuZ3RoIGlmIHdlIHNoYWxsIHN3aXRjaCBhbnRlbm5hIG5vdy4NCisJCWlmKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA8IHByaXYtPkFkUnhTc1RocmVzaG9sZCkNCisJCXsgLy8gUnggc2lnbmFsIHN0cmVuZ3RoIGlzIHdlYWsgPT4gU3dpdGNoIEFudGVubmEuDQorLy8JCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBSeCBTaWduYWwgU3RyZW5ndGggaXMgd2VhaywgQ3VyclJ4U3M6ICVkLCBSeFNzVGhyZXNob2xkOiAlZFxuIiwgDQorLy8JCQkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoLCBwcml2LT5BZFJ4U3NUaHJlc2hvbGQpOwkNCisNCisJCQlwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCA9IHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aDsgDQorCQkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IHRydWU7DQorDQorCQkJU3dpdGNoQW50ZW5uYShkZXYpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJeyAvLyBSeCBzaWduYWwgc3RyZW5ndGggaXMgT0suIA0KKy8vCQkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogUnggU2lnbmFsIFN0cmVuZ3RoIGlzIE9LLCBDdXJyUnhTczogJWQsIFJ4U3NUaHJlc2hvbGQ6ICVkXG4iLCANCisvLwkJCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgsIHByaXYtPkFkUnhTc1RocmVzaG9sZCk7DQorDQorCQkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOw0KKwkJCS8vIEluY3JlYXNlIFJ4IHNpZ25hbCBzdHJlbmd0aCB0aHJlYXNob2xkIGlmIG5lY2Vzc2FyeS4NCisJCQlpZigJKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA+IChwcml2LT5BZFJ4U3NUaHJlc2hvbGQgKyAxMCkpICYmIC8vIFNpZ25hbCBpcyBtdWNoIHN0cm9uZ2VyIHRoYW4gY3VycmVudCB0aHJlc2hvbGQNCisJCQkJcHJpdi0+QWRSeFNzVGhyZXNob2xkIDw9IHByaXYtPkFkTWF4UnhTc1RocmVzaG9sZCkgLy8gQ3VycmVudCB0aHJlaG9sZCBpcyBub3QgeWV0IHJlYWNoIHVwcGVyIGxpbWl0Lg0KKwkJCXsNCisJCQkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTc1RocmVzaG9sZCArIHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCkgLyAyOw0KKwkJCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAocHJpdi0+QWRSeFNzVGhyZXNob2xkID4gcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkKSA/DQorCQkJCQkJCQkJCQkJcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkOiBwcml2LT5BZFJ4U3NUaHJlc2hvbGQ7Ly8rYnkgYW15IDA4MDMxMg0KKwkJCX0NCisNCisJCQkvLyBSZWR1Y2UgQW50ZW5uYSBEaXZlcnNpdHkgY2hlY2tpbmcgcGVyaW9kIGlmIHBvc3NpYmxlLiANCisJCQlpZiggcHJpdi0+QWRDaGVja1BlcmlvZCA+IHByaXYtPkFkTWluQ2hlY2tQZXJpb2QgKQ0KKwkJCXsNCisJCQkJcHJpdi0+QWRDaGVja1BlcmlvZCAvPSAyOyANCisJCQl9DQorCQl9DQorCQl9DQorCX0NCisvL2J5IGFteSAwODAzMTINCisJLy8gUmVzZXQgYW50ZW5uYSBkaXZlcnNpdHkgUnggcmVsYXRlZCBzdGF0aXN0aWNzLg0KKwlwcml2LT5BZFJ4T2tDbnQgPSAwOw0KKwlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCA9IDA7DQorCXByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQgPSAwOw0KKy8vYnkgYW15IDA4MDMxMg0KKw0KKy8vCXByaXYtPkFkUnhPa0NudCA9IDA7Ly8tYnkgYW15IDA4MDMxMg0KKw0KKy8vCXByaW50aygiLVN3QW50ZW5uYURpdmVyc2l0eSgpXG4iKTsNCit9DQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJUmV0dXJuIFRSVUUgaWYgd2Ugc2hhbGwgcGVyZm9ybSBUeCBQb3dlciBUcmFja2luZyBNZWNhaG5pc20sIEZBTFNFIG90aGVyd2lzZS4JDQorLy8NCitib29sDQorQ2hlY2tUeFB3clRyYWNraW5nKAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKw0KKwlpZighcHJpdi0+YlR4UG93ZXJUcmFjaykNCisJew0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorLy9sem0gcmVzZXJ2ZWQgMDgwODI2DQorCS8vaWYocHJpdi0+YlNjYW5JblByb2dyZXNzKQ0KKwkvL3sNCisJLy8JcmV0dXJuIGZhbHNlOw0KKwkvL30NCisNCisJLy9pZiA4N1NFIGlzIGluIEhpZ2ggUG93ZXIgLCBkb24ndCBkbyBUeCBQb3dlciBUcmFja2luZy4gYXNrZWQgYnkgU0QzIEVELiAyMDA4LTA4LTA4IElzYWlhaCANCisJaWYocHJpdi0+YlRvVXBkYXRlVHhQd3IpDQorCXsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKwkJDQorCXJldHVybiB0cnVlOw0KK30NCisNCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlUaW1lciBjYWxsYmFjayBmdW5jdGlvbiBvZiBTVyBBbnRlbm5hIERpdmVyc2l0eS4NCisvLw0KK3ZvaWQNCitTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsNCisJDQorCS8vcHJpbnRrKCIrU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjaygpXG4iKTsNCisNCisJLy8NCisJLy8gV2UgZG8gTk9UIG5lZWQgdG8gc3dpdGNoIGFudGVubmEgd2hpbGUgUkYgaXMgb2ZmLg0KKwkvLyAyMDA3LjA1LjA5LCBhZGRlZCBieSBSb2dlci4NCisJLy8NCisJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7DQorCWRvew0KKwkJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKQ0KKwkJewkNCisvLwkJCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgLSBSRiBpcyBPRkYuXG4iKTsNCisJCQlicmVhazsNCisJCX0gIAkNCisJCWVsc2UgaWYgKHJ0U3RhdGUgPT0gZVJmU2xlZXApDQorCQl7CQ0KKwkJCS8vIERvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBEaXNhYmxlIFBMTCBzaXR1YXRpb24uDQorCQkJLy9SVF9UUkFDRSgoQ09NUF9SRnxDT01QX0FOVEVOTkEpLCBEQkdfTE9VRCwgKCJTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKCk6IFJGIGlzIFNsZWVwID0+IHNraXAgaXRcbiIpKTsNCisJCQlicmVhazsNCisJCX0gIA0KKwkJU3dBbnRlbm5hRGl2ZXJzaXR5KGRldik7DQorDQorCX13aGlsZShmYWxzZSk7DQorDQorCWlmKHByaXYtPnVwKQ0KKwl7DQorCQlwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKEFOVEVOTkFfRElWRVJTSVRZX1RJTUVSX1BFUklPRCk7DQorCQlhZGRfdGltZXIoJnByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyKTsNCisJfQ0KKw0KKwkvL3ByaW50aygiLVN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soKVxuIik7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU5MmYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgUjgxODBfRE1fSCANCisjZGVmaW5lIFI4MTgwX0RNX0gNCisNCisjaW5jbHVkZSAicjgxODAuaCINCisvLyNpbmNsdWRlICJyODE4MF9ody5oIg0KKy8vI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiDQordm9pZCBTd0FudGVubmFEaXZlcnNpdHlSeE9rODE4NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBTaWduYWxTdHJlbmd0aCk7DQorYm9vbCBTZXRBbnRlbm5hODE4NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAl1OCB1MWJBbnRlbm5hSW5kZXgpOw0KK2Jvb2wgU3dpdGNoQW50ZW5uYSgJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQordm9pZCBTd0FudGVubmFEaXZlcnNpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldgkpOw0KK3ZvaWQgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCitib29sIENoZWNrRGlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KK2Jvb2wgQ2hlY2tIaWdoUG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkNCit2b2lkIHJ0bDgxODBfaHdfZGlnX3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOw0KKyNlbHNlDQordm9pZCBydGw4MTgwX2h3X2RpZ193cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisjZW5kaWYNCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQ0KK3ZvaWQgcnRsODE4MF90eF9wd193cSAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF90eF9wd193cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisjZW5kaWYNCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49S0VSTkVMX1ZFUlNJT04oMiw2LDIwKQ0KK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICogd29yayk7DQorDQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KKw0KKyNlbmRpZg0KK3ZvaWQgVHhQd3JUcmFja2luZzg3U0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorYm9vbCBDaGVja1R4UHdyVHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PUtFUk5FTF9WRVJTSU9OKDIsNiwyMCkNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspOw0KKyNlbHNlDQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisjZW5kaWYNCit2b2lkIHRpbWVyX3JhdGVfYWRhcHRpdmUodW5zaWduZWQgbG9uZyBkYXRhKTsNCisNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9nY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNiNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9nY3QuYwpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAgIFRoaXMgZmlsZXMgY29udGFpbnMgR0NUIHJhZGlvIGZyb250ZW5kIHByb2dyYW1taW5nIHJvdXRpbmVzLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlcgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBDb2RlIGZyb20gUnR3ODE4MCBOZXRCU0QgZHJpdmVyIGJ5IERhdmlkIFlvdW5nIGhhcyBiZWVuIHJlYWxseSB1c2VmdWwgdG8KKyAgIHVuZGVyc3RhbmQgc29tZSB0aGluZ3MgYW5kIGdldHMgc29tZSBpZGVhcworCisgICBDb2RlIGZyb20gcnRsODE4MSBwcm9qZWN0IGhhcyBiZWVuIHVzZWZ1bCB0byBtZSB0byB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzLgorCisgICBTb21lIGNvZGUgZnJvbSAnRGV1Y2UnIHdvcmsKKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKworI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9nY3QuaCIKKworCisvLyNkZWZpbmUgREVCVUdfR0NUCisKKy8qIHRoZSBmb2xsb3dpbmcgZXhwZXJpbWVudCBhcmUganVzdCBleHBlcmltZW50cy4KKyAqIHRoaXMgbWVhbnMgaWYgeW91IGVuYWJsZSB0aGVtIHlvdSBjYW4gaGF2ZSBldmVyeSBraW5kCisgKiBvZiByZXN1bHQsIGluY2x1ZGVkIGRhbWFnZSB0aGUgUkYgY2hpcCwgc28gZG9uJ3QKKyAqIHRvdWNoIHRoZW0gaWYgeW91IGRvbid0IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorICogSW4gYW55IGNhc2UsIGlmIHlvdSBkbyBpdCwgZG8gYXQgeW91ciBvd24gcmlzaworICovCisKKy8vI2RlZmluZSBHQ1RfRVhQRVJJTUVOVDEgIC8vaW1wcm92ZSBSWCBzZW5zaXZpdHkKKworLy8jZGVmaW5lIEdDVF9FWFBFUklNRU5UMgorCisvLyNkZWZpbmUgR0NUX0VYUEVSSU1FTlQzICAvL2lwcm92ZSBhIGJpdCBSWCBzaWduYWwgcXVhbGl0eSA/CisKKy8vI2RlZmluZSBHQ1RfRVhQRVJJTUVOVDQgLy9tYXliZSBzb2x2ZSBzb21lIGJyb2tlbmVzcyB3aXRoIGV4cGVyaW1lbnQxID8KKworLy8jZGVmaW5lIEdDVF9FWFBFUklNRU5UNQorCisvLyNkZWZpbmUgR0NUX0VYUEVSSU1FTlQ2ICAvL25vdCBnb29kCisKKwordTMyIGdjdF9jaGFuW10gPSB7CisJMHgwLAkvL2R1bW15IGNoYW5uZWwgMAorCTB4MCwgLy8xCisJMHgxLCAvLzIKKwkweDIsIC8vMworCTB4MywgLy80CisJMHg0LCAvLzUKKwkweDUsIC8vNgorCTB4NiwgLy83CisJMHg3LCAvLzgKKwkweDgsIC8vOQorCTB4OSwgLy8xMAorCTB4YSwgLy8xMQorCTB4YiwgLy8xMgorCTB4YywgLy8xMworCTB4ZCwgLy8xNAorfTsKKworaW50IGdjdF9lbmNvZGVbMTZdID0geworCTAsIDgsIDQsIDB4QywKKwkyLCAweEEsIDYsIDB4RSwKKwkxLCA5LCA1LCAweEQsCisJMywgMHhCLCA3LCAweEYKK307CisKK3ZvaWQgZ2N0X3JmX3N0YWJpbGl6ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDMpOyAvL2ZvciBub3cgdXNlIGEgZ3JlYXQgdmFsdWUuLiB3ZSBtYXkgb3B0aW1pemUgaW4gZnV0dXJlCit9CisKKwordm9pZCB3cml0ZV9nY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKK3sKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgcGh5X2NvbmZpZzsKKworCXBoeV9jb25maWcgPSAgZ2N0X2VuY29kZVsoZGF0YSAmIDB4ZjAwKSA+PiA4XTsKKwlwaHlfY29uZmlnIHw9IGdjdF9lbmNvZGVbKGRhdGEgJiAweGYwKSA+PiA0IF0gPDwgNDsKKwlwaHlfY29uZmlnIHw9IGdjdF9lbmNvZGVbKGRhdGEgJiAweGYpICAgICAgIF0gPDwgODsKKwlwaHlfY29uZmlnIHw9IGdjdF9lbmNvZGVbKGFkciA+PiAxKSAmIDB4ZiAgIF0gPDwgMTI7CisJcGh5X2NvbmZpZyB8PSAgICAgICAgICAgIChhZHIgJiAxICkgICAgICAgICAgIDw8IDE2OworCXBoeV9jb25maWcgfD0gZ2N0X2VuY29kZVsoZGF0YSAmIDB4ZjAwMCk+PjEyXSA8PCAyNDsKKworCXBoeV9jb25maWcgfD0gMHg5MDAwMDAwMDsgLy8gTUFDIHdpbGwgYmFuZyBiaXRzIHRvIHRoZSBjaGlwCisKKworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxwaHlfY29uZmlnKTsKKyNpZmRlZiBERUJVR19HQ1QKKwlETUVTRygiV3JpdGluZyBHQ1Q6ICV4IChhZHIgJXgpIixwaHlfY29uZmlnLGFkcik7CisjZW5kaWYKKwlnY3RfcmZfc3RhYmlsaXplKGRldik7Cit9CisKKworCit2b2lkIGdjdF93cml0ZV9waHlfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBhbnQ7CisKKwlhbnQgPSBHQ1RfQU5URU5OQTsKKwlpZihwcml2LT5hbnRiKSAvKmRlZmF1bHQgYW50ZW5uYSBpcyBhbnRlbm5hIEIgKi8KKwkJYW50IHw9IEJCX0FOVEVOTkFfQjsKKwlpZihjaCA9PSAxNCkKKwkJYW50IHw9IEJCX0FOVEFUVEVOX0NIQU4xNDsKKwl3cml0ZV9waHkoZGV2LDB4MTAsYW50KTsKKwkvL0RNRVNHKCJCQiBhbnRlbm5hICV4ICIsYW50KTsKK30KKworCit2b2lkIGdjdF9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHR4cHcgPSAweGZmICYgcHJpdi0+Y2h0eHB3cltjaF07CisJdTMyIGNoYW4gPSBnY3RfY2hhbltjaF07CisKKwkvL3dyaXRlX3BoeShkZXYsMyx0eHB3KTsKKyNpZmRlZiBERUJVR19HQ1QKKwlETUVTRygiR2N0IHNldCBjaGFubmVsIik7CisjZW5kaWYKKwkvKiBzZXQgVFggcG93ZXIgKi8KKwl3cml0ZV9nY3QoZGV2LDB4MTUsMCk7CisgCXdyaXRlX2djdChkZXYsNiwgdHhwdyk7CisJd3JpdGVfZ2N0KGRldiwweDE1LCAweDEwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMCk7CisKKwkvKnNldCBmcmVxdWVuY3kqLworCXdyaXRlX2djdChkZXYsNywgMCk7CisgICAgICAJd3JpdGVfZ2N0KGRldiwweEIsIGNoYW4pOworICAgICAgCXdyaXRlX2djdChkZXYsNywgMHgxMDAwKTsKKworI2lmZGVmIERFQlVHX0dDVAorCURNRVNHKCJHY3Qgc2V0IGNoYW5uZWwgPiB3cml0ZSBwaHkgYW50ZW5uYSIpOworI2VuZGlmCisKKworCWdjdF93cml0ZV9waHlfYW50ZW5uYShkZXYsY2gpOworCit9CisKKwordm9pZCBnY3RfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgYW5hcGFyYW07CisKKwlhbmFwYXJhbSA9IHJlYWRfbmljX2R3b3JkKGRldixBTkFQQVJBTSk7CisJYW5hcGFyYW0gJj0gMHgwMDBmZmZmZjsKKwlhbmFwYXJhbSB8PSAweDNmOTAwMDAwOworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgYW5hcGFyYW0pOworCisJd3JpdGVfZ2N0KGRldiwgMHg3LCAwKTsKKwl3cml0ZV9nY3QoZGV2LCAweDFmLCAweDQ1KTsKKwl3cml0ZV9nY3QoZGV2LCAweDFmLCAweDUpOworCXdyaXRlX2djdChkZXYsIDB4MCwgMHg4ZTQpOworfQorCisKK3ZvaWQgZ2N0X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy91MzIgYW5hcGFyYW07CisKKworCXdyaXRlX25pY19ieXRlKGRldixQSFlfREVMQVksMHg2KTsJLy90aGlzIGlzIGdlbmVyYWwKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ0FSUklFUl9TRU5TRV9DT1VOVEVSLDB4NGMpOyAvL3RoaXMgaXMgZ2VuZXJhbAorCisJLy9ETUVTRygiJXgiLCByZWFkX25pY19kd29yZChkZXYsQU5BUEFSQU0pKTsKKwkvKiB3ZSBzaG91bGQgc2V0IGFuYXBhcm0gaGVyZSovCisJLy9ydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsYW5hcGFyYW0pOworCisJd3JpdGVfZ2N0KGRldiwweDFmLDApOworCXdyaXRlX2djdChkZXYsMHgxZiwwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg0MCk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDB4NjApOworCXdyaXRlX2djdChkZXYsMHgxZiwweDYxKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg2MSk7CisJd3JpdGVfZ2N0KGRldiwweDAsMHhhZTQpOworCXdyaXRlX2djdChkZXYsMHgxZiwweDEpOworCXdyaXRlX2djdChkZXYsMHgxZiwweDQxKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg2MSk7CisJd3JpdGVfZ2N0KGRldiwweDEsMHgxYTIzKTsKKwl3cml0ZV9nY3QoZGV2LDB4MiwweDQ5NzEpOworCXdyaXRlX2djdChkZXYsMHgzLDB4NDFkZSk7CisJd3JpdGVfZ2N0KGRldiwweDQsMHgyZDgwKTsKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDEKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjgxMCk7ICAvLyBmcm9tIHp5ZGFzIGRyaXZlci4gc2VucysgYnV0IHF1aXRlIHNsb3cKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjgxZik7ICAvL2dvb2QrIChzb21ld2hhdCBzdGFibGUsIGJldHRlciBzZW5zLCBwZXJmb3JtYW5jZSBkZWNlbnQpCisJd3JpdGVfZ2N0KGRldiwweDUsMHg2ODVmKTsgIC8vZ29vZCBwZXJmb3JtYW5jZXMsIG5vdCBzdXJlIHNlbnMgaXMgcmVhbGx5IHNvIGJlZXRlcgorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2ODdmKTsgIC8vZ29vZCBwZXJmb3JtYW5jZXMsIG1heWJlIHNlbnMgaXMgbm90IGltcHJvdmVkCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4OWYpOyAgLy9saWtlIGFib3ZlCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4NWUpOyAgLy9iYWQKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjhmZik7ICAvL2dvb2QrIChzb21ld2hhdCBzdGFibGUsIGJldHRlciBzZW5zKD8pLCBwZXJmb3JtYW5jZSBkZWNlbnQpCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4ZjApOyAgLy9iYWQKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NmNmZik7ICAvL3NlbnMrIGJ1dCBub3Qgc28gZ29vZAorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2ZGZmKTsgIC8vc2VucyssYXBwYXJlbnRlbHkgdmVyeSBnb29kIGJ1dCBicm9rZW4KKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjVmZik7ICAvL3NlbnMrLGdvb2QKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NzhmZik7ICAvL3NlbnMgKyBidXQgYWxtb3N0IGJyb2tlbgorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg3ODEwKTsgIC8vLSAvL3NuZXMgKyBidXQgYnJva2VuCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDc4MWYpOyAgLy8tLSAvL3NlbnMgKworCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg3OGYwKTsgIC8vbG93IHNlbnMKKyNlbHNlCisJd3JpdGVfZ2N0KGRldiwweDUsMHg2MWZmKTsgICAvL2Jlc3QgcGVyZm9ybWFuY2UgYnV0IHdlYWsgc2Vuc2l0aXZpdHkKKyNlbmRpZgorI2lmZGVmIEdDVF9FWFBFUklNRU5UMgorCXdyaXRlX2djdChkZXYsMHg2LDB4ZSk7CisjZWxzZQorCXdyaXRlX2djdChkZXYsMHg2LDB4MCk7CisjZW5kaWYKKwl3cml0ZV9nY3QoZGV2LDB4NywweDApOworCXdyaXRlX2djdChkZXYsMHg4LDB4NzUzMyk7CisJd3JpdGVfZ2N0KGRldiwweDksMHhjNDAxKTsKKwl3cml0ZV9nY3QoZGV2LDB4YSwweDApOworCXdyaXRlX2djdChkZXYsMHhjLDB4MWM3KTsKKwl3cml0ZV9nY3QoZGV2LDB4ZCwweDI5ZDMpOworCXdyaXRlX2djdChkZXYsMHhlLDB4MmU4KTsKKwl3cml0ZV9nY3QoZGV2LDB4MTAsMHgxOTIpOworI2lmZGVmIEdDVF9FWFBFUklNRU5UMworCXdyaXRlX2djdChkZXYsMHgxMSwweDI0Nik7CisjZWxzZQorCXdyaXRlX2djdChkZXYsMHgxMSwweDI0OCk7CisjZW5kaWYKKwl3cml0ZV9nY3QoZGV2LDB4MTIsMHgwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MTMsMHgyMGM0KTsKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDQKKwl3cml0ZV9nY3QoZGV2LDB4MTQsMHhmNDg4KTsKKyNlbHNlCisJd3JpdGVfZ2N0KGRldiwweDE0LDB4ZjRmYyk7CisjZW5kaWYKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDUKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMHhiMTUyKTsKKyNlbHNlCisJd3JpdGVfZ2N0KGRldiwweDE1LDB4MCk7CisjZW5kaWYKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDYKKwl3cml0ZV9nY3QoZGV2LDB4MWUsMHgxKTsKKyNlbmRpZgorCXdyaXRlX2djdChkZXYsMHgxNiwweDE1MDApOworCisJd3JpdGVfZ2N0KGRldiwweDcsMHgxMDAwKTsKKwkvKndyaXRlX2djdChkZXYsMHgxNSwweDApOworCXdyaXRlX2djdChkZXYsMHg2LDB4MTUpOworCXdyaXRlX2djdChkZXYsMHgxNSwweDgpOworCXdyaXRlX2djdChkZXYsMHgxNSwweDApOworKi8KKwl3cml0ZV9waHkoZGV2LDAsMHhhOCk7CisKKy8qCXdyaXRlX2djdChkZXYsMHgxNSwweDApOworCXdyaXRlX2djdChkZXYsMHg2LDB4MTIpOworCXdyaXRlX2djdChkZXYsMHgxNSwweDgpOworCXdyaXRlX2djdChkZXYsMHgxNSwweDApOworKi8KKwl3cml0ZV9waHkoZGV2LDMsMHgwKTsKKwl3cml0ZV9waHkoZGV2LDQsMHhjMCk7IC8qIGxuYSBkZXQqLworCXdyaXRlX3BoeShkZXYsNSwweDkwKTsKKwl3cml0ZV9waHkoZGV2LDYsMHgxZSk7CisJd3JpdGVfcGh5KGRldiw3LDB4NjQpOworCisjaWZkZWYgREVCVUdfR0NUCisJRE1FU0coIkdjdCBpbml0PiB3cml0ZSBwaHkgYW50ZW5uYSIpOworI2VuZGlmCisKKwlnY3Rfd3JpdGVfcGh5X2FudGVubmEoZGV2LHByaXYtPmNoYW4pOworCisJd3JpdGVfcGh5KGRldiwweDExLDB4ODgpOworCWlmKCFwcml2LT5kaXZlcnNpdHkpCisJCXdyaXRlX3BoeShkZXYsMHgxMiwweGMwKTsKKwllbHNlCisJCXdyaXRlX3BoeShkZXYsMHgxMiwweDQwKTsKKworCXdyaXRlX3BoeShkZXYsMHgxMywweDkwIHwgcHJpdi0+Y3NfdHJlc2hvbGQgKTsKKworCXdyaXRlX3BoeShkZXYsMHgxOSwweDApOworCXdyaXRlX3BoeShkZXYsMHgxYSwweGEwKTsKKwl3cml0ZV9waHkoZGV2LDB4MWIsMHg0NCk7CisKKyNpZmRlZiBERUJVR19HQ1QKKwlETUVTRygiR2N0IGluaXQgPiBzZXQgY2hhbm5lbDIiKTsKKyNlbmRpZgorCisJZ2N0X3JmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZ2N0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTY1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMjAKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworI2RlZmluZSBHQ1RfQU5URU5OQSAweEEzCisKKworLy8gd2UgdXNlIHRoZSB1bnRvdWNoZWQgZWVwcm9tIHZhbHVlLSBjcm9zcyB5b3VyIGZpbmdlciA7LSkKKyNkZWZpbmUgR0NUX0FOQVBBUkFNX1BXUjFfT04gPz8KKyNkZWZpbmUgR0NUX0FOQVBBUkFNX1BXUjBfT04gPz8KKworCisKK3ZvaWQgZ2N0X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGdjdF9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKwordm9pZCBnY3RfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzODkzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfaHcuaApAQCAtMCwwICsxLDk1NiBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorCW9mZmljaWFsIFJlYWx0ZWsgZHJpdmVyLgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKwlmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MKKwkyMTAwIEdQTCBkcml2ZXIuCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzCisJYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKiBNYXJpdXN6IE1hdHVzemVrIGFkZGVkIGZ1bGwgcmVnaXN0ZXJzIGRlZmluaXRpb24gd2l0aCBSZWFsdGVrJ3MgbmFtZSAqLworCisvKiB0aGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBydGw4MTgwIE1BQyBjb250cm9sbGVyICovCisjaWZuZGVmIFI4MTgwX0hXCisjZGVmaW5lIFI4MTgwX0hXCisKKyNkZWZpbmUgQ09ORklHX1JUTDgxODVCICAvL3N1cHBvcnQgZm9yIHJ0bDgxODVCLCB4aW9uZy0yMDA2LTExLTE1CisjZGVmaW5lIENPTkZJR19SVEw4MThYX1MKKworI2RlZmluZSBCSVQwCTB4MDAwMDAwMDEKKyNkZWZpbmUgQklUMQkweDAwMDAwMDAyCisjZGVmaW5lIEJJVDIJMHgwMDAwMDAwNAorI2RlZmluZSBCSVQzCTB4MDAwMDAwMDgKKyNkZWZpbmUgQklUNAkweDAwMDAwMDEwCisjZGVmaW5lIEJJVDUJMHgwMDAwMDAyMAorI2RlZmluZSBCSVQ2CTB4MDAwMDAwNDAKKyNkZWZpbmUgQklUNwkweDAwMDAwMDgwCisjZGVmaW5lIEJJVDgJMHgwMDAwMDEwMAorI2RlZmluZSBCSVQ5CTB4MDAwMDAyMDAKKyNkZWZpbmUgQklUMTAJMHgwMDAwMDQwMAorI2RlZmluZSBCSVQxMQkweDAwMDAwODAwCisjZGVmaW5lIEJJVDEyCTB4MDAwMDEwMDAKKyNkZWZpbmUgQklUMTMJMHgwMDAwMjAwMAorI2RlZmluZSBCSVQxNAkweDAwMDA0MDAwCisjZGVmaW5lIEJJVDE1CTB4MDAwMDgwMDAKKyNkZWZpbmUgQklUMTYJMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNwkweDAwMDIwMDAwCisjZGVmaW5lIEJJVDE4CTB4MDAwNDAwMDAKKyNkZWZpbmUgQklUMTkJMHgwMDA4MDAwMAorI2RlZmluZSBCSVQyMAkweDAwMTAwMDAwCisjZGVmaW5lIEJJVDIxCTB4MDAyMDAwMDAKKyNkZWZpbmUgQklUMjIJMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMwkweDAwODAwMDAwCisjZGVmaW5lIEJJVDI0CTB4MDEwMDAwMDAKKyNkZWZpbmUgQklUMjUJMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNgkweDA0MDAwMDAwCisjZGVmaW5lIEJJVDI3CTB4MDgwMDAwMDAKKyNkZWZpbmUgQklUMjgJMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyOQkweDIwMDAwMDAwCisjZGVmaW5lIEJJVDMwCTB4NDAwMDAwMDAKKyNkZWZpbmUgQklUMzEJMHg4MDAwMDAwMAorCisjZGVmaW5lIE1BWF9TTEVFUF9USU1FICgxMDAwMCkKKyNkZWZpbmUgTUlOX1NMRUVQX1RJTUUgKDUwKQorCisjZGVmaW5lIEJCX0FOVEFUVEVOX0NIQU4xNAkweDBjCisjZGVmaW5lIEJCX0FOVEVOTkFfQiAweDQwCisKKyNkZWZpbmUgQkJfSE9TVF9CQU5HICgxPDwzMCkKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX0VOICgxPDwyKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfQ0xLICgxPDwxKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfREFUQQkgMQorCisjZGVmaW5lIEFOQVBBUkFNX1RYREFDT0ZGX1NISUZUIDI3CisjZGVmaW5lIEFOQVBBUkFNX1BXUjBfTUFTSyAoKDE8PDMwKXwoMTw8MjkpfCgxPDwyOCkpCisjZGVmaW5lIEFOQVBBUkFNX1BXUjBfU0hJRlQgMjgKKyNkZWZpbmUgQU5BUEFSQU1fUFdSMV9NQVNLICgoMTw8MjYpfCgxPDwyNSl8KDE8PDI0KXwoMTw8MjMpfCgxPDwyMil8KDE8PDIxKXwoMTw8MjApKQorI2RlZmluZSBBTkFQQVJBTV9QV1IxX1NISUZUIDIwCisKKyNkZWZpbmUgTUFDMCAwCisjZGVmaW5lIE1BQzEgMQorI2RlZmluZSBNQUMyIDIKKyNkZWZpbmUgTUFDMyAzCisjZGVmaW5lIE1BQzQgNAorI2RlZmluZSBNQUM1IDUKKyNkZWZpbmUgQ01EIDB4MzcKKyNkZWZpbmUgQ01EX1JTVF9TSElGVCA0CisjZGVmaW5lIENNRF9SRVNFUlZFRF9NQVNLICgoMTw8MSkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NykpCisjZGVmaW5lIENNRF9SWF9FTkFCTEVfU0hJRlQgMworI2RlZmluZSBDTURfVFhfRU5BQkxFX1NISUZUIDIKKworI2RlZmluZSBFUFJPTV9DTUQgMHg1MAorI2RlZmluZSBFUFJPTV9DTURfUkVTRVJWRURfTUFTSyAoKDE8PDUpfCgxPDw0KSkKKyNkZWZpbmUgRVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUIDYKKyNkZWZpbmUgRVBST01fQ01EX09QRVJBVElOR19NT0RFX01BU0sgKCgxPDw3KXwoMTw8NikpCisjZGVmaW5lIEVQUk9NX0NNRF9DT05GSUcgMHgzCisjZGVmaW5lIEVQUk9NX0NNRF9OT1JNQUwgMAorI2RlZmluZSBFUFJPTV9DTURfTE9BRCAxCisjZGVmaW5lIEVQUk9NX0NNRF9QUk9HUkFNIDIKKyNkZWZpbmUgRVBST01fQ1NfU0hJRlQgMworI2RlZmluZSBFUFJPTV9DS19TSElGVCAyCisjZGVmaW5lIEVQUk9NX1dfU0hJRlQgMQorI2RlZmluZSBFUFJPTV9SX1NISUZUIDAKKyNkZWZpbmUgQ09ORklHMl9ETUFfUE9MTElOR19NT0RFX1NISUZUIDMKKyNkZWZpbmUgSU5UQSAweDNlCisjZGVmaW5lIElOVEFfVFhPVkVSRkxPVyAoMTw8MTUpCisjZGVmaW5lIElOVEFfVElNRU9VVCAoMTw8MTQpCisjZGVmaW5lIElOVEFfQkVBQ09OVElNRU9VVCAoMTw8MTMpCisjZGVmaW5lIElOVEFfQVRJTSAoMTw8MTIpCisjZGVmaW5lIElOVEFfQkVBQ09OREVTQ0VSUiAoMTw8MTEpCisjZGVmaW5lIElOVEFfQkVBQ09OREVTQ09LICgxPDwxMCkKKyNkZWZpbmUgSU5UQV9ISVBSSU9SSVRZREVTQ0VSUiAoMTw8OSkKKyNkZWZpbmUgSU5UQV9ISVBSSU9SSVRZREVTQ09LICgxPDw4KQorI2RlZmluZSBJTlRBX05PUk1QUklPUklUWURFU0NFUlIgKDE8PDcpCisjZGVmaW5lIElOVEFfTk9STVBSSU9SSVRZREVTQ09LICgxPDw2KQorI2RlZmluZSBJTlRBX1JYT1ZFUkZMT1cgKDE8PDUpCisjZGVmaW5lIElOVEFfUlhERVNDRVJSICgxPDw0KQorI2RlZmluZSBJTlRBX0xPV1BSSU9SSVRZREVTQ0VSUiAoMTw8MykKKyNkZWZpbmUgSU5UQV9MT1dQUklPUklUWURFU0NPSyAoMTw8MikKKyNkZWZpbmUgSU5UQV9SWENSQ0VSUiAoMTw8MSkKKyNkZWZpbmUgSU5UQV9SWE9LICgxKQorI2RlZmluZSBJTlRBX01BU0sgMHgzYworI2RlZmluZSBSWFJJTkdfQUREUiAweGU0IC8vIHBhZ2UgMAorI2RlZmluZSBQR1NFTEVDVCAweDVlCisjZGVmaW5lIFBHU0VMRUNUX1BHX1NISUZUIDAKKyNkZWZpbmUgUlhfQ09ORiAweDQ0CisjZGVmaW5lIE1BQ19GSUxURVJfTUFTSyAoKDE8PDApIHwgKDE8PDEpIHwgKDE8PDIpIHwgKDE8PDMpIHwgKDE8PDUpIHwgXAorKDE8PDEyKSB8ICgxPDwxOCkgfCAoMTw8MTkpIHwgKDE8PDIwKSB8ICgxPDwyMSkgfCAoMTw8MjIpIHwgKDE8PDIzKSkKKyNkZWZpbmUgUlhfQ0hFQ0tfQlNTSURfU0hJRlQgMjMKKyNkZWZpbmUgQUNDRVBUX1BXUl9GUkFNRV9TSElGVCAyMgorI2RlZmluZSBBQ0NFUFRfTU5HX0ZSQU1FX1NISUZUIDIwCisjZGVmaW5lIEFDQ0VQVF9DVExfRlJBTUVfU0hJRlQgMTkKKyNkZWZpbmUgQUNDRVBUX0RBVEFfRlJBTUVfU0hJRlQgMTgKKyNkZWZpbmUgQUNDRVBUX0lDVkVSUl9GUkFNRV9TSElGVCAxMgorI2RlZmluZSBBQ0NFUFRfQ1JDRVJSX0ZSQU1FX1NISUZUIDUKKyNkZWZpbmUgQUNDRVBUX0JDQVNUX0ZSQU1FX1NISUZUIDMKKyNkZWZpbmUgQUNDRVBUX01DQVNUX0ZSQU1FX1NISUZUIDIKKyNkZWZpbmUgQUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCAwCisjZGVmaW5lIEFDQ0VQVF9OSUNNQUNfRlJBTUVfU0hJRlQgMQorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9NQVNLICgoMTw8MTMpIHwgKDE8PDE0KSB8ICgxPDwxNSkpCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUIDEzCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzEyOCAzCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzI1NiA0CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzUxMiA1CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzEwMjQgNgorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9OT05FIDcKKyNkZWZpbmUgUlhfQVVUT1JFU0VUUEhZX1NISUZUIDI4CisjZGVmaW5lIEVQUk9NX1RZUEVfU0hJRlQgNgorI2RlZmluZSBUWF9DT05GIDB4NDAKKyNkZWZpbmUgVFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUIDMwCisjZGVmaW5lIFRYX0xPT1BCQUNLX1NISUZUIDE3CisjZGVmaW5lIFRYX0xPT1BCQUNLX01BQyAxCisjZGVmaW5lIFRYX0xPT1BCQUNLX0JBU0VCQU5EIDIKKyNkZWZpbmUgVFhfTE9PUEJBQ0tfTk9ORSAwCisjZGVmaW5lIFRYX0xPT1BCQUNLX0NPTlRJTlVFIDMKKyNkZWZpbmUgVFhfTE9PUEJBQ0tfTUFTSyAoKDE8PDE3KXwoMTw8MTgpKQorI2RlZmluZSBUWF9EUFJFVFJZX1NISUZUIDAKKyNkZWZpbmUgUjgxODBfTUFYX1JFVFJZIDI1NQorI2RlZmluZSBUWF9SVFNSRVRSWV9TSElGVCA4CisjZGVmaW5lIFRYX05PSUNWX1NISUZUIDE5CisjZGVmaW5lIFRYX05PQ1JDX1NISUZUIDE2CisjZGVmaW5lIFRYX0RNQV9QT0xMSU5HIDB4ZDkKKyNkZWZpbmUgVFhfRE1BX1BPTExJTkdfQkVBQ09OX1NISUZUIDcKKyNkZWZpbmUgVFhfRE1BX1BPTExJTkdfSElQUklPUklUWV9TSElGVCA2CisjZGVmaW5lIFRYX0RNQV9QT0xMSU5HX05PUk1QUklPUklUWV9TSElGVCA1CisjZGVmaW5lIFRYX0RNQV9QT0xMSU5HX0xPV1BSSU9SSVRZX1NISUZUIDQKKyNkZWZpbmUgVFhfRE1BX1NUT1BfQkVBQ09OX1NISUZUIDMKKyNkZWZpbmUgVFhfRE1BX1NUT1BfSElQUklPUklUWV9TSElGVCAyCisjZGVmaW5lIFRYX0RNQV9TVE9QX05PUk1QUklPUklUWV9TSElGVCAxCisjZGVmaW5lIFRYX0RNQV9TVE9QX0xPV1BSSU9SSVRZX1NISUZUIDAKKyNkZWZpbmUgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSIDB4MEMKKyNkZWZpbmUgVFhfQktQUklPUklUWV9SSU5HX0FERFIgMHgxMAorI2RlZmluZSBUWF9CRVBSSU9SSVRZX1JJTkdfQUREUiAweDE0CisjZGVmaW5lIFRYX1ZJUFJJT1JJVFlfUklOR19BRERSIDB4MjAKKyNkZWZpbmUgVFhfVk9QUklPUklUWV9SSU5HX0FERFIgMHgyNAorI2RlZmluZSBUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSIDB4MjgKKy8vQUNfVkkgYW5kIExvdyBwcmlvcml0eSBzaGFyZSB0aGUgc2FuZSBxdWV1ZQorI2RlZmluZSBUWF9MT1dQUklPUklUWV9SSU5HX0FERFIgVFhfVklQUklPUklUWV9SSU5HX0FERFIKKy8vQUNfVk8gYW5kIE5vcm0gcHJpb3JpdHkgc2hhcmUgdGhlIHNhbWUgcXVldWUKKyNkZWZpbmUgVFhfTk9STVBSSU9SSVRZX1JJTkdfQUREUiBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUgorCisjZGVmaW5lIE1BWF9SWF9ETUFfTUFTSyAoKDE8PDgpIHwgKDE8PDkpIHwgKDE8PDEwKSkKKyNkZWZpbmUgTUFYX1JYX0RNQV8yMDQ4IDcKKyNkZWZpbmUgTUFYX1JYX0RNQV8xMDI0CTYKKyNkZWZpbmUgTUFYX1JYX0RNQV9TSElGVCAxMAorI2RlZmluZSBJTlRfVElNRU9VVCAweDQ4CisjZGVmaW5lIENPTkZJRzNfQ0xLUlVOX1NISUZUIDIKKyNkZWZpbmUgQ09ORklHM19BTkFQQVJBTV9XX1NISUZUIDYKKyNkZWZpbmUgQU5BUEFSQU0gMHg1NAorI2RlZmluZSBCRUFDT05fSU5URVJWQUwgMHg3MAorI2RlZmluZSBCRUFDT05fSU5URVJWQUxfTUFTSyAoKDE8PDApfCgxPDwxKXwoMTw8Mil8KDE8PDMpfCgxPDw0KXwoMTw8NSl8IFwKKygxPDw2KXwoMTw8Nyl8KDE8PDgpfCgxPDw5KSkKKyNkZWZpbmUgQVRJTV9NQVNLICgoMTw8MCl8KDE8PDEpfCgxPDwyKXwoMTw8Myl8KDE8PDQpfCgxPDw1KXwoMTw8Nil8KDE8PDcpfCBcCisoMTw8OCl8KDE8PDkpKQorI2RlZmluZSBBVElNIDB4NzIKKyNkZWZpbmUgRVBST01fQ1NfU0hJRlQgMworI2RlZmluZSBFUFJPTV9DS19TSElGVCAyCisjZGVmaW5lIFBIWV9ERUxBWSAweDc4CisjZGVmaW5lIFBIWV9DT05GSUcgMHg4MAorI2RlZmluZSBQSFlfQURSIDB4N2MKKyNkZWZpbmUgUEhZX1JFQUQgMHg3ZQorI2RlZmluZSBDQVJSSUVSX1NFTlNFX0NPVU5URVIgMHg3OSAvL2J5dGUKKyNkZWZpbmUgU0VDVVJJVFkgMHg1ZiAvLzEyMDkgdGhpcyBpcyBzdGggd3JvbmcKKyNkZWZpbmUgU0VDVVJJVFlfV0VQX1RYX0VOQUJMRV9TSElGVCAxCisjZGVmaW5lIFNFQ1VSSVRZX1dFUF9SWF9FTkFCTEVfU0hJRlQgMAorI2RlZmluZSBTRUNVUklUWV9FTkNSWVBfMTA0IDEKKyNkZWZpbmUgU0VDVVJJVFlfRU5DUllQX1NISUZUIDQKKyNkZWZpbmUgU0VDVVJJVFlfRU5DUllQX01BU0sgKCgxPDw0KXwoMTw8NSkpCisjZGVmaW5lIEtFWTAgMHg5MCAgLy8xMjA5IHRoaXMgaXMgc3RoIHdyb25nCisjZGVmaW5lIENPTkZJRzJfQU5URU5OQV9TSElGVCA2CisjZGVmaW5lIFRYX0JFQUNPTl9SSU5HX0FERFIgMHg0YworI2RlZmluZSBDT05GSUcwX1dFUDQwX1NISUZUIDcKKyNkZWZpbmUgQ09ORklHMF9XRVAxMDRfU0hJRlQgNgorI2RlZmluZSBBR0NSRVNFVF9TSElGVCA1CisKKworCisvKgorICogT3BlcmF0aW9uYWwgcmVnaXN0ZXJzIG9mZnNldHMgaW4gUENJIChJL08pIHNwYWNlLgorICogUmVhbFRlayBuYW1lcyBhcmUgdXNlZC4KKyAqLworCisjZGVmaW5lIElEUjAgMHgwMDAwCisjZGVmaW5lIElEUjEgMHgwMDAxCisjZGVmaW5lIElEUjIgMHgwMDAyCisjZGVmaW5lIElEUjMgMHgwMDAzCisjZGVmaW5lIElEUjQgMHgwMDA0CisjZGVmaW5lIElEUjUgMHgwMDA1CisKKy8qIDB4MDAwNiAtIDB4MDAwNyAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgTUFSMCAweDAwMDgKKyNkZWZpbmUgTUFSMSAweDAwMDkKKyNkZWZpbmUgTUFSMiAweDAwMEEKKyNkZWZpbmUgTUFSMyAweDAwMEIKKyNkZWZpbmUgTUFSNCAweDAwMEMKKyNkZWZpbmUgTUFSNSAweDAwMEQKKyNkZWZpbmUgTUFSNiAweDAwMEUKKyNkZWZpbmUgTUFSNyAweDAwMEYKKworLyogMHgwMDEwIC0gMHgwMDE3IC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBUU0ZUUiAweDAwMTgKKyNkZWZpbmUgVFNGVFJfRU5EIDB4MDAxRgorCisjZGVmaW5lIFRMUERBIDB4MDAyMAorI2RlZmluZSBUTFBEQV9FTkQgMHgwMDIzCisjZGVmaW5lIFROUERBIDB4MDAyNAorI2RlZmluZSBUTlBEQV9FTkQgMHgwMDI3CisjZGVmaW5lIFRIUERBIDB4MDAyOAorI2RlZmluZSBUSFBEQV9FTkQgMHgwMDJCCisKKyNkZWZpbmUgQlNTSUQgMHgwMDJFCisjZGVmaW5lIEJTU0lEX0VORCAweDAwMzMKKworI2RlZmluZSBDUiAweDAwMzcKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2RlZmluZSBSRl9TV19DT05GSUcJICAgICAgICAweDgJCQkvLyBzdG9yZSBkYXRhIHdoaWNoIGlzIHRyYW5zbWl0dGVkIHRvIFJGIGZvciBkcml2ZXIKKyNkZWZpbmUgUkZfU1dfQ0ZHX1NJCQlCSVQxCisjZGVmaW5lIFBJRlMJCQkweDJDCQkJLy8gUENGIEludGVyRnJhbWUgU3BhY2luZyBUaW1lciBTZXR0aW5nLgorI2RlZmluZSBFSUZTCQkJMHgyRAkJCS8vIEV4dGVuZGVkIEludGVyRnJhbWUgU3BhY2UgVGltZXIsIGluIHVuaXQgb2YgNCB1cy4KKworI2RlZmluZSBCUlNSCQkJMHgzNAkJCS8vIEJhc2ljIHJhdGUgc2V0CisKKyNkZWZpbmUgSU1SIDB4MDA2QworI2RlZmluZSBJU1IgMHgwMDNDCisjZWxzZQorI2RlZmluZSBCUlNSIDB4MDAyQworI2RlZmluZSBCUlNSX0VORCAweDAwMkQKKworLyogMHgwMDM0IC0gMHgwMDM0IC0gcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRUlGUyAweDAwMzUKKworI2RlZmluZSBJTVIgMHgwMDNDCisjZGVmaW5lIElNUl9FTkQgMHgwMDNECisjZGVmaW5lIElTUiAweDAwM0UKKyNkZWZpbmUgSVNSX0VORCAweDAwM0YKKyNlbmRpZgorCisjZGVmaW5lIFRDUiAweDAwNDAKKyNkZWZpbmUgVENSX0VORCAweDAwNDMKKworI2RlZmluZSBSQ1IgMHgwMDQ0CisjZGVmaW5lIFJDUl9FTkQgMHgwMDQ3CisKKyNkZWZpbmUgVGltZXJJbnQgMHgwMDQ4CisjZGVmaW5lIFRpbWVySW50X0VORCAweDAwNEIKKworI2RlZmluZSBUQkRBIDB4MDA0QworI2RlZmluZSBUQkRBX0VORCAweDAwNEYKKworI2RlZmluZSBDUjkzNDYgMHgwMDUwCisKKyNkZWZpbmUgQ09ORklHMCAweDAwNTEKKyNkZWZpbmUgQ09ORklHMSAweDAwNTIKKyNkZWZpbmUgQ09ORklHMiAweDAwNTMKKworI2RlZmluZSBBTkFfUEFSTSAweDAwNTQKKyNkZWZpbmUgQU5BX1BBUk1fRU5EIDB4MHgwMDU3CisKKyNkZWZpbmUgTVNSIDB4MDA1OAorCisjZGVmaW5lIENPTkZJRzMgMHgwMDU5CisjZGVmaW5lIENPTkZJRzQgMHgwMDVBCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vIFNEMyBzenV5aXRhc2k6IE1hYzB4NTc9IENDIC0+IEIwIE1hYzB4NjA9IEQxIC0+IEM2CisJLy8gTWFjMHg2MCA9IDB4MDAwMDA0QzYgcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzCisJI2RlZmluZSBBTkFQQVJNX0FTSUNfT04gICAgMHhCMDA1NEQwMAorCSNkZWZpbmUgQU5BUEFSTTJfQVNJQ19PTiAgMHgwMDAwMDRDNgorCisJI2RlZmluZSBBTkFQQVJNX09OIEFOQVBBUk1fQVNJQ19PTgorCSNkZWZpbmUgQU5BUEFSTTJfT04gQU5BUEFSTTJfQVNJQ19PTgorI2Vsc2UKKwkvLyBTRDMgQ01MaW46CisJI2RlZmluZSBBTkFQQVJNX0FTSUNfT04gICAgMHg0NTA5MDY1OAorCSNkZWZpbmUgQU5BUEFSTTJfQVNJQ19PTiAgMHg3MjdmM2Y1MgorCisJI2RlZmluZSBBTkFQQVJNX09OIEFOQVBBUk1fQVNJQ19PTgorCSNkZWZpbmUgQU5BUEFSTTJfT04gQU5BUEFSTTJfQVNJQ19PTgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBURVNUUiAweDAwNUIKKworLyogMHgwMDVDIC0gMHgwMDVEIC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBQU1IgMHgwMDVFCisKKy8qIDB4MDA2MCAtIDB4MDA2RiAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgQmNuSXR2IDB4MDA3MAorI2RlZmluZSBCY25JdHZfRU5EIDB4MDA3MQorCisjZGVmaW5lIEF0aW1XbmQgMHgwMDcyCisjZGVmaW5lIEF0aW1XbmRfRU5EIDB4MDA3MworCisjZGVmaW5lIEJpbnRySXR2IDB4MDA3NAorI2RlZmluZSBCaW50ckl0dl9FTkQgMHgwMDc1CisKKyNkZWZpbmUgQXRpbXRySXR2IDB4MDA3NgorI2RlZmluZSBBdGltdHJJdHZfRU5EIDB4MDA3NworCisjZGVmaW5lIFBoeURlbGF5IDB4MDA3OAorCisjZGVmaW5lIENSQ291bnQgMHgwMDc5CisKKy8qIDB4MDA3QSAtIDB4MDA3QiAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgUGh5QWRkciAweDAwN0MKKyNkZWZpbmUgUGh5RGF0YVcgMHgwMDdECisjZGVmaW5lIFBoeURhdGFSIDB4MDA3RQorCisjZGVmaW5lIFBoeUNGRyAweDAwODAKKyNkZWZpbmUgUGh5Q0ZHX0VORCAweDAwODMKKworLyogZm9sbG93aW5nIGFyZSBmb3IgcnRsODE4NSAqLworI2RlZmluZSBSRlBpbnNPdXRwdXQgMHg4MAorI2RlZmluZSBSRlBpbnNFbmFibGUgMHg4MgorI2RlZmluZSBSRl9USU1JTkcgMHg4YworI2RlZmluZSBSRlBpbnNTZWxlY3QgMHg4NAorI2RlZmluZSBBTkFQQVJBTTIgMHg2MAorI2RlZmluZSBSRl9QQVJBIDB4ODgKKyNkZWZpbmUgUkZQaW5zSW5wdXQgMHg4NgorI2RlZmluZSBHUF9FTkFCTEUgMHg5MAorI2RlZmluZSBHUElPIDB4OTEKKyNkZWZpbmUgU1dfQ09OVFJPTF9HUElPIDB4NDAwCisjZGVmaW5lIFRYX0FOVEVOTkEgMHg5ZgorI2RlZmluZSBUWF9HQUlOX09GRE0gMHg5ZQorI2RlZmluZSBUWF9HQUlOX0NDSyAweDlkCisjZGVmaW5lIFdQQV9DT05GSUcgMHhiMAorI2RlZmluZSBUWF9BR0NfQ1RMIDB4OWMKKyNkZWZpbmUgVFhfQUdDX0NUTF9QRVJQQUNLRVRfR0FJTl9TSElGVCAwCisjZGVmaW5lIFRYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVCAxCisjZGVmaW5lIFRYX0FHQ19DVExfRkVFREJBQ0tfQU5UIDIKKyNkZWZpbmUgUkVTUF9SQVRFIDB4MzQKKyNkZWZpbmUgU0lGUyAweGI0CisjZGVmaW5lIERJRlMgMHhiNQorCisjZGVmaW5lIFNMT1QgMHhiNgorI2RlZmluZSBDV19DT05GIDB4YmMKKyNkZWZpbmUgQ1dfQ09ORl9QRVJQQUNLRVRfUkVUUllfU0hJRlQgMQorI2RlZmluZSBDV19DT05GX1BFUlBBQ0tFVF9DV19TSElGVCAwCisjZGVmaW5lIENXX1ZBTCAweGJkCisjZGVmaW5lIE1BWF9SRVNQX1JBVEVfU0hJRlQgNAorI2RlZmluZSBNSU5fUkVTUF9SQVRFX1NISUZUIDAKKyNkZWZpbmUgUkFURV9GQUxMQkFDSyAweGJlCisvKgorICogIDB4MDA4NCAtIDB4MDBEMyBpcyBzZWxlY3RlZCB0byBwYWdlIDEgd2hlbiBQU0VuIGJpdCAoYml0MCwgUFNSKQorICogIGlzIHNldCB0byAxCisgKi8KKworI2RlZmluZSBXYWtldXAwIDB4MDA4NAorI2RlZmluZSBXYWtldXAwX0VORCAweDAwOEIKKworI2RlZmluZSBXYWtldXAxIDB4MDA4QworI2RlZmluZSBXYWtldXAxX0VORCAweDAwOTMKKworI2RlZmluZSBXYWtldXAyTEQgMHgwMDk0CisjZGVmaW5lIFdha2V1cDJMRF9FTkQgMHgwMDlCCisjZGVmaW5lIFdha2V1cDJIRCAweDAwOUMKKyNkZWZpbmUgV2FrZXVwMkhEX0VORCAweDAwQTMKKworI2RlZmluZSBXYWtldXAzTEQgMHgwMEE0CisjZGVmaW5lIFdha2V1cDNMRF9FTkQgMHgwMEFCCisjZGVmaW5lIFdha2V1cDNIRCAweDAwQUMKKyNkZWZpbmUgV2FrZXVwM0hEX0VORCAweDAwQjMKKworI2RlZmluZSBXYWtldXA0TEQgMHgwMEI0CisjZGVmaW5lIFdha2V1cDRMRF9FTkQgMHgwMEJCCisjZGVmaW5lIFdha2V1cDRIRCAweDAwQkMKKyNkZWZpbmUgV2FrZXVwNEhEX0VORCAweDAwQzMKKworI2RlZmluZSBDUkMwIDB4MDBDNAorI2RlZmluZSBDUkMwX0VORCAweDAwQzUKKyNkZWZpbmUgQ1JDMSAweDAwQzYKKyNkZWZpbmUgQ1JDMV9FTkQgMHgwMEM3CisjZGVmaW5lIENSQzIgMHgwMEM4CisjZGVmaW5lIENSQzJfRU5EIDB4MDBDOQorI2RlZmluZSBDUkMzIDB4MDBDQQorI2RlZmluZSBDUkMzX0VORCAweDAwQ0IKKyNkZWZpbmUgQ1JDNCAweDAwQ0MKKyNkZWZpbmUgQ1JDNF9FTkQgMHgwMENECisKKy8qIDB4MDBDRSAtIDB4MDBEMyAtIHJlc2VydmVkICovCisKKworCisvKgorICogIDB4MDA4NCAtIDB4MDBEMyBpcyBzZWxlY3RlZCB0byBwYWdlIDAgd2hlbiBQU0VuIGJpdCAoYml0MCwgUFNSKQorICogIGlzIHNldCB0byAwCisgKi8KKworLyogMHgwMDg0IC0gMHgwMDhGIC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBESzAgMHgwMDkwCisjZGVmaW5lIERLMF9FTkQgMHgwMDlGCisjZGVmaW5lIERLMSAweDAwQTAKKyNkZWZpbmUgREsxX0VORCAweDAwQUYKKyNkZWZpbmUgREsyIDB4MDBCMAorI2RlZmluZSBESzJfRU5EIDB4MDBCRgorI2RlZmluZSBESzMgMHgwMEMwCisjZGVmaW5lIERLM19FTkQgMHgwMENGCisKKy8qIDB4MDBEMCAtIDB4MDBEMyAtIHJlc2VydmVkICovCisKKworCisKKworLyogMHgwMEQ0IC0gMHgwMEQ3IC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBDT05GSUc1IDB4MDBEOAorCisjZGVmaW5lIFRQUG9sbCAweDAwRDkKKworLyogMHgwMERBIC0gMHgwMERCIC0gcmVzZXJ2ZWQgKi8KKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyNkZWZpbmUgUEhZUFIJCQkweERBCQkJLy8weERBIC0gMHgwQiBQSFkgUGFyYW1ldGVyIFJlZ2lzdGVyLgorI2VuZGlmCisKKyNkZWZpbmUgQ1dSIDB4MDBEQworI2RlZmluZSBDV1JfRU5EIDB4MDBERAorCisjZGVmaW5lIFJldHJ5Q1RSIDB4MDBERQorCisvKiAweDAwREYgLSAweDAwRTMgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIFJEU0FSIDB4MDBFNAorI2RlZmluZSBSRFNBUl9FTkQgMHgwMEU3CisKKy8qIDB4MDBFOCAtIDB4MDBFRiAtIHJlc2VydmVkICovCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworI2RlZmluZSBMRURfQ09OVFJPTAkJMHhFRAorI2VuZGlmCisKKyNkZWZpbmUgRkVSIDB4MDBGMAorI2RlZmluZSBGRVJfRU5EIDB4MDBGMworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjZGVmaW5lIEZFTVIJCQkweDFENAkvLyBGdW5jdGlvbiBFdmVudCBNYXNrIHJlZ2lzdGVyCisjZWxzZQorI2RlZmluZSBGRU1SIDB4MDBGNAorI2RlZmluZSBGRU1SX0VORCAweDAwRjcKKyNlbmRpZgorCisjZGVmaW5lIEZQU1IgMHgwMEY4CisjZGVmaW5lIEZQU1JfRU5EIDB4MDBGQgorCisjZGVmaW5lIEZGRVIgMHgwMEZDCisjZGVmaW5lIEZGRVJfRU5EIDB4MDBGRgorCisKKworLyoKKyAqIEJpdG1hc2tzIGZvciBzcGVjaWZpYyByZWdpc3RlciBmdW5jdGlvbnMuCisgKiBOYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSByZWdpc3RlciBuYW1lIGFuZCBmdW5jdGlvbiBuYW1lLgorICoKKyAqIDxSRUdJU1RFUj5fPEZVTkNUSU9OPls8Yml0Pl0KKyAqCisgKiB0aGlzIGxlYWRzIHRvIHNvbWUgYXdrd2FyZCBuYW1lcy4uLgorICovCisKKyNkZWZpbmUgQlJTUl9CUExDUCAgKCgxPDwgOCkpCisjZGVmaW5lIEJSU1JfTUJSICAgICgoMTw8IDEpfCgxPDwgMCkpCisjZGVmaW5lIEJSU1JfTUJSXzgxODUgKCgxPDwgMTEpfCgxPDwgMTApfCgxPDwgOSl8KDE8PCA4KXwoMTw8IDcpfCgxPDwgNil8KDE8PCA1KXwoMTw8IDQpfCgxPDwgMyl8KDE8PCAyKXwoMTw8IDEpfCgxPDwgMCkpCisjZGVmaW5lIEJSU1JfTUJSMCAgICgoMTw8IDApKQorI2RlZmluZSBCUlNSX01CUjEgICAoKDE8PCAxKSkKKworI2RlZmluZSBDUl9SU1QgICAgICAoKDE8PCA0KSkKKyNkZWZpbmUgQ1JfUkUgICAgICAgKCgxPDwgMykpCisjZGVmaW5lIENSX1RFICAgICAgICgoMTw8IDIpKQorI2RlZmluZSBDUl9NdWxSVyAgICAoKDE8PCAwKSkKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2RlZmluZSBJTVJfRG90MTFoSW50CSgoMTw8IDI1KSkJCQkvLyA4MDIuMTFoIE1lYXN1cmVtZW50IEludGVycnVwdAorI2RlZmluZSBJTVJfQmNuRG1hSW50CSgoMTw8IDI0KSkJCQkvLyBCZWFjb24gRE1BIEludGVycnVwdCAvLyBXaGF0IGRpZmZlcmVuY3QgYmV0d2VlbiBCY25EbWFJbnQgYW5kIEJjbkludD8/PworI2RlZmluZSBJTVJfV2FrZUludAkJKCgxPDwgMjMpKQkJCS8vIFdha2UgVXAgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UWEZPVlcJCSgoMTw8IDIyKSkJCQkvLyBUeCBGSUZPIE92ZXJmbG93IEludGVycnVwdAorI2RlZmluZSBJTVJfVGltZU91dDEJKCgxPDwgMjEpKQkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAxCisjZGVmaW5lIElNUl9CY25JbnQJCSgoMTw8IDIwKSkJCQkvLyBCZWFjb24gVGltZSBvdXQgSW50ZXJydXB0CisjZGVmaW5lIElNUl9BVElNSW50CQkoKDE8PCAxOSkpCQkJLy8gQVRJTSBUaW1lIE91dCBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCREVSCQkoKDE8PCAxOCkpCQkJLy8gVHggQmVhY29uIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UQkRPSwkJKCgxPDwgMTcpKQkJCS8vIFR4IEJlYWNvbiBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfVEhQREVSCQkoKDE8PCAxNikpCQkJLy8gVHggSGlnaCBQcmlvcml0eSBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfVEhQRE9LCQkoKDE8PCAxNSkpCQkJLy8gVHggSGlnaCBQcmlvcml0eSBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfVFZPREVSCQkoKDE8PCAxNCkpCQkJLy8gVHggQUNfVk8gRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RWT0RPSwkJKCgxPDwgMTMpKQkJCS8vIFR4IEFDX1ZPIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9GT1ZXCQkoKDE8PCAxMikpCQkJLy8gUnggRklGTyBPdmVyZmxvdyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1JEVQkJCSgoMTw8IDExKSkJCQkvLyBSeCBEZXNjcmlwdG9yIFVuYXZhaWxhYmxlIEludGVycnVwdAorI2RlZmluZSBJTVJfVFZJREVSCQkoKDE8PCAxMCkpCQkJLy8gVHggQUNfVkkgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RWSURPSwkJKCgxPDwgOSkpCQkvLyBUeCBBQ19WSSBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfUkVSCQkJKCgxPDwgOCkpCQkvLyBSeCBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1JPSwkJCSgoMTw8IDcpKQkJLy8gUmVjZWl2ZSBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCRURFUgkJKCgxPDwgNikpCQkJLy8gVHggQUNfQkUgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCRURPSwkJKCgxPDwgNSkpCQkJLy8gVHggQUNfQkUgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCS0RFUgkJKCgxPDwgNCkpCQkvLyBUeCBBQ19CSyBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfVEJLRE9LCQkoKDE8PCAzKSkJCQkvLyBUeCBBQ19CSyBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfUlFvU09LCQkoKDE8PCAyKSkJCS8vIFJ4IFFvUyBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RpbWVPdXQyCSgoMTw8IDEpKQkJLy8gVGltZSBPdXQgSW50ZXJydXB0IDIKKyNkZWZpbmUgSU1SX1RpbWVPdXQzCSgoMTw8IDApKQkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAzCisjZGVmaW5lIElNUl9UTUdET0sgICAgICAoKDE8PDMwKSkKKyNkZWZpbmUgSVNSX0RvdDExaEludAkoKDE8PCAyNSkpCQkJLy8gODAyLjExaCBNZWFzdXJlbWVudCBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX0JjbkRtYUludAkoKDE8PCAyNCkpCQkJLy8gQmVhY29uIERNQSBJbnRlcnJ1cHQgLy8gV2hhdCBkaWZmZXJlbmN0IGJldHdlZW4gQmNuRG1hSW50IGFuZCBCY25JbnQ/Pz8KKyNkZWZpbmUgSVNSX1dha2VJbnQJCSgoMTw8IDIzKSkJCQkvLyBXYWtlIFVwIEludGVycnVwdAorI2RlZmluZSBJU1JfVFhGT1ZXCQkoKDE8PCAyMikpCQkJLy8gVHggRklGTyBPdmVyZmxvdyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RpbWVPdXQxCSgoMTw8IDIxKSkJCQkvLyBUaW1lIE91dCBJbnRlcnJ1cHQgMQorI2RlZmluZSBJU1JfQmNuSW50CQkoKDE8PCAyMCkpCQkJLy8gQmVhY29uIFRpbWUgb3V0IEludGVycnVwdAorI2RlZmluZSBJU1JfQVRJTUludAkJKCgxPDwgMTkpKQkJCS8vIEFUSU0gVGltZSBPdXQgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQkRFUgkJKCgxPDwgMTgpKQkJCS8vIFR4IEJlYWNvbiBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJU1JfVEJET0sJCSgoMTw8IDE3KSkJCQkvLyBUeCBCZWFjb24gRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RIUERFUgkJKCgxPDwgMTYpKQkJCS8vIFR4IEhpZ2ggUHJpb3JpdHkgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RIUERPSwkJKCgxPDwgMTUpKQkJCS8vIFR4IEhpZ2ggUHJpb3JpdHkgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RWT0RFUgkJKCgxPDwgMTQpKQkJCS8vIFR4IEFDX1ZPIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UVk9ET0sJCSgoMTw8IDEzKSkJCQkvLyBUeCBBQ19WTyBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfRk9WVwkJKCgxPDwgMTIpKQkJCS8vIFJ4IEZJRk8gT3ZlcmZsb3cgSW50ZXJydXB0CisjZGVmaW5lIElTUl9SRFUJCQkoKDE8PCAxMSkpCQkJLy8gUnggRGVzY3JpcHRvciBVbmF2YWlsYWJsZSBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RWSURFUgkJKCgxPDwgMTApKQkJCS8vIFR4IEFDX1ZJIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UVklET0sJCSgoMTw8IDkpKQkJLy8gVHggQUNfVkkgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1JFUgkJCSgoMTw8IDgpKQkJLy8gUnggRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9ST0sJCQkoKDE8PCA3KSkJCS8vIFJlY2VpdmUgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQkVERVIJCSgoMTw8IDYpKQkJCS8vIFR4IEFDX0JFIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQkVET0sJCSgoMTw8IDUpKQkJCS8vIFR4IEFDX0JFIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQktERVIJCSgoMTw8IDQpKQkJLy8gVHggQUNfQksgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RCS0RPSwkJKCgxPDwgMykpCQkJLy8gVHggQUNfQksgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1JRb1NPSwkJKCgxPDwgMikpCQkvLyBSeCBRb1MgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UaW1lT3V0MgkoKDE8PCAxKSkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAyCisjZGVmaW5lIElTUl9UaW1lT3V0MwkoKDE8PCAwKSkJCQkvLyBUaW1lIE91dCBJbnRlcnJ1cHQgMworCisvL3RoZXNlIGRlZmluaXRpb24gaXMgdXNlZCBmb3IgVHgvUnggdGVzdCB0ZW1wb3JhcmlseQorI2RlZmluZSBJU1JfVExQREVSICBJU1JfVFZJREVSCisjZGVmaW5lIElTUl9UTFBET0sgIElTUl9UVklET0sKKyNkZWZpbmUgSVNSX1ROUERFUiAgSVNSX1RWT0RFUgorI2RlZmluZSBJU1JfVE5QRE9LICBJU1JfVFZPRE9LCisjZGVmaW5lIElTUl9UaW1lT3V0IElTUl9UaW1lT3V0MQorI2RlZmluZSBJU1JfUlhGT1ZXIElTUl9GT1ZXCisKKyNlbHNlCisjZGVmaW5lIElNUl9UWEZPVlcgICgoMTw8MTUpKQorI2RlZmluZSBJTVJfVGltZU91dCAoKDE8PDE0KSkKKyNkZWZpbmUgSU1SX0JjbkludCAgKCgxPDwxMykpCisjZGVmaW5lIElNUl9BVElNSW50ICgoMTw8MTIpKQorI2RlZmluZSBJTVJfVEJERVIgICAoKDE8PDExKSkKKyNkZWZpbmUgSU1SX1RCRE9LICAgKCgxPDwxMCkpCisjZGVmaW5lIElNUl9USFBERVIgICgoMTw8IDkpKQorI2RlZmluZSBJTVJfVEhQRE9LICAoKDE8PCA4KSkKKyNkZWZpbmUgSU1SX1ROUERFUiAgKCgxPDwgNykpCisjZGVmaW5lIElNUl9UTlBET0sgICgoMTw8IDYpKQorI2RlZmluZSBJTVJfUlhGT1ZXICAoKDE8PCA1KSkKKyNkZWZpbmUgSU1SX1JEVSAgICAgKCgxPDwgNCkpCisjZGVmaW5lIElNUl9UTFBERVIgICgoMTw8IDMpKQorI2RlZmluZSBJTVJfVExQRE9LICAoKDE8PCAyKSkKKyNkZWZpbmUgSU1SX1JFUiAgICAgKCgxPDwgMSkpCisjZGVmaW5lIElNUl9ST0sgICAgICgoMTw8IDApKQorCisjZGVmaW5lIElTUl9UWEZPVlcgICgoMTw8MTUpKQorI2RlZmluZSBJU1JfVGltZU91dCAoKDE8PDE0KSkKKyNkZWZpbmUgSVNSX0JjbkludCAgKCgxPDwxMykpCisjZGVmaW5lIElTUl9BVElNSW50ICgoMTw8MTIpKQorI2RlZmluZSBJU1JfVEJERVIgICAoKDE8PDExKSkKKyNkZWZpbmUgSVNSX1RCRE9LICAgKCgxPDwxMCkpCisjZGVmaW5lIElTUl9USFBERVIgICgoMTw8IDkpKQorI2RlZmluZSBJU1JfVEhQRE9LICAoKDE8PCA4KSkKKyNkZWZpbmUgSVNSX1ROUERFUiAgKCgxPDwgNykpCisjZGVmaW5lIElTUl9UTlBET0sgICgoMTw8IDYpKQorI2RlZmluZSBJU1JfUlhGT1ZXICAoKDE8PCA1KSkKKyNkZWZpbmUgSVNSX1JEVSAgICAgKCgxPDwgNCkpCisjZGVmaW5lIElTUl9UTFBERVIgICgoMTw8IDMpKQorI2RlZmluZSBJU1JfVExQRE9LICAoKDE8PCAyKSkKKyNkZWZpbmUgSVNSX1JFUiAgICAgKCgxPDwgMSkpCisjZGVmaW5lIElTUl9ST0sgICAgICgoMTw8IDApKQorI2VuZGlmCisKKyNkZWZpbmUgSFdfVkVSSURfUjgxODBfRiAzCisjZGVmaW5lIEhXX1ZFUklEX1I4MTgwX0FCQ0QgMgorI2RlZmluZSBIV19WRVJJRF9SODE4NV9BQkMgNAorI2RlZmluZSBIV19WRVJJRF9SODE4NV9EIDUKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNkZWZpbmUgSFdfVkVSSURfUjgxODVCX0IgNgorI2VuZGlmCisKKyNkZWZpbmUgVENSX0NXTUlOICAgKCgxPDwzMSkpCisjZGVmaW5lIFRDUl9TV1NFUSAgICgoMTw8MzApKQorI2RlZmluZSBUQ1JfSFdWRVJJRF9NQVNLICgoMTw8MjcpfCgxPDwyNil8KDE8PDI1KSkKKyNkZWZpbmUgVENSX0hXVkVSSURfU0hJRlQgMjUKKyNkZWZpbmUgVENSX1NBVCAgICAgKCgxPDwyNCkpCisjZGVmaW5lIFRDUl9QTENQX0xFTiBUQ1JfU0FUIC8vIHJ0bDgxODAKKyNkZWZpbmUgVENSX01YRE1BX01BU0sgICAoKDE8PDIzKXwoMTw8MjIpfCgxPDwyMSkpCisjZGVmaW5lIFRDUl9NWERNQV8xMDI0IDYKKyNkZWZpbmUgVENSX01YRE1BXzIwNDggNworI2RlZmluZSBUQ1JfTVhETUFfU0hJRlQgIDIxCisjZGVmaW5lIFRDUl9ESVNDVyAgICgoMTw8MjApKQorI2RlZmluZSBUQ1JfSUNWICAgICAoKDE8PDE5KSkKKyNkZWZpbmUgVENSX0xCSyAgICAgKCgxPDwxOCl8KDE8PDE3KSkKKyNkZWZpbmUgVENSX0xCSzEgICAgKCgxPDwxOCkpCisjZGVmaW5lIFRDUl9MQkswICAgICgoMTw8MTcpKQorI2RlZmluZSBUQ1JfQ1JDICAgICAoKDE8PDE2KSkKKyNkZWZpbmUgVENSX0RQUkVUUllfTUFTSyAgICgoMTw8MTUpfCgxPDwxNCl8KDE8PDEzKXwoMTw8MTIpfCgxPDwxMSl8KDE8PDEwKXwoMTw8OSl8KDE8PDgpKQorI2RlZmluZSBUQ1JfUlRTUkVUUllfTUFTSyAgICgoMTw8MCl8KDE8PDEpfCgxPDwyKXwoMTw8Myl8KDE8PDQpfCgxPDw1KXwoMTw8Nil8KDE8PDcpKQorI2RlZmluZSBUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQgMjkgLy9ydGw4MTg1CisKKyNkZWZpbmUgUkNSX09OTFlFUkxQS1QgKCgxPDwzMSkpCisjZGVmaW5lIFJDUl9DU19TSElGVCAgIDI5CisjZGVmaW5lIFJDUl9DU19NQVNLICAgICgoMTw8MzApIHwgKDE8PDI5KSkKKyNkZWZpbmUgUkNSX0VOTUFSUCAgICAgKCgxPDwyOCkpCisjZGVmaW5lIFJDUl9DQlNTSUQgICAgICgoMTw8MjMpKQorI2RlZmluZSBSQ1JfQVBXUk1HVCAgICAoKDE8PDIyKSkKKyNkZWZpbmUgUkNSX0FERDMgICAgICAgKCgxPDwyMSkpCisjZGVmaW5lIFJDUl9BTUYgICAgICAgICgoMTw8MjApKQorI2RlZmluZSBSQ1JfQUNGICAgICAgICAoKDE8PDE5KSkKKyNkZWZpbmUgUkNSX0FERiAgICAgICAgKCgxPDwxOCkpCisjZGVmaW5lIFJDUl9SWEZUSCAgICAgICgoMTw8MTUpfCgxPDwxNCl8KDE8PDEzKSkKKyNkZWZpbmUgUkNSX1JYRlRIMiAgICAgKCgxPDwxNSkpCisjZGVmaW5lIFJDUl9SWEZUSDEgICAgICgoMTw8MTQpKQorI2RlZmluZSBSQ1JfUlhGVEgwICAgICAoKDE8PDEzKSkKKyNkZWZpbmUgUkNSX0FJQ1YgICAgICAgKCgxPDwxMikpCisjZGVmaW5lIFJDUl9NWERNQSAgICAgICgoMTw8MTApfCgxPDwgOSl8KDE8PCA4KSkKKyNkZWZpbmUgUkNSX01YRE1BMiAgICAgKCgxPDwxMCkpCisjZGVmaW5lIFJDUl9NWERNQTEgICAgICgoMTw8IDkpKQorI2RlZmluZSBSQ1JfTVhETUEwICAgICAoKDE8PCA4KSkKKyNkZWZpbmUgUkNSXzkzNTZTRUwgICAgKCgxPDwgNikpCisjZGVmaW5lIFJDUl9BQ1JDMzIgICAgICgoMTw8IDUpKQorI2RlZmluZSBSQ1JfQUIgICAgICAgICAoKDE8PCAzKSkKKyNkZWZpbmUgUkNSX0FNICAgICAgICAgKCgxPDwgMikpCisjZGVmaW5lIFJDUl9BUE0gICAgICAgICgoMTw8IDEpKQorI2RlZmluZSBSQ1JfQUFQICAgICAgICAoKDE8PCAwKSkKKworI2RlZmluZSBDUjkzNDZfRUVNICAgICAoKDE8PDcpfCgxPDw2KSkKKyNkZWZpbmUgQ1I5MzQ2X0VFTTEgICAgKCgxPDw3KSkKKyNkZWZpbmUgQ1I5MzQ2X0VFTTAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ1I5MzQ2X0VFQ1MgICAgKCgxPDwzKSkKKyNkZWZpbmUgQ1I5MzQ2X0VFU0sgICAgKCgxPDwyKSkKKyNkZWZpbmUgQ1I5MzQ2X0VFRDEgICAgKCgxPDwxKSkKKyNkZWZpbmUgQ1I5MzQ2X0VFRDAgICAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUcwX1dFUDEwNCAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHMF9MRURHUE9fRW4gICgoMTw8NCkpCisjZGVmaW5lIENPTkZJRzBfQXV4X1N0YXR1cyAoKDE8PDMpKQorI2RlZmluZSBDT05GSUcwX0dMICAgICAgICAgKCgxPDwxKXwoMTw8MCkpCisjZGVmaW5lIENPTkZJRzBfR0wxICAgICAgICAoKDE8PDEpKQorI2RlZmluZSBDT05GSUcwX0dMMCAgICAgICAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUcxX0xFRFMgICAgICAgKCgxPDw3KXwoMTw8NikpCisjZGVmaW5lIENPTkZJRzFfTEVEUzEgICAgICAoKDE8PDcpKQorI2RlZmluZSBDT05GSUcxX0xFRFMwICAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHMV9MV0FDVCAgICAgICgoMTw8NCkpCisjZGVmaW5lIENPTkZJRzFfTUVNTUFQICAgICAoKDE8PDMpKQorI2RlZmluZSBDT05GSUcxX0lPTUFQICAgICAgKCgxPDwyKSkKKyNkZWZpbmUgQ09ORklHMV9WUEQgICAgICAgICgoMTw8MSkpCisjZGVmaW5lIENPTkZJRzFfUE1FbiAgICAgICAoKDE8PDApKQorCisjZGVmaW5lIENPTkZJRzJfTENLICAgICAgICAoKDE8PDcpKQorI2RlZmluZSBDT05GSUcyX0FOVCAgICAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHMl9EUFMgICAgICAgICgoMTw8MykpCisjZGVmaW5lIENPTkZJRzJfUEFQRV9zaWduICAoKDE8PDIpKQorI2RlZmluZSBDT05GSUcyX1BBUEVfdGltZSAgKCgxPDwxKXwoMTw8MCkpCisjZGVmaW5lIENPTkZJRzJfUEFQRV90aW1lMSAoKDE8PDEpKQorI2RlZmluZSBDT05GSUcyX1BBUEVfdGltZTAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUczX0dOVFNlbCAgICAgKCgxPDw3KSkKKyNkZWZpbmUgQ09ORklHM19QQVJNX0VuICAgICgoMTw8NikpCisjZGVmaW5lIENPTkZJRzNfTWFnaWMgICAgICAoKDE8PDUpKQorI2RlZmluZSBDT05GSUczX0NhcmRCX0VuICAgKCgxPDwzKSkKKyNkZWZpbmUgQ09ORklHM19DTEtSVU5fRW4gICgoMTw8MikpCisjZGVmaW5lIENPTkZJRzNfRnVuY1JlZ0VuICAoKDE8PDEpKQorI2RlZmluZSBDT05GSUczX0ZCdGJFbiAgICAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUc0X1ZDT1BETiAgICAgKCgxPDw3KSkKKyNkZWZpbmUgQ09ORklHNF9QV1JPRkYgICAgICgoMTw8NikpCisjZGVmaW5lIENPTkZJRzRfUFdSTUdUICAgICAoKDE8PDUpKQorI2RlZmluZSBDT05GSUc0X0xXUE1FICAgICAgKCgxPDw0KSkKKyNkZWZpbmUgQ09ORklHNF9MV1BUTiAgICAgICgoMTw8MikpCisjZGVmaW5lIENPTkZJRzRfUkZUWVBFICAgICAoKDE8PDEpfCgxPDwwKSkKKyNkZWZpbmUgQ09ORklHNF9SRlRZUEUxICAgICgoMTw8MSkpCisjZGVmaW5lIENPTkZJRzRfUkZUWVBFMCAgICAoKDE8PDApKQorCisjZGVmaW5lIENPTkZJRzVfVFhfRklGT19PSyAoKDE8PDcpKQorI2RlZmluZSBDT05GSUc1X1JYX0ZJRk9fT0sgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHNV9DQUxPTiAgICAgICgoMTw8NSkpCisjZGVmaW5lIENPTkZJRzVfRUFDUEkgICAgICAoKDE8PDIpKQorI2RlZmluZSBDT05GSUc1X0xBTldha2UgICAgKCgxPDwxKSkKKyNkZWZpbmUgQ09ORklHNV9QTUVfU1RTICAgICgoMTw8MCkpCisKKyNkZWZpbmUgTVNSX0xJTktfTUFTSyAgICAgICgoMTw8Mil8KDE8PDMpKQorI2RlZmluZSBNU1JfTElOS19NQU5BR0VEICAgMgorI2RlZmluZSBNU1JfTElOS19OT05FICAgICAgMAorI2RlZmluZSBNU1JfTElOS19TSElGVCAgICAgMgorI2RlZmluZSBNU1JfTElOS19BREhPQyAgICAgMQorI2RlZmluZSBNU1JfTElOS19NQVNURVIgICAgMworCisjZGVmaW5lIFBTUl9HUE8gICAgICAgICAgICAoKDE8PDcpKQorI2RlZmluZSBQU1JfR1BJICAgICAgICAgICAgKCgxPDw2KSkKKyNkZWZpbmUgUFNSX0xFREdQTzEgICAgICAgICgoMTw8NSkpCisjZGVmaW5lIFBTUl9MRURHUE8wICAgICAgICAoKDE8PDQpKQorI2RlZmluZSBQU1JfVVdGICAgICAgICAgICAgKCgxPDwxKSkKKyNkZWZpbmUgUFNSX1BTRW4gICAgICAgICAgICgoMTw8MCkpCisKKyNkZWZpbmUgU0NSX0tNICAgICAgICAgICAgICgoMTw8NSl8KDE8PDQpKQorI2RlZmluZSBTQ1JfS00xICAgICAgICAgICAgKCgxPDw1KSkKKyNkZWZpbmUgU0NSX0tNMCAgICAgICAgICAgICgoMTw8NCkpCisjZGVmaW5lIFNDUl9UWFNFQ09OICAgICAgICAoKDE8PDEpKQorI2RlZmluZSBTQ1JfUlhTRUNPTiAgICAgICAgKCgxPDwwKSkKKworI2RlZmluZSBCY25JdHZfQmNuSXR2ICAgICAgKDB4MDFGRikKKworI2RlZmluZSBBdGltV25kX0F0aW1XbmQgICAgKDB4MDFGRikKKworI2RlZmluZSBCaW50ckl0dl9CaW50ckl0diAgKDB4MDFGRikKKworI2RlZmluZSBBdGltdHJJdHZfQXRpbXRySXR2ICgweDAxRkYpCisKKyNkZWZpbmUgUGh5RGVsYXlfUGh5RGVsYXkgICgoMTw8Mil8KDE8PDEpfCgxPDwwKSkKKworI2RlZmluZSBUUFBvbGxfQlEgICAgKCgxPDw3KSkKKyNkZWZpbmUgVFBQb2xsX0hQUSAgICgoMTw8NikpCisjZGVmaW5lIFRQUG9sbF9OUFEgICAoKDE8PDUpKQorI2RlZmluZSBUUFBvbGxfTFBRICAgKCgxPDw0KSkKKyNkZWZpbmUgVFBQb2xsX1NCUSAgICgoMTw8MykpCisjZGVmaW5lIFRQUG9sbF9TSFBRICAoKDE8PDIpKQorI2RlZmluZSBUUFBvbGxfU05QUSAgKCgxPDwxKSkKKyNkZWZpbmUgVFBQb2xsX1NMUFEgICgoMTw8MCkpCisKKyNkZWZpbmUgQ1dSX0NXICAgICAgICgweDAxRkYpCisKKyNkZWZpbmUgRkVSX0lOVFIgICAgICgoMTw8MTUpKQorI2RlZmluZSBGRVJfR1dBS0UgICAgKCgxPDwgNCkpCisKKyNkZWZpbmUgRkVNUl9JTlRSICAgICgoMTw8MTUpKQorI2RlZmluZSBGRU1SX1dLVVAgICAgKCgxPDwxNCkpCisjZGVmaW5lIEZFTVJfR1dBS0UgICAoKDE8PCA0KSkKKworI2RlZmluZSBGUFNSX0lOVFIgICAgKCgxPDwxNSkpCisjZGVmaW5lIEZQU1JfR1dBS0UgICAoKDE8PCA0KSkKKworI2RlZmluZSBGRkVSX0lOVFIgICAgKCgxPDwxNSkpCisjZGVmaW5lIEZGRVJfR1dBS0UgICAoKDE8PCA0KSkKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorLy8gVGhyZWUgd2lyZSBtb2RlLgorI2RlZmluZSBTV19USFJFRV9XSVJFCQkJMAorI2RlZmluZSBIV19USFJFRV9XSVJFCQkJMgorLy9SVEw4MTg3UyBieSBhbXkKKyNkZWZpbmUgSFdfVEhSRUVfV0lSRV9QSQkJNQorI2RlZmluZSBIV19USFJFRV9XSVJFX1NJCQk2CisvL2J5IGFteQorI2RlZmluZSBUQ1JfTFJMX09GRlNFVAkJMAorI2RlZmluZSBUQ1JfU1JMX09GRlNFVAkJOAorI2RlZmluZSBUQ1JfTVhETUFfT0ZGU0VUCTIxCisjZGVmaW5lIFRDUl9ESVNSZXFRc2l6ZV9PRkZTRVQJCTI4CisjZGVmaW5lIFRDUl9EdXJQcm9jTW9kZV9PRkZTRVQJCTMwCisKKyNkZWZpbmUgUkNSX01YRE1BX09GRlNFVAkJCQk4CisjZGVmaW5lIFJDUl9GSUZPX09GRlNFVAkJCQkJMTMKKworI2RlZmluZSBUTUdEUwkJCTB4MEMJCQkvLyBUeCBNYW5hZ2VtZW50IERlc2NyaXB0b3IgQWRkcmVzcworI2RlZmluZSBUQktEUwkJCTB4MTAJCQkvLyBUeCBBQ19CSyBEZXNjcmlwdG9yIEFkZHJlc3MKKyNkZWZpbmUgVEJFRFMJCQkweDE0CQkJLy8gVHggQUNfQkUgRGVzY3JpcHRvciBBZGRyZXNzCisjZGVmaW5lIFRMUERTCQkJMHgyMAkJCS8vIFR4IEFDX1ZJIERlc2NyaXB0b3IgQWRkcmVzcworI2RlZmluZSBUTlBEUwkJCTB4MjQJCQkvLyBUeCBBQ19WTyBEZXNjcmlwdG9yIEFkZHJlc3MKKyNkZWZpbmUgVEhQRFMJCQkweDI4CQkJLy8gVHggSGlnbiBQcmlvcml0eSBEZXNjcmlwdG9yIEFkZHJlc3MKKworI2RlZmluZSBUQkRTCQkJMHg0YwkJCS8vIEJlYWNvbiBkZXNjcmlwdG9yIHF1ZXVlIHN0YXJ0IGFkZHJlc3MKKworI2RlZmluZSBSRFNBCQkJMHhFNAkJCS8vIFJlY2VpdmUgZGVzY3JpcHRvciBxdWV1ZSBzdGFydCBhZGRyZXNzCisKKyNkZWZpbmUgQWNrVGltZU91dFJlZwkweDc5CQkvLyBBQ0sgdGltZW91dCByZWdpc3RlciwgaW4gdW5pdCBvZiA0IHVzLgorCisjZGVmaW5lIFJGVGltaW5nCQkJMHg4QworCisjZGVmaW5lIFRQUG9sbFN0b3AgCQkweDkzCisKKyNkZWZpbmUgVFhBR0NfQ1RMCQkweDlDCQkJLy8gPFJKX1RPRE9fODE4NUI+IFRYX0FHQ19DT05UUk9MICgweDlDIHNlZW1zIGJlIHJlbW92ZWQgYXQgODE4NUIsIHNlZSBwMzcpLgorI2RlZmluZSBDQ0tfVFhBR0MJCTB4OUQKKyNkZWZpbmUgT0ZETV9UWEFHQwkJMHg5RQorI2RlZmluZSBBTlRTRUwJCQkweDlGCisKKyNkZWZpbmUgQUNNX0NPTlRST0wgICAgICAgICAgICAgMHgwMEJGICAgICAgLy8gQUNNIENvbnRyb2wgUmVnaXN0ZQorCisjZGVmaW5lIFJUTDgxODVCX1ZFUl9SRUcgICAgMHhFMQorCisjZGVmaW5lCUludE1pZwkJCTB4RTIJCQkvLyBJbnRlcnJ1cHQgTWlncmF0aW9uICgweEUyIH4gMHhFMykKKworI2RlZmluZSBUSURfQUNfTUFQCQkweEU4CQkJLy8gVElEIHRvIEFDIE1hcHBpbmcgUmVnaXN0ZXIKKworI2RlZmluZSBBTkFQQVJBTTMJCTB4RUUJCQkvLyA8UkpfVE9ET184MTg1Qj4gSG93IHRvIHVzZSBpdD8KKworI2RlZmluZSBBQ19WT19QQVJBTQkJMHhGMAkJCS8vIEFDX1ZPIFBhcmFtZXRlcnMgUmVjb3JkCisjZGVmaW5lIEFDX1ZJX1BBUkFNCQkweEY0CQkJLy8gQUNfVkkgUGFyYW1ldGVycyBSZWNvcmQKKyNkZWZpbmUgQUNfQkVfUEFSQU0JCTB4RjgJCQkvLyBBQ19CRSBQYXJhbWV0ZXJzIFJlY29yZAorI2RlZmluZSBBQ19CS19QQVJBTQkJMHhGQwkJCS8vIEFDX0JLIFBhcmFtZXRlcnMgUmVjb3JkCisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisjZGVmaW5lIEJjblRpbWluZ0FkanVzdAkweDE2QQkJCS8vIEJlYWNvbiBUaW1pbmcgQWRqdXN0IFJlZ2lzdGVyLgorI2RlZmluZSBHUElPQ3RybAkJCTB4MTZCCQkJLy8gR1BJTyBDb250cm9sIFJlZ2lzdGVyLgorI2RlZmluZSBQU0J5R0MJCQkweDE4MAkJCS8vIDB4MTgwIC0gMHgxODMgUG93ZXIgU2F2aW5nIGJ5IEdhdGVkIENsb2NrLgorI2VuZGlmCisjZGVmaW5lIEFSRlIJCQkweDFFMAkvLyBBdXRvIFJhdGUgRmFsbGJhY2sgUmVnaXN0ZXIgKDB4MWUwIH4gMHgxZTIpCisKKyNkZWZpbmUgUkZTV19DVFJMCQkJMHgyNzIJLy8gMHgyNzItMHgyNzMuCisjZGVmaW5lIFNXXzNXX0RCMAkJCTB4Mjc0CS8vIFNvZnR3YXJlIDMtd2lyZSBkYXRhIGJ1ZmZlciBiaXQgMzF+MC4KKyNkZWZpbmUgU1dfM1dfREIxCQkJMHgyNzgJLy8gU29mdHdhcmUgMy13aXJlIGRhdGEgYnVmZmVyIGJpdCA2M34zMi4KKyNkZWZpbmUgU1dfM1dfQ01EMAkJCTB4MjdDCS8vIFNvZnR3YXJlIDMtd2lyZSBDb250cm9sL1N0YXR1cyBSZWdpc3Rlci4KKyNkZWZpbmUgU1dfM1dfQ01EMQkJCTB4MjdECS8vIFNvZnR3YXJlIDMtd2lyZSBDb250cm9sL1N0YXR1cyBSZWdpc3Rlci4KKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyNkZWZpbmUgUElfREFUQV9SRUFECQkwWDM2MAkvLyAweDM2MCAtIDB4MzYxICBQYXJhbGxlbCBJbnRlcmZhY2UgRGF0YSBSZWdpc3Rlci4KKyNkZWZpbmUgU0lfREFUQV9SRUFECQkweDM2MgkvLyAweDM2MiAtIDB4MzYzICBTZXJpYWwgSW50ZXJmYWNlIERhdGEgUmVnaXN0ZXIuCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg1QiBUUFBvbGwgYml0cyAJCQkJKG9mZnNldCAweGQ5LCAxIGJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVFBQT0xMX0JRCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgVFBQT0xMX0hQUQkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFRQUE9MTF9BQ19WT1EJCSgweDAxIDw8IDUpCisjZGVmaW5lIFRQUE9MTF9BQ19WSVEJCSgweDAxIDw8IDQpCisjZGVmaW5lIFRQUE9MTF9BQ19CRVEJCSgweDAxIDw8IDMpCisjZGVmaW5lIFRQUE9MTF9BQ19CS1EJCSgweDAxIDw8IDIpCisjZGVmaW5lIFRQUE9MTF9BQ19NR1EJCSgweDAxIDw8IDEpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE4NUIgVFBQb2xsU3RvcCBiaXRzIAkJCQkob2Zmc2V0IDB4OTMsIDEgYnl0ZSkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBUUFBPTExTVE9QX0JRCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgVFBQT0xMU1RPUF9IUFEJCQkoMHgwMSA8PCA2KQorI2RlZmluZSBUUFBPTExTVE9QX0FDX1ZPUQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgVFBQT0xMU1RPUF9BQ19WSVEJCSgweDAxIDw8IDQpCisjZGVmaW5lIFRQUE9MTFNUT1BfQUNfQkVRCQkoMHgwMSA8PCAzKQorI2RlZmluZSBUUFBPTExTVE9QX0FDX0JLUQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgVFBQT0xMU1RPUF9BQ19NR1EJCSgweDAxIDw8IDEpCisKKworI2RlZmluZSBNU1JfTElOS19FTkVEQ0EJICAgKDE8PDQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE4N0IgQUNfWFhfUEFSQU0gYml0cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUCQkxNgorI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVAkJCTEyCisjZGVmaW5lIEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUCQkJOAorI2RlZmluZSBBQ19QQVJBTV9BSUZTX09GRlNFVAkJCTAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg3QiBBQ01fQ09OVFJPTCBiaXRzCQkJCQkJKE9mZnNldCAweEJGLCAxIEJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVk9RX0FDTV9FTgkJCQkoMHgwMSA8PCA3KSAvL0JJVDcKKyNkZWZpbmUgVklRX0FDTV9FTgkJCQkoMHgwMSA8PCA2KSAvL0JJVDYKKyNkZWZpbmUgQkVRX0FDTV9FTgkJCQkoMHgwMSA8PCA1KSAvL0JJVDUKKyNkZWZpbmUgQUNNX0hXX0VOCQkJCSgweDAxIDw8IDQpIC8vQklUNAorI2RlZmluZSBUWE9QU0VMCQkJCQkoMHgwMSA8PCAzKSAvL0JJVDMKKyNkZWZpbmUgVk9RX0FDTV9DVEwJCQkJKDB4MDEgPDwgMikgLy9CSVQyIC8vIFNldCB0byAxIHdoZW4gQUNfVk8gdXNlZCB0aW1lIHJlYWNoZXMgb3IgZXhjZWVkcyB0aGUgYWRtaXR0ZWQgdGltZQorI2RlZmluZSBWSVFfQUNNX0NUTAkJCQkoMHgwMSA8PCAxKSAvL0JJVDEgLy8gU2V0IHRvIDEgd2hlbiBBQ19WSSB1c2VkIHRpbWUgcmVhY2hlcyBvciBleGNlZWRzIHRoZSBhZG1pdHRlZCB0aW1lCisjZGVmaW5lIEJFUV9BQ01fQ1RMCQkJCSgweDAxIDw8IDApIC8vQklUMCAvLyBTZXQgdG8gMSB3aGVuIEFDX0JFIHVzZWQgdGltZSByZWFjaGVzIG9yIGV4Y2VlZHMgdGhlIGFkbWl0dGVkIHRpbWUKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxODVCIFNXXzNXX0NNRCBiaXRzCQkJCQkoT2Zmc2V0IDB4MjdDLTB4MjdELCAxNmJpdCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTV18zV19DTUQwX0hPTEQJCSgoMTw8IDcpKQorI2RlZmluZSBTV18zV19DTUQxX1JFCQkgCSgoMTw8IDApKSAvLyBCSVQ4CisjZGVmaW5lIFNXXzNXX0NNRDFfV0UJCSgoMTw8IDEpKSAvLyBCSVQ5CisjZGVmaW5lIFNXXzNXX0NNRDFfRE9ORQkJKCgxPDwgMikpIC8vIEJJVDEwCisKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX1JXIAkoMTw8MykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg1QiBSQVRFX0ZBTExCQUNLX0NUTCBiaXRzCQkJCShPZmZzZXQgMHhCRSwgOGJpdCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBSQVRFX0ZBTExCQUNLX0NUTF9FTkFCTEUJCQkJKCgxPDwgNykpCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0VOQUJMRV9SVFNDVFMJCSgoMTw8IDYpKQorLy8gQXV0byByYXRlIGZhbGxiYWNrIHBlciAyXm4gcmV0cnkuCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0FVVE9fU1RFUDAJMHgwMAorI2RlZmluZSBSQVRFX0ZBTExCQUNLX0NUTF9BVVRPX1NURVAxCTB4MDEKKyNkZWZpbmUgUkFURV9GQUxMQkFDS19DVExfQVVUT19TVEVQMgkweDAyCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0FVVE9fU1RFUDMJMHgwMworCisKKyNkZWZpbmUgUlRMODIyNXoyX0FOQVBBUkFNX09GRgkweDU1NDgwNjU4CisjZGVmaW5lIFJUTDgyMjV6Ml9BTkFQQVJBTTJfT0ZGCTB4NzIwMDNmNzAKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9TVyBCSVQzMQorI2RlZmluZSBSRl9DSEFOR0VfQllfSFcgQklUMzAKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1BTIEJJVDI5CisjZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMgQklUMjgKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCisvL2J5IGFteSBmb3IgYW50ZW5uYQorI2RlZmluZSBFRVBST01fU1dfUkVWRF9PRkZTRVQgMHgzZgorLy8gQklUWzgtOV0gaXMgZm9yIFNXIEFudGVubmEgRGl2ZXJzaXR5LiBPbmx5IHRoZSB2YWx1ZSBFRVBST01fU1dfQURfRU5BQkxFIG1lYW5zIGVuYWJsZSwgb3RoZXIgdmFsdWVzIGFyZSBkaWFibGUuCisjZGVmaW5lIEVFUFJPTV9TV19BRF9NQVNLCQkJMHgwMzAwCisjZGVmaW5lIEVFUFJPTV9TV19BRF9FTkFCTEUJCQkweDAxMDAKKworLy8gQklUWzEwLTExXSBkZXRlcm1pbmUgaWYgQW50ZW5uYSAxIGlzIHRoZSBEZWZhdWx0IEFudGVubmEuIE9ubHkgdGhlIHZhbHVlIEVFUFJPTV9ERUZfQU5UXzEgbWVhbnMgVFJVRSwgb3RoZXIgdmFsdWVzIGFyZSBGQUxTRS4KKyNkZWZpbmUgRUVQUk9NX0RFRl9BTlRfTUFTSwkJCTB4MEMwMAorI2RlZmluZSBFRVBST01fREVGX0FOVF8xCQkJMHgwNDAwCisvL2J5IGFteSBmb3IgYW50ZW5uYQorLy97YnkgYW15IDA4MDMxMgorLy8weDdDLCAweDdEIENyeXN0YWwgY2FsaWJyYXRpb24gYW5kIFR4IFBvd2VyIHRyYWNraW5nIG1lY2hhbmlzbS4gQWRkZWQgYnkgUm9nZXIuIDIwMDcuMTIuMTAuCisjZGVmaW5lIEVFUFJPTV9SU1YJCQkJCQkweDdDCisjZGVmaW5lIEVFUFJPTV9YVEFMX0NBTF9NQVNLCQkJMHgwMEZGCS8vIDB4N0NbNzowXSwgQ3J5c3RhbCBjYWxpYnJhdGlvbiBtYXNrLgorI2RlZmluZSBFRVBST01fWFRBTF9DQUxfWE9VVF9NQVNLCTB4MEYJLy8gMHg3Q1szOjBdLCBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYb3V0LgorI2RlZmluZSBFRVBST01fWFRBTF9DQUxfWElOX01BU0sJCTB4RjAJLy8gMHg3Q1s3OjRdLCBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYaW4uCisjZGVmaW5lIEVFUFJPTV9USEVSTUFMX01FVEVSX01BU0sJMHgwRjAwCS8vIDB4N0RbMzowXSwgVGhlcm1hbCBtZXRlciByZWZlcmVuY2UgbGV2ZWwuCisjZGVmaW5lIEVFUFJPTV9YVEFMX0NBTF9FTkFCTEUJCTB4MTAwMAkvLyAweDdEWzRdLCBDcnlzdGFsIGNhbGlicmF0aW9uIGVuYWJsZWQvZGlzYWJsZWQgQklULgorI2RlZmluZSBFRVBST01fVEhFUk1BTF9NRVRFUl9FTkFCTEUJMHgyMDAwCS8vIDB4N0RbNV0sIFRoZXJtYWwgbWV0ZXIgZW5hYmxlZC9kaXNhYmxlZCBCSVQuCisjZGVmaW5lIEVFUFJPTV9DSURfUlNWRDEJCQkJMHgzRgorI2RlZmluZSBFTl9MUEZfQ0FMCQkJMHgyMzgJLy8gRW5hYmxlIExQRiBDYWxpYnJhdGlvbi4KKyNkZWZpbmUgUFdSX01FVEVSX0VOCQlCSVQxCisvLyA8UkpfVE9ET184MTg1Qj4gd2hlcmUgYXJlIGZhbHNlIGFsYXJtIGNvdW50ZXJzIGluIDgxODVCPworI2RlZmluZSBDQ0tfRkFMU0VfQUxBUk0JCTB4RDAKKyNkZWZpbmUgT0ZETV9GQUxTRV9BTEFSTQkweEQyCisvL2J5IGFteSAwODAzMTJ9CisKKy8vWUosYWRkIGZvciBDb3VudHJ5IElFLCAwODA2MzAKKyNkZWZpbmUgRUVQUk9NX0NPVU5UUllfQ09ERSAgMHgyRQorLy9ZSixhZGQsMDgwNjMwLGVuZAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX21heDI4MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWEwODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgICBUaGlzIGZpbGVzIGNvbnRhaW5zIE1BWElNIE1BWDI4MjAgcmFkaW8gZnJvbnRlbmQgcHJvZ3JhbW1pbmcgcm91dGluZXMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIE5ldEJTRCBydGw4MTgwIGRyaXZlciBmcm9tIERhdmUgWW91bmcgaGFzIGJlZW4gcmVhbGx5IHVzZWZ1bCB0bworICAgdW5kZXJzdGFuZCBob3cgdG8gcHJvZ3JhbSB0aGUgTUFYSU0gcmFkaW8uIFRoYW5rcyBhIGxvdCEhIQorCisgICAnVGhlIERldWNlJyB0ZXN0ZWQgdGhpcyBhbmQgZml4ZWQgc29tZSBidWdzLgorCisgICBDb2RlIGZyb20gcnRsODE4MSBwcm9qZWN0IGhhcyBiZWVuIHVzZWZ1bCB0byBtZSB0byB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzLgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX21heDI4MjAuaCIKKworCisvLyNkZWZpbmUgREVCVUdfTUFYSU0KKwordTMyIG1heGltX2NoYW5bXSA9IHsKKwkwLAkvL2R1bW15IGNoYW5uZWwgMAorCTEyLCAvLzEKKwkxNywgLy8yCisJMjIsIC8vMworCTI3LCAvLzQKKwkzMiwgLy81CisJMzcsIC8vNgorCTQyLCAvLzcKKwk0NywgLy84CisJNTIsIC8vOQorCTU3LCAvLzEwCisJNjIsIC8vMTEKKwk2NywgLy8xMgorCTcyLCAvLzEzCisJODQsIC8vMTQKK307CisKKyNpZiAwCisvKiBtYXhpbSBleHBlY3RzIDQgYml0IGFkZHJlc3MgTVNGLCB0aGVuIDEyIGJpdCBkYXRhIE1TRiovCit2b2lkIHdyaXRlX21heGltKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggYWRyLCB1MzIgZGF0YSkKK3sKKworCWludCBzaGlmdDsKKwlzaG9ydCBiaXQ7CisJdTE2IHdvcmQ7CisKKwlhZHIgPSBhZHIgJjB4ZjsKKwl3b3JkID0gKHUxNilkYXRhICYgMHhmZmY7CisJd29yZCB8PSAoYWRyPDwxMik7CisJLyp3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwgQkJfSE9TVF9CQU5HX0VOKTsKKwlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJbWRlbGF5KDEpOworCisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IEJCX0hPU1RfQkFOR19FTiB8IEJCX0hPU1RfQkFOR19DTEspOworCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwltZGVsYXkoMSk7CisJKi8KKworCS8qIE1BWDI4MjAgd2lsbCBzYW1wbGUgZGF0YSBvbiByaXNpbmcgZWRnZSBvZiBjbG9jayAqLworCWZvcihzaGlmdCA9IDE1O3NoaWZ0ID49MDsgc2hpZnQtLSl7CisJCWJpdCA9IHdvcmQ+PnNoaWZ0ICYgMTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwgKGJpdDw8QkJfSE9TVF9CQU5HX0RBVEEpKTsKKworCQlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJCW1kZWxheSgyKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwKKwkJKGJpdDw8QkJfSE9TVF9CQU5HX0RBVEEpIHwgQkJfSE9TVF9CQU5HX0NMSyk7IC8qIHNhbXBsZSBkYXRhICovCisKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCQltZGVsYXkoMSk7CisKKwkJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8CisJCShiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKSk7CisKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCQltZGVsYXkoMik7CisKKwl9CisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IChiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKXwKKwkJCQkJQkJfSE9TVF9CQU5HX0VOKTsKKwlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJbWRlbGF5KDIpOworCisJLyogVGhlIHNoaWZ0IHJlZ2lzdGVyIGZpbGwgZmx1c2ggdG8gdGhlIHJlcXVlc3RlZCByZWdpc3RlciB0aGUKKwkgKiBsYXN0IDEyIGJpdHMgZGF0YSBzaGlmdGVkIGluCisJICovCisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IChiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKXwKKwkJCQkJQkJfSE9TVF9CQU5HX0VOIHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCW1kZWxheSgyKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfCAoYml0PDxCQl9IT1NUX0JBTkdfREFUQSl8CisJCQkJCUJCX0hPU1RfQkFOR19FTik7CisJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCW1kZWxheSgyKTsKKworCisjaWZkZWYgREVCVUdfTUFYSU0KKwlETUVTRygiV3JpdGluZyBtYXhpbTogJXggKGFkciAleCkiLHBoeV9jb25maWcsYWRyKTsKKyNlbmRpZgorCit9CisjZW5kaWYKKwordm9pZCB3cml0ZV9tYXhpbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4IGFkciwgdTMyIGRhdGEpIHsKKwl1MzIgdGVtcDsKKwl0ZW1wID0gIDB4OTAgKyAoZGF0YSAmIDB4Zik7CisJdGVtcCA8PD0gMTY7CisJdGVtcCArPSBhZHI7CisJdGVtcCA8PD0gODsKKwl0ZW1wICs9IChkYXRhID4+IDQpICYgMHhmZjsKKyNpZmRlZiBERUJVR19NQVhJTQorCURNRVNHKCJ3cml0ZV9tYXhpbTogJTA4eCIsIHRlbXApOworI2VuZGlmCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0NPTkZJRywgdGVtcCk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7Cit9CisKKwordm9pZCBtYXhpbV93cml0ZV9waHlfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBhbnQ7CisKKwlhbnQgPSBNQVhJTV9BTlRFTk5BOworCWlmKHByaXYtPmFudGIpIC8qZGVmYXVsdCBhbnRlbm5hIGlzIGFudGVubmEgQiAqLworCQlhbnQgfD0gQkJfQU5URU5OQV9COworCWlmKGNoID09IDE0KQorCQlhbnQgfD0gQkJfQU5UQVRURU5fQ0hBTjE0OworCXdyaXRlX3BoeShkZXYsMHgxMCxhbnQpOworCS8vRE1FU0coIkJCIGFudGVubmEgJXggIixhbnQpOworfQorCisKK3ZvaWQgbWF4aW1fcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiB0eHB3ID0gMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdOworCXUzMiBjaGFuID0gbWF4aW1fY2hhbltjaF07CisKKwkvKldoaWxlIHBoaWxpcHMgU0EyNDAwIGRyaXZlIHRoZSBQQSBiaWFzCisJICpzZWVtcyB0aGF0IGZvciBNQVhJTSB3ZSBkZWxlZ2F0ZSB0aGlzCisJICp0byB0aGUgQkIKKwkgKi8KKworCS8vd3JpdGVfbWF4aW0oZGV2LDUsdHhwdyk7CisJd3JpdGVfcGh5KGRldiwzLHR4cHcpOworCisJbWF4aW1fd3JpdGVfcGh5X2FudGVubmEoZGV2LGNoKTsKKwl3cml0ZV9tYXhpbShkZXYsMyxjaGFuKTsKK30KKworCit2b2lkIG1heGltX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfcGh5KGRldiwgMywgMHg4KTsKKwl3cml0ZV9tYXhpbShkZXYsIDEsIDApOworfQorCisKK3ZvaWQgbWF4aW1fcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYW5hcGFyYW07CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsUEhZX0RFTEFZLDB4Nik7CS8vdGhpcyBpcyBnZW5lcmFsCisJd3JpdGVfbmljX2J5dGUoZGV2LENBUlJJRVJfU0VOU0VfQ09VTlRFUiwweDRjKTsgLy90aGlzIGlzIGdlbmVyYWwKKworCS8qdGhlc2UgYXJlIG1heGltIHNwZWNpZmljKi8KKwlhbmFwYXJhbSA9IHJlYWRfbmljX2R3b3JkKGRldixBTkFQQVJBTSk7CisJYW5hcGFyYW0gPSBhbmFwYXJhbSAmfiAoQU5BUEFSQU1fVFhEQUNPRkZfU0hJRlQpOworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn5BTkFQQVJBTV9QV1IxX01BU0s7CisJYW5hcGFyYW0gPSBhbmFwYXJhbSAmfkFOQVBBUkFNX1BXUjBfTUFTSzsKKwlhbmFwYXJhbSB8PSAoTUFYSU1fQU5BUEFSQU1fUFdSMV9PTjw8QU5BUEFSQU1fUFdSMV9TSElGVCk7CisJYW5hcGFyYW0gfD0gKE1BWElNX0FOQVBBUkFNX1BXUjBfT048PEFOQVBBUkFNX1BXUjBfU0hJRlQpOworCisJLy9ydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsYW5hcGFyYW0pOworCisJLyogTUFYSU0gZnJvbSBuZXRic2QgZHJpdmVyICovCisKKwl3cml0ZV9tYXhpbShkZXYsMCwgNyk7IC8qIHRlc3QgbW9kZSBhcyBpbmRpY2F0ZWQgaW4gZGF0YXNoZWV0Ki8KKwl3cml0ZV9tYXhpbShkZXYsMSwgMHgxZSk7IC8qIGVuYWJsZSByZWdpc3RlciovCisJd3JpdGVfbWF4aW0oZGV2LDIsIDEpOyAvKiBzeW50IHJlZ2lzdGVyICovCisKKworCW1heGltX3JmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKKworCXdyaXRlX21heGltKGRldiw0LCAweDMxMyk7IC8qIHJ4IHJlZ2lzdGVyKi8KKworCS8qIFBBIGlzIGRyaXZlbiBkaXJlY3RseSBieSB0aGUgQkIsIHdlIGtlZXAgdGhlIE1BWElNIGJpYXMKKwkgKiBhdCB0aGUgaGlnaGVzdCB2YWx1ZSBpbiB0aGUgYm91YnQgdGhhIHBsZWFjaW5nIGl0IHRvIGxvd2VyCisJICogdmFsdWVzIG1heSBpbnRyb2R1Y2Ugc29tZSBmdXJ0aGVyIGF0dGVudWF0aW9uIHNvbWV3aGVyZS4uCisJICovCisKKwl3cml0ZV9tYXhpbShkZXYsNSwgMHhmKTsKKworCisJLypiYXNlYmFuZCBjb25maWd1cmF0aW9uKi8KKwl3cml0ZV9waHkoZGV2LDAsMHg4OCk7IC8vc3lzMQorCXdyaXRlX3BoeShkZXYsMywweDgpOyAvL3R4YWdjCisJd3JpdGVfcGh5KGRldiw0LDB4ZjgpOyAvLyBsbmFkZXQKKwl3cml0ZV9waHkoZGV2LDUsMHg5MCk7IC8vIGlmYWdjaW5pdAorCXdyaXRlX3BoeShkZXYsNiwweDFhKTsgLy8gaWZhZ2NsaW1pdAorCXdyaXRlX3BoeShkZXYsNywweDY0KTsgLy8gaWZhZ2NkZXQKKworCS8qU2hvdWxkIGJlIGRvbmUgc29tZXRoaW5nIG1vcmUgaGVyZT8/Ki8KKworCW1heGltX3dyaXRlX3BoeV9hbnRlbm5hKGRldixwcml2LT5jaGFuKTsKKworCXdyaXRlX3BoeShkZXYsMHgxMSwweDg4KTsgLy90cmwKKwlpZihwcml2LT5kaXZlcnNpdHkpCisJCXdyaXRlX3BoeShkZXYsMHgxMiwweGM3KTsKKwllbHNlCisJCXdyaXRlX3BoeShkZXYsMHgxMiwweDQ3KTsKKworCXdyaXRlX3BoeShkZXYsMHgxMywweDliKTsKKworCXdyaXRlX3BoeShkZXYsMHgxOSwweDApOyAvL0NIRVNUTElNCisJd3JpdGVfcGh5KGRldiwweDFhLDB4OWYpOyAvL0NIU1FMSU0KKworCW1heGltX3JmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfbWF4MjgyMC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0ZmI1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfbWF4MjgyMC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjZGVmaW5lIE1BWElNX0FOVEVOTkEgMHhiMworI2RlZmluZSBNQVhJTV9BTkFQQVJBTV9QV1IxX09OIDB4OAorI2RlZmluZSBNQVhJTV9BTkFQQVJBTV9QV1IwX09OIDB4MAorCisKK3ZvaWQgbWF4aW1fcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgbWF4aW1fcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisKK3ZvaWQgbWF4aW1fcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3BtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1MWI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uYwpAQCAtMCwwICsxLDkwIEBACisvKgorICAgUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCisgICBXcml0dGVuIGJ5IE1hcml1c3ogTWF0dXN6ZWsuCisgICBUaGlzIGNvZGUgaXMgY3VycmVudGx5IGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgbGF0ZXIgd29yayBhbmQKKyAgIGRvZXMgbm90IGRvIGFueXRoaW5nIHVzZWZ1bC4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisqLworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKworCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9wbS5oIgorI2luY2x1ZGUgInI4MTgwLmgiCisKK2ludCBydGw4MTgwX3NhdmVfc3RhdGUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSkKK3sKKyAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJyODE4MCBzYXZlIHN0YXRlIGNhbGwgKHN0YXRlICV1KS5cbiIsIHN0YXRlKTsKKwlyZXR1cm4oLUVBR0FJTik7Cit9CisKK2ludCBydGw4MTgwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIG91dF9wY2lfc3VzcGVuZDsKKworCWRldi0+c3RvcChkZXYpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCitvdXRfcGNpX3N1c3BlbmQ6CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldixwY2lfY2hvb3NlX3N0YXRlKHBkZXYsc3RhdGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bDgxODBfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBlcnI7CisJdTMyIHZhbDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQgb24gcmVzdW1lXG4iLAorCQkJCWRldi0+bmFtZSk7CisKKwkJcmV0dXJuIGVycjsKKwl9CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJLyoKKwkgKiBTdXNwZW5kL1Jlc3VtZSByZXNldHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLCBzbyB3ZSBoYXZlIHRvCisJICogcmUtZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcCBQQ0kgVHggcmV0cmllcworCSAqIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUuIHBjaV9yZXN0b3JlX3N0YXRlIHdvbid0IGhlbHAKKwkgKiBoZXJlIHNpbmNlIGl0IG9ubHkgcmVzdG9yZXMgdGhlIGZpcnN0IDY0IGJ5dGVzIHBjaSBjb25maWcgaGVhZGVyLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCAmdmFsKTsKKwlpZiAoKHZhbCAmIDB4MDAwMGZmMDApICE9IDApCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgdmFsICYgMHhmZmZmMDBmZik7CisKKwlpZighbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIG91dDsKKworCWRldi0+b3BlbihkZXYpOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcnRsODE4MF9lbmFibGVfd2FrZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKQoreworICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgInI4MTgwIGVuYWJsZSB3YWtlIGNhbGwgKHN0YXRlICV1LCBlbmFibGUgJWQpLlxuIiwKKwkgICAgICAgc3RhdGUsIGVuYWJsZSk7CisJcmV0dXJuKC1FQUdBSU4pOworfQorCisKKworI2VuZGlmIC8vQ09ORklHX1JUTDgxODBfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU4YjNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9wbS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgICAgICAgIFBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHJvdXRpbmVzLgorCVdyaXR0ZW4gYnkgTWFyaXVzeiBNYXR1c3play4KKwlUaGlzIGNvZGUgaXMgY3VycmVudGx5IGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgbGF0ZXIgd29yayBhbmQKKwlkb2VzIG5vdCBkbyBhbnl0aGluZyB1c2VmdWwuCisKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisqLworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKworI2lmbmRlZiBSODE4MF9QTV9ICisjZGVmaW5lIFI4MTgwX1BNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK2ludCBydGw4MTgwX3NhdmVfc3RhdGUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSk7CitpbnQgcnRsODE4MF9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK2ludCBydGw4MTgwX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworaW50IHJ0bDgxODBfZW5hYmxlX3dha2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSwgaW50IGVuYWJsZSk7CisKKyNlbmRpZiAvL1I4MTgwX1BNX0gKKworI2VuZGlmIC8vIENPTkZJR19SVEw4MTgwX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZWQwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuYwpAQCAtMCwwICsxLDkzMyBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODIyNQorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKworCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9ydGw4MjI1LmgiCisKKwordTggcnRsODIyNV9nYWluW109eworCTB4MjMsMHg4OCwweDdjLDB4YTUsLy8gLTgyZGJtCisJMHgyMywweDg4LDB4N2MsMHhiNSwvLyAtODJkYm0KKwkweDIzLDB4ODgsMHg3YywweGM1LC8vIC04MmRibQorCTB4MzMsMHg4MCwweDc5LDB4YzUsLy8gLTc4ZGJtCisJMHg0MywweDc4LDB4NzYsMHhjNSwvLyAtNzRkYm0KKwkweDUzLDB4NjAsMHg3MywweGM1LC8vIC03MGRibQorCTB4NjMsMHg1OCwweDcwLDB4YzUsLy8gLTY2ZGJtCit9OworCisjaWYgMAordTggcnRsODIyNV9pbml0X2dhaW5bXT17CisJLy8weDAwLDB4MDAsMHgwMCwweDAwLC8vMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDMzLDB4ODAsMHg2YywweGM1LC8vMHgwMCwweDQ5LDB4MDYsMHhiNSwvL0dhaW4gPSAwIH4gLTc4ZGJtCisJMHg0MywweDc4LDB4NjksMHhjNSwvLzB4MDAsMHg0NSwweDA2LDB4YjEsLy9HYWluID0gMSB+IC03NGRibQorCTB4NTMsMHg2MCwweDY2LDB4YzUsLy8weDAwLDB4NDEsMHgwNiwweGFiLC8vR2FpbiA9IDIgfiAtNzBkYm0KKwkweDYzLDB4NTgsMHg2MywweGM1LC8vMHgwMCwweDNkLDB4MDYsMHhhNSwvL0dhaW4gPSAzIH4gLTY2ZGJtCisJMHg3MywweDUwLDB4NjIsMHhjNSwvLzB4MDAsMHgzOSwweDA2LDB4YTEsLy9HYWluID0gNCB+IC02MmRibQorCTB4ODMsMHg0MywweDYxLDB4YzUsLy8weDAwLDB4MzUsMHgwNiwweDliLC8vR2FpbiA9IDUgfiAtNThkYm0KKwkweDkzLDB4MzgsMHg1YSwweGM1LC8vMHgwMCwweDMxLDB4MDYsMHg5OSwvL0dhaW4gPSA2IH4gLTU0ZGJtCit9OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUwordTMyIHJ0bDgyMjVfY2hhbltdID17CisgICAgICAgICAgICAgIDAsCisJCTB4MDA4MCwgLy9jaDEKKwkJMHgwMTAwLCAvL2NoMgorCQkweDAxODAsIC8vY2gzCisJCTB4MDIwMCwgLy9jaDQKKwkJMHgwMjgwLAorCQkweDAzMDAsCisJCTB4MDM4MCwKKwkJMHgwNDAwLAorCQkweDA0ODAsCisJCTB4MDUwMCwKKwkJMHgwNTgwLAorCQkweDA2MDAsCisJCTB4MDY4MCwKKwkJMHgwNzRBLCAvL2NoMTQKK307CisjZWxzZQordTMyIHJ0bDgyMjVfY2hhbltdID0geworCTAsCS8vZHVtbXkgY2hhbm5lbCAwCisJMHgwODVjLCAvLzEKKwkweDA4ZGMsIC8vMgorCTB4MDk1YywgLy8zCisJMHgwOWRjLCAvLzQKKwkweDBhNWMsIC8vNQorCTB4MGFkYywgLy82CisJMHgwYjVjLCAvLzcKKwkweDBiZGMsIC8vOAorCTB4MGM1YywgLy85CisJMHgwY2RjLCAvLzEwCisJMHgwZDVjLCAvLzExCisJMHgwZGRjLCAvLzEyCisJMHgwZTVjLCAvLzEzCisJLy8weDBmNWMsIC8vMTQKKwkweDBmNzIsIC8vIDE0Cit9OworI2VuZGlmCisKK3UxNiBydGw4MjI1YmNkX3J4Z2FpbltdPXsKKwkweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LCAweDA0MDgsIDB4MDQwOSwKKwkweDA0MGEsIDB4MDQwYiwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1NDAsIDB4MDU0MSwKKwkweDA1NDIsIDB4MDU0MywgMHgwNTQ0LCAweDA1NDUsIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywKKwkweDA1ODQsIDB4MDU4NSwgMHgwNTg4LCAweDA1ODksIDB4MDU4YSwgMHgwNThiLCAweDA2NDMsIDB4MDY0NCwKKwkweDA2NDUsIDB4MDY4MCwgMHgwNjgxLCAweDA2ODIsIDB4MDY4MywgMHgwNjg0LCAweDA2ODUsIDB4MDY4OCwKKwkweDA2ODksIDB4MDY4YSwgMHgwNjhiLCAweDA2OGMsIDB4MDc0MiwgMHgwNzQzLCAweDA3NDQsIDB4MDc0NSwKKwkweDA3ODAsIDB4MDc4MSwgMHgwNzgyLCAweDA3ODMsIDB4MDc4NCwgMHgwNzg1LCAweDA3ODgsIDB4MDc4OSwKKwkweDA3OGEsIDB4MDc4YiwgMHgwNzhjLCAweDA3OGQsIDB4MDc5MCwgMHgwNzkxLCAweDA3OTIsIDB4MDc5MywKKwkweDA3OTQsIDB4MDc5NSwgMHgwNzk4LCAweDA3OTksIDB4MDc5YSwgMHgwNzliLCAweDA3OWMsIDB4MDc5ZCwKKwkweDA3YTAsIDB4MDdhMSwgMHgwN2EyLCAweDA3YTMsIDB4MDdhNCwgMHgwN2E1LCAweDA3YTgsIDB4MDdhOSwKKwkweDA3YWEsIDB4MDdhYiwgMHgwN2FjLCAweDA3YWQsIDB4MDdiMCwgMHgwN2IxLCAweDA3YjIsIDB4MDdiMywKKwkweDA3YjQsIDB4MDdiNSwgMHgwN2I4LCAweDA3YjksIDB4MDdiYSwgMHgwN2JiLCAweDA3YmIKKworfTsKKworCisjaWYgMAordTE2IHJ0bDgyMjViY19yeGdhaW5bXT17CisJMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA4LCAweDA0MDksCisJMHgwNDBhLCAweDA0MGIsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTQwLCAweDA1NDEsCisJMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1ODAsIDB4MDU4MSwgMHgwNTgyLCAweDA1ODMsCisJMHgwNTg0LCAweDA1ODUsIDB4MDU4OCwgMHgwNTg5LCAweDA1OGEsIDB4MDU4YiwgMHgwNjQzLCAweDA2NDQsCisJMHgwNjQ1LCAweDA2ODAsIDB4MDY4MSwgMHgwNjgyLCAweDA2ODMsIDB4MDY4NCwgMHgwNjg1LCAweDA2ODgsCisJMHgwNjg5LCAweDA2OGEsIDB4MDY4YiwgMHgwNjhjLCAweDA3NDIsIDB4MDc0MywgMHgwNzQ0LCAweDA3NDUsCisJMHgwNzgwLCAweDA3ODEsIDB4MDc4MiwgMHgwNzgzLCAweDA3ODQsIDB4MDc4NSwgMHgwNzg4LCAweDA3ODksCisJMHgwNzhhLCAweDA3OGIsIDB4MDc4YywgMHgwNzhkLCAweDA3OTAsIDB4MDc5MSwgMHgwNzkyLCAweDA3OTMsCisJMHgwNzk0LCAweDA3OTUsIDB4MDc5OCwgMHgwNzk5LCAweDAzOWEsIDB4MDM5YiwgMHgwMzljLCAweDAzOWQsCisJMHgwM2EwLCAweDAzYTEsIDB4MDNhMiwgMHgwM2EzLCAweDAzYTQsIDB4MDNhNSwgMHgwM2E4LCAweDAzYTksCisJMHgwM2FhLCAweDAzYWIsIDB4MDNhYywgMHgwM2FkLCAweDAzYjAsIDB4MDNiMSwgMHgwM2IyLCAweDAzYjMsCisJMHgwM2I0LCAweDAzYjUsIDB4MDNiOCwgMHgwM2I5LCAweDAzYmEsIDB4MDNiYiwgMHgwM2JiCisKK307CisKKwordTE2IHJ0bDgyMjVhX3J4Z2FpbltdPXsKKwkweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LCAweDA0MDgsIDB4MDQwOSwKKwkweDA0MGEsIDB4MDQwYiwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1NDAsIDB4MDU0MSwKKwkweDA1NDIsIDB4MDU0MywgMHgwNTQ0LCAweDA1NDUsIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywKKwkweDA1ODQsIDB4MDU4NSwgMHgwNTg4LCAweDA1ODksIDB4MDU4YSwgMHgwNThiLCAweDA2NDMsIDB4MDY0NCwKKwkweDA2NDUsIDB4MDY4MCwgMHgwNjgxLCAweDA2ODIsIDB4MDY4MywgMHgwNjg0LCAweDA2ODUsIDB4MDY4OCwKKwkweDA2ODksIDB4MDY4YSwgMHgwNjhiLCAweDA2OGMsIDB4MDc0MiwgMHgwNzQzLCAweDA3NDQsIDB4MDc0NSwKKwkweDA3ODAsIDB4MDc4MSwgMHgwNzgyLCAweDA3ODMsIDB4MDc4NCwgMHgwNzg1LCAweDA3ODgsIDB4MDc4OSwKKwkweDA3OGEsIDB4MDc4YiwgMHgwNzhjLCAweDA3OGQsIDB4MDc5MCwgMHgwNzkxLCAweDA3OTIsIDB4MDc5MywKKwkweDA3OTQsIDB4MDc5NSwgMHgwNzk4LCAweDA3OTksIDB4MDc5YSwgMHgwNzliLCAweDA3OWMsIDB4MDc5ZCwKKwkweDA3YTAsIDB4MDdhMSwgMHgwN2EyLCAweDA3YTMsIDB4MDdhNCwgMHgwN2E1LCAweDA3YTgsIDB4MDdhOSwKKwkweDA3YWEsIDB4MDdhYiwgMHgwN2FjLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwKKwkweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQKK307CisjZW5kaWYKKwordTggcnRsODIyNV9hZ2NbXT17CisJMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWQsMHg5YywweDliLDB4OWEsMHg5OSwweDk4LDB4OTcsMHg5NiwKKwkweDk1LDB4OTQsMHg5MywweDkyLDB4OTEsMHg5MCwweDhmLDB4OGUsMHg4ZCwweDhjLDB4OGIsMHg4YSwweDg5LDB4ODgsMHg4NywweDg2LAorCTB4ODUsMHg4NCwweDgzLDB4ODIsMHg4MSwweDgwLDB4M2YsMHgzZSwweDNkLDB4M2MsMHgzYiwweDNhLDB4MzksMHgzOCwweDM3LDB4MzYsCisJMHgzNSwweDM0LDB4MzMsMHgzMiwweDMxLDB4MzAsMHgyZiwweDJlLDB4MmQsMHgyYywweDJiLDB4MmEsMHgyOSwweDI4LDB4MjcsMHgyNiwKKwkweDI1LDB4MjQsMHgyMywweDIyLDB4MjEsMHgyMCwweDFmLDB4MWUsMHgxZCwweDFjLDB4MWIsMHgxYSwweDE5LDB4MTgsMHgxNywweDE2LAorCTB4MTUsMHgxNCwweDEzLDB4MTIsMHgxMSwweDEwLDB4MGYsMHgwZSwweDBkLDB4MGMsMHgwYiwweDBhLDB4MDksMHgwOCwweDA3LDB4MDYsCisJMHgwNSwweDA0LDB4MDMsMHgwMiwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKKwkweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorfTsKKworCit1OCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bXT17CisJMHgwMiwweDA2LDB4MGUsMHgxZSwweDNlLDB4N2UKK307CisKKwordTggcnRsODIyNV90eF9wb3dlcl9vZmRtW109eworCTB4ODAsMHg5MCwweGEyLDB4YjUsMHhjYiwweGU0Cit9OworCisKK3U4IHJ0bDgyMjVfdHhfcG93ZXJfY2NrX2NoMTRbXT17CisJMHgxOCwweDE3LDB4MTUsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MWIsMHgxYSwweDE3LDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDFmLDB4MWUsMHgxYSwweDBmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgyMiwweDIxLDB4MWQsMHgxMSwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MjYsMHgyNSwweDIxLDB4MTMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDJiLDB4MmEsMHgyNSwweDE1LDB4MDAsMHgwMCwweDAwLDB4MDAKK307CisKKwordTggcnRsODIyNV90eF9wb3dlcl9jY2tbXT17CisJMHgxOCwweDE3LDB4MTUsMHgxMSwweDBjLDB4MDgsMHgwNCwweDAyLAorCTB4MWIsMHgxYSwweDE3LDB4MTMsMHgwZSwweDA5LDB4MDQsMHgwMiwKKwkweDFmLDB4MWUsMHgxYSwweDE1LDB4MTAsMHgwYSwweDA1LDB4MDIsCisJMHgyMiwweDIxLDB4MWQsMHgxOCwweDExLDB4MGIsMHgwNiwweDAyLAorCTB4MjYsMHgyNSwweDIxLDB4MWIsMHgxNCwweDBkLDB4MDYsMHgwMywKKwkweDJiLDB4MmEsMHgyNSwweDFlLDB4MTYsMHgwZSwweDA3LDB4MDMKK307CisKKwordm9pZCBydGw4MjI1X3NldF9nYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGdhaW4pCit7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDRdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDFdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDJdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDNdKTsKK30KKyNpZiAwCisKK3ZvaWQgcnRsODIyNV9zZXRfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBnYWluKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMikKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDI3KTsKKwllbHNlCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgzNyk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjUsIDB4MjApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHg2KTsKKworCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDgpOworCWVsc2UKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNCwgMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE2LCAwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIDB4NDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIHJ0bDgyMjVfZ2FpbltnYWluICogNF0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgMV0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgMl0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgM10pOworCS8vcnRsODIyNV9zZXRfZ2Fpbl91c2IoZGV2LCBnYWluKTsKK30KKyNlbmRpZgorCisKK3ZvaWQgd3JpdGVfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUxNiBkYXRhKQoreworCWludCBpOworCXUxNiBvdXQsc2VsZWN0OworCXU4IGJpdDsKKwl1MzIgYmFuZ2RhdGEgPSAoZGF0YSA8PCA0KSB8IChhZHIgJiAweGYpOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCW91dCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQpICYgMHhmZmYzOworCisJd3JpdGVfbmljX3dvcmQoZGV2LFJGUGluc0VuYWJsZSwKKwkJKHJlYWRfbmljX3dvcmQoZGV2LFJGUGluc0VuYWJsZSkgfCAweDcpKTsKKworCXNlbGVjdCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8IDB4NyB8CisJCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAwIDogU1dfQ09OVFJPTF9HUElPKSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOICk7Ly98IDB4MWZmZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgyKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisKKwlmb3IoaT0xNTsgaT49MDtpLS0peworCisJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKworCQlpLS07CisJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKworCX0KKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8CisJCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyA0IDogQkJfSE9TVF9CQU5HX0VOKSk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDAgOiBTV19DT05UUk9MX0dQSU8pKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCW1kZWxheSgyKTsKKwllbHNlCisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKK30KKwordm9pZCBydGw4MjI1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfcnRsODIyNShkZXYsIDB4NCwgMHgxZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PRkYpOworCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyMjVfQU5BUEFSQU0yX09GRik7Cit9CisKK3ZvaWQgcnRsODIyNV9TZXRUWFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IEdhaW5JZHg7CisJaW50IEdhaW5TZXR0aW5nOworCWludCBpOworCXU4IHBvd2VyOworCXU4ICpjY2tfcG93ZXJfdGFibGU7CisJdTggbWF4X2Nja19wb3dlcl9sZXZlbDsKKwl1OCBtYXhfb2ZkbV9wb3dlcl9sZXZlbDsKKwl1OCBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKwl1OCBjY2tfcG93ZXJfbGV2ZWwgPSAweGZmICYgcHJpdi0+Y2h0eHB3cltjaF07CisJdTggb2ZkbV9wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyX29mZG1bY2hdOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJCW1heF9jY2tfcG93ZXJfbGV2ZWwgPSAxMTsKKwkJbWF4X29mZG1fcG93ZXJfbGV2ZWwgPSAyNTsgLy8gIDEyIC0+IDI1CisJCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMTA7CisJfWVsc2V7CisJCW1heF9jY2tfcG93ZXJfbGV2ZWwgPSAzNTsKKwkJbWF4X29mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKwkJbWluX29mZG1fcG93ZXJfbGV2ZWwgPSAwOworCX0KKwkvKiBDQ0sgcG93ZXIgc2V0dGluZyAqLworCWlmKGNja19wb3dlcl9sZXZlbCA+IG1heF9jY2tfcG93ZXJfbGV2ZWwpCisJCWNja19wb3dlcl9sZXZlbCA9IG1heF9jY2tfcG93ZXJfbGV2ZWw7CisJR2FpbklkeD1jY2tfcG93ZXJfbGV2ZWwgJSA2OworCUdhaW5TZXR0aW5nPWNja19wb3dlcl9sZXZlbCAvIDY7CisKKwlpZihjaCA9PSAxNCkKKwkJY2NrX3Bvd2VyX3RhYmxlID0gcnRsODIyNV90eF9wb3dlcl9jY2tfY2gxNDsKKwllbHNlCisJCWNja19wb3dlcl90YWJsZSA9IHJ0bDgyMjVfdHhfcG93ZXJfY2NrOworCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24gKXsKKwkJLypWZXIgQiovCisvLwkJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX0NDSywgcnRsODIyNV90eF9nYWluX2Nja19vZmRtW0dhaW5TZXR0aW5nXSk7CisvLwl9ZWxzZXsKKwkJLypWZXIgQyAtIEQgKi8KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fQ0NLLCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bR2FpblNldHRpbmddPj4xKTsKKy8vCX0KKworCWZvcihpPTA7aTw4O2krKyl7CisKKwkJcG93ZXIgPSBjY2tfcG93ZXJfdGFibGVbR2FpbklkeCAqIDggKyBpXTsKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQgKyBpLCBwb3dlcik7CisJfQorCisJLyogRklYTUUgSXMgdGhpcyBkZWxheSByZWFsbHkgbmVlZGVlZCA/ICovCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKKwkvKiBPRkRNIHBvd2VyIHNldHRpbmcgKi8KKy8vICBPbGQ6CisvLwlpZihvZmRtX3Bvd2VyX2xldmVsID4gbWF4X29mZG1fcG93ZXJfbGV2ZWwpCisvLwkJb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OworLy8Jb2ZkbV9wb3dlcl9sZXZlbCArPSBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKy8vICBMYXRlc3Q6CisJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IChtYXhfb2ZkbV9wb3dlcl9sZXZlbCAtIG1pbl9vZmRtX3Bvd2VyX2xldmVsKSkKKwkJb2ZkbV9wb3dlcl9sZXZlbCA9IG1heF9vZmRtX3Bvd2VyX2xldmVsOworCWVsc2UKKwkJb2ZkbV9wb3dlcl9sZXZlbCArPSBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKwlpZihvZmRtX3Bvd2VyX2xldmVsID4gMzUpCisJCW9mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKy8vCisKKwlHYWluSWR4PW9mZG1fcG93ZXJfbGV2ZWwgJSA2OworCUdhaW5TZXR0aW5nPW9mZG1fcG93ZXJfbGV2ZWwgLyA2OworI2lmIDEKKy8vCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCQlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LFJUTDgyMjVfQU5BUEFSQU0yX09OKTsKKworCQl3cml0ZV9waHlfb2ZkbShkZXYsMiwweDQyKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDYsMCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiw4LDApOworLy8JfQorI2VuZGlmCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24peworLy8JCS8qVmVyIEIqLworLy8JCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9PRkRNLCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bR2FpblNldHRpbmddKTsKKy8vCX1lbHNleworCQkvKlZlciBDIC0gRCAqLworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9PRkRNLCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bR2FpblNldHRpbmddPj4xKTsKKy8vCX0KKworCisJcG93ZXIgPSBydGw4MjI1X3R4X3Bvd2VyX29mZG1bR2FpbklkeF07CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NSwgcG93ZXIpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg3LCBwb3dlcik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgVFhfQUdDX0NPTlRST0wsNCk7Cit9CisjaWYgMAorLyogc3dpdGNoIGJldHdlZW4gbW9kZSBCIGFuZCBHICovCit2b2lkIHJ0bDgyMjVfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgbW9kZWIpCit7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAobW9kZWIgPyAweDAgOiAweDQwKSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAobW9kZWIgPyAweDAgOiAweDQwKSk7Cit9CisjZW5kaWYKK3ZvaWQgcnRsODIyNV9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc2hvcnQgZ3NldCA9IChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZTgwMjExX2lzXzU0Zyhwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykpIHx8CisJCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1I7CisKKwlydGw4MjI1X1NldFRYUG93ZXJMZXZlbChkZXYsIGNoKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaF0pOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMTApOworCisJLy8gQSBtb2RlIHNpZnMgMHg0NCwgZGlmcyAzNC0xNCwgc2xvdCA5LCBlaWZzIDIzLCBjd20gMywgY3dNIDcsIGN0c3Rvc2VsZiAweDEwCisJaWYoZ3NldCl7CisJCXdyaXRlX25pY19ieXRlKGRldixTSUZTLDB4MjIpOy8vIFNJRlM6IDB4MjIKKwkJd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsMHgxNCk7IC8vRElGUzogMjAKKwkJLy93cml0ZV9uaWNfYnl0ZShkZXYsRElGUywyMCk7IC8vRElGUzogMjAKKwl9ZWxzZXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFNJRlMsMHg0NCk7Ly8gU0lGUzogMHgyMgorCQl3cml0ZV9uaWNfYnl0ZShkZXYsRElGUyw1MCAtIDE0KTsgLy9ESUZTOiAzNgorCX0KKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZTgwMjExX2lzX3Nob3J0c2xvdChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykpCisJCXdyaXRlX25pY19ieXRlKGRldixTTE9ULDB4OSk7IC8vU0xPVDogOQorCisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsU0xPVCwweDE0KTsgLy9TTE9UOiAyMCAoMHgxNCkKKworCisJaWYoZ3NldCl7CisJCXdyaXRlX25pY19ieXRlKGRldixFSUZTLDgxKTsvLzkxIC0gMjApOyAvLyBFSUZTOiA5MSAoMHg1QikKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENXX1ZBTCwweDczKTsgLy9DVyBWQUxVRTogMHgzNworCQkvL0RNRVNHKCJ1c2luZyBHIG5ldCBwYXJhbXMiKTsKKwl9ZWxzZXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LEVJRlMsODEpOyAvLyBFSUZTOiA5MSAoMHg1QikKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENXX1ZBTCwweGE1KTsgLy9DVyBWQUxVRTogMHgzNworCQkvL0RNRVNHKCJ1c2luZyBCIG5ldCBwYXJhbXMiKTsKKwl9CisKKworfQorCit2b2lkIHJ0bDgyMjVfaG9zdF9wY2lfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDQ4MCk7CisKKwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKKwkvL2lmKHByaXYtPmNhcmRfODE4NSA9PSAyICYmIHByaXYtPmVuYWJsZV9ncGlvMCApIC8qIHZlcnNpb24gRCAqLworCS8vd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4ODgpOworCS8vZWxzZQorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDg4IHwgU1dfQ09OVFJPTF9HUElPKTsgLyogMHg0ODggfCBTV19DT05UUk9MX0dQSU8gKi8KKworCXdyaXRlX25pY19ieXRlKGRldiwgR1BfRU5BQkxFLCAwKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDIwMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEdQX0VOQUJMRSwgMHhmZiAmICh+KDE8PDYpKSk7IC8qIGJpdCA2IGlzIGZvciBSRiBvbi9vZmYgZGV0ZWN0aW9uICovCisKKworfQorCit2b2lkIHJ0bDgyMjVfaG9zdF91c2JfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCSNpZiAwCisJd3JpdGVfbmljX2J5dGUoZGV2LFJGUGluc1NlbGVjdCsxLDApOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQSU8sMCk7CisKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwweDUzLHJlYWRfbmljX2J5dGVfRShkZXYsMHg1MykgfCAoMTw8NykpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LFJGUGluc1NlbGVjdCsxLDQpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQSU8sMHgyMCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsR1BfRU5BQkxFLDApOworCisKKwkvKiBDb25maWcgQkIgJiBSRiAqLworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDgwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDgwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDgwKTsKKworCisJbWRlbGF5KDEwMCk7CisKKwltZGVsYXkoMTAwMCk7CisjZW5kaWYKKworfQorCit2b2lkIHJ0bDgyMjVfcmZfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9ydGw4MjI1KGRldiwweDQsMHhkZmYpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9TTEVFUCk7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfU0xFRVApOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7Cit9CisKK3ZvaWQgcnRsODIyNV9yZl93YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9ydGw4MjI1KGRldiwweDQsMHg5ZmYpOworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT04pOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7Cit9CisKK3ZvaWQgcnRsODIyNV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBpOworCXNob3J0IGNoYW5uZWwgPSAxOworCXUxNiBicnNyOworCisJcHJpdi0+Y2hhbiA9IGNoYW5uZWw7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworCisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQlydGw4MjI1X2hvc3RfdXNiX2luaXQoZGV2KTsKKwllbHNlCisJCXJ0bDgyMjVfaG9zdF9wY2lfaW5pdChkZXYpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweDAwMGE4MDA4KTsKKworCWJyc3IgPSByZWFkX25pY193b3JkKGRldiwgQlJTUik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIDB4ZmZmZik7CisKKwkjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxKXsvKiB2ZXJzaW9uIEMgb3IgQiAqLworCQlpZihwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pICAvKiB2ZXJzaW9uIEIqLworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHg0NCk7CisJCWVsc2UgICAgLyogdmVyc2lvbiBDICovCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDA0NCk7CisJfWVsc2V7IC8qIHZlcnNpb24gRCAqLworCQlpZihwcml2LT5lbmFibGVfZ3BpbzApCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDIwMTAwMDQ0KTsKKwkJZWxzZSAvKiBhbHNvIFVTQiAqLworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDAwNDQpOworCX0KKwkjZW5kaWYKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwMDQ0KTsKKworCSNpZiAxICAvLzAtPjEKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCAweDQ0KTsKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisJI2VuZGlmCisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKXsKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCisJCW1kZWxheSgxMDAwKTsKKwl9CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweDY3KTsgbWRlbGF5KDEpOworCisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgxLCAweGZlMCk7IG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MywgMHg0NDEpOyBtZGVsYXkoMSk7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg0LCAweDQ4Nik7CisJZWxzZQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg0LCAweDhiZSk7CisKKwltZGVsYXkoMSk7CisKKworCSNpZiAwCisJfWVsc2UgaWYocHJpdi0+cGh5X3ZlciA9PSAxKXsKKwkJLyogdmVyc2lvbiBBICovCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YmMwICsgMik7CisJfWVsc2V7CisJI2VuZGlmCisJLyogdmVyc2lvbiBCICYgQyAqLworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHhiYzApOworCWVsc2UgaWYocHJpdi0+Y2FyZF90eXBlID09IE1JTklQQ0kpCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YmMwICsgMyArKDY8PDMpKTsKKwllbHNlCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YmMwICsgKDY8PDMpKTsKKworCSBtZGVsYXkoMSk7CisvLwl9CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg2LCAweGFlNik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpPyAweDgyYSA6IHJ0bDgyMjVfY2hhbltjaGFubmVsXSkpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4OCwgMHgxZik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg5LCAweDMzNCk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhhLCAweGZkNCk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhiLCAweDM5MSk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhjLCAweDUwKTsgIG1kZWxheSgxKTsKKworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4ZCwgMHg2ZGIpOyAgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGUsIDB4MjkpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4ZiwgMHg5MTQpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJCS8vZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEwMCk7CisJfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHhjNGQpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJLy8JZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDIwMCk7CisKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworCisJLy8JZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEwMCk7CisKKwl9Ly9FbmQgb2YgaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkvKiBGSVhNRSEhIHJ0bDgxODcgd2UgaGF2ZSB0byBjaGVjayBpZiBjYWxpYnJhcmlvbgorCSAqIGlzIHN1Y2Nlc3NmdWwgYW5kIGV2ZW50dWFsbHkgY2FsLiBhZ2FpbiAocmVwZWF0CisJICogdGhlIHR3byB3cml0ZSBvbiByZWcgMikKKwkqLworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisKKwltZGVsYXkoMTAwKTsgLy8yMDAgZm9yIDgxODcKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikgLyogbWF5YmUgbm90IG5lZWRlZCBldmVuIGZvciA4MTg1ICovCisvLwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hhbm5lbF0pOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgxMjcpOworCisJZm9yKGk9MDtpPDk1O2krKyl7CisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDEsICh1OCkoaSsxKSk7CisKKwkJI2lmIDAKKwkJaWYocHJpdi0+cGh5X3ZlciA9PSAxKQorCQkJLyogdmVyc2lvbiBBICovCisJCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCBydGw4MjI1YV9yeGdhaW5baV0pOworCQllbHNlCisJCSNlbmRpZgorCQkvKiB2ZXJzaW9uIEIgJiBDICYgRCovCisKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgcnRsODIyNWJjZF9yeGdhaW5baV0pOworCX0KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MjcpOworCisKKy8vCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQil7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaGFubmVsXSk7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0N2QpOworLy8KKy8vCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworLy8JCW1kZWxheSgxMDApOworLy8KKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7CisvLwkvL30KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MjJmKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworCWZvcihpPTA7aTwxMjg7aSsrKXsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIHJ0bDgyMjVfYWdjW2ldKTsKKworCQltZGVsYXkoMSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAodTgpaSsgMHg4MCk7CisKKwkJbWRlbGF5KDEpOworCX0KKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MSwgMHgyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpPyAweDQyIDogMHg2MikpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDMsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NCwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg1LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4NDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDcsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OCwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OSwgMHhmZSk7IG1kZWxheSgxKTsKKworCSNpZiAwCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDkpOworCX1lbHNleworCQlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24peworCQkJLyogVmVyIEIKKwkJCSogbWF5YmUgbGF0ZXIgdmVyc2lvbiBjYW4gYWNjZXB0IHRoaXMgYWxzbz8KKwkJCSovCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg2KTsKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHg2Zik7CisJCX1lbHNleworCSNlbmRpZgorCQkJLyogdmVyIEMgJiBEICovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4OSk7IG1kZWxheSgxKTsKKworCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsKKwkvLwl9CisJLy99CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4ODApOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YywgMHgxKTttZGVsYXkoMSk7CisKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHhkLCAweDMzKTsgLy8gPD4KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhlLCAweGQzKTttZGVsYXkoMSk7CisKKworCSNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEpeworCQlpZihwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyMCk7Lyp2ZXIgQiovCisJCWVsc2UKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDI4KTsvKnZlciBDKi8KKwl9ZWxzZXsKKwkjZW5kaWYKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgzOCk7bWRlbGF5KDEpOworLyp2ZXIgRCAmIDgxODcqLworLy8JfQorCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEwLCAweDA0KTsvKnZlciBCKi8KKy8vCWVsc2UKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4ODQpO21kZWxheSgxKTsKKy8qdmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4MDYpO21kZWxheSgxKTsKKy8qYWdjIHJlc3AgdGltZSA3MDAqLworCisKKy8vCWlmKHByaXYtPmNhcmRfODE4NSA9PSAyKXsKKwkvKiBWZXIgRCAmIDgxODcqLworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgyMCk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEzLCAweDIwKTttZGVsYXkoMSk7CisKKyNpZiAwCisJfWVsc2V7CisJCS8qIFZlciBCICYgQyovCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEzLCAweDApOworCX0KKyNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNCwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTYsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOyBtZGVsYXkoMSk7CisKKy8vCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpO21kZWxheSgxKTsKKworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE5LCAweDE5KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYSwgMHgyMCk7IG1kZWxheSgxKTsKKworLy8JaWYgKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpeworLy8JCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKy8vCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCAweDY2KTsgLyogVmVyIEIgKi8KKy8vCQllbHNlCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCAweDc2KTttZGVsYXkoMSk7CisgLyogVmVyIEMgJiBEICovIC8vRklYTUU6TUFZQkUgbm90IG5lZWRlZAorLy8JfQorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFjLCAweDQpO21kZWxheSgxKTsKKworI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSl7CisJCWlmKHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbil7CisJCQkvKnZlciBCKi8KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZSwgMHg5NSk7CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWYsIDB4NTUpOworCQl9ZWxzZXsKKwkJCS8qdmVyIEMqLworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFlLCAweDkwKTsKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZiwgMHgzNCk7CisKKwkJfQorCX1lbHNleworI2VuZGlmCisJCS8qdmVyIEQgJiA4MTg3Ki8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWUsIDB4OTUpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZiwgMHg3NSk7CW1kZWxheSgxKTsKKworLy8JfQorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIwLCAweDFmKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MjcpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMiwgMHgxNik7bWRlbGF5KDEpOworCisvLwlpZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCAweDQzKTsgLy9GSVhNRSBtYXliZSBub3QgbmVlZGVkIC8vIDw+CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4NDYpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI1LCAweDIwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHg5MCk7IG1kZWxheSgxKTsKKyNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4MDgpOyAvKiBWZXIgQi4gbWlnaHQgd29yayBhbHNvIGZvIHZlciBDJkQgPyovCisJZWxzZQorI2VuZGlmCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsgbWRlbGF5KDEpOworLyogVmVyIEMgJiBEICYgODE4NyovCisKKwkvLyA8PiBTZXQgaW5pdC4gZ2FpbiB0byBtNzRkQm0uCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDQzKTsJIG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIDB4NzYpOwkgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgMHhjNSk7CSBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCAweDc4KTsJIG1kZWxheSgxKTsKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQik7CisJLy8JcnRsODIyNV9zZXRfZ2Fpbl91c2IoZGV2LCAxKTsgLyogRklYTUUgdGhpcyAnMicgaXMgcmFuZG9tICovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgwLCAweDk4KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDMsIDB4MjApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NCwgMHg3ZSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg1LCAweDEyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDYsIDB4ZmMpOyBtZGVsYXkoMSk7CisjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4NywgMHhkOCk7IC8qIFZlciBCICovCisJZWxzZQorI2VuZGlmCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NywgMHg3OCk7bWRlbGF5KDEpOworIC8qIFZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4OCwgMHgyZSk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAweDliOiAweDkzKSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMiwgMHg0Nyk7IG1kZWxheSgxKTsKKyNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHg5OCk7IC8qIFZlciBCICovCisJZWxzZQorI2VuZGlmCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4ZDApOyAvKiBWZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDE5LCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDFhLCAweGEwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxYiwgMHg4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MCwgMHg4Nik7IC8qIENDSyBDYXJyaWVyIFNlbnNlIFRocmVzaG9sZCAqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OGQpO21kZWxheSgxKTsKKworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDIsIDB4MTUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDMsIDB4MTgpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQsIDB4MWYpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDUsIDB4MWUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDYsIDB4MWEpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDcsIDB4MTUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDgsIDB4MTApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDksIDB4YSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YSwgMHg1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRiLCAweDIpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGMsIDB4NSk7bWRlbGF5KDEpOworCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NWIsIDB4MGQpOyBtZGVsYXkoMSk7CisKKworCisvLyA8PgorLy8JLy8gVEVTVFIgMHhiIDgxODcKKy8vCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweDkzKTsvLyAmIDB4ZmIpOworLy8KKy8vCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQil7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIsIDB4NjIpOworLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg2LCAweDApOworLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg4LCAweDApOworLy8JLy99CisKKwlydGw4MjI1X1NldFRYUG93ZXJMZXZlbChkZXYsIGNoYW5uZWwpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OWIpOyBtZGVsYXkoMSk7IC8qIFJ4IGFudCBBLCAweGRiIGZvciBCICovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI2LCAweDkwKTsgbWRlbGF5KDEpOyAvKiBSeCBhbnQgQSwgMHgxMCBmb3IgQiAqLworCisJcnRsODE4NV90eF9hbnRlbm5hKGRldiwgMHgzKTsgLyogVFggYW50IEEsIDB4MCBmb3IgQiAqLworCisJLyogc3dpdGNoIHRvIGhpZ2gtc3BlZWQgMy13aXJlCisJICogbGFzdCBkaWdpdC4gMiBmb3IgYm90aCBjY2sgYW5kIG9mZG0KKwkgKi8KKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDNkYzAwMDAyKTsKKwllbHNleworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCX0KKworLy8JaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKy8vCXJ0bDgyMjVfc2V0X2dhaW4oZGV2LCA0KTsgLyogRklYTUUgdGhpcyAnMScgaXMgcmFuZG9tICovIC8vIDw+CisvLwkgcnRsODIyNV9zZXRfbW9kZShkZXYsIDEpOyAvKiBGSVhNRSBzdGFydCBpbiBCIG1vZGUgKi8gLy8gPD4KKy8vCisvLwkvKiBtYWtlIHN1cmUgaXMgd2FrZW4gdXAhICovCisvLwl3cml0ZV9ydGw4MjI1KGRldiwweDQsIDB4OWZmKTsKKy8vCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisvLwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PTik7CisKKwlydGw4MjI1X3JmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsQlJTUixicnNyKTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThkZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODIyNQorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKyNpbmNsdWRlICJyODE4MC5oIgorCisjZGVmaW5lIFJUTDgyMjVfQU5BUEFSQU1fT04gIDB4YTAwMDBiNTkKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTV9PRkYgMHhhMDBiZWI1OQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNMl9PRkYgMHg4NDBkZWMxMQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNMl9PTiAgMHg4NjBkZWMxMQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNX1NMRUVQIDB4YTAwYmFiNTkKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTTJfU0xFRVAgMHg4NDBkZWMxMQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCit2b2lkIHJ0bDgyMjV6Ml9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1ejJfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHJ0bDgyMjV6Ml9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MjI1X2hvc3RfcGNpX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjVfaG9zdF91c2JfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCB3cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpOwordm9pZCBSRl9Xcml0ZVJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBvZmZzZXQsIHUzMglkYXRhKTsKK3UzMiBSRl9SZWFkUmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG9mZnNldCk7CisjZW5kaWYKK3ZvaWQgcnRsODIyNV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1X3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOwordm9pZCBydGw4MjI1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1X3JmX3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1X3JmX3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBtb2RlKTsKK3ZvaWQgcnRsODE4MF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBtb2RlKTsKK2Jvb2wgU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsUlRfUkZfUE9XRVJfU1RBVEUgIGVSRlBvd2VyU3RhdGUpOwordm9pZCBydGw4MjI1ejRfcmZfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjV6NF9yZl93YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTU3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCkBAIC0wLDAgKzEsMTU4NyBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODIyNQorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3J0bDgyMjUuaCIKKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKworZXh0ZXJuIHU4IHJ0bDgyMjVfYWdjW107CisKK2V4dGVybiB1MzIgcnRsODIyNV9jaGFuW107CisKKy8vMjAwNS4xMS4xNgordTggcnRsODIyNXoyX3RocmVzaG9sZFtdPXsKKyAgICAgICAgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg5ZCwgMHhhZCwgMHhiZCwKK307CisKKy8vICAgICAgMHhkIDB4MTkgMHgxYiAweDIxCit1OCBydGw4MjI1ejJfZ2Fpbl9iZ1tdPXsKKwkweDIzLCAweDE1LCAweGE1LCAvLyAtODItMWRibQorICAgICAgICAweDIzLCAweDE1LCAweGI1LCAvLyAtODItMmRibQorICAgICAgICAweDIzLCAweDE1LCAweGM1LCAvLyAtODItM2RibQorICAgICAgICAweDMzLCAweDE1LCAweGM1LCAvLyAtNzhkYm0KKyAgICAgICAgMHg0MywgMHgxNSwgMHhjNSwgLy8gLTc0ZGJtCisgICAgICAgIDB4NTMsIDB4MTUsIDB4YzUsIC8vIC03MGRibQorICAgICAgICAweDYzLCAweDE1LCAweGM1LCAvLyAtNjZkYm0KK307CisKK3U4IHJ0bDgyMjV6Ml9nYWluX2FbXT17CisJMHgxMywweDI3LDB4NWEsLy8sMHgzNywvLyAtODJkYm0KKwkweDIzLDB4MjMsMHg1OCwvLywweDM3LC8vIC04MmRibQorCTB4MzMsMHgxZiwweDU2LC8vLDB4MzcsLy8gLTgyZGJtCisJMHg0MywweDFiLDB4NTQsLy8sMHgzNywvLyAtNzhkYm0KKwkweDUzLDB4MTcsMHg1MSwvLywweDM3LC8vIC03NGRibQorCTB4NjMsMHgyNCwweDRmLC8vLDB4MzcsLy8gLTcwZGJtCisJMHg3MywweDBmLDB4NGMsLy8sMHgzNywvLyAtNjZkYm0KK307CisjaWYgMAordTMyIHJ0bDgyMjVfY2hhbltdID0geworCTAsCS8vZHVtbXkgY2hhbm5lbCAwCisJMHgwODVjLCAvLzEKKwkweDA4ZGMsIC8vMgorCTB4MDk1YywgLy8zCisJMHgwOWRjLCAvLzQKKwkweDBhNWMsIC8vNQorCTB4MGFkYywgLy82CisJMHgwYjVjLCAvLzcKKwkweDBiZGMsIC8vOAorCTB4MGM1YywgLy85CisJMHgwY2RjLCAvLzEwCisJMHgwZDVjLCAvLzExCisJMHgwZGRjLCAvLzEyCisJMHgwZTVjLCAvLzEzCisJLy8weDBmNWMsIC8vMTQKKwkweDBmNzIsIC8vIDE0Cit9OworI2VuZGlmCisKKy8vLQordTE2IHJ0bDgyMjV6Ml9yeGdhaW5bXT17CisJMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA4LCAweDA0MDksCisJMHgwNDBhLCAweDA0MGIsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTQwLCAweDA1NDEsCisJMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1ODAsIDB4MDU4MSwgMHgwNTgyLCAweDA1ODMsCisJMHgwNTg0LCAweDA1ODUsIDB4MDU4OCwgMHgwNTg5LCAweDA1OGEsIDB4MDU4YiwgMHgwNjQzLCAweDA2NDQsCisJMHgwNjQ1LCAweDA2ODAsIDB4MDY4MSwgMHgwNjgyLCAweDA2ODMsIDB4MDY4NCwgMHgwNjg1LCAweDA2ODgsCisJMHgwNjg5LCAweDA2OGEsIDB4MDY4YiwgMHgwNjhjLCAweDA3NDIsIDB4MDc0MywgMHgwNzQ0LCAweDA3NDUsCisJMHgwNzgwLCAweDA3ODEsIDB4MDc4MiwgMHgwNzgzLCAweDA3ODQsIDB4MDc4NSwgMHgwNzg4LCAweDA3ODksCisJMHgwNzhhLCAweDA3OGIsIDB4MDc4YywgMHgwNzhkLCAweDA3OTAsIDB4MDc5MSwgMHgwNzkyLCAweDA3OTMsCisJMHgwNzk0LCAweDA3OTUsIDB4MDc5OCwgMHgwNzk5LCAweDA3OWEsIDB4MDc5YiwgMHgwNzljLCAweDA3OWQsCisJMHgwN2EwLCAweDA3YTEsIDB4MDdhMiwgMHgwN2EzLCAweDA3YTQsIDB4MDdhNSwgMHgwN2E4LCAweDA3YTksCisJMHgwM2FhLCAweDAzYWIsIDB4MDNhYywgMHgwM2FkLCAweDAzYjAsIDB4MDNiMSwgMHgwM2IyLCAweDAzYjMsCisJMHgwM2I0LCAweDAzYjUsIDB4MDNiOCwgMHgwM2I5LCAweDAzYmEsIDB4MDNiYiwgMHgwM2JiCisKK307CisKKy8vMjAwNS4xMS4xNiwKK3U4IFpFQlJBMl9DQ0tfT0ZETV9HQUlOX1NFVFRJTkdbXT17CisgICAgICAgIDB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNCwweDA1LAorICAgICAgICAweDA2LDB4MDcsMHgwOCwweDA5LDB4MGEsMHgwYiwKKyAgICAgICAgMHgwYywweDBkLDB4MGUsMHgwZiwweDEwLDB4MTEsCisgICAgICAgIDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LAorICAgICAgICAweDE4LDB4MTksMHgxYSwweDFiLDB4MWMsMHgxZCwKKyAgICAgICAgMHgxZSwweDFmLDB4MjAsMHgyMSwweDIyLDB4MjMsCit9OworCisjaWYgMAorLy8tCit1OCBydGw4MjI1X2FnY1tdPXsKKwkweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZCwweDljLDB4OWIsMHg5YSwweDk5LDB4OTgsMHg5NywweDk2LAorCTB4OTUsMHg5NCwweDkzLDB4OTIsMHg5MSwweDkwLDB4OGYsMHg4ZSwweDhkLDB4OGMsMHg4YiwweDhhLDB4ODksMHg4OCwweDg3LDB4ODYsCisJMHg4NSwweDg0LDB4ODMsMHg4MiwweDgxLDB4ODAsMHgzZiwweDNlLDB4M2QsMHgzYywweDNiLDB4M2EsMHgzOSwweDM4LDB4MzcsMHgzNiwKKwkweDM1LDB4MzQsMHgzMywweDMyLDB4MzEsMHgzMCwweDJmLDB4MmUsMHgyZCwweDJjLDB4MmIsMHgyYSwweDI5LDB4MjgsMHgyNywweDI2LAorCTB4MjUsMHgyNCwweDIzLDB4MjIsMHgyMSwweDIwLDB4MWYsMHgxZSwweDFkLDB4MWMsMHgxYiwweDFhLDB4MTksMHgxOCwweDE3LDB4MTYsCisJMHgxNSwweDE0LDB4MTMsMHgxMiwweDExLDB4MTAsMHgwZiwweDBlLDB4MGQsMHgwYywweDBiLDB4MGEsMHgwOSwweDA4LDB4MDcsMHgwNiwKKwkweDA1LDB4MDQsMHgwMywweDAyLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorCTB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCit9OworI2VuZGlmCisvKgorIGZyb20gMCB0byAweDIzCit1OCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bXT17CisJMHgwMiwweDA2LDB4MGUsMHgxZSwweDNlLDB4N2UKK307CisqLworCisvLy0KK3U4IHJ0bDgyMjV6Ml90eF9wb3dlcl9vZmRtW109eworCTB4NDIsMHgwMCwweDQwLDB4MDAsMHg0MAorfTsKKworCisvLy0KK3U4IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tfY2gxNFtdPXsKKwkweDM2LDB4MzUsMHgyZSwweDFiLDB4MDAsMHgwMCwweDAwLDB4MDAKK307CisKKworLy8tCit1OCBydGw4MjI1ejJfdHhfcG93ZXJfY2NrW109eworCTB4MzYsMHgzNSwweDJlLDB4MjUsMHgxYywweDEyLDB4MDksMHgwNAorfTsKKworCit2b2lkIHJ0bDgyMjV6Ml9zZXRfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBnYWluKQoreworCXU4KiBydGw4MjI1X2dhaW47CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJdTggbW9kZSA9IHByaXYtPmllZWU4MDIxMS0+bW9kZTsKKworCWlmKG1vZGUgPT0gSUVFRV9CIHx8IG1vZGUgPT0gSUVFRV9HKQorCQlydGw4MjI1X2dhaW4gPSBydGw4MjI1ejJfZ2Fpbl9iZzsKKwllbHNlCisJCXJ0bDgyMjVfZ2FpbiA9IHJ0bDgyMjV6Ml9nYWluX2E7CisKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgcnRsODIyNV9nYWluW2dhaW4gKiAzXSk7CisJLy93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTksIHJ0bDgyMjVfZ2FpbltnYWluICogMyArIDFdKTsKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODIyNV9nYWluW2dhaW4gKiAzICsgMl0pOworICAgICAgICAvLzIwMDUuMTEuMTcsIGJ5IGNoLWhzdQorICAgICAgICB3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGIsIHJ0bDgyMjVfZ2FpbltnYWluICogM10pOworICAgICAgICB3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2FpbltnYWluICogMyArIDFdKTsKKyAgICAgICAgd3JpdGVfcGh5X29mZG0oZGV2LCAweDFkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDMgKyAyXSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDM3KTsKKworfQorCisjaWYgMAorCit2b2lkIHJ0bDgyMjVfc2V0X2dhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgZ2FpbikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDIpCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgyNyk7CisJZWxzZQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MzcpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI1LCAweDIwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nik7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4KTsKKwllbHNlCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4OCk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTQsIDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNiwgMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDRdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDFdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDJdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDNdKTsKKwkvL3J0bDgyMjVfc2V0X2dhaW5fdXNiKGRldiwgZ2Fpbik7Cit9CisjZW5kaWYKKwordTMyIHJlYWRfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIpCit7CisJdTMyIGRhdGEyV3JpdGUgPSAoKHUzMikoYWRyICYgMHgxZikpIDw8IDI3OworCXUzMiBkYXRhUmVhZDsKKwl1MzIgbWFzazsKKwl1MTYgb3ZhbCxvdmFsMixvdmFsMyx0bXA7CisvLwlUaHJlZVdpcmVSZWcgdHdyZWc7CisvLwlUaHJlZVdpcmVSZWcgdGRhdGE7CisJaW50IGk7CisJc2hvcnQgYml0LCBydzsKKworCXU4IHdMZW5ndGggPSA2OworCXU4IHJMZW5ndGggPSAxMjsKKwl1OCBsb3cyaGlnaCA9IDA7CisKKwlvdmFsID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCk7CisJb3ZhbDIgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlKTsKKwlvdmFsMyA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIChvdmFsMnwweGYpKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgKG92YWwzfDB4ZikpOworCisJZGF0YVJlYWQgPSAwOworCisJb3ZhbCAmPSB+MHhmOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWwgfCBCQl9IT1NUX0JBTkdfRU4gKTsgdWRlbGF5KDQpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWwgKTsgdWRlbGF5KDUpOworCisJcncgPSAwOworCisJbWFzayA9IChsb3cyaGlnaCkgPyAweDAxIDogKCgodTMyKTB4MDEpPDwoMzItMSkpOworCWZvcihpID0gMDsgaSA8IHdMZW5ndGgvMjsgaSsrKQorCXsKKwkJYml0ID0gKChkYXRhMldyaXRlJm1hc2spICE9IDApID8gMSA6IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IHJ3KTsgdWRlbGF5KDEpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IEJCX0hPU1RfQkFOR19DTEsgfCBydyk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdHxvdmFsIHwgQkJfSE9TVF9CQU5HX0NMSyB8IHJ3KTsgdWRlbGF5KDIpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpOiAobWFzaz4+MSk7CisKKwkJaWYoaSA9PSAyKQorCQl7CisJCQlydyA9IEJCX0hPU1RfQkFOR19SVzsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IEJCX0hPU1RfQkFOR19DTEsgfCBydyk7IHVkZWxheSgyKTsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IHJ3KTsgdWRlbGF5KDIpOworCQkJYnJlYWs7CisJCX0KKworCQliaXQgPSAoKGRhdGEyV3JpdGUmbWFzaykgIT0gMCkgPyAxOiAwOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdmFsfGJpdHxyd3wgQkJfSE9TVF9CQU5HX0NMSyk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWx8Yml0fHJ3fCBCQl9IT1NUX0JBTkdfQ0xLKTsgdWRlbGF5KDIpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdmFsfCBiaXQgfHJ3KTsgdWRlbGF5KDEpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpIDogKG1hc2s+PjEpOworCX0KKworCS8vdHdyZWcuc3RydWMuY2xrID0gMDsKKwkvL3R3cmVnLnN0cnVjLmRhdGEgPSAwOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsKTsgdWRlbGF5KDIpOworCW1hc2sgPSAobG93MmhpZ2gpID8gMHgwMSA6ICgoKHUzMikweDAxKSA8PCAoMTItMSkpOworCisJLy8gV2UgbXVzdCBzZXQgZGF0YSBwaW4gdG8gSFcgY29udHJvbGVkLCBvdGhlcndpc2UgUkYgY2FuJ3QgZHJpdmVyIGl0IGFuZAorCS8vIHZhbHVlIFJGIHJlZ2lzdGVyIHdvbid0IGJlIGFibGUgdG8gcmVhZCBiYWNrIHByb3Blcmx5LiAyMDA2LjA2LjEzLCBieSByY25qa28uCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIChvdmFsMiAmICh+MHgwMSkpKTsKKworCWZvcihpID0gMDsgaSA8IHJMZW5ndGg7IGkrKykKKwl7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsKTsgdWRlbGF5KDEpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsfEJCX0hPU1RfQkFOR19DTEspOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsfEJCX0hPU1RfQkFOR19DTEspOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsfEJCX0hPU1RfQkFOR19DTEspOyB1ZGVsYXkoMik7CisJCXRtcCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNJbnB1dCk7CisKKwkJZGF0YVJlYWQgfD0gKHRtcCAmIEJCX0hPU1RfQkFOR19DTEsgPyBtYXNrIDogMCk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIChyd3xvdmFsKSk7IHVkZWxheSgyKTsKKworCQltYXNrID0gKGxvdzJoaWdoKSA/IChtYXNrPDwxKSA6IChtYXNrPj4xKTsKKwl9CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgQkJfSE9TVF9CQU5HX0VOfEJCX0hPU1RfQkFOR19SV3xvdmFsKTsgdWRlbGF5KDIpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIG92YWwyKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgb3ZhbDMpOyAgIC8vIFNldCBUbyBTVyBTd2l0Y2gKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHgzYTApOworCisJcmV0dXJuIGRhdGFSZWFkOworCit9CisjaWYgMAordm9pZCB3cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpCit7CisJaW50IGk7CisJdTE2IG91dCxzZWxlY3Q7CisJdTggYml0OworCXUzMiBiYW5nZGF0YSA9IChkYXRhIDw8IDQpIHwgKGFkciAmIDB4Zik7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlLAorCQkocmVhZF9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlKSB8IDB4NykpOworCisJc2VsZWN0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgMHg3IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDAgOiBTV19DT05UUk9MX0dQSU8pKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4gKTsvL3wgMHgxZmZmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDIpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKworCWZvcihpPTE1OyBpPj0wO2ktLSl7CisKKwkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCisJCWktLTsKKwkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCisJfQorCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDQgOiBCQl9IT1NUX0JBTkdfRU4pKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfAorCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMCA6IFNXX0NPTlRST0xfR1BJTykpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJbWRlbGF5KDIpOworCWVsc2UKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworfQorCisjZW5kaWYKK3Nob3J0IHJ0bDgyMjVfaXNfVl96MihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IHZ6MiA9IDE7CisJLy9pbnQgaTsKKwkvKiBzdyB0byByZWcgcGcgMSAqLworCS8vd3JpdGVfcnRsODIyNShkZXYsIDAsIDB4MWI3KTsKKwkvL3dyaXRlX3J0bDgyMjUoZGV2LCAwLCAweDBiNyk7CisKKwkvKiByZWcgOCBwZyAxID0gMjMqLworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiUkYgUmlnaXN0ZXJzOlxuIik7CisjaWYgMAorCWZvcihpID0gMDsgaSA8PSAweGY7IGkrKykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJTA4eCwiLCByZWFkX3J0bDgyMjUoZGV2LCBpKSk7CisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJyZWdbOV1AcGcxID0gMHgleFxuIiwgcmVhZF9ydGw4MjI1KGRldiwgMHgwRikpOworCisvLwlwcmludGsoS0VSTl9XQVJOSU5HICJSRjpcbiIpOworI2VuZGlmCisJaWYoIHJlYWRfcnRsODIyNShkZXYsIDgpICE9IDB4NTg4KQorCQl2ejIgPSAwOworCisJZWxzZQkvKiByZWcgOSBwZyAxID0gMjQgKi8KKwkJaWYoIHJlYWRfcnRsODIyNShkZXYsIDkpICE9IDB4NzAwKQorCQkJdnoyID0gMDsKKworCS8qIHN3IGJhY2sgdG8gcGcgMCAqLworCXdyaXRlX3J0bDgyMjUoZGV2LCAwLCAweGI3KTsKKworCXJldHVybiB2ejI7CisKK30KKworI2lmIDAKK3ZvaWQgcnRsODIyNV9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDQsIDB4MWYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT0ZGKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PRkYpOworfQorI2VuZGlmCisjaWYgMAorc2hvcnQgcnRsODIyNV9yZl9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBzZW5zKQoreworCWlmIChzZW5zIDwwIHx8IHNlbnMgPiA2KSByZXR1cm4gLTE7CisKKwlpZihzZW5zID4gNCkKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MGMsIDB4ODUwKTsKKwllbHNlCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDBjLCAweDUwKTsKKworCXNlbnM9IDYtc2VuczsKKwlydGw4MjI1X3NldF9nYWluKGRldiwgc2Vucyk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgcnRsODIyNV90aHJlc2hvbGRbc2Vuc10pOworCXJldHVybiAwOworCit9CisjZW5kaWYKKworCit2b2lkIHJ0bDgyMjV6Ml9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDFmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1ejJfQU5BUEFSQU1fT0ZGKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1ejJfQU5BUEFSQU0yX09GRik7Cit9CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisvLworLy8JRGVzY3JpcHRpb246CisvLwkJTWFwIGRCbSBpbnRvIFR4IHBvd2VyIGluZGV4IGFjY29yZGluZyB0bworLy8JCWN1cnJlbnQgSFcgbW9kZWwsIGZvciBleGFtcGxlLCBSRiBhbmQgUEEsIGFuZAorLy8JCWN1cnJlbnQgd2lyZWxlc3MgbW9kZS4KKy8vCitzOAorRGJtVG9UeFB3cklkeCgKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwKKwlXSVJFTEVTU19NT0RFCVdpcmVsZXNzTW9kZSwKKwlzMzIJCQlQb3dlckluRGJtCisJKQoreworIAlib29sIGJVc2VEZWZhdWx0ID0gdHJ1ZTsKKwlzOCBUeFB3cklkeCA9IDA7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8KKwkvLyAwNzEwMTEsIFNEMyBTWToKKwkvLyBPRkRNIFBvd2VyIGluIGRCbSA9IEluZGV4ICogMC41ICsgMAorCS8vIENDSyBQb3dlciBpbiBkQm0gPSBJbmRleCAqIDAuMjUgKyAxMworCS8vCisJaWYocHJpdi0+Y2FyZF84MTg1ID49IFZFUlNJT05fODE4N1NfQikKKwl7CisJCXMzMiB0bXAgPSAwOworCisJCWlmKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0cpCisJCXsKKwkJCWJVc2VEZWZhdWx0ID0gZmFsc2U7CisJCQl0bXAgPSAoMiAqIFBvd2VySW5EYm0pOworCisJCQlpZih0bXAgPCAwKQorCQkJCVR4UHdySWR4ID0gMDsKKwkJCWVsc2UgaWYodG1wID4gNDApIC8vIDQwIG1lYW5zIDIwIGRCbS4KKwkJCQlUeFB3cklkeCA9IDQwOworCQkJZWxzZQorCQkJCVR4UHdySWR4ID0gKHM4KXRtcDsKKwkJfQorCQllbHNlIGlmKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpCisJCXsKKwkJCWJVc2VEZWZhdWx0ID0gZmFsc2U7CisJCQl0bXAgPSAoNCAqIFBvd2VySW5EYm0pIC0gNTI7CisKKwkJCWlmKHRtcCA8IDApCisJCQkJVHhQd3JJZHggPSAwOworCQkJZWxzZSBpZih0bXAgPiAyOCkgLy8gMjggbWVhbnMgMjAgZEJtLgorCQkJCVR4UHdySWR4ID0gMjg7CisJCQllbHNlCisJCQkJVHhQd3JJZHggPSAoczgpdG1wOworCQl9CisJfQorI2VuZGlmCisKKwkvLworCS8vIFRSVUUgaWYgd2Ugd2FudCB0byB1c2UgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorCS8vIFdlIHNoYWxsIHNldCBpdCB0byBGQUxTRSB3aGVuIHdlIGhhdmUgZXhhY3QgdHJhbnNsYXRpb24gZm9ybXVsYXIKKwkvLyBmb3IgdGFyZ2V0IElDLiAwNzA2MjIsIGJ5IHJjbmprby4KKwkvLworCWlmKGJVc2VEZWZhdWx0KQorCXsKKwkJaWYoUG93ZXJJbkRibSA8IDApCisJCQlUeFB3cklkeCA9IDA7CisJCWVsc2UgaWYoUG93ZXJJbkRibSA+IDM1KQorCQkJVHhQd3JJZHggPSAzNTsKKwkJZWxzZQorCQkJVHhQd3JJZHggPSAodTgpUG93ZXJJbkRibTsKKwl9CisKKwlyZXR1cm4gVHhQd3JJZHg7Cit9CisjZW5kaWYKKwordm9pZCBydGw4MjI1ejJfU2V0VFhQb3dlckxldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworLy8JaW50IEdhaW5JZHg7CisvLwlpbnQgR2FpblNldHRpbmc7CisJLy9pbnQgaTsKKwkvL3U4IHBvd2VyOworCS8vdTggKmNja19wb3dlcl90YWJsZTsKKwl1OCBtYXhfY2NrX3Bvd2VyX2xldmVsOworCS8vdTggbWluX2Nja19wb3dlcl9sZXZlbDsKKwl1OCBtYXhfb2ZkbV9wb3dlcl9sZXZlbDsKKwl1OCBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKy8vCXU4IGNja19wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsvLy1ieSBhbXkgMDgwMzEyCisvLwl1OCBvZmRtX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3Jfb2ZkbVtjaF07Ly8tYnkgYW15IDA4MDMxMgorCWNoYXIgY2NrX3Bvd2VyX2xldmVsID0gKGNoYXIpKDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXSk7Ly8rYnkgYW15IDA4MDMxMgorCWNoYXIgb2ZkbV9wb3dlcl9sZXZlbCA9IChjaGFyKSgweGZmICYgcHJpdi0+Y2h0eHB3cl9vZmRtW2NoXSk7Ly8rYnkgYW15IDA4MDMxMgorI2lmIDAKKwkvLworCS8vIENDWCAyIFMzMSwgQVAgY29udHJvbCBvZiBjbGllbnQgdHJhbnNtaXQgcG93ZXI6CisJLy8gMS4gV2Ugc2hhbGwgbm90IGV4Y2VlZCBDZWxsIFBvd2VyIExpbWl0IGFzIHBvc3NpYmxlIGFzIHdlIGNhbi4KKwkvLyAyLiBUb2xlcmFuY2UgaXMgKy8tIDVkQi4KKwkvLyAzLiA4MDIuMTFoIFBvd2VyIENvbnRyYWludCB0YWtlcyBoaWdoZXIgcHJlY2VkZW5jZSBvdmVyIENDWCBDZWxsIFBvd2VyIExpbWl0LgorCS8vCisJLy8gVE9ETzoKKwkvLyAxLiA4MDIuMTFoIHBvd2VyIGNvbnRyYWludAorCS8vCisJLy8gMDcxMDExLCBieSByY25qa28uCisJLy8KKwlpZigJcHJpdi0+T3BNb2RlID09IFJUX09QX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYKKwkJcHJpdi0+YldpdGhDY3hDZWxsUHdyICYmCisJCWNoID09IHByaXYtPmRvdDExQ3VycmVudENoYW5uZWxOdW1iZXIpCisJeworCQl1OCBDY2tDZWxsUHdySWR4ID0gRGJtVG9UeFB3cklkeChkZXYsIFdJUkVMRVNTX01PREVfQiwgcE1nbnRJbmZvLT5DY3hDZWxsUHdyKTsKKwkJdTggT2ZkbUNlbGxQd3JJZHggPSBEYm1Ub1R4UHdySWR4KGRldiwgV0lSRUxFU1NfTU9ERV9HLCBwTWdudEluZm8tPkNjeENlbGxQd3IpOworCisJCXByaW50aygiQ0NYIENlbGwgTGltaXQ6ICVkIGRCbSA9PiBDQ0sgVHggcG93ZXIgaW5kZXggOiAlZCwgT0ZETSBUeCBwb3dlciBpbmRleDogJWRcbiIsCisJCQlwcml2LT5DY3hDZWxsUHdyLCBDY2tDZWxsUHdySWR4LCBPZmRtQ2VsbFB3cklkeCk7CisJCXByaW50aygiRUVQUk9NIGNoYW5uZWwoJWQpID0+IENDSyBUeCBwb3dlciBpbmRleDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLAorCQkJY2hhbm5lbCwgQ2NrVHhQd3JJZHgsIE9mZG1UeFB3cklkeCk7CisKKwkJaWYoY2NrX3Bvd2VyX2xldmVsID4gQ2NrQ2VsbFB3cklkeCkKKwkJCWNja19wb3dlcl9sZXZlbCA9IENja0NlbGxQd3JJZHg7CisJCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiBPZmRtQ2VsbFB3cklkeCkKKwkJCW9mZG1fcG93ZXJfbGV2ZWwgPSBPZmRtQ2VsbFB3cklkeDsKKworCQlwcmludGsoIkFsdGVyZWQgQ0NLIFR4IHBvd2VyIGluZGV4IDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLAorCQkJQ2NrVHhQd3JJZHgsIE9mZG1UeFB3cklkeCk7CisJfQorI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUocHJpdi0+aWVlZTgwMjExKSAmJgorCQlJU19ET1QxMURfU1RBVEVfRE9ORShwcml2LT5pZWVlODAyMTEpICkKKwl7CisJCS8vUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSk7CisJCXU4IE1heFR4UHdySW5EYm0gPSBET1QxMURfR2V0TWF4VHhQd3JJbkRibShwcml2LT5pZWVlODAyMTEsIGNoKTsKKwkJdTggQ2NrTWF4UHdySWR4ID0gRGJtVG9UeFB3cklkeChwcml2LCBXSVJFTEVTU19NT0RFX0IsIE1heFR4UHdySW5EYm0pOworCQl1OCBPZmRtTWF4UHdySWR4ID0gRGJtVG9UeFB3cklkeChwcml2LCBXSVJFTEVTU19NT0RFX0csIE1heFR4UHdySW5EYm0pOworCisJCS8vcHJpbnRrKCJNYXggVHggUG93ZXIgZEJtICglZCkgPT4gQ0NLIFR4IHBvd2VyIGluZGV4IDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLCBNYXhUeFB3ckluRGJtLCBDY2tNYXhQd3JJZHgsIE9mZG1NYXhQd3JJZHgpOworCisJCS8vcHJpbnRrKCJFRVBST00gY2hhbm5lbCglZCkgPT4gQ0NLIFR4IHBvd2VyIGluZGV4OiAlZCwgT0ZETSBUeCBwb3dlciBpbmRleDogJWRcbiIsCisJCS8vCWNoLCBjY2tfcG93ZXJfbGV2ZWwsIG9mZG1fcG93ZXJfbGV2ZWwpOworCisJCWlmKGNja19wb3dlcl9sZXZlbCA+IENja01heFB3cklkeCkKKwkJCWNja19wb3dlcl9sZXZlbCA9IENja01heFB3cklkeDsKKwkJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IE9mZG1NYXhQd3JJZHgpCisJCQlvZmRtX3Bvd2VyX2xldmVsID0gT2ZkbU1heFB3cklkeDsKKwl9CisKKwkvL3ByaXYtPkN1cnJlbnRDY2tUeFB3cklkeCA9IGNja19wb3dlcl9sZXZlbDsKKwkvL3ByaXYtPkN1cnJlbnRPZmRtVHhQd3JJZHggPSBvZmRtX3Bvd2VyX2xldmVsOworI2VuZGlmCisKKwltYXhfY2NrX3Bvd2VyX2xldmVsID0gMTU7CisJbWF4X29mZG1fcG93ZXJfbGV2ZWwgPSAyNTsgLy8gIDEyIC0+IDI1CisJbWluX29mZG1fcG93ZXJfbGV2ZWwgPSAxMDsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKworCWlmKGNja19wb3dlcl9sZXZlbCA+IDM1KQorCXsKKwkJY2NrX3Bvd2VyX2xldmVsID0gMzU7CisJfQorCS8vCisJLy8gU2V0IHVwIENDSyBUWEFHQy4gc3VnZ2VzdGVkIGJ5IFNEMyBTWS4KKwkvLworICAgICAgIHdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCAoWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1sodTgpY2NrX3Bvd2VyX2xldmVsXSkgKTsKKyAgICAgICAvL3ByaW50aygiQ0NLIFRYIHBvd2VyIGlzICV4XG4iLCAoWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1tjY2tfcG93ZXJfbGV2ZWxdKSk7CisgICAgICAgZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisjZWxzZQorCisJLyogQ0NLIHBvd2VyIHNldHRpbmcgKi8KKwlpZihjY2tfcG93ZXJfbGV2ZWwgPiBtYXhfY2NrX3Bvd2VyX2xldmVsKQorCQljY2tfcG93ZXJfbGV2ZWwgPSBtYXhfY2NrX3Bvd2VyX2xldmVsOworCisJY2NrX3Bvd2VyX2xldmVsICs9IHByaXYtPmNja190eHB3cl9iYXNlOworCisJaWYoY2NrX3Bvd2VyX2xldmVsID4gMzUpCisJCWNja19wb3dlcl9sZXZlbCA9IDM1OworCisJaWYoY2ggPT0gMTQpCisJCWNja19wb3dlcl90YWJsZSA9IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tfY2gxNDsKKwllbHNlCisJCWNja19wb3dlcl90YWJsZSA9IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2s7CisKKworCWZvcihpPTA7aTw4O2krKyl7CisKKwkJcG93ZXIgPSBjY2tfcG93ZXJfdGFibGVbaV07CisJCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ0ICsgaSwgcG93ZXIpOworCX0KKworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX0NDSywgcG93ZXIpOworCS8vMjAwNS4xMS4xNywKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1sodTgpY2NrX3Bvd2VyX2xldmVsXSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKyNlbmRpZgorI2VuZGlmCisJLyogT0ZETSBwb3dlciBzZXR0aW5nICovCisvLyAgT2xkOgorLy8JaWYob2ZkbV9wb3dlcl9sZXZlbCA+IG1heF9vZmRtX3Bvd2VyX2xldmVsKQorLy8JCW9mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKy8vCW9mZG1fcG93ZXJfbGV2ZWwgKz0gbWluX29mZG1fcG93ZXJfbGV2ZWw7CisvLyAgTGF0ZXN0OgorLyoJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IChtYXhfb2ZkbV9wb3dlcl9sZXZlbCAtIG1pbl9vZmRtX3Bvd2VyX2xldmVsKSkKKwkJb2ZkbV9wb3dlcl9sZXZlbCA9IG1heF9vZmRtX3Bvd2VyX2xldmVsOworCWVsc2UKKwkJb2ZkbV9wb3dlcl9sZXZlbCArPSBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKworCW9mZG1fcG93ZXJfbGV2ZWwgKz0gcHJpdi0+b2ZkbV90eHB3cl9iYXNlOworKi8KKwlpZihvZmRtX3Bvd2VyX2xldmVsID4gMzUpCisJCW9mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKworLy8JcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldixSVEw4MjI1X0FOQVBBUkFNMl9PTik7CisKKwkvL3J0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIEFOQVBBUk0yX0FTSUNfT04pOworCisJaWYgKHByaXYtPnVwID09IDApIHsKKwkJLy9tdXN0IGFkZCB0aGVzZSBmb3IgcnRsODE4NUIgZG93biwgeGlvbmctMjAwNi0xMS0yMQorCQl3cml0ZV9waHlfb2ZkbShkZXYsMiwweDQyKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDUsMCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiw2LDB4NDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsNywwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDgsMHg0MCk7CisJfQorCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fT0ZETSwgb2ZkbV9wb3dlcl9sZXZlbCk7CisJLy8yMDA1LjExLjE3LAorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyAgICAgICAgd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCBaRUJSQTJfQ0NLX09GRE1fR0FJTl9TRVRUSU5HWyh1OClvZmRtX3Bvd2VyX2xldmVsXSk7CisjZWxzZQorICAgICAgICB3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIFpFQlJBMl9DQ0tfT0ZETV9HQUlOX1NFVFRJTkdbKHU4KW9mZG1fcG93ZXJfbGV2ZWxdKjIpOworI2VuZGlmCisgICAgICAgIGlmKG9mZG1fcG93ZXJfbGV2ZWw8PTExKQorICAgICAgICB7CisvLyAgICAgICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwweDAwMDA1Yzg3KTsKKy8vICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDVjODkpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwNywweDVjKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MDksMHg1Yyk7CisgICAgICAgIH0KKwlpZihvZmRtX3Bvd2VyX2xldmVsPD0xNykKKyAgICAgICAgeworLy8gICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDU0ODcpOworLy8gICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDU0ODkpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwNywweDU0KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MDksMHg1NCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisvLyAgICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsMHgwMDAwNTA4Nyk7CisvLyAgICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsMHgwMDAwNTA4OSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDA3LDB4NTApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwOSwweDUwKTsKKyAgICAgICAgfQorCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCit9CisjaWYgMAorLyogc3dpdGNoIGJldHdlZW4gbW9kZSBCIGFuZCBHICovCit2b2lkIHJ0bDgyMjVfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgbW9kZWIpCit7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAobW9kZWIgPyAweDAgOiAweDQwKSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAobW9kZWIgPyAweDAgOiAweDQwKSk7Cit9CisjZW5kaWYKKwordm9pZCBydGw4MjI1ejJfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisvKgorCXNob3J0IGdzZXQgPSAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCWllZWU4MDIxMV9pc181NGcocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspKSB8fAorCQlwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SOworKi8KKwlydGw4MjI1ejJfU2V0VFhQb3dlckxldmVsKGRldiwgY2gpOworCisJUkZfV3JpdGVSZWcoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaF0pOworCisJLy9ZSixhZGQsMDgwODI4LCBpZiBzZXQgY2hhbm5lbCBmYWlsZWQsIHdyaXRlIGFnYWluCisJaWYoKFJGX1JlYWRSZWcoZGV2LCAweDcpICYgMHgwRjgwKSAhPSBydGw4MjI1X2NoYW5bY2hdKQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaF0pOworCX0KKworCW1kZWxheSgxKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEwKTsKKy8vZGVsZXRlZCBieSBEYXZpZCA6IDIwMDYvOC85CisjaWYgMAorCXdyaXRlX25pY19ieXRlKGRldixTSUZTLDB4MjIpOy8vIFNJRlM6IDB4MjIKKworCWlmKGdzZXQpCisJCXdyaXRlX25pY19ieXRlKGRldixESUZTLDIwKTsgLy9ESUZTOiAyMAorCWVsc2UKKwkJd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsMHgyNCk7IC8vRElGUzogMzYKKworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlODAyMTFfaXNfc2hvcnRzbG90KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSkKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFNMT1QsMHg5KTsgLy9TTE9UOiA5CisKKwllbHNlCisJCXdyaXRlX25pY19ieXRlKGRldixTTE9ULDB4MTQpOyAvL1NMT1Q6IDIwICgweDE0KQorCisKKwlpZihnc2V0KXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LEVJRlMsOTEgLSAyMCk7IC8vIEVJRlM6IDkxICgweDVCKQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ1dfVkFMLDB4NzMpOyAvL0NXIFZBTFVFOiAweDM3CisJCS8vRE1FU0coInVzaW5nIEcgbmV0IHBhcmFtcyIpOworCX1lbHNleworCQl3cml0ZV9uaWNfYnl0ZShkZXYsRUlGUyw5MSAtIDB4MjQpOyAvLyBFSUZTOiA5MSAoMHg1QikKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENXX1ZBTCwweGE1KTsgLy9DVyBWQUxVRTogMHgzNworCQkvL0RNRVNHKCJ1c2luZyBCIG5ldCBwYXJhbXMiKTsKKwl9CisjZW5kaWYKKworfQorI2lmIDAKK3ZvaWQgcnRsODIyNV9ob3N0X3BjaV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4NDgwKTsKKworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworCS8vaWYocHJpdi0+Y2FyZF84MTg1ID09IDIgJiYgcHJpdi0+ZW5hYmxlX2dwaW8wICkgLyogdmVyc2lvbiBEICovCisJLy93cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4OCk7CisJLy9lbHNlCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4ODggfCBTV19DT05UUk9MX0dQSU8pOyAvKiAweDQ4OCB8IFNXX0NPTlRST0xfR1BJTyAqLworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBHUF9FTkFCTEUsIDApOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMjAwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgR1BfRU5BQkxFLCAweGZmICYgKH4oMTw8NikpKTsgLyogYml0IDYgaXMgZm9yIFJGIG9uL29mZiBkZXRlY3Rpb24gKi8KKworCit9CisKK3ZvaWQgcnRsODIyNV9ob3N0X3VzYl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX2J5dGUoZGV2LFJGUGluc1NlbGVjdCsxLDApOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQSU8sMCk7CisKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwweDUzLHJlYWRfbmljX2J5dGVfRShkZXYsMHg1MykgfCAoMTw8NykpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LFJGUGluc1NlbGVjdCsxLDQpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQSU8sMHgyMCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsR1BfRU5BQkxFLDApOworCisKKwkvKiBDb25maWcgQkIgJiBSRiAqLworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDgwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDgwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDgwKTsKKworCisJbWRlbGF5KDEwMCk7CisKKwltZGVsYXkoMTAwMCk7CisKK30KKyNlbmRpZgordm9pZCBydGw4MjI1ejJfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlzaG9ydCBjaGFubmVsID0gMTsKKwl1MTYJYnJzcjsKKwl1MzIJZGF0YSxhZGRyOworCisJcHJpdi0+Y2hhbiA9IGNoYW5uZWw7CisKKy8vCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCXJ0bDgyMjVfaG9zdF91c2JfaW5pdChkZXYpOworCWVsc2UKKwkJcnRsODIyNV9ob3N0X3BjaV9pbml0KGRldik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4MDAwYTgwMDgpOworCisJYnJzciA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgMHhmZmZmKTsKKworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDAwNDQpOworCisJI2lmIDEgIC8vMC0+MQorCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIDB4NDQpOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKwkjZW5kaWYKKworCisJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCisvLwkJbWRlbGF5KDEwMDApOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgyYmYpOyBtZGVsYXkoMSk7CisKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDEsIDB4ZWUwKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgzLCAweDQ0MSk7IG1kZWxheSgxKTsKKworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NCwgMHg4YzMpO21kZWxheSgxKTsKKworCisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweGM3Mik7bWRlbGF5KDEpOworLy8JfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NiwgMHhlNik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpPyAweDgyYSA6IHJ0bDgyMjVfY2hhbltjaGFubmVsXSkpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4OCwgMHgzZik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg5LCAweDMzNSk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhhLCAweDlkNCk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhiLCAweDdiYik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhjLCAweDg1MCk7ICBtZGVsYXkoMSk7CisKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGQsIDB4Y2RmKTsgICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhlLCAweDJiKTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGYsIDB4MTE0KTsKKworCisJbWRlbGF5KDEwMCk7CisKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikgLyogbWF5YmUgbm90IG5lZWRlZCBldmVuIGZvciA4MTg1ICovCisvLwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hhbm5lbF0pOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgxYjcpOworCisJZm9yKGk9MDtpPDk1O2krKyl7CisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDEsICh1OCkoaSsxKSk7CisKKwkJI2lmIDAKKwkJaWYocHJpdi0+cGh5X3ZlciA9PSAxKQorCQkJLyogdmVyc2lvbiBBICovCisJCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCBydGw4MjI1YV9yeGdhaW5baV0pOworCQllbHNlCisJCSNlbmRpZgorCQkvKiB2ZXJzaW9uIEIgJiBDICYgRCovCisKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgcnRsODIyNXoyX3J4Z2FpbltpXSk7CisJfQorCXdyaXRlX3J0bDgyMjUoZGV2LCAweDMsIDB4ODApOworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4NCk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweGI3KTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4YzRkKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCS8vCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgyMDApOworCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKKworCS8vCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxMDApOworCisJfS8vRW5kIG9mIGlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJLyogRklYTUUhISBydGw4MTg3IHdlIGhhdmUgdG8gY2hlY2sgaWYgY2FsaWJyYXJpb24KKwkgKiBpcyBzdWNjZXNzZnVsIGFuZCBldmVudHVhbGx5IGNhbC4gYWdhaW4gKHJlcGVhdAorCSAqIHRoZSB0d28gd3JpdGUgb24gcmVnIDIpCisJKi8KKwkvLyBDaGVjayBmb3IgY2FsaWJyYXRpb24gc3RhdHVzLCAyMDA1LjExLjE3LAorICAgICAgICBkYXRhID0gcmVhZF9ydGw4MjI1KGRldiwgNik7CisgICAgICAgIGlmICghKGRhdGEmMHgwMDAwMDA4MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZV9ydGw4MjI1KGRldiwgMHgwMiwgMHgwYzRkKTsKKyAgICAgICAgICAgICAgICBmb3JjZV9wY2lfcG9zdGluZyhkZXYpOyBtZGVsYXkoMjAwKTsKKyAgICAgICAgICAgICAgICB3cml0ZV9ydGw4MjI1KGRldiwgMHgwMiwgMHgwNDRkKTsKKyAgICAgICAgICAgICAgICBmb3JjZV9wY2lfcG9zdGluZyhkZXYpOyBtZGVsYXkoMTAwKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gcmVhZF9ydGw4MjI1KGRldiwgNik7CisgICAgICAgICAgICAgICAgaWYgKCEoZGF0YSYweDAwMDAwMDgwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1FU0dXKCJSRiBDYWxpYnJhdGlvbiBGYWlsZWQhISEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCS8vZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKworCW1kZWxheSgyMDApOyAvLzIwMCBmb3IgODE4NworCisKKy8vCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQil7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaGFubmVsXSk7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0N2QpOworLy8KKy8vCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworLy8JCW1kZWxheSgxMDApOworLy8KKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7CisvLwkvL30KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MmJmKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKwkvL3NldCB1cCBaRUJSQSBBR0MgdGFibGUsIDIwMDUuMTEuMTcsCisgICAgICAgIGZvcihpPTA7aTwxMjg7aSsrKXsKKyAgICAgICAgICAgICAgICBkYXRhID0gcnRsODIyNV9hZ2NbaV07CisKKyAgICAgICAgICAgICAgICBhZGRyID0gaSArIDB4ODA7IC8vZW5hYmxlIHdyaXRpbmcgQUdDIHRhYmxlCisgICAgICAgICAgICAgICAgd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIGRhdGEpOworCisgICAgICAgICAgICAgICAgbWRlbGF5KDEpOworICAgICAgICAgICAgICAgIHdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCBhZGRyKTsKKworICAgICAgICAgICAgICAgIG1kZWxheSgxKTsKKyAgICAgICAgfQorI2lmIDAKKwlmb3IoaT0wO2k8MTI4O2krKyl7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCBydGw4MjI1X2FnY1tpXSk7CisKKwkJbWRlbGF5KDEpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgKHU4KWkrIDB4ODApOworCisJCW1kZWxheSgxKTsKKwl9CisjZW5kaWYKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MSwgMHgyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpPyAweDQyIDogMHg2MikpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDMsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NCwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg1LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4NDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDcsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OCwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OSwgMHhmZSk7IG1kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDgpOyBtZGVsYXkoMSk7CisKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7CisJLy8JfQorCS8vfQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDgwKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGMsIDB4MSk7bWRlbGF5KDEpOworCisKKwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGQsIDB4NDMpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGUsIDB4ZDMpO21kZWxheSgxKTsKKworCisJI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSl7CisJCWlmKHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDIwKTsvKnZlciBCKi8KKwkJZWxzZQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjgpOy8qdmVyIEMqLworCX1lbHNleworCSNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDM4KTttZGVsYXkoMSk7CisvKnZlciBEICYgODE4NyovCisvLwl9CisKKy8vCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4MDQpOy8qdmVyIEIqLworLy8JZWxzZQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMCwgMHg4NCk7bWRlbGF5KDEpOworLyp2ZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHgwNyk7bWRlbGF5KDEpOworLyphZ2MgcmVzcCB0aW1lIDcwMCovCisKKworLy8JaWYocHJpdi0+Y2FyZF84MTg1ID09IDIpeworCS8qIFZlciBEICYgODE4NyovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEyLCAweDIwKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTMsIDB4MjApO21kZWxheSgxKTsKKworI2lmIDAKKwl9ZWxzZXsKKwkJLyogVmVyIEIgJiBDKi8KKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEyLCAweDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTMsIDB4MCk7CisJfQorI2VuZGlmCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE0LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNiwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7IG1kZWxheSgxKTsKKworLy8JaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7bWRlbGF5KDEpOworCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTksIDB4MTkpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFhLCAweDIwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgMHgxNSk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFjLCAweDQpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgMHhjNSk7bWRlbGF5KDEpOyAvLzIwMDUuMTEuMTcsCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWUsIDB4OTUpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZiwgMHg3NSk7CW1kZWxheSgxKTsKKworLy8JfQorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIwLCAweDFmKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MTcpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMiwgMHgxNik7bWRlbGF5KDEpOworCisvLwlpZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgMHg4MCk7bWRlbGF5KDEpOyAvL0ZJWE1FIG1heWJlIG5vdCBuZWVkZWQgLy8gPD4KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg0Nik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjUsIDB4MDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI2LCAweDkwKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsgbWRlbGF5KDEpOworCisKKwkvLyA8PiBTZXQgaW5pdC4gZ2FpbiB0byBtNzRkQm0uCisKKwlydGw4MjI1ejJfc2V0X2dhaW4oZGV2LDQpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MCwgMHg5OCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgzLCAweDIwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQsIDB4N2UpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NSwgMHgxMik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg2LCAweGZjKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NywgMHg3OCk7bWRlbGF5KDEpOworIC8qIFZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4OCwgMHgyZSk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAweDliOiAweDkzKSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMiwgMHg0Nyk7IG1kZWxheSgxKTsKKyNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHg5OCk7IC8qIFZlciBCICovCisJZWxzZQorI2VuZGlmCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4ZDApOyAvKiBWZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDE5LCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDFhLCAweGEwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxYiwgMHg4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MCwgMHg4Nik7IC8qIENDSyBDYXJyaWVyIFNlbnNlIFRocmVzaG9sZCAqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OGQpO21kZWxheSgxKTsKKworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDIsIDB4MTUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDMsIDB4MTgpOyBtZGVsYXkoMSk7CisKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ0LCAweDM2KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ1LCAweDM1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ2LCAweDJlKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ3LCAweDI1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ4LCAweDFjKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ5LCAweDEyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRhLCAweDkpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGIsIDB4NCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YywgMHg1KTttZGVsYXkoMSk7CisKKworCXdyaXRlX25pY19ieXRlKGRldiwgMHg1YiwgMHgwZCk7IG1kZWxheSgxKTsKKworCisKKy8vIDw+CisvLwkvLyBURVNUUiAweGIgODE4NworLy8Jd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOy8vICYgMHhmYik7CisvLworLy8JLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKXsKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MiwgMHg2Mik7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4MCk7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDgsIDB4MCk7CisvLwkvL30KKworCXJ0bDgyMjV6Ml9TZXRUWFBvd2VyTGV2ZWwoZGV2LCBjaGFubmVsKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisgICAgICAgIHdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDliKTsgbWRlbGF5KDEpOyAvKiBSeCBhbnQgQSwgMHhkYiBmb3IgQiAqLworI2Vsc2UKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Yik7IG1kZWxheSgxKTsgLyogUnggYW50IEEsIDB4ZGIgZm9yIEIgKi8KKyNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHg5MCk7IG1kZWxheSgxKTsgLyogUnggYW50IEEsIDB4MTAgZm9yIEIgKi8KKworCXJ0bDgxODVfdHhfYW50ZW5uYShkZXYsIDB4Myk7IC8qIFRYIGFudCBBLCAweDAgZm9yIEIgKi8KKworCS8qIHN3aXRjaCB0byBoaWdoLXNwZWVkIDMtd2lyZQorCSAqIGxhc3QgZGlnaXQuIDIgZm9yIGJvdGggY2NrIGFuZCBvZmRtCisJICovCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgzZGMwMDAwMik7CisJZWxzZXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgxNWMwMDAwMik7CisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKwl9CisKKy8vCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisvLwlydGw4MjI1X3NldF9nYWluKGRldiwgNCk7IC8qIEZJWE1FIHRoaXMgJzEnIGlzIHJhbmRvbSAqLyAvLyA8PgorLy8JIHJ0bDgyMjVfc2V0X21vZGUoZGV2LCAxKTsgLyogRklYTUUgc3RhcnQgaW4gQiBtb2RlICovIC8vIDw+CisvLworLy8JLyogbWFrZSBzdXJlIGlzIHdha2VuIHVwISAqLworLy8Jd3JpdGVfcnRsODIyNShkZXYsMHg0LCAweDlmZik7CisvLwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworLy8JcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT04pOworCisJcnRsODIyNV9yZl9zZXRfY2hhbihkZXYsIHByaXYtPmNoYW4pOworCisJLy93cml0ZV9uaWNfd29yZChkZXYsQlJTUixicnNyKTsKKworCS8vcnRsODIyNXoyX3JmX3NldF9tb2RlKGRldik7Cit9CisKK3ZvaWQgcnRsODIyNXoyX3JmX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5tb2RlID09IElFRUVfQSkKKwl7CisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4MTg2NSk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwODQpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4YTgwMDgpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4Nik7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDk5KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nyk7CisKKwkJcnRsODIyNXoyX3NldF9nYWluKGRldiw0KTsKKworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxNSwgMHg0MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDE3LCAweDQwKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LDB4MTAwMDAwMDApOworCX1lbHNleworCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4MTg2NCk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwNDQpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4YTgwMDgpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgxKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4Nik7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDk5KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nyk7CisKKwkJcnRsODIyNXoyX3NldF9nYWluKGRldiw0KTsKKworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxNSwgMHg0MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDE3LCAweDQwKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LDB4MDQwMDAwMDIpOworCX0KK30KKworLy9sem0gbW9kIDA4MDgyNgorLy8jZGVmaW5lIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCIDY0CisvLyNkZWZpbmUgTUFYX1BPTExJTkdfMjRGX1RJTUVTXzg3U0UgCTUKKyNkZWZpbmUgTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIgCQkyMAorI2RlZmluZSBNQVhfUE9MTElOR18yNEZfVElNRVNfODdTRSAJCQkxMAorI2RlZmluZSBMUFNfTUFYX1NMRUVQX1dBSVRJTkdfVElNRVNfODdTRSAJNQorCitib29sCitTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlSVF9SRl9QT1dFUl9TVEFURQllUkZQb3dlclN0YXRlCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OAkJCWJ0Q1I5MzQ2LCBidENvbmZpZzM7CisJYm9vbCBiQWN0aW9uQWxsb3dlZD0gdHJ1ZSwgYlR1cm5PZmZCQiA9IHRydWU7Ly9sem0gbW9kIDA4MDgyNgorCS8vdTMyCQkJRFdvcmRDb250ZW50OworCXU4CQkJdTFiVG1wOworCWludAkJCWk7CisJLy91MTYJCQl1MmJURlBDID0gMDsKKwlib29sCQliUmVzdWx0ID0gdHJ1ZTsKKwl1OAkJCVF1ZXVlSUQ7CisKKwlpZihwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID09IHRydWUpCisJCXJldHVybiBmYWxzZTsKKworCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSB0cnVlOworCisJLy8gZW5hYmxlIEVFTTAgYW5kIEVFTTEgaW4gOTM0NkNSCisJYnRDUjkzNDYgPSByZWFkX25pY19ieXRlKGRldiwgQ1I5MzQ2KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgKGJ0Q1I5MzQ2fDB4QzApICk7CisJLy8gZW5hYmxlIFBBUk1fRW4gaW4gQ29uZmlnMworCWJ0Q29uZmlnMyA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIChidENvbmZpZzN8Q09ORklHM19QQVJNX0VuKSApOworCisJc3dpdGNoKCBwcml2LT5yZl9jaGlwICkKKwl7CisJY2FzZSBSRl9aRUJSQTI6CisJCXN3aXRjaCggZVJGUG93ZXJTdGF0ZSApCisJCXsKKwkJY2FzZSBlUmZPbjoKKwkJCVJGX1dyaXRlUmVnKGRldiwweDQsMHg5RkYpOworCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTSwgQU5BUEFSTV9PTik7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTTIsIEFOQVBBUk0yX09OKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc0LCBwcml2LT5SRlByb2dUeXBlKTsKKworCQkJLy9Gb2xsb3cgODdCLCBJc2FpYWggMjAwNy0wNC0yNworCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRFKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgyNEUsICh1MWJUbXAgJiAofihCSVQ1fEJJVDYpKSkgKTsvLyAwNzAxMjQgU0QxIEFsZXg6IHR1cm4gb24gQ0NLIGFuZCBPRkRNLgorCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZTbGVlcDoKKwkJCWJyZWFrOworCisJCWNhc2UgZVJmT2ZmOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJSZXN1bHQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSRl9aRUJSQTQ6CisJCXN3aXRjaCggZVJGUG93ZXJTdGF0ZSApCisJCXsKKwkJY2FzZSBlUmZPbjoKKwkJCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXBvd2VyIG9uQGppZmZpZXM6JWRcbiIsamlmZmllcyk7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwRUMpOworCisJCQkvL3R1cm4gb24gQUZFCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4MDApOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDYyLCAweDAwKTsKKworCQkJLy9sem0gbW9kIDA4MDgyNgorCQkJLy90dXJuIG9uIFJGCisJCQkvL1JGX1dyaXRlUmVnKGRldiwgMHgwLCAweDAwOWYpOyAvL21kZWxheSgxKTsKKwkJCS8vUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4MDk3Mik7IC8vbWRlbGF5KDEpOworCQkJUkZfV3JpdGVSZWcoZGV2LCAweDAsIDB4MDA5Zik7IHVkZWxheSg1MDApOworCQkJUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4MDk3Mik7IHVkZWxheSg1MDApOworCQkJLy90dXJuIG9uIFJGIGFnYWluLCBzdWdnZXN0ZWQgYnkgU0QzIHN0ZXZlbmwuCisJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MCwgMHgwMDlmKTsgdWRlbGF5KDUwMCk7CisJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4NCwgMHgwOTcyKTsgdWRlbGF5KDUwMCk7CisKKwkJCS8vdHVybiBvbiBCQgorLy8JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDQwOTApOyAvL29mZG0gMTA9MDAKKy8vCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg0MDkyKTsgLy9vZmRtIDEyPTAwCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxMCwweDQwKTsKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwweDEyLDB4NDApOworCQkJLy9Bdm9pZCBwb3dlciBkb3duIGF0IGluaXQgdGltZS4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNCwgcHJpdi0+UkZQcm9nVHlwZSk7CisKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiVG1wICYgKH4oQklUNXxCSVQ2KSkpICk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgZVJmU2xlZXA6CisJCQkvLyBNYWtlIHN1cmUgQnVzeVF1ZXVlIGlzIGVtcHR5IGJlZm9yIHR1cm4gb2ZmIFJGRSBwd29lci4KKwkJCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXBvd2VyIHNsZWVwQGppZmZpZXM6JWRcbiIsamlmZmllcyk7CisKKwkJCWZvcihRdWV1ZUlEID0gMCwgaSA9IDA7IFF1ZXVlSUQgPCA2OyApCisJCQl7CisJCQkJaWYoZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixRdWV1ZUlEKSA9PSBwcml2LT50eHJpbmdjb3VudCkKKwkJCQl7CisJCQkJCVF1ZXVlSUQrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2lmIDAJCS8vcmVzZXJ2ZWQgYW15CisJCQkJZWxzZSBpZihwcml2LT5OZGlzQWRhcHRlci5DdXJyZW50UG93ZXJTdGF0ZSAhPSBOZGlzRGV2aWNlU3RhdGVEMCkKKwkJCQl7CisJCQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELCAoImVSZlNsZWVwOiAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9MCBidXQgbG93ZXIgcG93ZXIgc3RhdGUhXG4iLCAocE1nbnRJbmZvLT5UeFBvbGxpbmdUaW1lcysxKSwgUXVldWVJRCkpOworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCQllbHNlLy9sem0gbW9kIDA4MDgyNgorCQkJCXsKKwkJCQkJcHJpdi0+VHhQb2xsaW5nVGltZXMgKys7CisJCQkJCWlmKHByaXYtPlR4UG9sbGluZ1RpbWVzID49IExQU19NQVhfU0xFRVBfV0FJVElOR19USU1FU184N1NFKQorCQkJCQkJeworCQkJCQkJCS8vUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX1dBUk5JTkcsICgiXG5cblxuIFNldFplYnJhUkZQb3dlclN0YXRlODE4NUIoKTplUmZTbGVlcDogICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0gMCAhISFcblxuXG4iLCBMUFNfTUFYX1NMRUVQX1dBSVRJTkdfVElNRVNfODdTRSwgUXVldWVJRCkpOworCQkJCQkJCWJBY3Rpb25BbGxvd2VkPWZhbHNlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXVkZWxheSgxMCk7ICAvLyBXaW5kb3dzIG1heSBkZWxheSAzfjE2bXMgYWN0dWFsbHkuCisJCQkJCQkJLy9SVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfTE9VRCwgKCJlUmZTbGVlcDogJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAhPTAgYmVmb3JlIGRvemUhXG4iLCAocE1nbnRJbmZvLT5UeFBvbGxpbmdUaW1lcyksIFF1ZXVlSUQpKTsKKwkJCQkJCX0KKwkJCQl9CisKKwkJCQkvL2x6bSBkZWwgMDgwODI2CisJCQkJLy9pZihpID49IE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCKQorCQkJCS8veworCQkJCQkvL3ByaW50aygiXG5cblxuIFNldFplYnJhUkZQb3dlclN0YXRlODE4NUIoKTogJWQgdGltZXMgQnVzeVF1ZXVlWyVkXSAhPSAwICEhIVxuXG5cbiIsIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCLCBRdWV1ZUlEKTsKKwkJCQkJLy9icmVhazsKKwkJCQkvL30KKwkJCX0KKworCQkJaWYoYkFjdGlvbkFsbG93ZWQpLy9sem0gYWRkIDA4MDgyNgorCQkJeworCQkJCS8vdHVybiBvZmYgQkIgUlhJUSBtYXRyaXggdG8gY3V0IG9mZiByeCBzaWduYWwKKy8vCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MDA5MCk7IC8vb2ZkbSAxMD0wMAorLy8JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgwMDkyKTsgLy9vZmRtIDEyPTAwCisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTAsMHgwMCk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTIsMHgwMCk7CisJCQkJLy90dXJuIG9mZiBSRgorCQkJCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDAwMDApOyAvL21kZWxheSgxKTsKKwkJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MCwgMHgwMDAwKTsgLy9tZGVsYXkoMSk7CisJCQkJLy90dXJuIG9mZiBBRkUgZXhjZXB0IFBMTAorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg2MiwgMHhmZik7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDU0LCAweGVjKTsKKy8vCQkJCW1kZWxheSgxMCk7CisKKyNpZiAxCisJCQkJbWRlbGF5KDEpOworCQkJCXsKKwkJCQkJaW50IGkgPSAwOworCQkJCQl3aGlsZSAodHJ1ZSkKKwkJCQkJeworCQkJCQkJdTggdG1wMjRGID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRmKTsKKwkJCQkJCWlmICgodG1wMjRGID09IDB4MDEpIHx8ICh0bXAyNEYgPT0gMHgwOSkpCisJCQkJCQl7CisJCQkJCQkJYlR1cm5PZmZCQiA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlLy9sem0gbW9kIDA4MDgyNgorCQkJCQkJeworCQkJCQkJCXVkZWxheSgxMCk7CisJCQkJCQkJaSsrOworCQkJCQkJCXByaXYtPlR4UG9sbGluZ1RpbWVzKys7CisKKwkJCQkJCQlpZihwcml2LT5UeFBvbGxpbmdUaW1lcyA+PSBMUFNfTUFYX1NMRUVQX1dBSVRJTkdfVElNRVNfODdTRSkKKwkJCQkJCQl7CisJCQkJCQkJCS8vUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX1dBUk5JTkcsICgiXG5cblxuIFNldFplYnJhUkZQb3dlclN0YXRlODE4NUIoKTogZVJmT2ZmOiAlZCB0aW1lcyBSeCBNYWMweDI0Rj0weCV4ICEhIVxuXG5cbiIsIGksIHUxYlRtcDI0RikpOworCQkJCQkJCQliVHVybk9mZkJCPWZhbHNlOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJdWRlbGF5KDEwKTsvLyBXaW5kb3dzIG1heSBkZWxheSAzfjE2bXMgYWN0dWFsbHkuCisJCQkJCQkJCS8vUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsKCIoJWQpZVJmU2xlZXAtIHUxYlRtcDI0Rj0gMHglWFxuIiwgaSwgdTFiVG1wMjRGKSk7CisKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vbHptIGRlbCAwODA4MjYKKwkJCQkJCS8vaWYgKGkgPiBNQVhfUE9MTElOR18yNEZfVElNRVNfODdTRSkKKwkJCQkJCS8vCWJyZWFrOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKGJUdXJuT2ZmQkIpLy9sem0gbW9kIDA4MDgyNgorCQkJCXsKKwkJCQkvL3R1cm4gb2ZmIEJCCisJCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRFKTsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiVG1wfEJJVDV8QklUNikpOworCisJCQkJLy90dXJuIG9mZiBBRkUgUExMCisJCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4ZWMpOworCQkJCS8vd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMGVjKTsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4RkMpOyAgLy9bRUNTXSBGQy0+IEVDLT5GQywgYXNrZWQgYnkgU0QzIFN0ZXZlbmwKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwRkMpOy8vW0VDU10gRkMtPiBFQy0+RkMsIGFza2VkIGJ5IFNEMyBTdGV2ZW5sCisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZPZmY6CisJCQkvLyBNYWtlIHN1cmUgQnVzeVF1ZXVlIGlzIGVtcHR5IGJlZm9yIHR1cm4gb2ZmIFJGRSBwd29lci4KKwkJCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXBvd2VyIG9mZkBqaWZmaWVzOiVkXG4iLGppZmZpZXMpOworCQkJZm9yKFF1ZXVlSUQgPSAwLCBpID0gMDsgUXVldWVJRCA8IDY7ICkKKwkJCXsKKwkJCQlpZihnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LFF1ZXVlSUQpID09IHByaXYtPnR4cmluZ2NvdW50KQorCQkJCXsKKwkJCQkJUXVldWVJRCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjaWYgMAorCQkJCWVsc2UgaWYoQWRhcHRlci0+TmRpc0FkYXB0ZXIuQ3VycmVudFBvd2VyU3RhdGUgIT0gTmRpc0RldmljZVN0YXRlRDApCisJCQkJeworCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfTE9VRCwgKCIlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9MCBidXQgbG93ZXIgcG93ZXIgc3RhdGUhXG4iLCAoaSsxKSwgUXVldWVJRCkpOworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCQllbHNlCisJCQkJeworCQkJCQl1ZGVsYXkoMTApOworCQkJCQlpKys7CisJCQkJfQorCisJCQkJaWYoaSA+PSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzg1QikKKwkJCQl7CisJCQkJCS8vcHJpbnRrKCJcblxuXG4gU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1QigpOiAlZCB0aW1lcyBCdXN5UXVldWVbJWRdICE9IDAgISEhXG5cblxuIiwgTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIsIFF1ZXVlSUQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8vdHVybiBvZmYgQkIgUlhJUSBtYXRyaXggdG8gY3V0IG9mZiByeCBzaWduYWwKKy8vCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgwMDkwKTsgLy9vZmRtIDEwPTAwCisvLwkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MDA5Mik7IC8vb2ZkbSAxMj0wMAorCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTAsMHgwMCk7CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxMiwweDAwKTsKKwkJCS8vdHVybiBvZmYgUkYKKwkJCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDAwMDApOyAvL21kZWxheSgxKTsKKwkJCVJGX1dyaXRlUmVnKGRldiwgMHgwLCAweDAwMDApOyAvL21kZWxheSgxKTsKKwkJCS8vdHVybiBvZmYgQUZFIGV4Y2VwdCBQTEwKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg2MiwgMHhmZik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4ZWMpOworLy8JCQltZGVsYXkoMTApOworI2lmIDEKKwkJCW1kZWxheSgxKTsKKwkJCXsKKwkJCQlpbnQgaSA9IDA7CisJCQkJd2hpbGUgKHRydWUpCisJCQkJeworCQkJCQl1OCB0bXAyNEYgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNGYpOworCQkJCQlpZiAoKHRtcDI0RiA9PSAweDAxKSB8fCAodG1wMjRGID09IDB4MDkpKQorCQkJCQl7CisJCQkJCQliVHVybk9mZkJCID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJYlR1cm5PZmZCQiA9IGZhbHNlOworCQkJCQkJdWRlbGF5KDEwKTsKKwkJCQkJCWkrKzsKKwkJCQkJfQorCQkJCQlpZiAoaSA+IE1BWF9QT0xMSU5HXzI0Rl9USU1FU184N1NFKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlpZiAoYlR1cm5PZmZCQikvL2x6bSBtb2QgMDgwODI2CisJCQl7CisKKwkJCS8vdHVybiBvZmYgQkIKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiVG1wfEJJVDV8QklUNikpOworCQkJLy90dXJuIG9mZiBBRkUgUExMICg4ME0pCisJCQkvL3dyaXRlX25pY19ieXRlKGRldiwgMHg1NCwgMHhlYyk7CisJCQkvL3dyaXRlX25pY193b3JkKGRldiwgMHgzN0MsIDB4MDBlYyk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4RkMpOyAvL1tFQ1NdIEZDLT4gRUMtPkZDLCBhc2tlZCBieSBTRDMgU3RldmVubAorCQkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMEZDKTsgLy9bRUNTXSBGQy0+IEVDLT5GQywgYXNrZWQgYnkgU0QzIFN0ZXZlbmwKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJSZXN1bHQgPSBmYWxzZTsKKwkJCXByaW50aygiU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KCk6IHVua25vdyBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLy8gZGlzYWJsZSBQQVJNX0VuIGluIENvbmZpZzMKKwlidENvbmZpZzMgJj0gfihDT05GSUczX1BBUk1fRW4pOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgYnRDb25maWczKTsKKwkvLyBkaXNhYmxlIEVFTTAgYW5kIEVFTTEgaW4gOTM0NkNSCisJYnRDUjkzNDYgJj0gfigweEMwKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgYnRDUjkzNDYpOworCisJaWYoYlJlc3VsdCAmJiBiQWN0aW9uQWxsb3dlZCkvL2x6bSBtb2QgMDgwODI2CisJeworCQkvLyBVcGRhdGUgY3VycmVudCBSRiBzdGF0ZSB2YXJpYWJsZS4KKwkJcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSRlBvd2VyU3RhdGU7CisjaWYgMAorCQlzd2l0Y2gocHJpdi0+ZVJGUG93ZXJTdGF0ZSkKKwkJeworCQljYXNlIGVSZk9mZjoKKwkJCS8vCisJCQkvL0lmIFJmIG9mZiByZWFzb24gaXMgZnJvbSBJUFMsIExlZCBzaG91bGQgYmxpbmsgd2l0aCBubyBsaW5rLCBieSBNYWRkZXN0IDA3MTAxNQorCQkJLy8KKwkJCWlmKHByaXYtPlJmT2ZmUmVhc29uPT1SRl9DSEFOR0VfQllfSVBTICkKKwkJCXsKKwkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsTEVEX0NUTF9OT19MSU5LKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBUdXJuIG9mZiBMRUQgaWYgUkYgaXMgbm90IE9OLgorCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlciwgTEVEX0NUTF9QT1dFUl9PRkYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZPbjoKKwkJCS8vIFR1cm4gb24gUkYgd2UgYXJlIHN0aWxsIGxpbmtlZCwgd2hpY2ggbWlnaHQgaGFwcGVuIHdoZW4KKwkJCS8vIHdlIHF1aWNrbHkgdHVybiBvZmYgYW5kIG9uIEhXIFJGLiAyMDA2LjA1LjEyLCBieSByY25qa28uCisJCQlpZiggcE1nbnRJbmZvLT5iTWVkaWFDb25uZWN0ID09IFRSVUUgKQorCQkJeworCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlciwgTEVEX0NUTF9MSU5LKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvLyBkbyBub3RoaW5nLgorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJfQorCisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworCisJcmV0dXJuIChiUmVzdWx0ICYmIGJBY3Rpb25BbGxvd2VkKSA7Cit9Cit2b2lkIHJ0bDgyMjV6NF9yZl9zbGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vCisJLy8gVHVybiBvZmYgUkYgcG93ZXIuCisJLy8KKwkvL3ByaW50aygiPT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZlNsZWVwLCBSRl9DSEFOR0VfQllfUFMpOworCS8vbWRlbGF5KDIpOwkvL0ZJWE1FCit9Cit2b2lkIHJ0bDgyMjV6NF9yZl93YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvLworCS8vIFR1cm4gb24gUkYgcG93ZXIuCisJLy8KKwkvL3ByaW50aygiPT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9uLCBSRl9DSEFOR0VfQllfUFMpOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjU1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MjQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5jCkBAIC0wLDAgKzEsMTgzOCBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODI1NQorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKyNkZWZpbmUgQkFORF9BIDEKKyNkZWZpbmUgQkFORF9CRyAyCisKKyNpbmNsdWRlICJyODE4MC5oIgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfcnRsODI1NS5oIgorCit1MzIgcnRsODI1NV9jaGFuW10gPSB7CisJMCwJLy9kdW1teSBjaGFubmVsIDAKKwkweDEzLCAvLzEKKwkweDExNSwgLy8yCisJMHgyMTcsIC8vMworCTB4MjE5LCAvLzQKKwkweDMxYiwgLy81CisJMHg0MWQsIC8vNgorCTB4NDFmLCAvLzcKKwkweDYyMSwgLy84CisJMHg2MjMsIC8vOQorCTB4NjI1LCAvLzEwCisJMHg2MjcsIC8vMTEKKwkweDgyOSwgLy8xMgorCTB4ODJiLCAvLzEzCisJMHg5MmYsIC8vIDE0Cit9OworCitzdGF0aWMgc2hvcnQgcnRsODI1NV9nYWluXzJHW109eworCTB4MzMsIDB4MTcsIDB4N2MsIDB4YzUsLy8tNzgKKwkweDQzLCAweDE3LCAweDdhLCAweGM1LC8vLTc0CisJMHg1MywgMHgxNywgMHg3OCwgMHhjNSwvLy03MAorCTB4NjMsIDB4MTcsIDB4NzYsIDB4YzUsLy8tNjYKK307CisKKworc3RhdGljIHNob3J0IHJ0bDgyNTVfYWdjW109eworCTB4MSwgMHgxLCAweDEsIDB4MSwgMHgxLCAgICAgICAgIDB4MSwgMHgxLCAweDEsIDB4MSwgMHgxLAorCisJMHgxLCAweDEsIDB4MiwgMHgyLCAweDMsICAgICAgICAgMHgzLCAweDQsIDB4NCwgMHg1LCAweDUsCisJMHg2LCAweDYsIDB4NywgMHg3LCAweDgsICAgICAgICAgMHg4LCAweDksIDB4OSwgMHhhLCAweGEsCisJMHhiLCAweGIsIDB4YywgMHhjLCAweGQsICAgICAgICAgMHhkLCAweGUsIDB4ZSwgMHhmLCAweGYsCisKKwkweDEwLCAweDEwLCAweDExLCAweDExLCAweDEyLCAgICAweDEyLCAweDEzLCAweDEzLCAweDE0LCAweDE0LAorCTB4MTUsIDB4MTUsIDB4MTYsIDB4MTYsIDB4MTcsICAgIDB4MTcsIDB4MTgsIDB4MTgsIDB4MTksIDB4MTksCisJMHgxYSwgMHgxYSwgMHgxYiwgMHgxYiwgMHgxYywgICAgMHgxYywgMHgxZCwgMHgxZCwgMHgxZSwgMHgxZSwKKwkweDFmLCAweDFmLAorCisJMHgyMCwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMiwgICAgMHgyMiwgMHgyMywgMHgyMywgMHgyNCwgMHgyNCwKKwkweDI1LCAweDI1LCAweDI2LCAweDI2LCAweDI3LCAgICAweDI3LCAweDI4LCAweDI4LCAweDI5LCAweDI5LAorCTB4MmEsIDB4MmEsCisKKwkweDJhLCAweDJhLCAweDJhLCAweDJhLCAweDJhLCAgICAweDJhLCAweDJhLCAweDJhLCAweDJhLCAweDJhLAorCTB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsICAgIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsCisJMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgICAgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwKKwkweDJhLCAweDJhLCAweDJhLCAweDJhCisKK307CisKK3ZvaWQgcnRsODI1NV9zZXRfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBnYWluKQoreworCisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIHJ0bDgyNTVfZ2Fpbl8yR1tnYWluICogNF0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgcnRsODI1NV9nYWluXzJHW2dhaW4gKiA0ICsgMV0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODI1NV9nYWluXzJHW2dhaW4gKiA0ICsgMl0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgcnRsODI1NV9nYWluXzJHW2dhaW4gKiA0ICsgM10pOworCS8vcnRsODIyNV9zZXRfZ2Fpbl91c2IoZGV2LCBnYWluKTsKK30KKwordm9pZCB3cml0ZV9ydGw4MjU1X3JlZzBjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkMSwgdTMyIGQyLCB1MzIgZDMsIHUzMiBkNCwKK3UzMiBkNSwgdTMyIGQ2LCB1MzIgZDcsIHUzMiBkOCwgdTMyIGQ5LCB1MzIgZDEwKQoreworCWludCBpLGo7CisJdTE2IG91dCxzZWxlY3Q7CisJdTggYml0OworCXUzMiBiYW5nZGF0YTsKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXdyaXRlX25pY193b3JkKGRldixSRlBpbnNFbmFibGUsCisJCShyZWFkX25pY193b3JkKGRldixSRlBpbnNFbmFibGUpIHwgMHg3KSk7CisKKwlzZWxlY3QgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCAweDcgfCBTV19DT05UUk9MX0dQSU8pOworCisJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOICk7Ly98IDB4MWZmZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgyKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMik7CisKKwlmb3Ioaj0wO2o8MTA7aisrKQorCXsKKwkJc3dpdGNoKGopCisJCXsKKwkJCWNhc2UgOToKKwkJCWJhbmdkYXRhID0gZDEwIHwgMHgwYzsKKwkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJYmFuZ2RhdGEgPSBkOTsKKwkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJYmFuZ2RhdGEgPSBkODsKKwkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJYmFuZ2RhdGEgPSBkNzsKKwkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJYmFuZ2RhdGEgPSBkNjsKKwkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJYmFuZ2RhdGEgPSBkNTsKKwkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJYmFuZ2RhdGEgPSBkNDsKKwkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJYmFuZ2RhdGEgPSBkMzsKKwkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJYmFuZ2RhdGEgPSBkMjsKKwkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJYmFuZ2RhdGEgPSBkMTsKKwkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCWJhbmdkYXRhPTB4YmFkYzBkZTsgLyogYXZvaWQgZ2NjIGNvbXBsYWludHMgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJZm9yKGk9MzE7IGk+PTA7aS0tKXsKKworCQkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKwkJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCQl1ZGVsYXkoMSk7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkJdWRlbGF5KDEpOworCQkvLwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCQlpLS07CisJCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCQl1ZGVsYXkoMSk7CisJCS8vCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCQkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJCXVkZWxheSgxKTsKKwkJfQorCX0KKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8IFNXX0NPTlRST0xfR1BJTyk7CisvLwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKK30KKwordm9pZCB3cml0ZV9ydGw4MjU1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpCit7CisJaW50IGk7CisJdTE2IG91dCxzZWxlY3Q7CisJdTggYml0OworCXUzMiBiYW5nZGF0YSA9IChkYXRhIDw8IDQpIHwgKGFkciAmIDB4Zik7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlvdXQgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0KSAmIDB4ZmZmMzsKKworCXdyaXRlX25pY193b3JkKGRldixSRlBpbnNFbmFibGUsCisJCShyZWFkX25pY193b3JkKGRldixSRlBpbnNFbmFibGUpIHwgMHg3KSk7CisKKwlzZWxlY3QgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCAweDcgfCBTV19DT05UUk9MX0dQSU8pOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTiApOy8vfCAweDFmZmYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0KTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCisJZm9yKGk9MTU7IGk+PTA7aS0tKXsKKworCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQlpLS07CisJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisJfQorCisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCBTV19DT05UUk9MX0dQSU8pOworCisJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworfQorCit2b2lkIHJ0bDgyNTVfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworLy8JcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09GRik7CisvLwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PRkYpOworfQorCit2b2lkIHJ0bDgyNTVfU2V0VFhQb3dlckxldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXU4IGNja19wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKKwl1OCBvZmRtX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3Jfb2ZkbVtjaF07CisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX09GRE0sIG9mZG1fcG93ZXJfbGV2ZWwpOworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9DQ0ssIGNja19wb3dlcl9sZXZlbCk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DT05UUk9MLDQpOworfQorI2lmIDAKKy8qIHN3aXRjaCBiZXR3ZWVuIG1vZGUgQiBhbmQgRyAqLwordm9pZCBydGw4MjU1X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IG1vZGViKQoreworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgKG1vZGViID8gMHgwIDogMHg0MCkpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgKG1vZGViID8gMHgwIDogMHg0MCkpOworfQorI2VuZGlmCisKK3ZvaWQgcnRsODI1NV9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwkvL3dyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhblsxXSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NSwgMHg2NSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NiwgcnRsODI1NV9jaGFuW2NoXSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NywgMHg3Yyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4OCwgMHg2KTsKKworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFopOworLy8JcnRsODIyNV9zZXRfbW9kZV9CKGRldik7CisKKwlydGw4MjU1X1NldFRYUG93ZXJMZXZlbChkZXYsIGNoKTsKKwkvKiBGSVhNRSBGSVhNRSBGSVhNRSAqLworCisJI2lmIDAKKwl3cml0ZV9uaWNfYnl0ZShkZXYsRElGUywweGUpOyAvL0RJRlMKKwl3cml0ZV9uaWNfYnl0ZShkZXYsU0xPVCwweDE0KTsgLy9TTE9UCisJd3JpdGVfbmljX2J5dGUoZGV2LEVJRlMsMHg1Yik7IC8vIEVJRlMKKwkvL3dyaXRlX25pY19ieXRlKGRldiwweGJjLDApOyAvL0NXIENPTkZJRworCXdyaXRlX25pY19ieXRlKGRldiwweGJkLDB4YTQpOyAvL0NXIFZBTFVFCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsVFhfQUdDX0NPTlRST0wsNCk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIDB4OWQsNyk7CisvL0FwciAyMCAxMzoyNTowMyBsb2NhbGhvc3Qga2VybmVsOiB3OC4gNDA5ZDwtNyAgLy8gQ0NLIEFHQworCS8qd3JpdGVfbmljX3dvcmQoZGV2LDB4ODQsMHg0ODgpOworCXdyaXRlX25pY19ieXRlKGRldiwweDkxLDB4M2UpOworCXdyaXRlX25pY19ieXRlKGRldiwweDkwLDB4MzApOworCXdyaXRlX25pY193b3JkKGRldiwweDg0LDB4NDg4KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5MSwweDNlKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5MCwweDIwKTsKKwkqLworCS8vbWRlbGF5KDEwMCk7CisJI2VuZGlmCit9CisKK3ZvaWQgcnRsODI1NV9pbml0X0JHYmFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MTg3Y2YsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhYzAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxODdjZSwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmFjMCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAxKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4YmRmLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWM0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MThiYmYsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhYzQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxOGI5ZiwgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFjOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA0KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4M2RmLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWM4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MTgzY2YsIDB4MjcsCisJCTB4OTI0MDJhY2MsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxODNhZiwgMHgyNywKKwkJMHg5MjQwMmFjYywgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA3KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA4M2Q3LCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWQwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDgpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDgzYzcsIDB4MjcsCisJCTB4OTI0MDJhZDAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDNkNywgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFkNCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBhKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0M2Q3LCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWQ0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQzYzcsIDB4MjcsCisJCTB4OTI0MDJhZDgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDNhNywgMHgyNywKKwkJMHg5MjQwMmFkOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBkKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0Mzg3LCAweDI3LAorCQkweDkyNDAyYWE4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxYzcsIDB4MjcsCisJCTB4OTI0MDJhYTgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDFhNywgMHgyNywKKwkJMHg5MjQwMmFhYywgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEwKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTg3LCAweDI3LAorCQkweDkyNDAyYWFjLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTEpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxODYsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhYjAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDE4NiwgMHgyNywKKwkJMHg5MjQwMmFiMCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEzKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTQ2LCAweDI3LAorCQkweDkyNDAyYWI0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTQpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxMjYsIDB4MjcsCisJCTB4OTI0MDJhYjQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDEwNiwgMHgyNywKKwkJMHg5MjQwMmFiOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE2KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTA1LCAweDI3LAorCQkweDkyNDAyYWI4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTcpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxMDQsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhODgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDEwNCwgMHgyNywKKwkJMHg5MjQwMmE4OCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE5KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDQ0LCAweDI3LAorCQkweDkyNDAyYThjLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWEpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMjQsIDB4MjcsCisJCTB4OTI0MDJhOGMsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwNCwgMHgyNywKKwkJMHg5MjQwMmE5MCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFjKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAxLCAweDI3LAorCQkweDkyNDAyYTkwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWQpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhOTQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHgyNywKKwkJMHg5MjQwMmE5NCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFmKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDIwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTk4LCAweGY4MDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjApOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMjAsIDB4MjcsCisJCTB4OTI0MDJhOTgsIDB4ZjgwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE2OCwgMHhmMDAwOSwgMHgxMDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIyKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDEwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTY4LCAweGYwMDA5LCAweDIwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMTAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNmMsIDB4ZjAwMDksIDB4MzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAxMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE2YywgMHhmMDAwOSwgMHg0MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI1KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTcwLCAweGYwMDA5LCAweDYwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMzEsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhNzAsIDB4ZjAwMTEsIDB4NjAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAxMSwgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmE3NCwgMHhmMDAxMSwgMHg2MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI4KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDEwLCAweGMwMDAwMDI3LAorCQkweDkyNDAyYTc0LCAweGYwMDExLCAweDYwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjkpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNzgsIDB4ZjAwMTEsIDB4NjAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE3OCwgMHhmMDAxMSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJiKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTQ4LCAweGYwMDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNDgsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE0YywgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJlKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTRjLCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNTAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE1MCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMxKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTU0LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNTQsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE1OCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM0KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTU4LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMjQsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEyNCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM3KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTI4LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzgpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMjgsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxMSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDM1MzksIDB4NzAwMDBjMDMsIDB4ZmVmNDYxNzgsIDB4NDA4MDAwLCAweDQwMzMwNywKKwkJMHg5MjRmODBjMCwgMHhmOTU1YywgMHg4NDAwLCAweDQyOTIwMCwgMHgxY2UyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgxYzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4NDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4OThjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg1LCAweDY1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg2LCAweDEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg3LCAweDdjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg4LCAweDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDgsIDB4Nyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4OCwgMHg2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg5LCAweGNlMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4YiwgMHgxYzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGQsIDB4ZDdmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHhlLCAweDM2OSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4YSwgMHhkNTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGEsIDB4ZDU3KTsKKwltZGVsYXkoMjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGQsIDB4ZDdlKTsKKworfQorCisKK3ZvaWQgcnRsODI1NV9zZXRfYmFuZF9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBiYW5kKQoreworCWlmKGJhbmQgIT0gQkFORF9BKXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgzZGMwMDAwMik7CisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4ODgsIDB4MDAxMDAwNDApOworCisJCXdyaXRlX3BoeV9jY2soZGV2LCAweDEzLCAweGQwKTsKKworCQl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgMHg5ZCk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OGMsIDB4MDAwODIyMDUpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YjQsIDB4NjYpOworCX0KK30KKwordm9pZCBydGw4MjU1X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGk7CisJdTE2IGJyc3I7CisvLwlzaG9ydCBjaGFubmVsIC8qPSBwcml2LT5jaGFuKi8gPSAxOworCXByaXYtPmNoYW4gPSAxOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4ODApOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDgwIHwgU1dfQ09OVFJPTF9HUElPKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgMHg4MCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIFNXX0NPTlRST0xfR1BJTyk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4MDAwZjgwMGYpOworCisJYnJzciA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgMHgyYywgMHhmZmZmKTsKKworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjU1X0FOQVBBUkFNX09OKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjU1X0FOQVBBUkFNMl9PTik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDExYzAwMDAyKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwMDQwKTsKKworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworCXJ0bDgyNTVfaW5pdF9CR2JhbmQoZGV2KTsKKwlydGw4MjU1X3NldF9iYW5kX3BhcmFtKGRldixCQU5EX0JHKTsKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDAsIDB4OTgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDMsIDB4MjApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQsIDB4MmUpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDUsIDB4MTIpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDYsIDB4ZmMpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDcsIDB4ZDgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDgsIDB4MmUpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweGQzKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTIsIDB4NDcpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEzLCAweGQwKTsgLyogVmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxOSwgMHgwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxYSwgMHhhMCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MWIsIDB4OCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDAsIDB4ODYpOyAvKiBDQ0sgQ2FycmllciBTZW5zZSBUaHJlc2hvbGQgKi8KKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgMHg5ZCk7IC8qIEVuZXJneSBUaHJlc2hvbGQgKi8KKwkvL3dyaXRlX3BoeV9jY2soZGV2LCAweDQyLCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQzLCAweDgpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBURVNUUiwweDgpOworCisJZm9yKGk9MDtpPDEyODtpKyspeworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NGIsIHJ0bDgyNTVfYWdjW2ldKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDRhLCAodTgpaSsgMHg4MCk7CisJfQorCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MSwgMHgyKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MiwgMHg0Myk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDQsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDUsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4NDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg3LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg4LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OSwgMHhmZSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4OSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4ODApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhjLCAweDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhkLCAweDQzKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZSwgMHhkMyk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MzgpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMCwgMHg0KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4MDYpOy8qYWdjIHJlc3AgdGltZSA3MDAqLworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgyMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEzLCAweDIwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTQsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTYsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOSwgMHgyNSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFhLCAweDIwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIDB4N2EpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYywgMHg4NCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFlLCAweDk1KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWYsIDB4NzUpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMCwgMHgxZik7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDE3KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjIsIDB4MTYpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgMHg3MCk7IC8vRklYTUUgbWF5YmUgbm90IG5lZWRlZAorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg3MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI1LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHgxMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsKKworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgzZGMwMDAwMik7IC8vQkFORCBERVBFTkQuCisvLwl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsgLy9CQU5EIERFUEVORC4KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQsIDB4MTgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQzLCAweDE4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg2LCAweGRjKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NCwgMHgyYik7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDUsIDB4MmIpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ2LCAweDI1KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NywgMHgxNSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDgsIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDksIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGEsIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGIsIDB4MCk7CisvLwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YywgMHg1KTsKKyNpZiAwCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOyAvKiBFbmVyZ3kgVGhyZXNob2xkICovCisJLy8gVEVTVFIgMHhiIDgxODcKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Myk7Ly8gJiAweGZiKTsKKyNlbmRpZgorCS8vcnRsODI1NV9zZXRfZ2FpbihkZXYsIDEpOyAvKiBGSVhNRSB0aGlzICcxJyBpcyByYW5kb20gKi8KKworCXJ0bDgyNTVfU2V0VFhQb3dlckxldmVsKGRldiwgcHJpdi0+Y2hhbik7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5MyB8MHg0KTsgLyogUnggYW50IEIsIDB4ZDMgZm9yIEEgKi8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyAvKiBSeCBhbnQgQiwgMHgxMCBmb3IgQSAqLworCisJcnRsODE4NV90eF9hbnRlbm5hKGRldiwgMHgzKTsgLyogVFggYW50IEIsIDB4MCBmb3IgQSovCisJLyogbWFrZSBzdXJlIGlzIHdha2VuIHVwISAqLworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODI1NV9BTkFQQVJBTV9PTik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODI1NV9BTkFQQVJBTTJfT04pOworCisJcnRsODI1NV9zZXRfYmFuZF9wYXJhbShkZXYsQkFORF9CRyk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgMHg5ZCk7CisKKwlydGw4MjU1X3NldF9nYWluKGRldiwgNCk7CisJLy9ydGw4MjU1X3NldF9lbmVyZ3lfdGhyZXNob2xkKGRldik7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOworCXJ0bDgyNTVfcmZfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgYnJzcik7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjU1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0NGNhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCisgIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgorICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyNTUKKyAgcmFkaW8gZnJvbnRlbmQuCisKKyAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorCisqLworCisjZGVmaW5lIFJUTDgyNTVfQU5BUEFSQU1fT04gMHhhMDAwMGI1OQorI2RlZmluZSBSVEw4MjU1X0FOQVBBUkFNMl9PTiAweDg0MGNmMzExCisKKwordm9pZCBydGw4MjU1X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyNTVfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHJ0bDgyNTVfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3NhMjQwMC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9zYTI0MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ5NTYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9zYTI0MDAuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAgIFRoaXMgZmlsZXMgY29udGFpbnMgUEhJTElQUyBTQTI0MDAgcmFkaW8gZnJvbnRlbmQgcHJvZ3JhbW1pbmcgcm91dGluZXMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIENvZGUgYXQgaHR0cDovL2NoZS5vamN0ZWNoLmNvbS9+ZHlvdW5nL3J0dy8gaGFzIGJlZW4gdXNlZnVsIHRvIG1lIHRvCisgICB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzLgorCisgICBDb2RlIGZyb20gcnRsODE4MSBwcm9qZWN0IGhhcyBiZWVuIHVzZWZ1bCB0byBtZSB0byB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzLgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3NhMjQwMC5oIgorCisKKy8vI2RlZmluZSBERUJVR19TQTI0MDAKKwordTMyIHNhMjQwMF9jaGFuW10gPSB7CisJMHgwLAkvL2R1bW15IGNoYW5uZWwgMAorCTB4MDAwOTZjLCAvLzEKKwkweDA4MDk3MCwgLy8yCisJMHgxMDA5NzQsIC8vMworCTB4MTgwOTc4LCAvLzQKKwkweDAwMDk4MCwgLy81CisJMHgwODA5ODQsIC8vNgorCTB4MTAwOTg4LCAvLzcKKwkweDE4MDk4YywgLy84CisJMHgwMDA5OTQsIC8vOQorCTB4MDgwOTk4LCAvLzEwCisJMHgxMDA5OWMsIC8vMTEKKwkweDE4MDlhMCwgLy8xMgorCTB4MDAwOWE4LCAvLzEzCisJMHgwMDA5YjQsIC8vMTQKK307CisKKwordm9pZCByZl9zdGFiaWxpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgzKTsgLy9mb3Igbm93IHVzZSBhIGdyZWF0IHZhbHVlLi4gd2UgbWF5IG9wdGltaXplIGluIGZ1dHVyZQorfQorCisKK3ZvaWQgd3JpdGVfc2EyNDAwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggYWRyLCB1MzIgZGF0YSkKK3sKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgcGh5X2NvbmZpZzsKKworICAgICAgICAvLyBwaGlsaXBzIHNhMjQwMCBleHBlY3RzIDI0IGJpdHMgZGF0YQorCisJLyppZihhZHIgPT0gNCAmJiBwcml2LT5kaWdwaHkpeworCQlwaHlfY29uZmlnPTB4NjAwMDAwMDA7CisJfWVsc2V7CisJCXBoeV9jb25maWc9MHhiMDAwMDAwMDsKKwl9Ki8KKworCXBoeV9jb25maWcgPSAweGIwMDAwMDAwOyAvLyBNQUMgd2lsbCBiYW5nIGJpdHMgdG8gdGhlIHNhMjQwMAorCisJcGh5X2NvbmZpZyB8PSAoKCh1MzIpKGFkciYweGYpKTw8IDI0KTsKKwlwaHlfY29uZmlnIHw9IChkYXRhICYgMHhmZmZmZmYpOworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxwaHlfY29uZmlnKTsKKyNpZmRlZiBERUJVR19TQTI0MDAKKwlETUVTRygiV3JpdGluZyBzYTI0MDA6ICV4IChhZHIgJXgpIixwaHlfY29uZmlnLGFkcik7CisjZW5kaWYKKwlyZl9zdGFiaWxpemUoZGV2KTsKK30KKworCisKK3ZvaWQgc2EyNDAwX3dyaXRlX3BoeV9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGFudDsKKworCWFudCA9IFNBMjQwMF9BTlRFTk5BOworCWlmKHByaXYtPmFudGIpIC8qZGVmYXVsdCBhbnRlbm5hIGlzIGFudGVubmEgQiAqLworCQlhbnQgfD0gQkJfQU5URU5OQV9COworCWlmKGNoID09IDE0KQorCQlhbnQgfD0gQkJfQU5UQVRURU5fQ0hBTjE0OworCXdyaXRlX3BoeShkZXYsMHgxMCxhbnQpOworCS8vRE1FU0coIkJCIGFudGVubmEgJXggIixhbnQpOworfQorCisKKy8qIGZyb20gdGhlIHJ0bDgxODEgZW1iZWRkZWQgZHJpdmVyICovCitzaG9ydCBzYTI0MDBfcmZfc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgc2VucykKK3sKKwl1OCBmaW5ldHVuZSA9IDA7CisJaWYgKChzZW5zID4gODUpIHx8IChzZW5zIDwgNTQpKSByZXR1cm4gLTE7CisKKwl3cml0ZV9zYTI0MDAoZGV2LDUsMHgxZGZiIHwgKHNlbnMtNTQpIDw8IDE1IHwoZmluZXR1bmU8PDIwKSk7ICAvLyBBR0MJMHhjOWRmYgorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBzYTI0MDBfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiB0eHB3ID0gMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdOworCXUzMiBjaGFuID0gc2EyNDAwX2NoYW5bY2hdOworCisJd3JpdGVfc2EyNDAwKGRldiw3LHR4cHcpOworCS8vd3JpdGVfcGh5KGRldiwweDEwLDB4ZDEpOworCXNhMjQwMF93cml0ZV9waHlfYW50ZW5uYShkZXYsY2gpOworCXdyaXRlX3NhMjQwMChkZXYsMCxjaGFuKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDEsMHhiYjUwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDIsMHg4MCk7CisJd3JpdGVfc2EyNDAwKGRldiwzLDApOworfQorCisKK3ZvaWQgc2EyNDAwX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfc2EyNDAwKGRldiwgNCwgMCk7Cit9CisKKwordm9pZCBzYTI0MDBfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYW5hcGFyYW07CisJdTggZmlyZGFjOworCisJd3JpdGVfbmljX2J5dGUoZGV2LFBIWV9ERUxBWSwweDYpOwkvL3RoaXMgaXMgZ2VuZXJhbAorCXdyaXRlX25pY19ieXRlKGRldixDQVJSSUVSX1NFTlNFX0NPVU5URVIsMHg0Yyk7IC8vdGhpcyBpcyBnZW5lcmFsCisKKwkvKnRoZXNlIGFyZSBwaGlsaXBzIHNhMjQwMCBzcGVjaWZpYyovCisJYW5hcGFyYW0gPSByZWFkX25pY19kd29yZChkZXYsQU5BUEFSQU0pOworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn4gKDE8PEFOQVBBUkFNX1RYREFDT0ZGX1NISUZUKTsKKworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn5BTkFQQVJBTV9QV1IxX01BU0s7CisJYW5hcGFyYW0gPSBhbmFwYXJhbSAmfkFOQVBBUkFNX1BXUjBfTUFTSzsKKwlpZihwcml2LT5kaWdwaHkpeworCQlhbmFwYXJhbSB8PSAoU0EyNDAwX0RJR19BTkFQQVJBTV9QV1IxX09OPDxBTkFQQVJBTV9QV1IxX1NISUZUKTsKKwkJYW5hcGFyYW0gfD0gKFNBMjQwMF9BTkFQQVJBTV9QV1IwX09OPDxBTkFQQVJBTV9QV1IwX1NISUZUKTsKKwl9ZWxzZXsKKwkJYW5hcGFyYW0gfD0gKFNBMjQwMF9BTkFfQU5BUEFSQU1fUFdSMV9PTjw8QU5BUEFSQU1fUFdSMV9TSElGVCk7CisJfQorCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LGFuYXBhcmFtKTsKKworCWZpcmRhYyA9IChwcml2LT5kaWdwaHkpID8gKDE8PFNBMjQwMF9SRUc0X0ZJUkRBQ19TSElGVCkgOiAwOworCXdyaXRlX3NhMjQwMChkZXYsMCxzYTI0MDBfY2hhbltwcml2LT5jaGFuXSk7CisJd3JpdGVfc2EyNDAwKGRldiwxLDB4YmI1MCk7CisJd3JpdGVfc2EyNDAwKGRldiwyLDB4ODApOworCXdyaXRlX3NhMjQwMChkZXYsMywwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM0MCB8IGZpcmRhYyk7CisJd3JpdGVfc2EyNDAwKGRldiw1LDB4YzlkZmIpOyAgLy8gQUdDCisJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzNDggfCBmaXJkYWMpOyAgLy9jYWxpYnJhdGVzIFZDTworCisJaWYocHJpdi0+ZGlncGh5KQorCQl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM4Yyk7IC8qPz8/Ki8KKworCXdyaXRlX3NhMjQwMChkZXYsNCwweDE5MzQwIHwgZmlyZGFjKTsKKworCXdyaXRlX3NhMjQwMChkZXYsMCxzYTI0MDBfY2hhbltwcml2LT5jaGFuXSk7CisJd3JpdGVfc2EyNDAwKGRldiwxLDB4YmI1MCk7CisJd3JpdGVfc2EyNDAwKGRldiwyLDB4ODApOworCXdyaXRlX3NhMjQwMChkZXYsMywwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM0NCB8IGZpcmRhYyk7IC8vY2FsaWJyYXRlcyBmaWx0ZXIKKworCS8qIG5ldyBmcm9tIHJ0bDgxODAgZW1iZWRkZWQgZHJpdmVyIChydGw4MTgxIHByb2plY3QpICovCisJd3JpdGVfc2EyNDAwKGRldiw2LDB4MTNmZiB8ICgxPDwyMykpOyAvLyBNQU5SWAorCXdyaXRlX3NhMjQwMChkZXYsOCwwKTsgLy9WQ08KKworCWlmKCFwcml2LT5kaWdwaHkpCisJeworCQlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIGFuYXBhcmFtIHwgXAorCQkJCSAgICAgKDE8PEFOQVBBUkFNX1RYREFDT0ZGX1NISUZUKSk7CisKKwkJcnRsODE4MF9jb250dHhfZW5hYmxlKGRldik7CisKKwkJd3JpdGVfc2EyNDAwKGRldiwgNCwgMHgxOTM0MSk7IC8vIGNhbGlicmF0ZXMgREMKKworCQkvKiBhIDV1cyBzbGVlcCBpcyByZXF1aXJlZCBoZXJlLAorCQkgICB3ZSByZWx5IG9uIHRoZSAzbXMgZGVsYXkgaW50cm9kdWNlZCBpbiB3cml0ZV9zYTI0MDAKKwkJKi8KKwkJd3JpdGVfc2EyNDAwKGRldiwgNCwgMHgxOTM0NSk7CisJCS8qIGEgMjB1cyBzbGVlcCBpcyByZXF1aXJlZCBoZXJlLAorCQkgICB3ZSByZWx5IG9uIHRoZSAzbXMgZGVsYXkgaW50cm9kdWNlZCBpbiB3cml0ZV9zYTI0MDAKKwkJKi8KKwkJcnRsODE4MF9jb250dHhfZGlzYWJsZShkZXYpOworCisJCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgYW5hcGFyYW0pOworCX0KKwkvKiBlbmQgbmV3ICovCisKKwl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM0MSB8IGZpcmRhYyApOyAvL1JUWCBNT0RFCisKKwkvLyBTZXQgdHggcG93ZXIgbGV2ZWwgIT8KKworCisJLypiYXNlYmFuZCBjb25maWd1cmF0aW9uKi8KKwl3cml0ZV9waHkoZGV2LDAsMHg5OCk7CisJd3JpdGVfcGh5KGRldiwzLDB4MzgpOworCXdyaXRlX3BoeShkZXYsNCwweGUwKTsKKwl3cml0ZV9waHkoZGV2LDUsMHg5MCk7CisJd3JpdGVfcGh5KGRldiw2LDB4MWEpOworCXdyaXRlX3BoeShkZXYsNywweDY0KTsKKworCS8qU2hvdWxkIGJlIGRvbmUgc29tZXRoaW5nIG1vcmUgaGVyZT8/Ki8KKworCXNhMjQwMF93cml0ZV9waHlfYW50ZW5uYShkZXYscHJpdi0+Y2hhbik7CisKKwl3cml0ZV9waHkoZGV2LDB4MTEsMHg4MCk7CisJaWYocHJpdi0+ZGl2ZXJzaXR5KQorCQl3cml0ZV9waHkoZGV2LDB4MTIsMHhjNyk7CisJZWxzZQorCQl3cml0ZV9waHkoZGV2LDB4MTIsMHg0Nyk7CisKKwl3cml0ZV9waHkoZGV2LDB4MTMsMHg5MCB8IHByaXYtPmNzX3RyZXNob2xkICk7CisKKwl3cml0ZV9waHkoZGV2LDB4MTksMHgwKTsKKwl3cml0ZV9waHkoZGV2LDB4MWEsMHhhMCk7CisKKwlzYTI0MDBfcmZfc2V0X2NoYW4oZGV2LHByaXYtPmNoYW4pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9zYTI0MDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzYTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlciAtIHYgMC43CisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNkZWZpbmUgU0EyNDAwX0FOVEVOTkEgMHg5MQorI2RlZmluZSBTQTI0MDBfRElHX0FOQVBBUkFNX1BXUjFfT04gMHg4CisjZGVmaW5lIFNBMjQwMF9BTkFfQU5BUEFSQU1fUFdSMV9PTiAweDI4CisjZGVmaW5lIFNBMjQwMF9BTkFQQVJBTV9QV1IwX09OIDB4MworCisjZGVmaW5lIFNBMjQwMF9SRl9NQVhfU0VOUyA4NQorI2RlZmluZSBTQTI0MDBfUkZfREVGX1NFTlMgODAKKworI2RlZmluZSBTQTI0MDBfUkVHNF9GSVJEQUNfU0hJRlQgNworCit2b2lkIHNhMjQwMF9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBzYTI0MDBfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CitzaG9ydCBzYTI0MDBfcmZfc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBzZW5zKTsKK3ZvaWQgc2EyNDAwX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2FiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKQEAgLTAsMCArMSwxNjQ0IEBACisvKgorICAgVGhpcyBmaWxlIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydAorICAgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisKKyNpbmNsdWRlICJyODE4MC5oIgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfc2EyNDAwLmgiCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKworLy8jZGVmaW5lIFJBVEVfQ09VTlQgNAordTMyIHJ0bDgxODBfcmF0ZXNbXSA9IHsxMDAwMDAwLDIwMDAwMDAsNTUwMDAwMCwxMTAwMDAwMCwKKwk2MDAwMDAwLDkwMDAwMDAsMTIwMDAwMDAsMTgwMDAwMDAsMjQwMDAwMDAsMzYwMDAwMDAsNDgwMDAwMDAsNTQwMDAwMDB9OworCisjZGVmaW5lIFJBVEVfQ09VTlQgKHNpemVvZihydGw4MTgwX3JhdGVzKS9zaXplb2YocnRsODE4MF9yYXRlc1swXSkpCisKK3N0YXRpYyBDSEFOTkVMX0xJU1QgRGVmYXVsdENoYW5uZWxQbGFuW10gPSB7CisvLwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwxNH0sCQkJLy9EZWZhdWx0IGNoYW5uZWwgcGxhbgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDE5fSwgIAkJLy9GQ0MKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExfSwxMX0sICAgICAgICAgICAgICAgICAgICAJCQkJLy9JQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgIAkvL0VUU0kKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAgIC8vU3BhaW4uIENoYW5nZSB0byBFVFNJLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgIAkvL0ZyYW5jZS4gQ2hhbmdlIHRvIEVUU0kuCisJe3sxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sOX0sCQkJCQkJLy9NS0sKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LCAzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LC8vTUtLMQorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwJLy9Jc3JhZWwuCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNCwzOCw0Miw0Nn0sMTd9LAkJCS8vIEZvciAxMWEgLCBURUxFQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTR9LDE0fQkJCQkJLy9Gb3IgR2xvYmFsIERvbWFpbi4gMS0xMTphY3RpdmUgc2NhbiwgMTItMTQgcGFzc2l2ZSBzY2FuLiAvLytZSiwgMDgwNjI2Cit9Oworc3RhdGljIGludCByODE4MF93eF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEocHJpdi0+aWVlZTgwMjExLCBhLCB3cnF1LCBiKTsKK30KKworCitpbnQgcjgxODBfd3hfc2V0X2tleShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwl9CisKKworLyoJaSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGkgPCAxIHx8IGkgPiA0KQorKi8KKworCWlmIChlcnEtPmxlbmd0aCA+IDApIHsKKworCQkvL2ludCBsZW4gPSBlcnEtPmxlbmd0aCA8PSA1ID8gNSA6IDEzOworCisJCXUzMiogdGtleT0gKHUzMiopIGtleTsKKwkJcHJpdi0+a2V5MFswXSA9IHRrZXlbMF07CisJCXByaXYtPmtleTBbMV0gPSB0a2V5WzFdOworCQlwcml2LT5rZXkwWzJdID0gdGtleVsyXTsKKwkJcHJpdi0+a2V5MFszXSA9IHRrZXlbM10gJjB4ZmY7CisJCURNRVNHKCJTZXR0aW5nIHdlcCBrZXkgdG8gJXggJXggJXggJXgiLAorCQkgICAgICB0a2V5WzBdLHRrZXlbMV0sdGtleVsyXSx0a2V5WzNdKTsKKwkJcnRsODE4MF9zZXRfaHdfd2VwKGRldik7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2JlYWNvbmludGVydmFsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmFhLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCAqcGFybXMgPSAoaW50ICopYjsKKwlpbnQgYmkgPSBwYXJtc1swXTsKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlETUVTRygic2V0dGluZyBiZWFjb24gaW50ZXJ2YWwgdG8gJXgiLGJpKTsKKworCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbD1iaTsKKwlydGw4MTgwX2NvbW1pdChkZXYpOworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X21vZGUocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKK30KKworCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X3JhdGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3JhdGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfY3JjbW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcyA9IChpbnQgKilleHRyYTsKKwlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7CisJc2hvcnQgcHJldiA9IHByaXYtPmNyY21vbjsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYoZW5hYmxlKQorCQlwcml2LT5jcmNtb249MTsKKwllbHNlCisJCXByaXYtPmNyY21vbj0wOworCisJRE1FU0coImJhZCBDUkMgaW4gbW9uaXRvciBtb2RlIGFyZSAlcyIsCisJICAgICAgcHJpdi0+Y3JjbW9uID8gImFjY2VwdGVkIiA6ICJyZWplY3RlZCIpOworCisJaWYocHJldiAhPSBwcml2LT5jcmNtb24gJiYgcHJpdi0+dXApeworCQlydGw4MTgwX2Rvd24oZGV2KTsKKwkJcnRsODE4MF91cChkZXYpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisjaWZkZWYgRU5BQkxFX0lQUworLy8JcHJpbnRrKCJzZXQgbW9kZSBFTkFCTEVfSVBTXG4iKTsKKwlpZihwcml2LT5iSW5hY3RpdmVQcyl7CisJCWlmKHdycXUtPm1vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCUlQU0xlYXZlKGRldik7CisJfQorI2VuZGlmCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9tb2RlKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisKKwkvL3J0bDgxODBfY29tbWl0KGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorc3RydWN0ICBpd19yYW5nZV93aXRoX3NjYW5fY2FwYQoreworICAgICAgICAvKiBJbmZvcm1hdGl2ZSBzdHVmZiAodG8gY2hvb3NlIGJldHdlZW4gZGlmZmVyZW50IGludGVyZmFjZSkgKi8KKyAgICAgICAgX191MzIgICAgICAgICAgIHRocm91Z2hwdXQ7ICAgICAvKiBUbyBnaXZlIGFuIGlkZWEuLi4gKi8KKyAgICAgICAgLyogSW4gdGhlb3J5IHRoaXMgdmFsdWUgc2hvdWxkIGJlIHRoZSBtYXhpbXVtIGJlbmNobWFya2VkCisgICAgICAgICAqIFRDUC9JUCB0aHJvdWdocHV0LCBiZWNhdXNlIHdpdGggbW9zdCBvZiB0aGVzZSBkZXZpY2VzIHRoZQorICAgICAgICAgKiBiaXQgcmF0ZSBpcyBtZWFuaW5nbGVzcyAob3ZlcmhlYWQgYW4gY28pIHRvIGVzdGltYXRlIGhvdworICAgICAgICAgKiBmYXN0IHRoZSBjb25uZWN0aW9uIHdpbGwgZ28gYW5kIHBpY2sgdGhlIGZhc3Rlc3Qgb25lLgorICAgICAgICAgKiBJIHN1Z2dlc3QgcGVvcGxlIHRvIHBsYXkgd2l0aCBOZXRwZXJmIG9yIGFueSBiZW5jaG1hcmsuLi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogTldJRCAob3IgZG9tYWluIGlkKSAqLworICAgICAgICBfX3UzMiAgICAgICAgICAgbWluX253aWQ7ICAgICAgIC8qIE1pbmltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKyAgICAgICAgX191MzIgICAgICAgICAgIG1heF9ud2lkOyAgICAgICAvKiBNYXhpbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisKKyAgICAgICAgLyogT2xkIEZyZXF1ZW5jeSAoYmFja3dhcmQgY29tcGF0IC0gbW92ZWQgbG93ZXIgKSAqLworICAgICAgICBfX3UxNiAgICAgICAgICAgb2xkX251bV9jaGFubmVsczsKKyAgICAgICAgX191OCAgICAgICAgICAgIG9sZF9udW1fZnJlcXVlbmN5OworCisgICAgICAgIC8qIFNjYW4gY2FwYWJpbGl0aWVzICovCisgICAgICAgIF9fdTggICAgICAgICAgICBzY2FuX2NhcGE7Cit9OworLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKworCitzdGF0aWMgaW50IHJ0bDgxODBfd3hfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgdmFsOworCWludCBpOworCS8vc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKiB0bXAgPSAoc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKilyYW5nZTsgLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CisKKwkvKiBMZXQncyB0cnkgdG8ga2VlcCB0aGlzIHN0cnVjdCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgorCSAqIGxpbnV4L2luY2x1ZGUvd2lyZWxlc3MuaAorCSAqLworCisJLyogVE9ETzogU2VlIHdoYXQgdmFsdWVzIHdlIGNhbiBzZXQsIGFuZCByZW1vdmUgdGhlIG9uZXMgd2UgY2FuJ3QKKwkgKiBzZXQsIG9yIGZpbGwgdGhlbSB3aXRoIHNvbWUgZGVmYXVsdCBkYXRhLgorCSAqLworCisJLyogfjUgTWIvcyByZWFsICg4MDIuMTFiKSAqLworCXJhbmdlLT50aHJvdWdocHV0ID0gNSAqIDEwMDAgKiAxMDAwOworCisJLy8gVE9ETzogTm90IHVzZWQgaW4gODAyLjExYj8KKy8vCXJhbmdlLT5taW5fbndpZDsJLyogTWluaW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCS8vIFRPRE86IE5vdCB1c2VkIGluIDgwMi4xMWI/CisvLwlyYW5nZS0+bWF4X253aWQ7CS8qIE1heGltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKworICAgICAgICAvKiBPbGQgRnJlcXVlbmN5IChiYWNrd2FyZCBjb21wYXQgLSBtb3ZlZCBsb3dlciApICovCisvLwlyYW5nZS0+b2xkX251bV9jaGFubmVsczsKKy8vCXJhbmdlLT5vbGRfbnVtX2ZyZXF1ZW5jeTsKKy8vCXJhbmdlLT5vbGRfZnJlcVs2XTsgLyogRmlsbGVyIHRvIGtlZXAgInZlcnNpb24iIGF0IHRoZSBzYW1lIG9mZnNldCAqLworCWlmKHByaXYtPnJmX3NldF9zZW5zICE9IE5VTEwpCisJCXJhbmdlLT5zZW5zaXRpdml0eSA9IHByaXYtPm1heF9zZW5zOwkvKiBzaWduYWwgbGV2ZWwgdGhyZXNob2xkIHJhbmdlICovCisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsKKwkvKiBUT0RPOiBGaW5kIHJlYWwgbWF4IFJTU0kgYW5kIHN0aWNrIGhlcmUgKi8KKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IC05ODsKKwlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCisKKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDkyOyAvKiA+IDglIG1pc3NlZCBiZWFjb25zIGlzICdiYWQnICovCisJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbCB2YWx1ZSBmb3IgUlNTSSAqLworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDIwICsgLTk4OworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IFJBVEVfQ09VTlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVCAmJiBpIDwgSVdfTUFYX0JJVFJBVEVTOyBpKyspIHsKKwkJcmFuZ2UtPmJpdHJhdGVbaV0gPSBydGw4MTgwX3JhdGVzW2ldOworCX0KKworCXJhbmdlLT5taW5fZnJhZyA9IE1JTl9GUkFHX1RIUkVTSE9MRDsKKwlyYW5nZS0+bWF4X2ZyYWcgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisKKwlyYW5nZS0+cG1fY2FwYSA9IDA7CisKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNjsKKworLy8JcmFuZ2UtPnJldHJ5X2NhcGE7CS8qIFdoYXQgcmV0cnkgb3B0aW9ucyBhcmUgc3VwcG9ydGVkICovCisvLwlyYW5nZS0+cmV0cnlfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiByZXRyeSBsaW1pdCAqLworLy8JcmFuZ2UtPnJfdGltZV9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIHJldHJ5IGxpZmUgKi8KKy8vCXJhbmdlLT5taW5fcmV0cnk7CS8qIE1pbmltYWwgbnVtYmVyIG9mIHJldHJpZXMgKi8KKy8vCXJhbmdlLT5tYXhfcmV0cnk7CS8qIE1heGltYWwgbnVtYmVyIG9mIHJldHJpZXMgKi8KKy8vCXJhbmdlLT5taW5fcl90aW1lOwkvKiBNaW5pbWFsIHJldHJ5IGxpZmV0aW1lICovCisvLwlyYW5nZS0+bWF4X3JfdGltZTsJLyogTWF4aW1hbCByZXRyeSBsaWZldGltZSAqLworCisgICAgICAgIHJhbmdlLT5udW1fY2hhbm5lbHMgPSAxNDsKKworCWZvciAoaSA9IDAsIHZhbCA9IDA7IGkgPCAxNDsgaSsrKSB7CisKKwkJLy8gSW5jbHVkZSBvbmx5IGxlZ2FsIGZyZXF1ZW5jaWVzIGZvciBzb21lIGNvdW50cmllcworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYgKChHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKKyNlbHNlCisJCWlmICgocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaSsxXSkgeworI2VuZGlmCisJCSAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5pID0gaSArIDE7CisJCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tpXSAqIDEwMDAwMDsKKwkJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCQl2YWwrKzsKKwkJfSBlbHNlIHsKKwkJCS8vIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIHNldCBhbnl0aGluZyBmb3IgY2hhbm5lbHMKKwkJCS8vIHdlIGRvbid0IHVzZSA/CisJCX0KKworCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJYnJlYWs7CisJfQorCisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIElXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisKKwkvL3RtcC0+c2Nhbl9jYXBhID0gMHgwMTsgLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKy8vWUosYWRkLDA4MDgxOSwgZm9yIGhpZGRlbiBhcAorCS8vcHJpbnRrKCI9PSomKiYqJj09PiVzIGluXG4iLCBfX2Z1bmNfXyk7CisJLy9wcmludGsoIj0qJiomKiYqPT09PmZsYWc6JXgsICV4XG4iLCB3cnF1LT5kYXRhLmZsYWdzLCBJV19TQ0FOX1RISVNfRVNTSUQpOworCWlmICh3cnF1LT5kYXRhLmZsYWdzICYgSVdfU0NBTl9USElTX0VTU0lEKQorCXsKKwkJc3RydWN0IGl3X3NjYW5fcmVxKiByZXEgPSAoc3RydWN0IGl3X3NjYW5fcmVxKiliOworCQlpZiAocmVxLT5lc3NpZF9sZW4pCisJCXsKKwkJCS8vcHJpbnRrKCI9PSoqJiomKiYqKj09PT5zY2FuIHNldCBzc2lkOiVzXG4iLCByZXEtPmVzc2lkKTsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHJlcS0+ZXNzaWRfbGVuOworCQkJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCByZXEtPmVzc2lkLCByZXEtPmVzc2lkX2xlbik7CisJCQkvL3ByaW50aygiPT09PT0+bmV0d29yayBzc2lkOiVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCk7CisJCX0KKwl9CisvL1lKLGFkZCwwODA4MTksIGZvciBoaWRkZW4gYXAsIGVuZAorCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZihwcml2LT51cCl7CisjaWZkZWYgRU5BQkxFX0lQUworLy8JCXByaW50aygic2V0IHNjYW4gRU5BQkxFX0lQU1xuIik7CisJCXByaXYtPmllZWU4MDIxMS0+YWN0c2Nhbm5pbmcgPSB0cnVlOworCQlpZihwcml2LT5iSW5hY3RpdmVQcyAmJiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSl7CisJCQlJUFNMZWF2ZShkZXYpOworLy8JCQlkb3duKCZwcml2LT5pZWVlODAyMTEtPnd4X3NlbSk7CisKKy8vCQkJaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgIShwcml2LT5pZWVlODAyMTEtPnByb3RvX3N0YXJ0ZWQpKXsKKy8vCQkJCXJldCA9IC0xOworLy8JCQkJdXAoJnByaXYtPmllZWU4MDIxMS0+d3hfc2VtKTsKKy8vCQkJCXVwKCZwcml2LT53eF9zZW0pOworLy8JCQkJcmV0dXJuIHJldDsKKy8vCQkJfQorCisJLy8JcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAmcHJpdi0+aWVlZTgwMjExLT53eF9zeW5jX3NjYW5fd3EpOworCQkvL3ByaW50aygic3RhcnQgc2Nhbj09PT09PT09PT09PT09PT09PT09PT09PT09PT0+XG4iKTsKKwkJaWVlZTgwMjExX3NvZnRtYWNfaXBzX3NjYW5fc3luY3JvKHByaXYtPmllZWU4MDIxMSk7CisvL2llZWU4MDIxMV9zdGFydF9zY2FuKHByaXYtPmllZWU4MDIxMSk7CisJCS8qIGludGVudGlvbmFsbHkgZm9yZ2V0IHRvIHVwIHNlbSAqLworLy8JCQl1cCgmcHJpdi0+aWVlZTgwMjExLT53eF9zZW0pOworCQkJcmV0ID0gMDsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkJLy9ZSixhZGQsMDgwODI4LCBwcmV2ZW50IHNjYW4gaW4gQnVzeVRyYWZmaWMKKwkJCS8vRklYTUU6IE5lZWQgdG8gY29uc2lkZXIgbGFzdCBzY2FuIHRpbWUKKwkJCWlmICgocHJpdi0+bGlua19kZXRlY3QuYkJ1c3lUcmFmZmljKSAmJiAodHJ1ZSkpCisJCQl7CisJCQkJcmV0ID0gMDsKKwkJCQlwcmludGsoIk5vdyB0cmFmZmljIGlzIGJ1c3ksIHBsZWFzZSB0cnkgbGF0ZXIhXG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCS8vWUosYWRkLDA4MDgyOCwgcHJldmVudCBzY2FuIGluIEJ1c3lUcmFmZmljLGVuZAorCQkJCXJldCA9IGllZWU4MDIxMV93eF9zZXRfc2Nhbihwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCQl9CisJfQorCWVsc2UKKwkJcmV0ID0gLTE7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCWlmKHByaXYtPnVwKQorCQlyZXQgPSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4ocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKwllbHNlCisJCXJldCA9IC0xOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IHJldDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKyNpZmRlZiBFTkFCTEVfSVBTCisJLy9wcmludGsoInNldCBlc3NpZCBFTkFCTEVfSVBTXG4iKTsKKwlpZihwcml2LT5iSW5hY3RpdmVQcykKKwkJSVBTTGVhdmUoZGV2KTsKKyNlbmRpZgorLy8JcHJpbnRrKCJoYWhhOnNldCBlc3NpZCAlcyBlc3NpZF9sZW4gPSAlZCBlc3NpZF9mbGdzID0gJWRcbiIsYiwgIHdycXUtPmVzc2lkLmxlbmd0aCwgd3JxdS0+ZXNzaWQuZmxhZ3MpOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9lc3NpZChwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X2dldF9lc3NpZChwcml2LT5pZWVlODAyMTEsIGEsIHdycXUsIGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9mcmVxKHByaXYtPmllZWU4MDIxMSwgYSwgd3JxdSwgYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X25hbWUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAod3JxdS0+ZnJhZy5kaXNhYmxlZCkKKwkJcHJpdi0+aWVlZTgwMjExLT5mdHMgPSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UgeworCQlpZiAod3JxdS0+ZnJhZy52YWx1ZSA8IE1JTl9GUkFHX1RIUkVTSE9MRCB8fAorCQkgICAgd3JxdS0+ZnJhZy52YWx1ZSA+IE1BWF9GUkFHX1RIUkVTSE9MRCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXByaXYtPmllZWU4MDIxMS0+ZnRzID0gd3JxdS0+ZnJhZy52YWx1ZSAmIH4weDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl3cnF1LT5mcmFnLnZhbHVlID0gcHJpdi0+aWVlZTgwMjExLT5mdHM7CisJd3JxdS0+ZnJhZy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCisJd3JxdS0+ZnJhZy5kaXNhYmxlZCA9ICh3cnF1LT5mcmFnLnZhbHVlID09IERFRkFVTFRfRlJBR19USFJFU0hPTEQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF93YXAocHJpdi0+aWVlZTgwMjExLGluZm8sYXdycSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF93YXAocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfZW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWlmKHByaXYtPmh3X3dlcCkgcmV0ID0gcjgxODBfd3hfc2V0X2tleShkZXYsaW5mbyx3cnF1LGtleSk7CisJZWxzZXsKKwkJRE1FU0coIlNldHRpbmcgU1cgd2VwIGtleSIpOworCQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGtleSk7CisJfQorCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9lbmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9lbmNvZGUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBrZXkpOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3NjYW5fdHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphYSwgdW5pb24KKyBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpwKXsKKworIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcz0oaW50KilwOworCWludCBtb2RlPXBhcm1zWzBdOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlwcml2LT5pZWVlODAyMTEtPmFjdGl2ZV9zY2FuID0gbW9kZTsKKworCXJldHVybiAxOworfQorCisKKy8qIGFkZGVkIGJ5IGNocmlzdGlhbiAqLworLyoKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X21vbml0b3JfdHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphYSwgdW5pb24KKyBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpwKXsKKworIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcz0oaW50KilwOworCWludCBtb2RlPXBhcm1zWzBdOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlICE9IElXX01PREVfTU9OSVRPUikgcmV0dXJuIC0xOworICAJcHJpdi0+cHJpc21faGRyID0gbW9kZTsKKwlpZighbW9kZSlkZXYtPnR5cGU9QVJQSFJEX0lFRUU4MDIxMTsKKwllbHNlIGRldi0+dHlwZT1BUlBIUkRfSUVFRTgwMjExX1BSSVNNOworCURNRVNHKCJ1c2luZyAlcyBSWCBlbmNhcCIsIG1vZGUgPyAiQVZTIjoiODAyMTEiKTsKKwlyZXR1cm4gMDsKKworfQorKi8KKy8vb2YgICAgICAgICByODE4MF93eF9zZXRfbW9uaXRvcl90eXBlCisvKiBlbmQgYWRkZWQgY2hyaXN0aWFuICovCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZiAod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSUZFVElNRSB8fAorCSAgICB3cnF1LT5yZXRyeS5kaXNhYmxlZCl7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKCEod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkpeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYod3JxdS0+cmV0cnkudmFsdWUgPiBSODE4MF9NQVhfUkVUUlkpeworCQllcnI9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXByaXYtPnJldHJ5X3J0cyA9IHdycXUtPnJldHJ5LnZhbHVlOworCQlETUVTRygiU2V0dGluZyByZXRyeSBmb3IgUlRTL0NUUyBkYXRhIHRvICVkIiwgd3JxdS0+cmV0cnkudmFsdWUpOworCisJfWVsc2UgeworCQlwcml2LT5yZXRyeV9kYXRhID0gd3JxdS0+cmV0cnkudmFsdWU7CisJCURNRVNHKCJTZXR0aW5nIHJldHJ5IGZvciBub24gUlRTL0NUUyBkYXRhIHRvICVkIiwgd3JxdS0+cmV0cnkudmFsdWUpOworCX0KKworCS8qIEZJWE1FICEKKwkgKiBXZSBtaWdodCB0cnkgdG8gd3JpdGUgZGlyZWN0bHkgdGhlIFRYIGNvbmZpZyByZWdpc3RlcgorCSAqIG9yIHRvIHJlc3RhcnQganVzdCB0aGUgKFIpVFggcHJvY2Vzcy4KKwkgKiBJJ20gdW5zdXJlIGlmIHdob2xlIHJlc2V0IGlzIHJlYWxseSBuZWVkZWQKKwkgKi8KKworIAlydGw4MTgwX2NvbW1pdChkZXYpOworCS8qCisJaWYocHJpdi0+dXApeworCQlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJCXJ0bDgxODBfcnhfZW5hYmxlKGRldik7CisJCXJ0bDgxODBfdHhfZW5hYmxlKGRldik7CisKKwl9CisJKi8KK2V4aXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwl3cnF1LT5yZXRyeS5kaXNhYmxlZCA9IDA7IC8qIGNhbid0IGJlIGRpc2FibGVkICovCisKKwlpZiAoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0KKwkgICAgSVdfUkVUUllfTElGRVRJTUUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgJiBJV19SRVRSWV9NQVg7CisJCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfcnRzOworCX0gZWxzZSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgJiBJV19SRVRSWV9NSU47CisJCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfZGF0YTsKKwl9CisJLy9ETUVTRygicmV0dXJuaW5nICVkIix3cnF1LT5yZXRyeS52YWx1ZSk7CisKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaWYocHJpdi0+cmZfc2V0X3NlbnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOyAvKiB3ZSBoYXZlIG5vdCB0aGlzIHN1cHBvcnQgZm9yIHRoaXMgcmFkaW8gKi8KKwl3cnF1LT5zZW5zLnZhbHVlID0gcHJpdi0+c2VuczsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXNob3J0IGVyciA9IDA7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJLy9ETUVTRygiYXR0ZW1wdCB0byBzZXQgc2Vuc2l2aXR5IHRvICVkZGIiLHdycXUtPnNlbnMudmFsdWUpOworCWlmKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpIHsKKwkJZXJyPSAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJCWdvdG8gZXhpdDsKKwl9CisJaWYocHJpdi0+cmZfc2V0X3NlbnMoZGV2LCB3cnF1LT5zZW5zLnZhbHVlKSA9PSAwKQorCQlwcml2LT5zZW5zID0gd3JxdS0+c2Vucy52YWx1ZTsKKwllbHNlCisJCWVycj0gLUVJTlZBTDsKKworZXhpdDoKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfcmF3dHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9yYXd0eChwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X2dldF9wb3dlcihwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE4MF93eF9zZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcHJpbnRrKCI9Pj4+Pj4+Pj4+Pj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PnNldCBwb3dlcjolZCwlZCFcbiIsd3JxdS0+cG93ZXIuZGlzYWJsZWQsIHdycXUtPnBvd2VyLmZsYWdzKTsKKwlpZiAod3JxdS0+cG93ZXIuZGlzYWJsZWQ9PTApIHsKKwkJd3JxdS0+cG93ZXIuZmxhZ3N8PUlXX1BPV0VSX0FMTF9SOworCQl3cnF1LT5wb3dlci5mbGFnc3w9SVdfUE9XRVJfVElNRU9VVDsKKwkJd3JxdS0+cG93ZXIudmFsdWUgPTEwMDA7CisJfQorCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9wb3dlcihwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE4MF93eF9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAod3JxdS0+cnRzLmRpc2FibGVkKQorCQlwcml2LT5ydHMgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CisJZWxzZSB7CisJCWlmICh3cnF1LT5ydHMudmFsdWUgPCBNSU5fUlRTX1RIUkVTSE9MRCB8fAorCQkgICAgd3JxdS0+cnRzLnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5ydHMgPSB3cnF1LT5ydHMudmFsdWU7CisJfQorCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKworCXdycXUtPnJ0cy52YWx1ZSA9IHByaXYtPnJ0czsKKwl3cnF1LT5ydHMuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLworCXdycXUtPnJ0cy5kaXNhYmxlZCA9ICh3cnF1LT5ydHMudmFsdWUgPT0gMCk7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgZHVtbXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYikKK3sKKwlyZXR1cm4gLTE7Cit9CisKKy8qCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9wc21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKwlpbnQgcmV0ID0gMDsKKworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYocHJpdikgeworCQlpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCQlpZihpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpIHsKKwkJCSooKHVuc2lnbmVkIGludCAqKWV4dHJhKSA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQkqKCh1bnNpZ25lZCBpbnQgKilleHRyYSkgPSBJV19QT1dFUl9USU1FT1VUOworIAlpZiAoaWVlZS0+cHMgJiBJRUVFODAyMTFfUFNfTUJDQVNUKQorCQkJKigodW5zaWduZWQgaW50ICopZXh0cmEpIHw9IElXX1BPV0VSX0FMTF9SOworCQllbHNlCisJCQkqKCh1bnNpZ25lZCBpbnQgKilleHRyYSkgfD0gSVdfUE9XRVJfVU5JQ0FTVF9SOworCX0gZWxzZQorCQlyZXQgPSAtMTsKK2V4aXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfcHNtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKwlpbnQgcmV0ID0gMDsKKworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9wb3dlcihwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorKi8KKworc3RhdGljIGludCByODE4MF93eF9nZXRfaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJaW50IHJldCA9IDA7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWllZWUgPSBwcml2LT5pZWVlODAyMTE7CisKKwlzdHJjcHkoZXh0cmEsICI4MDIuMTEiKTsKKwlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSB7CisJCXN0cmNhdChleHRyYSwgImIiKTsKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisJCQlzdHJjYXQoZXh0cmEsICIvZyIpOworCX0gZWxzZSBpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKwkJc3RyY2F0KGV4dHJhLCAiZyIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJaW50ICpwYXJhbSA9IChpbnQgKilleHRyYTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbW9kdWxhdGlvbiA9IDAsIG1vZGUgPSAwOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZiAoKnBhcmFtID09IDEpIHsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CisJCW1vZGUgPSBJRUVFX0I7CisJcHJpbnRrKEtFUk5fSU5GTyAiQiBtb2RlIVxuIik7CisJfSBlbHNlIGlmICgqcGFyYW0gPT0gMikgeworCQltb2R1bGF0aW9uIHw9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT047CisJCW1vZGUgPSBJRUVFX0c7CisJcHJpbnRrKEtFUk5fSU5GTyAiRyBtb2RlIVxuIik7CisJfSBlbHNlIGlmICgqcGFyYW0gPT0gMykgeworCQltb2R1bGF0aW9uIHw9IElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTjsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCQltb2RlID0gSUVFRV9CfElFRUVfRzsKKwlwcmludGsoS0VSTl9JTkZPICJCL0cgbW9kZSFcbiIpOworCX0KKworCWlmKGllZWUtPnByb3RvX3N0YXJ0ZWQpIHsKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisJCWllZWUtPm1vZGUgPSBtb2RlOworCQlpZWVlLT5tb2R1bGF0aW9uID0gbW9kdWxhdGlvbjsKKwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCX0gZWxzZSB7CisJCWllZWUtPm1vZGUgPSBtb2RlOworCQlpZWVlLT5tb2R1bGF0aW9uID0gbW9kdWxhdGlvbjsKKy8vCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CisJfQorCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9nZXRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKworCisJKmV4dHJhID0gKGNoYXIpIHByaXYtPnBsY3BfcHJlYW1ibGVfbW9kZTsgCS8vIDA6YXV0byAxOnNob3J0IDI6bG9uZworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9wcmVhbWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldCA9IDA7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZiAoKmV4dHJhPDB8fCpleHRyYT4yKQorCQlyZXQgPSAtMTsKKwllbHNlCisJCXByaXYtPnBsY3BfcHJlYW1ibGVfbW9kZSA9ICooKHNob3J0ICopZXh0cmEpIDsKKworCisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9zaWdsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrID0gJihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yayk7CisJaW50IHJldCA9IDA7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwkvLyBNb2RpZnkgYnkgaGlrYXJ1IDYuNQorCSooKGludCAqKWV4dHJhKSA9IHByaXYtPndzdGF0cy5xdWFsLmxldmVsOy8vZm9yIGludGVyZmFjZSB0ZXN0ICxpdCBzaG91bGQgYmUgdGhlIHByaXYtPndzdGF0cy5xdWFsLmxldmVsOworCisKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3NpZ3F1YWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9ICYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspOworCWludCByZXQgPSAwOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJLy8gTW9kaWZ5IGJ5IGhpa2FydSA2LjUKKwkqKChpbnQgKilleHRyYSkgPSBwcml2LT53c3RhdHMucXVhbC5xdWFsOy8vZm9yIGludGVyZmFjZSB0ZXN0ICxpdCBzaG91bGQgYmUgdGhlIHByaXYtPndzdGF0cy5xdWFsLnF1YWw7CisKKworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9yZXNldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPWllZWU4MDIxMV9wcml2KGRldik7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXByaXYtPnN0YXRzLnR4cmR1ID0gMDsKKwlwcml2LT5zdGF0cy5yeHJkdSA9IDA7CisJcHJpdi0+c3RhdHMucnhub2xhc3QgPSAwOworCXByaXYtPnN0YXRzLnJ4bm9kYXRhID0gMDsKKwlwcml2LT5zdGF0cy5yeG5vcG9pbnRlciA9IDA7CisJcHJpdi0+c3RhdHMudHhucGVyciA9IDA7CisJcHJpdi0+c3RhdHMudHhyZXN1bWVkID0gMDsKKwlwcml2LT5zdGF0cy5yeGVyciA9IDA7CisJcHJpdi0+c3RhdHMucnhvdmVyZmxvdyA9IDA7CisJcHJpdi0+c3RhdHMucnhpbnQgPSAwOworCisJcHJpdi0+c3RhdHMudHhucG9raW50ID0gMDsKKwlwcml2LT5zdGF0cy50eGhwb2tpbnQgPSAwOworCXByaXYtPnN0YXRzLnR4aHBlcnIgPSAwOworCXByaXYtPnN0YXRzLmludHMgPSAwOworCXByaXYtPnN0YXRzLnNoaW50cyA9IDA7CisJcHJpdi0+c3RhdHMudHhvdmVyZmxvdyA9IDA7CisJcHJpdi0+c3RhdHMucnhkbWFmYWlsID0gMDsKKwlwcml2LT5zdGF0cy50eGJlYWNvbiA9IDA7CisJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIgPSAwOworCXByaXYtPnN0YXRzLnR4bHBva2ludCA9IDA7CisJcHJpdi0+c3RhdHMudHhscGVyciA9IDA7CisJcHJpdi0+c3RhdHMudHhyZXRyeSA9MDsvLzIwMDYwNjAxCisJcHJpdi0+c3RhdHMucnhjcmNlcnJtaW49MDsKKwlwcml2LT5zdGF0cy5yeGNyY2Vycm1pZD0wOworCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWF4PTA7CisJcHJpdi0+c3RhdHMucnhpY3ZlcnI9MDsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7CisKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfcmFkaW9fb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID1pZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcHJpdi0+cmZfd2FrZXVwKGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfcmFkaW9fb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9aWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXByaXYtPnJmX3NsZWVwKGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworCit9CitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9jaGFubmVscGxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwkqZXh0cmEgPSBwcml2LT5jaGFubmVsX3BsYW47CisKKworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2NoYW5uZWxwbGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgKnZhbCA9IChpbnQgKilleHRyYTsKKwlpbnQgaTsKKwlwcmludGsoIi0tLS0taW4gZnVuICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZiAoRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkxlbiAhPSAwKXsKKwkJcHJpdiAtPmNoYW5uZWxfcGxhbiA9ICp2YWw7CisJCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcAorCQlmb3IgKGk9MTtpPD1NQVhfQ0hBTk5FTF9OVU1CRVI7aSsrKQorCQl7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQkJR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwW2ldID0gMDsKKyNlbHNlCisJCQlwcml2LT5pZWVlODAyMTEtPmNoYW5uZWxfbWFwW2ldID0gMDsKKyNlbmRpZgorCQl9CisJCS8vIFNldCBuZXcgY2hhbm5lbCBtYXAKKwkJZm9yIChpPTE7aTw9RGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkxlbjtpKyspCisJCXsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCQlHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXBbRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkNoYW5uZWxbaS0xXV0gPSAxOworI2Vsc2UKKwkJCXByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXBbRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkNoYW5uZWxbaS0xXV0gPSAxOworI2VuZGlmCisJCX0KKwl9CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE4MF93eF9nZXRfdmVyc2lvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXN0cmNweShleHRyYSwgIjEwMjAuMDgwOCIpOworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8vYWRkZWQgYnkgYW15IDA4MDgxOAorLy9yZWNlaXZlIGRhdGFyYXRlIGZyb20gdXNlciB0eXBpbmcgdmFsaWQgcmF0ZSBpcyBmcm9tIDIgdG8gMTA4ICgxIC0gNTRNKSwgaWYgaW5wdXQgMCwgcmV0dXJuIHRvIG5vcm1hbCByYXRlIGFkYXB0aXZlLgorc3RhdGljIGludCByODE4MF93eF9zZXRfZm9yY2VyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBmb3JjZXJhdGUgPSAqZXh0cmE7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcHJpbnRrKCI9PT09PT09PT09PT09PT4lcygpOiBmb3JjZXJhdGUgaXMgJWRcbiIsX19GVU5DVElPTl9fLGZvcmNlcmF0ZSk7CisJaWYoKGZvcmNlcmF0ZSA9PSAyKSB8fCAoZm9yY2VyYXRlID09IDQpIHx8IChmb3JjZXJhdGUgPT0gMTEpIHx8IChmb3JjZXJhdGUgPT0gMjIpIHx8IChmb3JjZXJhdGUgPT0gMTIpIHx8CisJCShmb3JjZXJhdGUgPT0gMTgpIHx8IChmb3JjZXJhdGUgPT0gMjQpIHx8IChmb3JjZXJhdGUgPT0gMzYpIHx8IChmb3JjZXJhdGUgPT0gNDgpIHx8IChmb3JjZXJhdGUgPT0gNzIpIHx8CisJCShmb3JjZXJhdGUgPT0gOTYpIHx8IChmb3JjZXJhdGUgPT0gMTA4KSkKKwl7CisJCXByaXYtPkZvcmNlZERhdGFSYXRlID0gMTsKKwkJcHJpdi0+aWVlZTgwMjExLT5yYXRlID0gZm9yY2VyYXRlICogNTsKKwl9CisJZWxzZSBpZihmb3JjZXJhdGUgPT0gMCkKKwl7CisJCXByaXYtPkZvcmNlZERhdGFSYXRlID0gMDsKKwkJcHJpbnRrKCJPSyEgcmV0dXJuIHJhdGUgYWRhcHRpdmVcbiIpOworCX0KKwllbHNlCisJCXByaW50aygiRVJSOiB3cm9uZyByYXRlXG4iKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE4MF93eF9zZXRfZW5jX2V4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9wcmludGsoIj09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaW50IHJldD0wOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dChwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCS8vcHJpbnRrKCI9PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ9MDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2F1dGgocHJpdi0+aWVlZTgwMjExLCBpbmZvLCBkYXRhLCBleHRyYSk7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE4MF93eF9zZXRfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWludCByZXQ9MDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworI2lmIDEKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X21sbWUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisjZW5kaWYKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfZ2VuX2llKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworLy8JcHJpbnRrKCI9PT09PiVzKCksIGxlbjolZFxuIiwgX19GVU5DVElPTl9fLCBkYXRhLT5sZW5ndGgpOworCWludCByZXQ9MDsKKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworICAgICAgICBkb3duKCZwcml2LT53eF9zZW0pOworI2lmIDEKKyAgICAgICAgcmV0ID0gaWVlZTgwMjExX3d4X3NldF9nZW5faWUocHJpdi0+aWVlZTgwMjExLCBleHRyYSwgZGF0YS0+bGVuZ3RoKTsKKyNlbmRpZgorICAgICAgICB1cCgmcHJpdi0+d3hfc2VtKTsKKwkvL3ByaW50aygiPD09PT09PSVzKCksIHJldDolZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworCisKK30KK3N0YXRpYyBpd19oYW5kbGVyIHI4MTgwX3d4X2hhbmRsZXJzW10gPQoreworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X25hbWUsICAgCSAgLyogU0lPQ0dJV05BTUUgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICovCisgICAgICAgIHI4MTgwX3d4X3NldF9mcmVxLCAgICAgICAgLyogU0lPQ1NJV0ZSRVEgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X2ZyZXEsICAgICAgICAvKiBTSU9DR0lXRlJFUSAqLworICAgICAgICByODE4MF93eF9zZXRfbW9kZSwgICAgICAgIC8qIFNJT0NTSVdNT0RFICovCisgICAgICAgIHI4MTgwX3d4X2dldF9tb2RlLCAgICAgICAgLyogU0lPQ0dJV01PREUgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X3NlbnMsICAgICAgICAvKiBTSU9DU0lXU0VOUyAqLworICAgICAgICByODE4MF93eF9nZXRfc2VucywgICAgICAgIC8qIFNJT0NHSVdTRU5TICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JBTkdFICovCisgICAgICAgIHJ0bDgxODBfd3hfZ2V0X3JhbmdlLAkgIC8qIFNJT0NHSVdSQU5HRSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQUklWICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BSSVYgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1RBVFMgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1RBVFMgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DV0lXVEhSU1BZICovCisgICAgICAgIHI4MTgwX3d4X3NldF93YXAsICAgICAgCSAgLyogU0lPQ1NJV0FQICovCisgICAgICAgIHI4MTgwX3d4X2dldF93YXAsICAgICAgICAgLyogU0lPQ0dJV0FQICovCisJcjgxODBfd3hfc2V0X21sbWUsICAgICAgICAvKiBTSU9DU0lXTUxNRSovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQTElTVCAtLSBkZXByaWNhdGVkICovCisgICAgICAgIHI4MTgwX3d4X3NldF9zY2FuLCAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3NjYW4sICAgICAgICAvKiBTSU9DR0lXU0NBTiAqLworICAgICAgICByODE4MF93eF9zZXRfZXNzaWQsICAgICAgIC8qIFNJT0NTSVdFU1NJRCAqLworICAgICAgICByODE4MF93eF9nZXRfZXNzaWQsICAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOSUNLTiAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOSUNLTiAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgICAgIHI4MTgwX3d4X3NldF9yYXRlLCAgICAgICAgLyogU0lPQ1NJV1JBVEUgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3JhdGUsICAgICAgICAvKiBTSU9DR0lXUkFURSAqLworICAgICAgICByODE4MF93eF9zZXRfcnRzLCAgICAgICAgIC8qIFNJT0NTSVdSVFMgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3J0cywgICAgICAgICAvKiBTSU9DR0lXUlRTICovCisgICAgICAgIHI4MTgwX3d4X3NldF9mcmFnLCAgICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X2ZyYWcsICAgICAgICAvKiBTSU9DR0lXRlJBRyAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAqLworICAgICAgICByODE4MF93eF9zZXRfcmV0cnksICAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworICAgICAgICByODE4MF93eF9nZXRfcmV0cnksICAgICAgIC8qIFNJT0NHSVdSRVRSWSAqLworICAgICAgICByODE4MF93eF9zZXRfZW5jLCAgICAgICAgIC8qIFNJT0NTSVdFTkNPREUgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X2VuYywgICAgICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisgICAgICAgIHI4MTgwX3d4X3NldF9wb3dlciwgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisgICAgICAgIHI4MTgwX3d4X2dldF9wb3dlciwgICAgICAgLyogU0lPQ0dJV1BPV0VSICovCisgICAgICAgIE5VTEwsCQkJICAvKi0tLWhvbGUtLS0qLworCU5VTEwsIAkJCSAgLyotLS1ob2xlLS0tKi8KKwlyODE4MF93eF9zZXRfZ2VuX2llLCAgICAgIC8qIFNJT0NTSVdHRU5JRSAqLworCU5VTEwsIAkJCSAgLyogU0lPQ1NJV0dFTklFICovCisJcjgxODBfd3hfc2V0X2F1dGgsCSAgLyogU0lPQ1NJV0FVVEggKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdBVVRIICovCisJcjgxODBfd3hfc2V0X2VuY19leHQsIAkgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgIAkgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwlOVUxMLCAJCQkgLyogU0lPQ1NJV1BNS1NBICovCisJTlVMTCwgCQkJICAvKi0tLWhvbGUtLS0qLworfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyByODE4MF9wcml2YXRlX2FyZ3NbXSA9IHsKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJiYWRjcmMiCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4MSwKKwkJMCwgMCwgImR1bW15IgorCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MiwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJiZWFjb25pbnQiCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4MywKKwkJMCwgMCwgImR1bW15IgorCisJfSwKKwkvKiBhZGRlZCBieSBjaHJpc3RpYW4gKi8KKwkvL3sKKwkvLwlTSU9DSVdGSVJTVFBSSVYgKyAweDIsCisJLy8JSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJwcmlzbWhkciIKKwkvL30sCisJLyogZW5kIGFkZGVkIGJ5IGNocmlzdGlhbiAqLworCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg0LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImFjdGl2ZXNjYW4iCisKKwl9LAorCXsJU0lPQ0lXRklSU1RQUklWICsgMHg1LAorCQkwLCAwLCAiZHVtbXkiCisKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg2LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInJhd3R4IgorCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4NywKKwkJMCwgMCwgImR1bW15IgorCisJfSwKKy8vCXsKKy8vCQlTSU9DSVdGSVJTVFBSSVYgKyAweDUsCisvLwkJMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRwc21vZGUiCisvLwl9LAorLy8JeworLy8JCVNJT0NJV0ZJUlNUUFJJViArIDB4NiwKKy8vCQlJV19QUklWX1NJWkVfRklYRUQsIDAsICJzZXRwc21vZGUiCisvLwl9LAorLy9zZXQvZ2V0IG1vZGUgaGF2ZSBiZWVuIHJlYWxpemVkIGluIHB1YmxpYyBoYW5kbGVycworCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDgsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0aXdtb2RlIgorCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDksCisJCTAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMzIsICJnZXRpd21vZGUiCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4QSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRwcmVhbWJsZSIKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHhCLAorCQkwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHByZWFtYmxlIgorCX0sCisJewlTSU9DSVdGSVJTVFBSSVYgKyAweEMsCisJCTAsIDAsICJkdW1teSIKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHhELAorCQkwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHJzc2kiCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4RSwKKwkJMCwgMCwgImR1bW15IgorCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweEYsCisJCTAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0bGlua3F1YWwiCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDEwLAorCQkwLCAwLCAicmVzZXRzdGF0cyIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTEsCisJCTAsMCwgImR1bW15IgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxMiwKKwkJMCwgMCwgInJhZGlvb24iCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDEzLAorCQkwLCAwLCAicmFkaW9vZmYiCisgCX0sCisgCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxNCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRjaGFubmVsIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxNSwKKwkJMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRjaGFubmVsIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxNiwKKwkJMCwwLCAiZHVtbXkiCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDE3LAorCQkwLElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMzIsICJnZXR2ZXJzaW9uIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxOCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRyYXRlIgorCX0sCit9OworCisKK3N0YXRpYyBpd19oYW5kbGVyIHI4MTgwX3ByaXZhdGVfaGFuZGxlcltdID0geworCXI4MTgwX3d4X3NldF9jcmNtb24sICAgLypTSU9DSVdTRUNPTkRQUklWKi8KKwlkdW1teSwKKwlyODE4MF93eF9zZXRfYmVhY29uaW50ZXJ2YWwsCisJZHVtbXksCisJLy9yODE4MF93eF9zZXRfbW9uaXRvcl90eXBlLAorCXI4MTgwX3d4X3NldF9zY2FuX3R5cGUsCisJZHVtbXksCisJcjgxODBfd3hfc2V0X3Jhd3R4LAorCWR1bW15LAorCXI4MTgwX3d4X3NldF9pd21vZGUsCisJcjgxODBfd3hfZ2V0X2l3bW9kZSwKKwlyODE4MF93eF9zZXRfcHJlYW1ibGUsCisJcjgxODBfd3hfZ2V0X3ByZWFtYmxlLAorCWR1bW15LAorCXI4MTgwX3d4X2dldF9zaWdsZXZlbCwKKwlkdW1teSwKKwlyODE4MF93eF9nZXRfc2lncXVhbCwKKwlyODE4MF93eF9yZXNldF9zdGF0cywKKwlkdW1teSwvL3I4MTgwX3d4X2dldF9zdGF0cworCXI4MTgwX3d4X3JhZGlvX29uLAorCXI4MTgwX3d4X3JhZGlvX29mZiwKKwlyODE4MF93eF9zZXRfY2hhbm5lbHBsYW4sCisJcjgxODBfd3hfZ2V0X2NoYW5uZWxwbGFuLAorCWR1bW15LAorCXI4MTgwX3d4X2dldF92ZXJzaW9uLAorCXI4MTgwX3d4X3NldF9mb3JjZXJhdGUsCit9OworCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CitzdGF0aWMgaW5saW5lIGludCBpc19zYW1lX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyAgICAgICAgLyogQSBuZXR3b3JrIGlzIG9ubHkgYSBkdXBsaWNhdGUgaWYgdGhlIGNoYW5uZWwsIEJTU0lELCBFU1NJRAorICAgICAgICAgKiBhbmQgdGhlIGNhcGFiaWxpdHkgZmllbGQgKGluIHBhcnRpY3VsYXIgSUJTUyBhbmQgQlNTKSBhbGwgbWF0Y2guCisgICAgICAgICAqIFdlIHRyZWF0IGFsbCA8aGlkZGVuPiB3aXRoIHRoZSBzYW1lIEJTU0lEIGFuZCBjaGFubmVsCisgICAgICAgICAqIGFzIG9uZSBuZXR3b3JrICovCisgICAgICAgIHJldHVybiAoKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pfHwoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYgIC8vWUosbW9kLCAwODA4MTksZm9yIGhpZGRlbiBhcAorCQkJLy8oKHNyYy0+c3NpZF9sZW4gPT0gZHN0LT5zc2lkX2xlbikgJiYKKwkJCShzcmMtPmNoYW5uZWwgPT0gZHN0LT5jaGFubmVsKSAmJgorCQkJIW1lbWNtcChzcmMtPmJzc2lkLCBkc3QtPmJzc2lkLCBFVEhfQUxFTikgJiYKKwkJCSghbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKXx8KGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmICAvL1lKLG1vZCwgMDgwODE5LGZvciBoaWRkZW4gYXAKKwkJCS8vIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikgJiYKKwkJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID09CisJCQkoZHN0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSAmJgorCQkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSA9PQorCQkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpKSk7Cit9CisKKy8vV0IgbW9kZWZpZWQgdG8gc2hvdyBzaWduYWwgdG8gR1VJIG9uIDE4LTAxLTIwMDgKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjgxODBfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXN0cnVjdCBpd19zdGF0aXN0aWNzKiB3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOworCS8vc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKiB0YXJnZXQgPSBOVUxMOworCWludCB0bXBfbGV2ZWwgPSAwOworCWludCB0bXBfcXVhbCA9IDA7CisJaW50IHRtcF9ub2lzZSA9IDA7CisJLy91bnNpZ25lZCBsb25nIGZsYWc7CisKKwlpZiAoaWVlZS0+c3RhdGUgPCBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJd3N0YXRzLT5xdWFsLnF1YWwgPSAwOworCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSAwOworCQl3c3RhdHMtPnF1YWwubm9pc2UgPSAwOworCQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKKwkJcmV0dXJuIHdzdGF0czsKKwl9CisjaWYgMAorCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFnKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkKKwl7CisJCWlmIChpc19zYW1lX25ldHdvcmsodGFyZ2V0LCAmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBpZWVlKSkKKwkJeworCQkJcHJpbnRrKCJpdCdzIHNhbWUgbmV0d29yazolc1xuIiwgdGFyZ2V0LT5zc2lkKTsKKyNpZiAwCisJCQlpZiAoIXRtcF9sZXZlbCkKKwkJCXsKKwkJCQl0bXBfbGV2ZWwgPSB0YXJnZXQtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCQkJCXRtcF9xdWFsID0gdGFyZ2V0LT5zdGF0cy5zaWduYWw7CisJCQl9CisJCQllbHNlCisJCQl7CisKKwkJCQl0bXBfbGV2ZWwgPSAoMTUqdG1wX2xldmVsICsgdGFyZ2V0LT5zdGF0cy5zaWduYWxzdHJlbmd0aCkvMTY7CisJCQkJdG1wX3F1YWwgPSAoMTUqdG1wX3F1YWwgKyB0YXJnZXQtPnN0YXRzLnNpZ25hbCkvMTY7CisJCQl9CisjZWxzZQorCQkJdG1wX2xldmVsID0gdGFyZ2V0LT5zdGF0cy5zaWduYWw7CisJCQl0bXBfcXVhbCA9IHRhcmdldC0+c3RhdHMuc2lnbmFsc3RyZW5ndGg7CisJCQl0bXBfbm9pc2UgPSB0YXJnZXQtPnN0YXRzLm5vaXNlOworCQkJcHJpbnRrKCJsZXZlbDolZCwgcXVhbDolZCwgbm9pc2U6JWRcbiIsIHRtcF9sZXZlbCwgdG1wX3F1YWwsIHRtcF9ub2lzZSk7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWcpOworI2VuZGlmCisJdG1wX2xldmVsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5zaWduYWw7CisJdG1wX3F1YWwgPSAoJmllZWUtPmN1cnJlbnRfbmV0d29yayktPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCXRtcF9ub2lzZSA9ICgmaWVlZS0+Y3VycmVudF9uZXR3b3JrKS0+c3RhdHMubm9pc2U7CisJLy9wcmludGsoImxldmVsOiVkLCBxdWFsOiVkLCBub2lzZTolZFxuIiwgdG1wX2xldmVsLCB0bXBfcXVhbCwgdG1wX25vaXNlKTsKKworLy8JcHJpbnRrKCJsZXZlbDolZFxuIiwgdG1wX2xldmVsKTsKKwl3c3RhdHMtPnF1YWwubGV2ZWwgPSB0bXBfbGV2ZWw7CisJd3N0YXRzLT5xdWFsLnF1YWwgPSB0bXBfcXVhbDsKKwl3c3RhdHMtPnF1YWwubm9pc2UgPSB0bXBfbm9pc2U7CisJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEfCBJV19RVUFMX0RCTTsKKwlyZXR1cm4gd3N0YXRzOworfQorI2VuZGlmCisKKworc3RydWN0IGl3X2hhbmRsZXJfZGVmICByODE4MF93eF9oYW5kbGVyc19kZWY9eworCS5zdGFuZGFyZCA9IHI4MTgwX3d4X2hhbmRsZXJzLAorCS5udW1fc3RhbmRhcmQgPSBzaXplb2YocjgxODBfd3hfaGFuZGxlcnMpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlID0gcjgxODBfcHJpdmF0ZV9oYW5kbGVyLAorCS5udW1fcHJpdmF0ZSA9IHNpemVvZihyODE4MF9wcml2YXRlX2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorIAkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihyODE4MF9wcml2YXRlX2FyZ3MpIC8gc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSByODE4MF9nZXRfd2lyZWxlc3Nfc3RhdHMsCisjZW5kaWYKKwkucHJpdmF0ZV9hcmdzID0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKilyODE4MF9wcml2YXRlX2FyZ3MsCit9OworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjBhNjdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMworCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKiB0aGlzIGZpbGUgKHdpbGwpIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycyovCisKKyNpZm5kZWYgUjgxODBfV1hfSAorI2RlZmluZSBSODE4MF9XWF9ICisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKK2V4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcjgxODBfd3hfaGFuZGxlcnNfZGVmOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjg4NWEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCkBAIC0wLDAgKzEsMzM0MiBAQAorLyorKworQ29weXJpZ2h0IChjKSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworTW9kdWxlIE5hbWU6CisgCXI4MTg1Yl9pbml0LmMKKworQWJzdHJhY3Q6CisgCUhhcmR3YXJlIEluaXRpYWxpemF0aW9uIGFuZCBIYXJkd2FyZSBJTyBmb3IgUlRMODE4NUIKKworTWFqb3IgQ2hhbmdlIEhpc3Rvcnk6CisJV2hlbiAgICAgICAgV2hvICAgICAgV2hhdAorCS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCTIwMDYtMTEtMTUgICAgWGlvbmcJCUNyZWF0ZWQKKworTm90ZXM6CisJVGhpcyBmaWxlIGlzIHBvcnRlZCBmcm9tIFJUTDgxODVCIFdpbmRvd3MgZHJpdmVyLgorCisKKy0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUluY2x1ZGUgRmlsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfc2EyNDAwLmgiICAvKiBQSElMSVBTIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfbWF4MjgyMC5oIiAvKiBNQVhJTSBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX2djdC5oIiAgICAgLyogR0NUIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfcnRsODIyNS5oIiAvKiBSVEw4MjI1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfcnRsODI1NS5oIiAvKiBSVEw4MjU1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIgICAvKiBDYXJkIEVFUFJPTSAqLworI2luY2x1ZGUgInI4MTgwX3d4LmgiCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9QTQorI2luY2x1ZGUgInI4MTgwX3BtLmgiCisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisKKy8vI2RlZmluZSBDT05GSUdfUlRMODE4MF9JT19NQVAKKworI2RlZmluZSBUQ18zV19QT0xMX01BWF9UUllfQ05UIDUKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCitzdGF0aWMgdTggTUFDX1JFR19UQUJMRVtdWzJdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUEFHQSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgzNChCUlNSKSwgMHhCRShSQVRFX0ZBTExCQUNLX0NUTCksIDB4MUUwKEFSRlIpIHdvdWxkIHNldCBpbiBId0NvbmZpZ3VyZVJUTDgxODUoKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgyNzIoUkZTV19DVFJMKSwgMHgxQ0UoQUVTTVNLX1FDKSBzZXQgaW4gSW5pdGlhbGl6ZUFkYXB0ZXI4MTg1KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDFGMH4weDFGOCAgc2V0IGluIE1hY0NvbmZpZ184NUJBU0lDKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDA4LCAweGFlfSwgezB4MGEsIDB4NzJ9LCB7MHg1YiwgMHg0Mn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NCwgMHg4OH0sIHsweDg1LCAweDI0fSwgezB4ODgsIDB4NTR9LCB7MHg4YiwgMHhiOH0sIHsweDhjLCAweDAzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDhkLCAweDQwfSwgezB4OGUsIDB4MDB9LCB7MHg4ZiwgMHgwMH0sIHsweDViLCAweDE4fSwgezB4OTEsIDB4MDN9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4OTQsIDB4MEZ9LCB7MHg5NSwgMHgzMn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg5NiwgMHgwMH0sIHsweDk3LCAweDA3fSwgezB4YjQsIDB4MjJ9LCB7MHhkYiwgMHgwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhmMCwgMHgzMn0sIHsweGYxLCAweDMyfSwgezB4ZjIsIDB4MDB9LCB7MHhmMywgMHgwMH0sIHsweGY0LCAweDMyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweGY1LCAweDQzfSwgezB4ZjYsIDB4MDB9LCB7MHhmNywgMHgwMH0sIHsweGY4LCAweDQ2fSwgezB4ZjksIDB4YTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4ZmEsIDB4MDB9LCB7MHhmYiwgMHgwMH0sIHsweGZjLCAweDk2fSwgezB4ZmQsIDB4YTR9LCB7MHhmZSwgMHgwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhmZiwgMHgwMH0sCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUEFHRSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIEZsZXh0cm9uaWNzIHN5c3RlbSBMb2dvIFBDSUhDVCBmYWlsdXJlOgorCQkJLy8gMHgxQzR+MHgxQ0Qgc2V0IG5vLXplcm8gdmFsdWUgdG8gYXZvaWQgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgMHg0NVs3XT0xCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1ZSwgMHgwMX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1OCwgMHgwMH0sIHsweDU5LCAweDAwfSwgezB4NWEsIDB4MDR9LCB7MHg1YiwgMHgwMH0sIHsweDYwLCAweDI0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDYxLCAweDk3fSwgezB4NjIsIDB4RjB9LCB7MHg2MywgMHgwOX0sIHsweDgwLCAweDBGfSwgezB4ODEsIDB4RkZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4ODIsIDB4RkZ9LCB7MHg4MywgMHgwM30sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhDNCwgMHgyMn0sIHsweEM1LCAweDIyfSwgezB4QzYsIDB4MjJ9LCB7MHhDNywgMHgyMn0sIHsweEM4LCAweDIyfSwgLy9sem0gYWRkIDA4MDgyNgorCQkJezB4QzksIDB4MjJ9LCB7MHhDQSwgMHgyMn0sIHsweENCLCAweDIyfSwgezB4Q0MsIDB4MjJ9LCB7MHhDRCwgMHgyMn0sLy9sem0gYWRkIDA4MDgyNgorICAgICAgICAgICAgICAgICAgICAgICAgezB4ZTIsIDB4MDB9LAorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUEFHRSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgezB4NWUsIDB4MDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4MGMsIDB4MDR9LCB7MHg0YywgMHgzMH0sIHsweDRkLCAweDA4fSwgezB4NTAsIDB4MDV9LCB7MHg1MSwgMHhmNX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1MiwgMHgwNH0sIHsweDUzLCAweGEwfSwgezB4NTQsIDB4ZmZ9LCB7MHg1NSwgMHhmZn0sIHsweDU2LCAweGZmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDU3LCAweGZmfSwgezB4NTgsIDB4MDh9LCB7MHg1OSwgMHgwOH0sIHsweDVhLCAweDA4fSwgezB4NWIsIDB4MDh9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4NjAsIDB4MDh9LCB7MHg2MSwgMHgwOH0sIHsweDYyLCAweDA4fSwgezB4NjMsIDB4MDh9LCB7MHg2NCwgMHgyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg4YywgMHgzZn0sIHsweDhkLCAweDNmfSwgezB4OGUsIDB4M2Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4OGYsIDB4M2Z9LCB7MHhjNCwgMHhmZn0sIHsweGM1LCAweGZmfSwgezB4YzYsIDB4ZmZ9LCB7MHhjNywgMHhmZn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhjOCwgMHgwMH0sIHsweGM5LCAweDAwfSwgezB4Y2EsIDB4ODB9LCB7MHhjYiwgMHgwMH0sCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUEFHQSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgezB4NWUsIDB4MDB9LHsweDlmLCAweDAzfQorICAgICAgICAgICAgICAgIH07CisKKworc3RhdGljIHU4ICBaRUJSQV9BR0NbXT17CisJCQkwLAorCQkJMHg3RSwweDdFLDB4N0UsMHg3RSwweDdELDB4N0MsMHg3QiwweDdBLDB4NzksMHg3OCwweDc3LDB4NzYsMHg3NSwweDc0LDB4NzMsMHg3MiwKKwkJCTB4NzEsMHg3MCwweDZGLDB4NkUsMHg2RCwweDZDLDB4NkIsMHg2QSwweDY5LDB4NjgsMHg2NywweDY2LDB4NjUsMHg2NCwweDYzLDB4NjIsCisJCQkweDQ4LDB4NDcsMHg0NiwweDQ1LDB4NDQsMHgyOSwweDI4LDB4MjcsMHgyNiwweDI1LDB4MjQsMHgyMywweDIyLDB4MjEsMHgwOCwweDA3LAorCQkJMHgwNiwweDA1LDB4MDQsMHgwMywweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkJCTB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgxMCwweDExLDB4MTIsMHgxMywweDE1LDB4MTYsCisJCQkweDE3LDB4MTcsMHgxOCwweDE4LDB4MTksMHgxYSwweDFhLDB4MWIsMHgxYiwweDFjLDB4MWMsMHgxZCwweDFkLDB4MWQsMHgxZSwweDFlLAorCQkJMHgxZiwweDFmLDB4MWYsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIxLDB4MjEsMHgyMSwweDIyLDB4MjIsMHgyMiwweDIzLDB4MjMsMHgyNCwKKwkJCTB4MjQsMHgyNSwweDI1LDB4MjUsMHgyNiwweDI2LDB4MjcsMHgyNywweDJGLDB4MkYsMHgyRiwweDJGLDB4MkYsMHgyRiwweDJGLDB4MkYKKwkJCX07CisKK3N0YXRpYyB1MzIgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtdPXsKKwkJCTB4MDA5NiwweDAwNzYsMHgwMDU2LDB4MDAzNiwweDAwMTYsMHgwMWY2LDB4MDFkNiwweDAxYjYsCisJCQkweDAxOTYsMHgwMTc2LDB4MDBGNywweDAwRDcsMHgwMEI3LDB4MDA5NywweDAwNzcsMHgwMDU3LAorCQkJMHgwMDM3LDB4MDBGQiwweDAwREIsMHgwMEJCLDB4MDBGRiwweDAwRTMsMHgwMEMzLDB4MDBBMywKKwkJCTB4MDA4MywweDAwNjMsMHgwMDQzLDB4MDAyMywweDAwMDMsMHgwMUUzLDB4MDFDMywweDAxQTMsCisJCQkweDAxODMsMHgwMTYzLDB4MDE0MywweDAxMjMsMHgwMTAzCisJfTsKKworc3RhdGljIHU4IE9GRE1fQ09ORklHW109eworCQkJLy8gT0ZETSByZWcweDA2Wzc6MF09MHhGRjogRW5hYmxlIHBvd2VyIHNhdmluZyBtb2RlIGluIFJYCisJCQkvLyBPRkRNIHJlZzB4M0NbNF09MSdiMTogRW5hYmxlIFJYIHBvd2VyIHNhdmluZyBtb2RlCisJCQkvLyBvZmRtIDB4M2EgPSAweDdiICwob3JpZ2luYWwgOiAweGZiKSBGb3IgRUNTIHNoaWVsZGluZyByb29tIFRQIHRlc3QKKworCQkJLy8gMHgwMAorCQkJMHgxMCwgMHgwRiwgMHgwQSwgMHgwQywgMHgxNCwgMHhGQSwgMHhGRiwgMHg1MCwKKwkJCTB4MDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NUMsIDB4MDAsIDB4MDAsCisJCQkvLyAweDEwCisJCQkweDQwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweDI2LAorCQkJMHgzMiwgMHgzMywgMHgwNiwgMHhBNSwgMHg2RiwgMHg1NSwgMHhDOCwgMHhCQiwKKwkJCS8vIDB4MjAKKwkJCTB4MEEsIDB4RTEsIDB4MkMsIDB4NEEsIDB4ODYsIDB4ODMsIDB4MzQsIDB4MDAsCisJCQkweDRGLCAweDI0LCAweDZGLCAweEMyLCAweDAzLCAweDQwLCAweDgwLCAweDAwLAorCQkJLy8gMHgzMAorCQkJMHhDMCwgMHhDMSwgMHg1OCwgMHhGMSwgMHgwMCwgMHhDNCwgMHg5MCwgMHgzZSwKKwkJCTB4RDgsIDB4M0MsIDB4N0IsIDB4MTAsIDB4MTAKKwkJfTsKKyNlbHNlCisgc3RhdGljIHU4IE1BQ19SRUdfVEFCTEVbXVsyXT17CisJCQkvL1BBR0EgMDoKKwkJCXsweGYwLCAweDMyfSwgezB4ZjEsIDB4MzJ9LCB7MHhmMiwgMHgwMH0sIHsweGYzLCAweDAwfSwgezB4ZjQsIDB4MzJ9LAorCQkJezB4ZjUsIDB4NDN9LCB7MHhmNiwgMHgwMH0sIHsweGY3LCAweDAwfSwgezB4ZjgsIDB4NDZ9LCB7MHhmOSwgMHhhNH0sCisJCQl7MHhmYSwgMHgwMH0sIHsweGZiLCAweDAwfSwgezB4ZmMsIDB4OTZ9LCB7MHhmZCwgMHhhNH0sIHsweGZlLCAweDAwfSwKKwkJCXsweGZmLCAweDAwfSwKKworCQkJLy9QQUdFIDE6CisJCQl7MHg1ZSwgMHgwMX0sCisJCQl7MHg1OCwgMHg0Yn0sIHsweDU5LCAweDAwfSwgezB4NWEsIDB4NGJ9LCB7MHg1YiwgMHgwMH0sIHsweDYwLCAweDRifSwKKwkJCXsweDYxLCAweDA5fSwgezB4NjIsIDB4NGJ9LCB7MHg2MywgMHgwOX0sIHsweGNlLCAweDBmfSwgezB4Y2YsIDB4MDB9LAorCQkJezB4ZTAsIDB4ZmZ9LCB7MHhlMSwgMHgwZn0sIHsweGUyLCAweDAwfSwgezB4ZjAsIDB4NGV9LCB7MHhmMSwgMHgwMX0sCisJCQl7MHhmMiwgMHgwMn0sIHsweGYzLCAweDAzfSwgezB4ZjQsIDB4MDR9LCB7MHhmNSwgMHgwNX0sIHsweGY2LCAweDA2fSwKKwkJCXsweGY3LCAweDA3fSwgezB4ZjgsIDB4MDh9LAorCisKKwkJCS8vUEFHRSAyOgorCQkJezB4NWUsIDB4MDJ9LAorCQkJezB4MGMsIDB4MDR9LCB7MHgyMSwgMHg2MX0sIHsweDIyLCAweDY4fSwgezB4MjMsIDB4NmZ9LCB7MHgyNCwgMHg3Nn0sCisJCQl7MHgyNSwgMHg3ZH0sIHsweDI2LCAweDg0fSwgezB4MjcsIDB4OGR9LCB7MHg0ZCwgMHgwOH0sIHsweDRlLCAweDAwfSwKKwkJCXsweDUwLCAweDA1fSwgezB4NTEsIDB4ZjV9LCB7MHg1MiwgMHgwNH0sIHsweDUzLCAweGEwfSwgezB4NTQsIDB4MWZ9LAorCQkJezB4NTUsIDB4MjN9LCB7MHg1NiwgMHg0NX0sIHsweDU3LCAweDY3fSwgezB4NTgsIDB4MDh9LCB7MHg1OSwgMHgwOH0sCisJCQl7MHg1YSwgMHgwOH0sIHsweDViLCAweDA4fSwgezB4NjAsIDB4MDh9LCB7MHg2MSwgMHgwOH0sIHsweDYyLCAweDA4fSwKKwkJCXsweDYzLCAweDA4fSwgezB4NjQsIDB4Y2Z9LCB7MHg3MiwgMHg1Nn0sIHsweDczLCAweDlhfSwKKworCQkJLy9QQUdBIDA6CisJCQl7MHg1ZSwgMHgwMH0sCisJCQl7MHgzNCwgMHhmZn0sIHsweDM1LCAweDBmfSwgezB4NWIsIDB4NDB9LCB7MHg4NCwgMHg4OH0sIHsweDg1LCAweDI0fSwKKwkJCXsweDg4LCAweDU0fSwgezB4OGIsIDB4Yjh9LCB7MHg4YywgMHgwN30sIHsweDhkLCAweDAwfSwgezB4OTQsIDB4MWJ9LAorCQkJezB4OTUsIDB4MTJ9LCB7MHg5NiwgMHgwMH0sIHsweDk3LCAweDA2fSwgezB4OWQsIDB4MWF9LCB7MHg5ZiwgMHgxMH0sCisJCQl7MHhiNCwgMHgyMn0sIHsweGJlLCAweDgwfSwgezB4ZGIsIDB4MDB9LCB7MHhlZSwgMHgwMH0sIHsweDViLCAweDQyfSwKKwkJCXsweDkxLCAweDAzfSwKKworCQkJLy9QQUdFIDI6CisJCQl7MHg1ZSwgMHgwMn0sCisJCQl7MHg0YywgMHgwM30sCisKKwkJCS8vUEFHRSAwOgorCQkJezB4NWUsIDB4MDB9LAorCisJCQkvL1BBR0UgMzoKKwkJCXsweDVlLCAweDAzfSwKKwkJCXsweDlmLCAweDAwfSwKKworCQkJLy9QQUdFIDA6CisJCQl7MHg1ZSwgMHgwMH0sCisJCQl7MHg4YywgMHgwMX0sIHsweDhkLCAweDEwfSx7MHg4ZSwgMHgwOH0sIHsweDhmLCAweDAwfQorCQl9OworCisKK3N0YXRpYyB1OCAgWkVCUkFfQUdDW109eworCTAsCisJMHg1ZSwweDVlLDB4NWUsMHg1ZSwweDVkLDB4NWIsMHg1OSwweDU3LDB4NTUsMHg1MywweDUxLDB4NGYsMHg0ZCwweDRiLDB4NDksMHg0NywKKwkweDQ1LDB4NDMsMHg0MSwweDNmLDB4M2QsMHgzYiwweDM5LDB4MzcsMHgzNSwweDMzLDB4MzEsMHgyZiwweDJkLDB4MmIsMHgyOSwweDI3LAorCTB4MjUsMHgyMywweDIxLDB4MWYsMHgxZCwweDFiLDB4MTksMHgxNywweDE1LDB4MTMsMHgxMSwweDBmLDB4MGQsMHgwYiwweDA5LDB4MDcsCisJMHgwNSwweDAzLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKKwkweDE5LDB4MTksMHgxOSwweDAxOSwweDE5LDB4MTksMHgxOSwweDE5LDB4MTksMHgxOSwweDFlLDB4MWYsMHgyMCwweDIxLDB4MjEsMHgyMiwKKwkweDIzLDB4MjQsMHgyNCwweDI1LDB4MjUsMHgyNiwweDI2LDB4MjcsMHgyNywweDI4LDB4MjgsMHgyOCwweDI5LDB4MmEsMHgyYSwweDJiLAorCTB4MmIsMHgyYiwweDJjLDB4MmMsMHgyYywweDJkLDB4MmQsMHgyZCwweDJlLDB4MmUsMHgyZiwweDMwLDB4MzEsMHgzMSwweDMxLDB4MzEsCisJMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMQorCX07CisKK3N0YXRpYyB1MzIgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtdPXsKKwkwLAorCTB4MDQwMCwweDA0MDEsMHgwNDAyLDB4MDQwMywweDA0MDQsMHgwNDA1LDB4MDQwOCwweDA0MDksCisJMHgwNDBhLDB4MDQwYiwweDA1MDIsMHgwNTAzLDB4MDUwNCwweDA1MDUsMHgwNTQwLDB4MDU0MSwKKwkweDA1NDIsMHgwNTQzLDB4MDU0NCwweDA1NDUsMHgwNTgwLDB4MDU4MSwweDA1ODIsMHgwNTgzLAorCTB4MDU4NCwweDA1ODUsMHgwNTg4LDB4MDU4OSwweDA1OGEsMHgwNThiLDB4MDY0MywweDA2NDQsCisJMHgwNjQ1LDB4MDY4MCwweDA2ODEsMHgwNjgyLDB4MDY4MywweDA2ODQsMHgwNjg1LDB4MDY4OCwKKwkweDA2ODksMHgwNjhhLDB4MDY4YiwweDA2OGMsMHgwNzQyLDB4MDc0MywweDA3NDQsMHgwNzQ1LAorCTB4MDc4MCwweDA3ODEsMHgwNzgyLDB4MDc4MywweDA3ODQsMHgwNzg1LDB4MDc4OCwweDA3ODksCisJMHgwNzhhLDB4MDc4YiwweDA3OGMsMHgwNzhkLDB4MDc5MCwweDA3OTEsMHgwNzkyLDB4MDc5MywKKwkweDA3OTQsMHgwNzk1LDB4MDc5OCwweDA3OTksMHgwNzlhLDB4MDc5YiwweDA3OWMsMHgwNzlkLAorCTB4MDdhMCwweDA3YTEsMHgwN2EyLDB4MDdhMywweDA3YTQsMHgwN2E1LDB4MDdhOCwweDA3YTksCisJMHgwM2FhLDB4MDNhYiwweDAzYWMsMHgwM2FkLDB4MDNiMCwweDAzYjEsMHgwM2IyLDB4MDNiMywKKwkweDAzYjQsMHgwM2I1LDB4MDNiOCwweDAzYjksMHgwM2JhLDB4MDNiYiwweDAzYmIKK307CisKKy8vIDIwMDYuMDcuMTMsIFNEMyBzenV5aXRhc2k6CisvLwlPRkRNLjB4MDM9MHgwQyAob3JpZ2luYWwgaXMgMHgwRikKKy8vIFVzZSB0aGUgbmV3IFNEMyBnaXZlbiBwYXJhbSwgYnkgc2hpZW4gY2hhbmcsIDIwMDYuMDcuMTQKK3N0YXRpYyB1OCBPRkRNX0NPTkZJR1tdPXsKKwkweDEwLCAweDBkLCAweDAxLCAweDBDLCAweDE0LCAweGZiLCAweDBmLCAweDYwLCAweDAwLCAweDYwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4NWMsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhhOCwgMHg0NiwgMHhiMiwgMHgzMywgMHgwNywgMHhhNSwgMHg2ZiwgMHg1NSwKKwkweGM4LCAweGIzLCAweDBhLCAweGUxLCAweDFjLCAweDhhLCAweGI2LCAweDgzLCAweDM0LCAweDBmLAorCTB4NGYsIDB4MjMsIDB4NmYsIDB4YzIsIDB4NmIsIDB4NDAsIDB4ODAsIDB4MDAsIDB4YzAsIDB4YzEsCisJMHg1OCwgMHhmMSwgMHgwMCwgMHhlNCwgMHg5MCwgMHgzZSwgMHg2ZCwgMHgzYywgMHhmZiwgMHgwNworfTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAqIEhhcmR3YXJlIElPCisgICogdGhlIGNvZGUgaXMgcG9ydGVkIGZyb20gV2luZG93cyBzb3VyY2UgY29kZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZAorUGxhdGZvcm1JT1dyaXRlMUJ5dGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCW9mZnNldCwKKwl1OAkJZGF0YQorCSkKK3sKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJd3JpdGVfbmljX2J5dGUoZGV2LCBvZmZzZXQsIGRhdGEpOworCXJlYWRfbmljX2J5dGUoZGV2LCBvZmZzZXQpOyAvLyBUbyBtYWtlIHN1cmUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgMjAwNS4xMS4wOSwgYnkgcmNuamtvLgorCisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCXdyaXRlX25pY19ieXRlKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgKG9mZnNldCAmIDB4ZmYpLCBkYXRhKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPV3JpdGUxQnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1giLCBQYWdlLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisjZW5kaWYKK30KKwordm9pZAorUGxhdGZvcm1JT1dyaXRlMkJ5dGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCW9mZnNldCwKKwl1MTYJCWRhdGEKKwkpCit7CisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCXdyaXRlX25pY193b3JkKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwlyZWFkX25pY193b3JkKGRldiwgb2Zmc2V0KTsgLy8gVG8gbWFrZSBzdXJlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIDIwMDUuMTEuMDksIGJ5IHJjbmprby4KKworCisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCXdyaXRlX25pY193b3JkKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCXdyaXRlX25pY193b3JkKGRldiwgKG9mZnNldCAmIDB4ZmYpLCBkYXRhKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPV3JpdGUyQnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1giLCBQYWdlLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisjZW5kaWYKK30KK3U4IFBsYXRmb3JtSU9SZWFkMUJ5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIG9mZnNldCk7CisKK3ZvaWQKK1BsYXRmb3JtSU9Xcml0ZTRCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQsCisJdTMyCQlkYXRhCisJKQoreworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKy8ve2J5IGFteSAwODAzMTIKK2lmIChvZmZzZXQgPT0gUGh5QWRkcikKKwl7Ly9Gb3IgQmFzZSBCYW5kIGNvbmZpZ3VyYXRpb24uCisJCXVuc2lnbmVkIGNoYXIJY21kQnl0ZTsKKwkJdW5zaWduZWQgbG9uZwlkYXRhQnl0ZXM7CisJCXVuc2lnbmVkIGNoYXIJaWR4OworCQl1OAl1MWJUbXA7CisKKwkJY21kQnl0ZSA9ICh1OCkoZGF0YSAmIDB4MDAwMDAwZmYpOworCQlkYXRhQnl0ZXMgPSBkYXRhPj44OworCisJCS8vCisJCS8vIDA3MTAxMCwgcmNuamtvOgorCQkvLyBUaGUgY3JpdGljYWwgc2VjdGlvbiBpcyBvbmx5IEJCIHJlYWQvd3JpdGUgcmFjZSBjb25kaXRpb24uCisJCS8vIEFzc3VtcHRpb246CisJCS8vIDEuIFdlIGFzc3VtZSBOTyBvbmUgd2lsbCBhY2Nlc3MgQkIgYXQgRElSUUwsIG90aGVyd2lzZSwgc3lzdGVtIHdpbGwgY3Jhc2ggZm9yCisJCS8vIGFjcXVpcmluZyB0aGUgc3BpbmxvY2sgaW4gc3VjaCBjb250ZXh0LgorCQkvLyAyLiBQbGF0Zm9ybUlPV3JpdGU0Qnl0ZSgpIE1VU1QgTk9UIGJlIHJlY3Vyc2l2ZS4KKwkJLy8KKy8vCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCAmKHBEZXZpY2UtPklvU3BpbkxvY2spICk7CisKKwkJZm9yKGlkeCA9IDA7IGlkeCA8IDMwOyBpZHgrKykKKwkJeyAvLyBNYWtlIHN1cmUgY29tbWFuZCBiaXQgaXMgY2xlYXIgYmVmb3JlIGFjY2VzcyBpdC4KKwkJCXUxYlRtcCA9IFBsYXRmb3JtSU9SZWFkMUJ5dGUoZGV2LCBQaHlBZGRyKTsKKwkJCWlmKCh1MWJUbXAgJiBCSVQ3KSA9PSAwKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCW1kZWxheSgxMCk7CisJCX0KKworCQlmb3IoaWR4PTA7IGlkeCA8IDM7IGlkeCsrKQorCQl7CisJCQlQbGF0Zm9ybUlPV3JpdGUxQnl0ZShkZXYsb2Zmc2V0KzEraWR4LCgodTgqKSZkYXRhQnl0ZXMpW2lkeF0gKTsKKwkJfQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIG9mZnNldCwgY21kQnl0ZSk7CisKKy8vCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCAmKHBEZXZpY2UtPklvU3BpbkxvY2spICk7CisJfQorLy9ieSBhbXkgMDgwMzEyfQorCWVsc2V7CisJCXdyaXRlX25pY19kd29yZChkZXYsIG9mZnNldCwgZGF0YSk7CisJCXJlYWRfbmljX2R3b3JkKGRldiwgb2Zmc2V0KTsgLy8gVG8gbWFrZSBzdXJlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIDIwMDUuMTEuMDksIGJ5IHJjbmprby4KKwl9CisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCXdyaXRlX25pY193b3JkKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIChvZmZzZXQgJiAweGZmKSwgZGF0YSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKHBzciAmIDB4ZmMpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgMC4KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8vIElsbGVnYWwgcGFnZSBudW1iZXIuCisJCURNRVNHRSgiUGxhdGZvcm1JT1dyaXRlNEJ5dGUoKTogaWxsZWdhbCBwYWdlIG51bWJlcjogJWQsIG9mZnNldDogJSNYIiwgUGFnZSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCit9CisKK3U4CitQbGF0Zm9ybUlPUmVhZDFCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQKKwkpCit7CisJdTgJZGF0YSA9IDA7CisKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJZGF0YSA9IHJlYWRfbmljX2J5dGUoZGV2LCBvZmZzZXQpOworCisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCWRhdGEgPSByZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0KTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCWRhdGEgPSByZWFkX25pY19ieXRlKGRldiwgKG9mZnNldCAmIDB4ZmYpKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPUmVhZDFCeXRlKCk6IGlsbGVnYWwgcGFnZSBudW1iZXI6ICVkLCBvZmZzZXQ6ICUjWCIsIFBhZ2UsIG9mZnNldCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGRhdGE7Cit9CisKK3UxNgorUGxhdGZvcm1JT1JlYWQyQnl0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJb2Zmc2V0CisJKQoreworCXUxNglkYXRhID0gMDsKKworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwlkYXRhID0gcmVhZF9uaWNfd29yZChkZXYsIG9mZnNldCk7CisKKyNlbHNlIC8vIFBvcnQgSU8KKwl1MzIgUGFnZSA9IChvZmZzZXQgPj4gOCk7CisKKwlzd2l0Y2goUGFnZSkKKwl7CisJY2FzZSAwOiAvLyBQYWdlIDAKKwkJZGF0YSA9IHJlYWRfbmljX3dvcmQoZGV2LCBvZmZzZXQpOworCQlicmVhazsKKworCWNhc2UgMTogLy8gUGFnZSAxCisJY2FzZSAyOiAvLyBQYWdlIDIKKwljYXNlIDM6IC8vIFBhZ2UgMworCQl7CisJCQl1OCBwc3IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsICgocHNyICYgMHhmYykgfCAodTgpUGFnZSkpOyAvLyBTd2l0Y2ggdG8gcGFnZSBOLgorCQkJZGF0YSA9IHJlYWRfbmljX3dvcmQoZGV2LCAob2Zmc2V0ICYgMHhmZikpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChwc3IgJiAweGZjKSk7IC8vIFN3aXRjaCB0byBwYWdlIDAuCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvLyBJbGxlZ2FsIHBhZ2UgbnVtYmVyLgorCQlETUVTR0UoIlBsYXRmb3JtSU9SZWFkMkJ5dGUoKTogaWxsZWdhbCBwYWdlIG51bWJlcjogJWQsIG9mZnNldDogJSNYIiwgUGFnZSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZGF0YTsKK30KKwordTMyCitQbGF0Zm9ybUlPUmVhZDRCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQKKwkpCit7CisJdTMyCWRhdGEgPSAwOworCisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCWRhdGEgPSByZWFkX25pY19kd29yZChkZXYsIG9mZnNldCk7CisKKyNlbHNlIC8vIFBvcnQgSU8KKwl1MzIgUGFnZSA9IChvZmZzZXQgPj4gOCk7CisKKwlzd2l0Y2goUGFnZSkKKwl7CisJY2FzZSAwOiAvLyBQYWdlIDAKKwkJZGF0YSA9IHJlYWRfbmljX2R3b3JkKGRldiwgb2Zmc2V0KTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCWRhdGEgPSByZWFkX25pY19kd29yZChkZXYsIChvZmZzZXQgJiAweGZmKSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKHBzciAmIDB4ZmMpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgMC4KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8vIElsbGVnYWwgcGFnZSBudW1iZXIuCisJCURNRVNHRSgiUGxhdGZvcm1JT1JlYWQ0Qnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1hcbiIsIFBhZ2UsIG9mZnNldCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQKK1NldE91dHB1dEVuYWJsZU9mUmZQaW5zKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZDSElQSURfUlRMODIyNToKKwljYXNlIFJGX1pFQlJBMjoKKwljYXNlIFJGX1pFQlJBNDoKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4MWJmZik7CisJCS8vd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4MWZmZik7CisJCWJyZWFrOworCX0KK30KKwordm9pZAorWkVCUkFfUkZTZXJpYWxXcml0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJCWRhdGEyV3JpdGUsCisJdTgJCQl0b3RhbExlbmd0aCwKKwl1OAkJCWxvdzJoaWdoCisJKQoreworCVRocmVlV2lyZVJlZwkJdHdyZWc7CisJaW50IAkJCQlpOworCXUxNgkJCQlvdmFsLG92YWwyLG92YWwzOworCXUzMgkJCQltYXNrOworCXUxNgkJCQlVc2hvcnRCdWZmZXI7CisKKwl1OAkJCXUxYlRtcDsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gUlRMODE4N1MgSFNTSSBSZWFkL1dyaXRlIEZ1bmN0aW9uCisJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFJGX1NXX0NPTkZJRyk7CisJdTFiVG1wIHw9ICAgUkZfU1dfQ0ZHX1NJOyAgIC8vcmVnMDhbMV09MSBTZXJpYWwgSW50ZXJmYWNlKFNJKQorCXdyaXRlX25pY19ieXRlKGRldiwgUkZfU1dfQ09ORklHLCB1MWJUbXApOworI2VuZGlmCisJVXNob3J0QnVmZmVyID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCk7CisJb3ZhbCA9IFVzaG9ydEJ1ZmZlciAmIDB4ZmZmODsgLy8gV2Ugc2hhbGwgY2xlYXIgYml0MCwgMSwgMiBmaXJzdCwgMjAwNS4xMC4yOCwgYnkgcmNuamtvLgorCisJb3ZhbDIgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlKTsKKwlvdmFsMyA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJLy8gPFJKX05PVEU+IDMtd2lyZSBzaG91bGQgYmUgY29udHJvbGVkIGJ5IEhXIHdoZW4gd2UgZmluaXNoIFNXIDMtd2lyZSBwcm9ncmFtbWluZy4gMjAwNS4wOC4xMCwgYnkgcmNuamtvLgorCW92YWwzICY9IDB4ZmZmODsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAob3ZhbDJ8MHgwMDA3KSk7IC8vIFNldCBUbyBPdXRwdXQgRW5hYmxlCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIChvdmFsM3wweDAwMDcpKTsgLy8gU2V0IFRvIFNXIFN3aXRjaAorCXVkZWxheSgxMCk7CisKKwkvLyBBZGQgdGhpcyB0byBhdm9pZCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgMy13aXJlIGNvbmZsaWN0LgorCS8vIDIwMDUuMDMuMDEsIGJ5IHJjbmprby4KKwl0d3JlZy5sb25nRGF0YSA9IDA7CisJdHdyZWcuc3RydWMuZW5hYmxlQiA9IDE7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7IC8vIFNldCBTSV9FTiAoUkZMRSkKKwl1ZGVsYXkoMik7CisJdHdyZWcuc3RydWMuZW5hYmxlQiA9IDA7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7IC8vIENsZWFyIFNJX0VOIChSRkxFKQorCXVkZWxheSgxMCk7CisKKwltYXNrID0gKGxvdzJoaWdoKT8weDAxOigodTMyKTB4MDE8PCh0b3RhbExlbmd0aC0xKSk7CisKKwlmb3IoaT0wOyBpPHRvdGFsTGVuZ3RoLzI7IGkrKykKKwl7CisJCXR3cmVnLnN0cnVjLmRhdGEgPSAoKGRhdGEyV3JpdGUmbWFzaykhPTApID8gMSA6IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOworCQl0d3JlZy5zdHJ1Yy5jbGsgPSAxOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7CisKKwkJbWFzayA9IChsb3cyaGlnaCk/KG1hc2s8PDEpOihtYXNrPj4xKTsKKwkJdHdyZWcuc3RydWMuZGF0YSA9ICgoZGF0YTJXcml0ZSZtYXNrKSE9MCkgPyAxIDogMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOworCQl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsKKwkJbWFzayA9IChsb3cyaGlnaCk/KG1hc2s8PDEpOihtYXNrPj4xKTsKKwl9CisKKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMTsKKwl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCXR3cmVnLnN0cnVjLmRhdGEgPSAwOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWx8MHgwMDA0KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgb3ZhbDN8MHgwMDAwKTsKKworCVNldE91dHB1dEVuYWJsZU9mUmZQaW5zKGRldik7Cit9CisvL2J5IGFteQorCisKK2ludAorSHdIU1NJVGhyZWVXaXJlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQkqcERhdGFCdWYsCisJdTgJCQluRGF0YUJ1ZkJpdENudCwKKwlpbnQJCQliU0ksCisJaW50CQkJYldyaXRlCisJKQoreworCWludAliUmVzdWx0ID0gMTsKKwl1OAlUcnlDbnQ7CisJdTgJdTFiVG1wOworCisJZG8KKwl7CisJCS8vIENoZWNrIGlmIFdFIGFuZCBSRSBhcmUgY2xlYXJlZC4KKwkJZm9yKFRyeUNudCA9IDA7IFRyeUNudCA8IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQ7IFRyeUNudCsrKQorCQl7CisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSk7CisJCQlpZiggKHUxYlRtcCAmIChTV18zV19DTUQxX1JFfFNXXzNXX0NNRDFfV0UpKSA9PSAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJaWYgKFRyeUNudCA9PSBUQ18zV19QT0xMX01BWF9UUllfQ05UKQorCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IENtZFJlZzogJSNYIFJFfFdFIGJpdHMgYXJlIG5vdCBjbGVhciEhXG4iLCB1MWJUbXApOworCisJCS8vIFJUTDgxODdTIEhTU0kgUmVhZC9Xcml0ZSBGdW5jdGlvbgorCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgUkZfU1dfQ09ORklHKTsKKworCQlpZihiU0kpCisJCXsKKwkJCXUxYlRtcCB8PSAgIFJGX1NXX0NGR19TSTsgICAvL3JlZzA4WzFdPTEgU2VyaWFsIEludGVyZmFjZShTSSkKKwkJfWVsc2UKKwkJeworCQkJdTFiVG1wICY9IH5SRl9TV19DRkdfU0k7ICAvL3JlZzA4WzFdPTAgUGFyYWxsZWwgSW50ZXJmYWNlKFBJKQorCQl9CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBSRl9TV19DT05GSUcsIHUxYlRtcCk7CisKKwkJaWYoYlNJKQorCQl7CisJCQkvLyBqb25nOiBIVyBTSSByZWFkIG11c3Qgc2V0IHJlZzg0WzNdPTAuCisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgUkZQaW5zU2VsZWN0KTsKKwkJCXUxYlRtcCAmPSB+QklUMzsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUkZQaW5zU2VsZWN0LCB1MWJUbXAgKTsKKwkJfQorCSAJLy8gRmlsbCB1cCBkYXRhIGJ1ZmZlciBmb3Igd3JpdGUgb3BlcmF0aW9uLgorCisJCWlmKGJXcml0ZSkKKwkJeworCQkJaWYobkRhdGFCdWZCaXRDbnQgPT0gMTYpCisJCQl7CisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBTV18zV19EQjAsICooKHUxNiopcERhdGFCdWYpKTsKKwkJCX0KKwkJCWVsc2UgaWYobkRhdGFCdWZCaXRDbnQgPT0gNjQpICAvLyBSVEw4MTg3UyBzaG91bGRuJ3QgZW50ZXIgdGhpcyBjYXNlCisJCQl7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgU1dfM1dfREIwLCAqKCh1MzIqKXBEYXRhQnVmKSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgU1dfM1dfREIxLCAqKCh1MzIqKShwRGF0YUJ1ZiArIDQpKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW50IGlkeDsKKwkJCQlpbnQgQnl0ZUNudCA9IG5EYXRhQnVmQml0Q250IC8gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIiVkXG4iLG5EYXRhQnVmQml0Q250KTsKKwkJCQlpZiAoKG5EYXRhQnVmQml0Q250ICUgOCkgIT0gMCkKKwkJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogbkRhdGFCdWZCaXRDbnQoJWQpIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA4ISEhXG4iLAorCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJICAgICAgIGlmIChuRGF0YUJ1ZkJpdENudCA+IDY0KQorCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIDw9IDY0ISEhXG4iLAorCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJCWZvcihpZHggPSAwOyBpZHggPCBCeXRlQ250OyBpZHgrKykKKwkJCQl7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKFNXXzNXX0RCMCtpZHgpLCAqKHBEYXRhQnVmK2lkeCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCQkvL3JlYWQKKwkJeworCQkJaWYoYlNJKQorCQkJeworCQkJCS8vIFNJIC0gcmVnMjc0WzM6MF0gOiBSRiByZWdpc3RlcidzIEFkZHJlc3MKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIFNXXzNXX0RCMCwgKigodTE2KilwRGF0YUJ1ZikgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBQSSAtIHJlZzI3NFsxNToxMl0gOiBSRiByZWdpc3RlcidzIEFkZHJlc3MKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIFNXXzNXX0RCMCwgKCooKHUxNiopcERhdGFCdWYpKSA8PCAxMik7CisJCQl9CisJCX0KKworCQkvLyBTZXQgdXAgY29tbWFuZDogV0Ugb3IgUkUuCisJCWlmKGJXcml0ZSkKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxLCBTV18zV19DTUQxX1dFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgU1dfM1dfQ01EMV9SRSk7CisJCX0KKworCQkvLyBDaGVjayBpZiBET05FIGlzIHNldC4KKwkJZm9yKFRyeUNudCA9IDA7IFRyeUNudCA8IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQ7IFRyeUNudCsrKQorCQl7CisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSk7CisJCQlpZiggICh1MWJUbXAgJiBTV18zV19DTUQxX0RPTkUpICE9IDAgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJdWRlbGF5KDEwKTsKKwkJfQorCisJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgMCk7CisKKwkJLy8gUmVhZCBiYWNrIGRhdGEgZm9yIHJlYWQgb3BlcmF0aW9uLgorCQlpZihiV3JpdGUgPT0gMCkKKwkJeworCQkJaWYoYlNJKQorCQkJeworCQkJCS8vU2VyaWFsIEludGVyZmFjZSA6IHJlZzM2M18zNjJbMTE6MF0KKwkJCQkqKCh1MTYqKXBEYXRhQnVmKSA9IHJlYWRfbmljX3dvcmQoZGV2LCBTSV9EQVRBX1JFQUQpIDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvL1BhcmFsbGVsIEludGVyZmFjZSA6IHJlZzM2MV8zNjBbMTE6MF0KKwkJCQkqKCh1MTYqKXBEYXRhQnVmKSA9IHJlYWRfbmljX3dvcmQoZGV2LCBQSV9EQVRBX1JFQUQpOworCQkJfQorCisJCQkqKCh1MTYqKXBEYXRhQnVmKSAmPSAweDBGRkY7CisJCX0KKworCX13aGlsZSgwKTsKKworCXJldHVybiBiUmVzdWx0OworfQorLy9ieSBhbXkKKworaW50CitId1RocmVlV2lyZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQkJKnBEYXRhQnVmLAorCXU4CQkJbkRhdGFCdWZCaXRDbnQsCisJaW50CQkJYkhvbGQsCisJaW50CQkJYldyaXRlCisJKQoreworCWludAliUmVzdWx0ID0gMTsKKwl1OAlUcnlDbnQ7CisJdTgJdTFiVG1wOworCisJZG8KKwl7CisJCS8vIENoZWNrIGlmIFdFIGFuZCBSRSBhcmUgY2xlYXJlZC4KKwkJZm9yKFRyeUNudCA9IDA7IFRyeUNudCA8IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQ7IFRyeUNudCsrKQorCQl7CisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSk7CisJCQlpZiggKHUxYlRtcCAmIChTV18zV19DTUQxX1JFfFNXXzNXX0NNRDFfV0UpKSA9PSAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJaWYgKFRyeUNudCA9PSBUQ18zV19QT0xMX01BWF9UUllfQ05UKQorCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IENtZFJlZzogJSNYIFJFfFdFIGJpdHMgYXJlIG5vdCBjbGVhciEhXG4iLCB1MWJUbXApOworCisJCS8vIEZpbGwgdXAgZGF0YSBidWZmZXIgZm9yIHdyaXRlIG9wZXJhdGlvbi4KKwkJaWYobkRhdGFCdWZCaXRDbnQgPT0gMTYpCisJCXsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgU1dfM1dfREIwLCAqKCh1MTYgKilwRGF0YUJ1ZikpOworCQl9CisJCWVsc2UgaWYobkRhdGFCdWZCaXRDbnQgPT0gNjQpCisJCXsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFNXXzNXX0RCMCwgKigodTMyICopcERhdGFCdWYpKTsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFNXXzNXX0RCMSwgKigodTMyICopKHBEYXRhQnVmICsgNCkpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWludCBpZHg7CisJCQlpbnQgQnl0ZUNudCA9IG5EYXRhQnVmQml0Q250IC8gODsKKworCQkJaWYgKChuRGF0YUJ1ZkJpdENudCAlIDgpICE9IDApCisJCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IG5EYXRhQnVmQml0Q250KCVkKSBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOCEhIVxuIiwKKwkJCQluRGF0YUJ1ZkJpdENudCk7CisKKwkJCWlmIChuRGF0YUJ1ZkJpdENudCA+IDY0KQorCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIDw9IDY0ISEhXG4iLAorCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJZm9yKGlkeCA9IDA7IGlkeCA8IEJ5dGVDbnQ7IGlkeCsrKQorCQkJeworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKFNXXzNXX0RCMCtpZHgpLCAqKHBEYXRhQnVmK2lkeCkpOworCQkJfQorCQl9CisKKwkJLy8gRmlsbCB1cCBsZW5ndGggZmllbGQuCisJCXUxYlRtcCA9ICh1OCkobkRhdGFCdWZCaXRDbnQgLSAxKTsgLy8gTnVtYmVyIG9mIGJpdHMgLSAxLgorCQlpZihiSG9sZCkKKwkJCXUxYlRtcCB8PSBTV18zV19DTUQwX0hPTEQ7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMCwgdTFiVG1wKTsKKworCQkvLyBTZXQgdXAgY29tbWFuZDogV0Ugb3IgUkUuCisJCWlmKGJXcml0ZSkKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxLCBTV18zV19DTUQxX1dFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgU1dfM1dfQ01EMV9SRSk7CisJCX0KKworCQkvLyBDaGVjayBpZiBXRSBhbmQgUkUgYXJlIGNsZWFyZWQgYW5kIERPTkUgaXMgc2V0LgorCQlmb3IoVHJ5Q250ID0gMDsgVHJ5Q250IDwgVENfM1dfUE9MTF9NQVhfVFJZX0NOVDsgVHJ5Q250KyspCisJCXsKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxKTsKKwkJCWlmKCAodTFiVG1wICYgKFNXXzNXX0NNRDFfUkV8U1dfM1dfQ01EMV9XRSkpID09IDAgJiYKKwkJCQkodTFiVG1wICYgU1dfM1dfQ01EMV9ET05FKSAhPSAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJaWYoVHJ5Q250ID09IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQpCisJCXsKKwkJCS8vUlRfQVNTRVJUKFRyeUNudCAhPSBUQ18zV19QT0xMX01BWF9UUllfQ05ULAorCQkJLy8JKCJId1RocmVlV2lyZSgpOiBDbWRSZWc6ICUjWCBSRXxXRSBiaXRzIGFyZSBub3QgY2xlYXIgb3IgRE9ORSBpcyBub3Qgc2V0ISFcbiIsIHUxYlRtcCkpOworCQkJLy8gV29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgd2NjaHU6IGNsZWFyIFdFIGhlcmUuIDIwMDYuMDcuMDcsIGJ5IHJjbmprby4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgMCk7CisJCX0KKworCQkvLyBSZWFkIGJhY2sgZGF0YSBmb3IgcmVhZCBvcGVyYXRpb24uCisJCS8vIDxSSl9UT0RPPiBJIGFtIG5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCBvdXRwdXQgZm9ybWF0IG9mIGEgcmVhZCBvcGVyYXRpb24uCisJCWlmKGJXcml0ZSA9PSAwKQorCQl7CisJCQlpZihuRGF0YUJ1ZkJpdENudCA9PSAxNikKKwkJCXsKKwkJCQkqKCh1MTYgKilwRGF0YUJ1ZikgPSByZWFkX25pY193b3JkKGRldiwgU1dfM1dfREIwKTsKKwkJCX0KKwkJCWVsc2UgaWYobkRhdGFCdWZCaXRDbnQgPT0gNjQpCisJCQl7CisJCQkJKigodTMyICopcERhdGFCdWYpID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBTV18zV19EQjApOworCQkJCSooKHUzMiAqKShwRGF0YUJ1ZiArIDQpKSA9IHJlYWRfbmljX2R3b3JkKGRldiwgU1dfM1dfREIxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpbnQgaWR4OworCQkJCWludCBCeXRlQ250ID0gbkRhdGFCdWZCaXRDbnQgLyA4OworCisJCQkJaWYgKChuRGF0YUJ1ZkJpdENudCAlIDgpICE9IDApCisJCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDghISFcbiIsCisJCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJCWlmIChuRGF0YUJ1ZkJpdENudCA+IDY0KQorCQkJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogbkRhdGFCdWZCaXRDbnQoJWQpIHNob3VsZCA8PSA2NCEhIVxuIiwKKwkJCQkJbkRhdGFCdWZCaXRDbnQpOworCisJCQkJZm9yKGlkeCA9IDA7IGlkeCA8IEJ5dGVDbnQ7IGlkeCsrKQorCQkJCXsKKwkJCQkJKihwRGF0YUJ1ZitpZHgpID0gcmVhZF9uaWNfYnl0ZShkZXYsIChTV18zV19EQjAraWR4KSk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9d2hpbGUoMCk7CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworCit2b2lkCitSRl9Xcml0ZVJlZygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQlvZmZzZXQsCisJdTMyCQlkYXRhCisJKQoreworCS8vUkZSZWcJCQlyZWc7CisJdTMyCQkJZGF0YTJXcml0ZTsKKwl1OAkJCWxlbjsKKwl1OAkJCWxvdzJoaWdoOworCS8vdTMyCQkJUkZfUmVhZCA9IDA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRkNISVBJRF9SVEw4MjI1OgorCWNhc2UgUkZfWkVCUkEyOgkJLy8gQW5uaWUgMjAwNi0wNS0xMi4KKwljYXNlIFJGX1pFQlJBNDogICAgICAgIC8vYnkgYW15CisJCXN3aXRjaChwcml2LT5SZWdUaHJlZVdpcmVNb2RlKQorCQl7CisJCWNhc2UgU1dfVEhSRUVfV0lSRToKKwkJCXsgLy8gUGVyZm9ybSBTVyAzLXdpcmUgcHJvZ3JhbW1pbmcgYnkgZHJpdmVyLgorCQkJCWRhdGEyV3JpdGUgPSAoZGF0YSA8PCA0KSB8ICh1MzIpKG9mZnNldCAmIDB4MGYpOworCQkJCWxlbiA9IDE2OworCQkJCWxvdzJoaWdoID0gMDsKKwkJCQlaRUJSQV9SRlNlcmlhbFdyaXRlKGRldiwgZGF0YTJXcml0ZSwgbGVuLCBsb3cyaGlnaCk7CisgICAgICAgCQkJfQorCQkJYnJlYWs7CisKKyAJCWNhc2UgSFdfVEhSRUVfV0lSRToKKwkJCXsgLy8gUHVyZSBIVyAzLXdpcmUuCisJCQkJZGF0YTJXcml0ZSA9IChkYXRhIDw8IDQpIHwgKHUzMikob2Zmc2V0ICYgMHgwZik7CisJCQkJbGVuID0gMTY7CisJCQkJSHdUaHJlZVdpcmUoCisJCQkJCWRldiwKKwkJCQkJKHU4ICopKCZkYXRhMldyaXRlKSwJLy8gcERhdGFCdWYsCisJCQkJCWxlbiwJCQkJLy8gbkRhdGFCdWZCaXRDbnQsCisJCQkJCTAsCQkJCQkvLyBiSG9sZCwKKwkJCQkJMSk7CQkJCQkvLyBiV3JpdGUKKyAgICAgICAgIAkJfQorCQkJYnJlYWs7CisgICNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJCQljYXNlIEhXX1RIUkVFX1dJUkVfUEk6IC8vUGFyYWxsZWwgSW50ZXJmYWNlCisJCQl7IC8vIFB1cmUgSFcgMy13aXJlLgorCQkJCWRhdGEyV3JpdGUgPSAoZGF0YSA8PCA0KSB8ICh1MzIpKG9mZnNldCAmIDB4MGYpOworCQkJCWxlbiA9IDE2OworCQkJCQlId0hTU0lUaHJlZVdpcmUoCisJCQkJCQlkZXYsCisJCQkJCQkodTgqKSgmZGF0YTJXcml0ZSksCS8vIHBEYXRhQnVmLAorCQkJCQkJbGVuLAkJCQkJCS8vIG5EYXRhQnVmQml0Q250LAorCQkJCQkJMCwgCQkJCQkvLyBiU0kKKwkJCQkJCTEpOyAJCQkJCS8vIGJXcml0ZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCIzMzMzM1xuIik7CisJCQl9CisJCQlicmVhazsKKworCQkJY2FzZSBIV19USFJFRV9XSVJFX1NJOiAvL1NlcmlhbCBJbnRlcmZhY2UKKwkJCXsgLy8gUHVyZSBIVyAzLXdpcmUuCisJCQkJZGF0YTJXcml0ZSA9IChkYXRhIDw8IDQpIHwgKHUzMikob2Zmc2V0ICYgMHgwZik7CisJCQkJbGVuID0gMTY7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgZW50ZXIgIFpFQlJBX1JGU2VyaWFsV3JpdGVcbiAiKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3cyaGlnaCA9IDA7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVCUkFfUkZTZXJpYWxXcml0ZShkZXYsIGRhdGEyV3JpdGUsIGxlbiwgbG93MmhpZ2gpOworCisJCQkJSHdIU1NJVGhyZWVXaXJlKAorCQkJCQlkZXYsCisJCQkJCSh1OCopKCZkYXRhMldyaXRlKSwJLy8gcERhdGFCdWYsCisJCQkJCWxlbiwJCQkJCQkvLyBuRGF0YUJ1ZkJpdENudCwKKwkJCQkJMSwgCQkJCQkvLyBiU0kKKwkJCQkJMSk7IAkJCQkJLy8gYldyaXRlCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgZXhpdCBaRUJSQV9SRlNlcmlhbFdyaXRlXG4gIik7CisJCQl9CisJCQlicmVhazsKKyAgI2VuZGlmCisKKworCQlkZWZhdWx0OgorCQkJRE1FU0dFKCJSRl9Xcml0ZVJlZygpOiBpbnZhbGlkIFJlZ1RocmVlV2lyZU1vZGUoJWQpICEhISIsIHByaXYtPlJlZ1RocmVlV2lyZU1vZGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlETUVTR0UoIlJGX1dyaXRlUmVnKCk6IHVua25vd24gUkZDaGlwSUQ6ICUjWCIsIHByaXYtPnJmX2NoaXApOworCQlicmVhazsKKwl9Cit9CisKKwordm9pZAorWkVCUkFfUkZTZXJpYWxSZWFkKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlkYXRhMldyaXRlLAorCXU4CQl3TGVuZ3RoLAorCXUzMgkJKmRhdGEyUmVhZCwKKwl1OAkJckxlbmd0aCwKKwl1OAkJbG93MmhpZ2gKKwkpCit7CisJVGhyZWVXaXJlUmVnCXR3cmVnOworCWludAkJCQlpOworCXUxNgkJCW92YWwsb3ZhbDIsb3ZhbDMsdG1wLCB3UmVnODA7CisJdTMyCQkJbWFzazsKKwl1OAkJCXUxYlRtcDsKKwlUaHJlZVdpcmVSZWcJdGRhdGE7CisJLy9QSEFMX0RBVEFfODE4NwlwSGFsRGF0YSA9IEdldEhhbERhdGE4MTg3KHBBZGFwdGVyKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJeyAvLyBSVEw4MTg3UyBIU1NJIFJlYWQvV3JpdGUgRnVuY3Rpb24KKwkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFJGX1NXX0NPTkZJRyk7CisJCXUxYlRtcCB8PSAgIFJGX1NXX0NGR19TSTsgICAvL3JlZzA4WzFdPTEgU2VyaWFsIEludGVyZmFjZShTSSkKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBSRl9TV19DT05GSUcsIHUxYlRtcCk7CisJfQorI2VuZGlmCisKKwl3UmVnODAgPSBvdmFsID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCk7CisJb3ZhbDIgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlKTsKKwlvdmFsMyA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIG92YWwyfDB4Zik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIG92YWwzfDB4Zik7CisKKwkqZGF0YTJSZWFkID0gMDsKKworCS8vIFdlIG11c3QgY2xlYXIgQklUMC0zIGhlcmUsIG90aGVyd2lzZSwKKwkvLyBTV19FbmFsYmUgd2lsbCBiZSB0cnVlIHdoZW4gd2UgZmlyc3QgY2FsbCBaRUJSQV9SRlNlcmlhbFJlYWQoKSBhZnRlciA4MTg3TVBWQyBvcGVuLAorCS8vIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHZhbHVlIHJlYWQgYmVjb21lIDAuIDIwMDUuMDQuMTEsIGJ5IHJjbmprby4KKwlvdmFsICY9IH4weGY7CisKKwkvLyBBdm9pZCBjb2xsaXNpb24gd2l0aCBoYXJkd2FyZSB0aHJlZS13aXJlLgorCXR3cmVnLmxvbmdEYXRhID0gMDsKKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSg0KTsKKworCXR3cmVnLmxvbmdEYXRhID0gMDsKKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMDsKKwl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCXR3cmVnLnN0cnVjLnJlYWRfd3JpdGUgPSAwOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDUpOworCisJbWFzayA9IChsb3cyaGlnaCkgPyAweDAxIDogKCh1MzIpMHgwMTw8KDMyLTEpKTsKKwlmb3IoaSA9IDA7IGkgPCB3TGVuZ3RoLzI7IGkrKykKKwl7CisJCXR3cmVnLnN0cnVjLmRhdGEgPSAoKGRhdGEyV3JpdGUmbWFzaykgIT0gMCkgPyAxIDogMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMSk7CisJCXR3cmVnLnN0cnVjLmNsayA9IDE7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKworCQltYXNrID0gKGxvdzJoaWdoKSA/IChtYXNrPDwxKTogKG1hc2s+PjEpOworCisJCWlmKGkgPT0gMikKKwkJeworCQkJLy8gQ29tbWVudGVkIG91dCBieSBKYWNraWUsIDIwMDQuMDguMjYuIDxSSl9OT1RFPiBXZSBtdXN0IGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGZvciB3ZSBjYW5ub3QgcHVsbCBkb3duIFZDT1BETiBkdXJpbmcgUkYgU2VyYWlsIFJlYWQuCisJCQkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc0VuYWJsZSwgMHhlKTsgICAgIC8vIHR1cm4gb2ZmIGRhdGEgZW5hYmxlCisJCQkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc1NlbGVjdCwgMHhlKTsKKworCQkJdHdyZWcuc3RydWMucmVhZF93cml0ZT0xOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCQl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCQlicmVhazsKKwkJfQorCQl0d3JlZy5zdHJ1Yy5kYXRhID0gKChkYXRhMldyaXRlJm1hc2spICE9IDApID8gMTogMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCisJCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDEpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpIDogKG1hc2s+PjEpOworCX0KKworCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJdHdyZWcuc3RydWMuZGF0YSA9IDA7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJbWFzayA9IChsb3cyaGlnaCkgPyAweDAxIDogKCh1MzIpMHgwMSA8PCAoMTItMSkpOworCisJLy8KKwkvLyAwNjEwMTYsIGJ5IHJjbmprbzoKKwkvLyBXZSBtdXN0IHNldCBkYXRhIHBpbiB0byBIVyBjb250cm9sZWQsIG90aGVyd2lzZSBSRiBjYW4ndCBkcml2ZXIgaXQgYW5kCisJLy8gdmFsdWUgUkYgcmVnaXN0ZXIgd29uJ3QgYmUgYWJsZSB0byByZWFkIGJhY2sgcHJvcGVybHkuCisJLy8KKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgKCAoKG92YWwyfDB4MEUpICYgKH4weDAxKSkpICk7CisKKwlmb3IoaSA9IDA7IGkgPCByTGVuZ3RoOyBpKyspCisJeworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgxKTsKKwkJdHdyZWcuc3RydWMuY2xrID0gMTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwkJdG1wID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc0lucHV0KTsKKwkJdGRhdGEubG9uZ0RhdGEgPSB0bXA7CisJCSpkYXRhMlJlYWQgfD0gdGRhdGEuc3RydWMuY2xrID8gbWFzayA6IDA7CisKKwkJdHdyZWcuc3RydWMuY2xrID0gMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisKKwkJbWFzayA9IChsb3cyaGlnaCkgPyAobWFzazw8MSkgOiAobWFzaz4+MSk7CisJfQorCXR3cmVnLnN0cnVjLmVuYWJsZUIgPSAxOworCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJdHdyZWcuc3RydWMuZGF0YSA9IDA7CisJdHdyZWcuc3RydWMucmVhZF93cml0ZSA9IDE7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisKKwkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc0VuYWJsZSwgb3ZhbDJ8MHg4KTsgICAvLyBTZXQgVG8gT3V0cHV0IEVuYWJsZQorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCBvdmFsMik7ICAgLy8gU2V0IFRvIE91dHB1dCBFbmFibGUsIDxSSl9OT1RFPiBXZSBjYW5ub3QgZW5hYmxlIEJJVDMgaGVyZSwgb3RoZXJ3aXNlLCB3ZSB3aWxsIGZhaWxlZCB0byBzd2l0Y2ggY2hhbm5lbC4gMjAwNS4wNC4xMi4KKwkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc0VuYWJsZSwgMHgxYmZmKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgb3ZhbDMpOyAgIC8vIFNldCBUbyBTVyBTd2l0Y2gKKwkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc1NlbGVjdCwgMHgwNDg4KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHgzYTApOworCS8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlciwgUkZQaW5zT3V0cHV0LCAweDA0ODApOworfQorCisKK3UzMgorUkZfUmVhZFJlZygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQlvZmZzZXQKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMgkJCWRhdGEyV3JpdGU7CisJdTgJCQl3bGVuOworCXU4CQkJcmxlbjsKKwl1OAkJCWxvdzJoaWdoOworCXUzMgkJCWRhdGFSZWFkOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZDSElQSURfUlRMODIyNToKKwljYXNlIFJGX1pFQlJBMjoKKwljYXNlIFJGX1pFQlJBNDoKKwkJc3dpdGNoKHByaXYtPlJlZ1RocmVlV2lyZU1vZGUpCisJCXsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJCQljYXNlIEhXX1RIUkVFX1dJUkVfUEk6IC8vIEZvciA4N1MgIFBhcmFsbGVsIEludGVyZmFjZS4KKwkJCXsKKwkJCQlkYXRhMldyaXRlID0gKCh1MzIpKG9mZnNldCYweDBmKSk7CisJCQkJd2xlbj0xNjsKKwkJCQlId0hTU0lUaHJlZVdpcmUoCisJCQkJCWRldiwKKwkJCQkJKHU4KikoJmRhdGEyV3JpdGUpLAkvLyBwRGF0YUJ1ZiwKKwkJCQkJd2xlbiwJCQkJCS8vIG5EYXRhQnVmQml0Q250LAorCQkJCQkwLCAJCQkJCS8vIGJTSQorCQkJCQkwKTsgCQkJCQkvLyBiV3JpdGUKKwkJCQlkYXRhUmVhZD0gZGF0YTJXcml0ZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIEhXX1RIUkVFX1dJUkVfU0k6IC8vIEZvciA4N1MgU2VyaWFsIEludGVyZmFjZS4KKwkJCXsKKwkJCQlkYXRhMldyaXRlID0gKCh1MzIpKG9mZnNldCYweDBmKSkgOworCQkJCXdsZW49MTY7CisJCQkJSHdIU1NJVGhyZWVXaXJlKAorCQkJCQlkZXYsCisJCQkJCSh1OCopKCZkYXRhMldyaXRlKSwJLy8gcERhdGFCdWYsCisJCQkJCXdsZW4sCQkJCQkvLyBuRGF0YUJ1ZkJpdENudCwKKwkJCQkJMSwgCQkJCQkvLyBiU0kKKwkJCQkJMAkJCQkJLy8gYldyaXRlCisJCQkJCSk7CisJCQkJZGF0YVJlYWQ9IGRhdGEyV3JpdGU7CisJCQl9CisJCQlicmVhazsKKworI2VuZGlmCisJCQkvLyBQZXJmb3JtIFNXIDMtd2lyZSBwcm9ncmFtbWluZyBieSBkcml2ZXIuCisJCQlkZWZhdWx0OgorCQkJeworCQkJCWRhdGEyV3JpdGUgPSAoKHUzMikob2Zmc2V0JjB4MWYpKSA8PCAyNzsgLy8gRm9yIFplYnJhIEUtY3V0LiAyMDA1LjA0LjExLCBieSByY25qa28uCisJCQkJd2xlbiA9IDY7CisJCQkJcmxlbiA9IDEyOworCQkJCWxvdzJoaWdoID0gMDsKKwkJCQlaRUJSQV9SRlNlcmlhbFJlYWQoZGV2LCBkYXRhMldyaXRlLCB3bGVuLCZkYXRhUmVhZCxybGVuLCBsb3cyaGlnaCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYXRhUmVhZCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBkYXRhUmVhZDsKK30KKworCisvLyBieSBPd2VuIG9uIDA0LzA3LzE0IGZvciB3cml0aW5nIEJCIHJlZ2lzdGVyIHN1Y2Nlc3NmdWxseQordm9pZAorV3JpdGVCQlBvcnRVY2hhcigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJRGF0YQorCSkKK3sKKwkvL3U4CVRpbWVvdXRDb3VudGVyOworCXU4CVJlZ2lzdGVyQ29udGVudDsKKwl1OAlVQ2hhckRhdGE7CisKKwlVQ2hhckRhdGEgPSAodTgpKChEYXRhICYgMHgwMDAwZmYwMCkgPj4gOCk7CisJUGxhdGZvcm1JT1dyaXRlNEJ5dGUoZGV2LCBQaHlBZGRyLCBEYXRhKTsKKwkvL2ZvcihUaW1lb3V0Q291bnRlciA9IDEwOyBUaW1lb3V0Q291bnRlciA+IDA7IFRpbWVvdXRDb3VudGVyLS0pCisJeworCQlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIFBoeUFkZHIsIERhdGEgJiAweGZmZmZmZjdmKTsKKwkJUmVnaXN0ZXJDb250ZW50ID0gUGxhdGZvcm1JT1JlYWQxQnl0ZShkZXYsIFBoeURhdGFSKTsKKwkJLy9pZihVQ2hhckRhdGEgPT0gUmVnaXN0ZXJDb250ZW50KQorCQkvLwlicmVhazsKKwl9Cit9CisKK3U4CitSZWFkQkJQb3J0VWNoYXIoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCWFkZHIKKwkpCit7CisJLy91OAlUaW1lb3V0Q291bnRlcjsKKwl1OAlSZWdpc3RlckNvbnRlbnQ7CisKKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIFBoeUFkZHIsIGFkZHIgJiAweGZmZmZmZjdmKTsKKwlSZWdpc3RlckNvbnRlbnQgPSBQbGF0Zm9ybUlPUmVhZDFCeXRlKGRldiwgUGh5RGF0YVIpOworCisJcmV0dXJuIFJlZ2lzdGVyQ29udGVudDsKK30KKy8ve2J5IGFteSAwODAzMTIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJUGVyZm9ybSBBbnRlbm5hIHNldHRpbmdzIHdpdGggYW50ZW5uYSBkaXZlcnNpdHkgb24gODdTRS4KKy8vICAgIENyZWF0ZWQgYnkgUm9nZXIsIDIwMDguMDEuMjUuCisvLworYm9vbAorU2V0QW50ZW5uYUNvbmZpZzg3U0UoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJCURlZmF1bHRBbnQsCQkvLyAwOiBNYWluLCAxOiBBdXguCisJYm9vbAkJYkFudERpdmVyc2l0eSAJLy8gMTpFbmFibGUsIDA6IERpc2FibGUuCispCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wgICBiQW50ZW5uYVN3aXRjaGVkID0gdHJ1ZTsKKworCS8vcHJpbnRrKCJTZXRBbnRlbm5hQ29uZmlnODdTRSgpOiBEZWZhdWx0QW50KCVkKSwgYkFudERpdmVyc2l0eSglZClcbiIsIERlZmF1bHRBbnQsIGJBbnREaXZlcnNpdHkpOworCisJLy8gVGhyZXNob2xkIGZvciBhbnRlbm5hIGRpdmVyc2l0eS4KKwl3cml0ZV9waHlfY2NrKGRldiwgMHgwYywgMHgwOSk7IC8vIFJlZzBjIDogMDkKKworCWlmKCBiQW50RGl2ZXJzaXR5ICkgIC8vICBFbmFibGUgQW50ZW5uYSBEaXZlcnNpdHkuCisJeworCQlpZiggRGVmYXVsdEFudCA9PSAxICkgIC8vIGF1eCBhbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgYXV4IGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsKKworCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4YmIpOyAvLyBSZWcxMSA6IGJiCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHhjNyk7IC8vIFJlZzAxIDogYzcKKworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwRCwgMHg1NCk7ICAgLy8gUmVnMGQgOiA1NAorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGIyKTsgIC8vIFJlZzE4IDogYjIKKwkJfQorCQllbHNlIC8vICB1c2UgbWFpbiBhbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgbWFpbiBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7CisJCQkvL2Jhc2UgYmFuZAorCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4OWIpOyAvLyBSZWcxMSA6IDliCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHhjNyk7IC8vIFJlZzAxIDogYzcKKworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1Yyk7ICAgLy8gUmVnMGQgOiA1YworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGIyKTsgIC8vIFJlZzE4IDogYjIKKwkJfQorCX0KKwllbHNlICAgLy8gRGlzYWJsZSBBbnRlbm5hIERpdmVyc2l0eS4KKwl7CisJCWlmKCBEZWZhdWx0QW50ID09IDEgKSAvLyBhdXggQW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7CisKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweGJiKTsgLy8gUmVnMTEgOiBiYgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4NDcpOyAvLyBSZWcwMSA6IDQ3CisKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MEQsIDB4NTQpOyAgIC8vIFJlZzBkIDogNTQKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHgzMik7ICAvLyBSZWcxOCA6IDMyCisJCX0KKwkJZWxzZSAvLyBtYWluIEFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBtYWluIGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsKKworCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4OWIpOyAvLyBSZWcxMSA6IDliCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHg0Nyk7IC8vIFJlZzAxIDogNDcKKworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwRCwgMHg1Yyk7ICAgLy8gUmVnMGQgOiA1YworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweDMyKTsgIC8vIFJlZzE4IDogMzIKKwkJfQorCX0KKwlwcml2LT5DdXJyQW50ZW5uYUluZGV4ID0gRGVmYXVsdEFudDsgLy8gVXBkYXRlIGRlZmF1bHQgc2V0dGluZ3MuCisJcmV0dXJuCWJBbnRlbm5hU3dpdGNoZWQ7Cit9CisjZW5kaWYKKy8vYnkgYW15IDA4MDMxMgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiBIYXJkd2FyZSBJbml0aWFsaXphdGlvbi4KKyAgKiB0aGUgY29kZSBpcyBwb3J0ZWQgZnJvbSBXaW5kb3dzIHNvdXJjZSBjb2RlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkCitaRUJSQV9Db25maWdfODVCQVNJQ19IYXJkQ29kZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMgkJCWk7CisJdTMyCWFkZHIsZGF0YTsKKwl1MzIJdTRiUmVnT2Zmc2V0LCB1NGJSZWdWYWx1ZSwgdTRiUkYyMywgdTRiUkYyNDsKKyAgICAgICB1OAkJCXUxYjI0RTsKKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyA4N1NfUENJRSA6OiBSQURJT0NGRy5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCS8vIFBhZ2UxIDogcmVnMTYtcmVnMzAKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDEzZik7CQkJbWRlbGF5KDEpOyAvLyBzd2l0Y2ggdG8gcGFnZTEKKwl1NGJSRjIzPSBSRl9SZWFkUmVnKGRldiwgMHgwOCk7CQkJbWRlbGF5KDEpOworCXU0YlJGMjQ9IFJGX1JlYWRSZWcoZGV2LCAweDA5KTsJCQltZGVsYXkoMSk7CisKKwlpZiAodTRiUkYyMz09MHg4MTggJiYgdTRiUkYyND09MHg3MEMgJiYgcHJpdi0+Y2FyZF84MTg1ID09IFZFUlNJT05fODE4N1NfQykKKwkJcHJpdi0+Y2FyZF84MTg1ID0gVkVSU0lPTl84MTg3U19EOworCisJLy8gUGFnZTAgOiByZWcwLXJlZzE1CisKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMDNmKTsJCQltZGVsYXkoMSk7Ly8xCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwOWYpOyAgICAgIAltZGVsYXkoMSk7Ly8gMQorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAxLCAweDA2ZTApOwkJCW1kZWxheSgxKTsKKworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDAwNGMpOwkJCW1kZWxheSgxKTsvLzIKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDA0ZCk7CQkJbWRlbGF5KDEpOy8vIDIKKworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDAwMDApOwkJCW1kZWxheSgxKTsvLzMKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MDdmMSk7CQkJbWRlbGF5KDEpOy8vIDMKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwNCwgMHgwOTc1KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDBjNzIpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MGFlNik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMGNhKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA4LCAweDBlMWMpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDksIDB4MDJmMCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYSwgMHgwOWQwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBiLCAweDAxYmEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGMsIDB4MDY0MCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwOGRmKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBlLCAweDAwMjApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIDB4MDk5MCk7CQkJbWRlbGF5KDEpOworCisKKwkvLyBQYWdlMSA6IHJlZzE2LXJlZzMwCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxM2YpOwkJCW1kZWxheSgxKTsKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwODA2KTsJCQltZGVsYXkoMSk7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPCBWRVJTSU9OXzgxODdTX0MpCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDNmNyk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDVhYik7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDBjMSk7CQkJbWRlbGF5KDEpOworCX0KKwllbHNlCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDNhNyk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDU5Yik7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDA4MSk7CQkJbWRlbGF5KDEpOworCX0KKworCisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAxQTApOwkJCW1kZWxheSgxKTsKKy8vIERvbid0IHdyaXRlIFJGMjMvUkYyNCB0byBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIDg3UyBDIGN1dCBhbmQgRCBjdXQuIGFza2VkIGJ5IFNEMyBzdGV2ZW5sLgorLy8JUkZfV3JpdGVSZWcoZGV2LCAweDA4LCAweDA1OTcpOwkJCW1kZWxheSgxKTsKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwOSwgMHgwNTBhKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBhLCAweDAwMDEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGIsIDB4MDQxOCk7CQkJbWRlbGF5KDEpOworCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IFZFUlNJT05fODE4N1NfRCkKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwZmJlKTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwODA3KTsJCQltZGVsYXkoMSk7IC8vIFJYIExPIGJ1ZmZlcgorCX0KKwllbHNlCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGMsIDB4MGZiZSk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGQsIDB4MDAwOCk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGUsIDB4MDgwNik7CQkJbWRlbGF5KDEpOyAvLyBSWCBMTyBidWZmZXIKKwl9CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIDB4MGFjYyk7CQkJbWRlbGF5KDEpOworCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDE3Zik7CQkJbWRlbGF5KDEpOy8vNgorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMWQ3KTsJCQltZGVsYXkoMSk7Ly8gNgorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDBlMDApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MGU1MCk7CQkJbWRlbGF5KDEpOworCWZvcihpPTA7aTw9MzY7aSsrKQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDAxLCBpKTsgICAgICAgICAgICAgICAgICAgICBtZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtpXSk7IG1kZWxheSgxKTsKKwkJLy9EYmdQcmludCgiUkYgLSAweCV4ID0gMHgleCIsIGksIFpFQlJBX1JGX1JYX0dBSU5fVEFCTEVbaV0pOworCX0KKworCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwMjAzKTsJCQltZGVsYXkoMSk7IAkvLy8gMjAzLCAzNDMKKwkvL1JGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMzAwKTsJCQltZGVsYXkoMSk7CS8vIDQwMAorCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMjAwKTsJCQltZGVsYXkoMSk7CS8vIDQwMAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxMzcpOwkJCW1kZWxheSgxKTsJLy8gc3dpdGNoIHRvIHJlZzE2LXJlZzMwLCBhbmQgSFNTSSBkaXNhYmxlIDEzNworCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDA5YmUpOwkJCW1kZWxheSgxKTsJLy8gNworCS8vUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDA3YmUpOwkJCW1kZWxheSgxKTsKKwkvL21kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CS8vIFo0IHN5bnRoZXNpemVyIGxvb3AgZmlsdGVyIHNldHRpbmcsIDM5MgorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMDM3KTsJCQltZGVsYXkoMSk7CS8vIHN3aXRjaCB0byByZWcwLXJlZzE1LCBhbmQgSFNTSSBkaXNhYmxlCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAxNjApOwkJCW1kZWxheSgxKTsgCS8vIENCQyBvbiwgVHggUnggZGlzYWJsZSwgSGlnaCBnYWluCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAwODApOwkJCW1kZWxheSgxKTsJLy8gWjQgc2V0dGVkIGNoYW5uZWwgMQorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwODhEKTsJCQltZGVsYXkoMSk7CS8vIExDIGNhbGlicmF0aW9uCisJbWRlbGF5KDIwMCk7IAkvLyBEZWF5IDIwMCBtcy4gLy8weGZkCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMTM3KTsJCQltZGVsYXkoMSk7CS8vIHN3aXRjaCB0byByZWcxNi1yZWczMCAxMzcsIGFuZCBIU1NJIGRpc2FibGUgMTM3CisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAwMDApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDE4MCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMjIwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAzRTApOwkJCW1kZWxheSgxKTsKKworCS8vIERBQyBjYWxpYnJhdGlvbiBvZmYgMjAwNzA3MDIKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDBjMSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYSwgMHgwMDAxKTsJCQltZGVsYXkoMSk7CisvL3tieSBhbXkgMDgwMzEyCisJLy8gRm9yIGNyeXN0YWwgY2FsaWJyYXRpb24sIGFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCWlmKCBwcml2LT5iWHRhbENhbGlicmF0aW9uICkgLy8gcmVnIDMwLgorCXsgLy8gZW5hYmxlIGNyeXN0YWwgY2FsaWJyYXRpb24uCisJCS8vIFJGIFJlZ1szMF0sICgxKVhpbjpbMTI6OV0sIFhvdXQ6Wzg6NV0sICBhZGRyWzQ6MF0uCisJCS8vICgyKVBBIFB3ciBkZWxheSB0aW1lclsxNToxNF0sIGRlZmF1bHQ6IDIuNHVzLCBzZXQgQklUMTU9MAorCQkvLyAoMylSRiBzaWduYWwgb24vb2ZmIHdoZW4gY2FsaWJyYXRpb25bMTNdLCBkZWZhdWx0OiBvbiwgc2V0IEJJVDEzPTAuCisJCS8vIFNvIHdlIHNob3VsZCBtaW51cyA0IEJJVHMgb2Zmc2V0LgorCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIChwcml2LT5YdGFsQ2FsX1hpbjw8NSl8KHByaXYtPlh0YWxDYWxfWG91dDw8MSl8QklUMTF8QklUOSk7CQkJbWRlbGF5KDEpOworCQlwcmludGsoIlpFQlJBX0NvbmZpZ184NUJBU0lDX0hhcmRDb2RlKCk6ICglMDJ4KVxuIiwKKwkJCQkocHJpdi0+WHRhbENhbF9YaW48PDUpIHwgKHByaXYtPlh0YWxDYWxfWG91dDw8MSkgfCBCSVQxMXwgQklUOSk7CisJfQorCWVsc2UKKwl7IC8vIHVzaW5nIGRlZmF1bHQgdmFsdWUuIFhpbj02LCBYb3V0PTYuCisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZiwgMHgwYWNjKTsJCQltZGVsYXkoMSk7CisJfQorLy9ieSBhbXkgMDgwMzEyCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIDB4MGFjYyk7CQkJbWRlbGF5KDEpOyAgLy8tYnkgYW15IDA4MDMxMgorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwYmYpOwkJCW1kZWxheSgxKTsgLy8gc3dpdGNoIHRvIHJlZzAtcmVnMTUsIGFuZCBIU1NJIGVuYWJsZQorLy8JUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDAwOWYpOwkJCW1kZWxheSgxKTsgLy8gUnggQkIgc3RhcnQgY2FsaWJyYXRpb24sIDAwYy8vLWVkd2FyZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwOGRmKTsJCQltZGVsYXkoMSk7IC8vIFJ4IEJCIHN0YXJ0IGNhbGlicmF0aW9uLCAwMGMvLytlZHdhcmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDA0ZCk7CQkJbWRlbGF5KDEpOyAvLyB0ZW1wZXJhdHVyZSBtZXRlciBvZmYKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDk3NSk7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlCisJbWRlbGF5KDEwKTsJLy8gRGVheSAxMCBtcy4gLy8weGZlCisJbWRlbGF5KDEwKTsJLy8gRGVheSAxMCBtcy4gLy8weGZlCisJbWRlbGF5KDEwKTsJLy8gRGVheSAxMCBtcy4gLy8weGZlCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxOTcpOwkJCW1kZWxheSgxKTsgLy8gUnggbW9kZS8vK2Vkd2FyZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwNWFiKTsJCQltZGVsYXkoMSk7IC8vIFJ4IG1vZGUvLytlZHdhcmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDA5Zik7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlLy8rZWR3YXJkCisKKyNpZiAwLy8tZWR3YXJkCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxOTcpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDVhYik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMDlGKTsJCQltZGVsYXkoMSk7CisjZW5kaWYKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDEsIDB4MDAwMCk7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlLy8rZWR3YXJkCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDAwMDApOwkJCW1kZWxheSgxKTsgLy8gUnggbW9kZS8vK2Vkd2FyZAorCS8vcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzLgorCXUxYjI0RSA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDI0RSwgKHUxYjI0RSAmICh+KEJJVDV8QklUNikpKSk7CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ0NLQ09ORi5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKglbUE9XRVIgU0FWRV0gUG93ZXIgU2F2aW5nIFBhcmFtZXRlcnMgYnkgam9uZy4gMjAwNy0xMS0yNworCSAgIAlDQ0sgcmVnMHgwMFs3XT0xJ2IxIDpwb3dlciBzYXZpbmcgZm9yIFRYIChkZWZhdWx0KQorCQlDQ0sgcmVnMHgwMFs2XT0xJ2IxOiBwb3dlciBzYXZpbmcgZm9yIFJYIChkZWZhdWx0KQorCQlDQ0sgcmVnMHgwNls0XT0xJ2IxOiB0dXJuIG9mZiBjaGFubmVsIGVzdGltYXRpb24gcmVsYXRlZCBjaXJjdWl0cyBpZiBub3QgZG9pbmcgY2hhbm5lbCBlc3RpbWF0aW9uLgorCQlDQ0sgcmVnMHgwNlszXT0xJ2IxOiB0dXJuIG9mZiB1bnVzZWQgY2lyY3VpdHMgYmVmb3JlIGNjYSA9IDEKKwkJQ0NLIHJlZzB4MDZbMl09MSdiMTogdHVybiBvZmYgY2NrJ3MgY2lyY3VpdCBpZiBtYWNyc3QgPTAKKwkqLworI2lmIDAKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDBjODgwKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDAxYzg2KTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDA3ODkwKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDBkMGFlKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDAwNmFmKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDA0NjgxKTsKKyNlbmRpZgorCXdyaXRlX3BoeV9jY2soZGV2LDB4MDAsMHhjOCk7CisJd3JpdGVfcGh5X2NjayhkZXYsMHgwNiwweDFjKTsKKwl3cml0ZV9waHlfY2NrKGRldiwweDEwLDB4NzgpOworCXdyaXRlX3BoeV9jY2soZGV2LDB4MmUsMHhkMCk7CisJd3JpdGVfcGh5X2NjayhkZXYsMHgyZiwweDA2KTsKKwl3cml0ZV9waHlfY2NrKGRldiwweDAxLDB4NDYpOworCisJLy8gcG93ZXIgY29udHJvbAorCXdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCAweDEwKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIDB4MUIpOworCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsKKyNlbHNlCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFJBRElPQ0ZHLlRYVAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMGI3KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDAxLCAweDBlZTApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDQ0ZCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwNDQxKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDA4YzMpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MGM3Mik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMGU2KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDA4MmEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDgsIDB4MDAzZik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwOSwgMHgwMzM1KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBhLCAweDA5ZDQpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGIsIDB4MDdiYik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwODUwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDBjZGYpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGUsIDB4MDAyYik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwZiwgMHgwMTE0KTsJCQltZGVsYXkoMSk7CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDFiNyk7CQkJbWRlbGF5KDEpOworCisKKwlmb3IoaT0xO2k8PTk1O2krKykKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwMSwgaSk7CW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCBaRUJSQV9SRl9SWF9HQUlOX1RBQkxFW2ldKTsgbWRlbGF5KDEpOworCQkvL0RiZ1ByaW50KCJSRiAtIDB4JXggPSAweCV4IiwgaSwgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtpXSk7CisJfQorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDAwODApOwkJCW1kZWxheSgxKTsgCS8vIHdyaXRlIHJlZyAxOAorCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwMDA0KTsJCQltZGVsYXkoMSk7CS8vIHdyaXRlIHJlZyAyMAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMGI3KTsJCQltZGVsYXkoMSk7CS8vIHN3aXRjaCB0byByZWcwLXJlZzE1CisJLy8weGZkCisJLy8weGZkCisJLy8weGZkCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDBjNGQpOwkJCW1kZWxheSgxKTsKKwltZGVsYXkoMTAwKTsJLy8gRGVheSAxMDAgbXMuIC8vMHhmZQorCW1kZWxheSgxMDApOwkvLyBEZWF5IDEwMCBtcy4gLy8weGZlCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDA0NGQpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDJiZik7CQkJbWRlbGF5KDEpOwkvLzB4MDAyZiBkaXNhYmxlIDZ1cyBjb3JuZXIgY2hhbmdlLCAgMDZmLS0+IGVuYWJsZQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENDS0NPTkYuVFhUCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEZvbGxvdyBXTUFDIFJUTDgyMjVfQ29uZmlnKCkKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLyBwb3dlciBjb250cm9sCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIDB4MDMpOworCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgMHgwNyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy8gT0ZETSBCQlAgc2V0dXAKKy8vCVNldE91dHB1dEVuYWJsZU9mUmZQaW5zKGRldik7Ly9ieSBhbXkKKyNlbmRpZgorCisKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBBR0MudHh0CisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZSggZGV2LCBQaHlBZGRyLCAweDAwMDAxMjgwKTsJLy8gQW5uaWUsIDIwMDYtMDUtMDUKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDAsIDB4MTIpOworCS8vV3JpdGVCQlBvcnRVY2hhcihkZXYsIDB4MDAwMDEyODApOworCisJZm9yIChpPTA7IGk8MTI4OyBpKyspCisJeworCQkvL0RiZ1ByaW50KCJBR0MgLSBbJXgrMV0gPSAweCV4XG4iLCBpLCBaRUJSQV9BR0NbaSsxXSk7CisKKwkJZGF0YSA9IFpFQlJBX0FHQ1tpKzFdOworCQlkYXRhID0gZGF0YSA8PCA4OworCQlkYXRhID0gZGF0YSB8IDB4MDAwMDAwOEY7CisKKwkJYWRkciA9IGkgKyAweDgwOyAvL2VuYWJsZSB3cml0aW5nIEFHQyB0YWJsZQorCQlhZGRyID0gYWRkciA8PCA4OworCQlhZGRyID0gYWRkciB8IDB4MDAwMDAwOEU7CisKKwkJV3JpdGVCQlBvcnRVY2hhcihkZXYsIGRhdGEpOworCQlXcml0ZUJCUG9ydFVjaGFyKGRldiwgYWRkcik7CisJCVdyaXRlQkJQb3J0VWNoYXIoZGV2LCAweDAwMDAwMDhFKTsKKwl9CisKKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZSggZGV2LCBQaHlBZGRyLCAweDAwMDAxMDgwKTsJLy8gQW5uaWUsIDIwMDYtMDUtMDUKKwkvL1dyaXRlQkJQb3J0VWNoYXIoZGV2LCAweDAwMDAxMDgwKTsKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBPRkRNQ09ORi5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlmb3IoaT0wOyBpPDYwOyBpKyspCisJeworCQl1NGJSZWdPZmZzZXQ9aTsKKwkJdTRiUmVnVmFsdWU9T0ZETV9DT05GSUdbaV07CisKKwkJLy9EYmdQcmludCgiT0ZETSAtIDB4JXggPSAweCV4XG4iLCB1NGJSZWdPZmZzZXQsIHU0YlJlZ1ZhbHVlKTsKKworCQlXcml0ZUJCUG9ydFVjaGFyKGRldiwKKwkJCQkJCSgweDAwMDAwMDgwIHwKKwkJCQkJCSh1NGJSZWdPZmZzZXQgJiAweDdmKSB8CisJCQkJCQkoKHU0YlJlZ1ZhbHVlICYgMHhmZikgPDwgOCkpKTsKKwl9CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvL2J5IGFteSBmb3IgYW50ZW5uYQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8ve2J5IGFteSAwODAzMTIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gQ29uZmlnIFN3L0h3ICBDb21iaW5hdGlvbmFsIEFudGVubmEgRGl2ZXJzaXR5LiBBZGRlZCBieSBSb2dlciwgMjAwOC4wMi4yNi4KKwlTZXRBbnRlbm5hQ29uZmlnODdTRShkZXYsIHByaXYtPmJEZWZhdWx0QW50ZW5uYTEsIHByaXYtPmJTd0FudGVubmFEaXZlcml0eSk7CisjZW5kaWYKKy8vYnkgYW15IDA4MDMxMn0KKyNpZiAwCisJLy8gQ29uZmlnIFN3L0h3ICBBbnRlbm5hIERpdmVyc2l0eQorCWlmKCBwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkgKSAgLy8gIFVzZSBTVytIdyBBbnRlbm5hIERpdmVyc2l0eQorCXsKKwkJaWYoIHByaXYtPmJEZWZhdWx0QW50ZW5uYTEgPT0gdHJ1ZSApICAvLyBhdXggYW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7CisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHhiYik7IC8vIFJlZzExIDogYmIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDBjLCAweDA5KTsgLy8gUmVnMGMgOiAwOQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4YzcpOyAvLyBSZWcwMSA6IGM3CisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDU0KTsgICAvLyBSZWcwZCA6IDU0CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4YjIpOyAgLy8gUmVnMTggOiBiMgorCQl9CisJCWVsc2UgLy8gIG1haW4gYW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOworCQkJLy9iYXNlIGJhbmQKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDliKTsgLy8gUmVnMTEgOiA5YgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MGMsIDB4MDkpOyAvLyBSZWcwYyA6IDA5CisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHhjNyk7IC8vIFJlZzAxIDogYzcKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NWMpOyAgIC8vIFJlZzBkIDogNWMKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhiMik7ICAvLyBSZWcxOCA6IGIyCisJCX0KKwl9CisJZWxzZSAgIC8vIERpc2FibGUgQW50ZW5uYSBEaXZlcnNpdHkKKwl7CisJCWlmKCBwcml2LT5iRGVmYXVsdEFudGVubmExID09IHRydWUgKSAvLyBhdXggQW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7CisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHhiYik7IC8vIFJlZzExIDogYmIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDBjLCAweDA5KTsgLy8gUmVnMGMgOiAwOQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4NDcpOyAvLyBSZWcwMSA6IDQ3CisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDU0KTsgICAvLyBSZWcwZCA6IDU0CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4MzIpOyAgLy8gUmVnMTggOiAzMgorCQl9CisJCWVsc2UgLy8gbWFpbiBBbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgbWFpbiBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7CisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg5Yik7IC8vIFJlZzExIDogOWIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDBjLCAweDA5KTsgLy8gUmVnMGMgOiAwOQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4NDcpOyAvLyBSZWcwMSA6IDQ3CisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDVjKTsgICAvLyBSZWcwZCA6IDVjCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4MzIpOyAgLy8gUmVnMTggOiAzMgorCQl9CisJfQorI2VuZGlmCisvL2J5IGFteSBmb3IgYW50ZW5uYQorfQorCisKK3ZvaWQKK1VwZGF0ZUluaXRpYWxHYWluKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCS8vdW5zaWduZWQgY2hhciogSUdUYWJsZTsKKwkvL3U4CQkJRElHX0N1cnJlbnRJbml0aWFsR2FpbiA9IDQ7CisJLy91bnNpZ25lZCBjaGFyIHUxVG1wOworCisJLy9sem0gYWRkIDA4MDgyNgorCWlmKHByaXYtPmVSRlBvd2VyU3RhdGUgIT0gZVJmT24pCisJeworCQkvL0Rvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBkaXNhYmxlIFBMTCBzaXR1YXRpb24uCisJCS8vUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCAoIlVwZGF0ZUluaXRpYWxHYWluIC0gcEhhbERhdGEtPmVSRlBvd2VyU3RhdGUhPWVSZk9uXG4iKSk7CisJCS8vIEJhY2sgdG8gdGhlIG9yaWdpbmFsIHN0YXRlCisJCXByaXYtPkluaXRpYWxHYWluPSBwcml2LT5Jbml0aWFsR2FpbkJhY2tVcDsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKyNpZiAwCisJY2FzZSBSRl9aRUJSQTI6CisJCS8vIER5bmFtaWMgc2V0IGluaXRpYWwgZ2FpbiwgYnkgc2hpZW4gY2hhbmcsIDIwMDYuMDcuMTQKKwkJc3dpdGNoKHByaXYtPkluaXRpYWxHYWluKQorCQl7CisJCQljYXNlIDE6IC8vbTg2MWRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDE6IC04MiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDI2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg4NmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmE4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOiAvL204NjJkQm0KKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAyOiAtODIgZEJtIFxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgyNjk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ODZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZiODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy9tODYzZEJtCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMzogLTgyIGRCbSBcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MjY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDk2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYjg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6IC8vbTg2NGRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDQ6IC03OCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDI2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhhNmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA1OiAvL204MmRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDU6IC03NCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDM2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhhNmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA2OiAvL203OGRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDY6IC03MCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDQ2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhhNmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA3OiAvL203NGRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDc6IC02NiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDU2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhhNmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoJLy9NUAorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDE6IC04MiBkQm0gKGRlZmF1bHQpXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDI2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg4NmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmE4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgUkZfWkVCUkE0OgorCQkvLyBEeW5hbWljIHNldCBpbml0aWFsIGdhaW4sIGZvbGxvdyA4N0IKKwkJc3dpdGNoKHByaXYtPkluaXRpYWxHYWluKQorCQl7CisJCQljYXNlIDE6IC8vbTg2MWRCbQorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAxOiAtODIgZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDI2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg4Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmEpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy9tODYyZEJtCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDI6IC04MiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4MzYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDg2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOiAvL204NjNkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMzogLTgyIGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHgzNik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4ODYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZiKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6IC8vbTg2NGRCbQorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA0OiAtNzggZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQ2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg4Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmIpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNTogLy9tODJkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNTogLTc0IGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4OTYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZiKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDY6IC8vbTc4ZEJtCisJCQkJLy9ETUVTRyAoIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA2OiAtNzAgZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDU2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg5Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmMpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNzogLy9tNzRkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNzogLTY2IGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg1Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4YTYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZjKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDg6XG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NjYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweGI2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYyk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCisJCQlkZWZhdWx0OgkvL01QCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDE6IC04MiBkQm0gKGRlZmF1bHQpXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4MjYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDg2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCisJZGVmYXVsdDoKKwkJRE1FU0coIlVwZGF0ZUluaXRpYWxHYWluKCk6IHVua25vd24gUkZDaGlwSUQ6ICUjWFxuIiwgcHJpdi0+cmZfY2hpcCk7CisJCWJyZWFrOworCX0KK30KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJVHggUG93ZXIgdHJhY2tpbmcgbWVjaGFuaXNtIHJvdXRpbmUgb24gODdTRS4KKy8vIAlDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorLy8KK3ZvaWQKK0luaXRUeFB3clRyYWNraW5nODdTRSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyCXU0YlJmUmVnOworCisJdTRiUmZSZWcgPSBSRl9SZWFkUmVnKGRldiwgMHgwMik7CisKKwkvLyBFbmFibGUgVGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uLgorCS8vcHJpbnRrKCJJbml0VHhQd3JUcmFja2luZzg3U0UoKTogRW5hYmxlIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbiwgV3JpdGUgUkZbMHgwMl0gPSAlI3giLCB1NGJSZlJlZ3xQV1JfTUVURVJfRU4pOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgdTRiUmZSZWd8UFdSX01FVEVSX0VOKTsJCQltZGVsYXkoMSk7Cit9CisKKyNlbmRpZgordm9pZAorUGh5Q29uZmlnODE4NSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKyAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQ1IsIHByaXYtPlJlY2VpdmVDb25maWcpOworCSAgIHByaXYtPlJGUHJvZ1R5cGUgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHNCkgJiAweDAzOworICAgICAJLy8gUkYgY29uZmlnCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfWkVCUkEyOgorCWNhc2UgUkZfWkVCUkE0OgorCQlaRUJSQV9Db25maWdfODVCQVNJQ19IYXJkQ29kZSggZGV2KTsKKwkJYnJlYWs7CisJfQorLy97YnkgYW15IDA4MDMxMgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBTZXQgZGVmYXVsdCBpbml0aWFsIGdhaW4gc3RhdGUgdG8gNCwgYXBwcm92ZWQgYnkgU0QzIERaLCBieSBCcnVjZSwgMjAwNy0wNi0wNi4KKwlpZihwcml2LT5iRGlnTWVjaGFuaXNtKQorCXsKKwkJaWYocHJpdi0+SW5pdGlhbEdhaW4gPT0gMCkKKwkJCXByaXYtPkluaXRpYWxHYWluID0gNDsKKwkJLy9wcmludGsoIlBoeUNvbmZpZzgxODUoKTogRElHIGlzIGVuYWJsZWQsIHNldCBkZWZhdWx0IGluaXRpYWwgZ2FpbiBpbmRleCB0byAlZFxuIiwgcHJpdi0+SW5pdGlhbEdhaW4pOworCX0KKworCS8vCisJLy8gRW5hYmxlIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbiB0byBpbXBsZW1lbnQgVHhQb3dlciB0cmFja2luZyBvbiA4N1NFLgorCS8vIFdlIGluaXRpYWxpemUgdGhlcm1hbCBtZXRlciBoZXJlIHRvIGF2b2lkIHVuc3VjY2Vzc2Z1bCBjb25maWd1cmF0aW9uLgorCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCS8vCisJaWYocHJpdi0+YlR4UG93ZXJUcmFjaykKKwkJSW5pdFR4UHdyVHJhY2tpbmc4N1NFKGRldik7CisKKyNlbmRpZgorLy9ieSBhbXkgMDgwMzEyfQorCXByaXYtPkluaXRpYWxHYWluQmFja1VwPSBwcml2LT5Jbml0aWFsR2FpbjsKKwlVcGRhdGVJbml0aWFsR2FpbihkZXYpOworCisJcmV0dXJuOworfQorCisKKworCit2b2lkCitId0NvbmZpZ3VyZVJUTDgxODUoCisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkJKQoreworCS8vUlRMODE4NV9UT0RPOiBEZXRlcm1pbmUgUmV0cnlsaW1pdCwgVHhBR0MsIEF1dG9SYXRlRmFsbGJhY2sgY29udHJvbC4KKy8vCXU4CQliVU5JVkVSU0FMX0NPTlRST0xfUkwgPSAxOworICAgICAgICB1OCAgICAgICAgICAgICAgYlVOSVZFUlNBTF9DT05UUk9MX1JMID0gMDsKKworCXU4CQliVU5JVkVSU0FMX0NPTlRST0xfQUdDID0gMTsKKwl1OAkJYlVOSVZFUlNBTF9DT05UUk9MX0FOVCA9IDE7CisJdTgJCWJBVVRPX1JBVEVfRkFMTEJBQ0tfQ1RMID0gMTsKKwl1OAkJdmFsODsKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworICAgICAgCS8vaWYoSVNfV0lSRUxFU1NfTU9ERV9BKGRldikgfHwgSVNfV0lSRUxFU1NfTU9ERV9HKGRldikpCisvL3tieSBhbXkgMDgwMzEyCWlmKChpZWVlLT5tb2RlID09IElFRUVfRyl8fChpZWVlLT5tb2RlID09IElFRUVfQSkpCisvLwl7CisvLwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCAweGZmZmYpOworLy8JfQorLy8JZWxzZQorLy8JeworLy8JCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgMHgwMDBmKTsKKy8vCX0KKy8vYnkgYW15IDA4MDMxMn0KKyAgICAgICAgd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCAweDBmZmYpOworCS8vIFJldHJ5IGxpbWl0CisJdmFsOCA9IHJlYWRfbmljX2J5dGUoZGV2LCBDV19DT05GKTsKKworCWlmKGJVTklWRVJTQUxfQ09OVFJPTF9STCkKKwkJdmFsOCA9IHZhbDggJiAweGZkOworCWVsc2UKKwkJdmFsOCA9IHZhbDggfCAweDAyOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDV19DT05GLCB2YWw4KTsKKworCS8vIFR4IEFHQworCXZhbDggPSByZWFkX25pY19ieXRlKGRldiwgVFhBR0NfQ1RMKTsKKwlpZihiVU5JVkVSU0FMX0NPTlRST0xfQUdDKQorCXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIDEyOCk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgMTI4KTsKKwkJdmFsOCA9IHZhbDggJiAweGZlOworCX0KKwllbHNlCisJeworCQl2YWw4ID0gdmFsOCB8IDB4MDEgOworCX0KKworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWEFHQ19DVEwsIHZhbDgpOworCisJLy8gVHggQW50ZW5uYSBpbmNsdWRpbmcgRmVlZGJhY2sgY29udHJvbAorCXZhbDggPSByZWFkX25pY19ieXRlKGRldiwgVFhBR0NfQ1RMICk7CisKKwlpZihiVU5JVkVSU0FMX0NPTlRST0xfQU5UKQorCXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDApOworCQl2YWw4ID0gdmFsOCAmIDB4ZmQ7CisJfQorCWVsc2UKKwl7CisJCXZhbDggPSB2YWw4ICYgKHZhbDh8MHgwMik7IC8veGlvbmctMjAwNi0xMS0xNQorCX0KKworCXdyaXRlX25pY19ieXRlKGRldiwgVFhBR0NfQ1RMLCB2YWw4KTsKKworCS8vIEF1dG8gUmF0ZSBmYWxsYmFjayBjb250cm9sCisJdmFsOCA9IHJlYWRfbmljX2J5dGUoZGV2LCBSQVRFX0ZBTExCQUNLKTsKKwl2YWw4ICY9IDB4N2M7CisJaWYoIGJBVVRPX1JBVEVfRkFMTEJBQ0tfQ1RMICkKKwl7CisJCXZhbDggfD0gUkFURV9GQUxMQkFDS19DVExfRU5BQkxFIHwgUkFURV9GQUxMQkFDS19DVExfQVVUT19TVEVQMTsKKworCQkvLyA8UkpfVE9ET184MTg1Qj4gV2Ugc2hhbGwgc2V0IHVwIHRoZSBBUkZSIGFjY29yZGluZyB0byB1c2VyJ3Mgc2V0dGluZy4KKwkJLy93cml0ZV9uaWNfd29yZChkZXYsIEFSRlIsIDB4MGZmZik7IC8vIHNldCAxTSB+IDU0TQorLy9ieSBhbXkKKyNpZiAwCisJCVBsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgQVJGUiwgMHgwZmZmKTsgCS8vIHNldCAxTSB+IDU0TQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCSAgICAgICAgLy8gQWFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjExLjE1LgorCSAgICAgICAgUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBBUkZSLCAweDBmZmYpOyAvL3NldCAxTSB+IDU0TWJwcy4KKyNlbHNlCisJCVBsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgQVJGUiwgMHgwYzAwKTsgLy9zZXQgNDhNYnBzLCA1NE1icHMuCisgICAgICAgICAgICAgICAgLy8gQnkgU0QzIHN6dXlpJ3MgcmVxdWVzdC4gYnkgUm9nZXIsIDIwMDcuMDMuMjYuCisjZW5kaWYKKy8vYnkgYW15CisJfQorCWVsc2UKKwl7CisJfQorCXdyaXRlX25pY19ieXRlKGRldiwgUkFURV9GQUxMQkFDSywgdmFsOCk7Cit9CisKKworCitzdGF0aWMgdm9pZAorTWFjQ29uZmlnXzg1QkFTSUNfSGFyZENvZGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBNQUNSRUcuVFhUCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJaW50CQkJbkxpbmVzUmVhZCA9IDA7CisKKwl1MzIJdTRiUmVnT2Zmc2V0LCB1NGJSZWdWYWx1ZSx1NGJQYWdlSW5kZXggPSAwOworCWludAlpOworCisJbkxpbmVzUmVhZD1zaXplb2YoTUFDX1JFR19UQUJMRSkvMjsKKworCWZvcihpID0gMDsgaSA8IG5MaW5lc1JlYWQ7IGkrKykgIC8vbkxpbmVzUmVhZD0xMDEKKwl7CisJCXU0YlJlZ09mZnNldD1NQUNfUkVHX1RBQkxFW2ldWzBdOworCQl1NGJSZWdWYWx1ZT1NQUNfUkVHX1RBQkxFW2ldWzFdOworCisgICAgICAgICAgICAgICAgaWYodTRiUmVnT2Zmc2V0ID09IDB4NWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1NGJQYWdlSW5kZXggPSB1NGJSZWdWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTRiUmVnT2Zmc2V0IHw9ICh1NGJQYWdlSW5kZXggPDwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIk1BQyAtIDB4JXggPSAweCV4XG4iLCB1NGJSZWdPZmZzZXQsIHU0YlJlZ1ZhbHVlKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCB1NGJSZWdPZmZzZXQsICh1OCl1NGJSZWdWYWx1ZSk7CisJfQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfQorCisKKworc3RhdGljIHZvaWQKK01hY0NvbmZpZ184NUJBU0lDKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyAgICAgICB1OAkJCXUxREE7CisJTWFjQ29uZmlnXzg1QkFTSUNfSGFyZENvZGUoZGV2KTsKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy8gRm9sbG93IFRJRF9BQ19NQVAgb2YgV01hYy4KKwl3cml0ZV9uaWNfd29yZChkZXYsIFRJRF9BQ19NQVAsIDB4ZmE1MCk7CisKKwkvLyBJbnRlcnJ1cHQgTWlncmF0aW9uLCBKb25nIHN1Z2dlc3RlZCB3ZSB1c2Ugc2V0IDB4MDAwMCBmaXJzdCwgMjAwNS4xMi4xNCwgYnkgcmNuamtvLgorCXdyaXRlX25pY193b3JkKGRldiwgSW50TWlnLCAweDAwMDApOworCisJLy8gUHJldmVudCBUUEMgdG8gY2F1c2UgQ1JDIGVycm9yLiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wNi0xMC4KKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIDB4MUYwLCAweDAwMDAwMDAwKTsKKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIDB4MUY0LCAweDAwMDAwMDAwKTsKKwlQbGF0Zm9ybUlPV3JpdGUxQnl0ZShkZXYsIDB4MUY4LCAweDAwKTsKKworCS8vIEFza2VkIGZvciBieSBTRDMgQ00gTGluLCAyMDA2LjA2LjI3LCBieSByY25qa28uCisJLy9QbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIFJGVGltaW5nLCAweDAwMDA0MDAxKTsKKy8vYnkgYW15CisjaWYgMAorCXdyaXRlX25pY19kd29yZChkZXYsIFJGVGltaW5nLCAweDAwMDA0MDAxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBwb3dlciBzYXZlIHBhcmFtZXRlciBiYXNlZCBvbiAiODdTRSBwb3dlciBzYXZlIHBhcmFtZXRlcnMgMjAwNzExMjcuZG9jIiwgYXMgZm9sbG93LgorCisJLy9FbmFibGUgREExMCBUWCBwb3dlciBzYXZpbmcKKwl1MURBID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBIWVBSKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFBIWVBSLCAodTFEQSB8IEJJVDIpICk7CisKKwkvL1BPV0VSOgorCXdyaXRlX25pY193b3JkKGRldiwgMHgzNjAsIDB4MTAwMCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM2MiwgMHgxMDAwKTsKKworCS8vIEFGRS4KKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzcwLCAweDA1NjApOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzNzIsIDB4MDU2MCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3NCwgMHgwREE0KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4Mzc2LCAweDBEQTQpOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzNzgsIDB4MDU2MCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QSwgMHgwNTYwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwRUMpOworLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3RSwgMHgwMEZFKTsvLy1lZHdhcmQKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdFLCAweDAwRUMpOy8vK2Vkd2FyZAorI2Vsc2UKKyAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRlRpbWluZywgMHgwMDAwNDAwMyk7CisjZW5kaWYKKyAgICAgICB3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLDB4MDEpOworLy9ieSBhbXkKKworfQorCisKKworCit1OAorR2V0U3VwcG9ydGVkV2lyZWxlc3NNb2RlODE4NSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJdTgJCQlidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IDA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfWkVCUkEyOgorCWNhc2UgUkZfWkVCUkE0OgorCQlidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IChXSVJFTEVTU19NT0RFX0IgfCBXSVJFTEVTU19NT0RFX0cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlOworfQorCit2b2lkCitBY3RVcGRhdGVDaGFubmVsQWNjZXNzU2V0dGluZygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCVdJUkVMRVNTX01PREUJCQlXaXJlbGVzc01vZGUsCisJUENIQU5ORUxfQUNDRVNTX1NFVFRJTkcJQ2hubEFjY2Vzc1NldHRpbmcKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCUFDX0NPRElORwllQUNJOworCUFDX1BBUkFNCUFjUGFyYW07CisJLy9QU1RBX1FPUwlwU3RhUW9zID0gQWRhcHRlci0+TWdudEluZm8ucFN0YVFvczsKKwl1OAliRm9sbG93TGVnYWN5U2V0dGluZyA9IDA7CisJdTggICB1MWJBSUZTOworCisJLy8KKwkvLyA8UkpfVE9ET184MTg1Qj4KKwkvLyBUT0RPOiBXZSBzdGlsbCBkb24ndCBrbm93IGhvdyB0byBzZXQgdXAgdGhlc2UgcmVnaXN0ZXJzLCBqdXN0IGZvbGxvdyBXTUFDIHRvCisJLy8gdmVyaWZ5IDgxODVCIEZQQUcuCisJLy8KKwkvLyA8UkpfVE9ET184MTg1Qj4KKwkvLyBKb25nIHNhaWQgQ1dtaW4vQ1dtYXggcmVnaXN0ZXIgYXJlIG5vdCBmdW5jdGlvbmFsIGluIDgxODVCLAorCS8vIHNvIHdlIHNoYWxsIGZpbGwgY2hhbm5lbCBhY2Nlc3MgcmVhbHRlZCByZWdpc3RlciBpbnRvIEFDIHBhcmFtZXRlciByZWdpc3RlcnMsCisJLy8gZXZlbiBpbiBuUUJzcy4KKwkvLworCUNobmxBY2Nlc3NTZXR0aW5nLT5TSUZTX1RpbWVyID0gMHgyMjsgLy8gU3VnZ2VzdGVkIGJ5IEpvbmcsIDIwMDUuMTIuMDguCisJQ2hubEFjY2Vzc1NldHRpbmctPkRJRlNfVGltZXIgPSAweDFDOyAvLyAyMDA2LjA2LjAyLCBieSByY25qa28uCisJQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIgPSA5OyAvLyAyMDA2LjA2LjAyLCBieSByY25qa28uCisJQ2hubEFjY2Vzc1NldHRpbmctPkVJRlNfVGltZXIgPSAweDVCOyAvLyBTdWdnZXN0ZWQgYnkgd2NjaHUsIGl0IGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEVJRlMgcmVnaXN0ZXIsIDIwMDUuMTIuMDguCisJQ2hubEFjY2Vzc1NldHRpbmctPkNXbWluSW5kZXggPSAzOyAvLyAyMDA2LjA2LjAyLCBieSByY25qa28uCisJQ2hubEFjY2Vzc1NldHRpbmctPkNXbWF4SW5kZXggPSA3OyAvLyAyMDA2LjA2LjAyLCBieSByY25qa28uCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFNJRlMsIENobmxBY2Nlc3NTZXR0aW5nLT5TSUZTX1RpbWVyKTsKKwkvL0FkYXB0ZXItPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKCBBZGFwdGVyLCBIV19WQVJfU0xPVF9USU1FLCAmQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIgKTsJLy8gUmV3cml0ZWQgZnJvbSBkaXJlY3RseSB1c2UgUGxhdGZvcm1FRklPV3JpdGUxQnl0ZSgpLCBieSBBbm5pZSwgMjAwNi0wMy0yOS4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFNMT1QsIENobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyKTsJLy8gUmV3cml0ZWQgZnJvbSBkaXJlY3RseSB1c2UgUGxhdGZvcm1FRklPV3JpdGUxQnl0ZSgpLCBieSBBbm5pZSwgMjAwNi0wMy0yOS4KKworCXUxYkFJRlMgPSBhU2lmc1RpbWUgKyAoMiAqIENobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyICk7CisKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNfVk9fUEFSQU0sIHUxYkFJRlMpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBBQ19WSV9QQVJBTSwgdTFiQUlGUyk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEFDX0JFX1BBUkFNLCB1MWJBSUZTKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNfQktfUEFSQU0sIHUxYkFJRlMpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBFSUZTLCBDaG5sQWNjZXNzU2V0dGluZy0+RUlGU19UaW1lcik7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEFja1RpbWVPdXRSZWcsIDB4NUIpOyAvLyA8UkpfRVhQUl9RT1M+IFN1Z2dlc3RlZCBieSB3Y2NodSwgaXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgRUlGUyByZWdpc3RlciwgMjAwNS4xMi4wOC4KKworI2lmZGVmIFRPRE8KKwkvLyA8UkpfVE9ET19OT1dfODE4NUI+IFVwZGF0ZSBFQ1dtaW4vRUNXbWF4LCBBSUZTLCBUWE9QIExpbWl0IG9mIGVhY2ggQUMgdG8gdGhlIHZhbHVlIGRlZmluZWQgYnkgU1BFQy4KKwlpZiggcFN0YVFvcy0+Q3VycmVudFFvc01vZGUgPiBRT1NfRElTQUJMRSApCisJeyAvLyBRb1MgbW9kZS4KKwkJaWYocFN0YVFvcy0+UUJzc1dpcmVsZXNzTW9kZSA9PSBXaXJlbGVzc01vZGUpCisJCXsKKwkJCS8vIEZvbGxvdyBBQyBQYXJhbWV0ZXJzIG9mIHRoZSBRQlNTLgorCQkJZm9yKGVBQ0kgPSAwOyBlQUNJIDwgQUNfTUFYOyBlQUNJKyspCisJCQl7CisJCQkJQWRhcHRlci0+SGFsRnVuYy5TZXRId1JlZ0hhbmRsZXIoQWRhcHRlciwgSFdfVkFSX0FDX1BBUkFNLCAocHUxQnl0ZSkoJihwU3RhUW9zLT5XTU1QYXJhbUVsZS5BY1BhcmFtW2VBQ0ldKSkgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEZvbGxvdyBEZWZhdWx0IFdNTSBBQyBQYXJhbWV0ZXJzLgorCQkJYkZvbGxvd0xlZ2FjeVNldHRpbmcgPSAxOworCQl9CisJfQorCWVsc2UKKyNlbmRpZgorCXsgLy8gTGVnYWN5IDgwMi4xMS4KKwkJYkZvbGxvd0xlZ2FjeVNldHRpbmcgPSAxOworCisJfQorCisJLy8gdGhpcyBzZXR0aW5nIGlzIGNvcGllZCBmcm9tIHJ0bDgxODdCLiAgeGlvbmctMjAwNi0xMS0xMworCWlmKGJGb2xsb3dMZWdhY3lTZXR0aW5nKQorCXsKKworCisJCS8vCisJCS8vIEZvbGxvdyA4MDIuMTEgc2VldGluZyB0byBBQyBwYXJhbWV0ZXIsIGFsbCBBQyBzaGFsbCB1c2UgdGhlIHNhbWUgcGFyYW1ldGVyLgorCQkvLyAyMDA1LjEyLjAxLCBieSByY25qa28uCisJCS8vCisJCUFjUGFyYW0ubG9uZ0RhdGEgPSAwOworCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BSUZTTiA9IDI7IC8vIEZvbGxvdyA4MDIuMTEgRElGUy4KKwkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUNNID0gMDsKKwkJQWNQYXJhbS5mLkVjdy5mLkVDV21pbiA9IENobmxBY2Nlc3NTZXR0aW5nLT5DV21pbkluZGV4OyAvLyBGb2xsb3cgODAyLjExIENXbWluLgorCQlBY1BhcmFtLmYuRWN3LmYuRUNXbWF4ID0gQ2hubEFjY2Vzc1NldHRpbmctPkNXbWF4SW5kZXg7IC8vIEZvbGxvdyA4MDIuMTEgQ1dtYXguCisJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAwOworCisJCS8vbHptIHJlc2VydmVkIDA4MDgyNgorI2lmIDEKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwkJLy8gRm9yIHR1cmJvIG1vZGUgc2V0dGluZy4gcG9ydCBmcm9tIDg3QiBieSBJc2FpYWggMjAwOC0wOC0wMQorCQlpZiggaWVlZS0+Y3VycmVudF9uZXR3b3JrLlR1cmJvX0VuYWJsZSA9PSAxICkKKwkJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAweDAxRkY7CisjZW5kaWYKKwkJLy8gRm9yIDg3U0Ugd2l0aCBJbnRlbCA0OTY1ICBBZC1Ib2MgbW9kZSBoYXZlIHBvb3IgdGhyb3VnaHB1dCAoMTlNQikKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAweDAwMjA7CisjZW5kaWYKKworCQlmb3IoZUFDSSA9IDA7IGVBQ0kgPCBBQ19NQVg7IGVBQ0krKykKKwkJeworCQkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUNJID0gKHU4KWVBQ0k7CisJCQl7CisJCQkJUEFDX1BBUkFNCXBBY1BhcmFtID0gKFBBQ19QQVJBTSkoJkFjUGFyYW0pOworCQkJCUFDX0NPRElORwllQUNJOworCQkJCXU4CQl1MWJBSUZTOworCQkJCXUzMgkJdTRiQWNQYXJhbTsKKworCQkJCS8vIFJldHJpdmUgcGFyYW10ZXJzIHRvIHVkcGF0ZS4KKwkJCQllQUNJID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BQ0k7CisJCQkJdTFiQUlGUyA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUlGU04gKiBDaG5sQWNjZXNzU2V0dGluZy0+U2xvdFRpbWVUaW1lciArIGFTaWZzVGltZTsKKwkJCQl1NGJBY1BhcmFtID0gKAkoKCh1MzIpKHBBY1BhcmFtLT5mLlRYT1BMaW1pdCkpIDw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKQl8CisJCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21heCkpIDw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKQl8CisJCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21pbikpIDw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKQl8CisJCQkJCQkoKCh1MzIpdTFiQUlGUykgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKworCQkJCXN3aXRjaChlQUNJKQorCQkJCXsKKwkJCQkJY2FzZSBBQzFfQks6CisJCQkJCQkvL3dyaXRlX25pY19kd29yZChkZXYsIEFDX0JLX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUMwX0JFOgorCQkJCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CRV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEFDMl9WSToKKwkJCQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVklfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQzNfVk86CisJCQkJCQkvL3dyaXRlX25pY19kd29yZChkZXYsIEFDX1ZPX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlETUVTR1coICJTZXRId1JlZzgxODUoKTogaW52YWxpZCBBQ0k6ICVkICFcbiIsIGVBQ0kpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gQ2VoY2sgQUNNIGJpdC4KKwkJCQkvLyBJZiBpdCBpcyBzZXQsIGltbWVkaWF0ZWx5IHNldCBBQ00gY29udHJvbCBiaXQgdG8gZG93bmdyYWRpbmcgQUMgZm9yIHBhc3NpbmcgV01NIHRlc3RwbGFuLiBBbm5pZSwgMjAwNS0xMi0xMy4KKwkJCQkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNNX0NPTlRST0wsIHBBY1BhcmFtLT5mLkFjaUFpZnNuKTsKKwkJCQl7CisJCQkJCVBBQ0lfQUlGU04JcEFjaUFpZnNuID0gKFBBQ0lfQUlGU04pKCZwQWNQYXJhbS0+Zi5BY2lBaWZzbik7CisJCQkJCUFDX0NPRElORwllQUNJID0gcEFjaUFpZnNuLT5mLkFDSTsKKworCQkJCQkvL21vZGlmaWVkIEpvc2VwaAorCQkJCQkvL2ZvciA4MTg3QiBBc3luSU9SZWFkIGlzc3VlCisjaWZkZWYgVE9ETworCQkJCQl1OAlBY21DdHJsID0gcEhhbERhdGEtPkFjbUNvbnRyb2w7CisjZWxzZQorCQkJCQl1OAlBY21DdHJsID0gMDsKKyNlbmRpZgorCQkJCQlpZiggcEFjaUFpZnNuLT5mLkFDTSApCisJCQkJCXsgLy8gQUNNIGJpdCBpcyAxLgorCQkJCQkJc3dpdGNoKGVBQ0kpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBBQzBfQkU6CisJCQkJCQkJCUFjbUN0cmwgfD0gKEJFUV9BQ01fRU58QkVRX0FDTV9DVEx8QUNNX0hXX0VOKTsJLy8gb3IgMHgyMQorCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgQUMyX1ZJOgorCQkJCQkJCQlBY21DdHJsIHw9IChWSVFfQUNNX0VOfFZJUV9BQ01fQ1RMfEFDTV9IV19FTik7CS8vIG9yIDB4NDIKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIEFDM19WTzoKKwkJCQkJCQkJQWNtQ3RybCB8PSAoVk9RX0FDTV9FTnxWT1FfQUNNX0NUTHxBQ01fSFdfRU4pOwkvLyBvciAweDg0CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJRE1FU0dXKCJTZXRId1JlZzgxODUoKTogW0hXX1ZBUl9BQ01fQ1RSTF0gQUNNIHNldCBmYWlsZWQ6IGVBQ0kgaXMgJWRcbiIsIGVBQ0kgKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7IC8vIEFDTSBiaXQgaXMgMC4KKwkJCQkJCXN3aXRjaChlQUNJKQorCQkJCQkJeworCQkJCQkJCWNhc2UgQUMwX0JFOgorCQkJCQkJCQlBY21DdHJsICY9ICggKH5CRVFfQUNNX0VOKSAmICh+QkVRX0FDTV9DVEwpICYgKH5BQ01fSFdfRU4pICk7CS8vIGFuZCAweERFCisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBBQzJfVkk6CisJCQkJCQkJCUFjbUN0cmwgJj0gKCAoflZJUV9BQ01fRU4pICYgKH5WSVFfQUNNX0NUTCkgJiAofkFDTV9IV19FTikgKTsJLy8gYW5kIDB4QkQKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIEFDM19WTzoKKwkJCQkJCQkJQWNtQ3RybCAmPSAoICh+Vk9RX0FDTV9FTikgJiAoflZPUV9BQ01fQ1RMKSAmICh+QUNNX0hXX0VOKSApOwkvLyBhbmQgMHg3QgorCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJTZXRId1JlZzgxODUoKTogW0hXX1ZBUl9BQ01fQ1RSTF0gV3JpdGUgMHglWFxuIiwgQWNtQ3RybCk7CisKKyNpZmRlZiBUT19ETworCQkJCQlwSGFsRGF0YS0+QWNtQ29udHJvbCA9IEFjbUN0cmw7CisjZW5kaWYKKwkJCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEFDTV9DT05UUk9MLCBBY21DdHJsKTsKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBQ01fQ09OVFJPTCwgMCk7CisJCQkJfQorCQkJfQorCQl9CisKKworCX0KK30KKwordm9pZAorQWN0U2V0V2lyZWxlc3NNb2RlODE4NSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQkJCWJ0V2lyZWxlc3NNb2RlCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwkvL1BNR05UX0lORk8JCXBNZ250SW5mbyA9ICYoQWRhcHRlci0+TWdudEluZm8pOworCXU4CWJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlID0gR2V0U3VwcG9ydGVkV2lyZWxlc3NNb2RlODE4NShkZXYpOworCisJaWYoIChidFdpcmVsZXNzTW9kZSAmIGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlKSA9PSAwICkKKwl7IC8vIERvbid0IHN3aXRjaCB0byB1bnN1cHBvcnRlZCB3aXJlbGVzcyBtb2RlLCAyMDA2LjAyLjE1LCBieSByY25qa28uCisJCURNRVNHVygiQWN0U2V0V2lyZWxlc3NNb2RlODE4NSgpOiBXaXJlbGVzc01vZGUoJWQpIGlzIG5vdCBzdXBwb3J0ZWQgKCVkKSFcbiIsCisJCQlidFdpcmVsZXNzTW9kZSwgYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUpOworCQlyZXR1cm47CisJfQorCisJLy8gMS4gQXNzaWduIHdpcmVsZXNzIG1vZGUgdG8gc3d0aWNoIGlmIG5lY2Vzc2FyeS4KKwlpZiAoYnRXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9BVVRPKQorCXsKKwkJaWYoKGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlICYgV0lSRUxFU1NfTU9ERV9BKSkKKwkJeworCQkJYnRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0E7CisJCX0KKwkJZWxzZSBpZigoYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUgJiBXSVJFTEVTU19NT0RFX0cpKQorCQl7CisJCQlidFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfRzsKKwkJfQorCQllbHNlIGlmKChidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSAmIFdJUkVMRVNTX01PREVfQikpCisJCXsKKwkJCWJ0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQl9CisJCWVsc2UKKwkJeworCQkJRE1FU0dXKCJBY3RTZXRXaXJlbGVzc01vZGU4MTg1KCk6IE5vIHZhbGlkIHdpcmVsZXNzIG1vZGUgc3VwcG9ydGVkLCBidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSgleCkhISFcbiIsCisJCQkJCSBidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSk7CisJCQlidFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJfQorCX0KKworCisJLy8gMi4gU3d0aWNoIGJhbmQ6IFJGIG9yIEJCIHNwZWNpZmljIGFjdGlvbnMsCisJLy8gZm9yIGV4YW1wbGUsIHJlZnJlc2ggdGFibGVzIGluIG9tYzgyNTUsIG9yIGNoYW5nZSBpbml0aWFsIGdhaW4gaWYgbmVjZXNzYXJ5LgorCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwljYXNlIFJGX1pFQlJBMjoKKwljYXNlIFJGX1pFQlJBNDoKKwkJeworCQkJLy8gTm90aGluZyB0byBkbyBmb3IgWmVicmEgdG8gc3dpdGNoIGJhbmQuCisJCQkvLyBVcGRhdGUgY3VycmVudCB3aXJlbGVzcyBtb2RlIGlmIHdlIHN3dGljaCB0byBzcGVjaWZpZWQgYmFuZCBzdWNjZXNzZnVsbHkuCisJCQlpZWVlLT5tb2RlID0gKFdJUkVMRVNTX01PREUpYnRXaXJlbGVzc01vZGU7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlETUVTR1coIkFjdFNldFdpcmVsZXNzTW9kZTgxODUoKTogdW5zdXBwb3J0ZWQgUkY6IDB4JVggISEhXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJYnJlYWs7CisJfQorCisJLy8gMy4gQ2hhbmdlIHJlbGF0ZWQgc2V0dGluZy4KKwlpZiggaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0EgKXsKKwkJRE1FU0coIldJUkVMRVNTX01PREVfQVxuIik7CisJfQorCWVsc2UgaWYoIGllZWUtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CICl7CisJCURNRVNHKCJXSVJFTEVTU19NT0RFX0JcbiIpOworCX0KKwllbHNlIGlmKCBpZWVlLT5tb2RlID09IFdJUkVMRVNTX01PREVfRyApeworCQlETUVTRygiV0lSRUxFU1NfTU9ERV9HXG4iKTsKKwl9CisKKwlBY3RVcGRhdGVDaGFubmVsQWNjZXNzU2V0dGluZyggZGV2LCBpZWVlLT5tb2RlLCAmcHJpdi0+Q2hhbm5lbEFjY2Vzc1NldHRpbmcpOworfQorCit2b2lkIHJ0bDgxODViX2lycV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT5pcnFfZW5hYmxlZCA9IDE7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgSU1SLCBwcml2LT5JbnRyTWFzayk7Cit9CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQordm9pZAorRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTE2CQkJcmVhc29uCisJKQoreworCS8vcHJpbnRrKCI9PT4gRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKClcbiIpOworCisJLy8gbm90aGluZyBpcyBuZWVkZWQgYWZ0ZXIgZGlzYXNzb2NpYXRpb24gcmVxdWVzdC4KKworCS8vcHJpbnRrKCI8PT0gRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKClcbiIpOworfQordm9pZAorTWdudERpc2Nvbm5lY3RJQlNTKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKykKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTgJCQlpOworCisJLy9wcmludGsoIlhYWFhYWFhYWFggTWdudERpc2Nvbm5lY3QgSUJTU1xuIik7CisKKwlEcnZJRkluZGljYXRlRGlzYXNzb2NpYXRpb24oZGV2LCB1bnNwZWNfcmVhc29uKTsKKworLy8JUGxhdGZvcm1aZXJvTWVtb3J5KCBwTWdudEluZm8tPkJzc2lkLCA2ICk7CisJZm9yKGk9MDtpPDY7aSsrKSAgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbaV0gPSAweDU1OworCisJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisKKwkvL1N0b3AgQmVhY29uLgorCisJLy8gVmlzdGEgYWRkIGEgQWRob2MgcHJvZmlsZSwgSFcgcmFkaW8gb2ZmIHVudGlsbCBPSURfRE9UMTFfUkVTRVRfUkVRVUVTVAorCS8vIERyaXZlciB3b3VsZCBzZXQgTVNSPU5PX0xJTkssIHRoZW4gSFcgUmFkaW8gT04sIE1nbnRRdWV1ZSBTdHVjay4KKwkvLyBCZWNhdXNlIEJjbiBETUEgaXNuJ3QgY29tcGxldGUsIG1nbnQgcXVldWUgd291bGQgc3R1Y2sgdW50aWwgQmNuIHBhY2tldCBzZW5kLgorCisJLy8gRGlzYWJsZSBCZWFjb24gUXVldWUgT3duIGJpdCwgc3VnZ2VzdGVkIGJ5IGpvbmcKKy8vCUFkYXB0ZXItPkhhbEZ1bmMuU2V0VHhEZXNjT1dOSGFuZGxlcihBZGFwdGVyLCBCRUFDT05fUVVFVUUsIDAsIDApOworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhwcml2LT5pZWVlODAyMTEpOworCisJcHJpdi0+aWVlZTgwMjExLT5saW5rX2NoYW5nZShkZXYpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2LT5pZWVlODAyMTEpOworCisJLy8gU3RvcCBTVyBCZWFjb24uVXNlIGh3IGJlYWNvbiBzbyBkbyBub3QgbmVlZCB0byBkbyBzby5ieSBhbXkKKyNpZiAwCisJaWYocE1nbnRJbmZvLT5iRW5hYmxlU3dCZWFjb25UaW1lcikKKwl7CisJCS8vIFN3QmVhY29uVGltZXIgd2lsbCBzdG9wIGlmIHBNZ250SW5mby0+bUlic3M9PUZBTFNFLCBzZWUgU3dCZWFjb25DYWxsYmFjaygpIGZvciBkZXRhaWxzLgorLy8gY29tbWVudCBvdXQgYnkgaGFpY2gsIDIwMDcuMTAuMDEKKy8vI2lmIERFVl9CVVNfVFlQRT09VVNCX0lOVEVSRkFDRQorCQlQbGF0Zm9ybUNhbmNlbFRpbWVyKCBBZGFwdGVyLCAmcE1nbnRJbmZvLT5Td0JlYWNvblRpbWVyKTsKKy8vI2VuZGlmCisJfQorI2VuZGlmCisKKy8vCQlNZ250SW5kaWNhdGVNZWRpYVN0YXR1cyggQWRhcHRlciwgUlRfTUVESUFfRElTQ09OTkVDVCwgR0VORVJBTF9JTkRJQ0FURSApOworCit9Cit2b2lkCitNbG1lRGlzYXNzb2NpYXRlUmVxdWVzdCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4KgkJCWFzU3RhLAorCXU4CQkJYXNSc24KKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGk7CisKKwlTZW5kRGlzYXNzb2NpYXRpb24ocHJpdi0+aWVlZTgwMjExLCBhc1N0YSwgYXNSc24gKTsKKworCWlmKCBtZW1jbXAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIGFzU3RhLCA2ICkgPT0gMCApeworCQkvL1NodUNoZW4gVE9ETzogY2hhbmdlIG1lZGlhIHN0YXR1cy4KKwkJLy9TaHVDaGVuIFRPRE86IFdoYXQgdG8gZG8gd2hlbiBkaXNhc3NvY2lhdGUuCisJCURydklGSW5kaWNhdGVEaXNhc3NvY2lhdGlvbihkZXYsIHVuc3BlY19yZWFzb24pOworCisKKwkvLwlwTWdudEluZm8tPkFzb2NUaW1lc3RhbXAgPSAwOworCQlmb3IoaT0wO2k8NjtpKyspICBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZFtpXSA9IDB4MjI7CisvLwkJcE1nbnRJbmZvLT5tQnJhdGVzLkxlbmd0aCA9IDA7CisvLwkJQWRhcHRlci0+SGFsRnVuYy5TZXRId1JlZ0hhbmRsZXIoIEFkYXB0ZXIsIEhXX1ZBUl9CQVNJQ19SQVRFLCAocHUxQnl0ZSkoJnBNZ250SW5mby0+bUJyYXRlcykgKTsKKworCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHByaXYtPmllZWU4MDIxMSk7CisKKworCX0KKworfQorCit2b2lkCitNZ250RGlzY29ubmVjdEFQKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQlhc1JzbgorKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworLy8KKy8vIENvbW1lbnRlZCBvdXQgYnkgcmNuamtvLCAyMDA1LjAxLjI3OgorLy8gSSBtb3ZlIFNlY0NsZWFyQWxsS2V5cygpIHRvIE1nbnRBY3RTZXRfODAyXzExX0RJU0FTU09DSUFURSgpLgorLy8KKy8vCS8vMjAwNC8wOS8xNSwga2N3dSwgdGhlIGtleSBzaG91bGQgYmUgY2xlYXJlZCwgb3IgdGhlIG5ldyBoYW5kc2hha2luZyB3aWxsIG5vdCBzdWNjZXNzCisvLwlTZWNDbGVhckFsbEtleXMoQWRhcHRlcik7CisKKwkvLyBJbiBXUEEgV1BBMiBuZWVkIHRvIENsZWFyIGFsbCBrZXkgLi4uIGJlY2F1c2UgbmV3IGtleSB3aWxsIHNldCBhZnRlciBuZXcgaGFuZHNoYWtpbmcuCisjaWZkZWYgVE9ETworCWlmKCAgIHBNZ250SW5mby0+U2VjdXJpdHlJbmZvLkF1dGhNb2RlID4gUlRfODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoIHx8CisJCShwTWdudEluZm8tPmJBUFN1cG9ydENDS00gJiYgcE1nbnRJbmZvLT5iQ0NYODAyMXhlbmFibGUpICkgIC8vIEluIENDS00gbW9kZSB3aWxsIENsZWFyIGtleQorCXsKKwkJU2VjQ2xlYXJBbGxLZXlzKEFkYXB0ZXIpOworCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0xPVUQsKCI9PT09PT0+Q0NLTSBjbGVhciBrZXkuLi4iKSkKKwl9CisjZW5kaWYKKwkvLyAyMDA0LjEwLjExLCBieSByY25qa28uCisJLy9NbG1lRGlzYXNzb2NpYXRlUmVxdWVzdCggQWRhcHRlciwgcE1nbnRJbmZvLT5Cc3NpZCwgZGlzYXNfbHZfc3MgKTsKKwlNbG1lRGlzYXNzb2NpYXRlUmVxdWVzdCggZGV2LCBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgYXNSc24gKTsKKworCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworLy8JcE1nbnRJbmZvLT5Bc29jVGltZXN0YW1wID0gMDsKK30KK2Jvb2wKK01nbnREaXNjb25uZWN0KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQlhc1JzbgorKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvLworCS8vIFNjaGVkdWxlIGFuIHdvcmtpdGVtIHRvIHdha2UgdXAgZm9yIHBzIG1vZGUsIDA3MDEwOSwgYnkgcmNuamtvLgorCS8vCisjaWZkZWYgVE9ETworCWlmKHBNZ250SW5mby0+bVBzcyAhPSBlQXdha2UpCisJeworCQkvLworCQkvLyBVc2luZyBBd2thZVRpbWVyIHRvIHByZXZlbnQgbWlzbWF0Y2ggcHMgc3RhdGUuCisJCS8vIEluIHRoZSB0aW1lciB0aGUgc3RhdGUgd2lsbCBiZSBjaGFuZ2VkIGFjY29yZGluZyB0byB0aGUgUkYgaXMgYmVpbmcgYXdva2Ugb3Igbm90LiBCeSBCcnVjZSwgMjAwNy0xMC0zMS4KKwkJLy8KKwkJLy8gUGxhdGZvcm1TY2hlZHVsZVdvcmtJdGVtKCAmKHBNZ250SW5mby0+QXdha2VXb3JrSXRlbSkgKTsKKwkJUGxhdGZvcm1TZXRUaW1lciggQWRhcHRlciwgJihwTWdudEluZm8tPkF3YWtlVGltZXIpLCAwICk7CisJfQorI2VuZGlmCisKKwkvLyBJbmRpY2F0aW9uIG9mIGRpc2Fzc29jaWF0aW9uIGV2ZW50LgorCS8vRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKEFkYXB0ZXIsIGFzUnNuKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShwcml2LT5pZWVlODAyMTEpKQorCQlEb3QxMWRfUmVzZXQocHJpdi0+aWVlZTgwMjExKTsKKyNlbmRpZgorCS8vIEluIGFkaG9jIG1vZGUsIHVwZGF0ZSBiZWFjb24gZnJhbWUuCisJaWYoIHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCApCisJeworCQlpZiggcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MgKQorCQl7CisvLwkJCVJUX1RSQUNFKENPTVBfTUxNRSwgREJHX0xPVUQsICgiTWdudERpc2Nvbm5lY3QoKSA9PT0+IE1nbnREaXNjb25uZWN0SUJTU1xuIikpOworCQkJLy9wcmludGsoIk1nbnREaXNjb25uZWN0KCkgPT09PiBNZ250RGlzY29ubmVjdElCU1NcbiIpOworCQkJTWdudERpc2Nvbm5lY3RJQlNTKGRldik7CisJCX0KKwkJaWYoIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICkKKwkJeworCQkJLy8gV2UgY2xlYXIga2V5IGhlcmUgaW5zdGVhZCBvZiBNZ250RGlzY29ubmVjdEFQKCkgYmVjYXVzZSB0aGF0CisJCQkvLyBNZ250QWN0U2V0XzgwMl8xMV9ESVNBU1NPQ0lBVEUoKSBpcyBhbiBpbnRlcmZhY2UgY2FsbGVkIGJ5IE9TLAorCQkJLy8gZS5nLiBPSURfODAyXzExX0RJU0FTU09DSUFURSBpbiBXaW5kb3dzIHdoaWxlIGFzIE1nbnREaXNjb25uZWN0QVAoKSBpcworCQkJLy8gdXNlZCB0byBoYW5kbGUgZGlzYXNzb2NpYXRpb24gcmVsYXRlZCB0aGluZ3MgdG8gQVAsIGUuZy4gc2VuZCBEaXNhc3NvYworCQkJLy8gZnJhbWUgdG8gQVAuICAyMDA1LjAxLjI3LCBieSByY25qa28uCisvLwkJCVNlY0NsZWFyQWxsS2V5cyhBZGFwdGVyKTsKKworLy8JCQlSVF9UUkFDRShDT01QX01MTUUsIERCR19MT1VELCAoIk1nbnREaXNjb25uZWN0KCkgPT09PiBNZ250RGlzY29ubmVjdEFQXG4iKSk7CisJCQkvL3ByaW50aygiTWdudERpc2Nvbm5lY3QoKSA9PT0+IE1nbnREaXNjb25uZWN0QVBcbiIpOworCQkJTWdudERpc2Nvbm5lY3RBUChkZXYsIGFzUnNuKTsKKwkJfQorCisJCS8vIEluaWRpY2F0ZSBEaXNjb25uZWN0LCAyMDA1LjAyLjIzLCBieSByY25qa28uCisvLwkJTWdudEluZGljYXRlTWVkaWFTdGF0dXMoIEFkYXB0ZXIsIFJUX01FRElBX0RJU0NPTk5FQ1QsIEdFTkVSQUxfSU5ESUNBVEUpOworCX0KKworCXJldHVybiB0cnVlOworfQorLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCUNoYW5nIFJGIFBvd2VyIFN0YXRlLgorLy8JCU5vdGUgdGhhdCwgb25seSBNZ250QWN0U2V0X1JGX1N0YXRlKCkgaXMgYWxsb3dlZCB0byBzZXQgSFdfVkFSX1JGX1NUQVRFLgorLy8KKy8vCUFzc3VtcHRpb246CisvLwkJUEFTU0lWRSBMRVZFTC4KKy8vCitib29sCitTZXRSRlBvd2VyU3RhdGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlSVF9SRl9QT1dFUl9TVEFURQllUkZQb3dlclN0YXRlCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlib29sCQkJYlJlc3VsdCA9IGZhbHNlOworCisvLwlwcmludGsoIi0tLS0tLS0tLT4gU2V0UkZQb3dlclN0YXRlKCk6IGVSRlBvd2VyU3RhdGUoJWQpXG4iLCBlUkZQb3dlclN0YXRlKTsKKwlpZihlUkZQb3dlclN0YXRlID09IHByaXYtPmVSRlBvd2VyU3RhdGUpCisJeworLy8JCXByaW50aygiPC0tLS0tLS0tLSBTZXRSRlBvd2VyU3RhdGUoKTogZGlzY2FyZCB0aGUgcmVxdWVzdCBmb3IgZVJGUG93ZXJTdGF0ZSglZCkgaXMgdGhlIHNhbWUuXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJcmV0dXJuIGJSZXN1bHQ7CisJfQorCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCQljYXNlIFJGX1pFQlJBMjoKKwkJY2FzZSBSRl9aRUJSQTQ6CisJCQkgYlJlc3VsdCA9IFNldFplYnJhUkZQb3dlclN0YXRlODE4NShkZXYsIGVSRlBvd2VyU3RhdGUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiU2V0UkZQb3dlclN0YXRlODE4NSgpOiB1bmtub3duIFJGQ2hpcElEOiAweCVYISEhXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJCWJyZWFrOzsKK30KKy8vCXByaW50aygiPC0tLS0tLS0tLSBTZXRSRlBvd2VyU3RhdGUoKTogYlJlc3VsdCglZClcbiIsIGJSZXN1bHQpOworCisJcmV0dXJuIGJSZXN1bHQ7Cit9Cit2b2lkCitIYWxFbmFibGVSeDgxODVEdW1teSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworfQordm9pZAorSGFsRGlzYWJsZVJ4ODE4NUR1bW15KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7Cit9CisKK2Jvb2wKK01nbnRBY3RTZXRfUkZfU3RhdGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlSVF9SRl9QT1dFUl9TVEFURQlTdGF0ZVRvU2V0LAorCXUzMglDaGFuZ2VTb3VyY2UKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wJCQkJYkFjdGlvbkFsbG93ZWQgPSBmYWxzZTsKKwlib29sCQkJCWJDb25uZWN0QnlTU0lEID0gZmFsc2U7CisJUlRfUkZfUE9XRVJfU1RBVEUgCXJ0U3RhdGU7CisJdTE2CQkJCVJGV2FpdENvdW50ZXIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKy8vCSBwcmludGsoIj09PT5NZ250QWN0U2V0X1JGX1N0YXRlKCk6IFN0YXRlVG9TZXQoJWQpLCBDaGFuZ2VTb3VyY2UoMHgleClcbiIsU3RhdGVUb1NldCwgQ2hhbmdlU291cmNlKTsKKwkvLworCS8vIFByZXZlbnQgdGhlIHJhY2UgY29uZGl0aW9uIG9mIFJGIHN0YXRlIGNoYW5nZS4gQnkgQnJ1Y2UsIDIwMDctMTEtMjguCisJLy8gT25seSBvbmUgdGhyZWFkIGNhbiBjaGFuZ2UgdGhlIFJGIHN0YXRlIGF0IG9uZSB0aW1lLCBhbmQgb3RoZXJzIHNob3VsZCB3YWl0IHRvIGJlIGV4ZWN1dGVkLgorCS8vCisjaWYgMQorCXdoaWxlKHRydWUpCisJeworLy8JCWRvd24oJnByaXYtPnJmX3N0YXRlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssZmxhZyk7CisJCWlmKHByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcykKKwkJeworLy8JCQlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PmhhaGExMTExMTExMTFcbiIpOworLy8JCQl1cCgmcHJpdi0+cmZfc3RhdGUpOworLy8JCQlSVF9UUkFDRShDT01QX1JGLCBEQkdfTE9VRCwgKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IFJGIENoYW5nZSBpbiBwcm9ncmVzcyEgV2FpdCB0byBzZXQuLlN0YXRlVG9TZXQoJWQpLlxuIiwgU3RhdGVUb1NldCkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jayxmbGFnKTsKKwkJCS8vIFNldCBSRiBhZnRlciB0aGUgcHJldmlvdXMgYWN0aW9uIGlzIGRvbmUuCisJCQl3aGlsZShwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpCisJCQl7CisJCQkJUkZXYWl0Q291bnRlciArKzsKKy8vCQkJCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogV2FpdCAxIG1zICglZCB0aW1lcykuLi5cbiIsIFJGV2FpdENvdW50ZXIpKTsKKwkJCQl1ZGVsYXkoMTAwMCk7IC8vIDEgbXMKKworCQkJCS8vIFdhaXQgdG9vIGxvbmcsIHJldHVybiBGQUxTRSB0byBhdm9pZCB0byBiZSBzdHVjayBoZXJlLgorCQkJCWlmKFJGV2FpdENvdW50ZXIgPiAxMDAwKSAvLyAxc2VjCisJCQkJeworLy8JCQkJCVJUX0FTU0VSVChGQUxTRSwgKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IFdhaXQgdG9vIGxvZ24gdG8gc2V0IFJGXG4iKSk7CisJCQkJCXByaW50aygiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBXYWl0IHRvbyBsb25nIHRvIHNldCBSRlxuIik7CisJCQkJCS8vIFRPRE86IFJlc2V0IFJGIHN0YXRlPworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworLy8JCQlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT5oYWhhMlxuIik7CisJCQlwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlOworLy8JCQl1cCgmcHJpdi0+cmZfc3RhdGUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jayxmbGFnKTsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7CisKKworCXN3aXRjaChTdGF0ZVRvU2V0KQorCXsKKwljYXNlIGVSZk9uOgorCQkvLworCQkvLyBUdXJuIE9uIFJGIG5vIG1hdHRlciB0aGUgSVBTIHNldHRpbmcgYmVjYXVzZSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgUkYgc3RhdGUgdG8gTmRpcyB1bmRlciBWaXN0YSwgb3IKKwkJLy8gdGhlIFdpbmRvd3MgZG9lcyBub3QgYWxsb3cgdGhlIGRyaXZlciB0byBwZXJmb3JtIHNpdGUgc3VydmV5IGFueSBtb3JlLiBCeSBCcnVjZSwgMjAwNy0xMC0wMi4KKwkJLy8KKwkJcHJpdi0+UmZPZmZSZWFzb24gJj0gKH5DaGFuZ2VTb3VyY2UpOworCisJCWlmKCEgcHJpdi0+UmZPZmZSZWFzb24pCisJCXsKKwkJCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKKwkJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKKworCQkJaWYocnRTdGF0ZSA9PSBlUmZPZmYgJiYgQ2hhbmdlU291cmNlID49UkZfQ0hBTkdFX0JZX0hXICYmICFwcml2LT5iSW5IY3RUZXN0KQorCQkJeworCQkJCWJDb25uZWN0QnlTU0lEID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQllbHNlCisvLwkJCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIk1nbnRBY3RTZXRfUkZfU3RhdGUgLSBlUmZvbiByZWplY3QgcE1nbnRJbmZvLT5SZk9mZlJlYXNvbj0gMHgleCwgQ2hhbmdlU291cmNlPTB4JVhcbiIsIHBNZ250SW5mby0+UmZPZmZSZWFzb24sIENoYW5nZVNvdXJjZSkpOworCQkJOworCQlicmVhazsKKworCWNhc2UgZVJmT2ZmOgorCQkgLy8gMDcwMTI1LCByY25qa286IHdlIGFsd2F5cyBrZWVwIGNvbm5lY3RlZCBpbiBBUCBtb2RlLgorCisJCQlpZiAocHJpdi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKQorCQkJeworCQkJCS8vCisJCQkJLy8gMDYwODA4LCBBbm5pZToKKwkJCQkvLyBEaXNjb25uZWN0IHRvIGN1cnJlbnQgQlNTIHdoZW4gcmFkaW8gb2ZmLiBBc2tlZCBieSBRdWFuVGEuCisJCQkJLy8KKworCQkJCS8vCisJCQkJLy8gQ2FsbGluZyBNZ250RGlzY29ubmVjdCgpIGluc3RlYWQgb2YgTWdudEFjdFNldF84MDJfMTFfRElTQVNTT0NJQVRFKCksCisJCQkJLy8gYmVjYXVzZSB3ZSBkbyBOT1QgbmVlZCB0byBzZXQgc3NpZCB0byBkdW1teSBvbmVzLgorCQkJCS8vIFJldmlzZWQgYnkgUm9nZXIsIDIwMDcuMTIuMDQuCisJCQkJLy8KKwkJCQlNZ250RGlzY29ubmVjdCggZGV2LCBkaXNhc19sdl9zcyApOworCisJCQkJLy8gQ2xlYXIgY29udGVudCBvZiBic3NEZXNjW10gYW5kIGJzc0Rlc2M0UXVlcnlbXSB0byBhdm9pZCByZXBvcnRpbmcgb2xkIGJzcyB0byBVSS4KKwkJCQkvLyAyMDA3LjA1LjI4LCBieSBzaGllbiBjaGFuZy4KKy8vCQkJCVBsYXRmb3JtWmVyb01lbW9yeSggcE1nbnRJbmZvLT5ic3NEZXNjLCBzaXplb2YoUlRfV0xBTl9CU1MpKk1BWF9CU1NfREVTQyApOworLy8JCQkJcE1nbnRJbmZvLT5OdW1Cc3NEZXNjID0gMDsKKy8vCQkJCVBsYXRmb3JtWmVyb01lbW9yeSggcE1nbnRJbmZvLT5ic3NEZXNjNFF1ZXJ5LCBzaXplb2YoUlRfV0xBTl9CU1MpKk1BWF9CU1NfREVTQyApOworLy8JCQkJcE1nbnRJbmZvLT5OdW1Cc3NEZXNjNFF1ZXJ5ID0gMDsKKwkJCX0KKworCisKKwkJcHJpdi0+UmZPZmZSZWFzb24gfD0gQ2hhbmdlU291cmNlOworCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CisJCWJyZWFrOworCisJY2FzZSBlUmZTbGVlcDoKKwkJcHJpdi0+UmZPZmZSZWFzb24gfD0gQ2hhbmdlU291cmNlOworCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYoYkFjdGlvbkFsbG93ZWQpCisJeworLy8JCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogQWN0aW9uIGlzIGFsbG93ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBwTWdudEluZm8tPlJmT2ZmUmVhc29uKSk7CisgICAgICAgICAgICAgICAgLy8gQ29uZmlnIEhXIHRvIHRoZSBzcGVjaWZpZWQgbW9kZS4KKy8vCQlwcmludGsoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogQWN0aW9uIGlzIGFsbG93ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBwcml2LT5SZk9mZlJlYXNvbik7CisJCVNldFJGUG93ZXJTdGF0ZShkZXYsIFN0YXRlVG9TZXQpOworCisJCS8vIFR1cm4gb24gUkYuCisJCWlmKFN0YXRlVG9TZXQgPT0gZVJmT24pCisJCXsKKwkJCUhhbEVuYWJsZVJ4ODE4NUR1bW15KGRldik7CisJCQlpZihiQ29ubmVjdEJ5U1NJRCkKKwkJCXsKKwkJCS8vIGJ5IGFteSBub3Qgc3VwcG9ydGVkCisvLwkJCQlNZ250QWN0U2V0XzgwMl8xMV9TU0lEKEFkYXB0ZXIsIEFkYXB0ZXItPk1nbnRJbmZvLlNzaWQuT2N0ZXQsIEFkYXB0ZXItPk1nbnRJbmZvLlNzaWQuTGVuZ3RoLCBUUlVFICk7CisJCQl9CisJCX0KKwkJLy8gVHVybiBvZmYgUkYuCisJCWVsc2UgaWYoU3RhdGVUb1NldCA9PSBlUmZPZmYpCisJCXsKKwkJCUhhbERpc2FibGVSeDgxODVEdW1teShkZXYpOworCQl9CisJfQorCWVsc2UKKwl7CisJLy8JcHJpbnRrKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyByZWplY3RlZC4uLi4gU3RhdGVUb1NldCglZCksIENoYW5nZVNvdXJjZSglI1gpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBDaGFuZ2VTb3VyY2UsIHByaXYtPlJmT2ZmUmVhc29uKTsKKwl9CisKKwkvLyBSZWxlYXNlIFJGIHNwaW5sb2NrCisvLwlkb3duKCZwcml2LT5yZl9zdGF0ZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssZmxhZyk7CisJcHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7CisvLwl1cCgmcHJpdi0+cmZfc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssZmxhZyk7CisvLwlwcmludGsoIjw9PT1NZ250QWN0U2V0X1JGX1N0YXRlKClcbiIpOworCXJldHVybiBiQWN0aW9uQWxsb3dlZDsKK30KK3ZvaWQKK0luYWN0aXZlUG93ZXJTYXZlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCS8vdTggaW5kZXggPSAwOworCisJLy8KKwkvLyBUaGlzIGZsYWcgImJTd1JmUHJvY2Vzc2luZyIsIGluZGljYXRlcyB0aGUgc3RhdHVzIG9mIElQUyBwcm9jZWR1cmUsIHNob3VsZCBiZSBzZXQgaWYgdGhlIElQUyB3b3JraXRlbQorCS8vIGlzIHJlYWxseSBzY2hlZHVsZWQuCisJLy8gVGhlIG9sZCBjb2RlLCBzZXRzIHRoaXMgZmxhZyBiZWZvcmUgc2NoZWR1bGluZyB0aGUgSVBTIHdvcmtpdGVtIGFuZCBob3dldmVyLCBhdCB0aGUgc2FtZSB0aW1lIHRoZQorCS8vIHByZXZpb3VzIElQUyB3b3JraXRlbSBkaWQgbm90IGVuZCB5ZXQsIGZhaWxzIHRvIHNjaGVkdWxlIHRoZSBjdXJyZW50IHdvcmtpdGVtLiBUaHVzLCBiU3dSZlByb2Nlc3NpbmcKKwkvLyBibG9ja3MgdGhlIElQUyBwcm9jZWR1cmUgb2Ygc3dpdGNoaW5nIFJGLgorCS8vIEJ5IEJydWNlLCAyMDA3LTEyLTI1LgorCS8vCisJcHJpdi0+YlN3UmZQcm9jZXNzaW5nID0gdHJ1ZTsKKworCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBwcml2LT5lSW5hY3RpdmVQb3dlclN0YXRlLCBSRl9DSEFOR0VfQllfSVBTKTsKKworCS8vCisJLy8gVG8gc29sdmUgQ0FNIHZhbHVlcyBtaXNzIGluIFJGIE9GRiwgcmV3cml0ZSBDQU0gdmFsdWVzIGFmdGVyIFJGIE9OLiBCeSBCcnVjZSwgMjAwNy0wOS0yMC4KKwkvLworI2lmIDAKKwl3aGlsZSggaW5kZXggPCA0ICkKKwl7CisJCWlmKCAoIHBNZ250SW5mby0+U2VjdXJpdHlJbmZvLlBhaXJ3aXNlRW5jQWxnb3JpdGhtID09IFdFUDEwNF9FbmNyeXB0aW9uICkgfHwKKwkJCShwTWdudEluZm8tPlNlY3VyaXR5SW5mby5QYWlyd2lzZUVuY0FsZ29yaXRobSA9PSBXRVA0MF9FbmNyeXB0aW9uKSApCisJCXsKKwkJCWlmKCBwTWdudEluZm8tPlNlY3VyaXR5SW5mby5LZXlMZW5baW5kZXhdICE9IDApCisJCQlwQWRhcHRlci0+SGFsRnVuYy5TZXRLZXlIYW5kbGVyKHBBZGFwdGVyLCBpbmRleCwgMCwgRkFMU0UsIHBNZ250SW5mby0+U2VjdXJpdHlJbmZvLlBhaXJ3aXNlRW5jQWxnb3JpdGhtLCBUUlVFLCBGQUxTRSk7CisKKwkJfQorCQlpbmRleCsrOworCX0KKyNlbmRpZgorCXByaXYtPmJTd1JmUHJvY2Vzc2luZyA9IGZhbHNlOworfQorCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJRW50ZXIgdGhlIGluYWN0aXZlIHBvd2VyIHNhdmUgbW9kZS4gUkYgd2lsbCBiZSBvZmYKKy8vCTIwMDcuMDguMTcsIGJ5IHNoaWVuIGNoYW5nLgorLy8KK3ZvaWQKK0lQU0VudGVyKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJLy9wcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5lbnRlciBJUFNcbiIpOworCWlmIChwcml2LT5iSW5hY3RpdmVQcykKKwl7CisJCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOworCisJCS8vCisJCS8vIEFkZGVkIGJ5IEJydWNlLCAyMDA3LTEyLTI1LgorCQkvLyBEbyBub3QgZW50ZXIgSVBTIGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKwkJLy8gKDEpIFJGIGlzIGFscmVhZHkgT0ZGIG9yIFNsZWVwCisJCS8vICgyKSBiU3dSZlByb2Nlc3NpbmcgKGluZGljYXRlcyB0aGUgSVBTIGlzIHN0aWxsIHVuZGVyIGdvaW5nKQorCQkvLyAoMykgQ29ubmVjdHRlZCAob25seSBkaXNjb25uZWN0ZWQgY2FuIHRyaWdnZXIgSVBTKQorCQkvLyAoNCkgSUJTUyAoc2VuZCBCZWFjb24pCisJCS8vICg1KSBBUCBtb2RlIChzZW5kIEJlYWNvbikKKwkJLy8KKwkJaWYgKHJ0U3RhdGUgPT0gZVJmT24gJiYgIXByaXYtPmJTd1JmUHJvY2Vzc2luZworCQkJJiYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCApKQorCQl7CisJLy8JCXByaW50aygiSVBTRW50ZXIoKTogVHVybiBvZmYgUkYuXG4iKTsKKwkJCXByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBlUmZPZmY7CisJCQlJbmFjdGl2ZVBvd2VyU2F2ZShkZXYpOworCQl9CisJfQorLy8JcHJpbnRrKCJwcml2LT5lUkZQb3dlclN0YXRlIGlzICVkXG4iLHByaXYtPmVSRlBvd2VyU3RhdGUpOworfQordm9pZAorSVBTTGVhdmUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsKKwkvL3ByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+bGVhdmUgSVBTXG4iKTsKKwlpZiAocHJpdi0+YkluYWN0aXZlUHMpCisJeworCQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKKwkJaWYgKChydFN0YXRlID09IGVSZk9mZiB8fCBydFN0YXRlID09IGVSZlNsZWVwKSAmJiAoIXByaXYtPmJTd1JmUHJvY2Vzc2luZykgJiYgcHJpdi0+UmZPZmZSZWFzb24gPD0gUkZfQ0hBTkdFX0JZX0lQUykKKwkJeworLy8JCQlwcmludGsoIklQU0xlYXZlKCk6IFR1cm4gb24gUkYuXG4iKTsKKwkJCXByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBlUmZPbjsKKwkJCUluYWN0aXZlUG93ZXJTYXZlKGRldik7CisJCX0KKwl9CisvLwlwcmludGsoInByaXYtPmVSRlBvd2VyU3RhdGUgaXMgJWRcbiIscHJpdi0+ZVJGUG93ZXJTdGF0ZSk7Cit9CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQordm9pZCBydGw4MTg1Yl9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisKKwl1OCBTdXBwb3J0ZWRXaXJlbGVzc01vZGU7CisJdTgJCQlJbml0V2lyZWxlc3NNb2RlOworCXU4CQkJYkludmFsaWRXaXJlbGVzc01vZGUgPSAwOworCS8vaW50IGk7CisJdTggdG1wdTg7CisgICAgCS8vdTggdTF0bXAsdTJ0bXA7CisJdTggYnRDUjkzNDY7CisJdTggVG1wVTFiOworCXU4IGJ0UFNSOworCisJLy9ydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisvL3tieSBhbXkgMDgwMzEyCisJd3JpdGVfbmljX2J5dGUoZGV2LDB4MjRlLCAoQklUNXxCSVQ2fEJJVDApKTsKKy8vYnkgYW15IDA4MDMxMn0KKwlydGw4MTgwX3Jlc2V0KGRldik7CisKKwlwcml2LT5kbWFfcG9sbF9tYXNrID0gMDsKKwlwcml2LT5kbWFfcG9sbF9zdG9wX21hc2sgPSAwOworCisJLy9ydGw4MTgwX2JlYWNvbl90eF9kaXNhYmxlKGRldik7CisKKwlId0NvbmZpZ3VyZVJUTDgxODUoZGV2KTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIE1BQzAsICgodTMyKilkZXYtPmRldl9hZGRyKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBNQUM0LCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMV0gJiAweGZmZmYgKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCByZWFkX25pY19ieXRlKGRldiwgTVNSKSAmIDB4ZjMpOwkvLyBkZWZhdWx0IG5ldHdvcmsgdHlwZSB0byAnTm8JTGluaycKKworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBCUlNSLCAweDApOwkJLy8gU2V0IEJSU1I9IDFNCisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJjbkl0diwgMTAwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEF0aW1XbmQsIDIpOworCisJLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKGRldiwgRkVNUiwgMHhGRkZGKTsKKwlQbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIEZFTVIsIDB4RkZGRik7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFdQQV9DT05GSUcsIDApOworCisJTWFjQ29uZmlnXzg1QkFTSUMoZGV2KTsKKworCS8vIE92ZXJyaWRlIHRoZSBSRlNXX0NUUkwgKE1BQyBvZmZzZXQgMHgyNzItMHgyNzMpLCAyMDA2LjA2LjA3LCBieSByY25qa28uCisJLy8gQlRfREVNT19CT0FSRCB0eXBlCisJUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBSRlNXX0NUUkwsIDB4NTY5YSk7CisvL2J5IGFteQorLy8jaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCQkvLyBmb3Igam9uZyByZXF1aXJlZAorLy8JUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBSRlNXX0NUUkwsIDB4OWE1Nik7CisvLyNlbmRpZgorLy9ieSBhbXkKKwkvL0JUX1FBX0JPQVJECisJLy9QbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIFJGU1dfQ1RSTCwgMHg5YTU2KTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTZXQgdXAgUEhZIHJlbGF0ZWQuCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEVuYWJsZSBDb25maWczLlBBUkFNX0VuIHRvIHJldmlzZSBBbmFhUGFybS4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgMHhjMCk7CS8vIGVuYWJsZSBjb25maWcgcmVnaXN0ZXIgd3JpdGUKKy8vYnkgYW15CisJdG1wdTggPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgKHRtcHU4IHxDT05GSUczX1BBUk1fRW4pICk7CisjZWxzZQorCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgKHRtcHU4IHxDT05GSUczX1BBUk1fRW4gfCBDT05GSUczX0NMS1JVTl9FbikgKTsKKyNlbmRpZgorLy9ieSBhbXkKKwkvLyBUdXJuIG9uIEFuYWxvZyBwb3dlci4KKwkvLyBBc2tlZCBmb3IgYnkgV2lsbGlhbSwgb3RoZXJ3aXNlLCBNQUMgMy13aXJlIGNhbid0IHdvcmssIDIwMDYuMDYuMjcsIGJ5IHJjbmprby4KKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTTIsIEFOQVBBUk0yX0FTSUNfT04pOworCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNLCBBTkFQQVJNX0FTSUNfT04pOworLy9ieSBhbXkKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJd3JpdGVfbmljX3dvcmQoZGV2LCBBTkFQQVJBTTMsIDB4MDAxMCk7CisjZWxzZQorICAgICAgd3JpdGVfbmljX2J5dGUoZGV2LCBBTkFQQVJBTTMsIDB4MDApOworI2VuZGlmCisvL2J5IGFteQorCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCB0bXB1OCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIDB4MDApOworLy97YnkgYW15IDA4MDMxMiBmb3IgbGVkCisJLy8gZW5hYmxlIEVFTTAgYW5kIEVFTTEgaW4gOTM0NkNSCisJYnRDUjkzNDYgPSByZWFkX25pY19ieXRlKGRldiwgQ1I5MzQ2KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgKGJ0Q1I5MzQ2fDB4QzApICk7CisKKwkvLyBCIGN1dCB1c2UgTEVEMSB0byBjb250cm9sIEhXIFJGIG9uL29mZgorCVRtcFUxYiA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KTsKKwlUbXBVMWIgPSBUbXBVMWIgJiB+QklUMzsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHNSwgVG1wVTFiKTsKKworCS8vIGRpc2FibGUgRUVNMCBhbmQgRUVNMSBpbiA5MzQ2Q1IKKwlidENSOTM0NiAmPSB+KDB4QzApOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCBidENSOTM0Nik7CisKKwkvL0VuYWJsZSBMZWQgKHN1Z2dlc3RlZCBieSBKb25nKQorCS8vIEItY3V0IFJGIFJhZGlvIG9uL29mZiAgNWVbM109MAorCWJ0UFNSID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChidFBTUiB8IEJJVDMpKTsKKy8vYnkgYW15IDA4MDMxMiBmb3IgbGVkfQorCS8vIHNldHVwIGluaXRpYWwgdGltaW5nIGZvciBSRkUuCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4MDQ4MCk7CisJU2V0T3V0cHV0RW5hYmxlT2ZSZlBpbnMoZGV2KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHgyNDg4KTsKKworCS8vIFBIWSBjb25maWcuCisJUGh5Q29uZmlnODE4NShkZXYpOworCisJLy8gV2UgYXNzdW1lIFJlZ1dpcmVsZXNzTW9kZSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSwKKwkvLyBob3dldmVyLCB3ZSBoYXMgdG8gdmFsaWRhdGUgdGhlIHdpcmVsZXNzIG1vZGUgaGVyZSBhbmQgcHJvdmlkZSBhIHJlYXNvbmJsZQorCS8vIGluaXRpYWxpemVkIHZhbHVlIGlmIG5lY2Vzc2FyeS4gMjAwNS4wMS4xMywgYnkgcmNuamtvLgorCVN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IEdldFN1cHBvcnRlZFdpcmVsZXNzTW9kZTgxODUoZGV2KTsKKwlpZigJKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9CKSAmJgorCQkoaWVlZS0+bW9kZSAhPSBXSVJFTEVTU19NT0RFX0cpICYmCisJCShpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfQSkgJiYKKwkJKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9BVVRPKSkKKwl7IC8vIEl0IHNob3VsZCBiZSBvbmUgb2YgQiwgRywgQSwgb3IgQVVUTy4KKwkJYkludmFsaWRXaXJlbGVzc01vZGUgPSAxOworCX0KKwllbHNlCisJeyAvLyBPbmUgb2YgQiwgRywgQSwgb3IgQVVUTy4KKwkJLy8gQ2hlY2sgaWYgdGhlIHdpcmVsZXNzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IFJGLgorCQlpZiggKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9BVVRPKSAmJgorCQkJKGllZWUtPm1vZGUgJiBTdXBwb3J0ZWRXaXJlbGVzc01vZGUpID09IDAgKQorCQl7CisJCQliSW52YWxpZFdpcmVsZXNzTW9kZSA9IDE7CisJCX0KKwl9CisKKwlpZihiSW52YWxpZFdpcmVsZXNzTW9kZSB8fCBpZWVlLT5tb2RlPT1XSVJFTEVTU19NT0RFX0FVVE8pCisJeyAvLyBBdXRvIG9yIG90aGVyIGludmFsaWQgdmFsdWUuCisJCS8vIEFzc2lnbmUgYSB3aXJlbGVzcyBtb2RlIHRvIGluaXRpYWxpemUuCisJCWlmKChTdXBwb3J0ZWRXaXJlbGVzc01vZGUgJiBXSVJFTEVTU19NT0RFX0EpKQorCQl7CisJCQlJbml0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9BOworCQl9CisJCWVsc2UgaWYoKFN1cHBvcnRlZFdpcmVsZXNzTW9kZSAmIFdJUkVMRVNTX01PREVfRykpCisJCXsKKwkJCUluaXRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0c7CisJCX0KKwkJZWxzZSBpZigoU3VwcG9ydGVkV2lyZWxlc3NNb2RlICYgV0lSRUxFU1NfTU9ERV9CKSkKKwkJeworCQkJSW5pdFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJfQorCQllbHNlCisJCXsKKwkJCURNRVNHVygiSW5pdGlhbGl6ZUFkYXB0ZXI4MTg1KCk6IE5vIHZhbGlkIHdpcmVsZXNzIG1vZGUgc3VwcG9ydGVkLCBTdXBwb3J0ZWRXaXJlbGVzc01vZGUoJXgpISEhXG4iLAorCQkJCSBTdXBwb3J0ZWRXaXJlbGVzc01vZGUpOworCQkJSW5pdFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJfQorCisJCS8vIEluaXRpYWxpemUgUmVnV2lyZWxlc3NNb2RlIGlmIGl0IGlzIG5vdCBhIHZhbGlkIG9uZS4KKwkJaWYoYkludmFsaWRXaXJlbGVzc01vZGUpCisJCXsKKwkJCWllZWUtPm1vZGUgPSAoV0lSRUxFU1NfTU9ERSlJbml0V2lyZWxlc3NNb2RlOworCQl9CisJfQorCWVsc2UKKwl7IC8vIE9uZSBvZiBCLCBHLCBBLgorCQlJbml0V2lyZWxlc3NNb2RlID0gaWVlZS0+bW9kZTsKKwl9CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorI2lmZGVmIEVOQUJMRV9JUFMKKy8vCXByaW50aygiaW5pdGlhbGl6ZSBFTkFCTEVfSVBTXG4iKTsKKwlwcml2LT5lUkZQb3dlclN0YXRlID0gZVJmT2ZmOworCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKKwl7CisJLy8JdTMyIHRtcDI7CisJLy8JdTMyIHRtcCA9IGppZmZpZXM7CisJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPbiwgMCk7CisJLy8JdG1wMiA9IGppZmZpZXM7CisJLy8JcHJpbnRrKCJyZiBvbiBjb3N0IGppZmZpZXM6JWx4XG4iLCAodG1wMi10bXApKjEwMDAvSFopOworCX0KKy8vCURydklGSW5kaWNhdGVDdXJyZW50UGh5U3RhdHVzKHByaXYpOworCQkvLworCQkvLyBJZiBpbmFjdGl2ZSBwb3dlciBtb2RlIGlzIGVuYWJsZWQsIGRpc2FibGUgcmYgd2hpbGUgaW4gZGlzY29ubmVjdGVkIHN0YXRlLgorCQkvLyAyMDA3LjA3LjE2LCBieSBzaGllbiBjaGFuZy4KKwkJLy8KKwlpZiAocHJpdi0+YkluYWN0aXZlUHMpCisJeworCS8vCXUzMiB0bXAyOworCS8vCXUzMiB0bXAgPSBqaWZmaWVzOworCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldixlUmZPZmYsIFJGX0NIQU5HRV9CWV9JUFMpOworCS8vCXRtcDIgPSBqaWZmaWVzOworCS8vCXByaW50aygicmYgb2ZmIGNvc3QgamlmZmllczolbHhcbiIsICh0bXAyLXRtcCkqMTAwMC9IWik7CisKKwl9CisjZW5kaWYKKy8vCUlQU0VudGVyKGRldik7CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorI2lmZGVmIFRPRE8KKwkvLyBUdXJuIG9mZiBSRiBpZiBuZWNlc3NhcnkuIDIwMDUuMDguMjMsIGJ5IHJjbmprby4KKwkvLyBXZSBzaGFsbCB0dXJuIG9mZiBSRiBhZnRlciBzZXR0aW5nIENNRFIsIG90aGVyd2lzZSwKKwkvLyBSRiB3aWxsIGJlIHR1cm5uZWQgb24gYWZ0ZXIgd2UgZW5hYmxlIE1BQyBUeC9SeC4KKwlpZihBZGFwdGVyLT5NZ250SW5mby5SZWdSZk9mZiA9PSBUUlVFKQorCXsKKwkJU2V0UkZQb3dlclN0YXRlODE4NShBZGFwdGVyLCBSRl9PRkYpOworCX0KKwllbHNlCisJeworCQlTZXRSRlBvd2VyU3RhdGU4MTg1KEFkYXB0ZXIsIFJGX09OKTsKKwl9CisjZW5kaWYKKworLyogICAvL3RoZXNlIGlzIGVxdWFsIHdpdGggYWJvdmUgVE9ETy4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgMHhjMCk7CS8vIGVuYWJsZSBjb25maWcgcmVnaXN0ZXIgd3JpdGUKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKSB8IENPTkZJRzNfUEFSTV9Fbik7CisJUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4OUZGKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTTIsIEFOQVBBUk0yX0FTSUNfT04pOworCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNLCBBTkFQQVJNX0FTSUNfT04pOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgKHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKSYofkNPTkZJRzNfUEFSTV9FbikpKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgMHgwMCk7CisqLworCisJQWN0U2V0V2lyZWxlc3NNb2RlODE4NShkZXYsICh1OCkoSW5pdFdpcmVsZXNzTW9kZSkpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcnRsODE4NWJfaXJxX2VuYWJsZShkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworIH0KKworCit2b2lkIHJ0bDgxODViX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IGNtZDsKKwkvL3UzMiByeGNvbmY7CisJLyogZm9yIG5vdyB3ZSBhY2NlcHQgZGF0YSwgbWFuYWdlbWVudCAmIGN0bCBmcmFtZSovCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworI2lmIDAKKwlyeGNvbmY9cmVhZF9uaWNfZHdvcmQoZGV2LFJYX0NPTkYpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQUNfRklMVEVSX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9NTkdfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfREFUQV9GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9CQ0FTVF9GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9NQ0FTVF9GUkFNRV9TSElGVCk7CisvLwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NSQ0VSUl9GUkFNRV9TSElGVCk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgRE1FU0cgKCJOSUMgaW4gcHJvbWlzYyBtb2RlIik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8IFwKKwkgICBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCk7CisJfWVsc2V7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTklDTUFDX0ZSQU1FX1NISUZUKTsKKwkJaWYocHJpdi0+Y2FyZF84MTg1ID09IDApCisJCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0KKworCS8qaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0qLworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1RMX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9JQ1ZFUlJfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX1BXUl9GUkFNRV9TSElGVCk7CisJfQorCisJaWYoIHByaXYtPmNyY21vbiA9PSAxICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1JDRVJSX0ZSQU1FX1NISUZUKTsKKworCS8vaWYoIXByaXYtPmNhcmRfODE4NSl7CisJCXJ4Y29uZiA9IHJ4Y29uZiAmfiBSWF9GSUZPX1RIUkVTSE9MRF9NQVNLOworCQlyeGNvbmYgPSByeGNvbmYgfCAoUlhfRklGT19USFJFU0hPTERfTk9ORTw8UlhfRklGT19USFJFU0hPTERfU0hJRlQpOworCS8vfQorCisJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0FVVE9SRVNFVFBIWV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mICZ+IE1BWF9SWF9ETUFfTUFTSzsKKwlyeGNvbmYgPSByeGNvbmYgfCAoTUFYX1JYX0RNQV8yMDQ4PDxNQVhfUlhfRE1BX1NISUZUKTsKKworCS8vaWYoIXByaXYtPmNhcmRfODE4NSkKKwkJcnhjb25mID0gcnhjb25mIHwgUkNSX09OTFlFUkxQS1Q7CisKKwlyeGNvbmYgPSByeGNvbmYgJn4gUkNSX0NTX01BU0s7CisJaWYoIXByaXYtPmNhcmRfODE4NSkKKwkJcnhjb25mIHw9IChwcml2LT5yY3JfY3NlbnNlPDxSQ1JfQ1NfU0hJRlQpOworLy8Jcnhjb25mICY9fiAweGZmZjAwMDAwOworLy8Jcnhjb25mIHw9IDB4OTAxMDAwMDA7Ly85MDE0Zjc2ZjsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSWF9DT05GLCByeGNvbmYpOworI2VuZGlmCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSBETUVTRyAoIk5JQyBpbiBwcm9taXNjIG1vZGUiKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgXAorCSAgIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyl7CisJICAgCXByaXYtPlJlY2VpdmVDb25maWcgPSBwcml2LT5SZWNlaXZlQ29uZmlnICYgKH5SQ1JfQVBNKTsKKwkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHByaXYtPlJlY2VpdmVDb25maWcgfCBSQ1JfQUFQOworCX0KKworCS8qaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0qLworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXByaXYtPlJlY2VpdmVDb25maWcgPSBwcml2LT5SZWNlaXZlQ29uZmlnIHwgUkNSX0FDRiB8IFJDUl9BUFdSTUdUIHwgUkNSX0FJQ1Y7CisJfQorCisJaWYoIHByaXYtPmNyY21vbiA9PSAxICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXByaXYtPlJlY2VpdmVDb25maWcgPSBwcml2LT5SZWNlaXZlQ29uZmlnIHwgUkNSX0FDUkMzMjsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgcHJpdi0+UmVjZWl2ZUNvbmZpZyk7CisKKwlmaXhfcnhfZmlmbyhkZXYpOworCisjaWZkZWYgREVCVUdfUlgKKwlETUVTRygicnhjb25mOiAleCAleCIscHJpdi0+UmVjZWl2ZUNvbmZpZyAscmVhZF9uaWNfZHdvcmQoZGV2LFJDUikpOworI2VuZGlmCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LENNRCxjbWQgfCAoMTw8Q01EX1JYX0VOQUJMRV9TSElGVCkpOworCit9CisKK3ZvaWQgcnRsODE4NWJfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCS8vdTggdHhfYWdjX2N0bDsKKwl1OCBieXRlOworCS8vdTMyIHR4Y29uZjsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKyNpZiAwCisJdHhjb25mPSByZWFkX25pY19kd29yZChkZXYsVFhfQ09ORik7CisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKworCisJCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldixDV19DT05GKTsKKwkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUKTsKKwkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDV19DT05GLCBieXRlKTsKKworCQl0eF9hZ2NfY3RsID0gcmVhZF9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwpOworCQl0eF9hZ2NfY3RsICY9IH4oMTw8VFhfQUdDX0NUTF9QRVJQQUNLRVRfR0FJTl9TSElGVCk7CisJCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9BTlRTRUxfU0hJRlQpOworCQl0eF9hZ2NfY3RsIHw9KDE8PFRYX0FHQ19DVExfRkVFREJBQ0tfQU5UKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ1RMLCB0eF9hZ2NfY3RsKTsKKwkJLyoKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDVlLCAweDAxKTsKKwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4ZmUsIDB4MTApOworCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgMHg1ZSwgMHgwMCk7CisJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxKTsKKwkJKi8KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGVjLCAweDNmKTsgLyogRGlzYWJsZSBlYXJseSBUWCAqLworCX0KKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisKKwkJdHhjb25mID0gdHhjb25mICZ+ICgxPDxUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQpOworCisJfWVsc2V7CisKKwkJaWYoaHdzZXFudW0pCisJCQl0eGNvbmY9IHR4Y29uZiAmfiAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKKwkJZWxzZQorCQkJdHhjb25mPSB0eGNvbmYgfCAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKKwl9CisKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVFhfTE9PUEJBQ0tfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAoVFhfTE9PUEJBQ0tfTk9ORSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX0RQUkVUUllfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1JUU1JFVFJZX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKHByaXYtPnJldHJ5X2RhdGE8PFRYX0RQUkVUUllfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiB8IChwcml2LT5yZXRyeV9ydHM8PFRYX1JUU1JFVFJZX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRYX05PQ1JDX1NISUZUKTsKKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCWlmKHByaXYtPmh3X3BsY3BfbGVuKQorCQkJdHhjb25mID0gdHhjb25mICZ+IFRDUl9QTENQX0xFTjsKKwkJZWxzZQorCQkJdHhjb25mID0gdHhjb25mIHwgVENSX1BMQ1BfTEVOOworCX1lbHNleworCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1NBVDsKKwl9CisJdHhjb25mID0gdHhjb25mICZ+IFRDUl9NWERNQV9NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUQ1JfTVhETUFfMjA0ODw8VENSX01YRE1BX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfQ1dNSU47CisJdHhjb25mID0gdHhjb25mIHwgVENSX0RJU0NXOworCisvLwlpZihwcml2LT5pZWVlODAyMTEtPmh3X3dlcCkKKy8vCQl0eGNvbmY9dHhjb25mICZ+ICgxPDxUWF9OT0lDVl9TSElGVCk7CisvLwllbHNlCisJCXR4Y29uZj10eGNvbmYgfCAoMTw8VFhfTk9JQ1ZfU0hJRlQpOworCisJd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHR4Y29uZik7CisjZW5kaWYKKworCXdyaXRlX25pY19kd29yZChkZXYsIFRDUiwgcHJpdi0+VHJhbnNtaXRDb25maWcpOworCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldiwgTVNSKTsKKwlieXRlIHw9IE1TUl9MSU5LX0VORURDQTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE1TUiwgYnl0ZSk7CisKKwlmaXhfdHhfZmlmbyhkZXYpOworCisjaWZkZWYgREVCVUdfVFgKKwlETUVTRygidHhjb25mOiAleCAleCIscHJpdi0+VHJhbnNtaXRDb25maWcscmVhZF9uaWNfZHdvcmQoZGV2LFRDUikpOworI2VuZGlmCisKKwljbWQ9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNtZCB8ICgxPDxDTURfVFhfRU5BQkxFX1NISUZUKSk7CisKKwkvL3dyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworCisKKy8qCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9ETUFfUE9MTElORywgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisJKi8KK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaAppbmRleCAwZDVkYzI0Li5hOGVhNTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCkBAIC00MSw2ICs0MSw0MCBAQAogI2lmbmRlZiBfX1NMSUNfRFJJVkVSX0hfXwogI2RlZmluZSBfX1NMSUNfRFJJVkVSX0hfXwogCisvKiBmaXJtd2FyZSBzdHVmZiAqLworI2RlZmluZSBPQVNJU19VQ09ERV9WRVJTX1NUUklORwkiMS4yIgorI2RlZmluZSBPQVNJU19VQ09ERV9WRVJTX0RBVEUgIAkiMjAwNi8wMy8yNyAxNToxMDozNyIKKyNkZWZpbmUgT0FTSVNfVUNPREVfSE9TVElGX0lEICAJMworCitzdGF0aWMgczMyIE9OdW1TZWN0aW9ucyA9IDB4MjsKK3N0YXRpYyB1MzIgT1NlY3Rpb25TaXplW10gPSB7CisJMHgwMDAwNDAwMCwgMHgwMDAxMDAwMCwKK307CisKK3N0YXRpYyB1MzIgT1NlY3Rpb25TdGFydFtdID0geworCTB4MDAwMDAwMDAsIDB4MDAwMDgwMDAsCit9OworCisjZGVmaW5lIE1PSkFWRV9VQ09ERV9WRVJTX1NUUklORwkiMS4yIgorI2RlZmluZSBNT0pBVkVfVUNPREVfVkVSU19EQVRFICAJIjIwMDYvMDMvMjcgMTU6MTI6MjIiCisjZGVmaW5lIE1PSkFWRV9VQ09ERV9IT1NUSUZfSUQgIAkzCisKK3N0YXRpYyBzMzIgTU51bVNlY3Rpb25zID0gMHgyOworc3RhdGljIHUzMiBNU2VjdGlvblNpemVbXSA9Cit7CisJMHgwMDAwODAwMCwgMHgwMDAxMDAwMCwKK307CisKK3N0YXRpYyB1MzIgTVNlY3Rpb25TdGFydFtdID0KK3sKKwkweDAwMDAwMDAwLCAweDAwMDA4MDAwLAorfTsKKworI2RlZmluZSBHQl9SQ1ZVQ09ERV9WRVJTX1NUUklORwkiMS4yIgorI2RlZmluZSBHQl9SQ1ZVQ09ERV9WRVJTX0RBVEUgIAkiMjAwNi8wMy8yNyAxNToxMjoxNSIKK3N0YXRpYyB1MzIgT2FzaXNSY3ZVQ29kZUxlbiA9IDUxMjsKK3N0YXRpYyB1MzIgR0JSY3ZVQ29kZUxlbiA9IDUxMjsKKyNkZWZpbmUgU0VDVElPTl9TSVpFIDY1NTM2CiAKIHN0cnVjdCBzbGljX3NwaW5sb2NrIHsKIAlzcGlubG9ja190CWxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKaW5kZXggMDAzOTAzNi4uYmY3ZGE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwpAQCAtOTQsNiArOTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KQEAgLTEwNSwxNSArMTA2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlICJzbGljaW5jLmgiCi0jaW5jbHVkZSAiZ2Jkb3dubG9hZC5oIgotI2luY2x1ZGUgImdicmN2dWNvZGUuaCIKLSNpbmNsdWRlICJvYXNpc3JjdnVjb2RlLmgiCi0KLSNpZmRlZiBERUJVR19NSUNST0NPREUKLSNpbmNsdWRlICJvYXNpc2RiZ2Rvd25sb2FkLmgiCi0jZWxzZQotI2luY2x1ZGUgIm9hc2lzZG93bmxvYWQuaCIKLSNlbmRpZgogCiAjaWYgU0xJQ19EVU1QX0VOQUJMRUQKICNpbmNsdWRlICJzbGljZHVtcC5oIgpAQCAtMzIzLDcgKzMxNSw3IEBACiAJaW5kZXgsIHBzbGljX2hhbmRsZSwgYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzLCBwc2xpY19oYW5kbGUtPm5leHQpOyovCiAJYWRhcHRlci0+cHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopCiAJCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtICopLAorCQkJCQlzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0pLAogCQkJCQkmYWRhcHRlci0+CiAJCQkJCXBoeXNfc2htZW0pOwogLyoKQEAgLTE0MzEsNyArMTQyMyw3IEBACiAJCURCR19NU0coImFkYXB0ZXJbJXBdIHBvcnQgJWQgcHNobWVtWyVwXSBGcmVlU2htZW0gIiwKIAkJCWFkYXB0ZXIsIGFkYXB0ZXItPnBvcnQsICh2b2lkICopIGFkYXB0ZXItPnBzaG1lbSk7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0gKiksCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSksCiAJCQkJICAgIGFkYXB0ZXItPnBzaG1lbSwgYWRhcHRlci0+cGh5c19zaG1lbSk7CiAJCWFkYXB0ZXItPnBzaG1lbSA9IE5VTEw7CiAJCWFkYXB0ZXItPnBoeXNfc2htZW0gPSAoZG1hX2FkZHJfdCkgTlVMTDsKQEAgLTIxODYsNiArMjE3OCw5IEBACiAKIHN0YXRpYyBpbnQgc2xpY19jYXJkX2Rvd25sb2FkX2dicmN2KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogeworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3QgY2hhciAqZmlsZSA9ICIiOworCWludCByZXQ7CiAJX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAJdTMyIGNvZGVhZGRyOwogCXVuc2lnbmVkIGNoYXIgKmluc3RydWN0aW9uID0gTlVMTDsKQEAgLTIxOTMsMTIgKzIxODgsMzIgQEAKIAogCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWQpIHsKIAljYXNlIFNMSUNfMkdCX0RFVklDRV9JRDoKLQkJaW5zdHJ1Y3Rpb24gPSAodW5zaWduZWQgY2hhciAqKSZPYXNpc1JjdlVDb2RlWzBdOwotCQlyY3Z1Y29kZWxlbiA9IE9hc2lzUmN2VUNvZGVMZW47CisJCWZpbGUgPSAib2FzaXNfcmN2LmJpbiI7CiAJCWJyZWFrOwogCWNhc2UgU0xJQ18xR0JfREVWSUNFX0lEOgotCQlpbnN0cnVjdGlvbiA9ICh1bnNpZ25lZCBjaGFyICopJkdCUmN2VUNvZGVbMF07Ci0JCXJjdnVjb2RlbGVuID0gR0JSY3ZVQ29kZUxlbjsKKwkJZmlsZSA9ICJnYl9yY3YuYmluIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlicmVhazsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZSwgJmFkYXB0ZXItPnBjaWRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0xJQ09TUzogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgJXNcbiIsIGZpbGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluc3RydWN0aW9uID0gKHVuc2lnbmVkIGNoYXIgKilmdy0+ZGF0YTsKKwlyY3Z1Y29kZWxlbiA9IGZ3LT5zaXplOworCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWQpIHsKKwljYXNlIFNMSUNfMkdCX0RFVklDRV9JRDoKKwkJaWYgKHJjdnVjb2RlbGVuICE9IE9hc2lzUmN2VUNvZGVMZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBTTElDXzFHQl9ERVZJQ0VfSUQ6CisJCWlmIChyY3Z1Y29kZWxlbiAhPSBHQlJjdlVDb2RlTGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKQEAgLTIyMjUsMTMgKzIyNDAsMTYgQEAKIAl9CiAKIAkvKiBkb3dubG9hZCBmaW5pc2hlZCAqLworCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCVdSSVRFX1JFRyhzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgU0xJQ19SQ1ZXQ1NfRklOSVNILCBGTFVTSCk7Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzbGljX2NhcmRfZG93bmxvYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBjaGFyICpmaWxlID0gIiI7CisJaW50IHJldDsKIAl1MzIgc2VjdGlvbjsKIAlpbnQgdGhpc3NlY3Rpb25zaXplOwogCWludCBjb2RlYWRkcjsKQEAgLTIyNTUsNiArMjI3Myw3IEBACiAJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6CiAvKiAgICAgIERCR19NU0cgKCJzbGljb3NzOiAlcyBkZXZpZD09U0xJQ18yR0JfREVWSUNFX0lEIHNlY3Rpb25zWyV4XVxuIiwKIAlfX2Z1bmNfXywgKHVpbnQpIE9OdW1TZWN0aW9ucyk7ICovCisJCWZpbGUgPSAic2xpY19vYXNpcy5iaW4iOwogCQludW1zZWN0cyA9IE9OdW1TZWN0aW9uczsKIAkJZm9yIChpID0gMDsgaSA8IG51bXNlY3RzOyBpKyspIHsKIAkJCXNlY3RzaXplW2ldID0gT1NlY3Rpb25TaXplW2ldOwpAQCAtMjI2NCw2ICsyMjgzLDcgQEAKIAljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKIC8qICAgICAgICAgICAgICBEQkdfTVNHICgic2xpY29zczogJXMgZGV2aWQ9PVNMSUNfMUdCX0RFVklDRV9JRCBzZWN0aW9uc1sleF1cbiIsCiAJCV9fZnVuY19fLCAodWludCkgTU51bVNlY3Rpb25zKTsgKi8KKwkJZmlsZSA9ICJzbGljX21vamF2ZS5iaW4iOwogCQludW1zZWN0cyA9IE1OdW1TZWN0aW9uczsKIAkJZm9yIChpID0gMDsgaSA8IG51bXNlY3RzOyBpKyspIHsKIAkJCXNlY3RzaXplW2ldID0gTVNlY3Rpb25TaXplW2ldOwpAQCAtMjI3NCwyNiArMjI5NCwzMyBAQAogCQlBU1NFUlQoMCk7CiAJCWJyZWFrOwogCX0KKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZSwgJmFkYXB0ZXItPnBjaWRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0xJQ09TUzogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgJXNcbiIsIGZpbGUpOworCQlyZXR1cm4gcmV0OworCX0KIAogCUFTU0VSVChudW1zZWN0cyA8PSAzKTsKIAogCWZvciAoc2VjdGlvbiA9IDA7IHNlY3Rpb24gPCBudW1zZWN0czsgc2VjdGlvbisrKSB7CiAJCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWQpIHsKIAkJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6Ci0JCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikgJk9hc2lzVUNvZGVbc2VjdGlvbl1bMF07CisJCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikoZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICoKKwkJCQkJCQkJc2VjdGlvbikpOwogCQkJYmFzZWFkZHJlc3MgPSBzZWN0c3RhcnRbc2VjdGlvbl07CiAJCQl0aGlzc2VjdGlvbnNpemUgPSBzZWN0c2l6ZVtzZWN0aW9uXSA+PiAzOwogCQkJbGFzdGluc3RydWN0ID0KLQkJCSAgICAodTMyICopICZPYXNpc1VDb2RlW3NlY3Rpb25dW3NlY3RzaXplW3NlY3Rpb25dIC0KLQkJCQkJCQkgICAgIDhdOworCQkJICAgICh1MzIgKikoZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICogc2VjdGlvbikgKworCQkJCQlzZWN0c2l6ZVtzZWN0aW9uXSAtIDgpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0xJQ18xR0JfREVWSUNFX0lEOgotCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopICZNb2phdmVVQ29kZVtzZWN0aW9uXVswXTsKKwkJCWluc3RydWN0aW9uID0gKHUzMiAqKShmdy0+ZGF0YSArIChTRUNUSU9OX1NJWkUgKgorCQkJCQkJCQlzZWN0aW9uKSk7CiAJCQliYXNlYWRkcmVzcyA9IHNlY3RzdGFydFtzZWN0aW9uXTsKIAkJCXRoaXNzZWN0aW9uc2l6ZSA9IHNlY3RzaXplW3NlY3Rpb25dID4+IDM7CiAJCQlsYXN0aW5zdHJ1Y3QgPQotCQkJICAgICh1MzIgKikgJk1vamF2ZVVDb2RlW3NlY3Rpb25dW3NlY3RzaXplW3NlY3Rpb25dCi0JCQkJCQkJICAgICAgLSA4XTsKKwkJCSAgICAodTMyICopKGZ3LT5kYXRhICsgKFNFQ1RJT05fU0laRSAqIHNlY3Rpb24pICsKKwkJCQkJc2VjdHNpemVbc2VjdGlvbl0gLSA4KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJQVNTRVJUKDApOwpAQCAtMjMyOSwxMCArMjM1NiwxMiBAQAogCWZvciAoc2VjdGlvbiA9IDA7IHNlY3Rpb24gPCBudW1zZWN0czsgc2VjdGlvbisrKSB7CiAJCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWQpIHsKIAkJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6Ci0JCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikmT2FzaXNVQ29kZVtzZWN0aW9uXVswXTsKKwkJCWluc3RydWN0aW9uID0gKHUzMiAqKWZ3LT5kYXRhICsgKFNFQ1RJT05fU0laRSAqCisJCQkJCQkJCXNlY3Rpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgU0xJQ18xR0JfREVWSUNFX0lEOgotCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopJk1vamF2ZVVDb2RlW3NlY3Rpb25dWzBdOworCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICoKKwkJCQkJCQkJc2VjdGlvbik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUFTU0VSVCgwKTsKQEAgLTIzNzQsMTMgKzI0MDMsMTMgQEAKIAkJCQkgICAgdGhpc3NlY3Rpb25zaXplWyV4XSBmYWlsdXJlWyV4XVxuIiwKIAkJCQkgICAgIF9fZnVuY19fLCBjb2RlYWRkciwgdGhpc3NlY3Rpb25zaXplLAogCQkJCSAgICAgZmFpbHVyZSk7Ci0KKwkJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJfQogCX0KIC8qICAgIERCR19NU0cgKCJzbGljb3NzOiBDb21wYXJlIGRvbmVcbiIpOyovCi0KKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkvKiBFdmVyeXRoaW5nIE9LLCBraWNrIG9mZiB0aGUgY2FyZCAqLwogCW1kZWxheSgxMCk7CiAJV1JJVEVfUkVHKHNsaWNfcmVncy0+c2xpY193Y3MsIFNMSUNfV0NTX1NUQVJULCBGTFVTSCk7CkBAIC0yODMyLDkgKzI4NjEsOCBAQAogCX0KIAlpZiAoIXBoeXNjYXJkKSB7CiAJCS8qIG5vIHN0cnVjdHVyZSBhbGxvY2F0ZWQgZm9yIHRoaXMgcGh5c2ljYWwgY2FyZCB5ZXQgKi8KLQkJcGh5c2NhcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGh5c2NhcmQgKiksIEdGUF9BVE9NSUMpOworCQlwaHlzY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwaHlzY2FyZCksIEdGUF9BVE9NSUMpOwogCQlBU1NFUlQocGh5c2NhcmQpOwotCQltZW1zZXQocGh5c2NhcmQsIDAsIHNpemVvZihzdHJ1Y3QgcGh5c2NhcmQgKikpOwogCiAJCURCR19NU0cKIAkJICAgICgiXG4lcyBBbGxvY2F0ZSBhIFBIWVNJQ0FMY2FyZDpcbiAgICBQSFlTSUNBTF9DYXJkWyVwXVxuXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL1JFQURNRQppbmRleCBkNTE0ZDE4Li5lNDJmMzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL1JFQURNRQpAQCAtMiw4ICsyLDYgQEAKIE5vbi1BY2NlbGVyYXRlZCAxMEdiZSBuZXR3b3JrIGRyaXZlci4KIAogVE9ETzoKLQktIGxpbmRlbnQgdGhlIGNvZGUKLQktIHJlbW92ZSB0eXBlZGVmcwogCS0gcmVtb3ZlIHdyYXBwZXJzCiAJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCiAJLSBuZXcgZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBjYXJkIG5lZWRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuYwppbmRleCA1MjcyYTE4Li4xZTBjZmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmMKQEAgLTgwLDEzICs4MCwxMyBAQAogI2luY2x1ZGUgInN4Z3BoeWNvZGUuaCIKICNpbmNsdWRlICJzYWhhcmFkYmdkb3dubG9hZC5oIgogCi1zdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9idWZmZXJfbWVtb3J5KHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBTaXplLAotCQkJCSAgICAgIFNYR19CVUZGRVJfVFlQRSBCdWZmZXJUeXBlKTsKLXN0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9yY3ZibG9ja19jb21wbGV0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCB2b2lkICpSY3ZCbG9jaywKK3N0YXRpYyBpbnQgc3hnX2FsbG9jYXRlX2J1ZmZlcl9tZW1vcnkoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIFNpemUsCisJCQkJICAgICAgZW51bSBTWEdfQlVGRkVSX1RZUEUgQnVmZmVyVHlwZSk7CitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfcmN2YmxvY2tfY29tcGxldGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdm9pZCAqUmN2QmxvY2ssCiAJCQkJCSAgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzLAogCQkJCQkgICB1MzIgTGVuZ3RoKTsKLXN0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkJCSAgICAgUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2wsCitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgICAgIHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgKlN4Z1NnbCwKIAkJCQkJICAgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcywKIAkJCQkJICAgICB1MzIgTGVuZ3RoKTsKIApAQCAtOTYsMTcgKzk2LDE3IEBACiBzdGF0aWMgaW50IHN4Z19lbnRyeV9oYWx0KHBfbmV0X2RldmljZSBkZXYpOwogc3RhdGljIGludCBzeGdfaW9jdGwocF9uZXRfZGV2aWNlIGRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CiBzdGF0aWMgaW50IHN4Z19zZW5kX3BhY2tldHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgcF9uZXRfZGV2aWNlIGRldik7Ci1zdGF0aWMgaW50IHN4Z190cmFuc21pdF9wYWNrZXQocF9hZGFwdGVyX3QgYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1zdGF0aWMgdm9pZCBzeGdfZHVtYl9zZ2woUFNDQVRURVJfR0FUSEVSX0xJU1QgcFNnbCwgUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2wpOworc3RhdGljIGludCBzeGdfdHJhbnNtaXRfcGFja2V0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3hnX2R1bWJfc2dsKHN0cnVjdCBTQ0FUVEVSX0dBVEhFUl9MSVNUICpwU2dsLCBzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSICpTeGdTZ2wpOwogCi1zdGF0aWMgdm9pZCBzeGdfaGFuZGxlX2ludGVycnVwdChwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyBpbnQgc3hnX3Byb2Nlc3NfaXNyKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBNZXNzYWdlSWQpOwotc3RhdGljIHUzMiBzeGdfcHJvY2Vzc19ldmVudF9xdWV1ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgUnNzSWQpOwotc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX3Nsb3dfc2VuZChwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc3hnX3Nsb3dfcmVjZWl2ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCBQU1hHX0VWRU5UIEV2ZW50KTsKLXN0YXRpYyB2b2lkIHN4Z19wcm9jZXNzX3Jjdl9lcnJvcihwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgRXJyb3JTdGF0dXMpOwotc3RhdGljIGJvb2wgc3hnX21hY19maWx0ZXIocF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCSAgIHBfZXRoZXJfaGVhZGVyIEV0aGVySGRyLCB1c2hvcnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIHN4Z19oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIGludCBzeGdfcHJvY2Vzc19pc3Ioc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIE1lc3NhZ2VJZCk7CitzdGF0aWMgdTMyIHN4Z19wcm9jZXNzX2V2ZW50X3F1ZXVlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBSc3NJZCk7CitzdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfc2xvd19zZW5kKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHN0cnVjdCBza19idWZmICpzeGdfc2xvd19yZWNlaXZlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBTWEdfRVZFTlQgKkV2ZW50KTsKK3N0YXRpYyB2b2lkIHN4Z19wcm9jZXNzX3Jjdl9lcnJvcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgRXJyb3JTdGF0dXMpOworc3RhdGljIGJvb2wgc3hnX21hY19maWx0ZXIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCSAgIHN0cnVjdCBldGhlcl9oZWFkZXIgKkV0aGVySGRyLCB1c2hvcnQgbGVuZ3RoKTsKIAogI2lmIFNMSUNfR0VUX1NUQVRTX0VOQUJMRUQKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3hnX2dldF9zdGF0cyhwX25ldF9kZXZpY2UgZGV2KTsKQEAgLTExOSwyMiArMTE5LDIyIEBACiBzdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X2xpc3QocF9uZXRfZGV2aWNlIGRldik7CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc3hnX2FkYXB0ZXJfc2V0X2h3YWRkcihwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKK3N0YXRpYyB2b2lkIHN4Z19hZGFwdGVyX3NldF9od2FkZHIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CiAKLXN0YXRpYyB2b2lkIHN4Z191bm1hcF9tbWlvX3NwYWNlKHBfYWRhcHRlcl90IGFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX3VubWFwX21taW9fc3BhY2Uoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CiAKLXN0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfYWRhcHRlcihwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN4Z19zdG9ja19yY3ZfYnVmZmVycyhwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9kZXNjcmlwdG9yX2Jsb2NrcyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX3N0b2NrX3Jjdl9idWZmZXJzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX2Rlc2NyaXB0b3JfYmxvY2tzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkJCSAgIHVuc2lnbmVkIGNoYXIgSW5kZXgpOwotc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9saW5rKHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIGludCBzeGdfcGh5X2luaXQocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzeGdfbGlua19ldmVudChwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyBTWEdfTElOS19TVEFURSBzeGdfZ2V0X2xpbmtfc3RhdGUocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzeGdfbGlua19zdGF0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpOwotc3RhdGljIGludCBzeGdfd3JpdGVfbWRpb19yZWcocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfbGluayhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgc3hnX3BoeV9pbml0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX2xpbmtfZXZlbnQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgZW51bSBTWEdfTElOS19TVEFURSBzeGdfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBzeGdfbGlua19zdGF0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBlbnVtIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZSk7CitzdGF0aWMgaW50IHN4Z193cml0ZV9tZGlvX3JlZyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJICAgICAgdTMyIERldkFkZHIsIHUzMiBSZWdBZGRyLCB1MzIgVmFsdWUpOwotc3RhdGljIGludCBzeGdfcmVhZF9tZGlvX3JlZyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIGludCBzeGdfcmVhZF9tZGlvX3JlZyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJICAgICB1MzIgRGV2QWRkciwgdTMyIFJlZ0FkZHIsIHUzMiAqcFZhbHVlKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBzeGdfZmlyc3RfaW5pdCA9IDE7CkBAIC0xNDUsNyArMTQ1LDcgQEAKIHN0YXRpYyBpbnQgZGVidWcgPSAtMTsKIHN0YXRpYyBwX25ldF9kZXZpY2UgaGVhZF9uZXRkZXZpY2UgPSBOVUxMOwogCi1zdGF0aWMgc3hnYmFzZV9kcml2ZXJfdCBzeGdfZ2xvYmFsID0geworc3RhdGljIHN0cnVjdCBzeGdiYXNlX2RyaXZlcl90IHN4Z19nbG9iYWwgPSB7CiAJLmR5bmFtaWNfaW50YWdnID0gMSwKIH07CiBzdGF0aWMgaW50IGludGFnZ19kZWxheSA9IDEwMDsKQEAgLTE4Niw3ICsxODYsNyBAQAogCQltYigpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3hnX3JlZzY0X3dyaXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHZvaWQgX19pb21lbSAqcmVnLAorc3RhdGljIGlubGluZSB2b2lkIHN4Z19yZWc2NF93cml0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB2b2lkIF9faW9tZW0gKnJlZywKIAkJCQkgICB1NjQgdmFsdWUsIHUzMiBjcHUpCiB7CiAJdTMyIHZhbHVlX2hpZ2ggPSAodTMyKSAodmFsdWUgPj4gMzIpOwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzeGdfZGJnX21hY2FkZHJzKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfZGJnX21hY2FkZHJzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJREJHX0VSUk9SKCIgICglcykgY3VyciAlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWFxuIiwKIAkJICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsIGFkYXB0ZXItPmN1cnJtYWNhZGRyWzBdLApAQCAtMjI1LDEyICsyMjUsMTIgQEAKIH0KIAogLyogU1hHIEdsb2JhbHMgKi8KLXN0YXRpYyBTWEdfRFJJVkVSIFN4Z0RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgU1hHX0RSSVZFUiBTeGdEcml2ZXI7CiAKICNpZmRlZiAgQVRLREJHCi1zdGF0aWMgc3hnX3RyYWNlX2J1ZmZlcl90IExTeGdUcmFjZUJ1ZmZlcjsKK3N0YXRpYyBzdHJ1Y3Qgc3hnX3RyYWNlX2J1ZmZlcl90IExTeGdUcmFjZUJ1ZmZlcjsKICNlbmRpZiAvKiBBVEtEQkcgKi8KLXN0YXRpYyBzeGdfdHJhY2VfYnVmZmVyX3QgKlN4Z1RyYWNlQnVmZmVyID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3hnX3RyYWNlX2J1ZmZlcl90ICpTeGdUcmFjZUJ1ZmZlciA9IE5VTEw7CiAKIC8qCiAgKiBzeGdfZG93bmxvYWRfbWljcm9jb2RlCkBAIC0yNDQsOSArMjQ0LDkgQEAKICAqIFJldHVybgogICoJaW50CiAgKi8KLXN0YXRpYyBib29sIHN4Z19kb3dubG9hZF9taWNyb2NvZGUocF9hZGFwdGVyX3QgYWRhcHRlciwgU1hHX1VDT0RFX1NFTCBVY29kZVNlbCkKK3N0YXRpYyBib29sIHN4Z19kb3dubG9hZF9taWNyb2NvZGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgZW51bSBTWEdfVUNPREVfU0VMIFVjb2RlU2VsKQogewotCVBTWEdfSFdfUkVHUyBId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CisJc3RydWN0IFNYR19IV19SRUdTICpId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CiAJdTMyIFNlY3Rpb247CiAJdTMyIFRoaXNTZWN0aW9uU2l6ZTsKIAl1MzIgKkluc3RydWN0aW9uID0gTlVMTDsKQEAgLTQxNiwxMyArNDE2LDEzIEBACiAgKiBSZXR1cm4KICAqCWludAogICovCi1zdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9yZXNvdXJjZXMocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyBpbnQgc3hnX2FsbG9jYXRlX3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCWludCBzdGF0dXM7CiAJdTMyIGk7CiAJdTMyIFJzc0lkcywgSXNyQ291bnQ7Ci0vKiAgICAgIFBTWEdfWE1UX1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtdFJpbmc7ICovCi0vKiAgICAgIFBTWEdfUkNWX1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJjdlJpbmc7ICovCisvKiAgICAgIHN0cnVjdCBTWEdfWE1UX1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpYbXRSaW5nOyAqLworLyogICAgICBzdHJ1Y3QgU1hHX1JDVl9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUmN2UmluZzsgKi8KIAogCURCR19FUlJPUigiJXMgRU5URVJcbiIsIF9fZnVuY19fKTsKIApAQCAtNDYxLDEzICs0NjEsMTMgQEAKIAogCWZvciAoOzspIHsKIAkJREJHX0VSUk9SKCIlcyBBbGxvY2F0ZSBYbXRSaW5ncyBzaXplWyV4XVxuIiwgX19mdW5jX18sCi0JCQkgICh1bnNpZ25lZCBpbnQpKHNpemVvZihTWEdfWE1UX1JJTkcpICogMSkpOworCQkJICAodW5zaWduZWQgaW50KShzaXplb2Yoc3RydWN0IFNYR19YTVRfUklORykgKiAxKSk7CiAKIAkJLyogU3RhcnQgd2l0aCBiaWcgaXRlbXMgZmlyc3QgLSByZWNlaXZlIGFuZCB0cmFuc21pdCByaW5ncy4gIEF0IHRoZSBtb21lbnQgKi8KIAkJLyogSSdtIGdvaW5nIHRvIGtlZXAgdGhlIHJpbmcgc2l6ZSBmaXhlZCBhbmQgYWRqdXN0IHRoZSBudW1iZXIgb2YgKi8KIAkJLyogVENCcyBpZiB3ZSBmYWlsLiAgTGF0ZXIgd2UgbWlnaHQgY29uc2lkZXIgcmVkdWNpbmcgdGhlIHJpbmcgc2l6ZSBhcyB3ZWxsLi4gKi8KIAkJYWRhcHRlci0+WG10UmluZ3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCQkJIHNpemVvZihTWEdfWE1UX1JJTkcpICoKKwkJCQkJCQkgc2l6ZW9mKHN0cnVjdCBTWEdfWE1UX1JJTkcpICoKIAkJCQkJCQkgMSwKIAkJCQkJCQkgJmFkYXB0ZXItPlBYbXRSaW5ncyk7CiAJCURCR19FUlJPUigiJXMgWG10UmluZ3NbJXBdXG4iLCBfX2Z1bmNfXywgYWRhcHRlci0+WG10UmluZ3MpOwpAQCAtNDc1LDMzICs0NzUsMzMgQEAKIAkJaWYgKCFhZGFwdGVyLT5YbXRSaW5ncykgewogCQkJZ290byBwZXJfdGNiX2FsbG9jYXRpb25fZmFpbGVkOwogCQl9Ci0JCW1lbXNldChhZGFwdGVyLT5YbXRSaW5ncywgMCwgc2l6ZW9mKFNYR19YTVRfUklORykgKiAxKTsKKwkJbWVtc2V0KGFkYXB0ZXItPlhtdFJpbmdzLCAwLCBzaXplb2Yoc3RydWN0IFNYR19YTVRfUklORykgKiAxKTsKIAogCQlEQkdfRVJST1IoIiVzIEFsbG9jYXRlIFJjdlJpbmdzIHNpemVbJXhdXG4iLCBfX2Z1bmNfXywKLQkJCSAgKHVuc2lnbmVkIGludCkoc2l6ZW9mKFNYR19SQ1ZfUklORykgKiAxKSk7CisJCQkgICh1bnNpZ25lZCBpbnQpKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9SSU5HKSAqIDEpKTsKIAkJYWRhcHRlci0+UmN2UmluZ3MgPQogCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCQkgc2l6ZW9mKFNYR19SQ1ZfUklORykgKiAxLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX1JJTkcpICogMSwKIAkJCQkJICZhZGFwdGVyLT5QUmN2UmluZ3MpOwogCQlEQkdfRVJST1IoIiVzIFJjdlJpbmdzWyVwXVxuIiwgX19mdW5jX18sIGFkYXB0ZXItPlJjdlJpbmdzKTsKIAkJaWYgKCFhZGFwdGVyLT5SY3ZSaW5ncykgewogCQkJZ290byBwZXJfdGNiX2FsbG9jYXRpb25fZmFpbGVkOwogCQl9Ci0JCW1lbXNldChhZGFwdGVyLT5SY3ZSaW5ncywgMCwgc2l6ZW9mKFNYR19SQ1ZfUklORykgKiAxKTsKKwkJbWVtc2V0KGFkYXB0ZXItPlJjdlJpbmdzLCAwLCBzaXplb2Yoc3RydWN0IFNYR19SQ1ZfUklORykgKiAxKTsKIAkJYnJlYWs7CiAKIAkgICAgICBwZXJfdGNiX2FsbG9jYXRpb25fZmFpbGVkOgogCQkvKiBhbiBhbGxvY2F0aW9uIGZhaWxlZC4gIEZyZWUgYW55IHN1Y2Nlc3NmdWwgYWxsb2NhdGlvbnMuICovCiAJCWlmIChhZGFwdGVyLT5YbXRSaW5ncykgewogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCSAgICBzaXplb2YoU1hHX1hNVF9SSU5HKSAqIDQwOTYsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IFNYR19YTVRfUklORykgKiA0MDk2LAogCQkJCQkgICAgYWRhcHRlci0+WG10UmluZ3MsCiAJCQkJCSAgICBhZGFwdGVyLT5QWG10UmluZ3MpOwogCQkJYWRhcHRlci0+WG10UmluZ3MgPSBOVUxMOwogCQl9CiAJCWlmIChhZGFwdGVyLT5SY3ZSaW5ncykgewogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCSAgICBzaXplb2YoU1hHX1JDVl9SSU5HKSAqIDQwOTYsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IFNYR19SQ1ZfUklORykgKiA0MDk2LAogCQkJCQkgICAgYWRhcHRlci0+UmN2UmluZ3MsCiAJCQkJCSAgICBhZGFwdGVyLT5QUmN2UmluZ3MpOwogCQkJYWRhcHRlci0+UmN2UmluZ3MgPSBOVUxMOwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJLyogU2FuaXR5IGNoZWNrIHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmUgZm9ybWF0ICovCiAJQVNTRVJUKChhZGFwdGVyLT5SZWNlaXZlQnVmZmVyU2l6ZSA9PSBTWEdfUkNWX0RBVEFfQlVGRkVSX1NJWkUpIHx8CiAJICAgICAgIChhZGFwdGVyLT5SZWNlaXZlQnVmZmVyU2l6ZSA9PSBTWEdfUkNWX0pVTUJPX0JVRkZFUl9TSVpFKSk7Ci0JQVNTRVJUKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spID09CisJQVNTRVJUKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSA9PQogCSAgICAgICBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfU0laRSk7CiAKIAkvKiBBbGxvY2F0ZSByZWNlaXZlIGRhdGEgYnVmZmVycy4gIFdlIGFsbG9jYXRlIGEgYmxvY2sgb2YgYnVmZmVycyBhbmQgKi8KQEAgLTUzOSwxMSArNTM5LDExIEBACiAJfQogCiAJREJHX0VSUk9SKCIlcyBBbGxvY2F0ZSBFdmVudFJpbmdzIHNpemVbJXhdXG4iLCBfX2Z1bmNfXywKLQkJICAodW5zaWduZWQgaW50KShzaXplb2YoU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzKSk7CisJCSAgKHVuc2lnbmVkIGludCkoc2l6ZW9mKHN0cnVjdCBTWEdfRVZFTlRfUklORykgKiBSc3NJZHMpKTsKIAogCS8qIEFsbG9jYXRlIGV2ZW50IHF1ZXVlcy4gKi8KIAlhZGFwdGVyLT5FdmVudFJpbmdzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCQkJICAgc2l6ZW9mKFNYR19FVkVOVF9SSU5HKSAqCisJCQkJCQkgICBzaXplb2Yoc3RydWN0IFNYR19FVkVOVF9SSU5HKSAqCiAJCQkJCQkgICBSc3NJZHMsCiAJCQkJCQkgICAmYWRhcHRlci0+UEV2ZW50UmluZ3MpOwogCkBAIC01NTQsNyArNTU0LDcgQEAKIAkJc3RhdHVzID0gU1RBVFVTX1JFU09VUkNFUzsKIAkJZ290byBwZXJfdGNiX2FsbG9jYXRpb25fZmFpbGVkOwogCX0KLQltZW1zZXQoYWRhcHRlci0+RXZlbnRSaW5ncywgMCwgc2l6ZW9mKFNYR19FVkVOVF9SSU5HKSAqIFJzc0lkcyk7CisJbWVtc2V0KGFkYXB0ZXItPkV2ZW50UmluZ3MsIDAsIHNpemVvZihzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzKTsKIAogCURCR19FUlJPUigiJXMgQWxsb2NhdGUgSVNSIHNpemVbJXhdXG4iLCBfX2Z1bmNfXywgSXNyQ291bnQpOwogCS8qIEFsbG9jYXRlIElTUiAqLwpAQCAtNjI4LDcgKzYyOCw3IEBACiAJc3RhdGljIGludCBkaWRfdmVyc2lvbiA9IDA7CiAJaW50IGVycjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCXBfYWRhcHRlcl90IGFkYXB0ZXI7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcjsKIAl2b2lkIF9faW9tZW0gKm1lbW1hcHBlZF9pb2FkZHI7CiAJdTMyIHN0YXR1cyA9IDA7CiAJdWxvbmcgbW1pb19zdGFydCA9IDA7CkBAIC02ODEsNyArNjgxLDcgQEAKIAlwY2lfc2V0X21hc3RlcihwY2lkZXYpOwogCiAJREJHX0VSUk9SKCJjYWxsIGFsbG9jX2V0aGVyZGV2XG4iKTsKLQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoYWRhcHRlcl90KSk7CisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhZGFwdGVyX3QpKTsKIAlpZiAoIW5ldGRldikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXRfZXhpdF9zeGdfcHJvYmU7CkBAIC04NzEsNyArODcxLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lLgogICovCi1zdGF0aWMgdm9pZCBzeGdfZGlzYWJsZV9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkRpc0ludHIiLAogCQkgIGFkYXB0ZXIsIGFkYXB0ZXItPkludGVycnVwdHNFbmFibGVkLCAwLCAwKTsKQEAgLTkwMiw3ICs5MDIsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogCU5vbmUuCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19lbmFibGVfaW50ZXJydXB0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkVuSW50ciIsCiAJCSAgYWRhcHRlciwgYWRhcHRlci0+SW50ZXJydXB0c0VuYWJsZWQsIDAsIDApOwpAQCAtOTM1LDcgKzkzNSw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3hnX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJcF9uZXRfZGV2aWNlIGRldiA9IChwX25ldF9kZXZpY2UpIGRldl9pZDsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogLyogICAgICB1MzIgICAgICAgICAgICAgICAgIENwdU1hc2sgPSAwLCBpOyAqLwogCiAJYWRhcHRlci0+U3RhdHMuTnVtSW50cysrOwpAQCAtOTYzLDggKzk2Myw4IEBACiAJCWZvciAoaSA9IDA7CiAJCSAgICAgaSA8IGFkYXB0ZXItPlJzc1N5c3RlbUluZm8tPlByb2Nlc3NvckluZm8uUnNzQ3B1Q291bnQ7CiAJCSAgICAgaSsrKSB7Ci0JCQlQU1hHX0VWRU5UX1JJTkcgRXZlbnRSaW5nID0gJmFkYXB0ZXItPkV2ZW50UmluZ3NbaV07Ci0JCQlQU1hHX0VWRU5UIEV2ZW50ID0KKwkJCXN0cnVjdCBYR19FVkVOVF9SSU5HICpFdmVudFJpbmcgPSAmYWRhcHRlci0+RXZlbnRSaW5nc1tpXTsKKwkJCXN0cnVjdCBTWEdfRVZFTlQgKkV2ZW50ID0KIAkJCSAgICAmRXZlbnRSaW5nLT5SaW5nW2FkYXB0ZXItPk5leHRFdmVudFtpXV07CiAJCQl1bnNpZ25lZCBjaGFyIENwdSA9CiAJCQkgICAgYWRhcHRlci0+UnNzU3lzdGVtSW5mby0+UnNzSWRUb0NwdVtpXTsKQEAgLTk5Miw3ICs5OTIsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgc3hnX2hhbmRsZV9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAvKiAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICBSc3NJZCAgID0gMDsgKi8KIAl1MzIgTmV3SXNyOwpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lCiAgKi8KLXN0YXRpYyBpbnQgc3hnX3Byb2Nlc3NfaXNyKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBNZXNzYWdlSWQpCitzdGF0aWMgaW50IHN4Z19wcm9jZXNzX2lzcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgTWVzc2FnZUlkKQogewogCXUzMiBJc3IgPSBhZGFwdGVyLT5Jc3JDb3B5W01lc3NhZ2VJZF07CiAJdTMyIE5ld0lzciA9IDA7CkBAIC0xMTUzLDEwICsxMTUzLDEwIEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJTm9uZS4KICAqLwotc3RhdGljIHUzMiBzeGdfcHJvY2Vzc19ldmVudF9xdWV1ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgUnNzSWQpCitzdGF0aWMgdTMyIHN4Z19wcm9jZXNzX2V2ZW50X3F1ZXVlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBSc3NJZCkKIHsKLQlQU1hHX0VWRU5UX1JJTkcgRXZlbnRSaW5nID0gJmFkYXB0ZXItPkV2ZW50UmluZ3NbUnNzSWRdOwotCVBTWEdfRVZFTlQgRXZlbnQgPSAmRXZlbnRSaW5nLT5SaW5nW2FkYXB0ZXItPk5leHRFdmVudFtSc3NJZF1dOworCXN0cnVjdCBTWEdfRVZFTlRfUklORyAqRXZlbnRSaW5nID0gJmFkYXB0ZXItPkV2ZW50UmluZ3NbUnNzSWRdOworCXN0cnVjdCBTWEdfRVZFTlQgKkV2ZW50ID0gJkV2ZW50UmluZy0+UmluZ1thZGFwdGVyLT5OZXh0RXZlbnRbUnNzSWRdXTsKIAl1MzIgRXZlbnRzUHJvY2Vzc2VkID0gMCwgQmF0Y2hlcyA9IDA7CiAJdTMyIG51bV9za2JzID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqcHJldl9za2IgPSBOVUxMOwogCXN0cnVjdCBza19idWZmICpJbmRpY2F0aW9uTGlzdFtTWEdfUkNWX0FSUkFZU0laRV07CiAJdTMyIEluZGV4OwotCVBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBSY3ZEYXRhQnVmZmVySGRyOworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKICNlbmRpZgogCXUzMiBSZXR1cm5TdGF0dXMgPSAwOwogCkBAIC0xMjkzLDEyICsxMjkzLDEyIEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX3Nsb3dfc2VuZChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX3Nsb3dfc2VuZChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewotCVBTWEdfWE1UX1JJTkcgWG10UmluZyA9ICZhZGFwdGVyLT5YbXRSaW5nc1swXTsKLQlQU1hHX1JJTkdfSU5GTyBYbXRSaW5nSW5mbyA9ICZhZGFwdGVyLT5YbXRSaW5nWmVyb0luZm87CisJc3RydWN0IFNYR19YTVRfUklORyAqWG10UmluZyA9ICZhZGFwdGVyLT5YbXRSaW5nc1swXTsKKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTyAqWG10UmluZ0luZm8gPSAmYWRhcHRlci0+WG10UmluZ1plcm9JbmZvOwogCXUzMiAqQ29udGV4dFR5cGU7Ci0JUFNYR19DTUQgWG10Q21kOworCXN0cnVjdCBTWEdfQ01EICpYbXRDbWQ7CiAKIAkvKiBOT1RFIC0gVGhpcyBsb2NrIGlzIGRyb3BwZWQgYW5kIHJlZ3JhYmJlZCBpbiB0aGlzIGxvb3AuICovCiAJLyogVGhpcyBtZWFucyB0d28gZGlmZmVyZW50IHByb2Nlc3NvcnMgY2FuIGJvdGggYmUgcnVubmluZyAqLwpAQCAtMTM1OSwxMiArMTM1OSwxMiBAQAogICogUmV0dXJuCiAgKgkgc2tiCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc3hnX3Nsb3dfcmVjZWl2ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCBQU1hHX0VWRU5UIEV2ZW50KQorc3RhdGljIHN0cnVjdCBza19idWZmICpzeGdfc2xvd19yZWNlaXZlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBTWEdfRVZFTlQgKkV2ZW50KQogewotCVBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBSY3ZEYXRhQnVmZmVySGRyOworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqUGFja2V0OwogCi0JUmN2RGF0YUJ1ZmZlckhkciA9IChQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIpIEV2ZW50LT5Ib3N0SGFuZGxlOworCVJjdkRhdGFCdWZmZXJIZHIgPSAoc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKikgRXZlbnQtPkhvc3RIYW5kbGU7CiAJQVNTRVJUKFJjdkRhdGFCdWZmZXJIZHIpOwogCUFTU0VSVChSY3ZEYXRhQnVmZmVySGRyLT5TdGF0ZSA9PSBTWEdfQlVGRkVSX09OQ0FSRCk7CiAJQVNTRVJUKFNYR19SRUNFSVZFX0RBVEFfTE9DQVRJT04oUmN2RGF0YUJ1ZmZlckhkcikgPT0KQEAgLTE0MDAsNyArMTQwMCw3IEBACiAJfQogI2lmIFhYWFRPRE8JCQkvKiBWTEFOIHN0dWZmICovCiAJLyogSWYgdGhlcmUncyBhIFZMQU4gdGFnLCBleHRyYWN0IGl0IGFuZCB2YWxpZGF0ZSBpdCAqLwotCWlmICgoKHBfZXRoZXJfaGVhZGVyKSAoU1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTihSY3ZEYXRhQnVmZmVySGRyKSkpLT4KKwlpZiAoKChzdHJ1Y3QgZXRoZXJfaGVhZGVyKikgKFNYR19SRUNFSVZFX0RBVEFfTE9DQVRJT04oUmN2RGF0YUJ1ZmZlckhkcikpKS0+CiAJICAgIEV0aGVyVHlwZSA9PSBFVEhFUlRZUEVfVkxBTikgewogCQlpZiAoU3hnRXh0cmFjdFZsYW5IZWFkZXIoYWRhcHRlciwgUmN2RGF0YUJ1ZmZlckhkciwgRXZlbnQpICE9CiAJCSAgICBTVEFUVVNfU1VDQ0VTUykgewpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKIAkvKiAqLwogCS8qIER1bWItbmljIGZyYW1lLiAgU2VlIGlmIGl0IHBhc3NlcyBvdXIgbWFjIGZpbHRlciBhbmQgdXBkYXRlIHN0YXRzICovCiAJLyogKi8KLQlpZiAoIXN4Z19tYWNfZmlsdGVyKGFkYXB0ZXIsIChwX2V0aGVyX2hlYWRlcikKKwlpZiAoIXN4Z19tYWNfZmlsdGVyKGFkYXB0ZXIsIChzdHJ1Y3QgZXRoZXJfaGVhZGVyKikKIAkJCSAgICBTWEdfUkVDRUlWRV9EQVRBX0xPQ0FUSU9OKFJjdkRhdGFCdWZmZXJIZHIpLAogCQkJICAgIEV2ZW50LT5MZW5ndGgpKSB7CiAJCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIlJjdkZpbHRyIiwKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJTm9uZQogICovCi1zdGF0aWMgdm9pZCBzeGdfcHJvY2Vzc19yY3ZfZXJyb3IocF9hZGFwdGVyX3QgYWRhcHRlciwgdTMyIEVycm9yU3RhdHVzKQorc3RhdGljIHZvaWQgc3hnX3Byb2Nlc3NfcmN2X2Vycm9yKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBFcnJvclN0YXR1cykKIHsKIAl1MzIgRXJyb3I7CiAKQEAgLTE1MzUsNyArMTUzNSw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJVFJVRSBpZiB0aGUgZnJhbWUgaXMgdG8gYmUgYWxsb3dlZAogICovCi1zdGF0aWMgYm9vbCBzeGdfbWFjX2ZpbHRlcihwX2FkYXB0ZXJfdCBhZGFwdGVyLCBwX2V0aGVyX2hlYWRlciBFdGhlckhkciwKK3N0YXRpYyBib29sIHN4Z19tYWNfZmlsdGVyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBldGhlcl9oZWFkZXIgKkV0aGVySGRyLAogCQkJICAgdXNob3J0IGxlbmd0aCkKIHsKIAlib29sIEVxdWFsQWRkcjsKQEAgLTE1NjAsNyArMTU2MCw3IEBACiAJCQkJcmV0dXJuIChUUlVFKTsKIAkJCX0KIAkJCWlmIChhZGFwdGVyLT5NYWNGaWx0ZXIgJiBNQUNfTUNBU1QpIHsKLQkJCQlQU1hHX01VTFRJQ0FTVF9BRERSRVNTIE11bHRpY2FzdEFkZHJzID0KKwkJCQlzdHJ1Y3QgU1hHX01VTFRJQ0FTVF9BRERSRVNTICpNdWx0aWNhc3RBZGRycyA9CiAJCQkJICAgIGFkYXB0ZXItPk11bHRpY2FzdEFkZHJzOwogCQkJCXdoaWxlIChNdWx0aWNhc3RBZGRycykgewogCQkJCQlFVEhFUl9FUV9BRERSKE11bHRpY2FzdEFkZHJzLT5BZGRyZXNzLApAQCAtMTYwMCw3ICsxNjAwLDcgQEAKIAlyZXR1cm4gKEZBTFNFKTsKIH0KIAotc3RhdGljIGludCBzeGdfcmVnaXN0ZXJfaW50ZXJydXB0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19yZWdpc3Rlcl9pbnRlcnJ1cHQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlpZiAoIWFkYXB0ZXItPmludHJyZWdpc3RlcmVkKSB7CiAJCWludCByZXR2YWw7CkBAIC0xNjM1LDcgKzE2MzUsNyBAQAogCXJldHVybiAoU1RBVFVTX1NVQ0NFU1MpOwogfQogCi1zdGF0aWMgdm9pZCBzeGdfZGVyZWdpc3Rlcl9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19kZXJlZ2lzdGVyX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCURCR19FUlJPUigic3hnOiAlcyBFTlRFUiBhZGFwdGVyWyVwXVxuIiwgX19mdW5jX18sIGFkYXB0ZXIpOwogI2lmIFhYWFRPRE8KQEAgLTE2NjEsNyArMTY2MSw3IEBACiAgKiAgUGVyZm9ybSBpbml0aWFsaXphdGlvbiBvZiBvdXIgc2xpYyBpbnRlcmZhY2UuCiAgKgogICovCi1zdGF0aWMgaW50IHN4Z19pZl9pbml0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19pZl9pbml0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJcF9uZXRfZGV2aWNlIGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTE3MjEsNyArMTcyMSw3IEBACiAKIHN0YXRpYyBpbnQgc3hnX2VudHJ5X29wZW4ocF9uZXRfZGV2aWNlIGRldikKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBzdGF0dXM7CiAKIAlBU1NFUlQoYWRhcHRlcik7CkBAIC0xNzc3LDcgKzE3NzcsNyBAQAogCXBfbmV0X2RldmljZSBkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKIAl1MzIgbW1pb19zdGFydCA9IDA7CiAJdW5zaWduZWQgaW50IG1taW9fbGVuID0gMDsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCiAJQVNTRVJUKGFkYXB0ZXIpOwogCURCR19FUlJPUigic3hnOiAlcyBFTlRFUiBkZXZbJXBdIGFkYXB0ZXJbJXBdXG4iLCBfX2Z1bmNfXywgZGV2LApAQCAtMTgwNSw3ICsxODA1LDcgQEAKIAogc3RhdGljIGludCBzeGdfZW50cnlfaGFsdChwX25ldF9kZXZpY2UgZGV2KQogewotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3hnX2dsb2JhbC5kcml2ZXJfbG9jaywgc3hnX2dsb2JhbC5mbGFncyk7CiAJREJHX0VSUk9SKCJzeGc6ICVzICglcykgRU5URVJcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpOwpAQCAtMTgzMCw3ICsxODMwLDcgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ1NMSUNTRVRJTlRBR0c6CiAJCXsKLS8qICAgICAgICAgICAgICAgICAgICAgIHBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7ICovCisvKiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsgKi8KIAkJCXUzMiBkYXRhWzddOwogCQkJdTMyIGludGFnZzsKIApAQCAtMTg2OCw3ICsxODY4LDcgQEAKICAqLwogc3RhdGljIGludCBzeGdfc2VuZF9wYWNrZXRzKHN0cnVjdCBza19idWZmICpza2IsIHBfbmV0X2RldmljZSBkZXYpCiB7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAKIAlEQkdfRVJST1IoInN4ZzogJXMgRU5URVIgc3hnX3NlbmRfcGFja2V0cyBza2JbJXBdXG4iLCBfX2Z1bmNfXywKQEAgLTE5MzQsMTAgKzE5MzQsMTAgQEAKICAqIFJldHVybiAtCiAgKiAJCVNUQVRVUyBvZiBzZW5kCiAgKi8KLXN0YXRpYyBpbnQgc3hnX3RyYW5zbWl0X3BhY2tldChwX2FkYXB0ZXJfdCBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBzeGdfdHJhbnNtaXRfcGFja2V0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JUFNDQVRURVJfR0FUSEVSX0xJU1QgcFNnbDsKLQlQU1hHX1NDQVRURVJfR0FUSEVSIFN4Z1NnbDsKKwlzdHJ1Y3QgU0NBVFRFUl9HQVRIRVJfTElTVCAqcFNnbDsKKwlzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSICpTeGdTZ2w7CiAJdm9pZCAqU2dsQnVmZmVyOwogCXUzMiBTZ2xCdWZmZXJMZW5ndGg7CiAKQEAgLTE5ODAsMTQgKzE5ODAsMTQgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lLgogICovCi1zdGF0aWMgdm9pZCBzeGdfZHVtYl9zZ2woUFNDQVRURVJfR0FUSEVSX0xJU1QgcFNnbCwgUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2wpCitzdGF0aWMgdm9pZCBzeGdfZHVtYl9zZ2woc3RydWN0IFNDQVRURVJfR0FUSEVSX0xJU1QgKnBTZ2wsIHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgKlN4Z1NnbCkKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gU3hnU2dsLT5hZGFwdGVyOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSBTeGdTZ2wtPmFkYXB0ZXI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IFN4Z1NnbC0+RHVtYlBhY2tldDsKIAkvKiBGb3Igbm93LCBhbGwgZHVtYi1uaWMgc2VuZHMgZ28gb24gUlNTIHF1ZXVlIHplcm8gKi8KLQlQU1hHX1hNVF9SSU5HIFhtdFJpbmcgPSAmYWRhcHRlci0+WG10UmluZ3NbMF07Ci0JUFNYR19SSU5HX0lORk8gWG10UmluZ0luZm8gPSAmYWRhcHRlci0+WG10UmluZ1plcm9JbmZvOwotCVBTWEdfQ01EIFhtdENtZCA9IE5VTEw7CisJc3RydWN0IFNYR19YTVRfUklORyAqWG10UmluZyA9ICZhZGFwdGVyLT5YbXRSaW5nc1swXTsKKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTyAqWG10UmluZ0luZm8gPSAmYWRhcHRlci0+WG10UmluZ1plcm9JbmZvOworCXN0cnVjdCBTWEdfQ01EICpYbXRDbWQgPSBOVUxMOwogLyogICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggPSAwOyAqLwogCXUzMiBEYXRhTGVuZ3RoID0gc2tiLT5sZW47CiAvKiAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZMZW47ICovCkBAIC0yMTE3LDkgKzIxMTcsOSBAQAogICogUmV0dXJuCiAgKglzdGF0dXMKICAqLwotc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9saW5rKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2xpbmsoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlQU1hHX0hXX1JFR1MgSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOworCXN0cnVjdCBTWEdfSFdfUkVHUyAqSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOwogCXUzMiBWYWx1ZTsKIAl1MzIgQ29uZmlnRGF0YTsKIAl1MzIgTWF4RnJhbWU7CkBAIC0yMjc0LDEwICsyMjc0LDEwIEBACiAgKiBSZXR1cm4KICAqCXN0YXR1cwogICovCi1zdGF0aWMgaW50IHN4Z19waHlfaW5pdChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIGludCBzeGdfcGh5X2luaXQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAl1MzIgVmFsdWU7Ci0JUFBIWV9VQ09ERSBwOworCXN0cnVjdCBQSFlfVUNPREUgKnA7CiAJaW50IHN0YXR1czsKIAogCURCR19FUlJPUigiRU5URVIgJXNcbiIsIF9fZnVuY19fKTsKQEAgLTIzMjIsMTAgKzIzMjIsMTAgQEAKICAqIFJldHVybgogICoJTm9uZQogICovCi1zdGF0aWMgdm9pZCBzeGdfbGlua19ldmVudChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2xpbmtfZXZlbnQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlQU1hHX0hXX1JFR1MgSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOwotCVNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZTsKKwlzdHJ1Y3QgU1hHX0hXX1JFR1MgKkh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKKwllbnVtIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZTsKIAlpbnQgc3RhdHVzOwogCXUzMiBWYWx1ZTsKIApAQCAtMjM3OSw3ICsyMzc5LDcgQEAKICAqIFJldHVybgogICoJTGluayBTdGF0ZQogICovCi1zdGF0aWMgU1hHX0xJTktfU1RBVEUgc3hnX2dldF9saW5rX3N0YXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgZW51bSBTWEdfTElOS19TVEFURSBzeGdfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlpbnQgc3RhdHVzOwogCXUzMiBWYWx1ZTsKQEAgLTI0MzMsOCArMjQzMyw4IEBACiAJcmV0dXJuIChTWEdfTElOS19ET1dOKTsKIH0KIAotc3RhdGljIHZvaWQgc3hnX2luZGljYXRlX2xpbmtfc3RhdGUocF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCQkgICAgU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlKQorc3RhdGljIHZvaWQgc3hnX2luZGljYXRlX2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgZW51bSBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpCiB7CiAJaWYgKGFkYXB0ZXItPkxpbmtTdGF0ZSA9PSBTWEdfTElOS19VUCkgewogCQlEQkdfRVJST1IoIiVzOiBMSU5LIG5vdyBVUCwgY2FsbCBuZXRpZl9zdGFydF9xdWV1ZVxuIiwKQEAgLTI0NjAsNyArMjQ2MCw3IEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX2xpbmtfc3RhdGUocF9hZGFwdGVyX3QgYWRhcHRlciwgU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlKQorc3RhdGljIHZvaWQgc3hnX2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgZW51bSBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpCiB7CiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX0lNUE9SVEFOVCwgIkxua0lORENUIiwKIAkJICBhZGFwdGVyLCBMaW5rU3RhdGUsIGFkYXB0ZXItPkxpbmtTdGF0ZSwgYWRhcHRlci0+U3RhdGUpOwpAQCAtMjQ5OCwxMCArMjQ5OCwxMCBAQAogICogUmV0dXJuCiAgKglzdGF0dXMKICAqLwotc3RhdGljIGludCBzeGdfd3JpdGVfbWRpb19yZWcocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyBpbnQgc3hnX3dyaXRlX21kaW9fcmVnKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkgICAgICB1MzIgRGV2QWRkciwgdTMyIFJlZ0FkZHIsIHUzMiBWYWx1ZSkKIHsKLQlQU1hHX0hXX1JFR1MgSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOworCXN0cnVjdCBTWEdfSFdfUkVHUyAqSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOwogCXUzMiBBZGRyT3A7CQkvKiBBZGRyZXNzIG9wZXJhdGlvbiAod3JpdHRlbiB0byBNSUlNIGZpZWxkIHJlZykgKi8KIAl1MzIgV3JpdGVPcDsJCS8qIFdyaXRlIG9wZXJhdGlvbiAod3JpdHRlbiB0byBNSUlNIGZpZWxkIHJlZykgKi8KIAl1MzIgQ21kOwkJLyogQ29tbWFuZCAod3JpdHRlbiB0byBNSUlNIGNvbW1hbmQgcmVnKSAqLwpAQCAtMjU4OCwxMCArMjU4OCwxMCBAQAogICogUmV0dXJuCiAgKglzdGF0dXMKICAqLwotc3RhdGljIGludCBzeGdfcmVhZF9tZGlvX3JlZyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIGludCBzeGdfcmVhZF9tZGlvX3JlZyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJICAgICB1MzIgRGV2QWRkciwgdTMyIFJlZ0FkZHIsIHUzMiAqcFZhbHVlKQogewotCVBTWEdfSFdfUkVHUyBId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CisJc3RydWN0IFNYR19IV19SRUdTICpId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CiAJdTMyIEFkZHJPcDsJCS8qIEFkZHJlc3Mgb3BlcmF0aW9uICh3cml0dGVuIHRvIE1JSU0gZmllbGQgcmVnKSAqLwogCXUzMiBSZWFkT3A7CQkvKiBSZWFkIG9wZXJhdGlvbiAod3JpdHRlbiB0byBNSUlNIGZpZWxkIHJlZykgKi8KIAl1MzIgQ21kOwkJLyogQ29tbWFuZCAod3JpdHRlbiB0byBNSUlNIGNvbW1hbmQgcmVnKSAqLwpAQCAtMjczNSw5ICsyNzM1LDkgQEAKIAlyZXR1cm4gKG1hY2hhc2gpOwogfQogCi1zdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X21hc2socF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19tY2FzdF9zZXRfbWFzayhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewotCVBTWEdfVUNPREVfUkVHUyBzeGdfcmVncyA9IGFkYXB0ZXItPlVjb2RlUmVnczsKKwlzdHJ1Y3QgU1hHX1VDT0RFX1JFR1MgKnN4Z19yZWdzID0gYWRhcHRlci0+VWNvZGVSZWdzOwogCiAJREJHX0VSUk9SKCIlcyBFTlRFUiAoJXMpIG1hY29wdHNbJXhdIG1hc2tbJWxseF1cbiIsIF9fZnVuY19fLAogCQkgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgKHVuc2lnbmVkIGludClhZGFwdGVyLT5NYWNGaWx0ZXIsCkBAIC0yNzc1LDcgKzI3NzUsNyBAQAogICogIEFsbG9jYXRlIGEgbWNhc3RfYWRkcmVzcyBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgbXVsdGljYXN0IGFkZHJlc3MuCiAgKiAgTGluayBpdCBpbi4KICAqLwotc3RhdGljIGludCBzeGdfbWNhc3RfYWRkX2xpc3QocF9hZGFwdGVyX3QgYWRhcHRlciwgY2hhciAqYWRkcmVzcykKK3N0YXRpYyBpbnQgc3hnX21jYXN0X2FkZF9saXN0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIGNoYXIgKmFkZHJlc3MpCiB7CiAJcF9tY2FzdF9hZGRyZXNzX3QgbWNhZGRyLCBtbGlzdDsKIAlib29sIGVxdWFsYWRkcjsKQEAgLTI4MDMsNyArMjgwMyw3IEBACiAJcmV0dXJuIChTVEFUVVNfU1VDQ0VTUyk7CiB9CiAKLXN0YXRpYyB2b2lkIHN4Z19tY2FzdF9zZXRfYml0KHBfYWRhcHRlcl90IGFkYXB0ZXIsIGNoYXIgKmFkZHJlc3MpCitzdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X2JpdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBjaGFyICphZGRyZXNzKQogewogCXVuc2lnbmVkIGNoYXIgY3JjcG9seTsKIApAQCAtMjgyMSw3ICsyODIxLDcgQEAKIAogc3RhdGljIHZvaWQgc3hnX21jYXN0X3NldF9saXN0KHBfbmV0X2RldmljZSBkZXYpCiB7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJaW50IGk7CiAJY2hhciAqYWRkcmVzc2VzOwpAQCAtMjg3Niw3ICsyODc2LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBzeGdfdW5tYXBfbW1pb19zcGFjZShwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX3VubWFwX21taW9fc3BhY2Uoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKICNpZiBMSU5VWF9GUkVFU19BREFQVEVSX1JFU09VUkNFUwogLyogICAgICBpZiAoYWRhcHRlci0+UmVncykgeyAqLwpAQCAtMjg5Niw3ICsyODk2LDcgQEAKICAqIFJldHVybgogICoJbm9uZQogICovCi12b2lkIFN4Z0ZyZWVSZXNvdXJjZXMocF9hZGFwdGVyX3QgYWRhcHRlcikKK3ZvaWQgU3hnRnJlZVJlc291cmNlcyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCXUzMiBSc3NJZHMsIElzckNvdW50OwogCVBUQ1BfT0JKRUNUIFRjcE9iamVjdDsKQEAgLTI5MjQsNyArMjkyNCw3IEBACiAJLyogRnJlZSBldmVudCBxdWV1ZXMuICovCiAJaWYgKGFkYXB0ZXItPkV2ZW50UmluZ3MpIHsKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJICAgIHNpemVvZihTWEdfRVZFTlRfUklORykgKiBSc3NJZHMsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzLAogCQkJCSAgICBhZGFwdGVyLT5FdmVudFJpbmdzLCBhZGFwdGVyLT5QRXZlbnRSaW5ncyk7CiAJfQogCWlmIChhZGFwdGVyLT5Jc3IpIHsKQEAgLTI5OTEsNyArMjk5MSw3IEBACiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgY29tcGxldGVkLgogICoKICAqIEFyZ3VtZW50cyAtCi0gKglwX2FkYXB0ZXJfdCAgICAJLSBPdXIgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCXN0cnVjdCBhZGFwdGVyX3QgKiAgIAktIE91ciBhZGFwdGVyIHN0cnVjdHVyZQogICoJVmlydHVhbEFkZHJlc3MJLSBNZW1vcnkgdmlydHVhbCBhZGRyZXNzCiAgKglQaHlzaWNhbEFkZHJlc3MJLSBNZW1vcnkgcGh5c2ljYWwgYWRkcmVzcwogICoJTGVuZ3RoCQktIExlbmd0aCBvZiBtZW1vcnkgYWxsb2NhdGVkIChvciAwKQpAQCAtMzAwMCwxMCArMzAwMCwxMCBAQAogICogUmV0dXJuCiAgKglOb25lLgogICovCi1zdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfY29tcGxldGUocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJCSAgdm9pZCAqVmlydHVhbEFkZHJlc3MsCiAJCQkJICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcywKLQkJCQkgIHUzMiBMZW5ndGgsIFNYR19CVUZGRVJfVFlQRSBDb250ZXh0KQorCQkJCSAgdTMyIExlbmd0aCwgZW51bSBTWEdfQlVGRkVSX1RZUEUgQ29udGV4dCkKIHsKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJBbGxvY0NtcCIsCiAJCSAgYWRhcHRlciwgVmlydHVhbEFkZHJlc3MsIExlbmd0aCwgQ29udGV4dCk7CkBAIC0zMDE4LDcgKzMwMTgsNyBAQAogCQkJCQkgICAgICAgUGh5c2ljYWxBZGRyZXNzLCBMZW5ndGgpOwogCQlicmVhazsKIAljYXNlIFNYR19CVUZGRVJfVFlQRV9TR0w6Ci0JCXN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKGFkYXB0ZXIsIChQU1hHX1NDQVRURVJfR0FUSEVSKQorCQlzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShhZGFwdGVyLCAoc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiopCiAJCQkJCQkgVmlydHVhbEFkZHJlc3MsCiAJCQkJCQkgUGh5c2ljYWxBZGRyZXNzLCBMZW5ndGgpOwogCQlicmVhazsKQEAgLTMwMzksOCArMzAzOSw4IEBACiAgKiBSZXR1cm4KICAqCWludAogICovCi1zdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9idWZmZXJfbWVtb3J5KHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkJICAgICAgdTMyIFNpemUsIFNYR19CVUZGRVJfVFlQRSBCdWZmZXJUeXBlKQorc3RhdGljIGludCBzeGdfYWxsb2NhdGVfYnVmZmVyX21lbW9yeShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgIHUzMiBTaXplLCBlbnVtIFNYR19CVUZGRVJfVFlQRSBCdWZmZXJUeXBlKQogewogCWludCBzdGF0dXM7CiAJdm9pZCAqQnVmZmVyOwpAQCAtMzA5MSw3ICszMDkxLDcgQEAKICAqIFJldHVybgogICoKICAqLwotc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3JjdmJsb2NrX2NvbXBsZXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfcmN2YmxvY2tfY29tcGxldGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCQkJICAgdm9pZCAqUmN2QmxvY2ssCiAJCQkJCSAgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzLAogCQkJCQkgICB1MzIgTGVuZ3RoKQpAQCAtMzA5OSwxMSArMzA5OSwxMSBAQAogCXUzMiBpOwogCXUzMiBCdWZmZXJTaXplID0gYWRhcHRlci0+UmVjZWl2ZUJ1ZmZlclNpemU7CiAJdTY0IFBhZGRyOwotCVBTWEdfUkNWX0JMT0NLX0hEUiBSY3ZCbG9ja0hkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9CTE9DS19IRFIgKlJjdkJsb2NrSGRyOwogCXVuc2lnbmVkIGNoYXIgKlJjdkRhdGFCdWZmZXI7Ci0JUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIFJjdkRhdGFCdWZmZXJIZHI7Ci0JUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyBSY3ZEZXNjcmlwdG9yQmxvY2s7Ci0JUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgUmN2RGVzY3JpcHRvckJsb2NrSGRyOworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLICpSY3ZEZXNjcmlwdG9yQmxvY2s7CisJc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgKlJjdkRlc2NyaXB0b3JCbG9ja0hkcjsKIAogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkFsUmN2QmxrIiwKIAkJICBhZGFwdGVyLCBSY3ZCbG9jaywgTGVuZ3RoLCAwKTsKQEAgLTMxMjksNyArMzEyOSw3IEBACiAJCSAgICAgaSsrLCBQYWRkciArPSBCdWZmZXJTaXplLCBSY3ZEYXRhQnVmZmVyICs9IEJ1ZmZlclNpemUpIHsKIAkJCS8qICovCiAJCQlSY3ZEYXRhQnVmZmVySGRyID0KLQkJCSAgICAoUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKSAoUmN2RGF0YUJ1ZmZlciArCisJCQkgICAgKHN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiopIChSY3ZEYXRhQnVmZmVyICsKIAkJCQkJCQlTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUl9PRkZTRVQKIAkJCQkJCQkoQnVmZmVyU2l6ZSkpOwogCQkJUmN2RGF0YUJ1ZmZlckhkci0+VmlydHVhbEFkZHJlc3MgPSBSY3ZEYXRhQnVmZmVyOwpAQCAtMzE0Nyw3ICszMTQ3LDcgQEAKIAkvKiBQbGFjZSB0aGlzIGVudGlyZSBibG9jayBvZiBtZW1vcnkgb24gdGhlIEFsbFJjdkJsb2NrcyBxdWV1ZSBzbyBpdCBjYW4gYmUgKi8KIAkvKiBmcmVlIGxhdGVyICovCiAJUmN2QmxvY2tIZHIgPQotCSAgICAoUFNYR19SQ1ZfQkxPQ0tfSERSKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCisJICAgIChzdHJ1Y3QgU1hHX1JDVl9CTE9DS19IRFIqKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCiAJCQkJICBTWEdfUkNWX0JMT0NLX0hEUl9PRkZTRVQoQnVmZmVyU2l6ZSkpOwogCVJjdkJsb2NrSGRyLT5WaXJ0dWFsQWRkcmVzcyA9IFJjdkJsb2NrOwogCVJjdkJsb2NrSGRyLT5QaHlzaWNhbEFkZHJlc3MgPSBQaHlzaWNhbEFkZHJlc3M7CkBAIC0zMTYxLDcgKzMxNjEsNyBAQAogCWZvciAoaSA9IDAsIFBhZGRyID0gUGh5c2ljYWxBZGRyZXNzOwogCSAgICAgaSA8IFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLOwogCSAgICAgaSsrLCBQYWRkciArPSBCdWZmZXJTaXplLCBSY3ZEYXRhQnVmZmVyICs9IEJ1ZmZlclNpemUpIHsKLQkJUmN2RGF0YUJ1ZmZlckhkciA9IChQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIpIChSY3ZEYXRhQnVmZmVyICsKKwkJUmN2RGF0YUJ1ZmZlckhkciA9IChzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIqKSAoUmN2RGF0YUJ1ZmZlciArCiAJCQkJCQkJICAgICAgIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSX09GRlNFVAogCQkJCQkJCSAgICAgICAoQnVmZmVyU2l6ZSkpOwogCQlzcGluX2xvY2soJmFkYXB0ZXItPlJjdlFMb2NrKTsKQEAgLTMxNzEsMTEgKzMxNzEsMTEgQEAKIAogCS8qIExvY2F0ZSB0aGUgZGVzY3JpcHRvciBibG9jayBhbmQgcHV0IGl0IG9uIGEgc2VwYXJhdGUgZnJlZSBxdWV1ZSAqLwogCVJjdkRlc2NyaXB0b3JCbG9jayA9Ci0JICAgIChQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCisJICAgIChzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKikgKCh1bnNpZ25lZCBjaGFyICopUmN2QmxvY2sgKwogCQkJCQkgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX09GRlNFVAogCQkJCQkgKEJ1ZmZlclNpemUpKTsKIAlSY3ZEZXNjcmlwdG9yQmxvY2tIZHIgPQotCSAgICAoUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIpICgodW5zaWduZWQgY2hhciAqKVJjdkJsb2NrICsKKwkgICAgKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKikgKCh1bnNpZ25lZCBjaGFyICopUmN2QmxvY2sgKwogCQkJCQkgICAgIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFJfT0ZGU0VUCiAJCQkJCSAgICAgKEJ1ZmZlclNpemUpKTsKIAlSY3ZEZXNjcmlwdG9yQmxvY2tIZHItPlZpcnR1YWxBZGRyZXNzID0gUmN2RGVzY3JpcHRvckJsb2NrOwpAQCAtMzE5Myw3ICszMTkzLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLOwogCQkgICAgIGkrKywgUmN2RGF0YUJ1ZmZlciArPSBCdWZmZXJTaXplKSB7CiAJCQlSY3ZEYXRhQnVmZmVySGRyID0KLQkJCSAgICAoUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKSAoUmN2RGF0YUJ1ZmZlciArCisJCQkgICAgKHN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiopIChSY3ZEYXRhQnVmZmVyICsKIAkJCQkJCQlTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUl9PRkZTRVQKIAkJCQkJCQkoQnVmZmVyU2l6ZSkpOwogCQkJU1hHX0ZSRUVfUkNWX1BBQ0tFVChSY3ZEYXRhQnVmZmVySGRyKTsKQEAgLTMyMjAsOCArMzIyMCw4IEBACiAgKiBSZXR1cm4KICAqCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkJCSAgICAgUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2wsCitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgICAgIHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgKlN4Z1NnbCwKIAkJCQkJICAgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcywKIAkJCQkJICAgICB1MzIgTGVuZ3RoKQogewpAQCAtMzIyOSw3ICszMjI5LDcgQEAKIAkJICBhZGFwdGVyLCBTeGdTZ2wsIExlbmd0aCwgMCk7CiAJc3Bpbl9sb2NrKCZhZGFwdGVyLT5TZ2xRTG9jayk7CiAJYWRhcHRlci0+QWxsU2dsQnVmZmVyQ291bnQrKzsKLQltZW1zZXQoU3hnU2dsLCAwLCBzaXplb2YoU1hHX1NDQVRURVJfR0FUSEVSKSk7CisJbWVtc2V0KFN4Z1NnbCwgMCwgc2l6ZW9mKHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIqKSk7CiAJU3hnU2dsLT5QaHlzaWNhbEFkZHJlc3MgPSBQaHlzaWNhbEFkZHJlc3M7CS8qICpQaHlzaWNhbEFkZHJlc3M7ICovCiAJU3hnU2dsLT5hZGFwdGVyID0gYWRhcHRlcjsJLyogSW5pdGlhbGl6ZSBiYWNrcG9pbnRlciBvbmNlICovCiAJSW5zZXJ0VGFpbExpc3QoJmFkYXB0ZXItPkFsbFNnbEJ1ZmZlcnMsICZTeGdTZ2wtPkFsbExpc3QpOwpAQCAtMzI0MywxNCArMzI0MywxNCBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVtcF9tYWNfYWRkcmVzc1s2XSA9CiAgICAgeyAweDAwLCAweGFiLCAweGNkLCAweGVmLCAweDEyLCAweDY5IH07CiAKLXN0YXRpYyB2b2lkIHN4Z19hZGFwdGVyX3NldF9od2FkZHIocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19hZGFwdGVyX3NldF9od2FkZHIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIC8qICBEQkdfRVJST1IgKCIlcyBFTlRFUiBjYXJkLT5jb25maWdfc2V0WyV4XSBwb3J0WyVkXSBwaHlzcG9ydFslZF0gZnVuY3QjWyVkXVxuIiwgX19mdW5jX18sICovCiAvKiAgICAgICAgICAgICBjYXJkLT5jb25maWdfc2V0LCBhZGFwdGVyLT5wb3J0LCBhZGFwdGVyLT5waHlzcG9ydCwgYWRhcHRlci0+ZnVuY3Rpb25udW1iZXIpOyAqLwogLyogKi8KIC8qICBzeGdfZGJnX21hY2FkZHJzKGFkYXB0ZXIpOyAqLwogCi0JbWVtY3B5KGFkYXB0ZXItPm1hY2FkZHIsIHRlbXBfbWFjX2FkZHJlc3MsIHNpemVvZihTWEdfQ09ORklHX01BQykpOworCW1lbWNweShhZGFwdGVyLT5tYWNhZGRyLCB0ZW1wX21hY19hZGRyZXNzLCBzaXplb2Yoc3RydWN0IFNYR19DT05GSUdfTUFDKSk7CiAvKiAgICAgIERCR19FUlJPUiAoIiVzIEFGVEVSIGNvcHlpbmcgZnJvbSBjb25maWcubWFjaW5mbyBpbnRvIGN1cnJtYWNhZGRyXG4iLCBfX2Z1bmNfXyk7ICovCiAvKiAgICAgIHN4Z19kYmdfbWFjYWRkcnMoYWRhcHRlcik7ICovCiAJaWYgKCEoYWRhcHRlci0+Y3Vycm1hY2FkZHJbMF0gfHwKQEAgLTMyNzEsNyArMzI3MSw3IEBACiAjaWYgWFhYVE9ETwogc3RhdGljIGludCBzeGdfbWFjX3NldF9hZGRyZXNzKHBfbmV0X2RldmljZSBkZXYsIHZvaWQgKnB0cikKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHB0cjsKIAogCURCR19FUlJPUigiJXMgRU5URVIgKCVzKVxuIiwgX19mdW5jX18sIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CkBAIC0zMzEzLDcgKzMzMTMsNyBAQAogICogUmV0dXJuCiAgKglpbnQKICAqLwotc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9hZGFwdGVyKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAl1MzIgUnNzSWRzLCBJc3JDb3VudDsKIAl1MzIgaTsKQEAgLTMzMjcsNyArMzMyNyw3IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgU1hHX1VDT0RFX1JFR1Mgc3RydWN0dXJlIGRlZmluaXRpb24gdG8gKi8KIAkvKiBtYWtlIHN1cmUgdGhlIGxlbmd0aCBpcyBjb3JyZWN0ICovCi0JQVNTRVJUKHNpemVvZihTWEdfVUNPREVfUkVHUykgPT0gU1hHX1JFR0lTVEVSX1NJWkVfUEVSX0NQVSk7CisJQVNTRVJUKHNpemVvZihzdHJ1Y3QgU1hHX1VDT0RFX1JFR1MpID09IFNYR19SRUdJU1RFUl9TSVpFX1BFUl9DUFUpOwogCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAJU1hHX0RJU0FCTEVfQUxMX0lOVEVSUlVQVFMoYWRhcHRlcik7CkBAIC0zNDEyLDE2ICszNDEyLDE2IEBACiAgKiBSZXR1cm4KICAqCXN0YXR1cwogICovCi1zdGF0aWMgaW50IHN4Z19maWxsX2Rlc2NyaXB0b3JfYmxvY2socF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCQkgICAgIFBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSCi0JCQkJICAgICBSY3ZEZXNjcmlwdG9yQmxvY2tIZHIpCitzdGF0aWMgaW50IHN4Z19maWxsX2Rlc2NyaXB0b3JfYmxvY2soc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgIHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSCisJCQkJICAgICAqUmN2RGVzY3JpcHRvckJsb2NrSGRyKQogewogCXUzMiBpOwotCVBTWEdfUklOR19JTkZPIFJjdlJpbmdJbmZvID0gJmFkYXB0ZXItPlJjdlJpbmdaZXJvSW5mbzsKLQlQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgUmN2RGF0YUJ1ZmZlckhkcjsKLQlQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIFJjdkRlc2NyaXB0b3JCbG9jazsKLQlQU1hHX0NNRCBSaW5nRGVzY3JpcHRvckNtZDsKLQlQU1hHX1JDVl9SSU5HIFJpbmdaZXJvID0gJmFkYXB0ZXItPlJjdlJpbmdzWzBdOworCXN0cnVjdCBTWEdfUklOR19JTkZPICpSY3ZSaW5nSW5mbyA9ICZhZGFwdGVyLT5SY3ZSaW5nWmVyb0luZm87CisJc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpSY3ZEYXRhQnVmZmVySGRyOworCXN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgKlJjdkRlc2NyaXB0b3JCbG9jazsKKwlzdHJ1Y3QgU1hHX0NNRCAqUmluZ0Rlc2NyaXB0b3JDbWQ7CisJc3RydWN0IFNYR19SQ1ZfUklORyAqUmluZ1plcm8gPSAmYWRhcHRlci0+UmN2UmluZ3NbMF07CiAKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJGaWxCbGsiLAogCQkgIGFkYXB0ZXIsIGFkYXB0ZXItPlJjdkJ1ZmZlcnNPbkNhcmQsCkBAIC0zNDQyLDcgKzM0NDIsNyBAQAogCUFTU0VSVChSaW5nRGVzY3JpcHRvckNtZCk7CiAJUmN2RGVzY3JpcHRvckJsb2NrSGRyLT5TdGF0ZSA9IFNYR19CVUZGRVJfT05DQVJEOwogCVJjdkRlc2NyaXB0b3JCbG9jayA9Ci0JICAgIChQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSBSY3ZEZXNjcmlwdG9yQmxvY2tIZHItPlZpcnR1YWxBZGRyZXNzOworCSAgICAoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyopIFJjdkRlc2NyaXB0b3JCbG9ja0hkci0+VmlydHVhbEFkZHJlc3M7CiAKIAkvKiBGaWxsIGluIHRoZSBkZXNjcmlwdG9yIGJsb2NrICovCiAJZm9yIChpID0gMDsgaSA8IFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLOyBpKyspIHsKQEAgLTM0ODQsOSArMzQ4NCw5IEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX3N0b2NrX3Jjdl9idWZmZXJzKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfc3RvY2tfcmN2X2J1ZmZlcnMoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiBSY3ZEZXNjcmlwdG9yQmxvY2tIZHI7CisJc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgKlJjdkRlc2NyaXB0b3JCbG9ja0hkcjsKIAogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIlN0b2NrQnVmIiwKIAkJICBhZGFwdGVyLCBhZGFwdGVyLT5SY3ZCdWZmZXJzT25DYXJkLApAQCAtMzUwNiwxNCArMzUwNiwxNCBAQAogCS8qIE5vdyBncmFiIHRoZSBSY3ZRTG9jayBsb2NrIGFuZCBwcm9jZWVkICovCiAJc3Bpbl9sb2NrKCZhZGFwdGVyLT5SY3ZRTG9jayk7CiAJd2hpbGUgKGFkYXB0ZXItPlJjdkJ1ZmZlcnNPbkNhcmQgPCBTWEdfUkNWX0RBVEFfQlVGRkVSUykgewotCQlQTElTVF9FTlRSWSBfcGxlOworCQlzdHJ1Y3QgTElTVF9FTlRSWSAqX3BsZTsKIAogCQkvKiBHZXQgYSBkZXNjcmlwdG9yIGJsb2NrICovCiAJCVJjdkRlc2NyaXB0b3JCbG9ja0hkciA9IE5VTEw7CiAJCWlmIChhZGFwdGVyLT5GcmVlUmN2QmxvY2tDb3VudCkgewogCQkJX3BsZSA9IFJlbW92ZUhlYWRMaXN0KCZhZGFwdGVyLT5GcmVlUmN2QmxvY2tzKTsKIAkJCVJjdkRlc2NyaXB0b3JCbG9ja0hkciA9Ci0JCQkgICAgY29udGFpbmVyX29mKF9wbGUsIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIsCisJCQkgICAgY29udGFpbmVyX29mKF9wbGUsIHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSLAogCQkJCQkgRnJlZUxpc3QpOwogCQkJYWRhcHRlci0+RnJlZVJjdkJsb2NrQ291bnQtLTsKIAkJCVJjdkRlc2NyaXB0b3JCbG9ja0hkci0+U3RhdGUgPSBTWEdfQlVGRkVSX0JVU1k7CkBAIC0zNTUwLDEzICszNTUwLDEzIEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX2Rlc2NyaXB0b3JfYmxvY2tzKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfZGVzY3JpcHRvcl9ibG9ja3Moc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCQkJICAgdW5zaWduZWQgY2hhciBJbmRleCkKIHsKLQlQU1hHX1JDVl9SSU5HIFJpbmdaZXJvID0gJmFkYXB0ZXItPlJjdlJpbmdzWzBdOwotCVBTWEdfUklOR19JTkZPIFJjdlJpbmdJbmZvID0gJmFkYXB0ZXItPlJjdlJpbmdaZXJvSW5mbzsKLQlQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiBSY3ZEZXNjcmlwdG9yQmxvY2tIZHI7Ci0JUFNYR19DTUQgUmluZ0Rlc2NyaXB0b3JDbWQ7CisJc3RydWN0IFNYR19SQ1ZfUklORyAqUmluZ1plcm8gPSAmYWRhcHRlci0+UmN2UmluZ3NbMF07CisJc3RydWN0IFNYR19SSU5HX0lORk8gKlJjdlJpbmdJbmZvID0gJmFkYXB0ZXItPlJjdlJpbmdaZXJvSW5mbzsKKwlzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiAqUmN2RGVzY3JpcHRvckJsb2NrSGRyOworCXN0cnVjdCBTWEdfQ01EICpSaW5nRGVzY3JpcHRvckNtZDsKIAogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkNtcFJCbGtzIiwKIAkJICBhZGFwdGVyLCBJbmRleCwgUmN2UmluZ0luZm8tPkhlYWQsIFJjdlJpbmdJbmZvLT5UYWlsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmggYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5oCmluZGV4IDg0NGNhNTYuLjY1M2NmM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuaApAQCAtNDUsNyArNDUsNyBAQAogI2RlZmluZSBwX25ldF9kZXZpY2Ugc3RydWN0IG5ldF9kZXZpY2UgKgogLy8gU1hHX1NUQVRTIC0gUHJvYmFibHkgbW92ZSB0aGVzZSB0byBzb21lcGxhY2Ugd2hlcmUKIC8vIHRoZSBzbGljc3RhdCAoc3hnc3RhdD8pIHByb2dyYW0gY2FuIGdldCB0aGVtLgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19TVEFUUyB7CitzdHJ1Y3QgU1hHX1NUQVRTIHsKIAkvLyBYbXQKIAl1MzIJCQkJWG10TkJMOwkJCQkvLyBPZmZsb2FkIHNlbmQgTkJMIGNvdW50CiAJdTY0CQkJCUR1bWJYbXRCeXRlczsJCS8vIER1bWJuaWMgc2VuZCBieXRlcwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJdTY0CQkJCUxpbmtDcmM7CQkJLy8gU1hHX1JDVl9TVEFUVVNfTElOS19DUkM6CiAJdTY0CQkJCUxpbmtPZmxvdzsJCQkvLyBTWEdfUkNWX1NUQVRVU19MSU5LX09GTE9XOgogCXU2NAkJCQlMaW5rVWZsb3c7CQkJLy8gU1hHX1JDVl9TVEFUVVNfTElOS19VRkxPVzoKLX0gU1hHX1NUQVRTLCAqUFNYR19TVEFUUzsKK307CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIxNSwxMiArMjE1LDEyIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBOT1RFIC0gTG9jayBtdXN0IGJlIGhlbGQgd2l0aCBSQ1YgbWFjcm9zCiAjZGVmaW5lIFNYR19HRVRfUkNWX0RBVEFfQlVGRkVSKF9wQWRhcHQsIF9IZHIpIHsJCQkJCQkJCVwKLQlQTElTVF9FTlRSWSAgICAgCQkJCV9wbGU7CQkJCQkJCQkJCVwKKwlzdHJ1Y3QgTElTVF9FTlRSWSAgICAgCQkJCSpfcGxlOwkJCQkJCQkJCQlcCiAJX0hkciA9IE5VTEw7CQkJCQkJCQkJCQkJCQkJCVwKIAlpZigoX3BBZGFwdCktPkZyZWVSY3ZCdWZmZXJDb3VudCkgewkJCQkJCQkJCQkJXAogCQlBU1NFUlQoIShJc0xpc3RFbXB0eSgmKF9wQWRhcHQpLT5GcmVlUmN2QnVmZmVycykpKTsJCQkJCQlcCiAJCV9wbGUgPSBSZW1vdmVIZWFkTGlzdCgmKF9wQWRhcHQpLT5GcmVlUmN2QnVmZmVycyk7CSAgICAJCQkJXAotCQkoX0hkcikgPSBjb250YWluZXJfb2YoX3BsZSwgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIsIEZyZWVMaXN0KTsJICAgICAgICBcCisJCShfSGRyKSA9IGNvbnRhaW5lcl9vZihfcGxlLCBzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIsIEZyZWVMaXN0KTsJICAgICAgICBcCiAJCShfcEFkYXB0KS0+RnJlZVJjdkJ1ZmZlckNvdW50LS07CQkJCQkJCQkJCVwKIAkJQVNTRVJUKChfSGRyKS0+U3RhdGUgPT0gU1hHX0JVRkZFUl9GUkVFKTsJCQkJCQkJCVwKIAl9CQkJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTI2MywxMiArMjYzLDEyIEBACiAvLyB1bnRpbCBhZnRlciB0aGF0LiAgV2UncmUgZGVhbGluZyB3aXRoIHJvdW5kIG51bWJlcnMgaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCB0bywKIC8vIGFuZCBub3QgZ3JhYmJpbmcgaXQgYXZvaWRzIGEgcG9zc2libGUgZG91YmxlLXRyaXAuCiAjZGVmaW5lIFNYR19HRVRfU0dMX0JVRkZFUihfcEFkYXB0LCBfU2dsKSB7CQkJCVwKLQlQTElTVF9FTlRSWSBfcGxlOwkJCQkJCVwKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqX3BsZTsJCQkJCQlcCiAJaWYgKChfcEFkYXB0LT5GcmVlU2dsQnVmZmVyQ291bnQgPCBTWEdfTUlOX1NHTF9CVUZGRVJTKSAmJglcCiAJICAgKF9wQWRhcHQtPkFsbFNnbEJ1ZmZlckNvdW50IDwgU1hHX01BWF9TR0xfQlVGRkVSUykgJiYJXAogCSAgIChfcEFkYXB0LT5BbGxvY2F0aW9uc1BlbmRpbmcgPT0gMCkpIHsJCQlcCiAJCXN4Z19hbGxvY2F0ZV9idWZmZXJfbWVtb3J5KF9wQWRhcHQsCQkJXAotCQkJKHNpemVvZihTWEdfU0NBVFRFUl9HQVRIRVIpICsgU1hHX1NHTF9CVUZfU0laRSksXAorCQkJKHNpemVvZihzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSKSArIFNYR19TR0xfQlVGX1NJWkUpLFwKIAkJCVNYR19CVUZGRVJfVFlQRV9TR0wpOwkJCQlcCiAJfQkJCQkJCQkJXAogCV9TZ2wgPSBOVUxMOwkJCQkJCQlcCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlpZigoX3BBZGFwdCktPkZyZWVTZ2xCdWZmZXJDb3VudCkgewkJCQlcCiAJCUFTU0VSVCghKElzTGlzdEVtcHR5KCYoX3BBZGFwdCktPkZyZWVTZ2xCdWZmZXJzKSkpOwlcCiAJCV9wbGUgPSBSZW1vdmVIZWFkTGlzdCgmKF9wQWRhcHQpLT5GcmVlU2dsQnVmZmVycyk7CVwKLQkJKF9TZ2wpID0gY29udGFpbmVyX29mKF9wbGUsIFNYR19TQ0FUVEVSX0dBVEhFUiwgRnJlZUxpc3QpOyBcCisJCShfU2dsKSA9IGNvbnRhaW5lcl9vZihfcGxlLCBzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSLCBGcmVlTGlzdCk7IFwKICAgICAgICAgICAgIChfcEFkYXB0KS0+RnJlZVNnbEJ1ZmZlckNvdW50LS07CQkJCVwKIAkJQVNTRVJUKChfU2dsKS0+U3RhdGUgPT0gU1hHX0JVRkZFUl9GUkVFKTsJCVwKIAkJKF9TZ2wpLT5TdGF0ZSA9IFNYR19CVUZGRVJfQlVTWTsJCQlcCkBAIC0yODksMTcgKzI4OSwxNyBAQAogLy8gU1hHX01VTFRJQ0FTVF9BRERSRVNTCiAvLwogLy8gTGlua2VkIGxpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3Nlcy4KLXR5cGVkZWYgc3RydWN0IF9TWEdfTVVMVElDQVNUX0FERFJFU1Mgeworc3RydWN0IFNYR19NVUxUSUNBU1RfQUREUkVTUyB7CiAJdW5zaWduZWQgY2hhcgkJCQkJCQlBZGRyZXNzWzZdOwotCXN0cnVjdCBfU1hHX01VTFRJQ0FTVF9BRERSRVNTCSpOZXh0OwotfSBTWEdfTVVMVElDQVNUX0FERFJFU1MsICpQU1hHX01VTFRJQ0FTVF9BRERSRVNTOworCXN0cnVjdCBTWEdfTVVMVElDQVNUX0FERFJFU1MJKk5leHQ7Cit9OwogCiAvLyBTdHJ1Y3R1cmUgdG8gbWFpbnRhaW4gY2hpbW5leSBzZW5kIGFuZCByZWNlaXZlIGJ1ZmZlciBxdWV1ZXMuCiAvLyBUaGlzIHN0cnVjdHVyZSBtYWludGFpbnMgTkVUX0JVRkZFUl9MSVNUIHF1ZXVlcyB0aGF0IGFyZQogLy8gZ2l2ZW4gdG8gdXMgdmlhIHRoZSBDaGltbmV5IE1pbmlwb3J0VGNwT2ZmbG9hZFNlbmQgYW5kCiAvLyBNaW5pcG9ydFRjcE9mZmxvYWRSZWNlaXZlIHJvdXRpbmVzLiAgVGhpcyBzdHJ1Y3R1cmUgRE9FUyBOT1QKIC8vIG1hbmFnZSBvdXIgZGF0YSBidWZmZXIgcXVldWUKLXR5cGVkZWYgc3RydWN0IF9TWEdfQlVGRkVSX1FVRVVFIHsKK3N0cnVjdCBTWEdfQlVGRkVSX1FVRVVFIHsKIAl1MzIJCQkJCQlUeXBlOwkJCS8vIFNsb3cgb3IgZmFzdCAtIFNlZSBiZWxvdwogCXUzMgkJCQkJCURpcmVjdGlvbjsJCS8vIFhtdCBvciBSY3YKIAl1MzIJCQkJCQlCeXRlczsJCQkvLyBCeXRlIGNvdW50CkBAIC0zMDcsNyArMzA3LDcgQEAKIAl1MzIgKiAgICAgICAgCQkJVGFpbDsJCQkvLyBTZW5kIHF1ZXVlIHRhaWwKIC8vCVBORVRfQlVGRkVSX0xJU1QJCQlOZXh0TkJMOwkJLy8gU2hvcnQgY3V0IC0gbmV4dCBOQkwKIC8vCVBORVRfQlVGRkVSCQkJCQlOZXh0TkI7CQkJLy8gU2hvcnQgY3V0IC0gbmV4dCBOQgotfSBTWEdfQlVGRkVSX1FVRVVFLCAqUFNYR19CVUZGRVJfUVVFVUU7Cit9OwogCiAjZGVmaW5lCQlTWEdfU0xPV19TRU5EX0JVRkZFUgkwCiAjZGVmaW5lCQlTWEdfRkFTVF9TRU5EX0JVRkZFUgkxCkBAIC0zMzUsNyArMzM1LDcgQEAKIAogLy8gQWRhcHRlciBzdGF0ZXMgLSBUaGVzZSBzdGF0ZXMgY2xvc2VseSBtYXRjaCB0aGUgYWRhcHRlciBzdGF0ZXMKIC8vIGRvY3VtZW50ZWQgaW4gdGhlIERESyAod2l0aCBhIGZldyBleGNlcHRpb25zKS4KLXR5cGVkZWYgZW51bSBfU1hHX1NUQVRFIHsKK2VudW0gU1hHX1NUQVRFIHsKIAlTWEdfU1RBVEVfSU5JVElBTElaSU5HLAkJCS8vIEluaXRpYWxpemluZwogCVNYR19TVEFURV9CT09URElBRywJCQkJLy8gQm9vdC1EaWFnbm9zdGljIG1vZGUKIAlTWEdfU1RBVEVfUEFVU0lORywJCQkJLy8gUGF1c2luZwpAQCAtMzQ3LDI0ICszNDcsMjQgQEAKIAlTWEdfU1RBVEVfSEFMVElORywJCQkJLy8gSGFsdGluZwogCVNYR19TVEFURV9IQUxURUQsCQkJCS8vIERvd24gb3Igbm90LWluaXRpYWxpemVkCiAJU1hHX1NUQVRFX1NIVVRET1dOCQkJCS8vIHNodXRkb3duCi19IFNYR19TVEFURSwgKlBTWEdfU1RBVEU7Cit9OwogCiAvLyBMaW5rIHN0YXRlCi10eXBlZGVmIGVudW0gX1NYR19MSU5LX1NUQVRFIHsKK2VudW0gU1hHX0xJTktfU1RBVEUgewogCVNYR19MSU5LX0RPV04sCiAJU1hHX0xJTktfVVAKLX0gU1hHX0xJTktfU1RBVEUsICpQU1hHX0xJTktfU1RBVEU7Cit9OwogCiAvLyBMaW5rIGluaXRpYWxpemF0aW9uIHRpbWVvdXQgaW4gMTAwdXMgdW5pdHMKICNkZWZpbmUgU1hHX0xJTktfVElNRU9VVAkxMDAwMDAJCS8vIDEwIFNlY29uZHMgLSBSRURVQ0UhCiAKIAogLy8gTWljcm9jb2RlIGZpbGUgc2VsZWN0aW9uIGNvZGVzCi10eXBlZGVmIGVudW0gX1NYR19VQ09ERV9TRUwgeworZW51bSBTWEdfVUNPREVfU0VMIHsKIAlTWEdfVUNPREVfU0FIQVJBLAkJCQkvLyBTYWhhcmEgdWNvZGUKIAlTWEdfVUNPREVfU0RJQUdDUFUsCQkJCS8vIFNhaGFyYSBDUFUgZGlhZ25vc3RpYyB1Y29kZQogCVNYR19VQ09ERV9TRElBR1NZUwkJCQkvLyBTYWhhcmEgc3lzdGVtIGRpYWdub3N0aWMgdWNvZGUKLX0gU1hHX1VDT0RFX1NFTDsKK307CiAKIAogI2RlZmluZSBTWEdfRElTQUJMRV9BTExfSU5URVJSVVBUUyhfcGFkYXB0KSBzeGdfZGlzYWJsZV9pbnRlcnJ1cHQoX3BhZGFwdCkKQEAgLTM4NCwxMCArMzg0LDEwIEBACiAvLwogLy8gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN4ZyBkcml2ZXIuICBUaGVyZSBpcyBvbmx5CiAvLyBvbmUgb2YgdGhlc2UsIGFuZCBpdCBpcyBkZWZpbmVkIGFzIGEgZ2xvYmFsLgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19EUklWRVIgewotCXN0cnVjdCBfYWRhcHRlcl90CSpBZGFwdGVyczsJCS8vIExpbmtlZCBsaXN0IG9mIGFkYXB0ZXJzCitzdHJ1Y3QgU1hHX0RSSVZFUiB7CisJc3RydWN0IGFkYXB0ZXJfdAkqQWRhcHRlcnM7CQkvLyBMaW5rZWQgbGlzdCBvZiBhZGFwdGVycwogCXVzaG9ydAkJCQlBZGFwdGVySUQ7CQkvLyBNYWludGFpbiB1bmlxdWUgYWRhcHRlciBJRAotfSBTWEdfRFJJVkVSLCAqUFNYR19EUklWRVI7Cit9OwogCiAjaWZkZWYgU1RBVFVTX1NVQ0NFU1MKICN1bmRlZiBTVEFUVVNfU1VDQ0VTUwpAQCAtNDE2LDExICs0MTYsMTAgQEAKICNkZWZpbmUgTUlOKGEsIGIpICgodTMyKShhKSA8ICh1MzIpKGIpID8gKGEpIDogKGIpKQogI2RlZmluZSBNQVgoYSwgYikgKCh1MzIpKGEpID4gKHUzMikoYikgPyAoYSkgOiAoYikpCiAKLXR5cGVkZWYgc3RydWN0IF9tY2FzdF9hZGRyZXNzX3QKLXsKK3N0cnVjdCBtY2FzdF9hZGRyZXNzX3QgewogICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzWzZdOwotICAgIHN0cnVjdCBfbWNhc3RfYWRkcmVzc190ICAgKm5leHQ7Ci19ICBtY2FzdF9hZGRyZXNzX3QsICpwX21jYXN0X2FkZHJlc3NfdDsKKyAgICBzdHJ1Y3QgbWNhc3RfYWRkcmVzc190ICAgKm5leHQ7Cit9OwogCiAjZGVmaW5lIENBUkRfRE9XTiAgICAgICAgMHgwMDAwMDAwMAogI2RlZmluZSBDQVJEX1VQICAgICAgICAgIDB4MDAwMDAwMDEKQEAgLTQ3Miw0MSArNDcxLDM3IEBACiAjZGVmaW5lIFNMSUNfQ0FSRF9TVEFURSh4KSAgICAoKHg9PUNBUkRfVVApID8gIlVQIiA6ICJEb3duIikKIAogCi10eXBlZGVmIHN0cnVjdCBfZXRoZXJfaGVhZGVyCi17CitzdHJ1Y3QgZXRoZXJfaGVhZGVyIHsKICAgICB1bnNpZ25lZCBjaGFyICAgIGV0aGVyX2Rob3N0WzZdOwogICAgIHVuc2lnbmVkIGNoYXIgICAgZXRoZXJfc2hvc3RbNl07CiAgICAgdXNob3J0ICAgZXRoZXJfdHlwZTsKLX0gZXRoZXJfaGVhZGVyLCAqcF9ldGhlcl9oZWFkZXI7Cit9OwogCiAKICNkZWZpbmUgTlVNX0NGR19TUEFDRVMgICAgICAyCiAjZGVmaW5lIE5VTV9DRkdfUkVHUyAgICAgICAgNjQKIAotdHlwZWRlZiBzdHJ1Y3QgX3BoeXNjYXJkX3QKLXsKLSAgICBzdHJ1Y3QgX2FkYXB0ZXJfdCAgKmFkYXB0ZXJbU0xJQ19NQVhfUE9SVFNdOwotICAgIHN0cnVjdCBfcGh5c2NhcmRfdCAqbmV4dDsKK3N0cnVjdCBwaHlzY2FyZF90IHsKKyAgICBzdHJ1Y3QgYWRhcHRlcl90ICAqYWRhcHRlcltTTElDX01BWF9QT1JUU107CisgICAgc3RydWN0IHBoeXNjYXJkX3QgKm5leHQ7CiAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGFkYXB0ZXJzX2FsbG9jZDsKLX0gcGh5c2NhcmRfdCwgKnBfcGh5c2NhcmRfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9zeGdiYXNlX2RyaXZlcgoteworc3RydWN0IHN4Z2Jhc2VfZHJpdmVyX3QgewogCXNwaW5sb2NrX3QJZHJpdmVyX2xvY2s7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsJLyogaXJxc2F2ZSBmb3Igc3BpbmxvY2sgKi8KIAl1MzIJCW51bV9zeGdfY2FyZHM7CiAJdTMyCQludW1fc3hnX3BvcnRzOwogCXUzMgkJbnVtX3N4Z19wb3J0c19hY3RpdmU7CiAJdTMyCQlkeW5hbWljX2ludGFnZzsKLQlwX3BoeXNjYXJkX3QJcGh5c19jYXJkOwotfSBzeGdiYXNlX2RyaXZlcl90OworCXN0cnVjdCBwaHlzY2FyZF90CSpwaHlzX2NhcmQ7Cit9OwogCiAKLXR5cGVkZWYgc3RydWN0IF9hZGFwdGVyX3QKLXsKK3N0cnVjdCBhZGFwdGVyX3QgewogCXZvaWQgKiAgICAgICAgICAgICAgIGlmcDsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgcG9ydDsKLQlwX3BoeXNjYXJkX3QgICAgICAgIHBoeXNjYXJkOworCXN0cnVjdCBwaHlzY2FyZF90ICAgICAgICAqcGh5c2NhcmQ7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHBoeXNwb3J0OwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBjYXJkaW5kZXg7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGNhcmRfc2l6ZTsKQEAgLTU0NCw3ICs1MzksNyBAQAogCXUzMiAgICAgICAgICAgICBtYWNvcHRzOwogCXVzaG9ydCAgICAgICAgICAgICAgZGV2ZmxhZ3NfcHJldjsKIAl1NjQgICAgICAgICAgICAgbWNhc3RtYXNrOwotCXBfbWNhc3RfYWRkcmVzc190ICAgbWNhc3RhZGRyczsKKwlzdHJ1Y3QgbWNhc3RfYWRkcmVzc190ICAgKm1jYXN0YWRkcnM7CiAJc3RydWN0IHRpbWVyX2xpc3QgICBwaW5ndGltZXI7CiAJdTMyICAgICAgICAgICAgIHBpbmd0aW1lcnNldDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCAgIHN0YXRzdGltZXI7CkBAIC01ODAsMTEgKzU3NSwxMSBAQAogCXUzMiAgICAgICAgICAgICBpbnRhZ2dfcGVyaW9kOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXUzMiAqCQkJCQlNaW5pcG9ydEhhbmRsZTsJCS8vIE91ciBtaW5pcG9ydCBoYW5kbGUKLQlTWEdfU1RBVEUJCQkJCVN0YXRlOwkJCQkvLyBBZGFwdGVyIHN0YXRlCi0JU1hHX0xJTktfU1RBVEUJCQkJTGlua1N0YXRlOwkJCS8vIExpbmsgc3RhdGUKKwllbnVtIFNYR19TVEFURQkJCQkJU3RhdGU7CQkJCS8vIEFkYXB0ZXIgc3RhdGUKKwllbnVtIFNYR19MSU5LX1NUQVRFCQkJCUxpbmtTdGF0ZTsJCQkvLyBMaW5rIHN0YXRlCiAJdTY0CQkJCQkJTGlua1NwZWVkOwkJCS8vIExpbmsgU3BlZWQKIAl1MzIJCQkJCQlQb3dlclN0YXRlOwkJCS8vIE5ESVMgcG93ZXIgc3RhdGUKLQlzdHJ1Y3QgX2FkYXB0ZXJfdCAgIAkJKk5leHQ7CQkJCS8vIExpbmtlZCBsaXN0CisJc3RydWN0IGFkYXB0ZXJfdCAgIAkJKk5leHQ7CQkJCS8vIExpbmtlZCBsaXN0CiAJdXNob3J0CQkJCQkJQWRhcHRlcklEOwkJCS8vIDEuLm4KIAl1bnNpZ25lZCBjaGFyCQkJCQkJTWFjQWRkcls2XTsJCQkvLyBPdXIgcGVybWFuZW50IEhXIG1hYyBhZGRyZXNzCiAJdW5zaWduZWQgY2hhcgkJCQkJCUN1cnJNYWNBZGRyWzZdOwkJLy8gT3VyIEN1cnJlbnQgbWFjIGFkZHJlc3MKQEAgLTU5MiwxNiArNTg3LDE2IEBACiAJcF9uZXRfZGV2aWNlICAgICAgICAgICAgICAgIG5leHRfbmV0ZGV2aWNlOwogCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgKiBwY2lkZXY7CiAKLQlQU1hHX01VTFRJQ0FTVF9BRERSRVNTCQlNdWx0aWNhc3RBZGRyczsJCS8vIE11bHRpY2FzdCBsaXN0CisJc3RydWN0IFNYR19NVUxUSUNBU1RfQUREUkVTUwkJKk11bHRpY2FzdEFkZHJzOwkJLy8gTXVsdGljYXN0IGxpc3QKIAl1NjQgICAgIAkJCQlNdWx0aWNhc3RNYXNrOwkJLy8gTXVsdGljYXN0IG1hc2sKIAl1MzIgKgkJCQkJSW50ZXJydXB0SGFuZGxlOwkvLyBSZWdpc3RlciBJbnRlcnJ1cHQgaGFuZGxlCiAJdTMyCQkJCQkJSW50ZXJydXB0TGV2ZWw7CQkvLyBGcm9tIFJlc291cmNlIGxpc3QKIAl1MzIJCQkJCQlJbnRlcnJ1cHRWZWN0b3I7CS8vIEZyb20gUmVzb3VyY2UgbGlzdAogCXNwaW5sb2NrX3QJQWRhcHRlckxvY2s7CS8qIFNlcmlhbGl6ZSBhY2Nlc3MgYWRhcHRlciByb3V0aW5lcyAqLwogCXNwaW5sb2NrX3QJQml0NjRSZWdMb2NrOwkvKiBGb3Igd3JpdGluZyA2NC1iaXQgYWRkcmVzc2VzICovCi0JUFNYR19IV19SRUdTCQkJCUh3UmVnczsJCQkJLy8gU2FoYXJhIEhXIFJlZ2lzdGVyIE1lbW9yeSAoQkFSMC8xKQotCVBTWEdfVUNPREVfUkVHUwkJCQlVY29kZVJlZ3M7CQkJLy8gTWljcm9jb2RlIFJlZ2lzdGVyIE1lbW9yeSAoQkFSMi8zKQotCVBTWEdfVENCX1JFR1MJCQkJVGNiUmVnczsJCQkvLyBTYW1lIGFzIFVjb2RlIHJlZ3MgLSBTZWUgc3hnaHcuaAorCXN0cnVjdCBTWEdfSFdfUkVHUwkJCSpId1JlZ3M7CQkJCS8vIFNhaGFyYSBIVyBSZWdpc3RlciBNZW1vcnkgKEJBUjAvMSkKKwlzdHJ1Y3QgU1hHX1VDT0RFX1JFR1MJCQkqVWNvZGVSZWdzOwkJCS8vIE1pY3JvY29kZSBSZWdpc3RlciBNZW1vcnkgKEJBUjIvMykKKwlzdHJ1Y3QgU1hHX1RDQl9SRUdTCQkJKlRjYlJlZ3M7CQkJLy8gU2FtZSBhcyBVY29kZSByZWdzIC0gU2VlIHN4Z2h3LmgKIAl1c2hvcnQJCQkJCQlSZXNldERwY0NvdW50OwkJLy8gRm9yIHRpbWVvdXQKIAl1c2hvcnQJCQkJCQlSc3NEcGNDb3VudDsJCS8vIEZvciB0aW1lb3V0CiAJdXNob3J0CQkJCQkJVmVuZG9ySUQ7CQkJLy8gVmVuZG9yIElECkBAIC02MTMsMjUgKzYwOCwyNSBAQAogCXUzMiAqCQkJCQlCdWZmZXJQb29sSGFuZGxlOwkvLyBVc2VkIHdpdGggTkRJUyA1LjIgb25seS4gIERvbid0IGlmZGVmIG91dAogCXUzMgkJCQkJCU1hY0ZpbHRlcjsJCQkvLyBORElTIE1BQyBGaWx0ZXIKIAl1c2hvcnQJCQkJCQlJcElkOwkJCQkvLyBGb3Igc2xvd3BhdGgKLQlQU1hHX0VWRU5UX1JJTkcJCQkJRXZlbnRSaW5nczsJCQkvLyBIb3N0IGV2ZW50IHJpbmdzLiAgMS9DUFUgdG8gMTYgbWF4CisJc3RydWN0IFNYR19FVkVOVF9SSU5HCQkJKkV2ZW50UmluZ3M7CQkJLy8gSG9zdCBldmVudCByaW5ncy4gIDEvQ1BVIHRvIDE2IG1heAogCWRtYV9hZGRyX3QgICAgICAgICAgICAgIAlQRXZlbnRSaW5nczsJCS8vIFBoeXNpY2FsIGFkZHJlc3MKIAl1MzIJCQkJCQlOZXh0RXZlbnRbU1hHX01BWF9SU1NdOwkvLyBDdXJyZW50IGxvY2F0aW9uIGluIHJpbmcKIAlkbWFfYWRkcl90ICAgICAgICAgIAkJUFRjYkJ1ZmZlcnM7CQkvLyBUQ0IgQnVmZmVycyAtIHBoeXNpY2FsIGFkZHJlc3MKIAlkbWFfYWRkcl90CSAgICAgICAgICAgIAlQVGNiQ29tcEJ1ZmZlcnM7CS8vIFRDQiBDb21wb3NpdGUgQnVmZmVycyAtIHBoeXMgYWRkcgotCVBTWEdfWE1UX1JJTkcJCQkJWG10UmluZ3M7CQkJLy8gVHJhbnNtaXQgcmluZ3MKKwlzdHJ1Y3QgU1hHX1hNVF9SSU5HCQkJCSpYbXRSaW5nczsJCQkvLyBUcmFuc21pdCByaW5ncwogCWRtYV9hZGRyX3QJCSAgICAgICAgICAgIFBYbXRSaW5nczsJCQkvLyBUcmFuc21pdCByaW5ncyAtIHBoeXNpY2FsIGFkZHJlc3MKLQlTWEdfUklOR19JTkZPCQkJCVhtdFJpbmdaZXJvSW5mbzsJLy8gVHJhbnNtaXQgcmluZyAwIGluZm8KKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTwkJCQlYbXRSaW5nWmVyb0luZm87CS8vIFRyYW5zbWl0IHJpbmcgMCBpbmZvCiAJc3BpbmxvY2tfdAlYbXRaZXJvTG9jazsJLyogVHJhbnNtaXQgcmluZyAwIGxvY2sgKi8KIAl1MzIgKgkJCQkJWG10UmluZ1plcm9JbmRleDsJLy8gU2hhcmVkIFhNVCByaW5nIDAgaW5kZXgKIAlkbWFfYWRkcl90ICAgICAgICAgIAkJUFhtdFJpbmdaZXJvSW5kZXg7CS8vIFNoYXJlZCBYTVQgcmluZyAwIGluZGV4IC0gcGh5c2ljYWwKLQlMSVNUX0VOVFJZCQkJCQlGcmVlUHJvdG9jb2xIZWFkZXJzOy8vIEZyZWUgcHJvdG9jb2wgaGVhZGVycworCXN0cnVjdCBMSVNUX0VOVFJZCQkJCQlGcmVlUHJvdG9jb2xIZWFkZXJzOy8vIEZyZWUgcHJvdG9jb2wgaGVhZGVycwogCXUzMgkJCQkJCUZyZWVQcm90b0hkckNvdW50OwkvLyBDb3VudAogCXZvaWQgKgkJCQkJCVByb3RvY29sSGVhZGVyczsJLy8gQmxvY2sgb2YgcHJvdG9jb2wgaGVhZGVyCiAJZG1hX2FkZHJfdAkgICAgICAgICAgICAJUFByb3RvY29sSGVhZGVyczsJLy8gQmxvY2sgb2YgcHJvdG9jb2wgaGVhZGVycyAtIHBoeXMKIAotCVBTWEdfUkNWX1JJTkcJCQkJUmN2UmluZ3M7CQkJLy8gUmVjZWl2ZSByaW5ncworCXN0cnVjdCBTWEdfUkNWX1JJTkcJCSpSY3ZSaW5nczsJCQkvLyBSZWNlaXZlIHJpbmdzCiAJZG1hX2FkZHJfdAkgICAgICAgICAgICAJUFJjdlJpbmdzOwkJCS8vIFJlY2VpdmUgcmluZ3MgLSBwaHlzaWNhbCBhZGRyZXNzCi0JU1hHX1JJTkdfSU5GTwkJCQlSY3ZSaW5nWmVyb0luZm87CS8vIFJlY2VpdmUgcmluZyAwIGluZm8KKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTwkJCQlSY3ZSaW5nWmVyb0luZm87CS8vIFJlY2VpdmUgcmluZyAwIGluZm8KIAogCXUzMiAqCQkJCQlJc3I7CQkJCS8vIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKIAlkbWFfYWRkcl90CSAgICAgICAgICAgIAlQSXNyOwkJCQkvLyBJU1IgLSBwaHlzaWNhbCBhZGRyZXNzCkBAIC02NDUsOSArNjQwLDkgQEAKIAl1MzIJCQkJCQlIYXNoSW5mb3JtYXRpb247CiAJLy8gUmVjZWl2ZSBidWZmZXIgcXVldWVzCiAJc3BpbmxvY2tfdAlSY3ZRTG9jazsJLyogUmVjZWl2ZSBRdWV1ZSBMb2NrICovCi0JTElTVF9FTlRSWQkJCQkJRnJlZVJjdkJ1ZmZlcnM7CQkvLyBGcmVlIFNYR19EQVRBX0JVRkZFUiBxdWV1ZQotCUxJU1RfRU5UUlkJCQkJCUZyZWVSY3ZCbG9ja3M7CQkvLyBGcmVlIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyBRCi0JTElTVF9FTlRSWQkJCQkJQWxsUmN2QmxvY2tzOwkJLy8gQWxsIFNYR19SQ1ZfQkxPQ0tzCisJc3RydWN0IExJU1RfRU5UUlkJCQkJCUZyZWVSY3ZCdWZmZXJzOwkJLy8gRnJlZSBTWEdfREFUQV9CVUZGRVIgcXVldWUKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJRnJlZVJjdkJsb2NrczsJCS8vIEZyZWUgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIFEKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJQWxsUmN2QmxvY2tzOwkJLy8gQWxsIFNYR19SQ1ZfQkxPQ0tzCiAJdXNob3J0CQkJCQkJRnJlZVJjdkJ1ZmZlckNvdW50OwkvLyBOdW1iZXIgb2YgZnJlZSByY3YgZGF0YSBidWZmZXJzCiAJdXNob3J0CQkJCQkJRnJlZVJjdkJsb2NrQ291bnQ7CS8vICMgb2YgZnJlZSByY3YgZGVzY3JpcHRvciBibG9ja3MKIAl1c2hvcnQJCQkJCQlBbGxSY3ZCbG9ja0NvdW50OwkvLyBOdW1iZXIgb2YgdG90YWwgcmVjZWl2ZSBibG9ja3MKQEAgLTY1Niw4ICs2NTEsOCBAQAogCXUzMgkJCQkJCVJjdkJ1ZmZlcnNPbkNhcmQ7CS8vIFNYR19EQVRBX0JVRkZFUlMgb3duZWQgYnkgY2FyZAogCS8vIFNHTCBidWZmZXJzCiAJc3BpbmxvY2tfdAlTZ2xRTG9jazsJLyogU0dMIFF1ZXVlIExvY2sgKi8KLQlMSVNUX0VOVFJZCQkJCQlGcmVlU2dsQnVmZmVyczsJCS8vIEZyZWUgU1hHX1NDQVRURVJfR0FUSEVSCi0JTElTVF9FTlRSWQkJCQkJQWxsU2dsQnVmZmVyczsJCS8vIEFsbCBTWEdfU0NBVFRFUl9HQVRIRVIKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJRnJlZVNnbEJ1ZmZlcnM7CQkvLyBGcmVlIFNYR19TQ0FUVEVSX0dBVEhFUgorCXN0cnVjdCBMSVNUX0VOVFJZCQkJCQlBbGxTZ2xCdWZmZXJzOwkJLy8gQWxsIFNYR19TQ0FUVEVSX0dBVEhFUgogCXVzaG9ydAkJCQkJCUZyZWVTZ2xCdWZmZXJDb3VudDsJLy8gTnVtYmVyIG9mIGZyZWUgU0dMIGJ1ZmZlcnMKIAl1c2hvcnQJCQkJCQlBbGxTZ2xCdWZmZXJDb3VudDsJLy8gTnVtYmVyIG9mIHRvdGFsIFNHTCBidWZmZXJzCiAJdTMyCQkJCQkJQ3VycmVudFRpbWU7CQkvLyBUaWNrIGNvdW50CkBAIC02NzksNyArNjc0LDcgQEAKIAkvLyBTdGF0cwogCXUzMgkJCQkJCVBlbmRpbmdSY3ZDb3VudDsJLy8gT3V0c3RhbmRpbmcgcmN2IGluZGljYXRpb25zCiAJdTMyCQkJCQkJUGVuZGluZ1htdENvdW50OwkvLyBPdXRzdGFuZGluZyBzZW5kIHJlcXVlc3RzCi0JU1hHX1NUQVRTCQkJCQlTdGF0czsJCQkJLy8gU3RhdGlzdGljcworCXN0cnVjdCBTWEdfU1RBVFMJCQkJU3RhdHM7CQkJCS8vIFN0YXRpc3RpY3MKIAl1MzIJCQkJCQlSZWFzc0J1ZnM7CQkJLy8gTnVtYmVyIG9mIHJlYXNzZW1ibHkgYnVmZmVycwogCS8vIENhcmQgQ3Jhc2ggSW5mbwogCXVzaG9ydAkJCQkJCUNyYXNoTG9jYXRpb247CQkvLyBNaWNyb2NvZGUgY3Jhc2ggbG9jYXRpb24KQEAgLTcwOCw3ICs3MDMsNyBAQAogCS8vCWRtYV9hZGRyX3QJCVBEdW1wQnVmZmVyOwkJLy8gUGh5c2ljYWwgYWRkcmVzcwogCS8vI2VuZGlmIC8vIFNYR19GQUlMVVJFX0RVTVAKIAotfSBhZGFwdGVyX3QsICpwX2FkYXB0ZXJfdDsKK307CiAKICNpZiBTTElDX0RVTVBfRU5BQkxFRAogI2RlZmluZSBTTElDX0RVTVBfUkVRVUVTVEVEICAgICAgMQpAQCAtNzIxLDEwICs3MTYsMTAgQEAKICAqIHN0cnVjdHVyZSBpcyB3cml0dGVuIG91dCB0byB0aGUgY2FyZCdzIFNSQU0gd2hlbiB0aGUgbWljcm9jb2RlIHBhbmljJ3MuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfc2xpY19jcmFzaF9pbmZvIHsKK3N0cnVjdCBzbGljX2NyYXNoX2luZm8gewogICAgIHVzaG9ydCAgY3B1X2lkOwogICAgIHVzaG9ydCAgY3Jhc2hfcGM7Ci19IHNsaWNfY3Jhc2hfaW5mbywgKnBfc2xpY19jcmFzaF9pbmZvOworfTsKIAogI2RlZmluZSBDUkFTSF9JTkZPX09GRlNFVCAgIDB4MTU1QwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z19vcy5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdfb3MuaAppbmRleCAwMTE4MjY4Li42ZDNmMjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z19vcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnX29zLmgKQEAgLTQ0LDEwICs0NCwxMCBAQAogI2RlZmluZSBGQUxTRQkoMCkKICNkZWZpbmUgVFJVRQkoMSkKIAotdHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUlkgewotCXN0cnVjdCBfTElTVF9FTlRSWSAqbmxlX2ZsaW5rOwotCXN0cnVjdCBfTElTVF9FTlRSWSAqbmxlX2JsaW5rOwotfSBsaXN0X2VudHJ5LCBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7CitzdHJ1Y3QgTElTVF9FTlRSWSB7CisJc3RydWN0IExJU1RfRU5UUlkgKm5sZV9mbGluazsKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqbmxlX2JsaW5rOworfTsKIAogI2RlZmluZSBJbml0aWFsaXplTGlzdEhlYWQobCkgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAobCktPm5sZV9mbGluayA9IChsKS0+bmxlX2JsaW5rID0gKGwpCkBAIC02OCwxMCArNjgsMTAgQEAKIAogLyogVGhlc2UgdHdvIGhhdmUgdG8gYmUgaW5saW5lZCBzaW5jZSB0aGV5IHJldHVybiB0aGluZ3MuICovCiAKLXN0YXRpYyBfX2lubGluZSBQTElTVF9FTlRSWSBSZW1vdmVIZWFkTGlzdChsaXN0X2VudHJ5ICogbCkKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgTElTVF9FTlRSWSAqUmVtb3ZlSGVhZExpc3Qoc3RydWN0IExJU1RfRU5UUlkgKmwpCiB7Ci0JbGlzdF9lbnRyeSAqZjsKLQlsaXN0X2VudHJ5ICplOworCXN0cnVjdCBMSVNUX0VOVFJZICpmOworCXN0cnVjdCBMSVNUX0VOVFJZICplOwogCiAJZSA9IGwtPm5sZV9mbGluazsKIAlmID0gZS0+bmxlX2ZsaW5rOwpAQCAtODEsMTAgKzgxLDEwIEBACiAJcmV0dXJuIChlKTsKIH0KIAotc3RhdGljIF9faW5saW5lIFBMSVNUX0VOVFJZIFJlbW92ZVRhaWxMaXN0KGxpc3RfZW50cnkgKiBsKQorc3RhdGljIF9faW5saW5lIHN0cnVjdCBMSVNUX0VOVFJZICpSZW1vdmVUYWlsTGlzdChzdHJ1Y3QgTElTVF9FTlRSWSAqbCkKIHsKLQlsaXN0X2VudHJ5ICpiOwotCWxpc3RfZW50cnkgKmU7CisJc3RydWN0IExJU1RfRU5UUlkgKmI7CisJc3RydWN0IExJU1RfRU5UUlkgKmU7CiAKIAllID0gbC0+bmxlX2JsaW5rOwogCWIgPSBlLT5ubGVfYmxpbms7CkBAIC05Niw3ICs5Niw3IEBACiAKICNkZWZpbmUgSW5zZXJ0VGFpbExpc3QobCwgZSkgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBsaXN0X2VudHJ5ICAgICAgICAgICAgICAqYjsgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgTElTVF9FTlRSWSAgICAgICAqYjsgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBiID0gKGwpLT5ubGVfYmxpbms7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAoZSktPm5sZV9mbGluayA9IChsKTsgICAgICAgICAgIFwKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiAjZGVmaW5lIEluc2VydEhlYWRMaXN0KGwsIGUpICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGlzdF9lbnRyeSAgICAgICAgICAgICAgKmY7ICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IExJU1RfRU5UUlkgICAgICAgKmY7ICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgZiA9IChsKS0+bmxlX2ZsaW5rOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgKGUpLT5ubGVfZmxpbmsgPSBmOyAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2RiZy5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdkYmcuaAppbmRleCA0NTIyYjhkLi5iYjU4ZGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2RiZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnZGJnLmgKQEAgLTg2LDcgKzg2LDcgQEAKICAqIG5lZWRzIG9mIHRoZSB0cmFjZSBlbnRyeS4gIFR5cGljYWxseSB0aGV5IGFyZSBmdW5jdGlvbiBjYWxsCiAgKiBwYXJhbWV0ZXJzLgogICovCi10eXBlZGVmIHN0cnVjdCBfdHJhY2VfZW50cnlfcyB7CitzdHJ1Y3QgdHJhY2VfZW50cnlfdCB7CiAgICAgICAgIGNoYXIgICAgICBuYW1lWzhdOyAgICAgICAgLyogOCBjaGFyYWN0ZXIgbmFtZSAtIGxpa2UgJ3MnaSdtJ2InYSdyJ2MndicgKi8KICAgICAgICAgdTMyICAgdGltZTsgICAgICAgICAgIC8qIEN1cnJlbnQgY2xvY2sgdGljICovCiAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgIGNwdTsgICAgICAgICAgICAvKiBDdXJyZW50IENQVSAqLwpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICB1MzIgICBhcmcyOyAgICAgICAgICAgLyogQ2FsbGVyIGFyZzIgKi8KICAgICAgICAgdTMyICAgYXJnMzsgICAgICAgICAgIC8qIENhbGxlciBhcmczICovCiAgICAgICAgIHUzMiAgIGFyZzQ7ICAgICAgICAgICAvKiBDYWxsZXIgYXJnNCAqLwotfSB0cmFjZV9lbnRyeV90LCAqcHRyYWNlX2VudHJ5X3Q7Cit9OwogCiAvKgogICogRHJpdmVyIHR5cGVzIGZvciBkcml2ZXIgZmllbGQgaW4gdHJhY2VfZW50cnlfdApAQCAtMTA4LDE0ICsxMDgsMTMgQEAKIAogI2RlZmluZSBUUkFDRV9FTlRSSUVTICAgMTAyNAogCi10eXBlZGVmIHN0cnVjdCBfc3hnX3RyYWNlX2J1ZmZlcl90Ci17CitzdHJ1Y3Qgc3hnX3RyYWNlX2J1ZmZlcl90IHsKICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAgICAgICAgIC8qIGFpZCBmb3Igd2luZGJnIGV4dGVuc2lvbiAqLwogICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIGluOyAgICAgICAgICAgICAgICAgICAgLyogV2hlcmUgdG8gYWRkICovCiAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgbGV2ZWw7ICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IFRyYWNlIGxldmVsICovCiAJc3BpbmxvY2tfdAlsb2NrOyAgICAgICAgICAgICAgICAgIC8qIEZvciBNUCB0cmFjaW5nICovCi0gICAgICAgIHRyYWNlX2VudHJ5X3QgICAgICAgICAgIGVudHJpZXNbVFJBQ0VfRU5UUklFU107LyogVGhlIGNpcmN1bGFyIGJ1ZmZlciAqLwotfSBzeGdfdHJhY2VfYnVmZmVyX3Q7CisgICAgICAgIHN0cnVjdCB0cmFjZV9lbnRyeV90ICAgICAgICAgICBlbnRyaWVzW1RSQUNFX0VOVFJJRVNdOy8qIFRoZSBjaXJjdWxhciBidWZmZXIgKi8KK307CiAKIC8qCiAgKiBUaGUgdHJhY2UgbGV2ZWxzCkBAIC0xMzcsNyArMTM2LDcgQEAKICNpZiBBVEtfVFJBQ0VfRU5BQkxFRAogI2RlZmluZSBTWEdfVFJBQ0VfSU5JVChidWZmZXIsIHRsZXZlbCkJCQkJXAogewkJCQkJCQkJXAotCW1lbXNldCgoYnVmZmVyKSwgMCwgc2l6ZW9mKHN4Z190cmFjZV9idWZmZXJfdCkpOwlcCisJbWVtc2V0KChidWZmZXIpLCAwLCBzaXplb2Yoc3RydWN0IHN4Z190cmFjZV9idWZmZXJfdCkpOwlcCiAJKGJ1ZmZlciktPmxldmVsID0gKHRsZXZlbCk7CQkJCVwKIAkoYnVmZmVyKS0+c2l6ZSA9IFRSQUNFX0VOVFJJRVM7CQkJCVwKIAlzcGluX2xvY2tfaW5pdCgmKGJ1ZmZlciktPmxvY2spOwkJCVwKQEAgLTE1NCw3ICsxNTMsNyBAQAogICAgICAgICBpZiAoKGJ1ZmZlcikgJiYgKChidWZmZXIpLT5sZXZlbCA+PSAodGxldmVsKSkpIHsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIHRyYWNlX2lycWwgPSAwOyAgICAvKiA/Pz8/Pz8gRklYIFRISVMgICovICAgIFwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICB0cmFjZV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgcHRyYWNlX2VudHJ5X3QgIHRyYWNlX2VudHJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJhY2VfZW50cnlfdAkqdHJhY2VfZW50cnk7CQkJCVwKICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgdGltZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCYoYnVmZmVyKS0+bG9jayk7ICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2hpZi5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdoaWYuaAppbmRleCA4OGJmZmJhLi5hNGU5NDY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdoaWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2hpZi5oCkBAIC0xMiw3ICsxMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVUNPREUgUmVnaXN0ZXJzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IF9TWEdfVUNPREVfUkVHUyB7CitzdHJ1Y3QgU1hHX1VDT0RFX1JFR1MgewogCS8vIEFkZHJlc3MgMCAtIDB4M0YgPSBDb21tYW5kIGNvZGVzIDAtMTUgZm9yIFRDQiAwLiAgRXhjb2RlIDAKIAl1MzIgSWNyOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMCAtIEludCBjb250cm9sCiAJdTMyIFJzdmRSZWcxOwkJLy8gQ29kZSA9IDEgLSBUT0UgLU5BCkBAIC0xMjcsNyArMTI3LDcgQEAKIAkvLyBiYXNlLiAgQXMgZXh0ZW5kZWQgY29kZXMgYXJlIGFkZGVkLCByZWR1Y2UgdGhlIGZpcnN0IGFycmF5IHZhbHVlIGluCiAJLy8gdGhlIGZvbGxvd2luZyBmaWVsZAogCXUzMiBQYWRUb05leHRDcHVbOTRdWzE2XTsJLy8gOTQgPSAxMjggLSAzNCAoMzQgPSBFeGNvZGVzIDAgLSAzMykKLX0gU1hHX1VDT0RFX1JFR1MsICpQU1hHX1VDT0RFX1JFR1M7Cit9OwogCiAvLyBJbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAoMCkgdmFsdWVzCiAjZGVmaW5lIFNYR19JQ1JfRElTQUJMRQkJCQkJMHgwMDAwMDAwMApAQCAtMTY5LDcgKzE2OSw3IEBACiAgKiBpcyBoYXBwZW5pbmcgaXMgdGhhdCB0aGVzZSByZWdpc3RlcnMgb2NjdXB5IHRoZSAiUGFkRXhbMTVdIiBhcmVhcyBpbiB0aGUKICAqIFNYR19VQ09ERV9SRUdTIGRlZmluaXRpb24gYWJvdmUKICAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NYR19UQ0JfUkVHUyB7CitzdHJ1Y3QgU1hHX1RDQl9SRUdTIHsKIAl1MzIgRXhDb2RlOwkJLyogRXh0ZW5kZWQgY29kZXMgLSBzZWUgU1hHX1VDT0RFX1JFR1MgKi8KIAl1MzIgWG10OwkJLyogQ29kZSA9IDEgLSAjIG9mIFhtdCBkZXNjcmlwdG9ycyBhZGRlZCB0byByaW5nICovCiAJdTMyIFJjdjsJCS8qIENvZGUgPSAyIC0gIyBvZiBSY3YgZGVzY3JpcHRvcnMgYWRkZWQgdG8gcmluZyAqLwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJdTMyIFJzdmQ0OwkJLyogQ29kZSA9IDcgLSBUT0UgTkEgKi8KIAl1MzIgUnN2ZDU7CQkvKiBDb2RlID0gOCAtIFRPRSBOQSAqLwogCXUzMiBQYWRbN107CQkvKiBDb2RlcyA4LTE1IC0gTm90IHVzZWQuICovCi19IFNYR19UQ0JfUkVHUywgKlBTWEdfVENCX1JFR1M7Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJU1IgRm9ybWF0CkBAIC0yNzIsNyArMjcyLDcgQEAKICAqCiAgKi8KICNwcmFnbWEgcGFjayhwdXNoLCAxKQotdHlwZWRlZiBzdHJ1Y3QgX1NYR19FVkVOVCB7CitzdHJ1Y3QgU1hHX0VWRU5UIHsKIAl1MzIgUGFkWzFdOwkJLy8gbm90IHVzZWQKIAl1MzIgU25kVW5hOwkJLy8gU25kVW5hIHZhbHVlCiAJdTMyIFJlc2lkOwkJLy8gcmVjZWl2ZSBNREwgcmVzaWQKQEAgLTI5NCw3ICsyOTQsNyBAQAogCXVuc2lnbmVkIGNoYXIgQ29kZTsJLy8gRXZlbnQgY29kZQogCXVuc2lnbmVkIGNoYXIgQ29tbWFuZEluZGV4OwkvLyBOZXcgcmluZyBpbmRleAogCXVuc2lnbmVkIGNoYXIgU3RhdHVzOwkvLyBFdmVudCBzdGF0dXMKLX0gU1hHX0VWRU5ULCAqUFNYR19FVkVOVDsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAvLyBFdmVudCBjb2RlIGRlZmluaXRpb25zCkBAIC0zMjEsOSArMzIxLDkgQEAKICNkZWZpbmUgRVZFTlRfUklOR19CQVRDSAkxNgkvLyBIYW5kIGVudHJpZXMgYmFjayAxNiBhdCBhIHRpbWUuCiAjZGVmaW5lIEVWRU5UX0JBVENIX0xJTUlUCTI1NgkvLyBTdG9wIHByb2Nlc3NpbmcgZXZlbnRzIGFmdGVyIDI1NiAoMTYgKiAxNikKIAotdHlwZWRlZiBzdHJ1Y3QgX1NYR19FVkVOVF9SSU5HIHsKLQlTWEdfRVZFTlQgUmluZ1tFVkVOVF9SSU5HX1NJWkVdOwotfSBTWEdfRVZFTlRfUklORywgKlBTWEdfRVZFTlRfUklORzsKK3N0cnVjdCBTWEdfRVZFTlRfUklORyB7CisJc3RydWN0IFNYR19FVkVOVCBSaW5nW0VWRU5UX1JJTkdfU0laRV07Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDAwLDEyICs0MDAsMTIgQEAKICNkZWZpbmUgU1hHX01BWF9FTlRSSUVTICAgICA0MDk2CiAKIC8vIFN0cnVjdHVyZSBhbmQgbWFjcm9zIHRvIG1hbmFnZSBhIHJpbmcKLXR5cGVkZWYgc3RydWN0IF9TWEdfUklOR19JTkZPIHsKK3N0cnVjdCBTWEdfUklOR19JTkZPIHsKIAl1bnNpZ25lZCBjaGFyIEhlYWQ7CS8vIFdoZXJlIHdlIGFkZCBlbnRyaWVzIC0gTm90ZSB1bnNpZ25lZCBjaGFyOlJJTkdfU0laRQogCXVuc2lnbmVkIGNoYXIgVGFpbDsJLy8gV2hlcmUgd2UgcHVsbCBvZmYgY29tcGxldGVkIGVudHJpZXMKIAl1c2hvcnQgU2l6ZTsJCS8vIFJpbmcgc2l6ZSAtIE11c3QgYmUgbXVsdGlwbGUgb2YgMgogCXZvaWQgKkNvbnRleHRbU1hHX01BWF9SSU5HX1NJWkVdOwkvLyBTaGFkb3cgcmluZwotfSBTWEdfUklOR19JTkZPLCAqUFNYR19SSU5HX0lORk87Cit9OwogCiAjZGVmaW5lIFNYR19JTklUSUFMSVpFX1JJTkcoX3JpbmcsIF9zaXplKSB7CQkJCQkJCVwKIAkoX3JpbmcpLkhlYWQgPSAwOwkJCQkJCQkJCQkJCVwKQEAgLTQ4MSw3ICs0ODEsNyBAQAogICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MjgJCTB4MWMKICAqLwogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi10eXBlZGVmIHN0cnVjdCBfU1hHX0NNRCB7CitzdHJ1Y3QgU1hHX0NNRCB7CiAJZG1hX2FkZHJfdCBTZ2w7CQkvLyBQaHlzaWNhbCBhZGRyZXNzIG9mIFNHTAogCXVuaW9uIHsKIAkJc3RydWN0IHsKQEAgLTUxOCwxNCArNTE4LDE0IEBACiAJCQl1bnNpZ25lZCBjaGFyIE5vdFVzZWQ7CiAJCX0gU3RhdHVzOwogCX07Ci19IFNYR19DTUQsICpQU1hHX0NNRDsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9WTEFOX0hEUiB7CitzdHJ1Y3QgVkxBTl9IRFIgewogCXVzaG9ydCBWbGFuVGNpOwogCXVzaG9ydCBWbGFuVHBpZDsKLX0gVkxBTl9IRFIsICpQVkxBTl9IRFI7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLyoKQEAgLTU2NCwyMiArNTY0LDIyIEBACiAjZGVmaW5lIFNYR19TTE9XQ01EX0NTVU1fVENQCQkweDAyCS8vIENoZWNrc3VtIFRDUAogI2RlZmluZSBTWEdfU0xPV0NNRF9MU08JCQkJMHgwNAkvLyBMYXJnZSBzZWdtZW50IHNlbmQKIAotdHlwZWRlZiBzdHJ1Y3QgX1NYR19YTVRfUklORyB7Ci0JU1hHX0NNRCBEZXNjcmlwdG9yc1tTWEdfWE1UX1JJTkdfU0laRV07Ci19IFNYR19YTVRfUklORywgKlBTWEdfWE1UX1JJTkc7CitzdHJ1Y3QgU1hHX1hNVF9SSU5HIHsKKwlzdHJ1Y3QgU1hHX0NNRCBEZXNjcmlwdG9yc1tTWEdfWE1UX1JJTkdfU0laRV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9SSU5HIHsKLQlTWEdfQ01EIERlc2NyaXB0b3JzW1NYR19SQ1ZfUklOR19TSVpFXTsKLX0gU1hHX1JDVl9SSU5HLCAqUFNYR19SQ1ZfUklORzsKK3N0cnVjdCBTWEdfUkNWX1JJTkcgeworCXN0cnVjdCBTWEdfQ01EIERlc2NyaXB0b3JzW1NYR19SQ1ZfUklOR19TSVpFXTsKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNoYXJlIG1lbW9yeSBidWZmZXIgdHlwZXMgLSBVc2VkIHRvIGlkZW50aWZ5IGFzeW5jaHJvbm91cwogICogc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKK2VudW0gU1hHX0JVRkZFUl9UWVBFIHsKIAlTWEdfQlVGRkVSX1RZUEVfUkNWLAkvLyBSZWNlaXZlIGJ1ZmZlcgogCVNYR19CVUZGRVJfVFlQRV9TR0wJLy8gU0dMIGJ1ZmZlcgotfSBTWEdfQlVGRkVSX1RZUEU7Cit9OwogCiAvLyBTdGF0ZSBmb3IgU1hHIGJ1ZmZlcnMKICNkZWZpbmUgU1hHX0JVRkZFUl9GUkVFCQkweDAxCkBAIC02NzAsMTkgKzY3MCwxOSBAQAogI2RlZmluZSBTWEdfTUFYX1JDVl9CTE9DS1MJCQkJMTI4CS8vID0gMTYzODQgcmVjZWl2ZSBidWZmZXJzCiAKIC8vIFJlY2VpdmUgYnVmZmVyIGhlYWRlcgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfREFUQV9CVUZGRVJfSERSIHsKK3N0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiB7CiAJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CS8vIEJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzCiAJLy8gTm90ZSAtIERPIE5PVCBVU0UgdGhlIFZpcnR1YWxBZGRyZXNzIGZpZWxkIHRvIGxvY2F0ZSBkYXRhLgogCS8vIFVzZSB0aGUgc3hnLmg6U1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTiBtYWNybyBpbnN0ZWFkLgogCXZvaWQgKlZpcnR1YWxBZGRyZXNzOwkvLyBTdGFydCBvZiBidWZmZXIKLQlMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIHF1ZXVlIG9mIGJ1ZmZlcnMKLQlzdHJ1Y3QgX1NYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpOZXh0OwkvLyBGYXN0cGF0aCBkYXRhIGJ1ZmZlciBxdWV1ZQorCXN0cnVjdCBMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIHF1ZXVlIG9mIGJ1ZmZlcnMKKwlzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgKk5leHQ7CS8vIEZhc3RwYXRoIGRhdGEgYnVmZmVyIHF1ZXVlCiAJdTMyIFNpemU7CQkvLyBCdWZmZXIgc2l6ZQogCXUzMiBCeXRlT2Zmc2V0OwkJLy8gU2VlIFNYR19SRVNUT1JFX01ETF9PRkZTRVQKIAl1bnNpZ25lZCBjaGFyIFN0YXRlOwkvLyBTZWUgU1hHX0JVRkZFUiBzdGF0ZSBhYm92ZQogCXVuc2lnbmVkIGNoYXIgU3RhdHVzOwkvLyBFdmVudCBzdGF0dXMgKHRvIGxvZyBQVVNIKQogCXN0cnVjdCBza19idWZmICpza2I7CS8vIERvdWJsZSBtYXBwZWQgKG5ibCBhbmQgcGt0KQotfSBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiwgKlBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUjsKK307CiAKIC8vIFN4Z1Nsb3dSZWNlaXZlIHVzZXMgdGhlIFBBQ0tFVCAoc2tiKSBjb250YWluZWQKIC8vIGluIHRoZSBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiB3aGVuIGluZGljYXRpbmcgZHVtYi1uaWMgZGF0YQpAQCAtNjkzLDQyICs2OTMsNDMgQEAKICNkZWZpbmUgU1hHX1JDVl9KVU1CT19CVUZGRVJfU0laRQkJMTAyNDAJLy8ganVtYm8gPSAxMGsgaW5jbHVkaW5nIEhEUgogCiAvLyBSZWNlaXZlIGRhdGEgZGVzY3JpcHRvcgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfREFUQV9ERVNDUklQVE9SIHsKK3N0cnVjdCBTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiB7CiAJdW5pb24gewogCQlzdHJ1Y3Qgc2tfYnVmZiAqVmlydHVhbEFkZHJlc3M7CS8vIEhvc3QgaGFuZGxlCiAJCXU2NCBGb3JjZVRvOEJ5dGVzOwkvLyBGb3JjZSB4ODYgdG8gOC1ieXRlIGJvdW5kYXJ5CiAJfTsKIAlkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsKLX0gU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1IsICpQU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1I7Cit9OwogCiAvLyBSZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sKICNkZWZpbmUgU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0sJCTEyOAogI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfU0laRQkJMjA0OAkvLyBGb3Igc2FuaXR5IGNoZWNrCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIHsKLQlTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiBEZXNjcmlwdG9yc1tTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DS107Ci19IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSywgKlBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0s7CisKK3N0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgeworCXN0cnVjdCBTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiBEZXNjcmlwdG9yc1tTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DS107Cit9OwogCiAvLyBSZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sgaGVhZGVyCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiB7CitzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiB7CiAJdm9pZCAqVmlydHVhbEFkZHJlc3M7CS8vIFN0YXJ0IG9mIDJrIGJ1ZmZlcgogCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOwkvLyAuLmFuZCBpdCdzIHBoeXNpY2FsIGFkZHJlc3MKLQlMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIHF1ZXVlIG9mIGRlc2NyaXB0b3IgYmxvY2tzCisJc3RydWN0IExJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgcXVldWUgb2YgZGVzY3JpcHRvciBibG9ja3MKIAl1bnNpZ25lZCBjaGFyIFN0YXRlOwkvLyBTZWUgU1hHX0JVRkZFUiBzdGF0ZSBhYm92ZQotfSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSLCAqUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFI7Cit9OwogCiAvLyBSZWNlaXZlIGJsb2NrIGhlYWRlcgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfQkxPQ0tfSERSIHsKK3N0cnVjdCBTWEdfUkNWX0JMT0NLX0hEUiB7CiAJdm9pZCAqVmlydHVhbEFkZHJlc3M7CS8vIFN0YXJ0IG9mIHZpcnR1YWwgbWVtb3J5CiAJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CS8vIC4uYW5kIGl0J3MgcGh5c2ljYWwgYWRkcmVzcwotCUxJU1RfRU5UUlkgQWxsTGlzdDsJLy8gUXVldWUgb2YgYWxsIFNYR19SQ1ZfQkxPQ0tTCi19IFNYR19SQ1ZfQkxPQ0tfSERSLCAqUFNYR19SQ1ZfQkxPQ0tfSERSOworCXN0cnVjdCBMSVNUX0VOVFJZIEFsbExpc3Q7CS8vIFF1ZXVlIG9mIGFsbCBTWEdfUkNWX0JMT0NLUworfTsKIAogLy8gTWFjcm9zIHRvIGRldGVybWluZSBkYXRhIHN0cnVjdHVyZSBvZmZzZXRzIGludG8gcmVjZWl2ZSBibG9jawogI2RlZmluZSBTWEdfUkNWX0JMT0NLX1NJWkUoX0J1ZmZlcnNpemUpIAkJCQkJXAogCSgoKF9CdWZmZXJzaXplKSAqIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLKSArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSkgICAgICAgICAgICAgICsJCVwKLQkgKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSkgICAgICAgICAgKwkJXAotCSAoc2l6ZW9mKFNYR19SQ1ZfQkxPQ0tfSERSKSkpCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpICAgICAgICAgICAgICArCQlcCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIpKSAgICAgICAgICArCQlcCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfQkxPQ0tfSERSKSkpCiAjZGVmaW5lIFNYR19SQ1ZfQlVGRkVSX0RBVEFfU0laRShfQnVmZmVyc2l6ZSkJCQkJXAogCSgoX0J1ZmZlcnNpemUpIC0gU1hHX1JDVl9EQVRBX0hEUl9TSVpFKQogI2RlZmluZSBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUl9PRkZTRVQoX0J1ZmZlcnNpemUpCQkJXApAQCAtNzM3LDE4ICs3MzgsMTggQEAKIAkoKF9CdWZmZXJzaXplKSAqIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLKQogI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJXAogCSgoKF9CdWZmZXJzaXplKSAqIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLKSArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSkpCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpKQogI2RlZmluZSBTWEdfUkNWX0JMT0NLX0hEUl9PRkZTRVQoX0J1ZmZlcnNpemUpCQkJCVwKIAkoKChfQnVmZmVyc2l6ZSkgKiBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSykgKwkJXAotCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpICAgICAgICAgICAgICArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUikpKQorCSAoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spKSAgICAgICAgICAgICAgKwkJXAorCSAoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSkpCiAKIC8vIFVzZSB0aGUgbWluaXBvcnQgcmVzZXJ2ZWQgcG9ydGlvbiBvZiB0aGUgTkJMIHRvIGxvY2F0ZQogLy8gb3VyIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIHN0cnVjdHVyZS4KLXR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX05CTF9SRVNFUlZFRCB7Ci0JUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIFJjdkRhdGFCdWZmZXJIZHI7CitzdHJ1Y3QgU1hHX1JDVl9OQkxfUkVTRVJWRUQgeworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKIAl2b2lkICpBdmFpbGFibGU7Ci19IFNYR19SQ1ZfTkJMX1JFU0VSVkVELCAqUFNYR19SQ1ZfTkJMX1JFU0VSVkVEOworfTsKIAogI2RlZmluZSBTWEdfUkNWX05CTF9CVUZGRVJfSERSKF9OQkwpICgoKFBTWEdfUkNWX05CTF9SRVNFUlZFRClORVRfQlVGRkVSX0xJU1RfTUlOSVBPUlRfUkVTRVJWRUQoX05CTCkpLT5SY3ZEYXRhQnVmZmVySGRyKQogCkBAIC03NjAsMTEgKzc2MSwxMSBAQAogI2RlZmluZSBTWEdfTUFYX1NHTF9CVUZGRVJTCQkJMTYzODQJLy8gTWF4aW11bSB0byBhbGxvY2F0ZSAobm90ZSBBREFQVDp1c2hvcnQpCiAKIC8vIFNlbGYgaWRlbnRpZnlpbmcgc3RydWN0dXJlIHR5cGUKLXR5cGVkZWYgZW51bSBfU1hHX1NHTF9UWVBFIHsKK2VudW0gU1hHX1NHTF9UWVBFIHsKIAlTWEdfU0dMX0RVTUIsCQkvLyBEdW1iIE5JQyBTR0wKIAlTWEdfU0dMX1NMT1csCQkvLyBTbG93cGF0aCBwcm90b2NvbCBoZWFkZXIgLSBzZWUgYmVsb3cKIAlTWEdfU0dMX0NISU1ORVkJCS8vIENoaW1uZXkgb2ZmbG9hZCBTR0wKLX0gU1hHX1NHTF9UWVBFLCBQU1hHX1NHTF9UWVBFOworfTsKIAogLy8gTm90ZSAtIHRoZSBkZXNjcmlwdGlvbiBiZWxvdyBpcyBNaWNyb3NvZnQgc3BlY2lmaWMKIC8vCkBAIC03OTgsNDEgKzc5OSw0MSBAQAogLy8gdG8gdGhlIGNhcmQgZGlyZWN0bHkuICBGb3IgeDg2IHN5c3RlbXMgd2UgbXVzdCByZWNvbnN0cnVjdAogLy8gdGhlIFNHTC4gIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgYW4geDY0CiAvLyBmb3JtYXR0ZWQgU0dMIGVudHJ5Ci10eXBlZGVmIHN0cnVjdCBfU1hHX1g2NF9TR0Ugeworc3RydWN0IFNYR19YNjRfU0dFIHsKIAlkbWE2NF9hZGRyX3QgQWRkcmVzczsJLy8gc2FtZSBhcyB3ZG0uaAogCXUzMiBMZW5ndGg7CQkvLyBzYW1lIGFzIHdkbS5oCiAJdTMyIENvbXBpbGVyUGFkOwkvLyBUaGUgY29tcGlsZXIgcGFkcyB0byA4LWJ5dGVzCiAJdTY0IFJlc2VydmVkOwkJLy8gdTMyICogaW4gd2RtLmguICBGb3JjZSB0byA4IGJ5dGVzCi19IFNYR19YNjRfU0dFLCAqUFNYR19YNjRfU0dFOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgeworc3RydWN0IFNDQVRURVJfR0FUSEVSX0VMRU1FTlQgewogCWRtYTY0X2FkZHJfdCBBZGRyZXNzOwkvLyBzYW1lIGFzIHdkbS5oCiAJdTMyIExlbmd0aDsJCS8vIHNhbWUgYXMgd2RtLmgKIAl1MzIgQ29tcGlsZXJQYWQ7CS8vIFRoZSBjb21waWxlciBwYWRzIHRvIDgtYnl0ZXMKIAl1NjQgUmVzZXJ2ZWQ7CQkvLyB1MzIgKiBpbiB3ZG0uaC4gIEZvcmNlIHRvIDggYnl0ZXMKLX0gU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCwgKlBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NDQVRURVJfR0FUSEVSX0xJU1Qgeworc3RydWN0IFNDQVRURVJfR0FUSEVSX0xJU1QgewogCXUzMiBOdW1iZXJPZkVsZW1lbnRzOwogCXUzMiAqUmVzZXJ2ZWQ7Ci0JU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCBFbGVtZW50c1tdOwotfSBTQ0FUVEVSX0dBVEhFUl9MSVNULCAqUFNDQVRURVJfR0FUSEVSX0xJU1Q7CisJc3RydWN0IFNDQVRURVJfR0FUSEVSX0VMRU1FTlQgRWxlbWVudHNbXTsKK307CiAKIC8vIFRoZSBjYXJkIGRvZXNuJ3QgY2FyZSBhYm91dCBhbnl0aGluZyBleGNlcHQgZWxlbWVudHMsIHNvCiAvLyB3ZSBjYW4gbGVhdmUgdGhlIHUzMiAqIHJlc2VydmVkIGZpZWxkIGFsb25lIGluIHRoZSBmb2xsb3dpbmcKIC8vIFNHTCBzdHJ1Y3R1cmUuICBCdXQgcmVkZWZpbmUgZnJvbSB3ZG0uaDpTQ0FUVEVSX0dBVEhFUl9MSVNUIHNvCiAvLyB3ZSBjYW4gc3BlY2lmeSBTWEdfWDY0X1NHRSBhbmQgZGVmaW5lIGEgZml4ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi10eXBlZGVmIHN0cnVjdCBfU1hHX1g2NF9TR0wgeworc3RydWN0IFNYR19YNjRfU0dMIHsKIAl1MzIgTnVtYmVyT2ZFbGVtZW50czsKIAl1MzIgKlJlc2VydmVkOwotCVNYR19YNjRfU0dFIEVsZW1lbnRzW1NYR19TR0xfRU5UUklFU107Ci19IFNYR19YNjRfU0dMLCAqUFNYR19YNjRfU0dMOworCXN0cnVjdCBTWEdfWDY0X1NHRSBFbGVtZW50c1tTWEdfU0dMX0VOVFJJRVNdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NYR19TQ0FUVEVSX0dBVEhFUiB7Ci0JU1hHX1NHTF9UWVBFIFR5cGU7CS8vIEZJUlNUISBEdW1iLW5pYyBvciBvZmZsb2FkCitzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSIHsKKwllbnVtIFNYR19TR0xfVFlQRSBUeXBlOwkvLyBGSVJTVCEgRHVtYi1uaWMgb3Igb2ZmbG9hZAogCXZvaWQgKmFkYXB0ZXI7CQkvLyBCYWNrIHBvaW50ZXIgdG8gYWRhcHRlcgotCUxJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgU1hHX1NDQVRURVJfR0FUSEVSIGJsb2NrcwotCUxJU1RfRU5UUlkgQWxsTGlzdDsJLy8gQWxsIFNYR19TQ0FUVEVSX0dBVEhFUiBibG9ja3MKKwlzdHJ1Y3QgTElTVF9FTlRSWSBGcmVlTGlzdDsJLy8gRnJlZSBTWEdfU0NBVFRFUl9HQVRIRVIgYmxvY2tzCisJc3RydWN0IExJU1RfRU5UUlkgQWxsTGlzdDsJLy8gQWxsIFNYR19TQ0FUVEVSX0dBVEhFUiBibG9ja3MKIAlkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsJLy8gcGh5c2ljYWwgYWRkcmVzcwogCXVuc2lnbmVkIGNoYXIgU3RhdGU7CS8vIFNlZSBTWEdfQlVGRkVSIHN0YXRlIGFib3ZlCiAJdW5zaWduZWQgY2hhciBDbWRJbmRleDsJLy8gQ29tbWFuZCByaW5nIGluZGV4CkBAIC04NDAsMTggKzg0MSwxOCBAQAogCXUzMiBEaXJlY3Rpb247CQkvLyBGb3IgYXN5bmNocm9ub3VzIGNvbXBsZXRpb25zCiAJdTMyIEN1ck9mZnNldDsJCS8vIEN1cnJlbnQgU0dMIG9mZnNldAogCXUzMiBTZ2xSZWY7CQkvLyBTR0wgcmVmZXJlbmNlIGNvdW50Ci0JVkxBTl9IRFIgVmxhblRhZzsJLy8gVkxBTiB0YWcgdG8gYmUgaW5zZXJ0ZWQgaW50byBTR0wKLQlQU0NBVFRFUl9HQVRIRVJfTElTVCBwU2dsOwkvLyBTR0wgQWRkci4gUG9zc2libHkgJlNnbAotCVNYR19YNjRfU0dMIFNnbDsJLy8gU0dMIGhhbmRlZCB0byBjYXJkCi19IFNYR19TQ0FUVEVSX0dBVEhFUiwgKlBTWEdfU0NBVFRFUl9HQVRIRVI7CisJc3RydWN0IFZMQU5fSERSIFZsYW5UYWc7CS8vIFZMQU4gdGFnIHRvIGJlIGluc2VydGVkIGludG8gU0dMCisJc3RydWN0IFNDQVRURVJfR0FUSEVSX0xJU1QgKnBTZ2w7CS8vIFNHTCBBZGRyLiBQb3NzaWJseSAmU2dsCisJc3RydWN0IFNYR19YNjRfU0dMIFNnbDsJLy8gU0dMIGhhbmRlZCB0byBjYXJkCit9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogI2RlZmluZSBTWEdfU0dMX0JVRkZFUihfU3hnU2dsKQkJKCZfU3hnU2dsLT5TZ2wpCi0jZGVmaW5lIFNYR19TR0xfQlVGX1NJWkUJCQlzaXplb2YoU1hHX1g2NF9TR0wpCisjZGVmaW5lIFNYR19TR0xfQlVGX1NJWkUJCQlzaXplb2Yoc3RydWN0IFNYR19YNjRfU0dMKQogI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2KQogLy8gRm9yY2UgTkRJUyB0byBnaXZlIHVzIGl0J3Mgb3duIGJ1ZmZlciBzbyB3ZSBjYW4gcmVmb3JtYXQgdG8gb3VyIG93bgogI2RlZmluZSBTWEdfU0dMX0JVRkZFUihfU3hnU2dsKQkJTlVMTAogI2RlZmluZSBTWEdfU0dMX0JVRl9TSVpFCQkJMAogI2Vsc2UKLVN0b3AgQ29tcGlsYXRpb247CisjZXJyb3Igc3RhZ2luZzogc3hnOiBkcml2ZXIgaXMgZm9yIFg4NiBvbmx5IQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2h3LmgKaW5kZXggMjIyMmFlOS4uYjBlZmZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdody5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaHcuaApAQCAtNDgsNyArNDgsNyBAQAogI2RlZmluZSBTWEdfSFdSRUdfTUVNU0laRQkweDQwMDAJCS8vIDE2awogCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9TWEdfSFdfUkVHUyB7CitzdHJ1Y3QgU1hHX0hXX1JFR1MgewogCXUzMgkJUmVzZXQ7CQkJCS8vIFdyaXRlIDB4ZGVhZCB0byBpbnZva2Ugc29mdCByZXNldAogCXUzMgkJUGFkMTsJCQkJLy8gTm8gcmVnaXN0ZXIgZGVmaW5lZCBhdCBvZmZzZXQgNAogCXUzMgkJSW50ZXJydXB0TWFzazA7CQkvLyBEZWFzc2VydCBsZWdhY3kgaW50ZXJydXB0IG9uIGZ1bmN0aW9uIDAKQEAgLTExMyw3ICsxMTMsNyBAQAogCXUzMgkJU29mdHdhcmVbMTkyMF07CQkvLyAweDIwMCAtIDB4MjAwMCAtIFNvZnR3YXJlIGRlZmluZWQgKG5vdCB1c2VkKQogCXUzMgkJTXNpeFRhYmxlWzEwMjRdOwkvLyAweDIwMDAgLSAweDMwMDAgLSBNU0lYIFRhYmxlCiAJdTMyCQlNc2l4Qml0QXJyYXlbMTAyNF07CS8vIDB4MzAwMCAtIDB4NDAwMCAtIE1TSVggUGVuZGluZyBCaXQgQXJyYXkKLX0gU1hHX0hXX1JFR1MsICpQU1hHX0hXX1JFR1M7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLy8gTWljcm9jb2RlIEFkZHJlc3MgRmxhZ3MKQEAgLTUxOSwxMCArNTE5LDEwIEBACiAjZGVmaW5lCVhTX0xBTkVfQUxJR04JCQkweDEwMDAJCQkvLyBYUyB0cmFuc21pdCBsYW5lcyBhbGlnbmVkCiAKIC8vIFBIWSBNaWNyb2NvZGUgZG93bmxvYWQgZGF0YSBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0IF9QSFlfVUNPREUgeworc3RydWN0IFBIWV9VQ09ERSB7CiAJdXNob3J0CUFkZHI7CiAJdXNob3J0CURhdGE7Ci19IFBIWV9VQ09ERSwgKlBQSFlfVUNPREU7Cit9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTM3LDcgKzUzNyw3IEBACiAvLyBhbGwgY29tbWFuZHMgLSBzZWUgdGhlIFNhaGFyYSBzcGVjIGZvciBkZXRhaWxzLiAgTm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGlzCiAvLyBvbmx5IHZhbGlkIHdoZW4gY29tcGlsZWQgb24gYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmUuCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9YTVRfREVTQyB7CitzdHJ1Y3QgWE1UX0RFU0MgewogCXVzaG9ydAlYbXRMZW47CQkJLy8gd29yZCAwLCBiaXRzIFsxNTowXSAtICB0cmFuc21pdCBsZW5ndGgKIAl1bnNpZ25lZCBjaGFyCVhtdEN0bDsJCQkvLyB3b3JkIDAsIGJpdHMgWzIzOjE2XSAtIHRyYW5zbWl0IGNvbnRyb2wgYnl0ZQogCXVuc2lnbmVkIGNoYXIJQ21kOwkJCS8vIHdvcmQgMCwgYml0cyBbMzE6MjRdIC0gdHJhbnNtaXQgY29tbWFuZCBwbHVzIG1pc2MuCkBAIC01NTEsNyArNTUxLDcgQEAKIAl1MzIJUnN2ZDM7CQkJLy8gd29yZCA1LCBiaXRzIFszMTowXSAtICBQQUQKIAl1MzIJUnN2ZDQ7CQkgICAgLy8gd29yZCA2LCBiaXRzIFszMTowXSAtICBQQUQKIAl1MzIJUnN2ZDU7CQkgICAgLy8gd29yZCA3LCBiaXRzIFszMTowXSAtICBQQUQKLX0gWE1UX0RFU0MsICpQWE1UX0RFU0M7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLy8gWE1UX0RFU0MgQ21kIGJ5dGUgZGVmaW5pdGlvbnMKQEAgLTYwMCw3ICs2MDAsNyBAQAogLy8gRm9ybWF0IG9mIHRoZSAxOCBieXRlIFJlY2VpdmUgQnVmZmVyIHJldHVybmVkIGJ5IHRoZQogLy8gUmVjZWl2ZSBTZXF1ZW5jZXIgZm9yIHJlY2VpdmVkIHBhY2tldHMKICNwcmFnbWEgcGFjayhwdXNoLCAxKQotdHlwZWRlZiBzdHJ1Y3QgX1JDVl9CVUZfSERSIHsKK3N0cnVjdCBSQ1ZfQlVGX0hEUiB7CiAJdTMyCVN0YXR1czsJCQkJLy8gU3RhdHVzIHdvcmQgZnJvbSBSY3YgU2VxIFBhcnNlcgogCXVzaG9ydAlMZW5ndGg7CQkJCS8vIFJjdiBwYWNrZXQgYnl0ZSBjb3VudAogCXVuaW9uIHsKQEAgLTYxNSw3ICs2MTUsNyBAQAogCXVuc2lnbmVkIGNoYXIJSXBIZHJPZmZzZXQ7CQkvLyBJUCBoZWFkZXIgb2Zmc2V0IGludG8gcGFja2V0CiAJdTMyCVRwekhhc2g7CQkJLy8gVG9lcGxpdHogaGFzaAogCXVzaG9ydAlSZXNlcnZlZDsJCQkvLyBSZXNlcnZlZAotfSBSQ1ZfQlVGX0hEUiwgKlBSQ1ZfQlVGX0hEUjsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAKQEAgLTY2NSwyOCArNjY1LDI4IEBACiAjcHJhZ21hIHBhY2socHVzaCwgMSkKIAogLyogKi8KLXR5cGVkZWYgc3RydWN0IF9IV19DRkdfREFUQSB7CitzdHJ1Y3QgSFdfQ0ZHX0RBVEEgewogCXVzaG9ydAkJQWRkcjsKIAl1bmlvbiB7CiAJCXVzaG9ydAlEYXRhOwogCQl1c2hvcnQJQ2hlY2tzdW07CiAJfTsKLX0gSFdfQ0ZHX0RBVEEsICpQSFdfQ0ZHX0RBVEE7Cit9OwogCiAvKiAqLwotI2RlZmluZQlOVU1fSFdfQ0ZHX0VOVFJJRVMJKCgxMjgvc2l6ZW9mKEhXX0NGR19EQVRBKSkgLSA0KQorI2RlZmluZQlOVU1fSFdfQ0ZHX0VOVFJJRVMJKCgxMjgvc2l6ZW9mKHN0cnVjdCBIV19DRkdfREFUQSkpIC0gNCkKIAogLyogTUFDIGFkZHJlc3MgKi8KLXR5cGVkZWYgc3RydWN0IF9TWEdfQ09ORklHX01BQyB7CitzdHJ1Y3QgU1hHX0NPTkZJR19NQUMgewogCXVuc2lnbmVkIGNoYXIJCU1hY0FkZHJbNl07CQkJLyogTUFDIEFkZHJlc3MgKi8KLX0gU1hHX0NPTkZJR19NQUMsICpQU1hHX0NPTkZJR19NQUM7Cit9OwogCiAvKiAqLwotdHlwZWRlZiBzdHJ1Y3QgX0FUS19GUlUgeworc3RydWN0IEFUS19GUlUgewogCXVuc2lnbmVkIGNoYXIJCVBhcnROdW1bNl07CiAJdW5zaWduZWQgY2hhcgkJUmV2aXNpb25bMl07CiAJdW5zaWduZWQgY2hhcgkJU2VyaWFsWzE0XTsKLX0gQVRLX0ZSVSwgKlBBVEtfRlJVOworfTsKIAogLyogT0VNIEZSVSBGb3JtYXQgdHlwZXMgKi8KICNkZWZpbmUJQVRLX0ZSVV9GT1JNQVQJCTB4MDAwMApAQCAtNjk4LDI0ICs2OTgsMjQgQEAKICNkZWZpbmUgTk9fRlJVX0ZPUk1BVAkJMHhGRkZGCiAKIC8qIEVFUFJPTS9GbGFzaCBGb3JtYXQgKi8KLXR5cGVkZWYgc3RydWN0IF9TWEdfQ09ORklHIHsKK3N0cnVjdCBTWEdfQ09ORklHIHsKIAkvKiAqLwogCS8qIFNlY3Rpb24gMSAoMTI4IGJ5dGVzKSAqLwogCS8qICovCiAJdXNob3J0CQkJTWFnaWNXb3JkOwkJCS8qIEVFUFJPTS9GTEFTSCBNYWdpYyBjb2RlICdBNUE1JyAqLwogCXVzaG9ydAkJCVNwaUNsa3M7CQkJLyogU1BJIGJ1cyBjbG9jayBkaXZpZGVycyAqLwotCUhXX0NGR19EQVRBCQlId0NmZ1tOVU1fSFdfQ0ZHX0VOVFJJRVNdOworCXN0cnVjdCBIV19DRkdfREFUQQkJSHdDZmdbTlVNX0hXX0NGR19FTlRSSUVTXTsKIAkvKiAqLwogCS8qICovCiAJLyogKi8KIAl1c2hvcnQJCQlWZXJzaW9uOwkJCS8qIEVFUFJPTSBmb3JtYXQgdmVyc2lvbiAqLwotCVNYR19DT05GSUdfTUFDCU1hY0FkZHJbNF07CQkJLyogc3BhY2UgZm9yIDQgTUFDIGFkZHJlc3NlcyAqLwotCUFUS19GUlUJCQlBdGtGcnU7CQkJCS8qIEZSVSBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBTWEdfQ09ORklHX01BQwlNYWNBZGRyWzRdOwkJCS8qIHNwYWNlIGZvciA0IE1BQyBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgQVRLX0ZSVQkJCUF0a0ZydTsJCQkJLyogRlJVIGluZm9ybWF0aW9uICovCiAJdXNob3J0CQkJT2VtRnJ1Rm9ybWF0OwkJLyogT0VNIEZSVSBmb3JtYXQgdHlwZSAqLwogCXVuc2lnbmVkIGNoYXIJCQlPZW1GcnVbNzZdOwkJCS8qIE9FTSBGUlUgaW5mb3JtYXRpb24gKG9wdGlvbmFsKSAqLwogCXVzaG9ydAkJCUNoZWNrc3VtOwkJCS8qIENoZWNrc3VtIG9mIHNlY3Rpb24gMiAqLwogCS8qIENTIGluZm8gWFhYVE9ETyAqLwotfSBTWEdfQ09ORklHLCAqUFNYR19DT05GSUc7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z3BoeWNvZGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hncGh5Y29kZS5oCmluZGV4IDhkYmFlZGEuLjE2N2YzNTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z3BoeWNvZGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z3BoeWNvZGUuaApAQCAtMTgsNyArMTgsNyBAQAogLyoKICAqIERvd25sb2FkIGZvciBBRUwyMDA1QyBQSFkgd2l0aCBTUi9MUiB0cmFuc2NlaXZlciAoMTBHQkFTRS1TUiBvciAxMEdCQVNFLUxSKQogICovCi1zdGF0aWMgUEhZX1VDT0RFIFBoeVVjb2RlW10gPSB7CitzdGF0aWMgc3RydWN0IFBIWV9VQ09ERSBQaHlVY29kZVtdID0gewogCS8qCiAJICogTk9URTogIEFuIGFkZHJlc3Mgb2YgMCBpcyBhIHNwZWNpYWwgY2FzZS4gIFdoZW4gdGhlIGRvd25sb2FkIHJvdXRpbmUKIAkgKiBzZWVzIGFuIGFkZHJlc3Mgb2YgMCwgaXQgZG9lcyBub3Qgd3JpdGUgdG8gdGhlIFBIWS4gIEluc3RlYWQsIGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaAppbmRleCBmNTQxYTNhLi4wMjJkMDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmgKQEAgLTkxLDUgKzkxLDUgQEAKIHZvaWQgc3R1Yl9lbnF1ZXVlX3JldF91bmxpbmsoc3RydWN0IHN0dWJfZGV2aWNlICosIF9fdTMyLCBfX3UzMik7CiAKIC8qIHN0dWJfbWFpbi5jICovCi1pbnQgbWF0Y2hfYnVzaWQoY2hhciAqYnVzaWQpOworaW50IG1hdGNoX2J1c2lkKGNvbnN0IGNoYXIgKmJ1c2lkKTsKIHZvaWQgc3R1Yl9kZXZpY2VfY2xlYW51cF91cmJzKHN0cnVjdCBzdHViX2RldmljZSAqc2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCmluZGV4IGVlNDU1YTAuLjFlMzIwY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCkBAIC0zODksNyArMzg5LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKIAlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYgPSBOVUxMOwotCWNoYXIgKnVkZXZfYnVzaWQgPSBpbnRlcmZhY2UtPmRldi5wYXJlbnQtPmJ1c19pZDsKKwljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoaW50ZXJmYWNlLT5kZXYucGFyZW50KTsKIAlpbnQgZXJyID0gMDsKIAogCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiRW50ZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCmluZGV4IGM2NjVkN2YuLjA1ZTRjNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKQEAgLTQwLDExICs0MCwxMiBAQAogICogcmVtb3RlIGhvc3QuCiAgKi8KICNkZWZpbmUgTUFYX0JVU0lEIDE2Ci1zdGF0aWMgY2hhciBidXNpZF90YWJsZVtNQVhfQlVTSURdW0JVU19JRF9TSVpFXTsKKyNkZWZpbmUgQlVTSURfU0laRSAyMAorc3RhdGljIGNoYXIgYnVzaWRfdGFibGVbTUFYX0JVU0lEXVtCVVNJRF9TSVpFXTsKIHN0YXRpYyBzcGlubG9ja190IGJ1c2lkX3RhYmxlX2xvY2s7CiAKIAotaW50IG1hdGNoX2J1c2lkKGNoYXIgKmJ1c2lkKQoraW50IG1hdGNoX2J1c2lkKGNvbnN0IGNoYXIgKmJ1c2lkKQogewogCWludCBpOwogCkBAIC01Miw3ICs1Myw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU0lEOyBpKyspCiAJCWlmIChidXNpZF90YWJsZVtpXVswXSkKLQkJCWlmICghc3RybmNtcChidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU19JRF9TSVpFKSkgeworCQkJaWYgKCFzdHJuY21wKGJ1c2lkX3RhYmxlW2ldLCBidXNpZCwgQlVTSURfU0laRSkpIHsKIAkJCQkvKiBhbHJlYWR5IHJlZ2lzdGVyZCAqLwogCQkJCXNwaW5fdW5sb2NrKCZidXNpZF90YWJsZV9sb2NrKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTkyLDcgKzkzLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVTSUQ7IGkrKykKIAkJaWYgKCFidXNpZF90YWJsZVtpXVswXSkgewotCQkJc3RybmNweShidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU19JRF9TSVpFKTsKKwkJCXN0cm5jcHkoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNJRF9TSVpFKTsKIAkJCXNwaW5fdW5sb2NrKCZidXNpZF90YWJsZV9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xMDksOSArMTEwLDkgQEAKIAlzcGluX2xvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CVVNJRDsgaSsrKQotCQlpZiAoIXN0cm5jbXAoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNfSURfU0laRSkpIHsKKwkJaWYgKCFzdHJuY21wKGJ1c2lkX3RhYmxlW2ldLCBidXNpZCwgQlVTSURfU0laRSkpIHsKIAkJCS8qIGZvdW5kICovCi0JCQltZW1zZXQoYnVzaWRfdGFibGVbaV0sIDAsIEJVU19JRF9TSVpFKTsKKwkJCW1lbXNldChidXNpZF90YWJsZVtpXSwgMCwgQlVTSURfU0laRSk7CiAJCQlzcGluX3VubG9jaygmYnVzaWRfdGFibGVfbG9jayk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTI1LDE5ICsxMjYsMTkgQEAKIAkJc2l6ZV90IGNvdW50KQogewogCWludCBsZW47Ci0JY2hhciBidXNpZFtCVVNfSURfU0laRV07CisJY2hhciBidXNpZFtCVVNJRF9TSVpFXTsKIAogCWlmIChjb3VudCA8IDUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogc3RybmxlbigpIGRvZXMgbm90IGluY2x1ZGUgXDAgKi8KLQlsZW4gPSBzdHJubGVuKGJ1ZiArIDQsIEJVU19JRF9TSVpFKTsKKwlsZW4gPSBzdHJubGVuKGJ1ZiArIDQsIEJVU0lEX1NJWkUpOwogCiAJLyogYnVzaWQgbmVlZHMgdG8gaW5jbHVkZSBcMCB0ZXJtaW5hdGlvbiAqLwotCWlmICghKGxlbiA8IEJVU19JRF9TSVpFKSkKKwlpZiAoIShsZW4gPCBCVVNJRF9TSVpFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzdHJuY3B5KGJ1c2lkLCBidWYgKyA0LCBCVVNfSURfU0laRSk7CisJc3RybmNweShidXNpZCwgYnVmICsgNCwgQlVTSURfU0laRSk7CiAKIAogCWlmICghc3RybmNtcChidWYsICJhZGQgIiwgNCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCmluZGV4IDM2Y2U4OTguLjJlYjYxMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJICogQSB1c2VyIG1heSBuZWVkIHRvIHNldCBhIHNwZWNpYWwgY29uZmlndXJhdGlvbiB2YWx1ZSBiZWZvcmUKIAkgKiBleHBvcnRpbmcgdGhlIGRldmljZS4KIAkgKi8KLQl1aW5mbygic2V0X2NvbmZpZ3VyYXRpb24gKCVkKSB0byAlc1xuIiwgY29uZmlnLCB1cmItPmRldi0+ZGV2LmJ1c19pZCk7CisJdWluZm8oInNldF9jb25maWd1cmF0aW9uICglZCkgdG8gJXNcbiIsIGNvbmZpZywgZGV2X25hbWUoJnVyYi0+ZGV2LT5kZXYpKTsKIAl1aW5mbygiYnV0LCBza2lwIVxuIik7CiAKIAlyZXR1cm4gMDsKQEAgLTE3NSw3ICsxNzUsNyBAQAogCXZhbHVlID0gbGUxNl90b19jcHUocmVxLT53VmFsdWUpOwogCWluZGV4ID0gbGUxNl90b19jcHUocmVxLT53SW5kZXgpOwogCi0JdWluZm8oInJlc2V0X2RldmljZSAocG9ydCAlZCkgdG8gJXNcbiIsIGluZGV4LCB1cmItPmRldi0+ZGV2LmJ1c19pZCk7CisJdWluZm8oInJlc2V0X2RldmljZSAocG9ydCAlZCkgdG8gJXNcbiIsIGluZGV4LCBkZXZfbmFtZSgmdXJiLT5kZXYtPmRldikpOwogCiAJLyogYWxsIGludGVyZmFjZXMgc2hvdWxkIGJlIG93bmVkIGJ5IHVzYmlwIGRyaXZlciwgc28ganVzdCByZXNldCBpdC4gICovCiAJcmV0ID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCh1cmItPmRldiwgTlVMTCk7CkBAIC0yMzQsOCArMjM0LDYgQEAKIHN0YXRpYyBpbnQgc3R1Yl9yZWN2X2NtZF91bmxpbmsoc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2LAogCQkJCQkJc3RydWN0IHVzYmlwX2hlYWRlciAqcGR1KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RoZWFkID0gJnNkZXYtPnByaXZfaW5pdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXN0cnVjdCBzdHViX3ByaXYgKnByaXY7CkBAIC0yNDMsOCArMjQxLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzZGV2LT5wcml2X2xvY2ssIGZsYWdzKTsKIAotCWZvciAocHRyID0gbGlzdGhlYWQtPm5leHQ7IHB0ciAhPSBsaXN0aGVhZDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCXByaXYgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IHN0dWJfcHJpdiwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmc2Rldi0+cHJpdl9pbml0LCBsaXN0KSB7CiAJCWlmIChwcml2LT5zZXFudW0gPT0gcGR1LT51LmNtZF91bmxpbmsuc2VxbnVtKSB7CiAJCQlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYwppbmRleCBkNTU2M2NkLi43ODA1OGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMKQEAgLTU0LDcgKzU0LDYgQEAKIC8qKgogICogc3R1Yl9jb21wbGV0ZSAtIGNvbXBsZXRpb24gaGFuZGxlciBvZiBhIHVzYmlwIHVyYgogICogQHVyYjogcG9pbnRlciB0byB0aGUgdXJiIGNvbXBsZXRlZAotICogQHJlZ3M6CiAgKgogICogV2hlbiBhIHVyYiBoYXMgY29tcGxldGVkLCB0aGUgVVNCIGNvcmUgZHJpdmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gbW9zdGx5IGluCiAgKiB0aGUgaW50ZXJydXB0IGNvbnRleHQuIFRvIHJldHVybiB0aGUgcmVzdWx0IG9mIGEgdXJiLCB0aGUgY29tcGxldGVkIHVyYiBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYwppbmRleCA1YjVhMmUzLi5mNjljYTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYwpAQCAtMTA5MSw3ICsxMDkxLDcgQEAKIAkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBoY2QuCiAJICogT3VyIHByaXZhdGUgZGF0YSBpcyBhbHNvIGFsbG9jYXRlZCBhdXRvbWF0aWNhbGx5LgogCSAqLwotCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZ2aGNpX2hjX2RyaXZlciwgJnBkZXYtPmRldiwgcGRldi0+ZGV2LmJ1c19pZCk7CisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnZoY2lfaGNfZHJpdmVyLCAmcGRldi0+ZGV2LCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CiAJaWYgKCFoY2QpIHsKIAkJdWVycigiY3JlYXRlIGhjZCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jCmluZGV4IDI0YzI4NTEuLjBmZDMzYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYwpAQCAtNjAsNyArNjAsNyBAQAogCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTAzdSAlMDh4ICIsCiAJCQkJCXZkZXYtPnNwZWVkLCB2ZGV2LT5kZXZpZCk7CiAJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMTZwICIsIHZkZXYtPnVkLnRjcF9zb2NrZXQpOwotCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJXMiLCB2ZGV2LT51ZGV2LT5kZXYuYnVzX2lkKTsKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIiVzIiwgZGV2X25hbWUoJnZkZXYtPnVkZXYtPmRldikpOwogCiAJCX0gZWxzZQogCQkJb3V0ICs9IHNwcmludGYob3V0LCAiMDAwIDAwMCAwMDAgMDAwMDAwMDAwMDAwMDAwMCAwLTAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9LY29uZmlnCmluZGV4IDQyNTIxOWUuLjk0MDQ2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvS2NvbmZpZwpAQCAtMSw3ICsxLDExIEBACiBjb25maWcgVzM1VU5ECi0JdHJpc3RhdGUgIldpbmJvbmQgZHJpdmVyIgotCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgV0xBTl84MDIxMSAmJiBVU0IgJiYgRVhQRVJJTUVOVEFMICYmICE0S1NUQUNLUworCXRyaXN0YXRlICJJUzg5QzM1IFdMQU4gVVNCIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1BQzgwMjExICYmIFdMQU5fODAyMTEgJiYgVVNCICYmIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHdpbmJvbmQgd2lmaSBjYXJkIG9uIHNvbWUgS29oamluc2hhIG5vdGVib29rcwotCSAgQ2hlY2sgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3dpbmJvbmRwb3J0LyBmb3IgbmV3IHZlcnNpb24KKwkgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIFdpbmJvbmQgV0lGSSBjYXJkLgorCisJICBIYXJkd2FyZSBpcyBwcmVzZW50IGluIHNvbWUgS29oamluc2hhIHN1Ym5vdGVib29rcywgYW5kIGluIHNvbWUKKwkgIHN0YW5kLWFsb25lIFVTQiBtb2R1bGVzLiBDaGlwc2V0IG5hbWUgc2VlbXMgdG8gYmUgdzg5YzM1ZC4KKworCSAgQ2hlY2sgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3dpbmJvbmRwb3J0LyBmb3IgbmV3IHZlcnNpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL01ha2VmaWxlCmluZGV4IDI5Yzk4YmYuLmI0OWM5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL01ha2VmaWxlCkBAIC0xLDE1ICsxLDE0IEBACi0JRFJJVkVSX0RJUj0uL2xpbnV4Ci0KLXczNXVuZC1vYmpzIDo9ICQoRFJJVkVSX0RJUikvd2J1c2IubyAkKERSSVZFUl9ESVIpL3diMzVyZWcubyAkKERSSVZFUl9ESVIpL3diMzVyeC5vICQoRFJJVkVSX0RJUikvd2IzNXR4Lm8gXAotCW1kcy5vIFwKLQltbG1ldHhyeC5vIFwKLQltdG8ubwlcCit3MzV1bmQtb2JqcyA6PQkJCVwKKwltZHMubwkJCVwKKwltbG1ldHhyeC5vCQlcCisJbXRvLm8JCQlcCiAJcGh5X2NhbGlicmF0aW9uLm8JXAogCXJlZy5vCQkJXAotCXJ4aXNyLm8JCQlcCi0Jc21lX2FwaS5vCQlcCisJd2IzNXJlZy5vCQlcCisJd2IzNXJ4Lm8JCVwKKwl3YjM1dHgubwkJXAogCXdiaGFsLm8JCQlcCi0Jd2JsaW51eC5vCQlcCisJd2J1c2IubwkJCVwKIAogCiBvYmotJChDT05GSUdfVzM1VU5EKSArPSB3MzV1bmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYWRhcHRlci5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYWRhcHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk3MDFkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2FkYXB0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vCi0vLyBBREFQVEVSLkggLQotLy8gV2luZG93cyBORElTIGdsb2JhbCB2YXJpYWJsZSAnQWRhcHRlcicgdHlwZWRlZgotLy8KLSNkZWZpbmUgTUFYX0FOU0lfU1RSSU5HCQk0MAotdHlwZWRlZiBzdHJ1Y3QgV0IzMl9BREFQVEVSCi17Ci0JdTMyIEFkYXB0ZXJJbmRleDsgLy8gMjAwNjA3MDMuNCBBZGQgZm9yIHVzaW5nIHBBZGFwdGVyQ29udGV4dCBnbG9iYWwgQWRhcHRlciBwb2ludAotCi0JV0JfTE9DQUxERVNDUklQVAlzTG9jYWxQYXJhOwkJLy8gTXlzZWxmIGNvbm5lY3RlZCBwYXJhbWV0ZXJzCi0JUFdCX0JTU0RFU0NSSVBUSU9OCWFzQlNTRGVzY3JpcHRFbGVtZW50OwotCi0JTUxNRV9GUkFNRQkJc01sbWVGcmFtZTsJCS8vIGNvbm5lY3QgdG8gcGVlclNUQSBwYXJhbWV0ZXJzCi0KLQlNVE9fUEFSQU1FVEVSUwkJc010b1BhcmE7IC8vIE1UT19zdHJ1Y3QgLi4uCi0JaHdfZGF0YV90CQkJc0h3RGF0YTsgLy9Gb3IgSEFMCi0JTURTCQkJCQlNZHM7Ci0KLQlXQkxJTlVYCQlXYkxpbnV4OwotICAgICAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyBpd19zdGF0czsKLQotCXU4CUxpbmtOYW1lW01BWF9BTlNJX1NUUklOR107Ci19IFdCMzJfQURBUFRFUiwgQURBUFRFUiwgKlBXQjMyX0FEQVBURVIsICpQQURBUFRFUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3NfZi5oCmluZGV4IDAxMzE4MzEuLmE0MzNiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc19mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzX2YuaApAQCAtMSw1OSArMSw2MyBAQAorI2lmbmRlZiBfX1dJTkJPTkRfQlNTX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfQlNTX0ZfSAorCisjaW5jbHVkZSAiY29yZS5oIgorCitzdHJ1Y3QgUE1LSURfSW5mb3JtYXRpb25fRWxlbWVudDsKKwogLy8KIC8vIEJTUyBkZXNjcmlwdG9yIERhdGFCYXNlIG1hbmFnZW1lbnQgZ2xvYmFsIGZ1bmN0aW9uCiAvLwogCi12b2lkIHZCU1NkZXNjcmlwdGlvbkluaXQoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgdkJTU2ZvdW5kTGlzdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdTggYm9DaGFuRmlsdGVyKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggQ2hhbk5vKTsKLXUxNiB3QlNTYWxsb2NhdGVFbnRyeShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdTE2IHdCU1NHZXRFbnRyeShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCB2U2ltcGxlSG91c2VLZWVwaW5nKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci11MTYgd0JTU2hvdXNlS2VlcGluZyhQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCBDbGVhckJTU2Rlc2NwdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiBpKTsKLXUxNiB3QlNTZmluZEJzc0lEKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggKnBiQnNzaWQpOwotdTE2IHdCU1NmaW5kRGVkaWNhdGVDYW5kaWRhdGUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBzdHJ1Y3QgU1NJRF9FbGVtZW50ICpwc1NzaWQsIHU4ICpwYkJzc2lkKTsKLXUxNiB3QlNTZmluZE1BQ2FkZHIoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OCAqcGJNYWNBZGRyKTsKLXUxNiB3QlNTc2VhcmNoTUFDYWRkcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4ICpwYk1hY0FkZHIsIHU4IGJhbmQpOwotdTE2IHdCU1NhZGRTY2FuRGF0YShQV0IzMl9BREFQVEVSLCB1MTYsIHBzUlhEQVRBKTsKLXUxNiB3QlNTVXBkYXRlU2NhbkRhdGEoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYgd0Jzc0lkeCwgcHNSWERBVEEgcHNSY3ZEYXRhKTsKLXUxNiB3QlNTY3JlYXRlSUJTU2RhdGEoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhKTsKLXZvaWQgRGVzaXJlZFJhdGUyQlNTZGVzY3JpcHRvcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEsCit2b2lkIHZCU1NkZXNjcmlwdGlvbkluaXQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIHZCU1Nmb3VuZExpc3Qoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit1OCBib0NoYW5GaWx0ZXIoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggQ2hhbk5vKTsKK3UxNiB3QlNTYWxsb2NhdGVFbnRyeShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3UxNiB3QlNTR2V0RW50cnkoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIHZTaW1wbGVIb3VzZUtlZXBpbmcoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit1MTYgd0JTU2hvdXNlS2VlcGluZyhzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3ZvaWQgQ2xlYXJCU1NkZXNjcHQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2IGkpOwordTE2IHdCU1NmaW5kQnNzSUQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggKnBiQnNzaWQpOwordTE2IHdCU1NmaW5kRGVkaWNhdGVDYW5kaWRhdGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgc3RydWN0IFNTSURfRWxlbWVudCAqcHNTc2lkLCB1OCAqcGJCc3NpZCk7Cit1MTYgd0JTU2ZpbmRNQUNhZGRyKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4ICpwYk1hY0FkZHIpOwordTE2IHdCU1NzZWFyY2hNQUNhZGRyKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4ICpwYk1hY0FkZHIsIHU4IGJhbmQpOwordTE2IHdCU1NhZGRTY2FuRGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiwgdTE2LCBwc1JYREFUQSk7Cit1MTYgd0JTU1VwZGF0ZVNjYW5EYXRhKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiB3QnNzSWR4LCBwc1JYREFUQSBwc1JjdkRhdGEpOwordTE2IHdCU1NjcmVhdGVJQlNTZGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhKTsKK3ZvaWQgRGVzaXJlZFJhdGUyQlNTZGVzY3JpcHRvcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhLAogCQkJCQkJCSB1OCAqcEJhc2ljUmF0ZVNldCwgdTggQmFzaWNSYXRlQ291bnQsCiAJCQkJCQkJIHU4ICpwT3BlcmF0aW9uUmF0ZVNldCwgdTggT3BlcmF0aW9uUmF0ZUNvdW50KTsKLXZvaWQgRGVzaXJlZFJhdGUySW5mb0VsZW1lbnQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OAkqYWRkciwgdTE2ICppRmlsZE9mZnNldCwKK3ZvaWQgRGVzaXJlZFJhdGUySW5mb0VsZW1lbnQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTgJKmFkZHIsIHUxNiAqaUZpbGRPZmZzZXQsCiAJCQkJCQkJIHU4ICpwQmFzaWNSYXRlU2V0LCB1OCBCYXNpY1JhdGVDb3VudCwKIAkJCQkJCQkgdTggKnBPcGVyYXRpb25SYXRlU2V0LCB1OCBPcGVyYXRpb25SYXRlQ291bnQpOwotdm9pZCBCU1NBZGRJQlNTZGF0YShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEpOwordm9pZCBCU1NBZGRJQlNTZGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhKTsKIHVuc2lnbmVkIGNoYXIgYm9DbXBNYWNBZGRyKCB1OCAqLCB1OCAqKTsKIHVuc2lnbmVkIGNoYXIgYm9DbXBTU0lEKHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU1NJRDEsIHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU1NJRDIpOwotdTE2IHdCU1NmaW5kU1NJRChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU3NpZCk7Ci11MTYgd1JvYW1pbmdRdWVyeShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCB2UmF0ZVRvQml0bWFwKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2IGluZGV4KTsKLXU4IGJSYXRlVG9CaXRtYXBJbmRleChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4IGJSYXRlKTsKK3UxNiB3QlNTZmluZFNTSUQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgc3RydWN0IFNTSURfRWxlbWVudCAqcHNTc2lkKTsKK3UxNiB3Um9hbWluZ1F1ZXJ5KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordm9pZCB2UmF0ZVRvQml0bWFwKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiBpbmRleCk7Cit1OCBiUmF0ZVRvQml0bWFwSW5kZXgoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggYlJhdGUpOwogdTggYkJpdG1hcFRvUmF0ZSh1OCBpKTsKLXVuc2lnbmVkIGNoYXIgYm9Jc0VSUHN0YShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiBpKTsKLXVuc2lnbmVkIGNoYXIgYm9DaGVja0Nvbm5lY3QoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXVuc2lnbmVkIGNoYXIgYm9DaGVja1NpZ25hbChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCBBZGRJQlNTSWUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEgKTsvL2FkZGVkIGJ5IHdzIGZvciBXUEFfTm9uZTA2LzAxLzA0Ci12b2lkIEJzc1NjYW5VcFRvRGF0ZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCBCc3NVcFRvRGF0ZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwordW5zaWduZWQgY2hhciBib0lzRVJQc3RhKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiBpKTsKK3Vuc2lnbmVkIGNoYXIgYm9DaGVja0Nvbm5lY3Qoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit1bnNpZ25lZCBjaGFyIGJvQ2hlY2tTaWduYWwoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIEFkZElCU1NJZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEgKTsvL2FkZGVkIGJ5IHdzIGZvciBXUEFfTm9uZTA2LzAxLzA0Cit2b2lkIEJzc1NjYW5VcFRvRGF0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3ZvaWQgQnNzVXBUb0RhdGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7CiB2b2lkIFJhdGVTb3J0KHU4ICpSYXRlQXJyYXksIHU4IG51bSwgdTggbW9kZSk7Ci12b2lkIFJhdGVSZVNvcnRGb3JTUmF0ZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4ICpSYXRlQXJyYXksIHU4IG51bSk7Ci12b2lkIEFzc2VtYmxlX0lFKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2IHdCc3NJZHgpOwotdm9pZCBTZXRNYXhUeFJhdGUoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKK3ZvaWQgUmF0ZVJlU29ydEZvclNSYXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4ICpSYXRlQXJyYXksIHU4IG51bSk7Cit2b2lkIEFzc2VtYmxlX0lFKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiB3QnNzSWR4KTsKK3ZvaWQgU2V0TWF4VHhSYXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwogCi12b2lkIENyZWF0ZVdwYUlFKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2KiBpRmlsZE9mZnNldCwgdTggKm1zZywgc3RydWN0ICBNYW5hZ2VtZW50X0ZyYW1lKiBtc2dIZWFkZXIsCit2b2lkIENyZWF0ZVdwYUlFKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiogaUZpbGRPZmZzZXQsIHU4ICptc2csIHN0cnVjdCAgTWFuYWdlbWVudF9GcmFtZSogbXNnSGVhZGVyLAogCQkJCSBzdHJ1Y3QgQXNzb2NpYXRpb25fUmVxdWVzdF9GcmFtZV9Cb2R5KiBtc2dCb2R5LCB1MTYgaU1TaW5kZXgpOyAvL2FkZGVkIGJ5IFdTIDA1LzE0LzA1CiAKICNpZmRlZiBfV1BBMl8KLXZvaWQgQ3JlYXRlUnNuSUUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYqIGlGaWxkT2Zmc2V0LCB1OCAqbXNnLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKK3ZvaWQgQ3JlYXRlUnNuSUUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2KiBpRmlsZE9mZnNldCwgdTggKm1zZywgc3RydWN0ICBNYW5hZ2VtZW50X0ZyYW1lKiBtc2dIZWFkZXIsCiAJCQkJIHN0cnVjdCBBc3NvY2lhdGlvbl9SZXF1ZXN0X0ZyYW1lX0JvZHkqIG1zZ0JvZHksIHUxNiBpTVNpbmRleCk7Ly9hZGRlZCBieSBXUyAwNS8xNC8wNQogCi11MTYgU2VhcmNoUG1raWQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKK3UxNiBTZWFyY2hQbWtpZChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKIAkJCQkgICBzdHJ1Y3QgUE1LSURfSW5mb3JtYXRpb25fRWxlbWVudCAqIEFzc29SZXFfUE1LSUQgKTsKICNlbmRpZgogCi0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzZHNjcHQuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc2RzY3B0LmgKaW5kZXggOTcxNTBhMi4uM2E3MWQ0ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc2RzY3B0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzZHNjcHQuaApAQCAtMSwzICsxLDExIEBACisjaWZuZGVmIF9fV0lOQk9ORF9CU1NEU0NQVF9ICisjZGVmaW5lIF9fV0lOQk9ORF9CU1NEU0NQVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWRzX3MuaCIKKyNpbmNsdWRlICJtbG1lX3MuaCIKKwogLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogLy8JYnNzZHNjcHQuYwogLy8JCUJTUyBkZXNjcmlwdG9yIGRhdGEgYmFzZQpAQCAtNzgsOCArODYsOCBAQAogICAgIHUxNgkJd1N0YXRlOwkJCS8vIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXN0ZW0KIAl1MTYJCXdJbmRleDsJCQkvLyBUSElTIEJTUyBlbGVtZW50IGVudHJ5IGluZGV4CiAKLQl2b2lkKglwc0FkYXB0ZXI7CQkvLyBwb2ludGVyIHRvIFRISVMgQWRhcHRlcgotCU9TX1RJTUVSCW5UaW1lcjsgIC8vIE1MTUUgdGltZXIKKwl2b2lkKglwc2FkYXB0ZXI7CQkvLyBwb2ludGVyIHRvIFRISVMgYWRhcHRlcgorCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOyAgLy8gTUxNRSB0aW1lcgogCiAgICAgLy8gQXV0aGVudGljYXRpb24KICAgICB1MTYJCXdBdXRoQWxnbzsgICAgICAvLyBwZWVyIE1BQyBNTE1FIHVzZSBBdXRoIGFsZ29yaXRobSwgZGVmYXVsdCBPUEVOX0FVVEgKQEAgLTE0OCw5ICsxNTYsOSBAQAogCiB9IFdCX0JTU0RFU0NSSVBUSU9OLCAqUFdCX0JTU0RFU0NSSVBUSU9OOwogCi0jZGVmaW5lIHdCU1NDb25uZWN0ZWRTVEEoQWRhcHRlcikgICAgICAgICAgICAgXAotICAgICgodTE2KShBZGFwdGVyKS0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXgpCisjZGVmaW5lIHdCU1NDb25uZWN0ZWRTVEEoYWRhcHRlcikgICAgICAgICAgICAgXAorICAgICgodTE2KShhZGFwdGVyKS0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXgpCiAKLSNkZWZpbmUgcHNCU1MoaSkJCQkoJihBZGFwdGVyLT5hc0JTU0Rlc2NyaXB0RWxlbWVudFsoaSldKSkKKyNkZWZpbmUgcHNCU1MoaSkJCQkoJihhZGFwdGVyLT5hc0JTU0Rlc2NyaXB0RWxlbWVudFsoaSldKSkKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkOTYwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvbW1vbi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vCisvLyBjb21tb24uaAorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgT1MgZGVwZW5kYW50IGRlZmluaXRpb24gYW5kIGZ1bmN0aW9uLgorLy8gRXZlcnkgT1MgaGFzIHRoaXMgZmlsZSBpbmRpdmlkdWFsLgorLy8KKworI2RlZmluZSBEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggX0EgKQorCisjaWZuZGVmIENPTU1PTl9ERUYKKyNkZWZpbmUgQ09NTU9OX0RFRgorCisvLyNkZWZpbmUgREVCVUdfRU5BQkxFRCAgMQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb21tb24gZnVuY3Rpb24gZGVmaW5pdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBERUJVR19FTkFCTEVECisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2CisjaWZkZWYgREVCVUdfRU5BQkxFRAorI2RlZmluZSBXQkRFQlVHKCBfTSApCXByaW50ayBfTQorI2Vsc2UKKyNkZWZpbmUgV0JERUJVRyggX00gKQkwCisjZW5kaWYKKworI2VuZGlmIC8vIENPTU1PTl9ERUYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTQyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBfX1dJTkJPTkRfQ09SRV9ICisjZGVmaW5lIF9fV0lOQk9ORF9DT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlICJic3Nkc2NwdC5oIgorI2luY2x1ZGUgIm10by5oIgorI2luY2x1ZGUgIndiaGFsX3MuaCIKKworI2RlZmluZSBXQkxJTlVYX1BBQ0tFVF9BUlJBWV9TSVpFIChFVEhFUk5FVF9UWF9ERVNDUklQVE9SUyo0KQorCisjZGVmaW5lIFdCX01BWF9MSU5LX05BTUVfTEVOIDQwCisKK3N0cnVjdCB3YnNvZnRfcHJpdiB7CisJdTMyIGFkYXB0ZXJJbmRleDsJLy8gMjAwNjA3MDMuNCBBZGQgZm9yIHVzaW5nIHBhZGFwdGVyQ29udGV4dCBnbG9iYWwgYWRhcHRlciBwb2ludAorCisJV0JfTE9DQUxERVNDUklQVCBzTG9jYWxQYXJhOwkvLyBNeXNlbGYgY29ubmVjdGVkIHBhcmFtZXRlcnMKKwlQV0JfQlNTREVTQ1JJUFRJT04gYXNCU1NEZXNjcmlwdEVsZW1lbnQ7CisKKwlNTE1FX0ZSQU1FIHNNbG1lRnJhbWU7CS8vIGNvbm5lY3QgdG8gcGVlclNUQSBwYXJhbWV0ZXJzCisKKwlNVE9fUEFSQU1FVEVSUyBzTXRvUGFyYTsJLy8gTVRPX3N0cnVjdCAuLi4KKwlod19kYXRhX3Qgc0h3RGF0YTsJLy9Gb3IgSEFMCisJTURTIE1kczsKKworCXNwaW5sb2NrX3QgU3BpbkxvY2s7CisKKwlhdG9taWNfdCBUaHJlYWRDb3VudDsKKworCXUzMiBSeEJ5dGVDb3VudDsKKwl1MzIgVHhCeXRlQ291bnQ7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGFja2V0X3JldHVybjsKKwlzMzIgbmV0aWZfc3RhdGVfc3RvcDsJLy8gMTogc3RvcCAgMDogbm9ybWFsCisJc3RydWN0IGl3X3N0YXRpc3RpY3MgaXdfc3RhdHM7CisKKwl1OCBMaW5rTmFtZVtXQl9NQVhfTElOS19OQU1FX0xFTl07CisKKwlib29sIGVuYWJsZWQ7Cit9OworCisjZW5kaWYgLyogX19XSU5CT05EX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZHNfdGtpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZHNfdGtpcC5oCmluZGV4IDY4NDFkNjZlLi45YzVjNGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9kc190a2lwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZHNfdGtpcC5oCkBAIC0xLDMgKzEsOCBAQAorI2lmbmRlZiBfX1dJTkJPTkRfRFNfVEtJUF9ICisjZGVmaW5lIF9fV0lOQk9ORF9EU19US0lQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCiAjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAogICAgICggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgICYgKCAoMVVMIDw8IChuKSkgLSAxICkgKSApCkBAIC0yNiw4ICszMSw3IEBACiB9IHRraXBfdDsKIAogLy92b2lkIF9hcHBlbmRfZGF0YSggdTggKnBEYXRhLCB1MTYgc2l6ZSwgdGtpcF90ICpwICk7Ci12b2lkIE1kc19NaWNHZXQoICB2b2lkKiBBZGFwdGVyLCAgdm9pZCogcFJ4TGF5ZXIxLCAgdTggKnBLZXksICB1OCAqcE1pYyApOwotdm9pZCBNZHNfTWljRmlsbCggIHZvaWQqIEFkYXB0ZXIsICB2b2lkKiBwRGVzLCAgdTggKlhtaXRCdWZBZGRyZXNzICk7Cit2b2lkIE1kc19NaWNHZXQoICB2b2lkKiBhZGFwdGVyLCAgdm9pZCogcFJ4TGF5ZXIxLCAgdTggKnBLZXksICB1OCAqcE1pYyApOwordm9pZCBNZHNfTWljRmlsbCggIHZvaWQqIGFkYXB0ZXIsICB2b2lkKiBwRGVzLCAgdTggKlhtaXRCdWZBZGRyZXNzICk7CiAKLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2dsXzgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9nbF84MDIxMS5oCmluZGV4IDE4MDZkODEuLjVhMjQ0YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2dsXzgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZ2xfODAyMTEuaApAQCAtMSw3ICsxLDggQEAKLQogI2lmbmRlZiBfX0dMXzgwMjExX0hfXwogI2RlZmluZSBfX0dMXzgwMjExX0hfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogLyoqKioqKioqKioqKioqKioqKiBDT05TVEFOVCBBTkQgTUFDUk8gU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEJTUyBUeXBlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJhODZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vCi0vLyBjb21tb24uaAotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgT1MgZGVwZW5kYW50IGRlZmluaXRpb24gYW5kIGZ1bmN0aW9uLgotLy8gRXZlcnkgT1MgaGFzIHRoaXMgZmlsZSBpbmRpdmlkdWFsLgotLy8KLQotI2RlZmluZSBEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggX0EgKQotCi0jaWZuZGVmIENPTU1PTl9ERUYKLSNkZWZpbmUgQ09NTU9OX0RFRgotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAvL25lZWQgZm9yIGtlcm5lbCBhbGVydAotI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+IC8vbWVtb3J5IGFsbG9jYXRlCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ly9uZWVkIGZvciBpbml0IGFuZCBleGl0IG1vZHVsZXMgbWFyY28KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLQotLy8jZGVmaW5lIERFQlVHX0VOQUJMRUQgIDEKLQotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBDb21tb24gdHlwZSBkZWZpbml0aW9uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgSUdOT1JFICAgICAgMgotI2RlZmluZQlTVUNDRVNTICAgICAxCi0jZGVmaW5lCUZBSUxVUkUgICAgIDAKLQotCi0jaWZuZGVmIHRydWUKLSNkZWZpbmUgdHJ1ZSAgICAgICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgZmFsc2UKLSNkZWZpbmUgZmFsc2UgICAgICAgMAotI2VuZGlmCi0KLS8vIFBENDMgMjAwMjExMDgKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAgICAgICAxCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgICAgICAwCi0jZW5kaWYKLQotI2RlZmluZSBTVEFUVVNfTUVESUFfQ09OTkVDVCAxCi0jZGVmaW5lIFNUQVRVU19NRURJQV9ESVNDT05ORUNUIDAKLQotI2lmbmRlZiBCSVQKLSNkZWZpbmUgQklUKHgpICAgICAgICAgICAgICAgICAgKDEgPDwgKHgpKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHVyYiAqIFBVUkI7Ci0KLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBDb21tb24gZnVuY3Rpb24gZGVmaW5pdGlvbgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2lmbmRlZiBhYnMKLSNkZWZpbmUgYWJzKF9UKQkJCQkJCQkoKF9UKSA8IDAgPyAtX1QgOiBfVCkKLSNlbmRpZgotI2RlZmluZSBERUJVR19FTkFCTEVECi0jZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2Ci0jaWZkZWYgREVCVUdfRU5BQkxFRAotI2RlZmluZSBXQkRFQlVHKCBfTSApCXByaW50ayBfTQotI2Vsc2UKLSNkZWZpbmUgV0JERUJVRyggX00gKQkwCi0jZW5kaWYKLQotI2RlZmluZSBPU19ESVNDT05ORUNURUQJMAotI2RlZmluZSBPU19DT05ORUNURUQJMQotCi0KLSNkZWZpbmUgT1NfRVZFTlRfSU5ESUNBVEUoIF9BLCBfQiwgX0YgKQotI2RlZmluZSBPU19QTUtJRF9TVEFUVVNfRVZFTlQoIF9BICkKLQotCi0vKiBVZmYsIG5vLCBsb25ncyBhcmUgbm90IGF0b21pYyBvbiBhbGwgYXJjaGl0ZWN0dXJlcyBMaW51eAotICogc3VwcG9ydHMuIFRoaXMgc2hvdWxkIHJlYWxseSB1c2UgYXRvbWljX3QgKi8KLQotI2RlZmluZSBPU19BVE9NSUMJCQl1MzIKLSNkZWZpbmUgT1NfQVRPTUlDX1JFQUQoIF9BLCBfViApCV9WCi0jZGVmaW5lIE9TX0FUT01JQ19JTkMoIF9BLCBfViApCQlFbmNhcEF0b21pY0luYyggX0EsICh2b2lkKilfViApCi0jZGVmaW5lIE9TX0FUT01JQ19ERUMoIF9BLCBfViApCQlFbmNhcEF0b21pY0RlYyggX0EsICh2b2lkKilfViApCi0jZGVmaW5lIE9TX01FTU9SWV9DTEVBUiggX0EsIF9TICkJbWVtc2V0KCAodTggKilfQSwwLF9TKQotI2RlZmluZSBPU19NRU1PUllfQ09NUEFSRSggX0EsIF9CLCBfUyApCShtZW1jbXAoX0EsX0IsX1MpPyAwIDogMSkgLy8gRGVmaW5pdGlvbiBpcyByZXZlcnNlIHdpdGggTmRpcyAxOiB0aGUgc2FtZSAwOiBkaWZmZXJlbnQKLQotI2RlZmluZSBPU19USU1FUglzdHJ1Y3QgdGltZXJfbGlzdAotI2RlZmluZSBPU19USU1FUl9JTklUSUFMKCBfVCwgX0YsIF9QICkJCQlcCi17CQkJCQkJCVwKLQlpbml0X3RpbWVyKCBfVCApOwkJCQlcCi0JKF9UKS0+ZnVuY3Rpb24gPSAodm9pZCAqKV9GIyNfMWE7CQlcCi0JKF9UKS0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKV9QOwkJCVwKLX0KLQotLy8gX1MgOiBNaWxsaXNlY29uZAotLy8gMjAwNjA0MjAgQXQgbGVhc3QgMSBsYXJnZSB0aGFuIGppZmZpZXMKLSNkZWZpbmUgT1NfVElNRVJfU0VUKCBfVCwgX1MgKQkJCQkJXAotewkJCQkJCQkJXAotCShfVCktPmV4cGlyZXMgPSBqaWZmaWVzICsgKChfUypIWis5OTkpLzEwMDApO1wKLQlhZGRfdGltZXIoIF9UICk7CQkJCQlcCi19Ci0jZGVmaW5lIE9TX1RJTUVSX0NBTkNFTCggX1QsIF9CICkJCWRlbF90aW1lcl9zeW5jKCBfVCApCi0jZGVmaW5lIE9TX1RJTUVSX0dFVF9TWVNfVElNRSggX1QgKQkJKCpfVD1qaWZmaWVzKQotCi0KLSNlbmRpZiAvLyBDT01NT05fREVGCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3N5c2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvc3lzZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NmQ2M2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvc3lzZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0KLQotLy8KLS8vIFdpbmJvbmQgV0xBTiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBkZWZpbmVzCi0vLwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQ3VycmVudCBkaXJlY3RvcnkgaXMgTGludXgKLS8vIFRoZSBkZWZpbml0aW9uIFdCX0xJTlVYIGlzIGEga2V5d29yZCBmb3IgdGhpcyBPUwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpZm5kZWYgU1lTX0RFRl9ICi0jZGVmaW5lIFNZU19ERUZfSAotI2RlZmluZSBXQl9MSU5VWAotI2RlZmluZSBXQl9MSU5VWF9XUEFfUFNLCi0KLQotLy8jZGVmaW5lIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi0jZGVmaW5lIF9VU0VfRkFMTEJBQ0tfUkFURV8KLS8vI2RlZmluZSBBTlRESVZfREVGQVVMVF9PTgotCi0jZGVmaW5lIF9XUEEyXwkvLyAyMDA2MTEyMiBJdCdzIG5lZWRlZCBmb3IgY3VycmVudCBMaW51eCBkcml2ZXIKLQotCi0jaWZuZGVmIF9XUEFfUFNLX0RFQlVHCi0jdW5kZWYgIF9XUEFfUFNLX0RFQlVHCi0jZW5kaWYKLQotLy8gZGVidWcgcHJpbnQgb3B0aW9ucywgbWFyayB3aGF0IGRlYnVnIHlvdSBkb24ndCBuZWVkCi0KLSNpZmRlZiBGVUxMX0RFQlVHCi0jZGVmaW5lIF9QRV9TVEFURV9EVU1QXwotI2RlZmluZSBfUEVfVFhfRFVNUF8KLSNkZWZpbmUgX1BFX1JYX0RVTVBfCi0jZGVmaW5lIF9QRV9PSURfRFVNUF8KLSNkZWZpbmUgX1BFX0RUT19EVU1QXwotI2RlZmluZSBfUEVfUkVHX0RVTVBfCi0jZGVmaW5lIF9QRV9VU0JfSU5JX0RVTVBfCi0jZW5kaWYKLQotCi0KLSNpbmNsdWRlICJjb21tb24uaCIJLy8gSW5kaXZpZHVhbCBmaWxlIGRlcGVuZHMgb24gT1MKLQotI2luY2x1ZGUgIi4uL3diMzVfdmVyLmgiCi0jaW5jbHVkZSAiLi4vbWFjX3N0cnVjdHVyZXMuaCIKLSNpbmNsdWRlICIuLi9kc190a2lwLmgiCi0jaW5jbHVkZSAiLi4vbG9jYWxwYXJhLmgiCi0jaW5jbHVkZSAiLi4vc21lX3MuaCIKLSNpbmNsdWRlICIuLi9zY2FuX3MuaCIKLSNpbmNsdWRlICIuLi9tZHNfcy5oIgotI2luY2x1ZGUgIi4uL21sbWVfcy5oIgotI2luY2x1ZGUgIi4uL2Jzc2RzY3B0LmgiCi0jaW5jbHVkZSAiLi4vc21lX2FwaS5oIgotI2luY2x1ZGUgIi4uL2dsXzgwMjExLmgiCi0jaW5jbHVkZSAiLi4vbXRvLmgiCi0jaW5jbHVkZSAiLi4vd2JsaW51eF9zLmgiCi0jaW5jbHVkZSAiLi4vd2JoYWxfcy5oIgotCi0KLSNpbmNsdWRlICIuLi9hZGFwdGVyLmgiCi0KLSNpbmNsdWRlICIuLi9tbG1lX21pYi5oIgotI2luY2x1ZGUgIi4uL21kc19mLmgiCi0jaW5jbHVkZSAiLi4vYnNzX2YuaCIKLSNpbmNsdWRlICIuLi9tbG1ldHhyeF9mLmgiCi0jaW5jbHVkZSAiLi4vbXRvX2YuaCIKLSNpbmNsdWRlICIuLi93YmhhbF9mLmgiCi0jaW5jbHVkZSAiLi4vd2JsaW51eF9mLmgiCi0vLyBLZXJuZWwgVGltZXIgcmVzb2x1dGlvbiwgTkRJUyBpcyAxMG1zLCAxMDAwMHVzCi0jZGVmaW5lIE1JTl9USU1FT1VUX1ZBTAkoMTApIC8vbXMKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiNmRiNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NDQgKzAsMCBAQAotI2luY2x1ZGUgInN5c2RlZi5oIgotCi1leHRlcm4gdm9pZCBwaHlfY2FsaWJyYXRpb25fd2luYm9uZChod19kYXRhX3QgKnBod19kYXRhLCB1MzIgZnJlcXVlbmN5KTsKLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLS8vIFJlZ2lzdGVyTm8gOiBzdGFydCBiYXNlCi0vLyBwUmVnaXN0ZXJEYXRhIDogZGF0YSBwb2ludAotLy8gTnVtYmVyT2ZEYXRhIDogbnVtYmVyIG9mIHJlZ2lzdGVyIGRhdGEKLS8vIEZsYWcgOiBBVVRPX0lOQ1JFTUVOVCAtIFJlZ2lzdGVyTm8gd2lsbCBhdXRvIGluY3JlbWVudCA0Ci0vLwkJICBOT19JTkNSRU1FTlQgLSBGdW5jdGlvbiB3aWxsIHdyaXRlIGRhdGEgaW50byB0aGUgc2FtZSByZWdpc3RlcgotdW5zaWduZWQgY2hhcgotV2IzNVJlZ19CdXJzdFdyaXRlKHBod19kYXRhX3QgcEh3RGF0YSwgdTE2IFJlZ2lzdGVyTm8sIHUzMiAqIHBSZWdpc3RlckRhdGEsIHU4IE51bWJlck9mRGF0YSwgdTggRmxhZykKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVBVUkIJCXBVcmIgPSBOVUxMOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlID0gTlVMTDsKLQl1MTYJCVVyYlNpemU7Ci0Jc3RydWN0ICAgICAgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKLQl1MTYJCWksIERhdGFTaXplID0gTnVtYmVyT2ZEYXRhKjQ7Ci0KLQkvLyBNb2R1bGUgc2h1dGRvd24KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIFRyeWluZyB0byB1c2UgYnVyc3Qgd3JpdGUgZnVuY3Rpb24gaWYgdXNlIG5ldyBoYXJkd2FyZQotCVVyYlNpemUgPSBzaXplb2YoUkVHX1FVRVVFKSArIERhdGFTaXplICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOwotCU9TX01FTU9SWV9BTExPQyggKHZvaWQqICopJnBSZWdRdWV1ZSwgVXJiU2l6ZSApOwotCXBVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmKCBwVXJiICYmIHBSZWdRdWV1ZSApIHsKLQkJcFJlZ1F1ZXVlLT5ESVJFQ1QgPSAyOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCi0JCXBSZWdRdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOwotCQlwUmVnUXVldWUtPnBCdWZmZXIgPSAodTMyICopKCh1OCAqKXBSZWdRdWV1ZSArIHNpemVvZihSRUdfUVVFVUUpKTsKLQkJbWVtY3B5KCBwUmVnUXVldWUtPnBCdWZmZXIsIHBSZWdpc3RlckRhdGEsIERhdGFTaXplICk7Ci0JCS8vdGhlIGZ1bmN0aW9uIGZvciByZXZlcnNpbmcgcmVnaXN0ZXIgZGF0YSBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgotCQlmb3IoIGk9MDsgaTxOdW1iZXJPZkRhdGEgOyBpKysgKQotCQkJcFJlZ1F1ZXVlLT5wQnVmZmVyW2ldID0gY3B1X3RvX2xlMzIoIHBSZWdRdWV1ZS0+cEJ1ZmZlcltpXSApOwotCi0JCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcFJlZ1F1ZXVlICsgc2l6ZW9mKFJFR19RVUVVRSkgKyBEYXRhU2l6ZSk7Ci0JCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0U7Ci0JCWRyLT5iUmVxdWVzdCA9IDB4MDQ7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKLQkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KCBGbGFnICk7IC8vIDA6IFJlZ2lzdGVyIG51bWJlciBhdXRvLWluY3JlbWVudCwgMTogTm8gYXV0byBpbmNyZW1lbnQKLQkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KCBSZWdpc3Rlck5vICk7Ci0JCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoIERhdGFTaXplICk7Ci0JCXBSZWdRdWV1ZS0+TmV4dCA9IE5VTEw7Ci0JCXBSZWdRdWV1ZS0+cFVzYlJlcSA9IGRyOwotCQlwUmVnUXVldWUtPnBVcmIgPSBwVXJiOwotCi0JCXNwaW5fbG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCWlmIChwV2IzNVJlZy0+cFJlZ0ZpcnN0ID09IE5VTEwpCi0JCQlwV2IzNVJlZy0+cFJlZ0ZpcnN0ID0gcFJlZ1F1ZXVlOwotCQllbHNlCi0JCQlwV2IzNVJlZy0+cFJlZ0xhc3QtPk5leHQgPSBwUmVnUXVldWU7Ci0JCXBXYjM1UmVnLT5wUmVnTGFzdCA9IHBSZWdRdWV1ZTsKLQotCQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkJLy8gU3RhcnQgRVAwVk0KLQkJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKLQotCQlyZXR1cm4gVFJVRTsKLQl9IGVsc2UgewotCQlpZiAocFVyYikKLQkJCXVzYl9mcmVlX3VyYihwVXJiKTsKLQkJaWYgKHBSZWdRdWV1ZSkKLQkJCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0gICByZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQKLVdiMzVSZWdfVXBkYXRlKHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUpCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlzd2l0Y2ggKFJlZ2lzdGVyTm8pIHsKLQljYXNlIDB4M2IwOiBwV2IzNVJlZy0+VTFCMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgzYmM6IHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg0MDA6IHBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MDA6IHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MDQ6IHBXYjM1UmVnLT5NMDRfTXVsdGljYXN0QWRkcmVzczEgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODA4OiBwV2IzNVJlZy0+TTA4X011bHRpY2FzdEFkZHJlc3MyID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyNDogcFdiMzVSZWctPk0yNF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyODogcFdiMzVSZWctPk0yOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyYzogcFdiMzVSZWctPk0yQ19NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgzODogcFdiMzVSZWctPk0zOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0MDogcFdiMzVSZWctPk00MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0NDogcFdiMzVSZWctPk00NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0ODogcFdiMzVSZWctPk00OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0YzogcFdiMzVSZWctPk00Q19NYWNTdGF0dXMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODYwOiBwV2IzNVJlZy0+TTYwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODY4OiBwV2IzNVJlZy0+TTY4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODcwOiBwV2IzNVJlZy0+TTcwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODc0OiBwV2IzNVJlZy0+TTc0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODc4OiBwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3QzogcFdiMzVSZWctPk03Q19NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4MDogcFdiMzVSZWctPk04MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4NDogcFdiMzVSZWctPk04NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4ODogcFdiMzVSZWctPk04OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg5ODogcFdiMzVSZWctPk05OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMGM6IHBXYjM1UmVnLT5CQjBDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMmM6IHBXYjM1UmVnLT5CQjJDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMzA6IHBXYjM1UmVnLT5CQjMwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwM2M6IHBXYjM1UmVnLT5CQjNDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNDg6IHBXYjM1UmVnLT5CQjQ4ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNGM6IHBXYjM1UmVnLT5CQjRDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTA6IHBXYjM1UmVnLT5CQjUwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTQ6IHBXYjM1UmVnLT5CQjU0ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTg6IHBXYjM1UmVnLT5CQjU4ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNWM6IHBXYjM1UmVnLT5CQjVDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNjA6IHBXYjM1UmVnLT5CQjYwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JfQotfQotCi0vLyBUUlVFICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQotLy8gRkFMU0UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAotdW5zaWduZWQgY2hhcgotV2IzNVJlZ19Xcml0ZVN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCWludCByZXQgPSAtMTsKLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JUmVnaXN0ZXJWYWx1ZSA9IGNwdV90b19sZTMyKFJlZ2lzdGVyVmFsdWUpOwotCi0JLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVzYiBtZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcFdiMzVSZWctPlN5bmNJb1BhdXNlID0gMTsKLQotCS8vIDIwMDYwNzE3LjUgV2FpdCB1bnRpbCBFUDBWTSBzdG9wCi0Jd2hpbGUgKHBXYjM1UmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKQotCQlPU19TTEVFUCgxMDAwMCk7Ci0KLQkvLyBTeW5jIElvQ2FsbERyaXZlcgotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZSggcEh3RGF0YS0+V2JVc2IudWRldiwgMCApLAotCQkJICAgICAgIDB4MDMsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX09VVCwKLQkJCSAgICAgICAweDAsUmVnaXN0ZXJObywgJlJlZ2lzdGVyVmFsdWUsIDQsIEhaKjEwMCApOwotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JcFdiMzVSZWctPlN5bmNJb1BhdXNlID0gMDsKLQotCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQkjaWZkZWYgX1BFX1JFR19EVU1QXwotCQlXQkRFQlVHKCgiRVAwIFdyaXRlIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpKTsKLQkJI2VuZGlmCi0KLQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOyAvLyAyMDA2MDcwNC4yCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLXVuc2lnbmVkIGNoYXIKLVdiMzVSZWdfV3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwotCVBVUkIJCXBVcmIgPSBOVUxMOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlID0gTlVMTDsKLQl1MTYJCVVyYlNpemU7Ci0KLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVyYiByZXF1ZXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVXJiU2l6ZSA9IHNpemVvZihSRUdfUVVFVUUpICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOwotCU9TX01FTU9SWV9BTExPQyggKHZvaWQqICopJnBSZWdRdWV1ZSwgVXJiU2l6ZSApOwotCXBVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmIChwVXJiICYmIHBSZWdRdWV1ZSkgewotCQlwUmVnUXVldWUtPkRJUkVDVCA9IDE7Ly8gYnVyc3Qgd3JpdGUgcmVnaXN0ZXIKLQkJcFJlZ1F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87Ci0JCXBSZWdRdWV1ZS0+VkFMVUUgPSBjcHVfdG9fbGUzMihSZWdpc3RlclZhbHVlKTsKLQkJcFJlZ1F1ZXVlLT5SRVNFUlZFRF9WQUxJRCA9IEZBTFNFOwotCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXBSZWdRdWV1ZSArIHNpemVvZihSRUdfUVVFVUUpKTsKLQkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfRElSX09VVCB8VVNCX1JFQ0lQX0RFVklDRTsKLQkJZHItPmJSZXF1ZXN0ID0gMHgwMzsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQotCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMHgwKTsKLQkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KFJlZ2lzdGVyTm8pOwotCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KDQpOwotCi0JCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCi0JCXBSZWdRdWV1ZS0+TmV4dCA9IE5VTEw7Ci0JCXBSZWdRdWV1ZS0+cFVzYlJlcSA9IGRyOwotCQlwUmVnUXVldWUtPnBVcmIgPSBwVXJiOwotCi0JCXNwaW5fbG9ja19pcnEoJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJaWYgKHBXYjM1UmVnLT5wUmVnRmlyc3QgPT0gTlVMTCkKLQkJCXBXYjM1UmVnLT5wUmVnRmlyc3QgPSBwUmVnUXVldWU7Ci0JCWVsc2UKLQkJCXBXYjM1UmVnLT5wUmVnTGFzdC0+TmV4dCA9IHBSZWdRdWV1ZTsKLQkJcFdiMzVSZWctPnBSZWdMYXN0ID0gcFJlZ1F1ZXVlOwotCi0JCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQkvLyBTdGFydCBFUDBWTQotCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOwotCi0JCXJldHVybiBUUlVFOwotCX0gZWxzZSB7Ci0JCWlmIChwVXJiKQotCQkJdXNiX2ZyZWVfdXJiKHBVcmIpOwotCQlrZnJlZShwUmVnUXVldWUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0vL1RoaXMgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggYSB1c2VyIGRlZmluZWQgdmFsdWUuIFdoZW4gaXQgY29tcGxldGVzLAotLy90aGlzIHZhbHVlIGlzIHVzZWZ1bC4gRm9yIGV4YW1wbGUsIGhhbF9zZXRfY3VycmVudF9jaGFubmVsIHdpbGwgdXNlIGl0LgotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLXVuc2lnbmVkIGNoYXIKLVdiMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggcGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgdTMyIFJlZ2lzdGVyVmFsdWUsCi0JCQkJczggKnBWYWx1ZSwgczggTGVuKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0Jc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7Ci0JUFVSQgkJcFVyYiA9IE5VTEw7Ci0JUFJFR19RVUVVRQlwUmVnUXVldWUgPSBOVUxMOwotCXUxNgkJVXJiU2l6ZTsKLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVyYiByZXF1ZXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVXJiU2l6ZSA9IHNpemVvZihSRUdfUVVFVUUpICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOwotCU9TX01FTU9SWV9BTExPQygodm9pZCogKikgJnBSZWdRdWV1ZSwgVXJiU2l6ZSApOwotCXBVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmIChwVXJiICYmIHBSZWdRdWV1ZSkgewotCQlwUmVnUXVldWUtPkRJUkVDVCA9IDE7Ly8gYnVyc3Qgd3JpdGUgcmVnaXN0ZXIKLQkJcFJlZ1F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87Ci0JCXBSZWdRdWV1ZS0+VkFMVUUgPSBjcHVfdG9fbGUzMihSZWdpc3RlclZhbHVlKTsKLQkJLy9OT1RFIDogVXNlcnMgbXVzdCBndWFyYW50ZWUgdGhlIHNpemUgb2YgdmFsdWUgd2lsbCBub3QgZXhjZWVkIHRoZSBidWZmZXIgc2l6ZS4KLQkJbWVtY3B5KHBSZWdRdWV1ZS0+UkVTRVJWRUQsIHBWYWx1ZSwgTGVuKTsKLQkJcFJlZ1F1ZXVlLT5SRVNFUlZFRF9WQUxJRCA9IFRSVUU7Ci0JCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcFJlZ1F1ZXVlICsgc2l6ZW9mKFJFR19RVUVVRSkpOwotCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SfFVTQl9ESVJfT1VUIHxVU0JfUkVDSVBfREVWSUNFOwotCQlkci0+YlJlcXVlc3QgPSAweDAzOyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCi0JCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNigweDApOwotCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoUmVnaXN0ZXJObyk7Ci0JCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoNCk7Ci0KLQkJLy8gRW50ZXIgdGhlIHNlbmRpbmcgcXVldWUKLQkJcFJlZ1F1ZXVlLT5OZXh0ID0gTlVMTDsKLQkJcFJlZ1F1ZXVlLT5wVXNiUmVxID0gZHI7Ci0JCXBSZWdRdWV1ZS0+cFVyYiA9IHBVcmI7Ci0JCXNwaW5fbG9ja19pcnEgKCZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCWlmKCBwV2IzNVJlZy0+cFJlZ0ZpcnN0ID09IE5VTEwgKQotCQkJcFdiMzVSZWctPnBSZWdGaXJzdCA9IHBSZWdRdWV1ZTsKLQkJZWxzZQotCQkJcFdiMzVSZWctPnBSZWdMYXN0LT5OZXh0ID0gcFJlZ1F1ZXVlOwotCQlwV2IzNVJlZy0+cFJlZ0xhc3QgPSBwUmVnUXVldWU7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxICggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQkvLyBTdGFydCBFUDBWTQotCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOwotCQlyZXR1cm4gVFJVRTsKLQl9IGVsc2UgewotCQlpZiAocFVyYikKLQkJCXVzYl9mcmVlX3VyYihwVXJiKTsKLQkJa2ZyZWUocFJlZ1F1ZXVlKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLS8vIHBSZWdpc3RlclZhbHVlIDogSXQgbXVzdCBiZSBhIHJlc2lkZW50IGJ1ZmZlciBkdWUgdG8gYXN5bmNocm9ub3VzIHJlYWQgcmVnaXN0ZXIuCi11bnNpZ25lZCBjaGFyCi1XYjM1UmVnX1JlYWRTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JdTMyICoJcGx0bXAgPSBwUmVnaXN0ZXJWYWx1ZTsKLQlpbnQgcmV0ID0gLTE7Ci0KLQkvLyBNb2R1bGUgc2h1dGRvd24KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIFJlYWQgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXNiIG1lc3NhZ2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXBXYjM1UmVnLT5TeW5jSW9QYXVzZSA9IDE7Ci0KLQkvLyAyMDA2MDcxNy41IFdhaXQgdW50aWwgRVAwVk0gc3RvcAotCXdoaWxlIChwV2IzNVJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCkKLQkJT1NfU0xFRVAoMTAwMDApOwotCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2coIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDApLAotCQkJICAgICAgIDB4MDEsIFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU4sCi0JCQkgICAgICAgMHgwLCBSZWdpc3Rlck5vLCBwbHRtcCwgNCwgSFoqMTAwICk7Ci0KLQkqcFJlZ2lzdGVyVmFsdWUgPSBjcHVfdG9fbGUzMigqcGx0bXApOwotCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKLQotCVdiMzVSZWdfVXBkYXRlKCBwSHdEYXRhLCBSZWdpc3Rlck5vLCAqcFJlZ2lzdGVyVmFsdWUgKTsKLQlwV2IzNVJlZy0+U3luY0lvUGF1c2UgPSAwOwotCi0JV2IzNVJlZ19FUDBWTV9zdGFydCggcEh3RGF0YSApOwotCi0JaWYgKHJldCA8IDApIHsKLQkJI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJV0JERUJVRygoIkVQMCBSZWFkIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpKTsKLQkJI2VuZGlmCi0KLQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOyAvLyAyMDA2MDcwNC4yCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLS8vIHBSZWdpc3RlclZhbHVlIDogSXQgbXVzdCBiZSBhIHJlc2lkZW50IGJ1ZmZlciBkdWUgdG8gYXN5bmNocm9ub3VzIHJlYWQgcmVnaXN0ZXIuCi11bnNpZ25lZCBjaGFyCi1XYjM1UmVnX1JlYWQocGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgIHUzMiAqIHBSZWdpc3RlclZhbHVlICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKiBkcjsKLQlQVVJCCQlwVXJiOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlOwotCXUxNgkJVXJiU2l6ZTsKLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gdXBkYXRlIHRoZSB2YXJpYWJsZSBieSBzZW5kIFVyYiB0byByZWFkIHJlZ2lzdGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVyYlNpemUgPSBzaXplb2YoUkVHX1FVRVVFKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKLQlPU19NRU1PUllfQUxMT0MoICh2b2lkKiAqKSZwUmVnUXVldWUsIFVyYlNpemUgKTsKLQlwVXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlpZiggcFVyYiAmJiBwUmVnUXVldWUgKQotCXsKLQkJcFJlZ1F1ZXVlLT5ESVJFQ1QgPSAwOy8vIHJlYWQgcmVnaXN0ZXIKLQkJcFJlZ1F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87Ci0JCXBSZWdRdWV1ZS0+cEJ1ZmZlciA9IHBSZWdpc3RlclZhbHVlOwotCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXBSZWdRdWV1ZSArIHNpemVvZihSRUdfUVVFVUUpKTsKLQkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU47Ci0JCWRyLT5iUmVxdWVzdCA9IDB4MDE7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKLQkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7Ci0JCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNiAoUmVnaXN0ZXJObyk7Ci0JCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYgKDQpOwotCi0JCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCi0JCXBSZWdRdWV1ZS0+TmV4dCA9IE5VTEw7Ci0JCXBSZWdRdWV1ZS0+cFVzYlJlcSA9IGRyOwotCQlwUmVnUXVldWUtPnBVcmIgPSBwVXJiOwotCQlzcGluX2xvY2tfaXJxICggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJaWYoIHBXYjM1UmVnLT5wUmVnRmlyc3QgPT0gTlVMTCApCi0JCQlwV2IzNVJlZy0+cFJlZ0ZpcnN0ID0gcFJlZ1F1ZXVlOwotCQllbHNlCi0JCQlwV2IzNVJlZy0+cFJlZ0xhc3QtPk5leHQgPSBwUmVnUXVldWU7Ci0JCXBXYjM1UmVnLT5wUmVnTGFzdCA9IHBSZWdRdWV1ZTsKLQotCQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkJLy8gU3RhcnQgRVAwVk0KLQkJV2IzNVJlZ19FUDBWTV9zdGFydCggcEh3RGF0YSApOwotCi0JCXJldHVybiBUUlVFOwotCX0gZWxzZSB7Ci0JCWlmIChwVXJiKQotCQkJdXNiX2ZyZWVfdXJiKCBwVXJiICk7Ci0JCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci19Ci0KLQotdm9pZAotV2IzNVJlZ19FUDBWTV9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmIChPU19BVE9NSUNfSU5DKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSZWctPlJlZ0ZpcmVDb3VudCkgPT0gMSkgewotCQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCQlXYjM1UmVnX0VQMFZNKHBId0RhdGEpOwotCX0gZWxzZQotCQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSZWctPlJlZ0ZpcmVDb3VudCApOwotfQotCi12b2lkCi1XYjM1UmVnX0VQMFZNKHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlQVVJCCQlwVXJiOwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwotCXUzMiAqCQlwQnVmZmVyOwotCWludAkJCXJldCA9IC0xOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlOwotCi0KLQlpZiAocFdiMzVSZWctPlN5bmNJb1BhdXNlKQotCQlnb3RvIGNsZWFudXA7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCWdvdG8gY2xlYW51cDsKLQotCS8vIEdldCB0aGUgcmVnaXN0ZXIgZGF0YSBhbmQgc2VuZCB0byBVU0IgdGhyb3VnaCBJcnAKLQlzcGluX2xvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCXBSZWdRdWV1ZSA9IHBXYjM1UmVnLT5wUmVnRmlyc3Q7Ci0Jc3Bpbl91bmxvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JaWYgKCFwUmVnUXVldWUpCi0JCWdvdG8gY2xlYW51cDsKLQotCS8vIEdldCBhbiBVcmIsIHNlbmQgaXQKLQlwVXJiID0gKFBVUkIpcFJlZ1F1ZXVlLT5wVXJiOwotCi0JZHIgPSBwUmVnUXVldWUtPnBVc2JSZXE7Ci0JcFVyYiA9IHBSZWdRdWV1ZS0+cFVyYjsKLQlwQnVmZmVyID0gcFJlZ1F1ZXVlLT5wQnVmZmVyOwotCWlmIChwUmVnUXVldWUtPkRJUkVDVCA9PSAxKSAvLyBvdXRwdXQKLQkJcEJ1ZmZlciA9ICZwUmVnUXVldWUtPlZBTFVFOwotCi0JdXNiX2ZpbGxfY29udHJvbF91cmIoIHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgICAgICBSRUdfRElSRUNUSU9OKHBId0RhdGEtPldiVXNiLnVkZXYscFJlZ1F1ZXVlKSwKLQkJCSAgICAgICh1OCAqKWRyLHBCdWZmZXIsY3B1X3RvX2xlMTYoZHItPndMZW5ndGgpLAotCQkJICAgICAgV2IzNVJlZ19FUDBWTV9jb21wbGV0ZSwgKHZvaWQqKXBId0RhdGEpOwotCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQotCXJldCA9IHdiX3VzYl9zdWJtaXRfdXJiKCBwVXJiICk7Ci0KLQlpZiAocmV0IDwgMCkgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJV0JERUJVRygoIkVQMCBJcnAgc2VuZGluZyBlcnJvclxuIikpOwotI2VuZGlmCi0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlyZXR1cm47Ci0KLSBjbGVhbnVwOgotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UmVnLT5SZWdGaXJlQ291bnQgKTsKLX0KLQotCi12b2lkCi1XYjM1UmVnX0VQMFZNX2NvbXBsZXRlKFBVUkIgcFVyYikKLXsKLQlwaHdfZGF0YV90ICBwSHdEYXRhID0gKHBod19kYXRhX3QpcFVyYi0+Y29udGV4dDsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlOwotCi0KLQkvLyBWYXJpYWJsZSBzZXR0aW5nCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fQ09NUExFVEVEOwotCXBXYjM1UmVnLT5FUDBWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpIHsgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQotCQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOwotCQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSZWctPlJlZ0ZpcmVDb3VudCApOwotCX0gZWxzZSB7Ci0JCS8vIENvbXBsZXRlIHRvIHNlbmQsIHJlbW92ZSB0aGUgVVJCIGZyb20gdGhlIGZpcnN0Ci0JCXNwaW5fbG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCXBSZWdRdWV1ZSA9IHBXYjM1UmVnLT5wUmVnRmlyc3Q7Ci0JCWlmIChwUmVnUXVldWUgPT0gcFdiMzVSZWctPnBSZWdMYXN0KQotCQkJcFdiMzVSZWctPnBSZWdMYXN0ID0gTlVMTDsKLQkJcFdiMzVSZWctPnBSZWdGaXJzdCA9IHBXYjM1UmVnLT5wUmVnRmlyc3QtPk5leHQ7Ci0JCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQlpZiAocFdiMzVSZWctPkVQMFZNX3N0YXR1cykgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJCVdCREVCVUcoKCJFUDAgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7Ci0JCQlEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggcFdiMzVSZWctPkVQMFZNX3N0YXR1cyApOwotI2VuZGlmCi0JCQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOwotCQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwotCQl9IGVsc2UgewotCQkJLy8gU3VjY2Vzcy4gVXBkYXRlIHRoZSByZXN1bHQKLQotCQkJLy8gU3RhcnQgdGhlIG5leHQgc2VuZAotCQkJV2IzNVJlZ19FUDBWTShwSHdEYXRhKTsKLQkJfQotCi0gICAJCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JfQotCi0JdXNiX2ZyZWVfdXJiKHBVcmIpOwotfQotCi0KLXZvaWQKLVdiMzVSZWdfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlQVVJCCQlwVXJiOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlOwotCi0KLQlVeHhfcG93ZXJfb2ZmX3Byb2NlZHVyZShwSHdEYXRhKTsKLQotCS8vIFdhaXQgZm9yIFJlZyBvcGVyYXRpb24gY29tcGxldGVkCi0JZG8gewotCQlPU19TTEVFUCgxMDAwMCk7IC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmEKLQl9IHdoaWxlIChwV2IzNVJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCk7Ci0JT1NfU0xFRVAoMTAwMDApOyAgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYgotCi0JLy8gUmVsZWFzZSBhbGwgdGhlIGRhdGEgaW4gUmVnUXVldWUKLQlzcGluX2xvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCXBSZWdRdWV1ZSA9IHBXYjM1UmVnLT5wUmVnRmlyc3Q7Ci0Jd2hpbGUgKHBSZWdRdWV1ZSkgewotCQlpZiAocFJlZ1F1ZXVlID09IHBXYjM1UmVnLT5wUmVnTGFzdCkKLQkJCXBXYjM1UmVnLT5wUmVnTGFzdCA9IE5VTEw7Ci0JCXBXYjM1UmVnLT5wUmVnRmlyc3QgPSBwV2IzNVJlZy0+cFJlZ0ZpcnN0LT5OZXh0OwotCi0JCXBVcmIgPSBwUmVnUXVldWUtPnBVcmI7Ci0JCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJaWYgKHBVcmIpIHsKLQkJCXVzYl9mcmVlX3VyYihwVXJiKTsKLQkJCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkjaWZkZWYgX1BFX1JFR19EVU1QXwotCQkJV0JERUJVRygoIkVQMCBxdWV1ZSByZWxlYXNlIGVycm9yXG4iKSk7Ci0JCQkjZW5kaWYKLQkJfQotCQlzcGluX2xvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JCXBSZWdRdWV1ZSA9IHBXYjM1UmVnLT5wUmVnRmlyc3Q7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFRoZSBmdW5jdGlvbiBjYW4gYmUgcnVuIGluIHBhc3NpdmUtbGV2ZWwgb25seS4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWc9JnBId0RhdGEtPldiMzVSZWc7Ci0JdTMyIGx0bXA7Ci0JdTMyIFNvZnR3YXJlU2V0LCBWQ09fdHJpbSwgVHhWZ2EsIFJlZ2lvbl9TY2FuSW50ZXJ2YWw7Ci0KLQkvLyBTcGluIGxvY2sgaXMgYWNxdWlyZWQgZm9yIHJlYWQgYW5kIHdyaXRlIElSUCBjb21tYW5kCi0Jc3Bpbl9sb2NrX2luaXQoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkvLyBHZXR0aW5nIFJGIG1vZHVsZSB0eXBlIGZyb20gRUVQUk9NIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgwZDAwMDAgKTsgLy8gU3RhcnQgRUVQUk9NIGFjY2VzcyArIFJlYWQgKyBhZGRyZXNzKDB4MGQpCi0JV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmbHRtcCApOwotCi0JLy9VcGRhdGUgUkYgbW9kdWxlIHR5cGUgYW5kIGRldGVybWluZSB0aGUgUEhZIHR5cGUgYnkgaW5mIG9yIEVFUFJPTQotCXBXYjM1UmVnLT5FRVBST01QaHlUeXBlID0gKHU4KSggbHRtcCAmIDB4ZmYgKTsKLQkvLyAwIFYgTUFYMjgyNSwgMSBWIE1BWDI4MjcsIDIgViBNQVgyODI4LCAzIFYgTUFYMjgyOQotCS8vIDE2ViBBTDIyMzAsIDE3IC0gQUw3MjMwLCAxOCAtIEFMMjIzMFMKLQkvLyAzMiBSZXNlcnZlZAotCS8vIDMzIC0gVzg5UkYyNDIoVHhWR0EgMH4xOSksIDM0IC0gVzg5UkYyNDIoVHhWR0EgMH4zNCkKLQlpZiAocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgIT0gUkZfREVDSURFX0JZX0lORikgewotCQlpZiggKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjUpCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyNykJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI4KQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjkpCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fVjEpCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfQUlST0hBXzIyMzApCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfQUlST0hBXzIyMzBTKSAgICB8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV83MjMwKQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX1dCXzI0MikJCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfV0JfMjQyXzEpKQotCQkJcEh3RGF0YS0+cGh5X3R5cGUgPSBwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZTsKLQl9Ci0KLQkvLyBQb3dlciBPbiBwcm9jZWR1cmUgcnVubmluZy4gVGhlIHJlbGF0aXZlIHBhcmFtZXRlciB3aWxsIGJlIHNldCBhY2NvcmRpbmcgdG8gcGh5X3R5cGUKLQlVeHhfcG93ZXJfb25fcHJvY2VkdXJlKCBwSHdEYXRhICk7Ci0KLQkvLyBSZWFkaW5nIE1BQyBhZGRyZXNzCi0JVXh4X1JlYWRFdGhlcm5ldEFkZHJlc3MoIHBId0RhdGEgKTsKLQotCS8vIFJlYWQgVkNPIHRyaW0gZm9yIFJGIHBhcmFtZXRlcgotCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgyMDAwMDAgKTsKLQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZWQ09fdHJpbSApOwotCi0JLy8gUmVhZCBBbnRlbm5hIE9uL09mZiBvZiBzb2Z0d2FyZSBmbGFnCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODIxMDAwMCApOwotCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlNvZnR3YXJlU2V0ICk7Ci0KLQkvLyBSZWFkIFRYVkdBCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODEwMDAwMCApOwotCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlR4VmdhICk7Ci0KLQkvLyBHZXQgU2NhbiBpbnRlcnZhbCBzZXR0aW5nIGZyb20gRUVQUk9NIG9mZnNldCAweDFjCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODFkMDAwMCApOwotCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlJlZ2lvbl9TY2FuSW50ZXJ2YWwgKTsKLQotCS8vIFVwZGF0ZSBFdGhlcm5ldCBhZGRyZXNzCi0JbWVtY3B5KCBwSHdEYXRhLT5DdXJyZW50TWFjQWRkcmVzcywgcEh3RGF0YS0+UGVybWFuZW50TWFjQWRkcmVzcywgRVRIX0xFTkdUSF9PRl9BRERSRVNTICk7Ci0KLQkvLyBVcGRhdGUgc29mdHdhcmUgdmFyaWFibGUKLQlwSHdEYXRhLT5Tb2Z0d2FyZVNldCA9ICh1MTYpKFNvZnR3YXJlU2V0ICYgMHhmZmZmKTsKLQlUeFZnYSAmPSAweDAwMDAwMGZmOwotCXBId0RhdGEtPlBvd2VySW5kZXhGcm9tRUVQUk9NID0gKHU4KVR4VmdhOwotCXBId0RhdGEtPlZDT190cmltID0gKHU4KVZDT190cmltICYgMHhmZjsKLQlpZiAocEh3RGF0YS0+VkNPX3RyaW0gPT0gMHhmZikKLQkJcEh3RGF0YS0+VkNPX3RyaW0gPSAweDI4OwotCi0JcFdiMzVSZWctPkVFUFJPTVJlZ2lvbiA9ICh1OCkoUmVnaW9uX1NjYW5JbnRlcnZhbD4+OCk7IC8vIDIwMDYwNzIwCi0JaWYoIHBXYjM1UmVnLT5FRVBST01SZWdpb248MSB8fCBwV2IzNVJlZy0+RUVQUk9NUmVnaW9uPjYgKQotCQlwV2IzNVJlZy0+RUVQUk9NUmVnaW9uID0gUkVHSU9OX0FVVE87Ci0KLQkvL0ZvciBHZXQgVHggVkdBIGZyb20gRUVQUk9NIDIwMDYwMzE1LjUgbW92ZSBoZXJlCi0JR2V0VHhWZ2FGcm9tRUVQUk9NKCBwSHdEYXRhICk7Ci0KLQkvLyBTZXQgU2NhbiBJbnRlcnZhbAotCXBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPSAodTgpKFJlZ2lvbl9TY2FuSW50ZXJ2YWwgJiAweGZmKSAqIDEwOwotCWlmICgocEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA9PSAyNTUwKSB8fCAocEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA8IDEwKSkgLy8gSXMgZGVmYXVsdCBzZXR0aW5nIDB4ZmYgKiAxMAotCQlwSHdEYXRhLT5TY2FuX0ludGVydmFsID0gU0NBTl9NQVhfQ0hOTF9USU1FOwotCi0JLy8gSW5pdGlhbCByZWdpc3RlcgotCVJGU3ludGhlc2l6ZXJfaW5pdGlhbChwSHdEYXRhKTsKLQotCUJCUHJvY2Vzc29yX2luaXRpYWwocEh3RGF0YSk7IC8vIEFzeW5jIHdyaXRlLCBtdXN0IHdhaXQgdW50aWwgY29tcGxldGUKLQotCVdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKHBId0RhdGEpOwotCi0JTXh4X2luaXRpYWwocEh3RGF0YSk7Ci0JRHh4X2luaXRpYWwocEh3RGF0YSk7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBUUlVFOyAvLyBJbml0aWFsIGZhaWwKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIENhcmRDb21wdXRlQ3JjIC0tCi0vLwotLy8gIERlc2NyaXB0aW9uOgotLy8gICAgUnVucyB0aGUgQVVUT0RJTiBJSSBDUkMgYWxnb3JpdGhtIG9uIGJ1ZmZlciBCdWZmZXIgb2YgbGVuZ3RoLCBMZW5ndGguCi0vLwotLy8gIEFyZ3VtZW50czoKLS8vICAgIEJ1ZmZlciAtIHRoZSBpbnB1dCBidWZmZXIKLS8vICAgIExlbmd0aCAtIHRoZSBsZW5ndGggb2YgQnVmZmVyCi0vLwotLy8gIFJldHVybiBWYWx1ZToKLS8vICAgIFRoZSAzMi1iaXQgQ1JDIHZhbHVlLgotLy8KLS8vICBOb3RlOgotLy8gICAgVGhpcyBpcyBhZGFwdGVkIGZyb20gdGhlIGNvbW1lbnRzIGluIHRoZSBhc3NlbWJseSBsYW5ndWFnZQotLy8gICAgdmVyc2lvbiBpbiBfR0VOUkVRLkFTTSBvZiB0aGUgRFdCIE5FMTAwMC8yMDAwIGRyaXZlci4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdTMyCi1DYXJkQ29tcHV0ZUNyYyh1OCAqIEJ1ZmZlciwgdTMyIExlbmd0aCkKLXsKLSAgICB1MzIgQ3JjLCBDYXJyeTsKLSAgICB1MzIgIGksIGo7Ci0gICAgdTggQ3VyQnl0ZTsKLQotICAgIENyYyA9IDB4ZmZmZmZmZmY7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTGVuZ3RoOyBpKyspIHsKLQotICAgICAgICBDdXJCeXRlID0gQnVmZmVyW2ldOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLQotICAgICAgICAgICAgQ2FycnkgICAgID0gKChDcmMgJiAweDgwMDAwMDAwKSA/IDEgOiAwKSBeIChDdXJCeXRlICYgMHgwMSk7Ci0gICAgICAgICAgICBDcmMgICAgIDw8PSAxOwotICAgICAgICAgICAgQ3VyQnl0ZSA+Pj0gMTsKLQotICAgICAgICAgICAgaWYgKENhcnJ5KSB7Ci0gICAgICAgICAgICAgICAgQ3JjID0oQ3JjIF4gMHgwNGMxMWRiNikgfCBDYXJyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBDcmM7Ci19Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEJpdFJldmVyc2UgLS0KLS8vICAgUmV2ZXJzZSB0aGUgYml0cyBpbiB0aGUgaW5wdXQgYXJndW1lbnQsIGR3RGF0YSwgd2hpY2ggaXMKLS8vICAgcmVnYXJkZWQgYXMgYSBzdHJpbmcgb2YgYml0cyB3aXRoIHRoZSBsZW5ndGgsIERhdGFMZW5ndGguCi0vLwotLy8gQXJndW1lbnRzOgotLy8gICBkd0RhdGEgICAgIDoKLS8vICAgRGF0YUxlbmd0aCA6Ci0vLwotLy8gUmV0dXJuOgotLy8gICBUaGUgY29udmVydGVkIHZhbHVlLgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXUzMiBCaXRSZXZlcnNlKCB1MzIgZHdEYXRhLCB1MzIgRGF0YUxlbmd0aCkKLXsKLQl1MzIgICBIYWxmTGVuZ3RoLCBpLCBqOwotCXUzMiAgIEJpdEEsIEJpdEI7Ci0KLQlpZiAoIERhdGFMZW5ndGggPD0gMCkgICAgICAgcmV0dXJuIDA7ICAgLy8gTm8gY29udmVyc2lvbiBpcyBkb25lLgotCWR3RGF0YSA9IGR3RGF0YSAmICgweGZmZmZmZmZmID4+ICgzMiAtIERhdGFMZW5ndGgpKTsKLQotCUhhbGZMZW5ndGggPSBEYXRhTGVuZ3RoIC8gMjsKLQlmb3IgKCBpID0gMCwgaiA9IERhdGFMZW5ndGgtMSA7IGkgPCBIYWxmTGVuZ3RoOyBpKyssIGotLSkKLQl7Ci0JCUJpdEEgPSBHZXRCaXQoIGR3RGF0YSwgaSk7Ci0JCUJpdEIgPSBHZXRCaXQoIGR3RGF0YSwgaik7Ci0JCWlmIChCaXRBICYmICFCaXRCKSB7Ci0JCQlkd0RhdGEgPSBDbGVhckJpdCggZHdEYXRhLCBpKTsKLQkJCWR3RGF0YSA9IFNldEJpdCggZHdEYXRhLCBqKTsKLQkJfSBlbHNlIGlmICghQml0QSAmJiBCaXRCKSB7Ci0JCQlkd0RhdGEgPSBTZXRCaXQoIGR3RGF0YSwgaSk7Ci0JCQlkd0RhdGEgPSBDbGVhckJpdCggZHdEYXRhLCBqKTsKLQkJfSBlbHNlCi0JCXsKLQkJCS8vIERvIG5vdGhpbmcgc2luY2UgdGhlc2UgdHdvIGJpdHMgYXJlIG9mIHRoZSBzYXZlIHZhbHVlcy4KLQkJfQotCX0KLQotCXJldHVybiBkd0RhdGE7Ci19Ci0KLXZvaWQgV2IzNVJlZ19waHlfY2FsaWJyYXRpb24oICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCXUzMiBCQjNjLCBCQjU0OwotCi0JaWYgKChwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9XQl8yNDIpIHx8Ci0JCShwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9XQl8yNDJfMSkpIHsKLQkJcGh5X2NhbGlicmF0aW9uX3dpbmJvbmQgKCBwSHdEYXRhLCAyNDEyICk7IC8vIFN5bmMgb3BlcmF0aW9uCi0JCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MTAzYywgJkJCM2MgKTsKLQkJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgxMDU0LCAmQkI1NCApOwotCi0JCXBId0RhdGEtPkJCM2NfY2FsID0gQkIzYzsKLQkJcEh3RGF0YS0+QkI1NF9jYWwgPSBCQjU0OwotCi0JCVJGU3ludGhlc2l6ZXJfaW5pdGlhbChwSHdEYXRhKTsKLQkJQkJQcm9jZXNzb3JfaW5pdGlhbChwSHdEYXRhKTsgLy8gQXN5bmMgb3BlcmF0aW9uCi0KLQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTAzYywgQkIzYyApOwotCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDU0LCBCQjU0ICk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWdfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDZjZmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19mLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBVeHhfcG93ZXJfb25fcHJvY2VkdXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFV4eF9wb3dlcl9vZmZfcHJvY2VkdXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFV4eF9SZWFkRXRoZXJuZXRBZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIER4eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIE14eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFJGU3ludGhlc2l6ZXJfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotLy92b2lkIFJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHM4IENoYW5uZWwgKTsKLXZvaWQgUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gQ2hhbm5lbCApOwotdm9pZCBCQlByb2Nlc3Nvcl9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIEJCUHJvY2Vzc29yX1JhdGVDaGFuZ2luZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IHJhdGUgKTsgLy8gMjAwNjA2MTMuMQotLy92b2lkIFJGX1JhdGVDaGFuZ2luZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IHJhdGUgKTsgLy8gMjAwNjA2MjYuNS5jIEFkZAotdTggUkZTeW50aGVzaXplcl9TZXRQb3dlckluZGV4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggUG93ZXJJbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjhfMjRQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjhfNTBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjdfMjRQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjdfNTBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjVQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRBaXJvaGEyMjMwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0QWlyb2hhNzIzMFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldFdpbmJvbmQyNDJQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdm9pZCBHZXRUeFZnYUZyb21FRVBST00oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgRUVQUk9NVHhWZ2FBZGp1c3QoICBwaHdfZGF0YV90IHBId0RhdGEgKTsgLy8gMjAwNjA2MTkuNSBBZGQKLQotI2RlZmluZSBSRldyaXRlQ29udHJvbERhdGEoIF9BLCBfViApIFdiMzVSZWdfV3JpdGUoIF9BLCAweDA4NjQsIF9WICkKLQotdm9pZCBXYjM1UmVnX2Rlc3Ryb3koICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLQotdW5zaWduZWQgY2hhciBXYjM1UmVnX1JlYWQoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApOwotdW5zaWduZWQgY2hhciBXYjM1UmVnX1JlYWRTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19Xcml0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19Xcml0ZVN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggIHBod19kYXRhX3QgcEh3RGF0YSwKLQkJCQkJCQkJIHUxNiBSZWdpc3Rlck5vLAotCQkJCQkJCQkgdTMyIFJlZ2lzdGVyVmFsdWUsCi0JCQkJCQkJCSBzOCAqcFZhbHVlLAotCQkJCQkJCQkgczggTGVuKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19CdXJzdFdyaXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgKiBwUmVnaXN0ZXJEYXRhLCAgdTggTnVtYmVyT2ZEYXRhLCAgdTggRmxhZyApOwotCi12b2lkIFdiMzVSZWdfRVAwVk0oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVJlZ19FUDBWTV9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1UmVnX0VQMFZNX2NvbXBsZXRlKCAgUFVSQiBwVXJiICk7Ci0KLXUzMiBCaXRSZXZlcnNlKCB1MzIgZHdEYXRhLCB1MzIgRGF0YUxlbmd0aCk7Ci0KLXZvaWQgQ2FyZEdldE11bHRpY2FzdEJpdCggICB1OCBBZGRyZXNzW01BQ19BRERSX0xFTkdUSF0sICB1OCAqQnl0ZSwgIHU4ICpWYWx1ZSApOwotdTMyIENhcmRDb21wdXRlQ3JjKCAgdTggKiBCdWZmZXIsICB1MzIgTGVuZ3RoICk7Ci0KLXZvaWQgV2IzNVJlZ19waHlfY2FsaWJyYXRpb24oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVJlZ19VcGRhdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Ci11bnNpZ25lZCBjaGFyIGFkanVzdF9UWFZHQV9mb3JfaXFfbWFnKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzNWI5My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLyoKLQkJCQlIQUwgc2V0dGluZyBmdW5jdGlvbgotCi0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJfFV4eHwgCXxEeHh8CXxNeHh8CXxCQnwJfFJGfAotCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCQl8CQkJCQl8Ci0JCVdiMzVSZWdfUmVhZAkJV2IzNVJlZ19Xcml0ZQotCi0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlXYlVzYl9DYWxsVVNCREFTeW5jCQkJCQlzdXBwbGllZCBCeSBXYlVzYiBtb2R1bGUKLSovCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jZGVmaW5lICAgICBHZXRCaXQoIGR3RGF0YSwgaSkgICAgICAoIGR3RGF0YSAmICgweDAwMDAwMDAxIDw8IGkpKQotI2RlZmluZSAgICAgU2V0Qml0KCBkd0RhdGEsIGkpICAgICAgKCBkd0RhdGEgfCAoMHgwMDAwMDAwMSA8PCBpKSkKLSNkZWZpbmUgICAgIENsZWFyQml0KCBkd0RhdGEsIGkpICAgICggZHdEYXRhICYgfigweDAwMDAwMDAxIDw8IGkpKQotCi0jZGVmaW5lCQlJR05PUkVfSU5DUkVNRU5UCTAKLSNkZWZpbmUJCUFVVE9fSU5DUkVNRU5UCQkwCi0jZGVmaW5lCQlOT19JTkNSRU1FTlQJCTEKLSNkZWZpbmUgUkVHX0RJUkVDVElPTihfeCxfeSkgICAoKF95KS0+RElSRUNUID09MCA/IHVzYl9yY3ZjdHJscGlwZShfeCwwKSA6IHVzYl9zbmRjdHJscGlwZShfeCwwKSkKLSNkZWZpbmUgUkVHX0JVRl9TSVpFKF94KSAgICAgICAoKF94KS0+YlJlcXVlc3Q9PSAweDA0ID8gY3B1X3RvX2xlMTYoKF94KS0+d0xlbmd0aCkgOiA0KQotCi0vLyAyMDA2MDYxMy4yIEFkZCB0aGUgZm9sbG93IGRlZmluaXRpb24KLSNkZWZpbmUgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUIJCTB4MDAzMzQ0N2MKLSNkZWZpbmUgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUIJCTB4MEEwMEZFRkYKLSNkZWZpbmUgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUcJCTB4MDAzMzJDMUIKLSNkZWZpbmUgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUcJCTB4MEEwMEZFRkYKLQotCi0jZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDAyOTIzMTUJLy9iYWNrb2ZmICAyZEIKLSNkZWZpbmUgQkI0Q19ERUZBVUxUX1dCMjQyXzExQgkJMHgwODAwRkVGRgkvL2JhY2tvZmYgIDJkQgotLy8jZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDAyMDFCMTEJLy9iYWNrb2ZmICA0ZEIKLS8vI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCCQkweDA2MDBGRjAwCS8vYmFja29mZiAgNGRCCi0jZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUcJCTB4MDA0NTNCMjQKLSNkZWZpbmUgQkI0Q19ERUZBVUxUX1dCMjQyXzExRwkJMHgwRTAwRkVGRgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRGVmYXVsdCBzZXR0aW5nIGZvciBNeHgKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIERFRkFVTFRfQ1dNSU4JCQkJCTMxCQkvLyhNMkMpIENXbWluLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMzEuCi0jZGVmaW5lIERFRkFVTFRfQ1dNQVgJCQkJCTEwMjMJLy8oTTJDKSBDV21heC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTEwMjMuCi0jZGVmaW5lIERFRkFVTFRfQUlECQkJCQkJMQkJLy8oTTM0KSBBSUQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMS0yMDA3LgotCi0jaWZkZWYgX1VTRV9GQUxMQkFDS19SQVRFXwotI2RlZmluZSBERUZBVUxUX1JBVEVfUkVUUllfTElNSVQJCTIJCS8vKE0zOCkgYXMgbmFtZWQKLSNlbHNlCi0jZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAkJNwkJLy8oTTM4KSBhcyBuYW1lZAotI2VuZGlmCi0KLSNkZWZpbmUgREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUCQk3CQkvLyhNMzgpIExvbmdSZXRyeUxpbWl0LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuCi0jZGVmaW5lIERFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQJCTcJCS8vKE0zOCkgU2hvcnRSZXRyeUxpbWl0LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuCi0jZGVmaW5lIERFRkFVTFRfUElGU1QJCQkJCTI1CQkvLyhNM0MpIFBJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgotI2RlZmluZSBERUZBVUxUX0VJRlNUCQkJCQkzNTQJCS8vKE0zQykgRUlGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTA0ODU3NS4KLSNkZWZpbmUgREVGQVVMVF9ESUZTVAkJCQkJNDUJCS8vKE0zQykgRElGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfU0lGU1QJCQkJCTUJCS8vKE0zQykgU0lGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfT1NJRlNUCQkJCQkxMAkJLy8oTTNDKSBPcmlnaW5hbCBTSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KLSNkZWZpbmUgREVGQVVMVF9BVElNV0QJCQkJCTAJCS8vKE00MCkgQVRJTSBXaW5kb3cuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KLSNkZWZpbmUgREVGQVVMVF9TTE9UX1RJTUUJCQkJMjAJCS8vKE00MCkgKCQpIFNsb3RUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMjU1LgotI2RlZmluZSBERUZBVUxUX01BWF9UWF9NU0RVX0xJRkVfVElNRQk1MTIJLy8oTTQ0KSBNYXhUeE1TRFVMaWZlVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTQyOTQ5NjcyOTUuCi0jZGVmaW5lIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMCQkJNTAwCQkvLyhNNDgpIEJlYWNvbiBJbnRlcnZhbC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgotI2RlZmluZSBERUZBVUxUX1BST0JFX0RFTEFZX1RJTUUJCTIwMAkJLy8oTTQ4KSBQcm9iZSBEZWxheSBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfUFJPVE9DT0xfVkVSU0lPTgkJMAkJLy8oTTRDKQotI2RlZmluZSBERUZBVUxUX01BQ19QT1dFUl9TVEFURQkJCTIJCS8vKE00QykgMjogTUFDIGF0IHBvd2VyIGFjdGl2ZQotI2RlZmluZSBERUZBVUxUX0RUSU1fQUxFUlRfVElNRQkJCTAKLQotCi10eXBlZGVmIHN0cnVjdCBfUkVHX1FVRVVFCi17Ci0gICAgc3RydWN0ICB1cmIgKnBVcmI7Ci0Jdm9pZCoJcFVzYlJlcTsKLQl2b2lkKglOZXh0OwotCXVuaW9uCi0JewotCQl1MzIJVkFMVUU7Ci0JCXUzMiAqCXBCdWZmZXI7Ci0JfTsKLQl1OAlSRVNFUlZFRFs0XTsvLyBzcGFjZSByZXNlcnZlZCBmb3IgY29tbXVuaWNhdGlvbgotCi0gICAgdTE2CUlOREVYOyAvLyBGb3Igc3RvcmluZyB0aGUgcmVnaXN0ZXIgaW5kZXgKLSAgICB1OAlSRVNFUlZFRF9WQUxJRDsJLy9JbmRpY2F0ZSB3aGV0aGVyIHRoZSBSRVNFUlZFRCBzcGFjZSBpcyB2YWxpZCBhdCB0aGlzIGNvbW1hbmQuCi0JdTgJRElSRUNUOyAvLyAwOkluICAgMTpPdXQKLQotfSBSRUdfUVVFVUUsICpQUkVHX1FVRVVFOwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgTUFYX1NRM19GSUxURVJfU0laRQkJNQotdHlwZWRlZiBzdHJ1Y3QgX1dCMzVSRUcKLXsKLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBSZWdpc3RlciBCYW5rIGJhY2t1cAotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXUzMglVMUIwOwkJCS8vYml0MTYgcmVjb3JkIHRoZSBoL3cgcmFkaW8gb24vb2ZmIHN0YXR1cwotCXUzMglVMUJDX0xFRENvbmZpZ3VyZTsKLQl1MzIJRDAwX0RtYUNvbnRyb2w7Ci0JdTMyCU0wMF9NYWNDb250cm9sOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXUzMglNMDRfTXVsdGljYXN0QWRkcmVzczE7Ci0JCQl1MzIJTTA4X011bHRpY2FzdEFkZHJlc3MyOwotCQl9OwotCQl1OAkJTXVsdGljYXN0WzhdOwkvLyBjb250ZW50cyBvZiBjYXJkIG11bHRpY2FzdCByZWdpc3RlcnMKLQl9OwotCi0JdTMyCU0yNF9NYWNDb250cm9sOwotCXUzMglNMjhfTWFjQ29udHJvbDsKLQl1MzIJTTJDX01hY0NvbnRyb2w7Ci0JdTMyCU0zOF9NYWNDb250cm9sOwotCXUzMglNM0NfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTQwX01hY0NvbnRyb2w7Ci0JdTMyCU00NF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNDhfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTRDX01hY1N0YXR1czsKLQl1MzIJTTYwX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU02OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNzBfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTc0X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU03OF9FUlBJbmZvcm1hdGlvbjsvLzkzMDIwNi4yLmIKLQl1MzIJTTdDX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU04MF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNODRfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTg4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU05OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCi0JLy9bMjAwNDA3MjIgV0tdCi0JLy9CYXNlYmFuZCByZWdpc3RlcgotCXUzMglCQjBDOwkvLyBVc2VkIGZvciBMTkEgY2FsY3VsYXRpb24KLQl1MzIJQkIyQzsJLy8KLQl1MzIJQkIzMDsJLy8xMWIgYWNxdWlzaXRpb24gY29udHJvbCByZWdpc3RlcgotCXUzMglCQjNDOwotCXUzMglCQjQ4OwkvLyAyMDA1MTIyMS4xLmEgMjAwNjA2MTMuMSBGaXggT0JXIGlzc3VlIG9mIDExYi8xMWcgcmF0ZQotCXUzMglCQjRDOwkvLyAyMDA2MDYxMy4xICBGaXggT0JXIGlzc3VlIG9mIDExYi8xMWcgcmF0ZQotCXUzMglCQjUwOwkvL21vZGUgY29udHJvbCByZWdpc3RlcgotCXUzMglCQjU0OwotCXUzMiAJQkI1ODsJLy9JUV9BTFBIQQotCXUzMglCQjVDOwkvLyBGb3IgdGVzdAotCXUzMglCQjYwOwkvLyBmb3IgV1RPIHJlYWQgdmFsdWUKLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFZNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tCi0Jc3BpbmxvY2tfdAlFUDBWTV9zcGluX2xvY2s7IC8vIDRCCi0JdTMyCSAgICAgICAgRVAwVk1fc3RhdHVzOy8vJCQKLQlQUkVHX1FVRVVFCSAgICBwUmVnRmlyc3Q7Ci0JUFJFR19RVUVVRQkgICAgcFJlZ0xhc3Q7Ci0JT1NfQVRPTUlDICAgICAgIFJlZ0ZpcmVDb3VudDsKLQotCS8vIEhhcmR3YXJlIHN0YXR1cwotCXU4CUVQMHZtX3N0YXRlOwotCXU4CW1hY19wb3dlcl9zYXZlOwotCXU4CUVFUFJPTVBoeVR5cGU7IC8vIDAgfiAxNSBmb3IgTWF4aW0gKDAgxIRWIE1BWDI4MjUsIDEgxIRWIE1BWDI4MjcsIDIgxIRWIE1BWDI4MjgsIDMgxIRWIE1BWDI4MjkpLAotCQkJCQkJICAgLy8gMTYgfiAzMSBmb3IgQWlyb2hhICgxNiDEhFYgQUwyMjMwLCAxMSAtIEFMNzIzMCkKLQkJCQkJCSAgIC8vIDMyIH4gUmVzZXJ2ZWQKLQkJCQkJCSAgIC8vIDMzIH4gNDcgRm9yIFdCMjQyICggMzMgLSBXQjI0MiwgMzQgLSBXQjI0MiB3aXRoIG5ldyBUeHZnYSAwLjUgZGIgc3RlcCkKLQkJCQkJCSAgIC8vIDQ4IH4gMjU1IEFSRSBSRVNFUlZFRC4KLQl1OAlFRVBST01SZWdpb247CS8vUmVnaW9uIHNldHRpbmcgaW4gRUVQUk9NCi0KLQl1MzIJU3luY0lvUGF1c2U7IC8vIElmIHVzZXIgdXNlIHRoZSBTeW5jIElvIHRvIGFjY2VzcyBIdywgdGhlbiBwYXVzZSB0aGUgYXN5bmMgYWNjZXNzCi0KLQl1OAlMTkFWYWx1ZVs0XTsgLy9UYWJsZSBmb3Igc3BlZWQgdXAgcnVubmluZwotCXUzMglTUTNfZmlsdGVyW01BWF9TUTNfRklMVEVSX1NJWkVdOwotCXUzMglTUTNfaW5kZXg7Ci0KLX0gV0IzNVJFRywgKlBXQjM1UkVHOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjlmNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0vLwotLy8gIE1vZHVsZSBOYW1lOgotLy8gICAgV2IzNVJ4LmMKLS8vCi0vLyAgQWJzdHJhY3Q6Ci0vLyAgICBQcm9jZXNzaW5nIHRoZSBSeCBtZXNzYWdlIGZyb20gZG93biBsYXllcgotLy8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2luY2x1ZGUgInN5c2RlZi5oIgotCi0KLXZvaWQgV2IzNVJ4X3N0YXJ0KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCi0JLy8gQWxsb3cgb25seSBvbmUgdGhyZWFkIHRvIHJ1biBpbnRvIHRoZSBXYjM1UngoKSBmdW5jdGlvbgotCWlmIChPU19BVE9NSUNfSU5DKHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKSA9PSAxKSB7Ci0JCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fUlVOTklORzsKLQkJV2IzNVJ4KHBId0RhdGEpOwotCX0gZWxzZQotCQlPU19BVE9NSUNfREVDKHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKTsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmVlbnRyYWluCi12b2lkIFdiMzVSeCggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSWAlwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQl1OCAqCXBSeEJ1ZmZlckFkZHJlc3M7Ci0JUFVSQglwVXJiID0gKFBVUkIpcFdiMzVSeC0+UnhVcmI7Ci0JaW50CXJldHY7Ci0JdTMyCVJ4QnVmZmVySWQ7Ci0KLQkvLwotCS8vIElzc3VpbmcgVVJCCi0JLy8KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKHBXYjM1UngtPnJ4X2hhbHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvLyBHZXQgUnhCdWZmZXIncyBJRAotCVJ4QnVmZmVySWQgPSBwV2IzNVJ4LT5SeEJ1ZmZlcklkOwotCWlmICghcFdiMzVSeC0+UnhPd25lcltSeEJ1ZmZlcklkXSkgewotCQkvLyBJdCdzIGltcG9zc2libGUgdG8gcnVuIGhlcmUuCi0JCSNpZmRlZiBfUEVfUlhfRFVNUF8KLQkJV0JERUJVRygoIlJ4IGRyaXZlciBmaWZvIHVuYXZhaWxhYmxlXG4iKSk7Ci0JCSNlbmRpZgotCQlnb3RvIGVycm9yOwotCX0KLQotCS8vIFVwZGF0ZSBidWZmZXIgcG9pbnQsIHRoZW4gc3RhcnQgdG8gYnVsa2luIHRoZSBkYXRhIGZyb20gVVNCCi0JcFdiMzVSeC0+UnhCdWZmZXJJZCsrOwotCXBXYjM1UngtPlJ4QnVmZmVySWQgJT0gTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOwotCi0JcFdiMzVSeC0+Q3VycmVudFJ4QnVmZmVySWQgPSBSeEJ1ZmZlcklkOwotCi0JaWYgKDEgIT0gT1NfTUVNT1JZX0FMTE9DKCh2b2lkKiAqKSZwV2IzNVJ4LT5wRFJ4LCBNQVhfVVNCX1JYX0JVRkZFUikpIHsKLQkJcHJpbnRrKCJ3MzV1bmQ6IFJ4IG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKLQotCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgIHVzYl9yY3ZidWxrcGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCAzKSwKLQkJCSAgcFJ4QnVmZmVyQWRkcmVzcywgTUFYX1VTQl9SWF9CVUZGRVIsCi0JCQkgIFdiMzVSeF9Db21wbGV0ZSwgcEh3RGF0YSk7Ci0KLQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0KLQlyZXR2ID0gd2JfdXNiX3N1Ym1pdF91cmIocFVyYik7Ci0KLQlpZiAocmV0diAhPSAwKSB7Ci0JCXByaW50aygiUnggVVJCIHNlbmRpbmcgZXJyb3JcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlyZXR1cm47Ci0KLWVycm9yOgotCS8vIFZNIHN0b3AKLQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIgKTsKLX0KLQotdm9pZCBXYjM1UnhfQ29tcGxldGUoUFVSQiBwVXJiKQotewotCXBod19kYXRhX3QJcEh3RGF0YSA9IHBVcmItPmNvbnRleHQ7Ci0JUFdCMzVSWAkJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0JdTggKgkJcFJ4QnVmZmVyQWRkcmVzczsKLQl1MzIJCVNpemVDaGVjazsKLQl1MTYJCUJ1bGtMZW5ndGg7Ci0JdTMyCQlSeEJ1ZmZlcklkOwotCVIwMF9ERVNDUklQVE9SIAlSMDA7Ci0KLQkvLyBWYXJpYWJsZSBzZXR0aW5nCi0JcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7Ci0JcFdiMzVSeC0+RVAzVk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOy8vU3RvcmUgdGhlIGxhc3QgcmVzdWx0IG9mIElycAotCi0JUnhCdWZmZXJJZCA9IHBXYjM1UngtPkN1cnJlbnRSeEJ1ZmZlcklkOwotCi0JcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7Ci0JQnVsa0xlbmd0aCA9ICh1MTYpcFVyYi0+YWN0dWFsX2xlbmd0aDsKLQotCS8vIFRoZSBJUlAgaXMgY29tcGxldGVkCi0JcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBNdXN0IGJlIGhlcmUsIG9yIFJ4QnVmZmVySWQgaXMgaW52YWxpZAotCQlnb3RvIGVycm9yOwotCi0JaWYgKHBXYjM1UngtPnJ4X2hhbHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvLyBTdGFydCB0byBwcm9jZXNzIHRoZSBkYXRhIG9ubHkgaW4gc3VjY2Vzc2Z1bCBjb25kaXRpb24KLQlwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0gPSAwOyAvLyBTZXQgdGhlIG93bmVyIHRvIGRyaXZlcgotCVIwMC52YWx1ZSA9IGxlMzJfdG9fY3B1KCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcyk7Ci0KLQkvLyBUaGUgVVJCIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdAotCWlmIChwV2IzNVJ4LT5FUDNWTV9zdGF0dXMgIT0gMCkgewotCQkjaWZkZWYgX1BFX1VTQl9TVEFURV9EVU1QXwotCQlXQkRFQlVHKCgiRVAzIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIikpOwotCQlEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggcFdiMzVSeC0+RVAzVk1fc3RhdHVzICk7Ci0JCSNlbmRpZgotCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLy8gMjAwNjAyMjAgRm9yIHJlY292ZXJpbmcuIGNoZWNrIGlmIG9wZXJhdGluZyBpbiBzaW5nbGUgVVNCIG1vZGUKLQlpZiAoIUhBTF9VU0JfTU9ERV9CVVJTVChwSHdEYXRhKSkgewotCQlTaXplQ2hlY2sgPSBSMDAuUjAwX3JlY2VpdmVfYnl0ZV9jb3VudDsgIC8vMjAwNjA5MjYgYW5zb24ncyBlbmRpYW4KLQkJaWYgKChTaXplQ2hlY2sgJiAweDAzKSA+IDApCi0JCQlTaXplQ2hlY2sgLT0gNDsKLQkJU2l6ZUNoZWNrID0gKFNpemVDaGVjayArIDMpICYgfjB4MDM7Ci0JCVNpemVDaGVjayArPSAxMjsgLy8gOCArIDQgYmFkYmVlZgotCQlpZiAoKEJ1bGtMZW5ndGggPiAxNjAwKSB8fAotCQkJKFNpemVDaGVjayA+IDE2MDApIHx8Ci0JCQkoQnVsa0xlbmd0aCAhPSBTaXplQ2hlY2spIHx8Ci0JCQkoQnVsa0xlbmd0aCA9PSAwKSkgeyAvLyBBZGQgZm9yIGZhaWwgVXJiCi0JCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JCQlwV2IzNVJ4LT5FcDNFcnJvckNvdW50MisrOwotCQl9Ci0JfQotCi0JLy8gSW5kaWNhdGluZyB0aGUgcmVjZWl2aW5nIGRhdGEKLQlwV2IzNVJ4LT5CeXRlUmVjZWl2ZWQgKz0gQnVsa0xlbmd0aDsKLQlwV2IzNVJ4LT5SeEJ1ZmZlclNpemVbIFJ4QnVmZmVySWQgXSA9IEJ1bGtMZW5ndGg7Ci0KLQlpZiAoIXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSkKLQkJV2IzNVJ4X2luZGljYXRlKHBId0RhdGEpOwotCi0Ja2ZyZWUocFdiMzVSeC0+cERSeCk7Ci0JLy8gRG8gdGhlIG5leHQgcmVjZWl2ZQotCVdiMzVSeChwSHdEYXRhKTsKLQlyZXR1cm47Ci0KLWVycm9yOgotCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDE7IC8vIFNldCB0aGUgb3duZXIgdG8gaGFyZHdhcmUKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSeC0+UnhGaXJlQ291bnRlciApOwotCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11bnNpZ25lZCBjaGFyIFdiMzVSeF9pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCi0JLy8gSW5pdGlhbCB0aGUgQnVmZmVyIFF1ZXVlCi0JV2IzNVJ4X3Jlc2V0X2Rlc2NyaXB0b3IoIHBId0RhdGEgKTsKLQotCXBXYjM1UngtPlJ4VXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlyZXR1cm4gKCEhcFdiMzVSeC0+UnhVcmIpOwotfQotCi12b2lkIFdiMzVSeF9zdG9wKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCi0JLy8gQ2FuY2VsaW5nIHRoZSBJcnAgaWYgYWxyZWFkeSBzZW5kcyBpdCBvdXQuCi0JaWYgKHBXYjM1UngtPkVQM3ZtX3N0YXRlID09IFZNX1JVTk5JTkcpIHsKLQkJdXNiX3VubGlua191cmIoIHBXYjM1UngtPlJ4VXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVSeF9kZXN0cm95IHRvIGZyZWUgdGhlbQotCQkjaWZkZWYgX1BFX1JYX0RVTVBfCi0JCVdCREVCVUcoKCJFUDMgUnggc3RvcFxuIikpOwotCQkjZW5kaWYKLQl9Ci19Ci0KLS8vIE5lZWRzIHByb2Nlc3MgY29udGV4dAotdm9pZCBXYjM1UnhfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQotCWRvIHsKLQkJT1NfU0xFRVAoMTAwMDApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCi0JfSB3aGlsZSAocFdiMzVSeC0+RVAzdm1fc3RhdGUgIT0gVk1fU1RPUCk7Ci0JT1NfU0xFRVAoMTAwMDApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBleGl0IDk0MDYyMy4xLmIKLQotCWlmIChwV2IzNVJ4LT5SeFVyYikKLQkJdXNiX2ZyZWVfdXJiKCBwV2IzNVJ4LT5SeFVyYiApOwotCSNpZmRlZiBfUEVfUlhfRFVNUF8KLQlXQkRFQlVHKCgiV2IzNVJ4X2Rlc3Ryb3kgT0tcbiIpKTsKLQkjZW5kaWYKLX0KLQotdm9pZCBXYjM1UnhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQl1MzIJaTsKLQotCXBXYjM1UngtPkJ5dGVSZWNlaXZlZCA9IDA7Ci0JcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXggPSAwOwotCXBXYjM1UngtPlJ4QnVmZmVySWQgPSAwOwotCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKLQlwV2IzNVJ4LT5yeF9oYWx0ID0gMDsKLQotCS8vIEluaXRpYWwgdGhlIFF1ZXVlLiBUaGUgbGFzdCBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZWQgaWYgdGhlIFJ4IHJlc291cmNlIGlzIHVuYXZhaWxhYmxlLgotCWZvciggaT0wOyBpPE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsgaSsrICkKLQkJcFdiMzVSeC0+UnhPd25lcltpXSA9IDE7Ci19Ci0KLXZvaWQgV2IzNVJ4X2FkanVzdChQREVTQ1JJUFRPUiBwUnhEZXMpCi17Ci0JdTMyICoJcFJ4QnVmZmVyQWRkcmVzczsKLQl1MzIJRGVjcnlwdGlvbk1ldGhvZDsKLQl1MzIJaTsKLQl1MTYJQnVmZmVyU2l6ZTsKLQotCURlY3J5cHRpb25NZXRob2QgPSBwUnhEZXMtPlIwMS5SMDFfZGVjcnlwdGlvbl9tZXRob2Q7Ci0JcFJ4QnVmZmVyQWRkcmVzcyA9IHBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF07Ci0JQnVmZmVyU2l6ZSA9IHBSeERlcy0+YnVmZmVyX3NpemVbMF07Ci0KLQkvLyBBZGp1c3QgdGhlIGxhc3QgcGFydCBvZiBkYXRhLiBPbmx5IGRhdGEgbGVmdAotCUJ1ZmZlclNpemUgLT0gNDsgLy8gRm9yIENSQy0zMgotCWlmIChEZWNyeXB0aW9uTWV0aG9kKQotCQlCdWZmZXJTaXplIC09IDQ7Ci0JaWYgKERlY3J5cHRpb25NZXRob2QgPT0gMykgLy8gRm9yIENDTVAKLQkJQnVmZmVyU2l6ZSAtPSA0OwotCi0JLy8gQWRqdXN0IHRoZSBJViBmaWVsZCB3aGljaCBhZnRlciA4MDIuMTEgaGVhZGVyIGFuZCBJQ1YgZmllbGQuCi0JaWYgKERlY3J5cHRpb25NZXRob2QgPT0gMSkgLy8gRm9yIFdFUAotCXsKLQkJZm9yKCBpPTY7IGk+MDsgaS0tICkKLQkJCXBSeEJ1ZmZlckFkZHJlc3NbaV0gPSBwUnhCdWZmZXJBZGRyZXNzW2ktMV07Ci0JCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMTsKLQkJQnVmZmVyU2l6ZSAtPSA0OyAvLyA0IGJ5dGUgZm9yIElWCi0JfQotCWVsc2UgaWYoIERlY3J5cHRpb25NZXRob2QgKSAvLyBGb3IgVEtJUCBhbmQgQ0NNUAotCXsKLQkJZm9yIChpPTc7IGk+MTsgaS0tKQotCQkJcFJ4QnVmZmVyQWRkcmVzc1tpXSA9IHBSeEJ1ZmZlckFkZHJlc3NbaS0yXTsKLQkJcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3MgKyAyOy8vVXBkYXRlIHRoZSBkZXNjcmlwdG9yLCBzaGlmdCA4IGJ5dGUKLQkJQnVmZmVyU2l6ZSAtPSA4OyAvLyA4IGJ5dGUgZm9yIElWICsgSUNWCi0JfQotCXBSeERlcy0+YnVmZmVyX3NpemVbMF0gPSBCdWZmZXJTaXplOwotfQotCi1leHRlcm4gdm9pZCBwYWNrZXRfY2FtZShjaGFyICpwUnhCdWZmZXJBZGRyZXNzLCBpbnQgUGFja2V0U2l6ZSk7Ci0KLQotdTE2IFdiMzVSeF9pbmRpY2F0ZShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JREVTQ1JJUFRPUglSeERlczsKLQlQV0IzNVJYCXBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCXU4ICoJCXBSeEJ1ZmZlckFkZHJlc3M7Ci0JdTE2CQlQYWNrZXRTaXplOwotCXUxNgkJc3RtcCwgQnVmZmVyU2l6ZSwgc3RtcDIgPSAwOwotCXUzMgkJUnhCdWZmZXJJZDsKLQotCS8vIE9ubHkgb25lIHRocmVhZCBiZSBhbGxvd2VkIHRvIHJ1biBpbnRvIHRoZSBmb2xsb3dpbmcKLQlkbyB7Ci0JCVJ4QnVmZmVySWQgPSBwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleDsKLQkJaWYgKHBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSkgLy9Pd25lciBieSBWTQotCQkJYnJlYWs7Ci0KLQkJcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXgrKzsKLQkJcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXggJT0gTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOwotCi0JCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OwotCQlCdWZmZXJTaXplID0gcFdiMzVSeC0+UnhCdWZmZXJTaXplWyBSeEJ1ZmZlcklkIF07Ci0KLQkJLy8gUGFyc2UgdGhlIGJ1bGtpbiBidWZmZXIKLQkJd2hpbGUgKEJ1ZmZlclNpemUgPj0gNCkgewotCQkJaWYgKChjcHVfdG9fbGUzMigqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpICYgMHgwZmZmZmZmZikgPT0gUlhfRU5EX1RBRykgLy9JcyBlbmRpbmc/IDkyMTAwMi45LmEKLQkJCQlicmVhazsKLQotCQkJLy8gR2V0IHRoZSBSMDAgUjAxIGZpcnN0Ci0JCQlSeERlcy5SMDAudmFsdWUgPSBsZTMyX3RvX2NwdSgqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpOwotCQkJUGFja2V0U2l6ZSA9ICh1MTYpUnhEZXMuUjAwLlIwMF9yZWNlaXZlX2J5dGVfY291bnQ7Ci0JCQlSeERlcy5SMDEudmFsdWUgPSBsZTMyX3RvX2NwdSgqKCh1MzIgKikocFJ4QnVmZmVyQWRkcmVzcys0KSkpOwotCQkJLy8gRm9yIG5ldyBETUEgNGsKLQkJCWlmICgoUGFja2V0U2l6ZSAmIDB4MDMpID4gMCkKLQkJCQlQYWNrZXRTaXplIC09IDQ7Ci0KLQkJCS8vIEJhc2ljIGNoZWNrIGZvciBSeCBsZW5ndGguIElzIGxlbmd0aCB2YWxpZD8KLQkJCWlmIChQYWNrZXRTaXplID4gTUFYX1BBQ0tFVF9TSVpFKSB7Ci0JCQkJI2lmZGVmIF9QRV9SWF9EVU1QXwotCQkJCVdCREVCVUcoKCJTZXJpb3VzIEVSUk9SIDogUnggZGF0YSBzaXplIHRvbyBsb25nLCBzaXplID0lZFxuIiwgUGFja2V0U2l6ZSkpOwotCQkJCSNlbmRpZgotCi0JCQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwotCQkJCXBXYjM1UngtPkVwM0Vycm9yQ291bnQyKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFN0YXJ0IHRvIHByb2Nlc3MgUnggYnVmZmVyCi0vLwkJCVJ4RGVzLkRlc2NyaXB0b3JfSUQgPSBSeEJ1ZmZlcklkOyAvLyBEdWUgdG8gc3luY2hyb25vdXMgaW5kaWNhdGUsIHRoZSBmaWVsZCBkb2Vzbid0IG5lY2Vzc2FyeSB0byB1c2UuCi0JCQlCdWZmZXJTaXplIC09IDg7IC8vc3VidHJhY3QgOCBieXRlIGZvciAzNSdzIFVTQiBoZWFkZXIgbGVuZ3RoCi0JCQlwUnhCdWZmZXJBZGRyZXNzICs9IDg7Ci0KLQkJCVJ4RGVzLmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzczsKLQkJCVJ4RGVzLmJ1ZmZlcl9zaXplWzBdID0gUGFja2V0U2l6ZTsKLQkJCVJ4RGVzLmJ1ZmZlcl9udW1iZXIgPSAxOwotCQkJUnhEZXMuYnVmZmVyX3N0YXJ0X2luZGV4ID0gMDsKLQkJCVJ4RGVzLmJ1ZmZlcl90b3RhbF9zaXplID0gUnhEZXMuYnVmZmVyX3NpemVbMF07Ci0JCQlXYjM1UnhfYWRqdXN0KCZSeERlcyk7Ci0KLQkJCXBhY2tldF9jYW1lKHBSeEJ1ZmZlckFkZHJlc3MsIFBhY2tldFNpemUpOwotCi0JCQkvLyBNb3ZlIFJ4QnVmZmVyIHBvaW50IHRvIHRoZSBuZXh0Ci0JCQlzdG1wID0gUGFja2V0U2l6ZSArIDM7Ci0JCQlzdG1wICY9IH4weDAzOyAvLyA0biBhbGlnbm1lbnQKLQkJCXBSeEJ1ZmZlckFkZHJlc3MgKz0gc3RtcDsKLQkJCUJ1ZmZlclNpemUgLT0gc3RtcDsKLQkJCXN0bXAyICs9IHN0bXA7Ci0JCX0KLQotCQkvLyBSZWNsYWltIHJlc291cmNlCi0JCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDE7Ci0JfSB3aGlsZShUUlVFKTsKLQotCXJldHVybiBzdG1wMjsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhM2U3My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnhfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdm9pZAkJV2IzNVJ4X3Jlc2V0X2Rlc2NyaXB0b3IoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXVuc2lnbmVkIGNoYXIJCVdiMzVSeF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkCQlXYjM1UnhfZGVzdHJveSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZAkJV2IzNVJ4X3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXUxNgkJV2IzNVJ4X2luZGljYXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkCQlXYjM1UnhfYWRqdXN0KCAgUERFU0NSSVBUT1IgcFJ4RGVzICk7Ci12b2lkCQlXYjM1Unhfc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLQotdm9pZAkJV2IzNVJ4KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkCQlXYjM1UnhfQ29tcGxldGUoICBQVVJCIHBVcmIgKTsKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeF9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGMyNjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gd2IzNXJ4LmggLS0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBEZWZpbml0aW9uIGZvciB0aGlzIG1vZHVsZSB1c2VkCi0jZGVmaW5lIE1BWF9VU0JfUlhfQlVGRkVSCTQwOTYJLy8gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSA0MDk2IDkzMTEzMC40LmYKLQotI2RlZmluZSBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIJRVRIRVJORVRfUlhfREVTQ1JJUFRPUlMJCS8vIE1heGltdW0gMjU0LCAyNTUgaXMgUkVTRVJWRUQgSUQKLSNkZWZpbmUgUlhfSU5URVJGQUNFCQkJCTAJLy8gSW50ZXJmYWNlIDEKLSNkZWZpbmUgUlhfUElQRQkJCQkJCTIJLy8gUGlwZSAzCi0jZGVmaW5lIE1BWF9QQUNLRVRfU0laRQkJCQkxNjAwIC8vMTU2OAkvLyA4ICsgMTUzMiArIDQgKyAyNChJViBFSVYgTUlDIElDViBDUkMpIGZvciBjaGVjayBETUEgZGF0YSA5MzExMzAuNC5nCi0jZGVmaW5lIFJYX0VORF9UQUcJCQkJCTB4MGJhZGJlZWYKLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXR5cGVkZWYgc3RydWN0IF9XQjM1UlgKLXsKLQl1MzIJCQlCeXRlUmVjZWl2ZWQ7Ly8gRm9yIGNhbGN1bGF0aW5nIHRocm91Z2hwdXQgb2YgQnVsa0luCi0JT1NfQVRPTUlDCQlSeEZpcmVDb3VudGVyOy8vIERvZXMgV2IzNVJ4IG1vZHVsZSBmaXJlPwotCi0JdTgJUnhCdWZmZXJbIE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUiBdWyAoKE1BWF9VU0JfUlhfQlVGRkVSKzMpICYgfjB4MDMgKSBdOwotCXUxNglSeEJ1ZmZlclNpemVbICgoTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSKzEpICYgfjB4MDEpIF07Ci0JdTgJUnhPd25lclsgKChNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIrMykgJiB+MHgwMyApIF07Ly9Pd25lcnNoaXAgb2YgYnVmZmVyICAwOiBTVyAxOkhXCi0KLQl1MzIJUnhQcm9jZXNzSW5kZXg7Ly9UaGUgbmV4dCBpbmRleCB0byBwcm9jZXNzCi0JdTMyCVJ4QnVmZmVySWQ7Ci0JdTMyCUVQM3ZtX3N0YXRlOwotCi0JdTMyCXJ4X2hhbHQ7IC8vIEZvciBWTSBzdG9wcGluZwotCi0JdTE2CU1vcmVEYXRhU2l6ZTsKLQl1MTYJUGFja2V0U2l6ZTsKLQotCXUzMglDdXJyZW50UnhCdWZmZXJJZDsgLy8gRm9yIGNvbXBsZXRlIHJvdXRpbmUgdXNhZ2UKLQl1MzIJUngzVXJiQ2FuY2VsOwotCi0JdTMyCUxhc3RSMTsgLy8gRm9yIFJTU0kgcmVwb3J0aW5nCi0Jc3RydWN0IHVyYiAqCQkJCVJ4VXJiOwotCXUzMgkJRXAzRXJyb3JDb3VudDI7IC8vIDIwMDYwNjI1LjEgVXNiZCBmb3IgUnggRE1BIGVycm9yIGNvdW50Ci0KLQlpbnQJCUVQM1ZNX3N0YXR1czsKLQl1OCAqCXBEUng7Ci0KLX0gV0IzNVJYLCAqUFdCMzVSWDsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlkNTEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgotLy8KLS8vICBNb2R1bGUgTmFtZToKLS8vICAgIFdiMzVUeC5jCi0vLwotLy8gIEFic3RyYWN0OgotLy8gICAgUHJvY2Vzc2luZyB0aGUgVHggbWVzc2FnZSBhbmQgcHV0IGludG8gZG93biBsYXllcgotLy8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2luY2x1ZGUgInN5c2RlZi5oIgotCi0KLXVuc2lnbmVkIGNoYXIKLVdiMzVUeF9nZXRfdHhfYnVmZmVyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggKipwQnVmZmVyKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0KLQkqcEJ1ZmZlciA9IHBXYjM1VHgtPlR4QnVmZmVyWzBdOwotCXJldHVybiBUUlVFOwotfQotCi12b2lkIFdiMzVUeF9zdGFydChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byBmdW5jdGlvbgotCWlmIChPU19BVE9NSUNfSU5DKHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeEZpcmVDb3VudGVyKSA9PSAxKSB7Ci0JCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQkJV2IzNVR4KHBId0RhdGEpOwotCX0gZWxzZQotCQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhGaXJlQ291bnRlciApOwotfQotCi0KLXZvaWQgV2IzNVR4KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQlQQURBUFRFUglBZGFwdGVyID0gcEh3RGF0YS0+QWRhcHRlcjsKLQl1OAkJKnBUeEJ1ZmZlckFkZHJlc3M7Ci0JUE1EUwkJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0Jc3RydWN0IHVyYiAqCXBVcmIgPSAoc3RydWN0IHVyYiAqKXBXYjM1VHgtPlR4NFVyYjsKLQlpbnQgICAgICAgICAJcmV0djsKLQl1MzIJCVNlbmRJbmRleDsKLQotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKLQkJZ290byBjbGVhbnVwOwotCi0JaWYgKHBXYjM1VHgtPnR4X2hhbHQpCi0JCWdvdG8gY2xlYW51cDsKLQotCS8vIE93bmVyc2hpcCBjaGVja2luZwotCVNlbmRJbmRleCA9IHBXYjM1VHgtPlR4U2VuZEluZGV4OwotCWlmICghcE1kcy0+VHhPd25lcltTZW5kSW5kZXhdKSAvL05vIG1vcmUgZGF0YSBuZWVkIHRvIGJlIHNlbnQsIHJldHVybiBpbW1lZGlhdGVseQotCQlnb3RvIGNsZWFudXA7Ci0KLQlwVHhCdWZmZXJBZGRyZXNzID0gcFdiMzVUeC0+VHhCdWZmZXJbU2VuZEluZGV4XTsKLQkvLwotCS8vIElzc3VpbmcgVVJCCi0JLy8KLQl1c2JfZmlsbF9idWxrX3VyYihwVXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICB1c2Jfc25kYnVsa3BpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgNCksCi0JCQkgIHBUeEJ1ZmZlckFkZHJlc3MsIHBNZHMtPlR4QnVmZmVyU2l6ZVsgU2VuZEluZGV4IF0sCi0JCQkgIFdiMzVUeF9jb21wbGV0ZSwgcEh3RGF0YSk7Ci0KLQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JcmV0diA9IHdiX3VzYl9zdWJtaXRfdXJiKCBwVXJiICk7Ci0JaWYgKHJldHY8MCkgewotCQlwcmludGsoIkVQNCBUeCBJcnAgc2VuZGluZyBlcnJvclxuIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvLyBDaGVjayBpZiBkcml2ZXIgbmVlZHMgaXNzdWUgSXJwIGZvciBFUDIKLQlwV2IzNVR4LT5UeEZpbGxDb3VudCArPSBwTWRzLT5UeENvdW50SW5CdWZmZXJbU2VuZEluZGV4XTsKLQlpZiAocFdiMzVUeC0+VHhGaWxsQ291bnQgPiAxMikKLQkJV2IzNVR4X0VQMlZNX3N0YXJ0KCBwSHdEYXRhICk7Ci0KLQlwV2IzNVR4LT5CeXRlVHJhbnNmZXIgKz0gcE1kcy0+VHhCdWZmZXJTaXplW1NlbmRJbmRleF07Ci0JcmV0dXJuOwotCi0gY2xlYW51cDoKLQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIgKTsKLX0KLQotCi12b2lkIFdiMzVUeF9jb21wbGV0ZShzdHJ1Y3QgdXJiICogcFVyYikKLXsKLQlwaHdfZGF0YV90CXBId0RhdGEgPSBwVXJiLT5jb250ZXh0OwotCVBBREFQVEVSCUFkYXB0ZXIgPSAoUEFEQVBURVIpcEh3RGF0YS0+QWRhcHRlcjsKLQlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQlQTURTCQlwTWRzID0gJkFkYXB0ZXItPk1kczsKLQotCXByaW50aygid2IzNTogdHggY29tcGxldGVcbiIpOwotCS8vIFZhcmlhYmxlIHNldHRpbmcKLQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKLQlwV2IzNVR4LT5FUDRWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7IC8vU3RvcmUgdGhlIGxhc3QgcmVzdWx0IG9mIElycAotCXBNZHMtPlR4T3duZXJbIHBXYjM1VHgtPlR4U2VuZEluZGV4IF0gPSAwOy8vIFNldCB0aGUgb3duZXIuIEZyZWUgdGhlIG93bmVyIGJpdCBhbHdheXMuCi0JcFdiMzVUeC0+VHhTZW5kSW5kZXgrKzsKLQlwV2IzNVR4LT5UeFNlbmRJbmRleCAlPSBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVI7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAocFdiMzVUeC0+dHhfaGFsdCkKLQkJZ290byBlcnJvcjsKLQotCS8vIFRoZSBVUkIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0Ci0JaWYgKHBXYjM1VHgtPkVQNFZNX3N0YXR1cyAhPSAwKSB7Ci0JCXByaW50aygiVVJCIHN1Ym1pc3Npb24gZmFpbGVkXG4iKTsKLQkJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOwotCQlnb3RvIGVycm9yOwotCX0KLQotCU1kc19UeChBZGFwdGVyKTsKLQlXYjM1VHgocEh3RGF0YSk7Ci0JcmV0dXJuOwotCi1lcnJvcjoKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhGaXJlQ291bnRlciApOwotCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fU1RPUDsKLX0KLQotdm9pZCBXYjM1VHhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCXBXYjM1VHgtPlR4U2VuZEluZGV4ID0gMDsKLQlwV2IzNVR4LT50eF9oYWx0ID0gMDsKLX0KLQotdW5zaWduZWQgY2hhciBXYjM1VHhfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCXBXYjM1VHgtPlR4NFVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JaWYgKCFwV2IzNVR4LT5UeDRVcmIpCi0JCXJldHVybiBGQUxTRTsKLQotCXBXYjM1VHgtPlR4MlVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JaWYgKCFwV2IzNVR4LT5UeDJVcmIpCi0JewotCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4NFVyYiApOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkIFdiMzVUeF9zdG9wKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JLy8gVHJ5aW5nIHRvIGNhbmNlbGluZyB0aGUgVHJwIG9mIEVQMgotCWlmIChwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKQotCQl1c2JfdW5saW5rX3VyYiggcFdiMzVUeC0+VHgyVXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVUeF9kZXN0cm90IHRvIGZyZWUgdGhlbQotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlXQkRFQlVHKCgiRVAyIFR4IHN0b3BcbiIpKTsKLQkjZW5kaWYKLQotCS8vIFRyeWluZyB0byBjYW5jZWxpbmcgdGhlIElycCBvZiBFUDQKLQlpZiAocFdiMzVUeC0+RVA0dm1fc3RhdGUgPT0gVk1fUlVOTklORykKLQkJdXNiX3VubGlua191cmIoIHBXYjM1VHgtPlR4NFVyYiApOyAvLyBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1VHhfZGVzdHJvdCB0byBmcmVlIHRoZW0KLQkjaWZkZWYgX1BFX1RYX0RVTVBfCi0JV0JERUJVRygoIkVQNCBUeCBzdG9wXG4iKSk7Ci0JI2VuZGlmCi19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkIFdiMzVUeF9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JLy8gV2FpdCBmb3IgVk0gc3RvcAotCWRvIHsKLQkJT1NfU0xFRVAoMTAwMDApOyAgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYQotCX0gd2hpbGUoIChwV2IzNVR4LT5FUDJ2bV9zdGF0ZSAhPSBWTV9TVE9QKSAmJiAocFdiMzVUeC0+RVA0dm1fc3RhdGUgIT0gVk1fU1RPUCkgKTsKLQlPU19TTEVFUCgxMDAwMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5iCi0KLQlpZiAocFdiMzVUeC0+VHg0VXJiKQotCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4NFVyYiApOwotCi0JaWYgKHBXYjM1VHgtPlR4MlVyYikKLQkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsKLQotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlXQkRFQlVHKCgiV2IzNVR4X2Rlc3Ryb3kgT0tcbiIpKTsKLQkjZW5kaWYKLX0KLQotdm9pZCBXYjM1VHhfQ3VycmVudFRpbWUocGh3X2RhdGFfdCBwSHdEYXRhLCB1MzIgVGltZUNvdW50KQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0JdW5zaWduZWQgY2hhciBUcmlnZ2VyID0gRkFMU0U7Ci0KLQlpZiAocFdiMzVUeC0+VHhUaW1lciA+IFRpbWVDb3VudCkKLQkJVHJpZ2dlciA9IFRSVUU7Ci0JZWxzZSBpZiAoVGltZUNvdW50ID4gKHBXYjM1VHgtPlR4VGltZXIrNTAwKSkKLQkJVHJpZ2dlciA9IFRSVUU7Ci0KLQlpZiAoVHJpZ2dlcikgewotCQlwV2IzNVR4LT5UeFRpbWVyID0gVGltZUNvdW50OwotCQlXYjM1VHhfRVAyVk1fc3RhcnQoIHBId0RhdGEgKTsKLQl9Ci19Ci0KLXZvaWQgV2IzNVR4X0VQMlZNX3N0YXJ0KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JLy8gQWxsb3cgb25seSBvbmUgdGhyZWFkIHRvIHJ1biBpbnRvIGZ1bmN0aW9uCi0JaWYgKE9TX0FUT01JQ19JTkMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeFJlc3VsdENvdW50ICkgPT0gMSkgewotCQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JCVdiMzVUeF9FUDJWTSggcEh3RGF0YSApOwotCX0KLQllbHNlCi0JCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeFJlc3VsdENvdW50ICk7Ci19Ci0KLQotdm9pZCBXYjM1VHhfRVAyVk0ocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0Jc3RydWN0IHVyYiAqCXBVcmIgPSAoc3RydWN0IHVyYiAqKXBXYjM1VHgtPlR4MlVyYjsKLQl1MzIgKglwbHRtcCA9ICh1MzIgKilwV2IzNVR4LT5FUDJfYnVmOwotCWludAkJcmV0djsKLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAocFdiMzVUeC0+dHhfaGFsdCkKLQkJZ290byBlcnJvcjsKLQotCS8vCi0JLy8gSXNzdWluZyBVUkIKLQkvLwotCXVzYl9maWxsX2ludF91cmIoIHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsIHVzYl9yY3ZpbnRwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsMiksCi0JCQkgIHBsdG1wLCBNQVhfSU5URVJSVVBUX0xFTkdUSCwgV2IzNVR4X0VQMlZNX2NvbXBsZXRlLCBwSHdEYXRhLCAzMik7Ci0KLQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JcmV0diA9IHdiX3VzYl9zdWJtaXRfdXJiKCBwVXJiICk7Ci0KLQlpZiAocmV0diA8IDApIHsKLQkJI2lmZGVmIF9QRV9UWF9EVU1QXwotCQlXQkRFQlVHKCgiRVAyIFR4IElycCBzZW5kaW5nIGVycm9yXG4iKSk7Ci0JCSNlbmRpZgotCQlnb3RvIGVycm9yOwotCX0KLQotCXJldHVybjsKLWVycm9yOgotCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fU1RPUDsKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCApOwotfQotCi0KLXZvaWQgV2IzNVR4X0VQMlZNX2NvbXBsZXRlKHN0cnVjdCB1cmIgKiBwVXJiKQotewotCXBod19kYXRhX3QJcEh3RGF0YSA9IHBVcmItPmNvbnRleHQ7Ci0JVDAyX0RFU0NSSVBUT1IJVDAyLCBUU1RBVFVTOwotCVBBREFQVEVSCUFkYXB0ZXIgPSAoUEFEQVBURVIpcEh3RGF0YS0+QWRhcHRlcjsKLQlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQl1MzIgKgkJcGx0bXAgPSAodTMyICopcFdiMzVUeC0+RVAyX2J1ZjsKLQl1MzIJCWk7Ci0JdTE2CQlJbnRlcnJ1cHRJbkxlbmd0aDsKLQotCi0JLy8gVmFyaWFibGUgc2V0dGluZwotCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fQ09NUExFVEVEOwotCXBXYjM1VHgtPkVQMlZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsKLQotCS8vIEZvciBMaW51eCAyLjQuIEludGVycnVwdCB3aWxsIGFsd2F5cyB0cmlnZ2VyCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQotCQlnb3RvIGVycm9yOwotCi0JaWYgKHBXYjM1VHgtPnR4X2hhbHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvL1RoZSBVcmIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0Ci0JaWYgKHBXYjM1VHgtPkVQMlZNX3N0YXR1cyAhPSAwKSB7Ci0JCVdCREVCVUcoKCJFUDIgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7Ci0JCXBXYjM1VHgtPkVQMnZtX3N0YXRlPSBWTV9TVE9QOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8vIFVwZGF0ZSB0aGUgVHggcmVzdWx0Ci0JSW50ZXJydXB0SW5MZW5ndGggPSBwVXJiLT5hY3R1YWxfbGVuZ3RoOwotCS8vIE1vZGlmeSBmb3IgbWluaW11bSBtZW1vcnkgYWNjZXNzIGFuZCBEV09SRCBhbGlnbm1lbnQuCi0JVDAyLnZhbHVlID0gY3B1X3RvX2xlMzIocGx0bXBbMF0pID4+IDg7IC8vIFszMTo4XSAtPiBbMjQ6MF0KLQlJbnRlcnJ1cHRJbkxlbmd0aCAtPSAxOy8vIDIwMDUxMjIxLjEuYyBNb2RpZnkgdGhlIGZvbGxvdyBmb3IgbW9yZSBzdGFibGUKLQlJbnRlcnJ1cHRJbkxlbmd0aCA+Pj0gMjsgLy8gSW50ZXJydXB0SW5MZW5ndGgvNAotCWZvciAoaSA9IDE7IGkgPD0gSW50ZXJydXB0SW5MZW5ndGg7IGkrKykgewotCQlUMDIudmFsdWUgfD0gKChjcHVfdG9fbGUzMihwbHRtcFtpXSkgJiAweGZmKSA8PCAyNCk7Ci0KLQkJVFNUQVRVUy52YWx1ZSA9IFQwMi52YWx1ZTsgIC8vMjAwNjEwMDkgYW5zb24ncyBlbmRpYW4KLQkJTWRzX1NlbmRDb21wbGV0ZSggQWRhcHRlciwgJlRTVEFUVVMgKTsKLQkJVDAyLnZhbHVlID0gY3B1X3RvX2xlMzIocGx0bXBbaV0pID4+IDg7Ci0JfQotCi0JcmV0dXJuOwotZXJyb3I6Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQgKTsKLQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1NUT1A7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdiMTI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eF9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11bnNpZ25lZCBjaGFyIFdiMzVUeF9pbml0aWFsKAkgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeF9kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci11bnNpZ25lZCBjaGFyIFdiMzVUeF9nZXRfdHhfYnVmZmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKipwQnVmZmVyICk7Ci0KLXZvaWQgV2IzNVR4X0VQMlZNKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeF9FUDJWTV9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1VHhfRVAyVk1fY29tcGxldGUoICBQVVJCIHB1cmIgKTsKLQotdm9pZCBXYjM1VHhfc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVR4X3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVR4KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeF9jb21wbGV0ZSggIFBVUkIgcHVyYiApOwotdm9pZCBXYjM1VHhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApOwotCi12b2lkIFdiMzVUeF9DdXJyZW50VGltZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiBUaW1lQ291bnQgKTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4X3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0MzI1Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIElTODlDMzUgVHggcmVsYXRlZCBkZWZpbml0aW9uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBUWF9JTlRFUkZBQ0UJCQkwCS8vIEludGVyZmFjZSAxCi0jZGVmaW5lIFRYX1BJUEUJCQkJCTMJLy8gZW5kcG9pbnQgNAotI2RlZmluZSBUWF9JTlRFUlJVUFQJCQkxCS8vIGVuZHBvaW50IDIKLSNkZWZpbmUgTUFYX0lOVEVSUlVQVF9MRU5HVEgJNjQJLy8gSXQgbXVzdCBiZSA2NCBmb3IgRVAyIGhhcmR3YXJlCi0KLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi10eXBlZGVmIHN0cnVjdCBfV0IzNVRYCi17Ci0JLy8gRm9yIFR4IGJ1ZmZlcgotCXU4CVR4QnVmZmVyWyBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVIgXVsgTUFYX1VTQl9UWF9CVUZGRVIgXTsKLQotCS8vIEZvciBJbnRlcnJ1cHQgcGlwZQotCXU4CUVQMl9idWZbTUFYX0lOVEVSUlVQVF9MRU5HVEhdOwotCi0JT1NfQVRPTUlDCVR4UmVzdWx0Q291bnQ7Ly8gRm9yIHRocmVhZCBjb250cm9sIG9mIEVQMiA5MzExMzAuNC5tCi0JT1NfQVRPTUlDCVR4RmlyZUNvdW50ZXI7Ly8gRm9yIHRocmVhZCBjb250cm9sIG9mIEVQNCA5MzExMzAuNC5uCi0JdTMyCQkJQnl0ZVRyYW5zZmVyOwotCi0JdTMyCSAgICBUeFNlbmRJbmRleDsvLyBUaGUgbmV4dCBpbmRleCBvZiBNZHMgYXJyYXkgdG8gYmUgc2VudAotCXUzMgkgICAgRVAydm1fc3RhdGU7IC8vIGZvciBFUDJ2bSBzdGF0ZQotCXUzMgkgICAgRVA0dm1fc3RhdGU7IC8vIGZvciBFUDR2bSBzdGF0ZQotCXUzMgkgICAgdHhfaGFsdDsgLy8gU3RvcHBpbmcgVk0KLQotCXN0cnVjdCB1cmIgKgkJCQlUeDRVcmI7Ci0Jc3RydWN0IHVyYiAqCQkJCVR4MlVyYjsKLQotCWludAkJRVAyVk1fc3RhdHVzOwotCWludAkJRVA0Vk1fc3RhdHVzOwotCi0JdTMyCVR4RmlsbENvdW50OyAvLyAyMDA2MDkyOAotCXUzMglUeFRpbWVyOyAvLyAyMDA2MDkyOCBBZGQgaWYgc2VuZGluZyBwYWNrZXQgbm90IGdyZWF0IHRoYW4gMTMKLQotfSBXQjM1VFgsICpQV0IzNVRYOwotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWNhOWI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4IFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KLSAqCi0gKiBEaXN0cmlidXRlIHVuZGVyIEdQTHYyLgotICovCi0jaW5jbHVkZSAic3lzZGVmLmgiCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1ZFUlNJT04oIjAuMSIpOwotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgd2IzNV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0Je1VTQl9ERVZJQ0UoMHgwNDE2LCAweDAwMzUpfSwKLQl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIwMSl9LAotCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjA2KX0sCi0Je1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMTcpfSwKLQl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIzMCl9LAotCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjMzKX0sCi0Je1VTQl9ERVZJQ0UoMHgxMTMxLCAweDIwMzUpfSwKLQl7IDAsIH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB3YjM1X3RhYmxlKTsKLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSB3YnNvZnRfcmF0ZXNbXSA9IHsKLQl7IC5iaXRyYXRlID0gMTAsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHdic29mdF9jaGFubmVsc1tdID0gewotCXsgLmNlbnRlcl9mcmVxID0gMjQxMn0sCi19OwotCi1pbnQgd2Jzb2Z0X2VuYWJsZWQ7Ci1zdHJ1Y3QgaWVlZTgwMjExX2h3ICpteV9kZXY7Ci1QQURBUFRFUiBteV9hZGFwdGVyOwotCi1zdGF0aWMgaW50IHdic29mdF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCi17Ci0JcHJpbnRrKCJ3YnNvZnRfYWRkIGludGVyZmFjZSBjYWxsZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB3YnNvZnRfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKLXsKLQlwcmludGsoIndic29mdF9yZW1vdmUgaW50ZXJmYWNlIGNhbGxlZFxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdic29mdF9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgaW50IHdic29mdF9nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKQotewotCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdic29mdF9nZXRfdHhfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9zdGF0cyAqc3RhdHMpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdic29mdF9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAotCQkJCSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKLQkJCQkgICAgIGludCBtY19jb3VudCwgc3RydWN0IGRldl9tY19saXN0ICptY2xpc3QpCi17Ci0JdW5zaWduZWQgaW50IGJpdF9uciwgbmV3X2ZsYWdzOwotCXUzMiBtY19maWx0ZXJbMl07Ci0JaW50IGk7Ci0KLQluZXdfZmxhZ3MgPSAwOwotCi0JaWYgKCp0b3RhbF9mbGFncyAmIEZJRl9QUk9NSVNDX0lOX0JTUykgewotCQluZXdfZmxhZ3MgfD0gRklGX1BST01JU0NfSU5fQlNTOwotCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSB+MDsKLQl9IGVsc2UgaWYgKCgqdG90YWxfZmxhZ3MgJiBGSUZfQUxMTVVMVEkpIHx8IChtY19jb3VudCA+IDMyKSkgewotCQluZXdfZmxhZ3MgfD0gRklGX0FMTE1VTFRJOwotCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSB+MDsKLQl9IGVsc2UgewotCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgbWNfY291bnQ7IGkrKykgewotCQkJaWYgKCFtY2xpc3QpCi0JCQkJYnJlYWs7Ci0JCQlwcmludGsoIlNob3VsZCBjYWxsIGV0aGVyX2NyYyBoZXJlXG4iKTsKLQkJCS8vYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNjsKLQkJCWJpdF9uciA9IDA7Ci0KLQkJCWJpdF9uciAmPSAweDNGOwotCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7Ci0JCQltY2xpc3QgPSBtY2xpc3QtPm5leHQ7Ci0JCX0KLQl9Ci0KLQlkZXYtPmZsYWdzICY9IH5JRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTOwotCi0JKnRvdGFsX2ZsYWdzID0gbmV3X2ZsYWdzOwotfQotCi1zdGF0aWMgaW50IHdic29mdF90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JY2hhciAqYnVmZmVyID0ga21hbGxvYyhza2ItPmxlbiwgR0ZQX0FUT01JQyk7Ci0JcHJpbnRrKCJTZW5kaW5nIGZyYW1lICVkIGJ5dGVzXG4iLCBza2ItPmxlbik7Ci0JbWVtY3B5KGJ1ZmZlciwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JaWYgKDEgPT0gTUxNRVNlbmRGcmFtZShteV9hZGFwdGVyLCBidWZmZXIsIHNrYi0+bGVuLCBGUkFNRV9UWVBFXzgwMl8xMV9NQU5BR0VNRU5UKSkKLQkJcHJpbnRrKCJmcmFtZSBzZW50IG9rICglZCBieXRlcyk/XG4iLCBza2ItPmxlbik7Ci0JcmV0dXJuIE5FVERFVl9UWF9PSzsKLX0KLQotCi1zdGF0aWMgaW50IHdic29mdF9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCi17Ci0Jd2Jzb2Z0X2VuYWJsZWQgPSAxOwotCXByaW50aygid2Jzb2Z0X3N0YXJ0IGNhbGxlZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2Jzb2Z0X2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKLXsKLQlDaGFuSW5mbyBjaDsKLQlwcmludGsoIndic29mdF9jb25maWcgY2FsbGVkXG4iKTsKLQotCWNoLmJhbmQgPSAxOwotCWNoLkNoYW5ObyA9IDE7CS8qIFNob3VsZCB1c2UgY2hhbm5lbF9udW0sIG9yIHNvbWV0aGluZywgYXMgdGhhdCBpcyBhbHJlYWR5IHByZS10cmFuc2xhdGVkICovCi0KLQotCWhhbF9zZXRfY3VycmVudF9jaGFubmVsKCZteV9hZGFwdGVyLT5zSHdEYXRhLCBjaCk7Ci0JaGFsX3NldF9iZWFjb25fcGVyaW9kKCZteV9hZGFwdGVyLT5zSHdEYXRhLCBjb25mLT5iZWFjb25faW50KTsKLS8vCWhhbF9zZXRfY2FwX2luZm8oJm15X2FkYXB0ZXItPnNId0RhdGEsID8/ICk7Ci0vLyBoYWxfc2V0X3NzaWQocGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKiBwc3NpZCwgIHU4IHNzaWRfbGVuKTsgPz8KLQloYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QoJm15X2FkYXB0ZXItPnNId0RhdGEsIDEpOwotCWhhbF9zZXRfYWNjZXB0X3Byb21pc2N1b3VzKCZteV9hZGFwdGVyLT5zSHdEYXRhLCAgMSk7Ci0JaGFsX3NldF9hY2NlcHRfbXVsdGljYXN0KCZteV9hZGFwdGVyLT5zSHdEYXRhLCAgMSk7Ci0JaGFsX3NldF9hY2NlcHRfYmVhY29uKCZteV9hZGFwdGVyLT5zSHdEYXRhLCAgMSk7Ci0JaGFsX3NldF9yYWRpb19tb2RlKCZteV9hZGFwdGVyLT5zSHdEYXRhLCAgMCk7Ci0JLy9oYWxfc2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBudW1iZXIgKQotCS8vaGFsX3NldF9yZl9wb3dlcihwaHdfZGF0YV90IHBId0RhdGEsIHU4IFBvd2VySW5kZXgpCi0KLQotLy8JaGFsX3N0YXJ0X2JzcygmbXlfYWRhcHRlci0+c0h3RGF0YSwgV0xBTl9CU1NUWVBFX0lORlJBU1RSVUNUVVJFKTsJPz8KLQotLy92b2lkIGhhbF9zZXRfcmF0ZXMocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqIHBic3NfcmF0ZXMsCi0vLwkJICAgdTggbGVuZ3RoLCB1bnNpZ25lZCBjaGFyIGJhc2ljX3JhdGVfc2V0KQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2Jzb2Z0X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2NvbmYgKmNvbmYpCi17Ci0JcHJpbnRrKCJ3YnNvZnRfY29uZmlnX2ludGVyZmFjZSBjYWxsZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTY0IHdic29mdF9nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKLXsKLQlwcmludGsoIndic29mdF9nZXRfdHNmIGNhbGxlZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyB3YnNvZnRfb3BzID0gewotCS50eAkJCT0gd2Jzb2Z0X3R4LAotCS5zdGFydAkJCT0gd2Jzb2Z0X3N0YXJ0LAkJLyogU3RhcnQgY2FuIGJlIHByZXR0eSBtdWNoIGVtcHR5IGFzIHdlIGRvIFdiV0xhbkluaXRpYWxpemUoKSBkdXJpbmcgcHJvYmU/ICovCi0JLnN0b3AJCQk9IHdic29mdF9zdG9wLAotCS5hZGRfaW50ZXJmYWNlCQk9IHdic29mdF9hZGRfaW50ZXJmYWNlLAotCS5yZW1vdmVfaW50ZXJmYWNlCT0gd2Jzb2Z0X3JlbW92ZV9pbnRlcmZhY2UsCi0JLmNvbmZpZwkJCT0gd2Jzb2Z0X2NvbmZpZywKLQkuY29uZmlnX2ludGVyZmFjZQk9IHdic29mdF9jb25maWdfaW50ZXJmYWNlLAotCS5jb25maWd1cmVfZmlsdGVyCT0gd2Jzb2Z0X2NvbmZpZ3VyZV9maWx0ZXIsCi0JLmdldF9zdGF0cwkJPSB3YnNvZnRfZ2V0X3N0YXRzLAotCS5nZXRfdHhfc3RhdHMJCT0gd2Jzb2Z0X2dldF90eF9zdGF0cywKLQkuZ2V0X3RzZgkJPSB3YnNvZnRfZ2V0X3RzZiwKLS8vIGNvbmZfdHg6IGhhbF9zZXRfY3dtaW4oKS9oYWxfc2V0X2N3bWF4OwotfTsKLQotc3RydWN0IHdic29mdF9wcml2IHsKLX07Ci0KLQotLy8gVXNiIGtlcm5lbCBzdWJzeXN0ZW0gd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBhIG5ldyBkZXZpY2UgaXMgcGx1Z2dlZCBpbnRvLgotaW50IHdiMzVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZF90YWJsZSkKLXsKLQlQQURBUFRFUglBZGFwdGVyOwotCVBXQkxJTlVYCXBXYkxpbnV4OwotCVBXQlVTQgkJcFdiVXNiOwotICAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKLQlpbnQJcmV0ID0gLTE7Ci0JdTMyCWx0bXA7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCi0JdXNiX2dldF9kZXYodWRldik7Ci0KLQlwcmludGsoIlt3MzV1bmRdd2IzNV9wcm9iZSAtPlxuIik7Ci0KLQkvLyAyMDA2MDYzMC4yIENoZWNrIHRoZSBkZXZpY2UgaWYgaXQgYWxyZWFkeSBiZSBvcGVuZWQKLQlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKCB1ZGV2LCAwICksCi0JCQkgICAgICAweDAxLCBVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRXxVU0JfRElSX0lOLAotCQkJICAgICAgMHgwLCAweDQwMCwgJmx0bXAsIDQsIEhaKjEwMCApOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JbHRtcCA9IGNwdV90b19sZTMyKGx0bXApOwotCWlmIChsdG1wKSAgLy8gSXMgYWxyZWFkeSBpbml0aWFsaXplZD8KLQkJZ290byBlcnJvcjsKLQotCUFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihBREFQVEVSKSwgR0ZQX0tFUk5FTCk7Ci0KLQlteV9hZGFwdGVyID0gQWRhcHRlcjsKLQlwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCXBXYlVzYiA9ICZBZGFwdGVyLT5zSHdEYXRhLldiVXNiOwotCXBXYlVzYi0+dWRldiA9IHVkZXY7Ci0KLSAgICAgICAgaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7Ci0gICAgICAgIGVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKLQotCWlmIChlbmRwb2ludFsyXS53TWF4UGFja2V0U2l6ZSA9PSA1MTIpIHsKLQkJcHJpbnRrKCJbdzM1dW5kXSBXb3JraW5nIG9uIFVTQiAyLjBcbiIpOwotCQlwV2JVc2ItPklzVXNiMjAgPSAxOwotCX0KLQotCWlmICghV2JXTGFuSW5pdGlhbGl6ZShBZGFwdGVyKSkgewotCQlwcmludGsoIlt3MzV1bmRdV2JXTGFuSW5pdGlhbGl6ZSBmYWlsXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQl7Ci0JCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdjsKLQkJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2OwotCQlzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kOwotCQlpbnQgcmVzOwotCi0JCWRldiA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2YoKnByaXYpLCAmd2Jzb2Z0X29wcyk7Ci0KLQkJaWYgKCFkZXYpIHsKLQkJCXByaW50aygidzM1dW5kOiBpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iICk7Ci0JCQlCVUcoKTsKLQkJfQotCi0JCW15X2RldiA9IGRldjsKLQotCQlTRVRfSUVFRTgwMjExX0RFVihkZXYsICZ1ZGV2LT5kZXYpOwotCQl7Ci0JCQlwaHdfZGF0YV90IHBId0RhdGEgPSAmQWRhcHRlci0+c0h3RGF0YTsKLQkJCXVuc2lnbmVkIGNoYXIJCWRldl9hZGRyW01BWF9BRERSX0xFTl07Ci0JCQloYWxfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKHBId0RhdGEsIGRldl9hZGRyKTsKLQkJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGRldiwgZGV2X2FkZHIpOwotCQl9Ci0KLQotCQlkZXYtPmV4dHJhX3R4X2hlYWRyb29tID0gMTI7CS8qIEZJWE1FICovCi0JCWRldi0+ZmxhZ3MgPSAwOwotCi0JCWRldi0+Y2hhbm5lbF9jaGFuZ2VfdGltZSA9IDEwMDA7Ci0vLwkJZGV2LT5tYXhfcnNzaSA9IDEwMDsKLQotCQlkZXYtPnF1ZXVlcyA9IDE7Ci0KLQkJYmFuZC5jaGFubmVscyA9IHdic29mdF9jaGFubmVsczsKLQkJYmFuZC5uX2NoYW5uZWxzID0gQVJSQVlfU0laRSh3YnNvZnRfY2hhbm5lbHMpOwotCQliYW5kLmJpdHJhdGVzID0gd2Jzb2Z0X3JhdGVzOwotCQliYW5kLm5fYml0cmF0ZXMgPSBBUlJBWV9TSVpFKHdic29mdF9yYXRlcyk7Ci0KLQkJZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYmFuZDsKLSNpZiAwCi0JCXdic29mdF9tb2Rlc1swXS5udW1fY2hhbm5lbHMgPSAxOwotCQl3YnNvZnRfbW9kZXNbMF0uY2hhbm5lbHMgPSB3YnNvZnRfY2hhbm5lbHM7Ci0JCXdic29mdF9tb2Rlc1swXS5tb2RlID0gTU9ERV9JRUVFODAyMTFCOwotCQl3YnNvZnRfbW9kZXNbMF0ubnVtX3JhdGVzID0gQVJSQVlfU0laRSh3YnNvZnRfcmF0ZXMpOwotCQl3YnNvZnRfbW9kZXNbMF0ucmF0ZXMgPSB3YnNvZnRfcmF0ZXM7Ci0KLQkJcmVzID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3bW9kZShkZXYsICZ3YnNvZnRfbW9kZXNbMF0pOwotCQlCVUdfT04ocmVzKTsKLSNlbmRpZgotCi0JCXJlcyA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhkZXYpOwotCQlCVUdfT04ocmVzKTsKLQl9Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKCBpbnRmLCBBZGFwdGVyICk7Ci0KLQlwcmludGsoIlt3MzV1bmRdIF9wcm9iZSBPS1xuIik7Ci0JcmV0dXJuIDA7Ci1lcnJvcjoKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotdm9pZCBwYWNrZXRfY2FtZShjaGFyICpwUnhCdWZmZXJBZGRyZXNzLCBpbnQgUGFja2V0U2l6ZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1cyA9IHswfTsKLQotCWlmICghd2Jzb2Z0X2VuYWJsZWQpCi0JCXJldHVybjsKLQotCXNrYiA9IGRldl9hbGxvY19za2IoUGFja2V0U2l6ZSk7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgcGFja2V0LCBGSVhNRVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1jcHkoc2tiX3B1dChza2IsIFBhY2tldFNpemUpLAotCSAgICAgICBwUnhCdWZmZXJBZGRyZXNzLAotCSAgICAgICBQYWNrZXRTaXplKTsKLQotLyoKLQlyeF9zdGF0dXMucmF0ZSA9IDEwOwotCXJ4X3N0YXR1cy5jaGFubmVsID0gMTsKLQlyeF9zdGF0dXMuZnJlcSA9IDEyMzQ1OwotCXJ4X3N0YXR1cy5waHltb2RlID0gTU9ERV9JRUVFODAyMTFCOwotKi8KLQotCWllZWU4MDIxMV9yeF9pcnFzYWZlKG15X2Rldiwgc2tiLCAmcnhfc3RhdHVzKTsKLX0KLQotdW5zaWduZWQgY2hhcgotV2JVc2JfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLQotdm9pZAotV2JVc2JfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci19Ci0KLWludCB3YjM1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQkvKiBuZXRkZXZfcHJpdigpIG9yIG5ldGRldi0+bWxfcHJpdiBzaG91bGQgcmVmZXJlbmNlIHRvIHRoZSBhZGRyZXNzIG9mCi0JICogcHJpdmF0ZSBkYXRhKFBBREFQVEVSKS4gSXQgZGVwZW5kcyBvbiB3aGV0aGVyIHByaXZhdGUgZGF0YSBtZW1vcnkgaXMKLQkgKiBhbGxvY2F0ZWQgd2hlbiBhbGxvY19uZXRkZXYoKS4KLQkgKi8KLQlQQURBUFRFUiBBZGFwdGVyID0gKFBBREFQVEVSKW5ldGRldl9wcml2KG5ldGRldik7Ci0JcGh3X2RhdGFfdCBwSHdEYXRhID0gJkFkYXB0ZXItPnNId0RhdGE7Ci0KLSAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKLQotCS8vVE9ETyA6IHB1dCBoZXJlIHRlbXBvcmFyaWx5Ci0JaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KHBId0RhdGEsIDEpOyAvLyBvcGVuIGFjY2VwdCBicm9hZGNhc3QKLQotCXJldHVybiAwOwotfQotCi1pbnQgd2IzNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB3YjM1X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0JUFdCTElOVVggcFdiTGludXg7Ci0JUEFEQVBURVIgQWRhcHRlciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLQotICAgICAgICBwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCi0JLy8gQ2FyZCByZW1vdmUKLQlXYldsYW5IYWx0KEFkYXB0ZXIpOwotCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB3YjM1X2RyaXZlciA9IHsKLQkubmFtZQkJPSAidzM1dW5kIiwKLQkuaWRfdGFibGUJPSB3YjM1X3RhYmxlLAotCS5wcm9iZQkJPSB3YjM1X3Byb2JlLAotCS5kaXNjb25uZWN0CT0gd2IzNV9kaXNjb25uZWN0LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgd2IzNV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHVzYl9yZWdpc3Rlcigmd2IzNV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgd2IzNV9leGl0KHZvaWQpCi17Ci0JdXNiX2RlcmVnaXN0ZXIoJndiMzVfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQod2IzNV9pbml0KTsKLW1vZHVsZV9leGl0KHdiMzVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYl9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYl9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTI5ZTEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2JfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0vLyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLS8vCi0vLyAgTW9kdWxlIE5hbWU6Ci0vLyAgICB3YnVzYl9mLmgKLS8vCi0vLyAgQWJzdHJhY3Q6Ci0vLyAgICBMaW51eCBkcml2ZXIuCi0vLwotLy8gIEF1dGhvcjoKLS8vCi0vLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0KLWludCB3YjM1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci1pbnQgd2IzNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKLXVuc2lnbmVkIGNoYXIgV2JVc2JfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpOwotdm9pZCBXYlVzYl9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSk7Ci11bnNpZ25lZCBjaGFyIFdiV0xhbkluaXRpYWxpemUoUEFEQVBURVIgQWRhcHRlcik7Ci0jZGVmaW5lCVdiVXNiX1N0b3AoIF9BICkKLQotaW50IHdiMzVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlKTsKLXZvaWQgd2IzNV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLQotCi0jZGVmaW5lIHdiX3VzYl9zdWJtaXRfdXJiKF9BKSB1c2Jfc3VibWl0X3VyYihfQSwgR0ZQX0FUT01JQykKLSNkZWZpbmUgd2JfdXNiX2FsbG9jX3VyYihfQSkgdXNiX2FsbG9jX3VyYihfQSwgR0ZQX0FUT01JQykKLQotI2RlZmluZSBXYlVzYl9DaGVja0ZvckhhbmcoIF9QICkKLSNkZWZpbmUgV2JVc2JfRGV0ZWN0U3RhcnQoIF9QLCBfSSApCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2Jfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2Jfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxZDUzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotLy8gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0vLwotLy8gIE1vZHVsZSBOYW1lOgotLy8gICAgd2J1c2Jfcy5oCi0vLwotLy8gIEFic3RyYWN0OgotLy8gICAgTGludXggZHJpdmVyLgotLy8KLS8vICBBdXRob3I6Ci0vLwotLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotCi0jZGVmaW5lIE9TX1NMRUVQKCBfTVQgKQl7IHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKLQkJCSAgc2NoZWR1bGVfdGltZW91dCggX01UKkhaLzEwMDAwMDAgKTsgfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgUldfQ09OVEVYVCAtLQotLy8KLS8vICBVc2VkIHRvIHRyYWNrIGRyaXZlci1nZW5lcmF0ZWQgaW8gaXJwcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXR5cGVkZWYgc3RydWN0IF9SV19DT05URVhUCi17Ci0Jdm9pZCoJCQlwSHdEYXRhOwotCVBVUkIJCQlwVXJiOwotCXZvaWQqCQkJcENhbGxCYWNrRnVuY3Rpb25QYXJhbWV0ZXI7Ci19IFJXX0NPTlRFWFQsICpQUldfQ09OVEVYVDsKLQotCi0KLQotI2RlZmluZSBEUklWRVJfQVVUSE9SICJPcmlnaW5hbCBieTogSmVmZiBMZWU8WVlfTGVlQGlzc2MuY29tLnR3PiBBZGFwdGVkIHRvIDIuNi54IGJ5IENvc3RhbnRpbm8gTGVhbmRybyAoUnhhcnQgRGVza3RvcCkgPGxlX2Nvc3RhbnRpbm9AcGl4YXJ0YXJnZW50aW5hLmNvbS5hcj4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICAgIklTODlDMzUgODAyLjExYmcgV0xBTiBVU0IgRHJpdmVyIgotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX1dCVVNCIHsKLQl1MzIJSXNVc2IyMDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKLQl1MzIJRGV0ZWN0Q291bnQ7Ci19IFdCVVNCLCAqUFdCVVNCOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaAppbmRleCAyNjhjZjkxLi42MDdiYjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaApAQCAtMSw2ICsxLDEyIEBACisjaWZuZGVmIF9fV0lOQk9ORF9MT0NBTFBBUkFfSAorI2RlZmluZSBfX1dJTkJPTkRfTE9DQUxQQVJBX0gKKwogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBMb2NhbFBhcmEuaCAtCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIm1hY19zdHJ1Y3R1cmVzLmgiCisKIC8vRGVmaW5lIHRoZSBsb2NhbCBhYmlsaXR5CiAKICNkZWZpbmUgTE9DQUxfREVGQVVMVF9CRUFDT05fUEVSSU9ECQkJMTAwCQkvL21zCkBAIC0yNSw3ICszMSw3IEBACiAjZGVmaW5lIExPQ0FMX1VOS05PV05fNV9DSEFOTkVMX05VTQkJCTM0CS8vbm90IGluY2x1ZGUgMTY1CiAKIAotI2RlZmluZSBwc0xPQ0FMCQkJKCYoQWRhcHRlci0+c0xvY2FsUGFyYSkpCisjZGVmaW5lIHBzTE9DQUwJCQkoJihhZGFwdGVyLT5zTG9jYWxQYXJhKSkKIAogI2RlZmluZSBNT0RFXzgwMl8xMV9CRwkJCTAKICNkZWZpbmUgTU9ERV84MDJfMTFfQQkJCTEKQEAgLTE0Myw3ICsxNDksNiBAQAogCiAgICAgLy8vLyBwb3dlci1zYXZlIHZhcmlhYmxlcwogICAgIHU4ICAJCSAgCWlQb3dlclNhdmVNb2RlOyAgICAgLy8gMCBpbmRpY2F0ZXMgaXQgaXMgb24sIDEgaW5kaWNhdGVzIGl0IGlzIG9mZgotCXU4CQkJU2h1dERvd25lZDsKIAl1OAkJCUFUSU1tb2RlOwogCXU4CQkJRXhjbHVkZVVuZW5jcnlwdGVkOwogCkBAIC0yNzIsNCArMjc3LDQgQEAKIAogfSBXQl9MT0NBTERFU0NSSVBULCAqUFdCX0xPQ0FMREVTQ1JJUFQ7CiAKLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaAppbmRleCAwMzFkMmNiLi4wZDE2MTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpZm5kZWYgX01BQ19TdHJ1Y3R1cmVzX0hfCiAjZGVmaW5lIF9NQUNfU3RydWN0dXJlc19IXwogCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBTb21lIG1pc2NlbGxhbmVvdXMgZGVmaW5pdGlvbnMKQEAgLTExNSwxMCArMTE2LDYgQEAKICNkZWZpbmUgV0xBTl9NQVhfUEFJUldJU0VfQ0lQSEVSX1NVSVRFX0NPVU5UICAgICgodTE2KSA2KQogI2RlZmluZSBXTEFOX01BWF9BVVRIX0tFWV9NR1RfU1VJVEVfTElTVF9DT1VOVCAgKCh1MTYpIDIpCiAKLSNpZmRlZiBXQl9MSU5VWAotI2RlZmluZSBVTkFMSUdORUQKLSNlbmRpZgotCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiB0eXBlZGVmIGVudW0gZW51bV9Qb3dlck1hbmFnZW1lbnRNb2RlCiB7CkBAIC00NjQsNyArNDYxLDcgQEAKIHsKIAl1OAkJCQkJRWxlbWVudF9JRDsKIAl1OAkJCQkJTGVuZ3RoOwotCVVOQUxJR05FRCBTVUlURV9TRUxFQ1RPUglPdWlXUEFBZGRpdGlvbmFsOy8vV1BBIHZlcnNpb24gMi4wIGFkZGl0aW9uYWwgZmllbGQsIGFuZCBzaG91bGQgYmUgMDA6NTA6RjI6MDEKKwlTVUlURV9TRUxFQ1RPUglPdWlXUEFBZGRpdGlvbmFsOy8vV1BBIHZlcnNpb24gMi4wIGFkZGl0aW9uYWwgZmllbGQsIGFuZCBzaG91bGQgYmUgMDA6NTA6RjI6MDEKIAl1MTYJCQkJCVZlcnNpb247CiAJU1VJVEVfU0VMRUNUT1IJCUdyb3VwS2V5U3VpdGU7CiAJdTE2CQkJCQlQYWlyd2lzZUtleVN1aXRlQ291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCmluZGV4IGYxZGU4MTMuLmU0MzE0MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCkBAIC0xLDQ0NSArMSwzOSBAQAorI2luY2x1ZGUgImRzX3RraXAuaCIKKyNpbmNsdWRlICJnbF84MDIxMS5oIgorI2luY2x1ZGUgIm1kc19mLmgiCisjaW5jbHVkZSAibWxtZXR4cnhfZi5oIgorI2luY2x1ZGUgIm10b19mLmgiCiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCi0KLXZvaWQKLU1kc19yZXNldF9kZXNjcmlwdG9yKFBBREFQVEVSIEFkYXB0ZXIpCi17Ci0JUE1EUyBwTWRzID0gJkFkYXB0ZXItPk1kczsKLQotCXBNZHMtPlR4UGF1c2UgPSAwOwotCXBNZHMtPlR4VGhyZWFkQ291bnQgPSAwOwotCXBNZHMtPlR4RmlsbEluZGV4ID0gMDsKLQlwTWRzLT5UeERlc0luZGV4ID0gMDsKLQlwTWRzLT5TY2FuVHhQYXVzZSA9IDA7Ci0JbWVtc2V0KHBNZHMtPlR4T3duZXIsIDAsICgoTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSICsgMykgJiB+MHgwMykpOwotfQorI2luY2x1ZGUgIndiaGFsX2YuaCIKKyNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKIAogdW5zaWduZWQgY2hhcgotTWRzX2luaXRpYWwoUEFEQVBURVIgQWRhcHRlcikKK01kc19pbml0aWFsKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpCiB7Ci0JUE1EUyBwTWRzID0gJkFkYXB0ZXItPk1kczsKKwlQTURTIHBNZHMgPSAmYWRhcHRlci0+TWRzOwogCi0JcE1kcy0+VHhQYXVzZSA9IEZBTFNFOworCXBNZHMtPlR4UGF1c2UgPSBmYWxzZTsKIAlwTWRzLT5UeFJUU1RocmVzaG9sZCA9IERFRkFVTFRfUlRTVGhyZXNob2xkOwogCXBNZHMtPlR4RnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsKIAotCXZSeFRpbWVySW5pdChBZGFwdGVyKTsvL2ZvciBXUEEgY291bnRlcm1lYXN1cmUKLQotCXJldHVybiBoYWxfZ2V0X3R4X2J1ZmZlciggJkFkYXB0ZXItPnNId0RhdGEsICZwTWRzLT5wVHhCdWZmZXIgKTsKKwlyZXR1cm4gaGFsX2dldF90eF9idWZmZXIoICZhZGFwdGVyLT5zSHdEYXRhLCAmcE1kcy0+cFR4QnVmZmVyICk7CiB9CiAKIHZvaWQKLU1kc19EZXN0cm95KFBBREFQVEVSIEFkYXB0ZXIpCitNZHNfRGVzdHJveShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKQogewotCXZSeFRpbWVyU3RvcChBZGFwdGVyKTsKIH0KIAotdm9pZAotTWRzX1R4KFBBREFQVEVSIEFkYXB0ZXIpCi17Ci0JcGh3X2RhdGFfdAlwSHdEYXRhID0gJkFkYXB0ZXItPnNId0RhdGE7Ci0JUE1EUwkJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0JREVTQ1JJUFRPUglUeERlczsKLQlQREVTQ1JJUFRPUglwVHhEZXMgPSAmVHhEZXM7Ci0JdTgJCSpYbWl0QnVmQWRkcmVzczsKLQl1MTYJCVhtaXRCdWZTaXplLCBQYWNrZXRTaXplLCBzdG1wLCBDdXJyZW50U2l6ZSwgRnJhZ21lbnRUaHJlc2hvbGQ7Ci0JdTgJCUZpbGxJbmRleCwgVHhEZXNJbmRleCwgRnJhZ21lbnRDb3VudCwgRmlsbENvdW50OwotCXVuc2lnbmVkIGNoYXIJQnVmZmVyRmlsbGVkID0gRkFMU0UsIE1JQ0FkZCA9IDA7Ci0KLQotCWlmIChwTWRzLT5UeFBhdXNlKQotCQlyZXR1cm47Ci0JaWYgKCFoYWxfZHJpdmVyX2luaXRfT0socEh3RGF0YSkpCi0JCXJldHVybjsKLQotCS8vT25seSBvbmUgdGhyZWFkIGNhbiBiZSBydW4gaGVyZQotCWlmICghT1NfQVRPTUlDX0lOQyggQWRhcHRlciwgJnBNZHMtPlR4VGhyZWFkQ291bnQpID09IDEpCi0JCWdvdG8gY2xlYW51cDsKLQotCS8vIFN0YXJ0IHRvIGZpbGwgdGhlIGRhdGEKLQlkbyB7Ci0JCUZpbGxJbmRleCA9IHBNZHMtPlR4RmlsbEluZGV4OwotCQlpZiAocE1kcy0+VHhPd25lcltGaWxsSW5kZXhdKSB7IC8vIElzIG93bmVkIGJ5IHNvZnR3YXJlIDA6WWVzIDE6Tm8KLSNpZmRlZiBfUEVfVFhfRFVNUF8KLQkJCVdCREVCVUcoKCJbTWRzX1R4XSBUeCBPd25lciBpcyBIL1cuXG4iKSk7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQl9Ci0KLQkJWG1pdEJ1ZkFkZHJlc3MgPSBwTWRzLT5wVHhCdWZmZXIgKyAoTUFYX1VTQl9UWF9CVUZGRVIgKiBGaWxsSW5kZXgpOyAvL0dldCBidWZmZXIKLQkJWG1pdEJ1ZlNpemUgPSAwOwotCQlGaWxsQ291bnQgPSAwOwotCQlkbyB7Ci0JCQlQYWNrZXRTaXplID0gQWRhcHRlci0+c01sbWVGcmFtZS5sZW47Ci0JCQlpZiAoIVBhY2tldFNpemUpCi0JCQkJYnJlYWs7Ci0KLQkJCS8vRm9yIENoZWNrIHRoZSBidWZmZXIgcmVzb3VyY2UKLQkJCUZyYWdtZW50VGhyZXNob2xkID0gQ1VSUkVOVF9GUkFHTUVOVF9USFJFU0hPTEQ7Ci0JCQkvLzkzMTEzMC41LmIKLQkJCUZyYWdtZW50Q291bnQgPSBQYWNrZXRTaXplL0ZyYWdtZW50VGhyZXNob2xkICsgMTsKLQkJCXN0bXAgPSBQYWNrZXRTaXplICsgRnJhZ21lbnRDb3VudCozMiArIDg7Ly85MzExMzAuNS5jIDg6TUlDCi0JCQlpZiAoKFhtaXRCdWZTaXplICsgc3RtcCkgPj0gTUFYX1VTQl9UWF9CVUZGRVIpIHsKLQkJCQlwcmludGsoIltNZHNfVHhdIEV4Y2VzcyBtYXggdHggYnVmZmVyLlxuIik7Ci0JCQkJYnJlYWs7IC8vIGJ1ZmZlciBpcyBub3QgZW5vdWdoCi0JCQl9Ci0KLQotCQkJLy8KLQkJCS8vIFN0YXJ0IHRyYW5zbWl0dGluZwotCQkJLy8KLQkJCUJ1ZmZlckZpbGxlZCA9IFRSVUU7Ci0KLQkJCS8qIExlYXZlcyBmaXJzdCB1OCBpbnRhY3QgKi8KLQkJCW1lbXNldCgodTggKilwVHhEZXMgKyAxLCAwLCBzaXplb2YoREVTQ1JJUFRPUikgLSAxKTsKLQotCQkJVHhEZXNJbmRleCA9IHBNZHMtPlR4RGVzSW5kZXg7Ly9HZXQgdGhlIGN1cnJlbnQgSUQKLQkJCXBUeERlcy0+RGVzY3JpcHRvcl9JRCA9IFR4RGVzSW5kZXg7Ci0JCQlwTWRzLT5UeERlc0Zyb21bIFR4RGVzSW5kZXggXSA9IDI7Ly9TdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBvZiBzb3VyY2UgY29tbWluZyBmcm9tCi0JCQlwTWRzLT5UeERlc0luZGV4Kys7Ci0JCQlwTWRzLT5UeERlc0luZGV4ICU9IE1BWF9VU0JfVFhfREVTQ1JJUFRPUjsKLQotCQkJTUxNRV9HZXROZXh0UGFja2V0KCBBZGFwdGVyLCBwVHhEZXMgKTsKLQotCQkJLy8gQ29weSBoZWFkZXIuIDhieXRlIFVTQiArIDI0Ynl0ZSA4MDIuMTFIZHIuIFNldCBUeFJhdGUsIFByZWFtYmxlIHR5cGUKLQkJCU1kc19IZWFkZXJDb3B5KCBBZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzICk7Ci0KLQkJCS8vIEZvciBzcGVlZCB1cCBLZXkgc2V0dGluZwotCQkJaWYgKHBUeERlcy0+RWFwRml4KSB7Ci0jaWZkZWYgX1BFX1RYX0RVTVBfCi0JCQkJV0JERUJVRygoIjM1OiBFUEEgNHRoIGZyYW1lIGRldGVjdGVkLiBTaXplID0gJWRcbiIsIFBhY2tldFNpemUpKTsKLSNlbmRpZgotCQkJCXBId0RhdGEtPklzS2V5UHJlU2V0ID0gMTsKLQkJCX0KLQotCQkJLy8gQ29weSAoZnJhZ21lbnQpIGZyYW1lIGJvZHksIGFuZCBzZXQgVVNCLCA4MDIuMTEgaGRyIGZsYWcKLQkJCUN1cnJlbnRTaXplID0gTWRzX0JvZHlDb3B5KEFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MpOwotCi0JCQkvLyBTZXQgUlRTL0NUUyBhbmQgTm9ybWFsIGR1cmF0aW9uIGZpZWxkIGludG8gYnVmZmVyCi0JCQlNZHNfRHVyYXRpb25TZXQoQWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyk7Ci0KLQkJCS8vCi0JCQkvLyBDYWxjdWxhdGlvbiBNSUMgZnJvbSBidWZmZXIgd2hpY2ggbWF5YmUgZnJhZ21lbnQsIHRoZW4gZmlsbCBpbnRvIHRlbXBvcmFyeSBhZGRyZXNzIDggYnl0ZQotCQkJLy8gOTMxMTMwLjUuZQotCQkJaWYgKE1JQ0FkZCkKLQkJCQlNZHNfTWljRmlsbCggQWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyApOwotCi0JCQkvL1NoaWZ0IHRvIHRoZSBuZXh0IGFkZHJlc3MKLQkJCVhtaXRCdWZTaXplICs9IEN1cnJlbnRTaXplOwotCQkJWG1pdEJ1ZkFkZHJlc3MgKz0gQ3VycmVudFNpemU7Ci0KLSNpZmRlZiBfSUJTU19CRUFDT05fU0VRX1NUSUNLXwotCQkJaWYgKChYbWl0QnVmQWRkcmVzc1sgRE9UXzExX0RBX09GRlNFVCs4IF0gJiAweGZjKSAhPSBNQUNfU1VCVFlQRV9NTkdNTlRfUFJPQkVfUkVRVUVTVCkgLy8gKzggZm9yIFVTQiBoZHIKLSNlbmRpZgotCQkJCXBNZHMtPlR4VG9nZ2xlID0gVFJVRTsKLQotCQkJLy8gR2V0IHBhY2tldCB0byB0cmFuc21pdCBjb21wbGV0ZWQsIDE6VEVTVFNUQSAyOk1MTUUgMzogTmRpcyBkYXRhCi0JCQlNTE1FX1NlbmRDb21wbGV0ZShBZGFwdGVyLCAwLCBUUlVFKTsKLQotCQkJLy8gU29mdHdhcmUgVFNDIGNvdW50IDIwMDYwMjE0Ci0JCQlwTWRzLT5UeFRzYysrOwotCQkJaWYgKHBNZHMtPlR4VHNjID09IDApCi0JCQkJcE1kcy0+VHhUc2NfMisrOwotCi0JCQlGaWxsQ291bnQrKzsgLy8gMjAwNjA5MjgKLQkJfSB3aGlsZSAoSEFMX1VTQl9NT0RFX0JVUlNUKHBId0RhdGEpKTsgLy8gRW5kIG9mIG11bHRpcGxlIE1TRFUgY29weSBsb29wLiBGQUxTRSA9IHNpbmdsZSBUUlVFID0gbXVsdGlwbGUgc2VuZGluZwotCi0JCS8vIE1vdmUgdG8gdGhlIG5leHQgb25lLCBpZiBuZWNlc3NhcnkKLQkJaWYgKEJ1ZmZlckZpbGxlZCkgewotCQkJLy8gc2l6ZSBzZXR0aW5nCi0JCQlwTWRzLT5UeEJ1ZmZlclNpemVbIEZpbGxJbmRleCBdID0gWG1pdEJ1ZlNpemU7Ci0KLQkJCS8vIDIwMDYwOTI4IHNldCBUeCBjb3VudAotCQkJcE1kcy0+VHhDb3VudEluQnVmZmVyW0ZpbGxJbmRleF0gPSBGaWxsQ291bnQ7Ci0KLQkJCS8vIFNldCBvd25lciBmbGFnCi0JCQlwTWRzLT5UeE93bmVyW0ZpbGxJbmRleF0gPSAxOwotCi0JCQlwTWRzLT5UeEZpbGxJbmRleCsrOwotCQkJcE1kcy0+VHhGaWxsSW5kZXggJT0gTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSOwotCQkJQnVmZmVyRmlsbGVkID0gRkFMU0U7Ci0JCX0gZWxzZQotCQkJYnJlYWs7Ci0KLQkJaWYgKCFQYWNrZXRTaXplKSAvLyBObyBtb3JlIHBrIGZvciB0cmFuc21pdHRpbmcKLQkJCWJyZWFrOwotCi0JfSB3aGlsZShUUlVFKTsKLQotCS8vCi0JLy8gU3RhcnQgdG8gc2VuZCBieSBsb3dlciBtb2R1bGUKLQkvLwotCWlmICghcEh3RGF0YS0+SXNLZXlQcmVTZXQpCi0JCVdiMzVUeF9zdGFydChwSHdEYXRhKTsKLQotIGNsZWFudXA6Ci0JT1NfQVRPTUlDX0RFQyggQWRhcHRlciwgJnBNZHMtPlR4VGhyZWFkQ291bnQgKTsKLX0KLQotdm9pZAotTWRzX1NlbmRDb21wbGV0ZShQQURBUFRFUiBBZGFwdGVyLCBQVDAyX0RFU0NSSVBUT1IgcFQwMikKLXsKLQlQTURTCXBNZHMgPSAmQWRhcHRlci0+TWRzOwotCXBod19kYXRhX3QJcEh3RGF0YSA9ICZBZGFwdGVyLT5zSHdEYXRhOwotCXU4CVBhY2tldElkID0gKHU4KXBUMDItPlQwMl9UeF9Qa3RJRDsKLQl1bnNpZ25lZCBjaGFyCVNlbmRPSyA9IFRSVUU7Ci0JdTgJUmV0cnlDb3VudCwgVHhSYXRlOwotCi0JaWYgKHBUMDItPlQwMl9JZ25vcmVSZXN1bHQpIC8vIERvbid0IGNhcmUgdGhlIHJlc3VsdAotCQlyZXR1cm47Ci0JaWYgKHBUMDItPlQwMl9Jc0xhc3RNcGR1KSB7Ci0JCS8vVE9ETzogRFRPIC0tIGdldCB0aGUgcmV0cnkgY291bnQgYW5kIGZyYWdtZW50IGNvdW50Ci0JCS8vIFR4IHJhdGUKLQkJVHhSYXRlID0gcE1kcy0+VHhSYXRlWyBQYWNrZXRJZCBdWyAwIF07Ci0JCVJldHJ5Q291bnQgPSAodTgpcFQwMi0+VDAyX01QRFVfQ250OwotCQlpZiAocFQwMi0+dmFsdWUgJiBGTEFHX0VSUk9SX1RYX01BU0spIHsKLQkJCVNlbmRPSyA9IEZBTFNFOwotCi0JCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X2Fib3J0IHx8IHBUMDItPlQwMl9vdXRfb2ZfTWF4VHhNU0RVTGlmdFRpbWUpIHsKLQkJCQkvL3JldHJ5IGVycm9yCi0JCQkJcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50ICs9IChSZXRyeUNvdW50KzEpOwotCQkJCS8vW2ZvciB0eCBkZWJ1Z10KLQkJCQlpZiAoUmV0cnlDb3VudDw3KQotCQkJCQlwSHdEYXRhLT50eF9yZXRyeV9jb3VudFtSZXRyeUNvdW50XSArPSBSZXRyeUNvdW50OwotCQkJCWVsc2UKLQkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbN10gKz0gUmV0cnlDb3VudDsKLQkJCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCQkJV0JERUJVRygoImR0b190eF9yZXRyeV9jb3VudCA9JWRcbiIsIHBId0RhdGEtPmR0b190eF9yZXRyeV9jb3VudCkpOwotCQkJCSNlbmRpZgotCQkJCU1UT19TZXRUeENvdW50KEFkYXB0ZXIsIFR4UmF0ZSwgUmV0cnlDb3VudCk7Ci0JCQl9Ci0JCQlwSHdEYXRhLT5kdG9fdHhfZnJhZ19jb3VudCArPSAoUmV0cnlDb3VudCsxKTsKLQotCQkJLy9bZm9yIHR4IGRlYnVnXQotCQkJaWYgKHBUMDItPlQwMl90cmFuc21pdF9hYm9ydF9kdWVfdG9fVEJUVCkKLQkJCQlwSHdEYXRhLT50eF9UQlRUX3N0YXJ0X2NvdW50Kys7Ci0JCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X3dpdGhvdXRfZW5jcnlwdGlvbl9kdWVfdG9fd2VwX29uX2ZhbHNlKQotCQkJCXBId0RhdGEtPnR4X1dlcE9uX2ZhbHNlX2NvdW50Kys7Ci0JCQlpZiAocFQwMi0+VDAyX2Rpc2NhcmRfZHVlX3RvX251bGxfd2VwX2tleSkKLQkJCQlwSHdEYXRhLT50eF9OdWxsX2tleV9jb3VudCsrOwotCQl9IGVsc2UgewotCQkJaWYgKHBUMDItPlQwMl9lZmZlY3RpdmVfdHJhbnNtaXNzaW9uX3JhdGUpCi0JCQkJcEh3RGF0YS0+dHhfRVRSX2NvdW50Kys7Ci0JCQlNVE9fU2V0VHhDb3VudChBZGFwdGVyLCBUeFJhdGUsIFJldHJ5Q291bnQpOwotCQl9Ci0KLQkJLy8gQ2xlYXIgc2VuZCByZXN1bHQgYnVmZmVyCi0JCXBNZHMtPlR4UmVzdWx0WyBQYWNrZXRJZCBdID0gMDsKLQl9IGVsc2UKLQkJcE1kcy0+VHhSZXN1bHRbIFBhY2tldElkIF0gfD0gKCh1MTYpKHBUMDItPnZhbHVlICYgMHgwZmZmZikpOwotfQotCi12b2lkCi1NZHNfSGVhZGVyQ29weShQQURBUFRFUiBBZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzLCB1OCAqVGFyZ2V0QnVmZmVyKQotewotCVBNRFMJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0JdTgJKnNyY19idWZmZXIgPSBwRGVzLT5idWZmZXJfYWRkcmVzc1swXTsvLzkzMTEzMC41LmcKLQlQVDAwX0RFU0NSSVBUT1IJcFQwMDsKLQlQVDAxX0RFU0NSSVBUT1IJcFQwMTsKLQl1MTYJc3RtcDsKLQl1OAlpLCBjdG1wMSwgY3RtcDIsIGN0bXBmOwotCXUxNglGcmFnbWVudFRocmVzaG9sZCA9IENVUlJFTlRfRlJBR01FTlRfVEhSRVNIT0xEOwotCi0KLQlzdG1wID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7Ci0JLy8KLQkvLyBTZXQgVVNCIGhlYWRlciA4IGJ5dGUKLQkvLwotCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKVRhcmdldEJ1ZmZlcjsKLQlUYXJnZXRCdWZmZXIgKz0gNDsKLQlwVDAxID0gKFBUMDFfREVTQ1JJUFRPUilUYXJnZXRCdWZmZXI7Ci0JVGFyZ2V0QnVmZmVyICs9IDQ7Ci0KLQlwVDAwLT52YWx1ZSA9IDA7Ly8gQ2xlYXIKLQlwVDAxLT52YWx1ZSA9IDA7Ly8gQ2xlYXIKLQotCXBUMDAtPlQwMF90eF9wYWNrZXRfaWQgPSBwRGVzLT5EZXNjcmlwdG9yX0lEOy8vIFNldCBwYWNrZXQgSUQKLQlwVDAwLT5UMDBfaGVhZGVyX2xlbmd0aCA9IDI0Oy8vIFNldCBoZWFkZXIgbGVuZ3RoCi0JcFQwMS0+VDAxX3JldHJ5X2Fib3J0X2ViYWJsZSA9IDE7Ly85MjEwMTMgOTMxMTMwLjUuaAotCi0JLy8gS2V5IElEIHNldHVwCi0JcFQwMS0+VDAxX3dlcF9pZCA9IDA7Ci0KLQlGcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOwkvL0RvIG5vdCBmcmFnbWVudAotCS8vIENvcHkgZnVsbCBkYXRhLCB0aGUgMSdzdCBidWZmZXIgY29udGFpbiBhbGwgdGhlIGRhdGEgOTMxMTMwLjUuagotCW1lbWNweSggVGFyZ2V0QnVmZmVyLCBzcmNfYnVmZmVyLCBET1RfMTFfTUFDX0hFQURFUl9TSVpFICk7Ly8gQ29weSBoZWFkZXIKLQlwRGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHNyY19idWZmZXIgKyBET1RfMTFfTUFDX0hFQURFUl9TSVpFOwotCXBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplIC09IERPVF8xMV9NQUNfSEVBREVSX1NJWkU7Ci0JcERlcy0+YnVmZmVyX3NpemVbMF0gPSBwRGVzLT5idWZmZXJfdG90YWxfc2l6ZTsKLQotCS8vIFNldCBmcmFnbWVudCB0aHJlc2hvbGQKLQlGcmFnbWVudFRocmVzaG9sZCAtPSAoRE9UXzExX01BQ19IRUFERVJfU0laRSArIDQpOwotCXBEZXMtPkZyYWdtZW50VGhyZXNob2xkID0gRnJhZ21lbnRUaHJlc2hvbGQ7Ci0KLQkvLyBTZXQgbW9yZSBmcmFnIGJpdAotCVRhcmdldEJ1ZmZlclsxXSB8PSAweDA0Oy8vIFNldCBtb3JlIGZyYWcgYml0Ci0KLQkvLwotCS8vIFNldCB0eCByYXRlCi0JLy8KLQlzdG1wID0gKih1MTYgKikoVGFyZ2V0QnVmZmVyKzMwKTsgLy8gMm4gYWxpZ25tZW50IGFkZHJlc3MKLQotCS8vVXNlIGJhc2ljIHJhdGUKLQljdG1wMSA9IGN0bXBmID0gQ1VSUkVOVF9UWF9SQVRFX0ZPUl9NTkc7Ci0KLQlwRGVzLT5UeFJhdGUgPSBjdG1wMTsKLQkjaWZkZWYgX1BFX1RYX0RVTVBfCi0JV0JERUJVRygoIlR4IHJhdGUgPSV4XG4iLCBjdG1wMSkpOwotCSNlbmRpZgotCi0JcFQwMS0+VDAxX21vZHVsYXRpb25fdHlwZSA9IChjdG1wMSUzKSA/IDAgOiAxOwotCi0JZm9yKCBpPTA7IGk8MjsgaSsrICkgewotCQlpZiggaSA9PSAxICkKLQkJCWN0bXAxID0gY3RtcGY7Ci0KLQkJcE1kcy0+VHhSYXRlW3BEZXMtPkRlc2NyaXB0b3JfSURdW2ldID0gY3RtcDE7IC8vIGJhY2t1cCB0aGUgdGEgcmF0ZSBhbmQgZmFsbCBiYWNrIHJhdGUKLQotCQlpZiggY3RtcDEgPT0gMTA4KSBjdG1wMiA9IDc7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDk2ICkgY3RtcDIgPSA2OyAvLyBSYXRlIGNvbnZlcnQgZm9yIFVTQgotCQllbHNlIGlmKCBjdG1wMSA9PSA3MiApIGN0bXAyID0gNTsKLQkJZWxzZSBpZiggY3RtcDEgPT0gNDggKSBjdG1wMiA9IDQ7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDM2ICkgY3RtcDIgPSAzOwotCQllbHNlIGlmKCBjdG1wMSA9PSAyNCApIGN0bXAyID0gMjsKLQkJZWxzZSBpZiggY3RtcDEgPT0gMTggKSBjdG1wMiA9IDE7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDEyICkgY3RtcDIgPSAwOwotCQllbHNlIGlmKCBjdG1wMSA9PSAyMiApIGN0bXAyID0gMzsKLQkJZWxzZSBpZiggY3RtcDEgPT0gMTEgKSBjdG1wMiA9IDI7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDQgICkgY3RtcDIgPSAxOwotCQllbHNlIGN0bXAyID0gMDsgLy8gaWYoIGN0bXAxID09IDIgICkgb3IgZGVmYXVsdAotCi0JCWlmKCBpID09IDAgKQotCQkJcFQwMS0+VDAxX3RyYW5zbWl0X3JhdGUgPSBjdG1wMjsKLQkJZWxzZQotCQkJcFQwMS0+VDAxX2ZhbGxfYmFja19yYXRlID0gY3RtcDI7Ci0JfQotCi0JLy8KLQkvLyBTZXQgcHJlYW1ibGUgdHlwZQotCS8vCi0JaWYgKChwVDAxLT5UMDFfbW9kdWxhdGlvbl90eXBlID09IDApICYmIChwVDAxLT5UMDFfdHJhbnNtaXRfcmF0ZSA9PSAwKSkJLy8gUkFURV8xTQotCQlwRGVzLT5QcmVhbWJsZU1vZGUgPSAgV0xBTl9QUkVBTUJMRV9UWVBFX0xPTkc7Ci0JZWxzZQotCQlwRGVzLT5QcmVhbWJsZU1vZGUgPSAgQ1VSUkVOVF9QUkVBTUJMRV9NT0RFOwotCXBUMDEtPlQwMV9wbGNwX2hlYWRlcl9sZW5ndGggPSBwRGVzLT5QcmVhbWJsZU1vZGU7CS8vIFNldCBwcmVhbWJsZQotCi19Ci0KLS8vIFRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIDRuIHNpemUgb2YgdXNiIHBrCi11MTYKLU1kc19Cb2R5Q29weShQQURBUFRFUiBBZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzLCB1OCAqVGFyZ2V0QnVmZmVyKQotewotCVBUMDBfREVTQ1JJUFRPUglwVDAwOwotCVBNRFMJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0JdTgJKmJ1ZmZlcjsKLQl1OAkqc3JjX2J1ZmZlcjsKLQl1OAkqcGN0bXA7Ci0JdTE2CVNpemUgPSAwOwotCXUxNglTaXplTGVmdCwgQ29weVNpemUsIENvcHlMZWZ0LCBzdG1wOwotCXU4CWJ1Zl9pbmRleCwgRnJhZ21lbnRDb3VudCA9IDA7Ci0KLQotCS8vIENvcHkgZnJhZ21lbnQgYm9keQotCWJ1ZmZlciA9IFRhcmdldEJ1ZmZlcjsgLy8gc2hpZnQgOEIgdXNiICsgMjRCIDgwMi4xMQotCVNpemVMZWZ0ID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7Ci0JYnVmX2luZGV4ID0gcERlcy0+YnVmZmVyX3N0YXJ0X2luZGV4OwotCi0JcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpYnVmZmVyOwotCXdoaWxlIChTaXplTGVmdCkgewotCQlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7Ci0JCUNvcHlTaXplID0gU2l6ZUxlZnQ7Ci0JCWlmIChTaXplTGVmdCA+IHBEZXMtPkZyYWdtZW50VGhyZXNob2xkKSB7Ci0JCQlDb3B5U2l6ZSA9IHBEZXMtPkZyYWdtZW50VGhyZXNob2xkOwotCQkJcFQwMC0+VDAwX2ZyYW1lX2xlbmd0aCA9IDI0ICsgQ29weVNpemU7Ly9TZXQgVVNCIGxlbmd0aAotCQl9IGVsc2UKLQkJCXBUMDAtPlQwMF9mcmFtZV9sZW5ndGggPSAyNCArIFNpemVMZWZ0Oy8vU2V0IFVTQiBsZW5ndGgKLQotCQlTaXplTGVmdCAtPSBDb3B5U2l6ZTsKLQotCQkvLyAxIEJ5dGUgb3BlcmF0aW9uCi0JCXBjdG1wID0gKHU4ICopKCBidWZmZXIgKyA4ICsgRE9UXzExX1NFUVVFTkNFX09GRlNFVCApOwotCQkqcGN0bXAgJj0gMHhmMDsKLQkJKnBjdG1wIHw9IEZyYWdtZW50Q291bnQ7Ly85MzExMzAuNS5tCi0JCWlmKCAhRnJhZ21lbnRDb3VudCApCi0JCQlwVDAwLT5UMDBfZmlyc3RfbXBkdSA9IDE7Ci0KLQkJYnVmZmVyICs9IDMyOyAvLyA4QiB1c2IgKyAyNEIgODAyLjExIGhlYWRlcgotCQlTaXplICs9IDMyOwotCi0JCS8vIENvcHkgaW50byBidWZmZXIKLQkJc3RtcCA9IENvcHlTaXplICsgMzsKLQkJc3RtcCAmPSB+MHgwMzsvLzRuIEFsaWdubWVudAotCQlTaXplICs9IHN0bXA7Ly8gQ3VycmVudCA0biBvZmZzZXQgb2YgbXBkdQotCi0JCXdoaWxlIChDb3B5U2l6ZSkgewotCQkJLy8gQ29weSBib2R5Ci0JCQlzcmNfYnVmZmVyID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XTsKLQkJCUNvcHlMZWZ0ID0gQ29weVNpemU7Ci0JCQlpZiAoQ29weVNpemUgPj0gcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XSkgewotCQkJCUNvcHlMZWZ0ID0gcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XTsKLQotCQkJCS8vIEdldCB0aGUgbmV4dCBidWZmZXIgb2YgZGVzY3JpcHRvcgotCQkJCWJ1Zl9pbmRleCsrOwotCQkJCWJ1Zl9pbmRleCAlPSBNQVhfREVTQ1JJUFRPUl9CVUZGRVJfSU5ERVg7Ci0JCQl9IGVsc2UgewotCQkJCXU4CSpwY3RtcCA9IHBEZXMtPmJ1ZmZlcl9hZGRyZXNzW2J1Zl9pbmRleF07Ci0JCQkJcGN0bXAgKz0gQ29weVNpemU7Ci0JCQkJcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XSA9IHBjdG1wOwotCQkJCXBEZXMtPmJ1ZmZlcl9zaXplW2J1Zl9pbmRleF0gLT0gQ29weVNpemU7Ci0JCQl9Ci0KLQkJCW1lbWNweShidWZmZXIsIHNyY19idWZmZXIsIENvcHlMZWZ0KTsKLQkJCWJ1ZmZlciArPSBDb3B5TGVmdDsKLQkJCUNvcHlTaXplIC09IENvcHlMZWZ0OwotCQl9Ci0KLQkJLy8gOTMxMTMwLjUubgotCQlpZiAocE1kcy0+TWljQWRkKSB7Ci0JCQlpZiAoIVNpemVMZWZ0KSB7Ci0JCQkJcE1kcy0+TWljV3JpdGVBZGRyZXNzWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBidWZmZXIgLSBwTWRzLT5NaWNBZGQ7Ci0JCQkJcE1kcy0+TWljV3JpdGVTaXplWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBwTWRzLT5NaWNBZGQ7Ci0JCQkJcE1kcy0+TWljQWRkID0gMDsKLQkJCX0KLQkJCWVsc2UgaWYoIFNpemVMZWZ0IDwgOCApIC8vOTMxMTMwLjUucAotCQkJewotCQkJCXBNZHMtPk1pY0FkZCA9IFNpemVMZWZ0OwotCQkJCXBNZHMtPk1pY1dyaXRlQWRkcmVzc1sgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gYnVmZmVyIC0gKCA4IC0gU2l6ZUxlZnQgKTsKLQkJCQlwTWRzLT5NaWNXcml0ZVNpemVbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IDggLSBTaXplTGVmdDsKLQkJCQlwTWRzLT5NaWNXcml0ZUluZGV4Kys7Ci0JCQl9Ci0JCX0KLQotCQkvLyBEb2VzIGl0IG5lZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBoZWFkZXIgZm9yIG5leHQgbXBkdT8KLQkJaWYgKFNpemVMZWZ0KSB7Ci0JCQlidWZmZXIgPSBUYXJnZXRCdWZmZXIgKyBTaXplOyAvLyBHZXQgdGhlIG5leHQgNG4gc3RhcnQgYWRkcmVzcwotCQkJbWVtY3B5KCBidWZmZXIsIFRhcmdldEJ1ZmZlciwgMzIgKTsvL0NvcHkgOEIgVVNCICsyNEIgODAyLjExCi0JCQlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7Ci0JCQlwVDAwLT5UMDBfZmlyc3RfbXBkdSA9IDA7Ci0JCX0KLQotCQlGcmFnbWVudENvdW50Kys7Ci0JfQotCi0JcFQwMC0+VDAwX2xhc3RfbXBkdSA9IDE7Ci0JcFQwMC0+VDAwX0lzTGFzdE1wZHUgPSAxOwotCWJ1ZmZlciA9ICh1OCAqKXBUMDAgKyA4OyAvLyArOCBmb3IgVVNCIGhkcgotCWJ1ZmZlclsxXSAmPSB+MHgwNDsgLy8gQ2xlYXIgbW9yZSBmcmFnIGJpdCBvZiA4MDIuMTEgZnJhbWUgY29udHJvbAotCXBEZXMtPkZyYWdtZW50Q291bnQgPSBGcmFnbWVudENvdW50OyAvLyBVcGRhdGUgdGhlIGNvcnJlY3QgZnJhZ21lbnQgbnVtYmVyCi0JcmV0dXJuIFNpemU7Ci19Ci0KLQotdm9pZAotTWRzX0R1cmF0aW9uU2V0KCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMsICB1OCAqYnVmZmVyICkKK3N0YXRpYyB2b2lkIE1kc19EdXJhdGlvblNldChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzLCAgdTggKmJ1ZmZlcikKIHsKIAlQVDAwX0RFU0NSSVBUT1IJcFQwMDsKIAlQVDAxX0RFU0NSSVBUT1IJcFQwMTsKIAl1MTYJRHVyYXRpb24sIE5leHRCb2R5TGVuLCBPZmZzZXRTaXplOwogCXU4CVJhdGUsIGk7Ci0JdW5zaWduZWQgY2hhcglDVFNfb24gPSBGQUxTRSwgUlRTX29uID0gRkFMU0U7CisJdW5zaWduZWQgY2hhcglDVFNfb24gPSBmYWxzZSwgUlRTX29uID0gZmFsc2U7CiAJUFQwMF9ERVNDUklQVE9SIHBOZXh0VDAwOwogCXUxNiBCb2R5TGVuID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJvR3JvdXBBZGRyID0gRkFMU0U7Ci0KKwl1bnNpZ25lZCBjaGFyIGJvR3JvdXBBZGRyID0gZmFsc2U7CiAKIAlPZmZzZXRTaXplID0gcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQgKyAzMiArIDM7CiAJT2Zmc2V0U2l6ZSAmPSB+MHgwMzsKQEAgLTQ1Miw3ICs0Niw3IEBACiAJcE5leHRUMDAgPSAoUFQwMF9ERVNDUklQVE9SKShidWZmZXIrT2Zmc2V0U2l6ZSk7CiAKIAlpZiggYnVmZmVyWyBET1RfMTFfREFfT0ZGU0VUKzggXSAmIDB4MSApIC8vICs4IGZvciBVU0IgaGRyCi0JCWJvR3JvdXBBZGRyID0gVFJVRTsKKwkJYm9Hcm91cEFkZHIgPSB0cnVlOwogCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJLy8gU2V0IFJUUy9DVFMgbWVjaGFuaXNtCkBAIC00NjcsMTMgKzYxLDEzIEBACiAJCUJvZHlMZW4gKz0gNDsJLy9DUkMKIAogCQlpZiggQm9keUxlbiA+PSBDVVJSRU5UX1JUU19USFJFU0hPTEQgKQotCQkJUlRTX29uID0gVFJVRTsgLy8gVXNpbmcgUlRTCisJCQlSVFNfb24gPSB0cnVlOyAvLyBVc2luZyBSVFMKIAkJZWxzZQogCQl7CiAJCQlpZiggcFQwMS0+VDAxX21vZHVsYXRpb25fdHlwZSApIC8vIElzIHVzaW5nIE9GRE0KIAkJCXsKIAkJCQlpZiggQ1VSUkVOVF9QUk9URUNUX01FQ0hBTklTTSApIC8vIElzIHVzaW5nIHByb3RlY3QKLQkJCQkJQ1RTX29uID0gVFJVRTsgLy8gVXNpbmcgQ1RTCisJCQkJCUNUU19vbiA9IHRydWU7IC8vIFVzaW5nIENUUwogCQkJfQogCQl9CiAJfQpAQCAtNjI0LDkgKzIxOCwzOTQgQEAKIAogfQogCi12b2lkIE1EU19FdGhlcm5ldFBhY2tldFJlY2VpdmUoICBQQURBUFRFUiBBZGFwdGVyLCAgUFJYTEFZRVIxIHBSeExheWVyMSApCisvLyBUaGUgZnVuY3Rpb24gcmV0dXJuIHRoZSA0biBzaXplIG9mIHVzYiBwaworc3RhdGljIHUxNiBNZHNfQm9keUNvcHkoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzLCB1OCAqVGFyZ2V0QnVmZmVyKQogewotCQlPU19SRUNFSVZFX1BBQ0tFVF9JTkRJQ0FURSggQWRhcHRlciwgcFJ4TGF5ZXIxICk7CisJUFQwMF9ERVNDUklQVE9SCXBUMDA7CisJUE1EUwlwTWRzID0gJmFkYXB0ZXItPk1kczsKKwl1OAkqYnVmZmVyOworCXU4CSpzcmNfYnVmZmVyOworCXU4CSpwY3RtcDsKKwl1MTYJU2l6ZSA9IDA7CisJdTE2CVNpemVMZWZ0LCBDb3B5U2l6ZSwgQ29weUxlZnQsIHN0bXA7CisJdTgJYnVmX2luZGV4LCBGcmFnbWVudENvdW50ID0gMDsKKworCisJLy8gQ29weSBmcmFnbWVudCBib2R5CisJYnVmZmVyID0gVGFyZ2V0QnVmZmVyOyAvLyBzaGlmdCA4QiB1c2IgKyAyNEIgODAyLjExCisJU2l6ZUxlZnQgPSBwRGVzLT5idWZmZXJfdG90YWxfc2l6ZTsKKwlidWZfaW5kZXggPSBwRGVzLT5idWZmZXJfc3RhcnRfaW5kZXg7CisKKwlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7CisJd2hpbGUgKFNpemVMZWZ0KSB7CisJCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKWJ1ZmZlcjsKKwkJQ29weVNpemUgPSBTaXplTGVmdDsKKwkJaWYgKFNpemVMZWZ0ID4gcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQpIHsKKwkJCUNvcHlTaXplID0gcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQ7CisJCQlwVDAwLT5UMDBfZnJhbWVfbGVuZ3RoID0gMjQgKyBDb3B5U2l6ZTsvL1NldCBVU0IgbGVuZ3RoCisJCX0gZWxzZQorCQkJcFQwMC0+VDAwX2ZyYW1lX2xlbmd0aCA9IDI0ICsgU2l6ZUxlZnQ7Ly9TZXQgVVNCIGxlbmd0aAorCisJCVNpemVMZWZ0IC09IENvcHlTaXplOworCisJCS8vIDEgQnl0ZSBvcGVyYXRpb24KKwkJcGN0bXAgPSAodTggKikoIGJ1ZmZlciArIDggKyBET1RfMTFfU0VRVUVOQ0VfT0ZGU0VUICk7CisJCSpwY3RtcCAmPSAweGYwOworCQkqcGN0bXAgfD0gRnJhZ21lbnRDb3VudDsvLzkzMTEzMC41Lm0KKwkJaWYoICFGcmFnbWVudENvdW50ICkKKwkJCXBUMDAtPlQwMF9maXJzdF9tcGR1ID0gMTsKKworCQlidWZmZXIgKz0gMzI7IC8vIDhCIHVzYiArIDI0QiA4MDIuMTEgaGVhZGVyCisJCVNpemUgKz0gMzI7CisKKwkJLy8gQ29weSBpbnRvIGJ1ZmZlcgorCQlzdG1wID0gQ29weVNpemUgKyAzOworCQlzdG1wICY9IH4weDAzOy8vNG4gQWxpZ25tZW50CisJCVNpemUgKz0gc3RtcDsvLyBDdXJyZW50IDRuIG9mZnNldCBvZiBtcGR1CisKKwkJd2hpbGUgKENvcHlTaXplKSB7CisJCQkvLyBDb3B5IGJvZHkKKwkJCXNyY19idWZmZXIgPSBwRGVzLT5idWZmZXJfYWRkcmVzc1tidWZfaW5kZXhdOworCQkJQ29weUxlZnQgPSBDb3B5U2l6ZTsKKwkJCWlmIChDb3B5U2l6ZSA+PSBwRGVzLT5idWZmZXJfc2l6ZVtidWZfaW5kZXhdKSB7CisJCQkJQ29weUxlZnQgPSBwRGVzLT5idWZmZXJfc2l6ZVtidWZfaW5kZXhdOworCisJCQkJLy8gR2V0IHRoZSBuZXh0IGJ1ZmZlciBvZiBkZXNjcmlwdG9yCisJCQkJYnVmX2luZGV4Kys7CisJCQkJYnVmX2luZGV4ICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsKKwkJCX0gZWxzZSB7CisJCQkJdTgJKnBjdG1wID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XTsKKwkJCQlwY3RtcCArPSBDb3B5U2l6ZTsKKwkJCQlwRGVzLT5idWZmZXJfYWRkcmVzc1tidWZfaW5kZXhdID0gcGN0bXA7CisJCQkJcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XSAtPSBDb3B5U2l6ZTsKKwkJCX0KKworCQkJbWVtY3B5KGJ1ZmZlciwgc3JjX2J1ZmZlciwgQ29weUxlZnQpOworCQkJYnVmZmVyICs9IENvcHlMZWZ0OworCQkJQ29weVNpemUgLT0gQ29weUxlZnQ7CisJCX0KKworCQkvLyA5MzExMzAuNS5uCisJCWlmIChwTWRzLT5NaWNBZGQpIHsKKwkJCWlmICghU2l6ZUxlZnQpIHsKKwkJCQlwTWRzLT5NaWNXcml0ZUFkZHJlc3NbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IGJ1ZmZlciAtIHBNZHMtPk1pY0FkZDsKKwkJCQlwTWRzLT5NaWNXcml0ZVNpemVbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IHBNZHMtPk1pY0FkZDsKKwkJCQlwTWRzLT5NaWNBZGQgPSAwOworCQkJfQorCQkJZWxzZSBpZiggU2l6ZUxlZnQgPCA4ICkgLy85MzExMzAuNS5wCisJCQl7CisJCQkJcE1kcy0+TWljQWRkID0gU2l6ZUxlZnQ7CisJCQkJcE1kcy0+TWljV3JpdGVBZGRyZXNzWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBidWZmZXIgLSAoIDggLSBTaXplTGVmdCApOworCQkJCXBNZHMtPk1pY1dyaXRlU2l6ZVsgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gOCAtIFNpemVMZWZ0OworCQkJCXBNZHMtPk1pY1dyaXRlSW5kZXgrKzsKKwkJCX0KKwkJfQorCisJCS8vIERvZXMgaXQgbmVlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IGhlYWRlciBmb3IgbmV4dCBtcGR1PworCQlpZiAoU2l6ZUxlZnQpIHsKKwkJCWJ1ZmZlciA9IFRhcmdldEJ1ZmZlciArIFNpemU7IC8vIEdldCB0aGUgbmV4dCA0biBzdGFydCBhZGRyZXNzCisJCQltZW1jcHkoIGJ1ZmZlciwgVGFyZ2V0QnVmZmVyLCAzMiApOy8vQ29weSA4QiBVU0IgKzI0QiA4MDIuMTEKKwkJCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKWJ1ZmZlcjsKKwkJCXBUMDAtPlQwMF9maXJzdF9tcGR1ID0gMDsKKwkJfQorCisJCUZyYWdtZW50Q291bnQrKzsKKwl9CisKKwlwVDAwLT5UMDBfbGFzdF9tcGR1ID0gMTsKKwlwVDAwLT5UMDBfSXNMYXN0TXBkdSA9IDE7CisJYnVmZmVyID0gKHU4ICopcFQwMCArIDg7IC8vICs4IGZvciBVU0IgaGRyCisJYnVmZmVyWzFdICY9IH4weDA0OyAvLyBDbGVhciBtb3JlIGZyYWcgYml0IG9mIDgwMi4xMSBmcmFtZSBjb250cm9sCisJcERlcy0+RnJhZ21lbnRDb3VudCA9IEZyYWdtZW50Q291bnQ7IC8vIFVwZGF0ZSB0aGUgY29ycmVjdCBmcmFnbWVudCBudW1iZXIKKwlyZXR1cm4gU2l6ZTsKIH0KIAorc3RhdGljIHZvaWQgTWRzX0hlYWRlckNvcHkoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgUERFU0NSSVBUT1IgcERlcywgdTggKlRhcmdldEJ1ZmZlcikKK3sKKwlQTURTCXBNZHMgPSAmYWRhcHRlci0+TWRzOworCXU4CSpzcmNfYnVmZmVyID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbMF07Ly85MzExMzAuNS5nCisJUFQwMF9ERVNDUklQVE9SCXBUMDA7CisJUFQwMV9ERVNDUklQVE9SCXBUMDE7CisJdTE2CXN0bXA7CisJdTgJaSwgY3RtcDEsIGN0bXAyLCBjdG1wZjsKKwl1MTYJRnJhZ21lbnRUaHJlc2hvbGQgPSBDVVJSRU5UX0ZSQUdNRU5UX1RIUkVTSE9MRDsKIAorCisJc3RtcCA9IHBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplOworCS8vCisJLy8gU2V0IFVTQiBoZWFkZXIgOCBieXRlCisJLy8KKwlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilUYXJnZXRCdWZmZXI7CisJVGFyZ2V0QnVmZmVyICs9IDQ7CisJcFQwMSA9IChQVDAxX0RFU0NSSVBUT1IpVGFyZ2V0QnVmZmVyOworCVRhcmdldEJ1ZmZlciArPSA0OworCisJcFQwMC0+dmFsdWUgPSAwOy8vIENsZWFyCisJcFQwMS0+dmFsdWUgPSAwOy8vIENsZWFyCisKKwlwVDAwLT5UMDBfdHhfcGFja2V0X2lkID0gcERlcy0+RGVzY3JpcHRvcl9JRDsvLyBTZXQgcGFja2V0IElECisJcFQwMC0+VDAwX2hlYWRlcl9sZW5ndGggPSAyNDsvLyBTZXQgaGVhZGVyIGxlbmd0aAorCXBUMDEtPlQwMV9yZXRyeV9hYm9ydF9lYmFibGUgPSAxOy8vOTIxMDEzIDkzMTEzMC41LmgKKworCS8vIEtleSBJRCBzZXR1cAorCXBUMDEtPlQwMV93ZXBfaWQgPSAwOworCisJRnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsJLy9EbyBub3QgZnJhZ21lbnQKKwkvLyBDb3B5IGZ1bGwgZGF0YSwgdGhlIDEnc3QgYnVmZmVyIGNvbnRhaW4gYWxsIHRoZSBkYXRhIDkzMTEzMC41LmoKKwltZW1jcHkoIFRhcmdldEJ1ZmZlciwgc3JjX2J1ZmZlciwgRE9UXzExX01BQ19IRUFERVJfU0laRSApOy8vIENvcHkgaGVhZGVyCisJcERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBzcmNfYnVmZmVyICsgRE9UXzExX01BQ19IRUFERVJfU0laRTsKKwlwRGVzLT5idWZmZXJfdG90YWxfc2l6ZSAtPSBET1RfMTFfTUFDX0hFQURFUl9TSVpFOworCXBEZXMtPmJ1ZmZlcl9zaXplWzBdID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7CisKKwkvLyBTZXQgZnJhZ21lbnQgdGhyZXNob2xkCisJRnJhZ21lbnRUaHJlc2hvbGQgLT0gKERPVF8xMV9NQUNfSEVBREVSX1NJWkUgKyA0KTsKKwlwRGVzLT5GcmFnbWVudFRocmVzaG9sZCA9IEZyYWdtZW50VGhyZXNob2xkOworCisJLy8gU2V0IG1vcmUgZnJhZyBiaXQKKwlUYXJnZXRCdWZmZXJbMV0gfD0gMHgwNDsvLyBTZXQgbW9yZSBmcmFnIGJpdAorCisJLy8KKwkvLyBTZXQgdHggcmF0ZQorCS8vCisJc3RtcCA9ICoodTE2ICopKFRhcmdldEJ1ZmZlciszMCk7IC8vIDJuIGFsaWdubWVudCBhZGRyZXNzCisKKwkvL1VzZSBiYXNpYyByYXRlCisJY3RtcDEgPSBjdG1wZiA9IENVUlJFTlRfVFhfUkFURV9GT1JfTU5HOworCisJcERlcy0+VHhSYXRlID0gY3RtcDE7CisJI2lmZGVmIF9QRV9UWF9EVU1QXworCVdCREVCVUcoKCJUeCByYXRlID0leFxuIiwgY3RtcDEpKTsKKwkjZW5kaWYKKworCXBUMDEtPlQwMV9tb2R1bGF0aW9uX3R5cGUgPSAoY3RtcDElMykgPyAwIDogMTsKKworCWZvciggaT0wOyBpPDI7IGkrKyApIHsKKwkJaWYoIGkgPT0gMSApCisJCQljdG1wMSA9IGN0bXBmOworCisJCXBNZHMtPlR4UmF0ZVtwRGVzLT5EZXNjcmlwdG9yX0lEXVtpXSA9IGN0bXAxOyAvLyBiYWNrdXAgdGhlIHRhIHJhdGUgYW5kIGZhbGwgYmFjayByYXRlCisKKwkJaWYoIGN0bXAxID09IDEwOCkgY3RtcDIgPSA3OworCQllbHNlIGlmKCBjdG1wMSA9PSA5NiApIGN0bXAyID0gNjsgLy8gUmF0ZSBjb252ZXJ0IGZvciBVU0IKKwkJZWxzZSBpZiggY3RtcDEgPT0gNzIgKSBjdG1wMiA9IDU7CisJCWVsc2UgaWYoIGN0bXAxID09IDQ4ICkgY3RtcDIgPSA0OworCQllbHNlIGlmKCBjdG1wMSA9PSAzNiApIGN0bXAyID0gMzsKKwkJZWxzZSBpZiggY3RtcDEgPT0gMjQgKSBjdG1wMiA9IDI7CisJCWVsc2UgaWYoIGN0bXAxID09IDE4ICkgY3RtcDIgPSAxOworCQllbHNlIGlmKCBjdG1wMSA9PSAxMiApIGN0bXAyID0gMDsKKwkJZWxzZSBpZiggY3RtcDEgPT0gMjIgKSBjdG1wMiA9IDM7CisJCWVsc2UgaWYoIGN0bXAxID09IDExICkgY3RtcDIgPSAyOworCQllbHNlIGlmKCBjdG1wMSA9PSA0ICApIGN0bXAyID0gMTsKKwkJZWxzZSBjdG1wMiA9IDA7IC8vIGlmKCBjdG1wMSA9PSAyICApIG9yIGRlZmF1bHQKKworCQlpZiggaSA9PSAwICkKKwkJCXBUMDEtPlQwMV90cmFuc21pdF9yYXRlID0gY3RtcDI7CisJCWVsc2UKKwkJCXBUMDEtPlQwMV9mYWxsX2JhY2tfcmF0ZSA9IGN0bXAyOworCX0KKworCS8vCisJLy8gU2V0IHByZWFtYmxlIHR5cGUKKwkvLworCWlmICgocFQwMS0+VDAxX21vZHVsYXRpb25fdHlwZSA9PSAwKSAmJiAocFQwMS0+VDAxX3RyYW5zbWl0X3JhdGUgPT0gMCkpCS8vIFJBVEVfMU0KKwkJcERlcy0+UHJlYW1ibGVNb2RlID0gIFdMQU5fUFJFQU1CTEVfVFlQRV9MT05HOworCWVsc2UKKwkJcERlcy0+UHJlYW1ibGVNb2RlID0gIENVUlJFTlRfUFJFQU1CTEVfTU9ERTsKKwlwVDAxLT5UMDFfcGxjcF9oZWFkZXJfbGVuZ3RoID0gcERlcy0+UHJlYW1ibGVNb2RlOwkvLyBTZXQgcHJlYW1ibGUKKworfQorCit2b2lkCitNZHNfVHgoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcikKK3sKKwlwaHdfZGF0YV90CXBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlQTURTCQlwTWRzID0gJmFkYXB0ZXItPk1kczsKKwlERVNDUklQVE9SCVR4RGVzOworCVBERVNDUklQVE9SCXBUeERlcyA9ICZUeERlczsKKwl1OAkJKlhtaXRCdWZBZGRyZXNzOworCXUxNgkJWG1pdEJ1ZlNpemUsIFBhY2tldFNpemUsIHN0bXAsIEN1cnJlbnRTaXplLCBGcmFnbWVudFRocmVzaG9sZDsKKwl1OAkJRmlsbEluZGV4LCBUeERlc0luZGV4LCBGcmFnbWVudENvdW50LCBGaWxsQ291bnQ7CisJdW5zaWduZWQgY2hhcglCdWZmZXJGaWxsZWQgPSBmYWxzZSwgTUlDQWRkID0gMDsKKworCisJaWYgKHBNZHMtPlR4UGF1c2UpCisJCXJldHVybjsKKwlpZiAoIWhhbF9kcml2ZXJfaW5pdF9PSyhwSHdEYXRhKSkKKwkJcmV0dXJuOworCisJLy9Pbmx5IG9uZSB0aHJlYWQgY2FuIGJlIHJ1biBoZXJlCisJaWYgKCFhdG9taWNfaW5jX3JldHVybigmcE1kcy0+VHhUaHJlYWRDb3VudCkgPT0gMSkKKwkJZ290byBjbGVhbnVwOworCisJLy8gU3RhcnQgdG8gZmlsbCB0aGUgZGF0YQorCWRvIHsKKwkJRmlsbEluZGV4ID0gcE1kcy0+VHhGaWxsSW5kZXg7CisJCWlmIChwTWRzLT5UeE93bmVyW0ZpbGxJbmRleF0pIHsgLy8gSXMgb3duZWQgYnkgc29mdHdhcmUgMDpZZXMgMTpObworI2lmZGVmIF9QRV9UWF9EVU1QXworCQkJV0JERUJVRygoIltNZHNfVHhdIFR4IE93bmVyIGlzIEgvVy5cbiIpKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQlYbWl0QnVmQWRkcmVzcyA9IHBNZHMtPnBUeEJ1ZmZlciArIChNQVhfVVNCX1RYX0JVRkZFUiAqIEZpbGxJbmRleCk7IC8vR2V0IGJ1ZmZlcgorCQlYbWl0QnVmU2l6ZSA9IDA7CisJCUZpbGxDb3VudCA9IDA7CisJCWRvIHsKKwkJCVBhY2tldFNpemUgPSBhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbjsKKwkJCWlmICghUGFja2V0U2l6ZSkKKwkJCQlicmVhazsKKworCQkJLy9Gb3IgQ2hlY2sgdGhlIGJ1ZmZlciByZXNvdXJjZQorCQkJRnJhZ21lbnRUaHJlc2hvbGQgPSBDVVJSRU5UX0ZSQUdNRU5UX1RIUkVTSE9MRDsKKwkJCS8vOTMxMTMwLjUuYgorCQkJRnJhZ21lbnRDb3VudCA9IFBhY2tldFNpemUvRnJhZ21lbnRUaHJlc2hvbGQgKyAxOworCQkJc3RtcCA9IFBhY2tldFNpemUgKyBGcmFnbWVudENvdW50KjMyICsgODsvLzkzMTEzMC41LmMgODpNSUMKKwkJCWlmICgoWG1pdEJ1ZlNpemUgKyBzdG1wKSA+PSBNQVhfVVNCX1RYX0JVRkZFUikgeworCQkJCXByaW50aygiW01kc19UeF0gRXhjZXNzIG1heCB0eCBidWZmZXIuXG4iKTsKKwkJCQlicmVhazsgLy8gYnVmZmVyIGlzIG5vdCBlbm91Z2gKKwkJCX0KKworCisJCQkvLworCQkJLy8gU3RhcnQgdHJhbnNtaXR0aW5nCisJCQkvLworCQkJQnVmZmVyRmlsbGVkID0gdHJ1ZTsKKworCQkJLyogTGVhdmVzIGZpcnN0IHU4IGludGFjdCAqLworCQkJbWVtc2V0KCh1OCAqKXBUeERlcyArIDEsIDAsIHNpemVvZihERVNDUklQVE9SKSAtIDEpOworCisJCQlUeERlc0luZGV4ID0gcE1kcy0+VHhEZXNJbmRleDsvL0dldCB0aGUgY3VycmVudCBJRAorCQkJcFR4RGVzLT5EZXNjcmlwdG9yX0lEID0gVHhEZXNJbmRleDsKKwkJCXBNZHMtPlR4RGVzRnJvbVsgVHhEZXNJbmRleCBdID0gMjsvL1N0b3JpbmcgdGhlIGluZm9ybWF0aW9uIG9mIHNvdXJjZSBjb21taW5nIGZyb20KKwkJCXBNZHMtPlR4RGVzSW5kZXgrKzsKKwkJCXBNZHMtPlR4RGVzSW5kZXggJT0gTUFYX1VTQl9UWF9ERVNDUklQVE9SOworCisJCQlNTE1FX0dldE5leHRQYWNrZXQoIGFkYXB0ZXIsIHBUeERlcyApOworCisJCQkvLyBDb3B5IGhlYWRlci4gOGJ5dGUgVVNCICsgMjRieXRlIDgwMi4xMUhkci4gU2V0IFR4UmF0ZSwgUHJlYW1ibGUgdHlwZQorCQkJTWRzX0hlYWRlckNvcHkoIGFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MgKTsKKworCQkJLy8gRm9yIHNwZWVkIHVwIEtleSBzZXR0aW5nCisJCQlpZiAocFR4RGVzLT5FYXBGaXgpIHsKKyNpZmRlZiBfUEVfVFhfRFVNUF8KKwkJCQlXQkRFQlVHKCgiMzU6IEVQQSA0dGggZnJhbWUgZGV0ZWN0ZWQuIFNpemUgPSAlZFxuIiwgUGFja2V0U2l6ZSkpOworI2VuZGlmCisJCQkJcEh3RGF0YS0+SXNLZXlQcmVTZXQgPSAxOworCQkJfQorCisJCQkvLyBDb3B5IChmcmFnbWVudCkgZnJhbWUgYm9keSwgYW5kIHNldCBVU0IsIDgwMi4xMSBoZHIgZmxhZworCQkJQ3VycmVudFNpemUgPSBNZHNfQm9keUNvcHkoYWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyk7CisKKwkJCS8vIFNldCBSVFMvQ1RTIGFuZCBOb3JtYWwgZHVyYXRpb24gZmllbGQgaW50byBidWZmZXIKKwkJCU1kc19EdXJhdGlvblNldChhZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzKTsKKworCQkJLy8KKwkJCS8vIENhbGN1bGF0aW9uIE1JQyBmcm9tIGJ1ZmZlciB3aGljaCBtYXliZSBmcmFnbWVudCwgdGhlbiBmaWxsIGludG8gdGVtcG9yYXJ5IGFkZHJlc3MgOCBieXRlCisJCQkvLyA5MzExMzAuNS5lCisJCQlpZiAoTUlDQWRkKQorCQkJCU1kc19NaWNGaWxsKCBhZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzICk7CisKKwkJCS8vU2hpZnQgdG8gdGhlIG5leHQgYWRkcmVzcworCQkJWG1pdEJ1ZlNpemUgKz0gQ3VycmVudFNpemU7CisJCQlYbWl0QnVmQWRkcmVzcyArPSBDdXJyZW50U2l6ZTsKKworI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCisJCQlpZiAoKFhtaXRCdWZBZGRyZXNzWyBET1RfMTFfREFfT0ZGU0VUKzggXSAmIDB4ZmMpICE9IE1BQ19TVUJUWVBFX01OR01OVF9QUk9CRV9SRVFVRVNUKSAvLyArOCBmb3IgVVNCIGhkcgorI2VuZGlmCisJCQkJcE1kcy0+VHhUb2dnbGUgPSB0cnVlOworCisJCQkvLyBHZXQgcGFja2V0IHRvIHRyYW5zbWl0IGNvbXBsZXRlZCwgMTpURVNUU1RBIDI6TUxNRSAzOiBOZGlzIGRhdGEKKwkJCU1MTUVfU2VuZENvbXBsZXRlKGFkYXB0ZXIsIDAsIHRydWUpOworCisJCQkvLyBTb2Z0d2FyZSBUU0MgY291bnQgMjAwNjAyMTQKKwkJCXBNZHMtPlR4VHNjKys7CisJCQlpZiAocE1kcy0+VHhUc2MgPT0gMCkKKwkJCQlwTWRzLT5UeFRzY18yKys7CisKKwkJCUZpbGxDb3VudCsrOyAvLyAyMDA2MDkyOAorCQl9IHdoaWxlIChIQUxfVVNCX01PREVfQlVSU1QocEh3RGF0YSkpOyAvLyBFbmQgb2YgbXVsdGlwbGUgTVNEVSBjb3B5IGxvb3AuIGZhbHNlID0gc2luZ2xlIHRydWUgPSBtdWx0aXBsZSBzZW5kaW5nCisKKwkJLy8gTW92ZSB0byB0aGUgbmV4dCBvbmUsIGlmIG5lY2Vzc2FyeQorCQlpZiAoQnVmZmVyRmlsbGVkKSB7CisJCQkvLyBzaXplIHNldHRpbmcKKwkJCXBNZHMtPlR4QnVmZmVyU2l6ZVsgRmlsbEluZGV4IF0gPSBYbWl0QnVmU2l6ZTsKKworCQkJLy8gMjAwNjA5Mjggc2V0IFR4IGNvdW50CisJCQlwTWRzLT5UeENvdW50SW5CdWZmZXJbRmlsbEluZGV4XSA9IEZpbGxDb3VudDsKKworCQkJLy8gU2V0IG93bmVyIGZsYWcKKwkJCXBNZHMtPlR4T3duZXJbRmlsbEluZGV4XSA9IDE7CisKKwkJCXBNZHMtPlR4RmlsbEluZGV4Kys7CisJCQlwTWRzLT5UeEZpbGxJbmRleCAlPSBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVI7CisJCQlCdWZmZXJGaWxsZWQgPSBmYWxzZTsKKwkJfSBlbHNlCisJCQlicmVhazsKKworCQlpZiAoIVBhY2tldFNpemUpIC8vIE5vIG1vcmUgcGsgZm9yIHRyYW5zbWl0dGluZworCQkJYnJlYWs7CisKKwl9IHdoaWxlKHRydWUpOworCisJLy8KKwkvLyBTdGFydCB0byBzZW5kIGJ5IGxvd2VyIG1vZHVsZQorCS8vCisJaWYgKCFwSHdEYXRhLT5Jc0tleVByZVNldCkKKwkJV2IzNVR4X3N0YXJ0KGFkYXB0ZXIpOworCisgY2xlYW51cDoKKwlhdG9taWNfZGVjKCZwTWRzLT5UeFRocmVhZENvdW50KTsKK30KKwordm9pZAorTWRzX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQVDAyX0RFU0NSSVBUT1IgcFQwMikKK3sKKwlQTURTCXBNZHMgPSAmYWRhcHRlci0+TWRzOworCXBod19kYXRhX3QJcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCXU4CVBhY2tldElkID0gKHU4KXBUMDItPlQwMl9UeF9Qa3RJRDsKKwl1bnNpZ25lZCBjaGFyCVNlbmRPSyA9IHRydWU7CisJdTgJUmV0cnlDb3VudCwgVHhSYXRlOworCisJaWYgKHBUMDItPlQwMl9JZ25vcmVSZXN1bHQpIC8vIERvbid0IGNhcmUgdGhlIHJlc3VsdAorCQlyZXR1cm47CisJaWYgKHBUMDItPlQwMl9Jc0xhc3RNcGR1KSB7CisJCS8vVE9ETzogRFRPIC0tIGdldCB0aGUgcmV0cnkgY291bnQgYW5kIGZyYWdtZW50IGNvdW50CisJCS8vIFR4IHJhdGUKKwkJVHhSYXRlID0gcE1kcy0+VHhSYXRlWyBQYWNrZXRJZCBdWyAwIF07CisJCVJldHJ5Q291bnQgPSAodTgpcFQwMi0+VDAyX01QRFVfQ250OworCQlpZiAocFQwMi0+dmFsdWUgJiBGTEFHX0VSUk9SX1RYX01BU0spIHsKKwkJCVNlbmRPSyA9IGZhbHNlOworCisJCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X2Fib3J0IHx8IHBUMDItPlQwMl9vdXRfb2ZfTWF4VHhNU0RVTGlmdFRpbWUpIHsKKwkJCQkvL3JldHJ5IGVycm9yCisJCQkJcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50ICs9IChSZXRyeUNvdW50KzEpOworCQkJCS8vW2ZvciB0eCBkZWJ1Z10KKwkJCQlpZiAoUmV0cnlDb3VudDw3KQorCQkJCQlwSHdEYXRhLT50eF9yZXRyeV9jb3VudFtSZXRyeUNvdW50XSArPSBSZXRyeUNvdW50OworCQkJCWVsc2UKKwkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbN10gKz0gUmV0cnlDb3VudDsKKwkJCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCisJCQkJV0JERUJVRygoImR0b190eF9yZXRyeV9jb3VudCA9JWRcbiIsIHBId0RhdGEtPmR0b190eF9yZXRyeV9jb3VudCkpOworCQkJCSNlbmRpZgorCQkJCU1UT19TZXRUeENvdW50KGFkYXB0ZXIsIFR4UmF0ZSwgUmV0cnlDb3VudCk7CisJCQl9CisJCQlwSHdEYXRhLT5kdG9fdHhfZnJhZ19jb3VudCArPSAoUmV0cnlDb3VudCsxKTsKKworCQkJLy9bZm9yIHR4IGRlYnVnXQorCQkJaWYgKHBUMDItPlQwMl90cmFuc21pdF9hYm9ydF9kdWVfdG9fVEJUVCkKKwkJCQlwSHdEYXRhLT50eF9UQlRUX3N0YXJ0X2NvdW50Kys7CisJCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X3dpdGhvdXRfZW5jcnlwdGlvbl9kdWVfdG9fd2VwX29uX2ZhbHNlKQorCQkJCXBId0RhdGEtPnR4X1dlcE9uX2ZhbHNlX2NvdW50Kys7CisJCQlpZiAocFQwMi0+VDAyX2Rpc2NhcmRfZHVlX3RvX251bGxfd2VwX2tleSkKKwkJCQlwSHdEYXRhLT50eF9OdWxsX2tleV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJaWYgKHBUMDItPlQwMl9lZmZlY3RpdmVfdHJhbnNtaXNzaW9uX3JhdGUpCisJCQkJcEh3RGF0YS0+dHhfRVRSX2NvdW50Kys7CisJCQlNVE9fU2V0VHhDb3VudChhZGFwdGVyLCBUeFJhdGUsIFJldHJ5Q291bnQpOworCQl9CisKKwkJLy8gQ2xlYXIgc2VuZCByZXN1bHQgYnVmZmVyCisJCXBNZHMtPlR4UmVzdWx0WyBQYWNrZXRJZCBdID0gMDsKKwl9IGVsc2UKKwkJcE1kcy0+VHhSZXN1bHRbIFBhY2tldElkIF0gfD0gKCh1MTYpKHBUMDItPnZhbHVlICYgMHgwZmZmZikpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmgKaW5kZXggN2E2ODJkNC4uZWUwZjEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oCkBAIC0xLDMzICsxLDIzIEBACi11bnNpZ25lZCBjaGFyIE1kc19pbml0aWFsKCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBNZHNfRGVzdHJveSggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgTWRzX1R4KCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBNZHNfSGVhZGVyQ29weSggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzLCAgdTggKlRhcmdldEJ1ZmZlciApOwotdTE2IE1kc19Cb2R5Q29weSggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzLCAgdTggKlRhcmdldEJ1ZmZlciApOwotdm9pZCBNZHNfRHVyYXRpb25TZXQoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcywgIHU4ICpUYXJnZXRCdWZmZXIgKTsKLXZvaWQgTWRzX1NlbmRDb21wbGV0ZSggIFBBREFQVEVSIEFkYXB0ZXIsICBQVDAyX0RFU0NSSVBUT1IgcFQwMiApOwotdm9pZCBNZHNfTXBkdVByb2Nlc3MoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcFJ4RGVzICk7Ci12b2lkIE1kc19yZXNldF9kZXNjcmlwdG9yKCAgUEFEQVBURVIgQWRhcHRlciApOworI2lmbmRlZiBfX1dJTkJPTkRfTURTX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfTURTX0ZfSAorCisjaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgImNvcmUuaCIKKwordW5zaWduZWQgY2hhciBNZHNfaW5pdGlhbCggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciApOwordm9pZCBNZHNfRGVzdHJveSggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciApOwordm9pZCBNZHNfVHgoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIgKTsKK3ZvaWQgTWRzX1NlbmRDb21wbGV0ZSggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIFBUMDJfREVTQ1JJUFRPUiBwVDAyICk7Cit2b2lkIE1kc19NcGR1UHJvY2VzcyggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIFBERVNDUklQVE9SIHBSeERlcyApOwogZXh0ZXJuIHZvaWQgRGF0YURtcCh1OCAqcGRhdGEsIHUzMiBsZW4sIHUzMiBvZmZzZXQpOwogCi0KLXZvaWQgdlJ4VGltZXJJbml0KFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIHZSeFRpbWVyU3RhcnQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBpbnQgdGltZW91dF92YWx1ZSk7Ci12b2lkIFJ4VGltZXJIYW5kbGVyXzFhKCBQQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgdlJ4VGltZXJTdG9wKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIFJ4VGltZXJIYW5kbGVyKCB2b2lkKgkJCVN5c3RlbVNwZWNpZmljMSwKLQkJCQkJICAgUFdCMzJfQURBUFRFUiAJQWRhcHRlciwKLQkJCQkJICAgdm9pZCoJCQlTeXN0ZW1TcGVjaWZpYzIsCi0JCQkJCSAgIHZvaWQqCQkJU3lzdGVtU3BlY2lmaWMzKTsKLQotCiAvLyBGb3IgQXN5bmNocm9ub3VzIGluZGljYXRpbmcuIFRoZSByb3V0aW5lIGNvbGxvY2F0ZXMgd2l0aCBVU0IuCi12b2lkIE1kc19Nc2R1UHJvY2VzcyggIFBXQjMyX0FEQVBURVIgQWRhcHRlciwgIFBSWExBWUVSMSBwUnhMYXllcjEsICB1OCBTbG90SW5kZXgpOwordm9pZCBNZHNfTXNkdVByb2Nlc3MoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICBQUlhMQVlFUjEgcFJ4TGF5ZXIxLCAgdTggU2xvdEluZGV4KTsKIAogLy8gRm9yIGRhdGEgZnJhbWUgc2VuZGluZyAyMDA2MDgwMgotdTE2IE1EU19HZXRQYWNrZXRTaXplKCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBNRFNfR2V0TmV4dFBhY2tldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci12b2lkIE1EU19HZXROZXh0UGFja2V0Q29tcGxldGUoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwotdm9pZCBNRFNfU2VuZFJlc3VsdCggIFBBREFQVEVSIEFkYXB0ZXIsICB1OCBQYWNrZXRJZCwgIHVuc2lnbmVkIGNoYXIgU2VuZE9LICk7Ci12b2lkIE1EU19FdGhlcm5ldFBhY2tldFJlY2VpdmUoICBQQURBUFRFUiBBZGFwdGVyLCAgUFJYTEFZRVIxIHBSeExheWVyMSApOwordTE2IE1EU19HZXRQYWNrZXRTaXplKCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyICk7Cit2b2lkIE1EU19HZXROZXh0UGFja2V0KCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwordm9pZCBNRFNfR2V0TmV4dFBhY2tldENvbXBsZXRlKCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwordm9pZCBNRFNfU2VuZFJlc3VsdCggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIHU4IFBhY2tldElkLCAgdW5zaWduZWQgY2hhciBTZW5kT0sgKTsKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oCmluZGV4IDlkZjJlMDkuLmViZjYxZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX3MuaApAQCAtMSw5ICsxLDE5IEBACisjaWZuZGVmIF9fV0lOQk9ORF9NRFNfSAorI2RlZmluZSBfX1dJTkJPTkRfTURTX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNpbmNsdWRlICJsb2NhbHBhcmEuaCIKKyNpbmNsdWRlICJtYWNfc3RydWN0dXJlcy5oIgorI2luY2x1ZGUgInNjYW5fcy5oIgorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogI2RlZmluZSBNQVhfVVNCX1RYX0RFU0NSSVBUT1IJCTE1CQkvLyBJUzg5QzM1IGFiaWxpdHkKICNkZWZpbmUgTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSCTQJCS8vIFZpcnR1YWwgcHJlLWJ1ZmZlciBudW1iZXIgb2YgTUFYX1VTQl9UWF9CVUZGRVIKICNkZWZpbmUgTUFYX1VTQl9UWF9CVUZGRVIJCQk0MDk2CS8vIElTODlDMzUgYWJpbGl0eSA0biBhbGlnbm1lbnQgaXMgcmVxdWlyZWQgZm9yIGhhcmR3YXJlCiAKLSNkZWZpbmUgTURTX0VWRU5UX0lORElDQVRFKCBfQSwgX0IsIF9GICkJT1NfRVZFTlRfSU5ESUNBVEUoIF9BLCBfQiwgX0YgKQogI2RlZmluZSBBVVRIX1JFUVVFU1RfUEFJUldJU0VfRVJST1IJCQkwCQkvLyBfRiBmbGFnIHNldHRpbmcKICNkZWZpbmUgQVVUSF9SRVFVRVNUX0dST1VQX0VSUk9SCQkJMQkJLy8gX0YgZmxhZyBzZXR0aW5nCiAKQEAgLTIxLDIwICszMSwxOSBAQAogI2RlZmluZSBDVVJSRU5UX1BBSVJXSVNFX0tFWQkJCXBzU01FLT50eF9taWNfa2V5CiAjZGVmaW5lIENVUlJFTlRfR1JPVVBfS0VZCQkJCXBzU01FLT5ncm91cF90eF9taWNfa2V5CiAjZGVmaW5lIENVUlJFTlRfRU5DUllQVF9TVEFUVVMJCQlwc1NNRS0+ZW5jcnlwdF9zdGF0dXMKLSNkZWZpbmUgQ1VSUkVOVF9XRVBfSUQJCQkJCUFkYXB0ZXItPnNTbWVQYXJhLl9kb3QxMVdFUERlZmF1bHRLZXlJRAotI2RlZmluZSBDVVJSRU5UX0NPTlRST0xfUE9SVF9CTE9DSwkJKCBwc1NNRS0+d3BhX29rIT0xIHx8IChBZGFwdGVyLT5NZHMuYm9Db3VudGVyTWVhc3VyZUJsb2NrPT0xICYmIChDVVJSRU5UX0VOQ1JZUFRfU1RBVFVTPT1FTkNSWVBUX1RLSVApKSApCi0jZGVmaW5lIENVUlJFTlRfRlJBR01FTlRfVEhSRVNIT0xECQkoQWRhcHRlci0+TWRzLlR4RnJhZ21lbnRUaHJlc2hvbGQgJiB+MHgxKQorI2RlZmluZSBDVVJSRU5UX1dFUF9JRAkJCQkJYWRhcHRlci0+c1NtZVBhcmEuX2RvdDExV0VQRGVmYXVsdEtleUlECisjZGVmaW5lIENVUlJFTlRfQ09OVFJPTF9QT1JUX0JMT0NLCQkoIHBzU01FLT53cGFfb2shPTEgfHwgKGFkYXB0ZXItPk1kcy5ib0NvdW50ZXJNZWFzdXJlQmxvY2s9PTEgJiYgKENVUlJFTlRfRU5DUllQVF9TVEFUVVM9PUVOQ1JZUFRfVEtJUCkpICkKKyNkZWZpbmUgQ1VSUkVOVF9GUkFHTUVOVF9USFJFU0hPTEQJCShhZGFwdGVyLT5NZHMuVHhGcmFnbWVudFRocmVzaG9sZCAmIH4weDEpCiAjZGVmaW5lIENVUlJFTlRfUFJFQU1CTEVfTU9ERQkJCXBzTE9DQUwtPmJvU2hvcnRQcmVhbWJsZT9XTEFOX1BSRUFNQkxFX1RZUEVfU0hPUlQ6V0xBTl9QUkVBTUJMRV9UWVBFX0xPTkcKLSNkZWZpbmUgQ1VSUkVOVF9MSU5LX09OCQkJCQlPU19MSU5LX1NUQVRVUwotI2RlZmluZSBDVVJSRU5UX1RYX1JBVEUJCQkJCUFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4UmF0ZQotI2RlZmluZSBDVVJSRU5UX0ZBTExfQkFDS19UWF9SQVRFCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkN1cnJlbnRUeEZhbGxiYWNrUmF0ZQotI2RlZmluZSBDVVJSRU5UX1RYX1JBVEVfRk9SX01ORwkJCUFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4UmF0ZUZvck1uZworI2RlZmluZSBDVVJSRU5UX1RYX1JBVEUJCQkJCWFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4UmF0ZQorI2RlZmluZSBDVVJSRU5UX0ZBTExfQkFDS19UWF9SQVRFCQlhZGFwdGVyLT5zTG9jYWxQYXJhLkN1cnJlbnRUeEZhbGxiYWNrUmF0ZQorI2RlZmluZSBDVVJSRU5UX1RYX1JBVEVfRk9SX01ORwkJCWFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4UmF0ZUZvck1uZwogI2RlZmluZSBDVVJSRU5UX1BST1RFQ1RfTUVDSEFOSVNNCQlwc0xPQ0FMLT5ib1Byb3RlY3RNZWNoYW5pc20KLSNkZWZpbmUgQ1VSUkVOVF9SVFNfVEhSRVNIT0xECQkJQWRhcHRlci0+TWRzLlR4UlRTVGhyZXNob2xkCisjZGVmaW5lIENVUlJFTlRfUlRTX1RIUkVTSE9MRAkJCWFkYXB0ZXItPk1kcy5UeFJUU1RocmVzaG9sZAogCi0jZGVmaW5lIE1JQl9HU19YTUlUX09LX0lOQwkJCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1hNSVRfT0srKwotI2RlZmluZSBNSUJfR1NfUkNWX09LX0lOQwkJCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1JDVl9PSysrCi0jZGVmaW5lIE1JQl9HU19YTUlUX0VSUk9SX0lOQwkJCUFkYXB0ZXItPnNMb2NhbFBhcmEuR1NfWE1JVF9FUlJPUgorI2RlZmluZSBNSUJfR1NfWE1JVF9PS19JTkMJCQkJYWRhcHRlci0+c0xvY2FsUGFyYS5HU19YTUlUX09LKysKKyNkZWZpbmUgTUlCX0dTX1JDVl9PS19JTkMJCQkJYWRhcHRlci0+c0xvY2FsUGFyYS5HU19SQ1ZfT0srKworI2RlZmluZSBNSUJfR1NfWE1JVF9FUlJPUl9JTkMJCQlhZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1hNSVRfRVJST1IKIAogLy8tLS0tLS0tLS0tIFRYIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjZGVmaW5lIEVUSEVSTkVUX1RYX0RFU0NSSVBUT1JTICAgICAgICAgTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSCkBAIC05Niw5ICsxMDUsOSBAQAogCXU4CVNjYW5UeFBhdXNlOwkvL2RhdGEgVHggcGF1c2UgYmVjYXVzZSB0aGUgc2Nhbm5pbmcgaXMgcHJvZ3Jlc3NpbmcsIGJ1dCBwcm9iZSByZXF1ZXN0IFR4IHdvbid0LgogCXU4CVR4UGF1c2U7Ly9Gb3IgcGF1c2UgdGhlIE1kc19UeCBtb2R1bHQKIAotCU9TX0FUT01JQwlUeFRocmVhZENvdW50Oy8vRm9yIHRocmVhZCBjb3VudGluZyA5MzExMzAuNC52CisJYXRvbWljX3QJVHhUaHJlYWRDb3VudDsvL0ZvciB0aHJlYWQgY291bnRpbmcgOTMxMTMwLjQudgogLy85NTAzMDEgZGVsZXRlIGR1ZSB0byBIVwotLy8JT1NfQVRPTUlDCVR4Q29uY3VycmVudENvdW50Oy8vOTMxMTMwLjQudworLy8JYXRvbWljX3QJVHhDb25jdXJyZW50Q291bnQ7Ly85MzExMzAuNC53CiAKIAl1MTYJVHhSZXN1bHRbICgoTUFYX1VTQl9UWF9ERVNDUklQVE9SICsgMSkgJiB+MHgwMSkgXTsvL0NvbGxlY3QgdGhlIHNlbmRpbmcgcmVzdWx0IG9mIE1wZHUKIApAQCAtMTMzLDkgKzE0Miw2IEBACiAJdTgJCWJvQ291bnRlck1lYXN1cmVCbG9jazsKIAl1OAkJcmVzZXJ2ZWRfNFsyXTsKIAotCS8vTkRJU19NSU5JUE9SVF9USU1FUgluVGltZXI7Ci0JT1NfVElNRVIJblRpbWVyOwotCiAJdTMyCVR4VHNjOyAvLyAyMDA2MDIxNAogCXUzMglUeFRzY18yOyAvLyAyMDA2MDIxNAogCkBAIC0xODAsNCArMTg2LDQgQEAKIAogfVJYTEFZRVIxLCAqIFBSWExBWUVSMTsKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfbWliLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX21pYi5oCmluZGV4IDg5NzU5NzM5Li5jYTg5MjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX21pYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfbWliLmgKQEAgLTIyLDE1ICsyMiwxNSBAQAogLy8gICBTZXQgdGhlIGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIHZhbHVlLgogLy8KIC8vIEFyZ3VtZW50czoKLS8vICAgQWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgorLy8gICBhZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCiAvLyAgIEV4VW5lbmNyeXB0ZWQgIC0gdW5zaWduZWQgY2hhciB0eXBlLiBUaGUgdmFsdWUgdG8gYmUgc2V0LgogLy8KIC8vIFJldHVybiB2YWx1ZXM6CiAvLyAgIE5vbmUuCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgTUxNRVNldEV4Y2x1ZGVVbmVuY3J5cHRlZChBZGFwdGVyLCBFeFVuZW5jcnlwdGVkKSAgICAgXAorI2RlZmluZSBNTE1FU2V0RXhjbHVkZVVuZW5jcnlwdGVkKGFkYXB0ZXIsIEV4VW5lbmNyeXB0ZWQpICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKEFkYXB0ZXIpLT5zTG9jYWxQYXJhLkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IEV4VW5lbmNyeXB0ZWQ7ICAgICAgICAgICAgIFwKKyAgICAoYWRhcHRlciktPnNMb2NhbFBhcmEuRXhjbHVkZVVuZW5jcnlwdGVkID0gRXhVbmVuY3J5cHRlZDsgICAgICAgICAgICAgXAogfQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQwLDEyICs0MCwxMiBAQAogLy8gICBHZXQgdGhlIGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIHZhbHVlLgogLy8KIC8vIEFyZ3VtZW50czoKLS8vICAgQWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgorLy8gICBhZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCiAvLwogLy8gUmV0dXJuIHZhbHVlczoKIC8vICAgdW5zaWduZWQgY2hhciB0eXBlLiBUaGUgY3VycmVudCBkb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCB2YWx1ZS4KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBNTE1FR2V0RXhjbHVkZVVuZW5jcnlwdGVkKEFkYXB0ZXIpICgodW5zaWduZWQgY2hhcikgKEFkYXB0ZXIpLT5zTG9jYWxQYXJhLkV4Y2x1ZGVVbmVuY3J5cHRlZCkKKyNkZWZpbmUgTUxNRUdldEV4Y2x1ZGVVbmVuY3J5cHRlZChhZGFwdGVyKSAoKHVuc2lnbmVkIGNoYXIpIChhZGFwdGVyKS0+c0xvY2FsUGFyYS5FeGNsdWRlVW5lbmNyeXB0ZWQpCiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gTUxNRVNldE1heFJlY2VpdmVMaWZlVGltZSAtLQpAQCAtNTQsMTUgKzU0LDE1IEBACiAvLyAgIFNldCB0aGUgZG90MTFNYXhSZWNlaXZlTGlmZVRpbWUgdmFsdWUuCiAvLwogLy8gQXJndW1lbnRzOgotLy8gICBBZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCisvLyAgIGFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KIC8vICAgUmVjZWl2ZUxpZmVUaW1lLSB1MzIgdHlwZS4gVGhlIHZhbHVlIHRvIGJlIHNldC4KIC8vCiAvLyBSZXR1cm4gdmFsdWVzOgogLy8gICBOb25lLgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIE1MTUVTZXRNYXhSZWNlaXZlTGlmZVRpbWUoQWRhcHRlciwgUmVjZWl2ZUxpZmVUaW1lKSAgICBcCisjZGVmaW5lIE1MTUVTZXRNYXhSZWNlaXZlTGlmZVRpbWUoYWRhcHRlciwgUmVjZWl2ZUxpZmVUaW1lKSAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChBZGFwdGVyKS0+TWRzLk1heFJlY2VpdmVUaW1lID0gUmVjZWl2ZUxpZmVUaW1lOyAgICAgICAgICAgICAgICBcCisgICAgKGFkYXB0ZXIpLT5NZHMuTWF4UmVjZWl2ZVRpbWUgPSBSZWNlaXZlTGlmZVRpbWU7ICAgICAgICAgICAgICAgIFwKIH0KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC03MiwxMiArNzIsMTIgQEAKIC8vICAgR2V0IHRoZSBkb3QxMU1heFJlY2VpdmVMaWZlVGltZSB2YWx1ZS4KIC8vCiAvLyBBcmd1bWVudHM6Ci0vLyAgIEFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KKy8vICAgYWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgogLy8KIC8vIFJldHVybiB2YWx1ZXM6CiAvLyAgIHUzMiB0eXBlLiBUaGUgY3VycmVudCBkb3QxMU1heFJlY2VpdmVMaWZlVGltZSB2YWx1ZS4KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBNTE1FR2V0TWF4UmVjZWl2ZUxpZmVUaW1lKEFkYXB0ZXIpICgodTMyKSAoQWRhcHRlciktPk1kcy5NYXhSZWNlaXZlVGltZSkKKyNkZWZpbmUgTUxNRUdldE1heFJlY2VpdmVMaWZlVGltZShhZGFwdGVyKSAoKHUzMikgKGFkYXB0ZXIpLT5NZHMuTWF4UmVjZWl2ZVRpbWUpCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfcy5oCmluZGV4IDAzOWZkNDAuLmVhMTI2ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfcy5oCkBAIC0xLDMgKzEsMTIgQEAKKyNpZm5kZWYgX19XSU5CT05EX01MTUVfSAorI2RlZmluZSBfX1dJTkJPTkRfTUxNRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtYWNfc3RydWN0dXJlcy5oIgorI2luY2x1ZGUgIm1kc19zLmgiCisKIC8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIC8vCU1sbWUuaAogLy8JCURlZmluZSB0aGUgcmVsYXRlZCBkZWZpbml0aW9ucyBvZiBNTE1FIG1vZHVsZQpAQCAtMTkyLDQgKzIwMSw0IEBACiAKIH1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgUlhEQVRBLCAqcHNSWERBVEE7CiAKLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYwppbmRleCBlODUzM2I4ZDEuLjA3ODAyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYwpAQCAtMTcsMTEzICsxNyw1NiBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCiAKLXZvaWQgTUxNRVJlc2V0VHhSeChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JczMyICAgICBpOwotCi0JLy8gUmVzZXQgdGhlIGludGVyZmFjZSBiZXR3ZWVuIE1EUyBhbmQgTUxNRQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RYX01NUERVOyBpKyspCi0JCUFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldID0gRkFMU0U7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUlhfTU1QRFU7IGkrKykKLQkJQWRhcHRlci0+c01sbWVGcmFtZS5TYXZlUnhCdWZTbG90SW5Vc2VbaV0gPSBGQUxTRTsKLQotCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVJ4TU1QRFVJbk1MTUUgICA9IDA7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtUnhNTVBEVURpc2NhcmRlZCA9IDA7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtUnhNTVBEVSAgICAgICAgICA9IDA7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVURpc2NhcmRlZCA9IDA7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVSAgICAgICAgICA9IDA7Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5ib0NDQWJ1c3kgICAgPSBGQUxTRTsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLmlQb3dlclNhdmVNb2RlICAgICA9IFBXUl9BQ1RJVkU7ICAgICAvLyBQb3dlciBhY3RpdmUKLX0KKyNpbmNsdWRlICJtZHNfZi5oIgogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwlGdW5jdGlvbjoKLS8vICAgIE1MTUVHZXRNTVBEVUJ1ZmZlcigpCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLyAgICBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gYW4gYXZhaWxhYmxlIGRhdGEgYnVmZmVyIHdpdGgKLS8vICAgIHRoZSBzaXplIE1BWF9NTVBEVV9TSVpFIGZvciBhIE1NUERVLgotLy8KLS8vICBBcmd1bWVudHM6Ci0vLyAgICBBZGFwdGVyICAgLSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCi0vLwotLy8JUmV0dXJuIHZhbHVlOgotLy8gICAgTlVMTCAgICAgOiBObyBhdmFpbGFibGUgZGF0YSBidWZmZXIgYXZhaWxhYmxlCi0vLyAgICBPdGhlcndpc2U6IFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qIEZJWE1FOiBTaG91bGQgdGhpcyBqdXN0IGJlIHJlcGxhY2VkIHdpdGgga21hbGxvYygpIGFuZCBrZnJlZSgpPyAqLwotdTggKk1MTUVHZXRNTVBEVUJ1ZmZlcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JczMyIGk7Ci0JdTggKnJldHVyblZhbDsKLQotCWZvciAoaSA9IDA7IGk8IE1BWF9OVU1fVFhfTU1QRFU7IGkrKykgewotCQlpZiAoQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPT0gRkFMU0UpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPj0gTUFYX05VTV9UWF9NTVBEVSkgcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm5WYWwgPSAodTggKikmKEFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVVtpXSk7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBUUlVFOwotCi0JcmV0dXJuIHJldHVyblZhbDsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdTggTUxNRVNlbmRGcmFtZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4ICpwTU1QRFUsIHUxNiBsZW4sIHU4IERhdGFUeXBlKQordTggTUxNRVNlbmRGcmFtZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCAqcE1NUERVLCB1MTYgbGVuLCB1OCBEYXRhVHlwZSkKIC8qCURhdGFUeXBlIDogRlJBTUVfVFlQRV84MDJfMTFfTUFOQUdFTUVOVCwgRlJBTUVfVFlQRV84MDJfMTFfTUFOQUdFTUVOVF9DSEFMTEVOR0UsCiAJCQkJRlJBTUVfVFlQRV84MDJfMTFfREFUQSAqLwogewotCWlmIChBZGFwdGVyLT5zTWxtZUZyYW1lLklzSW5Vc2VkICE9IFBBQ0tFVF9GUkVFX1RPX1VTRSkgewotCQlBZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1UeE1NUERVRGlzY2FyZGVkKys7Ci0JCXJldHVybiBGQUxTRTsKKwlpZiAoYWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCAhPSBQQUNLRVRfRlJFRV9UT19VU0UpIHsKKwkJYWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVURpc2NhcmRlZCsrOworCQlyZXR1cm4gZmFsc2U7CiAJfQotCUFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfQ09NRV9GUk9NX01MTUU7CisJYWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCA9IFBBQ0tFVF9DT01FX0ZST01fTUxNRTsKIAogCS8vIEtlZXAgaW5mb3JtYXRpb24gZm9yIHNlbmRpbmcKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVSA9IHBNTVBEVTsKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLkRhdGFUeXBlID0gRGF0YVR5cGU7CisJYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFUgPSBwTU1QRFU7CisJYWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZSA9IERhdGFUeXBlOwogCS8vIGxlbiBtdXN0IGJlIHRoZSBsYXN0IHNldHRpbmcgZHVlIHRvIFFVRVJZX1NJWkVfU0VDT05EIG9mIE1kcwotCUFkYXB0ZXItPnNNbG1lRnJhbWUubGVuID0gbGVuOwotCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVR4TU1QRFUrKzsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbiA9IGxlbjsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1UeE1NUERVKys7CiAKIAkvLyBIL1cgd2lsbCBlbnRlciBwb3dlciBzYXZlIGJ5IHNldCB0aGUgcmVnaXN0ZXIuIFMvVyBkb24ndCBzZW5kIG51bGwgZnJhbWUKIAkvL3dpdGggUFdSTWd0IGJpdCBlbmJsZWQgdG8gZW50ZXIgcG93ZXIgc2F2ZSBub3cuCiAKIAkvLyBUcmFuc21pdCBORElTIHBhY2tldAotCU1kc19UeChBZGFwdGVyKTsKLQlyZXR1cm4gVFJVRTsKKwlNZHNfVHgoYWRhcHRlcik7CisJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQKLU1MTUVfR2V0TmV4dFBhY2tldChQQURBUFRFUiBBZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzKQordm9pZCBNTE1FX0dldE5leHRQYWNrZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBQREVTQ1JJUFRPUiBkZXNjKQogewotI2RlZmluZSBERVNDUklQVE9SX0FERF9CVUZGRVIoIF9ELCBfQSwgX1MgKSBcCi17XAotCV9ELT5JbnRlcm5hbFVzZWQgPSBfRC0+YnVmZmVyX3N0YXJ0X2luZGV4ICsgX0QtPmJ1ZmZlcl9udW1iZXI7IFwKLQlfRC0+SW50ZXJuYWxVc2VkICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsgXAotCV9ELT5idWZmZXJfYWRkcmVzc1sgX0QtPkludGVybmFsVXNlZCBdID0gX0E7IFwKLQlfRC0+YnVmZmVyX3NpemVbIF9ELT5JbnRlcm5hbFVzZWQgXSA9IF9TOyBcCi0JX0QtPmJ1ZmZlcl90b3RhbF9zaXplICs9IF9TOyBcCi0JX0QtPmJ1ZmZlcl9udW1iZXIrKztcCisJZGVzYy0+SW50ZXJuYWxVc2VkID0gZGVzYy0+YnVmZmVyX3N0YXJ0X2luZGV4ICsgZGVzYy0+YnVmZmVyX251bWJlcjsKKwlkZXNjLT5JbnRlcm5hbFVzZWQgJT0gTUFYX0RFU0NSSVBUT1JfQlVGRkVSX0lOREVYOworCWRlc2MtPmJ1ZmZlcl9hZGRyZXNzW2Rlc2MtPkludGVybmFsVXNlZF0gPSBhZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVTsKKwlkZXNjLT5idWZmZXJfc2l6ZVtkZXNjLT5JbnRlcm5hbFVzZWRdID0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJZGVzYy0+YnVmZmVyX3RvdGFsX3NpemUgKz0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJZGVzYy0+YnVmZmVyX251bWJlcisrOworCWRlc2MtPlR5cGUgPSBhZGFwdGVyLT5zTWxtZUZyYW1lLkRhdGFUeXBlOwogfQogCi0JREVTQ1JJUFRPUl9BRERfQlVGRkVSKCBwRGVzLCBBZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVSwgQWRhcHRlci0+c01sbWVGcmFtZS5sZW4gKTsKLQlwRGVzLT5UeXBlID0gQWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZTsKLX0KLQotdm9pZCBNTE1FZnJlZU1NUERVQnVmZmVyKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgczggKnBEYXRhKQorc3RhdGljIHZvaWQgTUxNRWZyZWVNTVBEVUJ1ZmZlcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHM4ICpwRGF0YSkKIHsKIAlpbnQgaTsKIAogCS8vIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyCiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVFhfTU1QRFU7IGkrKykgewotCQlpZiAocERhdGEgPT0gKHM4ICopJihBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVbaV0pKQorCQlpZiAocERhdGEgPT0gKHM4ICopJihhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVbaV0pKQogCQkJYnJlYWs7CiAJfQotCWlmIChBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSkKLQkJQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBGQUxTRTsKKwlpZiAoYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0pCisJCWFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldID0gZmFsc2U7CiAJZWxzZSAgewogCQkvLyBTb21ldGhpbmcgd3JvbmcKIAkJLy8gUEQ0MyBBZGQgZGVidWcgY29kZSBoZXJlPz8/CkBAIC0xMzEsMTkgKzc0LDE5IEBACiB9CiAKIHZvaWQKLU1MTUVfU2VuZENvbXBsZXRlKFBBREFQVEVSIEFkYXB0ZXIsIHU4IFBhY2tldElELCB1bnNpZ25lZCBjaGFyIFNlbmRPSykKK01MTUVfU2VuZENvbXBsZXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4IFBhY2tldElELCB1bnNpZ25lZCBjaGFyIFNlbmRPSykKIHsKIAlNTE1FX1RYQ0FMTEJBQ0sJVHhDYWxsYmFjazsKIAogICAgIC8vIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyCi0JQWRhcHRlci0+c01sbWVGcmFtZS5sZW4gPSAwOwotCU1MTUVmcmVlTU1QRFVCdWZmZXIoIEFkYXB0ZXIsIEFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVICk7CisJYWRhcHRlci0+c01sbWVGcmFtZS5sZW4gPSAwOworCU1MTUVmcmVlTU1QRFVCdWZmZXIoIGFkYXB0ZXIsIGFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVICk7CiAKIAogCVR4Q2FsbGJhY2suYlJlc3VsdCA9IE1MTUVfU1VDQ0VTUzsKIAogCS8vIFJldHVybiByZXNvdXJjZQotCUFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfRlJFRV9UT19VU0U7CisJYWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCA9IFBBQ0tFVF9GUkVFX1RPX1VTRTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmgKaW5kZXggMjRjZDVmMy4uNWYwNWE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4X2YuaApAQCAtOCwzMiArOCwyNSBAQAogI2lmbmRlZiBfTUxNRVRYUlhfSAogI2RlZmluZSBfTUxNRVRYUlhfSAogCisjaW5jbHVkZSAiY29yZS5oIgorCiB2b2lkCiBNTE1FUHJvY1RocmVhZCgKLSAgICAgUFdCMzJfQURBUFRFUiAgICBBZGFwdGVyCisgICAgIHN0cnVjdCB3YnNvZnRfcHJpdiAqICAgIGFkYXB0ZXIKIAkpOwogCi12b2lkIE1MTUVSZXNldFR4UngoIFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci0KLXU4ICoKLU1MTUVHZXRNTVBEVUJ1ZmZlcigKLSAgICAgUFdCMzJfQURBUFRFUiAgICBBZGFwdGVyCi0gICApOwotCi12b2lkIE1MTUVmcmVlTU1QRFVCdWZmZXIoIFBXQjMyX0FEQVBURVIgQWRhcHRlciwgIHM4ICogcERhdGEpOwotCi12b2lkIE1MTUVfR2V0TmV4dFBhY2tldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci11OCBNTE1FU2VuZEZyYW1lKCBQV0IzMl9BREFQVEVSIEFkYXB0ZXIsCit2b2lkIE1MTUVfR2V0TmV4dFBhY2tldCggIHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Cit1OCBNTE1FU2VuZEZyYW1lKCBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLAogCQkJCQl1OAkqcE1NUERVLAogCQkJCQl1MTYJbGVuLAogCQkJCQkgdTgJRGF0YVR5cGUpOwogCiB2b2lkCi1NTE1FX1NlbmRDb21wbGV0ZSggIFBXQjMyX0FEQVBURVIgQWRhcHRlciwgIHU4IFBhY2tldElELCAgdW5zaWduZWQgY2hhciBTZW5kT0sgKTsKK01MTUVfU2VuZENvbXBsZXRlKCAgc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgIHU4IFBhY2tldElELCAgdW5zaWduZWQgY2hhciBTZW5kT0sgKTsKIAogdm9pZAogTUxNRVJjdkZyYW1lKAotICAgICBQV0IzMl9BREFQVEVSICAgIEFkYXB0ZXIsCisgICAgIHN0cnVjdCB3YnNvZnRfcHJpdiAqICAgIGFkYXB0ZXIsCiAgICAgIFBSWEJVRkZFUiAgICAgICAgcFJ4QnVmZmVyQXJyYXksCiAgICAgIHU4ICAgICAgICAgICAgTnVtT2ZCdWZmZXIsCiAgICAgIHU4ICAgICAgICAgICAgUmV0dXJuU2xvdEluZGV4CkBAIC00MSwxMSArMzQsMTEgQEAKIAogdm9pZAogTUxNRVJldHVyblBhY2tldCgKLSAgICAgUFdCMzJfQURBUFRFUiAgICBBZGFwdGVyLAorICAgICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiAgICBhZGFwdGVyLAogICAgICB1OCAqICAgICAgICAgIHBSeEJ1ZmVyCiAgICApOwogI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi1zOCBTZW5kQkNOdWxsRGF0YShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiB3SWR4KTsKK3M4IFNlbmRCQ051bGxEYXRhKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiB3SWR4KTsKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKaW5kZXggMmVmNjBlNS4uZGUxMWEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKQEAgLTIzLDEwICsyMywxMiBAQAogCiAvLyBMQTIwMDQwMjEwX0RUTyBrZXZpbgogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgorI2luY2x1ZGUgInNtZV9hcGkuaCIKKyNpbmNsdWRlICJnbF84MDIxMS5oIgorI2luY2x1ZGUgIndiaGFsX2YuaCIKIAogLy8gRGVjbGFyZSBTUTMgdG8gcmF0ZSBhbmQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgdGFibGUKIC8vIERlY2xhcmUgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGRzIHRhYmxlCi0jZGVmaW5lIE1UT19NQVhfU1EzX0xFVkVMUyAgICAgICAgICAgICAgICAgICAgICAxNAogI2RlZmluZSBNVE9fTUFYX0ZSQUdfVEhfTEVWRUxTICAgICAgICAgICAgICAgICAgNQogI2RlZmluZSBNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFMgICAgICAgICAgICAgICAgMTIKIApAQCAtMzUsMTgxICszNywxNSBAQAogICAgIDI1NiwgMzg0LCA1MTIsIDc2OCwgMTUzNgogfTsKIAotdTggIE1UT19TUTNfTGV2ZWxbTVRPX01BWF9TUTNfTEVWRUxTXSA9Ci17Ci0gICAgMCwgMjYsIDMwLCAzMiwgMzQsIDM1LCAzNywgNDIsIDQ0LCA0NiwgNTQsIDYyLCA3OCwgODEKLX07Ci11OCAgTVRPX1NRM3RvUmF0ZVtNVE9fTUFYX1NRM19MRVZFTFNdID0KLXsKLSAgICAwLCAxLCAxLCAyLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEKLX07Ci11OCAgTVRPX1NRM3RvRnJhZ1tNVE9fTUFYX1NRM19MRVZFTFNdID0KLXsKLSAgICAwLCAyLCAyLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0Ci19OwotCi0vLyBPbmUgRXhjaGFuZ2UgVGltZSB0YWJsZQotLy8KLXUxNiBNVE9fT25lX0V4Y2hhbmdlX1RpbWVfVGJsX2xbTVRPX01BWF9GUkFHX1RIX0xFVkVMU11bTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9Ci17Ci0gICAgeyAyNTU0LCAxNDc0LCAgODIyLCAgICAwLCAgICAwLCAgNjM2LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwfSwKLSAgICB7IDM1NzgsIDE5ODYsIDEwMDksICAgIDAsICAgIDAsICA3MjksICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDB9LAotICAgIHsgNDYwMiwgMjQ5OCwgMTE5NSwgICAgMCwgICAgMCwgIDgyMiwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMH0sCi0gICAgeyA2NjUwLCAzNTIyLCAxNTY3LCAgICAwLCAgICAwLCAxMDA5LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwfSwKLSAgICB7MTI3OTQsIDY1OTQsIDI2ODQsICAgIDAsICAgIDAsIDE1NjcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDB9Ci19OwotCi11MTYgTVRPX09uZV9FeGNoYW5nZV9UaW1lX1RibF9zW01UT19NQVhfRlJBR19USF9MRVZFTFNdW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU10gPQotewotICAgIHsgICAgMCwgMTI4MiwgIDYzMCwgIDQwNCwgIDI4OCwgIDQ0NCwgIDIzMiwgIDE3MiwgIDE0NCwgIDExNiwgIDEwMCwgICA5Nn0sCi0gICAgeyAgICAwLCAxNzk0LCAgODE3LCAgNTcyLCAgNDAwLCAgNTM3LCAgMzE2LCAgMjI4LCAgMTg4LCAgMTQ0LCAgMTI0LCAgMTE2fSwKLSAgICB7ICAgIDAsIDIzMDYsIDEwMDMsICA3NDQsICA1MTYsICA2MzAsICA0MDAsICAyODgsICAyMjgsICAxNzIsICAxNDQsICAxMzZ9LAotICAgIHsgICAgMCwgMzMzMCwgMTM3NSwgMTA4NCwgIDc0NCwgIDgxNywgIDU3MiwgIDQwMCwgIDMxNiwgIDIyOCwgIDE4OCwgIDE3Mn0sCi0gICAgeyAgICAwLCA2NDAyLCAyNDkyLCAyMTA4LCAxNDI0LCAxMzc1LCAxMDg0LCAgNzQwLCAgNTcyLCAgNDAwLCAgMzE2LCAgMjg0fQotfTsKLQotI2RlZmluZSBNVE9fT05FX0VYQ0hBTkdFX1RJTUUocHJlYW1ibGVfdHlwZSwgZnJhZ190aF9sdmwsIGRhdGFfcmF0ZV9sdmwpIFwKLSAgICAgICAgICAgIChwcmVhbWJsZV90eXBlKSA/ICAgTVRPX09uZV9FeGNoYW5nZV9UaW1lX1RibF9zW2ZyYWdfdGhfbHZsXVtkYXRhX3JhdGVfbHZsXSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPX09uZV9FeGNoYW5nZV9UaW1lX1RibF9sW2ZyYWdfdGhfbHZsXVtkYXRhX3JhdGVfbHZsXQotCiAvLyBEZWNsYXJlIGRhdGEgcmF0ZSB0YWJsZQogLy9UaGUgZm9sbG93aW5nIHRhYmxlIHdpbGwgYmUgY2hhbmdlZCBhdCBhbnl0aW1lIGlmIHRoZSBvcHJhdGlvbiByYXRlIHN1cHBvcnRlZCBieSBBUCBkb24ndAogLy9tYXRjaCB0aGUgdGFibGUKLXU4ICBNVE9fRGF0YV9SYXRlX1RibFtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0KLXsKK3N0YXRpYyB1OCBNVE9fRGF0YV9SYXRlX1RibFtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0gewogICAgIDIsIDQsIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOAogfTsKIAotLy9UaGUgU3RhcmRhcmRfRGF0YV9SYXRlX1RibCBhbmQgTGV2ZWwyUGVyVGJsIHRhYmxlIGlzIHVzZWQgdG8gaW5kaXJlY3RseSByZXRyZWl2ZSBQRVIKLS8vaW5mb3JtYXRpb24gZnJvbSBSYXRlX1BFUl9UQkwKLS8vVGhlIGRlZmF1bHQgc2V0dGluZ3MgaXMgQVAgY2FuIHN1cHBvcnQgZnVsbCByYXRlIHNldC4KLXN0YXRpYyB1OCAgU3RhcmRhcmRfRGF0YV9SYXRlX1RibFtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0KLXsKLQkyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgKLX07Ci1zdGF0aWMgdTggIExldmVsMlBlclRibFtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0KLXsKLQkwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEKLX07Ci0vL0hvdyBtYW55IGtpbmQgb2YgdHggcmF0ZSBjYW4gYmUgc3VwcG9ydGVkIGJ5IEFQCi0vL0RUTyB3aWxsIGNoYW5nZSBSYXRlIGJldHdlZW4gTVRPX0RhdGFfUmF0ZV9UYmxbMF0gYW5kIE1UT19EYXRhX1JhdGVfVGJsW01UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsLTFdCi1zdGF0aWMgdTggIE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsID0gTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTOwotLy9TbW9vdGhlZCBQRVIgdGFibGUgZm9yIGVhY2ggZGlmZmVyZW50IFJBVEUgYmFzZWQgb24gcGFja2V0IGxlbmd0aCBvZiAxNTE0Ci1zdGF0aWMgaW50IFJhdGVfUEVSX1RCTFs5MV1bTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9IHsKLS8vICAgICAgICAxTSAgICAyTSAgICA1LjVNICAxMU0gICA2TSAgICA5TSAgICAxMk0gICAgIDE4TSAgICAyNE0gICAgMzZNICAgIDQ4TSAgIDU0TQotLyogMCUgICoveyA5MywgICAxNzcsICA0MjAsICA1MzgsICA2OTAsICA3NzQsICAxMDAxLCAgMTQwMSwgIDE3NjgsICAyMzU4LCAgMjgzOCwgIDMwMzl9LAotLyogMSUgICoveyA5MiwgICAxNzYsICA0MTYsICA1MzMsICA2ODMsICA3NjcsICA5OTIsICAgMTM4OSwgIDE3NTIsICAyMzM2LCAgMjgxMSwgIDMwMTB9LAotLyogMiUgICoveyA5MSwgICAxNzQsICA0MTIsICA1MjgsICA2NzUsICA3NjAsICA5ODMsICAgMTM3NiwgIDE3MzUsICAyMzEzLCAgMjc4MywgIDI5Nzl9LAotLyogMyUgICoveyA5MCwgICAxNzIsICA0MDcsICA1MjMsICA2NjcsICA3NTMsICA5NzMsICAgMTM2MywgIDE3MTksICAyMjkwLCAgMjc1NSwgIDI5NDh9LAotLyogNCUgICoveyA5MCwgICAxNzAsICA0MDMsICA1MTgsICA2NTksICA3NDYsICA5NjQsICAgMTM1MCwgIDE3MDEsICAyMjY2LCAgMjcyNiwgIDI5MTZ9LAotLyogNSUgICoveyA4OSwgICAxNjksICAzOTgsICA1MTIsICA2NTEsICA3MzgsICA5NTQsICAgMTMzNiwgIDE2ODQsICAyMjQyLCAgMjY5NiwgIDI4ODR9LAotLyogNiUgICoveyA4OCwgICAxNjcsICAzOTQsICA1MDcsICA2NDMsICA3MzEsICA5NDQsICAgMTMyMiwgIDE2NjYsICAyMjE3LCAgMjY2NSwgIDI4NTF9LAotLyogNyUgICoveyA4NywgICAxNjUsICAzODksICA1MDIsICA2MzUsICA3MjMsICA5MzUsICAgMTMwOCwgIDE2NDgsICAyMTkyLCAgMjYzNCwgIDI4MTd9LAotLyogOCUgICoveyA4NiwgICAxNjMsICAzODQsICA0OTcsICA2MjYsICA3MTYsICA5MjQsICAgMTI5NCwgIDE2MjksICAyMTY2LCAgMjYwMiwgIDI3ODJ9LAotLyogOSUgICoveyA4NSwgICAxNjEsICAzODAsICA0OTEsICA2MTgsICA3MDgsICA5MTQsICAgMTI3OSwgIDE2MTEsICAyMTQwLCAgMjU3MCwgIDI3NDd9LAotLyogMTAlICoveyA4NCwgICAxNjAsICAzNzUsICA0ODYsICA2MDksICA3MDAsICA5MDQsICAgMTI2NSwgIDE1OTEsICAyMTEzLCAgMjUzNywgIDI3MTF9LAotLyogMTElICoveyA4MywgICAxNTgsICAzNzAsICA0ODAsICA2MDAsICA2OTIsICA4OTQsICAgMTI1MCwgIDE1NzIsICAyMDg2LCAgMjUwMywgIDI2NzV9LAotLyogMTIlICoveyA4MiwgICAxNTYsICAzNjUsICA0NzUsICA1OTIsICA2ODQsICA4ODMsICAgMTIzNCwgIDE1NTIsICAyMDU5LCAgMjQ2OSwgIDI2Mzh9LAotLyogMTMlICoveyA4MSwgICAxNTQsICAzNjAsICA0NjksICA1ODMsICA2NzYsICA4NzIsICAgMTIxOSwgIDE1MzIsICAyMDMxLCAgMjQzNSwgIDI2MDB9LAotLyogMTQlICoveyA4MCwgICAxNTIsICAzNTUsICA0NjQsICA1NzQsICA2NjgsICA4NjIsICAgMTIwNCwgIDE1MTIsICAyMDAzLCAgMjQwMCwgIDI1NjJ9LAotLyogMTUlICoveyA3OSwgICAxNTAsICAzNTAsICA0NTgsICA1NjUsICA2NjAsICA4NTEsICAgMTE4OCwgIDE0OTIsICAxOTc0LCAgMjM2NSwgIDI1MjR9LAotLyogMTYlICoveyA3OCwgICAxNDgsICAzNDUsICA0NTMsICA1NTYsICA2NTIsICA4NDAsICAgMTE3MiwgIDE0NzEsICAxOTQ1LCAgMjMyOSwgIDI0ODV9LAotLyogMTclICoveyA3NywgICAxNDYsICAzNDAsICA0NDcsICA1NDcsICA2NDMsICA4MjksICAgMTE1NiwgIDE0NTAsICAxOTE2LCAgMjI5MywgIDI0NDZ9LAotLyogMTglICoveyA3NiwgICAxNDQsICAzMzUsICA0NDEsICA1MzgsICA2MzUsICA4MTgsICAgMTE0MCwgIDE0MjksICAxODg3LCAgMjI1NiwgIDI0MDZ9LAotLyogMTklICoveyA3NSwgICAxNDMsICAzMzAsICA0MzYsICA1MjksICA2MjcsICA4MDcsICAgMTEyNCwgIDE0MDgsICAxODU3LCAgMjIxOSwgIDIzNjZ9LAotLyogMjAlICoveyA3NCwgICAxNDEsICAzMjUsICA0MzAsICA1MjAsICA2MTgsICA3OTUsICAgMTEwNywgIDEzODYsICAxODI3LCAgMjE4MiwgIDIzMjZ9LAotLyogMjElICoveyA3MywgICAxMzksICAzMjAsICA0MjQsICA1MTAsICA2MTAsICA3ODQsICAgMTA5MSwgIDEzNjUsICAxNzk3LCAgMjE0NSwgIDIyODV9LAotLyogMjIlICoveyA3MiwgICAxMzcsICAzMTQsICA0MTgsICA1MDEsICA2MDEsICA3NzIsICAgMTA3NCwgIDEzNDMsICAxNzY2LCAgMjEwNywgIDIyNDR9LAotLyogMjMlICoveyA3MSwgICAxMzUsICAzMDksICA0MTIsICA0OTIsICA1OTIsICA3NjEsICAgMTA1NywgIDEzMjEsICAxNzM2LCAgMjA2OSwgIDIyMDN9LAotLyogMjQlICoveyA3MCwgICAxMzMsICAzMDQsICA0MDcsICA0ODIsICA1ODQsICA3NDksICAgMTA0MCwgIDEyOTksICAxNzA1LCAgMjAzMSwgIDIxNjF9LAotLyogMjUlICoveyA2OSwgICAxMzEsICAyOTksICA0MDEsICA0NzMsICA1NzUsICA3MzgsICAgMTAyMywgIDEyNzcsICAxNjc0LCAgMTk5MiwgIDIxMjB9LAotLyogMjYlICoveyA2OCwgICAxMjksICAyOTMsICAzOTUsICA0NjQsICA1NjYsICA3MjYsICAgMTAwNiwgIDEyNTQsICAxNjQyLCAgMTk1MywgIDIwNzh9LAotLyogMjclICoveyA2NywgICAxMjcsICAyODgsICAzODksICA0NTQsICA1NTcsICA3MTQsICAgOTg5LCAgIDEyMzIsICAxNjExLCAgMTkxNSwgIDIwMzV9LAotLyogMjglICoveyA2NiwgICAxMjUsICAyODMsICAzODMsICA0NDUsICA1NDksICA3MDMsICAgOTcyLCAgIDEyMDksICAxNTc5LCAgMTg3NiwgIDE5OTN9LAotLyogMjklICoveyA2NSwgICAxMjMsICAyNzgsICAzNzcsICA0MzYsICA1NDAsICA2OTEsICAgOTU1LCAgIDExODcsICAxNTQ4LCAgMTgzNiwgIDE5NTF9LAotLyogMzAlICoveyA2NCwgICAxMjEsICAyNzIsICAzNzEsICA0MjYsICA1MzEsICA2NzksICAgOTM3LCAgIDExNjQsICAxNTE2LCAgMTc5NywgIDE5MDh9LAotLyogMzElICoveyA2MywgICAxMTksICAyNjcsICAzNjUsICA0MTcsICA1MjIsICA2NjcsICAgOTIwLCAgIDExNDEsICAxNDg0LCAgMTc1OCwgIDE4NjZ9LAotLyogMzIlICoveyA2MiwgICAxMTcsICAyNjIsICAzNTksICA0MDcsICA1MTMsICA2NTUsICAgOTAyLCAgIDExMTgsICAxNDUzLCAgMTcxOSwgIDE4MjN9LAotLyogMzMlICoveyA2MSwgICAxMTUsICAyNTYsICAzNTMsICAzOTgsICA1MDQsICA2NDMsICAgODg1LCAgIDEwOTUsICAxNDIxLCAgMTY3OSwgIDE3ODF9LAotLyogMzQlICoveyA2MCwgICAxMTMsICAyNTEsICAzNDcsICAzODksICA0OTUsICA2MzEsICAgODY3LCAgIDEwNzIsICAxMzg5LCAgMTY0MCwgIDE3Mzh9LAotLyogMzUlICoveyA1OSwgICAxMTEsICAyNDYsICAzNDEsICAzNzksICA0ODYsICA2MTksICAgODUwLCAgIDEwNDksICAxMzU3LCAgMTYwMCwgIDE2OTV9LAotLyogMzYlICoveyA1OCwgICAxMDgsICAyNDAsICAzMzUsICAzNzAsICA0NzcsICA2MDcsICAgODMyLCAgIDEwMjcsICAxMzI1LCAgMTU2MSwgIDE2NTN9LAotLyogMzclICoveyA1NywgICAxMDYsICAyMzUsICAzMjksICAzNjEsICA0NjgsICA1OTUsICAgODE1LCAgIDEwMDQsICAxMjkzLCAgMTUyMiwgIDE2MTB9LAotLyogMzglICoveyA1NiwgICAxMDQsICAyMzAsICAzMjMsICAzNTEsICA0NTksICA1ODQsICAgNzk3LCAgIDk4MSwgICAxMjYxLCAgMTQ4MywgIDE1Njh9LAotLyogMzklICoveyA1NSwgICAxMDIsICAyMjQsICAzMTcsICAzNDIsICA0NTAsICA1NzIsICAgNzgwLCAgIDk1OCwgICAxMjMwLCAgMTQ0MywgIDE1MjZ9LAotLyogNDAlICoveyA1NCwgICAxMDAsICAyMTksICAzMTEsICAzMzMsICA0NDEsICA1NjAsICAgNzYyLCAgIDkzNSwgICAxMTk4LCAgMTQwNCwgIDE0ODR9LAotLyogNDElICoveyA1MywgICA5OCwgICAyMTQsICAzMDUsICAzMjQsICA0MzIsICA1NDgsICAgNzQ0LCAgIDkxMiwgICAxMTY2LCAgMTM2NiwgIDE0NDJ9LAotLyogNDIlICoveyA1MiwgICA5NiwgICAyMDksICAyOTksICAzMTUsICA0MjMsICA1MzYsICAgNzI3LCAgIDg4OSwgICAxMTM1LCAgMTMyNywgIDE0MDB9LAotLyogNDMlICoveyA1MSwgICA5NCwgICAyMDMsICAyOTMsICAzMDYsICA0MTQsICA1MjQsICAgNzA5LCAgIDg2NiwgICAxMTA0LCAgMTI4OSwgIDEzNTh9LAotLyogNDQlICoveyA1MCwgICA5MiwgICAxOTgsICAyODcsICAyOTcsICA0MDUsICA1MTIsICAgNjkyLCAgIDg0NCwgICAxMDcyLCAgMTI1MCwgIDEzMTd9LAotLyogNDUlICoveyA0OSwgICA5MCwgICAxOTMsICAyODEsICAyODgsICAzOTYsICA1MDAsICAgNjc1LCAgIDgyMSwgICAxMDQxLCAgMTIxMiwgIDEyNzZ9LAotLyogNDYlICoveyA0OCwgICA4OCwgICAxODgsICAyNzUsICAyNzksICAzODcsICA0ODgsICAgNjU3LCAgIDc5OSwgICAxMDExLCAgMTE3NCwgIDEyMzZ9LAotLyogNDclICoveyA0NywgICA4NiwgICAxODMsICAyNjksICAyNzEsICAzNzgsICA0NzYsICAgNjQwLCAgIDc3NywgICA5ODAsICAgMTEzNywgIDExOTV9LAotLyogNDglICoveyA0NiwgICA4NCwgICAxNzgsICAyNjIsICAyNjIsICAzNjksICA0NjQsICAgNjIzLCAgIDc1NCwgICA5NDksICAgMTEwMCwgIDExNTV9LAotLyogNDklICoveyA0NSwgICA4MiwgICAxNzMsICAyNTYsICAyNTQsICAzNjAsICA0NTIsICAgNjA2LCAgIDczMiwgICA5MTksICAgMTA2MywgIDExMTZ9LAotLyogNTAlICoveyA0NCwgICA4MCwgICAxNjgsICAyNTEsICAyNDUsICAzNTEsICA0NDEsICAgNTg5LCAgIDcxMCwgICA4ODksICAgMTAyNiwgIDEwNzZ9LAotLyogNTElICoveyA0MywgICA3OCwgICAxNjMsICAyNDUsICAyMzcsICAzNDIsICA0MjksICAgNTcyLCAgIDY4OSwgICA4NjAsICAgOTkwLCAgIDEwMzh9LAotLyogNTIlICoveyA0MiwgICA3NiwgICAxNTgsICAyMzksICAyMjgsICAzMzMsICA0MTcsICAgNTU1LCAgIDY2NywgICA4MzAsICAgOTU1LCAgIDk5OX0sCi0vKiA1MyUgKi97IDQxLCAgIDc0LCAgIDE1MywgIDIzMywgIDIyMCwgIDMyNCwgIDQwNiwgICA1MzgsICAgNjQ1LCAgIDgwMSwgICA5MTksICAgOTYxfSwKLS8qIDU0JSAqL3sgNDAsICAgNzIsICAgMTQ4LCAgMjI3LCAgMjEyLCAgMzE1LCAgMzk0LCAgIDUyMiwgICA2MjQsICAgNzczLCAgIDg4NCwgICA5MjR9LAotLyogNTUlICoveyAzOSwgICA3MCwgICAxNDMsICAyMjEsICAyMDQsICAzMDcsICAzODMsICAgNTA1LCAgIDYwMywgICA3NDQsICAgODUwLCAgIDg4N30sCi0vKiA1NiUgKi97IDM4LCAgIDY4LCAgIDEzOCwgIDIxNSwgIDE5NiwgIDI5OCwgIDM3MSwgICA0ODksICAgNTgyLCAgIDcxNiwgICA4MTYsICAgODUxfSwKLS8qIDU3JSAqL3sgMzcsICAgNjcsICAgMTM0LCAgMjA5LCAgMTg5LCAgMjg5LCAgMzYwLCAgIDQ3MywgICA1NjIsICAgNjg4LCAgIDc4MywgICA4MTV9LAotLyogNTglICoveyAzNiwgICA2NSwgICAxMjksICAyMDMsICAxODEsICAyODEsICAzNDksICAgNDU3LCAgIDU0MSwgICA2NjEsICAgNzUwLCAgIDc4MH0sCi0vKiA1OSUgKi97IDM1LCAgIDYzLCAgIDEyNCwgIDE5NywgIDE3NCwgIDI3MiwgIDMzOCwgICA0NDEsICAgNTIxLCAgIDYzNCwgICA3MTcsICAgNzQ1fSwKLS8qIDYwJSAqL3sgMzQsICAgNjEsICAgMTIwLCAgMTkyLCAgMTY2LCAgMjY0LCAgMzI3LCAgIDQyNSwgICA1MDEsICAgNjA4LCAgIDY4NiwgICA3MTJ9LAotLyogNjElICoveyAzMywgICA1OSwgICAxMTUsICAxODYsICAxNTksICAyNTUsICAzMTYsICAgNDA5LCAgIDQ4MiwgICA1ODIsICAgNjU1LCAgIDY3OH0sCi0vKiA2MiUgKi97IDMyLCAgIDU3LCAgIDExMSwgIDE4MCwgIDE1MiwgIDI0NywgIDMwNSwgICAzOTQsICAgNDYyLCAgIDU1NiwgICA2MjQsICAgNjQ2fSwKLS8qIDYzJSAqL3sgMzEsICAgNTUsICAgMTA3LCAgMTc0LCAgMTQ1LCAgMjM4LCAgMjk0LCAgIDM3OSwgICA0NDMsICAgNTMxLCAgIDU5NCwgICA2MTR9LAotLyogNjQlICoveyAzMCwgICA1MywgICAxMDIsICAxNjksICAxMzgsICAyMzAsICAyODMsICAgMzY0LCAgIDQyNSwgICA1MDYsICAgNTY1LCAgIDU4M30sCi0vKiA2NSUgKi97IDI5LCAgIDUyLCAgIDk4LCAgIDE2MywgIDEzMiwgIDIyMiwgIDI3MywgICAzNDksICAgNDA2LCAgIDQ4MiwgICA1MzYsICAgNTUzfSwKLS8qIDY2JSAqL3sgMjgsICAgNTAsICAgOTQsICAgMTU4LCAgMTI1LCAgMjE0LCAgMjYyLCAgIDMzNCwgICAzODgsICAgNDU5LCAgIDUwOCwgICA1MjN9LAotLyogNjclICoveyAyNywgICA0OCwgICA5MCwgICAxNTIsICAxMTksICAyMDYsICAyNTIsICAgMzIwLCAgIDM3MCwgICA0MzYsICAgNDgxLCAgIDQ5NX0sCi0vKiA2OCUgKi97IDI2LCAgIDQ2LCAgIDg2LCAgIDE0NywgIDExMywgIDE5OCwgIDI0MiwgICAzMDYsICAgMzUzLCAgIDQxMywgICA0NTUsICAgNDY3fSwKLS8qIDY5JSAqL3sgMjYsICAgNDQsICAgODIsICAgMTQxLCAgMTA3LCAgMTkwLCAgMjMxLCAgIDI5MiwgICAzMzYsICAgMzkxLCAgIDQyOSwgICA0NDB9LAotLyogNzAlICoveyAyNSwgICA0MywgICA3OCwgICAxMzYsICAxMDEsICAxODIsICAyMjEsICAgMjc4LCAgIDMxOSwgICAzNzAsICAgNDA1LCAgIDQxNH0sCi0vKiA3MSUgKi97IDI0LCAgIDQxLCAgIDc0LCAgIDEzMCwgIDk1LCAgIDE3NCwgIDIxMiwgICAyNjUsICAgMzAzLCAgIDM1MCwgICAzODEsICAgMzg5fSwKLS8qIDcyJSAqL3sgMjMsICAgMzksICAgNzEsICAgMTI1LCAgOTAsICAgMTY3LCAgMjAyLCAgIDI1MiwgICAyODcsICAgMzI5LCAgIDM1OCwgICAzNjV9LAotLyogNzMlICoveyAyMiwgICAzNywgICA2NywgICAxMTksICA4NSwgICAxNTksICAxOTIsICAgMjM5LCAgIDI3MSwgICAzMTAsICAgMzM1LCAgIDM0Mn0sCi0vKiA3NCUgKi97IDIxLCAgIDM2LCAgIDYzLCAgIDExNCwgIDgwLCAgIDE1MSwgIDE4MywgICAyMjYsICAgMjU2LCAgIDI5MSwgICAzMTQsICAgMzIwfSwKLS8qIDc1JSAqL3sgMjAsICAgMzQsICAgNjAsICAgMTA5LCAgNzUsICAgMTQ0LCAgMTc0LCAgIDIxNCwgICAyNDEsICAgMjczLCAgIDI5NCwgICAyOTh9LAotLyogNzYlICoveyAxOSwgICAzMiwgICA1NywgICAxMDQsICA3MCwgICAxMzcsICAxNjQsICAgMjAyLCAgIDIyNywgICAyNTYsICAgMjc0LCAgIDI3OH0sCi0vKiA3NyUgKi97IDE4LCAgIDMxLCAgIDUzLCAgIDk5LCAgIDY2LCAgIDEzMCwgIDE1NSwgICAxOTAsICAgMjEzLCAgIDIzOSwgICAyNTYsICAgMjU5fSwKLS8qIDc4JSAqL3sgMTcsICAgMjksICAgNTAsICAgOTQsICAgNjIsICAgMTIyLCAgMTQ2LCAgIDE3OCwgICAyMDAsICAgMjIzLCAgIDIzOCwgICAyNDF9LAotLyogNzklICoveyAxNiwgICAyOCwgICA0NywgICA4OSwgICA1OCwgICAxMTUsICAxMzgsICAgMTY3LCAgIDE4NywgICAyMDgsICAgMjIyLCAgIDIyNX0sCi0vKiA4MCUgKi97IDE2LCAgIDI2LCAgIDQ0LCAgIDg0LCAgIDU0LCAgIDEwOSwgIDEyOSwgICAxNTYsICAgMTc1LCAgIDE5NCwgICAyMDYsICAgMjA5fSwKLS8qIDgxJSAqL3sgMTUsICAgMjQsICAgNDEsICAgNzksICAgNTAsICAgMTAyLCAgMTIxLCAgIDE0NiwgICAxNjMsICAgMTgwLCAgIDE5MiwgICAxOTR9LAotLyogODIlICoveyAxNCwgICAyMywgICAzOSwgICA3NCwgICA0NywgICA5NSwgICAxMTMsICAgMTM2LCAgIDE1MSwgICAxNjcsICAgMTc4LCAgIDE4MX0sCi0vKiA4MyUgKi97IDEzLCAgIDIxLCAgIDM2LCAgIDY5LCAgIDQ0LCAgIDg5LCAgIDEwNSwgICAxMjYsICAgMTQwLCAgIDE1NSwgICAxNjYsICAgMTY5fSwKLS8qIDg0JSAqL3sgMTIsICAgMjAsICAgMzMsICAgNjQsICAgNDEsICAgODIsICAgOTcsICAgIDExNiwgICAxMzAsICAgMTQ0LCAgIDE1NSwgICAxNTh9LAotLyogODUlICoveyAxMSwgICAxOSwgICAzMSwgICA2MCwgICAzOSwgICA3NiwgICA4OSwgICAgMTA3LCAgIDEyMCwgICAxMzQsICAgMTQ1LCAgIDE0OX0sCi0vKiA4NiUgKi97IDExLCAgIDE3LCAgIDI5LCAgIDU1LCAgIDM2LCAgIDcwLCAgIDgyLCAgICA5OCwgICAgMTEwLCAgIDEyNSwgICAxMzYsICAgMTQwfSwKLS8qIDg3JSAqL3sgMTAsICAgMTYsICAgMjYsICAgNTEsICAgMzQsICAgNjQsICAgNzUsICAgIDkwLCAgICAxMDIsICAgMTE2LCAgIDEyOCwgICAxMzN9LAotLyogODglICoveyA5LCAgICAxNCwgICAyNCwgICA0NiwgICAzMiwgICA1OCwgICA2OCwgICAgODEsICAgIDkzLCAgICAxMDgsICAgMTIxLCAgIDEyOH0sCi0vKiA4OSUgKi97IDgsICAgIDEzLCAgIDIyLCAgIDQyLCAgIDMxLCAgIDUyLCAgIDYxLCAgICA3NCwgICAgODYsICAgIDEwMiwgICAxMTYsICAgMTI0fSwKLS8qIDkwJSAqL3sgNywgICAgMTIsICAgMjEsICAgMzcsICAgMjksICAgNDYsICAgNTQsICAgIDY2LCAgICA3OSwgICAgOTYsICAgIDExMiwgICAxMjF9Ci19OwotCi0jZGVmaW5lIFJTU0lCVUZfTlVNIDEwCi0jZGVmaW5lIFJTU0kyUkFURV9TSVpFIDkKLQotc3RhdGljIFRYUkVUUllfUkVDIFR4UmF0ZVJlYz17TVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTIC0gMSwgMH07ICAgLy9uZXcgcmVjb3JkPT5UeFJhdGVSZWMKLXN0YXRpYyBpbnQgVHhSZXRyeVJhdGU7Ci0vL3N0YXRpYyBpbnQgU1EzLCBCU1NfUEtfQ05ULCBOSURMRVNMT1QsIFNMT1RfQ05ULCBJTlRFUkZfQ05ULCBHQVBfQ05ULCBEU19FVk07Ci1zdGF0aWMgczMyIFJTU0lCdWZbUlNTSUJVRl9OVU1dPXstNzAsIC03MCwgLTcwLCAtNzAsIC03MCwgLTcwLCAtNzAsIC03MCwgLTcwLCAtNzB9Owotc3RhdGljIHMzMiBSU1NJU21vb3RoZWQ9LTcwMDsKLXN0YXRpYyBpbnQgUlNTSUJ1ZkluZGV4PTA7Ci1zdGF0aWMgdTggbWF4X3Jzc2lfcmF0ZTsKLXN0YXRpYyBpbnQgcmF0ZV90YmxbMTNdID0gezAsMSwyLDUsMTEsNiw5LDEyLDE4LDI0LDM2LDQ4LDU0fTsKLS8vW1dLQ0hFTl1zdGF0aWMgY29yZV9kYXRhX3QgKnBNVE9jb3JlX2RhdGE9TlVMTDsKLQogc3RhdGljIGludCBUb3RhbFR4UGt0ID0gMDsKIHN0YXRpYyBpbnQgVG90YWxUeFBrdFJldHJ5ID0gMDsKLXN0YXRpYyBpbnQgVHhQa3RQZXJBbnRbM10gPSB7MCwwLDB9Owotc3RhdGljIGludCBSWFJTU0lBTlRbM10gPXstNzAsLTcwLC03MH07Ci1zdGF0aWMgaW50IFR4UGt0UmV0cnlQZXJBbnRbM10gPSB7MCwwLDB9OwotLy9zdGF0aWMgaW50IFR4RG9taW5hdGVGbGFnPUZBTFNFOwotc3RhdGljIHU4IG9sZF9hbnRlbm5hWzRdPXsxICwwICwxICwwfTsKIHN0YXRpYyBpbnQgcmV0cnlyYXRlX3JlY1tNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdOy8vdGhpcyByZWNvcmQgdGhlIHJldHJ5IHJhdGUgYXQgZGlmZmVyZW50IGRhdGEgcmF0ZQogCiBzdGF0aWMgaW50IFBlcmlvZFRvdGFsVHhQa3QgPSAwOwpAQCAtMjIxLDEyOCArNTcsMTQgQEAKIAl1OCAgVHhSYXRlOwogfVJTU0kyUkFURTsKIAotc3RhdGljIFJTU0kyUkFURSBSU1NJMlJhdGVUYmxbUlNTSTJSQVRFX1NJWkVdID0KLXsKLQl7LTc0MCwgMTA4fSwgIC8vIDU0TQotCXstNzYwLCA5Nn0sICAvLyA0OE0KLQl7LTgyMCwgNzJ9LCAgLy8gMzZNCi0Jey04NTAsIDQ4fSwgIC8vIDI0TQotCXstODcwLCAzNn0sICAvLyAxOE0KLQl7LTg5MCwgMjR9LCAgLy8gMTJNCi0Jey05MDAsIDEyfSwgIC8vIDZNCi0Jey05MjAsIDExfSwgLy8gNS41TQotCXstOTUwLCA0fSwgLy8gMk0KLX07Ci1zdGF0aWMgdTggdW50b2dnbGVjb3VudDsKLXN0YXRpYyB1OCBsYXN0X3JhdGVfYW50OyAvL3RoaXMgaXMgdXNlZCBmb3IgYW50ZW5uYSBiYWNrb2ZmLWhoCi0KLXU4CWJvU3BhcnNlVHhUcmFmZmljID0gRkFMU0U7CitzdGF0aWMgdTggYm9TcGFyc2VUeFRyYWZmaWMgPSBmYWxzZTsKIAogdm9pZCBNVE9fSW5pdChNVE9fRlVOQ19JTlBVVCk7Ci12b2lkIEFudGVubmFUb2dnbGVJbml0aWF0b3IoTVRPX0ZVTkNfSU5QVVQpOwotdm9pZCBBbnRlbm5hVG9nZ2xlU3RhdGUoTVRPX0ZVTkNfSU5QVVQpOwotdm9pZCBUeFB3ckNvbnRyb2woTVRPX0ZVTkNfSU5QVVQpOwotdm9pZCBHZXRGcmVzaEFudGVubmFEYXRhKE1UT19GVU5DX0lOUFVUKTsKIHZvaWQgVHhSYXRlUmVkdWN0aW9uQ3RybChNVE9fRlVOQ19JTlBVVCk7CiAvKiogMS4xLjMxLjEwMDAgVHVyYm8gbW9kaWZ5ICovCi0vL3ZvaWQgTVRPX1NldERUT1JhdGVSYW5nZShpbnQgdHlwZSk7Ci12b2lkIE1UT19TZXREVE9SYXRlUmFuZ2UoTVRPX0ZVTkNfSU5QVVQsIHU4ICpwUmF0ZUFycmF5LCB1OCBBcnJheVNpemUpOwogdm9pZCBNVE9fU2V0VHhDb3VudChNVE9fRlVOQ19JTlBVVCwgdTggdDAsIHU4IGluZGV4KTsKIHZvaWQgTVRPX1R4RmFpbGVkKE1UT19GVU5DX0lOUFVUKTsKLXZvaWQgU21vb3RoUlNTSShzMzIgbmV3X3Jzc2kpOwogdm9pZCBoYWxfZ2V0X2R0b19wYXJhKE1UT19GVU5DX0lOUFVULCBjaGFyICpidWZmZXIpOwotdTggQ2FsY05ld1JhdGUoTVRPX0ZVTkNfSU5QVVQsIHU4IG9sZF9yYXRlLCB1MzIgcmV0cnlfY250LCB1MzIgdHhfZnJhZ19jbnQpOwotdTggR2V0TWF4UmF0ZUxldmVsRnJvbVJTU0kodm9pZCk7Ci11OCBNVE9fR2V0VHhGYWxsYmFja1JhdGUoTVRPX0ZVTkNfSU5QVVQpOwotaW50IERpdmlkZShpbnQgYSwgaW50IGIpOwotdm9pZCBtdWx0aWFnYyhNVE9fRlVOQ19JTlBVVCwgdTggaGlnaF9nYWluX21vZGUpOwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIE1UT19Jbml0IC0tCi0vLwotLy8gIERlc2NyaXB0aW9uOgotLy8gICAgU2V0IERUTyBUeCBSYXRlIFNjb3BlIGJlY2F1c2UgZGlmZmVyZW50IEFQIGNvdWxkIGhhdmUgZGlmZmVyZW50IFJhdGUgc2V0LgotLy8gICAgQWZ0ZXIgb3VyIHN0YWlvbiBqb2luIHdpdGggQVAsIExNIGNvcmUgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZQotLy8gICAgVHggUmF0ZSB0YWJsZS4KLS8vCi0vLyAgQXJndW1lbnRzOgotLy8gICAgcFJhdGVBcnJheSAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIFR4IFJhdGUgQXJyYXkgYnkgdGhlIGZvbGxvd2luZyBvcmRlcgotLy8gICAgICAgICAgICAgICAgICAgIC0gMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4Ci0vLyAgICAgICAgICAgICAgICAgICAgLSBEVE8gd29uJ3QgY2hlY2sgd2hldGhlciByYXRlIG9yZGVyIGlzIGludmFsaWQgb3Igbm90Ci0vLyAgICBBcnJheVNpemUgICAgICAgLSBUaGUgYXJyYXkgc2l6ZSB0byBpbmRpY2F0ZSBob3cgbWFueSB0eCByYXRlIHdlIGNhbiBjaG9vc2UKLS8vCi0vLyAgc2FtcGxlIGNvZGU6Ci0vLwl7Ci0vLwkJdTggUmF0ZUFycmF5WzRdID0gezIsIDQsIDExLCAyMn07Ci0vLwkJTVRPX1NldERUT1JhdGVSYW5nZShSYXRlQXJyYXksIDQpOwotLy8JfQotLy8KLS8vICBSZXR1cm4gVmFsdWU6Ci0vLyAgICBOb25lCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXZvaWQgTVRPX1NldERUT1JhdGVSYW5nZShNVE9fRlVOQ19JTlBVVCx1OCAqcFJhdGVBcnJheSwgdTggQXJyYXlTaXplKQotewotCXU4CWksIGo9MDsKLQotCWZvcihpPTA7aTxBcnJheVNpemU7aSsrKQotCXsKLQkJaWYocFJhdGVBcnJheVtpXSA9PSAyMikKLQkJCWJyZWFrOwotCX0KLQlpZihpIDwgQXJyYXlTaXplKSAvL3dlIG5lZWQgYWRqdXN0IHRoZSBvcmRlciBvZiByYXRlIGxpc3QgYmVjYXVzZSAxMU1icHMgcmF0ZSBleGlzdHMKLQl7Ci0JCWZvcig7aT4wO2ktLSkKLQkJewotCQkJaWYocFJhdGVBcnJheVtpLTFdIDw9IDExKQotCQkJCWJyZWFrOwotCQkJcFJhdGVBcnJheVtpXSA9IHBSYXRlQXJyYXlbaS0xXTsKLQkJfQotCQlwUmF0ZUFycmF5W2ldID0gMjI7Ci0JCU1UT19PRkRNX1JBVEVfTEVWRUwoKSA9IGk7Ci0JfQotCWVsc2UKLQl7Ci0JCWZvcihpPTA7IGk8QXJyYXlTaXplOyBpKyspCi0JCXsKLQkJCWlmIChwUmF0ZUFycmF5W2ldID49IDEyKQotCQkJCWJyZWFrOwotCQl9Ci0JCU1UT19PRkRNX1JBVEVfTEVWRUwoKSA9IGk7Ci0JfQotCi0JZm9yKGk9MDtpPEFycmF5U2l6ZTtpKyspCi0JewotCQlNVE9fRGF0YV9SYXRlX1RibFtpXSA9IHBSYXRlQXJyYXlbaV07Ci0JCWZvcig7ajxNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFM7aisrKQotCQl7Ci0JCQlpZihTdGFyZGFyZF9EYXRhX1JhdGVfVGJsW2pdID09IHBSYXRlQXJyYXlbaV0pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJTGV2ZWwyUGVyVGJsW2ldID0gajsKLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIltNVE9dOk9wIFJhdGVbJWRdOiAlZFxuIixpLCBNVE9fRGF0YV9SYXRlX1RibFtpXSkpOwotCQkjZW5kaWYKLQl9Ci0JTVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwgPSBBcnJheVNpemU7Ci0JaWYoIE1UT19EQVRBKCkuUmF0ZVBvbGljeSApIC8vIDAgbWVhbnMgdGhhdCBubyByZWdpc3RyeSBzZXR0aW5nCi0JewotCQlpZiggTVRPX0RBVEEoKS5SYXRlUG9saWN5ID09IDEgKQotCQkJVHhSYXRlUmVjLnR4X3JhdGUgPSAwOwkvL2FzY2VudAotCQllbHNlCi0JCQlUeFJhdGVSZWMudHhfcmF0ZSA9IE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsIC0xIDsJLy9kZXNjZW50Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKCBNVE9fSU5JVFRYUkFURV9NT0RFICkKLQkJCVR4UmF0ZVJlYy50eF9yYXRlID0gMDsJLy9hc2NlbnQKLQkJZWxzZQotCQkJVHhSYXRlUmVjLnR4X3JhdGUgPSBNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCAtMSA7CS8vZGVzY2VudAotCX0KLQlUeFJhdGVSZWMudHhfcmV0cnlfcmF0ZSA9IDA7Ci0JLy9zZXQgZGVmYXVsdCByYXRlIGZvciBpbml0aWFsIHVzZQotCU1UT19SQVRFX0xFVkVMKCkgPSBUeFJhdGVSZWMudHhfcmF0ZTsKLQlNVE9fRkFMTEJBQ0tfUkFURV9MRVZFTCgpID0gTVRPX1JBVEVfTEVWRUwoKTsKLX0KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vICBNVE9fSW5pdCAtLQpAQCAtMzUzLDcgKzc1LDcgQEAKIC8vICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgZHVyaW5nIHN5c3RlbSBpbml0aWFsaXphdGlvbi4KIC8vCiAvLyAgQXJndW1lbnRzOgotLy8gICAgQWRhcHRlciAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIE1pbmlwb3J0IEFkYXB0ZXIgQ29udGV4dAorLy8gICAgYWRhcHRlciAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIE1pbmlwb3J0IGFkYXB0ZXIgQ29udGV4dAogLy8KIC8vICBSZXR1cm4gVmFsdWU6CiAvLyAgICBOb25lCkBAIC0zOTMsOCArMTE1LDggQEAKICAgICBNVE9fU1FfQU5UKDApICAgICAgID0gMDsKICAgICBNVE9fU1FfQU5UKDEpICAgICAgID0gMDsKICAgICBNVE9fQU5UX0RJVkVSU0lUWSgpID0gTVRPX0FOVEVOTkFfRElWRVJTSVRZX09OOwotICAgIC8vQ2FyZFNldF9BbnRlbm5hRGl2ZXJzaXR5KEFkYXB0ZXIsIE1UT19BTlRfRElWRVJTSVRZKCkpOwotICAgIC8vUExNRVNldEFudGVubmFEaXZlcnNpdHkoIEFkYXB0ZXIsIE1UT19BTlRfRElWRVJTSVRZKCkpOworICAgIC8vQ2FyZFNldF9BbnRlbm5hRGl2ZXJzaXR5KGFkYXB0ZXIsIE1UT19BTlRfRElWRVJTSVRZKCkpOworICAgIC8vUExNRVNldEFudGVubmFEaXZlcnNpdHkoIGFkYXB0ZXIsIE1UT19BTlRfRElWRVJTSVRZKCkpOwogCiAgICAgTVRPX0FHSU5HX1RJTUVPVVQoKSA9IDA7Ly9NVE9fVE1SX0FHSU5HKCkgLyBNVE9fVE1SX1BFUklPRElDKCk7CiAKQEAgLTQwMiw3ICsxMjQsNiBAQAogICAgIC8vCiAgICAgLy9NVE9fUkFURV9MRVZFTCgpICAgICAgICAgICAgPSAxMDsKICAgICBNVE9fUkFURV9MRVZFTCgpICAgICAgICAgICAgPSAwOwotCU1UT19GQUxMQkFDS19SQVRFX0xFVkVMKCkJPSBNVE9fUkFURV9MRVZFTCgpOwogICAgIE1UT19GUkFHX1RIX0xFVkVMKCkgICAgICAgICA9IDQ7CiAgICAgLyoqIDEuMS4yMy4xMDAwIFR1cmJvIG1vZGlmeSBmcm9tIC0xIHRvICsxCiAJTVRPX1JUU19USFJFU0hPTEQoKSAgICAgICAgID0gTVRPX0ZSQUdfVEgoKSAtIDE7CkBAIC00NzAsNjY5ICsxOTEsNiBAQAogCU1UT19EQVRBKCkuUlNTSV9sb3cgPSAtNjA7CiB9CiAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLXN0YXRpYyB1MzIgRFRPX1J4X0luZm9bMTNdWzNdOwotc3RhdGljIHUzMiBEVE9fUnhDUkNGYWlsX0luZm9bMTNdWzNdOwotc3RhdGljIHUzMiBBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj01OwotdHlwZWRlZiBzdHJ1Y3R7Ci0JaW50IFJ4UmF0ZTsKLQlpbnQgUnhSYXRlUGt0czsKLQlpbnQgaW5kZXg7Ci19UlhSQVRFX0FOVDsKLVJYUkFURV9BTlQgUnhSYXRlUGVha0FudFszXTsKLQotI2RlZmluZSBBTlQwICAgIDAKLSNkZWZpbmUgQU5UMSAgICAxCi0jZGVmaW5lIE9MRF9BTlQgMgotCi12b2lkIFNlYXJjaFBlYWtSeFJhdGUoaW50IGluZGV4KQotewotCWludCBpOwotCVJ4UmF0ZVBlYWtBbnRbaW5kZXhdLlJ4UmF0ZVBrdHM9MDsKLQkvL0ZpbmQgb3V0IHRoZSBiZXN0IHJ4IHJhdGUgd2hpY2ggaXMgdXNlZCBvbiBkaWZmZXJlbnQgYW50ZW5uYQotCWZvcihpPTE7aTwxMztpKyspCi0JewotCQlpZihEVE9fUnhfSW5mb1tpXVtpbmRleF0gPiAodTMyKSBSeFJhdGVQZWFrQW50W2luZGV4XS5SeFJhdGVQa3RzKQotCQl7Ci0JCQlSeFJhdGVQZWFrQW50W2luZGV4XS5SeFJhdGVQa3RzID0gRFRPX1J4X0luZm9baV1baW5kZXhdOwotCQkJUnhSYXRlUGVha0FudFtpbmRleF0uUnhSYXRlID0gcmF0ZV90YmxbaV07Ci0JCQlSeFJhdGVQZWFrQW50W2luZGV4XS5pbmRleCA9IGk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgUmVzZXREVE9fUnhJbmZvKGludCBpbmRleCwgTVRPX0ZVTkNfSU5QVVQpCi17Ci0JaW50IGk7Ci0KLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJSZXNldERUT3J4XG4iKSk7Ci0JI2VuZGlmCi0KLQlmb3IoaT0wO2k8MTM7aSsrKQotCQlEVE9fUnhfSW5mb1tpXVtpbmRleF0gPSBNVE9fSEFMKCktPnJ4X29rX2NvdW50W2ldOwotCi0JZm9yKGk9MDtpPDEzO2krKykKLQkJRFRPX1J4Q1JDRmFpbF9JbmZvW2ldW2luZGV4XSA9IE1UT19IQUwoKS0+cnhfZXJyX2NvdW50W2ldOwotCi0JVG90YWxUeFBrdCA9IDA7Ci0JVG90YWxUeFBrdFJldHJ5ID0gMDsKLX0KLQotdm9pZCBHZXREVE9fUnhJbmZvKGludCBpbmRleCwgTVRPX0ZVTkNfSU5QVVQpCi17Ci0JaW50IGk7Ci0KLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJHZXREVE9yeFxuIikpOwotCSNlbmRpZgotCi0JLy9QREVCVUcoKCJbTVRPXTpEVE9fUnhfSW5mb1slZF09JWQsIHJ4X29rX2NvdW50PSVkXG4iLCBpbmRleCwgRFRPX1J4X0luZm9bMF1baW5kZXhdLCBwaHdfZGF0YS0+cnhfb2tfY291bnRbMF0pKTsKLQlmb3IoaT0wO2k8MTM7aSsrKQotCQlEVE9fUnhfSW5mb1tpXVtpbmRleF0gPSBhYnMoTVRPX0hBTCgpLT5yeF9va19jb3VudFtpXSAtIERUT19SeF9JbmZvW2ldW2luZGV4XSk7Ci0JaWYoRFRPX1J4X0luZm9bMF1baW5kZXhdPT0wKSBEVE9fUnhfSW5mb1swXVtpbmRleF0gPSAxOwotCi0JZm9yKGk9MDtpPDEzO2krKykKLQkJRFRPX1J4Q1JDRmFpbF9JbmZvW2ldW2luZGV4XSA9IE1UT19IQUwoKS0+cnhfZXJyX2NvdW50W2ldIC0gRFRPX1J4Q1JDRmFpbF9JbmZvW2ldW2luZGV4XTsKLQotCVR4UGt0UGVyQW50W2luZGV4XSA9IFRvdGFsVHhQa3Q7Ci0JVHhQa3RSZXRyeVBlckFudFtpbmRleF0gPSBUb3RhbFR4UGt0UmV0cnk7Ci0JVG90YWxUeFBrdCA9IDA7Ci0JVG90YWxUeFBrdFJldHJ5ID0gMDsKLX0KLQotdm9pZCBPdXRwdXREZWJ1Z0luZm8oaW50IGluZGV4MSwgaW50IGluZGV4MikKLXsKLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJbSEhEVE9dOlRvdGFsIFJ4ICglZClcdFx0KCVkKSBcbiAiLCBEVE9fUnhfSW5mb1swXVtpbmRleDFdLCBEVE9fUnhfSW5mb1swXVtpbmRleDJdKSk7Ci0gICAgV0JERUJVRygoIltISERUT106UkVDRUlWRSBSU1NJOiAoJWQpXHRcdCglZCkgXG4gIiwgUlhSU1NJQU5UW2luZGV4MV0sIFJYUlNTSUFOVFtpbmRleDJdKSk7Ci0JV0JERUJVRygoIltISERUT106VFggcGFja2V0IGNvcnJlY3QgcmF0ZTogKCVkKSUlXHRcdCglZCklJSBcbiAiLERpdmlkZShUeFBrdFBlckFudFtpbmRleDFdKjEwMCxUeFBrdFJldHJ5UGVyQW50W2luZGV4MV0pLCBEaXZpZGUoVHhQa3RQZXJBbnRbaW5kZXgyXSoxMDAsVHhQa3RSZXRyeVBlckFudFtpbmRleDJdKSkpOwotCSNlbmRpZgotCXsKLQkJaW50IHRtcDEsIHRtcDI7Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbSEhEVE9dOlRvdGFsIFR4ICglZClcdFx0KCVkKSBcbiAiLCBUeFBrdFBlckFudFtpbmRleDFdLCBUeFBrdFBlckFudFtpbmRleDJdKSk7Ci0JCVdCREVCVUcoKCJbSEhEVE9dOlRvdGFsIFR4IHJldHJ5ICglZClcdFx0KCVkKSBcbiAiLCBUeFBrdFJldHJ5UGVyQW50W2luZGV4MV0sIFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgyXSkpOwotCQkjZW5kaWYKLQkJdG1wMSA9IFR4UGt0UGVyQW50W2luZGV4MV0gKyBEVE9fUnhfSW5mb1swXVtpbmRleDFdOwotCQl0bXAyID0gVHhQa3RQZXJBbnRbaW5kZXgyXSArIERUT19SeF9JbmZvWzBdW2luZGV4Ml07Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbSEhEVE9dOlRvdGFsIFR4K1JYICglZClcdFx0KCVkKSBcbiAiLCB0bXAxLCB0bXAyKSk7Ci0JCSNlbmRpZgotCX0KLX0KLQotdW5zaWduZWQgY2hhciBUeERvbWluYXRlKGludCBpbmRleCkKLXsKLQlpbnQgdG1wOwotCi0JdG1wID0gVHhQa3RQZXJBbnRbaW5kZXhdICsgRFRPX1J4X0luZm9bMF1baW5kZXhdOwotCi0JaWYoRGl2aWRlKFR4UGt0UGVyQW50W2luZGV4XSoxMDAsIHRtcCkgPiA0MCkKLQkJcmV0dXJuIFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgQ21wVHhSZXRyeVJhdGUoaW50IGluZGV4MSwgaW50IGluZGV4MikKLXsKLQlpbnQgdHhfcmV0cnlfcmF0ZTEsIHR4X3JldHJ5X3JhdGUyOwotCXR4X3JldHJ5X3JhdGUxID0gRGl2aWRlKChUeFBrdFJldHJ5UGVyQW50W2luZGV4MV0gLSBUeFBrdFBlckFudFtpbmRleDFdKSoxMDAsIFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgxXSk7Ci0JdHhfcmV0cnlfcmF0ZTIgPSBEaXZpZGUoKFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgyXSAtIFR4UGt0UGVyQW50W2luZGV4Ml0pKjEwMCwgVHhQa3RSZXRyeVBlckFudFtpbmRleDJdKTsKLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJbTVRPXTpUeFJldHJ5IEFudDA6ICglZCUlKSAgQW50MTogKCVkJSUpIFxuICIsIHR4X3JldHJ5X3JhdGUxLCB0eF9yZXRyeV9yYXRlMikpOwotCSNlbmRpZgotCi0JaWYodHhfcmV0cnlfcmF0ZTEgPiB0eF9yZXRyeV9yYXRlMikKLQkJcmV0dXJuIFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgR2V0RnJlc2hBbnRlbm5hRGF0YShNVE9fRlVOQ19JTlBVVCkKLXsKLSAgICB1OCAgICAgIHg7Ci0KLQl4ID0gaGFsX2dldF9hbnRlbm5hX251bWJlcihNVE9fSEFMKCkpOwotCS8vaGFsX2dldF9ic3NfcGtfY250KE1UT19IQUwoKSk7Ci0JLy9oYWxfZ2V0X2VzdF9zcTMoTVRPX0hBTCgpLCAxKTsKLQlvbGRfYW50ZW5uYVswXSA9IHg7Ci0JLy9pZiB0aGlzIGlzIHRoZSBmdW5jdGlvbiBmb3IgdGltZXIKLQlSZXNldERUT19SeEluZm8oeCwgTVRPX0ZVTkNfSU5QVVRfREFUQSk7Ci0JaWYoQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXIpCi0JCQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lci0tOwotCWlmIChhYnMobGFzdF9yYXRlX2FudC1NVE9fUkFURV9MRVZFTCgpKT4xKSAgLy9iYWNrb2ZmIHRpbWVyIHJlc2V0Ci0JCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTA7Ci0KLQlpZiAoTVRPX0FOVF9ESVZFUlNJVFkoKSAhPSBNVE9fQU5URU5OQV9ESVZFUlNJVFlfT04gfHwKLQkJTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkgIT0gMSkKLQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj0xOwotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIltISERUT106KipsYXN0IGRhdGEgcmF0ZT0lZCxub3cgZGF0YSByYXRlPSVkKiphbnRlbm5hIHRvZ2dsZSB0aW1lcj0lZCIsbGFzdF9yYXRlX2FudCxNVE9fUkFURV9MRVZFTCgpLEFudGVubmFUb2dnbGVCa29mZlRpbWVyKSk7Ci0JI2VuZGlmCi0JbGFzdF9yYXRlX2FudD1NVE9fUkFURV9MRVZFTCgpOwotCWlmKEFudGVubmFUb2dnbGVCa29mZlRpbWVyPT0wKQotCXsKLQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX1dBSVQwOwotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiW0hIRFRPXTo9PT1zdGF0ZSBpcyBzdGFydGluZz09Zm9yIGFudGVubmEgdG9nZ2xlPT09IikpOwotCQkjZW5kaWYKLQl9Ci0JZWxzZQotCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfSURMRTsKLQotCWlmICgoTVRPX0JBQ0tPRkZfVE1SKCkhPTApJiYoTVRPX1JBVEVfTEVWRUwoKT5NVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCAtIDMpKQotCXsKLQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX0lETEU7Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbSEhEVE9dOj09PXRoZSBkYXRhIHJhdGUgaXMgJWQgKGdvb2QpYW5kIHdpbGwgbm90IHRvb2dsZSAgPT09IixNVE9fREFUQV9SQVRFKCk+PjEpKTsKLQkJI2VuZGlmCi0JfQotCi0KLX0KLQotaW50IFdCX1BDUlsyXTsgLy9wYWNrZXQgY29ycmVjdCByYXRlCi0KLXZvaWQgQW50ZW5uYVRvZ2dsZVN0YXRlKE1UT19GVU5DX0lOUFVUKQotewotICAgIGludCBkZWNpZGVhbnRmbGFnID0gMDsKLQl1OCAgICAgIHg7Ci0JczMyICAgICByc3NpOwotCi0JaWYoTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkgIT0gMSkKLQkJcmV0dXJuOwotCXggPSBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKE1UT19IQUwoKSk7Ci0Jc3dpdGNoKE1UT19UT0dHTEVfU1RBVEUoKSkKLQl7Ci0KLQkgICAvL01pc3NpbmcuLi4uLgotCSAgIGNhc2UgVE9HR0xFX1NUQVRFX0lETEU6Ci0JIGNhc2UgVE9HR0xFX1NUQVRFX0JLT0ZGOgotCSAgICAgICAgICAgICBicmVhazs7Ci0KLQkJY2FzZSBUT0dHTEVfU1RBVEVfV0FJVDA6Ly89PT09PT09PQotCSAgICAgICAgICAgICAgIEdldERUT19SeEluZm8oeCwgTVRPX0ZVTkNfSU5QVVRfREFUQSk7Ci0JCQlzbWVfZ2V0X3Jzc2koTVRPX0ZVTkNfSU5QVVRfREFUQSwgJnJzc2kpOwotCQkJUlhSU1NJQU5UW3hdID0gcnNzaTsKLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXSAqKndhaXQwPT09PSBDb2xsZWN0aW5nIEFudCVkLS1yc3NpPSVkXG4iLCB4LFJYUlNTSUFOVFt4XSkpOwotCQkJI2VuZGlmCi0KLQkJCS8vY2hhbmdlIGFudGVubmEgYW5kIHJlc2V0IHRoZSBkYXRhIGF0IGNoYW5nZWQgYW50ZW5uYQotCQkJeCA9ICh+eCkgJiAweDAxOwotCQkJTVRPX0FOVF9TRUwoKSA9IHg7Ci0JCQloYWxfc2V0X2FudGVubmFfbnVtYmVyKE1UT19IQUwoKSwgTVRPX0FOVF9TRUwoKSk7Ci0JCQlMT0NBTF9BTlRFTk5BX05PKCkgPSB4OwotCi0JCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfV0FJVDE7Ly9nbyB0byB3YWl0MQotCQkJUmVzZXREVE9fUnhJbmZvKHgsIE1UT19GVU5DX0lOUFVUX0RBVEEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9HR0xFX1NUQVRFX1dBSVQxOi8vPT09PT13YWl0MQotCQkJLy9NVE9fQ05UX0FOVCh4KSA9IGhhbF9nZXRfYnNzX3BrX2NudChNVE9fSEFMKCkpOwotCQkJLy9SWFJTU0lBTlRbeF0gPSBoYWxfZ2V0X3Jzc2koTVRPX0hBTCgpKTsKLQkJCXNtZV9nZXRfcnNzaShNVE9fRlVOQ19JTlBVVF9EQVRBLCAmcnNzaSk7Ci0JCQlSWFJTU0lBTlRbeF0gPSByc3NpOwotCQkJR2V0RFRPX1J4SW5mbyh4LCBNVE9fRlVOQ19JTlBVVF9EQVRBKTsKLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXSAqKndhaXQxPT09PSBDb2xsZWN0aW5nIEFudCVkLS1yc3NpPSVkXG4iLCB4LFJYUlNTSUFOVFt4XSkpOwotCQkJI2VuZGlmCi0JCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfTUFLRURFU0lTSU9OOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9HR0xFX1NUQVRFX01BS0VERVNJU0lPTjoKLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXTpBbnQtLTAtLS0tLS0tLS0tLS0tLS0tLTEtLS1cbiIpKTsKLQkJCU91dHB1dERlYnVnSW5mbyhBTlQwLEFOVDEpOwotCQkJI2VuZGlmCi0JCQkvL1BERUJVRygoIltISERUT10gKipkZWNpc2lvbj09PT1cbiAiKSk7Ci0KLQkJCS8vPT09PT1mb2xsb3dpbmcgaXMgdGhlIGRlY2lzaW9uIHByb2R1cmNlCi0JCQkvLwotCQkJLy8gICAgZmlyc3Q6IGNvbXBhcmUgdGhlIHJzc2kgaWYgZGlmZmVyZW5jZSA+MTAKLQkJCS8vICAgICAgICAgICBzZWxlY3QgdGhlIGxhcmdlciBvbmUKLQkJCS8vICAgICAgICAgICAsb3RoZXJzIGdvIHRvIHNlY29uZAotCQkJLy8gICAgc2Vjb25kOiBjb21hcHJlIHRoZSB0eCtyeCBwYWNrZXQgY291bnQgaWYgZGlmZmVyZW5jZSA+MTAwCi0JCQkvLyAgICAgICAgICAgIHVzZSBsYXJnZXIgdG90YWwgcGFja2V0cyBhbnRlbm5hCi0JCQkvLyAgICB0aGlyZDo6Y29tcGFyZSB0aGUgdHggUEVSIGlmIHBhY2tldHM+MjAKLQkJCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlmZmVyZW5jZSA+NSUgdXNpbmcgdGhlIGJpZ2dlciBvbmUKLQkJCS8vCi0JCQkvLyAgICBmb3VydGg6Y29tcGFyZSB0aGUgUlggUEVSIGlmIHBhY2tldHM+MjAKLQkJCS8vICAgICAgICAgICAgICAgICAgICBpZiBQRVIgZGlmZmVyZW5jZSA8NSUKLQkJCS8vICAgICAgICAgICAgICAgICAgIHVzaW5nIG9sZCBhbnRlbm5hCi0JCQkvLwotCQkJLy8KLQkJCWlmIChhYnMoUlhSU1NJQU5UW0FOVDBdLVJYUlNTSUFOVFtBTlQxXSkgPiBNVE9QQVJBX1JTU0lfVEhfRk9SX0FOVERJVigpKS8vPT09PXJzc2lfdGgKLQkJCXsKLQkJCQlpZiAoUlhSU1NJQU5UW0FOVDBdPlJYUlNTSUFOVFtBTlQxXSkKLQkJCQl7Ci0JCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDA7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDE7Ci0JCQkJfQotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIlNlbGVjdCBhbnRlbm5hIGJ5IFJTU0lcbiIpKTsKLQkJCQkjZW5kaWYKLQkJCX0KLQkJCWVsc2UgaWYgIChhYnMoVHhQa3RQZXJBbnRbQU5UMF0gKyBEVE9fUnhfSW5mb1swXVtBTlQwXS1UeFBrdFBlckFudFtBTlQxXS1EVE9fUnhfSW5mb1swXVtBTlQxXSk8NTApLy89PT09PXRvdGFsIHBhY2tldF90aAotCQkJewotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIlRvdGFsIHR4L3J4IGlzIGNsb3NlXG4iKSk7Ci0JCQkJI2VuZGlmCi0JCQkJaWYgKFR4RG9taW5hdGUoQU5UMCkgJiYgVHhEb21pbmF0ZShBTlQxKSkKLQkJCQl7Ci0JCQkJCWlmICgoVHhQa3RQZXJBbnRbQU5UMF0+MTApICYmIChUeFBrdFBlckFudFtBTlQxXT4xMCkpLy89PT09dHggcGFja2V0X3RoCi0JCQkJCXsKLQkJCQkJCVdCX1BDUltBTlQwXT1EaXZpZGUoVHhQa3RQZXJBbnRbQU5UMF0qMTAwLFR4UGt0UmV0cnlQZXJBbnRbQU5UMF0pOwotCQkJCQkJV0JfUENSW0FOVDFdPURpdmlkZShUeFBrdFBlckFudFtBTlQxXSoxMDAsVHhQa3RSZXRyeVBlckFudFtBTlQxXSk7Ci0JCQkJCQlpZiAoYWJzKFdCX1BDUltBTlQwXS1XQl9QQ1JbQU5UMV0pPjUpLy8gdHggUEVSX3RoCi0JCQkJCQl7Ci0JCQkJCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQkJCQlXQkRFQlVHKCgiRGVjaWRlIGJ5IFR4IGNvcnJlY3QgcmF0ZVxuIikpOwotCQkJCQkJCSNlbmRpZgotCQkJCQkJCWlmIChXQl9QQ1JbQU5UMF0+V0JfUENSW0FOVDFdKQotCQkJCQkJCXsKLQkJCQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMDsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJZGVjaWRlYW50ZmxhZz0wOwotCQkJCQkJCXVudG9nZ2xlY291bnQrKzsKLQkJCQkJCQlNVE9fQU5UX01BQygpID0gb2xkX2FudGVubmFbMF07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlkZWNpZGVhbnRmbGFnPTA7Ci0JCQkJCQlNVE9fQU5UX01BQygpID0gb2xkX2FudGVubmFbMF07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKERUT19SeF9JbmZvWzBdW0FOVDBdPjEwKSYmKERUT19SeF9JbmZvWzBdW0FOVDFdPjEwKSkvL3J4IHBhY2tldCB0aAotCQkJCXsKLQkJCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQkJV0JERUJVRygoIkRlY2lkZSBieSBSeFxuIikpOwotCQkJCQkjZW5kaWYKLQkJCQkJaWYgKGFicyhEVE9fUnhfSW5mb1swXVtBTlQwXSAtIERUT19SeF9JbmZvWzBdW0FOVDFdKT41MCkKLQkJCQkJewotCQkJCQkJaWYgKERUT19SeF9JbmZvWzBdW0FOVDBdID4gRFRPX1J4X0luZm9bMF1bQU5UMV0pCi0JCQkJCQl7Ci0JCQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQwOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWRlY2lkZWFudGZsYWc9MDsKLQkJCQkJCXVudG9nZ2xlY291bnQrKzsKLQkJCQkJCU1UT19BTlRfTUFDKCkgPSBvbGRfYW50ZW5uYVswXTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlkZWNpZGVhbnRmbGFnPTA7Ci0JCQkJCU1UT19BTlRfTUFDKCkgPSBvbGRfYW50ZW5uYVswXTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICgoVHhQa3RQZXJBbnRbQU5UMF0rRFRPX1J4X0luZm9bMF1bQU5UMF0pPihUeFBrdFBlckFudFtBTlQxXStEVE9fUnhfSW5mb1swXVtBTlQxXSkpLy91c2UgbW9yZSBwYWNrZWt0cwotCQkJewotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoImRlY2lkZSBieSB0b3RhbCB0eC9yeCA6IEFOVCAwXG4iKSk7Ci0JCQkJI2VuZGlmCi0KLQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDA7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQlXQkRFQlVHKCgiZGVjaWRlIGJ5IHRvdGFsIHR4L3J4IDogQU5UIDFcbiIpKTsKLQkJCQkjZW5kaWYKLQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDE7Ci0KLQkJCX0KLQkJCS8vdGhpcyBpcyBmb3JjZSBhbnQgdG9nZ2xlCi0JCQlpZiAoZGVjaWRlYW50ZmxhZz09MSkKLQkJCQl1bnRvZ2dsZWNvdW50PTA7Ci0KLQkJCXVudG9nZ2xlY291bnQ9dW50b2dnbGVjb3VudCU0OwotCQkJaWYgKHVudG9nZ2xlY291bnQ9PTMpIC8vY2hhbmdlIGFudGVubmEKLQkJCQlNVE9fQU5UX01BQygpID0gKCh+b2xkX2FudGVubmFbMF0pICYgMHgxKTsKLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXTo9PT09PT09PT09PT09PT09PT11bnRvZ2dsZS1jb3VudD0lZCIsdW50b2dnbGVjb3VudCkpOwotCQkJI2VuZGlmCi0KLQotCi0KLQkJCS8vUERFQlVHKCgiW0hIRFRPXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqRFRPIEVOQUJMRT0lZCIsTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkpKTsKLQkJCWlmKE1UT19BTlRfRElWRVJTSVRZX0VOQUJMRSgpID09IDEpCi0JCQl7Ci0JCQkJCU1UT19BTlRfU0VMKCkgPSBNVE9fQU5UX01BQygpOwotCQkJCQloYWxfc2V0X2FudGVubmFfbnVtYmVyKE1UT19IQUwoKSwgTVRPX0FOVF9TRUwoKSk7Ci0JCQkJCUxPQ0FMX0FOVEVOTkFfTk8oKSA9IE1UT19BTlRfU0VMKCk7Ci0JCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJCVdCREVCVUcoKCJbSEhEVE9dID09ZGVjaXNpb249PSoqKioqKiphbnRmbGFnPSVkKioqKioqKioqKioqKioqKioqc2VsZWN0ZWQgYW50ZW5uYT0lZFxuIixkZWNpZGVhbnRmbGFnLE1UT19BTlRfU0VMKCkpKTsKLQkJCQkJI2VuZGlmCi0JCQl9Ci0JCQlpZiAoZGVjaWRlYW50ZmxhZykKLQkJCXsKLQkJCQlvbGRfYW50ZW5uYVszXT1vbGRfYW50ZW5uYVsyXTsvL3N0b3JlIGFudGVubmEgaW5mbwotCQkJCW9sZF9hbnRlbm5hWzJdPW9sZF9hbnRlbm5hWzFdOwotCQkJCW9sZF9hbnRlbm5hWzFdPW9sZF9hbnRlbm5hWzBdOwotCQkJCW9sZF9hbnRlbm5hWzBdPSBNVE9fQU5UX01BQygpOwotCQkJfQotCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCVdCREVCVUcoKCJbSEhEVE9dOioqb2xkIGFudGVubmE9WyVkXVslZF1bJWRdWyVkXVxuIixvbGRfYW50ZW5uYVswXSxvbGRfYW50ZW5uYVsxXSxvbGRfYW50ZW5uYVsyXSxvbGRfYW50ZW5uYVszXSkpOwotCQkJI2VuZGlmCi0JCQlpZiAob2xkX2FudGVubmFbMF0hPW9sZF9hbnRlbm5hWzFdKQotCQkJCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTA7Ci0JCQllbHNlIGlmIChvbGRfYW50ZW5uYVsxXSE9b2xkX2FudGVubmFbMl0pCi0JCQkJQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9MTsKLQkJCWVsc2UgaWYgKG9sZF9hbnRlbm5hWzJdIT1vbGRfYW50ZW5uYVszXSkKLQkJCQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj0yOwotCQkJZWxzZQotCQkJCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTQ7Ci0KLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXToqKmJhY2sgb2ZmIHRpbWVyPSVkIixBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcikpOwotCQkJI2VuZGlmCi0KLQkJCVJlc2V0RFRPX1J4SW5mbyhNVE9fQU5UX01BQygpLCBNVE9fRlVOQ19JTlBVVF9EQVRBKTsKLQkJCWlmIChBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj09MCAmJiBkZWNpZGVhbnRmbGFnKQotCQkJCU1UT19UT0dHTEVfU1RBVEUoKSA9IFRPR0dMRV9TVEFURV9XQUlUMDsKLQkJCWVsc2UKLQkJCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfSURMRTsKLQkJCWJyZWFrOwotCX0KLQotfQotCi12b2lkIG11bHRpYWdjKE1UT19GVU5DX0lOUFVULCB1OCBoaWdoX2dhaW5fbW9kZSApCi17Ci0JczMyCQlyc3NpOwotCWh3X2RhdGFfdAkqcEh3RGF0YSA9IE1UT19IQUwoKTsKLQotCXNtZV9nZXRfcnNzaShNVE9fRlVOQ19JTlBVVF9EQVRBLCAmcnNzaSk7Ci0KLQlpZiggKFJGX1dCXzI0MiA9PSBwSHdEYXRhLT5waHlfdHlwZSkgfHwKLQkJKFJGX1dCXzI0Ml8xID09IHBId0RhdGEtPnBoeV90eXBlKSApIC8vIDIwMDYwNjE5LjUgQWRkCi0JewotCQlpZiAoaGlnaF9nYWluX21vZGU9PTEpCi0JCXsKLQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MEMsIDB4ZjhmNTIyMzApOwotCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNkM0MzQ0MCk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMEMsIDB4RjJGMzIyMzIgKTsgLy8gOTQwOTE2IDB4ZjhmNTIyMzAgKTsKLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAyMCwgMHgwNGNiMzQ0MCApOyAvLyA5NDA5MTUgMHgwNkM0MzQ0MAotCQl9Ci0JCWVsc2UgaWYgKGhpZ2hfZ2Fpbl9tb2RlPT0wKQotCQl7Ci0JCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweEVFRUUwMDBEKTsKLQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MjAsIDB4MDZjNDE0NDApOwotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDBDLCAweEVFRUUwMDBEICk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMjAsIDB4MDRjYjE0NDAgKTsgLy8gOTQwOTE1IDB4MDZjNDE0NDAKLQkJfQotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiW0hIRFRPQUdDXSAqKnJzc2k9JWQsIGhpZ2ggZ2FpbiBtb2RlPSVkIiwgcnNzaSwgaGlnaF9nYWluX21vZGUpKTsKLQkJI2VuZGlmCi0JfQotfQotCi12b2lkIFR4UHdyQ29udHJvbChNVE9fRlVOQ19JTlBVVCkKLXsKLSAgICBzMzIgICAgIHJzc2k7Ci0JaHdfZGF0YV90CSpwSHdEYXRhID0gTVRPX0hBTCgpOwotCi0Jc21lX2dldF9yc3NpKE1UT19GVU5DX0lOUFVUX0RBVEEsICZyc3NpKTsKLQlpZiggKFJGX1dCXzI0MiA9PSBwSHdEYXRhLT5waHlfdHlwZSkgfHwKLQkJKFJGX1dCXzI0Ml8xID09IHBId0RhdGEtPnBoeV90eXBlKSApIC8vIDIwMDYwNjE5LjUgQWRkCi0JewotCQlzdGF0aWMgdTggaGlnaF9nYWluX21vZGU7IC8vdGhpcyBpcyBmb3Igd2luYm9uZCBSRiBzd2l0Y2ggTE5BCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2luZyBkaWZmZXJlbnQgcmVnaXN0ZXIgc2V0dGluZwotCi0JCWlmIChoaWdoX2dhaW5fbW9kZT09MSkKLQkJewotCQkJaWYoIHJzc2kgPiBNVE9fREFUQSgpLlJTU0lfaGlnaCApCi0JCQl7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgwQywgMHhmOGY1MjIzMCk7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNTU0MTY0MCk7Ci0JCQkJaGlnaF9nYWluX21vZGU9MDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweGY4ZjUxODMwKTsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDIwLCAweDA1NTQzRTQwKTsKLQkJCQloaWdoX2dhaW5fbW9kZT0xOwotCQkJfQotCQl9Ci0JCWVsc2UgLy9pZiAoaGlnaF9nYWluX21vZGU9PTApCi0JCXsKLQkJCWlmKCByc3NpIDwgTVRPX0RBVEEoKS5SU1NJX2xvdyApCi0JCQl7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgwQywgMHhmOGY1MTgzMCk7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNTU0M0U0MCk7Ci0JCQkJaGlnaF9nYWluX21vZGU9MTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweGY4ZjUyMjMwKTsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDIwLCAweDA1NTQxNjQwKTsKLQkJCQloaWdoX2dhaW5fbW9kZT0wOwotCQkJfQotCQl9Ci0KLQkJLy8gQWx3YXlzIGhpZ2ggZ2FpbiAyMDA1MTAxNC4gVXNpbmcgdGhlIGluaXRpYWwgdmFsdWUgb25seS4KLQkJbXVsdGlhZ2MoTVRPX0ZVTkNfSU5QVVRfREFUQSwgaGlnaF9nYWluX21vZGUpOwotCX0KLX0KLQotCi11OCBDYWxjTmV3UmF0ZShNVE9fRlVOQ19JTlBVVCwgdTggb2xkX3JhdGUsIHUzMiByZXRyeV9jbnQsIHUzMiB0eF9mcmFnX2NudCkKLXsKLQlpbnQgaTsKLQl1OCBuZXdfcmF0ZTsKLSAgICB1MzIgcmV0cnlfcmF0ZTsKLQlpbnQgVHhUaHJvdXB1dDEsIFR4VGhyb3VwdXQyLCBUeFRocm91cHV0MywgQmVzdFRocm91cGh0OwotCi0JaWYodHhfZnJhZ19jbnQgPCBNVE9QQVJBX1RYQ09VTlRfVEhfRk9SX0NBTENfUkFURSgpKSAvL3RvbyBmZXcgcGFja2V0cyB0cmFuc21pdAotCXsKLQkJcmV0dXJuIDB4ZmY7Ci0JfQotCXJldHJ5X3JhdGUgPSBEaXZpZGUocmV0cnlfY250ICogMTAwLCB0eF9mcmFnX2NudCk7Ci0KLQlpZihyZXRyeV9yYXRlID4gOTApIHJldHJ5X3JhdGUgPSA5MDsgLy9hbHdheXMgdHJ1bmNhdGUgdG8gOTAlIGR1ZSB0byBsb29rdXAgdGFibGUgc2l6ZQotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIiMjIyMjIEN1cnJlbnQgbGV2ZWwgPSVkLCBSZXRyeSBjb3VudCA9JWQsIEZyYWcgY291bnQgPSVkXG4iLAotCQkJCQkJb2xkX3JhdGUsIHJldHJ5X2NudCwgdHhfZnJhZ19jbnQpKTsKLQlXQkRFQlVHKCgiKiMjKiBSZXRyeSByYXRlID0lZCwgdGhyb3VnaHB1dCA9JWRcbiIsCi0JCQkJCQlyZXRyeV9yYXRlLCBSYXRlX1BFUl9UQkxbcmV0cnlfcmF0ZV1bb2xkX3JhdGVdKSk7Ci0JV0JERUJVRygoIlR4UmF0ZVJlYy50eF9yYXRlID0lZCwgUmV0cnkgcmF0ZSA9ICVkLCB0aHJvdWdocHV0ID0gJWRcbiIsCi0JCQkJCQlUeFJhdGVSZWMudHhfcmF0ZSwgVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGUsCi0JCQkJCQlSYXRlX1BFUl9UQkxbVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGVdW0xldmVsMlBlclRibFtUeFJhdGVSZWMudHhfcmF0ZV1dKSk7Ci0JV0JERUJVRygoIm9sZF9yYXRlLTEgPSVkLCBSZXRyeSByYXRlID0gJWQsIHRocm91Z2hwdXQgPSAlZFxuIiwKLQkJCQkJCW9sZF9yYXRlLTEsIHJldHJ5cmF0ZV9yZWNbb2xkX3JhdGUtMV0sCi0JCQkJCQlSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZS0xXV1bb2xkX3JhdGUtMV0pKTsKLQlXQkRFQlVHKCgib2xkX3JhdGUrMSA9JWQsIFJldHJ5IHJhdGUgPSAlZCwgdGhyb3VnaHB1dCA9ICVkXG4iLAotCQkJCQkJb2xkX3JhdGUrMSwgcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXSwKLQkJCQkJCVJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdXVtvbGRfcmF0ZSsxXSkpOwotCSNlbmRpZgotCi0JLy9mb2xsb3dpbmcgaXMgZm9yIHJlY29yZCB0aGUgcmV0cnkgcmF0ZSBhdCB0aGUgZGlmZmVyZW50IGRhdGEgcmF0ZQotCWlmIChhYnMocmV0cnlfcmF0ZS1yZXRyeXJhdGVfcmVjW29sZF9yYXRlXSk8NTApLy8tLS10aGUgcGVyIFRICi0JCXJldHJ5cmF0ZV9yZWNbb2xkX3JhdGVdID0gcmV0cnlfcmF0ZTsgLy91cGRhdGUgcmV0cnkgcmF0ZQotCWVsc2UKLQl7Ci0JCWZvciAoaT0wO2k8TVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWw7aSsrKSAvL3Jlc2V0IGFsbCByZXRyeSByYXRlCi0JCQlyZXRyeXJhdGVfcmVjW2ldPTA7Ci0JCXJldHJ5cmF0ZV9yZWNbb2xkX3JhdGVdID0gcmV0cnlfcmF0ZTsKLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIlJlc2V0IHJldHJ5IHJhdGUgdGFibGVcbiIpKTsKLQkJI2VuZGlmCi0JfQotCi0JaWYoVHhSYXRlUmVjLnR4X3JhdGUgPiBvbGRfcmF0ZSkgICAvL0RlY3JlYXNlIFR4IFJhdGUKLQl7Ci0JCVR4VGhyb3VwdXQxID0gUmF0ZV9QRVJfVEJMW1R4UmF0ZVJlYy50eF9yZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbVHhSYXRlUmVjLnR4X3JhdGVdXTsKLQkJVHhUaHJvdXB1dDIgPSBSYXRlX1BFUl9UQkxbcmV0cnlfcmF0ZV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlXV07Ci0JCWlmKFR4VGhyb3VwdXQxID4gVHhUaHJvdXB1dDIpCi0JCXsKLQkJCW5ld19yYXRlID0gVHhSYXRlUmVjLnR4X3JhdGU7Ci0JCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW5ld19yYXRlID0gb2xkX3JhdGU7Ci0JCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MjsKLQkJfQotCQlpZigob2xkX3JhdGUgPiAwKSAmJihyZXRyeV9yYXRlPk1UT1BBUkFfVFhSQVRFX0RFQ19USCgpKSkgICAvL01pbiBSYXRlCi0JCXsKLQkJCVR4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUtMV1dW0xldmVsMlBlclRibFtvbGRfcmF0ZS0xXV07Ci0JCQlpZihCZXN0VGhyb3VwaHQgPCBUeFRocm91cHV0MykKLQkJCXsKLQkJCQluZXdfcmF0ZSA9IG9sZF9yYXRlIC0gMTsKLQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCVdCREVCVUcoKCItLS0tLS0tLVxuIikpOwotCQkJCSNlbmRpZgotCQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQzOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgaWYoVHhSYXRlUmVjLnR4X3JhdGUgPCBvbGRfcmF0ZSkgIC8vSW5jcmVhc2UgVHggUmF0ZQotCXsKLQkJVHhUaHJvdXB1dDEgPSBSYXRlX1BFUl9UQkxbVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGVdW0xldmVsMlBlclRibFtUeFJhdGVSZWMudHhfcmF0ZV1dOwotCQlUeFRocm91cHV0MiA9IFJhdGVfUEVSX1RCTFtyZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGVdXTsKLQkJaWYoVHhUaHJvdXB1dDEgPiBUeFRocm91cHV0MikKLQkJewotCQkJbmV3X3JhdGUgPSBUeFJhdGVSZWMudHhfcmF0ZTsKLQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQxOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbmV3X3JhdGUgPSBvbGRfcmF0ZTsKLQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQyOwotCQl9Ci0JCWlmICgob2xkX3JhdGUgPCBNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCAtIDEpJiYocmV0cnlfcmF0ZTxNVE9QQVJBX1RYUkFURV9JTkNfVEgoKSkpCi0JCXsKLQkJCS8vVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlKzFdXTsKLQkJCWlmIChyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdID4gTVRPUEFSQV9UWFJFVFJZUkFURV9SRURVQ0UoKSkKLQkJCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdLU1UT1BBUkFfVFhSRVRSWVJBVEVfUkVEVUNFKCldW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQllbHNlCi0JCQkJVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlKzFdXTsKLQkJCWlmKEJlc3RUaHJvdXBodCA8IFR4VGhyb3VwdXQzKQotCQkJewotCQkJCW5ld19yYXRlID0gb2xkX3JhdGUgKyAxOwotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIisrKysrKysrKytcbiIpKTsKLQkJCQkjZW5kaWYKLQkJCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MzsKLQkJCX0KLQkJfQotCX0KLQllbHNlICAvL1R4IFJhdGUgbm8gY2hhbmdlCi0JewotCQlUeFRocm91cHV0MiA9IFJhdGVfUEVSX1RCTFtyZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGVdXTsKLQkJbmV3X3JhdGUgPSBvbGRfcmF0ZTsKLQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDI7Ci0KLQkJaWYgKHJldHJ5X3JhdGUgPE1UT1BBUkFfVFhSQVRFX0VRX1RIKCkpICAgIC8vdGggZm9yIGNoYW5nZSBoaWdoZXIgcmF0ZQotCQl7Ci0JCQlpZihvbGRfcmF0ZSA8IE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsIC0gMSkKLQkJCXsKLQkJCQkvL1R4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV1dW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQkJaWYgKHJldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV0gPiBNVE9QQVJBX1RYUkVUUllSQVRFX1JFRFVDRSgpKQotCQkJCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdLU1UT1BBUkFfVFhSRVRSWVJBVEVfUkVEVUNFKCldW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQkJZWxzZQotCQkJCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUrMV1dOwotCQkJCWlmKEJlc3RUaHJvdXBodCA8IFR4VGhyb3VwdXQzKQotCQkJCXsKLQkJCQkJbmV3X3JhdGUgPSBvbGRfcmF0ZSArIDE7Ci0JCQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQzOwotCQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCQlXQkRFQlVHKCgiPSsrKysrKysrKytcbiIpKTsKLQkJCQkJI2VuZGlmCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJaWYob2xkX3JhdGUgPiAwKSAgIC8vTWluIFJhdGUKLQkJewotCQkJVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZS0xXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlLTFdXTsKLQkJCWlmKEJlc3RUaHJvdXBodCA8IFR4VGhyb3VwdXQzKQotCQkJewotCQkJCW5ld19yYXRlID0gb2xkX3JhdGUgLSAxOwotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIj0tLS0tLS0tLVxuIikpOwotCQkJCSNlbmRpZgotCQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQzOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFMT0NBTF9JU19JQlNTX01PREUoKSkKLQl7Ci0JbWF4X3Jzc2lfcmF0ZSA9IEdldE1heFJhdGVMZXZlbEZyb21SU1NJKCk7Ci0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiW01UT106UlNTSTJSYXRlPSVkXG4iLCBNVE9fRGF0YV9SYXRlX1RibFttYXhfcnNzaV9yYXRlXSkpOwotCSNlbmRpZgotCWlmKG5ld19yYXRlID4gbWF4X3Jzc2lfcmF0ZSkKLQkJbmV3X3JhdGUgPSBtYXhfcnNzaV9yYXRlOwotCX0KLQotCS8vc2F2ZSBuZXcgcmF0ZTsKLQlUeFJhdGVSZWMudHhfcmF0ZSA9IG9sZF9yYXRlOwotCVR4UmF0ZVJlYy50eF9yZXRyeV9yYXRlID0gKHU4KSByZXRyeV9yYXRlOwotCVR4UmV0cnlSYXRlID0gcmV0cnlfcmF0ZTsKLQlyZXR1cm4gbmV3X3JhdGU7Ci19Ci0KLXZvaWQgU21vb3RoUlNTSShzMzIgbmV3X3Jzc2kpCi17Ci0JUlNTSVNtb290aGVkID0gUlNTSVNtb290aGVkICsgbmV3X3Jzc2kgLSBSU1NJQnVmW1JTU0lCdWZJbmRleF07Ci0JUlNTSUJ1ZltSU1NJQnVmSW5kZXhdID0gbmV3X3Jzc2k7Ci0JUlNTSUJ1ZkluZGV4ID0gKFJTU0lCdWZJbmRleCArIDEpICUgMTA7Ci19Ci0KLXU4IEdldE1heFJhdGVMZXZlbEZyb21SU1NJKHZvaWQpCi17Ci0JdTggaTsKLQl1OCBUeFJhdGU7Ci0KLQlmb3IoaT0wO2k8UlNTSTJSQVRFX1NJWkU7aSsrKQotCXsKLQkJaWYoUlNTSVNtb290aGVkID4gUlNTSTJSYXRlVGJsW2ldLlJTU0kpCi0JCQlicmVhazsKLQl9Ci0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiW01UT106UlNTST0lZFxuIiwgRGl2aWRlKFJTU0lTbW9vdGhlZCwgMTApKSk7Ci0JI2VuZGlmCi0JaWYoaSA8IFJTU0kyUkFURV9TSVpFKQotCQlUeFJhdGUgPSBSU1NJMlJhdGVUYmxbaV0uVHhSYXRlOwotCWVsc2UKLQkJVHhSYXRlID0gMjsgIC8vZGl2aWRlZCBieSAyID0gMU1icHMKLQotCWZvcihpPU1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsLTE7aT4wO2ktLSkKLQl7Ci0JCWlmKFR4UmF0ZSA+PU1UT19EYXRhX1JhdGVfVGJsW2ldKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBpOwotfQotCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gIERlc2NyaXB0aW9uOgogLy8gICAgICBJZiB3ZSBlbmFibGUgRFRPLCB3ZSB3aWxsIGlnbm9yZSB0aGUgdHggY291bnQgd2l0aCBkaWZmZXJlbnQgdHggcmF0ZSBmcm9tCkBAIC0xMTk0LDM2ICsyNTIsMyBAQAogCVBlcmlvZFRvdGFsVHhQa3QgKys7CiAJUGVyaW9kVG90YWxUeFBrdFJldHJ5ICs9IChpbmRleCsxKTsKIH0KLQotdTggTVRPX0dldFR4RmFsbGJhY2tSYXRlKE1UT19GVU5DX0lOUFVUKQotewotCXJldHVybiBNVE9fREFUQV9GQUxMQkFDS19SQVRFKCk7Ci19Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBNVE9fVHhGYWlsZWQgLS0KLS8vCi0vLyAgRGVzY3JpcHRpb246Ci0vLyAgICBGYWlsdXJlIG9mIHRyYW5zbWl0dGluZyBhIHBhY2tldCBpbmRpY2F0ZXMgdGhhdCBjZXJ0YWluIE1UTyBwYXJtZXRlcnMKLS8vICAgIG1heSBuZWVkIHRvIGJlIGFkanVzdGVkLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIE5JQyBqdXN0IGZhaWxlZAotLy8gICAgdG8gdHJhbnNtaXQgYSBwYWNrZXQgb3Igd2hlbiBNU0RVTGlmZVRpbWUgZXhwaXJlZC4KLS8vCi0vLyAgQXJndW1lbnRzOgotLy8gICAgQWRhcHRlciAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIE1pbmlwb3J0IEFkYXB0ZXIgQ29udGV4dAotLy8KLS8vICBSZXR1cm4gVmFsdWU6Ci0vLyAgICBOb25lCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXZvaWQgTVRPX1R4RmFpbGVkKE1UT19GVU5DX0lOUFVUKQotewotCXJldHVybjsKLX0KLQotaW50IERpdmlkZShpbnQgYSwgaW50IGIpCi17Ci0JaWYgKGI9PTApIGI9MTsKLQlyZXR1cm4gYS9iOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmgKaW5kZXggZjQ3OTM2Zi4uMGQzNzc1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmgKQEAgLTExLDYgKzExLDggQEAKICNpZm5kZWYgX19NVE9fSF9fCiAjZGVmaW5lIF9fTVRPX0hfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogI2RlZmluZSBNVE9fREVGQVVMVF9USF9DTlQgICAgICAgICAgICAgIDUKICNkZWZpbmUgTVRPX0RFRkFVTFRfVEhfU1EzICAgICAgICAgICAgICAxMTIgIC8vT0xEIElTIDEzIHJlZmVyZW5jZSBKb2huWHUKICNkZWZpbmUgTVRPX0RFRkFVTFRfVEhfSURMRV9TTE9UICAgICAgICAxNQpAQCAtMTI5LDE3ICsxMzEsMTcgQEAKIH0gTVRPX1BBUkFNRVRFUlMsICpQTVRPX1BBUkFNRVRFUlM7CiAKIAotI2RlZmluZSBNVE9fRlVOQ19JTlBVVCAgICAgICAgICAgICAgUFdCMzJfQURBUFRFUglBZGFwdGVyCi0jZGVmaW5lIE1UT19GVU5DX0lOUFVUX0RBVEEgICAgICAgICBBZGFwdGVyCi0jZGVmaW5lIE1UT19EQVRBKCkgICAgICAgICAgICAgICAgICAoQWRhcHRlci0+c010b1BhcmEpCi0jZGVmaW5lIE1UT19IQUwoKSAgICAgICAgICAgICAgICAgICAoJkFkYXB0ZXItPnNId0RhdGEpCisjZGVmaW5lIE1UT19GVU5DX0lOUFVUICAgICAgICAgICAgICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKglhZGFwdGVyCisjZGVmaW5lIE1UT19GVU5DX0lOUFVUX0RBVEEgICAgICAgICBhZGFwdGVyCisjZGVmaW5lIE1UT19EQVRBKCkgICAgICAgICAgICAgICAgICAoYWRhcHRlci0+c010b1BhcmEpCisjZGVmaW5lIE1UT19IQUwoKSAgICAgICAgICAgICAgICAgICAoJmFkYXB0ZXItPnNId0RhdGEpCiAjZGVmaW5lIE1UT19TRVRfUFJFQU1CTEVfVFlQRSh4KSAgICAvLyAyMDA0MDUxMSBUdXJibyBtYXJrIExNX1BSRUFNQkxFX1RZUEUoJnBjb3JlX2RhdGEtPmxtX2RhdGEpID0gKHgpCi0jZGVmaW5lIE1UT19FTkFCTEUJCQkJCShBZGFwdGVyLT5zTG9jYWxQYXJhLlR4UmF0ZU1vZGUgPT0gUkFURV9BVVRPKQotI2RlZmluZSBNVE9fVFhQT1dFUl9GUk9NX0VFUFJPTQkJKEFkYXB0ZXItPnNId0RhdGEuUG93ZXJJbmRleEZyb21FRVBST00pCi0jZGVmaW5lIExPQ0FMX0FOVEVOTkFfTk8oKQkJCShBZGFwdGVyLT5zTG9jYWxQYXJhLmJBbnRlbm5hTm8pCi0jZGVmaW5lIExPQ0FMX0lTX0NPTk5FQ1RFRCgpCQkoQWRhcHRlci0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXggIT0gMCkKLSNkZWZpbmUgTE9DQUxfSVNfSUJTU19NT0RFKCkJCShBZGFwdGVyLT5hc0JTU0Rlc2NyaXB0RWxlbWVudFtBZGFwdGVyLT5zTG9jYWxQYXJhLndDb25uZWN0ZWRTVEFpbmRleF0uYkJzc1R5cGUgPT0gSUJTU19ORVQpCi0jZGVmaW5lIE1UT19JTklUVFhSQVRFX01PREUJCQkoQWRhcHRlci0+c0h3RGF0YS5Tb2Z0d2FyZVNldCYweDIpCS8vYml0IDEKKyNkZWZpbmUgTVRPX0VOQUJMRQkJCQkJKGFkYXB0ZXItPnNMb2NhbFBhcmEuVHhSYXRlTW9kZSA9PSBSQVRFX0FVVE8pCisjZGVmaW5lIE1UT19UWFBPV0VSX0ZST01fRUVQUk9NCQkoYWRhcHRlci0+c0h3RGF0YS5Qb3dlckluZGV4RnJvbUVFUFJPTSkKKyNkZWZpbmUgTE9DQUxfQU5URU5OQV9OTygpCQkJKGFkYXB0ZXItPnNMb2NhbFBhcmEuYkFudGVubmFObykKKyNkZWZpbmUgTE9DQUxfSVNfQ09OTkVDVEVEKCkJCShhZGFwdGVyLT5zTG9jYWxQYXJhLndDb25uZWN0ZWRTVEFpbmRleCAhPSAwKQorI2RlZmluZSBMT0NBTF9JU19JQlNTX01PREUoKQkJKGFkYXB0ZXItPmFzQlNTRGVzY3JpcHRFbGVtZW50W2FkYXB0ZXItPnNMb2NhbFBhcmEud0Nvbm5lY3RlZFNUQWluZGV4XS5iQnNzVHlwZSA9PSBJQlNTX05FVCkKKyNkZWZpbmUgTVRPX0lOSVRUWFJBVEVfTU9ERQkJCShhZGFwdGVyLT5zSHdEYXRhLlNvZnR3YXJlU2V0JjB4MikJLy9iaXQgMQogLy8gMjAwNDA1MTAgVHVyYm8gYWRkCiAjZGVmaW5lIE1UT19UTVJfQ05UKCkgICAgICAgICAgICAgICBNVE9fREFUQSgpLlRtckNudAogI2RlZmluZSBNVE9fVE9HR0xFX1NUQVRFKCkgICAgICAgICAgTVRPX0RBVEEoKS5Ub2dnbGVTdGF0ZQpAQCAtMTU3LDcgKzE1OSw3IEBACiAjZGVmaW5lIE1UT19UTVJfUEVSSU9ESUMoKSAgICAgICAgICBNVE9fREFUQSgpLlRtcl9QZXJpb2RpYwogCiAjZGVmaW5lIE1UT19QT1dFUl9DSEFOR0VfRU5BQkxFKCkgICBNVE9fREFUQSgpLlBvd2VyQ2hhbmdlRW5hYmxlCi0jZGVmaW5lIE1UT19BTlRfRElWRVJTSVRZX0VOQUJMRSgpICBBZGFwdGVyLT5zTG9jYWxQYXJhLmJvQW50ZW5uYURpdmVyc2l0eQorI2RlZmluZSBNVE9fQU5UX0RJVkVSU0lUWV9FTkFCTEUoKSAgYWRhcHRlci0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkKICNkZWZpbmUgTVRPX0FOVF9NQUMoKSAgICAgICAgICAgICAgIE1UT19EQVRBKCkuQW50X21hYwogI2RlZmluZSBNVE9fQU5UX0RJVkVSU0lUWSgpICAgICAgICAgTVRPX0RBVEEoKS5BbnRfZGl2CiAjZGVmaW5lIE1UT19DQ0FfTU9ERSgpICAgICAgICAgICAgICBNVE9fREFUQSgpLkNDQV9Nb2RlCkBAIC0xNjYsNyArMTY4LDYgQEAKICNkZWZpbmUgTVRPX1BSRUFNQkxFX0NIQU5HRV9FTkFCTEUoKSAgICAgICAgIE1UT19EQVRBKCkuUHJlYW1ibGVDaGFuZ2VFbmFibGUKIAogI2RlZmluZSBNVE9fUkFURV9MRVZFTCgpICAgICAgICAgICAgTVRPX0RBVEEoKS5EYXRhUmF0ZUxldmVsCi0jZGVmaW5lIE1UT19GQUxMQkFDS19SQVRFX0xFVkVMKCkJTVRPX0RBVEEoKS5GYWxsYmFja1JhdGVMZXZlbAogI2RlZmluZSBNVE9fT0ZETV9SQVRFX0xFVkVMKCkJCU1UT19EQVRBKCkuT2ZkbVJhdGVMZXZlbAogI2RlZmluZSBNVE9fUkFURV9DSEFOR0VfRU5BQkxFKCkgICAgTVRPX0RBVEEoKS5EYXRhUmF0ZUNoYW5nZUVuYWJsZQogI2RlZmluZSBNVE9fRlJBR19USF9MRVZFTCgpICAgICAgICAgTVRPX0RBVEEoKS5GcmFnVGhyZXNob2xkTGV2ZWwKQEAgLTE5OSwxMSArMjAwLDkgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAotZXh0ZXJuIHU4ICAgTVRPX0RhdGFfUmF0ZV9UYmxbXTsKIGV4dGVybiB1MTYgIE1UT19GcmFnX1RoX1RibFtdOwogCiAjZGVmaW5lIE1UT19EQVRBX1JBVEUoKSAgICAgICAgICBNVE9fRGF0YV9SYXRlX1RibFtNVE9fUkFURV9MRVZFTCgpXQotI2RlZmluZSBNVE9fREFUQV9GQUxMQkFDS19SQVRFKCkgTVRPX0RhdGFfUmF0ZV9UYmxbTVRPX0ZBTExCQUNLX1JBVEVfTEVWRUwoKV0JLy9uZXh0IGxldmVsCiAjZGVmaW5lIE1UT19GUkFHX1RIKCkgICAgICAgICAgICBNVE9fRnJhZ19UaF9UYmxbTVRPX0ZSQUdfVEhfTEVWRUwoKV0KIAogdHlwZWRlZiBzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210b19mLmgKaW5kZXggMzBiM2RmMi4uODFmNTkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvX2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG9fZi5oCkBAIC0xLDcgKzEsMTMgQEAKLWV4dGVybiB2b2lkIE1UT19Jbml0KFBXQjMyX0FEQVBURVIpOwotZXh0ZXJuIHZvaWQgTVRPX1BlcmlvZGljVGltZXJFeHBpcmVkKFBXQjMyX0FEQVBURVIpOwotZXh0ZXJuIHZvaWQgTVRPX1NldERUT1JhdGVSYW5nZShQV0IzMl9BREFQVEVSLCB1OCAqLCB1OCk7CisjaWZuZGVmIF9fV0lOQk9ORF9NVE9fRl9ICisjZGVmaW5lIF9fV0lOQk9ORF9NVE9fRl9ICisKKyNpbmNsdWRlICJjb3JlLmgiCisKK2V4dGVybiB2b2lkIE1UT19Jbml0KHN0cnVjdCB3YnNvZnRfcHJpdiAqKTsKK2V4dGVybiB2b2lkIE1UT19QZXJpb2RpY1RpbWVyRXhwaXJlZChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKik7CitleHRlcm4gdm9pZCBNVE9fU2V0RFRPUmF0ZVJhbmdlKHN0cnVjdCB3YnNvZnRfcHJpdiAqLCB1OCAqLCB1OCk7CiBleHRlcm4gdTggTVRPX0dldFR4UmF0ZShNVE9fRlVOQ19JTlBVVCwgdTMyIGZwZHVfbGVuKTsKIGV4dGVybiB1OCBNVE9fR2V0VHhGYWxsYmFja1JhdGUoTVRPX0ZVTkNfSU5QVVQpOwogZXh0ZXJuIHZvaWQgTVRPX1NldFR4Q291bnQoTVRPX0ZVTkNfSU5QVVQsIHU4IHQwLCB1OCBpbmRleCk7CiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvb3NfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9vc19jb21tb24uaAppbmRleCBlMjRmZjQxLi4yYzI3NmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9vc19jb21tb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9vc19jb21tb24uaApAQCAtMSwyICsxLDIgQEAKLSNpbmNsdWRlICJsaW51eC9zeXNkZWYuaCIKKyNpbmNsdWRlICJzeXNkZWYuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwppbmRleCAyNzJhNjUwLi42NzgyNTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwpAQCAtMTIsNiArMTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKiBJTkNMVURFIEZJTEVTIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCiAjaW5jbHVkZSAicGh5X2NhbGlicmF0aW9uLmgiCisjaW5jbHVkZSAid2JoYWxfZi5oIgogCiAKIC8qKioqKioqKioqKioqKioqKiogREVCVUcgQ09OU1RBTlQgQU5EIE1BQ1JPIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDMxLDcgKzQzMiw2IEBACiAKIAl2YWwgfD0gTUFTS19BRENfRENfQ0FMX1NUUjsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgdmFsKTsKLQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOyAvLyAqTVVTVCogd2FpdCBmb3IgYSB3aGlsZQogCiAJLy8gZS4gVGhlIHJlc3VsdCBhcmUgc2hvd24gaW4gImFkY19kY19jYWxfaVs4OjBdIGFuZCBhZGNfZGNfY2FsX3FbODowXSIKICNpZmRlZiBfREVCVUcKQEAgLTUyMiw3ICs1MjIsNiBAQAogCXJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8MnwoMjw8MikpOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgJnJlZ19kY19jYW5jZWwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAocmVhZCkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKQEAgLTUzNiw3ICs1MzUsNiBAQAogCQlyZWdfZGNfY2FuY2VsICY9IH4oMHgwM0ZGKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsIHJlZ19kY19jYW5jZWwpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDIsICZ2YWwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMiA9IDB4JTA4WFxuIiwgdmFsKSk7CkBAIC01NTIsNyArNTUwLDYgQEAKIAkJcmVnX2RjX2NhbmNlbCB8PSAoMSA8PCBDQU5DRUxfRENfSV9TSElGVCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCByZWdfZGNfY2FuY2VsKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQyLCAmdmFsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDIgPSAweCUwOFhcbiIsIHZhbCkpOwpAQCAtNjAwLDcgKzU5Nyw2IEBACiAJcmVnX21vZGVfY3RybCAmPSB+TUFTS19DQUxJQl9TVEFSVDsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC02NTEsNyArNjQ3LDYgQEAKIAlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDMpOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgJnJlZ19kY19jYW5jZWwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAocmVhZCkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKQEAgLTY2NSwxMSArNjYwLDkgQEAKIAkJcmVnX2RjX2NhbmNlbCAmPSB+KDB4MDAxRik7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCByZWdfZGNfY2FuY2VsKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQyLCAmdmFsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDIgPSAweCUwOFhcbiIsIHZhbCkpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCWlxY2FsX2ltYWdlX2kgPSBfczEzX3RvX3MzMih2YWwgJiAweDAwMDAxRkZGKTsKIAkJaXFjYWxfaW1hZ2VfcSA9IF9zMTNfdG9fczMyKCh2YWwgJiAweDAzRkZFMDAwKSA+PiAxMyk7CkBAIC02ODIsMTEgKzY3NSw5IEBACiAJCXJlZ19kY19jYW5jZWwgfD0gKDEgPDwgQ0FOQ0VMX0RDX1FfU0hJRlQpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgcmVnX2RjX2NhbmNlbCk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMiwgJnZhbCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQyID0gMHglMDhYXG4iLCB2YWwpKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlpcWNhbF9pbWFnZV9pID0gX3MxM190b19zMzIodmFsICYgMHgwMDAwMUZGRik7CiAJCWlxY2FsX2ltYWdlX3EgPSBfczEzX3RvX3MzMigodmFsICYgMHgwM0ZGRTAwMCkgPj4gMTMpOwpAQCAtNzMyLDcgKzcyMyw2IEBACiAJcmVnX21vZGVfY3RybCAmPSB+TUFTS19DQUxJQl9TVEFSVDsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogfQogCiAvLzIwMDYwNjEyLjEuYSAyMDA2MDcxOC4xIE1vZGlmeQpAQCAtNzkyLDEyICs3ODIsMTAgQEAKIAkJCXJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8MHgwMnwyPDwyKTsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCQkvLyBiLgogCQkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMSwgJnZhbCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMSA9IDB4JTA4WFxuIiwgdmFsKSk7Ci0JCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCQlpcWNhbF90b25lX2kwID0gX3MxM190b19zMzIodmFsICYgMHgwMDAwMUZGRik7CiAJCQlpcWNhbF90b25lX3EwID0gX3MxM190b19zMzIoKHZhbCAmIDB4MDNGRkUwMDApID4+IDEzKTsKQEAgLTgxMyw3ICs4MDEsNiBAQAogCQkJcmVnX21vZGVfY3RybCAmPSB+TUFTS19DQUxJQl9TVEFSVDsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCQkvLyBkLiBTZXQgaXFjYWxfbW9kZVsxOjBdIHRvIDB4MyBhbmQgc2V0ICJjYWxpYl9zdGFydCIgdG8gMHgxIHRvCiAJCQkvLyAgICBlbmFibGUgIklRIGFsaWJyYXRpb24gTW9kZSBJSSIKQEAgLTgyMywxMiArODEwLDEwIEBACiAJCQlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDB4MDMpOwogCQkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQkJCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJCS8vIGUuCiAJCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQxLCAmdmFsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQxID0gMHglMDhYXG4iLCB2YWwpKTsKLQkJCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJCWlxY2FsX3RvbmVfaSA9IF9zMTNfdG9fczMyKHZhbCAmIDB4MDAwMDFGRkYpOwogCQkJaXFjYWxfdG9uZV9xID0gX3MxM190b19zMzIoKHZhbCAmIDB4MDNGRkUwMDApID4+IDEzKTsKQEAgLTEwNzUsNyArMTA2MCw3IEBACiAJLy87IFtCQi1jaGlwXTogQ2FsaWJyYXRpb24gKDZoKS4gQ2FjdWxhdGUgVFgtcGF0aCBJUSBpbWJhbGFuY2UgYW5kIHNldHRpbmcgVFggcGF0aCBJUSBjb21wZW5zYXRpb24gdGFibGUKIAkvL3BoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMywgKDM8PDI0KXwweDAyNTU4Nik7CiAKLQlPU19TTEVFUCgzMDAwMCk7IC8vIDIwMDYwNjEyLjEuYSAzMG1zIGRlbGF5LiBBZGQgdGhlIGZvbGxvdyAyIGxpbmVzCisJbXNsZWVwKDMwKTsgLy8gMjAwNjA2MTIuMS5hIDMwbXMgZGVsYXkuIEFkZCB0aGUgZm9sbG93IDIgbGluZXMKIAkvL1RvIGFkanVzdCBUWFZHQSB0byBmaXQgaXFfbWFnXzAgcmFuZ2UgZnJvbSAxMjUwIH4gMTc1MAogCWFkanVzdF9UWFZHQV9mb3JfaXFfbWFnKCBwaHdfZGF0YSApOwogCkBAIC0xMjgyLDEzICsxMjY3LDExIEBACiAJCWlmKCAhaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpICkvLzIwMDYwNzE4LjEgbW9kaWZ5CiAJCQlyZXR1cm4gMDsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlyZWdfbW9kZV9jdHJsICY9IH5NQVNLX0lRQ0FMX01PREU7CiAJCXJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8MHgxKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOyAgLy9TaG91bGQgYmUgcmVhZCBvdXQgYWZ0ZXIgNDUwdXMKIAogCQkvLyBjLgogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQxLCAmdmFsKTsKQEAgLTE2OTcsMTEgKzE2ODAsMTAgQEAKIAkJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCA1LCAoKDU8PDI0KXxjdXJyZW50X3R4dmdhKSApOwogCQlwaHdfZGF0YS0+dHh2Z2Ffc2V0dGluZ19mb3JfY2FsID0gY3VycmVudF90eHZnYTsKIAotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbigzMDAwMCk7Ly9TbGVlcCgzMCk7Ci0JCU9TX1NMRUVQKDMwMDAwKTsgLy8gMjAwNjA2MTIuMS5hCisJCW1zbGVlcCgzMCk7IC8vIDIwMDYwNjEyLjEuYQogCiAJCWlmKCAhaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsICZyZWdfbW9kZV9jdHJsKSApIC8vIDIwMDYwNzE4LjEgbW9kaWZ5Ci0JCQlyZXR1cm4gRkFMU0U7CisJCQlyZXR1cm4gZmFsc2U7CiAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMIChyZWFkKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCkBAIC0xNzE0LDE5ICsxNjk2LDE1IEBACiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKIAotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbihVUyk7Ci0JCU9TX1NMRUVQKDEpOyAvLyAyMDA2MDYxMi4xLmEKKwkJdWRlbGF5KDEpOyAvLyAyMDA2MDYxMi4xLmEKIAotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbigzMDApOy8vU2xlZXAoMzApOwotCQlPU19TTEVFUCgzMDApOyAvLyAyMDA2MDYxMi4xLmEKKwkJdWRlbGF5KDMwMCk7IC8vIDIwMDYwNjEyLjEuYQogCiAJCS8vIGIuCiAJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDEsICZ2YWwpOwogCiAJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQxID0gMHglMDhYXG4iLCB2YWwpKTsKLQkJLy9wYV9zdGFsbF9leGVjdXRpb24oVVMpOwotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbigzMDApOy8vU2xlZXAoMzApOwotCQlPU19TTEVFUCgzMDApOyAvLyAyMDA2MDYxMi4xLmEKKwkJdWRlbGF5KDMwMCk7IC8vIDIwMDYwNjEyLjEuYQogCiAJCWlxY2FsX3RvbmVfaTAgPSBfczEzX3RvX3MzMih2YWwgJiAweDAwMDAxRkZGKTsKIAkJaXFjYWxfdG9uZV9xMCA9IF9zMTNfdG9fczMyKCh2YWwgJiAweDAzRkZFMDAwKSA+PiAxMyk7CkBAIC0xNzUwLDkgKzE3MjgsOSBAQAogCX0KIAogCWlmKCBpcV9tYWdfMF90eD49NzAwICYmIGlxX21hZ18wX3R4PD0xNzUwICkKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCWVsc2UKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaAppbmRleCBiNmE2NWQzLi4wM2I4MjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaApAQCAtMSwzICsxLDggQEAKKyNpZm5kZWYgX19XSU5CT05EX1BIWV9DQUxJQlJBVElPTl9ICisjZGVmaW5lIF9fV0lOQk9ORF9QSFlfQ0FMSUJSQVRJT05fSAorCisjaW5jbHVkZSAid2JoYWxfZi5oIgorCiAvLyAyMDAzMTIyOSBUdXJibyBhZGQKICNkZWZpbmUgUkVHX0FHQ19DVFJMMSAgICAgICAgICAgICAgIDB4MTAwMAogI2RlZmluZSBSRUdfQUdDX0NUUkwyICAgICAgICAgICAgICAgMHgxMDA0CkBAIC05OSwzICsxMDQsNCBAQAogdm9pZCBwaHlfc2V0X3JmX2RhdGEoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgaW5kZXgsICB1MzIgdmFsdWUgKTsKICNkZWZpbmUgcGh5X2luaXRfcmYoIF9BICkJLy9SRlN5bnRoZXNpemVyX2luaXRpYWwoIF9BICkKIAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCmluZGV4IDU3YWY1YjguLmNkMjEyNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgorI2luY2x1ZGUgIndiaGFsX2YuaCIKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBPcmlnaW5hbCBQaHkuaApAQCAtOTc2LDkgKzk3Nyw5IEBACiAKIAkJLy8gMjAwNjA1MTEuMSBGaXggdGhlIGZvbGxvd2luZyA0IHN0ZXBzIGZvciBSeCBvZiBSRiAyMjMwIGluaXRpYWwgZmFpbAogCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Q0LCAweDgwICk7Ly8gcmVndWxhdG9yIG9uIG9ubHkKLQkJT1NfU0xFRVAoMTAwMDApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCisJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHhiOCApOy8vIFJFR19PTiBSRl9SU1ROIG9uLCBhbmQKLQkJT1NfU0xFRVAoMTAwMDApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCisJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAogCQlsdG1wID0gMHg0OTY4OwogCQlpZiggKHBId0RhdGEtPnBoeV90eXBlID09IFJGX1dCXzI0MikgfHwKQEAgLTk4OCwxMiArOTg5LDEyIEBACiAKIAkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHhhMCApOy8vIFBMTF9QRCBSRUZfUEQgc2V0IHRvIDAKIAotCQlPU19TTEVFUCgyMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJbXNsZWVwKDIwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgogCQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzZDAsICZsdG1wICk7CiAJCWxvb3AgPSA1MDA7IC8vIFdhaXQgZm9yIDUgc2Vjb25kIDIwMDYxMTAxCiAJCXdoaWxlKCAhKGx0bXAgJiAweDIwKSAmJiBsb29wLS0gKQogCQl7Ci0JCQlPU19TTEVFUCgxMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAkJCWlmKCAhV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2QwLCAmbHRtcCApICkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTAwMiw3ICsxMDAzLDcgQEAKIAl9CiAKIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2IwLCAxICk7Ly8gUmVzZXQgaGFyZHdhcmUgZmlyc3QKLQlPU19TTEVFUCgxMDAwMCk7IC8vIEFkZCB0aGlzIDIwMDUxMjIxLjEuYgorCW1zbGVlcCgxMCk7IC8vIEFkZCB0aGlzIDIwMDUxMjIxLjEuYgogCiAJLy8gU2V0IGJ1cnN0IHdyaXRlIGRlbGF5CiAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNmOCwgMHg3ZmYgKTsKQEAgLTExNjcsMjMgKzExNjgsMjMgQEAKIAkJCS8vIDIwMDYwNTExLjEgLS0tIE1vZGlmeWluZyB0aGUgZm9sbG93IHN0ZXAgZm9yIFJ4IGlzc3VlLS0tLS0tLS0tLS0tLS0tLS0KIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDc8PDIwKXwweEUxNjhFLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCgxMDAwMCk7CisJCQltc2xlZXAoMTApOwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKCBhbDIyMzBfcmZfZGF0YVs3XSwgMjApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMTAwMDApOworCQkJbXNsZWVwKDEwKTsKIAogCQljYXNlIFJGX0FJUk9IQV8yMjMwUzogLy8gMjAwNjA0MjAgQWRkIHRoaXMKIAogCQkJLy8gMjAwNjA1MTEuMSAtLS0gTW9kaWZ5aW5nIHRoZSBmb2xsb3cgc3RlcCBmb3IgUnggaXNzdWUtLS0tLS0tLS0tLS0tLS0tLQogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHg4MCApOy8vIHJlZ3VsYXRvciBvbiBvbmx5Ci0JCQlPU19TTEVFUCgxMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHhhMCApOy8vIFBMTF9QRCBSRUZfUEQgc2V0IHRvIDAKLQkJCU9TX1NMRUVQKDEwMDAwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgorCQkJbXNsZWVwKDEwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgogCiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Q0LCAweGUwICk7Ly8gTUxLX0VOCiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2IwLCAxICk7Ly8gUmVzZXQgaGFyZHdhcmUgZmlyc3QKLQkJCU9TX1NMRUVQKDEwMDAwKTsgLy8gQWRkIHRoaXMgMjAwNTEyMjEuMS5iCisJCQltc2xlZXAoMTApOyAvLyBBZGQgdGhpcyAyMDA1MTIyMS4xLmIKIAkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAkJCS8vIFRoZSBmb2xsb3cgY29kZSBkb2Vzbid0IHVzZSB0aGUgYnVyc3Qtd3JpdGUgbW9kZQpAQCAtMTE5MSwzMCArMTE5MiwzMCBAQAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwRjw8MjApIHwgMHhGMDFBMCwgMjApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwogCi0JCQlsdG1wID0gcEh3RGF0YS0+V2IzNVJlZy5CQjVDICYgMHhmZmZmZjAwMDsKKwkJCWx0bXAgPSBwSHdEYXRhLT5yZWcuQkI1QyAmIDB4ZmZmZmYwMDA7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDVjLCBsdG1wICk7Ci0JCQlwSHdEYXRhLT5XYjM1UmVnLkJCNTAgfD0gMHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7Ly8yMDA2MDMxNS4xIG1vZGlmeQotICAgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+V2IzNVJlZy5CQjUwKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJcEh3RGF0YS0+cmVnLkJCNTAgfD0gMHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7Ly8yMDA2MDMxNS4xIG1vZGlmeQorCSAgICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+cmVnLkJCNTApOworCQkJbXNsZWVwKDUpOwogCiAJCQkvL3BoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMHgwRiwgKDB4MEY8PDIwKSB8IDB4RjAxQjApOyAvL0FjdGl2YXRlIEZpbHRlciBDYWwuCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDBGPDwyMCkgfCAweEYwMUIwLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAogCQkJLy9waHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDB4MEYsICgweDBGPDwyMCkgfCAweEYwMWUwKTsgLy9BY3RpdmF0ZSBUWCBEQ0MKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MEY8PDIwKSB8IDB4RjAxRTAsIDIwKTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCiAJCQkvL3BoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMHgwRiwgKDB4MEY8PDIwKSB8IDB4RjAxQTApOyAvL1Jlc290cmUgSW5pdGlhbCBTZXR0aW5nCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDBGPDwyMCkgfCAweEYwMUEwLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CiAKIC8vCQkJLy9Gb3JjZSBUWEkoUSlQKE4pIHRvIG5vcm1hbCBjb250cm9sCi0JCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDVjLCBwSHdEYXRhLT5XYjM1UmVnLkJCNUMgKTsKLQkJCXBId0RhdGEtPldiMzVSZWcuQkI1MCAmPSB+MHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7Ci0gICAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5XYjM1UmVnLkJCNTApOworCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1YywgcEh3RGF0YS0+cmVnLkJCNUMgKTsKKwkJCXBId0RhdGEtPnJlZy5CQjUwICY9IH4weDEzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsKKyAgICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPnJlZy5CQjUwKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUkZfQUlST0hBXzcyMzA6CkBAIC0xMjI5LDE2ICsxMjMwLDE2IEBACiAJCQkvLzIuNEdIegogCQkJLy9sdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4MUFCQThGOwogCQkJLy9XYjM1UmVnX1dyaXRlU3luYyBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCS8vT1NfU0xFRVAoMTAwMCk7IC8vIFNsZWVwIDEgbXMKKwkJCS8vbXNsZWVwKDEpOyAvLyBTbGVlcCAxIG1zCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4OUFCQThGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4M0FCQThGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4MUFCQThGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAKIAkJCS8vNUdIegogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDAwMCApOwpAQCAtMTI1MSw3ICsxMjUyLDcgQEAKIAkJCS8vIFdyaXRlIHRvIHJlZ2lzdGVyLiBudW1iZXIgbXVzdCBsZXNzIGFuZCBlcXVhbCB0aGFuIDE2CiAJCQlmb3IoIGk9MDsgaTxudW1iZXI7IGkrKyApCiAJCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgcGx0bXBbaV0gKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2RjLCAweDAwMDAwMDgwICk7CiAJCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCkBAIC0xMjYyLDEzICsxMjYzLDEzIEBACiAJCQkvL1diMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHg5QUJBOEY7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHgzQUJBOEY7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHgxMkJBQ0Y7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAogCQkJLy9XYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2RjLCAweDAwMDAwMDgwICk7CiAJCQkvL1dCREVCVUcoKCIqIFBMTF9PTiAgICBoaWdoXG4iKSk7CkBAIC0xMjgwLDIxICsxMjgxLDIxIEBACiAJCQkvLwogCQkJLy8gOyBWZXJzaW9uIDEuM0IgcmV2aXNpb24gaXRlbXM6IGZvciBGQTU5NzZBICwgT2N0b2JlciAzLCAyMDA1IGJ5IEhUSG8KIAkJCS8vCi0JCQlsdG1wID0gcEh3RGF0YS0+V2IzNVJlZy5CQjVDICYgMHhmZmZmZjAwMDsKKwkJCWx0bXAgPSBwSHdEYXRhLT5yZWcuQkI1QyAmIDB4ZmZmZmYwMDA7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDVjLCBsdG1wICk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDU4LCAwICk7Ci0JCQlwSHdEYXRhLT5XYjM1UmVnLkJCNTAgfD0gMHgzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsvLzIwMDYwNjMwCi0JICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPldiMzVSZWcuQkI1MCk7CisJCQlwSHdEYXRhLT5yZWcuQkI1MCB8PSAweDM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOy8vMjAwNjA2MzAKKwkJICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+cmVnLkJCNTApOwogCiAJCQkvLy0tLS0tIENhbGlicmF0aW9uICgxKS4gVkNPIGZyZXF1ZW5jeSBjYWxpYnJhdGlvbgogCQkJLy9DYWxpYnJhdGlvbiAoMWEuMCkuIFN5bnRoZXNpemVyIHJlc2V0IChIVEhvIGNvcnJlY3RlZCAyMDA1LzA1LzEwKQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwRjw8MjQpIHwgMHgwMDEwMUUsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKCA1MDAwICk7IC8vIFNsZWVwIDVtcworCQkJbXNsZWVwKDUpOyAvLyBTbGVlcCA1bXMKIAkJCS8vQ2FsaWJyYXRpb24gKDFhKS4gVkNPIGZyZXF1ZW5jeSBjYWxpYnJhdGlvbiBtb2RlIDsgd2FpdGluZyAybXNlYyBWQ08gY2FsaWJyYXRpb24gdGltZQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRTY5YzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKCAyMDAwICk7IC8vIFNsZWVwIDJtcworCQkJbXNsZWVwKDIpOyAvLyBTbGVlcCAybXMKIAogCQkJLy8tLS0tLSBDYWxpYnJhdGlvbiAoMikuIFRYIGJhc2ViYW5kIEdtLUMgZmlsdGVyIGF1dG8tdHVuaW5nCiAJCQkvL0NhbGlicmF0aW9uICgyYSkuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbApAQCAtMTMwOSw3ICsxMzEwLDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDJjKS4gdHVybi1vbiBUWCBHbS1DIGZpbHRlciBhdXRvLXR1bmluZwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGQ0VCQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKCAxNTAgKTsgLy8gU2xlZXAgMTUwIHVzCisJCQl1ZGVsYXkoMTUwKTsgLy8gU2xlZXAgMTUwIHVzCiAJCQkvL3R1cm4gb2ZmIEVOQ0FMIHNpZ25hbAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGOEVCQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKQEAgLTEzMjcsNyArMTMyOCw3IEBACiAJCQkvL0NhbGlicmF0aW9uICgzYykuIHR1cm4tb24gUlggR20tQyBmaWx0ZXIgYXV0by10dW5pbmcKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkVFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCggMTUwICk7IC8vIFNsZWVwIDE1MCB1cworCQkJdWRlbGF5KDE1MCk7IC8vIFNsZWVwIDE1MCB1cwogCQkJLy9DYWxpYnJhdGlvbiAoM2UpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkFFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CkBAIC0xMzM2LDcgKzEzMzcsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoNGEpLiBUWCBMTyBsZWFrYWdlIGNhbGlicmF0aW9uCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZENkJDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoIDE1MCApOyAvLyBTbGVlcCAxNTAgdXMKKwkJCXVkZWxheSgxNTApOyAvLyBTbGVlcCAxNTAgdXMKIAogCQkJLy8tLS0tLSBDYWxpYnJhdGlvbiAoNSkuIFJYIERDIG9mZnNldCBjYWxpYnJhdGlvbgogCQkJLy9DYWxpYnJhdGlvbiAoNWEpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwgYW5kIHNldCB0byBSWCBTVyBEQyBjYWxpcmF0aW9uIG1vZGUKQEAgLTEzNTMsNyArMTM1NCw3IEBACiAJCQkvL0NhbGlicmF0aW9uICg1ZCkuIHR1cm4gb24gUlggREMgb2Zmc2V0IGNhbCBmdW5jdGlvbjsgYW5kIHdhaXRpbmcgMiBtc2VjIGNhbCB0aW1lCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZGNkRDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMjAwMCk7IC8vIFNsZWVwIDJtcworCQkJbXNsZWVwKDIpOyAvLyBTbGVlcCAybXMKIAkJCS8vQ2FsaWJyYXRpb24gKDVmKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZBRURDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwpAQCAtMTM2NSw3ICsxMzY2LDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDVkKS4gdHVybiBvbiBSWCBEQyBvZmZzZXQgY2FsIGZ1bmN0aW9uOyBhbmQgd2FpdGluZyAyIG1zZWMgY2FsIHRpbWUKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkY2REMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCgyMDAwKTsgLy8gU2xlZXAgMm1zCisJCQltc2xlZXAoMik7IC8vIFNsZWVwIDJtcwogCQkJLy9DYWxpYnJhdGlvbiAoNWYpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkFFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CkBAIC0xMzc3LDcgKzEzNzgsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoNWQpLiB0dXJuIG9uIFJYIERDIG9mZnNldCBjYWwgZnVuY3Rpb247IGFuZCB3YWl0aW5nIDIgbXNlYyBjYWwgdGltZQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRjZEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDIwMDApOyAvLyBTbGVlcCAybXMKKwkJCW1zbGVlcCgyKTsgLy8gU2xlZXAgMm1zCiAJCQkvL0NhbGlicmF0aW9uICg1ZikuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGQUVEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKQEAgLTEzODksNyArMTM5MCw3IEBACiAJCQkvL0NhbGlicmF0aW9uICg1ZCkuIHR1cm4gb24gUlggREMgb2Zmc2V0IGNhbCBmdW5jdGlvbjsgYW5kIHdhaXRpbmcgMiBtc2VjIGNhbCB0aW1lCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZGNkRDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMjAwMCk7IC8vIFNsZWVwIDJtcworCQkJbXNsZWVwKDIpOyAvLyBTbGVlcCAybXMKIAkJCS8vQ2FsaWJyYXRpb24gKDVmKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZBRURDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwpAQCAtMTM5OSwzMCArMTQwMCwzMCBAQAogCiAJCQkvLzsgLS0tLS0gQ2FsaWJyYXRpb24gKDcpLiBTd2l0Y2ggUkYgY2hpcCB0byBub3JtYWwgbW9kZQogCQkJLy8weDAwIDB4Rjg2MTAwIDsgM0UxODQgICA7IFN3aXRjaCBSRiBjaGlwIHRvIG5vcm1hbCBtb2RlCi0vLwkJCU9TX1NMRUVQKDEwMDAwKTsgLy8gQEAgMjAwNjA3MjEKKy8vCQkJbXNsZWVwKDEwKTsgLy8gQEAgMjAwNjA3MjEKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4Rjg2MTAwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsgLy8gU2xlZXAgNSBtcworCQkJbXNsZWVwKDUpOyAvLyBTbGVlcCA1IG1zCiAKIC8vCQkJLy93cml0ZSBiYWNrCi0vLwkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNWMsIHBId0RhdGEtPldiMzVSZWcuQkI1QyApOwotLy8JCQlwSHdEYXRhLT5XYjM1UmVnLkJCNTAgJj0gfjB4MTM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOyAvLyAyMDA2MDMxNS4xIGZpeAotLy8gICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+V2IzNVJlZy5CQjUwKTsKLS8vCQkJT1NfU0xFRVAoMTAwMCk7IC8vIFNsZWVwIDEgbXMKKy8vCQkJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgxMDVjLCBwSHdEYXRhLT5yZWcuQkI1Qyk7CisvLwkJCXBId0RhdGEtPnJlZy5CQjUwICY9IH4weDEzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsgLy8gMjAwNjAzMTUuMSBmaXgKKy8vCQkgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5yZWcuQkI1MCk7CisvLwkJCW1zbGVlcCgxKTsgLy8gU2xlZXAgMSBtcwogCQkJYnJlYWs7CiAJfQogfQogCiB2b2lkIEJCUHJvY2Vzc29yX0FMNzIzMF8yNDAwKCAgcGh3X2RhdGFfdCBwSHdEYXRhKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMglwbHRtcFsxMl07CiAKIAlwbHRtcFswXSA9IDB4MTZBODMzN0E7IC8vIDB4MTZhNTIxNWY7IC8vIDB4MTAwMCBBR0NfQ3RybDEKIAlwbHRtcFsxXSA9IDB4OUFGRjlBQTY7IC8vIDB4OWFmZjljYTY7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAlwbHRtcFsyXSA9IDB4NTVEMDBBMDQ7IC8vIDB4NTVkMDBhMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAlwbHRtcFszXSA9IDB4RkZGNzIwMzE7IC8vIDB4RmZGZjIxMzg7IC8vIDB4MTAwYyBBR0NfQ3RybDQKLQlwV2IzNVJlZy0+QkIwQyA9IDB4RkZGNzIwMzE7CisJcmVnLT5CQjBDID0gMHhGRkY3MjAzMTsKIAlwbHRtcFs0XSA9IDB4MEZhY0RDQzU7IC8vIDB4MTAxMCBBR0NfQ3RybDUgLy8gMjAwNTA5MjcgMHgwRmFjRENCNwogCXBsdG1wWzVdID0gMHgwMENBQTMzMzsgLy8gMHgwMGVhYTMzMzsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCXBsdG1wWzZdID0gMHhGMjIxMTExMTsgLy8gMHgxMTExMTExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTQzMSwyNSArMTQzMiwyNSBAQAogCXBsdG1wWzldID0gMHhBODAwMkE3OTsgLy8gMHhhOTAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAlwbHRtcFsxMF0gPSAweDQwMDAwNTI4OyAvLyAyMDA1MDkyNyAweDQwMDAwMjI4CiAJcGx0bXBbMTFdID0gMHgyMzJEN0YzMDsgLy8gMHgyMzQ1N2YzMDsvLyAweDEwMmMgQV9BQ1FfQ3RybAotCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJEN0YzMDsKKwlyZWctPkJCMkMgPSAweDIzMkQ3RjMwOwogCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAlwbHRtcFswXSA9IDB4MDAwMDJjNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyYzU0OworCXJlZy0+QkIzMCA9IDB4MDAwMDJjNTQ7CiAJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAogCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCXBsdG1wWzZdID0gMHgwMDMzMkMxQjsgLy8gMHgwMDQ1M0IyNDsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIKIAlwbHRtcFs3XSA9IDB4MEEwMEZFRkY7IC8vIDB4MEUwMEZFRkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyCiAJcGx0bXBbOF0gPSAweDJCMTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JcFdiMzVSZWctPkJCNTAgPSAweDJCMTA2MjA4OworCXJlZy0+QkI1MCA9IDB4MkIxMDYyMDg7CiAJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAlwbHRtcFsxMF0gPSAweDUyNTI0MjQyOyAvLyAweDY0NjQ1MjUyOyAvLyAweDEwNTggSVFfQWxwaGEKLQlwV2IzNVJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CisJcmVnLT5CQjU4ID0gMHg1MjUyNDI0MjsKIAlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTQ1NywxNCArMTQ1OCwxNCBAQAogCiB2b2lkIEJCUHJvY2Vzc29yX0FMNzIzMF81MDAwKCAgcGh3X2RhdGFfdCBwSHdEYXRhKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMglwbHRtcFsxMl07CiAKIAlwbHRtcFswXSA9IDB4MTZBQTY2Nzg7IC8vIDB4MTAwMCBBR0NfQ3RybDEKIAlwbHRtcFsxXSA9IDB4OUFGRkEwQjI7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAlwbHRtcFsyXSA9IDB4NTVEMDBBMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAlwbHRtcFszXSA9IDB4RUZGRjIzM0U7IC8vIDB4MTAwYyBBR0NfQ3RybDQKLQlwV2IzNVJlZy0+QkIwQyA9IDB4RUZGRjIzM0U7CisJcmVnLT5CQjBDID0gMHhFRkZGMjMzRTsKIAlwbHRtcFs0XSA9IDB4MEZhY0RDQzU7IC8vIDB4MTAxMCBBR0NfQ3RybDUgLy8gMjAwNTA5MjcgMHgwRmFjRENCNwogCXBsdG1wWzVdID0gMHgwMENBQTMzMzsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCXBsdG1wWzZdID0gMHhGMjQzMjExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTQ3MywyNCArMTQ3NCwyNCBAQAogCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAlwbHRtcFsxMF0gPSAweDQwMDAwNTI4OyAvLyAyMDA1MDkyNyAweDQwMDAwMjI4CiAJcGx0bXBbMTFdID0gMHgyMzJGREYzMDsvLyAweDEwMmMgQV9BQ1FfQ3RybAotCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJGREYzMDsKKwlyZWctPkJCMkMgPSAweDIzMkZERjMwOwogCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAlwbHRtcFswXSA9IDB4ODAwMDJDN0M7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCiAJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAogCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCXBsdG1wWzZdID0gMHgwMDMzMkMxQjsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIKIAlwbHRtcFs3XSA9IDB4MEEwMEZFRkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyCiAJcGx0bXBbOF0gPSAweDJCMTA3MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JcFdiMzVSZWctPkJCNTAgPSAweDJCMTA3MjA4OworCXJlZy0+QkI1MCA9IDB4MkIxMDcyMDg7CiAJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAlwbHRtcFsxMF0gPSAweDUyNTI0MjQyOyAvLyAweDEwNTggSVFfQWxwaGEKLQlwV2IzNVJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CisJcmVnLT5CQjU4ID0gMHg1MjUyNDI0MjsKIAlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTUxMSw3ICsxNTEyLDcgQEAKIHZvaWQKIEJCUHJvY2Vzc29yX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMglpLCBwbHRtcFsxMl07CiAKICAgICBzd2l0Y2goIHBId0RhdGEtPnBoeV90eXBlICkKQEAgLTE1MjIsNyArMTUyMyw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OUFGRkFFQTQ7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NUQwMEEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEVGRkYxQTM0OyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4RUZGRjFBMzQ7CisJCQlyZWctPkJCMEMgPSAweEVGRkYxQTM0OwogCQkJcGx0bXBbNF0gPSAweDBGQUJFMEI3OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDBDQUEzMzI7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHhGNjYzMjExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTUzMSwyNSArMTUzMiwyNSBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gKHBId0RhdGEtPnBoeV90eXBlPT0zKSA/IDB4NDAwMDBhMjggOiAweDQwMDAwMjI4OyAvLyAweDEwMjggTUFYSU1fMzMxKGIzMT0wKSArIFdCUkZfVjEoYjExPTEpIDogTUFYSU1fMzMxKGIzMT0wKSArIFdCUkZfVjIoYjExPTApCiAJCQlwbHRtcFsxMV0gPSAweDIzMkZERjMwOyAvLyAweDEwMmMgQV9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzMkZERjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQorCQkJcmVnLT5CQjJDID0gMHgyMzJGREYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCNkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IDB4MDA0NTNCMjQ7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyCiAJCQlwbHRtcFs3XSA9IDB4MEUwMEZFRkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyCiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDg7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwODsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CiAJCQlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzEwXSA9IDB4NjQ2NDY0NjQ7IC8vIDB4MTA1OCBJUV9BbHBoYQotCQkJcFdiMzVSZWctPkJCNTggPSAweDY0NjQ2NDY0OworCQkJcmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKIAkJCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE1NjgsNyArMTU2OSw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OWFmZmFlYTQ7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweGVmZmYxYTM0OyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4ZWZmZjFhMzQ7CisJCQlyZWctPkJCMEMgPSAweGVmZmYxYTM0OwogCQkJcGx0bXBbNF0gPSAweDBmYWJlMGI3OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDBjYWEzMzI7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHhmNjYzMjExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTU3NywyNSArMTU3OCwyNSBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMHg0MDAwMDUyODsgLy8gMHg0MDAwMDEyODsgTW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbMTFdID0gMHgyMzJmZGYzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJmZGYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKKwkJCXJlZy0+QkIyQyA9IDB4MjMyZmRmMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1QjZDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSAweDAwNDUzQjI0OyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbN10gPSAweDBEMDBGREZGOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjA4OwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDY0NjQ2NDY0OyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKKwkJCXJlZy0+QkI1OCA9IDB4NjQ2NDY0NjQ7CiAJCQlwbHRtcFsxMV0gPSAweEFBMjhDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xNjA4LDcgKzE2MDksNyBAQAogCQkJcGx0bXBbMV0gPSAweDlhZmZhZWE0OyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJCQlwbHRtcFsyXSA9IDB4NTVkMDBhMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAkJCXBsdG1wWzNdID0gMHhmNGZmMTYzMjsgLy8gMHhlZmZmMWEzNDsgLy8gMHgxMDBjIEFHQ19DdHJsNCBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Ci0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4ZjRmZjE2MzI7IC8vIDB4ZWZmZjFhMzQ7IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKKwkJCXJlZy0+QkIwQyA9IDB4ZjRmZjE2MzI7IC8vIDB4ZWZmZjFhMzQ7IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzRdID0gMHgwZmFiZTBiNzsgLy8gMHgxMDEwIEFHQ19DdHJsNQogCQkJcGx0bXBbNV0gPSAweDAwY2FhMzMyOyAvLyAweDEwMTQgQUdDX0N0cmw2CiAJCQlwbHRtcFs2XSA9IDB4Zjg2MzIxMTI7IC8vIDB4ZjY2MzIxMTE7IC8vIDB4MTAxOCBBR0NfQ3RybDcgTW9kaWZ5IGZvciAzMydzIDEuMC45NQpAQCAtMTYxNywyNSArMTYxOCwyNSBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMHg0MDAwMDUyODsgLy8gMHg0MDAwMDEyODsgbW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbMTFdID0gMHgyMzJmZGYzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJmZGYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKKwkJCXJlZy0+QkIyQyA9IDB4MjMyZmRmMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1YjJjODc2OTsgLy8gMHg1QjZDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IDB4MDAyYzI2MTc7IC8vIDB4MDA0NTNCMjQ7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzddID0gMHgwODAwZmVmZjsgLy8gMHgwRDAwRkRGRjsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIgTW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjA4OwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDY0NjQ0YTRhOyAvLyAweDY0NjQ2NDY0OyAvLyAweDEwNTggSVFfQWxwaGEgTW9kaWZ5IGZvciAzMydzIDEuMC45NQotCQkJcFdiMzVSZWctPkJCNTggPSAweDY0NjQ2NDY0OworCQkJcmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKIAkJCXBsdG1wWzExXSA9IDB4QUEyOEMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE2NDgsNyArMTY0OSw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OWFmZmFmYjI7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEZGRmQyMDNjOyAvLyAweEZGRmIyMDNhOyAvLyAweDEwMGMgQUdDX0N0cmw0IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KLQkJCXBXYjM1UmVnLT5CQjBDID0gMHhGRkZkMjAzYzsKKwkJCXJlZy0+QkIwQyA9IDB4RkZGZDIwM2M7CiAJCQlwbHRtcFs0XSA9IDBYMEZCRkRDYzU7IC8vIDBYMEZCRkRDQTA7IC8vIDB4MTAxMCBBR0NfQ3RybDUgLy8weDBGQjJFMEI3IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KIAkJCXBsdG1wWzVdID0gMHgwMGNhYTMzMjsgLy8gMHgwMGNhYTMzMzsgLy8gMHgxMDE0IEFHQ19DdHJsNiBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCiAJCQlwbHRtcFs2XSA9IDBYRjY2MzIxMTE7IC8vIDBYRjE2MzIxMTI7IC8vIDB4MTAxOCBBR0NfQ3RybDcJCS8vMHhmNjYzMjExMiBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCkBAIC0xNjU3LDI3ICsxNjU4LDI3IEBACiAJCQlwbHRtcFs5XSA9IDB4MDAwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJCQlwbHRtcFsxMF0gPSAwWDQwMDAwNTI4OwkJCQkJCQkvLzB4NDAwMDAyMjgKIAkJCXBsdG1wWzExXSA9IDB4MjMyZGZGMzA7IC8vIDB4MjMyQTlGMzA7IC8vIDB4MTAyYyBBX0FDUV9DdHJsCS8vMHgyMzJhOTczMAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzMmRmRjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQorCQkJcmVnLT5CQjJDID0gMHgyMzJkZkYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCMkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwJLy8weDVCNkM4NzY5CiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIgMjAwNjA2MTMuMgotCQkJcFdiMzVSZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNTEyMjEgY2gxNCAyMDA2MDYxMy4yCisJCQlyZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNTEyMjEgY2gxNCAyMDA2MDYxMy4yCiAJCQlwbHRtcFs3XSA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlciAyMDA2MDYxMy4yCi0JCQlwV2IzNVJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKKwkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKIAkJCXBsdG1wWzhdID0gMHgyNzEwNjIwMDsgLy8gMHgxMDUwIE1PREVfQ3RybAotCQkJcFdiMzVSZWctPkJCNTAgPSAweDI3MTA2MjAwOworCQkJcmVnLT5CQjUwID0gMHgyNzEwNjIwMDsKIAkJCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbMTBdID0gMHg1MjUyNDI0MjsgLy8gMHgxMDU4IElRX0FscGhhCi0JCQlwV2IzNVJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CisJCQlyZWctPkJCNTggPSAweDUyNTI0MjQyOwogCQkJcGx0bXBbMTFdID0gMHhBQTBBQzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTY5MCw3ICsxNjkxLDcgQEAKIAkJCXBsdG1wWzFdID0gMHg5YWZmYWZiMjsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCQkJcGx0bXBbMl0gPSAweDU1ZDAwYTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJCQlwbHRtcFszXSA9IDB4RkZGZDIwM2M7IC8vIDB4RkZGYjIwM2E7IC8vIDB4MTAwYyBBR0NfQ3RybDQgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgotCQkJcFdiMzVSZWctPkJCMEMgPSAweEZGRmQyMDNjOworCQkJcmVnLT5CQjBDID0gMHhGRkZkMjAzYzsKIAkJCXBsdG1wWzRdID0gMFgwRkJGRENjNTsgLy8gMFgwRkJGRENBMDsgLy8gMHgxMDEwIEFHQ19DdHJsNSAvLzB4MEZCMkUwQjcgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgogCQkJcGx0bXBbNV0gPSAweDAwY2FhMzMyOyAvLyAweDAwY2FhMzMzOyAvLyAweDEwMTQgQUdDX0N0cmw2IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KIAkJCXBsdG1wWzZdID0gMFhGNjYzMjExMTsgLy8gMFhGMTYzMjExMjsgLy8gMHgxMDE4IEFHQ19DdHJsNwkJLy8weGY2NjMyMTEyIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KQEAgLTE2OTksMjcgKzE3MDAsMjcgQEAKIAkJCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAkJCXBsdG1wWzEwXSA9IDBYNDAwMDA1Mjg7CQkJCQkJCS8vMHg0MDAwMDIyOAogCQkJcGx0bXBbMTFdID0gMHgyMzJkZkYzMDsgLy8gMHgyMzJBOUYzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwJLy8weDIzMmE5NzMwCi0JCQlwV2IzNVJlZy0+QkIyQyA9IDB4MjMyZGZGMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCisJCQlyZWctPkJCMkMgPSAweDIzMmRmRjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCQkJcGx0bXBbMF0gPSAweDAwMDAyQzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyQzU0OworCQkJcmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKIAkJCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJCQlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAkvLzB4NUI2Qzg3NjkKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlciAyMDA2MDYxMy4yCi0JCQlwV2IzNVJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA1MTIyMSBjaDE0IDIwMDYwNjEzLjIKKwkJCXJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA1MTIyMSBjaDE0IDIwMDYwNjEzLjIKIAkJCXBsdG1wWzddID0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyIDIwMDYwNjEzLjIKLQkJCXBXYjM1UmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDYwNjEzLjEKKwkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA2MDYxMy4xCiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDA7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwMDsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDA7CiAJCQlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzEwXSA9IDB4NTI1MjMyMzI7IC8vIDIwMDYwNDE5IDB4NTI1MjQyNDI7IC8vIDB4MTA1OCBJUV9BbHBoYQotCQkJcFdiMzVSZWctPkJCNTggPSAweDUyNTIzMjMyOyAvLyAyMDA2MDQxOSAweDUyNTI0MjQyOworCQkJcmVnLT5CQjU4ID0gMHg1MjUyMzIzMjsgLy8gMjAwNjA0MTkgMHg1MjUyNDI0MjsKIAkJCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE3MzIsNyArMTczMyw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OWFmZmFmYjI7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEZGRmIyMDNhOyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JCQlwV2IzNVJlZy0+QkIwYyA9IDB4RkZGYjIwM2E7CisJCQlyZWctPkJCMGMgPSAweEZGRmIyMDNhOwogCQkJcGx0bXBbNF0gPSAweDBGQkZEQ0I3OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDBjYWEzMzM7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHhmNjYzMjExMjsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTc0MSwyNSArMTc0MiwyNSBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMHg0MDAwMDIyODsKIAkJCXBsdG1wWzExXSA9IDB4MjMyQTlGMzA7Ly8gMHgxMDJjIEFfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjJjID0gMHgyMzJBOUYzMDsKKwkJCXJlZy0+QkIyYyA9IDB4MjMyQTlGMzA7CiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1QjJDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzYyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM2MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSAweDAwNDUzQjI0OyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbN10gPSAweDBFMDBGRUZGOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjAwOyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDA7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjAwOwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDY0NjQ1MjUyOyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg2NDY0NTI1MjsKKwkJCXJlZy0+QkI1OCA9IDB4NjQ2NDUyNTI7CiAJCQlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogKi8KQEAgLTE3NzUsNyArMTc3Niw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OUFGRjlBQkE7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NUQwMEEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEVFRTkxQzMyOyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4RUVFOTFDMzI7CisJCQlyZWctPkJCMEMgPSAweEVFRTkxQzMyOwogCQkJcGx0bXBbNF0gPSAweDBGQUNEQ0M1OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDAwQUEzNDQ7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHgyMjIyMjIyMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTc4NCwyNyArMTc4NSwyNyBAQAogCQkJcGx0bXBbOV0gPSAweEE5MDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMHg0MDAwMDUyODsgLy8gMHgxMDI4CiAJCQlwbHRtcFsxMV0gPSAweDIzNDU3RjMwOyAvLyAweDEwMmMgQV9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzNDU3RjMwOworCQkJcmVnLT5CQjJDID0gMHgyMzQ1N0YzMDsKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCMkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwKIAkJCXBsdG1wWzNdID0gcEh3RGF0YS0+QkIzY19jYWw7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IHBId0RhdGEtPkJCM2NfY2FsOworCQkJcmVnLT5CQjNDID0gcEh3RGF0YS0+QkIzY19jYWw7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUc7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyIDIwMDYwNjEzLjIKLQkJCXBXYjM1UmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX1dCMjQyXzExRzsgLy8gMjAwNjA2MTMuMSAyMDA2MDYxMy4yCisJCQlyZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKIAkJCXBsdG1wWzddID0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRzsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIgMjAwNjA2MTMuMgotCQkJcFdiMzVSZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKKwkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUc7IC8vIDIwMDYwNjEzLjEgMjAwNjA2MTMuMgogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjA4OwogCQkJcGx0bXBbOV0gPSBwSHdEYXRhLT5CQjU0X2NhbDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IHBId0RhdGEtPkJCNTRfY2FsOworCQkJcmVnLT5CQjU0ID0gcEh3RGF0YS0+QkI1NF9jYWw7CiAJCQlwbHRtcFsxMF0gPSAweDUyNTIzMTMxOyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg1MjUyMzEzMTsKKwkJCXJlZy0+QkI1OCA9IDB4NTI1MjMxMzE7CiAJCQlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAyMDA2MDgyNSAweEFBMkFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xODEzLDE0ICsxODE0LDE0IEBACiAgICAgfQogCiAJLy8gRmlsbCB0aGUgTE5BIHRhYmxlCi0JcFdiMzVSZWctPkxOQVZhbHVlWzBdID0gKHU4KShwV2IzNVJlZy0+QkIwQyAmIDB4ZmYpOwotCXBXYjM1UmVnLT5MTkFWYWx1ZVsxXSA9IDA7Ci0JcFdiMzVSZWctPkxOQVZhbHVlWzJdID0gKHU4KSgocFdiMzVSZWctPkJCMEMgJiAweGZmMDApPj44KTsKLQlwV2IzNVJlZy0+TE5BVmFsdWVbM10gPSAwOworCXJlZy0+TE5BVmFsdWVbMF0gPSAodTgpKHJlZy0+QkIwQyAmIDB4ZmYpOworCXJlZy0+TE5BVmFsdWVbMV0gPSAwOworCXJlZy0+TE5BVmFsdWVbMl0gPSAodTgpKChyZWctPkJCMEMgJiAweGZmMDApPj44KTsKKwlyZWctPkxOQVZhbHVlWzNdID0gMDsKIAogCS8vIEZpbGwgU1EzIHRhYmxlCiAJZm9yKCBpPTA7IGk8TUFYX1NRM19GSUxURVJfU0laRTsgaSsrICkKLQkJcFdiMzVSZWctPlNRM19maWx0ZXJbaV0gPSAweDJmOyAvLyBoYWxmIG9mIEJpdCAwIH4gNgorCQlyZWctPlNRM19maWx0ZXJbaV0gPSAweDJmOyAvLyBoYWxmIG9mIEJpdCAwIH4gNgogfQogCiB2b2lkIHNldF90eF9wb3dlcl9wZXJfY2hhbm5lbF9tYXgyODI5KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gQ2hhbm5lbCkKQEAgLTE5MDMsNyArMTkwNCw3IEBACiB2b2lkCiBSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBDaGFubmVsICkKIHsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJcGx0bXBbMTZdOyAvLyBUaGUgMTYgaXMgdGhlIG1heGltdW0gY2FwYWJpbGl0eSBvZiBoYXJkd2FyZQogCXUzMgljb3VudCwgbHRtcDsKIAl1OAlpLCBqLCBudW1iZXI7CkBAIC0yMDkwLDQwICsyMDkxLDQwIEBACiAJaWYoIENoYW5uZWwuYmFuZCA8PSBCQU5EX1RZUEVfT0ZETV8yNCApCiAJewogICAgICAgICAvLyBCQjogc2VsZWN0IDIuNCBHSHosIGJpdFsxMi0xMV09MDAKLQkJcFdiMzVSZWctPkJCNTAgJj0gfihCSVQoMTEpfEJJVCgxMikpOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNTAsIHBXYjM1UmVnLT5CQjUwICk7IC8vIE1PREVfQ3RybAorCQlyZWctPkJCNTAgJj0gfihCSVQoMTEpfEJJVCgxMikpOworCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNTAsIHJlZy0+QkI1MCApOyAvLyBNT0RFX0N0cmwKICAgICAgICAgLy8gTUFDOiBzZWxlY3QgMi40IEdIeiwgYml0WzVdPTAKLQkJcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiAmPSB+QklUKDUpOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NzgsIHBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gKTsKKwkJcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gJj0gfkJJVCg1KTsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODc4LCByZWctPk03OF9FUlBJbmZvcm1hdGlvbiApOwogICAgICAgICAvLyBlbmFibGUgMTFiIEJhc2ViYW5kCi0JCXBXYjM1UmVnLT5CQjMwICY9IH5CSVQoMzEpOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBXYjM1UmVnLT5CQjMwICk7CisJCXJlZy0+QkIzMCAmPSB+QklUKDMxKTsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDMwLCByZWctPkJCMzAgKTsKIAl9CiAJZWxzZSBpZiggKENoYW5uZWwuYmFuZCA9PSBCQU5EX1RZUEVfT0ZETV81KSApCiAJewogICAgICAgICAvLyBCQjogc2VsZWN0IDUgR0h6Ci0JCXBXYjM1UmVnLT5CQjUwICY9IH4oQklUKDExKXxCSVQoMTIpKTsKKwkJcmVnLT5CQjUwICY9IH4oQklUKDExKXxCSVQoMTIpKTsKIAkJaWYgKENoYW5uZWwuQ2hhbk5vIDw9NjQgKQotCQkJcFdiMzVSZWctPkJCNTAgfD0gQklUKDEyKTsJCQkJLy8gMTAtNS4yNUdIegorCQkJcmVnLT5CQjUwIHw9IEJJVCgxMik7CQkJCS8vIDEwLTUuMjVHSHoKIAkJZWxzZSBpZiAoKENoYW5uZWwuQ2hhbk5vID49IDEwMCkgJiYgKENoYW5uZWwuQ2hhbk5vIDw9IDEyNCkpCi0JCQlwV2IzNVJlZy0+QkI1MCB8PSBCSVQoMTEpOwkJCQkvLyAwMS01LjQ4R0h6CisJCQlyZWctPkJCNTAgfD0gQklUKDExKTsJCQkJLy8gMDEtNS40OEdIegogCQllbHNlIGlmICgoQ2hhbm5lbC5DaGFuTm8gPj0xMjgpICYmIChDaGFubmVsLkNoYW5ObyA8PSAxNjEpKQotCQkJcFdiMzVSZWctPkJCNTAgfD0gKEJJVCgxMil8QklUKDExKSk7CS8vIDExLTUuNzc1R0h6CisJCQlyZWctPkJCNTAgfD0gKEJJVCgxMil8QklUKDExKSk7CS8vIDExLTUuNzc1R0h6CiAJCWVsc2UJLy9DaGFuIDE4NCB+IDE5NiB3aWxsIHVzZSBiaXRbMTItMTFdID0gMTAgaW4gdmVyc2lvbiBzaC1zcmMtMS4yLjI1Ci0JCQlwV2IzNVJlZy0+QkI1MCB8PSBCSVQoMTIpOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNTAsIHBXYjM1UmVnLT5CQjUwICk7IC8vIE1PREVfQ3RybAorCQkJcmVnLT5CQjUwIHw9IEJJVCgxMik7CisJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA1MCwgcmVnLT5CQjUwICk7IC8vIE1PREVfQ3RybAogCiAJCS8vKDEpIE03OCBzaG91bGQgYWx3YXkgdXNlIDIuNEcgc2V0dGluZyB3aGVuIHVzaW5nIFJGX0FJUk9IQV83MjMwCiAJCS8vKDIpIEJCMzAgaGFzIGJlZW4gdXBkYXRlZCBwcmV2aW91c2x5LgogCQlpZiAocEh3RGF0YS0+cGh5X3R5cGUgIT0gUkZfQUlST0hBXzcyMzApCiAJCXsKICAgICAJICAgIC8vIE1BQzogc2VsZWN0IDUgR0h6LCBiaXRbNV09MQotCQkJcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiB8PSBCSVQoNSk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NzgsIHBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gKTsKKwkJCXJlZy0+TTc4X0VSUEluZm9ybWF0aW9uIHw9IEJJVCg1KTsKKwkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg3OCwgcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gKTsKIAogICAgIAkgICAgLy8gZGlzYWJsZSAxMWIgQmFzZWJhbmQKLQkJCXBXYjM1UmVnLT5CQjMwIHw9IEJJVCgzMSk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBXYjM1UmVnLT5CQjMwICk7CisJCQlyZWctPkJCMzAgfD0gQklUKDMxKTsKKwkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcmVnLT5CQjMwICk7CiAJCX0KIAl9CiB9CkBAIC0yMzEzLDIxICsyMzE0LDIxIEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiB2b2lkIER4eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAogCS8vIE9sZCBJQzpTaW5nbGUgbW9kZSBvbmx5LgogCS8vIE5ldyBJQzogb3BlcmF0aW9uIGRlY2lkZSBieSBTb2Z0d2FyZSBzZXQgYml0WzRdLiAxOm11bHRpcGxlIDA6IHNpbmdsZQotCXBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCA9IDB4YzAwMDAwMDQ7CS8vVHhvbiwgUnhvbiwgbXVsdGlwbGUgUnggZm9yIG5ldyA0ayBETUEKKwlyZWctPkQwMF9EbWFDb250cm9sID0gMHhjMDAwMDAwNDsJLy9UeG9uLCBSeG9uLCBtdWx0aXBsZSBSeCBmb3IgbmV3IDRrIERNQQogCQkJCQkJCQkJCQkvL1R4b24sIFJ4b24sIHNpbmdsZSBSeCBmb3Igb2xkIDhrIEFTSUMKIAlpZiggIUhBTF9VU0JfTU9ERV9CVVJTVCggcEh3RGF0YSApICkKLQkJcFdiMzVSZWctPkQwMF9EbWFDb250cm9sID0gMHhjMDAwMDAwMDsvL1R4b24sIFJ4b24sIHNpbmdsZSBSeCBmb3IgbmV3IDRrIERNQQorCQlyZWctPkQwMF9EbWFDb250cm9sID0gMHhjMDAwMDAwMDsvL1R4b24sIFJ4b24sIHNpbmdsZSBSeCBmb3IgbmV3IDRrIERNQQogCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDQwMCwgcFdiMzVSZWctPkQwMF9EbWFDb250cm9sICk7CisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDQwMCwgcmVnLT5EMDBfRG1hQ29udHJvbCApOwogfQogCiB2b2lkIE14eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJCXRtcDsKIAl1MzIJCXBsdG1wWzExXTsKIAl1MTYJaTsKQEAgLTIzMzksMjMgKzIzNDAsMjMgQEAKIAogCS8vIE0wMCBiaXQgc2V0CiAjaWZkZWYgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KLQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgPSAwOyAvLyBTb2x2ZSBiZWFjb24gc2VxdWVuY2UgbnVtYmVyIHN0b3AgYnkgc29mdHdhcmUKKwlyZWctPk0wMF9NYWNDb250cm9sID0gMDsgLy8gU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IHNvZnR3YXJlCiAjZWxzZQotCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCA9IDB4ODAwMDAwMDA7IC8vIFNvbHZlIGJlYWNvbiBzZXF1ZW5jZSBudW1iZXIgc3RvcCBieSBoYXJkd2FyZQorCXJlZy0+TTAwX01hY0NvbnRyb2wgPSAweDgwMDAwMDAwOyAvLyBTb2x2ZSBiZWFjb24gc2VxdWVuY2UgbnVtYmVyIHN0b3AgYnkgaGFyZHdhcmUKICNlbmRpZgogCiAJLy8gTTI0IGRpc2FibGUgZW50ZXIgcG93ZXIgc2F2ZSwgQkIgUnhPbiBhbmQgZW5hYmxlIE5BViBhdHRhY2sKLQlwV2IzNVJlZy0+TTI0X01hY0NvbnRyb2wgPSAweDA4MDQwMDQyOwotCXBsdG1wWzBdID0gcFdiMzVSZWctPk0yNF9NYWNDb250cm9sOworCXJlZy0+TTI0X01hY0NvbnRyb2wgPSAweDA4MDQwMDQyOworCXBsdG1wWzBdID0gcmVnLT5NMjRfTWFjQ29udHJvbDsKIAogCXBsdG1wWzFdID0gMDsgLy8gU2tpcCBNMjgsIGJlY2F1c2Ugbm8gaW5pdGlhbGl6ZSB2YWx1ZSBpcyByZXF1aXJlZC4KIAogCS8vIE0yQyBDV21pbiBhbmQgQ1dtYXggc2V0dGluZwogCXBId0RhdGEtPmN3bWluID0gREVGQVVMVF9DV01JTjsKIAlwSHdEYXRhLT5jd21heCA9IERFRkFVTFRfQ1dNQVg7Ci0JcFdiMzVSZWctPk0yQ19NYWNDb250cm9sID0gREVGQVVMVF9DV01JTiA8PCAxMDsKLQlwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgfD0gREVGQVVMVF9DV01BWDsKLQlwbHRtcFsyXSA9IHBXYjM1UmVnLT5NMkNfTWFjQ29udHJvbDsKKwlyZWctPk0yQ19NYWNDb250cm9sID0gREVGQVVMVF9DV01JTiA8PCAxMDsKKwlyZWctPk0yQ19NYWNDb250cm9sIHw9IERFRkFVTFRfQ1dNQVg7CisJcGx0bXBbMl0gPSByZWctPk0yQ19NYWNDb250cm9sOwogCiAJLy8gTTMwIEJTU0lECiAJcGx0bXBbM10gPSAqKHUzMiAqKXBId0RhdGEtPmJzc2lkOwpAQCAtMjM2NywzNSArMjM2OCwzNSBAQAogCXBsdG1wWzRdID0gdG1wOwogCiAJLy8gTTM4Ci0JcFdiMzVSZWctPk0zOF9NYWNDb250cm9sID0gKERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVDw8OCkgfCAoREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUIDw8IDQpIHwgREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVDsKLQlwbHRtcFs1XSA9IHBXYjM1UmVnLT5NMzhfTWFjQ29udHJvbDsKKwlyZWctPk0zOF9NYWNDb250cm9sID0gKERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVDw8OCkgfCAoREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUIDw8IDQpIHwgREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVDsKKwlwbHRtcFs1XSA9IHJlZy0+TTM4X01hY0NvbnRyb2w7CiAKIAkvLyBNM0MKIAl0bXAgPSAoREVGQVVMVF9QSUZTVCA8PCAyNikgfCAoREVGQVVMVF9FSUZTVCA8PCAxNikgfCAoREVGQVVMVF9ESUZTVCA8PCA4KSB8IChERUZBVUxUX1NJRlNUIDw8IDQpIHwgREVGQVVMVF9PU0lGU1QgOwotCXBXYjM1UmVnLT5NM0NfTWFjQ29udHJvbCA9IHRtcDsKKwlyZWctPk0zQ19NYWNDb250cm9sID0gdG1wOwogCXBsdG1wWzZdID0gdG1wOwogCiAJLy8gTTQwCiAJcEh3RGF0YS0+c2xvdF90aW1lX3NlbGVjdCA9IERFRkFVTFRfU0xPVF9USU1FOwogCXRtcCA9IChERUZBVUxUX0FUSU1XRCA8PCAxNikgfCBERUZBVUxUX1NMT1RfVElNRTsKLQlwV2IzNVJlZy0+TTQwX01hY0NvbnRyb2wgPSB0bXA7CisJcmVnLT5NNDBfTWFjQ29udHJvbCA9IHRtcDsKIAlwbHRtcFs3XSA9IHRtcDsKIAogCS8vIE00NAogCXRtcCA9IERFRkFVTFRfTUFYX1RYX01TRFVfTElGRV9USU1FIDw8IDEwOyAvLyAqMTAyNAotCXBXYjM1UmVnLT5NNDRfTWFjQ29udHJvbCA9IHRtcDsKKwlyZWctPk00NF9NYWNDb250cm9sID0gdG1wOwogCXBsdG1wWzhdID0gdG1wOwogCiAJLy8gTTQ4CiAJcEh3RGF0YS0+QmVhY29uUGVyaW9kID0gREVGQVVMVF9CRUFDT05fSU5URVJWQUw7CiAJcEh3RGF0YS0+UHJvYmVEZWxheSA9IERFRkFVTFRfUFJPQkVfREVMQVlfVElNRTsKIAl0bXAgPSAoREVGQVVMVF9CRUFDT05fSU5URVJWQUwgPDwgMTYpIHwgREVGQVVMVF9QUk9CRV9ERUxBWV9USU1FOwotCXBXYjM1UmVnLT5NNDhfTWFjQ29udHJvbCA9IHRtcDsKKwlyZWctPk00OF9NYWNDb250cm9sID0gdG1wOwogCXBsdG1wWzldID0gdG1wOwogCiAJLy9NNEMKLQlwV2IzNVJlZy0+TTRDX01hY1N0YXR1cyA9IChERUZBVUxUX1BST1RPQ09MX1ZFUlNJT04gPDwgMzApIHwgKERFRkFVTFRfTUFDX1BPV0VSX1NUQVRFIDw8IDI4KSB8IChERUZBVUxUX0RUSU1fQUxFUlRfVElNRSA8PCAyNCk7Ci0JcGx0bXBbMTBdID0gcFdiMzVSZWctPk00Q19NYWNTdGF0dXM7CisJcmVnLT5NNENfTWFjU3RhdHVzID0gKERFRkFVTFRfUFJPVE9DT0xfVkVSU0lPTiA8PCAzMCkgfCAoREVGQVVMVF9NQUNfUE9XRVJfU1RBVEUgPDwgMjgpIHwgKERFRkFVTFRfRFRJTV9BTEVSVF9USU1FIDw8IDI0KTsKKwlwbHRtcFsxMF0gPSByZWctPk00Q19NYWNTdGF0dXM7CiAKIAkvLyBCdXJzdCB3cml0ZQogCS8vV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDA4MjQsIHBsdG1wLCAxMSwgQVVUT19JTkNSRU1FTlQgKTsKQEAgLTI0MDQsMTUgKzI0MDUsMTUgQEAKIAogCS8vIE02MAogCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjAsIDB4MTI0ODEyNDggKTsKLQlwV2IzNVJlZy0+TTYwX01hY0NvbnRyb2wgPSAweDEyNDgxMjQ4OworCXJlZy0+TTYwX01hY0NvbnRyb2wgPSAweDEyNDgxMjQ4OwogCiAJLy8gTTY4CiAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2OCwgMHgwMDA1MDkwMCApOyAvLyAyMDA1MTAxOCAweDAwMEYwRjAwICk7IC8vIDk0MDkzMCAweDAwMTMxMzAwCi0JcFdiMzVSZWctPk02OF9NYWNDb250cm9sID0gMHgwMDA1MDkwMDsKKwlyZWctPk02OF9NYWNDb250cm9sID0gMHgwMDA1MDkwMDsKIAogCS8vIE05OAogCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4OTgsIDB4ZmZmZjg4ODggKTsKLQlwV2IzNVJlZy0+TTk4X01hY0NvbnRyb2wgPSAweGZmZmY4ODg4OworCXJlZy0+TTk4X01hY0NvbnRyb2wgPSAweGZmZmY4ODg4OwogfQogCiAKQEAgLTI2MjAsNyArMjYyMSw3IEBACiAKIHZvaWQgQkJQcm9jZXNzb3JfUmF0ZUNoYW5naW5nKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggcmF0ZSApIC8vIDIwMDYwNjEzLjEKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1bnNpZ25lZCBjaGFyCQlJczExYlJhdGU7CiAKIAlJczExYlJhdGUgPSAocmF0ZSAlIDYpID8gMSA6IDA7CkBAIC0yNjMwLDggKzI2MzEsOCBAQAogCQljYXNlIFJGX0FJUk9IQV8yMjMwUzogLy8gMjAwNjA0MjAgQWRkIHRoaXMKIAkJCWlmKCBJczExYlJhdGUgKQogCQkJewotCQkJCWlmKCAocFdiMzVSZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUIpICYmCi0JCQkJCShwV2IzNVJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExQikgKQorCQkJCWlmKCAocmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFCKSAmJgorCQkJCQkocmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFCKSApCiAJCQkJewogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNDgsIEJCNDhfREVGQVVMVF9BTDIyMzBfMTFCICk7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0YywgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUIgKTsKQEAgLTI2MzksOCArMjY0MCw4IEBACiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJaWYoIChwV2IzNVJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRykgJiYKLQkJCQkJKHBXYjM1UmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHKSApCisJCQkJaWYoIChyZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUcpICYmCisJCQkJCShyZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUcpICkKIAkJCQl7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0OCwgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUcgKTsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDRjLCBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRyApOwpAQCAtMjY1MSwyMiArMjY1MiwyMiBAQAogCQljYXNlIFJGX1dCXzI0MjogLy8gMjAwNjA2MjMgVGhlIGZpeCBvbmx5IGZvciBvbGQgVHhWR0Egc2V0dGluZwogCQkJaWYoIElzMTFiUmF0ZSApCiAJCQl7Ci0JCQkJaWYoIChwV2IzNVJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCKSAmJgotCQkJCQkocFdiMzVSZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX1dCMjQyXzExQikgKQorCQkJCWlmKCAocmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIpICYmCisJCQkJCShyZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX1dCMjQyXzExQikgKQogCQkJCXsKLQkJCQkJcFdiMzVSZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCOwotCQkJCQlwV2IzNVJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUI7CisJCQkJCXJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUI7CisJCQkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUI7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0OCwgQkI0OF9ERUZBVUxUX1dCMjQyXzExQiApOwogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNGMsIEJCNENfREVGQVVMVF9XQjI0Ml8xMUIgKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJaWYoIChwV2IzNVJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHKSAmJgotCQkJCQkocFdiMzVSZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRykgKQorCQkJCWlmKCAocmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUcpICYmCisJCQkJCShyZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRykgKQogCQkJCXsKLQkJCQkJcFdiMzVSZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHOwotCQkJCQlwV2IzNVJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUc7CisJCQkJCXJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUc7CisJCQkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUc7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0OCwgQkI0OF9ERUZBVUxUX1dCMjQyXzExRyApOwogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNGMsIEJCNENfREVGQVVMVF9XQjI0Ml8xMUcgKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yeGlzci5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcnhpc3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlOTQyYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yeGlzci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgotCi12b2lkIHZSeFRpbWVySW5pdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JT1NfVElNRVJfSU5JVElBTCgmKEFkYXB0ZXItPk1kcy5uVGltZXIpLCAodm9pZCopIFJ4VGltZXJIYW5kbGVyLCAodm9pZCopIEFkYXB0ZXIpOwotfQotCi12b2lkIHZSeFRpbWVyU3RhcnQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBpbnQgdGltZW91dF92YWx1ZSkKLXsKLQlpZiAodGltZW91dF92YWx1ZTxNSU5fVElNRU9VVF9WQUwpCi0JCXRpbWVvdXRfdmFsdWU9TUlOX1RJTUVPVVRfVkFMOwotCi0JT1NfVElNRVJfU0VUKCAmKEFkYXB0ZXItPk1kcy5uVGltZXIpLCB0aW1lb3V0X3ZhbHVlICk7Ci19Ci0KLXZvaWQgdlJ4VGltZXJTdG9wKFBXQjMyX0FEQVBURVIgQWRhcHRlcikKLXsKLQlPU19USU1FUl9DQU5DRUwoICYoQWRhcHRlci0+TWRzLm5UaW1lciksIDAgKTsKLX0KLQotdm9pZCBSeFRpbWVySGFuZGxlcl8xYSggUEFEQVBURVIgQWRhcHRlcikKLXsKLQlSeFRpbWVySGFuZGxlcihOVUxMLCBBZGFwdGVyLCBOVUxMLCBOVUxMKTsKLX0KLQotdm9pZCBSeFRpbWVySGFuZGxlcih2b2lkKiBTeXN0ZW1TcGVjaWZpYzEsIFBXQjMyX0FEQVBURVIgQWRhcHRlciwKLQkJICAgIHZvaWQqIFN5c3RlbVNwZWNpZmljMiwgdm9pZCogU3lzdGVtU3BlY2lmaWMzKQotewotCVdBUk5fT04oMSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zY2FuX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NjYW5fcy5oCmluZGV4IDFkMWIwYzQuLjc3NWJiODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NjYW5fcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NjYW5fcy5oCkBAIC0xLDMgKzEsOSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfU0NBTl9TX0gKKyNkZWZpbmUgX19XSU5CT05EX1NDQU5fU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImxvY2FscGFyYS5oIgorCiAvLwogLy8gU0NBTiB0YXNrIGdsb2JhbCBDT05TVEFOVFMsIFNUUlVDVFVSRVMsIHZhcmlhYmxlcwogLy8KQEAgLTYyLDggKzY4LDcgQEAKIAl1OAkJCQlib0NDQWJ1c3k7CQkJCQkvLyBXYjogSFdNQUMgQ0NBIGJ1c3kgc3RhdHVzCiAJdTgJCQkJcmVzZXJ2ZWRfMjsKIAotCS8vTkRJU19NSU5JUE9SVF9USU1FUgluVGltZXI7Ci0JT1NfVElNRVIJCQluVGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAKIAl1MzIJCQkJU2NhblRpbWVTdGFtcDsJCQkvL0luY3JlYXNlIDEgcGVyIGJhY2tncm91bmQgc2NhbigxIG1pbnV0ZSkKIAl1MzIJCQkJQnNzVGltZVN0YW1wOwkJCS8vSW5jcmVhc2UgMSBwZXIgY29ubmVjdCBzdGF0dXMgY2hlY2sKQEAgLTc4LDkgKzgzLDkgQEAKIAogfSBTQ0FOX1BBUkFNRVRFUlMsICpwc1NDQU5fUEFSQU1FVEVSUzsKIAotLy8gRW5jYXBzdWxhdGUgJ0FkYXB0ZXInIGRhdGEgc3RydWN0dXJlCi0jZGVmaW5lIHBzU0NBTgkJCSgmKEFkYXB0ZXItPnNTY2FuUGFyYSkpCi0jZGVmaW5lIHBzU0NBTlJFUQkJCSgmKEFkYXB0ZXItPnNTY2FuUGFyYS5zU2NhblJlcSkpCisvLyBFbmNhcHN1bGF0ZSAnYWRhcHRlcicgZGF0YSBzdHJ1Y3R1cmUKKyNkZWZpbmUgcHNTQ0FOCQkJKCYoYWRhcHRlci0+c1NjYW5QYXJhKSkKKyNkZWZpbmUgcHNTQ0FOUkVRCQkJKCYoYWRhcHRlci0+c1NjYW5QYXJhLnNTY2FuUmVxKSkKIAogLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogLy8Jc2Nhbi5oCkBAIC0xMDksNyArMTE0LDggQEAKIAogLy8gc3RhdGljIGZ1bmN0aW9ucwogCi0vL3N0YXRpYyB2b2lkIFNjYW5UaW1lckhhbmRsZXIoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLS8vc3RhdGljIHZvaWQgdlNjYW5UaW1lclN0YXJ0KFBXQjMyX0FEQVBURVIJQWRhcHRlciwgaW50IHRpbWVvdXRfdmFsdWUpOwotLy9zdGF0aWMgdm9pZCB2U2NhblRpbWVyU3RvcChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOworLy9zdGF0aWMgdm9pZCBTY2FuVGltZXJIYW5kbGVyKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOworLy9zdGF0aWMgdm9pZCB2U2NhblRpbWVyU3RhcnQoc3RydWN0IHdic29mdF9wcml2ICoJYWRhcHRlciwgaW50IHRpbWVvdXRfdmFsdWUpOworLy9zdGF0aWMgdm9pZCB2U2NhblRpbWVyU3RvcChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKIAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzk2NzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHNtZV9hcGkuYwotLy8KLS8vIENvcHlyaWdodChDKSAyMDAyIFdpbmJvbmQgRWxlY3Ryb25pY3MgQ29ycC4KLS8vCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpbmNsdWRlICJvc19jb21tb24uaCIKLQotczggc21lX2dldF9yc3NpKHZvaWQgKnBjb3JlX2RhdGEsIHMzMiAqcHJzc2kpCi17Ci0gICAgICAgQlVHKCk7Ci0gICAgICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmgKaW5kZXggNzQ1ZWIzNy4uMTg4YTI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9hcGkuaApAQCAtMTMsNiArMTMsMTAgQEAKICNpZm5kZWYgX19TTUVfQVBJX0hfXwogI2RlZmluZSBfX1NNRV9BUElfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibG9jYWxwYXJhLmgiCisKIC8qKioqKioqKioqKioqKioqKiogSU5DTFVERSBGSUxFUyBTRUNUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLy8jaW5jbHVkZSAiR0xcZ2xfY29yZS5oIgogCkBAIC01Miw5ICs1Niw2IEBACiBzOCBzbWVfZ2V0X3J0c190aHJlc2hvbGQodm9pZCAqcGNvcmVfZGF0YSwgdTMyICpwdGhyZXNob2xkKTsKIHM4IHNtZV9zZXRfcnRzX3RocmVzaG9sZCh2b2lkICpwY29yZV9kYXRhLCB1MzIgdGhyZXNob2xkKTsKIAotLy8gT0lEXzgwMl8xMV9SU1NJCi1zOCBzbWVfZ2V0X3Jzc2kodm9pZCAqcGNvcmVfZGF0YSwgczMyICpwcnNzaSk7Ci0KIC8vIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTgogczggc21lX2dldF9iZWFjb25fcGVyaW9kKHZvaWQgKnBjb3JlX2RhdGEsIHUxNiAqcGJlYWNvbl9wZXJpb2QpOwogczggc21lX3NldF9iZWFjb25fcGVyaW9kKHZvaWQgKnBjb3JlX2RhdGEsIHUxNiBiZWFjb25fcGVyaW9kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfcy5oCmluZGV4IGRmZDJmYmMuLjFiZDExOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX3MuaApAQCAtMSwzICsxLDExIEBACisjaWZuZGVmIF9fV0lOQk9ORF9TTUVfU19ICisjZGVmaW5lIF9fV0lOQk9ORF9TTUVfU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWFjX3N0cnVjdHVyZXMuaCIKKyNpbmNsdWRlICJsb2NhbHBhcmEuaCIKKwogLy8KIC8vIFNNRV9TLkggLQogLy8gU01FIHRhc2sgZ2xvYmFsIENPTlNUQU5UUywgU1RSVUNUVVJFUywgdmFyaWFibGVzCkBAIC0xMDYsOCArMTE0LDcgQEAKIAl1OAkJCQliRGVzaXJlZFBvd2VyU2F2ZTsKIAogCS8vIFNNRSB0aW1lciBhbmQgdGltZW91dCB2YWx1ZQotCS8vTkRJU19NSU5JUE9SVF9USU1FUgluVGltZXI7Ci0JT1NfVElNRVIJCQluVGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAKIAl1OAkJCQlib0luVGltZXJIYW5kbGVyOwogCXU4IAkJCQlib0F1dGhSZXRyeUFjdGl2ZTsKQEAgLTE5Niw5ICsyMDMsOSBAQAogCiB9IFNNRV9QQVJBTUVURVJTLCAqUFNNRV9QQVJBTUVURVJTOwogCi0jZGVmaW5lIHBzU01FCQkJKCYoQWRhcHRlci0+c1NtZVBhcmEpKQorI2RlZmluZSBwc1NNRQkJCSgmKGFkYXB0ZXItPnNTbWVQYXJhKSkKIAotI2RlZmluZSB3U01FR2V0Q3VycmVudFNUQVN0YXRlKEFkYXB0ZXIpCQkoKHUxNikoQWRhcHRlciktPnNTbWVQYXJhLndTdGF0ZSkKKyNkZWZpbmUgd1NNRUdldEN1cnJlbnRTVEFTdGF0ZShhZGFwdGVyKQkJKCh1MTYpKGFkYXB0ZXIpLT5zU21lUGFyYS53U3RhdGUpCiAKIAogCkBAIC0yMjYsMyArMjMzLDQgQEAKIAogLy8gU3RhdGljIGZ1bmN0aW9uCiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zeXNkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTFiOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmgKQEAgLTAsMCArMSw0MCBAQAorCisKKy8vCisvLyBXaW5ib25kIFdMQU4gU3lzdGVtIENvbmZpZ3VyYXRpb24gZGVmaW5lcworLy8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEN1cnJlbnQgZGlyZWN0b3J5IGlzIExpbnV4CisvLyBUaGUgZGVmaW5pdGlvbiBXQl9MSU5VWCBpcyBhIGtleXdvcmQgZm9yIHRoaXMgT1MKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWZuZGVmIFNZU19ERUZfSAorI2RlZmluZSBTWVNfREVGX0gKKyNkZWZpbmUgV0JfTElOVVgKKyNkZWZpbmUgV0JfTElOVVhfV1BBX1BTSworCisKKy8vI2RlZmluZSBfSUJTU19CRUFDT05fU0VRX1NUSUNLXworI2RlZmluZSBfVVNFX0ZBTExCQUNLX1JBVEVfCisvLyNkZWZpbmUgQU5URElWX0RFRkFVTFRfT04KKworI2RlZmluZSBfV1BBMl8JLy8gMjAwNjExMjIgSXQncyBuZWVkZWQgZm9yIGN1cnJlbnQgTGludXggZHJpdmVyCisKKworI2lmbmRlZiBfV1BBX1BTS19ERUJVRworI3VuZGVmICBfV1BBX1BTS19ERUJVRworI2VuZGlmCisKKy8vIGRlYnVnIHByaW50IG9wdGlvbnMsIG1hcmsgd2hhdCBkZWJ1ZyB5b3UgZG9uJ3QgbmVlZAorCisjaWZkZWYgRlVMTF9ERUJVRworI2RlZmluZSBfUEVfU1RBVEVfRFVNUF8KKyNkZWZpbmUgX1BFX1RYX0RVTVBfCisjZGVmaW5lIF9QRV9SWF9EVU1QXworI2RlZmluZSBfUEVfT0lEX0RVTVBfCisjZGVmaW5lIF9QRV9EVE9fRFVNUF8KKyNkZWZpbmUgX1BFX1JFR19EVU1QXworI2RlZmluZSBfUEVfVVNCX0lOSV9EVU1QXworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NGIzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMKQEAgLTAsMCArMSw3NDcgQEAKKyNpbmNsdWRlICJzeXNkZWYuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCitleHRlcm4gdm9pZCBwaHlfY2FsaWJyYXRpb25fd2luYm9uZChod19kYXRhX3QgKnBod19kYXRhLCB1MzIgZnJlcXVlbmN5KTsKKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKKy8vIFJlZ2lzdGVyTm8gOiBzdGFydCBiYXNlCisvLyBwUmVnaXN0ZXJEYXRhIDogZGF0YSBwb2ludAorLy8gTnVtYmVyT2ZEYXRhIDogbnVtYmVyIG9mIHJlZ2lzdGVyIGRhdGEKKy8vIEZsYWcgOiBBVVRPX0lOQ1JFTUVOVCAtIFJlZ2lzdGVyTm8gd2lsbCBhdXRvIGluY3JlbWVudCA0CisvLwkJICBOT19JTkNSRU1FTlQgLSBGdW5jdGlvbiB3aWxsIHdyaXRlIGRhdGEgaW50byB0aGUgc2FtZSByZWdpc3RlcgordW5zaWduZWQgY2hhcgorV2IzNVJlZ19CdXJzdFdyaXRlKHBod19kYXRhX3QgcEh3RGF0YSwgdTE2IFJlZ2lzdGVyTm8sIHUzMiAqIHBSZWdpc3RlckRhdGEsIHU4IE51bWJlck9mRGF0YSwgdTggRmxhZykKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVyYgkqdXJiID0gTlVMTDsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZSA9IE5VTEw7CisJdTE2CQlVcmJTaXplOworCXN0cnVjdCAgICAgIHVzYl9jdHJscmVxdWVzdCAqZHI7CisJdTE2CQlpLCBEYXRhU2l6ZSA9IE51bWJlck9mRGF0YSo0OworCisJLy8gTW9kdWxlIHNodXRkb3duCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvLyBUcnlpbmcgdG8gdXNlIGJ1cnN0IHdyaXRlIGZ1bmN0aW9uIGlmIHVzZSBuZXcgaGFyZHdhcmUKKwlVcmJTaXplID0gc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkgKyBEYXRhU2l6ZSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwlyZWdfcXVldWUgPSBremFsbG9jKFVyYlNpemUsIEdGUF9BVE9NSUMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYoIHVyYiAmJiByZWdfcXVldWUgKSB7CisJCXJlZ19xdWV1ZS0+RElSRUNUID0gMjsvLyBidXJzdCB3cml0ZSByZWdpc3RlcgorCQlyZWdfcXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKKwkJcmVnX3F1ZXVlLT5wQnVmZmVyID0gKHUzMiAqKSgodTggKilyZWdfcXVldWUgKyBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSk7CisJCW1lbWNweSggcmVnX3F1ZXVlLT5wQnVmZmVyLCBwUmVnaXN0ZXJEYXRhLCBEYXRhU2l6ZSApOworCQkvL3RoZSBmdW5jdGlvbiBmb3IgcmV2ZXJzaW5nIHJlZ2lzdGVyIGRhdGEgZnJvbSBsaXR0bGUgZW5kaWFuIHRvIGJpZyBlbmRpYW4KKwkJZm9yKCBpPTA7IGk8TnVtYmVyT2ZEYXRhIDsgaSsrICkKKwkJCXJlZ19xdWV1ZS0+cEJ1ZmZlcltpXSA9IGNwdV90b19sZTMyKCByZWdfcXVldWUtPnBCdWZmZXJbaV0gKTsKKworCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXJlZ19xdWV1ZSArIHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpICsgRGF0YVNpemUpOworCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFOworCQlkci0+YlJlcXVlc3QgPSAweDA0OyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCisJCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNiggRmxhZyApOyAvLyAwOiBSZWdpc3RlciBudW1iZXIgYXV0by1pbmNyZW1lbnQsIDE6IE5vIGF1dG8gaW5jcmVtZW50CisJCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNiggUmVnaXN0ZXJObyApOworCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KCBEYXRhU2l6ZSApOworCQlyZWdfcXVldWUtPk5leHQgPSBOVUxMOworCQlyZWdfcXVldWUtPnBVc2JSZXEgPSBkcjsKKwkJcmVnX3F1ZXVlLT51cmIgPSB1cmI7CisKKwkJc3Bpbl9sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCWlmIChyZWctPnJlZ19maXJzdCA9PSBOVUxMKQorCQkJcmVnLT5yZWdfZmlyc3QgPSByZWdfcXVldWU7CisJCWVsc2UKKwkJCXJlZy0+cmVnX2xhc3QtPk5leHQgPSByZWdfcXVldWU7CisJCXJlZy0+cmVnX2xhc3QgPSByZWdfcXVldWU7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCQkvLyBTdGFydCBFUDBWTQorCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOworCisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmICh1cmIpCisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJaWYgKHJlZ19xdWV1ZSkKKwkJCWtmcmVlKHJlZ19xdWV1ZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQKK1diMzVSZWdfVXBkYXRlKHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUpCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN3aXRjaCAoUmVnaXN0ZXJObykgeworCWNhc2UgMHgzYjA6IHJlZy0+VTFCMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgzYmM6IHJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4NDAwOiByZWctPkQwMF9EbWFDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgwMDogcmVnLT5NMDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4MDQ6IHJlZy0+TTA0X011bHRpY2FzdEFkZHJlc3MxID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgwODogcmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODI0OiByZWctPk0yNF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgyODogcmVnLT5NMjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4MmM6IHJlZy0+TTJDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODM4OiByZWctPk0zOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg0MDogcmVnLT5NNDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4NDQ6IHJlZy0+TTQ0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODQ4OiByZWctPk00OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg0YzogcmVnLT5NNENfTWFjU3RhdHVzID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg2MDogcmVnLT5NNjBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4Njg6IHJlZy0+TTY4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODcwOiByZWctPk03MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg3NDogcmVnLT5NNzRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4Nzg6IHJlZy0+TTc4X0VSUEluZm9ybWF0aW9uID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg3QzogcmVnLT5NN0NfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4ODA6IHJlZy0+TTgwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODg0OiByZWctPk04NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg4ODogcmVnLT5NODhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4OTg6IHJlZy0+TTk4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTAwYzogcmVnLT5CQjBDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwMmM6IHJlZy0+QkIyQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDMwOiByZWctPkJCMzAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTAzYzogcmVnLT5CQjNDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNDg6IHJlZy0+QkI0OCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDRjOiByZWctPkJCNEMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA1MDogcmVnLT5CQjUwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNTQ6IHJlZy0+QkI1NCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDU4OiByZWctPkJCNTggPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA1YzogcmVnLT5CQjVDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNjA6IHJlZy0+QkI2MCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCX0KK30KKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfV3JpdGVTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCWludCByZXQgPSAtMTsKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJUmVnaXN0ZXJWYWx1ZSA9IGNwdV90b19sZTMyKFJlZ2lzdGVyVmFsdWUpOworCisJLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVzYiBtZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJcmVnLT5TeW5jSW9QYXVzZSA9IDE7CisKKwkvLyAyMDA2MDcxNy41IFdhaXQgdW50aWwgRVAwVk0gc3RvcAorCXdoaWxlIChyZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApCisJCW1zbGVlcCgxMCk7CisKKwkvLyBTeW5jIElvQ2FsbERyaXZlcgorCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCXJldCA9IHVzYl9jb250cm9sX21zZyggcEh3RGF0YS0+V2JVc2IudWRldiwKKwkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUoIHBId0RhdGEtPldiVXNiLnVkZXYsIDAgKSwKKwkJCSAgICAgICAweDAzLCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9PVVQsCisJCQkgICAgICAgMHgwLFJlZ2lzdGVyTm8sICZSZWdpc3RlclZhbHVlLCA0LCBIWioxMDAgKTsKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKKwlyZWctPlN5bmNJb1BhdXNlID0gMDsKKworCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CisKKwlpZiAocmV0IDwgMCkgeworCQkjaWZkZWYgX1BFX1JFR19EVU1QXworCQlXQkRFQlVHKCgiRVAwIFdyaXRlIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpKTsKKwkJI2VuZGlmCisKKwkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOyAvLyAyMDA2MDcwNC4yCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfV3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7CisJc3RydWN0IHVyYgkqdXJiID0gTlVMTDsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZSA9IE5VTEw7CisJdTE2CQlVcmJTaXplOworCisKKwkvLyBNb2R1bGUgc2h1dGRvd24KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKworCS8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1cmIgcmVxdWVzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVyYlNpemUgPSBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwlyZWdfcXVldWUgPSBremFsbG9jKFVyYlNpemUsIEdGUF9BVE9NSUMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKHVyYiAmJiByZWdfcXVldWUpIHsKKwkJcmVnX3F1ZXVlLT5ESVJFQ1QgPSAxOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCisJCXJlZ19xdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOworCQlyZWdfcXVldWUtPlZBTFVFID0gY3B1X3RvX2xlMzIoUmVnaXN0ZXJWYWx1ZSk7CisJCXJlZ19xdWV1ZS0+UkVTRVJWRURfVkFMSUQgPSBmYWxzZTsKKwkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilyZWdfcXVldWUgKyBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSk7CisJCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1J8VVNCX0RJUl9PVVQgfFVTQl9SRUNJUF9ERVZJQ0U7CisJCWRyLT5iUmVxdWVzdCA9IDB4MDM7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKKwkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7CisJCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNihSZWdpc3Rlck5vKTsKKwkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNig0KTsKKworCQkvLyBFbnRlciB0aGUgc2VuZGluZyBxdWV1ZQorCQlyZWdfcXVldWUtPk5leHQgPSBOVUxMOworCQlyZWdfcXVldWUtPnBVc2JSZXEgPSBkcjsKKwkJcmVnX3F1ZXVlLT51cmIgPSB1cmI7CisKKwkJc3Bpbl9sb2NrX2lycSgmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwkJaWYgKHJlZy0+cmVnX2ZpcnN0ID09IE5VTEwpCisJCQlyZWctPnJlZ19maXJzdCA9IHJlZ19xdWV1ZTsKKwkJZWxzZQorCQkJcmVnLT5yZWdfbGFzdC0+TmV4dCA9IHJlZ19xdWV1ZTsKKwkJcmVnLT5yZWdfbGFzdCA9IHJlZ19xdWV1ZTsKKworCQlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCS8vIFN0YXJ0IEVQMFZNCisJCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CisKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKHVyYikKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQlrZnJlZShyZWdfcXVldWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisvL1RoaXMgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggYSB1c2VyIGRlZmluZWQgdmFsdWUuIFdoZW4gaXQgY29tcGxldGVzLAorLy90aGlzIHZhbHVlIGlzIHVzZWZ1bC4gRm9yIGV4YW1wbGUsIGhhbF9zZXRfY3VycmVudF9jaGFubmVsIHdpbGwgdXNlIGl0LgorLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggcGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgdTMyIFJlZ2lzdGVyVmFsdWUsCisJCQkJczggKnBWYWx1ZSwgczggTGVuKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKKwlzdHJ1Y3QgdXJiCSp1cmIgPSBOVUxMOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlID0gTlVMTDsKKwl1MTYJCVVyYlNpemU7CisKKwkvLyBNb2R1bGUgc2h1dGRvd24KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKworCS8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1cmIgcmVxdWVzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVyYlNpemUgPSBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwlyZWdfcXVldWUgPSBremFsbG9jKFVyYlNpemUsIEdGUF9BVE9NSUMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKHVyYiAmJiByZWdfcXVldWUpIHsKKwkJcmVnX3F1ZXVlLT5ESVJFQ1QgPSAxOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCisJCXJlZ19xdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOworCQlyZWdfcXVldWUtPlZBTFVFID0gY3B1X3RvX2xlMzIoUmVnaXN0ZXJWYWx1ZSk7CisJCS8vTk9URSA6IFVzZXJzIG11c3QgZ3VhcmFudGVlIHRoZSBzaXplIG9mIHZhbHVlIHdpbGwgbm90IGV4Y2VlZCB0aGUgYnVmZmVyIHNpemUuCisJCW1lbWNweShyZWdfcXVldWUtPlJFU0VSVkVELCBwVmFsdWUsIExlbik7CisJCXJlZ19xdWV1ZS0+UkVTRVJWRURfVkFMSUQgPSB0cnVlOworCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXJlZ19xdWV1ZSArIHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpKTsKKwkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfRElSX09VVCB8VVNCX1JFQ0lQX0RFVklDRTsKKwkJZHItPmJSZXF1ZXN0ID0gMHgwMzsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQorCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMHgwKTsKKwkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KFJlZ2lzdGVyTm8pOworCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KDQpOworCisJCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCisJCXJlZ19xdWV1ZS0+TmV4dCA9IE5VTEw7CisJCXJlZ19xdWV1ZS0+cFVzYlJlcSA9IGRyOworCQlyZWdfcXVldWUtPnVyYiA9IHVyYjsKKwkJc3Bpbl9sb2NrX2lycSAoJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCWlmKCByZWctPnJlZ19maXJzdCA9PSBOVUxMICkKKwkJCXJlZy0+cmVnX2ZpcnN0ID0gcmVnX3F1ZXVlOworCQllbHNlCisJCQlyZWctPnJlZ19sYXN0LT5OZXh0ID0gcmVnX3F1ZXVlOworCQlyZWctPnJlZ19sYXN0ID0gcmVnX3F1ZXVlOworCisJCXNwaW5fdW5sb2NrX2lycSAoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCS8vIFN0YXJ0IEVQMFZNCisJCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmICh1cmIpCisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJa2ZyZWUocmVnX3F1ZXVlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKKy8vIHBSZWdpc3RlclZhbHVlIDogSXQgbXVzdCBiZSBhIHJlc2lkZW50IGJ1ZmZlciBkdWUgdG8gYXN5bmNocm9ub3VzIHJlYWQgcmVnaXN0ZXIuCit1bnNpZ25lZCBjaGFyCitXYjM1UmVnX1JlYWRTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwl1MzIgKglwbHRtcCA9IHBSZWdpc3RlclZhbHVlOworCWludCByZXQgPSAtMTsKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLy8gUmVhZCB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1c2IgbWVzc2FnZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcmVnLT5TeW5jSW9QYXVzZSA9IDE7CisKKwkvLyAyMDA2MDcxNy41IFdhaXQgdW50aWwgRVAwVk0gc3RvcAorCXdoaWxlIChyZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApCisJCW1zbGVlcCgxMCk7CisKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coIHBId0RhdGEtPldiVXNiLnVkZXYsCisJCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDApLAorCQkJICAgICAgIDB4MDEsIFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU4sCisJCQkgICAgICAgMHgwLCBSZWdpc3Rlck5vLCBwbHRtcCwgNCwgSFoqMTAwICk7CisKKwkqcFJlZ2lzdGVyVmFsdWUgPSBjcHVfdG9fbGUzMigqcGx0bXApOworCisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisKKwlXYjM1UmVnX1VwZGF0ZSggcEh3RGF0YSwgUmVnaXN0ZXJObywgKnBSZWdpc3RlclZhbHVlICk7CisJcmVnLT5TeW5jSW9QYXVzZSA9IDA7CisKKwlXYjM1UmVnX0VQMFZNX3N0YXJ0KCBwSHdEYXRhICk7CisKKwlpZiAocmV0IDwgMCkgeworCQkjaWZkZWYgX1BFX1JFR19EVU1QXworCQlXQkRFQlVHKCgiRVAwIFJlYWQgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIikpOworCQkjZW5kaWYKKworCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7IC8vIDIwMDYwNzA0LjIKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvLyB0cnVlICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQorLy8gZmFsc2UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAorLy8gcFJlZ2lzdGVyVmFsdWUgOiBJdCBtdXN0IGJlIGEgcmVzaWRlbnQgYnVmZmVyIGR1ZSB0byBhc3luY2hyb25vdXMgcmVhZCByZWdpc3Rlci4KK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfUmVhZChwaHdfZGF0YV90IHBId0RhdGEsIHUxNiBSZWdpc3Rlck5vLCAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICogZHI7CisJc3RydWN0IHVyYgkqdXJiOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlOworCXUxNgkJVXJiU2l6ZTsKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLy8gdXBkYXRlIHRoZSB2YXJpYWJsZSBieSBzZW5kIFVyYiB0byByZWFkIHJlZ2lzdGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVyYlNpemUgPSBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwlyZWdfcXVldWUgPSBremFsbG9jKFVyYlNpemUsIEdGUF9BVE9NSUMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYoIHVyYiAmJiByZWdfcXVldWUgKQorCXsKKwkJcmVnX3F1ZXVlLT5ESVJFQ1QgPSAwOy8vIHJlYWQgcmVnaXN0ZXIKKwkJcmVnX3F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87CisJCXJlZ19xdWV1ZS0+cEJ1ZmZlciA9IHBSZWdpc3RlclZhbHVlOworCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXJlZ19xdWV1ZSArIHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpKTsKKwkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU47CisJCWRyLT5iUmVxdWVzdCA9IDB4MDE7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKKwkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7CisJCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNiAoUmVnaXN0ZXJObyk7CisJCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYgKDQpOworCisJCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCisJCXJlZ19xdWV1ZS0+TmV4dCA9IE5VTEw7CisJCXJlZ19xdWV1ZS0+cFVzYlJlcSA9IGRyOworCQlyZWdfcXVldWUtPnVyYiA9IHVyYjsKKwkJc3Bpbl9sb2NrX2lycSAoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCQlpZiggcmVnLT5yZWdfZmlyc3QgPT0gTlVMTCApCisJCQlyZWctPnJlZ19maXJzdCA9IHJlZ19xdWV1ZTsKKwkJZWxzZQorCQkJcmVnLT5yZWdfbGFzdC0+TmV4dCA9IHJlZ19xdWV1ZTsKKwkJcmVnLT5yZWdfbGFzdCA9IHJlZ19xdWV1ZTsKKworCQlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCS8vIFN0YXJ0IEVQMFZNCisJCVdiMzVSZWdfRVAwVk1fc3RhcnQoIHBId0RhdGEgKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAodXJiKQorCQkJdXNiX2ZyZWVfdXJiKCB1cmIgKTsKKwkJa2ZyZWUocmVnX3F1ZXVlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworCit2b2lkCitXYjM1UmVnX0VQMFZNX3N0YXJ0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnJlZy0+UmVnRmlyZUNvdW50KSA9PSAxKSB7CisJCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCQlXYjM1UmVnX0VQMFZNKHBId0RhdGEpOworCX0gZWxzZQorCQlhdG9taWNfZGVjKCZyZWctPlJlZ0ZpcmVDb3VudCk7Cit9CisKK3ZvaWQKK1diMzVSZWdfRVAwVk0ocGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVyYgkqdXJiOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOworCXUzMiAqCQlwQnVmZmVyOworCWludAkJCXJldCA9IC0xOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlOworCisKKwlpZiAocmVnLT5TeW5jSW9QYXVzZSkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlnb3RvIGNsZWFudXA7CisKKwkvLyBHZXQgdGhlIHJlZ2lzdGVyIGRhdGEgYW5kIHNlbmQgdG8gVVNCIHRocm91Z2ggSXJwCisJc3Bpbl9sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJcmVnX3F1ZXVlID0gcmVnLT5yZWdfZmlyc3Q7CisJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCWlmICghcmVnX3F1ZXVlKQorCQlnb3RvIGNsZWFudXA7CisKKwkvLyBHZXQgYW4gVXJiLCBzZW5kIGl0CisJdXJiID0gKHN0cnVjdCB1cmIgKilyZWdfcXVldWUtPnVyYjsKKworCWRyID0gcmVnX3F1ZXVlLT5wVXNiUmVxOworCXVyYiA9IHJlZ19xdWV1ZS0+dXJiOworCXBCdWZmZXIgPSByZWdfcXVldWUtPnBCdWZmZXI7CisJaWYgKHJlZ19xdWV1ZS0+RElSRUNUID09IDEpIC8vIG91dHB1dAorCQlwQnVmZmVyID0gJnJlZ19xdWV1ZS0+VkFMVUU7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYiggdXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAorCQkJICAgICAgUkVHX0RJUkVDVElPTihwSHdEYXRhLT5XYlVzYi51ZGV2LHJlZ19xdWV1ZSksCisJCQkgICAgICAodTggKilkcixwQnVmZmVyLGNwdV90b19sZTE2KGRyLT53TGVuZ3RoKSwKKwkJCSAgICAgIFdiMzVSZWdfRVAwVk1fY29tcGxldGUsICh2b2lkKilwSHdEYXRhKTsKKworCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCisJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChyZXQgPCAwKSB7CisjaWZkZWYgX1BFX1JFR19EVU1QXworCQlXQkRFQlVHKCgiRVAwIElycCBzZW5kaW5nIGVycm9yXG4iKSk7CisjZW5kaWYKKwkJZ290byBjbGVhbnVwOworCX0KKworCXJldHVybjsKKworIGNsZWFudXA6CisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisJYXRvbWljX2RlYygmcmVnLT5SZWdGaXJlQ291bnQpOworfQorCisKK3ZvaWQKK1diMzVSZWdfRVAwVk1fY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQoreworCXBod19kYXRhX3QgIHBId0RhdGEgPSAocGh3X2RhdGFfdCl1cmItPmNvbnRleHQ7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlOworCisKKwkvLyBWYXJpYWJsZSBzZXR0aW5nCisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKKwlyZWctPkVQMFZNX3N0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSB7IC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKKwkJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCWF0b21pY19kZWMoJnJlZy0+UmVnRmlyZUNvdW50KTsKKwl9IGVsc2UgeworCQkvLyBDb21wbGV0ZSB0byBzZW5kLCByZW1vdmUgdGhlIFVSQiBmcm9tIHRoZSBmaXJzdAorCQlzcGluX2xvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwkJcmVnX3F1ZXVlID0gcmVnLT5yZWdfZmlyc3Q7CisJCWlmIChyZWdfcXVldWUgPT0gcmVnLT5yZWdfbGFzdCkKKwkJCXJlZy0+cmVnX2xhc3QgPSBOVUxMOworCQlyZWctPnJlZ19maXJzdCA9IHJlZy0+cmVnX2ZpcnN0LT5OZXh0OworCQlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCWlmIChyZWctPkVQMFZNX3N0YXR1cykgeworI2lmZGVmIF9QRV9SRUdfRFVNUF8KKwkJCVdCREVCVUcoKCJFUDAgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7CisJCQlEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggcmVnLT5FUDBWTV9zdGF0dXMgKTsKKyNlbmRpZgorCQkJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7CisJCX0gZWxzZSB7CisJCQkvLyBTdWNjZXNzLiBVcGRhdGUgdGhlIHJlc3VsdAorCisJCQkvLyBTdGFydCB0aGUgbmV4dCBzZW5kCisJCQlXYjM1UmVnX0VQMFZNKHBId0RhdGEpOworCQl9CisKKyAgIAkJa2ZyZWUocmVnX3F1ZXVlKTsKKwl9CisKKwl1c2JfZnJlZV91cmIodXJiKTsKK30KKworCit2b2lkCitXYjM1UmVnX2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXJiCSp1cmI7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfcXVldWU7CisKKworCVV4eF9wb3dlcl9vZmZfcHJvY2VkdXJlKHBId0RhdGEpOworCisJLy8gV2FpdCBmb3IgUmVnIG9wZXJhdGlvbiBjb21wbGV0ZWQKKwlkbyB7CisJCW1zbGVlcCgxMCk7IC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmEKKwl9IHdoaWxlIChyZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApOworCW1zbGVlcCgxMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5iCisKKwkvLyBSZWxlYXNlIGFsbCB0aGUgZGF0YSBpbiBSZWdRdWV1ZQorCXNwaW5fbG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCXJlZ19xdWV1ZSA9IHJlZy0+cmVnX2ZpcnN0OworCXdoaWxlIChyZWdfcXVldWUpIHsKKwkJaWYgKHJlZ19xdWV1ZSA9PSByZWctPnJlZ19sYXN0KQorCQkJcmVnLT5yZWdfbGFzdCA9IE5VTEw7CisJCXJlZy0+cmVnX2ZpcnN0ID0gcmVnLT5yZWdfZmlyc3QtPk5leHQ7CisKKwkJdXJiID0gcmVnX3F1ZXVlLT51cmI7CisJCXNwaW5fdW5sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCWlmICh1cmIpIHsKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQkJa2ZyZWUocmVnX3F1ZXVlKTsKKwkJfSBlbHNlIHsKKwkJCSNpZmRlZiBfUEVfUkVHX0RVTVBfCisJCQlXQkRFQlVHKCgiRVAwIHF1ZXVlIHJlbGVhc2UgZXJyb3JcbiIpKTsKKwkJCSNlbmRpZgorCQl9CisJCXNwaW5fbG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCXJlZ19xdWV1ZSA9IHJlZy0+cmVnX2ZpcnN0OworCX0KKwlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGhlIGZ1bmN0aW9uIGNhbiBiZSBydW4gaW4gcGFzc2l2ZS1sZXZlbCBvbmx5LgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZz0mcEh3RGF0YS0+cmVnOworCXUzMiBsdG1wOworCXUzMiBTb2Z0d2FyZVNldCwgVkNPX3RyaW0sIFR4VmdhLCBSZWdpb25fU2NhbkludGVydmFsOworCisJLy8gU3BpbiBsb2NrIGlzIGFjcXVpcmVkIGZvciByZWFkIGFuZCB3cml0ZSBJUlAgY29tbWFuZAorCXNwaW5fbG9ja19pbml0KCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCS8vIEdldHRpbmcgUkYgbW9kdWxlIHR5cGUgZnJvbSBFRVBST00gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODBkMDAwMCApOyAvLyBTdGFydCBFRVBST00gYWNjZXNzICsgUmVhZCArIGFkZHJlc3MoMHgwZCkKKwlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZsdG1wICk7CisKKwkvL1VwZGF0ZSBSRiBtb2R1bGUgdHlwZSBhbmQgZGV0ZXJtaW5lIHRoZSBQSFkgdHlwZSBieSBpbmYgb3IgRUVQUk9NCisJcmVnLT5FRVBST01QaHlUeXBlID0gKHU4KSggbHRtcCAmIDB4ZmYgKTsKKwkvLyAwIFYgTUFYMjgyNSwgMSBWIE1BWDI4MjcsIDIgViBNQVgyODI4LCAzIFYgTUFYMjgyOQorCS8vIDE2ViBBTDIyMzAsIDE3IC0gQUw3MjMwLCAxOCAtIEFMMjIzMFMKKwkvLyAzMiBSZXNlcnZlZAorCS8vIDMzIC0gVzg5UkYyNDIoVHhWR0EgMH4xOSksIDM0IC0gVzg5UkYyNDIoVHhWR0EgMH4zNCkKKwlpZiAocmVnLT5FRVBST01QaHlUeXBlICE9IFJGX0RFQ0lERV9CWV9JTkYpIHsKKwkJaWYoIChyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyNSkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyNykJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyOCkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyOSkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fVjEpCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV8yMjMwKQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9BSVJPSEFfMjIzMFMpICAgIHx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV83MjMwKQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9XQl8yNDIpCQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9XQl8yNDJfMSkpCisJCQlwSHdEYXRhLT5waHlfdHlwZSA9IHJlZy0+RUVQUk9NUGh5VHlwZTsKKwl9CisKKwkvLyBQb3dlciBPbiBwcm9jZWR1cmUgcnVubmluZy4gVGhlIHJlbGF0aXZlIHBhcmFtZXRlciB3aWxsIGJlIHNldCBhY2NvcmRpbmcgdG8gcGh5X3R5cGUKKwlVeHhfcG93ZXJfb25fcHJvY2VkdXJlKCBwSHdEYXRhICk7CisKKwkvLyBSZWFkaW5nIE1BQyBhZGRyZXNzCisJVXh4X1JlYWRFdGhlcm5ldEFkZHJlc3MoIHBId0RhdGEgKTsKKworCS8vIFJlYWQgVkNPIHRyaW0gZm9yIFJGIHBhcmFtZXRlcgorCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgyMDAwMDAgKTsKKwlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZWQ09fdHJpbSApOworCisJLy8gUmVhZCBBbnRlbm5hIE9uL09mZiBvZiBzb2Z0d2FyZSBmbGFnCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODIxMDAwMCApOworCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlNvZnR3YXJlU2V0ICk7CisKKwkvLyBSZWFkIFRYVkdBCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODEwMDAwMCApOworCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlR4VmdhICk7CisKKwkvLyBHZXQgU2NhbiBpbnRlcnZhbCBzZXR0aW5nIGZyb20gRUVQUk9NIG9mZnNldCAweDFjCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODFkMDAwMCApOworCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlJlZ2lvbl9TY2FuSW50ZXJ2YWwgKTsKKworCS8vIFVwZGF0ZSBFdGhlcm5ldCBhZGRyZXNzCisJbWVtY3B5KCBwSHdEYXRhLT5DdXJyZW50TWFjQWRkcmVzcywgcEh3RGF0YS0+UGVybWFuZW50TWFjQWRkcmVzcywgRVRIX0xFTkdUSF9PRl9BRERSRVNTICk7CisKKwkvLyBVcGRhdGUgc29mdHdhcmUgdmFyaWFibGUKKwlwSHdEYXRhLT5Tb2Z0d2FyZVNldCA9ICh1MTYpKFNvZnR3YXJlU2V0ICYgMHhmZmZmKTsKKwlUeFZnYSAmPSAweDAwMDAwMGZmOworCXBId0RhdGEtPlBvd2VySW5kZXhGcm9tRUVQUk9NID0gKHU4KVR4VmdhOworCXBId0RhdGEtPlZDT190cmltID0gKHU4KVZDT190cmltICYgMHhmZjsKKwlpZiAocEh3RGF0YS0+VkNPX3RyaW0gPT0gMHhmZikKKwkJcEh3RGF0YS0+VkNPX3RyaW0gPSAweDI4OworCisJcmVnLT5FRVBST01SZWdpb24gPSAodTgpKFJlZ2lvbl9TY2FuSW50ZXJ2YWw+PjgpOyAvLyAyMDA2MDcyMAorCWlmKCByZWctPkVFUFJPTVJlZ2lvbjwxIHx8IHJlZy0+RUVQUk9NUmVnaW9uPjYgKQorCQlyZWctPkVFUFJPTVJlZ2lvbiA9IFJFR0lPTl9BVVRPOworCisJLy9Gb3IgR2V0IFR4IFZHQSBmcm9tIEVFUFJPTSAyMDA2MDMxNS41IG1vdmUgaGVyZQorCUdldFR4VmdhRnJvbUVFUFJPTSggcEh3RGF0YSApOworCisJLy8gU2V0IFNjYW4gSW50ZXJ2YWwKKwlwSHdEYXRhLT5TY2FuX0ludGVydmFsID0gKHU4KShSZWdpb25fU2NhbkludGVydmFsICYgMHhmZikgKiAxMDsKKwlpZiAoKHBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPT0gMjU1MCkgfHwgKHBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPCAxMCkpIC8vIElzIGRlZmF1bHQgc2V0dGluZyAweGZmICogMTAKKwkJcEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA9IFNDQU5fTUFYX0NITkxfVElNRTsKKworCS8vIEluaXRpYWwgcmVnaXN0ZXIKKwlSRlN5bnRoZXNpemVyX2luaXRpYWwocEh3RGF0YSk7CisKKwlCQlByb2Nlc3Nvcl9pbml0aWFsKHBId0RhdGEpOyAvLyBBc3luYyB3cml0ZSwgbXVzdCB3YWl0IHVudGlsIGNvbXBsZXRlCisKKwlXYjM1UmVnX3BoeV9jYWxpYnJhdGlvbihwSHdEYXRhKTsKKworCU14eF9pbml0aWFsKHBId0RhdGEpOworCUR4eF9pbml0aWFsKHBId0RhdGEpOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisJZWxzZQorCQlyZXR1cm4gdHJ1ZTsgLy8gSW5pdGlhbCBmYWlsCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDYXJkQ29tcHV0ZUNyYyAtLQorLy8KKy8vICBEZXNjcmlwdGlvbjoKKy8vICAgIFJ1bnMgdGhlIEFVVE9ESU4gSUkgQ1JDIGFsZ29yaXRobSBvbiBidWZmZXIgQnVmZmVyIG9mIGxlbmd0aCwgTGVuZ3RoLgorLy8KKy8vICBBcmd1bWVudHM6CisvLyAgICBCdWZmZXIgLSB0aGUgaW5wdXQgYnVmZmVyCisvLyAgICBMZW5ndGggLSB0aGUgbGVuZ3RoIG9mIEJ1ZmZlcgorLy8KKy8vICBSZXR1cm4gVmFsdWU6CisvLyAgICBUaGUgMzItYml0IENSQyB2YWx1ZS4KKy8vCisvLyAgTm90ZToKKy8vICAgIFRoaXMgaXMgYWRhcHRlZCBmcm9tIHRoZSBjb21tZW50cyBpbiB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2UKKy8vICAgIHZlcnNpb24gaW4gX0dFTlJFUS5BU00gb2YgdGhlIERXQiBORTEwMDAvMjAwMCBkcml2ZXIuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3UzMgorQ2FyZENvbXB1dGVDcmModTggKiBCdWZmZXIsIHUzMiBMZW5ndGgpCit7CisgICAgdTMyIENyYywgQ2Fycnk7CisgICAgdTMyICBpLCBqOworICAgIHU4IEN1ckJ5dGU7CisKKyAgICBDcmMgPSAweGZmZmZmZmZmOworCisgICAgZm9yIChpID0gMDsgaSA8IExlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgQ3VyQnl0ZSA9IEJ1ZmZlcltpXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisKKyAgICAgICAgICAgIENhcnJ5ICAgICA9ICgoQ3JjICYgMHg4MDAwMDAwMCkgPyAxIDogMCkgXiAoQ3VyQnl0ZSAmIDB4MDEpOworICAgICAgICAgICAgQ3JjICAgICA8PD0gMTsKKyAgICAgICAgICAgIEN1ckJ5dGUgPj49IDE7CisKKyAgICAgICAgICAgIGlmIChDYXJyeSkgeworICAgICAgICAgICAgICAgIENyYyA9KENyYyBeIDB4MDRjMTFkYjYpIHwgQ2Fycnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ3JjOworfQorCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRSZXZlcnNlIC0tCisvLyAgIFJldmVyc2UgdGhlIGJpdHMgaW4gdGhlIGlucHV0IGFyZ3VtZW50LCBkd0RhdGEsIHdoaWNoIGlzCisvLyAgIHJlZ2FyZGVkIGFzIGEgc3RyaW5nIG9mIGJpdHMgd2l0aCB0aGUgbGVuZ3RoLCBEYXRhTGVuZ3RoLgorLy8KKy8vIEFyZ3VtZW50czoKKy8vICAgZHdEYXRhICAgICA6CisvLyAgIERhdGFMZW5ndGggOgorLy8KKy8vIFJldHVybjoKKy8vICAgVGhlIGNvbnZlcnRlZCB2YWx1ZS4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1MzIgQml0UmV2ZXJzZSggdTMyIGR3RGF0YSwgdTMyIERhdGFMZW5ndGgpCit7CisJdTMyICAgSGFsZkxlbmd0aCwgaSwgajsKKwl1MzIgICBCaXRBLCBCaXRCOworCisJaWYgKCBEYXRhTGVuZ3RoIDw9IDApICAgICAgIHJldHVybiAwOyAgIC8vIE5vIGNvbnZlcnNpb24gaXMgZG9uZS4KKwlkd0RhdGEgPSBkd0RhdGEgJiAoMHhmZmZmZmZmZiA+PiAoMzIgLSBEYXRhTGVuZ3RoKSk7CisKKwlIYWxmTGVuZ3RoID0gRGF0YUxlbmd0aCAvIDI7CisJZm9yICggaSA9IDAsIGogPSBEYXRhTGVuZ3RoLTEgOyBpIDwgSGFsZkxlbmd0aDsgaSsrLCBqLS0pCisJeworCQlCaXRBID0gR2V0Qml0KCBkd0RhdGEsIGkpOworCQlCaXRCID0gR2V0Qml0KCBkd0RhdGEsIGopOworCQlpZiAoQml0QSAmJiAhQml0QikgeworCQkJZHdEYXRhID0gQ2xlYXJCaXQoIGR3RGF0YSwgaSk7CisJCQlkd0RhdGEgPSBTZXRCaXQoIGR3RGF0YSwgaik7CisJCX0gZWxzZSBpZiAoIUJpdEEgJiYgQml0QikgeworCQkJZHdEYXRhID0gU2V0Qml0KCBkd0RhdGEsIGkpOworCQkJZHdEYXRhID0gQ2xlYXJCaXQoIGR3RGF0YSwgaik7CisJCX0gZWxzZQorCQl7CisJCQkvLyBEbyBub3RoaW5nIHNpbmNlIHRoZXNlIHR3byBiaXRzIGFyZSBvZiB0aGUgc2F2ZSB2YWx1ZXMuCisJCX0KKwl9CisKKwlyZXR1cm4gZHdEYXRhOworfQorCit2b2lkIFdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwl1MzIgQkIzYywgQkI1NDsKKworCWlmICgocEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfV0JfMjQyKSB8fAorCQkocEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfV0JfMjQyXzEpKSB7CisJCXBoeV9jYWxpYnJhdGlvbl93aW5ib25kICggcEh3RGF0YSwgMjQxMiApOyAvLyBTeW5jIG9wZXJhdGlvbgorCQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDEwM2MsICZCQjNjICk7CisJCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MTA1NCwgJkJCNTQgKTsKKworCQlwSHdEYXRhLT5CQjNjX2NhbCA9IEJCM2M7CisJCXBId0RhdGEtPkJCNTRfY2FsID0gQkI1NDsKKworCQlSRlN5bnRoZXNpemVyX2luaXRpYWwocEh3RGF0YSk7CisJCUJCUHJvY2Vzc29yX2luaXRpYWwocEh3RGF0YSk7IC8vIEFzeW5jIG9wZXJhdGlvbgorCisJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwM2MsIEJCM2MgKTsKKwkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1NCwgQkI1NCApOworCX0KK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzIxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQjM1UkVHX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfV0IzNVJFR19GX0gKKworI2luY2x1ZGUgIndiaGFsX3MuaCIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordW5zaWduZWQgY2hhciBXYjM1UmVnX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgVXh4X3Bvd2VyX29uX3Byb2NlZHVyZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBVeHhfcG93ZXJfb2ZmX3Byb2NlZHVyZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBVeHhfUmVhZEV0aGVybmV0QWRkcmVzcyggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBEeHhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBNeHhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBSRlN5bnRoZXNpemVyX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKKy8vdm9pZCBSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBzOCBDaGFubmVsICk7Cit2b2lkIFJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIENoYW5uZWwgKTsKK3ZvaWQgQkJQcm9jZXNzb3JfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBCQlByb2Nlc3Nvcl9SYXRlQ2hhbmdpbmcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCByYXRlICk7IC8vIDIwMDYwNjEzLjEKKy8vdm9pZCBSRl9SYXRlQ2hhbmdpbmcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCByYXRlICk7IC8vIDIwMDYwNjI2LjUuYyBBZGQKK3U4IFJGU3ludGhlc2l6ZXJfU2V0UG93ZXJJbmRleCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IFBvd2VySW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI4XzI0UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI4XzUwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI3XzI0UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI3XzUwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI1UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0QWlyb2hhMjIzMFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldEFpcm9oYTcyMzBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRXaW5ib25kMjQyUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3ZvaWQgR2V0VHhWZ2FGcm9tRUVQUk9NKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIEVFUFJPTVR4VmdhQWRqdXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7IC8vIDIwMDYwNjE5LjUgQWRkCisKKyNkZWZpbmUgUkZXcml0ZUNvbnRyb2xEYXRhKCBfQSwgX1YgKSBXYjM1UmVnX1dyaXRlKCBfQSwgMHgwODY0LCBfViApCisKK3ZvaWQgV2IzNVJlZ19kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CisKK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19SZWFkKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKTsKK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19SZWFkU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgIHUzMiAqIHBSZWdpc3RlclZhbHVlICk7Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGVTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApOwordW5zaWduZWQgY2hhciBXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoICBwaHdfZGF0YV90IHBId0RhdGEsCisJCQkJCQkJCSB1MTYgUmVnaXN0ZXJObywKKwkJCQkJCQkJIHUzMiBSZWdpc3RlclZhbHVlLAorCQkJCQkJCQkgczggKnBWYWx1ZSwKKwkJCQkJCQkJIHM4IExlbik7Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfQnVyc3RXcml0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyICogcFJlZ2lzdGVyRGF0YSwgIHU4IE51bWJlck9mRGF0YSwgIHU4IEZsYWcgKTsKKwordm9pZCBXYjM1UmVnX0VQMFZNKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFdiMzVSZWdfRVAwVk1fc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgV2IzNVJlZ19FUDBWTV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpOworCit1MzIgQml0UmV2ZXJzZSggdTMyIGR3RGF0YSwgdTMyIERhdGFMZW5ndGgpOworCit2b2lkIENhcmRHZXRNdWx0aWNhc3RCaXQoICAgdTggQWRkcmVzc1tNQUNfQUREUl9MRU5HVEhdLCAgdTggKkJ5dGUsICB1OCAqVmFsdWUgKTsKK3UzMiBDYXJkQ29tcHV0ZUNyYyggIHU4ICogQnVmZmVyLCAgdTMyIExlbmd0aCApOworCit2b2lkIFdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFdiMzVSZWdfVXBkYXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApOwordW5zaWduZWQgY2hhciBhZGp1c3RfVFhWR0FfZm9yX2lxX21hZyggIHBod19kYXRhX3QgcEh3RGF0YSApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlZjRiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oCkBAIC0wLDAgKzEsMTcyIEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQjM1UkVHX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfV0IzNVJFR19TX0gKKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKgorCQkJCUhBTCBzZXR0aW5nIGZ1bmN0aW9uCisKKwkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQl8VXh4fCAJfER4eHwJfE14eHwJfEJCfAl8UkZ8CisJCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCXwJCQkJCXwKKwkJV2IzNVJlZ19SZWFkCQlXYjM1UmVnX1dyaXRlCisKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCVdiVXNiX0NhbGxVU0JEQVN5bmMJCQkJCXN1cHBsaWVkIEJ5IFdiVXNiIG1vZHVsZQorKi8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgICAgIEdldEJpdCggZHdEYXRhLCBpKSAgICAgICggZHdEYXRhICYgKDB4MDAwMDAwMDEgPDwgaSkpCisjZGVmaW5lICAgICBTZXRCaXQoIGR3RGF0YSwgaSkgICAgICAoIGR3RGF0YSB8ICgweDAwMDAwMDAxIDw8IGkpKQorI2RlZmluZSAgICAgQ2xlYXJCaXQoIGR3RGF0YSwgaSkgICAgKCBkd0RhdGEgJiB+KDB4MDAwMDAwMDEgPDwgaSkpCisKKyNkZWZpbmUJCUlHTk9SRV9JTkNSRU1FTlQJMAorI2RlZmluZQkJQVVUT19JTkNSRU1FTlQJCTAKKyNkZWZpbmUJCU5PX0lOQ1JFTUVOVAkJMQorI2RlZmluZSBSRUdfRElSRUNUSU9OKF94LF95KSAgICgoX3kpLT5ESVJFQ1QgPT0wID8gdXNiX3JjdmN0cmxwaXBlKF94LDApIDogdXNiX3NuZGN0cmxwaXBlKF94LDApKQorI2RlZmluZSBSRUdfQlVGX1NJWkUoX3gpICAgICAgICgoX3gpLT5iUmVxdWVzdD09IDB4MDQgPyBjcHVfdG9fbGUxNigoX3gpLT53TGVuZ3RoKSA6IDQpCisKKy8vIDIwMDYwNjEzLjIgQWRkIHRoZSBmb2xsb3cgZGVmaW5pdGlvbgorI2RlZmluZSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExQgkJMHgwMDMzNDQ3YworI2RlZmluZSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExQgkJMHgwQTAwRkVGRgorI2RlZmluZSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRwkJMHgwMDMzMkMxQgorI2RlZmluZSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRwkJMHgwQTAwRkVGRgorCisKKyNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExQgkJMHgwMDI5MjMxNQkvL2JhY2tvZmYgIDJkQgorI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCCQkweDA4MDBGRUZGCS8vYmFja29mZiAgMmRCCisvLyNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExQgkJMHgwMDIwMUIxMQkvL2JhY2tvZmYgIDRkQgorLy8jZGVmaW5lIEJCNENfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDYwMEZGMDAJLy9iYWNrb2ZmICA0ZEIKKyNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExRwkJMHgwMDQ1M0IyNAorI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHCQkweDBFMDBGRUZGCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZWZhdWx0IHNldHRpbmcgZm9yIE14eAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgREVGQVVMVF9DV01JTgkJCQkJMzEJCS8vKE0yQykgQ1dtaW4uIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0zMS4KKyNkZWZpbmUgREVGQVVMVF9DV01BWAkJCQkJMTAyMwkvLyhNMkMpIENXbWF4LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTAyMy4KKyNkZWZpbmUgREVGQVVMVF9BSUQJCQkJCQkxCQkvLyhNMzQpIEFJRC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAxLTIwMDcuCisKKyNpZmRlZiBfVVNFX0ZBTExCQUNLX1JBVEVfCisjZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAkJMgkJLy8oTTM4KSBhcyBuYW1lZAorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUCQk3CQkvLyhNMzgpIGFzIG5hbWVkCisjZW5kaWYKKworI2RlZmluZSBERUZBVUxUX0xPTkdfUkVUUllfTElNSVQJCTcJCS8vKE0zOCkgTG9uZ1JldHJ5TGltaXQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KKyNkZWZpbmUgREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVAkJNwkJLy8oTTM4KSBTaG9ydFJldHJ5TGltaXQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KKyNkZWZpbmUgREVGQVVMVF9QSUZTVAkJCQkJMjUJCS8vKE0zQykgUElGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCisjZGVmaW5lIERFRkFVTFRfRUlGU1QJCQkJCTM1NAkJLy8oTTNDKSBFSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xMDQ4NTc1LgorI2RlZmluZSBERUZBVUxUX0RJRlNUCQkJCQk0NQkJLy8oTTNDKSBESUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9TSUZTVAkJCQkJNQkJLy8oTTNDKSBTSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9PU0lGU1QJCQkJCTEwCQkvLyhNM0MpIE9yaWdpbmFsIFNJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LgorI2RlZmluZSBERUZBVUxUX0FUSU1XRAkJCQkJMAkJLy8oTTQwKSBBVElNIFdpbmRvdy4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgorI2RlZmluZSBERUZBVUxUX1NMT1RfVElNRQkJCQkyMAkJLy8oTTQwKSAoJCkgU2xvdFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0yNTUuCisjZGVmaW5lIERFRkFVTFRfTUFYX1RYX01TRFVfTElGRV9USU1FCTUxMgkvLyhNNDQpIE1heFR4TVNEVUxpZmVUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNDI5NDk2NzI5NS4KKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwJCQk1MDAJCS8vKE00OCkgQmVhY29uIEludGVydmFsLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCisjZGVmaW5lIERFRkFVTFRfUFJPQkVfREVMQVlfVElNRQkJMjAwCQkvLyhNNDgpIFByb2JlIERlbGF5IFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9QUk9UT0NPTF9WRVJTSU9OCQkwCQkvLyhNNEMpCisjZGVmaW5lIERFRkFVTFRfTUFDX1BPV0VSX1NUQVRFCQkJMgkJLy8oTTRDKSAyOiBNQUMgYXQgcG93ZXIgYWN0aXZlCisjZGVmaW5lIERFRkFVTFRfRFRJTV9BTEVSVF9USU1FCQkJMAorCisKK3N0cnVjdCB3YjM1X3JlZ19xdWV1ZSB7CisJc3RydWN0IHVyYiAJKnVyYjsKKwl2b2lkCQkqcFVzYlJlcTsKKwl2b2lkCQkqTmV4dDsKKwl1bmlvbiB7CisJCXUzMglWQUxVRTsKKwkJdTMyCSpwQnVmZmVyOworCX07CisJdTgJCVJFU0VSVkVEWzRdOyAvLyBzcGFjZSByZXNlcnZlZCBmb3IgY29tbXVuaWNhdGlvbgorCXUxNgkJSU5ERVg7IC8vIEZvciBzdG9yaW5nIHRoZSByZWdpc3RlciBpbmRleAorCXU4CQlSRVNFUlZFRF9WQUxJRDsJLy8gSW5kaWNhdGUgd2hldGhlciB0aGUgUkVTRVJWRUQgc3BhY2UgaXMgdmFsaWQgYXQgdGhpcyBjb21tYW5kLgorCXU4CQlESVJFQ1Q7IC8vIDA6SW4gICAxOk91dAorfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIHZhcmlhYmxlIGZvciBtb2R1bGUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIE1BWF9TUTNfRklMVEVSX1NJWkUJCTUKK3N0cnVjdCB3YjM1X3JlZyB7CisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUmVnaXN0ZXIgQmFuayBiYWNrdXAKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwl1MzIJVTFCMDsJCQkvL2JpdDE2IHJlY29yZCB0aGUgaC93IHJhZGlvIG9uL29mZiBzdGF0dXMKKwl1MzIJVTFCQ19MRURDb25maWd1cmU7CisJdTMyCUQwMF9EbWFDb250cm9sOworCXUzMglNMDBfTWFjQ29udHJvbDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MzIJTTA0X011bHRpY2FzdEFkZHJlc3MxOworCQkJdTMyCU0wOF9NdWx0aWNhc3RBZGRyZXNzMjsKKwkJfTsKKwkJdTgJCU11bHRpY2FzdFs4XTsJLy8gY29udGVudHMgb2YgY2FyZCBtdWx0aWNhc3QgcmVnaXN0ZXJzCisJfTsKKworCXUzMglNMjRfTWFjQ29udHJvbDsKKwl1MzIJTTI4X01hY0NvbnRyb2w7CisJdTMyCU0yQ19NYWNDb250cm9sOworCXUzMglNMzhfTWFjQ29udHJvbDsKKwl1MzIJTTNDX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU00MF9NYWNDb250cm9sOworCXUzMglNNDRfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTQ4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU00Q19NYWNTdGF0dXM7CisJdTMyCU02MF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNjhfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTcwX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU03NF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNzhfRVJQSW5mb3JtYXRpb247Ly85MzAyMDYuMi5iCisJdTMyCU03Q19NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNODBfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTg0X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU04OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNOThfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKworCS8vWzIwMDQwNzIyIFdLXQorCS8vQmFzZWJhbmQgcmVnaXN0ZXIKKwl1MzIJQkIwQzsJLy8gVXNlZCBmb3IgTE5BIGNhbGN1bGF0aW9uCisJdTMyCUJCMkM7CS8vCisJdTMyCUJCMzA7CS8vMTFiIGFjcXVpc2l0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKwl1MzIJQkIzQzsKKwl1MzIJQkI0ODsJLy8gMjAwNTEyMjEuMS5hIDIwMDYwNjEzLjEgRml4IE9CVyBpc3N1ZSBvZiAxMWIvMTFnIHJhdGUKKwl1MzIJQkI0QzsJLy8gMjAwNjA2MTMuMSAgRml4IE9CVyBpc3N1ZSBvZiAxMWIvMTFnIHJhdGUKKwl1MzIJQkI1MDsJLy9tb2RlIGNvbnRyb2wgcmVnaXN0ZXIKKwl1MzIJQkI1NDsKKwl1MzIgCUJCNTg7CS8vSVFfQUxQSEEKKwl1MzIJQkI1QzsJLy8gRm9yIHRlc3QKKwl1MzIJQkI2MDsJLy8gZm9yIFdUTyByZWFkIHZhbHVlCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBWTQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQorCXNwaW5sb2NrX3QJRVAwVk1fc3Bpbl9sb2NrOyAvLyA0QgorCXUzMgkgICAgICAgIEVQMFZNX3N0YXR1czsvLyQkCisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfZmlyc3Q7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfbGFzdDsKKwlhdG9taWNfdCAgICAgICBSZWdGaXJlQ291bnQ7CisKKwkvLyBIYXJkd2FyZSBzdGF0dXMKKwl1OAlFUDB2bV9zdGF0ZTsKKwl1OAltYWNfcG93ZXJfc2F2ZTsKKwl1OAlFRVBST01QaHlUeXBlOyAvLyAwIH4gMTUgZm9yIE1heGltICgwIMSEViBNQVgyODI1LCAxIMSEViBNQVgyODI3LCAyIMSEViBNQVgyODI4LCAzIMSEViBNQVgyODI5KSwKKwkJCQkJCSAgIC8vIDE2IH4gMzEgZm9yIEFpcm9oYSAoMTYgxIRWIEFMMjIzMCwgMTEgLSBBTDcyMzApCisJCQkJCQkgICAvLyAzMiB+IFJlc2VydmVkCisJCQkJCQkgICAvLyAzMyB+IDQ3IEZvciBXQjI0MiAoIDMzIC0gV0IyNDIsIDM0IC0gV0IyNDIgd2l0aCBuZXcgVHh2Z2EgMC41IGRiIHN0ZXApCisJCQkJCQkgICAvLyA0OCB+IDI1NSBBUkUgUkVTRVJWRUQuCisJdTgJRUVQUk9NUmVnaW9uOwkvL1JlZ2lvbiBzZXR0aW5nIGluIEVFUFJPTQorCisJdTMyCVN5bmNJb1BhdXNlOyAvLyBJZiB1c2VyIHVzZSB0aGUgU3luYyBJbyB0byBhY2Nlc3MgSHcsIHRoZW4gcGF1c2UgdGhlIGFzeW5jIGFjY2VzcworCisJdTgJTE5BVmFsdWVbNF07IC8vVGFibGUgZm9yIHNwZWVkIHVwIHJ1bm5pbmcKKwl1MzIJU1EzX2ZpbHRlcltNQVhfU1EzX0ZJTFRFUl9TSVpFXTsKKwl1MzIJU1EzX2luZGV4OworCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4YjZkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCkBAIC0wLDAgKzEsMzczIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KKy8vCisvLyAgTW9kdWxlIE5hbWU6CisvLyAgICBXYjM1UnguYworLy8KKy8vICBBYnN0cmFjdDoKKy8vICAgIFByb2Nlc3NpbmcgdGhlIFJ4IG1lc3NhZ2UgZnJvbSBkb3duIGxheWVyCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic3lzZGVmLmgiCisjaW5jbHVkZSAid2IzNXJ4X2YuaCIKKworc3RhdGljIHZvaWQgcGFja2V0X2NhbWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNoYXIgKnBSeEJ1ZmZlckFkZHJlc3MsIGludCBQYWNrZXRTaXplKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzID0gezB9OworCisJaWYgKCFwcml2LT5lbmFibGVkKQorCQlyZXR1cm47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKFBhY2tldFNpemUpOworCWlmICghc2tiKSB7CisJCXByaW50aygiTm90IGVub3VnaCBtZW1vcnkgZm9yIHBhY2tldCwgRklYTUVcbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBQYWNrZXRTaXplKSwKKwkgICAgICAgcFJ4QnVmZmVyQWRkcmVzcywKKwkgICAgICAgUGFja2V0U2l6ZSk7CisKKy8qCisJcnhfc3RhdHVzLnJhdGUgPSAxMDsKKwlyeF9zdGF0dXMuY2hhbm5lbCA9IDE7CisJcnhfc3RhdHVzLmZyZXEgPSAxMjM0NTsKKwlyeF9zdGF0dXMucGh5bW9kZSA9IE1PREVfSUVFRTgwMjExQjsKKyovCisKKwlpZWVlODAyMTFfcnhfaXJxc2FmZShodywgc2tiLCAmcnhfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgV2IzNVJ4X2FkanVzdChQREVTQ1JJUFRPUiBwUnhEZXMpCit7CisJdTMyICoJcFJ4QnVmZmVyQWRkcmVzczsKKwl1MzIJRGVjcnlwdGlvbk1ldGhvZDsKKwl1MzIJaTsKKwl1MTYJQnVmZmVyU2l6ZTsKKworCURlY3J5cHRpb25NZXRob2QgPSBwUnhEZXMtPlIwMS5SMDFfZGVjcnlwdGlvbl9tZXRob2Q7CisJcFJ4QnVmZmVyQWRkcmVzcyA9IHBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF07CisJQnVmZmVyU2l6ZSA9IHBSeERlcy0+YnVmZmVyX3NpemVbMF07CisKKwkvLyBBZGp1c3QgdGhlIGxhc3QgcGFydCBvZiBkYXRhLiBPbmx5IGRhdGEgbGVmdAorCUJ1ZmZlclNpemUgLT0gNDsgLy8gRm9yIENSQy0zMgorCWlmIChEZWNyeXB0aW9uTWV0aG9kKQorCQlCdWZmZXJTaXplIC09IDQ7CisJaWYgKERlY3J5cHRpb25NZXRob2QgPT0gMykgLy8gRm9yIENDTVAKKwkJQnVmZmVyU2l6ZSAtPSA0OworCisJLy8gQWRqdXN0IHRoZSBJViBmaWVsZCB3aGljaCBhZnRlciA4MDIuMTEgaGVhZGVyIGFuZCBJQ1YgZmllbGQuCisJaWYgKERlY3J5cHRpb25NZXRob2QgPT0gMSkgLy8gRm9yIFdFUAorCXsKKwkJZm9yKCBpPTY7IGk+MDsgaS0tICkKKwkJCXBSeEJ1ZmZlckFkZHJlc3NbaV0gPSBwUnhCdWZmZXJBZGRyZXNzW2ktMV07CisJCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMTsKKwkJQnVmZmVyU2l6ZSAtPSA0OyAvLyA0IGJ5dGUgZm9yIElWCisJfQorCWVsc2UgaWYoIERlY3J5cHRpb25NZXRob2QgKSAvLyBGb3IgVEtJUCBhbmQgQ0NNUAorCXsKKwkJZm9yIChpPTc7IGk+MTsgaS0tKQorCQkJcFJ4QnVmZmVyQWRkcmVzc1tpXSA9IHBSeEJ1ZmZlckFkZHJlc3NbaS0yXTsKKwkJcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3MgKyAyOy8vVXBkYXRlIHRoZSBkZXNjcmlwdG9yLCBzaGlmdCA4IGJ5dGUKKwkJQnVmZmVyU2l6ZSAtPSA4OyAvLyA4IGJ5dGUgZm9yIElWICsgSUNWCisJfQorCXBSeERlcy0+YnVmZmVyX3NpemVbMF0gPSBCdWZmZXJTaXplOworfQorCitzdGF0aWMgdTE2IFdiMzVSeF9pbmRpY2F0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwlERVNDUklQVE9SCVJ4RGVzOworCVBXQjM1UlgJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisJdTggKgkJcFJ4QnVmZmVyQWRkcmVzczsKKwl1MTYJCVBhY2tldFNpemU7CisJdTE2CQlzdG1wLCBCdWZmZXJTaXplLCBzdG1wMiA9IDA7CisJdTMyCQlSeEJ1ZmZlcklkOworCisJLy8gT25seSBvbmUgdGhyZWFkIGJlIGFsbG93ZWQgdG8gcnVuIGludG8gdGhlIGZvbGxvd2luZworCWRvIHsKKwkJUnhCdWZmZXJJZCA9IHBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4OworCQlpZiAocFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdKSAvL093bmVyIGJ5IFZNCisJCQlicmVhazsKKworCQlwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleCsrOworCQlwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleCAlPSBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVI7CisKKwkJcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7CisJCUJ1ZmZlclNpemUgPSBwV2IzNVJ4LT5SeEJ1ZmZlclNpemVbIFJ4QnVmZmVySWQgXTsKKworCQkvLyBQYXJzZSB0aGUgYnVsa2luIGJ1ZmZlcgorCQl3aGlsZSAoQnVmZmVyU2l6ZSA+PSA0KSB7CisJCQlpZiAoKGNwdV90b19sZTMyKCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcykgJiAweDBmZmZmZmZmKSA9PSBSWF9FTkRfVEFHKSAvL0lzIGVuZGluZz8gOTIxMDAyLjkuYQorCQkJCWJyZWFrOworCisJCQkvLyBHZXQgdGhlIFIwMCBSMDEgZmlyc3QKKwkJCVJ4RGVzLlIwMC52YWx1ZSA9IGxlMzJfdG9fY3B1KCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcyk7CisJCQlQYWNrZXRTaXplID0gKHUxNilSeERlcy5SMDAuUjAwX3JlY2VpdmVfYnl0ZV9jb3VudDsKKwkJCVJ4RGVzLlIwMS52YWx1ZSA9IGxlMzJfdG9fY3B1KCooKHUzMiAqKShwUnhCdWZmZXJBZGRyZXNzKzQpKSk7CisJCQkvLyBGb3IgbmV3IERNQSA0aworCQkJaWYgKChQYWNrZXRTaXplICYgMHgwMykgPiAwKQorCQkJCVBhY2tldFNpemUgLT0gNDsKKworCQkJLy8gQmFzaWMgY2hlY2sgZm9yIFJ4IGxlbmd0aC4gSXMgbGVuZ3RoIHZhbGlkPworCQkJaWYgKFBhY2tldFNpemUgPiBNQVhfUEFDS0VUX1NJWkUpIHsKKwkJCQkjaWZkZWYgX1BFX1JYX0RVTVBfCisJCQkJV0JERUJVRygoIlNlcmlvdXMgRVJST1IgOiBSeCBkYXRhIHNpemUgdG9vIGxvbmcsIHNpemUgPSVkXG4iLCBQYWNrZXRTaXplKSk7CisJCQkJI2VuZGlmCisKKwkJCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCQkJcFdiMzVSeC0+RXAzRXJyb3JDb3VudDIrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gU3RhcnQgdG8gcHJvY2VzcyBSeCBidWZmZXIKKy8vCQkJUnhEZXMuRGVzY3JpcHRvcl9JRCA9IFJ4QnVmZmVySWQ7IC8vIER1ZSB0byBzeW5jaHJvbm91cyBpbmRpY2F0ZSwgdGhlIGZpZWxkIGRvZXNuJ3QgbmVjZXNzYXJ5IHRvIHVzZS4KKwkJCUJ1ZmZlclNpemUgLT0gODsgLy9zdWJ0cmFjdCA4IGJ5dGUgZm9yIDM1J3MgVVNCIGhlYWRlciBsZW5ndGgKKwkJCXBSeEJ1ZmZlckFkZHJlc3MgKz0gODsKKworCQkJUnhEZXMuYnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzOworCQkJUnhEZXMuYnVmZmVyX3NpemVbMF0gPSBQYWNrZXRTaXplOworCQkJUnhEZXMuYnVmZmVyX251bWJlciA9IDE7CisJCQlSeERlcy5idWZmZXJfc3RhcnRfaW5kZXggPSAwOworCQkJUnhEZXMuYnVmZmVyX3RvdGFsX3NpemUgPSBSeERlcy5idWZmZXJfc2l6ZVswXTsKKwkJCVdiMzVSeF9hZGp1c3QoJlJ4RGVzKTsKKworCQkJcGFja2V0X2NhbWUoaHcsIHBSeEJ1ZmZlckFkZHJlc3MsIFBhY2tldFNpemUpOworCisJCQkvLyBNb3ZlIFJ4QnVmZmVyIHBvaW50IHRvIHRoZSBuZXh0CisJCQlzdG1wID0gUGFja2V0U2l6ZSArIDM7CisJCQlzdG1wICY9IH4weDAzOyAvLyA0biBhbGlnbm1lbnQKKwkJCXBSeEJ1ZmZlckFkZHJlc3MgKz0gc3RtcDsKKwkJCUJ1ZmZlclNpemUgLT0gc3RtcDsKKwkJCXN0bXAyICs9IHN0bXA7CisJCX0KKworCQkvLyBSZWNsYWltIHJlc291cmNlCisJCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDE7CisJfSB3aGlsZSAodHJ1ZSk7CisKKwlyZXR1cm4gc3RtcDI7Cit9CisKK3N0YXRpYyB2b2lkIFdiMzVSeChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKK3N0YXRpYyB2b2lkIFdiMzVSeF9Db21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJUFdCMzVSWAkJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisJdTggKgkJcFJ4QnVmZmVyQWRkcmVzczsKKwl1MzIJCVNpemVDaGVjazsKKwl1MTYJCUJ1bGtMZW5ndGg7CisJdTMyCQlSeEJ1ZmZlcklkOworCVIwMF9ERVNDUklQVE9SIAlSMDA7CisKKwkvLyBWYXJpYWJsZSBzZXR0aW5nCisJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CisJcFdiMzVSeC0+RVAzVk1fc3RhdHVzID0gdXJiLT5zdGF0dXM7Ly9TdG9yZSB0aGUgbGFzdCByZXN1bHQgb2YgSXJwCisKKwlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+Q3VycmVudFJ4QnVmZmVySWQ7CisKKwlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKKwlCdWxrTGVuZ3RoID0gKHUxNil1cmItPmFjdHVhbF9sZW5ndGg7CisKKwkvLyBUaGUgSVJQIGlzIGNvbXBsZXRlZAorCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fQ09NUExFVEVEOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTXVzdCBiZSBoZXJlLCBvciBSeEJ1ZmZlcklkIGlzIGludmFsaWQKKwkJZ290byBlcnJvcjsKKworCWlmIChwV2IzNVJ4LT5yeF9oYWx0KQorCQlnb3RvIGVycm9yOworCisJLy8gU3RhcnQgdG8gcHJvY2VzcyB0aGUgZGF0YSBvbmx5IGluIHN1Y2Nlc3NmdWwgY29uZGl0aW9uCisJcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdID0gMDsgLy8gU2V0IHRoZSBvd25lciB0byBkcml2ZXIKKwlSMDAudmFsdWUgPSBsZTMyX3RvX2NwdSgqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpOworCisJLy8gVGhlIFVSQiBpcyBjb21wbGV0ZWQsIGNoZWNrIHRoZSByZXN1bHQKKwlpZiAocFdiMzVSeC0+RVAzVk1fc3RhdHVzICE9IDApIHsKKwkJI2lmZGVmIF9QRV9VU0JfU1RBVEVfRFVNUF8KKwkJV0JERUJVRygoIkVQMyBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpKTsKKwkJRGVidWdVc2JkU3RhdHVzSW5mb3JtYXRpb24oIHBXYjM1UngtPkVQM1ZNX3N0YXR1cyApOworCQkjZW5kaWYKKwkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOworCQlnb3RvIGVycm9yOworCX0KKworCS8vIDIwMDYwMjIwIEZvciByZWNvdmVyaW5nLiBjaGVjayBpZiBvcGVyYXRpbmcgaW4gc2luZ2xlIFVTQiBtb2RlCisJaWYgKCFIQUxfVVNCX01PREVfQlVSU1QocEh3RGF0YSkpIHsKKwkJU2l6ZUNoZWNrID0gUjAwLlIwMF9yZWNlaXZlX2J5dGVfY291bnQ7ICAvLzIwMDYwOTI2IGFuc29uJ3MgZW5kaWFuCisJCWlmICgoU2l6ZUNoZWNrICYgMHgwMykgPiAwKQorCQkJU2l6ZUNoZWNrIC09IDQ7CisJCVNpemVDaGVjayA9IChTaXplQ2hlY2sgKyAzKSAmIH4weDAzOworCQlTaXplQ2hlY2sgKz0gMTI7IC8vIDggKyA0IGJhZGJlZWYKKwkJaWYgKChCdWxrTGVuZ3RoID4gMTYwMCkgfHwKKwkJCShTaXplQ2hlY2sgPiAxNjAwKSB8fAorCQkJKEJ1bGtMZW5ndGggIT0gU2l6ZUNoZWNrKSB8fAorCQkJKEJ1bGtMZW5ndGggPT0gMCkpIHsgLy8gQWRkIGZvciBmYWlsIFVyYgorCQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOworCQkJcFdiMzVSeC0+RXAzRXJyb3JDb3VudDIrKzsKKwkJfQorCX0KKworCS8vIEluZGljYXRpbmcgdGhlIHJlY2VpdmluZyBkYXRhCisJcFdiMzVSeC0+Qnl0ZVJlY2VpdmVkICs9IEJ1bGtMZW5ndGg7CisJcFdiMzVSeC0+UnhCdWZmZXJTaXplWyBSeEJ1ZmZlcklkIF0gPSBCdWxrTGVuZ3RoOworCisJaWYgKCFwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0pCisJCVdiMzVSeF9pbmRpY2F0ZShodyk7CisKKwlrZnJlZShwV2IzNVJ4LT5wRFJ4KTsKKwkvLyBEbyB0aGUgbmV4dCByZWNlaXZlCisJV2IzNVJ4KGh3KTsKKwlyZXR1cm47CisKK2Vycm9yOgorCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDE7IC8vIFNldCB0aGUgb3duZXIgdG8gaGFyZHdhcmUKKwlhdG9taWNfZGVjKCZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKTsKKwlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2Fubm90IHJlZW50cmFpbgorc3RhdGljIHZvaWQgV2IzNVJ4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCVBXQjM1UlgJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisJdTggKglwUnhCdWZmZXJBZGRyZXNzOworCXN0cnVjdCB1cmIgKnVyYiA9IHBXYjM1UngtPlJ4VXJiOworCWludAlyZXR2OworCXUzMglSeEJ1ZmZlcklkOworCisJLy8KKwkvLyBJc3N1aW5nIFVSQgorCS8vCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKKwkJZ290byBlcnJvcjsKKworCWlmIChwV2IzNVJ4LT5yeF9oYWx0KQorCQlnb3RvIGVycm9yOworCisJLy8gR2V0IFJ4QnVmZmVyJ3MgSUQKKwlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+UnhCdWZmZXJJZDsKKwlpZiAoIXBXYjM1UngtPlJ4T3duZXJbUnhCdWZmZXJJZF0pIHsKKwkJLy8gSXQncyBpbXBvc3NpYmxlIHRvIHJ1biBoZXJlLgorCQkjaWZkZWYgX1BFX1JYX0RVTVBfCisJCVdCREVCVUcoKCJSeCBkcml2ZXIgZmlmbyB1bmF2YWlsYWJsZVxuIikpOworCQkjZW5kaWYKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvLyBVcGRhdGUgYnVmZmVyIHBvaW50LCB0aGVuIHN0YXJ0IHRvIGJ1bGtpbiB0aGUgZGF0YSBmcm9tIFVTQgorCXBXYjM1UngtPlJ4QnVmZmVySWQrKzsKKwlwV2IzNVJ4LT5SeEJ1ZmZlcklkICU9IE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsKKworCXBXYjM1UngtPkN1cnJlbnRSeEJ1ZmZlcklkID0gUnhCdWZmZXJJZDsKKworCXBXYjM1UngtPnBEUnggPSBremFsbG9jKE1BWF9VU0JfUlhfQlVGRkVSLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBXYjM1UngtPnBEUngpIHsKKwkJcHJpbnRrKCJ3MzV1bmQ6IFJ4IG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKKwkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDMpLAorCQkJICBwUnhCdWZmZXJBZGRyZXNzLCBNQVhfVVNCX1JYX0JVRkZFUiwKKwkJCSAgV2IzNVJ4X0NvbXBsZXRlLCBodyk7CisKKwlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisKKwlyZXR2ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChyZXR2ICE9IDApIHsKKwkJcHJpbnRrKCJSeCBVUkIgc2VuZGluZyBlcnJvclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCXJldHVybjsKKworZXJyb3I6CisJLy8gVk0gc3RvcAorCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKKwlhdG9taWNfZGVjKCZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKTsKK30KKwordm9pZCBXYjM1Unhfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKworCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byB0aGUgV2IzNVJ4KCkgZnVuY3Rpb24KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIpID09IDEpIHsKKwkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCQlXYjM1UngoaHcpOworCX0gZWxzZQorCQlhdG9taWNfZGVjKCZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzdGF0aWMgdm9pZCBXYjM1UnhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApCit7CisJUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKwl1MzIJaTsKKworCXBXYjM1UngtPkJ5dGVSZWNlaXZlZCA9IDA7CisJcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXggPSAwOworCXBXYjM1UngtPlJ4QnVmZmVySWQgPSAwOworCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKKwlwV2IzNVJ4LT5yeF9oYWx0ID0gMDsKKworCS8vIEluaXRpYWwgdGhlIFF1ZXVlLiBUaGUgbGFzdCBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZWQgaWYgdGhlIFJ4IHJlc291cmNlIGlzIHVuYXZhaWxhYmxlLgorCWZvciggaT0wOyBpPE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsgaSsrICkKKwkJcFdiMzVSeC0+UnhPd25lcltpXSA9IDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgV2IzNVJ4X2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisKKwkvLyBJbml0aWFsIHRoZSBCdWZmZXIgUXVldWUKKwlXYjM1UnhfcmVzZXRfZGVzY3JpcHRvciggcEh3RGF0YSApOworCisJcFdiMzVSeC0+UnhVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCXJldHVybiAoISFwV2IzNVJ4LT5SeFVyYik7Cit9CisKK3ZvaWQgV2IzNVJ4X3N0b3AocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisKKwkvLyBDYW5jZWxpbmcgdGhlIElycCBpZiBhbHJlYWR5IHNlbmRzIGl0IG91dC4KKwlpZiAocFdiMzVSeC0+RVAzdm1fc3RhdGUgPT0gVk1fUlVOTklORykgeworCQl1c2JfdW5saW5rX3VyYiggcFdiMzVSeC0+UnhVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVJ4X2Rlc3Ryb3kgdG8gZnJlZSB0aGVtCisJCSNpZmRlZiBfUEVfUlhfRFVNUF8KKwkJV0JERUJVRygoIkVQMyBSeCBzdG9wXG4iKSk7CisJCSNlbmRpZgorCX0KK30KKworLy8gTmVlZHMgcHJvY2VzcyBjb250ZXh0Cit2b2lkIFdiMzVSeF9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCisJZG8geworCQltc2xlZXAoMTApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCisJfSB3aGlsZSAocFdiMzVSeC0+RVAzdm1fc3RhdGUgIT0gVk1fU1RPUCk7CisJbXNsZWVwKDEwKTsgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZXhpdCA5NDA2MjMuMS5iCisKKwlpZiAocFdiMzVSeC0+UnhVcmIpCisJCXVzYl9mcmVlX3VyYiggcFdiMzVSeC0+UnhVcmIgKTsKKwkjaWZkZWYgX1BFX1JYX0RVTVBfCisJV0JERUJVRygoIldiMzVSeF9kZXN0cm95IE9LXG4iKSk7CisJI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTMwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfZi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCMzVSWF9GX0gKKyNkZWZpbmUgX19XSU5CT05EX1dCMzVSWF9GX0gKKworI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgIndiaGFsX3MuaCIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordW5zaWduZWQgY2hhcgkJV2IzNVJ4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQJCVdiMzVSeF9kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkCQlXYjM1Unhfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZAkJV2IzNVJ4X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgzNTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X3MuaApAQCAtMCwwICsxLDQ4IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHdiMzVyeC5oIC0tCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gRGVmaW5pdGlvbiBmb3IgdGhpcyBtb2R1bGUgdXNlZAorI2RlZmluZSBNQVhfVVNCX1JYX0JVRkZFUgk0MDk2CS8vIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgNDA5NiA5MzExMzAuNC5mCisKKyNkZWZpbmUgTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSCUVUSEVSTkVUX1JYX0RFU0NSSVBUT1JTCQkvLyBNYXhpbXVtIDI1NCwgMjU1IGlzIFJFU0VSVkVEIElECisjZGVmaW5lIFJYX0lOVEVSRkFDRQkJCQkwCS8vIEludGVyZmFjZSAxCisjZGVmaW5lIFJYX1BJUEUJCQkJCQkyCS8vIFBpcGUgMworI2RlZmluZSBNQVhfUEFDS0VUX1NJWkUJCQkJMTYwMCAvLzE1NjgJLy8gOCArIDE1MzIgKyA0ICsgMjQoSVYgRUlWIE1JQyBJQ1YgQ1JDKSBmb3IgY2hlY2sgRE1BIGRhdGEgOTMxMTMwLjQuZworI2RlZmluZSBSWF9FTkRfVEFHCQkJCQkweDBiYWRiZWVmCisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIHZhcmlhYmxlIGZvciBtb2R1bGUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIHN0cnVjdCBfV0IzNVJYCit7CisJdTMyCQkJQnl0ZVJlY2VpdmVkOy8vIEZvciBjYWxjdWxhdGluZyB0aHJvdWdocHV0IG9mIEJ1bGtJbgorCWF0b21pY190CQlSeEZpcmVDb3VudGVyOy8vIERvZXMgV2IzNVJ4IG1vZHVsZSBmaXJlPworCisJdTgJUnhCdWZmZXJbIE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUiBdWyAoKE1BWF9VU0JfUlhfQlVGRkVSKzMpICYgfjB4MDMgKSBdOworCXUxNglSeEJ1ZmZlclNpemVbICgoTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSKzEpICYgfjB4MDEpIF07CisJdTgJUnhPd25lclsgKChNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIrMykgJiB+MHgwMyApIF07Ly9Pd25lcnNoaXAgb2YgYnVmZmVyICAwOiBTVyAxOkhXCisKKwl1MzIJUnhQcm9jZXNzSW5kZXg7Ly9UaGUgbmV4dCBpbmRleCB0byBwcm9jZXNzCisJdTMyCVJ4QnVmZmVySWQ7CisJdTMyCUVQM3ZtX3N0YXRlOworCisJdTMyCXJ4X2hhbHQ7IC8vIEZvciBWTSBzdG9wcGluZworCisJdTE2CU1vcmVEYXRhU2l6ZTsKKwl1MTYJUGFja2V0U2l6ZTsKKworCXUzMglDdXJyZW50UnhCdWZmZXJJZDsgLy8gRm9yIGNvbXBsZXRlIHJvdXRpbmUgdXNhZ2UKKwl1MzIJUngzVXJiQ2FuY2VsOworCisJdTMyCUxhc3RSMTsgLy8gRm9yIFJTU0kgcmVwb3J0aW5nCisJc3RydWN0IHVyYiAqCQkJCVJ4VXJiOworCXUzMgkJRXAzRXJyb3JDb3VudDI7IC8vIDIwMDYwNjI1LjEgVXNiZCBmb3IgUnggRE1BIGVycm9yIGNvdW50CisKKwlpbnQJCUVQM1ZNX3N0YXR1czsKKwl1OCAqCXBEUng7CisKK30gV0IzNVJYLCAqUFdCMzVSWDsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjQ0NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYwpAQCAtMCwwICsxLDMwNSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCisvLworLy8gIE1vZHVsZSBOYW1lOgorLy8gICAgV2IzNVR4LmMKKy8vCisvLyAgQWJzdHJhY3Q6CisvLyAgICBQcm9jZXNzaW5nIHRoZSBUeCBtZXNzYWdlIGFuZCBwdXQgaW50byBkb3duIGxheWVyCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJ3YjM1dHhfZi5oIgorI2luY2x1ZGUgIm1kc19mLmgiCisjaW5jbHVkZSAic3lzZGVmLmgiCisKK3Vuc2lnbmVkIGNoYXIKK1diMzVUeF9nZXRfdHhfYnVmZmVyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggKipwQnVmZmVyKQoreworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwkqcEJ1ZmZlciA9IHBXYjM1VHgtPlR4QnVmZmVyWzBdOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBXYjM1VHgoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKTsKKworc3RhdGljIHZvaWQgV2IzNVR4X2NvbXBsZXRlKHN0cnVjdCB1cmIgKiBwVXJiKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciA9IHBVcmItPmNvbnRleHQ7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWAkJcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisJUE1EUwkJcE1kcyA9ICZhZGFwdGVyLT5NZHM7CisKKwlwcmludGsoIndiMzU6IHR4IGNvbXBsZXRlXG4iKTsKKwkvLyBWYXJpYWJsZSBzZXR0aW5nCisJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CisJcFdiMzVUeC0+RVA0Vk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOyAvL1N0b3JlIHRoZSBsYXN0IHJlc3VsdCBvZiBJcnAKKwlwTWRzLT5UeE93bmVyWyBwV2IzNVR4LT5UeFNlbmRJbmRleCBdID0gMDsvLyBTZXQgdGhlIG93bmVyLiBGcmVlIHRoZSBvd25lciBiaXQgYWx3YXlzLgorCXBXYjM1VHgtPlR4U2VuZEluZGV4Kys7CisJcFdiMzVUeC0+VHhTZW5kSW5kZXggJT0gTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQorCQlnb3RvIGVycm9yOworCisJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCisJCWdvdG8gZXJyb3I7CisKKwkvLyBUaGUgVVJCIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdAorCWlmIChwV2IzNVR4LT5FUDRWTV9zdGF0dXMgIT0gMCkgeworCQlwcmludGsoIlVSQiBzdWJtaXNzaW9uIGZhaWxlZFxuIik7CisJCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fU1RPUDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlNZHNfVHgoYWRhcHRlcik7CisJV2IzNVR4KGFkYXB0ZXIpOworCXJldHVybjsKKworZXJyb3I6CisJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhGaXJlQ291bnRlcik7CisJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOworfQorCitzdGF0aWMgdm9pZCBXYjM1VHgoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQoreworCXBod19kYXRhX3QJcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFgJCXBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCXU4CQkqcFR4QnVmZmVyQWRkcmVzczsKKwlQTURTCQlwTWRzID0gJmFkYXB0ZXItPk1kczsKKwlzdHJ1Y3QgdXJiICoJcFVyYiA9IChzdHJ1Y3QgdXJiICopcFdiMzVUeC0+VHg0VXJiOworCWludCAgICAgICAgIAlyZXR2OworCXUzMgkJU2VuZEluZGV4OworCisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAocFdiMzVUeC0+dHhfaGFsdCkKKwkJZ290byBjbGVhbnVwOworCisJLy8gT3duZXJzaGlwIGNoZWNraW5nCisJU2VuZEluZGV4ID0gcFdiMzVUeC0+VHhTZW5kSW5kZXg7CisJaWYgKCFwTWRzLT5UeE93bmVyW1NlbmRJbmRleF0pIC8vTm8gbW9yZSBkYXRhIG5lZWQgdG8gYmUgc2VudCwgcmV0dXJuIGltbWVkaWF0ZWx5CisJCWdvdG8gY2xlYW51cDsKKworCXBUeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVR4LT5UeEJ1ZmZlcltTZW5kSW5kZXhdOworCS8vCisJLy8gSXNzdWluZyBVUkIKKwkvLworCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCisJCQkgIHVzYl9zbmRidWxrcGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCA0KSwKKwkJCSAgcFR4QnVmZmVyQWRkcmVzcywgcE1kcy0+VHhCdWZmZXJTaXplWyBTZW5kSW5kZXggXSwKKwkJCSAgV2IzNVR4X2NvbXBsZXRlLCBhZGFwdGVyKTsKKworCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fUlVOTklORzsKKwlyZXR2ID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHY8MCkgeworCQlwcmludGsoIkVQNCBUeCBJcnAgc2VuZGluZyBlcnJvclxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvLyBDaGVjayBpZiBkcml2ZXIgbmVlZHMgaXNzdWUgSXJwIGZvciBFUDIKKwlwV2IzNVR4LT5UeEZpbGxDb3VudCArPSBwTWRzLT5UeENvdW50SW5CdWZmZXJbU2VuZEluZGV4XTsKKwlpZiAocFdiMzVUeC0+VHhGaWxsQ291bnQgPiAxMikKKwkJV2IzNVR4X0VQMlZNX3N0YXJ0KGFkYXB0ZXIpOworCisJcFdiMzVUeC0+Qnl0ZVRyYW5zZmVyICs9IHBNZHMtPlR4QnVmZmVyU2l6ZVtTZW5kSW5kZXhdOworCXJldHVybjsKKworIGNsZWFudXA6CisJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOworCWF0b21pY19kZWMoJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIpOworfQorCit2b2lkIFdiMzVUeF9zdGFydChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCit7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byBmdW5jdGlvbgorCWlmIChhdG9taWNfaW5jX3JldHVybigmcFdiMzVUeC0+VHhGaXJlQ291bnRlcikgPT0gMSkgeworCQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJCVdiMzVUeChhZGFwdGVyKTsKKwl9IGVsc2UKKwkJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhGaXJlQ291bnRlcik7Cit9CisKK3Vuc2lnbmVkIGNoYXIgV2IzNVR4X2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwlwV2IzNVR4LT5UeDRVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICghcFdiMzVUeC0+VHg0VXJiKQorCQlyZXR1cm4gZmFsc2U7CisKKwlwV2IzNVR4LT5UeDJVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICghcFdiMzVUeC0+VHgyVXJiKQorCXsKKwkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCBXYjM1VHhfc3RvcChwaHdfZGF0YV90IHBId0RhdGEpCit7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCS8vIFRyeWluZyB0byBjYW5jZWxpbmcgdGhlIFRycCBvZiBFUDIKKwlpZiAocFdiMzVUeC0+RVAydm1fc3RhdGUgPT0gVk1fUlVOTklORykKKwkJdXNiX3VubGlua191cmIoIHBXYjM1VHgtPlR4MlVyYiApOyAvLyBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1VHhfZGVzdHJvdCB0byBmcmVlIHRoZW0KKwkjaWZkZWYgX1BFX1RYX0RVTVBfCisJV0JERUJVRygoIkVQMiBUeCBzdG9wXG4iKSk7CisJI2VuZGlmCisKKwkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBJcnAgb2YgRVA0CisJaWYgKHBXYjM1VHgtPkVQNHZtX3N0YXRlID09IFZNX1JVTk5JTkcpCisJCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCisJI2lmZGVmIF9QRV9UWF9EVU1QXworCVdCREVCVUcoKCJFUDQgVHggc3RvcFxuIikpOworCSNlbmRpZgorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCBXYjM1VHhfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCit7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCS8vIFdhaXQgZm9yIFZNIHN0b3AKKwlkbyB7CisJCW1zbGVlcCgxMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCisJfSB3aGlsZSggKHBXYjM1VHgtPkVQMnZtX3N0YXRlICE9IFZNX1NUT1ApICYmIChwV2IzNVR4LT5FUDR2bV9zdGF0ZSAhPSBWTV9TVE9QKSApOworCW1zbGVlcCgxMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5iCisKKwlpZiAocFdiMzVUeC0+VHg0VXJiKQorCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4NFVyYiApOworCisJaWYgKHBXYjM1VHgtPlR4MlVyYikKKwkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsKKworCSNpZmRlZiBfUEVfVFhfRFVNUF8KKwlXQkRFQlVHKCgiV2IzNVR4X2Rlc3Ryb3kgT0tcbiIpKTsKKwkjZW5kaWYKK30KKwordm9pZCBXYjM1VHhfQ3VycmVudFRpbWUoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCB1MzIgVGltZUNvdW50KQoreworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisJdW5zaWduZWQgY2hhciBUcmlnZ2VyID0gZmFsc2U7CisKKwlpZiAocFdiMzVUeC0+VHhUaW1lciA+IFRpbWVDb3VudCkKKwkJVHJpZ2dlciA9IHRydWU7CisJZWxzZSBpZiAoVGltZUNvdW50ID4gKHBXYjM1VHgtPlR4VGltZXIrNTAwKSkKKwkJVHJpZ2dlciA9IHRydWU7CisKKwlpZiAoVHJpZ2dlcikgeworCQlwV2IzNVR4LT5UeFRpbWVyID0gVGltZUNvdW50OworCQlXYjM1VHhfRVAyVk1fc3RhcnQoYWRhcHRlcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBXYjM1VHhfRVAyVk0oc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKTsKKworc3RhdGljIHZvaWQgV2IzNVR4X0VQMlZNX2NvbXBsZXRlKHN0cnVjdCB1cmIgKiBwVXJiKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciA9IHBVcmItPmNvbnRleHQ7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJVDAyX0RFU0NSSVBUT1IJVDAyLCBUU1RBVFVTOworCVBXQjM1VFgJCXBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCXUzMiAqCQlwbHRtcCA9ICh1MzIgKilwV2IzNVR4LT5FUDJfYnVmOworCXUzMgkJaTsKKwl1MTYJCUludGVycnVwdEluTGVuZ3RoOworCisKKwkvLyBWYXJpYWJsZSBzZXR0aW5nCisJcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CisJcFdiMzVUeC0+RVAyVk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJLy8gRm9yIExpbnV4IDIuNC4gSW50ZXJydXB0IHdpbGwgYWx3YXlzIHRyaWdnZXIKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCisJCWdvdG8gZXJyb3I7CisKKwlpZiAocFdiMzVUeC0+dHhfaGFsdCkKKwkJZ290byBlcnJvcjsKKworCS8vVGhlIFVyYiBpcyBjb21wbGV0ZWQsIGNoZWNrIHRoZSByZXN1bHQKKwlpZiAocFdiMzVUeC0+RVAyVk1fc3RhdHVzICE9IDApIHsKKwkJV0JERUJVRygoIkVQMiBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpKTsKKwkJcFdiMzVUeC0+RVAydm1fc3RhdGU9IFZNX1NUT1A7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLy8gVXBkYXRlIHRoZSBUeCByZXN1bHQKKwlJbnRlcnJ1cHRJbkxlbmd0aCA9IHBVcmItPmFjdHVhbF9sZW5ndGg7CisJLy8gTW9kaWZ5IGZvciBtaW5pbXVtIG1lbW9yeSBhY2Nlc3MgYW5kIERXT1JEIGFsaWdubWVudC4KKwlUMDIudmFsdWUgPSBjcHVfdG9fbGUzMihwbHRtcFswXSkgPj4gODsgLy8gWzMxOjhdIC0+IFsyNDowXQorCUludGVycnVwdEluTGVuZ3RoIC09IDE7Ly8gMjAwNTEyMjEuMS5jIE1vZGlmeSB0aGUgZm9sbG93IGZvciBtb3JlIHN0YWJsZQorCUludGVycnVwdEluTGVuZ3RoID4+PSAyOyAvLyBJbnRlcnJ1cHRJbkxlbmd0aC80CisJZm9yIChpID0gMTsgaSA8PSBJbnRlcnJ1cHRJbkxlbmd0aDsgaSsrKSB7CisJCVQwMi52YWx1ZSB8PSAoKGNwdV90b19sZTMyKHBsdG1wW2ldKSAmIDB4ZmYpIDw8IDI0KTsKKworCQlUU1RBVFVTLnZhbHVlID0gVDAyLnZhbHVlOyAgLy8yMDA2MTAwOSBhbnNvbidzIGVuZGlhbgorCQlNZHNfU2VuZENvbXBsZXRlKCBhZGFwdGVyLCAmVFNUQVRVUyApOworCQlUMDIudmFsdWUgPSBjcHVfdG9fbGUzMihwbHRtcFtpXSkgPj4gODsKKwl9CisKKwlyZXR1cm47CitlcnJvcjoKKwlhdG9taWNfZGVjKCZwV2IzNVR4LT5UeFJlc3VsdENvdW50KTsKKwlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1NUT1A7Cit9CisKK3N0YXRpYyB2b2lkIFdiMzVUeF9FUDJWTShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCit7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKwlzdHJ1Y3QgdXJiICoJcFVyYiA9IChzdHJ1Y3QgdXJiICopcFdiMzVUeC0+VHgyVXJiOworCXUzMiAqCXBsdG1wID0gKHUzMiAqKXBXYjM1VHgtPkVQMl9idWY7CisJaW50CQlyZXR2OworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKKwkJZ290byBlcnJvcjsKKworCWlmIChwV2IzNVR4LT50eF9oYWx0KQorCQlnb3RvIGVycm9yOworCisJLy8KKwkvLyBJc3N1aW5nIFVSQgorCS8vCisJdXNiX2ZpbGxfaW50X3VyYiggcFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwgdXNiX3JjdmludHBpcGUocEh3RGF0YS0+V2JVc2IudWRldiwyKSwKKwkJCSAgcGx0bXAsIE1BWF9JTlRFUlJVUFRfTEVOR1RILCBXYjM1VHhfRVAyVk1fY29tcGxldGUsIGFkYXB0ZXIsIDMyKTsKKworCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fUlVOTklORzsKKwlyZXR2ID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7CisKKwlpZiAocmV0diA8IDApIHsKKwkJI2lmZGVmIF9QRV9UWF9EVU1QXworCQlXQkRFQlVHKCgiRVAyIFR4IElycCBzZW5kaW5nIGVycm9yXG4iKSk7CisJCSNlbmRpZgorCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybjsKK2Vycm9yOgorCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fU1RPUDsKKwlhdG9taWNfZGVjKCZwV2IzNVR4LT5UeFJlc3VsdENvdW50KTsKK30KKwordm9pZCBXYjM1VHhfRVAyVk1fc3RhcnQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQoreworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwkvLyBBbGxvdyBvbmx5IG9uZSB0aHJlYWQgdG8gcnVuIGludG8gZnVuY3Rpb24KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQpID09IDEpIHsKKwkJcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCQlXYjM1VHhfRVAyVk0oYWRhcHRlcik7CisJfQorCWVsc2UKKwkJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjIyZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X2YuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQjM1VFhfRl9ICisjZGVmaW5lIF9fV0lOQk9ORF9XQjM1VFhfRl9ICisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAid2JoYWxfZi5oIgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1bnNpZ25lZCBjaGFyIFdiMzVUeF9pbml0aWFsKAkgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFdiMzVUeF9kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit1bnNpZ25lZCBjaGFyIFdiMzVUeF9nZXRfdHhfYnVmZmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKipwQnVmZmVyICk7CisKK3ZvaWQgV2IzNVR4X0VQMlZNX3N0YXJ0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7CisKK3ZvaWQgV2IzNVR4X3N0YXJ0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7Cit2b2lkIFdiMzVUeF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CisKK3ZvaWQgV2IzNVR4X0N1cnJlbnRUaW1lKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIHUzMiBUaW1lQ291bnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NjAyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfcy5oCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCMzVfVFhfU19ICisjZGVmaW5lIF9fV0lOQk9ORF9XQjM1X1RYX1NfSAorCisjaW5jbHVkZSAibWRzX3MuaCIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIElTODlDMzUgVHggcmVsYXRlZCBkZWZpbml0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBUWF9JTlRFUkZBQ0UJCQkwCS8vIEludGVyZmFjZSAxCisjZGVmaW5lIFRYX1BJUEUJCQkJCTMJLy8gZW5kcG9pbnQgNAorI2RlZmluZSBUWF9JTlRFUlJVUFQJCQkxCS8vIGVuZHBvaW50IDIKKyNkZWZpbmUgTUFYX0lOVEVSUlVQVF9MRU5HVEgJNjQJLy8gSXQgbXVzdCBiZSA2NCBmb3IgRVAyIGhhcmR3YXJlCisKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCit0eXBlZGVmIHN0cnVjdCBfV0IzNVRYCit7CisJLy8gRm9yIFR4IGJ1ZmZlcgorCXU4CVR4QnVmZmVyWyBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVIgXVsgTUFYX1VTQl9UWF9CVUZGRVIgXTsKKworCS8vIEZvciBJbnRlcnJ1cHQgcGlwZQorCXU4CUVQMl9idWZbTUFYX0lOVEVSUlVQVF9MRU5HVEhdOworCisJYXRvbWljX3QJVHhSZXN1bHRDb3VudDsvLyBGb3IgdGhyZWFkIGNvbnRyb2wgb2YgRVAyIDkzMTEzMC40Lm0KKwlhdG9taWNfdAlUeEZpcmVDb3VudGVyOy8vIEZvciB0aHJlYWQgY29udHJvbCBvZiBFUDQgOTMxMTMwLjQubgorCXUzMgkJCUJ5dGVUcmFuc2ZlcjsKKworCXUzMgkgICAgVHhTZW5kSW5kZXg7Ly8gVGhlIG5leHQgaW5kZXggb2YgTWRzIGFycmF5IHRvIGJlIHNlbnQKKwl1MzIJICAgIEVQMnZtX3N0YXRlOyAvLyBmb3IgRVAydm0gc3RhdGUKKwl1MzIJICAgIEVQNHZtX3N0YXRlOyAvLyBmb3IgRVA0dm0gc3RhdGUKKwl1MzIJICAgIHR4X2hhbHQ7IC8vIFN0b3BwaW5nIFZNCisKKwlzdHJ1Y3QgdXJiICoJCQkJVHg0VXJiOworCXN0cnVjdCB1cmIgKgkJCQlUeDJVcmI7CisKKwlpbnQJCUVQMlZNX3N0YXR1czsKKwlpbnQJCUVQNFZNX3N0YXR1czsKKworCXUzMglUeEZpbGxDb3VudDsgLy8gMjAwNjA5MjgKKwl1MzIJVHhUaW1lcjsgLy8gMjAwNjA5MjggQWRkIGlmIHNlbmRpbmcgcGFja2V0IG5vdCBncmVhdCB0aGFuIDEzCisKK30gV0IzNVRYLCAqUFdCMzVUWDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWwuYwppbmRleCA1ZDY4ZWNlLi44YTlkMjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsLmMKQEAgLTEsMTEgKzEsNiBAQAogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgotCi12b2lkIGhhbF9nZXRfZXRoZXJuZXRfYWRkcmVzcyggcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqY3VycmVudF9hZGRyZXNzICkKLXsKLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQltZW1jcHkoIGN1cnJlbnRfYWRkcmVzcywgcEh3RGF0YS0+Q3VycmVudE1hY0FkZHJlc3MsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyApOwotfQorI2luY2x1ZGUgIndiaGFsX2YuaCIKKyNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKIAogdm9pZCBoYWxfc2V0X2V0aGVybmV0X2FkZHJlc3MoIHBod19kYXRhX3QgcEh3RGF0YSwgdTggKmN1cnJlbnRfYWRkcmVzcyApCiB7CkBAIC0yOCw0MjMgKzIzLDExIEBACiAJbWVtY3B5KCBwZXRoZXJuZXRfYWRkcmVzcywgcEh3RGF0YS0+UGVybWFuZW50TWFjQWRkcmVzcywgNiApOwogfQogCi11OCBoYWxfaW5pdF9oYXJkd2FyZShwaHdfZGF0YV90IHBId0RhdGEsIFBXQjMyX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyB2b2lkIGhhbF9sZWRfY29udHJvbCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JdTE2IFNvZnR3YXJlU2V0OwotCXBId0RhdGEtPkFkYXB0ZXIgPSBBZGFwdGVyOwotCi0JLy8gSW5pdGlhbCB0aGUgdmFyaWFibGUKLQlwSHdEYXRhLT5NYXhSZWNlaXZlTGlmZVRpbWUgPSBERUZBVUxUX01TRFVfTElGRV9USU1FOyAvLyBTZXR0aW5nIFJ4IG1heGltdW0gTVNEVSBsaWZlIHRpbWUKLQlwSHdEYXRhLT5GcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOyAvLyBTZXR0aW5nIGRlZmF1bHQgZnJhZ21lbnQgdGhyZXNob2xkCi0KLQlpZiAoV2JVc2JfaW5pdGlhbChwSHdEYXRhKSkgewotCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSAxOwotCQlpZiggV2IzNVJlZ19pbml0aWFsKHBId0RhdGEpKSB7Ci0JCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSAyOwotCQkJaWYgKFdiMzVUeF9pbml0aWFsKHBId0RhdGEpKSB7Ci0JCQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMzsKLQkJCQlpZiAoV2IzNVJ4X2luaXRpYWwocEh3RGF0YSkpIHsKLQkJCQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gNDsKLQkJCQkJT1NfVElNRVJfSU5JVElBTCggJnBId0RhdGEtPkxFRFRpbWVyLCBoYWxfbGVkX2NvbnRyb2wsIHBId0RhdGEgKTsKLQkJCQkJT1NfVElNRVJfU0VUKCAmcEh3RGF0YS0+TEVEVGltZXIsIDEwMDAgKTsgLy8gMjAwNjA2MjMKLQotCQkJCQkvLwotCQkJCQkvLyBGb3IgcmVzdHJpY3QgdG8gdmVuZG9yJ3MgaGFyZHdhcmUKLQkJCQkJLy8KLQkJCQkJU29mdHdhcmVTZXQgPSBoYWxfc29mdHdhcmVfc2V0KCBwSHdEYXRhICk7Ci0KLQkJCQkJI2lmZGVmIFZlbmRvcjIKLQkJCQkJLy8gVHJ5IHRvIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGNvbnRhaW4KLQkJCQkJU29mdHdhcmVTZXQgPj49IDg7Ci0JCQkJCWlmKCBTb2Z0d2FyZVNldCAhPSAweDgyICkKLQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJI2VuZGlmCi0KLQkJCQkJV2IzNVJ4X3N0YXJ0KCBwSHdEYXRhICk7Ci0JCQkJCVdiMzVUeF9FUDJWTV9zdGFydCggcEh3RGF0YSApOwotCi0JCQkJCXJldHVybiBUUlVFOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLQotdm9pZCBoYWxfaGFsdChwaHdfZGF0YV90IHBId0RhdGEsIHZvaWQgKnBwYV9kYXRhKQotewotCXN3aXRjaCggcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlICkKLQl7Ci0JCWNhc2UgNDoKLQkJY2FzZSAzOiBPU19USU1FUl9DQU5DRUwoICZwSHdEYXRhLT5MRURUaW1lciwgJmNhbmNlbCApOwotCQkJT1NfU0xFRVAoMTAwMDAwKTsgLy8gV2FpdCBmb3IgVGltZXIgRFBDIGV4aXQgOTQwNjIzLjIKLQkJCVdiMzVSeF9kZXN0cm95KCBwSHdEYXRhICk7IC8vIFJlbGVhc2UgdGhlIFJ4Ci0JCWNhc2UgMjogV2IzNVR4X2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgVHgKLQkJY2FzZSAxOiBXYjM1UmVnX2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgV2IzNSBSZWdpc3N0ZXIgcmVzb3VyY2VzCi0JCQkJV2JVc2JfZGVzdHJveSggcEh3RGF0YSApOy8vIFJlbGVhc2UgdGhlIFdiVXNiCi0JfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X3JhdGVzKHBod19kYXRhX3QgcEh3RGF0YSwgdTggKnBic3NfcmF0ZXMsCi0JCSAgIHU4IGxlbmd0aCwgdW5zaWduZWQgY2hhciBiYXNpY19yYXRlX3NldCkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXUzMgkJdG1wLCB0bXAxOwotCXU4CQlSYXRlWzEyXT17IDIsIDQsIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCB9OwotCXU4CQlTdXBwb3J0ZWRSYXRlWzE2XTsKLQl1OAkJaSwgaiwgaywgQ291bnQxLCBDb3VudDIsIEJ5dGU7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQlpZiAoYmFzaWNfcmF0ZV9zZXQpIHsKLQkJcFdiMzVSZWctPk0yOF9NYWNDb250cm9sICY9IH4weDAwMGZmZjAwOwotCQl0bXAxID0gMHgwMDAwMDEwMDsKLQl9IGVsc2UgewotCQlwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgJj0gfjB4ZmZmMDAwMDA7Ci0JCXRtcDEgPSAweDAwMTAwMDAwOwotCX0KLQotCXRtcCA9IDA7Ci0JZm9yIChpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJQnl0ZSA9IHBic3NfcmF0ZXNbaV0gJiAweDdmOwotCQlmb3IgKGo9MDsgajwxMjsgaisrKSB7Ci0JCQlpZiggQnl0ZSA9PSBSYXRlW2pdICkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqIDwgMTIpCi0JCQl0bXAgfD0gKHRtcDE8PGopOwotCX0KLQotCXBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCB8PSB0bXA7Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODI4LCBwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgKTsKLQotCS8vIDkzMDIwNi4yLmMgTTc4IHNldHRpbmcKLQlqID0gayA9IENvdW50MSA9IENvdW50MiA9IDA7Ci0JbWVtc2V0KCBTdXBwb3J0ZWRSYXRlLCAwLCAxNiApOwotCXRtcCA9IDB4MDAxMDAwMDA7Ci0JdG1wMSA9IDB4MDAwMDAxMDA7Ci0JZm9yIChpPTA7IGk8MTI7IGkrKykgeyAvLyBHZXQgdGhlIHN1cHBvcnRlZCByYXRlCi0JCWlmICh0bXAgJiBwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wpIHsKLQkJCVN1cHBvcnRlZFJhdGVbal0gPSBSYXRlW2ldOwotCi0JCQlpZiAodG1wMSAmIHBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCkKLQkJCQlTdXBwb3J0ZWRSYXRlW2pdIHw9IDB4ODA7Ci0KLQkJCWlmIChrKQotCQkJCUNvdW50MisrOwotCQkJZWxzZQotCQkJCUNvdW50MSsrOwotCi0JCQlqKys7Ci0JCX0KLQotCQlpZiAoaT09NCAmJiBrPT0wKSB7Ci0JCQlpZiggIShwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgJiAweDAwMGZmMDAwKSApIC8vIGlmIGJhc2ljIHJhdGUgaW4gMTFnIGRvbWFpbikKLQkJCXsKLQkJCQlrID0gMTsKLQkJCQlqID0gODsKLQkJCX0KLQkJfQotCi0JCXRtcCA8PD0gMTsKLQkJdG1wMSA8PD0gMTsKLQl9Ci0KLQkvLyBGaWxsIGRhdGEgaW50byBzdXBwb3J0IHJhdGUgdW50aWwgYnVmZmVyIGZ1bGwKLQkvLy0tLTIwMDYwOTI2IGFkZCBieSBhbnNvbidzIGVuZGlhbgotCWZvciAoaT0wOyBpPDQ7IGkrKykKLQkJKih1MzIgKikoU3VwcG9ydGVkUmF0ZSsoaTw8MikpID0gY3B1X3RvX2xlMzIoICoodTMyICopKFN1cHBvcnRlZFJhdGUrKGk8PDIpKSApOwotCS8vLS0tIGVuZCAyMDA2MDkyNiBhZGQgYnkgYW5zb24ncyBlbmRpYW4KLQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsMHgwODdjLCAodTMyICopU3VwcG9ydGVkUmF0ZSwgNCwgQVVUT19JTkNSRU1FTlQgKTsKLQlwV2IzNVJlZy0+TTdDX01hY0NvbnRyb2wgPSAoKHUzMiAqKVN1cHBvcnRlZFJhdGUpWzBdOwotCXBXYjM1UmVnLT5NODBfTWFjQ29udHJvbCA9ICgodTMyICopU3VwcG9ydGVkUmF0ZSlbMV07Ci0JcFdiMzVSZWctPk04NF9NYWNDb250cm9sID0gKCh1MzIgKilTdXBwb3J0ZWRSYXRlKVsyXTsKLQlwV2IzNVJlZy0+TTg4X01hY0NvbnRyb2wgPSAoKHUzMiAqKVN1cHBvcnRlZFJhdGUpWzNdOwotCi0JLy8gRmlsbCBsZW5ndGgKLQl0bXAgPSBDb3VudDE8PDI4IHwgQ291bnQyPDwyNDsKLQlwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICY9IH4weGZmMDAwMDAwOwotCXBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gfD0gdG1wOwotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg3OCwgcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiApOwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9zZXRfYmVhY29uX3BlcmlvZCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBiZWFjb25fcGVyaW9kICkKLXsKLQl1MzIJdG1wOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JcEh3RGF0YS0+QmVhY29uUGVyaW9kID0gYmVhY29uX3BlcmlvZDsKLQl0bXAgPSBwSHdEYXRhLT5CZWFjb25QZXJpb2QgPDwgMTY7Ci0JdG1wIHw9IHBId0RhdGEtPlByb2JlRGVsYXk7Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODQ4LCB0bXAgKTsKLX0KLQotCi12b2lkIGhhbF9zZXRfY3VycmVudF9jaGFubmVsX2V4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gY2hhbm5lbCApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApCi0JCXJldHVybjsKLQotCXByaW50aygiR29pbmcgdG8gY2hhbm5lbDogJWQvJWRcbiIsIGNoYW5uZWwuYmFuZCwgY2hhbm5lbC5DaGFuTm8pOwotCi0JUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCBwSHdEYXRhLCBjaGFubmVsICk7Ly8gU3dpdGNoIGNoYW5uZWwKLQlwSHdEYXRhLT5DaGFubmVsID0gY2hhbm5lbC5DaGFuTm87Ci0JcEh3RGF0YS0+YmFuZCA9IGNoYW5uZWwuYmFuZDsKLQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JV0JERUJVRygoIlNldCBjaGFubmVsIGlzICVkLCBiYW5kID0lZFxuIiwgcEh3RGF0YS0+Q2hhbm5lbCwgcEh3RGF0YS0+YmFuZCkpOwotCSNlbmRpZgotCXBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCAmPSB+MHhmZjsgLy8gQ2xlYW4gY2hhbm5lbCBpbmZvcm1hdGlvbiBmaWVsZAotCXBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCB8PSBjaGFubmVsLkNoYW5ObzsKLQlXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoIHBId0RhdGEsIDB4MDgyOCwgcFdiMzVSZWctPk0yOF9NYWNDb250cm9sLAotCQkJCQkoczggKikmY2hhbm5lbCwgc2l6ZW9mKENoYW5JbmZvKSk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIGNoYW5uZWwgKQotewotCWhhbF9zZXRfY3VycmVudF9jaGFubmVsX2V4KCBwSHdEYXRhLCBjaGFubmVsICk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfZ2V0X2N1cnJlbnRfY2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvICpjaGFubmVsICkKLXsKLQljaGFubmVsLT5DaGFuTm8gPSBwSHdEYXRhLT5DaGFubmVsOwotCWNoYW5uZWwtPmJhbmQgPSBwSHdEYXRhLT5iYW5kOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICY9IH4weDAyMDAwMDAwOy8vVGhlIEhXIHZhbHVlCi0KLQlpZiAoZW5hYmxlKQotCQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwMjAwMDAwMDsvL1RoZSBIVyB2YWx1ZQotCi0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgKTsKLX0KLQotLy9mb3Igd2VwIGtleSBlcnJvciBkZXRlY3Rpb24sIHdlIG5lZWQgdG8gYWNjZXB0IGJyb2FkY2FzdCBwYWNrZXRzIHRvIGJlIHJlY2VpdmVkIHRlbXBvcmFyeS4KLXZvaWQgaGFsX3NldF9hY2NlcHRfcHJvbWlzY3VvdXMoIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSByZXR1cm47Ci0JaWYgKGVuYWJsZSkgewotCQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwMDQwMDAwMDsKLQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgKTsKLQl9IGVsc2UgewotCQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wmPX4weDAwNDAwMDAwOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCApOwotCX0KLX0KLQotdm9pZCBoYWxfc2V0X2FjY2VwdF9tdWx0aWNhc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgJj0gfjB4MDEwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQlpZiAoZW5hYmxlKSAgcFdiMzVSZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDEwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCApOwotfQotCi12b2lkIGhhbF9zZXRfYWNjZXB0X2JlYWNvbiggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCS8vIDIwMDQwMTA4IGRlYnVnCi0JaWYoICFlbmFibGUgKS8vRHVlIHRvIFNNRSBhbmQgTUxNRSBhcmUgbm90IHN1aXRhYmxlIGZvciAzNQotCQlyZXR1cm47Ci0KLQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgJj0gfjB4MDQwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQlpZiggZW5hYmxlICkKLQkJcFdiMzVSZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDQwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X211bHRpY2FzdF9hZGRyZXNzKCBwaHdfZGF0YV90IHBId0RhdGEsIHU4ICphZGRyZXNzLCB1OCBudW1iZXIgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JdTgJCUJ5dGUsIEJpdDsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCS8vRXJhc2VzIGFuZCByZWZpbGxzIHRoZSBjYXJkIG11bHRpY2FzdCByZWdpc3RlcnMuIFVzZWQgd2hlbiBhbiBhZGRyZXNzCi0JLy8gICAgaGFzIGJlZW4gZGVsZXRlZCBhbmQgYWxsIGJpdHMgbXVzdCBiZSByZWNvbXB1dGVkLgotCXBXYjM1UmVnLT5NMDRfTXVsdGljYXN0QWRkcmVzczEgPSAwOwotCXBXYjM1UmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSAwOwotCi0Jd2hpbGUoIG51bWJlciApCi0JewotCQludW1iZXItLTsKLQkJQ2FyZEdldE11bHRpY2FzdEJpdCggKGFkZHJlc3MrKG51bWJlcipFVEhfTEVOR1RIX09GX0FERFJFU1MpKSwgJkJ5dGUsICZCaXQpOwotCQlwV2IzNVJlZy0+TXVsdGljYXN0W0J5dGVdIHw9IEJpdDsKLQl9Ci0KLQkvLyBVcGRhdGluZyByZWdpc3RlcgotCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgwODA0LCAodTMyICopcFdiMzVSZWctPk11bHRpY2FzdCwgMiwgQVVUT19JTkNSRU1FTlQgKTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi11OCBoYWxfZ2V0X2FjY2VwdF9iZWFjb24oICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm4gMDsKLQotCWlmKCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgJiAweDA0MDAwMDAwICkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgY2hhciBoYWxfcmVzZXRfaGFyZHdhcmUoIHBod19kYXRhX3QgcEh3RGF0YSwgdm9pZCogcHBhICkKLXsKLQkvLyBOb3QgaW1wbGVtZW50IHlldAotCXJldHVybiBUUlVFOwotfQotCi12b2lkIGhhbF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JcEh3RGF0YS0+V2IzNVJ4LnJ4X2hhbHQgPSAxOwotCVdiMzVSeF9zdG9wKCBwSHdEYXRhICk7Ci0KLQlwSHdEYXRhLT5XYjM1VHgudHhfaGFsdCA9IDE7Ci0JV2IzNVR4X3N0b3AoIHBId0RhdGEgKTsKLQotCXBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCAmPSB+MHhjMDAwMDAwMDsvL1R4IE9mZiwgUnggT2ZmCi0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwNDAwLCBwV2IzNVJlZy0+RDAwX0RtYUNvbnRyb2wgKTsKLQotCVdiVXNiX1N0b3AoIHBId0RhdGEgKTsgLy8gMjAwNTEyMzAgQWRkLjQKLX0KLQotdW5zaWduZWQgY2hhciBoYWxfaWRsZShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlQV0JVU0IJcFdiVXNiID0gJnBId0RhdGEtPldiVXNiOwotCi0JaWYoICFwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSAmJiAoIHBXYlVzYi0+RGV0ZWN0Q291bnQgfHwgcFdiMzVSZWctPkVQMHZtX3N0YXRlIT1WTV9TVE9QICkgKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9zZXRfY3dtaW4oICBwaHdfZGF0YV90IHBId0RhdGEsICB1OAljd2luX21pbiApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCXBId0RhdGEtPmN3bWluID0gY3dpbl9taW47Ci0JcFdiMzVSZWctPk0yQ19NYWNDb250cm9sICY9IH4weDdjMDA7CS8vYml0IDEwIH4gMTQKLQlwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgfD0gKHBId0RhdGEtPmN3bWluPDwxMCk7Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODJjLCBwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgKTsKLX0KLQotczMyIGhhbF9nZXRfcnNzaSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiAqSGFsUnNzaUFycnksICB1OCBDb3VudCApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlSMDFfREVTQ1JJUFRPUglyMDE7Ci0JczMyIGx0bXAgPSAwLCB0bXA7Ci0JdTgJaTsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybiAtMjAwOwotCWlmKCBDb3VudCA+IE1BWF9BQ0NfUlNTSV9DT1VOVCApIC8vIEJlY2F1c2UgdGhlIFRTIG1heSB1c2UgdGhpcyBmdW50aW9uCi0JCUNvdW50ID0gTUFYX0FDQ19SU1NJX0NPVU5UOwotCi0JLy8gUlNTSSA9IEMxICsgQzIgKiAoYWdjX3N0YXRlWzc6MF0gKyBvZmZzZXRfbWFwKGxuYV9zdGF0ZVsxOjBdKSkKLQkvLyBDMSA9IC0xOTUsIEMyID0gMC42NiA9IDg1LzEyOAotCWZvciAoaT0wOyBpPENvdW50OyBpKyspCi0JewotCQlyMDEudmFsdWUgPSBIYWxSc3NpQXJyeVtpXTsKLQkJdG1wID0gKCgoIHIwMS5SMDFfQUdDX3N0YXRlICsgcFdiMzVSZWctPkxOQVZhbHVlW3IwMS5SMDFfTE5BX3N0YXRlXSkgKiA4NSApID4+NyApIC0gMTk1OwotCQlsdG1wICs9IHRtcDsKLQl9Ci0JbHRtcCAvPSBDb3VudDsKLQlpZiggcEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfQUlST0hBXzIyMzAgKSBsdG1wIC09IDU7IC8vIDEwOwotCWlmKCBwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9BSVJPSEFfMjIzMFMgKSBsdG1wIC09IDU7IC8vIDEwOyAyMDA2MDQyMCBBZGQgdGhpcwotCi0JLy9pZiggbHRtcCA8IC0yMDAgKSBsdG1wID0gLTIwMDsKLQlpZiggbHRtcCA8IC0xMTAgKSBsdG1wID0gLTExMDsvLyAxLjAuMjQuMCBGb3IgTkpSQwotCi0JcmV0dXJuIGx0bXA7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXMzMiBoYWxfZ2V0X3Jzc2lfYnNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGlkeCwgIHU4IENvdW50ICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVIwMV9ERVNDUklQVE9SCXIwMTsKLQlzMzIgbHRtcCA9IDAsIHRtcDsKLQl1OAlpLCBqOwotCVBBREFQVEVSCUFkYXB0ZXIgPSBwSHdEYXRhLT5BZGFwdGVyOwotLy8JdTMyICpIYWxSc3NpQXJyeSA9IHBzQlNTKGlkeCktPkhhbFJzc2k7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm4gLTIwMDsKLQlpZiggQ291bnQgPiBNQVhfQUNDX1JTU0lfQ09VTlQgKSAvLyBCZWNhdXNlIHRoZSBUUyBtYXkgdXNlIHRoaXMgZnVudGlvbgotCQlDb3VudCA9IE1BWF9BQ0NfUlNTSV9DT1VOVDsKLQotCS8vIFJTU0kgPSBDMSArIEMyICogKGFnY19zdGF0ZVs3OjBdICsgb2Zmc2V0X21hcChsbmFfc3RhdGVbMTowXSkpCi0JLy8gQzEgPSAtMTk1LCBDMiA9IDAuNjYgPSA4NS8xMjgKLSNpZiAwCi0JZm9yIChpPTA7IGk8Q291bnQ7IGkrKykKLQl7Ci0JCXIwMS52YWx1ZSA9IEhhbFJzc2lBcnJ5W2ldOwotCQl0bXAgPSAoKCggcjAxLlIwMV9BR0Nfc3RhdGUgKyBwV2IzNVJlZy0+TE5BVmFsdWVbcjAxLlIwMV9MTkFfc3RhdGVdKSAqIDg1ICkgPj43ICkgLSAxOTU7Ci0JCWx0bXAgKz0gdG1wOwotCX0KLSNlbHNlCi0JaWYgKHBzQlNTKGlkeCktPkhhbFJzc2lJbmRleCA9PSAwKQotCQlwc0JTUyhpZHgpLT5IYWxSc3NpSW5kZXggPSBNQVhfQUNDX1JTU0lfQ09VTlQ7Ci0JaiA9ICh1OClwc0JTUyhpZHgpLT5IYWxSc3NpSW5kZXgtMTsKLQotCWZvciAoaT0wOyBpPENvdW50OyBpKyspCi0JewotCQlyMDEudmFsdWUgPSBwc0JTUyhpZHgpLT5IYWxSc3NpW2pdOwotCQl0bXAgPSAoKCggcjAxLlIwMV9BR0Nfc3RhdGUgKyBwV2IzNVJlZy0+TE5BVmFsdWVbcjAxLlIwMV9MTkFfc3RhdGVdKSAqIDg1ICkgPj43ICkgLSAxOTU7Ci0JCWx0bXAgKz0gdG1wOwotCQlpZiAoaiA9PSAwKQotCQl7Ci0JCQlqID0gTUFYX0FDQ19SU1NJX0NPVU5UOwotCQl9Ci0JCWotLTsKLQl9Ci0jZW5kaWYKLQlsdG1wIC89IENvdW50OwotCWlmKCBwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9BSVJPSEFfMjIzMCApIGx0bXAgLT0gNTsgLy8gMTA7Ci0JaWYoIHBId0RhdGEtPnBoeV90eXBlID09IFJGX0FJUk9IQV8yMjMwUyApIGx0bXAgLT0gNTsgLy8gMTA7IDIwMDYwNDIwIEFkZCB0aGlzCi0KLQkvL2lmKCBsdG1wIDwgLTIwMCApIGx0bXAgPSAtMjAwOwotCWlmKCBsdG1wIDwgLTExMCApIGx0bXAgPSAtMTEwOy8vIDEuMC4yNC4wIEZvciBOSlJDCi0KLQlyZXR1cm4gbHRtcDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX2xlZF9jb250cm9sXzFhKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQloYWxfbGVkX2NvbnRyb2woIE5VTEwsIHBId0RhdGEsIE5VTEwsIE5VTEwgKTsKLX0KLQotdm9pZCBoYWxfbGVkX2NvbnRyb2woICB2b2lkKiBTMSwgIHBod19kYXRhX3QgcEh3RGF0YSwgIHZvaWQqIFMzLCAgdm9pZCogUzQgKQotewotCVBBREFQVEVSCUFkYXB0ZXIgPSBwSHdEYXRhLT5BZGFwdGVyOwotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyID0gKHN0cnVjdCB3YnNvZnRfcHJpdiAqKSBkYXRhOworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJTEVEU2V0ID0gKHBId0RhdGEtPlNvZnR3YXJlU2V0ICYgSEFMX0xFRF9TRVRfTUFTSykgPj4gSEFMX0xFRF9TRVRfU0hJRlQ7CiAJdTgJTEVEZ3JheVsyMF0gPSB7IDAsMyw0LDYsOCwxMCwxMSwxMiwxMywxNCwxNSwxNCwxMywxMiwxMSwxMCw4LDYsNCwyIH07CiAJdTgJTEVEZ3JheTJbMzBdID0geyA3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE1LDE0LDEzLDEyLDExLDEwLDksOCB9OwpAQCAtNDg3LDIxICs3MCwyMSBAQAogCQkJfQogCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nKys7CiAKLQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSA9IGx0bXA7CisJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlID0gbHRtcDsKIAkJCWlmKCBMRURTZXQgIT0gNyApIC8vIE9ubHkgMTExIG1vZGUgaGFzIDIgTEVEcyBvbiBQQ0IuCiAJCQl7Ci0JCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IChsdG1wICYweGZmKTw8ODsgLy8gQ29weSBMRUQgcmVzdWx0IHRvIGVhY2ggTEVEIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gKGx0bXAgJjB4ZmYwMCk+Pjg7CisJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAobHRtcCAmMHhmZik8PDg7IC8vIENvcHkgTEVEIHJlc3VsdCB0byBlYWNoIExFRCBjb250cm9sIHJlZ2lzdGVyCisJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAobHRtcCAmMHhmZjAwKT4+ODsKIAkJCX0KLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CisJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAkJfQogCX0KIAllbHNlIGlmKCBwSHdEYXRhLT5DdXJyZW50UmFkaW9TdyB8fCBwSHdEYXRhLT5DdXJyZW50UmFkaW9IdyApIC8vIElmIHJhZGlvIG9mZgogCXsKLQkJaWYoIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAxMCApCisJCWlmKCByZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMDEwICkKIAkJewotCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwMTA7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDEwOworCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CiAJCX0KIAl9CiAJZWxzZQpAQCAtNTE2LDE1ICs5OSwxNSBAQAogCQkJCQl7CiAJCQkJCQlpZiggcEh3RGF0YS0+TEVEX0JsaW5raW5nID09IDAgKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9uCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPbgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDE7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQogCQkJCQkJZWxzZQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAwOwogCQkJCQkJCVRpbWVJbnRlcnZhbCA9IDMwMDsKIAkJCQkJCX0KQEAgLTUzMiwyMCArMTE1LDIwIEBACiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJLy9UdXJuIE9mZiBMRURfMAotCQkJCQkJaWYoIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAgKQorCQkJCQkJaWYoIHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJLy8gVHVybiBPbiBMRURfMAotCQkJCQlpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTApID09IDAgKQorCQkJCQlpZiggKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSA9PSAwICkKIAkJCQkJewotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKQEAgLTU1OCwxNiArMTQxLDE2IEBACiAJCQkJCXsKIAkJCQkJCWlmKCBwSHdEYXRhLT5MRURfQmxpbmtpbmcgPT0gMCApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weGY7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT24KKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weGY7CisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPbgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDE7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQogCQkJCQkJZWxzZQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxZjsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDFmOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAwOwogCQkJCQkJCVRpbWVJbnRlcnZhbCA9IDMwMDsKIAkJCQkJCX0KQEAgLTU3NSwyNiArMTU4LDI2IEBACiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJLy8gMjAwNjA5MDEgR3JheSBibGlua2luZyBpZiBpbiBkaXNjb25uZWN0IHN0YXRlIGFuZCBub3Qgc2Nhbm5pbmcKLQkJCQkJCWx0bXAgPSBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmU7Ci0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MWY7CisJCQkJCQlsdG1wID0gcmVnLT5VMUJDX0xFRENvbmZpZ3VyZTsKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MWY7CiAJCQkJCQlpZiggTEVEZ3JheTJbKHBId0RhdGEtPkxFRF9CbGlua2luZyUzMCldICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gTEVEZ3JheTJbIChwSHdEYXRhLT5MRURfQmxpbmtpbmclMzApIF07CisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gTEVEZ3JheTJbIChwSHdEYXRhLT5MRURfQmxpbmtpbmclMzApIF07CiAJCQkJCQl9CiAJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcrKzsKLQkJCQkJCWlmKCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgIT0gbHRtcCApCi0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCisJCQkJCQlpZiggcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAhPSBsdG1wICkKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCiAJCQkJCQlUaW1lSW50ZXJ2YWwgPSAxMDA7CiAJCQkJCX0KIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJLy8gVHVybiBPbiBMRURfMAotCQkJCQlpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTApID09IDAgKQorCQkJCQlpZiggKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSA9PSAwICkKIAkJCQkJewotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKQEAgLTYwNywxNSArMTkwLDE1IEBACiAJCQkJCXsKIAkJCQkJCWlmKCBwSHdEYXRhLT5MRURfQmxpbmtpbmcgPT0gMCApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTAwMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDAwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDE7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQogCQkJCQkJZWxzZQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDAwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9mZgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTAwMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT2ZmCiAJCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMDsKIAkJCQkJCQlUaW1lSW50ZXJ2YWwgPSAzMDA7CiAJCQkJCQl9CkBAIC02MjMsNTcgKzIwNiw1NyBAQAogCQkJCQllbHNlCiAJCQkJCXsKIAkJCQkJCS8vVHVybiBPZmYgTEVEXzEKLQkJCQkJCWlmKCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwMDAgKQorCQkJCQkJaWYoIHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwMDAgKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDAwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9mZgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTAwMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT2ZmCiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJLy8gSXMgdHJhbnNtaXR0aW5nL3JlY2VpdmluZyA/PwotCQkJCQlpZiggKE9TX0NVUlJFTlRfUlhfQllURSggQWRhcHRlciApICE9IHBId0RhdGEtPlJ4Qnl0ZUNvdW50TGFzdCApIHx8Ci0JCQkJCQkoT1NfQ1VSUkVOVF9UWF9CWVRFKCBBZGFwdGVyICkgIT0gcEh3RGF0YS0+VHhCeXRlQ291bnRMYXN0ICkgKQorCQkJCQlpZiggKGFkYXB0ZXItPlJ4Qnl0ZUNvdW50ICE9IHBId0RhdGEtPlJ4Qnl0ZUNvdW50TGFzdCApIHx8CisJCQkJCQkoYWRhcHRlci0+VHhCeXRlQ291bnQgIT0gcEh3RGF0YS0+VHhCeXRlQ291bnRMYXN0ICkgKQogCQkJCQl7Ci0JCQkJCQlpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgzMDAwICkKKwkJCQkJCWlmKCAocmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgzMDAwICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgzMDAwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDMwMDA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCiAJCQkJCQl9CiAKIAkJCQkJCS8vIFVwZGF0ZSB2YXJpYWJsZQotCQkJCQkJcEh3RGF0YS0+UnhCeXRlQ291bnRMYXN0ID0gT1NfQ1VSUkVOVF9SWF9CWVRFKCBBZGFwdGVyICk7Ci0JCQkJCQlwSHdEYXRhLT5UeEJ5dGVDb3VudExhc3QgPSBPU19DVVJSRU5UX1RYX0JZVEUoIEFkYXB0ZXIgKTsKKwkJCQkJCXBId0RhdGEtPlJ4Qnl0ZUNvdW50TGFzdCA9IGFkYXB0ZXItPlJ4Qnl0ZUNvdW50OworCQkJCQkJcEh3RGF0YS0+VHhCeXRlQ291bnRMYXN0ID0gYWRhcHRlci0+VHhCeXRlQ291bnQ7CiAJCQkJCQlUaW1lSW50ZXJ2YWwgPSAyMDA7CiAJCQkJCX0KIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQkvLyBUdXJuIE9uIExFRF8xIGFuZCBibGlua2luZyBpZiB0cmFuc21pdHRpbmcvcmVjZWl2aW5nCi0JCQkJCQkgaWYoIChwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDMwMDApICE9IDB4MTAwMCApCisJCQkJCQkgaWYoIChyZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgzMDAwKSAhPSAweDEwMDAgKQogCQkJCQkJIHsKLQkJCQkJCQkgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDMwMDA7Ci0JCQkJCQkJIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwMDA7Ci0JCQkJCQkJIFdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCisJCQkJCQkJIHJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MzAwMDsKKwkJCQkJCQkgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwMDA7CisJCQkJCQkJIFdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgogCQkJCQkJIH0KIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDogLy8gRGVmYXVsdCBzZXR0aW5nLiAyIExFRCBiZSBwbGFjZWQgb24gUENCLiBMRURfMDogTGluayBPbiBMRURfMSBBY3RpdmUKLQkJCQlpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgzMDAwICkKKwkJCQlpZiggKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDMwMDApICE9IDB4MzAwMCApCiAJCQkJewotCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgzMDAwOy8vIExFRF8xIGlzIGFsd2F5cyBvbiBhbmQgZXZlbnQgZW5hYmxlCi0JCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CisJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgzMDAwOy8vIExFRF8xIGlzIGFsd2F5cyBvbiBhbmQgZXZlbnQgZW5hYmxlCisJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOwogCQkJCX0KIAogCQkJCWlmKCBwSHdEYXRhLT5MRURfQmxpbmtpbmcgKQogCQkJCXsKIAkJCQkJLy8gR3JheSBibGlua2luZwotCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MGY7Ci0JCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwotCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gTEVEZ3JheVsgKHBId0RhdGEtPkxFRF9CbGlua2luZy0xKSUyMCBdOwotCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDBmOworCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CisJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gTEVEZ3JheVsgKHBId0RhdGEtPkxFRF9CbGlua2luZy0xKSUyMCBdOworCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAogCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgKz0gMjsKIAkJCQkJaWYoIHBId0RhdGEtPkxFRF9CbGlua2luZyA8IDQwICkKQEAgLTY4MSwyOCArMjY0LDI4IEBACiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMDsgLy8gU3RvcCBibGlua2luZwotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDBmOwotCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MGY7CisJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQl9CiAKIAkJCQlpZiggcEh3RGF0YS0+TEVEX0xpbmtPbiApCiAJCQkJewotCQkJCQlpZiggIShwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSApIC8vIENoZWNrIHRoZSBMRURfMAorCQkJCQlpZiggIShyZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCkgKSAvLyBDaGVjayB0aGUgTEVEXzAKIAkJCQkJewogCQkJCQkJLy9UcnkgdG8gdHVybiBPTiBMRURfMCBhZnRlciBncmF5IGJsaW5raW5nCi0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKIAkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDE7IC8vU3RhcnQgYmxpbmtpbmcKIAkJCQkJCVRpbWVJbnRlcnZhbCA9IDUwOwogCQkJCQl9CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7Ci0JCQkJCWlmKCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwICkgLy8gQ2hlY2sgdGhlIExFRF8wCisJCQkJCWlmKCByZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCApIC8vIENoZWNrIHRoZSBMRURfMAogCQkJCQl7Ci0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTA7Ci0JCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKKwkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtNzIwLDg0ICszMDMsMjQwIEBACiAJfQogCiAJcEh3RGF0YS0+dGltZV9jb3VudCArPSBUaW1lSW50ZXJ2YWw7Ci0JV2IzNVR4X0N1cnJlbnRUaW1lKCBwSHdEYXRhLCBwSHdEYXRhLT50aW1lX2NvdW50ICk7IC8vIDIwMDYwOTI4IGFkZAotCU9TX1RJTUVSX1NFVCggJnBId0RhdGEtPkxFRFRpbWVyLCBUaW1lSW50ZXJ2YWwgKTsgLy8gMjAwNjA2MjMuMQorCVdiMzVUeF9DdXJyZW50VGltZShhZGFwdGVyLCBwSHdEYXRhLT50aW1lX2NvdW50KTsgLy8gMjAwNjA5MjggYWRkCisJcEh3RGF0YS0+TEVEVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRpbWVJbnRlcnZhbCk7CisJYWRkX3RpbWVyKCZwSHdEYXRhLT5MRURUaW1lcik7Cit9CisKK3U4IGhhbF9pbml0X2hhcmR3YXJlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCXUxNiBTb2Z0d2FyZVNldDsKKworCS8vIEluaXRpYWwgdGhlIHZhcmlhYmxlCisJcEh3RGF0YS0+TWF4UmVjZWl2ZUxpZmVUaW1lID0gREVGQVVMVF9NU0RVX0xJRkVfVElNRTsgLy8gU2V0dGluZyBSeCBtYXhpbXVtIE1TRFUgbGlmZSB0aW1lCisJcEh3RGF0YS0+RnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsgLy8gU2V0dGluZyBkZWZhdWx0IGZyYWdtZW50IHRocmVzaG9sZAorCisJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMTsKKwlpZiggV2IzNVJlZ19pbml0aWFsKHBId0RhdGEpKSB7CisJCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDI7CisJCWlmIChXYjM1VHhfaW5pdGlhbChwSHdEYXRhKSkgeworCQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMzsKKwkJCWlmIChXYjM1UnhfaW5pdGlhbChwSHdEYXRhKSkgeworCQkJCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDQ7CisJCQkJaW5pdF90aW1lcigmcEh3RGF0YS0+TEVEVGltZXIpOworCQkJCXBId0RhdGEtPkxFRFRpbWVyLmZ1bmN0aW9uID0gaGFsX2xlZF9jb250cm9sOworCQkJCXBId0RhdGEtPkxFRFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgcHJpdjsKKwkJCQlwSHdEYXRhLT5MRURUaW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJCQkJYWRkX3RpbWVyKCZwSHdEYXRhLT5MRURUaW1lcik7CisKKwkJCQkvLworCQkJCS8vIEZvciByZXN0cmljdCB0byB2ZW5kb3IncyBoYXJkd2FyZQorCQkJCS8vCisJCQkJU29mdHdhcmVTZXQgPSBoYWxfc29mdHdhcmVfc2V0KCBwSHdEYXRhICk7CisKKwkJCQkjaWZkZWYgVmVuZG9yMgorCQkJCS8vIFRyeSB0byBtYWtlIHN1cmUgdGhlIEVFUFJPTSBjb250YWluCisJCQkJU29mdHdhcmVTZXQgPj49IDg7CisJCQkJaWYoIFNvZnR3YXJlU2V0ICE9IDB4ODIgKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJI2VuZGlmCisKKwkJCQlXYjM1Unhfc3RhcnQoaHcpOworCQkJCVdiMzVUeF9FUDJWTV9zdGFydChwcml2KTsKKworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCisJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOworCXJldHVybiBmYWxzZTsKIH0KIAogCit2b2lkIGhhbF9oYWx0KHBod19kYXRhX3QgcEh3RGF0YSwgdm9pZCAqcHBhX2RhdGEpCit7CisJc3dpdGNoKCBwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgKQorCXsKKwkJY2FzZSA0OgorCQljYXNlIDM6IGRlbF90aW1lcl9zeW5jKCZwSHdEYXRhLT5MRURUaW1lcik7CisJCQltc2xlZXAoMTAwKTsgLy8gV2FpdCBmb3IgVGltZXIgRFBDIGV4aXQgOTQwNjIzLjIKKwkJCVdiMzVSeF9kZXN0cm95KCBwSHdEYXRhICk7IC8vIFJlbGVhc2UgdGhlIFJ4CisJCWNhc2UgMjogV2IzNVR4X2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgVHgKKwkJY2FzZSAxOiBXYjM1UmVnX2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgV2IzNSBSZWdpc3N0ZXIgcmVzb3VyY2VzCisJfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBoYWxfc2V0X2JlYWNvbl9wZXJpb2QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgYmVhY29uX3BlcmlvZCApCit7CisJdTMyCXRtcDsKKworCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKKworCXBId0RhdGEtPkJlYWNvblBlcmlvZCA9IGJlYWNvbl9wZXJpb2Q7CisJdG1wID0gcEh3RGF0YS0+QmVhY29uUGVyaW9kIDw8IDE2OworCXRtcCB8PSBwSHdEYXRhLT5Qcm9iZURlbGF5OworCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg0OCwgdG1wICk7Cit9CisKKworc3RhdGljIHZvaWQgaGFsX3NldF9jdXJyZW50X2NoYW5uZWxfZXgoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBjaGFubmVsICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKQorCQlyZXR1cm47CisKKwlwcmludGsoIkdvaW5nIHRvIGNoYW5uZWw6ICVkLyVkXG4iLCBjaGFubmVsLmJhbmQsIGNoYW5uZWwuQ2hhbk5vKTsKKworCVJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggcEh3RGF0YSwgY2hhbm5lbCApOy8vIFN3aXRjaCBjaGFubmVsCisJcEh3RGF0YS0+Q2hhbm5lbCA9IGNoYW5uZWwuQ2hhbk5vOworCXBId0RhdGEtPmJhbmQgPSBjaGFubmVsLmJhbmQ7CisJI2lmZGVmIF9QRV9TVEFURV9EVU1QXworCVdCREVCVUcoKCJTZXQgY2hhbm5lbCBpcyAlZCwgYmFuZCA9JWRcbiIsIHBId0RhdGEtPkNoYW5uZWwsIHBId0RhdGEtPmJhbmQpKTsKKwkjZW5kaWYKKwlyZWctPk0yOF9NYWNDb250cm9sICY9IH4weGZmOyAvLyBDbGVhbiBjaGFubmVsIGluZm9ybWF0aW9uIGZpZWxkCisJcmVnLT5NMjhfTWFjQ29udHJvbCB8PSBjaGFubmVsLkNoYW5ObzsKKwlXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoIHBId0RhdGEsIDB4MDgyOCwgcmVnLT5NMjhfTWFjQ29udHJvbCwKKwkJCQkJKHM4ICopJmNoYW5uZWwsIHNpemVvZihDaGFuSW5mbykpOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgaGFsX3NldF9jdXJyZW50X2NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBjaGFubmVsICkKK3sKKwloYWxfc2V0X2N1cnJlbnRfY2hhbm5lbF9leCggcEh3RGF0YSwgY2hhbm5lbCApOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47CisKKwlyZWctPk0wMF9NYWNDb250cm9sICY9IH4weDAyMDAwMDAwOy8vVGhlIEhXIHZhbHVlCisKKwlpZiAoZW5hYmxlKQorCQlyZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDIwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKKworCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcmVnLT5NMDBfTWFjQ29udHJvbCApOworfQorCisvL2ZvciB3ZXAga2V5IGVycm9yIGRldGVjdGlvbiwgd2UgbmVlZCB0byBhY2NlcHQgYnJvYWRjYXN0IHBhY2tldHMgdG8gYmUgcmVjZWl2ZWQgdGVtcG9yYXJ5Lgordm9pZCBoYWxfc2V0X2FjY2VwdF9wcm9taXNjdW91cyggcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkgcmV0dXJuOworCWlmIChlbmFibGUpIHsKKwkJcmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDAwNDAwMDAwOworCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHJlZy0+TTAwX01hY0NvbnRyb2wgKTsKKwl9IGVsc2UgeworCQlyZWctPk0wMF9NYWNDb250cm9sJj1+MHgwMDQwMDAwMDsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCByZWctPk0wMF9NYWNDb250cm9sICk7CisJfQorfQorCit2b2lkIGhhbF9zZXRfYWNjZXB0X211bHRpY2FzdCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCisJaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOworCisJcmVnLT5NMDBfTWFjQ29udHJvbCAmPSB+MHgwMTAwMDAwMDsvL1RoZSBIVyB2YWx1ZQorCWlmIChlbmFibGUpICByZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDEwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKKwlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHJlZy0+TTAwX01hY0NvbnRyb2wgKTsKK30KKwordm9pZCBoYWxfc2V0X2FjY2VwdF9iZWFjb24oICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKKworCS8vIDIwMDQwMTA4IGRlYnVnCisJaWYoICFlbmFibGUgKS8vRHVlIHRvIFNNRSBhbmQgTUxNRSBhcmUgbm90IHN1aXRhYmxlIGZvciAzNQorCQlyZXR1cm47CisKKwlyZWctPk0wMF9NYWNDb250cm9sICY9IH4weDA0MDAwMDAwOy8vVGhlIEhXIHZhbHVlCisJaWYoIGVuYWJsZSApCisJCXJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwNDAwMDAwMDsvL1RoZSBIVyB2YWx1ZQorCisJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCByZWctPk0wMF9NYWNDb250cm9sICk7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGhhbF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlwSHdEYXRhLT5XYjM1UngucnhfaGFsdCA9IDE7CisJV2IzNVJ4X3N0b3AoIHBId0RhdGEgKTsKKworCXBId0RhdGEtPldiMzVUeC50eF9oYWx0ID0gMTsKKwlXYjM1VHhfc3RvcCggcEh3RGF0YSApOworCisJcmVnLT5EMDBfRG1hQ29udHJvbCAmPSB+MHhjMDAwMDAwMDsvL1R4IE9mZiwgUnggT2ZmCisJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwNDAwLCByZWctPkQwMF9EbWFDb250cm9sICk7Cit9CisKK3Vuc2lnbmVkIGNoYXIgaGFsX2lkbGUocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlQV0JVU0IJcFdiVXNiID0gJnBId0RhdGEtPldiVXNiOworCisJaWYoICFwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSAmJiAoIHBXYlVzYi0+RGV0ZWN0Q291bnQgfHwgcmVnLT5FUDB2bV9zdGF0ZSE9Vk1fU1RPUCApICkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdm9pZCBoYWxfc2V0X3BoeV90eXBlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggUGh5VHlwZSApCiB7CiAJcEh3RGF0YS0+cGh5X3R5cGUgPSBQaHlUeXBlOwogfQogCi12b2lkIGhhbF9nZXRfcGh5X3R5cGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqUGh5VHlwZSApCi17Ci0JKlBoeVR5cGUgPSBwSHdEYXRhLT5waHlfdHlwZTsKLX0KLQotdm9pZCBoYWxfcmVzZXRfY291bnRlciggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50ID0gMDsKLQlwSHdEYXRhLT5kdG9fdHhfZnJhZ19jb3VudCA9IDA7Ci0JbWVtc2V0KCBwSHdEYXRhLT50eF9yZXRyeV9jb3VudCwgMCwgOCk7Ci19Ci0KIHZvaWQgaGFsX3NldF9yYWRpb19tb2RlKCBwaHdfZGF0YV90IHBId0RhdGEsICB1bnNpZ25lZCBjaGFyIHJhZGlvX29mZikKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAogCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKIAogCWlmIChyYWRpb19vZmYpCS8vZGlzYWJsZSBCYXNlYmFuZCByZWNlaXZlIG9mZgogCXsKIAkJcEh3RGF0YS0+Q3VycmVudFJhZGlvU3cgPSAxOyAvLyBvZmYKLQkJcFdiMzVSZWctPk0yNF9NYWNDb250cm9sICY9IDB4ZmZmZmZmYmY7CisJCXJlZy0+TTI0X01hY0NvbnRyb2wgJj0gMHhmZmZmZmZiZjsKIAl9CiAJZWxzZQogCXsKIAkJcEh3RGF0YS0+Q3VycmVudFJhZGlvU3cgPSAwOyAvLyBvbgotCQlwV2IzNVJlZy0+TTI0X01hY0NvbnRyb2wgfD0gMHgwMDAwMDA0MDsKKwkJcmVnLT5NMjRfTWFjQ29udHJvbCB8PSAweDAwMDAwMDQwOwogCX0KLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MjQsIHBXYjM1UmVnLT5NMjRfTWFjQ29udHJvbCApOworCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgyNCwgcmVnLT5NMjRfTWFjQ29udHJvbCApOwogfQogCiB1OCBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAotCWlmICgocFdiMzVSZWctPkJCMkMgJiBCSVQoMTEpKSA9PSAwKQorCWlmICgocmVnLT5CQjJDICYgQklUKDExKSkgPT0gMCkKIAkJcmV0dXJuIDA7CiAJZWxzZQogCQlyZXR1cm4gMTsKIH0KIAotdm9pZCBoYWxfc2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBudW1iZXIgKQotewotCi0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmIChudW1iZXIgPT0gMSkgewotCQlwV2IzNVJlZy0+QkIyQyB8PSBCSVQoMTEpOwotCX0gZWxzZSB7Ci0JCXBXYjM1UmVnLT5CQjJDICY9IH5CSVQoMTEpOwotCX0KLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMmMsIHBXYjM1UmVnLT5CQjJDICk7Ci0jaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JV0JERUJVRygoIkN1cnJlbnQgYW50ZW5uYSBudW1iZXIgOiAlZFxuIiwgbnVtYmVyKSk7Ci0jZW5kaWYKLX0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLzAgOiByYWRpbyBvbjsgMTogcmFkaW8gb2ZmCiB1OCBoYWxfZ2V0X2h3X3JhZGlvX29mZiggIHBod19kYXRhX3QgcEh3RGF0YSApCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAKIAlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm4gMTsKIAogCS8vcmVhZCB0aGUgYml0MTYgb2YgcmVnaXN0ZXIgVTFCMAotCVdiMzVSZWdfUmVhZCggcEh3RGF0YSwgMHgzYjAsICZwV2IzNVJlZy0+VTFCMCApOwotCWlmICgocFdiMzVSZWctPlUxQjAgJiAweDAwMDEwMDAwKSkgeworCVdiMzVSZWdfUmVhZCggcEh3RGF0YSwgMHgzYjAsICZyZWctPlUxQjAgKTsKKwlpZiAoKHJlZy0+VTFCMCAmIDB4MDAwMTAwMDApKSB7CiAJCXBId0RhdGEtPkN1cnJlbnRSYWRpb0h3ID0gMTsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlIHsKQEAgLTgyMyw1NiArNTYyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIGhhbF9zY2FuX3N0YXR1c19pbmRpY2F0ZShwaHdfZGF0YV90IHBId0RhdGEsIHVuc2lnbmVkIGNoYXIgSXNPblByb2dyZXNzKQotewotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQlwSHdEYXRhLT5MRURfU2Nhbm5pbmcgPSBJc09uUHJvZ3Jlc3MgPyAxIDogMDsKLX0KLQotdm9pZCBoYWxfc3lzdGVtX3Bvd2VyX2NoYW5nZShwaHdfZGF0YV90IHBId0RhdGEsIHUzMiBQb3dlclN0YXRlKQotewotCWlmKCBQb3dlclN0YXRlICE9IDAgKQotCXsKLQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwotCQlpZiggcEh3RGF0YS0+V2JVc2IuSXNVc2IyMCApCi0JCQloYWxfc3RvcCggcEh3RGF0YSApOwotCX0KLQllbHNlCi0JewotCQlpZiggIXBId0RhdGEtPldiVXNiLklzVXNiMjAgKQotCQkJaGFsX3N0b3AoIHBId0RhdGEgKTsKLQl9Ci19Ci0KLXZvaWQgaGFsX3N1cnByaXNlX3JlbW92ZSggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUEFEQVBURVIgQWRhcHRlciA9IHBId0RhdGEtPkFkYXB0ZXI7Ci0JaWYgKE9TX0FUT01JQ19JTkMoIEFkYXB0ZXIsICZwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZUNvdW50ICkgPT0gMSkgewotCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCVdCREVCVUcoKCJDYWxsaW5nIGhhbF9zdXJwcmlzZV9yZW1vdmVcbiIpKTsKLQkJI2VuZGlmCi0JCU9TX1NUT1AoIEFkYXB0ZXIgKTsKLQl9Ci19Ci0KLXZvaWQgaGFsX3JhdGVfY2hhbmdlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkgLy8gTm90aWZ5IHRoZSBIQUwgcmF0ZSBpcyBjaGFuZ2luZyAyMDA2MDYxMy4xCi17Ci0JUEFEQVBURVIJQWRhcHRlciA9IHBId0RhdGEtPkFkYXB0ZXI7Ci0JdTgJCXJhdGUgPSBDVVJSRU5UX1RYX1JBVEU7Ci0KLQlCQlByb2Nlc3Nvcl9SYXRlQ2hhbmdpbmcoIHBId0RhdGEsIHJhdGUgKTsKLX0KLQogdm9pZCBoYWxfc2V0X3JmX3Bvd2VyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggUG93ZXJJbmRleCkKIHsKIAlSRlN5bnRoZXNpemVyX1NldFBvd2VySW5kZXgoIHBId0RhdGEsIFBvd2VySW5kZXggKTsKIH0KLQotdW5zaWduZWQgY2hhciBoYWxfc2V0X0xFRChwaHdfZGF0YV90IHBId0RhdGEsIHUzMiBNb2RlKSAvLyAyMDA2MTEwOCBmb3IgV1BTIGxlZCBjb250cm9sCi17Ci0JcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMDsKLQlwSHdEYXRhLT5MRURfY29udHJvbCA9IE1vZGU7Ci0JT1NfVElNRVJfU0VUKCAmcEh3RGF0YS0+TEVEVGltZXIsIDEwICk7IC8vIDIwMDYwNjIzCi0JcmV0dXJuIFRSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX2YuaAppbmRleCBlYTk1MzFhLi5lODA1ZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oCkBAIC0xLDI1ICsxLDE5IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRGV2aWNlIHJlbGF0ZWQgaW5jbHVkZQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpZmRlZiBXQl9MSU5VWAotCSNpbmNsdWRlICJsaW51eC93YnVzYl9mLmgiCi0JI2luY2x1ZGUgImxpbnV4L3diMzVyZWdfZi5oIgotCSNpbmNsdWRlICJsaW51eC93YjM1dHhfZi5oIgotCSNpbmNsdWRlICJsaW51eC93YjM1cnhfZi5oIgotI2Vsc2UKLQkjaW5jbHVkZSAid2J1c2JfZi5oIgotCSNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKLQkjaW5jbHVkZSAid2IzNXR4X2YuaCIKLQkjaW5jbHVkZSAid2IzNXJ4X2YuaCIKLSNlbmRpZgorI2luY2x1ZGUgIndiMzVyZWdfZi5oIgorI2luY2x1ZGUgIndiMzV0eF9mLmgiCisjaW5jbHVkZSAid2IzNXJ4X2YuaCIKKworI2luY2x1ZGUgImNvcmUuaCIKIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZ1bmN0aW9uIGRlY2xhcmF0aW9uCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogdm9pZCBoYWxfcmVtb3ZlX21hcHBpbmdfa2V5KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKnBtYWNfYWRkciApOwogdm9pZCBoYWxfcmVtb3ZlX2RlZmF1bHRfa2V5KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyIGluZGV4ICk7Ci11bnNpZ25lZCBjaGFyIGhhbF9zZXRfbWFwcGluZ19rZXkoICBwaHdfZGF0YV90IEFkYXB0ZXIsICB1OCAqcG1hY19hZGRyLCAgdTggbnVsbF9rZXksICB1OCB3ZXBfb24sICB1OCAqcHR4X3RzYywgIHU4ICpwcnhfdHNjLCAgdTgga2V5X3R5cGUsICB1OCBrZXlfbGVuLCAgdTggKnBrZXlfZGF0YSApOwotdW5zaWduZWQgY2hhciBoYWxfc2V0X2RlZmF1bHRfa2V5KCAgcGh3X2RhdGFfdCBBZGFwdGVyLCAgdTggaW5kZXgsICB1OCBudWxsX2tleSwgIHU4IHdlcF9vbiwgIHU4ICpwdHhfdHNjLCAgdTggKnByeF90c2MsICB1OCBrZXlfdHlwZSwgIHU4IGtleV9sZW4sICB1OCAqcGtleV9kYXRhICk7Cit1bnNpZ25lZCBjaGFyIGhhbF9zZXRfbWFwcGluZ19rZXkoICBwaHdfZGF0YV90IGFkYXB0ZXIsICB1OCAqcG1hY19hZGRyLCAgdTggbnVsbF9rZXksICB1OCB3ZXBfb24sICB1OCAqcHR4X3RzYywgIHU4ICpwcnhfdHNjLCAgdTgga2V5X3R5cGUsICB1OCBrZXlfbGVuLCAgdTggKnBrZXlfZGF0YSApOwordW5zaWduZWQgY2hhciBoYWxfc2V0X2RlZmF1bHRfa2V5KCAgcGh3X2RhdGFfdCBhZGFwdGVyLCAgdTggaW5kZXgsICB1OCBudWxsX2tleSwgIHU4IHdlcF9vbiwgIHU4ICpwdHhfdHNjLCAgdTggKnByeF90c2MsICB1OCBrZXlfdHlwZSwgIHU4IGtleV9sZW4sICB1OCAqcGtleV9kYXRhICk7CiB2b2lkIGhhbF9jbGVhcl9hbGxfZGVmYXVsdF9rZXkoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIHZvaWQgaGFsX2NsZWFyX2FsbF9ncm91cF9rZXkoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIHZvaWQgaGFsX2NsZWFyX2FsbF9tYXBwaW5nX2tleSggIHBod19kYXRhX3QgcEh3RGF0YSApOwpAQCAtMjcsMTQgKzIxLDExIEBACiB2b2lkIGhhbF9nZXRfZXRoZXJuZXRfYWRkcmVzcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpjdXJyZW50X2FkZHJlc3MgKTsKIHZvaWQgaGFsX3NldF9ldGhlcm5ldF9hZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKmN1cnJlbnRfYWRkcmVzcyApOwogdm9pZCBoYWxfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKnBldGhlcm5ldF9hZGRyZXNzICk7Ci11bnNpZ25lZCBjaGFyIGhhbF9pbml0X2hhcmR3YXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgUEFEQVBURVIgQWRhcHRlciApOwordTggaGFsX2luaXRfaGFyZHdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogdm9pZCBoYWxfc2V0X3Bvd2VyX3NhdmVfbW9kZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHVuc2lnbmVkIGNoYXIgcG93ZXJfc2F2ZSwgIHVuc2lnbmVkIGNoYXIgd2FrZXVwLCAgdW5zaWduZWQgY2hhciBkdGltICk7CiB2b2lkIGhhbF9nZXRfcG93ZXJfc2F2ZV9tb2RlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgIHU4ICpwaW5fcHdyX3NhdmUgKTsKIHZvaWQgaGFsX3NldF9zbG90X3RpbWUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCB0eXBlICk7CiAjZGVmaW5lIGhhbF9zZXRfYXRpbV93aW5kb3coIF9BLCBfQVRNICkKLXZvaWQgaGFsX3NldF9yYXRlcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpwYnNzX3JhdGVzLCAgdTggbGVuZ3RoLCAgdW5zaWduZWQgY2hhciBiYXNpY19yYXRlX3NldCApOwotI2RlZmluZSBoYWxfc2V0X2Jhc2ljX3JhdGVzKCBfQSwgX1IsIF9MICkgaGFsX3NldF9yYXRlcyggX0EsIF9SLCBfTCwgVFJVRSApCi0jZGVmaW5lIGhhbF9zZXRfb3BfcmF0ZXMoIF9BLCBfUiwgX0wgKSBoYWxfc2V0X3JhdGVzKCBfQSwgX1IsIF9MLCBGQUxTRSApCiB2b2lkIGhhbF9zdGFydF9ic3MoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBtYWNfb3BfbW9kZSApOwogdm9pZCBoYWxfam9pbl9yZXF1ZXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggYnNzX3R5cGUgKTsgLy8gMDpCU1MgU1RBIDE6SUJTUyBTVEEvLwogdm9pZCBoYWxfc3RvcF9zeW5jX2JzcyggIHBod19kYXRhX3QgcEh3RGF0YSApOwpAQCAtNDcsMzkgKzM4LDI1IEBACiB2b2lkIGhhbF9zZXRfY2FwX2luZm8oICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgY2FwYWJpbGl0eV9pbmZvICk7CiB2b2lkIGhhbF9zZXRfc3NpZCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpwc3NpZCwgIHU4IHNzaWRfbGVuICk7CiB2b2lkIGhhbF9zZXRfY3VycmVudF9jaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gY2hhbm5lbCApOwotdm9pZCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbF9leCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIGNoYW5uZWwgKTsKLXZvaWQgaGFsX2dldF9jdXJyZW50X2NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyAqY2hhbm5lbCApOwogdm9pZCBoYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKTsKIHZvaWQgaGFsX3NldF9hY2NlcHRfbXVsdGljYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICk7CiB2b2lkIGhhbF9zZXRfYWNjZXB0X2JlYWNvbiggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApOwotdm9pZCBoYWxfc2V0X211bHRpY2FzdF9hZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKmFkZHJlc3MsICB1OCBudW1iZXIgKTsKLXU4IGhhbF9nZXRfYWNjZXB0X2JlYWNvbiggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfaGFsdCggIHBod19kYXRhX3QgcEh3RGF0YSwgdm9pZCAqcHBhX2RhdGEgKTsKIHZvaWQgaGFsX3N0YXJ0X3R4MCggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfc2V0X3BoeV90eXBlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggUGh5VHlwZSApOwotdm9pZCBoYWxfZ2V0X3BoeV90eXBlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKlBoeVR5cGUgKTsKLXVuc2lnbmVkIGNoYXIgaGFsX3Jlc2V0X2hhcmR3YXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdm9pZCogcHBhICk7Ci12b2lkIGhhbF9zZXRfY3dtaW4oICBwaHdfZGF0YV90IHBId0RhdGEsICB1OAljd2luX21pbiApOwogI2RlZmluZSBoYWxfZ2V0X2N3bWluKCBfQSApICggKF9BKS0+Y3dtaW4gKQogdm9pZCBoYWxfc2V0X2N3bWF4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGN3aW5fbWF4ICk7CiAjZGVmaW5lIGhhbF9nZXRfY3dtYXgoIF9BICkgKCAoX0EpLT5jd21heCApCiB2b2lkIGhhbF9zZXRfcnNuX3dwYSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiAqIFJTTl9JRV9CaXRtYXAgLCB1MzIgKiBSU05fT1VJX3R5cGUgLCB1bnNpZ25lZCBjaGFyIGJEZXNpcmVkQXV0aE1vZGUpOwotLy9zMzIgaGFsX2dldF9yc3NpKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyIEhhbFJzc2kgKTsKLXMzMiBoYWxfZ2V0X3Jzc2koICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgKkhhbFJzc2lBcnJ5LCAgdTggQ291bnQgKTsKLXMzMiBoYWxfZ2V0X3Jzc2lfYnNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGlkeCwgIHU4IENvdW50ICk7CiB2b2lkIGhhbF9zZXRfY29ubmVjdF9pbmZvKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdW5zaWduZWQgY2hhciBib0Nvbm5lY3QgKTsKIHU4IGhhbF9nZXRfZXN0X3NxMyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IENvdW50ICk7Ci12b2lkIGhhbF9sZWRfY29udHJvbF8xYSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBoYWxfbGVkX2NvbnRyb2woICB2b2lkKiBTMSwgIHBod19kYXRhX3QgcEh3RGF0YSwgIHZvaWQqIFMzLCAgdm9pZCogUzQgKTsKIHZvaWQgaGFsX3NldF9yZl9wb3dlciggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IFBvd2VySW5kZXggKTsgLy8gMjAwNjA2MjEgTW9kaWZ5Ci12b2lkIGhhbF9yZXNldF9jb3VudGVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CiB2b2lkIGhhbF9zZXRfcmFkaW9fbW9kZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHVuc2lnbmVkIGNoYXIgYm9WYWx1ZSk7CiB2b2lkIGhhbF9kZXNjcmlwdG9yX2luZGljYXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgUERFU0NSSVBUT1IgcERlcyApOwogdTggaGFsX2dldF9hbnRlbm5hX251bWJlciggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBoYWxfc2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBudW1iZXIgKTsKIHUzMiBoYWxfZ2V0X2Jzc19wa19jbnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLSNkZWZpbmUgaGFsX2dldF9yZWdpb25fZnJvbV9FRVBST00oIF9BICkgKCAoX0EpLT5XYjM1UmVnLkVFUFJPTVJlZ2lvbiApCisjZGVmaW5lIGhhbF9nZXRfcmVnaW9uX2Zyb21fRUVQUk9NKCBfQSApICggKF9BKS0+cmVnLkVFUFJPTVJlZ2lvbiApCiB2b2lkIGhhbF9zZXRfYWNjZXB0X3Byb21pc2N1b3VzCQkoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUpOwogI2RlZmluZSBoYWxfZ2V0X3R4X2J1ZmZlciggX0EsIF9CICkgV2IzNVR4X2dldF90eF9idWZmZXIoIF9BLCBfQiApCiB1OCBoYWxfZ2V0X2h3X3JhZGlvX29mZgkJCSggIHBod19kYXRhX3QgcEh3RGF0YSApOwpAQCAtODgsMjAgKzY1LDEzIEBACiAjZGVmaW5lIGhhbF9yc3NpX2JvdW5kYXJ5X2hpZ2goIF9BICkgKF9BLT5SU1NJX2hpZ2gpCiAjZGVmaW5lIGhhbF9yc3NpX2JvdW5kYXJ5X2xvdyggX0EgKSAoX0EtPlJTU0lfbG93KQogI2RlZmluZSBoYWxfc2Nhbl9pbnRlcnZhbCggX0EgKQkJKF9BLT5TY2FuX0ludGVydmFsKQotdm9pZCBoYWxfc2Nhbl9zdGF0dXNfaW5kaWNhdGUoICBwaHdfZGF0YV90IHBId0RhdGEsIHU4IHN0YXR1cyk7CS8vIDA6IGNvbXBsZXRlLCAxOiBpbiBwcm9ncmVzcwotdm9pZCBoYWxfc3lzdGVtX3Bvd2VyX2NoYW5nZSggIHBod19kYXRhX3QgcEh3RGF0YSwgdTMyIFBvd2VyU3RhdGUgKTsgLy8gMjAwNTEyMzAgLT1EMCAxPUQxIC4uCi12b2lkIGhhbF9zdXJwcmlzZV9yZW1vdmUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIAogI2RlZmluZSBQSFlfREVCVUcoIG1zZywgYXJncy4uLiApCiAKLQotCi12b2lkIGhhbF9yYXRlX2NoYW5nZSggIHBod19kYXRhX3QgcEh3RGF0YSApOyAvLyBOb3RpZnkgdGhlIEhBTCByYXRlIGlzIGNoYW5naW5nIDIwMDYwNjEzLjEKIHVuc2lnbmVkIGNoYXIgaGFsX2dldF9keHhfcmVnKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IG51bWJlciwgIHUzMiAqIHBWYWx1ZSApOwogdW5zaWduZWQgY2hhciBoYWxfc2V0X2R4eF9yZWcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgbnVtYmVyLCAgdTMyIHZhbHVlICk7CiAjZGVmaW5lIGhhbF9nZXRfdGltZV9jb3VudCggX1AgKQkoX1AtPnRpbWVfY291bnQvMTApCS8vIHJldHVybiAxMDBtcyBjb3VudAogI2RlZmluZSBoYWxfZGV0ZWN0X2Vycm9yKCBfUCApCQkoX1AtPldiVXNiLkRldGVjdENvdW50KQotdW5zaWduZWQgY2hhciBoYWxfc2V0X0xFRCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiBNb2RlICk7IC8vIDIwMDYxMTA4IGZvciBXUFMgbGVkIGNvbnRyb2wKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBUaGUgZm9sbG93IGZ1bmN0aW9uIGlzIHVudXNlZCBmb3IgSVM4OUMzNQpAQCAtMTEzLDcgKzgzLDYgQEAKICNkZWZpbmUgaGFsX2lic3NfZGlzY29ubmVjdChfQSkgaGFsX3N0b3Bfc3luY19ic3MoX0EpCiAjZGVmaW5lIGhhbF9qb2luX3JlcXVlc3Rfc3RvcChfQSkKIHVuc2lnbmVkIGNoYXIJaGFsX2lkbGUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLSNkZWZpbmUgcGFfc3RhbGxfZXhlY3V0aW9uKCBfQSApCS8vT1NfU0xFRVAoIDEgKQogI2RlZmluZSBod19nZXRfY3h4X3JlZyggX0EsIF9CLCBfQyApCiAjZGVmaW5lIGh3X3NldF9jeHhfcmVnKCBfQSwgX0IsIF9DICkKICNkZWZpbmUgaHdfZ2V0X2R4eF9yZWcoIF9BLCBfQiwgX0MgKQloYWxfZ2V0X2R4eF9yZWcoIF9BLCBfQiwgKHUzMiAqKV9DICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaAppbmRleCAyZWUzZjBmLi4yNzZkMmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfcy5oCkBAIC0xLDMgKzEsMTAgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCSEFMX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfV0JIQUxfU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKIC8vWzIwMDQwNzIyIFdLXQogI2RlZmluZSBIQUxfTEVEX1NFVF9NQVNLCQkweDAwMWMJLy8yMDA2MDkwMSBFeHRlbmQKICNkZWZpbmUgSEFMX0xFRF9TRVRfU0hJRlQJCTIKQEAgLTQxNSwxMCArNDIyLDEwIEBACiAvLyBEZXZpY2UgcmVsYXRlZCBpbmNsdWRlCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaW5jbHVkZSAibGludXgvd2J1c2Jfcy5oIgotI2luY2x1ZGUgImxpbnV4L3diMzVyZWdfcy5oIgotI2luY2x1ZGUgImxpbnV4L3diMzV0eF9zLmgiCi0jaW5jbHVkZSAibGludXgvd2IzNXJ4X3MuaCIKKyNpbmNsdWRlICJ3YnVzYl9zLmgiCisjaW5jbHVkZSAid2IzNXJlZ19zLmgiCisjaW5jbHVkZSAid2IzNXR4X3MuaCIKKyNpbmNsdWRlICJ3YjM1cnhfcy5oIgogCiAKIC8vIEZvciBIYWwgdXNpbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00NDIsMTYgKzQ0OSw2IEBACiAJdTMyCUZyYWdDb3VudDsKIAl1MzIJRE1BRml4OyAvL1YxX0RNQV9GSVggVGhlIHZhcmlhYmxlIGNhbiBiZSByZW1vdmVkIGlmIGRyaXZlciB3YW50IHRvIHNhdmUgbWVtIHNwYWNlIGZvciBWMi4KIAotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gRm9yIFVTQiBkcml2ZXIsIGhhbCBuZWVkIG1vcmUgdmFyaWFibGVzLiBEdWUgdG8KLQkvLwkxLiBORElTLVdETSBvcGVyYXRpb24KLQkvLwkyLiBUaGUgU01FLCBNTE1FIGFuZCBPTEQgTURTIG5lZWQgQWRhcHRlciBzdHJ1Y3R1cmUsIGJ1dCB0aGUgZHJpdmVyIHVuZGVyIEhBTCBkb2Vzbid0Ci0JLy8JCWhhdmUgdGhhdCBwYXJhbWV0ZXIgd2hlbiByZWNlaXZpbmcgYW5kIGluZGljYXRpbmcgcGFja2V0LgotCS8vCQlUaGUgTURTIG11c3QgaW5wdXQgdGhlIEFkYXB0ZXIgcG9pbnRlciBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBoYWxfaW5pdF9oYXJkd2FyZS4KLQkvLwkJVGhlIGZ1bmN0aW9uIHVzYWdlIGlzIGRpZmZlcmVudCB0aGFuIFBDSSBkcml2ZXIuCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQl2b2lkKiBBZGFwdGVyOwotCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCS8vIERlZmluaXRpb24gZm9yIE1BQyBhZGRyZXNzCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTA2LDExICs1MDMsMTEgQEAKIAkvLyBWYXJpYWJsZSBmb3IgZWFjaCBtb2R1bGUKIAkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCVdCVVNCCQlXYlVzYjsgLy8gTmVlZCBXYlVzYi5oCi0JV0IzNVJFRwkJV2IzNVJlZzsgLy8gTmVlZCBXYjM1UmVnLmgKKwlzdHJ1Y3Qgd2IzNV9yZWcJcmVnOyAvLyBOZWVkIFdiMzVSZWcuaAogCVdCMzVUWAkJV2IzNVR4OyAvLyBOZWVkIFdiMzVUeC5oCiAJV0IzNVJYCQlXYjM1Ung7IC8vIE5lZWQgV2IzNVJ4LmgKIAotCU9TX1RJTUVSCUxFRFRpbWVyOy8vIEZvciBMRUQKKwlzdHJ1Y3QgdGltZXJfbGlzdAlMRURUaW1lcjsvLyBGb3IgTEVECiAKIAl1MzIJCUxFRHBvaW50Oy8vIEZvciBMRUQKIApAQCAtNTcwLDcgKzU2Nyw3IEBACiAJdTMyCQlSeEJ5dGVDb3VudExhc3Q7CiAJdTMyCQlUeEJ5dGVDb3VudExhc3Q7CiAKLQlzMzIJCVN1cnByaXNlUmVtb3ZlQ291bnQ7CisJYXRvbWljX3QJU3VycHJpc2VSZW1vdmVDb3VudDsKIAogCS8vIEZvciBnbG9iYWwgdGltZXIKIAl1MzIJCXRpbWVfY291bnQ7Ly9USUNLX1RJTUVfMTAwbXMgMSA9IDEwMG1zCkBAIC02MTIsNCArNjA5LDQgQEAKIAl1MzIgICBOdW1SYXRlNTRNOwogfSBIQUxfUkFURSwgKlBIQUxfUkFURTsKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNDVlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDUgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0vLwotLy8gIE1vZHVsZSBOYW1lOgotLy8gICAgd2JsaW51eC5jCi0vLwotLy8gIEFic3RyYWN0OgotLy8gICAgTGludXggcmVsZWF0ZWQgcm91dGluZXMKLS8vCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpbmNsdWRlICJvc19jb21tb24uaCIKLQotdTMyCi1XQkxJTlVYX01lbW9yeUFsbG9jKHZvaWQqICpWaXJ0dWFsQWRkcmVzcywgdTMyIExlbmd0aCkKLXsKLQkqVmlydHVhbEFkZHJlc3MgPSBremFsbG9jKCBMZW5ndGgsIEdGUF9BVE9NSUMgKTsgLy9HRlBfS0VSTkVMIGlzIG5vdCBzdWl0YWJsZQotCi0JaWYgKCpWaXJ0dWFsQWRkcmVzcyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotczMyCi1FbmNhcEF0b21pY0luYyhQQURBUFRFUiBBZGFwdGVyLCB2b2lkKiBwQXRvbWljKQotewotCVBXQkxJTlVYIHBXYkxpbnV4ID0gJkFkYXB0ZXItPldiTGludXg7Ci0JdTMyCWx0bXA7Ci0JdTMyICoJcGx0bXAgPSAodTMyICopcEF0b21pYzsKLQlzcGluX2xvY2tfaXJxKCAmcFdiTGludXgtPkF0b21pY1NwaW5Mb2NrICk7Ci0JKCpwbHRtcCkrKzsKLQlsdG1wID0gKCpwbHRtcCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCAmcFdiTGludXgtPkF0b21pY1NwaW5Mb2NrICk7Ci0JcmV0dXJuIGx0bXA7Ci19Ci0KLXMzMgotRW5jYXBBdG9taWNEZWMoUEFEQVBURVIgQWRhcHRlciwgdm9pZCogcEF0b21pYykKLXsKLQlQV0JMSU5VWCBwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCXUzMglsdG1wOwotCXUzMiAqCXBsdG1wID0gKHUzMiAqKXBBdG9taWM7Ci0Jc3Bpbl9sb2NrX2lycSggJnBXYkxpbnV4LT5BdG9taWNTcGluTG9jayApOwotCSgqcGx0bXApLS07Ci0JbHRtcCA9ICgqcGx0bXApOwotCXNwaW5fdW5sb2NrX2lycSggJnBXYkxpbnV4LT5BdG9taWNTcGluTG9jayApOwotCXJldHVybiBsdG1wOwotfQotCi11bnNpZ25lZCBjaGFyCi1XQkxJTlVYX0luaXRpYWwoUEFEQVBURVIgQWRhcHRlcikKLXsKLQlQV0JMSU5VWCBwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCi0Jc3Bpbl9sb2NrX2luaXQoICZwV2JMaW51eC0+U3BpbkxvY2sgKTsKLQlzcGluX2xvY2tfaW5pdCggJnBXYkxpbnV4LT5BdG9taWNTcGluTG9jayApOwotCXJldHVybiBUUlVFOwotfQotCi12b2lkCi1XQkxpbnV4X1JlY2VpdmVQYWNrZXQoUEFEQVBURVIgQWRhcHRlciwgUFJYTEFZRVIxIHBSeExheWVyMSkKLXsKLQlCVUcoKTsKLX0KLQotCi12b2lkCi1XQkxJTlVYX0dldE5leHRQYWNrZXQoUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMpCi17Ci0JQlVHKCk7Ci19Ci0KLXZvaWQKLVdCTElOVVhfR2V0TmV4dFBhY2tldENvbXBsZXRlZChQQURBUFRFUiBBZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzKQotewotCUJVRygpOwotfQotCi12b2lkCi1XQkxJTlVYX0Rlc3Ryb3koUEFEQVBURVIgQWRhcHRlcikKLXsKLQlXQkxJTlVYX3N0b3AoIEFkYXB0ZXIgKTsKLSNpZmRlZiBfUEVfVVNCX0lOSV9EVU1QXwotCVdCREVCVUcoKCJbdzM1dW5kXSB1bnJlZ2lzdGVyX25ldGRldiFcbiIpKTsKLSNlbmRpZgotfQotCi12b2lkCi1XQkxJTlVYX3N0b3AoICBQQURBUFRFUiBBZGFwdGVyICkKLXsKLQlQV0JMSU5VWAlwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCXN0cnVjdCBza19idWZmICpwU2tiOwotCi0JaWYgKE9TX0FUT01JQ19JTkMoIEFkYXB0ZXIsICZwV2JMaW51eC0+VGhyZWFkQ291bnQgKSA9PSAxKSB7Ci0JCS8vIFNodXRkb3duIG1vZHVsZSBpbW1lZGlhdGVseQotCQlwV2JMaW51eC0+c2h1dGRvd24gPSAxOwotCi0JCXdoaWxlIChwV2JMaW51eC0+c2tiX2FycmF5WyBwV2JMaW51eC0+c2tiX0dldEluZGV4IF0pIHsKLQkJCS8vIFRyeWluZyB0byBmcmVlIHRoZSB1bi1zZW5kaW5nIHBhY2tldAotCQkJcFNrYiA9IHBXYkxpbnV4LT5za2JfYXJyYXlbIHBXYkxpbnV4LT5za2JfR2V0SW5kZXggXTsKLQkJCXBXYkxpbnV4LT5za2JfYXJyYXlbIHBXYkxpbnV4LT5za2JfR2V0SW5kZXggXSA9IE5VTEw7Ci0JCQlpZiggaW5faXJxKCkgKQotCQkJCWRldl9rZnJlZV9za2JfaXJxKCBwU2tiICk7Ci0JCQllbHNlCi0JCQkJZGV2X2tmcmVlX3NrYiggcFNrYiApOwotCi0JCQlwV2JMaW51eC0+c2tiX0dldEluZGV4Kys7Ci0JCQlwV2JMaW51eC0+c2tiX0dldEluZGV4ICU9IFdCTElOVVhfUEFDS0VUX0FSUkFZX1NJWkU7Ci0JCX0KLQotI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQlXQkRFQlVHKCggIlt3MzV1bmRdIFNLQl9SRUxFQVNFIE9LXG4iICkpOwotI2VuZGlmCi0JfQotCi0JT1NfQVRPTUlDX0RFQyggQWRhcHRlciwgJnBXYkxpbnV4LT5UaHJlYWRDb3VudCApOwotfQotCi12b2lkCi1XYldsYW5IYWx0KCAgUEFEQVBURVIgQWRhcHRlciApCi17Ci0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlBZGFwdGVyLT5zTG9jYWxQYXJhLlNodXREb3duZWQgPSBUUlVFOwotCi0JTWRzX0Rlc3Ryb3koIEFkYXB0ZXIgKTsKLQotCS8vIFR1cm4gb2ZmIFJ4IGFuZCBUeCBoYXJkd2FyZSBhYmlsaXR5Ci0JaGFsX3N0b3AoICZBZGFwdGVyLT5zSHdEYXRhICk7Ci0jaWZkZWYgX1BFX1VTQl9JTklfRFVNUF8KLQlXQkRFQlVHKCgiW3czNXVuZF0gSGFsX3N0b3AgTy5LLlxuIikpOwotI2VuZGlmCi0JT1NfU0xFRVAoMTAwMDAwKTsvLyBXYWl0aW5nIElycCBjb21wbGV0ZWQKLQotCS8vIERlc3Ryb3kgdGhlIE5ESVMgbW9kdWxlCi0JV0JMSU5VWF9EZXN0cm95KCBBZGFwdGVyICk7Ci0KLQkvLyBIYWx0IHRoZSBIQUwKLQloYWxfaGFsdCgmQWRhcHRlci0+c0h3RGF0YSwgTlVMTCk7Ci19Ci0KLXVuc2lnbmVkIGNoYXIKLVdiV0xhbkluaXRpYWxpemUoUEFEQVBURVIgQWRhcHRlcikKLXsKLQlwaHdfZGF0YV90CXBId0RhdGE7Ci0JdTgJCSpwTWFjQWRkcjsKLQl1OAkJKnBNYWNBZGRyMjsKLQl1MzIJCUluaXRTdGVwID0gMDsKLQl1OAkJRUVQUk9NX3JlZ2lvbjsKLQl1OAkJSHdSYWRpb09mZjsKLQotCS8vCi0JLy8gU2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciBMaW51eAotCS8vCi0JQWRhcHRlci0+c0xvY2FsUGFyYS5yZWdpb25fSU5GID0gUkVHSU9OX0FVVE87Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5UeFJhdGVNb2RlID0gUkFURV9BVVRPOwotCXBzTE9DQUwtPmJNYWNPcGVyYXRpb25Nb2RlID0gTU9ERV84MDJfMTFfQkc7CS8vIEIvRyBtb2RlCi0JQWRhcHRlci0+TWRzLlR4UlRTVGhyZXNob2xkID0gREVGQVVMVF9SVFNUaHJlc2hvbGQ7Ci0JQWRhcHRlci0+TWRzLlR4RnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsKLQloYWxfc2V0X3BoeV90eXBlKCAmQWRhcHRlci0+c0h3RGF0YSwgUkZfV0JfMjQyXzEgKTsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLk1UVXNpemUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkU7Ci0JcHNMT0NBTC0+YlByZWFtYmxlTW9kZSA9IEFVVE9fTU9ERTsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLlJhZGlvT2ZmU3RhdHVzLmJvU3dSYWRpb09mZiA9IEZBTFNFOwotCXBId0RhdGEgPSAmQWRhcHRlci0+c0h3RGF0YTsKLQloYWxfc2V0X3BoeV90eXBlKCBwSHdEYXRhLCBSRl9ERUNJREVfQllfSU5GICk7Ci0KLQkvLwotCS8vIEluaXRpYWwgZWFjaCBtb2R1bGUgYW5kIHZhcmlhYmxlCi0JLy8KLQlpZiAoIVdCTElOVVhfSW5pdGlhbChBZGFwdGVyKSkgewotI2lmZGVmIF9QRV9VU0JfSU5JX0RVTVBfCi0JCVdCREVCVUcoKCJbdzM1dW5kXVdCTkRJUyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpKTsKLSNlbmRpZgotCQlnb3RvIGVycm9yOwotCX0KLQotCS8vIEluaXRpYWwgU29mdHdhcmUgdmFyaWFibGUKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLlNodXREb3duZWQgPSBGQUxTRTsKLQotCS8vYWRkZWQgYnkgd3MgZm9yIHdlcCBrZXkgZXJyb3IgZGV0ZWN0aW9uCi0JQWRhcHRlci0+c0xvY2FsUGFyYS5iV2VwS2V5RXJyb3I9IEZBTFNFOwotCUFkYXB0ZXItPnNMb2NhbFBhcmEuYlRvU2VsZlBhY2tldFJlY2VpdmVkID0gRkFMU0U7Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5XZXBLZXlEZXRlY3RUaW1lckNvdW50PSAyICogMTAwOyAvLy8gMiBzZWNvbmRzCi0KLQkvLyBJbml0aWFsIFVTQiBoYWwKLQlJbml0U3RlcCA9IDE7Ci0JcEh3RGF0YSA9ICZBZGFwdGVyLT5zSHdEYXRhOwotCWlmICghaGFsX2luaXRfaGFyZHdhcmUocEh3RGF0YSwgQWRhcHRlcikpCi0JCWdvdG8gZXJyb3I7Ci0KLQlFRVBST01fcmVnaW9uID0gaGFsX2dldF9yZWdpb25fZnJvbV9FRVBST00oIHBId0RhdGEgKTsKLQlpZiAoRUVQUk9NX3JlZ2lvbiAhPSBSRUdJT05fQVVUTykKLQkJcHNMT0NBTC0+cmVnaW9uID0gRUVQUk9NX3JlZ2lvbjsKLQllbHNlIHsKLQkJaWYgKHBzTE9DQUwtPnJlZ2lvbl9JTkYgIT0gUkVHSU9OX0FVVE8pCi0JCQlwc0xPQ0FMLT5yZWdpb24gPSBwc0xPQ0FMLT5yZWdpb25fSU5GOwotCQllbHNlCi0JCQlwc0xPQ0FMLT5yZWdpb24gPSBSRUdJT05fVVNBOwkvL2RlZmF1bHQgc2V0dGluZwotCX0KLQotCS8vIEdldCBTb2Z0d2FyZSBzZXR0aW5nIGZsYWcgZnJvbSBoYWwKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLmJvQW50ZW5uYURpdmVyc2l0eSA9IEZBTFNFOwotCWlmIChoYWxfc29mdHdhcmVfc2V0KHBId0RhdGEpICYgMHgwMDAwMDAwMSkKLQkJQWRhcHRlci0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkgPSBUUlVFOwotCi0JLy8KLQkvLyBGb3IgVFMgbW9kdWxlCi0JLy8KLQlJbml0U3RlcCA9IDI7Ci0KLQkvLyBGb3IgTURTIG1vZHVsZQotCUluaXRTdGVwID0gMzsKLQlNZHNfaW5pdGlhbChBZGFwdGVyKTsKLQotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gSW5pdGlhbGl6ZSB0aGUgU01FLCBTQ0FOLCBNTE1FLCBST0FNCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlJbml0U3RlcCA9IDQ7Ci0JSW5pdFN0ZXAgPSA1OwotCUluaXRTdGVwID0gNjsKLQotCS8vIElmIG5vIHVzZXItZGVmaW5lZCBhZGRyZXNzIGluIHRoZSByZWdpc3RyeSwgdXNlIHRoZSBhZGRyZXNzcyAiYnVybmVkIiBvbiB0aGUgTklDIGluc3RlYWQuCi0JcE1hY0FkZHIgPSBBZGFwdGVyLT5zTG9jYWxQYXJhLlRoaXNNYWNBZGRyZXNzOwotCXBNYWNBZGRyMiA9IEFkYXB0ZXItPnNMb2NhbFBhcmEuUGVybWFuZW50QWRkcmVzczsKLQloYWxfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKCBwSHdEYXRhLCBBZGFwdGVyLT5zTG9jYWxQYXJhLlBlcm1hbmVudEFkZHJlc3MgKTsvLyBSZWFkaW5nIGV0aGVybmV0IGFkZHJlc3MgZnJvbSBFRVBST00KLQlpZiAoT1NfTUVNT1JZX0NPTVBBUkUocE1hY0FkZHIsICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLCBNQUNfQUREUl9MRU5HVEggKSkgLy8gSXMgZXF1YWwKLQl7Ci0JCW1lbWNweSggcE1hY0FkZHIsIHBNYWNBZGRyMiwgTUFDX0FERFJfTEVOR1RIICk7Ci0JfSBlbHNlIHsKLQkJLy8gU2V0IHRoZSB1c2VyIGRlZmluZSBNQUMgYWRkcmVzcwotCQloYWxfc2V0X2V0aGVybmV0X2FkZHJlc3MoIHBId0RhdGEsIEFkYXB0ZXItPnNMb2NhbFBhcmEuVGhpc01hY0FkZHJlc3MgKTsKLQl9Ci0KLQkvL2dldCBjdXJyZW50IGFudGVubmEKLQlwc0xPQ0FMLT5iQW50ZW5uYU5vID0gaGFsX2dldF9hbnRlbm5hX251bWJlcihwSHdEYXRhKTsKLSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQlXQkRFQlVHKCgiRHJpdmVyIGluaXQsIGFudGVubmEgbm8gPSAlZFxuIiwgcHNMT0NBTC0+YkFudGVubmFObykpOwotI2VuZGlmCi0JaGFsX2dldF9od19yYWRpb19vZmYoIHBId0RhdGEgKTsKLQotCS8vIFdhaXRpbmcgZm9yIEhBTCBzZXR0aW5nIE9LCi0Jd2hpbGUgKCFoYWxfaWRsZShwSHdEYXRhKSkKLQkJT1NfU0xFRVAoMTAwMDApOwotCi0JTVRPX0luaXQoQWRhcHRlcik7Ci0KLQlId1JhZGlvT2ZmID0gaGFsX2dldF9od19yYWRpb19vZmYoIHBId0RhdGEgKTsKLQlwc0xPQ0FMLT5SYWRpb09mZlN0YXR1cy5ib0h3UmFkaW9PZmYgPSAhIUh3UmFkaW9PZmY7Ci0KLQloYWxfc2V0X3JhZGlvX21vZGUoIHBId0RhdGEsICh1bnNpZ25lZCBjaGFyKShwc0xPQ0FMLT5SYWRpb09mZlN0YXR1cy5ib1N3UmFkaW9PZmYgfHwgcHNMT0NBTC0+UmFkaW9PZmZTdGF0dXMuYm9Id1JhZGlvT2ZmKSApOwotCi0JaGFsX2RyaXZlcl9pbml0X09LKHBId0RhdGEpID0gMTsgLy8gTm90aWZ5IGhhbCB0aGF0IHRoZSBkcml2ZXIgaXMgcmVhZHkgbm93LgotCS8vc2V0IGEgdHggcG93ZXIgZm9yIHJlZmVyZW5jZS4uLi4uCi0vLwlzbWVfc2V0X3R4X3Bvd2VyX2xldmVsKEFkYXB0ZXIsIDEyKTsJRklYTUU/Ci0JcmV0dXJuIFRSVUU7Ci0KLWVycm9yOgotCXN3aXRjaCAoSW5pdFN0ZXApIHsKLQljYXNlIDU6Ci0JY2FzZSA0OgotCWNhc2UgMzogTWRzX0Rlc3Ryb3koIEFkYXB0ZXIgKTsKLQljYXNlIDI6Ci0JY2FzZSAxOiBXQkxJTlVYX0Rlc3Ryb3koIEFkYXB0ZXIgKTsKLQkJaGFsX2hhbHQoIHBId0RhdGEsIE5VTEwgKTsKLQljYXNlIDA6IGJyZWFrOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBXQkxJTlVYX0Nvbm5lY3RTdGF0dXMoUEFEQVBURVIgQWRhcHRlciwgdTMyIGZsYWcpCi17Ci0JUFdCTElOVVgJcFdiTGludXggPSAmQWRhcHRlci0+V2JMaW51eDsKLQotCXBXYkxpbnV4LT5MaW5rU3RhdHVzID0gZmxhZzsgLy8gT1NfRElTQ09OTkVDVEVECW9yICBPU19DT05ORUNURUQKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaAppbmRleCA2ODI0MGM1Li44NjhlODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaApAQCAtMSwyMyArMSwxNiBAQAorI2lmbmRlZiBfX1dCTElOVVhfRl9ICisjZGVmaW5lIF9fV0JMSU5VWF9GX0gKKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJtZHNfcy5oIgorCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIENvcHlyaWdodCAoYykgMTk5Ni0yMDA0IFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgogLy8KIC8vIHdibGludXhfZi5oCiAvLwotdTMyIFdCTElOVVhfTWVtb3J5QWxsb2MoICB2b2lkKiAqVmlydHVhbEFkZHJlc3MsICB1MzIgTGVuZ3RoICk7Ci1zMzIgRW5jYXBBdG9taWNJbmMoICBQQURBUFRFUiBBZGFwdGVyLCAgdm9pZCogcEF0b21pYyApOwotczMyIEVuY2FwQXRvbWljRGVjKCAgUEFEQVBURVIgQWRhcHRlciwgIHZvaWQqIHBBdG9taWMgKTsKLXZvaWQgV0JMaW51eF9SZWNlaXZlUGFja2V0KCAgUEFEQVBURVIgQWRhcHRlciwgIFBSWExBWUVSMSBwUnhMYXllcjEgKTsKLXVuc2lnbmVkIGNoYXIgV0JMSU5VWF9Jbml0aWFsKCAgUEFEQVBURVIgQWRhcHRlciApOwogaW50IHdiMzVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7Ci12b2lkIFdCTElOVVhfR2V0TmV4dFBhY2tldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci12b2lkIFdCTElOVVhfR2V0TmV4dFBhY2tldENvbXBsZXRlZCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci12b2lkIFdCTElOVVhfc3RvcCggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgV0JMSU5VWF9EZXN0cm95KCAgUEFEQVBURVIgQWRhcHRlciApOwogdm9pZCB3YjM1X3NldF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKTsKIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogd2IzNV9uZXRkZXZfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKTsKLXZvaWQgV0JMSU5VWF9zdG9wKCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBXYldsYW5IYWx0KCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBXQkxJTlVYX0Nvbm5lY3RTdGF0dXMoICBQQURBUFRFUiBBZGFwdGVyLCAgdTMyIGZsYWcgKTsKIAotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyYmI0My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyB3YmxpbnV4X3MuaAotLy8KLSNkZWZpbmUgT1NfTUVNT1JZX0FMTE9DKCBfViwgX1MgKQlXQkxJTlVYX01lbW9yeUFsbG9jKCBfViwgX1MgKQotI2RlZmluZSBPU19MSU5LX1NUQVRVUwkJCShBZGFwdGVyLT5XYkxpbnV4LkxpbmtTdGF0dXMgPT0gT1NfQ09OTkVDVEVEKQotI2RlZmluZSBPU19TRVRfU0hVVERPV04oIF9BICkJCV9BLT5XYkxpbnV4LnNodXRkb3duPTEKLSNkZWZpbmUgT1NfU0VUX1JFU1VNRSggX0EgKQkJX0EtPldiTGludXguc2h1dGRvd249MAotI2RlZmluZSBPU19DT05ORUNUX1NUQVRVU19JTkRJQ0FURSggX0EsIF9GICkJCVdCTElOVVhfQ29ubmVjdFN0YXR1cyggX0EsIF9GICkKLSNkZWZpbmUgT1NfRElTQ09OTkVDVEVECTAKLSNkZWZpbmUgT1NfQ09OTkVDVEVECTEKLSNkZWZpbmUgT1NfU1RPUCggX0EgKQlXQkxJTlVYX3N0b3AoIF9BICkKLQotI2RlZmluZSBPU19DVVJSRU5UX1JYX0JZVEUoIF9BICkJCV9BLT5XYkxpbnV4LlJ4Qnl0ZUNvdW50Ci0jZGVmaW5lIE9TX0NVUlJFTlRfVFhfQllURSggX0EgKQkJX0EtPldiTGludXguVHhCeXRlQ291bnQKLSNkZWZpbmUgT1NfRVZFTlRfSU5ESUNBVEUoIF9BLCBfQiwgX0YgKQotI2RlZmluZSBPU19QTUtJRF9TVEFUVVNfRVZFTlQoIF9BICkKLSNkZWZpbmUgT1NfUkVDRUlWRV9QQUNLRVRfSU5ESUNBVEUoIF9BLCBfRCApCQlXQkxpbnV4X1JlY2VpdmVQYWNrZXQoIF9BLCBfRCApCi0jZGVmaW5lIE9TX1JFQ0VJVkVfODAyXzFYX1BBQ0tFVF9JTkRJQ0FURSggX0EsIF9EICkJRUFQX1JlY2VpdmVQYWNrZXQoIF9BLCBfRCApCi0jZGVmaW5lIE9TX0dFVF9QQUNLRVQoIF9BLCBfRCApCQkJCVdCTElOVVhfR2V0TmV4dFBhY2tldCggX0EsIF9EICkKLSNkZWZpbmUgT1NfR0VUX1BBQ0tFVF9DT01QTEVURSggX0EsIF9EICkJV0JMSU5VWF9HZXROZXh0UGFja2V0Q29tcGxldGVkKCBfQSwgX0QgKQotI2RlZmluZSBPU19TRU5EX1JFU1VMVCggX0EsIF9JRCwgX1IgKQotCi0jZGVmaW5lIFdCTElOVVhfUEFDS0VUX0FSUkFZX1NJWkUJKEVUSEVSTkVUX1RYX0RFU0NSSVBUT1JTKjQpCi0KLXR5cGVkZWYgc3RydWN0IF9XQkxJTlVYCi17Ci0Jc3BpbmxvY2tfdAlBdG9taWNTcGluTG9jazsKLQlzcGlubG9ja190CVNwaW5Mb2NrOwotCXUzMglzaHV0ZG93bjsKLQotCU9TX0FUT01JQwlUaHJlYWRDb3VudDsKLQotCXUzMglMaW5rU3RhdHVzOwkJLy8gT1NfRElTQ09OTkVDVEVEIG9yIE9TX0NPTk5FQ1RFRAotCi0JdTMyCVJ4Qnl0ZUNvdW50OwotCXUzMglUeEJ5dGVDb3VudDsKLQotCXN0cnVjdCBza19idWZmICpza2JfYXJyYXlbIFdCTElOVVhfUEFDS0VUX0FSUkFZX1NJWkUgXTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGFja2V0X3JldHVybjsKLQlzMzIJc2tiX1NldEluZGV4OwotCXMzMglza2JfR2V0SW5kZXg7Ci0JczMyCW5ldGlmX3N0YXRlX3N0b3A7IC8vIDE6IHN0b3AgIDA6IG5vcm1hbAotfSBXQkxJTlVYLCAqUFdCTElOVVg7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwM2Y5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CisgKgorICogRGlzdHJpYnV0ZSB1bmRlciBHUEx2Mi4KKyAqLworI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgIm1kc19mLmgiCisjaW5jbHVkZSAibWxtZXR4cnhfZi5oIgorI2luY2x1ZGUgIm10b19mLmgiCisjaW5jbHVkZSAid2JoYWxfZi5oIgorI2luY2x1ZGUgIndibGludXhfZi5oIgorCitNT0RVTEVfQVVUSE9SKCJPcmlnaW5hbCBieTogSmVmZiBMZWU8WVlfTGVlQGlzc2MuY29tLnR3PiBBZGFwdGVkIHRvIDIuNi54IGJ5IENvc3RhbnRpbm8gTGVhbmRybyAoUnhhcnQgRGVza3RvcCkgPGxlX2Nvc3RhbnRpbm9AcGl4YXJ0YXJnZW50aW5hLmNvbS5hcj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVM4OUMzNSA4MDIuMTFiZyBXTEFOIFVTQiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjEiKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHdiMzVfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXtVU0JfREVWSUNFKDB4MDQxNiwgMHgwMDM1KX0sCisJe1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMDEpfSwKKwl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIwNil9LAorCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjE3KX0sCisJe1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMzApfSwKKwl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIzMyl9LAorCXtVU0JfREVWSUNFKDB4MTEzMSwgMHgyMDM1KX0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgd2IzNV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgd2Jzb2Z0X3JhdGVzW10gPSB7CisJeyAuYml0cmF0ZSA9IDEwLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCB3YnNvZnRfY2hhbm5lbHNbXSA9IHsKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgd2Jzb2Z0X2JhbmRfMkdIeiA9IHsKKwkuY2hhbm5lbHMJPSB3YnNvZnRfY2hhbm5lbHMsCisJLm5fY2hhbm5lbHMJPSBBUlJBWV9TSVpFKHdic29mdF9jaGFubmVscyksCisJLmJpdHJhdGVzCT0gd2Jzb2Z0X3JhdGVzLAorCS5uX2JpdHJhdGVzCT0gQVJSQVlfU0laRSh3YnNvZnRfcmF0ZXMpLAorfTsKKworc3RhdGljIGludCB3YnNvZnRfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXByaW50aygid2Jzb2Z0X2FkZCBpbnRlcmZhY2UgY2FsbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2Jzb2Z0X3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJcHJpbnRrKCJ3YnNvZnRfcmVtb3ZlIGludGVyZmFjZSBjYWxsZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCB3YnNvZnRfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCB3YnNvZnRfZ2V0X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YnNvZnRfZ2V0X3R4X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfc3RhdHMgKnN0YXRzKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YnNvZnRfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCisJCQkJICAgICBpbnQgbWNfY291bnQsIHN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0KQoreworCXVuc2lnbmVkIGludCBiaXRfbnIsIG5ld19mbGFnczsKKwl1MzIgbWNfZmlsdGVyWzJdOworCWludCBpOworCisJbmV3X2ZsYWdzID0gMDsKKworCWlmICgqdG90YWxfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpIHsKKwkJbmV3X2ZsYWdzIHw9IEZJRl9QUk9NSVNDX0lOX0JTUzsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gfjA7CisJfSBlbHNlIGlmICgoKnRvdGFsX2ZsYWdzICYgRklGX0FMTE1VTFRJKSB8fCAobWNfY291bnQgPiAzMikpIHsKKwkJbmV3X2ZsYWdzIHw9IEZJRl9BTExNVUxUSTsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gfjA7CisJfSBlbHNlIHsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG1jX2NvdW50OyBpKyspIHsKKwkJCWlmICghbWNsaXN0KQorCQkJCWJyZWFrOworCQkJcHJpbnRrKCJTaG91bGQgY2FsbCBldGhlcl9jcmMgaGVyZVxuIik7CisJCQkvL2JpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjY7CisJCQliaXRfbnIgPSAwOworCisJCQliaXRfbnIgJj0gMHgzRjsKKwkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworCQkJbWNsaXN0ID0gbWNsaXN0LT5uZXh0OworCQl9CisJfQorCisJZGV2LT5mbGFncyAmPSB+SUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUzsKKworCSp0b3RhbF9mbGFncyA9IG5ld19mbGFnczsKK30KKworc3RhdGljIGludCB3YnNvZnRfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCU1MTUVTZW5kRnJhbWUocHJpdiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgRlJBTUVfVFlQRV84MDJfMTFfTUFOQUdFTUVOVCk7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCisKK3N0YXRpYyBpbnQgd2Jzb2Z0X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwlwcml2LT5lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdic29mdF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmRldi0+Y29uZjsKKwlDaGFuSW5mbyBjaDsKKworCXByaW50aygid2Jzb2Z0X2NvbmZpZyBjYWxsZWRcbiIpOworCisJY2guYmFuZCA9IDE7CisJY2guQ2hhbk5vID0gMTsJLyogU2hvdWxkIHVzZSBjaGFubmVsX251bSwgb3Igc29tZXRoaW5nLCBhcyB0aGF0IGlzIGFscmVhZHkgcHJlLXRyYW5zbGF0ZWQgKi8KKworCisJaGFsX3NldF9jdXJyZW50X2NoYW5uZWwoJnByaXYtPnNId0RhdGEsIGNoKTsKKwloYWxfc2V0X2JlYWNvbl9wZXJpb2QoJnByaXYtPnNId0RhdGEsIGNvbmYtPmJlYWNvbl9pbnQpOworLy8JaGFsX3NldF9jYXBfaW5mbygmcHJpdi0+c0h3RGF0YSwgPz8gKTsKKy8vIGhhbF9zZXRfc3NpZChwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqIHBzc2lkLCAgdTggc3NpZF9sZW4pOyA/PworCWhhbF9zZXRfYWNjZXB0X2Jyb2FkY2FzdCgmcHJpdi0+c0h3RGF0YSwgMSk7CisJaGFsX3NldF9hY2NlcHRfcHJvbWlzY3VvdXMoJnByaXYtPnNId0RhdGEsICAxKTsKKwloYWxfc2V0X2FjY2VwdF9tdWx0aWNhc3QoJnByaXYtPnNId0RhdGEsICAxKTsKKwloYWxfc2V0X2FjY2VwdF9iZWFjb24oJnByaXYtPnNId0RhdGEsICAxKTsKKwloYWxfc2V0X3JhZGlvX21vZGUoJnByaXYtPnNId0RhdGEsICAwKTsKKwkvL2hhbF9zZXRfYW50ZW5uYV9udW1iZXIoICBwaHdfZGF0YV90IHBId0RhdGEsIHU4IG51bWJlciApCisJLy9oYWxfc2V0X3JmX3Bvd2VyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggUG93ZXJJbmRleCkKKworCisvLwloYWxfc3RhcnRfYnNzKCZwcml2LT5zSHdEYXRhLCBXTEFOX0JTU1RZUEVfSU5GUkFTVFJVQ1RVUkUpOwk/PworCisvL3ZvaWQgaGFsX3NldF9yYXRlcyhwaHdfZGF0YV90IHBId0RhdGEsIHU4ICogcGJzc19yYXRlcywKKy8vCQkgICB1OCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgYmFzaWNfcmF0ZV9zZXQpCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YnNvZnRfY29uZmlnX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfY29uZiAqY29uZikKK3sKKwlwcmludGsoIndic29mdF9jb25maWdfaW50ZXJmYWNlIGNhbGxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgd2Jzb2Z0X2dldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQoreworCXByaW50aygid2Jzb2Z0X2dldF90c2YgY2FsbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIHdic29mdF9vcHMgPSB7CisJLnR4CQkJPSB3YnNvZnRfdHgsCisJLnN0YXJ0CQkJPSB3YnNvZnRfc3RhcnQsCQkvKiBTdGFydCBjYW4gYmUgcHJldHR5IG11Y2ggZW1wdHkgYXMgd2UgZG8gd2IzNV9od19pbml0KCkgZHVyaW5nIHByb2JlPyAqLworCS5zdG9wCQkJPSB3YnNvZnRfc3RvcCwKKwkuYWRkX2ludGVyZmFjZQkJPSB3YnNvZnRfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZQk9IHdic29mdF9yZW1vdmVfaW50ZXJmYWNlLAorCS5jb25maWcJCQk9IHdic29mdF9jb25maWcsCisJLmNvbmZpZ19pbnRlcmZhY2UJPSB3YnNvZnRfY29uZmlnX2ludGVyZmFjZSwKKwkuY29uZmlndXJlX2ZpbHRlcgk9IHdic29mdF9jb25maWd1cmVfZmlsdGVyLAorCS5nZXRfc3RhdHMJCT0gd2Jzb2Z0X2dldF9zdGF0cywKKwkuZ2V0X3R4X3N0YXRzCQk9IHdic29mdF9nZXRfdHhfc3RhdHMsCisJLmdldF90c2YJCT0gd2Jzb2Z0X2dldF90c2YsCisvLyBjb25mX3R4OiBoYWxfc2V0X2N3bWluKCkvaGFsX3NldF9jd21heDsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdiMzVfaHdfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlwaHdfZGF0YV90CXBId0RhdGE7CisJdTgJCSpwTWFjQWRkcjsKKwl1OAkJKnBNYWNBZGRyMjsKKwl1MzIJCUluaXRTdGVwID0gMDsKKwl1OAkJRUVQUk9NX3JlZ2lvbjsKKwl1OAkJSHdSYWRpb09mZjsKKworCS8vCisJLy8gU2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciBMaW51eAorCS8vCisJcHJpdi0+c0xvY2FsUGFyYS5yZWdpb25fSU5GID0gUkVHSU9OX0FVVE87CisJcHJpdi0+c0xvY2FsUGFyYS5UeFJhdGVNb2RlID0gUkFURV9BVVRPOworCXByaXYtPnNMb2NhbFBhcmEuYk1hY09wZXJhdGlvbk1vZGUgPSBNT0RFXzgwMl8xMV9CRzsJLy8gQi9HIG1vZGUKKwlwcml2LT5NZHMuVHhSVFNUaHJlc2hvbGQgPSBERUZBVUxUX1JUU1RocmVzaG9sZDsKKwlwcml2LT5NZHMuVHhGcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOworCWhhbF9zZXRfcGh5X3R5cGUoICZwcml2LT5zSHdEYXRhLCBSRl9XQl8yNDJfMSApOworCXByaXYtPnNMb2NhbFBhcmEuTVRVc2l6ZSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRTsKKwlwcml2LT5zTG9jYWxQYXJhLmJQcmVhbWJsZU1vZGUgPSBBVVRPX01PREU7CisJcHJpdi0+c0xvY2FsUGFyYS5SYWRpb09mZlN0YXR1cy5ib1N3UmFkaW9PZmYgPSBmYWxzZTsKKwlwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJaGFsX3NldF9waHlfdHlwZSggcEh3RGF0YSwgUkZfREVDSURFX0JZX0lORiApOworCisJLy9hZGRlZCBieSB3cyBmb3Igd2VwIGtleSBlcnJvciBkZXRlY3Rpb24KKwlwcml2LT5zTG9jYWxQYXJhLmJXZXBLZXlFcnJvcj0gZmFsc2U7CisJcHJpdi0+c0xvY2FsUGFyYS5iVG9TZWxmUGFja2V0UmVjZWl2ZWQgPSBmYWxzZTsKKwlwcml2LT5zTG9jYWxQYXJhLldlcEtleURldGVjdFRpbWVyQ291bnQ9IDIgKiAxMDA7IC8vLyAyIHNlY29uZHMKKworCS8vIEluaXRpYWwgVVNCIGhhbAorCUluaXRTdGVwID0gMTsKKwlwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJaWYgKCFoYWxfaW5pdF9oYXJkd2FyZShodykpCisJCWdvdG8gZXJyb3I7CisKKwlFRVBST01fcmVnaW9uID0gaGFsX2dldF9yZWdpb25fZnJvbV9FRVBST00oIHBId0RhdGEgKTsKKwlpZiAoRUVQUk9NX3JlZ2lvbiAhPSBSRUdJT05fQVVUTykKKwkJcHJpdi0+c0xvY2FsUGFyYS5yZWdpb24gPSBFRVBST01fcmVnaW9uOworCWVsc2UgeworCQlpZiAocHJpdi0+c0xvY2FsUGFyYS5yZWdpb25fSU5GICE9IFJFR0lPTl9BVVRPKQorCQkJcHJpdi0+c0xvY2FsUGFyYS5yZWdpb24gPSBwcml2LT5zTG9jYWxQYXJhLnJlZ2lvbl9JTkY7CisJCWVsc2UKKwkJCXByaXYtPnNMb2NhbFBhcmEucmVnaW9uID0gUkVHSU9OX1VTQTsJLy9kZWZhdWx0IHNldHRpbmcKKwl9CisKKwkvLyBHZXQgU29mdHdhcmUgc2V0dGluZyBmbGFnIGZyb20gaGFsCisJcHJpdi0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkgPSBmYWxzZTsKKwlpZiAoaGFsX3NvZnR3YXJlX3NldChwSHdEYXRhKSAmIDB4MDAwMDAwMDEpCisJCXByaXYtPnNMb2NhbFBhcmEuYm9BbnRlbm5hRGl2ZXJzaXR5ID0gdHJ1ZTsKKworCS8vCisJLy8gRm9yIFRTIG1vZHVsZQorCS8vCisJSW5pdFN0ZXAgPSAyOworCisJLy8gRm9yIE1EUyBtb2R1bGUKKwlJbml0U3RlcCA9IDM7CisJTWRzX2luaXRpYWwocHJpdik7CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluaXRpYWxpemUgdGhlIFNNRSwgU0NBTiwgTUxNRSwgUk9BTQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJSW5pdFN0ZXAgPSA0OworCUluaXRTdGVwID0gNTsKKwlJbml0U3RlcCA9IDY7CisKKwkvLyBJZiBubyB1c2VyLWRlZmluZWQgYWRkcmVzcyBpbiB0aGUgcmVnaXN0cnksIHVzZSB0aGUgYWRkcmVzc3MgImJ1cm5lZCIgb24gdGhlIE5JQyBpbnN0ZWFkLgorCXBNYWNBZGRyID0gcHJpdi0+c0xvY2FsUGFyYS5UaGlzTWFjQWRkcmVzczsKKwlwTWFjQWRkcjIgPSBwcml2LT5zTG9jYWxQYXJhLlBlcm1hbmVudEFkZHJlc3M7CisJaGFsX2dldF9wZXJtYW5lbnRfYWRkcmVzcyggcEh3RGF0YSwgcHJpdi0+c0xvY2FsUGFyYS5QZXJtYW5lbnRBZGRyZXNzICk7Ly8gUmVhZGluZyBldGhlcm5ldCBhZGRyZXNzIGZyb20gRUVQUk9NCisJaWYgKG1lbWNtcChwTWFjQWRkciwgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsIE1BQ19BRERSX0xFTkdUSCkgPT0gMCkKKwkJbWVtY3B5KHBNYWNBZGRyLCBwTWFjQWRkcjIsIE1BQ19BRERSX0xFTkdUSCk7CisJZWxzZSB7CisJCS8vIFNldCB0aGUgdXNlciBkZWZpbmUgTUFDIGFkZHJlc3MKKwkJaGFsX3NldF9ldGhlcm5ldF9hZGRyZXNzKHBId0RhdGEsIHByaXYtPnNMb2NhbFBhcmEuVGhpc01hY0FkZHJlc3MpOworCX0KKworCS8vZ2V0IGN1cnJlbnQgYW50ZW5uYQorCXByaXYtPnNMb2NhbFBhcmEuYkFudGVubmFObyA9IGhhbF9nZXRfYW50ZW5uYV9udW1iZXIocEh3RGF0YSk7CisjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCisJV0JERUJVRygoIkRyaXZlciBpbml0LCBhbnRlbm5hIG5vID0gJWRcbiIsIHBzTE9DQUwtPmJBbnRlbm5hTm8pKTsKKyNlbmRpZgorCWhhbF9nZXRfaHdfcmFkaW9fb2ZmKCBwSHdEYXRhICk7CisKKwkvLyBXYWl0aW5nIGZvciBIQUwgc2V0dGluZyBPSworCXdoaWxlICghaGFsX2lkbGUocEh3RGF0YSkpCisJCW1zbGVlcCgxMCk7CisKKwlNVE9fSW5pdChwcml2KTsKKworCUh3UmFkaW9PZmYgPSBoYWxfZ2V0X2h3X3JhZGlvX29mZiggcEh3RGF0YSApOworCXByaXYtPnNMb2NhbFBhcmEuUmFkaW9PZmZTdGF0dXMuYm9Id1JhZGlvT2ZmID0gISFId1JhZGlvT2ZmOworCisJaGFsX3NldF9yYWRpb19tb2RlKCBwSHdEYXRhLCAodW5zaWduZWQgY2hhcikocHJpdi0+c0xvY2FsUGFyYS5SYWRpb09mZlN0YXR1cy5ib1N3UmFkaW9PZmYgfHwgcHJpdi0+c0xvY2FsUGFyYS5SYWRpb09mZlN0YXR1cy5ib0h3UmFkaW9PZmYpICk7CisKKwloYWxfZHJpdmVyX2luaXRfT0socEh3RGF0YSkgPSAxOyAvLyBOb3RpZnkgaGFsIHRoYXQgdGhlIGRyaXZlciBpcyByZWFkeSBub3cuCisJLy9zZXQgYSB0eCBwb3dlciBmb3IgcmVmZXJlbmNlLi4uLi4KKy8vCXNtZV9zZXRfdHhfcG93ZXJfbGV2ZWwocHJpdiwgMTIpOwlGSVhNRT8KKwlyZXR1cm4gdHJ1ZTsKKworZXJyb3I6CisJc3dpdGNoIChJbml0U3RlcCkgeworCWNhc2UgNToKKwljYXNlIDQ6CisJY2FzZSAzOiBNZHNfRGVzdHJveSggcHJpdiApOworCWNhc2UgMjoKKwljYXNlIDE6IGhhbF9oYWx0KCBwSHdEYXRhLCBOVUxMICk7CisJY2FzZSAwOiBicmVhazsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgd2IzNV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlKQoreworCVBXQlVTQgkJcFdiVXNiOworICAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwl1MzIJbHRtcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldjsKKwlpbnQgZXJyOworCisJdXNiX2dldF9kZXYodWRldik7CisKKwkvLyAyMDA2MDYzMC4yIENoZWNrIHRoZSBkZXZpY2UgaWYgaXQgYWxyZWFkeSBiZSBvcGVuZWQKKwllcnIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKCB1ZGV2LCAwICksCisJCQkgICAgICAweDAxLCBVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRXxVU0JfRElSX0lOLAorCQkJICAgICAgMHgwLCAweDQwMCwgJmx0bXAsIDQsIEhaKjEwMCApOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwlsdG1wID0gY3B1X3RvX2xlMzIobHRtcCk7CisJaWYgKGx0bXApIHsgIC8vIElzIGFscmVhZHkgaW5pdGlhbGl6ZWQ/CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCpwcml2KSwgJndic29mdF9vcHMpOworCWlmICghZGV2KQorCQlnb3RvIGVycm9yOworCisJcHJpdiA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5TcGluTG9jayk7CisKKwlwV2JVc2IgPSAmcHJpdi0+c0h3RGF0YS5XYlVzYjsKKwlwV2JVc2ItPnVkZXYgPSB1ZGV2OworCisgICAgICAgIGludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworICAgICAgICBlbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CisKKwlpZiAoZW5kcG9pbnRbMl0ud01heFBhY2tldFNpemUgPT0gNTEyKSB7CisJCXByaW50aygiW3czNXVuZF0gV29ya2luZyBvbiBVU0IgMi4wXG4iKTsKKwkJcFdiVXNiLT5Jc1VzYjIwID0gMTsKKwl9CisKKwlpZiAoIXdiMzVfaHdfaW5pdChkZXYpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3JfZnJlZV9odzsKKwl9CisKKwlTRVRfSUVFRTgwMjExX0RFVihkZXYsICZ1ZGV2LT5kZXYpOworCXsKKwkJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJCXVuc2lnbmVkIGNoYXIJCWRldl9hZGRyW01BWF9BRERSX0xFTl07CisJCWhhbF9nZXRfcGVybWFuZW50X2FkZHJlc3MocEh3RGF0YSwgZGV2X2FkZHIpOworCQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihkZXYsIGRldl9hZGRyKTsKKwl9CisKKwlkZXYtPmV4dHJhX3R4X2hlYWRyb29tID0gMTI7CS8qIEZJWE1FICovCisJZGV2LT5mbGFncyA9IDA7CisKKwlkZXYtPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSAxMDAwOworCWRldi0+cXVldWVzID0gMTsKKworCWRldi0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJndic29mdF9iYW5kXzJHSHo7CisKKwllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX2ZyZWVfaHc7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHByaXYpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfaHc6CisJaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKK2Vycm9yOgorCXVzYl9wdXRfZGV2KHVkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHdiMzVfaHdfaGFsdChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCit7CisJTWRzX0Rlc3Ryb3koIGFkYXB0ZXIgKTsKKworCS8vIFR1cm4gb2ZmIFJ4IGFuZCBUeCBoYXJkd2FyZSBhYmlsaXR5CisJaGFsX3N0b3AoICZhZGFwdGVyLT5zSHdEYXRhICk7CisjaWZkZWYgX1BFX1VTQl9JTklfRFVNUF8KKwlXQkRFQlVHKCgiW3czNXVuZF0gSGFsX3N0b3AgTy5LLlxuIikpOworI2VuZGlmCisJbXNsZWVwKDEwMCk7Ly8gV2FpdGluZyBJcnAgY29tcGxldGVkCisKKwkvLyBIYWx0IHRoZSBIQUwKKwloYWxfaGFsdCgmYWRhcHRlci0+c0h3RGF0YSwgTlVMTCk7Cit9CisKKworc3RhdGljIHZvaWQgd2IzNV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwl3YjM1X2h3X2hhbHQocHJpdik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCXVzYl9wdXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZikpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgd2IzNV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInczNXVuZCIsCisJLmlkX3RhYmxlCT0gd2IzNV90YWJsZSwKKwkucHJvYmUJCT0gd2IzNV9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHdiMzVfZGlzY29ubmVjdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdiMzVfaW5pdCh2b2lkKQoreworCXJldHVybiB1c2JfcmVnaXN0ZXIoJndiMzVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdiMzVfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZ3YjM1X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHdiMzVfaW5pdCk7Cittb2R1bGVfZXhpdCh3YjM1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTkzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYl9zLmgKQEAgLTAsMCArMSwzNyBAQAorLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisvLyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KKy8vCisvLyAgTW9kdWxlIE5hbWU6CisvLyAgICB3YnVzYl9zLmgKKy8vCisvLyAgQWJzdHJhY3Q6CisvLyAgICBMaW51eCBkcml2ZXIuCisvLworLy8gIEF1dGhvcjoKKy8vCisvLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisKKyNpZm5kZWYgX19XSU5CT05EX1dCVVNCX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfV0JVU0JfU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJXX0NPTlRFWFQgLS0KKy8vCisvLyAgVXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIGlvIGlycHMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCBfUldfQ09OVEVYVAoreworCXZvaWQqCQkJcEh3RGF0YTsKKwlzdHJ1Y3QgdXJiCQkqdXJiOworCXZvaWQqCQkJcENhbGxCYWNrRnVuY3Rpb25QYXJhbWV0ZXI7Cit9IFJXX0NPTlRFWFQsICpQUldfQ09OVEVYVDsKKwordHlwZWRlZiBzdHJ1Y3QgX1dCVVNCIHsKKwl1MzIJSXNVc2IyMDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwl1MzIJRGV0ZWN0Q291bnQ7Cit9IFdCVVNCLCAqUFdCVVNCOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9LY29uZmlnCmluZGV4IDI0MjVkODYuLjk5NTliNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZwpAQCAtMSw5ICsxLDkgQEAKIGNvbmZpZyBQUklTTTJfVVNCCi0JdHJpc3RhdGUgIlByaXNtMi41IFVTQiBkcml2ZXIiCi0JZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFVTQgorCXRyaXN0YXRlICJQcmlzbTIuNS8zIFVTQiBkcml2ZXIiCisJZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFVTQiAmJiBXSVJFTEVTU19FWFQKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCi0JICBUaGlzIGlzIHRoZSB3bGFuLW5nIHByaXNtIDIuNSBVU0IgZHJpdmVyIGZvciBhIHdpZGUgcmFuZ2Ugb2YKKwkgIFRoaXMgaXMgdGhlIHdsYW4tbmcgcHJpc20gMi41LzMgVVNCIGRyaXZlciBmb3IgYSB3aWRlIHJhbmdlIG9mCiAJICBvbGQgVVNCIHdpcmVsZXNzIGRldmljZXMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKaW5kZXggNzc3YjUxMS4uNWVkYWM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKQEAgLTEsNyArMSw2IEBACiBvYmotJChDT05GSUdfUFJJU00yX1VTQikgKz0gcHJpc20yX3VzYi5vCi1vYmotJChDT05GSUdfUFJJU00yX1VTQikgKz0gcDgwMjExLm8KIAotcDgwMjExLW9ianMgOj0gcDgwMjExbW9kLm8gXAorcHJpc20yX3VzYi1vYmpzIDo9IHByaXNtMnVzYi5vIFwKIAkJcDgwMjExY29udi5vIFwKIAkJcDgwMjExcmVxLm8gXAogCQlwODAyMTF3ZXAubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9SRUFETUUKaW5kZXggZjUwZTRlYi4uOWMxMGRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL1JFQURNRQpAQCAtMyw2ICszLDUgQEAKIAktIHNwYXJzZSB3YXJuaW5ncwogCS0gTGluZGVudCBjbGVhbnVwcwogCS0gbW92ZSB0byB1c2UgdGhlIGluLWtlcm5lbCB3aXJlbGVzcyBzdGFjawotCS0gcG9zc2libGUgZW5hYmxlIHRoZSBwY21jaWEgYW5kIHBjaSBwb3J0aW9ucyBvZiB0aGUgZHJpdmVyCiAKIFBsZWFzZSBzZW5kIGFsbCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGYzZmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAxOCArMCwwIEBACi0vKiBzcmMvcHJpc20yL2RyaXZlci9oZmEzODR4LmMKLSoKLSogSW1wbGVtZW50cyB0aGUgZnVuY3Rpb25zIG9mIHRoZSBJbnRlcnNpbCBoZmEzODR4IE1BQwotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBsaW51eC13bGFuCi0qCi0qICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKLSogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotKgotKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUwotKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCi0qICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCi0qICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCi0qICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgotKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0qICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0qICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKLSogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKLSogbWFkZSBkaXJlY3RseSB0bzoKLSoKLSogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KLSogaW5mb0BsaW51eC13bGFuLmNvbQotKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5Ci0qIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBwcmlzbTIvaGZhMzg0eAotKiA4MDIuMTEgTUFDIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSBob3N0IGludGVyZmFjZS4KLSoKLSogVGhlIGZ1bmN0aW9ucyBjYW4gYmUgY29uc2lkZXJlZCB0byByZXByZXNlbnQgc2V2ZXJhbCBsZXZlbHMgb2YKLSogYWJzdHJhY3Rpb24uICBUaGUgbG93ZXN0IGxldmVsIGZ1bmN0aW9ucyBhcmUgc2ltcGx5IEMtY2FsbGFibGUgd3JhcHBlcnMKLSogYXJvdW5kIHRoZSByZWdpc3RlciBhY2Nlc3Nlcy4gIFRoZSBuZXh0IGhpZ2hlciBsZXZlbCByZXByZXNlbnRzIEMtY2FsbGFibGUKLSogcHJpc20yIEFQSSBmdW5jdGlvbnMgdGhhdCBtYXRjaCB0aGUgSW50ZXJzaWwgZG9jdW1lbnRhdGlvbiBhcyBjbG9zZWx5Ci0qIGFzIGlzIHJlYXNvbmFibGUuICBUaGUgbmV4dCBoaWdoZXIgbGF5ZXIgaW1wbGVtZW50cyBjb21tb24gc2VxdWVuY2VzCi0qIG9mIGludm9rYXRpb25zIG9mIHRoZSBBUEkgbGF5ZXIgKGUuZy4gd3JpdGUgdG8gYmFwLCBmb2xsb3dlZCBieSBjbWQpLgotKgotKiBDb21tb24gc2VxdWVuY2VzOgotKiBoZmEzODR4X2RydnJfeHh4CUhpZ2hlc3QgbGV2ZWwgYWJzdHJhY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZQotKgkJCWhmYTM4NHggY29kZS4gIFRoZXkgYXJlIGRyaXZlciBkZWZpbmVkIHdyYXBwZXJzCi0qCQkJZm9yIGNvbW1vbiBzZXF1ZW5jZXMuICBUaGVzZSBmdW5jdGlvbnMgZ2VuZXJhbGx5Ci0qCQkJdXNlIHRoZSBzZXJ2aWNlcyBvZiB0aGUgbG93ZXIgbGV2ZWxzLgotKgotKiBoZmEzODR4X2RydnJfeHh4Y29uZmlnICBBbiBleGFtcGxlIG9mIHRoZSBkcnZyIGxldmVsIGFic3RyYWN0aW9uLiBUaGVzZQotKgkJCWZ1bmN0aW9ucyBhcmUgd3JhcHBlcnMgZm9yIHRoZSBSSUQgZ2V0L3NldAotKgkJCXNlcXVlbmNlLiBUaGV5IAljYWxsIGNvcHlfW3RvfGZyb21dX2JhcCgpIGFuZAotKgkJCWNtZF9hY2Nlc3MoKS4JVGhlc2UgZnVuY3Rpb25zIG9wZXJhdGUgb24gdGhlCi0qCQkJUklEcyBhbmQgYnVmZmVycyB3aXRob3V0IHZhbGlkYXRpb24uICBUaGUgY2FsbGVyCi0qCQkJaXMgcmVzcG9uc2libGUgZm9yIHRoYXQuCi0qCi0qIEFQSSB3cmFwcGVyIGZ1bmN0aW9uczoKLSogaGZhMzg0eF9jbWRfeHh4CWZ1bmN0aW9ucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBmL3cgY29tbWFuZHMuCi0qCQkJVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIGVhY2ggY29tbWFuZAotKgkJCWFyZ3VtZW50LCBldmVuIGNvbW1hbmQgYXJndW1lbnRzIHRoYXQgZ2V0IHBhY2tlZAotKgkJCWludG8gc2luZ2xlIHJlZ2lzdGVycy4gIFRoZXNlIGZ1bmN0aW9ucyBfanVzdF8KLSoJCQlpc3N1ZSB0aGUgY29tbWFuZCBieSBzZXR0aW5nIHRoZSBjbWQvcGFybSByZWdzCi0qCQkJJiByZWFkaW5nIHRoZSBzdGF0dXMvcmVzcCByZWdzLiAgQWRkaXRpb25hbAotKgkJCWFjdGl2aXRpZXMgcmVxdWlyZWQgdG8gZnVsbHkgdXNlIGEgY29tbWFuZAotKgkJCShyZWFkL3dyaXRlIGZyb20vdG8gYmFwLCBnZXQvc2V0IGludCBzdGF0dXMgZXRjLikKLSoJCQlhcmUgaW1wbGVtZW50ZWQgc2VwYXJhdGVseS4gIFRoaW5rIG9mIHRoZXNlIGFzCi0qCQkJQy1jYWxsYWJsZSBwcmlzbTIgY29tbWFuZHMuCi0qCi0qIExvd2VzdCBMYXllciBGdW5jdGlvbnM6Ci0qIGhmYTM4NHhfZG9jbWRfeHh4CVRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIHNlcXVlbmNlIHJlcXVpcmVkCi0qCQkJdG8gaXNzdWUgYW55IHByaXNtMiBjb21tYW5kLiAgUHJpbWFyaWx5IHVzZWQgYnkgdGhlCi0qCQkJaGZhMzg0eF9jbWRfeHh4IGZ1bmN0aW9ucy4KLSoKLSogaGZhMzg0eF9iYXBfeHh4CUJBUCByZWFkL3dyaXRlIGFjY2VzcyBmdW5jdGlvbnMuCi0qCQkJTm90ZTogd2UgdXN1YWxseSB1c2UgQkFQMCBmb3Igbm9uLWludGVycnVwdCBjb250ZXh0Ci0qCQkJIGFuZCBCQVAxIGZvciBpbnRlcnJ1cHQgY29udGV4dC4KLSoKLSogaGZhMzg0eF9kbF94eHgJZG93bmxvYWQgcmVsYXRlZCBmdW5jdGlvbnMuCi0qCi0qIERyaXZlciBTdGF0ZSBJc3N1ZXM6Ci0qIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHBhaXJzIG9mIGZ1bmN0aW9ucyB0aGF0IG1hbmFnZSB0aGUKLSogJ2luaXRpYWxpemVkJyBhbmQgJ3J1bm5pbmcnIHN0YXRlcyBvZiB0aGUgaHcvTUFDIGNvbWJvLiAgVGhlIGZvdXIKLSogZnVuY3Rpb25zIGFyZSBjcmVhdGUoKSwgZGVzdHJveSgpLCBzdGFydCgpLCBhbmQgc3RvcCgpLiAgY3JlYXRlKCkKLSogc2V0cyB1cCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhlIGhmYTM4NHhfKgotKiBmdW5jdGlvbnMgYW5kIGRlc3Ryb3koKSBjbGVhbnMgdGhlbSB1cC4gIFRoZSBzdGFydCgpIGZ1bmN0aW9uIGdldHMKLSogdGhlIGFjdHVhbCBoYXJkd2FyZSBydW5uaW5nIGFuZCBlbmFibGVzIHRoZSBpbnRlcnJ1cHRzLiAgVGhlIHN0b3AoKQotKiBmdW5jdGlvbiBzaHV0cyB0aGUgaGFyZHdhcmUgZG93bi4gIFRoZSBzZXF1ZW5jZSBzaG91bGQgYmU6Ci0qIGNyZWF0ZSgpCi0qICAuCi0qICAuICBTZWxmIGNvbnRhaW5lZCB0ZXN0IHJvdXRpbmVzIGNhbiBydW4gaGVyZSwgcGFydGljdWxhcmx5Ci0qICAuICBjb3JlcmVzZXQoKSBhbmQgdGVzdF9ob3N0aWYoKS4KLSogIC4KLSogc3RhcnQoKQotKiAgLgotKiAgLiAgRG8gaW50ZXJlc3RpbmcgdGhpbmdzIHcvIHRoZSBoYXJkd2FyZQotKiAgLgotKiBzdG9wKCkKLSogZGVzdHJveSgpCi0qCi0qIE5vdGUgdGhhdCBkZXN0cm95KCkgY2FuIGJlIGNhbGxlZCB3aXRob3V0IGNhbGxpbmcgc3RvcCgpIGZpcnN0LgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogU3lzdGVtIEluY2x1ZGVzICovCi0jZGVmaW5lIFdMQU5fREJWQVIJcHJpc20yX2RlYnVnCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLSNpbmNsdWRlIDxsaW51eC90cXVldWUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jZW5kaWYKLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSApCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KLSNpbmNsdWRlIDxwY21jaWEvZHMuaD4KLSNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+Ci0jZW5kaWYKLQotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkpCi0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCi0KLS8vIFhYWFggI2RlZmluZSBDTURfSVJRCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBQcm9qZWN0IEluY2x1ZGVzICovCi0KLSNpbmNsdWRlICJwODAyMTF0eXBlcy5oIgotI2luY2x1ZGUgInA4MDIxMWhkci5oIgotI2luY2x1ZGUgInA4MDIxMW1nbXQuaCIKLSNpbmNsdWRlICJwODAyMTFjb252LmgiCi0jaW5jbHVkZSAicDgwMjExbXNnLmgiCi0jaW5jbHVkZSAicDgwMjExbmV0ZGV2LmgiCi0jaW5jbHVkZSAicDgwMjExcmVxLmgiCi0jaW5jbHVkZSAicDgwMjExbWV0YWRlZi5oIgotI2luY2x1ZGUgInA4MDIxMW1ldGFzdHJ1Y3QuaCIKLSNpbmNsdWRlICJoZmEzODR4LmgiCi0jaW5jbHVkZSAicHJpc20ybWdtdC5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgQ29uc3RhbnRzICovCi0KLXN0YXRpYyBjb25zdCBVSU5UMTYgY3JjMTZ0YWJbMjU2XSA9Ci17Ci0JMHgwMDAwLCAweGMwYzEsIDB4YzE4MSwgMHgwMTQwLCAweGMzMDEsIDB4MDNjMCwgMHgwMjgwLCAweGMyNDEsCi0JMHhjNjAxLCAweDA2YzAsIDB4MDc4MCwgMHhjNzQxLCAweDA1MDAsIDB4YzVjMSwgMHhjNDgxLCAweDA0NDAsCi0JMHhjYzAxLCAweDBjYzAsIDB4MGQ4MCwgMHhjZDQxLCAweDBmMDAsIDB4Y2ZjMSwgMHhjZTgxLCAweDBlNDAsCi0JMHgwYTAwLCAweGNhYzEsIDB4Y2I4MSwgMHgwYjQwLCAweGM5MDEsIDB4MDljMCwgMHgwODgwLCAweGM4NDEsCi0JMHhkODAxLCAweDE4YzAsIDB4MTk4MCwgMHhkOTQxLCAweDFiMDAsIDB4ZGJjMSwgMHhkYTgxLCAweDFhNDAsCi0JMHgxZTAwLCAweGRlYzEsIDB4ZGY4MSwgMHgxZjQwLCAweGRkMDEsIDB4MWRjMCwgMHgxYzgwLCAweGRjNDEsCi0JMHgxNDAwLCAweGQ0YzEsIDB4ZDU4MSwgMHgxNTQwLCAweGQ3MDEsIDB4MTdjMCwgMHgxNjgwLCAweGQ2NDEsCi0JMHhkMjAxLCAweDEyYzAsIDB4MTM4MCwgMHhkMzQxLCAweDExMDAsIDB4ZDFjMSwgMHhkMDgxLCAweDEwNDAsCi0JMHhmMDAxLCAweDMwYzAsIDB4MzE4MCwgMHhmMTQxLCAweDMzMDAsIDB4ZjNjMSwgMHhmMjgxLCAweDMyNDAsCi0JMHgzNjAwLCAweGY2YzEsIDB4Zjc4MSwgMHgzNzQwLCAweGY1MDEsIDB4MzVjMCwgMHgzNDgwLCAweGY0NDEsCi0JMHgzYzAwLCAweGZjYzEsIDB4ZmQ4MSwgMHgzZDQwLCAweGZmMDEsIDB4M2ZjMCwgMHgzZTgwLCAweGZlNDEsCi0JMHhmYTAxLCAweDNhYzAsIDB4M2I4MCwgMHhmYjQxLCAweDM5MDAsIDB4ZjljMSwgMHhmODgxLCAweDM4NDAsCi0JMHgyODAwLCAweGU4YzEsIDB4ZTk4MSwgMHgyOTQwLCAweGViMDEsIDB4MmJjMCwgMHgyYTgwLCAweGVhNDEsCi0JMHhlZTAxLCAweDJlYzAsIDB4MmY4MCwgMHhlZjQxLCAweDJkMDAsIDB4ZWRjMSwgMHhlYzgxLCAweDJjNDAsCi0JMHhlNDAxLCAweDI0YzAsIDB4MjU4MCwgMHhlNTQxLCAweDI3MDAsIDB4ZTdjMSwgMHhlNjgxLCAweDI2NDAsCi0JMHgyMjAwLCAweGUyYzEsIDB4ZTM4MSwgMHgyMzQwLCAweGUxMDEsIDB4MjFjMCwgMHgyMDgwLCAweGUwNDEsCi0JMHhhMDAxLCAweDYwYzAsIDB4NjE4MCwgMHhhMTQxLCAweDYzMDAsIDB4YTNjMSwgMHhhMjgxLCAweDYyNDAsCi0JMHg2NjAwLCAweGE2YzEsIDB4YTc4MSwgMHg2NzQwLCAweGE1MDEsIDB4NjVjMCwgMHg2NDgwLCAweGE0NDEsCi0JMHg2YzAwLCAweGFjYzEsIDB4YWQ4MSwgMHg2ZDQwLCAweGFmMDEsIDB4NmZjMCwgMHg2ZTgwLCAweGFlNDEsCi0JMHhhYTAxLCAweDZhYzAsIDB4NmI4MCwgMHhhYjQxLCAweDY5MDAsIDB4YTljMSwgMHhhODgxLCAweDY4NDAsCi0JMHg3ODAwLCAweGI4YzEsIDB4Yjk4MSwgMHg3OTQwLCAweGJiMDEsIDB4N2JjMCwgMHg3YTgwLCAweGJhNDEsCi0JMHhiZTAxLCAweDdlYzAsIDB4N2Y4MCwgMHhiZjQxLCAweDdkMDAsIDB4YmRjMSwgMHhiYzgxLCAweDdjNDAsCi0JMHhiNDAxLCAweDc0YzAsIDB4NzU4MCwgMHhiNTQxLCAweDc3MDAsIDB4YjdjMSwgMHhiNjgxLCAweDc2NDAsCi0JMHg3MjAwLCAweGIyYzEsIDB4YjM4MSwgMHg3MzQwLCAweGIxMDEsIDB4NzFjMCwgMHg3MDgwLCAweGIwNDEsCi0JMHg1MDAwLCAweDkwYzEsIDB4OTE4MSwgMHg1MTQwLCAweDkzMDEsIDB4NTNjMCwgMHg1MjgwLCAweDkyNDEsCi0JMHg5NjAxLCAweDU2YzAsIDB4NTc4MCwgMHg5NzQxLCAweDU1MDAsIDB4OTVjMSwgMHg5NDgxLCAweDU0NDAsCi0JMHg5YzAxLCAweDVjYzAsIDB4NWQ4MCwgMHg5ZDQxLCAweDVmMDAsIDB4OWZjMSwgMHg5ZTgxLCAweDVlNDAsCi0JMHg1YTAwLCAweDlhYzEsIDB4OWI4MSwgMHg1YjQwLCAweDk5MDEsIDB4NTljMCwgMHg1ODgwLCAweDk4NDEsCi0JMHg4ODAxLCAweDQ4YzAsIDB4NDk4MCwgMHg4OTQxLCAweDRiMDAsIDB4OGJjMSwgMHg4YTgxLCAweDRhNDAsCi0JMHg0ZTAwLCAweDhlYzEsIDB4OGY4MSwgMHg0ZjQwLCAweDhkMDEsIDB4NGRjMCwgMHg0YzgwLCAweDhjNDEsCi0JMHg0NDAwLCAweDg0YzEsIDB4ODU4MSwgMHg0NTQwLCAweDg3MDEsIDB4NDdjMCwgMHg0NjgwLCAweDg2NDEsCi0JMHg4MjAxLCAweDQyYzAsIDB4NDM4MCwgMHg4MzQxLCAweDQxMDAsIDB4ODFjMSwgMHg4MDgxLCAweDQwNDAKLX07Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBNYWNyb3MgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIFR5cGVzICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KLWV4dGVybiBpbnQgcHJpc20yX2RlYnVnOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X2R0aW0od2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X2luZmRyb3Aod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLQotc3RhdGljIHZvaWQgICAgIGhmYTM4NHhfYmFwX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotCi0jaWZkZWYgQ01EX0lSUQotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfY21kKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X3J4bW9uaXRvciggd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJVUlOVDE2IHJ4ZmlkLCBoZmEzODR4X3J4X2ZyYW1lX3QgKnJ4ZGVzYyk7Ci1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9hbGxvYyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotCi1zdGF0aWMgaW50IGhmYTM4NHhfZG9jbWRfd2FpdCggaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCk7Ci0KLXN0YXRpYyBpbnQgaGZhMzg0eF9kbF9kb2NtZF93YWl0KCBoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKTsKLQotc3RhdGljIFVJTlQxNgotaGZhMzg0eF9ta2NyYzE2KFVJTlQ4ICpwLCBpbnQgbGVuKTsKLQotaW50IGhmYTM4NHhfY29weV90b19iYXA0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBiYXAsIFVJTlQxNiBpZCwgVUlOVDE2IG9mZnNldCwKLQkJCSB2b2lkICpidWYsIFVJTlQgbGVuLCB2b2lkKiBidWYyLCBVSU5UIGxlbjIsCi0JCQkgdm9pZCAqYnVmMywgVUlOVCBsZW4zLCB2b2lkKiBidWY0LCBVSU5UIGxlbjQpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KLQotc3RhdGljIFVJTlQxNgotdHhmaWRfcXVldWVfZW1wdHkoaGZhMzg0eF90ICpodykKLXsKLQlyZXR1cm4gKGh3LT50eGZpZF9oZWFkID09IGh3LT50eGZpZF90YWlsKSA/IDEgOiAwOwotfQotCi1zdGF0aWMgVUlOVDE2Ci10eGZpZF9xdWV1ZV9yZW1vdmUoaGZhMzg0eF90ICpodykKLXsKLQlVSU5UMTYgcmVzdWx0PSAwOwotCi0JaWYgKHR4ZmlkX3F1ZXVlX2VtcHR5KGh3KSkgewotCQlXTEFOX0xPR19ERUJVRygzLCJxdWV1ZSBlbXB0eS5cbiIpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGh3LT50eGZpZF9xdWV1ZVtody0+dHhmaWRfaGVhZF07Ci0JCWh3LT50eGZpZF9oZWFkID0gKGh3LT50eGZpZF9oZWFkICsgMSkgJSBody0+dHhmaWRfTjsKLQl9Ci0KLQlyZXR1cm4gKFVJTlQxNilyZXN1bHQ7Ci19Ci0KLXN0YXRpYyBJTlQxNgotdHhmaWRfcXVldWVfYWRkKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwpCi17Ci0JSU5UMTYgcmVzdWx0ID0gMDsKLQotCWlmIChody0+dHhmaWRfaGVhZCA9PSAoKGh3LT50eGZpZF90YWlsICsgMSkgJSBody0+dHhmaWRfTikpIHsKLQkJcmVzdWx0ID0gLTE7Ci0JCVdMQU5fTE9HX0RFQlVHKDMsInF1ZXVlIGZ1bGwuXG4iKTsKLQl9IGVsc2UgewotCQlody0+dHhmaWRfcXVldWVbaHctPnR4ZmlkX3RhaWxdID0gdmFsOwotCQlyZXN1bHQgPSBody0+dHhmaWRfdGFpbDsKLQkJaHctPnR4ZmlkX3RhaWwgPSAoaHctPnR4ZmlkX3RhaWwgKyAxKSAlIGh3LT50eGZpZF9OOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NyZWF0ZQotKgotKiBJbml0aWFsaXplcyB0aGUgaGZhMzg0eF90IGRhdGEgc3RydWN0dXJlIGZvciB1c2UuICBOb3RlIHRoaXMKLSogZG9lcyBfbm90XyBpbnRpYWxpemUgdGhlIGFjdHVhbCBoYXJkd2FyZSwganVzdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzCi0qIHdlIHVzZSB0byBrZWVwIHRyYWNrIG9mIGl0cyBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglpcnEJCWRldmljZSBpcnEgbnVtYmVyCi0qCWlvYmFzZQkJW3BjbWNpYV0gaS9vIGJhc2UgYWRkcmVzcyBmb3IgcmVnaXN0ZXIgYWNjZXNzCi0qCQkJW3BjaV0gemVybwotKgkJCVtwbHhdIGkvbyBiYXNlIGFkZHJlc3MgZm9yIHJlZ2lzdGVyIGFjY2VzcwotKgltZW1iYXNlCQlbcGNtY2lhXSBwY21jaWFfY3MgImxpbmsiIHBvaW50ZXIKLSoJCQlbcGNpXSBtZW1vcnkgYmFzZSBhZGRyZXNzIGZvciByZWdpc3RlciBhY2Nlc3MKLSoJCQlbcGx4XSBtZW1vcnkgYmFzZSBhZGRyZXNzIGZvciBjYXJkIGF0dHJpYnV0ZSBtZW1vcnkKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoZmEzODR4X2NyZWF0ZShoZmEzODR4X3QgKmh3LCBVSU5UIGlycSwgVUlOVDMyIGlvYmFzZSwKLQkJICAgIFVJTlQ4IF9faW9tZW0gKm1lbWJhc2UpCi17Ci0JREJGRU5URVI7Ci0JbWVtc2V0KGh3LCAwLCBzaXplb2YoaGZhMzg0eF90KSk7Ci0JaHctPmlycSA9IGlycTsKLQlody0+aW9iYXNlID0gaW9iYXNlOwotCWh3LT5tZW1iYXNlID0gbWVtYmFzZTsKLQlzcGluX2xvY2tfaW5pdCgmKGh3LT5jbWRsb2NrKSk7Ci0KLQkvKiBCQVAgc2V0dXAgKi8KLSAJc3Bpbl9sb2NrX2luaXQoJihody0+YmFwbG9jaykpOwotCXRhc2tsZXRfaW5pdCgmaHctPmJhcF90YXNrbGV0LAotCQkgICAgIGhmYTM4NHhfYmFwX3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIGh3KTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmh3LT5jbWRxKTsKLQlzZW1hX2luaXQoJmh3LT5pbmZvZmlkX3NlbSwgMSk7Ci0KLSAgICAgICAgaHctPnR4ZmlkX2hlYWQgPSAwOwotICAgICAgICBody0+dHhmaWRfdGFpbCA9IDA7Ci0gICAgICAgIGh3LT50eGZpZF9OID0gSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWDsKLSAgICAgICAgbWVtc2V0KGh3LT50eGZpZF9xdWV1ZSwgMCwgc2l6ZW9mKGh3LT50eGZpZF9xdWV1ZSkpOwotCi0JaHctPmlzcmFtMTYgPSAxOwotCi0JLyogSW5pdCB0aGUgYXV0aCBxdWV1ZSBoZWFkICovCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaHctPmF1dGhxKTsKLQotCUlOSVRfV09SSzIoJmh3LT5saW5rX2JoLCBwcmlzbTJzdGFfcHJvY2Vzc2luZ19kZWZlcik7Ci0KLSAgICAgICAgSU5JVF9XT1JLMigmaHctPmNvbW1zcXVhbF9iaCwgcHJpc20yc3RhX2NvbW1zcXVhbF9kZWZlcik7Ci0KLQlpbml0X3RpbWVyKCZody0+Y29tbXNxdWFsX3RpbWVyKTsKLQlody0+Y29tbXNxdWFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaHc7Ci0JaHctPmNvbW1zcXVhbF90aW1lci5mdW5jdGlvbiA9IHByaXNtMnN0YV9jb21tc3F1YWxfdGltZXI7Ci0KLQlody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVEOwotCWh3LT5zdGF0ZSA9IEhGQTM4NHhfU1RBVEVfSU5JVDsKLQotCURCRkVYSVQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2Rlc3Ryb3kKLSoKLSogUGFydG5lciB0byBoZmEzODR4X2NyZWF0ZSgpLiAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgdGhlIGh3Ci0qIHN0cnVjdHVyZSBzbyB0aGF0IGl0IGNhbiBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGEgc2ltcGxlCi0qIGtmcmVlLiAgQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIGlzIGp1c3QgYSBwbGFjZWhvbGRlci4gIElmLCBhdCBzb21lCi0qIHBvaW50IGluIHRoZSBmdXR1cmUsIGFuIGh3IGluIHRoZSAnc2h1dGRvd24nIHN0YXRlIHJlcXVpcmVzIGEgJ2RlZXAnCi0qIGtmcmVlLCB0aGlzIGlzIHdoZXJlIGl0IHNob3VsZCBiZSBkb25lLiAgTm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24KLSogaXMgY2FsbGVkIG9uIGEgX3J1bm5pbmdfIGh3IHN0cnVjdHVyZSwgdGhlIGRydnJfc3RvcCgpIGZ1bmN0aW9uIGlzCi0qIGNhbGxlZC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIHRvIGZhaWwuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLWhmYTM4NHhfZGVzdHJveSggaGZhMzg0eF90ICpodykKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoIGh3LT5zdGF0ZSA9PSBIRkEzODR4X1NUQVRFX1JVTk5JTkcgKSB7Ci0JCWhmYTM4NHhfZHJ2cl9zdG9wKGh3KTsKLQl9Ci0JaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9QUkVJTklUOwotCi0JaWYgKGh3LT5zY2FucmVzdWx0cykgewotCQlrZnJlZShody0+c2NhbnJlc3VsdHMpOwotCQlody0+c2NhbnJlc3VsdHMgPSBOVUxMOwotCX0KLQotICAgICAgICAvKiBOb3cgdG8gY2xlYW4gb3V0IHRoZSBhdXRoIHF1ZXVlICovCi0gICAgICAgIHdoaWxlICggKHNrYiA9IHNrYl9kZXF1ZXVlKCZody0+YXV0aHEpKSApIHsKLSAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIH0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2dldGNvbmZpZwotKgotKiBQZXJmb3JtcyB0aGUgc2VxdWVuY2UgbmVjZXNzYXJ5IHRvIHJlYWQgYSBjb25maWcvaW5mbyBpdGVtLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXJpZAkJY29uZmlnL2luZm8gcmVjb3JkIGlkIChob3N0IG9yZGVyKQotKglidWYJCWhvc3Qgc2lkZSByZWNvcmQgYnVmZmVyLiAgVXBvbiByZXR1cm4gaXQgd2lsbAotKgkJCWNvbnRhaW4gdGhlIGJvZHkgcG9ydGlvbiBvZiB0aGUgcmVjb3JkIChtaW51cyB0aGUKLSoJCQlSSUQgYW5kIGxlbikuCi0qCWxlbgkJYnVmZmVyIGxlbmd0aCAoaW4gYnl0ZXMsIHNob3VsZCBtYXRjaCByZWNvcmQgbGVuZ3RoKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgktRU5PREFUQSAJbGVuZ3RoIG1pc21hdGNoIGJldHdlZW4gYXJndW1lbnQgYW5kIHJldHJpZXZlZAotKgkJCXJlY29yZC4KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKLXsKLQlpbnQgCQlyZXN1bHQgPSAwOwotCURCRkVOVEVSOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfYWNjZXNzKCBodywgMCwgcmlkLCBidWYsIGxlbik7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcKLSoKLSogUGVyZm9ybXMgdGhlIHNlcXVlbmNlIG5lY2Vzc2FyeSB0byB3cml0ZSBhIGNvbmZpZy9pbmZvIGl0ZW0uCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJcmlkCQljb25maWcvaW5mbyByZWNvcmQgaWQgKGluIGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJaG9zdCBzaWRlIHJlY29yZCBidWZmZXIKLSoJbGVuCQlidWZmZXIgbGVuZ3RoIChpbiBieXRlcykKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JREJGRU5URVI7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9hY2Nlc3MoIGh3LCAxLCByaWQsIGJ1ZiwgbGVuKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3JlYWRwZGEKLSoKLSogUGVyZm9ybXMgdGhlIHNlcXVlbmNlIHRvIHJlYWQgdGhlIFBEQSBzcGFjZS4gIE5vdGUgdGhlcmUgaXMgbm8KLSogZHJ2cl93cml0ZXBkYSgpIGZ1bmN0aW9uLiAgV3JpdGluZyBhIFBEQSBpcwotKiBnZW5lcmFsbHkgaW1wbGVtZW50ZWQgYnkgYSBjYWxsaW5nIGNvbXBvbmVudCB2aWEgY2FsbHMgdG8KLSogY21kX2Rvd25sb2FkIGFuZCB3cml0aW5nIHRvIHRoZSBmbGFzaCBkb3dubG9hZCBidWZmZXIgdmlhIHRoZQotKiBhdXggcmVncy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglidWYJCWJ1ZmZlciB0byBzdG9yZSBQREEgaW4KLSoJbGVuCQlidWZmZXIgbGVuZ3RoCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCS1FVElNRU9VVAl0aW1vdXQgd2FpdGluZyBmb3IgdGhlIGNtZCByZWdzIHRvIGJlY29tZQotKgkJCWF2YWlsYWJsZSwgb3Igd2FpdGluZyBmb3IgdGhlIGNvbnRyb2wgcmVnCi0qCQkJdG8gaW5kaWNhdGUgdGhlIEF1eCBwb3J0IGlzIGVuYWJsZWQuCi0qCS1FTk9EQVRBCXRoZSBidWZmZXIgZG9lcyBOT1QgY29udGFpbiBhIHZhbGlkIFBEQS4KLSoJCQlFaXRoZXIgdGhlIGNhcmQgUERBIGlzIGJhZCwgb3IgdGhlIGF1eGRhdGEKLSoJCQlyZWFkcyBhcmUgZ2l2aW5nIHVzIGdhcmJhZ2UuCi0KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkIG9yIG5vbi1jYXJkIGludGVycnVwdC4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCVVJTlQxNgkJKnBkYSA9IGJ1ZjsKLQlpbnQJCXBkYW9rID0gMDsKLQlpbnQJCW1vcmVwZHJzID0gMTsKLQlpbnQJCWN1cnJwZHIgPSAwOwkvKiB3b3JkIG9mZnNldCBvZiB0aGUgY3VycmVudCBwZHIgKi8KLQlpbnQJCWk7Ci0JVUlOVDE2CQlwZHJsZW47CQkvKiBwZHIgbGVuZ3RoIGluIGJ5dGVzLCBob3N0IG9yZGVyICovCi0JVUlOVDE2CQlwZHJjb2RlOwkvKiBwZHIgY29kZSwgaG9zdCBvcmRlciAqLwotCVVJTlQxNgkJY3JjOwotCVVJTlQxNgkJcGRhY3JjOwotCXN0cnVjdCBwZGFsb2MgewotCQlVSU5UMzIJY2FyZGFkZHI7Ci0JCVVJTlQxNglhdXhjdGw7Ci0JfSBwZGFsb2NbXSA9Ci0JewotCQl7IEhGQTM4NDJfUERBX0JBU0UsCQlIRkEzODR4X0FVWF9DVExfTlZ9LAotCQl7IEhGQTM4NDJfUERBX0JBU0UsCQlIRkEzODR4X0FVWF9DVExfRVhURFN9LAotCQl7IEhGQTM4NDFfUERBX0JBU0UsCQlIRkEzODR4X0FVWF9DVExfTlZ9LAotCQl7IEhGQTM4NDFfUERBX0JBU0UsCQlIRkEzODR4X0FVWF9DVExfRVhURFN9LAotCQl7IEhGQTM4NDFfUERBX0JPR1VTX0JBU0UsCUhGQTM4NHhfQVVYX0NUTF9OVn0KLQl9OwotCi0JREJGRU5URVI7Ci0JLyogQ2hlY2sgZm9yIGF1eCBhdmFpbGFibGUgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGh3LCAwKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwiYXV4X2VuYWJsZSgpIGZhaWxlZC4gcmVzdWx0PSVkXG4iLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBSZWFkIHRoZSBwZGEgZnJvbSBlYWNoIGtub3duIGFkZHJlc3MuICAqLwotCWZvciAoIGkgPSAwOyBpIDwgKHNpemVvZihwZGFsb2MpL3NpemVvZihwZGFsb2NbMF0pKTsgaSsrKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKCAzLCAiQ2hlY2tpbmcgUERBQCgweCUwOHgsJXMpXG4iLAotCQkJcGRhbG9jW2ldLmNhcmRhZGRyLAotCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSBIRkEzODR4X0FVWF9DVExfTlYgPwotCQkJIkNUTF9OViIgOiAiQ1RMX0VYVERTIik7Ci0KLQkJLyogQ29weSBidWZzaXplIGJ5dGVzIGZyb20gb3VyIGN1cnJlbnQgcGRhbG9jICovCi0JCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywKLQkJCXBkYWxvY1tpXS5jYXJkYWRkciwKLQkJCXBkYWxvY1tpXS5hdXhjdGwsCi0JCQlidWYsCi0JCQlsZW4pOwotCi0JCS8qIFRlc3QgZm9yIGdhcmJhZ2UgKi8KLQkJLyogVHJhdmVyc2UgdGhlIFBEUiBsaXN0IExvb2tpbmcgZm9yIFBEQS1FTkQgKi8KLQkJcGRhb2sgPSAxOwkvKiBpbnRpYWxseSBhc3N1bWUgZ29vZCAqLwotCQltb3JlcGRycyA9IDE7Ci0JCWN1cnJwZHIgPSAwOwotCQl3aGlsZSAoIHBkYW9rICYmIG1vcmVwZHJzICkgewotCQkJcGRybGVuID0gaGZhMzg0eDJob3N0XzE2KHBkYVtjdXJycGRyXSkgKiAyOwotCQkJcGRyY29kZSA9IGhmYTM4NHgyaG9zdF8xNihwZGFbY3VycnBkcisxXSk7Ci0KLQkJCS8qIFRlc3QgZm9yIGNvbXBsZXRpb24gYXQgRU5EIHJlY29yZCAqLwotCQkJaWYgKCBwZHJjb2RlID09IEhGQTM4NHhfUERSX0VORF9PRl9QREEgKSB7Ci0JCQkJaWYgKCBwZHJsZW4gPT0gNCApIHsKLQkJCQkJbW9yZXBkcnMgPSAwOwotCQkJCQkvKiBDYWxjdWxhdGUgQ1JDLTE2IGFuZCBjb21wYXJlIHRvIFBEQQotCQkJCQkgKiB2YWx1ZS4gIE5vdGUgdGhlIGFkZGl0aW9uIG9mIDIgd29yZHMKLQkJCQkJICogZm9yIEVORFJFQy5sZW4gYW5kIEVORFJFQy5jb2RlCi0JCQkJCSAqIGZpZWxkcy4KLQkJCQkJICovCi0JCQkJCWNyYyA9IGhmYTM4NHhfbWtjcmMxNiggKFVJTlQ4KilwZGEsCi0JCQkJCQkoY3VycnBkciArIDIpICogc2l6ZW9mKFVJTlQxNikpOwotCQkJCQlwZGFjcmMgPWhmYTM4NHgyaG9zdF8xNihwZGFbY3VycnBkcisyXSk7Ci0JCQkJCWlmICggY3JjICE9IHBkYWNyYyApIHsKLQkJCQkJCVdMQU5fTE9HX0RFQlVHKDMsCi0JCQkJCQkiUERBIGNyYyBmYWlsZWQ6IgotCQkJCQkJImNhbGNfY3JjPTB4JTA0eCwiCi0JCQkJCQkicGRyX2NyYz0weCUwNHguXG4iLAotCQkJCQkJY3JjLCBwZGFjcmMpOwotCQkJCQkJcGRhb2sgPSAwOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJV0xBTl9MT0dfREVCVUcoMywKLQkJCQkJIkVORCByZWNvcmQgZGV0ZWN0ZWQgdy8gIgotCQkJCQkibGVuKCVkKSAhPSAyLCBhc3N1bWluZyBiYWQgUERBXG4iLAotCQkJCQlwZHJsZW4pOwotCQkJCQlwZGFvayA9IDA7Ci0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIFRlc3QgdGhlIHJlY29yZCBsZW5ndGggKi8KLQkJCWlmICggcGRybGVuID4gSEZBMzg0eF9QRFJfTEVOX01BWCB8fCBwZHJsZW4gPT0gMCkgewotCQkJCVdMQU5fTE9HX0RFQlVHKDMsCi0JCQkJCSJwZHJsZW4gZm9yIGFkZHJlc3MgIyVkICIKLQkJCQkJImF0ICUjeDolI3g6JWRcbiIsCi0JCQkJCWksIHBkYWxvY1tpXS5jYXJkYWRkciwKLQkJCQkJcGRhbG9jW2ldLmF1eGN0bCwgcGRybGVuKTsKLQkJCQlXTEFOX0xPR19ERUJVRygzLCJwZHJsZW4gaW52YWxpZD0lZFxuIiwKLQkJCQkJcGRybGVuKTsKLQkJCQlwZGFvayA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIE1vdmUgdG8gdGhlIG5leHQgcGRyICovCi0JCQlpZiAoIG1vcmVwZHJzICkgewotCQkJCS8qIG5vdGUgdGhlIGFjY2VzcyB0byBwZGFbXSwgd2UgbmVlZCB3b3JkcyAqLwotCQkJCWN1cnJwZHIgKz0gaGZhMzg0eDJob3N0XzE2KHBkYVtjdXJycGRyXSkgKyAxOwotCQkJCWlmIChjdXJycGRyKnNpemVvZihVSU5UMTYpID4gbGVuKSB7Ci0JCQkJCVdMQU5fTE9HX0RFQlVHKDMsCi0JCQkJCSJEaWRuJ3QgZmluZCBQREFfRU5EIGluIGJ1ZmZlciwgIgotCQkJCQkidHJ5aW5nIG5leHQgbG9jYXRpb24uXG4iKTsKLQkJCQkJcGRhb2sgPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCBwZGFvayApIHsKLQkJCVdMQU5fTE9HX0lORk8oCi0JCQkJIlBEQSBSZWFkIGZyb20gMHglMDh4IGluICVzIHNwYWNlLlxuIiwKLQkJCQlwZGFsb2NbaV0uY2FyZGFkZHIsCi0JCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSAwID8gIkVYVERTIiA6Ci0JCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSAxID8gIk5WIiA6Ci0JCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSAyID8gIlBIWSIgOgotCQkJCXBkYWxvY1tpXS5hdXhjdGwgPT0gMyA/ICJJQ1NSQU0iIDoKLQkJCQkiPGJvZ3VzIGF1eGN0bD4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJlc3VsdCA9IHBkYW9rID8gMCA6IC1FTk9EQVRBOwotCi0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDMsIkZhaWx1cmU6IHBkYSBpcyBub3Qgb2theVxuIik7Ci0JfQotCi0JaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaHcpOwotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBta3BkYV9jcmMKLSoKLSogQ2FsY3VsYXRlcyB0aGUgQ1JDMTYgZm9yIHRoZSBnaXZlbiBQREEgYW5kIGluc2VydHMgdGhlIHZhbHVlCi0qIGludG8gdGhlIGVuZCByZWNvcmQuCi0qCi0qIEFyZ3VtZW50czoKLSoJcGRhCXB0ciB0byB0aGUgUERBIGRhdGEgc3RydWN0dXJlLgotKgotKiBSZXR1cm5zOgotKgkwCS0gc3VjY2VzcwotKgl+MAktIGZhaWx1cmUgKHByb2JhYmx5IGFuIGVycm5vKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgVUlOVDE2Ci1oZmEzODR4X21rY3JjMTYoVUlOVDggKnAsIGludCBsZW4pCi17Ci0JVUlOVDE2CWNyYyA9IDA7Ci0JVUlOVDgJKmxpbSA9IHAgKyBsZW47Ci0KLQl3aGlsZSAocCA8IGxpbSkgewotCQljcmMgPSAoY3JjID4+IDggKSBeIGNyYzE2dGFiWyhjcmMgJiAweGZmKSBeICpwKytdOwotCX0KLQotCXJldHVybiBjcmM7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUKLSoKLSogQmVnaW5zIHRoZSByYW0gZG93bmxvYWQgc3RhdGUuICBDaGVja3MgdG8gc2VlIHRoYXQgd2UncmUgbm90Ci0qIGFscmVhZHkgaW4gYSBkb3dubG9hZCBzdGF0ZSBhbmQgdGhhdCBhIHBvcnQgaXNuJ3QgZW5hYmxlZC4KLSogU2V0cyB0aGUgZG93bmxvYWQgc3RhdGUgYW5kIGNhbGxzIGNtZF9kb3dubG9hZCB3aXRoIHRoZQotKiBFTkFCTEVfVk9MQVRJTEUgc3ViY29tbWFuZCBhbmQgdGhlIGV4ZWFkZHIgYXJndW1lbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZXhlYWRkcgkJdGhlIGNhcmQgZXhlY3V0aW9uIGFkZHJlc3MgdGhhdCB3aWxsIGJlCi0qICAgICAgICAgICAgICAgICAgICAgICBqdW1wZWQgdG8gd2hlbiByYW1kbF9kaXNhYmxlKCkgaXMgY2FsbGVkCi0qCQkJKGhvc3Qgb3JkZXIpLgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGV4ZWFkZHIpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCVVJTlQxNgkJbG93YWRkcjsKLQlVSU5UMTYJCWhpYWRkcjsKLQlpbnQJCWk7Ci0JREJGRU5URVI7Ci0JLyogQ2hlY2sgdGhhdCBhIHBvcnQgaXNuJ3QgYWN0aXZlICovCi0JZm9yICggaSA9IDA7IGkgPCBIRkEzODR4X1BPUlRJRF9NQVg7IGkrKykgewotCQlpZiAoIGh3LT5wb3J0X2VuYWJsZWRbaV0gKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCJDYW4ndCBkb3dubG9hZCB3aXRoIGEgcG9ydCBlbmFibGVkLlxuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgdGhhdCB3ZSdyZSBub3QgYWxyZWFkeSBpbiBhIGRvd25sb2FkIHN0YXRlICovCi0JaWYgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfRElTQUJMRUQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsIkRvd25sb2FkIHN0YXRlIG5vdCBkaXNhYmxlZC5cbiIpOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQXJlIHdlIHN1cHBvc2VkIHRvIGdvIGludG8gZ2VuZXNpcyBtb2RlPyAqLwotCWlmIChleGVhZGRyID09IDB4M2YwMDAwKSB7Ci0JCVVJTlQxNiBpbml0c2VxWzJdID0geyAweGUxMDAsIDB4ZmZhMSB9OwotCQlVSU5UMTYgcmVhZGJ1ZlsyXTsKLQkJVUlOVDggaGNyID0gMHgwZjsgLyogRGVmYXVsdCB0byB4MTYgU1JBTSAqLwotCQlody0+aXNyYW0xNiA9IDE7Ci0KLQkJV0xBTl9MT0dfREVCVUcoMSwgIkRyb3BwaW5nIGludG8gR2VuZXNpcyBtb2RlXG4iKTsKLQotCQkvKiBJc3N1ZSBjYXJkIHJlc2V0IGFuZCBlbmFibGUgYXV4IHBvcnQgKi8KLQkJaGZhMzg0eF9jb3JlcmVzZXQoaHcsIHByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQkgIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAwKTsKLQkJaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMSk7Ci0KLQkJLyogR2VuZXNpcyBzZXQgKi8KLQkJaGZhMzg0eF9jb3B5X3RvX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkgICAgaW5pdHNlcSwgc2l6ZW9mKGluaXRzZXEpKTsKLQotCQloZmEzODR4X2NvcmVyZXNldChodywgcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCSAgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIGhjcik7Ci0KLQkJLyogVmFsaWRhdGUgbWVtb3J5IGNvbmZpZyAqLwotCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCAweDdFMDAzOCwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCSAgICBpbml0c2VxLCBzaXplb2YoaW5pdHNlcSkpOwotCQloZmEzODR4X2NvcHlfZnJvbV9hdXgoaHcsIDB4N0UwMDM4LCBIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCQkJICAgIHJlYWRidWYsIHNpemVvZihpbml0c2VxKSk7Ci0JCVdMQU5fSEVYX0RVTVAoMywgInJlYWRiYWNrIiwgcmVhZGJ1Ziwgc2l6ZW9mKHJlYWRidWYpKTsKLQotCQlpZiAobWVtY21wKGluaXRzZXEsIHJlYWRidWYsIHNpemVvZihyZWFkYnVmKSkpIHsKLQkJCWhjciA9IDB4MWY7IC8qIHg4IFNSQU0gKi8KLQkJCWh3LT5pc3JhbTE2ID0gMDsKLQotCQkJaGZhMzg0eF9jb3B5X3RvX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkJICAgIGluaXRzZXEsIHNpemVvZihpbml0c2VxKSk7Ci0JCQloZmEzODR4X2NvcmVyZXNldChodywgcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCQkgIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCBoY3IpOwotCi0JCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCAweDdFMDAzOCwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCQkgICAgaW5pdHNlcSwgc2l6ZW9mKGluaXRzZXEpKTsKLQkJCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkJICAgIHJlYWRidWYsIHNpemVvZihpbml0c2VxKSk7Ci0JCQlXTEFOX0hFWF9EVU1QKDIsICJyZWFkYmFjayIsIHJlYWRidWYsIHNpemVvZihyZWFkYnVmKSk7Ci0KLQkJCWlmIChtZW1jbXAoaW5pdHNlcSwgcmVhZGJ1Ziwgc2l6ZW9mKHJlYWRidWYpKSkgewotCQkJCVdMQU5fTE9HX0VSUk9SKCJHZW5lc2lzIG1vZGUgZmFpbGVkXG4iKTsKLQkJCQlyZXN1bHQgPSAtMTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCX0KLQotCQkvKiBOb3cgd2UncmUgaW4gZ2VuZXNpcyBtb2RlICovCi0JCWh3LT5kbHN0YXRlID0gSEZBMzg0eF9ETFNUQVRFX0dFTkVTSVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBSZXRyaWV2ZSB0aGUgYnVmZmVyIGxvYyZzaXplIGFuZCB0aW1lb3V0ICovCi0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsCi0JCQkJJihody0+YnVmaW5mbyksIHNpemVvZihody0+YnVmaW5mbykpKSApIHsKLQkJZ290byBkb25lOwotCX0KLQlody0+YnVmaW5mby5wYWdlID0gaGZhMzg0eDJob3N0XzE2KGh3LT5idWZpbmZvLnBhZ2UpOwotCWh3LT5idWZpbmZvLm9mZnNldCA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5vZmZzZXQpOwotCWh3LT5idWZpbmZvLmxlbiA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5sZW4pOwotCWlmICggKHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUsCi0JCQkJJihody0+ZGx0aW1lb3V0KSkpICkgewotCQlnb3RvIGRvbmU7Ci0JfQotCWh3LT5kbHRpbWVvdXQgPSBoZmEzODR4Mmhvc3RfMTYoaHctPmRsdGltZW91dCk7Ci0KLQkvKiBFbmFibGUgdGhlIGF1eCBwb3J0ICovCi0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMCkpICkgewotCQlXTEFOX0xPR19ERUJVRygxLCJBdXggZW5hYmxlIGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIENhbGwgdGhlIGRvd25sb2FkKDEsYWRkcikgZnVuY3Rpb24gKi8KLQlsb3dhZGRyID0gSEZBMzg0eF9BRERSX0NNRF9NS09GRihleGVhZGRyKTsKLQloaWFkZHIgPSAgSEZBMzg0eF9BRERSX0NNRF9NS1BBR0UoZXhlYWRkcik7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9kb3dubG9hZChodywgSEZBMzg0eF9QUk9HTU9ERV9SQU0sCi0JCQlsb3dhZGRyLCBoaWFkZHIsIDApOwotCWlmICggcmVzdWx0ID09IDApIHsKLQkJLyogU2V0IHRoZSBkb3dubG9hZCBzdGF0ZSAqLwotCQlody0+ZGxzdGF0ZSA9IEhGQTM4NHhfRExTVEFURV9SQU1FTkFCTEVEOwotCX0gZWxzZSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsImNtZF9kb3dubG9hZCgweCUwNHgsIDB4JTA0eCkgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLAotCQkJCWxvd2FkZHIsaGlhZGRyLCByZXN1bHQpOwotCQkvKiBEaXNhYmxlICB0aGUgYXV4IHBvcnQgKi8KLQkJaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaHcpOwotCX0KLQotIGRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZQotKgotKiBFbmRzIHRoZSByYW0gZG93bmxvYWQgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KQotewotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgd2UncmUgYWxyZWFkeSBpbiB0aGUgZG93bmxvYWQgc3RhdGUgKi8KLQlpZiAoICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX1JBTUVOQUJMRUQgKSAmJgotCSAgICAgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfR0VORVNJUyApICkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoaHctPmRsc3RhdGUgPT0gSEZBMzg0eF9ETFNUQVRFX0dFTkVTSVMpIHsKLQkJaGZhMzg0eF9jb3JlcmVzZXQoaHcsIHByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQkgIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLAotCQkJCSAgaHctPmlzcmFtMTYgPyAweDA3OiAweDE3KTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIERpc2FibGUgdGhlIGF1eCBwb3J0ICovCi0JaGZhMzg0eF9jbWRfZG93bmxvYWQoaHcsIEhGQTM4NHhfUFJPR01PREVfRElTQUJMRSwgMCwgMCAsIDApOwotCi0gZG9uZToKLQlody0+ZGxzdGF0ZSA9IEhGQTM4NHhfRExTVEFURV9ESVNBQkxFRDsKLQloZmEzODR4X2NtZF9hdXhfZGlzYWJsZShodyk7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUKLSoKLSogUGVyZm9ybXMgYSBSQU0gZG93bmxvYWQgb2YgYSBjaHVuayBvZiBkYXRhLiBGaXJzdCBjaGVja3MgdG8gc2VlCi0qIHRoYXQgd2UncmUgaW4gdGhlIFJBTSBkb3dubG9hZCBzdGF0ZSwgdGhlbiB1c2VzIHRoZSBhdXggZnVuY3Rpb25zCi0qIHRvIDEpIGNvcHkgdGhlIGRhdGEsIDIpIHJlYWRiYWNrIGFuZCBjb21wYXJlLiAgVGhlIGRvd25sb2FkCi0qIHN0YXRlIGlzIHVuYWZmZWN0ZWQuICBXaGVuIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdXNpbmcKLSogdGhpcyBmdW5jdGlvbiwgY2FsbCBkcnZyX3JhbWRsX2Rpc2FibGUoKSB0byBlbmQgdGhlIGRvd25sb2FkIHN0YXRlCi0qIGFuZCByZXN0YXJ0IHRoZSBNQUMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZGFkZHIJCUNhcmQgYWRkcmVzcyB0byB3cml0ZSB0by4gKGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJUHRyIHRvIGRhdGEgdG8gd3JpdGUuCi0qCWxlbgkJTGVuZ3RoIG9mIGRhdGEgKGhvc3Qgb3JkZXIpLgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDgJCSp2ZXJidWY7Ci0JREJGRU5URVI7Ci0JLyogQ2hlY2sgdGhhdCB3ZSdyZSBpbiB0aGUgcmFtIGRvd25sb2FkIHN0YXRlICovCi0JaWYgKCAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9SQU1FTkFCTEVEICkgJiYKLQkgICAgICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0dFTkVTSVMgKSApIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JV0xBTl9MT0dfSU5GTygiV3JpdGluZyAlZCBieXRlcyB0byByYW0gQDB4JTA2eFxuIiwgbGVuLCBkYWRkcik7Ci0jaWYgMAotV0xBTl9IRVhfRFVNUCgxLCAiZGxkYXRhIiwgYnVmLCBsZW4pOwotI2VuZGlmCi0JLyogQ29weSB0aGUgZGF0YSB2aWEgdGhlIGF1eCBwb3J0ICovCi0JaGZhMzg0eF9jb3B5X3RvX2F1eChodywgZGFkZHIsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywgYnVmLCBsZW4pOwotCi0JLyogQ3JlYXRlIGEgYnVmZmVyIGZvciB0aGUgdmVyaWZ5ICovCi0JdmVyYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmICh2ZXJidWYgPT0gTlVMTCApIHJldHVybiAxOwotCi0JLyogUmVhZCBiYWNrIGFuZCBjb21wYXJlICovCi0JaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LCBkYWRkciwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLCB2ZXJidWYsIGxlbik7Ci0KLQlpZiAoIG1lbWNtcChidWYsIHZlcmJ1ZiwgbGVuKSApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwicmFtZGwgdmVyaWZ5IGZhaWxlZCFcbiIpOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCX0KLQotCWtmcmVlX3ModmVyYnVmLCBsZW4pOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlCi0qCi0qIEJlZ2lucyB0aGUgZmxhc2ggZG93bmxvYWQgc3RhdGUuICBDaGVja3MgdG8gc2VlIHRoYXQgd2UncmUgbm90Ci0qIGFscmVhZHkgaW4gYSBkb3dubG9hZCBzdGF0ZSBhbmQgdGhhdCBhIHBvcnQgaXNuJ3QgZW5hYmxlZC4KLSogU2V0cyB0aGUgZG93bmxvYWQgc3RhdGUgYW5kIHJldHJpZXZlcyB0aGUgZmxhc2ggZG93bmxvYWQKLSogYnVmZmVyIGxvY2F0aW9uLCBidWZmZXIgc2l6ZSwgYW5kIHRpbWVvdXQgbGVuZ3RoLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCWludAkJaTsKLQotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgYSBwb3J0IGlzbid0IGFjdGl2ZSAqLwotCWZvciAoIGkgPSAwOyBpIDwgSEZBMzg0eF9QT1JUSURfTUFYOyBpKyspIHsKLQkJaWYgKCBody0+cG9ydF9lbmFibGVkW2ldICkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwiY2FsbGVkIHdoZW4gcG9ydCBlbmFibGVkLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCS8qIENoZWNrIHRoYXQgd2UncmUgbm90IGFscmVhZHkgaW4gYSBkb3dubG9hZCBzdGF0ZSAqLwotCWlmICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0RJU0FCTEVEICkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBSZXRyaWV2ZSB0aGUgYnVmZmVyIGxvYyZzaXplIGFuZCB0aW1lb3V0ICovCi0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsCi0JCQkJJihody0+YnVmaW5mbyksIHNpemVvZihody0+YnVmaW5mbykpKSApIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaHctPmJ1ZmluZm8ucGFnZSA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5wYWdlKTsKLQlody0+YnVmaW5mby5vZmZzZXQgPSBoZmEzODR4Mmhvc3RfMTYoaHctPmJ1ZmluZm8ub2Zmc2V0KTsKLQlody0+YnVmaW5mby5sZW4gPSBoZmEzODR4Mmhvc3RfMTYoaHctPmJ1ZmluZm8ubGVuKTsKLQlpZiAoIChyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX01BWExPQURUSU1FLAotCQkJCSYoaHctPmRsdGltZW91dCkpKSApIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaHctPmRsdGltZW91dCA9IGhmYTM4NHgyaG9zdF8xNihody0+ZGx0aW1lb3V0KTsKLQotCS8qIEVuYWJsZSB0aGUgYXV4IHBvcnQgKi8KLQlpZiAoIChyZXN1bHQgPSBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGh3LCAwKSkgKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JaHctPmRsc3RhdGUgPSBIRkEzODR4X0RMU1RBVEVfRkxBU0hFTkFCTEVEOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZGlzYWJsZQotKgotKiBFbmRzIHRoZSBmbGFzaCBkb3dubG9hZCBzdGF0ZS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgY2F1c2UgdGhlIE1BQwotKiBmaXJtd2FyZSB0byByZXN0YXJ0LgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KQotewotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgd2UncmUgYWxyZWFkeSBpbiB0aGUgZG93bmxvYWQgc3RhdGUgKi8KLQlpZiAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9GTEFTSEVOQUJMRUQgKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFRoZXJlIGlzbid0IG11Y2ggd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQsIHNvIEkgZG9uJ3QgKi8KLQkvKiAgYm90aGVyICB3LyB0aGUgcmV0dXJuIHZhbHVlICovCi0JaGZhMzg0eF9jbWRfZG93bmxvYWQoaHcsIEhGQTM4NHhfUFJPR01PREVfRElTQUJMRSwgMCwgMCAsIDApOwotCWh3LT5kbHN0YXRlID0gSEZBMzg0eF9ETFNUQVRFX0RJU0FCTEVEOwotCi0JLyogRGlzYWJsZSB0aGUgYXV4IHBvcnQgKi8KLQloZmEzODR4X2NtZF9hdXhfZGlzYWJsZShodyk7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZQotKgotKiBQZXJmb3JtcyBhIEZMQVNIIGRvd25sb2FkIG9mIGEgY2h1bmsgb2YgZGF0YS4gRmlyc3QgY2hlY2tzIHRvIHNlZQotKiB0aGF0IHdlJ3JlIGluIHRoZSBGTEFTSCBkb3dubG9hZCBzdGF0ZSwgdGhlbiBzZXRzIHRoZSBkb3dubG9hZAotKiBtb2RlLCB1c2VzIHRoZSBhdXggZnVuY3Rpb25zIHRvIDEpIGNvcHkgdGhlIGRhdGEgdG8gdGhlIGZsYXNoCi0qIGJ1ZmZlciwgMikgc2V0cyB0aGUgZG93bmxvYWQgJ3dyaXRlIGZsYXNoJyBtb2RlLCAzKSByZWFkYmFjayBhbmQKLSogY29tcGFyZS4gIExhdGhlciByaW5zZSwgcmVwZWF0IGFzIG1hbnkgdGltZXMgYW4gbmVjZXNzYXJ5IHRvIGdldAotKiBhbGwgdGhlIGdpdmVuIGRhdGEgaW50byBmbGFzaC4KLSogV2hlbiBhbGwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHVzaW5nIHRoaXMgZnVuY3Rpb24gKHBvc3NpYmx5Ci0qIHJlcGVhdGVkbHkpLCBjYWxsIGRydnJfZmxhc2hkbF9kaXNhYmxlKCkgdG8gZW5kIHRoZSBkb3dubG9hZCBzdGF0ZQotKiBhbmQgcmVzdGFydCB0aGUgTUFDLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWRhZGRyCQlDYXJkIGFkZHJlc3MgdG8gd3JpdGUgdG8uIChob3N0IG9yZGVyKQotKglidWYJCVB0ciB0byBkYXRhIHRvIHdyaXRlLgotKglsZW4JCUxlbmd0aCBvZiBkYXRhIChob3N0IG9yZGVyKS4KLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDgJCSp2ZXJidWY7Ci0JVUlOVDMyCQlkbGJ1ZmFkZHI7Ci0JVUlOVDMyCQljdXJybGVuOwotCVVJTlQzMgkJY3VycmRhZGRyOwotCVVJTlQxNgkJZGVzdGxvOwotCVVJTlQxNgkJZGVzdGhpOwotCWludAkJbndyaXRlczsKLQlpbnQJCWk7Ci0KLQlEQkZFTlRFUjsKLQkvKiBDaGVjayB0aGF0IHdlJ3JlIGluIHRoZSBmbGFzaCBkb3dubG9hZCBzdGF0ZSAqLwotCWlmICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0ZMQVNIRU5BQkxFRCApIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JV0xBTl9MT0dfSU5GTygiRG93bmxvYWQgJWQgYnl0ZXMgdG8gZmxhc2ggQDB4JTA2eFxuIiwgbGVuLCBkYWRkcik7Ci0KLQkvKiBOZWVkIGEgZmxhdCBhZGRyZXNzIGZvciBhcml0aG1ldGljICovCi0JZGxidWZhZGRyID0gSEZBMzg0eF9BRERSX0FVWF9NS0ZMQVQoCi0JCQlody0+YnVmaW5mby5wYWdlLAotCQkJaHctPmJ1ZmluZm8ub2Zmc2V0KTsKLQl2ZXJidWYgPSBrbWFsbG9jKGh3LT5idWZpbmZvLmxlbiwgR0ZQX0tFUk5FTCk7Ci0KLSNpZiAwCi1XTEFOX0xPR19XQVJOSU5HKCJkbGJ1ZkAweCUwNmx4IGxlbj0lZCB0bz0lZFxuIiwgZGxidWZhZGRyLCBody0+YnVmaW5mby5sZW4sIGh3LT5kbHRpbWVvdXQpOwotI2VuZGlmCi0JLyogRmlndXJlIG91dCBob3cgbWFueSB0aW1lcyB0byB0byB0aGUgZmxhc2ggcHJvZyAqLwotCW53cml0ZXMgPSBsZW4gLyBody0+YnVmaW5mby5sZW47Ci0JbndyaXRlcyArPSAobGVuICUgaHctPmJ1ZmluZm8ubGVuKSA/IDEgOiAwOwotCi0JaWYgKCB2ZXJidWYgPT0gTlVMTCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBmbGFzaCB2ZXJpZnkgYnVmZmVyXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qIEZvciBlYWNoICovCi0JZm9yICggaSA9IDA7IGkgPCBud3JpdGVzOyBpKyspIHsKLQkJLyogR2V0IHRoZSBkZXN0IGFkZHJlc3MgYW5kIGxlbiAqLwotCQljdXJybGVuID0gKGxlbiAtIChody0+YnVmaW5mby5sZW4gKiBpKSkgPiBody0+YnVmaW5mby5sZW4gPwotCQkJCWh3LT5idWZpbmZvLmxlbiA6Ci0JCQkJKGxlbiAtIChody0+YnVmaW5mby5sZW4gKiBpKSk7Ci0JCWN1cnJkYWRkciA9IGRhZGRyICsgKGh3LT5idWZpbmZvLmxlbiAqIGkpOwotCQlkZXN0bG8gPSBIRkEzODR4X0FERFJfQ01EX01LT0ZGKGN1cnJkYWRkcik7Ci0JCWRlc3RoaSA9IEhGQTM4NHhfQUREUl9DTURfTUtQQUdFKGN1cnJkYWRkcik7Ci0JCVdMQU5fTE9HX0lORk8oIldyaXRpbmcgJWQgYnl0ZXMgdG8gZmxhc2ggQDB4JTA2eFxuIiwgY3VycmxlbiwgY3VycmRhZGRyKTsKLSNpZiAwCi1XTEFOX0hFWF9EVU1QKDEsICJkbGRhdGEiLCBidWYrKGh3LT5idWZpbmZvLmxlbippKSwgY3Vycmxlbik7Ci0jZW5kaWYKLQkJLyogU2V0IHRoZSBkb3dubG9hZCBtb2RlICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2Rvd25sb2FkKGh3LCBIRkEzODR4X1BST0dNT0RFX05WLAotCQkJCWRlc3RsbywgZGVzdGhpLCBjdXJybGVuKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiZG93bmxvYWQoTlYsbG89JXgsaGk9JXgsbGVuPSV4KSAiCi0JCQkJImNtZCBmYWlsZWQsIHJlc3VsdD0lZC4gQWJvcnRpbmcgZC9sXG4iLAotCQkJCWRlc3RsbywgZGVzdGhpLCBjdXJybGVuLCByZXN1bHQpOwotCQkJZ290byBleGl0X3Byb2M7Ci0JCX0KLQkJLyogY29weSB0aGUgZGF0YSB0byB0aGUgZmxhc2ggYnVmZmVyICovCi0JCWhmYTM4NHhfY29weV90b19hdXgoaHcsIGRsYnVmYWRkciwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCQlidWYrKGh3LT5idWZpbmZvLmxlbippKSwgY3Vycmxlbik7Ci0JCS8qIHNldCB0aGUgZG93bmxvYWQgJ3dyaXRlIGZsYXNoJyBtb2RlICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2Rvd25sb2FkKGh3LCBIRkEzODR4X1BST0dNT0RFX05WV1JJVEUsIDAsMCwwKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiZG93bmxvYWQoTlZXUklURSxsbz0leCxoaT0leCxsZW49JXgpICIKLQkJCQkiY21kIGZhaWxlZCwgcmVzdWx0PSVkLiBBYm9ydGluZyBkL2xcbiIsCi0JCQkJZGVzdGxvLCBkZXN0aGksIGN1cnJsZW4sIHJlc3VsdCk7Ci0JCQlnb3RvIGV4aXRfcHJvYzsKLQkJfQotCQkvKiByZWFkYmFjayBhbmQgY29tcGFyZSwgaWYgZmFpbC4uLmJhaWwgKi8KLQkJaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LAotCQkJCWN1cnJkYWRkciwgSEZBMzg0eF9BVVhfQ1RMX05WLAotCQkJCXZlcmJ1ZiwgY3Vycmxlbik7Ci0KLQkJaWYgKCBtZW1jbXAoYnVmKyhody0+YnVmaW5mby5sZW4qaSksIHZlcmJ1ZiwgY3VycmxlbikgKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotZXhpdF9wcm9jOgotICAgICAgICAgLyogRE9IISBUaGlzIGtmcmVlJ3MgZm9yIHlvdSBNYXJrIDotKSBNeSBmb3JlaGVhZCBodXJ0cy4uLiAqLwotICAgICAgICAga2ZyZWUodmVyYnVmKTsKLQotCS8qIExlYXZlIHRoZSBmaXJtd2FyZSBpbiB0aGUgJ3Bvc3QtcHJvZycgbW9kZS4gIGZsYXNoZGxfZGlzYWJsZSB3aWxsICovCi0JLyogIGFjdHVhbGx5IGRpc2FibGUgcHJvZ3JhbW1pbmcgbW9kZS4gIFJlbWVtYmVyLCB0aGF0IHdpbGwgY2F1c2UgdGhlICovCi0JLyogIHRoZSBmaXJtd2FyZSB0byBlZmZlY3RpdmVseSByZXNldCBpdHNlbGYuICovCi0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2luaXRpYWxpemUKLSoKLSogSXNzdWVzIHRoZSBpbml0aWFsaXplIGNvbW1hbmQgYW5kIHNldHMgdGhlIGh3LT5zdGF0ZSBiYXNlZAotKiBvbiB0aGUgcmVzdWx0LgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShoZmEzODR4X3QgKmh3KQotewotCWludCByZXN1bHQgPSAwOwotCWludCBpOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JLyogd2UgZG9uJ3Qgd2FudCB0byBiZSBpbnRlcnJ1cHRlZCBkdXJpbmcgdGhlIHJlc2V0ICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfSU5URU4pOwotCWhmYTM4NHhfc2V0cmVnKGh3LCAweGZmZmYsIEhGQTM4NHhfRVZBQ0spOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EQ09ERV9JTklUOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JaWYgKCByZXN1bHQgPT0gMCApIHsKLQkJZm9yICggaSA9IDA7IGkgPCBIRkEzODR4X05VTVBPUlRTX01BWDsgaSsrKSB7Ci0JCQlody0+cG9ydF9lbmFibGVkW2ldID0gMDsKLQkJfQotCX0KLQotICAgICAgICBody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVEOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfY29tbXRhbGxpZXMKLSoKLSogU2VuZCBhIGNvbW10YWxsaWVzIGlucXVpcnkgdG8gdGhlIE1BQy4gIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGFzeW5jCi0qIGNhbGwgdGhhdCB3aWxsIHJlc3VsdCBpbiBhbiBpbmZvIGZyYW1lIGFycml2aW5nIHNvbWV0aW1lIGxhdGVyLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCXplcm8JCXN1Y2Nlc3MuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfY29tbXRhbGxpZXMoIGhmYTM4NHhfdCAqaHcgKQotewotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQlpbnQgcmVzdWx0OwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURDT0RFX0lOUTsKLQljbWQucGFybTAgPSBIRkEzODR4X0lUX0NPTU1UQUxMSUVTOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2VuYWJsZQotKgotKiBJc3N1ZXMgdGhlIGVuYWJsZSBjb21tYW5kIHRvIGVuYWJsZSBjb21tdW5pY2F0aW9ucyBvbiBvbmUgb2YKLSogdGhlIE1BQ3MgJ3BvcnRzJy4gIE9ubHkgbWFjcG9ydCAwIGlzIHZhbGlkICBmb3Igc3RhdGlvbnMuCi0qIEFQcyBtYXkgYWxzbyBlbmFibGUgbWFjcG9ydHMgMS02LiAgT25seSBwb3J0cyB0aGF0IGFyZSBjdXJyZW50bHkKLSogZGlzYWJsZWQgbWF5IGJlIGVuYWJsZWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbWFjcG9ydAkJTUFDIHBvcnQgbnVtYmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQotewotCWludAlyZXN1bHQgPSAwOwotCi0JREJGRU5URVI7Ci0JaWYgKCghaHctPmlzYXAgJiYgbWFjcG9ydCAhPSAwKSB8fAotCSAgICAoaHctPmlzYXAgJiYgIShtYWNwb3J0IDw9IEhGQTM4NHhfUE9SVElEX01BWCkpIHx8Ci0JICAgIChody0+cG9ydF9lbmFibGVkW21hY3BvcnRdKSApewotCQlyZXN1bHQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2VuYWJsZShodywgbWFjcG9ydCk7Ci0JCWlmICggcmVzdWx0ID09IDAgKSB7Ci0JCQlody0+cG9ydF9lbmFibGVkW21hY3BvcnRdID0gMTsKLQkJfQotCX0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2VuYWJsZQotKgotKiBJc3N1ZXMgdGhlIHRoZSBlbmFibGUgY29tbWFuZCB0byBlbmFibGUgY29tbXVuaWNhdGlvbnMgb24gb25lIG9mIHRoZQotKiBNQUNzICdwb3J0cycuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbWFjcG9ydAkJTUFDIHBvcnQgbnVtYmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0VOQUJMRSkgfAotCQkgIEhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKG1hY3BvcnQpOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfZGlzYWJsZQotKgotKiBJc3N1ZXMgdGhlIGRpc2FibGUgY29tbWFuZCB0byBzdG9wIGNvbW11bmljYXRpb25zIG9uIG9uZSBvZgotKiB0aGUgTUFDcyAncG9ydHMnLiAgT25seSBtYWNwb3J0IDAgaXMgdmFsaWQgIGZvciBzdGF0aW9ucy4KLSogQVBzIG1heSBhbHNvIGRpc2FibGUgbWFjcG9ydHMgMS02LiAgT25seSBwb3J0cyB0aGF0IGhhdmUgYmVlbgotKiBwcmV2aW91c2x5IGVuYWJsZWQgbWF5IGJlIGRpc2FibGVkLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCW1hY3BvcnQJCU1BQyBwb3J0IG51bWJlciAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQotewotCWludAlyZXN1bHQgPSAwOwotCi0JREJGRU5URVI7Ci0JaWYgKCghaHctPmlzYXAgJiYgbWFjcG9ydCAhPSAwKSB8fAotCSAgICAoaHctPmlzYXAgJiYgIShtYWNwb3J0IDw9IEhGQTM4NHhfUE9SVElEX01BWCkpIHx8Ci0JICAgICEoaHctPnBvcnRfZW5hYmxlZFttYWNwb3J0XSkgKXsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBoZmEzODR4X2NtZF9kaXNhYmxlKGh3LCBtYWNwb3J0KTsKLQkJaWYgKCByZXN1bHQgPT0gMCApIHsKLQkJCWh3LT5wb3J0X2VuYWJsZWRbbWFjcG9ydF0gPSAwOwotCQl9Ci0JfQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfZGlzYWJsZQotKgotKiBJc3N1ZXMgdGhlIGNvbW1hbmQgdG8gZGlzYWJsZSBhIHBvcnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbWFjcG9ydAkJTUFDIHBvcnQgbnVtYmVyIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRElTQUJMRSkgfAotCQkgIEhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKG1hY3BvcnQpOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9kaWFnbm9zZQotKgotKiBJc3N1ZXMgdGhlIGRpYWdub3NlIGNvbW1hbmQgdG8gdGVzdCB0aGU6IHJlZ2lzdGVyIGludGVyZmFjZSwKLSogTUFDIGNvbnRyb2xsZXIgKGluY2x1ZGluZyBsb29wYmFjayksIEV4dGVybmFsIFJBTSwgTm9uLXZvbGF0aWxlCi0qIG1lbW9yeSBpbnRlZ3JpdHksIGFuZCBzeW50aGVzaXplcnMuICBGb2xsb3dpbmcgZXhlY3V0aW9uIG9mIHRoaXMKLSogY29tbWFuZCwgTUFDL2Zpcm13YXJlIGFyZSBpbiB0aGUgJ2luaXRpYWwgc3RhdGUnLiAgVGhlcmVmb3JlLAotKiB0aGUgSW5pdGlhbGl6ZSBjb21tYW5kIHNob3VsZCBiZSBpc3N1ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bAotKiBjb21wbGV0aW9uIG9mIHRoaXMgY29tbWFuZC4gIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkCi0qIHdoZW4gdGhlIE1BQyBpcyBpbiB0aGUgJ2NvbW11bmljYXRpb24gZGlzYWJsZWQnIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgRElBR19QQVRURVJOQSAoKFVJTlQxNikweGFhYWEpCi0jZGVmaW5lIERJQUdfUEFUVEVSTkIgKChVSU5UMTYpMHg1NTU1KQotCi1pbnQgaGZhMzg0eF9jbWRfZGlhZ25vc2UoaGZhMzg0eF90ICpodykKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRElBRyk7Ci0JY21kLnBhcm0wID0gRElBR19QQVRURVJOQTsKLQljbWQucGFybTEgPSBESUFHX1BBVFRFUk5COwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2FsbG9jYXRlCi0qCi0qIElzc3VlcyB0aGUgYWxsb2NhdGUgY29tbWFuZCBpbnN0cnVjdGluZyB0aGUgZmlybXdhcmUgdG8gYWxsb2NhdGUKLSogYSAnZnJhbWUgc3RydWN0dXJlIGJ1ZmZlcicgaW4gTUFDIGNvbnRyb2xsZXIgUkFNLiAgVGhpcyBjb21tYW5kCi0qIGRvZXMgbm90IHByb3ZpZGUgdGhlIHJlc3VsdCwgaXQgb25seSBpbml0aWF0ZXMgb25lIG9mIHRoZSBmL3cncwotKiBhc3luY2hyb25vdXMgcHJvY2Vzc2VzIHRvIGNvbnN0cnVjdCB0aGUgYnVmZmVyLiAgV2hlbiB0aGUKLSogYWxsb2NhdGlvbiBpcyBjb21wbGV0ZSwgaXQgd2lsbCBiZSBpbmRpY2F0ZWQgdmlhIHRoZSBBbGxvYwotKiBiaXQgaW4gdGhlIEV2U3RhdCByZWdpc3RlciBhbmQgdGhlIEZJRCBpZGVudGlmeWluZyB0aGUgYWxsb2NhdGVkCi0qIHNwYWNlIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhlIEFsbG9jRklEIHJlZ2lzdGVyLiAgU29tZSBjYXJlCi0qIHNob3VsZCBiZSB0YWtlbiB3aGVuIHdhaXRpbmcgZm9yIHRoZSBBbGxvYyBldmVudC4gIElmIGEgVHggb3IKLSogTm90aWZ5IGNvbW1hbmQgdy8gUmVjbGFpbSBoYXMgYmVlbiBwcmV2aW91c2x5IGV4ZWN1dGVkLCBpdCdzCi0qIHBvc3NpYmxlIHRoZSBmaXJzdCBBbGxvYyBldmVudCBhZnRlciBleGVjdXRpb24gb2YgdGhpcyBjb21tYW5kCi0qIHdpbGwgYmUgZm9yIHRoZSByZWNsYWltZWQgYnVmZmVyIGFuZCBub3QgdGhlIG9uZSB5b3UgYXNrZWQgZm9yLgotKiBUaGlzIGNhc2UgbXVzdCBiZSBoYW5kbGVkIGluIHRoZSBBbGxvYyBldmVudCBoYW5kbGVyLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWxlbgkJYWxsb2NhdGlvbiBsZW5ndGgsIG11c3QgYmUgYW4gZXZlbiB2YWx1ZQotKgkJCWluIHRoZSByYW5nZSBbNC0yNDAwXS4gKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9hbGxvY2F0ZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbGVuKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCAobGVuICUgMikgfHwKLQkgICAgIGxlbiA8IEhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NSU4gfHwKLQkgICAgIGxlbiA+IEhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NQVggKSB7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9BTExPQyk7Ci0JCWNtZC5wYXJtMCA9IGxlbjsKLQkJY21kLnBhcm0xID0gMDsKLQkJY21kLnBhcm0yID0gMDsKLQotCQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF90cmFuc21pdAotKgotKiBJbnN0cnVjdHMgdGhlIGZpcm13YXJlIHRvIHRyYW5zbWl0IGEgZnJhbWUgcHJldmlvdXNseSBjb3BpZWQKLSogdG8gYSBnaXZlbiBidWZmZXIuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHksIHRoZSBUeAotKiByZXN1bHRzIGFyZSBhdmFpbGFibGUgdmlhIHRoZSBUeCBvciBUeEV4YyBldmVudHMgKGlmIHRoZSBmcmFtZQotKiBjb250cm9sIGJpdHMgYXJlIHNldCkuICBUaGUgcmVjbGFpbSBhcmd1bWVudCBzcGVjaWZpZXMgaWYgdGhlCi0qIEZJRCBwYXNzZWQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBmL3cgdHggcHJvY2VzcyBvciByZXR1cm5lZCBmb3IKLSogdXNlIHcvIGFub3RoZXIgdHJhbnNtaXQgY29tbWFuZC4gIElmIHJlY2xhaW0gaXMgc2V0LCBleHBlY3QgYW4KLSogQWxsb2MgZXZlbnQgc2lnbmFsbGluZyB0aGUgYXZhaWxpYmlsaXR5IG9mIHRoZSBGSUQgZm9yIHJldXNlLgotKgotKiBOT1RFOiBody0+Y21kbG9jayBNVVNUIEJFIEhFTEQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiEKLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglyZWNsYWltCQlbMHwxXSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gRklEIHdpbGwKLSoJCQliZSBoYW5kZWQgYmFjayAodmlhIEFsbG9jIGV2ZW50KSBmb3IgcmV1c2UuCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCXFvcwkJWzAtM10gVmFsdWUgdG8gcHV0IGluIHRoZSBRb1MgZmllbGQgb2YgdGhlCi0qCQkJdHggY29tbWFuZCwgaWRlbnRpZmllcyBhIHF1ZXVlIHRvIHBsYWNlIHRoZQotKgkJCW91dGdvaW5nIGZyYW1lIGluLgotKgkJCShob3N0IG9yZGVyKQotKglmaWQJCUZJRCBvZiBidWZmZXIgY29udGFpbmluZyB0aGUgZnJhbWUgdGhhdCB3YXMKLSoJCQlwcmV2aW91c2x5IGNvcGllZCB0byBNQUMgbWVtb3J5IHZpYSB0aGUgYmFwLgotKgkJCShob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJaHctPnJlc3AwIHdpbGwgY29udGFpbiB0aGUgRklEIGJlaW5nIHVzZWQgYnkgYXN5bmMgdHgKLSoJcHJvY2Vzcy4gIElmIHJlY2xhaW09PTAsIHJlc3AwIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGZpZAotKglhcmd1bWVudC4gIElmIHJlY2xhaW09PTEsIHJlc3AwIHdpbGwgYmUgdGhlIGRpZmZlcmVudCBhbmQKLSoJaXMgdGhlIHZhbHVlIHRvIHdhdGNoIGZvciBpbiB0aGUgVHh8VHhFeGMgdG8gaW5kaWNhdGUgY29tcGxldGlvbgotKglvZiB0aGUgZnJhbWUgcGFzc2VkIGluIGZpZC4KLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfdHJhbnNtaXQoaGZhMzg0eF90ICpodywgVUlOVDE2IHJlY2xhaW0sIFVJTlQxNiBxb3MsIFVJTlQxNiBmaWQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9UWCkgfAotCQlIRkEzODR4X0NNRF9SRUNMX1NFVChyZWNsYWltKSB8Ci0JCUhGQTM4NHhfQ01EX1FPU19TRVQocW9zKTsKLQljbWQucGFybTAgPSBmaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfY2xlYXJwZXJzaXN0Ci0qCi0qIEluc3RydWN0cyB0aGUgZmlybXdhcmUgdG8gY2xlYXIgdGhlIHBlcnNpc3RlbmNlIGJpdCBpbiBhIGdpdmVuCi0qIEZJRC4gIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgdGVsbGluZyB0aGUgZmlybXdhcmUgdG8gZHJvcCB0aGUKLSogcGVyc2lzdGVudCBmcmFtZS4gIFRoZSBGSUQgbXVzdCBiZSBvbmUgdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkCi0qIHRvIHRyYW5zbWl0IGEgUFJTVCBmcmFtZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglmaWQJCUZJRCBvZiB0aGUgcGVyc2lzdGVudCBmcmFtZSAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2NsZWFycGVyc2lzdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgZmlkKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9DTFJQUlNUKTsKLQljbWQucGFybTAgPSBmaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfbm90aWZ5Ci0qCi0qIFNlbmRzIGFuIGluZm8gZnJhbWUgdG8gdGhlIGZpcm13YXJlIHRvIGFsdGVyIHRoZSBiZWhhdmlvcgotKiBvZiB0aGUgZi93IGFzeW5jaCBwcm9jZXNzZXMuICBDYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgTUFDCi0qIGlzIGluIHRoZSBlbmFibGVkIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXJlY2xhaW0JCVswfDFdIGluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBGSUQgd2lsbAotKgkJCWJlIGhhbmRlZCBiYWNrICh2aWEgQWxsb2MgZXZlbnQpIGZvciByZXVzZS4KLSoJCQkoaG9zdCBvcmRlcikKLSoJZmlkCQlGSUQgb2YgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGZyYW1lIHRoYXQgd2FzCi0qCQkJcHJldmlvdXNseSBjb3BpZWQgdG8gTUFDIG1lbW9yeSB2aWEgdGhlIGJhcC4KLSoJCQkoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCWh3LT5yZXNwMCB3aWxsIGNvbnRhaW4gdGhlIEZJRCBiZWluZyB1c2VkIGJ5IGFzeW5jIG5vdGlmeQotKglwcm9jZXNzLiAgSWYgcmVjbGFpbT09MCwgcmVzcDAgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgZmlkCi0qCWFyZ3VtZW50LiAgSWYgcmVjbGFpbT09MSwgcmVzcDAgd2lsbCBiZSB0aGUgZGlmZmVyZW50LgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9ub3RpZnkoaGZhMzg0eF90ICpodywgVUlOVDE2IHJlY2xhaW0sIFVJTlQxNiBmaWQsCi0JCSAgICAgICB2b2lkICpidWYsIFVJTlQxNiBsZW4pCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9OT1RJRlkpIHwKLQkJSEZBMzg0eF9DTURfUkVDTF9TRVQocmVjbGFpbSk7Ci0JY21kLnBhcm0wID0gZmlkOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0gICAgICAgIC8qIENvcHkgdGhlIHJlY29yZCB0byBGSUQgKi8KLSAgICAgICAgcmVzdWx0ID0gaGZhMzg0eF9jb3B5X3RvX2JhcChodywgSEZBMzg0eF9CQVBfUFJPQywgaHctPmluZm9maWQsIDAsIGJ1ZiwgbGVuKTsKLSAgICAgICAgaWYgKCByZXN1bHQgKSB7Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X3RvX2JhcCglMDR4LCAwLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pbmZvZmlkLCBsZW4sIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLQotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0KLSBmYWlsZWQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0jaWYgMAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2lucXVpcnkKLSoKLSogUmVxdWVzdHMgYW4gaW5mbyBmcmFtZSBmcm9tIHRoZSBmaXJtd2FyZS4gIFRoZSBpbmZvIGZyYW1lIHdpbGwKLSogYmUgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgSW5mbyBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglmaWQJCUZJRCBvZiB0aGUgaW5mbyBmcmFtZSByZXF1ZXN0ZWQuIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGhmYTM4NHhfY21kX2lucXVpcnkoaGZhMzg0eF90ICpodywgVUlOVDE2IGZpZCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfSU5RKTsKLQljbWQucGFybTAgPSBmaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2FjY2VzcwotKgotKiBSZXF1ZXN0cyB0aGF0IGEgZ2l2ZW4gcmVjb3JkIGJlIGNvcGllZCB0by9mcm9tIHRoZSByZWNvcmQKLSogYnVmZmVyLiAgSWYgd2UncmUgd3JpdGluZyBmcm9tIHRoZSByZWNvcmQgYnVmZmVyLCB0aGUgY29udGVudHMKLSogbXVzdCBwcmV2aW91c2x5IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSByZWNvcmQgYnVmZmVyIHZpYSB0aGUKLSogYmFwLiAgSWYgd2UncmUgcmVhZGluZyBpbnRvIHRoZSByZWNvcmQgYnVmZmVyLCB0aGUgcmVjb3JkIGNhbgotKiBiZSByZWFkIG91dCBvZiB0aGUgcmVjb3JkIGJ1ZmZlciBhZnRlciB0aGlzIGNhbGwuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJd3JpdGUJCVswfDFdIGNvcHkgdGhlIHJlY29yZCBidWZmZXIgdG8gdGhlIGdpdmVuCi0qCQkJY29uZmlndXJhdGlvbiByZWNvcmQuIChob3N0IG9yZGVyKQotKglyaWQJCVJJRCBvZiB0aGUgcmVjb3JkIHRvIHJlYWQvd3JpdGUuIChob3N0IG9yZGVyKQotKglidWYJCWhvc3Qgc2lkZSByZWNvcmQgYnVmZmVyLiAgVXBvbiByZXR1cm4gaXQgd2lsbAotKgkJCWNvbnRhaW4gdGhlIGJvZHkgcG9ydGlvbiBvZiB0aGUgcmVjb3JkIChtaW51cyB0aGUKLSoJCQlSSUQgYW5kIGxlbikuCi0qCWxlbgkJYnVmZmVyIGxlbmd0aCAoaW4gYnl0ZXMsIHNob3VsZCBtYXRjaCByZWNvcmQgbGVuZ3RoKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfYWNjZXNzKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB3cml0ZSwgVUlOVDE2IHJpZCwKLQkJICAgICAgIHZvaWQqIGJ1ZiwgVUlOVDE2IGxlbikKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0JaGZhMzg0eF9yZWNfdAlyZWM7Ci0KLQlEQkZFTlRFUjsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotCS8qIFRoaXMgc2hvdWxkIE5PVCBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQhICovCi0JaWYgKGluX2lycSgpKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJLcmFwLCBpbiBJbnRlcnJ1cHQgY29udGV4dCEiKTsKLSNpZmRlZiBXTEFOX0lOQ0xVREVfREVCVUcKLQkJQlVHKCk7Ci0jZW5kaWYKLQl9Ci0jZW5kaWYKLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCWlmICh3cml0ZSkgewotCQlyZWMucmlkID0gaG9zdDJoZmEzODR4XzE2KHJpZCk7Ci0JCXJlYy5yZWNsZW4gPSBob3N0MmhmYTM4NHhfMTYoKGxlbi8yKSArIDEpOyAvKiBub3RlIGNvbnZlcnNpb24gdG8gd29yZHMsICsxIGZvciByaWQgZmllbGQgKi8KLQkJLyogd3JpdGUgdGhlIHJlY29yZCAqLwotCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfdG9fYmFwNCggaHcsIEhGQTM4NHhfQkFQX1BST0MsIHJpZCwgMCwKLQkJCQkJICAgICAgICZyZWMsIHNpemVvZihyZWMpLAotCQkJCQkgICAgICAgYnVmLCBsZW4sCi0JCQkJCSAgICAgICBOVUxMLCAwLCBOVUxMLCAwKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygzLCJGYWlsdXJlIHdyaXRpbmcgcmVjb3JkIGhlYWRlcitkYXRhXG4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JfQotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9BQ0NFU1MpIHwKLQkJSEZBMzg0eF9DTURfV1JJVEVfU0VUKHdyaXRlKTsKLQljbWQucGFybTAgPSByaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkNhbGwgdG8gaGZhMzg0eF9kb2NtZF93YWl0IGZhaWxlZCAoJWQgJWQpXG4iLAotCQkJCXJlc3VsdCwgY21kLnJlc3VsdC5yZXNwMCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoIXdyaXRlKSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcCggaHcsIEhGQTM4NHhfQkFQX1BST0MsIHJpZCwgMCwgJnJlYywgc2l6ZW9mKHJlYykpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDMsIkNhbGwgdG8gaGZhMzg0eF9jb3B5X2Zyb21fYmFwIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQkvKiBWYWxpZGF0ZSB0aGUgcmVjb3JkIGxlbmd0aCAqLwotCQlpZiAoICgoaGZhMzg0eDJob3N0XzE2KHJlYy5yZWNsZW4pLTEpKjIpICE9IGxlbiApIHsgIC8qIG5vdGUgYm9keSBsZW4gY2FsY3VsYXRpb24gaW4gYnl0ZXMgKi8KLQkJCVdMQU5fTE9HX0RFQlVHKDEsICJSSUQgbGVuIG1pc21hdGNoLCByaWQ9MHglMDR4IGhsZW49JWQgZndsZW49JWRcbiIsCi0JCQkJCXJpZCwgbGVuLCAoaGZhMzg0eDJob3N0XzE2KHJlYy5yZWNsZW4pLTEpKjIpOwotCQkJcmVzdWx0ID0gLUVOT0RBVEE7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoIGh3LCBIRkEzODR4X0JBUF9QUk9DLCByaWQsIHNpemVvZihyZWMpLCBidWYsIGxlbik7Ci0KLQl9Ci0KLSBmYWlsOgotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9tb25pdG9yCi0qCi0qIEVuYWJsZXMgdGhlICdtb25pdG9yIG1vZGUnIG9mIHRoZSBNQUMuICBIZXJlJ3MgdGhlIGRlc2NyaXB0aW9uIG9mCi0qIG1vbml0b3IgbW9kZSB0aGF0IEkndmUgcmVjZWl2ZWQgdGh1cyBmYXI6Ci0qCi0qICAiVGhlICJtb25pdG9yIG1vZGUiIG9mIG9wZXJhdGlvbiBpcyB0aGF0IHRoZSBNQUMgcGFzc2VzIGFsbAotKiAgZnJhbWVzIGZvciB3aGljaCB0aGUgUExDUCBjaGVja3MgYXJlIGNvcnJlY3QuIEFsbCByZWNlaXZlZAotKiAgTVBEVXMgYXJlIHBhc3NlZCB0byB0aGUgaG9zdCB3aXRoIE1BQyBQb3J0ID0gNywgd2l0aCBhCi0qICByZWNlaXZlIHN0YXR1cyBvZiBnb29kLCBGQ1MgZXJyb3IsIG9yIHVuZGVjcnlwdGFibGUuIFBhc3NpbmcKLSogIGNlcnRhaW4gTVBEVXMgaXMgYSB2aW9sYXRpb24gb2YgdGhlIDgwMi4xMSBzdGFuZGFyZCwgYnV0IHVzZWZ1bAotKiAgZm9yIGEgZGVidWdnaW5nIHRvb2wuIiAgTm9ybWFsIGNvbW11bmljYXRpb24gaXMgbm90IHBvc3NpYmxlCi0qICB3aGlsZSBtb25pdG9yIG1vZGUgaXMgZW5hYmxlZC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgllbmFibGUJCWEgY29kZSAoMHgwYnwweDBmKSB0aGF0IGVuYWJsZXMvZGlzYWJsZXMKLSoJCQltb25pdG9yIG1vZGUuIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfbW9uaXRvcihoZmEzODR4X3QgKmh3LCBVSU5UMTYgZW5hYmxlKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9NT05JVE9SKSB8Ci0JCUhGQTM4NHhfQ01EX0FJTkZPX1NFVChlbmFibGUpOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9kb3dubG9hZAotKgotKiBTZXRzIHRoZSBjb250cm9scyBmb3IgdGhlIE1BQyBjb250cm9sbGVyIGNvZGUvZGF0YSBkb3dubG9hZAotKiBwcm9jZXNzLiAgVGhlIGFyZ3VtZW50cyBzZXQgdGhlIG1vZGUgYW5kIGFkZHJlc3MgYXNzb2NpYXRlZAotKiB3aXRoIGEgZG93bmxvYWQuICBOb3RlIHRoYXQgdGhlIGF1eCByZWdpc3RlcnMgc2hvdWxkIGJlIGVuYWJsZWQKLSogcHJpb3IgdG8gc2V0dGluZyBvbmUgb2YgdGhlIGRvd25sb2FkIGVuYWJsZSBtb2Rlcy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgltb2RlCQkwIC0gRGlzYWJsZSBwcm9ncmFtbWluZyBhbmQgYmVnaW4gY29kZSBleGVjCi0qCQkJMSAtIEVuYWJsZSB2b2xhdGlsZSBtZW0gcHJvZ3JhbW1pbmcKLSoJCQkyIC0gRW5hYmxlIG5vbi12b2xhdGlsZSBtZW0gcHJvZ3JhbW1pbmcKLSoJCQkzIC0gUHJvZ3JhbSBub24tdm9sYXRpbGUgc2VjdGlvbiBmcm9tIE5WIGRvd25sb2FkCi0qCQkJICAgIGJ1ZmZlci4KLSoJCQkoaG9zdCBvcmRlcikKLSoJbG93YWRkcgotKgloaWdoYWRkcglGb3IgbW9kZSAxLCBzZXRzIHRoZSBoaWdoICYgbG93IG9yZGVyIGJpdHMgb2YKLSoJCQl0aGUgImRlc3RpbmF0aW9uIGFkZHJlc3MiLiAgVGhpcyBhZGRyZXNzIHdpbGwgYmUKLSoJCQl0aGUgZXhlY3V0aW9uIHN0YXJ0IGFkZHJlc3Mgd2hlbiBkb3dubG9hZCBpcwotKgkJCXN1YnNlcXVlbnRseSBkaXNhYmxlZC4KLSoJCQlGb3IgbW9kZSAyLCBzZXRzIHRoZSBoaWdoICYgbG93IG9yZGVyIGJpdHMgb2YKLSoJCQl0aGUgZGVzdGluYXRpb24gaW4gTlYgcmFtLgotKgkJCUZvciBtb2RlcyAwICYgMywgc2hvdWxkIGJlIHplcm8uIChob3N0IG9yZGVyKQotKgkJCU5PVEU6IHRoZXNlIGFkZHJlc3MgYXJncyBhcmUgaW4gQ01EIGZvcm1hdAotKgljb2RlbGVuCQlMZW5ndGggb2YgdGhlIGRhdGEgdG8gd3JpdGUgaW4gbW9kZSAyLAotKgkJCXplcm8gb3RoZXJ3aXNlLiAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtb2RlLCBVSU5UMTYgbG93YWRkciwKLQkJCQlVSU5UMTYgaGlnaGFkZHIsIFVJTlQxNiBjb2RlbGVuKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9ET1dOTEQpIHwKLQkJSEZBMzg0eF9DTURfUFJPR01PREVfU0VUKG1vZGUpOwotCWNtZC5wYXJtMCA9IGxvd2FkZHI7Ci0JY21kLnBhcm0xID0gaGlnaGFkZHI7Ci0JY21kLnBhcm0yID0gY29kZWxlbjsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZGxfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfYXV4X2VuYWJsZQotKgotKiBHb2VzIHRocm91Z2ggdGhlIHByb2Nlc3Mgb2YgZW5hYmxpbmcgdGhlIGF1eGlsYXJ5IHBvcnQuICBUaGlzCi0qIGlzIG5lY2Vzc2FyeSBwcmlvciB0byByYXcgcmVhZHMvd3JpdGVzIHRvIGNhcmQgZGF0YSBzcGFjZS4KLSogRGlyZWN0IGFjY2VzcyB0byB0aGUgY2FyZCBkYXRhIHNwYWNlIGlzIG9ubHkgdXNlZCBmb3IgZG93bmxvYWRpbmcKLSogY29kZSBhbmQgZGVidWdnaW5nLgotKiBOb3RlIHRoYXQgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgYmVmb3JlIGF0dGVtcHRpbmcKLSogYSBkb3dubG9hZC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0KQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaGZhMzg0eF90ICpodywgaW50IGZvcmNlKQotewotCWludAkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCVVJTlQzMgkJcmV0cmllc19yZW1haW5pbmc7Ci0JVUlOVDE2CQlyZWc7Ci0JVUlOVAkJYXV4ZW5fbWlycm9yID0gaHctPmF1eGVuOwotCi0JREJGRU5URVI7Ci0KLQkvKiBDaGVjayBmb3IgZXhpc3RpbmcgZW5hYmxlICovCi0JaWYgKCBody0+YXV4ZW4gKSB7Ci0JCWh3LT5hdXhlbisrOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBhY3F1aXJlIHRoZSBsb2NrICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoICYoaHctPmNtZGxvY2spLCBmbGFncyk7Ci0JLyogd2FpdCBmb3IgY21kIHJlZ2lzdGVyIGJ1c3kgYml0IHRvIGNsZWFyICovCi0JcmV0cmllc19yZW1haW5pbmcgPSAxMDAwMDA7Ci0JZG8gewotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCQl1ZGVsYXkoMTApOwotCX0KLQl3aGlsZSAoSEZBMzg0eF9DTURfSVNCVVNZKHJlZykgJiYgLS1yZXRyaWVzX3JlbWFpbmluZyk7Ci0JaWYgKHJldHJpZXNfcmVtYWluaW5nICE9IDApIHsKLQkJLyogYnVzeSBiaXQgY2xlYXIsIGl0J3MgT0sgdG8gd3JpdGUgdG8gUGFyYW1YIHJlZ3MgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfQVVYUFcwLAotCQkJSEZBMzg0eF9QQVJBTTApOwotCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9BVVhQVzEsCi0JCQlIRkEzODR4X1BBUkFNMSk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0FVWFBXMiwKLQkJCUhGQTM4NHhfUEFSQU0yKTsKLQotCQkvKiBTZXQgdGhlIGF1eCBlbmFibGUgaW4gdGhlIENvbnRyb2wgcmVnaXN0ZXIgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfQ09OVFJPTF9BVVhfRE9FTkFCTEUsCi0JCQlIRkEzODR4X0NPTlRST0wpOwotCi0JCS8qIE5vdyB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCXJldHJpZXNfcmVtYWluaW5nID0gMTAwMDAwOwotCQlkbyB7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DT05UUk9MKTsKLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQkJd2hpbGUgKCAoKHJlZyAmIChCSVQxNHxCSVQxNSkpICE9IEhGQTM4NHhfQ09OVFJPTF9BVVhfSVNFTkFCTEVEKSAmJgotCQkJLS1yZXRyaWVzX3JlbWFpbmluZyApOwotCQlpZiAocmV0cmllc19yZW1haW5pbmcgIT0gMCkgewotCQkJcmVzdWx0ID0gMDsKLQkJCWh3LT5hdXhlbisrOwotCQl9Ci0JfQotCi0JLyogRm9yY2UgaXQgZW5hYmxlZCBldmVuIGlmIHRoZSBjb21tYW5kIGZhaWxlZCwgaWYgdG9sZC4uICovCi0JaWYgKChody0+YXV4ZW4gPT0gYXV4ZW5fbWlycm9yKSAmJiBmb3JjZSkKLQkJaHctPmF1eGVuKys7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5jbWRsb2NrKSwgZmxhZ3MpOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUKLSoKLSogR29lcyB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIGRpc2FibGluZyB0aGUgYXV4aWxhcnkgcG9ydAotKiBlbmFibGVkIHdpdGggYXV4X2VuYWJsZSgpLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXQpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaGZhMzg0eF90ICpodykKLXsKLQlpbnQJCXJlc3VsdCA9IC1FVElNRURPVVQ7Ci0JdW5zaWduZWQgbG9uZyAgIHRpbWVvdXQ7Ci0JVUlOVDE2CQlyZWcgPSAwOwotCi0JREJGRU5URVI7Ci0KLQkvKiBTZWUgaWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIGVuYWJsZSAqLwotCWlmIChody0+YXV4ZW4pIGh3LT5hdXhlbi0tOwotCWlmIChody0+YXV4ZW4pIHJldHVybiAwOwotCi0JLyogQ2xlYXIgdGhlIGF1eCBlbmFibGUgaW4gdGhlIENvbnRyb2wgcmVnaXN0ZXIgKi8KLQloZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9QQVJBTTApOwotCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X1BBUkFNMSk7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfUEFSQU0yKTsKLQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9DT05UUk9MX0FVWF9ET0RJU0FCTEUsCi0JCUhGQTM4NHhfQ09OVFJPTCk7Ci0KLQkvKiBOb3cgd2FpdCBmb3IgY29tcGxldGlvbiAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgMSpIWjsKLQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DT05UUk9MKTsKLQl3aGlsZSAoICgocmVnICYgKEJJVDE0fEJJVDE1KSkgIT0gSEZBMzg0eF9DT05UUk9MX0FVWF9JU0RJU0FCTEVEKSAmJgotCQl0aW1lX2JlZm9yZShqaWZmaWVzLHRpbWVvdXQpICl7Ci0JCXVkZWxheSgxMCk7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NPTlRST0wpOwotCX0KLQlpZiAoKHJlZyAmIChCSVQxNHxCSVQxNSkpID09IEhGQTM4NHhfQ09OVFJPTF9BVVhfSVNESVNBQkxFRCApIHsKLQkJcmVzdWx0ID0gMDsKLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2xvd19sZXZlbAotKgotKiBXcml0ZSB0ZXN0IGNvbW1hbmRzIHRvIHRoZSBjYXJkLiAgU29tZSB0ZXN0IGNvbW1hbmRzIGRvbid0IG1ha2UKLSogc2Vuc2Ugd2l0aG91dCBwcmlvciBzZXQtdXAuICBGb3IgZXhhbXBsZSwgY29udGlub3VzIFRYIGlzbid0IHZlcnkKLSogdXNlZnVsIHVudGlsIHlvdSBzZXQgdGhlIGNoYW5uZWwuICBUaGF0IGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgIHByb2Nlc3MgdGhyZWFkCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfbG93X2xldmVsKGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpCi17Ci0JaW50ICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0JREJGRU5URVI7Ci0KLQkvKiBEbyBpIG5lZWQgYSBob3N0MmhmYS4uLiBjb252ZXJzaW9uID8gKi8KLSNpZiAwCi0JcHJpbnRrKEtFUk5fSU5GTyAiJSN4ICUjeCAlI3ggJSN4XG4iLCBjbWQtPmNtZCwgY21kLT5wYXJtMCwgY21kLT5wYXJtMSwgY21kLT5wYXJtMik7Ci0jZW5kaWYKLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsIGNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBUT0RPOiBkZXRlcm1pbmUgaWYgdGhlc2Ugd2lsbCBldmVyIGJlIG5lZWRlZCAqLwotI2lmIDAKLWludCBoZmEzODR4X2NtZF9yZWFkbWlmKGhmYTM4NHhfdCAqaHcpCi17Ci0JREJGRU5URVI7Ci0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgaGZhMzg0eF9jbWRfd3JpdGVtaWYoaGZhMzg0eF90ICpodykKLXsKLQlEQkZFTlRFUjsKLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfbW1pX3JlYWQKLSoKLSogUmVhZCBtbWkgcmVnaXN0ZXJzLiAgbW1pIGlzIGludGVyc2lsLXNwZWFrIGZvciB0aGUgYmFzZWJhbmQKLSogcHJvY2Vzc29yIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodyAgICAgICAgICAgICAgZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICByZWdpc3RlciAgICAgICAgVGhlIHRlc3QgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQgKG11c3QgYmUgZXZlbiAjKS4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSogICAgICAgPjAgICAgICAgICAgICAgIGYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKiAgICAgICA8MCAgICAgICAgICAgICAgZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgICBwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX21taV9yZWFkKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBhZGRyLCBVSU5UMzIgKnJlc3ApCi17Ci0gICAgICAgIGludCAgICAgICAgICAgICByZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotICAgICAgICBEQkZFTlRFUjsKLQljbWQuY21kID0gKFVJTlQxNikgMHgzMDsKLQljbWQucGFybTAgPSAoVUlOVDE2KSBhZGRyOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotICAgICAgICAvKiBEbyBpIG5lZWQgYSBob3N0MmhmYS4uLiBjb252ZXJzaW9uID8gKi8KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQkqcmVzcCA9IChVSU5UMzIpIGNtZC5yZXN1bHQucmVzcDA7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9tbWlfd3JpdGUKLSoKLSogUmVhZCBtbWkgcmVnaXN0ZXJzLiAgbW1pIGlzIGludGVyc2lsLXNwZWFrIGZvciB0aGUgYmFzZWJhbmQKLSogcHJvY2Vzc29yIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodyAgICAgICAgICAgICAgZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICBhZGRyICAgICAgICAgICAgVGhlIHRlc3QgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQgKG11c3QgYmUgZXZlbiAjKS4KLSogICAgICAgZGF0YSAgICAgICAgICAgIFRoZSBkYXRhIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3Rlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSogICAgICAgPjAgICAgICAgICAgICAgIGYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKiAgICAgICA8MCAgICAgICAgICAgICAgZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgICBwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludAotaGZhMzg0eF9kcnZyX21taV93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkciwgVUlOVDMyIGRhdGEpCi17Ci0gICAgICAgIGludCAgICAgICAgICAgICByZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotICAgICAgICBEQkZFTlRFUjsKLQljbWQuY21kID0gKFVJTlQxNikgMHgzMTsKLQljbWQucGFybTAgPSAoVUlOVDE2KSBhZGRyOwotCWNtZC5wYXJtMSA9IChVSU5UMTYpIGRhdGE7Ci0JY21kLnBhcm0yID0gMDsKLQotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCJtbWkgd3JpdGUgOiBhZGRyID0gMHglMDh4XG4iLCBhZGRyKTsKLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwibW1pIHdyaXRlIDogZGF0YSA9IDB4JTA4eFxuIiwgZGF0YSk7Ci0KLSAgICAgICAgLyogRG8gaSBuZWVkIGEgaG9zdDJoZmEuLi4gY29udmVyc2lvbiA/ICovCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogVE9ETzogZGV0ZXJtaW5lIGlmIHRoZXNlIHdpbGwgZXZlciBiZSBuZWVkZWQgKi8KLSNpZiAwCi1pbnQgaGZhMzg0eF9jbWRfcmVhZG1pZihoZmEzODR4X3QgKmh3KQotewotICAgICAgICBEQkZFTlRFUjsKLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGhmYTM4NHhfY21kX3dyaXRlbWlmKGhmYTM4NHhfdCAqaHcpCi17Ci0gICAgICAgIERCRkVOVEVSOwotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY29weV9mcm9tX2JhcAotKgotKiBDb3BpZXMgYSBjb2xsZWN0aW9uIG9mIGJ5dGVzIGZyb20gdGhlIE1BQyBjb250cm9sbGVyIG1lbW9yeSB2aWEKLSogb25lIHNldCBvZiBCQVAgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWJhcAkJWzB8MV0gd2hpY2ggQkFQIHRvIHVzZQotKglpZAkJRklEIG9yIFJJRCwgZGVzdGluZWQgZm9yIHRoZSBzZWxlY3QgcmVnaXN0ZXIgKGhvc3Qgb3JkZXIpCi0qCW9mZnNldAkJQW4gX2V2ZW5fIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZm9yIHRoZSBnaXZlbgotKgkJCUZJRC9SSUQuICBXZSBoYXZlbid0IHRoZSBtZWFucyB0byB2YWxpZGF0ZSB0aGlzLAotKgkJCXNvIGJlIGNhcmVmdWwuIChob3N0IG9yZGVyKQotKglidWYJCXB0ciB0byBhcnJheSBvZiBieXRlcwotKglsZW4JCWxlbmd0aCBvZiBkYXRhIHRvIHRyYW5zZmVyIGluIGJ5dGVzCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gdmFsdWUgb2Ygb2Zmc2V0IHJlZy4KLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaGZhMzg0eF90ICpodywgVUlOVDE2IGJhcCwgVUlOVDE2IGlkLCBVSU5UMTYgb2Zmc2V0LAotCQkJCXZvaWQgKmJ1ZiwgVUlOVCBsZW4pCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOwotCVVJTlQ4CQkqZCA9IChVSU5UOCopYnVmOwotCVVJTlQJCXNlbGVjdHJlZzsKLQlVSU5UCQlvZmZzZXRyZWc7Ci0JVUlOVAkJZGF0YXJlZzsKLQlVSU5UCQlpOwotCVVJTlQxNgkJcmVnID0gMDsKLQotCURCRkVOVEVSOwotCi0JLyogVmFsaWRhdGUgYmFwLCBvZmZzZXQsIGJ1ZiwgYW5kIGxlbiAqLwotCWlmICggKGJhcCA+IDEpIHx8Ci0JICAgICAob2Zmc2V0ID4gSEZBMzg0eF9CQVBfT0ZGU0VUX01BWCkgfHwKLQkgICAgIChvZmZzZXQgJSAyKSB8fAotCSAgICAgKGJ1ZiA9PSBOVUxMKSB8fAotCSAgICAgKGxlbiA+IEhGQTM4NHhfQkFQX0RBVEFMRU5fTUFYKSApewotCSAgICAgCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJc2VsZWN0cmVnID0gKGJhcCA9PSAxKSA/ICBIRkEzODR4X1NFTEVDVDEgOiBIRkEzODR4X1NFTEVDVDAgOwotCQlvZmZzZXRyZWcgPSAoYmFwID09IDEpID8gIEhGQTM4NHhfT0ZGU0VUMSA6IEhGQTM4NHhfT0ZGU0VUMCA7Ci0JCWRhdGFyZWcgPSAgIChiYXAgPT0gMSkgPyAgSEZBMzg0eF9EQVRBMSA6IEhGQTM4NHhfREFUQTAgOwotCi0JCS8qIE9idGFpbiBsb2NrICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotCi0JCS8qIFdyaXRlIGlkIHRvIHNlbGVjdCByZWcgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGlkLCBzZWxlY3RyZWcpOwotCQkvKiBXcml0ZSBvZmZzZXQgdG8gb2Zmc2V0IHJlZyAqLwotCQloZmEzODR4X3NldHJlZyhodywgb2Zmc2V0LCBvZmZzZXRyZWcpOwotCQkvKiBXYWl0IGZvciBvZmZzZXRbYnVzeV0gdG8gY2xlYXIgKHNlZSBCQVBfVElNRU9VVCkgKi8KLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBvZmZzZXRyZWcpOwotCQkJaWYgKCBpID4gMCApIHVkZWxheSgxMCk7Ci0JCQlpKys7Ci0JCX0gd2hpbGUgKCBpIDwgcHJpc20yX2JhcF90aW1lb3V0ICYmIEhGQTM4NHhfT0ZGU0VUX0lTQlVTWShyZWcpKTsKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9QQ0kpCi0JCS8qIFJlbGVhc2UgbG9jayAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotI2VuZGlmCi0KLQkJaWYgKCBIRkEzODR4X09GRlNFVF9JU0JVU1kocmVnKSApewotCQkJLyogSWYgdGltZW91dCwgcmV0dXJuIC1FVElNRURPVVQgKi8KLQkJCXJlc3VsdCA9IHJlZzsKLQkJfSBlbHNlIGlmICggSEZBMzg0eF9PRkZTRVRfSVNFUlIocmVnKSApewotCQkJLyogSWYgb2Zmc2V0W2Vycl0gPT0gMSwgcmV0dXJuIC1FSU5WQUwgKi8KLQkJCXJlc3VsdCA9IHJlZzsKLQkJfSBlbHNlIHsKLQkJCS8qIFJlYWQgZXZlbihsZW4pIGJ1ZiBjb250ZW50cyBmcm9tIGRhdGEgcmVnICovCi0JCQlmb3IgKCBpID0gMDsgaSA8IChsZW4gJiAweGZmZmUpOyBpKz0yICkgewotCQkJCSooVUlOVDE2KikoJihkW2ldKSkgPQotCQkJCQloZmEzODR4X2dldHJlZ19ub3N3YXAoaHcsIGRhdGFyZWcpOwotCQkJfQotCQkJLyogSWYgbGVuIG9kZCwgaGFuZGxlIGxhc3QgYnl0ZSAqLwotCQkJaWYgKCBsZW4gJSAyICl7Ci0JCQkJcmVnID0gaGZhMzg0eF9nZXRyZWdfbm9zd2FwKGh3LCBkYXRhcmVnKTsKLQkJCQlkW2xlbi0xXSA9ICgoVUlOVDgqKSgmcmVnKSlbMF07Ci0JCQl9Ci0JCX0KLQotCQkvKiBBY2NvcmRpbmcgdG8gSW50ZXJzaWwgZXJyYXRhIGRhdGVkIDkvMTYvMDI6Ci0KLQkJIkluIFBSSVNNIFBDSSBNQUMgaG9zdCBpbnRlcmZhY2UsIGlmIGJvdGggQkFQcyBhcmUgY29uY3VycmVudGx5Ci0JCSByZXF1ZXNpbmcgbWVtb3J5IGFjY2VzcywgYm90aCB3aWxsIGFjY2VwdCB0aGUgQWNrLiAgIFRoZXJlIGlzIG5vCi0JCSBmaXJtd2FyZSB3b3JrYXJvdW5kIHBvc3NpYmxlLiAgVG8gcHJldmVudCBCQVAgYWNjZXNzIGZhaWx1cmVzIG9yCi0JCSBoYW5nIGNvbmRpdGlvbnMgdGhlIGhvc3QgTVVTVCBOT1QgYWNjZXNzIGJvdGggQkFQcyBpbiBzdWNlc3Npb24KLQkJIHVubGVzcyBhdCBsZWFzdCA1dXMgZWxhcHNlcyBiZXR3ZWVuIGFjY2Vzc2VzLiAgVGhlIHNhZmVzdCBjaG9pY2UKLQkJIGlzIHRvIFVTRSBPTkxZIE9ORSBCQVAgZm9yIGFsbCBkYXRhIG1vdmVtZW50IG9wZXJhdGlvbnMuIgotCi0JCSBXaGF0IHRoaXMgbWVhbnM6Ci0KLQkJIFdlIGhhdmUgdG8gc2VyaWFsaXplIEFMTCBCQVAgYWNjZXNzZXMsIGFuZCBmdXJ0aGVybW9yZSwgYWRkIGEgNXVzCi0JCSBkZWxheSBhZnRlciBhY2Nlc3MgaWYgd2UncmUgdXNpbmcgYSBQQ0kgcGxhdGZvcm0uCi0KLQkJIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgd2UgaGF2ZSB0byBsb2NrIG91dCBpbnRlcnJ1cHRzIHRocm91Z291dAotCQkgdGhlIGVudGlyZSBCQVAgY29weS4KLQotCQkgSXQgcmVtYWlucyB0byBiZSBzZWVuIGlmICJCQVAgYWNjZXNzIiBtZWFucyAiQkFQIHNldHVwIiBvciB0aGUgbW9yZQotCQkgbGl0ZXJhbCBkZWZpbml0aW9uIG9mICJjb3B5aW5nIGRhdGEgYmFjayBhbmQgZm9ydGgiICBJJ20gZXJyaW5nIGZvcgotCQkgdGhlIGxhdHRlciwgc2FmZXIgZGVmaW5pdGlvbi4gIC0tIFNMUC4KLQotCQkqLwotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCQl1ZGVsYXkoNSk7Ci0JCS8qIFJlbGVhc2UgbG9jayAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotI2VuZGlmCi0KLQl9Ci0KLQlpZiAocmVzdWx0KSB7Ci0JICBXTEFOX0xPR19ERUJVRygxLAotCQkJICAiY29weV9mcm9tX2JhcCgweCUwNHgsIDAsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJICByZWcsIGxlbiwgcmVzdWx0KTsKLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NvcHlfdG9fYmFwCi0qCi0qIENvcGllcyBhIGNvbGxlY3Rpb24gb2YgYnl0ZXMgdG8gdGhlIE1BQyBjb250cm9sbGVyIG1lbW9yeSB2aWEKLSogb25lIHNldCBvZiBCQVAgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWJhcAkJWzB8MV0gd2hpY2ggQkFQIHRvIHVzZQotKglpZAkJRklEIG9yIFJJRCwgZGVzdGluZWQgZm9yIHRoZSBzZWxlY3QgcmVnaXN0ZXIgKGhvc3Qgb3JkZXIpCi0qCW9mZnNldAkJQW4gX2V2ZW5fIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZm9yIHRoZSBnaXZlbgotKgkJCUZJRC9SSUQuICBXZSBoYXZlbid0IHRoZSBtZWFucyB0byB2YWxpZGF0ZSB0aGlzLAotKgkJCXNvIGJlIGNhcmVmdWwuIChob3N0IG9yZGVyKQotKglidWYJCXB0ciB0byBhcnJheSBvZiBieXRlcwotKglsZW4JCWxlbmd0aCBvZiBkYXRhIHRvIHRyYW5zZmVyIChpbiBieXRlcykKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSB2YWx1ZSBvZiBvZmZzZXQgcmVnLgotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY29weV90b19iYXAoaGZhMzg0eF90ICpodywgVUlOVDE2IGJhcCwgVUlOVDE2IGlkLCBVSU5UMTYgb2Zmc2V0LAotCQkJCXZvaWQgKmJ1ZiwgVUlOVCBsZW4pCi17Ci0JcmV0dXJuIGhmYTM4NHhfY29weV90b19iYXA0KGh3LCBiYXAsIGlkLCBvZmZzZXQsIGJ1ZiwgbGVuLCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwKTsKLX0KLQotaW50IGhmYTM4NHhfY29weV90b19iYXA0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBiYXAsIFVJTlQxNiBpZCwgVUlOVDE2IG9mZnNldCwKLQkJCSB2b2lkICpidWYsIFVJTlQgbGVuMSwgdm9pZCogYnVmMiwgVUlOVCBsZW4yLAotCQkJIHZvaWQgKmJ1ZjMsIFVJTlQgbGVuMywgdm9pZCAqYnVmNCwgVUlOVCBsZW40KQotewotCWludAkJcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKLQlVSU5UOAkJKmQ7Ci0JVUlOVAkJc2VsZWN0cmVnOwotCVVJTlQJCW9mZnNldHJlZzsKLQlVSU5UCQlkYXRhcmVnOwotCVVJTlQJCWk7Ci0JVUlOVDE2CQlyZWc7Ci0KLQlEQkZFTlRFUjsKLQotLy8JcHJpbnRrKEtFUk5fREVCVUcgImN0YjEgJWQgaWQgJTA0eCBvICVkICVkICVkICVkICVkXG4iLCBiYXAsIGlkLCBvZmZzZXQsIGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQpOwotCi0JLyogVmFsaWRhdGUgYmFwLCBvZmZzZXQsIGJ1ZiwgYW5kIGxlbiAqLwotCWlmICggKGJhcCA+IDEpIHx8Ci0JICAgICAob2Zmc2V0ID4gSEZBMzg0eF9CQVBfT0ZGU0VUX01BWCkgfHwKLQkgICAgIChvZmZzZXQgJSAyKSB8fAotCSAgICAgKGJ1ZiA9PSBOVUxMKSB8fAotCSAgICAgKGxlbjErbGVuMitsZW4zK2xlbjQgPiBIRkEzODR4X0JBUF9EQVRBTEVOX01BWCkgKXsKLQkgICAgIAlyZXN1bHQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCXNlbGVjdHJlZyA9IChiYXAgPT0gMSkgPyBIRkEzODR4X1NFTEVDVDEgOiBIRkEzODR4X1NFTEVDVDA7Ci0JCW9mZnNldHJlZyA9IChiYXAgPT0gMSkgPyBIRkEzODR4X09GRlNFVDEgOiBIRkEzODR4X09GRlNFVDA7Ci0JCWRhdGFyZWcgPSAgIChiYXAgPT0gMSkgPyBIRkEzODR4X0RBVEExICAgOiBIRkEzODR4X0RBVEEwOwotCQkvKiBPYnRhaW4gbG9jayAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSggJihody0+YmFwbG9jayksIGZsYWdzKTsKLQotCQkvKiBXcml0ZSBpZCB0byBzZWxlY3QgcmVnICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBpZCwgc2VsZWN0cmVnKTsKLQkJdWRlbGF5KDEwKTsKLQkJLyogV3JpdGUgb2Zmc2V0IHRvIG9mZnNldCByZWcgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIG9mZnNldCwgb2Zmc2V0cmVnKTsKLQkJLyogV2FpdCBmb3Igb2Zmc2V0W2J1c3ldIHRvIGNsZWFyIChzZWUgQkFQX1RJTUVPVVQpICovCi0JCWkgPSAwOwotCQlkbyB7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgb2Zmc2V0cmVnKTsKLQkJCWlmICggaSA+IDAgKSB1ZGVsYXkoMTApOwotCQkJaSsrOwotCQl9IHdoaWxlICggaSA8IHByaXNtMl9iYXBfdGltZW91dCAmJiBIRkEzODR4X09GRlNFVF9JU0JVU1kocmVnKSk7Ci0KLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9QQ0kpCi0JCS8qIFJlbGVhc2UgbG9jayAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotI2VuZGlmCi0KLQkJaWYgKCBIRkEzODR4X09GRlNFVF9JU0JVU1kocmVnKSApewotCQkJLyogSWYgdGltZW91dCwgcmV0dXJuIHJlZyAqLwotCQkJcmVzdWx0ID0gcmVnOwotCQl9IGVsc2UgaWYgKCBIRkEzODR4X09GRlNFVF9JU0VSUihyZWcpICl7Ci0JCQkvKiBJZiBvZmZzZXRbZXJyXSA9PSAxLCByZXR1cm4gcmVnICovCi0JCQlyZXN1bHQgPSByZWc7Ci0JCX0gZWxzZSB7Ci0JCQlkID0gKFVJTlQ4KilidWY7Ci0JCQkvKiBXcml0ZSBldmVuKGxlbjEpIGJ1ZiBjb250ZW50cyB0byBkYXRhIHJlZyAqLwotCQkJZm9yICggaSA9IDA7IGkgPCAobGVuMSAmIDB4ZmZmZSk7IGkrPTIgKSB7Ci0JCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LAotCQkJCQkqKFVJTlQxNiopKCYoZFtpXSkpLCBkYXRhcmVnKTsKLQkJCX0KLQkJCWlmIChsZW4xICYgMSkgewotCQkJCVVJTlQxNiBkYXRhOwotCQkJCVVJTlQ4ICpiID0gKFVJTlQ4ICopICZkYXRhOwotCQkJCWJbMF0gPSBkW2xlbjEtMV07Ci0JCQkJaWYgKGJ1ZjIgIT0gTlVMTCkgewotCQkJCQlkID0gKFVJTlQ4KilidWYyOwotCQkJCQliWzFdID0gZFswXTsKLQkJCQkJbGVuMi0tOwotCQkJCQlidWYyKys7Ci0JCQkJfQotCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgZGF0YSwgZGF0YXJlZyk7Ci0JCQl9Ci0JCQlpZiAoKGJ1ZjIgIT0gTlVMTCkgJiYgKGxlbjIgPiAwKSkgewotCQkJCS8qIFdyaXRlIGV2ZW4obGVuMikgYnVmIGNvbnRlbnRzIHRvIGRhdGEgcmVnICovCi0JCQkJZCA9IChVSU5UOCopYnVmMjsKLQkJCQlmb3IgKCBpID0gMDsgaSA8IChsZW4yICYgMHhmZmZlKTsgaSs9MiApIHsKLQkJCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCAqKFVJTlQxNiopKCYoZFtpXSkpLCBkYXRhcmVnKTsKLQkJCQl9Ci0JCQkJaWYgKGxlbjIgJiAxKSB7Ci0JCQkJCVVJTlQxNiBkYXRhOwotCQkJCQlVSU5UOCAqYiA9IChVSU5UOCAqKSAmZGF0YTsKLQkJCQkJYlswXSA9IGRbbGVuMi0xXTsKLQkJCQkJaWYgKGJ1ZjMgIT0gTlVMTCkgewotCQkJCQkJZCA9IChVSU5UOCopYnVmMzsKLQkJCQkJCWJbMV0gPSBkWzBdOwotCQkJCQkJbGVuMy0tOwotCQkJCQkJYnVmMysrOwotCQkJCQl9Ci0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgZGF0YSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoKGJ1ZjMgIT0gTlVMTCkgJiYgKGxlbjMgPiAwKSkgewotCQkJCS8qIFdyaXRlIGV2ZW4obGVuMykgYnVmIGNvbnRlbnRzIHRvIGRhdGEgcmVnICovCi0JCQkJZCA9IChVSU5UOCopYnVmMzsKLQkJCQlmb3IgKCBpID0gMDsgaSA8IChsZW4zICYgMHhmZmZlKTsgaSs9MiApIHsKLQkJCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCAqKFVJTlQxNiopKCYoZFtpXSkpLCBkYXRhcmVnKTsKLQkJCQl9Ci0JCQkJaWYgKGxlbjMgJiAxKSB7Ci0JCQkJCVVJTlQxNiBkYXRhOwotCQkJCQlVSU5UOCAqYiA9IChVSU5UOCAqKSAmZGF0YTsKLQkJCQkJYlswXSA9IGRbbGVuMy0xXTsKLQkJCQkJaWYgKGJ1ZjQgIT0gTlVMTCkgewotCQkJCQkJZCA9IChVSU5UOCopYnVmNDsKLQkJCQkJCWJbMV0gPSBkWzBdOwotCQkJCQkJbGVuNC0tOwotCQkJCQkJYnVmNCsrOwotCQkJCQl9Ci0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgZGF0YSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKChidWY0ICE9IE5VTEwpICYmIChsZW40ID4gMCkpIHsKLQkJCQkvKiBXcml0ZSBldmVuKGxlbjQpIGJ1ZiBjb250ZW50cyB0byBkYXRhIHJlZyAqLwotCQkJCWQgPSAoVUlOVDgqKWJ1ZjQ7Ci0JCQkJZm9yICggaSA9IDA7IGkgPCAobGVuNCAmIDB4ZmZmZSk7IGkrPTIgKSB7Ci0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgKihVSU5UMTYqKSgmKGRbaV0pKSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJCWlmIChsZW40ICYgMSkgewotCQkJCQlVSU5UMTYgZGF0YTsKLQkJCQkJVUlOVDggKmIgPSAoVUlOVDggKikgJmRhdGE7Ci0JCQkJCWJbMF0gPSBkW2xlbjQtMV07Ci0JCQkJCWJbMV0gPSAwOwotCi0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgZGF0YSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJfQotLy8JCQlwcmludGsoS0VSTl9ERUJVRyAiY3RiMiAlZCBpZCAlMDR4IG8gJWQgJWQgJWQgJWQgJWRcbiIsIGJhcCwgaWQsIG9mZnNldCwgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCk7Ci0KLQkJfQotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCQl1ZGVsYXkoNSk7Ci0JCS8qIFJlbGVhc2UgbG9jayAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotI2VuZGlmCi0KLQl9Ci0KLQlpZiAocmVzdWx0KQotCQlXTEFOX0xPR19FUlJPUigiY29weV90b19iYXAoKSBmYWlsZWQuXG4iKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jb3B5X2Zyb21fYXV4Ci0qCi0qIENvcGllcyBhIGNvbGxlY3Rpb24gb2YgYnl0ZXMgZnJvbSB0aGUgY29udHJvbGxlciBtZW1vcnkuICBUaGUKLSogQXV4aWxpYXJ5IHBvcnQgTVVTVCBiZSBlbmFibGVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSogV2UgX21pZ2h0XyBiZSBpbiBhIGRvd25sb2FkIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWNhcmRhZGRyCWFkZHJlc3MgaW4gaGZhMzg0eCBkYXRhIHNwYWNlIHRvIHJlYWQKLSoJYXV4Y3RsCQlhZGRyZXNzIHNwYWNlIHNlbGVjdAotKglidWYJCXB0ciB0byBkZXN0aW5hdGlvbiBob3N0IGJ1ZmZlcgotKglsZW4JCWxlbmd0aCBvZiBkYXRhIHRvIHRyYW5zZmVyIChpbiBieXRlcykKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCWJ1ZiBjb250YWlucyB0aGUgZGF0YSBjb3BpZWQKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZAotaGZhMzg0eF9jb3B5X2Zyb21fYXV4KAotCWhmYTM4NHhfdCAqaHcsIFVJTlQzMiBjYXJkYWRkciwgVUlOVDMyIGF1eGN0bCwgdm9pZCAqYnVmLCBVSU5UIGxlbikKLXsKLQlVSU5UMTYJCWN1cnJwYWdlOwotCVVJTlQxNgkJY3Vycm9mZnNldDsKLQlVSU5UCQlpID0gMDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCAhKGh3LT5hdXhlbikgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiQXR0ZW1wdCB0byByZWFkIDB4JTA0eCB3aGVuIGF1eCBub3QgZW5hYmxlZFxuIiwKLQkJCWNhcmRhZGRyKTsKLQkJcmV0dXJuOwotCi0JfQotCS8qIEJ1aWxkIGFwcHJvcHJpYXRlIGF1eCBwYWdlIGFuZCBvZmZzZXQgKi8KLQljdXJycGFnZSA9IEhGQTM4NHhfQVVYX01LUEFHRShjYXJkYWRkcik7Ci0JY3Vycm9mZnNldCA9IEhGQTM4NHhfQVVYX01LT0ZGKGNhcmRhZGRyLCBhdXhjdGwpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJycGFnZSwgSEZBMzg0eF9BVVhQQUdFKTsKLQloZmEzODR4X3NldHJlZyhodywgY3Vycm9mZnNldCwgSEZBMzg0eF9BVVhPRkZTRVQpOwotCXVkZWxheSg1KTsJLyogYmVhdCAqLwotCi0JLyogcmVhZCB0aGUgZGF0YSAqLwotCXdoaWxlICggaSA8IGxlbikgewotCQkqKChVSU5UMTYqKShidWYraSkpID0gaGZhMzg0eF9nZXRyZWdfbm9zd2FwKGh3LCBIRkEzODR4X0FVWERBVEEpOwotCQlpKz0yOwotCQljdXJyb2Zmc2V0Kz0yOwotCQlpZiAoIChjdXJyb2Zmc2V0JkhGQTM4NHhfQUREUl9BVVhfT0ZGX01BU0spID4KLQkJCUhGQTM4NHhfQUREUl9BVVhfT0ZGX01BWCApIHsKLQkJCWN1cnJwYWdlKys7Ci0JCQljdXJyb2Zmc2V0ID0gMDsKLQkJCWN1cnJvZmZzZXQgPSBIRkEzODR4X0FVWF9NS09GRihjdXJyb2Zmc2V0LCBhdXhjdGwpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJwYWdlLCBIRkEzODR4X0FVWFBBR0UpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJvZmZzZXQsIEhGQTM4NHhfQVVYT0ZGU0VUKTsKLQkJCXVkZWxheSg1KTsJLyogYmVhdCAqLwotCQl9Ci0JfQotCS8qIE1ha2Ugc3VyZSB0aGUgYXV4Y3RsIGJpdHMgYXJlIGNsZWFyICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfQVVYT0ZGU0VUKTsKLQlEQkZFWElUOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NvcHlfdG9fYXV4Ci0qCi0qIENvcGllcyBhIGNvbGxlY3Rpb24gb2YgYnl0ZXMgdG8gdGhlIGNvbnRyb2xsZXIgbWVtb3J5LiAgVGhlCi0qIEF1eGlsaWFyeSBwb3J0IE1VU1QgYmUgZW5hYmxlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0qIFdlIF9taWdodF8gYmUgaW4gYSBkb3dubG9hZCBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgljYXJkYWRkcglhZGRyZXNzIGluIGhmYTM4NHggZGF0YSBzcGFjZSB0byByZWFkCi0qCWF1eGN0bAkJYWRkcmVzcyBzcGFjZSBzZWxlY3QKLSoJYnVmCQlwdHIgdG8gZGVzdGluYXRpb24gaG9zdCBidWZmZXIKLSoJbGVuCQlsZW5ndGggb2YgZGF0YSB0byB0cmFuc2ZlciAoaW4gYnl0ZXMpCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglDb250cm9sbGVyIG1lbW9yeSBub3cgY29udGFpbnMgYSBjb3B5IG9mIGJ1ZgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkCi1oZmEzODR4X2NvcHlfdG9fYXV4KAotCWhmYTM4NHhfdCAqaHcsIFVJTlQzMiBjYXJkYWRkciwgVUlOVDMyIGF1eGN0bCwgdm9pZCAqYnVmLCBVSU5UIGxlbikKLXsKLQlVSU5UMTYJCWN1cnJwYWdlOwotCVVJTlQxNgkJY3Vycm9mZnNldDsKLQlVSU5UCQlpID0gMDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCAhKGh3LT5hdXhlbikgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiQXR0ZW1wdCB0byByZWFkIDB4JTA0eCB3aGVuIGF1eCBub3QgZW5hYmxlZFxuIiwKLQkJCWNhcmRhZGRyKTsKLQkJcmV0dXJuOwotCi0JfQotCS8qIEJ1aWxkIGFwcHJvcHJpYXRlIGF1eCBwYWdlIGFuZCBvZmZzZXQgKi8KLQljdXJycGFnZSA9IEhGQTM4NHhfQVVYX01LUEFHRShjYXJkYWRkcik7Ci0JY3Vycm9mZnNldCA9IEhGQTM4NHhfQVVYX01LT0ZGKGNhcmRhZGRyLCBhdXhjdGwpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJycGFnZSwgSEZBMzg0eF9BVVhQQUdFKTsKLQloZmEzODR4X3NldHJlZyhodywgY3Vycm9mZnNldCwgSEZBMzg0eF9BVVhPRkZTRVQpOwotCXVkZWxheSg1KTsJLyogYmVhdCAqLwotCi0JLyogd3JpdGUgdGhlIGRhdGEgKi8KLQl3aGlsZSAoIGkgPCBsZW4pIHsKLQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LAotCQkJKigoVUlOVDE2KikoYnVmK2kpKSwgSEZBMzg0eF9BVVhEQVRBKTsKLQkJaSs9MjsKLQkJY3Vycm9mZnNldCs9MjsKLQkJaWYgKCBjdXJyb2Zmc2V0ID4gSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFYICkgewotCQkJY3VycnBhZ2UrKzsKLQkJCWN1cnJvZmZzZXQgPSAwOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJwYWdlLCBIRkEzODR4X0FVWFBBR0UpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJvZmZzZXQsIEhGQTM4NHhfQVVYT0ZGU0VUKTsKLQkJCXVkZWxheSg1KTsJLyogYmVhdCAqLwotCQl9Ci0JfQotCURCRkVYSVQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX3dhaXQKLSoKLSogV2FpdHMgZm9yIGF2YWlsYWJpbGl0eSBvZiB0aGUgQ29tbWFuZCByZWdpc3RlciwgdGhlbgotKiBpc3N1ZXMgdGhlIGdpdmVuIGNvbW1hbmQuICBUaGVuIHBvbGxzIHRoZSBFdnN0YXQgcmVnaXN0ZXIKLSogd2FpdGluZyBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiAgVGltZW91dHMgc2hvdWxkbid0IGJlCi0qIHBvc3NpYmxlIHNpbmNlIHdlJ3JlIHByZXZlbnRpbmcgb3ZlcmxhcHBpbmcgY29tbWFuZHMgYW5kIGFsbAotKiBjb21tYW5kcyBzaG91bGQgYmUgY2xlYXJlZCBhbmQgYWNrbm93bGVkZ2VkLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCWRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgY21kICAgICAgICAgICAgIGNtZCBzdHJ1Y3R1cmUuICBJbmNsdWRlcyBhbGwgYXJndW1lbnRzIGFuZCByZXN1bHQKLSogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgcG9pbnRzLiAgQWxsIGluIGhvc3Qgb3JkZXIuCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJLUVUSU1FRE9VVAl0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVnaXN0ZXIgcmVhZHkgb3IKLSoJCQljb21tYW5kIGNvbXBsZXRpb24KLSoJPjAJCWNvbW1hbmQgaW5kaWNhdGVkIGVycm9yLCBTdGF0dXMgYW5kIFJlc3AwLTIgYXJlCi0qCQkJaW4gaHcgc3RydWN0dXJlLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBoZmEzODR4X2RvY21kX3dhaXQoIGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpCi17Ci0JaW50CQlyZXN1bHQgPSAtRVRJTUVET1VUOwotCVVJTlQxNgkJcmVnID0gMDsKLQlVSU5UMTYgICAgICAgICAgY291bnRlcjsKLQotCURCRkVOVEVSOwotCi0JaHctPmNtZGZsYWcgPSAwOwotCWh3LT5jbWRkYXRhID0gY21kOwotCi0JLyogd2FpdCBmb3IgdGhlIGJ1c3kgYml0IHRvIGNsZWFyICovCi0JY291bnRlciA9IDA7Ci0JcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQl3aGlsZSAoIEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpICYmCi0JCShjb3VudGVyIDwgMTApKSB7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NNRCk7Ci0JCWNvdW50ZXIrKzsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0KLQlpZiAoSEZBMzg0eF9DTURfSVNCVVNZKHJlZykpIHsKLQkJV0xBTl9MT0dfRVJST1IoImhmYTM4NHhfY21kIHRpbWVvdXQoMSksIHJlZz0weCUwaHguXG4iLCByZWcpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaWYgKCFIRkEzODR4X0NNRF9JU0JVU1kocmVnKSkgewotCQkvKiBidXN5IGJpdCBjbGVhciwgd3JpdGUgY29tbWFuZCAqLwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMCwgSEZBMzg0eF9QQVJBTTApOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMSwgSEZBMzg0eF9QQVJBTTEpOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMiwgSEZBMzg0eF9QQVJBTTIpOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5jbWQsIEhGQTM4NHhfQ01EKTsKLQotI2lmZGVmIENNRF9JUlEKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDIsMCkpCi0JCXdoaWxlICghIGh3LT5jbWRmbGFnKQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaHctPmNtZHEpOwotI2Vsc2UKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGh3LT5jbWRxLCBody0+Y21kZmxhZyk7Ci0jZW5kaWYKLQkJcmVzdWx0ID0gSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVChjbWQtPnN0YXR1cyk7Ci0jZWxzZSAvLyBDTURfSVJRCi0JCS8qIE5vdyB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCWNvdW50ZXIgPSAwOwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCQkvKiBJbml0aWFsaXphdGlvbiBpcyB0aGUgcHJvYmxlbS4gIEl0IHRha2VzIGFib3V0Ci0gICAgICAgICAgICAgICAgICAgMTAwbXMuICJub3JtYWwiIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgaXMgYWJvdXQKLSAgICAgICAgICAgICAgICAgICAyMDAtNDAwIHVzIChJJ3ZlIG5ldmVyIHNlZW4gbGVzcyB0aGFuIDIwMCkuICBMb25nZXIKLSAgICAgICAgICAgICAgICAgICBpcyBiZXR0ZXIgc28gdGhhdCB3ZSdyZSBub3QgaGFtbWVyaW5nIHRoZSBidXMuICovCi0JCXdoaWxlICggIUhGQTM4NHhfRVZTVEFUX0lTQ01EKHJlZykgJiYKLQkJCShjb3VudGVyIDwgNTAwMCkpIHsKLQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0JCQljb3VudGVyKys7Ci0JCQl1ZGVsYXkoMjAwKTsKLQkJfQotCi0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSApIHsKLQkJCXJlc3VsdCA9IDA7Ci0JCQljbWQtPnJlc3VsdC5zdGF0dXMgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9TVEFUVVMpOwotCQkJY21kLT5yZXN1bHQucmVzcDAgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMCk7Ci0JCQljbWQtPnJlc3VsdC5yZXNwMSA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AxKTsKLQkJCWNtZC0+cmVzdWx0LnJlc3AyID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDIpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfQ01ELAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQkJcmVzdWx0ID0gSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVChjbWQtPnJlc3VsdC5zdGF0dXMpOwotCQl9IGVsc2UgewotCQkJV0xBTl9MT0dfRVJST1IoImhmYTM4NHhfY21kIHRpbWVvdXQoMiksIHJlZz0weCUwaHguXG4iLCByZWcpOwotCQl9Ci0jZW5kaWYgIC8qIENNRF9JUlEgKi8KLQl9Ci0KLSBmYWlsZWQ6Ci0JaHctPmNtZGZsYWcgPSAwOwotCWh3LT5jbWRkYXRhID0gTlVMTDsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kbF9kb2NtZF93YWl0Ci0qCi0qIFdhaXRzIGZvciBhdmFpbGFiaWxpdHkgb2YgdGhlIENvbW1hbmQgcmVnaXN0ZXIsIHRoZW4KLSogaXNzdWVzIHRoZSBnaXZlbiBjb21tYW5kLiAgVGhlbiBwb2xscyB0aGUgRXZzdGF0IHJlZ2lzdGVyCi0qIHdhaXRpbmcgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gIFRpbWVvdXRzIHNob3VsZG4ndCBiZQotKiBwb3NzaWJsZSBzaW5jZSB3ZSdyZSBwcmV2ZW50aW5nIG92ZXJsYXBwaW5nIGNvbW1hbmRzIGFuZCBhbGwKLSogY29tbWFuZHMgc2hvdWxkIGJlIGNsZWFyZWQgYW5kIGFja25vd2xlZGdlZC4KLSoKLSogVGhpcyByb3V0aW5lIGlzIG9ubHkgdXNlZCBmb3IgZG93bmxvYWRzLiAgU2luY2UgaXQgZG9lc24ndCBsb2NrIG91dAotKiBpbnRlcnJ1cHRzIHRoZSBzeXN0ZW0gcmVzcG9uc2UgaXMgbXVjaCBiZXR0ZXIuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICBjbWQgICAgICAgICAgICAgY21kIHN0cnVjdHVyZS4gIEluY2x1ZGVzIGFsbCBhcmd1bWVudHMgYW5kIHJlc3VsdAotKiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBwb2ludHMuICBBbGwgaW4gaG9zdCBvcmRlci4KLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgktRVRJTUVET1VUCXRpbWVkIG91dCB3YWl0aW5nIGZvciByZWdpc3RlciByZWFkeSBvcgotKgkJCWNvbW1hbmQgY29tcGxldGlvbgotKgk+MAkJY29tbWFuZCBpbmRpY2F0ZWQgZXJyb3IsIFN0YXR1cyBhbmQgUmVzcDAtMiBhcmUKLSoJCQlpbiBodyBzdHJ1Y3R1cmUuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGhmYTM4NHhfZGxfZG9jbWRfd2FpdCggaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCkKLXsKLQlpbnQJCXJlc3VsdCA9IC1FVElNRURPVVQ7Ci0JdW5zaWduZWQgbG9uZwl0aW1lb3V0OwotCVVJTlQxNgkJcmVnID0gMDsKLQotCURCRkVOVEVSOwotCS8qIHdhaXQgZm9yIHRoZSBidXN5IGJpdCB0byBjbGVhciAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgMSpIWjsKLQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCXdoaWxlICggSEZBMzg0eF9DTURfSVNCVVNZKHJlZykgJiYgdGltZV9iZWZvcmUoIGppZmZpZXMsIHRpbWVvdXQpICkgewotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCQl1ZGVsYXkoMTApOwotCX0KLQlpZiAoSEZBMzg0eF9DTURfSVNCVVNZKHJlZykpIHsKLQkJV0xBTl9MT0dfV0FSTklORygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGNtZCByZWdpc3Rlci5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlpZiAoIUhGQTM4NHhfQ01EX0lTQlVTWShyZWcpKSB7Ci0JCS8qIGJ1c3kgYml0IGNsZWFyLCB3cml0ZSBjb21tYW5kICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0wLCBIRkEzODR4X1BBUkFNMCk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0xLCBIRkEzODR4X1BBUkFNMSk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0yLCBIRkEzODR4X1BBUkFNMik7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPmNtZCwgSEZBMzg0eF9DTUQpOwotCi0JCS8qIE5vdyB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCWlmICggKEhGQTM4NHhfQ01EX0NNRENPREVfR0VUKGNtZC0+Y21kKSA9PSBIRkEzODR4X0NNRENPREVfRE9XTkxEKSApIHsKLQkJCS8qIGRsdGltZW91dCBpcyBpbiBtcyAqLwotCQkJdGltZW91dCA9ICgoKFVJTlQzMilody0+ZGx0aW1lb3V0KSAvIDEwMDBVTCkgKiBIWjsKLQkJCWlmICggdGltZW91dCA+IDAgKSB7Ci0JCQkJdGltZW91dCArPSBqaWZmaWVzOwotCQkJfSBlbHNlIHsKLQkJCQl0aW1lb3V0ID0gamlmZmllcyArIDEqSFo7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aW1lb3V0ID0gamlmZmllcyArIDEqSFo7Ci0JCX0KLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQkJd2hpbGUgKCAhSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLHRpbWVvdXQpICkgewotCQkJdWRlbGF5KDEwMCk7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCQl9Ci0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSApIHsKLQkJCXJlc3VsdCA9IDA7Ci0JCQljbWQtPnJlc3VsdC5zdGF0dXMgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9TVEFUVVMpOwotCQkJY21kLT5yZXN1bHQucmVzcDAgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMCk7Ci0JCQljbWQtPnJlc3VsdC5yZXNwMSA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AxKTsKLQkJCWNtZC0+cmVzdWx0LnJlc3AyID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDIpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfQ01ELCBIRkEzODR4X0VWQUNLKTsKLQkJCXJlc3VsdCA9IEhGQTM4NHhfU1RBVFVTX1JFU1VMVF9HRVQoY21kLT5yZXN1bHQuc3RhdHVzKTsKLQkJfQotCX0KLQotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9zdGFydAotKgotKiBJc3N1ZXMgdGhlIE1BQyBpbml0aWFsaXplIGNvbW1hbmQsIHNldHMgdXAgc29tZSBkYXRhIHN0cnVjdHVyZXMsCi0qIGFuZCBlbmFibGVzIHRoZSBpbnRlcnJ1cHRzLiAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMsIHRoZQotKiBsb3ctbGV2ZWwgc3R1ZmYgc2hvdWxkIGJlIHJlYWR5IGZvciBhbnkvYWxsIGNvbW1hbmRzLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3N0YXJ0KGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JVUlOVDE2CQkJcmVnOwotCWludAkJCWk7Ci0JaW50CQkJajsKLQlEQkZFTlRFUjsKLQotCS8qIGNhbGwgaW5pdGlhbGl6ZSAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlXTEFOX0xPR19FUlJPUigiSW5pdGlhbGl6ZSBjb21tYW5kIGZhaWxlZC5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIGFueSBsYXlhYm91dCBldmVudHMgY2xlYXJlZCAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X0lOVEVOKTsKLQloZmEzODR4X3NldHJlZyhodywgMHhmZmZmLCBIRkEzODR4X0VWQUNLKTsKLQotICAgICAgICBody0+dHhmaWRfaGVhZCA9IDA7Ci0gICAgICAgIGh3LT50eGZpZF90YWlsID0gMDsKLSAgICAgICAgaHctPnR4ZmlkX04gPSBIRkEzODR4X0RSVlJfRklEU1RBQ0tMRU5fTUFYOwotICAgICAgICBtZW1zZXQoaHctPnR4ZmlkX3F1ZXVlLCAwLCBzaXplb2YoaHctPnR4ZmlkX3F1ZXVlKSk7Ci0KLQkvKiBBbGxvY2F0ZSB0eCBhbmQgbm90aWZ5IEZJRHMgKi8KLQkvKiBGaXJzdCwgdHggKi8KLQlmb3IgKCBpID0gMDsgaSA8IEhGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVgtMTsgaSsrKSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2FsbG9jYXRlKGh3LCBIRkEzODR4X0RSVlJfVFhCVUZfTUFYKTsKLQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiQWxsb2NhdGUodHgpIGNvbW1hbmQgZmFpbGVkLlxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlqID0gMDsKLQkJZG8gewotCQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQlqKys7Ci0JCX0gd2hpbGUgKCAhSEZBMzg0eF9FVlNUQVRfSVNBTExPQyhyZWcpICYmIGogPCA1MCk7IC8qIDUwIGlzIHRpbWVvdXQgKi8KLQkJaWYgKCBqID49IDUwICkgewotCQkJV0xBTl9MT0dfRVJST1IoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBldmFsbG9jKHR4KS5cbiIpOwotCQkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0FMTE9DRklEKTsKLQotCQl0eGZpZF9xdWV1ZV9hZGQoaHcsIHJlZyk7Ci0KLQkJV0xBTl9MT0dfREVCVUcoNCwiaHctPnR4ZmlkX3F1ZXVlWyVkXT0weCUwNHhcbiIsaSxyZWcpOwotCi0JCXJlZyA9IEhGQTM4NHhfRVZBQ0tfQUxMT0NfU0VUKDEpOwotCQloZmEzODR4X3NldHJlZyhodywgcmVnLCBIRkEzODR4X0VWQUNLKTsKLQotCX0KLQotCS8qIE5vdywgdGhlIGluZm8gZnJhbWUgZmlkICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfYWxsb2NhdGUoaHcsIEhGQTM4NHhfSU5GT0ZSTV9NQVhMRU4pOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlXTEFOX0xPR19FUlJPUigiQWxsb2NhdGUodHgpIGNvbW1hbmQgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlpID0gMDsKLQlkbyB7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0JCXVkZWxheSgxMCk7Ci0JCWkrKzsKLQl9IHdoaWxlICggIUhGQTM4NHhfRVZTVEFUX0lTQUxMT0MocmVnKSAmJiBpIDwgNTApOyAvKiA1MCBpcyB0aW1lb3V0ICovCi0JaWYgKCBpID49IDUwICkgewotCQlXTEFOX0xPR19FUlJPUigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGV2YWxsb2MoaW5mbykuXG4iKTsKLQkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWh3LT5pbmZvZmlkID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQUxMT0NGSUQpOwotCXJlZyA9IEhGQTM4NHhfRVZBQ0tfQUxMT0NfU0VUKDEpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCByZWcsIEhGQTM4NHhfRVZBQ0spOwotCVdMQU5fTE9HX0RFQlVHKDQsImh3LT5pbmZvZmlkPTB4JTA0eFxuIiwgaHctPmluZm9maWQpOwotCi0JLyogU2V0IHN3c3VwcG9ydCByZWdzIHRvIG1hZ2ljICMgZm9yIGNhcmQgcHJlc2VuY2UgZGV0ZWN0aW9uICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRFJWUl9NQUdJQywgSEZBMzg0eF9TV1NVUFBPUlQwKTsKLQotCS8qIE5vdyBlbmFibGUgdGhlIGludGVycnVwdHMgYW5kIHNldCB0aGUgcnVubmluZyBzdGF0ZSAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAweGZmZmYsIEhGQTM4NHhfRVZTVEFUKTsKLQloZmEzODR4X2V2ZW50c19hbGwoaHcpOwotCi0JaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9SVU5OSU5HOwotCi0JZ290byBkb25lOwotZmFpbGVkOgotCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQsIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKLWRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfc3RvcAotKgotKiBJc3N1ZXMgdGhlIGluaXRpYWxpemUgY29tbWFuZCB0byBsZWF2ZSB1cyBpbiB0aGUgJ3Jlc2V0JyBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zdG9wKGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaW50IGk7Ci0JREJGRU5URVI7Ci0KLQlkZWxfdGltZXJfc3luYygmaHctPmNvbW1zcXVhbF90aW1lcik7Ci0KLQlpZiAoIGh3LT53bGFuZGV2LT5od3JlbW92ZWQgKSB7Ci0JCS8qIG9ubHkgZmx1c2ggd2hlbiB3ZSdyZSBzaHV0dGluZyBkb3duIGZvciBnb29kICovCi0JCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JfQotCi0JaWYgKGh3LT5zdGF0ZSA9PSBIRkEzODR4X1NUQVRFX1JVTk5JTkcpIHsKLQkJLyoKLQkJICogU2VuZCB0aGUgTUFDIGluaXRpYWxpemUgY21kLgotCQkgKi8KLQkJaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShodyk7Ci0KLQkJLyoKLQkJICogTWFrZSBhYnNvbHV0ZWx5IHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIGFueQotCQkgKiBsYXlhYm91dCBldmVudHMgY2xlYXJlZAotCQkgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfSU5URU4pOwotCQloZmEzODR4X3NldHJlZyhodywgMHhmZmZmLCBIRkEzODR4X0VWQUNLKTsKLQl9Ci0KLQl0YXNrbGV0X2tpbGwoJmh3LT5iYXBfdGFza2xldCk7Ci0KLQlody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVEOwotCWh3LT5zdGF0ZSA9IEhGQTM4NHhfU1RBVEVfSU5JVDsKLQotCS8qIENsZWFyIGFsbCB0aGUgcG9ydCBzdGF0dXMgKi8KLQlmb3IgKCBpID0gMDsgaSA8IEhGQTM4NHhfTlVNUE9SVFNfTUFYOyBpKyspIHsKLQkJaHctPnBvcnRfZW5hYmxlZFtpXSA9IDA7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfdHhmcmFtZQotKgotKiBUYWtlcyBhIGZyYW1lIGZyb20gcHJpc20yc3RhIGFuZCBxdWV1ZXMgaXQgZm9yIHRyYW5zbWlzc2lvbi4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglza2IJCXBhY2tldCBidWZmZXIgc3RydWN0LiAgQ29udGFpbnMgYW4gODAyLjExCi0qCQkJZGF0YSBmcmFtZS4KLSogICAgICAgcDgwMjExX2hkciAgICAgIHBvaW50cyB0byB0aGUgODAyLjExIGhlYWRlciBmb3IgdGhlIHBhY2tldC4KLSogUmV0dXJuczoKLSoJMAkJU3VjY2VzcyBhbmQgbW9yZSBidWZmcyBhdmFpbGFibGUKLSoJMQkJU3VjY2VzcyBidXQgbm8gbW9yZSBidWZmcwotKgkyCQlBbGxvY2F0aW9uIGZhaWx1cmUKLSoJMwkJTUFDIFR4IGNvbW1hbmQgZmFpbGVkCi0qCTQJCUJ1ZmZlciBmdWxsIG9yIHF1ZXVlIGJ1c3kKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfdHhmcmFtZShoZmEzODR4X3QgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwODAyMTFfaGRyX3QgKnA4MDIxMV9oZHIsIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXApCi17Ci0JaGZhMzg0eF90eF9mcmFtZV90CXR4ZGVzYzsKLQlVSU5UMTYJCQltYWNxID0gMDsKLQlVSU5UMTYJCQlmaWQ7Ci0JaW50CQkJcmVzdWx0OwotCi0JREJGRU5URVI7Ci0KLQkvKiBCdWlsZCBUeCBmcmFtZSBzdHJ1Y3R1cmUgKi8KLQkvKiBTZXQgdXAgdGhlIGNvbnRyb2wgZmllbGQgKi8KLQltZW1zZXQoJnR4ZGVzYywgMCwgc2l6ZW9mKHR4ZGVzYykpOwotCi0vKiBUeCBjb21wbGV0ZSBhbmQgVHggZXhjZXB0aW9uIGRpc2FibGUgcGVyIGRsZWFjaC4gIE1pZ2h0IGJlIGNhdXNpbmcKLSAqIGJ1ZiBkZXBsZXRpb24KLSAqLwotI2RlZmluZSBET0JPVEggMQotI2lmIERPQk9USAotCXR4ZGVzYy50eF9jb250cm9sID0KLQkJSEZBMzg0eF9UWF9NQUNQT1JUX1NFVCgwKSB8IEhGQTM4NHhfVFhfU1RSVUNUWVBFX1NFVCgxKSB8Ci0JCUhGQTM4NHhfVFhfVFhFWF9TRVQoMSkgfCBIRkEzODR4X1RYX1RYT0tfU0VUKDEpOwotI2VsaWYgRE9FWEMKLQl0eGRlc2MudHhfY29udHJvbCA9Ci0JCUhGQTM4NHhfVFhfTUFDUE9SVF9TRVQoMCkgfCBIRkEzODR4X1RYX1NUUlVDVFlQRV9TRVQoMSkgfAotCQlIRkEzODR4X1RYX1RYRVhfU0VUKDEpIHwgSEZBMzg0eF9UWF9UWE9LX1NFVCgwKTsKLSNlbHNlCi0JdHhkZXNjLnR4X2NvbnRyb2wgPQotCQlIRkEzODR4X1RYX01BQ1BPUlRfU0VUKDApIHwgSEZBMzg0eF9UWF9TVFJVQ1RZUEVfU0VUKDEpIHwKLQkJSEZBMzg0eF9UWF9UWEVYX1NFVCgwKSB8IEhGQTM4NHhfVFhfVFhPS19TRVQoMCk7Ci0jZW5kaWYKLQotCS8qIGlmIHdlJ3JlIHVzaW5nIGhvc3QgV0VQLCBpbmNyZWFzZSBzaXplIGJ5IElWK0lDViAqLwotCWlmIChwODAyMTFfd2VwLT5kYXRhKSB7Ci0JCXR4ZGVzYy5kYXRhX2xlbiA9IGhvc3QyaGZhMzg0eF8xNihza2ItPmxlbis4KTsKLQkJLy8JCXR4ZGVzYy50eF9jb250cm9sIHw9IEhGQTM4NHhfVFhfTk9FTkNSWVBUX1NFVCgxKTsKLQl9IGVsc2UgewotCQl0eGRlc2MuZGF0YV9sZW4gPSAgaG9zdDJoZmEzODR4XzE2KHNrYi0+bGVuKTsKLQl9Ci0KLQl0eGRlc2MudHhfY29udHJvbCA9IGhvc3QyaGZhMzg0eF8xNih0eGRlc2MudHhfY29udHJvbCk7Ci0JLyogY29weSB0aGUgaGVhZGVyIG92ZXIgdG8gdGhlIHR4ZGVzYyAqLwotCW1lbWNweSgmKHR4ZGVzYy5mcmFtZV9jb250cm9sKSwgcDgwMjExX2hkciwgc2l6ZW9mKHA4MDIxMV9oZHJfdCkpOwotCi0JLyogU2luY2UgdGJ1c3kgaXMgc2V0IHdoZW5ldmVyIHRoZSBzdGFjayBpcyBlbXB0eSwgdGhlcmUgc2hvdWxkCi0JICogYWx3YXlzIGJlIHNvbWV0aGluZyBvbiB0aGUgc3RhY2sgaWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQuCi0JICogW01TTV06IE5PVCBUUlVFISEhISEgc28gSSBhZGRlZCB0aGUgdGVzdCBvZiBmaWQgYmVsb3cuCi0JICovCi0KLQkvKiBBbGxvY2F0ZSBGSUQgKi8KLQotCWZpZCA9IHR4ZmlkX3F1ZXVlX3JlbW92ZShodyk7Ci0KLQlpZiAoIGZpZCA9PSAwICkgeyAvKiBzdGFjayBvciBxdWV1ZSB3YXMgZW1wdHkgKi8KLQkJcmV0dXJuIDQ7Ci0JfQotCi0JLyogbm93IGxldCdzIGdldCB0aGUgY21kbG9jayAqLwotCXNwaW5fbG9jaygmaHctPmNtZGxvY2spOwotCi0JLyogQ29weSBkZXNjcmlwdG9yK3BheWxvYWQgdG8gRklEICovCi0gICAgICAgIGlmIChwODAyMTFfd2VwLT5kYXRhKSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29weV90b19iYXA0KGh3LCBIRkEzODR4X0JBUF9QUk9DLCBmaWQsIDAsCi0JCQkJCSAgICAgICZ0eGRlc2MsIHNpemVvZih0eGRlc2MpLAotCQkJCQkgICAgICBwODAyMTFfd2VwLT5pdiwgc2l6ZW9mKHA4MDIxMV93ZXAtPml2KSwKLQkJCQkJICAgICAgcDgwMjExX3dlcC0+ZGF0YSwgc2tiLT5sZW4sCi0JCQkJCSAgICAgIHA4MDIxMV93ZXAtPmljdiwgc2l6ZW9mKHA4MDIxMV93ZXAtPmljdikpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29weV90b19iYXA0KGh3LCBIRkEzODR4X0JBUF9QUk9DLCBmaWQsIDAsCi0JCQkJCSAgICAgICZ0eGRlc2MsIHNpemVvZih0eGRlc2MpLAotCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLAotCQkJCQkgICAgICBOVUxMLCAwLCBOVUxMLCAwKTsKLQl9Ci0KLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X3RvX2JhcCglMDR4LCAlZCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlmaWQsCi0JCSAJc2l6ZW9mKHR4ZGVzYyksCi0JIAkJc2tiLT5sZW4sCi0JCQlyZXN1bHQpOwotCi0JCS8qIHB1dCB0aGUgZmlkIGJhY2sgaW4gdGhlIHF1ZXVlICovCi0JCXR4ZmlkX3F1ZXVlX2FkZChodywgZmlkKTsKLQotCQlyZXN1bHQgPSAzOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBJc3N1ZSBUeCBjb21tYW5kICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfdHJhbnNtaXQoaHcsIEhGQTM4NHhfVFhDTURfUkVDTCwgbWFjcSwgZmlkKTsKLQotCWlmICggcmVzdWx0ICE9IDAgKSB7Ci0JCXR4ZmlkX3F1ZXVlX2FkZChodywgZmlkKTsKLQotCQlXTEFOX0xPR19ERUJVRygxLCJjbWRfdHgoJTA0eCkgZmFpbGVkLCByZXN1bHQ9JWRcbiIsCi0JCQlmaWQsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IDM7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIGluZGljYXRlIHdlIGhhdmVuJ3QgYW55IGJ1ZmZlcnMsIGludF9hbGxvYyB3aWxsIGNsZWFyICovCi0JcmVzdWx0ID0gdHhmaWRfcXVldWVfZW1wdHkoaHcpOwotZmFpbGVkOgotCi0Jc3Bpbl91bmxvY2soJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50ZXJydXB0Ci0qCi0qIERyaXZlciBpbnRlcnJ1cHQgaGFuZGxlci4KLSoKLSogQXJndW1lbnRzOgotKglpcnEJCWlycSBudW1iZXIKLSoJZGV2X2lkCQlwb2ludGVyIHRvIHRoZSBkZXZpY2UKLSoJcmVncwkJcmVnaXN0ZXJzCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglNYXkgcmVzdWx0IGluIGEgZnJhbWUgYmVpbmcgcGFzc2VkIHVwIHRoZSBzdGFjayBvciBhbiBpbmZvCi0qCWZyYW1lIGJlaW5nIGhhbmRsZWQuCi0qCi0qIENhbGwgY29udGV4dDoKLSoJVW1tbSwgY291bGQgaXQgYmUgaW50ZXJydXB0PwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pcnFyZXR1cm5fdCBoZmEzODR4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQgUFRfUkVHUykKLXsKLQlpbnQJCQlyZWc7Ci0Jd2xhbmRldmljZV90CQkqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QqKWRldl9pZDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JaW50CQkJZXZfcmVhZCA9IDA7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIXdsYW5kZXYgfHwgd2xhbmRldi0+aHdyZW1vdmVkKQotCQlyZXR1cm4gSVJRX05PTkU7ICAvKiBOb3QgbXVjaCB3ZSBjYW4gZG8gdy9vIGhhcmR3YXJlICovCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotCWlmIChody0+aW9iYXNlID09IDApICAvKiBYWFggRklYTUUgUHJvcGVybHkgKi8KLQkJcmV0dXJuIElSUV9OT05FOwotI2VuZGlmCi0KLQlmb3IgKDs7ZXZfcmVhZCsrKSB7Ci0JCWlmIChldl9yZWFkID49IHByaXNtMl9pcnFfZXZyZWFkX21heCkKLQkJCWJyZWFrOwotCi0JCS8qIENoZWNrIHN3c3VwcG9ydCByZWcgbWFnaWMgIyBmb3IgY2FyZCBwcmVzZW5jZSAqLwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9TV1NVUFBPUlQwKTsKLQkJaWYgKCByZWcgIT0gSEZBMzg0eF9EUlZSX01BR0lDKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygyLCAiaXJxPSVkLCBubyBtYWdpYy4gIENhcmQgcmVtb3ZlZD8uXG4iLCBpcnEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiByZWFkIHRoZSBFdlN0YXQgcmVnaXN0ZXIgZm9yIGludGVycnVwdCBlbmFibGVkIGV2ZW50cyAqLwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCi0JCS8qIEFORCB3aXRoIHRoZSBlbmFibGVkIGludGVycnVwdHMgKi8KLQkJcmVnICY9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0lOVEVOKTsKLQotCQkvKiBIYW5kbGUgdGhlIGV2ZW50cyAqLwotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTV1RFUlIocmVnKSApewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkiRXJyb3I6IFdURVJSIGludGVycnVwdCByZWNlaXZlZCAodW5oYW5kbGVkKS5cbiIpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfV1RFUlJfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0lORkRST1AocmVnKSApewotCQkJaGZhMzg0eF9pbnRfaW5mZHJvcCh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0lORkRST1BfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0KLQkJaWYgKEhGQTM4NHhfRVZTVEFUX0lTQkFQX09QKHJlZykpIHsKLQkJCS8qIERpc2FibGUgdGhlIEJBUCBpbnRlcnJ1cHRzICovCi0JCQloZmEzODR4X2V2ZW50c19ub2JhcChodyk7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZody0+YmFwX3Rhc2tsZXQpOwotCQl9Ci0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0FMTE9DKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X2FsbG9jKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfQUxMT0NfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0RUSU0ocmVnKSApewotCQkJaGZhMzg0eF9pbnRfZHRpbSh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0RUSU1fU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0jaWZkZWYgQ01EX0lSUQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTQ01EKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X2NtZCh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0NNRF9TRVQoMSksCi0JCQkJICAgICAgIEhGQTM4NHhfRVZBQ0spOwotCQl9Ci0jZW5kaWYKLQotCQkvKiBhbGxvdyB0aGUgZXZzdGF0IHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGV2YWNrICovCi0JCXVkZWxheSgyMCk7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLSNpZmRlZiBDTURfSVJRCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfY21kCi0qCi0qIEhhbmRsZXMgY29tbWFuZCBjb21wbGV0aW9uIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoZmEzODR4X2ludF9jbWQod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlEQkZFTlRFUjsKLQotCS8vIGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIHRoZSByaWdodCBjb21tYW5kPwotCWlmIChody0+Y21kZGF0YSkgewotCQlody0+Y21kZGF0YS0+c3RhdHVzID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfU1RBVFVTKTsKLQkJaHctPmNtZGRhdGEtPnJlc3AwID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDApOwotCQlody0+Y21kZGF0YS0+cmVzcDEgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMSk7Ci0JCWh3LT5jbWRkYXRhLT5yZXNwMiA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AyKTsKLQl9Ci0JaHctPmNtZGZsYWcgPSAxOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidW0uIGludF9jbWRcbiIpOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZody0+Y21kcSk7Ci0KLQkvLyBYWFhYIHBlcmZvcm0gYSBiYXAgY29weSB0b28/Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfZHRpbQotKgotKiBIYW5kbGVzIHRoZSBEVElNIGVhcmx5IHdhcm5pbmcgZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9kdGltKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLSNpZiAwCi0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotI2VuZGlmCi0JREJGRU5URVI7Ci0JcHJpc20yc3RhX2V2X2R0aW0od2xhbmRldik7Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X2luZmRyb3AKLSoKLSogSGFuZGxlcyB0aGUgSW5mRHJvcCBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X2luZmRyb3Aod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotI2lmIDAKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0jZW5kaWYKLQlEQkZFTlRFUjsKLQlwcmlzbTJzdGFfZXZfaW5mZHJvcCh3bGFuZGV2KTsKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfaW5mbwotKgotKiBIYW5kbGVzIHRoZSBJbmZvIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKgl0YXNrbGV0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQlyZWc7Ci0JaGZhMzg0eF9JbmZGcmFtZV90CWluZjsKLQlpbnQJCQlyZXN1bHQ7Ci0JREJGRU5URVI7Ci0JLyogUmV0cmlldmUgdGhlIEZJRCAqLwotCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0lORk9GSUQpOwotCi0JLyogUmV0cmlldmUgdGhlIGxlbmd0aCAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcCggaHcsCi0JCUhGQTM4NHhfQkFQX0lOVCwgcmVnLCAwLCAmaW5mLmZyYW1lbGVuLCBzaXplb2YoVUlOVDE2KSk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiY29weV9mcm9tX2JhcCgweCUwNHgsIDAsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJcmVnLCBzaXplb2YoaW5mKSwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWluZi5mcmFtZWxlbiA9IGhmYTM4NHgyaG9zdF8xNihpbmYuZnJhbWVsZW4pOwotCi0JLyogUmV0cmlldmUgdGhlIHJlc3QgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoIGh3LAotCQlIRkEzODR4X0JBUF9JTlQsIHJlZywgc2l6ZW9mKFVJTlQxNiksCi0JCSYoaW5mLmluZm90eXBlKSwgaW5mLmZyYW1lbGVuICogc2l6ZW9mKFVJTlQxNikpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfZnJvbV9iYXAoMHglMDR4LCAwLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCXJlZywgc2l6ZW9mKGluZiksIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCXByaXNtMnN0YV9ldl9pbmZvKHdsYW5kZXYsICZpbmYpOwotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF90eGV4YwotKgotKiBIYW5kbGVzIHRoZSBUeEV4YyBldmVudC4gIEEgVHJhbnNtaXQgRXhjZXB0aW9uIGV2ZW50IGluZGljYXRlcwotKiB0aGF0IHRoZSBNQUMncyBUWCBwcm9jZXNzIHdhcyB1bnN1Y2Nlc3NmdWwgLSBzbyB0aGUgcGFja2V0IGRpZAotKiBub3QgZ2V0IHRyYW5zbWl0dGVkLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKgl0YXNrbGV0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJc3RhdHVzOwotCVVJTlQxNgkJCWZpZDsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCURCRkVOVEVSOwotCS8qIENvbGxlY3QgdGhlIHN0YXR1cyBhbmQgZGlzcGxheSAqLwotCWZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1RYQ09NUExGSUQpOwotCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcChodywgSEZBMzg0eF9CQVBfSU5ULCBmaWQsIDAsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgMCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlmaWQsIHNpemVvZihzdGF0dXMpLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0Jc3RhdHVzID0gaGZhMzg0eDJob3N0XzE2KHN0YXR1cyk7Ci0JcHJpc20yc3RhX2V2X3R4ZXhjKHdsYW5kZXYsIHN0YXR1cyk7Ci1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X3R4Ci0qCi0qIEhhbmRsZXMgdGhlIFR4IGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKgl0YXNrbGV0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJZmlkOwotCVVJTlQxNgkJCXN0YXR1czsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCURCRkVOVEVSOwotCWZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1RYQ09NUExGSUQpOwotCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcChodywgSEZBMzg0eF9CQVBfSU5ULCBmaWQsIDAsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgMCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlmaWQsIHNpemVvZihzdGF0dXMpLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0Jc3RhdHVzID0gaGZhMzg0eDJob3N0XzE2KHN0YXR1cyk7Ci0JcHJpc20yc3RhX2V2X3R4KHdsYW5kZXYsIHN0YXR1cyk7Ci1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF9yeAotKgotKiBIYW5kbGVzIHRoZSBSeCBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJdGFza2xldAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCXJ4ZmlkOwotCWhmYTM4NHhfcnhfZnJhbWVfdAlyeGRlc2M7Ci0JaW50CQkJcmVzdWx0OwotCWludCAgICAgICAgICAgICAgICAgICAgIGhkcmxlbjsKLQlVSU5UMTYgICAgICAgICAgICAgICAgICBmYzsKLQlwODAyMTFfcnhtZXRhX3QJKnJ4bWV0YTsKLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiID0gTlVMTDsKLQlVSU5UOCAqZGF0YXA7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEdldCB0aGUgRklEICovCi0JcnhmaWQgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SWEZJRCk7Ci0JLyogR2V0IHRoZSBkZXNjcmlwdG9yIChpbmNsdWRpbmcgaGVhZGVycykgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsCi0JCQlIRkEzODR4X0JBUF9JTlQsCi0JCQlyeGZpZCwKLQkJCTAsCi0JCQkmcnhkZXNjLAotCQkJc2l6ZW9mKHJ4ZGVzYykpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfZnJvbV9iYXAoMHglMDR4LCAlZCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlyeGZpZCwKLQkJCTAsCi0JCQlzaXplb2YocnhkZXNjKSwKLQkJCXJlc3VsdCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBCeXRlIG9yZGVyIGNvbnZlcnQgb25jZSB1cCBmcm9udC4gKi8KLQlyeGRlc2Muc3RhdHVzID0JaGZhMzg0eDJob3N0XzE2KHJ4ZGVzYy5zdGF0dXMpOwotCXJ4ZGVzYy50aW1lID0JaGZhMzg0eDJob3N0XzMyKHJ4ZGVzYy50aW1lKTsKLQotCS8qIGRyb3AgZXJyb3JzIGFuZCB3aGF0bm90IGluIHByb21pc2MgbW9kZSAqLwotCWlmICgoIHdsYW5kZXYtPm5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApICYmCi0JICAgIChIRkEzODR4X1JYU1RBVFVTX0lTRkNTRVJSKHJ4ZGVzYy5zdGF0dXMpIHx8Ci0JICAgICBIRkEzODR4X1JYU1RBVFVTX0lTVU5ERUNSKHJ4ZGVzYy5zdGF0dXMpKSkKLQkgIGdvdG8gZG9uZTsKLQotCS8qIE5vdyBoYW5kbGUgZnJhbWUgYmFzZWQgb24gcG9ydCMgKi8KLQlzd2l0Y2goIEhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9HRVQocnhkZXNjLnN0YXR1cykgKQotCXsKLQljYXNlIDA6Ci0KLQkJZmMgPSBpZWVlMmhvc3QxNihyeGRlc2MuZnJhbWVfY29udHJvbCk7Ci0KLQkJLyogSWYgZXhjbHVkZSBhbmQgd2UgcmVjZWl2ZSBhbiB1bmVuY3J5cHRlZCwgZHJvcCBpdCAqLwotCQlpZiAoICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9FWENMVURFVU5FTkNSWVBURUQpICYmCi0JCSAgICAgIVdMQU5fR0VUX0ZDX0lTV0VQKGZjKSkgewotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaGRybGVuID0gcDgwMjExX2hlYWRlcmxlbihmYyk7Ci0KLQkJLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciwgbm90ZSBDUkMgKGFrYSBGQ1MpLiBwYmFsbG9jICovCi0JCS8qIGFzc3VtZXMgdGhlcmUgbmVlZHMgdG8gYmUgc3BhY2UgZm9yIG9uZSAqLwotCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGhmYTM4NHgyaG9zdF8xNihyeGRlc2MuZGF0YV9sZW4pICsgaGRybGVuICsgV0xBTl9DUkNfTEVOICsgMik7IC8qIGEgbGl0dGxlIGV4dHJhICovCi0KLQkJaWYgKCAhIHNrYiApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJhbGxvY19za2IgZmFpbGVkLlxuIik7Ci0JCQlnb3RvIGRvbmU7Ci0gICAgICAgICAgICAgICAgfQotCi0JCXNrYi0+ZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwotCi0JCS8qIHRoZW9yZXRpY2FsbHkgYWxpZ24gdGhlIElQIGhlYWRlciBvbiBhIDMyLWJpdCB3b3JkLiAqLwotCQlpZiAoIGhkcmxlbiA9PSBXTEFOX0hEUl9BNF9MRU4gKQotCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKLQotCQkvKiBDb3B5IHRoZSA4MDIuMTEgaGRyIHRvIHRoZSBidWZmZXIgKi8KLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgV0xBTl9IRFJfQTNfTEVOKTsKLQkJbWVtY3B5KGRhdGFwLCAmcnhkZXNjLmZyYW1lX2NvbnRyb2wsIFdMQU5fSERSX0EzX0xFTik7Ci0KLQkJLyogU25hZyB0aGUgQTQgYWRkcmVzcyBpZiBwcmVzZW50ICovCi0JCWlmIChoZHJsZW4gPT0gV0xBTl9IRFJfQTRfTEVOKSB7Ci0JCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBXTEFOX0FERFJfTEVOKTsKLQkJCW1lbWNweShkYXRhcCwgJnJ4ZGVzYy5hZGRyZXNzNCwgV0xBTl9IRFJfQTNfTEVOKTsKLQkJfQotCi0JCS8qIHdlIGNhbiBjb252ZXJ0IHRoZSBkYXRhX2xlbiBhcyB3ZSBwYXNzZWQgdGhlIG9yaWdpbmFsIG9uICovCi0JCXJ4ZGVzYy5kYXRhX2xlbiA9IGhmYTM4NHgyaG9zdF8xNihyeGRlc2MuZGF0YV9sZW4pOwotCi0JCS8qIENvcHkgdGhlIHBheWxvYWQgZGF0YSB0byB0aGUgYnVmZmVyICovCi0JCWlmICggcnhkZXNjLmRhdGFfbGVuID4gMCApIHsKLQkJCWRhdGFwID0gc2tiX3B1dChza2IsIHJ4ZGVzYy5kYXRhX2xlbik7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsCi0JCQkJSEZBMzg0eF9CQVBfSU5ULCByeGZpZCwgSEZBMzg0eF9SWF9EQVRBX09GRiwKLQkJCQlkYXRhcCwgcnhkZXNjLmRhdGFfbGVuKTsKLQkJCWlmICggcmVzdWx0ICkgewotCQkJCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgJWQsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJCQlyeGZpZCwKLQkJCQkJSEZBMzg0eF9SWF9EQVRBX09GRiwKLQkJCQkJcnhkZXNjLmRhdGFfbGVuLAotCQkJCQlyZXN1bHQpOwotCQkJCWdvdG8gZmFpbGVkOwotCQkJfQotCQl9Ci0JCS8qIHRoZSBwcmlzbTIgY2FyZHMgZG9uJ3QgcmV0dXJuIHRoZSBGQ1MgKi8KLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgV0xBTl9DUkNfTEVOKTsKLQkJbWVtc2V0IChkYXRhcCwgMHhmZiwgV0xBTl9DUkNfTEVOKTsKLQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQotCQkvKiBBdHRhY2ggdGhlIHJ4bWV0YSwgc2V0IHNvbWUgc3R1ZmYgKi8KLQkJcDgwMjExc2tiX3J4bWV0YV9hdHRhY2god2xhbmRldiwgc2tiKTsKLQkJcnhtZXRhID0gUDgwMjExU0tCX1JYTUVUQShza2IpOwotCQlyeG1ldGEtPm1hY3RpbWUgPSByeGRlc2MudGltZTsKLQkJcnhtZXRhLT5yeHJhdGUgPSByeGRlc2MucmF0ZTsKLQkJcnhtZXRhLT5zaWduYWwgPSByeGRlc2Muc2lnbmFsIC0gaHctPmRibWFkanVzdDsKLQkJcnhtZXRhLT5ub2lzZSA9IHJ4ZGVzYy5zaWxlbmNlIC0gaHctPmRibWFkanVzdDsKLQotCQlwcmlzbTJzdGFfZXZfcngod2xhbmRldiwgc2tiKTsKLQkJZ290byBkb25lOwotCWNhc2UgNzoKLQotICAgICAgICAJaWYgKCAhIEhGQTM4NHhfUlhTVEFUVVNfSVNGQ1NFUlIocnhkZXNjLnN0YXR1cykgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZmEzODR4X2ludF9yeG1vbml0b3IoIHdsYW5kZXYsIHJ4ZmlkLCAmcnhkZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMywiUmVjZWl2ZWQgbW9uaXRvciBmcmFtZTogRkNTZXJyIHNldFxuIik7Ci0gICAgICAgICAgICAgICAgfQotCQlnb3RvIGRvbmU7Ci0KLQlkZWZhdWx0OgotCi0JCVdMQU5fTE9HX1dBUk5JTkcoIlJlY2VpdmVkIGZyYW1lIG9uIHVuc3VwcG9ydGVkIHBvcnQ9JWRcbiIsCi0JCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlRfR0VUKHJ4ZGVzYy5zdGF0dXMpICk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLSBmYWlsZWQ6Ci0JZGV2X2tmcmVlX3NrYihza2IpOwotCi0gZG9uZToKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfcnhtb25pdG9yCi0qCi0qIEhlbHBlciBmdW5jdGlvbiBmb3IgaW50X3J4LiAgSGFuZGxlcyBtb25pdG9yIGZyYW1lcy4KLSogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHNwYWNlIGZvciB0aGUgRkNTIGFuZCBzZXRzIGl0Ci0qIHRvIDB4ZmZmZmZmZmYuICBUaGUgaGZhMzg0eCBkb2Vzbid0IGdpdmUgdXMgdGhlIEZDUyB2YWx1ZSBidXQgdGhlCi0qIGhpZ2hlciBsYXllcnMgZXhwZWN0IGl0LiAgMHhmZmZmZmZmZiBpcyB1c2VkIGFzIGEgZmxhZyB0byBpbmRpY2F0ZQotKiB0aGUgRkNTIGlzIGJvZ3VzLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKglyeGZpZAkJcmVjZWl2ZWQgRklECi0qCXJ4ZGVzYwkJcnggZGVzY3JpcHRvciByZWFkIGZyb20gY2FyZCBpbiBpbnRfcngKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCUFsbG9jYXRlcyBhbiBza2IgYW5kIHBhc3NlcyBpdCB1cCB2aWEgdGhlIFBGX1BBQ0tFVCBpbnRlcmZhY2UuCi0qIENhbGwgY29udGV4dDoKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4bW9uaXRvciggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgcnhmaWQsCi0JCQkJICAgaGZhMzg0eF9yeF9mcmFtZV90ICpyeGRlc2MpCi17Ci0JaGZhMzg0eF90CQkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UCQkJCWhkcmxlbiA9IDA7Ci0JVUlOVAkJCQlkYXRhbGVuID0gMDsKLQlVSU5UCQkJCXNrYmxlbiA9IDA7Ci0JVUlOVAkJCQl0cnVuY2F0ZWQgPSAwOwotCVVJTlQ4CQkJCSpkYXRhcDsKLQlVSU5UMTYJCQkJZmM7Ci0Jc3RydWN0IHNrX2J1ZmYJCQkqc2tiOwotCi0JREJGRU5URVI7Ci0JLyogRG9uJ3QgZm9yZ2V0IHRoZSBzdGF0dXMsIHRpbWUsIGFuZCBkYXRhX2xlbiBmaWVsZHMgYXJlIGluIGhvc3Qgb3JkZXIgKi8KLQkvKiBGaWd1cmUgb3V0IGhvdyBiaWcgdGhlIGZyYW1lIGlzICovCi0JZmMgPSBpZWVlMmhvc3QxNihyeGRlc2MtPmZyYW1lX2NvbnRyb2wpOwotCWhkcmxlbiA9IHA4MDIxMV9oZWFkZXJsZW4oZmMpOwotCWRhdGFsZW4gPSBoZmEzODR4Mmhvc3RfMTYocnhkZXNjLT5kYXRhX2xlbik7Ci0KLQkvKiBBbGxvY2F0ZSBhbiBpbmQgbWVzc2FnZStmcmFtZXNpemUgc2tiICovCi0Jc2tibGVuID0gc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkgKwotCQloZHJsZW4gKyBkYXRhbGVuICsgV0xBTl9DUkNfTEVOOwotCi0JLyogc2FuaXR5IGNoZWNrIHRoZSBsZW5ndGggKi8KLQlpZiAoIHNrYmxlbiA+Ci0JCShzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSArCi0JCVdMQU5fSERSX0E0X0xFTiArIFdMQU5fREFUQV9NQVhMRU4gKyBXTEFOX0NSQ19MRU4pICkgewotCQlXTEFOX0xPR19ERUJVRygxLCAib3ZlcmxlbiBmcm06IGxlbj0lZFxuIiwKLQkJCXNrYmxlbiAtIHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpKTsKLQl9Ci0KLQlpZiAoIChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYmxlbikpID09IE5VTEwgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJhbGxvY19za2IgZmFpbGVkIHRyeWluZyB0byBhbGxvY2F0ZSAlZCBieXRlc1xuIiwgc2tibGVuKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG9ubHkgcHJlcGVuZCB0aGUgcHJpc20gaGVhZGVyIGlmIGluIHRoZSByaWdodCBtb2RlICovCi0JaWYgKCh3bGFuZGV2LT5uZXRkZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTSkgJiYKLQkgICAgKGh3LT5zbmlmZmhkciA9PSAwKSkgewotCQlwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QJKm1zZzsKLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkpOwotCQltc2cgPSAocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KikgZGF0YXA7Ci0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBtZW1iZXJzICovCi0JCW1zZy0+bXNnY29kZSA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm07Ci0JCW1zZy0+bXNnbGVuID0gc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCk7Ci0JCXN0cmNweShtc2ctPmRldm5hbWUsIHdsYW5kZXYtPm5hbWUpOwotCi0JCW1zZy0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKLQkJbXNnLT5ob3N0dGltZS5zdGF0dXMgPSAwOwotCQltc2ctPmhvc3R0aW1lLmxlbiA9IDQ7Ci0JCW1zZy0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7Ci0KLQkJbXNnLT5tYWN0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZTsKLQkJbXNnLT5tYWN0aW1lLnN0YXR1cyA9IDA7Ci0JCW1zZy0+bWFjdGltZS5sZW4gPSA0OwotCQltc2ctPm1hY3RpbWUuZGF0YSA9IHJ4ZGVzYy0+dGltZSAqIDEwMDA7Ci0KLQkJbXNnLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKLQkJbXNnLT5jaGFubmVsLnN0YXR1cyA9IDA7Ci0JCW1zZy0+Y2hhbm5lbC5sZW4gPSA0OwotCQltc2ctPmNoYW5uZWwuZGF0YSA9IGh3LT5zbmlmZl9jaGFubmVsOwotCi0JCW1zZy0+cnNzaS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2k7Ci0JCW1zZy0+cnNzaS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnJzc2kubGVuID0gNDsKLQkJbXNnLT5yc3NpLmRhdGEgPSAwOwotCi0JCW1zZy0+c3EuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcTsKLQkJbXNnLT5zcS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnNxLmxlbiA9IDQ7Ci0JCW1zZy0+c3EuZGF0YSA9IDA7Ci0KLQkJbXNnLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7Ci0JCW1zZy0+c2lnbmFsLnN0YXR1cyA9IDA7Ci0JCW1zZy0+c2lnbmFsLmxlbiA9IDQ7Ci0JCW1zZy0+c2lnbmFsLmRhdGEgPSByeGRlc2MtPnNpZ25hbDsKLQotCQltc2ctPm5vaXNlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2U7Ci0JCW1zZy0+bm9pc2Uuc3RhdHVzID0gMDsKLQkJbXNnLT5ub2lzZS5sZW4gPSA0OwotCQltc2ctPm5vaXNlLmRhdGEgPSByeGRlc2MtPnNpbGVuY2U7Ci0KLQkJbXNnLT5yYXRlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZTsKLQkJbXNnLT5yYXRlLnN0YXR1cyA9IDA7Ci0JCW1zZy0+cmF0ZS5sZW4gPSA0OwotCQltc2ctPnJhdGUuZGF0YSA9IHJ4ZGVzYy0+cmF0ZSAvIDU7IC8qIHNldCB0byA4MDIuMTEgdW5pdHMgKi8KLQotCQltc2ctPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OwotCQltc2ctPmlzdHguc3RhdHVzID0gMDsKLQkJbXNnLT5pc3R4LmxlbiA9IDQ7Ci0JCW1zZy0+aXN0eC5kYXRhID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQotCQltc2ctPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKLQkJbXNnLT5mcm1sZW4uc3RhdHVzID0gMDsKLQkJbXNnLT5mcm1sZW4ubGVuID0gNDsKLQkJbXNnLT5mcm1sZW4uZGF0YSA9IGhkcmxlbiArIGRhdGFsZW4gKyBXTEFOX0NSQ19MRU47Ci0JfSBlbHNlIGlmICgod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyMTFfUFJJU00pICYmCi0JCSAgIChody0+c25pZmZoZHIgIT0gMCkpIHsKLQkJcDgwMjExX2NhcGhkcl90CQkqY2FwaGRyOwotCQkvKiBUaGUgTkVXIGhlYWRlciBmb3JtYXQhICovCi0JCWRhdGFwID0gc2tiX3B1dChza2IsIHNpemVvZihwODAyMTFfY2FwaGRyX3QpKTsKLQkJY2FwaGRyID0gKHA4MDIxMV9jYXBoZHJfdCopIGRhdGFwOwotCi0JCWNhcGhkci0+dmVyc2lvbiA9CWh0b25sKFA4MDIxMUNBUFRVUkVfVkVSU0lPTik7Ci0JCWNhcGhkci0+bGVuZ3RoID0JaHRvbmwoc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkpOwotCQljYXBoZHItPm1hY3RpbWUgPQlfX2NwdV90b19iZTY0KHJ4ZGVzYy0+dGltZSk7Ci0JCWNhcGhkci0+aG9zdHRpbWUgPQlfX2NwdV90b19iZTY0KGppZmZpZXMpOwotCQljYXBoZHItPnBoeXR5cGUgPQlodG9ubCg0KTsgLyogZHNzX2RvdDExX2IgKi8KLQkJY2FwaGRyLT5jaGFubmVsID0JaHRvbmwoaHctPnNuaWZmX2NoYW5uZWwpOwotCQljYXBoZHItPmRhdGFyYXRlID0JaHRvbmwocnhkZXNjLT5yYXRlKTsKLQkJY2FwaGRyLT5hbnRlbm5hID0JaHRvbmwoMCk7IC8qIHVua25vd24gKi8KLQkJY2FwaGRyLT5wcmlvcml0eSA9CWh0b25sKDApOyAvKiB1bmtub3duICovCi0JCWNhcGhkci0+c3NpX3R5cGUgPQlodG9ubCgzKTsgLyogcnNzaV9yYXcgKi8KLQkJY2FwaGRyLT5zc2lfc2lnbmFsID0JaHRvbmwocnhkZXNjLT5zaWduYWwpOwotCQljYXBoZHItPnNzaV9ub2lzZSA9CWh0b25sKHJ4ZGVzYy0+c2lsZW5jZSk7Ci0JCWNhcGhkci0+cHJlYW1ibGUgPQlodG9ubCgwKTsgLyogdW5rbm93biAqLwotCQljYXBoZHItPmVuY29kaW5nID0JaHRvbmwoMSk7IC8qIGNjayAqLwotCX0KLQkvKiBDb3B5IHRoZSA4MDIuMTEgaGVhZGVyIHRvIHRoZSBza2IgKGN0bCBmcmFtZXMgbWF5IGJlIGxlc3MgdGhhbiBhIGZ1bGwgaGVhZGVyKSAqLwotCWRhdGFwID0gc2tiX3B1dChza2IsIGhkcmxlbik7Ci0JbWVtY3B5KCBkYXRhcCwgJihyeGRlc2MtPmZyYW1lX2NvbnRyb2wpLCBoZHJsZW4pOwotCi0JLyogSWYgYW55LCBjb3B5IHRoZSBkYXRhIGZyb20gdGhlIGNhcmQgdG8gdGhlIHNrYiAqLwotCWlmICggZGF0YWxlbiA+IDAgKQotCXsKLQkJLyogVHJ1bmNhdGUgdGhlIHBhY2tldCBpZiB0aGUgdXNlciB3YW50cyB1cyB0byAqLwotCQlVSU5UCWRhdGFyZWFkID0gZGF0YWxlbjsKLQkJaWYoaHctPnNuaWZmX3RydW5jYXRlID4gMCAmJiBkYXRhcmVhZCA+IGh3LT5zbmlmZl90cnVuY2F0ZSkgewotCQkJZGF0YXJlYWQgPSBody0+c25pZmZfdHJ1bmNhdGU7Ci0JCQl0cnVuY2F0ZWQgPSAxOwotCQl9Ci0KLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgZGF0YXJlYWQpOwotCQloZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsCi0JCQlIRkEzODR4X0JBUF9JTlQsIHJ4ZmlkLCBIRkEzODR4X1JYX0RBVEFfT0ZGLAotCQkJZGF0YXAsIGRhdGFyZWFkKTsKLQotCQkvKiBjaGVjayBmb3IgdW5lbmNyeXB0ZWQgc3R1ZmYgaWYgV0VQIGJpdCBzZXQuICovCi0JCWlmICgqKGRhdGFwIC0gaGRybGVuICsgMSkgJiAweDQwKSAvLyB3ZXAgc2V0Ci0JCSAgaWYgKCgqKGRhdGFwKSA9PSAweGFhKSAmJiAoKihkYXRhcCsxKSA9PSAweGFhKSkKLQkJICAgICooZGF0YXAgLSBoZHJsZW4gKyAxKSAmPSAweGJmOyAvLyBjbGVhciB3ZXA7IGl0J3MgdGhlIDgwMi4yIGhlYWRlciEKLQl9Ci0KLQlpZiAoIXRydW5jYXRlZCAmJiBody0+c25pZmZfZmNzKSB7Ci0JCS8qIFNldCB0aGUgRkNTICovCi0JCWRhdGFwID0gc2tiX3B1dChza2IsIFdMQU5fQ1JDX0xFTik7Ci0JCW1lbXNldCggZGF0YXAsIDB4ZmYsIFdMQU5fQ1JDX0xFTik7Ci0JfQotCi0JLyogcGFzcyBpdCBiYWNrIHVwICovCi0JcHJpc20yc3RhX2V2X3J4KHdsYW5kZXYsIHNrYik7Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X2FsbG9jCi0qCi0qIEhhbmRsZXMgdGhlIEFsbG9jIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfYWxsb2Mod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQlmaWQ7Ci0JSU5UMTYJCQlyZXN1bHQ7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEhhbmRsZSB0aGUgcmVjbGFpbWVkIEZJRCAqLwotCS8qICAgY29sbGVjdCB0aGUgRklEIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrICovCi0JZmlkID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQUxMT0NGSUQpOwotCi0JaWYgKCBmaWQgIT0gaHctPmluZm9maWQgKSB7IC8qIEl0J3MgYSB0cmFuc21pdCBmaWQgKi8KLQkJV0xBTl9MT0dfREVCVUcoNSwgImludF9hbGxvYyglI3gpXG4iLCBmaWQpOwotCQlyZXN1bHQgPSB0eGZpZF9xdWV1ZV9hZGQoaHcsIGZpZCk7Ci0JCWlmIChyZXN1bHQgIT0gLTEpIHsKLQkJCXByaXNtMnN0YV9ldl9hbGxvYyh3bGFuZGV2KTsKLQkJCVdMQU5fTE9HX0RFQlVHKDUsICJxX2FkZC5cbiIpOwotCQl9IGVsc2UgewotCQkJV0xBTl9MT0dfREVCVUcoNSwgInFfZnVsbC5cbiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogdW5sb2NrIHRoZSBpbmZvIGZpZCAqLwotCQl1cCgmaHctPmluZm9maWRfc2VtKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2hhbmRvdmVyCi0qCi0qIFNlbmRzIGEgaGFuZG92ZXIgbm90aWZpY2F0aW9uIHRvIHRoZSBNQUMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJYWRkcgkJYWRkcmVzcyBvZiBzdGF0aW9uIHRoYXQncyBsZWZ0Ci0qCi0qIFJldHVybnM6Ci0qCXplcm8JCXN1Y2Nlc3MuCi0qCS1FUkVTVEFSVFNZUwlyZWNlaXZlZCBzaWduYWwgd2hpbGUgd2FpdGluZyBmb3Igc2VtYXBob3JlLgotKgktRUlPCQlmYWlsZWQgdG8gd3JpdGUgdG8gYmFwLCBvciBmYWlsZWQgaW4gY21kLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQsIE5PVEU6IHRoaXMgY2FsbCBtYXkgYmxvY2sgb24gYSBzZW1hcGhvcmUhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfaGFuZG92ZXIoIGhmYTM4NHhfdCAqaHcsIFVJTlQ4ICphZGRyKQotewotCWludAkJCXJlc3VsdCA9IDA7Ci0gICAgICAgIGhmYTM4NHhfSGFuZG92ZXJBZGRyX3QgIHJlYzsKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgICAgICBEQkZFTlRFUjsKLQotCS8qIEFjcXVpcmUgdGhlIGluZm9maWQgKi8KLQlpZiAoIGRvd25faW50ZXJydXB0aWJsZSgmaHctPmluZm9maWRfc2VtKSApIHsKLQkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLSAgICAgICAgLyogU2V0IHVwIHRoZSByZWNvcmQgKi8KLSAgICAgICAgbGVuID0gc2l6ZW9mKGhmYTM4NHhfSGFuZG92ZXJBZGRyX3QpOwotICAgICAgICByZWMuZnJhbWVsZW4gPSBob3N0MmhmYTM4NHhfMTYobGVuLzIgLSAxKTsKLSAgICAgICAgcmVjLmluZm90eXBlID0gaG9zdDJoZmEzODR4XzE2KEhGQTM4NHhfSVRfSEFORE9WRVJBRERSKTsKLSAgICAgICAgbWVtY3B5KHJlYy5oYW5kb3Zlcl9hZGRyLCBhZGRyLCBzaXplb2YocmVjLmhhbmRvdmVyX2FkZHIpKTsKLQotICAgICAgICAvKiBJc3N1ZSB0aGUgY29tbWFuZCAqLwotICAgICAgICByZXN1bHQgPSBoZmEzODR4X2NtZF9ub3RpZnkoaHcsIDEsIGh3LT5pbmZvZmlkLCAmcmVjLCBsZW4pOwotCi0gICAgICAgIGlmICggcmVzdWx0ICE9IDAgKSB7Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwiY21kX25vdGlmeSglMDR4KSBmYWlsZWQsIHJlc3VsdD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBody0+aW5mb2ZpZCwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotCi1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIGhmYTM4NHhfdHhfdGltZW91dCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JREJGRU5URVI7Ci0KLQlXTEFOX0xPR19XQVJOSU5HKCJJbXBsZW1lbnQgbWUuXG4iKTsKLQotCURCRkVYSVQ7Ci19Ci0KLS8qIEhhbmRsZXMgYWxsICJyeCIgQkFQIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyB2b2lkICAgICBoZmEzODR4X2JhcF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKSBkYXRhOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGh3LT53bGFuZGV2OwotCWludCBjb3VudGVyID0gcHJpc20yX2lycV9ldnJlYWRfbWF4OwotCWludAkJCXJlZzsKLQotCURCRkVOVEVSOwotCi0Jd2hpbGUgKGNvdW50ZXItLSA+IDApIHsKLQkJLyogR2V0IGludGVycnVwdCByZWdpc3RlciAqLwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCi0JCWlmICgocmVnID09IDB4ZmZmZikgfHwKLQkJICAgICEocmVnICYgSEZBMzg0eF9JTlRfQkFQX09QKSkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTSU5GTyhyZWcpICl7Ci0JCQloZmEzODR4X2ludF9pbmZvKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfSU5GT19TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU1RYRVhDKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X3R4ZXhjKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfVFhFWENfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNUWChyZWcpICl7Ci0JCQloZmEzODR4X2ludF90eCh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX1RYX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTUlgocmVnKSApewotCQkJaGZhMzg0eF9pbnRfcngod2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19SWF9TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQl9Ci0KLQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyAqLwotCWhmYTM4NHhfZXZlbnRzX2FsbChodyk7Ci0KLQlEQkZFWElUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCmluZGV4IDBkZmI4Y2UuLjliNzQ2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKQEAgLTYzLDE4ICs2MywxOCBAQAogCiAvKi0tLS0tLSBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0gTWlucyAmIE1heHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURfQUxMT0NfTEVOX01JTgkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9DTURfQUxMT0NfTEVOX01BWAkoKFVJTlQxNikyNDAwKQotI2RlZmluZQkJSEZBMzg0eF9CQVBfREFUQUxFTl9NQVgJCSgoVUlOVDE2KTQwOTYpCi0jZGVmaW5lCQlIRkEzODR4X0JBUF9PRkZTRVRfTUFYCQkoKFVJTlQxNik0MDk2KQotI2RlZmluZQkJSEZBMzg0eF9QT1JUSURfTUFYCQkoKFVJTlQxNik3KQotI2RlZmluZQkJSEZBMzg0eF9OVU1QT1JUU19NQVgJCSgoVUlOVDE2KShIRkEzODR4X1BPUlRJRF9NQVgrMSkpCi0jZGVmaW5lCQlIRkEzODR4X1BEUl9MRU5fTUFYCQkoKFVJTlQxNik1MTIpCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCi0jZGVmaW5lCQlIRkEzODR4X1BEQV9SRUNTX01BWAkJKChVSU5UMTYpMjAwKQkvKiBhIGd1ZXNzICovCi0jZGVmaW5lCQlIRkEzODR4X1BEQV9MRU5fTUFYCQkoKFVJTlQxNikxMDI0KQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLwotI2RlZmluZQkJSEZBMzg0eF9TQ0FOUkVTVUxUX01BWAkJKChVSU5UMTYpMzEpCi0jZGVmaW5lCQlIRkEzODR4X0hTQ0FOUkVTVUxUX01BWAkJKChVSU5UMTYpMzEpCi0jZGVmaW5lCQlIRkEzODR4X0NISU5GT1JFU1VMVF9NQVgJKChVSU5UMTYpMTYpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BTExPQ19MRU5fTUlOCSgodTE2KTQpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BTExPQ19MRU5fTUFYCSgodTE2KTI0MDApCisjZGVmaW5lCQlIRkEzODR4X0JBUF9EQVRBTEVOX01BWAkJKCh1MTYpNDA5NikKKyNkZWZpbmUJCUhGQTM4NHhfQkFQX09GRlNFVF9NQVgJCSgodTE2KTQwOTYpCisjZGVmaW5lCQlIRkEzODR4X1BPUlRJRF9NQVgJCSgodTE2KTcpCisjZGVmaW5lCQlIRkEzODR4X05VTVBPUlRTX01BWAkJKCh1MTYpKEhGQTM4NHhfUE9SVElEX01BWCsxKSkKKyNkZWZpbmUJCUhGQTM4NHhfUERSX0xFTl9NQVgJCSgodTE2KTUxMikJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KKyNkZWZpbmUJCUhGQTM4NHhfUERBX1JFQ1NfTUFYCQkoKHUxNikyMDApCS8qIGEgZ3Vlc3MgKi8KKyNkZWZpbmUJCUhGQTM4NHhfUERBX0xFTl9NQVgJCSgodTE2KTEwMjQpCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCisjZGVmaW5lCQlIRkEzODR4X1NDQU5SRVNVTFRfTUFYCQkoKHUxNikzMSkKKyNkZWZpbmUJCUhGQTM4NHhfSFNDQU5SRVNVTFRfTUFYCQkoKHUxNikzMSkKKyNkZWZpbmUJCUhGQTM4NHhfQ0hJTkZPUkVTVUxUX01BWAkoKHUxNikxNikKICNkZWZpbmUJCUhGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVgJKDEwKQogI2RlZmluZQkJSEZBMzg0eF9EUlZSX1RYQlVGX01BWAkJKHNpemVvZihoZmEzODR4X3R4X2ZyYW1lX3QpICsgXAogCQkJCQkJV0xBTl9EQVRBX01BWExFTiAtIFwKQEAgLTg4LDQyICs4OCw0MiBAQAogI2RlZmluZQkJSEZBMzg0eF9VU0JfUldNRU1fTUFYTEVOCTIwNDgKIAogLyotLS0gU3VwcG9ydCBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9CQVBfUFJPQwkJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X0JBUF9JTlQJCQkJKChVSU5UMTYpMSkKLSNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfSUJTUwkJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0JTUwkJCSgoVUlOVDE2KTEpCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX1dEUwkJCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX1BTVUVET0lCU1MJCSgoVUlOVDE2KTMpCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0hPU1RBUCAgICAJCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX1BSSVZJTlZPS0VECQkoKFVJTlQxNilCSVQwKQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19FWENMVURFCQkoKFVJTlQxNilCSVQxKQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBQkxFX1RYQ1JZUFQJKChVSU5UMTYpQklUNCkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9SWENSWVBUCSgoVUlOVDE2KUJJVDcpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FMTE9XX01JWEVEIAkoKFVJTlQxNilCSVQxMSkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfSU5URVJWQUwxCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9JTlRFUlZBTDEwCQkoKFVJTlQxNilCSVQ1KQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9JTlRFUlZBTDUwCQkoKFVJTlQxNilCSVQ2KQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9JTlRFUlZBTDEwMAkJKChVSU5UMTYpKEJJVDUgfCBCSVQ2KSkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRklSTVdBUkVfV1BBICAJCSgoVUlOVDE2KUJJVDgpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0hPU1RfTUlDICAgICAgCQkoKFVJTlQxNilCSVQ5KQotI2RlZmluZSAJSEZBMzg0eF9ST0FNTU9ERV9GV1NDQU5fRldST0FNCQkoKFVJTlQxNikxKQotI2RlZmluZSAJSEZBMzg0eF9ST0FNTU9ERV9GV1NDQU5fSE9TVFJPQU0JKChVSU5UMTYpMikKLSNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfSE9TVFNDQU5fSE9TVFJPQU0JKChVSU5UMTYpMykKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19ESVNBQkxFRAkJKChVSU5UMTYpMSkKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19JTklUU1JDSAkJKChVSU5UMTYpMikKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19DT05OX0lCU1MJCSgoVUlOVDE2KTMpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9FU1MJCSgoVUlOVDE2KTQpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfT09SX0VTUwkJKChVSU5UMTYpNSkKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19DT05OX1dEUwkJKChVSU5UMTYpNikKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19IT1NUQVAJCSgoVUlOVDE2KTgpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMQkJCSgoVUlOVDE2KTEpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMgkJCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfNWRvdDUJCQkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzExCQkJKChVSU5UMTYpOCkKKyNkZWZpbmUJCUhGQTM4NHhfQkFQX1BST0MJCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9CQVBfaW50CQkJCSgodTE2KTEpCisjZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0lCU1MJCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9CU1MJCQkoKHUxNikxKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9XRFMJCQkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9QU1VFRE9JQlNTCQkoKHUxNikzKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9IT1NUQVAgICAgCQkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19QUklWSU5WT0tFRAkJKCh1MTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRVhDTFVERQkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9UWENSWVBUCSgodTE2KUJJVDQpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FCTEVfUlhDUllQVAkoKHUxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBTExPV19NSVhFRCAJKCh1MTYpQklUMTEpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX2ludEVSVkFMMQkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfaW50RVJWQUwxMAkJKCh1MTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfaW50RVJWQUw1MAkJKCh1MTYpQklUNikKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfaW50RVJWQUwxMDAJCSgodTE2KShCSVQ1IHwgQklUNikpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0ZJUk1XQVJFX1dQQSAgCQkoKHUxNilCSVQ4KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19IT1NUX01JQyAgICAgIAkJKCh1MTYpQklUOSkKKyNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfRldTQ0FOX0ZXUk9BTQkJKCh1MTYpMSkKKyNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfRldTQ0FOX0hPU1RST0FNCSgodTE2KTIpCisjZGVmaW5lIAlIRkEzODR4X1JPQU1NT0RFX0hPU1RTQ0FOX0hPU1RST0FNCSgodTE2KTMpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfRElTQUJMRUQJCSgodTE2KTEpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfSU5JVFNSQ0gJCSgodTE2KTIpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9JQlNTCQkoKHUxNikzKQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0NPTk5fRVNTCQkoKHUxNik0KQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX09PUl9FU1MJCSgodTE2KTUpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9XRFMJCSgodTE2KTYpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfSE9TVEFQCQkoKHUxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzEJCQkoKHUxNikxKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzIJCQkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzVkb3Q1CQkJKCh1MTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xMQkJCSgodTE2KTgpCiAKIC8qLS0tIEp1c3Qgc29tZSBzeW1ib2xpYyBuYW1lcyBmb3IgbGVnaWJpbGl0eSAtLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfVFhDTURfTk9SRUNMCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9UWENNRF9SRUNMCQkoKFVJTlQxNikxKQorI2RlZmluZQkJSEZBMzg0eF9UWENNRF9OT1JFQ0wJCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1RYQ01EX1JFQ0wJCSgodTE2KTEpCiAKIC8qLS0tIE1BQyBJbnRlcm5hbCBtZW1vcnkgY29uc3RhbnRzIGFuZCBtYWNyb3MgLS0tLS0tKi8KIC8qIG1hc2tzIGFuZCBtYWNyb3MgdXNlZCB0byBtYW5pcHVsYXRlIE1BQyBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzc2VzLiAqLwpAQCAtMTQwLDcgKzE0MCw3IEBACiAgKi8KIAogLyogSGFuZHkgY29uc3RhbnQgKi8KLSNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfT0ZGX01BWAkoKFVJTlQxNikweDAwN2YpCisjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX09GRl9NQVgJKCh1MTYpMHgwMDdmKQogCiAvKiBNYXNrIGJpdHMgZm9yIGRpc2NhcmRpbmcgdW53YW50ZWQgcGllY2VzIGluIGEgZmxhdCBhZGRyZXNzICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfRkxBVF9BVVhfUEFHRV9NQVNLCSgweDAwN2ZmZjgwKQpAQCAtMTU4LDI1ICsxNTgsMjUgQEAKIAogLyogTWFrZSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgZnJvbSBBVVggZm9ybWF0IDE2LWJpdCBwYWdlIGFuZCBvZmZzZXQgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfTUtGTEFUKHAsbykJXAotCQkoKChVSU5UMzIpKCgoVUlOVDE2KShwKSkmSEZBMzg0eF9BRERSX0FVWF9QQUdFX01BU0spKSA8PDcpIHwgXAotCQkoKFVJTlQzMikoKChVSU5UMTYpKG8pKSZIRkEzODR4X0FERFJfQVVYX09GRl9NQVNLKSkKKwkJKCgodTMyKSgoKHUxNikocCkpJkhGQTM4NHhfQUREUl9BVVhfUEFHRV9NQVNLKSkgPDw3KSB8IFwKKwkJKCh1MzIpKCgodTE2KShvKSkmSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFTSykpCiAKIC8qIE1ha2UgYSAzMi1iaXQgZmxhdCBhZGRyZXNzIGZyb20gQ01EIGZvcm1hdCAxNi1iaXQgcGFnZSBhbmQgb2Zmc2V0ICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX01LRkxBVChwLG8pCVwKLQkJKCgoVUlOVDMyKSgoKFVJTlQxNikocCkpJkhGQTM4NHhfQUREUl9DTURfUEFHRV9NQVNLKSkgPDwxNikgfCBcCi0JCSgoVUlOVDMyKSgoKFVJTlQxNikobykpJkhGQTM4NHhfQUREUl9DTURfT0ZGX01BU0spKQorCQkoKCh1MzIpKCgodTE2KShwKSkmSEZBMzg0eF9BRERSX0NNRF9QQUdFX01BU0spKSA8PDE2KSB8IFwKKwkJKCh1MzIpKCgodTE2KShvKSkmSEZBMzg0eF9BRERSX0NNRF9PRkZfTUFTSykpCiAKIC8qIE1ha2UgQVVYIGZvcm1hdCBvZmZzZXQgYW5kIHBhZ2UgZnJvbSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfTUtQQUdFKGYpIFwKLQkJKChVSU5UMTYpKCgoKFVJTlQzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0FVWF9QQUdFX01BU0spPj43KSkKKwkJKCh1MTYpKCgoKHUzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0FVWF9QQUdFX01BU0spPj43KSkKICNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfTUtPRkYoZikgXAotCQkoKFVJTlQxNikoKChVSU5UMzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9BVVhfT0ZGX01BU0spKQorCQkoKHUxNikoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9BVVhfT0ZGX01BU0spKQogCiAvKiBNYWtlIENNRCBmb3JtYXQgb2Zmc2V0IGFuZCBwYWdlIGZyb20gYSAzMi1iaXQgZmxhdCBhZGRyZXNzICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX01LUEFHRShmKSBcCi0JCSgoVUlOVDE2KSgoKChVSU5UMzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfUEFHRV9NQVNLKT4+MTYpKQorCQkoKHUxNikoKCgodTMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQ01EX1BBR0VfTUFTSyk+PjE2KSkKICNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtPRkYoZikgXAotCQkoKFVJTlQxNikoKChVSU5UMzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0spKQorCQkoKHUxNikoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0spKQogCiAvKi0tLSBBdXggcmVnaXN0ZXIgbWFza3MvdGVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBTb21lIG9mIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBBVVggb2Zmc2V0IHJlZ2lzdGVyIGFyZSB1c2VkIHRvICovCkBAIC0xODgsNyArMTg4LDcgQEAKIAogLyogTWFrZSBBVVggcmVnaXN0ZXIgb2Zmc2V0IGFuZCBwYWdlIHZhbHVlcyBmcm9tIGEgZmxhdCBhZGRyZXNzICovCiAjZGVmaW5lCQlIRkEzODR4X0FVWF9NS09GRihmLCBjKSBcCi0JKEhGQTM4NHhfQUREUl9BVVhfTUtPRkYoZikgfCAoKChVSU5UMTYpKGMpKTw8MTIpKQorCShIRkEzODR4X0FERFJfQVVYX01LT0ZGKGYpIHwgKCgodTE2KShjKSk8PDEyKSkKICNkZWZpbmUJCUhGQTM4NHhfQVVYX01LUEFHRShmKQlIRkEzODR4X0FERFJfQVVYX01LUEFHRShmKQogCiAKQEAgLTIwNSw0MCArMjA1LDYgQEAKICNkZWZpbmUJCUhGQTM4NHhfRExTVEFURV9GTEFTSFdSSVRFUEVORElORwk0CiAjZGVmaW5lCQlIRkEzODR4X0RMU1RBVEVfR0VORVNJUyAJCTUKIAotLyotLS0gUmVnaXN0ZXIgSS9PIG9mZnNldHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0KLSNkZWZpbmUJCUhGQTM4NHhfQ01EX09GRgkJCSgweDAwKQotI2RlZmluZQkJSEZBMzg0eF9QQVJBTTBfT0ZGCQkoMHgwMikKLSNkZWZpbmUJCUhGQTM4NHhfUEFSQU0xX09GRgkJKDB4MDQpCi0jZGVmaW5lCQlIRkEzODR4X1BBUkFNMl9PRkYJCSgweDA2KQotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfT0ZGCQkoMHgwOCkKLSNkZWZpbmUJCUhGQTM4NHhfUkVTUDBfT0ZGCQkoMHgwQSkKLSNkZWZpbmUJCUhGQTM4NHhfUkVTUDFfT0ZGCQkoMHgwQykKLSNkZWZpbmUJCUhGQTM4NHhfUkVTUDJfT0ZGCQkoMHgwRSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5GT0ZJRF9PRkYJCSgweDEwKQotI2RlZmluZQkJSEZBMzg0eF9SWEZJRF9PRkYJCSgweDIwKQotI2RlZmluZQkJSEZBMzg0eF9BTExPQ0ZJRF9PRkYJCSgweDIyKQotI2RlZmluZQkJSEZBMzg0eF9UWENPTVBMRklEX09GRgkJKDB4MjQpCi0jZGVmaW5lCQlIRkEzODR4X1NFTEVDVDBfT0ZGCQkoMHgxOCkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMF9PRkYJCSgweDFDKQotI2RlZmluZQkJSEZBMzg0eF9EQVRBMF9PRkYJCSgweDM2KQotI2RlZmluZQkJSEZBMzg0eF9TRUxFQ1QxX09GRgkJKDB4MUEpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVDFfT0ZGCQkoMHgxRSkKLSNkZWZpbmUJCUhGQTM4NHhfREFUQTFfT0ZGCQkoMHgzOCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX09GRgkJKDB4MzApCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX09GRgkJKDB4MzIpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX09GRgkJKDB4MzQpCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfT0ZGCQkoMHgxNCkKLSNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMF9PRkYJCSgweDI4KQotI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQxX09GRgkJKDB4MkEpCi0jZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDJfT0ZGCQkoMHgyQykKLSNkZWZpbmUJCUhGQTM4NHhfQVVYUEFHRV9PRkYJCSgweDNBKQotI2RlZmluZQkJSEZBMzg0eF9BVVhPRkZTRVRfT0ZGCQkoMHgzQykKLSNkZWZpbmUJCUhGQTM4NHhfQVVYREFUQV9PRkYJCSgweDNFKQotCi0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kgfHwgV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCi0KICNkZWZpbmUJCUhGQTM4NHhfQ01EX09GRgkJCSgweDAwKQogI2RlZmluZQkJSEZBMzg0eF9QQVJBTTBfT0ZGCQkoMHgwNCkKICNkZWZpbmUJCUhGQTM4NHhfUEFSQU0xX09GRgkJKDB4MDgpCkBAIC0yNTgsNyArMjI0LDcgQEAKICNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMV9PRkYJCSgweDNjKQogI2RlZmluZQkJSEZBMzg0eF9EQVRBMV9PRkYJCSgweDcwKQogI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfT0ZGCQkoMHg2MCkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fT0ZGCQkoMHg2NCkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fT0ZGCQkoMHg2NCkKICNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfT0ZGCQkoMHg2OCkKICNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9PRkYJCSgweDI4KQogI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQwX09GRgkJKDB4NTApCkBAIC0yNzksOTQgKzI0NSw5MiBAQAogI2RlZmluZQkJSEZBMzg0eF9QQ0lfTTFfTEVOX09GRgkJKDB4YTgpCiAjZGVmaW5lCQlIRkEzODR4X1BDSV9NMV9DVExfT0ZGCQkoMHhhYykKIAotI2VuZGlmCi0KIC8qLS0tIFJlZ2lzdGVyIEZpZWxkIE1hc2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0JVU1kJCSgoVUlOVDE2KUJJVDE1KQotI2RlZmluZQkJSEZBMzg0eF9DTURfQUlORk8JCSgoVUlOVDE2KShCSVQxNCB8IEJJVDEzIHwgQklUMTIgfCBCSVQxMSB8IEJJVDEwIHwgQklUOSB8IEJJVDgpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVAkJKChVSU5UMTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfUkVDTAkJKChVSU5UMTYpQklUOCkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1dSSVRFCQkoKFVJTlQxNilCSVQ4KQotI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREUJCSgoVUlOVDE2KShCSVQ5IHwgQklUOCkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFCQkoKFVJTlQxNikoQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEgfCBCSVQwKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0JVU1kJCSgodTE2KUJJVDE1KQorI2RlZmluZQkJSEZBMzg0eF9DTURfQUlORk8JCSgodTE2KShCSVQxNCB8IEJJVDEzIHwgQklUMTIgfCBCSVQxMSB8IEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVAkJKCh1MTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUkVDTAkJKCh1MTYpQklUOCkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1dSSVRFCQkoKHUxNilCSVQ4KQorI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREUJCSgodTE2KShCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFCQkoKHUxNikoQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEgfCBCSVQwKSkKIAotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUCQkoKFVJTlQxNikoQklUMTQgfCBCSVQxMyB8IEJJVDEyIHwgQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREUJCSgoVUlOVDE2KShCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSB8IEJJVDApKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUCQkoKHUxNikoQklUMTQgfCBCSVQxMyB8IEJJVDEyIHwgQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREUJCSgodTE2KShCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSB8IEJJVDApKQogCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9CVVNZCQkoKFVJTlQxNilCSVQxNSkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0VSUgkJKChVSU5UMTYpQklUMTQpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9EQVRBT0ZGCQkoKFVJTlQxNikoQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4IHwgQklUNyB8IEJJVDYgfCBCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSkpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9CVVNZCQkoKHUxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0VSUgkJKCh1MTYpQklUMTQpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9EQVRBT0ZGCQkoKHUxNikoQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4IHwgQklUNyB8IEJJVDYgfCBCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RJQ0sJCSgoVUlOVDE2KUJJVDE1KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfV1RFUlIJCSgoVUlOVDE2KUJJVDE0KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSU5GRFJPUAkJKChVSU5UMTYpQklUMTMpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JTkZPCQkoKFVJTlQxNilCSVQ3KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfRFRJTQkJKChVSU5UMTYpQklUNSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0NNRAkJKChVSU5UMTYpQklUNCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0FMTE9DCQkoKFVJTlQxNilCSVQzKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVFhFWEMJCSgoVUlOVDE2KUJJVDIpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9UWAkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1JYCQkoKFVJTlQxNilCSVQwKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVElDSwkJKCh1MTYpQklUMTUpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9XVEVSUgkJKCh1MTYpQklUMTQpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JTkZEUk9QCQkoKHUxNilCSVQxMykKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lORk8JCSgodTE2KUJJVDcpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9EVElNCQkoKHUxNilCSVQ1KQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfQ01ECQkoKHUxNilCSVQ0KQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfQUxMT0MJCSgodTE2KUJJVDMpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9UWEVYQwkJKCh1MTYpQklUMikKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RYCQkoKHUxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfUlgJCSgodTE2KUJJVDApCiAKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X0lOVF9CQVBfT1AgICAgICAgICAgIChIRkEzODR4X0VWU1RBVF9JTkZPfEhGQTM4NHhfRVZTVEFUX1JYfEhGQTM4NHhfRVZTVEFUX1RYfEhGQTM4NHhfRVZTVEFUX1RYRVhDKQorI2RlZmluZSAgICAgICAgIEhGQTM4NHhfaW50X0JBUF9PUCAgICAgICAgICAgKEhGQTM4NHhfRVZTVEFUX0lORk98SEZBMzg0eF9FVlNUQVRfUlh8SEZBMzg0eF9FVlNUQVRfVFh8SEZBMzg0eF9FVlNUQVRfVFhFWEMpCiAKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X0lOVF9OT1JNQUwgICAgICAgICAgIChIRkEzODR4X0VWU1RBVF9JTkZPfEhGQTM4NHhfRVZTVEFUX1JYfEhGQTM4NHhfRVZTVEFUX1RYfEhGQTM4NHhfRVZTVEFUX1RYRVhDfEhGQTM4NHhfRVZTVEFUX0lORkRST1B8SEZBMzg0eF9FVlNUQVRfQUxMT0N8SEZBMzg0eF9FVlNUQVRfRFRJTSkKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X2ludF9OT1JNQUwgICAgICAgICAgIChIRkEzODR4X0VWU1RBVF9JTkZPfEhGQTM4NHhfRVZTVEFUX1JYfEhGQTM4NHhfRVZTVEFUX1RYfEhGQTM4NHhfRVZTVEFUX1RYRVhDfEhGQTM4NHhfRVZTVEFUX0lORkRST1B8SEZBMzg0eF9FVlNUQVRfQUxMT0N8SEZBMzg0eF9FVlNUQVRfRFRJTSkKIAotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9USUNLCQkoKFVJTlQxNilCSVQxNSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fV1RFUlIJCSgoVUlOVDE2KUJJVDE0KQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JTkZEUk9QCQkoKFVJTlQxNilCSVQxMykKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSU5GTwkJKChVSU5UMTYpQklUNykKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fRFRJTQkJKChVSU5UMTYpQklUNSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fQ01ECQkoKFVJTlQxNilCSVQ0KQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9BTExPQwkJKChVSU5UMTYpQklUMykKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVFhFWEMJCSgoVUlOVDE2KUJJVDIpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RYCQkoKFVJTlQxNilCSVQxKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9SWAkJKChVSU5UMTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fVElDSwkJKCh1MTYpQklUMTUpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1dURVJSCQkoKHUxNilCSVQxNCkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSU5GRFJPUAkJKCh1MTYpQklUMTMpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lORk8JCSgodTE2KUJJVDcpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0RUSU0JCSgodTE2KUJJVDUpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0NNRAkJKCh1MTYpQklUNCkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fQUxMT0MJCSgodTE2KUJJVDMpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RYRVhDCQkoKHUxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9UWAkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fUlgJCSgodTE2KUJJVDApCiAKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVElDSwkJKChVSU5UMTYpQklUMTUpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1dURVJSCQkoKFVJTlQxNilCSVQxNCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GRFJPUAkJKChVSU5UMTYpQklUMTMpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORk8JCSgoVUlOVDE2KUJJVDcpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0RUSU0JCSgoVUlOVDE2KUJJVDUpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0NNRAkJKChVSU5UMTYpQklUNCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQUxMT0MJCSgoVUlOVDE2KUJJVDMpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYRVhDCQkoKFVJTlQxNilCSVQyKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWAkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfUlgJCSgoVUlOVDE2KUJJVDApCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RJQ0sJCSgodTE2KUJJVDE1KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19XVEVSUgkJKCh1MTYpQklUMTQpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORkRST1AJCSgodTE2KUJJVDEzKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZPCQkoKHUxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19EVElNCQkoKHUxNilCSVQ1KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19DTUQJCSgodTE2KUJJVDQpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0FMTE9DCQkoKHUxNilCSVQzKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWEVYQwkJKCh1MTYpQklUMikKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFgJCSgodTE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1JYCQkoKHUxNilCSVQwKQogCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU4JCSgoVUlOVDE2KShCSVQxNSB8IEJJVDE0KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTgkJKCh1MTYpKEJJVDE1IHwgQklUMTQpKQogCiAKIC8qLS0tIENvbW1hbmQgQ29kZSBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0gQ29udHJvbGxlciBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfSU5JVAkJKChVSU5UMTYpMHgwMCkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9FTkFCTEUJCSgoVUlOVDE2KTB4MDEpCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRElTQUJMRQkJKChVSU5UMTYpMHgwMikKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ESUFHCQkoKFVJTlQxNikweDAzKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0lOSVQJCSgodTE2KTB4MDApCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRU5BQkxFCQkoKHUxNikweDAxKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0RJU0FCTEUJCSgodTE2KTB4MDIpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRElBRwkJKCh1MTYpMHgwMykKIAogLyotLS0gQnVmZmVyIE1nbXQgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0FMTE9DCQkoKFVJTlQxNikweDBBKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX1RYCQkoKFVJTlQxNikweDBCKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0NMUlBSU1QJCSgoVUlOVDE2KTB4MTIpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfQUxMT0MJCSgodTE2KTB4MEEpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfVFgJCSgodTE2KTB4MEIpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfQ0xSUFJTVAkJKCh1MTYpMHgxMikKIAogLyotLS0gUmVndWxhdGUgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX05PVElGWQkJKChVSU5UMTYpMHgxMCkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9JTlEJCSgoVUlOVDE2KTB4MTEpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfTk9USUZZCQkoKHUxNikweDEwKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0lOUQkJKCh1MTYpMHgxMSkKIAogLyotLS0gQ29uZmlndXJlIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9BQ0NFU1MJCSgoVUlOVDE2KTB4MjEpCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRE9XTkxECQkoKFVJTlQxNikweDIyKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0FDQ0VTUwkJKCh1MTYpMHgyMSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ET1dOTEQJCSgodTE2KTB4MjIpCiAKIC8qLS0tIERlYnVnZ2luZyBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIAlIRkEzODR4X0NNRENPREVfTU9OSVRPUgkJKChVSU5UMTYpKDB4MzgpKQotI2RlZmluZQkJSEZBMzg0eF9NT05JVE9SX0VOQUJMRQkJKChVSU5UMTYpKDB4MGIpKQotI2RlZmluZQkJSEZBMzg0eF9NT05JVE9SX0RJU0FCTEUJCSgoVUlOVDE2KSgweDBmKSkKKyNkZWZpbmUgCUhGQTM4NHhfQ01EQ09ERV9NT05JVE9SCQkoKHUxNikoMHgzOCkpCisjZGVmaW5lCQlIRkEzODR4X01PTklUT1JfRU5BQkxFCQkoKHUxNikoMHgwYikpCisjZGVmaW5lCQlIRkEzODR4X01PTklUT1JfRElTQUJMRQkJKCh1MTYpKDB4MGYpKQogCiAvKi0tLSBSZXN1bHQgQ29kZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9TVUNDRVNTCQkJKChVSU5UMTYpKDB4MDApKQotI2RlZmluZQkJSEZBMzg0eF9DQVJEX0ZBSUwJCSgoVUlOVDE2KSgweDAxKSkKLSNkZWZpbmUJCUhGQTM4NHhfTk9fQlVGRgkJCSgoVUlOVDE2KSgweDA1KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0VSUgkJCSgoVUlOVDE2KSgweDdGKSkKKyNkZWZpbmUJCUhGQTM4NHhfU1VDQ0VTUwkJCSgodTE2KSgweDAwKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ0FSRF9GQUlMCQkoKHUxNikoMHgwMSkpCisjZGVmaW5lCQlIRkEzODR4X05PX0JVRkYJCQkoKHUxNikoMHgwNSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9FUlIJCQkoKHUxNikoMHg3RikpCiAKIC8qLS0tIFByb2dyYW1taW5nIE1vZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJTU9ERSAwOiBEaXNhYmxlIHByb2dyYW1taW5nCkBAIC0zNzQsNDggKzMzOCw0OCBAQAogCU1PREUgMjogRW5hYmxlIG5vbi12b2xhdGlsZSBtZW1vcnkgcHJvZ3JhbW1pbmcKIAlNT0RFIDM6IFByb2dyYW0gbm9uLXZvbGF0aWxlIG1lbW9yeSBzZWN0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX0RJU0FCTEUJKChVSU5UMTYpMHgwMCkKLSNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfUkFNCQkoKFVJTlQxNikweDAxKQotI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9OVgkJKChVSU5UMTYpMHgwMikKLSNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlZXUklURQkoKFVJTlQxNikweDAzKQorI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9ESVNBQkxFCSgodTE2KTB4MDApCisjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX1JBTQkJKCh1MTYpMHgwMSkKKyNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlYJCSgodTE2KTB4MDIpCisjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX05WV1JJVEUJKCh1MTYpMHgwMykKIAogLyotLS0gQVVYIHJlZ2lzdGVyIGVuYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0FVWFBXMAkJCSgoVUlOVDE2KTB4ZmUwMSkKLSNkZWZpbmUJCUhGQTM4NHhfQVVYUFcxCQkJKChVSU5UMTYpMHhkYzIzKQotI2RlZmluZQkJSEZBMzg0eF9BVVhQVzIJCQkoKFVJTlQxNikweGJhNDUpCisjZGVmaW5lCQlIRkEzODR4X0FVWFBXMAkJCSgodTE2KTB4ZmUwMSkKKyNkZWZpbmUJCUhGQTM4NHhfQVVYUFcxCQkJKCh1MTYpMHhkYzIzKQorI2RlZmluZQkJSEZBMzg0eF9BVVhQVzIJCQkoKHUxNikweGJhNDUpCiAKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfSVNESVNBQkxFRAkoKFVJTlQxNikweDAwMDApCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0lTRU5BQkxFRAkoKFVJTlQxNikweGMwMDApCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0RPRU5BQkxFCSgoVUlOVDE2KTB4ODAwMCkKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfRE9ESVNBQkxFCSgoVUlOVDE2KTB4NDAwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfSVNESVNBQkxFRAkoKHUxNikweDAwMDApCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0lTRU5BQkxFRAkoKHUxNikweGMwMDApCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0RPRU5BQkxFCSgodTE2KTB4ODAwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfRE9ESVNBQkxFCSgodTE2KTB4NDAwMCkKIAogLyotLS0gUmVjb3JkIElEIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBPUlRUWVBFCQkoKFVJTlQxNikweEZDMDApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSCSgoVUlOVDE2KTB4RkMwMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lECSgoVUlOVDE2KTB4RkMwMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUwJKChVSU5UMTYpMHhGQzAzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOU1NJRAkJKChVSU5UMTYpMHhGQzA0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQVRJTVdJTgkoKFVJTlQxNikweEZDMDUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRQkJKChVSU5UMTYpMHhGQzA2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTgkoKFVJTlQxNikweEZDMDcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSCQkoKFVJTlQxNikweEZDMDgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVOQUJMRUQJKChVSU5UMTYpMHhGQzA5KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FUFMJCSgoVUlOVDE2KTB4RkMwQSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1VTFRJQ0FTVFJYCSgoVUlOVDE2KTB4RkMwQikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSCSgoVUlOVDE2KTB4RkMwQykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNSE9MRERVUgkoKFVJTlQxNikweEZDMEQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05OQU1FCQkoKFVJTlQxNikweEZDMEUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSCSgoVUlOVDE2KTB4RkMxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIxCQkoKFVJTlQxNikweEZDMTEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMgkJKChVSU5UMTYpMHhGQzEyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjMJCSgoVUlOVDE2KTB4RkMxMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI0CQkoKFVJTlQxNikweEZDMTQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNQkJKChVSU5UMTYpMHhGQzE1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjYJCSgoVUlOVDE2KTB4RkMxNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1DQVNUUE1CVUZGCSgoVUlOVDE2KTB4RkMxNykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBPUlRUWVBFCQkoKHUxNikweEZDMDApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSCSgodTE2KTB4RkMwMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lECSgodTE2KTB4RkMwMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUwJKCh1MTYpMHhGQzAzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOU1NJRAkJKCh1MTYpMHhGQzA0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQVRJTVdJTgkoKHUxNikweEZDMDUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRQkJKCh1MTYpMHhGQzA2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTgkoKHUxNikweEZDMDcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSCQkoKHUxNikweEZDMDgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVOQUJMRUQJKCh1MTYpMHhGQzA5KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FUFMJCSgodTE2KTB4RkMwQSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1VTFRJQ0FTVFJYCSgodTE2KTB4RkMwQikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSCSgodTE2KTB4RkMwQykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNSE9MRERVUgkoKHUxNikweEZDMEQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05OQU1FCQkoKHUxNikweEZDMEUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSCSgodTE2KTB4RkMxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIxCQkoKHUxNikweEZDMTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMgkJKCh1MTYpMHhGQzEyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjMJCSgodTE2KTB4RkMxMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI0CQkoKHUxNikweEZDMTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNQkJKCh1MTYpMHhGQzE1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjYJCSgodTE2KTB4RkMxNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1DQVNUUE1CVUZGCSgodTE2KTB4RkMxNykKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSUQgbGVuZ3RoczogTmV0d29yayBQYXJhbXMsIFN0YXRpYyBDb25maWcgRW50aXRpZXMKQEAgLTQyMyw2MiArMzg3LDYyIEBACiAgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRPRE86IGZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlc2UgKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBPUlRUWVBFX0xFTgkoKFVJTlQxNikyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTgkoKFVJTlQxNikzNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUxfTEVOCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTgkoKFVJTlQxNikzNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkFUSU1XSU5fTEVOCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWERBVEFMRU5fTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVEX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FUFNfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNVUxUSUNBU1RSWF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTkFNRV9MRU4JKChVSU5UMTYpMzQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjFfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMl9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIzX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjRfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNV9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI2X0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUNBU1RQTUJVRkZfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTl9MRU4gKChVSU5UMTYpc2l6ZW9mKFVJTlQxNikpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBPUlRUWVBFX0xFTgkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTgkoKHUxNikzNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUxfTEVOCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTgkoKHUxNikzNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkFUSU1XSU5fTEVOCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWERBVEFMRU5fTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVEX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FUFNfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNVUxUSUNBU1RSWF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTkFNRV9MRU4JKCh1MTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjFfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMl9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIzX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjRfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNV9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI2X0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUNBU1RQTUJVRkZfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTl9MRU4gKCh1MTYpc2l6ZW9mKHUxNikpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUl9MRU4JKCh1MTYpMCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSURzOiBOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfR1JPVVBBRERSCQkoKFVJTlQxNikweEZDODApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DUkVBVEVJQlNTCQkoKFVJTlQxNikweEZDODEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNICQkoKFVJTlQxNikweEZDODIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gJCSgoVUlOVDE2KTB4RkM4MykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwJCSgoVUlOVDE2KTB4RkM4NCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BST01JU0NNT0RFCQkoKFVJTlQxNikweEZDODUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMAkJKChVSU5UMTYpMHhGQzkwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDEJCSgoVUlOVDE2KTB4RkM5MSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gyCQkoKFVJTlQxNikweEZDOTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMwkJKChVSU5UMTYpMHhGQzkzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDQJCSgoVUlOVDE2KTB4RkM5NCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g1CQkoKFVJTlQxNikweEZDOTUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINgkJKChVSU5UMTYpMHhGQzk2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMAkJKChVSU5UMTYpMHhGQzk3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMQkJKChVSU5UMTYpMHhGQzk4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMgkJKChVSU5UMTYpMHhGQzk5KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMwkJKChVSU5UMTYpMHhGQzlBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINAkJKChVSU5UMTYpMHhGQzlCKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINQkJKChVSU5UMTYpMHhGQzlDKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINgkJKChVSU5UMTYpMHhGQzlEKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDAJCSgoVUlOVDE2KTB4RkM5RSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwxCQkoKFVJTlQxNikweEZDOUYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMgkJKChVSU5UMTYpMHhGQ0EwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDMJCSgoVUlOVDE2KTB4RkNBMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw0CQkoKFVJTlQxNikweEZDQTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNQkJKChVSU5UMTYpMHhGQ0EzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDYJCSgoVUlOVDE2KTB4RkNBNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUgkJKCh1MTYpMHhGQzgwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTUwkJKCh1MTYpMHhGQzgxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSAkJKCh1MTYpMHhGQzgyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNICQkoKHUxNikweEZDODMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMCQkoKHUxNikweEZDODQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERQkJKCh1MTYpMHhGQzg1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDAJCSgodTE2KTB4RkM5MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxCQkoKHUxNikweEZDOTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMgkJKCh1MTYpMHhGQzkyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDMJCSgodTE2KTB4RkM5MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0CQkoKHUxNikweEZDOTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINQkJKCh1MTYpMHhGQzk1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDYJCSgodTE2KTB4RkM5NikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDAJCSgodTE2KTB4RkM5NykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDEJCSgodTE2KTB4RkM5OCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDIJCSgodTE2KTB4RkM5OSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDMJCSgodTE2KTB4RkM5QSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDQJCSgodTE2KTB4RkM5QikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDUJCSgodTE2KTB4RkM5QykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDYJCSgodTE2KTB4RkM5RCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwwCQkoKHUxNikweEZDOUUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMQkJKCh1MTYpMHhGQzlGKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDIJCSgodTE2KTB4RkNBMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwzCQkoKHUxNikweEZDQTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNAkJKCh1MTYpMHhGQ0EyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDUJCSgodTE2KTB4RkNBMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw2CQkoKHUxNikweEZDQTQpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbmZpZ3VyYXRpb24gUklEIExlbmd0aHM6IE5ldHdvcmsgUGFyYW0sIER5bmFtaWMgQ29uZmlnIEVudGl0aWVzCkBAIC00ODYsMjk2ICs0NTAsMjk2IEBACiAgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRPRE86IGZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlc2UgKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUl9MRU4JKChVSU5UMTYpMTYgKiBXTEFOX0FERFJfTEVOKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTU19MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0hfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0hfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMX0xFTgkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREVfTEVOCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDJfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIM19MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDVfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDBfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gxX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDNfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g0X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDZfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwxX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDJfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMM19MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw0X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDVfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUl9MRU4JKCh1MTYpMTYgKiBXTEFOX0FERFJfTEVOKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTU19MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0hfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0hfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMX0xFTgkoKHUxNik0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREVfTEVOCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDJfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIM19MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDVfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDBfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gxX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDNfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g0X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDZfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwxX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDJfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMM19MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw0X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDVfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNl9MRU4JKCh1MTYpMCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSURzOiBCZWhhdmlvciBQYXJhbWV0ZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9JVElDS1RJTUUJCSgoVUlOVDE2KTB4RkNFMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0lUSUNLVElNRQkJKCh1MTYpMHhGQ0UwKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb25maWd1cmF0aW9uIFJJRCBMZW5ndGhzOiBCZWhhdmlvciBQYXJhbWV0ZXJzCiAgIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfSVRJQ0tUSU1FX0xFTgkoKFVJTlQxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfSVRJQ0tUSU1FX0xFTgkoKHUxNikyKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRHM6IE5JQyBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUJCSgoVUlOVDE2KTB4RkQwMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSCSgoVUlOVDE2KTB4RkQwMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZCQkoKFVJTlQxNikweEZEMDIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklTVVBSQU5HRQkJKChVSU5UMTYpMHhGRDAzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJX0NGSUFDVFJBTkdFUwkoKFVJTlQxNikweEZEMDQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVIJKChVSU5UMTYpMHhGRDBBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTklDSURFTlRJVFkJCSgoVUlOVDE2KTB4RkQwQikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01GSVNVUFJBTkdFCQkoKFVJTlQxNikweEZEMEMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRklTVVBSQU5HRQkJKChVSU5UMTYpMHhGRDBEKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTExJU1QJCSgoVUlOVDE2KTB4RkQxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TCSgoVUlOVDE2KTB4RkQxMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RFTVBUWVBFCQkoKFVJTlQxNikweEZEMTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DSVMJCQkoKFVJTlQxNikweEZEMTMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFJREVOVElUWQkJKChVSU5UMTYpMHhGRDIwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBU1VQUkFOR0UJCSgoVUlOVDE2KTB4RkQyMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQV9NRklBQ1RSQU5HRVMJKChVSU5UMTYpMHhGRDIyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX0NGSUFDVFJBTkdFUwkoKFVJTlQxNikweEZEMjMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9CVUlMRFNFUQkJKChVSU5UMTYpMHhGRkZFKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRldJRAkJKChVSU5UMTYpMHhGRkZGKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUJCSgodTE2KTB4RkQwMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSCSgodTE2KTB4RkQwMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZCQkoKHUxNikweEZEMDIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklTVVBSQU5HRQkJKCh1MTYpMHhGRDAzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJX0NGSUFDVFJBTkdFUwkoKHUxNikweEZEMDQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVIJKCh1MTYpMHhGRDBBKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTklDSURFTlRJVFkJCSgodTE2KTB4RkQwQikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01GSVNVUFJBTkdFCQkoKHUxNikweEZEMEMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRklTVVBSQU5HRQkJKCh1MTYpMHhGRDBEKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTExJU1QJCSgodTE2KTB4RkQxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TCSgodTE2KTB4RkQxMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RFTVBUWVBFCQkoKHUxNikweEZEMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSVMJCQkoKHUxNikweEZEMTMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFJREVOVElUWQkJKCh1MTYpMHhGRDIwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBU1VQUkFOR0UJCSgodTE2KTB4RkQyMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQV9NRklBQ1RSQU5HRVMJKCh1MTYpMHhGRDIyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX0NGSUFDVFJBTkdFUwkoKHUxNikweEZEMjMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9CVUlMRFNFUQkJKCh1MTYpMHhGRkZFKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRldJRAkJKCh1MTYpMHhGRkZGKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiBOSUMgSW5mb3JtYXRpb24KICAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIEpVU1QgdGhlIERBVEEgcGFydCBvZiB0aGUgUklEIChkb2VzIG5vdAogICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhMT0FEVElNRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUl9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2Rvd25sb2FkYnVmZmVyX3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJSURFTlRJVFlfTEVOCQkoKFVJTlQxNik4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJU1VQUkFOR0VfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSUFDVFJBTkdFU19MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTgkJKChVSU5UMTYpMTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNJREVOVElUWV9MRU4JCSgoVUlOVDE2KTgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NRklTVVBSQU5HRV9MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0VfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxMSVNUX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TX0xFTgkoKFVJTlQxNikxMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RFTVBUWVBFX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NJU19MRU4JCQkoKFVJTlQxNik0ODApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFJREVOVElUWV9MRU4JCSgoVUlOVDE2KTgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFTVVBSQU5HRV9MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJQUNUUkFOR0VTX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVMyX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9CVUlMRFNFUV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X0J1aWxkU2VxX3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRldJRF9MRU4JCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9GV0lEX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVJfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcl90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZX0xFTgkJKCh1MTYpOCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVNVUFJBTkdFX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVNfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4JCSgodTE2KTEyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTklDSURFTlRJVFlfTEVOCQkoKHUxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJU1VQUkFOR0VfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSVNVUFJBTkdFX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMTElTVF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SRUdVTEFUT1JZRE9NQUlOU19MRU4JKCh1MTYpMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9URU1QVFlQRV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSVNfTEVOCQkJKCh1MTYpNDgwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBSURFTlRJVFlfTEVOCQkoKHUxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBU1VQUkFOR0VfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01GSUFDVFJBTkdFU19MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJQUNUUkFOR0VTMl9MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQlVJTERTRVFfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9CdWlsZFNlcV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZXSURfTEVOCQkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfRldJRF90KSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gUklEczogIE1BQyBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfUE9SVFNUQVRVUwkJKChVSU5UMTYpMHhGRDQwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFNTSUQJCSgoVUlOVDE2KTB4RkQ0MSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCU1NJRAkoKFVJTlQxNikweEZENDIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DT01NU1FVQUxJVFkJKChVSU5UMTYpMHhGRDQzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURQkoKFVJTlQxNikweEZENDQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQkNOSU5UCSgoVUlOVDE2KTB4RkQ0NSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTQ0FMRVRIUkVTSAkoKFVJTlQxNikweEZENDYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9UT0NPTFJTUFRJTUUJKChVSU5UMTYpMHhGRDQ3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfU0hPUlRSRVRSWUxJTUlUCSgoVUlOVDE2KTB4RkQ0OCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0xPTkdSRVRSWUxJTUlUCSgoVUlOVDE2KTB4RkQ0OSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFRYTElGRVRJTUUJKChVSU5UMTYpMHhGRDRBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRQkoKFVJTlQxNikweEZENEIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRlBPTExBQkxFCQkoKFVJTlQxNikweEZENEMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNUwkoKFVJTlQxNikweEZENEQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QCSgoVUlOVDE2KTB4RkQ0RikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWQkoKFVJTlQxNikweEZENTEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMQkoKFVJTlQxNikweEZEODApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMgkoKFVJTlQxNikweEZEODEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMwkoKFVJTlQxNikweEZEODIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNAkoKFVJTlQxNikweEZEODMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNQkoKFVJTlQxNikweEZEODQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNgkoKFVJTlQxNikweEZEODUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTCSgoVUlOVDE2KTB4RkQ4NikKLS8vICNkZWZpbmUJSEZBMzg0eF9SSURfUENGSU5GTwkJKChVSU5UMTYpMHhGRDg3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFU1VMVFMgICAgICAgCSgoVUlOVDE2KTB4RkQ4OCkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9IT1NUU0NBTlJFU1VMVFMgICAJKChVSU5UMTYpMHhGRDg5KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FUSU9OVVNFRAkoKFVJTlQxNikweEZEOEEpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfQVNTT0NJQVRFRkFJTFVSRSAgCSgoVUlOVDE2KTB4RkQ4RCkgLy8gMS44LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BPUlRTVEFUVVMJCSgodTE2KTB4RkQ0MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lECQkoKHUxNikweEZENDEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSUQJKCh1MTYpMHhGRDQyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZCSgodTE2KTB4RkQ0MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUJKCh1MTYpMHhGRDQ0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJDTmludAkoKHUxNikweEZENDUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU0NBTEVUSFJFU0gJKCh1MTYpMHhGRDQ2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FCSgodTE2KTB4RkQ0NykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVAkoKHUxNikweEZENDgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVAkoKHUxNikweEZENDkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FCSgodTE2KTB4RkQ0QSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFJYTElGRVRJTUUJKCh1MTYpMHhGRDRCKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRQkJKCh1MTYpMHhGRDRDKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVMJKCh1MTYpMHhGRDREKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJVkFDWU9QVElNUAkoKHUxNikweEZENEYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFkJKCh1MTYpMHhGRDUxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTEJKCh1MTYpMHhGRDgwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTIJKCh1MTYpMHhGRDgxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTMJKCh1MTYpMHhGRDgyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTQJKCh1MTYpMHhGRDgzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTUJKCh1MTYpMHhGRDg0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTYJKCh1MTYpMHhGRDg1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfT1dOTUFDQUREUkVTUwkoKHUxNikweEZEODYpCisvLyAjZGVmaW5lCUhGQTM4NHhfUklEX1BDRklORk8JCSgodTE2KTB4RkQ4NykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVNVTFRTICAgICAgIAkoKHUxNikweEZEODgpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfSE9TVFNDQU5SRVNVTFRTICAgCSgodTE2KTB4RkQ4OSkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIRU5USUNBVElPTlVTRUQJKCh1MTYpMHhGRDhBKSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FTU09DSUFURUZBSUxVUkUgIAkoKHUxNikweEZEOEQpIC8vIDEuOC4wCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiAgTUFDIEluZm9ybWF0aW9uCiAgIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfUE9SVFNUQVRVU19MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU1NJRF9MRU4JCSgoVUlOVDE2KTM0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lEX0xFTgkJKChVSU5UMTYpV0xBTl9CU1NJRF9MRU4pCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9jb21tc3F1YWxpdHlfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFlfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9kYm1jb21tc3F1YWxpdHlfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCQ05JTlRfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBQ1VSU0NBTEVUSFJFU0hfTEVOCSgoVUlOVDE2KTEyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVBDVVJTQ0FMRVRIUkVTSF9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BST1RPQ09MUlNQVElNRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TSE9SVFJFVFJZTElNSVRfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTE9OR1JFVFJZTElNSVRfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhSWExJRkVUSU1FX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NGUE9MTEFCTEVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVNfTEVOCQkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJVkFDWU9QVElNUF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMl9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFM19MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNl9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTX0xFTgkJKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BDRklORk9fTEVOCQkJKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X1BDRkluZm9fZGF0YV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVFVRVNUX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfU2NhblJlcXVlc3RfZGF0YV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0pPSU5SRVFVRVNUX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FURVNUQV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVF9MRU4JKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGFfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QT1JUU1RBVFVTX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lEX0xFTgkJKCh1MTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSURfTEVOCQkoKHUxNilXTEFOX0JTU0lEX0xFTikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X2NvbW1zcXVhbGl0eV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWV9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X2RibWNvbW1zcXVhbGl0eV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJDTmludF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFDVVJTQ0FMRVRIUkVTSF9MRU4JKCh1MTYpMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BUENVUlNDQUxFVEhSRVNIX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFJYTElGRVRJTUVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNU19MRU4JCSgodTE2KTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUxX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUyX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU0X0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU1X0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2X0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1NfTEVOCQkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUENGSU5GT19MRU4JCQkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfUENGSW5mb19kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFUVVFU1RfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9TY2FuUmVxdWVzdF9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRFU1RBX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTElORk9SRVFVRVNUX0xFTgkoKHUxNilzaXplb2YoaGZhMzg0eF9DaGFubmVsSW5mb1JlcXVlc3RfZGF0YV90KSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRHM6ICBNb2RlbSBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRQkJKChVSU5UMTYpMHhGREMwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwJKChVSU5UMTYpMHhGREMxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEUJKChVSU5UMTYpMHhGREMyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0NBTU9ERQkJKChVSU5UMTYpMHhGREMzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTCSgoVUlOVDE2KTB4RkRDNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0xGT1NUQVRVUyAgICAgICAgICAgKChVSU5UMTYpMHhGREM3KSAvLyAxLjcuMQorI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRQkJKCh1MTYpMHhGREMwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwJKCh1MTYpMHhGREMxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEUJKCh1MTYpMHhGREMyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0NBTU9ERQkJKCh1MTYpMHhGREMzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTCSgodTE2KTB4RkRDNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0xGT1NUQVRVUyAgICAgICAgICAgKCh1MTYpMHhGREM3KSAvLyAxLjcuMQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBSSUQgTGVuZ3RoczogIE1vZGVtIEluZm9ybWF0aW9uCiAgIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRV9MRU4JCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUxfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEVfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DQ0FNT0RFX0xFTgkJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVVBQT1JURUREQVRBUkFURVNfTEVOCSgoVUlOVDE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRV9MRU4JCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUxfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEVfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DQ0FNT0RFX0xFTgkJCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVVBQT1JURUREQVRBUkFURVNfTEVOCSgodTE2KTEwKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBBUEkgRU5IQU5DRU1FTlRTIChOT1QgQUxSRUFEWSBJTVBMRU1FTlRFRCkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRAkoKFVJTlQxNikweEZDMjMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMAkoKFVJTlQxNikweEZDMjQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMQkoKFVJTlQxNikweEZDMjUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMgkoKFVJTlQxNikweEZDMjYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMwkoKFVJTlQxNikweEZDMjcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBGTEFHUwkJKChVSU5UMTYpMHhGQzI4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQS0VZTUFQVEFCTEUJKChVSU5UMTYpMHhGQzI5KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04JKChVSU5UMTYpMHhGQzJBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYQVNTT0NTVEFUSU9OUwkoKFVJTlQxNikweEZDMkIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUWENPTlRST0wJKChVSU5UMTYpMHhGQzJDKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUJKChVSU5UMTYpMHhGQzJEKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GSE9TVEFVVEhBU1NPQwkoKFVJTlQxNikweEZDMkUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZSQ1ZDUkNFUlJPUgkoKFVJTlQxNikweEZDMzApCi0vLyAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNTUxJRkUJCSgoVUlOVDE2KTB4RkMzMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFMVFJFVFJZQ05UCSgoVUlOVDE2KTB4RkMzMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQQkNOSU5UCQkoKFVJTlQxNikweEZDMzMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBUFBDRklORk8JKChVSU5UMTYpMHhGQzM0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1RBUENGSU5GTwkoKFVJTlQxNikweEZDMzUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUklPUklUWVFVU0FHRQkoKFVJTlQxNikweEZDMzcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUSU1DVFJMCQkoKFVJTlQxNikweEZDNDApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUSElSVFkyVEFMTFkJKChVSU5UMTYpMHhGQzQyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRU5IU0VDVVJJVFkJKChVSU5UMTYpMHhGQzQzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREJNQURKVVNUICAJKChVSU5UMTYpMHhGQzQ2KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldQQURBVEEgICAgICAgCSgoVUlOVDE2KTB4RkM0OCkgLy8gMS43LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBST1BPR0FUSU9OREVMQVkJKChVSU5UMTYpMHhGQzQ5KSAvLyAxLjcuNgotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU0hPUlRQUkVBTUJMRQkoKFVJTlQxNikweEZDQjApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZFWENMT05HUFJFQU1CTEUJKChVSU5UMTYpMHhGQ0IxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSFJTUFRJTUVPVVQJKChVSU5UMTYpMHhGQ0IyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUwkoKFVJTlQxNikweEZDQjMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTVVBQUkFURVMJKChVSU5UMTYpMHhGQ0I0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRkFMTEJBQ0tDVFJMCSgoVUlOVDE2KTB4RkNCNSkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9XRVBLRVlTVEFUVVMgICAJKChVSU5UMTYpMHhGQ0I2KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1dFUEtFWU1BUElOREVYIAkoKFVJTlQxNikweEZDQjcpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfQlJPQURDQVNUS0VZSUQgCSgoVUlOVDE2KTB4RkNCOCkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9FTlRTRUNGTEFHRVlJRCAJKChVSU5UMTYpMHhGQ0I5KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBBU1NJVkVTQ0FOQ1RSTAkoKFVJTlQxNikweEZDQkEpIC8vIE5FVyBTVEEKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldQQUhBTkRMSU5HCSgoVUlOVDE2KTB4RkNCQikgLy8gMS43LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01EQ0NPTlRST0wgICAgICAgIAkoKFVJTlQxNikweEZDQkMpIC8vIDEuNy4wLzEuNC4wCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NRENDT1VOVFJZICAgICAgICAJKChVSU5UMTYpMHhGQ0JEKSAvLyAxLjcuMC8xLjQuMAotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhQT1dFUk1BWCAgICAgICAgCSgoVUlOVDE2KTB4RkNCRSkgLy8gMS43LjAvMS40LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkxGT0VOQkxFRCAgICAgIAkoKFVJTlQxNikweEZDQkYpIC8vIDEuNi4zCi0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfQ0FQSU5GTyAgICAgICAgICAgICAoKFVJTlQxNikweEZDQzApIC8vIDEuNy4wLzEuMy43Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfTElTVEVOSU5URVJWQUwgICAgICAoKFVJTlQxNikweEZDQzEpIC8vIDEuNy4wLzEuMy43Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfRElWRVJTSVRZRU5BQkxFRCAgICAoKFVJTlQxNikweEZDQzIpIC8vIDEuNy4wLzEuMy43Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfTEVEX0NPTlRST0wgICAgICAgICAoKFVJTlQxNikweEZDQzQpIC8vIDEuNy42Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfSEZPX0RFTEFZICAgICAgICAgICAoKFVJTlQxNikweEZDQzUpIC8vIDEuNy42Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfRElTU0FMT1dFREJTU0lEICAgICAoKFVJTlQxNikweEZDQzYpIC8vIDEuOC4wCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVRVUVTVAkJKChVSU5UMTYpMHhGQ0UxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1QJCSgoVUlOVDE2KTB4RkNFMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FURVNUQQkoKFVJTlQxNikweEZDRTMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMSU5GT1JFUVVFU1QJKChVSU5UMTYpMHhGQ0U0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfSE9TVFNDQU4gICAgICAgICAgCSgoVUlOVDE2KTB4RkNFNSkgLy8gTkVXIFNUQQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVNTT0NJQVRFU1RBCSgoVUlOVDE2KTB4RkNFNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRAkoKHUxNikweEZDMjMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMAkoKHUxNikweEZDMjQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMQkoKHUxNikweEZDMjUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMgkoKHUxNikweEZDMjYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMwkoKHUxNikweEZDMjcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBGTEFHUwkJKCh1MTYpMHhGQzI4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQS0VZTUFQVEFCTEUJKCh1MTYpMHhGQzI5KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04JKCh1MTYpMHhGQzJBKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYQVNTT0NTVEFUSU9OUwkoKHUxNikweEZDMkIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUWENPTlRST0wJKCh1MTYpMHhGQzJDKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUJKCh1MTYpMHhGQzJEKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GSE9TVEFVVEhBU1NPQwkoKHUxNikweEZDMkUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZSQ1ZDUkNFUlJPUgkoKHUxNikweEZDMzApCisvLyAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNTUxJRkUJCSgodTE2KTB4RkMzMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFMVFJFVFJZQ05UCSgodTE2KTB4RkMzMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQQkNOaW50CQkoKHUxNikweEZDMzMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBUFBDRklORk8JKCh1MTYpMHhGQzM0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1RBUENGSU5GTwkoKHUxNikweEZDMzUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUklPUklUWVFVU0FHRQkoKHUxNikweEZDMzcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUSU1DVFJMCQkoKHUxNikweEZDNDApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUSElSVFkyVEFMTFkJKCh1MTYpMHhGQzQyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRU5IU0VDVVJJVFkJKCh1MTYpMHhGQzQzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREJNQURKVVNUICAJKCh1MTYpMHhGQzQ2KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldQQURBVEEgICAgICAgCSgodTE2KTB4RkM0OCkgLy8gMS43LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBST1BPR0FUSU9OREVMQVkJKCh1MTYpMHhGQzQ5KSAvLyAxLjcuNgorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU0hPUlRQUkVBTUJMRQkoKHUxNikweEZDQjApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZFWENMT05HUFJFQU1CTEUJKCh1MTYpMHhGQ0IxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSFJTUFRJTUVPVVQJKCh1MTYpMHhGQ0IyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUwkoKHUxNikweEZDQjMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTVVBQUkFURVMJKCh1MTYpMHhGQ0I0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRkFMTEJBQ0tDVFJMCSgodTE2KTB4RkNCNSkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9XRVBLRVlTVEFUVVMgICAJKCh1MTYpMHhGQ0I2KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1dFUEtFWU1BUElOREVYIAkoKHUxNikweEZDQjcpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQlJPQURDQVNUS0VZSUQgCSgodTE2KTB4RkNCOCkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9FTlRTRUNGTEFHRVlJRCAJKCh1MTYpMHhGQ0I5KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBBU1NJVkVTQ0FOQ1RSTAkoKHUxNikweEZDQkEpIC8vIE5FVyBTVEEKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldQQUhBTkRMSU5HCSgodTE2KTB4RkNCQikgLy8gMS43LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01EQ0NPTlRST0wgICAgICAgIAkoKHUxNikweEZDQkMpIC8vIDEuNy4wLzEuNC4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NRENDT1VOVFJZICAgICAgICAJKCh1MTYpMHhGQ0JEKSAvLyAxLjcuMC8xLjQuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhQT1dFUk1BWCAgICAgICAgCSgodTE2KTB4RkNCRSkgLy8gMS43LjAvMS40LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkxGT0VOQkxFRCAgICAgIAkoKHUxNikweEZDQkYpIC8vIDEuNi4zCisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfQ0FQSU5GTyAgICAgICAgICAgICAoKHUxNikweEZDQzApIC8vIDEuNy4wLzEuMy43CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfTElTVEVOaW50RVJWQUwgICAgICAoKHUxNikweEZDQzEpIC8vIDEuNy4wLzEuMy43CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfRElWRVJTSVRZRU5BQkxFRCAgICAoKHUxNikweEZDQzIpIC8vIDEuNy4wLzEuMy43CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfTEVEX0NPTlRST0wgICAgICAgICAoKHUxNikweEZDQzQpIC8vIDEuNy42CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfSEZPX0RFTEFZICAgICAgICAgICAoKHUxNikweEZDQzUpIC8vIDEuNy42CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfRElTU0FMT1dFREJTU0lEICAgICAoKHUxNikweEZDQzYpIC8vIDEuOC4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVRVUVTVAkJKCh1MTYpMHhGQ0UxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1QJCSgodTE2KTB4RkNFMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FURVNUQQkoKHUxNikweEZDRTMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMSU5GT1JFUVVFU1QJKCh1MTYpMHhGQ0U0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfSE9TVFNDQU4gICAgICAgICAgCSgodTE2KTB4RkNFNSkgLy8gTkVXIFNUQQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVNTT0NJQVRFU1RBCSgodTE2KTB4RkNFNikKIAotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWV9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUDEyOERFRkFVTFRLRVlfTEVOCSgoVUlOVDE2KTE0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUFJJT1FVU0FHRV9MRU4JCSgoVUlOVDE2KTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQMTI4REVGQVVMVEtFWV9MRU4JKCh1MTYpMTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUklPUVVTQUdFX0xFTgkJKCh1MTYpNCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFBEIFJlY29yZCBjb2RlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBIRkEzODR4X1BEUl9QQ0JfUEFSVE5VTQkJKChVSU5UMTYpMHgwMDAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9QREFWRVIJCSgoVUlOVDE2KTB4MDAwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1NFUklBTAkJKChVSU5UMTYpMHgwMDAzKQotI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAwNCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1JBTVNJWkUJCSgoVUlOVDE2KTB4MDAwNSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTUZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4MDAwNikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfQ0ZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4MDAwNykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTklDSUQJCSgoVUlOVDE2KTB4MDAwOCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9SRUZEQUNfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAxMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19NRUFTVVJFTUVOVFMJKChVSU5UMTYpMHgwMDIwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAzMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9NT0RFTV9UUklNREFDX01FQVNVUkVNRU5UUwkoKFVJTlQxNikweDAwNDApCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfQ09SRUdBX0hBQ0sJCSgoVUlOVDE2KTB4MDBmZikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTUFDX0FERFJFU1MJCSgoVUlOVDE2KTB4MDEwMSkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfQ0FMTE5BTUUJKChVSU5UMTYpMHgwMTAyKQotI2RlZmluZSBIRkEzODR4X1BEUl9SRUdET01BSU4JCSgoVUlOVDE2KTB4MDEwMykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfQUxMT1dFRF9DSEFOTkVMCSgoVUlOVDE2KTB4MDEwNCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfREVGQVVMVF9DSEFOTkVMCSgoVUlOVDE2KTB4MDEwNSkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9QUklWQUNZX09QVElPTgkoKFVJTlQxNikweDAxMDYpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1RFTVBUWVBFCQkoKFVJTlQxNikweDAxMDcpCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfUkVGREFDX1NFVFVQCSgoVUlOVDE2KTB4MDExMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19TRVRVUAkJKChVSU5UMTYpMHgwMTIwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfU0VUVVAJKChVSU5UMTYpMHgwMTMwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX1RSSU1EQUNfU0VUVVAJKChVSU5UMTYpMHgwMTQwKQotI2RlZmluZSBIRkEzODR4X1BEUl9JRlJfU0VUVElORwkJKChVSU5UMTYpMHgwMjAwKQotI2RlZmluZSBIRkEzODR4X1BEUl9SRlJfU0VUVElORwkJKChVSU5UMTYpMHgwMjAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0JBU0VMSU5FCSgoVUlOVDE2KTB4MDIwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9TSEFET1cJKChVSU5UMTYpMHgwMjAzKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0lGUkYJKChVSU5UMTYpMHgwMjA0KQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMU1AJKChVSU5UMTYpMHgwMzAwKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMSQkoKFVJTlQxNikweDAzMDEpCi0jZGVmaW5lIEhGQTM4NHhfUERSX01BWF9UWF9QT1dFUiAgCSgoVUlOVDE2KTB4MDMwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTUFTVEVSX0NIQU5fTElTVAkoKFVJTlQxNikweDAzMDMpCi0jZGVmaW5lIEhGQTM4NHhfUERSXzM4NDJfTklDX0NPTkZJRwkoKFVJTlQxNikweDA0MDApCi0jZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9JRAkJKChVSU5UMTYpMHgwNDAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfSUQJCSgoVUlOVDE2KTB4MDQwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX0lGQ09ORgkJKChVSU5UMTYpMHgwNDAzKQotI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfUE1DT05GCQkoKFVJTlQxNikweDA0MDQpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1JGRU5SR1kJCSgoVUlOVDE2KTB4MDQwNikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX1BPV0VSX1RZUEUgICAgICAoKFVJTlQxNikweDA0MDcpCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfVU5LTk9XTjQwOAkJKChVSU5UMTYpMHgwNDA4KQotI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfTUFYX1BPV0VSCSgoVUlOVDE2KTB4MDQwOSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX01BTlVGQUNUVVJFUgkoKFVJTlQxNikweDA0MTApCi0jZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9QUk9EVUNUICAJKChVSU5UMTYpMHgwNDExKQotI2RlZmluZSBIRkEzODR4X1BEUl9BTlRfRElWRVJTSVRZICAgCSgoVUlOVDE2KTB4MDQxMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZPX0RFTEFZICAgICAgIAkoKFVJTlQxNikweDA0MTMpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1NDQUxFX1RIUkVTSCAJKChVSU5UMTYpMHgwNDE0KQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0JfUEFSVE5VTQkJKCh1MTYpMHgwMDAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9QREFWRVIJCSgodTE2KTB4MDAwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1NFUklBTAkJKCh1MTYpMHgwMDAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfTUVBU1VSRU1FTlRTCSgodTE2KTB4MDAwNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1JBTVNJWkUJCSgodTE2KTB4MDAwNSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUZJU1VQUkFOR0UJCSgodTE2KTB4MDAwNikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfQ0ZJU1VQUkFOR0UJCSgodTE2KTB4MDAwNykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDSUQJCSgodTE2KTB4MDAwOCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9SRUZEQUNfTUVBU1VSRU1FTlRTCSgodTE2KTB4MDAxMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19NRUFTVVJFTUVOVFMJKCh1MTYpMHgwMDIwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfTUVBU1VSRU1FTlRTCSgodTE2KTB4MDAzMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9NT0RFTV9UUklNREFDX01FQVNVUkVNRU5UUwkoKHUxNikweDAwNDApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfQ09SRUdBX0hBQ0sJCSgodTE2KTB4MDBmZikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUFDX0FERFJFU1MJCSgodTE2KTB4MDEwMSkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfQ0FMTE5BTUUJKCh1MTYpMHgwMTAyKQorI2RlZmluZSBIRkEzODR4X1BEUl9SRUdET01BSU4JCSgodTE2KTB4MDEwMykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfQUxMT1dFRF9DSEFOTkVMCSgodTE2KTB4MDEwNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfREVGQVVMVF9DSEFOTkVMCSgodTE2KTB4MDEwNSkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9QUklWQUNZX09QVElPTgkoKHUxNikweDAxMDYpCisjZGVmaW5lIEhGQTM4NHhfUERSX1RFTVBUWVBFCQkoKHUxNikweDAxMDcpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfUkVGREFDX1NFVFVQCSgodTE2KTB4MDExMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19TRVRVUAkJKCh1MTYpMHgwMTIwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfU0VUVVAJKCh1MTYpMHgwMTMwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1RSSU1EQUNfU0VUVVAJKCh1MTYpMHgwMTQwKQorI2RlZmluZSBIRkEzODR4X1BEUl9JRlJfU0VUVElORwkJKCh1MTYpMHgwMjAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9SRlJfU0VUVElORwkJKCh1MTYpMHgwMjAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0JBU0VMSU5FCSgodTE2KTB4MDIwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9TSEFET1cJKCh1MTYpMHgwMjAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0lGUkYJKCh1MTYpMHgwMjA0KQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMU1AJKCh1MTYpMHgwMzAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMSQkoKHUxNikweDAzMDEpCisjZGVmaW5lIEhGQTM4NHhfUERSX01BWF9UWF9QT1dFUiAgCSgodTE2KTB4MDMwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUFTVEVSX0NIQU5fTElTVAkoKHUxNikweDAzMDMpCisjZGVmaW5lIEhGQTM4NHhfUERSXzM4NDJfTklDX0NPTkZJRwkoKHUxNikweDA0MDApCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9JRAkJKCh1MTYpMHgwNDAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfSUQJCSgodTE2KTB4MDQwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX0lGQ09ORgkJKCh1MTYpMHgwNDAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfUE1DT05GCQkoKHUxNikweDA0MDQpCisjZGVmaW5lIEhGQTM4NHhfUERSX1JGRU5SR1kJCSgodTE2KTB4MDQwNikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX1BPV0VSX1RZUEUgICAgICAoKHUxNikweDA0MDcpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfVU5LTk9XTjQwOAkJKCh1MTYpMHgwNDA4KQorI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfTUFYX1BPV0VSCSgodTE2KTB4MDQwOSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX01BTlVGQUNUVVJFUgkoKHUxNikweDA0MTApCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9QUk9EVUNUICAJKCh1MTYpMHgwNDExKQorI2RlZmluZSBIRkEzODR4X1BEUl9BTlRfRElWRVJTSVRZICAgCSgodTE2KTB4MDQxMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZPX0RFTEFZICAgICAgIAkoKHUxNikweDA0MTMpCisjZGVmaW5lIEhGQTM4NHhfUERSX1NDQUxFX1RIUkVTSCAJKCh1MTYpMHgwNDE0KQogCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfTUFORl9URVNUU1AJKChVSU5UMTYpMHgwOTAwKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX01BTkZfVEVTVEkJKChVSU5UMTYpMHgwOTAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9FTkRfT0ZfUERBCQkoKFVJTlQxNikweDAwMDApCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfTUFORl9URVNUU1AJKCh1MTYpMHgwOTAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX01BTkZfVEVTVEkJKCh1MTYpMHgwOTAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9FTkRfT0ZfUERBCQkoKHUxNikweDAwMDApCiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTgwMiw3ICs3NjYsNyBAQAogI2RlZmluZQkJSEZBMzg0eF9PRkZTRVQxCQlIRkEzODR4X09GRlNFVDFfT0ZGCiAjZGVmaW5lCQlIRkEzODR4X0RBVEExCQlIRkEzODR4X0RBVEExX09GRgogI2RlZmluZQkJSEZBMzg0eF9FVlNUQVQJCUhGQTM4NHhfRVZTVEFUX09GRgotI2RlZmluZQkJSEZBMzg0eF9JTlRFTgkJSEZBMzg0eF9JTlRFTl9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU4JCUhGQTM4NHhfSU5URU5fT0ZGCiAjZGVmaW5lCQlIRkEzODR4X0VWQUNLCQlIRkEzODR4X0VWQUNLX09GRgogI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MCQlIRkEzODR4X0NPTlRST0xfT0ZGCiAjZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDAJSEZBMzg0eF9TV1NVUFBPUlQwX09GRgpAQCAtODE3LDk2ICs3ODEsOTYgQEAKIAogLyotLS0gUmVnaXN0ZXIgVGVzdC9HZXQvU2V0IEZpZWxkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9JU0JVU1kodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpdmFsdWUpICYgSEZBMzg0eF9DTURfQlVTWSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GT19HRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX0FJTkZPKSA+PiA4KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoVUlOVDE2KSh2YWx1ZSkgPDwgOCkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUX0dFVCh2YWx1ZSkJCSgoVUlOVDE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfTUFDUE9SVCkpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQodmFsdWUpCQkoKFVJTlQxNilIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfSVNSRUNMKHZhbHVlKQkJKChVSU5UMTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9SRUNMKSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9SRUNMX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfR0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSYoKFVJTlQxNikweDMwMDApKSA+PiAxMikpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSA8PCAxMikgJiAweDMwMDApKQotI2RlZmluZQkJSEZBMzg0eF9DTURfSVNXUklURSh2YWx1ZSkJCSgoVUlOVDE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfV1JJVEUpKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1dSSVRFX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCgoVUlOVDE2KXZhbHVlKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFX0dFVCh2YWx1ZSkJCSgoVUlOVDE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfUFJPR01PREUpKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCgoVUlOVDE2KXZhbHVlKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREVfR0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9DTURfQ01EQ09ERSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9JU0JVU1kodmFsdWUpCQkoKHUxNikoKCh1MTYpdmFsdWUpICYgSEZBMzg0eF9DTURfQlVTWSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GT19HRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX0FJTkZPKSA+PiA4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkJCSgodTE2KSgodTE2KSh2YWx1ZSkgPDwgOCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUX0dFVCh2YWx1ZSkJCSgodTE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKHUxNikodmFsdWUpICYgSEZBMzg0eF9DTURfTUFDUE9SVCkpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQodmFsdWUpCQkoKHUxNilIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfSVNSRUNMKHZhbHVlKQkJKCh1MTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgodTE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9SRUNMKSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9SRUNMX1NFVCh2YWx1ZSkJCSgodTE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfR0VUKHZhbHVlKQkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSYoKHUxNikweDMwMDApKSA+PiAxMikpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfU0VUKHZhbHVlKQkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSA8PCAxMikgJiAweDMwMDApKQorI2RlZmluZQkJSEZBMzg0eF9DTURfSVNXUklURSh2YWx1ZSkJCSgodTE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKHUxNikodmFsdWUpICYgSEZBMzg0eF9DTURfV1JJVEUpKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1dSSVRFX1NFVCh2YWx1ZSkJCSgodTE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCgodTE2KXZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFX0dFVCh2YWx1ZSkJCSgodTE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKHUxNikodmFsdWUpICYgSEZBMzg0eF9DTURfUFJPR01PREUpKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFX1NFVCh2YWx1ZSkJCSgodTE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCgodTE2KXZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREVfR0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9DTURfQ01EQ09ERSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFX1NFVCh2YWx1ZSkJCSgodTE2KSh2YWx1ZSkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX1JFU1VMVF9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1NUQVRVU19SRVNVTFQpID4+IDgpKQotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUX1NFVCh2YWx1ZSkJKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDgpCi0jZGVmaW5lCQlIRkEzODR4X1NUQVRVU19DTURDT0RFX0dFVCh2YWx1ZSkJKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9TVEFUVVNfQ01EQ09ERSkKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREVfU0VUKHZhbHVlKQkoKFVJTlQxNikodmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVCh2YWx1ZSkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfU1RBVFVTX1JFU1VMVCkgPj4gOCkpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19SRVNVTFRfU0VUKHZhbHVlKQkoKCh1MTYpKHZhbHVlKSkgPDwgOCkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREVfR0VUKHZhbHVlKQkoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X1NUQVRVU19DTURDT0RFKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfQ01EQ09ERV9TRVQodmFsdWUpCSgodTE2KSh2YWx1ZSkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0lTQlVTWSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0JVU1kpKQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfSVNFUlIodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9FUlIpKQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRl9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0RBVEFPRkYpKQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRl9TRVQodmFsdWUpCSgoVUlOVDE2KSh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9JU0JVU1kodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9CVVNZKSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0lTRVJSKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9PRkZTRVRfRVJSKSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0RBVEFPRkZfR0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9EQVRBT0ZGKSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0RBVEFPRkZfU0VUKHZhbHVlKQkoKHUxNikodmFsdWUpKQogCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RJQ0sodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9USUNLKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTV1RFUlIodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9XVEVSUikpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0lORkRST1AodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9JTkZEUk9QKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTSU5GTyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0lORk8pKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNEVElNKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfRFRJTSkpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0NNRCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0NNRCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0FMTE9DKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfQUxMT0MpKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUWEVYQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RYRVhDKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVFgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9UWCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1JYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfUlgpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUSUNLKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVElDSykpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1dURVJSKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfV1RFUlIpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNJTkZEUk9QKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfSU5GRFJPUCkpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0lORk8odmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9JTkZPKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTRFRJTSh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0RUSU0pKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNDTUQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9DTUQpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNBTExPQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0FMTE9DKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVFhFWEModmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9UWEVYQykpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVFgpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNSWCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1JYKSkKIAotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNCQVBfT1AodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVF9CQVBfT1ApKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNCQVBfT1AodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X2ludF9CQVBfT1ApKQogCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTVElDSyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVElDSykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RJQ0tfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE1KSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNXVEVSUih2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fV1RFUlIpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9XVEVSUl9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTQpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU0lORkRST1AodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0lORkRST1ApKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JTkZEUk9QX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEzKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNJTkZPKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9JTkZPKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSU5GT19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTRFRJTSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fRFRJTSkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0RUSU1fU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDUpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU0NNRCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fQ01EKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fQ01EX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA0KSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNBTExPQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fQUxMT0MpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9BTExPQ19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTVFhFWEModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RYRVhDKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVFhFWENfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDIpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU1RYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9UWCkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RYX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNSWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fUlgpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9SWF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTVElDSyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVElDSykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RJQ0tfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDE1KSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNXVEVSUih2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fV1RFUlIpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9XVEVSUl9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTQpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU0lORkRST1AodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0lORkRST1ApKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JTkZEUk9QX1NFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNJTkZPKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9JTkZPKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSU5GT19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgNykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTRFRJTSh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fRFRJTSkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0RUSU1fU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDUpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU0NNRCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fQ01EKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fQ01EX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA0KSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNBTExPQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fQUxMT0MpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9BTExPQ19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTVFhFWEModmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RYRVhDKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fVFhFWENfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDIpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU1RYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9UWCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RYX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNSWCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fUlgpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9SWF9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMCkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUSUNLKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19USUNLKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVElDS19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTUpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1dURVJSKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19XVEVSUikpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1dURVJSX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxNCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTSU5GRFJPUCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfSU5GRFJPUCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORkRST1BfU0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTMpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0lORk8odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0lORk8pKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZPX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA3KSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNEVElNKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19EVElNKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfRFRJTV9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNSkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTQ01EKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19DTUQpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19DTURfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDQpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0FMTE9DKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19BTExPQykpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0FMTE9DX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAzKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUWEVYQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVFhFWEMpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWEVYQ19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMikpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVFgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RYKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1JYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19SWCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1JYX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAwKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUSUNLKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19USUNLKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVElDS19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTUpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1dURVJSKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19XVEVSUikpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1dURVJSX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxNCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTSU5GRFJPUCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfSU5GRFJPUCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORkRST1BfU0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTMpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0lORk8odmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0lORk8pKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZPX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA3KSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNEVElNKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19EVElNKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfRFRJTV9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgNSkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTQ01EKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19DTUQpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19DTURfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDQpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0FMTE9DKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19BTExPQykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0FMTE9DX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAzKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUWEVYQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVFhFWEMpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWEVYQ19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMikpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVFgodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RYKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDEpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1JYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19SWCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1JYX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAwKSkKIAotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE0KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTl9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA+PiAxNCkpCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU5fU0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTQpKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOX0dFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpID4+IDE0KSkKIAogLyogQnl0ZSBPcmRlciAqLwogI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgaGZhMzg0eDJob3N0XzE2KG4pCShfX2xlMTZfdG9fY3B1KChVSU5UMTYpKG4pKSkKLSNkZWZpbmUgaGZhMzg0eDJob3N0XzMyKG4pCShfX2xlMzJfdG9fY3B1KChVSU5UMzIpKG4pKSkKLSNkZWZpbmUgaG9zdDJoZmEzODR4XzE2KG4pCShfX2NwdV90b19sZTE2KChVSU5UMTYpKG4pKSkKLSNkZWZpbmUgaG9zdDJoZmEzODR4XzMyKG4pCShfX2NwdV90b19sZTMyKChVSU5UMzIpKG4pKSkKKyNkZWZpbmUgaGZhMzg0eDJob3N0XzE2KG4pCShfX2xlMTZfdG9fY3B1KCh1MTYpKG4pKSkKKyNkZWZpbmUgaGZhMzg0eDJob3N0XzMyKG4pCShfX2xlMzJfdG9fY3B1KCh1MzIpKG4pKSkKKyNkZWZpbmUgaG9zdDJoZmEzODR4XzE2KG4pCShfX2NwdV90b19sZTE2KCh1MTYpKG4pKSkKKyNkZWZpbmUgaG9zdDJoZmEzODR4XzMyKG4pCShfX2NwdV90b19sZTMyKCh1MzIpKG4pKSkKICNlbmRpZgogCiAvKiBIb3N0IE1haW50YWluZWQgU3RhdGUgSW5mbyAqLwpAQCAtOTI3LDE0ICs4OTEsMTQgQEAKIC8qIENvbW1vbmx5IHVzZWQgYmFzaWMgdHlwZXMgKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfYnl0ZXN0cgogewotCVVJTlQxNglsZW47Ci0JVUlOVDgJZGF0YVswXTsKKwl1MTYJbGVuOworCXU4CWRhdGFbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfYnl0ZXN0cl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMgogewotCVVJTlQxNglsZW47Ci0JVUlOVDgJZGF0YVszMl07CisJdTE2CWxlbjsKKwl1OAlkYXRhWzMyXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9ieXRlc3RyMzJfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTQ2LDExMiArOTEwLDExMiBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3JlY29yZAogewotCVVJTlQxNglyZWNsZW47Ci0JVUlOVDE2CXJpZDsKKwl1MTYJcmVjbGVuOworCXUxNglyaWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcmVjX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcmVjb3JkMTYKIHsKLQlVSU5UMTYJcmVjbGVuOwotCVVJTlQxNglyaWQ7Ci0JVUlOVDE2CXZhbDsKKwl1MTYJcmVjbGVuOworCXUxNglyaWQ7CisJdTE2CXZhbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9yZWMxNl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3JlY29yZDMyCiB7Ci0JVUlOVDE2CXJlY2xlbjsKLQlVSU5UMTYJcmlkOwotCVVJTlQzMgl2YWw7CisJdTE2CXJlY2xlbjsKKwl1MTYJcmlkOworCXUzMgl2YWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcmVjMzI7CiAKIC8qLS0gSGFyZHdhcmUvRmlybXdhcmUgQ29tcG9uZW50IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQKIHsKLQlVSU5UMTYJaWQ7Ci0JVUlOVDE2CXZhcmlhbnQ7Ci0JVUlOVDE2CW1ham9yOwotCVVJTlQxNgltaW5vcjsKKwl1MTYJaWQ7CisJdTE2CXZhcmlhbnQ7CisJdTE2CW1ham9yOworCXUxNgltaW5vcjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jb21waWRlbnRfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbAogewotCVVJTlQxNglyb2xlOwotCVVJTlQxNglpZDsKLQlVSU5UMTYJdmFyaWFudDsKLQlVSU5UMTYJYm90dG9tOwotCVVJTlQxNgl0b3A7CisJdTE2CXJvbGU7CisJdTE2CWlkOworCXUxNgl2YXJpYW50OworCXUxNglib3R0b207CisJdTE2CXRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jYXBsZXZlbF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZQb3J0VHlwZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlBvcnRUeXBlCiB7Ci0JVUlOVDE2CWNuZlBvcnRUeXBlOworCXUxNgljbmZQb3J0VHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZQb3J0VHlwZV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25NQUNBZGRyZXNzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duTUFDQWRkcmVzcwogewotCVVJTlQ4CWNuZk93bk1BQ0FkZHJlc3NbNl07CisJdTgJY25mT3duTUFDQWRkcmVzc1s2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25NQUNBZGRyZXNzX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZkRlc2lyZWRTU0lEIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mRGVzaXJlZFNTSUQKIHsKLQlVSU5UOAljbmZEZXNpcmVkU1NJRFszNF07CisJdTgJY25mRGVzaXJlZFNTSURbMzRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZkRlc2lyZWRTU0lEX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bkNoYW5uZWwgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25DaGFubmVsCiB7Ci0JVUlOVDE2CWNuZk93bkNoYW5uZWw7CisJdTE2CWNuZk93bkNoYW5uZWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duQ2hhbm5lbF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25TU0lEIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duU1NJRAogewotCVVJTlQ4CWNuZk93blNTSURbMzRdOworCXU4CWNuZk93blNTSURbMzRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93blNTSURfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duQVRJTVdpbmRvdyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93bkFUSU1XaW5kb3cKIHsKLQlVSU5UMTYJY25mT3duQVRJTVdpbmRvdzsKKwl1MTYJY25mT3duQVRJTVdpbmRvdzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25BVElNV2luZG93X3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZlN5c3RlbVNjYWxlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mU3lzdGVtU2NhbGUKIHsKLQlVSU5UMTYJY25mU3lzdGVtU2NhbGU7CisJdTE2CWNuZlN5c3RlbVNjYWxlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlN5c3RlbVNjYWxlX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk1heERhdGFMZW5ndGggLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZNYXhEYXRhTGVuZ3RoCiB7Ci0JVUlOVDE2CWNuZk1heERhdGFMZW5ndGg7CisJdTE2CWNuZk1heERhdGFMZW5ndGg7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTWF4RGF0YUxlbmd0aF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZXRFNBZGRyZXNzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mV0RTQWRkcmVzcwogewotCVVJTlQ4CWNuZldEU0FkZHJlc3NbNl07CisJdTgJY25mV0RTQWRkcmVzc1s2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZXRFNBZGRyZXNzX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZlBNRW5hYmxlZCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlBNRW5hYmxlZAogewotCVVJTlQxNgljbmZQTUVuYWJsZWQ7CisJdTE2CWNuZlBNRW5hYmxlZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZQTUVuYWJsZWRfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mUE1FUFMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZQTUVQUwogewotCVVJTlQxNgljbmZQTUVQUzsKKwl1MTYJY25mUE1FUFM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mUE1FUFNfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mTXVsdGljYXN0UmVjZWl2ZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk11bHRpY2FzdFJlY2VpdmUKIHsKLQlVSU5UMTYJY25mTXVsdGljYXN0UmVjZWl2ZTsKKwl1MTYJY25mTXVsdGljYXN0UmVjZWl2ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZNdWx0aWNhc3RSZWNlaXZlX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZkF1dGhlbnRpY2F0aW9uIC0tKi8KQEAgLTEwNjIsMzcgKzEwMjYsMzcgQEAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk1heFNsZWVwRHVyYXRpb24gLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZNYXhTbGVlcER1cmF0aW9uCiB7Ci0JVUlOVDE2CWNuZk1heFNsZWVwRHVyYXRpb247CisJdTE2CWNuZk1heFNsZWVwRHVyYXRpb247CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTWF4U2xlZXBEdXJhdGlvbl90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZQTUhvbGRvdmVyRHVyYXRpb24gLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZQTUhvbGRvdmVyRHVyYXRpb24KIHsKLQlVSU5UMTYJY25mUE1Ib2xkb3ZlckR1cmF0aW9uOworCXUxNgljbmZQTUhvbGRvdmVyRHVyYXRpb247CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mUE1Ib2xkb3ZlckR1cmF0aW9uX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bk5hbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25OYW1lCiB7Ci0JVUlOVDgJY25mT3duTmFtZVszNF07CisJdTgJY25mT3duTmFtZVszNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duTmFtZV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25EVElNUGVyaW9kIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duRFRJTVBlcmlvZAogewotCVVJTlQxNgljbmZPd25EVElNUGVyaW9kOworCXUxNgljbmZPd25EVElNUGVyaW9kOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93bkRUSU1QZXJpb2RfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mV0RTQWRkcmVzcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZldEU0FkZHJlc3NOCiB7Ci0JVUlOVDgJY25mV0RTQWRkcmVzc1s2XTsKKwl1OAljbmZXRFNBZGRyZXNzWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZldEU0FkZHJlc3NOX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk11bHRpY2FzdFBNQnVmZmVyaW5nIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mTXVsdGljYXN0UE1CdWZmZXJpbmcKIHsKLQlVSU5UMTYJY25mTXVsdGljYXN0UE1CdWZmZXJpbmc7CisJdTE2CWNuZk11bHRpY2FzdFBNQnVmZmVyaW5nOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk11bHRpY2FzdFBNQnVmZmVyaW5nX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExMDMsMTMgKzEwNjcsMTMgQEAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEdyb3VwQWRkcmVzc2VzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfR3JvdXBBZGRyZXNzZXMKIHsKLQlVSU5UOAlNQUNBZGRyZXNzWzE2XVs2XTsKKwl1OAlNQUNBZGRyZXNzWzE2XVs2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Hcm91cEFkZHJlc3Nlc190OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBDcmVhdGVJQlNTIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3JlYXRlSUJTUwogewotCVVJTlQxNglDcmVhdGVJQlNTOworCXUxNglDcmVhdGVJQlNTOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NyZWF0ZUlCU1NfdDsKIAogI2RlZmluZSBIRkEzODR4X0NSRUFURUlCU1NfSk9JTkNSRUFURUlCU1MgICAgICAgICAgMApAQCAtMTEyMCw4NyArMTA4NCw4NyBAQAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogRnJhZ21lbnRhdGlvblRocmVzaG9sZCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0ZyYWdtZW50YXRpb25UaHJlc2hvbGQKIHsKLQlVSU5UMTYJRnJhZ21lbnRhdGlvblRocmVzaG9sZDsKKwl1MTYJRnJhZ21lbnRhdGlvblRocmVzaG9sZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9GcmFnbWVudGF0aW9uVGhyZXNob2xkX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFJUU1RocmVzaG9sZCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1JUU1RocmVzaG9sZAogewotCVVJTlQxNglSVFNUaHJlc2hvbGQ7CisJdTE2CVJUU1RocmVzaG9sZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9SVFNUaHJlc2hvbGRfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogVHhSYXRlQ29udHJvbCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1R4UmF0ZUNvbnRyb2wKIHsKLQlVSU5UMTYJVHhSYXRlQ29udHJvbDsKKwl1MTYJVHhSYXRlQ29udHJvbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9UeFJhdGVDb250cm9sX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFByb21pc2N1b3VzTW9kZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1Byb21pc2N1b3VzTW9kZQogewotCVVJTlQxNglQcm9taXNjdW91c01vZGU7CisJdTE2CVByb21pc2N1b3VzTW9kZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Qcm9taXNjdW91c01vZGVfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogU2NhblJlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NjYW5SZXF1ZXN0X2RhdGEKIHsKLQlVSU5UMTYJY2hhbm5lbExpc3Q7Ci0JVUlOVDE2CXR4UmF0ZTsKKwl1MTYJY2hhbm5lbExpc3Q7CisJdTE2CXR4UmF0ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TY2FuUmVxdWVzdF9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEhvc3RTY2FuUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGEKIHsKLQlVSU5UMTYJY2hhbm5lbExpc3Q7Ci0JVUlOVDE2CXR4UmF0ZTsKKwl1MTYJY2hhbm5lbExpc3Q7CisJdTE2CXR4UmF0ZTsKIAloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGFfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogSm9pblJlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEKIHsKLQlVSU5UOAlic3NpZFtXTEFOX0JTU0lEX0xFTl07Ci0JVUlOVDE2CWNoYW5uZWw7CisJdTgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOworCXUxNgljaGFubmVsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogYXV0aGVudGljYXRlU3RhdGlvbiAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhCiB7Ci0JVUlOVDgJYWRkcmVzc1tXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJc3RhdHVzOwotCVVJTlQxNglhbGdvcml0aG07CisJdTgJYWRkcmVzc1tXTEFOX0FERFJfTEVOXTsKKwl1MTYJc3RhdHVzOworCXUxNglhbGdvcml0aG07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGFzc29jaWF0ZVN0YXRpb24gKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2Fzc29jaWF0ZVN0YXRpb25fZGF0YQogewotCVVJTlQ4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CXN0YXR1czsKLQlVSU5UMTYJdHlwZTsKKwl1OAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOworCXUxNglzdGF0dXM7CisJdTE2CXR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfYXNzb2NpYXRlU3RhdGlvbl9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IENoYW5uZWxJbmZvUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGEKIHsKLQlVSU5UMTYJY2hhbm5lbExpc3Q7Ci0JVUlOVDE2CWNoYW5uZWxEd2VsbFRpbWU7CisJdTE2CWNoYW5uZWxMaXN0OworCXUxNgljaGFubmVsRHdlbGxUaW1lOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NoYW5uZWxJbmZvUmVxdWVzdF9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFdFUEtleU1hcHBpbmcgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1dFUEtleU1hcHBpbmcKIHsKLQlVSU5UOAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglrZXlfaW5kZXg7Ci0JVUlOVDggCWtleVsxNl07Ci0JVUlOVDggCW1pY190cmFuc21pdF9rZXlbNF07Ci0JVUlOVDggCW1pY19yZWNlaXZlX2tleVs0XTsKKwl1OAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOworCXUxNglrZXlfaW5kZXg7CisJdTggCWtleVsxNl07CisJdTggCW1pY190cmFuc21pdF9rZXlbNF07CisJdTggCW1pY19yZWNlaXZlX2tleVs0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9XRVBLZXlNYXBwaW5nX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFdQQURhdGEgICAgICAgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1dQQURhdGEKIHsKLQlVSU5UMTYJZGF0YWxlbjsKLSAgICAgICAgVUlOVDggCWRhdGFbMF07IC8vIG1heCA4MAorCXUxNglkYXRhbGVuOworICAgICAgICB1OCAJZGF0YVswXTsgLy8gbWF4IDgwCiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfV1BBRGF0YV90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjEwLDcgKzExNzQsNyBAQAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogVGlja1RpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9UaWNrVGltZQogewotCVVJTlQxNglUaWNrVGltZTsKKwl1MTYJVGlja1RpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfVGlja1RpbWVfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTIyMCwxNDYgKzExODQsMTQ2IEBACiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTWF4TG9hZFRpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NYXhMb2FkVGltZQogewotCVVJTlQxNglNYXhMb2FkVGltZTsKKwl1MTYJTWF4TG9hZFRpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTWF4TG9hZFRpbWVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IERvd25Mb2FkQnVmZmVyIC0tKi8KIC8qIE5PVEU6IFRoZSBwYWdlIGFuZCBvZmZzZXQgYXJlIGluIEFVWCBmb3JtYXQgKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfZG93bmxvYWRidWZmZXIKIHsKLQlVSU5UMTYJcGFnZTsKLQlVSU5UMTYJb2Zmc2V0OwotCVVJTlQxNglsZW47CisJdTE2CXBhZ2U7CisJdTE2CW9mZnNldDsKKwl1MTYJbGVuOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2Rvd25sb2FkYnVmZmVyX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQUklJZGVudGl0eSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BSSUlkZW50aXR5CiB7Ci0JVUlOVDE2CVBSSUNvbXBJRDsKLQlVSU5UMTYJUFJJVmFyaWFudDsKLQlVSU5UMTYJUFJJTWFqb3JWZXJzaW9uOwotCVVJTlQxNglQUklNaW5vclZlcnNpb247CisJdTE2CVBSSUNvbXBJRDsKKwl1MTYJUFJJVmFyaWFudDsKKwl1MTYJUFJJTWFqb3JWZXJzaW9uOworCXUxNglQUklNaW5vclZlcnNpb247CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUFJJSWRlbnRpdHlfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBSSVN1cFJhbmdlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUFJJU3VwUmFuZ2UKIHsKLQlVSU5UMTYJUFJJUm9sZTsKLQlVSU5UMTYJUFJJSUQ7Ci0JVUlOVDE2CVBSSVZhcmlhbnQ7Ci0JVUlOVDE2CVBSSUJvdHRvbTsKLQlVSU5UMTYJUFJJVG9wOworCXUxNglQUklSb2xlOworCXUxNglQUklJRDsKKwl1MTYJUFJJVmFyaWFudDsKKwl1MTYJUFJJQm90dG9tOworCXUxNglQUklUb3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUFJJU3VwUmFuZ2VfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENGSUFjdFJhbmdlcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NGSUFjdFJhbmdlcwogewotCVVJTlQxNglDRklSb2xlOwotCVVJTlQxNglDRklJRDsKLQlVSU5UMTYJQ0ZJVmFyaWFudDsKLQlVSU5UMTYJQ0ZJQm90dG9tOwotCVVJTlQxNglDRklUb3A7CisJdTE2CUNGSVJvbGU7CisJdTE2CUNGSUlEOworCXUxNglDRklWYXJpYW50OworCXUxNglDRklCb3R0b207CisJdTE2CUNGSVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DRklBY3RSYW5nZXNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE5JQ1NlcmlhbE51bWJlciAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X05JQ1NlcmlhbE51bWJlcgogewotCVVJTlQ4CU5JQ1NlcmlhbE51bWJlclsxMl07CisJdTgJTklDU2VyaWFsTnVtYmVyWzEyXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9OSUNTZXJpYWxOdW1iZXJfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE5JQ0lkZW50aXR5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTklDSWRlbnRpdHkKIHsKLQlVSU5UMTYJTklDQ29tcElEOwotCVVJTlQxNglOSUNWYXJpYW50OwotCVVJTlQxNglOSUNNYWpvclZlcnNpb247Ci0JVUlOVDE2CU5JQ01pbm9yVmVyc2lvbjsKKwl1MTYJTklDQ29tcElEOworCXUxNglOSUNWYXJpYW50OworCXUxNglOSUNNYWpvclZlcnNpb247CisJdTE2CU5JQ01pbm9yVmVyc2lvbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9OSUNJZGVudGl0eV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTUZJU3VwUmFuZ2UgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NRklTdXBSYW5nZQogewotCVVJTlQxNglNRklSb2xlOwotCVVJTlQxNglNRklJRDsKLQlVSU5UMTYJTUZJVmFyaWFudDsKLQlVSU5UMTYJTUZJQm90dG9tOwotCVVJTlQxNglNRklUb3A7CisJdTE2CU1GSVJvbGU7CisJdTE2CU1GSUlEOworCXUxNglNRklWYXJpYW50OworCXUxNglNRklCb3R0b207CisJdTE2CU1GSVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NRklTdXBSYW5nZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0ZJU3VwUmFuZ2UgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DRklTdXBSYW5nZQogewotCVVJTlQxNglDRklSb2xlOwotCVVJTlQxNglDRklJRDsKLQlVSU5UMTYJQ0ZJVmFyaWFudDsKLQlVSU5UMTYJQ0ZJQm90dG9tOwotCVVJTlQxNglDRklUb3A7CisJdTE2CUNGSVJvbGU7CisJdTE2CUNGSUlEOworCXUxNglDRklWYXJpYW50OworCXUxNglDRklCb3R0b207CisJdTE2CUNGSVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DRklTdXBSYW5nZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQlVJTERTRVE6QnVpbGRTZXEgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9CdWlsZFNlcSB7Ci0JVUlOVDE2CXByaW1hcnk7Ci0JVUlOVDE2CXNlY29uZGFyeTsKKwl1MTYJcHJpbWFyeTsKKwl1MTYJc2Vjb25kYXJ5OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0J1aWxkU2VxX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBGV0lEIC0tKi8KICNkZWZpbmUgSEZBMzg0eF9GV0lEX0xFTgkxNAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9GV0lEIHsKLQlVSU5UOAlwcmltYXJ5W0hGQTM4NHhfRldJRF9MRU5dOwotCVVJTlQ4CXNlY29uZGFyeVtIRkEzODR4X0ZXSURfTEVOXTsKKwl1OAlwcmltYXJ5W0hGQTM4NHhfRldJRF9MRU5dOworCXU4CXNlY29uZGFyeVtIRkEzODR4X0ZXSURfTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9GV0lEX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDaGFubmVsTGlzdCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoYW5uZWxMaXN0CiB7Ci0JVUlOVDE2CUNoYW5uZWxMaXN0OworCXUxNglDaGFubmVsTGlzdDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DaGFubmVsTGlzdF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUmVndWxhdG9yeURvbWFpbnMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9SZWd1bGF0b3J5RG9tYWlucwogewotCVVJTlQ4CVJlZ3VsYXRvcnlEb21haW5zWzEyXTsKKwl1OAlSZWd1bGF0b3J5RG9tYWluc1sxMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUmVndWxhdG9yeURvbWFpbnNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFRlbXBUeXBlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfVGVtcFR5cGUKIHsKLQlVSU5UMTYJVGVtcFR5cGU7CisJdTE2CVRlbXBUeXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1RlbXBUeXBlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDSVMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DSVMKIHsKLQlVSU5UOAlDSVNbNDgwXTsKKwl1OAlDSVNbNDgwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DSVNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFNUQUlkZW50aXR5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU1RBSWRlbnRpdHkKIHsKLQlVSU5UMTYJU1RBQ29tcElEOwotCVVJTlQxNglTVEFWYXJpYW50OwotCVVJTlQxNglTVEFNYWpvclZlcnNpb247Ci0JVUlOVDE2CVNUQU1pbm9yVmVyc2lvbjsKKwl1MTYJU1RBQ29tcElEOworCXUxNglTVEFWYXJpYW50OworCXUxNglTVEFNYWpvclZlcnNpb247CisJdTE2CVNUQU1pbm9yVmVyc2lvbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TVEFJZGVudGl0eV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogU1RBU3VwUmFuZ2UgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TVEFTdXBSYW5nZQogewotCVVJTlQxNglTVEFSb2xlOwotCVVJTlQxNglTVEFJRDsKLQlVSU5UMTYJU1RBVmFyaWFudDsKLQlVSU5UMTYJU1RBQm90dG9tOwotCVVJTlQxNglTVEFUb3A7CisJdTE2CVNUQVJvbGU7CisJdTE2CVNUQUlEOworCXUxNglTVEFWYXJpYW50OworCXUxNglTVEFCb3R0b207CisJdTE2CVNUQVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TVEFTdXBSYW5nZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTUZJQWN0UmFuZ2VzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTUZJQWN0UmFuZ2VzCiB7Ci0JVUlOVDE2CU1GSVJvbGU7Ci0JVUlOVDE2CU1GSUlEOwotCVVJTlQxNglNRklWYXJpYW50OwotCVVJTlQxNglNRklCb3R0b207Ci0JVUlOVDE2CU1GSVRvcDsKKwl1MTYJTUZJUm9sZTsKKwl1MTYJTUZJSUQ7CisJdTE2CU1GSVZhcmlhbnQ7CisJdTE2CU1GSUJvdHRvbTsKKwl1MTYJTUZJVG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01GSUFjdFJhbmdlc190OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzY5LDE0NSArMTMzMywxNDUgQEAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQb3J0U3RhdHVzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUG9ydFN0YXR1cwogewotCVVJTlQxNglQb3J0U3RhdHVzOworCXUxNglQb3J0U3RhdHVzOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BvcnRTdGF0dXNfdDsKIAotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfRElTQUJMRUQJKChVSU5UMTYpMSkKLSNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX1NFQVJDSElORwkoKFVJTlQxNikyKQotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9JQlNTCSgoVUlOVDE2KTMpCi0jZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19DT05OX0VTUwkoKFVJTlQxNik0KQotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfT1VUT0ZSQU5HRQkoKFVJTlQxNik1KQotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9XRFMJKChVSU5UMTYpNikKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0RJU0FCTEVECSgodTE2KTEpCisjZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19TRUFSQ0hJTkcJKCh1MTYpMikKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fSUJTUwkoKHUxNikzKQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9FU1MJKCh1MTYpNCkKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX09VVE9GUkFOR0UJKCh1MTYpNSkKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fV0RTCSgodTE2KTYpCiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50U1NJRCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRTU0lECiB7Ci0JVUlOVDgJQ3VycmVudFNTSURbMzRdOworCXU4CUN1cnJlbnRTU0lEWzM0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50U1NJRF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudEJTU0lEIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudEJTU0lECiB7Ci0JVUlOVDgJQ3VycmVudEJTU0lEWzZdOworCXU4CUN1cnJlbnRCU1NJRFs2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50QlNTSURfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IGNvbW1zcXVhbGl0eSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NvbW1zcXVhbGl0eQogewotCVVJTlQxNglDUV9jdXJyQlNTOwotCVVJTlQxNglBU0xfY3VyckJTUzsKLQlVSU5UMTYJQU5MX2N1cnJGQzsKKwl1MTYJQ1FfY3VyckJTUzsKKwl1MTYJQVNMX2N1cnJCU1M7CisJdTE2CUFOTF9jdXJyRkM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY29tbXNxdWFsaXR5X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBkbWJjb21tc3F1YWxpdHkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9kYm1jb21tc3F1YWxpdHkKIHsKLQlVSU5UMTYJQ1FkYm1fY3VyckJTUzsKLQlVSU5UMTYJQVNMZGJtX2N1cnJCU1M7Ci0JVUlOVDE2CUFOTGRibV9jdXJyRkM7CisJdTE2CUNRZGJtX2N1cnJCU1M7CisJdTE2CUFTTGRibV9jdXJyQlNTOworCXUxNglBTkxkYm1fY3VyckZDOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2RibWNvbW1zcXVhbGl0eV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudFR4UmF0ZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRUeFJhdGUKIHsKLQlVSU5UMTYJQ3VycmVudFR4UmF0ZTsKKwl1MTYJQ3VycmVudFR4UmF0ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50VHhSYXRlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50QmVhY29uSW50ZXJ2YWwgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50QmVhY29uSW50ZXJ2YWwKIHsKLQlVSU5UMTYJQ3VycmVudEJlYWNvbkludGVydmFsOworCXUxNglDdXJyZW50QmVhY29uSW50ZXJ2YWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudEJlYWNvbkludGVydmFsX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50U2NhbGVUaHJlc2hvbGRzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudFNjYWxlVGhyZXNob2xkcwogewotCVVJTlQxNglFbmVyZ3lEZXRlY3RUaHJlc2hvbGQ7Ci0JVUlOVDE2CUNhcnJpZXJEZXRlY3RUaHJlc2hvbGQ7Ci0JVUlOVDE2CURlZmVyRGV0ZWN0VGhyZXNob2xkOwotCVVJTlQxNglDZWxsU2VhcmNoVGhyZXNob2xkOyAvKiBTdGF0aW9ucyBvbmx5ICovCi0JVUlOVDE2CURlYWRTcG90VGhyZXNob2xkOyAvKiBTdGF0aW9ucyBvbmx5ICovCisJdTE2CUVuZXJneURldGVjdFRocmVzaG9sZDsKKwl1MTYJQ2FycmllckRldGVjdFRocmVzaG9sZDsKKwl1MTYJRGVmZXJEZXRlY3RUaHJlc2hvbGQ7CisJdTE2CUNlbGxTZWFyY2hUaHJlc2hvbGQ7IC8qIFN0YXRpb25zIG9ubHkgKi8KKwl1MTYJRGVhZFNwb3RUaHJlc2hvbGQ7IC8qIFN0YXRpb25zIG9ubHkgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50U2NhbGVUaHJlc2hvbGRzX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQcm90b2NvbFJzcFRpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Qcm90b2NvbFJzcFRpbWUKIHsKLQlVSU5UMTYJUHJvdG9jb2xSc3BUaW1lOworCXUxNglQcm90b2NvbFJzcFRpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUHJvdG9jb2xSc3BUaW1lX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBTaG9ydFJldHJ5TGltaXQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TaG9ydFJldHJ5TGltaXQKIHsKLQlVSU5UMTYJU2hvcnRSZXRyeUxpbWl0OworCXUxNglTaG9ydFJldHJ5TGltaXQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU2hvcnRSZXRyeUxpbWl0X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBMb25nUmV0cnlMaW1pdCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0xvbmdSZXRyeUxpbWl0CiB7Ci0JVUlOVDE2CUxvbmdSZXRyeUxpbWl0OworCXUxNglMb25nUmV0cnlMaW1pdDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Mb25nUmV0cnlMaW1pdF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTWF4VHJhbnNtaXRMaWZldGltZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01heFRyYW5zbWl0TGlmZXRpbWUKIHsKLQlVSU5UMTYJTWF4VHJhbnNtaXRMaWZldGltZTsKKwl1MTYJTWF4VHJhbnNtaXRMaWZldGltZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NYXhUcmFuc21pdExpZmV0aW1lX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBNYXhSZWNlaXZlTGlmZXRpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NYXhSZWNlaXZlTGlmZXRpbWUKIHsKLQlVSU5UMTYJTWF4UmVjZWl2ZUxpZmV0aW1lOworCXUxNglNYXhSZWNlaXZlTGlmZXRpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTWF4UmVjZWl2ZUxpZmV0aW1lX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDRlBvbGxhYmxlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ0ZQb2xsYWJsZQogewotCVVJTlQxNglDRlBvbGxhYmxlOworCXUxNglDRlBvbGxhYmxlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NGUG9sbGFibGVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0F1dGhlbnRpY2F0aW9uQWxnb3JpdGhtcwogewotCVVJTlQxNglBdXRoZW50aWNhdGlvblR5cGU7Ci0JVUlOVDE2CVR5cGVFbmFibGVkOworCXUxNglBdXRoZW50aWNhdGlvblR5cGU7CisJdTE2CVR5cGVFbmFibGVkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0F1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQXV0aGVudGljYXRpb25BbGdvcml0aG1zCiAoZGF0YSBvbmx5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXV0aGVudGljYXRpb25BbGdvcml0aG1zX2RhdGEKIHsKLQlVSU5UMTYJQXV0aGVudGljYXRpb25UeXBlOwotCVVJTlQxNglUeXBlRW5hYmxlZDsKKwl1MTYJQXV0aGVudGljYXRpb25UeXBlOworCXUxNglUeXBlRW5hYmxlZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9BdXRoZW50aWNhdGlvbkFsZ29yaXRobXNfZGF0YV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkCiB7Ci0JVUlOVDE2CVByaXZhY3lPcHRpb25JbXBsZW1lbnRlZDsKKwl1MTYJUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1ByaXZhY3lPcHRpb25JbXBsZW1lbnRlZF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogT3duTUFDQWRkcmVzcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X093bk1BQ0FkZHJlc3MKIHsKLQlVSU5UOAlPd25NQUNBZGRyZXNzWzZdOworCXU4CU93bk1BQ0FkZHJlc3NbNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfT3duTUFDQWRkcmVzc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUENGSW5mbyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BDRkluZm8KIHsKLQlVSU5UMTYJTWVkaXVtT2NjdXBhbmN5TGltaXQ7Ci0JVUlOVDE2CUNGUFBlcmlvZDsKLQlVSU5UMTYJQ0ZQTWF4RHVyYXRpb247Ci0JVUlOVDE2CUNGUEZsYWdzOworCXUxNglNZWRpdW1PY2N1cGFuY3lMaW1pdDsKKwl1MTYJQ0ZQUGVyaW9kOworCXUxNglDRlBNYXhEdXJhdGlvbjsKKwl1MTYJQ0ZQRmxhZ3M7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUENGSW5mb190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUENGSW5mbyAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUENGSW5mb19kYXRhCiB7Ci0JVUlOVDE2CU1lZGl1bU9jY3VwYW5jeUxpbWl0OwotCVVJTlQxNglDRlBQZXJpb2Q7Ci0JVUlOVDE2CUNGUE1heER1cmF0aW9uOwotCVVJTlQxNglDRlBGbGFnczsKKwl1MTYJTWVkaXVtT2NjdXBhbmN5TGltaXQ7CisJdTE2CUNGUFBlcmlvZDsKKwl1MTYJQ0ZQTWF4RHVyYXRpb247CisJdTE2CUNGUEZsYWdzOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BDRkluZm9fZGF0YV90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNTE3LDM5ICsxNDgxLDM5IEBACiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUEhZVHlwZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BIWVR5cGUKIHsKLQlVSU5UMTYJUEhZVHlwZTsKKwl1MTYJUEhZVHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QSFlUeXBlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50Q2hhbm5lbCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRDaGFubmVsCiB7Ci0JVUlOVDE2CUN1cnJlbnRDaGFubmVsOworCXUxNglDdXJyZW50Q2hhbm5lbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50Q2hhbm5lbF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudFBvd2VyU3RhdGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50UG93ZXJTdGF0ZQogewotCVVJTlQxNglDdXJyZW50UG93ZXJTdGF0ZTsKKwl1MTYJQ3VycmVudFBvd2VyU3RhdGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudFBvd2VyU3RhdGVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENDQU1vZGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DQ0FNb2RlCiB7Ci0JVUlOVDE2CUNDQU1vZGU7CisJdTE2CUNDQU1vZGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ0NBTW9kZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogU3VwcG9ydGVkRGF0YVJhdGVzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU3VwcG9ydGVkRGF0YVJhdGVzCiB7Ci0JVUlOVDgJU3VwcG9ydGVkRGF0YVJhdGVzWzEwXTsKKwl1OAlTdXBwb3J0ZWREYXRhUmF0ZXNbMTBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1N1cHBvcnRlZERhdGFSYXRlc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTEZPU3RhdHVzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTEZPU3RhdHVzCiB7Ci0JVUlOVDE2ICBUZXN0UmVzdWx0czsKLQlVSU5UMTYgIExGT1Jlc3VsdDsKLQlVSU5UMTYgIFZSSEZPUmVzdWx0OworCXUxNiAgVGVzdFJlc3VsdHM7CisJdTE2ICBMRk9SZXN1bHQ7CisJdTE2ICBWUkhGT1Jlc3VsdDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9MRk9TdGF0dXNfdDsKIAogI2RlZmluZSBIRkEzODR4X1RFU1RSRVNVTFRfQUxMUEFTU0VEICAgIEJJVDAKQEAgLTE1NjEsMTEgKzE1MjUsMTEgQEAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBMRURDb250cm9sIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTEVEQ29udHJvbAogewotCVVJTlQxNiAgc2VhcmNoaW5nX29uOwotCVVJTlQxNiAgc2VhcmNoaW5nX29mZjsKLQlVSU5UMTYgIGFzc29jX29uOwotCVVJTlQxNiAgYXNzb2Nfb2ZmOwotCVVJTlQxNiAgYWN0aXZpdHk7CisJdTE2ICBzZWFyY2hpbmdfb247CisJdTE2ICBzZWFyY2hpbmdfb2ZmOworCXUxNiAgYXNzb2Nfb247CisJdTE2ICBhc3NvY19vZmY7CisJdTE2ICBhY3Rpdml0eTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9MRURDb250cm9sX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1NzYsMzIgKzE1NDAsMzIgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbnRyb2wgSW5mbyAob2Zmc2V0IDQ0LTUxKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9GRF9TVEFUVVNfT0ZGCQkJKChVSU5UMTYpMHg0NCkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfVElNRV9PRkYJCQkoKFVJTlQxNikweDQ2KQotI2RlZmluZQkJSEZBMzg0eF9GRF9TV1NVUFBPUlRfT0ZGCQkoKFVJTlQxNikweDRBKQotI2RlZmluZQkJSEZBMzg0eF9GRF9TSUxFTkNFX09GRgkJCSgoVUlOVDE2KTB4NEEpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1NJR05BTF9PRkYJCQkoKFVJTlQxNikweDRCKQotI2RlZmluZQkJSEZBMzg0eF9GRF9SQVRFX09GRgkJCSgoVUlOVDE2KTB4NEMpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1JYRkxPV19PRkYJCQkoKFVJTlQxNikweDREKQotI2RlZmluZQkJSEZBMzg0eF9GRF9SRVNFUlZFRF9PRkYJCQkoKFVJTlQxNikweDRFKQotI2RlZmluZQkJSEZBMzg0eF9GRF9UWENPTlRST0xfT0ZGCQkoKFVJTlQxNikweDUwKQorI2RlZmluZQkJSEZBMzg0eF9GRF9TVEFUVVNfT0ZGCQkJKCh1MTYpMHg0NCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfVElNRV9PRkYJCQkoKHUxNikweDQ2KQorI2RlZmluZQkJSEZBMzg0eF9GRF9TV1NVUFBPUlRfT0ZGCQkoKHUxNikweDRBKQorI2RlZmluZQkJSEZBMzg0eF9GRF9TSUxFTkNFX09GRgkJCSgodTE2KTB4NEEpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NJR05BTF9PRkYJCQkoKHUxNikweDRCKQorI2RlZmluZQkJSEZBMzg0eF9GRF9SQVRFX09GRgkJCSgodTE2KTB4NEMpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1JYRkxPV19PRkYJCQkoKHUxNikweDREKQorI2RlZmluZQkJSEZBMzg0eF9GRF9SRVNFUlZFRF9PRkYJCQkoKHUxNikweDRFKQorI2RlZmluZQkJSEZBMzg0eF9GRF9UWENPTlRST0xfT0ZGCQkoKHUxNikweDUwKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogODAyLjExIEhlYWRlciAob2Zmc2V0IDUyLTZCKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9GRF9GUkFNRUNPTlRST0xfT0ZGCQkoKFVJTlQxNikweDUyKQotI2RlZmluZQkJSEZBMzg0eF9GRF9EVVJBVElPTklEX09GRgkJKChVSU5UMTYpMHg1NCkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzFfT0ZGCQkJKChVSU5UMTYpMHg1NikKLSNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzJfT0ZGCQkJKChVSU5UMTYpMHg1QykKLSNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzNfT0ZGCQkJKChVSU5UMTYpMHg2MikKLSNkZWZpbmUJCUhGQTM4NHhfRkRfU0VRQ09OVFJPTF9PRkYJCSgoVUlOVDE2KTB4NjgpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1M0X09GRgkJCSgoVUlOVDE2KTB4NkEpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0RBVEFMRU5fT0ZGCQkJKChVSU5UMTYpMHg3MCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfRlJBTUVDT05UUk9MX09GRgkJKCh1MTYpMHg1MikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfRFVSQVRJT05JRF9PRkYJCSgodTE2KTB4NTQpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MxX09GRgkJCSgodTE2KTB4NTYpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MyX09GRgkJCSgodTE2KTB4NUMpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MzX09GRgkJCSgodTE2KTB4NjIpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NFUUNPTlRST0xfT0ZGCQkoKHUxNikweDY4KQorI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTNF9PRkYJCQkoKHUxNikweDZBKQorI2RlZmluZQkJSEZBMzg0eF9GRF9EQVRBTEVOX09GRgkJCSgodTE2KTB4NzApCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA4MDIuMyBIZWFkZXIgKG9mZnNldCA3Mi03RikKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfRkRfREVTVEFERFJFU1NfT0ZGCQkoKFVJTlQxNikweDcyKQotI2RlZmluZQkJSEZBMzg0eF9GRF9TUkNBRERSRVNTX09GRgkJKChVSU5UMTYpMHg3OCkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfREFUQUxFTkdUSF9PRkYJCSgoVUlOVDE2KTB4N0UpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0RFU1RBRERSRVNTX09GRgkJKCh1MTYpMHg3MikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU1JDQUREUkVTU19PRkYJCSgodTE2KTB4NzgpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0RBVEFMRU5HVEhfT0ZGCQkoKHUxNikweDdFKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBGUkFNRSBTVFJVQ1RVUkVTOiBDb21tdW5pY2F0aW9uIEZyYW1lcwpAQCAtMTYxMSw2NyArMTU3NSw2NyBAQAogLyotLSBDb21tdW5pY2F0aW9uIEZyYW1lOiBUcmFuc21pdCBGcmFtZSBTdHJ1Y3R1cmUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF90eF9mcmFtZQogewotCVVJTlQxNglzdGF0dXM7Ci0JVUlOVDE2CXJlc2VydmVkMTsKLQlVSU5UMTYJcmVzZXJ2ZWQyOwotCVVJTlQzMglzd19zdXBwb3J0OwotCVVJTlQ4CXR4X3JldHJ5Y291bnQ7Ci0JVUlOVDggICB0eF9yYXRlOwotCVVJTlQxNgl0eF9jb250cm9sOworCXUxNglzdGF0dXM7CisJdTE2CXJlc2VydmVkMTsKKwl1MTYJcmVzZXJ2ZWQyOworCXUzMglzd19zdXBwb3J0OworCXU4CXR4X3JldHJ5Y291bnQ7CisJdTggICB0eF9yYXRlOworCXUxNgl0eF9jb250cm9sOwogCiAJLyotLSA4MDIuMTEgSGVhZGVyIEluZm9ybWF0aW9uIC0tKi8KIAotCVVJTlQxNglmcmFtZV9jb250cm9sOwotCVVJTlQxNglkdXJhdGlvbl9pZDsKLQlVSU5UOAlhZGRyZXNzMVs2XTsKLQlVSU5UOAlhZGRyZXNzMls2XTsKLQlVSU5UOAlhZGRyZXNzM1s2XTsKLQlVSU5UMTYJc2VxdWVuY2VfY29udHJvbDsKLQlVSU5UOAlhZGRyZXNzNFs2XTsKLQlVSU5UMTYJZGF0YV9sZW47IC8qIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCisJdTE2CWZyYW1lX2NvbnRyb2w7CisJdTE2CWR1cmF0aW9uX2lkOworCXU4CWFkZHJlc3MxWzZdOworCXU4CWFkZHJlc3MyWzZdOworCXU4CWFkZHJlc3MzWzZdOworCXUxNglzZXF1ZW5jZV9jb250cm9sOworCXU4CWFkZHJlc3M0WzZdOworCXUxNglkYXRhX2xlbjsgLyogbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KIAogCS8qLS0gODAyLjMgSGVhZGVyIEluZm9ybWF0aW9uIC0tKi8KIAotCVVJTlQ4CWRlc3RfYWRkcls2XTsKLQlVSU5UOAlzcmNfYWRkcls2XTsKLQlVSU5UMTYJZGF0YV9sZW5ndGg7IC8qIGJpZyBlbmRpYW4gZm9ybWF0ICovCisJdTgJZGVzdF9hZGRyWzZdOworCXU4CXNyY19hZGRyWzZdOworCXUxNglkYXRhX2xlbmd0aDsgLyogYmlnIGVuZGlhbiBmb3JtYXQgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF90eF9mcmFtZV90OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBUcmFuc21pdCBGcmFtZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0gU3RhdHVzIEZpZWxkIC0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSCQkJKChVSU5UMTYpQklUNSkKLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUgkJKChVSU5UMTYpQklUMykKLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfRElTQ09OCQkJKChVSU5UMTYpQklUMikKLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUgkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIJCSgoVUlOVDE2KUJJVDApCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0FDS0VSUgkJCSgodTE2KUJJVDUpCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIJCSgodTE2KUJJVDMpCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0RJU0NPTgkJCSgodTE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0FHRURFUlIJCSgodTE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX1JFVFJZRVJSCQkoKHUxNilCSVQwKQogLyotLSBUcmFuc21pdCBDb250cm9sIEZpZWxkIC0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfVFhfQ0ZQT0xMCQkJKChVSU5UMTYpQklUMTIpCi0jZGVmaW5lCQlIRkEzODR4X1RYX1BSU1QJCQkJKChVSU5UMTYpQklUMTEpCi0jZGVmaW5lCQlIRkEzODR4X1RYX01BQ1BPUlQJCQkoKFVJTlQxNikoQklUMTAgfCBCSVQ5IHwgQklUOCkpCi0jZGVmaW5lCQlIRkEzODR4X1RYX05PRU5DUllQVAkJCSgoVUlOVDE2KUJJVDcpCi0jZGVmaW5lCQlIRkEzODR4X1RYX1JFVFJZU1RSQVQJCQkoKFVJTlQxNikoQklUNiB8IEJJVDUpKQotI2RlZmluZQkJSEZBMzg0eF9UWF9TVFJVQ1RZUEUJCQkoKFVJTlQxNikoQklUNCB8IEJJVDMpKQotI2RlZmluZQkJSEZBMzg0eF9UWF9UWEVYCQkJCSgoVUlOVDE2KUJJVDIpCi0jZGVmaW5lCQlIRkEzODR4X1RYX1RYT0sJCQkJKChVSU5UMTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhfQ0ZQT0xMCQkJKCh1MTYpQklUMTIpCisjZGVmaW5lCQlIRkEzODR4X1RYX1BSU1QJCQkJKCh1MTYpQklUMTEpCisjZGVmaW5lCQlIRkEzODR4X1RYX01BQ1BPUlQJCQkoKHUxNikoQklUMTAgfCBCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X1RYX05PRU5DUllQVAkJCSgodTE2KUJJVDcpCisjZGVmaW5lCQlIRkEzODR4X1RYX1JFVFJZU1RSQVQJCQkoKHUxNikoQklUNiB8IEJJVDUpKQorI2RlZmluZQkJSEZBMzg0eF9UWF9TVFJVQ1RZUEUJCQkoKHUxNikoQklUNCB8IEJJVDMpKQorI2RlZmluZQkJSEZBMzg0eF9UWF9UWEVYCQkJCSgodTE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X1RYX1RYT0sJCQkJKCh1MTYpQklUMSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbW11bmljYXRpb24gRnJhbWVzOiBUZXN0L0dldC9TZXQgRmllbGQgVmFsdWVzIGZvciBUcmFuc21pdCBGcmFtZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0gU3RhdHVzIEZpZWxkIC0tKi8KICNkZWZpbmUgSEZBMzg0eF9UWFNUQVRVU19JU0VSUk9SKHYpCVwKLQkoKChVSU5UMTYpKHYpKSZcCisJKCgodTE2KSh2KSkmXAogCShIRkEzODR4X1RYU1RBVFVTX0FDS0VSUnxIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlJ8XAogCUhGQTM4NHhfVFhTVEFUVVNfRElTQ09OfEhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUnxcCiAJSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUikpCiAKLSNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0FDS0VSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSKSkKLSNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0ZPUk1FUlIodikJKChVSU5UMTYpKCgoVUlOVDE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIpKQotI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTRElTQ09OKHYpCSgoVUlOVDE2KSgoKFVJTlQxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19ESVNDT04pKQotI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTQUdFREVSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUikpCi0jZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNSRVRSWUVSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIpKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTQUNLRVJSKHYpCSgodTE2KSgoKHUxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlIpKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTRk9STUVSUih2KQkoKHUxNikoKCh1MTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUikpCisjZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNESVNDT04odikJKCh1MTYpKCgodTE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0RJU0NPTikpCisjZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNBR0VERVJSKHYpCSgodTE2KSgoKHUxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19BR0VERVJSKSkKKyNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU1JFVFJZRVJSKHYpCSgodTE2KSgoKHUxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUikpCiAKLSNkZWZpbmUJSEZBMzg0eF9UWF9HRVQodixtLHMpCQkoKCgoVUlOVDE2KSh2KSkmKChVSU5UMTYpKG0pKSk+PigoVUlOVDE2KShzKSkpCi0jZGVmaW5lCUhGQTM4NHhfVFhfU0VUKHYsbSxzKQkJKCgoKFVJTlQxNikodikpPDwoKFVJTlQxNikocykpKSYoKFVJTlQxNikobSkpKQorI2RlZmluZQlIRkEzODR4X1RYX0dFVCh2LG0scykJCSgoKCh1MTYpKHYpKSYoKHUxNikobSkpKT4+KCh1MTYpKHMpKSkKKyNkZWZpbmUJSEZBMzg0eF9UWF9TRVQodixtLHMpCQkoKCgodTE2KSh2KSk8PCgodTE2KShzKSkpJigodTE2KShtKSkpCiAKICNkZWZpbmUJSEZBMzg0eF9UWF9DRlBPTExfR0VUKHYpCUhGQTM4NHhfVFhfR0VUKHYsIEhGQTM4NHhfVFhfQ0ZQT0xMLDEyKQogI2RlZmluZQlIRkEzODR4X1RYX0NGUE9MTF9TRVQodikJSEZBMzg0eF9UWF9TRVQodiwgSEZBMzg0eF9UWF9DRlBPTEwsMTIpCkBAIC0xNjk2LDcwICsxNjYwLDcwIEBACiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3J4X2ZyYW1lCiB7CiAJLyotLSBNQUMgcnggZGVzY3JpcHRvciAoaGZhMzg0eCBieXRlIG9yZGVyKSAtLSovCi0JVUlOVDE2CXN0YXR1czsKLQlVSU5UMzIJdGltZTsKLQlVSU5UOAlzaWxlbmNlOwotCVVJTlQ4CXNpZ25hbDsKLQlVSU5UOAlyYXRlOwotCVVJTlQ4CXJ4X2Zsb3c7Ci0JVUlOVDE2CXJlc2VydmVkMTsKLQlVSU5UMTYJcmVzZXJ2ZWQyOworCXUxNglzdGF0dXM7CisJdTMyCXRpbWU7CisJdTgJc2lsZW5jZTsKKwl1OAlzaWduYWw7CisJdTgJcmF0ZTsKKwl1OAlyeF9mbG93OworCXUxNglyZXNlcnZlZDE7CisJdTE2CXJlc2VydmVkMjsKIAogCS8qLS0gODAyLjExIEhlYWRlciBJbmZvcm1hdGlvbiAoODAyLjExIGJ5dGUgb3JkZXIpIC0tKi8KLQlVSU5UMTYJZnJhbWVfY29udHJvbDsKLQlVSU5UMTYJZHVyYXRpb25faWQ7Ci0JVUlOVDgJYWRkcmVzczFbNl07Ci0JVUlOVDgJYWRkcmVzczJbNl07Ci0JVUlOVDgJYWRkcmVzczNbNl07Ci0JVUlOVDE2CXNlcXVlbmNlX2NvbnRyb2w7Ci0JVUlOVDgJYWRkcmVzczRbNl07Ci0JVUlOVDE2CWRhdGFfbGVuOyAvKiBoZmEzODR4IChsaXR0bGUgZW5kaWFuKSBmb3JtYXQgKi8KKwl1MTYJZnJhbWVfY29udHJvbDsKKwl1MTYJZHVyYXRpb25faWQ7CisJdTgJYWRkcmVzczFbNl07CisJdTgJYWRkcmVzczJbNl07CisJdTgJYWRkcmVzczNbNl07CisJdTE2CXNlcXVlbmNlX2NvbnRyb2w7CisJdTgJYWRkcmVzczRbNl07CisJdTE2CWRhdGFfbGVuOyAvKiBoZmEzODR4IChsaXR0bGUgZW5kaWFuKSBmb3JtYXQgKi8KIAogCS8qLS0gODAyLjMgSGVhZGVyIEluZm9ybWF0aW9uIC0tKi8KLQlVSU5UOAlkZXN0X2FkZHJbNl07Ci0JVUlOVDgJc3JjX2FkZHJbNl07Ci0JVUlOVDE2CWRhdGFfbGVuZ3RoOyAvKiBJRUVFPyAoYmlnIGVuZGlhbikgZm9ybWF0ICovCisJdTgJZGVzdF9hZGRyWzZdOworCXU4CXNyY19hZGRyWzZdOworCXUxNglkYXRhX2xlbmd0aDsgLyogSUVFRT8gKGJpZyBlbmRpYW4pIGZvcm1hdCAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3J4X2ZyYW1lX3Q7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb21tdW5pY2F0aW9uIEZyYW1lczogRmllbGQgTWFza3MgZm9yIFJlY2VpdmUgRnJhbWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tIE9mZnNldHMgLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SWF9EQVRBX0xFTl9PRkYJCQkoKFVJTlQxNik0NCkKLSNkZWZpbmUJCUhGQTM4NHhfUlhfODAyMTFIRFJfT0ZGCQkJKChVSU5UMTYpMTQpCi0jZGVmaW5lCQlIRkEzODR4X1JYX0RBVEFfT0ZGCQkJKChVSU5UMTYpNjApCisjZGVmaW5lCQlIRkEzODR4X1JYX0RBVEFfTEVOX09GRgkJCSgodTE2KTQ0KQorI2RlZmluZQkJSEZBMzg0eF9SWF84MDIxMUhEUl9PRkYJCQkoKHUxNikxNCkKKyNkZWZpbmUJCUhGQTM4NHhfUlhfREFUQV9PRkYJCQkoKHUxNik2MCkKIAogLyotLSBTdGF0dXMgRmllbGRzIC0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRQkJKChVSU5UMTYpKEJJVDE1IHwgQklUMTQgfCBCSVQxMykpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQJCSgoVUlOVDE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfVU5ERUNSCQkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSCQkJKChVSU5UMTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRQkJKCh1MTYpKEJJVDE1IHwgQklUMTQgfCBCSVQxMykpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQJCSgodTE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfVU5ERUNSCQkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSCQkJKCh1MTYpQklUMCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbW11bmljYXRpb24gRnJhbWVzOiBUZXN0L0dldC9TZXQgRmllbGQgVmFsdWVzIGZvciBSZWNlaXZlIEZyYW1lcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFX0dFVCh2YWx1ZSkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRSkgPj4gMTMpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEzKSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQpID4+IDgpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDgpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU1VOREVDUih2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19VTkRFQ1IpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU0ZDU0VSUih2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19GQ1NFUlIpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFX0dFVCh2YWx1ZSkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRSkgPj4gMTMpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFX1NFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9HRVQodmFsdWUpCSgodTE2KSgoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQpID4+IDgpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX1NFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDgpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU1VOREVDUih2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19VTkRFQ1IpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU0ZDU0VSUih2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19GQ1NFUlIpKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIEZSQU1FIFNUUlVDVFVSRVM6IEluZm9ybWF0aW9uIFR5cGVzIGFuZCBJbmZvcm1hdGlvbiBGcmFtZSBTdHJ1Y3R1cmVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBUeXBlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9JVF9IQU5ET1ZFUkFERFIJCQkoKFVJTlQxNikweEYwMDBVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfSEFORE9WRVJERUFVVEhBRERSRVNTCSgoVUlOVDE2KTB4RjAwMVVMKS8vQVAgMS4zLjcKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQ09NTVRBTExJRVMJCQkoKFVJTlQxNikweEYxMDBVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfU0NBTlJFU1VMVFMJCQkoKFVJTlQxNikweEYxMDFVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQ0hJTkZPUkVTVUxUUwkJKChVSU5UMTYpMHhGMTAyVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0hPU1RTQ0FOUkVTVUxUUwkJKChVSU5UMTYpMHhGMTAzVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0xJTktTVEFUVVMJCQkoKFVJTlQxNikweEYyMDBVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQVNTT0NTVEFUVVMJCQkoKFVJTlQxNikweEYyMDFVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQVVUSFJFUQkJCSgoVUlOVDE2KTB4RjIwMlVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9QU1VTRVJDTlQJCQkoKFVJTlQxNikweEYyMDNVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfS0VZSURDSEFOR0VECQkJKChVSU5UMTYpMHhGMjA0VUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0FTU09DUkVRICAgIAkJCSgoVUlOVDE2KTB4RjIwNVVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9NSUNGQUlMVVJFICAJCQkoKFVJTlQxNikweEYyMDZVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfSEFORE9WRVJBRERSCQkJKCh1MTYpMHhGMDAwVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0hBTkRPVkVSREVBVVRIQUREUkVTUwkoKHUxNikweEYwMDFVTCkvL0FQIDEuMy43CisjZGVmaW5lCQlIRkEzODR4X0lUX0NPTU1UQUxMSUVTCQkJKCh1MTYpMHhGMTAwVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX1NDQU5SRVNVTFRTCQkJKCh1MTYpMHhGMTAxVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0NISU5GT1JFU1VMVFMJCSgodTE2KTB4RjEwMlVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9IT1NUU0NBTlJFU1VMVFMJCSgodTE2KTB4RjEwM1VMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9MSU5LU1RBVFVTCQkJKCh1MTYpMHhGMjAwVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0FTU09DU1RBVFVTCQkJKCh1MTYpMHhGMjAxVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0FVVEhSRVEJCQkoKHUxNikweEYyMDJVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfUFNVU0VSQ05UCQkJKCh1MTYpMHhGMjAzVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0tFWUlEQ0hBTkdFRAkJCSgodTE2KTB4RjIwNFVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9BU1NPQ1JFUSAgICAJCQkoKHUxNikweEYyMDVVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfTUlDRkFJTFVSRSAgCQkJKCh1MTYpMHhGMjA2VUwpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIEZyYW1lcyBTdHJ1Y3R1cmVzCkBAIC0xNzY5LDgwICsxNzMzLDgwIEBACiAvKi0tICBOb3RpZmljYXRpb24gRnJhbWUsTUFDIE1nbXQ6IEhhbmRvdmVyIEFkZHJlc3MgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IYW5kb3ZlckFkZHIKIHsKLQlVSU5UMTYJZnJhbWVsZW47Ci0JVUlOVDE2CWluZm90eXBlOwotCVVJTlQ4CWhhbmRvdmVyX2FkZHJbV0xBTl9CU1NJRF9MRU5dOworCXUxNglmcmFtZWxlbjsKKwl1MTYJaW5mb3R5cGU7CisJdTgJaGFuZG92ZXJfYWRkcltXTEFOX0JTU0lEX0xFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSGFuZG92ZXJBZGRyX3Q7CiAKIC8qLS0gIElucXVpcnkgRnJhbWUsIERpYWdub3NlOiBDb21tdW5pY2F0aW9uIFRhbGxpZXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczE2CiB7Ci0JVUlOVDE2CXR4dW5pY2FzdGZyYW1lczsKLQlVSU5UMTYJdHhtdWx0aWNhc3RmcmFtZXM7Ci0JVUlOVDE2CXR4ZnJhZ21lbnRzOwotCVVJTlQxNgl0eHVuaWNhc3RvY3RldHM7Ci0JVUlOVDE2CXR4bXVsdGljYXN0b2N0ZXRzOwotCVVJTlQxNgl0eGRlZmVycmVkdHJhbnM7Ci0JVUlOVDE2CXR4c2luZ2xlcmV0cnlmcmFtZXM7Ci0JVUlOVDE2CXR4bXVsdGlwbGVyZXRyeWZyYW1lczsKLQlVSU5UMTYJdHhyZXRyeWxpbWl0ZXhjZWVkZWQ7Ci0JVUlOVDE2CXR4ZGlzY2FyZHM7Ci0JVUlOVDE2CXJ4dW5pY2FzdGZyYW1lczsKLQlVSU5UMTYJcnhtdWx0aWNhc3RmcmFtZXM7Ci0JVUlOVDE2CXJ4ZnJhZ21lbnRzOwotCVVJTlQxNglyeHVuaWNhc3RvY3RldHM7Ci0JVUlOVDE2CXJ4bXVsdGljYXN0b2N0ZXRzOwotCVVJTlQxNglyeGZjc2Vycm9yczsKLQlVSU5UMTYJcnhkaXNjYXJkc25vYnVmZmVyOwotCVVJTlQxNgl0eGRpc2NhcmRzd3JvbmdzYTsKLQlVSU5UMTYJcnhkaXNjYXJkc3dlcHVuZGVjcjsKLQlVSU5UMTYJcnhtc2dpbm1zZ2ZyYWc7Ci0JVUlOVDE2CXJ4bXNnaW5iYWRtc2dmcmFnOworCXUxNgl0eHVuaWNhc3RmcmFtZXM7CisJdTE2CXR4bXVsdGljYXN0ZnJhbWVzOworCXUxNgl0eGZyYWdtZW50czsKKwl1MTYJdHh1bmljYXN0b2N0ZXRzOworCXUxNgl0eG11bHRpY2FzdG9jdGV0czsKKwl1MTYJdHhkZWZlcnJlZHRyYW5zOworCXUxNgl0eHNpbmdsZXJldHJ5ZnJhbWVzOworCXUxNgl0eG11bHRpcGxlcmV0cnlmcmFtZXM7CisJdTE2CXR4cmV0cnlsaW1pdGV4Y2VlZGVkOworCXUxNgl0eGRpc2NhcmRzOworCXUxNglyeHVuaWNhc3RmcmFtZXM7CisJdTE2CXJ4bXVsdGljYXN0ZnJhbWVzOworCXUxNglyeGZyYWdtZW50czsKKwl1MTYJcnh1bmljYXN0b2N0ZXRzOworCXUxNglyeG11bHRpY2FzdG9jdGV0czsKKwl1MTYJcnhmY3NlcnJvcnM7CisJdTE2CXJ4ZGlzY2FyZHNub2J1ZmZlcjsKKwl1MTYJdHhkaXNjYXJkc3dyb25nc2E7CisJdTE2CXJ4ZGlzY2FyZHN3ZXB1bmRlY3I7CisJdTE2CXJ4bXNnaW5tc2dmcmFnOworCXUxNglyeG1zZ2luYmFkbXNnZnJhZzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Db21tVGFsbGllczE2X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMzMgogewotCVVJTlQzMgl0eHVuaWNhc3RmcmFtZXM7Ci0JVUlOVDMyCXR4bXVsdGljYXN0ZnJhbWVzOwotCVVJTlQzMgl0eGZyYWdtZW50czsKLQlVSU5UMzIJdHh1bmljYXN0b2N0ZXRzOwotCVVJTlQzMgl0eG11bHRpY2FzdG9jdGV0czsKLQlVSU5UMzIJdHhkZWZlcnJlZHRyYW5zOwotCVVJTlQzMgl0eHNpbmdsZXJldHJ5ZnJhbWVzOwotCVVJTlQzMgl0eG11bHRpcGxlcmV0cnlmcmFtZXM7Ci0JVUlOVDMyCXR4cmV0cnlsaW1pdGV4Y2VlZGVkOwotCVVJTlQzMgl0eGRpc2NhcmRzOwotCVVJTlQzMglyeHVuaWNhc3RmcmFtZXM7Ci0JVUlOVDMyCXJ4bXVsdGljYXN0ZnJhbWVzOwotCVVJTlQzMglyeGZyYWdtZW50czsKLQlVSU5UMzIJcnh1bmljYXN0b2N0ZXRzOwotCVVJTlQzMglyeG11bHRpY2FzdG9jdGV0czsKLQlVSU5UMzIJcnhmY3NlcnJvcnM7Ci0JVUlOVDMyCXJ4ZGlzY2FyZHNub2J1ZmZlcjsKLQlVSU5UMzIJdHhkaXNjYXJkc3dyb25nc2E7Ci0JVUlOVDMyCXJ4ZGlzY2FyZHN3ZXB1bmRlY3I7Ci0JVUlOVDMyCXJ4bXNnaW5tc2dmcmFnOwotCVVJTlQzMglyeG1zZ2luYmFkbXNnZnJhZzsKKwl1MzIJdHh1bmljYXN0ZnJhbWVzOworCXUzMgl0eG11bHRpY2FzdGZyYW1lczsKKwl1MzIJdHhmcmFnbWVudHM7CisJdTMyCXR4dW5pY2FzdG9jdGV0czsKKwl1MzIJdHhtdWx0aWNhc3RvY3RldHM7CisJdTMyCXR4ZGVmZXJyZWR0cmFuczsKKwl1MzIJdHhzaW5nbGVyZXRyeWZyYW1lczsKKwl1MzIJdHhtdWx0aXBsZXJldHJ5ZnJhbWVzOworCXUzMgl0eHJldHJ5bGltaXRleGNlZWRlZDsKKwl1MzIJdHhkaXNjYXJkczsKKwl1MzIJcnh1bmljYXN0ZnJhbWVzOworCXUzMglyeG11bHRpY2FzdGZyYW1lczsKKwl1MzIJcnhmcmFnbWVudHM7CisJdTMyCXJ4dW5pY2FzdG9jdGV0czsKKwl1MzIJcnhtdWx0aWNhc3RvY3RldHM7CisJdTMyCXJ4ZmNzZXJyb3JzOworCXUzMglyeGRpc2NhcmRzbm9idWZmZXI7CisJdTMyCXR4ZGlzY2FyZHN3cm9uZ3NhOworCXUzMglyeGRpc2NhcmRzd2VwdW5kZWNyOworCXUzMglyeG1zZ2lubXNnZnJhZzsKKwl1MzIJcnhtc2dpbmJhZG1zZ2ZyYWc7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90OwogCiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogU2NhbiBSZXN1bHRzICYgU3ViZmllbGRzLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViCiB7Ci0JVUlOVDE2CWNoaWQ7Ci0JVUlOVDE2CWFubDsKLQlVSU5UMTYJc2w7Ci0JVUlOVDgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwotCVVJTlQxNgliY25pbnQ7Ci0JVUlOVDE2CWNhcGluZm87CisJdTE2CWNoaWQ7CisJdTE2CWFubDsKKwl1MTYJc2w7CisJdTgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOworCXUxNgliY25pbnQ7CisJdTE2CWNhcGluZm87CiAJaGZhMzg0eF9ieXRlc3RyMzJfdAlzc2lkOwotCVVJTlQ4CXN1cHByYXRlc1sxMF07IC8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KLQlVSU5UMTYJcHJvYmVyZXNwX3JhdGU7CisJdTgJc3VwcHJhdGVzWzEwXTsgLyogODAyLjExIGluZm8gZWxlbWVudCAqLworCXUxNglwcm9iZXJlc3BfcmF0ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TY2FuUmVzdWx0U3ViX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdAogewotCVVJTlQxNglyc3ZkOwotCVVJTlQxNglzY2FucmVhc29uOworCXUxNglyc3ZkOworCXUxNglzY2FucmVhc29uOwogCWhmYTM4NHhfU2NhblJlc3VsdFN1Yl90CiAJCXJlc3VsdFtIRkEzODR4X1NDQU5SRVNVTFRfTUFYXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TY2FuUmVzdWx0X3Q7CkBAIC0xODUwLDEwICsxODE0LDEwIEBACiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogQ2hJbmZvIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YgogewotCVVJTlQxNgljaGlkOwotCVVJTlQxNglhbmw7Ci0JVUlOVDE2CXBubDsKLQlVSU5UMTYJYWN0aXZlOworCXUxNgljaGlkOworCXUxNglhbmw7CisJdTE2CXBubDsKKwl1MTYJYWN0aXZlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90OwogCiAjZGVmaW5lIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX0JTU0FDVElWRQlCSVQwCkBAIC0xODYxLDcgKzE4MjUsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdAogewotCVVJTlQxNglzY2FuY2hhbm5lbHM7CisJdTE2CXNjYW5jaGFubmVsczsKIAloZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90CiAJCXJlc3VsdFtIRkEzODR4X0NISU5GT1JFU1VMVF9NQVhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NoSW5mb1Jlc3VsdF90OwpAQCAtMTg2OSw3NSArMTgzMyw3NSBAQAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IEhvc3QgU2NhbiBSZXN1bHRzICYgU3ViZmllbGRzLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdFN1YgogewotCVVJTlQxNgljaGlkOwotCVVJTlQxNglhbmw7Ci0JVUlOVDE2CXNsOwotCVVJTlQ4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKLQlVSU5UMTYJYmNuaW50OwotCVVJTlQxNgljYXBpbmZvOworCXUxNgljaGlkOworCXUxNglhbmw7CisJdTE2CXNsOworCXU4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKKwl1MTYJYmNuaW50OworCXUxNgljYXBpbmZvOwogCWhmYTM4NHhfYnl0ZXN0cjMyX3QJc3NpZDsKLQlVSU5UOAlzdXBwcmF0ZXNbMTBdOyAvKiA4MDIuMTEgaW5mbyBlbGVtZW50ICovCi0JVUlOVDE2CXByb2JlcmVzcF9yYXRlOwotCVVJTlQxNglhdGltOworCXU4CXN1cHByYXRlc1sxMF07IC8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KKwl1MTYJcHJvYmVyZXNwX3JhdGU7CisJdTE2CWF0aW07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSFNjYW5SZXN1bHRTdWJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdAogewotCVVJTlQxNglucmVzdWx0OwotCVVJTlQxNglyc3ZkOworCXUxNglucmVzdWx0OworCXUxNglyc3ZkOwogCWhmYTM4NHhfSFNjYW5SZXN1bHRTdWJfdAogCQlyZXN1bHRbSEZBMzg0eF9IU0NBTlJFU1VMVF9NQVhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0hTY2FuUmVzdWx0X3Q7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogTGlua1N0YXR1cyAtLSovCiAKLSNkZWZpbmUgSEZBMzg0eF9MSU5LX05PVENPTk5FQ1RFRAkoKFVJTlQxNikwKQotI2RlZmluZSBIRkEzODR4X0xJTktfQ09OTkVDVEVECQkoKFVJTlQxNikxKQotI2RlZmluZSBIRkEzODR4X0xJTktfRElTQ09OTkVDVEVECSgoVUlOVDE2KTIpCi0jZGVmaW5lIEhGQTM4NHhfTElOS19BUF9DSEFOR0UJCSgoVUlOVDE2KTMpCi0jZGVmaW5lIEhGQTM4NHhfTElOS19BUF9PVVRPRlJBTkdFCSgoVUlOVDE2KTQpCi0jZGVmaW5lIEhGQTM4NHhfTElOS19BUF9JTlJBTkdFCQkoKFVJTlQxNik1KQotI2RlZmluZSBIRkEzODR4X0xJTktfQVNTT0NGQUlMCQkoKFVJTlQxNik2KQorI2RlZmluZSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVECSgodTE2KTApCisjZGVmaW5lIEhGQTM4NHhfTElOS19DT05ORUNURUQJCSgodTE2KTEpCisjZGVmaW5lIEhGQTM4NHhfTElOS19ESVNDT05ORUNURUQJKCh1MTYpMikKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX0NIQU5HRQkJKCh1MTYpMykKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX09VVE9GUkFOR0UJKCh1MTYpNCkKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX0lOUkFOR0UJCSgodTE2KTUpCisjZGVmaW5lIEhGQTM4NHhfTElOS19BU1NPQ0ZBSUwJCSgodTE2KTYpCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTGlua1N0YXR1cwogewotCVVJTlQxNglsaW5rc3RhdHVzOworCXUxNglsaW5rc3RhdHVzOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0xpbmtTdGF0dXNfdDsKIAogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IEFzc29jaWF0aW9uU3RhdHVzICgtLSovCiAKLSNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19TVEFBU1NPQwkoKFVJTlQxNikxKQotI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX1JFQVNTT0MJKChVSU5UMTYpMikKLSNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19ESVNBU1NPQwkoKFVJTlQxNikzKQotI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0FTU09DRkFJTAkoKFVJTlQxNik0KQotI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0FVVEhGQUlMCSgoVUlOVDE2KTUpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfU1RBQVNTT0MJKCh1MTYpMSkKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19SRUFTU09DCSgodTE2KTIpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfRElTQVNTT0MJKCh1MTYpMykKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19BU1NPQ0ZBSUwJKCh1MTYpNCkKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19BVVRIRkFJTAkoKHUxNik1KQogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0Fzc29jU3RhdHVzCiB7Ci0JVUlOVDE2CWFzc29jc3RhdHVzOwotCVVJTlQ4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNglhc3NvY3N0YXR1czsKKwl1OAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKIAkvKiBvbGRfYXBfYWRkciBpcyBvbmx5IHZhbGlkIGlmIGFzc29jc3RhdHVzID09IDIgKi8KLQlVSU5UOAlvbGRfYXBfYWRkcltXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJcmVhc29uOwotCVVJTlQxNglyZXNlcnZlZDsKKwl1OAlvbGRfYXBfYWRkcltXTEFOX0FERFJfTEVOXTsKKwl1MTYJcmVhc29uOworCXUxNglyZXNlcnZlZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Bc3NvY1N0YXR1c190OwogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IEF1dGhSZXF1ZXN0IChBUCBPbmx5KSAtLSovCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXV0aFJlcXVlc3QKIHsKLQlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJYWxnb3JpdGhtOworCXU4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNglhbGdvcml0aG07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQXV0aFJlcV90OwogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IEFzc29jUmVxdWVzdCAoQVAgT25seSkgLS0qLwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0Fzc29jUmVxdWVzdAogewotCVVJTlQ4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNgl0eXBlOwotCVVJTlQ4ICAgd3BhX2RhdGFbODBdOworCXU4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNgl0eXBlOworCXU4ICAgd3BhX2RhdGFbODBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0Fzc29jUmVxX3Q7CiAKIApAQCAtMTk0OCwyMSArMTkxMiwyMSBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01pY0ZhaWx1cmUKIHsKLQlVSU5UOAlzZW5kZXJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJZGVzdFtXTEFOX0FERFJfTEVOXTsKKwl1OAlzZW5kZXJbV0xBTl9BRERSX0xFTl07CisJdTgJZGVzdFtXTEFOX0FERFJfTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NaWNGYWlsdXJlX3Q7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogUFNVc2VyQ291bnQgKEFQIE9ubHkpIC0tKi8KIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QU1VzZXJDb3VudAogewotCVVJTlQxNgl1c2VyY250OworCXUxNgl1c2VyY250OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BTVXNlckNvdW50X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfS2V5SURDaGFuZ2VkCiB7Ci0JVUlOVDgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CWtleWlkOworCXU4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNglrZXlpZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9LZXlJRENoYW5nZWRfdDsKIAogLyotLSAgQ29sbGVjdGlvbiBvZiBhbGwgSW5mIGZyYW1lcyAtLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTk4MSwxMiArMTk0NSwxMSBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lCiB7Ci0JVUlOVDE2CQkJZnJhbWVsZW47Ci0JVUlOVDE2CQkJaW5mb3R5cGU7CisJdTE2CQkJZnJhbWVsZW47CisJdTE2CQkJaW5mb3R5cGU7CiAJaGZhMzg0eF9pbmZvZGF0YV90CWluZm87CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSW5mRnJhbWVfdDsKIAotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFVTQiBQYWNrZXQgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjAyMCw0NiArMTk4Myw0NiBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl90eGZybSB7CiAJaGZhMzg0eF90eF9mcmFtZV90CWRlc2M7Ci0JVUlOVDgJCQlkYXRhW1dMQU5fREFUQV9NQVhMRU5dOworCXU4CQkJZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfdHhmcm1fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfY21kcmVxIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQljbWQ7Ci0JVUlOVDE2CQlwYXJtMDsKLQlVSU5UMTYJCXBhcm0xOwotCVVJTlQxNgkJcGFybTI7Ci0JVUlOVDgJCXBhZFs1NF07CisJdTE2CQl0eXBlOworCXUxNgkJY21kOworCXUxNgkJcGFybTA7CisJdTE2CQlwYXJtMTsKKwl1MTYJCXBhcm0yOworCXU4CQlwYWRbNTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9jbWRyZXFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfd3JpZHJlcSB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQxNgkJcmlkOwotCVVJTlQ4CQlkYXRhW0hGQTM4NHhfUklEREFUQV9NQVhMRU5dOworCXUxNgkJdHlwZTsKKwl1MTYJCWZybWxlbjsKKwl1MTYJCXJpZDsKKwl1OAkJZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jfd3JpZHJlcV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVxIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47Ci0JVUlOVDE2CQlyaWQ7Ci0JVUlOVDgJCXBhZFs1OF07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXUxNgkJcmlkOworCXU4CQlwYWRbNThdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ycmlkcmVxX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3dtZW1yZXEgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWZybWxlbjsKLQlVSU5UMTYJCW9mZnNldDsKLQlVSU5UMTYJCXBhZ2U7Ci0JVUlOVDgJCWRhdGFbSEZBMzg0eF9VU0JfUldNRU1fTUFYTEVOXTsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CisJdTE2CQlvZmZzZXQ7CisJdTE2CQlwYWdlOworCXU4CQlkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3dtZW1yZXFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlcSB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQxNgkJb2Zmc2V0OwotCVVJTlQxNgkJcGFnZTsKLQlVSU5UOAkJcGFkWzU2XTsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CisJdTE2CQlvZmZzZXQ7CisJdTE2CQlwYWdlOworCXU4CQlwYWRbNTZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ybWVtcmVxX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIwNjcsNTQgKzIwMzAsNTQgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfcnhmcm0gewogCWhmYTM4NHhfcnhfZnJhbWVfdAlkZXNjOwotCVVJTlQ4CQkJZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKKwl1OAkJCWRhdGFbV0xBTl9EQVRBX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3J4ZnJtX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX2luZm9mcm0gewotCVVJTlQxNgkJCXR5cGU7CisJdTE2CQkJdHlwZTsKIAloZmEzODR4X0luZkZyYW1lX3QJaW5mbzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfaW5mb2ZybV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlyZXNwMDsKLQlVSU5UMTYJCXJlc3AxOwotCVVJTlQxNgkJcmVzcDI7CisJdTE2CQl0eXBlOworCXUxNgkJc3RhdHVzOworCXUxNgkJcmVzcDA7CisJdTE2CQlyZXNwMTsKKwl1MTYJCXJlc3AyOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9jbWRyZXNwX3Q7CiAKIHR5cGVkZWYgaGZhMzg0eF91c2JfY21kcmVzcF90IGhmYTM4NHhfdXNiX3dyaWRyZXNwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47Ci0JVUlOVDE2CQlyaWQ7Ci0JVUlOVDgJCWRhdGFbSEZBMzg0eF9SSUREQVRBX01BWExFTl07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXUxNgkJcmlkOworCXU4CQlkYXRhW0hGQTM4NHhfUklEREFUQV9NQVhMRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ycmlkcmVzcF90OwogCiB0eXBlZGVmIGhmYTM4NHhfdXNiX2NtZHJlc3BfdCBoZmEzODR4X3VzYl93bWVtcmVzcF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVzcCB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQ4CQlkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXU4CQlkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3JtZW1yZXNwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX2J1ZmF2YWlsIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9idWZhdmFpbF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9lcnJvciB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZXJyb3J0eXBlOworCXUxNgkJdHlwZTsKKwl1MTYJCWVycm9ydHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfZXJyb3JfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFVuaW9ucyBmb3IgcGFja2FnaW5nIGFsbCB0aGUga25vd24gcGFja2V0IHR5cGVzIHRvZ2V0aGVyICovCiAKIHR5cGVkZWYgdW5pb24gaGZhMzg0eF91c2JvdXQgewotCVVJTlQxNgkJCXR5cGU7CisJdTE2CQkJdHlwZTsKIAloZmEzODR4X3VzYl90eGZybV90CXR4ZnJtOwogCWhmYTM4NHhfdXNiX2NtZHJlcV90CWNtZHJlcTsKIAloZmEzODR4X3VzYl93cmlkcmVxX3QJd3JpZHJlcTsKQEAgLTIxMjQsNyArMjA4Nyw3IEBACiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNib3V0X3Q7CiAKIHR5cGVkZWYgdW5pb24gaGZhMzg0eF91c2JpbiB7Ci0JVUlOVDE2CQkJdHlwZTsKKwl1MTYJCQl0eXBlOwogCWhmYTM4NHhfdXNiX3J4ZnJtX3QJcnhmcm07CiAJaGZhMzg0eF91c2JfdHhmcm1fdAl0eGZybTsKIAloZmEzODR4X3VzYl9pbmZvZnJtX3QJaW5mb2ZybTsKQEAgLTIxMzUsMjggKzIwOTgsMjYgQEAKIAloZmEzODR4X3VzYl9ybWVtcmVzcF90CXJtZW1yZXNwOwogCWhmYTM4NHhfdXNiX2J1ZmF2YWlsX3QJYnVmYXZhaWw7CiAJaGZhMzg0eF91c2JfZXJyb3JfdAl1c2JlcnJvcjsKLQlVSU5UOAkJCWJvZ3VzcGFkWzMwMDBdOworCXU4CQkJYm9ndXNwYWRbMzAwMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiaW5fdDsKIAotI2VuZGlmIC8qIFdMQU5fVVNCICovCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFBEIHJlY29yZCBzdHJ1Y3R1cmVzLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9wY2JfcGFydG51bQogewotCVVJTlQ4CW51bVs4XTsKKwl1OAludW1bOF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bQogewotCVVJTlQ4CW51bVs4XTsKKwl1OAludW1bOF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9uaWNfc2VyaWFsCiB7Ci0JVUlOVDgJbnVtWzEyXTsKKwl1OAludW1bMTJdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9uaWNfc2VyaWFsX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHMKQEAgLTIxODAsMTcwICsyMTQxLDE3MCBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZQogewotCVVJTlQ4CXNpemVbMTJdOyAvKiB1bml0cyBvZiBLQiAqLworCXU4CXNpemVbMTJdOyAvKiB1bml0cyBvZiBLQiAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9tZmlzdXByYW5nZQogewotCVVJTlQxNglpZDsKLQlVSU5UMTYJdmFyaWFudDsKLQlVSU5UMTYJYm90dG9tOwotCVVJTlQxNgl0b3A7CisJdTE2CWlkOworCXUxNgl2YXJpYW50OworCXUxNglib3R0b207CisJdTE2CXRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2VfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2UKIHsKLQlVSU5UMTYJaWQ7Ci0JVUlOVDE2CXZhcmlhbnQ7Ci0JVUlOVDE2CWJvdHRvbTsKLQlVSU5UMTYJdG9wOworCXUxNglpZDsKKwl1MTYJdmFyaWFudDsKKwl1MTYJYm90dG9tOworCXUxNgl0b3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2NmaXN1cHJhbmdlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX25pY2lkCiB7Ci0JVUlOVDE2CWlkOwotCVVJTlQxNgl2YXJpYW50OwotCVVJTlQxNgltYWpvcjsKLQlVSU5UMTYJbWlub3I7CisJdTE2CWlkOworCXUxNgl2YXJpYW50OworCXUxNgltYWpvcjsKKwl1MTYJbWlub3I7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX25pY2lkX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50cwogewotCVVJTlQxNgl2YWx1ZVswXTsKKwl1MTYJdmFsdWVbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3JlZmRhY19tZWFzdXJlbWVudHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzCiB7Ci0JVUlOVDE2CXZhbHVlWzBdOworCXUxNgl2YWx1ZVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfbWVhc3VyZW1lbnRzCiB7Ci0JVUlOVDE2CXZhbHVlWzBdOworCXUxNgl2YWx1ZVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbGV2ZWxfY29tcGNfbWVhc3VyZW1lbnRzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21hY19hZGRyZXNzCiB7Ci0JVUlOVDgJYWRkcls2XTsKKwl1OAlhZGRyWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9tYWNfYWRkcmVzc190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9ta2tfY2FsbG5hbWUKIHsKLQlVSU5UOAljYWxsbmFtZVs4XTsKKwl1OAljYWxsbmFtZVs4XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZ2RvbWFpbgogewotCVVJTlQxNgludW1kb21haW5zOwotCVVJTlQxNglkb21haW5bNV07CisJdTE2CW51bWRvbWFpbnM7CisJdTE2CWRvbWFpbls1XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcmVnZG9tYWluX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2FsbG93ZWRfY2hhbm5lbAogewotCVVJTlQxNgljaF9iaXRtYXA7CisJdTE2CWNoX2JpdG1hcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbAogewotCVVJTlQxNgljaGFubmVsOworCXUxNgljaGFubmVsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWxfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb24KIHsKLQlVSU5UMTYJYXZhaWxhYmxlOworCXUxNglhdmFpbGFibGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3RlbXB0eXBlCiB7Ci0JVUlOVDE2CXR5cGU7CisJdTE2CXR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3RlbXB0eXBlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19zZXR1cAogewotCVVJTlQxNgljaF92YWx1ZVsxNF07CisJdTE2CWNoX3ZhbHVlWzE0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX3NldHVwCiB7Ci0JVUlOVDE2CWNoX3ZhbHVlWzE0XTsKKwl1MTYJY2hfdmFsdWVbMTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl92Z2RhY19zZXR1cF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwCiB7Ci0JVUlOVDE2CWNoX3ZhbHVlWzE0XTsKKwl1MTYJY2hfdmFsdWVbMTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXAKIHsKLQlVSU5UMTYJdHJpbWlkYWM7Ci0JVUlOVDE2CXRyaW1xZGFjOworCXUxNgl0cmltaWRhYzsKKwl1MTYJdHJpbXFkYWM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXBfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaWZyX3NldHRpbmcKIHsKLQlVSU5UMTYJdmFsdWVbM107CisJdTE2CXZhbHVlWzNdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZ190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9yZnJfc2V0dGluZwogewotCVVJTlQxNgl2YWx1ZVszXTsKKwl1MTYJdmFsdWVbM107CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfYmFzZWxpbmUKIHsKLQlVSU5UMTYJdmFsdWVbNTBdOworCXUxNgl2YWx1ZVs1MF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfYmFzZWxpbmVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3cKIHsKLQlVSU5UMzIJdmFsdWVbMzJdOworCXUzMgl2YWx1ZVszMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfc2hhZG93X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZgogewotCVVJTlQzMgl2YWx1ZVsyMF07CisJdTMyCXZhbHVlWzIwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9pZnJmX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcAogewotCVVJTlQxNgl2YWx1ZVsxNF07CisJdTE2CXZhbHVlWzE0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbHNwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpCiB7Ci0JVUlOVDE2CXZhbHVlWzE3XTsKKwl1MTYJdmFsdWVbMTddOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2FsaV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX25pY19jb25maWcKIHsKLQlVSU5UMTYJY29uZmlnX2JpdG1hcDsKKwl1MTYJY29uZmlnX2JpdG1hcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbmljX2NvbmZpZ190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZm9fZGVsYXkKIHsKLQlVSU5UOCAgIGhmb19kZWxheTsKKwl1OCAgIGhmb19kZWxheTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9oZm9fZGVsYXlfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcAogewotCVVJTlQxNgl2YWx1ZVszMF07CisJdTE2CXZhbHVlWzMwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdGkKIHsKLQlVSU5UMTYJdmFsdWVbMzBdOworCXUxNgl2YWx1ZVszMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0aV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2VuZF9vZl9wZGEKIHsKLQlVSU5UMTYJY3JjOworCXUxNgljcmM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2VuZF9vZl9wZGFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJlYwogewotCVVJTlQxNglsZW47IC8qIGluIHdvcmRzICovCi0JVUlOVDE2CWNvZGU7CisJdTE2CWxlbjsgLyogaW4gd29yZHMgKi8KKwl1MTYJY29kZTsKIAl1bmlvbiBwZHIgewogCWhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtX3QJcGNiX3BhcnRudW07CiAJaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtX3QJcGNiX3RyYWNlbnVtOwpAQCAtMjM5MSwxNCArMjM1MiwxMiBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9zdGF0dXNyZXN1bHQKIHsKLQlVSU5UMTYJc3RhdHVzOwotCVVJTlQxNglyZXNwMDsKLQlVSU5UMTYJcmVzcDE7Ci0JVUlOVDE2CXJlc3AyOworCXUxNglzdGF0dXM7CisJdTE2CXJlc3AwOworCXUxNglyZXNwMTsKKwl1MTYJcmVzcDI7CiB9IGhmYTM4NHhfY21kcmVzdWx0X3Q7CiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCi0KIC8qIFVTQiBDb250cm9sIEV4Y2hhbmdlIChDVExYKToKICAqICBBIHF1ZXVlIG9mIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgaXMgbWFpbnRhaW5lZCBmb3IgYWxsIG9mIHRoZQogICogIFJlcXVlc3QvUmVzcG9uc2UgdHlwZSBVU0IgcGFja2V0cyBzdXBwb3J0ZWQgYnkgUHJpc20yLgpAQCAtMjQxMSw5ICsyMzcwLDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0CiB7Ci0JVUlOVDE2CQlyaWQ7CisJdTE2CQlyaWQ7CiAJY29uc3Qgdm9pZAkqcmlkZGF0YTsKLQlVSU5UCQlyaWRkYXRhX2xlbjsKKwl1bnNpZ25lZCBpbnQJCXJpZGRhdGFfbGVuOwogfSBoZmEzODR4X3JyaWRyZXN1bHRfdDsKIAogZW51bSBjdGx4X3N0YXRlIHsKQEAgLTI0NjcsMjEgKzI0MjYsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNvbXBsZXRpbmc7CiAJc3RydWN0IGxpc3RfaGVhZAlyZWFwYWJsZTsKIH0gaGZhMzg0eF91c2JjdGx4cV90OwotI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IGhmYTQ4NHhfbWV0YWNtZAogewotCVVJTlQxNgkJY21kOworCXUxNgkJY21kOwogCi0JVUlOVDE2ICAgICAgICAgIHBhcm0wOwotCVVJTlQxNiAgICAgICAgICBwYXJtMTsKLQlVSU5UMTYgICAgICAgICAgcGFybTI7Ci0KLSNpZiAwIC8vWFhYIGNtZCBpcnEgc3R1ZmYKLQlVSU5UMTYgICAgICAgICAgYnVsa2lkOyAgICAgICAgIC8qIHdoYXQgUklEL0ZJRCB0byBjb3B5IGRvd24uICovCi0JaW50ICAgICAgICAgICAgIGJ1bGtsZW47ICAgICAgICAvKiBob3cgbXVjaCB0byBjb3B5IGZyb20gQkFQICovCi0gICAgICAgIGNoYXIgICAgICAgICAgICAqYnVsa2RhdGE7ICAgICAgLyogQW5kIHRvIHdoZXJlPyAqLwotI2VuZGlmCisJdTE2ICAgICAgICAgIHBhcm0wOworCXUxNiAgICAgICAgICBwYXJtMTsKKwl1MTYgICAgICAgICAgcGFybTI7CiAKIAloZmEzODR4X2NtZHJlc3VsdF90IHJlc3VsdDsKIH0gaGZhMzg0eF9tZXRhY21kX3Q7CkBAIC0yNTA3LDI4ICsyNDU5LDIyIEBACiAvKiBYWFggVGhlc2UgYXJlIGdvaW5nIGF3YXkgQVNBUCAqLwogdHlwZWRlZiBzdHJ1Y3QgcHJpc20yc3RhX2F1dGhsaXN0CiB7Ci0JVUlOVAljbnQ7Ci0JVUlOVDgJYWRkcltXTEFOX0FVVEhfTUFYXVtXTEFOX0FERFJfTEVOXTsKLQlVSU5UOAlhc3NvY1tXTEFOX0FVVEhfTUFYXTsKKwl1bnNpZ25lZCBpbnQJY250OworCXU4CWFkZHJbV0xBTl9BVVRIX01BWF1bV0xBTl9BRERSX0xFTl07CisJdTgJYXNzb2NbV0xBTl9BVVRIX01BWF07CiB9IHByaXNtMnN0YV9hdXRobGlzdF90OwogCiB0eXBlZGVmIHN0cnVjdCBwcmlzbTJzdGFfYWNjZXNzbGlzdAogewotCVVJTlQJbW9kaWZ5OwotCVVJTlQJY250OwotCVVJTlQ4CWFkZHJbV0xBTl9BQ0NFU1NfTUFYXVtXTEFOX0FERFJfTEVOXTsKLQlVSU5UCWNudDE7Ci0JVUlOVDgJYWRkcjFbV0xBTl9BQ0NFU1NfTUFYXVtXTEFOX0FERFJfTEVOXTsKKwl1bnNpZ25lZCBpbnQJbW9kaWZ5OworCXVuc2lnbmVkIGludAljbnQ7CisJdTgJYWRkcltXTEFOX0FDQ0VTU19NQVhdW1dMQU5fQUREUl9MRU5dOworCXVuc2lnbmVkIGludAljbnQxOworCXU4CWFkZHIxW1dMQU5fQUNDRVNTX01BWF1bV0xBTl9BRERSX0xFTl07CiB9IHByaXNtMnN0YV9hY2Nlc3NsaXN0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHgKIHsKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JLyogUmVzb3VyY2UgY29uZmlnICovCi0JVUlOVDMyCQkJaW9iYXNlOwotCWNoYXIJCQlfX2lvbWVtICptZW1iYXNlOwotCVVJTlQzMgkJCWlycTsKLSNlbHNlCiAJLyogVVNCIHN1cHBvcnQgZGF0YSAqLwogCXN0cnVjdCB1c2JfZGV2aWNlCSp1c2I7CiAJc3RydWN0IHVyYgkJcnhfdXJiOwpAQCAtMjU2MCwxNiArMjUwNiw2IEBACiAKIAlpbnQgICAgICAgICAgICAgICAgICAgICBlbmRwX2luOwogCWludCAgICAgICAgICAgICAgICAgICAgIGVuZHBfb3V0OwotI2VuZGlmIC8qICFVU0IgKi8KLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0Jc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXY7Ci0jZWxzZQotCWRldl9saW5rX3QJKmxpbms7Ci0jZW5kaWYKLQlkZXZfbm9kZV90CW5vZGU7Ci0jZW5kaWYKIAogCWludCAgICAgICAgICAgICAgICAgICAgIHNuaWZmX2ZjczsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBzbmlmZl9jaGFubmVsOwpAQCAtMjU3OSwzNiArMjUxNSwxNCBAQAogCXdhaXRfcXVldWVfaGVhZF90IGNtZHE7CSAgICAgICAgLyogd2FpdCBxdWV1ZSBpdHNlbGYgKi8KIAogCS8qIENvbnRyb2xsZXIgc3RhdGUgKi8KLQlVSU5UMzIJCXN0YXRlOwotCVVJTlQzMgkJaXNhcDsKLQlVSU5UOAkJcG9ydF9lbmFibGVkW0hGQTM4NHhfTlVNUE9SVFNfTUFYXTsKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JVUlOVAkJYXV4ZW47Ci0JVUlOVCAgICAgICAgICAgIGlzcmFtMTY7Ci0jZW5kaWYgLyogIVVTQiAqLworCXUzMgkJc3RhdGU7CisJdTMyCQlpc2FwOworCXU4CQlwb3J0X2VuYWJsZWRbSEZBMzg0eF9OVU1QT1JUU19NQVhdOwogCiAJLyogRG93bmxvYWQgc3VwcG9ydCAqLwotCVVJTlQJCQkJZGxzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCQkJZGxzdGF0ZTsKIAloZmEzODR4X2Rvd25sb2FkYnVmZmVyX3QJYnVmaW5mbzsKLQlVSU5UMTYJCQkJZGx0aW1lb3V0OwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCXNwaW5sb2NrX3QJY21kbG9jazsKLQl2b2xhdGlsZSBpbnQgICAgY21kZmxhZzsgICAgICAgIC8qIHdhaXQgcXVldWUgZmxhZyAqLwotCWhmYTM4NHhfbWV0YWNtZF90ICpjbWRkYXRhOyAgICAgIC8qIGZvciBvdXIgYXN5bmMgY2FsbGJhY2sgKi8KLQotCS8qIEJBUCBzdXBwb3J0ICovCi0Jc3BpbmxvY2tfdAliYXBsb2NrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgIGJhcF90YXNrbGV0OwotCi0JLyogTUFDIGJ1ZmZlciBpZHMgKi8KLSAgICAgICAgVUlOVDE2ICAgICAgICAgIHR4ZmlkX2hlYWQ7Ci0gICAgICAgIFVJTlQxNiAgICAgICAgICB0eGZpZF90YWlsOwotICAgICAgICBVSU5UICAgICAgICAgICAgdHhmaWRfTjsKLSAgICAgICAgVUlOVDE2ICAgICAgICAgIHR4ZmlkX3F1ZXVlW0hGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVhdOwotCVVJTlQxNgkJCWluZm9maWQ7Ci0Jc3RydWN0IHNlbWFwaG9yZQlpbmZvZmlkX3NlbTsKLSNlbmRpZiAvKiAhVVNCICovCisJdTE2CQkJCWRsdGltZW91dDsKIAogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmZsYWc7ICAgIC8qIHRvIHNpZ25hbCBzY2FuIGNvbWxldGUgKi8KIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5fYXA7ICAgICAgICAvKiBhcmUgd2Ugam9pbmVkIHRvIGEgc3BlY2lmaWMgYXAgKi8KQEAgLTI2MjMsMzEgKzI1MzcsMzAgQEAKIAloZmEzODR4X2NvbW1zcXVhbGl0eV90ICBxdWFsOwogCXN0cnVjdCB0aW1lcl9saXN0CWNvbW1zcXVhbF90aW1lcjsKIAotCVVJTlQxNiBsaW5rX3N0YXR1czsKLQlVSU5UMTYgbGlua19zdGF0dXNfbmV3OworCXUxNiBsaW5rX3N0YXR1czsKKwl1MTYgbGlua19zdGF0dXNfbmV3OwogCXN0cnVjdCBza19idWZmX2hlYWQgICAgICAgIGF1dGhxOwogCiAJLyogQW5kIGhlcmUgd2UgaGF2ZSBzdHVmZiB0aGF0IHVzZWQgdG8gYmUgaW4gcHJpdiAqLwogCiAJLyogU3RhdGUgdmFyaWFibGVzICovCi0JVUlOVAkJcHJlc25pZmZfcG9ydF90eXBlOwotCVVJTlQxNgkJcHJlc25pZmZfd2VwZmxhZ3M7Ci0JVUlOVDMyCQlkb3QxMV9kZXNpcmVkX2Jzc190eXBlOwotCWludAkJYXA7CS8qIEFQIGZsYWc6IDAgLSBTdGF0aW9uLCAxIC0gQWNjZXNzIFBvaW50LiAqLworCXVuc2lnbmVkIGludAkJcHJlc25pZmZfcG9ydF90eXBlOworCXUxNgkJcHJlc25pZmZfd2VwZmxhZ3M7CisJdTMyCQlkb3QxMV9kZXNpcmVkX2Jzc190eXBlOwogCiAJaW50ICAgICAgICAgICAgIGRibWFkanVzdDsKIAogCS8qIEdyb3VwIEFkZHJlc3NlcyAtIHJpZ2h0IG5vdywgdGhlcmUgYXJlIHVwIHRvIGEgdG90YWwKIAlvZiBNQVhfR1JQX0FERFIgZ3JvdXAgYWRkcmVzc2VzICovCi0JVUlOVDgJCWRvdDExX2dycF9hZGRyW01BWF9HUlBfQUREUl1bV0xBTl9BRERSX0xFTl07Ci0JVUlOVAkJZG90MTFfZ3JwY250OworCXU4CQlkb3QxMV9ncnBfYWRkcltNQVhfR1JQX0FERFJdW1dMQU5fQUREUl9MRU5dOworCXVuc2lnbmVkIGludAkJZG90MTFfZ3JwY250OwogCiAJLyogQ29tcG9uZW50IElkZW50aXRpZXMgKi8KIAloZmEzODR4X2NvbXBpZGVudF90CWlkZW50X25pYzsKIAloZmEzODR4X2NvbXBpZGVudF90CWlkZW50X3ByaV9mdzsKIAloZmEzODR4X2NvbXBpZGVudF90CWlkZW50X3N0YV9mdzsKIAloZmEzODR4X2NvbXBpZGVudF90CWlkZW50X2FwX2Z3OwotCVVJTlQxNgkJCW1tX21vZHM7CisJdTE2CQkJbW1fbW9kczsKIAogCS8qIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2VzICovCiAJaGZhMzg0eF9jYXBsZXZlbF90CWNhcF9zdXBfbWZpOwpAQCAtMjY2MywxNCArMjU3NiwxNCBAQAogCWhmYTM4NHhfY2FwbGV2ZWxfdAljYXBfYWN0X2FwX2NmaTsgIC8qIGFwIGYvdyB0byBjb250cm9sbGVyIGludGVyZmFjZSAqLwogCWhmYTM4NHhfY2FwbGV2ZWxfdAljYXBfYWN0X2FwX21maTsgIC8qIGFwIGYvdyB0byBtb2RlbSBpbnRlcmZhY2UgKi8KIAotCVVJTlQzMgkJCXBzdXNlcmNvdW50OyAgLyogUG93ZXIgc2F2ZSB1c2VyIGNvdW50LiAqLworCXUzMgkJCXBzdXNlcmNvdW50OyAgLyogUG93ZXIgc2F2ZSB1c2VyIGNvdW50LiAqLwogCWhmYTM4NHhfQ29tbVRhbGxpZXMzMl90CXRhbGxpZXM7ICAgICAgLyogQ29tbXVuaWNhdGlvbiB0YWxsaWVzLiAqLwotCVVJTlQ4CQkJY29tbWVudFtXTEFOX0NPTU1FTlRfTUFYKzFdOyAvKiBVc2VyIGNvbW1lbnQgKi8KKwl1OAkJCWNvbW1lbnRbV0xBTl9DT01NRU5UX01BWCsxXTsgLyogVXNlciBjb21tZW50ICovCiAKIAkvKiBDaGFubmVsIEluZm8gcmVxdWVzdCByZXN1bHRzIChBUCBvbmx5KSAqLwogCXN0cnVjdCB7CiAJCWF0b21pY190CQlkb25lOwotCQlVSU5UOAkJCWNvdW50OworCQl1OAkJCWNvdW50OwogCQloZmEzODR4X0NoSW5mb1Jlc3VsdF90CXJlc3VsdHM7CiAJfSBjaGFubmVsX2luZm87CiAKQEAgLTI2NzgsNyArMjU5MSw3IEBACiAKIAogICAgICAgICBwcmlzbTJzdGFfYXV0aGxpc3RfdAlhdXRobGlzdDsgICAgIC8qIEF1dGhlbnRpY2F0ZWQgc3RhdGlvbiBsaXN0LiAqLwotCVVJTlQJCQlhY2Nlc3Ntb2RlOyAgIC8qIEFjY2VzcyBtb2RlLiAqLworCXVuc2lnbmVkIGludAkJCWFjY2Vzc21vZGU7ICAgLyogQWNjZXNzIG1vZGUuICovCiAgICAgICAgIHByaXNtMnN0YV9hY2Nlc3NsaXN0X3QJYWxsb3c7ICAgICAgICAvKiBBbGxvd2VkIHN0YXRpb24gbGlzdC4gKi8KICAgICAgICAgcHJpc20yc3RhX2FjY2Vzc2xpc3RfdAlkZW55OyAgICAgICAgIC8qIERlbmllZCBzdGF0aW9uIGxpc3QuICovCiAKQEAgLTI2ODcsMjQgKzI2MDAsMTMgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLSBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiB2b2lkCiBoZmEzODR4X2NyZWF0ZSgKIAloZmEzODR4X3QgKmh3LAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2IpOwotI2Vsc2UKLXZvaWQKLWhmYTM4NHhfY3JlYXRlKAotCWhmYTM4NHhfdCAqaHcsCi0JVUlOVCBpcnEsCi0JVUlOVDMyIGlvYmFzZSwKLQlVSU5UOCBfX2lvbWVtICptZW1iYXNlKTsKLSNlbmRpZgogCiB2b2lkIGhmYTM4NHhfZGVzdHJveShoZmEzODR4X3QgKmh3KTsKIAotaXJxcmV0dXJuX3QKLWhmYTM4NHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCBQVF9SRUdTKTsKIGludAogaGZhMzg0eF9jb3JlcmVzZXQoIGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKTsKIGludApAQCAtMjcxMiwxMTYgKzI2MTQsMTA1IEBACiBpbnQKIGhmYTM4NHhfZHJ2cl9jb21tdGFsbGllcyggaGZhMzg0eF90ICpodyk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KTsKK2hmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKIGludAotaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCk7CitoZmEzODR4X2RydnJfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKIGludAogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpOwogaW50CiBoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpOwogaW50Ci1oZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbik7CitoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZShoZmEzODR4X3QgKmh3LCB1MzIgZGFkZHIsIHZvaWQqIGJ1ZiwgdTMyIGxlbik7CiBpbnQKLWhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKTsKK2hmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKTsKIGludAotaGZhMzg0eF9kcnZyX2hhbmRvdmVyKCBoZmEzODR4X3QgKmh3LCBVSU5UOCAqYWRkcik7CitoZmEzODR4X2RydnJfaGFuZG92ZXIoIGhmYTM4NHhfdCAqaHcsIHU4ICphZGRyKTsKIGludAogaGZhMzg0eF9kcnZyX2hvc3RzY2FucmVzdWx0cyggaGZhMzg0eF90ICpodyk7CiBpbnQKIGhmYTM4NHhfZHJ2cl9sb3dfbGV2ZWwoaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9tbWlfcmVhZChoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkcmVzcywgVUlOVDMyICpyZXN1bHQpOworaGZhMzg0eF9kcnZyX21taV9yZWFkKGhmYTM4NHhfdCAqaHcsIHUzMiBhZGRyZXNzLCB1MzIgKnJlc3VsdCk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9tbWlfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGFkZHJlc3MsIFVJTlQzMiBkYXRhKTsKK2hmYTM4NHhfZHJ2cl9tbWlfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGFkZHJlc3MsIHUzMiBkYXRhKTsKIGludAotaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZXhlYWRkcik7CitoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUzMiBleGVhZGRyKTsKIGludAogaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoaGZhMzg0eF90ICpodyk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbik7CitoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkKiBidWYsIHUzMiBsZW4pOwogaW50Ci1oZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIFVJTlQgbGVuKTsKK2hmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CiBpbnQKIGhmYTM4NHhfZHJ2cl9zY2FucmVzdWx0cyggaGZhMzg0eF90ICpodyk7CiAKIGludAotaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pOworaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOwogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKnZhbCkKK2hmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICp2YWwpCiB7CiAJaW50CQlyZXN1bHQgPSAwOwotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIHJpZCwgdmFsLCBzaXplb2YoVUlOVDE2KSk7CisJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgcmlkLCB2YWwsIHNpemVvZih1MTYpKTsKIAlpZiAoIHJlc3VsdCA9PSAwICkgewotCQkqKChVSU5UMTYqKXZhbCkgPSBoZmEzODR4Mmhvc3RfMTYoKigoVUlOVDE2Kil2YWwpKTsKKwkJKigodTE2Kil2YWwpID0gaGZhMzg0eDJob3N0XzE2KCooKHUxNiopdmFsKSk7CiAJfQogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfZ2V0Y29uZmlnMzIoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqdmFsKQoraGZhMzg0eF9kcnZyX2dldGNvbmZpZzMyKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnZhbCkKIHsKIAlpbnQJCXJlc3VsdCA9IDA7CiAKLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCByaWQsIHZhbCwgc2l6ZW9mKFVJTlQzMikpOworCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIHJpZCwgdmFsLCBzaXplb2YodTMyKSk7CiAJaWYgKCByZXN1bHQgPT0gMCApIHsKLQkJKigoVUlOVDMyKil2YWwpID0gaGZhMzg0eDJob3N0XzMyKCooKFVJTlQzMiopdmFsKSk7CisJCSooKHUzMiopdmFsKSA9IGhmYTM4NHgyaG9zdF8zMigqKCh1MzIqKXZhbCkpOwogCX0KIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDE2IHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB1MTYgdmFsKQogewotCVVJTlQxNiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8xNih2YWwpOworCXUxNiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8xNih2YWwpOwogCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMzIoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDMyIHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWczMihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB1MzIgdmFsKQogewotCVVJTlQzMiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8zMih2YWwpOworCXUzMiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8zMih2YWwpOwogCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiB9CiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiBpbnQKIGhmYTM4NHhfZHJ2cl9nZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICAgICAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgICAgICAgIHJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAgICAgICAgcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICp1c2VyY2JfZGF0YSk7CiAKIGludAogaGZhMzg0eF9kcnZyX3NldGNvbmZpZ19hc3luYyhoZmEzODR4X3QgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiByaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmNiX2RhdGEpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbiwKLQkJCSAgICAgdm9pZCAqcHRyMSwgdm9pZCAqcHRyMikKLXsKLSAgICAgICAgICh2b2lkKXB0cjE7Ci0gICAgICAgICAodm9pZClwdHIyOwotICAgICAgICAgcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIHJpZCwgYnVmLCBsZW4pOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMTZfYXN5bmMoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDE2IHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWcxNl9hc3luYyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB1MTYgdmFsKQogewotCVVJTlQxNiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8xNih2YWwpOworCXUxNiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8xNih2YWwpOwogCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwKIAkJCQkJICAgIE5VTEwgLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWczMl9hc3luYyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCBVSU5UMzIgdmFsKQoraGZhMzg0eF9kcnZyX3NldGNvbmZpZzMyX2FzeW5jKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHUzMiB2YWwpCiB7Ci0JVUlOVDMyIHZhbHVlID0gaG9zdDJoZmEzODR4XzMyKHZhbCk7CisJdTMyIHZhbHVlID0gaG9zdDJoZmEzODR4XzMyKHZhbCk7CiAJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaHcsIHJpZCwgJnZhbHVlLCBzaXplb2YodmFsdWUpLAogCQkJCQkgICAgTlVMTCAsIE5VTEwpOwogfQpAQCAtMjgzOSwzMiArMjczMCwyOCBAQAogaW50CiBoZmEzODR4X2NtZF9pbml0aWFsaXplKGhmYTM4NHhfdCAqaHcpOwogaW50Ci1oZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpOworaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKIGludAotaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCk7CitoZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKIGludAogaGZhMzg0eF9jbWRfZGlhZ25vc2UoaGZhMzg0eF90ICpodyk7CiBpbnQKLWhmYTM4NHhfY21kX2FsbG9jYXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBsZW4pOworaGZhMzg0eF9jbWRfYWxsb2NhdGUoaGZhMzg0eF90ICpodywgdTE2IGxlbik7CiBpbnQKLWhmYTM4NHhfY21kX3RyYW5zbWl0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByZWNsYWltLCBVSU5UMTYgcW9zLCBVSU5UMTYgZmlkKTsKK2hmYTM4NHhfY21kX3RyYW5zbWl0KGhmYTM4NHhfdCAqaHcsIHUxNiByZWNsYWltLCB1MTYgcW9zLCB1MTYgZmlkKTsKIGludAotaGZhMzg0eF9jbWRfY2xlYXJwZXJzaXN0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpOworaGZhMzg0eF9jbWRfY2xlYXJwZXJzaXN0KGhmYTM4NHhfdCAqaHcsIHUxNiBmaWQpOwogaW50Ci1oZmEzODR4X2NtZF9ub3RpZnkoaGZhMzg0eF90ICpodywgVUlOVDE2IHJlY2xhaW0sIFVJTlQxNiBmaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbik7CitoZmEzODR4X2NtZF9hY2Nlc3MoaGZhMzg0eF90ICpodywgdTE2IHdyaXRlLCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOwogaW50Ci1oZmEzODR4X2NtZF9pbnF1aXJlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpOwotaW50Ci1oZmEzODR4X2NtZF9hY2Nlc3MoaGZhMzg0eF90ICpodywgVUlOVDE2IHdyaXRlLCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pOwotaW50Ci1oZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBlbmFibGUpOworaGZhMzg0eF9jbWRfbW9uaXRvcihoZmEzODR4X3QgKmh3LCB1MTYgZW5hYmxlKTsKIGludAogaGZhMzg0eF9jbWRfZG93bmxvYWQoCiAJaGZhMzg0eF90ICpodywKLQlVSU5UMTYgbW9kZSwKLQlVSU5UMTYgbG93YWRkciwKLQlVSU5UMTYgaGlnaGFkZHIsCi0JVUlOVDE2IGNvZGVsZW4pOworCXUxNiBtb2RlLAorCXUxNiBsb3dhZGRyLAorCXUxNiBoaWdoYWRkciwKKwl1MTYgY29kZWxlbik7CiBpbnQKIGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaGZhMzg0eF90ICpodywgaW50IGZvcmNlKTsKIGludApAQCAtMjg3MiwxOTYgKzI3NTksMzQgQEAKIGludAogaGZhMzg0eF9jb3B5X2Zyb21fYmFwKAogCWhmYTM4NHhfdCAqaHcsCi0JVUlOVDE2CWJhcCwKLQlVSU5UMTYJaWQsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJYmFwLAorCXUxNglpZCwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmJ1ZiwKLQlVSU5UCWxlbik7CisJdW5zaWduZWQgaW50CWxlbik7CiBpbnQKIGhmYTM4NHhfY29weV90b19iYXAoCiAJaGZhMzg0eF90ICpodywKLQlVSU5UMTYJYmFwLAotCVVJTlQxNglpZCwKLQlVSU5UMTYJb2Zmc2V0LAorCXUxNgliYXAsCisJdTE2CWlkLAorCXUxNglvZmZzZXQsCiAJdm9pZAkqYnVmLAotCVVJTlQJbGVuKTsKKwl1bnNpZ25lZCBpbnQJbGVuKTsKIHZvaWQKIGhmYTM4NHhfY29weV9mcm9tX2F1eCgKIAloZmEzODR4X3QgKmh3LAotCVVJTlQzMgljYXJkYWRkciwKLQlVSU5UMzIJYXV4Y3RsLAorCXUzMgljYXJkYWRkciwKKwl1MzIJYXV4Y3RsLAogCXZvaWQJKmJ1ZiwKLQlVSU5UCWxlbik7CisJdW5zaWduZWQgaW50CWxlbik7CiB2b2lkCiBoZmEzODR4X2NvcHlfdG9fYXV4KAogCWhmYTM4NHhfdCAqaHcsCi0JVUlOVDMyCWNhcmRhZGRyLAotCVVJTlQzMglhdXhjdGwsCisJdTMyCWNhcmRhZGRyLAorCXUzMglhdXhjdGwsCiAJdm9pZAkqYnVmLAotCVVJTlQJbGVuKTsKKwl1bnNpZ25lZCBpbnQJbGVuKTsKIAotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQotLyoKLSAgIEhGQTM4NHggaXMgYSBMSVRUTEUgRU5ESUFOIHBhcnQuCi0KLSAgIHRoZSBnZXQvc2V0cmVnIGZ1bmN0aW9ucyBpbXBsaWNpdGx5IGJ5dGUtc3dhcCB0aGUgZGF0YSB0byBMRS4KLSAgIHRoZSBfbm9zd2FwIHZhcmlhbnRzIGRvIG5vdCBwZXJmb3JtIGEgYnl0ZS1zd2FwIG9uIHRoZSBkYXRhLgotKi8KLQotc3RhdGljIGlubGluZSBVSU5UMTYKLV9faGZhMzg0eF9nZXRyZWcoaGZhMzg0eF90ICpodywgVUlOVCByZWcpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faGZhMzg0eF9zZXRyZWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHZhbCwgVUlOVCByZWcpOwotCi1zdGF0aWMgaW5saW5lIFVJTlQxNgotX19oZmEzODR4X2dldHJlZ19ub3N3YXAoaGZhMzg0eF90ICpodywgVUlOVCByZWcpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faGZhMzg0eF9zZXRyZWdfbm9zd2FwKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwsIFVJTlQgcmVnKTsKLQotI2lmZGVmIFJFVkVSU0VfRU5ESUFOCi0jZGVmaW5lIGhmYTM4NHhfZ2V0cmVnIF9faGZhMzg0eF9nZXRyZWdfbm9zd2FwCi0jZGVmaW5lIGhmYTM4NHhfc2V0cmVnIF9faGZhMzg0eF9zZXRyZWdfbm9zd2FwCi0jZGVmaW5lIGhmYTM4NHhfZ2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfZ2V0cmVnCi0jZGVmaW5lIGhmYTM4NHhfc2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfc2V0cmVnCi0jZWxzZQotI2RlZmluZSBoZmEzODR4X2dldHJlZyBfX2hmYTM4NHhfZ2V0cmVnCi0jZGVmaW5lIGhmYTM4NHhfc2V0cmVnIF9faGZhMzg0eF9zZXRyZWcKLSNkZWZpbmUgaGZhMzg0eF9nZXRyZWdfbm9zd2FwIF9faGZhMzg0eF9nZXRyZWdfbm9zd2FwCi0jZGVmaW5lIGhmYTM4NHhfc2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfc2V0cmVnX25vc3dhcAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2dldHJlZwotKgotKiBSZXRyaWV2ZSB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSBNQUMgcmVnaXN0ZXJzLiAgRG9uZSBoZXJlCi0qIGJlY2F1c2UgZGlmZmVyZW50IFBSSVNNMiBNQUMgcGFydHMgdXNlIGRpZmZlcmVudCBidXNlcyBhbmQgc3VjaC4KLSogTk9URTogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBpbiBIT1NUIE9SREVSISEhISEhCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICBNQUMgcGFydCBzdHJ1Y3R1cmUKLSogICAgICAgcmVnICAgICAgICBSZWdpc3RlciBpZGVudGlmaWVyIChvZmZzZXQgZm9yIEkvTyBiYXNlZCBpL2YpCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIFZhbHVlIGZyb20gdGhlIHJlZ2lzdGVyIGluIEhPU1QgT1JERVIhISEhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbmxpbmUgVUlOVDE2Ci1fX2hmYTM4NHhfZ2V0cmVnKGhmYTM4NHhfdCAqaHcsIFVJTlQgcmVnKQotewotLyoJcHJpbnRrKEtFUk5fREVCVUcgIlJlYWRpbmcgZnJvbSAweCUweFxuIiwgaHctPm1lbWJhc2UgKyByZWcpOyAqLwotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0JcmV0dXJuIHdsYW5faW53X2xlMTZfdG9fY3B1KGh3LT5pb2Jhc2UrcmVnKTsKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQlyZXR1cm4gX19sZTE2X3RvX2NwdShyZWFkdyhody0+bWVtYmFzZSArIHJlZykpOwotI2VuZGlmCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X3NldHJlZwotKgotKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUgTUFDIHJlZ2lzdGVycy4gIERvbmUgaGVyZQotKiBiZWNhdXNlIGRpZmZlcmVudCBQUklTTTIgTUFDIHBhcnRzIHVzZSBkaWZmZXJlbnQgYnVzZXMgYW5kIHN1Y2guCi0qIE5PVEU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgdmFsdWUgaXMgaW4gSE9TVCBPUkRFUiEhISEhIQotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3CU1BQyBwYXJ0IHN0cnVjdHVyZQotKgl2YWwJVmFsdWUsIGluIEhPU1QgT1JERVIhISwgdG8gcHV0IGluIHRoZSByZWdpc3RlcgotKiAgICAgICByZWcJUmVnaXN0ZXIgaWRlbnRpZmllciAob2Zmc2V0IGZvciBJL08gYmFzZWQgaS9mKQotKgotKiBSZXR1cm5zOgotKiAgICAgICBOb3RoaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19oZmEzODR4X3NldHJlZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsLCBVSU5UIHJlZykKLXsKLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpKQotCXdsYW5fb3V0d19jcHVfdG9fbGUxNiggdmFsLCBody0+aW9iYXNlICsgcmVnKTsKLQlyZXR1cm47Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0Jd3JpdGV3KF9fY3B1X3RvX2xlMTYodmFsKSwgaHctPm1lbWJhc2UgKyByZWcpOwotCXJldHVybjsKLSNlbmRpZgotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2dldHJlZ19ub3N3YXAKLSoKLSogUmV0cmlldmUgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUgTUFDIHJlZ2lzdGVycy4gIERvbmUgaGVyZQotKiBiZWNhdXNlIGRpZmZlcmVudCBQUklTTTIgTUFDIHBhcnRzIHVzZSBkaWZmZXJlbnQgYnVzZXMgYW5kIHN1Y2guCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICBNQUMgcGFydCBzdHJ1Y3R1cmUKLSogICAgICAgcmVnICAgICAgICBSZWdpc3RlciBpZGVudGlmaWVyIChvZmZzZXQgZm9yIEkvTyBiYXNlZCBpL2YpCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIFZhbHVlIGZyb20gdGhlIHJlZ2lzdGVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW5saW5lIFVJTlQxNgotX19oZmEzODR4X2dldHJlZ19ub3N3YXAoaGZhMzg0eF90ICpodywgVUlOVCByZWcpCi17Ci0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKLQlyZXR1cm4gd2xhbl9pbncoaHctPmlvYmFzZStyZWcpOwotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCXJldHVybiByZWFkdyhody0+bWVtYmFzZSArIHJlZyk7Ci0jZW5kaWYKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9zZXRyZWdfbm9zd2FwCi0qCi0qIFNldCB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSBNQUMgcmVnaXN0ZXJzLiAgRG9uZSBoZXJlCi0qIGJlY2F1c2UgZGlmZmVyZW50IFBSSVNNMiBNQUMgcGFydHMgdXNlIGRpZmZlcmVudCBidXNlcyBhbmQgc3VjaC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodwlNQUMgcGFydCBzdHJ1Y3R1cmUKLSoJdmFsCVZhbHVlIHRvIHB1dCBpbiB0aGUgcmVnaXN0ZXIKLSogICAgICAgcmVnCVJlZ2lzdGVyIGlkZW50aWZpZXIgKG9mZnNldCBmb3IgSS9PIGJhc2VkIGkvZikKLSoKLSogUmV0dXJuczoKLSogICAgICAgTm90aGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faGZhMzg0eF9zZXRyZWdfbm9zd2FwKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwsIFVJTlQgcmVnKQotewotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0Jd2xhbl9vdXR3KCB2YWwsIGh3LT5pb2Jhc2UgKyByZWcpOwotCXJldHVybjsKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQl3cml0ZXcodmFsLCBody0+bWVtYmFzZSArIHJlZyk7Ci0JcmV0dXJuOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfZXZlbnRzX2FsbChoZmEzODR4X3QgKmh3KQotewotCWhmYTM4NHhfc2V0cmVnKGh3LAotCQkgICAgICAgSEZBMzg0eF9JTlRfTk9STUFMCi0jaWZkZWYgQ01EX0lSUQotCQkgICAgICAgfCBIRkEzODR4X0lOVEVOX0NNRF9TRVQoMSkKLSNlbmRpZgotCQkgICAgICAgLAotCQkgICAgICAgSEZBMzg0eF9JTlRFTik7Ci0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfZXZlbnRzX25vYmFwKGhmYTM4NHhfdCAqaHcpCi17Ci0JaGZhMzg0eF9zZXRyZWcoaHcsCi0JCSAgICAgICAgKEhGQTM4NHhfSU5UX05PUk1BTCAmIH5IRkEzODR4X0lOVF9CQVBfT1ApCi0jaWZkZWYgQ01EX0lSUQotCQkgICAgICAgfCBIRkEzODR4X0lOVEVOX0NNRF9TRVQoMSkKLSNlbmRpZgotCQkgICAgICAgLAotCQkgICAgICAgSEZBMzg0eF9JTlRFTik7Ci0KLX0KLQotI2VuZGlmIC8qIFdMQU5fSE9TVElGICE9IFdMQU5fVVNCICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgIC8qIF9IRkEzODR4X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCmluZGV4IGRiMGM1MDIuLjhhNzViNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYwpAQCAtMTE0LDkgKzExNCw2IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KICNkZWZpbmUgV0xBTl9EQlZBUglwcmlzbTJfZGVidWcKIAotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMzYsNjMgKzEzMyw3IEBACiAKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotI2Vycm9yICJUaGlzIGZpbGUgaXMgc3BlY2lmaWMgdG8gVVNCIgotI2VuZGlmCi0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkKLXN0YXRpYyBpbnQKLXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZShzdHJ1Y3QgY29tcGxldGlvbiAqeCkKLXsKLSAgaW50IHJldCA9IDA7Ci0KLSAgbWlnaHRfc2xlZXAoKTsKLQotICBzcGluX2xvY2tfaXJxKCZ4LT53YWl0LmxvY2spOwotICBpZiAoIXgtPmRvbmUpIHsKLSAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQotICAgIHdhaXQuZmxhZ3MgfD0gV1FfRkxBR19FWENMVVNJVkU7Ci0gICAgX19hZGRfd2FpdF9xdWV1ZV90YWlsKCZ4LT53YWl0LCAmd2FpdCk7Ci0gICAgZG8gewotICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0gICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsKLSAgICAgICAgX19yZW1vdmVfd2FpdF9xdWV1ZSgmeC0+d2FpdCwgJndhaXQpOwotICAgICAgICBnb3RvIG91dDsKLSAgICAgIH0KLSAgICAgIF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLSAgICAgIHNwaW5fdW5sb2NrX2lycSgmeC0+d2FpdC5sb2NrKTsKLSAgICAgIHNjaGVkdWxlKCk7Ci0gICAgICBzcGluX2xvY2tfaXJxKCZ4LT53YWl0LmxvY2spOwotICAgIH0gd2hpbGUgKCF4LT5kb25lKTsKLSAgICBfX3JlbW92ZV93YWl0X3F1ZXVlKCZ4LT53YWl0LCAmd2FpdCk7Ci0gIH0KLSAgeC0+ZG9uZS0tOwotb3V0OgotICBzcGluX3VubG9ja19pcnEoJngtPndhaXQubG9jayk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY5KQotc3RhdGljIHZvaWQKLXVzYl9pbml0X3VyYihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JbWVtc2V0KHVyYiwgMCwgc2l6ZW9mKCp1cmIpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIC8qIHR1bmUgbWUhICovCi0JdXJiLT5jb3VudCA9IChhdG9taWNfdClBVE9NSUNfSU5JVCgxKTsKLSNlbmRpZgotCXNwaW5fbG9ja19pbml0KCZ1cmItPmxvY2spOwotfQotI2VuZGlmCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIC8qIHR1bmUgbWUhICovCi0jICBkZWZpbmUgU1VCTUlUX1VSQih1LGYpICB1c2Jfc3VibWl0X3VyYih1LGYpCi0jZWxzZQotIyAgZGVmaW5lIFNVQk1JVF9VUkIodSxmKSAgdXNiX3N1Ym1pdF91cmIodSkKLSNlbmRpZgorI2RlZmluZSBTVUJNSVRfVVJCKHUsZikgIHVzYl9zdWJtaXRfdXJiKHUsZikKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFByb2plY3QgSW5jbHVkZXMgKi8KQEAgLTI1NywyMSArMTk4LDEyIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIENhbGxiYWNrcyAqLwotI2lmZGVmIFVSQl9PTkxZX0NBTExCQUNLCiBzdGF0aWMgdm9pZAogaGZhMzg0eF91c2JvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkCiBoZmEzODR4X2N0bHhvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkCiBoZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7Ci0jZWxzZQotc3RhdGljIHZvaWQKLWhmYTM4NHhfdXNib3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotc3RhdGljIHZvaWQKLWhmYTM4NHhfY3RseG91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyB2b2lkCi1oZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotI2VuZGlmCiAKIHN0YXRpYyB2b2lkCiBoZmEzODR4X3VzYmluX3R4Y29tcGwod2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYmluX3QgKnVzYmluKTsKQEAgLTM1OCw5ICsyOTAsOSBAQAogaGZhMzg0eF9kb3JyaWQoCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglyaWQsCisJdTE2CXJpZCwKIAl2b2lkCSpyaWRkYXRhLAotCVVJTlQJcmlkZGF0YWxlbiwKKwl1bnNpZ25lZCBpbnQJcmlkZGF0YWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpOwpAQCAtMzY5LDkgKzMwMSw5IEBACiBoZmEzODR4X2Rvd3JpZCgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXJpZCwKKwl1MTYJcmlkLAogCXZvaWQJKnJpZGRhdGEsCi0JVUlOVAlyaWRkYXRhbGVuLAorCXVuc2lnbmVkIGludAlyaWRkYXRhbGVuLAogCWN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSk7CkBAIC0zODAsMTAgKzMxMiwxMCBAQAogaGZhMzg0eF9kb3JtZW0oCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglwYWdlLAotCVVJTlQxNglvZmZzZXQsCisJdTE2CXBhZ2UsCisJdTE2CW9mZnNldCwKIAl2b2lkCSpkYXRhLAotCVVJTlQJbGVuLAorCXVuc2lnbmVkIGludAlsZW4sCiAJY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKTsKQEAgLTM5MiwxNiArMzI0LDE2IEBACiBoZmEzODR4X2Rvd21lbSgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXBhZ2UsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJcGFnZSwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmRhdGEsCi0JVUlOVAlsZW4sCisJdW5zaWduZWQgaW50CWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X2lzZ29vZF9wZHJjb2RlKFVJTlQxNiBwZHJjb2RlKTsKK2hmYTM4NHhfaXNnb29kX3BkcmNvZGUodTE2IHBkcmNvZGUpOwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KQEAgLTQzNSwxNyArMzY3LDE3IEBACiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5waXBlPTB4JTA4eFxuIiwgdXJiLT5waXBlKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnN0YXR1cz0weCUwOHhcbiIsIHVyYi0+c3RhdHVzKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnRyYW5zZmVyX2ZsYWdzPTB4JTA4eFxuIiwgdXJiLT50cmFuc2Zlcl9mbGFncyk7Ci0JV0xBTl9MT0dfREVCVUcoMywidXJiLT50cmFuc2Zlcl9idWZmZXI9MHglMDh4XG4iLCAoVUlOVCl1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJV0xBTl9MT0dfREVCVUcoMywidXJiLT50cmFuc2Zlcl9idWZmZXI9MHglMDh4XG4iLCAodW5zaWduZWQgaW50KXVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg9MHglMDh4XG4iLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+YWN0dWFsX2xlbmd0aD0weCUwOHhcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5iYW5kd2lkdGg9MHglMDh4XG4iLCB1cmItPmJhbmR3aWR0aCk7Ci0JV0xBTl9MT0dfREVCVUcoMywidXJiLT5zZXR1cF9wYWNrZXQoY3RsKT0weCUwOHhcbiIsIChVSU5UKXVyYi0+c2V0dXBfcGFja2V0KTsKKwlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnNldHVwX3BhY2tldChjdGwpPTB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCl1cmItPnNldHVwX3BhY2tldCk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5zdGFydF9mcmFtZShpc28vaXJxKT0weCUwOHhcbiIsIHVyYi0+c3RhcnRfZnJhbWUpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+aW50ZXJ2YWwoaXJxKT0weCUwOHhcbiIsIHVyYi0+aW50ZXJ2YWwpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+ZXJyb3JfY291bnQoaXNvKT0weCUwOHhcbiIsIHVyYi0+ZXJyb3JfY291bnQpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+dGltZW91dD0weCUwOHhcbiIsIHVyYi0+dGltZW91dCk7Ci0JV0xBTl9MT0dfREVCVUcoMywidXJiLT5jb250ZXh0PTB4JTA4eFxuIiwgKFVJTlQpdXJiLT5jb250ZXh0KTsKLQlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmNvbXBsZXRlPTB4JTA4eFxuIiwgKFVJTlQpdXJiLT5jb21wbGV0ZSk7CisJV0xBTl9MT0dfREVCVUcoMywidXJiLT5jb250ZXh0PTB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCl1cmItPmNvbnRleHQpOworCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+Y29tcGxldGU9MHglMDh4XG4iLCAodW5zaWduZWQgaW50KXVyYi0+Y29tcGxldGUpOwogfQogI2VuZGlmCiAKQEAgLTY1Miw3ICs1ODQsNyBAQAogCiAJLyogUmVzdW1lIHRyYW5zbWl0dGluZy4gKi8KIAlpZiAoIHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX1RYX1JFU1VNRSwgJmh3LT51c2JfZmxhZ3MpICkgewotCQlwODAyMTFuZXRkZXZfd2FrZV9xdWV1ZShody0+d2xhbmRldik7CisJCW5ldGlmX3dha2VfcXVldWUoaHctPndsYW5kZXYtPm5ldGRldik7CiAJfQogCiAJREJGRVhJVDsKQEAgLTcxMSw4ICs2NDMsOCBAQAogCXRhc2tsZXRfaW5pdCgmaHctPmNvbXBsZXRpb25fYmgsCiAJICAgICAgICAgICAgIGhmYTM4NHhfdXNiY3RseF9jb21wbGV0aW9uX3Rhc2ssCiAJICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWh3KTsKLQlJTklUX1dPUksyKCZody0+bGlua19iaCwgcHJpc20yc3RhX3Byb2Nlc3NpbmdfZGVmZXIpOwotCUlOSVRfV09SSzIoJmh3LT51c2Jfd29yaywgaGZhMzg0eF91c2JfZGVmZXIpOworCUlOSVRfV09SSygmaHctPmxpbmtfYmgsIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKTsKKwlJTklUX1dPUksoJmh3LT51c2Jfd29yaywgaGZhMzg0eF91c2JfZGVmZXIpOwogCiAJaW5pdF90aW1lcigmaHctPnRocm90dGxlKTsKIAlody0+dGhyb3R0bGUuZnVuY3Rpb24gPSBoZmEzODR4X3VzYl90aHJvdHRsZWZuOwpAQCAtNzMzLDcgKzY2NSw3IEBACiAJaHctPmxpbmtfc3RhdHVzID0gSEZBMzg0eF9MSU5LX05PVENPTk5FQ1RFRDsKIAlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX0lOSVQ7CiAKLSAgICAgICAgSU5JVF9XT1JLMigmaHctPmNvbW1zcXVhbF9iaCwgcHJpc20yc3RhX2NvbW1zcXVhbF9kZWZlcik7CisgICAgICAgIElOSVRfV09SSygmaHctPmNvbW1zcXVhbF9iaCwgcHJpc20yc3RhX2NvbW1zcXVhbF9kZWZlcik7CiAJaW5pdF90aW1lcigmaHctPmNvbW1zcXVhbF90aW1lcik7CiAJaHctPmNvbW1zcXVhbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGh3OwogCWh3LT5jb21tc3F1YWxfdGltZXIuZnVuY3Rpb24gPSBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyOwpAQCAtODg4LDcgKzgyMCw3IEBACiAKIAljb25zdCBoZmEzODR4X3VzYl9ycmlkcmVzcF90CSpycmlkcmVzcDsKIAl2b2lkCQkJKnJpZGRhdGE7Ci0JVUlOVAkJCXJpZGRhdGFsZW47CisJdW5zaWduZWQgaW50CQkJcmlkZGF0YWxlbjsKIH07CiB0eXBlZGVmIHN0cnVjdCB1c2JjdGx4X3JyaWRfY29tcGxldG9yIHVzYmN0bHhfcnJpZF9jb21wbGV0b3JfdDsKIApAQCAtOTE5LDcgKzg1MSw3IEBACiBpbml0X3JyaWRfY29tcGxldG9yKHVzYmN0bHhfcnJpZF9jb21wbGV0b3JfdCAqY29tcGxldG9yLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoZmEzODR4X3VzYl9ycmlkcmVzcF90ICpycmlkcmVzcCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmlkZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgVUlOVCByaWRkYXRhbGVuKQorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbikKIHsKIAljb21wbGV0b3ItPmhlYWQuY29tcGxldGUgPSB1c2JjdGx4X3JyaWRfY29tcGxldG9yX2ZuOwogCWNvbXBsZXRvci0+cnJpZHJlc3AgPSBycmlkcmVzcDsKQEAgLTk1Miw3ICs4ODQsNyBAQAogCiAgICAgICAgIGNvbnN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwX3QgICpybWVtcmVzcDsKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGE7Ci0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBsZW47CiB9OwogdHlwZWRlZiBzdHJ1Y3QgdXNiY3RseF9ybWVtX2NvbXBsZXRvciB1c2JjdGx4X3JtZW1fY29tcGxldG9yX3Q7CiAKQEAgLTk2OSw3ICs5MDEsNyBAQAogaW5pdF9ybWVtX2NvbXBsZXRvcih1c2JjdGx4X3JtZW1fY29tcGxldG9yX3QgKmNvbXBsZXRvciwKICAgICAgICAgICAgICAgICAgICAgaGZhMzg0eF91c2Jfcm1lbXJlc3BfdCAqcm1lbXJlc3AsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFVJTlQgbGVuKQorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQogewogCWNvbXBsZXRvci0+aGVhZC5jb21wbGV0ZSA9IHVzYmN0bHhfcm1lbV9jb21wbGV0b3JfZm47CiAJY29tcGxldG9yLT5ybWVtcmVzcCA9IHJtZW1yZXNwOwpAQCAtMTA4MCw3ICsxMDEyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG9ycmlkX3dhaXQoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgVUlOVCByaWRkYXRhbGVuKQoraGZhMzg0eF9kb3JyaWRfd2FpdChoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLCB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3JyaWQoaHcsIERPV0FJVCwKIAkgICAgICAgICAgICAgICAgICAgICAgcmlkLCByaWRkYXRhLCByaWRkYXRhbGVuLApAQCAtMTA4OSw3ICsxMDIxLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIGhmYTM4NHhfZG9ycmlkX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0gICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcmlkLCB2b2lkICpyaWRkYXRhLCBVSU5UIHJpZGRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLCB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC0xMTAwLDcgKzEwMzIsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3dyaWRfd2FpdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpyaWRkYXRhLCBVSU5UIHJpZGRhdGFsZW4pCitoZmEzODR4X2Rvd3JpZF93YWl0KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd3JpZChodywgRE9XQUlULAogCSAgICAgICAgICAgICAgICAgICAgICByaWQsIHJpZGRhdGEsIHJpZGRhdGFsZW4sCkBAIC0xMTA5LDcgKzEwNDEsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3dyaWRfYXN5bmMoaGZhMzg0eF90ICpodywKLSAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiByaWQsIHZvaWQgKnJpZGRhdGEsIFVJTlQgcmlkZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogICAgICAgICAgICAgICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsCiAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTExMjEsNyArMTA1Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBoZmEzODR4X2Rvcm1lbV93YWl0KGhmYTM4NHhfdCAqaHcsCi0gICAgICAgICAgICAgICAgICAgIFVJTlQxNiBwYWdlLCBVSU5UMTYgb2Zmc2V0LCB2b2lkICpkYXRhLCBVSU5UIGxlbikKKyAgICAgICAgICAgICAgICAgICAgdTE2IHBhZ2UsIHUxNiBvZmZzZXQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG9ybWVtKGh3LCBET1dBSVQsCiAJICAgICAgICAgICAgICAgICAgICAgIHBhZ2UsIG9mZnNldCwgZGF0YSwgbGVuLApAQCAtMTEzMCw3ICsxMDYyLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIGhmYTM4NHhfZG9ybWVtX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0gICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcGFnZSwgVUlOVDE2IG9mZnNldCwgdm9pZCAqZGF0YSwgVUlOVCBsZW4sCisgICAgICAgICAgICAgICAgICAgICB1MTYgcGFnZSwgdTE2IG9mZnNldCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC0xMTQzLDEwICsxMDc1LDEwIEBACiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3dtZW1fd2FpdCgKICAgICAgICAgaGZhMzg0eF90ICpodywKLSAgICAgICAgVUlOVDE2ICBwYWdlLAotICAgICAgICBVSU5UMTYgIG9mZnNldCwKKyAgICAgICAgdTE2ICBwYWdlLAorICAgICAgICB1MTYgIG9mZnNldCwKICAgICAgICAgdm9pZCAgICAqZGF0YSwKLSAgICAgICAgVUlOVCAgICBsZW4pCisgICAgICAgIHVuc2lnbmVkIGludCAgICBsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG93bWVtKGh3LCBET1dBSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSwgb2Zmc2V0LCBkYXRhLCBsZW4sCkBAIC0xMTU2LDEwICsxMDg4LDEwIEBACiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3dtZW1fYXN5bmMoCiAgICAgICAgIGhmYTM4NHhfdCAqaHcsCi0gICAgICAgIFVJTlQxNiAgcGFnZSwKLSAgICAgICAgVUlOVDE2ICBvZmZzZXQsCisgICAgICAgIHUxNiAgcGFnZSwKKyAgICAgICAgdTE2ICBvZmZzZXQsCiAgICAgICAgIHZvaWQgICAgKmRhdGEsCi0gICAgICAgIFVJTlQgICAgbGVuLAorICAgICAgICB1bnNpZ25lZCBpbnQgICAgbGVuLAogICAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICB2b2lkICAgICp1c2VyY2JfZGF0YSkKQEAgLTEyNDYsNyArMTE3OCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQogewogCWludAlyZXN1bHQgPSAwOwogCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKQEAgLTEyODYsNyArMTIxOCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfY21kX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIAloZmEzODR4X21ldGFjbWRfdCBjbWQ7CkBAIC0xMzA1LDk1ICsxMjM3LDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9ub3RpZnkKLSoKLSogU2VuZHMgYW4gaW5mbyBmcmFtZSB0byB0aGUgZmlybXdhcmUgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yCi0qIG9mIHRoZSBmL3cgYXN5bmNoIHByb2Nlc3Nlcy4gIENhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBNQUMKLSogaXMgaW4gdGhlIGVuYWJsZWQgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJcmVjbGFpbQkJWzB8MV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIEZJRCB3aWxsCi0qCQkJYmUgaGFuZGVkIGJhY2sgKHZpYSBBbGxvYyBldmVudCkgZm9yIHJldXNlLgotKgkJCShob3N0IG9yZGVyKQotKglmaWQJCUZJRCBvZiBidWZmZXIgY29udGFpbmluZyB0aGUgZnJhbWUgdGhhdCB3YXMKLSoJCQlwcmV2aW91c2x5IGNvcGllZCB0byBNQUMgbWVtb3J5IHZpYSB0aGUgYmFwLgotKgkJCShob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJaHctPnJlc3AwIHdpbGwgY29udGFpbiB0aGUgRklEIGJlaW5nIHVzZWQgYnkgYXN5bmMgbm90aWZ5Ci0qCXByb2Nlc3MuICBJZiByZWNsYWltPT0wLCByZXNwMCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBmaWQKLSoJYXJndW1lbnQuICBJZiByZWNsYWltPT0xLCByZXNwMCB3aWxsIGJlIHRoZSBkaWZmZXJlbnQuCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfbm90aWZ5KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByZWNsYWltLCBVSU5UMTYgZmlkLAotCQkgICAgICAgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQotewotI2lmIDAKLQlpbnQJcmVzdWx0ID0gMDsKLQlVSU5UMTYJY21kOwotCURCRkVOVEVSOwotCWNtZCA9CUhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9OT1RJRlkpIHwKLQkJSEZBMzg0eF9DTURfUkVDTF9TRVQocmVjbGFpbSk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBjbWQpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotI2VuZGlmCi1yZXR1cm4gMDsKLX0KLQotCi0jaWYgMAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2lucXVpcnkKLSoKLSogUmVxdWVzdHMgYW4gaW5mbyBmcmFtZSBmcm9tIHRoZSBmaXJtd2FyZS4gIFRoZSBpbmZvIGZyYW1lIHdpbGwKLSogYmUgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgSW5mbyBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglmaWQJCUZJRCBvZiB0aGUgaW5mbyBmcmFtZSByZXF1ZXN0ZWQuIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9pbnF1aXJ5KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0lOUSk7Ci0JY21kLnBhcm0wID0gMDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmCi0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGhmYTM4NHhfY21kX21vbml0b3IKICoKQEAgLTE0MjMsNyArMTI2Niw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfbW9uaXRvcihoZmEzODR4X3QgKmh3LCBVSU5UMTYgZW5hYmxlKQoraW50IGhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgdTE2IGVuYWJsZSkKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIAloZmEzODR4X21ldGFjbWRfdCBjbWQ7CkBAIC0xNDgxLDggKzEzMjQsOCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtb2RlLCBVSU5UMTYgbG93YWRkciwKLQkJCQlVSU5UMTYgaGlnaGFkZHIsIFVJTlQxNiBjb2RlbGVuKQoraW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKGhmYTM4NHhfdCAqaHcsIHUxNiBtb2RlLCB1MTYgbG93YWRkciwKKwkJCQl1MTYgaGlnaGFkZHIsIHUxNiBjb2RlbGVuKQogewogCWludAlyZXN1bHQgPSAwOwogCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKQEAgLTE1MzIsNyArMTM3NSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHZvaWQKIGhmYTM4NHhfY29weV9mcm9tX2F1eCgKLQloZmEzODR4X3QgKmh3LCBVSU5UMzIgY2FyZGFkZHIsIFVJTlQzMiBhdXhjdGwsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCisJaGZhMzg0eF90ICpodywgdTMyIGNhcmRhZGRyLCB1MzIgYXV4Y3RsLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJREJGRU5URVI7CiAJV0xBTl9MT0dfRVJST1IoIm5vdCB1c2VkIGluIFVTQi5cbiIpOwpAQCAtMTU2Niw3ICsxNDA5LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZAogaGZhMzg0eF9jb3B5X3RvX2F1eCgKLQloZmEzODR4X3QgKmh3LCBVSU5UMzIgY2FyZGFkZHIsIFVJTlQzMiBhdXhjdGwsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCisJaGZhMzg0eF90ICpodywgdTMyIGNhcmRhZGRyLCB1MzIgYXV4Y3RsLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJREJGRU5URVI7CiAJV0xBTl9MT0dfRVJST1IoIm5vdCB1c2VkIGluIFVTQi5cbiIpOwpAQCAtMTU5OSw3OCArMTQ0MiwxMCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQgaGZhMzg0eF9jb3JlcmVzZXQoaGZhMzg0eF90ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpCiB7Ci0jaWYgMAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0Jc3RydWN0IHVzYl9kZXZpY2UJKnBhcmVudCA9IGh3LT51c2ItPnBhcmVudDsKLQlpbnQJCQlpOwotCWludAkJCXBvcnQgPSAtMTsKLSNlbmRpZgotI2VuZGlmCiAJaW50IAkJCXJlc3VsdCA9IDA7CiAKLQotI2RlZmluZSBQMl9VU0JfUlRfUE9SVAkJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX09USEVSKQotI2RlZmluZSBQMl9VU0JfRkVBVF9SRVNFVAk0Ci0jZGVmaW5lIFAyX1VTQl9GRUFUX0NfUkVTRVQJMjAKLQogCURCRkVOVEVSOwogCi0jaWYgMAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0JLyogRmluZCB0aGUgaHViIHBvcnQgKi8KLQlmb3IgKCBpID0gMDsgaSA8IHBhcmVudC0+bWF4Y2hpbGQ7IGkrKykgewotCQlpZiAocGFyZW50LT5jaGlsZHJlbltpXSA9PSBody0+dXNiKSB7Ci0JCQlwb3J0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChwb3J0IDwgMCkgcmV0dXJuIC1FTk9FTlQ7Ci0KLQkvKiBTZXQgYW5kIGNsZWFyIHRoZSByZXNldCAqLwotCXVzYl9jb250cm9sX21zZyhwYXJlbnQsIHVzYl9zbmRjdHJscGlwZShwYXJlbnQsIDApLAotCQlVU0JfUkVRX1NFVF9GRUFUVVJFLCBQMl9VU0JfUlRfUE9SVCwgUDJfVVNCX0ZFQVRfUkVTRVQsCi0JCXBvcnQrMSwgTlVMTCwgMCwgMSpIWik7Ci0Jd2FpdF9tcyhob2xkdGltZSk7Ci0JdXNiX2NvbnRyb2xfbXNnKHBhcmVudCwgdXNiX3NuZGN0cmxwaXBlKHBhcmVudCwgMCksCi0JCVVTQl9SRVFfQ0xFQVJfRkVBVFVSRSwgUDJfVVNCX1JUX1BPUlQsIFAyX1VTQl9GRUFUX0NfUkVTRVQsCi0JCXBvcnQrMSwgTlVMTCwgMCwgMSpIWik7Ci0Jd2FpdF9tcyhzZXR0bGV0aW1lKTsKLQotCS8qIFNldCB0aGUgZGV2aWNlIGFkZHJlc3MgKi8KLQlyZXN1bHQ9dXNiX3NldF9hZGRyZXNzKGh3LT51c2IpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJyZXNldF91c2JkZXY6IERldiBub3QgYWNjZXB0aW5nIGFkZHJlc3MsICIKLQkJCSJyZXN1bHQ9JWRcbiIsIHJlc3VsdCk7Ci0JCWNsZWFyX2JpdChody0+dXNiLT5kZXZudW0sICZody0+dXNiLT5idXMtPmRldm1hcC5kZXZpY2VtYXApOwotCQlody0+dXNiLT5kZXZudW0gPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQkvKiBMZXQgdGhlIGFkZHJlc3Mgc2V0dGxlICovCi0Jd2FpdF9tcygyMCk7Ci0KLQkvKiBBc3N1bWUgd2UncmUgcmV1c2luZyB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciBkYXRhICovCi0KLQkvKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24uICovCi0JV0xBTl9MT0dfREVCVUcoMywgIlNldHRpbmcgQ29uZmlndXJhdGlvbiAlZFxuIiwKLQkJaHctPnVzYi0+Y29uZmlnWzBdLmJDb25maWd1cmF0aW9uVmFsdWUpOwotCXJlc3VsdD11c2Jfc2V0X2NvbmZpZ3VyYXRpb24oaHctPnVzYiwgaHctPnVzYi0+Y29uZmlnWzBdLmJDb25maWd1cmF0aW9uVmFsdWUpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigidXNiX3NldF9jb25maWd1cmF0aW9uKCkgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLAotCQkJCXJlc3VsdCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JLyogTGV0IHRoZSBjb25maWd1cmF0aW9uIHNldHRsZSAqLwotCXdhaXRfbXMoMjApOwotCi0gZG9uZToKLSNlbHNlCi0JcmVzdWx0PXVzYl9yZXNldF9kZXZpY2UoaHctPnVzYik7Ci0JaWYocmVzdWx0PDApIHsKLQkJV0xBTl9MT0dfRVJST1IoInVzYl9yZXNldF9kZXZpY2UoKSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIscmVzdWx0KTsKLQl9Ci0jZW5kaWYKLSNlbmRpZgotCiAJcmVzdWx0PXVzYl9yZXNldF9kZXZpY2UoaHctPnVzYik7CiAJaWYocmVzdWx0PDApIHsKIAkJV0xBTl9MT0dfRVJST1IoInVzYl9yZXNldF9kZXZpY2UoKSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIscmVzdWx0KTsKQEAgLTE5MjUsOSArMTcwMCw5IEBACiBoZmEzODR4X2RvcnJpZCgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXJpZCwKKwl1MTYJcmlkLAogCXZvaWQJKnJpZGRhdGEsCi0JVUlOVAlyaWRkYXRhbGVuLAorCXVuc2lnbmVkIGludAlyaWRkYXRhbGVuLAogICAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpCkBAIC0yMDExLDkgKzE3ODYsOSBAQAogaGZhMzg0eF9kb3dyaWQoCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglyaWQsCisJdTE2CXJpZCwKIAl2b2lkCSpyaWRkYXRhLAotCVVJTlQJcmlkZGF0YWxlbiwKKwl1bnNpZ25lZCBpbnQJcmlkZGF0YWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpCkBAIC0yMTA0LDEwICsxODc5LDEwIEBACiBoZmEzODR4X2Rvcm1lbSgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXBhZ2UsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJcGFnZSwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmRhdGEsCi0JVUlOVAlsZW4sCisJdW5zaWduZWQgaW50CWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpCkBAIC0yMjA1LDEwICsxOTgwLDEwIEBACiBoZmEzODR4X2Rvd21lbSgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXBhZ2UsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJcGFnZSwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmRhdGEsCi0JVUlOVAlsZW4sCisJdW5zaWduZWQgaW50CWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpCkBAIC0yMzI1LDcgKzIxMDAsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQogewogCWludAlyZXN1bHQgPSAwOwogCkBAIC0yMzY3LDcgKzIxNDIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIApAQCAtMjUyMCwyMiArMjI5NSwyMiBAQAogaW50CiBoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZSgKIAloZmEzODR4X3QJKmh3LAotCVVJTlQzMgkJZGFkZHIsCisJdTMyCQlkYWRkciwKIAl2b2lkCQkqYnVmLAotCVVJTlQzMgkJbGVuKQorCXUzMgkJbGVuKQogewogCWludAkJcmVzdWx0ID0gMDsKLQlVSU5UMzIJCWRsYnVmYWRkcjsKKwl1MzIJCWRsYnVmYWRkcjsKIAlpbnQJCW5idXJuczsKLQlVSU5UMzIJCWJ1cm5sZW47Ci0JVUlOVDMyCQlidXJuZGFkZHI7Ci0JVUlOVDE2CQlidXJubG87Ci0JVUlOVDE2CQlidXJuaGk7CisJdTMyCQlidXJubGVuOworCXUzMgkJYnVybmRhZGRyOworCXUxNgkJYnVybmxvOworCXUxNgkJYnVybmhpOwogCWludAkJbndyaXRlczsKLQlVSU5UOAkJKndyaXRlYnVmOwotCVVJTlQxNgkJd3JpdGVwYWdlOwotCVVJTlQxNgkJd3JpdGVvZmZzZXQ7Ci0JVUlOVDMyCQl3cml0ZWxlbjsKKwl1OAkJKndyaXRlYnVmOworCXUxNgkJd3JpdGVwYWdlOworCXUxNgkJd3JpdGVvZmZzZXQ7CisJdTMyCQl3cml0ZWxlbjsKIAlpbnQJCWk7CiAJaW50CQlqOwogCkBAIC0yNjg2LDcgKzI0NjEsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQogewogCWludCAJCQlyZXN1bHQ7CiAJREJGRU5URVI7CkBAIC0yNzI3LDcgKzI1MDIsNyBAQAogaW50CiBoZmEzODR4X2RydnJfZ2V0Y29uZmlnX2FzeW5jKAogICAgICAgICAgaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3LAotICAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgcmlkLAorICAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgcmlkLAogICAgICAgICAgY3RseF91c2VyY2JfdCAgICAgICAgICAgdXNlcmNiLAogICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnVzZXJjYl9kYXRhKQogewpAQCAtMjc2MSw5ICsyNTM2LDkgQEAKIGludAogaGZhMzg0eF9kcnZyX3NldGNvbmZpZ19hc3luYygKICAgICAgICAgIGhmYTM4NHhfdCAgICAgICAqaHcsCi0gICAgICAgICBVSU5UMTYgICAgICAgICAgcmlkLAorICAgICAgICAgdTE2ICAgICAgICAgIHJpZCwKICAgICAgICAgIHZvaWQgICAgICAgICAgICAqYnVmLAotICAgICAgICAgVUlOVDE2ICAgICAgICAgIGxlbiwKKyAgICAgICAgIHUxNiAgICAgICAgICBsZW4sCiAgICAgICAgICBjdGx4X3VzZXJjYl90ICAgdXNlcmNiLAogICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyY2JfZGF0YSkKIHsKQEAgLTI3OTAsNyArMjU2NSw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2hhbmRvdmVyKCBoZmEzODR4X3QgKmh3LCBVSU5UOCAqYWRkcikKK2ludCBoZmEzODR4X2RydnJfaGFuZG92ZXIoIGhmYTM4NHhfdCAqaHcsIHU4ICphZGRyKQogewogICAgICAgICBEQkZFTlRFUjsKIAlXTEFOX0xPR19FUlJPUigiTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gVVNCIVxuIik7CkBAIC0yODI0LDg4ICsyNTk5LDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9tbWlfcmVhZAotKgotKiBSZWFkIG1taSByZWdpc3RlcnMuICBtbWkgaXMgaW50ZXJzaWwtc3BlYWsgZm9yIHRoZSBiYXNlYmFuZAotKiBwcm9jZXNzb3IgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3ICAgICAgICAgICAgICBkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIHJlZ2lzdGVyICAgICAgICBUaGUgdGVzdCByZWdpc3RlciB0byBiZSBhY2Nlc3NlZCAobXVzdCBiZSBldmVuICMpLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgICAgICAgICAgICAgc3VjY2VzcwotKiAgICAgICA+MCAgICAgICAgICAgICAgZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qICAgICAgIDwwICAgICAgICAgICAgICBkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qICAgICAgIHByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9tbWlfcmVhZChoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkciwgVUlOVDMyICpyZXNwKQotewotI2lmIDAKLSAgICAgICAgaW50ICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIFVJTlQxNiAgY21kX2NvZGUgPSAoVUlOVDE2KSAweDMwOwotICAgICAgICBVSU5UMTYgcGFyYW0gPSAoVUlOVDE2KSBhZGRyOwotICAgICAgICBEQkZFTlRFUjsKLQotICAgICAgICAvKiBEbyBpIG5lZWQgYSBob3N0MmhmYS4uLiBjb252ZXJzaW9uID8gKi8KLSAgICAgICAgcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBjbWRfY29kZSk7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZgotcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfbW1pX3dyaXRlCi0qCi0qIFJlYWQgbW1pIHJlZ2lzdGVycy4gIG1taSBpcyBpbnRlcnNpbC1zcGVhayBmb3IgdGhlIGJhc2ViYW5kCi0qIHByb2Nlc3NvciByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICAgICAgIGRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgYWRkciAgICAgICAgICAgIFRoZSB0ZXN0IHJlZ2lzdGVyIHRvIGJlIGFjY2Vzc2VkIChtdXN0IGJlIGV2ZW4gIykuCi0qICAgICAgIGRhdGEgICAgICAgICAgICBUaGUgZGF0YSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAgICAgICAgICAgICBzdWNjZXNzCi0qICAgICAgID4wICAgICAgICAgICAgICBmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSogICAgICAgPDAgICAgICAgICAgICAgIGRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSogICAgICAgcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludAotaGZhMzg0eF9kcnZyX21taV93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkciwgVUlOVDMyIGRhdGEpCi17Ci0jaWYgMAotICAgICAgICBpbnQgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgVUlOVDE2ICBjbWRfY29kZSA9IChVSU5UMTYpIDB4MzE7Ci0gICAgICAgIFVJTlQxNiBwYXJhbTAgPSAoVUlOVDE2KSBhZGRyOwotICAgICAgICBVSU5UMTYgcGFyYW0xID0gKFVJTlQxNikgZGF0YTsKLSAgICAgICAgREJGRU5URVI7Ci0KLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwibW1pIHdyaXRlIDogYWRkciA9IDB4JTA4bHhcbiIsIGFkZHIpOwotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCJtbWkgd3JpdGUgOiBkYXRhID0gMHglMDhseFxuIiwgZGF0YSk7Ci0KLSAgICAgICAgLyogRG8gaSBuZWVkIGEgaG9zdDJoZmEuLi4gY29udmVyc2lvbiA/ICovCi0gICAgICAgIHJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgY21kX2NvZGUpOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0jZW5kaWYKLXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZQogKgogKiBFbmRzIHRoZSByYW0gZG93bmxvYWQgc3RhdGUuCkBAIC0yOTY5LDExICsyNjYyLDExIEBACiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50Ci1oZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBleGVhZGRyKQoraGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MzIgZXhlYWRkcikKIHsKIAlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDE2CQlsb3dhZGRyOwotCVVJTlQxNgkJaGlhZGRyOworCXUxNgkJbG93YWRkcjsKKwl1MTYJCWhpYWRkcjsKIAlpbnQJCWk7CiAJREJGRU5URVI7CiAJLyogQ2hlY2sgdGhhdCBhIHBvcnQgaXNuJ3QgYWN0aXZlICovCkBAIC0zMDQ0LDE2ICsyNzM3LDE2IEBACiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50Ci1oZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGRhZGRyLCB2b2lkKiBidWYsIFVJTlQzMiBsZW4pCitoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkKiBidWYsIHUzMiBsZW4pCiB7CiAJaW50CQlyZXN1bHQgPSAwOwogCWludAkJbndyaXRlczsKLQlVSU5UOAkJKmRhdGEgPSBidWY7CisJdTgJCSpkYXRhID0gYnVmOwogCWludAkJaTsKLQlVSU5UMzIJCWN1cnJhZGRyOwotCVVJTlQxNgkJY3VycnBhZ2U7Ci0JVUlOVDE2CQljdXJyb2Zmc2V0OwotCVVJTlQxNgkJY3VycmxlbjsKKwl1MzIJCWN1cnJhZGRyOworCXUxNgkJY3VycnBhZ2U7CisJdTE2CQljdXJyb2Zmc2V0OworCXUxNgkJY3VycmxlbjsKIAlEQkZFTlRFUjsKIAkvKiBDaGVjayB0aGF0IHdlJ3JlIGluIHRoZSByYW0gZG93bmxvYWQgc3RhdGUgKi8KIAlpZiAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9SQU1FTkFCTEVEICkgewpAQCAtMzEyNSwyMSArMjgxOCwyMSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3Mgb3Igbm9uLWNhcmQgaW50ZXJydXB0LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JlYWRwZGEoaGZhMzg0eF90ICpodywgdm9pZCAqYnVmLCBVSU5UIGxlbikKK2ludCBoZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaW50CQlyZXN1bHQgPSAwOwotCVVJTlQxNgkJKnBkYSA9IGJ1ZjsKKwl1MTYJCSpwZGEgPSBidWY7CiAJaW50CQlwZGFvayA9IDA7CiAJaW50CQltb3JlcGRycyA9IDE7CiAJaW50CQljdXJycGRyID0gMDsJLyogd29yZCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgcGRyICovCiAJc2l6ZV90CQlpOwotCVVJTlQxNgkJcGRybGVuOwkJLyogcGRyIGxlbmd0aCBpbiBieXRlcywgaG9zdCBvcmRlciAqLwotCVVJTlQxNgkJcGRyY29kZTsJLyogcGRyIGNvZGUsIGhvc3Qgb3JkZXIgKi8KLQlVSU5UMTYJCWN1cnJwYWdlOwotCVVJTlQxNgkJY3Vycm9mZnNldDsKKwl1MTYJCXBkcmxlbjsJCS8qIHBkciBsZW5ndGggaW4gYnl0ZXMsIGhvc3Qgb3JkZXIgKi8KKwl1MTYJCXBkcmNvZGU7CS8qIHBkciBjb2RlLCBob3N0IG9yZGVyICovCisJdTE2CQljdXJycGFnZTsKKwl1MTYJCWN1cnJvZmZzZXQ7CiAJc3RydWN0IHBkYWxvYyB7Ci0JCVVJTlQzMgljYXJkYWRkcjsKLQkJVUlOVDE2CWF1eGN0bDsKKwkJdTMyCWNhcmRhZGRyOworCQl1MTYJYXV4Y3RsOwogCX0gcGRhbG9jW10gPQogCXsKIAkJeyBIRkEzODQyX1BEQV9CQVNFLAkJMH0sCkBAIC0zMjQzLDcgKzI5MzYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd3JpZF93YWl0KGh3LCByaWQsIGJ1ZiwgbGVuKTsKIH0KQEAgLTMyNjcsMTkgKzI5NjAsMzggQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogaW50IGhmYTM4NHhfZHJ2cl9zdGFydChoZmEzODR4X3QgKmh3KQogewotCWludAkJcmVzdWx0OworCWludAkJcmVzdWx0LCByZXN1bHQxLCByZXN1bHQyOworCXUxNgkJc3RhdHVzOwogCURCRkVOVEVSOwogCiAJbWlnaHRfc2xlZXAoKTsKIAotCWlmICh1c2JfY2xlYXJfaGFsdChody0+dXNiLCBody0+ZW5kcF9pbikpIHsKKwkvKiBDbGVhciBlbmRwb2ludCBzdGFsbHMgLSBidXQgb25seSBkbyB0aGlzIGlmIHRoZSBlbmRwb2ludAorCSAqIGlzIHNob3dpbmcgYSBzdGFsbCBzdGF0dXMuIFNvbWUgcHJpc20yIGNhcmRzIHNlZW0gdG8gYmVoYXZlCisJICogYmFkbHkgaWYgYSBjbGVhcl9oYWx0IGlzIGNhbGxlZCB3aGVuIHRoZSBlbmRwb2ludCBpcyBhbHJlYWR5CisJICogb2sKKwkgKi8KKwlyZXN1bHQgPSB1c2JfZ2V0X3N0YXR1cyhody0+dXNiLCBVU0JfUkVDSVBfRU5EUE9JTlQsIGh3LT5lbmRwX2luLCAmc3RhdHVzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlXTEFOX0xPR19FUlJPUigKKwkJCSJDYW5ub3QgZ2V0IGJ1bGsgaW4gZW5kcG9pbnQgc3RhdHVzLlxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKChzdGF0dXMgPT0gMSkgJiYgdXNiX2NsZWFyX2hhbHQoaHctPnVzYiwgaHctPmVuZHBfaW4pKSB7CiAJCVdMQU5fTE9HX0VSUk9SKAogCQkJIkZhaWxlZCB0byByZXNldCBidWxrIGluIGVuZHBvaW50LlxuIik7CiAJfQogCi0JaWYgKHVzYl9jbGVhcl9oYWx0KGh3LT51c2IsIGh3LT5lbmRwX291dCkpIHsKKwlyZXN1bHQgPSB1c2JfZ2V0X3N0YXR1cyhody0+dXNiLCBVU0JfUkVDSVBfRU5EUE9JTlQsIGh3LT5lbmRwX291dCwgJnN0YXR1cyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJV0xBTl9MT0dfRVJST1IoCisJCQkiQ2Fubm90IGdldCBidWxrIG91dCBlbmRwb2ludCBzdGF0dXMuXG4iKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoKHN0YXR1cyA9PSAxKSAmJiB1c2JfY2xlYXJfaGFsdChody0+dXNiLCBody0+ZW5kcF9vdXQpKSB7CiAJCVdMQU5fTE9HX0VSUk9SKAogCQkJIkZhaWxlZCB0byByZXNldCBidWxrIG91dCBlbmRwb2ludC5cbiIpOwogCX0KQEAgLTMyOTYsMTQgKzMwMDgsMzcgQEAKIAkJZ290byBkb25lOwogCX0KIAotCS8qIGNhbGwgaW5pdGlhbGl6ZSAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQl1c2Jfa2lsbF91cmIoJmh3LT5yeF91cmIpOwotCQlXTEFOX0xPR19FUlJPUigKLQkJCSJjbWRfaW5pdGlhbGl6ZSgpIGZhaWxlZCwgcmVzdWx0PSVkXG4iLAotCQkJcmVzdWx0KTsKLQkJZ290byBkb25lOworCS8qIENhbGwgaW5pdGlhbGl6ZSB0d2ljZSwgd2l0aCBhIDEgc2Vjb25kIHNsZWVwIGluIGJldHdlZW4uCisJICogVGhpcyBpcyBhIG5hc3R5IHdvcmstYXJvdW5kIHNpbmNlIG1hbnkgcHJpc20yIGNhcmRzIHNlZW0gdG8KKwkgKiBuZWVkIHRpbWUgdG8gc2V0dGxlIGFmdGVyIGFuIGluaXQgZnJvbSBjb2xkLiBUaGUgc2Vjb25kCisJICogY2FsbCB0byBpbml0aWFsaXplIGluIHRoZW9yeSBpcyBub3QgbmVjZXNzYXJ5IC0gYnV0IHdlIGNhbGwKKwkgKiBpdCBhbnl3YXkgYXMgYSBkb3VibGUgaW5zdXJhbmNlIHBvbGljeToKKwkgKiAxKSBJZiB0aGUgZmlyc3QgaW5pdCBzaG91bGQgZmFpbCwgdGhlIHNlY29uZCBtYXkgd2VsbCBzdWNjZWVkCisJICogICAgYW5kIHRoZSBjYXJkIGNhbiBzdGlsbCBiZSB1c2VkCisJICogMikgSXQgaGVscHMgZW5zdXJlcyBhbGwgaXMgd2VsbCB3aXRoIHRoZSBjYXJkIGFmdGVyIHRoZSBmaXJzdAorCSAqICAgIGluaXQgYW5kIHNldHRsZSB0aW1lLgorCSAqLworCXJlc3VsdDEgPSBoZmEzODR4X2NtZF9pbml0aWFsaXplKGh3KTsKKwltc2xlZXAoMTAwMCk7CisJcmVzdWx0ID0gcmVzdWx0MiA9IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOworCWlmIChyZXN1bHQxICE9IDApIHsKKwkJaWYgKHJlc3VsdDIgIT0gMCkgeworCQkJV0xBTl9MT0dfRVJST1IoCisJCQkJImNtZF9pbml0aWFsaXplKCkgZmFpbGVkIG9uIHR3byBhdHRlbXB0cywgcmVzdWx0cyAlZCBhbmQgJWRcbiIsCisJCQkJcmVzdWx0MSwgcmVzdWx0Mik7CisJCQl1c2Jfa2lsbF91cmIoJmh3LT5yeF91cmIpOworCQkJZ290byBkb25lOworCQl9IGVsc2UgeworCQkJV0xBTl9MT0dfREVCVUcoMCwgIkZpcnN0IGNtZF9pbml0aWFsaXplKCkgZmFpbGVkIChyZXN1bHQgJWQpLFxuIiwKKwkJCQlyZXN1bHQxKTsKKwkJCVdMQU5fTE9HX0RFQlVHKDAsICJidXQgc2Vjb25kIGF0dGVtcHQgc3VjY2VlZGVkLiBBbGwgc2hvdWxkIGJlIG9rXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAocmVzdWx0MiAhPSAwKSB7CisJCVdMQU5fTE9HX1dBUk5JTkcoCisJCQkiRmlyc3QgY21kX2luaXRpYWxpemUoKSBzdWNjZWVkZWQsIGJ1dCBzZWNvbmQgYXR0ZW1wdCBmYWlsZWQgKHJlc3VsdD0lZClcbiIsCisJCQlyZXN1bHQyKTsKKwkJV0xBTl9MT0dfV0FSTklORygiTW9zdCBsaWtlbHkgdGhlIGNhcmQgd2lsbCBiZSBmdW5jdGlvbmFsXG4iKTsKKwkJCWdvdG8gZG9uZTsKIAl9CiAKIAlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX1JVTk5JTkc7CkBAIC0zODQ5LDExICszNTg0LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFVSQl9PTkxZX0NBTExCQUNLCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLSNlbHNlCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi0jZW5kaWYKIHsKIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gdXJiLT5jb250ZXh0OwogCWhmYTM4NHhfdAkJKmh3OwpAQCAtMzg2MSw3ICszNTkyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiID0gTlVMTDsKIAlpbnQJCQlyZXN1bHQ7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgdXJiX3N0YXR1czsKLQlVSU5UMTYJCQl0eXBlOworCXUxNgkJCXR5cGU7CiAKIAllbnVtIFVTQklOX0FDVElPTiB7CiAJCUhBTkRMRSwKQEAgLTM4NzMsNyArMzYwNCw3IEBACiAKIAlpZiAoICF3bGFuZGV2IHx8CiAJICAgICAhd2xhbmRldi0+bmV0ZGV2IHx8Ci0JICAgICAhbmV0aWZfZGV2aWNlX3ByZXNlbnQod2xhbmRldi0+bmV0ZGV2KSApCisJICAgICB3bGFuZGV2LT5od3JlbW92ZWQgKQogCQlnb3RvIGV4aXQ7CiAKIAlodyA9IHdsYW5kZXYtPnByaXY7CkBAIC00MDg4LDcgKzM4MTksNyBAQAogCQlpZiAodW5sb2NrZWRfdXNiY3RseF9jYW5jZWxfYXN5bmMoaHcsIGN0bHgpID09IDApCiAJCQlydW5fcXVldWUgPSAxOwogCX0gZWxzZSB7Ci0JCWNvbnN0IFVJTlQxNiBpbnR5cGUgPSAodXNiaW4tPnR5cGUmfmhvc3QyaGZhMzg0eF8xNigweDgwMDApKTsKKwkJY29uc3QgdTE2IGludHlwZSA9ICh1c2Jpbi0+dHlwZSZ+aG9zdDJoZmEzODR4XzE2KDB4ODAwMCkpOwogCiAJCS8qCiAJCSAqIENoZWNrIHRoYXQgb3VyIG1lc3NhZ2UgaXMgd2hhdCB3ZSdyZSBleHBlY3RpbmcgLi4uCkBAIC00MTY4LDcgKzM4OTksNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX3R4Y29tcGwod2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYmluX3QgKnVzYmluKQogewotCVVJTlQxNgkJCXN0YXR1czsKKwl1MTYJCQlzdGF0dXM7CiAJREJGRU5URVI7CiAKIAlzdGF0dXMgPSBoZmEzODR4Mmhvc3RfMTYodXNiaW4tPnR5cGUpOyAvKiB5ZWFoIEkga25vdyBpdCBzYXlzIHR5cGUuLi4qLwpAQCAtNDIwOCw4ICszOTM5LDggQEAKIAloZmEzODR4X3QgICAgICAgICAgICAgICAqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludCAgICAgICAgICAgICAgICAgICAgIGhkcmxlbjsKIAlwODAyMTFfcnhtZXRhX3QgICAgICAgICAqcnhtZXRhOwotCVVJTlQxNiAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOwotCVVJTlQxNiAgICAgICAgICAgICAgICAgIGZjOworCXUxNiAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOworCXUxNiAgICAgICAgICAgICAgICAgIGZjOwogCiAJREJGRU5URVI7CiAKQEAgLTQzMTUsMTIgKzQwNDYsMTEgQEAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4bW9uaXRvciggd2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYl9yeGZybV90ICpyeGZybSkKIHsKIAloZmEzODR4X3J4X2ZyYW1lX3QgICAgICAgICAgICAgICpyeGRlc2MgPSAmKHJ4ZnJtLT5kZXNjKTsKLQlVSU5UCQkJCWhkcmxlbiA9IDA7Ci0JVUlOVAkJCQlkYXRhbGVuID0gMDsKLQlVSU5UCQkJCXNrYmxlbiA9IDA7Ci0JcDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90CSptc2c7Ci0JVUlOVDgJCQkJKmRhdGFwOwotCVVJTlQxNgkJCQlmYzsKKwl1bnNpZ25lZCBpbnQJCQkJaGRybGVuID0gMDsKKwl1bnNpZ25lZCBpbnQJCQkJZGF0YWxlbiA9IDA7CisJdW5zaWduZWQgaW50CQkJCXNrYmxlbiA9IDA7CisJdTgJCQkJKmRhdGFwOworCXUxNgkJCQlmYzsKIAlzdHJ1Y3Qgc2tfYnVmZgkJCSpza2I7CiAJaGZhMzg0eF90CQkgICAgICAgICpodyA9IHdsYW5kZXYtPnByaXY7CiAKQEAgLTQzMzMsMTUgKzQwNjMsMTUgQEAKIAlkYXRhbGVuID0gaGZhMzg0eDJob3N0XzE2KHJ4ZGVzYy0+ZGF0YV9sZW4pOwogCiAJLyogQWxsb2NhdGUgYW4gaW5kIG1lc3NhZ2UrZnJhbWVzaXplIHNrYiAqLwotCXNrYmxlbiA9IHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpICsKKwlza2JsZW4gPSBzaXplb2YocDgwMjExX2NhcGhkcl90KSArCiAJCWhkcmxlbiArIGRhdGFsZW4gKyBXTEFOX0NSQ19MRU47CiAKIAkvKiBzYW5pdHkgY2hlY2sgdGhlIGxlbmd0aCAqLwogCWlmICggc2tibGVuID4KLQkJKHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpICsKLQkJV0xBTl9IRFJfQTRfTEVOICsgV0xBTl9EQVRBX01BWExFTiArIFdMQU5fQ1JDX0xFTikgKSB7CisJICAgICAoc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkgKworCSAgICAgIFdMQU5fSERSX0E0X0xFTiArIFdMQU5fREFUQV9NQVhMRU4gKyBXTEFOX0NSQ19MRU4pICkgewogCQlXTEFOX0xPR19ERUJVRygxLCAib3ZlcmxlbiBmcm06IGxlbj0lemRcbiIsCi0JCQlza2JsZW4gLSBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSk7CisJCQkgICAgICAgc2tibGVuIC0gc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkpOwogCX0KIAogCWlmICggKHNrYiA9IGRldl9hbGxvY19za2Ioc2tibGVuKSkgPT0gTlVMTCApIHsKQEAgLTQzNTEsNjYgKzQwODEsNyBAQAogCiAJLyogb25seSBwcmVwZW5kIHRoZSBwcmlzbSBoZWFkZXIgaWYgaW4gdGhlIHJpZ2h0IG1vZGUgKi8KIAlpZiAoKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSAmJgotCSAgICAoaHctPnNuaWZmaGRyID09IDApKSB7Ci0JCWRhdGFwID0gc2tiX3B1dChza2IsIHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpKTsKLQkJbXNnID0gKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCopIGRhdGFwOwotCi0JCS8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgbWVtYmVycyAqLwotCQltc2ctPm1zZ2NvZGUgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtOwotCQltc2ctPm1zZ2xlbiA9IHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpOwotCQlzdHJjcHkobXNnLT5kZXZuYW1lLCB3bGFuZGV2LT5uYW1lKTsKLQotCQltc2ctPmhvc3R0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWU7Ci0JCW1zZy0+aG9zdHRpbWUuc3RhdHVzID0gMDsKLQkJbXNnLT5ob3N0dGltZS5sZW4gPSA0OwotCQltc2ctPmhvc3R0aW1lLmRhdGEgPSBqaWZmaWVzOwotCi0JCW1zZy0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7Ci0JCW1zZy0+bWFjdGltZS5zdGF0dXMgPSAwOwotCQltc2ctPm1hY3RpbWUubGVuID0gNDsKLQkJbXNnLT5tYWN0aW1lLmRhdGEgPSByeGRlc2MtPnRpbWU7Ci0KLQkJbXNnLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKLQkJbXNnLT5jaGFubmVsLnN0YXR1cyA9IDA7Ci0JCW1zZy0+Y2hhbm5lbC5sZW4gPSA0OwotCQltc2ctPmNoYW5uZWwuZGF0YSA9IGh3LT5zbmlmZl9jaGFubmVsOwotCi0JCW1zZy0+cnNzaS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2k7Ci0JCW1zZy0+cnNzaS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnJzc2kubGVuID0gNDsKLQkJbXNnLT5yc3NpLmRhdGEgPSAwOwotCi0JCW1zZy0+c3EuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcTsKLQkJbXNnLT5zcS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnNxLmxlbiA9IDQ7Ci0JCW1zZy0+c3EuZGF0YSA9IDA7Ci0KLQkJbXNnLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7Ci0JCW1zZy0+c2lnbmFsLnN0YXR1cyA9IDA7Ci0JCW1zZy0+c2lnbmFsLmxlbiA9IDQ7Ci0JCW1zZy0+c2lnbmFsLmRhdGEgPSByeGRlc2MtPnNpZ25hbDsKLQotCQltc2ctPm5vaXNlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2U7Ci0JCW1zZy0+bm9pc2Uuc3RhdHVzID0gMDsKLQkJbXNnLT5ub2lzZS5sZW4gPSA0OwotCQltc2ctPm5vaXNlLmRhdGEgPSByeGRlc2MtPnNpbGVuY2U7Ci0KLQkJbXNnLT5yYXRlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZTsKLQkJbXNnLT5yYXRlLnN0YXR1cyA9IDA7Ci0JCW1zZy0+cmF0ZS5sZW4gPSA0OwotCQltc2ctPnJhdGUuZGF0YSA9IHJ4ZGVzYy0+cmF0ZSAvIDU7IC8qIHNldCB0byA4MDIuMTEgdW5pdHMgKi8KLQotCQltc2ctPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OwotCQltc2ctPmlzdHguc3RhdHVzID0gMDsKLQkJbXNnLT5pc3R4LmxlbiA9IDQ7Ci0JCW1zZy0+aXN0eC5kYXRhID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQotCQltc2ctPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKLQkJbXNnLT5mcm1sZW4uc3RhdHVzID0gMDsKLQkJbXNnLT5mcm1sZW4ubGVuID0gNDsKLQkJbXNnLT5mcm1sZW4uZGF0YSA9IGhkcmxlbiArIGRhdGFsZW4gKyBXTEFOX0NSQ19MRU47Ci0JfSBlbHNlIGlmICgod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyMTFfUFJJU00pICYmCi0JCSAgIChody0+c25pZmZoZHIgIT0gMCkpIHsKKwkgICAgKGh3LT5zbmlmZmhkciAhPSAwKSkgewogCQlwODAyMTFfY2FwaGRyX3QJCSpjYXBoZHI7CiAJCS8qIFRoZSBORVcgaGVhZGVyIGZvcm1hdCEgKi8KIAkJZGF0YXAgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkpOwpAQCAtNDUwOCwxMSArNDE3OSw3IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBVUkJfT05MWV9DQUxMQkFDSwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQotI2Vsc2UKLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNib3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi0jZW5kaWYKIHsKIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gdXJiLT5jb250ZXh0OwogCWhmYTM4NHhfdXNib3V0X3QJKnVzYm91dCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwpAQCAtNDU4OSwxMSArNDI1Niw3IEBACiAqIENhbGwgY29udGV4dDoKICogaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBVUkJfT05MWV9DQUxMQkFDSwogc3RhdGljIHZvaWQgaGZhMzg0eF9jdGx4b3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLSNlbHNlCi1zdGF0aWMgdm9pZCBoZmEzODR4X2N0bHhvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLSNlbmRpZgogewogCWhmYTM4NHhfdAkqaHcgPSB1cmItPmNvbnRleHQ7CiAJaW50ICAgICAgICAgICAgIGRlbGV0ZV9yZXNwdGltZXIgPSAwOwpAQCAtNDk2OSw3ICs0NjMyLDcgQEAKICogQ2FsbCBjb250ZXh0OgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2lzZ29vZF9wZHJjb2RlKFVJTlQxNiBwZHJjb2RlKQoraGZhMzg0eF9pc2dvb2RfcGRyY29kZSh1MTYgcGRyY29kZSkKIHsKIAlzd2l0Y2gocGRyY29kZSkgewogCWNhc2UgSEZBMzg0eF9QRFJfRU5EX09GX1BEQToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYwppbmRleCA2ODEyMWI5Li5kZmM3YjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCkBAIC01MiwxMCArNTIsNiBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogCi0jZGVmaW5lIF9fTk9fVkVSU0lPTl9fCQkvKiBwcmV2ZW50IHRoZSBzdGF0aWMgZGVmaW5pdGlvbiAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTcwLDcgKzY2LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMTAwLDggKzk1LDggQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KIAotc3RhdGljIFVJTlQ4CW91aV9yZmMxMDQyW10gPSB7MHgwMCwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgVUlOVDgJb3VpXzgwMjFoW10gPSB7MHgwMCwgMHgwMCwgMHhmOH07CitzdGF0aWMgdTgJb3VpX3JmYzEwNDJbXSA9IHsweDAwLCAweDAwLCAweDAwfTsKK3N0YXRpYyB1OAlvdWlfODAyMWhbXSA9IHsweDAwLCAweDAwLCAweGY4fTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwpAQCAtMTM1LDExICsxMzAsMTEgQEAKICogQ2FsbCBjb250ZXh0OgogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHNrYl9ldGhlcl90b19wODAyMTEoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDMyIGV0aGNvbnYsIHN0cnVjdCBza19idWZmICpza2IsIHA4MDIxMV9oZHJfdCAqcDgwMjExX2hkciwgcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCkKK2ludCBza2JfZXRoZXJfdG9fcDgwMjExKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBldGhjb252LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwODAyMTFfaGRyX3QgKnA4MDIxMV9oZHIsIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXApCiB7CiAKLQlVSU5UMTYgICAgICAgICAgZmM7Ci0JVUlOVDE2ICAgICAgICAgIHByb3RvOworCXUxNiAgICAgICAgICBmYzsKKwl1MTYgICAgICAgICAgcHJvdG87CiAJd2xhbl9ldGhoZHJfdCAgIGVfaGRyOwogCXdsYW5fbGxjX3QgICAgICAqZV9sbGM7CiAJd2xhbl9zbmFwX3QgICAgICplX3NuYXA7CkBAIC0yOTgsMTQgKzI5MywxNCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCU1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IG9yIG5vbi1pbnRlcnJ1cHQgY29udGV4dAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgc2tiX3A4MDIxMV90b19ldGhlciggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMzIgZXRoY29udiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBza2JfcDgwMjExX3RvX2V0aGVyKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBldGhjb252LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCW5ldGRldmljZV90ICAgICAqbmV0ZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwotCVVJTlQxNiAgICAgICAgICBmYzsKLQlVSU5UICAgICAgICAgICAgcGF5bG9hZF9sZW5ndGg7Ci0JVUlOVCAgICAgICAgICAgIHBheWxvYWRfb2Zmc2V0OwotCVVJTlQ4CQlkYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKLQlVSU5UOAkJc2FkZHJbV0xBTl9FVEhBRERSX0xFTl07CisJdTE2ICAgICAgICAgIGZjOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHBheWxvYWRfbGVuZ3RoOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHBheWxvYWRfb2Zmc2V0OworCXU4CQlkYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKKwl1OAkJc2FkZHJbV0xBTl9FVEhBRERSX0xFTl07CiAJcDgwMjExX2hkcl90ICAgICp3X2hkcjsKIAl3bGFuX2V0aGhkcl90ICAgKmVfaGRyOwogCXdsYW5fbGxjX3QgICAgICAqZV9sbGM7CkBAIC0zMzMsMTEgKzMyOCwxMSBAQAogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hMy5hMiwgV0xBTl9FVEhBRERSX0xFTik7CiAJfSBlbHNlIHsKIAkJcGF5bG9hZF9vZmZzZXQgPSBXTEFOX0hEUl9BNF9MRU47Ci0JCXBheWxvYWRfbGVuZ3RoIC09ICggV0xBTl9IRFJfQTRfTEVOIC0gV0xBTl9IRFJfQTNfTEVOICk7Ci0JCWlmIChwYXlsb2FkX2xlbmd0aCA8IDAgKSB7CisJCWlmIChwYXlsb2FkX2xlbmd0aCA8IFdMQU5fSERSX0E0X0xFTiAtIFdMQU5fSERSX0EzX0xFTikgewogCQkJV0xBTl9MT0dfRVJST1IoIkE0IGZyYW1lIHRvbyBzaG9ydCFcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KKwkJcGF5bG9hZF9sZW5ndGggLT0gKFdMQU5fSERSX0E0X0xFTiAtIFdMQU5fSERSX0EzX0xFTik7CiAJCW1lbWNweShkYWRkciwgd19oZHItPmE0LmEzLCBXTEFOX0VUSEFERFJfTEVOKTsKIAkJbWVtY3B5KHNhZGRyLCB3X2hkci0+YTQuYTQsIFdMQU5fRVRIQUREUl9MRU4pOwogCX0KQEAgLTQ5Nyw4ICs0OTIsMTYgQEAKIAogCX0KIAorICAgICAgICAvKgorICAgICAgICAgKiBOb3RlIHRoYXQgZXRoX3R5cGVfdHJhbnMoKSBleHBlY3RzIGFuIHNrYiB3LyBza2ItPmRhdGEgcG9pbnRpbmcKKyAgICAgICAgICogYXQgdGhlIE1BQyBoZWFkZXIsIGl0IHRoZW4gc2V0cyB0aGUgZm9sbG93aW5nIHNrYiBtZW1iZXJzOgorICAgICAgICAgKiBza2ItPm1hY19oZWFkZXIsCisgICAgICAgICAqIHNrYi0+ZGF0YSwgYW5kCisgICAgICAgICAqIHNrYi0+cGt0X3R5cGUuCisgICAgICAgICAqIEl0IHRoZW4gX3JldHVybnNfIHRoZSB2YWx1ZSB0aGF0IF93ZSdyZV8gc3VwcG9zZWQgdG8gc3R1ZmYgaW4KKyAgICAgICAgICogc2tiLT5wcm90b2NvbC4gIFRoaXMgaXMgbnV0cy4KKyAgICAgICAgICovCiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKLQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAgICAgICAgIC8qIGprcmllZ2w6IHByb2Nlc3Mgc2lnbmFsIGFuZCBub2lzZSBhcyBzZXQgaW4gaGZhMzg0eF9pbnRfcngoKSAqLwogCS8qIGprcmllZ2w6IG9ubHkgcHJvY2VzcyBzaWduYWwvbm9pc2UgaWYgcmVxdWVzdGVkIGJ5IGl3c3B5ICovCkBAIC01MjgsNyArNTMxLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHA4MDIxMV9zdHRfZmluZHByb3RvKFVJTlQxNiBwcm90bykKK2ludCBwODAyMTFfc3R0X2ZpbmRwcm90byh1MTYgcHJvdG8pCiB7CiAJLyogQWx3YXlzIHJldHVybiBmb3VuZCBmb3Igbm93LiAgVGhpcyBpcyB0aGUgYmVoYXZpb3IgdXNlZCBieSB0aGUgKi8KIAkvKiAgWm9vbSBXaW45NSBkcml2ZXIgd2hlbiA4MDIuMWggbW9kZSBpcyBzZWxlY3RlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCmluZGV4IDNmNWFiNTdjLi41MzhlOWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCkBAIC04NiwyMiArODYsMjIgQEAKIHsKIAlzdHJ1Y3Qgd2xhbmRldmljZQkqd2xhbmRldjsKIAotCVVJTlQ2NAltYWN0aW1lOwkvKiBIaS1yZXogTUFDLXN1cHBsaWVkIHRpbWUgdmFsdWUgKi8KLQlVSU5UNjQJaG9zdHRpbWU7CS8qIEJlc3QtcmV6IGhvc3Qgc3VwcGxpZWQgdGltZSB2YWx1ZSAqLworCXU2NAltYWN0aW1lOwkvKiBIaS1yZXogTUFDLXN1cHBsaWVkIHRpbWUgdmFsdWUgKi8KKwl1NjQJaG9zdHRpbWU7CS8qIEJlc3QtcmV6IGhvc3Qgc3VwcGxpZWQgdGltZSB2YWx1ZSAqLwogCi0JVUlOVAlyeHJhdGU7CQkvKiBSZWNlaXZlIGRhdGEgcmF0ZSBpbiAxMDBrYnBzICovCi0JVUlOVAlwcmlvcml0eTsJLyogMC0xNSwgMD1jb250ZW50aW9uLCA2PUNGICovCi0JSU5UCXNpZ25hbDsJCS8qIEFuIFNTSSwgc2VlIHA4MDIxMW5ldGRldi5oICovCi0JSU5UCW5vaXNlOwkJLyogQW4gU1NJLCBzZWUgcDgwMjExbmV0ZGV2LmggKi8KLQlVSU5UCWNoYW5uZWw7CS8qIFJlY2VpdmUgY2hhbm5lbCAobW9zdGx5IGZvciBzbmlmcykgKi8KLQlVSU5UCXByZWFtYmxlOwkvKiBQODAyMTFFTlVNX3ByZWFtYmxldHlwZV8qICovCi0JVUlOVAllbmNvZGluZzsJLyogUDgwMjExRU5VTV9lbmNvZGluZ18qICovCisJdW5zaWduZWQgaW50CXJ4cmF0ZTsJCS8qIFJlY2VpdmUgZGF0YSByYXRlIGluIDEwMGticHMgKi8KKwl1bnNpZ25lZCBpbnQJcHJpb3JpdHk7CS8qIDAtMTUsIDA9Y29udGVudGlvbiwgNj1DRiAqLworCWludAlzaWduYWw7CQkvKiBBbiBTU0ksIHNlZSBwODAyMTFuZXRkZXYuaCAqLworCWludAlub2lzZTsJCS8qIEFuIFNTSSwgc2VlIHA4MDIxMW5ldGRldi5oICovCisJdW5zaWduZWQgaW50CWNoYW5uZWw7CS8qIFJlY2VpdmUgY2hhbm5lbCAobW9zdGx5IGZvciBzbmlmcykgKi8KKwl1bnNpZ25lZCBpbnQJcHJlYW1ibGU7CS8qIFA4MDIxMUVOVU1fcHJlYW1ibGV0eXBlXyogKi8KKwl1bnNpZ25lZCBpbnQJZW5jb2Rpbmc7CS8qIFA4MDIxMUVOVU1fZW5jb2RpbmdfKiAqLwogCiB9IHA4MDIxMV9yeG1ldGFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2ZybW1ldGEKIHsKLQlVSU5UCQkJbWFnaWM7CisJdW5zaWduZWQgaW50CQkJbWFnaWM7CiAJcDgwMjExX3J4bWV0YV90CQkqcng7CiB9IHA4MDIxMV9mcm1tZXRhX3Q7CiAKQEAgLTExNywyMCArMTE3LDIwIEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMV9jYXBoZHIKIHsKLQlVSU5UMzIJCXZlcnNpb247Ci0JVUlOVDMyCQlsZW5ndGg7Ci0JVUlOVDY0CQltYWN0aW1lOwotCVVJTlQ2NAkJaG9zdHRpbWU7Ci0JVUlOVDMyCQlwaHl0eXBlOwotCVVJTlQzMgkJY2hhbm5lbDsKLQlVSU5UMzIJCWRhdGFyYXRlOwotCVVJTlQzMgkJYW50ZW5uYTsKLQlVSU5UMzIJCXByaW9yaXR5OwotCVVJTlQzMgkJc3NpX3R5cGU7Ci0JSU5UMzIJCXNzaV9zaWduYWw7Ci0JSU5UMzIJCXNzaV9ub2lzZTsKLQlVSU5UMzIJCXByZWFtYmxlOwotCVVJTlQzMgkJZW5jb2Rpbmc7CisJdTMyCQl2ZXJzaW9uOworCXUzMgkJbGVuZ3RoOworCXU2NAkJbWFjdGltZTsKKwl1NjQJCWhvc3R0aW1lOworCXUzMgkJcGh5dHlwZTsKKwl1MzIJCWNoYW5uZWw7CisJdTMyCQlkYXRhcmF0ZTsKKwl1MzIJCWFudGVubmE7CisJdTMyCQlwcmlvcml0eTsKKwl1MzIJCXNzaV90eXBlOworCXMzMgkJc3NpX3NpZ25hbDsKKwlzMzIJCXNzaV9ub2lzZTsKKwl1MzIJCXByZWFtYmxlOworCXUzMgkJZW5jb2Rpbmc7CiB9IHA4MDIxMV9jYXBoZHJfdDsKIAogLyogYnVmZmVyIGZyZWUgbWV0aG9kIHBvaW50ZXIgdHlwZSAqLwpAQCAtMTM4LDMxICsxMzgsMzEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgewogCXZvaWQgICpkYXRhOwotCVVJTlQ4IGl2WzRdOwotCVVJTlQ4IGljdls0XTsKKwl1OCBpdls0XTsKKwl1OCBpY3ZbNF07CiB9IHA4MDIxMV9tZXRhd2VwX3Q7CiAKIC8qIGxvY2FsIGV0aGVyIGhlYWRlciB0eXBlICovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2V0aGhkcgogewotCVVJTlQ4CWRhZGRyW1dMQU5fRVRIQUREUl9MRU5dOwotCVVJTlQ4CXNhZGRyW1dMQU5fRVRIQUREUl9MRU5dOwotCVVJTlQxNgl0eXBlOworCXU4CWRhZGRyW1dMQU5fRVRIQUREUl9MRU5dOworCXU4CXNhZGRyW1dMQU5fRVRIQUREUl9MRU5dOworCXUxNgl0eXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2V0aGhkcl90OwogCiAvKiBsb2NhbCBsbGMgaGVhZGVyIHR5cGUgKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fbGxjCiB7Ci0JVUlOVDgJZHNhcDsKLQlVSU5UOAlzc2FwOwotCVVJTlQ4CWN0bDsKKwl1OAlkc2FwOworCXU4CXNzYXA7CisJdTgJY3RsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2xsY190OwogCiAvKiBsb2NhbCBzbmFwIGhlYWRlciB0eXBlICovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX3NuYXAKIHsKLQlVSU5UOAlvdWlbV0xBTl9JRUVFX09VSV9MRU5dOwotCVVJTlQxNgl0eXBlOworCXU4CW91aVtXTEFOX0lFRUVfT1VJX0xFTl07CisJdTE2CXR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5fc25hcF90OwogCiAvKiBDaXJjdWxhciBpbmNsdWRlIHRyaWNrICovCkBAIC0xNzQsMTMgKzE3NCwxMyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCiAKLWludCBza2JfcDgwMjExX3RvX2V0aGVyKCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgVUlOVDMyIGV0aGNvbnYsCitpbnQgc2tiX3A4MDIxMV90b19ldGhlciggc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBldGhjb252LAogCQkJIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IHNrYl9ldGhlcl90b19wODAyMTEoIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBVSU5UMzIgZXRoY29udiwKK2ludCBza2JfZXRoZXJfdG9fcDgwMjExKCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGV0aGNvbnYsCiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLAogCQkJIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXAgKTsKIAotaW50IHA4MDIxMV9zdHRfZmluZHByb3RvKFVJTlQxNiBwcm90byk7Ci1pbnQgcDgwMjExX3N0dF9hZGRwcm90byhVSU5UMTYgcHJvdG8pOworaW50IHA4MDIxMV9zdHRfZmluZHByb3RvKHUxNiBwcm90byk7CitpbnQgcDgwMjExX3N0dF9hZGRwcm90byh1MTYgcHJvdG8pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWhkci5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKaW5kZXggYjdiMDg3Mi4uNzJmMTJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKQEAgLTE2NiwyOSArMTY2LDI5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9GQ19GU1RZUEUoV0xBTl9GU1RZUEVfUlRTKSApOyAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNkZWZpbmUgV0xBTl9HRVRfRkNfUFZFUihuKQkgKCgoVUlOVDE2KShuKSkgJiAoQklUMCB8IEJJVDEpKQotI2RlZmluZSBXTEFOX0dFVF9GQ19GVFlQRShuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUMiB8IEJJVDMpKSA+PiAyKQotI2RlZmluZSBXTEFOX0dFVF9GQ19GU1RZUEUobikJKCgoKFVJTlQxNikobikpICYgKEJJVDR8QklUNXxCSVQ2fEJJVDcpKSA+PiA0KQotI2RlZmluZSBXTEFOX0dFVF9GQ19UT0RTKG4pIAkoKCgoVUlOVDE2KShuKSkgJiAoQklUOCkpID4+IDgpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0ZST01EUyhuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUOSkpID4+IDkpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVGUkFHKG4pICgoKChVSU5UMTYpKG4pKSAmIChCSVQxMCkpID4+IDEwKQotI2RlZmluZSBXTEFOX0dFVF9GQ19SRVRSWShuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUMTEpKSA+PiAxMSkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfUFdSTUdUKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQxMikpID4+IDEyKQotI2RlZmluZSBXTEFOX0dFVF9GQ19NT1JFREFUQShuKSAoKCgoVUlOVDE2KShuKSkgJiAoQklUMTMpKSA+PiAxMykKLSNkZWZpbmUgV0xBTl9HRVRfRkNfSVNXRVAobikJKCgoKFVJTlQxNikobikpICYgKEJJVDE0KSkgPj4gMTQpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX09SREVSKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQxNSkpID4+IDE1KQorI2RlZmluZSBXTEFOX0dFVF9GQ19QVkVSKG4pCSAoKCh1MTYpKG4pKSAmIChCSVQwIHwgQklUMSkpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZUWVBFKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQyIHwgQklUMykpID4+IDIpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZTVFlQRShuKQkoKCgodTE2KShuKSkgJiAoQklUNHxCSVQ1fEJJVDZ8QklUNykpID4+IDQpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1RPRFMobikgCSgoKCh1MTYpKG4pKSAmIChCSVQ4KSkgPj4gOCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfRlJPTURTKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQ5KSkgPj4gOSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfTU9SRUZSQUcobikgKCgoKHUxNikobikpICYgKEJJVDEwKSkgPj4gMTApCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1JFVFJZKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQxMSkpID4+IDExKQorI2RlZmluZSBXTEFOX0dFVF9GQ19QV1JNR1QobikJKCgoKHUxNikobikpICYgKEJJVDEyKSkgPj4gMTIpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVEQVRBKG4pICgoKCh1MTYpKG4pKSAmIChCSVQxMykpID4+IDEzKQorI2RlZmluZSBXTEFOX0dFVF9GQ19JU1dFUChuKQkoKCgodTE2KShuKSkgJiAoQklUMTQpKSA+PiAxNCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfT1JERVIobikJKCgoKHUxNikobikpICYgKEJJVDE1KSkgPj4gMTUpCiAKLSNkZWZpbmUgV0xBTl9TRVRfRkNfUFZFUihuKQkoKFVJTlQxNikobikpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX0ZUWVBFKG4pCSgoKFVJTlQxNikobikpIDw8IDIpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX0ZTVFlQRShuKQkoKChVSU5UMTYpKG4pKSA8PCA0KQotI2RlZmluZSBXTEFOX1NFVF9GQ19UT0RTKG4pIAkoKChVSU5UMTYpKG4pKSA8PCA4KQotI2RlZmluZSBXTEFOX1NFVF9GQ19GUk9NRFMobikJKCgoVUlOVDE2KShuKSkgPDwgOSkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfTU9SRUZSQUcobikgKCgoVUlOVDE2KShuKSkgPDwgMTApCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX1JFVFJZKG4pCSgoKFVJTlQxNikobikpIDw8IDExKQotI2RlZmluZSBXTEFOX1NFVF9GQ19QV1JNR1QobikJKCgoVUlOVDE2KShuKSkgPDwgMTIpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVEQVRBKG4pICgoKFVJTlQxNikobikpIDw8IDEzKQotI2RlZmluZSBXTEFOX1NFVF9GQ19JU1dFUChuKQkoKChVSU5UMTYpKG4pKSA8PCAxNCkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfT1JERVIobikJKCgoVUlOVDE2KShuKSkgPDwgMTUpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1BWRVIobikJKCh1MTYpKG4pKQorI2RlZmluZSBXTEFOX1NFVF9GQ19GVFlQRShuKQkoKCh1MTYpKG4pKSA8PCAyKQorI2RlZmluZSBXTEFOX1NFVF9GQ19GU1RZUEUobikJKCgodTE2KShuKSkgPDwgNCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfVE9EUyhuKSAJKCgodTE2KShuKSkgPDwgOCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfRlJPTURTKG4pCSgoKHUxNikobikpIDw8IDkpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVGUkFHKG4pICgoKHUxNikobikpIDw8IDEwKQorI2RlZmluZSBXTEFOX1NFVF9GQ19SRVRSWShuKQkoKCh1MTYpKG4pKSA8PCAxMSkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfUFdSTUdUKG4pCSgoKHUxNikobikpIDw8IDEyKQorI2RlZmluZSBXTEFOX1NFVF9GQ19NT1JFREFUQShuKSAoKCh1MTYpKG4pKSA8PCAxMykKKyNkZWZpbmUgV0xBTl9TRVRfRkNfSVNXRVAobikJKCgodTE2KShuKSkgPDwgMTQpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX09SREVSKG4pCSgoKHUxNikobikpIDw8IDE1KQogCiAvKi0tLSBEdXJhdGlvbiBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBNYWNyb3MgdG8gZ2V0L3NldCB0aGUgYml0ZmllbGRzIG9mIHRoZSBEdXJhdGlvbiBGaWVsZCAgICAgICovCkBAIC0yMDEsNDUgKzIwMSw0NSBAQAogLyogTWFjcm9zIHRvIGdldC9zZXQgdGhlIGJpdGZpZWxkcyBvZiB0aGUgU2VxdWVuY2UgQ29udHJvbCAgICAqLwogLyogRmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJHTlVNKG4pICgoKFVJTlQxNikobikpICYgKEJJVDB8QklUMXxCSVQyfEJJVDMpKQotI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRTlVNKG4pICgoKChVSU5UMTYpKG4pKSAmICh+KEJJVDB8QklUMXxCSVQyfEJJVDMpKSkgPj4gNCkKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSR05VTShuKSAoKCh1MTYpKG4pKSAmIChCSVQwfEJJVDF8QklUMnxCSVQzKSkKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUU5VTShuKSAoKCgodTE2KShuKSkgJiAofihCSVQwfEJJVDF8QklUMnxCSVQzKSkpID4+IDQpCiAKIC8qLS0tIERhdGEgcHRyIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENyZWF0ZXMgYSBVSU5UOCogdG8gdGhlIGRhdGEgcG9ydGlvbiBvZiBhIGZyYW1lICAgICAgICAgICAgKi8KKy8qIENyZWF0ZXMgYSB1OCogdG8gdGhlIGRhdGEgcG9ydGlvbiBvZiBhIGZyYW1lICAgICAgICAgICAgKi8KIC8qIEFzc3VtZXMgeW91J3JlIHBhc3NpbmcgaW4gYSBwdHIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGRyKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgV0xBTl9IRFJfQTNfREFUQVAocCkgKCgoVUlOVDgqKShwKSkgKyBXTEFOX0hEUl9BM19MRU4pCi0jZGVmaW5lIFdMQU5fSERSX0E0X0RBVEFQKHApICgoKFVJTlQ4KikocCkpICsgV0xBTl9IRFJfQTRfTEVOKQorI2RlZmluZSBXTEFOX0hEUl9BM19EQVRBUChwKSAoKCh1OCopKHApKSArIFdMQU5fSERSX0EzX0xFTikKKyNkZWZpbmUgV0xBTl9IRFJfQTRfREFUQVAocCkgKCgodTgqKShwKSkgKyBXTEFOX0hEUl9BNF9MRU4pCiAKLSNkZWZpbmUgRE9UMTFfUkFURTVfSVNCQVNJQ19HRVQocikgICAgICgoKFVJTlQ4KShyKSkgJiBCSVQ3KQorI2RlZmluZSBET1QxMV9SQVRFNV9JU0JBU0lDX0dFVChyKSAgICAgKCgodTgpKHIpKSAmIEJJVDcpCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBUeXBlcyAqLwogCiAvKiBCU1MgVGltZXN0YW1wICovCi10eXBlZGVmIFVJTlQ4IHdsYW5fYnNzX3RzX3RbV0xBTl9CU1NfVFNfTEVOXTsKK3R5cGVkZWYgdTggd2xhbl9ic3NfdHNfdFtXTEFOX0JTU19UU19MRU5dOwogCiAvKiBHZW5lcmljIDgwMi4xMSBIZWFkZXIgdHlwZXMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2hkcl9hMwogewotCVVJTlQxNglmYzsKLQlVSU5UMTYJZHVyOwotCVVJTlQ4CWExW1dMQU5fQUREUl9MRU5dOwotCVVJTlQ4CWEyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQ4CWEzW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglzZXE7CisJdTE2CWZjOworCXUxNglkdXI7CisJdTgJYTFbV0xBTl9BRERSX0xFTl07CisJdTgJYTJbV0xBTl9BRERSX0xFTl07CisJdTgJYTNbV0xBTl9BRERSX0xFTl07CisJdTE2CXNlcTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExX2hkcl9hM190OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFfaGRyX2E0CiB7Ci0JVUlOVDE2CWZjOwotCVVJTlQxNglkdXI7Ci0JVUlOVDgJYTFbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJYTJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJYTNbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CXNlcTsKLQlVSU5UOAlhNFtXTEFOX0FERFJfTEVOXTsKKwl1MTYJZmM7CisJdTE2CWR1cjsKKwl1OAlhMVtXTEFOX0FERFJfTEVOXTsKKwl1OAlhMltXTEFOX0FERFJfTEVOXTsKKwl1OAlhM1tXTEFOX0FERFJfTEVOXTsKKwl1MTYJc2VxOworCXU4CWE0W1dMQU5fQUREUl9MRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFfaGRyX2E0X3Q7CiAKIHR5cGVkZWYgdW5pb24gcDgwMjExX2hkcgpAQCAtMjcxLDkgKzI3MSw5IEBACiAjZGVmaW5lIFdMQU5fRkNTX0xFTgkJCTQKIAogLyogZnRjbCBpbiBIT1NUIG9yZGVyICovCi1pbmxpbmUgc3RhdGljIFVJTlQxNiBwODAyMTFfaGVhZGVybGVuKFVJTlQxNiBmY3RsKQoraW5saW5lIHN0YXRpYyB1MTYgcDgwMjExX2hlYWRlcmxlbih1MTYgZmN0bCkKIHsKLQlVSU5UMTYgaGRybGVuID0gMDsKKwl1MTYgaGRybGVuID0gMDsKIAogCXN3aXRjaCAoIFdMQU5fR0VUX0ZDX0ZUWVBFKGZjdGwpICkgewogCWNhc2UgV0xBTl9GVFlQRV9NR01UOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWlvY3RsLmgKaW5kZXggMjViMmVhOC4uYWQ2N2I2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFpb2N0bC5oCkBAIC0xMDYsOSArMTA2LDkgQEAKIHsKIAljaGFyIAluYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwogCWNhZGRyX3QgZGF0YTsKLQlVSU5UMzIJbWFnaWM7Ci0JVUlOVDE2CWxlbjsKLQlVSU5UMzIJcmVzdWx0OworCXUzMgltYWdpYzsKKwl1MTYJbGVuOworCXUzMglyZXN1bHQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWlvY3RsX3JlcV90OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGEuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGEuaAppbmRleCA1Y2IzZjVhLi44YjYxZTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YS5oCkBAIC05MCw3ICs5MCw3IEBACiAjZGVmaW5lIE1LTUlCTUVUQVNJWkUobmFtZSkJCXA4MDIxMW1ldGFfICMjIG1pYiAjIyBfICMjIG5hbWUgIyMgXyAjIyBzaXplCiAjZGVmaW5lIE1LR1JQTUVUQVNJWkUobmFtZSkJCXA4MDIxMW1ldGFfICMjIGdycCAjIyBfICMjIG5hbWUgIyMgXyAjIyBzaXplCiAKLSNkZWZpbmUgR0VUTUVUQVNJWkUoYXB0cikJCSgqKigoVUlOVDMyKiopKGFwdHIpKSkKKyNkZWZpbmUgR0VUTUVUQVNJWkUoYXB0cikJCSgqKigodTMyKiopKGFwdHIpKSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRoZSBmb2xsb3dpbmcgaWZkZWYgZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nIGRlZmluZXM6ICovCkBAIC0xMTQsMTQgKzExNCwxNCBAQAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbWV0YQogewogCWNoYXIJCQkqbmFtZTsJCS8qIGRhdGEgaXRlbSBuYW1lICovCi0JVUlOVDMyCQkJZGlkOwkJLyogcGFydGlhbCBkaWQgKi8KLQlVSU5UMzIJCQlmbGFnczsJCS8qIHNldCBvZiB2YXJpb3VzIGZsYWcgYml0cyAqLwotCVVJTlQzMgkJCW1pbjsJCS8qIG1pbiB2YWx1ZSBvZiBhIEJPVU5ERURJTlQgKi8KLQlVSU5UMzIJCQltYXg7CQkvKiBtYXggdmFsdWUgb2YgYSBCT1VOREVESU5UICovCisJdTMyCQkJZGlkOwkJLyogcGFydGlhbCBkaWQgKi8KKwl1MzIJCQlmbGFnczsJCS8qIHNldCBvZiB2YXJpb3VzIGZsYWcgYml0cyAqLworCXUzMgkJCW1pbjsJCS8qIG1pbiB2YWx1ZSBvZiBhIEJPVU5ERURpbnQgKi8KKwl1MzIJCQltYXg7CQkvKiBtYXggdmFsdWUgb2YgYSBCT1VOREVEaW50ICovCiAKLQlVSU5UMzIJCQltYXhsZW47CQkvKiBtYXhsZW4gb2YgYSBPQ1RFVFNUUiBvciBESVNQTEFZU1RSICovCi0JVUlOVDMyCQkJbWlubGVuOwkJLyogbWlubGVuIG9mIGEgT0NURVRTVFIgb3IgRElTUExBWVNUUiAqLwotCXA4MDIxMWVudW1fdAkJKmVudW1wdHI7CS8qIHB0ciB0byB0aGUgZW51bSB0eXBlIGZvciBFTlVNSU5UICovCisJdTMyCQkJbWF4bGVuOwkJLyogbWF4bGVuIG9mIGEgT0NURVRTVFIgb3IgRElTUExBWVNUUiAqLworCXUzMgkJCW1pbmxlbjsJCS8qIG1pbmxlbiBvZiBhIE9DVEVUU1RSIG9yIERJU1BMQVlTVFIgKi8KKwlwODAyMTFlbnVtX3QJCSplbnVtcHRyOwkvKiBwdHIgdG8gdGhlIGVudW0gdHlwZSBmb3IgRU5VTWludCAqLwogCXA4MDIxMV90b3RleHRfdAkJdG90ZXh0cHRyOwkvKiBwdHIgdG8gdG90ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KIAlwODAyMTFfZnJvbXRleHRfdAlmcm9tdGV4dHB0cjsJLyogcHRyIHRvIHRvdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCiAJcDgwMjExX3ZhbGlkX3QJCXZhbGlkZnVucHRyOwkvKiBwdHIgdG8gdG90ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KQEAgLTE1MCwyMCArMTUwLDIwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiAqLwotVUlOVDMyIHA4MDIxMV90ZXh0MmRpZChjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBjaGFyICpjYXRuYW1lLCBjaGFyICpncnBuYW1lLCBjaGFyICppdGVtbmFtZSk7Ci1VSU5UMzIgcDgwMjExX3RleHQyY2F0ZGlkKGNhdGxpc3RpdGVtX3QgKmxpc3QsIGNoYXIgKm5hbWUgKTsKLVVJTlQzMiBwODAyMTFfdGV4dDJncnBkaWQoZ3JwbGlzdGl0ZW1fdCAqbGlzdCwgY2hhciAqbmFtZSApOwotVUlOVDMyIHA4MDIxMV90ZXh0Mml0ZW1kaWQocDgwMjExbWV0YV90ICpsaXN0LCBjaGFyICpuYW1lICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfY2F0ZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfZ3JwZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfaXRlbWRpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotY2F0bGlzdGl0ZW1fdCAqcDgwMjExX2RpZDJjYXQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIFVJTlQzMiBkaWQgKTsKLWdycGxpc3RpdGVtX3QgKnA4MDIxMV9kaWQyZ3JwKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1wODAyMTFtZXRhX3QgKnA4MDIxMV9kaWQyaXRlbSggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotVUlOVDMyIHA4MDIxMWl0ZW1fbWF4ZGF0YWxlbiggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCApOwotVUlOVDMyIHA4MDIxMV9tZXRhbmFtZTJkaWQoc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgY2hhciAqaXRlbW5hbWUpOwotVUlOVDMyIHA4MDIxMWl0ZW1fZ2V0b2Zmc2V0KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkICk7Cit1MzIgcDgwMjExX3RleHQyZGlkKGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIGNoYXIgKmNhdG5hbWUsIGNoYXIgKmdycG5hbWUsIGNoYXIgKml0ZW1uYW1lKTsKK3UzMiBwODAyMTFfdGV4dDJjYXRkaWQoY2F0bGlzdGl0ZW1fdCAqbGlzdCwgY2hhciAqbmFtZSApOwordTMyIHA4MDIxMV90ZXh0MmdycGRpZChncnBsaXN0aXRlbV90ICpsaXN0LCBjaGFyICpuYW1lICk7Cit1MzIgcDgwMjExX3RleHQyaXRlbWRpZChwODAyMTFtZXRhX3QgKmxpc3QsIGNoYXIgKm5hbWUgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9kaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9jYXRkaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9ncnBkaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9pdGVtZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7CitjYXRsaXN0aXRlbV90ICpwODAyMTFfZGlkMmNhdCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgdTMyIGRpZCApOworZ3JwbGlzdGl0ZW1fdCAqcDgwMjExX2RpZDJncnAoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3A4MDIxMW1ldGFfdCAqcDgwMjExX2RpZDJpdGVtKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7Cit1MzIgcDgwMjExaXRlbV9tYXhkYXRhbGVuKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkICk7Cit1MzIgcDgwMjExX21ldGFuYW1lMmRpZChzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBjaGFyICppdGVtbmFtZSk7Cit1MzIgcDgwMjExaXRlbV9nZXRvZmZzZXQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQgKTsKIGludCBwODAyMTFpdGVtX2dldHR5cGUocDgwMjExbWV0YV90ICptZXRhKTsKIAogI2VuZGlmIC8qIF9QODAyMTFNRVRBX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaAppbmRleCAyYzdmNDM1Li5jZTRmZGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oCkBAIC03MiwyNSArNzIsNiBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcG93ZXJtZ210IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXRfcG93ZXJtZ210bW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXRfd2FrZXVwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Bvd2VybWdtdF9yZWNlaXZlZHRpbXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcG93ZXJtZ210X3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfZG90MTFyZXFfc2NhbiBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDQpKQpAQCAtMzAxLDIxMSArMjgyLDYgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDQwKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jzc2lkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fam9pbmZhaWx1cmV0aW1lb3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGUyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX3BlZXJzdGFhZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZV9hdXRoZW50aWNhdGlvbnR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX2F1dGhlbnRpY2F0aW9uZmFpbHVyZXRpbWVvdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlX3BlZXJzdGFhZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlX3JlYXNvbmNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV9wZWVyc3RhYWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfYXNzb2NpYXRlZmFpbHVyZXRpbWVvdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX2NmcG9sbGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX2NmcG9sbHJlcSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfcHJpdmFjeSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfbGlzdGVuaW50ZXJ2YWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV9uZXdhcGFkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX3JlYXNzb2NpYXRlZmFpbHVyZXRpbWVvdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX2NmcG9sbGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX2NmcG9sbHJlcSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfcHJpdmFjeSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfbGlzdGVuaW50ZXJ2YWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDExKSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZV9wZWVyc3RhYWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDExKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlX3JlYXNvbmNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZXNldCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEyKSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Jlc2V0X3NldGRlZmF1bHRtaWIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Jlc2V0X21hY2FkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Jlc2V0X3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKICNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3N0YXJ0IFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMTMpKQpAQCAtNzk1LDE0NyArNTcxLDggQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2NhdF9sbnhpbmQgXAotCQkJUDgwMjExRElEX01LU0VDVElPTig0KQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2kgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF9yb2FtIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikpCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfcm9hbV9yZWFzb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfY2F0X3AycmVxIFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oNSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYnNzaWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGU3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9zc2lkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2NoYW5uZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYXV0aHR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfcDJyZXFfcmVhZHBkYSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDIpKQpAQCAtOTQ3LDE2MiArNTg0LDYgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3JlYWRjaXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3JlYWRjaXNfY2lzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3JlYWRjaXNfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlX2VuYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9yZWFkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWRfYWRkciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWRfbGVuIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfcmVhZF9kYXRhIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfcmVhZF9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfd3JpdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfd3JpdGVfYWRkciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlX2xlbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlX2RhdGEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF93cml0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX2NvbW1hbmQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3BhcmFtMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcGFyYW0xIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9wYXJhbTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3Jlc3AwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9yZXNwMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcmVzcDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfdGVzdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Rlc3RwYXJhbSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfc3RhdHVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZF9yZXNwMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfcmVzcDEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Jlc3AyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV9yZWFkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfcmVhZF9hZGRyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV9yZWFkX3ZhbHVlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV9yZWFkX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3dyaXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3dyaXRlX2FkZHIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV93cml0ZV9kYXRhIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfd3JpdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfcDJyZXFfcmFtZGxfc3RhdGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgxMSkpCkBAIC0xMTY3LDIyNCArNjQ4LDggQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMTQpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbV9zdGF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE1KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21tX3N0YXRlX2VuYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1fc3RhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfZHVtcF9zdGF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE2KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2R1bXBfc3RhdGVfbGV2ZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2R1bXBfc3RhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTcpKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX2NoYW5uZWxsaXN0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fY2hhbm5lbGR3ZWxsdGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19udW1jaGluZm8gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfY2hhbm5lbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfYXZnbm9pc2VsZXZlbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfcGVha25vaXNlbGV2ZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX2Jzc2FjdGl2ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfcGNmYWN0aXZlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9lbmFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOSkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9lbmFibGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtaWJfY2F0X2RvdDExc210IFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oMSkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X3A4MDIxMVRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9wODAyMTFUYWJsZV9wODAyMTFfaWZzdGF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFTdGF0aW9uSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFNZWRpdW1PY2N1cGFuY3lMaW1pdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUNGUG9sbGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFDRlBQZXJpb2QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFDRlBNYXhEdXJhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uUmVzcG9uc2VUaW1lT3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExUG93ZXJNYW5hZ2VtZW50TW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRTU0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGVzaXJlZEJTU1R5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExT3BlcmF0aW9uYWxSYXRlU2V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUJlYWNvblBlcmlvZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEVElNUGVyaW9kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUFzc29jaWF0aW9uUmVzcG9uc2VUaW1lT3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURpc2Fzc29jaWF0ZVJlYXNvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEaXNhc3NvY2lhdGVTdGF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlYXV0aGVudGljYXRlUmVhc29uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlYXV0aGVudGljYXRlU3RhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFBdXRoZW50aWNhdGVGYWlsU3RhdHVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUF1dGhlbnRpY2F0ZUZhaWxTdGF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG0xIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG00IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MWMwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg0KSkKQEAgLTE0MDQsMjUgKzY2OSw2IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MGMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdJbmRleCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nV0VQT24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ1ZhbHVlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxYzAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikpCkBAIC0xNDM0LDMxICs2ODAsMTkgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0xlbmd0aCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTgwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUElDVkVycm9yQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBFeGNsdWRlZENvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX2NhdF9kb3QxMW1hYyBcCiAJCQlQODAyMTFESURfTUtTRUNUSU9OKDIpCiAjZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCiAjZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTUFDQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExUlRTVGhyZXNob2xkIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCkBAIC0xNDc2LDMyOSArNzEwLDE4IEBACiAJCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE4MDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1heFRyYW5zbWl0TVNEVUxpZmV0aW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYXhSZWNlaXZlTGlmZXRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1hbnVmYWN0dXJlcklEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFQcm9kdWN0SUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikpCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFUcmFuc21pdHRlZEZyYWdtZW50Q291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZhaWxlZENvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJldHJ5Q291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExTXVsdGlwbGVSZXRyeUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZyYW1lRHVwbGljYXRlQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUlRTU3VjY2Vzc0NvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJUU0ZhaWx1cmVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFBQ0tGYWlsdXJlQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUmVjZWl2ZWRGcmFnbWVudENvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZDU0Vycm9yQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVRyYW5zbWl0dGVkRnJhbWVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExV0VQVW5kZWNyeXB0YWJsZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczExIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIzKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjQpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI2KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjcpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyOCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI5KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzApIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMyKSB8IDB4MWMwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgIChQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9jYXRfZG90MTFwaHkgXAogCQkJUDgwMjExRElEX01LU0VDVElPTigzKQogI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDEpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVBIWVR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMUN1cnJlbnRSZWdEb21haW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVRlbXBUeXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFDaGFubmVsQWdpbGl0eVByZXNlbnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMUNoYW5uZWxBZ2lsaXR5RW5hYmxlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRQcmVhbWJsZUVuYWJsZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5QW50ZW5uYVRhYmxlX2RvdDExQ3VycmVudFR4QW50ZW5uYSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMURpdmVyc2l0eVN1cHBvcnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGVfZG90MTFDdXJyZW50UnhBbnRlbm5hIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMU51bWJlclN1cHBvcnRlZFBvd2VyTGV2ZWxzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFIb3BUaW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWxOdW1iZXIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFNYXhEd2VsbFRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50RHdlbGxUaW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudFNldCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRQYXR0ZXJuIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudEluZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxODAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCisgICAgICAgICAgICAgICAgICAgICAgIFA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDUpKQpAQCAtMTgwNiw5NyArNzI5LDYgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ0NBTW9kZVN1cHBvcnRlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDQ0FNb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExRURUaHJlc2hvbGQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFTaG9ydFByZWFtYmxlT3B0aW9uSW1wbGVtZW50ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFQQkNDT3B0aW9uSW1wbGVtZW50ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ1RpbWVyTWF4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nQ291bnRNYXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dUaW1lck1pbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ0NvdW50TWluIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUmVnRG9tYWluc1N1cHBvcnRlZFRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0ZWRUYWJsZV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0SW5kZXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFSZWdEb21haW5zU3VwcG9ydGVkVGFibGVfZG90MTFSZWdEb21haW5zU3VwcG9ydFZhbHVlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFBbnRlbm5hTGlzdEluZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFTdXBwb3J0ZWRUeEFudGVubmEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMVN1cHBvcnRlZFJ4QW50ZW5uYSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExRGl2ZXJzaXR5U2VsZWN0aW9uUnggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeEluZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VmFsdWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhJbmRleCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhWYWx1ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE0MDAwMDAwKQogI2RlZmluZSBESURtaWJfY2F0X2xueCBcCiAJCQlQODAyMTFESURfTUtTRUNUSU9OKDQpCiAjZGVmaW5lIERJRG1pYl9sbnhfbG54Q29uZmlnVGFibGUgXApAQCAtMTkwOCw1NyArNzQwLDYgQEAKIAkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQogI2RlZmluZSBESURtaWJfY2F0X3AyIFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oNSkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJNTVR4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJFYXJseUJlYWNvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyUmVjZWl2ZWRGcmFtZVN0YXRpc3RpY3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW11bmljYXRpb25UYWxsaWVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJBdXRoZW50aWNhdGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJBc3NvY2lhdGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJQb3dlclNhdmVVc2VyQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW1lbnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc01vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc0FsbG93IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzRGVueSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkNoYW5uZWxJbmZvUmVzdWx0cyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDEwMDAwMDAwKQogI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWMgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgyKSkKQEAgLTE5NjYsNTU5ICs3NDcsMTEgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duTUFDQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkRlc2lyZWRTU0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duQ2hhbm5lbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93blNTSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25BVElNV2luZG93IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU3lzdGVtU2NhbGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNYXhEYXRhTGVuZ3RoIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBNRW5hYmxlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQTUVQUyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNdWx0aWNhc3RSZWNlaXZlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1heFNsZWVwRHVyYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUE1Ib2xkb3ZlckR1cmF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bk5hbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duRFRJTVBlcmlvZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5SUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjUpIHwgMHgwODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjYpIHwgMHgwODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjcpIHwgMHgwODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjgpIHwgMHgwODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRmxhZ3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQXV0aGVudGljYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWF4QXNzb2NpYXRlZFN0YXRpb25zIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlR4Q29udHJvbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZSb2FtaW5nTW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZIb3N0QXV0aGVudGljYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUmN2Q3JjRXJyb3IgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQWx0UmV0cnlDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZCZWFjb25JbnRlcnZhbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNZWRpdW1PY2N1cGFuY3lMaW1pdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBQZXJpb2QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQ0ZQTWF4RHVyYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQ0ZQRmxhZ3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU1RBUENGSW5mbyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0MikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQcmlvcml0eVFVc2FnZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0MykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZUSU1DdHJsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQ0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlRoaXJ0eTJUYWxseSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0NSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZFbmhTZWN1cml0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0NikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTaG9ydFByZWFtYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQ3KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkV4Y2x1ZGVMb25nUHJlYW1ibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQXV0aGVudGljYXRpb25Sc3BUTyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0OSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZCYXNpY1JhdGVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlN1cHBvcnRlZFJhdGVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkNyZWF0ZUlCU1MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJQcm9taXNjdW91c01vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQ1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2w0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyQmVoYXZpb3IgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSkKLSNkZWZpbmUgRElEbWliX3AyX3AyQmVoYXZpb3JfcDJUaWNrVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJNYXhMb2FkVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyUGFnZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyT2Zmc2V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyRExCdWZmZXJMZW5ndGggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJQUklJZGVudGl0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlBSSVN1cFJhbmdlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyQ0ZJQWN0UmFuZ2VzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyTklDU2VyaWFsTnVtYmVyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyTklDSWRlbnRpdHkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJNRklTdXBSYW5nZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJDRklTdXBSYW5nZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJDaGFubmVsTGlzdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJSZWd1bGF0b3J5RG9tYWlucyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJUZW1wVHlwZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJTVEFJZGVudGl0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJTVEFTdXBSYW5nZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJNRklBY3RSYW5nZXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyU1RBQ0ZJQWN0UmFuZ2VzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkJ1aWxkU2VxdWVuY2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyUHJpbWFyeUZXSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyU2Vjb25kYXJ5RldJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJUZXJ0aWFyeUZXSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjIpIHwgMHgxMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX3AyX3AyTUFDIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikpCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMlBvcnRTdGF0dXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50U1NJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRCU1NJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUNRIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5QVNMIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5QU5MIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5Q1EgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHlBU0wgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5QU5MIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudEJlYWNvbkludGVydmFsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMlN0YUN1cnJlbnRTY2FsZVRocmVzaG9sZHMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQVBDdXJyZW50U2NhbGVUaHJlc2hvbGRzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMlByb3RvY29sUnNwVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJTaG9ydFJldHJ5TGltaXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyTG9uZ1JldHJ5TGltaXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyTWF4VHJhbnNtaXRMaWZldGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJNYXhSZWNlaXZlTGlmZXRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ0ZQb2xsYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJBdXRoZW50aWNhdGlvbkFsZ29yaXRobXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMk93bk1BQ0FkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW0gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW1fcDJQSFlUeXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW1fcDJDdXJyZW50Q2hhbm5lbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtX3AyQ3VycmVudFBvd2VyU3RhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbV9wMkNDQU1vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbV9wMlN1cHBvcnRlZERhdGFSYXRlcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtX3AyVHhQb3dlck1heCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTgwMDAwMDApCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtaWIuaAppbmRleCAxOTg2N2ZkLi45Y2Q3MmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbWliLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1pYi5oCkBAIC05Myw3ICs5Myw3IEBACiAvKiBjYXRlZ29yeSBtZXRhZGF0YSBsaXN0ICovCiAKIGV4dGVybiBjYXRsaXN0aXRlbV90IG1pYl9jYXRsaXN0W107Ci1leHRlcm4gVUlOVDMyIG1pYl9jYXRsaXN0X3NpemU7CitleHRlcm4gdTMyIG1pYl9jYXRsaXN0X3NpemU7CiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtc2cuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtc2cuaAppbmRleCA0ZDZkZmNjLi42ZTY1OWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbXNnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1zZy5oCkBAIC05Myw3ICs5Myw3IEBACiAvKiBjYXRlZ29yeSBtZXRhZGF0YSBsaXN0ICovCiAKIGV4dGVybiBjYXRsaXN0aXRlbV90IG1zZ19jYXRsaXN0W107Ci1leHRlcm4gVUlOVDMyIG1zZ19jYXRsaXN0X3NpemU7CitleHRlcm4gdTMyIG1zZ19jYXRsaXN0X3NpemU7CiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaAppbmRleCA3MTVmNGIyLi5kMjI1OGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oCkBAIC01MCw0NyArNTAsMzYgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldAogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91bmszOTJfdAltaWJhdHRyaWJ1dGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXRfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldAogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91bmszOTJfdAltaWJhdHRyaWJ1dGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3Bvd2VybWdtdAotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXBvd2VybWdtdG1vZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJd2FrZXVwCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlY2VpdmVkdGltcwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX3Bvd2VybWdtdF90OwotCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2NhbgogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlic3N0eXBlCTsKIAlwODAyMTFpdGVtX3BzdHI2X3QJYnNzaWQJOwotCVVJTlQ4CXBhZF8wQ1sxXQk7CisJdTgJcGFkXzBDWzFdCTsKIAlwODAyMTFpdGVtX3BzdHIzMl90CXNzaWQJOwotCVVJTlQ4CXBhZF8xRFszXQk7CisJdTgJcGFkXzFEWzNdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXNjYW50eXBlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXByb2JlZGVsYXkJOwogCXA4MDIxMWl0ZW1fcHN0cjE0X3QJY2hhbm5lbGxpc3QJOwotCVVJTlQ4CXBhZF8yQ1sxXQk7CisJdTgJcGFkXzJDWzFdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CW1pbmNoYW5uZWx0aW1lCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CW1heGNoYW5uZWx0aW1lCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwpAQCAtMTAwLDE3ICs4OSwxNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJzc2luZGV4CTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJc2lnbmFsCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CW5vaXNlCTsKIAlwODAyMTFpdGVtX3BzdHI2X3QJYnNzaWQJOwotCVVJTlQ4CXBhZF8zQ1sxXQk7CisJdTgJcGFkXzNDWzFdCTsKIAlwODAyMTFpdGVtX3BzdHIzMl90CXNzaWQJOwotCVVJTlQ4CXBhZF80RFszXQk7CisJdTgJcGFkXzREWzNdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJzc3R5cGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYmVhY29ucGVyaW9kCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWR0aW1wZXJpb2QJOwpAQCAtMTQ3LDExNSArMTM2LDEzIEBACiAJcDgwMjExaXRlbV91aW50MzJfdAlzdXBwcmF0ZTgJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9qb2luCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlic3NpZAk7Ci0JVUlOVDgJcGFkXzVDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWpvaW5mYWlsdXJldGltZW91dAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGUxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlMwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU3CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTgJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGUyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU1CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTYJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU4CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfam9pbl90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzZDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWF1dGhlbnRpY2F0aW9udHlwZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhdXRoZW50aWNhdGlvbmZhaWx1cmV0aW1lb3V0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF83Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWFzb25jb2RlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX2Fzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF84Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhc3NvY2lhdGVmYWlsdXJldGltZW91dAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljZnBvbGxhYmxlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNmcG9sbHJlcQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwcml2YWN5CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWxpc3RlbmludGVydmFsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfYXNzb2NpYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJbmV3YXBhZGRyZXNzCTsKLQlVSU5UOAlwYWRfOUNbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVhc3NvY2lhdGVmYWlsdXJldGltZW91dAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljZnBvbGxhYmxlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNmcG9sbHJlcQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwcml2YWN5CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWxpc3RlbmludGVydmFsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xMENbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVhc29uY29kZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfcmVzZXQKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlzZXRkZWZhdWx0bWliCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJbWFjYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzExQ1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX3Jlc2V0X3Q7Ci0KIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zdGFydAogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV9wc3RyMzJfdAlzc2lkCTsKLQlVSU5UOAlwYWRfMTJEWzNdCTsKKwl1OAlwYWRfMTJEWzNdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJzc3R5cGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYmVhY29ucGVyaW9kCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWR0aW1wZXJpb2QJOwpAQCAtMjg4LDcyICsxNzUsMjAgQEAKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfc3RhcnRfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExaW5kX2F1dGhlbnRpY2F0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xM0NbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXV0aGVudGljYXRpb250eXBlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExaW5kX2F1dGhlbnRpY2F0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFpbmRfZGVhdXRoZW50aWNhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTRDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlYXNvbmNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFpbmRfZGVhdXRoZW50aWNhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExaW5kX2Fzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xNUNbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYWlkCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExaW5kX2Fzc29jaWF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFpbmRfcmVhc3NvY2lhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTZDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFpZAk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CW9sZGFwYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzE3Q1sxXQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMWluZF9yZWFzc29jaWF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFpbmRfZGlzYXNzb2NpYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzE4Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWFzb25jb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExaW5kX2Rpc2Fzc29jaWF0ZV90OwotCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGUKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJaWZzdGF0ZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2xueHJlcV9pZnN0YXRlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfd2xhbnNuaWZmCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWVuYWJsZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXByaXNtaGVhZGVyCTsKQEAgLTM2Niw5ICsyMDEsOSBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXAKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlkZWNyeXB0CTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWVuY3J5cHQJOwpAQCAtMzc2LDkgKzIxMSw5IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5CiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZGJtCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWxpbmsJOwpAQCAtMzg4LDE3MyArMjIzLDI5IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW4KIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fcHN0cjMyX3QJc3NpZAk7Ci0JVUlOVDgJcGFkXzE5RFszXQk7CisJdTgJcGFkXzE5RFszXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlhdXRodHlwZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2xueHJlcV9hdXRvam9pbl90OwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJaG9zdHRpbWUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbWFjdGltZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJzc2kJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJc3EJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJc2lnbmFsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW5vaXNlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJhdGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJaXN0eAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlmcm1sZW4JOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhpbmRfcm9hbQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlYXNvbgk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19sbnhpbmRfcm9hbV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfam9pbgotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJYnNzaWQJOwotCVVJTlQ4CXBhZF8yMENbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGUyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU1CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTYJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU4CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGUzCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU2CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTcJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlOAk7Ci0JcDgwMjExaXRlbV9wc3RyMzJfdAlzc2lkCTsKLQlVSU5UOAlwYWRfMjFEWzNdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNoYW5uZWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXV0aHR5cGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9qb2luX3Q7Ci0KIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VuazEwMjRfdAlwZGEJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkY2lzCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdW5rMTAyNF90CWNpcwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX3JlYWRjaXNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfc3RhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAllbmFibGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3JlYWQKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhZGRyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWxlbgk7Ci0JcDgwMjExaXRlbV91bmsxMDI0X3QJZGF0YQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfcmVhZF90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF93cml0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbGVuCTsKLQlwODAyMTFpdGVtX3VuazEwMjRfdAlkYXRhCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF93cml0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfbG93X2xldmVsCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY29tbWFuZAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwYXJhbTAJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcGFyYW0xCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXBhcmFtMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2xvd19sZXZlbF90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfdGVzdF9jb21tYW5kCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJdGVzdGNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJdGVzdHBhcmFtCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJc3RhdHVzCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AwCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AyCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX3Rlc3RfY29tbWFuZF90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfbW1pX3JlYWQKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhZGRyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXZhbHVlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfbW1pX3JlYWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX21taV93cml0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJZGF0YQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX21taV93cml0ZV90OwotCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfc3RhdGUKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZW5hYmxlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWV4ZWFkZHIJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CkBAIC01NjIsOSArMjUzLDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3dyaXRlCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJbGVuCTsKIAlwODAyMTFpdGVtX3VuazQwOTZfdAlkYXRhCTsKQEAgLTU3Myw3MiArMjY0LDIyIEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3N0YXRlCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWVuYWJsZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfd3JpdGUKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYWRkcgk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlsZW4JOwogCXA4MDIxMWl0ZW1fdW5rNDA5Nl90CWRhdGEJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3dyaXRlX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9tbV9zdGF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWVuYWJsZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX21tX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9kdW1wX3N0YXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbGV2ZWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9kdW1wX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9jaGFubmVsX2luZm8KLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsbGlzdAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsZHdlbGx0aW1lCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbnVtY2hpbmZvCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mb190OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHMKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXZnbm9pc2VsZXZlbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwZWFrbm9pc2VsZXZlbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlic3NhY3RpdmUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcGNmYWN0aXZlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9lbmFibGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2VuYWJsZV90OwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaAppbmRleCBiZDRjMTYyOS4uNmNjMTZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaApAQCAtMTcyLDE0ICsxNzIsMTQgQEAKIC8qIE5vdGU6IFRoZXNlIG9mZnNldHMgYXJlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZSBkYXRhICAgICAgICovCiAKICNkZWZpbmUgV0xBTl9CRUFDT05fT0ZGX1RTCQkJMAotI2RlZmluZSBXTEFOX0JFQUNPTl9PRkZfQkNOX0lOVAkJCTgKKyNkZWZpbmUgV0xBTl9CRUFDT05fT0ZGX0JDTl9pbnQJCQk4CiAjZGVmaW5lIFdMQU5fQkVBQ09OX09GRl9DQVBJTkZPCQkJMTAKICNkZWZpbmUgV0xBTl9CRUFDT05fT0ZGX1NTSUQJCQkxMgogCiAjZGVmaW5lIFdMQU5fRElTQVNTT0NfT0ZGX1JFQVNPTgkJMAogCiAjZGVmaW5lIFdMQU5fQVNTT0NSRVFfT0ZGX0NBUF9JTkZPCQkwCi0jZGVmaW5lIFdMQU5fQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQJCTIKKyNkZWZpbmUgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX2ludAkJMgogI2RlZmluZSBXTEFOX0FTU09DUkVRX09GRl9TU0lECQkJNAogCiAjZGVmaW5lIFdMQU5fQVNTT0NSRVNQX09GRl9DQVBfSU5GTwkJMApAQCAtMTg4LDcgKzE4OCw3IEBACiAjZGVmaW5lIFdMQU5fQVNTT0NSRVNQX09GRl9TVVBQX1JBVEVTCQk2CiAKICNkZWZpbmUgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTwkJMAotI2RlZmluZSBXTEFOX1JFQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQJCTIKKyNkZWZpbmUgV0xBTl9SRUFTU09DUkVRX09GRl9MSVNURU5faW50CQkyCiAjZGVmaW5lIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ1VSUl9BUAkJNAogI2RlZmluZSBXTEFOX1JFQVNTT0NSRVFfT0ZGX1NTSUQJCTEwCiAKQEAgLTIwMCw3ICsyMDAsNyBAQAogI2RlZmluZSBXTEFOX1BST0JFUkVRX09GRl9TU0lECQkJMAogCiAjZGVmaW5lIFdMQU5fUFJPQkVSRVNQX09GRl9UUwkJCTAKLSNkZWZpbmUgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9JTlQJCTgKKyNkZWZpbmUgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9pbnQJCTgKICNkZWZpbmUgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPCQkxMAogI2RlZmluZSBXTEFOX1BST0JFUkVTUF9PRkZfU1NJRAkJCTEyCiAKQEAgLTI0NSw4MiArMjQ1LDgyIEBACiAKIHR5cGVkZWYgc3RydWN0IHdsYW5faWUKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOworCXU4CWVpZDsKKwl1OAlsZW47CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfdDsKIAogLyotLSBTZXJ2aWNlIFNldCBJZGVudGl0eSAoU1NJRCkgIC0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfc3NpZAogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJc3NpZFsxXTsgIC8qIG1heSBiZSB6ZXJvLCBwdHJzIG1heSBvdmVybGFwICovCisJdTgJZWlkOworCXU4CWxlbjsKKwl1OAlzc2lkWzFdOyAgLyogbWF5IGJlIHplcm8sIHB0cnMgbWF5IG92ZXJsYXAgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9zc2lkX3Q7CiAKIC8qLS0gU3VwcG9ydGVkIFJhdGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CXJhdGVzWzFdOyAgLyogaGFkIGJldHRlciBiZSBhdCBMRUFTVCBvbmUhICovCisJdTgJZWlkOworCXU4CWxlbjsKKwl1OAlyYXRlc1sxXTsgIC8qIGhhZCBiZXR0ZXIgYmUgYXQgTEVBU1Qgb25lISAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX3N1cHBfcmF0ZXNfdDsKIAogLyotLSBGSCBQYXJhbWV0ZXIgU2V0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfZmhfcGFybXMKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQxNglkd2VsbDsKLQlVSU5UOAlob3BzZXQ7Ci0JVUlOVDgJaG9wcGF0dGVybjsKLQlVSU5UOAlob3BpbmRleDsKKwl1OAllaWQ7CisJdTgJbGVuOworCXUxNglkd2VsbDsKKwl1OAlob3BzZXQ7CisJdTgJaG9wcGF0dGVybjsKKwl1OAlob3BpbmRleDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9maF9wYXJtc190OwogCiAvKi0tIERTIFBhcmFtZXRlciBTZXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9kc19wYXJtcwogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJY3Vycl9jaDsKKwl1OAllaWQ7CisJdTgJbGVuOworCXU4CWN1cnJfY2g7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfZHNfcGFybXNfdDsKIAogLyotLSBDRiBQYXJhbWV0ZXIgU2V0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9jZl9wYXJtcwogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJY2ZwX2NudDsKLQlVSU5UOAljZnBfcGVyaW9kOwotCVVJTlQxNgljZnBfbWF4ZHVyOwotCVVJTlQxNgljZnBfZHVycmVtYWluaW5nOworCXU4CWVpZDsKKwl1OAlsZW47CisJdTgJY2ZwX2NudDsKKwl1OAljZnBfcGVyaW9kOworCXUxNgljZnBfbWF4ZHVyOworCXUxNgljZnBfZHVycmVtYWluaW5nOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX2NmX3Bhcm1zX3Q7CiAKIC8qLS0gVElNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX3RpbQogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJZHRpbV9jbnQ7Ci0JVUlOVDgJZHRpbV9wZXJpb2Q7Ci0JVUlOVDgJYml0bWFwX2N0bDsKLQlVSU5UOAl2aXJ0X2JtWzFdOworCXU4CWVpZDsKKwl1OAlsZW47CisJdTgJZHRpbV9jbnQ7CisJdTgJZHRpbV9wZXJpb2Q7CisJdTgJYml0bWFwX2N0bDsKKwl1OAl2aXJ0X2JtWzFdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX3RpbV90OwogCiAvKi0tIElCU1MgUGFyYW1ldGVyIFNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9pYnNzX3Bhcm1zCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UMTYJYXRpbV93aW47CisJdTgJZWlkOworCXU4CWxlbjsKKwl1MTYJYXRpbV93aW47CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfaWJzc19wYXJtc190OwogCiAvKi0tIENoYWxsZW5nZSBUZXh0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9jaGFsbGVuZ2UKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CWNoYWxsZW5nZVsxXTsKKwl1OAllaWQ7CisJdTgJbGVuOworCXU4CWNoYWxsZW5nZVsxXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9jaGFsbGVuZ2VfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTMyOSw5ICszMjksOSBAQAogLyogcHJvdG90eXBlIHN0cnVjdHVyZSwgYWxsIG1nbXQgZnJhbWUgdHlwZXMgd2lsbCBzdGFydCB3aXRoIHRoZXNlIG1lbWJlcnMgKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfbWdtdAogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwkvKiBET0VTIE5PVCBpbmNsdWRlIENSQyAhISEhKi8KLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CS8qIERPRVMgTk9UIGluY2x1ZGUgQ1JDICEhISEqLworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKQEAgLTM0MiwxNiArMzQyLDE2IEBACiAvKi0tIEJlYWNvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9iZWFjb24KIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UNjQJCQkqdHM7Ci0JVUlOVDE2CQkJKmJjbl9pbnQ7Ci0JVUlOVDE2CQkJKmNhcF9pbmZvOworCXU2NAkJCSp0czsKKwl1MTYJCQkqYmNuX2ludDsKKwl1MTYJCQkqY2FwX2luZm87CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCXdsYW5faWVfc3NpZF90CQkqc3NpZDsKIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKQEAgLTM2Nyw5ICszNjcsOSBAQAogLyotLSBJQlNTIEFUSU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfaWJzc2F0aW0KIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOCoJCQlidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgqCQkJYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwpAQCAtMzg0LDE0ICszODQsMTQgQEAKIC8qLS0gRGlzYXNzb2NpYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2Rpc2Fzc29jCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKnJlYXNvbjsKKwl1MTYJCQkqcmVhc29uOwogCiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCkBAIC00MDAsMTUgKzQwMCwxNSBAQAogLyotLSBBc3NvY2lhdGlvbiBSZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXNzb2NyZXEKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOCoJCQlidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgqCQkJYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqY2FwX2luZm87Ci0JVUlOVDE2CQkJKmxpc3Rlbl9pbnQ7CisJdTE2CQkJKmNhcF9pbmZvOworCXUxNgkJCSpsaXN0ZW5faW50OwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3NzaWRfdAkJKnNzaWQ7CiAJd2xhbl9pZV9zdXBwX3JhdGVzX3QJKnN1cHBfcmF0ZXM7CkBAIC00MTgsMTYgKzQxOCwxNiBAQAogLyotLSBBc3NvY2lhdGlvbiBSZXNwb25zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXNzb2NyZXNwCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKmNhcF9pbmZvOwotCVVJTlQxNgkJCSpzdGF0dXM7Ci0JVUlOVDE2CQkJKmFpZDsKKwl1MTYJCQkqY2FwX2luZm87CisJdTE2CQkJKnN0YXR1czsKKwl1MTYJCQkqYWlkOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKIApAQCAtNDM2LDE2ICs0MzYsMTYgQEAKIC8qLS0gUmVhc3NvY2lhdGlvbiBSZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXEKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqY2FwX2luZm87Ci0JVUlOVDE2CQkJKmxpc3Rlbl9pbnQ7Ci0JVUlOVDgJCQkqY3Vycl9hcDsKKwl1MTYJCQkqY2FwX2luZm87CisJdTE2CQkJKmxpc3Rlbl9pbnQ7CisJdTgJCQkqY3Vycl9hcDsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9zc2lkX3QJCSpzc2lkOwogCXdsYW5faWVfc3VwcF9yYXRlc190CSpzdXBwX3JhdGVzOwpAQCAtNDU1LDE2ICs0NTUsMTYgQEAKIC8qLS0gUmVhc3NvY2lhdGlvbiBSZXNwb25zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXNwCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKmNhcF9pbmZvOwotCVVJTlQxNgkJCSpzdGF0dXM7Ci0JVUlOVDE2CQkJKmFpZDsKKwl1MTYJCQkqY2FwX2luZm87CisJdTE2CQkJKnN0YXR1czsKKwl1MTYJCQkqYWlkOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKIApAQCAtNDczLDkgKzQ3Myw5IEBACiAvKi0tIFByb2JlIFJlcXVlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlcQogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CkBAIC00ODksMTYgKzQ4OSwxNiBAQAogLyotLSBQcm9iZSBSZXNwb25zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfcHJvYmVyZXNwCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDY0CQkJKnRzOwotCVVJTlQxNgkJCSpiY25faW50OwotCVVJTlQxNgkJCSpjYXBfaW5mbzsKKwl1NjQJCQkqdHM7CisJdTE2CQkJKmJjbl9pbnQ7CisJdTE2CQkJKmNhcF9pbmZvOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3NzaWRfdAkJKnNzaWQ7CiAJd2xhbl9pZV9zdXBwX3JhdGVzX3QJKnN1cHBfcmF0ZXM7CkBAIC01MTEsMTYgKzUxMSwxNiBAQAogLyotLSBBdXRoZW50aWNhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXV0aGVuCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKmF1dGhfYWxnOwotCVVJTlQxNgkJCSphdXRoX3NlcTsKLQlVSU5UMTYJCQkqc3RhdHVzOworCXUxNgkJCSphdXRoX2FsZzsKKwl1MTYJCQkqYXV0aF9zZXE7CisJdTE2CQkJKnN0YXR1czsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9jaGFsbGVuZ2VfdAkqY2hhbGxlbmdlOwogCkBAIC01MjksMTQgKzUyOSwxNCBAQAogLyotLSBEZWF1dGhlbmljYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9kZWF1dGhlbgogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQxNgkJCSpyZWFzb247CisJdTE2CQkJKnJlYXNvbjsKIAogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbW9kLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtb2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjM2Y2My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKiBzcmMvcDgwMjExL3A4MDIxMW1vZC5jCi0qCi0qIE1vZHVsZSBlbnRyeSBhbmQgZXhpdCBmb3IgcDgwMjExCi0qCi0qIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIGxpbnV4LXdsYW4KLSoKLSogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYwotKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0qCi0qICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCi0qICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKLSogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKLSogICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKLSogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQotKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCi0qICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCi0qICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKLSogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKLSogICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcwotKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQotKiBtYWRlIGRpcmVjdGx5IHRvOgotKgotKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgotKiBpbmZvQGxpbnV4LXdsYW4uY29tCi0qIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkKLSogSW50ZXJzaWwgQ29ycG9yYXRpb24gYXMgcGFydCBvZiBQUklTTShSKSBjaGlwc2V0IHByb2R1Y3QgZGV2ZWxvcG1lbnQuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcDgwMjExLm8gZW50cnkgYW5kIGV4aXQgcG9pbnRzIGRlZmluZWQgZm9yIGxpbnV4Ci0qIGtlcm5lbCBtb2R1bGVzLgotKgotKiBOb3RlczoKLSogLSBhbGwgbW9kdWxlIHBhcmFtZXRlcnMgZm9yICBwODAyMTEubyBzaG91bGQgYmUgZGVmaW5lZCBoZXJlLgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIFN5c3RlbSBJbmNsdWRlcyAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwyNSkpCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0KLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0jaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIFByb2plY3QgSW5jbHVkZXMgKi8KLQotI2luY2x1ZGUgInA4MDIxMXR5cGVzLmgiCi0jaW5jbHVkZSAicDgwMjExaGRyLmgiCi0jaW5jbHVkZSAicDgwMjExbWdtdC5oIgotI2luY2x1ZGUgInA4MDIxMWNvbnYuaCIKLSNpbmNsdWRlICJwODAyMTFtc2cuaCIKLSNpbmNsdWRlICJwODAyMTFuZXRkZXYuaCIKLSNpbmNsdWRlICJwODAyMTFyZXEuaCIKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIENvbnN0YW50cyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBNYWNyb3MgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgVHlwZXMgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCi0KLXN0YXRpYyBjaGFyICp2ZXJzaW9uID0gInA4MDIxMS5vOiAiIFdMQU5fUkVMRUFTRTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogLS1Nb2R1bGUgUGFyYW1ldGVycyAqLwotCi1pbnQgd2xhbl93YXRjaGRvZyA9IDUwMDA7Ci1tb2R1bGVfcGFyYW0od2xhbl93YXRjaGRvZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mod2xhbl93YXRjaGRvZywgInRyYW5zbWl0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIik7Ci0KLWludCB3bGFuX3dleHRfd3JpdGUgPSAwOwotI2lmIFdJUkVMRVNTX0VYVCA+IDEyCi1tb2R1bGVfcGFyYW0od2xhbl93ZXh0X3dyaXRlLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh3bGFuX3dleHRfd3JpdGUsICJlbmFibGUgd3JpdGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyIpOwotI2VuZGlmCi0KLSNpZmRlZiBXTEFOX0lOQ0xVREVfREVCVUcKLWludCB3bGFuX2RlYnVnPTA7Ci1tb2R1bGVfcGFyYW0od2xhbl9kZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mod2xhbl9kZWJ1ZywgInA4MDIxMSBkZWJ1ZyBsZXZlbCIpOwotI2VuZGlmCi0KLU1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwotCi1pbnQJaW5pdF9tb2R1bGUodm9pZCk7Ci12b2lkCWNsZWFudXBfbW9kdWxlKHZvaWQpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGluaXRfbW9kdWxlCi0qCi0qIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBjYWxsZWQgb25jZSBhdCBtb2R1bGUgbG9hZCB0aW1lLgotKgotKiBBcmd1bWVudHM6Ci0qCW5vbmUKLSoKLSogUmV0dXJuczoKLSoJMAktIHN1Y2Nlc3MKLSoJfjAJLSBmYWlsdXJlLCBtb2R1bGUgaXMgdW5sb2FkZWQuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJVE9ETzogZGVmaW5lCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgKGluc21vZCBvciBtb2Rwcm9iZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0gICAgICAgIERCRkVOVEVSOwotCi0jaWYgMAotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzICglcykgTG9hZGVkXG4iLCB2ZXJzaW9uLCBXTEFOX0JVSUxEX0RBVEUpOwotI2VuZGlmCi0KLQlwODAyMTFuZXRkZXZfc3RhcnR1cCgpOwotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcoTlVMTCwgV0xBTl9IT1RQTFVHX1NUQVJUVVApOwotI2VuZGlmCi0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGNsZWFudXBfbW9kdWxlCi0qCi0qIENhbGxlZCBhdCBtb2R1bGUgdW5sb2FkIHRpbWUuICBUaGlzIGlzIG91ciBsYXN0IGNoYW5jZSB0bwotKiBjbGVhbiB1cCBhZnRlciBvdXJzZWx2ZXMuCi0qCi0qIEFyZ3VtZW50czoKLSoJbm9uZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJVE9ETzogZGVmaW5lCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotICAgICAgICBEQkZFTlRFUjsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcoTlVMTCwgV0xBTl9IT1RQTFVHX1NIVVRET1dOKTsKLSNlbmRpZgotCXA4MDIxMW5ldGRldl9zaHV0ZG93bigpOwotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzIFVubG9hZGVkXG4iLCB2ZXJzaW9uKTsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm47Ci19Ci0KLUVYUE9SVF9TWU1CT0wocDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCk7Ci1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3dsYW5kZXYpOwotRVhQT1JUX1NZTUJPTChwODAyMTFuZXRkZXZfcngpOwotRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3dsYW5kZXYpOwotRVhQT1JUX1NZTUJPTCh3bGFuX3NldHVwKTsKLUVYUE9SVF9TWU1CT0wod2xhbl91bnNldHVwKTsKLUVYUE9SVF9TWU1CT0wocDgwMjExX3N1c3BlbmQpOwotRVhQT1JUX1NZTUJPTChwODAyMTFfcmVzdW1lKTsKLQotRVhQT1JUX1NZTUJPTChwODAyMTFza2JfZnJlZSk7Ci1FWFBPUlRfU1lNQk9MKHA4MDIxMXNrYl9yeG1ldGFfYXR0YWNoKTsKLQotRVhQT1JUX1NZTUJPTChwODAyMTF3ZXh0X2V2ZW50X2Fzc29jaWF0ZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbXNnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtc2cuaAppbmRleCBjMTRlOWZiLi4zYTU3NWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtc2cuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtc2cuaApAQCAtNzgsMTcgKzc4LDE3IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZwogewotCVVJTlQzMgltc2djb2RlOwotCVVJTlQzMgltc2dsZW47Ci0JVUlOVDgJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKKwl1MzIJbXNnY29kZTsKKwl1MzIJbXNnbGVuOworCXU4CWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ190OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dkCiB7Ci0JVUlOVDMyCW1zZ2NvZGU7Ci0JVUlOVDMyCW1zZ2xlbjsKLQlVSU5UOAlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCVVJTlQ4CWFyZ3NbMF07CisJdTMyCW1zZ2NvZGU7CisJdTMyCW1zZ2xlbjsKKwl1OAlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOworCXU4CWFyZ3NbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ2RfdDsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKaW5kZXggMmI3MDVlYS4uNTllNWFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKQEAgLTc5LDE1ICs3OSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNlbmRpZgogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTIKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFByb2plY3QgSW5jbHVkZXMgKi8KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogI2luY2x1ZGUgInA4MDIxMXR5cGVzLmgiCiAjaW5jbHVkZSAicDgwMjExaGRyLmgiCkBAIC0xMTEsMTUgKzEwOCw2IEBACiAvKiBMb2NhbCBUeXBlcyAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCi0KLSNkZWZpbmUgX19OT19WRVJTSU9OX18JCS8qIHByZXZlbnQgdGhlIHN0YXRpYyBkZWZpbml0aW9uICovCi0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19wODAyMTE7Ci0jZW5kaWYKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwogCiAvKiBTdXBwb3J0IGZ1bmN0aW9ucyAqLwpAQCAtMTM1LDc1ICsxMjMsMjYgQEAKIHN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9kb19pb2N0bChuZXRkZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CiBzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc2V0X21hY19hZGRyZXNzKG5ldGRldmljZV90ICpkZXYsIHZvaWQgKmFkZHIpOwogc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl90eF90aW1lb3V0KG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIGludCBwODAyMTFfcnhfdHlwZWRyb3AoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IGZjKTsKK3N0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBmYyk7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGludAotcDgwMjExbmV0ZGV2X3Byb2NfcmVhZCgKLQljaGFyCSpwYWdlLAotCWNoYXIJKipzdGFydCwKLQlvZmZfdAlvZmZzZXQsCi0JaW50CWNvdW50LAotCWludAkqZW9mLAotCXZvaWQJKmRhdGEpOworaW50IHdsYW5fd2F0Y2hkb2cgPSA1MDAwOworbW9kdWxlX3BhcmFtKHdsYW5fd2F0Y2hkb2csIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdsYW5fd2F0Y2hkb2csICJ0cmFuc21pdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyIpOworCitpbnQgd2xhbl93ZXh0X3dyaXRlID0gMTsKK21vZHVsZV9wYXJhbSh3bGFuX3dleHRfd3JpdGUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdsYW5fd2V4dF93cml0ZSwgImVuYWJsZSB3cml0ZSB3aXJlbGVzcyBleHRlbnNpb25zIik7CisKKyNpZmRlZiBXTEFOX0lOQ0xVREVfREVCVUcKK2ludCB3bGFuX2RlYnVnPTA7Cittb2R1bGVfcGFyYW0od2xhbl9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2xhbl9kZWJ1ZywgInA4MDIxMSBkZWJ1ZyBsZXZlbCIpOwogI2VuZGlmCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcDgwMjExa25ldGRldl9zdGFydHVwCi0qCi0qIEluaXRpYWxpemUgdGhlIHdsYW5kZXZpY2UvbmV0ZGV2aWNlIHBhcnQgb2YgODAyLjExIHNlcnZpY2VzIGF0Ci0qIGxvYWQgdGltZS4KLSoKLSogQXJndW1lbnRzOgotKglub25lCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwODAyMTFuZXRkZXZfc3RhcnR1cCh2b2lkKQotewotCURCRkVOVEVSOwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlpZiAoaW5pdF9uZXQucHJvY19uZXQgIT0gTlVMTCkgewotCQlwcm9jX3A4MDIxMSA9IGNyZWF0ZV9wcm9jX2VudHJ5KAotCQkJCSJwODAyMTEiLAotCQkJCShTX0lGRElSfFNfSVJVR098U19JWFVHTyksCi0JCQkJaW5pdF9uZXQucHJvY19uZXQpOwotCX0KLSNlbmRpZgotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcDgwMjExa25ldGRldl9zaHV0ZG93bgotKgotKiBTaHV0ZG93biB0aGUgd2xhbmRldmljZS9uZXRkZXZpY2UgcGFydCBvZiA4MDIuMTEgc2VydmljZXMgYXQKLSogdW5sb2FkIHRpbWUuCi0qCi0qIEFyZ3VtZW50czoKLSoJbm9uZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLXA4MDIxMW5ldGRldl9zaHV0ZG93bih2b2lkKQotewotCURCRkVOVEVSOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaWYgKHByb2NfcDgwMjExICE9IE5VTEwpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInA4MDIxMSIsIGluaXRfbmV0LnByb2NfbmV0KTsKLQl9Ci0jZW5kaWYKLQlEQkZFWElUOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcDgwMjExa25ldGRldl9pbml0CiAqCiAqIEluaXQgbWV0aG9kIGZvciBhIExpbnV4IG5ldGRldmljZS4gIENhbGxlZCBpbiByZXNwb25zZSB0bwpAQCAtMjg1LDEwICsyMjQsNyBAQAogCWlmICggd2xhbmRldi0+b3BlbiAhPSBOVUxMKSB7CiAJCXJlc3VsdCA9IHdsYW5kZXYtPm9wZW4od2xhbmRldik7CiAJCWlmICggcmVzdWx0ID09IDAgKSB7Ci0jaWYgKCBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsNDMpICkKLQkJCW5ldGRldi0+aW50ZXJydXB0ID0gMDsKLSNlbmRpZgotCQkJcDgwMjExbmV0ZGV2X3N0YXJ0X3F1ZXVlKHdsYW5kZXYpOworCQkJbmV0aWZfc3RhcnRfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIAkJCXdsYW5kZXYtPnN0YXRlID0gV0xBTl9ERVZJQ0VfT1BFTjsKIAkJfQogCX0gZWxzZSB7CkBAIC0zMjMsNyArMjU5LDcgQEAKIAkJcmVzdWx0ID0gd2xhbmRldi0+Y2xvc2Uod2xhbmRldik7CiAJfQogCi0JcDgwMjExbmV0ZGV2X3N0b3BfcXVldWUod2xhbmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCXdsYW5kZXYtPnN0YXRlID0gV0xBTl9ERVZJQ0VfQ0xPU0VEOwogCiAJREJGRVhJVDsKQEAgLTM3Niw3ICszMTIsNyBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCW5ldGRldmljZV90ICAgICAqZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwogCXA4MDIxMV9oZHJfYTNfdCAqaGRyOwotCVVJTlQxNiBmYzsKKwl1MTYgZmM7CiAKICAgICAgICAgREJGRU5URVI7CiAKQEAgLTQ3OCwxNSArNDE0LDYgQEAKIAltZW1zZXQoJnA4MDIxMV9oZHIsIDAsIHNpemVvZihwODAyMTFfaGRyX3QpKTsKIAltZW1zZXQoJnA4MDIxMV93ZXAsIDAsIHNpemVvZihwODAyMTFfbWV0YXdlcF90KSk7CiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0JaWYgKCB0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkKikmKG5ldGRldi0+dGJ1c3kpKSAhPSAwICkgewotCQkvKiBXZSd2ZSBiZWVuIGNhbGxlZCB3LyB0YnVzeSBzZXQsIGhhcyB0aGUgdHggKi8KLQkJLyogcGF0aCBzdGFsbGVkPyAgICovCi0JCVdMQU5fTE9HX0RFQlVHKDEsICJjYWxsZWQgd2hlbiB0YnVzeSBzZXRcbiIpOwotCQlyZXN1bHQgPSAxOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0jZWxzZQogCWlmICggbmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpICkgewogCQlXTEFOX0xPR19ERUJVRygxLCAiY2FsbGVkIHdoZW4gcXVldWUgc3RvcHBlZC5cbiIpOwogCQlyZXN1bHQgPSAxOwpAQCAtNDk1LDEyICs0MjIsNiBAQAogCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCi0JLyogTm8gdGltZW91dCBoYW5kbGluZyBoZXJlLCAyLjMuMzgrIGtlcm5lbHMgY2FsbCB0aGUKLQkgKiB0aW1lb3V0IGZ1bmN0aW9uIGRpcmVjdGx5LgotCSAqIFRPRE86IEFkZCB0aW1lb3V0IGhhbmRsaW5nLgotCSovCi0jZW5kaWYKLQogCS8qIENoZWNrIHRvIHNlZSB0aGF0IGEgdmFsaWQgbW9kZSBpcyBzZXQgKi8KIAlzd2l0Y2goIHdsYW5kZXYtPm1hY21vZGUgKSB7CiAJY2FzZSBXTEFOX01BQ01PREVfSUJTU19TVEE6CkBAIC01MTMsNyArNDM0LDcgQEAKIAkJICogVE9ETzogd2UgbmVlZCBhIHNhbmVyIHdheSB0byBoYW5kbGUgdGhpcwogCQkgKi8KIAkJaWYoc2tiLT5wcm90b2NvbCAhPSBFVEhfUF84MDIxMV9SQVcpIHsKLQkJCXA4MDIxMW5ldGRldl9zdGFydF9xdWV1ZSh3bGFuZGV2KTsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJCQlXTEFOX0xPR19OT1RJQ0UoCiAJCQkJIlR4IGF0dGVtcHQgcHJpb3IgdG8gYXNzb2NpYXRpb24sIGZyYW1lIGRyb3BwZWQuXG4iKTsKIAkJCXdsYW5kZXYtPmxpbnV4X3N0YXRzLnR4X2Ryb3BwZWQrKzsKQEAgLTU1Nyw3ICs0NzgsNyBAQAogCWlmICggdHhyZXN1bHQgPT0gMCkgewogCQkvKiBzdWNjZXNzIGFuZCBtb3JlIGJ1ZiAqLwogCQkvKiBhdmFpbCwgcmU6IGh3X3R4ZGF0YSAqLwotCQlwODAyMTFuZXRkZXZfd2FrZV9xdWV1ZSh3bGFuZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCQlyZXN1bHQgPSAwOwogCX0gZWxzZSBpZiAoIHR4cmVzdWx0ID09IDEgKSB7CiAJCS8qIHN1Y2Nlc3MsIG5vIG1vcmUgYXZhaWwgKi8KQEAgLTYxOSw3ICs1NDAsNyBAQAogCiBzdGF0aWMgaW50IHA4MDIxMW5ldGRldl9ldGh0b29sKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQogewotCVVJTlQzMiBldGhjbWQ7CisJdTMyIGV0aGNtZDsKIAlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGluZm87CiAJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGE7CiAKQEAgLTY4Niw3ICs2MDcsNyBAQAogKgkJLUVGQVVMVCBtZW1vcnkgZmF1bHQgY29weWluZyBtc2cgZnJvbSB1c2VyIGJ1ZmZlcgogKgkJLUVOT01FTSB1bmFibGUgdG8gYWxsb2NhdGUga2VybmVsIG1zZyBidWZmZXIKICoJCS1FTk9TWVMJYmFkIG1hZ2ljLCBpdCB0aGUgY21kIHJlYWxseSBmb3IgdXM/Ci0qCQktRUlOVFIJc2xlZXBpbmcgb24gY21kLCBhd2FrZW5lZCBieSBzaWduYWwsIGNtZCBjYW5jZWxsZWQuCisqCQktRWludFIJc2xlZXBpbmcgb24gY21kLCBhd2FrZW5lZCBieSBzaWduYWwsIGNtZCBjYW5jZWxsZWQuCiAqCiAqIENhbGwgQ29udGV4dDoKICoJUHJvY2VzcyB0aHJlYWQgKGlvY3RsIGNhbGxlcikuICBUT0RPOiBTTVAgc3VwcG9ydCBtYXkgcmVxdWlyZQpAQCAtNjk3LDIxICs2MTgsMTEgQEAKIAlpbnQJCQlyZXN1bHQgPSAwOwogCXA4MDIxMWlvY3RsX3JlcV90CSpyZXEgPSAocDgwMjExaW9jdGxfcmVxX3QqKWlmcjsKIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCVVJTlQ4CQkJKm1zZ2J1ZjsKKwl1OAkJCSptc2didWY7CiAJREJGRU5URVI7CiAKIAlXTEFOX0xPR19ERUJVRygyLCAicngnZCBpb2N0bCwgY21kPSVkLCBsZW49JWRcbiIsIGNtZCwgcmVxLT5sZW4pOwogCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTMKLQkvKiBJcyB0aGlzIGEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBpb2N0bD8gKi8KLQlpZiAoKGNtZCA+PSBTSU9DSVdGSVJTVCkgJiYgKGNtZCA8PSBTSU9DSVdMQVNUKSkgewotCQlpZiAoKHJlc3VsdCA9IHA4MDIxMXdleHRfc3VwcG9ydF9pb2N0bChkZXYsIGlmciwgY21kKSkKLQkJICAgICE9ICgtRU9QTk9UU1VQUCkpIHsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCX0KLSNlbmRpZgotCiAjaWZkZWYgU0lPQ0VUSFRPT0wKIAlpZiAoY21kID09IFNJT0NFVEhUT09MKSB7CiAJCXJlc3VsdCA9IHA4MDIxMW5ldGRldl9ldGh0b29sKHdsYW5kZXYsICh2b2lkIF9fdXNlciAqKSBpZnItPmlmcl9kYXRhKTsKQEAgLTc5MiwxNSArNzAzLDkgQEAKIAogCURCRkVOVEVSOwogCS8qIElmIHdlJ3JlIHJ1bm5pbmcsIHdlIGRvbid0IGFsbG93IE1BQyBhZGRyZXNzIGNoYW5nZXMgKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0JaWYgKCBkZXYtPnN0YXJ0KSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotI2Vsc2UKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotI2VuZGlmCiAKIAkvKiBTZXQgdXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycy4gKi8KIAltaWJhdHRyID0gJmRvdDExcmVxLm1pYmF0dHJpYnV0ZTsKQEAgLTgzMyw3ICs3MzgsNyBAQAogCXJlc3VsdGNvZGUtPmRhdGEgPSAwOwogCiAJLyogbm93IGZpcmUgdGhlIHJlcXVlc3QgKi8KLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KGRldi0+bWxfcHJpdiwgKFVJTlQ4ICopJmRvdDExcmVxKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KGRldi0+bWxfcHJpdiwgKHU4ICopJmRvdDExcmVxKTsKIAogCS8qIElmIHRoZSByZXF1ZXN0IHdhc24ndCBzdWNjZXNzZnVsLCByZXBvcnQgYW4gZXJyb3IgYW5kIGRvbid0CiAJICogY2hhbmdlIHRoZSBuZXRkZXYgYWRkcmVzcwpAQCAtOTA5LDEzICs4MTQsMTEgQEAKIAkJICAgICAodW5zaWduZWQgbG9uZyl3bGFuZGV2KTsKIAogCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdHJ1Y3QgZGV2aWNlICovCi0JZGV2ID0ga21hbGxvYyhzaXplb2YobmV0ZGV2aWNlX3QpLCBHRlBfQVRPTUlDKTsKKwlkZXYgPSBhbGxvY19uZXRkZXYoMCwid2xhbiVkIixldGhlcl9zZXR1cCk7CiAJaWYgKCBkZXYgPT0gTlVMTCApIHsKIAkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBhbGxvYyBuZXRkZXYuXG4iKTsKIAkJcmVzdWx0ID0gMTsKIAl9IGVsc2UgewotCQltZW1zZXQoIGRldiwgMCwgc2l6ZW9mKG5ldGRldmljZV90KSk7Ci0JCWV0aGVyX3NldHVwKGRldik7CiAJCXdsYW5kZXYtPm5ldGRldiA9IGRldjsKIAkJZGV2LT5tbF9wcml2ID0gd2xhbmRldjsKIAkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPQlwODAyMTFrbmV0ZGV2X2hhcmRfc3RhcnRfeG1pdDsKQEAgLTkzMCwyMSArODMzLDEyIEBACiAJCWRldi0+b3BlbiA9CQlwODAyMTFrbmV0ZGV2X29wZW47CiAJCWRldi0+c3RvcCA9CQlwODAyMTFrbmV0ZGV2X3N0b3A7CiAKLSNpZmRlZiBDT05GSUdfTkVUX1dJUkVMRVNTCi0jaWYgKChXSVJFTEVTU19FWFQgPCAxNykgJiYgKFdJUkVMRVNTX0VYVCA8IDIxKSkKKyNpZiAoV0lSRUxFU1NfRVhUIDwgMjEpCiAJCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcDgwMjExd2V4dF9nZXRfd2lyZWxlc3Nfc3RhdHM7CiAjZW5kaWYKLSNpZiBXSVJFTEVTU19FWFQgPiAxMgogCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnA4MDIxMXdleHRfaGFuZGxlcl9kZWY7Ci0jZW5kaWYKLSNlbmRpZgogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkgKQotCQlkZXYtPnRidXN5ID0gMTsKLQkJZGV2LT5zdGFydCA9IDA7Ci0jZWxzZQogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0jZW5kaWYKICNpZmRlZiBIQVZFX0NIQU5HRV9NVFUKIAkJZGV2LT5jaGFuZ2VfbXR1ID0gd2xhbl9jaGFuZ2VfbXR1OwogI2VuZGlmCkBAIC0xMDI3LDQ0ICs5MjEsMTIgQEAKIGludCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKIHsKIAlpbnQJCWkgPSAwOwotCW5ldGRldmljZV90CSpkZXYgPSB3bGFuZGV2LT5uZXRkZXY7CiAKIAlEQkZFTlRFUjsKIAotCWkgPSBkZXZfYWxsb2NfbmFtZSh3bGFuZGV2LT5uZXRkZXYsICJ3bGFuJWQiKTsKLQlpZiAoaSA+PSAwKSB7Ci0JCWkgPSByZWdpc3Rlcl9uZXRkZXYod2xhbmRldi0+bmV0ZGV2KTsKLQl9Ci0JaWYgKGkgIT0gMCkgewotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLSNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSApCi0JZGV2LT5uYW1lID0gd2xhbmRldi0+bmFtZTsKLSNlbHNlCi0Jc3RyY3B5KHdsYW5kZXYtPm5hbWUsIGRldi0+bmFtZSk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaWYgKHByb2NfcDgwMjExKSB7Ci0JCXdsYW5kZXYtPnByb2NkaXIgPSBwcm9jX21rZGlyKHdsYW5kZXYtPm5hbWUsIHByb2NfcDgwMjExKTsKLQkJaWYgKCB3bGFuZGV2LT5wcm9jZGlyICkKLQkJCXdsYW5kZXYtPnByb2N3bGFuZGV2ID0KLQkJCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ3bGFuZGV2IiwgMCwKLQkJCQkJCSAgICAgICB3bGFuZGV2LT5wcm9jZGlyLAotCQkJCQkJICAgICAgIHA4MDIxMW5ldGRldl9wcm9jX3JlYWQsCi0JCQkJCQkgICAgICAgd2xhbmRldik7Ci0JCWlmICh3bGFuZGV2LT5uc2RfcHJvY19yZWFkKQotCQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgibnNkIiwgMCwKLQkJCQkJICAgICAgIHdsYW5kZXYtPnByb2NkaXIsCi0JCQkJCSAgICAgICB3bGFuZGV2LT5uc2RfcHJvY19yZWFkLAotCQkJCQkgICAgICAgd2xhbmRldik7Ci0JfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotCXA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXYsIFdMQU5fSE9UUExVR19SRUdJU1RFUik7Ci0jZW5kaWYKKwlpID0gcmVnaXN0ZXJfbmV0ZGV2KHdsYW5kZXYtPm5ldGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOwogCiAJREJGRVhJVDsKIAlyZXR1cm4gMDsKQEAgLTEwOTQsMjIgKzk1Niw2IEBACiAKIAlEQkZFTlRFUjsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcod2xhbmRldiwgV0xBTl9IT1RQTFVHX1JFTU9WRSk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaWYgKCB3bGFuZGV2LT5wcm9jd2xhbmRldiApIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIndsYW5kZXYiLCB3bGFuZGV2LT5wcm9jZGlyKTsKLQl9Ci0JaWYgKCB3bGFuZGV2LT5uc2RfcHJvY19yZWFkICkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgibnNkIiwgd2xhbmRldi0+cHJvY2Rpcik7Ci0JfQotCWlmICh3bGFuZGV2LT5wcm9jZGlyKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KHdsYW5kZXYtPm5hbWUsIHByb2NfcDgwMjExKTsKLQl9Ci0jZW5kaWYKLQogCXVucmVnaXN0ZXJfbmV0ZGV2KHdsYW5kZXYtPm5ldGRldik7CiAKIAkvKiBOb3cgdG8gY2xlYW4gb3V0IHRoZSByeCBxdWV1ZSAqLwpAQCAtMTEyMSw3NiArOTY3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJvY19yZWFkCi0qCi0qIFJlYWQgZnVuY3Rpb24gZm9yIC9wcm9jL25ldC9wODAyMTEvPGRldmljZT4vd2xhbmRldgotKgotKiBBcmd1bWVudHM6Ci0qCWJ1ZgotKglzdGFydAotKglvZmZzZXQKLSoJY291bnQKLSoJZW9mCi0qCWRhdGEKLSogUmV0dXJuczoKLSoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCi0qIENhbGwgQ29udGV4dDoKLSoJQ2FuIGJlIGVpdGhlciBpbnRlcnJ1cHQgb3Igbm90LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50Ci1wODAyMTFuZXRkZXZfcHJvY19yZWFkKAotCWNoYXIJKnBhZ2UsCi0JY2hhcgkqKnN0YXJ0LAotCW9mZl90CW9mZnNldCwKLQlpbnQJY291bnQsCi0JaW50CSplb2YsCi0Jdm9pZAkqZGF0YSkKLXsKLQljaGFyCSAqcCA9IHBhZ2U7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBkYXRhOwotCi0JREJGRU5URVI7Ci0JaWYgKG9mZnNldCAhPSAwKSB7Ci0JCSplb2YgPSAxOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcCArPSBzcHJpbnRmKHAsICJwODAyMTEgdmVyc2lvbjogJXMgKCVzKVxuXG4iLAotCQkgICAgIFdMQU5fUkVMRUFTRSwgV0xBTl9CVUlMRF9EQVRFKTsKLQlwICs9IHNwcmludGYocCwgIm5hbWUgICAgICAgOiAlc1xuIiwgd2xhbmRldi0+bmFtZSk7Ci0JcCArPSBzcHJpbnRmKHAsICJuc2QgbmFtZSAgIDogJXNcbiIsIHdsYW5kZXYtPm5zZG5hbWUpOwotCXAgKz0gc3ByaW50ZihwLCAiYWRkcmVzcyAgICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkgICAgIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbMF0sIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbMV0sIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbMl0sCi0JCSAgICAgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkclszXSwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkcls0XSwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkcls1XSk7Ci0JcCArPSBzcHJpbnRmKHAsICJuc2QgY2FwcyAgIDogJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX0hBUkRXQVJFV0VQKSA/ICJ3ZXBfaHcgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9USUVEV0VQKSA/ICJ3ZXBfdGllZCAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX05PSE9TVFdFUCkgPyAid2VwX2h3X29ubHkgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9QQkNDKSA/ICJwYmNjICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfU0hPUlRfUFJFQU1CTEUpID8gInNob3J0X3ByZWFtYmxlICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfQUdJTElUWSkgPyAiYWdpbGl0eSAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX0FQX1JFVFJBTlNNSVQpID8gImFwX3JldHJhbnNtaXQgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9IV0ZSQUdNRU5UKSA/ICJod19mcmFnICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfQVVUT0pPSU4pID8gImF1dG9qb2luICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfTk9TQ0FOKSA/ICIiIDogInNjYW4gIik7Ci0KLQotCXAgKz0gc3ByaW50ZihwLCAiYnNzaWQgICAgICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkgICAgIHdsYW5kZXYtPmJzc2lkWzBdLCB3bGFuZGV2LT5ic3NpZFsxXSwgd2xhbmRldi0+YnNzaWRbMl0sCi0JCSAgICAgd2xhbmRldi0+YnNzaWRbM10sIHdsYW5kZXYtPmJzc2lkWzRdLCB3bGFuZGV2LT5ic3NpZFs1XSk7Ci0KLQlwICs9IHNwcmludGYocCwgIkVuYWJsZWQgICAgOiAlcyVzXG4iLAotCQkgICAgICh3bGFuZGV2LT5zaG9ydHByZWFtYmxlKSA/ICJzaG9ydF9wcmVhbWJsZSAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEKSA/ICJwcml2YWN5IiA6ICIiKTsKLQotCi0gZXhpdDoKLQlEQkZFWElUOwotCXJldHVybiAocCAtIHBhZ2UpOwotfQotI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwODAyMTFuZXRkZXZfaHdyZW1vdmVkCkBAIC0xMjI3LDcgKzEwMDMsNyBAQAogCURCRkVOVEVSOwogCXdsYW5kZXYtPmh3cmVtb3ZlZCA9IDE7CiAJaWYgKCB3bGFuZGV2LT5zdGF0ZSA9PSBXTEFOX0RFVklDRV9PUEVOKSB7Ci0JCXA4MDIxMW5ldGRldl9zdG9wX3F1ZXVlKHdsYW5kZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJfQogCiAJbmV0aWZfZGV2aWNlX2RldGFjaCh3bGFuZGV2LT5uZXRkZXYpOwpAQCAtMTI1NywxMCArMTAzMywxMCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcCggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgZmMpCitzdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcCggd2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgZmMpCiB7Ci0JVUlOVDE2CWZ0eXBlOwotCVVJTlQxNglmc3R5cGU7CisJdTE2CWZ0eXBlOworCXUxNglmc3R5cGU7CiAJaW50CWRyb3AgPSAwOwogCS8qIENsYXNzaWZ5IGZyYW1lLCBpbmNyZW1lbnQgY291bnRlciAqLwogCWZ0eXBlID0gV0xBTl9HRVRfRkNfRlRZUEUoZmMpOwpAQCAtMTQxNiw3NSArMTE5Miw2IEBACiAJcmV0dXJuIGRyb3A7CiB9CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVRwotLyogTm90aWZ5IHVzZXJzcGFjZSB3aGVuIGEgbmV0ZGV2aWNlIGV2ZW50IG9jY3VycywKLSAqIGJ5IHJ1bm5pbmcgJy9zYmluL2hvdHBsdWcgbmV0JyB3aXRoIGNlcnRhaW4KLSAqIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQuCi0gKi8KLWludCBwODAyMTFfcnVuX3NiaW5faG90cGx1Zyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGNoYXIgKmFjdGlvbikKLXsKLSAgICAgICAgY2hhciAqYXJndlszXSwgKmVudnBbN10sIGlmbmFtZVsxMiArIElGTkFNU0laXSwgYWN0aW9uX3N0clszMl07Ci0JY2hhciBuc2RuYW1lWzMyXSwgd2xhbl93ZXh0WzMyXTsKLSAgICAgICAgaW50IGk7Ci0KLQlpZiAod2xhbmRldikgewotCQlzcHJpbnRmKGlmbmFtZSwgIklOVEVSRkFDRT0lcyIsIHdsYW5kZXYtPm5hbWUpOwotCQlzcHJpbnRmKG5zZG5hbWUsICJOU0ROQU1FPSVzIiwgd2xhbmRldi0+bnNkbmFtZSk7Ci0JfSBlbHNlIHsKLQkJc3ByaW50ZihpZm5hbWUsICJJTlRFUkZBQ0U9bnVsbCIpOwotCQlzcHJpbnRmKG5zZG5hbWUsICJOU0ROQU1FPW51bGwiKTsKLQl9Ci0KLQlzcHJpbnRmKHdsYW5fd2V4dCwgIldMQU5fV0VYVD0lcyIsIHdsYW5fd2V4dF93cml0ZSA/ICJ5IiA6ICIiKTsKLSAgICAgICAgc3ByaW50ZihhY3Rpb25fc3RyLCAiQUNUSU9OPSVzIiwgYWN0aW9uKTsKLQotICAgICAgICBpID0gMDsKLSAgICAgICAgYXJndltpKytdID0gaG90cGx1Z19wYXRoOwotICAgICAgICBhcmd2W2krK10gPSAid2xhbiI7Ci0gICAgICAgIGFyZ3ZbaV0gPSBOVUxMOwotCi0gICAgICAgIGkgPSAwOwotICAgICAgICAvKiBtaW5pbWFsIGNvbW1hbmQgZW52aXJvbm1lbnQgKi8KLSAgICAgICAgZW52cCBbaSsrXSA9ICJIT01FPS8iOwotICAgICAgICBlbnZwIFtpKytdID0gIlBBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iOwotICAgICAgICBlbnZwIFtpKytdID0gaWZuYW1lOwotICAgICAgICBlbnZwIFtpKytdID0gYWN0aW9uX3N0cjsKLSAgICAgICAgZW52cCBbaSsrXSA9IG5zZG5hbWU7Ci0gICAgICAgIGVudnAgW2krK10gPSB3bGFuX3dleHQ7Ci0gICAgICAgIGVudnAgW2ldID0gTlVMTDsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjIpKQotICAgICAgICByZXR1cm4gY2FsbF91c2VybW9kZWhlbHBlcihhcmd2IFswXSwgYXJndiwgZW52cCk7Ci0jZWxzZQotICAgICAgICByZXR1cm4gY2FsbF91c2VybW9kZWhlbHBlcihhcmd2IFswXSwgYXJndiwgZW52cCwgMCk7Ci0jZW5kaWYKLX0KLQotI2VuZGlmCi0KLQotdm9pZCAgICBwODAyMTFfc3VzcGVuZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JREJGRU5URVI7Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotCXA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXYsIFdMQU5fSE9UUExVR19TVVNQRU5EKTsKLSNlbmRpZgotCi0JREJGRVhJVDsKLX0KLQotdm9pZCAgICBwODAyMTFfcmVzdW1lKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQlEQkZFTlRFUjsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcod2xhbmRldiwgV0xBTl9IT1RQTFVHX1JFU1VNRSk7Ci0jZW5kaWYKLQotCURCRkVYSVQ7Ci19Ci0KIHN0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfdHhfdGltZW91dCggbmV0ZGV2aWNlX3QgKm5ldGRldikKIHsKIAl3bGFuZGV2aWNlX3QJKndsYW5kZXYgPSBuZXRkZXYtPm1sX3ByaXY7CkBAIC0xNDk1LDcgKzEyMDIsNyBAQAogCX0gZWxzZSB7CiAJCVdMQU5fTE9HX1dBUk5JTkcoIkltcGxlbWVudCB0eF90aW1lb3V0IGZvciAlc1xuIiwKIAkJCQkgd2xhbmRldi0+bnNkbmFtZSk7Ci0JCXA4MDIxMW5ldGRldl93YWtlX3F1ZXVlKHdsYW5kZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJfQogCiAJREJGRVhJVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKaW5kZXggOWIyZTBjZC4uOTQwMTQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKQEAgLTExMyw1NCArMTEzLDQ4IEBACiAvKiBSZWNlaXZlZCBmcmFtZSBzdGF0aXN0aWNzICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFfZnJtcnhfdAogewotCVVJTlQzMgltZ210OwotCVVJTlQzMglhc3NvY3JlcTsKLQlVSU5UMzIJYXNzb2NyZXNwOwotCVVJTlQzMglyZWFzc29jcmVxOwotCVVJTlQzMglyZWFzc29jcmVzcDsKLQlVSU5UMzIJcHJvYmVyZXE7Ci0JVUlOVDMyCXByb2JlcmVzcDsKLQlVSU5UMzIJYmVhY29uOwotCVVJTlQzMglhdGltOwotCVVJTlQzMglkaXNhc3NvYzsKLQlVSU5UMzIJYXV0aGVuOwotCVVJTlQzMglkZWF1dGhlbjsKLQlVSU5UMzIJbWdtdF91bmtub3duOwotCVVJTlQzMgljdGw7Ci0JVUlOVDMyCXBzcG9sbDsKLQlVSU5UMzIJcnRzOwotCVVJTlQzMgljdHM7Ci0JVUlOVDMyCWFjazsKLQlVSU5UMzIJY2ZlbmQ7Ci0JVUlOVDMyCWNmZW5kY2ZhY2s7Ci0JVUlOVDMyCWN0bF91bmtub3duOwotCVVJTlQzMglkYXRhOwotCVVJTlQzMglkYXRhb25seTsKLQlVSU5UMzIJZGF0YV9jZmFjazsKLQlVSU5UMzIJZGF0YV9jZnBvbGw7Ci0JVUlOVDMyCWRhdGFfX2NmYWNrX2NmcG9sbDsKLQlVSU5UMzIJbnVsbDsKLQlVSU5UMzIJY2ZhY2s7Ci0JVUlOVDMyCWNmcG9sbDsKLQlVSU5UMzIJY2ZhY2tfY2Zwb2xsOwotCVVJTlQzMglkYXRhX3Vua25vd247Ci0JVUlOVDMyICBkZWNyeXB0OwotCVVJTlQzMiAgZGVjcnlwdF9lcnI7CisJdTMyCW1nbXQ7CisJdTMyCWFzc29jcmVxOworCXUzMglhc3NvY3Jlc3A7CisJdTMyCXJlYXNzb2NyZXE7CisJdTMyCXJlYXNzb2NyZXNwOworCXUzMglwcm9iZXJlcTsKKwl1MzIJcHJvYmVyZXNwOworCXUzMgliZWFjb247CisJdTMyCWF0aW07CisJdTMyCWRpc2Fzc29jOworCXUzMglhdXRoZW47CisJdTMyCWRlYXV0aGVuOworCXUzMgltZ210X3Vua25vd247CisJdTMyCWN0bDsKKwl1MzIJcHNwb2xsOworCXUzMglydHM7CisJdTMyCWN0czsKKwl1MzIJYWNrOworCXUzMgljZmVuZDsKKwl1MzIJY2ZlbmRjZmFjazsKKwl1MzIJY3RsX3Vua25vd247CisJdTMyCWRhdGE7CisJdTMyCWRhdGFvbmx5OworCXUzMglkYXRhX2NmYWNrOworCXUzMglkYXRhX2NmcG9sbDsKKwl1MzIJZGF0YV9fY2ZhY2tfY2Zwb2xsOworCXUzMgludWxsOworCXUzMgljZmFjazsKKwl1MzIJY2Zwb2xsOworCXUzMgljZmFja19jZnBvbGw7CisJdTMyCWRhdGFfdW5rbm93bjsKKwl1MzIgIGRlY3J5cHQ7CisJdTMyICBkZWNyeXB0X2VycjsKIH0gcDgwMjExX2ZybXJ4X3Q7CiAKLSNpZmRlZiBXSVJFTEVTU19FWFQKIC8qIGNhbGxlZCBieSAvcHJvYy9uZXQvd2lyZWxlc3MgKi8KIHN0cnVjdCBpd19zdGF0aXN0aWNzKiBwODAyMTF3ZXh0X2dldF93aXJlbGVzc19zdGF0cyhuZXRkZXZpY2VfdCAqZGV2KTsKIC8qIHdpcmVsZXNzIGV4dGVuc2lvbnMnIGlvY3RscyAqLwogaW50IHA4MDIxMXdleHRfc3VwcG9ydF9pb2N0bChuZXRkZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTIKIGV4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcDgwMjExd2V4dF9oYW5kbGVyX2RlZjsKLSNlbmRpZgotCiBpbnQgcDgwMjExd2V4dF9ldmVudF9hc3NvY2lhdGVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBpbnQgYXNzb2MpOwogCi0jZW5kaWYgLyogd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwotCiAvKiBXRVAgc3R1ZmYgKi8KICNkZWZpbmUgTlVNX1dFUEtFWVMgNAogI2RlZmluZSBNQVhfS0VZTEVOIDMyCkBAIC0xODQsMTggKzE3OCwxOCBAQAogCWNoYXIJCW5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07IC8qIERldiBuYW1lLCBmcm9tIHJlZ2lzdGVyX3dsYW5kZXYoKSovCiAJY2hhcgkJKm5zZG5hbWU7CiAKLQlVSU5UMzIgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIERldmljZSBJL0Ygc3RhdGUgKG9wZW4vY2xvc2VkKSAqLwotCVVJTlQzMgkJbXNkc3RhdGU7CS8qIHN0YXRlIG9mIHVuZGVybHlpbmcgZHJpdmVyICovCi0JVUlOVDMyCQlod3JlbW92ZWQ7CS8qIEhhcyB0aGUgaHcgYmVlbiB5YW5rZWQgb3V0PyAqLworCXUzMiAgICAgICAgICBzdGF0ZTsgICAgICAgICAgLyogRGV2aWNlIEkvRiBzdGF0ZSAob3Blbi9jbG9zZWQpICovCisJdTMyCQltc2RzdGF0ZTsJLyogc3RhdGUgb2YgdW5kZXJseWluZyBkcml2ZXIgKi8KKwl1MzIJCWh3cmVtb3ZlZDsJLyogSGFzIHRoZSBodyBiZWVuIHlhbmtlZCBvdXQ/ICovCiAKIAkvKiBIYXJkd2FyZSBjb25maWcgKi8KLQlVSU5UCQlpcnE7Ci0JVUlOVAkJaW9iYXNlOwotCVVJTlQJCW1lbWJhc2U7Ci0JVUlOVDMyICAgICAgICAgIG5zZGNhcHM7ICAvKiBOU0QgQ2FwYWJpbGl0aWVzIGZsYWdzICovCisJdW5zaWduZWQgaW50CQlpcnE7CisJdW5zaWduZWQgaW50CQlpb2Jhc2U7CisJdW5zaWduZWQgaW50CQltZW1iYXNlOworCXUzMiAgICAgICAgICBuc2RjYXBzOyAgLyogTlNEIENhcGFiaWxpdGllcyBmbGFncyAqLwogCiAJLyogQ29uZmlnIHZhcnMgKi8KLQlVSU5UCQlldGhjb252OworCXVuc2lnbmVkIGludAkJZXRoY29udjsKIAogCS8qIGRldmljZSBtZXRob2RzIChpbml0IGJ5IE1TRCwgdXNlZCBieSBwODAyMTEgKi8KIAlpbnQJCSgqb3Blbikoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwpAQCAtMjA3LDIwICsyMDEsMTUgQEAKIAkJCQkJICAgICAgbmV0ZGV2aWNlX3QgKmRldik7CiAJdm9pZAkJKCp0eF90aW1lb3V0KShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWludCAgICAgICAgICAgICAoKm5zZF9wcm9jX3JlYWQpKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludAkqZW9mLCB2b2lkICpkYXRhKTsKLSNlbmRpZgotCiAJLyogODAyLjExIFN0YXRlICovCi0JVUlOVDgJCWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKKwl1OAkJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwogCXA4MDIxMXBzdHIzMl90CXNzaWQ7Ci0JVUlOVDMyCQltYWNtb2RlOworCXUzMgkJbWFjbW9kZTsKIAlpbnQgICAgICAgICAgICAgbGlua3N0YXR1czsKLQlpbnQgICAgICAgICAgICAgc2hvcnRwcmVhbWJsZTsgIC8qIEMgYm9vbCAqLwogCiAJLyogV0VQIFN0YXRlICovCi0JVUlOVDggd2VwX2tleXNbTlVNX1dFUEtFWVNdW01BWF9LRVlMRU5dOwotCVVJTlQ4IHdlcF9rZXlsZW5zW05VTV9XRVBLRVlTXTsKKwl1OCB3ZXBfa2V5c1tOVU1fV0VQS0VZU11bTUFYX0tFWUxFTl07CisJdTggd2VwX2tleWxlbnNbTlVNX1dFUEtFWVNdOwogCWludCAgIGhvc3R3ZXA7CiAKIAkvKiBSZXF1ZXN0L0NvbmZpcm0gaS9mIHN0YXRlICh1c2VkIGJ5IHA4MDIxMSkgKi8KQEAgLTIzMiwxMiArMjIxLDYgQEAKIAluZXRkZXZpY2VfdAkJKm5ldGRldjsJLyogcHRyIHRvIGxpbnV4IG5ldGRldmljZSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGxpbnV4X3N0YXRzOwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQkvKiBQcm9jZnMgc3VwcG9ydCAqLwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY2RpcjsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2N3bGFuZGV2OwotI2VuZGlmCi0KIAkvKiBSeCBib3R0b20gaGFsZiAqLwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlyeF9iaDsKIApAQCAtMjQ2LDI5ICsyMjksMTggQEAKIAkvKiA4MDIuMTEgZGV2aWNlIHN0YXRpc3RpY3MgKi8KIAlzdHJ1Y3QgcDgwMjExX2ZybXJ4X3QJcng7CiAKLS8qIGNvbXBhdGliaWxpdHkgdG8gd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwotI2lmZGVmIFdJUkVMRVNTX0VYVAogCXN0cnVjdCBpd19zdGF0aXN0aWNzCXdzdGF0czsKIAogCS8qIGprcmllZ2w6IGl3c3B5IGZpZWxkcyAqLwotICAgICAgICBVSU5UOAkJCXNweV9udW1iZXI7CisgICAgICAgIHU4CQkJc3B5X251bWJlcjsKICAgICAgICAgY2hhcgkJCXNweV9hZGRyZXNzW0lXX01BWF9TUFldW0VUSF9BTEVOXTsKICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgICAgICAgc3B5X3N0YXRbSVdfTUFYX1NQWV07Ci0KLSNlbmRpZgotCiB9IHdsYW5kZXZpY2VfdDsKIAogLyogV0VQIHN0dWZmICovCi1pbnQgd2VwX2NoYW5nZV9rZXkod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQga2V5bnVtLCBVSU5UOCoga2V5LCBpbnQga2V5bGVuKTsKLWludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQ4ICpidWYsIFVJTlQzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsIFVJTlQ4ICppdiwgVUlOVDggKmljdik7Ci1pbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UOCAqYnVmLCBVSU5UOCAqZHN0LCBVSU5UMzIgbGVuLCBpbnQga2V5bnVtLCBVSU5UOCAqaXYsIFVJTlQ4ICppY3YpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRXh0ZXJucyAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCitpbnQgd2VwX2NoYW5nZV9rZXkod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQga2V5bnVtLCB1OCoga2V5LCBpbnQga2V5bGVuKTsKK2ludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsIHU4ICppdiwgdTggKmljdik7CitpbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1OCAqZHN0LCB1MzIgbGVuLCBpbnQga2V5bnVtLCB1OCAqaXYsIHU4ICppY3YpOwogCiB2b2lkCXA4MDIxMW5ldGRldl9zdGFydHVwKHZvaWQpOwogdm9pZAlwODAyMTFuZXRkZXZfc2h1dGRvd24odm9pZCk7CkBAIC0yNzgsNTkgKzI1MCw1IEBACiBpbnQJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CiB2b2lkCXA4MDIxMW5ldGRldl9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZAlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci12b2lkICAgIHA4MDIxMV9zdXNwZW5kKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci12b2lkICAgIHA4MDIxMV9yZXN1bWUod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcDgwMjExbmV0ZGV2X3N0b3BfcXVldWUod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWlmICggIXdsYW5kZXYgKSByZXR1cm47Ci0JaWYgKCAhd2xhbmRldi0+bmV0ZGV2ICkgcmV0dXJuOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMzgpICkKLQl3bGFuZGV2LT5uZXRkZXYtPnRidXN5ID0gMTsKLQl3bGFuZGV2LT5uZXRkZXYtPnN0YXJ0ID0gMDsKLSNlbHNlCi0JbmV0aWZfc3RvcF9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcDgwMjExbmV0ZGV2X3N0YXJ0X3F1ZXVlKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQlpZiAoICF3bGFuZGV2ICkgcmV0dXJuOwotCWlmICggIXdsYW5kZXYtPm5ldGRldiApIHJldHVybjsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0Jd2xhbmRldi0+bmV0ZGV2LT50YnVzeSA9IDA7Ci0Jd2xhbmRldi0+bmV0ZGV2LT5zdGFydCA9IDE7Ci0jZWxzZQotCW5ldGlmX3N0YXJ0X3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1wODAyMTFuZXRkZXZfd2FrZV9xdWV1ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaWYgKCAhd2xhbmRldiApIHJldHVybjsKLQlpZiAoICF3bGFuZGV2LT5uZXRkZXYgKSByZXR1cm47Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkgKQotCXdsYW5kZXYtPm5ldGRldi0+dGJ1c3kgPSAwOwotCW1hcmtfYmgoTkVUX0JIKTsKLSNlbHNlCi0JbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotI2RlZmluZSBXTEFOX0hPVFBMVUdfUkVHSVNURVIgInJlZ2lzdGVyIgotI2RlZmluZSBXTEFOX0hPVFBMVUdfUkVNT1ZFICAgInJlbW92ZSIKLSNkZWZpbmUgV0xBTl9IT1RQTFVHX1NUQVJUVVAgICJzdGFydHVwIgotI2RlZmluZSBXTEFOX0hPVFBMVUdfU0hVVERPV04gInNodXRkb3duIgotI2RlZmluZSBXTEFOX0hPVFBMVUdfU1VTUEVORCAic3VzcGVuZCIKLSNkZWZpbmUgV0xBTl9IT1RQTFVHX1JFU1VNRSAicmVzdW1lIgotaW50IHA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgY2hhciAqYWN0aW9uKTsKLSNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMKaW5kZXggMDIzM2FiZS4uNmUyMGJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMKQEAgLTU0LDcgKzU0LDYgQEAKIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTY4LDcgKzY3LDYgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMTI2LDcgKzEyNCw3IEBACiAqCVBvdGVudGlhbGx5IGJsb2NrcyB0aGUgY2FsbGVyLCBzbyBpdCdzIGEgZ29vZCBpZGVhIHRvCiAqCW5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHA4MDIxMXJlcV9kb3JlcXVlc3QoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKm1zZ2J1ZikKK2ludCBwODAyMTFyZXFfZG9yZXF1ZXN0KCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICptc2didWYpCiB7CiAJaW50CQlyZXN1bHQgPSAwOwogCXA4MDIxMW1zZ190CSptc2cgPSAocDgwMjExbXNnX3QqKW1zZ2J1ZjsKQEAgLTIyNCwzOCArMjIyLDExIEBACiB7CiAJcDgwMjExaXRlbWRfdCAgICptaWJpdGVtID0gKHA4MDIxMWl0ZW1kX3QgKikgbWliX21zZy0+bWliYXR0cmlidXRlLmRhdGE7CiAJcDgwMjExcHN0cmRfdCAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCopIG1pYml0ZW0tPmRhdGE7Ci0JVUlOVDggKmtleSA9IG1pYml0ZW0tPmRhdGEgKyBzaXplb2YocDgwMjExcHN0cmRfdCk7CisJdTggKmtleSA9IG1pYml0ZW0tPmRhdGEgKyBzaXplb2YocDgwMjExcHN0cmRfdCk7CiAKIAlEQkZFTlRFUjsKIAogCXN3aXRjaCAobWliaXRlbS0+ZGlkKSB7Ci0JY2FzZSBESURtaWJfZG90MTFzbXRfcDgwMjExVGFibGVfcDgwMjExX2lmc3RhdGU6IHsKLQkJVUlOVDMyICpkYXRhID0gKFVJTlQzMiAqKSBtaWJpdGVtLT5kYXRhOwotCQlpZiAoaXNnZXQpCi0JCQlzd2l0Y2ggKHdsYW5kZXYtPm1zZHN0YXRlKSB7Ci0JCQljYXNlIFdMQU5fTVNEX0hXUFJFU0VOVDoKLQkJCQkqZGF0YSA9IFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX01TRF9GV0xPQUQ6Ci0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX2lmc3RhdGVfZndsb2FkOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX01TRF9SVU5OSU5HOgotCQkJCSpkYXRhID0gUDgwMjExRU5VTV9pZnN0YXRlX2VuYWJsZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX2lmc3RhdGVfZW5hYmxlOwotCQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVNob3J0UHJlYW1ibGVFbmFibGVkOiB7Ci0JCVVJTlQzMiAqZGF0YSA9IChVSU5UMzIgKikgbWliaXRlbS0+ZGF0YTsKLQotCQlpZiAoaXNnZXQpCi0JCQkqZGF0YSA9IHdsYW5kZXYtPnNob3J0cHJlYW1ibGU7Ci0JCWVsc2UKLQkJCXdsYW5kZXYtPnNob3J0cHJlYW1ibGUgPSAqZGF0YTsKLQkJYnJlYWs7Ci0JfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwOiB7CiAJCWlmICghaXNnZXQpCiAJCQl3ZXBfY2hhbmdlX2tleSh3bGFuZGV2LCAwLCBrZXksIHBzdHItPmxlbik7CkBAIC0yNzcsNyArMjQ4LDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlEOiB7Ci0JCVVJTlQzMiAqZGF0YSA9IChVSU5UMzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKSBtaWJpdGVtLT5kYXRhOwogCiAJCWlmIChpc2dldCkgewogCQkJKmRhdGEgPSB3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9ERUZBVUxUS0VZX01BU0s7CkBAIC0yODksNyArMjYwLDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExUHJpdmFjeUludm9rZWQ6IHsKLQkJVUlOVDMyICpkYXRhID0gKFVJTlQzMiAqKSBtaWJpdGVtLT5kYXRhOworCQl1MzIgKmRhdGEgPSAodTMyICopIG1pYml0ZW0tPmRhdGE7CiAKIAkJaWYgKGlzZ2V0KSB7CiAJCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpCkBAIC0zMDQsNyArMjc1LDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkOiB7Ci0JCVVJTlQzMiAqZGF0YSA9IChVSU5UMzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKSBtaWJpdGVtLT5kYXRhOwogCiAJCWlmIChpc2dldCkgewogCQkJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKaW5kZXggNTRhYmRjZS4uNDk3YTRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKQEAgLTYzLDYgKzYzLDYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAotaW50CXA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UOCAqbXNnYnVmKTsKK2ludAlwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKm1zZ2J1Zik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKaW5kZXggODExYjBjZS4uNWJlNjczNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCkBAIC04MCwxMyArODAsMTMgQEAKIAogI2RlZmluZSBQODAyMTFfVFlQRV9PQ1RFVFNUUgkJMQkvKiBwYXNjYWwgYXJyYXkgb2YgYnl0ZXMgKi8KICNkZWZpbmUgUDgwMjExX1RZUEVfRElTUExBWVNUUgkJMgkvKiBwYXNjYWwgYXJyYXkgb2YgYnl0ZXMgY29udGFpbmluZyBhc2NpaSAqLwotI2RlZmluZSBQODAyMTFfVFlQRV9JTlQJCQk0CS8qIFVJTlQzMiBtaW4gYW5kIG1heCBsaW1pdGVkIGJ5IDMyIGJpdHMgKi8KLSNkZWZpbmUgUDgwMjExX1RZUEVfRU5VTUlOVAkJNQkvKiBVSU5UMzIgaG9sZGluZyBhIG51bWVyaWMKKyNkZWZpbmUgUDgwMjExX1RZUEVfaW50CQkJNAkvKiB1MzIgbWluIGFuZCBtYXggbGltaXRlZCBieSAzMiBiaXRzICovCisjZGVmaW5lIFA4MDIxMV9UWVBFX0VOVU1pbnQJCTUJLyogdTMyIGhvbGRpbmcgYSBudW1lcmljCiAJCQkJCQkgICBjb2RlIHRoYXQgY2FuIGJlIG1hcHBlZAogCQkJCQkJICAgdG8gYSB0ZXh0dWFsIG5hbWUgKi8KICNkZWZpbmUgUDgwMjExX1RZUEVfVU5LREFUQQkJNgkvKiBEYXRhIGl0ZW0gY29udGFpbmluZyBhbgogCQkJCQkJICAgdW5rbm93biBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgUDgwMjExX1RZUEVfSU5UQVJSQVkJCTcJLyogQXJyYXkgb2YgMzItYml0IGludGVnZXJzLiAqLworI2RlZmluZSBQODAyMTFfVFlQRV9pbnRBUlJBWQkJNwkvKiBBcnJheSBvZiAzMi1iaXQgaW50ZWdlcnMuICovCiAjZGVmaW5lIFA4MDIxMV9UWVBFX0JJVEFSUkFZCQk4CS8qIEFycmF5IG9mIGJpdHMuICovCiAjZGVmaW5lIFA4MDIxMV9UWVBFX01BQ0FSUkFZCQk5CS8qIEFycmF5IG9mIE1BQyBhZGRyZXNzZXMuICovCiAKQEAgLTI0Myw3ICsyNDMsNyBAQAogCQkJCQkvKiBpcyBhIERJRC1MRU4tREFUQSB0cmlwbGUgKi8KIAkJCQkJLyogd2l0aCBhIG1heCBzaXplIG9mIDQrNCszODQgKi8KIAotI2RlZmluZSBQODAyMTFfU0VUX0lOVChpdGVtLCB2YWx1ZSkgZG8geyBcCisjZGVmaW5lIFA4MDIxMV9TRVRfaW50KGl0ZW0sIHZhbHVlKSBkbyB7IFwKIAkoaXRlbSkuZGF0YSAgID0gKHZhbHVlKTsgXAogCShpdGVtKS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7IFwKIAl9IHdoaWxlKDApCkBAIC0yNzksOSArMjc5LDkgQEAKIAogI2RlZmluZSBQODAyMTFJVEVNX1NFVEZMQUdTKHEsIHIsIGMpCSggcSB8IHIgfCBjICkKIAotI2RlZmluZSBQODAyMTFJVEVNX0lTUkVRVUlSRUQoZmxhZ3MpCSgoKFVJTlQzMikoZmxhZ3MgJiBJU1JFUVVJUkVEKSkgPj4gMzEgKQotI2RlZmluZSBQODAyMTFJVEVNX0lTUkVRVUVTVChmbGFncykJKCgoVUlOVDMyKShmbGFncyAmIElTUkVRVUVTVCkpID4+IDMwICkKLSNkZWZpbmUgUDgwMjExSVRFTV9JU0NPTkZJUk0oZmxhZ3MpCSgoKFVJTlQzMikoZmxhZ3MgJiBJU0NPTkZJUk0pKSA+PiAyOSApCisjZGVmaW5lIFA4MDIxMUlURU1fSVNSRVFVSVJFRChmbGFncykJKCgodTMyKShmbGFncyAmIElTUkVRVUlSRUQpKSA+PiAzMSApCisjZGVmaW5lIFA4MDIxMUlURU1fSVNSRVFVRVNUKGZsYWdzKQkoKCh1MzIpKGZsYWdzICYgSVNSRVFVRVNUKSkgPj4gMzAgKQorI2RlZmluZSBQODAyMTFJVEVNX0lTQ09ORklSTShmbGFncykJKCgodTMyKShmbGFncyAmIElTQ09ORklSTSkpID4+IDI5ICkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRoZSBmb2xsb3dpbmcgbWFjcm8gY3JlYXRlcyBhIG5hbWUgZm9yIGFuIGVudW0gKi8KQEAgLTMyMCw3ICszMjAsNyBAQAogI2RlZmluZSBQODAyMTFESURfTUFTS19BQ0NFU1MgCQkoMHgwMDAwMDAwM1VMKQogCiAKLSNkZWZpbmUgUDgwMjExRElEX01LKGEsbSxsKQkoKCgoVUlOVDMyKShhKSkgJiAobSkpIDw8IChsKSkKKyNkZWZpbmUgUDgwMjExRElEX01LKGEsbSxsKQkoKCgodTMyKShhKSkgJiAobSkpIDw8IChsKSkKIAogI2RlZmluZSBQODAyMTFESURfTUtTRUNUSU9OKGEpCVA4MDIxMURJRF9NSyhhLCBcCiAJCQkJCVA4MDIxMURJRF9NQVNLX1NFQ1RJT04sIFwKQEAgLTM0Nyw3ICszNDcsNyBAQAogCQkJCQkJKGEpICkKIAogCi0jZGVmaW5lIFA4MDIxMURJRF9HRVQoYSxtLGwpCSgoKChVSU5UMzIpKGEpKSA+PiAobCkpICYgKG0pKQorI2RlZmluZSBQODAyMTFESURfR0VUKGEsbSxsKQkoKCgodTMyKShhKSkgPj4gKGwpKSAmIChtKSkKIAogI2RlZmluZSBQODAyMTFESURfU0VDVElPTihhKQlQODAyMTFESURfR0VUKGEsIFwKIAkJCQkJUDgwMjExRElEX01BU0tfU0VDVElPTiwgXApAQCAtMzczLDE3ICszNzMsMTcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHR5cGVzIGFyZSB1c2VkIGZvciB0aGUgcmVwcmVzZW5hdGlvbiAqLwotLyogIG9mIEVOVU1JTlQgdHlwZSBtZXRhZGF0YS4gKi8KKy8qICBvZiBFTlVNaW50IHR5cGUgbWV0YWRhdGEuICovCiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMWVudW1wYWlyCiB7Ci0JVUlOVDMyCQkJdmFsOworCXUzMgkJCXZhbDsKIAljaGFyCQkJKm5hbWU7CiB9IHA4MDIxMWVudW1wYWlyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMWVudW0KIHsKLQlJTlQJCQluaXRlbXM7CisJaW50CQkJbml0ZW1zOwogCXA4MDIxMWVudW1wYWlyX3QJKmxpc3Q7CiB9IHA4MDIxMWVudW1fdDsKIApAQCAtMzk0LDEzNyArMzk0LDEzNyBAQAogLyogVGVtcGxhdGUgcGFzY2FsIHN0cmluZyAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cgogewotCVVJTlQ4CQlsZW47CisJdTgJCWxlbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cl90OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyZAogewotCVVJTlQ4CQlsZW47Ci0JVUlOVDgJCWRhdGFbMF07CisJdTgJCWxlbjsKKwl1OAkJZGF0YVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cmRfdDsKIAogLyogTWF4aW11bSBwYXNjYWwgc3RyaW5nICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyMjU1CiB7Ci0JVUlOVDgJCWxlbjsKLQlVSU5UOAkJZGF0YVtNQVhMRU5fUFNUUjI1NV07CisJdTgJCWxlbjsKKwl1OAkJZGF0YVtNQVhMRU5fUFNUUjI1NV07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHIyNTVfdDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3IgbWFjYWRkcmVzcyBhbmQgYnNzaWQgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHI2CiB7Ci0JVUlOVDgJCWxlbjsKLQlVSU5UOAkJZGF0YVtNQVhMRU5fUFNUUjZdOworCXU4CQlsZW47CisJdTgJCWRhdGFbTUFYTEVOX1BTVFI2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cjZfdDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3IgY2hhbm5lbCBsaXN0ICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyMTQKIHsKLQlVSU5UOAkJbGVuOwotCVVJTlQ4CQlkYXRhW01BWExFTl9QU1RSMTRdOworCXU4CQlsZW47CisJdTgJCWRhdGFbTUFYTEVOX1BTVFIxNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHIxNF90OwogCiAvKiBwYXNjYWwgc3RyaW5nIGZvciBzc2lkICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyMzIKIHsKLQlVSU5UOAkJbGVuOwotCVVJTlQ4CQlkYXRhW01BWExFTl9QU1RSMzJdOworCXU4CQlsZW47CisJdTgJCWRhdGFbTUFYTEVOX1BTVFIzMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHIzMl90OwogCiAvKiBNQUMgYWRkcmVzcyBhcnJheSAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbWFjYXJyYXkKIHsKLQlVSU5UMzIJCWNudDsKLQlVSU5UOAkJZGF0YVsxXVtNQVhMRU5fUFNUUjZdOworCXUzMgkJY250OworCXU4CQlkYXRhWzFdW01BWExFTl9QU1RSNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1hY2FycmF5X3Q7CiAKIC8qIHByb3RvdHlwZSB0ZW1wbGF0ZSAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbQogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3Q7CiAKIC8qIHByb3RvdHlwZSB0ZW1wbGF0ZSB3LyBkYXRhIGl0ZW0gKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1kCiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47Ci0JVUlOVDgJCWRhdGFbMF07CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CisJdTgJCWRhdGFbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1kX3Q7CiAKLS8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBJTlQsIEJPVU5ERURJTlQsIEVOVU1JTlQgKi8KKy8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBpbnQsIEJPVU5ERURJTlQsIEVOVU1JTlQgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyCiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47Ci0JVUlOVDMyCQlkYXRhOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOworCXUzMgkJZGF0YTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV91aW50MzJfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHI2CiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CiAJcDgwMjExcHN0cjZfdAlkYXRhOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3BzdHI2X3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBPQ1RFVFNUUiwgRElTUExBWVNUUiAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMTQKIHsKLQlVSU5UMzIJCQlkaWQ7Ci0JVUlOVDE2CQkJc3RhdHVzOwotCVVJTlQxNgkJCWxlbjsKKwl1MzIJCQlkaWQ7CisJdTE2CQkJc3RhdHVzOworCXUxNgkJCWxlbjsKIAlwODAyMTFwc3RyMTRfdAkJZGF0YTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV9wc3RyMTRfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMgogewotCVVJTlQzMgkJCWRpZDsKLQlVSU5UMTYJCQlzdGF0dXM7Ci0JVUlOVDE2CQkJbGVuOworCXUzMgkJCWRpZDsKKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJbGVuOwogCXA4MDIxMXBzdHIzMl90CQlkYXRhOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3BzdHIzMl90OwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjI1NQogewotCVVJTlQzMgkJCWRpZDsKLQlVSU5UMTYJCQlzdGF0dXM7Ci0JVUlOVDE2CQkJbGVuOworCXUzMgkJCWRpZDsKKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJbGVuOwogCXA4MDIxMXBzdHIyNTVfdAkJZGF0YTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV9wc3RyMjU1X3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBVTksgMzkyLCBuYW1lbHkgbWliIGl0ZW1zICovCiB0eXBlZGVmIHN0cnVjdCAgcDgwMjExaXRlbV91bmszOTIKIHsKLQlVSU5UMzIJCWRpZDsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCWxlbjsKLQlVSU5UOAkJZGF0YVtNQVhMRU5fTUlCQVRUUklCVVRFXTsKKwl1MzIJCWRpZDsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCWxlbjsKKwl1OAkJZGF0YVtNQVhMRU5fTUlCQVRUUklCVVRFXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV91bmszOTJfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIFVOSyAxMDI1LCBuYW1lbHkgcDIgcGRhcyAqLwogdHlwZWRlZiBzdHJ1Y3QgIHA4MDIxMWl0ZW1fdW5rMTAyNAogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOwotCVVJTlQ4CQlkYXRhWzEwMjRdOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOworCXU4CQlkYXRhWzEwMjRdOwogfSAgX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV91bmsxMDI0X3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBVTksgNDA5NiwgbmFtZWx5IHAyIGRvd25sb2FkIGNodW5rcyAqLwogdHlwZWRlZiBzdHJ1Y3QgIHA4MDIxMWl0ZW1fdW5rNDA5NgogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOwotCVVJTlQ4CQlkYXRhWzQwOTZdOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOworCXU4CQlkYXRhWzQwOTZdOwogfSAgX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV91bms0MDk2X3Q7CiAKIHN0cnVjdCBjYXRsaXN0aXRlbTsKQEAgLTUzNCw5ICs1MzQsOSBAQAogLyogIG1ldGFkYXRhIGl0ZW1zLiAgU29tZSBjb21wb25lbnRzIG1heSBjaG9vc2UgdG8gdXNlIG1vcmUsICovCiAvKiAgbGVzcyBvciBkaWZmZXJlbnQgbWV0YWRhdGEgaXRlbXMuICovCiAKLXR5cGVkZWYgdm9pZCAoKnA4MDIxMV90b3RleHRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCBVSU5UMzIgZGlkLCBVSU5UOCogaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1Zik7Ci10eXBlZGVmIHZvaWQgKCpwODAyMTFfZnJvbXRleHRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCBVSU5UMzIgZGlkLCBVSU5UOCogaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1Zik7Ci10eXBlZGVmIFVJTlQzMiAoKnA4MDIxMV92YWxpZF90KSggc3RydWN0IGNhdGxpc3RpdGVtICosIFVJTlQzMiBkaWQsIFVJTlQ4KiBpdGVtYnVmKTsKK3R5cGVkZWYgdm9pZCAoKnA4MDIxMV90b3RleHRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCB1MzIgZGlkLCB1OCogaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1Zik7Cit0eXBlZGVmIHZvaWQgKCpwODAyMTFfZnJvbXRleHRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCB1MzIgZGlkLCB1OCogaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1Zik7Cit0eXBlZGVmIHUzMiAoKnA4MDIxMV92YWxpZF90KSggc3RydWN0IGNhdGxpc3RpdGVtICosIHUzMiBkaWQsIHU4KiBpdGVtYnVmKTsKIAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNTc1LDggKzU3NSw4IEBACiAvKiBUaGUgZm9sbG93aW5nIGRlY2xhcmUgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGggdGhlICovCiAvKiAgcDgwMjExZW51bV90IHR5cGUuICovCiAKLVVJTlQzMiBwODAyMTFlbnVtX3RleHQyaW50KHA4MDIxMWVudW1fdCAqZXAsIGNoYXIgKnRleHQpOwotVUlOVDMyIHA4MDIxMWVudW1faW50MnRleHQocDgwMjExZW51bV90ICplcCwgVUlOVDMyIHZhbCwgY2hhciAqdGV4dCk7Cit1MzIgcDgwMjExZW51bV90ZXh0MmludChwODAyMTFlbnVtX3QgKmVwLCBjaGFyICp0ZXh0KTsKK3UzMiBwODAyMTFlbnVtX2ludDJ0ZXh0KHA4MDIxMWVudW1fdCAqZXAsIHUzMiB2YWwsIGNoYXIgKnRleHQpOwogdm9pZCBwODAyMTFfZXJyb3IydGV4dChpbnQgZXJyX2NvZGUsIGNoYXIgKmVycl9zdHIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNTkxLDg1ICs1OTEsODUgQEAKIAogLyotLSBESVNQTEFZU1RSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBwc3RyID09PiBjc3RyICovCi12b2lkIHA4MDIxMV90b3RleHRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9kaXNwbGF5c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBjc3RyID09PiBwc3RyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9kaXNwbGF5c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfZnJvbXRleHRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYSBkaXNwbGF5c3RyIGJpbmFyeSB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2Rpc3BsYXlzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAogLyotLSBPQ1RFVFNUUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBwc3RyID09PiAieHg6eHg6Li4uLiIgKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogInh4Onh4Oi4uLi4iID09PiBwc3RyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX2Zyb210ZXh0X29jdGV0c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBvY3RldHN0ciBiaW5hcnkgdmFsdWUgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAotLyotLSBJTlQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBVSU5UMzIgPT0+ICVkICovCi12b2lkIHA4MDIxMV90b3RleHRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyotLSBpbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB1MzIgPT0+ICVkICovCit2b2lkIHA4MDIxMV90b3RleHRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCi0vKiAlZCA9PT4gVUlOVDMyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKiAlZCA9PT4gdTMyICovCit2b2lkIHA4MDIxMV9mcm9tdGV4dF9pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGludCdzIGJpbmFyeSB2YWx1ZSAoYWx3YXlzIHN1Y2Nlc3NmdWwpICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2ludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAotLyotLSBFTlVNSU5UIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBVSU5UMzIgPT0+IDx2YWx1ZW5hbWU+ICovCi12b2lkIHA4MDIxMV90b3RleHRfZW51bWludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qLS0gRU5VTWludCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdTMyID09PiA8dmFsdWVuYW1lPiAqLwordm9pZCBwODAyMTFfdG90ZXh0X2VudW1pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKLS8qIDx2YWx1ZW5hbWU+ID09PiBVSU5UMzIgKi8KLXZvaWQgcDgwMjExX2Zyb210ZXh0X2VudW1pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKiA8dmFsdWVuYW1lPiA9PT4gdTMyICovCit2b2lkIHA4MDIxMV9mcm9tdGV4dF9lbnVtaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBlbnVtJ3MgYmluYXJ5IHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfZW51bWludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9lbnVtaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCi0vKi0tIElOVEFSUkFZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFVJTlQzMltdID0+ICVkLCVkLCVkLC4uLiAqLwotdm9pZCBwODAyMTFfdG90ZXh0X2ludGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyotLSBpbnRBUlJBWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB1MzJbXSA9PiAlZCwlZCwlZCwuLi4gKi8KK3ZvaWQgcDgwMjExX3RvdGV4dF9pbnRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAotLyogJWQsJWQsJWQsLi4uID09PiBVSU5UMzJbXSAqLwotdm9pZCBwODAyMTFfZnJvbXRleHRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKiAlZCwlZCwlZCwuLi4gPT0+IHUzMltdICovCit2b2lkIHA4MDIxMV9mcm9tdGV4dF9pbnRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYW4gaW50ZWdlciBhcnJheSdzIHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKIC8qLS0gQklUQVJSQVkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogVUlOVDMyID09PiAlZCwlZCwlZCwuLi4gKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qIHUzMiA9PT4gJWQsJWQsJWQsLi4uICovCit2b2lkIHA4MDIxMV90b3RleHRfYml0YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKLS8qICVkLCVkLCVkLC4uLiA9PT4gVUlOVDMyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qICVkLCVkLCVkLC4uLiA9PT4gdTMyICovCit2b2lkIHA4MDIxMV9mcm9tdGV4dF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYSBiaXQgYXJyYXkncyB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2JpdGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2JpdGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCiAvKi0tIE1BQ0FSUkFZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAotdm9pZCBwODAyMTFfZnJvbXRleHRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV9mcm9tdGV4dF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYSBNQUMgYWRkcmVzcyBhcnJheSdzIHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKIC8qLS0gTUlCQVRUUklVQlRFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiA8bWlidmFsdWU+ID09PiA8dGV4dHVhbCByZXByZXNlbnRhdGlvbiBpZGVudGlmaWVkIGluIE1JQiBtZXRhZGF0YT4gKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Ci12b2lkIHA4MDIxMV90b3RleHRfc2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfdG90ZXh0X2dldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIAogLyogPHRleHR1YWwgcmVwcmVzZW50YXRpb24gaWRlbnRpZmllZCBpbiBNSUIgbWV0YWRhdGE+ID09PiA8bWlidmFsdWU+ICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Ci12b2lkIHA4MDIxMV9mcm9tdGV4dF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV9mcm9tdGV4dF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV9mcm9tdGV4dF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGEgbWliaXRlbSdzIGJpbmFyeSB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2dldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfZ2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX3NldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAogI2VuZGlmIC8qIF9QODAyMTFUWVBFU19IICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKaW5kZXggMTFhNTBjNy4uNDZhMmE2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKQEAgLTU2LDcgKzU2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIAogLy8gI2RlZmluZSBXRVBfREVCVUcKQEAgLTczLDcgKzcyLDcgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBDb25zdGFudHMgKi8KIAotI2RlZmluZSBTU1dBUChhLGIpIHtVSU5UOCB0bXAgPSBzW2FdOyBzW2FdID0gc1tiXTsgc1tiXSA9IHRtcDt9CisjZGVmaW5lIFNTV0FQKGEsYikge3U4IHRtcCA9IHNbYV07IHNbYV0gPSBzW2JdOyBzW2JdID0gdG1wO30KICNkZWZpbmUgV0VQX0tFWSh4KSAgICAgICAoKCh4KSAmIDB4QzApID4+IDYpCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC04Nyw3ICs4Niw3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCiAKLXN0YXRpYyBjb25zdCBVSU5UMzIgd2VwX2NyYzMyX3RhYmxlWzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdTMyIHdlcF9jcmMzMl90YWJsZVsyNTZdID0gewogICAgICAgICAweDAwMDAwMDAwTCwgMHg3NzA3MzA5NkwsIDB4ZWUwZTYxMmNMLCAweDk5MDk1MWJhTCwgMHgwNzZkYzQxOUwsCiAgICAgICAgIDB4NzA2YWY0OGZMLCAweGU5NjNhNTM1TCwgMHg5ZTY0OTVhM0wsIDB4MGVkYjg4MzJMLCAweDc5ZGNiOGE0TCwKICAgICAgICAgMHhlMGQ1ZTkxZUwsIDB4OTdkMmQ5ODhMLCAweDA5YjY0YzJiTCwgMHg3ZWIxN2NiZEwsIDB4ZTdiODJkMDdMLApAQCAtMTUwLDcgKzE0OSw3IEBACiAKIC8qIGtleWxlbiBpbiBieXRlcyEgKi8KIAotaW50IHdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGtleW51bSwgVUlOVDgqIGtleSwgaW50IGtleWxlbikKK2ludCB3ZXBfY2hhbmdlX2tleSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGludCBrZXludW0sIHU4KiBrZXksIGludCBrZXlsZW4pCiB7CiAJaWYgKGtleWxlbiA8IDApICByZXR1cm4gLTE7CiAJaWYgKGtleWxlbiA+PSBNQVhfS0VZTEVOKSByZXR1cm4gLTE7CkBAIC0xNzMsMTEgKzE3MiwxMSBAQAogICA0LWJ5dGUgSVYgYXQgc3RhcnQgb2YgYnVmZmVyLCA0LWJ5dGUgSUNWIGF0IGVuZCBvZiBidWZmZXIuCiAgIGlmIHN1Y2Nlc3NmdWwsIGJ1ZiBzdGFydCBpcyBwYXlsb2FkIGJlZ2luLCBsZW5ndGggLT0gODsKICAqLwotaW50IHdlcF9kZWNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKmJ1ZiwgVUlOVDMyIGxlbiwgaW50IGtleV9vdmVycmlkZSwgVUlOVDggKml2LCBVSU5UOCAqaWN2KQoraW50IHdlcF9kZWNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTMyIGxlbiwgaW50IGtleV9vdmVycmlkZSwgdTggKml2LCB1OCAqaWN2KQogewotCVVJTlQzMiBpLCBqLCBrLCBjcmMsIGtleWxlbjsKLQlVSU5UOCBzWzI1Nl0sIGtleVs2NF0sIGNfY3JjWzRdOwotCVVJTlQ4IGtleWlkeDsKKwl1MzIgaSwgaiwgaywgY3JjLCBrZXlsZW47CisJdTggc1syNTZdLCBrZXlbNjRdLCBjX2NyY1s0XTsKKwl1OCBrZXlpZHg7CiAKIAkvKiBOZWVkcyB0byBiZSBhdCBsZWFzdCA4IGJ5dGVzIG9mIHBheWxvYWQgKi8KIAlpZiAobGVuIDw9IDApIHJldHVybiAtMTsKQEAgLTI0NSwxMCArMjQ0LDEwIEBACiB9CiAKIC8qIGVuY3J5cHRzIGluLXBsYWNlLiAqLwotaW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKmJ1ZiwgVUlOVDggKmRzdCwgVUlOVDMyIGxlbiwgaW50IGtleW51bSwgVUlOVDggKml2LCBVSU5UOCAqaWN2KQoraW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwgaW50IGtleW51bSwgdTggKml2LCB1OCAqaWN2KQogewotCVVJTlQzMiBpLCBqLCBrLCBjcmMsIGtleWxlbjsKLQlVSU5UOCBzWzI1Nl0sIGtleVs2NF07CisJdTMyIGksIGosIGssIGNyYywga2V5bGVuOworCXU4IHNbMjU2XSwga2V5WzY0XTsKIAogCS8qIG5vIHBvaW50IGluIFdFUHBpbmcgYW4gZW1wdHkgZnJhbWUgKi8KIAlpZiAobGVuIDw9IDApIHJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdleHQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdleHQuYwppbmRleCBiMmM5ZWEyLi4wZDU3MGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXh0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2V4dC5jCkBAIC0zOCw3ICszOCw2IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KIAogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTQ3LDkgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTIKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC01OCw3ICs1NSw2IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogUHJvamVjdCBJbmNsdWRlcyAqLwogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAKICNpbmNsdWRlICJwODAyMTF0eXBlcy5oIgpAQCAtNzgsMTAgKzc0LDggQEAKIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdlc3NpZChuZXRkZXZpY2VfdCAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCk7Ci0vKiBjb21wYXRpYmlsaXR5IHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KLSNpZmRlZiBXSVJFTEVTU19FWFQKIAotc3RhdGljIFVJTlQ4IHA4MDIxMV9taHpfdG9fY2hhbm5lbChVSU5UMTYgbWh6KQorc3RhdGljIHU4IHA4MDIxMV9taHpfdG9fY2hhbm5lbCh1MTYgbWh6KQogewogCWlmIChtaHogPj0gNTAwMCkgewogCQlyZXR1cm4gKChtaHogLSA1MDAwKSAvIDUpOwpAQCAtOTcsNyArOTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgVUlOVDE2IHA4MDIxMV9jaGFubmVsX3RvX21oeihVSU5UOCBjaCwgaW50IGRvdDExYSkKK3N0YXRpYyB1MTYgcDgwMjExX2NoYW5uZWxfdG9fbWh6KHU4IGNoLCBpbnQgZG90MTFhKQogewogCiAJaWYgKGNoID09IDApCkBAIC0xMjgsNyArMTIyLDcgQEAKIAkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LCAyNDMyLCAyNDM3LCAyNDQyLAogCTI0NDcsIDI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsIDI0NzIsIDI0ODQKIH07Ci0jZGVmaW5lIE5VTV9DSEFOTkVMUyAoc2l6ZW9mKHA4MDIxMXdleHRfY2hhbm5lbF9mcmVxKSAvIHNpemVvZihwODAyMTF3ZXh0X2NoYW5uZWxfZnJlcVswXSkpCisjZGVmaW5lIE5VTV9DSEFOTkVMUyBBUlJBWV9TSVpFKHA4MDIxMXdleHRfY2hhbm5lbF9mcmVxKQogCiAvKiBzdGVhbCBhIHNwYXJlIGJpdCB0byBzdG9yZSB0aGUgc2hhcmVkL29wZW5zeXN0ZW1zIHN0YXRlLiBzaG91bGQgZGVmYXVsdCB0byBvcGVuIGlmIG5vdCBzZXQgKi8KICNkZWZpbmUgSE9TVFdFUF9TSEFSRURLRVkgQklUMwpAQCAtMTQ3LDcgKzE0MSw3IEBACiAKIAogCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDMyIGRpZCwgVUlOVDMyIGRhdGEpCitzdGF0aWMgaW50IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGRpZCwgdTMyIGRhdGEpCiB7CiAJcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90CW1zZzsKIAlwODAyMTFpdGVtX3VpbnQzMl90CQltaWJpdGVtOwpAQCAtMTU5LDcgKzE1Myw3IEBACiAJbWliaXRlbS5kaWQgPSBkaWQ7CiAJbWliaXRlbS5kYXRhID0gZGF0YTsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCURCRkVYSVQ7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTIwMCw3ICsxOTQsNyBAQAogCW1lbWNweShtc2cuc3NpZC5kYXRhLmRhdGEsIHNzaWQsIGRhdGEubGVuZ3RoKTsKIAltc2cuc3NpZC5kYXRhLmxlbiA9IGRhdGEubGVuZ3RoOwogCi0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTI0NSwyMCArMjM5LDE0IEBACiAJd3N0YXRzLT5xdWFsLmxldmVsID0gcXVhbGl0eS5sZXZlbC5kYXRhOyAgLyogaW5zdGFudCBzaWduYWwgbGV2ZWwgKi8KIAl3c3RhdHMtPnF1YWwubm9pc2UgPSBxdWFsaXR5Lm5vaXNlLmRhdGE7ICAvKiBpbnN0YW50IG5vaXNlIGxldmVsICovCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxOAogCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOwotI2Vsc2UKLQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IDc7Ci0jZW5kaWYKIAl3c3RhdHMtPmRpc2NhcmQuY29kZSA9IHdsYW5kZXYtPnJ4LmRlY3J5cHRfZXJyOwogCXdzdGF0cy0+ZGlzY2FyZC5ud2lkID0gMDsKIAl3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDA7CiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMQogCXdzdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCA9IDA7ICAvLyBpbmNvbXBsZXRlIGZyYWdtZW50cwogCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzID0gMDsgICAvLyB0eCByZXRyaWVzLgogCXdzdGF0cy0+bWlzcy5iZWFjb24gPSAwOwotI2VuZGlmCiAKIAlEQkZFWElUOwogCkBAIC0zMTIsNyArMzAwLDcgQEAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFDdXJyZW50Q2hhbm5lbDsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTM2Miw3ICszNTAsNyBAQAogCQltaWJpdGVtLmRhdGEgPSBwODAyMTFfbWh6X3RvX2NoYW5uZWwoZnJlcS0+bSk7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTM3NCw4ICszNjIsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZiBXSVJFTEVTU19FWFQgPiA4Ci0KIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdtb2RlKG5ldGRldmljZV90ICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQpAQCAtNDQ3LDE0ICs0MzMsMTEgQEAKIAl9CiAKIAkvKiBTZXQgT3BlcmF0aW9uIG1vZGUgdG8gdGhlIFBPUlQgVFlQRSBSSUQgKi8KLQotI3dhcm5pbmcgImdldCByaWQgb2YgcDJtaWIgaGVyZSIKLQogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBvcnRUeXBlOwogCW1pYml0ZW0uZGF0YSA9ICgqbW9kZSA9PSBJV19NT0RFX0FESE9DKSA/IDAgOiAxOwogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTQ3OSwxMiArNDYyLDkgQEAKIAlkYXRhLT5sZW5ndGggPSBzaXplb2YoKnJhbmdlKTsKIAltZW1zZXQocmFuZ2UsMCxzaXplb2YoKnJhbmdlKSk7CiAKLSNpZiBXSVJFTEVTU19FWFQgPiA5CiAJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKIAkvLyBYWFggd2hhdCBhYm91dCBtaW4vbWF4X3BtcCwgbWluL21heF9wbXQsIGV0Yy4KLSNlbmRpZgogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTAKIAlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKIAlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxMzsKIApAQCAtNDkyLDE2ICs0NzIsMTMgQEAKIAlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKIAlyYW5nZS0+bWluX3JldHJ5ID0gMDsKIAlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxNgogICAgICAgICByYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX0tfMCB8ICAvL21vZGUvZnJlcS9zc2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXQVApIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdTQ0FOKSk7CiAgICAgICAgIHJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7ICAvL2VuY29kZQogICAgICAgICByYW5nZS0+ZXZlbnRfY2FwYVs0XSA9IChJV19FVkVOVF9DQVBBX01BU0soSVdFVlFVQUwpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZDVVNUT00pICk7Ci0jZW5kaWYKIAogCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBOVU1fQ0hBTk5FTFM7CiAKQEAgLTU0Myw3ICs1MjAsNiBAQAogCURCRkVYSVQ7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd2FwKG5ldGRldmljZV90ICpkZXYsCiAJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTU2MSw3ICs1MzcsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWYgV0lSRUxFU1NfRVhUID4gOAogc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd2VuY29kZShuZXRkZXZpY2VfdCAqZGV2LAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKQEAgLTU3MiwxMCArNTQ3LDEzIEBACiAKIAlEQkZFTlRFUjsKIAorCWkgPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCWVycS0+ZmxhZ3MgPSAwOworCiAJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEKQotCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CiAJZWxzZQotCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKIAogCWlmICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9FWENMVURFVU5FTkNSWVBURUQpCiAJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CkBAIC02MTMsNyArNTkxLDYgQEAKIAogCWludCBlcnIgPSAwOwogCWludCByZXN1bHQgPSAwOwotCWludCBlbmFibGUgPSAwOwogCWludCBpOwogCiAJREJGRU5URVI7CkBAIC02MzIsMjMgKzYwOSwyMyBAQAogCQllbHNlCiAJCQlpLS07CiAKLQkJcmVzdWx0ID0gcDgwMjExd2V4dF9kb3JlcXVlc3Qod2xhbmRldiwgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlELCBpKTsKKwkJLyogU2V0IGN1cnJlbnQga2V5IG51bWJlciBvbmx5IGlmIG5vIGtleXMgYXJlIGdpdmVuICovCisJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSB7CisJCQlyZXN1bHQgPSBwODAyMTF3ZXh0X2RvcmVxdWVzdCh3bGFuZGV2LCBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBEZWZhdWx0S2V5SUQsIGkpOwogCi0JCWlmIChyZXN1bHQpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllbmFibGUgPSAxOworCQkJaWYgKHJlc3VsdCkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBleGl0OworCQkJfQogCQl9CiAKLQl9Ci0JZWxzZSB7Ci0JCS8vIERvIG5vdCB0aGluZyB3aGVuIG5vIEtleSBJbmRleAorCX0gZWxzZSB7CisJCS8vIFVzZSBkZWZhdWx0a2V5IGlmIG5vIEtleSBJbmRleAorCQlpID0gd2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfREVGQVVMVEtFWV9NQVNLOwogCX0KIAogCS8qIENoZWNrIGlmIHRoZXJlIGlzIG5vIGtleSBpbmZvcm1hdGlvbiBpbiB0aGUgaXdjb25maWcgcmVxdWVzdCAqLwotCWlmKChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSA9PSAwICYmIGVuYWJsZSA9PSAxKSB7CisJaWYoKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpID09IDAgKSB7CiAKIAkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJICogSWYgdGhlcmUgaXMgV0VQIEtleSBmb3Igc2V0dGluZywgY2hlY2sgdGhlIEtleSBJbmZvcm1hdGlvbgpAQCAtNjkwLDcgKzY2Nyw3IEBACiAKIAkJCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKIAkJCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmcHN0ciwgc2l6ZW9mKHBzdHIpKTsKLQkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCQkJaWYgKHJlc3VsdCkgewogCQkJCWVyciA9IC1FRkFVTFQ7CkBAIC03MDMsOCArNjgwLDcgQEAKIAkvKiBDaGVjayB0aGUgUHJpdmFjeUludm9rZWQgZmxhZyAqLwogCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CiAJCXJlc3VsdCA9IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXYsIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVByaXZhY3lJbnZva2VkLCBQODAyMTFFTlVNX3RydXRoX2ZhbHNlKTsKLQl9Ci0JZWxzZSBpZigoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9FTkFCTEVEKSB8fCBlbmFibGUgPT0gMSkgeworCX0gZWxzZSB7CiAJCXJlc3VsdCA9IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXYsIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVByaXZhY3lJbnZva2VkLCBQODAyMTFFTlVNX3RydXRoX3RydWUpOwogCX0KIApAQCAtNzEzLDcgKzY4OSwxMyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JLyogQ2hlY2sgdGhlIEV4Y2x1ZGVVbmVuY3J5cHRlZCBmbGFnICovCisJLyogIFRoZSAgc2VjdXJpdHkgIG1vZGUgIG1heSAgYmUgb3BlbiBvciByZXN0cmljdGVkLCBhbmQgaXRzIG1lYW5pbmcKKwkgICAgZGVwZW5kcyBvbiB0aGUgY2FyZCB1c2VkLiBXaXRoICBtb3N0ICBjYXJkcywgIGluICBvcGVuICBtb2RlICBubworCSAgICBhdXRoZW50aWNhdGlvbiAgaXMgIHVzZWQgIGFuZCAgdGhlICBjYXJkICBtYXkgIGFsc28gIGFjY2VwdCBub24tCisJICAgIGVuY3J5cHRlZCBzZXNzaW9ucywgd2hlcmVhcyBpbiByZXN0cmljdGVkICBtb2RlICBvbmx5ICBlbmNyeXB0ZWQKKwkgICAgc2Vzc2lvbnMgIGFyZSAgYWNjZXB0ZWQgIGFuZCB0aGUgY2FyZCB3aWxsIHVzZSBhdXRoZW50aWNhdGlvbiBpZgorCSAgICBhdmFpbGFibGUuCisJKi8KIAlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB7CiAJCXJlc3VsdCA9IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXYsIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCwgUDgwMjExRU5VTV90cnV0aF90cnVlKTsKIAl9CkBAIC03OTgsNyArNzgwLDcgQEAKIAltc2cuc3NpZC5kYXRhLmxlbiA9IGxlbmd0aDsKIAogCVdMQU5fTE9HX0RFQlVHKDEsImF1dG9qb2luX3NzaWQgZm9yICVzIFxuIixlc3NpZCk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwiYXV0b2pvaW5fc3NpZCAlZFxuIixyZXN1bHQpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtODUwLDcgKzgzMiw3IEBACiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0OwogCW1pYml0ZW0uZGlkID0gRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTg2MywxMCArODQ1LDEwIEBACiAJcnJxLT5kaXNhYmxlZCA9IDA7CiAJcnJxLT52YWx1ZSA9IDA7CiAKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xCQkJKChVSU5UMTYpMSkKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8yCQkJKChVSU5UMTYpMikKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF81ZG90NQkJCSgoVUlOVDE2KTQpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMTEJCQkoKFVJTlQxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzEJCQkoKHUxNikxKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzIJCQkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzVkb3Q1CQkJKCh1MTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xMQkJCSgodTE2KTgpCiAKIAlzd2l0Y2ggKG1pYml0ZW0uZGF0YSkgewogCWNhc2UgSEZBMzg0eF9SQVRFQklUXzE6CkBAIC05MDQsNyArODg2LDcgQEAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVJUU1RocmVzaG9sZDsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTk0OCw3ICs5MzAsNyBAQAogCQltaWJpdGVtLmRhdGEgPSBydHMtPnZhbHVlOwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC05NzUsNyArOTU3LDcgQEAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMDE5LDcgKzEwMDEsNyBAQAogCQltaWJpdGVtLmRhdGEgPSBmcmFnLT52YWx1ZTsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTAzMSwxMCArMTAxMyw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2VuZGlmICAvKiBXSVJFTEVTU19FWFQgPiA4ICovCi0KLSNpZiBXSVJFTEVTU19FWFQgPiAxMAotCiAjaWZuZGVmIElXX1JFVFJZX0xPTkcKICNkZWZpbmUgSVdfUkVUUllfTE9ORyBJV19SRVRSWV9NQVgKICNlbmRpZgpAQCAtMTA1Miw3ICsxMDMwLDcgQEAKIAlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICAgIG1zZzsKIAlpbnQgcmVzdWx0OwogCWludCBlcnIgPSAwOwotCVVJTlQxNiBzaG9ydHJldHJ5LCBsb25ncmV0cnksIGxpZmV0aW1lOworCXUxNiBzaG9ydHJldHJ5LCBsb25ncmV0cnksIGxpZmV0aW1lOwogCiAJREJGRU5URVI7CiAKQEAgLTEwNjAsNyArMTAzOCw3IEBACiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVNob3J0UmV0cnlMaW1pdDsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTA3NCw3ICsxMDUyLDcgQEAKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTG9uZ1JldHJ5TGltaXQ7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTEwODgsNyArMTA2Niw3IEBACiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1heFRyYW5zbWl0TVNEVUxpZmV0aW1lOwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMTUxLDcgKzExMjksNyBAQAogCQltaWJpdGVtLmRhdGEgPSAgcnJxLT52YWx1ZSAvPSAxMDI0OwogCiAJCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJZXJyID0gLUVGQVVMVDsKQEAgLTExNjMsNyArMTE0MSw3IEBACiAJCQltaWJpdGVtLmRhdGEgPSBycnEtPnZhbHVlOwogCiAJCQltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAkJCWlmIChyZXN1bHQpIHsKIAkJCQllcnIgPSAtRUZBVUxUOwpAQCAtMTE3Niw3ICsxMTU0LDcgQEAKIAkJCW1pYml0ZW0uZGF0YSA9IHJycS0+dmFsdWU7CiAKIAkJCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCQkJaWYgKHJlc3VsdCkgewogCQkJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMTkxLDkgKzExNjksNiBAQAogCiB9CiAKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLwotCi0jaWYgV0lSRUxFU1NfRVhUID4gOQogc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd3R4cG93KG5ldGRldmljZV90ICpkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCkBAIC0xMjEyLDIyICsxMTg3LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBtc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7Ci0KLSAgICAgICAgc3dpdGNoIChycnEtPnZhbHVlKSB7Ci0KLSAgICAgICAgICBjYXNlIDEgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDE7IGJyZWFrOwotICAgICAgICAgIGNhc2UgMiA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMjsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAzIDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwzOyBicmVhazsKLSAgICAgICAgICBjYXNlIDQgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDQ7IGJyZWFrOwotICAgICAgICAgIGNhc2UgNSA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNTsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA2IDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw2OyBicmVhazsKLSAgICAgICAgICBjYXNlIDcgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDc7IGJyZWFrOwotICAgICAgICAgIGNhc2UgOCA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsODsgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw4OyBicmVhazsKLQl9Ci0KKwltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWw7CisJaWYgKHJycS0+Zml4ZWQgPT0gMCkKKwkgIG1pYml0ZW0uZGF0YSA9IDMwOworCWVsc2UKKwkgIG1pYml0ZW0uZGF0YSA9IHJycS0+dmFsdWU7CiAgICAgICAgIG1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLSAgICAgICAgcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworICAgICAgICByZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgIGVyciA9IC1FRkFVTFQ7CkBAIC0xMjU1LDcgKzEyMjEsNyBAQAogCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbDsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTI3NSw3ICsxMjQxLDYgQEAKIAlEQkZFWElUOwogCXJldHVybiBlcnI7CiB9Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOSAqLwogCiBzdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3c3B5KG5ldGRldmljZV90ICpkZXYsCiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCkBAIC0xMzczLDcgKzEzMzgsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMwogc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd3NjYW4obmV0ZGV2aWNlX3QgKmRldiwKIAkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgICAgc3RydWN0IGl3X3BvaW50ICpzcnEsIGNoYXIgKmV4dHJhKQpAQCAtMTQwOSw3ICsxMzczLDcgQEAKIAltc2cubWF4Y2hhbm5lbHRpbWUuZGF0YSA9IDI1MDsKIAltc2cubWluY2hhbm5lbHRpbWUuZGF0YSA9IDIwMDsKIAotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAJaWYgKHJlc3VsdCkKIAkJZXJyID0gcHJpc20yX3Jlc3VsdDJlcnIgKG1zZy5yZXN1bHRjb2RlLmRhdGEpOwogCkBAIC0xNTIwLDcgKzE0ODQsNyBAQAogCQltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHM7CiAJCW1zZy5ic3NpbmRleC5kYXRhID0gaTsKIAotCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAkJaWYgKChyZXN1bHQgIT0gMCkgfHwKIAkJICAgIChtc2cucmVzdWx0Y29kZS5kYXRhICE9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzKSkgewogCQkJYnJlYWs7CkBAIC0xNTQwLDEyICsxNTA0LDEwIEBACiAJREJGRVhJVDsKIAlyZXR1cm4gZXJyOwogfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8vZXh0cmEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBzdHVmZiB0byBzdXBwb3J0IE5ldHdvcmtNYW5hZ2VyIChJIGhvcGUpCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxNwogLyogU0lPQ1NJV0VOQ09ERUVYVCAqLwogc3RhdGljIGludCBwODAyMTF3ZXh0X3NldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLApAQCAtMTU4MCw3ICsxNTQyLDcgQEAKIAogCiAgIGlmICggZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkgKSB7Ci0gICAgaWYgKCAhIGV4dC0+YWxnICYgSVdfRU5DT0RFX0FMR19XRVApIHsKKyAgICBpZiAoIShleHQtPmFsZyAmIElXX0VOQ09ERV9BTEdfV0VQKSkgewogICAgICAgV0xBTl9MT0dfREVCVUcoMSwiYXNrZWQgdG8gc2V0IGEgbm9uIHdlcCBrZXkgOigiKTsKICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTE2MTUsNyArMTU3Nyw3IEBACiAgICAgICBicmVhazsKICAgICB9CiAgICAgbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWlic2V0OwotICAgIHJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwoVUlOVDgqKSZtc2cpOworICAgIHJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwodTgqKSZtc2cpOwogICAgIFdMQU5fTE9HX0RFQlVHKDEsInJlc3VsdCAoJWQpXG4iLHJlc3VsdCk7CiAgIH0KICAgcmV0dXJuIHJlc3VsdDsKQEAgLTE3NjMsMjYgKzE3MjUsNiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi0KLSNlbmRpZgotCi0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotCi0KLS8qCi10eXBlZGVmIGludCAoKml3X2hhbmRsZXIpKG5ldGRldmljZV90ICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLSovCi0KLSNpZiBXSVJFTEVTU19FWFQgPiAxMgogc3RhdGljIGl3X2hhbmRsZXIgcDgwMjExd2V4dF9oYW5kbGVyc1tdID0gIHsKIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdjb21taXQsCQkvKiBTSU9DU0lXQ09NTUlUICovCiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3bmFtZSwJCS8qIFNJT0NHSVdOQU1FICovCkBAIC0xODA4LDEzICsxNzUwLDggQEAKIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdhcCwgICAgICAgICAJCS8qIFNJT0NHSVdBUCAqLwogCShpd19oYW5kbGVyKSBOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgCQkvKiBTSU9DR0lXQVBMSVNUICovCi0jaWYgV0lSRUxFU1NfRVhUID4gMTMKLQkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdzY2FuLAkJCS8qIFNJT0NTSVdTQ0FOICovCi0JKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3c2NhbiwJCQkvKiBTSU9DR0lXU0NBTiAqLwotI2Vsc2UgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogbnVsbCAqLwkJLyogU0lPQ1NJV1NDQU4gKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogbnVsbCAqLwkJLyogU0lPQ0dJV1NDQU4gKi8KLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd3NjYW4sCQkvKiBTSU9DU0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd3NjYW4sCQkvKiBTSU9DR0lXU0NBTiAqLwogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd2Vzc2lkLCAgCQkvKiBTSU9DU0lXRVNTSUQgKi8KIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdlc3NpZCwgICAgICAJCS8qIFNJT0NHSVdFU1NJRCAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgCQkvKiBTSU9DU0lXTklDS04gKi8KQEAgLTE4MzUsOSArMTc3Miw3IEBACiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3ZW5jb2RlLCAgCQkvKiBTSU9DR0lXRU5DT0RFICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAJCS8qIFNJT0NTSVdQT1dFUiAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgIAkJLyogU0lPQ0dJV1BPV0VSICovCi0jaWYgV0lSRUxFU1NfRVhUID4gMTcKIC8qIFdQQSBvcGVyYXRpb25zICovCi0KIAkoaXdfaGFuZGxlcikgTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwogCShpd19oYW5kbGVyKSBOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsIC8qIFNJT0NTSVdHRU5JRQlzZXQgZ2VuZXJpYyBJRSAqLwpAQCAtMTg0OCwxNzAgKzE3ODMsMTggQEAKIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zZXRfZW5jb2RlZXh0LCAvKiBTSU9DU0lXRU5DT0RFRVhUICBzZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlICovCiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2V0X2VuY29kZWV4dCwgLyogU0lPQ0dJV0VOQ09ERUVYVCAgZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAvKiBTSU9DU0lXUE1LU0EJUE1LU0EgY2FjaGUgb3BlcmF0aW9uICovCi0jZW5kaWYKIH07CiAKIHN0cnVjdCBpd19oYW5kbGVyX2RlZiBwODAyMTF3ZXh0X2hhbmRsZXJfZGVmID0gewotCS5udW1fc3RhbmRhcmQgPSBzaXplb2YocDgwMjExd2V4dF9oYW5kbGVycykgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9zdGFuZGFyZCA9IEFSUkFZX1NJWkUocDgwMjExd2V4dF9oYW5kbGVycyksCiAJLm51bV9wcml2YXRlID0gMCwKIAkubnVtX3ByaXZhdGVfYXJncyA9IDAsCiAgICAgICAgIC5zdGFuZGFyZCA9IHA4MDIxMXdleHRfaGFuZGxlcnMsCiAJLnByaXZhdGUgPSBOVUxMLAogCS5wcml2YXRlX2FyZ3MgPSBOVUxMLAotI2lmIFdJUkVMRVNTX0VYVCA+IDE2CiAJLmdldF93aXJlbGVzc19zdGF0cyA9IHA4MDIxMXdleHRfZ2V0X3dpcmVsZXNzX3N0YXRzCi0jZW5kaWYKIH07CiAKLSNlbmRpZgotCi0vKiB3aXJlbGVzcyBleHRlbnNpb25zJyBpb2N0bHMgKi8KLWludCBwODAyMTF3ZXh0X3N1cHBvcnRfaW9jdGwobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTMKLQlzdHJ1Y3QgaXdyZXEgKml3ciA9IChzdHJ1Y3QgaXdyZXEqKWlmcjsKLSNlbmRpZgotCi0JcDgwMjExaXRlbV91aW50MzJfdCAgICAgICAgICAgICBtaWJpdGVtOwotCWludCBlcnIgPSAwOwotCi0JREJGRU5URVI7Ci0KLQltaWJpdGVtLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCWlmICggd2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfUlVOTklORyApIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBleGl0OwotCX0KLQotCVdMQU5fTE9HX0RFQlVHKDEsICJSZWNlaXZlZCB3aXJlbGVzcyBleHRlbnNpb24gaW9jdGwgIyVkLlxuIiwgY21kKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0jaWYgV0lSRUxFU1NfRVhUIDwgMTMKLQljYXNlIFNJT0NTSVdOQU1FOiAgLyogdW51c2VkICAqLwotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdOQU1FOiAvKiBnZXQgbmFtZSA9PSB3aXJlbGVzcyBwcm90b2NvbCAqLwotICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfZ2l3bmFtZShkZXYsIE5VTEwsIChjaGFyICopICZpd3ItPnUsIE5VTEwpOwotCQlicmVhazsKLQljYXNlIFNJT0NTSVdOV0lEOgotCWNhc2UgU0lPQ0dJV05XSUQ6Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ1NJV0ZSRVE6IC8qIHNldCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgZXJyID0gcDgwMjExd2V4dF9zaXdmcmVxKGRldiwgTlVMTCwgJihpd3ItPnUuZnJlcSksIE5VTEwpOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdGUkVROiAvKiBnZXQgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfZ2l3ZnJlcShkZXYsIE5VTEwsICYoaXdyLT51LmZyZXEpLCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DU0lXUkFOR0U6Ci0JY2FzZSBTSU9DU0lXUFJJVjoKLQljYXNlIFNJT0NTSVdBUDogLyogc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzIChCU1NJRCkgKi8KLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdBUDoJLyogZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzIChCU1NJRCkgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwODAyMTF3ZXh0X2dpd2FwKGRldiwgTlVMTCwgJihpd3ItPnUuYXBfYWRkciksIE5VTEwpOwotCQlicmVhazsKLQotI2lmIFdJUkVMRVNTX0VYVCA+IDgKLQljYXNlIFNJT0NTSVdNT0RFOiAvKiBzZXQgb3BlcmF0aW9uIG1vZGUgKi8KLQljYXNlIFNJT0NTSVdFU1NJRDogLyogc2V0IFNTSUQgKG5ldHdvcmsgbmFtZSkgKi8KLQljYXNlIFNJT0NTSVdSQVRFOiAvKiBzZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKSAqLwotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV01PREU6IC8qIGdldCBvcGVyYXRpb24gbW9kZSAqLwotCQllcnIgPSBwODAyMTF3ZXh0X2dpd21vZGUoZGV2LCBOVUxMLCAmaXdyLT51Lm1vZGUsIE5VTEwpOwotCi0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV05JQ0tOOiAvKiBnZXQgbm9kZSBuYW1lL25pY2tuYW1lICovCi0JY2FzZSBTSU9DR0lXRVNTSUQ6IC8qIGdldCBTU0lEICovCi0JCWlmKGl3ci0+dS5lc3NpZC5wb2ludGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07Ci0JCQltZW1zZXQoc3NpZCwgMCwgc2l6ZW9mKHNzaWQpKTsKLQotCQkJZXJyID0gcDgwMjExd2V4dF9naXdlc3NpZChkZXYsIE5VTEwsICZpd3ItPnUuZXNzaWQsIHNzaWQpOwotCQkJaWYoY29weV90b191c2VyKGl3ci0+dS5lc3NpZC5wb2ludGVyLCBzc2lkLCBzaXplb2Yoc3NpZCkpKQotCQkJCWVyciA9ICgtRUZBVUxUKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNJT0NHSVdSQVRFOgotICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfZ2l3cmF0ZShkZXYsIE5VTEwsICZpd3ItPnUuYml0cmF0ZSwgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV1JUUzoKLQkJZXJyID0gcDgwMjExd2V4dF9naXdydHMoZGV2LCBOVUxMLCAmaXdyLT51LnJ0cywgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV0ZSQUc6Ci0JCWVyciA9IHA4MDIxMXdleHRfZ2l3ZnJhZyhkZXYsIE5VTEwsICZpd3ItPnUucnRzLCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXRU5DT0RFOgotCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQllcnIgPSAtRVBFUk07Ci0JCWVsc2UgaWYgKGl3ci0+dS5lbmNvZGluZy5wb2ludGVyKSB7Ci0JCQljaGFyIGtleWJ1ZltNQVhfS0VZTEVOXTsKLQkJCWVyciA9IHA4MDIxMXdleHRfZ2l3ZW5jb2RlKGRldiwgTlVMTCwKLQkJCQkJCSAgICAgJml3ci0+dS5lbmNvZGluZywga2V5YnVmKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoaXdyLT51LmVuY29kaW5nLnBvaW50ZXIsIGtleWJ1ZiwKLQkJCQkJIGl3ci0+dS5lbmNvZGluZy5sZW5ndGgpKQotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXQVBMSVNUOgotCWNhc2UgU0lPQ1NJV1JUUzoKLQljYXNlIFNJT0NTSVdGUkFHOgotCWNhc2UgU0lPQ1NJV1NFTlM6Ci0JY2FzZSBTSU9DR0lXU0VOUzoKLQljYXNlIFNJT0NTSVdOSUNLTjogLyogc2V0IG5vZGUgbmFtZS9uaWNrbmFtZSAqLwotCWNhc2UgU0lPQ1NJV0VOQ09ERTogLyogc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLwotCWNhc2UgU0lPQ1NJV1NQWToKLQljYXNlIFNJT0NHSVdTUFk6Ci0JY2FzZSBTSU9DU0lXUE9XRVI6Ci0JY2FzZSBTSU9DR0lXUE9XRVI6Ci0JY2FzZSBTSU9DR0lXUFJJVjoKLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXUkFOR0U6Ci0JCWlmKGl3ci0+dS5kYXRhLnBvaW50ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JhbmdlIHJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcDgwMjExd2V4dF9naXdyYW5nZShkZXYsIE5VTEwsICZpd3ItPnUuZGF0YSwKLQkJCQkJCSAgKGNoYXIgKikgJnJhbmdlKTsKLQkJCS8qIFB1c2ggdGhhdCB1cCB0byB0aGUgY2FsbGVyICovCi0JCQlpZiAoY29weV90b191c2VyKGl3ci0+dS5kYXRhLnBvaW50ZXIsICZyYW5nZSwgc2l6ZW9mKHJhbmdlKSkpCi0JCQkJZXJyID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCi0jaWYgV0lSRUxFU1NfRVhUID4gOQotCWNhc2UgU0lPQ1NJV1RYUE9XOgotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdUWFBPVzoKLQkJZXJyID0gcDgwMjExd2V4dF9naXd0eHBvdyhkZXYsIE5VTEwsICZpd3ItPnUudHhwb3dlciwgTlVMTCk7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDkgKi8KLSNpZiBXSVJFTEVTU19FWFQgPiAxMAotCWNhc2UgU0lPQ1NJV1JFVFJZOgotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdSRVRSWToKLQkJZXJyID0gcDgwMjExd2V4dF9naXdyZXRyeShkZXYsIE5VTEwsICZpd3ItPnUucmV0cnksIE5VTEwpOwotCQlicmVhazsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLwotCi0jZW5kaWYgLyogV0lSRUxFU1NfRVhUIDw9IDEyICovCi0KLQlkZWZhdWx0OgotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQl9Ci0KLSBleGl0OgotCURCRkVYSVQ7Ci0JcmV0dXJuIChlcnIpOwotfQogCiBpbnQgcDgwMjExd2V4dF9ldmVudF9hc3NvY2lhdGVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGFzc29jKQogewpAQCAtMjAxOSw3ICsxODAyLDYgQEAKIAogICAgICAgICBEQkZFTlRFUjsKIAotI2lmIFdJUkVMRVNTX0VYVCA+IDEzCiAgICAgICAgIC8qIFNlbmQgdGhlIGFzc29jaWF0aW9uIHN0YXRlIGZpcnN0ICovCiAgICAgICAgIGRhdGEuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAgICAgICAgIGlmIChhc3NvYykgewpAQCAtMjAzNCwxNSArMTgxNiwxMiBAQAogICAgICAgICBpZiAoIWFzc29jKSBnb3RvIGRvbmU7CiAKICAgICAgICAgLy8gWFhYIHNlbmQgYXNzb2NpYXRpb24gZGF0YSwgbGlrZSBJRXMsIGV0YyBldGMuCi0jZW5kaWYKKwogIGRvbmU6CiAgICAgICAgIERCRkVYSVQ7CiAgICAgICAgIHJldHVybiAwOwogfQogCiAKLSNlbmRpZiAvKiBjb21wYXRpYmlsaXR5IHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KLQotCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjZTU2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ODcgKzAsMCBAQAotI2RlZmluZSBXTEFOX0hPU1RJRiBXTEFOX1BDTUNJQQotI2luY2x1ZGUgImhmYTM4NHguYyIKLSNpbmNsdWRlICJwcmlzbTJtZ210LmMiCi0jaW5jbHVkZSAicHJpc20ybWliLmMiCi0jaW5jbHVkZSAicHJpc20yc3RhLmMiCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNCwyMSkgKQotI2lmIChXTEFOX0NQVV9GQU1JTFkgPT0gV0xBTl9JeDg2KQotI2lmbmRlZiBDT05GSUdfSVNBCi0jd2FybmluZyAiWW91IG1heSBuZWVkIHRvIGVuYWJsZSBJU0Egc3VwcG9ydCBpbiB5b3VyIGtlcm5lbC4iCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDExKSApCi1zdGF0aWMgdV9pbnQJaXJxX21hc2sgPSAweGRlYjg7CQkvKiBJbnRlcnJ1cHQgbWFzayAqLwotc3RhdGljIGludAlpcnFfbGlzdFs0XSA9IHsgLTEgfTsJCS8qIEludGVycnVwdCBsaXN0ICovCi0jZW5kaWYKLXN0YXRpYyB1X2ludAlwcmlzbTJfaWdub3JldmNjPTE7CQkvKiBCb29sZWFuLCBpZiBzZXQsIHdlCi0JCQkJCQkgKiBpZ25vcmUgd2hhdCB0aGUgVmNjCi0JCQkJCQkgKiBpcyBzZXQgdG8gYW5kIHdoYXQgdGhlIENJUwotCQkJCQkJICogc2F5cy4KLQkJCQkJCSAqLwotbW9kdWxlX3BhcmFtKCBwcmlzbTJfaWdub3JldmNjLCBpbnQsIDA2NDQpOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkgKQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDkpKQotc3RhdGljIGludCBudW1saXN0ID0gNDsKLW1vZHVsZV9wYXJhbV9hcnJheShpcnFfbGlzdCwgaW50LCBudW1saXN0LCAwNDQ0KTsKLSNlbHNlCi1tb2R1bGVfcGFyYW1fYXJyYXkoaXJxX2xpc3QsIGludCwgTlVMTCwgMDQ0NCk7Ci0jZW5kaWYKLW1vZHVsZV9wYXJhbSggaXJxX21hc2ssIGludCwgMDY0NCk7Ci0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKLXN0YXRpYyBpbnQgcHJpc20yX2NzX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpOwotc3RhdGljIGludCBwcmlzbTJfY3NfcmVzdW1lKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KTsKLXN0YXRpYyB2b2lkIHByaXNtMl9jc19yZW1vdmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpOwotc3RhdGljIGludCBwcmlzbTJfY3NfcHJvYmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpOwotI2Vsc2UKLWRldl9saW5rX3QJKnByaXNtMnN0YV9hdHRhY2godm9pZCk7Ci1zdGF0aWMgdm9pZAlwcmlzbTJzdGFfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspOwotc3RhdGljIHZvaWQJcHJpc20yc3RhX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKLXN0YXRpYyB2b2lkCXByaXNtMnN0YV9yZWxlYXNlKHVfbG9uZyBhcmcpOwotc3RhdGljIGludCAJcHJpc20yc3RhX2V2ZW50IChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7Ci0KLXN0YXRpYyBkZXZfbGlua190CSpkZXZfbGlzdCA9IE5VTEw7CS8qIGhlYWQgb2YgaW5zdGFuY2UgbGlzdCAqLwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBjc19lcnJvcgotKgotKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IGNhcmQgc2VydmljZXMgZXJyb3IgbWVzc2FnZXMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaGFuZGxlCWNsaWVudCBoYW5kbGUgaWRlbnRpZnlpbmcgdGhpcyBDUyBjbGllbnQKLSoJZnVuYwlDUyBmdW5jdGlvbiBudW1iZXIgdGhhdCBnZW5lcmF0ZWQgdGhlIGVycm9yCi0qCXJldAlDUyBmdW5jdGlvbiByZXR1cm4gY29kZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgY3NfZXJyb3IoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW50IGZ1bmMsIGludCByZXQpCi17Ci0jaWYgKGRlZmluZWQoQ1NfUkVMRUFTRV9DT0RFKSAmJiAoQ1NfUkVMRUFTRV9DT0RFIDwgMHgyOTExKSkKLQlDYXJkU2VydmljZXMoUmVwb3J0RXJyb3IsIGRldl9pbmZvLCAodm9pZCAqKWZ1bmMsICh2b2lkICopcmV0KTsKLSNlbHNlCi0JZXJyb3JfaW5mb190IGVyciA9IHsgZnVuYywgcmV0IH07Ci0JcGNtY2lhX3JlcG9ydF9lcnJvcihoYW5kbGUsICZlcnIpOwotI2VuZGlmCi19Ci0jZWxzZSAvLyBrZXJuZWxfdmVyc2lvbgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDEyKQotc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHByaXNtMl9jc19pZHNbXSA9IHsKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSU5URVJTSUwiLCAgIkhGQTM4NHgvSUVFRSIsIDB4NzRjNWU0MGQsIDB4ZGI0NzJhMTgpLCAvLyBJbnRlcnNpbCBQUklTTTIgUmVmZXJlbmNlIERlc2lnbiAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMzgsIDB4MDAwMiksIC8vIENvbXBhcSBXTDEwMC8yMDAgMTFNYi9zIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjhhLCAweDAwMDIpLCAvLyBDb21wYXEgaVBhcSBITlctMTAwIDExTWIvcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI1MCwgMHgwMDAyKSwgLy8gU2Ftc3VuZyBTV0wyMDAwLU4gMTFNYi9zIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMDIpLCAvLyBaLUNvbSBYSTMwMCAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiWm9vbUFpciAxMU1icHMgSGlnaCIsICAiUmF0ZSB3aXJlbGVzcyBOZXR3b3JraW5nIiwgMHgyNzNmZTNkYiwgMHgzMmExZWFlZSksIC8vIFpvb21BaXIgNDEwMCAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkluc3RhbnQgV2lyZWxlc3MgIiwgICIgTmV0d29yayBQQyBDQVJEIiwgICJWZXJzaW9uIDAxLjAyIiwgMHgxMWQ5MDFhZiwgMHg2ZTliZDkyNiwgMHg0Yjc0YmFhMCksIC8vIExpbmtzeXMgV1BDMTEgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJBZGR0cm9uIiwgICJBV1AtMTAwIFdpcmVsZXNzIFBDTUNJQSIsICAiVmVyc2lvbiAwMS4wMiIsIDB4ZTZlYzUyY2UsIDB4ODY0OWFmMiwgMHg0Yjc0YmFhMCksIC8vIEFkZHRyb24gQVdQLTEwMCAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkQiLCAgIkxpbmsgRFdMLTY1MCAxMU1icHMgV0xBTiBDYXJkIiwgICJWZXJzaW9uIDAxLjAyIiwgMHg3MWIxODU4OSwgMHhiNmYxYjBhYiwgMHg0Yjc0YmFhMCksIC8vIEQtTGluayBEV0wtNjUwIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiU01DIiwgICJTTUMyNjMyVyIsICAiVmVyc2lvbiAwMS4wMiIsIDB4YzRmOGIxOGIsIDB4NDc0YTFmMmEsIDB4NGI3NGJhYTApLCAvLyBTTUMgMjYzMlcgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiSW50ZXJzaWwiLCAgIlBSSVNNIDJfNSBQQ01DSUEgQURBUFRFUiIsICAiSVNMMzczMDBQIiwgICJFdmFsLVJldkEiLCAweDRiODAxYTE3LCAweDYzNDVhMGJmLCAweGM5MDQ5YTM5LCAweGMyM2FkYzBlKSwgLy8gQnJvTWF4IEZyZWVwb3J0IDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZCAoUHJpc20gMi41KQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiVS5TLiBSb2JvdGljcyIsICAiSUVFRSA4MDIuMTFiIFBDLUNBUkQiLCAgIlZlcnNpb24gMDEuMDIiLCAweGM3YjhkZjlkLCAweDE3MDBkMDg3LCAweDRiNzRiYWEwKSwgLy8gVS5TLiBSb2JvdGljcyBJRUVFIDgwMi4xMWIgUEMtQ0FSRAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEaWdpdGFsIERhdGEgQ29tbXVuaWNhdGlvbnMiLCAgIldQQy0wMTAwIiwgMHhmZGQ3MzQ3MCwgMHhlMGI2ZjE0NiksIC8vIExldmVsLU9uZSBXUEMtMDEwMAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI3NCwgMHgxNjEyKSwgLy8gQnJvbWF4IE9FTSAxMU1icHMgODAyLjExYiBXTEFOIENhcmQgKFByaXNtIDIuNSkKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNzQsIDB4MTYxMyksIC8vIEJyb21heCBPRU0gMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkIChQcmlzbSAzKQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EgSy5LLiIsICAiV2lyZWxlc3MgTEFOIFBDQy0xMSIsIDB4NTI2MTQ0MGYsIDB4YTY0MDU1ODQpLCAvLyBjb3JlZ2EgSy5LLiBXaXJlbGVzcyBMQU4gUENDLTExCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgICJXaXJlbGVzcyBMQU4gUENDQS0xMSIsIDB4NTI2MTQ0MGYsIDB4ZGY2MTE1ZjkpLCAvLyBjb3JlZ2EgSy5LLiBXaXJlbGVzcyBMQU4gUENDQS0xMQotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4YzAwMSwgMHgwMDA4KSwgLy8gQ09OVEVDIEZMRVhTQ0FOL0ZYLUREUzExMC1QQ0MKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUExBTkVYIiwgICJHZW9XYXZlL0dXLU5TMTEwIiwgMHgyMDlmNDBhYiwgMHg0NjI2MzE3OCksIC8vIFBMQU5FWCBHZW9XYXZlL0dXLU5TMTEwCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJPRU0iLCAgIlBSSVNNMiBJRUVFIDgwMi4xMSBQQy1DYXJkIiwgICJWZXJzaW9uIDAxLjAyIiwgMHhmZWE1NGM5MCwgMHg0OGYyYmRkNiwgMHg0Yjc0YmFhMCksIC8vIEFtYmljb20gV0wxMTAwIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiTGVBcnRlcnkiLCAgIlNZTkNCWUFJUiAxMU1icHMgV2lyZWxlc3MgTEFOIFBDIENhcmQiLCAgIlZlcnNpb24gMDEuMDIiLCAweDdlM2IzMjZhLCAweDQ5ODkzZTkyLCAweDRiNzRiYWEwKSwgLy8gTGVBcnRlcnkgU1lOQ0JZQUlSIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMWZmLCAweDAwMDgpLCAvLyBJbnRlcm1lYyBNb2JpbGVMQU4gMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJORVRHRUFSIE1BNDAxIFdpcmVsZXNzIFBDIiwgICJDYXJkIiwgICJWZXJzaW9uIDAxLjAwIiwgMHhhMzc0MzRlOSwgMHg5NzYyZThmMSwgMHhhNTdhZGI4YyksIC8vIE5FVEdFQVIgTUE0MDEgMTFNYnBzIDgwMi4xMSBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJJbnRlcnNpbCIsICAiUFJJU00gRnJlZWRvbSBQQ01DSUEgQWRhcHRlciIsICAiSVNMMzcxMDBQIiwgICJFdmFsLVJldkEiLCAweDRiODAxYTE3LCAweGYyMjJlYzJkLCAweDYzMGQ1MmIyLCAweGMyM2FkYzBlKSwgLy8gSW50ZXJzaWwgUFJJU00gRnJlZWRvbSAxMW1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiT1RDIiwgICJXaXJlbGVzcyBBaXJFWlkgMjQxMS1QQ0MgV0xBTiBDYXJkIiwgICJWZXJzaW9uIDAxLjAyIiwgMHg0YWM0NDI4NywgMHgyMzVhNmJlZCwgMHg0Yjc0YmFhMCksIC8vIE9UQyBXaXJlbGVzcyBBaXJFWlkgMjQxMS1QQ0MgMTFNYnBzIDgwMi4xMSBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCI4MDIuMTEiLCAgIjExTWJwcyBXaXJlbGVzcyBMQU4gQ2FyZCIsICAidjA4QzEiLCAgIiIgICAsIDB4YjY3YTYxMGUsIDB4NjU1YWE3YjcsIDB4MjY0YjQ1MWEsIDB4MCksIC8vIER5bmFsaW5rIEwxMUhEVCAxMU1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4YzI1MCwgMHgwMDAyKSwgLy8gRHluYWxpbmsgTDExSERUIDExTWJwcyA4MDIuMTEgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBST1hJTSIsICAiUmFuZ2VMQU4tRFMvTEFOIFBDIENBUkQiLCAweGM2NTM2YTVlLCAweDNmMzU3OTdkKSwgLy8gUFJPWElNIFJhbmdlTEFOLURTL0xBTiBQQyBDQVJECi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiQUNUSU9OVEVDIiwgICJQUklTTSBXaXJlbGVzcyBMQU4gUEMgQ2FyZCIsICAiMDM4MSIsICAiUmV2QSIsIDB4MzkzMDg5ZGEsIDB4YTcxZTY5ZDUsIDB4OTA0NzFmYTksIDB4NTdhNjYxOTQpLCAvLyBBQ1RJT05URUMgUFJJU00gV2lyZWxlc3MgTEFOIFBDIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDE2NjgsIDB4MDEwMSksIC8vIEFDVElPTlRFQyBQUklTTSBXaXJlbGVzcyBMQU4gUEMgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCIzQ29tIiwgICIzQ1JXRTczN0EgQWlyQ29ubmVjdCBXaXJlbGVzcyBMQU4gUEMgQ2FyZCIsIDB4NDEyNDBlNWIsIDB4NTYwMTBhZjMpLCAvLyAzQ29tIEFpckNvbm5lY3QgM0NSV0U3MzdBCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIjNDb20iLCAgIjNDUldFNzc3QSBBaXJDb25uZWN0IFdpcmVsZXNzIExBTiBQQ0kgQ2FyZCIgICwgMHg0MTI0MGU1YiwgMHhhZmM3YzMzZSksIC8vIDNDb20gQWlyQ29ubmVjdCAzQ1JXRTc3N0EKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVNVUyIsICAiODAyXzExYl9QQ19DQVJEXzI1IiwgMHg3OGZjMDZlZSwgMHhkYjlhYTg0MiksIC8vIEFTVVMgV0wtMTAwIDgwMi4xMWIgV0xBTiAgUEMgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBU1VTIiwgICI4MDJfMTFCX0NGX0NBUkRfMjUiLCAweDc4ZmMwNmVlLCAweDQ1YTUwYzFlKSwgLy8gQVNVUyBXTC0xMTAgODAyLjExYiBXTEFOIENGIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQlVGRkFMTyIsICAiV0xJLUNGLVMxMUciLCAweDJkZWNlY2UzLCAweDgyMDY3YzE4KSwgLy8gQlVGRkFMTyBXTEktQ0YtUzExRyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIlRoZSBMaW5rc3lzIEdyb3VwLCBJbmMuIiwgIldpcmVsZXNzIE5ldHdvcmsgQ0YgQ2FyZCIsICJJU0wzNzMwMFAiLCAiUmV2QSIsIDB4YTVmNDcyYzIsIDB4OWMwNTU5OGQsIDB4YzkwNDlhMzksIDB4NTdhNjYxOTQpLCAvLyBMaW5rc3lzIFdDRjExIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZCAoUHJpc20gMi41KQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkxpbmtzeXMiLCAgIldpcmVsZXNzIENvbXBhY3RGbGFzaCBDYXJkIiwgICIiLCAgIiIsIDB4NzMzY2M4MSwgMHhjNTJmMzk1LCAweDAsIDB4MCksIC8vIExpbmtzeXMgV0NGMTIgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkIChQcmlzbSAzKQotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI4YSwgMHgwNjczKSwgLy8gTGlua3N5cyBXQ0YxMiAxMU1icHMgODAyLjExYiBXTEFOIENhcmQgKFByaXNtIDMpCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiTkVUR0VBUiBNQTQwMVJBIFdpcmVsZXNzIFBDIiwgICJDYXJkIiwgICJJU0wzNzMwMFAiLCAgIkV2YWwtUmV2QSIsIDB4MzA2NDY3ZiwgMHg5NzYyZThmMSwgMHhjOTA0OWEzOSwgMHhjMjNhZGMwZSksIC8vIE5FVEdFQVIgTUE0MDFSQSAxMU1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4ZDYwMSwgMHgwMDA1KSwgLy8gRC1MaW5rIERDRi02NjBXICAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyZDIsIDB4MDAwMSksIC8vIE1pY3Jvc29mdCBXaXJlbGVzcyBOb3RlYm9vayBBZGFwdGVyIE1OLTUyMAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA4OSwgMHgwMDAyKSwgLy8gQW55UG9pbnQoVE0pIFdpcmVsZXNzIElJIFBDIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJEIiwgICJMaW5rIERSQy02NTAgMTFNYnBzIFdMQU4gQ2FyZCIsICAiVmVyc2lvbiAwMS4wMiIsICAiIiAsIDB4NzFiMTg1ODksIDB4ZjE0NGUzYWMsIDB4NGI3NGJhYTAsIDB4MCksIC8vIEQtTGluayBEUkMtNjUwIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHg5MDA1LCAweDAwMjEpLCAvLyBBZGFwdGVjIEFXTi04MDMwCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDBiLCAweDcxMTApLCAvLyBELUxpbmsgRFdMLTY1MCByZXYgUCA4MDIuMTFiIFdMQU4gY2FyZAotCS8vIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkQtTGluayIsICAiRFdMLTY1MCBXaXJlbGVzcyBQQyBDYXJkIFJldlAiLCAgIklTTDM3MTAxUC0xMCIsICAiQTMiLCAweDFhNDI0YTFjLCAweDZlYTU3NjMyLCAweGRkOTdhMjZiLCAweDU2YjIxZjUyKSwgLy8gRC1MaW5rIERXTC02NTAgcmV2IFAgODAyLjExYiBXTEFOIGNhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIklOVEVSU0lMIiwgICAiSS1HQVRFIDExTSBQQyBDYXJkIC8gUEMgQ2FyZCBwbHVzIiwgICJWZXJzaW9uIDAxLjAyIiwgMHg3NGM1ZTQwZCwgMHg4MzA0ZmY3NywgMHg0Yjc0YmFhMCksIC8vIEktR2F0ZSAxMU0gUEMgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkJFTlEiLCAgIkFXTDEwMCBQQ01DSUEgQURBUFRFUiIsICAiSVNMMzczMDBQIiwgICJFdmFsLVJldkEiLCAweDM1ZGFkYzc0LCAweDFmN2ZlZGIsIDB4YzkwNDlhMzksIDB4YzIzYWRjMGUpLCAvLyBiZW5RIEFXTDEwMCA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwYiwgMHg3MzAwKSwgLy8gYmVuUSBBV0wxMDAgODAyLjExYiBXTEFOIENhcmQKLQkvLyBQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJJTlRFUlNJTCIsIDB4NzRjNWU0MGQpLCAvLyBJbnRlcnNpbCBQcmlzbSAyIGNhcmQKLQkvLyBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNTYsIDB4MDAwMiksIC8vIEludGVyc2lsIFByaXNtIDIgY2FyZAotCi0JUENNQ0lBX0RFVklDRV9OVUxMCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgcHJpc20yX2NzX2lkcyk7Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHByaXNtMl9jc19kcml2ZXIgPSB7Ci0JLmRydiA9IHsKLQkJLm5hbWUgPSAicHJpc20yX2NzIiwKLQl9LAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKLQkuc3VzcGVuZCA9IHByaXNtMl9jc19zdXNwZW5kLAotCS5yZXN1bWUgPSBwcmlzbTJfY3NfcmVzdW1lLAotCS5yZW1vdmUgPSBwcmlzbTJfY3NfcmVtb3ZlLAotCS5wcm9iZSA9IHByaXNtMl9jc19wcm9iZSwKLQkuaWRfdGFibGUgPSBwcmlzbTJfY3NfaWRzLAotI2Vsc2UKLQkuYXR0YWNoID0gcHJpc20yc3RhX2F0dGFjaCwKLQkuZGV0YWNoID0gcHJpc20yc3RhX2RldGFjaCwKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTIpCi0JLmlkX3RhYmxlID0gcHJpc20yX2NzX2lkcywKLQkuZXZlbnQgPSAgcHJpc20yc3RhX2V2ZW50LAotI2VuZGlmIC8vID4gMi42LjEyCi0jZW5kaWYgLy8gPD0gMi42LjE1Ci19OwotI2VuZGlmIC8qIGtlcm5lbF92ZXJzaW9uICovCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTUpCi0jZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKLWRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0ZHX0NIRUNLKGZuLCByZXRmKSBcCi1kbyB7IGludCByZXQgPSAocmV0Zik7IFwKLWlmIChyZXQgIT0gMCkgeyBcCi0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICJDYXJkU2VydmljZXMoIiAjZm4gIikgcmV0dXJuZWQgJWRcbiIsIHJldCk7IFwKLSAgICAgICAgY3NfZXJyb3IocGRldiwgZm4sIHJldCk7IFwKLSAgICAgICAgZ290byBuZXh0X2VudHJ5OyBcCi19IFwKLX0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkIHByaXNtMl9jc19yZW1vdmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdsYW5kZXZpY2UgICp3bGFuZGV2OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE3KQotICAgICAgICBkZXZfbGlua190ICpsaW5rID0gZGV2X3RvX2luc3RhbmNlKHBkZXYpOwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQl3bGFuZGV2ID0gcGRldi0+cHJpdjsKLSNlbHNlCi0Jd2xhbmRldiA9IGxpbmstPnByaXY7Ci0jZW5kaWYKLQotCWlmICh3bGFuZGV2KSB7Ci0JCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7Ci0JCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJd2xhbl91bnNldHVwKHdsYW5kZXYpOwotCQlpZiAod2xhbmRldi0+cHJpdikgewotCQkJaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7Ci0JCQl3bGFuZGV2LT5wcml2ID0gTlVMTDsKLQkJCWlmIChodykgewotCQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQkJa2ZyZWUoaHcpOwotCQkJfQotCQl9Ci0JCWtmcmVlKHdsYW5kZXYpOwotCX0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlwZGV2LT5wcml2ID0gTlVMTDsKLSAgICAgICAgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotI2Vsc2UKLSAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgewotCSAgICAgICAgaWYgKGxpbmstPndpbikKLQkJCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOwotCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7Ci0JCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7Ci0JCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCi0JCQlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKLQotCQlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKLQl9Ci0KLQlsaW5rLT5wcml2ID0gTlVMTDsKLQlrZnJlZShsaW5rKTsKLSNlbmRpZgotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgcHJpc20yX2NzX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdsYW5kZXZpY2UgICp3bGFuZGV2OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE3KQotICAgICAgICBkZXZfbGlua190ICpsaW5rID0gZGV2X3RvX2luc3RhbmNlKHBkZXYpOwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQl3bGFuZGV2ID0gcGRldi0+cHJpdjsKLQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0jZWxzZQotCXdsYW5kZXYgPSBsaW5rLT5wcml2OwotCi0gICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOwotICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7Ci0JCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOwotCX0KLSNlbmRpZgotCi0JREJGRVhJVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByaXNtMl9jc19yZXN1bWUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdsYW5kZXZpY2UgICp3bGFuZGV2OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE3KQotICAgICAgICBkZXZfbGlua190ICpsaW5rID0gZGV2X3RvX2luc3RhbmNlKHBkZXYpOwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQl3bGFuZGV2ID0gcGRldi0+cHJpdjsKLQkvLyBYWFggZG8gc29tZXRoaW5nIGhlcmU/Ci0jZWxzZQotCXdsYW5kZXYgPSBsaW5rLT5wcml2OwotICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7Ci0gICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKLSAgICAgICAgICAgICAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOwotCQkvLyBYWFggZG8gc29tZXRoaW5nIGhlcmU/Ci0JfQotI2VuZGlmCi0KLQotCURCRkVYSVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwcmlzbTJfY3NfcHJvYmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJ2YWwgPSAwOwotCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gTlVMTDsKLQloZmEzODR4X3QgKmh3ID0gTlVMTDsKLQotICAgICAgICBjb25maWdfaW5mb190IHNvY2tldGNvbmY7Ci0gICAgICAgIGNpc3BhcnNlX3QgKnBhcnNlID0gTlVMTDsKLQl0dXBsZV90IHR1cGxlOwotCXVpbnQ4X3QJYnVmWzY0XTsKLSAgICAgICAgaW50IGxhc3RfZm4sIGxhc3RfcmV0OwotICAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IDAgfTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNykKLQlkZXZfbGlua190ICpsaW5rOwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQkvKiBTZXQgdXAgaW50ZXJydXB0IHR5cGUgKi8KLSAgICAgICAgcGRldi0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87Ci0jZWxzZQotICAgICAgICBsaW5rID0ga21hbGxvYyhzaXplb2YoZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAobGluayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICBtZW1zZXQobGluaywgMCwgc2l6ZW9mKGRldl9saW5rX3QpKTsKLQotICAgICAgICBsaW5rLT5jb25mLlZjYyA9IDMzOwotICAgICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKLQotICAgICAgICBsaW5rLT5oYW5kbGUgPSBwZGV2OwotICAgICAgICBwZGV2LT5pbnN0YW5jZSA9IGxpbms7Ci0gICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOwotCi0jZW5kaWYKLQotCS8vIFZDQyBjcmFwPwotICAgICAgICBwYXJzZSA9IGttYWxsb2Moc2l6ZW9mKGNpc3BhcnNlX3QpLCBHRlBfS0VSTkVMKTsKLQotCXdsYW5kZXYgPSBjcmVhdGVfd2xhbigpOwotCWlmICghd2xhbmRldiB8fCAhcGFyc2UpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOwotCQlydmFsID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJ2YWwgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBodyBzdHJ1Y3QgZm9yIG5vdyAqLwotCWhmYTM4NHhfY3JlYXRlKGh3LCAwLCAwLCBOVUxMKTsKLQlody0+d2xhbmRldiA9IHdsYW5kZXY7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JaHctPnBkZXYgPSBwZGV2OwotCXBkZXYtPnByaXYgPSB3bGFuZGV2OwotI2Vsc2UKLQlody0+bGluayA9IGxpbms7Ci0JbGluay0+cHJpdiA9IHdsYW5kZXY7Ci0jZW5kaWYKLQotICAgICAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICAgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotICAgICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLSAgICAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgICAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKHBkZXYsICZ0dXBsZSkpOwotICAgICAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShwZGV2LCAmdHVwbGUpKTsKLSAgICAgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKHBkZXYsICZ0dXBsZSwgcGFyc2UpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0gICAgICAgIHBkZXYtPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLT5jb25maWcuYmFzZTsKLSAgICAgICAgcGRldi0+Y29uZi5QcmVzZW50ID0gcGFyc2UtPmNvbmZpZy5ybWFza1swXTsKLSNlbHNlCi0gICAgICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLT5jb25maWcuYmFzZTsKLSAgICAgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UtPmNvbmZpZy5ybWFza1swXTsKLQotCWxpbmstPmNvbmYuVmNjID0gc29ja2V0Y29uZi5WY2M7Ci0jZW5kaWYKLSAgICAgICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sCi0gICAgICAgICAgICAgICAgIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHBkZXYsICZzb2NrZXRjb25mKSk7Ci0KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKHBkZXYsICZ0dXBsZSkpOwotICAgICAgICBmb3IgKDs7KSB7Ci0JCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UtPmNmdGFibGVfZW50cnkpOwotICAgICAgICAgICAgICAgIENGR19DSEVDSyhHZXRUdXBsZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwY21jaWFfZ2V0X3R1cGxlX2RhdGEocGRldiwgJnR1cGxlKSk7Ci0gICAgICAgICAgICAgICAgQ0ZHX0NIRUNLKFBhcnNlVHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwY21jaWFfcGFyc2VfdHVwbGUocGRldiwgJnR1cGxlLCBwYXJzZSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKQotICAgICAgICAgICAgICAgICAgICAgICAgZGZsdCA9ICpjZmc7Ci0gICAgICAgICAgICAgICAgaWYgKGNmZy0+aW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9lbnRyeTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0gICAgICAgICAgICAgICAgcGRldi0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KLSAgICAgICAgICAgICAgICBpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgcGRldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLwotICAgICAgICAgICAgICAgIC8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwotICAgICAgICAgICAgICAgIGlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ja2V0Y29uZi5WY2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCAmJiAhcHJpc20yX2lnbm9yZXZjYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygxLCAiICBWY2MgbWlzbWF0Y2ggLSBza2lwcGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhpcyBlbnRyeVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9lbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb2NrZXRjb25mLlZjYyAhPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwICYmICFwcmlzbTJfaWdub3JldmNjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICIgIFZjYyAoZGVmYXVsdCkgbWlzbWF0Y2ggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2tpcHBpbmcgdGhpcyBlbnRyeVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9lbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5jb25mLlZwcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRmbHQudnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgcGRldi0+Y29uZi5WcHAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotI2VuZGlmCi0JCX0KLQotCQkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KLQkJLyogSEFDSzogZHVlIHRvIGEgYmFkIENJUy4uLi53ZSBBTFdBWVMgbmVlZCBhbiBpbnRlcnJ1cHQgKi8KLQkJLyogaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQuaXJxLklSUUluZm8xKSAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQkJcGRldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLSNlbHNlCi0JCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0jZW5kaWYKLQotCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JCXBkZXYtPmlvLk51bVBvcnRzMSA9IHBkZXYtPmlvLk51bVBvcnRzMiA9IDA7Ci0JCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87Ci0JCQlwZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJCXBkZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCQlwZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQkJcGRldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJaWYgICggcGRldi0+aW8uQmFzZVBvcnQxICE9IDAgKSB7Ci0JCQkJV0xBTl9MT0dfV0FSTklORygKLQkJCQkiQnJhaW4gZGFtYWdlZCBDSVM6IGhhcmQgY29kZWQgaW9iYXNlPSIKLQkJCQkiMHgleCwgdHJ5IGxldHRpbmcgcGNtY2lhX2NzIGRlY2lkZS4uLlxuIiwKLQkJCQlwZGV2LT5pby5CYXNlUG9ydDEgKTsKLQkJCQlwZGV2LT5pby5CYXNlUG9ydDEgPSAwOwotCQkJfQotCQkJcGRldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQkJcGRldi0+aW8uQXR0cmlidXRlczIgPSBwZGV2LT5pby5BdHRyaWJ1dGVzMTsKLQkJCQlwZGV2LT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQkJcGRldi0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47Ci0JCQl9Ci0JCX0KLQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJQ0ZHX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8ocGRldiwgJnBkZXYtPmlvKSk7Ci0jZWxzZQotCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOwotCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgewotCQkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOwotCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJCWlmICAoIGxpbmstPmlvLkJhc2VQb3J0MSAhPSAwICkgewotCQkJCVdMQU5fTE9HX1dBUk5JTkcoCi0JCQkJIkJyYWluIGRhbWFnZWQgQ0lTOiBoYXJkIGNvZGVkIGlvYmFzZT0iCi0JCQkJIjB4JXgsIHRyeSBsZXR0aW5nIHBjbWNpYV9jcyBkZWNpZGUuLi5cbiIsCi0JCQkJbGluay0+aW8uQmFzZVBvcnQxICk7Ci0JCQkJbGluay0+aW8uQmFzZVBvcnQxID0gMDsKLQkJCX0KLQkJCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOwotCQkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gbGluay0+aW8uQXR0cmlidXRlczE7Ci0JCQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJCWxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOwotCQkJfQotCQl9Ci0JCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JCUNGR19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKHBkZXYsICZsaW5rLT5pbykpOwotI2VuZGlmCi0JCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KLQkJYnJlYWs7Ci0KLQluZXh0X2VudHJ5OgotCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpCi0JCQlkZmx0ID0gKmNmZzsKLQkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUocGRldiwgJnR1cGxlKSk7Ci0KLQl9Ci0KLQkvKiBMZXQgcGNtY2lhIGtub3cgdGhlIGRldmljZSBuYW1lICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXBkZXYtPmRldl9ub2RlID0gJmh3LT5ub2RlOwotI2Vsc2UKLQlsaW5rLT5kZXYgPSAmaHctPm5vZGU7Ci0jZW5kaWYKLQotCS8qIFJlZ2lzdGVyIHRoZSBuZXR3b3JrIGRldmljZSBhbmQgZ2V0IGFzc2lnbmVkIGEgbmFtZSAqLwotCVNFVF9NT0RVTEVfT1dORVIod2xhbmRldi0+bmV0ZGV2KTsKLQlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICAmaGFuZGxlX3RvX2RldihwZGV2KSk7Ci0JaWYgKHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCkgewotCQlXTEFOX0xPR19OT1RJQ0UoInByaXNtMnN0YV9jczogcmVnaXN0ZXJfd2xhbmRldigpIGZhaWxlZC5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlzdHJjcHkoaHctPm5vZGUuZGV2X25hbWUsIHdsYW5kZXYtPm5hbWUpOwotCi0JLyogQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24gYSAqLwotCS8qIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mIHRoZSAqLwotCS8qIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCWlmIChwZGV2LT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpIHsKLQkJcGRldi0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwotCQlwZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKLQkJcGRldi0+aXJxLkhhbmRsZXIgPSBoZmEzODR4X2ludGVycnVwdDsKLQkJcGRldi0+aXJxLkluc3RhbmNlID0gd2xhbmRldjsKLQkJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKHBkZXYsICZwZGV2LT5pcnEpKTsKLQl9Ci0jZWxzZQotCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpIHsKLQkJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwotCQlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKLQkJbGluay0+aXJxLkhhbmRsZXIgPSBoZmEzODR4X2ludGVycnVwdDsKLQkJbGluay0+aXJxLkluc3RhbmNlID0gd2xhbmRldjsKLQkJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKHBkZXYsICZsaW5rLT5pcnEpKTsKLQl9Ci0jZW5kaWYKLQotCS8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwICovCi0JLyogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZSAqLwotCS8qIGNhcmQgYW5kIGhvc3QgaW50ZXJmYWNlIGludG8gIk1lbW9yeSBhbmQgSU8iIG1vZGUuICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKHBkZXYsICZwZGV2LT5jb25mKSk7Ci0jZWxzZQotCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKHBkZXYsICZsaW5rLT5jb25mKSk7Ci0jZW5kaWYKLQotCS8qIEZpbGwgdGhlIG5ldGRldmljZSB3aXRoIHRoaXMgaW5mbyAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQl3bGFuZGV2LT5uZXRkZXYtPmlycSA9IHBkZXYtPmlycS5Bc3NpZ25lZElSUTsKLQl3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkciA9IHBkZXYtPmlvLkJhc2VQb3J0MTsKLSNlbHNlCi0Jd2xhbmRldi0+bmV0ZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7Ci0Jd2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7Ci0jZW5kaWYKLQotCS8qIEFuZCB0aGUgcmVzdCBvZiB0aGUgaHcgc3RydWN0dXJlICovCi0JaHctPmlycSA9IHdsYW5kZXYtPm5ldGRldi0+aXJxOwotCWh3LT5pb2Jhc2UgPSB3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkcjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNykKLQlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOwotCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7Ci0jZW5kaWYKLQotCS8qIEFuZCBub3cgd2UncmUgZG9uZSEgKi8KLQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKLQotCWdvdG8gZG9uZTsKLQotIGNzX2ZhaWxlZDoKLSAgICAgICAgY3NfZXJyb3IocGRldiwgbGFzdF9mbiwgbGFzdF9yZXQpOwotCi1mYWlsZWQ6Ci0JLy8gd2xhbmRldiwgaHcsIGV0YyBldGMuLgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlwZGV2LT5wcml2ID0gTlVMTDsKLSNlbHNlCi0JcGRldi0+aW5zdGFuY2UgPSBOVUxMOwotCWlmIChsaW5rKSB7Ci0JCWxpbmstPnByaXYgPSBOVUxMOwotCQlrZnJlZShsaW5rKTsKLQl9Ci0jZW5kaWYKLQlpZiAod2xhbmRldikgewotCQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0JCWlmICh3bGFuZGV2LT5wcml2KSB7Ci0JCQlodyA9IHdsYW5kZXYtPnByaXY7Ci0JCQl3bGFuZGV2LT5wcml2ID0gTlVMTDsKLQkJCWlmIChodykgewotCQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQkJa2ZyZWUoaHcpOwotCQkJfQotCQl9Ci0JCWtmcmVlKHdsYW5kZXYpOwotCX0KLQotZG9uZToKLQlpZiAocGFyc2UpIGtmcmVlKHBhcnNlKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJ2YWw7Ci19Ci0jZWxzZSAgLy8gPD0gMi42LjE1Ci0jZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKLWRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0ZHX0NIRUNLKGZuLCByZXRmKSBcCi1kbyB7IGludCByZXQgPSAocmV0Zik7IFwKLWlmIChyZXQgIT0gMCkgeyBcCi0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICJDYXJkU2VydmljZXMoIiAjZm4gIikgcmV0dXJuZWQgJWRcbiIsIHJldCk7IFwKLSAgICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBmbiwgcmV0KTsgXAotICAgICAgICBnb3RvIG5leHRfZW50cnk7IFwKLX0gXAotfSB3aGlsZSAoMCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9hdHRhY2gKLSoKLSogSGFsZiBvZiB0aGUgYXR0YWNoL2RldGFjaCBwYWlyLiAgQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgZGV2aWNlCi0qIGluc3RhbmNlIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIEluIHRoaXMgY2FzZSwgaXQgYWxzbyBjcmVhdGVzIHRoZQotKiB3bGFuZGV2IHN0cnVjdHVyZSBhbmQgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLiAgVGhlc2UgYXJlCi0qIGxpbmtlZCB0byB0aGUgZGV2aWNlIGluc3RhbmNlIHZpYSBpdHMgcHJpdiBtZW1iZXIuCi0qCi0qIEFyZ3VtZW50czoKLSoJbm9uZQotKgotKiBSZXR1cm5zOgotKglBIHZhbGlkIHB0ciB0byBkZXZfbGlua190IG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAoaW5zbW9kL2luaXRfbW9kdWxlL3JlZ2lzdGVyX3BjY2FyZF9kcml2ZXIpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWRldl9saW5rX3QgKnByaXNtMnN0YV9hdHRhY2godm9pZCkKLXsKLQljbGllbnRfcmVnX3QJCWNsaWVudF9yZWc7Ci0JaW50CQkJcmVzdWx0OwotCWRldl9saW5rX3QJCSpsaW5rID0gTlVMTDsKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gTlVMTDsKLQloZmEzODR4X3QJCSpodyA9IE5VTEw7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEFsbG9jIG91ciBzdHJ1Y3R1cmVzICovCi0JbGluayA9CQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFsaW5rIHx8ICgod2xhbmRldiA9IGNyZWF0ZV93bGFuKCkpID09IE5VTEwpKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCS8qIENsZWFyIGFsbCB0aGUgc3RydWN0cyAqLwotCW1lbXNldChsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpKTsKLQotCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIGh3IHN0cnVjdCBmb3Igbm93ICovCi0JaGZhMzg0eF9jcmVhdGUoaHcsIDAsIDAsIE5VTEwpOwotCWh3LT53bGFuZGV2ID0gd2xhbmRldjsKLQotCS8qIEluaXRpYWxpemUgdGhlIFBDIGNhcmQgZGV2aWNlIG9iamVjdC4gKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotCWluaXRfdGltZXIoJmxpbmstPnJlbGVhc2UpOwotCWxpbmstPnJlbGVhc2UuZnVuY3Rpb24gPSAmcHJpc20yc3RhX3JlbGVhc2U7Ci0JbGluay0+cmVsZWFzZS5kYXRhID0gKHVfbG9uZylsaW5rOwotI2VuZGlmCi0JbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87Ci0JbGluay0+cHJpdiA9IHdsYW5kZXY7Ci0jaWYgKGRlZmluZWQoQ1NfUkVMRUFTRV9DT0RFKSAmJiAoQ1NfUkVMRUFTRV9DT0RFIDwgMHgyOTExKSkKLQlsaW5rLT5pcnEuSW5zdGFuY2UgPSB3bGFuZGV2OwotI2VuZGlmCi0KLQkvKiBMaW5rIGluIHRvIHRoZSBsaXN0IG9mIGRldmljZXMgbWFuYWdlZCBieSB0aGlzIGRyaXZlciAqLwotCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKLQlkZXZfbGlzdCA9IGxpbms7Ci0KLQkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KLQljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTEpICkKLQljbGllbnRfcmVnLkF0dHJpYnV0ZXMgPSBJTkZPX0lPX0NMSUVOVCB8IElORk9fQ0FSRF9TSEFSRTsKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykgKQotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwKLQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcHJpc20yc3RhX2V2ZW50OwotI2VuZGlmCi0KLQljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7Ci0JY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKLQotCXJlc3VsdCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXN1bHQpOwotCQlwcmlzbTJzdGFfZGV0YWNoKGxpbmspOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlnb3RvIGRvbmU7Ci0KLSBmYWlsZWQ6Ci0JaWYgKGxpbmspCWtmcmVlKGxpbmspOwotCWlmICh3bGFuZGV2KQlrZnJlZSh3bGFuZGV2KTsKLQlpZiAoaHcpCQlrZnJlZShodyk7Ci0JbGluayA9IE5VTEw7Ci0KLSBkb25lOgotCURCRkVYSVQ7Ci0JcmV0dXJuIGxpbms7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9kZXRhY2gKLSoKLSogUmVtb3ZlIG9uZSBvZiB0aGUgZGV2aWNlIGluc3RhbmNlcyBtYW5hZ2VkIGJ5IHRoaXMgZHJpdmVyLgotKiAgIFNlYXJjaCB0aGUgbGlzdCBmb3IgdGhlIGdpdmVuIGluc3RhbmNlLAotKiAgIGNoZWNrIG91ciBmbGFncyBmb3IgYSB3YWl0aW5nIHRpbWVyJ2QgcmVsZWFzZSBjYWxsCi0qICAgY2FsbCByZWxlYXNlCi0qICAgRGVyZWdpc3RlciB0aGUgaW5zdGFuY2Ugd2l0aCBDYXJkIFNlcnZpY2VzCi0qICAgKG5ldGRldmljZSkgdW5yZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UuCi0qICAgdW5saW5rIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBsaXN0Ci0qICAgZnJlZSB0aGUgbGluaywgcHJpdiwgYW5kIHByaXYtPnByaXYgbWVtb3J5Ci0qIE5vdGU6IHRoZSBkZXZfbGlzdCB2YXJpYWJsZSBpcyBhIGRyaXZlciBzY29wZWQgc3RhdGljIHVzZWQgdG8KLSoJbWFpbnRhaW4gYSBsaXN0IG9mIGRldmljZSBpbnN0YW5jZXMgbWFuYWdlZCBieSB0aGlzCi0qCWRyaXZlci4KLSoKLSogQXJndW1lbnRzOgotKglsaW5rCXB0ciB0byB0aGUgaW5zdGFuY2UgdG8gZGV0YWNoCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgl0aGUgbGluayBzdHJ1Y3R1cmUgaXMgZ29uZSwgdGhlIG5ldGRldmljZSBpcyBnb25lCi0qCi0qIENhbGwgY29udGV4dDoKLSoJTWlnaHQgYmUgaW50ZXJydXB0LCBkb24ndCBibG9jay4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJzdGFfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCi17Ci0JZGV2X2xpbmtfdAkJKipsaW5rcDsKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCWhmYTM4NHhfdAkJKmh3OwotCi0JREJGRU5URVI7Ci0KLQkvKiBMb2NhdGUgcHJldiBkZXZpY2Ugc3RydWN0dXJlICovCi0JZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkgewotCQlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOwotCX0KLQotCWlmICgqbGlua3AgIT0gTlVMTCkgewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0JCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JCS8qIEdldCByaWQgb2YgYW55IHRpbWVyJ2QgcmVsZWFzZSBjYWxsICovCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQkJaWYgKGxpbmstPnN0YXRlICYgREVWX1JFTEVBU0VfUEVORElORykgewotCQkJZGVsX3RpbWVyX3N5bmMoJmxpbmstPnJlbGVhc2UpOwotCQkJbGluay0+c3RhdGUgJj0gfkRFVl9SRUxFQVNFX1BFTkRJTkc7Ci0JCX0KLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0jZW5kaWYKLQotCQkvKiBJZiBsaW5rIHNheXMgd2UncmUgc3RpbGwgY29uZmlnJ2QsIGNhbGwgcmVsZWFzZSAqLwotCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7Ci0JCQlwcmlzbTJzdGFfcmVsZWFzZSgodV9sb25nKWxpbmspOwotCQkJaWYgKGxpbmstPnN0YXRlICYgREVWX1NUQUxFX0NPTkZJRykgewotCQkJCWxpbmstPnN0YXRlIHw9IERFVl9TVEFMRV9MSU5LOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qIFRlbGwgQ2FyZCBTZXJ2aWNlcyB3ZSdyZSBub3QgYXJvdW5kIGFueSBtb3JlICovCi0JCWlmIChsaW5rLT5oYW5kbGUpIHsKLQkJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOwotCQl9Ci0KLQkJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLwotCQkqbGlua3AgPSBsaW5rLT5uZXh0OwotCQlpZiAoIGxpbmstPnByaXYgIT0gTlVMTCApIHsKLQkJCXdsYW5kZXYgPSAod2xhbmRldmljZV90KilsaW5rLT5wcml2OwotCQkJcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2KTsKLQkJCWlmIChsaW5rLT5kZXYgIT0gTlVMTCkgewotCQkJCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJCX0KLQkJCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKLQkJCWlmICh3bGFuZGV2LT5wcml2KSB7Ci0JCQkJaHcgPSB3bGFuZGV2LT5wcml2OwotCQkJCXdsYW5kZXYtPnByaXYgPSBOVUxMOwotCQkJCWlmIChodykgewotCQkJCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQkJCQlrZnJlZShodyk7Ci0JCQkJfQotCQkJfQotCQkJbGluay0+cHJpdiA9IE5VTEw7Ci0JCQlrZnJlZSh3bGFuZGV2KTsKLQkJfQotCQlrZnJlZShsaW5rKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9jb25maWcKLSoKLSogSGFsZiBvZiB0aGUgY29uZmlnL3JlbGVhc2UgcGFpci4gIFVzdWFsbHkgY2FsbGVkIGluIHJlc3BvbnNlIHRvCi0qIGEgY2FyZCBpbnNlcnRpb24gZXZlbnQuICBBdCB0aGlzIHBvaW50LCB3ZSBfa25vd18gdGhlcmUncyBzb21lCi0qIHBoeXNpY2FsIGRldmljZSBwcmVzZW50LiAgVGhhdCBtZWFucyB3ZSBjYW4gc3RhcnQgcG9raW5nIGFyb3VuZAotKiBhdCB0aGUgQ0lTIGFuZCBhdCBhbnkgZGV2aWNlIHNwZWNpZmljIGNvbmZpZyBkYXRhIHdlIHdhbnQuCi0qCi0qIE5vdGUgdGhlIGdvdG9zIGFuZCB0aGUgbWFjcm9zLiAgSSByZWNvZGVkIHRoaXMgb25jZSB3aXRob3V0Ci0qIHRoZW0sIGFuZCBpdCBnb3QgaW5jcmVkaWJseSB1Z2x5LiAgSXQncyBhY3R1YWxseSBzaW1wbGVyIHdpdGgKLSogdGhlbS4KLSoKLSogQXJndW1lbnRzOgotKglsaW5rCXRoZSBkZXZfbGlua190IHN0cnVjdHVyZSBjcmVhdGVkIGluIGF0dGFjaCB0aGF0Ci0qCQlyZXByZXNlbnRzIHRoaXMgZGV2aWNlIGluc3RhbmNlLgotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJUmVzb3VyY2VzIChpcnEsIGlvLCBtZW0pIGFyZSBhbGxvY2F0ZWQKLSoJVGhlIHBjbWNpYSBkZXZfbGluay0+bm9kZS0+bmFtZSBpcyBzZXQKLSoJKEZvciBuZXRjYXJkcykgVGhlIGRldmljZSBzdHJ1Y3R1cmUgaXMgZmluaXNoZWQgYW5kLAotKgkgIG1vc3QgaW1wb3J0YW50bHksIHJlZ2lzdGVyZWQuICBUaGlzIG1lYW5zIHRoYXQgdGhlcmUKLSoJICBpcyBub3cgYSBfbmFtZWRfIGRldmljZSB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGZyb20KLSoJICB1c2VybGFuZC4KLSoKLSogQ2FsbCBjb250ZXh0OgotKglNYXkgYmUgY2FsbGVkIGZyb20gYSB0aW1lci4gIERvbid0IGJsb2NrIQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKLWRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0ZHX0NIRUNLKGZuLCByZXRmKSBcCi1kbyB7IGludCByZXQgPSAocmV0Zik7IFwKLWlmIChyZXQgIT0gMCkgeyBcCi0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICJDYXJkU2VydmljZXMoIiAjZm4gIikgcmV0dXJuZWQgJWRcbiIsIHJldCk7IFwKLSAgICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBmbiwgcmV0KTsgXAotICAgICAgICBnb3RvIG5leHRfZW50cnk7IFwKLX0gXAotfSB3aGlsZSAoMCkKLQotdm9pZCBwcmlzbTJzdGFfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCi17Ci0JY2xpZW50X2hhbmRsZV90CQloYW5kbGU7Ci0Jd2xhbmRldmljZV90CQkqd2xhbmRldjsKLQloZmEzODR4X3QgICAgICAgICAgICAgICAqaHc7Ci0JaW50CQkJbGFzdF9mbjsKLQlpbnQJCQlsYXN0X3JldDsKLQl0dXBsZV90CQkJdHVwbGU7Ci0JY2lzcGFyc2VfdAkJcGFyc2U7Ci0JY29uZmlnX2luZm9fdAkJc29ja2V0Y29uZjsKLQlVSU5UOAkJCWJ1Zls2NF07Ci0JaW50CQkJbWluVmNjID0gMDsKLQlpbnQJCQltYXhWY2MgPSAwOwotCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QJZGZsdCA9IHsgMCB9OwotCi0JREJGRU5URVI7Ci0KLQloYW5kbGUgPSBsaW5rLT5oYW5kbGU7Ci0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QqKWxpbmstPnByaXY7Ci0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JLyogQ29sbGVjdCB0aGUgY29uZmlnIHJlZ2lzdGVyIGluZm8gKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKLQotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQotCS8qIENvbmZpZ3VyZSBjYXJkICovCi0JbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKLQotCS8qIEFjcXVpcmUgdGhlIGN1cnJlbnQgc29ja2V0IGNvbmZpZyAobmVlZCBWY2Mgc2V0dGluZykgKi8KLQlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oaGFuZGxlLCAmc29ja2V0Y29uZikpOwotCi0JLyogTG9vcCB0aHJvdWdoIHRoZSBjb25maWcgdGFibGUgZW50cmllcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IHdvcmtzICovCi0JLyogQXNzdW1lcyBhIGNvbXBsZXRlIGFuZCB2YWxpZCBDSVMgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7Ci0Jd2hpbGUgKDEpIHsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKLQkJQ0ZHX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7Ci0JCUNGR19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOwotCi0JCWlmIChjZmctPmluZGV4ID09IDApIGdvdG8gbmV4dF9lbnRyeTsKLQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0KLQkJLyogTGV0cyBwcmludCBvdXQgdGhlIFZjYyB0aGF0IHRoZSBjb250cm9sbGVyK3BjbWNpYS1jcyBzZXQKLQkJICogZm9yIHVzLCBjYXVzZSB0aGF0J3Mgd2hhdCB3ZSdyZSBnb2luZyB0byB1c2UuCi0JCSAqLwotCQlXTEFOX0xPR19ERUJVRygxLCJJbml0aWFsIFZjYz0lZC8xMHZcbiIsIHNvY2tldGNvbmYuVmNjKTsKLQkJaWYgKHByaXNtMl9pZ25vcmV2Y2MpIHsKLQkJCWxpbmstPmNvbmYuVmNjID0gc29ja2V0Y29uZi5WY2M7Ci0JCQlnb3RvIHNraXB2Y2M7Ci0JCX0KLQotCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KLQkJLyogTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KLQkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCAiVmNjIG9idGFpbmVkIGZyb20gY3VydHVwbC5WTk9NXG4iKTsKLQkJCW1pblZjYyA9IG1heFZjYyA9Ci0JCQkJY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOwotCQl9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCAiVmNjIHNldCBmcm9tIGRmbHQuVk5PTVxuIik7Ci0JCQltaW5WY2MgPSBtYXhWY2MgPQotCQkJCWRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKLQkJfSBlbHNlIGlmICgoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk1BWCkpICYmCi0JCQkgICAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk1JTikpICkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwgIlZjYyBzZXQgZnJvbSBjdXJ0dXBsKFZNSU4sVk1BWClcbiIpOwkJCW1pblZjYyA9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTUlOXS8xMDAwMDsKLQkJCW1heFZjYyA9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTUFYXS8xMDAwMDsKLQkJfSBlbHNlIGlmICgoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk1BWCkpICYmCi0JCQkgICAoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk1JTikpICkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwgIlZjYyBzZXQgZnJvbSBkZmx0KFZNSU4sVk1BWClcbiIpOwotCQkJbWluVmNjID0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZNSU5dLzEwMDAwOwotCQkJbWF4VmNjID0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZNQVhdLzEwMDAwOwotCQl9Ci0KLQkJaWYgKCBzb2NrZXRjb25mLlZjYyA+PSBtaW5WY2MgJiYgc29ja2V0Y29uZi5WY2MgPD0gbWF4VmNjKSB7Ci0JCQlsaW5rLT5jb25mLlZjYyA9IHNvY2tldGNvbmYuVmNjOwotCQl9IGVsc2UgewotCQkJLyogW01TTV06IE5vdGUgdGhhdCBJJ3ZlIGdpdmVuIHVwIHRyeWluZyB0byBjaGFuZ2UKLQkJCSAqIHRoZSBWY2MgaWYgYSBjaGFuZ2UgaXMgaW5kaWNhdGVkLiAgSXQgc2VlbXMgdGhlCi0JCQkgKiBzeXN0ZW0mc29ja2V0Y29udHJvbGxlciZjYXJkIHZlbmRvcnMgY2FuJ3Qgc2VlbQotCQkJICogdG8gZ2V0IGl0IHJpZ2h0LCBzbyBJJ20gdGlyZWQgb2YgdHJ5aW5nIHRvIGhhY2sKLQkJCSAqIG15IHdheSBhcm91bmQgaXQuICBwY21jaWEtY3MgZG9lcyBpdHMgYmVzdCB1c2luZwotCQkJICogdGhlIHZvbHRhZ2Ugc2Vuc2UgcGlucyBidXQgc29tZXRpbWVzIHRoZSBjb250cm9sbGVyCi0JCQkgKiBsaWVzLiAgVGhlbiwgZXZlbiBpZiB3ZSBoYXZlIGEgZ29vZCByZWFkIG9uIHRoZSBWUwotCQkJICogcGlucywgc29tZSBzeXN0ZW0gZGVzaWducyB3aWxsIHNpbGVudGx5IGlnbm9yZSBvdXIKLQkJCSAqIHJlcXVlc3RzIHRvIHNldCB0aGUgdm9sdGFnZS4gIEFkZGl0aW9uYWxseSwgc29tZQotCQkJICogdmVuZG9ycyBoYXZlIDMuM3YgaW5kaWNhdGVkIG9uIHRoZWlyIHNlbnNlIHBpbnMsCi0JCQkgKiBidXQgNXYgc3BlY2lmaWVkIGluIHRoZSBDSVMgb3IgdmljZS12ZXJzYS4gIEkndmUKLQkJCSAqIGhhZCBpdC4gIE15IG9ubHkgcmVjb21tZW5kYXRpb24gaXMgImxldCB0aGUgYnV5ZXIKLQkJCSAqIGJld2FyZSIuICBZb3VyIHN5c3RlbSBtaWdodCBzdXBwbHkgNXYgdG8gYSAzdiBjYXJkCi0JCQkgKiAocG9zc2libHkgY2F1c2luZyBkYW1hZ2UpIG9yIGEgM3YgY2FwYWJsZSBzeXN0ZW0KLQkJCSAqIG1pZ2h0IHN1cHBseSA1diB0byBhIDN2IGNhcGFibGUgY2FyZCAod2FzdGluZwotCQkJICogcHJlY2lvdXMgYmF0dGVyeSBsaWZlKS4KLQkJCSAqIE15IG9ubHkgcmVjb21tZW5kYXRpb24gKGlmIHlvdSBjYXJlKSBpcyB0byBnZXQKLQkJCSAqIHlvdXJzZWxmIGFuIGV4dGVuZGVyIGNhcmQgKEkgZG9uJ3Qga25vdyB3aGVyZSwgSQotCQkJICogaGF2ZSBvbmx5IG9uZSBteXNlbGYpIGFuZCBhIG1ldGVyIGFuZCB0ZXN0IGl0IGZvcgotCQkJICogeW91cnNlbGYuCi0JCQkgKi8KLQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJfQotc2tpcHZjYzoKLQkJV0xBTl9MT0dfREVCVUcoMSwgImxpbmstPmNvbmYuVmNjPSVkXG4iLCBsaW5rLT5jb25mLlZjYyk7Ci0KLQkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0JCS8qIEhBQ0s6IGR1ZSB0byBhIGJhZCBDSVMuLi4ud2UgQUxXQVlTIG5lZWQgYW4gaW50ZXJydXB0ICovCi0JCS8qIGlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkgKi8KLQkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0KLQkJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87Ci0JCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJaWYgICggbGluay0+aW8uQmFzZVBvcnQxICE9IDAgKSB7Ci0JCQkJV0xBTl9MT0dfV0FSTklORygKLQkJCQkiQnJhaW4gZGFtYWdlZCBDSVM6IGhhcmQgY29kZWQgaW9iYXNlPSIKLQkJCQkiMHgleCwgdHJ5IGxldHRpbmcgcGNtY2lhX2NzIGRlY2lkZS4uLlxuIiwKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgKTsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSAwOwotCQkJfQotCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47Ci0JCQl9Ci0JCX0KLQotCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlDRkdfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpOwotCi0JCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KLQkJYnJlYWs7Ci0KLW5leHRfZW50cnk6Ci0JCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKLQkJCWRmbHQgPSAqY2ZnOwotCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7Ci0JfQotCi0JLyogQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24gYSAqLwotCS8qIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mIHRoZSAqLwotCS8qIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuICovCi0JaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKLQl7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkgKQotCQlpbnQJCQlpOwotCQlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfSU5GTzJfVkFMSUQgfCBJUlFfTEVWRUxfSUQ7Ci0JCWlmIChpcnFfbGlzdFswXSA9PSAtMSkKLQkJCWxpbmstPmlycS5JUlFJbmZvMiA9IGlycV9tYXNrOwotCQllbHNlCi0JCQlmb3IgKGk9MDsgaTw0OyBpKyspCi0JCQkJbGluay0+aXJxLklSUUluZm8yIHw9IDEgPDwgaXJxX2xpc3RbaV07Ci0jZWxzZQotCQlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7Ci0jZW5kaWYKLQkJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7Ci0JCWxpbmstPmlycS5IYW5kbGVyID0gaGZhMzg0eF9pbnRlcnJ1cHQ7Ci0JCWxpbmstPmlycS5JbnN0YW5jZSA9IHdsYW5kZXY7Ci0JCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKLQl9Ci0KLQkvKiBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cCAqLwotCS8qIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLCBhbmQgcHV0dGluZyB0aGUgKi8KLQkvKiBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLiAqLwotCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKLQotCS8qIEZpbGwgdGhlIG5ldGRldmljZSB3aXRoIHRoaXMgaW5mbyAqLwotCXdsYW5kZXYtPm5ldGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROwotCXdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOwotCi0JLyogUmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLwotCVdMQU5fTE9HX0lORk8oIiVzOiBpbmRleCAweCUwMng6IFZjYyAlZC4lZCIsCi0JCWRldl9pbmZvLCBsaW5rLT5jb25mLkNvbmZpZ0luZGV4LAotCQlsaW5rLT5jb25mLlZjYy8xMCwgbGluay0+Y29uZi5WY2MlMTApOwotCWlmIChsaW5rLT5jb25mLlZwcDEpCi0JCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcDEvMTAsIGxpbmstPmNvbmYuVnBwMSUxMCk7Ci0JaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKLQkJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKLQkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlvLkJhc2VQb3J0MStsaW5rLT5pby5OdW1Qb3J0czEtMSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMikKLQkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLCBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOwotCXByaW50aygiXG4iKTsKLQotCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7Ci0KLQkvKiBMZXQgcGNtY2lhIGtub3cgdGhlIGRldmljZSBuYW1lICovCi0JbGluay0+ZGV2ID0gJmh3LT5ub2RlOwotCi0JLyogUmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlIGFuZCBnZXQgYXNzaWduZWQgYSBuYW1lICovCi0JU0VUX01PRFVMRV9PV05FUih3bGFuZGV2LT5uZXRkZXYpOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDExKSApCi0JU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAgJmhhbmRsZV90b19kZXYobGluay0+aGFuZGxlKSk7Ci0jZW5kaWYKLQlpZiAocmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KSAhPSAwKSB7Ci0JCVdMQU5fTE9HX05PVElDRSgicHJpc20yc3RhX2NzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCXN0cmNweShody0+bm9kZS5kZXZfbmFtZSwgd2xhbmRldi0+bmFtZSk7Ci0KLQkvKiBBbnkgZGV2aWNlIGN1c3RvbSBjb25maWcvcXVlcnkgc3R1ZmYgc2hvdWxkIGJlIGRvbmUgaGVyZSAqLwotCS8qIEZvciBhIG5ldGRldmljZSwgd2Ugc2hvdWxkIGF0IGxlYXN0IGdyYWIgdGhlIG1hYyBhZGRyZXNzICovCi0KLQlyZXR1cm47Ci1jc19mYWlsZWQ6Ci0JY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7Ci0JV0xBTl9MT0dfRVJST1IoIk5leHRUdXBsZSBmYWlsdXJlPyBJdCdzIHByb2JhYmx5IGEgVmNjIG1pc21hdGNoLlxuIik7Ci0KLWZhaWxlZDoKLQlwcmlzbTJzdGFfcmVsZWFzZSgodV9sb25nKWxpbmspOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9yZWxlYXNlCi0qCi0qIEhhbGYgb2YgdGhlIGNvbmZpZy9yZWxlYXNlIHBhaXIuICBVc3VhbGx5IGNhbGxlZCBpbiByZXNwb25zZSB0bwotKiBhIGNhcmQgZWplY3Rpb24gZXZlbnQuICBDaGVja3MgdG8gbWFrZSBzdXJlIG5vIGhpZ2hlciBsYXllcnMKLSogYXJlIHN0aWxsIChvciB0aGluayB0aGV5IGFyZSkgdXNpbmcgdGhlIGNhcmQgdmlhIHRoZSBsaW5rLT5vcGVuCi0qIGZpZWxkLgotKgotKiBOT1RFOiBEb24ndCBmb3JnZXQgdG8gaW5jcmVtZW50IHRoZSBsaW5rLT5vcGVuIHZhcmlhYmxlIGluIHRoZQotKiAgZGV2aWNlX29wZW4gbWV0aG9kLCBhbmQgZGVjcmVtZW50IGl0IGluIHRoZSBkZXZpY2VfY2xvc2UKLSogIG1ldGhvZC4KLSoKLSogQXJndW1lbnRzOgotKglhcmcJYSBnZW5lcmljIDMyIGJpdCB2YXJpYWJsZS4gIEl0J3MgdGhlIHZhbHVlIHRoYXQKLSoJCXdlIGFzc2lnbmVkIHRvIGxpbmstPnJlbGVhc2UuZGF0YSBpbiBzdGFfYXR0YWNoKCkuCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglBbGwgcmVzb3VyY2VzIHNob3VsZCBiZSByZWxlYXNlZCBhZnRlciB0aGlzIGZ1bmN0aW9uCi0qCWV4ZWN1dGVzIGFuZCBmaW5kcyB0aGUgZGV2aWNlICFvcGVuLgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCVBvc3NpYmx5IGluIGEgdGltZXIgY29udGV4dC4gIERvbid0IGRvIGFueXRoaW5nIHRoYXQnbGwKLSoJYmxvY2suCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20yc3RhX3JlbGVhc2UodV9sb25nIGFyZykKLXsKLSAgICAgICAgZGV2X2xpbmtfdAkqbGluayA9IChkZXZfbGlua190ICopYXJnOwotCi0JREJGRU5URVI7Ci0KLQkvKiBGaXJzdCB0aGluZyB3ZSBzaG91bGQgZG8gaXMgZ2V0IHRoZSBNU0QgYmFjayB0byB0aGUKLQkgKiBIV1BSRVNFTlQgc3RhdGUuICBJLmUuIGV2ZXJ5dGhpbmcgcXVpZXNjZW50LgotCSAqLwotCXByaXNtMnN0YV9pZnN0YXRlKGxpbmstPnByaXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQotICAgICAgICBpZiAobGluay0+b3BlbikgewotCQkvKiBUT0RPOiBJIGRvbid0IHRoaW5rIHdlJ3JlIGV2ZW4gdXNpbmcgdGhpcyBiaXQgb2YgY29kZQotCQkgKiBhbmQgSSBkb24ndCB0aGluayBpdCdzIGh1cnRpbmcgdXMgYXQgdGhlIG1vbWVudC4KLQkJICovCi0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJwcmlzbTJzdGFfY3M6IHJlbGVhc2UgcG9zdHBvbmVkLCAnJXMnIHN0aWxsIG9wZW5cbiIsCi0JCQlsaW5rLT5kZXYtPmRldl9uYW1lKTsKLSAgICAgICAgICAgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfU1RBTEVfQ09ORklHOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKLSAgICAgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOwotICAgICAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKLQotICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+KERFVl9DT05GSUcgfCBERVZfUkVMRUFTRV9QRU5ESU5HKTsKLQotCURCRkVYSVQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfZXZlbnQKLSoKLSogSGFuZGxlciBmb3IgY2FyZCBzZXJ2aWNlcyBldmVudHMuCi0qCi0qIEFyZ3VtZW50czoKLSoJZXZlbnQJCVRoZSBldmVudCBjb2RlCi0qCXByaW9yaXR5CWhpL2xvdyAtIFJFTU9WQUwgaXMgdGhlIG9ubHkgaGkKLSoJYXJncwkJcHRyIHRvIGNhcmQgc2VydmljZXMgc3RydWN0IGNvbnRhaW5pbmcgaW5mbyBhYm91dAotKgkJCXBjbWNpYSBzdGF0dXMKLSoKLSogUmV0dXJuczoKLSoJWmVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCUJvdGggaW50ZXJydXB0IGFuZCBwcm9jZXNzIHRocmVhZCwgZGVwZW5kcyBvbiB0aGUgZXZlbnQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQKLXByaXNtMnN0YV9ldmVudCAoCi0JZXZlbnRfdCBldmVudCwKLQlpbnQgcHJpb3JpdHksCi0JZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQotewotCWludAkJCXJlc3VsdCA9IDA7Ci0JZGV2X2xpbmtfdAkJKmxpbmsgPSAoZGV2X2xpbmtfdCAqKSBhcmdzLT5jbGllbnRfZGF0YTsKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCopbGluay0+cHJpdjsKLQloZmEzODR4X3QJCSpodyA9IE5VTEw7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICh3bGFuZGV2KSBodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlzd2l0Y2ggKGV2ZW50KQotCXsKLQljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgotCQlXTEFOX0xPR19ERUJVRyg1LCJldmVudCBpcyBJTlNFUlRJT05cbiIpOwotCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKLQkJcHJpc20yc3RhX2NvbmZpZyhsaW5rKTsKLQkJaWYgKCEobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSkgewotCQkJd2xhbmRldi0+bmV0ZGV2LT5pcnEgPSAwOwotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIiVzOiBJbml0aWFsaXphdGlvbiBmYWlsZWQhXG4iLCBkZXZfaW5mbyk7Ci0JCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogRmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUgaHcgc3RydWN0ICovCi0JCWh3LT5pcnEgPSB3bGFuZGV2LT5uZXRkZXYtPmlycTsKLQkJaHctPmlvYmFzZSA9IHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyOwotCQlody0+bGluayA9IGxpbms7Ci0KLQkJaWYgKHByaXNtMl9kb3Jlc2V0KSB7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2NvcmVyZXNldChodywKLQkJCQkJcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCQlwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7Ci0JCQlpZiAoIHJlc3VsdCApIHsKLQkJCQlXTEFOX0xPR19FUlJPUigKLQkJCQkJImNvcmVyZXNldCgpIGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwKLQkJCQkJcmVzdWx0KTsKLQkJCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXRkFJTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0jaWYgMAotCQkvKgotCQkgKiBUT0RPOiB0ZXN0X2hvc3RpZigpIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0JCSAqLwotCQlyZXN1bHQgPSBoZmEzODR4X3Rlc3RfaG9zdGlmKGh3KTsKLQkJaWYgKHJlc3VsdCkgewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkidGVzdF9ob3N0aWYoKSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYKLQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6Ci0JCVdMQU5fTE9HX0RFQlVHKDUsImV2ZW50IGlzIFJFTU9WQUxcbiIpOwotCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7Ci0KLQkJaWYgKHdsYW5kZXYpIHsKLQkJCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7Ci0JCX0KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0JCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCi0JCXsKLQkJCWxpbmstPnJlbGVhc2UuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFovMjApOwotCQkJYWRkX3RpbWVyKCZsaW5rLT5yZWxlYXNlKTsKLQkJfQotI2VuZGlmCi0JCWJyZWFrOwotCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUkVRVUVTVDoKLQkJV0xBTl9MT0dfREVCVUcoNSwiZXZlbnQgaXMgUkVTRVRfUkVRVUVTVFxuIik7Ci0JCVdMQU5fTE9HX05PVElDRSgKLQkJCSJwcmlzbTIgY2FyZCByZXNldCBub3Qgc3VwcG9ydGVkICIKLQkJCSJkdWUgdG8gcG9zdC1yZXNldCB1c2VyIG1vZGUgY29uZmlndXJhdGlvbiAiCi0JCQkicmVxdWlyZW1lbnRzLlxuIik7Ci0JCVdMQU5fTE9HX05PVElDRSgKLQkJCSIgIEZyb20gdXNlciBtb2RlLCB1c2UgIgotCQkJIidjYXJkY3RsIHN1c3BlbmQ7Y2FyZGN0bCByZXN1bWUnICIKLQkJCSJpbnN0ZWFkLlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6Ci0JY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgotCQlXTEFOX0xPR19XQVJOSU5HKCJSeCdkIENTX0VWRU5UX1JFU0VUX3h4eCwgc2hvdWxkIG5vdCAiCi0JCQkiYmUgcG9zc2libGUgc2luY2UgUkVTRVRfUkVRVUVTVCB3YXMgZGVuaWVkLlxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgotCQlXTEFOX0xPR19ERUJVRyg1LCJldmVudCBpcyBTVVNQRU5EXG4iKTsKLQkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7Ci0JCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCi0JCXsKLQkJCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgotCQlXTEFOX0xPR19ERUJVRyg1LCJldmVudCBpcyBSRVNVTUVcbiIpOwotCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7Ci0JCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKLQkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsgIC8qIG5vb25lIGVsc2UgZG9lcyBhbnRoaW5nIHdpdGggdGhlIHJldHVybiB2YWx1ZSAqLwotfQotI2VuZGlmIC8vIDw9IDIuNi4xNQotCi0KLQotaW50IGhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKQotewotCWludAkJcmVzdWx0ID0gMDsKLQljb25mX3JlZ190CXJlZzsKLQlVSU5UOAkJY29yc2F2ZTsKLQlEQkZFTlRFUjsKLQotCVdMQU5fTE9HX0RFQlVHKDMsICJEb2luZyByZXNldCB2aWEgQ2FyZFNlcnZpY2VzKCkuXG4iKTsKLQotCS8qIENvbGxlY3QgQ09SICovCi0JcmVnLkZ1bmN0aW9uID0gMDsKLQlyZWcuQWN0aW9uID0gQ1NfUkVBRDsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3LT5wZGV2LCAmcmVnKTsKLSNlbHNlCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKAotCQkJaHctPmxpbmstPmhhbmRsZSwKLQkJCSZyZWcpOwotI2VuZGlmCi0JaWYgKHJlc3VsdCAhPSBDU19TVUNDRVNTICkgewotCQlXTEFOX0xPR19FUlJPUigKLQkJCSI6MDogQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyKENTX1JFQUQpIGZhaWxlZCwiCi0JCQkicmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLQl9Ci0JY29yc2F2ZSA9IHJlZy5WYWx1ZTsKLQotCS8qIFdyaXRlIHJlc2V0IGJpdCAoQklUNykgKi8KLQlyZWcuVmFsdWUgfD0gQklUNzsKLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihody0+cGRldiwgJnJlZyk7Ci0jZWxzZQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKLQkJCWh3LT5saW5rLT5oYW5kbGUsCi0JCQkmcmVnKTsKLSNlbmRpZgotCWlmIChyZXN1bHQgIT0gQ1NfU1VDQ0VTUyApIHsKLQkJV0xBTl9MT0dfRVJST1IoCi0JCQkiOjE6IEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlcihDU19XUklURSkgZmFpbGVkLCIKLQkJCSJyZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUlPOwotCX0KLQotCS8qIEhvbGQgZm9yIGhvbGR0aW1lICovCi0JbWRlbGF5KGhvbGR0aW1lKTsKLQotCWlmIChnZW5lc2lzKSB7Ci0JCXJlZy5WYWx1ZSA9IGdlbmVzaXM7Ci0JCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQkJcmVnLk9mZnNldCA9IENJU1JFR19DQ1NSOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQkJcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3LT5wZGV2LCAmcmVnKTsKLSNlbHNlCi0JCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKLQkJCQkgICAgICBody0+bGluay0+aGFuZGxlLAotCQkJCSAgICAgICZyZWcpOwotI2VuZGlmCi0JCWlmIChyZXN1bHQgIT0gQ1NfU1VDQ0VTUyApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSI6MTogQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyKENTX1dSSVRFKSBmYWlsZWQsIgotCQkJCSJyZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQkJcmVzdWx0ID0gLUVJTzsKLQkJfQotCX0KLQotCS8qIEhvbGQgZm9yIGhvbGR0aW1lICovCi0JbWRlbGF5KGhvbGR0aW1lKTsKLQotCS8qIENsZWFyIHJlc2V0IGJpdCAqLwotCXJlZy5WYWx1ZSAmPSB+QklUNzsKLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihody0+cGRldiwgJnJlZyk7Ci0jZWxzZQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKLQkJCQkgICAgICBody0+bGluay0+aGFuZGxlLAotCQkJCSAgICAgICZyZWcpOwotI2VuZGlmCi0JaWYgKHJlc3VsdCAhPSBDU19TVUNDRVNTICkgewotCQlXTEFOX0xPR19FUlJPUigKLQkJCSI6MjogQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyKENTX1dSSVRFKSBmYWlsZWQsIgotCQkJInJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBXYWl0IGZvciBzZXR0bGV0aW1lICovCi0JbWRlbGF5KHNldHRsZXRpbWUpOwotCi0JLyogU2V0IG5vbi1yZXNldCBiaXRzIGJhY2sgd2hhdCB0aGV5IHdlcmUgKi8KLQlyZWcuVmFsdWUgPSBjb3JzYXZlOwotCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3LT5wZGV2LCAmcmVnKTsKLSNlbHNlCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKAotCQkJCSAgICAgIGh3LT5saW5rLT5oYW5kbGUsCi0JCQkJICAgICAgJnJlZyk7Ci0jZW5kaWYKLQlpZiAocmVzdWx0ICE9IENTX1NVQ0NFU1MgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKAotCQkJIjoyOiBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIoQ1NfV1JJVEUpIGZhaWxlZCwiCi0JCQkicmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIGludCBfX2luaXQgcHJpc20yY3NfaW5pdCh2b2lkKQotewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjgpKQotCXNlcnZpbmZvX3QJc2VydjsKLSNlbmRpZgotCi0JREJGRU5URVI7Ci0KLSAgICAgICAgV0xBTl9MT0dfTk9USUNFKCIlcyBMb2FkZWRcbiIsIHZlcnNpb24pOwotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoImRldl9pbmZvIGlzOiAlc1xuIiwgZGV2X2luZm8pOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCi0JcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8oJnNlcnYpOwotCWlmICggc2Vydi5SZXZpc2lvbiAhPSBDU19SRUxFQVNFX0NPREUgKQotCXsKLQkJcHJpbnRrKEtFUk5fTk9USUNFIiVzOiBDYXJkU2VydmljZXMgcmVsZWFzZSBkb2VzIG5vdCBtYXRjaCFcbiIsIGRldl9pbmZvKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFRoaXMgY2FsbCB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gcHJpc20yc3RhX2F0dGFjaCAqLwotCS8qICAgYW5kIGV2ZW50dWFsbHkgcHJpc20yc3RhX2RldGFjaCAqLwotCXJlZ2lzdGVyX3BjY2FyZF9kcml2ZXIoICZkZXZfaW5mbywgJnByaXNtMnN0YV9hdHRhY2gsICZwcmlzbTJzdGFfZGV0YWNoKTsKLSNlbHNlCi0JcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmcHJpc20yX2NzX2RyaXZlcik7Ci0jZW5kaWYKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwcmlzbTJjc19jbGVhbnVwKHZvaWQpCi17Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCi0gICAgICAgIGRldl9saW5rX3QgKmxpbmsgPSBkZXZfbGlzdDsKLSAgICAgICAgZGV2X2xpbmtfdCAqbmxpbms7Ci0gICAgICAgIERCRkVOVEVSOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkgKQotCWZvciAobGluaz1kZXZfbGlzdDsgbGluayAhPSBOVUxMOyBsaW5rID0gbmxpbmspIHsKLQkJbmxpbmsgPSBsaW5rLT5uZXh0OwotCQlpZiAoIGxpbmstPnN0YXRlICYgREVWX0NPTkZJRyApIHsKLQkJCXByaXNtMnN0YV9yZWxlYXNlKCh1X2xvbmcpbGluayk7Ci0JCX0KLQkJcHJpc20yc3RhX2RldGFjaChsaW5rKTsgLyogcmVtZW1iZXIgZGV0YWNoKCkgZnJlZXMgbGluayAqLwotCX0KLSNlbmRpZgotCi0JdW5yZWdpc3Rlcl9wY2NhcmRfZHJpdmVyKCAmZGV2X2luZm8pOwotI2Vsc2UKLQlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJnByaXNtMl9jc19kcml2ZXIpOwotI2VuZGlmCi0KLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyBVbmxvYWRlZFxuIiwgdmVyc2lvbik7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuOwotfQotCi1tb2R1bGVfaW5pdChwcmlzbTJjc19pbml0KTsKLW1vZHVsZV9leGl0KHByaXNtMmNzX2NsZWFudXApOwotCi0jZW5kaWYgLy8gTU9EVUxFCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlMzJkZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotI2RlZmluZSBXTEFOX0hPU1RJRiBXTEFOX1BDSQotI2luY2x1ZGUgImhmYTM4NHguYyIKLSNpbmNsdWRlICJwcmlzbTJtZ210LmMiCi0jaW5jbHVkZSAicHJpc20ybWliLmMiCi0jaW5jbHVkZSAicHJpc20yc3RhLmMiCi0KLSNkZWZpbmUgUENJX1NJWkUJCTB4MTAwMAkJLyogTWVtb3J5IHNpemUgLSA0SyBieXRlcyAqLwotCi0vKiBJU0wzODc0QSAxMU1iL3MgV0xBTiBjb250cm9sbGVyICovCi0jZGVmaW5lIFBDSVZFTkRPUl9JTlRFUlNJTAkweDEyNjBVTAotI2RlZmluZSBQQ0lERVZJQ0VfSVNMMzg3NAkweDM4NzNVTCAvKiBbTVNNXSB5ZWFoIEkga25vdy4uLnRoZSBJRCBzYXlzCi0JCQkJCSAgICAzODczLiBUcnVzdCBtZSwgaXQncyBhIDM4NzQuICovCi0KLS8qIFNhbXN1bmcgU1dMLTIyMTBQIDExTWIvcyBXTEFOIGNvbnRyb2xsZXIgKHVzZXMgSVNMMzg3NEEpICovCi0jZGVmaW5lIFBDSVZFTkRPUl9TQU1TVU5HICAgICAgMHgxNjdkVUwKLSNkZWZpbmUgUENJREVWSUNFX1NXTF8yMjEwUCAgICAweGEwMDBVTAotCi0jZGVmaW5lIFBDSVZFTkRPUl9ORVRHRUFSICAgICAgMHgxMzg1VUwgLyogZm9yIE1BMzExICovCi0KLS8qIFBDSSBDbGFzcyAmIFN1Yi1DbGFzcyBjb2RlLCBOZXR3b3JrLSdPdGhlciBjb250cm9sbGVyJyAqLwotI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19PVEhFUlMgMHgyODAKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX3Byb2JlX3BjaQotKgotKiBQcm9iZSByb3V0aW5lIGNhbGxlZCB3aGVuIGEgUENJIGRldmljZSB3LyBtYXRjaGluZyBJRCBpcyBmb3VuZC4KLSogVGhlIElTTDM4NzQgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgZm9sbG93aW5nIG1hcDoKLSogICBCQVIwOiBQcmlzbTIueCByZWdpc3RlcnMgbWVtb3J5IG1hcHBlZCwgc2l6ZT00awotKiBIZXJlJ3MgdGhlIHNlcXVlbmNlOgotKiAgIC0gQWxsb2NhdGUgdGhlIFBDSSByZXNvdXJjZXMuCi0qICAgLSBSZWFkIHRoZSBQQ01DSUEgYXR0cmlidXRlIG1lbW9yeSB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIFdMQU4gY2FyZAotKiAgIC0gUmVzZXQgdGhlIE1BQwotKiAgIC0gSW5pdGlhbGl6ZSB0aGUgbmV0ZGV2IGFuZCB3bGFuIGRhdGEKLSogICAtIEluaXRpYWxpemUgdGhlIE1BQwotKgotKiBBcmd1bWVudHM6Ci0qCXBkZXYJCXB0ciB0byBwY2kgZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQKLSoJCQlwY2kgY29uZmlndXJhdGlvbi4KLSoJaWQJCXB0ciB0byB0aGUgZGV2aWNlIGlkIGVudHJ5IHRoYXQgbWF0Y2hlZCB0aGlzIGRldmljZS4KLSoKLSogUmV0dXJuczoKLSoJemVybwkJLSBzdWNjZXNzCi0qCW5lZ2F0aXZlCS0gZmFpbGVkCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotcHJpc20yc3RhX3Byb2JlX3BjaSgKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCi17Ci0JaW50CQlyZXN1bHQ7Ci0JcGh5c190CQlwaHltZW0gPSAwOwotCXZvaWQJCV9faW9tZW0gKm1lbSA9IE5VTEw7Ci0gICAgICAgIHdsYW5kZXZpY2VfdCAgICAqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90CSpodyA9IE5VTEw7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEVuYWJsZSB0aGUgcGNpIGRldmljZSAqLwotCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHBjaV9lbmFibGVfZGV2aWNlKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogRmlndXJlIG91dCBvdXIgcmVzb3VyY2VzICovCi0JcGh5bWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCi0gICAgICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeW1lbSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSwgIlByaXNtMiIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHJpc20yOiBDYW5ub3QgcmVzZXJ2ZSBQQ0kgbWVtb3J5IHJlZ2lvblxuIik7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0JbWVtID0gaW9yZW1hcChwaHltZW0sIFBDSV9TSVpFKTsKLQlpZiAoIG1lbSA9PSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IGlvcmVtYXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBMb2cgdGhlIGRldmljZSAqLwotICAgICAgICBXTEFOX0xPR19JTkZPKCJBIFByaXNtMi41IFBDSSBkZXZpY2UgZm91bmQsICIKLQkJInBoeW1lbToweCVsbHgsIGlycTolZCwgbWVtOjB4JXBcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpcGh5bWVtLCBwZGV2LT5pcnEsIG1lbSk7Ci0KLQlpZiAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlpZiAoIHdsYW5fc2V0dXAod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiB3bGFuX3NldHVwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogU2V0dXAgbmV0ZGV2aWNlJ3MgYWJpbGl0eSB0byByZXBvcnQgcmVzb3VyY2VzCi0JICogTm90ZTogdGhlIG5ldGRldmljZSB3YXMgYWxsb2NhdGVkIGJ5IHdsYW5fc2V0dXAoKQotCSAqLwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPmlycSA9IHBkZXYtPmlycTsKLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5tZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZykgbWVtOwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPm1lbV9lbmQgPSB3bGFuZGV2LT5uZXRkZXYtPm1lbV9zdGFydCArCi0JCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBodyBkYXRhICovCi0gICAgICAgIGhmYTM4NHhfY3JlYXRlKGh3LCB3bGFuZGV2LT5uZXRkZXYtPmlycSwgMCwgbWVtKTsKLQlody0+d2xhbmRldiA9IHdsYW5kZXY7Ci0KLQkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQotCSAqIGxpbnV4IG5ldGRldmljZS4KLQkgKi8KLQlTRVRfTU9EVUxFX09XTkVSKHdsYW5kZXYtPm5ldGRldik7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0gICAgICAgU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAmKHBkZXYtPmRldikpOwotI2VuZGlmCi0gICAgICAgIGlmICggcmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHJlZ2lzdGVyX3dsYW5kZXYoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0jaWYgMAotCS8qIFRPRE86IE1vdmUgdGhpcyBhbmQgYW4gaXJxIHRlc3QgaW50byBhbiBoZmEzODR4X3Rlc3RpZigpIHJvdXRpbmUuCi0JICovCi0Jb3V0dyhQUklTTTJTVEFfTUFHSUMsIEhGQTM4NHhfU1dTVVBQT1JUKHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyKSk7Ci0JcmVnPWludyggSEZBMzg0eF9TV1NVUFBPUlQod2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIpKTsKLQlpZiAoIHJlZyAhPSBQUklTTTJTVEFfTUFHSUMgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJNQUMgcmVnaXN0ZXIgYWNjZXNzIHRlc3QgZmFpbGVkIVxuIik7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0jZW5kaWYKLQotCS8qIERvIGEgY2hpcC1sZXZlbCByZXNldCBvbiB0aGUgTUFDICovCi0JaWYgKHByaXNtMl9kb3Jlc2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29yZXJlc2V0KGh3LAotCQkJCXByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQlwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7Ci0JCWlmIChyZXN1bHQgIT0gMCkgewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIiVzOiBoZmEzODR4X2NvcmVyZXNldCgpIGZhaWxlZC5cbiIsCi0JCQkJZGV2X2luZm8pOwotCQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJCXJlc3VsdCA9IC1FSU87Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9Ci0KLSAgICAgICAgcGNpX3NldF9kcnZkYXRhKHBkZXYsIHdsYW5kZXYpOwotCi0JLyogU2hvdWxkbid0IGFjdHVhbGx5IGhvb2sgdXAgdGhlIElSUSB1bnRpbCB3ZQotCSAqIF9rbm93XyB0aGluZ3MgYXJlIGFscmlnaHQuICBBIHRlc3Qgcm91dGluZSB3b3VsZCBoZWxwLgotCSAqLwotICAgICAgIAlyZXF1ZXN0X2lycSh3bGFuZGV2LT5uZXRkZXYtPmlycSwgaGZhMzg0eF9pbnRlcnJ1cHQsCi0JCVNBX1NISVJRLCB3bGFuZGV2LT5uYW1lLCB3bGFuZGV2KTsKLQotCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwotCi0JcmVzdWx0ID0gMDsKLQlnb3RvIGRvbmU7Ci0KLSBmYWlsOgotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlpZiAod2xhbmRldikJa2ZyZWUod2xhbmRldik7Ci0JaWYgKGh3KQkJa2ZyZWUoaHcpOwotICAgICAgICBpZiAobWVtKSAgICAgICAgaW91bm1hcChtZW0pOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotIGRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgcHJpc20yc3RhX3JlbW92ZV9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0gICAgICAgCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7Ci0JaGZhMzg0eF90CSpodzsKLQotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCi0JLyogcmVzZXQgaGFyZHdhcmUgKi8KLQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0KLSAgICAgICAgaWYgKHBkZXYtPmlycSkKLQkJZnJlZV9pcnEocGRldi0+aXJxLCB3bGFuZGV2KTsKLQotCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQotCS8qIGZyZWUgbG9jYWwgc3R1ZmYgKi8KLQlpZiAoaHcpIHsKLQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJa2ZyZWUoaHcpOwotCX0KLQotCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKXdsYW5kZXYtPm5ldGRldi0+bWVtX3N0YXJ0KTsKLQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0KLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotICAgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCi0Ja2ZyZWUod2xhbmRldik7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV9pZF90YmxbXSA9IHsKLQl7Ci0JCVBDSVZFTkRPUl9JTlRFUlNJTCwgUENJREVWSUNFX0lTTDM4NzQsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJJbnRlcnNpbCBQcmlzbTIuNSBJU0wzODc0IDExTWIvcyBXTEFOIENvbnRyb2xsZXIiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl9JTlRFUlNJTCwgMHgzODcyLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiSW50ZXJzaWwgUHJpc20yLjUgSVNMMzg3MiAxMU1iL3MgV0xBTiBDb250cm9sbGVyIgotCX0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgIFBDSVZFTkRPUl9TQU1TVU5HLCBQQ0lERVZJQ0VfU1dMXzIyMTBQLAotICAgICAgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLSAgICAgICAgICAgICAgIDAsIDAsCi0gICAgICAgICAgICAgICAvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIlNhbXN1bmcgTWFnaWNMQU4gU1dMLTIyMTBQIDExTWIvcyBXTEFOIENvbnRyb2xsZXIiCi0JfSwKLQl7IC8qIGZvciBOZXRHZWFyIE1BMzExICovCi0JCVBDSVZFTkRPUl9ORVRHRUFSLCAweDM4NzIsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJOZXRnZWFyIE1BMzExIFdMQU4gQ29udHJvbGxlciIKLQl9LAotCXsKLQkJMCwgMCwgMCwgMCwgMCwgMCwgMAotCX0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lfaWRfdGJsKTsKLQotLyogRnVuY3Rpb24gZGVjbGFyZWQgaGVyZSBiZWNhdXNlIG9mIHB0ciByZWZlcmVuY2UgYmVsb3cgKi8KLXN0YXRpYyBpbnQgIF9fZGV2aW5pdCBwcmlzbTJzdGFfcHJvYmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7Ci1zdGF0aWMgdm9pZCAgX19kZXZleGl0IHByaXNtMnN0YV9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHByaXNtMl9wY2lfZHJ2X2lkID0gewotICAgICAgICAubmFtZSA9ICJwcmlzbTJfcGNpIiwKLSAgICAgICAgLmlkX3RhYmxlID0gcGNpX2lkX3RibCwKLSAgICAgICAgLnByb2JlID0gcHJpc20yc3RhX3Byb2JlX3BjaSwKLSAgICAgICAgLnJlbW92ZSA9IHByaXNtMnN0YV9yZW1vdmVfcGNpLAotI2lmZGVmIENPTkZJR19QTQotICAgICAgICAuc3VzcGVuZCA9IHByaXNtMnN0YV9zdXNwZW5kX3BjaSwKLSAgICAgICAgLnJlc3VtZSA9IHByaXNtMnN0YV9yZXN1bWVfcGNpLAotI2VuZGlmCi19OwotCi0jaWZkZWYgTU9EVUxFCi0KLXN0YXRpYyBpbnQgX19pbml0IHByaXNtMnBjaV9pbml0KHZvaWQpCi17Ci0gICAgICAgIFdMQU5fTE9HX05PVElDRSgiJXMgTG9hZGVkXG4iLCB2ZXJzaW9uKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwcmlzbTJfcGNpX2Rydl9pZCk7Ci19OwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcHJpc20ycGNpX2NsZWFudXAodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnByaXNtMl9wY2lfZHJ2X2lkKTsKLX07Ci0KLW1vZHVsZV9pbml0KHByaXNtMnBjaV9pbml0KTsKLW1vZHVsZV9leGl0KHByaXNtMnBjaV9jbGVhbnVwKTsKLQotI2VuZGlmCi0KLWludCBoZmEzODR4X2NvcmVyZXNldChoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcykKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgbG9uZwl0aW1lb3V0OwotCVVJTlQxNglyZWc7Ci0JREJGRU5URVI7Ci0KLQkvKiBBc3NlcnQgcmVzZXQgYW5kIHdhaXQgYXdoaWxlCi0JICogKG5vdGU6IHRoZXNlIGRlbGF5cyBhcmUgX3JlYWxseV8gbG9uZywgYnV0IHRoZXkgYXBwZWFyIHRvIGJlCi0JICogICAgICAgIG5lY2Vzc2FyeS4pCi0JICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDB4YzUsIEhGQTM4NHhfUENJQ09SKTsKLQl0aW1lb3V0ID0gamlmZmllcyArIEhaLzQ7Ci0Jd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHVkZWxheSg1KTsKLQotCWlmIChnZW5lc2lzKSB7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBnZW5lc2lzLCBIRkEzODR4X1BDSUhDUik7Ci0JCXRpbWVvdXQgPSBqaWZmaWVzICsgSFovNDsKLQkJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHVkZWxheSg1KTsKLQl9Ci0KLQkvKiBDbGVhciB0aGUgcmVzZXQgYW5kIHdhaXQgc29tZSBtb3JlCi0JICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDB4NDUsIEhGQTM4NHhfUENJQ09SKTsKLQl0aW1lb3V0ID0gamlmZmllcyArIEhaLzI7Ci0Jd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHVkZWxheSg1KTsKLQotCS8qIFdhaXQgZm9yIGYvdyB0byBjb21wbGV0ZSBpbml0aWFsaXphdGlvbiAoQ01EOkJVU1kgPT0gMCkKLQkgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIDIqSFo7Ci0JcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQl3aGlsZSAoIEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpICYmIHRpbWVfYmVmb3JlKCBqaWZmaWVzLCB0aW1lb3V0KSApIHsKLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0JaWYgKEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpKSB7Ci0JCVdMQU5fTE9HX1dBUk5JTkcoImNvcmVyZXNldDogVGltZWQgb3V0IHdhaXRpbmcgZm9yIGNtZCByZWdpc3Rlci5cbiIpOwotCQlyZXN1bHQ9MTsKLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3BseC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3BseC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA0NDNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wbHguYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0jZGVmaW5lIFdMQU5fSE9TVElGIFdMQU5fUExYCi0jaW5jbHVkZSAiaGZhMzg0eC5jIgotI2luY2x1ZGUgInByaXNtMm1nbXQuYyIKLSNpbmNsdWRlICJwcmlzbTJtaWIuYyIKLSNpbmNsdWRlICJwcmlzbTJzdGEuYyIKLQotI2RlZmluZSBQTFhfQVRUUl9TSVpFCTB4MTAwMAkvKiBBdHRyaWJ1dGUgbWVtb3J5IHNpemUgLSA0SyBieXRlcyAqLwotI2RlZmluZSBDT1JfT0ZGU0VUCTB4M2UwCS8qIENPUiBhdHRyaWJ1dGUgb2Zmc2V0IG9mIFByaXNtMiBQQyBjYXJkICovCi0jZGVmaW5lIENPUl9WQUxVRQkweDQxCS8qIEVuYWJsZSBQQyBjYXJkIHdpdGggaXJxIGluIGxldmVsIHRyaWdnZXIgKi8KLSNkZWZpbmUgUExYX0lOVENTUgkweDRjCS8qIEludGVycnVwdCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUExYX0lOVENTUl9JTlRFTiAoMTw8NikgLyogSW50ZXJydXB0IEVuYWJsZSBiaXQgKi8KLSNkZWZpbmUgUExYX01JTl9BVFRSX0xFTiA1MTIgICAgLyogYXQgbGVhc3QgMiB4IDI1NiBpcyBuZWVkZWQgZm9yIENJUyAqLwotCi0vKiAzQ29tIDNDUlc3NzdBIChQTFgpIGJvYXJkIElEICovCi0jZGVmaW5lIFBDSVZFTkRPUl8zQ09NICAgICAgIDB4MTBCNwotI2RlZmluZSBQQ0lERVZJQ0VfQUlSQ09OTkVDVCAweDc3NzAKLQotLyogRXVtaXRjb20gUENJIFdMMTEwMDAgUENJIEFkYXB0ZXIgKFBMWCkgYm9hcmQgZGV2aWNlK3ZlbmRvciBJRCAqLwotI2RlZmluZSBQQ0lWRU5ET1JfRVVNSVRDT00JMHgxNjM4VUwKLSNkZWZpbmUgUENJREVWSUNFX1dMMTEwMDAJMHgxMTAwVUwKLQotLyogR2xvYmFsIFN1biBUZWNoIEdMMjQxMTBQIFBDSSBBZGFwdGVyIChQTFgpIGJvYXJkIGRldmljZSt2ZW5kb3IgSUQgKi8KLSNkZWZpbmUgUENJVkVORE9SX0dMT0JBTFNVTgkweDE2YWJVTAotI2RlZmluZSBQQ0lERVZJQ0VfR0wyNDExMFAJMHgxMTAxVUwKLSNkZWZpbmUgUENJREVWSUNFX0dMMjQxMTBQX0FMVAkweDExMDJVTAotCi0vKiBOZXRnZWFyIE1BMzAxIFBDSSBBZGFwdGVyIChQTFgpIGJvYXJkIGRldmljZSt2ZW5kb3IgSUQgKi8KLSNkZWZpbmUgUENJVkVORE9SX05FVEdFQVIJMHgxMzg1VUwKLSNkZWZpbmUgUENJREVWSUNFX01BMzAxCQkweDQxMDBVTAotCi0vKiBVUyBSb2JvdGljcyBVU1IyNDEwIFBDSSBBZGFwdGVyIChQTFgpIGJvYXJkIGRldmljZSt2ZW5kb3IgSUQgKi8KLSNkZWZpbmUJUENJVkVORE9SX1VTUk9CT1RJQ1MgICAgMHgxNmVjVUwKLSNkZWZpbmUgUENJREVWSUNFX1VTUjI0MTAgICAgICAgMHgzNjg1VUwKLQotLyogTGlua3N5cyBXUEMxMSBjYXJkIHdpdGggdGhlIFdEVDExIGFkYXB0ZXIgKFBMWCkgYm9hcmQgZGV2aWNlK3ZlbmRvciBJRCAqLwotI2RlZmluZQlQQ0lWRU5ET1JfTGlua3N5cyAgICAgICAweDE2YWJVTAotI2RlZmluZSBQQ0lERVZJQ0VfV3BjMTFXZHQxMSAgICAweDExMDJVTAotCi0vKiBOYXRpb25hbCBEYXRhY29tbSBDb3JwIFNPSE93YXJlIE5ldGJsYXN0ZXIgSUkgUENJICovCi0jZGVmaW5lIFBDSVZFTkRPUl9OREMJICAgICAgICAweDE1ZThVTAotI2RlZmluZSBQQ0lERVZJQ0VfTkNQMTMwX1BMWCAJMHgwMTMwVUwKLSNkZWZpbmUgUENJREVWSUNFX05DUDEzMF9BU0lDCTB4MDEzMVVMCi0KLS8qIE5EQyBOQ1AxMzBfUExYIGlzIGFsc28gc29sZCBieSBDb3JlZ2EuIFRoZWlyIG5hbWUgaXMgQ0dXTFBDSUExMSAqLwotI2RlZmluZSBQQ0lWRU5ET1JfQ09SRUdBICAgICAgIFBDSVZFTkRPUl9OREMKLSNkZWZpbmUgUENJREVWSUNFX0NHV0xQQ0lBMTEgICBQQ0lERVZJQ0VfTkNQMTMwX1BMWAotCi0vKiBQQ0kgQ2xhc3MgJiBTdWItQ2xhc3MgY29kZSwgTmV0d29yay0nT3RoZXIgY29udHJvbGxlcicgKi8KLSNkZWZpbmUgUENJX0NMQVNTX05FVFdPUktfT1RIRVJTIDB4MjgwCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfcHJvYmVfcGx4Ci0qCi0qIFByb2JlIHJvdXRpbmUgY2FsbGVkIHdoZW4gYSBQQ0kgZGV2aWNlIHcvIG1hdGNoaW5nIElEIGlzIGZvdW5kLgotKiBUaGlzIFBMWCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBmb2xsb3dpbmcgbWFwOgotKiAgIEJBUjA6IFVudXNlZAotKiAgIEJBUjE6ID8/Pz8KLSogICBCQVIyOiBQQ01DSUEgYXR0cmlidXRlIG1lbW9yeQotKiAgIEJBUjM6IFBDTUNJQSBpL28gc3BhY2UKLSogSGVyZSdzIHRoZSBzZXF1ZW5jZToKLSogICAtIEFsbG9jYXRlIHRoZSBQQ0kgcmVzb3VyY2VzLgotKiAgIC0gUmVhZCB0aGUgUENNQ0lBIGF0dHJpYnV0ZSBtZW1vcnkgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBXTEFOIGNhcmQKLSogICAtIFJlc2V0IHRoZSBNQUMgdXNpbmcgdGhlIFBDTUNJQSBDT1IKLSogICAtIEluaXRpYWxpemUgdGhlIG5ldGRldiBhbmQgd2xhbiBkYXRhCi0qICAgLSBJbml0aWFsaXplIHRoZSBNQUMKLSoKLSogQXJndW1lbnRzOgotKglwZGV2CQlwdHIgdG8gcGNpIGRldmljZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvIGFib3V0Ci0qCQkJcGNpIGNvbmZpZ3VyYXRpb24uCi0qCWlkCQlwdHIgdG8gdGhlIGRldmljZSBpZCBlbnRyeSB0aGF0IG1hdGNoZWQgdGhpcyBkZXZpY2UuCi0qCi0qIFJldHVybnM6Ci0qCXplcm8JCS0gc3VjY2VzcwotKgluZWdhdGl2ZQktIGZhaWxlZAotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBfX2RldmluaXQKLXByaXNtMnN0YV9wcm9iZV9wbHgoCi0Jc3RydWN0IHBjaV9kZXYJCQkqcGRldiwKLQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZAkqaWQpCi17Ci0JaW50CQlyZXN1bHQ7Ci0gICAgICAgIHBoeXNfdAlwY2NhcmRfaW9hZGRyOwotCXBoeXNfdCAgcGNjYXJkX2F0dHJfbWVtOwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgcGNjYXJkX2F0dHJfbGVuOwotCXZvaWQgX19pb21lbSAqYXR0cl9tZW0gPSBOVUxMOwotCVVJTlQzMgkJcGx4X2FkZHI7Ci0gICAgICAgIHdsYW5kZXZpY2VfdCAgICAqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90CSpodyA9IE5VTEw7Ci0JaW50CQlyZWc7Ci0gICAgICAgIHUzMgkJcmVnaWM7Ci0KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCi0JCXJldHVybiAtRUlPOwotCi0JLyogVE1DNzE2MCBib2FyZHMgYXJlIHNwZWNpYWwgKi8KLQlpZiAoKHBkZXYtPnZlbmRvciA9PSBQQ0lWRU5ET1JfTkRDKSAmJgotCSAgICAocGRldi0+ZGV2aWNlID09IFBDSURFVklDRV9OQ1AxMzBfQVNJQykpIHsKLQkJdW5zaWduZWQgbG9uZyBkZWxheTsKLQotCQlwY2NhcmRfYXR0cl9tZW0gPSAwOwotCQlwY2NhcmRfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwotCi0JCW91dGIoMHg0NSwgcGNjYXJkX2lvYWRkcik7Ci0JCWRlbGF5ID0gamlmZmllcyArIDEqSFo7Ci0JCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkZWxheSkpOwotCi0JCWlmIChpbmIocGNjYXJkX2lvYWRkcikgIT0gMHg0NSkgewotCQkJV0xBTl9MT0dfRVJST1IoIkluaXRpYWxpemUgdGhlIFRNQzcxNjAgZmFpbGVkLiAoMHgleClcbiIsIGluYihwY2NhcmRfaW9hZGRyKSk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCi0JCXBjY2FyZF9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7Ci0JCXByaXNtMl9kb3Jlc2V0ID0gMDsKLQotCQlXTEFOX0xPR19JTkZPKCJOREMgTkNQMTMwIHdpdGggVE1DNzE2KEFTSUMpIFBDSSBpbnRlcmZhY2UgZGV2aWNlIGZvdW5kIGF0IGlvOjB4JXgsIGlycTolZFxuIiwgcGNjYXJkX2lvYWRkciwgcGRldi0+aXJxKTsKLQkJZ290byBpbml0OwotCX0KLQotCS8qIENvbGxlY3QgdGhlIHJlc291cmNlIHJlcXVpcmVtZW50cyAqLwotCXBjY2FyZF9hdHRyX21lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKLQlwY2NhcmRfYXR0cl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpOwotICAgICAgICBpZiAocGNjYXJkX2F0dHJfbGVuIDwgUExYX01JTl9BVFRSX0xFTikKLQkJcmV0dXJuIC1FSU87Ci0KLQlwY2NhcmRfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOwotCi0JLyogYmpvZXJuOiBXZSBuZWVkIHRvIHRlbGwgdGhlIGNhcmQgdG8gZW5hYmxlIGludGVycnVwdHMsIGluCi0JICogY2FzZSB0aGUgc2VyaWFsIGVwcm9tIGRpZG4ndCBkbyB0aGlzIGFscmVhZHkuIFNlZSB0aGUKLQkgKiBQTFg5MDUyIGRhdGEgYm9vaywgcDgtMSBhbmQgOC0yNCBmb3IgcmVmZXJlbmNlLgotCSAqIFtNU01dOiBUaGlzIGJpdCBvZiBjb2RlIGNhbWUgZnJvbSB0aGUgb3Jpbm9jb19jcyBkcml2ZXIuCi0JICovCi0JcGx4X2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7Ci0KLQlyZWdpYyA9IDA7Ci0JcmVnaWMgPSBpbmwocGx4X2FkZHIrUExYX0lOVENTUik7Ci0JaWYocmVnaWMgJiBQTFhfSU5UQ1NSX0lOVEVOKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiJXM6IExvY2FsIEludGVycnVwdCBhbHJlYWR5IGVuYWJsZWRcbiIsIGRldl9pbmZvKTsKLQl9IGVsc2UgewotCQlyZWdpYyB8PSBQTFhfSU5UQ1NSX0lOVEVOOwotCQlvdXRsKHJlZ2ljLCBwbHhfYWRkcitQTFhfSU5UQ1NSKTsKLQkJcmVnaWMgPSBpbmwocGx4X2FkZHIrUExYX0lOVENTUik7Ci0JCWlmKCEocmVnaWMgJiBQTFhfSU5UQ1NSX0lOVEVOKSkgewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIiVzOiBDb3VsZG4ndCBlbmFibGUgTG9jYWwgSW50ZXJydXB0c1xuIiwKLQkJCQlkZXZfaW5mbyk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KLQotCS8qIFRoZXNlIGFzc2lnbm1lbnRzIGFyZSBoZXJlIGluIGNhc2Ugb2YgZnV0dXJlIG1hcHBpbmdzIGZvcgotCSAqIGlvIHNwYWNlIGFuZCBpcnEgdGhhdCBtaWdodCBiZSBzaW1pbGFyIHRvIGlvcmVtYXAKLQkgKi8KLSAgICAgICAgaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNjYXJkX2F0dHJfbWVtLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpLCAiUHJpc20yIikpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBDb3VsZG4ndCByZXNlcnZlIFBDSSBtZW1vcnkgcmVnaW9uXG4iLCBkZXZfaW5mbyk7Ci0JCXJldHVybiAtRUlPOwotICAgICAgICB9Ci0KLQlhdHRyX21lbSA9IGlvcmVtYXAocGNjYXJkX2F0dHJfbWVtLCBwY2NhcmRfYXR0cl9sZW4pOwotCi0JV0xBTl9MT0dfSU5GTygiQSBQTFggUENJL1BDTUNJQSBpbnRlcmZhY2UgZGV2aWNlIGZvdW5kLCAiCi0JCSJwaHltZW06MHglbGx4LCBwaHlpbz0weCV4LCBpcnE6JWQsICIKLQkJIm1lbTogMHglbHhcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNjYXJkX2F0dHJfbWVtLCBwY2NhcmRfaW9hZGRyLCBwZGV2LT5pcnEsCi0JCSh1bnNpZ25lZCBsb25nKWF0dHJfbWVtKTsKLQotCS8qIFZlcmlmeSB3aGV0aGVyIFBDIGNhcmQgaXMgcHJlc2VudC4KLQkgKiBbTVNNXSBUaGlzIG5lZWRzIGltcHJvdmVtZW50LCB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaXMKLQkgKiBwcm9iYWJseSB0byB3YWxrIHRoZSBDSVMgbG9va2luZyBmb3IgdGhlIHZlbmRvciBhbmQgcHJvZHVjdAotCSAqIElEcy4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhpcyBjb3VsZCBiZSB0aWVkIGluIHdpdGggdGhlCi0JICogZXRjL3BjbWNpYS93bGFuLW5nLmNvbmYgZmlsZS4gIEFueSB2b2x1bnRlZXJzPyAgOy0pCi0JICovCi0JaWYgKAotCXJlYWRiKGF0dHJfbWVtICsgMCkgIT0gMHgwMSB8fCByZWFkYihhdHRyX21lbSArIDIpICE9IDB4MDMgfHwKLQlyZWFkYihhdHRyX21lbSArIDQpICE9IDB4MDAgfHwgcmVhZGIoYXR0cl9tZW0gKyA2KSAhPSAweDAwIHx8Ci0JcmVhZGIoYXR0cl9tZW0gKyA4KSAhPSAweEZGIHx8IHJlYWRiKGF0dHJfbWVtICsgMTApICE9IDB4MTcgfHwKLQlyZWFkYihhdHRyX21lbSArIDEyKSAhPSAweDA0IHx8IHJlYWRiKGF0dHJfbWVtICsgMTQpICE9IDB4NjcpIHsKLQkJV0xBTl9MT0dfRVJST1IoIlByaXNtMiBQQyBjYXJkIENJUyBpcyBpbnZhbGlkLlxuIik7Ci0JCXJldHVybiAtRUlPOwotICAgICAgICB9Ci0gICAgICAgIFdMQU5fTE9HX0lORk8oIkEgUENNQ0lBIFdMQU4gYWRhcHRlciB3YXMgZm91bmQuXG4iKTsKLQotICAgICAgICAvKiBXcml0ZSBDT1IgdG8gZW5hYmxlIFBDIGNhcmQgKi8KLQl3cml0ZWIoQ09SX1ZBTFVFLCBhdHRyX21lbSArIENPUl9PRkZTRVQpOwotCXJlZyA9IHJlYWRiKGF0dHJfbWVtICsgQ09SX09GRlNFVCk7Ci0KLSBpbml0OgotCi0JLyoKLQkgKiBOb3cgZG8gZXZlcnl0aGluZyB0aGUgc2FtZSBhcyBhIFBDSSBkZXZpY2UKLQkgKiBbTVNNXSBUT0RPOiBXZSBjb3VsZCBwcm9iYWJseSBmYWN0b3IgdGhpcyBvdXQgb2YgcGNtY2lhL3BjaS9wbHgKLQkgKiBhbmQgcGVyaGFwcyB1c2IuICBQZXJoYXBzIGEgdGFzayBmb3IgYW5vdGhlciBkYXkuLi4uLi4uCi0JICovCi0KLQlpZiAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JaWYgKCB3bGFuX3NldHVwKHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogd2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogU2V0dXAgbmV0ZGV2aWNlJ3MgYWJpbGl0eSB0byByZXBvcnQgcmVzb3VyY2VzCi0JICogTm90ZTogdGhlIG5ldGRldmljZSB3YXMgYWxsb2NhdGVkIGJ5IHdsYW5fc2V0dXAoKQotCSAqLwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPmlycSA9IHBkZXYtPmlycTsKLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIgPSBwY2NhcmRfaW9hZGRyOwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWF0dHJfbWVtOwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPm1lbV9lbmQgPSAodW5zaWduZWQgbG9uZylhdHRyX21lbSArIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBodyBkYXRhICovCi0gICAgICAgIGhmYTM4NHhfY3JlYXRlKGh3LCB3bGFuZGV2LT5uZXRkZXYtPmlycSwgcGNjYXJkX2lvYWRkciwgYXR0cl9tZW0pOwotCWh3LT53bGFuZGV2ID0gd2xhbmRldjsKLQotCS8qIFJlZ2lzdGVyIHRoZSB3bGFuZGV2LCB0aGlzIGdldHMgdXMgYSBuYW1lIGFuZCByZWdpc3RlcnMgdGhlCi0JICogbGludXggbmV0ZGV2aWNlLgotCSAqLwotCVNFVF9NT0RVTEVfT1dORVIod2xhbmRldi0+bmV0ZGV2KTsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLSAgICAgICBTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYocGRldi0+ZGV2KSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogcmVnaXN0ZXJfd2xhbmRldigpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLQotI2lmIDAKLQkvKiBUT0RPOiBNb3ZlIHRoaXMgYW5kIGFuIGlycSB0ZXN0IGludG8gYW4gaGZhMzg0eF90ZXN0aWYoKSByb3V0aW5lLgotCSAqLwotCW91dHcoUFJJU00yU1RBX01BR0lDLCBIRkEzODR4X1NXU1VQUE9SVCh3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkcikpOwotCXJlZz1pbncoIEhGQTM4NHhfU1dTVVBQT1JUKHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyKSk7Ci0JaWYgKCByZWcgIT0gUFJJU00yU1RBX01BR0lDICkgewotCQlXTEFOX0xPR19FUlJPUigiTUFDIHJlZ2lzdGVyIGFjY2VzcyB0ZXN0IGZhaWxlZCFcbiIpOwotIAkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotI2VuZGlmCi0KLQkvKiBEbyBhIGNoaXAtbGV2ZWwgcmVzZXQgb24gdGhlIE1BQyAqLwotCWlmIChwcmlzbTJfZG9yZXNldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2NvcmVyZXNldChodywKLQkJCQlwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIDApOwotCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiJXM6IGhmYTM4NHhfY29yZXJlc2V0KCkgZmFpbGVkLlxuIiwKLQkJCQlkZXZfaW5mbyk7Ci0JCQlyZXN1bHQgPSAtRUlPOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQl9Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgd2xhbmRldik7Ci0KLQkvKiBTaG91bGRuJ3QgYWN0dWFsbHkgaG9vayB1cCB0aGUgSVJRIHVudGlsIHdlCi0JICogX2tub3dfIHRoaW5ncyBhcmUgYWxyaWdodC4gIEEgdGVzdCByb3V0aW5lIHdvdWxkIGhlbHAuCi0JICovCi0gICAgICAgCXJlcXVlc3RfaXJxKHdsYW5kZXYtPm5ldGRldi0+aXJxLCBoZmEzODR4X2ludGVycnVwdCwKLQkJU0FfU0hJUlEsIHdsYW5kZXYtPm5hbWUsIHdsYW5kZXYpOwotCi0Jd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7Ci0KLQlyZXN1bHQgPSAwOwotCi0JZ290byBkb25lOwotCi0gZmFpbGVkOgotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWlmICh3bGFuZGV2KQlrZnJlZSh3bGFuZGV2KTsKLQlpZiAoaHcpCQlrZnJlZShodyk7Ci0gICAgICAgIGlmIChhdHRyX21lbSkgICAgICAgIGlvdW5tYXAoYXR0cl9tZW0pOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotIGRvbmU6Ci0JREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IHByaXNtMnN0YV9yZW1vdmVfcGx4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotICAgICAgIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCWhmYTM4NHhfdCAgICAgICAgICAgICAgICpodzsKLQotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCi0JLyogcmVzZXQgaGFyZHdhcmUgKi8KLQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0KLSAgICAgICAgaWYgKHBkZXYtPmlycSkKLQkJZnJlZV9pcnEocGRldi0+aXJxLCB3bGFuZGV2KTsKLQotCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQotCS8qIGZyZWUgbG9jYWwgc3R1ZmYgKi8KLQlpZiAoaHcpIHsKLQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJa2ZyZWUoaHcpOwotCX0KLQotCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKXdsYW5kZXYtPm5ldGRldi0+bWVtX3N0YXJ0KTsKLQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0KLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotICAgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCi0Ja2ZyZWUod2xhbmRldik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwbHhfaWRfdGJsW10gPSB7Ci0JewotCQlQQ0lWRU5ET1JfRVVNSVRDT00sIFBDSURFVklDRV9XTDExMDAwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiRXVtaXRjb20gV0wxMTAwMCBQQ0koUExYKSBjYXJkIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfR0xPQkFMU1VOLCBQQ0lERVZJQ0VfR0wyNDExMFAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJHbG9iYWwgU3VuIFRlY2ggR0wyNDExMFAgUENJKFBMWCkgY2FyZCIKLQl9LAotCXsKLQkJUENJVkVORE9SX0dMT0JBTFNVTiwgUENJREVWSUNFX0dMMjQxMTBQX0FMVCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIkdsb2JhbCBTdW4gVGVjaCBHTDI0MTEwUCBQQ0koUExYKSBjYXJkIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfTkVUR0VBUiwgUENJREVWSUNFX01BMzAxLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiR2xvYmFsIFN1biBUZWNoIEdMMjQxMTBQIFBDSShQTFgpIGNhcmQiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl9VU1JPQk9USUNTLCBQQ0lERVZJQ0VfVVNSMjQxMCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIlVTIFJvYm90aWNzIFVTUjI0MTAgUENJKFBMWCkgY2FyZCIKLQl9LAotCXsKLQkJUENJVkVORE9SX0xpbmtzeXMsIFBDSURFVklDRV9XcGMxMVdkdDExLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiTGlua3N5cyBXUEMxMSB3aXRoIFdEVDExIFBDSShQTFgpIGFkYXB0ZXIiCi0JfSwKLQl7Ci0JICAgICAgICBQQ0lWRU5ET1JfTkRDLCBQQ0lERVZJQ0VfTkNQMTMwX1BMWCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIk5EQyBOZXRibGFzdGVyIElJIFBDSShQTFgpIgotCX0sCi0JewotCSAgICAgICAgUENJVkVORE9SX05EQywgUENJREVWSUNFX05DUDEzMF9BU0lDLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiTkRDIE5ldGJsYXN0ZXIgSUkgUENJKFRNQzcxNjApIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfM0NPTSwgUENJREVWSUNFX0FJUkNPTk5FQ1QsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSIzQ29tIEFpckNvbm5lY3QgUENJIDgwMi4xMWIgMTFNYi9zIFdMQU4gQ29udHJvbGxlciIKLQl9LAotCXsKLQkJMCwgMCwgMCwgMCwgMCwgMCwgMAotCX0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwbHhfaWRfdGJsKTsKLQotLyogRnVuY3Rpb24gZGVjbGFyZWQgaGVyZSBiZWNhdXNlIG9mIHB0ciByZWZlcmVuY2UgYmVsb3cgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHByaXNtMnN0YV9wcm9iZV9wbHgoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwcmlzbTJzdGFfcmVtb3ZlX3BseChzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwcmlzbTJfcGx4X2Rydl9pZCA9IHsKLSAgICAgICAgLm5hbWUgPSAicHJpc20yX3BseCIsCi0gICAgICAgIC5pZF90YWJsZSA9IHBseF9pZF90YmwsCi0gICAgICAgIC5wcm9iZSA9IHByaXNtMnN0YV9wcm9iZV9wbHgsCi0gICAgICAgIC5yZW1vdmUgPSBwcmlzbTJzdGFfcmVtb3ZlX3BseCwKLSNpZmRlZiBDT05GSUdfUE0KLSAgICAgICAgLnN1c3BlbmQgPSBwcmlzbTJzdGFfc3VzcGVuZF9wY2ksCi0gICAgICAgIC5yZXN1bWUgPSBwcmlzbTJzdGFfcmVzdW1lX3BjaSwKLSNlbmRpZgotfTsKLQotI2lmZGVmIE1PRFVMRQotCi1zdGF0aWMgaW50IF9faW5pdCBwcmlzbTJwbHhfaW5pdCh2b2lkKQotewotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoIiVzIExvYWRlZFxuIiwgdmVyc2lvbik7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcHJpc20yX3BseF9kcnZfaWQpOwotfTsKLQotc3RhdGljIHZvaWQgX19leGl0IHByaXNtMnBseF9jbGVhbnVwKHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTJfcGx4X2Rydl9pZCk7Ci19OwotCi1tb2R1bGVfaW5pdChwcmlzbTJwbHhfaW5pdCk7Ci1tb2R1bGVfZXhpdChwcmlzbTJwbHhfY2xlYW51cCk7Ci0KLSNlbmRpZiAvLyBNT0RVTEUKLQotCi1pbnQgaGZhMzg0eF9jb3JlcmVzZXQoaGZhMzg0eF90ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCi0jZGVmaW5lIENPUl9PRkZTRVQJMHgzZTAJLyogQ09SIGF0dHJpYnV0ZSBvZmZzZXQgb2YgUHJpc20yIFBDIGNhcmQgKi8KLSNkZWZpbmUgQ09SX1ZBTFVFCTB4NDEJLyogRW5hYmxlIFBDIGNhcmQgd2l0aCBpcnEgaW4gbGV2ZWwgdHJpZ2dlciAqLwotCi0jZGVmaW5lIEhDUl9PRkZTRVQJMHgzZTIJLyogSENSIGF0dHJpYnV0ZSBvZmZzZXQgb2YgUHJpc20yIFBDIGNhcmQgKi8KLQotCVVJTlQ4CQljb3JzYXZlOwotCURCRkVOVEVSOwotCi0JV0xBTl9MT0dfREVCVUcoMywgIkRvaW5nIHJlc2V0IHZpYSBkaXJlY3QgQ09SIGFjY2Vzcy5cbiIpOwotCi0JLyogQ29sbGVjdCBDT1IgKi8KLQljb3JzYXZlID0gcmVhZGIoaHctPm1lbWJhc2UgKyBDT1JfT0ZGU0VUKTsKLQkvKiBXcml0ZSByZXNldCBiaXQgKEJJVDcpICovCi0Jd3JpdGViKGNvcnNhdmUgfCBCSVQ3LCBody0+bWVtYmFzZSArIENPUl9PRkZTRVQpOwotCS8qIEhvbGQgZm9yIGhvbGR0aW1lICovCi0JbWRlbGF5KGhvbGR0aW1lKTsKLQotCWlmIChnZW5lc2lzKSB7Ci0JCXdyaXRlYihnZW5lc2lzLCBody0+bWVtYmFzZSArIEhDUl9PRkZTRVQpOwotCQkvKiBIb2xkIGZvciBob2xkdGltZSAqLwotCQltZGVsYXkoaG9sZHRpbWUpOwotCX0KLQotCS8qIENsZWFyIHJlc2V0IGJpdCAqLwotCXdyaXRlYihjb3JzYXZlICYgfkJJVDcsIGh3LT5tZW1iYXNlICsgQ09SX09GRlNFVCk7Ci0JLyogV2FpdCBmb3Igc2V0dGxldGltZSAqLwotCW1kZWxheShzZXR0bGV0aW1lKTsKLQkvKiBTZXQgbm9uLXJlc2V0IGJpdHMgYmFjayB3aGF0IHRoZXkgd2VyZSAqLwotCXdyaXRlYihjb3JzYXZlLCBody0+bWVtYmFzZSArIENPUl9PRkZTRVQpOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl91c2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1YmUyMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfdXNiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotI2RlZmluZSBXTEFOX0hPU1RJRiBXTEFOX1VTQgotI2luY2x1ZGUgImhmYTM4NHhfdXNiLmMiCi0jaW5jbHVkZSAicHJpc20ybWdtdC5jIgotI2luY2x1ZGUgInByaXNtMm1pYi5jIgotI2luY2x1ZGUgInByaXNtMnN0YS5jIgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLSNlcnJvciAicHJpc20yX3VzYiByZXF1aXJlcyBhdCBsZWFzdCBhIDIuNC54IGtlcm5lbCEiCi0jZW5kaWYKLQotI2RlZmluZSBQUklTTV9VU0JfREVWSUNFKHZpZCwgcGlkLCBuYW1lKSBcCi0gICAgICAgICAgIFVTQl9ERVZJQ0UodmlkLCBwaWQpLCAgXAotICAgICAgICAgICAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgbmFtZQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX3ByaXNtX3RibFtdID0gewotCXtQUklTTV9VU0JfREVWSUNFKDB4MDRiYiwgMHgwOTIyLCAiSU9EYXRhIEFpclBvcnQgV04tQjExL1VTQlMiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwN2FhLCAweDAwMTIsICJDb3JlZ2EgV2lyZWxlc3MgTEFOIFVTQiBTdGljay0xMSIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA5YWEsIDB4MzY0MiwgIlByaXNtMi54IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHgwNDA4LCAiQWN0aW9udGVjIFByaXNtMi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHgwNDIxLCAiQWN0aW9udGVjIFByaXNtMi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTkxNSwgMHgyMjM2LCAiTGlua3N5cyBXVVNCMTF2My4wIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDY2YiwgMHgyMjEyLCAiTGlua3N5cyBXVVNCMTF2Mi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDY2YiwgMHgyMjEzLCAiTGlua3N5cyBXVVNCMTJ2MS4xIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDY3YywgMHgxMDIyLCAiU2llbWVucyBTcGVlZFN0cmVhbSAxMDIyIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDQ5ZiwgMHgwMDMzLCAiQ29tcGFxL0ludGVsIFcxMDAgUFJPL1dpcmVsZXNzIDExTWJwcyBtdWx0aXBvcnQgV0xBTiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDQxMSwgMHgwMDE2LCAiTWVsY28gV0xJLVVTQi1TMTEgMTFNYnBzIFdMQU4gQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA4ZGUsIDB4N2EwMSwgIlBSSVNNMjUgSUVFRSA4MDIuMTEgTWluaSBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDgwODYsIDB4MTExMSwgIkludGVsIFBSTy9XaXJlbGVzcyAyMDExQiBMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwZDhlLCAweDdhMDEsICJQUklTTTI1IElFRUUgODAyLjExIE1pbmkgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDVlLCAweDAwNmUsICJNaWNyb3NvZnQgTU41MTAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwOTY3LCAweDAyMDQsICJBY2VyIFdhcnBsaW5rIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAyLCAiWi1Db20gNzI1LzcyNiBQcmlzbTIuNSBVU0IvVVNCIEludGVncmF0ZWQiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDUsICJaLUNvbSBYbDczNSBXaXJlbGVzcyA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4NDEzYywgMHg4MTAwLCAiRGVsbCBUcnVlTW9iaWxlIDExODAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MDEsICJBTExORVQgMDE5MyAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDBiM2IsIDB4MTYwMiwgIlp5WEVMIFp5QUlSIEIyMDAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYmFmLCAweDAwZWIsICJVU1JvYm90aWNzIFVTUjExMjAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwMjcsICJNZWxjbyBXTEktVVNCLUtTMTFHIDExTWJwcyBXTEFOIEFkYXB0ZXIiKX0sCi0gICAgICAgIHtQUklTTV9VU0JfREVWSUNFKDB4MDRmMSwgMHgzMDA5LCAiSlZDIE1QLVhQNzI1MCBCdWlsdGluIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwODQ2LCAweDQxMTAsICJOZXRHZWFyIE1BMTExIil9LAotICAgICAgICB7UFJJU01fVVNCX0RFVklDRSgweDAzZjMsIDB4MDAyMCwgIkFkYXB0ZWMgQVdOLTgwMjAgVVNCIFdMQU4gQWRhcHRlciIpfSwKLS8vCXtQUklTTV9VU0JfREVWSUNFKDB4MGFjZSwgMHgxMjAxLCAiWnlEQVMgWkQxMjAxIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MjgyMSwgMHgzMzAwLCAiQVNVUy1XTDE0MCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDIwMDEsIDB4MzcwMCwgIkRXTC0xMjIgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDM3MDIsICJEV0wtMTIwIFJldiBGIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4NTBjMiwgMHg0MDEzLCAiQXZlcmF0ZWMgVVNCIFdMQU4gQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDJjMDIsIDB4MTRlYSwgIlBsYW5leCBHVy1VUzExSCBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTI0YSwgMHgxNjhiLCAiQWlydmFzdCBQUklTTTMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA4M2EsIDB4MzUwMywgIlQtU2ludXMgMTExIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgyODIxLCAweDMzMDAsICJIYXdraW5nIEhpZ2hEQiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA0MTEsIDB4MDA0NCwgIk1lbGNvIFdMSS1VU0ItS0IxMSAxMU1icHMgV0xBTiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHg2MTA2LCAiUk9QRVggRnJlZUxhbiA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTI0YSwgMHg0MDE3LCAiUGhlZW5ldCBXTC01MDNJQSA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGJiMiwgMHgwMzAyLCAiQW1iaXQgTWljcm9zeXN0ZW1zIENvcnAuIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4OTAxNiwgMHgxODJkLCAiU2l0ZWNvbSBXTC0wMjIgODAyLjExYiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA1NDMsIDB4MGYwMSwgIlZpZXdTb25pYyBBaXJzeW5jIFVTQiBBZGFwdGVyIDExTWJwcyAoUHJpc20yLjUpIil9LAotCXsgLyogdGVybWluYXRvciAqLyB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX3ByaXNtX3RibCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfcHJvYmVfdXNiCi0qCi0qIFByb2JlIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtLgotKgotKiBBcmd1bWVudHM6Ci0qCWRldgkJcHRyIHRvIHRoZSB1c2JfZGV2aWNlIHN0cnVjdAotKglpZm51bQkJaW50ZXJmYWNlIG51bWJlciBiZWluZyBvZmZlcmVkCi0qCi0qIFJldHVybnM6Ci0qCU5VTEwJCS0gd2UncmUgbm90IGNsYWltaW5nIHRoZSBkZXZpY2UraW50ZXJmYWNlCi0qCW5vbi1OVUxMCS0gd2UgYXJlIGNsYWltaW5nIHRoZSBkZXZpY2UraW50ZXJmYWNlIGFuZAotKgkJCSAgdGhpcyBpcyBhIHB0ciB0byB0aGUgZGF0YSB3ZSB3YW50IGJhY2sKLSoJCQkgIHdoZW4gZGlzY29ubmVjdCBpcyBjYWxsZWQuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglJJ20gbm90IHN1cmUsIGFzc3VtZSBpdCdzIGludGVycnVwdC4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgKnByaXNtMnN0YV9wcm9iZV91c2IoCi0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKLQl1bnNpZ25lZCBpbnQgaWZudW0sCi0JY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQotI2Vsc2UKLXN0YXRpYyBpbnQgcHJpc20yc3RhX3Byb2JlX3VzYigKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAotCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLSNlbmRpZgotewotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOwotI2Vsc2UKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwotI2VuZGlmCi0KLQl3bGFuZGV2aWNlX3QJKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdAkqaHcgPSBOVUxMOwotCWludCAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLQotCURCRkVOVEVSOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQlpbnRlcmZhY2UgPSAmZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpZm51bV07Ci0jZWxzZQotCWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKLSNlbmRpZgotCi0KLQlpZiAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIGh3IGRhdGEgKi8KLQloZmEzODR4X2NyZWF0ZShodywgZGV2KTsKLQlody0+d2xhbmRldiA9IHdsYW5kZXY7Ci0KLQkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQotCSAqIGxpbnV4IG5ldGRldmljZS4KLQkgKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYoaW50ZXJmYWNlLT5kZXYpKTsKLSNlbmRpZgotICAgICAgICBpZiAoIHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotCi0JLyogRG8gYSBjaGlwLWxldmVsIHJlc2V0IG9uIHRoZSBNQUMgKi8KLQlpZiAocHJpc20yX2RvcmVzZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3JlcmVzZXQoaHcsCi0JCQkJcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCXByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAwKTsKLQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0JCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQkJcmVzdWx0ID0gLUVJTzsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSIlczogaGZhMzg0eF9jb3JlcmVzZXQoKSBmYWlsZWQuXG4iLAotCQkJCWRldl9pbmZvKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JfQotCi0jaWZuZGVmIE5FV19NT0RVTEVfQ09ERQotCXVzYl9pbmNfZGV2X3VzZShkZXYpOwotI2VuZGlmCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTUpKQotCXVzYl9nZXRfZGV2KGRldik7Ci0jZW5kaWYKLQotCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwotCi0JZ290byBkb25lOwotCi0gZmFpbGVkOgotCWlmICh3bGFuZGV2KQlrZnJlZSh3bGFuZGV2KTsKLQlpZiAoaHcpCQlrZnJlZShodyk7Ci0Jd2xhbmRldiA9IE5VTEw7Ci0KLSBkb25lOgotCURCRkVYSVQ7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCXJldHVybiB3bGFuZGV2OwotI2Vsc2UKLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgd2xhbmRldik7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbmRpZgotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfZGlzY29ubmVjdF91c2IKLSoKLSogQ2FsbGVkIHdoZW4gYSBkZXZpY2UgcHJldmlvdXNseSBjbGFpbWVkIGJ5IHByb2JlIGlzIHJlbW92ZWQKLSogZnJvbSB0aGUgVVNCLgotKgotKiBBcmd1bWVudHM6Ci0qCWRldgkJcHRyIHRvIHRoZSB1c2JfZGV2aWNlIHN0cnVjdAotKglwdHIJCXB0ciByZXR1cm5lZCBieSBwcm9iZSgpIHdoZW4gdGhlIGRldmljZQotKiAgICAgICAgICAgICAgICAgICAgICAgd2FzIGNsYWltZWQuCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQKLXByaXNtMnN0YV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB2b2lkICpwdHIpCi0jZWxzZQotc3RhdGljIHZvaWQKLXByaXNtMnN0YV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQotI2VuZGlmCi17Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0Jd2xhbmRldmljZV90CQkqd2xhbmRldjsKLSNlbHNlCi0Jd2xhbmRldmljZV90CQkqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QqKXB0cjsKLSNlbmRpZgotCi0gICAgICAgIERCRkVOVEVSOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotI2VuZGlmCi0KLQlpZiAoIHdsYW5kZXYgIT0gTlVMTCApIHsKLQkJTElTVF9IRUFEKGNsZWFubGlzdCk7Ci0JCXN0cnVjdCBsaXN0X2hlYWQJKmVudHJ5OwotCQlzdHJ1Y3QgbGlzdF9oZWFkCSp0ZW1wOwotCQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQkJaWYgKCFodykKLQkJCWdvdG8gZXhpdDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKLQotCQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEucmVhcGFibGUsICZjbGVhbmxpc3QpOwotCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEuY29tcGxldGluZywgJmNsZWFubGlzdCk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5wZW5kaW5nLCAmY2xlYW5saXN0KTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLmFjdGl2ZSwgJmNsZWFubGlzdCk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKLQotCQkvKiBUaGVyZSdzIG5vIGhhcmR3YXJlIHRvIHNodXRkb3duLCBidXQgdGhlIGRyaXZlcgotCQkgKiBtaWdodCBoYXZlIHNvbWUgdGFza3Mgb3IgdGFza2xldHMgdGhhdCBtdXN0IGJlCi0JCSAqIHN0b3BwZWQgYmVmb3JlIHdlIGNhbiB0ZWFyIGV2ZXJ5dGhpbmcgZG93bi4KLQkJICovCi0JCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQotCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+dGhyb3R0bGUpOwotCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+cmVxdGltZXIpOwotCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+cmVzcHRpbWVyKTsKLQotCQkvKiBVbmxpbmsgYWxsIHRoZSBVUkJzLiBUaGlzICJyZW1vdmVzIHRoZSB3aGVlbHMiCi0JCSAqIGZyb20gdGhlIGVudGlyZSBDVExYIGhhbmRsaW5nIG1lY2hhbmlzbS4KLQkJICovCi0JCXVzYl9raWxsX3VyYigmaHctPnJ4X3VyYik7Ci0JCXVzYl9raWxsX3VyYigmaHctPnR4X3VyYik7Ci0JCXVzYl9raWxsX3VyYigmaHctPmN0bHhfdXJiKTsKLQotCQl0YXNrbGV0X2tpbGwoJmh3LT5jb21wbGV0aW9uX2JoKTsKLQkJdGFza2xldF9raWxsKCZody0+cmVhcGVyX2JoKTsKLQotCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCi0JCS8qIE5vdyB3ZSBjb21wbGV0ZSBhbnkgb3V0c3RhbmRpbmcgY29tbWFuZHMKLQkJICogYW5kIHRlbGwgZXZlcnlvbmUgd2hvIGlzIHdhaXRpbmcgZm9yIHRoZWlyCi0JCSAqIHJlc3BvbnNlcyB0aGF0IHdlIGhhdmUgc2h1dCBkb3duLgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNsZWFubGlzdCkgewotCQkJaGZhMzg0eF91c2JjdGx4X3QJKmN0bHg7Ci0KLQkJCWN0bHggPSBsaXN0X2VudHJ5KGVudHJ5LCBoZmEzODR4X3VzYmN0bHhfdCwgbGlzdCk7Ci0JCQljb21wbGV0ZSgmY3RseC0+ZG9uZSk7Ci0JCX0KLQotCQkvKiBHaXZlIGFueSBvdXRzdGFuZGluZyBzeW5jaHJvbm91cyBjb21tYW5kcwotCQkgKiBhIGNoYW5jZSB0byBjb21wbGV0ZS4gQWxsIHRoZXkgbmVlZCB0byBkbwotCQkgKiBpcyAid2FrZSB1cCIsIHNvIHRoYXQncyBlYXN5LgotCQkgKiAoSSdkIGxpa2UgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIHJlYWxseS4pCi0JCSAqLwotCQltc2xlZXAoMTAwKTsKLQotCQkvKiBOb3cgZGVsZXRlIHRoZSBDVExYcywgYmVjYXVzZSBuby1vbmUgZWxzZSBjYW4gbm93LiAqLwotCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRlbXAsICZjbGVhbmxpc3QpIHsKLQkJCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OwotCi0JCQljdGx4ID0gbGlzdF9lbnRyeShlbnRyeSwgaGZhMzg0eF91c2JjdGx4X3QsIGxpc3QpOwotCQkJa2ZyZWUoY3RseCk7Ci0JCX0KLQotCQkvKiBVbmhvb2sgdGhlIHdsYW5kZXYgKi8KLQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0KLSNpZm5kZWYgTkVXX01PRFVMRV9DT0RFCi0JCXVzYl9kZWNfZGV2X3VzZShody0+dXNiKTsKLSNlbmRpZgotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE1KSkKLQkJdXNiX3B1dF9kZXYoaHctPnVzYik7Ci0jZW5kaWYKLQotCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQlrZnJlZShodyk7Ci0KLQkJa2ZyZWUod2xhbmRldik7Ci0JfQotCi0gZXhpdDoKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLSNlbmRpZgotCURCRkVYSVQ7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHByaXNtMl91c2JfZHJpdmVyID0gewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMTkpKSAmJiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE2KSkKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLSNlbmRpZgotCS5uYW1lID0gInByaXNtMl91c2IiLAotCS5wcm9iZSA9IHByaXNtMnN0YV9wcm9iZV91c2IsCi0JLmRpc2Nvbm5lY3QgPSBwcmlzbTJzdGFfZGlzY29ubmVjdF91c2IsCi0JLmlkX3RhYmxlID0gdXNiX3ByaXNtX3RibCwKLQkvKiBmb3BzLCBtaW5vcj8gKi8KLX07Ci0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIGludCBfX2luaXQgcHJpc20ydXNiX2luaXQodm9pZCkKLXsKLSAgICAgICAgREJGRU5URVI7Ci0KLSAgICAgICAgV0xBTl9MT0dfTk9USUNFKCIlcyBMb2FkZWRcbiIsIHZlcnNpb24pOwotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoImRldl9pbmZvIGlzOiAlc1xuIiwgZGV2X2luZm8pOwotCi0JLyogVGhpcyBjYWxsIHdpbGwgcmVzdWx0IGluIGNhbGxzIHRvIHByaXNtMnN0YV9wcm9iZV91c2IuICovCi0JcmV0dXJuIHVzYl9yZWdpc3RlcigmcHJpc20yX3VzYl9kcml2ZXIpOwotCi0JREJGRVhJVDsKLX07Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwcmlzbTJ1c2JfY2xlYW51cCh2b2lkKQotewotICAgICAgICBEQkZFTlRFUjsKLQotCXVzYl9kZXJlZ2lzdGVyKCZwcmlzbTJfdXNiX2RyaXZlcik7Ci0KLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyBVbmxvYWRlZFxuIiwgdmVyc2lvbik7Ci0KLQlEQkZFWElUOwotfTsKLQotbW9kdWxlX2luaXQocHJpc20ydXNiX2luaXQpOwotbW9kdWxlX2V4aXQocHJpc20ydXNiX2NsZWFudXApOwotCi0jZW5kaWYgLy8gbW9kdWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKaW5kZXggYzk3NTAyNS4uZjE3MjdiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYwpAQCAtNjEsMTAgKzYxLDYgQEAKIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogI2RlZmluZSBXTEFOX0RCVkFSCXByaXNtMl9kZWJ1ZwogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTc5LDE5ICs3NSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2VuZGlmCi0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KLSNpbmNsdWRlIDxwY21jaWEvY3MuaD4KLSNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2RzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgotI2VuZGlmCiAKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCkBAIC0xMDksODkgKzkzLDEyIEBACiAjaW5jbHVkZSAiaGZhMzg0eC5oIgogI2luY2x1ZGUgInByaXNtMm1nbXQuaCIKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIENvbnN0YW50cyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBNYWNyb3MgKi8KLQogLyogQ29udmVydHMgODAyLjExIGZvcm1hdCByYXRlIHNwZWNpZmljYXRpb25zIHRvIHByaXNtMiAqLwogI2RlZmluZSBwODAyMTFyYXRlX3RvX3AyYml0KG4pCSgoKChuKSZ+QklUNykgPT0gMikgPyBCSVQwIDogXAogCQkJCSAoKChuKSZ+QklUNykgPT0gNCkgPyBCSVQxIDogXAogCQkJCSAoKChuKSZ+QklUNykgPT0gMTEpID8gQklUMiA6IFwKIAkJCQkgKCgobikmfkJJVDcpID09IDIyKSA/IEJJVDMgOiAwKQogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgVHlwZXMgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3Bvd2VybWdtdAotKgotKiBTZXQgdGhlIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgb2YgdGhpcyBzdGF0aW9uJ3MgTUFDLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcG93ZXJtZ210KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX3Bvd2VybWdtdF90CSptc2cgPSBtc2dwOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyoKLQkJICogU2V0IENORlBNRU5BQkxFRCAob24gb3Igb2ZmKQotCQkgKiBTZXQgQ05GTVVMVElDQVNUUlggKGlmIFBNIG9uLCBvdGhlcndpc2UgY2xlYXIpCi0JCSAqIFNwb3V0IGEgbm90aWNlIHN0YXRpbmcgdGhhdCBTbGVlcER1cmF0aW9uIGFuZAotCQkgKiBIb2xkb3ZlckR1cmF0aW9uIGFuZCBQTUVQUyBhbHNvIGhhdmUgYW4gaW1wYWN0LgotCQkgKi8KLQkJLyogUG93ZXJtZ210IGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmb3IgU1RBICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogUG93ZXJtZ210IGlzIG5ldmVyIHN1cHBvcnRlZCBmb3IgQVAgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1nbXRfc2NhbgogKgpAQCAtMjIxLDcgKzEyOCw3IEBACiAJaW50IAkJCXJlc3VsdCA9IDA7CiAJaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwogCXA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3QJKm1zZyA9IG1zZ3A7Ci0gICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIHJvYW1pbmdtb2RlLCB3b3JkOworICAgICAgICB1MTYgICAgICAgICAgICAgICAgICByb2FtaW5nbW9kZSwgd29yZDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBpLCB0aW1lb3V0OwogCWludCAgICAgICAgICAgICAgICAgICAgIGlzdG1wZW5hYmxlID0gMDsKIApAQCAtMjI5LDEzICsxMzYsNiBAQAogCiAJREJGRU5URVI7CiAKLSAgICAgICAgaWYgKGh3LT5hcCkgewotICAgICAgICAgICAgICAgIFdMQU5fTE9HX0VSUk9SKCJQcmlzbTIgaW4gQVAgbW9kZSBjYW5ub3QgcGVyZm9ybSBzY2Fucy5cbiIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLSAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLQogICAgICAgICAvKiBnYXRla2VlcGVyIGNoZWNrICovCiAgICAgICAgIGlmIChIRkEzODR4X0ZJUk1XQVJFX1ZFUlNJT04oaHctPmlkZW50X3N0YV9mdy5tYWpvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLApAQCAtMjk2LDcgKzE5Niw3IEBACiAgICAgICAgIC8qIHNldCB1cCB0aGUgY2hhbm5lbCBsaXN0ICovCiAgICAgICAgIHdvcmQgPSAwOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLT5jaGFubmVsbGlzdC5kYXRhLmxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVUlOVDggY2hhbm5lbCA9IG1zZy0+Y2hhbm5lbGxpc3QuZGF0YS5kYXRhW2ldOworICAgICAgICAgICAgICAgIHU4IGNoYW5uZWwgPSBtc2ctPmNoYW5uZWxsaXN0LmRhdGEuZGF0YVtpXTsKICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCA+IDE0KSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIDEgaXMgQklUMCAuLi4gY2hhbm5lbCAxNCBpcyBCSVQxMyAqLwogICAgICAgICAgICAgICAgIHdvcmQgfD0gKDEgPDwgKGNoYW5uZWwtMSkpOwpAQCAtMzE3LDcgKzIxNyw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAJaWYgKHdvcmQgPT0gSEZBMzg0eF9QT1JUU1RBVFVTX0RJU0FCTEVEKSB7Ci0JCVVJTlQxNiB3b3JkYnVmWzE3XTsKKwkJdTE2IHdvcmRidWZbMTddOwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKIAkJCUhGQTM4NHhfUklEX0NORlJPQU1JTkdNT0RFLApAQCAtNDgwLDEyICszODAsNiBAQAogCiAJcmVxLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKIAotCWlmIChody0+YXApIHsKLQkJcmVzdWx0ID0gMTsKLQkJcmVxLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJZ290byBleGl0OwotCX0KLQogCWlmICghIGh3LT5zY2FucmVzdWx0cykgewogCQlXTEFOX0xPR19FUlJPUigiZG90MTFyZXFfc2Nhbl9yZXN1bHRzIGNhbiBvbmx5IGJlIHVzZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRvdDExcmVxX3NjYW4uXG4iKTsKIAkJcmVzdWx0ID0gMjsKQEAgLTYxMiw1NjcgKzUwNiw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9qb2luCi0qCi0qIEpvaW4gYSBCU1Mgd2hvc2UgQlNTIGRlc2NyaXB0aW9uIHdhcyBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGgKLSogYSBzY2FuLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9qb2luX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogSW1wbGVtZW50IGFmdGVyIHNjYW4gKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgYnkgQVBzICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3AyX2pvaW4KLSoKLSogSm9pbiBhIHNwZWNpZmljIEJTUwotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcDJfam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9qb2luX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDE2CQkJcmVnOwotCXA4MDIxMXBzdHJkX3QJCSpwc3RyOwotCVVJTlQ4CQkJYnl0ZWJ1ZlsyNTZdOwotCWhmYTM4NHhfYnl0ZXN0cl90CSpwMmJ5dGVzdHIgPSAoaGZhMzg0eF9ieXRlc3RyX3QqKWJ5dGVidWY7Ci0gICAgICAgIGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90CWpvaW5yZXE7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfTk9ORTsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCQkvKiBTZXQgdGhlIFBvcnRUeXBlICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLQkJLyogZXNzIHBvcnQgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZQT1JUVFlQRSwgMSk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgUG9ydCBUeXBlXG4iKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBhdXRoIHR5cGUgKi8KLQkJaWYgKCBtc2ctPmF1dGh0eXBlLmRhdGEgPT0gUDgwMjExRU5VTV9hdXRoYWxnX3NoYXJlZGtleSApIHsKLQkJCXJlZyA9IEhGQTM4NHhfQ05GQVVUSEVOVElDQVRJT05fU0hBUkVES0VZOwotCQl9IGVsc2UgewotCQkJcmVnID0gSEZBMzg0eF9DTkZBVVRIRU5USUNBVElPTl9PUEVOU1lTVEVNOwotCQl9Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04sIHJlZyk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgQXV0aGVudGljYXRpb25cbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBUdXJuIG9mZiBhbGwgcm9hbWluZyAqLwotCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlJPQU1JTkdNT0RFLCAzKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIFR1cm4gb2ZmIFJvYW1pbmdcbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBCYXNpYyByYXRlcyAqLwotICAgICAgICAgICAgICAgIHJlZyA9IDA7Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUxLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgPSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlMS5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlMi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUyLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUzLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTMuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTQuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNC5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU1LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU2LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTYuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTcuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlOC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU4LmRhdGEpOwotCQl9Ci0JCWlmKCByZWcgPT0gMCkKLQkJCSByZWcgPSAweDAzOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkJBU0lDUkFURVMsIHJlZyk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgYmFzaWNyYXRlcz0lZC5cbiIsIHJlZyk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIE9wZXJhdGlvbmFsIHJhdGVzIChzdXBwcmF0ZXMgYW5kIHR4cmF0ZWNvbnRyb2wpICovCi0JCXJlZyA9IDA7Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUxLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgPSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlMS5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlMi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUyLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUzLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTMuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTQuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNC5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU1LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU2LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTYuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTcuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlOC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU4LmRhdGEpOwotCQl9Ci0JCWlmKCByZWcgPT0gMCkKLQkJCSByZWcgPSAweDBmOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlNVUFBSQVRFUywgcmVnKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBzdXBwcmF0ZXM9JWQuXG4iLCByZWcpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotIAkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCByZWcpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHR4cmF0ZXM9JWQuXG4iLCByZWcpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBTZXQgdGhlIHNzaWQgKi8KLQkJbWVtc2V0KGJ5dGVidWYsIDAsIDI1Nik7Ci0JCXBzdHIgPSAocDgwMjExcHN0cmRfdCopJihtc2ctPnNzaWQuZGF0YSk7Ci0JCXByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHAyYnl0ZXN0ciwgcHN0cik7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoCi0JCQlodywgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsCi0JCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4pOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IFNTSURcbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBFbmFibGUgdGhlIFBvcnQgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9jbWRfZW5hYmxlKGh3LCAwKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRW5hYmxlIG1hY3BvcnQgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBGaWxsIGluIHRoZSBqb2luIHJlcXVlc3QgKi8KLQkJam9pbnJlcS5jaGFubmVsID0gbXNnLT5jaGFubmVsLmRhdGE7Ci0JCW1lbWNweSggam9pbnJlcS5ic3NpZCwgKCh1bnNpZ25lZCBjaGFyICopICZtc2ctPmJzc2lkLmRhdGEpICsgMSwgV0xBTl9CU1NJRF9MRU4pOwotCQlody0+am9pbnJlcSA9IGpvaW5yZXE7Ci0JCWh3LT5qb2luX2FwID0gMTsKLQotCQkvKiBTZW5kIHRoZSBqb2luIHJlcXVlc3QgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyggaHcsCi0JCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVCwKLQkJCSZqb2lucmVxLCBIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4pOwotICAgICAgICAgICAgICAgIGlmKHJlc3VsdCAhPSAwKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiSm9pbiByZXF1ZXN0IGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgYnkgQVBzICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfQotCi0gICAgICAgIGdvdG8gZG9uZTsKLWZhaWxlZDoKLQlXTEFOX0xPR19ERUJVRygxLCAiRmFpbGVkIHRvIHNldCBhIGNvbmZpZyBvcHRpb24sIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbnZhbGlkX3BhcmFtZXRlcnM7Ci0KLWRvbmU6Ci0gICAgICAgIHJlc3VsdCA9IDA7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfYXV0aGVudGljYXRlCi0qCi0qIFN0YXRpb24gc2hvdWxkIGJlIGJlZ2luIGFuIGF1dGhlbnRpY2F0aW9uIGV4Y2hhbmdlLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfYXV0aGVudGljYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIFRPRE86IERlY2lkZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZGxlIHRoaXMgb25lIHcvIFByaXNtMiAqLwotCQkvKiAgICAgICBJdCBjb3VsZCBiZSBlbnRlcnRhaW5pbmcgc2luY2UgUHJpc20yIGRvZXNuJ3QgaGF2ZSAgKi8KLQkJLyogICAgICAgYW4gZXhwbGljaXQgd2F5IHRvIGNvbnRyb2wgdGhpcyAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIE5ldmVyIHN1cHBvcnRlZCBieSBBUHMgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZGVhdXRoZW50aWNhdGUKLSoKLSogU2VuZCBhIGRlYXV0aGVudGljYXRlIG5vdGlmaWNhdGlvbi4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2RlYXV0aGVudGljYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogRGVjaWRlIGhvdyB3ZSdyZSBnb2luZyB0byBoYW5kbGUgdGhpcyBvbmUgdy8gUHJpc20yICovCi0JCS8qICAgICAgIEl0IGNvdWxkIGJlIGVudGVydGFpbmluZyBzaW5jZSBQcmlzbTIgZG9lc24ndCBoYXZlICAqLwotCQkvKiAgICAgICBhbiBleHBsaWNpdCB3YXkgdG8gY29udHJvbCB0aGlzICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0JCWhmYTM4NHhfZHJ2cl9oYW5kb3ZlcihodywgbXNnLT5wZWVyc3RhYWRkcmVzcy5kYXRhLmRhdGEpOwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9hc3NvY2lhdGUKLSoKLSogQXNzb2NpYXRlIHdpdGggYW4gRVNTLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JcDgwMjExbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0jaWYgMAotCQkvKiBTZXQgdGhlIFR4UmF0ZXMgKi8KLQkJcmVnID0gMHgwMDBmOwotCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX1RYUkFURUNOVEwsIHJlZyk7Ci0jZW5kaWYKLQotCQkvKiBTZXQgdGhlIFBvcnRUeXBlICovCi0JCS8qIGVzcyBwb3J0ICovCi0JCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUsIDEpOwotCi0JCS8qIEVuYWJsZSB0aGUgUG9ydCAqLwotCQloZmEzODR4X2RydnJfZW5hYmxlKGh3LCAwKTsKLQotCQkvKiBTZXQgdGhlIHJlc3VsdGNvZGUgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIE5ldmVyIHN1cHBvcnRlZCBvbiBBUCAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9yZWFzc29jaWF0ZQotKgotKiBSZW5ldyBhc3NvY2lhdGlvbiBiZWNhdXNlIG9mIGEgQlNTIGNoYW5nZS4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3JlYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogTm90IHN1cHBvcnRlZCB5ZXQuLi5ub3Qgc3VyZSBob3cgd2UncmUgZ29pbmcgdG8gZG8gaXQgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgb24gQVAgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZGlzYXNzb2NpYXRlCi0qCi0qIFNlbmQgYSBkaXNhc3NvY2lhdGlvbiBub3RpZmljYXRpb24uCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9kaXNhc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogTm90IHN1cHBvcnRlZCB5ZXQuLi5ub3Qgc3VyZSBob3cgdG8gZG8gaXQgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQkJaGZhMzg0eF9kcnZyX2hhbmRvdmVyKGh3LCBtc2ctPnBlZXJzdGFhZGRyZXNzLmRhdGEuZGF0YSk7Ci0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3Jlc2V0Ci0qCi0qIFJlc2V0IHRoZSBNQUMgYW5kIE1TRC4gIFRoZSBwODAyMTEgbGF5ZXIgaGFzIGl0J3Mgb3duIGhhbmRsaW5nCi0qIHRoYXQgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFuZCBhZnRlciB0aGlzIGZ1bmN0aW9uLgotKiBQcm9jZWR1cmU6Ci0qICAgLSBkaXNhYmxlIHN5c3RlbSBpbnRlcnJ1cHRzID8/Ci0qICAgLSBkaXNhYmxlIE1BQyBpbnRlcnJ1cHRzCi0qICAgLSByZXN0b3JlIHN5c3RlbSBpbnRlcnJ1cHRzCi0qICAgLSBpc3N1ZSB0aGUgTUFDIGluaXRpYWxpemUgY29tbWFuZAotKiAgIC0gY2xlYXIgYW55IE1TRCBsZXZlbCBzdGF0ZSAoaW5jbHVkaW5nIHRpbWVycywgcXVldWVkIGV2ZW50cywKLSogICAgIGV0Yy4pLiAgTm90ZSB0aGF0IGlmIHdlJ3JlIHJlbW92aW5nIHRpbWVyJ2QvcXVldWUgZXZlbnRzLCB3ZSBtYXkKLSogICAgIG5lZWQgdG8gaGF2ZSByZW1haW5lZCBpbiB0aGUgc3lzdGVtIGludGVycnVwdCBkaXNhYmxlZCBzdGF0ZS4KLSogICAgIFdlIHNob3VsZCBiZSBsZWZ0IGluIHRoZSBzYW1lIHN0YXRlIHRoYXQgd2UncmUgaW4gZm9sbG93aW5nCi0qICAgICBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyLCBNQVkgQkUgTlVMTCEgZm9yIGEgZHJpdmVyIGxvY2FsCi0qCQkJY2FsbC4KLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkLCBjb21tb25seSB3bGFuY3RsLCBidXQgbWlnaHQgYmUgcm1tb2QvcGNpX2Nsb3NlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yZXNldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9yZXNldF90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JLyoKLQkgKiBUaGlzIGlzIHN1cHBvcnRlZCBvbiBib3RoIEFQIGFuZCBTVEEgYW5kIGl0J3Mgbm90IGFsbG93ZWQKLQkgKiB0byBmYWlsLgotCSAqLwotCWlmICggbXNncCApIHsKLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQkJV0xBTl9MT0dfSU5GTygiZG90MTFyZXFfcmVzZXQ6IHRoZSBtYWNhZGRyZXNzIGFuZCAiCi0JCQkic2V0ZGVmYXVsdG1pYiBhcmd1bWVudHMgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZC5cbiIpOwotCX0KLQotCS8qCi0JICogSWYgd2UgZ290IHRoaXMgZmFyLCB0aGUgTVNEIG11c3QgYmUgaW4gdGhlIE1TRFJVTk5JTkcgc3RhdGUKLQkgKiB0aGVyZWZvcmUsIHdlIG11c3Qgc3RvcCBhbmQgdGhlbiByZXN0YXJ0IHRoZSBody9NQUMgY29tYm8uCi0JICovCi0JaGZhMzg0eF9kcnZyX3N0b3AoaHcpOwotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zdGFydChodyk7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJkb3QxMXJlcV9yZXNldDogSW5pdGlhbGl6ZSBjb21tYW5kIGZhaWxlZCwiCi0JCQkJIiBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuIGZyb20gaGVyZS5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X3N0YXJ0CiAqCkBAIC0xMTk5LDEwICs1MzIsOSBAQAogCXA4MDIxMW1zZ19kb3QxMXJlcV9zdGFydF90CSptc2cgPSBtc2dwOwogCiAJcDgwMjExcHN0cmRfdAkJKnBzdHI7Ci0JVUlOVDgJCQlieXRlYnVmWzgwXTsKKwl1OAkJCWJ5dGVidWZbODBdOwogCWhmYTM4NHhfYnl0ZXN0cl90CSpwMmJ5dGVzdHIgPSAoaGZhMzg0eF9ieXRlc3RyX3QqKWJ5dGVidWY7Ci0JaGZhMzg0eF9QQ0ZJbmZvX2RhdGFfdAkqcGNmaW5mbyA9IChoZmEzODR4X1BDRkluZm9fZGF0YV90KilieXRlYnVmOwotCVVJTlQxNgkJCXdvcmQ7CisJdTE2CQkJd29yZDsKIAlEQkZFTlRFUjsKIAogCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfTk9ORTsKQEAgLTEyMTAsMTcwICs1NDIsNDUgQEAKIAkvKiBTZXQgdGhlIFNTSUQgKi8KIAltZW1jcHkoJndsYW5kZXYtPnNzaWQsICZtc2ctPnNzaWQuZGF0YSwgc2l6ZW9mKG1zZy0+c3NpZC5kYXRhKSk7CiAKLQlpZiAoIWh3LT5hcCkgewotCQkvKioqIEFESE9DIElCU1MgKioqLwotCQkvKiBzZWUgaWYgY3VycmVudCBmL3cgaXMgbGVzcyB0aGFuIDhjMyAqLwotCQlpZiAoSEZBMzg0eF9GSVJNV0FSRV9WRVJTSU9OKGh3LT5pZGVudF9zdGFfZncubWFqb3IsCi0JCQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwKLQkJCQkJICAgICBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpIDwKLQkJICAgIEhGQTM4NHhfRklSTVdBUkVfVkVSU0lPTigwLDgsMykpIHsKLQkJCS8qIEFkLUhvYyBub3QgcXVpdGUgc3VwcG9ydGVkIG9uIFByaXNtMiAqLwotCQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotICAJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQkJLyogU2V0IHRoZSBSRVFVSVJFRCBjb25maWcgaXRlbXMgKi8KLQkJLyogU1NJRCAqLwotCQlwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSYobXNnLT5zc2lkLmRhdGEpOwotCQlwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihwMmJ5dGVzdHIsIHBzdHIpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ05GT1dOU1NJRCwKLQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTik7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgQ25mT3duU1NJRFxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsCi0JCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBDbmZEZXNpcmVkU1NJRFxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIGJzc3R5cGUgLSB3ZSB1c2UgdGhlIGRlZmF1bHQgaW4gdGhlIGFwIGZpcm13YXJlICovCi0JCS8qIElCU1MgcG9ydCAqLwotCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlBPUlRUWVBFLCAwKTsKLQotCQkvKiBiZWFjb24gcGVyaW9kICovCi0JCXdvcmQgPSBtc2ctPmJlYWNvbnBlcmlvZC5kYXRhOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkFQQkNOSU5ULCB3b3JkKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBiZWFjb24gcGVyaW9kPSVkLlxuIiwgd29yZCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIGRzY2hhbm5lbCAqLwotCQl3b3JkID0gbXNnLT5kc2NoYW5uZWwuZGF0YTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMLCB3b3JkKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBjaGFubmVsPSVkLlxuIiwgd29yZCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQkvKiBCYXNpYyByYXRlcyAqLwotCQl3b3JkID0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTEuZGF0YSk7Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUyLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUyLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUzLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUzLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU0LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU0LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU1LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU1LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU2LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU2LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU3LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU3LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU4LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU4LmRhdGEpOwotCQl9Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUywgd29yZCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgYmFzaWNyYXRlcz0lZC5cbiIsIHdvcmQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBPcGVyYXRpb25hbCByYXRlcyAoc3VwcHJhdGVzIGFuZCB0eHJhdGVjb250cm9sKSAqLwotCQl3b3JkID0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTEuZGF0YSk7Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUyLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUyLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUzLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUzLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU0LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU0LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU1LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU1LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU2LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU2LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU3LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU3LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU4LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU4LmRhdGEpOwotCQl9Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GU1VQUFJBVEVTLCB3b3JkKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBzdXBwcmF0ZXM9JWQuXG4iLCB3b3JkKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLSAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfVFhSQVRFQ05UTCwgd29yZCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgdHhyYXRlcz0lZC5cbiIsIHdvcmQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBTZXQgdGhlIG1hY21vZGUgc28gdGhlIGZyYW1lIHNldHVwIGNvZGUga25vd3Mgd2hhdCB0byBkbyAqLwotCQlpZiAoIG1zZy0+YnNzdHlwZS5kYXRhID09IFA4MDIxMUVOVU1fYnNzdHlwZV9pbmRlcGVuZGVudCApIHsKLQkJCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfSUJTU19TVEE7Ci0JCQkvKiBsZXRzIGV4dGVuZCB0aGUgZGF0YSBsZW5ndGggYSBiaXQgKi8KLQkJCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTiwgMjMwNCk7Ci0JCX0KLQotCQkvKiBFbmFibGUgdGhlIFBvcnQgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2VuYWJsZShodywgMCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkVuYWJsZSBtYWNwb3J0IGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQorCS8qKiogQURIT0MgSUJTUyAqKiovCisJLyogc2VlIGlmIGN1cnJlbnQgZi93IGlzIGxlc3MgdGhhbiA4YzMgKi8KKwlpZiAoSEZBMzg0eF9GSVJNV0FSRV9WRVJTSU9OKGh3LT5pZGVudF9zdGFfZncubWFqb3IsCisJCQkJICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLAorCQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KSA8CisJICAgIEhGQTM4NHhfRklSTVdBUkVfVkVSU0lPTigwLDgsMykpIHsKKwkJLyogQWQtSG9jIG5vdCBxdWl0ZSBzdXBwb3J0ZWQgb24gUHJpc20yICovCisJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CisJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KIAltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwogCi0JLyogVmFsaWRhdGUgdGhlIGNvbW1hbmQsIGlmIEJTU3R5cGU9aW5mcmEgaXMgdGhlIHRlcnRpYXJ5IGxvYWRlZD8gKi8KLQlpZiAoIG1zZy0+YnNzdHlwZS5kYXRhID09IFA4MDIxMUVOVU1fYnNzdHlwZV9pbmRlcGVuZGVudCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkFQIGRyaXZlciBjYW5ub3QgY3JlYXRlIElCU1MuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfSBlbHNlIGlmICggaHctPmNhcF9zdXBfc3RhLmlkICE9IDUpIHsKLQkJV0xBTl9MT0dfRVJST1IoIkFQIGRyaXZlciBmYWlsZWQgdG8gZGV0ZWN0IEFQIGZpcm13YXJlLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQorCS8qKiogU1RBVElPTiAqKiovCiAJLyogU2V0IHRoZSBSRVFVSVJFRCBjb25maWcgaXRlbXMgKi8KIAkvKiBTU0lEICovCiAJcHN0ciA9IChwODAyMTFwc3RyZF90KikmKG1zZy0+c3NpZC5kYXRhKTsKIAlwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihwMmJ5dGVzdHIsIHBzdHIpOwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoIGh3LCBIRkEzODR4X1JJRF9DTkZPV05TU0lELAotCQkJCWJ5dGVidWYsIEhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOKTsKKwkJCQkJIGJ5dGVidWYsIEhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOKTsKIAlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgU1NJRCwgcmVzdWx0PTB4JTA0eFxuIiwgcmVzdWx0KTsKKwkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgQ25mT3duU1NJRFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsCisJCQkJCSBieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4pOworCWlmICggcmVzdWx0ICkgeworCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBDbmZEZXNpcmVkU1NJRFxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCS8qIGJzc3R5cGUgLSB3ZSB1c2UgdGhlIGRlZmF1bHQgaW4gdGhlIGFwIGZpcm13YXJlICovCisJLyogSUJTUyBwb3J0ICovCisJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZQT1JUVFlQRSwgMCk7CiAKIAkvKiBiZWFjb24gcGVyaW9kICovCiAJd29yZCA9IG1zZy0+YmVhY29ucGVyaW9kLmRhdGE7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZBUEJDTklOVCwgd29yZCk7CisJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZBUEJDTmludCwgd29yZCk7CiAJaWYgKCByZXN1bHQgKSB7CiAJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGJlYWNvbiBwZXJpb2Q9JWQuXG4iLCB3b3JkKTsKIAkJZ290byBmYWlsZWQ7CkBAIC0xNDQzLDk4ICs2NTAsMjAgQEAKIAkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgc3VwcHJhdGVzPSVkLlxuIiwgd29yZCk7CiAJCWdvdG8gZmFpbGVkOwogCX0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX1RYUkFURUNOVEwwLCB3b3JkKTsKKworCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfVFhSQVRFQ05UTCwgd29yZCk7CiAJaWYgKCByZXN1bHQgKSB7CiAJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHR4cmF0ZXM9JWQuXG4iLCB3b3JkKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JLyogaWJzc2F0aW13aW5kb3cgKi8KLQlpZiAobXNnLT5pYnNzYXRpbXdpbmRvdy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rKSB7Ci0JCVdMQU5fTE9HX0lORk8oInByaXNtMm1nbXRfc3RhcnQ6IGF0aW13aW5kb3cgbm90IHVzZWQgaW4gIgotCQkJICAgICAgICJJbmZyYXN0cnVjdHVyZSBtb2RlLCBpZ25vcmVkLlxuIik7Ci0JfQotCi0JLyogRFRJTSBwZXJpb2QgKi8KLQl3b3JkID0gbXNnLT5kdGltcGVyaW9kLmRhdGE7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSLCB3b3JkKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgZHRpbSBwZXJpb2Q9JWQuXG4iLCB3b3JkKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogcHJvYmVkZWxheSAqLwotCWlmIChtc2ctPnByb2JlZGVsYXkuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vaykgewotCQlXTEFOX0xPR19JTkZPKCJwcmlzbTJtZ210X3N0YXJ0OiBwcm9iZWRlbGF5IG5vdCAiCi0JCQkgICAgICAgInN1cHBvcnRlZCBpbiBwcmlzbTIsIGlnbm9yZWQuXG4iKTsKLQl9Ci0KLQkvKiBjZnBvbGxhYmxlLCBjZnBvbGxyZXEsIGNmcHBlcmlvZCwgY2ZwbWF4ZHVyYXRpb24gKi8KLQlpZiAobXNnLT5jZnBvbGxhYmxlLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlICYmCi0JICAgIG1zZy0+Y2Zwb2xscmVxLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlICkgewotCQlXTEFOX0xPR19FUlJPUigiY2Zwb2xsYWJsZT1jZnBvbGxyZXE9dHJ1ZSBpcyBpbGxlZ2FsLlxuIik7Ci0JCXJlc3VsdCA9IC0xOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiByZWFkIHRoZSBQQ0ZJbmZvIGFuZCB1cGRhdGUgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sCi0JCQkJCXBjZmluZm8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4pOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19JTkZPKCJwcmlzbTJtZ210X3N0YXJ0OiByZWFkKHBjZmluZm8pIGZhaWxlZCwgIgotCQkJCSJhc3N1bWUgaXQncyAiCi0JCQkJIm5vdCBzdXBwb3J0ZWQsIHBjZiBzZXR0aW5ncyBpZ25vcmVkLlxuIik7Ci0JCWdvdG8gcGNmX3NraXA7Ci0JfQotCWlmICgobXNnLT5jZnBvbGxhYmxlLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF9mYWxzZSAmJgotCSAgICAgbXNnLT5jZnBvbGxyZXEuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlKSApIHsKLQkgICAgCXBjZmluZm8tPk1lZGl1bU9jY3VwYW5jeUxpbWl0ID0gMDsKLQkJcGNmaW5mby0+Q0ZQUGVyaW9kID0gMDsKLQkJcGNmaW5mby0+Q0ZQTWF4RHVyYXRpb24gPSAwOwotCQlwY2ZpbmZvLT5DRlBGbGFncyAmPSBob3N0MmhmYTM4NHhfMTYoKFVJTlQxNil+QklUMCk7Ci0KLQkJaWYgKCBtc2ctPmNmcHBlcmlvZC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rIHx8Ci0JCSAgICAgbXNnLT5jZnBtYXhkdXJhdGlvbi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJV0xBTl9MT0dfV0FSTklORygKLQkJCQkiU2V0dGluZyBjZnBwZXJpb2Qgb3IgY2ZwbWF4ZHVyYXRpb24gd2hlbiAiCi0JCQkJImNmcG9sbGFibGUgYW5kIGNmcmVxIGFyZSBmYWxzZSBpcyBwb2ludGxlc3MuXG4iKTsKLQkJfQotCX0KLQlpZiAoKG1zZy0+Y2Zwb2xsYWJsZS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSB8fAotCSAgICAgbXNnLT5jZnBvbGxyZXEuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpICkgewotCQlpZiAoIG1zZy0+Y2Zwb2xsYWJsZS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkgewotCQkJcGNmaW5mby0+Q0ZQRmxhZ3MgfD0gaG9zdDJoZmEzODR4XzE2KChVSU5UMTYpQklUMCk7Ci0JCX0KLQotCQlpZiAoIG1zZy0+Y2ZwcGVyaW9kLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2spIHsKLQkJCXBjZmluZm8tPkNGUFBlcmlvZCA9IG1zZy0+Y2ZwcGVyaW9kLmRhdGE7Ci0JCQlwY2ZpbmZvLT5DRlBQZXJpb2QgPSBob3N0MmhmYTM4NHhfMTYocGNmaW5mby0+Q0ZQUGVyaW9kKTsKLQkJfQotCi0JCWlmICggbXNnLT5jZnBtYXhkdXJhdGlvbi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rKSB7Ci0JCQlwY2ZpbmZvLT5DRlBNYXhEdXJhdGlvbiA9IG1zZy0+Y2ZwbWF4ZHVyYXRpb24uZGF0YTsKLQkJCXBjZmluZm8tPkNGUE1heER1cmF0aW9uID0gaG9zdDJoZmEzODR4XzE2KHBjZmluZm8tPkNGUE1heER1cmF0aW9uKTsKLQkJCXBjZmluZm8tPk1lZGl1bU9jY3VwYW5jeUxpbWl0ID0gcGNmaW5mby0+Q0ZQTWF4RHVyYXRpb247Ci0JCX0KLQl9Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLAotCQkJCQlwY2ZpbmZvLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIndyaXRlKHBjZmluZm8pIGZhaWxlZC5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLXBjZl9za2lwOgogCS8qIFNldCB0aGUgbWFjbW9kZSBzbyB0aGUgZnJhbWUgc2V0dXAgY29kZSBrbm93cyB3aGF0IHRvIGRvICovCi0JaWYgKCBtc2ctPmJzc3R5cGUuZGF0YSA9PSBQODAyMTFFTlVNX2Jzc3R5cGVfaW5mcmFzdHJ1Y3R1cmUgKSB7Ci0JCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfRVNTX0FQOworCWlmICggbXNnLT5ic3N0eXBlLmRhdGEgPT0gUDgwMjExRU5VTV9ic3N0eXBlX2luZGVwZW5kZW50ICkgeworCQl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX0lCU1NfU1RBOwogCQkvKiBsZXRzIGV4dGVuZCB0aGUgZGF0YSBsZW5ndGggYSBiaXQgKi8KIAkJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOLCAyMzA0KTsKIAl9CiAKLQkvKiBTZXQgdGhlIEJTU0lEIHRvIHRoZSBzYW1lIGFzIG91ciBNQUMgKi8KLQltZW1jcHkoIHdsYW5kZXYtPmJzc2lkLCB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyLCBXTEFOX0JTU0lEX0xFTik7Ci0KIAkvKiBFbmFibGUgdGhlIFBvcnQgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZW5hYmxlKGh3LCAwKTsKIAlpZiAoIHJlc3VsdCApIHsKQEAgLTE1NTYsODAgKzY4NSw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9lbmFibGUKLSoKLSogU3RhcnQgYSBCU1MuICBBbnkgc3RhdGlvbiBjYW4gZG8gdGhpcyBmb3IgSUJTUywgb25seSBBUCBmb3IgRVNTLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfZW5hYmxlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfZW5hYmxlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogQWQtSG9jIG5vdCBxdWl0ZSBzdXBwb3J0ZWQgb24gUHJpc20yICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JLyogSXMgdGhlIHRlcnRpYXJ5IGxvYWRlZD8gKi8KLQlpZiAoIGh3LT5jYXBfc3VwX3N0YS5pZCAhPSA1KSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJBUCBkcml2ZXIgZmFpbGVkIHRvIGRldGVjdCBBUCBmaXJtd2FyZS5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBTZXQgdGhlIG1hY21vZGUgc28gdGhlIGZyYW1lIHNldHVwIGNvZGUga25vd3Mgd2hhdCB0byBkbyAqLwotCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfRVNTX0FQOwotCi0JLyogU2V0IHRoZSBCU1NJRCB0byB0aGUgc2FtZSBhcyBvdXIgTUFDICovCi0JbWVtY3B5KCB3bGFuZGV2LT5ic3NpZCwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkciwgV0xBTl9CU1NJRF9MRU4pOwotCi0JLyogRW5hYmxlIHRoZSBQb3J0ICovCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2VuYWJsZShodywgMCk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJFbmFibGUgbWFjcG9ydCBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLQlnb3RvIGRvbmU7Ci1mYWlsZWQ6Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW52YWxpZF9wYXJhbWV0ZXJzOwotCi1kb25lOgotCXJlc3VsdCA9IDA7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1nbXRfcmVhZHBkYQogKgpAQCAtMTY5Niw0MDIgKzc1MSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3JlYWRjaXMKLSoKLSogQ29sbGVjdCB0aGUgQ0lTIGRhdGEgYW5kIHB1dCBpdCBpbiB0aGUgbWVzc2FnZS4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcmVhZGNpcyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50CQkJcmVzdWx0OwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfcmVhZGNpc190CSptc2cgPSBtc2dwOwotCi0JREJGRU5URVI7Ci0KLSAgICAgICAgbWVtc2V0KG1zZy0+Y2lzLmRhdGEsIDAsIHNpemVvZihtc2ctPmNpcy5kYXRhKSk7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DSVMsCi0JCQkJCW1zZy0+Y2lzLmRhdGEsIEhGQTM4NHhfUklEX0NJU19MRU4pOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19JTkZPKCJwcmlzbTJtZ210X3JlYWRjaXM6IHJlYWQoY2lzKSBmYWlsZWQuXG4iKTsKLQkJbXNnLT5jaXMuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW1wbGVtZW50YXRpb25fZmFpbHVyZTsKLQotCQl9Ci0JZWxzZSB7Ci0JCW1zZy0+Y2lzLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQkJfQotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2F1eHBvcnRfc3RhdGUKLSoKLSogRW5hYmxlcy9EaXNhYmxlcyB0aGUgY2FyZCdzIGF1eGlsaWFyeSBwb3J0LiAgU2hvdWxkIGJlIGNhbGxlZAotKiBiZWZvcmUgYW5kIGFmdGVyIGEgc2VxdWVuY2Ugb2YgYXV4cG9ydF9yZWFkKCkvYXV4cG9ydF93cml0ZSgpCi0qIGNhbGxzLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF9zdGF0ZV90CSptc2cgPSBtc2dwOwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlEQkZFTlRFUjsKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JaWYgKG1zZy0+ZW5hYmxlLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKSB7Ci0JCWlmICggaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMCkgKSB7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwotCQl9IGVsc2UgewotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQkJfQotCX0gZWxzZSB7Ci0JCWhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGh3KTsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQl9Ci0KLSNlbHNlIC8qICFVU0IgKi8KLQlEQkZFTlRFUjsKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQotI2VuZGlmIC8qIFdMQU5fSE9TVElGICE9IFdMQU5fVVNCICovCi0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2F1eHBvcnRfcmVhZAotKgotKiBDb3BpZXMgZGF0YSBmcm9tIHRoZSBjYXJkIHVzaW5nIHRoZSBhdXhwb3J0LiAgVGhlIGF1eHBvcnQgbXVzdAotKiBoYXZlIHByZXZpb3VzbHkgYmVlbiBlbmFibGVkLiAgTm90ZTogdGhpcyBpcyBub3QgdGhlIHdheSB0bwotKiBkbyBkb3dubG9hZHMsIHNlZSB0aGUgW3JhbXxmbGFzaF1kbCBmdW5jdGlvbnMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2F1eHBvcnRfcmVhZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF9yZWFkX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDMyCQkJYWRkcjsKLQlVSU5UMzIJCQlsZW47Ci0JVUlOVDgqCQkJYnVmOwotCVVJTlQzMgkJCW1heGxlbiA9IHNpemVvZihtc2ctPmRhdGEuZGF0YSk7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIGh3LT5hdXhlbiApIHsKLQkJYWRkciA9IG1zZy0+YWRkci5kYXRhOwotCQlsZW4gPSBtc2ctPmxlbi5kYXRhOwotCQlidWYgPSBtc2ctPmRhdGEuZGF0YTsKLQkJaWYgKCBsZW4gPD0gbWF4bGVuICkgeyAgLyogbWF4IHJlYWQvd3JpdGUgc2l6ZSAqLwotCQkJaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LCBhZGRyLCBIRkEzODR4X0FVWF9DVExfRVhURFMsIGJ1ZiwgbGVuKTsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JCX0gZWxzZSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCJBdHRlbXB0IHRvIHJlYWQgPiBtYXhsZW4gZnJvbSBhdXhwb3J0LlxuIik7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9yZWZ1c2VkOwotCQl9Ci0KLQl9IGVsc2UgewotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9yZWZ1c2VkOwotCX0KLQltc2ctPmRhdGEuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotI2Vsc2UKLQlEQkZFTlRFUjsKLQotCVdMQU5fTE9HX0VSUk9SKCJwcmlzbTJtZ210X2F1eHBvcnRfcmVhZDogTm90IHN1cHBvcnRlZCBvbiBVU0IuXG4iKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9hdXhwb3J0X3dyaXRlCi0qCi0qIENvcGllcyBkYXRhIHRvIHRoZSBjYXJkIHVzaW5nIHRoZSBhdXhwb3J0LiAgVGhlIGF1eHBvcnQgbXVzdAotKiBoYXZlIHByZXZpb3VzbHkgYmVlbiBlbmFibGVkLiAgTm90ZTogdGhpcyBpcyBub3QgdGhlIHdheSB0bwotKiBkbyBkb3dubG9hZHMsIHNlZSB0aGUgW3JhbXxmbGFzaF1kbCBmdW5jdGlvbnMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2F1eHBvcnRfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfd3JpdGVfdAkqbXNnID0gbXNncDsKLQlVSU5UMzIJCQlhZGRyOwotCVVJTlQzMgkJCWxlbjsKLQlVSU5UOCoJCQlidWY7Ci0JVUlOVDMyCQkJbWF4bGVuID0gc2l6ZW9mKG1zZy0+ZGF0YS5kYXRhKTsKLQlEQkZFTlRFUjsKLQotCWlmICggaHctPmF1eGVuICkgewotCQlhZGRyID0gbXNnLT5hZGRyLmRhdGE7Ci0JCWxlbiA9IG1zZy0+bGVuLmRhdGE7Ci0JCWJ1ZiA9IG1zZy0+ZGF0YS5kYXRhOwotCQlpZiAoIGxlbiA8PSBtYXhsZW4gKSB7ICAvKiBtYXggcmVhZC93cml0ZSBzaXplICovCi0JCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCBhZGRyLCBIRkEzODR4X0FVWF9DVExfRVhURFMsIGJ1ZiwgbGVuKTsKLQkJfSBlbHNlIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsIkF0dGVtcHQgdG8gd3JpdGUgPiBtYXhsZW4gZnJvbSBhdXhwb3J0LlxuIik7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9yZWZ1c2VkOwotCQl9Ci0KLQl9IGVsc2UgewotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9yZWZ1c2VkOwotCX0KLQltc2ctPmRhdGEuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotI2Vsc2UKLQlEQkZFTlRFUjsKLQlXTEFOX0xPR19FUlJPUigicHJpc20ybWdtdF9hdXhwb3J0X3JlYWQ6IE5vdCBzdXBwb3J0ZWQgb24gVVNCLlxuIik7Ci0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLSNlbmRpZgotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9sb3dfbGV2ZWwKLSoKLSogUHV0cyB0aGUgY2FyZCBpbnRvIHRoZSBkZXNpcmVkIHRlc3QgbW9kZS4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICB3bGFuZGV2ICAgICAgICAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIG1zZ3AgICAgICAgICAgICBwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgICAgIHN1Y2Nlc3MgYW5kIGRvbmUKLSogICAgICAgPDAgICAgICBzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSogICAgICAgPjAgICAgICBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qICAgICAgIHByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfbG93X2xldmVsKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0gICAgICAgIHA4MDIxMW1zZ19wMnJlcV9sb3dfbGV2ZWxfdCAgICAgKm1zZyA9IG1zZ3A7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotICAgICAgICBEQkZFTlRFUjsKLQotICAgICAgICBtc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0gICAgICAgIC8qIGNhbGwgc29tZSByb3V0aW5lIHRvIGV4ZWN1dGUgdGhlIHRlc3QgY29tbWFuZCAqLwotCWNtZC5jbWQgPSAoVUlOVDE2KSBtc2ctPmNvbW1hbmQuZGF0YTsKLQljbWQucGFybTAgPSAoVUlOVDE2KSBtc2ctPnBhcmFtMC5kYXRhOwotCWNtZC5wYXJtMSA9IChVSU5UMTYpIG1zZy0+cGFyYW0xLmRhdGE7Ci0JY21kLnBhcm0yID0gKFVJTlQxNikgbXNnLT5wYXJhbTIuZGF0YTsKLQotICAgICAgICBoZmEzODR4X2RydnJfbG93X2xldmVsKGh3LCZjbWQpOwotCi0gICAgICAgIG1zZy0+cmVzcDAuZGF0YSA9IChVSU5UMzIpIGNtZC5yZXN1bHQucmVzcDA7Ci0gICAgICAgIG1zZy0+cmVzcDEuZGF0YSA9IChVSU5UMzIpIGNtZC5yZXN1bHQucmVzcDE7Ci0gICAgICAgIG1zZy0+cmVzcDIuZGF0YSA9IChVSU5UMzIpIGNtZC5yZXN1bHQucmVzcDI7Ci0KLSAgICAgICAgbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfdGVzdF9jb21tYW5kCi0qCi0qIFB1dHMgdGhlIGNhcmQgaW50byB0aGUgZGVzaXJlZCB0ZXN0IG1vZGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3Rlc3RfY29tbWFuZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfdAkqbXNnID0gbXNncDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLSAgICAgICAgREJGRU5URVI7Ci0KLQljbWQuY21kID0gKChVSU5UMTYpIG1zZy0+dGVzdGNvZGUuZGF0YSkgPDwgOCB8IDB4Mzg7Ci0JY21kLnBhcm0wID0gKFVJTlQxNikgbXNnLT50ZXN0cGFyYW0uZGF0YTsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLSAgICAgICAgLyogY2FsbCBzb21lIHJvdXRpbmUgdG8gZXhlY3V0ZSB0aGUgdGVzdCBjb21tYW5kICovCi0KLSAgICAgICAgaGZhMzg0eF9kcnZyX2xvd19sZXZlbChodywmY21kKTsKLQotICAgICAgICBtc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotICAgICAgICBtc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0gICAgICAgIG1zZy0+c3RhdHVzLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLSAgICAgICAgbXNnLT5zdGF0dXMuZGF0YSA9IGNtZC5yZXN1bHQuc3RhdHVzOwotICAgICAgICBtc2ctPnJlc3AwLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLSAgICAgICAgbXNnLT5yZXNwMC5kYXRhID0gY21kLnJlc3VsdC5yZXNwMDsKLSAgICAgICAgbXNnLT5yZXNwMS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0gICAgICAgIG1zZy0+cmVzcDEuZGF0YSA9IGNtZC5yZXN1bHQucmVzcDE7Ci0gICAgICAgIG1zZy0+cmVzcDIuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotICAgICAgICBtc2ctPnJlc3AyLmRhdGEgPSBjbWQucmVzdWx0LnJlc3AyOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9tbWlfcmVhZAotKgotKiBSZWFkIGZyb20gb25lIG9mIHRoZSBNTUkgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9tbWlfcmVhZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9tbWlfcmVhZF90CSptc2cgPSBtc2dwOwotCVVJTlQzMiByZXNwID0gMDsKLQotCURCRkVOVEVSOwotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCS8qIGNhbGwgc29tZSByb3V0aW5lIHRvIGV4ZWN1dGUgdGhlIHRlc3QgY29tbWFuZCAqLwotCi0JaGZhMzg0eF9kcnZyX21taV9yZWFkKGh3LCBtc2ctPmFkZHIuZGF0YSwgJnJlc3ApOwotCi0JLyogSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgImFyY2hpdGVjdHVyYWxseSIgY29ycmVjdCwgYnV0IGl0Ci0gICAgICAgICAgIGlzIGV4cGVkaWVudC4gKi8KLQotCW1zZy0+dmFsdWUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+dmFsdWUuZGF0YSA9IHJlc3A7Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X21taV93cml0ZQotKgotKiBXcml0ZSBhIGRhdGEgdmFsdWUgdG8gb25lIG9mIHRoZSBNTUkgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9tbWlfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfbW1pX3dyaXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JLyogY2FsbCBzb21lIHJvdXRpbmUgdG8gZXhlY3V0ZSB0aGUgdGVzdCBjb21tYW5kICovCi0KLQloZmEzODR4X2RydnJfbW1pX3dyaXRlKGh3LCBtc2ctPmFkZHIuZGF0YSwgbXNnLT5kYXRhLmRhdGEpOwotCi0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X3JhbWRsX3N0YXRlCiAqCiAqIEVzdGFibGlzaGVzIHRoZSBiZWdpbm5pbmcvZW5kIG9mIGEgY2FyZCBSQU0gZG93bmxvYWQgc2Vzc2lvbi4KQEAgLTIxNzksOSArODM4LDkgQEAKIHsKIAloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7CiAJcDgwMjExbXNnX3AycmVxX3JhbWRsX3dyaXRlX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDMyCQkJYWRkcjsKLQlVSU5UMzIJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUzMgkJCWFkZHI7CisJdTMyCQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlEQkZFTlRFUjsKIAogCWlmICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9GV0xPQUQpIHsKQEAgLTIzMTksOSArOTc4LDkgQEAKIHsKIAloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7CiAJcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfd3JpdGVfdAkqbXNnID0gbXNncDsKLQlVSU5UMzIJCQlhZGRyOwotCVVJTlQzMgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTMyCQkJYWRkcjsKKwl1MzIJCQlsZW47CisJdTgJCQkqYnVmOwogCURCRkVOVEVSOwogCiAJaWYgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX0ZXTE9BRCkgewpAQCAtMjM2MSwyNDcgKzEwMjAsNiBAQAogCXJldHVybiAwOwogfQogCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2R1bXBfc3RhdGUKLSoKLSogRHVtcHMgdGhlIGRyaXZlcidzIGFuZCBoYXJkd2FyZSdzIGN1cnJlbnQgc3RhdGUgdmlhIHRoZSBrZXJuZWwKLSogbG9nIGF0IEtFUk5fTk9USUNFIGxldmVsLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9kdW1wX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlwODAyMTFtc2dfcDJyZXFfZHVtcF9zdGF0ZV90CSptc2cgPSBtc2dwOwotCWludAkJCQlyZXN1bHQgPSAwOwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQkJYXV4YnVmWzE1XTsKLQlEQkZFTlRFUjsKLQotCVdMQU5fTE9HX05PVElDRSgicHJpc20yIGRyaXZlciBhbmQgaGFyZHdhcmUgc3RhdGU6XG4iKTsKLQlpZiAgKCAocmVzdWx0ID0gaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMCkpICkgewotCQlXTEFOX0xPR19FUlJPUigiYXV4X2VuYWJsZSBmYWlsZWQsIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywKLQkJMHgwMWUyLAotCQlIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCWF1eGJ1ZiwKLQkJc2l6ZW9mKGF1eGJ1ZikpOwotCWhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGh3KTsKLQlXTEFOX0xPR19OT1RJQ0UoIiAgY21hYzogRnJlZUJsb2Nrcz0lZFxuIiwgYXV4YnVmWzVdKTsKLQlXTEFOX0xPR19OT1RJQ0UoIiAgY21hYzogSW50RW49MHglMDJ4IEV2U3RhdD0weCUwMnhcbiIsCi0JCWhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0lOVEVOKSwKLQkJaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKSk7Ci0KLQkjaWZkZWYgVVNFX0ZJRF9TVEFDSwotCVdMQU5fTE9HX05PVElDRSgiICBkcnZyOiB0eGZpZF90b3A9JWQgc3RhY2tzaXplPSVkXG4iLAotCQlody0+dHhmaWRfdG9wLEhGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVgpOwotCSNlbHNlCi0JV0xBTl9MT0dfTk9USUNFKCIgIGRydnI6IHR4ZmlkX2hlYWQ9JWQgdHhmaWRfdGFpbD0lZCB0eGZpZF9OPSVkXG4iLAotCQlody0+dHhmaWRfaGVhZCwgaHctPnR4ZmlkX3RhaWwsIGh3LT50eGZpZF9OKTsKLQkjZW5kaWYKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotI2Vsc2UgLyogKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKSAqLwotCi0JREJGRU5URVI7Ci0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JZ290byBmYWlsZWQ7Ci0KLSNlbmRpZiAvKiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpICovCi0KLWZhaWxlZDoKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2NoYW5uZWxfaW5mbwotKgotKiBJc3N1ZXMgYSBDaGFubmVsSW5mb1JlcXVlc3QuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2NoYW5uZWxfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mb190CSptc2c9bXNncDsKLQloZmEzODR4X3QJCQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCWludAkJCQlyZXN1bHQsIGksIG49MDsKLQlVSU5UMTYJCQkJY2hhbm5lbF9tYXNrPTA7Ci0JaGZhMzg0eF9DaGFubmVsSW5mb1JlcXVlc3RfZGF0YV90CWNoaW5mb3JlcTsKLQkvLyB1bnNpZ25lZCBsb25nIAkJCW5vdzsKLQotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIE5vdCBzdXBwb3J0ZWQgaW4gU1RBIGYvdyAqLwotCQlQODAyMTFfU0VUX0lOVChtc2ctPnJlc3VsdGNvZGUsIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotI2RlZmluZSBDSElORk9fVElNRU9VVCAyCi0KLQlQODAyMTFfU0VUX0lOVChtc2ctPnJlc3VsdGNvZGUsIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzKTsKLQotCS8qIHNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgY2hhbm5lbGxpc3QgPSBhbGwgY2hhbm5lbHMgKi8KLQlpZiAoIW1zZy0+Y2hhbm5lbGxpc3QuZGF0YSkgewotCQlQODAyMTFfU0VUX0lOVChtc2ctPmNoYW5uZWxsaXN0LCAweDAwMDA3RkZFKTsKLQl9Ci0JLyogc2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciBjaGFubmVsZHdlbGx0aW1lID0gMTAwIG1zICovCi0JaWYgKCFtc2ctPmNoYW5uZWxkd2VsbHRpbWUuZGF0YSkgewotCQlQODAyMTFfU0VUX0lOVChtc2ctPmNoYW5uZWxkd2VsbHRpbWUsIDEwMCk7Ci0JfQotCWNoYW5uZWxfbWFzayA9IChVSU5UMTYpIChtc2ctPmNoYW5uZWxsaXN0LmRhdGEgPj4gMSk7Ci0JZm9yIChpPTAsIG49MDsgaSA8IDE0OyBpKyspIHsKLQkJaWYgKGNoYW5uZWxfbWFzayAmICgxPDxpKSkgewotCQkJbisrOwotCQl9Ci0JfQotCVA4MDIxMV9TRVRfSU5UKG1zZy0+bnVtY2hpbmZvLCBuKTsKLQljaGluZm9yZXEuY2hhbm5lbExpc3QgPSBob3N0MmhmYTM4NHhfMTYoY2hhbm5lbF9tYXNrKTsKLQljaGluZm9yZXEuY2hhbm5lbER3ZWxsVGltZSA9IGhvc3QyaGZhMzg0eF8xNihtc2ctPmNoYW5uZWxkd2VsbHRpbWUuZGF0YSk7Ci0KLQlhdG9taWNfc2V0KCZody0+Y2hhbm5lbF9pbmZvLmRvbmUsIDEpOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyggaHcsIEhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVCwKLQkJCQkJICZjaGluZm9yZXEsIEhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVF9MRU4pOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigic2V0Y29uZmlnKENIQU5ORUxJTkZPUkVRVUVTVCkgZmFpbGVkLiByZXN1bHQ9JWRcbiIsCi0JCQkJcmVzdWx0KTsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJZ290byBkb25lOwotCX0KLQkvKgotCW5vdyA9IGppZmZpZXM7Ci0Jd2hpbGUgKGF0b21pY19yZWFkKCZody0+Y2hhbm5lbF9pbmZvLmRvbmUpICE9IDEpIHsKLQkJaWYgKChqaWZmaWVzIC0gbm93KSA+IENISU5GT19USU1FT1VUKkhaKSB7Ci0JCQlXTEFOX0xPR19OT1RJQ0UoIkNoYW5uZWxJbmZvIHJlc3VsdHMgbm90IHJlY2VpdmVkIGluICVkIHNlY29uZHMsIGFib3J0aW5nLlxuIiwKLQkJCQkJQ0hJTkZPX1RJTUVPVVQpOwotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfdGltZW91dDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dChIWi80KTsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JfQotCSovCi0KLWRvbmU6Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9jaGFubmVsX2luZm9fcmVzdWx0cwotKgotKiBSZXR1cm5zIHJlcXVpcmVkIENoYW5uZWxJbmZvIHJlc3VsdC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvX3Jlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWhmYTM4NHhfdAkJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlwODAyMTFtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfdAkqbXNnPW1zZ3A7Ci0JaW50CQkJCXJlc3VsdD0wOwotCWludAkJY2hhbm5lbDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIE5vdCBzdXBwb3J0ZWQgaW4gU1RBIGYvdyAqLwotCQlQODAyMTFfU0VUX0lOVChtc2ctPnJlc3VsdGNvZGUsIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCXN3aXRjaCAoYXRvbWljX3JlYWQoJmh3LT5jaGFubmVsX2luZm8uZG9uZSkpIHsKLQljYXNlIDA6IG1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQlnb3RvIGRvbmU7Ci0JY2FzZSAxOiBtc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19pbmNvbXBsZXRlX2l0ZW1kYXRhOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JUDgwMjExX1NFVF9JTlQobXNnLT5yZXN1bHRjb2RlLCBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2Vzcyk7Ci0JY2hhbm5lbD1tc2ctPmNoYW5uZWwuZGF0YS0xOwotCi0JaWYgKGNoYW5uZWwgPCAwIHx8ICEgKGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5zY2FuY2hhbm5lbHMgJiAxPDxjaGFubmVsKSApIHsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW52YWxpZF9wYXJhbWV0ZXJzOwotCQlnb3RvIGRvbmU7Ci0JfQotCVdMQU5fTE9HX0RFQlVHKDIsICJjaGluZm9fcmVzdWx0czogY2hhbm5lbCAlZCwgYXZnL3BlYWsgbGV2ZWw9JWQvJWQgZEIsIGFjdGl2ZT0lZFxuIiwKLQkJCWNoYW5uZWwrMSwKLQkJCWh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0uYW5sLAotCQkJaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5wbmwsCi0JCQlody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLmFjdGl2ZQotCQkpOwotCVA4MDIxMV9TRVRfSU5UKG1zZy0+YXZnbm9pc2VsZXZlbCwgaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5hbmwpOwotCVA4MDIxMV9TRVRfSU5UKG1zZy0+cGVha25vaXNlbGV2ZWwsIGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0ucG5sKTsKLQlQODAyMTFfU0VUX0lOVChtc2ctPmJzc2FjdGl2ZSwgaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5hY3RpdmUgJgotCQlIRkEzODR4X0NISU5GT1JFU1VMVF9CU1NBQ1RJVkUKLSAgICAgICAgICAgICAgICA/IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZQotICAgICAgICAgICAgICAgIDogUDgwMjExRU5VTV90cnV0aF9mYWxzZSkgOwotCVA4MDIxMV9TRVRfSU5UKG1zZy0+cGNmYWN0aXZlLCBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLmFjdGl2ZSAmCi0JCUhGQTM4NHhfQ0hJTkZPUkVTVUxUX1BDRkFDVElWRQotICAgICAgICAgICAgICAgID8gUDgwMjExRU5VTV90cnV0aF90cnVlCi0gICAgICAgICAgICAgICAgOiBQODAyMTFFTlVNX3RydXRoX2ZhbHNlKSA7Ci0KLWRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X2F1dG9qb2luCiAqCkBAIC0yNjI1LDExICsxMDQzLDExIEBACiB7CiAJaGZhMzg0eF90CQkJKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgCQkJcmVzdWx0ID0gMDsKLQlVSU5UMTYJCQlyZWc7Ci0JVUlOVDE2CQkJcG9ydF90eXBlOworCXUxNgkJCXJlZzsKKwl1MTYJCQlwb3J0X3R5cGU7CiAJcDgwMjExbXNnX2xueHJlcV9hdXRvam9pbl90CSptc2cgPSBtc2dwOwogCXA4MDIxMXBzdHJkX3QJCSpwc3RyOwotCVVJTlQ4CQkJYnl0ZWJ1ZlsyNTZdOworCXU4CQkJYnl0ZWJ1ZlsyNTZdOwogCWhmYTM4NHhfYnl0ZXN0cl90CSpwMmJ5dGVzdHIgPSAoaGZhMzg0eF9ieXRlc3RyX3QqKWJ5dGVidWY7CiAJREJGRU5URVI7CiAKQEAgLTI2MzgsMTYgKzEwNTYsNiBAQAogCS8qIFNldCB0aGUgU1NJRCAqLwogCW1lbWNweSgmd2xhbmRldi0+c3NpZCwgJm1zZy0+c3NpZC5kYXRhLCBzaXplb2YobXNnLT5zc2lkLmRhdGEpKTsKIAotCWlmIChody0+YXApIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogTmV2ZXIgc3VwcG9ydGVkIG9uIEFQICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KIAkvKiBEaXNhYmxlIHRoZSBQb3J0ICovCiAJaGZhMzg0eF9kcnZyX2Rpc2FibGUoaHcsIDApOwogCkBAIC0yNjk5LDcgKzExMDcsNiBAQAogCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CiAJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKIAotZG9uZToKIAlEQkZFWElUOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0yNzMwLDcgKzExMzcsNyBAQAogCXA4MDIxMW1zZ19sbnhyZXFfd2xhbnNuaWZmX3QJKm1zZyA9IG1zZ3A7CiAKIAloZmEzODR4X3QJCQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCXdvcmQ7CisJdTE2CQkJd29yZDsKIAogCURCRkVOVEVSOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmgKaW5kZXggNzMzZmQ5OS4uY2FmODA4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuaApAQCAtNzMsMTAgKzczLDYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLS0tLSBTdGF0aWMgdmFyaWFibGUgZXh0ZXJucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotZXh0ZXJuIGludCAgICAgIHByaXNtMl9iYXBfdGltZW91dDsKLWV4dGVybiBpbnQJcHJpc20yX2lycV9ldnJlYWRfbWF4OwotI2VuZGlmCiBleHRlcm4gaW50CXByaXNtMl9kZWJ1ZzsKIGV4dGVybiBpbnQgICAgICBwcmlzbTJfcmVzZXRfaG9sZHRpbWU7CiBleHRlcm4gaW50ICAgICAgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWU7CkBAIC04NCw4ICs4MCw4IEBACiAvKi0tLSBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotVUlOVDMyCi1wcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQzMiBpZnN0YXRlKTsKK3UzMgorcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgaWZzdGF0ZSk7CiAKIHZvaWQKIHByaXNtMnN0YV9ldl9kdGltKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CkBAIC05NCw0NyArOTAsMjQgQEAKIHZvaWQKIHByaXNtMnN0YV9ldl9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwogdm9pZAotcHJpc20yc3RhX2V2X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IHN0YXR1cyk7CitwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKTsKIHZvaWQKLXByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiBzdGF0dXMpOworcHJpc20yc3RhX2V2X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IHN0YXR1cyk7CiB2b2lkCiBwcmlzbTJzdGFfZXZfcngod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQKIHByaXNtMnN0YV9ldl9hbGxvYyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwogCi0KIGludCBwcmlzbTJtZ210X21pYnNldF9taWJnZXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3Bvd2VybWdtdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfc2Nhbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfc2Nhbl9yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9wMl9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXRoZW50aWNhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2RlYXV0aGVudGljYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3JlYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9kaXNhc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3Jlc2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9zdGFydCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfd2xhbnNuaWZmKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9yZWFkcGRhKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9yZWFkY2lzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3JlYWQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2F1eHBvcnRfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2xvd19sZXZlbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfdGVzdF9jb21tYW5kKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9tbWlfcmVhZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfbW1pX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9yYW1kbF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfcmFtZGxfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X2ZsYXNoZGxfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X2ZsYXNoZGxfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X21tX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9kdW1wX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9lbmFibGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2NoYW5uZWxfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvX3Jlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X2F1dG9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDIsMzEgKzExNSwzMSBAQAogKiBQcmlzbTIgZGF0YSB0eXBlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIGJ5dGUgYXJlYSBjb252ZXJzaW9uIGZ1bmN0aW9ucyovCi12b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlYXJlYShVSU5UOCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwotdm9pZCBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIoVUlOVDggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyLCBpbnQgbGVuKTsKK3ZvaWQgcHJpc20ybWdtdF9wc3RyMmJ5dGVhcmVhKHU4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0cik7Cit2b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cih1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pOwogCiAvKiBieXRlIHN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucyovCiB2b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyKGhmYTM4NHhfYnl0ZXN0cl90ICpieXRlc3RyLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKIHZvaWQgcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIoaGZhMzg0eF9ieXRlc3RyX3QgKmJ5dGVzdHIsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwogCiAvKiBpbnRlZ2VyIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCi12b2lkIHByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludChVSU5UMTYgKnByaXNtMmludCwgVUlOVDMyICp3bGFuaW50KTsKLXZvaWQgcHJpc20ybWdtdF9wODAyMTFpbnQycHJpc20yaW50KFVJTlQxNiAqcHJpc20yaW50LCBVSU5UMzIgKndsYW5pbnQpOwordm9pZCBwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQodTE2ICpwcmlzbTJpbnQsIHUzMiAqd2xhbmludCk7Cit2b2lkIHByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludCh1MTYgKnByaXNtMmludCwgdTMyICp3bGFuaW50KTsKIAogLyogZW51bWVyYXRlZCBpbnRlZ2VyIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCi12b2lkIHByaXNtMm1nbXRfcHJpc20yZW51bTJwODAyMTFlbnVtKFVJTlQxNiAqcHJpc20yZW51bSwgVUlOVDMyICp3bGFuZW51bSwgVUlOVDE2IHJpZCk7Ci12b2lkIHByaXNtMm1nbXRfcDgwMjExZW51bTJwcmlzbTJlbnVtKFVJTlQxNiAqcHJpc20yZW51bSwgVUlOVDMyICp3bGFuZW51bSwgVUlOVDE2IHJpZCk7Cit2b2lkIHByaXNtMm1nbXRfcHJpc20yZW51bTJwODAyMTFlbnVtKHUxNiAqcHJpc20yZW51bSwgdTMyICp3bGFuZW51bSwgdTE2IHJpZCk7Cit2b2lkIHByaXNtMm1nbXRfcDgwMjExZW51bTJwcmlzbTJlbnVtKHUxNiAqcHJpc20yZW51bSwgdTMyICp3bGFuZW51bSwgdTE2IHJpZCk7CiAKIC8qIGZ1bmN0aW9ucyB0byBjb252ZXJ0IGEgYml0IGFyZWEgdG8vZnJvbSBhbiBPcGVyYXRpb25hbCBSYXRlIFNldCAqLwotdm9pZCBwcmlzbTJtZ210X2dldF9vcHJhdGVzZXQoVUlOVDE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKLXZvaWQgcHJpc20ybWdtdF9zZXRfb3ByYXRlc2V0KFVJTlQxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cik7Cit2b2lkIHByaXNtMm1nbXRfZ2V0X29wcmF0ZXNldCh1MTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwordm9pZCBwcmlzbTJtZ210X3NldF9vcHJhdGVzZXQodTE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKIAogLyogZnVuY3Rpb25zIHRvIGNvbnZlcnQgR3JvdXAgQWRkcmVzc2VzICovCi12b2lkIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIoVUlOVDMyIGRpZCwKK3ZvaWQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcih1MzIgZGlkLAogCXA4MDIxMXBzdHJkX3QgKnBzdHIsIGhmYTM4NHhfdCAqcHJpdiApOwotaW50IHByaXNtMm1nbXRfc2V0X2dycGFkZHIoVUlOVDMyIGRpZCwKLQlVSU5UOCAqcHJpc20yYnVmLCBwODAyMTFwc3RyZF90ICpwc3RyLCBoZmEzODR4X3QgKnByaXYgKTsKLWludCBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4KCBVSU5UMzIgZGlkICk7CitpbnQgcHJpc20ybWdtdF9zZXRfZ3JwYWRkcih1MzIgZGlkLAorCXU4ICpwcmlzbTJidWYsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGhmYTM4NHhfdCAqcHJpdiApOworaW50IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgoIHUzMiBkaWQgKTsKIAogdm9pZCBwcmlzbTJzdGFfcHJvY2Vzc2luZ19kZWZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtaWIuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCmluZGV4IGVhYzA2ZjcuLjUzOWM0NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCkBAIC01NCw5ICs1NCw2IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KICNkZWZpbmUgV0xBTl9EQlZBUglwcmlzbTJfZGVidWcKIAotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC02OSwyNiArNjYsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotCi0jaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKLQotLy8jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotLy8jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KLS8vI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgotLy8jaW5jbHVkZSA8cGNtY2lhL2NzLmg+Ci0vLyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+Ci0vLyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KLS8vI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KLS8vI2VuZGlmCi0vLwotLy8jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKSkKLS8vI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotLy8jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0vL2VuZGlmCi0KLS8vI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLS8vI2VuZGlmCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBQcm9qZWN0IEluY2x1ZGVzICovCkBAIC0xMTIsMTggKzkwLDE3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgVHlwZXMgKi8KIAotI2RlZmluZSAgRl9BUCAgICAgICAgIDB4MSAgICAgICAgLyogTUlCIGlzIHN1cHBvcnRlZCBvbiBBY2Nlc3MgUG9pbnRzLiAqLwotI2RlZmluZSAgRl9TVEEgICAgICAgIDB4MiAgICAgICAgLyogTUlCIGlzIHN1cHBvcnRlZCBvbiBzdGF0aW9ucy4gKi8KLSNkZWZpbmUgIEZfUkVBRCAgICAgICAweDQgICAgICAgIC8qIE1JQiBtYXkgYmUgcmVhZC4gKi8KLSNkZWZpbmUgIEZfV1JJVEUgICAgICAweDggICAgICAgIC8qIE1JQiBtYXkgYmUgd3JpdHRlbi4gKi8KKyNkZWZpbmUgIEZfU1RBICAgICAgICAweDEgICAgICAgIC8qIE1JQiBpcyBzdXBwb3J0ZWQgb24gc3RhdGlvbnMuICovCisjZGVmaW5lICBGX1JFQUQgICAgICAgMHgyICAgICAgICAvKiBNSUIgbWF5IGJlIHJlYWQuICovCisjZGVmaW5lICBGX1dSSVRFICAgICAgMHg0ICAgICAgICAvKiBNSUIgbWF5IGJlIHdyaXR0ZW4uICovCiAKIHR5cGVkZWYgc3RydWN0IG1pYnJlYwogewotICAgIFVJTlQzMiAgIGRpZDsKLSAgICBVSU5UMTYgICBmbGFnOwotICAgIFVJTlQxNiAgIHBhcm0xOwotICAgIFVJTlQxNiAgIHBhcm0yOwotICAgIFVJTlQxNiAgIHBhcm0zOworICAgIHUzMiAgIGRpZDsKKyAgICB1MTYgICBmbGFnOworICAgIHUxNiAgIHBhcm0xOworICAgIHUxNiAgIHBhcm0yOworICAgIHUxNiAgIHBhcm0zOwogICAgIGludCAgICAgICgqZnVuYykoc3RydWN0IG1pYnJlYyAgICAgICAgICAgICAgICAqbWliLAogICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKICAgICAgICAgICAgICAgICAgICAgIHdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCkBAIC0xMzUsMTQgKzExMiw2IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX2J5dGVzdHIycHN0cigKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQogc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cigKIG1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCkBAIC0xNTksMzggKzEyOCw2IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyYXJyYXkoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMm9mZnNldCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfdHJ1dGgoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3ByZWFtYmxlKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCiBzdGF0aWMgaW50IHByaXNtMm1pYl9mbGFnKAogbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAogaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKQEAgLTE5OSwyMiArMTM2LDYgQEAKIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9hcHBjZmluZm9mbGFnKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9yZWd1bGF0b3J5ZG9tYWlucygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQogc3RhdGljIGludCBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSgKIG1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCkBAIC0yMjMsMTQgKzE0NCw2IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIGludCBwcmlzbTJtaWJfcG93ZXJtYW5hZ2VtZW50KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCiBzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2YWN5aW52b2tlZCgKIG1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCkBAIC0yNTUsNDYgKzE2OCw2IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIGludCBwcmlzbTJtaWJfb3BlcmF0aW9uYWxyYXRlc2V0KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9ncm91cGFkZHJlc3MoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2Z3aWQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2F1dGhhbGcoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2F1dGhhbGdlbmFibGUoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KIHN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXYoCiBtaWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LApAQCAtMzAzLDQxNCArMTc2LDc4IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoCi1oZmEzODR4X3QgICAgICAqaHcsCi1wcmlzbTJzdGFfYXV0aGxpc3RfdCAgKmxpc3QpOwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hY2Nlc3Ntb2RlKAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotVUlOVDMyICAgICAgICAgICAgbW9kZSk7Ci0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2FjY2Vzc2FsbG93KAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotcDgwMjExbWFjYXJyYXlfdCAgKm1hY2FycmF5KTsKLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYWNjZXNzZGVueSgKLWhmYTM4NHhfdCAgICAgICAgICpodywKLXA4MDIxMW1hY2FycmF5X3QgICptYWNhcnJheSk7Ci0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2RlYXV0aGVudGljYXRlKAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotVUlOVDggICAgICAgICAgICAgKmFkZHIpOwotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCiAKIHN0YXRpYyBtaWJyZWNfdCBtaWJ0YWJbXSA9IHsKIAogICAgIC8qIGRvdDExc210IE1JQidzICovCi0KLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMVN0YXRpb25JRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIsIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFNZWRpdW1PY2N1cGFuY3lMaW1pdCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQ0ZQb2xsYWJsZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DRlBPTExBQkxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUNGUFBlcmlvZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDEsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQ0ZQTWF4RHVyYXRpb24sCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAyLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uUmVzcG9uc2VUaW1lT3V0LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBVVRIUlNQVElNRU9VVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BSSVZBQ1lPUFRJTVAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExUG93ZXJNYW5hZ2VtZW50TW9kZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVELCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wb3dlcm1hbmFnZW1lbnQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRTU0lELAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRCwgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRCU1NUeXBlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFPcGVyYXRpb25hbFJhdGVTZXQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX29wZXJhdGlvbmFscmF0ZXNldCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExT3BlcmF0aW9uYWxSYXRlU2V0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9vcGVyYXRpb25hbHJhdGVzZXQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUJlYWNvblBlcmlvZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUEJDTklOVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEVElNUGVyaW9kLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFBc3NvY2lhdGlvblJlc3BvbnNlVGltZU91dCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG0xLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtMiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZyB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGcgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG00LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICA0LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtNSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgNSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZyB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTYsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGcgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkxLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTIsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTIsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMywgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExUHJpdmFjeUludm9rZWQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQRkxBR1MsIEhGQTM4NHhfV0VQRkxBR1NfUFJJVklOVk9LRUQsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3ByaXZhY3lpbnZva2VkIH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBEZWZhdWx0S2V5SUQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWUlELCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBGTEFHUywgSEZBMzg0eF9XRVBGTEFHU19FWENMVURFLCAwLAogICAgICAgICAgIHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRQcmVhbWJsZUVuYWJsZWQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZTSE9SVFBSRUFNQkxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcmVhbWJsZSB9LAogCiAgICAgLyogZG90MTFtYWMgTUlCJ3MgKi8KIAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNQUNBZGRyZXNzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIsIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOLCAwLAogICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVJUU1RocmVzaG9sZCwKICAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNILCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExUlRTVGhyZXNob2xkLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFTaG9ydFJldHJ5TGltaXQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAogICAgICAgICAgIEhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUxvbmdSZXRyeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKICAgICAgICAgICBIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUZyYWdtZW50YXRpb25UaHJlc2hvbGQsCiAgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExRnJhZ21lbnRhdGlvblRocmVzaG9sZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNIMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYXhUcmFuc21pdE1TRFVMaWZldGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCiAgICAgICAgICAgSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRSwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1heFJlY2VpdmVMaWZldGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M1LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczcsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M4LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzOSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEwLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTEsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE2LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTcsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE5LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjAsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIyLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjMsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI1LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjYsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI4LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjksCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMxLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzIsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAogCiAgICAgLyogZG90MTFwaHkgTUlCJ3MgKi8KIAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFQSFlUeXBlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QSFlUWVBFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExVGVtcFR5cGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1RFTVBUWVBFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKICAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDaGFubmVsLAogICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAogICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRDSEFOTkVMLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDaGFubmVsLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTCwgMCwgMCwKKyAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWwsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAorICAgICAgICAgIEhGQTM4NHhfUklEX1RYUE9XRVJNQVgsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ3VycmVudENDQU1vZGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NDQU1PREUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotCi0gICAgLyogcDJUYWJsZSBNSUIncyAqLwotCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMk1NVHgsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkVhcmx5QmVhY29uLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEJJVDcsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2FwcGNmaW5mb2ZsYWcgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyUmVjZWl2ZWRGcmFtZVN0YXRpc3RpY3MsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQ29tbXVuaWNhdGlvblRhbGxpZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQXV0aGVudGljYXRlZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQXNzb2NpYXRlZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyUG93ZXJTYXZlVXNlckNvdW50LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJDb21tZW50LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NNb2RlLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzQWxsb3csCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NEZW55LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQ2hhbm5lbEluZm9SZXN1bHRzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAogCiAgICAgLyogcDJTdGF0aWMgTUlCJ3MgKi8KIApAQCAtNzE4LDU2NSArMjU1LDEzIEBACiAgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORlBPUlRUWVBFLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bk1BQ0FkZHJlc3MsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSLCBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mRGVzaXJlZFNTSUQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lELCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVzdHIycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duQ2hhbm5lbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUwsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duU1NJRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTlNTSUQsIEhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bkFUSU1XaW5kb3csCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTkFUSU1XSU4sIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU3lzdGVtU2NhbGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNYXhEYXRhTGVuZ3RoLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSLCBIRkEzODR4X1JJRF9DTkZXRFNBRERSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUE1FbmFibGVkLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZQTUVOQUJMRUQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQTUVQUywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUE1FUFMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNdWx0aWNhc3RSZWNlaXZlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZNVUxUSUNBU1RSWCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1heFNsZWVwRHVyYXRpb24sCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBNSG9sZG92ZXJEdXJhdGlvbiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bk5hbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05OQU1FLCBIRkEzODR4X1JJRF9DTkZPV05OQU1FX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25EVElNUGVyaW9kLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSMSwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjFfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSMiwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSMywgSEZBMzg0eF9SSURfQ05GV0RTQUREUjNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSNCwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjRfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSNSwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjVfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSNiwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjZfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZNQ0FTVFBNQlVGRiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXlJRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBGbGFncywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUEZMQUdTLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkF1dGhlbnRpY2F0aW9uLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04sIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWF4QXNzb2NpYXRlZFN0YXRpb25zLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk1BWEFTU09DU1RBVElPTlMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mVHhDb250cm9sLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GVFhDT05UUk9MLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlJvYW1pbmdNb2RlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZIb3N0QXV0aGVudGljYXRpb24sCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GSE9TVEFVVEhBU1NPQywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlJjdkNyY0Vycm9yLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUkNWQ1JDRVJST1IsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQWx0UmV0cnlDb3VudCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFMVFJFVFJZQ05ULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkJlYWNvbkludGVydmFsLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQQkNOSU5ULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1lZGl1bU9jY3VwYW5jeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBQZXJpb2QsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAxLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkNGUE1heER1cmF0aW9uLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMiwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBGbGFncywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDMsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU1RBUENGSW5mbywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GU1RBUENGSU5GTywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQcmlvcml0eVFVc2FnZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlBSSU9SSVRZUVVTQUdFLCBIRkEzODR4X1JJRF9DTkZQUklPUVVTQUdFX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlRJTUN0cmwsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZUSU1DVFJMLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlRoaXJ0eTJUYWxseSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlRISVJUWTJUQUxMWSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkVuaFNlY3VyaXR5LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkVOSFNFQ1VSSVRZLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlNob3J0UHJlYW1ibGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZTSE9SVFBSRUFNQkxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcmVhbWJsZSB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mRXhjbHVkZUxvbmdQcmVhbWJsZSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZFWENMT05HUFJFQU1CTEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZBdXRoZW50aWNhdGlvblJzcFRPLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBVVRIUlNQVElNRU9VVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZCYXNpY1JhdGVzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTdXBwb3J0ZWRSYXRlcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlNVUFBSQVRFUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0KLSAgICAvKiBwMkR5bmFtaWMgTUlCJ3MgKi8KLQotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkNyZWF0ZUlCU1MsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NSRUFURUlCU1MsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNILCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJQcm9taXNjdW91c01vZGUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1BST01JU0NNT0RFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQwLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDEsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNIMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkNSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNINSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQ2LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0g2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQxLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDIsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNIMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQ0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNINSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0g2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDEsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wyLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMMywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2w1LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEw1LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMNiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0KLSAgICAvKiBwMkJlaGF2aW9yIE1JQidzICovCi0KLSAgICB7IERJRG1pYl9wMl9wMkJlaGF2aW9yX3AyVGlja1RpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9JVElDS1RJTUUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotCi0gICAgLyogcDJOSUMgTUlCJ3MgKi8KLQotICAgIHsgRElEbWliX3AyX3AyTklDX3AyTWF4TG9hZFRpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX01BWExPQURUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyUGFnZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJETEJ1ZmZlck9mZnNldCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSX0xFTiwgMSwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJETEJ1ZmZlckxlbmd0aCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSX0xFTiwgMiwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJQUklJZGVudGl0eSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJJSURFTlRJVFksIEhGQTM4NHhfUklEX1BSSUlERU5USVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlBSSVN1cFJhbmdlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUklTVVBSQU5HRSwgSEZBMzg0eF9SSURfUFJJU1VQUkFOR0VfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyQ0ZJQWN0UmFuZ2VzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUklfQ0ZJQUNUUkFOR0VTLCBIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyQnVpbGRTZXF1ZW5jZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQlVJTERTRVEsIEhGQTM4NHhfUklEX0JVSUxEU0VRX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlByaW1hcnlGV0lELAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9md2lkIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJTZWNvbmRhcnlGV0lELAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9md2lkIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJUZXJ0aWFyeUZXSUQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9md2lkIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJOSUNTZXJpYWxOdW1iZXIsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUiwgSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyTklDSWRlbnRpdHksCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX05JQ0lERU5USVRZLCBIRkEzODR4X1JJRF9OSUNJREVOVElUWV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJNRklTdXBSYW5nZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTUZJU1VQUkFOR0UsIEhGQTM4NHhfUklEX01GSVNVUFJBTkdFX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkNGSVN1cFJhbmdlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DRklTVVBSQU5HRSwgSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0VfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyQ2hhbm5lbExpc3QsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NIQU5ORUxMSVNULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlJlZ3VsYXRvcnlEb21haW5zLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SRUdVTEFUT1JZRE9NQUlOUywgSEZBMzg0eF9SSURfUkVHVUxBVE9SWURPTUFJTlNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9yZWd1bGF0b3J5ZG9tYWlucyB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyVGVtcFR5cGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1RFTVBUWVBFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlNUQUlkZW50aXR5LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9TVEFJREVOVElUWSwgSEZBMzg0eF9SSURfU1RBSURFTlRJVFlfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyU1RBU3VwUmFuZ2UsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NUQVNVUFJBTkdFLCBIRkEzODR4X1JJRF9TVEFTVVBSQU5HRV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJNRklBY3RSYW5nZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NUQV9NRklBQ1RSQU5HRVMsIEhGQTM4NHhfUklEX01GSUFDVFJBTkdFU19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJTVEFDRklBY3RSYW5nZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NUQV9DRklBQ1RSQU5HRVMsIEhGQTM4NHhfUklEX0NGSUFDVFJBTkdFUzJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAogCiAgICAgLyogcDJNQUMgTUlCJ3MgKi8KIAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyUG9ydFN0YXR1cywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QT1JUU1RBVFVTLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRTU0lELAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRTU0lELCBIRkEzODR4X1JJRF9DVVJSRU5UU1NJRF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVzdHIycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudEJTU0lELAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRCU1NJRCwgSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lEX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUNRLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHlBU0wsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAxLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUFOTCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDIsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eUNRLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHlBU0wsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAxLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eUFOTCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDIsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAogICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZSwKICAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKICAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRCZWFjb25JbnRlcnZhbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVEJDTklOVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJTdGFDdXJyZW50U2NhbGVUaHJlc2hvbGRzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRTQ0FMRVRIUkVTSCwgSEZBMzg0eF9SSURfU1RBQ1VSU0NBTEVUSFJFU0hfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQVBDdXJyZW50U2NhbGVUaHJlc2hvbGRzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFNDQUxFVEhSRVNILCBIRkEzODR4X1JJRF9BUENVUlNDQUxFVEhSRVNIX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMlByb3RvY29sUnNwVGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMlNob3J0UmV0cnlMaW1pdCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfU0hPUlRSRVRSWUxJTUlULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkxvbmdSZXRyeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJNYXhUcmFuc21pdExpZmV0aW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMk1heFJlY2VpdmVMaWZldGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDRlBvbGxhYmxlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NGUE9MTEFCTEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQXV0aGVudGljYXRpb25BbGdvcml0aG1zLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNUywgSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUxLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTIsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMk93bk1BQ0FkZHJlc3MsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTLCBIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotCi0gICAgLyogcDJNb2RlbSBNSUIncyAqLwotCi0gICAgeyBESURtaWJfcDJfcDJNb2RlbV9wMlBIWVR5cGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BIWVRZUEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJDdXJyZW50Q2hhbm5lbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJDdXJyZW50UG93ZXJTdGF0ZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJDQ0FNb2RlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DQ0FNT0RFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1vZGVtX3AyVHhQb3dlck1heCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUE9XRVJNQVgsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUE9XRVJNQVgsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJTdXBwb3J0ZWREYXRhUmF0ZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NVUFBPUlRFRERBVEFSQVRFUywgSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyIH0sCiAKICAgICAvKiBBbmQgZmluYWxseSwgbG54IG1pYnMgKi8KICAgICB7IERJRG1pYl9sbnhfbG54Q29uZmlnVGFibGVfbG54UlNOQUlFLApAQCAtMTI4NSw5NCArMjcwLDYgQEAKICAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAogICAgIHsgMCwgMCwgMCwgMCwgMCwgTlVMTH19OwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZXNlIE1JQidzIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZToKLQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFDaGFubmVsQWdpbGl0eVByZXNlbnQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExQ2hhbm5lbEFnaWxpdHlFbmFibGVkCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFQQkNDT3B0aW9uSW1wbGVtZW50ZWQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0ZWRUYWJsZV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0SW5kZXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeEluZGV4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhWYWx1ZQotRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4SW5kZXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFZhbHVlCi0KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0ZWRUYWJsZV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0VmFsdWUKLVRPRE86IG5lZWQgdG8gaW52ZXN0aWdhdGUgd2h5IHdsYW4gaGFzIHRoaXMgYXMgZW51bWVyYXRlZCBhbmQgUHJpc20yIGhhcyB0aGlzCi0gICAgICBhcyBidHllIHN0ci4KLQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExU2hvcnRQcmVhbWJsZU9wdGlvbkltcGxlbWVudGVkCi1UT0RPOiBGaW5kIG91dCB0aGUgZmlybXdhcmUgdmVyc2lvbiBudW1iZXIocykgZm9yIGlkZW50aWZ5aW5nCi0gICAgICB3aGV0aGVyIHRoZSBmaXJtd2FyZSBpcyBjYXBhYmxlIG9mIHNob3J0IHByZWFtYmxlLiBUUlVFIG9yIEZBTFNFCi0gICAgICB3aWxsIGJlIHJldHVybmVkIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBmaXJtd2FyZS4KLQotV0VQIEtleSBtYXBwaW5ncyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoZSBmL3cuCi1ESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0luZGV4Ci1ESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0FkZHJlc3MKLURJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nV0VQT24KLURJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nVmFsdWUKLURJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdMZW5ndGgKLQotVE9ETzogaW1wbGVtZW50IGNvdW50ZXJzLgotRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQSUNWRXJyb3JDb3VudAotRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRXhjbHVkZWRDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMU11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZhaWxlZENvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUmV0cnlDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMU11bHRpcGxlUmV0cnlDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZyYW1lRHVwbGljYXRlQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSVFNTdWNjZXNzQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSVFNGYWlsdXJlQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFBQ0tGYWlsdXJlQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSZWNlaXZlZEZyYWdtZW50Q291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFGQ1NFcnJvckNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExVHJhbnNtaXR0ZWRGcmFtZUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExV0VQVW5kZWNyeXB0YWJsZUNvdW50Ci0KLVRPRE86IGltcGxlbWVudCBzYW5lIHZhbHVlcyBmb3IgdGhlc2UuCi1ESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1hbnVmYWN0dXJlcklECi1ESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVByb2R1Y3RJRAotCi1Ob3QgdG9vIHdvcnJpZWQgYWJvdXQgdGhlc2UgYXQgdGhlIG1vbWVudC4KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMUN1cnJlbnRUeEFudGVubmEKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMURpdmVyc2l0eVN1cHBvcnQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMUN1cnJlbnRSeEFudGVubmEKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMU51bWJlclN1cHBvcnRlZFBvd2VyTGV2ZWxzCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwxCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwyCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwzCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw0Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw1Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw2Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw3Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsCi0KLVVtbW0sIEZIIGFuZCBJUiBkb24ndCBhcHBseQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExSG9wVGltZQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWxOdW1iZXIKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMU1heER3ZWxsVGltZQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudER3ZWxsVGltZQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudFNldAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudFBhdHRlcm4KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRJbmRleAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ0NBTW9kZVN1cHBvcnRlZAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExRURUaHJlc2hvbGQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ1RpbWVyTWF4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dDb3VudE1heAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nVGltZXJNaW4KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ0NvdW50TWluCi0KLVdlIGp1c3QgZG9uJ3QgaGF2ZSBlbm91Z2ggYW50ZW5uYXMgcmlnaHQgbm93IHRvIHdvcnJ5IGFib3V0IHRoaXMuCi1ESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMUFudGVubmFMaXN0SW5kZXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExU3VwcG9ydGVkVHhBbnRlbm5hCi1ESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMVN1cHBvcnRlZFJ4QW50ZW5uYQotRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFEaXZlcnNpdHlTZWxlY3Rpb25SeAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KIApAQCAtMTQwMSw3ICsyOTgsOCBAQAogCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQJCQlyZXN1bHQsIGlzZ2V0OwogCW1pYnJlY190CQkqbWliOwotCVVJTlQxNgkJCXdoaWNoOworCisJdTE2CQkJd2hpY2g7CiAKIAlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QJKm1zZyA9IG1zZ3A7CiAJcDgwMjExaXRlbWRfdAkJCSptaWJpdGVtOwpAQCAtMTQxNSw3ICszMTMsNyBAQAogCSoqIERldGVybWluZSBpZiB0aGlzIGlzIGFuIEFjY2VzcyBQb2ludCBvciBhIHN0YXRpb24uCiAJKi8KIAotCXdoaWNoID0gaHctPmFwID8gRl9BUCA6IEZfU1RBOworCXdoaWNoID0gRl9TVEE7CiAKIAkvKgogCSoqIEZpbmQgdGhlIE1JQiBpbiB0aGUgTUlCIHRhYmxlLiAgTm90ZSB0aGF0IGEgTUlCIG1heSBiZSBpbiB0aGUKQEAgLTE0OTEsNTkgKzM4OSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyCi0qCi0qIEdldC9zZXQgcHN0ciBkYXRhIHRvL2Zyb20gYSBieXRlIHN0cmluZy4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9ieXRlc3RyMnBzdHIoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgICAgICAgICAgICAgcmVzdWx0OwotCXA4MDIxMXBzdHJkX3QgICAgICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgZGF0YTsKLQlVSU5UOCAgICAgICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JaGZhMzg0eF9ieXRlc3RyX3QgICpwMmJ5dGVzdHIgPSAoaGZhMzg0eF9ieXRlc3RyX3QqKSBieXRlYnVmOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgbWliLT5wYXJtMSwgYnl0ZWJ1ZiwgbWliLT5wYXJtMik7Ci0JCXByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKHAyYnl0ZXN0ciwgcHN0cik7Ci0JfSBlbHNlIHsKLQkJbWVtc2V0KGJ5dGVidWYsIDAsIG1pYi0+cGFybTIpOwotCQlwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihwMmJ5dGVzdHIsIHBzdHIpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCBieXRlYnVmLCBtaWItPnBhcm0yKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX2J5dGVhcmVhMnBzdHIKICoKICogR2V0L3NldCBwc3RyIGRhdGEgdG8vZnJvbSBhIGJ5dGUgYXJlYS4KQEAgLTE1NzgsMTMgKzQyMywxMyBAQAogewogCWludCAgICAgICAgICAgIHJlc3VsdDsKIAlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgZGF0YTsKLQlVSU5UOCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKKwl1OCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKIAogCURCRkVOVEVSOwogCiAJaWYgKGlzZ2V0KSB7CiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIGJ5dGVidWYsIG1pYi0+cGFybTIpOwotCQlwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIoYnl0ZWJ1ZiwgcHN0ciwJbWliLT5wYXJtMik7CisJCXByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cihieXRlYnVmLCBwc3RyLCBtaWItPnBhcm0yKTsKIAl9IGVsc2UgewogCQltZW1zZXQoYnl0ZWJ1ZiwgMCwgbWliLT5wYXJtMik7CiAJCXByaXNtMm1nbXRfcHN0cjJieXRlYXJlYShieXRlYnVmLCBwc3RyKTsKQEAgLTE2MjksOSArNDc0LDkgQEAKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCiB7CiAJaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7CisJdTMyICAqdWludDMyID0gKHUzMiopIGRhdGE7CisJdTggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKKwl1MTYgICp3b3JkYnVmID0gKHUxNiopIGJ5dGVidWY7CiAKIAlEQkZFTlRFUjsKIApAQCAtMTY1NCwxNzggKzQ5OSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfdWludDMyYXJyYXkKLSoKLSogR2V0L3NldCBhbiBhcnJheSBvZiB1aW50MzIgZGF0YS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl91aW50MzJhcnJheSgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIgKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQlpbnQgICAgIGksIGNudDsKLQotCURCRkVOVEVSOwotCi0JY250ID0gbWliLT5wYXJtMiAvIHNpemVvZihVSU5UMTYpOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYsIG1pYi0+cGFybTIpOwotCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCi0JCQlwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQod29yZGJ1ZitpLCB1aW50MzIraSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQotCQkJcHJpc20ybWdtdF9wODAyMTFpbnQycHJpc20yaW50KHdvcmRidWYraSwgdWludDMyK2kpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmLCBtaWItPnBhcm0yKTsKLQkJfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl91aW50MzJvZmZzZXQKLSoKLSogR2V0L3NldCBhIHNpbmdsZSBlbGVtZW50IGluIGFuIGFycmF5IG9mIHVpbnQzMiBkYXRhLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KLSogICAgICAgcGFybTMgICAgRWxlbWVudCBpbmRleC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyb2Zmc2V0KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0JVUlOVDE2ICBjbnQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNudCA9IG1pYi0+cGFybTIgLyBzaXplb2YoVUlOVDE2KTsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYsIG1pYi0+cGFybTIpOwotCWlmIChyZXN1bHQgPT0gMCkgewotCQlpZiAoaXNnZXQpIHsKLQkJCWlmIChtaWItPnBhcm0zIDwgY250KQotCQkJCXByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludCh3b3JkYnVmK21pYi0+cGFybTMsIHVpbnQzMik7Ci0JCQllbHNlCi0JCQkJKnVpbnQzMiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobWliLT5wYXJtMyA8IGNudCkgewotCQkJCXByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludCh3b3JkYnVmK21pYi0+cGFybTMsIHVpbnQzMik7Ci0JCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgbWliLT5wYXJtMSwgd29yZGJ1ZiwgbWliLT5wYXJtMik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3RydXRoCi0qCi0qIEdldC9zZXQgdHJ1dGggZGF0YS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3RydXRoKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0KLQlEQkZFTlRFUjsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYpOwotCQkqdWludDMyID0gKCp3b3JkYnVmKSA/Ci0JCQkJUDgwMjExRU5VTV90cnV0aF90cnVlIDogUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQl9IGVsc2UgewotCQkqd29yZGJ1ZiA9ICgoKnVpbnQzMikgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKSA/IDEgOiAwOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsICp3b3JkYnVmKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX2ZsYWcKICoKICogR2V0L3NldCBhIGZsYWcuCkBAIC0xODU5LDEwICs1MzIsMTAgQEAKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCiB7CiAJaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0JVUlOVDMyICBmbGFnczsKKwl1MzIgICp1aW50MzIgPSAodTMyKikgZGF0YTsKKwl1OCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOworCXUxNiAgKndvcmRidWYgPSAodTE2KikgYnl0ZWJ1ZjsKKwl1MzIgIGZsYWdzOwogCiAJREJGRU5URVI7CiAKQEAgLTE4OTMsMTIxICs1NjYsNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2FwcGNmaW5mb2ZsYWcKLSoKLSogR2V0L3NldCBhIHNpbmdsZSBmbGFnIGluIHRoZSBBUFBDRklORk8gcmVjb3JkLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIEJpdCB0byBnZXQvc2V0LgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2FwcGNmaW5mb2ZsYWcoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQlVSU5UMTYgIHdvcmQ7Ci0KLQlEQkZFTlRFUjsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywKLQkJCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTik7Ci0JaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCWlmIChpc2dldCkgewotCQkJKnVpbnQzMiA9IChoZmEzODR4Mmhvc3RfMTYod29yZGJ1ZlszXSkgJiBtaWItPnBhcm0xKSA/Ci0JCQkJUDgwMjExRU5VTV90cnV0aF90cnVlIDogUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXdvcmQgPSBoZmEzODR4Mmhvc3RfMTYod29yZGJ1ZlszXSk7Ci0JCQl3b3JkID0gKCgqdWludDMyKSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpID8KLQkJCQkod29yZCB8IG1pYi0+cGFybTEpIDogKHdvcmQgJiB+bWliLT5wYXJtMSk7Ci0JCQl3b3JkYnVmWzNdID0gaG9zdDJoZmEzODR4XzE2KHdvcmQpOwotCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLAotCQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOKTsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcmVndWxhdG9yeWRvbWFpbnMKLSoKLSogR2V0IHJlZ3VsYXRvcnkgZG9tYWluIGRhdGEuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIFJJRCBkYXRhLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfcmVndWxhdG9yeWRvbWFpbnMoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgICAgICAgICByZXN1bHQ7Ci0JVUlOVDMyICAgICAgICAgY250OwotCXA4MDIxMXBzdHJkX3QgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSBkYXRhOwotCVVJTlQ4ICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgICAgICAgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0KLQlEQkZFTlRFUjsKLQotCXJlc3VsdCA9IDA7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgbWliLT5wYXJtMSwgd29yZGJ1ZiwgbWliLT5wYXJtMik7Ci0JCXByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludCh3b3JkYnVmLCAmY250KTsKLQkJcHN0ci0+bGVuID0gKFVJTlQ4KSBjbnQ7Ci0JCW1lbWNweShwc3RyLT5kYXRhLCAmd29yZGJ1ZlsxXSwgcHN0ci0+bGVuKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX3dlcGRlZmF1bHRrZXkKICoKICogR2V0L3NldCBXRVAgZGVmYXVsdCBrZXlzLgpAQCAtMjA0Miw4ICs2MDAsOCBAQAogewogCWludCAgICAgICAgICAgIHJlc3VsdDsKIAlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgZGF0YTsKLQlVSU5UOCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICAgICAgICBsZW47CisJdTggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07CisJdTE2ICAgICAgICAgbGVuOwogCiAJREJGRU5URVI7CiAKQEAgLTIwNjIsMTE0ICs2MjAsNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3Bvd2VybWFuYWdlbWVudAotKgotKiBHZXQvc2V0IDgwMi4xMSBwb3dlciBtYW5hZ2VtZW50IHZhbHVlLiAgTm90ZSB0aGF0IHRoaXMgaXMgZGVmaW5lZCBkaWZmZXJlbnRseQotKiBieSA4MDIuMTEgYW5kIFByaXNtMjoKLSoKLSogICAgICAgTWVhbmluZyAgICAgODAyLjExICAgICAgIFByaXNtMgotKiAgICAgICAgYWN0aXZlICAgICAgIDEgICAgICAgICAgIGZhbHNlCi0qICAgICAgcG93ZXJzYXZlICAgICAgMiAgICAgICAgICAgdHJ1ZQotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfcG93ZXJtYW5hZ2VtZW50KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDMyICB2YWx1ZTsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IHByaXNtMm1pYl91aW50MzIobWliLCBpc2dldCwgd2xhbmRldiwgaHcsIG1zZywgJnZhbHVlKTsKLQkJKnVpbnQzMiA9ICh2YWx1ZSA9PSAwKSA/IDEgOiAyOwotCX0gZWxzZSB7Ci0JCXZhbHVlID0gKCgqdWludDMyKSA9PSAxKSA/IDAgOiAxOwotCQlyZXN1bHQgPSBwcmlzbTJtaWJfdWludDMyKG1pYiwgaXNnZXQsIHdsYW5kZXYsIGh3LCBtc2csICZ2YWx1ZSk7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcmVhbWJsZQotKgotKiBHZXQvc2V0IFByaXNtMiBzaG9ydCBwcmVhbWJsZQotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfcHJlYW1ibGUoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywgbWliLT5wYXJtMSwgd29yZGJ1Zik7Ci0JCSp1aW50MzIgPSAqd29yZGJ1ZjsKLQl9IGVsc2UgewotCQkqd29yZGJ1ZiA9ICp1aW50MzI7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgbWliLT5wYXJtMSwgKndvcmRidWYpOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtaWJfcHJpdmFjeWludm9rZWQKICoKICogR2V0L3NldCB0aGUgZG90MTFQcml2YWN5SW52b2tlZCB2YWx1ZS4KQEAgLTIyOTYsNyArNzQ2LDcgQEAKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCiB7CiAJaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7CisJdTMyICAqdWludDMyID0gKHUzMiopIGRhdGE7CiAKIAlEQkZFTlRFUjsKIApAQCAtMjMxNSwzNDkgKzc2NSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfb3BlcmF0aW9uYWxyYXRlc2V0Ci0qCi0qIEdldC9zZXQgdGhlIG9wZXJhdGlvbmFsIHJhdGUgc2V0LgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfb3BlcmF0aW9uYWxyYXRlc2V0KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICAgICAgICAgcmVzdWx0OwotCXA4MDIxMXBzdHJkX3QgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QgKikgZGF0YTsKLQlVSU5UOCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICAgICAgICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmKTsKLQkJcHJpc20ybWdtdF9nZXRfb3ByYXRlc2V0KHdvcmRidWYsIHBzdHIpOwotCX0gZWxzZSB7Ci0JCXByaXNtMm1nbXRfc2V0X29wcmF0ZXNldCh3b3JkYnVmLCBwc3RyKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCAqd29yZGJ1Zik7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GU1VQUFJBVEVTLCAqd29yZGJ1Zik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9ncm91cGFkZHJlc3MKLSoKLSogR2V0L3NldCB0aGUgZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2dyb3VwYWRkcmVzcygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgICAgICAgIHJlc3VsdDsKLQlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90ICopIGRhdGE7Ci0JVUlOVDggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAgICAgICAgbGVuOwotCi0JREJGRU5URVI7Ci0KLQkvKiBUT0RPOiBmaXggdGhpcy4gIGYvdyBkb2Vzbid0IHN1cHBvcnQgbWNhc3QgZmlsdGVycyAqLwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXByaXNtMm1nbXRfZ2V0X2dycGFkZHIobWliLT5kaWQsIHBzdHIsIGh3KTsKLQkJcmV0dXJuKDApOwotCX0KLQotCXJlc3VsdCA9IHByaXNtMm1nbXRfc2V0X2dycGFkZHIobWliLT5kaWQsIGJ5dGVidWYsIHBzdHIsIGh3KTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJcmV0dXJuKHJlc3VsdCk7Ci0JfQotCi0JaWYgKGh3LT5kb3QxMV9ncnBjbnQgPD0gTUFYX1BSSVNNMl9HUlBfQUREUikgewotCQlsZW4gPSBody0+ZG90MTFfZ3JwY250ICogV0xBTl9BRERSX0xFTjsKLQkJbWVtY3B5KGJ5dGVidWYsIGh3LT5kb3QxMV9ncnBfYWRkclswXSwgbGVuKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfR1JPVVBBRERSLCBieXRlYnVmLCBsZW4pOwotCi0JCS8qCi0JCSoqIFR1cm4gb2ZmIHByb21pc2N1b3VzIG1vZGUgaWYgY291bnQgaXMgZXF1YWwgdG8gTUFYLiAgV2UgbWF5Ci0JCSoqIGhhdmUgYmVlbiBhdCBhIGhpZ2hlciBjb3VudCBpbiBwcm9taXNjdW91cyBtb2RlIGFuZCBuZWVkIHRvCi0JCSoqIHR1cm4gaXQgb2ZmLgotCQkqLwotCi0JCS8qIGJ1dCBvbmx5IGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGluIHByb21pc2MgbW9kZS4gOikgKi8KLQkJaWYgKChody0+ZG90MTFfZ3JwY250ID09IE1BWF9QUklTTTJfR1JQX0FERFIpICYmCi0JCSAgICAhKCB3bGFuZGV2LT5uZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpKSB7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsCi0JCQkJCSAgICAgSEZBMzg0eF9SSURfUFJPTUlTQ01PREUsIDApOwotCQl9Ci0JfSBlbHNlIHsKLQotCQkvKgotCQkqKiBDbGVhciBncm91cCBhZGRyZXNzZXMgaW4gY2FyZCBhbmQgc2V0IHRvIHByb21pc2N1b3VzIG1vZGUuCi0JCSovCi0KLQkJbWVtc2V0KGJ5dGVidWYsIDAsIHNpemVvZihieXRlYnVmKSk7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0dST1VQQUREUiwKLQkJCQkJCWJ5dGVidWYsIDApOwotCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKLQkJCQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREUsIDEpOwotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9md2lkCi0qCi0qIEdldCB0aGUgZmlybXdhcmUgSUQuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfZndpZCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgICAgICAgICByZXN1bHQ7Ci0JcDgwMjExcHN0cmRfdCAgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QgKikgZGF0YTsKLQloZmEzODR4X0ZXSURfdCAgZndpZDsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0ZXSUQsCi0JCQkJCQkmZndpZCwgSEZBMzg0eF9SSURfRldJRF9MRU4pOwotCQlpZiAobWliLT5kaWQgPT0gRElEbWliX3AyX3AyTklDX3AyUHJpbWFyeUZXSUQpIHsKLQkJCWZ3aWQucHJpbWFyeVtIRkEzODR4X0ZXSURfTEVOIC0gMV0gPSAnXDAnOwotCQkJcHN0ci0+bGVuID0gc3RybGVuKGZ3aWQucHJpbWFyeSk7Ci0JCQltZW1jcHkocHN0ci0+ZGF0YSwgZndpZC5wcmltYXJ5LCBwc3RyLT5sZW4pOwotCQl9IGVsc2UgewotCQkJZndpZC5zZWNvbmRhcnlbSEZBMzg0eF9GV0lEX0xFTiAtIDFdID0gJ1wwJzsKLQkJCXBzdHItPmxlbiA9IHN0cmxlbihmd2lkLnNlY29uZGFyeSk7Ci0JCQltZW1jcHkocHN0ci0+ZGF0YSwgZndpZC5zZWNvbmRhcnksIHBzdHItPmxlbik7Ci0JCX0KLQl9IGVsc2UKLQkJcmVzdWx0ID0gMDsgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4uICovCi0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2F1dGhhbGcKLSoKLSogR2V0IHZhbHVlcyBmcm9tIHRoZSBBdWh0ZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBUYWJsZSBpbmRleCAoMS02KS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9hdXRoYWxnKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIE1TTTogcGt4IHN1cHBsaWVkIGNvZGUgdGhhdCAgY29kZSBxdWVyaWVzIFJJRCBGRDRELi4uLmJ1dCB0aGUgZi93J3MKLSAgICAgICAgICogIHJlc3VsdHMgYXJlIGJvZ3VzLiBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gc2ltdWxhdGUgdGhlIGFwcHJvcHJpYXRlCi0gICAgICAgICAqICByZXN1bHRzIGhlcmUgaW4gdGhlIGRyaXZlciBiYXNlZCBvbiBvdXIga25vd2xlZGdlIG9mIGV4aXN0aW5nIE1BQwotICAgICAgICAgKiAgZmVhdHVyZXMuICBUaGF0J3MgdGhlIHdob2xlIHBvaW50IGJlaGluZCB0aGlzIHVnbHkgZnVuY3Rpb24uCi0gICAgICAgICAqLwotCi0JaWYgKGlzZ2V0KSB7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JCXN3aXRjaCAobWliLT5wYXJtMSkgewotCQkJY2FzZSAxOiAvKiBPcGVuIFN5c3RlbSAqLwotCQkJCSp1aW50MzIgPSBQODAyMTFFTlVNX2F1dGhhbGdfb3BlbnN5c3RlbTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjogLyogU2hhcmVkS2V5ICovCi0JCQkJKnVpbnQzMiA9IFA4MDIxMUVOVU1fYXV0aGFsZ19zaGFyZWRrZXk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCSp1aW50MzIgPSAwOwotCQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybigwKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlCi0qCi0qIEdldC9zZXQgdGhlIGVuYWJsZSB2YWx1ZXMgZnJvbSB0aGUgQXVodGVudGljYXRpb25BbGdvcml0aG1zVGFibGUuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgVGFibGUgaW5kZXggKDEtNikuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCi0JaW50ICAgICBpbmRleDsKLQlVSU5UMTYgIGNuZl9hdXRoOwotCVVJTlQxNgltYXNrOwotCi0JREJGRU5URVI7Ci0KLQlpbmRleCA9IG1pYi0+cGFybTEgLSAxOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KCBodywKLQkJCUhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OLCAmY25mX2F1dGgpOwotCVdMQU5fTE9HX0RFQlVHKDIsImNuZkF1dGhlbnRpY2F0aW9uMD0lZCwgaW5kZXg9JWRcbiIsIGNuZl9hdXRoLCBpbmRleCk7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJaWYgKCBpbmRleCA9PSAwIHx8IGluZGV4ID09IDEgKSB7Ci0JCQkqdWludDMyID0gKGNuZl9hdXRoICYgKDE8PGluZGV4KSkgPwotCQkJCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZTogUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQkJfSBlbHNlIHsKLQkJCSp1aW50MzIgPSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICggaW5kZXggPT0gMCB8fCBpbmRleCA9PSAxICkgewotCQkJbWFzayA9IDEgPDwgaW5kZXg7Ci0JCQlpZiAoKnVpbnQzMj09UDgwMjExRU5VTV90cnV0aF90cnVlICkgewotCQkJCWNuZl9hdXRoIHw9IG1hc2s7Ci0JCQl9IGVsc2UgewotCQkJCWNuZl9hdXRoICY9IH5tYXNrOwotCQkJfQotCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KCBodywKLQkJCQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04sIGNuZl9hdXRoKTsKLQkJCVdMQU5fTE9HX0RFQlVHKDIsImNuZkF1dGhlbnRpY2F0aW9uOj0lZFxuIiwgY25mX2F1dGgpOwotCQkJaWYgKCByZXN1bHQgKSB7Ci0JCQkJV0xBTl9MT0dfREVCVUcoMSwiVW5hYmxlIHRvIHNldCBwMmNuZkF1dGhlbnRpY2F0aW9uIHRvICVkXG4iLCBjbmZfYXV0aCk7Ci0JCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW1wbGVtZW50YXRpb25fZmFpbHVyZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX3ByaXYKICoKICogR2V0L3NldCB2YWx1ZXMgaW4gdGhlICJwcml2IiBkYXRhIHN0cnVjdHVyZS4KQEAgLTI2OTAsMjE4ICs3OTcsMTggQEAKIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCiB7Ci0JVUlOVDMyICAgICAgICAgICAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwogCXA4MDIxMXBzdHJkX3QgICAgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSBkYXRhOwotCXA4MDIxMW1hY2FycmF5X3QgICptYWNhcnJheSA9IChwODAyMTFtYWNhcnJheV90ICopIGRhdGE7CiAKLQlpbnQgIGksIGNudCwgcmVzdWx0LCBkb25lOwotCi0JcHJpc20yc3RhX2F1dGhsaXN0X3QgIG9sZDsKLQotCS8qCi0JKiogInRlc3QiIGlzIGEgbG90IGxvbmdlciB0aGFuIG5lY2Vzc2FyeSBidXQgd2hvIGNhcmVzPyAgLi4uYXMgbG9uZyBhcwotCSoqIGl0IGlzIGxvbmcgZW5vdWdoIQotCSovCi0KLQlVSU5UOCAgdGVzdFtzaXplb2Yod2xhbmRldi0+cngpICsgc2l6ZW9mKGh3LT50YWxsaWVzKV07CisJaW50ICByZXN1bHQ7CiAKIAlEQkZFTlRFUjsKIAogCXN3aXRjaCAobWliLT5kaWQpIHsKLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyUmVjZWl2ZWRGcmFtZVN0YXRpc3RpY3M6Ci0KLQkJLyoKLQkJKiogTm90ZTogVGhlIHZhbHVlcyBpbiB0aGlzIHJlY29yZCBhcmUgY2hhbmdlZCBieSB0aGUKLQkJKiogaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgZ3VhcmFudGVlZAotCQkqKiB0byBiZSBzdGFibGUgd2hpbGUgdGhleSBhcmUgYmVpbmcgY29waWVkLiAgSG93ZXZlciwKLQkJKiogdGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgdGFrZSBwcmlvcml0eSBvdmVyIHRoaXMKLQkJKiogY29kZS4gIEhlbmNlLCBpZiB0aGUgc2FtZSB2YWx1ZXMgYXJlIGNvcGllZCB0d2ljZSwKLQkJKiogdGhlbiB3ZSBhcmUgZW5zdXJlZCB0aGF0IHRoZSB2YWx1ZXMgaGF2ZSBub3QgYmVlbgotCQkqKiBjaGFuZ2VkLiAgSWYgdGhleSBoYXZlLCB0aGVuIGp1c3QgdHJ5IGFnYWluLiAgRG9uJ3QKLQkJKiogdHJ5IG1vcmUgdGhhbiAxMCB0aW1lcy4uLmlmIHdlIHN0aWxsIGhhdmVuJ3QgZ290IGl0LAotCQkqKiB0aGVuIHRoZSB2YWx1ZXMgd2UgZG8gaGF2ZSBhcmUgcHJvYmFibHkgZ29vZCBlbm91Z2guCi0JCSoqIFRoaXMgc2NoZW1lIGZvciBjb3B5aW5nIHZhbHVlcyBpcyB1c2VkIGluIG9yZGVyIHRvCi0JCSoqIHByZXZlbnQgaGF2aW5nIHRvIGJsb2NrIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGlsZQotCQkqKiB3ZSBjb3B5IHRoZSB2YWx1ZXMuCi0JCSovCi0KLQkJaWYgKGlzZ2V0KQotCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQltZW1jcHkoZGF0YSwgJndsYW5kZXYtPnJ4LCBzaXplb2Yod2xhbmRldi0+cngpKTsKLQkJCQltZW1jcHkodGVzdCwgJndsYW5kZXYtPnJ4LCBzaXplb2Yod2xhbmRldi0+cngpKTsKLQkJCQlpZiAobWVtY21wKGRhdGEsIHRlc3QsIHNpemVvZih3bGFuZGV2LT5yeCkpID09IDApIGJyZWFrOwotCQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW11bmljYXRpb25UYWxsaWVzOgotCi0JCS8qCi0JCSoqIE5vdGU6IFRoZSB2YWx1ZXMgaW4gdGhpcyByZWNvcmQgYXJlIGNoYW5nZWQgYnkgdGhlCi0JCSoqIGludGVycnVwdCBoYW5kbGVyIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGd1YXJhbnRlZWQKLQkJKiogdG8gYmUgc3RhYmxlIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGNvcGllZC4gIFNlZSB0aGUKLQkJKiogbm90ZSBhYm92ZSBhYm91dCBjb3B5aW5nIHZhbHVlcy4KLQkJKi8KLQotCQlpZiAoaXNnZXQpIHsKLQkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9jb21tdGFsbGllcyhodyk7Ci0KLQkJCS8qID8/Pz8/PyBXZSBuZWVkIHRvIHdhaXQgYSBiaXQgaGVyZSBmb3IgdGhlICovCi0JCQkvKiAgIHRhbGxpZXMgdG8gZ2V0IHVwZGF0ZWQuID8/Pz8/PyAqLwotCQkJLyogTVNNOiBUT0RPOiBUaGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMgaXMgdG8KLQkJCSAqICAgICAgYWRkIGEgImNvbW10YWxsaWUiIHdhaXQgcXVldWUgdG8gdGhlCi0JCQkgKiAgICAgIHByaXYgc3RydWN0dXJlIHRoYXQgZ2V0cyBydW4gZXZlcnkgdGltZQotCQkJICogICAgICB3ZSByZWNlaXZlIGEgY29tbXRhbGx5IGluZm8gZnJhbWUuCi0JCQkgKiAgICAgIFRoaXMgcHJvY2VzcyB3b3VsZCBzbGVlcCBvbiB0aGF0Ci0JCQkgKiAgICAgIHF1ZXVlIGFuZCBnZXQgYXdha2VuZWQgd2hlbiB0aGUKLQkJCSAqICAgICAgdGhlIHJlcXVlc3RlZCBpbmZvIGZyYW1lIGFycml2ZXMuCi0JCQkgKiAgICAgIERvbid0IGhhdmUgdGltZSB0byBkbyBhbmQgdGVzdCB0aGlzCi0JCQkgKiAgICAgIHJpZ2h0IG5vdy4KLQkJCSAqLwotCi0JCQkvKiBVZ2gsIHRoaXMgaXMgbmFzdHkuICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCW1lbWNweShkYXRhLAotCQkJCSAgICAgICAmaHctPnRhbGxpZXMsCi0JCQkJICAgICAgIHNpemVvZihody0+dGFsbGllcykpOwotCQkJCW1lbWNweSh0ZXN0LAotCQkJCSAgICAgICAmaHctPnRhbGxpZXMsCi0JCQkJICAgICAgIHNpemVvZihody0+dGFsbGllcykpOwotCQkJCWlmICggbWVtY21wKGRhdGEsCi0JCQkJCSAgICB0ZXN0LAotCQkJCQkgICAgc2l6ZW9mKGh3LT50YWxsaWVzKSkgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJBdXRoZW50aWNhdGVkOgotCi0JCWlmIChpc2dldCkgewotCQkJcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoaHcsICZvbGQpOwotCi0JCQltYWNhcnJheS0+Y250ID0gMDsKLQkJCWZvciAoaSA9IDA7IGkgPCBvbGQuY250OyBpKyspIHsKLQkJCQlpZiAoIW9sZC5hc3NvY1tpXSkgewotCQkJCQltZW1jcHkobWFjYXJyYXktPmRhdGFbbWFjYXJyYXktPmNudF0sIG9sZC5hZGRyW2ldLCBXTEFOX0FERFJfTEVOKTsKLQkJCQkJbWFjYXJyYXktPmNudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkFzc29jaWF0ZWQ6Ci0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQlwcmlzbTJtaWJfcHJpdl9hdXRobGlzdChodywgJm9sZCk7Ci0KLQkJCW1hY2FycmF5LT5jbnQgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8IG9sZC5jbnQ7IGkrKykgewotCQkJCWlmIChvbGQuYXNzb2NbaV0pIHsKLQkJCQkJbWVtY3B5KG1hY2FycmF5LT5kYXRhW21hY2FycmF5LT5jbnRdLCBvbGQuYWRkcltpXSwgV0xBTl9BRERSX0xFTik7Ci0JCQkJCW1hY2FycmF5LT5jbnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJQb3dlclNhdmVVc2VyQ291bnQ6Ci0KLQkJaWYgKGlzZ2V0KQotCQkJKnVpbnQzMiA9IGh3LT5wc3VzZXJjb3VudDsKLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJDb21tZW50OgotCi0JCWlmIChpc2dldCkgewotCQkJcHN0ci0+bGVuID0gc3RybGVuKGh3LT5jb21tZW50KTsKLQkJCW1lbWNweShwc3RyLT5kYXRhLCBody0+Y29tbWVudCwgcHN0ci0+bGVuKTsKLQkJfSBlbHNlIHsKLQkJCWNudCA9IHBzdHItPmxlbjsKLQkJCWlmIChjbnQgPCAwKSBjbnQgPSAwOwotCQkJaWYgKGNudCA+PSBzaXplb2YoaHctPmNvbW1lbnQpKQotCQkJCWNudCA9IHNpemVvZihody0+Y29tbWVudCktMTsKLQkJCW1lbWNweShody0+Y29tbWVudCwgcHN0ci0+ZGF0YSwgY250KTsKLQkJCXBzdHItPmRhdGFbY250XSA9ICdcMCc7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NNb2RlOgotCi0JCWlmIChpc2dldCkKLQkJCSp1aW50MzIgPSBody0+YWNjZXNzbW9kZTsKLQkJZWxzZQotCQkJcHJpc20ybWliX3ByaXZfYWNjZXNzbW9kZShodywgKnVpbnQzMik7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzQWxsb3c6Ci0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQltYWNhcnJheS0+Y250ID0gaHctPmFsbG93LmNudDsKLQkJCW1lbWNweShtYWNhcnJheS0+ZGF0YSwgaHctPmFsbG93LmFkZHIsCi0JCQkgICAgICAgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQkJfSBlbHNlIHsKLQkJCXByaXNtMm1pYl9wcml2X2FjY2Vzc2FsbG93KGh3LCBtYWNhcnJheSk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NEZW55OgotCi0JCWlmIChpc2dldCkgewotCQkJbWFjYXJyYXktPmNudCA9IGh3LT5kZW55LmNudDsKLQkJCW1lbWNweShtYWNhcnJheS0+ZGF0YSwgaHctPmRlbnkuYWRkciwKLQkJCSAgICAgICBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCQl9IGVsc2UgewotCQkJcHJpc20ybWliX3ByaXZfYWNjZXNzZGVueShodywgbWFjYXJyYXkpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQ2hhbm5lbEluZm9SZXN1bHRzOgotCi0JCWlmIChpc2dldCkgewotCQkJZG9uZSA9IGF0b21pY19yZWFkKCZody0+Y2hhbm5lbF9pbmZvLmRvbmUpOwotCQkJaWYgKGRvbmUgPT0gMCkgewotCQkJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGRvbmUgPT0gMSkgewotCQkJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2luY29tcGxldGVfaXRlbWRhdGE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrLCB1aW50MzIgKz0gNSkgewotCQkJCXVpbnQzMlswXSA9IGkrMTsKLQkJCQl1aW50MzJbMV0gPSBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2ldLmFubDsKLQkJCQl1aW50MzJbMl0gPSBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2ldLnBubDsKLQkJCQl1aW50MzJbM10gPSAoaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtpXS5hY3RpdmUgJiBIRkEzODR4X0NISU5GT1JFU1VMVF9CU1NBQ1RJVkUpID8gMSA6IDA7Ci0JCQkJdWludDMyWzRdID0gKGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbaV0uYWN0aXZlICYgSEZBMzg0eF9DSElORk9SRVNVTFRfUENGQUNUSVZFKSA/IDEgOiAwOwotCQkJfQotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRCU1NUeXBlOgotCi0JCWlmIChpc2dldCkKLQkJCSp1aW50MzIgPSBody0+ZG90MTFfZGVzaXJlZF9ic3NfdHlwZTsKLQkJZWxzZQotCQkJaHctPmRvdDExX2Rlc2lyZWRfYnNzX3R5cGUgPSAqdWludDMyOwotCi0JCWJyZWFrOwotCiAJY2FzZSBESURtaWJfbG54X2xueENvbmZpZ1RhYmxlX2xueFJTTkFJRTogewogCQloZmEzODR4X1dQQURhdGFfdCB3cGE7CiAJCWlmIChpc2dldCkgewogCQkJaGZhMzg0eF9kcnZyX2dldGNvbmZpZyggaHcsIEhGQTM4NHhfUklEX0NORldQQURBVEEsCi0JCQkJCQkoVUlOVDggKikgJndwYSwgc2l6ZW9mKHdwYSkpOworCQkJCQkJKHU4ICopICZ3cGEsIHNpemVvZih3cGEpKTsKIAkJCXBzdHItPmxlbiA9IGhmYTM4NHgyaG9zdF8xNih3cGEuZGF0YWxlbik7CiAJCQltZW1jcHkocHN0ci0+ZGF0YSwgd3BhLmRhdGEsIHBzdHItPmxlbik7CiAJCX0gZWxzZSB7CkBAIC0yOTA5LDcgKzgxNiw3IEBACiAJCQltZW1jcHkod3BhLmRhdGEsIHBzdHItPmRhdGEsIHBzdHItPmxlbik7CiAKIAkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORldQQURBVEEsCi0JCQkJKFVJTlQ4ICopICZ3cGEsIHNpemVvZih3cGEpKTsKKwkJCQkodTggKikgJndwYSwgc2l6ZW9mKHdwYSkpOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTI5MjIsMzQ1ICs4MjksNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXZfYXV0aGxpc3QKLSoKLSogR2V0IGEgY29weSBvZiB0aGUgbGlzdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGxpc3QgICAgIExpc3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucy4KLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2F1dGhsaXN0KAotaGZhMzg0eF90ICAgICAgICAgICAgICpodywKLXByaXNtMnN0YV9hdXRobGlzdF90ICAqbGlzdCkKLXsKLQlwcmlzbTJzdGFfYXV0aGxpc3RfdCAgdGVzdDsKLQlpbnQgICAgICAgICAgICAgICAgICAgaTsKLQotCURCRkVOVEVSOwotCi0JLyoKLQkqKiBOb3RlOiBUaGUgdmFsdWVzIGluIHRoaXMgcmVjb3JkIGFyZSBjaGFuZ2VkIGJ5IHRoZSBpbnRlcnJ1cHQKLQkqKiBoYW5kbGVyIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlIHdoaWxlCi0JKiogdGhleSBhcmUgYmVpbmcgY29waWVkLiAgSG93ZXZlciwgdGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwKLQkqKiB0YWtlIHByaW9yaXR5IG92ZXIgdGhpcyBjb2RlLiAgSGVuY2UsIGlmIHRoZSBzYW1lIHZhbHVlcyBhcmUKLQkqKiBjb3BpZWQgdHdpY2UsIHRoZW4gd2UgYXJlIGVuc3VyZWQgdGhhdCB0aGUgdmFsdWVzIGhhdmUgbm90Ci0JKiogYmVlbiBjaGFuZ2VkLiAgSWYgdGhleSBoYXZlLCB0aGVuIGp1c3QgdHJ5IGFnYWluLiAgRG9uJ3QgdHJ5Ci0JKiogbW9yZSB0aGFuIDEwIHRpbWVzLi4udGhlIGxpc3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucyBpcwotCSoqIHVubGlrZWx5IHRvIGJlIGNoYW5naW5nIGZyZXF1ZW50bHkgZW5vdWdoIHRoYXQgd2UgY2FuJ3QgZ2V0Ci0JKiogYSBzbmFwc2hvdCBpbiAxMCB0cmllcy4gIERvbid0IHRyeSBtb3JlIHRoYW4gdGhpcyBzbyB0aGF0IHdlCi0JKiogZG9uJ3QgcmlzayBsb2NraW5nLXVwIGZvciBsb25nIHBlcmlvZHMgb2YgdGltZS4gIElmIHdlIHN0aWxsCi0JKiogaGF2ZW4ndCBnb3QgdGhlIHNuYXBzaG90LCB0aGVuIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgYW5kCi0JKiogcmV0dXJuIGFuIGVtcHR5IGxpc3QgKHNpbmNlIHRoaXMgaXMgdGhlIG9ubHkgdmFsaWQgbGlzdCB0aGF0Ci0JKiogd2UgY2FuIGd1YXJlbnRlZSkuICBUaGlzIHNjaGVtZSBmb3IgY29weWluZyB2YWx1ZXMgaXMgdXNlZCBpbgotCSoqIG9yZGVyIHRvIHByZXZlbnQgaGF2aW5nIHRvIGJsb2NrIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGlsZQotCSoqIHdlIGNvcHkgdGhlIHZhbHVlcy4KLQkqLwotCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJbWVtY3B5KGxpc3QsICZody0+YXV0aGxpc3QsIHNpemVvZihwcmlzbTJzdGFfYXV0aGxpc3RfdCkpOwotCQltZW1jcHkoJnRlc3QsICZody0+YXV0aGxpc3QsIHNpemVvZihwcmlzbTJzdGFfYXV0aGxpc3RfdCkpOwotCQlpZiAobWVtY21wKGxpc3QsICZ0ZXN0LCBzaXplb2YocHJpc20yc3RhX2F1dGhsaXN0X3QpKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPj0gMTApIHsKLQkJbGlzdC0+Y250ID0gMDsKLQkJV0xBTl9MT0dfRVJST1IoIkNvdWxkIG5vdCBvYnRhaW4gc25hcHNob3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucy5cbiIpOwotCQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcml2X2FjY2Vzc21vZGUKLSoKLSogU2V0IHRoZSBBY2Nlc3MgTW9kZS4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbW9kZSAgICAgTmV3IGFjY2VzcyBtb2RlLgotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYWNjZXNzbW9kZSgKLWhmYTM4NHhfdCAgICAgICAgICpodywKLVVJTlQzMiAgICAgICAgICAgIG1vZGUpCi17Ci0JcHJpc20yc3RhX2F1dGhsaXN0X3QgIG9sZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgaSwgaiwgZGVhdXRoOwotCVVJTlQ4ICAgICAgICAgICAgICAgICAqYWRkcjsKLQotCURCRkVOVEVSOwotCi0JLyoKLQkqKiBJZiB0aGUgbW9kZSBpcyBub3QgY2hhbmdpbmcgb3IgaXQgaXMgY2hhbmdpbmcgdG8gIkFsbCIsIHRoZW4gaXQncwotCSoqIG9rYXkgdG8gZ28gYWhlYWQgd2l0aG91dCBhIGxvdCBvZiBtZXNzaW5nIGFyb3VuZC4gIE90aGVyd2lzZSwgdGhlCi0JKiogYWNjZXNzIG1vZGUgaXMgY2hhbmdpbmcgaW4gYSB3YXkgdGhhdCBtYXkgbGVhdmUgc29tZSBzdGF0aW9ucwotCSoqIGF1dGhlbnRpY2F0ZWQgd2hpY2ggc2hvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkLiAgSXQgd2lsbCBiZQotCSoqIG5lY2Vzc2FyeSB0byBkZS1hdXRoZW50aWNhdGUgdGhlc2Ugc3RhdGlvbnMuCi0JKi8KLQotCWlmIChtb2RlID09IFdMQU5fQUNDRVNTX0FMTCB8fCBtb2RlID09IGh3LT5hY2Nlc3Ntb2RlKSB7Ci0JCWh3LT5hY2Nlc3Ntb2RlID0gbW9kZTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JKiogU3dpdGNoIHRvIHRoZSBuZXcgYWNjZXNzIG1vZGUuICBPbmNlIHRoaXMgaXMgZG9uZSwgdGhlbiB0aGUgaW50ZXJydXB0Ci0JKiogaGFuZGxlciAod2hpY2ggdXNlcyB0aGlzIHZhbHVlKSB3aWxsIGJlIHByZXZlbnRlZCBmcm9tIGF1dGhlbnRpY2F0aW5nCi0JKiogQURESVRJT05BTCBzdGF0aW9ucyB3aGljaCBzaG91bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQuICBUaGVuIGdldCBhCi0JKiogY29weSBvZiB0aGUgY3VycmVudCBsaXN0IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMuCi0JKi8KLQotCWh3LT5hY2Nlc3Ntb2RlID0gbW9kZTsKLQotCXByaXNtMm1pYl9wcml2X2F1dGhsaXN0KGh3LCAmb2xkKTsKLQotCS8qCi0JKiogTm93IGdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIHN0YXRpb25zIChzb21lCi0JKiogb2Ygd2hpY2ggbWlnaHQgZGUtYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgd2hpbGUgd2UgYXJlIHByb2Nlc3NpbmcgaXQKLQkqKiBidXQgdGhhdCBpcyBva2F5KS4gIEFueSBzdGF0aW9uIHdoaWNoIG5vIGxvbmdlciBtYXRjaGVzIHRoZSBhY2Nlc3MKLQkqKiBtb2RlLCBtdXN0IGJlIGRlLWF1dGhlbnRpY2F0ZWQuCi0JKi8KLQotCWZvciAoaSA9IDA7IGkgPCBvbGQuY250OyBpKyspIHsKLQkJYWRkciA9IG9sZC5hZGRyW2ldOwotCi0JCWlmIChtb2RlID09IFdMQU5fQUNDRVNTX05PTkUpCi0JCQlkZWF1dGggPSAxOwotCQllbHNlIHsKLQkJCWlmIChtb2RlID09IFdMQU5fQUNDRVNTX0FMTE9XKSB7Ci0JCQkJZm9yIChqID0gMDsgaiA8IGh3LT5hbGxvdy5jbnQ7IGorKykKLQkJCQkJaWYgKG1lbWNtcChhZGRyLCBody0+YWxsb3cuYWRkcltqXSwKLQkJCQkJCQlXTEFOX0FERFJfTEVOKSA9PSAwKQotCQkJCQkJYnJlYWs7Ci0JCQkJZGVhdXRoID0gKGogPj0gaHctPmFsbG93LmNudCk7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaiA9IDA7IGogPCBody0+ZGVueS5jbnQ7IGorKykKLQkJCQkJaWYgKG1lbWNtcChhZGRyLCBody0+ZGVueS5hZGRyW2pdLAotCQkJCQkJCVdMQU5fQUREUl9MRU4pID09IDApCi0JCQkJCQlicmVhazsKLQkJCQlkZWF1dGggPSAoaiA8IGh3LT5kZW55LmNudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVhdXRoKSBwcmlzbTJtaWJfcHJpdl9kZWF1dGhlbnRpY2F0ZShodywgYWRkcik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NhbGxvdwotKgotKiBDaGFuZ2UgdGhlIGxpc3Qgb2YgYWxsb3dlZCBNQUMgYWRkcmVzc2VzLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIHByaXYgICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1hY2FycmF5ICBOZXcgYXJyYXkgb2YgTUFDIGFkZHJlc3Nlcy4KLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2FjY2Vzc2FsbG93KAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotcDgwMjExbWFjYXJyYXlfdCAgKm1hY2FycmF5KQotewotCXByaXNtMnN0YV9hdXRobGlzdF90ICBvbGQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgIGksIGo7Ci0KLQlEQkZFTlRFUjsKLQotCS8qCi0JKiogQ2hhbmdlIHRoZSBhY2Nlc3MgbGlzdC4gIE5vdGUgdGhhdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbWF5IGJlIGluCi0JKiogdGhlIG1pZGRsZSBvZiB1c2luZyB0aGUgYWNjZXNzIGxpc3QhISEgIFNpbmNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgotCSoqIHdpbGwJYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGlzIHByb2Nlc3MgYW5kIHRoaXMgaXMgdGhlIG9ubHkKLQkqKiBwcm9jZXNzIHRoYXQgd2lsbCBtb2RpZnkgdGhlIGxpc3QsIHRoaXMgcHJvYmxlbSBjYW4gYmUgaGFuZGxlZCBhcwotCSoqIGZvbGxvd3M6Ci0JKioKLQkqKiAgICAxLiBTZXQgdGhlICJtb2RpZnkiIGZsYWcuCi0JKiogICAgMi4gQ2hhbmdlIHRoZSBmaXJzdCBjb3B5IG9mIHRoZSBsaXN0LgotCSoqICAgIDMuIENsZWFyIHRoZSAibW9kaWZ5IiBmbGFnLgotCSoqICAgIDQuIENoYW5nZSB0aGUgYmFja3VwIGNvcHkgb2YgdGhlIGxpc3QuCi0JKioKLQkqKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBjaGVjayB0aGUgIm1vZGlmeSIgZmxhZy4gIElmIE5PVCBzZXQsIHRoZW4KLQkqKiB0aGUgZmlyc3QgY29weSBvZiB0aGUgbGlzdCBpcyB2YWxpZCBhbmQgbWF5IGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZQotCSoqIGZpcnN0IGNvcHkgaXMgYmVpbmcgY2hhbmdlZCBidXQgdGhlIGJhY2t1cCBjb3B5IGlzIHZhbGlkIGFuZCBtYXkgYmUKLQkqKiB1c2VkLiAgRG9pbmcgdGhpbmdzIHRoaXMgd2F5IHByZXZlbnRzIGhhdmluZyB0byBoYXZlIHRoZSBpbnRlcnJ1cHQKLQkqKiBoYW5kbGVyIGJsb2NrIHdoaWxlIHRoZSBsaXN0IGlzIGJlaW5nIHVwZGF0ZWQuCi0JKi8KLQotCWh3LT5hbGxvdy5tb2RpZnkgPSAxOwotCi0JaHctPmFsbG93LmNudCA9IG1hY2FycmF5LT5jbnQ7Ci0JbWVtY3B5KGh3LT5hbGxvdy5hZGRyLCBtYWNhcnJheS0+ZGF0YSwgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQotCWh3LT5hbGxvdy5tb2RpZnkgPSAwOwotCi0JaHctPmFsbG93LmNudDEgPSBtYWNhcnJheS0+Y250OwotCW1lbWNweShody0+YWxsb3cuYWRkcjEsIG1hY2FycmF5LT5kYXRhLCBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCi0JLyoKLQkqKiBJZiB0aGUgY3VycmVudCBhY2Nlc3MgbW9kZSBpcyAiQWxsb3ciLCB0aGVuIGNoYW5naW5nIHRoZSBhY2Nlc3MKLQkqKiBsaXN0IG1heSBsZWF2ZSBzb21lIHN0YXRpb25zIGF1dGhlbnRpY2F0ZWQgd2hpY2ggc2hvdWxkIG5vdCBiZQotCSoqIGF1dGhlbnRpY2F0ZWQuICBJdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBkZS1hdXRoZW50aWNhdGUgdGhlc2UKLQkqKiBzdGF0aW9ucy4gIE90aGVyd2lzZSwgdGhlIGxpc3QgY2FuIGJlIGNoYW5nZWQgd2l0aG91dCBhIGxvdCBvZiBmdXNzLgotCSovCi0KLQlpZiAoaHctPmFjY2Vzc21vZGUgPT0gV0xBTl9BQ0NFU1NfQUxMT1cpIHsKLQotCQkvKgotCQkqKiBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMgKHNvbWUgb2YKLQkJKiogd2hpY2ggbWlnaHQgZGUtYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgd2hpbGUgd2UgYXJlCi0JCSoqIHByb2Nlc3NpbmcgaXQgYnV0IHRoYXQgaXMgb2theSkuICBBbnkgc3RhdGlvbiB3aGljaCBpcwotCQkqKiBubyBsb25nZXIgaW4gdGhlIGxpc3Qgb2YgYWxsb3dlZCBzdGF0aW9ucywgbXVzdCBiZQotCQkqKiBkZS1hdXRoZW50aWNhdGVkLgotCQkqLwotCi0JCXByaXNtMm1pYl9wcml2X2F1dGhsaXN0KGh3LCAmb2xkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb2xkLmNudDsgaSsrKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaHctPmFsbG93LmNudDsgaisrKQotCQkJCWlmIChtZW1jbXAob2xkLmFkZHJbaV0sIGh3LT5hbGxvdy5hZGRyW2pdLAotCQkJCQkJCVdMQU5fQUREUl9MRU4pID09IDApCi0JCQkJCWJyZWFrOwotCQkJaWYgKGogPj0gaHctPmFsbG93LmNudCkKLQkJCQlwcmlzbTJtaWJfcHJpdl9kZWF1dGhlbnRpY2F0ZShodywgb2xkLmFkZHJbaV0pOwotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NkZW55Ci0qCi0qIENoYW5nZSB0aGUgbGlzdCBvZiBkZW5pZWQgTUFDIGFkZHJlc3Nlcy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBwcml2ICAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtYWNhcnJheSAgTmV3IGFycmF5IG9mIE1BQyBhZGRyZXNzZXMuCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NkZW55KAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotcDgwMjExbWFjYXJyYXlfdCAgKm1hY2FycmF5KQotewotCXByaXNtMnN0YV9hdXRobGlzdF90ICBvbGQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgIGksIGo7Ci0KLQlEQkZFTlRFUjsKLQotCS8qCi0JKiogQ2hhbmdlIHRoZSBhY2Nlc3MgbGlzdC4gIE5vdGUgdGhhdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbWF5IGJlIGluCi0JKiogdGhlIG1pZGRsZSBvZiB1c2luZyB0aGUgYWNjZXNzIGxpc3QhISEgIFNpbmNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgotCSoqIHdpbGwgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGlzIHByb2Nlc3MgYW5kIHRoaXMgaXMgdGhlIG9ubHkKLQkqKiBwcm9jZXNzIHRoYXQgd2lsbCBtb2RpZnkgdGhlIGxpc3QsIHRoaXMgcHJvYmxlbSBjYW4gYmUgaGFuZGxlZCBhcwotCSoqIGZvbGxvd3M6Ci0JKioKLQkqKiAgICAxLiBTZXQgdGhlICJtb2RpZnkiIGZsYWcuCi0JKiogICAgMi4gQ2hhbmdlIHRoZSBmaXJzdCBjb3B5IG9mIHRoZSBsaXN0LgotCSoqICAgIDMuIENsZWFyIHRoZSAibW9kaWZ5IiBmbGFnLgotCSoqICAgIDQuIENoYW5nZSB0aGUgYmFja3VwIGNvcHkgb2YgdGhlIGxpc3QuCi0JKioKLQkqKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBjaGVjayB0aGUgIm1vZGlmeSIgZmxhZy4gIElmIE5PVCBzZXQsIHRoZW4KLQkqKiB0aGUgZmlyc3QgY29weSBvZiB0aGUgbGlzdCBpcyB2YWxpZCBhbmQgbWF5IGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZQotCSoqIGZpcnN0IGNvcHkgaXMgYmVpbmcgY2hhbmdlZCBidXQgdGhlIGJhY2t1cCBjb3B5IGlzIHZhbGlkIGFuZCBtYXkgYmUKLQkqKiB1c2VkLiAgRG9pbmcgdGhpbmdzIHRoaXMgd2F5IHByZXZlbnRzIGhhdmluZyB0byBoYXZlIHRoZSBpbnRlcnJ1cHQKLQkqKiBoYW5kbGVyIGJsb2NrIHdoaWxlIHRoZSBsaXN0IGlzIGJlaW5nIHVwZGF0ZWQuCi0JKi8KLQotCWh3LT5kZW55Lm1vZGlmeSA9IDE7Ci0KLQlody0+ZGVueS5jbnQgPSBtYWNhcnJheS0+Y250OwotCW1lbWNweShody0+ZGVueS5hZGRyLCBtYWNhcnJheS0+ZGF0YSwgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQotCWh3LT5kZW55Lm1vZGlmeSA9IDA7Ci0KLQlody0+ZGVueS5jbnQxID0gbWFjYXJyYXktPmNudDsKLQltZW1jcHkoaHctPmRlbnkuYWRkcjEsIG1hY2FycmF5LT5kYXRhLCBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCi0JLyoKLQkqKiBJZiB0aGUgY3VycmVudCBhY2Nlc3MgbW9kZSBpcyAiRGVueSIsIHRoZW4gY2hhbmdpbmcgdGhlIGFjY2VzcwotCSoqIGxpc3QgbWF5IGxlYXZlIHNvbWUgc3RhdGlvbnMgYXV0aGVudGljYXRlZCB3aGljaCBzaG91bGQgbm90IGJlCi0JKiogYXV0aGVudGljYXRlZC4gIEl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvIGRlLWF1dGhlbnRpY2F0ZSB0aGVzZQotCSoqIHN0YXRpb25zLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGEgbG90IG9mIGZ1c3MuCi0JKi8KLQotCWlmIChody0+YWNjZXNzbW9kZSA9PSBXTEFOX0FDQ0VTU19ERU5ZKSB7Ci0KLQkJLyoKLQkJKiogR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zIChzb21lIG9mCi0JCSoqIHdoaWNoIG1pZ2h0IGRlLWF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzIHdoaWxlIHdlIGFyZQotCQkqKiBwcm9jZXNzaW5nIGl0IGJ1dCB0aGF0IGlzIG9rYXkpLiAgQW55IHN0YXRpb24gd2hpY2ggaXMKLQkJKiogbm93IGluIHRoZSBsaXN0IG9mIGRlbmllZCBzdGF0aW9ucywgbXVzdCBiZSBkZS1hdXRoZW50aWNhdGVkLgotCQkqLwotCi0JCXByaXNtMm1pYl9wcml2X2F1dGhsaXN0KGh3LCAmb2xkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb2xkLmNudDsgaSsrKQotCQkJZm9yIChqID0gMDsgaiA8IGh3LT5kZW55LmNudDsgaisrKQotCQkJCWlmIChtZW1jbXAob2xkLmFkZHJbaV0sIGh3LT5kZW55LmFkZHJbal0sCi0JCQkJCQkJIFdMQU5fQUREUl9MRU4pID09IDApIHsKLQkJCQkJcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUoaHcsIG9sZC5hZGRyW2ldKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUKLSoKLSogRGUtYXV0aGVudGljYXRlIGEgc3RhdGlvbi4gIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIGEgSGFuZG92ZXJBZGRyZXNzCi0qIGluZm9ybWF0aW9uIGZyYW1lIHRvIHRoZSBmaXJtd2FyZS4gIFRoaXMgc2hvdWxkIHdvcmssIGFjY29yZGluZyB0bwotKiBJbnRlcnNpbC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgYWRkciAgICAgTUFDIGFkZHJlc3Mgb2Ygc3RhdGlvbiB0byBiZSBkZS1hdXRoZW50aWNhdGVkLgotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUoCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1VSU5UOCAgICAgICAgICAgICAqYWRkcikKLXsKLQlEQkZFTlRFUjsKLQloZmEzODR4X2RydnJfaGFuZG92ZXIoaHcsIGFkZHIpOwotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cgogKgogKiBDb252ZXJ0IHRoZSBwc3RyIGRhdGEgaW4gdGhlIFdMQU4gbWVzc2FnZSBzdHJ1Y3R1cmUgaW50byBhbiBoZmEzODR4CkBAIC0zMjc5LDcgKzg0Nyw3IEBACiB7CiAJREJGRU5URVI7CiAKLQlieXRlc3RyLT5sZW4gPSBob3N0MmhmYTM4NHhfMTYoKFVJTlQxNikocHN0ci0+bGVuKSk7CisJYnl0ZXN0ci0+bGVuID0gaG9zdDJoZmEzODR4XzE2KCh1MTYpKHBzdHItPmxlbikpOwogCW1lbWNweShieXRlc3RyLT5kYXRhLCBwc3RyLT5kYXRhLCBwc3RyLT5sZW4pOwogCURCRkVYSVQ7CiB9CkBAIC0zMzAwLDcgKzg2OCw3IEBACiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZWFyZWEoVUlOVDggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyKQordm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZWFyZWEodTggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyKQogewogCURCRkVOVEVSOwogCkBAIC0zMzI4LDcgKzg5Niw3IEBACiB7CiAJREJGRU5URVI7CiAKLQlwc3RyLT5sZW4gPSAoVUlOVDgpKGhmYTM4NHgyaG9zdF8xNigoVUlOVDE2KShieXRlc3RyLT5sZW4pKSk7CisJcHN0ci0+bGVuID0gKHU4KShoZmEzODR4Mmhvc3RfMTYoKHUxNikoYnl0ZXN0ci0+bGVuKSkpOwogCW1lbWNweShwc3RyLT5kYXRhLCBieXRlc3RyLT5kYXRhLCBwc3RyLT5sZW4pOwogCURCRkVYSVQ7CiB9CkBAIC0zMzQ5LDExICs5MTcsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cihVSU5UOCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pCit2b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cih1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pCiB7CiAJREJGRU5URVI7CiAKLQlwc3RyLT5sZW4gPSAoVUlOVDgpbGVuOworCXBzdHItPmxlbiA9ICh1OClsZW47CiAJbWVtY3B5KHBzdHItPmRhdGEsIGJ5dGVhcmVhLCBsZW4pOwogCURCRkVYSVQ7CiB9CkBAIC0zMzczLDExICs5NDEsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludChVSU5UMTYgKnByaXNtMmludCwgVUlOVDMyICp3bGFuaW50KQordm9pZCBwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQodTE2ICpwcmlzbTJpbnQsIHUzMiAqd2xhbmludCkKIHsKIAlEQkZFTlRFUjsKIAotCSp3bGFuaW50ID0gKFVJTlQzMiloZmEzODR4Mmhvc3RfMTYoKnByaXNtMmludCk7CisJKndsYW5pbnQgPSAodTMyKWhmYTM4NHgyaG9zdF8xNigqcHJpc20yaW50KTsKIAlEQkZFWElUOwogfQogCkBAIC0zMzk2LDExICs5NjQsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludChVSU5UMTYgKnByaXNtMmludCwgVUlOVDMyICp3bGFuaW50KQordm9pZCBwcmlzbTJtZ210X3A4MDIxMWludDJwcmlzbTJpbnQodTE2ICpwcmlzbTJpbnQsIHUzMiAqd2xhbmludCkKIHsKIAlEQkZFTlRFUjsKIAotCSpwcmlzbTJpbnQgPSBob3N0MmhmYTM4NHhfMTYoKFVJTlQxNikoKndsYW5pbnQpKTsKKwkqcHJpc20yaW50ID0gaG9zdDJoZmEzODR4XzE2KCh1MTYpKCp3bGFuaW50KSk7CiAJREJGRVhJVDsKIH0KIApAQCAtMzQxOSw3ICs5ODcsNyBAQAogKglOb3RoaW5nCiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20ybWdtdF9wcmlzbTJlbnVtMnA4MDIxMWVudW0oVUlOVDE2ICpwcmlzbTJlbnVtLCBVSU5UMzIgKndsYW5lbnVtLCBVSU5UMTYgcmlkKQordm9pZCBwcmlzbTJtZ210X3ByaXNtMmVudW0ycDgwMjExZW51bSh1MTYgKnByaXNtMmVudW0sIHUzMiAqd2xhbmVudW0sIHUxNiByaWQpCiB7CiAJREJGRU5URVI7CiAKQEAgLTM0NDUsNyArMTAxMyw3IEBACiAqCU5vdGhpbmcKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJtZ210X3A4MDIxMWVudW0ycHJpc20yZW51bShVSU5UMTYgKnByaXNtMmVudW0sIFVJTlQzMiAqd2xhbmVudW0sIFVJTlQxNiByaWQpCit2b2lkIHByaXNtMm1nbXRfcDgwMjExZW51bTJwcmlzbTJlbnVtKHUxNiAqcHJpc20yZW51bSwgdTMyICp3bGFuZW51bSwgdTE2IHJpZCkKIHsKIAlEQkZFTlRFUjsKIApAQCAtMzQ3MSwxMCArMTAzOSwxMCBAQAogKglOb3RoaW5nCiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20ybWdtdF9nZXRfb3ByYXRlc2V0KFVJTlQxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cikKK3ZvaWQgcHJpc20ybWdtdF9nZXRfb3ByYXRlc2V0KHUxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cikKIHsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJKmRhdGFyYXRlOworCXU4CWxlbjsKKwl1OAkqZGF0YXJhdGU7CiAKIAlEQkZFTlRFUjsKIApAQCAtMzQ4MywyOSArMTA1MSwyOSBAQAogCiAgCS8qIDEgTWJwcyAqLwogCWlmICggQklUMCAmICgqcmF0ZSkgKSB7Ci0JCWxlbiArPSAoVUlOVDgpMTsKLQkJKmRhdGFyYXRlID0gKFVJTlQ4KTI7CisJCWxlbiArPSAodTgpMTsKKwkJKmRhdGFyYXRlID0gKHU4KTI7CiAJCWRhdGFyYXRlKys7CiAJfQogCiAgCS8qIDIgTWJwcyAqLwogCWlmICggQklUMSAmICgqcmF0ZSkgKSB7Ci0JCWxlbiArPSAoVUlOVDgpMTsKLQkJKmRhdGFyYXRlID0gKFVJTlQ4KTQ7CisJCWxlbiArPSAodTgpMTsKKwkJKmRhdGFyYXRlID0gKHU4KTQ7CiAJCWRhdGFyYXRlKys7CiAJfQogCiAgCS8qIDUuNSBNYnBzICovCiAJaWYgKCBCSVQyICYgKCpyYXRlKSApIHsKLQkJbGVuICs9IChVSU5UOCkxOwotCQkqZGF0YXJhdGUgPSAoVUlOVDgpMTE7CisJCWxlbiArPSAodTgpMTsKKwkJKmRhdGFyYXRlID0gKHU4KTExOwogCQlkYXRhcmF0ZSsrOwogCX0KIAogIAkvKiAxMSBNYnBzICovCiAJaWYgKCBCSVQzICYgKCpyYXRlKSApIHsKLQkJbGVuICs9IChVSU5UOCkxOwotCQkqZGF0YXJhdGUgPSAoVUlOVDgpMjI7CisJCWxlbiArPSAodTgpMTsKKwkJKmRhdGFyYXRlID0gKHU4KTIyOwogCQlkYXRhcmF0ZSsrOwogCX0KIApAQCAtMzUzMCw5ICsxMDk4LDkgQEAKICoJTm90aGluZwogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMm1nbXRfc2V0X29wcmF0ZXNldChVSU5UMTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpCit2b2lkIHByaXNtMm1nbXRfc2V0X29wcmF0ZXNldCh1MTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpCiB7Ci0JVUlOVDgJKmRhdGFyYXRlOworCXU4CSpkYXRhcmF0ZTsKIAlpbnQJaTsKIAogCURCRkVOVEVSOwpAQCAtMzU2NSwyMzMgKzExMzMsMyBAQAogCURCRkVYSVQ7CiAJcmV0dXJuOwogfQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIKLSoKLSogUmV0cmlldmVzIGEgcGFydGljdWxhciBncm91cCBhZGRyZXNzIGZyb20gdGhlIGxpc3Qgb2YKLSogZ3JvdXAgYWRkcmVzc2VzLgotKgotKiBBcmd1bWVudHM6Ci0qCWRpZAkJbWliaXRlbSBkaWQKLSoJcHN0cgkJd2xhbiBvY3RldCBzdHJpbmcKLSoJcHJpdgkJcHJpc20yIGRyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJtZ210X2dldF9ncnBhZGRyKFVJTlQzMiBkaWQsIHA4MDIxMXBzdHJkX3QgKnBzdHIsCi0JaGZhMzg0eF90ICpodyApCi17Ci0JaW50CWluZGV4OwotCi0JREJGRU5URVI7Ci0KLQlpbmRleCA9IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgoZGlkKTsKLQotCWlmICggaW5kZXggPj0gMCApIHsKLQkJcHN0ci0+bGVuID0gV0xBTl9BRERSX0xFTjsKLQkJbWVtY3B5KHBzdHItPmRhdGEsIGh3LT5kb3QxMV9ncnBfYWRkcltpbmRleF0sCi0JCQlXTEFOX0FERFJfTEVOKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3NldF9ncnBhZGRyCi0qCi0qIENvbnZlcnQgdGhlIHdsYW4gb2N0ZXQgc3RyaW5nIGludG8gYW4gaGZhMzg0eCBiaXQgYXJlYS4KLSoKLSogQXJndW1lbnRzOgotKglkaWQJCW1pYml0ZW0gZGlkCi0qCWJ1ZgotKglncm91cHMKLSoKLSogUmV0dXJuczoKLSoJMAlTdWNjZXNzCi0qCSEwCUVycm9yCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3NldF9ncnBhZGRyKFVJTlQzMiBkaWQsIFVJTlQ4ICpwcmlzbTJidWYsCi0JcDgwMjExcHN0cmRfdCAqcHN0ciwgaGZhMzg0eF90ICpodyApCi17Ci0JVUlOVDgJbm9fYWRkcltXTEFOX0FERFJfTEVOXTsKLQlpbnQJaW5kZXg7Ci0KLQlEQkZFTlRFUjsKLQotCW1lbXNldChub19hZGRyLCAwLCBXTEFOX0FERFJfTEVOKTsKLQlpZiAobWVtY21wKG5vX2FkZHIsIHBzdHItPmRhdGEsIFdMQU5fQUREUl9MRU4pICE9IDApIHsKLQotCQkvKgotCQkqKiBUaGUgYWRkcmVzcyBpcyBOT1QgMCBzbyB3ZSBhcmUgImFkZGluZyIgYW4gYWRkcmVzcyB0byB0aGUKLQkJKiogZ3JvdXAgYWRkcmVzcyBsaXN0LiAgQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCB0cnlpbmcKLQkJKiogdG8gYWRkIG1vcmUgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBncm91cAotCQkqKiBhZGRyZXNzZXMgaW4gdGhlIGxpc3QuICBUaGUgbmV3IGFkZHJlc3MgaXMgYWRkZWQgdG8gdGhlCi0JCSoqIGVuZCBvZiB0aGUgbGlzdCByZWdhcmRsZXNzIG9mIHRoZSBESUQgdXNlZCB0byBhZGQgdGhlCi0JCSoqIGFkZHJlc3MuCi0JCSovCi0KLQkJaWYgKGh3LT5kb3QxMV9ncnBjbnQgPj0gTUFYX0dSUF9BRERSKSByZXR1cm4oLTEpOwotCi0JCW1lbWNweShody0+ZG90MTFfZ3JwX2FkZHJbaHctPmRvdDExX2dycGNudF0sIHBzdHItPmRhdGEsCi0JCQkJCQkJCSBXTEFOX0FERFJfTEVOKTsKLQkJaHctPmRvdDExX2dycGNudCArPSAxOwotCX0gZWxzZSB7Ci0KLQkJLyoKLQkJKiogVGhlIGFkZHJlc3MgaXMgMC4gIEludGVycHJldCB0aGlzIGFzICJkZWxldGluZyIgYW4gYWRkcmVzcwotCQkqKiBmcm9tIHRoZSBncm91cCBhZGRyZXNzIGxpc3QuICBHZXQgdGhlIGFkZHJlc3MgaW5kZXggZnJvbQotCQkqKiB0aGUgRElELiAgSWYgdGhpcyBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHVzZWQgYWRkcmVzc2VzLAotCQkqKiB0aGVuIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYnkgc2hpZnRpbmcgYWxsIGZvbGxvd2luZwotCQkqKiBhZGRyZXNzZXMgZG93bi4gIFRoZW4gY2xlYXIgdGhlIGxhc3QgYWRkcmVzcyAod2hpY2ggc2hvdWxkCi0JCSoqIG5vdyBiZSB1bnVzZWQpLiAgSWYgdGhlIGFkZHJlc3MgaW5kZXggaXMgTk9UIHdpdGhpbiB0aGUKLQkJKiogcmFuZ2Ugb2YgdXNlZCBhZGRyZXNzZXMsIHRoZW4ganVzdCBpZ25vcmUgdGhlIGFkZHJlc3MuCi0JCSovCi0KLQkJaW5kZXggPSBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4KGRpZCk7Ci0JCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgaHctPmRvdDExX2dycGNudCkgewotCQkJaHctPmRvdDExX2dycGNudCAtPSAxOwotCQkJbWVtbW92ZShody0+ZG90MTFfZ3JwX2FkZHJbaW5kZXhdLAotCQkJCWh3LT5kb3QxMV9ncnBfYWRkcltpbmRleCArIDFdLAotCQkJCSgoaHctPmRvdDExX2dycGNudCktaW5kZXgpICogV0xBTl9BRERSX0xFTik7Ci0JCQltZW1zZXQoaHctPmRvdDExX2dycF9hZGRyW2h3LT5kb3QxMV9ncnBjbnRdLCAwLAotCQkJCQkJCQkgV0xBTl9BRERSX0xFTik7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybigwKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9nZXRfZ3JwYWRkcl9pbmRleAotKgotKiBHZXRzIHRoZSBpbmRleCBpbiB0aGUgZ3JvdXAgYWRkcmVzcyBsaXN0IGJhc2VkIG9uIHRoZSBkaWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJZGlkCQltaWJpdGVtIGRpZAotKgotKiBSZXR1cm5zOgotKgk+PSAwCUlmIHZhbGlkIGRpZAotKgk8IDAJSWYgbm90IHZhbGlkIGRpZAotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcl9pbmRleCggVUlOVDMyIGRpZCApCi17Ci0JaW50CWluZGV4OwotCi0JREJGRU5URVI7Ci0KLQlpbmRleCA9IC0xOwotCi0Jc3dpdGNoIChkaWQpIHsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMToKLQkJaW5kZXggPSAwOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjoKLQkJaW5kZXggPSAxOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzoKLQkJaW5kZXggPSAyOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNDoKLQkJaW5kZXggPSAzOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNToKLQkJaW5kZXggPSA0OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNjoKLQkJaW5kZXggPSA1OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNzoKLQkJaW5kZXggPSA2OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzODoKLQkJaW5kZXggPSA3OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzOToKLQkJaW5kZXggPSA4OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTA6Ci0JCWluZGV4ID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczExOgotCQlpbmRleCA9IDEwOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTI6Ci0JCWluZGV4ID0gMTE7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMzoKLQkJaW5kZXggPSAxMjsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE0OgotCQlpbmRleCA9IDEzOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTU6Ci0JCWluZGV4ID0gMTQ7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNjoKLQkJaW5kZXggPSAxNTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE3OgotCQlpbmRleCA9IDE2OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTg6Ci0JCWluZGV4ID0gMTc7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOToKLQkJaW5kZXggPSAxODsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIwOgotCQlpbmRleCA9IDE5OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjE6Ci0JCWluZGV4ID0gMjA7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMjoKLQkJaW5kZXggPSAyMTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIzOgotCQlpbmRleCA9IDIyOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjQ6Ci0JCWluZGV4ID0gMjM7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNToKLQkJaW5kZXggPSAyNDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI2OgotCQlpbmRleCA9IDI1OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjc6Ci0JCWluZGV4ID0gMjY7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyODoKLQkJaW5kZXggPSAyNzsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI5OgotCQlpbmRleCA9IDI4OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzA6Ci0JCWluZGV4ID0gMjk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMToKLQkJaW5kZXggPSAzMDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMyOgotCQlpbmRleCA9IDMxOwotCQlicmVhazsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiBpbmRleDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKaW5kZXggMThhYTE1Zi4uYjI3OWM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKQEAgLTU0LDE2ICs1NCw5IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KICNkZWZpbmUgV0xBTl9EQlZBUglwcmlzbTJfZGVidWcKIAotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMjUpKQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTcxLDM0ICs2NCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLSNpbmNsdWRlIDxsaW51eC90cXVldWUuaD4KLSNlbHNlCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgotI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KLSNlbmRpZgotCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIAotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkpCi0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jZW5kaWYKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFByb2plY3QgSW5jbHVkZXMgKi8KIApAQCAtMTI2LDM0ICsxMDAsNyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotI2RlZmluZSBEUklWRVJfU1VGRklYCSJfY3MiCi0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpCi0jZGVmaW5lIERSSVZFUl9TVUZGSVgJIl9wbHgiCi10eXBlZGVmIGNoYXIqIGRldl9pbmZvX3Q7Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0jZGVmaW5lIERSSVZFUl9TVUZGSVgJIl9wY2kiCi10eXBlZGVmIGNoYXIqIGRldl9pbmZvX3Q7Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCi0jZGVmaW5lIERSSVZFUl9TVUZGSVgJIl91c2IiCi10eXBlZGVmIGNoYXIqIGRldl9pbmZvX3Q7Ci0jZWxzZQotI2Vycm9yICJIT1NUSUYgdW5zdXBwb3J0ZWQgb3IgdW5kZWZpbmVkISIKLSNlbmRpZgotCi1zdGF0aWMgY2hhcgkJKnZlcnNpb24gPSAicHJpc20yIiBEUklWRVJfU1VGRklYICIubzogIiBXTEFOX1JFTEVBU0U7Ci1zdGF0aWMgZGV2X2luZm9fdAlkZXZfaW5mbyA9ICJwcmlzbTIiIERSSVZFUl9TVUZGSVg7Ci0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFggfHwgV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHByaXNtMnN0YV9zdXNwZW5kX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX3Jlc3VtZV9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQotI2VuZGlmIC8qIFdMQU5fUENJICovCitzdGF0aWMgY2hhciAqZGV2X2luZm8gPSAicHJpc20yX3VzYiI7CiAKIHN0YXRpYyB3bGFuZGV2aWNlX3QgKmNyZWF0ZV93bGFuKHZvaWQpOwogCkBAIC0xNjMsMTYgKzExMCw3IEBACiBpbnQgICAgICBwcmlzbTJfcmVzZXRfaG9sZHRpbWU9MzA7CS8qIFJlc2V0IGhvbGQgdGltZSBpbiBtcyAqLwogaW50CSBwcmlzbTJfcmVzZXRfc2V0dGxldGltZT0xMDA7CS8qIFJlc2V0IHNldHRsZSB0aW1lIGluIG1zICovCiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiBzdGF0aWMgaW50CXByaXNtMl9kb3Jlc2V0PTA7CQkvKiBEbyBhIHJlc2V0IGF0IGluaXQ/ICovCi0jZWxzZQotc3RhdGljIGludCAgICAgIHByaXNtMl9kb3Jlc2V0PTE7CQkvKiBEbyBhIHJlc2V0IGF0IGluaXQ/ICovCi1pbnQgICAgICAgICAgICAgcHJpc20yX2JhcF90aW1lb3V0PTEwMDA7ICAgICAgICAvKiBCQVAgdGltZW91dCAqLwotaW50CQlwcmlzbTJfaXJxX2V2cmVhZF9tYXg9MjA7CS8qIE1heGltdW0gbnVtYmVyIG9mCi0JCQkJCQkgKiBldl9yZWFkcyAobG9vcHMpCi0JCQkJCQkgKiBpbiBpcnEgaGFuZGxlcgotCQkJCQkJICovCi0jZW5kaWYKIAogI2lmZGVmIFdMQU5fSU5DTFVERV9ERUJVRwogaW50IHByaXNtMl9kZWJ1Zz0wOwpAQCAtMTg4LDEzICsxMjYsNiBAQAogbW9kdWxlX3BhcmFtKCBwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAicmVzZXQgc2V0dGxlIHRpbWUgaW4gbXMiKTsKIAotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLW1vZHVsZV9wYXJhbSggcHJpc20yX2JhcF90aW1lb3V0LCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhwcmlzbTJfYmFwX3RpbWVvdXQsICJCdWZmZXJBY2Nlc3NQYXRoIFRpbWVvdXQgaW4gMTAqbiB1cyIpOwotbW9kdWxlX3BhcmFtKCBwcmlzbTJfaXJxX2V2cmVhZF9tYXgsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKCBwcmlzbTJfaXJxX2V2cmVhZF9tYXgsICJNYXhpbWltIG51bWJlciBvZiBldmVudCByZWFkcyBpbiBpbnRlcnJ1cHQgaGFuZGxlciIpOwotI2VuZGlmCi0KIE1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTIzMSwxNyArMTYyLDYgQEAKIHN0YXRpYyB2b2lkCXByaXNtMnN0YV9pbmZfcHN1c2VyY250KAogCQkJd2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGludAotcHJpc20yc3RhX3Byb2NfcmVhZCgKLQljaGFyCSpwYWdlLAotCWNoYXIJKipzdGFydCwKLQlvZmZfdAlvZmZzZXQsCi0JaW50CWNvdW50LAotCWludAkqZW9mLAotCXZvaWQJKmRhdGEpOwotI2VuZGlmCi0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwogCkBAIC0yNjcsNyArMTg3LDcgQEAKIAlpbnQgYzsKIAlmb3IgKCBjPSAwOyBjIDwgbjsgYysrKSB7CiAJCWlmICggKGMgJSAxNikgPT0gMCApIHByaW50ayhLRVJOX0RFQlVHImRtcFslZF06ICIsIGMpOwotCQlwcmludGsoIiUwMnggIiwgKChVSU5UOCopYnVmKVtjXSk7CisJCXByaW50aygiJTAyeCAiLCAoKHU4KilidWYpW2NdKTsKIAkJaWYgKCAoYyAlIDE2KSA9PSAxNSApIHByaW50aygiXG4iKTsKIAl9CiAJaWYgKCAoYyAlIDE2KSAhPSAwICkgcHJpbnRrKCJcbiIpOwpAQCAtMjk5LDEwICsyMTksNiBAQAogewogCURCRkVOVEVSOwogCi0jaWZkZWYgQU5DSUVOVF9NT0RVTEVfQ09ERQotCU1PRF9JTkNfVVNFX0NPVU5UOwotI2VuZGlmCi0KIAkvKiBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSB0byBkbyBhbnl0aGluZyBlbHNlLgogCSAqIFRoZSBzZXR1cCBvZiB0aGUgTUFDIHNob3VsZCBiZSBzdWJzZXF1ZW50bHkgY29tcGxldGVkIHZpYQogCSAqIHRoZSBtbG1lIGNvbW1hbmRzLgpAQCAtMzQxLDEwICsyNTcsNiBAQAogewogCURCRkVOVEVSOwogCi0jaWZkZWYgQU5DSUVOVF9NT0RVTEVfQ09ERQotCU1PRF9ERUNfVVNFX0NPVU5UOwotI2VuZGlmCi0KIAkvKiBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSB0byBkbyBhbnl0aGluZyBlbHNlLgogCSAqIEhpZ2hlciBsYXllcnMga25vdyB3ZSdyZSBub3QgcmVhZHkgZnJvbSBkZXYtPnN0YXJ0PT0wIGFuZAogCSAqIGRldi0+dGJ1c3k9PTEuICBPdXIgcnggcGF0aCBrbm93cyB0byBub3QgcGFzcyB1cCByZWNlaXZlZApAQCAtNDYzLDEwICszNzUsNiBAQAogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtaWJzZXQgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfbWlic2V0X21pYmdldCh3bGFuZGV2LCBtc2cpOwogCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXQgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBwb3dlcm1nbXQgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfcG93ZXJtZ210KHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwogCWNhc2UgRElEbXNnX2RvdDExcmVxX3NjYW4gOgogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBzY2FuIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X3NjYW4od2xhbmRldiwgbXNnKTsKQEAgLTQ3NSwzNCArMzgzLDYgQEAKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgc2Nhbl9yZXN1bHRzIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyh3bGFuZGV2LCBtc2cpOwogCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9qb2luIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgam9pbiByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9qb2luKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIGF1dGhlbnRpY2F0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXRoZW50aWNhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGRlYXV0aGVudGljYXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2RlYXV0aGVudGljYXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgYXNzb2NpYXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2Fzc29jaWF0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgcmVhc3NvY2lhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfcmVhc3NvY2lhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBkaXNhc3NvY2lhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfZGlzYXNzb2NpYXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX3Jlc2V0IDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSByZXNldCByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9yZXNldCh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKIAljYXNlIERJRG1zZ19kb3QxMXJlcV9zdGFydCA6CiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgc3RhcnQgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfc3RhcnQod2xhbmRldiwgbXNnKTsKQEAgLTUxMCw0NiArMzkwLDEwIEBACiAJLyoKIAkgKiBQcmlzbTIgc3BlY2lmaWMgbWVzc2FnZXMKIAkgKi8KLQljYXNlIERJRG1zZ19wMnJlcV9qb2luIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgcDIgam9pbiByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9wMl9qb2luKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwogICAgICAgIAljYXNlIERJRG1zZ19wMnJlcV9yZWFkcGRhIDoKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSByZWFkcGRhIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X3JlYWRwZGEod2xhbmRldiwgbXNnKTsKIAkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfcmVhZGNpcyA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgcmVhZGNpcyByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9yZWFkY2lzKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2F1eHBvcnRfc3RhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGF1eHBvcnRfc3RhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfYXV4cG9ydF9zdGF0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWQgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGF1eHBvcnRfcmVhZCByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXhwb3J0X3JlYWQod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfYXV4cG9ydF93cml0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgYXV4cG9ydF93cml0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXhwb3J0X3dyaXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2xvd19sZXZlbCA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgbG93X2xldmVsIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2xvd19sZXZlbCh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kIDoKLSAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIHRlc3RfY29tbWFuZCByZXF1ZXN0XG4iKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBwcmlzbTJtZ210X3Rlc3RfY29tbWFuZCh3bGFuZGV2LCBtc2cpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJRG1zZ19wMnJlcV9tbWlfcmVhZCA6Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBtbWlfcmVhZCByZXF1ZXN0XG4iKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBwcmlzbTJtZ210X21taV9yZWFkKHdsYW5kZXYsIG1zZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRElEbXNnX3AycmVxX21taV93cml0ZSA6Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBtbWlfd3JpdGUgcmVxdWVzdFxuIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJpc20ybWdtdF9tbWlfd3JpdGUod2xhbmRldiwgbXNnKTsKLSAgICAgICAgICAgICAgICBicmVhazsKIAljYXNlIERJRG1zZ19wMnJlcV9yYW1kbF9zdGF0ZSA6CiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgcmFtZGxfc3RhdGUgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfcmFtZGxfc3RhdGUod2xhbmRldiwgbXNnKTsKQEAgLTU2NiwxOCArNDEwLDYgQEAKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBmbGFzaGRsX3dyaXRlIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X2ZsYXNoZGxfd3JpdGUod2xhbmRldiwgbXNnKTsKIAkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfZHVtcF9zdGF0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgZHVtcF9zdGF0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9kdW1wX3N0YXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mbyA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgY2hhbm5lbF9pbmZvIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2NoYW5uZWxfaW5mbyh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0cyA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgY2hhbm5lbF9pbmZvX3Jlc3VsdHMgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvX3Jlc3VsdHMod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7CiAJLyoKIAkgKiBMaW51eCBzcGVjaWZpYyBtZXNzYWdlcwogCSAqLwpAQCAtNjAzLDE4ICs0MzUsMTEgQEAKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBhdXRvam9pbiByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXRvam9pbih3bGFuZGV2LCBtc2cpOwogCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9lbmFibGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGVuYWJsZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9lbmFibGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7CiAJY2FzZSBESURtc2dfbG54cmVxX2NvbW1zcXVhbGl0eTogewogCQlwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eV90ICpxdWFsbXNnOwogCiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIGNvbW1zcXVhbGl0eSByZXF1ZXN0XG4iKTsKIAotCQlpZiAoaHctPmFwKQotCQkJYnJlYWs7Ci0KIAkJcXVhbG1zZyA9IChwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eV90KikgbXNnOwogCiAJCXF1YWxtc2ctPmxpbmsuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwpAQCAtNjU5LDEwICs0ODQsMTAgQEAKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotVUlOVDMyIHByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDMyIGlmc3RhdGUpCit1MzIgcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgaWZzdGF0ZSkKIHsKICAgICAgICAgaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3ID0gKGhmYTM4NHhfdCAqKXdsYW5kZXYtPnByaXY7Ci0JVUlOVDMyIAkJCXJlc3VsdDsKKwl1MzIgCQkJcmVzdWx0OwogCURCRkVOVEVSOwogCiAJcmVzdWx0ID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CkBAIC02NzksOSArNTA0LDYgQEAKIAkJCSAqIEluaXRpYWxpemUgdGhlIGRldmljZStkcml2ZXIgc3VmZmljaWVudGx5CiAJCQkgKiBmb3IgZmlybXdhcmUgbG9hZGluZy4KIAkJCSAqLwotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQkJCXJlc3VsdD1oZmEzODR4X2NtZF9pbml0aWFsaXplKGh3KTsKLSNlbHNlCiAJCQlpZiAoKHJlc3VsdD1oZmEzODR4X2RydnJfc3RhcnQoaHcpKSkgewogCQkJCVdMQU5fTE9HX0VSUk9SKAogCQkJCQkiaGZhMzg0eF9kcnZyX3N0YXJ0KCkgZmFpbGVkLCIKQEAgLTY5MSw3ICs1MTMsNiBAQAogCQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwogCQkJCWJyZWFrOwogCQkJfQotI2VuZGlmCiAJCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0ZXTE9BRDsKIAkJCXJlc3VsdCA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwogCQkJYnJlYWs7CkBAIC04NDEsOCArNjYyLDggQEAKIHsKIAlpbnQgCQkJcmVzdWx0ID0gMDsKICAgICAgICAgaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3ID0gKGhmYTM4NHhfdCAqKXdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2ICAgICAgICAgICAgICAgICAgdGVtcDsKLQlVSU5UOAkJCXNudW1bSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTl07CisJdTE2ICAgICAgICAgICAgICAgICAgdGVtcDsKKwl1OAkJCXNudW1bSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTl07CiAJY2hhcgkJCXBzdHJbKEhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4gKiA0KSArIDFdOwogCiAJREJGRU5URVI7CkBAIC05MDcsMjAgKzcyOCwyMCBAQAogCiAJLyogc3RyaXAgb3V0IHRoZSAnc3BlY2lhbCcgdmFyaWFudCBiaXRzICovCiAJaHctPm1tX21vZHMgPSBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQgJiAoQklUMTQgfCBCSVQxNSk7Ci0JaHctPmlkZW50X3N0YV9mdy52YXJpYW50ICY9IH4oKFVJTlQxNikoQklUMTQgfCBCSVQxNSkpOworCWh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmPSB+KCh1MTYpKEJJVDE0IHwgQklUMTUpKTsKIAogCWlmICAoIGh3LT5pZGVudF9zdGFfZncuaWQgPT0gMHgxZiApIHsKLQkJaHctPmFwID0gMDsKIAkJV0xBTl9MT0dfSU5GTygKIAkJCSJpZGVudDogc3RhIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAogCQkJaHctPmlkZW50X3N0YV9mdy5pZCwgaHctPmlkZW50X3N0YV9mdy5tYWpvciwKIAkJCWh3LT5pZGVudF9zdGFfZncubWlub3IsIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCk7CiAJfSBlbHNlIHsKLQkJaHctPmFwID0gMTsKIAkJV0xBTl9MT0dfSU5GTygKIAkJCSJpZGVudDogIGFwIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAogCQkJaHctPmlkZW50X3N0YV9mdy5pZCwgaHctPmlkZW50X3N0YV9mdy5tYWpvciwKIAkJCWh3LT5pZGVudF9zdGFfZncubWlub3IsIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCk7CisJCVdMQU5fTE9HX0VSUk9SKCJVbnN1cHBvcnRlZCBUZXJ0aWFyeSBBUCBmaXJtZWFyZSBsb2FkZWQhXG4iKTsKKwkJZ290byBmYWlsZWQ7CiAJfQogCiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgTW9kZW0gc3VwcGxpZXIgKi8KQEAgLTExNjgsNyArOTg5LDcgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAloZmEzODR4X3QgICAgICAgICAgICAgICAqaHcgPSAoaGZhMzg0eF90ICopd2xhbmRldi0+cHJpdjsKIAotCVVJTlQxNiAgcHJvbWlzYzsKKwl1MTYgIHByb21pc2M7CiAKIAlEQkZFTlRFUjsKIApAQCAtMTE3NiwxMCArOTk3LDYgQEAKIAlpZiAoIGh3LT5zdGF0ZSAhPSBIRkEzODR4X1NUQVRFX1JVTk5JTkcgKQogCQlnb3RvIGV4aXQ7CiAKLQkvKiBJZiB3ZSdyZSBhbiBBUCwgZG8gbm90aGluZyBoZXJlICovCi0JaWYgKGh3LT5hcCkKLQkJZ290byBleGl0OwotCiAJaWYgKCAoZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQyB8IElGRl9BTExNVUxUSSkpICE9IDAgKQogCQlwcm9taXNjID0gUDgwMjExRU5VTV90cnV0aF90cnVlOwogCWVsc2UKQEAgLTEyNDcsOSArMTA2NCw5IEBACiBzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3RhbGxpZXMod2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKIHsKICAgICAgICAgaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3ID0gKGhmYTM4NHhfdCAqKXdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJKnNyYzE2OwotCVVJTlQzMgkJCSpkc3Q7Ci0JVUlOVDMyCQkJKnNyYzMyOworCXUxNgkJCSpzcmMxNjsKKwl1MzIJCQkqZHN0OworCXUzMgkJCSpzcmMzMjsKIAlpbnQJCQlpOwogCWludAkJCWNudDsKIApAQCAtMTI2MCwxNSArMTA3NywxNSBAQAogCSoqIHJlY29yZCBsZW5ndGggb2YgdGhlIGluZm8gcmVjb3JkLgogCSovCiAKLQljbnQgPSBzaXplb2YoaGZhMzg0eF9Db21tVGFsbGllczMyX3QpIC8gc2l6ZW9mKFVJTlQzMik7CisJY250ID0gc2l6ZW9mKGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90KSAvIHNpemVvZih1MzIpOwogCWlmIChpbmYtPmZyYW1lbGVuID4gMjIpIHsKLQkJZHN0ICAgPSAoVUlOVDMyICopICZody0+dGFsbGllczsKLQkJc3JjMzIgPSAoVUlOVDMyICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMzMjsKKwkJZHN0ICAgPSAodTMyICopICZody0+dGFsbGllczsKKwkJc3JjMzIgPSAodTMyICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMzMjsKIAkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBkc3QrKywgc3JjMzIrKykKIAkJCSpkc3QgKz0gaGZhMzg0eDJob3N0XzMyKCpzcmMzMik7CiAJfSBlbHNlIHsKLQkJZHN0ICAgPSAoVUlOVDMyICopICZody0+dGFsbGllczsKLQkJc3JjMTYgPSAoVUlOVDE2ICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMxNjsKKwkJZHN0ICAgPSAodTMyICopICZody0+dGFsbGllczsKKwkJc3JjMTYgPSAodTE2ICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMxNjsKIAkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBkc3QrKywgc3JjMTYrKykKIAkJCSpkc3QgKz0gaGZhMzg0eDJob3N0XzE2KCpzcmMxNik7CiAJfQpAQCAtMTMwOCw3ICsxMTI1LDcgQEAKIAlEQkZFTlRFUjsKIAogCS8qIEdldCB0aGUgbnVtYmVyIG9mIHJlc3VsdHMsIGZpcnN0IGluIGJ5dGVzLCB0aGVuIGluIHJlc3VsdHMgKi8KLQluYnNzID0gKGluZi0+ZnJhbWVsZW4gKiBzaXplb2YoVUlOVDE2KSkgLQorCW5ic3MgPSAoaW5mLT5mcmFtZWxlbiAqIHNpemVvZih1MTYpKSAtCiAJCXNpemVvZihpbmYtPmluZm90eXBlKSAtCiAJCXNpemVvZihpbmYtPmluZm8uc2NhbnJlc3VsdC5zY2FucmVhc29uKTsKIAluYnNzIC89IHNpemVvZihoZmEzODR4X1NjYW5SZXN1bHRTdWJfdCk7CkBAIC0xNTAwLDcgKzEzMTcsNyBAQAogCiAJCS8qIERvbid0IGNhbGwgdGhpcyBpbiBtb25pdG9yIG1vZGUgKi8KIAkJaWYgKCB3bGFuZGV2LT5uZXRkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSICkgewotCQkJVUlOVDE2CQkJcG9ydHN0YXR1czsKKwkJCXUxNgkJCXBvcnRzdGF0dXM7CiAKIAkJCVdMQU5fTE9HX0lORk8oImxpbmtzdGF0dXM9Q09OTkVDVEVEXG4iKTsKIApAQCAtMTgzNiw3ICsxNjUzLDcgQEAKIAloZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YV90ICByZWM7CiAKIAlpbnQgICAgaSwgYWRkZWQsIHJlc3VsdCwgY250OwotCVVJTlQ4ICAqYWRkcjsKKwl1OCAgKmFkZHI7CiAKIAlEQkZFTlRFUjsKIApAQCAtMjE2Myw3ICsxOTgwLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgc3RhdHVzKQordm9pZCBwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKQogewogCURCRkVOVEVSOwogCkBAIC0yMTkwLDcgKzIwMDcsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiBzdGF0dXMpCit2b2lkIHByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpCiB7CiAJREJGRU5URVI7CiAJV0xBTl9MT0dfREVCVUcoNCwgIlR4IENvbXBsZXRlLCBzdGF0dXM9MHglMDR4XG4iLCBzdGF0dXMpOwpAQCAtMjI0Nyw0NyArMjA2NCwxMiBAQAogewogCURCRkVOVEVSOwogCi0JcDgwMjExbmV0ZGV2X3dha2VfcXVldWUod2xhbmRldik7CisJbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCiAJREJGRVhJVDsKIAlyZXR1cm47CiB9CiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFggfHwgV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHByaXNtMnN0YV9zdXNwZW5kX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotICAgICAgIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyogcmVzZXQgaGFyZHdhcmUgKi8KLQlpZiAod2xhbmRldikgewotCQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0JCXA4MDIxMV9zdXNwZW5kKHdsYW5kZXYpOwotCX0KLQotCS8vIGNhbGwgYSBuZXRpZl9kZXZpY2VfZGV0YWNoKHdsYW5kZXYtPm5ldGRldikgPwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJpc20yc3RhX3Jlc3VtZV9wY2kgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotICAgICAgIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKHdsYW5kZXYpIHsKLQkJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCQlwODAyMTFfcmVzdW1lKHdsYW5kZXYpOwotCX0KLQotICAgICAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotI2VuZGlmCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBjcmVhdGVfd2xhbgogKgpAQCAtMjMzNCw5ICsyMTE2LDYgQEAKIAl3bGFuZGV2LT5vcGVuID0gcHJpc20yc3RhX29wZW47CiAJd2xhbmRldi0+Y2xvc2UgPSBwcmlzbTJzdGFfY2xvc2U7CiAJd2xhbmRldi0+cmVzZXQgPSBwcmlzbTJzdGFfcmVzZXQ7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQl3bGFuZGV2LT5uc2RfcHJvY19yZWFkID0gcHJpc20yc3RhX3Byb2NfcmVhZDsKLSNlbmRpZgogCXdsYW5kZXYtPnR4ZnJhbWUgPSBwcmlzbTJzdGFfdHhmcmFtZTsKIAl3bGFuZGV2LT5tbG1lcmVxdWVzdCA9IHByaXNtMnN0YV9tbG1lcmVxdWVzdDsKIAl3bGFuZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBwcmlzbTJzdGFfc2V0bXVsdGljYXN0OwpAQCAtMjM1MSw3NSArMjEzMCw2IEBACiAJcmV0dXJuIHdsYW5kZXY7CiB9CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGludAotcHJpc20yc3RhX3Byb2NfcmVhZCgKLQljaGFyCSpwYWdlLAotCWNoYXIJKipzdGFydCwKLQlvZmZfdAlvZmZzZXQsCi0JaW50CWNvdW50LAotCWludAkqZW9mLAotCXZvaWQJKmRhdGEpCi17Ci0JY2hhcgkgKnAgPSBwYWdlOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgZGF0YTsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKSB3bGFuZGV2LT5wcml2OwotCi0JVUlOVDE2IGh3dHlwZSA9IDA7Ci0KLQlEQkZFTlRFUjsKLQlpZiAob2Zmc2V0ICE9IDApIHsKLQkJKmVvZiA9IDE7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvLyBYWFggMHgwMDAxIGZvciBwcmlzbTIuNS8zLCAweDAwMDAgZm9yIHByaXNtMi4KLQlod3R5cGUgPSBCSVQwOwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWlmIChody0+aXNyYW0xNikKLQkJaHd0eXBlIHw9IEJJVDE7Ci0jZW5kaWYKLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQlod3R5cGUgfD0gQklUMjsKLSNlbmRpZgotCi0jZGVmaW5lIFBSSVNNMl9DVlNfSUQgIiRJZDogcHJpc20yc3RhLmMgMTgyNiAyMDA3LTAzLTE5IDE1OjM3OjAwWiBwaXp6YSAkIgotCi0JcCArPSBzcHJpbnRmKHAsICIjICVzIHZlcnNpb24gJXMgKCVzKSAnJXMnXG5cbiIsCi0JCSAgICAgZGV2X2luZm8sCi0JCSAgICAgV0xBTl9SRUxFQVNFLCBXTEFOX0JVSUxEX0RBVEUsIFBSSVNNMl9DVlNfSUQpOwotCi0JcCArPSBzcHJpbnRmKHAsICIjIG5pYyBoL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKLQkJICAgICBody0+aWRlbnRfbmljLmlkLCBody0+aWRlbnRfbmljLm1ham9yLAotCQkgICAgIGh3LT5pZGVudF9uaWMubWlub3IsIGh3LT5pZGVudF9uaWMudmFyaWFudCk7Ci0KLQlwICs9IHNwcmludGYocCwgIiMgcHJpIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAotCQkgICAgIGh3LT5pZGVudF9wcmlfZncuaWQsIGh3LT5pZGVudF9wcmlfZncubWFqb3IsCi0JCSAgICAgaHctPmlkZW50X3ByaV9mdy5taW5vciwgaHctPmlkZW50X3ByaV9mdy52YXJpYW50KTsKLQotCWlmIChody0+aWRlbnRfc3RhX2Z3LmlkID09IDB4MWYpIHsKLQkJcCArPSBzcHJpbnRmKHAsICIjIHN0YSBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKLQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5pZCwgaHctPmlkZW50X3N0YV9mdy5tYWpvciwKLQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KTsKLQl9IGVsc2UgewotCQlwICs9IHNwcmludGYocCwgIiMgYXAgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCi0JCQkgICAgIGh3LT5pZGVudF9zdGFfZncuaWQsIGh3LT5pZGVudF9zdGFfZncubWFqb3IsCi0JCQkgICAgIGh3LT5pZGVudF9zdGFfZncubWlub3IsIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCk7Ci0JfQotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCXAgKz0gc3ByaW50ZihwLCAiIyBpbml0aWFsIG5pYyBodyB0eXBlLCBuZWVkZWQgZm9yIFNTRiByYW1kbFxuIik7Ci0JcCArPSBzcHJpbnRmKHAsICJpbml0bmljaHc9JTA0eFxuIiwgaHd0eXBlKTsKLSNlbmRpZgotCi0gZXhpdDoKLQlEQkZFWElUOwotCXJldHVybiAocCAtIHBhZ2UpOwotfQotI2VuZGlmCi0KIHZvaWQgcHJpc20yc3RhX2NvbW1zcXVhbF9kZWZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCiB7CiAJaGZhMzg0eF90CQkqaHcgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGhmYTM4NHgsIGNvbW1zcXVhbF9iaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmN2IxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYwpAQCAtMCwwICsxLDMwMiBAQAorI2luY2x1ZGUgImhmYTM4NHhfdXNiLmMiCisjaW5jbHVkZSAicHJpc20ybWdtdC5jIgorI2luY2x1ZGUgInByaXNtMm1pYi5jIgorI2luY2x1ZGUgInByaXNtMnN0YS5jIgorCisjZGVmaW5lIFBSSVNNX1VTQl9ERVZJQ0UodmlkLCBwaWQsIG5hbWUpIFwKKyAgICAgICAgICAgVVNCX0RFVklDRSh2aWQsIHBpZCksICBcCisgICAgICAgICAgIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSBuYW1lCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfcHJpc21fdGJsW10gPSB7CisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNGJiLCAweDA5MjIsICJJT0RhdGEgQWlyUG9ydCBXTi1CMTEvVVNCUyIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA3YWEsIDB4MDAxMiwgIkNvcmVnYSBXaXJlbGVzcyBMQU4gVVNCIFN0aWNrLTExIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDlhYSwgMHgzNjQyLCAiUHJpc20yLnggMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDA0MDgsICJBY3Rpb250ZWMgUHJpc20yLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDA0MjEsICJBY3Rpb250ZWMgUHJpc20yLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzYsICJMaW5rc3lzIFdVU0IxMXYzLjAgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjZiLCAweDIyMTIsICJMaW5rc3lzIFdVU0IxMXYyLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjZiLCAweDIyMTMsICJMaW5rc3lzIFdVU0IxMnYxLjEgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjdjLCAweDEwMjIsICJTaWVtZW5zIFNwZWVkU3RyZWFtIDEwMjIgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDlmLCAweDAwMzMsICJDb21wYXEvSW50ZWwgVzEwMCBQUk8vV2lyZWxlc3MgMTFNYnBzIG11bHRpcG9ydCBXTEFOIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwMTYsICJNZWxjbyBXTEktVVNCLVMxMSAxMU1icHMgV0xBTiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDhkZSwgMHg3YTAxLCAiUFJJU00yNSBJRUVFIDgwMi4xMSBNaW5pIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4ODA4NiwgMHgxMTExLCAiSW50ZWwgUFJPL1dpcmVsZXNzIDIwMTFCIExBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBkOGUsIDB4N2EwMSwgIlBSSVNNMjUgSUVFRSA4MDIuMTEgTWluaSBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA0NWUsIDB4MDA2ZSwgIk1pY3Jvc29mdCBNTjUxMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA5NjcsIDB4MDIwNCwgIkFjZXIgV2FycGxpbmsgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDIsICJaLUNvbSA3MjUvNzI2IFByaXNtMi41IFVTQi9VU0IgSW50ZWdyYXRlZCIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBjZGUsIDB4MDAwNSwgIlotQ29tIFhsNzM1IFdpcmVsZXNzIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHg0MTNjLCAweDgxMDAsICJEZWxsIFRydWVNb2JpbGUgMTE4MCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBiM2IsIDB4MTYwMSwgIkFMTE5FVCAwMTkzIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MGIzYiwgMHgxNjAyLCAiWnlYRUwgWnlBSVIgQjIwMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBiYWYsIDB4MDBlYiwgIlVTUm9ib3RpY3MgVVNSMTEyMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA0MTEsIDB4MDAyNywgIk1lbGNvIFdMSS1VU0ItS1MxMUcgMTFNYnBzIFdMQU4gQWRhcHRlciIpfSwKKyAgICAgICAge1BSSVNNX1VTQl9ERVZJQ0UoMHgwNGYxLCAweDMwMDksICJKVkMgTVAtWFA3MjUwIEJ1aWx0aW4gVVNCIFdMQU4gQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA4NDYsIDB4NDExMCwgIk5ldEdlYXIgTUExMTEiKX0sCisgICAgICAgIHtQUklTTV9VU0JfREVWSUNFKDB4MDNmMywgMHgwMDIwLCAiQWRhcHRlYyBBV04tODAyMCBVU0IgV0xBTiBBZGFwdGVyIil9LAorLy8Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYWNlLCAweDEyMDEsICJaeURBUyBaRDEyMDEgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgyODIxLCAweDMzMDAsICJBU1VTLVdMMTQwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MjAwMSwgMHgzNzAwLCAiRFdMLTEyMiBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDIwMDEsIDB4MzcwMiwgIkRXTC0xMjAgUmV2IEYgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHg1MGMyLCAweDQwMTMsICJBdmVyYXRlYyBVU0IgV0xBTiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MmMwMiwgMHgxNGVhLCAiUGxhbmV4IEdXLVVTMTFIIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxMjRhLCAweDE2OGIsICJBaXJ2YXN0IFBSSVNNMyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDgzYSwgMHgzNTAzLCAiVC1TaW51cyAxMTEgVVNCIFdMQU4gQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDI4MjEsIDB4MzMwMCwgIkhhd2tpbmcgSGlnaERCIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDQxMSwgMHgwMDQ0LCAiTWVsY28gV0xJLVVTQi1LQjExIDExTWJwcyBXTEFOIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDYxMDYsICJST1BFWCBGcmVlTGFuIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxMjRhLCAweDQwMTcsICJQaGVlbmV0IFdMLTUwM0lBIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwYmIyLCAweDAzMDIsICJBbWJpdCBNaWNyb3N5c3RlbXMgQ29ycC4iKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHg5MDE2LCAweDE4MmQsICJTaXRlY29tIFdMLTAyMiA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDU0MywgMHgwZjAxLCAiVmlld1NvbmljIEFpcnN5bmMgVVNCIEFkYXB0ZXIgMTFNYnBzIChQcmlzbTIuNSkiKX0sCisJeyAvKiB0ZXJtaW5hdG9yICovIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JfcHJpc21fdGJsKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIHByaXNtMnN0YV9wcm9iZV91c2IKKyoKKyogUHJvYmUgcm91dGluZSBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0uCisqCisqIEFyZ3VtZW50czoKKyoJZGV2CQlwdHIgdG8gdGhlIHVzYl9kZXZpY2Ugc3RydWN0CisqCWlmbnVtCQlpbnRlcmZhY2UgbnVtYmVyIGJlaW5nIG9mZmVyZWQKKyoKKyogUmV0dXJuczoKKyoJTlVMTAkJLSB3ZSdyZSBub3QgY2xhaW1pbmcgdGhlIGRldmljZStpbnRlcmZhY2UKKyoJbm9uLU5VTEwJLSB3ZSBhcmUgY2xhaW1pbmcgdGhlIGRldmljZStpbnRlcmZhY2UgYW5kCisqCQkJICB0aGlzIGlzIGEgcHRyIHRvIHRoZSBkYXRhIHdlIHdhbnQgYmFjaworKgkJCSAgd2hlbiBkaXNjb25uZWN0IGlzIGNhbGxlZC4KKyoKKyogU2lkZSBlZmZlY3RzOgorKgorKiBDYWxsIGNvbnRleHQ6CisqCUknbSBub3Qgc3VyZSwgYXNzdW1lIGl0J3MgaW50ZXJydXB0LgorKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHByaXNtMnN0YV9wcm9iZV91c2IoCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKworCXdsYW5kZXZpY2VfdAkqd2xhbmRldiA9IE5VTEw7CisJaGZhMzg0eF90CSpodyA9IE5VTEw7CisJaW50ICAgICAgICAgICAgICByZXN1bHQgPSAwOworCisJREJGRU5URVI7CisKKwlkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisKKwlpZiAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSB7CisJCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBmYWlsZWQ7CisJfQorCWh3ID0gd2xhbmRldi0+cHJpdjsKKworCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgeworCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGh3IGRhdGEgKi8KKwloZmEzODR4X2NyZWF0ZShodywgZGV2KTsKKwlody0+d2xhbmRldiA9IHdsYW5kZXY7CisKKwkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQorCSAqIGxpbnV4IG5ldGRldmljZS4KKwkgKi8KKwlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYoaW50ZXJmYWNlLT5kZXYpKTsKKworCS8qIERvIGEgY2hpcC1sZXZlbCByZXNldCBvbiB0aGUgTUFDICovCisJaWYgKHByaXNtMl9kb3Jlc2V0KSB7CisJCXJlc3VsdCA9IGhmYTM4NHhfY29yZXJlc2V0KGh3LAorCQkJCXByaXNtMl9yZXNldF9ob2xkdGltZSwKKwkJCQlwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7CisJCWlmIChyZXN1bHQgIT0gMCkgeworCQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOworCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKKwkJCXJlc3VsdCA9IC1FSU87CisJCQlXTEFOX0xPR19FUlJPUigKKwkJCQkiJXM6IGhmYTM4NHhfY29yZXJlc2V0KCkgZmFpbGVkLlxuIiwKKwkJCQlkZXZfaW5mbyk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCX0KKworCXVzYl9nZXRfZGV2KGRldik7CisKKwl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKKworICAgICAgICBpZiAoIHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCApIHsKKwkJV0xBTl9MT0dfRVJST1IoIiVzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisvKiBlbmFibGUgdGhlIGNhcmQgKi8KKwlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZW5hYmxlKTsKKworCWdvdG8gZG9uZTsKKworIGZhaWxlZDoKKwlpZiAod2xhbmRldikJa2ZyZWUod2xhbmRldik7CisJaWYgKGh3KQkJa2ZyZWUoaHcpOworCXdsYW5kZXYgPSBOVUxMOworCisgZG9uZToKKwlEQkZFWElUOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIHdsYW5kZXYpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIHByaXNtMnN0YV9kaXNjb25uZWN0X3VzYgorKgorKiBDYWxsZWQgd2hlbiBhIGRldmljZSBwcmV2aW91c2x5IGNsYWltZWQgYnkgcHJvYmUgaXMgcmVtb3ZlZAorKiBmcm9tIHRoZSBVU0IuCisqCisqIEFyZ3VtZW50czoKKyoJZGV2CQlwdHIgdG8gdGhlIHVzYl9kZXZpY2Ugc3RydWN0CisqCXB0cgkJcHRyIHJldHVybmVkIGJ5IHByb2JlKCkgd2hlbiB0aGUgZGV2aWNlCisqICAgICAgICAgICAgICAgICAgICAgICB3YXMgY2xhaW1lZC4KKyoKKyogUmV0dXJuczoKKyoJTm90aGluZworKgorKiBTaWRlIGVmZmVjdHM6CisqCisqIENhbGwgY29udGV4dDoKKyoJcHJvY2VzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZAorcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJd2xhbmRldmljZV90CQkqd2xhbmRldjsKKworICAgICAgICBEQkZFTlRFUjsKKworCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWlmICggd2xhbmRldiAhPSBOVUxMICkgeworCQlMSVNUX0hFQUQoY2xlYW5saXN0KTsKKwkJc3RydWN0IGxpc3RfaGVhZAkqZW50cnk7CisJCXN0cnVjdCBsaXN0X2hlYWQJKnRlbXA7CisJCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKKworCQlpZiAoIWh3KQorCQkJZ290byBleGl0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOworCisJCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5yZWFwYWJsZSwgJmNsZWFubGlzdCk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5jb21wbGV0aW5nLCAmY2xlYW5saXN0KTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLnBlbmRpbmcsICZjbGVhbmxpc3QpOworCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEuYWN0aXZlLCAmY2xlYW5saXN0KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOworCisJCS8qIFRoZXJlJ3Mgbm8gaGFyZHdhcmUgdG8gc2h1dGRvd24sIGJ1dCB0aGUgZHJpdmVyCisJCSAqIG1pZ2h0IGhhdmUgc29tZSB0YXNrcyBvciB0YXNrbGV0cyB0aGF0IG11c3QgYmUKKwkJICogc3RvcHBlZCBiZWZvcmUgd2UgY2FuIHRlYXIgZXZlcnl0aGluZyBkb3duLgorCQkgKi8KKwkJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOworCisJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT50aHJvdHRsZSk7CisJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT5yZXF0aW1lcik7CisJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT5yZXNwdGltZXIpOworCisJCS8qIFVubGluayBhbGwgdGhlIFVSQnMuIFRoaXMgInJlbW92ZXMgdGhlIHdoZWVscyIKKwkJICogZnJvbSB0aGUgZW50aXJlIENUTFggaGFuZGxpbmcgbWVjaGFuaXNtLgorCQkgKi8KKwkJdXNiX2tpbGxfdXJiKCZody0+cnhfdXJiKTsKKwkJdXNiX2tpbGxfdXJiKCZody0+dHhfdXJiKTsKKwkJdXNiX2tpbGxfdXJiKCZody0+Y3RseF91cmIpOworCisJCXRhc2tsZXRfa2lsbCgmaHctPmNvbXBsZXRpb25fYmgpOworCQl0YXNrbGV0X2tpbGwoJmh3LT5yZWFwZXJfYmgpOworCisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwkJLyogTm93IHdlIGNvbXBsZXRlIGFueSBvdXRzdGFuZGluZyBjb21tYW5kcworCQkgKiBhbmQgdGVsbCBldmVyeW9uZSB3aG8gaXMgd2FpdGluZyBmb3IgdGhlaXIKKwkJICogcmVzcG9uc2VzIHRoYXQgd2UgaGF2ZSBzaHV0IGRvd24uCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2xlYW5saXN0KSB7CisJCQloZmEzODR4X3VzYmN0bHhfdAkqY3RseDsKKworCQkJY3RseCA9IGxpc3RfZW50cnkoZW50cnksIGhmYTM4NHhfdXNiY3RseF90LCBsaXN0KTsKKwkJCWNvbXBsZXRlKCZjdGx4LT5kb25lKTsKKwkJfQorCisJCS8qIEdpdmUgYW55IG91dHN0YW5kaW5nIHN5bmNocm9ub3VzIGNvbW1hbmRzCisJCSAqIGEgY2hhbmNlIHRvIGNvbXBsZXRlLiBBbGwgdGhleSBuZWVkIHRvIGRvCisJCSAqIGlzICJ3YWtlIHVwIiwgc28gdGhhdCdzIGVhc3kuCisJCSAqIChJJ2QgbGlrZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgcmVhbGx5LikKKwkJICovCisJCW1zbGVlcCgxMDApOworCisJCS8qIE5vdyBkZWxldGUgdGhlIENUTFhzLCBiZWNhdXNlIG5vLW9uZSBlbHNlIGNhbiBub3cuICovCisJCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdGVtcCwgJmNsZWFubGlzdCkgeworCQkJaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisKKwkJCWN0bHggPSBsaXN0X2VudHJ5KGVudHJ5LCBoZmEzODR4X3VzYmN0bHhfdCwgbGlzdCk7CisJCQlrZnJlZShjdGx4KTsKKwkJfQorCisJCS8qIFVuaG9vayB0aGUgd2xhbmRldiAqLworCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7CisJCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKKworCQl1c2JfcHV0X2Rldihody0+dXNiKTsKKworCQloZmEzODR4X2Rlc3Ryb3koaHcpOworCQlrZnJlZShodyk7CisKKwkJa2ZyZWUod2xhbmRldik7CisJfQorCisgZXhpdDoKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwlEQkZFWElUOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwcmlzbTJfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJwcmlzbTJfdXNiIiwKKwkucHJvYmUgPSBwcmlzbTJzdGFfcHJvYmVfdXNiLAorCS5kaXNjb25uZWN0ID0gcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiLAorCS5pZF90YWJsZSA9IHVzYl9wcmlzbV90YmwsCisJLyogZm9wcywgbWlub3I/ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcmlzbTJ1c2JfaW5pdCh2b2lkKQoreworICAgICAgICBEQkZFTlRFUjsKKworCS8qIFRoaXMgY2FsbCB3aWxsIHJlc3VsdCBpbiBjYWxscyB0byBwcmlzbTJzdGFfcHJvYmVfdXNiLiAqLworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnByaXNtMl91c2JfZHJpdmVyKTsKKworCURCRkVYSVQ7Cit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgcHJpc20ydXNiX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgREJGRU5URVI7CisKKwl1c2JfZGVyZWdpc3RlcigmcHJpc20yX3VzYl9kcml2ZXIpOworCisJREJGRVhJVDsKK307CisKK21vZHVsZV9pbml0KHByaXNtMnVzYl9pbml0KTsKK21vZHVsZV9leGl0KHByaXNtMnVzYl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1Zjg4Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBzcmMvaW5jbHVkZS93bGFuL3ZlcnNpb24uaAotKgotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBsaW51eC13bGFuCi0qCi0qICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKLSogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotKgotKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUwotKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCi0qICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCi0qICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCi0qICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgotKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0qICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0qICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKLSogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKLSogbWFkZSBkaXJlY3RseSB0bzoKLSoKLSogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KLSogaW5mb0BsaW51eC13bGFuLmNvbQotKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5Ci0qIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLSNpZm5kZWYgX1dMQU5fVkVSU0lPTl9ICi0jZGVmaW5lIF9XTEFOX1ZFUlNJT05fSAotI2lmbmRlZiBLRVJORUxfVkVSU0lPTgotI2RlZmluZSBLRVJORUxfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSkKLSNlbmRpZgotCi0vKiBXTEFOX0hPU1RJRiAoZ2VuZXJhbGx5IHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLCBub3QgZGV0ZWN0ZWQpICovCi0jZGVmaW5lIFdMQU5fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBXTEFOX1BDTUNJQSAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgV0xBTl9JU0EgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFdMQU5fUENJICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBXTEFOX1VTQiAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgV0xBTl9QTFggICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFdMQU5fU0xBVkUgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBXTEFOX1JFTEVBU0UJIjAuMi44IgotI2RlZmluZSBXTEFOX1JFTEVBU0VfQ09ERSAweDAwMDIwOAotI2RlZmluZSBXTEFOX0JVSUxEX0RBVEUgIlRodSBPY3QgIDIgMTE6MDQ6NDIgUERUIDIwMDgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvd2xhbl9jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3dsYW5fY29tcGF0LmgKaW5kZXggNTlkZmE4Zi4uOGI4YTUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvd2xhbl9jb21wYXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy93bGFuX2NvbXBhdC5oCkBAIC00OSwxMTQgKzQ5LDYgQEAKICNkZWZpbmUgX1dMQU5fQ09NUEFUX0gKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qLS0tLS0tIEVzdGFibGlzaCBQbGF0Zm9ybSBJZGVudGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogS2V5IG1hY3JvczogKi8KLS8qIFdMQU5fQ1BVX0ZBTUlMWSAqLwotCSNkZWZpbmUgV0xBTl9JeDg2CQkJMQotCSNkZWZpbmUgV0xBTl9QUEMJCQkyCi0JI2RlZmluZSBXTEFOX0l4OTYJCQkzCi0JI2RlZmluZSBXTEFOX0FSTQkJCTQKLQkjZGVmaW5lIFdMQU5fQUxQSEEJCQk1Ci0JI2RlZmluZSBXTEFOX01JUFMJCQk2Ci0JI2RlZmluZSBXTEFOX0hQUEEJCQk3Ci0JI2RlZmluZSBXTEFOX1NQQVJDCQkJOAotCSNkZWZpbmUgV0xBTl9TSCAgICAJCQk5Ci0JI2RlZmluZSBXTEFOX3g4Nl82NCAgICAgICAgICAgICAgICAgICAgIDEwCi0vKiBXTEFOX1NZU0FSQ0ggKi8KLQkjZGVmaW5lIFdMQU5fUENBVAkJCTEKLQkjZGVmaW5lIFdMQU5fTUJYCQkJMgotCSNkZWZpbmUgV0xBTl9SUFgJCQkzCi0JI2RlZmluZSBXTEFOX0xXQVJDSAkJCTQKLQkjZGVmaW5lIFdMQU5fUE1BQwkJCTUKLQkjZGVmaW5lIFdMQU5fU0tJRkYJCQk2Ci0JI2RlZmluZSBXTEFOX0JJVFNZCQkJNwotCSNkZWZpbmUgV0xBTl9BTFBIQUFSQ0gJCQk3Ci0JI2RlZmluZSBXTEFOX01JUFNBUkNICQkJOQotCSNkZWZpbmUgV0xBTl9IUFBBQVJDSAkJCTEwCi0JI2RlZmluZSBXTEFOX1NQQVJDQVJDSAkJCTExCi0JI2RlZmluZSBXTEFOX1NIQVJDSCAgIAkJCTEyCi0KLS8qIE5vdGU6IHRoZSBQTFggSE9TVElGIGFib3ZlIHJlZmVycyB0byBzb21lIHZlbmRvcnMgaW1wbGVtZW50YXRpb25zIGZvciAqLwotLyogICAgICAgUENJLiAgSXQncyBhIFBMWCBjaGlwIHRoYXQgaXMgYSBQQ0kgdG8gUENNQ0lBIGFkYXB0ZXIsIGJ1dCBpdCAgICovCi0vKiAgICAgICBpc24ndCBhIHJlYWwgUENNQ0lBIGhvc3QgaW50ZXJmYWNlIGFkYXB0ZXIgcHJvdmlkaW5nIGFsbCB0aGUgICAgKi8KLS8qICAgICAgIGNhcmQmc29ja2V0IHNlcnZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWYgKGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfOHh4KSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSkKLSNpZm5kZWYgX19wcGNfXwotI2RlZmluZSBfX3BwY19fCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKQotCi0jaWZuZGVmIEFVVE9DT05GX0lOQ0xVREVECi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX194ODZfNjRfXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl94ODZfNjQKLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9QQ0FUCi0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9faTQ4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkKF9faTY4Nl9fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX0l4ODYKLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9QQ0FUCi0jZWxpZiBkZWZpbmVkKF9fcHBjX18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fUFBDCi0JI2lmIGRlZmluZWQoQ09ORklHX01CWCkKLQkJI2RlZmluZSBXTEFOX1NZU0FSQ0gJV0xBTl9NQlgKLQkjZWxpZiBkZWZpbmVkKENPTkZJR19SUFhMSVRFKQotCQkjZGVmaW5lIFdMQU5fU1lTQVJDSAlXTEFOX1JQWAotCSNlbGlmIGRlZmluZWQoQ09ORklHX1JQWENMQVNTSUMpCi0JCSNkZWZpbmUgV0xBTl9TWVNBUkNICVdMQU5fUlBYCi0JI2Vsc2UKLQkJI2RlZmluZSBXTEFOX1NZU0FSQ0gJV0xBTl9QTUFDCi0JI2VuZGlmCi0jZWxpZiBkZWZpbmVkKF9fYXJtX18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fQVJNCi0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fU0tJRkYKLSNlbGlmIGRlZmluZWQoX19hbHBoYV9fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX0FMUEhBCi0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fQUxQSEFBUkNICi0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX01JUFMKLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9NSVBTQVJDSAotI2VsaWYgZGVmaW5lZChfX2hwcGFfXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9IUFBBCi0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fSFBQQUFSQ0gKLSNlbGlmIGRlZmluZWQoX19zcGFyY19fKQotICAgICAgICAjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWSAgICAgICAgIFdMQU5fU1BBUkMKLSAgICAgICAgI2RlZmluZSBXTEFOX1NZU0FSQ0ggICAgICAgICAgICBXTEFOX1NQQVJDCi0jZWxpZiBkZWZpbmVkKF9fc2hfXykKLSAgICAgICAgI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkgICAgICAgICBXTEFOX1NICi0gICAgICAgICNkZWZpbmUgV0xBTl9TWVNBUkNIICAgICAgICAgICAgV0xBTl9TSEFSQ0gKLSAgICAgICAgI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU5fXwotICAgICAgICAjZGVmaW5lIF9fTElUVExFX0VORElBTl9fCi0gICAgICAgICNlbmRpZgotI2Vsc2UKLQkjZXJyb3IgIk5vIENQVSBpZGVudGlmaWVkISIKLSNlbmRpZgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotLyoKLSAgIFNvbWUgYmlnIGVuZGlhbiBtYWNoaW5lcyBpbXBsaWNpdGx5IGRvIGFsbCBJL08gaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgotCi0gICBJbiBwYXJ0aWN1bGFyOgotICAgICAgICAgIExpbnV4L1BQQyBvbiBQb3dlck1hY3MgKFBDSSkKLQkgIEFybS9JbnRlbCBYc2NhbGUgKFBDSSkKLQotICAgVGhpcyBtYXkgYWxzbyBhZmZlY3QgUExYIGJvYXJkcyBhbmQgb3RoZXIgQkUgJnwgUFBDIHBsYXRmb3JtczsKLSAgIGFzIG5ldyBvbmVzIGFyZSBkaXNjb3ZlcmVkLCBhZGQgdGhlbSBiZWxvdy4KLSovCi0KLSNpZiBkZWZpbmVkKFdMQU5fSE9TVElGKQotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0jaWYgKChXTEFOX1NZU0FSQ0ggPT0gV0xBTl9TS0lGRikgfHwgKFdMQU5fU1lTQVJDSCA9PSBXTEFOX1BNQUMpIHx8IChXTEFOX1NZU0FSQ0ggPT0gV0xBTl9TUEFSQykpCi0jZGVmaW5lIFJFVkVSU0VfRU5ESUFOCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLS0tLSBCaXQgc2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIApAQCAtMTkzLDMwICs4NSw2IEBACiAjZGVmaW5lIEJJVDMwCTB4NDAwMDAwMDAKICNkZWZpbmUgQklUMzEJMHg4MDAwMDAwMAogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotdHlwZWRlZiB1X2ludDhfdAlVSU5UODsKLXR5cGVkZWYgdV9pbnQxNl90CVVJTlQxNjsKLXR5cGVkZWYgdV9pbnQzMl90CVVJTlQzMjsKLQotdHlwZWRlZiBpbnQ4X3QJCUlOVDg7Ci10eXBlZGVmIGludDE2X3QJCUlOVDE2OwotdHlwZWRlZiBpbnQzMl90CQlJTlQzMjsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgVUlOVDsKLXR5cGVkZWYgc2lnbmVkIGludCAgICAgIElOVDsKLQotdHlwZWRlZiB1X2ludDY0X3QJVUlOVDY0OwotdHlwZWRlZiBpbnQ2NF90CQlJTlQ2NDsKLQotI2RlZmluZSBVSU5UOF9NQVgJKDB4ZmZVTCkKLSNkZWZpbmUgVUlOVDE2X01BWAkoMHhmZmZmVUwpCi0jZGVmaW5lIFVJTlQzMl9NQVgJKDB4ZmZmZmZmZmZVTCkKLQotI2RlZmluZSBJTlQ4X01BWAkoMHg3ZkwpCi0jZGVmaW5lIElOVDE2X01BWAkoMHg3ZmZmTCkKLSNkZWZpbmUgSU5UMzJfTUFYCSgweDdmZmZmZmZmTCkKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qLS0tLS0tIENvbXBpbGVyIFBvcnRhYmlsaXR5IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMjMwLDIwICs5OCw5IEBACiAjZGVmaW5lIFdMQU5fREJWQVIJd2xhbl9kZWJ1ZwogI2VuZGlmCiAKLSNpZm5kZWYgS0VSTkVMX1ZFUlNJT04KLSNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCi0jZW5kaWYKKyNkZWZpbmUgV0xBTl9SRUxFQVNFCSIwLjMuMC1sa21sIgogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0jICBpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDgpKQotIyAgICBpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jICBlbHNlCi0jICAgIGluY2x1ZGUgPGFzbS9oYXJkaXJxLmg+Ci0jICBlbmRpZgotI2VsaWYgZGVmaW5lZChfX0tFUk5FTF9fKQotIyAgZGVmaW5lIFBSRUVNUFRfTUFTSyAgKDB4MDAwMDAwRkZVTCkKLSMgIGRlZmluZSBwcmVlbXB0X2NvdW50KCkgKDBVTCkKLSNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KIAogI2RlZmluZSBXTEFOX0xPR19FUlJPUih4LGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgeCAsIF9fZnVuY19fICwgIyNhcmdzKTsKIApAQCAtMjU0LDIwICsxMTEsMTcgQEAKICNkZWZpbmUgV0xBTl9MT0dfSU5GTyhhcmdzLi4uICkgcHJpbnRrKEtFUk5fSU5GTyBhcmdzKQogCiAjaWYgZGVmaW5lZChXTEFOX0lOQ0xVREVfREVCVUcpCi0JI2RlZmluZSBXTEFOX0FTU0VSVChjKSBpZiAoKCEoYykpICYmIFdMQU5fREJWQVIgPj0gMSkgeyBcCi0JCVdMQU5fTE9HX0RFQlVHKDEsICJBc3NlcnRpb24gZmFpbHVyZSFcbiIpOyB9CiAJI2RlZmluZSBXTEFOX0hFWF9EVU1QKCBsLCB4LCBwLCBuKQlpZiggV0xBTl9EQlZBUiA+PSAobCkgKXsgXAogCQlpbnQgX19pX187IFwKIAkJcHJpbnRrKEtFUk5fREVCVUcgeCAiOiIpOyBcCiAJCWZvciggX19pX189MDsgX19pX18gPCAobik7IF9faV9fKyspIFwKLQkJCXByaW50ayggIiAlMDJ4IiwgKChVSU5UOCopKHApKVtfX2lfX10pOyBcCisJCQlwcmludGsoICIgJTAyeCIsICgodTgqKShwKSlbX19pX19dKTsgXAogCQlwcmludGsoIlxuIik7IH0KIAkjZGVmaW5lIERCRkVOVEVSIHsgaWYgKCBXTEFOX0RCVkFSID49IDUgKXsgV0xBTl9MT0dfREVCVUcoMywiLS0tLT5cbiIpOyB9IH0KIAkjZGVmaW5lIERCRkVYSVQgIHsgaWYgKCBXTEFOX0RCVkFSID49IDUgKXsgV0xBTl9MT0dfREVCVUcoMywiPC0tLS1cbiIpOyB9IH0KIAogCSNkZWZpbmUgV0xBTl9MT0dfREVCVUcobCx4LGFyZ3MuLi4pIGlmICggV0xBTl9EQlZBUiA+PSAobCkpIHByaW50ayhLRVJOX0RFQlVHICIlcyglbHUpOiAiIHggLCAgX19mdW5jX18sIChwcmVlbXB0X2NvdW50KCkgJiBQUkVFTVBUX01BU0spLCAjI2FyZ3MgKTsKICNlbHNlCi0JI2RlZmluZSBXTEFOX0FTU0VSVChjKQogCSNkZWZpbmUgV0xBTl9IRVhfRFVNUCggbCwgcywgcCwgbikKIAkjZGVmaW5lIERCRkVOVEVSCiAJI2RlZmluZSBEQkZFWElUCkBAIC0yNzUsNDEzICsxMjksMTEgQEAKIAkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHKGwsIHMsIGFyZ3MuLi4pCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgX19TTVBfXwkJCTEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKQotCi0jaWYgKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpIHx8IChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkpCi0jZGVmaW5lIFVSQl9PTkxZX0NBTExCQUNLCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTkpKQotI2RlZmluZSBQVF9SRUdTICAgICwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MKLSNlbHNlCi0jZGVmaW5lIFBUX1JFR1MKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw3KSkKLSMgIGRlZmluZSBkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKGEpICBkZWxfdGltZXJfc3luYyhhKQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwxNykpCi0jZGVmaW5lIENPTkZJR19ORVRMSU5LCQkxCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotI2RlZmluZSBrZnJlZV9zKGEsIGIpCWtmcmVlKChhKSkKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMiwxOCkpCi0jaWZuZGVmIGluaXRfd2FpdHF1ZXVlX2hlYWQKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwwLDE2KSkKLSNkZWZpbmUgaW5pdF93YWl0cXVldWVfaGVhZChwKSAgKCoocCkgPSBOVUxMKQotI2Vsc2UKLSNkZWZpbmUgaW5pdF93YWl0cXVldWVfaGVhZChwKSAgaW5pdF93YWl0cXVldWUocCkKLSNlbmRpZgotdHlwZWRlZiBzdHJ1Y3Qgd2FpdF9xdWV1ZSAqd2FpdF9xdWV1ZV9oZWFkX3Q7Ci10eXBlZGVmIHN0cnVjdCB3YWl0X3F1ZXVlIHdhaXRfcXVldWVfdDsKLSNkZWZpbmUgc2V0X2N1cnJlbnRfc3RhdGUoYikgIHsgY3VycmVudC0+c3RhdGUgPSAoYik7IG1iKCk7IH0KLSNkZWZpbmUgaW5pdF93YWl0cXVldWVfZW50cnkoYSwgYikgeyAoYSktPnRhc2sgPSBjdXJyZW50OyB9Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0Ci0vLyByZXR2YWwgPT0gMDsgc2lnbmFsIG1ldDsgd2UncmUgZ29vZC4KLS8vIHJldHZhbCA8IDA7IGludGVycnVwdGVkIGJ5IHNpZ25hbC4KLS8vIHJldHZhbCA+IDA7IHRpbWVkIG91dC4KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApKSAgLy8gZml4bWU/Ci0KLSNkZWZpbmUgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCByZXQpICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZvciAoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpICAgIDsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UgLy8gMi4yCi0KLQotI2RlZmluZSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHJldCkgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZSBfX3dhaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX3dhaXQudGFzayA9IGN1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IgKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmICAvLyB2ZXJzaW9uID49IDIuNAotCi0jZGVmaW5lIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHRpbWVvdXQpCSAgXAotKHsJCQkJCQkJCQkgIFwKLQlsb25nIF9fcmV0ID0gdGltZW91dDsJCQkJCQkgIFwKLQlpZiAoIShjb25kaXRpb24pKQkJCQkJCSAgXAotCQlfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAotCV9fcmV0OwkJCQkJCQkJICBcCi19KQotCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMjApKQotI2lmZGVmIF9MSU5VWF9MSVNUX0gKLQotc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZV90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0gICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLSAgICAgICAgX19saXN0X2RlbChsaXN0LT5wcmV2LCBsaXN0LT5uZXh0KTsKLSAgICAgICAgbGlzdF9hZGRfdGFpbChsaXN0LCBoZWFkKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9zcGxpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0ID0gbGlzdC0+bmV4dDsKLSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxhc3QgPSBsaXN0LT5wcmV2OwotICAgICAgc3RydWN0IGxpc3RfaGVhZCAqYXQgPSBoZWFkLT5uZXh0OwotCi0gICAgICBmaXJzdC0+cHJldiA9IGhlYWQ7Ci0gICAgICBoZWFkLT5uZXh0ID0gZmlyc3Q7Ci0KLSAgICAgIGxhc3QtPm5leHQgPSBhdDsKLSAgICAgIGF0LT5wcmV2ID0gbGFzdDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQotewotICAgICAgX19saXN0X2RlbChsaXN0LT5wcmV2LCBsaXN0LT5uZXh0KTsKLSAgICAgIGxpc3RfYWRkKGxpc3QsIGhlYWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2VfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlpZiAoIWxpc3RfZW1wdHkobGlzdCkpIHsKLQkJX19saXN0X3NwbGljZShsaXN0LCBoZWFkKTsKLQkJSU5JVF9MSVNUX0hFQUQobGlzdCk7Ci0JfQotfQotCi0KLSNlbmRpZiAgLy8gTElTVF9ICi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDEsOTApKQotI2RlZmluZSBzcGluX2xvY2sobCkgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrKGwpICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc3Bpbl9sb2NrX2lycXNhdmUobCxmKSAgZG8geyBzYXZlX2ZsYWdzKGYpOyBjbGkoKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsLGYpIGRvIHsgcmVzdG9yZV9mbGFncyhmKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQocykgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBzcGluX3RyeWxvY2sobCkgICAgICAgICAoMSkKLXR5cGVkZWYgaW50IHNwaW5sb2NrX3Q7Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpIC8vIFhYWCA/Pz8KLSNkZWZpbmUgc3Bpbl9sb2NrX2JoICAgICAgICAgc3Bpbl9sb2NrCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KSAgICAgICAoKih2b2xhdGlsZSBjaGFyICopKCYoeCktPmxvY2spIDw9IDApCi0jZWxzZQotI2RlZmluZSBzcGluX2lzX2xvY2tlZChsKSAgICAgICAoMCkKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDI4KSkKLSNkZWZpbmUgX191c2VyCi0jZGVmaW5lIF9faW9tZW0KLSNlbmRpZgotCi0jaWZkZWYgX0xJTlVYX1BST0NfRlNfSAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMjUpKQotCi1leHRlcm4gaW5saW5lIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqCi1jcmVhdGVfcHJvY19yZWFkX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcHJvY190ICpyZWFkX3Byb2MsIHZvaWQgKmRhdGEpCi17Ci0gICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZXMgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBtb2RlLCBiYXNlKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHJlcy0+cmVhZF9wcm9jID0gcmVhZF9wcm9jOwotICAgICAgICByZXMtPmRhdGEgPSBkYXRhOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDI5KSkKLSNpZm5kZWYgcHJvY19ta2RpcgotI2RlZmluZSBwcm9jX21rZGlyKG5hbWUsIHJvb3QpIGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZESVIsIHJvb3QpCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmIC8qIF9MSU5VWF9QUk9DX0ZTX0ggKi8KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0jaWZuZGVmIElOSVRfVFFVRVVFCi0jZGVmaW5lIFBSRVBBUkVfVFFVRVVFKF90cSwgX3JvdXRpbmUsIF9kYXRhKSAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoX3RxKS0+cm91dGluZSA9IF9yb3V0aW5lOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKF90cSktPmRhdGEgPSBfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9IHdoaWxlICgwKQotI2RlZmluZSBJTklUX1RRVUVVRShfdHEsIF9yb3V0aW5lLCBfZGF0YSkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJihfdHEpLT5saXN0KTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChfdHEpLT5zeW5jID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBQUkVQQVJFX1RRVUVVRSgoX3RxKSwgKF9yb3V0aW5lKSwgKF9kYXRhKSk7ICAgICBcCi0gICAgICAgIH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmbmRlZiBjb250YWluZXJfb2YKLSNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJCVwKLSAgICAgICAgY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOwlcCi0gICAgICAgICh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCi0jZW5kaWYKLQotI2lmbmRlZiBJTklUX1dPUksKLSNkZWZpbmUgd29ya19zdHJ1Y3QgdHFfc3RydWN0Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotI2RlZmluZSBzY2hlZHVsZV93b3JrKGEpICAgcXVldWVfdGFzayhhLCAmdHFfc2NoZWR1bGVyKQotI2Vsc2UKLSNkZWZpbmUgc2NoZWR1bGVfd29yayhhKSAgc2NoZWR1bGVfdGFzayhhKQotI2VuZGlmCi0KLSNkZWZpbmUgZmx1c2hfc2NoZWR1bGVkX3dvcmsgIGZsdXNoX3NjaGVkdWxlZF90YXNrcwotI2RlZmluZSBJTklUX1dPUksyKF93cSwgX3JvdXRpbmUpICBJTklUX1RRVUVVRShfd3EsICh2b2lkICgqKSh2b2lkICopKV9yb3V0aW5lLCBfd3EpCi0jZW5kaWYKLQotI2Vsc2UgLy8gPj0gMi41IGtlcm5lbAotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQotI2RlZmluZSBJTklUX1dPUksyKF93cSwgX3JvdXRpbmUpCUlOSVRfV09SSyhfd3EsICh2b2lkICgqKSh2b2lkICopKV9yb3V0aW5lLCBfd3EpCi0jZWxzZQotI2RlZmluZSBJTklUX1dPUksyKF93cSwgX3JvdXRpbmUpCUlOSVRfV09SSyhfd3EsIF9yb3V0aW5lKQotI2VuZGlmCi0KLSNlbmRpZiAvLyA+PSAyLjUga2VybmVsCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSkKLXR5cGVkZWYgc3RydWN0IGRldmljZSBuZXRkZXZpY2VfdDsKLSNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsNCkpCi10eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldmljZV90OwotI2Vsc2UKICN1bmRlZiBuZXRkZXZpY2VfdAogdHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZSBuZXRkZXZpY2VfdDsKLSNlbmRpZgogCi0jaWZkZWYgV0lSRUxFU1NfRVhUCi0jaWYgKFdJUkVMRVNTX0VYVCA8IDEzKQotc3RydWN0IGl3X3JlcXVlc3RfaW5mbwotewotICAgICAgICBfX3UxNiAgICAgICAgICAgY21kOyAgICAgICAgICAgIC8qIFdpcmVsZXNzIEV4dGVuc2lvbiBjb21tYW5kICovCi0gICAgICAgIF9fdTE2ICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogTW9yZSB0byBjb21lIDstKSAqLwotfTsKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDEsMTgpKQotI2RlZmluZSBNT0RVTEVfUEFSTShhLGIpICAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI2RlZmluZSBNT0RVTEVfQVVUSE9SKGEpICAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI2RlZmluZSBNT0RVTEVfREVTQ1JJUFRJT04oYSkgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI2RlZmluZSBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShhKSBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI3VuZGVmICBHRVRfVVNFX0NPVU5UCi0jZGVmaW5lIEdFVF9VU0VfQ09VTlQobSkgICAgICAgIG1vZF91c2VfY291bnRfCi0jZW5kaWYKLQotI2lmbmRlZiBNT0RVTEVfT1dORVIKLSNkZWZpbmUgTU9EVUxFX09XTkVSKGEpICAgICAgICAgZXh0ZXJuIGludCBfX2JvZ3VzX2RlY2wKLSNkZWZpbmUgQU5DSUVOVF9NT0RVTEVfQ09ERQotI2VuZGlmCi0KLSNpZm5kZWYgTU9EVUxFX0xJQ0VOU0UKLSNkZWZpbmUgTU9EVUxFX0xJQ0VOU0UobSkgICAgICAgZXh0ZXJuIGludCBfX2JvZ3VzX2RlY2wKLSNlbmRpZgotCi0vKiBUT0RPOiAgRG8gd2UgY2FyZSBhYm91dCB0aGlzPyAqLwotI2lmbmRlZiBNT0RVTEVfREVWSUNFX1RBQkxFCi0jZGVmaW5lIE1PRFVMRV9ERVZJQ0VfVEFCTEUoZm9vLGJhcikKLSNlbmRpZgotCi0jZGVmaW5lIHdsYW5fbWludXRlczJ0aWNrcyhhKSAoKGEpKih3bGFuX3RpY2tzX3Blcl9zZWMgKiAgNjApKQotI2RlZmluZSB3bGFuX3NlY29uZHMydGlja3MoYSkgKChhKSood2xhbl90aWNrc19wZXJfc2VjKSkKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNDcpKQotI2RlZmluZSBORVdfTU9EVUxFX0NPREUKLSNpZmRlZiBBTkNJRU5UX01PRFVMRV9DT0RFCi0jdW5kZWYgQU5DSUVOVF9NT0RVTEVfQ09ERQotI2VuZGlmCi0jZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDI1KSkKLSNkZWZpbmUgbW9kdWxlX3BhcmFtKG5hbWUsIHR5cGUsIHBlcm0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgaW5saW5lIHZvaWQgKl9fY2hlY2tfZXhpc3RlbmNlXyMjbmFtZSh2b2lkKSB7IHJldHVybiAmbmFtZTsgfSBcCi0gICAgICAgIE1PRFVMRV9QQVJNKG5hbWUsIF9NT0RVTEVfUEFSTV9TVFJJTkdfICMjIHR5cGUpCi0KLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR19ieXRlICJiIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX3Nob3J0ICJoIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX3VzaG9ydCAiaCIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR19pbnQgImkiCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfdWludCAiaSIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR19sb25nICJsIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX3Vsb25nICJsIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX2Jvb2wgImkiCi0jZW5kaWYKLQotLyogbGludXggPCAyLjUuNjkgKi8KLSNpZm5kZWYgSVJRX05PTkUKLXR5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKLSNkZWZpbmUgSVJRX05PTkUKLSNkZWZpbmUgSVJRX0hBTkRMRUQKLSNkZWZpbmUgSVJRX1JFVFZBTCh4KQotI2VuZGlmCi0KLSNpZm5kZWYgaW5fYXRvbWljCi0jZGVmaW5lIGluX2F0b21pYygpICAwCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTMpKQogI2RlZmluZSBVUkJfQVNZTkNfVU5MSU5LIDAKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw3KSkKLSNkZWZpbmUgVVJCX0FTWU5DX1VOTElOSyAgVVNCX0FTWU5DX1VOTElOSwotI2RlZmluZSB1c2JfZmlsbF9idWxrX3VyYiAgRklMTF9CVUxLX1VSQgotI2RlZmluZSB1c2Jfa2lsbF91cmIgIHVzYl91bmxpbmtfdXJiCi0jZWxzZQogI2RlZmluZSBVU0JfUVVFVUVfQlVMSyAwCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTEpKQotdHlwZWRlZiB1MzIgcG1fbWVzc2FnZV90OwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDkpKQotI2RlZmluZSBob3RwbHVnX3BhdGggICIvZXRjL2hvdHBsdWcvd2xhbi5hZ2VudCIKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLSNkZWZpbmUgZnJlZV9uZXRkZXYoeCkgICAgICAga2ZyZWUoeCkKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw5KSkKLSNkZWZpbmUgZXRoX2hkcih4KSAgICAgICAgICAgKHgpLT5tYWMuZXRoZXJuZXQKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLSNkZWZpbmUgZGVsX3RpbWVyX3N5bmMoYSkgICAgICAgZGVsX3RpbWVyKGEpCi0jZW5kaWYKLQotI2lmbmRlZiBtaWdodF9zbGVlcAotI2RlZmluZSBtaWdodF9zbGVlcChhKSAgIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0vKiBBcHBhcmVudGx5IDIuNC4yIGV0aHRvb2wgaXMgcXVpdGUgZGlmZmVyZW50LCBtYXliZSBuZXdlciB0b28/ICovCi0jaWYgKGRlZmluZWQoU0lPRVRIVE9PTCkgJiYgIWRlZmluZWQoRVRIVE9PTF9HRFJWSU5GTykpCi0jdW5kZWYgU0lPRVRIVE9PTAotI2VuZGlmCi0KLS8vIHBjbWNpYS1jcyBzdHVmZgotI2lmICgoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkgJiYgXAotICAgICAhZGVmaW5lZChwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIpKQotI2RlZmluZSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaGFuZGxlLCByZWcpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgaGFuZGxlLCByZWcpCi0jZGVmaW5lIHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoaGFuZGxlLCByZWcpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlZ2lzdGVyQ2xpZW50LCBoYW5kbGUsIHJlZykKLSNkZWZpbmUgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGhhbmRsZSkgXAotICAgICAgICBDYXJkU2VydmljZXMoRGVyZWdpc3RlckNsaWVudCwgaGFuZGxlKQotI2RlZmluZSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKEdldEZpcnN0VHVwbGUsIGhhbmRsZSwgdHVwbGUpCi0jZGVmaW5lIHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsIHR1cGxlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXROZXh0VHVwbGUsIGhhbmRsZSwgdHVwbGUpCi0jZGVmaW5lIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXRUdXBsZURhdGEsIGhhbmRsZSwgdHVwbGUpCi0jZGVmaW5lIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUGFyc2VUdXBsZSwgaGFuZGxlLCB0dXBsZSwgcGFyc2UpCi0jZGVmaW5lIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgY29uZmlnKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXRDb25maWd1cmF0aW9uSW5mbywgaGFuZGxlLCBjb25maWcpCi0jZGVmaW5lIHBjbWNpYV9yZXF1ZXN0X2lvKGhhbmRsZSwgcmVxKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZXF1ZXN0SU8sIGhhbmRsZSwgcmVxKQotI2RlZmluZSBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCByZXEpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlcXVlc3RJUlEsIGhhbmRsZSwgcmVxKQotI2RlZmluZSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgcmVxKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgaGFuZGxlLCByZXEpCi0jZGVmaW5lIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24oaGFuZGxlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZWxlYXNlQ29uZmlndXJhdGlvbiwgaGFuZGxlKQotI2RlZmluZSBwY21jaWFfcmVsZWFzZV9pbyhoYW5kbGUsIHJlcSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVsZWFzZUlPLCBoYW5kbGUsIHJlcSkKLSNkZWZpbmUgcGNtY2lhX3JlbGVhc2VfaXJxKGhhbmRsZSwgcmVxKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZWxlYXNlSVJRLCBoYW5kbGUsIHJlcSkKLSNkZWZpbmUgcGNtY2lhX3JlbGVhc2Vfd2luZG93KHdpbikgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVsZWFzZVdpbmRvdywgd2luKQotI2RlZmluZSBwY21jaWFfZ2V0X2NhcmRfc2VydmljZXNfaW5mbyhpbmZvKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXRDYXJkU2VydmljZXNJbmZvLCBpbmZvKQotI2RlZmluZSBwY21jaWFfcmVwb3J0X2Vycm9yKGhhbmRsZSwgZXJyKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZXBvcnRFcnJvciwgaGFuZGxlLCBlcnIpCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qLS0tLS0tIEhhcmR3YXJlIFBvcnRhYmlsaXR5IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC02OTIsMjIgKzE0NCw2IEBACiAjZGVmaW5lIGhvc3QyaWVlZTE2KG4pCV9fY3B1X3RvX2xlMTYobikKICNkZWZpbmUgaG9zdDJpZWVlMzIobikJX19jcHVfdG9fbGUzMihuKQogCi0jaWYgKFdMQU5fQ1BVX0ZBTUlMWSAhPSBXTEFOX01JUFMpCi10eXBlZGVmIFVJTlQzMiBwaHlzX3Q7Ci0jZW5kaWYKLQotI2lmIChXTEFOX0NQVV9GQU1JTFkgPT0gV0xBTl9QUEMpCi0gICAgICAgI2RlZmluZSB3bGFuX2ludyhhKSAgICAgICAgICAgICAgICAgICAgIGluX2JlMTYoKHVuc2lnbmVkIHNob3J0ICopKChhKStfSU9fQkFTRSkpCi0gICAgICAgI2RlZmluZSB3bGFuX2lud19sZTE2X3RvX2NwdShhKSAgICAgICAgIGludygoYSkpCi0gICAgICAgI2RlZmluZSB3bGFuX291dHcodixhKSAgICAgICAgICAgICAgICAgIG91dF9iZTE2KCh1bnNpZ25lZCBzaG9ydCAqKSgoYSkrX0lPX0JBU0UpLCAodikpCi0gICAgICAgI2RlZmluZSB3bGFuX291dHdfY3B1X3RvX2xlMTYodixhKSAgICAgIG91dHcoKHYpLChhKSkKLSNlbHNlCi0gICAgICAgI2RlZmluZSB3bGFuX2ludyhhKSAgICAgICAgICAgICAgICAgICAgIGludygoYSkpCi0gICAgICAgI2RlZmluZSB3bGFuX2lud19sZTE2X3RvX2NwdShhKSAgICAgICAgIF9fY3B1X3RvX2xlMTYoaW53KChhKSkpCi0gICAgICAgI2RlZmluZSB3bGFuX291dHcodixhKSAgICAgICAgICAgICAgICAgIG91dHcoKHYpLChhKSkKLSAgICAgICAjZGVmaW5lIHdsYW5fb3V0d19jcHVfdG9fbGUxNih2LGEpICAgICAgb3V0dyhfX2NwdV90b19sZTE2KCh2KSksKGEpKQotI2VuZGlmCi0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLSBHZW5lcmFsIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jIGIvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMKaW5kZXggZmUwNzQ2Mi4uODE3MWNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMKKysrIGIvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0ejsKIAlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldjsKIAotCWlmICghc3RybmNtcChkZXYtPmJ1c19pZCwgInRoZXJtYWxfem9uZSIsIHNpemVvZiAidGhlcm1hbF96b25lIiAtIDEpKSB7CisJaWYgKCFzdHJuY21wKGRldl9uYW1lKGRldiksICJ0aGVybWFsX3pvbmUiLCBzaXplb2YgInRoZXJtYWxfem9uZSIgLSAxKSkgewogCQl0eiA9IHRvX3RoZXJtYWxfem9uZShkZXYpOwogCQlrZnJlZSh0eik7CiAJfSBlbHNlIHsKQEAgLTYzMCw3ICs2MzAsNyBAQAogCWNkZXYtPm9wcyA9IG9wczsKIAljZGV2LT5kZXZpY2UuY2xhc3MgPSAmdGhlcm1hbF9jbGFzczsKIAljZGV2LT5kZXZkYXRhID0gZGV2ZGF0YTsKLQlzcHJpbnRmKGNkZXYtPmRldmljZS5idXNfaWQsICJjb29saW5nX2RldmljZSVkIiwgY2Rldi0+aWQpOworCWRldl9zZXRfbmFtZSgmY2Rldi0+ZGV2aWNlLCAiY29vbGluZ19kZXZpY2UlZCIsIGNkZXYtPmlkKTsKIAlyZXN1bHQgPSBkZXZpY2VfcmVnaXN0ZXIoJmNkZXYtPmRldmljZSk7CiAJaWYgKHJlc3VsdCkgewogCQlyZWxlYXNlX2lkcigmdGhlcm1hbF9jZGV2X2lkciwgJnRoZXJtYWxfaWRyX2xvY2ssIGNkZXYtPmlkKTsKQEAgLTc2OSw3ICs3NjksNyBAQAogCXR6LT5kZXZpY2UuY2xhc3MgPSAmdGhlcm1hbF9jbGFzczsKIAl0ei0+ZGV2ZGF0YSA9IGRldmRhdGE7CiAJdHotPnRyaXBzID0gdHJpcHM7Ci0Jc3ByaW50Zih0ei0+ZGV2aWNlLmJ1c19pZCwgInRoZXJtYWxfem9uZSVkIiwgdHotPmlkKTsKKwlkZXZfc2V0X25hbWUoJnR6LT5kZXZpY2UsICJ0aGVybWFsX3pvbmUlZCIsIHR6LT5pZCk7CiAJcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ0ei0+ZGV2aWNlKTsKIAlpZiAocmVzdWx0KSB7CiAJCXJlbGVhc2VfaWRyKCZ0aGVybWFsX3R6X2lkciwgJnRoZXJtYWxfaWRyX2xvY2ssIHR6LT5pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW8uYyBiL2RyaXZlcnMvdWlvL3Vpby5jCmluZGV4IDJkMjQ0MGMuLjRjYTg1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpby5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpby5jCkBAIC0zNSw2ICszNSw3IEBACiAJaW50CQkJdm1hX2NvdW50OwogCXN0cnVjdCB1aW9faW5mbwkJKmluZm87CiAJc3RydWN0IGtvYmplY3QJCSptYXBfZGlyOworCXN0cnVjdCBrb2JqZWN0CQkqcG9ydGlvX2RpcjsKIH07CiAKIHN0YXRpYyBpbnQgdWlvX21ham9yOwpAQCAtNzUsMTcgKzc2LDE3IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglbHhcbiIsIG1lbS0+YWRkciAmIH5QQUdFX01BU0spOwogfQogCi1zdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5IHsKK3N0cnVjdCBtYXBfc3lzZnNfZW50cnkgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKIAlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHVpb19tZW0gKiwgY2hhciAqKTsKIAlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCB1aW9fbWVtICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5IGFkZHJfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3QgbWFwX3N5c2ZzX2VudHJ5IGFkZHJfYXR0cmlidXRlID0KIAlfX0FUVFIoYWRkciwgU19JUlVHTywgbWFwX2FkZHJfc2hvdywgTlVMTCk7Ci1zdGF0aWMgc3RydWN0IHVpb19zeXNmc19lbnRyeSBzaXplX2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG1hcF9zeXNmc19lbnRyeSBzaXplX2F0dHJpYnV0ZSA9CiAJX19BVFRSKHNpemUsIFNfSVJVR08sIG1hcF9zaXplX3Nob3csIE5VTEwpOwotc3RhdGljIHN0cnVjdCB1aW9fc3lzZnNfZW50cnkgb2Zmc2V0X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG1hcF9zeXNmc19lbnRyeSBvZmZzZXRfYXR0cmlidXRlID0KIAlfX0FUVFIob2Zmc2V0LCBTX0lSVUdPLCBtYXBfb2Zmc2V0X3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cnNbXSA9IHsKQEAgLTEwNiw5ICsxMDcsOSBAQAogewogCXN0cnVjdCB1aW9fbWFwICptYXAgPSB0b19tYXAoa29iaik7CiAJc3RydWN0IHVpb19tZW0gKm1lbSA9IG1hcC0+bWVtOwotCXN0cnVjdCB1aW9fc3lzZnNfZW50cnkgKmVudHJ5OworCXN0cnVjdCBtYXBfc3lzZnNfZW50cnkgKmVudHJ5OwogCi0JZW50cnkgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHVpb19zeXNmc19lbnRyeSwgYXR0cik7CisJZW50cnkgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG1hcF9zeXNmc19lbnRyeSwgYXR0cik7CiAKIAlpZiAoIWVudHJ5LT5zaG93KQogCQlyZXR1cm4gLUVJTzsKQEAgLTExNiwxNiArMTE3LDkzIEBACiAJcmV0dXJuIGVudHJ5LT5zaG93KG1lbSwgYnVmKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgdWlvX3N5c2ZzX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIG1hcF9zeXNmc19vcHMgPSB7CiAJLnNob3cgPSBtYXBfdHlwZV9zaG93LAogfTsKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgbWFwX2F0dHJfdHlwZSA9IHsKIAkucmVsZWFzZQk9IG1hcF9yZWxlYXNlLAotCS5zeXNmc19vcHMJPSAmdWlvX3N5c2ZzX29wcywKKwkuc3lzZnNfb3BzCT0gJm1hcF9zeXNmc19vcHMsCiAJLmRlZmF1bHRfYXR0cnMJPSBhdHRycywKIH07CiAKK3N0cnVjdCB1aW9fcG9ydGlvIHsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworCXN0cnVjdCB1aW9fcG9ydCAqcG9ydDsKK307CisjZGVmaW5lIHRvX3BvcnRpbyhwb3J0aW8pIGNvbnRhaW5lcl9vZihwb3J0aW8sIHN0cnVjdCB1aW9fcG9ydGlvLCBrb2JqKQorCitzdGF0aWMgc3NpemVfdCBwb3J0aW9fc3RhcnRfc2hvdyhzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCVseFxuIiwgcG9ydC0+c3RhcnQpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3J0aW9fc2l6ZV9zaG93KHN0cnVjdCB1aW9fcG9ydCAqcG9ydCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWx4XG4iLCBwb3J0LT5zaXplKTsKK30KKworc3RhdGljIHNzaXplX3QgcG9ydGlvX3BvcnR0eXBlX3Nob3coc3RydWN0IHVpb19wb3J0ICpwb3J0LCBjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAqcG9ydHR5cGVzW10gPSB7Im5vbmUiLCAieDg2IiwgImdwaW8iLCAib3RoZXIifTsKKworCWlmICgocG9ydC0+cG9ydHR5cGUgPCAwKSB8fCAocG9ydC0+cG9ydHR5cGUgPiBVSU9fUE9SVF9PVEhFUikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAicG9ydF8lc1xuIiwgcG9ydHR5cGVzW3BvcnQtPnBvcnR0eXBlXSk7Cit9CisKK3N0cnVjdCBwb3J0aW9fc3lzZnNfZW50cnkgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHVpb19wb3J0ICosIGNoYXIgKik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgdWlvX3BvcnQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworfTsKKworc3RhdGljIHN0cnVjdCBwb3J0aW9fc3lzZnNfZW50cnkgcG9ydGlvX3N0YXJ0X2F0dHJpYnV0ZSA9CisJX19BVFRSKHN0YXJ0LCBTX0lSVUdPLCBwb3J0aW9fc3RhcnRfc2hvdywgTlVMTCk7CitzdGF0aWMgc3RydWN0IHBvcnRpb19zeXNmc19lbnRyeSBwb3J0aW9fc2l6ZV9hdHRyaWJ1dGUgPQorCV9fQVRUUihzaXplLCBTX0lSVUdPLCBwb3J0aW9fc2l6ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgcG9ydGlvX3N5c2ZzX2VudHJ5IHBvcnRpb19wb3J0dHlwZV9hdHRyaWJ1dGUgPQorCV9fQVRUUihwb3J0dHlwZSwgU19JUlVHTywgcG9ydGlvX3BvcnR0eXBlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcG9ydGlvX2F0dHJzW10gPSB7CisJJnBvcnRpb19zdGFydF9hdHRyaWJ1dGUuYXR0ciwKKwkmcG9ydGlvX3NpemVfYXR0cmlidXRlLmF0dHIsCisJJnBvcnRpb19wb3J0dHlwZV9hdHRyaWJ1dGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHZvaWQgcG9ydGlvX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IHVpb19wb3J0aW8gKnBvcnRpbyA9IHRvX3BvcnRpbyhrb2JqKTsKKwlrZnJlZShwb3J0aW8pOworfQorCitzdGF0aWMgc3NpemVfdCBwb3J0aW9fdHlwZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHVpb19wb3J0aW8gKnBvcnRpbyA9IHRvX3BvcnRpbyhrb2JqKTsKKwlzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQgPSBwb3J0aW8tPnBvcnQ7CisJc3RydWN0IHBvcnRpb19zeXNmc19lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgcG9ydGlvX3N5c2ZzX2VudHJ5LCBhdHRyKTsKKworCWlmICghZW50cnktPnNob3cpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGVudHJ5LT5zaG93KHBvcnQsIGJ1Zik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHBvcnRpb19zeXNmc19vcHMgPSB7CisJLnNob3cgPSBwb3J0aW9fdHlwZV9zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgcG9ydGlvX2F0dHJfdHlwZSA9IHsKKwkucmVsZWFzZQk9IHBvcnRpb19yZWxlYXNlLAorCS5zeXNmc19vcHMJPSAmcG9ydGlvX3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IHBvcnRpb19hdHRycywKK307CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTE3NywxMCArMjU1LDEzIEBACiBzdGF0aWMgaW50IHVpb19kZXZfYWRkX2F0dHJpYnV0ZXMoc3RydWN0IHVpb19kZXZpY2UgKmlkZXYpCiB7CiAJaW50IHJldDsKLQlpbnQgbWk7CisJaW50IG1pLCBwaTsKIAlpbnQgbWFwX2ZvdW5kID0gMDsKKwlpbnQgcG9ydGlvX2ZvdW5kID0gMDsKIAlzdHJ1Y3QgdWlvX21lbSAqbWVtOwogCXN0cnVjdCB1aW9fbWFwICptYXA7CisJc3RydWN0IHVpb19wb3J0ICpwb3J0OworCXN0cnVjdCB1aW9fcG9ydGlvICpwb3J0aW87CiAKIAlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlkZXYtPmRldi0+a29iaiwgJnVpb19hdHRyX2dycCk7CiAJaWYgKHJldCkKQEAgLTE5NSwyNSArMjc2LDU4IEBACiAJCQlpZGV2LT5tYXBfZGlyID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgibWFwcyIsCiAJCQkJCQkJJmlkZXYtPmRldi0+a29iaik7CiAJCQlpZiAoIWlkZXYtPm1hcF9kaXIpCi0JCQkJZ290byBlcnI7CisJCQkJZ290byBlcnJfbWFwOwogCQl9CiAJCW1hcCA9IGt6YWxsb2Moc2l6ZW9mKCptYXApLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtYXApCi0JCQlnb3RvIGVycjsKKwkJCWdvdG8gZXJyX21hcDsKIAkJa29iamVjdF9pbml0KCZtYXAtPmtvYmosICZtYXBfYXR0cl90eXBlKTsKIAkJbWFwLT5tZW0gPSBtZW07CiAJCW1lbS0+bWFwID0gbWFwOwogCQlyZXQgPSBrb2JqZWN0X2FkZCgmbWFwLT5rb2JqLCBpZGV2LT5tYXBfZGlyLCAibWFwJWQiLCBtaSk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKKwkJCWdvdG8gZXJyX21hcDsKIAkJcmV0ID0ga29iamVjdF91ZXZlbnQoJm1hcC0+a29iaiwgS09CSl9BREQpOwogCQlpZiAocmV0KQotCQkJZ290byBlcnI7CisJCQlnb3RvIGVycl9tYXA7CisJfQorCisJZm9yIChwaSA9IDA7IHBpIDwgTUFYX1VJT19QT1JUX1JFR0lPTlM7IHBpKyspIHsKKwkJcG9ydCA9ICZpZGV2LT5pbmZvLT5wb3J0W3BpXTsKKwkJaWYgKHBvcnQtPnNpemUgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoIXBvcnRpb19mb3VuZCkgeworCQkJcG9ydGlvX2ZvdW5kID0gMTsKKwkJCWlkZXYtPnBvcnRpb19kaXIgPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJwb3J0aW8iLAorCQkJCQkJCSZpZGV2LT5kZXYtPmtvYmopOworCQkJaWYgKCFpZGV2LT5wb3J0aW9fZGlyKQorCQkJCWdvdG8gZXJyX3BvcnRpbzsKKwkJfQorCQlwb3J0aW8gPSBremFsbG9jKHNpemVvZigqcG9ydGlvKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcG9ydGlvKQorCQkJZ290byBlcnJfcG9ydGlvOworCQlrb2JqZWN0X2luaXQoJnBvcnRpby0+a29iaiwgJnBvcnRpb19hdHRyX3R5cGUpOworCQlwb3J0aW8tPnBvcnQgPSBwb3J0OworCQlwb3J0LT5wb3J0aW8gPSBwb3J0aW87CisJCXJldCA9IGtvYmplY3RfYWRkKCZwb3J0aW8tPmtvYmosIGlkZXYtPnBvcnRpb19kaXIsCisJCQkJCQkJInBvcnQlZCIsIHBpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3BvcnRpbzsKKwkJcmV0ID0ga29iamVjdF91ZXZlbnQoJnBvcnRpby0+a29iaiwgS09CSl9BREQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcG9ydGlvOwogCX0KIAogCXJldHVybiAwOwogCi1lcnI6CitlcnJfcG9ydGlvOgorCWZvciAocGktLTsgcGkgPj0gMDsgcGktLSkgeworCQlwb3J0ID0gJmlkZXYtPmluZm8tPnBvcnRbcGldOworCQlwb3J0aW8gPSBwb3J0LT5wb3J0aW87CisJCWtvYmplY3RfcHV0KCZwb3J0aW8tPmtvYmopOworCX0KKwlrb2JqZWN0X3B1dChpZGV2LT5wb3J0aW9fZGlyKTsKK2Vycl9tYXA6CiAJZm9yIChtaS0tOyBtaT49MDsgbWktLSkgewogCQltZW0gPSAmaWRldi0+aW5mby0+bWVtW21pXTsKIAkJbWFwID0gbWVtLT5tYXA7CkBAIC0yMjgsMTUgKzM0MiwyNiBAQAogCiBzdGF0aWMgdm9pZCB1aW9fZGV2X2RlbF9hdHRyaWJ1dGVzKHN0cnVjdCB1aW9fZGV2aWNlICppZGV2KQogewotCWludCBtaTsKKwlpbnQgaTsKIAlzdHJ1Y3QgdWlvX21lbSAqbWVtOwotCWZvciAobWkgPSAwOyBtaSA8IE1BWF9VSU9fTUFQUzsgbWkrKykgewotCQltZW0gPSAmaWRldi0+aW5mby0+bWVtW21pXTsKKwlzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VJT19NQVBTOyBpKyspIHsKKwkJbWVtID0gJmlkZXYtPmluZm8tPm1lbVtpXTsKIAkJaWYgKG1lbS0+c2l6ZSA9PSAwKQogCQkJYnJlYWs7CiAJCWtvYmplY3RfcHV0KCZtZW0tPm1hcC0+a29iaik7CiAJfQogCWtvYmplY3RfcHV0KGlkZXYtPm1hcF9kaXIpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9VSU9fUE9SVF9SRUdJT05TOyBpKyspIHsKKwkJcG9ydCA9ICZpZGV2LT5pbmZvLT5wb3J0W2ldOworCQlpZiAocG9ydC0+c2l6ZSA9PSAwKQorCQkJYnJlYWs7CisJCWtvYmplY3RfcHV0KCZwb3J0LT5wb3J0aW8tPmtvYmopOworCX0KKwlrb2JqZWN0X3B1dChpZGV2LT5wb3J0aW9fZGlyKTsKKwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmaWRldi0+ZGV2LT5rb2JqLCAmdWlvX2F0dHJfZ3JwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX2NpZi5jIGIvZHJpdmVycy91aW8vdWlvX2NpZi5jCmluZGV4IDU3Mzc2MDYuLmM2MGI4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpb19jaWYuYworKysgYi9kcml2ZXJzL3Vpby91aW9fY2lmLmMKQEAgLTU3LDggKzU3LDcgQEAKIAlpbmZvLT5tZW1bMF0uYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOwogCWlmICghaW5mby0+bWVtWzBdLmFkZHIpCiAJCWdvdG8gb3V0X3JlbGVhc2U7Ci0JaW5mby0+bWVtWzBdLmludGVybmFsX2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAotCQkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7CisJaW5mby0+bWVtWzBdLmludGVybmFsX2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAwKTsKIAlpZiAoIWluZm8tPm1lbVswXS5pbnRlcm5hbF9hZGRyKQogCQlnb3RvIG91dF9yZWxlYXNlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCmluZGV4IDFmODJjODMuLjNmMDY4MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCkBAIC04MSw3ICs4MSw4IEBACiAJCWdvdG8gYmFkMDsKIAl9CiAKLQlpZiAodWlvaW5mby0+aGFuZGxlciB8fCB1aW9pbmZvLT5pcnFjb250cm9sIHx8IHVpb2luZm8tPmlycV9mbGFncykgeworCWlmICh1aW9pbmZvLT5oYW5kbGVyIHx8IHVpb2luZm8tPmlycWNvbnRyb2wgfHwKKwkgICAgdWlvaW5mby0+aXJxX2ZsYWdzICYgSVJRRl9TSEFSRUQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIpOwogCQlnb3RvIGJhZDA7CiAJfQpAQCAtMTMyLDcgKzEzMyw3IEBACiAJICogSW50ZXJydXB0IHNoYXJpbmcgaXMgbm90IHN1cHBvcnRlZC4KIAkgKi8KIAotCXVpb2luZm8tPmlycV9mbGFncyA9IElSUUZfRElTQUJMRUQ7CisJdWlvaW5mby0+aXJxX2ZsYWdzIHw9IElSUUZfRElTQUJMRUQ7CiAJdWlvaW5mby0+aGFuZGxlciA9IHVpb19wZHJ2X2dlbmlycV9oYW5kbGVyOwogCXVpb2luZm8tPmlycWNvbnRyb2wgPSB1aW9fcGRydl9nZW5pcnFfaXJxY29udHJvbDsKIAl1aW9pbmZvLT5wcml2ID0gcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCmluZGV4IGJlMWZhMDcuLjM5OWUxNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwpAQCAtMjg2LDcgKzI4Niw3IEBACiAJcmV0dXJuIHVzYl9yZXN1bWUoZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBwbV9vcHMgdXNiX2RldmljZV9wbV9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgdXNiX2RldmljZV9wbV9vcHMgPSB7CiAJLnByZXBhcmUgPQl1c2JfZGV2X3ByZXBhcmUsCiAJLmNvbXBsZXRlID0JdXNiX2Rldl9jb21wbGV0ZSwKIAkuc3VzcGVuZCA9CXVzYl9kZXZfc3VzcGVuZCwKQEAgLTMwMSw3ICszMDEsNyBAQAogCiAjZGVmaW5lIGtzdXNwZW5kX3VzYl9pbml0KCkJMAogI2RlZmluZSBrc3VzcGVuZF91c2JfY2xlYW51cCgpCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSB1c2JfZGV2aWNlX3BtX29wcwkoKihzdHJ1Y3QgcG1fb3BzICopMCkKKyNkZWZpbmUgdXNiX2RldmljZV9wbV9vcHMJKCooc3RydWN0IGRldl9wbV9vcHMgKikwKQogCiAjZW5kaWYJLyogQ09ORklHX1BNICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKaW5kZXggYThhMWRlNC4uMGIyYmI4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKQEAgLTE0NzQsNyArMTQ3NCw3IEBACiAJCS5lcDAJPSAmY29udHJvbGxlci5lcFswXS5lcCwKIAkJLm5hbWUJPSBkcml2ZXJfbmFtZSwKIAkJLmRldgk9IHsKLQkJCS5idXNfaWQgPSAiZ2FkZ2V0IiwKKwkJCS5pbml0X25hbWUgPSAiZ2FkZ2V0IiwKIAkJCS5yZWxlYXNlID0gbm9wX3JlbGVhc2UsCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuYwppbmRleCBhZTMwYWIxLi42NWIwM2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuYwpAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAkJLmlzX2R1YWxzcGVlZAk9IDEsCiAJCS5uYW1lCQk9ICJhdG1lbF91c2JhX3VkYyIsCiAJCS5kZXYJPSB7Ci0JCQkuYnVzX2lkCQk9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZQk9ICJnYWRnZXQiLAogCQkJLnJlbGVhc2UJPSBub3BfcmVsZWFzZSwKIAkJfSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMKaW5kZXggYjM0MDhmZi4uZjQwMjcyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jCkBAIC0yNTQ1LDcgKzI1NDUsNyBAQAogCiAJZGV2aWNlX2luaXRpYWxpemUoJnVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2KTsKIAotCXN0cmNweSh1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldi5idXNfaWQsICJnYWRnZXQiKTsKKwlkZXZfc2V0X25hbWUoJnVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2LCAiZ2FkZ2V0Iik7CiAKIAl1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldi5yZWxlYXNlID0gcWVfdWRjX3JlbGVhc2U7CiAJdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYucGFyZW50ID0gJm9mZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCmluZGV4IGM2ZTdkZjAuLmQ1NTRiMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCkBAIC0xOTgxLDcgKzE5ODEsNyBAQAogCQkgICAuZXAwID0gJm1lbW9yeS5lcFswXS5lcCwKIAkJICAgLm5hbWUgPSBkcml2ZXJfbmFtZSwKIAkJICAgLmRldiA9IHsKLQkJCSAgIC5idXNfaWQgPSAiZ2FkZ2V0IiwKKwkJCSAgIC5pbml0X25hbWUgPSAiZ2FkZ2V0IiwKIAkJCSAgIC5yZWxlYXNlID0gbm9wX3JlbGVhc2UsCiAJCQkgICB9LAogCQkgICB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMKaW5kZXggOGM1MDI2Yi4uNjk3YTBjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jCkBAIC0xODMzLDcgKzE4MzMsNyBAQAogCQkuZXAwCQk9ICZtZW1vcnkuZXBbMF0uZXAsCiAJCS5uYW1lCQk9IGRyaXZlcl9uYW1lLAogCQkuZGV2ID0gewotCQkJLmJ1c19pZAkJPSAiZ2FkZ2V0IiwKKwkJCS5pbml0X25hbWUJPSAiZ2FkZ2V0IiwKIAkJCS5yZWxlYXNlCT0gbm9wX3JlbGVhc2UsCiAJCX0sCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCmluZGV4IDk0NGU0ZmYuLjY1MTEwZDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMKQEAgLTIxNjIsNyArMjE2Miw3IEBACiAJCS5lcDAJCT0gJm1lbW9yeS51ZGNfdXNiX2VwWzBdLnVzYl9lcCwKIAkJLm5hbWUJCT0gZHJpdmVyX25hbWUsCiAJCS5kZXYgPSB7Ci0JCQkuYnVzX2lkCQk9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZQk9ICJnYWRnZXQiLAogCQl9LAogCX0sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKaW5kZXggOGQ4ZDY1MS4uYzdlMjU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKQEAgLTE3MjcsNyArMTcyNyw3IEBACiAJCS5lcDAJCT0gJm1lbW9yeS5lcFswXS5lcCwKIAkJLm5hbWUJCT0gZ2FkZ2V0X25hbWUsCiAJCS5kZXYgPSB7Ci0JCQkuYnVzX2lkCQk9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZQk9ICJnYWRnZXQiLAogCQl9LAogCX0sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCmluZGV4IDI0M2VhNGEuLmRiMTYxMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwpAQCAtMjA1MSw3ICsyMDUxLDcgQEAKIAogCS8qIFZpcnR1YWxpemUgbW1pbyByZWdpb24gKi8KIAlpbmZvLT5maXgubW1pb19zdGFydCA9IHJlZ19hZGRyOwotCXBhci0+cmVnYmFzZSA9IGlvcmVtYXAocmVnX2FkZHIsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCXBhci0+cmVnYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAyKTsKIAlpZiAoIXBhci0+cmVnYmFzZSkKIAkJZ290byBlcnJfZnJlZV9pbmZvOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jCmluZGV4IGZhYjBiYzguLjA2NjRmYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAluZXdfYmQtPmRldi5jbGFzcyA9IGJhY2tsaWdodF9jbGFzczsKIAluZXdfYmQtPmRldi5wYXJlbnQgPSBwYXJlbnQ7CiAJbmV3X2JkLT5kZXYucmVsZWFzZSA9IGJsX2RldmljZV9yZWxlYXNlOwotCXN0cmxjcHkobmV3X2JkLT5kZXYuYnVzX2lkLCBuYW1lLCBCVVNfSURfU0laRSk7CisJZGV2X3NldF9uYW1lKCZuZXdfYmQtPmRldiwgbmFtZSk7CiAJZGV2X3NldF9kcnZkYXRhKCZuZXdfYmQtPmRldiwgZGV2ZGF0YSk7CiAKIAlyYyA9IGRldmljZV9yZWdpc3RlcigmbmV3X2JkLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYwppbmRleCA2ODBlNTdiLi5iNjQ0OTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJbmV3X2xkLT5kZXYuY2xhc3MgPSBsY2RfY2xhc3M7CiAJbmV3X2xkLT5kZXYucGFyZW50ID0gcGFyZW50OwogCW5ld19sZC0+ZGV2LnJlbGVhc2UgPSBsY2RfZGV2aWNlX3JlbGVhc2U7Ci0Jc3RybGNweShuZXdfbGQtPmRldi5idXNfaWQsIG5hbWUsIEJVU19JRF9TSVpFKTsKKwlkZXZfc2V0X25hbWUoJm5ld19sZC0+ZGV2LCBuYW1lKTsKIAlkZXZfc2V0X2RydmRhdGEoJm5ld19sZC0+ZGV2LCBkZXZkYXRhKTsKIAogCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZuZXdfbGQtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYyBiL2RyaXZlcnMvdmlkZW8vYmZpbi10MzUwbWNxYi1mYi5jCmluZGV4IDdkMWI4MTkuLmE5YjNhZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmZpbi10MzUwbWNxYi1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmZpbi10MzUwbWNxYi1mYi5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIHsKIAogCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IExDRF9CUFApIHsKLQkJcHJfZGVidWcoIiVzOiBkZXB0aCBub3Qgc3VwcG9ydGVkOiAldSBCUFBcbiIsIF9fRlVOQ1RJT05fXywKKwkJcHJfZGVidWcoIiVzOiBkZXB0aCBub3Qgc3VwcG9ydGVkOiAldSBCUFBcbiIsIF9fZnVuY19fLAogCQkJIHZhci0+Yml0c19wZXJfcGl4ZWwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNjQsNyArMjY0LDcgQEAKIAkgICAgaW5mby0+dmFyLnhyZXNfdmlydHVhbCAhPSB2YXItPnhyZXNfdmlydHVhbCB8fAogCSAgICBpbmZvLT52YXIueXJlc192aXJ0dWFsICE9IHZhci0+eXJlc192aXJ0dWFsKSB7CiAJCXByX2RlYnVnKCIlczogUmVzb2x1dGlvbiBub3Qgc3VwcG9ydGVkOiBYJXUgeCBZJXUgXG4iLAotCQkJIF9fRlVOQ1RJT05fXywgdmFyLT54cmVzLCB2YXItPnlyZXMpOworCQkJIF9fZnVuY19fLCB2YXItPnhyZXMsIHZhci0+eXJlcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjc0LDcgKzI3NCw3IEBACiAKIAlpZiAoKGluZm8tPmZpeC5saW5lX2xlbmd0aCAqIHZhci0+eXJlc192aXJ0dWFsKSA+IGluZm8tPmZpeC5zbWVtX2xlbikgewogCQlwcl9kZWJ1ZygiJXM6IE1lbW9yeSBMaW1pdCByZXF1ZXN0ZWQgeXJlc192aXJ0dWFsID0gJXVcbiIsCi0JCQkgX19GVU5DVElPTl9fLCB2YXItPnlyZXNfdmlydHVhbCk7CisJCQkgX19mdW5jX18sIHZhci0+eXJlc192aXJ0dWFsKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jIGIvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYwppbmRleCBjOWIxOTEzLi5jN2ZmM2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCWJsdWUgPj49IDg7CiAJdHJhbnNwID4+PSA4OwogCi0JKCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gYmUzMl90b19jcHUodHJhbnNwIDw8IDI0IHwKKwkoKF9fYmUzMiAqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPSBjcHVfdG9fYmUzMih0cmFuc3AgPDwgMjQgfAogCQlyZWQgPDwgMCB8IGdyZWVuIDw8IDggfCBibHVlIDw8IDE2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYyBiL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYwppbmRleCAzOWQ1ZDY0Li43YTllNDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jCkBAIC0xNTgzLDggKzE1ODMsNyBAQAogCQlnb3RvIGZhaWxlZF9yZWxlYXNlOwogCiAJY2ZiLT5kZXYgPSBkZXY7Ci0JY2ZiLT5yZWdpb24gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAotCQkJICAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwljZmItPnJlZ2lvbiA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDApOwogCWlmICghY2ZiLT5yZWdpb24pCiAJCWdvdG8gZmFpbGVkX2lvcmVtYXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwppbmRleCAzYzY1YjBkLi43NTZlZmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKKysrIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCkBAIC01MTAsNiArNTEwLDEwIEBACiAJCWZiX2xvZ29fZXhfbnVtID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBmYl9sb2dvX2V4X251bTsgaSsrKSB7CisJCWlmIChmYl9sb2dvX2V4W2ldLmxvZ28tPnR5cGUgIT0gZmJfbG9nby5sb2dvLT50eXBlKSB7CisJCQlmYl9sb2dvX2V4W2ldLmxvZ28gPSBOVUxMOworCQkJY29udGludWU7CisJCX0KIAkJaGVpZ2h0ICs9IGZiX2xvZ29fZXhbaV0ubG9nby0+aGVpZ2h0OwogCQlpZiAoaGVpZ2h0ID4geXJlcykgewogCQkJaGVpZ2h0IC09IGZiX2xvZ29fZXhbaV0ubG9nby0+aGVpZ2h0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nYmVmYi5jIGIvZHJpdmVycy92aWRlby9nYmVmYi5jCmluZGV4IGY4OWMzY2MuLmZlNWI1MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKQEAgLTkxMiw2ICs5MTIsNyBAQAogewogCXVuc2lnbmVkIGludCBsaW5lX2xlbmd0aDsKIAlzdHJ1Y3QgZ2JlX3RpbWluZ19pbmZvIHRpbWluZzsKKwlpbnQgcmV0OwogCiAJLyogTGltaXQgYnBwIHRvIDgsIDE2LCBhbmQgMzIgKi8KIAlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSA4KQpAQCAtOTMwLDggKzkzMSwxMCBAQAogCiAJdmFyLT5ncmF5c2NhbGUgPSAwOwkvKiBObyBncmF5c2NhbGUgZm9yIG5vdyAqLwogCi0JaWYgKCh2YXItPnBpeGNsb2NrID0gY29tcHV0ZV9nYmVfdGltaW5nKHZhciwgJnRpbWluZykpIDwgMCkKLQkJcmV0dXJuKC1FSU5WQUwpOworCXJldCA9IGNvbXB1dGVfZ2JlX3RpbWluZyh2YXIsICZ0aW1pbmcpOworCXZhci0+cGl4Y2xvY2sgPSByZXQ7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogQWRqdXN0IHZpcnR1YWwgcmVzb2x1dGlvbiwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsIHx8ICgheXdyYXAgJiYgIXlwYW4pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYwppbmRleCBiYjIwYTIyLi43NTFlNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYwpAQCAtMjE3LDggKzIxNyw3IEBACiAJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMCwgImd4MWZiICh2aWRlbykiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlwYXItPnZpZF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOworCXBhci0+dmlkX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAwKTsKIAlpZiAoIXBhci0+dmlkX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4ZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYwppbmRleCBkZTJiOGY5Li40ODQxMTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4ZmJfY29yZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3hmYl9jb3JlLmMKQEAgLTI0MiwyMyArMjQyLDIxIEBACiAJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMywgImd4ZmIgKHZpZGVvIHByb2Nlc3NvcikiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlwYXItPnZpZF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAzKSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMykpOworCXBhci0+dmlkX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAzKTsKIAlpZiAoIXBhci0+dmlkX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMiwgImd4ZmIgKGRpc3BsYXkgY29udHJvbGxlcikiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlwYXItPmRjX3JlZ3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDIpLCBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMikpOworCXBhci0+ZGNfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDIpOwogCWlmICghcGFyLT5kY19yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDEsICJneGZiIChncmFwaGljcyBwcm9jZXNzb3IpIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT5ncF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKSwKLQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMSkpOworCXBhci0+Z3BfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDEpOwogCiAJaWYgKCFwYXItPmdwX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9seGZiX2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvbHhmYl9jb3JlLmMKaW5kZXggMmNkOWI3NC4uYjk2NWVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9seGZiX2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2x4ZmJfY29yZS5jCkBAIC0zNzksMjAgKzM3OSwxNyBAQAogCWlmIChpbmZvLT5zY3JlZW5fYmFzZSA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwogCi0JcGFyLT5ncF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMSkpOworCXBhci0+Z3BfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDEpOwogCiAJaWYgKHBhci0+Z3BfcmVncyA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwogCi0JcGFyLT5kY19yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKSwKLQkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMikpOworCXBhci0+ZGNfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDIpOwogCiAJaWYgKHBhci0+ZGNfcmVncyA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwogCi0JcGFyLT52cF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAzKSwKLQkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMykpOworCXBhci0+dnBfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDMpOwogCiAJaWYgKHBhci0+dnBfcmVncyA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9neHQ0NTAwLmMgYi9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYwppbmRleCA1NjQ1NTc3Li44OTZlNTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYworKysgYi9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBzZXVkb19wYWxldHRlOwogCiAJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSByZWdfcGh5czsKLQlwYXItPnJlZ3MgPSBpb3JlbWFwKHJlZ19waHlzLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlwYXItPnJlZ3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CiAJaWYgKCFwYXItPnJlZ3MpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ3h0NDUwMDogY2Fubm90IG1hcCByZWdpc3RlcnNcbiIpOwogCQlnb3RvIGVycl9mcmVlX2FsbDsKQEAgLTY1Niw3ICs2NTYsNyBAQAogCiAJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBmYl9waHlzOwogCWluZm8tPmZpeC5zbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7Ci0JaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGZiX3BoeXMsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworCWluZm8tPnNjcmVlbl9iYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDEpOwogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ3h0NDUwMDogY2Fubm90IG1hcCBmcmFtZWJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyX3VubWFwX3JlZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfYWNjZWwuYwppbmRleCA3Njc2NGVhLi5mNWJlZGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX2FjY2VsLmMKQEAgLTMwMSw4ICszMDEsMTAgQEAKIAl1MzIgZHgsIGR5LCB3aWR0aCwgaGVpZ2h0LCBkZXN0LCByb3AgPSAwLCBjb2xvciA9IDA7CiAKIAlpZiAoIWluZm8tPnZhci5hY2NlbF9mbGFncyB8fCBwYXItPmRldl9mbGFncyAmIExPQ0tVUCB8fAotCSAgICBwYXItPmRlcHRoID09IDQpIAotCQlyZXR1cm4gY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCSAgICBwYXItPmRlcHRoID09IDQpIHsKKwkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCQlyZXR1cm47CisJfQogCiAJaWYgKHBhci0+ZGVwdGggPT0gMSkgCiAJCWNvbG9yID0gcmVjdC0+Y29sb3I7CkBAIC0zMjcsOCArMzI5LDEwIEBACiAJdTMyIHN4LCBzeSwgZHgsIGR5LCBwaXRjaCwgd2lkdGgsIGhlaWdodCwgc3JjLCBkZXN0LCB4ZGlyOwogCiAJaWYgKCFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVAgfHwKLQkgICAgcGFyLT5kZXB0aCA9PSA0KQotCQlyZXR1cm4gY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJICAgIHBhci0+ZGVwdGggPT0gNCkgeworCQljZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KIAogCWR4ID0gcmVnaW9uLT5keCAqIHBhci0+ZGVwdGg7CiAJc3ggPSByZWdpb24tPnN4ICogcGFyLT5kZXB0aDsKQEAgLTM2Niw4ICszNzAsMTAgQEAKIAl1MzIgZmcgPSAwLCBiZyA9IDAsIHNpemUsIGRzdDsKIAkKIAlpZiAoIWluZm8tPnZhci5hY2NlbF9mbGFncyB8fCBwYXItPmRldl9mbGFncyAmIExPQ0tVUCB8fAotCSAgICBwYXItPmRlcHRoID09IDQgfHwgaW1hZ2UtPmRlcHRoICE9IDEpIAotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJICAgIHBhci0+ZGVwdGggPT0gNCB8fCBpbWFnZS0+ZGVwdGggIT0gMSkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KIAogCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKaW5kZXggYTA5ZTIzNi4uNmQ4ZTU0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCkBAIC0xNDkzLDggKzE0OTMsMTAgQEAKIAlEQkdfTVNHKCJpbnRlbGZiX2ZpbGxyZWN0XG4iKTsKICNlbmRpZgogCi0JaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpCi0JCXJldHVybiBjZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpIHsKKwkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCQlyZXR1cm47CisJfQogCiAJaWYgKHJlY3QtPnJvcCA9PSBST1BfQ09QWSkKIAkJcm9wID0gUEFUX1JPUF9HWENPUFk7CkBAIC0xNTIxLDggKzE1MjMsMTAgQEAKIAlEQkdfTVNHKCJpbnRlbGZiX2NvcHlhcmVhXG4iKTsKICNlbmRpZgogCi0JaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpCi0JCXJldHVybiBjZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwlpZiAoIUFDQ0VMKGRpbmZvLCBpbmZvKSB8fCBkaW5mby0+ZGVwdGggPT0gNCkgeworCQljZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KIAogCWludGVsZmJod19kb19iaXRibHQoZGluZm8sIHJlZ2lvbi0+c3gsIHJlZ2lvbi0+c3ksIHJlZ2lvbi0+ZHgsCiAJCQkgICAgcmVnaW9uLT5keSwgcmVnaW9uLT53aWR0aCwgcmVnaW9uLT5oZWlnaHQsCkBAIC0xNTQwLDggKzE1NDQsMTAgQEAKICNlbmRpZgogCiAJaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQKLQkgICAgfHwgaW1hZ2UtPmRlcHRoICE9IDEpCi0JCXJldHVybiBjZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkgICAgfHwgaW1hZ2UtPmRlcHRoICE9IDEpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoZGluZm8tPmRlcHRoICE9IDgpIHsKIAkJZmdjb2xvciA9IGRpbmZvLT5wc2V1ZG9fcGFsZXR0ZVtpbWFnZS0+ZmdfY29sb3JdOwpAQCAtMTU1NCw4ICsxNTYwLDEwIEBACiAJaWYgKCFpbnRlbGZiaHdfZG9fZHJhd2dseXBoKGRpbmZvLCBmZ2NvbG9yLCBiZ2NvbG9yLCBpbWFnZS0+d2lkdGgsCiAJCQkJICAgIGltYWdlLT5oZWlnaHQsIGltYWdlLT5kYXRhLAogCQkJCSAgICBpbWFnZS0+ZHgsIGltYWdlLT5keSwKLQkJCQkgICAgZGluZm8tPnBpdGNoLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpKQotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCQkJICAgIGRpbmZvLT5waXRjaCwgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIGludCBpbnRlbGZiX2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX2N1cnNvciAqY3Vyc29yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tb2RlZGIuYyBiL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKaW5kZXggZDNjM2FmNS4uMTYxODYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tb2RlZGIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCkBAIC0zMjksNyArMzI5LDcgQEAKIAkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAogCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCiAJLyogMTcgMTE1Mng4NjQtNzUgVkVTQSAqLwotCXsgTlVMTCwgNzUsIDExNTMsIDg2NCwgOTI1OSwgMjU2LCA2NCwgMzIsIDEsIDEyOCwgMywKKwl7IE5VTEwsIDc1LCAxMTUyLCA4NjQsIDkyNTksIDI1NiwgNjQsIDMyLCAxLCAxMjgsIDMsCiAJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKIAkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAogCS8qIDE4IDEyODB4OTYwLTYwIFZFU0EgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbmVvZmIuYyBiL2RyaXZlcnMvdmlkZW8vbmVvZmIuYwppbmRleCBiZmI4MDJkLi41ODg1MjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9uZW9mYi5jCkBAIC0xNDUzLDcgKzE0NTMsOCBAQAogCQkJICogaXMgbGVzcyB0aGFuIDE2IGJpdHMgd2lkZS4gVGhpcyBpcyBkdWUgdG8gaW5zdWZmaWNpZW50CiAJCQkgKiBwYWRkaW5nIHdoZW4gd3JpdGluZyB0aGUgaW1hZ2UuIFdlIG5lZWQgdG8gYWRqdXN0CiAJCQkgKiBzdHJ1Y3QgZmJfcGl4bWFwLiBOb3QgeWV0IGRvbmUuICovCi0JCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJCXJldHVybjsKIAkJfQogCQlibHRDbnRsX2ZsYWdzID0gTkVPX0JDMF9TUkNfTU9OTzsKIAl9IGVsc2UgaWYgKGltYWdlLT5kZXB0aCA9PSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKQEAgLTE0NjEsNyArMTQ2Miw4IEBACiAJfSBlbHNlIHsKIAkJLyogV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlmIGltYWdlCiAJCSAqIGRlcHRoIGlzIGRpZmZlcmVudCBmcm9tIGRpc3BsYXkgKi8KLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOwogCX0KIAogCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYWNjZWwuYwppbmRleCBmYTQ4MjFjLi5hZDY0NzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2FjY2VsLmMKQEAgLTMwMCw4ICszMDAsMTAgQEAKIAlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCiAJCXJldHVybjsKIAotCWlmIChwYXItPmxvY2t1cCkKLQkJcmV0dXJuIGNmYl9jb3B5YXJlYShpbmZvLCByZWdpb24pOworCWlmIChwYXItPmxvY2t1cCkgeworCQljZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KIAogCU5WRG1hU3RhcnQoaW5mbywgcGFyLCBCTElUX1BPSU5UX1NSQywgMyk7CiAJTlZEbWFOZXh0KHBhciwgKHJlZ2lvbi0+c3kgPDwgMTYpIHwgcmVnaW9uLT5zeCk7CkBAIC0zMTksOCArMzIxLDEwIEBACiAJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQogCQlyZXR1cm47CiAKLQlpZiAocGFyLT5sb2NrdXApCi0JCXJldHVybiBjZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJaWYgKHBhci0+bG9ja3VwKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCkKIAkJY29sb3IgPSByZWN0LT5jb2xvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb3V0cHV0LmMgYi9kcml2ZXJzL3ZpZGVvL291dHB1dC5jCmluZGV4IGYyZGY1NTEuLjVlNjQzOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb3V0cHV0LmMKKysrIGIvZHJpdmVycy92aWRlby9vdXRwdXQuYwpAQCAtOTYsNyArOTYsNyBAQAogCW5ld19kZXYtPnByb3BzID0gb3A7CiAJbmV3X2Rldi0+ZGV2LmNsYXNzID0gJnZpZGVvX291dHB1dF9jbGFzczsKIAluZXdfZGV2LT5kZXYucGFyZW50ID0gZGV2OwotCXN0cmxjcHkobmV3X2Rldi0+ZGV2LmJ1c19pZCxuYW1lLCBCVVNfSURfU0laRSk7CisJZGV2X3NldF9uYW1lKCZuZXdfZGV2LT5kZXYsIG5hbWUpOwogCWRldl9zZXRfZHJ2ZGF0YSgmbmV3X2Rldi0+ZGV2LCBkZXZkYXRhKTsKIAlyZXRfY29kZSA9IGRldmljZV9yZWdpc3RlcigmbmV3X2Rldi0+ZGV2KTsKIAlpZiAocmV0X2NvZGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG0zZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwppbmRleCA2ODA4OWQxLi42NjY2ZjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTNmYi5jCkBAIC01MzksOCArNTM5LDEwIEBACiAJCWJneCA9IHBhci0+cGFsZXR0ZVtpbWFnZS0+YmdfY29sb3JdOwogCQlicmVhazsKIAl9Ci0JaWYgKGltYWdlLT5kZXB0aCAhPSAxKQotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJaWYgKGltYWdlLT5kZXB0aCAhPSAxKSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQlyZXR1cm47CisJfQogCiAJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSA4KSB7CiAJCWZneCB8PSBmZ3ggPDwgODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jIGIvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKaW5kZXggZjk0YWU4NC4uZGNkOTg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKQEAgLTE1OSw2ICsxNTksOSBAQAogCQlicmVhazsKIAogCWNhc2UgU001MDFfTUVNRl9QQU5FTDoKKwkJaWYgKHNpemUgPiBpbmYtPmZibWVtX2xlbikKKwkJCXJldHVybiAtRU5PTUVNOworCiAJCXB0ciA9IGluZi0+ZmJtZW1fbGVuIC0gc2l6ZTsKIAkJZmJpID0gaW5mLT5mYltIRUFEX0NSVF07CiAKQEAgLTE3Miw5ICsxNzUsNiBAQAogCQlpZiAoZmJpICYmIHB0ciA8IGZiaS0+Zml4LnNtZW1fbGVuKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJaWYgKHB0ciA8IDApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQogCQlicmVhazsKIAogCWNhc2UgU001MDFfTUVNRl9DUlQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jIGIvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYwppbmRleCBlMjFmZTViLi4zN2I0MzNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jCkBAIC04NzAsOCArODcwLDEwIEBACiAJdTMyIGNvbCA9IDAsIHJvcCA9IDA7CiAJaW50IHBpdGNoOwogCi0JaWYgKCF2aWFmYl9hY2NlbCkKLQkJcmV0dXJuIGNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwlpZiAoIXZpYWZiX2FjY2VsKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmICghcmVjdC0+d2lkdGggfHwgIXJlY3QtPmhlaWdodCkKIAkJcmV0dXJuOwpAQCAtOTM3LDggKzkzOSwxMCBAQAogCiAJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfY29weWFyZWEhIVxuIik7CiAKLQlpZiAoIXZpYWZiX2FjY2VsKQotCQlyZXR1cm4gY2ZiX2NvcHlhcmVhKGluZm8sIGFyZWEpOworCWlmICghdmlhZmJfYWNjZWwpIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIGFyZWEpOworCQlyZXR1cm47CisJfQogCiAJaWYgKCFhcmVhLT53aWR0aCB8fCAhYXJlYS0+aGVpZ2h0KQogCQlyZXR1cm47CkBAIC05OTQsOCArOTk4LDEwIEBACiAJaW50IGk7CiAJaW50IHBpdGNoOwogCi0JaWYgKCF2aWFmYl9hY2NlbCkKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCWlmICghdmlhZmJfYWNjZWwpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiAKIAl1ZGF0YSA9ICh1MzIgKikgaW1hZ2UtPmRhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYwppbmRleCAyNjVmZGYyLi5iZWY2YjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCkBAIC03MywxMCArNzMsNyBAQAogLyogQSBQQ0kgZGV2aWNlIGhhcyBpdCdzIG93biBzdHJ1Y3QgZGV2aWNlIGFuZCBzbyBkb2VzIGEgdmlydGlvIGRldmljZSBzbwogICogd2UgY3JlYXRlIGEgcGxhY2UgZm9yIHRoZSB2aXJ0aW8gZGV2aWNlcyB0byBzaG93IHVwIGluIHN5c2ZzLiAgSSB0aGluayBpdAogICogd291bGQgbWFrZSBtb3JlIHNlbnNlIGZvciB2aXJ0aW8gdG8gbm90IGluc2lzdCBvbiBoYXZpbmcgaXQncyBvd24gZGV2aWNlLiAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgdmlydGlvX3BjaV9yb290ID0gewotCS5wYXJlbnQJCT0gTlVMTCwKLQkuaW5pdF9uYW1lCT0gInZpcnRpby1wY2kiLAotfTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICp2aXJ0aW9fcGNpX3Jvb3Q7CiAKIC8qIENvbnZlcnQgYSBnZW5lcmljIHZpcnRpbyBkZXZpY2UgdG8gb3VyIHN0cnVjdHVyZSAqLwogc3RhdGljIHN0cnVjdCB2aXJ0aW9fcGNpX2RldmljZSAqdG9fdnBfZGV2aWNlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQpAQCAtMzQzLDcgKzM0MCw3IEBACiAJaWYgKHZwX2RldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXZwX2Rldi0+dmRldi5kZXYucGFyZW50ID0gJnZpcnRpb19wY2lfcm9vdDsKKwl2cF9kZXYtPnZkZXYuZGV2LnBhcmVudCA9IHZpcnRpb19wY2lfcm9vdDsKIAl2cF9kZXYtPnZkZXYuZGV2LnJlbGVhc2UgPSB2aXJ0aW9fcGNpX3JlbGVhc2VfZGV2OwogCXZwX2Rldi0+dmRldi5jb25maWcgPSAmdmlydGlvX3BjaV9jb25maWdfb3BzOwogCXZwX2Rldi0+cGNpX2RldiA9IHBjaV9kZXY7CkBAIC00MzcsMTMgKzQzNCwxMyBAQAogewogCWludCBlcnI7CiAKLQllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnZpcnRpb19wY2lfcm9vdCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwl2aXJ0aW9fcGNpX3Jvb3QgPSByb290X2RldmljZV9yZWdpc3RlcigidmlydGlvLXBjaSIpOworCWlmIChJU19FUlIodmlydGlvX3BjaV9yb290KSkKKwkJcmV0dXJuIFBUUl9FUlIodmlydGlvX3BjaV9yb290KTsKIAogCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpcnRpb19wY2lfZHJpdmVyKTsKIAlpZiAoZXJyKQotCQlkZXZpY2VfdW5yZWdpc3RlcigmdmlydGlvX3BjaV9yb290KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIodmlydGlvX3BjaV9yb290KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00NTIsOCArNDQ5LDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHZpcnRpb19wY2lfZXhpdCh2b2lkKQogewotCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0aW9fcGNpX3Jvb3QpOwogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlydGlvX3BjaV9kcml2ZXIpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIodmlydGlvX3BjaV9yb290KTsKIH0KIAogbW9kdWxlX2V4aXQodmlydGlvX3BjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCAzYjYxNWQ0MC4uYWNjN2UzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MS5jCisrKyBiL2RyaXZlcnMvdzEvdzEuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiBzdHJ1Y3QgZGV2aWNlIHcxX21hc3Rlcl9kZXZpY2UgPSB7CiAJLnBhcmVudCA9IE5VTEwsCiAJLmJ1cyA9ICZ3MV9idXNfdHlwZSwKLQkuYnVzX2lkID0gIncxIGJ1cyBtYXN0ZXIiLAorCS5pbml0X25hbWUgPSAidzEgYnVzIG1hc3RlciIsCiAJLmRyaXZlciA9ICZ3MV9tYXN0ZXJfZHJpdmVyLAogCS5yZWxlYXNlID0gJncxX21hc3Rlcl9yZWxlYXNlCiB9OwpAQCAtMjExLDcgKzIxMSw3IEBACiBzdHJ1Y3QgZGV2aWNlIHcxX3NsYXZlX2RldmljZSA9IHsKIAkucGFyZW50ID0gTlVMTCwKIAkuYnVzID0gJncxX2J1c190eXBlLAotCS5idXNfaWQgPSAidzEgYnVzIHNsYXZlIiwKKwkuaW5pdF9uYW1lID0gIncxIGJ1cyBzbGF2ZSIsCiAJLmRyaXZlciA9ICZ3MV9zbGF2ZV9kcml2ZXIsCiAJLnJlbGVhc2UgPSAmdzFfc2xhdmVfcmVsZWFzZQogfTsKQEAgLTU3Myw3ICs1NzMsNyBAQAogCX0KIAogCWRldl9kYmcoZGV2LCAiSG90cGx1ZyBldmVudCBmb3IgJXMgJXMsIGJ1c19pZD0lcy5cbiIsCi0JCQlldmVudF9vd25lciwgbmFtZSwgZGV2LT5idXNfaWQpOworCQkJZXZlbnRfb3duZXIsIG5hbWUsIGRldl9uYW1lKGRldikpOwogCiAJaWYgKGRldi0+ZHJpdmVyICE9ICZ3MV9zbGF2ZV9kcml2ZXIgfHwgIXNsKQogCQlyZXR1cm4gMDsKQEAgLTYwNSw4ICs2MDUsNyBAQAogCXNsLT5kZXYuYnVzID0gJncxX2J1c190eXBlOwogCXNsLT5kZXYucmVsZWFzZSA9ICZ3MV9zbGF2ZV9yZWxlYXNlOwogCi0Jc25wcmludGYoJnNsLT5kZXYuYnVzX2lkWzBdLCBzaXplb2Yoc2wtPmRldi5idXNfaWQpLAotCQkgIiUwMngtJTAxMmxseCIsCisJZGV2X3NldF9uYW1lKCZzbC0+ZGV2LCAiJTAyeC0lMDEybGx4IiwKIAkJICh1bnNpZ25lZCBpbnQpIHNsLT5yZWdfbnVtLmZhbWlseSwKIAkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHNsLT5yZWdfbnVtLmlkKTsKIAlzbnByaW50Zigmc2wtPm5hbWVbMF0sIHNpemVvZihzbC0+bmFtZSksCkBAIC02MTUsMTMgKzYxNCwxMyBAQAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2wtPnJlZ19udW0uaWQpOwogCiAJZGV2X2RiZygmc2wtPmRldiwgIiVzOiByZWdpc3RlcmluZyAlcyBhcyAlcC5cbiIsIF9fZnVuY19fLAotCQkmc2wtPmRldi5idXNfaWRbMF0sIHNsKTsKKwkJZGV2X25hbWUoJnNsLT5kZXYpLCBzbCk7CiAKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnNsLT5kZXYpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnNsLT5kZXYsCiAJCQkiRGV2aWNlIHJlZ2lzdHJhdGlvbiBbJXNdIGZhaWxlZC4gZXJyPSVkXG4iLAotCQkJc2wtPmRldi5idXNfaWQsIGVycik7CisJCQlkZXZfbmFtZSgmc2wtPmRldiksIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02MzAsNyArNjI5LDcgQEAKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZzbC0+ZGV2LAogCQkJInN5c2ZzIGZpbGUgY3JlYXRpb24gZm9yIFslc10gZmFpbGVkLiBlcnI9JWRcbiIsCi0JCQlzbC0+ZGV2LmJ1c19pZCwgZXJyKTsKKwkJCWRldl9uYW1lKCZzbC0+ZGV2KSwgZXJyKTsKIAkJZ290byBvdXRfdW5yZWc7CiAJfQogCkBAIC02MzksNyArNjM4LDcgQEAKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZzbC0+ZGV2LAogCQkJInN5c2ZzIGZpbGUgY3JlYXRpb24gZm9yIFslc10gZmFpbGVkLiBlcnI9JWRcbiIsCi0JCQlzbC0+ZGV2LmJ1c19pZCwgZXJyKTsKKwkJCWRldl9uYW1lKCZzbC0+ZGV2KSwgZXJyKTsKIAkJZ290byBvdXRfcmVtMTsKIAl9CiAKQEAgLTY0OCw3ICs2NDcsNyBAQAogCSAgICAoKGVyciA9IHNsLT5mYW1pbHktPmZvcHMtPmFkZF9zbGF2ZShzbCkpIDwgMCkpIHsKIAkJZGV2X2Vycigmc2wtPmRldiwKIAkJCSJzeXNmcyBmaWxlIGNyZWF0aW9uIGZvciBbJXNdIGZhaWxlZC4gZXJyPSVkXG4iLAotCQkJc2wtPmRldi5idXNfaWQsIGVycik7CisJCQlkZXZfbmFtZSgmc2wtPmRldiksIGVycik7CiAJCWdvdG8gb3V0X3JlbTI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ludC5jIGIvZHJpdmVycy93MS93MV9pbnQuYwppbmRleCBhM2E1NDU2Li40YTQ2ZWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ludC5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKQEAgLTc1LDggKzc1LDcgQEAKIAltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKIAogCW1lbWNweSgmZGV2LT5kZXYsIGRldmljZSwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKLQlzbnByaW50ZihkZXYtPmRldi5idXNfaWQsIHNpemVvZihkZXYtPmRldi5idXNfaWQpLAotCQkgICJ3MV9idXNfbWFzdGVyJXUiLCBkZXYtPmlkKTsKKwlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAidzFfYnVzX21hc3RlciV1IiwgZGV2LT5pZCk7CiAJc25wcmludGYoZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSwgIncxX2J1c19tYXN0ZXIldSIsIGRldi0+aWQpOwogCiAJZGV2LT5kcml2ZXIgPSBkcml2ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggN2YyNGE5OC4uYjJhMDMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtOTksMTUgKzk5LDE1IEBACiB9CiAKIC8qIGRldmljZS88dHlwZT4vPGlkPiA9PiA8dHlwZT4tPGlkPiAqLwotc3RhdGljIGludCBmcm9udGVuZF9idXNfaWQoY2hhciBidXNfaWRbQlVTX0lEX1NJWkVdLCBjb25zdCBjaGFyICpub2RlbmFtZSkKK3N0YXRpYyBpbnQgZnJvbnRlbmRfYnVzX2lkKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQogewogCW5vZGVuYW1lID0gc3RyY2hyKG5vZGVuYW1lLCAnLycpOwotCWlmICghbm9kZW5hbWUgfHwgc3RybGVuKG5vZGVuYW1lICsgMSkgPj0gQlVTX0lEX1NJWkUpIHsKKwlpZiAoIW5vZGVuYW1lIHx8IHN0cmxlbihub2RlbmFtZSArIDEpID49IFhFTl9CVVNfSURfU0laRSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJYRU5CVVM6IGJhZCBmcm9udGVuZCAlc1xuIiwgbm9kZW5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzdHJsY3B5KGJ1c19pZCwgbm9kZW5hbWUgKyAxLCBCVVNfSURfU0laRSk7CisJc3RybGNweShidXNfaWQsIG5vZGVuYW1lICsgMSwgWEVOX0JVU19JRF9TSVpFKTsKIAlpZiAoIXN0cmNocihidXNfaWQsICcvJykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiWEVOQlVTOiBidXNfaWQgJXMgbm8gc2xhc2hcbiIsIGJ1c19pZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDYwLDYgKzQ2MCw3IEBACiAJCSAgICAgIGNvbnN0IGNoYXIgKnR5cGUsCiAJCSAgICAgIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQogeworCWNoYXIgZGV2bmFtZVtYRU5fQlVTX0lEX1NJWkVdOwogCWludCBlcnI7CiAJc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbmRldjsKIAlzaXplX3Qgc3RyaW5nbGVuOwpAQCAtNDk0LDEwICs0OTUsMTIgQEAKIAl4ZW5kZXYtPmRldi5idXMgPSAmYnVzLT5idXM7CiAJeGVuZGV2LT5kZXYucmVsZWFzZSA9IHhlbmJ1c19kZXZfcmVsZWFzZTsKIAotCWVyciA9IGJ1cy0+Z2V0X2J1c19pZCh4ZW5kZXYtPmRldi5idXNfaWQsIHhlbmRldi0+bm9kZW5hbWUpOworCWVyciA9IGJ1cy0+Z2V0X2J1c19pZChkZXZuYW1lLCB4ZW5kZXYtPm5vZGVuYW1lKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWw7CiAKKwlkZXZfc2V0X25hbWUoJnhlbmRldi0+ZGV2LCBkZXZuYW1lKTsKKwogCS8qIFJlZ2lzdGVyIHdpdGggZ2VuZXJpYyBkZXZpY2UgZnJhbWV3b3JrLiAqLwogCWVyciA9IGRldmljZV9yZWdpc3RlcigmeGVuZGV2LT5kZXYpOwogCWlmIChlcnIpCkBAIC02MTEsNyArNjE0LDcgQEAKIHsKIAlpbnQgZXhpc3RzLCByb290bGVuOwogCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXY7Ci0JY2hhciB0eXBlW0JVU19JRF9TSVpFXTsKKwljaGFyIHR5cGVbWEVOX0JVU19JRF9TSVpFXTsKIAljb25zdCBjaGFyICpwLCAqcm9vdDsKIAogCWlmIChjaGFyX2NvdW50KG5vZGUsICcvJykgPCAyKQpAQCAtNjI1LDggKzYyOCw4IEBACiAKIAkvKiBiYWNrZW5kLzx0eXBlPi8uLi4gb3IgZGV2aWNlLzx0eXBlPi8uLi4gKi8KIAlwID0gc3RyY2hyKG5vZGUsICcvJykgKyAxOwotCXNucHJpbnRmKHR5cGUsIEJVU19JRF9TSVpFLCAiJS4qcyIsIChpbnQpc3RyY3NwbihwLCAiLyIpLCBwKTsKLQl0eXBlW0JVU19JRF9TSVpFLTFdID0gJ1wwJzsKKwlzbnByaW50Zih0eXBlLCBYRU5fQlVTX0lEX1NJWkUsICIlLipzIiwgKGludClzdHJjc3BuKHAsICIvIiksIHApOworCXR5cGVbWEVOX0JVU19JRF9TSVpFLTFdID0gJ1wwJzsKIAogCXJvb3RsZW4gPSBzdHJzZXBfbGVuKG5vZGUsICcvJywgYnVzLT5sZXZlbHMpOwogCWlmIChyb290bGVuIDwgMCkKQEAgLTY3NCw3ICs2NzcsNyBAQAogCQllcnIgPSBkcnYtPnN1c3BlbmQoeGRldik7CiAJaWYgKGVycikKIAkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgInhlbmJ1czogc3VzcGVuZCAlcyBmYWlsZWQ6ICVpXG4iLCBkZXYtPmJ1c19pZCwgZXJyKTsKKwkJICAgICAgICJ4ZW5idXM6IHN1c3BlbmQgJXMgZmFpbGVkOiAlaVxuIiwgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjk1LDcgKzY5OCw3IEBACiAJaWYgKGVycikKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgInhlbmJ1czogc3VzcGVuZF9jYW5jZWwgJXMgZmFpbGVkOiAlaVxuIiwKLQkJICAgICAgIGRldi0+YnVzX2lkLCBlcnIpOworCQkgICAgICAgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzE3LDcgKzcyMCw3IEBACiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAieGVuYnVzOiByZXN1bWUgKHRhbGtfdG9fb3RoZXJlbmQpICVzIGZhaWxlZDogJWlcbiIsCi0JCSAgICAgICBkZXYtPmJ1c19pZCwgZXJyKTsKKwkJICAgICAgIGRldl9uYW1lKGRldiksIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC03MjgsNyArNzMxLDcgQEAKIAkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICJ4ZW5idXM6IHJlc3VtZSAlcyBmYWlsZWQ6ICVpXG4iLAotCQkJICAgICAgIGRldi0+YnVzX2lkLCBlcnIpOworCQkJICAgICAgIGRldl9uYW1lKGRldiksIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtNzM3LDcgKzc0MCw3IEBACiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAieGVuYnVzX3Byb2JlOiByZXN1bWUgKHdhdGNoX290aGVyZW5kKSAlcyBmYWlsZWQ6ICIKLQkJICAgICAgICIlZC5cbiIsIGRldi0+YnVzX2lkLCBlcnIpOworCQkgICAgICAgIiVkLlxuIiwgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaCBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaAppbmRleCBlMDliMTk0Li42YzVlMzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmgKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oCkBAIC0zNCw2ICszNCw4IEBACiAjaWZuZGVmIF9YRU5CVVNfUFJPQkVfSAogI2RlZmluZSBfWEVOQlVTX1BST0JFX0gKIAorI2RlZmluZSBYRU5fQlVTX0lEX1NJWkUJCQkyMAorCiAjaWZkZWYgQ09ORklHX1hFTl9CQUNLRU5ECiBleHRlcm4gdm9pZCB4ZW5idXNfYmFja2VuZF9zdXNwZW5kKGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOwogZXh0ZXJuIHZvaWQgeGVuYnVzX2JhY2tlbmRfcmVzdW1lKGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOwpAQCAtNTIsNyArNTQsNyBAQAogewogCWNoYXIgKnJvb3Q7CiAJdW5zaWduZWQgaW50IGxldmVsczsKLQlpbnQgKCpnZXRfYnVzX2lkKShjaGFyIGJ1c19pZFtCVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKTsKKwlpbnQgKCpnZXRfYnVzX2lkKShjaGFyIGJ1c19pZFtYRU5fQlVTX0lEX1NJWkVdLCBjb25zdCBjaGFyICpub2RlbmFtZSk7CiAJaW50ICgqcHJvYmUpKGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmRpcik7CiAJc3RydWN0IGJ1c190eXBlIGJ1czsKIH07CmRpZmYgLS1naXQgYS9maXJtd2FyZS9kc3A1NmsvYm9vdHN0cmFwLmFzbSBiL2Zpcm13YXJlL2RzcDU2ay9ib290c3RyYXAuYXNtCmluZGV4IDEwZDg5MTkuLmE0MTEwNDcgMTAwNjQ0Ci0tLSBhL2Zpcm13YXJlL2RzcDU2ay9ib290c3RyYXAuYXNtCisrKyBiL2Zpcm13YXJlL2RzcDU2ay9ib290c3RyYXAuYXNtCkBAIC01MSwxOSArNTEsMTkgQEAKICAgICAgICAgOyBDb3B5IERTUCBwcm9ncmFtIGNvbnRyb2wKICAgICAgICAgbW92ZSAgICAjcmVhbCxyMAogICAgICAgICBtb3ZlICAgICN1cGxvYWQscjEKLSAgICAgICAgZG8gICAgICAjdXBsb2FkX2VuZC11cGxvYWQsPF9jb3B5Ci0gICAgICAgIG1vdmUgICAgUDoocjApKyx4MAotICAgICAgICBtb3ZlICAgIHgwLFA6KHIxKSsKLV9jb3B5ICAgbW92ZXAgICAjPjQsWDo8PE1fSENSCi0gICAgICAgIG1vdmVwICAgIz4kYzAwLFg6PDxNX0lQUgorICAgICAgICBkbyAgICAgICN1cGxvYWRfZW5kLXVwbG9hZCxfY29weQorICAgICAgICBtb3ZlbSAgICBQOihyMCkrLHgwCisgICAgICAgIG1vdmVtICAgIHgwLFA6KHIxKSsKK19jb3B5ICAgbW92ZXAgICAjNCxYOjw8TV9IQ1IKKyAgICAgICAgbW92ZXAgICAjJGMwMCxYOjw8TV9JUFIKICAgICAgICAgYW5kICAgICAjPCRmZSxtcgogICAgICAgICBqbXAgICAgIHVwbG9hZAogCiByZWFsCiAgICAgICAgIG9yZyAgICAgUDokN2VhOQogdXBsb2FkCi0gICAgICAgIG1vdmVwICAgIz4xLFg6PDxNX1BCQwotICAgICAgICBtb3ZlcCAgICM+MCxYOjw8TV9CQ1IKKyAgICAgICAgbW92ZXAgICAjMSxYOjw8TV9QQkMKKyAgICAgICAgbW92ZXAgICAjMCxYOjw8TV9CQ1IKIAogbmV4dCAgICBqY2xyICAgICMwLFg6PDxNX0hTUiwqCiAgICAgICAgIG1vdmVwICAgWDo8PE1fSFJYLEEKQEAgLTgxLDE4ICs4MSwxOCBAQAogICAgICAgICBjbXAgICAgIHgwLEEKICAgICAgICAgamVxICAgICBsb2FkX1kKIAotbG9hZF9QICBkbyAgICAgIHkwLF9sb2FkCitsb2FkX1AgIGRvICAgICAgeTAsX2xvYWRfUAogICAgICAgICBqY2xyICAgICMwLFg6PDxNX0hTUiwqCiAgICAgICAgIG1vdmVwICAgWDo8PE1fSFJYLFA6KHIwKSsKLV9sb2FkICAgam1wICAgICBuZXh0Ci1sb2FkX1ggIGRvICAgICAgeTAsX2xvYWQKK19sb2FkX1Agam1wICAgICBuZXh0Citsb2FkX1ggIGRvICAgICAgeTAsX2xvYWRfWAogICAgICAgICBqY2xyICAgICMwLFg6PDxNX0hTUiwqCiAgICAgICAgIG1vdmVwICAgWDo8PE1fSFJYLFg6KHIwKSsKLV9sb2FkICAgam1wICAgICBuZXh0Ci1sb2FkX1kgIGRvICAgICAgeTAsX2xvYWQKK19sb2FkX1ggam1wICAgICBuZXh0Citsb2FkX1kgIGRvICAgICAgeTAsX2xvYWRfWQogICAgICAgICBqY2xyICAgICMwLFg6PDxNX0hTUiwqCiAgICAgICAgIG1vdmVwICAgWDo8PE1fSFJYLFk6KHIwKSsKLV9sb2FkICAgam1wICAgICBuZXh0CitfbG9hZF9ZIGptcCAgICAgbmV4dAogCiB1cGxvYWRfZW5kCiAgICAgICAgIGVuZApkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggZjliNmUyOS4uMzI4ODM1OCAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC03MjEsNyArNzIxLDIwIEBACiAKIGVuZG1lbnUKIAotbWVudSAiTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcyIKK21lbnVjb25maWcgTUlTQ19GSUxFU1lTVEVNUworCWJvb2wgIk1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBnZXQgdG8gc2VlIG9wdGlvbnMgZm9yIHZhcmlvdXMgbWlzY2VsbGFuZW91cworCSAgZmlsZXN5c3RlbXMsIHN1Y2ggYXMgZmlsZXN5c3RlbXMgdGhhdCBjYW1lIGZyb20gb3RoZXIKKwkgIG9wZXJhdGluZyBzeXN0ZW1zLgorCisJICBUaGlzIG9wdGlvbiBhbG9uZSBkb2VzIG5vdCBhZGQgYW55IGtlcm5lbCBjb2RlLgorCisJICBJZiB5b3Ugc2F5IE4sIGFsbCBvcHRpb25zIGluIHRoaXMgc3VibWVudSB3aWxsIGJlIHNraXBwZWQgYW5kCisJICBkaXNhYmxlZDsgaWYgdW5zdXJlLCBzYXkgWSBoZXJlLgorCitpZiBNSVNDX0ZJTEVTWVNURU1TCiAKIGNvbmZpZyBBREZTX0ZTCiAJdHJpc3RhdGUgIkFERlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKQEAgLTEwOTEsNyArMTEwNCw3IEBACiAJICBZIGhlcmUuICBUaGlzIHdpbGwgcmVzdWx0IGluIF9tYW55XyBhZGRpdGlvbmFsIGRlYnVnZ2luZyBtZXNzYWdlcyB0byBiZQogCSAgd3JpdHRlbiB0byB0aGUgc3lzdGVtIGxvZy4KIAotZW5kbWVudQorZW5kaWYgIyBNSVNDX0ZJTEVTWVNURU1TCiAKIG1lbnVjb25maWcgTkVUV09SS19GSUxFU1lTVEVNUwogCWJvb2wgIk5ldHdvcmsgRmlsZSBTeXN0ZW1zIgpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oIGIvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCmluZGV4IGUwZjE2ZGEuLmE3NjgwMzEgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaAorKysgYi9mcy9hdXRvZnM0L2F1dG9mc19pLmgKQEAgLTI1LDggKzI1LDYgQEAKICNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9JT0NfRklSU1QJKEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTikKICNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9JT0NfQ09VTlQJKEFVVE9GU19JT0NfQ09VTlQgLSAxMSkKIAotI2RlZmluZSBBVVRPRlNfVFlQRV9UUklHR0VSCShBVVRPRlNfVFlQRV9ESVJFQ1R8QVVUT0ZTX1RZUEVfT0ZGU0VUKQotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZGV2LWlvY3RsLmMgYi9mcy9hdXRvZnM0L2Rldi1pb2N0bC5jCmluZGV4IDYzYjdjN2EuLjAyNWUxMDUgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvZGV2LWlvY3RsLmMKKysrIGIvZnMvYXV0b2ZzNC9kZXYtaW9jdGwuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIC8qCiAgKiBDaGVjayBzYW5pdHkgb2YgcGFyYW1ldGVyIGNvbnRyb2wgZmllbGRzIGFuZCBpZiBhIHBhdGggaXMgcHJlc2VudAotICogY2hlY2sgdGhhdCBpdCBoYXMgYSAiLyIgYW5kIGlzIHRlcm1pbmF0ZWQuCisgKiBjaGVjayB0aGF0IGl0IGlzIHRlcm1pbmF0ZWQgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSAiLyIuCiAgKi8KIHN0YXRpYyBpbnQgdmFsaWRhdGVfZGV2X2lvY3RsKGludCBjbWQsIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKIHsKQEAgLTEzOCwxNSArMTM4LDE2IEBACiAJfQogCiAJaWYgKHBhcmFtLT5zaXplID4gc2l6ZW9mKCpwYXJhbSkpIHsKLQkJZXJyID0gY2hlY2tfbmFtZShwYXJhbS0+cGF0aCk7CisJCWVyciA9IGludmFsaWRfc3RyKHBhcmFtLT5wYXRoLAorCQkJCSAodm9pZCAqKSAoKHNpemVfdCkgcGFyYW0gKyBwYXJhbS0+c2l6ZSkpOwogCQlpZiAoZXJyKSB7Ci0JCQlBVVRPRlNfV0FSTigiaW52YWxpZCBwYXRoIHN1cHBsaWVkIGZvciBjbWQoMHglMDh4KSIsCi0JCQkJICAgIGNtZCk7CisJCQlBVVRPRlNfV0FSTigKKwkJCSAgInBhdGggc3RyaW5nIHRlcm1pbmF0b3IgbWlzc2luZyBmb3IgY21kKDB4JTA4eCkiLAorCQkJICBjbWQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQllcnIgPSBpbnZhbGlkX3N0cihwYXJhbS0+cGF0aCwKLQkJCQkgKHZvaWQgKikgKChzaXplX3QpIHBhcmFtICsgcGFyYW0tPnNpemUpKTsKKwkJZXJyID0gY2hlY2tfbmFtZShwYXJhbS0+cGF0aCk7CiAJCWlmIChlcnIpIHsKIAkJCUFVVE9GU19XQVJOKCJpbnZhbGlkIHBhdGggc3VwcGxpZWQgZm9yIGNtZCgweCUwOHgpIiwKIAkJCQkgICAgY21kKTsKQEAgLTE4MCw3ICsxODEsNyBAQAogCQkJCSAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCiAJCQkJICAgICBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCiB7Ci0JcGFyYW0tPmFyZzEgPSBzYmktPnZlcnNpb247CisJcGFyYW0tPnByb3RvdmVyLnZlcnNpb24gPSBzYmktPnZlcnNpb247CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4OSw3ICsxOTAsNyBAQAogCQkJCQlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKIAkJCQkJc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQogewotCXBhcmFtLT5hcmcxID0gc2JpLT5zdWJfdmVyc2lvbjsKKwlwYXJhbS0+cHJvdG9zdWJ2ZXIuc3ViX3ZlcnNpb24gPSBzYmktPnN1Yl92ZXJzaW9uOwogCXJldHVybiAwOwogfQogCkBAIC0zMzUsMTMgKzMzNiwxMyBAQAogCWludCBlcnIsIGZkOwogCiAJLyogcGFyYW0tPnBhdGggaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkICovCi0JaWYgKCFwYXJhbS0+YXJnMSkKKwlpZiAoIXBhcmFtLT5vcGVubW91bnQuZGV2aWQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcGFyYW0tPmlvY3RsZmQgPSAtMTsKIAogCXBhdGggPSBwYXJhbS0+cGF0aDsKLQlkZXZpZCA9IHBhcmFtLT5hcmcxOworCWRldmlkID0gcGFyYW0tPm9wZW5tb3VudC5kZXZpZDsKIAogCWVyciA9IDA7CiAJZmQgPSBhdXRvZnNfZGV2X2lvY3RsX29wZW5fbW91bnRwb2ludChwYXRoLCBkZXZpZCk7CkBAIC0zNzMsNyArMzc0LDcgQEAKIHsKIAlhdXRvZnNfd3F0X3QgdG9rZW47CiAKLQl0b2tlbiA9IChhdXRvZnNfd3F0X3QpIHBhcmFtLT5hcmcxOworCXRva2VuID0gKGF1dG9mc193cXRfdCkgcGFyYW0tPnJlYWR5LnRva2VuOwogCXJldHVybiBhdXRvZnM0X3dhaXRfcmVsZWFzZShzYmksIHRva2VuLCAwKTsKIH0KIApAQCAtMzg4LDggKzM4OSw4IEBACiAJYXV0b2ZzX3dxdF90IHRva2VuOwogCWludCBzdGF0dXM7CiAKLQl0b2tlbiA9IChhdXRvZnNfd3F0X3QpIHBhcmFtLT5hcmcxOwotCXN0YXR1cyA9IHBhcmFtLT5hcmcyID8gcGFyYW0tPmFyZzIgOiAtRU5PRU5UOworCXRva2VuID0gKGF1dG9mc193cXRfdCkgcGFyYW0tPmZhaWwudG9rZW47CisJc3RhdHVzID0gcGFyYW0tPmZhaWwuc3RhdHVzID8gcGFyYW0tPmZhaWwuc3RhdHVzIDogLUVOT0VOVDsKIAlyZXR1cm4gYXV0b2ZzNF93YWl0X3JlbGVhc2Uoc2JpLCB0b2tlbiwgc3RhdHVzKTsKIH0KIApAQCAtNDEyLDEwICs0MTMsMTAgQEAKIAlpbnQgcGlwZWZkOwogCWludCBlcnIgPSAwOwogCi0JaWYgKHBhcmFtLT5hcmcxID09IC0xKQorCWlmIChwYXJhbS0+c2V0cGlwZWZkLnBpcGVmZCA9PSAtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwaXBlZmQgPSBwYXJhbS0+YXJnMTsKKwlwaXBlZmQgPSBwYXJhbS0+c2V0cGlwZWZkLnBpcGVmZDsKIAogCW11dGV4X2xvY2soJnNiaS0+d3FfbXV0ZXgpOwogCWlmICghc2JpLT5jYXRhdG9uaWMpIHsKQEAgLTQ1Nyw4ICs0NTgsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAotCXRpbWVvdXQgPSBwYXJhbS0+YXJnMTsKLQlwYXJhbS0+YXJnMSA9IHNiaS0+ZXhwX3RpbWVvdXQgLyBIWjsKKwl0aW1lb3V0ID0gcGFyYW0tPnRpbWVvdXQudGltZW91dDsKKwlwYXJhbS0+dGltZW91dC50aW1lb3V0ID0gc2JpLT5leHBfdGltZW91dCAvIEhaOwogCXNiaS0+ZXhwX3RpbWVvdXQgPSB0aW1lb3V0ICogSFo7CiAJcmV0dXJuIDA7CiB9CkBAIC00ODksNyArNDkwLDcgQEAKIAlwYXRoID0gcGFyYW0tPnBhdGg7CiAJZGV2aWQgPSBzYmktPnNiLT5zX2RldjsKIAotCXBhcmFtLT5hcmcxID0gcGFyYW0tPmFyZzIgPSAtMTsKKwlwYXJhbS0+cmVxdWVzdGVyLnVpZCA9IHBhcmFtLT5yZXF1ZXN0ZXIuZ2lkID0gLTE7CiAKIAkvKiBHZXQgbmFtZWlkYXRhIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICovCiAJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKQEAgLTUwNSw4ICs1MDYsOCBAQAogCQllcnIgPSAwOwogCQlhdXRvZnM0X2V4cGlyZV93YWl0KG5kLnBhdGguZGVudHJ5KTsKIAkJc3Bpbl9sb2NrKCZzYmktPmZzX2xvY2spOwotCQlwYXJhbS0+YXJnMSA9IGluby0+dWlkOwotCQlwYXJhbS0+YXJnMiA9IGluby0+Z2lkOworCQlwYXJhbS0+cmVxdWVzdGVyLnVpZCA9IGluby0+dWlkOworCQlwYXJhbS0+cmVxdWVzdGVyLmdpZCA9IGluby0+Z2lkOwogCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKIAl9CiAKQEAgLTUyOSwxMCArNTMwLDEwIEBACiAJaW50IGVyciA9IC1FQUdBSU47CiAJaW50IGhvdzsKIAotCWhvdyA9IHBhcmFtLT5hcmcxOworCWhvdyA9IHBhcmFtLT5leHBpcmUuaG93OwogCW1udCA9IGZwLT5mX3BhdGgubW50OwogCi0JaWYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpCisJaWYgKGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSkKIAkJZGVudHJ5ID0gYXV0b2ZzNF9leHBpcmVfZGlyZWN0KHNiaS0+c2IsIG1udCwgc2JpLCBob3cpOwogCWVsc2UKIAkJZGVudHJ5ID0gYXV0b2ZzNF9leHBpcmVfaW5kaXJlY3Qoc2JpLT5zYiwgbW50LCBzYmksIGhvdyk7CkBAIC01NjUsOSArNTY2LDkgQEAKIAkJCQkgICAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKIAkJCQkgICAgICBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCiB7Ci0JcGFyYW0tPmFyZzEgPSAwOworCXBhcmFtLT5hc2t1bW91bnQubWF5X3Vtb3VudCA9IDA7CiAJaWYgKG1heV91bW91bnQoZnAtPmZfcGF0aC5tbnQpKQotCQlwYXJhbS0+YXJnMSA9IDE7CisJCXBhcmFtLT5hc2t1bW91bnQubWF5X3Vtb3VudCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYwMCw2ICs2MDEsNyBAQAogCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAJY29uc3QgY2hhciAqcGF0aDsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgZGV2aWQsIG1hZ2ljOwogCWludCBlcnIgPSAtRU5PRU5UOwogCiAJaWYgKHBhcmFtLT5zaXplIDw9IHNpemVvZigqcGFyYW0pKSB7CkBAIC02MDgsMTMgKzYxMCwxMyBAQAogCX0KIAogCXBhdGggPSBwYXJhbS0+cGF0aDsKLQl0eXBlID0gcGFyYW0tPmFyZzE7CisJdHlwZSA9IHBhcmFtLT5pc21vdW50cG9pbnQuaW4udHlwZTsKIAotCXBhcmFtLT5hcmcxID0gMDsKLQlwYXJhbS0+YXJnMiA9IDA7CisJcGFyYW0tPmlzbW91bnRwb2ludC5vdXQuZGV2aWQgPSBkZXZpZCA9IDA7CisJcGFyYW0tPmlzbW91bnRwb2ludC5vdXQubWFnaWMgPSBtYWdpYyA9IDA7CiAKIAlpZiAoIWZwIHx8IHBhcmFtLT5pb2N0bGZkID09IC0xKSB7Ci0JCWlmICh0eXBlID09IEFVVE9GU19UWVBFX0FOWSkgeworCQlpZiAoYXV0b2ZzX3R5cGVfYW55KHR5cGUpKSB7CiAJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCiAJCQllcnIgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfRk9MTE9XLCAmbmQpOwpAQCAtNjIyLDcgKzYyNCw3IEBACiAJCQkJZ290byBvdXQ7CiAKIAkJCXNiID0gbmQucGF0aC5kZW50cnktPmRfc2I7Ci0JCQlwYXJhbS0+YXJnMSA9IG5ld19lbmNvZGVfZGV2KHNiLT5zX2Rldik7CisJCQlkZXZpZCA9IG5ld19lbmNvZGVfZGV2KHNiLT5zX2Rldik7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubzsKIApAQCAtNjM1LDM4ICs2MzcsNDEgQEAKIAkJCQlnb3RvIG91dF9yZWxlYXNlOwogCiAJCQlpbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8obmQucGF0aC5kZW50cnkpOwotCQkJcGFyYW0tPmFyZzEgPSBhdXRvZnM0X2dldF9kZXYoaW5vLT5zYmkpOworCQkJZGV2aWQgPSBhdXRvZnM0X2dldF9kZXYoaW5vLT5zYmkpOwogCQl9CiAKIAkJZXJyID0gMDsKIAkJaWYgKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlICYmCiAJCSAgICBuZC5wYXRoLm1udC0+bW50X3Jvb3QgPT0gbmQucGF0aC5kZW50cnkpIHsKIAkJCWVyciA9IDE7Ci0JCQlwYXJhbS0+YXJnMiA9IG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX21hZ2ljOworCQkJbWFnaWMgPSBuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19tYWdpYzsKIAkJfQogCX0gZWxzZSB7Ci0JCWRldl90IGRldmlkID0gbmV3X2VuY29kZV9kZXYoc2JpLT5zYi0+c19kZXYpOworCQlkZXZfdCBkZXYgPSBhdXRvZnM0X2dldF9kZXYoc2JpKTsKIAogCQllcnIgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfUEFSRU5ULCAmbmQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKLQkJZXJyID0gYXV0b2ZzX2Rldl9pb2N0bF9maW5kX3N1cGVyKCZuZCwgZGV2aWQpOworCQllcnIgPSBhdXRvZnNfZGV2X2lvY3RsX2ZpbmRfc3VwZXIoJm5kLCBkZXYpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfcmVsZWFzZTsKIAotCQlwYXJhbS0+YXJnMSA9IGF1dG9mczRfZ2V0X2RldihzYmkpOworCQlkZXZpZCA9IGRldjsKIAogCQllcnIgPSBoYXZlX3N1Ym1vdW50cyhuZC5wYXRoLmRlbnRyeSk7CiAKIAkJaWYgKG5kLnBhdGgubW50LT5tbnRfbW91bnRwb2ludCAhPSBuZC5wYXRoLm1udC0+bW50X3Jvb3QpIHsKIAkJCWlmIChmb2xsb3dfZG93bigmbmQucGF0aC5tbnQsICZuZC5wYXRoLmRlbnRyeSkpIHsKIAkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmQucGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JCQkJcGFyYW0tPmFyZzIgPSBpbm9kZS0+aV9zYi0+c19tYWdpYzsKKwkJCQltYWdpYyA9IGlub2RlLT5pX3NiLT5zX21hZ2ljOwogCQkJfQogCQl9CiAJfQogCisJcGFyYW0tPmlzbW91bnRwb2ludC5vdXQuZGV2aWQgPSBkZXZpZDsKKwlwYXJhbS0+aXNtb3VudHBvaW50Lm91dC5tYWdpYyA9IG1hZ2ljOworCiBvdXRfcmVsZWFzZToKIAlwYXRoX3B1dCgmbmQucGF0aCk7CiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2V4cGlyZS5jIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwppbmRleCA0YjZmYjNmLi5lM2JkNTA3IDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2V4cGlyZS5jCisrKyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAkJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkZW50cnktPmRfc2IpOwogCiAJCS8qIFRoaXMgaXMgYW4gYXV0b2ZzIHN1Ym1vdW50LCB3ZSBjYW4ndCBleHBpcmUgaXQgKi8KLQkJaWYgKHNiaS0+dHlwZSA9PSBBVVRPRlNfVFlQRV9JTkRJUkVDVCkKKwkJaWYgKGF1dG9mc190eXBlX2luZGlyZWN0KHNiaS0+dHlwZSkpCiAJCQlnb3RvIGRvbmU7CiAKIAkJLyoKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCWlmIChhcmcgJiYgZ2V0X3VzZXIoZG9fbm93LCBhcmcpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKQorCWlmIChhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkpCiAJCWRlbnRyeSA9IGF1dG9mczRfZXhwaXJlX2RpcmVjdChzYiwgbW50LCBzYmksIGRvX25vdyk7CiAJZWxzZQogCQlkZW50cnkgPSBhdXRvZnM0X2V4cGlyZV9pbmRpcmVjdChzYiwgbW50LCBzYmksIGRvX25vdyk7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2lub2RlLmMgYi9mcy9hdXRvZnM0L2lub2RlLmMKaW5kZXggY2ZjMjNlNS4uNzE2ZTEyYiAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9pbm9kZS5jCisrKyBiL2ZzL2F1dG9mczQvaW5vZGUuYwpAQCAtMTk3LDkgKzE5Nyw5IEBACiAJc2VxX3ByaW50ZihtLCAiLG1pbnByb3RvPSVkIiwgc2JpLT5taW5fcHJvdG8pOwogCXNlcV9wcmludGYobSwgIixtYXhwcm90bz0lZCIsIHNiaS0+bWF4X3Byb3RvKTsKIAotCWlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9PRkZTRVQpCisJaWYgKGF1dG9mc190eXBlX29mZnNldChzYmktPnR5cGUpKQogCQlzZXFfcHJpbnRmKG0sICIsb2Zmc2V0Iik7Ci0JZWxzZSBpZiAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfRElSRUNUKQorCWVsc2UgaWYgKGF1dG9mc190eXBlX2RpcmVjdChzYmktPnR5cGUpKQogCQlzZXFfcHJpbnRmKG0sICIsZGlyZWN0Iik7CiAJZWxzZQogCQlzZXFfcHJpbnRmKG0sICIsaW5kaXJlY3QiKTsKQEAgLTI4NCwxMyArMjg0LDEzIEBACiAJCQkqbWF4cHJvdG8gPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfaW5kaXJlY3Q6Ci0JCQkqdHlwZSA9IEFVVE9GU19UWVBFX0lORElSRUNUOworCQkJc2V0X2F1dG9mc190eXBlX2luZGlyZWN0KHR5cGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2RpcmVjdDoKLQkJCSp0eXBlID0gQVVUT0ZTX1RZUEVfRElSRUNUOworCQkJc2V0X2F1dG9mc190eXBlX2RpcmVjdCh0eXBlKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9vZmZzZXQ6Ci0JCQkqdHlwZSA9IEFVVE9GU19UWVBFX09GRlNFVDsKKwkJCXNldF9hdXRvZnNfdHlwZV9vZmZzZXQodHlwZSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAxOwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJc2JpLT5zYiA9IHM7CiAJc2JpLT52ZXJzaW9uID0gMDsKIAlzYmktPnN1Yl92ZXJzaW9uID0gMDsKLQlzYmktPnR5cGUgPSBBVVRPRlNfVFlQRV9JTkRJUkVDVDsKKwlzZXRfYXV0b2ZzX3R5cGVfaW5kaXJlY3QoJnNiaS0+dHlwZSk7CiAJc2JpLT5taW5fcHJvdG8gPSAwOwogCXNiaS0+bWF4X3Byb3RvID0gMDsKIAltdXRleF9pbml0KCZzYmktPndxX211dGV4KTsKQEAgLTM4MCw3ICszODAsNyBAQAogCX0KIAogCXJvb3RfaW5vZGUtPmlfZm9wID0gJmF1dG9mczRfcm9vdF9vcGVyYXRpb25zOwotCXJvb3RfaW5vZGUtPmlfb3AgPSBzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSID8KKwlyb290X2lub2RlLT5pX29wID0gYXV0b2ZzX3R5cGVfdHJpZ2dlcihzYmktPnR5cGUpID8KIAkJCSZhdXRvZnM0X2RpcmVjdF9yb290X2lub2RlX29wZXJhdGlvbnMgOgogCQkJJmF1dG9mczRfaW5kaXJlY3Rfcm9vdF9pbm9kZV9vcGVyYXRpb25zOwogCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3dhaXRxLmMgYi9mcy9hdXRvZnM0L3dhaXRxLmMKaW5kZXggZTAyY2M4YS4uZWViMjQ2OCAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC93YWl0cS5jCisrKyBiL2ZzL2F1dG9mczQvd2FpdHEuYwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCSAqIGlzIHZlcnkgc2ltaWxhciBmb3IgaW5kaXJlY3QgbW91bnRzIGV4Y2VwdCBvbmx5IGRlbnRyeXMKIAkJICogaW4gdGhlIHJvb3Qgb2YgdGhlIGF1dG9mcyBmaWxlIHN5c3RlbSBtYXkgYmUgbmVnYXRpdmUuCiAJCSAqLwotCQlpZiAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikKKwkJaWYgKGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSkKIAkJCXJldHVybiAtRU5PRU5UOwogCQllbHNlIGlmICghSVNfUk9PVChkZW50cnktPmRfcGFyZW50KSkKIAkJCXJldHVybiAtRU5PRU5UOwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogSWYgdGhpcyBpcyBhIGRpcmVjdCBtb3VudCByZXF1ZXN0IGNyZWF0ZSBhIGR1bW15IG5hbWUgKi8KLQlpZiAoSVNfUk9PVChkZW50cnkpICYmIHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpCisJaWYgKElTX1JPT1QoZGVudHJ5KSAmJiBhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkpCiAJCXFzdHIubGVuID0gc3ByaW50ZihuYW1lLCAiJXAiLCBkZW50cnkpOwogCWVsc2UgewogCQlxc3RyLmxlbiA9IGF1dG9mczRfZ2V0cGF0aChzYmksIGRlbnRyeSwgJm5hbWUpOwpAQCAtNDA2LDExICs0MDYsMTEgQEAKIAkJCQl0eXBlID0gYXV0b2ZzX3B0eXBlX2V4cGlyZV9tdWx0aTsKIAkJfSBlbHNlIHsKIAkJCWlmIChub3RpZnkgPT0gTkZZX01PVU5UKQotCQkJCXR5cGUgPSAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikgPworCQkJCXR5cGUgPSBhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkgPwogCQkJCQlhdXRvZnNfcHR5cGVfbWlzc2luZ19kaXJlY3QgOgogCQkJCQkgYXV0b2ZzX3B0eXBlX21pc3NpbmdfaW5kaXJlY3Q7CiAJCQllbHNlCi0JCQkJdHlwZSA9IChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKSA/CisJCQkJdHlwZSA9IGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSA/CiAJCQkJCWF1dG9mc19wdHlwZV9leHBpcmVfZGlyZWN0IDoKIAkJCQkJYXV0b2ZzX3B0eXBlX2V4cGlyZV9pbmRpcmVjdDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvYmZzL2lub2RlLmMgYi9mcy9iZnMvaW5vZGUuYwppbmRleCAwZWQ1N2I1Li5jYzQwNjJkIDEwMDY0NAotLS0gYS9mcy9iZnMvaW5vZGUuYworKysgYi9mcy9iZnMvaW5vZGUuYwpAQCAtMjEzLDYgKzIxMyw5IEBACiB7CiAJc3RydWN0IGJmc19zYl9pbmZvICppbmZvID0gQkZTX1NCKHMpOwogCisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisKIAlicmVsc2UoaW5mby0+c2lfc2JoKTsKIAltdXRleF9kZXN0cm95KCZpbmZvLT5iZnNfbG9jayk7CiAJa2ZyZWUoaW5mby0+c2lfaW1hcCk7CkBAIC0zMjcsNiArMzMwLDcgQEAKIAl1bnNpZ25lZCBpLCBpbWFwX2xlbjsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKmluZm87CiAJbG9uZyByZXQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgaV9zYmxvY2ssIGlfZWJsb2NrLCBpX2VvZmYsIHNfc2l6ZTsKIAogCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghaW5mbykKQEAgLTM1MCw2ICszNTQsMTIgQEAKIAogCXMtPnNfbWFnaWMgPSBCRlNfTUFHSUM7CiAJaW5mby0+c2lfc2JoID0gYmg7CisKKwlpZiAobGUzMl90b19jcHUoYmZzX3NiLT5zX3N0YXJ0KSA+IGxlMzJfdG9fY3B1KGJmc19zYi0+c19lbmQpKSB7CisJCXByaW50ZigiU3VwZXJibG9jayBpcyBjb3JydXB0ZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKIAlpbmZvLT5zaV9sYXN0aSA9IChsZTMyX3RvX2NwdShiZnNfc2ItPnNfc3RhcnQpIC0gQkZTX0JTSVpFKSAvCiAJCQkJCXNpemVvZihzdHJ1Y3QgYmZzX2lub2RlKQogCQkJCQkrIEJGU19ST09UX0lOTyAtIDE7CkBAIC0zODAsNiArMzkwLDE4IEBACiAJCQktIGxlMzJfdG9fY3B1KGJmc19zYi0+c19zdGFydCkpID4+IEJGU19CU0laRV9CSVRTOwogCWluZm8tPnNpX2ZyZWVpID0gMDsKIAlpbmZvLT5zaV9sZl9lYmxrID0gMDsKKworCS8qIGNhbiB3ZSByZWFkIHRoZSBsYXN0IGJsb2NrPyAqLworCWJoID0gc2JfYnJlYWQocywgaW5mby0+c2lfYmxvY2tzIC0gMSk7CisJaWYgKCFiaCkgeworCQlwcmludGYoIkxhc3QgYmxvY2sgbm90IGF2YWlsYWJsZTogJWx1XG4iLCBpbmZvLT5zaV9ibG9ja3MgLSAxKTsKKwkJaXB1dChpbm9kZSk7CisJCXJldCA9IC1FSU87CisJCWtmcmVlKGluZm8tPnNpX2ltYXApOworCQlnb3RvIG91dDsKKwl9CisJYnJlbHNlKGJoKTsKKwogCWJoID0gTlVMTDsKIAlmb3IgKGkgPSBCRlNfUk9PVF9JTk87IGkgPD0gaW5mby0+c2lfbGFzdGk7IGkrKykgewogCQlzdHJ1Y3QgYmZzX2lub2RlICpkaTsKQEAgLTM5Nyw2ICs0MTksMjkgQEAKIAogCQlkaSA9IChzdHJ1Y3QgYmZzX2lub2RlICopYmgtPmJfZGF0YSArIG9mZjsKIAorCQkvKiB0ZXN0IGlmIGZpbGVzeXN0ZW0gaXMgbm90IGNvcnJ1cHRlZCAqLworCisJCWlfZW9mZiA9IGxlMzJfdG9fY3B1KGRpLT5pX2VvZmZzZXQpOworCQlpX3NibG9jayA9IGxlMzJfdG9fY3B1KGRpLT5pX3NibG9jayk7CisJCWlfZWJsb2NrID0gbGUzMl90b19jcHUoZGktPmlfZWJsb2NrKTsKKwkJc19zaXplID0gbGUzMl90b19jcHUoYmZzX3NiLT5zX2VuZCk7CisKKwkJaWYgKGlfc2Jsb2NrID4gaW5mby0+c2lfYmxvY2tzIHx8CisJCQlpX2VibG9jayA+IGluZm8tPnNpX2Jsb2NrcyB8fAorCQkJaV9zYmxvY2sgPiBpX2VibG9jayB8fAorCQkJaV9lb2ZmID4gc19zaXplIHx8CisJCQlpX3NibG9jayAqIEJGU19CU0laRSA+IGlfZW9mZikgeworCisJCQlwcmludGYoIklub2RlIDB4JTA4eCBjb3JydXB0ZWRcbiIsIGkpOworCisJCQlicmVsc2UoYmgpOworCQkJcy0+c19yb290ID0gTlVMTDsKKwkJCWtmcmVlKGluZm8tPnNpX2ltYXApOworCQkJa2ZyZWUoaW5mbyk7CisJCQlzLT5zX2ZzX2luZm8gPSBOVUxMOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwogCQlpZiAoIWRpLT5pX2lubykgewogCQkJaW5mby0+c2lfZnJlZWkrKzsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X21pc2MuYyBiL2ZzL2JpbmZtdF9taXNjLmMKaW5kZXggZTExNThjYi4uYzRlODM1MyAxMDA2NDQKLS0tIGEvZnMvYmluZm10X21pc2MuYworKysgYi9mcy9iaW5mbXRfbWlzYy5jCkBAIC02NDksNyArNjQ5LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBibV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQogewotCWNoYXIgKnMgPSBlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIjsKKwljaGFyICpzID0gZW5hYmxlZCA/ICJlbmFibGVkXG4iIDogImRpc2FibGVkXG4iOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBzLCBzdHJsZW4ocykpOwogfQpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCAzNDlhMjZjLi5iOTU3NzE3IDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtMTI2Miw3ICsxMjYyLDcgQEAKIAogLyoqCiAgKiBsb29rdXBfYmRldiAgLSBsb29rdXAgYSBzdHJ1Y3QgYmxvY2tfZGV2aWNlIGJ5IG5hbWUKLSAqIEBwYXRoOglzcGVjaWFsIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBibG9jayBkZXZpY2UKKyAqIEBwYXRobmFtZToJc3BlY2lhbCBmaWxlIHJlcHJlc2VudGluZyB0aGUgYmxvY2sgZGV2aWNlCiAgKgogICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBibG9ja2RldmljZSBhdCBAcGF0aG5hbWUgaW4gdGhlIGN1cnJlbnQKICAqIG5hbWVzcGFjZSBpZiBwb3NzaWJsZSBhbmQgcmV0dXJuIGl0LiAgUmV0dXJuIEVSUl9QVFIoZXJyb3IpCmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IGExM2YwOWIuLmMyNmRhNzggMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0yMDIyLDcgKzIwMjIsNiBAQAogCQkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCiAJCQkJdm10cnVuY2F0ZShpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CiAJCX0KLQkJZ290byBvdXQ7CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9jaGFyX2Rldi5jIGIvZnMvY2hhcl9kZXYuYwppbmRleCA3MDA2OTdhNy4uMzhmNzEyMiAxMDA2NDQKLS0tIGEvZnMvY2hhcl9kZXYuYworKysgYi9mcy9jaGFyX2Rldi5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAljZC0+bWFqb3IgPSBtYWpvcjsKIAljZC0+YmFzZW1pbm9yID0gYmFzZW1pbm9yOwogCWNkLT5taW5vcmN0ID0gbWlub3JjdDsKLQlzdHJuY3B5KGNkLT5uYW1lLG5hbWUsIDY0KTsKKwlzdHJsY3B5KGNkLT5uYW1lLCBuYW1lLCBzaXplb2YoY2QtPm5hbWUpKTsKIAogCWkgPSBtYWpvcl90b19pbmRleChtYWpvcik7CiAKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggZDFlY2U3OS4uMzBmMmZhYSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTExODcsNiArMTE4Nyw5IEBACiAJcmV0ID0gY29tcGF0X2RvX3JlYWR2X3dyaXRldihSRUFELCBmaWxlLCB2ZWMsIHZsZW4sICZmaWxlLT5mX3Bvcyk7CiAKIG91dDoKKwlpZiAocmV0ID4gMCkKKwkJYWRkX3JjaGFyKGN1cnJlbnQsIHJldCk7CisJaW5jX3N5c2NyKGN1cnJlbnQpOwogCWZwdXQoZmlsZSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEyMTAsNiArMTIxMyw5IEBACiAJcmV0ID0gY29tcGF0X2RvX3JlYWR2X3dyaXRldihXUklURSwgZmlsZSwgdmVjLCB2bGVuLCAmZmlsZS0+Zl9wb3MpOwogCiBvdXQ6CisJaWYgKHJldCA+IDApCisJCWFkZF93Y2hhcihjdXJyZW50LCByZXQpOworCWluY19zeXNjdyhjdXJyZW50KTsKIAlmcHV0KGZpbGUpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9kaXJlY3QtaW8uYyBiL2ZzL2RpcmVjdC1pby5jCmluZGV4IGFmMDU1OGQuLmI2ZDQzOTAgMTAwNjQ0Ci0tLSBhL2ZzL2RpcmVjdC1pby5jCisrKyBiL2ZzL2RpcmVjdC1pby5jCkBAIC0xMjA5LDYgKzEyMDksMTkgQEAKIAlyZXR2YWwgPSBkaXJlY3RfaW9fd29ya2VyKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsCiAJCQkJbnJfc2VncywgYmxrYml0cywgZ2V0X2Jsb2NrLCBlbmRfaW8sIGRpbyk7CiAKKwkvKgorCSAqIEluIGNhc2Ugb2YgZXJyb3IgZXh0ZW5kaW5nIHdyaXRlIG1heSBoYXZlIGluc3RhbnRpYXRlZCBhIGZldworCSAqIGJsb2NrcyBvdXRzaWRlIGlfc2l6ZS4gVHJpbSB0aGVzZSBvZmYgYWdhaW4gZm9yIERJT19MT0NLSU5HLgorCSAqIE5PVEU6IERJT19OT19MT0NLL0RJT19PV05fTE9DSyBjYWxsZXJzIGhhdmUgdG8gaGFuZGxlIHRoaXMgYnkKKwkgKiBpdCdzIG93biBtZWFuZXIuCisJICovCisJaWYgKHVubGlrZWx5KHJldHZhbCA8IDAgJiYgKHJ3ICYgV1JJVEUpKSkgeworCQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwkJaWYgKGVuZCA+IGlzaXplICYmIGRpb19sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpCisJCQl2bXRydW5jYXRlKGlub2RlLCBpc2l6ZSk7CisJfQorCiAJaWYgKHJ3ID09IFJFQUQgJiYgZGlvX2xvY2tfdHlwZSA9PSBESU9fTE9DS0lORykKIAkJcmVsZWFzZV9pX211dGV4ID0gMDsKIApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwppbmRleCA2MDQ2MjM5Li5jMDFlMDQzIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9jcnlwdG8uYworKysgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwpAQCAtMTc1LDggKzE3NSw4IEBACiAgKgogICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG9uIGVycm9yLgogICovCi1zdGF0aWMgaW50IGVjcnlwdGZzX2Rlcml2ZV9pdihjaGFyICppdiwgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCi0JCQkgICAgICBsb2ZmX3Qgb2Zmc2V0KQoraW50IGVjcnlwdGZzX2Rlcml2ZV9pdihjaGFyICppdiwgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJCSAgICAgICBsb2ZmX3Qgb2Zmc2V0KQogewogCWludCByYyA9IDA7CiAJY2hhciBkc3RbTUQ1X0RJR0VTVF9TSVpFXTsKQEAgLTkyNCw2ICs5MjQsMTUgQEAKIAkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFI7CiAJaWYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DUllQVEVEX1ZJRVdfRU5BQkxFRCkKIAkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfVklFV19BU19FTkNSWVBURUQ7CisJaWYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKSB7CisJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX0VOQ1JZUFRfRklMRU5BTUVTOworCQlpZiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKQorCQkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfRU5DRk5fVVNFX01PVU5UX0ZORUs7CisJCWVsc2UgaWYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkgJiBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX0ZFSykKKwkJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX0VOQ0ZOX1VTRV9GRUs7CisJfQogfQogCiBzdGF0aWMgaW50IGVjcnlwdGZzX2NvcHlfbW91bnRfd2lkZV9zaWdzX3RvX2lub2RlX3NpZ3MoCkBAIC0xMDYwLDcgKzEwNjksOCBAQAogc3RhdGljIHN0cnVjdCBlY3J5cHRmc19mbGFnX21hcF9lbGVtIGVjcnlwdGZzX2ZsYWdfbWFwW10gPSB7CiAJezB4MDAwMDAwMDEsIEVDUllQVEZTX0VOQUJMRV9ITUFDfSwKIAl7MHgwMDAwMDAwMiwgRUNSWVBURlNfRU5DUllQVEVEfSwKLQl7MHgwMDAwMDAwNCwgRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFJ9CisJezB4MDAwMDAwMDQsIEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSfSwKKwl7MHgwMDAwMDAwOCwgRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVN9CiB9OwogCiAvKioKQEAgLTExNDksMTkgKzExNTksMjAgQEAKIAogLyoqCiAgKiBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nCi0gKiBAY3J5cHRfc3RhdDogVGhlIGNyeXB0b2dyYXBoaWMgY29udGV4dAorICogQGNpcGhlcl9uYW1lOiBUaGUgc3RyaW5nIGFsaWFzIGZvciB0aGUgY2lwaGVyCisgKiBAa2V5X2J5dGVzOiBMZW5ndGggb2Yga2V5IGluIGJ5dGVzOyB1c2VkIGZvciBBRVMgY29kZSBzZWxlY3Rpb24KICAqCiAgKiBSZXR1cm5zIHplcm8gb24gbm8gbWF0Y2gsIG9yIHRoZSBjaXBoZXIgY29kZSBvbiBtYXRjaAogICovCi11OCBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KQordTggZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhjaGFyICpjaXBoZXJfbmFtZSwgc2l6ZV90IGtleV9ieXRlcykKIHsKIAlpbnQgaTsKIAl1OCBjb2RlID0gMDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfY2lwaGVyX2NvZGVfc3RyX21hcF9lbGVtICptYXAgPQogCQllY3J5cHRmc19jaXBoZXJfY29kZV9zdHJfbWFwOwogCi0JaWYgKHN0cmNtcChjcnlwdF9zdGF0LT5jaXBoZXIsICJhZXMiKSA9PSAwKSB7Ci0JCXN3aXRjaCAoY3J5cHRfc3RhdC0+a2V5X3NpemUpIHsKKwlpZiAoc3RyY21wKGNpcGhlcl9uYW1lLCAiYWVzIikgPT0gMCkgeworCQlzd2l0Y2ggKGtleV9ieXRlcykgewogCQljYXNlIDE2OgogCQkJY29kZSA9IFJGQzI0NDBfQ0lQSEVSX0FFU18xMjg7CiAJCQlicmVhazsKQEAgLTExNzMsNyArMTE4NCw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlY3J5cHRmc19jaXBoZXJfY29kZV9zdHJfbWFwKTsgaSsrKQotCQkJaWYgKHN0cmNtcChjcnlwdF9zdGF0LT5jaXBoZXIsIG1hcFtpXS5jaXBoZXJfc3RyKSA9PSAwKXsKKwkJCWlmIChzdHJjbXAoY2lwaGVyX25hbWUsIG1hcFtpXS5jaXBoZXJfc3RyKSA9PSAwKSB7CiAJCQkJY29kZSA9IG1hcFtpXS5jaXBoZXJfY29kZTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEyMTIsNiArMTIyMyw4IEBACiAJCSYoZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShlY3J5cHRmc19pbm9kZSktPmNyeXB0X3N0YXQpOwogCWludCByYzsKIAorCWlmIChjcnlwdF9zdGF0LT5leHRlbnRfc2l6ZSA9PSAwKQorCQljcnlwdF9zdGF0LT5leHRlbnRfc2l6ZSA9IEVDUllQVEZTX0RFRkFVTFRfRVhURU5UX1NJWkU7CiAJcmMgPSBlY3J5cHRmc19yZWFkX2xvd2VyKGRhdGEsIDAsIGNyeXB0X3N0YXQtPmV4dGVudF9zaXplLAogCQkJCSBlY3J5cHRmc19pbm9kZSk7CiAJaWYgKHJjKSB7CkBAIC0xMjIxLDcgKzEyMzQsNiBAQAogCX0KIAlpZiAoIWNvbnRhaW5zX2VjcnlwdGZzX21hcmtlcihkYXRhICsgRUNSWVBURlNfRklMRV9TSVpFX0JZVEVTKSkgewogCQlyYyA9IC1FSU5WQUw7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiVmFsaWQgbWFya2VyIG5vdCBmb3VuZFxuIik7CiAJfQogb3V0OgogCXJldHVybiByYzsKQEAgLTE2MjgsOTUgKzE2NDAsOTUgQEAKIH0KIAogLyoqCi0gKiBlY3J5cHRmc19lbmNvZGVfZmlsZW5hbWUgLSBjb252ZXJ0cyBhIHBsYWludGV4dCBmaWxlIG5hbWUgdG8gY2lwaGVyIHRleHQKLSAqIEBjcnlwdF9zdGF0OiBUaGUgY3J5cHRfc3RhdCBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGFuZW0gdG8gZW5jb2RlCi0gKiBAbmFtZTogVGhlIHBsYWludGV4dCBuYW1lCi0gKiBAbGVuZ3RoOiBUaGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQKLSAqIEBlbmNvZGVkX25hbWU6IFRoZSBlbmN5cHRlZCBuYW1lCisgKiBlY3J5cHRmc19lbmNyeXB0X2ZpbGVuYW1lIC0gZW5jcnlwdCBmaWxlbmFtZQogICoKLSAqIEVuY3J5cHRzIGFuZCBlbmNvZGVzIGEgZmlsZW5hbWUgaW50byBzb21ldGhpbmcgdGhhdCBjb25zdGl0dXRlcyBhCi0gKiB2YWxpZCBmaWxlbmFtZSBmb3IgYSBmaWxlc3lzdGVtLCB3aXRoIHByaW50YWJsZSBjaGFyYWN0ZXJzLgorICogQ0JDLWVuY3J5cHRzIHRoZSBmaWxlbmFtZS4gV2UgZG8gbm90IHdhbnQgdG8gZW5jcnlwdCB0aGUgc2FtZQorICogZmlsZW5hbWUgd2l0aCB0aGUgc2FtZSBrZXkgYW5kIElWLCB3aGljaCBtYXkgaGFwcGVuIHdpdGggaGFyZAorICogbGlua3MsIHNvIHdlIHByZXBlbmQgcmFuZG9tIGJpdHMgdG8gZWFjaCBmaWxlbmFtZS4KICAqCi0gKiBXZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgY3J5cHRvIGNvbnRleHQsCi0gKiBwb2ludGVkIHRvIGJ5IGNyeXB0X3N0YXQtPnRmbS4KLSAqCi0gKiBUT0RPOiBJbXBsZW1lbnQgZmlsZW5hbWUgZGVjb2RpbmcgYW5kIGRlY3J5cHRpb24gaGVyZSwgaW4gcGxhY2Ugb2YKLSAqIG1lbWNweS4gV2UgYXJlIGtlZXBpbmcgdGhlIGZyYW1ld29yayBhcm91bmQgZm9yIG5vdyB0byAoMSkKLSAqIGZhY2lsaXRhdGUgdGVzdGluZyBvZiB0aGUgY29tcG9uZW50cyBuZWVkZWQgdG8gaW1wbGVtZW50IGZpbGVuYW1lCi0gKiBlbmNyeXB0aW9uIGFuZCAoMikgdG8gcHJvdmlkZSBhIGNvZGUgYmFzZSBmcm9tIHdoaWNoIG90aGVyCi0gKiBkZXZlbG9wZXJzIGluIHRoZSBjb21tdW5pdHkgY2FuIGVhc2lseSBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlLgotICoKLSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiBlbmNvZGVkIGZpbGVuYW1lOyBuZWdhdGl2ZSBpZiBlcnJvcgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG90aGVyd2lzZQogICovCi1pbnQKLWVjcnlwdGZzX2VuY29kZV9maWxlbmFtZShzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKLQkJCSBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCBjaGFyICoqZW5jb2RlZF9uYW1lKQorc3RhdGljIGludAorZWNyeXB0ZnNfZW5jcnlwdF9maWxlbmFtZShzdHJ1Y3QgZWNyeXB0ZnNfZmlsZW5hbWUgKmZpbGVuYW1lLAorCQkJICBzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwkJCSAgc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQpCiB7Ci0JaW50IGVycm9yID0gMDsKKwlpbnQgcmMgPSAwOwogCi0JKCplbmNvZGVkX25hbWUpID0ga21hbGxvYyhsZW5ndGggKyAyLCBHRlBfS0VSTkVMKTsKLQlpZiAoISgqZW5jb2RlZF9uYW1lKSkgewotCQllcnJvciA9IC1FTk9NRU07CisJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSA9IE5VTEw7CisJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplID0gMDsKKwlpZiAoKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DRk5fVVNFX01PVU5UX0ZORUspKQorCSAgICB8fCAobW91bnRfY3J5cHRfc3RhdCAmJiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCQkgICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKSkpIHsKKwkJc2l6ZV90IHBhY2tldF9zaXplOworCQlzaXplX3QgcmVtYWluaW5nX2J5dGVzOworCisJCXJjID0gZWNyeXB0ZnNfd3JpdGVfdGFnXzcwX3BhY2tldCgKKwkJCU5VTEwsIE5VTEwsCisJCQkmZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplLAorCQkJbW91bnRfY3J5cHRfc3RhdCwgTlVMTCwKKwkJCWZpbGVuYW1lLT5maWxlbmFtZV9zaXplKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGdldCBwYWNrZXQgIgorCQkJICAgICAgICJzaXplIGZvciB0YWcgNzI7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sCisJCQkgICAgICAgcmMpOworCQkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUgPQorCQkJa21hbGxvYyhmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgorCQkJICAgICAgICJ0byBrbWFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICBmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVtYWluaW5nX2J5dGVzID0gZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplOworCQlyYyA9IGVjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXQoZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSwKKwkJCQkJCSAgJnJlbWFpbmluZ19ieXRlcywKKwkJCQkJCSAgJnBhY2tldF9zaXplLAorCQkJCQkJICBtb3VudF9jcnlwdF9zdGF0LAorCQkJCQkJICBmaWxlbmFtZS0+ZmlsZW5hbWUsCisJCQkJCQkgIGZpbGVuYW1lLT5maWxlbmFtZV9zaXplKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlICIKKwkJCSAgICAgICAidGFnIDcwIHBhY2tldDsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICByYyk7CisJCQlrZnJlZShmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lKTsKKwkJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUgPSBOVUxMOworCQkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSA9IHBhY2tldF9zaXplOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vIHN1cHBvcnQgZm9yIHJlcXVlc3RlZCBmaWxlbmFtZSAiCisJCSAgICAgICAiZW5jcnlwdGlvbiBtZXRob2QgaW4gdGhpcyByZWxlYXNlXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVOT1RTVVBQOwogCQlnb3RvIG91dDsKIAl9Ci0JLyogVE9ETzogRmlsZW5hbWUgZW5jcnlwdGlvbiBpcyBhIHNjaGVkdWxlZCBmZWF0dXJlIGZvciBhCi0JICogZnV0dXJlIHZlcnNpb24gb2YgZUNyeXB0ZnMuIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSBvbmx5IGZvcgotCSAqIHRoZSBwdXJwb3NlIG9mIHByb3ZpZGluZyBhIGZyYW1ld29yayBmb3Igb3RoZXIgZGV2ZWxvcGVycwotCSAqIHRvIGVhc2lseSBpbXBsZW1lbnQgZmlsZW5hbWUgZW5jcnlwdGlvbi4gSGludDogUmVwbGFjZSB0aGlzCi0JICogbWVtY3B5KCkgd2l0aCBhIGNhbGwgdG8gZW5jcnlwdCBhbmQgZW5jb2RlIHRoZQotCSAqIGZpbGVuYW1lLCB0aGUgc2V0IHRoZSBsZW5ndGggYWNjb3JkaW5nbHkuICovCi0JbWVtY3B5KCh2b2lkICopKCplbmNvZGVkX25hbWUpLCAodm9pZCAqKW5hbWUsIGxlbmd0aCk7Ci0JKCplbmNvZGVkX25hbWUpW2xlbmd0aF0gPSAnXDAnOwotCWVycm9yID0gbGVuZ3RoICsgMTsKIG91dDoKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHJjOwogfQogCi0vKioKLSAqIGVjcnlwdGZzX2RlY29kZV9maWxlbmFtZSAtIGNvbnZlcnRzIHRoZSBjaXBoZXIgdGV4dCBuYW1lIHRvIHBsYWludGV4dAotICogQGNyeXB0X3N0YXQ6IFRoZSBjcnlwdF9zdGF0IHN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUKLSAqIEBuYW1lOiBUaGUgZmlsZW5hbWUgaW4gY2lwaGVyIHRleHQKLSAqIEBsZW5ndGg6IFRoZSBsZW5ndGggb2YgdGhlIGNpcGhlciB0ZXh0IG5hbWUKLSAqIEBkZWNyeXB0ZWRfbmFtZTogVGhlIHBsYWludGV4dCBuYW1lCi0gKgotICogRGVjb2RlcyBhbmQgZGVjcnlwdHMgdGhlIGZpbGVuYW1lLgotICoKLSAqIFdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgYSBwcm9wZXJseSBpbml0aWFsaXplZCBjcnlwdG8gY29udGV4dCwKLSAqIHBvaW50ZWQgdG8gYnkgY3J5cHRfc3RhdC0+dGZtLgotICoKLSAqIFRPRE86IEltcGxlbWVudCBmaWxlbmFtZSBkZWNvZGluZyBhbmQgZGVjcnlwdGlvbiBoZXJlLCBpbiBwbGFjZSBvZgotICogbWVtY3B5LiBXZSBhcmUga2VlcGluZyB0aGUgZnJhbWV3b3JrIGFyb3VuZCBmb3Igbm93IHRvICgxKQotICogZmFjaWxpdGF0ZSB0ZXN0aW5nIG9mIHRoZSBjb21wb25lbnRzIG5lZWRlZCB0byBpbXBsZW1lbnQgZmlsZW5hbWUKLSAqIGVuY3J5cHRpb24gYW5kICgyKSB0byBwcm92aWRlIGEgY29kZSBiYXNlIGZyb20gd2hpY2ggb3RoZXIKLSAqIGRldmVsb3BlcnMgaW4gdGhlIGNvbW11bml0eSBjYW4gZWFzaWx5IGltcGxlbWVudCB0aGlzIGZlYXR1cmUuCi0gKgotICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIGRlY29kZWQgZmlsZW5hbWU7IG5lZ2F0aXZlIGlmIGVycm9yCi0gKi8KLWludAotZWNyeXB0ZnNfZGVjb2RlX2ZpbGVuYW1lKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAotCQkJIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgsIGNoYXIgKipkZWNyeXB0ZWRfbmFtZSkKK3N0YXRpYyBpbnQgZWNyeXB0ZnNfY29weV9maWxlbmFtZShjaGFyICoqY29waWVkX25hbWUsIHNpemVfdCAqY29waWVkX25hbWVfc2l6ZSwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX3NpemUpCiB7Ci0JaW50IGVycm9yID0gMDsKKwlpbnQgcmMgPSAwOwogCi0JKCpkZWNyeXB0ZWRfbmFtZSkgPSBrbWFsbG9jKGxlbmd0aCArIDIsIEdGUF9LRVJORUwpOwotCWlmICghKCpkZWNyeXB0ZWRfbmFtZSkpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOworCSgqY29waWVkX25hbWUpID0ga21hbGxvYygobmFtZV9zaXplICsgMiksIEdGUF9LRVJORUwpOworCWlmICghKCpjb3BpZWRfbmFtZSkpIHsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JLyogVE9ETzogRmlsZW5hbWUgZW5jcnlwdGlvbiBpcyBhIHNjaGVkdWxlZCBmZWF0dXJlIGZvciBhCi0JICogZnV0dXJlIHZlcnNpb24gb2YgZUNyeXB0ZnMuIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSBvbmx5IGZvcgotCSAqIHRoZSBwdXJwb3NlIG9mIHByb3ZpZGluZyBhIGZyYW1ld29yayBmb3Igb3RoZXIgZGV2ZWxvcGVycwotCSAqIHRvIGVhc2lseSBpbXBsZW1lbnQgZmlsZW5hbWUgZW5jcnlwdGlvbi4gSGludDogUmVwbGFjZSB0aGlzCi0JICogbWVtY3B5KCkgd2l0aCBhIGNhbGwgdG8gZGVjb2RlIGFuZCBkZWNyeXB0IHRoZQotCSAqIGZpbGVuYW1lLCB0aGUgc2V0IHRoZSBsZW5ndGggYWNjb3JkaW5nbHkuICovCi0JbWVtY3B5KCh2b2lkICopKCpkZWNyeXB0ZWRfbmFtZSksICh2b2lkICopbmFtZSwgbGVuZ3RoKTsKLQkoKmRlY3J5cHRlZF9uYW1lKVtsZW5ndGggKyAxXSA9ICdcMCc7CS8qIE9ubHkgZm9yIGNvbnZlbmllbmNlCisJbWVtY3B5KCh2b2lkICopKCpjb3BpZWRfbmFtZSksICh2b2lkICopbmFtZSwgbmFtZV9zaXplKTsKKwkoKmNvcGllZF9uYW1lKVsobmFtZV9zaXplKV0gPSAnXDAnOwkvKiBPbmx5IGZvciBjb252ZW5pZW5jZQogCQkJCQkJICogaW4gcHJpbnRpbmcgb3V0IHRoZQogCQkJCQkJICogc3RyaW5nIGluIGRlYnVnCiAJCQkJCQkgKiBtZXNzYWdlcyAqLwotCWVycm9yID0gbGVuZ3RoOworCSgqY29waWVkX25hbWVfc2l6ZSkgPSAobmFtZV9zaXplICsgMSk7CiBvdXQ6Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0xNzQwLDcgKzE3NTIsNyBAQAogCSprZXlfdGZtID0gTlVMTDsKIAlpZiAoKmtleV9zaXplID4gRUNSWVBURlNfTUFYX0tFWV9CWVRFUykgewogCQlyYyA9IC1FSU5WQUw7Ci0JCXByaW50ayhLRVJOX0VSUiAiUmVxdWVzdGVkIGtleSBzaXplIGlzIFslWmRdIGJ5dGVzOyBtYXhpbXVtICIKKwkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0ZWQga2V5IHNpemUgaXMgWyV6ZF0gYnl0ZXM7IG1heGltdW0gIgogCQkgICAgICAiYWxsb3dhYmxlIGlzIFslZF1cbiIsICprZXlfc2l6ZSwgRUNSWVBURlNfTUFYX0tFWV9CWVRFUyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE3NjUsNyArMTc3Nyw3IEBACiAJZ2V0X3JhbmRvbV9ieXRlcyhkdW1teV9rZXksICprZXlfc2l6ZSk7CiAJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleSgqa2V5X3RmbSwgZHVtbXlfa2V5LCAqa2V5X3NpemUpOwogCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gc2V0IGtleSBvZiBzaXplIFslWmRdIGZvciAiCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBzZXQga2V5IG9mIHNpemUgWyV6ZF0gZm9yICIKIAkJICAgICAgICJjaXBoZXIgWyVzXTsgcmMgPSBbJWRdXG4iLCAqa2V5X3NpemUsIGNpcGhlcl9uYW1lLCByYyk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CkBAIC0xOTEwLDMgKzE5MjIsMzQxIEBACiAJbXV0ZXhfdW5sb2NrKCZrZXlfdGZtX2xpc3RfbXV0ZXgpOwogCXJldHVybiByYzsKIH0KKworLyogNjQgY2hhcmFjdGVycyBmb3JtaW5nIGEgNi1iaXQgdGFyZ2V0IGZpZWxkICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcG9ydGFibGVfZmlsZW5hbWVfY2hhcnMgPSAoIi0uMDEyMzQ1Njc4OUFCQ0QiCisJCQkJCQkgIkVGR0hJSktMTU5PUFFSU1QiCisJCQkJCQkgIlVWV1hZWmFiY2RlZmdoaWoiCisJCQkJCQkgImtsbW5vcHFyc3R1dnd4eXoiKTsKKworLyogV2UgY291bGQgZWl0aGVyIG9mZnNldCBvbiBldmVyeSByZXZlcnNlIG1hcCBvciBqdXN0IHBhZCBzb21lIDB4MDAncworICogYXQgdGhlIGZyb250IGhlcmUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZpbGVuYW1lX3Jldl9tYXBbXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMTUgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDMxICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMzkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAvKiA0NyAqLworCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIC8qIDU1ICovCisJMHgwQSwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogNjMgKi8KKwkweDAwLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLCAvKiA3MSAqLworCTB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIC8qIDc5ICovCisJMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgLyogODcgKi8KKwkweDIzLCAweDI0LCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiA5NSAqLworCTB4MDAsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsIDB4MkIsIDB4MkMsIC8qIDEwMyAqLworCTB4MkQsIDB4MkUsIDB4MkYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIC8qIDExMSAqLworCTB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsIC8qIDExOSAqLworCTB4M0QsIDB4M0UsIDB4M0YKK307CisKKy8qKgorICogZWNyeXB0ZnNfZW5jb2RlX2Zvcl9maWxlbmFtZQorICogQGRzdDogRGVzdGluYXRpb24gbG9jYXRpb24gZm9yIGVuY29kZWQgZmlsZW5hbWUKKyAqIEBkc3Rfc2l6ZTogU2l6ZSBvZiB0aGUgZW5jb2RlZCBmaWxlbmFtZSBpbiBieXRlcworICogQHNyYzogU291cmNlIGxvY2F0aW9uIGZvciB0aGUgZmlsZW5hbWUgdG8gZW5jb2RlCisgKiBAc3JjX3NpemU6IFNpemUgb2YgdGhlIHNvdXJjZSBpbiBieXRlcworICovCit2b2lkIGVjcnlwdGZzX2VuY29kZV9mb3JfZmlsZW5hbWUodW5zaWduZWQgY2hhciAqZHN0LCBzaXplX3QgKmRzdF9zaXplLAorCQkJCSAgdW5zaWduZWQgY2hhciAqc3JjLCBzaXplX3Qgc3JjX3NpemUpCit7CisJc2l6ZV90IG51bV9ibG9ja3M7CisJc2l6ZV90IGJsb2NrX251bSA9IDA7CisJc2l6ZV90IGRzdF9vZmZzZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgbGFzdF9ibG9ja1szXTsKKworCWlmIChzcmNfc2l6ZSA9PSAwKSB7CisJCSgqZHN0X3NpemUpID0gMDsKKwkJZ290byBvdXQ7CisJfQorCW51bV9ibG9ja3MgPSAoc3JjX3NpemUgLyAzKTsKKwlpZiAoKHNyY19zaXplICUgMykgPT0gMCkgeworCQltZW1jcHkobGFzdF9ibG9jaywgKCZzcmNbc3JjX3NpemUgLSAzXSksIDMpOworCX0gZWxzZSB7CisJCW51bV9ibG9ja3MrKzsKKwkJbGFzdF9ibG9ja1syXSA9IDB4MDA7CisJCXN3aXRjaCAoc3JjX3NpemUgJSAzKSB7CisJCWNhc2UgMToKKwkJCWxhc3RfYmxvY2tbMF0gPSBzcmNbc3JjX3NpemUgLSAxXTsKKwkJCWxhc3RfYmxvY2tbMV0gPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWxhc3RfYmxvY2tbMF0gPSBzcmNbc3JjX3NpemUgLSAyXTsKKwkJCWxhc3RfYmxvY2tbMV0gPSBzcmNbc3JjX3NpemUgLSAxXTsKKwkJfQorCX0KKwkoKmRzdF9zaXplKSA9IChudW1fYmxvY2tzICogNCk7CisJaWYgKCFkc3QpCisJCWdvdG8gb3V0OworCXdoaWxlIChibG9ja19udW0gPCBudW1fYmxvY2tzKSB7CisJCXVuc2lnbmVkIGNoYXIgKnNyY19ibG9jazsKKwkJdW5zaWduZWQgY2hhciBkc3RfYmxvY2tbNF07CisKKwkJaWYgKGJsb2NrX251bSA9PSAobnVtX2Jsb2NrcyAtIDEpKQorCQkJc3JjX2Jsb2NrID0gbGFzdF9ibG9jazsKKwkJZWxzZQorCQkJc3JjX2Jsb2NrID0gJnNyY1tibG9ja19udW0gKiAzXTsKKwkJZHN0X2Jsb2NrWzBdID0gKChzcmNfYmxvY2tbMF0gPj4gMikgJiAweDNGKTsKKwkJZHN0X2Jsb2NrWzFdID0gKCgoc3JjX2Jsb2NrWzBdIDw8IDQpICYgMHgzMCkKKwkJCQl8ICgoc3JjX2Jsb2NrWzFdID4+IDQpICYgMHgwRikpOworCQlkc3RfYmxvY2tbMl0gPSAoKChzcmNfYmxvY2tbMV0gPDwgMikgJiAweDNDKQorCQkJCXwgKChzcmNfYmxvY2tbMl0gPj4gNikgJiAweDAzKSk7CisJCWRzdF9ibG9ja1szXSA9IChzcmNfYmxvY2tbMl0gJiAweDNGKTsKKwkJZHN0W2RzdF9vZmZzZXQrK10gPSBwb3J0YWJsZV9maWxlbmFtZV9jaGFyc1tkc3RfYmxvY2tbMF1dOworCQlkc3RbZHN0X29mZnNldCsrXSA9IHBvcnRhYmxlX2ZpbGVuYW1lX2NoYXJzW2RzdF9ibG9ja1sxXV07CisJCWRzdFtkc3Rfb2Zmc2V0KytdID0gcG9ydGFibGVfZmlsZW5hbWVfY2hhcnNbZHN0X2Jsb2NrWzJdXTsKKwkJZHN0W2RzdF9vZmZzZXQrK10gPSBwb3J0YWJsZV9maWxlbmFtZV9jaGFyc1tkc3RfYmxvY2tbM11dOworCQlibG9ja19udW0rKzsKKwl9CitvdXQ6CisJcmV0dXJuOworfQorCisvKioKKyAqIGVjcnlwdGZzX2RlY29kZV9mcm9tX2ZpbGVuYW1lCisgKiBAZHN0OiBJZiBOVUxMLCB0aGlzIGZ1bmN0aW9uIG9ubHkgc2V0cyBAZHN0X3NpemUgYW5kIHJldHVybnMuIElmCisgKiAgICAgICBub24tTlVMTCwgdGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBlbmNvZGVkIG9jdGV0cyBpbiBAc3JjCisgKiAgICAgICBpbnRvIHRoZSBtZW1vcnkgdGhhdCBAZHN0IHBvaW50cyB0by4KKyAqIEBkc3Rfc2l6ZTogU2V0IHRvIHRoZSBzaXplIG9mIHRoZSBkZWNvZGVkIHN0cmluZy4KKyAqIEBzcmM6IFRoZSBlbmNvZGVkIHNldCBvZiBvY3RldHMgdG8gZGVjb2RlLgorICogQHNyY19zaXplOiBUaGUgc2l6ZSBvZiB0aGUgZW5jb2RlZCBzZXQgb2Ygb2N0ZXRzIHRvIGRlY29kZS4KKyAqLworc3RhdGljIHZvaWQKK2VjcnlwdGZzX2RlY29kZV9mcm9tX2ZpbGVuYW1lKHVuc2lnbmVkIGNoYXIgKmRzdCwgc2l6ZV90ICpkc3Rfc2l6ZSwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgc2l6ZV90IHNyY19zaXplKQoreworCXU4IGN1cnJlbnRfYml0X29mZnNldCA9IDA7CisJc2l6ZV90IHNyY19ieXRlX29mZnNldCA9IDA7CisJc2l6ZV90IGRzdF9ieXRlX29mZnNldCA9IDA7CisKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJLyogTm90IGV4YWN0OyBjb25zZXJ2YXRpdmVseSBsb25nLiBFdmVyeSBibG9jayBvZiA0CisJCSAqIGVuY29kZWQgY2hhcmFjdGVycyBkZWNvZGVzIGludG8gYSBibG9jayBvZiAzCisJCSAqIGRlY29kZWQgY2hhcmFjdGVycy4gVGhpcyBzZWdtZW50IG9mIGNvZGUgcHJvdmlkZXMKKwkJICogdGhlIGNhbGxlciB3aXRoIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBhbGxvY2F0ZWQKKwkJICogc3BhY2UgdGhhdCBAZHN0IHdpbGwgbmVlZCB0byBwb2ludCB0byBpbiBhCisJCSAqIHN1YnNlcXVlbnQgY2FsbC4gKi8KKwkJKCpkc3Rfc2l6ZSkgPSAoKChzcmNfc2l6ZSArIDEpICogMykgLyA0KTsKKwkJZ290byBvdXQ7CisJfQorCXdoaWxlIChzcmNfYnl0ZV9vZmZzZXQgPCBzcmNfc2l6ZSkgeworCQl1bnNpZ25lZCBjaGFyIHNyY19ieXRlID0KKwkJCQlmaWxlbmFtZV9yZXZfbWFwWyhpbnQpc3JjW3NyY19ieXRlX29mZnNldF1dOworCisJCXN3aXRjaCAoY3VycmVudF9iaXRfb2Zmc2V0KSB7CisJCWNhc2UgMDoKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXRdID0gKHNyY19ieXRlIDw8IDIpOworCQkJY3VycmVudF9iaXRfb2Zmc2V0ID0gNjsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0KytdIHw9IChzcmNfYnl0ZSA+PiA0KTsKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXRdID0gKChzcmNfYnl0ZSAmIDB4RikKKwkJCQkJCSA8PCA0KTsKKwkJCWN1cnJlbnRfYml0X29mZnNldCA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJZHN0W2RzdF9ieXRlX29mZnNldCsrXSB8PSAoc3JjX2J5dGUgPj4gMik7CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0XSA9IChzcmNfYnl0ZSA8PCA2KTsKKwkJCWN1cnJlbnRfYml0X29mZnNldCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZHN0W2RzdF9ieXRlX29mZnNldCsrXSB8PSAoc3JjX2J5dGUpOworCQkJZHN0W2RzdF9ieXRlX29mZnNldF0gPSAwOworCQkJY3VycmVudF9iaXRfb2Zmc2V0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXNyY19ieXRlX29mZnNldCsrOworCX0KKwkoKmRzdF9zaXplKSA9IGRzdF9ieXRlX29mZnNldDsKK291dDoKKwlyZXR1cm47Cit9CisKKy8qKgorICogZWNyeXB0ZnNfZW5jcnlwdF9hbmRfZW5jb2RlX2ZpbGVuYW1lIC0gY29udmVydHMgYSBwbGFpbnRleHQgZmlsZSBuYW1lIHRvIGNpcGhlciB0ZXh0CisgKiBAY3J5cHRfc3RhdDogVGhlIGNyeXB0X3N0YXQgc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBhbmVtIHRvIGVuY29kZQorICogQG5hbWU6IFRoZSBwbGFpbnRleHQgbmFtZQorICogQGxlbmd0aDogVGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0CisgKiBAZW5jb2RlZF9uYW1lOiBUaGUgZW5jeXB0ZWQgbmFtZQorICoKKyAqIEVuY3J5cHRzIGFuZCBlbmNvZGVzIGEgZmlsZW5hbWUgaW50byBzb21ldGhpbmcgdGhhdCBjb25zdGl0dXRlcyBhCisgKiB2YWxpZCBmaWxlbmFtZSBmb3IgYSBmaWxlc3lzdGVtLCB3aXRoIHByaW50YWJsZSBjaGFyYWN0ZXJzLgorICoKKyAqIFdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgYSBwcm9wZXJseSBpbml0aWFsaXplZCBjcnlwdG8gY29udGV4dCwKKyAqIHBvaW50ZWQgdG8gYnkgY3J5cHRfc3RhdC0+dGZtLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvbiBvdGhlcndpc2UKKyAqLworaW50IGVjcnlwdGZzX2VuY3J5cHRfYW5kX2VuY29kZV9maWxlbmFtZSgKKwljaGFyICoqZW5jb2RlZF9uYW1lLAorCXNpemVfdCAqZW5jb2RlZF9uYW1lX3NpemUsCisJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfc2l6ZSkKK3sKKwlzaXplX3QgZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplOworCWludCByYyA9IDA7CisKKwkoKmVuY29kZWRfbmFtZSkgPSBOVUxMOworCSgqZW5jb2RlZF9uYW1lX3NpemUpID0gMDsKKwlpZiAoKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVMpKQorCSAgICB8fCAobW91bnRfY3J5cHRfc3RhdCAmJiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCQkgICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKSkpIHsKKwkJc3RydWN0IGVjcnlwdGZzX2ZpbGVuYW1lICpmaWxlbmFtZTsKKworCQlmaWxlbmFtZSA9IGt6YWxsb2Moc2l6ZW9mKCpmaWxlbmFtZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWZpbGVuYW1lKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nICIKKwkJCSAgICAgICAidG8ga3phbGxvYyBbJXpkXSBieXRlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgc2l6ZW9mKCpmaWxlbmFtZSkpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmlsZW5hbWUtPmZpbGVuYW1lID0gKGNoYXIgKiluYW1lOworCQlmaWxlbmFtZS0+ZmlsZW5hbWVfc2l6ZSA9IG5hbWVfc2l6ZTsKKwkJcmMgPSBlY3J5cHRmc19lbmNyeXB0X2ZpbGVuYW1lKGZpbGVuYW1lLCBjcnlwdF9zdGF0LAorCQkJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdCk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNyeXB0ICIKKwkJCSAgICAgICAiZmlsZW5hbWU7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJCWtmcmVlKGZpbGVuYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVjcnlwdGZzX2VuY29kZV9mb3JfZmlsZW5hbWUoCisJCQlOVUxMLCAmZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplLAorCQkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSwKKwkJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSk7CisJCWlmICgoY3J5cHRfc3RhdCAmJiAoY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCQkgICAgJiBFQ1JZUFRGU19FTkNGTl9VU0VfTU9VTlRfRk5FSykpCisJCSAgICB8fCAobW91bnRfY3J5cHRfc3RhdAorCQkJJiYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkgICAgJiBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX01PVU5UX0ZORUspKSkKKwkJCSgqZW5jb2RlZF9uYW1lX3NpemUpID0KKwkJCQkoRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUKKwkJCQkgKyBlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemUpOworCQllbHNlCisJCQkoKmVuY29kZWRfbmFtZV9zaXplKSA9CisJCQkJKEVDUllQVEZTX0ZFS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUKKwkJCQkgKyBlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemUpOworCQkoKmVuY29kZWRfbmFtZSkgPSBrbWFsbG9jKCgqZW5jb2RlZF9uYW1lX3NpemUpICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghKCplbmNvZGVkX25hbWUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nICIKKwkJCSAgICAgICAidG8ga3phbGxvYyBbJXpkXSBieXRlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgKCplbmNvZGVkX25hbWVfc2l6ZSkpOworCQkJcmMgPSAtRU5PTUVNOworCQkJa2ZyZWUoZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSk7CisJCQlrZnJlZShmaWxlbmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzCisJCQkJICAgICYgRUNSWVBURlNfRU5DRk5fVVNFX01PVU5UX0ZORUspKQorCQkgICAgfHwgKG1vdW50X2NyeXB0X3N0YXQKKwkJCSYmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncworCQkJICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKSkpIHsKKwkJCW1lbWNweSgoKmVuY29kZWRfbmFtZSksCisJCQkgICAgICAgRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYLAorCQkJICAgICAgIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFKTsKKwkJCWVjcnlwdGZzX2VuY29kZV9mb3JfZmlsZW5hbWUoCisJCQkgICAgKCgqZW5jb2RlZF9uYW1lKQorCQkJICAgICArIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFKSwKKwkJCSAgICAmZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplLAorCQkJICAgIGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUsCisJCQkgICAgZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplKTsKKwkJCSgqZW5jb2RlZF9uYW1lX3NpemUpID0KKwkJCQkoRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUKKwkJCQkgKyBlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemUpOworCQkJKCplbmNvZGVkX25hbWUpWygqZW5jb2RlZF9uYW1lX3NpemUpXSA9ICdcMCc7CisJCQkoKmVuY29kZWRfbmFtZV9zaXplKSsrOworCQl9IGVsc2UgeworCQkJcmMgPSAtRU5PVFNVUFA7CisJCX0KKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGVuY29kZSAiCisJCQkgICAgICAgImVuY3J5cHRlZCBmaWxlbmFtZTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICByYyk7CisJCQlrZnJlZSgoKmVuY29kZWRfbmFtZSkpOworCQkJKCplbmNvZGVkX25hbWUpID0gTlVMTDsKKwkJCSgqZW5jb2RlZF9uYW1lX3NpemUpID0gMDsKKwkJfQorCQlrZnJlZShmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lKTsKKwkJa2ZyZWUoZmlsZW5hbWUpOworCX0gZWxzZSB7CisJCXJjID0gZWNyeXB0ZnNfY29weV9maWxlbmFtZShlbmNvZGVkX25hbWUsCisJCQkJCSAgICBlbmNvZGVkX25hbWVfc2l6ZSwKKwkJCQkJICAgIG5hbWUsIG5hbWVfc2l6ZSk7CisJfQorb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBlY3J5cHRmc19kZWNvZGVfYW5kX2RlY3J5cHRfZmlsZW5hbWUgLSBjb252ZXJ0cyB0aGUgZW5jb2RlZCBjaXBoZXIgdGV4dCBuYW1lIHRvIGRlY29kZWQgcGxhaW50ZXh0CisgKiBAcGxhaW50ZXh0X25hbWU6IFRoZSBwbGFpbnRleHQgbmFtZQorICogQHBsYWludGV4dF9uYW1lX3NpemU6IFRoZSBwbGFpbnRleHQgbmFtZSBzaXplCisgKiBAZWNyeXB0ZnNfZGlyX2RlbnRyeTogZUNyeXB0ZnMgZGlyZWN0b3J5IGRlbnRyeQorICogQG5hbWU6IFRoZSBmaWxlbmFtZSBpbiBjaXBoZXIgdGV4dAorICogQG5hbWVfc2l6ZTogVGhlIGNpcGhlciB0ZXh0IG5hbWUgc2l6ZQorICoKKyAqIERlY3J5cHRzIGFuZCBkZWNvZGVzIHRoZSBmaWxlbmFtZS4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gZXJyb3I7IG5vbi16ZXJvIG90aGVyd2lzZQorICovCitpbnQgZWNyeXB0ZnNfZGVjb2RlX2FuZF9kZWNyeXB0X2ZpbGVuYW1lKGNoYXIgKipwbGFpbnRleHRfbmFtZSwKKwkJCQkJIHNpemVfdCAqcGxhaW50ZXh0X25hbWVfc2l6ZSwKKwkJCQkJIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2Rpcl9kZW50cnksCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9zaXplKQoreworCWNoYXIgKmRlY29kZWRfbmFtZTsKKwlzaXplX3QgZGVjb2RlZF9uYW1lX3NpemU7CisJc2l6ZV90IHBhY2tldF9zaXplOworCWludCByYyA9IDA7CisKKwlpZiAoKG5hbWVfc2l6ZSA+IEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFKQorCSAgICAmJiAoc3RybmNtcChuYW1lLCBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVgsCisJCQlFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRSkgPT0gMCkpIHsKKwkJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPQorCQkJJmVjcnlwdGZzX3N1cGVyYmxvY2tfdG9fcHJpdmF0ZSgKKwkJCQllY3J5cHRmc19kaXJfZGVudHJ5LT5kX3NiKS0+bW91bnRfY3J5cHRfc3RhdDsKKwkJY29uc3QgY2hhciAqb3JpZ19uYW1lID0gbmFtZTsKKwkJc2l6ZV90IG9yaWdfbmFtZV9zaXplID0gbmFtZV9zaXplOworCisJCW5hbWUgKz0gRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkU7CisJCW5hbWVfc2l6ZSAtPSBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRTsKKwkJZWNyeXB0ZnNfZGVjb2RlX2Zyb21fZmlsZW5hbWUoTlVMTCwgJmRlY29kZWRfbmFtZV9zaXplLAorCQkJCQkgICAgICBuYW1lLCBuYW1lX3NpemUpOworCQlkZWNvZGVkX25hbWUgPSBrbWFsbG9jKGRlY29kZWRfbmFtZV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkZWNvZGVkX25hbWUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgorCQkJICAgICAgICJ0byBrbWFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICBkZWNvZGVkX25hbWVfc2l6ZSk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQllY3J5cHRmc19kZWNvZGVfZnJvbV9maWxlbmFtZShkZWNvZGVkX25hbWUsICZkZWNvZGVkX25hbWVfc2l6ZSwKKwkJCQkJICAgICAgbmFtZSwgbmFtZV9zaXplKTsKKwkJcmMgPSBlY3J5cHRmc19wYXJzZV90YWdfNzBfcGFja2V0KHBsYWludGV4dF9uYW1lLAorCQkJCQkJICBwbGFpbnRleHRfbmFtZV9zaXplLAorCQkJCQkJICAmcGFja2V0X3NpemUsCisJCQkJCQkgIG1vdW50X2NyeXB0X3N0YXQsCisJCQkJCQkgIGRlY29kZWRfbmFtZSwKKwkJCQkJCSAgZGVjb2RlZF9uYW1lX3NpemUpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VsZCBub3QgcGFyc2UgdGFnIDcwIHBhY2tldCAiCisJCQkgICAgICAgImZyb20gZmlsZW5hbWU7IGNvcHlpbmcgdGhyb3VnaCBmaWxlbmFtZSAiCisJCQkgICAgICAgImFzLWlzXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IGVjcnlwdGZzX2NvcHlfZmlsZW5hbWUocGxhaW50ZXh0X25hbWUsCisJCQkJCQkgICAgcGxhaW50ZXh0X25hbWVfc2l6ZSwKKwkJCQkJCSAgICBvcmlnX25hbWUsIG9yaWdfbmFtZV9zaXplKTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9IGVsc2UgeworCQlyYyA9IGVjcnlwdGZzX2NvcHlfZmlsZW5hbWUocGxhaW50ZXh0X25hbWUsCisJCQkJCSAgICBwbGFpbnRleHRfbmFtZV9zaXplLAorCQkJCQkgICAgbmFtZSwgbmFtZV9zaXplKTsKKwkJZ290byBvdXQ7CisJfQorb3V0X2ZyZWU6CisJa2ZyZWUoZGVjb2RlZF9uYW1lKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaCBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCmluZGV4IGE3NTAyNmQuLmMxMWZjOTUgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCisrKyBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCkBAIC01MSwxMiArNTEsMTYgQEAKICNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19YQVRUUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAogI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX01VTFRLRVkgICAgICAgICAgICAgICAweDAwMDAwMDIwCiAjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfREVWTUlTQyAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19ITUFDICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX0ZJTEVOQU1FX0VOQ1JZUFRJT04gICAweDAwMDAwMTAwCisjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfR0NNICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKICNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19NQVNLIChFQ1JZUFRGU19WRVJTSU9OSU5HX1BBU1NQSFJBU0UgXAogCQkJCSAgfCBFQ1JZUFRGU19WRVJTSU9OSU5HX1BMQUlOVEVYVF9QQVNTVEhST1VHSCBcCiAJCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfUFVCS0VZIFwKIAkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19YQVRUUiBcCiAJCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfTVVMVEtFWSBcCi0JCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfREVWTUlTQykKKwkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19ERVZNSVNDIFwKKwkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19GSUxFTkFNRV9FTkNSWVBUSU9OKQogI2RlZmluZSBFQ1JZUFRGU19NQVhfUEFTU1dPUkRfTEVOR1RIIDY0CiAjZGVmaW5lIEVDUllQVEZTX01BWF9QQVNTUEhSQVNFX0JZVEVTIEVDUllQVEZTX01BWF9QQVNTV09SRF9MRU5HVEgKICNkZWZpbmUgRUNSWVBURlNfU0FMVF9TSVpFIDgKQEAgLTE5OSw2ICsyMDMsNyBAQAogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0NJUEhFUiAiYWVzIgogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0tFWV9CWVRFUyAxNgogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0hBU0ggIm1kNSIKKyNkZWZpbmUgRUNSWVBURlNfVEFHXzcwX0RJR0VTVCBFQ1JZUFRGU19ERUZBVUxUX0hBU0gKICNkZWZpbmUgRUNSWVBURlNfVEFHXzFfUEFDS0VUX1RZUEUgMHgwMQogI2RlZmluZSBFQ1JZUFRGU19UQUdfM19QQUNLRVRfVFlQRSAweDhDCiAjZGVmaW5lIEVDUllQVEZTX1RBR18xMV9QQUNLRVRfVFlQRSAweEVECkBAIC0yMDYsMzAgKzIxMSw2NCBAQAogI2RlZmluZSBFQ1JZUFRGU19UQUdfNjVfUEFDS0VUX1RZUEUgMHg0MQogI2RlZmluZSBFQ1JZUFRGU19UQUdfNjZfUEFDS0VUX1RZUEUgMHg0MgogI2RlZmluZSBFQ1JZUFRGU19UQUdfNjdfUEFDS0VUX1RZUEUgMHg0MworI2RlZmluZSBFQ1JZUFRGU19UQUdfNzBfUEFDS0VUX1RZUEUgMHg0NiAvKiBGTkVLLWVuY3J5cHRlZCBmaWxlbmFtZQorCQkJCQkgICogYXMgZGVudHJ5IG5hbWUgKi8KKyNkZWZpbmUgRUNSWVBURlNfVEFHXzcxX1BBQ0tFVF9UWVBFIDB4NDcgLyogRk5FSy1lbmNyeXB0ZWQgZmlsZW5hbWUgaW4KKwkJCQkJICAqIG1ldGFkYXRhICovCisjZGVmaW5lIEVDUllQVEZTX1RBR183Ml9QQUNLRVRfVFlQRSAweDQ4IC8qIEZFSy1lbmNyeXB0ZWQgZmlsZW5hbWUgYXMKKwkJCQkJICAqIGRlbnRyeSBuYW1lICovCisjZGVmaW5lIEVDUllQVEZTX1RBR183M19QQUNLRVRfVFlQRSAweDQ5IC8qIEZFSy1lbmNyeXB0ZWQgZmlsZW5hbWUgYXMKKwkJCQkJICAqIG1ldGFkYXRhICovCisvKiBDb25zdHJhaW50OiBFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMgPj0KKyAqIEVDUllQVEZTX01BWF9JVl9CWVRFUyAqLworI2RlZmluZSBFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMgMTYKKyNkZWZpbmUgRUNSWVBURlNfTk9OX05VTEwgMHg0MiAvKiBBIHJlYXNvbmFibGUgc3Vic3RpdHV0ZSBmb3IgTlVMTCAqLwogI2RlZmluZSBNRDVfRElHRVNUX1NJWkUgMTYKKyNkZWZpbmUgRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFIE1ENV9ESUdFU1RfU0laRQorI2RlZmluZSBFQ1JZUFRGU19GRUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWCAiRUNSWVBURlNfRkVLX0VOQ1JZUFRFRC4iCisjZGVmaW5lIEVDUllQVEZTX0ZFS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUgMjMKKyNkZWZpbmUgRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYICJFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRC4iCisjZGVmaW5lIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFIDI0CisjZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRFRF9ERU5UUllfTkFNRV9MRU4gKDE4ICsgMSArIDQgKyAxICsgMzIpCiAKIHN0cnVjdCBlY3J5cHRmc19rZXlfc2lnIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X3N0YXRfbGlzdDsKIAljaGFyIGtleXNpZ1tFQ1JZUFRGU19TSUdfU0laRV9IRVhdOwogfTsKIAorc3RydWN0IGVjcnlwdGZzX2ZpbGVuYW1lIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X3N0YXRfbGlzdDsKKyNkZWZpbmUgRUNSWVBURlNfRklMRU5BTUVfQ09OVEFJTlNfREVDUllQVEVEIDB4MDAwMDAwMDEKKwl1MzIgZmxhZ3M7CisJdTMyIHNlcV9ubzsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICplbmNyeXB0ZWRfZmlsZW5hbWU7CisJc2l6ZV90IGZpbGVuYW1lX3NpemU7CisJc2l6ZV90IGVuY3J5cHRlZF9maWxlbmFtZV9zaXplOworCWNoYXIgZm5la19zaWdbRUNSWVBURlNfU0lHX1NJWkVfSEVYXTsKKwljaGFyIGRlbnRyeV9uYW1lW0VDUllQVEZTX0VOQ1JZUFRFRF9ERU5UUllfTkFNRV9MRU4gKyAxXTsKK307CisKIC8qKgogICogVGhpcyBpcyB0aGUgcHJpbWFyeSBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZW5jcnlwdGVkIGZpbGUuCiAgKgogICogVE9ETzogY2FjaGUgYWxpZ24vcGFjaz8KICAqLwogc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgewotI2RlZmluZSBFQ1JZUFRGU19TVFJVQ1RfSU5JVElBTElaRUQgMHgwMDAwMDAwMQotI2RlZmluZSBFQ1JZUFRGU19QT0xJQ1lfQVBQTElFRCAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFQ1JZUFRGU19ORVdfRklMRSAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBURUQgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFQ1JZUFRGU19TRUNVUklUWV9XQVJOSU5HICAgMHgwMDAwMDAxMAotI2RlZmluZSBFQ1JZUFRGU19FTkFCTEVfSE1BQyAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBUX0lWX1BBR0VTICAgMHgwMDAwMDA0MAotI2RlZmluZSBFQ1JZUFRGU19LRVlfVkFMSUQgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFQ1JZUFRGU19NRVRBREFUQV9JTl9YQVRUUiAgMHgwMDAwMDEwMAotI2RlZmluZSBFQ1JZUFRGU19WSUVXX0FTX0VOQ1JZUFRFRCAgMHgwMDAwMDIwMAotI2RlZmluZSBFQ1JZUFRGU19LRVlfU0VUICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBFQ1JZUFRGU19TVFJVQ1RfSU5JVElBTElaRUQgICAweDAwMDAwMDAxCisjZGVmaW5lIEVDUllQVEZTX1BPTElDWV9BUFBMSUVEICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUNSWVBURlNfTkVXX0ZJTEUgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBURUQgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVDUllQVEZTX1NFQ1VSSVRZX1dBUk5JTkcgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUNSWVBURlNfRU5BQkxFX0hNQUMgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBUX0lWX1BBR0VTICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVDUllQVEZTX0tFWV9WQUxJRCAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFIgICAgMHgwMDAwMDEwMAorI2RlZmluZSBFQ1JZUFRGU19WSUVXX0FTX0VOQ1JZUFRFRCAgICAweDAwMDAwMjAwCisjZGVmaW5lIEVDUllQVEZTX0tFWV9TRVQgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVMgICAgMHgwMDAwMDgwMAorI2RlZmluZSBFQ1JZUFRGU19FTkNGTl9VU0VfTU9VTlRfRk5FSyAweDAwMDAxMDAwCisjZGVmaW5lIEVDUllQVEZTX0VOQ0ZOX1VTRV9GRUsgICAgICAgIDB4MDAwMDIwMDAKIAl1MzIgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGZpbGVfdmVyc2lvbjsKIAlzaXplX3QgaXZfYnl0ZXM7CkBAIC0zMzIsMTMgKzM3MSwyMCBAQAogI2RlZmluZSBFQ1JZUFRGU19YQVRUUl9NRVRBREFUQV9FTkFCTEVEICAgICAgICAweDAwMDAwMDAyCiAjZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRFRF9WSUVXX0VOQUJMRUQgICAgICAgIDB4MDAwMDAwMDQKICNkZWZpbmUgRUNSWVBURlNfTU9VTlRfQ1JZUFRfU1RBVF9JTklUSUFMSVpFRCAgMHgwMDAwMDAwOAorI2RlZmluZSBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfTU9VTlRfRk5FSyAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9GRUsgICAgICAgICAgMHgwMDAwMDA0MAogCXUzMiBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGdsb2JhbF9hdXRoX3Rva19saXN0OwogCXN0cnVjdCBtdXRleCBnbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleDsKIAlzaXplX3QgbnVtX2dsb2JhbF9hdXRoX3Rva3M7CiAJc2l6ZV90IGdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZTsKKwlzaXplX3QgZ2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlczsKIAl1bnNpZ25lZCBjaGFyIGdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lW0VDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFCiAJCQkJCQkgKyAxXTsKKwl1bnNpZ25lZCBjaGFyIGdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lWworCQlFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRSArIDFdOworCWNoYXIgZ2xvYmFsX2RlZmF1bHRfZm5la19zaWdbRUNSWVBURlNfU0lHX1NJWkVfSEVYICsgMV07CiB9OwogCiAvKiBzdXBlcmJsb2NrIHByaXZhdGUgZGF0YS4gKi8KQEAgLTU3MSwxMyArNjE3LDIyIEBACiBpbnQgZWNyeXB0ZnNfaW50ZXJwb3NlKHN0cnVjdCBkZW50cnkgKmhpZGRlbl9kZW50cnksCiAJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICp0aGlzX2RlbnRyeSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJICAgICAgIHUzMiBmbGFncyk7CitpbnQgZWNyeXB0ZnNfbG9va3VwX2FuZF9pbnRlcnBvc2VfbG93ZXIoc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5LAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnksCisJCQkJCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCQkJCQlzdHJ1Y3QgaW5vZGUgKmVjcnlwdGZzX2Rpcl9pbm9kZSwKKwkJCQkJc3RydWN0IG5hbWVpZGF0YSAqZWNyeXB0ZnNfbmQpOworaW50IGVjcnlwdGZzX2RlY29kZV9hbmRfZGVjcnlwdF9maWxlbmFtZShjaGFyICoqZGVjcnlwdGVkX25hbWUsCisJCQkJCSBzaXplX3QgKmRlY3J5cHRlZF9uYW1lX3NpemUsCisJCQkJCSBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnksCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9zaXplKTsKIGludCBlY3J5cHRmc19maWxsX3plcm9zKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgbmV3X2xlbmd0aCk7Ci1pbnQgZWNyeXB0ZnNfZGVjb2RlX2ZpbGVuYW1lKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAotCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLAotCQkJICAgICBjaGFyICoqZGVjcnlwdGVkX25hbWUpOwotaW50IGVjcnlwdGZzX2VuY29kZV9maWxlbmFtZShzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKLQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCwKLQkJCSAgICAgY2hhciAqKmVuY29kZWRfbmFtZSk7CitpbnQgZWNyeXB0ZnNfZW5jcnlwdF9hbmRfZW5jb2RlX2ZpbGVuYW1lKAorCWNoYXIgKiplbmNvZGVkX25hbWUsCisJc2l6ZV90ICplbmNvZGVkX25hbWVfc2l6ZSwKKwlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwKKwljb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9zaXplKTsKIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2xvd2VyX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICp0aGlzX2RlbnRyeSk7CiB2b2lkIGVjcnlwdGZzX2R1bXBfaGV4KGNoYXIgKmRhdGEsIGludCBieXRlcyk7CiBpbnQgdmlydF90b19zY2F0dGVybGlzdChjb25zdCB2b2lkICphZGRyLCBpbnQgc2l6ZSwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKQEAgLTU5OSw3ICs2NTQsNyBAQAogCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqZWNyeXB0ZnNfaW5vZGUpOwogaW50IGVjcnlwdGZzX3JlYWRfYW5kX3ZhbGlkYXRlX3hhdHRyX3JlZ2lvbihjaGFyICpwYWdlX3ZpcnQsCiAJCQkJCSAgICBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnkpOwotdTggZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCk7Cit1OCBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNoYXIgKmNpcGhlcl9uYW1lLCBzaXplX3Qga2V5X2J5dGVzKTsKIGludCBlY3J5cHRmc19jaXBoZXJfY29kZV90b19zdHJpbmcoY2hhciAqc3RyLCB1OCBjaXBoZXJfY29kZSk7CiB2b2lkIGVjcnlwdGZzX3NldF9kZWZhdWx0X3NpemVzKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KTsKIGludCBlY3J5cHRmc19nZW5lcmF0ZV9rZXlfcGFja2V0X3NldChjaGFyICpkZXN0X2Jhc2UsCkBAIC02OTQsNSArNzQ5LDE3IEBACiAJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqbG93ZXJfbW50LAogCQkJICAgICBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCk7CiBpbnQgZWNyeXB0ZnNfaW5pdF9wZXJzaXN0ZW50X2ZpbGUoc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5KTsKK2ludAorZWNyeXB0ZnNfd3JpdGVfdGFnXzcwX3BhY2tldChjaGFyICpkZXN0LCBzaXplX3QgKnJlbWFpbmluZ19ieXRlcywKKwkJCSAgICAgc2l6ZV90ICpwYWNrZXRfc2l6ZSwKKwkJCSAgICAgc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJCQkgICAgIGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgZmlsZW5hbWVfc2l6ZSk7CitpbnQKK2VjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXQoY2hhciAqKmZpbGVuYW1lLCBzaXplX3QgKmZpbGVuYW1lX3NpemUsCisJCQkgICAgIHNpemVfdCAqcGFja2V0X3NpemUsCisJCQkgICAgIHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCQkJICAgICBjaGFyICpkYXRhLCBzaXplX3QgbWF4X3BhY2tldF9zaXplKTsKK2ludCBlY3J5cHRmc19kZXJpdmVfaXYoY2hhciAqaXYsIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCQkgICAgICAgbG9mZl90IG9mZnNldCk7CiAKICNlbmRpZiAvKiAjaWZuZGVmIEVDUllQVEZTX0tFUk5FTF9IICovCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9maWxlLmMgYi9mcy9lY3J5cHRmcy9maWxlLmMKaW5kZXggNzEzODM0My4uOWU5NDQwNSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZmlsZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2ZpbGUuYwpAQCAtNzcsMjcgKzc3LDI3IEBACiAKIC8qIEluc3BpcmVkIGJ5IGdlbmVyaWMgZmlsbGRpciBpbiBmcy9yZWFkZGlyLmMgKi8KIHN0YXRpYyBpbnQKLWVjcnlwdGZzX2ZpbGxkaXIodm9pZCAqZGlyZW50LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgbG9mZl90IG9mZnNldCwKLQkJIHU2NCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCitlY3J5cHRmc19maWxsZGlyKHZvaWQgKmRpcmVudCwgY29uc3QgY2hhciAqbG93ZXJfbmFtZSwgaW50IGxvd2VyX25hbWVsZW4sCisJCSBsb2ZmX3Qgb2Zmc2V0LCB1NjQgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQogewotCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0OwogCXN0cnVjdCBlY3J5cHRmc19nZXRkZW50c19jYWxsYmFjayAqYnVmID0KIAkgICAgKHN0cnVjdCBlY3J5cHRmc19nZXRkZW50c19jYWxsYmFjayAqKWRpcmVudDsKKwlzaXplX3QgbmFtZV9zaXplOworCWNoYXIgKm5hbWU7CiAJaW50IHJjOwotCWludCBkZWNvZGVkX2xlbmd0aDsKLQljaGFyICpkZWNvZGVkX25hbWU7CiAKLQljcnlwdF9zdGF0ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX3ByaXZhdGUoYnVmLT5kZW50cnkpLT5jcnlwdF9zdGF0OwogCWJ1Zi0+ZmlsbGRpcl9jYWxsZWQrKzsKLQlkZWNvZGVkX2xlbmd0aCA9IGVjcnlwdGZzX2RlY29kZV9maWxlbmFtZShjcnlwdF9zdGF0LCBuYW1lLCBuYW1lbGVuLAotCQkJCQkJICAmZGVjb2RlZF9uYW1lKTsKLQlpZiAoZGVjb2RlZF9sZW5ndGggPCAwKSB7Ci0JCXJjID0gZGVjb2RlZF9sZW5ndGg7CisJcmMgPSBlY3J5cHRmc19kZWNvZGVfYW5kX2RlY3J5cHRfZmlsZW5hbWUoJm5hbWUsICZuYW1lX3NpemUsCisJCQkJCQkgIGJ1Zi0+ZGVudHJ5LCBsb3dlcl9uYW1lLAorCQkJCQkJICBsb3dlcl9uYW1lbGVuKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBkZWNvZGUgYW5kIGRlY3J5cHQgIgorCQkgICAgICAgImZpbGVuYW1lIFslc107IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIGxvd2VyX25hbWUsCisJCSAgICAgICByYyk7CiAJCWdvdG8gb3V0OwogCX0KLQlyYyA9IGJ1Zi0+ZmlsbGRpcihidWYtPmRpcmVudCwgZGVjb2RlZF9uYW1lLCBkZWNvZGVkX2xlbmd0aCwgb2Zmc2V0LAotCQkJICBpbm8sIGRfdHlwZSk7Ci0Ja2ZyZWUoZGVjb2RlZF9uYW1lKTsKKwlyYyA9IGJ1Zi0+ZmlsbGRpcihidWYtPmRpcmVudCwgbmFtZSwgbmFtZV9zaXplLCBvZmZzZXQsIGlubywgZF90eXBlKTsKKwlrZnJlZShuYW1lKTsKIAlpZiAocmMgPj0gMCkKIAkJYnVmLT5lbnRyaWVzX3dyaXR0ZW4rKzsKIG91dDoKQEAgLTEwNiw4ICsxMDYsOCBAQAogCiAvKioKICAqIGVjcnlwdGZzX3JlYWRkaXIKLSAqIEBmaWxlOiBUaGUgZWNyeXB0ZnMgZmlsZSBzdHJ1Y3QKLSAqIEBkaXJlbnQ6IERpcmVjdG9yeSBlbnRyeQorICogQGZpbGU6IFRoZSBlQ3J5cHRmcyBkaXJlY3RvcnkgZmlsZQorICogQGRpcmVudDogRGlyZWN0b3J5IGVudHJ5IGhhbmRsZQogICogQGZpbGxkaXI6IFRoZSBmaWxsZGlyIGNhbGxiYWNrIGZ1bmN0aW9uCiAgKi8KIHN0YXRpYyBpbnQgZWNyeXB0ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2lub2RlLmMgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCmluZGV4IDAxMTE5MDYuLjU2OTc4OTkgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2lub2RlLmMKKysrIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwpAQCAtNTIsOCArNTIsNyBAQAogLyoqCiAgKiBlY3J5cHRmc19jcmVhdGVfdW5kZXJseWluZ19maWxlCiAgKiBAbG93ZXJfZGlyX2lub2RlOiBpbm9kZSBvZiB0aGUgcGFyZW50IGluIHRoZSBsb3dlciBmcyBvZiB0aGUgbmV3IGZpbGUKLSAqIEBsb3dlcl9kZW50cnk6IE5ldyBmaWxlJ3MgZGVudHJ5IGluIHRoZSBsb3dlciBmcwotICogQGVjcnlwdGZzX2RlbnRyeTogTmV3IGZpbGUncyBkZW50cnkgaW4gZWNyeXB0ZnMKKyAqIEBkZW50cnk6IE5ldyBmaWxlJ3MgZGVudHJ5CiAgKiBAbW9kZTogVGhlIG1vZGUgb2YgdGhlIG5ldyBmaWxlCiAgKiBAbmQ6IG5hbWVpZGF0YSBvZiBlY3J5cHRmcycgcGFyZW50J3MgZGVudHJ5ICYgdmZzbW91bnQKICAqCkBAIC0yMjgsOCArMjI3LDcgQEAKIHsKIAlpbnQgcmM7CiAKLQkvKiBlY3J5cHRmc19kb19jcmVhdGUoKSBjYWxscyBlY3J5cHRmc19pbnRlcnBvc2UoKSwgd2hpY2ggb3BlbnMKLQkgKiB0aGUgY3J5cHRfc3RhdC0+bG93ZXJfZmlsZSAocGVyc2lzdGVudCBmaWxlKSAqLworCS8qIGVjcnlwdGZzX2RvX2NyZWF0ZSgpIGNhbGxzIGVjcnlwdGZzX2ludGVycG9zZSgpICovCiAJcmMgPSBlY3J5cHRmc19kb19jcmVhdGUoZGlyZWN0b3J5X2lub2RlLCBlY3J5cHRmc19kZW50cnksIG1vZGUsIG5kKTsKIAlpZiAodW5saWtlbHkocmMpKSB7CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJGYWlsZWQgdG8gY3JlYXRlIGZpbGUgaW4iCkBAIC0yNDQsMTQxICsyNDIsOTEgQEAKIH0KIAogLyoqCi0gKiBlY3J5cHRmc19sb29rdXAKLSAqIEBkaXI6IGlub2RlCi0gKiBAZGVudHJ5OiBUaGUgZGVudHJ5Ci0gKiBAbmQ6IG5hbWVpZGF0YSwgbWF5IGJlIE5VTEwKLSAqCi0gKiBGaW5kIGEgZmlsZSBvbiBkaXNrLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbiB3ZSdsbCBhZGQgaXQgdG8gdGhlCi0gKiBkZW50cnkgY2FjaGUgYW5kIGNvbnRpbnVlIG9uIHRvIHJlYWQgaXQgZnJvbSB0aGUgZGlzay4KKyAqIGVjcnlwdGZzX2xvb2t1cF9hbmRfaW50ZXJwb3NlX2xvd2VyIC0gUGVyZm9ybSBhIGxvb2t1cAogICovCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCQkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitpbnQgZWNyeXB0ZnNfbG9va3VwX2FuZF9pbnRlcnBvc2VfbG93ZXIoc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5LAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnksCisJCQkJCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCQkJCQlzdHJ1Y3QgaW5vZGUgKmVjcnlwdGZzX2Rpcl9pbm9kZSwKKwkJCQkJc3RydWN0IG5hbWVpZGF0YSAqZWNyeXB0ZnNfbmQpCiB7Ci0JaW50IHJjID0gMDsKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kaXJfZGVudHJ5OwotCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKIAlzdHJ1Y3QgdmZzbW91bnQgKmxvd2VyX21udDsKLQljaGFyICplbmNvZGVkX25hbWU7Ci0JaW50IGVuY29kZWRfbmFtZWxlbjsKLQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCA9IE5VTEw7CisJc3RydWN0IGlub2RlICpsb3dlcl9pbm9kZTsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdDsKIAljaGFyICpwYWdlX3ZpcnQgPSBOVUxMOwotCXN0cnVjdCBpbm9kZSAqbG93ZXJfaW5vZGU7CiAJdTY0IGZpbGVfc2l6ZTsKKwlpbnQgcmMgPSAwOwogCi0JbG93ZXJfZGlyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnktPmRfcGFyZW50KTsKLQlkZW50cnktPmRfb3AgPSAmZWNyeXB0ZnNfZG9wczsKLQlpZiAoKGRlbnRyeS0+ZF9uYW1lLmxlbiA9PSAxICYmICFzdHJjbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgIi4iKSkKLQkgICAgfHwgKGRlbnRyeS0+ZF9uYW1lLmxlbiA9PSAyCi0JCSYmICFzdHJjbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgIi4uIikpKSB7Ci0JCWRfZHJvcChkZW50cnkpOwotCQlnb3RvIG91dDsKLQl9Ci0JZW5jb2RlZF9uYW1lbGVuID0gZWNyeXB0ZnNfZW5jb2RlX2ZpbGVuYW1lKGNyeXB0X3N0YXQsCi0JCQkJCQkgICBkZW50cnktPmRfbmFtZS5uYW1lLAotCQkJCQkJICAgZGVudHJ5LT5kX25hbWUubGVuLAotCQkJCQkJICAgJmVuY29kZWRfbmFtZSk7Ci0JaWYgKGVuY29kZWRfbmFtZWxlbiA8IDApIHsKLQkJcmMgPSBlbmNvZGVkX25hbWVsZW47Ci0JCWRfZHJvcChkZW50cnkpOwotCQlnb3RvIG91dDsKLQl9Ci0JZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJlbmNvZGVkX25hbWUgPSBbJXNdOyBlbmNvZGVkX25hbWVsZW4gIgotCQkJIj0gWyVkXVxuIiwgZW5jb2RlZF9uYW1lLCBlbmNvZGVkX25hbWVsZW4pOwotCWxvd2VyX2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGVuY29kZWRfbmFtZSwgbG93ZXJfZGlyX2RlbnRyeSwKLQkJCQkgICAgICBlbmNvZGVkX25hbWVsZW4gLSAxKTsKLQlrZnJlZShlbmNvZGVkX25hbWUpOwotCWlmIChJU19FUlIobG93ZXJfZGVudHJ5KSkgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFUlIgZnJvbSBsb3dlcl9kZW50cnlcbiIpOwotCQlyYyA9IFBUUl9FUlIobG93ZXJfZGVudHJ5KTsKLQkJZF9kcm9wKGRlbnRyeSk7Ci0JCWdvdG8gb3V0OwotCX0KLQlsb3dlcl9tbnQgPSBtbnRnZXQoZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyX21udChkZW50cnktPmRfcGFyZW50KSk7Ci0JZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJsb3dlcl9kZW50cnkgPSBbJXBdOyBsb3dlcl9kZW50cnktPiIKLSAgICAgICAJCSJkX25hbWUubmFtZSA9IFslc11cbiIsIGxvd2VyX2RlbnRyeSwKLQkJbG93ZXJfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJbG93ZXJfZGlyX2RlbnRyeSA9IGxvd2VyX2RlbnRyeS0+ZF9wYXJlbnQ7CisJbG93ZXJfbW50ID0gbW50Z2V0KGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoCisJCQkJICAgZWNyeXB0ZnNfZGVudHJ5LT5kX3BhcmVudCkpOwogCWxvd2VyX2lub2RlID0gbG93ZXJfZGVudHJ5LT5kX2lub2RlOwotCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CisJZnNzdGFja19jb3B5X2F0dHJfYXRpbWUoZWNyeXB0ZnNfZGlyX2lub2RlLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIAlCVUdfT04oIWF0b21pY19yZWFkKCZsb3dlcl9kZW50cnktPmRfY291bnQpKTsKLQllY3J5cHRmc19zZXRfZGVudHJ5X3ByaXZhdGUoZGVudHJ5LAorCWVjcnlwdGZzX3NldF9kZW50cnlfcHJpdmF0ZShlY3J5cHRmc19kZW50cnksCiAJCQkJICAgIGttZW1fY2FjaGVfYWxsb2MoZWNyeXB0ZnNfZGVudHJ5X2luZm9fY2FjaGUsCiAJCQkJCQkgICAgIEdGUF9LRVJORUwpKTsKLQlpZiAoIWVjcnlwdGZzX2RlbnRyeV90b19wcml2YXRlKGRlbnRyeSkpIHsKKwlpZiAoIWVjcnlwdGZzX2RlbnRyeV90b19wcml2YXRlKGVjcnlwdGZzX2RlbnRyeSkpIHsKIAkJcmMgPSAtRU5PTUVNOwotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nICIKLQkJCQkidG8gYWxsb2NhdGUgZWNyeXB0ZnNfZGVudHJ5X2luZm8gc3RydWN0XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCisJCSAgICAgICAidG8gYWxsb2NhdGUgZWNyeXB0ZnNfZGVudHJ5X2luZm8gc3RydWN0XG4iLAorCQkJX19mdW5jX18pOwogCQlnb3RvIG91dF9kcHV0OwogCX0KLQllY3J5cHRmc19zZXRfZGVudHJ5X2xvd2VyKGRlbnRyeSwgbG93ZXJfZGVudHJ5KTsKLQllY3J5cHRmc19zZXRfZGVudHJ5X2xvd2VyX21udChkZW50cnksIGxvd2VyX21udCk7CisJZWNyeXB0ZnNfc2V0X2RlbnRyeV9sb3dlcihlY3J5cHRmc19kZW50cnksIGxvd2VyX2RlbnRyeSk7CisJZWNyeXB0ZnNfc2V0X2RlbnRyeV9sb3dlcl9tbnQoZWNyeXB0ZnNfZGVudHJ5LCBsb3dlcl9tbnQpOwogCWlmICghbG93ZXJfZGVudHJ5LT5kX2lub2RlKSB7CiAJCS8qIFdlIHdhbnQgdG8gYWRkIGJlY2F1c2Ugd2UgY291bGRuJ3QgZmluZCBpbiBsb3dlciAqLwotCQlkX2FkZChkZW50cnksIE5VTEwpOworCQlkX2FkZChlY3J5cHRmc19kZW50cnksIE5VTEwpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmMgPSBlY3J5cHRmc19pbnRlcnBvc2UobG93ZXJfZGVudHJ5LCBkZW50cnksIGRpci0+aV9zYiwKLQkJCQlFQ1JZUFRGU19JTlRFUlBPU0VfRkxBR19EX0FERCk7CisJcmMgPSBlY3J5cHRmc19pbnRlcnBvc2UobG93ZXJfZGVudHJ5LCBlY3J5cHRmc19kZW50cnksCisJCQkJZWNyeXB0ZnNfZGlyX2lub2RlLT5pX3NiLCAxKTsKIAlpZiAocmMpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgaW50ZXJwb3NpbmdcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBpbnRlcnBvc2luZzsgcmMgPSBbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKIAkJZ290byBvdXQ7CiAJfQotCWlmIChTX0lTRElSKGxvd2VyX2lub2RlLT5pX21vZGUpKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiSXMgYSBkaXJlY3Rvcnk7IHJldHVybmluZ1xuIik7CisJaWYgKFNfSVNESVIobG93ZXJfaW5vZGUtPmlfbW9kZSkpCiAJCWdvdG8gb3V0OwotCX0KLQlpZiAoU19JU0xOSyhsb3dlcl9pbm9kZS0+aV9tb2RlKSkgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIklzIGEgc3ltbGluazsgcmV0dXJuaW5nXG4iKTsKKwlpZiAoU19JU0xOSyhsb3dlcl9pbm9kZS0+aV9tb2RlKSkKIAkJZ290byBvdXQ7Ci0JfQotCWlmIChzcGVjaWFsX2ZpbGUobG93ZXJfaW5vZGUtPmlfbW9kZSkpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJJcyBhIHNwZWNpYWwgZmlsZTsgcmV0dXJuaW5nXG4iKTsKKwlpZiAoc3BlY2lhbF9maWxlKGxvd2VyX2lub2RlLT5pX21vZGUpKQogCQlnb3RvIG91dDsKLQl9Ci0JaWYgKCFuZCkgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIldlIGhhdmUgYSBOVUxMIG5kLCBqdXN0IGxlYXZlIgotCQkJCSJhcyB3ZSAqdGhpbmsqIHdlIGFyZSBhYm91dCB0byB1bmxpbmtcbiIpOworCWlmICghZWNyeXB0ZnNfbmQpCiAJCWdvdG8gb3V0OwotCX0KIAkvKiBSZWxlYXNlZCBpbiB0aGlzIGZ1bmN0aW9uICovCi0JcGFnZV92aXJ0ID0ga21lbV9jYWNoZV96YWxsb2MoZWNyeXB0ZnNfaGVhZGVyX2NhY2hlXzIsCi0JCQkJICAgICAgR0ZQX1VTRVIpOworCXBhZ2VfdmlydCA9IGttZW1fY2FjaGVfemFsbG9jKGVjcnlwdGZzX2hlYWRlcl9jYWNoZV8yLCBHRlBfVVNFUik7CiAJaWYgKCFwYWdlX3ZpcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGttZW1fY2FjaGVfemFsbG9jKCkgYSBwYWdlXG4iLAorCQkgICAgICAgX19mdW5jX18pOwogCQlyYyA9IC1FTk9NRU07Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwKLQkJCQkiQ2Fubm90IGVjcnlwdGZzX2ttYWxsb2MgYSBwYWdlXG4iKTsKIAkJZ290byBvdXQ7CiAJfQotCWNyeXB0X3N0YXQgPSAmZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShkZW50cnktPmRfaW5vZGUpLT5jcnlwdF9zdGF0OwotCWlmICghKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfUE9MSUNZX0FQUExJRUQpKQotCQllY3J5cHRmc19zZXRfZGVmYXVsdF9zaXplcyhjcnlwdF9zdGF0KTsKLQlpZiAoIWVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZGVudHJ5LT5kX2lub2RlKS0+bG93ZXJfZmlsZSkgewotCQlyYyA9IGVjcnlwdGZzX2luaXRfcGVyc2lzdGVudF9maWxlKGRlbnRyeSk7CisJaWYgKCFlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGVjcnlwdGZzX2RlbnRyeS0+ZF9pbm9kZSktPmxvd2VyX2ZpbGUpIHsKKwkJcmMgPSBlY3J5cHRmc19pbml0X3BlcnNpc3RlbnRfZmlsZShlY3J5cHRmc19kZW50cnkpOwogCQlpZiAocmMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSAiCiAJCQkgICAgICAgInRoZSBwZXJzaXN0ZW50IGZpbGUgZm9yIHRoZSBkZW50cnkgd2l0aCBuYW1lICIKIAkJCSAgICAgICAiWyVzXTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLCByYyk7Ci0JCQlnb3RvIG91dDsKKwkJCSAgICAgICBlY3J5cHRmc19kZW50cnktPmRfbmFtZS5uYW1lLCByYyk7CisJCQlnb3RvIG91dF9mcmVlX2ttZW07CiAJCX0KIAl9CiAJcmMgPSBlY3J5cHRmc19yZWFkX2FuZF92YWxpZGF0ZV9oZWFkZXJfcmVnaW9uKHBhZ2VfdmlydCwKLQkJCQkJCSAgICAgIGRlbnRyeS0+ZF9pbm9kZSk7CisJCQkJCQkgICAgICBlY3J5cHRmc19kZW50cnktPmRfaW5vZGUpOwogCWlmIChyYykgewotCQlyYyA9IGVjcnlwdGZzX3JlYWRfYW5kX3ZhbGlkYXRlX3hhdHRyX3JlZ2lvbihwYWdlX3ZpcnQsIGRlbnRyeSk7CisJCXJjID0gZWNyeXB0ZnNfcmVhZF9hbmRfdmFsaWRhdGVfeGF0dHJfcmVnaW9uKHBhZ2VfdmlydCwKKwkJCQkJCQkgICAgIGVjcnlwdGZzX2RlbnRyeSk7CiAJCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlZhbGlkIG1ldGFkYXRhIG5vdCBmb3VuZCBpbiBoZWFkZXIgIgotCQkJICAgICAgICJyZWdpb24gb3IgeGF0dHIgcmVnaW9uOyB0cmVhdGluZyBmaWxlIGFzICIKLQkJCSAgICAgICAidW5lbmNyeXB0ZWRcbiIpOwogCQkJcmMgPSAwOwotCQkJa21lbV9jYWNoZV9mcmVlKGVjcnlwdGZzX2hlYWRlcl9jYWNoZV8yLCBwYWdlX3ZpcnQpOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9mcmVlX2ttZW07CiAJCX0KIAkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFI7CiAJfQogCW1vdW50X2NyeXB0X3N0YXQgPSAmZWNyeXB0ZnNfc3VwZXJibG9ja190b19wcml2YXRlKAotCQlkZW50cnktPmRfc2IpLT5tb3VudF9jcnlwdF9zdGF0OworCQllY3J5cHRmc19kZW50cnktPmRfc2IpLT5tb3VudF9jcnlwdF9zdGF0OwogCWlmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX0VOQ1JZUFRFRF9WSUVXX0VOQUJMRUQpIHsKIAkJaWYgKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFIpCiAJCQlmaWxlX3NpemUgPSAoY3J5cHRfc3RhdC0+bnVtX2hlYWRlcl9ieXRlc19hdF9mcm9udApAQCAtMzg4LDE0ICszMzYsMTAzIEBACiAJfSBlbHNlIHsKIAkJZmlsZV9zaXplID0gZ2V0X3VuYWxpZ25lZF9iZTY0KHBhZ2VfdmlydCk7CiAJfQotCWlfc2l6ZV93cml0ZShkZW50cnktPmRfaW5vZGUsIChsb2ZmX3QpZmlsZV9zaXplKTsKKwlpX3NpemVfd3JpdGUoZWNyeXB0ZnNfZGVudHJ5LT5kX2lub2RlLCAobG9mZl90KWZpbGVfc2l6ZSk7CitvdXRfZnJlZV9rbWVtOgogCWttZW1fY2FjaGVfZnJlZShlY3J5cHRmc19oZWFkZXJfY2FjaGVfMiwgcGFnZV92aXJ0KTsKIAlnb3RvIG91dDsKLQogb3V0X2RwdXQ6CiAJZHB1dChsb3dlcl9kZW50cnkpOwotCWRfZHJvcChkZW50cnkpOworCWRfZHJvcChlY3J5cHRmc19kZW50cnkpOwogb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBlY3J5cHRmc19sb29rdXAKKyAqIEBlY3J5cHRmc19kaXJfaW5vZGU6IFRoZSBlQ3J5cHRmcyBkaXJlY3RvcnkgaW5vZGUKKyAqIEBlY3J5cHRmc19kZW50cnk6IFRoZSBlQ3J5cHRmcyBkZW50cnkgdGhhdCB3ZSBhcmUgbG9va2luZyB1cAorICogQGVjcnlwdGZzX25kOiBuYW1laWRhdGE7IG1heSBiZSBOVUxMCisgKgorICogRmluZCBhIGZpbGUgb24gZGlzay4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gd2UnbGwgYWRkIGl0IHRvIHRoZQorICogZGVudHJ5IGNhY2hlIGFuZCBjb250aW51ZSBvbiB0byByZWFkIGl0IGZyb20gdGhlIGRpc2suCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19sb29rdXAoc3RydWN0IGlub2RlICplY3J5cHRmc19kaXJfaW5vZGUsCisJCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5LAorCQkJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKmVjcnlwdGZzX25kKQoreworCWNoYXIgKmVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lID0gTlVMTDsKKwlzaXplX3QgZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWVfc2l6ZTsKKwlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCA9IE5VTEw7CisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPSBOVUxMOworCXN0cnVjdCBlY3J5cHRmc19pbm9kZV9pbmZvICppbm9kZV9pbmZvOworCXN0cnVjdCBkZW50cnkgKmxvd2VyX2Rpcl9kZW50cnksICpsb3dlcl9kZW50cnk7CisJaW50IHJjID0gMDsKKworCWVjcnlwdGZzX2RlbnRyeS0+ZF9vcCA9ICZlY3J5cHRmc19kb3BzOworCWlmICgoZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubGVuID09IDEKKwkgICAgICYmICFzdHJjbXAoZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwgIi4iKSkKKwkgICAgfHwgKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLmxlbiA9PSAyCisJCSYmICFzdHJjbXAoZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwgIi4uIikpKSB7CisJCWdvdG8gb3V0X2RfZHJvcDsKKwl9CisJbG93ZXJfZGlyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihlY3J5cHRmc19kZW50cnktPmRfcGFyZW50KTsKKwlsb3dlcl9kZW50cnkgPSBsb29rdXBfb25lX2xlbihlY3J5cHRmc19kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICAgIGxvd2VyX2Rpcl9kZW50cnksCisJCQkJICAgICAgZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubGVuKTsKKwlpZiAoSVNfRVJSKGxvd2VyX2RlbnRyeSkpIHsKKwkJcmMgPSBQVFJfRVJSKGxvd2VyX2RlbnRyeSk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGxvb2t1cF9vbmVfbGVuKCkgcmV0dXJuZWQgWyVkXSBvbiAiCisJCSAgICAgICAibG93ZXJfZGVudHJ5ID0gWyVzXVxuIiwgX19mdW5jX18sIHJjLAorCQkgICAgICAgZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCWdvdG8gb3V0X2RfZHJvcDsKKwl9CisJaWYgKGxvd2VyX2RlbnRyeS0+ZF9pbm9kZSkKKwkJZ290byBsb29rdXBfYW5kX2ludGVycG9zZTsKKwlpbm9kZV9pbmZvID0gIGVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZWNyeXB0ZnNfZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAoaW5vZGVfaW5mbykgeworCQljcnlwdF9zdGF0ID0gJmlub2RlX2luZm8tPmNyeXB0X3N0YXQ7CisJCS8qIFRPRE86IGxvY2sgZm9yIGNyeXB0X3N0YXQgY29tcGFyaXNvbiAqLworCQlpZiAoIShjcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX1BPTElDWV9BUFBMSUVEKSkKKwkJCWVjcnlwdGZzX3NldF9kZWZhdWx0X3NpemVzKGNyeXB0X3N0YXQpOworCX0KKwlpZiAoY3J5cHRfc3RhdCkKKwkJbW91bnRfY3J5cHRfc3RhdCA9IGNyeXB0X3N0YXQtPm1vdW50X2NyeXB0X3N0YXQ7CisJZWxzZQorCQltb3VudF9jcnlwdF9zdGF0ID0gJmVjcnlwdGZzX3N1cGVyYmxvY2tfdG9fcHJpdmF0ZSgKKwkJCWVjcnlwdGZzX2RlbnRyeS0+ZF9zYiktPm1vdW50X2NyeXB0X3N0YXQ7CisJaWYgKCEoY3J5cHRfc3RhdCAmJiAoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19FTkNSWVBUX0ZJTEVOQU1FUykpCisJICAgICYmICEobW91bnRfY3J5cHRfc3RhdCAmJiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCQkgICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKSkpCisJCWdvdG8gbG9va3VwX2FuZF9pbnRlcnBvc2U7CisJZHB1dChsb3dlcl9kZW50cnkpOworCXJjID0gZWNyeXB0ZnNfZW5jcnlwdF9hbmRfZW5jb2RlX2ZpbGVuYW1lKAorCQkmZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWUsICZlbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZV9zaXplLAorCQljcnlwdF9zdGF0LCBtb3VudF9jcnlwdF9zdGF0LCBlY3J5cHRmc19kZW50cnktPmRfbmFtZS5uYW1lLAorCQllY3J5cHRmc19kZW50cnktPmRfbmFtZS5sZW4pOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGVuY3J5cHQgYW5kIGVuY29kZSAiCisJCSAgICAgICAiZmlsZW5hbWU7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfZF9kcm9wOworCX0KKwlsb3dlcl9kZW50cnkgPSBsb29rdXBfb25lX2xlbihlbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZSwKKwkJCQkgICAgICBsb3dlcl9kaXJfZGVudHJ5LAorCQkJCSAgICAgIGVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lX3NpemUgLSAxKTsKKwlpZiAoSVNfRVJSKGxvd2VyX2RlbnRyeSkpIHsKKwkJcmMgPSBQVFJfRVJSKGxvd2VyX2RlbnRyeSk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGxvb2t1cF9vbmVfbGVuKCkgcmV0dXJuZWQgWyVkXSBvbiAiCisJCSAgICAgICAibG93ZXJfZGVudHJ5ID0gWyVzXVxuIiwgX19mdW5jX18sIHJjLAorCQkgICAgICAgZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWUpOworCQlnb3RvIG91dF9kX2Ryb3A7CisJfQorbG9va3VwX2FuZF9pbnRlcnBvc2U6CisJcmMgPSBlY3J5cHRmc19sb29rdXBfYW5kX2ludGVycG9zZV9sb3dlcihlY3J5cHRmc19kZW50cnksIGxvd2VyX2RlbnRyeSwKKwkJCQkJCSBjcnlwdF9zdGF0LCBlY3J5cHRmc19kaXJfaW5vZGUsCisJCQkJCQkgZWNyeXB0ZnNfbmQpOworCWdvdG8gb3V0Oworb3V0X2RfZHJvcDoKKwlkX2Ryb3AoZWNyeXB0ZnNfZGVudHJ5KTsKK291dDoKKwlrZnJlZShlbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZSk7CiAJcmV0dXJuIEVSUl9QVFIocmMpOwogfQogCkBAIC00NjYsMTkgKzUwMywyMSBAQAogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kaXJfZGVudHJ5OwogCWNoYXIgKmVuY29kZWRfc3ltbmFtZTsKLQlpbnQgZW5jb2RlZF9zeW1sZW47Ci0Jc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPSBOVUxMOworCXNpemVfdCBlbmNvZGVkX3N5bWxlbjsKKwlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCA9IE5VTEw7CiAKIAlsb3dlcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5KTsKIAlkZ2V0KGxvd2VyX2RlbnRyeSk7CiAJbG93ZXJfZGlyX2RlbnRyeSA9IGxvY2tfcGFyZW50KGxvd2VyX2RlbnRyeSk7Ci0JZW5jb2RlZF9zeW1sZW4gPSBlY3J5cHRmc19lbmNvZGVfZmlsZW5hbWUoY3J5cHRfc3RhdCwgc3ltbmFtZSwKLQkJCQkJCSAgc3RybGVuKHN5bW5hbWUpLAotCQkJCQkJICAmZW5jb2RlZF9zeW1uYW1lKTsKLQlpZiAoZW5jb2RlZF9zeW1sZW4gPCAwKSB7Ci0JCXJjID0gZW5jb2RlZF9zeW1sZW47CisJbW91bnRfY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoCisJCWRpci0+aV9zYiktPm1vdW50X2NyeXB0X3N0YXQ7CisJcmMgPSBlY3J5cHRmc19lbmNyeXB0X2FuZF9lbmNvZGVfZmlsZW5hbWUoJmVuY29kZWRfc3ltbmFtZSwKKwkJCQkJCSAgJmVuY29kZWRfc3ltbGVuLAorCQkJCQkJICBOVUxMLAorCQkJCQkJICBtb3VudF9jcnlwdF9zdGF0LCBzeW1uYW1lLAorCQkJCQkJICBzdHJsZW4oc3ltbmFtZSkpOworCWlmIChyYykKIAkJZ290byBvdXRfbG9jazsKLQl9CiAJcmMgPSB2ZnNfc3ltbGluayhsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlLCBsb3dlcl9kZW50cnksCiAJCQkgZW5jb2RlZF9zeW1uYW1lKTsKIAlrZnJlZShlbmNvZGVkX3N5bW5hbWUpOwpAQCAtNjAyLDUyICs2NDEsNTQgQEAKIH0KIAogc3RhdGljIGludAotZWNyeXB0ZnNfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyIF9fdXNlciAqIGJ1ZiwgaW50IGJ1ZnNpeikKK2VjcnlwdGZzX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGJ1ZnNpeikKIHsKLQlpbnQgcmM7Ci0Jc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwotCWNoYXIgKmRlY29kZWRfbmFtZTsKIAljaGFyICpsb3dlcl9idWY7Ci0JbW1fc2VnbWVudF90IG9sZF9mczsKKwlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7CiAJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQ7CisJY2hhciAqcGxhaW50ZXh0X25hbWU7CisJc2l6ZV90IHBsYWludGV4dF9uYW1lX3NpemU7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwlpbnQgcmM7CiAKIAlsb3dlcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5KTsKIAlpZiAoIWxvd2VyX2RlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmspIHsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CisJY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGRlbnRyeS0+ZF9pbm9kZSktPmNyeXB0X3N0YXQ7CiAJLyogUmVsZWFzZWQgaW4gdGhpcyBmdW5jdGlvbiAqLwogCWxvd2VyX2J1ZiA9IGttYWxsb2MoYnVmc2l6LCBHRlBfS0VSTkVMKTsKIAlpZiAobG93ZXJfYnVmID09IE5VTEwpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImttYWxsb2MgWyVkXSBieXRlc1xuIiwgX19mdW5jX18sIGJ1ZnNpeik7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCW9sZF9mcyA9IGdldF9mcygpOwogCXNldF9mcyhnZXRfZHMoKSk7Ci0JZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJDYWxsaW5nIHJlYWRsaW5rIHcvICIKLQkJCSJsb3dlcl9kZW50cnktPmRfbmFtZS5uYW1lID0gWyVzXVxuIiwKLQkJCWxvd2VyX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCXJjID0gbG93ZXJfZGVudHJ5LT5kX2lub2RlLT5pX29wLT5yZWFkbGluayhsb3dlcl9kZW50cnksCiAJCQkJCQkgICAoY2hhciBfX3VzZXIgKilsb3dlcl9idWYsCiAJCQkJCQkgICBidWZzaXopOwogCXNldF9mcyhvbGRfZnMpOwogCWlmIChyYyA+PSAwKSB7Ci0JCWNyeXB0X3N0YXQgPSBOVUxMOwotCQlyYyA9IGVjcnlwdGZzX2RlY29kZV9maWxlbmFtZShjcnlwdF9zdGF0LCBsb3dlcl9idWYsIHJjLAotCQkJCQkgICAgICAmZGVjb2RlZF9uYW1lKTsKLQkJaWYgKHJjID09IC1FTk9NRU0pCisJCXJjID0gZWNyeXB0ZnNfZGVjb2RlX2FuZF9kZWNyeXB0X2ZpbGVuYW1lKCZwbGFpbnRleHRfbmFtZSwKKwkJCQkJCQkgICZwbGFpbnRleHRfbmFtZV9zaXplLAorCQkJCQkJCSAgZGVudHJ5LCBsb3dlcl9idWYsCisJCQkJCQkJICByYyk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBkZWNvZGUgYW5kICIKKwkJCSAgICAgICAiZGVjcnlwdCBmaWxlbmFtZTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQlyYyk7CiAJCQlnb3RvIG91dF9mcmVlX2xvd2VyX2J1ZjsKLQkJaWYgKHJjID4gMCkgewotCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJDb3B5aW5nIFslZF0gYnl0ZXMgIgotCQkJCQkidG8gdXNlcnNwYWNlOiBbJSpzXVxuIiwgcmMsCi0JCQkJCWRlY29kZWRfbmFtZSk7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZGVjb2RlZF9uYW1lLCByYykpCi0JCQkJcmMgPSAtRUZBVUxUOwogCQl9Ci0JCWtmcmVlKGRlY29kZWRfbmFtZSk7Ci0JCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGRlbnRyeS0+ZF9pbm9kZSwKLQkJCQkJbG93ZXJfZGVudHJ5LT5kX2lub2RlKTsKKwkJcmMgPSBjb3B5X3RvX3VzZXIoYnVmLCBwbGFpbnRleHRfbmFtZSwgcGxhaW50ZXh0X25hbWVfc2l6ZSk7CisJCWlmIChyYykKKwkJCXJjID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJcmMgPSBwbGFpbnRleHRfbmFtZV9zaXplOworCQlrZnJlZShwbGFpbnRleHRfbmFtZSk7CisJCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGRlbnRyeS0+ZF9pbm9kZSwgbG93ZXJfZGVudHJ5LT5kX2lub2RlKTsKIAl9CiBvdXRfZnJlZV9sb3dlcl9idWY6CiAJa2ZyZWUobG93ZXJfYnVmKTsKQEAgLTY2OSw4ICs3MTAsNiBAQAogCX0KIAlvbGRfZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoZ2V0X2RzKCkpOwotCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiQ2FsbGluZyByZWFkbGluayB3LyAiCi0JCQkiZGVudHJ5LT5kX25hbWUubmFtZSA9IFslc11cbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCXJjID0gZGVudHJ5LT5kX2lub2RlLT5pX29wLT5yZWFkbGluayhkZW50cnksIChjaGFyIF9fdXNlciAqKWJ1ZiwgbGVuKTsKIAlzZXRfZnMob2xkX2ZzKTsKIAlpZiAocmMgPCAwKQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKaW5kZXggMGQ3MTNiNi4uZmY1Mzk0MiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYworKysgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCkBAIC0zNTgsNyArMzU4LDcgQEAKIAkvKiB2ZXJpZnkgdGhhdCBldmVyeXRoaW5nIHRocm91Z2ggdGhlIGVuY3J5cHRlZCBGRUsgc2l6ZSBpcyBwcmVzZW50ICovCiAJaWYgKG1lc3NhZ2VfbGVuIDwgNCkgewogCQlyYyA9IC1FSU87Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lc3NhZ2VfbGVuIGlzIFslWmRdOyBtaW5pbXVtIGFjY2VwdGFibGUgIgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZXNzYWdlX2xlbiBpcyBbJXpkXTsgbWluaW11bSBhY2NlcHRhYmxlICIKIAkJICAgICAgICJtZXNzYWdlIGxlbmd0aCBpcyBbJWRdXG4iLCBfX2Z1bmNfXywgbWVzc2FnZV9sZW4sIDQpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zODUsMTMgKzM4NSwxMyBAQAogCWkgKz0gZGF0YV9sZW47CiAJaWYgKG1lc3NhZ2VfbGVuIDwgKGkgKyBrZXlfcmVjLT5lbmNfa2V5X3NpemUpKSB7CiAJCXJjID0gLUVJTzsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWVzc2FnZV9sZW4gWyVaZF07IG1heCBsZW4gaXMgWyVaZF1cbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lc3NhZ2VfbGVuIFslemRdOyBtYXggbGVuIGlzIFslemRdXG4iLAogCQkgICAgICAgX19mdW5jX18sIG1lc3NhZ2VfbGVuLCAoaSArIGtleV9yZWMtPmVuY19rZXlfc2l6ZSkpOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKGtleV9yZWMtPmVuY19rZXlfc2l6ZSA+IEVDUllQVEZTX01BWF9FTkNSWVBURURfS0VZX0JZVEVTKSB7CiAJCXJjID0gLUVJTzsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRW5jcnlwdGVkIGtleV9zaXplIFslWmRdIGxhcmdlciB0aGFuICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRW5jcnlwdGVkIGtleV9zaXplIFslemRdIGxhcmdlciB0aGFuICIKIAkJICAgICAgICJ0aGUgbWF4aW11bSBrZXkgc2l6ZSBbJWRdXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgIGtleV9yZWMtPmVuY19rZXlfc2l6ZSwKIAkJICAgICAgIEVDUllQVEZTX01BWF9FTkNSWVBURURfS0VZX0JZVEVTKTsKQEAgLTQwMyw2ICs0MDMsNTgwIEBACiB9CiAKIHN0YXRpYyBpbnQKK2VjcnlwdGZzX2ZpbmRfZ2xvYmFsX2F1dGhfdG9rX2Zvcl9zaWcoCisJc3RydWN0IGVjcnlwdGZzX2dsb2JhbF9hdXRoX3RvayAqKmdsb2JhbF9hdXRoX3RvaywKKwlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwgY2hhciAqc2lnKQoreworCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKndhbGtlcjsKKwlpbnQgcmMgPSAwOworCisJKCpnbG9iYWxfYXV0aF90b2spID0gTlVMTDsKKwltdXRleF9sb2NrKCZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YWxrZXIsCisJCQkgICAgJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0LAorCQkJICAgIG1vdW50X2NyeXB0X3N0YXRfbGlzdCkgeworCQlpZiAobWVtY21wKHdhbGtlci0+c2lnLCBzaWcsIEVDUllQVEZTX1NJR19TSVpFX0hFWCkgPT0gMCkgeworCQkJKCpnbG9iYWxfYXV0aF90b2spID0gd2Fsa2VyOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcmMgPSAtRUlOVkFMOworb3V0OgorCW11dGV4X3VubG9jaygmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3RfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBlY3J5cHRmc19maW5kX2F1dGhfdG9rX2Zvcl9zaWcKKyAqIEBhdXRoX3RvazogU2V0IHRvIHRoZSBtYXRjaGluZyBhdXRoX3RvazsgTlVMTCBpZiBub3QgZm91bmQKKyAqIEBjcnlwdF9zdGF0OiBpbm9kZSBjcnlwdF9zdGF0IGNyeXB0byBjb250ZXh0CisgKiBAc2lnOiBTaWcgb2YgYXV0aF90b2sgdG8gZmluZAorICoKKyAqIEZvciBub3csIHRoaXMgZnVuY3Rpb24gc2ltcGx5IGxvb2tzIGF0IHRoZSByZWdpc3RlcmVkIGF1dGhfdG9rJ3MKKyAqIGxpbmtlZCBvZmYgdGhlIG1vdW50X2NyeXB0X3N0YXQsIHNvIGFsbCB0aGUgYXV0aF90b2tzIHRoYXQgY2FuIGJlCisgKiB1c2VkIG11c3QgYmUgcmVnaXN0ZXJlZCBhdCBtb3VudCB0aW1lLiBUaGlzIGZ1bmN0aW9uIGNvdWxkCisgKiBwb3RlbnRpYWxseSB0cnkgYSBsb3QgaGFyZGVyIHRvIGZpbmQgYXV0aF90b2sncyAoZS5nLiwgYnkgY2FsbGluZworICogb3V0IHRvIGVjcnlwdGZzZCB0byBkeW5hbWljYWxseSByZXRyaWV2ZSBhbiBhdXRoX3RvayBvYmplY3QpIHNvCisgKiB0aGF0IHN0YXRpYyByZWdpc3RyYXRpb24gb2YgYXV0aF90b2sncyB3aWxsIG5vIGxvbmdlciBiZSBuZWNlc3NhcnkuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIG5vIGVycm9yOyBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50CitlY3J5cHRmc19maW5kX2F1dGhfdG9rX2Zvcl9zaWcoCisJc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICoqYXV0aF90b2ssCisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJY2hhciAqc2lnKQoreworCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKmdsb2JhbF9hdXRoX3RvazsKKwlpbnQgcmMgPSAwOworCisJKCphdXRoX3RvaykgPSBOVUxMOworCWlmIChlY3J5cHRmc19maW5kX2dsb2JhbF9hdXRoX3Rva19mb3Jfc2lnKCZnbG9iYWxfYXV0aF90b2ssCisJCQkJCQkgIG1vdW50X2NyeXB0X3N0YXQsIHNpZykpIHsKKwkJc3RydWN0IGtleSAqYXV0aF90b2tfa2V5OworCisJCXJjID0gZWNyeXB0ZnNfa2V5cmluZ19hdXRoX3Rva19mb3Jfc2lnKCZhdXRoX3Rva19rZXksIGF1dGhfdG9rLAorCQkJCQkJICAgICAgIHNpZyk7CisJfSBlbHNlCisJCSgqYXV0aF90b2spID0gZ2xvYmFsX2F1dGhfdG9rLT5nbG9iYWxfYXV0aF90b2s7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHdyaXRlX3RhZ183MF9wYWNrZXQgY2FuIGdvYmJsZSBhIGxvdCBvZiBzdGFjayBzcGFjZS4gV2Ugc3R1ZmYgbW9zdAorICogb2YgdGhlIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycyBpbiBhIGttYWxsb2MnZCBzdHJ1Y3QgdG8gaGVscCByZWR1Y2UKKyAqIGVDcnlwdGZzJyBvdmVyYWxsIHN0YWNrIHVzYWdlLgorICovCitzdHJ1Y3QgZWNyeXB0ZnNfd3JpdGVfdGFnXzcwX3BhY2tldF9zaWxseV9zdGFjayB7CisJdTggY2lwaGVyX2NvZGU7CisJc2l6ZV90IG1heF9wYWNrZXRfc2l6ZTsKKwlzaXplX3QgcGFja2V0X3NpemVfbGVuOworCXNpemVfdCBibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemU7CisJc2l6ZV90IGJsb2NrX3NpemU7CisJc2l6ZV90IGk7CisJc2l6ZV90IGo7CisJc2l6ZV90IG51bV9yYW5kX2J5dGVzOworCXN0cnVjdCBtdXRleCAqdGZtX211dGV4OworCWNoYXIgKmJsb2NrX2FsaWduZWRfZmlsZW5hbWU7CisJc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvazsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjX3NnOworCXN0cnVjdCBzY2F0dGVybGlzdCBkc3Rfc2c7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJY2hhciBpdltFQ1JZUFRGU19NQVhfSVZfQllURVNdOworCWNoYXIgaGFzaFtFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkVdOworCWNoYXIgdG1wX2hhc2hbRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFXTsKKwlzdHJ1Y3QgaGFzaF9kZXNjIGhhc2hfZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgaGFzaF9zZzsKK307CisKKy8qKgorICogd3JpdGVfdGFnXzcwX3BhY2tldCAtIFdyaXRlIGVuY3J5cHRlZCBmaWxlbmFtZSAoRUZOKSBwYWNrZXQgYWdhaW5zdCBGTkVLCisgKiBAZmlsZW5hbWU6IE5VTEwtdGVybWluYXRlZCBmaWxlbmFtZSBzdHJpbmcKKyAqCisgKiBUaGlzIGlzIHRoZSBzaW1wbGVzdCBtZWNoYW5pc20gZm9yIGFjaGlldmluZyBmaWxlbmFtZSBlbmNyeXB0aW9uIGluCisgKiBlQ3J5cHRmcy4gSXQgZW5jcnlwdHMgdGhlIGdpdmVuIGZpbGVuYW1lIHdpdGggdGhlIG1vdW50LXdpZGUKKyAqIGZpbGVuYW1lIGVuY3J5cHRpb24ga2V5IChGTkVLKSBhbmQgc3RvcmVzIGl0IGluIGEgcGFja2V0IHRvIEBkZXN0LAorICogd2hpY2ggdGhlIGNhbGxlZSB3aWxsIGVuY29kZSBhbmQgd3JpdGUgZGlyZWN0bHkgaW50byB0aGUgZGVudHJ5CisgKiBuYW1lLgorICovCitpbnQKK2VjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXQoY2hhciAqZGVzdCwgc2l6ZV90ICpyZW1haW5pbmdfYnl0ZXMsCisJCQkgICAgIHNpemVfdCAqcGFja2V0X3NpemUsCisJCQkgICAgIHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCQkJICAgICBjaGFyICpmaWxlbmFtZSwgc2l6ZV90IGZpbGVuYW1lX3NpemUpCit7CisJc3RydWN0IGVjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXRfc2lsbHlfc3RhY2sgKnM7CisJaW50IHJjID0gMDsKKworCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmICghcykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCB0cnlpbmcgdG8ga21hbGxvYyAiCisJCSAgICAgICAiWyV6ZF0gYnl0ZXMgb2Yga2VybmVsIG1lbW9yeVxuIiwgX19mdW5jX18sIHNpemVvZigqcykpOworCQlnb3RvIG91dDsKKwl9CisJcy0+ZGVzYy5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwkoKnBhY2tldF9zaXplKSA9IDA7CisJcmMgPSBlY3J5cHRmc19nZXRfdGZtX2FuZF9tdXRleF9mb3JfY2lwaGVyX25hbWUoCisJCSZzLT5kZXNjLnRmbSwKKwkJJnMtPnRmbV9tdXRleCwgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUpOworCWlmICh1bmxpa2VseShyYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnRlcm5hbCBlcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byBnZXQgIgorCQkgICAgICAgInRmbSBhbmQgbXV0ZXggZm9yIGNpcGhlciBuYW1lIFslc107IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lLCByYyk7CisJCWdvdG8gb3V0OworCX0KKwltdXRleF9sb2NrKHMtPnRmbV9tdXRleCk7CisJcy0+YmxvY2tfc2l6ZSA9IGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKHMtPmRlc2MudGZtKTsKKwkvKiBQbHVzIG9uZSBmb3IgdGhlIFwwIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSByYW5kb20gcHJlZml4CisJICogYW5kIHRoZSBwbGFpbnRleHQgZmlsZW5hbWUgKi8KKwlzLT5udW1fcmFuZF9ieXRlcyA9IChFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMgKyAxKTsKKwlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSAocy0+bnVtX3JhbmRfYnl0ZXMgKyBmaWxlbmFtZV9zaXplKTsKKwlpZiAoKHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSAlIHMtPmJsb2NrX3NpemUpICE9IDApIHsKKwkJcy0+bnVtX3JhbmRfYnl0ZXMgKz0gKHMtPmJsb2NrX3NpemUKKwkJCQkgICAgICAtIChzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUKKwkJCQkJICUgcy0+YmxvY2tfc2l6ZSkpOworCQlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSAocy0+bnVtX3JhbmRfYnl0ZXMKKwkJCQkJCSAgKyBmaWxlbmFtZV9zaXplKTsKKwl9CisJLyogT2N0ZXQgMDogVGFnIDcwIGlkZW50aWZpZXIKKwkgKiBPY3RldHMgMS1OMTogVGFnIDcwIHBhY2tldCBzaXplIChpbmNsdWRlcyBjaXBoZXIgaWRlbnRpZmllcgorCSAqICAgICAgICAgICAgICBhbmQgYmxvY2stYWxpZ25lZCBlbmNyeXB0ZWQgZmlsZW5hbWUgc2l6ZSkKKwkgKiBPY3RldHMgTjEtTjI6IEZORUsgc2lnIChFQ1JZUFRGU19TSUdfU0laRSkKKwkgKiBPY3RldCBOMi1OMzogQ2lwaGVyIGlkZW50aWZpZXIgKDEgb2N0ZXQpCisJICogT2N0ZXRzIE4zLU40OiBCbG9jay1hbGlnbmVkIGVuY3J5cHRlZCBmaWxlbmFtZQorCSAqICAtIENvbnNpc3RzIG9mIGEgbWluaW11bSBudW1iZXIgb2YgcmFuZG9tIGNoYXJhY3RlcnMsIGEgXDAKKwkgKiAgICBzZXBhcmF0b3IsIGFuZCB0aGVuIHRoZSBmaWxlbmFtZSAqLworCXMtPm1heF9wYWNrZXRfc2l6ZSA9ICgxICAgICAgICAgICAgICAgICAgIC8qIFRhZyA3MCBpZGVudGlmaWVyICovCisJCQkgICAgICArIDMgICAgICAgICAgICAgICAgIC8qIE1heCBUYWcgNzAgcGFja2V0IHNpemUgKi8KKwkJCSAgICAgICsgRUNSWVBURlNfU0lHX1NJWkUgLyogRk5FSyBzaWcgKi8KKwkJCSAgICAgICsgMSAgICAgICAgICAgICAgICAgLyogQ2lwaGVyIGlkZW50aWZpZXIgKi8KKwkJCSAgICAgICsgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCSgqcGFja2V0X3NpemUpID0gcy0+bWF4X3BhY2tldF9zaXplOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWlmIChzLT5tYXhfcGFja2V0X3NpemUgPiAoKnJlbWFpbmluZ19ieXRlcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlcXVpcmUgWyV6ZF0gYnl0ZXMgdG8gd3JpdGU7IG9ubHkgIgorCQkgICAgICAgIlslemRdIGF2YWlsYWJsZVxuIiwgX19mdW5jX18sIHMtPm1heF9wYWNrZXRfc2l6ZSwKKwkJICAgICAgICgqcmVtYWluaW5nX2J5dGVzKSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lID0ga3phbGxvYyhzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIGtlcm5lbCBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImt6YWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXMtPmkgPSAwOworCWRlc3Rbcy0+aSsrXSA9IEVDUllQVEZTX1RBR183MF9QQUNLRVRfVFlQRTsKKwlyYyA9IGVjcnlwdGZzX3dyaXRlX3BhY2tldF9sZW5ndGgoJmRlc3Rbcy0+aV0sCisJCQkJCSAgKEVDUllQVEZTX1NJR19TSVpFCisJCQkJCSAgICsgMSAvKiBDaXBoZXIgY29kZSAqLworCQkJCQkgICArIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSksCisJCQkJCSAgJnMtPnBhY2tldF9zaXplX2xlbik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGdlbmVyYXRpbmcgdGFnIDcwIHBhY2tldCAiCisJCSAgICAgICAiaGVhZGVyOyBjYW5ub3QgZ2VuZXJhdGUgcGFja2V0IGxlbmd0aDsgcmMgPSBbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXMtPmkgKz0gcy0+cGFja2V0X3NpemVfbGVuOworCWVjcnlwdGZzX2Zyb21faGV4KCZkZXN0W3MtPmldLAorCQkJICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZywKKwkJCSAgRUNSWVBURlNfU0lHX1NJWkUpOworCXMtPmkgKz0gRUNSWVBURlNfU0lHX1NJWkU7CisJcy0+Y2lwaGVyX2NvZGUgPSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKAorCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZSwKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJaWYgKHMtPmNpcGhlcl9jb2RlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBnZW5lcmF0ZSBjb2RlIGZvciAiCisJCSAgICAgICAiY2lwaGVyIFslc10gd2l0aCBrZXkgYnl0ZXMgWyV6ZF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJZGVzdFtzLT5pKytdID0gcy0+Y2lwaGVyX2NvZGU7CisJcmMgPSBlY3J5cHRmc19maW5kX2F1dGhfdG9rX2Zvcl9zaWcoCisJCSZzLT5hdXRoX3RvaywgbW91bnRfY3J5cHRfc3RhdCwKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWcpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGZpbmQgYXV0aCB0b2sgZm9yICIKKwkJICAgICAgICJmbmVrIHNpZyBbJXNdOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWcsIHJjKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCS8qIFRPRE86IFN1cHBvcnQgb3RoZXIga2V5IG1vZHVsZXMgdGhhbiBwYXNzcGhyYXNlIGZvcgorCSAqIGZpbGVuYW1lIGVuY3J5cHRpb24gKi8KKwlCVUdfT04ocy0+YXV0aF90b2stPnRva2VuX3R5cGUgIT0gRUNSWVBURlNfUEFTU1dPUkQpOworCXNnX2luaXRfb25lKAorCQkmcy0+aGFzaF9zZywKKwkJKHU4ICopcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQlzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXlfYnl0ZXMpOworCXMtPmhhc2hfZGVzYy5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlzLT5oYXNoX2Rlc2MudGZtID0gY3J5cHRvX2FsbG9jX2hhc2goRUNSWVBURlNfVEFHXzcwX0RJR0VTVCwgMCwKKwkJCQkJICAgICBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHMtPmhhc2hfZGVzYy50Zm0pKSB7CisJCQlyYyA9IFBUUl9FUlIocy0+aGFzaF9kZXNjLnRmbSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvICIKKwkJCSAgICAgICAiYWxsb2NhdGUgaGFzaCBjcnlwdG8gY29udGV4dDsgcmMgPSBbJWRdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJcmMgPSBjcnlwdG9faGFzaF9pbml0KCZzLT5oYXNoX2Rlc2MpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIGNyeXB0byBoYXNoOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlyYyA9IGNyeXB0b19oYXNoX3VwZGF0ZSgKKwkJJnMtPmhhc2hfZGVzYywgJnMtPmhhc2hfc2csCisJCXMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleV9ieXRlcyk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBFcnJvciB1cGRhdGluZyBjcnlwdG8gaGFzaDsgcmMgPSBbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwl9CisJcmMgPSBjcnlwdG9faGFzaF9maW5hbCgmcy0+aGFzaF9kZXNjLCBzLT5oYXNoKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IEVycm9yIGZpbmFsaXppbmcgY3J5cHRvIGhhc2g7IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCWZvciAocy0+aiA9IDA7IHMtPmogPCAocy0+bnVtX3JhbmRfYnl0ZXMgLSAxKTsgcy0+aisrKSB7CisJCXMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+al0gPQorCQkJcy0+aGFzaFsocy0+aiAlIEVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSldOworCQlpZiAoKHMtPmogJSBFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkUpCisJCSAgICA9PSAoRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFIC0gMSkpIHsKKwkJCXNnX2luaXRfb25lKCZzLT5oYXNoX3NnLCAodTggKilzLT5oYXNoLAorCQkJCSAgICBFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkUpOworCQkJcmMgPSBjcnlwdG9faGFzaF9pbml0KCZzLT5oYXNoX2Rlc2MpOworCQkJaWYgKHJjKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIGNyeXB0byBoYXNoOyAiCisJCQkJICAgICAgICJyYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCQkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwkJCX0KKwkJCXJjID0gY3J5cHRvX2hhc2hfdXBkYXRlKCZzLT5oYXNoX2Rlc2MsICZzLT5oYXNoX3NnLAorCQkJCQkJRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiJXM6IEVycm9yIHVwZGF0aW5nIGNyeXB0byBoYXNoOyAiCisJCQkJICAgICAgICJyYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCQkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwkJCX0KKwkJCXJjID0gY3J5cHRvX2hhc2hfZmluYWwoJnMtPmhhc2hfZGVzYywgcy0+dG1wX2hhc2gpOworCQkJaWYgKHJjKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogRXJyb3IgZmluYWxpemluZyBjcnlwdG8gaGFzaDsgIgorCQkJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJCQl9CisJCQltZW1jcHkocy0+aGFzaCwgcy0+dG1wX2hhc2gsCisJCQkgICAgICAgRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFKTsKKwkJfQorCQlpZiAocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZVtzLT5qXSA9PSAnXDAnKQorCQkJcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZVtzLT5qXSA9IEVDUllQVEZTX05PTl9OVUxMOworCX0KKwltZW1jcHkoJnMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+bnVtX3JhbmRfYnl0ZXNdLCBmaWxlbmFtZSwKKwkgICAgICAgZmlsZW5hbWVfc2l6ZSk7CisJcmMgPSB2aXJ0X3RvX3NjYXR0ZXJsaXN0KHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWUsCisJCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwgJnMtPnNyY19zZywgMSk7CisJaWYgKHJjICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImNvbnZlcnQgZmlsZW5hbWUgbWVtb3J5IHRvIHNjYXR0ZXJsaXN0OyAiCisJCSAgICAgICAiZXhwZWN0ZWQgcmMgPSAxOyBnb3QgcmMgPSBbJWRdLiAiCisJCSAgICAgICAiYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gWyV6ZF1cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCXJjID0gdmlydF90b19zY2F0dGVybGlzdCgmZGVzdFtzLT5pXSwgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLAorCQkJCSAmcy0+ZHN0X3NnLCAxKTsKKwlpZiAocmMgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBlcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byAiCisJCSAgICAgICAiY29udmVydCBlbmNyeXB0ZWQgZmlsZW5hbWUgbWVtb3J5IHRvIHNjYXR0ZXJsaXN0OyAiCisJCSAgICAgICAiZXhwZWN0ZWQgcmMgPSAxOyBnb3QgcmMgPSBbJWRdLiAiCisJCSAgICAgICAiYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gWyV6ZF1cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCS8qIFRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmaXJzdCBibG9jayBlZmZlY3RpdmVseSBkbyB0aGUgam9iCisJICogb2YgdGhlIElWIGhlcmUsIHNvIHdlIGp1c3QgdXNlIDAncyBmb3IgdGhlIElWLiBOb3RlIHRoZQorCSAqIGNvbnN0cmFpbnQgdGhhdCBFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMKKwkgKiA+PSBFQ1JZUFRGU19NQVhfSVZfQllURVMuICovCisJbWVtc2V0KHMtPml2LCAwLCBFQ1JZUFRGU19NQVhfSVZfQllURVMpOworCXMtPmRlc2MuaW5mbyA9IHMtPml2OworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoCisJCXMtPmRlc2MudGZtLAorCQlzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXksCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igc2V0dGluZyBrZXkgZm9yIGNyeXB0byBjb250ZXh0OyAiCisJCSAgICAgICAicmMgPSBbJWRdLiBzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfIgorCQkgICAgICAgImVuY3J5cHRpb25fa2V5ID0gWzB4JXBdOyBtb3VudF9jcnlwdF9zdGF0LT4iCisJCSAgICAgICAiZ2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyA9IFslemRdXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHJjLAorCQkgICAgICAgcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0X2l2KCZzLT5kZXNjLCAmcy0+ZHN0X3NnLCAmcy0+c3JjX3NnLAorCQkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNyeXB0IGZpbGVuYW1lOyAiCisJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlzLT5pICs9IHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZTsKKwkoKnBhY2tldF9zaXplKSA9IHMtPmk7CisJKCpyZW1haW5pbmdfYnl0ZXMpIC09ICgqcGFja2V0X3NpemUpOworb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s6CisJY3J5cHRvX2ZyZWVfaGFzaChzLT5oYXNoX2Rlc2MudGZtKTsKK291dF9mcmVlX3VubG9jazoKKwltZW1zZXQocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZSwgMCwgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwlrZnJlZShzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lKTsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKHMtPnRmbV9tdXRleCk7CitvdXQ6CisJa2ZyZWUocyk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgZWNyeXB0ZnNfcGFyc2VfdGFnXzcwX3BhY2tldF9zaWxseV9zdGFjayB7CisJdTggY2lwaGVyX2NvZGU7CisJc2l6ZV90IG1heF9wYWNrZXRfc2l6ZTsKKwlzaXplX3QgcGFja2V0X3NpemVfbGVuOworCXNpemVfdCBwYXJzZWRfdGFnXzcwX3BhY2tldF9zaXplOworCXNpemVfdCBibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemU7CisJc2l6ZV90IGJsb2NrX3NpemU7CisJc2l6ZV90IGk7CisJc3RydWN0IG11dGV4ICp0Zm1fbXV0ZXg7CisJY2hhciAqZGVjcnlwdGVkX2ZpbGVuYW1lOworCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2s7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyY19zZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgZHN0X3NnOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCWNoYXIgZm5la19zaWdfaGV4W0VDUllQVEZTX1NJR19TSVpFX0hFWCArIDFdOworCWNoYXIgaXZbRUNSWVBURlNfTUFYX0lWX0JZVEVTXTsKKwljaGFyIGNpcGhlcl9zdHJpbmdbRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkVdOworfTsKKworLyoqCisgKiBwYXJzZV90YWdfNzBfcGFja2V0IC0gUGFyc2UgYW5kIHByb2Nlc3MgRk5FSy1lbmNyeXB0ZWQgcGFzc3BocmFzZSBwYWNrZXQKKyAqIEBmaWxlbmFtZTogVGhpcyBmdW5jdGlvbiBrbWFsbG9jJ3MgdGhlIG1lbW9yeSBmb3IgdGhlIGZpbGVuYW1lCisgKiBAZmlsZW5hbWVfc2l6ZTogVGhpcyBmdW5jdGlvbiBzZXRzIHRoaXMgdG8gdGhlIGFtb3VudCBvZiBtZW1vcnkKKyAqICAgICAgICAgICAgICAgICBrbWFsbG9jJ2QgZm9yIHRoZSBmaWxlbmFtZQorICogQHBhY2tldF9zaXplOiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhpcyB0byB0aGUgdGhlIG51bWJlciBvZiBvY3RldHMKKyAqICAgICAgICAgICAgICAgaW4gdGhlIHBhY2tldCBwYXJzZWQKKyAqIEBtb3VudF9jcnlwdF9zdGF0OiBUaGUgbW91bnQtd2lkZSBjcnlwdG9ncmFwaGljIGNvbnRleHQKKyAqIEBkYXRhOiBUaGUgbWVtb3J5IGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIHN0YXJ0IG9mIHRoZSB0YWcgNzAKKyAqICAgICAgICBwYWNrZXQKKyAqIEBtYXhfcGFja2V0X3NpemU6IFRoZSBtYXhpbXVtIGxlZ2FsIHNpemUgb2YgdGhlIHBhY2tldCB0byBiZSBwYXJzZWQKKyAqICAgICAgICAgICAgICAgICAgIGZyb20gQGRhdGEKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzczsgbm9uLXplcm8gb3RoZXJ3aXNlCisgKi8KK2ludAorZWNyeXB0ZnNfcGFyc2VfdGFnXzcwX3BhY2tldChjaGFyICoqZmlsZW5hbWUsIHNpemVfdCAqZmlsZW5hbWVfc2l6ZSwKKwkJCSAgICAgc2l6ZV90ICpwYWNrZXRfc2l6ZSwKKwkJCSAgICAgc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJCQkgICAgIGNoYXIgKmRhdGEsIHNpemVfdCBtYXhfcGFja2V0X3NpemUpCit7CisJc3RydWN0IGVjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXRfc2lsbHlfc3RhY2sgKnM7CisJaW50IHJjID0gMDsKKworCSgqcGFja2V0X3NpemUpID0gMDsKKwkoKmZpbGVuYW1lX3NpemUpID0gMDsKKwkoKmZpbGVuYW1lKSA9IE5VTEw7CisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IHRyeWluZyB0byBrbWFsbG9jICIKKwkJICAgICAgICJbJXpkXSBieXRlcyBvZiBrZXJuZWwgbWVtb3J5XG4iLCBfX2Z1bmNfXywgc2l6ZW9mKCpzKSk7CisJCWdvdG8gb3V0OworCX0KKwlzLT5kZXNjLmZsYWdzID0gQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQOworCWlmIChtYXhfcGFja2V0X3NpemUgPCAoMSArIDEgKyBFQ1JZUFRGU19TSUdfU0laRSArIDEgKyAxKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbWF4X3BhY2tldF9zaXplIGlzIFslemRdOyBpdCBtdXN0IGJlICIKKwkJICAgICAgICJhdCBsZWFzdCBbJWRdXG4iLCBfX2Z1bmNfXywgbWF4X3BhY2tldF9zaXplLAorCQkJKDEgKyAxICsgRUNSWVBURlNfU0lHX1NJWkUgKyAxICsgMSkpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkvKiBPY3RldCAwOiBUYWcgNzAgaWRlbnRpZmllcgorCSAqIE9jdGV0cyAxLU4xOiBUYWcgNzAgcGFja2V0IHNpemUgKGluY2x1ZGVzIGNpcGhlciBpZGVudGlmaWVyCisJICogICAgICAgICAgICAgIGFuZCBibG9jay1hbGlnbmVkIGVuY3J5cHRlZCBmaWxlbmFtZSBzaXplKQorCSAqIE9jdGV0cyBOMS1OMjogRk5FSyBzaWcgKEVDUllQVEZTX1NJR19TSVpFKQorCSAqIE9jdGV0IE4yLU4zOiBDaXBoZXIgaWRlbnRpZmllciAoMSBvY3RldCkKKwkgKiBPY3RldHMgTjMtTjQ6IEJsb2NrLWFsaWduZWQgZW5jcnlwdGVkIGZpbGVuYW1lCisJICogIC0gQ29uc2lzdHMgb2YgYSBtaW5pbXVtIG51bWJlciBvZiByYW5kb20gbnVtYmVycywgYSBcMAorCSAqICAgIHNlcGFyYXRvciwgYW5kIHRoZW4gdGhlIGZpbGVuYW1lICovCisJaWYgKGRhdGFbKCpwYWNrZXRfc2l6ZSkrK10gIT0gRUNSWVBURlNfVEFHXzcwX1BBQ0tFVF9UWVBFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIHBhY2tldCB0YWcgWzB4JS4yeF07IG11c3QgYmUgIgorCQkgICAgICAgInRhZyBbMHglLjJ4XVxuIiwgX19mdW5jX18sCisJCSAgICAgICBkYXRhWygoKnBhY2tldF9zaXplKSAtIDEpXSwgRUNSWVBURlNfVEFHXzcwX1BBQ0tFVF9UWVBFKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJcmMgPSBlY3J5cHRmc19wYXJzZV9wYWNrZXRfbGVuZ3RoKCZkYXRhWygqcGFja2V0X3NpemUpXSwKKwkJCQkJICAmcy0+cGFyc2VkX3RhZ183MF9wYWNrZXRfc2l6ZSwKKwkJCQkJICAmcy0+cGFja2V0X3NpemVfbGVuKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIHBhcnNpbmcgcGFja2V0IGxlbmd0aDsgIgorCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXQ7CisJfQorCXMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IChzLT5wYXJzZWRfdGFnXzcwX3BhY2tldF9zaXplCisJCQkJCSAgLSBFQ1JZUFRGU19TSUdfU0laRSAtIDEpOworCWlmICgoMSArIHMtPnBhY2tldF9zaXplX2xlbiArIHMtPnBhcnNlZF90YWdfNzBfcGFja2V0X3NpemUpCisJICAgID4gbWF4X3BhY2tldF9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtYXhfcGFja2V0X3NpemUgaXMgWyV6ZF07IHJlYWwgcGFja2V0ICIKKwkJICAgICAgICJzaXplIGlzIFslemRdXG4iLCBfX2Z1bmNfXywgbWF4X3BhY2tldF9zaXplLAorCQkgICAgICAgKDEgKyBzLT5wYWNrZXRfc2l6ZV9sZW4gKyAxCisJCQkrIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSkpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkoKnBhY2tldF9zaXplKSArPSBzLT5wYWNrZXRfc2l6ZV9sZW47CisJZWNyeXB0ZnNfdG9faGV4KHMtPmZuZWtfc2lnX2hleCwgJmRhdGFbKCpwYWNrZXRfc2l6ZSldLAorCQkJRUNSWVBURlNfU0lHX1NJWkUpOworCXMtPmZuZWtfc2lnX2hleFtFQ1JZUFRGU19TSUdfU0laRV9IRVhdID0gJ1wwJzsKKwkoKnBhY2tldF9zaXplKSArPSBFQ1JZUFRGU19TSUdfU0laRTsKKwlzLT5jaXBoZXJfY29kZSA9IGRhdGFbKCpwYWNrZXRfc2l6ZSkrK107CisJcmMgPSBlY3J5cHRmc19jaXBoZXJfY29kZV90b19zdHJpbmcocy0+Y2lwaGVyX3N0cmluZywgcy0+Y2lwaGVyX2NvZGUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2lwaGVyIGNvZGUgWyVkXSBpcyBpbnZhbGlkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHMtPmNpcGhlcl9jb2RlKTsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gZWNyeXB0ZnNfZ2V0X3RmbV9hbmRfbXV0ZXhfZm9yX2NpcGhlcl9uYW1lKCZzLT5kZXNjLnRmbSwKKwkJCQkJCQkmcy0+dGZtX211dGV4LAorCQkJCQkJCXMtPmNpcGhlcl9zdHJpbmcpOworCWlmICh1bmxpa2VseShyYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnRlcm5hbCBlcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byBnZXQgIgorCQkgICAgICAgInRmbSBhbmQgbXV0ZXggZm9yIGNpcGhlciBuYW1lIFslc107IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIHMtPmNpcGhlcl9zdHJpbmcsIHJjKTsKKwkJZ290byBvdXQ7CisJfQorCW11dGV4X2xvY2socy0+dGZtX211dGV4KTsKKwlyYyA9IHZpcnRfdG9fc2NhdHRlcmxpc3QoJmRhdGFbKCpwYWNrZXRfc2l6ZSldLAorCQkJCSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsICZzLT5zcmNfc2csIDEpOworCWlmIChyYyAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGVycm9yIHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJjb252ZXJ0IGVuY3J5cHRlZCBmaWxlbmFtZSBtZW1vcnkgdG8gc2NhdHRlcmxpc3Q7ICIKKwkJICAgICAgICJleHBlY3RlZCByYyA9IDE7IGdvdCByYyA9IFslZF0uICIKKwkJICAgICAgICJibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSBbJXpkXVxuIiwgX19mdW5jX18sIHJjLAorCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwkoKnBhY2tldF9zaXplKSArPSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemU7CisJcy0+ZGVjcnlwdGVkX2ZpbGVuYW1lID0ga21hbGxvYyhzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghcy0+ZGVjcnlwdGVkX2ZpbGVuYW1lKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImttYWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJjID0gdmlydF90b19zY2F0dGVybGlzdChzLT5kZWNyeXB0ZWRfZmlsZW5hbWUsCisJCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwgJnMtPmRzdF9zZywgMSk7CisJaWYgKHJjICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImNvbnZlcnQgZGVjcnlwdGVkIGZpbGVuYW1lIG1lbW9yeSB0byBzY2F0dGVybGlzdDsgIgorCQkgICAgICAgImV4cGVjdGVkIHJjID0gMTsgZ290IHJjID0gWyVkXS4gIgorCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCisJCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOworCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJLyogVGhlIGNoYXJhY3RlcnMgaW4gdGhlIGZpcnN0IGJsb2NrIGVmZmVjdGl2ZWx5IGRvIHRoZSBqb2Igb2YKKwkgKiB0aGUgSVYgaGVyZSwgc28gd2UganVzdCB1c2UgMCdzIGZvciB0aGUgSVYuIE5vdGUgdGhlCisJICogY29uc3RyYWludCB0aGF0IEVDUllQVEZTX0ZJTEVOQU1FX01JTl9SQU5ET01fUFJFUEVORF9CWVRFUworCSAqID49IEVDUllQVEZTX01BWF9JVl9CWVRFUy4gKi8KKwltZW1zZXQocy0+aXYsIDAsIEVDUllQVEZTX01BWF9JVl9CWVRFUyk7CisJcy0+ZGVzYy5pbmZvID0gcy0+aXY7CisJcmMgPSBlY3J5cHRmc19maW5kX2F1dGhfdG9rX2Zvcl9zaWcoJnMtPmF1dGhfdG9rLCBtb3VudF9jcnlwdF9zdGF0LAorCQkJCQkgICAgcy0+Zm5la19zaWdfaGV4KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBmaW5kIGF1dGggdG9rIGZvciAiCisJCSAgICAgICAiZm5layBzaWcgWyVzXTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcy0+Zm5la19zaWdfaGV4LAorCQkgICAgICAgcmMpOworCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJLyogVE9ETzogU3VwcG9ydCBvdGhlciBrZXkgbW9kdWxlcyB0aGFuIHBhc3NwaHJhc2UgZm9yCisJICogZmlsZW5hbWUgZW5jcnlwdGlvbiAqLworCUJVR19PTihzLT5hdXRoX3Rvay0+dG9rZW5fdHlwZSAhPSBFQ1JZUFRGU19QQVNTV09SRCk7CisJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleSgKKwkJcy0+ZGVzYy50Zm0sCisJCXMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBzZXR0aW5nIGtleSBmb3IgY3J5cHRvIGNvbnRleHQ7ICIKKwkJICAgICAgICJyYyA9IFslZF0uIHMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV8iCisJCSAgICAgICAiZW5jcnlwdGlvbl9rZXkgPSBbMHglcF07IG1vdW50X2NyeXB0X3N0YXQtPiIKKwkJICAgICAgICJnbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzID0gWyV6ZF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgcmMsCisJCSAgICAgICBzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXksCisJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0X2l2KCZzLT5kZXNjLCAmcy0+ZHN0X3NnLCAmcy0+c3JjX3NnLAorCQkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBkZWNyeXB0IGZpbGVuYW1lOyAiCisJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJcy0+aSA9IDA7CisJd2hpbGUgKHMtPmRlY3J5cHRlZF9maWxlbmFtZVtzLT5pXSAhPSAnXDAnCisJICAgICAgICYmIHMtPmkgPCBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpCisJCXMtPmkrKzsKKwlpZiAocy0+aSA9PSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgdGFnIDcwIHBhY2tldDsgY291bGQgbm90ICIKKwkJICAgICAgICJmaW5kIHZhbGlkIHNlcGFyYXRvciBiZXR3ZWVuIHJhbmRvbSBjaGFyYWN0ZXJzIGFuZCAiCisJCSAgICAgICAidGhlIGZpbGVuYW1lXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXMtPmkrKzsKKwkoKmZpbGVuYW1lX3NpemUpID0gKHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSAtIHMtPmkpOworCWlmICghKCgqZmlsZW5hbWVfc2l6ZSkgPiAwICYmICgqZmlsZW5hbWVfc2l6ZSA8IFBBVEhfTUFYKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZpbGVuYW1lIHNpemUgaXMgWyV6ZF0sIHdoaWNoIGlzICIKKwkJICAgICAgICJpbnZhbGlkXG4iLCBfX2Z1bmNfXywgKCpmaWxlbmFtZV9zaXplKSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCSgqZmlsZW5hbWUpID0ga21hbGxvYygoKCpmaWxlbmFtZV9zaXplKSArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISgqZmlsZW5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImttYWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgKCgqZmlsZW5hbWVfc2l6ZSkgKyAxKSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCW1lbWNweSgoKmZpbGVuYW1lKSwgJnMtPmRlY3J5cHRlZF9maWxlbmFtZVtzLT5pXSwgKCpmaWxlbmFtZV9zaXplKSk7CisJKCpmaWxlbmFtZSlbKCpmaWxlbmFtZV9zaXplKV0gPSAnXDAnOworb3V0X2ZyZWVfdW5sb2NrOgorCWtmcmVlKHMtPmRlY3J5cHRlZF9maWxlbmFtZSk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jayhzLT50Zm1fbXV0ZXgpOworb3V0OgorCWlmIChyYykgeworCQkoKnBhY2tldF9zaXplKSA9IDA7CisJCSgqZmlsZW5hbWVfc2l6ZSkgPSAwOworCQkoKmZpbGVuYW1lKSA9IE5VTEw7CisJfQorCWtmcmVlKHMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAogZWNyeXB0ZnNfZ2V0X2F1dGhfdG9rX3NpZyhjaGFyICoqc2lnLCBzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rKQogewogCWludCByYyA9IDA7CkBAIC04OTcsMzAgKzE0NzEsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludAotZWNyeXB0ZnNfZmluZF9nbG9iYWxfYXV0aF90b2tfZm9yX3NpZygKLQlzdHJ1Y3QgZWNyeXB0ZnNfZ2xvYmFsX2F1dGhfdG9rICoqZ2xvYmFsX2F1dGhfdG9rLAotCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LCBjaGFyICpzaWcpCi17Ci0Jc3RydWN0IGVjcnlwdGZzX2dsb2JhbF9hdXRoX3RvayAqd2Fsa2VyOwotCWludCByYyA9IDA7Ci0KLQkoKmdsb2JhbF9hdXRoX3RvaykgPSBOVUxMOwotCW11dGV4X2xvY2soJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdhbGtlciwKLQkJCSAgICAmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3QsCi0JCQkgICAgbW91bnRfY3J5cHRfc3RhdF9saXN0KSB7Ci0JCWlmIChtZW1jbXAod2Fsa2VyLT5zaWcsIHNpZywgRUNSWVBURlNfU0lHX1NJWkVfSEVYKSA9PSAwKSB7Ci0JCQkoKmdsb2JhbF9hdXRoX3RvaykgPSB3YWxrZXI7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlyYyA9IC1FSU5WQUw7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCiAvKioKICAqIGVjcnlwdGZzX3ZlcmlmeV92ZXJzaW9uCiAgKiBAdmVyc2lvbjogVGhlIHZlcnNpb24gbnVtYmVyIHRvIGNvbmZpcm0KQEAgLTk5MCw0MyArMTU0MCw2IEBACiB9CiAKIC8qKgotICogZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnCi0gKiBAYXV0aF90b2s6IFNldCB0byB0aGUgbWF0Y2hpbmcgYXV0aF90b2s7IE5VTEwgaWYgbm90IGZvdW5kCi0gKiBAY3J5cHRfc3RhdDogaW5vZGUgY3J5cHRfc3RhdCBjcnlwdG8gY29udGV4dAotICogQHNpZzogU2lnIG9mIGF1dGhfdG9rIHRvIGZpbmQKLSAqCi0gKiBGb3Igbm93LCB0aGlzIGZ1bmN0aW9uIHNpbXBseSBsb29rcyBhdCB0aGUgcmVnaXN0ZXJlZCBhdXRoX3RvaydzCi0gKiBsaW5rZWQgb2ZmIHRoZSBtb3VudF9jcnlwdF9zdGF0LCBzbyBhbGwgdGhlIGF1dGhfdG9rcyB0aGF0IGNhbiBiZQotICogdXNlZCBtdXN0IGJlIHJlZ2lzdGVyZWQgYXQgbW91bnQgdGltZS4gVGhpcyBmdW5jdGlvbiBjb3VsZAotICogcG90ZW50aWFsbHkgdHJ5IGEgbG90IGhhcmRlciB0byBmaW5kIGF1dGhfdG9rJ3MgKGUuZy4sIGJ5IGNhbGxpbmcKLSAqIG91dCB0byBlY3J5cHRmc2QgdG8gZHluYW1pY2FsbHkgcmV0cmlldmUgYW4gYXV0aF90b2sgb2JqZWN0KSBzbwotICogdGhhdCBzdGF0aWMgcmVnaXN0cmF0aW9uIG9mIGF1dGhfdG9rJ3Mgd2lsbCBubyBsb25nZXIgYmUgbmVjZXNzYXJ5LgotICoKLSAqIFJldHVybnMgemVybyBvbiBubyBlcnJvcjsgbm9uLXplcm8gb24gZXJyb3IKLSAqLwotc3RhdGljIGludAotZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKAotCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqKmF1dGhfdG9rLAotCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LCBjaGFyICpzaWcpCi17Ci0Jc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPQotCQljcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0OwotCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKmdsb2JhbF9hdXRoX3RvazsKLQlpbnQgcmMgPSAwOwotCi0JKCphdXRoX3RvaykgPSBOVUxMOwotCWlmIChlY3J5cHRmc19maW5kX2dsb2JhbF9hdXRoX3Rva19mb3Jfc2lnKCZnbG9iYWxfYXV0aF90b2ssCi0JCQkJCQkgIG1vdW50X2NyeXB0X3N0YXQsIHNpZykpIHsKLQkJc3RydWN0IGtleSAqYXV0aF90b2tfa2V5OwotCi0JCXJjID0gZWNyeXB0ZnNfa2V5cmluZ19hdXRoX3Rva19mb3Jfc2lnKCZhdXRoX3Rva19rZXksIGF1dGhfdG9rLAotCQkJCQkJICAgICAgIHNpZyk7Ci0JfSBlbHNlCi0JCSgqYXV0aF90b2spID0gZ2xvYmFsX2F1dGhfdG9rLT5nbG9iYWxfYXV0aF90b2s7Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKICAqIGRlY3J5cHRfcGFzc3BocmFzZV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkgLSBEZWNyeXB0IHRoZSBzZXNzaW9uIGtleSB3aXRoIHRoZSBnaXZlbiBhdXRoX3Rvay4KICAqIEBhdXRoX3RvazogVGhlIHBhc3NwaHJhc2UgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gdXNlIHRvIGVuY3J5cHQgdGhlIEZFSwogICogQGNyeXB0X3N0YXQ6IFRoZSBjcnlwdG9ncmFwaGljIGNvbnRleHQKQEAgLTEyNTYsNyArMTc2OSw4IEBACiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF93aXBlX2xpc3Q7CiAJCX0KLQkJZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKCZtYXRjaGluZ19hdXRoX3RvaywgY3J5cHRfc3RhdCwKKwkJZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKCZtYXRjaGluZ19hdXRoX3RvaywKKwkJCQkJICAgICAgIGNyeXB0X3N0YXQtPm1vdW50X2NyeXB0X3N0YXQsCiAJCQkJCSAgICAgICBjYW5kaWRhdGVfYXV0aF90b2tfc2lnKTsKIAkJaWYgKG1hdGNoaW5nX2F1dGhfdG9rKSB7CiAJCQlmb3VuZF9hdXRoX3RvayA9IDE7CkBAIC0xMzM2LDcgKzE4NTAsOSBAQAogCWludCByYzsKIAogCXJjID0gd3JpdGVfdGFnXzY2X3BhY2tldChhdXRoX3Rvay0+dG9rZW4ucHJpdmF0ZV9rZXkuc2lnbmF0dXJlLAotCQkJCSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNyeXB0X3N0YXQpLAorCQkJCSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKAorCQkJCQkgY3J5cHRfc3RhdC0+Y2lwaGVyLAorCQkJCQkgY3J5cHRfc3RhdC0+a2V5X3NpemUpLAogCQkJCSBjcnlwdF9zdGF0LCAmcGF5bG9hZCwgJnBheWxvYWRfbGVuKTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgZ2VuZXJhdGluZyB0YWcgNjYgcGFja2V0XG4iKTsKQEAgLTE2OTYsNyArMjIxMiw4IEBACiAJZGVzdFsoKnBhY2tldF9zaXplKSsrXSA9IDB4MDQ7IC8qIHZlcnNpb24gNCAqLwogCS8qIFRPRE86IEJyZWFrIGZyb20gUkZDMjQ0MCBzbyB0aGF0IGFyYml0cmFyeSBjaXBoZXJzIGNhbiBiZQogCSAqIHNwZWNpZmllZCB3aXRoIHN0cmluZ3MgKi8KLQljaXBoZXJfY29kZSA9IGVjcnlwdGZzX2NvZGVfZm9yX2NpcGhlcl9zdHJpbmcoY3J5cHRfc3RhdCk7CisJY2lwaGVyX2NvZGUgPSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNyeXB0X3N0YXQtPmNpcGhlciwKKwkJCQkJCSAgICAgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKIAlpZiAoY2lwaGVyX2NvZGUgPT0gMCkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiVW5hYmxlIHRvIGdlbmVyYXRlIGNvZGUgZm9yICIKIAkJCQkiY2lwaGVyIFslc11cbiIsIGNyeXB0X3N0YXQtPmNpcGhlcik7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tYWluLmMgYi9mcy9lY3J5cHRmcy9tYWluLmMKaW5kZXggZmQ2MzA3MS4uNzg5Y2YyZSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvbWFpbi5jCisrKyBiL2ZzL2VjcnlwdGZzL21haW4uYwpAQCAtMjA2LDcgKzIwNiw5IEBACiAgICAgICAgZWNyeXB0ZnNfb3B0X2NpcGhlciwgZWNyeXB0ZnNfb3B0X2VjcnlwdGZzX2NpcGhlciwKICAgICAgICBlY3J5cHRmc19vcHRfZWNyeXB0ZnNfa2V5X2J5dGVzLAogICAgICAgIGVjcnlwdGZzX29wdF9wYXNzdGhyb3VnaCwgZWNyeXB0ZnNfb3B0X3hhdHRyX21ldGFkYXRhLAotICAgICAgIGVjcnlwdGZzX29wdF9lbmNyeXB0ZWRfdmlldywgZWNyeXB0ZnNfb3B0X2VyciB9OworICAgICAgIGVjcnlwdGZzX29wdF9lbmNyeXB0ZWRfdmlldywgZWNyeXB0ZnNfb3B0X2ZuZWtfc2lnLAorICAgICAgIGVjcnlwdGZzX29wdF9mbl9jaXBoZXIsIGVjcnlwdGZzX29wdF9mbl9jaXBoZXJfa2V5X2J5dGVzLAorICAgICAgIGVjcnlwdGZzX29wdF9lcnIgfTsKIAogc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtlY3J5cHRmc19vcHRfc2lnLCAic2lnPSVzIn0sCkBAIC0yMTcsNiArMjE5LDkgQEAKIAl7ZWNyeXB0ZnNfb3B0X3Bhc3N0aHJvdWdoLCAiZWNyeXB0ZnNfcGFzc3Rocm91Z2gifSwKIAl7ZWNyeXB0ZnNfb3B0X3hhdHRyX21ldGFkYXRhLCAiZWNyeXB0ZnNfeGF0dHJfbWV0YWRhdGEifSwKIAl7ZWNyeXB0ZnNfb3B0X2VuY3J5cHRlZF92aWV3LCAiZWNyeXB0ZnNfZW5jcnlwdGVkX3ZpZXcifSwKKwl7ZWNyeXB0ZnNfb3B0X2ZuZWtfc2lnLCAiZWNyeXB0ZnNfZm5la19zaWc9JXMifSwKKwl7ZWNyeXB0ZnNfb3B0X2ZuX2NpcGhlciwgImVjcnlwdGZzX2ZuX2NpcGhlcj0lcyJ9LAorCXtlY3J5cHRmc19vcHRfZm5fY2lwaGVyX2tleV9ieXRlcywgImVjcnlwdGZzX2ZuX2tleV9ieXRlcz0ldSJ9LAogCXtlY3J5cHRmc19vcHRfZXJyLCBOVUxMfQogfTsKIApAQCAtMjgxLDggKzI4NiwxMSBAQAogCWludCByYyA9IDA7CiAJaW50IHNpZ19zZXQgPSAwOwogCWludCBjaXBoZXJfbmFtZV9zZXQgPSAwOworCWludCBmbl9jaXBoZXJfbmFtZV9zZXQgPSAwOwogCWludCBjaXBoZXJfa2V5X2J5dGVzOwogCWludCBjaXBoZXJfa2V5X2J5dGVzX3NldCA9IDA7CisJaW50IGZuX2NpcGhlcl9rZXlfYnl0ZXM7CisJaW50IGZuX2NpcGhlcl9rZXlfYnl0ZXNfc2V0ID0gMDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCA9CiAJCSZlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoc2IpLT5tb3VudF9jcnlwdF9zdGF0OwogCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKQEAgLTI5MCw3ICsyOTgsMTIgQEAKIAljaGFyICpzaWdfc3JjOwogCWNoYXIgKmNpcGhlcl9uYW1lX2RzdDsKIAljaGFyICpjaXBoZXJfbmFtZV9zcmM7CisJY2hhciAqZm5fY2lwaGVyX25hbWVfZHN0OworCWNoYXIgKmZuX2NpcGhlcl9uYW1lX3NyYzsKKwljaGFyICpmbmVrX2RzdDsKKwljaGFyICpmbmVrX3NyYzsKIAljaGFyICpjaXBoZXJfa2V5X2J5dGVzX3NyYzsKKwljaGFyICpmbl9jaXBoZXJfa2V5X2J5dGVzX3NyYzsKIAogCWlmICghb3B0aW9ucykgewogCQlyYyA9IC1FSU5WQUw7CkBAIC0zMjIsMTAgKzMzNSw3IEBACiAJCQkJZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWU7CiAJCQlzdHJuY3B5KGNpcGhlcl9uYW1lX2RzdCwgY2lwaGVyX25hbWVfc3JjLAogCQkJCUVDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFKTsKLQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLAotCQkJCQkiVGhlIG1vdW50X2NyeXB0X3N0YXQgIgotCQkJCQkiZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUgc2V0IHRvOiAiCi0JCQkJCSJbJXNdXG4iLCBjaXBoZXJfbmFtZV9kc3QpOworCQkJY2lwaGVyX25hbWVfZHN0W0VDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFXSA9ICdcMCc7CiAJCQljaXBoZXJfbmFtZV9zZXQgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgZWNyeXB0ZnNfb3B0X2VjcnlwdGZzX2tleV9ieXRlczoKQEAgLTMzNSwxMSArMzQ1LDYgQEAKIAkJCQkJCSAgICZjaXBoZXJfa2V5X2J5dGVzX3NyYywgMCk7CiAJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUgPQogCQkJCWNpcGhlcl9rZXlfYnl0ZXM7Ci0JCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywKLQkJCQkJIlRoZSBtb3VudF9jcnlwdF9zdGF0ICIKLQkJCQkJImdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSAiCi0JCQkJCSJzZXQgdG86IFslZF1cbiIsIG1vdW50X2NyeXB0X3N0YXQtPgotCQkJCQlnbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUpOwogCQkJY2lwaGVyX2tleV9ieXRlc19zZXQgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgZWNyeXB0ZnNfb3B0X3Bhc3N0aHJvdWdoOgpAQCAtMzU2LDExICszNjEsNTEgQEAKIAkJCW1vdW50X2NyeXB0X3N0YXQtPmZsYWdzIHw9CiAJCQkJRUNSWVBURlNfRU5DUllQVEVEX1ZJRVdfRU5BQkxFRDsKIAkJCWJyZWFrOworCQljYXNlIGVjcnlwdGZzX29wdF9mbmVrX3NpZzoKKwkJCWZuZWtfc3JjID0gYXJnc1swXS5mcm9tOworCQkJZm5la19kc3QgPQorCQkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnOworCQkJc3RybmNweShmbmVrX2RzdCwgZm5la19zcmMsIEVDUllQVEZTX1NJR19TSVpFX0hFWCk7CisJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZ1sKKwkJCQlFQ1JZUFRGU19TSUdfU0laRV9IRVhdID0gJ1wwJzsKKwkJCXJjID0gZWNyeXB0ZnNfYWRkX2dsb2JhbF9hdXRoX3RvaygKKwkJCQltb3VudF9jcnlwdF9zdGF0LAorCQkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byByZWdpc3RlciAiCisJCQkJICAgICAgICJnbG9iYWwgZm5layBzaWcgWyVzXTsgcmMgPSBbJWRdXG4iLAorCQkJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZywKKwkJCQkgICAgICAgcmMpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJbW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgfD0KKwkJCQkoRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTCisJCQkJIHwgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKTsKKwkJCWJyZWFrOworCQljYXNlIGVjcnlwdGZzX29wdF9mbl9jaXBoZXI6CisJCQlmbl9jaXBoZXJfbmFtZV9zcmMgPSBhcmdzWzBdLmZyb207CisJCQlmbl9jaXBoZXJfbmFtZV9kc3QgPQorCQkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lOworCQkJc3RybmNweShmbl9jaXBoZXJfbmFtZV9kc3QsIGZuX2NpcGhlcl9uYW1lX3NyYywKKwkJCQlFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRSk7CisJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZVsKKwkJCQlFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRV0gPSAnXDAnOworCQkJZm5fY2lwaGVyX25hbWVfc2V0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIGVjcnlwdGZzX29wdF9mbl9jaXBoZXJfa2V5X2J5dGVzOgorCQkJZm5fY2lwaGVyX2tleV9ieXRlc19zcmMgPSBhcmdzWzBdLmZyb207CisJCQlmbl9jaXBoZXJfa2V5X2J5dGVzID0KKwkJCQkoaW50KXNpbXBsZV9zdHJ0b2woZm5fY2lwaGVyX2tleV9ieXRlc19zcmMsCisJCQkJCQkgICAmZm5fY2lwaGVyX2tleV9ieXRlc19zcmMsIDApOworCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyA9CisJCQkJZm5fY2lwaGVyX2tleV9ieXRlczsKKwkJCWZuX2NpcGhlcl9rZXlfYnl0ZXNfc2V0ID0gMTsKKwkJCWJyZWFrOwogCQljYXNlIGVjcnlwdGZzX29wdF9lcnI6CiAJCWRlZmF1bHQ6Ci0JCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLAotCQkJCQkiZUNyeXB0ZnM6IHVucmVjb2duaXplZCBvcHRpb24gJyVzJ1xuIiwKLQkJCQkJcCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBlQ3J5cHRmczogdW5yZWNvZ25pemVkIG9wdGlvbiBbJXNdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwKTsKIAkJfQogCX0KIAlpZiAoIXNpZ19zZXQpIHsKQEAgLTM3NCwzMyArNDE5LDYwIEBACiAJCWludCBjaXBoZXJfbmFtZV9sZW4gPSBzdHJsZW4oRUNSWVBURlNfREVGQVVMVF9DSVBIRVIpOwogCiAJCUJVR19PTihjaXBoZXJfbmFtZV9sZW4gPj0gRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkUpOwotCiAJCXN0cmNweShtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKIAkJICAgICAgIEVDUllQVEZTX0RFRkFVTFRfQ0lQSEVSKTsKIAl9Ci0JaWYgKCFjaXBoZXJfa2V5X2J5dGVzX3NldCkgeworCWlmICgobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMpCisJICAgICYmICFmbl9jaXBoZXJfbmFtZV9zZXQpCisJCXN0cmNweShtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZSwKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lKTsKKwlpZiAoIWNpcGhlcl9rZXlfYnl0ZXNfc2V0KQogCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUgPSAwOwotCX0KKwlpZiAoKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKQorCSAgICAmJiAhZm5fY2lwaGVyX2tleV9ieXRlc19zZXQpCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMgPQorCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplOwogCW11dGV4X2xvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CiAJaWYgKCFlY3J5cHRmc190Zm1fZXhpc3RzKG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lLAotCQkJCSBOVUxMKSkKKwkJCQkgTlVMTCkpIHsKIAkJcmMgPSBlY3J5cHRmc19hZGRfbmV3X2tleV90Zm0oCiAJCQlOVUxMLCBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKIAkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZrZXlfdGZtX2xpc3RfbXV0ZXgpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBjaXBoZXIgd2l0aCAiCi0JCSAgICAgICAibmFtZSA9IFslc10gYW5kIGtleSBzaXplID0gWyV0ZF07IHJjID0gWyVkXVxuIiwKLQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lLAotCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgIgorCQkJICAgICAgICJjaXBoZXIgd2l0aCBuYW1lID0gWyVzXSBhbmQga2V5IHNpemUgPSBbJXRkXTsgIgorCQkJICAgICAgICJyYyA9IFslZF1cbiIsCisJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUsCisJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplLAorCQkJICAgICAgIHJjKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQorCWlmICgobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMpCisJICAgICYmICFlY3J5cHRmc190Zm1fZXhpc3RzKAorCQkgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsIE5VTEwpKSB7CisJCXJjID0gZWNyeXB0ZnNfYWRkX25ld19rZXlfdGZtKAorCQkJTlVMTCwgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSAiCisJCQkgICAgICAgImNpcGhlciB3aXRoIG5hbWUgPSBbJXNdIGFuZCBrZXkgc2l6ZSA9IFsldGRdOyAiCisJCQkgICAgICAgInJjID0gWyVkXVxuIiwKKwkJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZSwKKwkJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzLAorCQkJICAgICAgIHJjKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKIAlyYyA9IGVjcnlwdGZzX2luaXRfZ2xvYmFsX2F1dGhfdG9rcyhtb3VudF9jcnlwdF9zdGF0KTsKLQlpZiAocmMpIHsKKwlpZiAocmMpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9uZSBvciBtb3JlIGdsb2JhbCBhdXRoIHRva3MgY291bGQgbm90ICIKIAkJICAgICAgICJwcm9wZXJseSByZWdpc3RlcjsgcmMgPSBbJWRdXG4iLCByYyk7Ci0JfQogb3V0OgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jIGIvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMKaW5kZXggNjkxM2Y3Mi4uOTZlZjUxNCAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMKKysrIGIvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCSgqZGFlbW9uKSA9IGt6YWxsb2Moc2l6ZW9mKCoqZGFlbW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEoKmRhZW1vbikpIHsKIAkJcmMgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgWyVaZF0gYnl0ZXMgb2YgIgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgWyV6ZF0gYnl0ZXMgb2YgIgogCQkgICAgICAgIkdGUF9LRVJORUwgbWVtb3J5XG4iLCBfX2Z1bmNfXywgc2l6ZW9mKCoqZGFlbW9uKSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQzNSw3ICs0MzUsNyBAQAogCW1zZ19jdHgtPm1zZyA9IGttYWxsb2MobXNnX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbXNnX2N0eC0+bXNnKSB7CiAJCXJjID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFslWmRdIGJ5dGVzIG9mICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFslemRdIGJ5dGVzIG9mICIKIAkJICAgICAgICJHRlBfS0VSTkVMIG1lbW9yeVxuIiwgX19mdW5jX18sIG1zZ19zaXplKTsKIAkJZ290byB1bmxvY2s7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWlzY2Rldi5jIGIvZnMvZWNyeXB0ZnMvbWlzY2Rldi5jCmluZGV4IGVmZDk1YTAuLmE2N2ZlYTYgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21pc2NkZXYuYworKysgYi9mcy9lY3J5cHRmcy9taXNjZGV2LmMKQEAgLTE5OSw3ICsxOTksNyBAQAogCQlpZiAoIW1zZ19jdHgtPm1zZykgewogCQkJcmMgPSAtRU5PTUVNOwogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCi0JCQkgICAgICAgInRvIGttYWxsb2MoJVpkLCBHRlBfS0VSTkVMKVxuIiwgX19mdW5jX18sCisJCQkgICAgICAgInRvIGttYWxsb2MoJXpkLCBHRlBfS0VSTkVMKVxuIiwgX19mdW5jX18sCiAJCQkgICAgICAgKHNpemVvZigqbXNnX2N0eC0+bXNnKSArIGRhdGFfc2l6ZSkpOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CkBAIC0zMjIsNyArMzIyLDcgQEAKIAlpZiAoY291bnQgPCB0b3RhbF9sZW5ndGgpIHsKIAkJcmMgPSAwOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT25seSBnaXZlbiB1c2VyIGJ1ZmZlciBvZiAiCi0JCSAgICAgICAic2l6ZSBbJVpkXSwgYnV0IHdlIG5lZWQgWyVaZF0gdG8gcmVhZCB0aGUgIgorCQkgICAgICAgInNpemUgWyV6ZF0sIGJ1dCB3ZSBuZWVkIFslemRdIHRvIHJlYWQgdGhlICIKIAkJICAgICAgICJwZW5kaW5nIG1lc3NhZ2VcbiIsIF9fZnVuY19fLCBjb3VudCwgdG90YWxfbGVuZ3RoKTsKIAkJZ290byBvdXRfdW5sb2NrX21zZ19jdHg7CiAJfQpAQCAtMzc2LDcgKzM3Niw3IEBACiAKIAlpZiAoKHNpemVvZigqbXNnKSArIG1zZy0+ZGF0YV9sZW4pICE9IGRhdGFfc2l6ZSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogKHNpemVvZigqbXNnKSArIG1zZy0+ZGF0YV9sZW4pID0gIgotCQkgICAgICAgIlslWmRdOyBkYXRhX3NpemUgPSBbJVpkXS4gSW52YWxpZCBwYWNrZXQuXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgICJbJXpkXTsgZGF0YV9zaXplID0gWyV6ZF0uIEludmFsaWQgcGFja2V0LlxuIiwgX19mdW5jX18sCiAJCSAgICAgICAoc2l6ZW9mKCptc2cpICsgbXNnLT5kYXRhX2xlbiksIGRhdGFfc2l6ZSk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CkBAIC00MjEsNyArNDIxLDcgQEAKIAlkYXRhID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgotCQkgICAgICAgImttYWxsb2MoWyVaZF0sIEdGUF9LRVJORUwpXG4iLCBfX2Z1bmNfXywgY291bnQpOworCQkgICAgICAgImttYWxsb2MoWyV6ZF0sIEdGUF9LRVJORUwpXG4iLCBfX2Z1bmNfXywgY291bnQpOwogCQlnb3RvIG91dDsKIAl9CiAJcmMgPSBjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KTsKQEAgLTQzNiw4ICs0MzYsOCBAQAogCWNhc2UgRUNSWVBURlNfTVNHX1JFU1BPTlNFOgogCQlpZiAoY291bnQgPCAoMSArIDQgKyAxICsgc2l6ZW9mKHN0cnVjdCBlY3J5cHRmc19tZXNzYWdlKSkpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNaW5pbXVtIGFjY2VwdGFibGUgcGFja2V0ICIKLQkJCSAgICAgICAic2l6ZSBpcyBbJVpkXSwgYnV0IGFtb3VudCBvZiBkYXRhIHdyaXR0ZW4gaXMgIgotCQkJICAgICAgICJvbmx5IFslWmRdLiBEaXNjYXJkaW5nIHJlc3BvbnNlIHBhY2tldC5cbiIsCisJCQkgICAgICAgInNpemUgaXMgWyV6ZF0sIGJ1dCBhbW91bnQgb2YgZGF0YSB3cml0dGVuIGlzICIKKwkJCSAgICAgICAib25seSBbJXpkXS4gRGlzY2FyZGluZyByZXNwb25zZSBwYWNrZXQuXG4iLAogCQkJICAgICAgIF9fZnVuY19fLAogCQkJICAgICAgICgxICsgNCArIDEgKyBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX21lc3NhZ2UpKSwKIAkJCSAgICAgICBjb3VudCk7CkBAIC00NTUsOSArNDU1LDkgQEAKIAkJfQogCQlpICs9IHBhY2tldF9zaXplX2xlbmd0aDsKIAkJaWYgKCgxICsgNCArIHBhY2tldF9zaXplX2xlbmd0aCArIHBhY2tldF9zaXplKSAhPSBjb3VudCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICgxICsgcGFja2V0X3NpemVfbGVuZ3RoKFslWmRdKSIKLQkJCSAgICAgICAiICsgcGFja2V0X3NpemUoWyVaZF0pKShbJVpkXSkgIT0gIgotCQkJICAgICAgICJjb3VudChbJVpkXSkuIEludmFsaWQgcGFja2V0IGZvcm1hdC5cbiIsCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogKDEgKyBwYWNrZXRfc2l6ZV9sZW5ndGgoWyV6ZF0pIgorCQkJICAgICAgICIgKyBwYWNrZXRfc2l6ZShbJXpkXSkpKFslemRdKSAhPSAiCisJCQkgICAgICAgImNvdW50KFslemRdKS4gSW52YWxpZCBwYWNrZXQgZm9ybWF0LlxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgcGFja2V0X3NpemVfbGVuZ3RoLCBwYWNrZXRfc2l6ZSwKIAkJCSAgICAgICAoMSArIHBhY2tldF9zaXplX2xlbmd0aCArIHBhY2tldF9zaXplKSwgY291bnQpOwogCQkJZ290byBvdXRfZnJlZTsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCA5YzMzZjU0Li43MWE2ZWZlIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC0yMzIsMTMgKzIzMiwxMyBAQAogCiBzdGF0aWMgaW50IF9fYnBybV9tbV9pbml0KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiB7Ci0JaW50IGVyciA9IC1FTk9NRU07CisJaW50IGVycjsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBicHJtLT5tbTsKIAogCWJwcm0tPnZtYSA9IHZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZtYSkKLQkJZ290byBlcnI7CisJCXJldHVybiAtRU5PTUVNOwogCiAJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAl2bWEtPnZtX21tID0gbW07CkBAIC0yNTEsMjggKzI1MSwyMCBAQAogCSAqLwogCXZtYS0+dm1fZW5kID0gU1RBQ0tfVE9QX01BWDsKIAl2bWEtPnZtX3N0YXJ0ID0gdm1hLT52bV9lbmQgLSBQQUdFX1NJWkU7Ci0KIAl2bWEtPnZtX2ZsYWdzID0gVk1fU1RBQ0tfRkxBR1M7CiAJdm1hLT52bV9wYWdlX3Byb3QgPSB2bV9nZXRfcGFnZV9wcm90KHZtYS0+dm1fZmxhZ3MpOwogCWVyciA9IGluc2VydF92bV9zdHJ1Y3QobW0sIHZtYSk7Ci0JaWYgKGVycikgewotCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycjsKLQl9CiAKIAltbS0+c3RhY2tfdm0gPSBtbS0+dG90YWxfdm0gPSAxOwogCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCiAJYnBybS0+cCA9IHZtYS0+dm1fZW5kIC0gc2l6ZW9mKHZvaWQgKik7Ci0KIAlyZXR1cm4gMDsKLQogZXJyOgotCWlmICh2bWEpIHsKLQkJYnBybS0+dm1hID0gTlVMTDsKLQkJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwotCX0KLQorCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCWJwcm0tPnZtYSA9IE5VTEw7CisJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE2OTQsNyArMTY4Niw3IEBACiAJcmV0dXJuIChyZXQgPj0gMikgPyAyIDogcmV0OwogfQogCi1pbnQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQordm9pZCBkb19jb3JlZHVtcChsb25nIHNpZ25yLCBpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgY29yZV9zdGF0ZSBjb3JlX3N0YXRlOwogCWNoYXIgY29yZW5hbWVbQ09SRU5BTUVfTUFYX1NJWkUgKyAxXTsKQEAgLTE3NzgsNiArMTc3MCwxMSBAQAogCiAgCWlmIChpc3BpcGUpIHsKIAkJaGVscGVyX2FyZ3YgPSBhcmd2X3NwbGl0KEdGUF9LRVJORUwsIGNvcmVuYW1lKzEsICZoZWxwZXJfYXJnYyk7CisJCWlmICghaGVscGVyX2FyZ3YpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJZ290byBmYWlsX3VubG9jazsKKwkJfQogCQkvKiBUZXJtaW5hdGUgdGhlIHN0cmluZyBiZWZvcmUgdGhlIGZpcnN0IG9wdGlvbiAqLwogCQlkZWxpbWl0ID0gc3RyY2hyKGNvcmVuYW1lLCAnICcpOwogCQlpZiAoZGVsaW1pdCkKQEAgLTE4NDUsNSArMTg0Miw1IEBACiAJcHV0X2NyZWQoY3JlZCk7CiAJY29yZWR1bXBfZmluaXNoKG1tKTsKIGZhaWw6Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDQuaCBiL2ZzL2V4dDQvZXh0NC5oCmluZGV4IGIwNTM3YzguLjZjNDZjNjQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NC5oCisrKyBiL2ZzL2V4dDQvZXh0NC5oCkBAIC0xMjI1LDExICsxMjI1LDExIEBACiB9IHdoaWxlICgwKQogCiAjaWZkZWYgQ09ORklHX1NNUAotLyogRWFjaCBDUFUgY2FuIGFjY3VtdWxhdGUgRkJDX0JBVENIIGJsb2NrcyBpbiB0aGVpciBsb2NhbAorLyogRWFjaCBDUFUgY2FuIGFjY3VtdWxhdGUgcGVyY3B1X2NvdW50ZXJfYmF0Y2ggYmxvY2tzIGluIHRoZWlyIGxvY2FsCiAgKiBjb3VudGVycy4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBmcmVlIGJsb2NrcyBtb3JlCi0gKiB0aGFuIEZCQ19CQVRDSCAgKiBucl9jcHVfaWRzLiBBbHNvIGFkZCBhIHdpbmRvdyBvZiA0IHRpbWVzLgorICogdGhhbiBwZXJjcHVfY291bnRlcl9iYXRjaCAgKiBucl9jcHVfaWRzLiBBbHNvIGFkZCBhIHdpbmRvdyBvZiA0IHRpbWVzLgogICovCi0jZGVmaW5lIEVYVDRfRlJFRUJMT0NLU19XQVRFUk1BUksgKDQgKiAoRkJDX0JBVENIICogbnJfY3B1X2lkcykpCisjZGVmaW5lIEVYVDRfRlJFRUJMT0NLU19XQVRFUk1BUksgKDQgKiAocGVyY3B1X2NvdW50ZXJfYmF0Y2ggKiBucl9jcHVfaWRzKSkKICNlbHNlCiAjZGVmaW5lIEVYVDRfRlJFRUJMT0NLU19XQVRFUk1BUksgMAogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggNjcwMmE0OTkuLjk4ZDNmZTcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTI0OTgsNyArMjQ5OCw3IEBACiAJLyoKIAkgKiBzd2l0Y2ggdG8gbm9uIGRlbGFsbG9jIG1vZGUgaWYgd2UgYXJlIHJ1bm5pbmcgbG93CiAJICogb24gZnJlZSBibG9jay4gVGhlIGZyZWUgYmxvY2sgYWNjb3VudGluZyB2aWEgcGVyY3B1Ci0JICogY291bnRlcnMgY2FuIGdldCBzbGlnaHRseSB3cm9uZyB3aXRoIEZCQ19CQVRDSCBnZXR0aW5nCisJICogY291bnRlcnMgY2FuIGdldCBzbGlnaHRseSB3cm9uZyB3aXRoIHBlcmNwdV9jb3VudGVyX2JhdGNoIGdldHRpbmcKIAkgKiBhY2N1bXVsYXRlZCBvbiBlYWNoIENQVSB3aXRob3V0IHVwZGF0aW5nIGdsb2JhbCBjb3VudGVycwogCSAqIERlbGFsbG9jIG5lZWQgYW4gYWNjdXJhdGUgZnJlZSBibG9jayBhY2NvdW50aW5nLiBTbyBzd2l0Y2gKIAkgKiB0byBub24gZGVsYWxsb2Mgd2hlbiB3ZSBhcmUgbmVhciB0byBlcnJvciByYW5nZS4KZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggZDBmZjBiOC4uZTVlYWE2MiAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTQyMSw5ICs0MjEsNiBAQAogICogSWYgd2UncmUgYSBwZGxmdXNoIHRocmVhZCwgdGhlbiBpbXBsZW1lbnQgcGRmbHVzaCBjb2xsaXNpb24gYXZvaWRhbmNlCiAgKiBhZ2FpbnN0IHRoZSBlbnRpcmUgbGlzdC4KICAqCi0gKiBXQl9TWU5DX0hPTEQgaXMgYSBoYWNrIGZvciBzeXNfc3luYygpOiByZWF0dGFjaCB0aGUgaW5vZGUgdG8gc2ItPnNfZGlydHkgc28KLSAqIHRoYXQgaXQgY2FuIGJlIGxvY2F0ZWQgZm9yIHdhaXRpbmcgb24gaW4gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKCkuCi0gKgogICogSWYgYGJkaScgaXMgbm9uLXplcm8gdGhlbiB3ZSdyZSBiZWluZyBhc2tlZCB0byB3cml0ZWJhY2sgYSBzcGVjaWZpYyBxdWV1ZS4KICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBibG9ja2RldiBzdXBlcmJsb2NrJ3MgaW5vZGVzIGFyZSBiYWNrZWQgYnkKICAqIGEgdmFyaWV0eSBvZiBxdWV1ZXMsIHNvIGFsbCBpbm9kZXMgYXJlIHNlYXJjaGVkLiAgRm9yIG90aGVyIHN1cGVyYmxvY2tzLApAQCAtNDQzLDYgKzQ0MCw3IEBACiAJCQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CS8qIGxpdmVsb2NrIGF2b2lkYW5jZSAqLworCWludCBzeW5jID0gd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEw7CiAKIAlzcGluX2xvY2soJmlub2RlX2xvY2spOwogCWlmICghd2JjLT5mb3Jfa3VwZGF0ZSB8fCBsaXN0X2VtcHR5KCZzYi0+c19pbykpCkBAIC00OTksMTAgKzQ5Nyw2IEBACiAJCV9faWdldChpbm9kZSk7CiAJCXBhZ2VzX3NraXBwZWQgPSB3YmMtPnBhZ2VzX3NraXBwZWQ7CiAJCV9fd3JpdGViYWNrX3NpbmdsZV9pbm9kZShpbm9kZSwgd2JjKTsKLQkJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfSE9MRCkgewotCQkJaW5vZGUtPmRpcnRpZWRfd2hlbiA9IGppZmZpZXM7Ci0JCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZzYi0+c19kaXJ0eSk7Ci0JCX0KIAkJaWYgKGN1cnJlbnRfaXNfcGRmbHVzaCgpKQogCQkJd3JpdGViYWNrX3JlbGVhc2UoYmRpKTsKIAkJaWYgKHdiYy0+cGFnZXNfc2tpcHBlZCAhPSBwYWdlc19za2lwcGVkKSB7CkBAIC01MjMsNyArNTE3LDQ5IEBACiAJCWlmICghbGlzdF9lbXB0eSgmc2ItPnNfbW9yZV9pbykpCiAJCQl3YmMtPm1vcmVfaW8gPSAxOwogCX0KLQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKKwlpZiAoc3luYykgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDsKKworCQkvKgorCQkgKiBEYXRhIGludGVncml0eSBzeW5jLiBNdXN0IHdhaXQgZm9yIGFsbCBwYWdlcyB1bmRlciB3cml0ZWJhY2ssCisJCSAqIGJlY2F1c2UgdGhlcmUgbWF5IGhhdmUgYmVlbiBwYWdlcyBkaXJ0aWVkIGJlZm9yZSBvdXIgc3luYworCQkgKiBjYWxsLCBidXQgd2hpY2ggaGFkIHdyaXRlb3V0IHN0YXJ0ZWQgYmVmb3JlIHdlIHdyaXRlIGl0IG91dC4KKwkJICogSW4gd2hpY2ggY2FzZSwgdGhlIGlub2RlIG1heSBub3QgYmUgb24gdGhlIGRpcnR5IGxpc3QsIGJ1dAorCQkgKiB3ZSBzdGlsbCBoYXZlIHRvIHdhaXQgZm9yIHRoYXQgd3JpdGVvdXQuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmc2ItPnNfaW5vZGVzLCBpX3NiX2xpc3QpIHsKKwkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCisJCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HfElfV0lMTF9GUkVFKSkKKwkJCQljb250aW51ZTsKKwkJCW1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQkJaWYgKG1hcHBpbmctPm5ycGFnZXMgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCV9faWdldChpbm9kZSk7CisJCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCQkvKgorCQkJICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUKKwkJCSAqIGJlZW4gcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKKwkJCSAqIGlub2RlX2xvY2suICBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbgorCQkJICogYmUgaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0CisJCQkgKiB1bmRlciBpbm9kZV9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQKKwkJCSAqIGl0IGxhdGVyLgorCQkJICovCisJCQlpcHV0KG9sZF9pbm9kZSk7CisJCQlvbGRfaW5vZGUgPSBpbm9kZTsKKworCQkJZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwkJaXB1dChvbGRfaW5vZGUpOworCX0gZWxzZQorCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKIAlyZXR1cm47CQkvKiBMZWF2ZSBhbnkgdW53cml0dGVuIGlub2RlcyBvbiBzX2lvICovCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX3N5bmNfc2JfaW5vZGVzKTsKQEAgLTU4OCw4ICs2MjQsNyBAQAogCiAvKgogICogd3JpdGViYWNrIGFuZCB3YWl0IHVwb24gdGhlIGZpbGVzeXN0ZW0ncyBkaXJ0eSBpbm9kZXMuICBUaGUgY2FsbGVyIHdpbGwKLSAqIGRvIHRoaXMgaW4gdHdvIHBhc3NlcyAtIG9uZSB0byB3cml0ZSwgYW5kIG9uZSB0byB3YWl0LiAgV0JfU1lOQ19IT0xEIGlzCi0gKiB1c2VkIHRvIHBhcmsgdGhlIHdyaXR0ZW4gaW5vZGVzIG9uIHNiLT5zX2RpcnR5IGZvciB0aGUgd2FpdCBwYXNzLgorICogZG8gdGhpcyBpbiB0d28gcGFzc2VzIC0gb25lIHRvIHdyaXRlLCBhbmQgb25lIHRvIHdhaXQuCiAgKgogICogQSBmaW5pdGUgbGltaXQgaXMgc2V0IG9uIHRoZSBudW1iZXIgb2YgcGFnZXMgd2hpY2ggd2lsbCBiZSB3cml0dGVuLgogICogVG8gcHJldmVudCBpbmZpbml0ZSBsaXZlbG9jayBvZiBzeXNfc3luYygpLgpAQCAtNjAwLDMyICs2MzUsMjMgQEAKIHZvaWQgc3luY19pbm9kZXNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCiB7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKLQkJLnN5bmNfbW9kZQk9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfSE9MRCwKKwkJLnN5bmNfbW9kZQk9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfTk9ORSwKIAkJLnJhbmdlX3N0YXJ0CT0gMCwKIAkJLnJhbmdlX2VuZAk9IExMT05HX01BWCwKIAl9OwotCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKTsKLQl1bnNpZ25lZCBsb25nIG5yX3Vuc3RhYmxlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKTsKIAotCXdiYy5ucl90b193cml0ZSA9IG5yX2RpcnR5ICsgbnJfdW5zdGFibGUgKwotCQkJKGlub2Rlc19zdGF0Lm5yX2lub2RlcyAtIGlub2Rlc19zdGF0Lm5yX3VudXNlZCkgKwotCQkJbnJfZGlydHkgKyBucl91bnN0YWJsZTsKLQl3YmMubnJfdG9fd3JpdGUgKz0gd2JjLm5yX3RvX3dyaXRlIC8gMjsJCS8qIEJpdCBtb3JlIGZvciBsdWNrICovCisJaWYgKCF3YWl0KSB7CisJCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKTsKKwkJdW5zaWduZWQgbG9uZyBucl91bnN0YWJsZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX1VOU1RBQkxFX05GUyk7CisKKwkJd2JjLm5yX3RvX3dyaXRlID0gbnJfZGlydHkgKyBucl91bnN0YWJsZSArCisJCQkoaW5vZGVzX3N0YXQubnJfaW5vZGVzIC0gaW5vZGVzX3N0YXQubnJfdW51c2VkKTsKKwl9IGVsc2UKKwkJd2JjLm5yX3RvX3dyaXRlID0gTE9OR19NQVg7IC8qIGRvZXNuJ3QgYWN0dWFsbHkgbWF0dGVyICovCisKIAlzeW5jX3NiX2lub2RlcyhzYiwgJndiYyk7CiB9CiAKLS8qCi0gKiBSYXRoZXIgbGFtZSBsaXZlbG9jayBhdm9pZGFuY2UuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9zYl9zeW5jaW5nKGludCB2YWwpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKLQlzcGluX2xvY2soJnNiX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShzYiwgJnN1cGVyX2Jsb2Nrcywgc19saXN0KQotCQlzYi0+c19zeW5jaW5nID0gdmFsOwotCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKLX0KLQogLyoqCiAgKiBzeW5jX2lub2RlcyAtIHdyaXRlcyBhbGwgaW5vZGVzIHRvIGRpc2sKICAqIEB3YWl0OiB3YWl0IGZvciBjb21wbGV0aW9uCkBAIC02NTIsOSArNjc4LDYgQEAKIAlzcGluX2xvY2soJnNiX2xvY2spOwogcmVzdGFydDoKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpIHsKLQkJaWYgKHNiLT5zX3N5bmNpbmcpCi0JCQljb250aW51ZTsKLQkJc2ItPnNfc3luY2luZyA9IDE7CiAJCXNiLT5zX2NvdW50Kys7CiAJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKIAkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOwpAQCAtNjcyLDEzICs2OTUsMTAgQEAKIAogdm9pZCBzeW5jX2lub2RlcyhpbnQgd2FpdCkKIHsKLQlzZXRfc2Jfc3luY2luZygwKTsKIAlfX3N5bmNfaW5vZGVzKDApOwogCi0JaWYgKHdhaXQpIHsKLQkJc2V0X3NiX3N5bmNpbmcoMCk7CisJaWYgKHdhaXQpCiAJCV9fc3luY19pbm9kZXMoMSk7Ci0JfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY29udHJvbC5jIGIvZnMvZnVzZS9jb250cm9sLmMKaW5kZXggNGYzY2FiMy4uOTljOTlkZiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9jb250cm9sLmMKKysrIGIvZnMvZnVzZS9jb250cm9sLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQotICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgogICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTQ4LDExICs0OCwxMyBAQAogCXNpemVfdCBzaXplOwogCiAJaWYgKCEqcHBvcykgeworCQlsb25nIHZhbHVlOwogCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGZ1c2VfY3RsX2ZpbGVfY29ubl9nZXQoZmlsZSk7CiAJCWlmICghZmMpCiAJCQlyZXR1cm4gMDsKIAotCQlmaWxlLT5wcml2YXRlX2RhdGE9KHZvaWQgKikobG9uZylhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKTsKKwkJdmFsdWUgPSBhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKil2YWx1ZTsKIAkJZnVzZV9jb25uX3B1dChmYyk7CiAJfQogCXNpemUgPSBzcHJpbnRmKHRtcCwgIiVsZFxuIiwgKGxvbmcpZmlsZS0+cHJpdmF0ZV9kYXRhKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGV2LmMgYi9mcy9mdXNlL2Rldi5jCmluZGV4IGZiYTU3MTYuLmUwYzdhZGEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGV2LmMKKysrIGIvZnMvZnVzZS9kZXYuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMjY5LDcgKzI2OSw3IEBACiAgKiBDYWxsZWQgd2l0aCBmYy0+bG9jaywgdW5sb2NrcyBpdAogICovCiBzdGF0aWMgdm9pZCByZXF1ZXN0X2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQogewogCXZvaWQgKCplbmQpIChzdHJ1Y3QgZnVzZV9jb25uICosIHN0cnVjdCBmdXNlX3JlcSAqKSA9IHJlcS0+ZW5kOwogCXJlcS0+ZW5kID0gTlVMTDsKQEAgLTI5MywxMyArMjkzLDEzIEBACiAJd2FrZV91cCgmcmVxLT53YWl0cSk7CiAJaWYgKGVuZCkKIAkJZW5kKGZjLCByZXEpOwotCWVsc2UKLQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCB3YWl0X2Fuc3dlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAogCQkJCSAgICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJcmV0dXJuOwpAQCAtMzE3LDcgKzMxNyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdF9hbnN3ZXIoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCWlmICghZmMtPm5vX2ludGVycnVwdCkgewogCQkvKiBBbnkgc2lnbmFsIG1heSBpbnRlcnJ1cHQgdGhpcyAqLwpAQCAtMzgwLDcgKzM4MSw3IEBACiAJfQogfQogCi12b2lkIHJlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwpAQCAtMzk5LDggKzQwMCw4IEBACiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgcmVxdWVzdF9zZW5kX25vd2FpdF9sb2NrZWQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCi0JCQkJICAgICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQorc3RhdGljIHZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm93YWl0X2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkJICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+YmFja2dyb3VuZCA9IDE7CiAJZmMtPm51bV9iYWNrZ3JvdW5kKys7CkBAIC00MTQsMTEgKzQxNSwxMSBAQAogCWZsdXNoX2JnX3F1ZXVlKGZjKTsKIH0KIAotc3RhdGljIHZvaWQgcmVxdWVzdF9zZW5kX25vd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCitzdGF0aWMgdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCWlmIChmYy0+Y29ubmVjdGVkKSB7Ci0JCXJlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCX0gZWxzZSB7CiAJCXJlcS0+b3V0LmguZXJyb3IgPSAtRU5PVENPTk47CkBAIC00MjYsMTYgKzQyNywxNiBAQAogCX0KIH0KIAotdm9pZCByZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX25vcmVwbHkoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+aXNyZXBseSA9IDA7Ci0JcmVxdWVzdF9zZW5kX25vd2FpdChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7CiB9CiAKLXZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwotCXJlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmRfbm93YWl0KGZjLCByZXEpOwogfQogCiAvKgpAQCAtNDQzLDEwICs0NDQsMTEgQEAKICAqCiAgKiBmYy0+Y29ubmVjdGVkIG11c3QgaGF2ZSBiZWVuIGNoZWNrZWQgcHJldmlvdXNseQogICovCi12b2lkIHJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX2JhY2tncm91bmRfbG9ja2VkKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCQkgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJcmVxLT5pc3JlcGx5ID0gMTsKLQlyZXF1ZXN0X3NlbmRfbm93YWl0X2xvY2tlZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOwogfQogCiAvKgpAQCAtNTM5LDggKzU0MSw4IEBACiAJCUJVR19PTighY3MtPm5yX3NlZ3MpOwogCQljcy0+c2VnbGVuID0gY3MtPmlvdlswXS5pb3ZfbGVuOwogCQljcy0+YWRkciA9ICh1bnNpZ25lZCBsb25nKSBjcy0+aW92WzBdLmlvdl9iYXNlOwotCQljcy0+aW92ICsrOwotCQljcy0+bnJfc2VncyAtLTsKKwkJY3MtPmlvdisrOworCQljcy0+bnJfc2Vncy0tOwogCX0KIAlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJZXJyID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIGNzLT5hZGRyLCAxLCBjcy0+d3JpdGUsIDAsCkBAIC01ODksOSArNTkxLDExIEBACiAJCWt1bm1hcF9hdG9taWMobWFwYWRkciwgS01fVVNFUjEpOwogCX0KIAl3aGlsZSAoY291bnQpIHsKLQkJaW50IGVycjsKLQkJaWYgKCFjcy0+bGVuICYmIChlcnIgPSBmdXNlX2NvcHlfZmlsbChjcykpKQotCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFjcy0+bGVuKSB7CisJCQlpbnQgZXJyID0gZnVzZV9jb3B5X2ZpbGwoY3MpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CiAJCWlmIChwYWdlKSB7CiAJCQl2b2lkICptYXBhZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOwogCQkJdm9pZCAqYnVmID0gbWFwYWRkciArIG9mZnNldDsKQEAgLTYzMSw5ICs2MzUsMTEgQEAKIHN0YXRpYyBpbnQgZnVzZV9jb3B5X29uZShzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcywgdm9pZCAqdmFsLCB1bnNpZ25lZCBzaXplKQogewogCXdoaWxlIChzaXplKSB7Ci0JCWludCBlcnI7Ci0JCWlmICghY3MtPmxlbiAmJiAoZXJyID0gZnVzZV9jb3B5X2ZpbGwoY3MpKSkKLQkJCXJldHVybiBlcnI7CisJCWlmICghY3MtPmxlbikgeworCQkJaW50IGVyciA9IGZ1c2VfY29weV9maWxsKGNzKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQogCQlmdXNlX2NvcHlfZG8oY3MsICZ2YWwsICZzaXplKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC02NjQsNiArNjcwLDggQEAKIAogLyogV2FpdCB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKQEAgLTY5MSw3ICs2OTksNyBAQAogICovCiBzdGF0aWMgaW50IGZ1c2VfcmVhZF9pbnRlcnJ1cHQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQogewogCXN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgY3M7CiAJc3RydWN0IGZ1c2VfaW5faGVhZGVyIGloOwpAQCAtODEzLDYgKzgyMSwzNCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgZnVzZV9ub3RpZnlfcG9sbChzdHJ1Y3QgZnVzZV9jb25uICpmYywgdW5zaWduZWQgaW50IHNpemUsCisJCQkgICAgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCit7CisJc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCBvdXRhcmc7CisJaW50IGVycjsKKworCWlmIChzaXplICE9IHNpemVvZihvdXRhcmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGZ1c2VfY29weV9vbmUoY3MsICZvdXRhcmcsIHNpemVvZihvdXRhcmcpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwKGZjLCAmb3V0YXJnKTsKK30KKworc3RhdGljIGludCBmdXNlX25vdGlmeShzdHJ1Y3QgZnVzZV9jb25uICpmYywgZW51bSBmdXNlX25vdGlmeV9jb2RlIGNvZGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBGVVNFX05PVElGWV9QT0xMOgorCQlyZXR1cm4gZnVzZV9ub3RpZnlfcG9sbChmYywgc2l6ZSwgY3MpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCiAvKiBMb29rIHVwIHJlcXVlc3Qgb24gcHJvY2Vzc2luZyBsaXN0IGJ5IHVuaXF1ZSBJRCAqLwogc3RhdGljIHN0cnVjdCBmdXNlX3JlcSAqcmVxdWVzdF9maW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCB1NjQgdW5pcXVlKQogewpAQCAtODc2LDkgKzkxMiwyMyBAQAogCWVyciA9IGZ1c2VfY29weV9vbmUoJmNzLCAmb2gsIHNpemVvZihvaCkpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2ZpbmlzaDsKKwogCWVyciA9IC1FSU5WQUw7Ci0JaWYgKCFvaC51bmlxdWUgfHwgb2guZXJyb3IgPD0gLTEwMDAgfHwgb2guZXJyb3IgPiAwIHx8Ci0JICAgIG9oLmxlbiAhPSBuYnl0ZXMpCisJaWYgKG9oLmxlbiAhPSBuYnl0ZXMpCisJCWdvdG8gZXJyX2ZpbmlzaDsKKworCS8qCisJICogWmVybyBvaC51bmlxdWUgaW5kaWNhdGVzIHVuc29saWNpdGVkIG5vdGlmaWNhdGlvbiBtZXNzYWdlCisJICogYW5kIGVycm9yIGNvbnRhaW5zIG5vdGlmaWNhdGlvbiBjb2RlLgorCSAqLworCWlmICghb2gudW5pcXVlKSB7CisJCWVyciA9IGZ1c2Vfbm90aWZ5KGZjLCBvaC5lcnJvciwgbmJ5dGVzIC0gc2l6ZW9mKG9oKSwgJmNzKTsKKwkJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOworCQlyZXR1cm4gZXJyID8gZXJyIDogbmJ5dGVzOworCX0KKworCWVyciA9IC1FSU5WQUw7CisJaWYgKG9oLmVycm9yIDw9IC0xMDAwIHx8IG9oLmVycm9yID4gMCkKIAkJZ290byBlcnJfZmluaXNoOwogCiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CkBAIC05NjYsNiArMTAxNiw4IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFuZCByZWFjcXVpcmVzIGZjLT5sb2NrCiAgKi8KIHN0YXRpYyB2b2lkIGVuZF9yZXF1ZXN0cyhzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CiAJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwpAQCAtOTg4LDcgKzEwNDAsOCBAQAogICogbG9ja2VkKS4KICAqLwogc3RhdGljIHZvaWQgZW5kX2lvX3JlcXVlc3RzKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCXdoaWxlICghbGlzdF9lbXB0eSgmZmMtPmlvKSkgewogCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9CkBAIC0xMDAyLDExICsxMDU1LDExIEBACiAJCXdha2VfdXAoJnJlcS0+d2FpdHEpOwogCQlpZiAoZW5kKSB7CiAJCQlyZXEtPmVuZCA9IE5VTEw7Ci0JCQkvKiBUaGUgZW5kIGZ1bmN0aW9uIHdpbGwgY29uc3VtZSB0aGlzIHJlZmVyZW5jZSAqLwogCQkJX19mdXNlX2dldF9yZXF1ZXN0KHJlcSk7CiAJCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCQkJd2FpdF9ldmVudChyZXEtPndhaXRxLCAhcmVxLT5sb2NrZWQpOwogCQkJZW5kKGZjLCByZXEpOworCQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggOTViYzIyYi4uZmRmZjM0NiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KIAogICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC0xODksNyArMTg5LDcgQEAKIAkJcGFyZW50ID0gZGdldF9wYXJlbnQoZW50cnkpOwogCQlmdXNlX2xvb2t1cF9pbml0KGZjLCByZXEsIGdldF9ub2RlX2lkKHBhcmVudC0+ZF9pbm9kZSksCiAJCQkJICZlbnRyeS0+ZF9uYW1lLCAmb3V0YXJnKTsKLQkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAkJZHB1dChwYXJlbnQpOwogCQllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKLQkJCWZpLT5ubG9va3VwICsrOworCQkJZmktPm5sb29rdXArKzsKIAkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCX0KIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CkBAIC0yODMsNyArMjgzLDcgQEAKIAlhdHRyX3ZlcnNpb24gPSBmdXNlX2dldF9hdHRyX3ZlcnNpb24oZmMpOwogCiAJZnVzZV9sb29rdXBfaW5pdChmYywgcmVxLCBub2RlaWQsIG5hbWUsIG91dGFyZyk7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkvKiBaZXJvIG5vZGVpZCBpcyBzYW1lIGFzIC1FTk9FTlQsIGJ1dCB3aXRoIHZhbGlkIHRpbWVvdXQgKi8KQEAgLTM2OSw3ICszNjksNyBAQAogewogCWZ1c2VfcmVsZWFzZV9maWxsKGZmLCBub2RlaWQsIGZsYWdzLCBGVVNFX1JFTEVBU0UpOwogCWZmLT5yZXNlcnZlZF9yZXEtPmZvcmNlID0gMTsKLQlyZXF1ZXN0X3NlbmQoZmMsIGZmLT5yZXNlcnZlZF9yZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCBmZi0+cmVzZXJ2ZWRfcmVxKTsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmZi0+cmVzZXJ2ZWRfcmVxKTsKIAlrZnJlZShmZik7CiB9CkBAIC00MDgsNyArNDA4LDcgQEAKIAkJZ290byBvdXRfcHV0X2ZvcmdldF9yZXE7CiAKIAllcnIgPSAtRU5PTUVNOwotCWZmID0gZnVzZV9maWxlX2FsbG9jKCk7CisJZmYgPSBmdXNlX2ZpbGVfYWxsb2MoZmMpOwogCWlmICghZmYpCiAJCWdvdG8gb3V0X3B1dF9yZXF1ZXN0OwogCkBAIC00MzIsNyArNDMyLDcgQEAKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGVudHJ5OwogCXJlcS0+b3V0LmFyZ3NbMV0uc2l6ZSA9IHNpemVvZihvdXRvcGVuKTsKIAlyZXEtPm91dC5hcmdzWzFdLnZhbHVlID0gJm91dG9wZW47Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FTk9TWVMpCkBAIC01MDIsNyArNTAyLDcgQEAKIAllbHNlCiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVycikKQEAgLTYzMSwxNSArNjMxLDE3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IGVudHJ5LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoIWVycikgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZW50cnktPmRfaW5vZGU7CiAKLQkJLyogU2V0IG5saW5rIHRvIHplcm8gc28gdGhlIGlub2RlIGNhbiBiZSBjbGVhcmVkLCBpZgotICAgICAgICAgICAgICAgICAgIHRoZSBpbm9kZSBkb2VzIGhhdmUgbW9yZSBsaW5rcyB0aGlzIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkIGF0IHRoZSBuZXh0IGxvb2t1cC9nZXRhdHRyICovCisJCS8qCisJCSAqIFNldCBubGluayB0byB6ZXJvIHNvIHRoZSBpbm9kZSBjYW4gYmUgY2xlYXJlZCwgaWYgdGhlIGlub2RlCisJCSAqIGRvZXMgaGF2ZSBtb3JlIGxpbmtzIHRoaXMgd2lsbCBiZSBkaXNjb3ZlcmVkIGF0IHRoZSBuZXh0CisJCSAqIGxvb2t1cC9nZXRhdHRyLgorCQkgKi8KIAkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CiAJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGRpcik7CkBAIC02NjIsNyArNjY0LDcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmICghZXJyKSB7CkBAIC02OTUsNyArNjk3LDcgQEAKIAlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBvbGRlbnQtPmRfbmFtZS5uYW1lOwogCXJlcS0+aW4uYXJnc1syXS5zaXplID0gbmV3ZW50LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMl0udmFsdWUgPSBuZXdlbnQtPmRfbmFtZS5uYW1lOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKCFlcnIpIHsKQEAgLTgxMSw3ICs4MTMsNyBAQAogCWVsc2UKIAkJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoIWVycikgewpAQCAtOTExLDcgKzkxMyw3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVyciA9PSAtRU5PU1lTKSB7CkBAIC0xMDMzLDcgKzEwMzUsNyBAQAogCXJlcS0+bnVtX3BhZ2VzID0gMTsKIAlyZXEtPnBhZ2VzWzBdID0gcGFnZTsKIAlmdXNlX3JlYWRfZmlsbChyZXEsIGZpbGUsIGlub2RlLCBmaWxlLT5mX3BvcywgUEFHRV9TSVpFLCBGVVNFX1JFQURESVIpOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAluYnl0ZXMgPSByZXEtPm91dC5hcmdzWzBdLnNpemU7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwpAQCAtMTA2Nyw3ICsxMDY5LDcgQEAKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBQQUdFX1NJWkUgLSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBsaW5rOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAlpZiAocmVxLT5vdXQuaC5lcnJvcikgewogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGxpbmspOwogCQlsaW5rID0gRVJSX1BUUihyZXEtPm91dC5oLmVycm9yKTsKQEAgLTEyNzMsNyArMTI3NSw3IEBACiAJZWxzZQogCQlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIpIHsKQEAgLTEzNjcsNyArMTM2OSw3IEBACiAJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gbmFtZTsKIAlyZXEtPmluLmFyZ3NbMl0uc2l6ZSA9IHNpemU7CiAJcmVxLT5pbi5hcmdzWzJdLnZhbHVlID0gdmFsdWU7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyID09IC1FTk9TWVMpIHsKQEAgLTE0MTMsNyArMTQxNSw3IEBACiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKIAl9Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKQEAgLTE0NjMsNyArMTQ2NSw3IEBACiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKIAl9Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKQEAgLTE0OTYsNyArMTQ5OCw3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gbmFtZTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIgPT0gLUVOT1NZUykgewpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCA0YzllZTcwLi5lODE2MjY0IDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMzksMTQgKzM5LDE0IEBACiAJcmVxLT5vdXQubnVtYXJncyA9IDE7CiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKCpvdXRhcmdwKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gb3V0YXJncDsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX2FsbG9jKHZvaWQpCitzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Moc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CiAJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CiAJZmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnVzZV9maWxlKSwgR0ZQX0tFUk5FTCk7CkBAIC01OCw3ICs1OCwxMiBAQAogCQl9IGVsc2UgewogCQkJSU5JVF9MSVNUX0hFQUQoJmZmLT53cml0ZV9lbnRyeSk7CiAJCQlhdG9taWNfc2V0KCZmZi0+Y291bnQsIDApOworCQkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJCQlmZi0+a2ggPSArK2ZjLT5raGN0cjsKKwkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCX0KKwkJUkJfQ0xFQVJfTk9ERSgmZmYtPnBvbGxlZF9ub2RlKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmYtPnBvbGxfd2FpdCk7CiAJfQogCXJldHVybiBmZjsKIH0KQEAgLTc5LDcgKzg0LDYgQEAKIHsKIAlkcHV0KHJlcS0+bWlzYy5yZWxlYXNlLmRlbnRyeSk7CiAJbW50cHV0KHJlcS0+bWlzYy5yZWxlYXNlLnZmc21vdW50KTsKLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCBmdXNlX2ZpbGVfcHV0KHN0cnVjdCBmdXNlX2ZpbGUgKmZmKQpAQCAtODksNyArOTMsNyBAQAogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmVxLT5taXNjLnJlbGVhc2UuZGVudHJ5LT5kX2lub2RlOwogCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCQlyZXEtPmVuZCA9IGZ1c2VfcmVsZWFzZV9lbmQ7Ci0JCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwogCQlrZnJlZShmZik7CiAJfQogfQpAQCAtMTA5LDYgKzExMyw3IEBACiAKIGludCBmdXNlX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpCiB7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlzdHJ1Y3QgZnVzZV9vcGVuX291dCBvdXRhcmc7CiAJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CiAJaW50IGVycjsKQEAgLTEyMSw3ICsxMjYsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlmZiA9IGZ1c2VfZmlsZV9hbGxvYygpOworCWZmID0gZnVzZV9maWxlX2FsbG9jKGZjKTsKIAlpZiAoIWZmKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTY3LDcgKzE3MiwxMSBAQAogCiAJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQlsaXN0X2RlbCgmZmYtPndyaXRlX2VudHJ5KTsKKwkJaWYgKCFSQl9FTVBUWV9OT0RFKCZmZi0+cG9sbGVkX25vZGUpKQorCQkJcmJfZXJhc2UoJmZmLT5wb2xsZWRfbm9kZSwgJmZjLT5wb2xsZWRfZmlsZXMpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jKCZmZi0+cG9sbF93YWl0KTsKIAkJLyoKIAkJICogTm9ybWFsbHkgdGhpcyB3aWxsIHNlbmQgdGhlIFJFTEVBU0UgcmVxdWVzdCwKIAkJICogaG93ZXZlciBpZiBzb21lIGFzeW5jaHJvbm91cyBSRUFEIG9yIFdSSVRFIHJlcXVlc3RzCkBAIC0yODAsNyArMjg5LDcgQEAKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwogCXJlcS0+Zm9yY2UgPSAxOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVyciA9PSAtRU5PU1lTKSB7CkBAIC0zNDQsNyArMzUzLDcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyID09IC1FTk9TWVMpIHsKQEAgLTM5Niw3ICs0MDUsNyBAQAogCQlpbmFyZy0+cmVhZF9mbGFncyB8PSBGVVNFX1JFQURfTE9DS09XTkVSOwogCQlpbmFyZy0+bG9ja19vd25lciA9IGZ1c2VfbG9ja19vd25lcl9pZChmYywgb3duZXIpOwogCX0KLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJcmV0dXJuIHJlcS0+b3V0LmFyZ3NbMF0uc2l6ZTsKIH0KIApAQCAtNDkzLDcgKzUwMiw2IEBACiAJfQogCWlmIChyZXEtPmZmKQogCQlmdXNlX2ZpbGVfcHV0KHJlcS0+ZmYpOwotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2Vfc2VuZF9yZWFkcGFnZXMoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNTA5LDEwICs1MTcsMTEgQEAKIAkJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJCXJlcS0+ZmYgPSBmdXNlX2ZpbGVfZ2V0KGZmKTsKIAkJcmVxLT5lbmQgPSBmdXNlX3JlYWRwYWdlc19lbmQ7Ci0JCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwogCX0gZWxzZSB7Ci0JCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwkJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJCWZ1c2VfcmVhZHBhZ2VzX2VuZChmYywgcmVxKTsKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAl9CiB9CiAKQEAgLTU0Myw3ICs1NTIsNyBAQAogCQl9CiAJfQogCXJlcS0+cGFnZXNbcmVxLT5udW1fcGFnZXNdID0gcGFnZTsKLQlyZXEtPm51bV9wYWdlcyArKzsKKwlyZXEtPm51bV9wYWdlcysrOwogCXJldHVybiAwOwogfQogCkBAIC02MzYsNyArNjQ1LDcgQEAKIAkJaW5hcmctPndyaXRlX2ZsYWdzIHw9IEZVU0VfV1JJVEVfTE9DS09XTkVSOwogCQlpbmFyZy0+bG9ja19vd25lciA9IGZ1c2VfbG9ja19vd25lcl9pZChmYywgb3duZXIpOwogCX0KLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJcmV0dXJuIHJlcS0+bWlzYy53cml0ZS5vdXQuc2l6ZTsKIH0KIApAQCAtMTA0Miw3ICsxMDUxLDYgQEAKIHsKIAlfX2ZyZWVfcGFnZShyZXEtPnBhZ2VzWzBdKTsKIAlmdXNlX2ZpbGVfcHV0KHJlcS0+ZmYpOwotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2Vfd3JpdGVwYWdlX2ZpbmlzaChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCkBAIC0xMDYwLDYgKzEwNjgsOCBAQAogCiAvKiBDYWxsZWQgdW5kZXIgZmMtPmxvY2ssIG1heSByZWxlYXNlIGFuZCByZWFjcXVpcmUgaXQgKi8KIHN0YXRpYyB2b2lkIGZ1c2Vfc2VuZF93cml0ZXBhZ2Uoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQorX19yZWxlYXNlcygmZmMtPmxvY2spCitfX2FjcXVpcmVzKCZmYy0+bG9jaykKIHsKIAlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShyZXEtPmlub2RlKTsKIAlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKHJlcS0+aW5vZGUpOwpAQCAtMTA3OSwxMyArMTA4OSwxNCBAQAogCiAJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBpbmFyZy0+c2l6ZTsKIAlmaS0+d3JpdGVjdHIrKzsKLQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZF9sb2NrZWQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZF9sb2NrZWQoZmMsIHJlcSk7CiAJcmV0dXJuOwogCiAgb3V0X2ZyZWU6CiAJZnVzZV93cml0ZXBhZ2VfZmluaXNoKGZjLCByZXEpOwogCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJZnVzZV93cml0ZXBhZ2VfZnJlZShmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogfQogCkBAIC0xMDk2LDYgKzExMDcsOCBAQAogICogQ2FsbGVkIHdpdGggZmMtPmxvY2sKICAqLwogdm9pZCBmdXNlX2ZsdXNoX3dyaXRlcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSkKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CkBAIC0xMzI1LDcgKzEzMzgsNyBAQAogCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKCFlcnIpCkBAIC0xMzU3LDcgKzEzNzAsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwogCiAJZnVzZV9sa19maWxsKHJlcSwgZmlsZSwgZmwsIG9wY29kZSwgcGlkLCBmbG9jayk7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJLyogbG9ja2luZyBpcyByZXN0YXJ0YWJsZSAqLwogCWlmIChlcnIgPT0gLUVJTlRSKQpAQCAtMTQzMyw3ICsxNDQ2LDcgQEAKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIgPT0gLUVOT1NZUykKQEAgLTE0NzAsNiArMTQ4Myw0MDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW50IGZ1c2VfaW9jdGxfY29weV91c2VyKHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJdW5zaWduZWQgaW50IG5yX3NlZ3MsIHNpemVfdCBieXRlcywgYm9vbCB0b191c2VyKQoreworCXN0cnVjdCBpb3ZfaXRlciBpaTsKKwlpbnQgcGFnZV9pZHggPSAwOworCisJaWYgKCFieXRlcykKKwkJcmV0dXJuIDA7CisKKwlpb3ZfaXRlcl9pbml0KCZpaSwgaW92LCBucl9zZWdzLCBieXRlcywgMCk7CisKKwl3aGlsZSAoaW92X2l0ZXJfY291bnQoJmlpKSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW3BhZ2VfaWR4KytdOworCQlzaXplX3QgdG9kbyA9IG1pbl90KHNpemVfdCwgUEFHRV9TSVpFLCBpb3ZfaXRlcl9jb3VudCgmaWkpKTsKKwkJdm9pZCAqa2FkZHIsICptYXA7CisKKwkJa2FkZHIgPSBtYXAgPSBrbWFwKHBhZ2UpOworCisJCXdoaWxlICh0b2RvKSB7CisJCQljaGFyIF9fdXNlciAqdWFkZHIgPSBpaS5pb3YtPmlvdl9iYXNlICsgaWkuaW92X29mZnNldDsKKwkJCXNpemVfdCBpb3ZfbGVuID0gaWkuaW92LT5pb3ZfbGVuIC0gaWkuaW92X29mZnNldDsKKwkJCXNpemVfdCBjb3B5ID0gbWluKHRvZG8sIGlvdl9sZW4pOworCQkJc2l6ZV90IGxlZnQ7CisKKwkJCWlmICghdG9fdXNlcikKKwkJCQlsZWZ0ID0gY29weV9mcm9tX3VzZXIoa2FkZHIsIHVhZGRyLCBjb3B5KTsKKwkJCWVsc2UKKwkJCQlsZWZ0ID0gY29weV90b191c2VyKHVhZGRyLCBrYWRkciwgY29weSk7CisKKwkJCWlmICh1bmxpa2VseShsZWZ0KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaW92X2l0ZXJfYWR2YW5jZSgmaWksIGNvcHkpOworCQkJdG9kbyAtPSBjb3B5OworCQkJa2FkZHIgKz0gY29weTsKKwkJfQorCisJCWt1bm1hcChtYXApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRm9yIGlvY3RscywgdGhlcmUgaXMgbm8gZ2VuZXJpYyB3YXkgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIG1lbW9yeQorICogbmVlZHMgdG8gYmUgcmVhZCBhbmQvb3Igd3JpdHRlbi4gIEZ1cnRoZXJtb3JlLCBpb2N0bHMgYXJlIGFsbG93ZWQKKyAqIHRvIGRlcmVmZXJlbmNlIHRoZSBwYXNzZWQgcG9pbnRlciwgc28gdGhlIHBhcmFtZXRlciByZXF1aXJlcyBkZWVwCisgKiBjb3B5aW5nIGJ1dCBGVVNFIGhhcyBubyBpZGVhIHdoYXRzb2V2ZXIgYWJvdXQgd2hhdCB0byBjb3B5IGluIG9yCisgKiBvdXQuCisgKgorICogVGhpcyBpcyBzb2x2ZWQgYnkgYWxsb3dpbmcgRlVTRSBzZXJ2ZXIgdG8gcmV0cnkgaW9jdGwgd2l0aAorICogbmVjZXNzYXJ5IGluL291dCBpb3ZlY3MuICBMZXQncyBhc3N1bWUgdGhlIGlvY3RsIGltcGxlbWVudGF0aW9uCisgKiBuZWVkcyB0byByZWFkIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgorICoKKyAqIHN0cnVjdCBhIHsKKyAqCWNoYXIJKmJ1ZjsKKyAqCXNpemVfdAlidWZsZW47CisgKiB9CisgKgorICogT24gdGhlIGZpcnN0IGNhbGxvdXQgdG8gRlVTRSBzZXJ2ZXIsIGluYXJnLT5pbl9zaXplIGFuZAorICogaW5hcmctPm91dF9zaXplIHdpbGwgYmUgTlVMTDsgdGhlbiwgdGhlIHNlcnZlciBjb21wbGV0ZXMgdGhlIGlvY3RsCisgKiB3aXRoIEZVU0VfSU9DVExfUkVUUlkgc2V0IGluIG91dC0+ZmxhZ3MsIG91dC0+aW5faW92cyBzZXQgdG8gMSBhbmQKKyAqIHRoZSBhY3R1YWwgaW92IGFycmF5IHRvCisgKgorICogeyB7IC5pb3ZfYmFzZSA9IGluYXJnLmFyZywJLmlvdl9sZW4gPSBzaXplb2Yoc3RydWN0IGEpIH0gfQorICoKKyAqIHdoaWNoIHRlbGxzIEZVU0UgdG8gY29weSBpbiB0aGUgcmVxdWVzdGVkIGFyZWEgYW5kIHJldHJ5IHRoZSBpb2N0bC4KKyAqIE9uIHRoZSBzZWNvbmQgcm91bmQsIHRoZSBzZXJ2ZXIgaGFzIGFjY2VzcyB0byB0aGUgc3RydWN0dXJlIGFuZAorICogZnJvbSB0aGF0IGl0IGNhbiB0ZWxsIHdoYXQgdG8gbG9vayBmb3IgbmV4dCwgc28gb24gdGhlIGludm9jYXRpb24sCisgKiBpdCBzZXRzIEZVU0VfSU9DVExfUkVUUlksIG91dC0+aW5faW92cyB0byAyIGFuZCBpb3YgYXJyYXkgdG8KKyAqCisgKiB7IHsgLmlvdl9iYXNlID0gaW5hcmcuYXJnLAkuaW92X2xlbiA9IHNpemVvZihzdHJ1Y3QgYSkJfSwKKyAqICAgeyAuaW92X2Jhc2UgPSBhLmJ1ZiwJLmlvdl9sZW4gPSBhLmJ1ZmxlbgkJfSB9CisgKgorICogRlVTRSB3aWxsIGNvcHkgYm90aCBzdHJ1Y3QgYSBhbmQgdGhlIHBvaW50ZWQgYnVmZmVyIGZyb20gdGhlCisgKiBwcm9jZXNzIGRvaW5nIHRoZSBpb2N0bCBhbmQgcmV0cnkgaW9jdGwgd2l0aCBib3RoIHN0cnVjdCBhIGFuZCB0aGUKKyAqIGJ1ZmZlci4KKyAqCisgKiBUaGlzIHRpbWUsIEZVU0Ugc2VydmVyIGhhcyBldmVyeXRoaW5nIGl0IG5lZWRzIGFuZCBjb21wbGV0ZXMgaW9jdGwKKyAqIHdpdGhvdXQgRlVTRV9JT0NUTF9SRVRSWSB3aGljaCBmaW5pc2hlcyB0aGUgaW9jdGwgY2FsbC4KKyAqCisgKiBDb3B5aW5nIGRhdGEgb3V0IHdvcmtzIHRoZSBzYW1lIHdheS4KKyAqCisgKiBOb3RlIHRoYXQgaWYgRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQgaXMgY2xlYXIsIHRoZSBrZXJuZWwKKyAqIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZXMgaW4gYW5kIG91dCBpb3ZzIGJ5IGRlY29kaW5nIEBjbWQgd2l0aAorICogX0lPQ18qIG1hY3JvcyBhbmQgdGhlIHNlcnZlciBpcyBub3QgYWxsb3dlZCB0byByZXF1ZXN0IFJFVFJZLiAgVGhpcworICogbGltaXRzIGlvY3RsIGRhdGEgdHJhbnNmZXJzIHRvIHdlbGwtZm9ybWVkIGlvY3RscyBhbmQgaXMgdGhlIGZvcmNlZAorICogYmVoYXZpb3IgZm9yIGFsbCBGVVNFIHNlcnZlcnMuCisgKi8KK3N0YXRpYyBsb25nIGZ1c2VfZmlsZV9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX2lvY3RsX2luIGluYXJnID0geworCQkuZmggPSBmZi0+ZmgsCisJCS5jbWQgPSBjbWQsCisJCS5hcmcgPSBhcmcsCisJCS5mbGFncyA9IGZsYWdzCisJfTsKKwlzdHJ1Y3QgZnVzZV9pb2N0bF9vdXQgb3V0YXJnOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqaW92X3BhZ2UgPSBOVUxMOworCXN0cnVjdCBpb3ZlYyAqaW5faW92ID0gTlVMTCwgKm91dF9pb3YgPSBOVUxMOworCXVuc2lnbmVkIGludCBpbl9pb3ZzID0gMCwgb3V0X2lvdnMgPSAwLCBudW1fcGFnZXMgPSAwLCBtYXhfcGFnZXM7CisJc2l6ZV90IGluX3NpemUsIG91dF9zaXplLCB0cmFuc2ZlcnJlZDsKKwlpbnQgZXJyOworCisJLyogYXNzdW1lIGFsbCB0aGUgaW92cyByZXR1cm5lZCBieSBjbGllbnQgYWx3YXlzIGZpdHMgaW4gYSBwYWdlICovCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW92ZWMpICogRlVTRV9JT0NUTF9NQVhfSU9WID4gUEFHRV9TSVpFKTsKKworCWlmICghZnVzZV9hbGxvd190YXNrKGZjLCBjdXJyZW50KSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwllcnIgPSAtRUlPOworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9NRU07CisJcGFnZXMgPSBremFsbG9jKHNpemVvZihwYWdlc1swXSkgKiBGVVNFX01BWF9QQUdFU19QRVJfUkVRLCBHRlBfS0VSTkVMKTsKKwlpb3ZfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlcyB8fCAhaW92X3BhZ2UpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiByZXN0cmljdGVkLCBpbml0aWFsaXplIElPIHBhcmFtZXRlcnMgYXMgZW5jb2RlZCBpbiBAY21kLgorCSAqIFJFVFJZIGZyb20gc2VydmVyIGlzIG5vdCBhbGxvd2VkLgorCSAqLworCWlmICghKGZsYWdzICYgRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQpKSB7CisJCXN0cnVjdCBpb3ZlYyAqaW92ID0gcGFnZV9hZGRyZXNzKGlvdl9wYWdlKTsKKworCQlpb3YtPmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopYXJnOworCQlpb3YtPmlvdl9sZW4gPSBfSU9DX1NJWkUoY21kKTsKKworCQlpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpIHsKKwkJCWluX2lvdiA9IGlvdjsKKwkJCWluX2lvdnMgPSAxOworCQl9CisKKwkJaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1JFQUQpIHsKKwkJCW91dF9pb3YgPSBpb3Y7CisJCQlvdXRfaW92cyA9IDE7CisJCX0KKwl9CisKKyByZXRyeToKKwlpbmFyZy5pbl9zaXplID0gaW5fc2l6ZSA9IGlvdl9sZW5ndGgoaW5faW92LCBpbl9pb3ZzKTsKKwlpbmFyZy5vdXRfc2l6ZSA9IG91dF9zaXplID0gaW92X2xlbmd0aChvdXRfaW92LCBvdXRfaW92cyk7CisKKwkvKgorCSAqIE91dCBkYXRhIGNhbiBiZSB1c2VkIGVpdGhlciBmb3IgYWN0dWFsIG91dCBkYXRhIG9yIGlvdnMsCisJICogbWFrZSBzdXJlIHRoZXJlIGFsd2F5cyBpcyBhdCBsZWFzdCBvbmUgcGFnZS4KKwkgKi8KKwlvdXRfc2l6ZSA9IG1heF90KHNpemVfdCwgb3V0X3NpemUsIFBBR0VfU0laRSk7CisJbWF4X3BhZ2VzID0gRElWX1JPVU5EX1VQKG1heChpbl9zaXplLCBvdXRfc2l6ZSksIFBBR0VfU0laRSk7CisKKwkvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBidWZmZXIgcGFnZXMgYW5kIGluaXQgcmVxdWVzdCB3aXRoIHRoZW0gKi8KKwllcnIgPSAtRU5PTUVNOworCWlmIChtYXhfcGFnZXMgPiBGVVNFX01BWF9QQUdFU19QRVJfUkVRKQorCQlnb3RvIG91dDsKKwl3aGlsZSAobnVtX3BhZ2VzIDwgbWF4X3BhZ2VzKSB7CisJCXBhZ2VzW251bV9wYWdlc10gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNKTsKKwkJaWYgKCFwYWdlc1tudW1fcGFnZXNdKQorCQkJZ290byBvdXQ7CisJCW51bV9wYWdlcysrOworCX0KKworCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJaWYgKElTX0VSUihyZXEpKSB7CisJCWVyciA9IFBUUl9FUlIocmVxKTsKKwkJcmVxID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCW1lbWNweShyZXEtPnBhZ2VzLCBwYWdlcywgc2l6ZW9mKHJlcS0+cGFnZXNbMF0pICogbnVtX3BhZ2VzKTsKKwlyZXEtPm51bV9wYWdlcyA9IG51bV9wYWdlczsKKworCS8qIG9rYXksIGxldCdzIHNlbmQgaXQgdG8gdGhlIGNsaWVudCAqLworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0lPQ1RMOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCWlmIChpbl9zaXplKSB7CisJCXJlcS0+aW4ubnVtYXJncysrOworCQlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IGluX3NpemU7CisJCXJlcS0+aW4uYXJncGFnZXMgPSAxOworCisJCWVyciA9IGZ1c2VfaW9jdGxfY29weV91c2VyKHBhZ2VzLCBpbl9pb3YsIGluX2lvdnMsIGluX3NpemUsCisJCQkJCSAgIGZhbHNlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCXJlcS0+b3V0Lm51bWFyZ3MgPSAyOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcS0+b3V0LmFyZ3NbMV0uc2l6ZSA9IG91dF9zaXplOworCXJlcS0+b3V0LmFyZ3BhZ2VzID0gMTsKKwlyZXEtPm91dC5hcmd2YXIgPSAxOworCisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwl0cmFuc2ZlcnJlZCA9IHJlcS0+b3V0LmFyZ3NbMV0uc2l6ZTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCXJlcSA9IE5VTEw7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBkaWQgaXQgYXNrIGZvciByZXRyeT8gKi8KKwlpZiAob3V0YXJnLmZsYWdzICYgRlVTRV9JT0NUTF9SRVRSWSkgeworCQljaGFyICp2YWRkcjsKKworCQkvKiBubyByZXRyeSBpZiBpbiByZXN0cmljdGVkIG1vZGUgKi8KKwkJZXJyID0gLUVJTzsKKwkJaWYgKCEoZmxhZ3MgJiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRCkpCisJCQlnb3RvIG91dDsKKworCQlpbl9pb3ZzID0gb3V0YXJnLmluX2lvdnM7CisJCW91dF9pb3ZzID0gb3V0YXJnLm91dF9pb3ZzOworCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGluZ3MgYXJlIGluIGJvdW5kYXJ5LCBzZXBhcmF0ZSBjaGVja3MKKwkJICogYXJlIHRvIHByb3RlY3QgYWdhaW5zdCBvdmVyZmxvdy4KKwkJICovCisJCWVyciA9IC1FTk9NRU07CisJCWlmIChpbl9pb3ZzID4gRlVTRV9JT0NUTF9NQVhfSU9WIHx8CisJCSAgICBvdXRfaW92cyA+IEZVU0VfSU9DVExfTUFYX0lPViB8fAorCQkgICAgaW5faW92cyArIG91dF9pb3ZzID4gRlVTRV9JT0NUTF9NQVhfSU9WKQorCQkJZ290byBvdXQ7CisKKwkJZXJyID0gLUVJTzsKKwkJaWYgKChpbl9pb3ZzICsgb3V0X2lvdnMpICogc2l6ZW9mKHN0cnVjdCBpb3ZlYykgIT0gdHJhbnNmZXJyZWQpCisJCQlnb3RvIG91dDsKKworCQkvKiBva2F5LCBjb3B5IGluIGlvdnMgYW5kIHJldHJ5ICovCisJCXZhZGRyID0ga21hcF9hdG9taWMocGFnZXNbMF0sIEtNX1VTRVIwKTsKKwkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhpb3ZfcGFnZSksIHZhZGRyLCB0cmFuc2ZlcnJlZCk7CisJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1VTRVIwKTsKKworCQlpbl9pb3YgPSBwYWdlX2FkZHJlc3MoaW92X3BhZ2UpOworCQlvdXRfaW92ID0gaW5faW92ICsgaW5faW92czsKKworCQlnb3RvIHJldHJ5OworCX0KKworCWVyciA9IC1FSU87CisJaWYgKHRyYW5zZmVycmVkID4gaW5hcmcub3V0X3NpemUpCisJCWdvdG8gb3V0OworCisJZXJyID0gZnVzZV9pb2N0bF9jb3B5X3VzZXIocGFnZXMsIG91dF9pb3YsIG91dF9pb3ZzLCB0cmFuc2ZlcnJlZCwgdHJ1ZSk7Cisgb3V0OgorCWlmIChyZXEpCisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGlvdl9wYWdlKQorCQlfX2ZyZWVfcGFnZShpb3ZfcGFnZSk7CisJd2hpbGUgKG51bV9wYWdlcykKKwkJX19mcmVlX3BhZ2UocGFnZXNbLS1udW1fcGFnZXNdKTsKKwlrZnJlZShwYWdlcyk7CisKKwlyZXR1cm4gZXJyID8gZXJyIDogb3V0YXJnLnJlc3VsdDsKK30KKworc3RhdGljIGxvbmcgZnVzZV9maWxlX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBmdXNlX2ZpbGVfZG9faW9jdGwoZmlsZSwgY21kLCBhcmcsIDApOworfQorCitzdGF0aWMgbG9uZyBmdXNlX2ZpbGVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBmdXNlX2ZpbGVfZG9faW9jdGwoZmlsZSwgY21kLCBhcmcsIEZVU0VfSU9DVExfQ09NUEFUKTsKK30KKworLyoKKyAqIEFsbCBmaWxlcyB3aGljaCBoYXZlIGJlZW4gcG9sbGVkIGFyZSBsaW5rZWQgdG8gUkIgdHJlZQorICogZnVzZV9jb25uLT5wb2xsZWRfZmlsZXMgd2hpY2ggaXMgaW5kZXhlZCBieSBraC4gIFdhbGsgdGhlIHRyZWUgYW5kCisgKiBmaW5kIHRoZSBtYXRjaGluZyBvbmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqKmZ1c2VfZmluZF9wb2xsZWRfbm9kZShzdHJ1Y3QgZnVzZV9jb25uICpmYywgdTY0IGtoLAorCQkJCQkgICAgICBzdHJ1Y3QgcmJfbm9kZSAqKnBhcmVudF9vdXQpCit7CisJc3RydWN0IHJiX25vZGUgKipsaW5rID0gJmZjLT5wb2xsZWRfZmlsZXMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbGFzdCA9IE5VTEw7CisKKwl3aGlsZSAoKmxpbmspIHsKKwkJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CisKKwkJbGFzdCA9ICpsaW5rOworCQlmZiA9IHJiX2VudHJ5KGxhc3QsIHN0cnVjdCBmdXNlX2ZpbGUsIHBvbGxlZF9ub2RlKTsKKworCQlpZiAoa2ggPCBmZi0+a2gpCisJCQlsaW5rID0gJmxhc3QtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGtoID4gZmYtPmtoKQorCQkJbGluayA9ICZsYXN0LT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGxpbms7CisJfQorCisJaWYgKHBhcmVudF9vdXQpCisJCSpwYXJlbnRfb3V0ID0gbGFzdDsKKwlyZXR1cm4gbGluazsKK30KKworLyoKKyAqIFRoZSBmaWxlIGlzIGFib3V0IHRvIGJlIHBvbGxlZC4gIE1ha2Ugc3VyZSBpdCdzIG9uIHRoZSBwb2xsZWRfZmlsZXMKKyAqIFJCIHRyZWUuICBOb3RlIHRoYXQgZmlsZXMgb25jZSBhZGRlZCB0byB0aGUgcG9sbGVkX2ZpbGVzIHRyZWUgYXJlCisgKiBub3QgcmVtb3ZlZCBiZWZvcmUgdGhlIGZpbGUgaXMgcmVsZWFzZWQuICBUaGlzIGlzIGJlY2F1c2UgYSBmaWxlCisgKiBwb2xsZWQgb25jZSBpcyBsaWtlbHkgdG8gYmUgcG9sbGVkIGFnYWluLgorICovCitzdGF0aWMgdm9pZCBmdXNlX3JlZ2lzdGVyX3BvbGxlZF9maWxlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGUgKmZmKQoreworCXNwaW5fbG9jaygmZmMtPmxvY2spOworCWlmIChSQl9FTVBUWV9OT0RFKCZmZi0+cG9sbGVkX25vZGUpKSB7CisJCXN0cnVjdCByYl9ub2RlICoqbGluaywgKnBhcmVudDsKKworCQlsaW5rID0gZnVzZV9maW5kX3BvbGxlZF9ub2RlKGZjLCBmZi0+a2gsICZwYXJlbnQpOworCQlCVUdfT04oKmxpbmspOworCQlyYl9saW5rX25vZGUoJmZmLT5wb2xsZWRfbm9kZSwgcGFyZW50LCBsaW5rKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZmZi0+cG9sbGVkX25vZGUsICZmYy0+cG9sbGVkX2ZpbGVzKTsKKwl9CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGZ1c2VfZmlsZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3BvbGxfaW4gaW5hcmcgPSB7IC5maCA9IGZmLT5maCwgLmtoID0gZmYtPmtoIH07CisJc3RydWN0IGZ1c2VfcG9sbF9vdXQgb3V0YXJnOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCWludCBlcnI7CisKKwlpZiAoZmMtPm5vX3BvbGwpCisJCXJldHVybiBERUZBVUxUX1BPTExNQVNLOworCisJcG9sbF93YWl0KGZpbGUsICZmZi0+cG9sbF93YWl0LCB3YWl0KTsKKworCS8qCisJICogQXNrIGZvciBub3RpZmljYXRpb24gaWZmIHRoZXJlJ3Mgc29tZW9uZSB3YWl0aW5nIGZvciBpdC4KKwkgKiBUaGUgY2xpZW50IG1heSBpZ25vcmUgdGhlIGZsYWcgYW5kIGFsd2F5cyBub3RpZnkuCisJICovCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmZmLT5wb2xsX3dhaXQpKSB7CisJCWluYXJnLmZsYWdzIHw9IEZVU0VfUE9MTF9TQ0hFRFVMRV9OT1RJRlk7CisJCWZ1c2VfcmVnaXN0ZXJfcG9sbGVkX2ZpbGUoZmMsIGZmKTsKKwl9CisKKwlyZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCWlmIChJU19FUlIocmVxKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVxKTsKKworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1BPTEw7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCisJaWYgKCFlcnIpCisJCXJldHVybiBvdXRhcmcucmV2ZW50czsKKwlpZiAoZXJyID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX3BvbGwgPSAxOworCQlyZXR1cm4gREVGQVVMVF9QT0xMTUFTSzsKKwl9CisJcmV0dXJuIFBPTExFUlI7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGZ1c2VfaGFuZGxlX25vdGlmeSgpIG9uIEZVU0VfTk9USUZZX1BPTEwgYW5kCisgKiB3YWtlcyB1cCB0aGUgcG9sbCB3YWl0ZXJzLgorICovCitpbnQgZnVzZV9ub3RpZnlfcG9sbF93YWtldXAoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkgICAgc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCAqb3V0YXJnKQoreworCXU2NCBraCA9IG91dGFyZy0+a2g7CisJc3RydWN0IHJiX25vZGUgKipsaW5rOworCisJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisKKwlsaW5rID0gZnVzZV9maW5kX3BvbGxlZF9ub2RlKGZjLCBraCwgTlVMTCk7CisJaWYgKCpsaW5rKSB7CisJCXN0cnVjdCBmdXNlX2ZpbGUgKmZmOworCisJCWZmID0gcmJfZW50cnkoKmxpbmssIHN0cnVjdCBmdXNlX2ZpbGUsIHBvbGxlZF9ub2RlKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmMoJmZmLT5wb2xsX3dhaXQpOworCX0KKworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZnVzZV9maWxlX2xsc2VlaywKIAkucmVhZAkJPSBkb19zeW5jX3JlYWQsCkBAIC0xNDg0LDYgKzE4OTcsOSBAQAogCS5sb2NrCQk9IGZ1c2VfZmlsZV9sb2NrLAogCS5mbG9jawkJPSBmdXNlX2ZpbGVfZmxvY2ssCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAorCS51bmxvY2tlZF9pb2N0bAk9IGZ1c2VfZmlsZV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gZnVzZV9maWxlX2NvbXBhdF9pb2N0bCwKKwkucG9sbAkJPSBmdXNlX2ZpbGVfcG9sbCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyZWN0X2lvX2ZpbGVfb3BlcmF0aW9ucyA9IHsKQEAgLTE0OTYsNiArMTkxMiw5IEBACiAJLmZzeW5jCQk9IGZ1c2VfZnN5bmMsCiAJLmxvY2sJCT0gZnVzZV9maWxlX2xvY2ssCiAJLmZsb2NrCQk9IGZ1c2VfZmlsZV9mbG9jaywKKwkudW5sb2NrZWRfaW9jdGwJPSBmdXNlX2ZpbGVfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IGZ1c2VfZmlsZV9jb21wYXRfaW9jdGwsCisJLnBvbGwJCT0gZnVzZV9maWxlX3BvbGwsCiAJLyogbm8gbW1hcCBhbmQgc3BsaWNlX3JlYWQgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IDM1YWNjZmQuLjVlNjRiODEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogLyoqIE1heCBudW1iZXIgb2YgcGFnZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbmdsZSByZWFkIHJlcXVlc3QgKi8KICNkZWZpbmUgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSAzMgpAQCAtMTAwLDYgKzEwMiw5IEBACiAJLyoqIFJlcXVlc3QgcmVzZXJ2ZWQgZm9yIGZsdXNoIGFuZCByZWxlYXNlICovCiAJc3RydWN0IGZ1c2VfcmVxICpyZXNlcnZlZF9yZXE7CiAKKwkvKiogS2VybmVsIGZpbGUgaGFuZGxlIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlICovCisJdTY0IGtoOworCiAJLyoqIEZpbGUgaGFuZGxlIHVzZWQgYnkgdXNlcnNwYWNlICovCiAJdTY0IGZoOwogCkBAIC0xMDgsNiArMTEzLDEyIEBACiAKIAkvKiogRW50cnkgb24gaW5vZGUncyB3cml0ZV9maWxlcyBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCB3cml0ZV9lbnRyeTsKKworCS8qKiBSQiBub2RlIHRvIGJlIGxpbmtlZCBvbiBmdXNlX2Nvbm4tPnBvbGxlZF9maWxlcyAqLworCXN0cnVjdCByYl9ub2RlIHBvbGxlZF9ub2RlOworCisJLyoqIFdhaXQgcXVldWUgaGVhZCBmb3IgcG9sbCAqLworCXdhaXRfcXVldWVfaGVhZF90IHBvbGxfd2FpdDsKIH07CiAKIC8qKiBPbmUgaW5wdXQgYXJndW1lbnQgb2YgYSByZXF1ZXN0ICovCkBAIC0zMjIsNiArMzMzLDEyIEBACiAJLyoqIFRoZSBsaXN0IG9mIHJlcXVlc3RzIHVuZGVyIEkvTyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaW87CiAKKwkvKiogVGhlIG5leHQgdW5pcXVlIGtlcm5lbCBmaWxlIGhhbmRsZSAqLworCXU2NCBraGN0cjsKKworCS8qKiByYnRyZWUgb2YgZnVzZV9maWxlcyB3YWl0aW5nIGZvciBwb2xsIGV2ZW50cyBpbmRleGVkIGJ5IHBoICovCisJc3RydWN0IHJiX3Jvb3QgcG9sbGVkX2ZpbGVzOworCiAJLyoqIE51bWJlciBvZiByZXF1ZXN0cyBjdXJyZW50bHkgaW4gdGhlIGJhY2tncm91bmQgKi8KIAl1bnNpZ25lZCBudW1fYmFja2dyb3VuZDsKIApAQCAtMzU1LDE5ICszNzIsMTkgQEAKIAkvKiogQ29ubmVjdGlvbiBmYWlsZWQgKHZlcnNpb24gbWlzbWF0Y2gpLiAgQ2Fubm90IHJhY2Ugd2l0aAogCSAgICBzZXR0aW5nIG90aGVyIGJpdGZpZWxkcyBzaW5jZSBpdCBpcyBvbmx5IHNldCBvbmNlIGluIElOSVQKIAkgICAgcmVwbHksIGJlZm9yZSBhbnkgb3RoZXIgcmVxdWVzdCwgYW5kIG5ldmVyIGNsZWFyZWQgKi8KLQl1bnNpZ25lZCBjb25uX2Vycm9yIDogMTsKKwl1bnNpZ25lZCBjb25uX2Vycm9yOjE7CiAKIAkvKiogQ29ubmVjdGlvbiBzdWNjZXNzZnVsLiAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGNvbm5faW5pdCA6IDE7CisJdW5zaWduZWQgY29ubl9pbml0OjE7CiAKIAkvKiogRG8gcmVhZHBhZ2VzIGFzeW5jaHJvbm91c2x5PyAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGFzeW5jX3JlYWQgOiAxOworCXVuc2lnbmVkIGFzeW5jX3JlYWQ6MTsKIAogCS8qKiBEbyBub3Qgc2VuZCBzZXBhcmF0ZSBTRVRBVFRSIHJlcXVlc3QgYmVmb3JlIG9wZW4oT19UUlVOQykgICovCi0JdW5zaWduZWQgYXRvbWljX29fdHJ1bmMgOiAxOworCXVuc2lnbmVkIGF0b21pY19vX3RydW5jOjE7CiAKIAkvKiogRmlsZXN5c3RlbSBzdXBwb3J0cyBORlMgZXhwb3J0aW5nLiAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGV4cG9ydF9zdXBwb3J0IDogMTsKKwl1bnNpZ25lZCBleHBvcnRfc3VwcG9ydDoxOwogCiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIGJpdGZpZWxkcyBhcmUgb25seSBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzCkBAIC0zNzUsNDMgKzM5Miw0NiBAQAogCSAqLwogCiAJLyoqIElzIGZzeW5jIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19mc3luYyA6IDE7CisJdW5zaWduZWQgbm9fZnN5bmM6MTsKIAogCS8qKiBJcyBmc3luY2RpciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fZnN5bmNkaXIgOiAxOworCXVuc2lnbmVkIG5vX2ZzeW5jZGlyOjE7CiAKIAkvKiogSXMgZmx1c2ggbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2ZsdXNoIDogMTsKKwl1bnNpZ25lZCBub19mbHVzaDoxOwogCiAJLyoqIElzIHNldHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19zZXR4YXR0ciA6IDE7CisJdW5zaWduZWQgbm9fc2V0eGF0dHI6MTsKIAogCS8qKiBJcyBnZXR4YXR0ciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fZ2V0eGF0dHIgOiAxOworCXVuc2lnbmVkIG5vX2dldHhhdHRyOjE7CiAKIAkvKiogSXMgbGlzdHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19saXN0eGF0dHIgOiAxOworCXVuc2lnbmVkIG5vX2xpc3R4YXR0cjoxOwogCiAJLyoqIElzIHJlbW92ZXhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19yZW1vdmV4YXR0ciA6IDE7CisJdW5zaWduZWQgbm9fcmVtb3ZleGF0dHI6MTsKIAogCS8qKiBBcmUgZmlsZSBsb2NraW5nIHByaW1pdGl2ZXMgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2xvY2sgOiAxOworCXVuc2lnbmVkIG5vX2xvY2s6MTsKIAogCS8qKiBJcyBhY2Nlc3Mgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2FjY2VzcyA6IDE7CisJdW5zaWduZWQgbm9fYWNjZXNzOjE7CiAKIAkvKiogSXMgY3JlYXRlIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19jcmVhdGUgOiAxOworCXVuc2lnbmVkIG5vX2NyZWF0ZToxOwogCiAJLyoqIElzIGludGVycnVwdCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9faW50ZXJydXB0IDogMTsKKwl1bnNpZ25lZCBub19pbnRlcnJ1cHQ6MTsKIAogCS8qKiBJcyBibWFwIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19ibWFwIDogMTsKKwl1bnNpZ25lZCBub19ibWFwOjE7CisKKwkvKiogSXMgcG9sbCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fcG9sbDoxOwogCiAJLyoqIERvIG11bHRpLXBhZ2UgY2FjaGVkIHdyaXRlcyAqLwotCXVuc2lnbmVkIGJpZ193cml0ZXMgOiAxOworCXVuc2lnbmVkIGJpZ193cml0ZXM6MTsKIAogCS8qKiBUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24gKi8KIAlhdG9taWNfdCBudW1fd2FpdGluZzsKQEAgLTQ0NSw2ICs0NjUsOSBAQAogCiAJLyoqIFZlcnNpb24gY291bnRlciBmb3IgYXR0cmlidXRlIGNoYW5nZXMgKi8KIAl1NjQgYXR0cl92ZXJzaW9uOworCisJLyoqIENhbGxlZCBvbiBmaW5hbCBwdXQgKi8KKwl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGZ1c2VfY29ubiAqKTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Z1c2VfY29ubl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpAQCAtNDk5LDcgKzUyMiw3IEBACiAgKi8KIGludCBmdXNlX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpOwogCi1zdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Modm9pZCk7CitzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Moc3RydWN0IGZ1c2VfY29ubiAqZmMpOwogdm9pZCBmdXNlX2ZpbGVfZnJlZShzdHJ1Y3QgZnVzZV9maWxlICpmZik7CiB2b2lkIGZ1c2VfZmluaXNoX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGUgKmZmLCBzdHJ1Y3QgZnVzZV9vcGVuX291dCAqb3V0YXJnKTsKQEAgLTUxOSw2ICs1NDIsMTIgQEAKIAkJICAgICAgaW50IGlzZGlyKTsKIAogLyoqCisgKiBOb3RpZnkgcG9sbCB3YWtldXAKKyAqLworaW50IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJICAgIHN0cnVjdCBmdXNlX25vdGlmeV9wb2xsX3dha2V1cF9vdXQgKm91dGFyZyk7CisKKy8qKgogICogSW5pdGlhbGl6ZSBmaWxlIG9wZXJhdGlvbnMgb24gYSByZWd1bGFyIGZpbGUKICAqLwogdm9pZCBmdXNlX2luaXRfZmlsZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTU5MywxOSArNjIyLDIwIEBACiAvKioKICAqIFNlbmQgYSByZXF1ZXN0IChzeW5jaHJvbm91cykKICAqLwotdm9pZCByZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKIAogLyoqCiAgKiBTZW5kIGEgcmVxdWVzdCB3aXRoIG5vIHJlcGx5CiAgKi8KLXZvaWQgcmVxdWVzdF9zZW5kX25vcmVwbHkoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCiAvKioKICAqIFNlbmQgYSByZXF1ZXN0IGluIHRoZSBiYWNrZ3JvdW5kCiAgKi8KLXZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCi12b2lkIHJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkJIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKIAogLyogQWJvcnQgYWxsIHJlcXVlc3RzICovCiB2b2lkIGZ1c2VfYWJvcnRfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CkBAIC02MjMsNiArNjUzLDExIEBACiBzdHJ1Y3QgZnVzZV9jb25uICpmdXNlX2Nvbm5fZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKIAogLyoqCisgKiBJbml0aWFsaXplIGZ1c2VfY29ubgorICovCitpbnQgZnVzZV9jb25uX2luaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCisvKioKICAqIFJlbGVhc2UgcmVmZXJlbmNlIHRvIGZ1c2VfY29ubgogICovCiB2b2lkIGZ1c2VfY29ubl9wdXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IDJlOTlmMzQuLjQ3Yzk2ZmQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQotICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgogICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTM3LDEwICszNywxMCBAQAogCXVuc2lnbmVkIHJvb3Rtb2RlOwogCXVuc2lnbmVkIHVzZXJfaWQ7CiAJdW5zaWduZWQgZ3JvdXBfaWQ7Ci0JdW5zaWduZWQgZmRfcHJlc2VudCA6IDE7Ci0JdW5zaWduZWQgcm9vdG1vZGVfcHJlc2VudCA6IDE7Ci0JdW5zaWduZWQgdXNlcl9pZF9wcmVzZW50IDogMTsKLQl1bnNpZ25lZCBncm91cF9pZF9wcmVzZW50IDogMTsKKwl1bnNpZ25lZCBmZF9wcmVzZW50OjE7CisJdW5zaWduZWQgcm9vdG1vZGVfcHJlc2VudDoxOworCXVuc2lnbmVkIHVzZXJfaWRfcHJlc2VudDoxOworCXVuc2lnbmVkIGdyb3VwX2lkX3ByZXNlbnQ6MTsKIAl1bnNpZ25lZCBmbGFnczsKIAl1bnNpZ25lZCBtYXhfcmVhZDsKIAl1bnNpZ25lZCBibGtzaXplOwpAQCAtOTQsNyArOTQsNyBAQAogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfZm9yZ2V0X2luKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKLQlyZXF1ZXN0X3NlbmRfbm9yZXBseShmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCBmdXNlX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC0yNTAsNyArMjUwLDcgQEAKIAogCWZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwotCWZpLT5ubG9va3VwICsrOworCWZpLT5ubG9va3VwKys7CiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCBhdHRyLCBhdHRyX3ZhbGlkLCBhdHRyX3ZlcnNpb24pOwogCkBAIC0yNjksNyArMjY5LDcgQEAKIAkJZmMtPmRlc3Ryb3lfcmVxID0gTlVMTDsKIAkJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfREVTVFJPWTsKIAkJcmVxLT5mb3JjZSA9IDE7Ci0JCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwkJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJfQogfQpAQCAtMzM0LDcgKzMzNCw3IEBACiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0KIAkJZmMtPm1pbm9yIDwgNCA/IEZVU0VfQ09NUEFUX1NUQVRGU19TSVpFIDogc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFlcnIpCiAJCWNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCAmb3V0YXJnLnN0KTsKQEAgLTQ2Miw2OCArNDYyLDY5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZnVzZV9jb25uICpuZXdfY29ubihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoraW50IGZ1c2VfY29ubl9pbml0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOwogCWludCBlcnI7CiAKLQlmYyA9IGt6YWxsb2Moc2l6ZW9mKCpmYyksIEdGUF9LRVJORUwpOwotCWlmIChmYykgewotCQlzcGluX2xvY2tfaW5pdCgmZmMtPmxvY2spOwotCQltdXRleF9pbml0KCZmYy0+aW5zdF9tdXRleCk7Ci0JCWF0b21pY19zZXQoJmZjLT5jb3VudCwgMSk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT53YWl0cSk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5ibG9ja2VkX3dhaXRxKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPnJlc2VydmVkX3JlcV93YWl0cSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+cGVuZGluZyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+cHJvY2Vzc2luZyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+aW8pOwotCQlJTklUX0xJU1RfSEVBRCgmZmMtPmludGVycnVwdHMpOwotCQlJTklUX0xJU1RfSEVBRCgmZmMtPmJnX3F1ZXVlKTsKLQkJYXRvbWljX3NldCgmZmMtPm51bV93YWl0aW5nLCAwKTsKLQkJZmMtPmJkaS5yYV9wYWdlcyA9IChWTV9NQVhfUkVBREFIRUFEICogMTAyNCkgLyBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWZjLT5iZGkudW5wbHVnX2lvX2ZuID0gZGVmYXVsdF91bnBsdWdfaW9fZm47Ci0JCS8qIGZ1c2UgZG9lcyBpdCdzIG93biB3cml0ZWJhY2sgYWNjb3VudGluZyAqLwotCQlmYy0+YmRpLmNhcGFiaWxpdGllcyA9IEJESV9DQVBfTk9fQUNDVF9XQjsKLQkJZmMtPmRldiA9IHNiLT5zX2RldjsKLQkJZXJyID0gYmRpX2luaXQoJmZjLT5iZGkpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJvcl9rZnJlZTsKLQkJaWYgKHNiLT5zX2JkZXYpIHsKLQkJCWVyciA9IGJkaV9yZWdpc3RlcigmZmMtPmJkaSwgTlVMTCwgIiV1OiV1LWZ1c2VibGsiLAotCQkJCQkgICBNQUpPUihmYy0+ZGV2KSwgTUlOT1IoZmMtPmRldikpOwotCQl9IGVsc2UgewotCQkJZXJyID0gYmRpX3JlZ2lzdGVyX2RldigmZmMtPmJkaSwgZmMtPmRldik7Ci0JCX0KLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyb3JfYmRpX2Rlc3Ryb3k7Ci0JCS8qCi0JCSAqIEZvciBhIHNpbmdsZSBmdXNlIGZpbGVzeXN0ZW0gdXNlIG1heCAxJSBvZiBkaXJ0eSArCi0JCSAqIHdyaXRlYmFjayB0aHJlc2hvbGQuCi0JCSAqCi0JCSAqIFRoaXMgZ2l2ZXMgYWJvdXQgMU0gb2Ygd3JpdGUgYnVmZmVyIGZvciBtZW1vcnkgbWFwcyBvbiBhCi0JCSAqIG1hY2hpbmUgd2l0aCAxRyBhbmQgMTAlIGRpcnR5X3JhdGlvLCB3aGljaCBzaG91bGQgYmUgbW9yZQotCQkgKiB0aGFuIGVub3VnaC4KLQkJICoKLQkJICogUHJpdmlsZWdlZCB1c2VycyBjYW4gcmFpc2UgaXQgYnkgd3JpdGluZyB0bwotCQkgKgotCQkgKiAgICAvc3lzL2NsYXNzL2JkaS88YmRpPi9tYXhfcmF0aW8KLQkJICovCi0JCWJkaV9zZXRfbWF4X3JhdGlvKCZmYy0+YmRpLCAxKTsKLQkJZmMtPnJlcWN0ciA9IDA7Ci0JCWZjLT5ibG9ja2VkID0gMTsKLQkJZmMtPmF0dHJfdmVyc2lvbiA9IDE7Ci0JCWdldF9yYW5kb21fYnl0ZXMoJmZjLT5zY3JhbWJsZV9rZXksIHNpemVvZihmYy0+c2NyYW1ibGVfa2V5KSk7CisJbWVtc2V0KGZjLCAwLCBzaXplb2YoKmZjKSk7CisJc3Bpbl9sb2NrX2luaXQoJmZjLT5sb2NrKTsKKwltdXRleF9pbml0KCZmYy0+aW5zdF9tdXRleCk7CisJYXRvbWljX3NldCgmZmMtPmNvdW50LCAxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+d2FpdHEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5ibG9ja2VkX3dhaXRxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+cmVzZXJ2ZWRfcmVxX3dhaXRxKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPnBlbmRpbmcpOworCUlOSVRfTElTVF9IRUFEKCZmYy0+cHJvY2Vzc2luZyk7CisJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbyk7CisJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbnRlcnJ1cHRzKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPmJnX3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPmVudHJ5KTsKKwlhdG9taWNfc2V0KCZmYy0+bnVtX3dhaXRpbmcsIDApOworCWZjLT5iZGkucmFfcGFnZXMgPSAoVk1fTUFYX1JFQURBSEVBRCAqIDEwMjQpIC8gUEFHRV9DQUNIRV9TSVpFOworCWZjLT5iZGkudW5wbHVnX2lvX2ZuID0gZGVmYXVsdF91bnBsdWdfaW9fZm47CisJLyogZnVzZSBkb2VzIGl0J3Mgb3duIHdyaXRlYmFjayBhY2NvdW50aW5nICovCisJZmMtPmJkaS5jYXBhYmlsaXRpZXMgPSBCRElfQ0FQX05PX0FDQ1RfV0I7CisJZmMtPmtoY3RyID0gMDsKKwlmYy0+cG9sbGVkX2ZpbGVzID0gUkJfUk9PVDsKKwlmYy0+ZGV2ID0gc2ItPnNfZGV2OworCWVyciA9IGJkaV9pbml0KCZmYy0+YmRpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX211dGV4X2Rlc3Ryb3k7CisJaWYgKHNiLT5zX2JkZXYpIHsKKwkJZXJyID0gYmRpX3JlZ2lzdGVyKCZmYy0+YmRpLCBOVUxMLCAiJXU6JXUtZnVzZWJsayIsCisJCQkJICAgTUFKT1IoZmMtPmRldiksIE1JTk9SKGZjLT5kZXYpKTsKKwl9IGVsc2UgeworCQllcnIgPSBiZGlfcmVnaXN0ZXJfZGV2KCZmYy0+YmRpLCBmYy0+ZGV2KTsKIAl9Ci0JcmV0dXJuIGZjOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfYmRpX2Rlc3Ryb3k7CisJLyoKKwkgKiBGb3IgYSBzaW5nbGUgZnVzZSBmaWxlc3lzdGVtIHVzZSBtYXggMSUgb2YgZGlydHkgKworCSAqIHdyaXRlYmFjayB0aHJlc2hvbGQuCisJICoKKwkgKiBUaGlzIGdpdmVzIGFib3V0IDFNIG9mIHdyaXRlIGJ1ZmZlciBmb3IgbWVtb3J5IG1hcHMgb24gYQorCSAqIG1hY2hpbmUgd2l0aCAxRyBhbmQgMTAlIGRpcnR5X3JhdGlvLCB3aGljaCBzaG91bGQgYmUgbW9yZQorCSAqIHRoYW4gZW5vdWdoLgorCSAqCisJICogUHJpdmlsZWdlZCB1c2VycyBjYW4gcmFpc2UgaXQgYnkgd3JpdGluZyB0bworCSAqCisJICogICAgL3N5cy9jbGFzcy9iZGkvPGJkaT4vbWF4X3JhdGlvCisJICovCisJYmRpX3NldF9tYXhfcmF0aW8oJmZjLT5iZGksIDEpOworCWZjLT5yZXFjdHIgPSAwOworCWZjLT5ibG9ja2VkID0gMTsKKwlmYy0+YXR0cl92ZXJzaW9uID0gMTsKKwlnZXRfcmFuZG9tX2J5dGVzKCZmYy0+c2NyYW1ibGVfa2V5LCBzaXplb2YoZmMtPnNjcmFtYmxlX2tleSkpOwogCi1lcnJvcl9iZGlfZGVzdHJveToKKwlyZXR1cm4gMDsKKworIGVycm9yX2JkaV9kZXN0cm95OgogCWJkaV9kZXN0cm95KCZmYy0+YmRpKTsKLWVycm9yX2tmcmVlOgorIGVycm9yX211dGV4X2Rlc3Ryb3k6CiAJbXV0ZXhfZGVzdHJveSgmZmMtPmluc3RfbXV0ZXgpOwotCWtmcmVlKGZjKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZnVzZV9jb25uX2luaXQpOwogCiB2b2lkIGZ1c2VfY29ubl9wdXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CkBAIC01MzIsNyArNTMzLDcgQEAKIAkJCWZ1c2VfcmVxdWVzdF9mcmVlKGZjLT5kZXN0cm95X3JlcSk7CiAJCW11dGV4X2Rlc3Ryb3koJmZjLT5pbnN0X211dGV4KTsKIAkJYmRpX2Rlc3Ryb3koJmZjLT5iZGkpOwotCQlrZnJlZShmYyk7CisJCWZjLT5yZWxlYXNlKGZjKTsKIAl9CiB9CiAKQEAgLTU0Miw3ICs1NDMsNyBAQAogCXJldHVybiBmYzsKIH0KIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmZ1c2VfZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKIHsKIAlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7CiAJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOwpAQCAtNTUzLDggKzU1NCw3IEBACiAJcmV0dXJuIGZ1c2VfaWdldChzYiwgMSwgMCwgJmF0dHIsIDAsIDApOwogfQogCi1zdHJ1Y3QgZnVzZV9pbm9kZV9oYW5kbGUKLXsKK3N0cnVjdCBmdXNlX2lub2RlX2hhbmRsZSB7CiAJdTY0IG5vZGVpZDsKIAl1MzIgZ2VuZXJhdGlvbjsKIH07CkBAIC03NjEsNyArNzYxLDYgQEAKIAkJZmMtPm1heF93cml0ZSA9IG1heF90KHVuc2lnbmVkLCA0MDk2LCBmYy0+bWF4X3dyaXRlKTsKIAkJZmMtPmNvbm5faW5pdCA9IDE7CiAJfQotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJZmMtPmJsb2NrZWQgPSAwOwogCXdha2VfdXBfYWxsKCZmYy0+YmxvY2tlZF93YWl0cSk7CiB9CkBAIC03ODcsNyArNzg2LDEyIEBACiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKHN0cnVjdCBmdXNlX2luaXRfb3V0KTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJnJlcS0+bWlzYy5pbml0X291dDsKIAlyZXEtPmVuZCA9IHByb2Nlc3NfaW5pdF9yZXBseTsKLQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2ZyZWVfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlrZnJlZShmYyk7CiB9CiAKIHN0YXRpYyBpbnQgZnVzZV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCkBAIC04MjgsMTAgKzgzMiwxNyBAQAogCWlmIChmaWxlLT5mX29wICE9ICZmdXNlX2Rldl9vcGVyYXRpb25zKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZjID0gbmV3X2Nvbm4oc2IpOworCWZjID0ga21hbGxvYyhzaXplb2YoKmZjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwllcnIgPSBmdXNlX2Nvbm5faW5pdChmYywgc2IpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoZmMpOworCQlyZXR1cm4gZXJyOworCX0KKworCWZjLT5yZWxlYXNlID0gZnVzZV9mcmVlX2Nvbm47CiAJZmMtPmZsYWdzID0gZC5mbGFnczsKIAlmYy0+dXNlcl9pZCA9IGQudXNlcl9pZDsKIAlmYy0+Z3JvdXBfaWQgPSBkLmdyb3VwX2lkOwpAQCAtODQxLDcgKzg1Miw3IEBACiAJc2ItPnNfZnNfaW5mbyA9IGZjOwogCiAJZXJyID0gLUVOT01FTTsKLQlyb290ID0gZ2V0X3Jvb3RfaW5vZGUoc2IsIGQucm9vdG1vZGUpOworCXJvb3QgPSBmdXNlX2dldF9yb290X2lub2RlKHNiLCBkLnJvb3Rtb2RlKTsKIAlpZiAoIXJvb3QpCiAJCWdvdG8gZXJyOwogCkBAIC05NTIsNyArOTYzLDcgQEAKIAogc3RhdGljIHZvaWQgZnVzZV9pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZm9vOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmb287CiAKIAlpbm9kZV9pbml0X29uY2UoaW5vZGUpOwogfQpAQCAtMTAzMSw3ICsxMDQyLDcgQEAKIHsKIAlpbnQgcmVzOwogCi0JcHJpbnRrKCJmdXNlIGluaXQgKEFQSSB2ZXJzaW9uICVpLiVpKVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJmdXNlIGluaXQgKEFQSSB2ZXJzaW9uICVpLiVpKVxuIiwKIAkgICAgICAgRlVTRV9LRVJORUxfVkVSU0lPTiwgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTik7CiAKIAlJTklUX0xJU1RfSEVBRCgmZnVzZV9jb25uX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZnMvaHVnZXRsYmZzL2lub2RlLmMgYi9mcy9odWdldGxiZnMvaW5vZGUuYwppbmRleCAwYWIwYzZmNS4uNjkwM2QzNyAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTI1Miw2ICsyNTIsNyBAQAogCWZvciAoOzspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJCXVuc2lnbmVkIGxvbmcgbnIsIHJldDsKKwkJaW50IHJhOwogCiAJCS8qIG5yIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gdGhpcyBwYWdlICovCiAJCW5yID0gaHVnZV9wYWdlX3NpemUoaCk7CkBAIC0yNzQsMTYgKzI3NSwxOSBAQAogCQkJICovCiAJCQlyZXQgPSBsZW4gPCBuciA/IGxlbiA6IG5yOwogCQkJaWYgKGNsZWFyX3VzZXIoYnVmLCByZXQpKQotCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJcmEgPSAtRUZBVUxUOworCQkJZWxzZQorCQkJCXJhID0gMDsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBXZSBoYXZlIHRoZSBwYWdlLCBjb3B5IGl0IHRvIHVzZXIgc3BhY2UgYnVmZmVyLgogCQkJICovCi0JCQlyZXQgPSBodWdldGxiZnNfcmVhZF9hY3RvcihwYWdlLCBvZmZzZXQsIGJ1ZiwgbGVuLCBucik7CisJCQlyYSA9IGh1Z2V0bGJmc19yZWFkX2FjdG9yKHBhZ2UsIG9mZnNldCwgYnVmLCBsZW4sIG5yKTsKKwkJCXJldCA9IHJhOwogCQl9Ci0JCWlmIChyZXQgPCAwKSB7CisJCWlmIChyYSA8IDApIHsKIAkJCWlmIChyZXR2YWwgPT0gMCkKLQkJCQlyZXR2YWwgPSByZXQ7CisJCQkJcmV0dmFsID0gcmE7CiAJCQlpZiAocGFnZSkKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IGJkNDhlNWUuLjdhNmU4YzIgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMTEwLDggKzExMCw4IEBACiAKIC8qKgogICogaW5vZGVfaW5pdF9hbHdheXMgLSBwZXJmb3JtIGlub2RlIHN0cnVjdHVyZSBpbnRpYWxpc2F0aW9uCi0gKiBAc2IJCS0gc3VwZXJibG9jayBpbm9kZSBiZWxvbmdzIHRvLgotICogQGlub2RlCS0gaW5vZGUgdG8gaW5pdGlhbGlzZQorICogQHNiOiBzdXBlcmJsb2NrIGlub2RlIGJlbG9uZ3MgdG8KKyAqIEBpbm9kZTogaW5vZGUgdG8gaW5pdGlhbGlzZQogICoKICAqIFRoZXNlIGFyZSBpbml0aWFsaXphdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGRvbmUgb24gZXZlcnkgaW5vZGUKICAqIGFsbG9jYXRpb24gYXMgdGhlIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpc2VkIGJ5IHNsYWIgYWxsb2NhdGlvbi4KQEAgLTE2Niw3ICsxNjYsNyBAQAogCW1hcHBpbmctPmFfb3BzID0gJmVtcHR5X2FvcHM7CiAJbWFwcGluZy0+aG9zdCA9IGlub2RlOwogCW1hcHBpbmctPmZsYWdzID0gMDsKLQltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFKTsKKwltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfTU9WQUJMRSk7CiAJbWFwcGluZy0+YXNzb2NfbWFwcGluZyA9IE5VTEw7CiAJbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CiAJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gMDsKQEAgLTU3Niw4ICs1NzYsOCBAQAogCiAvKioKICAqIGlub2RlX2FkZF90b19saXN0cyAtIGFkZCBhIG5ldyBpbm9kZSB0byByZWxldmFudCBsaXN0cwotICogQHNiCQktIHN1cGVyYmxvY2sgaW5vZGUgYmVsb25ncyB0by4KLSAqIEBpbm9kZQktIGlub2RlIHRvIG1hcmsgaW4gdXNlCisgKiBAc2I6IHN1cGVyYmxvY2sgaW5vZGUgYmVsb25ncyB0bworICogQGlub2RlOiBpbm9kZSB0byBtYXJrIGluIHVzZQogICoKICAqIFdoZW4gYW4gaW5vZGUgaXMgYWxsb2NhdGVkIGl0IG5lZWRzIHRvIGJlIGFjY291bnRlZCBmb3IsIGFkZGVkIHRvIHRoZSBpbiB1c2UKICAqIGxpc3QsIHRoZSBvd25pbmcgc3VwZXJibG9jayBhbmQgdGhlIGlub2RlIGhhc2guIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSB1bmRlcgpAQCAtNjAxLDcgKzYwMSw3IEBACiAgKglAc2I6IHN1cGVyYmxvY2sKICAqCiAgKglBbGxvY2F0ZXMgYSBuZXcgaW5vZGUgZm9yIGdpdmVuIHN1cGVyYmxvY2suIFRoZSBkZWZhdWx0IGdmcF9tYXNrCi0gKglmb3IgYWxsb2NhdGlvbnMgcmVsYXRlZCB0byBpbm9kZS0+aV9tYXBwaW5nIGlzIEdGUF9ISUdIVVNFUl9QQUdFQ0FDSEUuCisgKglmb3IgYWxsb2NhdGlvbnMgcmVsYXRlZCB0byBpbm9kZS0+aV9tYXBwaW5nIGlzIEdGUF9ISUdIVVNFUl9NT1ZBQkxFLgogICoJSWYgSElHSE1FTSBwYWdlcyBhcmUgdW5zdWl0YWJsZSBvciBpdCBpcyBrbm93biB0aGF0IHBhZ2VzIGFsbG9jYXRlZAogICoJZm9yIHRoZSBwYWdlIGNhY2hlIGFyZSBub3QgcmVjbGFpbWFibGUgb3IgbWlncmF0YWJsZSwKICAqCW1hcHBpbmdfc2V0X2dmcF9tYXNrKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBzdWl0YWJsZSBmbGFncyBvbiB0aGUKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2Rpci5jIGIvZnMvbWluaXgvZGlyLmMKaW5kZXggZjcwNDMzOC4uZDQ5NDZjNCAxMDA2NDQKLS0tIGEvZnMvbWluaXgvZGlyLmMKKysrIGIvZnMvbWluaXgvZGlyLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCXJldHVybiAtRUlOVkFMOwogCiBnb3RfaXQ6Ci0JcG9zID0gKHBhZ2UtPmluZGV4ID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgcCAtIChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJcG9zID0gcGFnZV9vZmZzZXQocGFnZSkgKyBwIC0gKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZSk7CiAJZXJyID0gX19taW5peF93cml0ZV9iZWdpbihOVUxMLCBwYWdlLT5tYXBwaW5nLCBwb3MsIHNiaS0+c19kaXJzaXplLAogCQkJCQlBT1BfRkxBR19VTklOVEVSUlVQVElCTEUsICZwYWdlLCBOVUxMKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZnMvbXBhZ2UuYyBiL2ZzL21wYWdlLmMKaW5kZXggNTUyYjgwYi4uMTZjM2VmMyAxMDA2NDQKLS0tIGEvZnMvbXBhZ2UuYworKysgYi9mcy9tcGFnZS5jCkBAIC0yNDEsNyArMjQxLDYgQEAKIAkJCQlmaXJzdF9ob2xlID0gcGFnZV9ibG9jazsKIAkJCXBhZ2VfYmxvY2srKzsKIAkJCWJsb2NrX2luX2ZpbGUrKzsKLQkJCWNsZWFyX2J1ZmZlcl9tYXBwZWQobWFwX2JoKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTMwOCw3ICszMDcsMTAgQEAKIAkJZ290byBhbGxvY19uZXc7CiAJfQogCi0JaWYgKGJ1ZmZlcl9ib3VuZGFyeShtYXBfYmgpIHx8IChmaXJzdF9ob2xlICE9IGJsb2Nrc19wZXJfcGFnZSkpCisJcmVsYXRpdmVfYmxvY2sgPSBibG9ja19pbl9maWxlIC0gKmZpcnN0X2xvZ2ljYWxfYmxvY2s7CisJbmJsb2NrcyA9IG1hcF9iaC0+Yl9zaXplID4+IGJsa2JpdHM7CisJaWYgKChidWZmZXJfYm91bmRhcnkobWFwX2JoKSAmJiByZWxhdGl2ZV9ibG9jayA9PSBuYmxvY2tzKSB8fAorCSAgICAoZmlyc3RfaG9sZSAhPSBibG9ja3NfcGVyX3BhZ2UpKQogCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFJFQUQsIGJpbyk7CiAJZWxzZQogCQkqbGFzdF9ibG9ja19pbl9iaW8gPSBibG9ja3NbYmxvY2tzX3Blcl9wYWdlIC0gMV07CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9nZXRvcHQuYyBiL2ZzL25jcGZzL2dldG9wdC5jCmluZGV4IDMzNWIwMDMuLjBhZjMzNDkgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2dldG9wdC5jCisrKyBiL2ZzL25jcGZzL2dldG9wdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAgKglAb3B0czogYW4gYXJyYXkgb2YgJnN0cnVjdCBvcHRpb24gZW50cmllcyBjb250cm9sbGluZyBwYXJzZXIgb3BlcmF0aW9ucwogICoJQG9wdG9wdDogb3V0cHV0OyB3aWxsIGNvbnRhaW4gdGhlIGN1cnJlbnQgb3B0aW9uCiAgKglAb3B0YXJnOiBvdXRwdXQ7IHdpbGwgY29udGFpbiB0aGUgdmFsdWUgKGlmIG9uZSBleGlzdHMpCi0gKglAZmxhZzogb3V0cHV0OyBtYXkgYmUgTlVMTDsgc2hvdWxkIHBvaW50IHRvIGEgbG9uZyBmb3Igb3InaW5nIGZsYWdzCiAgKglAdmFsdWU6IG91dHB1dDsgbWF5IGJlIE5VTEw7IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgaW50ZWdlciB2YWx1ZQogICoJCW9mIHRoZSBjdXJyZW50IGFyZ3VtZW50LgogICoKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwppbmRleCA2ZDViMjEzLi41MTk4YWRhIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCkBAIC0zODQsOSArMzg0LDkgQEAKIAogCWRuYW1lID0gZGV2X25hbWUoZGRldik7CiAJaWYgKGlzZGlnaXQoZG5hbWVbc3RybGVuKGRuYW1lKSAtIDFdKSkKLQkJc25wcmludGYocGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIiVzcCVkIiwgZG5hbWUsIHBhcnRubyk7CisJCWRldl9zZXRfbmFtZShwZGV2LCAiJXNwJWQiLCBkbmFtZSwgcGFydG5vKTsKIAllbHNlCi0JCXNucHJpbnRmKHBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcyVkIiwgZG5hbWUsIHBhcnRubyk7CisJCWRldl9zZXRfbmFtZShwZGV2LCAiJXMlZCIsIGRuYW1lLCBwYXJ0bm8pOwogCiAJZGV2aWNlX2luaXRpYWxpemUocGRldik7CiAJcGRldi0+Y2xhc3MgPSAmYmxvY2tfY2xhc3M7CkBAIC00NDcsMTYgKzQ0NywxMSBAQAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGRpc2tfcGFydF9pdGVyIHBpdGVyOwogCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7Ci0JY2hhciAqczsKIAlpbnQgZXJyOwogCiAJZGRldi0+cGFyZW50ID0gZGlzay0+ZHJpdmVyZnNfZGV2OwogCi0Jc3RybGNweShkZGV2LT5idXNfaWQsIGRpc2stPmRpc2tfbmFtZSwgQlVTX0lEX1NJWkUpOwotCS8qIGV3d3cuLi4gc29tZSBvZiB0aGVzZSBidWdnZXJzIGhhdmUgLyBpbiB0aGUgbmFtZS4uLiAqLwotCXMgPSBzdHJjaHIoZGRldi0+YnVzX2lkLCAnLycpOwotCWlmIChzKQotCQkqcyA9ICchJzsKKwlkZXZfc2V0X25hbWUoZGRldiwgZGlzay0+ZGlza19uYW1lKTsKIAogCS8qIGRlbGF5IHVldmVudHMsIHVudGlsIHdlIHNjYW5uZWQgcGFydGl0aW9uIHRhYmxlICovCiAJZGRldi0+dWV2ZW50X3N1cHByZXNzID0gMTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19tbXUuYyBiL2ZzL3Byb2MvdGFza19tbXUuYwppbmRleCAzYThiZGQ3Li45NDA2Mzg0IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Rhc2tfbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX21tdS5jCkBAIC0zOTYsNyArMzk2LDkgQEAKIAkJICAgIlByaXZhdGVfQ2xlYW46ICAlOGx1IGtCXG4iCiAJCSAgICJQcml2YXRlX0RpcnR5OiAgJThsdSBrQlxuIgogCQkgICAiUmVmZXJlbmNlZDogICAgICU4bHUga0JcbiIKLQkJICAgIlN3YXA6ICAgICAgICAgICAlOGx1IGtCXG4iLAorCQkgICAiU3dhcDogICAgICAgICAgICU4bHUga0JcbiIKKwkJICAgIktlcm5lbFBhZ2VTaXplOiAlOGx1IGtCXG4iCisJCSAgICJNTVVQYWdlU2l6ZTogICAgJThsdSBrQlxuIiwKIAkJICAgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gMTAsCiAJCSAgIG1zcy5yZXNpZGVudCA+PiAxMCwKIAkJICAgKHVuc2lnbmVkIGxvbmcpKG1zcy5wc3MgPj4gKDEwICsgUFNTX1NISUZUKSksCkBAIC00MDUsNyArNDA3LDkgQEAKIAkJICAgbXNzLnByaXZhdGVfY2xlYW4gPj4gMTAsCiAJCSAgIG1zcy5wcml2YXRlX2RpcnR5ID4+IDEwLAogCQkgICBtc3MucmVmZXJlbmNlZCA+PiAxMCwKLQkJICAgbXNzLnN3YXAgPj4gMTApOworCQkgICBtc3Muc3dhcCA+PiAxMCwKKwkJICAgdm1hX2tlcm5lbF9wYWdlc2l6ZSh2bWEpID4+IDEwLAorCQkgICB2bWFfbW11X3BhZ2VzaXplKHZtYSkgPj4gMTApOwogCiAJaWYgKG0tPmNvdW50IDwgbS0+c2l6ZSkgIC8qIHZtYSBpcyBjb3BpZWQgc3VjY2Vzc2Z1bGx5ICovCiAJCW0tPnZlcnNpb24gPSAodm1hICE9IGdldF9nYXRlX3ZtYSh0YXNrKSkgPyB2bWEtPnZtX3N0YXJ0IDogMDsKZGlmZiAtLWdpdCBhL2ZzL3NlbGVjdC5jIGIvZnMvc2VsZWN0LmMKaW5kZXggODdkZjUxZS4uMDhiOTFiZSAxMDA2NDQKLS0tIGEvZnMvc2VsZWN0LmMKKysrIGIvZnMvc2VsZWN0LmMKQEAgLTEwOSwxMSArMTA5LDExIEBACiB2b2lkIHBvbGxfaW5pdHdhaXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxKQogewogCWluaXRfcG9sbF9mdW5jcHRyKCZwd3EtPnB0LCBfX3BvbGx3YWl0KTsKKwlwd3EtPnBvbGxpbmdfdGFzayA9IGN1cnJlbnQ7CiAJcHdxLT5lcnJvciA9IDA7CiAJcHdxLT50YWJsZSA9IE5VTEw7CiAJcHdxLT5pbmxpbmVfaW5kZXggPSAwOwogfQotCiBFWFBPUlRfU1lNQk9MKHBvbGxfaW5pdHdhaXQpOwogCiBzdGF0aWMgdm9pZCBmcmVlX3BvbGxfZW50cnkoc3RydWN0IHBvbGxfdGFibGVfZW50cnkgKmVudHJ5KQpAQCAtMTQyLDEyICsxNDIsMTAgQEAKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBvbGQpOwogCX0KIH0KLQogRVhQT1JUX1NZTUJPTChwb2xsX2ZyZWV3YWl0KTsKIAotc3RhdGljIHN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICpwb2xsX2dldF9lbnRyeShwb2xsX3RhYmxlICpfcCkKK3N0YXRpYyBzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqcG9sbF9nZXRfZW50cnkoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcCkKIHsKLQlzdHJ1Y3QgcG9sbF93cXVldWVzICpwID0gY29udGFpbmVyX29mKF9wLCBzdHJ1Y3QgcG9sbF93cXVldWVzLCBwdCk7CiAJc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqdGFibGUgPSBwLT50YWJsZTsKIAogCWlmIChwLT5pbmxpbmVfaW5kZXggPCBOX0lOTElORV9QT0xMX0VOVFJJRVMpCkBAIC0xNTksNyArMTU3LDYgQEAKIAkJbmV3X3RhYmxlID0gKHN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQlpZiAoIW5ld190YWJsZSkgewogCQkJcC0+ZXJyb3IgPSAtRU5PTUVNOwotCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJbmV3X3RhYmxlLT5lbnRyeSA9IG5ld190YWJsZS0+ZW50cmllczsKQEAgLTE3MSwyMCArMTY4LDc1IEBACiAJcmV0dXJuIHRhYmxlLT5lbnRyeSsrOwogfQogCitzdGF0aWMgaW50IHBvbGx3YWtlKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSkKK3sKKwlzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EgPSB3YWl0LT5wcml2YXRlOworCURFQ0xBUkVfV0FJVFFVRVVFKGR1bW15X3dhaXQsIHB3cS0+cG9sbGluZ190YXNrKTsKKworCS8qCisJICogQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgd2FpdHF1ZXVlIGxvY2ssIExPQ0sKKwkgKiBkb2Vzbid0IGltcGx5IHdyaXRlIGJhcnJpZXIgYW5kIHRoZSB1c2VycyBleHBlY3Qgd3JpdGUKKwkgKiBiYXJyaWVyIHNlbWFudGljcyBvbiB3YWtldXAgZnVuY3Rpb25zLiAgVGhlIGZvbGxvd2luZworCSAqIHNtcF93bWIoKSBpcyBlcXVpdmFsZW50IHRvIHNtcF93bWIoKSBpbiB0cnlfdG9fd2FrZV91cCgpCisJICogYW5kIGlzIHBhaXJlZCB3aXRoIHNldF9tYigpIGluIHBvbGxfc2NoZWR1bGVfdGltZW91dC4KKwkgKi8KKwlzbXBfd21iKCk7CisJcHdxLT50cmlnZ2VyZWQgPSAxOworCisJLyoKKwkgKiBQZXJmb3JtIHRoZSBkZWZhdWx0IHdha2UgdXAgb3BlcmF0aW9uIHVzaW5nIGEgZHVtbXkKKwkgKiB3YWl0cXVldWUuCisJICoKKwkgKiBUT0RPOiBUaGlzIGlzIGhhY2t5IGJ1dCB0aGVyZSBjdXJyZW50bHkgaXMgbm8gaW50ZXJmYWNlIHRvCisJICogcGFzcyBpbiBAc3luYy4gIEBzeW5jIGlzIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkIGFuZCBvbmNlCisJICogdGhhdCBoYXBwZW5zLCB3YWtlX3VwX3Byb2Nlc3MoKSBjYW4gYmUgdXNlZCBkaXJlY3RseS4KKwkgKi8KKwlyZXR1cm4gZGVmYXVsdF93YWtlX2Z1bmN0aW9uKCZkdW1teV93YWl0LCBtb2RlLCBzeW5jLCBrZXkpOworfQorCiAvKiBBZGQgYSBuZXcgZW50cnkgKi8KIHN0YXRpYyB2b2lkIF9fcG9sbHdhaXQoc3RydWN0IGZpbGUgKmZpbHAsIHdhaXRfcXVldWVfaGVhZF90ICp3YWl0X2FkZHJlc3MsCiAJCQkJcG9sbF90YWJsZSAqcCkKIHsKLQlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqZW50cnkgPSBwb2xsX2dldF9lbnRyeShwKTsKKwlzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EgPSBjb250YWluZXJfb2YocCwgc3RydWN0IHBvbGxfd3F1ZXVlcywgcHQpOworCXN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICplbnRyeSA9IHBvbGxfZ2V0X2VudHJ5KHB3cSk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuOwogCWdldF9maWxlKGZpbHApOwogCWVudHJ5LT5maWxwID0gZmlscDsKIAllbnRyeS0+d2FpdF9hZGRyZXNzID0gd2FpdF9hZGRyZXNzOwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZlbnRyeS0+d2FpdCwgY3VycmVudCk7CisJaW5pdF93YWl0cXVldWVfZnVuY19lbnRyeSgmZW50cnktPndhaXQsIHBvbGx3YWtlKTsKKwllbnRyeS0+d2FpdC5wcml2YXRlID0gcHdxOwogCWFkZF93YWl0X3F1ZXVlKHdhaXRfYWRkcmVzcywgJmVudHJ5LT53YWl0KTsKIH0KIAoraW50IHBvbGxfc2NoZWR1bGVfdGltZW91dChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EsIGludCBzdGF0ZSwKKwkJCSAga3RpbWVfdCAqZXhwaXJlcywgdW5zaWduZWQgbG9uZyBzbGFjaykKK3sKKwlpbnQgcmMgPSAtRUlOVFI7CisKKwlzZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7CisJaWYgKCFwd3EtPnRyaWdnZXJlZCkKKwkJcmMgPSBzY2hlZHVsZV9ocnRpbWVvdXRfcmFuZ2UoZXhwaXJlcywgc2xhY2ssIEhSVElNRVJfTU9ERV9BQlMpOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCS8qCisJICogUHJlcGFyZSBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgorCSAqCisJICogVGhlIGZvbGxvd2luZyBzZXRfbWIoKSBzZXJ2ZXMgdHdvIHB1cnBvc2VzLiAgRmlyc3QsIGl0J3MKKwkgKiB0aGUgY291bnRlcnBhcnQgcm1iIG9mIHRoZSB3bWIgaW4gcG9sbHdha2UoKSBzdWNoIHRoYXQgZGF0YQorCSAqIHdyaXR0ZW4gYmVmb3JlIHdha2UgdXAgaXMgYWx3YXlzIHZpc2libGUgYWZ0ZXIgd2FrZSB1cC4KKwkgKiBTZWNvbmQsIHRoZSBmdWxsIGJhcnJpZXIgZ3VhcmFudGVlcyB0aGF0IHRyaWdnZXJlZCBjbGVhcmluZworCSAqIGRvZXNuJ3QgcGFzcyBldmVudCBjaGVjayBvZiB0aGUgbmV4dCBpdGVyYXRpb24uICBOb3RlIHRoYXQKKwkgKiB0aGlzIHByb2JsZW0gZG9lc24ndCBleGlzdCBmb3IgdGhlIGZpcnN0IGl0ZXJhdGlvbiBhcworCSAqIGFkZF93YWl0X3F1ZXVlKCkgaGFzIGZ1bGwgYmFycmllciBzZW1hbnRpY3MuCisJICovCisJc2V0X21iKHB3cS0+dHJpZ2dlcmVkLCAwKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wocG9sbF9zY2hlZHVsZV90aW1lb3V0KTsKKwogLyoqCiAgKiBwb2xsX3NlbGVjdF9zZXRfdGltZW91dCAtIGhlbHBlciBmdW5jdGlvbiB0byBzZXR1cCB0aGUgdGltZW91dCB2YWx1ZQogICogQHRvOgkJcG9pbnRlciB0byB0aW1lc3BlYyB2YXJpYWJsZSBmb3IgdGhlIGZpbmFsIHRpbWVvdXQKQEAgLTM0MCw4ICszOTIsNiBAQAogCWZvciAoOzspIHsKIAkJdW5zaWduZWQgbG9uZyAqcmlucCwgKnJvdXRwLCAqcmV4cCwgKmlucCwgKm91dHAsICpleHA7CiAKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQogCQlpbnAgPSBmZHMtPmluOyBvdXRwID0gZmRzLT5vdXQ7IGV4cCA9IGZkcy0+ZXg7CiAJCXJpbnAgPSBmZHMtPnJlc19pbjsgcm91dHAgPSBmZHMtPnJlc19vdXQ7IHJleHAgPSBmZHMtPnJlc19leDsKIApAQCAtNDExLDEwICs0NjEsMTAgQEAKIAkJCXRvID0gJmV4cGlyZTsKIAkJfQogCi0JCWlmICghc2NoZWR1bGVfaHJ0aW1lb3V0X3JhbmdlKHRvLCBzbGFjaywgSFJUSU1FUl9NT0RFX0FCUykpCisJCWlmICghcG9sbF9zY2hlZHVsZV90aW1lb3V0KCZ0YWJsZSwgVEFTS19JTlRFUlJVUFRJQkxFLAorCQkJCQkgICB0bywgc2xhY2spKQogCQkJdGltZWRfb3V0ID0gMTsKIAl9Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCiAJcG9sbF9mcmVld2FpdCgmdGFibGUpOwogCkBAIC02NjYsNyArNzE2LDYgQEAKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCBwb2xsX2xpc3QgKndhbGs7CiAKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJZm9yICh3YWxrID0gbGlzdDsgd2FsayAhPSBOVUxMOyB3YWxrID0gd2Fsay0+bmV4dCkgewogCQkJc3RydWN0IHBvbGxmZCAqIHBmZCwgKiBwZmRfZW5kOwogCkBAIC03MDksMTAgKzc1OCw5IEBACiAJCQl0byA9ICZleHBpcmU7CiAJCX0KIAotCQlpZiAoIXNjaGVkdWxlX2hydGltZW91dF9yYW5nZSh0bywgc2xhY2ssIEhSVElNRVJfTU9ERV9BQlMpKQorCQlpZiAoIXBvbGxfc2NoZWR1bGVfdGltZW91dCh3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsIHRvLCBzbGFjaykpCiAJCQl0aW1lZF9vdXQgPSAxOwogCX0KLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmV0dXJuIGNvdW50OwogfQogCmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggMDkyMWQ2ZC4uYWMwMmI1NiAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAKIAlpZiAoZmxhZ3MgJiBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUpIHsKIAkJcmV0ID0gX19maWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCBlbmRieXRlLAotCQkJCQkJV0JfU1lOQ19OT05FKTsKKwkJCQkJCVdCX1NZTkNfQUxMKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zdXBlci5jIGIvZnMvdWJpZnMvc3VwZXIuYwppbmRleCAwZDc1NjRiLi44OTU1NmVlIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zdXBlci5jCisrKyBiL2ZzL3ViaWZzL3N1cGVyLmMKQEAgLTQzMiwxMiArNDMyLDE5IEBACiAJaW50IGksIGVycjsKIAlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IHNiLT5zX2ZzX2luZm87CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKLQkJLnN5bmNfbW9kZSAgID0gd2FpdCA/IFdCX1NZTkNfQUxMIDogV0JfU1lOQ19IT0xELAorCQkuc3luY19tb2RlICAgPSB3YWl0ID8gV0JfU1lOQ19BTEwgOiBXQl9TWU5DX05PTkUsCiAJCS5yYW5nZV9zdGFydCA9IDAsCiAJCS5yYW5nZV9lbmQgICA9IExMT05HX01BWCwKIAkJLm5yX3RvX3dyaXRlID0gTE9OR19NQVgsCiAJfTsKIAorCS8qCisJICogTm90ZSBieSBha3BtIGFib3V0IFdCX1NZTkNfTk9ORSB1c2VkIGFib3ZlOiB6ZXJvIEB3YWl0IGlzIGp1c3QgYW4KKwkgKiBhZHZpc29yeSB0aGluZyB0byBoZWxwIHRoZSBmaWxlIHN5c3RlbSBzaG92ZSBsb3RzIG9mIGRhdGEgaW50byB0aGUKKwkgKiBxdWV1ZXMuIElmIHNvbWUgZ2V0cyBtaXNzZWQgdGhlbiBpdCdsbCBiZSBwaWNrZWQgdXAgb24gdGhlIHNlY29uZAorCSAqICctPnN5bmNfZnMoKScgY2FsbCwgd2l0aCBub24temVybyBAd2FpdC4KKwkgKi8KKwogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaAppbmRleCA0NmQ2OTZiLi4yOTZjMzVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2F0b21pYy5oCkBAIC0zNSwxMCArMzUsNiBAQAogI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpCWJhcnJpZXIoKQogCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGNvdW50ZXI7Ci19IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCQl7IChpKSB9CiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQogI2RlZmluZSBhdG9taWNfc2V0KHYsIGkpCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCmluZGV4IDhhZjI3NjMuLjM3YjgyY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaApAQCAtMjgsNiArMjgsMTcgQEAKICNkZWZpbmUgQlVHRkxBR19XQVJOSU5HCSgxPDwwKQogI2VuZGlmCS8qIENPTkZJR19HRU5FUklDX0JVRyAqLwogCisvKgorICogRG9uJ3QgdXNlIEJVRygpIG9yIEJVR19PTigpIHVubGVzcyB0aGVyZSdzIHJlYWxseSBubyB3YXkgb3V0OyBvbmUKKyAqIGV4YW1wbGUgbWlnaHQgYmUgZGV0ZWN0aW5nIGRhdGEgc3RydWN0dXJlIGNvcnJ1cHRpb24gaW4gdGhlIG1pZGRsZQorICogb2YgYW4gb3BlcmF0aW9uIHRoYXQgY2FuJ3QgYmUgYmFja2VkIG91dCBvZi4gIElmIHRoZSAoc3ViKXN5c3RlbQorICogY2FuIHNvbWVob3cgY29udGludWUgb3BlcmF0aW5nLCBwZXJoYXBzIHdpdGggcmVkdWNlZCBmdW5jdGlvbmFsaXR5LAorICogaXQncyBwcm9iYWJseSBub3QgQlVHLXdvcnRoeS4KKyAqCisgKiBJZiB5b3UncmUgdGVtcHRlZCB0byBCVUcoKSwgdGhpbmsgYWdhaW46ICBpcyBjb21wbGV0ZWx5IGdpdmluZyB1cAorICogcmVhbGx5IHRoZSAqb25seSogc29sdXRpb24/ICBUaGVyZSBhcmUgdXN1YWxseSBiZXR0ZXIgb3B0aW9ucywgd2hlcmUKKyAqIHVzZXJzIGRvbid0IG5lZWQgdG8gcmVib290IEFTQVAgYW5kIGNhbiBtb3N0bHkgc2h1dCBkb3duIGNsZWFubHkuCisgKi8KICNpZm5kZWYgSEFWRV9BUkNIX0JVRwogI2RlZmluZSBCVUcoKSBkbyB7IFwKIAlwcmludGsoIkJVRzogZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKQEAgLTM5LDYgKzUwLDEyIEBACiAjZGVmaW5lIEJVR19PTihjb25kaXRpb24pIGRvIHsgaWYgKHVubGlrZWx5KGNvbmRpdGlvbikpIEJVRygpOyB9IHdoaWxlKDApCiAjZW5kaWYKIAorLyoKKyAqIFdBUk4oKSwgV0FSTl9PTigpLCBXQVJOX09OX09OQ0UsIGFuZCBzbyBvbiBjYW4gYmUgdXNlZCB0byByZXBvcnQKKyAqIHNpZ25pZmljYW50IGlzc3VlcyB0aGF0IG5lZWQgcHJvbXB0IGF0dGVudGlvbiBpZiB0aGV5IHNob3VsZCBldmVyCisgKiBhcHBlYXIgYXQgcnVudGltZS4gIFVzZSB0aGUgdmVyc2lvbnMgd2l0aCBwcmludGsgZm9ybWF0IHN0cmluZ3MKKyAqIHRvIHByb3ZpZGUgYmV0dGVyIGRpYWdub3N0aWNzLgorICovCiAjaWZuZGVmIF9fV0FSTgogI2lmbmRlZiBfX0FTU0VNQkxZX18KIGV4dGVybiB2b2lkIHdhcm5fc2xvd3BhdGgoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgaW50IGxpbmUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2xvY2FsLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2xvY2FsLmgKaW5kZXggMzNkN2QwNC4uZGJkNjE1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9sb2NhbC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbG9jYWwuaApAQCAtMiw3ICsyLDYgQEAKICNkZWZpbmUgX0FTTV9HRU5FUklDX0xPQ0FMX0gKIAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oCmluZGV4IDM2ZmEyODYuLjRjOGQwYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaApAQCAtNjksMTUgKzY5LDggQEAKIH0pCiAjZW5kaWYgLyogQ09ORklHX0ZMQVRNRU0vRElTQ09OVElHTUVNL1NQQVJTRU1FTSAqLwogCi0jaWZkZWYgQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFCi1zdHJ1Y3QgcGFnZTsKLS8qIHRoaXMgaXMgdXNlZnVsIHdoZW4gaW5saW5lZCBwZm5fdG9fcGFnZSBpcyB0b28gYmlnICovCi1leHRlcm4gc3RydWN0IHBhZ2UgKnBmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBhZ2VfdG9fcGZuKHN0cnVjdCBwYWdlICpwYWdlKTsKLSNlbHNlCiAjZGVmaW5lIHBhZ2VfdG9fcGZuIF9fcGFnZV90b19wZm4KICNkZWZpbmUgcGZuX3RvX3BhZ2UgX19wZm5fdG9fcGFnZQotI2VuZGlmIC8qIENPTkZJR19PVVRfT0ZfTElORV9QRk5fVE9fUEFHRSAqLwogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1tMzJyL2F0b21pYy5oCmluZGV4IDNhMzhmZmUuLjJlZWQzMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9hdG9taWMuaApAQCAtOSw2ICs5LDcgQEAKICAqICAgIENvcHlyaWdodCAoQykgMjAwNCAgSGlyb2thenUgVGFrYXRhIDx0YWthdGEgYXQgbGludXgtbTMyci5vcmc+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApAQCAtMTcsMTMgKzE4LDYgQEAKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotLyoKLSAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKLSAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKLSAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1tNjhrL2F0b21pYy5oCmluZGV4IDQ5MTUyOTQuLmViMGFiOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hdG9taWMuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19BUkNIX002OEtfQVRPTUlDX18KICNkZWZpbmUgX19BUkNIX002OEtfQVRPTUlDX18KIAotCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIC8qCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBXZSBkbyBub3QgaGF2ZSBTTVAgbTY4ayBzeXN0ZW1zLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGF0LgogICovCiAKLXR5cGVkZWYgc3RydWN0IHsgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2F0b21pYy5oCmluZGV4IDI3Yzk2OTAuLmJjMDY0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9hdG9taWMuaApAQCAtMjAsMTUgKzIwLDYgQEAKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotLyoKLSAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKLSAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKLSAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQJY291bnRlcjsKLX0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oCmluZGV4IGIzYjIzNTQuLjY3YWQ2N2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKQEAgLTE0LDggKzE0LDcgQEAKICNkZWZpbmUgX1hURU5TQV9BVE9NSUNfSAogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0KLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1dG9fZGV2LWlvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2F1dG9fZGV2LWlvY3RsLmgKaW5kZXggZjRkMDVjYy4uOTFhNzczOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdXRvX2Rldi1pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXV0b19kZXYtaW9jdGwuaApAQCAtMTAsNiArMTAsNyBAQAogI2lmbmRlZiBfTElOVVhfQVVUT19ERVZfSU9DVExfSAogI2RlZmluZSBfTElOVVhfQVVUT19ERVZfSU9DVExfSAogCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBBVVRPRlNfREVWSUNFX05BTUUJCSJhdXRvZnMiCkBAIC0yNSw2ICsyNiw2MCBAQAogICogQW4gaW9jdGwgaW50ZXJmYWNlIGZvciBhdXRvZnMgbW91bnQgcG9pbnQgY29udHJvbC4KICAqLwogCitzdHJ1Y3QgYXJnc19wcm90b3ZlciB7CisJX191MzIJdmVyc2lvbjsKK307CisKK3N0cnVjdCBhcmdzX3Byb3Rvc3VidmVyIHsKKwlfX3UzMglzdWJfdmVyc2lvbjsKK307CisKK3N0cnVjdCBhcmdzX29wZW5tb3VudCB7CisJX191MzIJZGV2aWQ7Cit9OworCitzdHJ1Y3QgYXJnc19yZWFkeSB7CisJX191MzIJdG9rZW47Cit9OworCitzdHJ1Y3QgYXJnc19mYWlsIHsKKwlfX3UzMgl0b2tlbjsKKwlfX3MzMglzdGF0dXM7Cit9OworCitzdHJ1Y3QgYXJnc19zZXRwaXBlZmQgeworCV9fczMyCXBpcGVmZDsKK307CisKK3N0cnVjdCBhcmdzX3RpbWVvdXQgeworCV9fdTY0CXRpbWVvdXQ7Cit9OworCitzdHJ1Y3QgYXJnc19yZXF1ZXN0ZXIgeworCV9fdTMyCXVpZDsKKwlfX3UzMglnaWQ7Cit9OworCitzdHJ1Y3QgYXJnc19leHBpcmUgeworCV9fdTMyCWhvdzsKK307CisKK3N0cnVjdCBhcmdzX2Fza3Vtb3VudCB7CisJX191MzIJbWF5X3Vtb3VudDsKK307CisKK3N0cnVjdCBhcmdzX2lzbW91bnRwb2ludCB7CisJdW5pb24geworCQlzdHJ1Y3QgYXJnc19pbiB7CisJCQlfX3UzMgl0eXBlOworCQl9IGluOworCQlzdHJ1Y3QgYXJnc19vdXQgeworCQkJX191MzIJZGV2aWQ7CisJCQlfX3UzMgltYWdpYzsKKwkJfSBvdXQ7CisJfTsKK307CisKIC8qCiAgKiBBbGwgdGhlIGlvY3RscyB1c2UgdGhpcyBzdHJ1Y3R1cmUuCiAgKiBXaGVuIHNlbmRpbmcgYSBwYXRoIHNpemUgbXVzdCBhY2NvdW50IGZvciB0aGUgdG90YWwgbGVuZ3RoCkBAIC0zOSwyMCArOTQsMzIgQEAKIAkJCQkgKiBpbmNsdWRpbmcgdGhpcyBzdHJ1Y3QgKi8KIAlfX3MzMiBpb2N0bGZkOwkJLyogYXV0b21vdW50IGNvbW1hbmQgZmQgKi8KIAotCV9fdTMyIGFyZzE7CQkvKiBDb21tYW5kIHBhcmFtZXRlcnMgKi8KLQlfX3UzMiBhcmcyOworCS8qIENvbW1hbmQgcGFyYW1ldGVycyAqLworCisJdW5pb24geworCQlzdHJ1Y3QgYXJnc19wcm90b3ZlcgkJcHJvdG92ZXI7CisJCXN0cnVjdCBhcmdzX3Byb3Rvc3VidmVyCQlwcm90b3N1YnZlcjsKKwkJc3RydWN0IGFyZ3Nfb3Blbm1vdW50CQlvcGVubW91bnQ7CisJCXN0cnVjdCBhcmdzX3JlYWR5CQlyZWFkeTsKKwkJc3RydWN0IGFyZ3NfZmFpbAkJZmFpbDsKKwkJc3RydWN0IGFyZ3Nfc2V0cGlwZWZkCQlzZXRwaXBlZmQ7CisJCXN0cnVjdCBhcmdzX3RpbWVvdXQJCXRpbWVvdXQ7CisJCXN0cnVjdCBhcmdzX3JlcXVlc3RlcgkJcmVxdWVzdGVyOworCQlzdHJ1Y3QgYXJnc19leHBpcmUJCWV4cGlyZTsKKwkJc3RydWN0IGFyZ3NfYXNrdW1vdW50CQlhc2t1bW91bnQ7CisJCXN0cnVjdCBhcmdzX2lzbW91bnRwb2ludAlpc21vdW50cG9pbnQ7CisJfTsKIAogCWNoYXIgcGF0aFswXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2F1dG9mc19kZXZfaW9jdGwoc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKmluKQogeworCW1lbXNldChpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsKSk7CiAJaW4tPnZlcl9tYWpvciA9IEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9NQUpPUjsKIAlpbi0+dmVyX21pbm9yID0gQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OX01JTk9SOwogCWluLT5zaXplID0gc2l6ZW9mKHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsKTsKIAlpbi0+aW9jdGxmZCA9IC0xOwotCWluLT5hcmcxID0gMDsKLQlpbi0+YXJnMiA9IDA7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmggYi9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKaW5kZXggMjI1MzcxNmQuLjU1ZmE0NzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXV0b19mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKQEAgLTI5LDEwICsyOSw2NCBAQAogI2RlZmluZSBBVVRPRlNfRVhQX0lNTUVESUFURQkJMQogI2RlZmluZSBBVVRPRlNfRVhQX0xFQVZFUwkJMgogCi0jZGVmaW5lIEFVVE9GU19UWVBFX0FOWQkJCTB4MDAwMAotI2RlZmluZSBBVVRPRlNfVFlQRV9JTkRJUkVDVAkJMHgwMDAxCi0jZGVmaW5lIEFVVE9GU19UWVBFX0RJUkVDVAkJMHgwMDAyCi0jZGVmaW5lIEFVVE9GU19UWVBFX09GRlNFVAkJMHgwMDA0CisjZGVmaW5lIEFVVE9GU19UWVBFX0FOWQkJCTBVCisjZGVmaW5lIEFVVE9GU19UWVBFX0lORElSRUNUCQkxVQorI2RlZmluZSBBVVRPRlNfVFlQRV9ESVJFQ1QJCTJVCisjZGVmaW5lIEFVVE9GU19UWVBFX09GRlNFVAkJNFUKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9hdXRvZnNfdHlwZV9pbmRpcmVjdCh1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJKnR5cGUgPSBBVVRPRlNfVFlQRV9JTkRJUkVDVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2luZGlyZWN0KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9JTkRJUkVDVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXV0b2ZzX3R5cGVfZGlyZWN0KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX0RJUkVDVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2RpcmVjdCh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfRElSRUNUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9hdXRvZnNfdHlwZV9vZmZzZXQodW5zaWduZWQgaW50ICp0eXBlKQoreworCSp0eXBlID0gQVVUT0ZTX1RZUEVfT0ZGU0VUOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXV0b2ZzX3R5cGVfb2Zmc2V0KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9PRkZTRVQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV90cmlnZ2VyKHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9ESVJFQ1QgfHwgdHlwZSA9PSBBVVRPRlNfVFlQRV9PRkZTRVQpOworfQorCisvKgorICogVGhpcyBpc24ndCByZWFsbHkgYSB0eXBlIGFzIHdlIHVzZSBpdCB0byBzYXkgIm5vIHR5cGUgc2V0IiB0bworICogaW5kaWNhdGUgd2Ugd2FudCB0byBzZWFyY2ggZm9yICJhbnkiIG1vdW50IGluIHRoZQorICogYXV0b2ZzX2Rldl9pb2N0bF9pc21vdW50cG9pbnQoKSBkZXZpY2UgaW9jdGwgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXV0b2ZzX3R5cGVfYW55KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX0FOWTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2FueSh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfQU5ZKTsKK30KIAogLyogRGFlbW9uIG5vdGlmaWNhdGlvbiBwYWNrZXQgdHlwZXMgKi8KIGVudW0gYXV0b2ZzX25vdGlmeSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCmluZGV4IDZjYmZiZTIuLjc3YjRhOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEJJTlBSTV9CVUZfU0laRSAxMjgKIAogI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNkZWZpbmUgQ09SRU5BTUVfTUFYX1NJWkUgMTI4CiAKQEAgLTEwNiw3ICsxMDcsNyBAQAogZXh0ZXJuIGludCBicHJtX21tX2luaXQoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSk7CiBleHRlcm4gaW50IGNvcHlfc3RyaW5nc19rZXJuZWwoaW50IGFyZ2MsY2hhciAqKiBhcmd2LHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwogZXh0ZXJuIHZvaWQgaW5zdGFsbF9leGVjX2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwotZXh0ZXJuIGludCBkb19jb3JlZHVtcChsb25nIHNpZ25yLCBpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworZXh0ZXJuIHZvaWQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBzZXRfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKm5ldyk7CiBleHRlcm4gdm9pZCBmcmVlX2Jwcm0oc3RydWN0IGxpbnV4X2JpbnBybSAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXggMTE2NDk2My4uMDhiNzhjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCkBAIC0zMjksMTMgKzMyOSw3IEBACiAJCQlzdHJ1Y3QgY2dyb3VwICpjZ3JwKTsKIAl2b2lkICgqcG9zdF9jbG9uZSkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKTsKIAl2b2lkICgqYmluZCkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpyb290KTsKLQkvKgotCSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2l0aCB0aGUgdGFza19sb2NrIG9mIG1tLT5vd25lciBoZWxkCi0JICovCi0Jdm9pZCAoKm1tX293bmVyX2NoYW5nZWQpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKLQkJCQkJc3RydWN0IGNncm91cCAqb2xkLAotCQkJCQlzdHJ1Y3QgY2dyb3VwICpuZXcsCi0JCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKIAlpbnQgc3Vic3lzX2lkOwogCWludCBhY3RpdmU7CiAJaW50IGRpc2FibGVkOwpAQCAtNDAwLDkgKzM5NCw2IEBACiBpbnQgY2dyb3VwX3NjYW5fdGFza3Moc3RydWN0IGNncm91cF9zY2FubmVyICpzY2FuKTsKIGludCBjZ3JvdXBfYXR0YWNoX3Rhc2soc3RydWN0IGNncm91cCAqLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiAKLXZvaWQgY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZCwKLQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldyk7Ci0KICNlbHNlIC8qICFDT05GSUdfQ0dST1VQUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBjZ3JvdXBfaW5pdF9lYXJseSh2b2lkKSB7IHJldHVybiAwOyB9CkBAIC00MjAsOSArNDExLDYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNncm91cF9tbV9vd25lcl9jYWxsYmFja3Moc3RydWN0IHRhc2tfc3RydWN0ICpvbGQsCi0JCQkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXcpIHt9Ci0KICNlbmRpZiAvKiAhQ09ORklHX0NHUk9VUFMgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9DR1JPVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaCBiL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKaW5kZXggOGU1NDBkMy4uNTFlYTJiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCkBAIC03OCw2ICs3OCw4IEBACiAKIGV4dGVybiB2b2lkIHJlYnVpbGRfc2NoZWRfZG9tYWlucyh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgY3B1c2V0X3ByaW50X3Rhc2tfbWVtc19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKICNlbHNlIC8qICFDT05GSUdfQ1BVU0VUUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBjcHVzZXRfaW5pdF9lYXJseSh2b2lkKSB7IHJldHVybiAwOyB9CkBAIC0xNTksNiArMTYxLDEwIEBACiAJcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoMSwgTlVMTCwgTlVMTCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworfQorCiAjZW5kaWYgLyogIUNPTkZJR19DUFVTRVRTICovCiAKICNlbmRpZiAvKiBfTElOVVhfQ1BVU0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDFhMzY4NmQxLi43ZDlkYTRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgQlVTX0lEX1NJWkUJCTIwCiAKIHN0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgZGV2aWNlX3ByaXZhdGU7CiBzdHJ1Y3QgZGV2aWNlX2RyaXZlcjsKIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZTsKIHN0cnVjdCBjbGFzczsKQEAgLTY1LDcgKzY2LDcgQEAKIAlpbnQgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi0Jc3RydWN0IHBtX2V4dF9vcHMgKnBtOworCXN0cnVjdCBkZXZfcG1fb3BzICpwbTsKIAogCXN0cnVjdCBidXNfdHlwZV9wcml2YXRlICpwOwogfTsKQEAgLTEzMyw3ICsxMzQsNyBAQAogCWludCAoKnJlc3VtZSkgKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwczsKIAotCXN0cnVjdCBwbV9vcHMgKnBtOworCXN0cnVjdCBkZXZfcG1fb3BzICpwbTsKIAogCXN0cnVjdCBkcml2ZXJfcHJpdmF0ZSAqcDsKIH07CkBAIC0xOTgsNyArMTk5LDcgQEAKIAlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi0Jc3RydWN0IHBtX29wcyAqcG07CisJc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCXN0cnVjdCBjbGFzc19wcml2YXRlICpwOwogfTsKIApAQCAtMjkxLDcgKzI5Miw3IEBACiAJaW50ICgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAotCXN0cnVjdCBwbV9vcHMgKnBtOworCXN0cnVjdCBkZXZfcG1fb3BzICpwbTsKIH07CiAKIC8qIGludGVyZmFjZSBmb3IgZXhwb3J0aW5nIGRldmljZSBhdHRyaWJ1dGVzICovCkBAIC0zNjUsMTcgKzM2NiwxNSBAQAogfTsKIAogc3RydWN0IGRldmljZSB7Ci0Jc3RydWN0IGtsaXN0CQlrbGlzdF9jaGlsZHJlbjsKLQlzdHJ1Y3Qga2xpc3Rfbm9kZQlrbm9kZV9wYXJlbnQ7CS8qIG5vZGUgaW4gc2libGluZyBsaXN0ICovCi0Jc3RydWN0IGtsaXN0X25vZGUJa25vZGVfZHJpdmVyOwotCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX2J1czsKIAlzdHJ1Y3QgZGV2aWNlCQkqcGFyZW50OwogCisJc3RydWN0IGRldmljZV9wcml2YXRlCSpwOworCiAJc3RydWN0IGtvYmplY3Qga29iajsKIAljaGFyCWJ1c19pZFtCVVNfSURfU0laRV07CS8qIHBvc2l0aW9uIG9uIHBhcmVudCBidXMgKi8KKwl1bnNpZ25lZAkJdWV2ZW50X3N1cHByZXNzOjE7CiAJY29uc3QgY2hhcgkJKmluaXRfbmFtZTsgLyogaW5pdGlhbCBuYW1lIG9mIHRoZSBkZXZpY2UgKi8KIAlzdHJ1Y3QgZGV2aWNlX3R5cGUJKnR5cGU7Ci0JdW5zaWduZWQJCXVldmVudF9zdXBwcmVzczoxOwogCiAJc3RydWN0IHNlbWFwaG9yZQlzZW07CS8qIHNlbWFwaG9yZSB0byBzeW5jaHJvbml6ZSBjYWxscyB0bwogCQkJCQkgKiBpdHMgZHJpdmVyLgpAQCAtNDA4LDEyICs0MDcsMTMgQEAKIAkvKiBhcmNoIHNwZWNpZmljIGFkZGl0aW9ucyAqLwogCXN0cnVjdCBkZXZfYXJjaGRhdGEJYXJjaGRhdGE7CiAKKwlkZXZfdAkJCWRldnQ7CS8qIGRldl90LCBjcmVhdGVzIHRoZSBzeXNmcyAiZGV2IiAqLworCiAJc3BpbmxvY2tfdAkJZGV2cmVzX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAlkZXZyZXNfaGVhZDsKIAogCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX2NsYXNzOwogCXN0cnVjdCBjbGFzcwkJKmNsYXNzOwotCWRldl90CQkJZGV2dDsJLyogZGV2X3QsIGNyZWF0ZXMgdGhlIHN5c2ZzICJkZXYiICovCiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkqKmdyb3VwczsJLyogb3B0aW9uYWwgZ3JvdXBzICovCiAKIAl2b2lkCSgqcmVsZWFzZSkoc3RydWN0IGRldmljZSAqZGV2KTsKQEAgLTQ4Myw2ICs0ODMsMTcgQEAKIGV4dGVybiBpbnQgZGV2aWNlX21vdmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpuZXdfcGFyZW50KTsKIAogLyoKKyAqIFJvb3QgZGV2aWNlIG9iamVjdHMgZm9yIGdyb3VwaW5nIHVuZGVyIC9zeXMvZGV2aWNlcworICovCitleHRlcm4gc3RydWN0IGRldmljZSAqX19yb290X2RldmljZV9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqcm9vdF9kZXZpY2VfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gX19yb290X2RldmljZV9yZWdpc3RlcihuYW1lLCBUSElTX01PRFVMRSk7Cit9CitleHRlcm4gdm9pZCByb290X2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnJvb3QpOworCisvKgogICogTWFudWFsIGJpbmRpbmcgb2YgYSBkZXZpY2UgdG8gZHJpdmVyLiBTZWUgZHJpdmVycy9iYXNlL2J1cy5jCiAgKiBmb3IgaW5mb3JtYXRpb24gb24gdXNlLgogICovCkBAIC01NTMsMTMgKzU2NCwxMyBAQAogI2RlZmluZSBkZXZfaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAogCWRldl9wcmludGsoS0VSTl9JTkZPICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQogCi0jaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgZGV2X2RiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAorCWRldl9wcmludGsoS0VSTl9ERUJVRyAsIGRldiAsIGZvcm1hdCAsICMjIGFyZykKKyNlbGlmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHKQogI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCAuLi4pIGRvIHsgXAogCWR5bmFtaWNfZGV2X2RiZyhkZXYsIGZvcm1hdCwgIyNfX1ZBX0FSR1NfXyk7IFwKIAl9IHdoaWxlICgwKQotI2VsaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgZGV2X2RiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl9wcmludGsoS0VSTl9ERUJVRyAsIGRldiAsIGZvcm1hdCAsICMjIGFyZykKICNlbHNlCiAjZGVmaW5lIGRldl9kYmcoZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKIAkoeyBpZiAoMCkgZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsIGZvcm1hdCwgIyNhcmcpOyAwOyB9KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGZiNTk2NzMuLmQ3ZWJhNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTExMzMsNyArMTEzMyw2IEBACiAJc3RydWN0IHJ3X3NlbWFwaG9yZQlzX3Vtb3VudDsKIAlzdHJ1Y3QgbXV0ZXgJCXNfbG9jazsKIAlpbnQJCQlzX2NvdW50OwotCWludAkJCXNfc3luY2luZzsKIAlpbnQJCQlzX25lZWRfc3luY19mczsKIAlhdG9taWNfdAkJc19hY3RpdmU7CiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaCBiL2luY2x1ZGUvbGludXgvZnVzZS5oCmluZGV4IDM1MGZlOTcuLjE2MmU1ZGVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTIwLDI5ICsyMCwyNyBAQAogICoKICAqIDcuMTAKICAqICAtIGFkZCBub25zZWVrYWJsZSBvcGVuIGZsYWcKKyAqCisgKiA3LjExCisgKiAgLSBhZGQgSU9DVEwgbWVzc2FnZQorICogIC0gYWRkIHVuc29saWNpdGVkIG5vdGlmaWNhdGlvbiBzdXBwb3J0CisgKiAgLSBhZGQgUE9MTCBtZXNzYWdlIGFuZCBOT1RJRllfUE9MTCBub3RpZmljYXRpb24KICAqLwogCiAjaWZuZGVmIF9MSU5VWF9GVVNFX0gKICNkZWZpbmUgX0xJTlVYX0ZVU0VfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDEwCisjZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMTEKIAogLyoqIFRoZSBub2RlIElEIG9mIHRoZSByb290IGlub2RlICovCiAjZGVmaW5lIEZVU0VfUk9PVF9JRCAxCiAKLS8qKiBUaGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KLSNkZWZpbmUgRlVTRV9NQUpPUiBNSVNDX01BSk9SCi0KLS8qKiBUaGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KLSNkZWZpbmUgRlVTRV9NSU5PUiAyMjkKLQogLyogTWFrZSBzdXJlIGFsbCBzdHJ1Y3R1cmVzIGFyZSBwYWRkZWQgdG8gNjRiaXQgYm91bmRhcnksIHNvIDMyYml0CiAgICB1c2Vyc3BhY2Ugd29ya3MgdW5kZXIgNjRiaXQga2VybmVscyAqLwogCkBAIC0xNTEsNiArMTQ5LDI4IEBACiAgKi8KICNkZWZpbmUgRlVTRV9SRUFEX0xPQ0tPV05FUgkoMSA8PCAxKQogCisvKioKKyAqIElvY3RsIGZsYWdzCisgKgorICogRlVTRV9JT0NUTF9DT01QQVQ6IDMyYml0IGNvbXBhdCBpb2N0bCBvbiA2NGJpdCBtYWNoaW5lCisgKiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRDogbm90IHJlc3RyaWN0ZWQgdG8gd2VsbC1mb3JtZWQgaW9jdGxzLCByZXRyeSBhbGxvd2VkCisgKiBGVVNFX0lPQ1RMX1JFVFJZOiByZXRyeSB3aXRoIG5ldyBpb3ZlY3MKKyAqCisgKiBGVVNFX0lPQ1RMX01BWF9JT1Y6IG1heGltdW0gb2YgaW5faW92ZWNzICsgb3V0X2lvdmVjcworICovCisjZGVmaW5lIEZVU0VfSU9DVExfQ09NUEFUCSgxIDw8IDApCisjZGVmaW5lIEZVU0VfSU9DVExfVU5SRVNUUklDVEVECSgxIDw8IDEpCisjZGVmaW5lIEZVU0VfSU9DVExfUkVUUlkJKDEgPDwgMikKKworI2RlZmluZSBGVVNFX0lPQ1RMX01BWF9JT1YJMjU2CisKKy8qKgorICogUG9sbCBmbGFncworICoKKyAqIEZVU0VfUE9MTF9TQ0hFRFVMRV9OT1RJRlk6IHJlcXVlc3QgcG9sbCBub3RpZnkKKyAqLworI2RlZmluZSBGVVNFX1BPTExfU0NIRURVTEVfTk9USUZZICgxIDw8IDApCisKIGVudW0gZnVzZV9vcGNvZGUgewogCUZVU0VfTE9PS1VQCSAgID0gMSwKIAlGVVNFX0ZPUkdFVAkgICA9IDIsICAvKiBubyByZXBseSAqLwpAQCAtMTg4LDYgKzIwOCwxMyBAQAogCUZVU0VfSU5URVJSVVBUICAgICA9IDM2LAogCUZVU0VfQk1BUCAgICAgICAgICA9IDM3LAogCUZVU0VfREVTVFJPWSAgICAgICA9IDM4LAorCUZVU0VfSU9DVEwgICAgICAgICA9IDM5LAorCUZVU0VfUE9MTCAgICAgICAgICA9IDQwLAorfTsKKworZW51bSBmdXNlX25vdGlmeV9jb2RlIHsKKwlGVVNFX05PVElGWV9QT0xMICAgPSAxLAorCUZVU0VfTk9USUZZX0NPREVfTUFYLAogfTsKIAogLyogVGhlIHJlYWQgYnVmZmVyIGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IDhrLCBidXQgbWF5IGJlIG11Y2ggbGFyZ2VyICovCkBAIC0zODgsNiArNDE1LDM4IEBACiAJX191NjQJYmxvY2s7CiB9OwogCitzdHJ1Y3QgZnVzZV9pb2N0bF9pbiB7CisJX191NjQJZmg7CisJX191MzIJZmxhZ3M7CisJX191MzIJY21kOworCV9fdTY0CWFyZzsKKwlfX3UzMglpbl9zaXplOworCV9fdTMyCW91dF9zaXplOworfTsKKworc3RydWN0IGZ1c2VfaW9jdGxfb3V0IHsKKwlfX3MzMglyZXN1bHQ7CisJX191MzIJZmxhZ3M7CisJX191MzIJaW5faW92czsKKwlfX3UzMglvdXRfaW92czsKK307CisKK3N0cnVjdCBmdXNlX3BvbGxfaW4geworCV9fdTY0CWZoOworCV9fdTY0CWtoOworCV9fdTMyCWZsYWdzOworCV9fdTMyICAgcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3BvbGxfb3V0IHsKKwlfX3UzMglyZXZlbnRzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9ub3RpZnlfcG9sbF93YWtldXBfb3V0IHsKKwlfX3U2NAlraDsKK307CisKIHN0cnVjdCBmdXNlX2luX2hlYWRlciB7CiAJX191MzIJbGVuOwogCV9fdTMyCW9wY29kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oCmluZGV4IGU4MDAzYWYuLmRkMjBjZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtNjksMTIgKzY5LDYgQEAKICNkZWZpbmUgR0ZQX0hJR0hVU0VSX01PVkFCTEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgXAogCQkJCSBfX0dGUF9IQVJEV0FMTCB8IF9fR0ZQX0hJR0hNRU0gfCBcCiAJCQkJIF9fR0ZQX01PVkFCTEUpCi0jZGVmaW5lIEdGUF9OT0ZTX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfTU9WQUJMRSkKLSNkZWZpbmUgR0ZQX1VTRVJfUEFHRUNBQ0hFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKLQkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9NT1ZBQkxFKQotI2RlZmluZSBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKLQkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9ISUdITUVNIHwgXAotCQkJCSBfX0dGUF9NT1ZBQkxFKQogCiAjaWZkZWYgQ09ORklHX05VTUEKICNkZWZpbmUgR0ZQX1RISVNOT0RFCShfX0dGUF9USElTTk9ERSB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaCBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCmluZGV4IGUxYzhhZmMuLmYxZDJmYmExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMjMzLDYgKzIzMywxMCBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZylQQUdFX1NJWkUgPDwgaC0+b3JkZXI7CiB9CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZtYV9rZXJuZWxfcGFnZXNpemUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFfbW11X3BhZ2VzaXplKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGh1Z2VfcGFnZV9tYXNrKHN0cnVjdCBoc3RhdGUgKmgpCiB7CiAJcmV0dXJuIGgtPm1hc2s7CkBAIC0yNzMsNiArMjc3LDggQEAKICNkZWZpbmUgaHN0YXRlX2lub2RlKGkpIE5VTEwKICNkZWZpbmUgaHVnZV9wYWdlX3NpemUoaCkgUEFHRV9TSVpFCiAjZGVmaW5lIGh1Z2VfcGFnZV9tYXNrKGgpIFBBR0VfTUFTSworI2RlZmluZSB2bWFfa2VybmVsX3BhZ2VzaXplKHYpIFBBR0VfU0laRQorI2RlZmluZSB2bWFfbW11X3BhZ2VzaXplKHYpIFBBR0VfU0laRQogI2RlZmluZSBodWdlX3BhZ2Vfb3JkZXIoaCkgMAogI2RlZmluZSBodWdlX3BhZ2Vfc2hpZnQoaCkgUEFHRV9TSElGVAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGFnZXNfcGVyX2h1Z2VfcGFnZShzdHJ1Y3QgaHN0YXRlICpoKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvdHdsNDAzMC5oIGIvaW5jbHVkZS9saW51eC9pMmMvdHdsNDAzMC5oCmluZGV4IGE4Zjg0YzAuLjgxMzdmNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLmgKQEAgLTIzNCw2ICsyMzQsOSBAQAogCS8qIGdwaW8tbiBzaG91bGQgY29udHJvbCBWTU1DKG4rMSkgaWYgQklUKG4pIGluIG1tY19jZCBpcyBzZXQgKi8KIAl1OAkJbW1jX2NkOwogCisJLyogaWYgQklUKE4pIGlzIHNldCwgb3IgVk1NQyhuKzEpIGlzIGxpbmtlZCwgZGVib3VuY2UgR1BJTy1OICovCisJdTMyCQlkZWJvdW5jZTsKKwogCS8qIEZvciBncGlvLU4sIGJpdCAoMSA8PCBOKSBpbiAicHVsbHVwcyIgaXMgc2V0IGlmIHRoYXQgcHVsbHVwCiAJICogc2hvdWxkIGJlIGVuYWJsZWQuICBFbHNlLCBpZiB0aGF0IGJpdCBpcyBzZXQgaW4gInB1bGxkb3ducyIsCiAJICogdGhhdCBwdWxsZG93biBpcyBlbmFibGVkLiAgRG9uJ3Qgd2FzdGUgcG93ZXIgYnkgbGV0dGluZyBhbnkKQEAgLTMwNywxMiArMzEwLDYgQEAKICNkZWZpbmUgVFdMNDAzMF9WQVVYM19ERVZfR1JQCQkweDFGCiAjZGVmaW5lIFRXTDQwMzBfVkFVWDNfREVESUNBVEVECQkweDIyCiAKLS8qCi0gKiBFeHBvcnRlZCBUV0w0MDMwIEdQSU8gQVBJcwotICoKLSAqIFdBUk5JTkcgLS0gdXNlIHN0YW5kYXJkIEdQSU8gYW5kIElSUSBjYWxscyBpbnN0ZWFkOyB0aGVzZSB3aWxsIHZhbmlzaC4KLSAqLwotaW50IHR3bDQwMzBfc2V0X2dwaW9fZGVib3VuY2UoaW50IGdwaW8sIGludCBlbmFibGUpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9CQ0lfQkFUVEVSWSkgfHwgXAogCWRlZmluZWQoQ09ORklHX1RXTDQwMzBfQkNJX0JBVFRFUllfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZGUuaCBiL2luY2x1ZGUvbGludXgvaWRlLmgKaW5kZXggZGI1ZWY4YS4uMzY0NGY2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkZS5oCkBAIC0zMiwxOCArMzIsMTQgQEAKICMgZGVmaW5lIFNVUFBPUlRfVkxCX1NZTkMgMQogI2VuZGlmCiAKLXR5cGVkZWYgdW5zaWduZWQgY2hhcglieXRlOwkvKiB1c2VkIGV2ZXJ5d2hlcmUgKi8KLQogLyoKICAqIFByb2JhYmx5IG5vdCB3aXNlIHRvIGZpZGRsZSB3aXRoIHRoZXNlCiAgKi8KKyNkZWZpbmUgSURFX0RFRkFVTFRfTUFYX0ZBSUxVUkVTCTEKICNkZWZpbmUgRVJST1JfTUFYCTgJLyogTWF4IHJlYWQvd3JpdGUgZXJyb3JzIHBlciBzZWN0b3IgKi8KICNkZWZpbmUgRVJST1JfUkVTRVQJMwkvKiBSZXNldCBjb250cm9sbGVyIGV2ZXJ5IDR0aCByZXRyeSAqLwogI2RlZmluZSBFUlJPUl9SRUNBTAkxCS8qIFJlY2FsaWJyYXRlIGV2ZXJ5IDJuZCByZXRyeSAqLwogCi0jZGVmaW5lIEhXSUYoZHJpdmUpCQkoKGlkZV9od2lmX3QgKikoKGRyaXZlKS0+aHdpZikpCi0jZGVmaW5lIEhXR1JPVVAoZHJpdmUpCQkoKGlkZV9od2dyb3VwX3QgKikoSFdJRihkcml2ZSktPmh3Z3JvdXApKQotCiAvKgogICogRGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyBJREUgY29udHJvbGxlciByZWdpc3RlcnMKICAqLwpAQCAtMTg1LDkgKzE4MSw2IEBACiAJdW5zaWduZWQgbG9uZwljb25maWc7CiB9IGh3X3JlZ3NfdDsKIAotdm9pZCBpZGVfaW5pdF9wb3J0X2RhdGEoc3RydWN0IGh3aWZfcyAqLCB1bnNpZ25lZCBpbnQpOwotdm9pZCBpZGVfaW5pdF9wb3J0X2h3KHN0cnVjdCBod2lmX3MgKiwgaHdfcmVnc190ICopOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3N0ZF9pbml0X3BvcnRzKGh3X3JlZ3NfdCAqaHcsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpb19hZGRyLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY3RsX2FkZHIpCkBAIC00MzMsMTggKzQyNiwxNCBAQAogCXN0cnVjdCBpZGV0YXBlX2JoICpiaDsKIAljaGFyICpiX2RhdGE7CiAKLQkvKiBpZGVzY3NpIG9ubHkgZm9yIG5vdyAqLwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJdW5zaWduZWQgaW50IHNnX2NudDsKIAotCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kOwotCXZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKTsKLQogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIH07CiAKIHN0cnVjdCBpZGVfZGV2c2V0Owotc3RydWN0IGlkZV9kcml2ZXJfczsKK3N0cnVjdCBpZGVfZHJpdmVyOwogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFQUNQSQogc3RydWN0IGlkZV9hY3BpX2RyaXZlX2xpbms7CkBAIC01ODgsNyArNTc3LDYgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZQkqcXVldWU7CS8qIHJlcXVlc3QgcXVldWUgKi8KIAogCXN0cnVjdCByZXF1ZXN0CQkqcnE7CS8qIGN1cnJlbnQgcmVxdWVzdCAqLwotCXN0cnVjdCBpZGVfZHJpdmVfcyAJKm5leHQ7CS8qIGNpcmN1bGFyIGxpc3Qgb2YgaHdncm91cCBkcml2ZXMgKi8KIAl2b2lkCQkqZHJpdmVyX2RhdGE7CS8qIGV4dHJhIGRyaXZlciBkYXRhICovCiAJdTE2CQkJKmlkOwkvKiBpZGVudGlmaWNhdGlvbiBpbmZvICovCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCkBAIC02NjIsNiArNjUwLDggQEAKIAlpbnQgICgqcGNfaW9fYnVmZmVycykoc3RydWN0IGlkZV9kcml2ZV9zICosIHN0cnVjdCBpZGVfYXRhcGlfcGMgKiwKIAkJCSAgICAgIHVuc2lnbmVkIGludCwgaW50KTsKIAorCWlkZV9zdGFydHN0b3BfdCAoKmlycV9oYW5kbGVyKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKik7CisKIAl1bnNpZ25lZCBsb25nIGF0YXBpX2ZsYWdzOwogCiAJc3RydWN0IGlkZV9hdGFwaV9wYyByZXF1ZXN0X3NlbnNlX3BjOwpAQCAtNjg0LDcgKzY3NCw2IEBACiAJdm9pZAkoKmV4ZWNfY29tbWFuZCkoc3RydWN0IGh3aWZfcyAqLCB1OCk7CiAJdTgJKCpyZWFkX3N0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKIAl1OAkoKnJlYWRfYWx0c3RhdHVzKShzdHJ1Y3QgaHdpZl9zICopOwotCXU4CSgqcmVhZF9zZmZfZG1hX3N0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKIAogCXZvaWQJKCpzZXRfaXJxKShzdHJ1Y3QgaHdpZl9zICosIGludCk7CiAKQEAgLTc0NSwxNCArNzM0LDE3IEBACiAJaW50CSgqZG1hX3Rlc3RfaXJxKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKik7CiAJdm9pZAkoKmRtYV9sb3N0X2lycSkoc3RydWN0IGlkZV9kcml2ZV9zICopOwogCXZvaWQJKCpkbWFfdGltZW91dCkoc3RydWN0IGlkZV9kcml2ZV9zICopOworCS8qCisJICogVGhlIGZvbGxvd2luZyBtZXRob2QgaXMgb3B0aW9uYWwgYW5kIG9ubHkgcmVxdWlyZWQgdG8gYmUKKwkgKiBpbXBsZW1lbnRlZCBmb3IgdGhlIFNGRi04MDM4aSBjb21wYXRpYmxlIGNvbnRyb2xsZXJzLgorCSAqLworCXU4CSgqZG1hX3NmZl9yZWFkX3N0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKIH07CiAKIHN0cnVjdCBpZGVfaG9zdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaHdpZl9zIHsKLQlzdHJ1Y3QgaHdpZl9zICpuZXh0OwkJLyogZm9yIGxpbmtlZC1saXN0IGluIGlkZV9od2dyb3VwX3QgKi8KIAlzdHJ1Y3QgaHdpZl9zICptYXRlOwkJLyogb3RoZXIgaHdpZiBmcm9tIHNhbWUgUENJIGNoaXAgKi8KLQlzdHJ1Y3QgaHdncm91cF9zICpod2dyb3VwOwkvKiBhY3R1YWxseSAoaWRlX2h3Z3JvdXBfdCAqKSAqLwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsJLyogL3Byb2MvaWRlLyBkaXJlY3RvcnkgZW50cnkgKi8KIAogCXN0cnVjdCBpZGVfaG9zdCAqaG9zdDsKQEAgLTc2Myw3ICs3NTUsNyBAQAogCiAJdW5zaWduZWQgbG9uZwlzYXRhX3NjcltTQVRBX05SX1BPUlRTXTsKIAotCWlkZV9kcml2ZV90CWRyaXZlc1tNQVhfRFJJVkVTXTsJLyogZHJpdmUgaW5mbyAqLworCWlkZV9kcml2ZV90CSpkZXZpY2VzW01BWF9EUklWRVMgKyAxXTsKIAogCXU4IG1ham9yOwkvKiBvdXIgbWFqb3IgbnVtYmVyICovCiAJdTggaW5kZXg7CS8qIDAgZm9yIGlkZTA7IDEgZm9yIGlkZTE7IC4uLiAqLwpAQCAtODI5LDcgKzgyMSw3IEBACiAJdW5zaWduZWQJZXh0cmFfcG9ydHM7CS8qIG51bWJlciBvZiBleHRyYSBkbWEgcG9ydHMgKi8KIAogCXVuc2lnbmVkCXByZXNlbnQgICAgOiAxOwkvKiB0aGlzIGludGVyZmFjZSBleGlzdHMgKi8KLQl1bnNpZ25lZAlzZ19tYXBwZWQgIDogMTsJLyogc2dfdGFibGUgYW5kIHNnX25lbnRzIGFyZSByZWFkeSAqLworCXVuc2lnbmVkCWJ1c3kJICAgOiAxOyAvKiBzZXJpYWxpemVzIGRldmljZXMgb24gYSBwb3J0ICovCiAKIAlzdHJ1Y3QgZGV2aWNlCQlnZW5kZXY7CiAJc3RydWN0IGRldmljZQkJKnBvcnRkZXY7CkBAIC04NDEsMTkgKzgzMyw0OSBAQAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERUFDUEkKIAlzdHJ1Y3QgaWRlX2FjcGlfaHdpZl9saW5rICphY3BpZGF0YTsKICNlbmRpZgorCisJLyogSVJRIGhhbmRsZXIsIGlmIGFjdGl2ZSAqLworCWlkZV9zdGFydHN0b3BfdAkoKmhhbmRsZXIpKGlkZV9kcml2ZV90ICopOworCisJLyogQk9PTDogcG9sbGluZyBhY3RpdmUgJiBwb2xsX3RpbWVvdXQgZmllbGQgdmFsaWQgKi8KKwl1bnNpZ25lZCBpbnQgcG9sbGluZyA6IDE7CisKKwkvKiBjdXJyZW50IGRyaXZlICovCisJaWRlX2RyaXZlX3QgKmN1cl9kZXY7CisKKwkvKiBjdXJyZW50IHJlcXVlc3QgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisKKwkvKiBmYWlsc2FmZSB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCS8qIHRpbWVvdXQgdmFsdWUgZHVyaW5nIGxvbmcgcG9sbHMgKi8KKwl1bnNpZ25lZCBsb25nIHBvbGxfdGltZW91dDsKKwkvKiBxdWVyaWVkIHVwb24gdGltZW91dHMgKi8KKwlpbnQgKCpleHBpcnkpKGlkZV9kcml2ZV90ICopOworCisJaW50IHJlcV9nZW47CisJaW50IHJlcV9nZW5fdGltZXI7CisKKwlzcGlubG9ja190IGxvY2s7CiB9IF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXAgaWRlX2h3aWZfdDsKIAogI2RlZmluZSBNQVhfSE9TVF9QT1JUUyA0CiAKIHN0cnVjdCBpZGVfaG9zdCB7Ci0JaWRlX2h3aWZfdAkqcG9ydHNbTUFYX0hPU1RfUE9SVFNdOworCWlkZV9od2lmX3QJKnBvcnRzW01BWF9IT1NUX1BPUlRTICsgMV07CiAJdW5zaWduZWQgaW50CW5fcG9ydHM7CiAJc3RydWN0IGRldmljZQkqZGV2WzJdOwogCXVuc2lnbmVkIGludAkoKmluaXRfY2hpcHNldCkoc3RydWN0IHBjaV9kZXYgKik7CiAJdW5zaWduZWQgbG9uZwlob3N0X2ZsYWdzOwogCXZvaWQJCSpob3N0X3ByaXY7CisJaWRlX2h3aWZfdAkqY3VyX3BvcnQ7CS8qIGZvciBob3N0cyByZXF1aXJpbmcgc2VyaWFsaXphdGlvbiAqLworCisJLyogdXNlZCBmb3IgaG9zdHMgcmVxdWlyaW5nIHNlcmlhbGl6YXRpb24gKi8KKwl2b2xhdGlsZSBsb25nCWhvc3RfYnVzeTsKIH07CiAKKyNkZWZpbmUgSURFX0hPU1RfQlVTWSAwCisKIC8qCiAgKiAgaW50ZXJuYWwgaWRlIGludGVycnVwdCBoYW5kbGVyIHR5cGUKICAqLwpAQCAtODYzLDM4ICs4ODUsNiBAQAogLyogdXNlZCBieSBpZGUtY2QsIGlkZS1mbG9wcHksIGV0Yy4gKi8KIHR5cGVkZWYgdm9pZCAoeGZlcl9mdW5jX3QpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSwgdm9pZCAqLCB1bnNpZ25lZCk7CiAKLXR5cGVkZWYgc3RydWN0IGh3Z3JvdXBfcyB7Ci0JCS8qIGlycSBoYW5kbGVyLCBpZiBhY3RpdmUgKi8KLQlpZGVfc3RhcnRzdG9wX3QJKCpoYW5kbGVyKShpZGVfZHJpdmVfdCAqKTsKLQotCQkvKiBCT09MOiBwcm90ZWN0cyBhbGwgZmllbGRzIGJlbG93ICovCi0Jdm9sYXRpbGUgaW50IGJ1c3k7Ci0JCS8qIEJPT0w6IHBvbGxpbmcgYWN0aXZlICYgcG9sbF90aW1lb3V0IGZpZWxkIHZhbGlkICovCi0JdW5zaWduZWQgaW50IHBvbGxpbmcJOiAxOwotCi0JCS8qIGN1cnJlbnQgZHJpdmUgKi8KLQlpZGVfZHJpdmVfdCAqZHJpdmU7Ci0JCS8qIHB0ciB0byBjdXJyZW50IGh3aWYgaW4gbGlua2VkLWxpc3QgKi8KLQlpZGVfaHdpZl90ICpod2lmOwotCi0JCS8qIGN1cnJlbnQgcmVxdWVzdCAqLwotCXN0cnVjdCByZXF1ZXN0ICpycTsKLQotCQkvKiBmYWlsc2FmZSB0aW1lciAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwotCQkvKiB0aW1lb3V0IHZhbHVlIGR1cmluZyBsb25nIHBvbGxzICovCi0JdW5zaWduZWQgbG9uZyBwb2xsX3RpbWVvdXQ7Ci0JCS8qIHF1ZXJpZWQgdXBvbiB0aW1lb3V0cyAqLwotCWludCAoKmV4cGlyeSkoaWRlX2RyaXZlX3QgKik7Ci0KLQlpbnQgcmVxX2dlbjsKLQlpbnQgcmVxX2dlbl90aW1lcjsKLQotCXNwaW5sb2NrX3QgbG9jazsKLX0gaWRlX2h3Z3JvdXBfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaWRlX2RyaXZlcl9zIGlkZV9kcml2ZXJfdDsKLQogZXh0ZXJuIHN0cnVjdCBtdXRleCBpZGVfc2V0dGluZ19tdHg7CiAKIC8qCkBAIC0xMDIwLDggKzEwMTAsOCBAQAogdm9pZCBpZGVfcHJvY19wb3J0X3JlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqKTsKIHZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kZXZpY2UoaWRlX2RyaXZlX3QgKik7CiB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfcG9ydChpZGVfaHdpZl90ICopOwotdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgaWRlX2RyaXZlcl90ICopOwotdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqLCBpZGVfZHJpdmVyX3QgKik7Cit2b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgaWRlX2RyaXZlciAqKTsKK3ZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGlkZV9kcml2ZXIgKik7CiAKIHJlYWRfcHJvY190IHByb2NfaWRlX3JlYWRfY2FwYWNpdHk7CiByZWFkX3Byb2NfdCBwcm9jX2lkZV9yZWFkX2dlb21ldHJ5OwpAQCAtMTA0OCw4ICsxMDM4LDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpIHsgOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kZXZpY2UoaWRlX2RyaXZlX3QgKmRyaXZlKSB7IDsgfQogc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfcG9ydChpZGVfaHdpZl90ICpod2lmKSB7IDsgfQotc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKSB7IDsgfQotc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2RyaXZlcl90ICpkcml2ZXIpIHsgOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJCQkJICAgIHN0cnVjdCBpZGVfZHJpdmVyICpkcml2ZXIpIHsgOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLAorCQkJCQkgICAgICBzdHJ1Y3QgaWRlX2RyaXZlciAqZHJpdmVyKSB7IDsgfQogI2RlZmluZSBQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKSByZXR1cm4gMDsKICNlbmRpZgogCkBAIC0xMTE4LDExICsxMTEwLDEwIEBACiAgKiBUaGUgZ2VuZHJpdmVyLm93bmVyIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gdGhlIG1vZHVsZSBvd25lciBvZiB0aGlzIGRyaXZlci4KICAqIFRoZSBnZW5kcml2ZXIubmFtZSBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoaXMgZHJpdmVyCiAgKi8KLXN0cnVjdCBpZGVfZHJpdmVyX3Mgeworc3RydWN0IGlkZV9kcml2ZXIgewogCWNvbnN0IGNoYXIJCQkqdmVyc2lvbjsKIAlpZGVfc3RhcnRzdG9wX3QJKCpkb19yZXF1ZXN0KShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzZWN0b3JfdCk7CiAJaW50CQkoKmVuZF9yZXF1ZXN0KShpZGVfZHJpdmVfdCAqLCBpbnQsIGludCk7Ci0JaWRlX3N0YXJ0c3RvcF90CSgqZXJyb3IpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSwgdTgsIHU4KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglnZW5fZHJpdmVyOwogCWludAkJKCpwcm9iZSkoaWRlX2RyaXZlX3QgKik7CiAJdm9pZAkJKCpyZW1vdmUpKGlkZV9kcml2ZV90ICopOwpAQCAtMTEzNCw3ICsxMTI1LDcgQEAKICNlbmRpZgogfTsKIAotI2RlZmluZSB0b19pZGVfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydiwgaWRlX2RyaXZlcl90LCBnZW5fZHJpdmVyKQorI2RlZmluZSB0b19pZGVfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydiwgc3RydWN0IGlkZV9kcml2ZXIsIGdlbl9kcml2ZXIpCiAKIGludCBpZGVfZGV2aWNlX2dldChpZGVfZHJpdmVfdCAqKTsKIHZvaWQgaWRlX2RldmljZV9wdXQoaWRlX2RyaXZlX3QgKik7CkBAIC0xMTY2LDkgKzExNTcsNyBAQAogCiB2b2lkIGlkZV9wYWRfdHJhbnNmZXIoaWRlX2RyaXZlX3QgKiwgaW50LCBpbnQpOwogCi1pZGVfc3RhcnRzdG9wX3QgX19pZGVfZXJyb3IoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdTgsIHU4KTsKLQotaWRlX3N0YXJ0c3RvcF90IGlkZV9lcnJvciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICptc2csIGJ5dGUgc3RhdCk7CitpZGVfc3RhcnRzdG9wX3QgaWRlX2Vycm9yKGlkZV9kcml2ZV90ICosIGNvbnN0IGNoYXIgKiwgdTgpOwogCiB2b2lkIGlkZV9maXhfZHJpdmVpZCh1MTYgKik7CiAKQEAgLTExOTIsNyArMTE4MSw2IEBACiB2b2lkIGlkZV9leGVjX2NvbW1hbmQoaWRlX2h3aWZfdCAqLCB1OCk7CiB1OCBpZGVfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqKTsKIHU4IGlkZV9yZWFkX2FsdHN0YXR1cyhpZGVfaHdpZl90ICopOwotdTggaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMoaWRlX2h3aWZfdCAqKTsKIAogdm9pZCBpZGVfc2V0X2lycShpZGVfaHdpZl90ICosIGludCk7CiAKQEAgLTEyNzIsMjYgKzEyNjAsNiBAQAogCiBleHRlcm4gdm9pZCBpZGVfdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGlycXJldHVybl90IGlkZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlkZV9sb2NrX2h3Z3JvdXAoaWRlX2h3Z3JvdXBfdCAqaHdncm91cCkKLXsKLQlpZiAoaHdncm91cC0+YnVzeSkKLQkJcmV0dXJuIDE7Ci0KLQlod2dyb3VwLT5idXN5ID0gMTsKLQkvKiBmb3IgYXRhcmkgb25seSAqLwotCWlkZV9nZXRfbG9jayhpZGVfaW50ciwgaHdncm91cCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGlkZV91bmxvY2tfaHdncm91cChpZGVfaHdncm91cF90ICpod2dyb3VwKQotewotCS8qIGZvciBhdGFyaSBvbmx5ICovCi0JaWRlX3JlbGVhc2VfbG9jaygpOwotCWh3Z3JvdXAtPmJ1c3kgPSAwOwotfQotCiBleHRlcm4gdm9pZCBkb19pZGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIAogdm9pZCBpZGVfaW5pdF9kaXNrKHN0cnVjdCBnZW5kaXNrICosIGlkZV9kcml2ZV90ICopOwpAQCAtMTMyNywxMSArMTI5NSwxMSBAQAogfQogI2VuZGlmCiAKLXR5cGVkZWYgc3RydWN0IGlkZV9wY2lfZW5hYmxlYml0X3Mgeworc3RydWN0IGlkZV9wY2lfZW5hYmxlYml0IHsKIAl1OAlyZWc7CS8qIGJ5dGUgcGNpIHJlZyBob2xkaW5nIHRoZSBlbmFibGUtYml0ICovCiAJdTgJbWFzazsJLyogbWFzayB0byBpc29sYXRlIHRoZSBlbmFibGUtYml0ICovCiAJdTgJdmFsOwkvKiB2YWx1ZSBvZiBtYXNrZWQgcmVnIHdoZW4gImVuYWJsZWQiICovCi19IGlkZV9wY2lfZW5hYmxlYml0X3Q7Cit9OwogCiBlbnVtIHsKIAkvKiBVc2VzIElTQSBjb250cm9sIHBvcnRzIG5vdCBQQ0kgb25lcy4gKi8KQEAgLTE0MjAsNyArMTM4OCw4IEBACiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcwkqcG9ydF9vcHM7CiAJY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzCSpkbWFfb3BzOwogCi0JaWRlX3BjaV9lbmFibGViaXRfdAllbmFibGViaXRzWzJdOworCXN0cnVjdCBpZGVfcGNpX2VuYWJsZWJpdAllbmFibGViaXRzWzJdOworCiAJaHdpZl9jaGlwc2V0X3QJCWNoaXBzZXQ7CiAKIAl1MTYJCQltYXhfc2VjdG9yczsJLyogaWYgPCB0aGFuIHRoZSBkZWZhdWx0IG9uZSAqLwpAQCAtMTQ5Miw2ICsxNDYxLDcgQEAKIGV4dGVybiB2b2lkIGlkZV9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKik7CiBpbnQgaWRlX2RtYV9lbmQoaWRlX2RyaXZlX3QgKik7CiBpbnQgaWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqKTsKK3U4IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzKGlkZV9od2lmX3QgKik7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzIHNmZl9kbWFfb3BzOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGNvbmZpZ19kcml2ZV9mb3JfZG1hKGlkZV9kcml2ZV90ICpkcml2ZSkgeyByZXR1cm4gMDsgfQpAQCAtMTUyOSw5ICsxNDk5LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfYWNwaV9zZXRfc3RhdGUoaWRlX2h3aWZfdCAqaHdpZiwgaW50IG9uKSB7fQogI2VuZGlmCiAKLXZvaWQgaWRlX3JlbW92ZV9wb3J0X2Zyb21faHdncm91cChpZGVfaHdpZl90ICopOwotdm9pZCBpZGVfdW5yZWdpc3RlcihpZGVfaHdpZl90ICopOwotCiB2b2lkIGlkZV9yZWdpc3Rlcl9yZWdpb24oc3RydWN0IGdlbmRpc2sgKik7CiB2b2lkIGlkZV91bnJlZ2lzdGVyX3JlZ2lvbihzdHJ1Y3QgZ2VuZGlzayAqKTsKIApAQCAtMTYxNiwyMyArMTU4Myw2IEBACiAJaWRlX3NldF9waW8oZHJpdmUsIDI1NSk7CiB9CiAKLWV4dGVybiBzcGlubG9ja190IGlkZV9sb2NrOwotZXh0ZXJuIHN0cnVjdCBtdXRleCBpZGVfY2ZnX210eDsKLS8qCi0gKiBTdHJ1Y3R1cmUgbG9ja2luZzoKLSAqCi0gKiBpZGVfY2ZnX210eCBhbmQgaHdncm91cC0+bG9jayB0b2dldGhlciBwcm90ZWN0IGNoYW5nZXMgdG8KLSAqIGlkZV9od2lmX3QtPm5leHQKLSAqIGlkZV9kcml2ZV90LT5uZXh0Ci0gKgotICogaWRlX2h3Z3JvdXBfdC0+YnVzeTogaHdncm91cC0+bG9jawotICogaWRlX2h3Z3JvdXBfdC0+aHdpZjogaHdncm91cC0+bG9jawotICogaWRlX2h3aWZfdC0+e2h3Z3JvdXAsbWF0ZX06IGNvbnN0YW50LCBubyBsb2NraW5nCi0gKiBpZGVfZHJpdmVfdC0+aHdpZjogY29uc3RhbnQsIG5vIGxvY2tpbmcKLSAqLwotCi0jZGVmaW5lIGxvY2FsX2lycV9zZXQoZmxhZ3MpCWRvIHsgbG9jYWxfc2F2ZV9mbGFncygoZmxhZ3MpKTsgbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7IH0gd2hpbGUgKDApCi0KIGNoYXIgKmlkZV9tZWRpYV9zdHJpbmcoaWRlX2RyaXZlX3QgKik7CiAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpZGVfZGV2X2F0dHJzW107CkBAIC0xNjUxLDggKzE2MDEsMTUgQEAKIAogc3RhdGljIGlubGluZSBpZGVfZHJpdmVfdCAqaWRlX2dldF9wYWlyX2RldihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKnBlZXIgPSAmZHJpdmUtPmh3aWYtPmRyaXZlc1soZHJpdmUtPmRuIF4gMSkgJiAxXTsKKwlpZGVfZHJpdmVfdCAqcGVlciA9IGRyaXZlLT5od2lmLT5kZXZpY2VzWyhkcml2ZS0+ZG4gXiAxKSAmIDFdOwogCiAJcmV0dXJuIChwZWVyLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPyBwZWVyIDogTlVMTDsKIH0KKworI2RlZmluZSBpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZGV2LCBwb3J0KSBcCisJZm9yICgoaSkgPSAwOyAoKGRldikgPSAocG9ydCktPmRldmljZXNbaV0pIHx8IChpKSA8IE1BWF9EUklWRVM7IChpKSsrKQorCisjZGVmaW5lIGlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgcG9ydCwgaG9zdCkgXAorCWZvciAoKGkpID0gMDsgKChwb3J0KSA9IChob3N0KS0+cG9ydHNbaV0pIHx8IChpKSA8IE1BWF9IT1NUX1BPUlRTOyAoaSkrKykKKwogI2VuZGlmIC8qIF9JREVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggMDcwMmM0ZC4uYWY4ODZiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFuci5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGNhOWZmNjQuLjZiOGUyMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtNDgsNiArNDgsMTIgQEAKICNkZWZpbmUgRklFTERfU0laRU9GKHQsIGYpIChzaXplb2YoKCh0KikwKS0+ZikpCiAjZGVmaW5lIERJVl9ST1VORF9VUChuLGQpICgoKG4pICsgKGQpIC0gMSkgLyAoZCkpCiAjZGVmaW5lIHJvdW5kdXAoeCwgeSkgKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpCisjZGVmaW5lIERJVl9ST1VORF9DTE9TRVNUKHgsIGRpdmlzb3IpKAkJCVwKK3sJCQkJCQkJXAorCXR5cGVvZihkaXZpc29yKSBfX2Rpdmlzb3IgPSBkaXZpc29yOwkJXAorCSgoKHgpICsgKChfX2Rpdmlzb3IpIC8gMikpIC8gKF9fZGl2aXNvcikpOwlcCit9CQkJCQkJCVwKKykKIAogI2RlZmluZSBfUkVUX0lQXwkJKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApCiAjZGVmaW5lIF9USElTX0lQXyAgKHsgX19sYWJlbF9fIF9faGVyZTsgX19oZXJlOiAodW5zaWduZWQgbG9uZykmJl9faGVyZTsgfSkKQEAgLTM0OSwxMyArMzU1LDEzIEBACiAgICAgICAgIHByaW50ayhLRVJOX0lORk8gcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCiAKIC8qIElmIHlvdSBhcmUgd3JpdGluZyBhIGRyaXZlciwgcGxlYXNlIHVzZSBkZXZfZGJnIGluc3RlYWQgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRykKKyNpZiBkZWZpbmVkKERFQlVHKQorI2RlZmluZSBwcl9kZWJ1ZyhmbXQsIC4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2VsaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCiAjZGVmaW5lIHByX2RlYnVnKGZtdCwgLi4uKSBkbyB7IFwKIAlkeW5hbWljX3ByX2RlYnVnKHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKTsgXAogCX0gd2hpbGUgKDApCi0jZWxpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBwcl9kZWJ1ZyhmbXQsIC4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogI2Vsc2UKICNkZWZpbmUgcHJfZGVidWcoZm10LCAuLi4pIFwKIAkoeyBpZiAoMCkgcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pOyAwOyB9KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rbGlzdC5oIGIvaW5jbHVkZS9saW51eC9rbGlzdC5oCmluZGV4IDhlYTk4ZGIuLmQ1YTI3YWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2xpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tsaXN0LmgKQEAgLTEzLDcgKzEzLDYgQEAKICNkZWZpbmUgX0xJTlVYX0tMSVNUX0gKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKQEAgLTQxLDcgKzQwLDYgQEAKIAl2b2lkCQkJKm5fa2xpc3Q7CS8qIG5ldmVyIGFjY2VzcyBkaXJlY3RseSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbl9ub2RlOwogCXN0cnVjdCBrcmVmCQluX3JlZjsKLQlzdHJ1Y3QgY29tcGxldGlvbgluX3JlbW92ZWQ7CiB9OwogCiBleHRlcm4gdm9pZCBrbGlzdF9hZGRfdGFpbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiwgc3RydWN0IGtsaXN0ICprKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKaW5kZXggNDk3YjFkMS4uZDZlYTE5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKQEAgLTY5LDkgKzY5LDYgQEAKIAkvKiBsaXN0IG9mIGtwcm9iZXMgZm9yIG11bHRpLWhhbmRsZXIgc3VwcG9ydCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAotCS8qIEluZGljYXRlcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSBoYXMgYmVlbiByZWYgY291bnRlZCAqLwotCXVuc2lnbmVkIGludCBtb2RfcmVmY291bnRlZDsKLQogCS8qY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIHByb2JlIHdhcyB0ZW1wb3JhcmlseSBkaXNhcm1lZCAqLwogCXVuc2lnbmVkIGxvbmcgbm1pc3NlZDsKIApAQCAtMTAzLDggKzEwMCwxOSBAQAogCiAJLyogY29weSBvZiB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KIAlzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuIGFpbnNuOworCisJLyogSW5kaWNhdGVzIHZhcmlvdXMgc3RhdHVzIGZsYWdzLiAgUHJvdGVjdGVkIGJ5IGtwcm9iZV9tdXRleC4gKi8KKwl1MzIgZmxhZ3M7CiB9OwogCisvKiBLcHJvYmUgc3RhdHVzIGZsYWdzICovCisjZGVmaW5lIEtQUk9CRV9GTEFHX0dPTkUJMSAvKiBicmVha3BvaW50IGhhcyBhbHJlYWR5IGdvbmUgKi8KKworc3RhdGljIGlubGluZSBpbnQga3Byb2JlX2dvbmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKKwlyZXR1cm4gcC0+ZmxhZ3MgJiBLUFJPQkVfRkxBR19HT05FOworfQorCiAvKgogICogU3BlY2lhbCBwcm9iZSB0eXBlIHRoYXQgdXNlcyBzZXRqbXAtbG9uZ2ptcCB0eXBlIHRyaWNrcyB0byByZXN1bWUKICAqIGV4ZWN1dGlvbiBhdCBhIHNwZWNpZmllZCBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgcHJvdG90eXBlIGNvcnJlc3BvbmRpbmcKQEAgLTIwMSw3ICsyMDksNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19LUFJPQkVTX1NBTklUWV9URVNUICovCiAKLWV4dGVybiBzdHJ1Y3QgbXV0ZXgga3Byb2JlX211dGV4OwogZXh0ZXJuIGludCBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogZXh0ZXJuIHZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogZXh0ZXJuIHZvaWQgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LmgKaW5kZXggMzZjODJjOS4uM2ZkYzEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS5oCkBAIC03OSwxNCArNzksMTQgQEAKICNlbHNlCiBleHRlcm4gaW50IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKIGV4dGVybiB2b2lkIHVucmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwotZXh0ZXJuIGludCByZWdpc3Rlcl9uZXdfbWVtb3J5KHN0cnVjdCBtZW1fc2VjdGlvbiAqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShpbnQsIHN0cnVjdCBtZW1fc2VjdGlvbiAqKTsKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9tZW1vcnlfc2VjdGlvbihzdHJ1Y3QgbWVtX3NlY3Rpb24gKik7CiBleHRlcm4gaW50IG1lbW9yeV9kZXZfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgcmVtb3ZlX21lbW9yeV9ibG9jayh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgbWVtX3NlY3Rpb24gKiwgaW50KTsKIGV4dGVybiBpbnQgbWVtb3J5X25vdGlmeSh1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqdik7CitleHRlcm4gc3RydWN0IG1lbW9yeV9ibG9jayAqZmluZF9tZW1vcnlfYmxvY2soc3RydWN0IG1lbV9zZWN0aW9uICopOwogI2RlZmluZSBDT05GSUdfTUVNX0JMT0NLX1NJWkUJKFBBR0VTX1BFUl9TRUNUSU9OPDxQQUdFX1NISUZUKQotCi0KK2VudW0gbWVtX2FkZF9jb250ZXh0IHsgQk9PVCwgSE9UUExVRyB9OwogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVR19TUEFSU0UgKi8KIAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oCmluZGV4IDc2M2JhODEuLmQ5NWY3MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgKQEAgLTcyLDcgKzcyLDcgQEAKIGV4dGVybiBpbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIAogLyogcmVhc29uYWJseSBnZW5lcmljIGludGVyZmFjZSB0byBleHBhbmQgdGhlIHBoeXNpY2FsIHBhZ2VzIGluIGEgem9uZSAgKi8KLWV4dGVybiBpbnQgX19hZGRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorZXh0ZXJuIGludCBfX2FkZF9wYWdlcyhpbnQgbmlkLCBzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiBleHRlcm4gaW50IF9fcmVtb3ZlX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oIGIvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKaW5kZXggM2YzNDAwNS4uNTI3NjAyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKQEAgLTcsNiArNyw4IEBACiB0eXBlZGVmIHN0cnVjdCBwYWdlICpuZXdfcGFnZV90KHN0cnVjdCBwYWdlICosIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50ICoqKTsKIAogI2lmZGVmIENPTkZJR19NSUdSQVRJT04KKyNkZWZpbmUgUEFHRV9NSUdSQVRJT04gMQorCiBleHRlcm4gaW50IHB1dGJhY2tfbHJ1X3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwpOwogZXh0ZXJuIGludCBtaWdyYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwKIAkJCXN0cnVjdCBwYWdlICosIHN0cnVjdCBwYWdlICopOwpAQCAtMjAsNiArMjIsOCBAQAogCQljb25zdCBub2RlbWFza190ICpmcm9tLCBjb25zdCBub2RlbWFza190ICp0bywKIAkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiAjZWxzZQorI2RlZmluZSBQQUdFX01JR1JBVElPTiAwCisKIHN0YXRpYyBpbmxpbmUgaW50IHB1dGJhY2tfbHJ1X3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IG1pZ3JhdGVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCwgbmV3X3BhZ2VfdCB4LAogCQl1bnNpZ25lZCBsb25nIHByaXZhdGUpIHsgcmV0dXJuIC1FTk9TWVM7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKaW5kZXggMjY0MzNlYy4uYTgyMGY4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKQEAgLTMsMzMgKzMsMzMgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogCi0jZGVmaW5lIFBTTU9VU0VfTUlOT1IgIDEKLSNkZWZpbmUgTVNfQlVTTU9VU0VfTUlOT1IgMgotI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUiAzCi0vKiNkZWZpbmUgQU1JR0FNT1VTRV9NSU5PUiA0CUZJWE1FIE9CU09MRVRFICovCi0jZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IgNQotI2RlZmluZSBTVU5fTU9VU0VfTUlOT1IgNgotI2RlZmluZSBBUE9MTE9fTU9VU0VfTUlOT1IgNwotI2RlZmluZSBQQzExMFBBRF9NSU5PUiA5Ci0vKiNkZWZpbmUgQURCX01PVVNFX01JTk9SIDEwCUZJWE1FIE9CU09MRVRFICovCisjZGVmaW5lIFBTTU9VU0VfTUlOT1IJCTEKKyNkZWZpbmUgTVNfQlVTTU9VU0VfTUlOT1IJMgorI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUgkzCisvKiNkZWZpbmUgQU1JR0FNT1VTRV9NSU5PUgk0CUZJWE1FIE9CU09MRVRFICovCisjZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IJNQorI2RlZmluZSBTVU5fTU9VU0VfTUlOT1IJCTYKKyNkZWZpbmUgQVBPTExPX01PVVNFX01JTk9SCTcKKyNkZWZpbmUgUEMxMTBQQURfTUlOT1IJCTkKKy8qI2RlZmluZSBBREJfTU9VU0VfTUlOT1IJMTAJRklYTUUgT0JTT0xFVEUgKi8KICNkZWZpbmUgV0FUQ0hET0dfTUlOT1IJCTEzMAkvKiBXYXRjaGRvZyB0aW1lciAgICAgKi8KICNkZWZpbmUgVEVNUF9NSU5PUgkJMTMxCS8qIFRlbXBlcmF0dXJlIFNlbnNvciAqLwotI2RlZmluZSBSVENfTUlOT1IgMTM1CisjZGVmaW5lIFJUQ19NSU5PUgkJMTM1CiAjZGVmaW5lIEVGSV9SVENfTUlOT1IJCTEzNgkvKiBFRkkgVGltZSBzZXJ2aWNlcyAqLwotI2RlZmluZSBTVU5fT1BFTlBST01fTUlOT1IgMTM5CisjZGVmaW5lIFNVTl9PUEVOUFJPTV9NSU5PUgkxMzkKICNkZWZpbmUgRE1BUElfTUlOT1IJCTE0MAkvKiBETUFQSSAqLwotI2RlZmluZSBOVlJBTV9NSU5PUiAxNDQKLSNkZWZpbmUgU0dJX01NVElNRVIgICAgICAgIDE1MworI2RlZmluZSBOVlJBTV9NSU5PUgkJMTQ0CisjZGVmaW5lIFNHSV9NTVRJTUVSCQkxNTMKICNkZWZpbmUgU1RPUkVfUVVFVUVfTUlOT1IJMTU1Ci0jZGVmaW5lIEkyT19NSU5PUiAxNjYKKyNkZWZpbmUgSTJPX01JTk9SCQkxNjYKICNkZWZpbmUgTUlDUk9DT0RFX01JTk9SCQkxODQKLSNkZWZpbmUgTVdBVkVfTUlOT1IJMjE5CQkvKiBBQ1AvTXdhdmUgTW9kZW0gKi8KLSNkZWZpbmUgTVBUX01JTk9SCTIyMAotI2RlZmluZSBNSVNDX0RZTkFNSUNfTUlOT1IgMjU1Ci0KLSNkZWZpbmUgVFVOX01JTk9SCSAgICAgMjAwCi0jZGVmaW5lCUhQRVRfTUlOT1IJICAgICAyMjgKLSNkZWZpbmUgS1ZNX01JTk9SICAgICAgICAgICAgMjMyCisjZGVmaW5lIFRVTl9NSU5PUgkJMjAwCisjZGVmaW5lIE1XQVZFX01JTk9SCQkyMTkJLyogQUNQL013YXZlIE1vZGVtICovCisjZGVmaW5lIE1QVF9NSU5PUgkJMjIwCisjZGVmaW5lIEhQRVRfTUlOT1IJCTIyOAorI2RlZmluZSBGVVNFX01JTk9SCQkyMjkKKyNkZWZpbmUgS1ZNX01JTk9SCQkyMzIKKyNkZWZpbmUgTUlTQ19EWU5BTUlDX01JTk9SCTI1NQogCiBzdHJ1Y3QgZGV2aWNlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYWFhOGI4NC4uNGEzZDI4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtNzE3LDYgKzcxNywxMSBAQAogCiAjZGVmaW5lIFZNX0ZBVUxUX0VSUk9SCShWTV9GQVVMVF9PT00gfCBWTV9GQVVMVF9TSUdCVVMpCiAKKy8qCisgKiBDYW4gYmUgY2FsbGVkIGJ5IHRoZSBwYWdlZmF1bHQgaGFuZGxlciB3aGVuIGl0IGdldHMgYSBWTV9GQVVMVF9PT00uCisgKi8KK2V4dGVybiB2b2lkIHBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KHZvaWQpOworCiAjZGVmaW5lIG9mZnNldF9pbl9wYWdlKHApCSgodW5zaWduZWQgbG9uZykocCkgJiB+UEFHRV9NQVNLKQogCiBleHRlcm4gdm9pZCBzaG93X2ZyZWVfYXJlYXModm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCAzYmZlZDAxLi40ZjdlYTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTI5NCw5ICsyOTQsNiBAQAogCS8qIFRoZSBzaXplIG9mIHRoZSBleGVjdXRhYmxlIGNvZGUgaW4gZWFjaCBzZWN0aW9uLiAgKi8KIAl1bnNpZ25lZCBpbnQgaW5pdF90ZXh0X3NpemUsIGNvcmVfdGV4dF9zaXplOwogCi0JLyogVGhlIGhhbmRsZSByZXR1cm5lZCBmcm9tIHVud2luZF9hZGRfdGFibGUuICovCi0Jdm9pZCAqdW53aW5kX2luZm87Ci0KIAkvKiBBcmNoLXNwZWNpZmljIG1vZHVsZSB2YWx1ZXMgKi8KIAlzdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMgYXJjaDsKIApAQCAtMzY4LDYgKzM2NSwxOCBAQAogc3RydWN0IG1vZHVsZSAqX19tb2R1bGVfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcik7CiBpbnQgaXNfbW9kdWxlX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKTsKIAorc3RhdGljIGlubGluZSBpbnQgd2l0aGluX21vZHVsZV9jb3JlKHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9jb3JlIDw9IGFkZHIgJiYKKwkgICAgICAgYWRkciA8ICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUgKyBtb2QtPmNvcmVfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2l0aGluX21vZHVsZV9pbml0KHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0IDw9IGFkZHIgJiYKKwkgICAgICAgYWRkciA8ICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2luaXQgKyBtb2QtPmluaXRfc2l6ZTsKK30KKwogLyogUmV0dXJucyAwIGFuZCBmaWxscyBpbiB2YWx1ZSwgZGVmaW5lZCBhbmQgbmFtZWJ1Ziwgb3IgLUVSQU5HRSBpZgogICAgc3ltbnVtIG91dCBvZiByYW5nZS4gKi8KIGludCBtb2R1bGVfZ2V0X2thbGxzeW0odW5zaWduZWQgaW50IHN5bW51bSwgdW5zaWduZWQgbG9uZyAqdmFsdWUsIGNoYXIgKnR5cGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9jb25jYXQuaCBiL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCmluZGV4IGMwMmYzZDIuLmU4MGM2NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCkBAIC0xMyw3ICsxMyw3IEBACiBzdHJ1Y3QgbXRkX2luZm8gKm10ZF9jb25jYXRfY3JlYXRlKAogICAgIHN0cnVjdCBtdGRfaW5mbyAqc3ViZGV2W10sICAvKiBzdWJkZXZpY2VzIHRvIGNvbmNhdGVuYXRlICovCiAgICAgaW50IG51bV9kZXZzLCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJkZXZpY2VzICAgICAgKi8KLSAgICBjaGFyICpuYW1lKTsgICAgICAgICAgICAgICAgLyogbmFtZSBmb3IgdGhlIG5ldyBkZXZpY2UgICAqLworICAgIGNvbnN0IGNoYXIgKm5hbWUpOyAgICAgICAgICAvKiBuYW1lIGZvciB0aGUgbmV3IGRldmljZSAgICovCiAKIHZvaWQgbXRkX2NvbmNhdF9kZXN0cm95KHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ub2RlLmggYi9pbmNsdWRlL2xpbnV4L25vZGUuaAppbmRleCBiYzAwMWJjLi42ODFhNjk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25vZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25vZGUuaApAQCAtMjYsNiArMjYsNyBAQAogCXN0cnVjdCBzeXNfZGV2aWNlCXN5c2RldjsKIH07CiAKK3N0cnVjdCBtZW1vcnlfYmxvY2s7CiBleHRlcm4gc3RydWN0IG5vZGUgbm9kZV9kZXZpY2VzW107CiAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfbm9kZShzdHJ1Y3Qgbm9kZSAqLCBpbnQsIHN0cnVjdCBub2RlICopOwpAQCAtMzUsNiArMzYsOSBAQAogZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9vbmVfbm9kZShpbnQgbmlkKTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG5pZCk7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG5pZCk7CitleHRlcm4gaW50IHJlZ2lzdGVyX21lbV9zZWN0X3VuZGVyX25vZGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsaywKKwkJCQkJCWludCBuaWQpOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX21lbV9zZWN0X3VuZGVyX25vZGVzKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbV9ibGspOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX29uZV9ub2RlKGludCBuaWQpCiB7CkBAIC01Miw2ICs1NiwxNSBAQAogewogCXJldHVybiAwOwogfQorc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1fYmxrLAorCQkJCQkJCWludCBuaWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB1bnJlZ2lzdGVyX21lbV9zZWN0X3VuZGVyX25vZGVzKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbV9ibGspCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogI2RlZmluZSB0b19ub2RlKHN5c19kZXZpY2UpIGNvbnRhaW5lcl9vZihzeXNfZGV2aWNlLCBzdHJ1Y3Qgbm9kZSwgc3lzZGV2KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAppbmRleCBiMTJmOTNhLi4yMTlhNTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaApAQCAtMjI4LDYgKzIyOCw3IEBACiBQQUdFRkxBRyhTd2FwQ2FjaGUsIHN3YXBjYWNoZSkKICNlbHNlCiBQQUdFRkxBR19GQUxTRShTd2FwQ2FjaGUpCisJU0VUUEFHRUZMQUdfTk9PUChTd2FwQ2FjaGUpIENMRUFSUEFHRUZMQUdfTk9PUChTd2FwQ2FjaGUpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19VTkVWSUNUQUJMRV9MUlUKQEAgLTM3MiwzMSArMzczLDIyIEBACiAjZGVmaW5lIF9fUEdfTUxPQ0tFRAkJMAogI2VuZGlmCiAKLSNkZWZpbmUgUEFHRV9GTEFHUwkoMSA8PCBQR19scnUgICB8IDEgPDwgUEdfcHJpdmF0ZSAgIHwgMSA8PCBQR19sb2NrZWQgfCBcCi0JCQkgMSA8PCBQR19idWRkeSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgXAotCQkJIDEgPDwgUEdfc2xhYiAgfCAxIDw8IFBHX3N3YXBjYWNoZSB8IDEgPDwgUEdfYWN0aXZlIHwgXAotCQkJIF9fUEdfVU5FVklDVEFCTEUgfCBfX1BHX01MT0NLRUQpCi0KLS8qCi0gKiBGbGFncyBjaGVja2VkIGluIGJhZF9wYWdlKCkuICBQYWdlcyBvbiB0aGUgZnJlZSBsaXN0IHNob3VsZCBub3QgaGF2ZQotICogdGhlc2UgZmxhZ3Mgc2V0LiAgSXQgdGhleSBhcmUsIHRoZXJlIGlzIGEgcHJvYmxlbS4KLSAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NMRUFSX1dIRU5fQkFEIChQQUdFX0ZMQUdTIHwgXAotCQkxIDw8IFBHX3JlY2xhaW0gfCAxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19zd2FwYmFja2VkKQotCiAvKgogICogRmxhZ3MgY2hlY2tlZCB3aGVuIGEgcGFnZSBpcyBmcmVlZC4gIFBhZ2VzIGJlaW5nIGZyZWVkIHNob3VsZCBub3QgaGF2ZQogICogdGhlc2UgZmxhZ3Mgc2V0LiAgSXQgdGhleSBhcmUsIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUgKFBBR0VfRkxBR1MgfCAxIDw8IFBHX3Jlc2VydmVkKQorI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUgXAorCSgxIDw8IFBHX2xydSAgIHwgMSA8PCBQR19wcml2YXRlICAgfCAxIDw8IFBHX2xvY2tlZCB8IFwKKwkgMSA8PCBQR19idWRkeSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgMSA8PCBQR19yZXNlcnZlZCB8IFwKKwkgMSA8PCBQR19zbGFiICB8IDEgPDwgUEdfc3dhcGNhY2hlIHwgMSA8PCBQR19hY3RpdmUgfCBcCisJIF9fUEdfVU5FVklDVEFCTEUgfCBfX1BHX01MT0NLRUQpCiAKIC8qCiAgKiBGbGFncyBjaGVja2VkIHdoZW4gYSBwYWdlIGlzIHByZXBwZWQgZm9yIHJldHVybiBieSB0aGUgcGFnZSBhbGxvY2F0b3IuCi0gKiBQYWdlcyBiZWluZyBwcmVwcGVkIHNob3VsZCBub3QgaGF2ZSB0aGVzZSBmbGFncyBzZXQuICBJdCB0aGV5IGFyZSwgdGhlcmUKLSAqIGlzIGEgcHJvYmxlbS4KKyAqIFBhZ2VzIGJlaW5nIHByZXBwZWQgc2hvdWxkIG5vdCBoYXZlIGFueSBmbGFncyBzZXQuICBJdCB0aGV5IGFyZSBzZXQsCisgKiB0aGVyZSBoYXMgYmVlbiBhIGtlcm5lbCBidWcgb3Igc3RydWN0IHBhZ2UgY29ycnVwdGlvbi4KICAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVAgKFBBR0VfRkxBR1MgfCBcCi0JCTEgPDwgUEdfcmVzZXJ2ZWQgfCAxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19zd2FwYmFja2VkKQorI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVAJKCgxIDw8IE5SX1BBR0VGTEFHUykgLSAxKQogCiAjZW5kaWYgLyogIV9fR0VORVJBVElOR19CT1VORFNfSCAqLwogI2VuZGlmCS8qIFBBR0VfRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdldmVjLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaAppbmRleCBlOTBhMmNiLi43YjI4ODZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaApAQCAtMjEsNyArMjEsNiBAQAogfTsKIAogdm9pZCBfX3BhZ2V2ZWNfcmVsZWFzZShzdHJ1Y3QgcGFnZXZlYyAqcHZlYyk7Ci12b2lkIF9fcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYyk7CiB2b2lkIF9fcGFnZXZlY19mcmVlKHN0cnVjdCBwYWdldmVjICpwdmVjKTsKIHZvaWQgX19fX3BhZ2V2ZWNfbHJ1X2FkZChzdHJ1Y3QgcGFnZXZlYyAqcHZlYywgZW51bSBscnVfbGlzdCBscnUpOwogdm9pZCBwYWdldmVjX3N0cmlwKHN0cnVjdCBwYWdldmVjICpwdmVjKTsKQEAgLTY5LDEyICs2OCw2IEBACiAJCV9fcGFnZXZlY19yZWxlYXNlKHB2ZWMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKLXsKLQlpZiAocGFnZXZlY19jb3VudChwdmVjKSkKLQkJX19wYWdldmVjX3JlbGVhc2Vfbm9ubHJ1KHB2ZWMpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFnZXZlY19mcmVlKHN0cnVjdCBwYWdldmVjICpwdmVjKQogewogCWlmIChwYWdldmVjX2NvdW50KHB2ZWMpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggMDNiMGI4Yy4uNGJiMTU2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC00MjEsNyArNDIxLDYgQEAKIAlpbnQgICgqcmVzdW1lX2Vhcmx5KSAoc3RydWN0IHBjaV9kZXYgKmRldik7CiAJaW50ICAoKnJlc3VtZSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwkgICAgICAgICAgICAgICAgLyogRGV2aWNlIHdva2VuIHVwICovCiAJdm9pZCAoKnNodXRkb3duKSAoc3RydWN0IHBjaV9kZXYgKmRldik7Ci0Jc3RydWN0IHBtX2V4dF9vcHMgKnBtOwogCXN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgKmVycl9oYW5kbGVyOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyCWRyaXZlcjsKIAlzdHJ1Y3QgcGNpX2R5bmlkcyBkeW5pZHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IDIxOGM3M2IuLmQ1NDMzNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0xNjU4LDYgKzE2NTgsNyBAQAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JPQ0tXRUxMCQkweDEyN0EKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lURQkJMHgxMjgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzgxNzIJCTB4ODE3MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV84MjExCQkweDgyMTEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfODIxMgkJMHg4MjEyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzgyMTMJCTB4ODIxMwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCmluZGV4IDkwMDdjY2QuLjk5ZGU3YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKQEAgLTI0LDExICsyNCw3IEBACiAJczMyICpjb3VudGVyczsKIH07CiAKLSNpZiBOUl9DUFVTID49IDE2Ci0jZGVmaW5lIEZCQ19CQVRDSAkoTlJfQ1BVUyoyKQotI2Vsc2UKLSNkZWZpbmUgRkJDX0JBVENICShOUl9DUFVTKjQpCi0jZW5kaWYKK2V4dGVybiBpbnQgcGVyY3B1X2NvdW50ZXJfYmF0Y2g7CiAKIGludCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KTsKIGludCBwZXJjcHVfY291bnRlcl9pbml0X2lycShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCk7CkBAIC0zOSw3ICszNSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9hZGQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCiB7Ci0JX19wZXJjcHVfY291bnRlcl9hZGQoZmJjLCBhbW91bnQsIEZCQ19CQVRDSCk7CisJX19wZXJjcHVfY291bnRlcl9hZGQoZmJjLCBhbW91bnQsIHBlcmNwdV9jb3VudGVyX2JhdGNoKTsKIH0KIAogc3RhdGljIGlubGluZSBzNjQgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKaW5kZXggNGI4Y2M2YS4uOWEzNDI2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCkBAIC01NSw3ICs1NSw2IEBACiAJaW50ICgqc3VzcGVuZF9sYXRlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAJaW50ICgqcmVzdW1lX2Vhcmx5KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOwogCWludCAoKnJlc3VtZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKLQlzdHJ1Y3QgcG1fZXh0X29wcyAqcG07CiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbS5oIGIvaW5jbHVkZS9saW51eC9wbS5oCmluZGV4IDQyZGU0MDAuLmRlMmUwYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtLmgKQEAgLTQxLDcgKzQxLDcgQEAKIH0gcG1fbWVzc2FnZV90OwogCiAvKioKLSAqIHN0cnVjdCBwbV9vcHMgLSBkZXZpY2UgUE0gY2FsbGJhY2tzCisgKiBzdHJ1Y3QgZGV2X3BtX29wcyAtIGRldmljZSBQTSBjYWxsYmFja3MKICAqCiAgKiBTZXZlcmFsIGRyaXZlciBwb3dlciBzdGF0ZSB0cmFuc2l0aW9ucyBhcmUgZXh0ZXJuYWxseSB2aXNpYmxlLCBhZmZlY3RpbmcKICAqIHRoZSBzdGF0ZSBvZiBwZW5kaW5nIEkvTyBxdWV1ZXMgYW5kIChmb3IgZHJpdmVycyB0aGF0IHRvdWNoIGhhcmR3YXJlKQpAQCAtMTI2LDQ2ICsxMjYsNiBAQAogICoJT24gbW9zdCBwbGF0Zm9ybXMsIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gYXZhaWxhYmlsaXR5IG9mCiAgKglyZXNvdXJjZXMgbGlrZSBjbG9ja3MgZHVyaW5nIEByZXN0b3JlKCkuCiAgKgotICogQWxsIG9mIHRoZSBhYm92ZSBjYWxsYmFja3MsIGV4Y2VwdCBmb3IgQGNvbXBsZXRlKCksIHJldHVybiBlcnJvciBjb2Rlcy4KLSAqIEhvd2V2ZXIsIHRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBieSB0aGUgcmVzdW1lIG9wZXJhdGlvbnMsIEByZXN1bWUoKSwKLSAqIEB0aGF3KCksIGFuZCBAcmVzdG9yZSgpLCBkbyBub3QgY2F1c2UgdGhlIFBNIGNvcmUgdG8gYWJvcnQgdGhlIHJlc3VtZQotICogdHJhbnNpdGlvbiBkdXJpbmcgd2hpY2ggdGhleSBhcmUgcmV0dXJuZWQuICBUaGUgZXJyb3IgY29kZXMgcmV0dXJuZWQgaW4KLSAqIHRoYXQgY2FzZXMgYXJlIG9ubHkgcHJpbnRlZCBieSB0aGUgUE0gY29yZSB0byB0aGUgc3lzdGVtIGxvZ3MgZm9yIGRlYnVnZ2luZwotICogcHVycG9zZXMuICBTdGlsbCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBkcml2ZXJzIG9ubHkgcmV0dXJuIGVycm9yIGNvZGVzCi0gKiBmcm9tIHRoZWlyIHJlc3VtZSBtZXRob2RzIGluIGNhc2Ugb2YgYW4gdW5yZWNvdmVyYWJsZSBmYWlsdXJlIChpLmUuIHdoZW4gdGhlCi0gKiBkZXZpY2UgYmVpbmcgaGFuZGxlZCByZWZ1c2VzIHRvIHJlc3VtZSBhbmQgYmVjb21lcyB1bnVzYWJsZSkgdG8gYWxsb3cgdXMgdG8KLSAqIG1vZGlmeSB0aGUgUE0gY29yZSBpbiB0aGUgZnV0dXJlLCBzbyB0aGF0IGl0IGNhbiBhdm9pZCBhdHRlbXB0aW5nIHRvIGhhbmRsZQotICogZGV2aWNlcyB0aGF0IGZhaWxlZCB0byByZXN1bWUgYW5kIHRoZWlyIGNoaWxkcmVuLgotICoKLSAqIEl0IGlzIGFsbG93ZWQgdG8gdW5yZWdpc3RlciBkZXZpY2VzIHdoaWxlIHRoZSBhYm92ZSBjYWxsYmFja3MgYXJlIGJlaW5nCi0gKiBleGVjdXRlZC4gIEhvd2V2ZXIsIGl0IGlzIG5vdCBhbGxvd2VkIHRvIHVucmVnaXN0ZXIgYSBkZXZpY2UgZnJvbSB3aXRoaW4gYW55Ci0gKiBvZiBpdHMgb3duIGNhbGxiYWNrcy4KLSAqLwotCi1zdHJ1Y3QgcG1fb3BzIHsKLQlpbnQgKCpwcmVwYXJlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCXZvaWQgKCpjb21wbGV0ZSkoc3RydWN0IGRldmljZSAqZGV2KTsKLQlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqZGV2KTsKLQlpbnQgKCpmcmVlemUpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0JaW50ICgqdGhhdykoc3RydWN0IGRldmljZSAqZGV2KTsKLQlpbnQgKCpwb3dlcm9mZikoc3RydWN0IGRldmljZSAqZGV2KTsKLQlpbnQgKCpyZXN0b3JlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgcG1fZXh0X29wcyAtIGV4dGVuZGVkIGRldmljZSBQTSBjYWxsYmFja3MKLSAqCi0gKiBTb21lIGRldmljZXMgcmVxdWlyZSBjZXJ0YWluIG9wZXJhdGlvbnMgcmVsYXRlZCB0byBzdXNwZW5kIGFuZCBoaWJlcm5hdGlvbgotICogdG8gYmUgY2FycmllZCBvdXQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLiAgVGh1cywgJ3N0cnVjdCBwbV9leHRfb3BzJyBiZWxvdwotICogaXMgZGVmaW5lZCwgYWRkaW5nIGNhbGxiYWNrcyB0byBiZSBleGVjdXRlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgdG8KLSAqICdzdHJ1Y3QgcG1fb3BzJy4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIGNhbGxiYWNrcyBpbmNsdWRlZCBpbiAnc3RydWN0IHBtX2V4dF9vcHMnIGFyZSBleGVjdXRlZCB3aXRoCi0gKiB0aGUgbm9uYm9vdCBDUFVzIHN3aXRjaGVkIG9mZiBhbmQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIG9uIHRoZSBvbmx5Ci0gKiBmdW5jdGlvbmFsIENQVS4gIFRoZXkgYWxzbyBhcmUgZXhlY3V0ZWQgd2l0aCB0aGUgUE0gY29yZSBsaXN0IG9mIGRldmljZXMKLSAqIGxvY2tlZCwgc28gdGhleSBtdXN0IE5PVCB1bnJlZ2lzdGVyIGFueSBkZXZpY2VzLgotICoKICAqIEBzdXNwZW5kX25vaXJxOiBDb21wbGV0ZSB0aGUgb3BlcmF0aW9ucyBvZiAtPnN1c3BlbmQoKSBieSBjYXJyeWluZyBvdXQgYW55CiAgKglhY3Rpb25zIHJlcXVpcmVkIGZvciBzdXNwZW5kaW5nIHRoZSBkZXZpY2UgdGhhdCBuZWVkIGludGVycnVwdHMgdG8gYmUKICAqCWRpc2FibGVkCkBAIC0xOTAsMTggKzE1MCwzMiBAQAogICoJYWN0aW9ucyByZXF1aXJlZCBmb3IgcmVzdG9yaW5nIHRoZSBvcGVyYXRpb25zIG9mIHRoZSBkZXZpY2UgdGhhdCBuZWVkCiAgKglpbnRlcnJ1cHRzIHRvIGJlIGRpc2FibGVkCiAgKgotICogQWxsIG9mIHRoZSBhYm92ZSBjYWxsYmFja3MgcmV0dXJuIGVycm9yIGNvZGVzLCBidXQgdGhlIGVycm9yIGNvZGVzIHJldHVybmVkCi0gKiBieSB0aGUgcmVzdW1lIG9wZXJhdGlvbnMsIEByZXN1bWVfbm9pcnEoKSwgQHRoYXdfbm9pcnEoKSwgYW5kCi0gKiBAcmVzdG9yZV9ub2lycSgpLCBkbyBub3QgY2F1c2UgdGhlIFBNIGNvcmUgdG8gYWJvcnQgdGhlIHJlc3VtZSB0cmFuc2l0aW9uCi0gKiBkdXJpbmcgd2hpY2ggdGhleSBhcmUgcmV0dXJuZWQuICBUaGUgZXJyb3IgY29kZXMgcmV0dXJuZWQgaW4gdGhhdCBjYXNlcyBhcmUKLSAqIG9ubHkgcHJpbnRlZCBieSB0aGUgUE0gY29yZSB0byB0aGUgc3lzdGVtIGxvZ3MgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLSAqIFN0aWxsLCBhcyBzdGF0ZWQgYWJvdmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgZHJpdmVycyBvbmx5IHJldHVybiBlcnJvcgotICogY29kZXMgZnJvbSB0aGVpciByZXN1bWUgbWV0aG9kcyBpZiB0aGUgZGV2aWNlIGJlaW5nIGhhbmRsZWQgZmFpbHMgdG8gcmVzdW1lCi0gKiBhbmQgaXMgbm90IHVzYWJsZSBhbnkgbW9yZS4KKyAqIEFsbCBvZiB0aGUgYWJvdmUgY2FsbGJhY2tzLCBleGNlcHQgZm9yIEBjb21wbGV0ZSgpLCByZXR1cm4gZXJyb3IgY29kZXMuCisgKiBIb3dldmVyLCB0aGUgZXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgdGhlIHJlc3VtZSBvcGVyYXRpb25zLCBAcmVzdW1lKCksCisgKiBAdGhhdygpLCBAcmVzdG9yZSgpLCBAcmVzdW1lX25vaXJxKCksIEB0aGF3X25vaXJxKCksIGFuZCBAcmVzdG9yZV9ub2lycSgpIGRvCisgKiBub3QgY2F1c2UgdGhlIFBNIGNvcmUgdG8gYWJvcnQgdGhlIHJlc3VtZSB0cmFuc2l0aW9uIGR1cmluZyB3aGljaCB0aGV5IGFyZQorICogcmV0dXJuZWQuICBUaGUgZXJyb3IgY29kZXMgcmV0dXJuZWQgaW4gdGhhdCBjYXNlcyBhcmUgb25seSBwcmludGVkIGJ5IHRoZSBQTQorICogY29yZSB0byB0aGUgc3lzdGVtIGxvZ3MgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gIFN0aWxsLCBpdCBpcyByZWNvbW1lbmRlZAorICogdGhhdCBkcml2ZXJzIG9ubHkgcmV0dXJuIGVycm9yIGNvZGVzIGZyb20gdGhlaXIgcmVzdW1lIG1ldGhvZHMgaW4gY2FzZSBvZiBhbgorICogdW5yZWNvdmVyYWJsZSBmYWlsdXJlIChpLmUuIHdoZW4gdGhlIGRldmljZSBiZWluZyBoYW5kbGVkIHJlZnVzZXMgdG8gcmVzdW1lCisgKiBhbmQgYmVjb21lcyB1bnVzYWJsZSkgdG8gYWxsb3cgdXMgdG8gbW9kaWZ5IHRoZSBQTSBjb3JlIGluIHRoZSBmdXR1cmUsIHNvCisgKiB0aGF0IGl0IGNhbiBhdm9pZCBhdHRlbXB0aW5nIHRvIGhhbmRsZSBkZXZpY2VzIHRoYXQgZmFpbGVkIHRvIHJlc3VtZSBhbmQKKyAqIHRoZWlyIGNoaWxkcmVuLgorICoKKyAqIEl0IGlzIGFsbG93ZWQgdG8gdW5yZWdpc3RlciBkZXZpY2VzIHdoaWxlIHRoZSBhYm92ZSBjYWxsYmFja3MgYXJlIGJlaW5nCisgKiBleGVjdXRlZC4gIEhvd2V2ZXIsIGl0IGlzIG5vdCBhbGxvd2VkIHRvIHVucmVnaXN0ZXIgYSBkZXZpY2UgZnJvbSB3aXRoaW4gYW55CisgKiBvZiBpdHMgb3duIGNhbGxiYWNrcy4KICAqLwogCi1zdHJ1Y3QgcG1fZXh0X29wcyB7Ci0Jc3RydWN0IHBtX29wcyBiYXNlOworc3RydWN0IGRldl9wbV9vcHMgeworCWludCAoKnByZXBhcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKmZyZWV6ZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgKCp0aGF3KShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKnBvd2Vyb2ZmKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKnJlc3RvcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJaW50ICgqc3VzcGVuZF9ub2lycSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpyZXN1bWVfbm9pcnEpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJaW50ICgqZnJlZXplX25vaXJxKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpAQCAtMjc4LDcgKzI1Miw3IEBACiAjZGVmaW5lIFBNX0VWRU5UX1NMRUVQCQkoUE1fRVZFTlRfU1VTUEVORCB8IFBNX0VWRU5UX0hJQkVSTkFURSkKICNkZWZpbmUgUE1fRVZFTlRfVVNFUl9TVVNQRU5ECShQTV9FVkVOVF9VU0VSIHwgUE1fRVZFTlRfU1VTUEVORCkKICNkZWZpbmUgUE1fRVZFTlRfVVNFUl9SRVNVTUUJKFBNX0VWRU5UX1VTRVIgfCBQTV9FVkVOVF9SRVNVTUUpCi0jZGVmaW5lIFBNX0VWRU5UX1JFTU9URV9XQUtFVVAJKFBNX0VWRU5UX1JFTU9URSB8IFBNX0VWRU5UX1JFU1VNRSkKKyNkZWZpbmUgUE1fRVZFTlRfUkVNT1RFX1JFU1VNRQkoUE1fRVZFTlRfUkVNT1RFIHwgUE1fRVZFTlRfUkVTVU1FKQogI2RlZmluZSBQTV9FVkVOVF9BVVRPX1NVU1BFTkQJKFBNX0VWRU5UX0FVVE8gfCBQTV9FVkVOVF9TVVNQRU5EKQogI2RlZmluZSBQTV9FVkVOVF9BVVRPX1JFU1VNRQkoUE1fRVZFTlRfQVVUTyB8IFBNX0VWRU5UX1JFU1VNRSkKIApAQCAtMjkxLDE1ICsyNjUsMTUgQEAKICNkZWZpbmUgUE1TR19USEFXCSgoc3RydWN0IHBtX21lc3NhZ2UpeyAuZXZlbnQgPSBQTV9FVkVOVF9USEFXLCB9KQogI2RlZmluZSBQTVNHX1JFU1RPUkUJKChzdHJ1Y3QgcG1fbWVzc2FnZSl7IC5ldmVudCA9IFBNX0VWRU5UX1JFU1RPUkUsIH0pCiAjZGVmaW5lIFBNU0dfUkVDT1ZFUgkoKHN0cnVjdCBwbV9tZXNzYWdlKXsgLmV2ZW50ID0gUE1fRVZFTlRfUkVDT1ZFUiwgfSkKLSNkZWZpbmUgUE1TR19VU0VSX1NVU1BFTkQJKChzdHJ1Y3QgcG1fbWVzc2dlKSBcCisjZGVmaW5lIFBNU0dfVVNFUl9TVVNQRU5ECSgoc3RydWN0IHBtX21lc3NhZ2UpIFwKIAkJCQkJeyAuZXZlbnQgPSBQTV9FVkVOVF9VU0VSX1NVU1BFTkQsIH0pCi0jZGVmaW5lIFBNU0dfVVNFUl9SRVNVTUUJKChzdHJ1Y3QgcG1fbWVzc2dlKSBcCisjZGVmaW5lIFBNU0dfVVNFUl9SRVNVTUUJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX1VTRVJfUkVTVU1FLCB9KQotI2RlZmluZSBQTVNHX1JFTU9URV9SRVNVTUUJKChzdHJ1Y3QgcG1fbWVzc2dlKSBcCisjZGVmaW5lIFBNU0dfUkVNT1RFX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzYWdlKSBcCiAJCQkJCXsgLmV2ZW50ID0gUE1fRVZFTlRfUkVNT1RFX1JFU1VNRSwgfSkKLSNkZWZpbmUgUE1TR19BVVRPX1NVU1BFTkQJKChzdHJ1Y3QgcG1fbWVzc2dlKSBcCisjZGVmaW5lIFBNU0dfQVVUT19TVVNQRU5ECSgoc3RydWN0IHBtX21lc3NhZ2UpIFwKIAkJCQkJeyAuZXZlbnQgPSBQTV9FVkVOVF9BVVRPX1NVU1BFTkQsIH0pCi0jZGVmaW5lIFBNU0dfQVVUT19SRVNVTUUJCSgoc3RydWN0IHBtX21lc3NnZSkgXAorI2RlZmluZSBQTVNHX0FVVE9fUkVTVU1FCSgoc3RydWN0IHBtX21lc3NhZ2UpIFwKIAkJCQkJeyAuZXZlbnQgPSBQTV9FVkVOVF9BVVRPX1JFU1VNRSwgfSkKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BvbGwuaCBiL2luY2x1ZGUvbGludXgvcG9sbC5oCmluZGV4IGJhZGQ5OGEuLjhjMjRlZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG9sbC5oCisrKyBiL2luY2x1ZGUvbGludXgvcG9sbC5oCkBAIC00Niw5ICs0Niw5IEBACiB9CiAKIHN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5IHsKLQlzdHJ1Y3QgZmlsZSAqIGZpbHA7CisJc3RydWN0IGZpbGUgKmZpbHA7CiAJd2FpdF9xdWV1ZV90IHdhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKiB3YWl0X2FkZHJlc3M7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndhaXRfYWRkcmVzczsKIH07CiAKIC8qCkBAIC01Niw3ICs1Niw5IEBACiAgKi8KIHN0cnVjdCBwb2xsX3dxdWV1ZXMgewogCXBvbGxfdGFibGUgcHQ7Ci0Jc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqIHRhYmxlOworCXN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKnRhYmxlOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcG9sbGluZ190YXNrOworCWludCB0cmlnZ2VyZWQ7CiAJaW50IGVycm9yOwogCWludCBpbmxpbmVfaW5kZXg7CiAJc3RydWN0IHBvbGxfdGFibGVfZW50cnkgaW5saW5lX2VudHJpZXNbTl9JTkxJTkVfUE9MTF9FTlRSSUVTXTsKQEAgLTY0LDYgKzY2LDEzIEBACiAKIGV4dGVybiB2b2lkIHBvbGxfaW5pdHdhaXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxKTsKIGV4dGVybiB2b2lkIHBvbGxfZnJlZXdhaXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxKTsKK2V4dGVybiBpbnQgcG9sbF9zY2hlZHVsZV90aW1lb3V0KHN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSwgaW50IHN0YXRlLAorCQkJCSBrdGltZV90ICpleHBpcmVzLCB1bnNpZ25lZCBsb25nIHNsYWNrKTsKKworc3RhdGljIGlubGluZSBpbnQgcG9sbF9zY2hlZHVsZShzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EsIGludCBzdGF0ZSkKK3sKKwlyZXR1cm4gcG9sbF9zY2hlZHVsZV90aW1lb3V0KHB3cSwgc3RhdGUsIE5VTEwsIDApOworfQogCiAvKgogICogU2NhbGVhYmxlIHZlcnNpb24gb2YgdGhlIGZkX3NldC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oIGIvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKaW5kZXggMzJjMDU0Ny4uYzkzYTU4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKQEAgLTM5MSw3ICszOTEsNiBAQAogICogcmlvX2dldF9pbmJfbWVzc2FnZSAtIEdldCBBIFJJTyBtZXNzYWdlIGZyb20gYW4gaW5ib3VuZCBtYWlsYm94IHF1ZXVlCiAgKiBAbXBvcnQ6IE1hc3RlciBwb3J0IGNvbnRhaW5pbmcgdGhlIGluYm91bmQgbWFpbGJveAogICogQG1ib3g6IFRoZSBpbmJvdW5kIG1haWxib3ggbnVtYmVyCi0gKiBAYnVmZmVyOiBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIGJ1ZmZlcgogICoKICAqIEdldCBhIFJJTyBtZXNzYWdlIGZyb20gYW4gaW5ib3VuZCBtYWlsYm94IHF1ZXVlLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ybWFwLmggYi9pbmNsdWRlL2xpbnV4L3JtYXAuaAppbmRleCA4OWYwNTY0Li5iMzViYzBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JtYXAuaApAQCAtNjMsMTYgKzYzLDEzIEBACiB2b2lkIGFub25fdm1hX2xpbmsoc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogdm9pZCBfX2Fub25fdm1hX2xpbmsoc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogCi1leHRlcm4gc3RydWN0IGFub25fdm1hICpwYWdlX2xvY2tfYW5vbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UpOwotZXh0ZXJuIHZvaWQgcGFnZV91bmxvY2tfYW5vbl92bWEoc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSk7Ci0KIC8qCiAgKiBybWFwIGludGVyZmFjZXMgY2FsbGVkIHdoZW4gYWRkaW5nIG9yIHJlbW92aW5nIHB0ZSBvZiBwYWdlCiAgKi8KIHZvaWQgcGFnZV9hZGRfYW5vbl9ybWFwKHN0cnVjdCBwYWdlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKIHZvaWQgcGFnZV9hZGRfbmV3X2Fub25fcm1hcChzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkIHBhZ2VfYWRkX2ZpbGVfcm1hcChzdHJ1Y3QgcGFnZSAqKTsKLXZvaWQgcGFnZV9yZW1vdmVfcm1hcChzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Cit2b2lkIHBhZ2VfcmVtb3ZlX3JtYXAoc3RydWN0IHBhZ2UgKik7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfVk0KIHZvaWQgcGFnZV9kdXBfcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggMzhhM2Y0Yi4uZWE0MTUxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMzg2LDYgKzM4Niw5IEBACiAJCShtbSktPmhpd2F0ZXJfdm0gPSAobW0pLT50b3RhbF92bTsJXAogfSB3aGlsZSAoMCkKIAorI2RlZmluZSBnZXRfbW1faGl3YXRlcl9yc3MobW0pCW1heCgobW0pLT5oaXdhdGVyX3JzcywgZ2V0X21tX3JzcyhtbSkpCisjZGVmaW5lIGdldF9tbV9oaXdhdGVyX3ZtKG1tKQltYXgoKG1tKS0+aGl3YXRlcl92bSwgKG1tKS0+dG90YWxfdm0pCisKIGV4dGVybiB2b2lkIHNldF9kdW1wYWJsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaW50IHZhbHVlKTsKIGV4dGVybiBpbnQgZ2V0X2R1bXBhYmxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2dwaW8uaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMWEwZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9ncGlvLmgKQEAgLTAsMCArMSw2MCBAQAorI2lmbmRlZiBfX0xJTlVYX1NQSV9HUElPX0gKKyNkZWZpbmUgX19MSU5VWF9TUElfR1BJT19ICisKKy8qCisgKiBGb3IgZWFjaCBiaXRiYW5nZWQgU1BJIGJ1cywgc2V0IHVwIGEgcGxhdGZvcm1fZGV2aWNlIG5vZGUgd2l0aDoKKyAqICAgLSBuYW1lICJzcGlfZ3BpbyIKKyAqICAgLSBpZCB0aGUgc2FtZSBhcyB0aGUgU1BJIGJ1cyBudW1iZXIgaXQgaW1wbGVtZW50cworICogICAtIGRldi5wbGF0Zm9ybSBkYXRhIHBvaW50aW5nIHRvIGEgc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEKKyAqCisgKiBPciwgc2VlIHRoZSBkcml2ZXIgY29kZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgc3BlZWR1cHMgdGhhdCBhcmUKKyAqIHBvc3NpYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaW5saW5lZCBhY2Nlc3MgZm9yIEdQSU9zIChubworICogc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSBpcyB1c2VkKS4KKyAqCisgKiBVc2Ugc3BpX2JvYXJkX2luZm8gd2l0aCB0aGVzZSBidXNzZXMgaW4gdGhlIHVzdWFsIHdheSwgYmVpbmcgc3VyZQorICogdGhhdCB0aGUgY29udHJvbGxlcl9kYXRhIGJlaW5nIHRoZSBHUElPIHVzZWQgZm9yIGVhY2ggZGV2aWNlJ3MKKyAqIGNoaXBzZWxlY3Q6CisgKgorICoJc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyAuLi4gW10gPSB7CisgKgkuLi4KKyAqCQkvLyB0aGlzIHNsYXZlIHVzZXMgR1BJTyA0MiBmb3IgaXRzIGNoaXBzZWxlY3QKKyAqCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgNDIsCisgKgkuLi4KKyAqCQkvLyB0aGlzIG9uZSB1c2VzIEdQSU8gODYgZm9yIGl0cyBjaGlwc2VsZWN0CisgKgkJLmNvbnRyb2xsZXJfZGF0YSA9ICh2b2lkICopIDg2LAorICoJLi4uCisgKgl9OworICoKKyAqIElmIHRoZSBiaXRiYW5nZWQgYnVzIGlzIGxhdGVyIHN3aXRjaGVkIHRvIGEgIm5hdGl2ZSIgY29udHJvbGxlciwKKyAqIHRoYXQgcGxhdGZvcm1fZGV2aWNlIGFuZCBjb250cm9sbGVyX2RhdGEgc2hvdWxkIGJlIHJlbW92ZWQuCisgKi8KKworLyoqCisgKiBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSAtIHBhcmFtZXRlciBmb3IgYml0YmFuZ2VkIFNQSSBtYXN0ZXIKKyAqIEBzY2s6IG51bWJlciBvZiB0aGUgR1BJTyB1c2VkIGZvciBjbG9jayBvdXRwdXQKKyAqIEBtb3NpOiBudW1iZXIgb2YgdGhlIEdQSU8gdXNlZCBmb3IgTWFzdGVyIE91dHB1dCwgU2xhdmUgSW4gKE1PU0kpIGRhdGEKKyAqIEBtaXNvOiBudW1iZXIgb2YgdGhlIEdQSU8gdXNlZCBmb3IgTWFzdGVyIElucHV0LCBTbGF2ZSBPdXRwdXQgKE1JU08pIGRhdGEKKyAqIEBudW1fY2hpcHNlbGVjdDogaG93IG1hbnkgc2xhdmVzIHRvIGFsbG93CisgKgorICogQWxsIEdQSU8gc2lnbmFscyB1c2VkIHdpdGggdGhlIFNQSSBidXMgbWFuYWdlZCB0aHJvdWdoIHRoaXMgZHJpdmVyCisgKiAoY2hpcHNlbGVjdHMsIE1PU0ksIE1JU08sIFNDSykgbXVzdCBiZSBjb25maWd1cmVkIGFzIEdQSU9zLCBpbnN0ZWFkCisgKiBvZiBzb21lIGFsdGVybmF0ZSBmdW5jdGlvbi4KKyAqCisgKiBJdCBjYW4gYmUgY29udmVuaWVudCB0byB1c2UgdGhpcyBkcml2ZXIgd2l0aCBwaW5zIHRoYXQgaGF2ZSBhbHRlcm5hdGUKKyAqIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSAibmF0aXZlIiBTUEkgY29udHJvbGxlciBpZiBhIGRyaXZlciBmb3IgdGhhdAorICogY29udHJvbGxlciBpcyBub3QgYXZhaWxhYmxlLCBvciBpcyBtaXNzaW5nIGltcG9ydGFudCBmdW5jdGlvbmFsaXR5LgorICoKKyAqIE9uIHBsYXRmb3JtcyB3aGljaCBjYW4gZG8gc28sIGNvbmZpZ3VyZSBNSVNPIHdpdGggYSB3ZWFrIHB1bGx1cCB1bmxlc3MKKyAqIHRoZXJlJ3MgYW4gZXh0ZXJuYWwgcHVsbHVwIG9uIHRoYXQgc2lnbmFsLiAgVGhhdCBzYXZlcyBwb3dlciBieSBhdm9pZGluZworICogZmxvYXRpbmcgc2lnbmFscy4gIChBIHdlYWsgcHVsbGRvd24gd291bGQgc2F2ZSBwb3dlciB0b28sIGJ1dCBtYW55CisgKiBkcml2ZXJzIGV4cGVjdCB0byBzZWUgYWxsLW9uZXMgZGF0YSBhcyB0aGUgbm8gc2xhdmUgInJlc3BvbnNlIi4pCisgKi8KK3N0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZAlzY2s7CisJdW5zaWduZWQJbW9zaTsKKwl1bnNpZ25lZAltaXNvOworCisJdTE2CQludW1fY2hpcHNlbGVjdDsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX1NQSV9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggYTNhZjk1Yi4uOTFkZWU1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTEyMCw3ICsxMjAsOSBAQAogZW51bSB7CiAJU1dQX1VTRUQJPSAoMSA8PCAwKSwJLyogaXMgc2xvdCBpbiBzd2FwX2luZm9bXSB1c2VkPyAqLwogCVNXUF9XUklURU9LCT0gKDEgPDwgMSksCS8qIG9rIHRvIHdyaXRlIHRvIHRoaXMgc3dhcD8JKi8KLQlTV1BfQUNUSVZFCT0gKFNXUF9VU0VEIHwgU1dQX1dSSVRFT0spLAorCVNXUF9ESVNDQVJEQUJMRSA9ICgxIDw8IDIpLAkvKiBibGtkZXYgc3VwcG9ydHMgZGlzY2FyZCAqLworCVNXUF9ESVNDQVJESU5HCT0gKDEgPDwgMyksCS8qIG5vdyBkaXNjYXJkaW5nIGEgZnJlZSBjbHVzdGVyICovCisJU1dQX1NPTElEU1RBVEUJPSAoMSA8PCA0KSwJLyogYmxrZGV2IHNlZWtzIGFyZSBjaGVhcCAqLwogCQkJCQkvKiBhZGQgb3RoZXJzIGhlcmUgYmVmb3JlLi4uICovCiAJU1dQX1NDQU5OSU5HCT0gKDEgPDwgOCksCS8qIHJlZmNvdW50IGluIHNjYW5fc3dhcF9tYXAgKi8KIH07CkBAIC0xMzQsMjIgKzEzNiwyNCBAQAogICogVGhlIGluLW1lbW9yeSBzdHJ1Y3R1cmUgdXNlZCB0byB0cmFjayBzd2FwIGFyZWFzLgogICovCiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7Ci0JdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHByaW87CQkJLyogc3dhcCBwcmlvcml0eSAqLworCWludCBuZXh0OwkJCS8qIG5leHQgZW50cnkgb24gc3dhcCBsaXN0ICovCiAJc3RydWN0IGZpbGUgKnN3YXBfZmlsZTsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCXN0cnVjdCBsaXN0X2hlYWQgZXh0ZW50X2xpc3Q7CiAJc3RydWN0IHN3YXBfZXh0ZW50ICpjdXJyX3N3YXBfZXh0ZW50OwotCXVuc2lnbmVkIG9sZF9ibG9ja19zaXplOwotCXVuc2lnbmVkIHNob3J0ICogc3dhcF9tYXA7CisJdW5zaWduZWQgc2hvcnQgKnN3YXBfbWFwOwogCXVuc2lnbmVkIGludCBsb3dlc3RfYml0OwogCXVuc2lnbmVkIGludCBoaWdoZXN0X2JpdDsKKwl1bnNpZ25lZCBpbnQgbG93ZXN0X2FsbG9jOwkvKiB3aGlsZSBwcmVwYXJpbmcgZGlzY2FyZCBjbHVzdGVyICovCisJdW5zaWduZWQgaW50IGhpZ2hlc3RfYWxsb2M7CS8qIHdoaWxlIHByZXBhcmluZyBkaXNjYXJkIGNsdXN0ZXIgKi8KIAl1bnNpZ25lZCBpbnQgY2x1c3Rlcl9uZXh0OwogCXVuc2lnbmVkIGludCBjbHVzdGVyX25yOwogCXVuc2lnbmVkIGludCBwYWdlczsKIAl1bnNpZ25lZCBpbnQgbWF4OwogCXVuc2lnbmVkIGludCBpbnVzZV9wYWdlczsKLQlpbnQgbmV4dDsJCQkvKiBuZXh0IGVudHJ5IG9uIHN3YXAgbGlzdCAqLworCXVuc2lnbmVkIGludCBvbGRfYmxvY2tfc2l6ZTsKIH07CiAKIHN0cnVjdCBzd2FwX2xpc3RfdCB7CkBAIC0xNjMsNyArMTY3LDYgQEAKIC8qIGxpbnV4L21tL3BhZ2VfYWxsb2MuYyAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG90YWxyYW1fcGFnZXM7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB0b3RhbHJlc2VydmVfcGFnZXM7Ci1leHRlcm4gbG9uZyBucl9zd2FwX3BhZ2VzOwogZXh0ZXJuIHVuc2lnbmVkIGludCBucl9mcmVlX2J1ZmZlcl9wYWdlcyh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbnJfZnJlZV9wYWdlY2FjaGVfcGFnZXModm9pZCk7CiAKQEAgLTE3NCw4ICsxNzcsNiBAQAogLyogbGludXgvbW0vc3dhcC5jICovCiBleHRlcm4gdm9pZCBfX2xydV9jYWNoZV9hZGQoc3RydWN0IHBhZ2UgKiwgZW51bSBscnVfbGlzdCBscnUpOwogZXh0ZXJuIHZvaWQgbHJ1X2NhY2hlX2FkZF9scnUoc3RydWN0IHBhZ2UgKiwgZW51bSBscnVfbGlzdCBscnUpOwotZXh0ZXJuIHZvaWQgbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUoc3RydWN0IHBhZ2UgKiwKLQkJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgYWN0aXZhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqKTsKIGV4dGVybiB2b2lkIG1hcmtfcGFnZV9hY2Nlc3NlZChzdHJ1Y3QgcGFnZSAqKTsKIGV4dGVybiB2b2lkIGxydV9hZGRfZHJhaW4odm9pZCk7CkBAIC0yODAsNyArMjgxLDcgQEAKIGV4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZSBzd2FwcGVyX3NwYWNlOwogI2RlZmluZSB0b3RhbF9zd2FwY2FjaGVfcGFnZXMgIHN3YXBwZXJfc3BhY2UubnJwYWdlcwogZXh0ZXJuIHZvaWQgc2hvd19zd2FwX2NhY2hlX2luZm8odm9pZCk7Ci1leHRlcm4gaW50IGFkZF90b19zd2FwKHN0cnVjdCBwYWdlICosIGdmcF90KTsKK2V4dGVybiBpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gaW50IGFkZF90b19zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICosIHN3cF9lbnRyeV90LCBnZnBfdCk7CiBleHRlcm4gdm9pZCBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gdm9pZCBkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICopOwpAQCAtMjkzLDYgKzI5NCw3IEBACiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKIAogLyogbGludXgvbW0vc3dhcGZpbGUuYyAqLworZXh0ZXJuIGxvbmcgbnJfc3dhcF9wYWdlczsKIGV4dGVybiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7CiBleHRlcm4gdm9pZCBzaV9zd2FwaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqKTsKIGV4dGVybiBzd3BfZW50cnlfdCBnZXRfc3dhcF9wYWdlKHZvaWQpOwpAQCAtMzAwLDE1ICszMDIsMTQgQEAKIGV4dGVybiBpbnQgc3dhcF9kdXBsaWNhdGUoc3dwX2VudHJ5X3QpOwogZXh0ZXJuIGludCB2YWxpZF9zd2FwaGFuZGxlcyhzd3BfZW50cnlfdCwgdW5zaWduZWQgbG9uZyAqKTsKIGV4dGVybiB2b2lkIHN3YXBfZnJlZShzd3BfZW50cnlfdCk7Ci1leHRlcm4gdm9pZCBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cF9lbnRyeV90KTsKK2V4dGVybiBpbnQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCk7CiBleHRlcm4gaW50IHN3YXBfdHlwZV9vZihkZXZfdCwgc2VjdG9yX3QsIHN0cnVjdCBibG9ja19kZXZpY2UgKiopOwogZXh0ZXJuIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCwgaW50KTsKIGV4dGVybiBzZWN0b3JfdCBtYXBfc3dhcF9wYWdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICosIHBnb2ZmX3QpOwogZXh0ZXJuIHNlY3Rvcl90IHN3YXBkZXZfYmxvY2soaW50LCBwZ29mZl90KTsKIGV4dGVybiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZ2V0X3N3YXBfaW5mb19zdHJ1Y3QodW5zaWduZWQpOwotZXh0ZXJuIGludCBjYW5fc2hhcmVfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICopOwotZXh0ZXJuIGludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqKTsKLWV4dGVybiBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfcmVmKHN0cnVjdCBwYWdlICopOworZXh0ZXJuIGludCByZXVzZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKik7CitleHRlcm4gaW50IHRyeV90b19mcmVlX3N3YXAoc3RydWN0IHBhZ2UgKik7CiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbzsKIAogLyogbGludXgvbW0vdGhyYXNoLmMgKi8KQEAgLTMzNCw3ICszMzUsOCBAQAogCiAjZWxzZSAvKiBDT05GSUdfU1dBUCAqLwogCi0jZGVmaW5lIHRvdGFsX3N3YXBfcGFnZXMJCQkwCisjZGVmaW5lIG5yX3N3YXBfcGFnZXMJCQkJMEwKKyNkZWZpbmUgdG90YWxfc3dhcF9wYWdlcwkJCTBMCiAjZGVmaW5lIHRvdGFsX3N3YXBjYWNoZV9wYWdlcwkJCTBVTAogCiAjZGVmaW5lIHNpX3N3YXBpbmZvKHZhbCkgXApAQCAtMzUwLDE0ICszNTIsOCBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCBzd3ApCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHN3YXBfZHVwbGljYXRlKHN3cF9lbnRyeV90IHN3cCkKLXsKLQlyZXR1cm4gMDsKLX0KKyNkZWZpbmUgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3ApCWlzX21pZ3JhdGlvbl9lbnRyeShzd3ApCisjZGVmaW5lIHN3YXBfZHVwbGljYXRlKHN3cCkJCWlzX21pZ3JhdGlvbl9lbnRyeShzd3ApCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2ZyZWUoc3dwX2VudHJ5X3Qgc3dwKQogewpAQCAtMzc0LDcgKzM3MCwxMCBAQAogCXJldHVybiBOVUxMOwogfQogCi0jZGVmaW5lIGNhbl9zaGFyZV9zd2FwX3BhZ2UocCkJCQkocGFnZV9tYXBjb3VudChwKSA9PSAxKQorc3RhdGljIGlubGluZSBpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFkZF90b19zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnRyeSwKIAkJCQkJCQlnZnBfdCBnZnBfbWFzaykKQEAgLTM5MCwxNCArMzg5LDkgQEAKIHsKIH0KIAotI2RlZmluZSBzd2FwX3Rva2VuX2RlZmF1bHRfdGltZW91dAkJMAorI2RlZmluZSByZXVzZV9zd2FwX3BhZ2UocGFnZSkJKHBhZ2VfbWFwY291bnQocGFnZSkgPT0gMSkKIAotc3RhdGljIGlubGluZSBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX3JlZihzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV90b19mcmVlX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKaW5kZXggMTIxZjM0OS4uM2I4NjRmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtMTk1LDYgKzE5NSwxNiBAQAogCiB0eXBlZGVmIHBoeXNfYWRkcl90IHJlc291cmNlX3NpemVfdDsKIAordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIGludCBjb3VudGVyOworfSBhdG9taWNfdDsKKworI2lmZGVmIENPTkZJR182NEJJVAordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIGxvbmcgY291bnRlcjsKK30gYXRvbWljNjRfdDsKKyNlbmRpZgorCiBzdHJ1Y3QgdXN0YXQgewogCV9fa2VybmVsX2RhZGRyX3QJZl90ZnJlZTsKIAlfX2tlcm5lbF9pbm9fdAkJZl90aW5vZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vpb19kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvdWlvX2RyaXZlci5oCmluZGV4IGNkZjMzOGQuLmEwYmI2YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWlvX2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvdWlvX2RyaXZlci5oCkBAIC0zOCw2ICszOCwyNCBAQAogCiAjZGVmaW5lIE1BWF9VSU9fTUFQUwk1CiAKK3N0cnVjdCB1aW9fcG9ydGlvOworCisvKioKKyAqIHN0cnVjdCB1aW9fcG9ydCAtIGRlc2NyaXB0aW9uIG9mIGEgVUlPIHBvcnQgcmVnaW9uCisgKiBAc3RhcnQ6CQlzdGFydCBvZiBwb3J0IHJlZ2lvbgorICogQHNpemU6CQlzaXplIG9mIHBvcnQgcmVnaW9uCisgKiBAcG9ydHR5cGU6CQl0eXBlIG9mIHBvcnQgKHNlZSBVSU9fUE9SVF8qIGJlbG93KQorICogQHBvcnRpbzoJCWZvciB1c2UgYnkgdGhlIFVJTyBjb3JlIG9ubHkuCisgKi8KK3N0cnVjdCB1aW9fcG9ydCB7CisJdW5zaWduZWQgbG9uZwkJc3RhcnQ7CisJdW5zaWduZWQgbG9uZwkJc2l6ZTsKKwlpbnQJCQlwb3J0dHlwZTsKKwlzdHJ1Y3QgdWlvX3BvcnRpbwkqcG9ydGlvOworfTsKKworI2RlZmluZSBNQVhfVUlPX1BPUlRfUkVHSU9OUwk1CisKIHN0cnVjdCB1aW9fZGV2aWNlOwogCiAvKioKQEAgLTQ2LDYgKzY0LDcgQEAKICAqIEBuYW1lOgkJZGV2aWNlIG5hbWUKICAqIEB2ZXJzaW9uOgkJZGV2aWNlIGRyaXZlciB2ZXJzaW9uCiAgKiBAbWVtOgkJbGlzdCBvZiBtYXBwYWJsZSBtZW1vcnkgcmVnaW9ucywgc2l6ZT09MCBmb3IgZW5kIG9mIGxpc3QKKyAqIEBwb3J0OgkJbGlzdCBvZiBwb3J0IHJlZ2lvbnMsIHNpemU9PTAgZm9yIGVuZCBvZiBsaXN0CiAgKiBAaXJxOgkJaW50ZXJydXB0IG51bWJlciBvciBVSU9fSVJRX0NVU1RPTQogICogQGlycV9mbGFnczoJCWZsYWdzIGZvciByZXF1ZXN0X2lycSgpCiAgKiBAcHJpdjoJCW9wdGlvbmFsIHByaXZhdGUgZGF0YQpAQCAtNTcsOSArNzYsMTAgQEAKICAqLwogc3RydWN0IHVpb19pbmZvIHsKIAlzdHJ1Y3QgdWlvX2RldmljZQkqdWlvX2RldjsKLQljaGFyCQkJKm5hbWU7Ci0JY2hhcgkJCSp2ZXJzaW9uOworCWNvbnN0IGNoYXIJCSpuYW1lOworCWNvbnN0IGNoYXIJCSp2ZXJzaW9uOwogCXN0cnVjdCB1aW9fbWVtCQltZW1bTUFYX1VJT19NQVBTXTsKKwlzdHJ1Y3QgdWlvX3BvcnQJCXBvcnRbTUFYX1VJT19QT1JUX1JFR0lPTlNdOwogCWxvbmcJCQlpcnE7CiAJdW5zaWduZWQgbG9uZwkJaXJxX2ZsYWdzOwogCXZvaWQJCQkqcHJpdjsKQEAgLTkyLDQgKzExMiwxMCBAQAogI2RlZmluZSBVSU9fTUVNX0xPR0lDQUwJMgogI2RlZmluZSBVSU9fTUVNX1ZJUlRVQUwgMwogCisvKiBkZWZpbmVzIGZvciB1aW9fcG9ydC0+cG9ydHR5cGUgKi8KKyNkZWZpbmUgVUlPX1BPUlRfTk9ORQkwCisjZGVmaW5lIFVJT19QT1JUX1g4NgkxCisjZGVmaW5lIFVJT19QT1JUX0dQSU8JMgorI2RlZmluZSBVSU9fUE9SVF9PVEhFUgkzCisKICNlbmRpZiAvKiBfTElOVVhfVUlPX0RSSVZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91bndpbmQuaCBiL2luY2x1ZGUvbGludXgvdW53aW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NjA4NjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC91bndpbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNpZm5kZWYgX0xJTlVYX1VOV0lORF9ICi0jZGVmaW5lIF9MSU5VWF9VTldJTkRfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgTm92ZWxsLCBJbmMuCi0gKglKYW4gQmV1bGljaCA8amJldWxpY2hAbm92ZWxsLmNvbT4KLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHUEwuCi0gKgotICogQSBzaW1wbGUgQVBJIGZvciB1bndpbmRpbmcga2VybmVsIHN0YWNrcy4gIFRoaXMgaXMgdXNlZCBmb3IKLSAqIGRlYnVnZ2luZyBhbmQgZXJyb3IgcmVwb3J0aW5nIHB1cnBvc2VzLiAgVGhlIGtlcm5lbCBkb2Vzbid0IG5lZWQKLSAqIGZ1bGwtYmxvd24gc3RhY2sgdW53aW5kaW5nIHdpdGggYWxsIHRoZSBiZWxscyBhbmQgd2hpc3RsZXMsIHNvIHRoZXJlCi0gKiBpcyBub3QgbXVjaCBwb2ludCBpbiBpbXBsZW1lbnRpbmcgdGhlIGZ1bGwgRHdhcmYyIHVud2luZCBBUEkuCi0gKi8KLQotc3RydWN0IG1vZHVsZTsKLQotc3RydWN0IHVud2luZF9mcmFtZV9pbmZvIHt9OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW53aW5kX2luaXQodm9pZCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfc2V0dXAodm9pZCkge30KLQotI2lmZGVmIENPTkZJR19NT0RVTEVTCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqdW53aW5kX2FkZF90YWJsZShzdHJ1Y3QgbW9kdWxlICptb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdGFibGVfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplKQotewotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW53aW5kX3JlbW92ZV90YWJsZSh2b2lkICpoYW5kbGUsIGludCBpbml0X29ubHkpCi17Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCB1bndpbmRfaW5pdF9mcmFtZV9pbmZvKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB1bndpbmRfaW5pdF9ibG9ja2VkKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF9pbml0X3J1bm5pbmcoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc21saW5rYWdlIGludCAoKmNiKShzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB1bndpbmQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB1bndpbmRfdG9fdXNlcihzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8pCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLSNlbmRpZiAvKiBfTElOVVhfVU5XSU5EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKaW5kZXggMzA3Yjg4NS4uNTA2ZTc2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKKysrIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKQEAgLTk3LDYgKzk3LDEwIEBACiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqYWxsb2Nfdm1fYXJlYShzaXplX3Qgc2l6ZSk7CiBleHRlcm4gdm9pZCBmcmVlX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSk7CiAKKy8qIGZvciAvZGV2L2ttZW0gKi8KK2V4dGVybiBsb25nIHZyZWFkKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CitleHRlcm4gbG9uZyB2d3JpdGUoY2hhciAqYnVmLCBjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKKwogLyoKICAqCUludGVybmFscy4gIERvbnQndCB1c2UuLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAppbmRleCBlNTg1NjU3Li43MzAwZWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKQEAgLTMwLDcgKzMwLDYgQEAKIGVudW0gd3JpdGViYWNrX3N5bmNfbW9kZXMgewogCVdCX1NZTkNfTk9ORSwJLyogRG9uJ3Qgd2FpdCBvbiBhbnl0aGluZyAqLwogCVdCX1NZTkNfQUxMLAkvKiBXYWl0IG9uIGV2ZXJ5IG1hcHBpbmcgKi8KLQlXQl9TWU5DX0hPTEQsCS8qIEhvbGQgdGhlIGlub2RlIG9uIHNiX2RpcnR5IGZvciBzeXNfc3luYygpICovCiB9OwogCiAvKgpAQCAtMTA3LDcgKzEwNiw5IEBACiAKIC8qIFRoZXNlIGFyZSBleHBvcnRlZCB0byBzeXNjdGwuICovCiBleHRlcm4gaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW87CitleHRlcm4gdW5zaWduZWQgbG9uZyBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzOwogZXh0ZXJuIGludCB2bV9kaXJ0eV9yYXRpbzsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZtX2RpcnR5X2J5dGVzOwogZXh0ZXJuIGludCBkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWw7CiBleHRlcm4gaW50IGRpcnR5X2V4cGlyZV9pbnRlcnZhbDsKIGV4dGVybiBpbnQgdm1faGlnaG1lbV9pc19kaXJ0eWFibGU7CkBAIC0xMTYsMTcgKzExNywyNiBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBkZXRlcm1pbmVfZGlydHlhYmxlX21lbW9yeSh2b2lkKTsKIAorZXh0ZXJuIGludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJbG9mZl90ICpwcG9zKTsKK2V4dGVybiBpbnQgZGlydHlfYmFja2dyb3VuZF9ieXRlc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcyk7CiBleHRlcm4gaW50IGRpcnR5X3JhdGlvX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKIAkJbG9mZl90ICpwcG9zKTsKK2V4dGVybiBpbnQgZGlydHlfYnl0ZXNfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQlsb2ZmX3QgKnBwb3MpOwogCiBzdHJ1Y3QgY3RsX3RhYmxlOwogc3RydWN0IGZpbGU7CiBpbnQgZGlydHlfd3JpdGViYWNrX2NlbnRpc2Vjc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLAogCQkJCSAgICAgIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiAKLXZvaWQgZ2V0X2RpcnR5X2xpbWl0cyhsb25nICpwYmFja2dyb3VuZCwgbG9uZyAqcGRpcnR5LCBsb25nICpwYmRpX2RpcnR5LAotCQkgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSk7Cit2b2lkIGdldF9kaXJ0eV9saW1pdHModW5zaWduZWQgbG9uZyAqcGJhY2tncm91bmQsIHVuc2lnbmVkIGxvbmcgKnBkaXJ0eSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyAqcGJkaV9kaXJ0eSwgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSk7CiAKIHZvaWQgcGFnZV93cml0ZWJhY2tfaW5pdCh2b2lkKTsKIHZvaWQgYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCA1Mjg0N2VlLi5lNzg5M2IxIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC00MjMsMjcgKzQyMywzNyBAQAogCWJvb2wKIAogY29uZmlnIFNZU0ZTX0RFUFJFQ0FURURfVjIKLQlib29sICJDcmVhdGUgZGVwcmVjYXRlZCBzeXNmcyBmaWxlcyIKKwlib29sICJDcmVhdGUgZGVwcmVjYXRlZCBzeXNmcyBsYXlvdXQgZm9yIG9sZGVyIHVzZXJzcGFjZSB0b29scyIKIAlkZXBlbmRzIG9uIFNZU0ZTCiAJZGVmYXVsdCB5CiAJc2VsZWN0IFNZU0ZTX0RFUFJFQ0FURUQKIAloZWxwCi0JICBUaGlzIG9wdGlvbiBjcmVhdGVzIGRlcHJlY2F0ZWQgc3ltbGlua3Mgc3VjaCBhcyB0aGUKLQkgICJkZXZpY2UiLWxpbmssIHRoZSA8c3Vic3lzdGVtPjo8bmFtZT4tbGluaywgYW5kIHRoZQotCSAgImJ1cyItbGluay4gSXQgbWF5IGFsc28gYWRkIGRlcHJlY2F0ZWQga2V5IGluIHRoZQotCSAgdWV2ZW50IGVudmlyb25tZW50LgotCSAgTm9uZSBvZiB0aGVzZSBmZWF0dXJlcyBvciB2YWx1ZXMgc2hvdWxkIGJlIHVzZWQgdG9kYXksIGFzCi0JICB0aGV5IGV4cG9ydCBkcml2ZXIgY29yZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIHVzZXJzcGFjZQotCSAgb3IgZXhwb3J0IHByb3BlcnRpZXMgd2hpY2ggY2FuJ3QgYmUga2VwdCBzdGFibGUgYWNyb3NzIGtlcm5lbAotCSAgcmVsZWFzZXMuCisJICBUaGlzIG9wdGlvbiBzd2l0Y2hlcyB0aGUgbGF5b3V0IG9mIHN5c2ZzIHRvIHRoZSBkZXByZWNhdGVkCisJICB2ZXJzaW9uLgogCi0JICBJZiBlbmFibGVkLCB0aGlzIG9wdGlvbiB3aWxsIGFsc28gbW92ZSBhbnkgZGV2aWNlIHN0cnVjdHVyZXMKLQkgIHRoYXQgYmVsb25nIHRvIGEgY2xhc3MsIGJhY2sgaW50byB0aGUgL3N5cy9jbGFzcyBoaWVyYXJjaHksIGluCi0JICBvcmRlciB0byBzdXBwb3J0IG9sZGVyIHZlcnNpb25zIG9mIHVkZXYgYW5kIHNvbWUgdXNlcnNwYWNlCi0JICBwcm9ncmFtcy4KKwkgIFRoZSBjdXJyZW50IHN5c2ZzIGxheW91dCBmZWF0dXJlcyBhIHVuaWZpZWQgZGV2aWNlIHRyZWUgYXQKKwkgIC9zeXMvZGV2aWNlcy8sIHdoaWNoIGlzIGFibGUgdG8gZXhwcmVzcyBhIGhpZXJhcmNoeSBiZXR3ZWVuCisJICBjbGFzcyBkZXZpY2VzLiBJZiB0aGUgZGVwcmVjYXRlZCBvcHRpb24gaXMgc2V0IHRvIFksIHRoZQorCSAgdW5pZmllZCBkZXZpY2UgdHJlZSBpcyBzcGxpdCBpbnRvIGEgYnVzIGRldmljZSB0cmVlIGF0CisJICAvc3lzL2RldmljZXMvIGFuZCBzZXZlcmFsIGluZGl2aWR1YWwgY2xhc3MgZGV2aWNlIHRyZWVzIGF0CisJICAvc3lzL2NsYXNzLy4gVGhlIGNsYXNzIGFuZCBidXMgZGV2aWNlcyB3aWxsIGJlIGNvbm5lY3RlZCBieQorCSAgIjxzdWJzeXN0ZW0+OjxuYW1lPiIgYW5kIHRoZSAiZGV2aWNlIiBsaW5rcy4gVGhlICJibG9jayIKKwkgIGNsYXNzIGRldmljZXMsIHdpbGwgbm90IHNob3cgdXAgaW4gL3N5cy9jbGFzcy9ibG9jay8uIFNvbWUKKwkgIHN1YnN5c3RlbXMgd2lsbCBzdXBwcmVzcyB0aGUgY3JlYXRpb24gb2Ygc29tZSBkZXZpY2VzIHdoaWNoCisJICBkZXBlbmQgb24gdGhlIHVuaWZpZWQgZGV2aWNlIHRyZWUuCiAKLQkgIElmIHlvdSBhcmUgdXNpbmcgYSBkaXN0cm8gd2l0aCB0aGUgbW9zdCByZWNlbnQgdXNlcnNwYWNlCi0JICBwYWNrYWdlcywgaXQgc2hvdWxkIGJlIHNhZmUgdG8gc2F5IE4gaGVyZS4KKwkgIFRoaXMgb3B0aW9uIGlzIG5vdCBhIHB1cmUgY29tcGF0aWJpbGl0eSBvcHRpb24gdGhhdCBjYW4KKwkgIGJlIHNhZmVseSBlbmFibGVkIG9uIG5ld2VyIGRpc3RyaWJ1dGlvbnMuIEl0IHdpbGwgY2hhbmdlIHRoZQorCSAgbGF5b3V0IG9mIHN5c2ZzIHRvIHRoZSBub24tZXh0ZW5zaWJsZSBkZXByZWNhdGVkIHZlcnNpb24sCisJICBhbmQgZGlzYWJsZSBzb21lIGZlYXR1cmVzLCB3aGljaCBjYW4gbm90IGJlIGV4cG9ydGVkIHdpdGhvdXQKKwkgIGNvbmZ1c2luZyBvbGRlciB1c2Vyc3BhY2UgdG9vbHMuIFNpbmNlIDIwMDcvMjAwOCBhbGwgbWFqb3IKKwkgIGRpc3RyaWJ1dGlvbnMgZG8gbm90IGVuYWJsZSB0aGlzIG9wdGlvbiwgYW5kIHNoaXAgbm8gdG9vbHMgd2hpY2gKKwkgIGRlcGVuZCBvbiB0aGUgZGVwcmVjYXRlZCBsYXlvdXQgb3IgdGhpcyBvcHRpb24uCisKKwkgIElmIHlvdSBhcmUgdXNpbmcgYSBuZXcga2VybmVsIG9uIGFuIG9sZGVyIGRpc3RyaWJ1dGlvbiwgb3IgdXNlCisJICBvbGRlciB1c2Vyc3BhY2UgdG9vbHMsIHlvdSBtaWdodCBuZWVkIHRvIHNheSBZIGhlcmUuIERvIG5vdCBzYXkgWSwKKwkgIGlmIHRoZSBvcmlnaW5hbCBrZXJuZWwsIHRoYXQgY2FtZSB3aXRoIHlvdXIgZGlzdHJpYnV0aW9uLCBoYXMKKwkgIHRoaXMgb3B0aW9uIHNldCB0byBOLgogCiBjb25maWcgUFJPQ19QSURfQ1BVU0VUCiAJYm9vbCAiSW5jbHVkZSBsZWdhY3kgL3Byb2MvPHBpZD4vY3B1c2V0IGZpbGUiCkBAIC04MzgsMTAgKzg0OCw2IEBACiAJYm9vbGVhbgogCXNlbGVjdCBQTElTVAogCi1jb25maWcgVElOWV9TSE1FTQotCWRlZmF1bHQgIVNITUVNCi0JYm9vbAotCiBjb25maWcgQkFTRV9TTUFMTAogCWludAogCWRlZmF1bHQgMCBpZiBCQVNFX0ZVTEwKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzLmMgYi9pbml0L2RvX21vdW50cy5jCmluZGV4IGQwNTViMTkuLjVlZmNhNzMgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzLmMKKysrIGIvaW5pdC9kb19tb3VudHMuYwpAQCAtMjIwLDEwICsyMjAsMTAgQEAKIAogCXN5c19jaGRpcigiL3Jvb3QiKTsKIAlST09UX0RFViA9IGN1cnJlbnQtPmZzLT5wd2QubW50LT5tbnRfc2ItPnNfZGV2OwotCXByaW50aygiVkZTOiBNb3VudGVkIHJvb3QgKCVzIGZpbGVzeXN0ZW0pJXMuXG4iLAorCXByaW50aygiVkZTOiBNb3VudGVkIHJvb3QgKCVzIGZpbGVzeXN0ZW0pJXMgb24gZGV2aWNlICV1OiV1LlxuIiwKIAkgICAgICAgY3VycmVudC0+ZnMtPnB3ZC5tbnQtPm1udF9zYi0+c190eXBlLT5uYW1lLAogCSAgICAgICBjdXJyZW50LT5mcy0+cHdkLm1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZID8KLQkgICAgICAgIiByZWFkb25seSIgOiAiIik7CisJICAgICAgICIgcmVhZG9ubHkiIDogIiIsIE1BSk9SKFJPT1RfREVWKSwgTUlOT1IoUk9PVF9ERVYpKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHNfbWQuYyBiL2luaXQvZG9fbW91bnRzX21kLmMKaW5kZXggZDZkYTVjZC4uZmY5NWUzMSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfbWQuYworKysgYi9pbml0L2RvX21vdW50c19tZC5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIF9fc2V0dXAoInJhaWQ9IiwgcmFpZF9zZXR1cCk7CiBfX3NldHVwKCJtZD0iLCBtZF9zZXR1cCk7CiAKLXN0YXRpYyB2b2lkIGF1dG9kZXRlY3RfcmFpZCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF1dG9kZXRlY3RfcmFpZCh2b2lkKQogewogCWludCBmZDsKIApkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBjZDE2OGViLi5iNWE4OTJjIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VfY2dyb3VwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KQEAgLTEwOCw3ICsxMDcsNyBAQAogCiBleHRlcm4gdm9pZCB0aW1lX2luaXQodm9pZCk7CiAvKiBEZWZhdWx0IGxhdGUgdGltZSBpbml0IGlzIE5VTEwuIGFyY2hzIGNhbiBvdmVycmlkZSB0aGlzIGxhdGVyLiAqLwotdm9pZCAoKmxhdGVfdGltZV9pbml0KSh2b2lkKTsKK3ZvaWQgKCpfX2luaXRkYXRhIGxhdGVfdGltZV9pbml0KSh2b2lkKTsKIGV4dGVybiB2b2lkIHNvZnRpcnFfaW5pdCh2b2lkKTsKIAogLyogVW50b3VjaGVkIGNvbW1hbmQgbGluZSBzYXZlZCBieSBhcmNoLXNwZWNpZmljIGNvZGUuICovCkBAIC00NDcsNyArNDQ2LDcgQEAKICAqIGdjYy0zLjQgYWNjaWRlbnRhbGx5IGlubGluZXMgdGhpcyBmdW5jdGlvbiwgc28gdXNlIG5vaW5saW5lLgogICovCiAKLXN0YXRpYyB2b2lkIG5vaW5saW5lIF9faW5pdF9yZWZvayByZXN0X2luaXQodm9pZCkKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdF9yZWZvayByZXN0X2luaXQodm9pZCkKIAlfX3JlbGVhc2VzKGtlcm5lbF9sb2NrKQogewogCWludCBwaWQ7CkBAIC01MzcsNyArNTM2LDYgQEAKIAkgKiBOZWVkIHRvIHJ1biBhcyBlYXJseSBhcyBwb3NzaWJsZSwgdG8gaW5pdGlhbGl6ZSB0aGUKIAkgKiBsb2NrZGVwIGhhc2g6CiAJICovCi0JdW53aW5kX2luaXQoKTsKIAlsb2NrZGVwX2luaXQoKTsKIAlkZWJ1Z19vYmplY3RzX2Vhcmx5X2luaXQoKTsKIAljZ3JvdXBfaW5pdF9lYXJseSgpOwpAQCAtNTU5LDcgKzU1Nyw2IEBACiAJc2V0dXBfYXJjaCgmY29tbWFuZF9saW5lKTsKIAltbV9pbml0X293bmVyKCZpbml0X21tLCAmaW5pdF90YXNrKTsKIAlzZXR1cF9jb21tYW5kX2xpbmUoY29tbWFuZF9saW5lKTsKLQl1bndpbmRfc2V0dXAoKTsKIAlzZXR1cF9wZXJfY3B1X2FyZWFzKCk7CiAJc2V0dXBfbnJfY3B1X2lkcygpOwogCXNtcF9wcmVwYXJlX2Jvb3RfY3B1KCk7CS8qIGFyY2gtc3BlY2lmaWMgYm9vdC1jcHUgaG9va3MgKi8KQEAgLTc4Niw3ICs3ODMsNyBAQAogLyogVGhpcyBpcyBhIG5vbiBfX2luaXQgZnVuY3Rpb24uIEZvcmNlIGl0IHRvIGJlIG5vaW5saW5lIG90aGVyd2lzZSBnY2MKICAqIG1ha2VzIGl0IGlubGluZSB0byBpbml0KCkgYW5kIGl0IGJlY29tZXMgcGFydCBvZiBpbml0LnRleHQgc2VjdGlvbgogICovCi1zdGF0aWMgaW50IG5vaW5saW5lIGluaXRfcG9zdCh2b2lkKQorc3RhdGljIG5vaW5saW5lIGludCBpbml0X3Bvc3Qodm9pZCkKIHsKIAlmcmVlX2luaXRtZW0oKTsKIAl1bmxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9pcGMvaXBjX3N5c2N0bC5jIGIvaXBjL2lwY19zeXNjdGwuYwppbmRleCAwZGZlYmM1Li40YTdhMTJjIDEwMDY0NAotLS0gYS9pcGMvaXBjX3N5c2N0bC5jCisrKyBiL2lwYy9pcGNfc3lzY3RsLmMKQEAgLTI2LDI5ICsyNiw2IEBACiAJcmV0dXJuIHdoaWNoOwogfQogCi0vKgotICogUm91dGluZSB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBmaWxlICJhdXRvX21zZ21uaSIgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuCi0gKiB3cml0dGVuLgotICogVHdvIHZhbHVlcyBhcmUgYWxsb3dlZDoKLSAqIDA6IHVucmVnaXN0ZXIgbXNnbW5pJ3MgY2FsbGJhY2sgcm91dGluZSBmcm9tIHRoZSBpcGMgbmFtZXNwYWNlIG5vdGlmaWVyCi0gKiAgICBjaGFpbi4gVGhpcyBtZWFucyB0aGF0IG1zZ21uaSB3b24ndCBiZSByZWNvbXB1dGVkIGFueW1vcmUgdXBvbiBtZW1vcnkKLSAqICAgIGFkZC9yZW1vdmUgb3IgaXBjIG5hbWVzcGFjZSBjcmVhdGlvbi9yZW1vdmFsLgotICogMTogcmVnaXN0ZXIgYmFjayB0aGUgY2FsbGJhY2sgcm91dGluZS4KLSAqLwotc3RhdGljIHZvaWQgaXBjX2F1dG9fY2FsbGJhY2soaW50IHZhbCkKLXsKLQlpZiAoIXZhbCkKLQkJdW5yZWdpc3Rlcl9pcGNuc19ub3RpZmllcihjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnMpOwotCWVsc2UgewotCQkvKgotCQkgKiBSZS1lbmFibGUgYXV0b21hdGljIHJlY29tcHV0aW5nIG9ubHkgaWYgbm90IGFscmVhZHkKLQkJICogZW5hYmxlZC4KLQkJICovCi0JCXJlY29tcHV0ZV9tc2dtbmkoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKLQkJY29uZF9yZWdpc3Rlcl9pcGNuc19ub3RpZmllcihjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnMpOwotCX0KLX0KLQogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IHByb2NfaXBjX2RvaW50dmVjKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCkBAIC05NCw2ICs3MSwyOSBAQAogCQkJCQlsZW5wLCBwcG9zKTsKIH0KIAorLyoKKyAqIFJvdXRpbmUgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSAiYXV0b19tc2dtbmkiIGhhcyBzdWNjZXNzZnVsbHkgYmVlbgorICogd3JpdHRlbi4KKyAqIFR3byB2YWx1ZXMgYXJlIGFsbG93ZWQ6CisgKiAwOiB1bnJlZ2lzdGVyIG1zZ21uaSdzIGNhbGxiYWNrIHJvdXRpbmUgZnJvbSB0aGUgaXBjIG5hbWVzcGFjZSBub3RpZmllcgorICogICAgY2hhaW4uIFRoaXMgbWVhbnMgdGhhdCBtc2dtbmkgd29uJ3QgYmUgcmVjb21wdXRlZCBhbnltb3JlIHVwb24gbWVtb3J5CisgKiAgICBhZGQvcmVtb3ZlIG9yIGlwYyBuYW1lc3BhY2UgY3JlYXRpb24vcmVtb3ZhbC4KKyAqIDE6IHJlZ2lzdGVyIGJhY2sgdGhlIGNhbGxiYWNrIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGlwY19hdXRvX2NhbGxiYWNrKGludCB2YWwpCit7CisJaWYgKCF2YWwpCisJCXVucmVnaXN0ZXJfaXBjbnNfbm90aWZpZXIoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKKwllbHNlIHsKKwkJLyoKKwkJICogUmUtZW5hYmxlIGF1dG9tYXRpYyByZWNvbXB1dGluZyBvbmx5IGlmIG5vdCBhbHJlYWR5CisJCSAqIGVuYWJsZWQuCisJCSAqLworCQlyZWNvbXB1dGVfbXNnbW5pKGN1cnJlbnQtPm5zcHJveHktPmlwY19ucyk7CisJCWNvbmRfcmVnaXN0ZXJfaXBjbnNfbm90aWZpZXIoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgcHJvY19pcGNhdXRvX2RvaW50dmVjX21pbm1heChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewpkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IGZlYTBhZDMuLmM2OGNkM2YgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTEyMTYsNyArMTIxNiw2IEBACiAJaWYgKHRpbWVvdXQgJiYgamlmZmllc19sZWZ0ID09IDApCiAJCWVycm9yID0gLUVBR0FJTjsKIAlsaXN0X2RlbCgmcXVldWUubGlzdCk7Ci0JZ290byBvdXRfdW5sb2NrX2ZyZWU7CiAKIG91dF91bmxvY2tfZnJlZToKIAlzZW1fdW5sb2NrKHNtYSk7CmRpZmYgLS1naXQgYS9pcGMvc2htLmMgYi9pcGMvc2htLmMKaW5kZXggNTdkZDUwMC4uYjEyNWI1NiAxMDA2NDQKLS0tIGEvaXBjL3NobS5jCisrKyBiL2lwYy9zaG0uYwpAQCAtNzUsNyArNzUsNyBAQAogCW5zLT5zaG1fY3RsYWxsID0gU0hNQUxMOwogCW5zLT5zaG1fY3RsbW5pID0gU0hNTU5JOwogCW5zLT5zaG1fdG90ID0gMDsKLQlpcGNfaW5pdF9pZHMoJm5zLT5pZHNbSVBDX1NITV9JRFNdKTsKKwlpcGNfaW5pdF9pZHMoJnNobV9pZHMobnMpKTsKIH0KIAogLyoKQEAgLTY0NCw3ICs2NDQsNyBAQAogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAotCQltZW1zZXQoJnNobWluZm8sMCxzaXplb2Yoc2htaW5mbykpOworCQltZW1zZXQoJnNobWluZm8sIDAsIHNpemVvZihzaG1pbmZvKSk7CiAJCXNobWluZm8uc2htbW5pID0gc2htaW5mby5zaG1zZWcgPSBucy0+c2htX2N0bG1uaTsKIAkJc2htaW5mby5zaG1tYXggPSBucy0+c2htX2N0bG1heDsKIAkJc2htaW5mby5zaG1hbGwgPSBucy0+c2htX2N0bGFsbDsKQEAgLTY2OSw3ICs2NjksNyBAQAogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAotCQltZW1zZXQoJnNobV9pbmZvLDAsc2l6ZW9mKHNobV9pbmZvKSk7CisJCW1lbXNldCgmc2htX2luZm8sIDAsIHNpemVvZihzaG1faW5mbykpOwogCQlkb3duX3JlYWQoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKIAkJc2htX2luZm8udXNlZF9pZHMgPSBzaG1faWRzKG5zKS5pbl91c2U7CiAJCXNobV9nZXRfc3RhdCAobnMsICZzaG1faW5mby5zaG1fcnNzLCAmc2htX2luZm8uc2htX3N3cCk7CkBAIC02NzgsNyArNjc4LDcgQEAKIAkJc2htX2luZm8uc3dhcF9zdWNjZXNzZXMgPSAwOwogCQllcnIgPSBpcGNfZ2V0X21heGlkKCZzaG1faWRzKG5zKSk7CiAJCXVwX3JlYWQoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKLQkJaWYoY29weV90b191c2VyIChidWYsICZzaG1faW5mbywgc2l6ZW9mKHNobV9pbmZvKSkpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZzaG1faW5mbywgc2l6ZW9mKHNobV9pbmZvKSkpIHsKIAkJCWVyciA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNjkyLDExICs2OTIsNiBAQAogCQlzdHJ1Y3Qgc2htaWQ2NF9kcyB0YnVmOwogCQlpbnQgcmVzdWx0OwogCi0JCWlmICghYnVmKSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLQogCQlpZiAoY21kID09IFNITV9TVEFUKSB7CiAJCQlzaHAgPSBzaG1fbG9jayhucywgc2htaWQpOwogCQkJaWYgKElTX0VSUihzaHApKSB7CkBAIC03MTIsNyArNzA3LDcgQEAKIAkJCX0KIAkJCXJlc3VsdCA9IDA7CiAJCX0KLQkJZXJyPS1FQUNDRVM7CisJCWVyciA9IC1FQUNDRVM7CiAJCWlmIChpcGNwZXJtcyAoJnNocC0+c2htX3Blcm0sIFNfSVJVR08pKQogCQkJZ290byBvdXRfdW5sb2NrOwogCQllcnIgPSBzZWN1cml0eV9zaG1fc2htY3RsKHNocCwgY21kKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAuYyBiL2tlcm5lbC9jZ3JvdXAuYwppbmRleCA4N2JiMDI1Li5mMjIxNDQ2IDEwMDY0NAotLS0gYS9rZXJuZWwvY2dyb3VwLmMKKysrIGIva2VybmVsL2Nncm91cC5jCkBAIC0xMTYsNyArMTE2LDYgQEAKICAqIGJlIGNhbGxlZC4KICAqLwogc3RhdGljIGludCBuZWVkX2ZvcmtleGl0X2NhbGxiYWNrIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgaW50IG5lZWRfbW1fb3duZXJfY2FsbGJhY2sgX19yZWFkX21vc3RseTsKIAogLyogY29udmVuaWVudCB0ZXN0cyBmb3IgdGhlc2UgYml0cyAqLwogaW5saW5lIGludCBjZ3JvdXBfaXNfcmVtb3ZlZChjb25zdCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQpAQCAtMjUzOSw3ICsyNTM4LDYgQEAKIAlpbml0X2Nzc19zZXQuc3Vic3lzW3NzLT5zdWJzeXNfaWRdID0gZHVtbXl0b3AtPnN1YnN5c1tzcy0+c3Vic3lzX2lkXTsKIAogCW5lZWRfZm9ya2V4aXRfY2FsbGJhY2sgfD0gc3MtPmZvcmsgfHwgc3MtPmV4aXQ7Ci0JbmVlZF9tbV9vd25lcl9jYWxsYmFjayB8PSAhIXNzLT5tbV9vd25lcl9jaGFuZ2VkOwogCiAJLyogQXQgc3lzdGVtIGJvb3QsIGJlZm9yZSBhbGwgc3Vic3lzdGVtcyBoYXZlIGJlZW4KIAkgKiByZWdpc3RlcmVkLCBubyB0YXNrcyBoYXZlIGJlZW4gZm9ya2VkLCBzbyB3ZSBkb24ndApAQCAtMjc4OSwzNyArMjc4Nyw2IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX01NX09XTkVSCi0vKioKLSAqIGNncm91cF9tbV9vd25lcl9jYWxsYmFja3MgLSBydW4gY2FsbGJhY2tzIHdoZW4gdGhlIG1tLT5vd25lciBjaGFuZ2VzCi0gKiBAcDogdGhlIG5ldyBvd25lcgotICoKLSAqIENhbGxlZCBvbiBldmVyeSBjaGFuZ2UgdG8gbW0tPm93bmVyLiBtbV9pbml0X293bmVyKCkgZG9lcyBub3QKLSAqIGludm9rZSB0aGlzIHJvdXRpbmUsIHNpbmNlIGl0IGFzc2lnbnMgdGhlIG1tLT5vd25lciB0aGUgZmlyc3QgdGltZQotICogYW5kIGRvZXMgbm90IGNoYW5nZSBpdC4KLSAqCi0gKiBUaGUgY2FsbGJhY2tzIGFyZSBpbnZva2VkIHdpdGggbW1hcF9zZW0gaGVsZCBpbiByZWFkIG1vZGUuCi0gKi8KLXZvaWQgY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZCwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXcpCi17Ci0Jc3RydWN0IGNncm91cCAqb2xkY2dycCwgKm5ld2NncnAgPSBOVUxMOwotCi0JaWYgKG5lZWRfbW1fb3duZXJfY2FsbGJhY2spIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBDR1JPVVBfU1VCU1lTX0NPVU5UOyBpKyspIHsKLQkJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcyA9IHN1YnN5c1tpXTsKLQkJCW9sZGNncnAgPSB0YXNrX2Nncm91cChvbGQsIHNzLT5zdWJzeXNfaWQpOwotCQkJaWYgKG5ldykKLQkJCQluZXdjZ3JwID0gdGFza19jZ3JvdXAobmV3LCBzcy0+c3Vic3lzX2lkKTsKLQkJCWlmIChvbGRjZ3JwID09IG5ld2NncnApCi0JCQkJY29udGludWU7Ci0JCQlpZiAoc3MtPm1tX293bmVyX2NoYW5nZWQpCi0JCQkJc3MtPm1tX293bmVyX2NoYW5nZWQoc3MsIG9sZGNncnAsIG5ld2NncnAsIG5ldyk7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLyogQ09ORklHX01NX09XTkVSICovCi0KIC8qKgogICogY2dyb3VwX3Bvc3RfZm9yayAtIGNhbGxlZCBvbiBhIG5ldyB0YXNrIGFmdGVyIGFkZGluZyBpdCB0byB0aGUgdGFzayBsaXN0CiAgKiBAY2hpbGQ6IHRoZSB0YXNrIGluIHF1ZXN0aW9uCmRpZmYgLS1naXQgYS9rZXJuZWwvY29tcGF0LmMgYi9rZXJuZWwvY29tcGF0LmMKaW5kZXggZDUyZTJlYy4uNDJkNTY1NCAxMDA2NDQKLS0tIGEva2VybmVsL2NvbXBhdC5jCisrKyBiL2tlcm5lbC9jb21wYXQuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtMjI5LDYgKzIzMCw3IEBACiAJCWlmIChjb3B5X3RvX3VzZXIodGJ1ZiwgJnRtcCwgc2l6ZW9mKHRtcCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gY29tcGF0X2ppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzKTsKIH0KIApAQCAtODk0LDggKzg5Niw5IEBACiAKIAlpZiAodGxvYykgewogCQlpZiAocHV0X3VzZXIoaSx0bG9jKSkKLQkJCWkgPSAtRUZBVUxUOworCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gaTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDM5YzFhNGMuLjM0NWFjZTUxIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC0yNDAsNiArMjQwLDE3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGNhbGxiYWNrX211dGV4KTsKIAogLyoKKyAqIGNwdXNldF9idWZmZXJfbG9jayBwcm90ZWN0cyBib3RoIHRoZSBjcHVzZXRfbmFtZSBhbmQgY3B1c2V0X25vZGVsaXN0CisgKiBidWZmZXJzLiAgVGhleSBhcmUgc3RhdGljYWxseSBhbGxvY2F0ZWQgdG8gcHJldmVudCB1c2luZyBleGNlc3Mgc3RhY2sKKyAqIHdoZW4gY2FsbGluZyBjcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoKS4KKyAqLworI2RlZmluZSBDUFVTRVRfTkFNRV9MRU4JCSgxMjgpCisjZGVmaW5lCUNQVVNFVF9OT0RFTElTVF9MRU4JKDI1NikKK3N0YXRpYyBjaGFyIGNwdXNldF9uYW1lW0NQVVNFVF9OQU1FX0xFTl07CitzdGF0aWMgY2hhciBjcHVzZXRfbm9kZWxpc3RbQ1BVU0VUX05PREVMSVNUX0xFTl07CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNwdXNldF9idWZmZXJfbG9jayk7CisKKy8qCiAgKiBUaGlzIGlzIHVnbHksIGJ1dCBwcmVzZXJ2ZXMgdGhlIHVzZXJzcGFjZSBBUEkgZm9yIGV4aXN0aW5nIGNwdXNldAogICogdXNlcnMuIElmIHNvbWVvbmUgdHJpZXMgdG8gbW91bnQgdGhlICJjcHVzZXQiIGZpbGVzeXN0ZW0sIHdlCiAgKiBzaWxlbnRseSBzd2l0Y2ggaXQgdG8gbW91bnQgImNncm91cCIgaW5zdGVhZApAQCAtMjM1Niw2ICsyMzY3LDI5IEBACiAJcmV0dXJuIG5vZGVzX2ludGVyc2VjdHModHNrMS0+bWVtc19hbGxvd2VkLCB0c2syLT5tZW1zX2FsbG93ZWQpOwogfQogCisvKioKKyAqIGNwdXNldF9wcmludF90YXNrX21lbXNfYWxsb3dlZCAtIHByaW50cyB0YXNrJ3MgY3B1c2V0IGFuZCBtZW1zX2FsbG93ZWQKKyAqIEB0YXNrOiBwb2ludGVyIHRvIHRhc2tfc3RydWN0IG9mIHNvbWUgdGFzay4KKyAqCisgKiBEZXNjcmlwdGlvbjogUHJpbnRzIEB0YXNrJ3MgbmFtZSwgY3B1c2V0IG5hbWUsIGFuZCBjYWNoZWQgY29weSBvZiBpdHMKKyAqIG1lbXNfYWxsb3dlZCB0byB0aGUga2VybmVsIGxvZy4gIE11c3QgaG9sZCB0YXNrX2xvY2sodGFzaykgdG8gYWxsb3cKKyAqIGRlcmVmZXJlbmNpbmcgdGFza19jcyh0YXNrKS4KKyAqLwordm9pZCBjcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJZGVudHJ5ID0gdGFza19jcyh0c2spLT5jc3MuY2dyb3VwLT5kZW50cnk7CisJc3Bpbl9sb2NrKCZjcHVzZXRfYnVmZmVyX2xvY2spOworCXNucHJpbnRmKGNwdXNldF9uYW1lLCBDUFVTRVRfTkFNRV9MRU4sCisJCSBkZW50cnkgPyAoY29uc3QgY2hhciAqKWRlbnRyeS0+ZF9uYW1lLm5hbWUgOiAiLyIpOworCW5vZGVsaXN0X3NjbnByaW50ZihjcHVzZXRfbm9kZWxpc3QsIENQVVNFVF9OT0RFTElTVF9MRU4sCisJCQkgICB0c2stPm1lbXNfYWxsb3dlZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgY3B1c2V0PSVzIG1lbXNfYWxsb3dlZD0lc1xuIiwKKwkgICAgICAgdHNrLT5jb21tLCBjcHVzZXRfbmFtZSwgY3B1c2V0X25vZGVsaXN0KTsKKwlzcGluX3VubG9jaygmY3B1c2V0X2J1ZmZlcl9sb2NrKTsKK30KKwogLyoKICAqIENvbGxlY3Rpb24gb2YgbWVtb3J5X3ByZXNzdXJlIGlzIHN1cHByZXNzZWQgdW5sZXNzCiAgKiB0aGlzIGZsYWcgaXMgZW5hYmxlZCBieSB3cml0aW5nICIxIiB0byB0aGUgc3BlY2lhbApkaWZmIC0tZ2l0IGEva2VybmVsL2RtYS1jb2hlcmVudC5jIGIva2VybmVsL2RtYS1jb2hlcmVudC5jCmluZGV4IGYwMTNhMGMuLjAzODcwNzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kbWEtY29oZXJlbnQuYworKysgYi9rZXJuZWwvZG1hLWNvaGVyZW50LmMKQEAgLTEwOSwyMCArMTA5LDQwIEBACiBpbnQgZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzc2l6ZV90IHNpemUsCiAJCQkJICAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIHZvaWQgKipyZXQpCiB7Ci0Jc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbSA9IGRldiA/IGRldi0+ZG1hX21lbSA6IE5VTEw7CisJc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbTsKIAlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisJaW50IHBhZ2VubzsKIAotCWlmIChtZW0pIHsKLQkJaW50IHBhZ2UgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtZW0tPmJpdG1hcCwgbWVtLT5zaXplLAotCQkJCQkJICAgICBvcmRlcik7Ci0JCWlmIChwYWdlID49IDApIHsKLQkJCSpkbWFfaGFuZGxlID0gbWVtLT5kZXZpY2VfYmFzZSArIChwYWdlIDw8IFBBR0VfU0hJRlQpOwotCQkJKnJldCA9IG1lbS0+dmlydF9iYXNlICsgKHBhZ2UgPDwgUEFHRV9TSElGVCk7Ci0JCQltZW1zZXQoKnJldCwgMCwgc2l6ZSk7Ci0JCX0gZWxzZSBpZiAobWVtLT5mbGFncyAmIERNQV9NRU1PUllfRVhDTFVTSVZFKQotCQkJKnJldCA9IE5VTEw7CisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCW1lbSA9IGRldi0+ZG1hX21lbTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIDA7CisJaWYgKHVubGlrZWx5KHNpemUgPiBtZW0tPnNpemUpKQorIAkJcmV0dXJuIDA7CisKKwlwYWdlbm8gPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtZW0tPmJpdG1hcCwgbWVtLT5zaXplLCBvcmRlcik7CisJaWYgKHBhZ2VubyA+PSAwKSB7CisJCS8qCisJCSAqIE1lbW9yeSB3YXMgZm91bmQgaW4gdGhlIHBlci1kZXZpY2UgYXJlbmEuCisJCSAqLworCQkqZG1hX2hhbmRsZSA9IG1lbS0+ZGV2aWNlX2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOworCQkqcmV0ID0gbWVtLT52aXJ0X2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOworCQltZW1zZXQoKnJldCwgMCwgc2l6ZSk7CisJfSBlbHNlIGlmIChtZW0tPmZsYWdzICYgRE1BX01FTU9SWV9FWENMVVNJVkUpIHsKKwkJLyoKKwkJICogVGhlIHBlci1kZXZpY2UgYXJlbmEgaXMgZXhoYXVzdGVkIGFuZCB3ZSBhcmUgbm90CisJCSAqIHBlcm1pdHRlZCB0byBmYWxsIGJhY2sgdG8gZ2VuZXJpYyBtZW1vcnkuCisJCSAqLworCQkqcmV0ID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgcGVyLWRldmljZSBhcmVuYSBpcyBleGhhdXN0ZWQgYW5kIHdlIGFyZQorCQkgKiBwZXJtaXR0ZWQgdG8gZmFsbCBiYWNrIHRvIGdlbmVyaWMgbWVtb3J5LgorCQkgKi8KKwkJIHJldHVybiAwOwogCX0KLQlyZXR1cm4gKG1lbSAhPSBOVUxMKTsKKwlyZXR1cm4gMTsKIH0KIEVYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBjOWU1YTFjLi5jNzc0MGZhIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTY0MiwzNSArNjQyLDMxIEBACiAJLyoKIAkgKiBXZSBmb3VuZCBubyBvd25lciB5ZXQgbW1fdXNlcnMgPiAxOiB0aGlzIGltcGxpZXMgdGhhdCB3ZSBhcmUKIAkgKiBtb3N0IGxpa2VseSByYWNpbmcgd2l0aCBzd2Fwb2ZmICh0cnlfdG9fdW51c2UoKSkgb3IgL3Byb2Mgb3IKLQkgKiBwdHJhY2Ugb3IgcGFnZSBtaWdyYXRpb24gKGdldF90YXNrX21tKCkpLiAgTWFyayBvd25lciBhcyBOVUxMLAotCSAqIHNvIHRoYXQgc3Vic3lzdGVtcyBjYW4gdW5kZXJzdGFuZCB0aGUgY2FsbGJhY2sgYW5kIHRha2UgYWN0aW9uLgorCSAqIHB0cmFjZSBvciBwYWdlIG1pZ3JhdGlvbiAoZ2V0X3Rhc2tfbW0oKSkuICBNYXJrIG93bmVyIGFzIE5VTEwuCiAJICovCi0JZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQljZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzKG1tLT5vd25lciwgTlVMTCk7CiAJbW0tPm93bmVyID0gTlVMTDsKLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm47CiAKIGFzc2lnbl9uZXdfb3duZXI6CiAJQlVHX09OKGMgPT0gcCk7CiAJZ2V0X3Rhc2tfc3RydWN0KGMpOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCS8qCiAJICogVGhlIHRhc2tfbG9jayBwcm90ZWN0cyBjLT5tbSBmcm9tIGNoYW5naW5nLgogCSAqIFdlIGFsd2F5cyB3YW50IG1tLT5vd25lci0+bW0gPT0gbW0KIAkgKi8KIAl0YXNrX2xvY2soYyk7CisJLyoKKwkgKiBEZWxheSByZWFkX3VubG9jaygpIHRpbGwgd2UgaGF2ZSB0aGUgdGFza19sb2NrKCkKKwkgKiB0byBlbnN1cmUgdGhhdCBjIGRvZXMgbm90IHNsaXAgYXdheSB1bmRlcm5lYXRoIHVzCisJICovCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCWlmIChjLT5tbSAhPSBtbSkgewogCQl0YXNrX3VubG9jayhjKTsKLQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJCXB1dF90YXNrX3N0cnVjdChjKTsKIAkJZ290byByZXRyeTsKIAl9Ci0JY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhtbS0+b3duZXIsIGMpOwogCW1tLT5vd25lciA9IGM7CiAJdGFza191bmxvY2soYyk7Ci0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcHV0X3Rhc2tfc3RydWN0KGMpOwogfQogI2VuZGlmIC8qIENPTkZJR19NTV9PV05FUiAqLwpAQCAtMTA1NSwxMCArMTA1MSw3IEBACiAJCQkJcHJlZW1wdF9jb3VudCgpKTsKIAogCWFjY3RfdXBkYXRlX2ludGVncmFscyh0c2spOwotCWlmICh0c2stPm1tKSB7Ci0JCXVwZGF0ZV9oaXdhdGVyX3Jzcyh0c2stPm1tKTsKLQkJdXBkYXRlX2hpd2F0ZXJfdm0odHNrLT5tbSk7Ci0JfQorCiAJZ3JvdXBfZGVhZCA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJnRzay0+c2lnbmFsLT5saXZlKTsKIAlpZiAoZ3JvdXBfZGVhZCkgewogCQlocnRpbWVyX2NhbmNlbCgmdHNrLT5zaWduYWwtPnJlYWxfdGltZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNDNjYmYzMC4uN2I4ZjJhNyAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC00MDAsNiArNDAwLDE4IEBACiAjZGVmaW5lIGFsbG9jYXRlX21tKCkJKGttZW1fY2FjaGVfYWxsb2MobW1fY2FjaGVwLCBHRlBfS0VSTkVMKSkKICNkZWZpbmUgZnJlZV9tbShtbSkJKGttZW1fY2FjaGVfZnJlZShtbV9jYWNoZXAsIChtbSkpKQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X2R1bXBfZmlsdGVyID0gTU1GX0RVTVBfRklMVEVSX0RFRkFVTFQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvcmVkdW1wX2ZpbHRlcl9zZXR1cChjaGFyICpzKQoreworCWRlZmF1bHRfZHVtcF9maWx0ZXIgPQorCQkoc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCkgPDwgTU1GX0RVTVBfRklMVEVSX1NISUZUKSAmCisJCU1NRl9EVU1QX0ZJTFRFUl9NQVNLOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJjb3JlZHVtcF9maWx0ZXI9IiwgY29yZWR1bXBfZmlsdGVyX3NldHVwKTsKKwogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogCiBzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqIG1tX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqIG1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC00MDgsOCArNDIwLDcgQEAKIAlhdG9taWNfc2V0KCZtbS0+bW1fY291bnQsIDEpOwogCWluaXRfcndzZW0oJm1tLT5tbWFwX3NlbSk7CiAJSU5JVF9MSVNUX0hFQUQoJm1tLT5tbWxpc3QpOwotCW1tLT5mbGFncyA9IChjdXJyZW50LT5tbSkgPyBjdXJyZW50LT5tbS0+ZmxhZ3MKLQkJCQkgIDogTU1GX0RVTVBfRklMVEVSX0RFRkFVTFQ7CisJbW0tPmZsYWdzID0gKGN1cnJlbnQtPm1tKSA/IGN1cnJlbnQtPm1tLT5mbGFncyA6IGRlZmF1bHRfZHVtcF9maWx0ZXI7CiAJbW0tPmNvcmVfc3RhdGUgPSBOVUxMOwogCW1tLT5ucl9wdGVzID0gMDsKIAlzZXRfbW1fY291bnRlcihtbSwgZmlsZV9yc3MsIDApOwpAQCAtNzU4LDcgKzc2OSw3IEBACiB7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWc7CiAKLQlpZiAoY2xvbmVfZmxhZ3MgJiAoQ0xPTkVfU0lHSEFORCB8IENMT05FX1RIUkVBRCkpIHsKKwlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TSUdIQU5EKSB7CiAJCWF0b21pY19pbmMoJmN1cnJlbnQtPnNpZ2hhbmQtPmNvdW50KTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2ttb2QuYyBiL2tlcm5lbC9rbW9kLmMKaW5kZXggYjQ2ZGJiOS4uYTI3YTVmNiAxMDA2NDQKLS0tIGEva2VybmVsL2ttb2QuYworKysgYi9rZXJuZWwva21vZC5jCkBAIC01MSw4ICs1MSw4IEBACiAKIC8qKgogICogcmVxdWVzdF9tb2R1bGUgLSB0cnkgdG8gbG9hZCBhIGtlcm5lbCBtb2R1bGUKLSAqIEBmbXQ6ICAgICBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZyBmb3IgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotICogQHZhcmFyZ3M6IGFyZ3VlbWVudHMgYXMgc3BlY2lmaWVkIGluIHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAZm10OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZyBmb3IgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorICogQC4uLjogYXJndW1lbnRzIGFzIHNwZWNpZmllZCBpbiB0aGUgZm9ybWF0IHN0cmluZwogICoKICAqIExvYWQgYSBtb2R1bGUgdXNpbmcgdGhlIHVzZXIgbW9kZSBtb2R1bGUgbG9hZGVyLiBUaGUgZnVuY3Rpb24gcmV0dXJucwogICogemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8gY29kZSBvbiBmYWlsdXJlLiBOb3RlIHRoYXQgYQpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggOWY4YTNmMi4uMWI5Y2JkYyAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC02OSw3ICs2OSw3IEBACiAvKiBOT1RFOiBjaGFuZ2UgdGhpcyB2YWx1ZSBvbmx5IHdpdGgga3Byb2JlX211dGV4IGhlbGQgKi8KIHN0YXRpYyBib29sIGtwcm9iZV9lbmFibGVkOwogCi1ERUZJTkVfTVVURVgoa3Byb2JlX211dGV4KTsJCS8qIFByb3RlY3RzIGtwcm9iZV90YWJsZSAqLworc3RhdGljIERFRklORV9NVVRFWChrcHJvYmVfbXV0ZXgpOwkvKiBQcm90ZWN0cyBrcHJvYmVfdGFibGUgKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga3Byb2JlICosIGtwcm9iZV9pbnN0YW5jZSkgPSBOVUxMOwogc3RhdGljIHN0cnVjdCB7CiAJc3BpbmxvY2tfdCBsb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CkBAIC0xMTUsNiArMTE1LDcgQEAKIAlTTE9UX1VTRUQgPSAyLAogfTsKIAorc3RhdGljIERFRklORV9NVVRFWChrcHJvYmVfaW5zbl9tdXRleCk7CS8qIFByb3RlY3RzIGtwcm9iZV9pbnNuX3BhZ2VzICovCiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQga3Byb2JlX2luc25fcGFnZXM7CiBzdGF0aWMgaW50IGtwcm9iZV9nYXJiYWdlX3Nsb3RzOwogc3RhdGljIGludCBjb2xsZWN0X2dhcmJhZ2Vfc2xvdHModm9pZCk7CkBAIC0xNDQsMTAgKzE0NSwxMCBAQAogfQogCiAvKioKLSAqIGdldF9pbnNuX3Nsb3QoKSAtIEZpbmQgYSBzbG90IG9uIGFuIGV4ZWN1dGFibGUgcGFnZSBmb3IgYW4gaW5zdHJ1Y3Rpb24uCisgKiBfX2dldF9pbnNuX3Nsb3QoKSAtIEZpbmQgYSBzbG90IG9uIGFuIGV4ZWN1dGFibGUgcGFnZSBmb3IgYW4gaW5zdHJ1Y3Rpb24uCiAgKiBXZSBhbGxvY2F0ZSBhbiBleGVjdXRhYmxlIHBhZ2UgaWYgdGhlcmUncyBubyByb29tIG9uIGV4aXN0aW5nIG9uZXMuCiAgKi8KLWtwcm9iZV9vcGNvZGVfdCBfX2twcm9iZXMgKmdldF9pbnNuX3Nsb3Qodm9pZCkKK3N0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgX19rcHJvYmVzICpfX2dldF9pbnNuX3Nsb3Qodm9pZCkKIHsKIAlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CkBAIC0xOTYsNiArMTk3LDE1IEBACiAJcmV0dXJuIGtpcC0+aW5zbnM7CiB9CiAKK2twcm9iZV9vcGNvZGVfdCBfX2twcm9iZXMgKmdldF9pbnNuX3Nsb3Qodm9pZCkKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgKnJldDsKKwltdXRleF9sb2NrKCZrcHJvYmVfaW5zbl9tdXRleCk7CisJcmV0ID0gX19nZXRfaW5zbl9zbG90KCk7CisJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfaW5zbl9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwogLyogUmV0dXJuIDEgaWYgYWxsIGdhcmJhZ2VzIGFyZSBjb2xsZWN0ZWQsIG90aGVyd2lzZSAwLiAqLwogc3RhdGljIGludCBfX2twcm9iZXMgY29sbGVjdF9vbmVfc2xvdChzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwLCBpbnQgaWR4KQogewpAQCAtMjI2LDkgKzIzNiwxMyBAQAogewogCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvcywgKm5leHQ7CisJaW50IHNhZmV0eTsKIAogCS8qIEVuc3VyZSBuby1vbmUgaXMgcHJlZXBtdGVkIG9uIHRoZSBnYXJiYWdlcyAqLwotCWlmIChjaGVja19zYWZldHkoKSAhPSAwKQorCW11dGV4X3VubG9jaygma3Byb2JlX2luc25fbXV0ZXgpOworCXNhZmV0eSA9IGNoZWNrX3NhZmV0eSgpOworCW11dGV4X2xvY2soJmtwcm9iZV9pbnNuX211dGV4KTsKKwlpZiAoc2FmZXR5ICE9IDApCiAJCXJldHVybiAtRUFHQUlOOwogCiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShraXAsIHBvcywgbmV4dCwgJmtwcm9iZV9pbnNuX3BhZ2VzLCBobGlzdCkgewpAQCAtMjUxLDYgKzI2NSw3IEBACiAJc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgKmtpcDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwogCisJbXV0ZXhfbG9jaygma3Byb2JlX2luc25fbXV0ZXgpOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGtpcCwgcG9zLCAma3Byb2JlX2luc25fcGFnZXMsIGhsaXN0KSB7CiAJCWlmIChraXAtPmluc25zIDw9IHNsb3QgJiYKIAkJICAgIHNsb3QgPCBraXAtPmluc25zICsgKElOU05TX1BFUl9QQUdFICogTUFYX0lOU05fU0laRSkpIHsKQEAgLTI2Nyw2ICsyODIsOCBAQAogCiAJaWYgKGRpcnR5ICYmICsra3Byb2JlX2dhcmJhZ2Vfc2xvdHMgPiBJTlNOU19QRVJfUEFHRSkKIAkJY29sbGVjdF9nYXJiYWdlX3Nsb3RzKCk7CisKKwltdXRleF91bmxvY2soJmtwcm9iZV9pbnNuX211dGV4KTsKIH0KICNlbmRpZgogCkBAIC0zMTAsNyArMzI3LDcgQEAKIAlzdHJ1Y3Qga3Byb2JlICprcDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtwLCAmcC0+bGlzdCwgbGlzdCkgewotCQlpZiAoa3AtPnByZV9oYW5kbGVyKSB7CisJCWlmIChrcC0+cHJlX2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKGtwKSkgewogCQkJc2V0X2twcm9iZV9pbnN0YW5jZShrcCk7CiAJCQlpZiAoa3AtPnByZV9oYW5kbGVyKGtwLCByZWdzKSkKIAkJCQlyZXR1cm4gMTsKQEAgLTMyNiw3ICszNDMsNyBAQAogCXN0cnVjdCBrcHJvYmUgKmtwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa3AsICZwLT5saXN0LCBsaXN0KSB7Ci0JCWlmIChrcC0+cG9zdF9oYW5kbGVyKSB7CisJCWlmIChrcC0+cG9zdF9oYW5kbGVyICYmICFrcHJvYmVfZ29uZShrcCkpIHsKIAkJCXNldF9rcHJvYmVfaW5zdGFuY2Uoa3ApOwogCQkJa3AtPnBvc3RfaGFuZGxlcihrcCwgcmVncywgZmxhZ3MpOwogCQkJcmVzZXRfa3Byb2JlX2luc3RhbmNlKCk7CkBAIC0zOTMsNyArNDEwLDcgQEAKIAkJaGxpc3RfYWRkX2hlYWQoJnJpLT5obGlzdCwgaGVhZCk7CiB9CiAKLXZvaWQga3JldHByb2JlX2hhc2hfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKK3ZvaWQgX19rcHJvYmVzIGtyZXRwcm9iZV9oYXNoX2xvY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkgc3RydWN0IGhsaXN0X2hlYWQgKipoZWFkLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGhhc2ggPSBoYXNoX3B0cih0c2ssIEtQUk9CRV9IQVNIX0JJVFMpOwpAQCAtNDA0LDEzICs0MjEsMTUgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZShobGlzdF9sb2NrLCAqZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBrcmV0cHJvYmVfdGFibGVfbG9jayh1bnNpZ25lZCBsb25nIGhhc2gsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIGtyZXRwcm9iZV90YWJsZV9sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwKKwl1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAlzcGlubG9ja190ICpobGlzdF9sb2NrID0ga3JldHByb2JlX3RhYmxlX2xvY2tfcHRyKGhhc2gpOwogCXNwaW5fbG9ja19pcnFzYXZlKGhsaXN0X2xvY2ssICpmbGFncyk7CiB9CiAKLXZvaWQga3JldHByb2JlX2hhc2hfdW5sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3ZvaWQgX19rcHJvYmVzIGtyZXRwcm9iZV9oYXNoX3VubG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwl1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGhhc2ggPSBoYXNoX3B0cih0c2ssIEtQUk9CRV9IQVNIX0JJVFMpOwogCXNwaW5sb2NrX3QgKmhsaXN0X2xvY2s7CkBAIC00MTksNyArNDM4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhsaXN0X2xvY2ssICpmbGFncyk7CiB9CiAKLXZvaWQga3JldHByb2JlX3RhYmxlX3VubG9jayh1bnNpZ25lZCBsb25nIGhhc2gsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQordm9pZCBfX2twcm9iZXMga3JldHByb2JlX3RhYmxlX3VubG9jayh1bnNpZ25lZCBsb25nIGhhc2gsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXNwaW5sb2NrX3QgKmhsaXN0X2xvY2sgPSBrcmV0cHJvYmVfdGFibGVfbG9ja19wdHIoaGFzaCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShobGlzdF9sb2NrLCAqZmxhZ3MpOwpAQCAtNTI2LDkgKzU0NSwxMCBAQAogCWFwLT5hZGRyID0gcC0+YWRkcjsKIAlhcC0+cHJlX2hhbmRsZXIgPSBhZ2dyX3ByZV9oYW5kbGVyOwogCWFwLT5mYXVsdF9oYW5kbGVyID0gYWdncl9mYXVsdF9oYW5kbGVyOwotCWlmIChwLT5wb3N0X2hhbmRsZXIpCisJLyogV2UgZG9uJ3QgY2FyZSB0aGUga3Byb2JlIHdoaWNoIGhhcyBnb25lLiAqLworCWlmIChwLT5wb3N0X2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKHApKQogCQlhcC0+cG9zdF9oYW5kbGVyID0gYWdncl9wb3N0X2hhbmRsZXI7Ci0JaWYgKHAtPmJyZWFrX2hhbmRsZXIpCisJaWYgKHAtPmJyZWFrX2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKHApKQogCQlhcC0+YnJlYWtfaGFuZGxlciA9IGFnZ3JfYnJlYWtfaGFuZGxlcjsKIAogCUlOSVRfTElTVF9IRUFEKCZhcC0+bGlzdCk7CkBAIC01NDcsMTcgKzU2Nyw0MSBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCBrcHJvYmUgKmFwOwogCisJaWYgKGtwcm9iZV9nb25lKG9sZF9wKSkgeworCQkvKgorCQkgKiBBdHRlbXB0aW5nIHRvIGluc2VydCBuZXcgcHJvYmUgYXQgdGhlIHNhbWUgbG9jYXRpb24gdGhhdAorCQkgKiBoYWQgYSBwcm9iZSBpbiB0aGUgbW9kdWxlIHZhZGRyIGFyZWEgd2hpY2ggYWxyZWFkeQorCQkgKiBmcmVlZC4gU28sIHRoZSBpbnN0cnVjdGlvbiBzbG90IGhhcyBhbHJlYWR5IGJlZW4KKwkJICogcmVsZWFzZWQuIFdlIG5lZWQgYSBuZXcgc2xvdCBmb3IgdGhlIG5ldyBwcm9iZS4KKwkJICovCisJCXJldCA9IGFyY2hfcHJlcGFyZV9rcHJvYmUob2xkX3ApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAJaWYgKG9sZF9wLT5wcmVfaGFuZGxlciA9PSBhZ2dyX3ByZV9oYW5kbGVyKSB7CiAJCWNvcHlfa3Byb2JlKG9sZF9wLCBwKTsKIAkJcmV0ID0gYWRkX25ld19rcHJvYmUob2xkX3AsIHApOworCQlhcCA9IG9sZF9wOwogCX0gZWxzZSB7CiAJCWFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGtwcm9iZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIWFwKQorCQlpZiAoIWFwKSB7CisJCQlpZiAoa3Byb2JlX2dvbmUob2xkX3ApKQorCQkJCWFyY2hfcmVtb3ZlX2twcm9iZShvbGRfcCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCQlhZGRfYWdncl9rcHJvYmUoYXAsIG9sZF9wKTsKIAkJY29weV9rcHJvYmUoYXAsIHApOwogCQlyZXQgPSBhZGRfbmV3X2twcm9iZShhcCwgcCk7CiAJfQorCWlmIChrcHJvYmVfZ29uZShvbGRfcCkpIHsKKwkJLyoKKwkJICogSWYgdGhlIG9sZF9wIGhhcyBnb25lLCBpdHMgYnJlYWtwb2ludCBoYXMgYmVlbiBkaXNhcm1lZC4KKwkJICogV2UgaGF2ZSB0byBhcm0gaXQgYWdhaW4gYWZ0ZXIgcHJlcGFyaW5nIHJlYWwga3Byb2Jlcy4KKwkJICovCisJCWFwLT5mbGFncyAmPSB+S1BST0JFX0ZMQUdfR09ORTsKKwkJaWYgKGtwcm9iZV9lbmFibGVkKQorCQkJYXJjaF9hcm1fa3Byb2JlKGFwKTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjAwLDggKzY0NCw3IEBACiAJcmV0dXJuIChrcHJvYmVfb3Bjb2RlX3QgKikoKChjaGFyICopYWRkcikgKyBwLT5vZmZzZXQpOwogfQogCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBfX3JlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwLAotCXVuc2lnbmVkIGxvbmcgY2FsbGVkX2Zyb20pCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBrcHJvYmUgKm9sZF9wOwpAQCAtNjIwLDI4ICs2NjMsMzAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcC0+bW9kX3JlZmNvdW50ZWQgPSAwOwotCisJcC0+ZmxhZ3MgPSAwOwogCS8qCiAJICogQ2hlY2sgaWYgYXJlIHdlIHByb2JpbmcgYSBtb2R1bGUuCiAJICovCiAJcHJvYmVkX21vZCA9IF9fbW9kdWxlX3RleHRfYWRkcmVzcygodW5zaWduZWQgbG9uZykgcC0+YWRkcik7CiAJaWYgKHByb2JlZF9tb2QpIHsKLQkJc3RydWN0IG1vZHVsZSAqY2FsbGluZ19tb2Q7Ci0JCWNhbGxpbmdfbW9kID0gX19tb2R1bGVfdGV4dF9hZGRyZXNzKGNhbGxlZF9mcm9tKTsKIAkJLyoKLQkJICogV2UgbXVzdCBhbGxvdyBtb2R1bGVzIHRvIHByb2JlIHRoZW1zZWxmIGFuZCBpbiB0aGlzIGNhc2UKLQkJICogYXZvaWQgaW5jcmVtZW50aW5nIHRoZSBtb2R1bGUgcmVmY291bnQsIHNvIGFzIHRvIGFsbG93Ci0JCSAqIHVubG9hZGluZyBvZiBzZWxmIHByb2JpbmcgbW9kdWxlcy4KKwkJICogV2UgbXVzdCBob2xkIGEgcmVmY291bnQgb2YgdGhlIHByb2JlZCBtb2R1bGUgd2hpbGUgdXBkYXRpbmcKKwkJICogaXRzIGNvZGUgdG8gcHJvaGliaXQgdW5leHBlY3RlZCB1bmxvYWRpbmcuCiAJCSAqLwotCQlpZiAoY2FsbGluZ19tb2QgJiYgY2FsbGluZ19tb2QgIT0gcHJvYmVkX21vZCkgewotCQkJaWYgKHVubGlrZWx5KCF0cnlfbW9kdWxlX2dldChwcm9iZWRfbW9kKSkpIHsKLQkJCQlwcmVlbXB0X2VuYWJsZSgpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJcC0+bW9kX3JlZmNvdW50ZWQgPSAxOwotCQl9IGVsc2UKLQkJCXByb2JlZF9tb2QgPSBOVUxMOworCQlpZiAodW5saWtlbHkoIXRyeV9tb2R1bGVfZ2V0KHByb2JlZF9tb2QpKSkgeworCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qCisJCSAqIElmIHRoZSBtb2R1bGUgZnJlZWQgLmluaXQudGV4dCwgd2UgY291bGRuJ3QgaW5zZXJ0CisJCSAqIGtwcm9iZXMgaW4gdGhlcmUuCisJCSAqLworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KCh1bnNpZ25lZCBsb25nKXAtPmFkZHIsIHByb2JlZF9tb2QpICYmCisJCSAgICBwcm9iZWRfbW9kLT5zdGF0ZSAhPSBNT0RVTEVfU1RBVEVfQ09NSU5HKSB7CisJCQltb2R1bGVfcHV0KHByb2JlZF9tb2QpOworCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCXByZWVtcHRfZW5hYmxlKCk7CiAKQEAgLTY2OCw4ICs3MTMsOSBAQAogb3V0OgogCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKIAotCWlmIChyZXQgJiYgcHJvYmVkX21vZCkKKwlpZiAocHJvYmVkX21vZCkKIAkJbW9kdWxlX3B1dChwcm9iZWRfbW9kKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY5NywxNiArNzQzLDE2IEBACiAJICAgICBsaXN0X2lzX3Npbmd1bGFyKCZvbGRfcC0+bGlzdCkpKSB7CiAJCS8qCiAJCSAqIE9ubHkgcHJvYmUgb24gdGhlIGhhc2ggbGlzdC4gRGlzYXJtIG9ubHkgaWYga3Byb2JlcyBhcmUKLQkJICogZW5hYmxlZCAtIG90aGVyd2lzZSwgdGhlIGJyZWFrcG9pbnQgd291bGQgYWxyZWFkeSBoYXZlCi0JCSAqIGJlZW4gcmVtb3ZlZC4gV2Ugc2F2ZSBvbiBmbHVzaGluZyBpY2FjaGUuCisJCSAqIGVuYWJsZWQgYW5kIG5vdCBnb25lIC0gb3RoZXJ3aXNlLCB0aGUgYnJlYWtwb2ludCB3b3VsZAorCQkgKiBhbHJlYWR5IGhhdmUgYmVlbiByZW1vdmVkLiBXZSBzYXZlIG9uIGZsdXNoaW5nIGljYWNoZS4KIAkJICovCi0JCWlmIChrcHJvYmVfZW5hYmxlZCkKKwkJaWYgKGtwcm9iZV9lbmFibGVkICYmICFrcHJvYmVfZ29uZShvbGRfcCkpCiAJCQlhcmNoX2Rpc2FybV9rcHJvYmUocCk7CiAJCWhsaXN0X2RlbF9yY3UoJm9sZF9wLT5obGlzdCk7CiAJfSBlbHNlIHsKLQkJaWYgKHAtPmJyZWFrX2hhbmRsZXIpCisJCWlmIChwLT5icmVha19oYW5kbGVyICYmICFrcHJvYmVfZ29uZShwKSkKIAkJCW9sZF9wLT5icmVha19oYW5kbGVyID0gTlVMTDsKLQkJaWYgKHAtPnBvc3RfaGFuZGxlcikgeworCQlpZiAocC0+cG9zdF9oYW5kbGVyICYmICFrcHJvYmVfZ29uZShwKSkgewogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobGlzdF9wLCAmb2xkX3AtPmxpc3QsIGxpc3QpIHsKIAkJCQlpZiAoKGxpc3RfcCAhPSBwKSAmJiAobGlzdF9wLT5wb3N0X2hhbmRsZXIpKQogCQkJCQlnb3RvIG5vY2xlYW47CkBAIC03MjEsMzkgKzc2NywyNyBAQAogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgX191bnJlZ2lzdGVyX2twcm9iZV9ib3R0b20oc3RydWN0IGtwcm9iZSAqcCkKIHsKLQlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAJc3RydWN0IGtwcm9iZSAqb2xkX3A7CiAKLQlpZiAocC0+bW9kX3JlZmNvdW50ZWQpIHsKLQkJLyoKLQkJICogU2luY2Ugd2UndmUgYWxyZWFkeSBpbmNyZW1lbnRlZCByZWZjb3VudCwKLQkJICogd2UgZG9uJ3QgbmVlZCB0byBkaXNhYmxlIHByZWVtcHRpb24uCi0JCSAqLwotCQltb2QgPSBtb2R1bGVfdGV4dF9hZGRyZXNzKCh1bnNpZ25lZCBsb25nKXAtPmFkZHIpOwotCQlpZiAobW9kKQotCQkJbW9kdWxlX3B1dChtb2QpOwotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZwLT5saXN0KSB8fCBsaXN0X2lzX3Npbmd1bGFyKCZwLT5saXN0KSkgewotCQlpZiAoIWxpc3RfZW1wdHkoJnAtPmxpc3QpKSB7Ci0JCQkvKiAicCIgaXMgdGhlIGxhc3QgY2hpbGQgb2YgYW4gYWdncl9rcHJvYmUgKi8KLQkJCW9sZF9wID0gbGlzdF9lbnRyeShwLT5saXN0Lm5leHQsIHN0cnVjdCBrcHJvYmUsIGxpc3QpOwotCQkJbGlzdF9kZWwoJnAtPmxpc3QpOwotCQkJa2ZyZWUob2xkX3ApOwotCQl9CisJaWYgKGxpc3RfZW1wdHkoJnAtPmxpc3QpKQogCQlhcmNoX3JlbW92ZV9rcHJvYmUocCk7CisJZWxzZSBpZiAobGlzdF9pc19zaW5ndWxhcigmcC0+bGlzdCkpIHsKKwkJLyogInAiIGlzIHRoZSBsYXN0IGNoaWxkIG9mIGFuIGFnZ3Jfa3Byb2JlICovCisJCW9sZF9wID0gbGlzdF9lbnRyeShwLT5saXN0Lm5leHQsIHN0cnVjdCBrcHJvYmUsIGxpc3QpOworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCWFyY2hfcmVtb3ZlX2twcm9iZShvbGRfcCk7CisJCWtmcmVlKG9sZF9wKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19yZWdpc3Rlcl9rcHJvYmVzKHN0cnVjdCBrcHJvYmUgKiprcHMsIGludCBudW0sCi0JdW5zaWduZWQgbG9uZyBjYWxsZWRfZnJvbSkKK2ludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlcyhzdHJ1Y3Qga3Byb2JlICoqa3BzLCBpbnQgbnVtKQogewogCWludCBpLCByZXQgPSAwOwogCiAJaWYgKG51bSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcmV0ID0gX19yZWdpc3Rlcl9rcHJvYmUoa3BzW2ldLCBjYWxsZWRfZnJvbSk7CisJCXJldCA9IHJlZ2lzdGVyX2twcm9iZShrcHNbaV0pOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKGkgPiAwKQogCQkJCXVucmVnaXN0ZXJfa3Byb2JlcyhrcHMsIGkpOwpAQCAtNzYzLDI2ICs3OTcsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogUmVnaXN0cmF0aW9uIGFuZCB1bnJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMgZm9yIGtwcm9iZS4KLSAqLwotaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKLXsKLQlyZXR1cm4gX19yZWdpc3Rlcl9rcHJvYmVzKCZwLCAxLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLX0KLQogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1bnJlZ2lzdGVyX2twcm9iZXMoJnAsIDEpOwogfQogCi1pbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2twcm9iZXMoc3RydWN0IGtwcm9iZSAqKmtwcywgaW50IG51bSkKLXsKLQlyZXR1cm4gX19yZWdpc3Rlcl9rcHJvYmVzKGtwcywgbnVtLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLX0KLQogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcHJvYmVzKHN0cnVjdCBrcHJvYmUgKiprcHMsIGludCBudW0pCiB7CiAJaW50IGk7CkBAIC04MTEsOCArODMwLDcgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZW50cnk7CiB9CiAKLXN0YXRpYyBpbnQgX19yZWdpc3Rlcl9qcHJvYmVzKHN0cnVjdCBqcHJvYmUgKipqcHMsIGludCBudW0sCi0JdW5zaWduZWQgbG9uZyBjYWxsZWRfZnJvbSkKK2ludCBfX2twcm9iZXMgcmVnaXN0ZXJfanByb2JlcyhzdHJ1Y3QganByb2JlICoqanBzLCBpbnQgbnVtKQogewogCXN0cnVjdCBqcHJvYmUgKmpwOwogCWludCByZXQgPSAwLCBpOwpAQCAtODMwLDcgKzg0OCw3IEBACiAJCQkvKiBUb2RvOiBWZXJpZnkgcHJvYmVwb2ludCBpcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50ICovCiAJCQlqcC0+a3AucHJlX2hhbmRsZXIgPSBzZXRqbXBfcHJlX2hhbmRsZXI7CiAJCQlqcC0+a3AuYnJlYWtfaGFuZGxlciA9IGxvbmdqbXBfYnJlYWtfaGFuZGxlcjsKLQkJCXJldCA9IF9fcmVnaXN0ZXJfa3Byb2JlKCZqcC0+a3AsIGNhbGxlZF9mcm9tKTsKKwkJCXJldCA9IHJlZ2lzdGVyX2twcm9iZSgmanAtPmtwKTsKIAkJfQogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKGkgPiAwKQpAQCAtODQzLDggKzg2MSw3IEBACiAKIGludCBfX2twcm9iZXMgcmVnaXN0ZXJfanByb2JlKHN0cnVjdCBqcHJvYmUgKmpwKQogewotCXJldHVybiBfX3JlZ2lzdGVyX2pwcm9iZXMoJmpwLCAxLAotCQkodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCXJldHVybiByZWdpc3Rlcl9qcHJvYmVzKCZqcCwgMSk7CiB9CiAKIHZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfanByb2JlKHN0cnVjdCBqcHJvYmUgKmpwKQpAQCAtODUyLDEyICs4NjksNiBAQAogCXVucmVnaXN0ZXJfanByb2JlcygmanAsIDEpOwogfQogCi1pbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2pwcm9iZXMoc3RydWN0IGpwcm9iZSAqKmpwcywgaW50IG51bSkKLXsKLQlyZXR1cm4gX19yZWdpc3Rlcl9qcHJvYmVzKGpwcywgbnVtLAotCQkodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2pwcm9iZXMoc3RydWN0IGpwcm9iZSAqKmpwcywgaW50IG51bSkKIHsKIAlpbnQgaTsKQEAgLTkyMCw4ICs5MzEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBfX3JlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwKLQkJCQkJICB1bnNpZ25lZCBsb25nIGNhbGxlZF9mcm9tKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqaW5zdDsKQEAgLTk2NywyMSArOTc3LDIwIEBACiAKIAlycC0+bm1pc3NlZCA9IDA7CiAJLyogRXN0YWJsaXNoIGZ1bmN0aW9uIGVudHJ5IHByb2JlIHBvaW50ICovCi0JcmV0ID0gX19yZWdpc3Rlcl9rcHJvYmUoJnJwLT5rcCwgY2FsbGVkX2Zyb20pOworCXJldCA9IHJlZ2lzdGVyX2twcm9iZSgmcnAtPmtwKTsKIAlpZiAocmV0ICE9IDApCiAJCWZyZWVfcnBfaW5zdChycCk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX3JlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSwKLQl1bnNpZ25lZCBsb25nIGNhbGxlZF9mcm9tKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcmV0cHJvYmVzKHN0cnVjdCBrcmV0cHJvYmUgKipycHMsIGludCBudW0pCiB7CiAJaW50IHJldCA9IDAsIGk7CiAKIAlpZiAobnVtIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlyZXQgPSBfX3JlZ2lzdGVyX2tyZXRwcm9iZShycHNbaV0sIGNhbGxlZF9mcm9tKTsKKwkJcmV0ID0gcmVnaXN0ZXJfa3JldHByb2JlKHJwc1tpXSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAoaSA+IDApCiAJCQkJdW5yZWdpc3Rlcl9rcmV0cHJvYmVzKHJwcywgaSk7CkBAIC05OTEsMjMgKzEwMDAsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKLXsKLQlyZXR1cm4gX19yZWdpc3Rlcl9rcmV0cHJvYmVzKCZycCwgMSwKLQkJCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci19Ci0KIHZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQogewogCXVucmVnaXN0ZXJfa3JldHByb2JlcygmcnAsIDEpOwogfQogCi1pbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSkKLXsKLQlyZXR1cm4gX19yZWdpc3Rlcl9rcmV0cHJvYmVzKHJwcywgbnVtLAotCQkJKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLX0KLQogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcmV0cHJvYmVzKHN0cnVjdCBrcmV0cHJvYmUgKipycHMsIGludCBudW0pCiB7CiAJaW50IGk7CkBAIC0xMDU1LDYgKzEwNTIsNzIgQEAKIAogI2VuZGlmIC8qIENPTkZJR19LUkVUUFJPQkVTICovCiAKKy8qIFNldCB0aGUga3Byb2JlIGdvbmUgYW5kIHJlbW92ZSBpdHMgaW5zdHJ1Y3Rpb24gYnVmZmVyLiAqLworc3RhdGljIHZvaWQgX19rcHJvYmVzIGtpbGxfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7CisJc3RydWN0IGtwcm9iZSAqa3A7CisJcC0+ZmxhZ3MgfD0gS1BST0JFX0ZMQUdfR09ORTsKKwlpZiAocC0+cHJlX2hhbmRsZXIgPT0gYWdncl9wcmVfaGFuZGxlcikgeworCQkvKgorCQkgKiBJZiB0aGlzIGlzIGFuIGFnZ3Jfa3Byb2JlLCB3ZSBoYXZlIHRvIGxpc3QgYWxsIHRoZQorCQkgKiBjaGFpbmVkIHByb2JlcyBhbmQgbWFyayB0aGVtIEdPTkUuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShrcCwgJnAtPmxpc3QsIGxpc3QpCisJCQlrcC0+ZmxhZ3MgfD0gS1BST0JFX0ZMQUdfR09ORTsKKwkJcC0+cG9zdF9oYW5kbGVyID0gTlVMTDsKKwkJcC0+YnJlYWtfaGFuZGxlciA9IE5VTEw7CisJfQorCS8qCisJICogSGVyZSwgd2UgY2FuIHJlbW92ZSBpbnNuX3Nsb3Qgc2FmZWx5LCBiZWNhdXNlIG5vIHRocmVhZCBjYWxscworCSAqIHRoZSBvcmlnaW5hbCBwcm9iZWQgZnVuY3Rpb24gKHdoaWNoIHdpbGwgYmUgZnJlZWQgc29vbikgYW55IG1vcmUuCisJICovCisJYXJjaF9yZW1vdmVfa3Byb2JlKHApOworfQorCisvKiBNb2R1bGUgbm90aWZpZXIgY2FsbCBiYWNrLCBjaGVja2luZyBrcHJvYmVzIG9uIHRoZSBtb2R1bGUgKi8KK3N0YXRpYyBpbnQgX19rcHJvYmVzIGtwcm9iZXNfbW9kdWxlX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kID0gZGF0YTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qga3Byb2JlICpwOworCXVuc2lnbmVkIGludCBpOworCWludCBjaGVja2NvcmUgPSAodmFsID09IE1PRFVMRV9TVEFURV9HT0lORyk7CisKKwlpZiAodmFsICE9IE1PRFVMRV9TVEFURV9HT0lORyAmJiB2YWwgIT0gTU9EVUxFX1NUQVRFX0xJVkUpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qCisJICogV2hlbiBNT0RVTEVfU1RBVEVfR09JTkcgd2FzIG5vdGlmaWVkLCBib3RoIG9mIG1vZHVsZSAudGV4dCBhbmQKKwkgKiAuaW5pdC50ZXh0IHNlY3Rpb25zIHdvdWxkIGJlIGZyZWVkLiBXaGVuIE1PRFVMRV9TVEFURV9MSVZFIHdhcworCSAqIG5vdGlmaWVkLCBvbmx5IC5pbml0LnRleHQgc2VjdGlvbiB3b3VsZCBiZSBmcmVlZC4gV2UgbmVlZCB0bworCSAqIGRpc2FibGUga3Byb2JlcyB3aGljaCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIHNlY3Rpb25zLgorCSAqLworCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IEtQUk9CRV9UQUJMRV9TSVpFOyBpKyspIHsKKwkJaGVhZCA9ICZrcHJvYmVfdGFibGVbaV07CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCBub2RlLCBoZWFkLCBobGlzdCkKKwkJCWlmICh3aXRoaW5fbW9kdWxlX2luaXQoKHVuc2lnbmVkIGxvbmcpcC0+YWRkciwgbW9kKSB8fAorCQkJICAgIChjaGVja2NvcmUgJiYKKwkJCSAgICAgd2l0aGluX21vZHVsZV9jb3JlKCh1bnNpZ25lZCBsb25nKXAtPmFkZHIsIG1vZCkpKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgdmFkZHIgdGhpcyBwcm9iZSBpcyBpbnN0YWxsZWQgd2lsbCBzb29uCisJCQkJICogYmUgdmZyZWVkIGJ1eSBub3Qgc3luY2VkIHRvIGRpc2suIEhlbmNlLAorCQkJCSAqIGRpc2FybWluZyB0aGUgYnJlYWtwb2ludCBpc24ndCBuZWVkZWQuCisJCQkJICovCisJCQkJa2lsbF9rcHJvYmUocCk7CisJCQl9CisJfQorCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3Byb2JlX21vZHVsZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGtwcm9iZXNfbW9kdWxlX2NhbGxiYWNrLAorCS5wcmlvcml0eSA9IDAKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfa3Byb2Jlcyh2b2lkKQogewogCWludCBpLCBlcnIgPSAwOwpAQCAtMTExMSw2ICsxMTc0LDkgQEAKIAllcnIgPSBhcmNoX2luaXRfa3Byb2JlcygpOwogCWlmICghZXJyKQogCQllcnIgPSByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmtwcm9iZV9leGNlcHRpb25zX25iKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZrcHJvYmVfbW9kdWxlX25iKTsKKwogCWtwcm9iZXNfaW5pdGlhbGl6ZWQgPSAoZXJyID09IDApOwogCiAJaWYgKCFlcnIpCkBAIC0xMTMxLDEwICsxMTk3LDEyIEBACiAJZWxzZQogCQlrcHJvYmVfdHlwZSA9ICJrIjsKIAlpZiAoc3ltKQotCQlzZXFfcHJpbnRmKHBpLCAiJXAgICVzICAlcysweCV4ICAlc1xuIiwgcC0+YWRkciwga3Byb2JlX3R5cGUsCi0JCQlzeW0sIG9mZnNldCwgKG1vZG5hbWUgPyBtb2RuYW1lIDogIiAiKSk7CisJCXNlcV9wcmludGYocGksICIlcCAgJXMgICVzKzB4JXggICVzICVzXG4iLCBwLT5hZGRyLCBrcHJvYmVfdHlwZSwKKwkJCXN5bSwgb2Zmc2V0LCAobW9kbmFtZSA/IG1vZG5hbWUgOiAiICIpLAorCQkJKGtwcm9iZV9nb25lKHApID8gIltHT05FXSIgOiAiIikpOwogCWVsc2UKLQkJc2VxX3ByaW50ZihwaSwgIiVwICAlcyAgJXBcbiIsIHAtPmFkZHIsIGtwcm9iZV90eXBlLCBwLT5hZGRyKTsKKwkJc2VxX3ByaW50ZihwaSwgIiVwICAlcyAgJXAgJXNcbiIsIHAtPmFkZHIsIGtwcm9iZV90eXBlLCBwLT5hZGRyLAorCQkJKGtwcm9iZV9nb25lKHApID8gIltHT05FXSIgOiAiIikpOwogfQogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgKmtwcm9iZV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpmLCBsb2ZmX3QgKnBvcykKQEAgLTEyMTUsNyArMTI4Myw4IEBACiAJZm9yIChpID0gMDsgaSA8IEtQUk9CRV9UQUJMRV9TSVpFOyBpKyspIHsKIAkJaGVhZCA9ICZrcHJvYmVfdGFibGVbaV07CiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCBub2RlLCBoZWFkLCBobGlzdCkKLQkJCWFyY2hfYXJtX2twcm9iZShwKTsKKwkJCWlmICgha3Byb2JlX2dvbmUocCkpCisJCQkJYXJjaF9hcm1fa3Byb2JlKHApOwogCX0KIAogCWtwcm9iZV9lbmFibGVkID0gdHJ1ZTsKQEAgLTEyNDQsNyArMTMxMyw3IEBACiAJZm9yIChpID0gMDsgaSA8IEtQUk9CRV9UQUJMRV9TSVpFOyBpKyspIHsKIAkJaGVhZCA9ICZrcHJvYmVfdGFibGVbaV07CiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCBub2RlLCBoZWFkLCBobGlzdCkgewotCQkJaWYgKCFhcmNoX3RyYW1wb2xpbmVfa3Byb2JlKHApKQorCQkJaWYgKCFhcmNoX3RyYW1wb2xpbmVfa3Byb2JlKHApICYmICFrcHJvYmVfZ29uZShwKSkKIAkJCQlhcmNoX2Rpc2FybV9rcHJvYmUocCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwva3N5c2ZzLmMgYi9rZXJuZWwva3N5c2ZzLmMKaW5kZXggMDhkZDhlZC4uNTI4ZGQ3OCAxMDA2NDQKLS0tIGEva2VybmVsL2tzeXNmcy5jCisrKyBiL2tlcm5lbC9rc3lzZnMuYwpAQCAtMjQsNyArMjQsNyBAQAogc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBfbmFtZSMjX2F0dHIgPSBcCiAJX19BVFRSKF9uYW1lLCAwNjQ0LCBfbmFtZSMjX3Nob3csIF9uYW1lIyNfc3RvcmUpCiAKLSNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKSAmJiBkZWZpbmVkKENPTkZJR19ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfSE9UUExVRykKIC8qIGN1cnJlbnQgdWV2ZW50IHNlcXVlbmNlIG51bWJlciAqLwogc3RhdGljIHNzaXplX3QgdWV2ZW50X3NlcW51bV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0xMzcsNyArMTM3LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGtlcm5lbF9rb2JqKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBrZXJuZWxfYXR0cnNbXSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKSAmJiBkZWZpbmVkKENPTkZJR19ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfSE9UUExVRykKIAkmdWV2ZW50X3NlcW51bV9hdHRyLmF0dHIsCiAJJnVldmVudF9oZWxwZXJfYXR0ci5hdHRyLAogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZjQ3Y2NlOS4uNDk2ZGNiNSAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvdW53aW5kLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTE0NDksOCArMTQ0OCw2IEBACiAJcmVtb3ZlX3NlY3RfYXR0cnMobW9kKTsKIAltb2Rfa29iamVjdF9yZW1vdmUobW9kKTsKIAotCXVud2luZF9yZW1vdmVfdGFibGUobW9kLT51bndpbmRfaW5mbywgMCk7Ci0KIAkvKiBBcmNoLXNwZWNpZmljIGNsZWFudXAuICovCiAJbW9kdWxlX2FyY2hfY2xlYW51cChtb2QpOwogCkBAIC0xODY3LDcgKzE4NjQsNiBAQAogCXVuc2lnbmVkIGludCBzeW1pbmRleCA9IDA7CiAJdW5zaWduZWQgaW50IHN0cmluZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgbW9kaW5kZXgsIHZlcnNpbmRleCwgaW5mb2luZGV4LCBwY3B1aW5kZXg7Ci0JdW5zaWduZWQgaW50IHVud2luZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgbnVtX2twLCBudW1fbWNvdW50OwogCXN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwOwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKQEAgLTE5NTcsOSArMTk1Myw2IEBACiAJdmVyc2luZGV4ID0gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiX192ZXJzaW9ucyIpOwogCWluZm9pbmRleCA9IGZpbmRfc2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgIi5tb2RpbmZvIik7CiAJcGNwdWluZGV4ID0gZmluZF9wY3B1c2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncyk7Ci0jaWZkZWYgQVJDSF9VTldJTkRfU0VDVElPTl9OQU1FCi0JdW53aW5kZXggPSBmaW5kX3NlYyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsIEFSQ0hfVU5XSU5EX1NFQ1RJT05fTkFNRSk7Ci0jZW5kaWYKIAogCS8qIERvbid0IGtlZXAgbW9kaW5mbyBhbmQgdmVyc2lvbiBzZWN0aW9ucy4gKi8KIAlzZWNoZHJzW2luZm9pbmRleF0uc2hfZmxhZ3MgJj0gfih1bnNpZ25lZCBsb25nKVNIRl9BTExPQzsKQEAgLTE5NjksOCArMTk2Miw2IEBACiAJc2VjaGRyc1tzeW1pbmRleF0uc2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwogCXNlY2hkcnNbc3RyaW5kZXhdLnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKICNlbmRpZgotCWlmICh1bndpbmRleCkKLQkJc2VjaGRyc1t1bndpbmRleF0uc2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwogCiAJLyogQ2hlY2sgbW9kdWxlIHN0cnVjdCB2ZXJzaW9uIG5vdywgYmVmb3JlIHdlIHRyeSB0byB1c2UgbW9kdWxlLiAqLwogCWlmICghY2hlY2tfbW9kc3RydWN0X3ZlcnNpb24oc2VjaGRycywgdmVyc2luZGV4LCBtb2QpKSB7CkBAIC0yMjY3LDExICsyMjU4LDYgQEAKIAlhZGRfc2VjdF9hdHRycyhtb2QsIGhkci0+ZV9zaG51bSwgc2Vjc3RyaW5ncywgc2VjaGRycyk7CiAJYWRkX25vdGVzX2F0dHJzKG1vZCwgaGRyLT5lX3NobnVtLCBzZWNzdHJpbmdzLCBzZWNoZHJzKTsKIAotCS8qIFNpemUgb2Ygc2VjdGlvbiAwIGlzIDAsIHNvIHRoaXMgd29ya3Mgd2VsbCBpZiBubyB1bndpbmQgaW5mby4gKi8KLQltb2QtPnVud2luZF9pbmZvID0gdW53aW5kX2FkZF90YWJsZShtb2QsCi0JCQkJCSAgICAodm9pZCAqKXNlY2hkcnNbdW53aW5kZXhdLnNoX2FkZHIsCi0JCQkJCSAgICBzZWNoZHJzW3Vud2luZGV4XS5zaF9zaXplKTsKLQogCS8qIEdldCByaWQgb2YgdGVtcG9yYXJ5IGNvcHkgKi8KIAl2ZnJlZShoZHIpOwogCkBAIC0yMzY2LDExICsyMzUyLDEyIEBACiAJLyogTm93IGl0J3MgYSBmaXJzdCBjbGFzcyBjaXRpemVuISAgV2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3IgaXQuICovCiAJbW9kLT5zdGF0ZSA9IE1PRFVMRV9TVEFURV9MSVZFOwogCXdha2VfdXAoJm1vZHVsZV93cSk7CisJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmbW9kdWxlX25vdGlmeV9saXN0LAorCQkJCSAgICAgTU9EVUxFX1NUQVRFX0xJVkUsIG1vZCk7CiAKIAltdXRleF9sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCS8qIERyb3AgaW5pdGlhbCByZWZlcmVuY2UuICovCiAJbW9kdWxlX3B1dChtb2QpOwotCXVud2luZF9yZW1vdmVfdGFibGUobW9kLT51bndpbmRfaW5mbywgMSk7CiAJbW9kdWxlX2ZyZWUobW9kLCBtb2QtPm1vZHVsZV9pbml0KTsKIAltb2QtPm1vZHVsZV9pbml0ID0gTlVMTDsKIAltb2QtPmluaXRfc2l6ZSA9IDA7CkBAIC0yNDA1LDcgKzIzOTIsNyBAQAogCXVuc2lnbmVkIGxvbmcgbmV4dHZhbDsKIAogCS8qIEF0IHdvcnNlLCBuZXh0IHZhbHVlIGlzIGF0IGVuZCBvZiBtb2R1bGUgKi8KLQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSkKKwlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkpCiAJCW5leHR2YWwgPSAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0K21vZC0+aW5pdF90ZXh0X3NpemU7CiAJZWxzZQogCQluZXh0dmFsID0gKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfY29yZSttb2QtPmNvcmVfdGV4dF9zaXplOwpAQCAtMjQ1Myw4ICsyNDQwLDggQEAKIAogCXByZWVtcHRfZGlzYWJsZSgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKLQkJaWYgKHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9pbml0LCBtb2QtPmluaXRfc2l6ZSkKLQkJICAgIHx8IHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSkpIHsKKwkJaWYgKHdpdGhpbl9tb2R1bGVfaW5pdChhZGRyLCBtb2QpIHx8CisJCSAgICB3aXRoaW5fbW9kdWxlX2NvcmUoYWRkciwgbW9kKSkgewogCQkJaWYgKG1vZG5hbWUpCiAJCQkJKm1vZG5hbWUgPSBtb2QtPm5hbWU7CiAJCQlyZXQgPSBnZXRfa3N5bWJvbChtb2QsIGFkZHIsIHNpemUsIG9mZnNldCk7CkBAIC0yNDc2LDggKzI0NjMsOCBAQAogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlzdCkgewotCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSB8fAotCQkgICAgd2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgeworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkgfHwKKwkJICAgIHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQljb25zdCBjaGFyICpzeW07CiAKIAkJCXN5bSA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgTlVMTCwgTlVMTCk7CkBAIC0yNTAwLDggKzI0ODcsOCBAQAogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlzdCkgewotCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSB8fAotCQkgICAgd2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgeworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkgfHwKKwkJICAgIHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQljb25zdCBjaGFyICpzeW07CiAKIAkJCXN5bSA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgc2l6ZSwgb2Zmc2V0KTsKQEAgLTI3MjAsNyArMjcwNyw3IEBACiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShtb2QsICZtb2R1bGVzLCBsaXN0KSB7Ci0JCWlmICh3aXRoaW4oYWRkciwgbW9kLT5tb2R1bGVfY29yZSwgbW9kLT5jb3JlX3NpemUpKSB7CisJCWlmICh3aXRoaW5fbW9kdWxlX2NvcmUoYWRkciwgbW9kKSkgewogCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCXJldHVybiAxOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvcGFuaWMuYyBiL2tlcm5lbC9wYW5pYy5jCmluZGV4IDEzZjA2MzQuLjJhMmZmMzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYW5pYy5jCisrKyBiL2tlcm5lbC9wYW5pYy5jCkBAIC0yOTksNiArMjk5LDggQEAKIHsKIAlpZiAoIW9vcHNfaWQpCiAJCWdldF9yYW5kb21fYnl0ZXMoJm9vcHNfaWQsIHNpemVvZihvb3BzX2lkKSk7CisJZWxzZQorCQlvb3BzX2lkKys7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDYxM2YxNjkuLjIzOTk4ODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJLyogdGhpcyBtYXkgZmFpbCBpZiB0aGUgUlRDIGhhc24ndCBiZWVuIGluaXRpYWxpemVkICovCiAJc3RhdHVzID0gcnRjX3JlYWRfdGltZShydGMsICZhbG0udGltZSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJcHJpbnRrKGVycl9yZWFkdGltZSwgcnRjLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlwcmludGsoZXJyX3JlYWR0aW1lLCBkZXZfbmFtZSgmcnRjLT5kZXYpLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCXJ0Y190bV90b190aW1lKCZhbG0udGltZSwgJm5vdyk7CkBAIC02MjYsNyArNjI2LDcgQEAKIAogCXN0YXR1cyA9IHJ0Y19zZXRfYWxhcm0ocnRjLCAmYWxtKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlwcmludGsoZXJyX3dha2VhbGFybSwgcnRjLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlwcmludGsoZXJyX3dha2VhbGFybSwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjYwLDcgKzY2MCw3IEBACiAJaWYgKCFkZXZpY2VfbWF5X3dha2V1cChjYW5kaWRhdGUtPmRldi5wYXJlbnQpKQogCQlyZXR1cm4gMDsKIAotCSooY2hhciAqKiluYW1lX3B0ciA9IGRldi0+YnVzX2lkOworCSooY29uc3QgY2hhciAqKiluYW1lX3B0ciA9IGRldl9uYW1lKGRldik7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcm9maWxlLmMgYi9rZXJuZWwvcHJvZmlsZS5jCmluZGV4IGQxOGUyZDIuLjc4NDkzM2FjIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTQ0NSw3ICs0NDUsNiBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiBzdGF0aWMgaW50IHByb2ZfY3B1X21hc2tfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4ZTk1ODU1Li4zMTUyYWMzIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC04NTgsNyArODU4LDggQEAKIAkJCXEtPmluZm8uc2lfc2lnbm8gPSBzaWc7CiAJCQlxLT5pbmZvLnNpX2Vycm5vID0gMDsKIAkJCXEtPmluZm8uc2lfY29kZSA9IFNJX1VTRVI7Ci0JCQlxLT5pbmZvLnNpX3BpZCA9IHRhc2tfcGlkX3ZucihjdXJyZW50KTsKKwkJCXEtPmluZm8uc2lfcGlkID0gdGFza190Z2lkX25yX25zKGN1cnJlbnQsCisJCQkJCQkJdGFza19hY3RpdmVfcGlkX25zKHQpKTsKIAkJCXEtPmluZm8uc2lfdWlkID0gY3VycmVudF91aWQoKTsKIAkJCWJyZWFrOwogCQljYXNlICh1bnNpZ25lZCBsb25nKSBTRU5EX1NJR19QUklWOgpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IGQzNTZkNzkuLjRhNDM2MTdjIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CkBAIC05MjcsNiArOTI4LDcgQEAKIAkJaWYgKGNvcHlfdG9fdXNlcih0YnVmLCAmdG1wLCBzaXplb2Yoc3RydWN0IHRtcykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gKGxvbmcpIGppZmZpZXNfNjRfdG9fY2xvY2tfdChnZXRfamlmZmllc182NCgpKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IGZmNmQ0NWMuLjkyZjZlNWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTg3LDEwICs4Nyw2IEBACiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUICovCiAKIC8qIENvbnN0YW50cyB1c2VkIGZvciBtaW5pbXVtIGFuZCAgbWF4aW11bSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pIHx8IGRlZmluZWQoQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQKQotc3RhdGljIGludCBvbmUgPSAxOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAKIHN0YXRpYyBpbnQgc2l4dHkgPSA2MDsKIHN0YXRpYyBpbnQgbmVnX29uZSA9IC0xOwpAQCAtMTAxLDYgKzk3LDcgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50IHplcm87CitzdGF0aWMgaW50IG9uZSA9IDE7CiBzdGF0aWMgaW50IG9uZV9odW5kcmVkID0gMTAwOwogCiAvKiB0aGlzIGlzIG5lZWRlZCBmb3IgdGhlIHByb2NfZG9pbnR2ZWNfbWlubWF4IGZvciBbZnNfXW92ZXJmbG93IFVJRCBhbmQgR0lEICovCkBAIC05NTIsMTIgKzk0OSwyMiBAQAogCQkuZGF0YQkJPSAmZGlydHlfYmFja2dyb3VuZF9yYXRpbywKIAkJLm1heGxlbgkJPSBzaXplb2YoZGlydHlfYmFja2dyb3VuZF9yYXRpbyksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5wcm9jX2hhbmRsZXIJPSAmZGlydHlfYmFja2dyb3VuZF9yYXRpb19oYW5kbGVyLAogCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKIAkJLmV4dHJhMQkJPSAmemVybywKIAkJLmV4dHJhMgkJPSAmb25lX2h1bmRyZWQsCiAJfSwKIAl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAiZGlydHlfYmFja2dyb3VuZF9ieXRlcyIsCisJCS5kYXRhCQk9ICZkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzLAorCQkubWF4bGVuCQk9IHNpemVvZihkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzX2hhbmRsZXIsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZvbmUsCisJfSwKKwl7CiAJCS5jdGxfbmFtZQk9IFZNX0RJUlRZX1JBVElPLAogCQkucHJvY25hbWUJPSAiZGlydHlfcmF0aW8iLAogCQkuZGF0YQkJPSAmdm1fZGlydHlfcmF0aW8sCkBAIC05NjksNiArOTc2LDE2IEBACiAJCS5leHRyYTIJCT0gJm9uZV9odW5kcmVkLAogCX0sCiAJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gImRpcnR5X2J5dGVzIiwKKwkJLmRhdGEJCT0gJnZtX2RpcnR5X2J5dGVzLAorCQkubWF4bGVuCQk9IHNpemVvZih2bV9kaXJ0eV9ieXRlcyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmZGlydHlfYnl0ZXNfaGFuZGxlciwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm9uZSwKKwl9LAorCXsKIAkJLnByb2NuYW1lCT0gImRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MiLAogCQkuZGF0YQkJPSAmZGlydHlfd3JpdGViYWNrX2ludGVydmFsLAogCQkubWF4bGVuCQk9IHNpemVvZihkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWwpLApkaWZmIC0tZ2l0IGEva2VybmVsL3Rlc3Rfa3Byb2Jlcy5jIGIva2VybmVsL3Rlc3Rfa3Byb2Jlcy5jCmluZGV4IDA2YjYzOTUuLjRmMTA0NTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90ZXN0X2twcm9iZXMuYworKysgYi9rZXJuZWwvdGVzdF9rcHJvYmVzLmMKQEAgLTIyLDIxICsyMiwxMSBAQAogCiBzdGF0aWMgdTMyIHJhbmQxLCBwcmVoX3ZhbCwgcG9zdGhfdmFsLCBqcGhfdmFsOwogc3RhdGljIGludCBlcnJvcnMsIGhhbmRsZXJfZXJyb3JzLCBudW1fdGVzdHM7CitzdGF0aWMgdTMyICgqdGFyZ2V0KSh1MzIgdmFsdWUpOworc3RhdGljIHUzMiAoKnRhcmdldDIpKHUzMiB2YWx1ZSk7CiAKIHN0YXRpYyBub2lubGluZSB1MzIga3Byb2JlX3RhcmdldCh1MzIgdmFsdWUpCiB7Ci0JLyoKLQkgKiBnY2MgaWdub3JlcyBub2lubGluZSBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdW5sZXNzIHdlIHN0dWZmCi0JICogc3VmZmljaWVudCBsYXJkIGludG8gdGhlIGZ1bmN0aW9uLiBUaGUgZ2V0X2twcm9iZSgpIGhlcmUgaXMKLQkgKiBqdXN0IGZvciB0aGF0LgotCSAqCi0JICogTk9URTogV2UgYXJlbid0IGNvbmNlcm5lZCBhYm91dCB0aGUgY29ycmVjdG5lc3Mgb2YgZ2V0X2twcm9iZSgpCi0JICogaGVyZTsgaGVuY2UsIHRoaXMgY2FsbCBpcyBuZWl0aGVyIHVuZGVyICFwcmVlbXB0IG5vciB3aXRoIHRoZQotCSAqIGtwcm9iZV9tdXRleCBoZWxkLiBUaGlzIGlzIGZpbmUodG0pCi0JICovCi0JaWYgKGdldF9rcHJvYmUoKHZvaWQgKikweGRlYWRiZWVmKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiS3Byb2JlIHNtb2tlIHRlc3Q6IHByb2JlIG9uIDB4ZGVhZGJlZWYhXG4iKTsKLQogCXJldHVybiAodmFsdWUgLyBkaXZfZmFjdG9yKTsKIH0KIApAQCAtNzQsNyArNjQsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGtwcm9iZV90YXJnZXQocmFuZDEpOworCXJldCA9IHRhcmdldChyYW5kMSk7CiAJdW5yZWdpc3Rlcl9rcHJvYmUoJmtwKTsKIAogCWlmIChwcmVoX3ZhbCA9PSAwKSB7CkBAIC05Miw2ICs4Miw4NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgbm9pbmxpbmUgdTMyIGtwcm9iZV90YXJnZXQyKHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gKHZhbHVlIC8gZGl2X2ZhY3RvcikgKyAxOworfQorCitzdGF0aWMgaW50IGtwX3ByZV9oYW5kbGVyMihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmVoX3ZhbCA9IChyYW5kMSAvIGRpdl9mYWN0b3IpICsgMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQga3BfcG9zdF9oYW5kbGVyMihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpZiAocHJlaF92YWwgIT0gKHJhbmQxIC8gZGl2X2ZhY3RvcikgKyAxKSB7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImluY29ycmVjdCB2YWx1ZSBpbiBwb3N0X2hhbmRsZXIyXG4iKTsKKwl9CisJcG9zdGhfdmFsID0gcHJlaF92YWwgKyBkaXZfZmFjdG9yOworfQorCitzdGF0aWMgc3RydWN0IGtwcm9iZSBrcDIgPSB7CisJLnN5bWJvbF9uYW1lID0gImtwcm9iZV90YXJnZXQyIiwKKwkucHJlX2hhbmRsZXIgPSBrcF9wcmVfaGFuZGxlcjIsCisJLnBvc3RfaGFuZGxlciA9IGtwX3Bvc3RfaGFuZGxlcjIKK307CisKK3N0YXRpYyBpbnQgdGVzdF9rcHJvYmVzKHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qga3Byb2JlICprcHNbMl0gPSB7JmtwLCAma3AyfTsKKworCWtwLmFkZHIgPSAwOyAvKiBhZGRyIHNob3VsZCBiZSBjbGVhcmQgZm9yIHJldXNpbmcga3Byb2JlLiAqLworCXJldCA9IHJlZ2lzdGVyX2twcm9iZXMoa3BzLCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJyZWdpc3Rlcl9rcHJvYmVzIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByZWhfdmFsID0gMDsKKwlwb3N0aF92YWwgPSAwOworCXJldCA9IHRhcmdldChyYW5kMSk7CisKKwlpZiAocHJlaF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcHJvYmUgcHJlX2hhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJaWYgKHBvc3RoX3ZhbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImtwcm9iZSBwb3N0X2hhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJcHJlaF92YWwgPSAwOworCXBvc3RoX3ZhbCA9IDA7CisJcmV0ID0gdGFyZ2V0MihyYW5kMSk7CisKKwlpZiAocHJlaF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcHJvYmUgcHJlX2hhbmRsZXIyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKworCWlmIChwb3N0aF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcHJvYmUgcG9zdF9oYW5kbGVyMiBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisKKwl1bnJlZ2lzdGVyX2twcm9iZXMoa3BzLCAyKTsKKwlyZXR1cm4gMDsKKworfQorCiBzdGF0aWMgdTMyIGpfa3Byb2JlX3RhcmdldCh1MzIgdmFsdWUpCiB7CiAJaWYgKHZhbHVlICE9IHJhbmQxKSB7CkBAIC0xMjEsNyArMTg5LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBrcHJvYmVfdGFyZ2V0KHJhbmQxKTsKKwlyZXQgPSB0YXJnZXQocmFuZDEpOwogCXVucmVnaXN0ZXJfanByb2JlKCZqcCk7CiAJaWYgKGpwaF92YWwgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgpAQCAtMTMyLDYgKzIwMCw0MyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGpwcm9iZSBqcDIgPSB7CisJLmVudHJ5ICAgICAgICAgID0gal9rcHJvYmVfdGFyZ2V0LAorCS5rcC5zeW1ib2xfbmFtZSA9ICJrcHJvYmVfdGFyZ2V0MiIKK307CisKK3N0YXRpYyBpbnQgdGVzdF9qcHJvYmVzKHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QganByb2JlICpqcHNbMl0gPSB7JmpwLCAmanAyfTsKKworCWpwLmtwLmFkZHIgPSAwOyAvKiBhZGRyIHNob3VsZCBiZSBjbGVhcmQgZm9yIHJldXNpbmcga3Byb2JlLiAqLworCXJldCA9IHJlZ2lzdGVyX2pwcm9iZXMoanBzLCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJyZWdpc3Rlcl9qcHJvYmVzIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWpwaF92YWwgPSAwOworCXJldCA9IHRhcmdldChyYW5kMSk7CisJaWYgKGpwaF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJqcHJvYmUgaGFuZGxlciBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisKKwlqcGhfdmFsID0gMDsKKwlyZXQgPSB0YXJnZXQyKHJhbmQxKTsKKwlpZiAoanBoX3ZhbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImpwcm9iZSBoYW5kbGVyMiBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisJdW5yZWdpc3Rlcl9qcHJvYmVzKGpwcywgMik7CisKKwlyZXR1cm4gMDsKK30KICNpZmRlZiBDT05GSUdfS1JFVFBST0JFUwogc3RhdGljIHUzMiBrcnBoX3ZhbDsKIApAQCAtMTc3LDcgKzI4Miw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0ga3Byb2JlX3RhcmdldChyYW5kMSk7CisJcmV0ID0gdGFyZ2V0KHJhbmQxKTsKIAl1bnJlZ2lzdGVyX2tyZXRwcm9iZSgmcnApOwogCWlmIChrcnBoX3ZhbCAhPSByYW5kMSkgewogCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgpAQCAtMTg3LDEyICsyOTIsNzIgQEAKIAogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW50IHJldHVybl9oYW5kbGVyMihzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyByZXQgPSByZWdzX3JldHVybl92YWx1ZShyZWdzKTsKKworCWlmIChyZXQgIT0gKHJhbmQxIC8gZGl2X2ZhY3RvcikgKyAxKSB7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImluY29ycmVjdCB2YWx1ZSBpbiBrcmV0cHJvYmUgaGFuZGxlcjJcbiIpOworCX0KKwlpZiAoa3JwaF92YWwgPT0gMCkgeworCQloYW5kbGVyX2Vycm9ycysrOworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJjYWxsIHRvIGtyZXRwcm9iZSBlbnRyeSBoYW5kbGVyIGZhaWxlZFxuIik7CisJfQorCisJa3JwaF92YWwgPSByYW5kMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBrcmV0cHJvYmUgcnAyID0geworCS5oYW5kbGVyCT0gcmV0dXJuX2hhbmRsZXIyLAorCS5lbnRyeV9oYW5kbGVyICA9IGVudHJ5X2hhbmRsZXIsCisJLmtwLnN5bWJvbF9uYW1lID0gImtwcm9iZV90YXJnZXQyIgorfTsKKworc3RhdGljIGludCB0ZXN0X2tyZXRwcm9iZXModm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBrcmV0cHJvYmUgKnJwc1syXSA9IHsmcnAsICZycDJ9OworCisJcnAua3AuYWRkciA9IDA7IC8qIGFkZHIgc2hvdWxkIGJlIGNsZWFyZCBmb3IgcmV1c2luZyBrcHJvYmUuICovCisJcmV0ID0gcmVnaXN0ZXJfa3JldHByb2JlcyhycHMsIDIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJInJlZ2lzdGVyX2tyZXRwcm9iZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlrcnBoX3ZhbCA9IDA7CisJcmV0ID0gdGFyZ2V0KHJhbmQxKTsKKwlpZiAoa3JwaF92YWwgIT0gcmFuZDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkia3JldHByb2JlIGhhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJa3JwaF92YWwgPSAwOworCXJldCA9IHRhcmdldDIocmFuZDEpOworCWlmIChrcnBoX3ZhbCAhPSByYW5kMSkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcmV0cHJvYmUgaGFuZGxlcjIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCXVucmVnaXN0ZXJfa3JldHByb2JlcyhycHMsIDIpOworCXJldHVybiAwOworfQogI2VuZGlmIC8qIENPTkZJR19LUkVUUFJPQkVTICovCiAKIGludCBpbml0X3Rlc3RfcHJvYmVzKHZvaWQpCiB7CiAJaW50IHJldDsKIAorCXRhcmdldCA9IGtwcm9iZV90YXJnZXQ7CisJdGFyZ2V0MiA9IGtwcm9iZV90YXJnZXQyOworCiAJZG8gewogCQlyYW5kMSA9IHJhbmRvbTMyKCk7CiAJfSB3aGlsZSAocmFuZDEgPD0gZGl2X2ZhY3Rvcik7CkBAIC0yMDQsMTUgKzM2OSwzMCBAQAogCQllcnJvcnMrKzsKIAogCW51bV90ZXN0cysrOworCXJldCA9IHRlc3Rfa3Byb2JlcygpOworCWlmIChyZXQgPCAwKQorCQllcnJvcnMrKzsKKworCW51bV90ZXN0cysrOwogCXJldCA9IHRlc3RfanByb2JlKCk7CiAJaWYgKHJldCA8IDApCiAJCWVycm9ycysrOwogCisJbnVtX3Rlc3RzKys7CisJcmV0ID0gdGVzdF9qcHJvYmVzKCk7CisJaWYgKHJldCA8IDApCisJCWVycm9ycysrOworCiAjaWZkZWYgQ09ORklHX0tSRVRQUk9CRVMKIAludW1fdGVzdHMrKzsKIAlyZXQgPSB0ZXN0X2tyZXRwcm9iZSgpOwogCWlmIChyZXQgPCAwKQogCQllcnJvcnMrKzsKKworCW51bV90ZXN0cysrOworCXJldCA9IHRlc3Rfa3JldHByb2JlcygpOworCWlmIChyZXQgPCAwKQorCQllcnJvcnMrKzsKICNlbmRpZiAvKiBDT05GSUdfS1JFVFBST0JFUyAqLwogCiAJaWYgKGVycm9ycykKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IGQ2M2E0MzMuLjQ4ODZlM2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC02NSw4ICs2Niw5IEBACiAKIAlpZiAodGxvYykgewogCQlpZiAocHV0X3VzZXIoaSx0bG9jKSkKLQkJCWkgPSAtRUZBVUxUOworCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gaTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RzYWNjdC5jIGIva2VybmVsL3RzYWNjdC5jCmluZGV4IDJkYzA2YWIuLjQzZjg5MWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90c2FjY3QuYworKysgYi9rZXJuZWwvdHNhY2N0LmMKQEAgLTkyLDggKzkyLDggQEAKIAltbSA9IGdldF90YXNrX21tKHApOwogCWlmIChtbSkgewogCQkvKiBhZGp1c3QgdG8gS0IgdW5pdCAqLwotCQlzdGF0cy0+aGl3YXRlcl9yc3MgICA9IG1tLT5oaXdhdGVyX3JzcyAqIFBBR0VfU0laRSAvIEtCOwotCQlzdGF0cy0+aGl3YXRlcl92bSAgICA9IG1tLT5oaXdhdGVyX3ZtICogUEFHRV9TSVpFIC8gS0I7CisJCXN0YXRzLT5oaXdhdGVyX3JzcyAgID0gZ2V0X21tX2hpd2F0ZXJfcnNzKG1tKSAqIFBBR0VfU0laRSAvIEtCOworCQlzdGF0cy0+aGl3YXRlcl92bSAgICA9IGdldF9tbV9oaXdhdGVyX3ZtKG1tKSAgKiBQQUdFX1NJWkUgLyBLQjsKIAkJbW1wdXQobW0pOwogCX0KIAlzdGF0cy0+cmVhZF9jaGFyCT0gcC0+aW9hYy5yY2hhcjsKZGlmZiAtLWdpdCBhL2xpYi9idXN0X3NwaW5sb2Nrcy5jIGIvbGliL2J1c3Rfc3BpbmxvY2tzLmMKaW5kZXggNDg2ZGE2Mi4uOTY4MWQ1NCAxMDA2NDQKLS0tIGEvbGliL2J1c3Rfc3BpbmxvY2tzLmMKKysrIGIvbGliL2J1c3Rfc3BpbmxvY2tzLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KIAogCiB2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBidXN0X3NwaW5sb2NrcyhpbnQgeWVzKQpAQCAtMjIsNiArMjMsNyBAQAogI2lmZGVmIENPTkZJR19WVAogCQl1bmJsYW5rX3NjcmVlbigpOwogI2VuZGlmCisJCWNvbnNvbGVfdW5ibGFuaygpOwogCQlpZiAoLS1vb3BzX2luX3Byb2dyZXNzID09IDApCiAJCQl3YWtlX3VwX2tsb2dkKCk7CiAJfQpkaWZmIC0tZ2l0IGEvbGliL2R5bmFtaWNfcHJpbnRrLmMgYi9saWIvZHluYW1pY19wcmludGsuYwppbmRleCA4ZTMwMjk1Li4xNjVhMTk3IDEwMDY0NAotLS0gYS9saWIvZHluYW1pY19wcmludGsuYworKysgYi9saWIvZHluYW1pY19wcmludGsuYwpAQCAtMjc3LDQwICsyNzcsMzQgQEAKIAkJCQlkeW5hbWljX2VuYWJsZWQgPSBEWU5BTUlDX0VOQUJMRURfTk9ORTsKIAkJCX0KIAkJCWVyciA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZWxlbSkgewotCQkJCWlmICh2YWx1ZSAmJiAoZWxlbS0+ZW5hYmxlID09IDApKSB7Ci0JCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgfD0KLQkJCQkJCQkoMUxMIDw8IGVsZW0tPmhhc2gxKTsKLQkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZDIgfD0KLQkJCQkJCQkoMUxMIDw8IGVsZW0tPmhhc2gyKTsKLQkJCQkJZWxlbS0+ZW5hYmxlID0gMTsKLQkJCQkJbnVtX2VuYWJsZWQrKzsKLQkJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX1NPTUU7Ci0JCQkJCWVyciA9IDA7Ci0JCQkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkJCSAgICAgICAiZGVidWdnaW5nIGVuYWJsZWQgZm9yIG1vZHVsZSAlc1xuIiwKLQkJCQkJICAgICAgIGVsZW0tPm5hbWUpOwotCQkJCX0gZWxzZSBpZiAoIXZhbHVlICYmIChlbGVtLT5lbmFibGUgPT0gMSkpIHsKLQkJCQkJZWxlbS0+ZW5hYmxlID0gMDsKLQkJCQkJbnVtX2VuYWJsZWQtLTsKLQkJCQkJaWYgKGRpc2FibGVkX2hhc2goZWxlbS0+aGFzaDEsIHRydWUpKQotCQkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZCAmPQorCQl9IGVsc2UgaWYgKGVsZW0pIHsKKwkJCWlmICh2YWx1ZSAmJiAoZWxlbS0+ZW5hYmxlID09IDApKSB7CisJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZCB8PSAoMUxMIDw8IGVsZW0tPmhhc2gxKTsKKwkJCQlkeW5hbWljX3ByaW50a19lbmFibGVkMiB8PSAoMUxMIDw8IGVsZW0tPmhhc2gyKTsKKwkJCQllbGVtLT5lbmFibGUgPSAxOworCQkJCW51bV9lbmFibGVkKys7CisJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX1NPTUU7CisJCQkJZXJyID0gMDsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkiZGVidWdnaW5nIGVuYWJsZWQgZm9yIG1vZHVsZSAlc1xuIiwKKwkJCQkJZWxlbS0+bmFtZSk7CisJCQl9IGVsc2UgaWYgKCF2YWx1ZSAmJiAoZWxlbS0+ZW5hYmxlID09IDEpKSB7CisJCQkJZWxlbS0+ZW5hYmxlID0gMDsKKwkJCQludW1fZW5hYmxlZC0tOworCQkJCWlmIChkaXNhYmxlZF9oYXNoKGVsZW0tPmhhc2gxLCB0cnVlKSkKKwkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZCAmPQogCQkJCQkJCX4oMUxMIDw8IGVsZW0tPmhhc2gxKTsKLQkJCQkJaWYgKGRpc2FibGVkX2hhc2goZWxlbS0+aGFzaDIsIGZhbHNlKSkKLQkJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQyICY9CisJCQkJaWYgKGRpc2FibGVkX2hhc2goZWxlbS0+aGFzaDIsIGZhbHNlKSkKKwkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZDIgJj0KIAkJCQkJCQl+KDFMTCA8PCBlbGVtLT5oYXNoMik7Ci0JCQkJCWlmIChudW1fZW5hYmxlZCkKLQkJCQkJCWR5bmFtaWNfZW5hYmxlZCA9Ci0JCQkJCQkJRFlOQU1JQ19FTkFCTEVEX1NPTUU7Ci0JCQkJCWVsc2UKLQkJCQkJCWR5bmFtaWNfZW5hYmxlZCA9Ci0JCQkJCQkJRFlOQU1JQ19FTkFCTEVEX05PTkU7Ci0JCQkJCWVyciA9IDA7Ci0JCQkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkJCSAgICAgICAiZGVidWdnaW5nIGRpc2FibGVkIGZvciBtb2R1bGUgIgotCQkJCQkgICAgICAgIiVzXG4iLCBlbGVtLT5uYW1lKTsKLQkJCQl9CisJCQkJaWYgKG51bV9lbmFibGVkKQorCQkJCQlkeW5hbWljX2VuYWJsZWQgPSBEWU5BTUlDX0VOQUJMRURfU09NRTsKKwkJCQllbHNlCisJCQkJCWR5bmFtaWNfZW5hYmxlZCA9IERZTkFNSUNfRU5BQkxFRF9OT05FOworCQkJCWVyciA9IDA7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJImRlYnVnZ2luZyBkaXNhYmxlZCBmb3IgbW9kdWxlICVzXG4iLAorCQkJCQllbGVtLT5uYW1lKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2xpYi9mYXVsdC1pbmplY3QuYyBiL2xpYi9mYXVsdC1pbmplY3QuYwppbmRleCBhNTBhMzExLi5mOTdhZjU1YiAxMDA2NDQKLS0tIGEvbGliL2ZhdWx0LWluamVjdC5jCisrKyBiL2xpYi9mYXVsdC1pbmplY3QuYwpAQCAtNiw3ICs2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgpkaWZmIC0tZ2l0IGEvbGliL2tsaXN0LmMgYi9saWIva2xpc3QuYwppbmRleCBiYmRkMzAxLi41NzNkNjA2IDEwMDY0NAotLS0gYS9saWIva2xpc3QuYworKysgYi9saWIva2xpc3QuYwpAQCAtMzYsNiArMzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAvKgogICogVXNlIHRoZSBsb3dlc3QgYml0IG9mIG5fa2xpc3QgdG8gbWFyayBkZWxldGVkIG5vZGVzIGFuZCBleGNsdWRlCkBAIC0xMDgsNyArMTA5LDYgQEAKIHN0YXRpYyB2b2lkIGtsaXN0X25vZGVfaW5pdChzdHJ1Y3Qga2xpc3QgKmssIHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewogCUlOSVRfTElTVF9IRUFEKCZuLT5uX25vZGUpOwotCWluaXRfY29tcGxldGlvbigmbi0+bl9yZW1vdmVkKTsKIAlrcmVmX2luaXQoJm4tPm5fcmVmKTsKIAlrbm9kZV9zZXRfa2xpc3Qobiwgayk7CiAJaWYgKGstPmdldCkKQEAgLTE3MSwxMyArMTcxLDM0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9hZGRfYmVmb3JlKTsKIAorc3RydWN0IGtsaXN0X3dhaXRlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBrbGlzdF9ub2RlICpub2RlOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJvY2VzczsKKwlpbnQgd29rZW47Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGtsaXN0X3JlbW92ZV9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoa2xpc3RfcmVtb3ZlX3dhaXRlcnMpOworCiBzdGF0aWMgdm9pZCBrbGlzdF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQogeworCXN0cnVjdCBrbGlzdF93YWl0ZXIgKndhaXRlciwgKnRtcDsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qga2xpc3Rfbm9kZSwgbl9yZWYpOwogCiAJV0FSTl9PTigha25vZGVfZGVhZChuKSk7CiAJbGlzdF9kZWwoJm4tPm5fbm9kZSk7Ci0JY29tcGxldGUoJm4tPm5fcmVtb3ZlZCk7CisJc3Bpbl9sb2NrKCZrbGlzdF9yZW1vdmVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhaXRlciwgdG1wLCAma2xpc3RfcmVtb3ZlX3dhaXRlcnMsIGxpc3QpIHsKKwkJaWYgKHdhaXRlci0+bm9kZSAhPSBuKQorCQkJY29udGludWU7CisKKwkJd2FpdGVyLT53b2tlbiA9IDE7CisJCW1iKCk7CisJCXdha2VfdXBfcHJvY2Vzcyh3YWl0ZXItPnByb2Nlc3MpOworCQlsaXN0X2RlbCgmd2FpdGVyLT5saXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJmtsaXN0X3JlbW92ZV9sb2NrKTsKIAlrbm9kZV9zZXRfa2xpc3QobiwgTlVMTCk7CiB9CiAKQEAgLTIxNyw4ICsyMzgsMjQgQEAKICAqLwogdm9pZCBrbGlzdF9yZW1vdmUoc3RydWN0IGtsaXN0X25vZGUgKm4pCiB7CisJc3RydWN0IGtsaXN0X3dhaXRlciB3YWl0ZXI7CisKKwl3YWl0ZXIubm9kZSA9IG47CisJd2FpdGVyLnByb2Nlc3MgPSBjdXJyZW50OworCXdhaXRlci53b2tlbiA9IDA7CisJc3Bpbl9sb2NrKCZrbGlzdF9yZW1vdmVfbG9jayk7CisJbGlzdF9hZGQoJndhaXRlci5saXN0LCAma2xpc3RfcmVtb3ZlX3dhaXRlcnMpOworCXNwaW5fdW5sb2NrKCZrbGlzdF9yZW1vdmVfbG9jayk7CisKIAlrbGlzdF9kZWwobik7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmbi0+bl9yZW1vdmVkKTsKKworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAod2FpdGVyLndva2VuKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGtsaXN0X3JlbW92ZSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9rb2JqZWN0X3VldmVudC5jIGIvbGliL2tvYmplY3RfdWV2ZW50LmMKaW5kZXggM2Y5MTQ3Mi4uMzE4MzI4ZGQgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0X3VldmVudC5jCisrKyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkvKiBrZXlzIHBhc3NlZCBpbiBmcm9tIHRoZSBjYWxsZXIgKi8KIAlpZiAoZW52cF9leHQpIHsKIAkJZm9yIChpID0gMDsgZW52cF9leHRbaV07IGkrKykgewotCQkJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52LCBlbnZwX2V4dFtpXSk7CisJCQlyZXR2YWwgPSBhZGRfdWV2ZW50X3ZhcihlbnYsICIlcyIsIGVudnBfZXh0W2ldKTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBleGl0OwogCQl9CkBAIC0yMjUsOCArMjI1LDEwIEBACiAJCQl9CiAKIAkJCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXAgPSAxOwotCQkJbmV0bGlua19icm9hZGNhc3QodWV2ZW50X3NvY2ssIHNrYiwgMCwgMSwgR0ZQX0tFUk5FTCk7Ci0JCX0KKwkJCXJldHZhbCA9IG5ldGxpbmtfYnJvYWRjYXN0KHVldmVudF9zb2NrLCBza2IsIDAsIDEsCisJCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJfSBlbHNlCisJCQlyZXR2YWwgPSAtRU5PTUVNOwogCX0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9saWIvcGVyY3B1X2NvdW50ZXIuYyBiL2xpYi9wZXJjcHVfY291bnRlci5jCmluZGV4IGIyNTViOTMuLmE2MGJkODAgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJjcHVfY291bnRlci5jCisrKyBiL2xpYi9wZXJjcHVfY291bnRlci5jCkBAIC05LDEwICs5LDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIExJU1RfSEVBRChwZXJjcHVfY291bnRlcnMpOwogc3RhdGljIERFRklORV9NVVRFWChwZXJjcHVfY291bnRlcnNfbG9jayk7Ci0jZW5kaWYKIAogdm9pZCBwZXJjcHVfY291bnRlcl9zZXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCiB7CkBAIC0xMTEsMTMgKzEwOSwyNCBAQAogfQogRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9kZXN0cm95KTsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQoraW50IHBlcmNwdV9jb3VudGVyX2JhdGNoIF9fcmVhZF9tb3N0bHkgPSAzMjsKK0VYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfYmF0Y2gpOworCitzdGF0aWMgdm9pZCBjb21wdXRlX2JhdGNoX3ZhbHVlKHZvaWQpCit7CisJaW50IG5yID0gbnVtX29ubGluZV9jcHVzKCk7CisKKwlwZXJjcHVfY291bnRlcl9iYXRjaCA9IG1heCgzMiwgbnIqMik7Cit9CisKIHN0YXRpYyBpbnQgX19jcHVpbml0IHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAl1bnNpZ25lZCBpbnQgY3B1OwogCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjOwogCisJY29tcHV0ZV9iYXRjaF92YWx1ZSgpOwogCWlmIChhY3Rpb24gIT0gQ1BVX0RFQUQpCiAJCXJldHVybiBOT1RJRllfT0s7CiAKQEAgLTEzNCwxMyArMTQzLDE0IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiYy0+bG9jaywgZmxhZ3MpOwogCX0KIAltdXRleF91bmxvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKyNlbmRpZgogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBlcmNwdV9jb3VudGVyX3N0YXJ0dXAodm9pZCkKIHsKKwljb21wdXRlX2JhdGNoX3ZhbHVlKCk7CiAJaG90Y3B1X25vdGlmaWVyKHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjaywgMCk7CiAJcmV0dXJuIDA7CiB9CiBtb2R1bGVfaW5pdChwZXJjcHVfY291bnRlcl9zdGFydHVwKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3ByaW9faGVhcC5jIGIvbGliL3ByaW9faGVhcC5jCmluZGV4IDQ3MTk0NGEuLmE3YWY2ZjggMTAwNjQ0Ci0tLSBhL2xpYi9wcmlvX2hlYXAuYworKysgYi9saWIvcHJpb19oZWFwLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogCWlmIChoZWFwLT5zaXplIDwgaGVhcC0+bWF4KSB7CiAJCS8qIEhlYXAgaW5zZXJ0aW9uICovCi0JCWludCBwb3MgPSBoZWFwLT5zaXplKys7CisJCXBvcyA9IGhlYXAtPnNpemUrKzsKIAkJd2hpbGUgKHBvcyA+IDAgJiYgaGVhcC0+Z3QocCwgcHRyc1socG9zLTEpLzJdKSkgewogCQkJcHRyc1twb3NdID0gcHRyc1socG9zLTEpLzJdOwogCQkJcG9zID0gKHBvcy0xKS8yOwpkaWZmIC0tZ2l0IGEvbGliL3Byb3BvcnRpb25zLmMgYi9saWIvcHJvcG9ydGlvbnMuYwppbmRleCA0ZjM4N2E2Li4zZmRhODEwIDEwMDY0NAotLS0gYS9saWIvcHJvcG9ydGlvbnMuYworKysgYi9saWIvcHJvcG9ydGlvbnMuYwpAQCAtMTQ3LDYgKzE0Nyw3IEBACiAgKiB0aGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSByZWZlcmVuY2VzLgogICovCiBzdGF0aWMgc3RydWN0IHByb3BfZ2xvYmFsICpwcm9wX2dldF9nbG9iYWwoc3RydWN0IHByb3BfZGVzY3JpcHRvciAqcGQpCitfX2FjcXVpcmVzKFJDVSkKIHsKIAlpbnQgaW5kZXg7CiAKQEAgLTE2MCw2ICsxNjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBwcm9wX3B1dF9nbG9iYWwoc3RydWN0IHByb3BfZGVzY3JpcHRvciAqcGQsIHN0cnVjdCBwcm9wX2dsb2JhbCAqcGcpCitfX3JlbGVhc2VzKFJDVSkKIHsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9yYWRpeC10cmVlLmMgYi9saWIvcmFkaXgtdHJlZS5jCmluZGV4IGJlODZiMzIuLjhkM2ZiMGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYWRpeC10cmVlLmMKKysrIGIvbGliL3JhZGl4LXRyZWUuYwpAQCAtODEsNyArODEsNyBAQAogCWludCBucjsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2Rlc1tSQURJWF9UUkVFX01BWF9QQVRIXTsKIH07Ci1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkLCByYWRpeF90cmVlX3ByZWxvYWRzKSA9IHsgMCwgfTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkLCByYWRpeF90cmVlX3ByZWxvYWRzKSA9IHsgMCwgfTsKIAogc3RhdGljIGlubGluZSBnZnBfdCByb290X2dmcF9tYXNrKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QpCiB7CmRpZmYgLS1naXQgYS9saWIvc3dpb3RsYi5jIGIvbGliL3N3aW90bGIuYwppbmRleCA3ZjVlMjFiLi5jMmE0ZTY0IDEwMDY0NAotLS0gYS9saWIvc3dpb3RsYi5jCisrKyBiL2xpYi9zd2lvdGxiLmMKQEAgLTY0Nyw3ICs2NDcsNyBAQAogCSAqIHRoZSBkYW1hZ2UsIG9yIHBhbmljIHdoZW4gdGhlIHRyYW5zZmVyIGlzIHRvbyBiaWcuCiAJICovCiAJcHJpbnRrKEtFUk5fRVJSICJETUE6IE91dCBvZiBTVy1JT01NVSBzcGFjZSBmb3IgJXp1IGJ5dGVzIGF0ICIKLQkgICAgICAgImRldmljZSAlc1xuIiwgc2l6ZSwgZGV2ID8gZGV2LT5idXNfaWQgOiAiPyIpOworCSAgICAgICAiZGV2aWNlICVzXG4iLCBzaXplLCBkZXYgPyBkZXZfbmFtZShkZXYpIDogIj8iKTsKIAogCWlmIChzaXplID4gaW9fdGxiX292ZXJmbG93ICYmIGRvX3BhbmljKSB7CiAJCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkKZGlmZiAtLWdpdCBhL2xpYi92c3ByaW50Zi5jIGIvbGliL3ZzcHJpbnRmLmMKaW5kZXggOThkNjMyMjcuLjBmYmQwMTIgMTAwNjQ0Ci0tLSBhL2xpYi92c3ByaW50Zi5jCisrKyBiL2xpYi92c3ByaW50Zi5jCkBAIC0xNzAsNiArMTcwLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bChjcCwgJnRhaWwsIGJhc2UpOworCWlmICh0YWlsID09IGNwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoKCp0YWlsID09ICdcMCcpIHx8CiAJCSgobGVuID09IChzaXplX3QpKHRhaWwgLSBjcCkgKyAxKSAmJiAoKnRhaWwgPT0gJ1xuJykpKSB7CiAJCSpyZXMgPSB2YWw7CkBAIC0yNDEsNiArMjQzLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bGwoY3AsICZ0YWlsLCBiYXNlKTsKKwlpZiAodGFpbCA9PSBjcCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCgqdGFpbCA9PSAnXDAnKSB8fAogCQkoKGxlbiA9PSAoc2l6ZV90KSh0YWlsIC0gY3ApICsgMSkgJiYgKCp0YWlsID09ICdcbicpKSkgewogCQkqcmVzID0gdmFsOwpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggNWI1NzkwZi4uYTViNzc4MSAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysgYi9tbS9LY29uZmlnCkBAIC0xODEsMTIgKzE4MSw2IEBACiAJICBleGFtcGxlIG9uIE5VTUEgc3lzdGVtcyB0byBwdXQgcGFnZXMgbmVhcmVyIHRvIHRoZSBwcm9jZXNzb3JzIGFjY2Vzc2luZwogCSAgdGhlIHBhZ2UuCiAKLWNvbmZpZyBSRVNPVVJDRVNfNjRCSVQKLQlib29sICI2NCBiaXQgTWVtb3J5IGFuZCBJTyByZXNvdXJjZXMgKEVYUEVSSU1FTlRBTCkiIGlmICghNjRCSVQgJiYgRVhQRVJJTUVOVEFMKQotCWRlZmF1bHQgNjRCSVQKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhbGxvd3MgbWVtb3J5IGFuZCBJTyByZXNvdXJjZXMgdG8gYmUgNjQgYml0LgotCiBjb25maWcgUEhZU19BRERSX1RfNjRCSVQKIAlkZWZfYm9vbCA2NEJJVCB8fCBBUkNIX1BIWVNfQUREUl9UXzY0QklUCiAKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggNTFjMjc3MC4uNzIyNTViZSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTksNyArOSw3IEBACiAKIG9iai15CQkJOj0gYm9vdG1lbS5vIGZpbGVtYXAubyBtZW1wb29sLm8gb29tX2tpbGwubyBmYWR2aXNlLm8gXAogCQkJICAgbWFjY2Vzcy5vIHBhZ2VfYWxsb2MubyBwYWdlLXdyaXRlYmFjay5vIHBkZmx1c2gubyBcCi0JCQkgICByZWFkYWhlYWQubyBzd2FwLm8gdHJ1bmNhdGUubyB2bXNjYW4ubyBcCisJCQkgICByZWFkYWhlYWQubyBzd2FwLm8gdHJ1bmNhdGUubyB2bXNjYW4ubyBzaG1lbS5vIFwKIAkJCSAgIHByaW9fdHJlZS5vIHV0aWwubyBtbXpvbmUubyB2bXN0YXQubyBiYWNraW5nLWRldi5vIFwKIAkJCSAgIHBhZ2VfaXNvbGF0aW9uLm8gbW1faW5pdC5vICQobW11LXkpCiAKQEAgLTIxLDkgKzIxLDcgQEAKIG9iai0kKENPTkZJR19OVU1BKSAJKz0gbWVtcG9saWN5Lm8KIG9iai0kKENPTkZJR19TUEFSU0VNRU0pCSs9IHNwYXJzZS5vCiBvYmotJChDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVApICs9IHNwYXJzZS12bWVtbWFwLm8KLW9iai0kKENPTkZJR19TSE1FTSkgKz0gc2htZW0ubwogb2JqLSQoQ09ORklHX1RNUEZTX1BPU0lYX0FDTCkgKz0gc2htZW1fYWNsLm8KLW9iai0kKENPTkZJR19USU5ZX1NITUVNKSArPSB0aW55LXNobWVtLm8KIG9iai0kKENPTkZJR19TTE9CKSArPSBzbG9iLm8KIG9iai0kKENPTkZJR19NTVVfTk9USUZJRVIpICs9IG1tdV9ub3RpZmllci5vCiBvYmotJChDT05GSUdfU0xBQikgKz0gc2xhYi5vCmRpZmYgLS1naXQgYS9tbS9iYWNraW5nLWRldi5jIGIvbW0vYmFja2luZy1kZXYuYwppbmRleCA4MDFjMDhiLi42ZjgwYmVkIDEwMDY0NAotLS0gYS9tbS9iYWNraW5nLWRldi5jCisrKyBiL21tL2JhY2tpbmctZGV2LmMKQEAgLTI0LDkgKzI0LDkgQEAKIHN0YXRpYyBpbnQgYmRpX2RlYnVnX3N0YXRzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBtLT5wcml2YXRlOwotCWxvbmcgYmFja2dyb3VuZF90aHJlc2g7Ci0JbG9uZyBkaXJ0eV90aHJlc2g7Ci0JbG9uZyBiZGlfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoOwogCiAJZ2V0X2RpcnR5X2xpbWl0cygmYmFja2dyb3VuZF90aHJlc2gsICZkaXJ0eV90aHJlc2gsICZiZGlfdGhyZXNoLCBiZGkpOwogCmRpZmYgLS1naXQgYS9tbS9ib290bWVtLmMgYi9tbS9ib290bWVtLmMKaW5kZXggYWM1YTg5MS4uNTFhMGNjZiAxMDA2NDQKLS0tIGEvbW0vYm9vdG1lbS5jCisrKyBiL21tL2Jvb3RtZW0uYwpAQCAtNDM1LDYgKzQzNSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmFsbGJhY2sgPSAwOwogCXVuc2lnbmVkIGxvbmcgbWluLCBtYXgsIHN0YXJ0LCBzaWR4LCBtaWR4LCBzdGVwOwogCisJYmRlYnVnKCJuaWQ9JXRkIHNpemU9JWx4IFslbHUgcGFnZXNdIGFsaWduPSVseCBnb2FsPSVseCBsaW1pdD0lbHhcbiIsCisJCWJkYXRhIC0gYm9vdG1lbV9ub2RlX2RhdGEsIHNpemUsIFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVCwKKwkJYWxpZ24sIGdvYWwsIGxpbWl0KTsKKwogCUJVR19PTighc2l6ZSk7CiAJQlVHX09OKGFsaWduICYgKGFsaWduIC0gMSkpOwogCUJVR19PTihsaW1pdCAmJiBnb2FsICsgc2l6ZSA+IGxpbWl0KTsKQEAgLTQ0MiwxMCArNDQ2LDYgQEAKIAlpZiAoIWJkYXRhLT5ub2RlX2Jvb3RtZW1fbWFwKQogCQlyZXR1cm4gTlVMTDsKIAotCWJkZWJ1ZygibmlkPSV0ZCBzaXplPSVseCBbJWx1IHBhZ2VzXSBhbGlnbj0lbHggZ29hbD0lbHggbGltaXQ9JWx4XG4iLAotCQliZGF0YSAtIGJvb3RtZW1fbm9kZV9kYXRhLCBzaXplLCBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQsCi0JCWFsaWduLCBnb2FsLCBsaW1pdCk7Ci0KIAltaW4gPSBiZGF0YS0+bm9kZV9taW5fcGZuOwogCW1heCA9IGJkYXRhLT5ub2RlX2xvd19wZm47CiAKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBmNTc2OWI0Li4yZjU1YTFlIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0yMTAsNyArMjEwLDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7CiAJCS5zeW5jX21vZGUgPSBzeW5jX21vZGUsCi0JCS5ucl90b193cml0ZSA9IG1hcHBpbmctPm5ycGFnZXMgKiAyLAorCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKIAkJLnJhbmdlX3N0YXJ0ID0gc3RhcnQsCiAJCS5yYW5nZV9lbmQgPSBlbmQsCiAJfTsKQEAgLTc0MSw3ICs3NDEsMTQgQEAKIAkJcGFnZSA9IF9fcGFnZV9jYWNoZV9hbGxvYyhnZnBfbWFzayk7CiAJCWlmICghcGFnZSkKIAkJCXJldHVybiBOVUxMOwotCQllcnIgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsIGdmcF9tYXNrKTsKKwkJLyoKKwkJICogV2Ugd2FudCBhIHJlZ3VsYXIga2VybmVsIG1lbW9yeSAobm90IGhpZ2htZW0gb3IgRE1BIGV0YykKKwkJICogYWxsb2NhdGlvbiBmb3IgdGhlIHJhZGl4IHRyZWUgbm9kZXMsIGJ1dCB3ZSBuZWVkIHRvIGhvbm91cgorCQkgKiB0aGUgY29udGV4dC1zcGVjaWZpYyByZXF1aXJlbWVudHMgdGhlIGNhbGxlciBoYXMgYXNrZWQgZm9yLgorCQkgKiBHRlBfUkVDTEFJTV9NQVNLIGNvbGxlY3RzIHRob3NlIHJlcXVpcmVtZW50cy4KKwkJICovCisJCWVyciA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwKKwkJCShnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0spKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCXBhZ2UgPSBOVUxMOwpAQCAtOTUwLDcgKzk1Nyw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAlwYWdlID0gX19wYWdlX2NhY2hlX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJiB+X19HRlBfRlMpOwotCWlmIChwYWdlICYmIGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwgR0ZQX0tFUk5FTCkpIHsKKwlpZiAocGFnZSAmJiBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKSkgewogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCXBhZ2UgPSBOVUxMOwogCX0KQEAgLTEzMTcsNyArMTMyNCw4IEBACiAJCQlnb3RvIG91dDsgLyogc2tpcCBhdGltZSAqLwogCQlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCQlpZiAocG9zIDwgc2l6ZSkgewotCQkJcmV0dmFsID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdChtYXBwaW5nKTsKKwkJCXJldHZhbCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgcG9zLAorCQkJCQlwb3MgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncykgLSAxKTsKIAkJCWlmICghcmV0dmFsKSB7CiAJCQkJcmV0dmFsID0gbWFwcGluZy0+YV9vcHMtPmRpcmVjdF9JTyhSRUFELCBpb2NiLAogCQkJCQkJCWlvdiwgcG9zLCBucl9zZWdzKTsKQEAgLTE1MzAsNyArMTUzOCw2IEBACiAJLyoKIAkgKiBGb3VuZCB0aGUgcGFnZSBhbmQgaGF2ZSBhIHJlZmVyZW5jZSBvbiBpdC4KIAkgKi8KLQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CiAJcmEtPnByZXZfcG9zID0gKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOwogCXZtZi0+cGFnZSA9IHBhZ2U7CiAJcmV0dXJuIHJldCB8IFZNX0ZBVUxUX0xPQ0tFRDsKQEAgLTIwNjAsMTggKzIwNjcsMTAgQEAKIAlpZiAoY291bnQgIT0gb2NvdW50KQogCQkqbnJfc2VncyA9IGlvdl9zaG9ydGVuKChzdHJ1Y3QgaW92ZWMgKilpb3YsICpucl9zZWdzLCBjb3VudCk7CiAKLQkvKgotCSAqIFVubWFwIGFsbCBtbWFwcGluZ3Mgb2YgdGhlIGZpbGUgdXAtZnJvbnQuCi0JICoKLQkgKiBUaGlzIHdpbGwgY2F1c2UgYW55IHB0ZSBkaXJ0eSBiaXRzIHRvIGJlIHByb3BhZ2F0ZWQgaW50byB0aGUKLQkgKiBwYWdlZnJhbWVzIGZvciB0aGUgc3Vic2VxdWVudCBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KCkuCi0JICovCiAJd3JpdGVfbGVuID0gaW92X2xlbmd0aChpb3YsICpucl9zZWdzKTsKIAllbmQgPSAocG9zICsgd3JpdGVfbGVuIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlpZiAobWFwcGluZ19tYXBwZWQobWFwcGluZykpCi0JCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgcG9zLCB3cml0ZV9sZW4sIDApOwogCi0Jd3JpdHRlbiA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQobWFwcGluZyk7CisJd3JpdHRlbiA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgcG9zLCBwb3MgKyB3cml0ZV9sZW4gLSAxKTsKIAlpZiAod3JpdHRlbikKIAkJZ290byBvdXQ7CiAKQEAgLTIyOTEsNyArMjI5MCw4IEBACiAJICogdGhlIGZpbGUgZGF0YSBoZXJlLCB0byB0cnkgdG8gaG9ub3VyIE9fRElSRUNUIGV4cGVjdGF0aW9ucy4KIAkgKi8KIAlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSAmJiB3cml0dGVuKQotCQlzdGF0dXMgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOworCQlzdGF0dXMgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsCisJCQkJCXBvcywgcG9zICsgd3JpdHRlbiAtIDEpOwogCiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcF94aXAuYyBiL21tL2ZpbGVtYXBfeGlwLmMKaW5kZXggYjUxNjdkZi4uMGMwNDYxNSAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcF94aXAuYworKysgYi9tbS9maWxlbWFwX3hpcC5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJCS8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovCiAJCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbigqcHRlKSk7CiAJCQlwdGV2YWwgPSBwdGVwX2NsZWFyX2ZsdXNoX25vdGlmeSh2bWEsIGFkZHJlc3MsIHB0ZSk7Ci0JCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCQkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKIAkJCUJVR19PTihwdGVfZGlydHkocHRldmFsKSk7CiAJCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKZGlmZiAtLWdpdCBhL21tL2ZyZW1hcC5jIGIvbW0vZnJlbWFwLmMKaW5kZXggN2QxMmNhNy4uNjJkNWJiZCAxMDA2NDQKLS0tIGEvbW0vZnJlbWFwLmMKKysrIGIvbW0vZnJlbWFwLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkJaWYgKHBhZ2UpIHsKIAkJCWlmIChwdGVfZGlydHkocHRlKSkKIAkJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKLQkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSwgdm1hKTsKKwkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQl1cGRhdGVfaGl3YXRlcl9yc3MobW0pOwogCQkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCA2MDU4YjUzLi42MThlOTgzIDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC0yMjAsNiArMjIwLDM1IEBACiB9CiAKIC8qCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBhZ2VzIGFsbG9jYXRlZCB3aGVuIGJhY2tpbmcgYSBWTUEuIEluIHRoZSBtYWpvcml0eQorICogY2FzZXMgdGhpcyB3aWxsIGJlIHNhbWUgc2l6ZSBhcyB1c2VkIGJ5IHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgdm1hX2tlcm5lbF9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaHN0YXRlICpoc3RhdGU7CisKKwlpZiAoIWlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKQorCQlyZXR1cm4gUEFHRV9TSVpFOworCisJaHN0YXRlID0gaHN0YXRlX3ZtYSh2bWEpOworCisJcmV0dXJuIDFVTCA8PCAoaHN0YXRlLT5vcmRlciArIFBBR0VfU0hJRlQpOworfQorCisvKgorICogUmV0dXJuIHRoZSBwYWdlIHNpemUgYmVpbmcgdXNlZCBieSB0aGUgTU1VIHRvIGJhY2sgYSBWTUEuIEluIHRoZSBtYWpvcml0eQorICogb2YgY2FzZXMsIHRoZSBwYWdlIHNpemUgdXNlZCBieSB0aGUga2VybmVsIG1hdGNoZXMgdGhlIE1NVSBzaXplLiBPbgorICogYXJjaGl0ZWN0dXJlcyB3aGVyZSBpdCBkaWZmZXJzLCBhbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGlzCisgKiBmdW5jdGlvbiBpcyByZXF1aXJlZC4KKyAqLworI2lmbmRlZiB2bWFfbW11X3BhZ2VzaXplCit1bnNpZ25lZCBsb25nIHZtYV9tbXVfcGFnZXNpemUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIHZtYV9rZXJuZWxfcGFnZXNpemUodm1hKTsKK30KKyNlbmRpZgorCisvKgogICogRmxhZ3MgZm9yIE1BUF9QUklWQVRFIHJlc2VydmF0aW9ucy4gIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJvdHRvbQogICogYml0cyBvZiB0aGUgcmVzZXJ2YXRpb24gbWFwIHBvaW50ZXIsIHdoaWNoIGFyZSBhbHdheXMgY2xlYXIgZHVlIHRvCiAgKiBhbGlnbm1lbnQuCkBAIC0zNzEsOCArNDAwLDEwIEBACiB7CiAJaW50IGk7CiAKLQlpZiAodW5saWtlbHkoc3ogPiBNQVhfT1JERVJfTlJfUEFHRVMpKQotCQlyZXR1cm4gY2xlYXJfZ2lnYW50aWNfcGFnZShwYWdlLCBhZGRyLCBzeik7CisJaWYgKHVubGlrZWx5KHN6ID4gTUFYX09SREVSX05SX1BBR0VTKSkgeworCQljbGVhcl9naWdhbnRpY19wYWdlKHBhZ2UsIGFkZHIsIHN6KTsKKwkJcmV0dXJuOworCX0KIAogCW1pZ2h0X3NsZWVwKCk7CiAJZm9yIChpID0gMDsgaSA8IHN6L1BBR0VfU0laRTsgaSsrKSB7CkBAIC00MDQsOCArNDM1LDEwIEBACiAJaW50IGk7CiAJc3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTsKIAotCWlmICh1bmxpa2VseShwYWdlc19wZXJfaHVnZV9wYWdlKGgpID4gTUFYX09SREVSX05SX1BBR0VTKSkKLQkJcmV0dXJuIGNvcHlfZ2lnYW50aWNfcGFnZShkc3QsIHNyYywgYWRkciwgdm1hKTsKKwlpZiAodW5saWtlbHkocGFnZXNfcGVyX2h1Z2VfcGFnZShoKSA+IE1BWF9PUkRFUl9OUl9QQUdFUykpIHsKKwkJY29weV9naWdhbnRpY19wYWdlKGRzdCwgc3JjLCBhZGRyLCB2bWEpOworCQlyZXR1cm47CisJfQogCiAJbWlnaHRfc2xlZXAoKTsKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZXNfcGVyX2h1Z2VfcGFnZShoKTsgaSsrKSB7CkBAIC05NzIsNyArMTAwNSw3IEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKLV9fYXR0cmlidXRlX18oKHdlYWspKSBpbnQgYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCkKK2ludCBfX3dlYWsgYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCkKIHsKIAlzdHJ1Y3QgaHVnZV9ib290bWVtX3BhZ2UgKm07CiAJaW50IG5yX25vZGVzID0gbm9kZXNfd2VpZ2h0KG5vZGVfb25saW5lX21hcCk7CkBAIC05OTEsOCArMTAyNCw3IEBACiAJCQkgKiBwdXRzIHRoZW0gaW50byB0aGUgbWVtX21hcCkuCiAJCQkgKi8KIAkJCW0gPSBhZGRyOwotCQkJaWYgKG0pCi0JCQkJZ290byBmb3VuZDsKKwkJCWdvdG8gZm91bmQ7CiAJCX0KIAkJaHN0YXRlX25leHRfbm9kZShoKTsKIAkJbnJfbm9kZXMtLTsKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDEzMzMzYmMuLjQ3ODIyM2IgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKKysrIGIvbW0vaW50ZXJuYWwuaApAQCAtNDksNiArNDksNyBAQAogLyoKICAqIGluIG1tL3BhZ2VfYWxsb2MuYwogICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoZXN0X21lbW1hcF9wZm47CiBleHRlcm4gdm9pZCBfX2ZyZWVfcGFnZXNfYm9vdG1lbShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9yZGVyKTsKIAogLyoKQEAgLTI3NSw2ICsyNzYsNyBAQAogI2RlZmluZSBHVVBfRkxBR1NfV1JJVEUgICAgICAgICAgICAgICAgICAweDEKICNkZWZpbmUgR1VQX0ZMQUdTX0ZPUkNFICAgICAgICAgICAgICAgICAgMHgyCiAjZGVmaW5lIEdVUF9GTEFHU19JR05PUkVfVk1BX1BFUk1JU1NJT05TIDB4NAorI2RlZmluZSBHVVBfRkxBR1NfSUdOT1JFX1NJR0tJTEwgICAgICAgICAweDgKIAogaW50IF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGludCBsZW4sIGludCBmbGFncywKZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wuYyBiL21tL21lbWNvbnRyb2wuYwppbmRleCA4NjZkY2M3Li41MWVlOTY1IDEwMDY0NAotLS0gYS9tbS9tZW1jb250cm9sLmMKKysrIGIvbW0vbWVtY29udHJvbC5jCkBAIC03NzksNyArNzc5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG1lbV9jZ3JvdXBfcmVzaXplX2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbGltaXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCiB7CiAKIAlpbnQgcmV0cnlfY291bnQgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggN2I5ZGI2NS4uM2Y4ZmEwNiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTUyLDYgKzUyLDkgQEAKICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC01OSw5ICs2Miw2IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAotI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGYuaD4KLQogI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNpZm5kZWYgQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMKQEAgLTM3NSwxNSArMzc1LDY1IEBACiAgKgogICogVGhlIGNhbGxpbmcgZnVuY3Rpb24gbXVzdCBzdGlsbCBoYW5kbGUgdGhlIGVycm9yLgogICovCi1zdGF0aWMgdm9pZCBwcmludF9iYWRfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdGVfdCBwdGUsCi0JCQkgIHVuc2lnbmVkIGxvbmcgdmFkZHIpCitzdGF0aWMgdm9pZCBwcmludF9iYWRfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgIHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcHJpbnRrKEtFUk5fRVJSICJCYWQgcHRlID0gJTA4bGx4LCBwcm9jZXNzID0gJXMsICIKLQkJCSJ2bV9mbGFncyA9ICVseCwgdmFkZHIgPSAlbHhcbiIsCi0JCShsb25nIGxvbmcpcHRlX3ZhbChwdGUpLAotCQkodm1hLT52bV9tbSA9PSBjdXJyZW50LT5tbSA/IGN1cnJlbnQtPmNvbW0gOiAiPz8/IiksCi0JCXZtYS0+dm1fZmxhZ3MsIHZhZGRyKTsKKwlwZ2RfdCAqcGdkID0gcGdkX29mZnNldCh2bWEtPnZtX21tLCBhZGRyKTsKKwlwdWRfdCAqcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOworCXBtZF90ICpwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJcGdvZmZfdCBpbmRleDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyByZXN1bWU7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfc2hvd247CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfdW5zaG93bjsKKworCS8qCisJICogQWxsb3cgYSBidXJzdCBvZiA2MCByZXBvcnRzLCB0aGVuIGtlZXAgcXVpZXQgZm9yIHRoYXQgbWludXRlOworCSAqIG9yIGFsbG93IGEgc3RlYWR5IGRyaXAgb2Ygb25lIHJlcG9ydCBwZXIgc2Vjb25kLgorCSAqLworCWlmIChucl9zaG93biA9PSA2MCkgeworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcmVzdW1lKSkgeworCQkJbnJfdW5zaG93bisrOworCQkJcmV0dXJuOworCQl9CisJCWlmIChucl91bnNob3duKSB7CisJCQlwcmludGsoS0VSTl9BTEVSVAorCQkJCSJCVUc6IEJhZCBwYWdlIG1hcDogJWx1IG1lc3NhZ2VzIHN1cHByZXNzZWRcbiIsCisJCQkJbnJfdW5zaG93bik7CisJCQlucl91bnNob3duID0gMDsKKwkJfQorCQlucl9zaG93biA9IDA7CisJfQorCWlmIChucl9zaG93bisrID09IDApCisJCXJlc3VtZSA9IGppZmZpZXMgKyA2MCAqIEhaOworCisJbWFwcGluZyA9IHZtYS0+dm1fZmlsZSA/IHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nIDogTlVMTDsKKwlpbmRleCA9IGxpbmVhcl9wYWdlX2luZGV4KHZtYSwgYWRkcik7CisKKwlwcmludGsoS0VSTl9BTEVSVAorCQkiQlVHOiBCYWQgcGFnZSBtYXAgaW4gcHJvY2VzcyAlcyAgcHRlOiUwOGxseCBwbWQ6JTA4bGx4XG4iLAorCQljdXJyZW50LT5jb21tLAorCQkobG9uZyBsb25nKXB0ZV92YWwocHRlKSwgKGxvbmcgbG9uZylwbWRfdmFsKCpwbWQpKTsKKwlpZiAocGFnZSkgeworCQlwcmludGsoS0VSTl9BTEVSVAorCQkicGFnZTolcCBmbGFnczolcCBjb3VudDolZCBtYXBjb3VudDolZCBtYXBwaW5nOiVwIGluZGV4OiVseFxuIiwKKwkJcGFnZSwgKHZvaWQgKilwYWdlLT5mbGFncywgcGFnZV9jb3VudChwYWdlKSwKKwkJcGFnZV9tYXBjb3VudChwYWdlKSwgcGFnZS0+bWFwcGluZywgcGFnZS0+aW5kZXgpOworCX0KKwlwcmludGsoS0VSTl9BTEVSVAorCQkiYWRkcjolcCB2bV9mbGFnczolMDhseCBhbm9uX3ZtYTolcCBtYXBwaW5nOiVwIGluZGV4OiVseFxuIiwKKwkJKHZvaWQgKilhZGRyLCB2bWEtPnZtX2ZsYWdzLCB2bWEtPmFub25fdm1hLCBtYXBwaW5nLCBpbmRleCk7CisJLyoKKwkgKiBDaG9vc2UgdGV4dCBiZWNhdXNlIGRhdGEgc3ltYm9scyBkZXBlbmQgb24gQ09ORklHX0tBTExTWU1TX0FMTD15CisJICovCisJaWYgKHZtYS0+dm1fb3BzKQorCQlwcmludF9zeW1ib2woS0VSTl9BTEVSVCAidm1hLT52bV9vcHMtPmZhdWx0OiAlc1xuIiwKKwkJCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX29wcy0+ZmF1bHQpOworCWlmICh2bWEtPnZtX2ZpbGUgJiYgdm1hLT52bV9maWxlLT5mX29wKQorCQlwcmludF9zeW1ib2woS0VSTl9BTEVSVCAidm1hLT52bV9maWxlLT5mX29wLT5tbWFwOiAlc1xuIiwKKwkJCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX2ZpbGUtPmZfb3AtPm1tYXApOwogCWR1bXBfc3RhY2soKTsKKwlhZGRfdGFpbnQoVEFJTlRfQkFEX1BBR0UpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpc19jb3dfbWFwcGluZyh1bnNpZ25lZCBpbnQgZmxhZ3MpCkBAIC00NDEsMjEgKzQ5MSwxOCBAQAogc3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJcHRlX3QgcHRlKQogewotCXVuc2lnbmVkIGxvbmcgcGZuOworCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOwogCiAJaWYgKEhBVkVfUFRFX1NQRUNJQUwpIHsKLQkJaWYgKGxpa2VseSghcHRlX3NwZWNpYWwocHRlKSkpIHsKLQkJCVZNX0JVR19PTighcGZuX3ZhbGlkKHB0ZV9wZm4ocHRlKSkpOwotCQkJcmV0dXJuIHB0ZV9wYWdlKHB0ZSk7Ci0JCX0KLQkJVk1fQlVHX09OKCEodm1hLT52bV9mbGFncyAmIChWTV9QRk5NQVAgfCBWTV9NSVhFRE1BUCkpKTsKKwkJaWYgKGxpa2VseSghcHRlX3NwZWNpYWwocHRlKSkpCisJCQlnb3RvIGNoZWNrX3BmbjsKKwkJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9QRk5NQVAgfCBWTV9NSVhFRE1BUCkpKQorCQkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHIsIHB0ZSwgTlVMTCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qICFIQVZFX1BURV9TUEVDSUFMIGNhc2UgZm9sbG93czogKi8KIAotCXBmbiA9IHB0ZV9wZm4ocHRlKTsKLQogCWlmICh1bmxpa2VseSh2bWEtPnZtX2ZsYWdzICYgKFZNX1BGTk1BUHxWTV9NSVhFRE1BUCkpKSB7CiAJCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTUlYRURNQVApIHsKIAkJCWlmICghcGZuX3ZhbGlkKHBmbikpCkBAIC00NzEsMTEgKzUxOCwxNCBAQAogCQl9CiAJfQogCi0JVk1fQlVHX09OKCFwZm5fdmFsaWQocGZuKSk7CitjaGVja19wZm46CisJaWYgKHVubGlrZWx5KHBmbiA+IGhpZ2hlc3RfbWVtbWFwX3BmbikpIHsKKwkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHIsIHB0ZSwgTlVMTCk7CisJCXJldHVybiBOVUxMOworCX0KIAogCS8qCiAJICogTk9URSEgV2Ugc3RpbGwgaGF2ZSBQYWdlUmVzZXJ2ZWQoKSBwYWdlcyBpbiB0aGUgcGFnZSB0YWJsZXMuCi0JICoKIAkgKiBlZy4gVkRTTyBtYXBwaW5ncyBjYW4gY2F1c2UgdGhlbSB0byBleGlzdC4KIAkgKi8KIG91dDoKQEAgLTc2NywxMSArODE3LDE0IEBACiAJCQllbHNlIHsKIAkJCQlpZiAocHRlX2RpcnR5KHB0ZW50KSkKIAkJCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7Ci0JCQkJaWYgKHB0ZV95b3VuZyhwdGVudCkpCi0JCQkJCVNldFBhZ2VSZWZlcmVuY2VkKHBhZ2UpOworCQkJCWlmIChwdGVfeW91bmcocHRlbnQpICYmCisJCQkJICAgIGxpa2VseSghVk1fU2VxdWVudGlhbFJlYWRIaW50KHZtYSkpKQorCQkJCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CiAJCQkJZmlsZV9yc3MtLTsKIAkJCX0KLQkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSwgdm1hKTsKKwkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CisJCQlpZiAodW5saWtlbHkocGFnZV9tYXBjb3VudChwYWdlKSA8IDApKQorCQkJCXByaW50X2JhZF9wdGUodm1hLCBhZGRyLCBwdGVudCwgcGFnZSk7CiAJCQl0bGJfcmVtb3ZlX3BhZ2UodGxiLCBwYWdlKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC03ODEsOCArODM0LDEyIEBACiAJCSAqLwogCQlpZiAodW5saWtlbHkoZGV0YWlscykpCiAJCQljb250aW51ZTsKLQkJaWYgKCFwdGVfZmlsZShwdGVudCkpCi0JCQlmcmVlX3N3YXBfYW5kX2NhY2hlKHB0ZV90b19zd3BfZW50cnkocHRlbnQpKTsKKwkJaWYgKHB0ZV9maWxlKHB0ZW50KSkgeworCQkJaWYgKHVubGlrZWx5KCEodm1hLT52bV9mbGFncyAmIFZNX05PTkxJTkVBUikpKQorCQkJCXByaW50X2JhZF9wdGUodm1hLCBhZGRyLCBwdGVudCwgTlVMTCk7CisJCX0gZWxzZSBpZgorCQkgICh1bmxpa2VseSghZnJlZV9zd2FwX2FuZF9jYWNoZShwdGVfdG9fc3dwX2VudHJ5KHB0ZW50KSkpKQorCQkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHIsIHB0ZW50LCBOVUxMKTsKIAkJcHRlX2NsZWFyX25vdF9wcmVzZW50X2Z1bGwobW0sIGFkZHIsIHB0ZSwgdGxiLT5mdWxsbW0pOwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgKGFkZHIgIT0gZW5kICYmICp6YXBfd29yayA+IDApKTsKIApAQCAtMTE1Myw2ICsxMjEwLDcgQEAKIAlpbnQgd3JpdGUgPSAhIShmbGFncyAmIEdVUF9GTEFHU19XUklURSk7CiAJaW50IGZvcmNlID0gISEoZmxhZ3MgJiBHVVBfRkxBR1NfRk9SQ0UpOwogCWludCBpZ25vcmUgPSAhIShmbGFncyAmIEdVUF9GTEFHU19JR05PUkVfVk1BX1BFUk1JU1NJT05TKTsKKwlpbnQgaWdub3JlX3NpZ2tpbGwgPSAhIShmbGFncyAmIEdVUF9GTEFHU19JR05PUkVfU0lHS0lMTCk7CiAKIAlpZiAobGVuIDw9IDApCiAJCXJldHVybiAwOwpAQCAtMTIzMSwxMiArMTI4OSwxNSBAQAogCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAkJCS8qCi0JCQkgKiBJZiB0c2sgaXMgb29taW5nLCBjdXQgb2ZmIGl0cyBhY2Nlc3MgdG8gbGFyZ2UgbWVtb3J5Ci0JCQkgKiBhbGxvY2F0aW9ucy4gSXQgaGFzIGEgcGVuZGluZyBTSUdLSUxMLCBidXQgaXQgY2FuJ3QKLQkJCSAqIGJlIHByb2Nlc3NlZCB1bnRpbCByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4KKwkJCSAqIElmIHdlIGhhdmUgYSBwZW5kaW5nIFNJR0tJTEwsIGRvbid0IGtlZXAgZmF1bHRpbmcKKwkJCSAqIHBhZ2VzIGFuZCBwb3RlbnRpYWxseSBhbGxvY2F0aW5nIG1lbW9yeSwgdW5sZXNzCisJCQkgKiBjdXJyZW50IGlzIGhhbmRsaW5nIG11bmxvY2stLWUuZy4sIG9uIGV4aXQuIEluCisJCQkgKiB0aGF0IGNhc2UsIHdlIGFyZSBub3QgYWxsb2NhdGluZyBtZW1vcnkuICBSYXRoZXIsCisJCQkgKiB3ZSdyZSBvbmx5IHVubG9ja2luZyBhbHJlYWR5IHJlc2lkZW50L21hcHBlZCBwYWdlcy4KIAkJCSAqLwotCQkJaWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX01FTURJRSkpKQotCQkJCXJldHVybiBpID8gaSA6IC1FTk9NRU07CisJCQlpZiAodW5saWtlbHkoIWlnbm9yZV9zaWdraWxsICYmCisJCQkJCWZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSkKKwkJCQlyZXR1cm4gaSA/IGkgOiAtRVJFU1RBUlRTWVM7CiAKIAkJCWlmICh3cml0ZSkKIAkJCQlmb2xsX2ZsYWdzIHw9IEZPTExfV1JJVEU7CkBAIC0xMjYzLDkgKzEzMjQsMTUgQEAKIAkJCQkgKiBkb193cF9wYWdlIGhhcyBicm9rZW4gQ09XIHdoZW4gbmVjZXNzYXJ5LAogCQkJCSAqIGV2ZW4gaWYgbWF5YmVfbWt3cml0ZSBkZWNpZGVkIG5vdCB0byBzZXQKIAkJCQkgKiBwdGVfd3JpdGUuIFdlIGNhbiB0aHVzIHNhZmVseSBkbyBzdWJzZXF1ZW50Ci0JCQkJICogcGFnZSBsb29rdXBzIGFzIGlmIHRoZXkgd2VyZSByZWFkcy4KKwkJCQkgKiBwYWdlIGxvb2t1cHMgYXMgaWYgdGhleSB3ZXJlIHJlYWRzLiBCdXQgb25seQorCQkJCSAqIGRvIHNvIHdoZW4gbG9vcGluZyBmb3IgcHRlX3dyaXRlIGlzIGZ1dGlsZToKKwkJCQkgKiBpbiBzb21lIGNhc2VzIHVzZXJzcGFjZSBtYXkgYWxzbyBiZSB3YW50aW5nCisJCQkJICogdG8gd3JpdGUgdG8gdGhlIGdvdHRlbiB1c2VyIHBhZ2UsIHdoaWNoIGEKKwkJCQkgKiByZWFkIGZhdWx0IGhlcmUgbWlnaHQgcHJldmVudCAoYSByZWFkb25seQorCQkJCSAqIHBhZ2UgbWlnaHQgZ2V0IHJlQ09XZWQgYnkgdXNlcnNwYWNlIHdyaXRlKS4KIAkJCQkgKi8KLQkJCQlpZiAocmV0ICYgVk1fRkFVTFRfV1JJVEUpCisJCQkJaWYgKChyZXQgJiBWTV9GQVVMVF9XUklURSkgJiYKKwkJCQkgICAgISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQogCQkJCQlmb2xsX2ZsYWdzICY9IH5GT0xMX1dSSVRFOwogCiAJCQkJY29uZF9yZXNjaGVkKCk7CkBAIC0xNjQ0LDYgKzE3MTEsOCBAQAogCiAJQlVHX09OKHBtZF9odWdlKCpwbWQpKTsKIAorCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOworCiAJdG9rZW4gPSBwbWRfcGd0YWJsZSgqcG1kKTsKIAogCWRvIHsKQEAgLTE2NTIsNiArMTcyMSw4IEBACiAJCQlicmVhazsKIAl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKIAorCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOworCiAJaWYgKG1tICE9ICZpbml0X21tKQogCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZS0xLCBwdGwpOwogCXJldHVybiBlcnI7CkBAIC0xODM3LDEwICsxOTA4LDIxIEBACiAJICogbm90IGRpcnR5IGFjY291bnRhYmxlLgogCSAqLwogCWlmIChQYWdlQW5vbihvbGRfcGFnZSkpIHsKLQkJaWYgKHRyeWxvY2tfcGFnZShvbGRfcGFnZSkpIHsKLQkJCXJldXNlID0gY2FuX3NoYXJlX3N3YXBfcGFnZShvbGRfcGFnZSk7Ci0JCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CisJCWlmICghdHJ5bG9ja19wYWdlKG9sZF9wYWdlKSkgeworCQkJcGFnZV9jYWNoZV9nZXQob2xkX3BhZ2UpOworCQkJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOworCQkJbG9ja19wYWdlKG9sZF9wYWdlKTsKKwkJCXBhZ2VfdGFibGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsCisJCQkJCQkJICZwdGwpOworCQkJaWYgKCFwdGVfc2FtZSgqcGFnZV90YWJsZSwgb3JpZ19wdGUpKSB7CisJCQkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CisJCQlwYWdlX2NhY2hlX3JlbGVhc2Uob2xkX3BhZ2UpOwogCQl9CisJCXJldXNlID0gcmV1c2Vfc3dhcF9wYWdlKG9sZF9wYWdlKTsKKwkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOwogCX0gZWxzZSBpZiAodW5saWtlbHkoKHZtYS0+dm1fZmxhZ3MgJiAoVk1fV1JJVEV8Vk1fU0hBUkVEKSkgPT0KIAkJCQkJKFZNX1dSSVRFfFZNX1NIQVJFRCkpKSB7CiAJCS8qCkBAIC0xOTQzLDExICsyMDI1LDcgQEAKIAkJICogdGhyZWFkIGRvaW5nIENPVy4KIAkJICovCiAJCXB0ZXBfY2xlYXJfZmx1c2hfbm90aWZ5KHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSk7Ci0JCVNldFBhZ2VTd2FwQmFja2VkKG5ld19wYWdlKTsKLQkJbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUobmV3X3BhZ2UsIHZtYSk7CiAJCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAobmV3X3BhZ2UsIHZtYSwgYWRkcmVzcyk7Ci0KLS8vVE9ETzogIGlzIHRoaXMgc2FmZT8gIGRvX2Fub255bW91c19wYWdlKCkgZG9lcyBpdCB0aGlzIHdheS4KIAkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcGFnZV90YWJsZSwgZW50cnkpOwogCQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgZW50cnkpOwogCQlpZiAob2xkX3BhZ2UpIHsKQEAgLTE5NzMsNyArMjA1MSw3IEBACiAJCQkgKiBtYXBjb3VudCBpcyB2aXNpYmxlLiBTbyB0cmFuc2l0aXZlbHksIFRMQnMgdG8KIAkJCSAqIG9sZCBwYWdlIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgaXQgY2FuIGJlIHJldXNlZC4KIAkJCSAqLwotCQkJcGFnZV9yZW1vdmVfcm1hcChvbGRfcGFnZSwgdm1hKTsKKwkJCXBhZ2VfcmVtb3ZlX3JtYXAob2xkX3BhZ2UpOwogCQl9CiAKIAkJLyogRnJlZSB0aGUgb2xkIHBhZ2UuLiAqLwpAQCAtMjM3NCw3ICsyNDUyLDcgQEAKIAogCWluY19tbV9jb3VudGVyKG1tLCBhbm9uX3Jzcyk7CiAJcHRlID0gbWtfcHRlKHBhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKLQlpZiAod3JpdGVfYWNjZXNzICYmIGNhbl9zaGFyZV9zd2FwX3BhZ2UocGFnZSkpIHsKKwlpZiAod3JpdGVfYWNjZXNzICYmIHJldXNlX3N3YXBfcGFnZShwYWdlKSkgewogCQlwdGUgPSBtYXliZV9ta3dyaXRlKHB0ZV9ta2RpcnR5KHB0ZSksIHZtYSk7CiAJCXdyaXRlX2FjY2VzcyA9IDA7CiAJfQpAQCAtMjM4NSw3ICsyNDYzLDcgQEAKIAogCXN3YXBfZnJlZShlbnRyeSk7CiAJaWYgKHZtX3N3YXBfZnVsbCgpIHx8ICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSB8fCBQYWdlTWxvY2tlZChwYWdlKSkKLQkJcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2UocGFnZSk7CisJCXRyeV90b19mcmVlX3N3YXAocGFnZSk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAKIAlpZiAod3JpdGVfYWNjZXNzKSB7CkBAIC0yNDQyLDggKzI1MjAsNiBAQAogCWlmICghcHRlX25vbmUoKnBhZ2VfdGFibGUpKQogCQlnb3RvIHJlbGVhc2U7CiAJaW5jX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKLQlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKLQlscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShwYWdlLCB2bWEpOwogCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKIAlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwYWdlX3RhYmxlLCBlbnRyeSk7CiAKQEAgLTI1OTEsOCArMjY2Nyw2IEBACiAJCQllbnRyeSA9IG1heWJlX21rd3JpdGUocHRlX21rZGlydHkoZW50cnkpLCB2bWEpOwogCQlpZiAoYW5vbikgewogCQkJaW5jX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKLQkJCVNldFBhZ2VTd2FwQmFja2VkKHBhZ2UpOwotCQkJbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUocGFnZSwgdm1hKTsKIAkJCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKIAkJfSBlbHNlIHsKIAkJCWluY19tbV9jb3VudGVyKG1tLCBmaWxlX3Jzcyk7CkBAIC0yNjAyLDcgKzI2NzYsNiBAQAogCQkJCWdldF9wYWdlKGRpcnR5X3BhZ2UpOwogCQkJfQogCQl9Ci0vL1RPRE86ICBpcyB0aGlzIHNhZmU/ICBkb19hbm9ueW1vdXNfcGFnZSgpIGRvZXMgaXQgdGhpcyB3YXkuCiAJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHBhZ2VfdGFibGUsIGVudHJ5KTsKIAogCQkvKiBubyBuZWVkIHRvIGludmFsaWRhdGU6IGEgbm90LXByZXNlbnQgcGFnZSB3b24ndCBiZSBjYWNoZWQgKi8KQEAgLTI2NjYsMTIgKzI3MzksMTEgQEAKIAlpZiAoIXB0ZV91bm1hcF9zYW1lKG1tLCBwbWQsIHBhZ2VfdGFibGUsIG9yaWdfcHRlKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodW5saWtlbHkoISh2bWEtPnZtX2ZsYWdzICYgVk1fTk9OTElORUFSKSB8fAotCQkJISh2bWEtPnZtX2ZsYWdzICYgVk1fQ0FOX05PTkxJTkVBUikpKSB7CisJaWYgKHVubGlrZWx5KCEodm1hLT52bV9mbGFncyAmIFZNX05PTkxJTkVBUikpKSB7CiAJCS8qCiAJCSAqIFBhZ2UgdGFibGUgY29ycnVwdGVkOiBzaG93IHB0ZSBhbmQga2lsbCBwcm9jZXNzLgogCQkgKi8KLQkJcHJpbnRfYmFkX3B0ZSh2bWEsIG9yaWdfcHRlLCBhZGRyZXNzKTsKKwkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHJlc3MsIG9yaWdfcHRlLCBOVUxMKTsKIAkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKIAl9CiAKQEAgLTI5NTMsNyArMzAyNSw3IEBACiB7CiAJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfYWRkcjsKIAl1bnNpZ25lZCBsb25nIHByb3QgPSAwOwotCXZvaWQgKm1hZGRyOworCXZvaWQgX19pb21lbSAqbWFkZHI7CiAJaW50IG9mZnNldCA9IGFkZHIgJiAoUEFHRV9TSVpFLTEpOwogCiAJaWYgKGZvbGxvd19waHlzKHZtYSwgYWRkciwgd3JpdGUsICZwcm90LCAmcGh5c19hZGRyKSkKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IGIxNzM3MTE4Li5jMDgzY2Y1IDEwMDY0NAotLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jCisrKyBiL21tL21lbW9yeV9ob3RwbHVnLmMKQEAgLTIxNiw3ICsyMTYsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fbWVtaW5pdCBfX2FkZF9zZWN0aW9uKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnRfcGZuKQorc3RhdGljIGludCBfX21lbWluaXQgX19hZGRfc2VjdGlvbihpbnQgbmlkLCBzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBwaHlzX3N0YXJ0X3BmbikKIHsKIAlpbnQgbnJfcGFnZXMgPSBQQUdFU19QRVJfU0VDVElPTjsKIAlpbnQgcmV0OwpAQCAtMjM0LDcgKzIzNSw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gcmVnaXN0ZXJfbmV3X21lbW9yeShfX3Bmbl90b19zZWN0aW9uKHBoeXNfc3RhcnRfcGZuKSk7CisJcmV0dXJuIHJlZ2lzdGVyX25ld19tZW1vcnkobmlkLCBfX3Bmbl90b19zZWN0aW9uKHBoeXNfc3RhcnRfcGZuKSk7CiB9CiAKICNpZmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVAKQEAgLTI3Myw4ICsyNzQsOCBAQAogICogY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIGRlY2lkaW5nIHRoZSB6b25lIHRvIHdoaWNoIHRvCiAgKiBhZGQgdGhlIG5ldyBwYWdlcy4KICAqLwotaW50IF9fcmVmIF9fYWRkX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnRfcGZuLAotCQkgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKK2ludCBfX3JlZiBfX2FkZF9wYWdlcyhpbnQgbmlkLCBzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBwaHlzX3N0YXJ0X3BmbiwKKwkJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBpOwogCWludCBlcnIgPSAwOwpAQCAtMjg0LDcgKzI4NSw3IEBACiAJZW5kX3NlYyA9IHBmbl90b19zZWN0aW9uX25yKHBoeXNfc3RhcnRfcGZuICsgbnJfcGFnZXMgLSAxKTsKIAogCWZvciAoaSA9IHN0YXJ0X3NlYzsgaSA8PSBlbmRfc2VjOyBpKyspIHsKLQkJZXJyID0gX19hZGRfc2VjdGlvbih6b25lLCBpIDw8IFBGTl9TRUNUSU9OX1NISUZUKTsKKwkJZXJyID0gX19hZGRfc2VjdGlvbihuaWQsIHpvbmUsIGkgPDwgUEZOX1NFQ1RJT05fU0hJRlQpOwogCiAJCS8qCiAJCSAqIEVFWElTVCBpcyBmaW5hbGx5IGRlYWx0IHdpdGggYnkgaW9yZXNvdXJjZSBjb2xsaXNpb24KQEAgLTYyNiwxNSArNjI3LDEyIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqCi1ob3RyZW1vdmVfbWlncmF0ZV9hbGxvYyhzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwKLQkJCWludCAqKngpCitob3RyZW1vdmVfbWlncmF0ZV9hbGxvYyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwcml2YXRlLCBpbnQgKip4KQogewotCS8qIFRoaXMgc2hvdWxkIGJlIGltcHJvb29vb292ZWQhISAqLwotCXJldHVybiBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUl9QQUdFQ0FDSEUpOworCS8qIFRoaXMgc2hvdWxkIGJlIGltcHJvb29vb3ZlZCEhICovCisJcmV0dXJuIGFsbG9jX3BhZ2UoR0ZQX0hJR0hVU0VSX01PVkFCTEUpOwogfQogCi0KICNkZWZpbmUgTlJfT0ZGTElORV9BVF9PTkNFX1BBR0VTCSgyNTYpCiBzdGF0aWMgaW50CiBkb19taWdyYXRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmMKaW5kZXggMjE2MzFhYi4uNTUzNzM5OCAxMDA2NDQKLS0tIGEvbW0vbWlncmF0ZS5jCisrKyBiL21tL21pZ3JhdGUuYwpAQCAtMzAwLDEyICszMDAsMTAgQEAKIAkgKiBOb3cgd2Uga25vdyB0aGF0IG5vIG9uZSBlbHNlIGlzIGxvb2tpbmcgYXQgdGhlIHBhZ2UuCiAJICovCiAJZ2V0X3BhZ2UobmV3cGFnZSk7CS8qIGFkZCBjYWNoZSByZWZlcmVuY2UgKi8KLSNpZmRlZiBDT05GSUdfU1dBUAogCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CiAJCVNldFBhZ2VTd2FwQ2FjaGUobmV3cGFnZSk7CiAJCXNldF9wYWdlX3ByaXZhdGUobmV3cGFnZSwgcGFnZV9wcml2YXRlKHBhZ2UpKTsKIAl9Ci0jZW5kaWYKIAogCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHBzbG90LCBuZXdwYWdlKTsKIApAQCAtMzczLDkgKzM3MSw3IEBACiAKIAltbG9ja19taWdyYXRlX3BhZ2UobmV3cGFnZSwgcGFnZSk7CiAKLSNpZmRlZiBDT05GSUdfU1dBUAogCUNsZWFyUGFnZVN3YXBDYWNoZShwYWdlKTsKLSNlbmRpZgogCUNsZWFyUGFnZVByaXZhdGUocGFnZSk7CiAJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAwKTsKIAkvKiBwYWdlLT5tYXBwaW5nIGNvbnRhaW5zIGEgZmxhZyBmb3IgUGFnZUFub24oKSAqLwpAQCAtODQ4LDEyICs4NDQsNiBAQAogCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQkJLyoKLQkJICogQSB2YWxpZCBwYWdlIHBvaW50ZXIgdGhhdCB3aWxsIG5vdCBtYXRjaCBhbnkgb2YgdGhlCi0JCSAqIHBhZ2VzIHRoYXQgd2lsbCBiZSBtb3ZlZC4KLQkJICovCi0JCXBwLT5wYWdlID0gWkVST19QQUdFKDApOwotCiAJCWVyciA9IC1FRkFVTFQ7CiAJCXZtYSA9IGZpbmRfdm1hKG1tLCBwcC0+YWRkcik7CiAJCWlmICghdm1hIHx8ICF2bWFfbWlncmF0YWJsZSh2bWEpKQpAQCAtOTE5LDQxICs5MDksNDMgQEAKIAkJCSBjb25zdCBpbnQgX191c2VyICpub2RlcywKIAkJCSBpbnQgX191c2VyICpzdGF0dXMsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcGFnZV90b19ub2RlICpwbSA9IE5VTEw7CisJc3RydWN0IHBhZ2VfdG9fbm9kZSAqcG07CiAJbm9kZW1hc2tfdCB0YXNrX25vZGVzOwotCWludCBlcnIgPSAwOwotCWludCBpOworCXVuc2lnbmVkIGxvbmcgY2h1bmtfbnJfcGFnZXM7CisJdW5zaWduZWQgbG9uZyBjaHVua19zdGFydDsKKwlpbnQgZXJyOwogCiAJdGFza19ub2RlcyA9IGNwdXNldF9tZW1zX2FsbG93ZWQodGFzayk7CiAKLQkvKiBMaW1pdCBucl9wYWdlcyBzbyB0aGF0IHRoZSBtdWx0aXBsaWNhdGlvbiBtYXkgbm90IG92ZXJmbG93ICovCi0JaWYgKG5yX3BhZ2VzID49IFVMT05HX01BWCAvIHNpemVvZihzdHJ1Y3QgcGFnZV90b19ub2RlKSAtIDEpIHsKLQkJZXJyID0gLUUyQklHOworCWVyciA9IC1FTk9NRU07CisJcG0gPSAoc3RydWN0IHBhZ2VfdG9fbm9kZSAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBtKQogCQlnb3RvIG91dDsKLQl9Ci0KLQlwbSA9IHZtYWxsb2MoKG5yX3BhZ2VzICsgMSkgKiBzaXplb2Yoc3RydWN0IHBhZ2VfdG9fbm9kZSkpOwotCWlmICghcG0pIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJLyoKLQkgKiBHZXQgcGFyYW1ldGVycyBmcm9tIHVzZXIgc3BhY2UgYW5kIGluaXRpYWxpemUgdGhlIHBtCi0JICogYXJyYXkuIFJldHVybiB2YXJpb3VzIGVycm9ycyBpZiB0aGUgdXNlciBkaWQgc29tZXRoaW5nIHdyb25nLgorCSAqIFN0b3JlIGEgY2h1bmsgb2YgcGFnZV90b19ub2RlIGFycmF5IGluIGEgcGFnZSwKKwkgKiBidXQga2VlcCB0aGUgbGFzdCBvbmUgYXMgYSBtYXJrZXIKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQljb25zdCB2b2lkIF9fdXNlciAqcDsKKwljaHVua19ucl9wYWdlcyA9IChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IHBhZ2VfdG9fbm9kZSkpIC0gMTsKIAotCQllcnIgPSAtRUZBVUxUOwotCQlpZiAoZ2V0X3VzZXIocCwgcGFnZXMgKyBpKSkKLQkJCWdvdG8gb3V0X3BtOworCWZvciAoY2h1bmtfc3RhcnQgPSAwOworCSAgICAgY2h1bmtfc3RhcnQgPCBucl9wYWdlczsKKwkgICAgIGNodW5rX3N0YXJ0ICs9IGNodW5rX25yX3BhZ2VzKSB7CisJCWludCBqOwogCi0JCXBtW2ldLmFkZHIgPSAodW5zaWduZWQgbG9uZylwOwotCQlpZiAobm9kZXMpIHsKKwkJaWYgKGNodW5rX3N0YXJ0ICsgY2h1bmtfbnJfcGFnZXMgPiBucl9wYWdlcykKKwkJCWNodW5rX25yX3BhZ2VzID0gbnJfcGFnZXMgLSBjaHVua19zdGFydDsKKworCQkvKiBmaWxsIHRoZSBjaHVuayBwbSB3aXRoIGFkZHJzIGFuZCBub2RlcyBmcm9tIHVzZXItc3BhY2UgKi8KKwkJZm9yIChqID0gMDsgaiA8IGNodW5rX25yX3BhZ2VzOyBqKyspIHsKKwkJCWNvbnN0IHZvaWQgX191c2VyICpwOwogCQkJaW50IG5vZGU7CiAKLQkJCWlmIChnZXRfdXNlcihub2RlLCBub2RlcyArIGkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChnZXRfdXNlcihwLCBwYWdlcyArIGogKyBjaHVua19zdGFydCkpCisJCQkJZ290byBvdXRfcG07CisJCQlwbVtqXS5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIHA7CisKKwkJCWlmIChnZXRfdXNlcihub2RlLCBub2RlcyArIGogKyBjaHVua19zdGFydCkpCiAJCQkJZ290byBvdXRfcG07CiAKIAkJCWVyciA9IC1FTk9ERVY7CkBAIC05NjQsMjIgKzk1NiwyOSBAQAogCQkJaWYgKCFub2RlX2lzc2V0KG5vZGUsIHRhc2tfbm9kZXMpKQogCQkJCWdvdG8gb3V0X3BtOwogCi0JCQlwbVtpXS5ub2RlID0gbm9kZTsKLQkJfSBlbHNlCi0JCQlwbVtpXS5ub2RlID0gMDsJLyogYW55dGhpbmcgdG8gbm90IG1hdGNoIE1BWF9OVU1OT0RFUyAqLwotCX0KLQkvKiBFbmQgbWFya2VyICovCi0JcG1bbnJfcGFnZXNdLm5vZGUgPSBNQVhfTlVNTk9ERVM7CisJCQlwbVtqXS5ub2RlID0gbm9kZTsKKwkJfQogCi0JZXJyID0gZG9fbW92ZV9wYWdlX3RvX25vZGVfYXJyYXkobW0sIHBtLCBmbGFncyAmIE1QT0xfTUZfTU9WRV9BTEwpOwotCWlmIChlcnIgPj0gMCkKKwkJLyogRW5kIG1hcmtlciBmb3IgdGhpcyBjaHVuayAqLworCQlwbVtjaHVua19ucl9wYWdlc10ubm9kZSA9IE1BWF9OVU1OT0RFUzsKKworCQkvKiBNaWdyYXRlIHRoaXMgY2h1bmsgKi8KKwkJZXJyID0gZG9fbW92ZV9wYWdlX3RvX25vZGVfYXJyYXkobW0sIHBtLAorCQkJCQkJIGZsYWdzICYgTVBPTF9NRl9NT1ZFX0FMTCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfcG07CisKIAkJLyogUmV0dXJuIHN0YXR1cyBpbmZvcm1hdGlvbiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykKLQkJCWlmIChwdXRfdXNlcihwbVtpXS5zdGF0dXMsIHN0YXR1cyArIGkpKQorCQlmb3IgKGogPSAwOyBqIDwgY2h1bmtfbnJfcGFnZXM7IGorKykKKwkJCWlmIChwdXRfdXNlcihwbVtqXS5zdGF0dXMsIHN0YXR1cyArIGogKyBjaHVua19zdGFydCkpIHsKIAkJCQllcnIgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0X3BtOworCQkJfQorCX0KKwllcnIgPSAwOwogCiBvdXRfcG06Ci0JdmZyZWUocG0pOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwbSk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL21tL21sb2NrLmMgYi9tbS9tbG9jay5jCmluZGV4IDMwMzVhNTYuLmUxMjUxNTYgMTAwNjQ0Ci0tLSBhL21tL21sb2NrLmMKKysrIGIvbW0vbWxvY2suYwpAQCAtMTczLDEyICsxNzMsMTMgQEAKIAkJICAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgIT0gMCkpOwogCiAJLyoKLQkgKiBtbG9jazogICBkb24ndCBwYWdlIHBvcHVsYXRlIGlmIHBhZ2UgaGFzIFBST1RfTk9ORSBwZXJtaXNzaW9uLgotCSAqIG11bmxvY2s6IHRoZSBwYWdlcyBhbHdheXMgZG8gbXVubG9jayBhbHRocm91Z2gKLQkgKiAgICAgICAgICBpdHMgaGFzIFBST1RfTk9ORSBwZXJtaXNzaW9uLgorCSAqIG1sb2NrOiAgIGRvbid0IHBhZ2UgcG9wdWxhdGUgaWYgdm1hIGhhcyBQUk9UX05PTkUgcGVybWlzc2lvbi4KKwkgKiBtdW5sb2NrOiBhbHdheXMgZG8gbXVubG9jayBhbHRob3VnaCB0aGUgdm1hIGhhcyBQUk9UX05PTkUKKwkgKiAgICAgICAgICBwZXJtaXNzaW9uLCBvciBTSUdLSUxMIGlzIHBlbmRpbmcuCiAJICovCiAJaWYgKCFtbG9jaykKLQkJZ3VwX2ZsYWdzIHw9IEdVUF9GTEFHU19JR05PUkVfVk1BX1BFUk1JU1NJT05TOworCQlndXBfZmxhZ3MgfD0gR1VQX0ZMQUdTX0lHTk9SRV9WTUFfUEVSTUlTU0lPTlMgfAorCQkJICAgICBHVVBfRkxBR1NfSUdOT1JFX1NJR0tJTEw7CiAKIAlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQogCQlndXBfZmxhZ3MgfD0gR1VQX0ZMQUdTX1dSSVRFOwpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IDJjNzc4ZmMuLmE5MTBjMDQ1IDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC00MTMsNyArNDEzLDcgQEAKIAogc3RhdGljIHZvaWQgX192bWFfbGlua19maWxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAogCWZpbGUgPSB2bWEtPnZtX2ZpbGU7CiAJaWYgKGZpbGUpIHsKQEAgLTQ3NCwxMSArNDc0LDEwIEBACiAgKiBpbnNlcnQgdm0gc3RydWN0dXJlIGludG8gbGlzdCBhbmQgcmJ0cmVlIGFuZCBhbm9uX3ZtYSwKICAqIGJ1dCBpdCBoYXMgYWxyZWFkeSBiZWVuIGluc2VydGVkIGludG8gcHJpb190cmVlIGVhcmxpZXIuCiAgKi8KLXN0YXRpYyB2b2lkCi1fX2luc2VydF92bV9zdHJ1Y3Qoc3RydWN0IG1tX3N0cnVjdCAqIG1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCitzdGF0aWMgdm9pZCBfX2luc2VydF92bV9zdHJ1Y3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIF9fdm1hLCAqIHByZXY7Ci0Jc3RydWN0IHJiX25vZGUgKiogcmJfbGluaywgKiByYl9wYXJlbnQ7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICpfX3ZtYSwgKnByZXY7CisJc3RydWN0IHJiX25vZGUgKipyYl9saW5rLCAqcmJfcGFyZW50OwogCiAJX192bWEgPSBmaW5kX3ZtYV9wcmVwYXJlKG1tLCB2bWEtPnZtX3N0YXJ0LCZwcmV2LCAmcmJfbGluaywgJnJiX3BhcmVudCk7CiAJQlVHX09OKF9fdm1hICYmIF9fdm1hLT52bV9zdGFydCA8IHZtYS0+dm1fZW5kKTsKQEAgLTkwOCw3ICs5MDcsNyBAQAogICogVGhlIGNhbGxlciBtdXN0IGhvbGQgZG93bl93cml0ZShjdXJyZW50LT5tbS0+bW1hcF9zZW0pLgogICovCiAKLXVuc2lnbmVkIGxvbmcgZG9fbW1hcF9wZ29mZihzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKK3Vuc2lnbmVkIGxvbmcgZG9fbW1hcF9wZ29mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7CkBAIC0xNDY0LDcgKzE0NjMsNyBAQAogRVhQT1JUX1NZTUJPTChnZXRfdW5tYXBwZWRfYXJlYSk7CiAKIC8qIExvb2sgdXAgdGhlIGZpcnN0IFZNQSB3aGljaCBzYXRpc2ZpZXMgIGFkZHIgPCB2bV9lbmQsICBOVUxMIGlmIG5vbmUuICovCi1zdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiBmaW5kX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICogbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CiAKQEAgLTE1MDcsNyArMTUwNiw3IEBACiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKipwcHJldikKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEwsICpwcmV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmJfbm9kZSAqIHJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnJiX25vZGU7CiAJaWYgKCFtbSkKIAkJZ290byBvdXQ7CiAKQEAgLTE1NDEsNyArMTU0MCw3IEBACiAgKiB1cGRhdGUgYWNjb3VudGluZy4gVGhpcyBpcyBzaGFyZWQgd2l0aCBib3RoIHRoZQogICogZ3Jvdy11cCBhbmQgZ3Jvdy1kb3duIGNhc2VzLgogICovCi1zdGF0aWMgaW50IGFjY3Rfc3RhY2tfZ3Jvd3RoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGdyb3cpCitzdGF0aWMgaW50IGFjY3Rfc3RhY2tfZ3Jvd3RoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZ3JvdykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CiAJc3RydWN0IHJsaW1pdCAqcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbTsKQEAgLTIwOTEsNiArMjA5MCw5IEBACiAJYXJjaF9leGl0X21tYXAobW0pOwogCW1tdV9ub3RpZmllcl9yZWxlYXNlKG1tKTsKIAorCWlmICghbW0tPm1tYXApCS8qIENhbiBoYXBwZW4gaWYgZHVwX21tYXAoKSByZWNlaXZlZCBhbiBPT00gKi8KKwkJcmV0dXJuOworCiAJaWYgKG1tLT5sb2NrZWRfdm0pIHsKIAkJdm1hID0gbW0tPm1tYXA7CiAJCXdoaWxlICh2bWEpIHsKQEAgLTIxMDMsNyArMjEwNSw3IEBACiAJbHJ1X2FkZF9kcmFpbigpOwogCWZsdXNoX2NhY2hlX21tKG1tKTsKIAl0bGIgPSB0bGJfZ2F0aGVyX21tdShtbSwgMSk7Ci0JLyogRG9uJ3QgdXBkYXRlX2hpd2F0ZXJfcnNzKG1tKSBoZXJlLCBkb19leGl0IGFscmVhZHkgZGlkICovCisJLyogdXBkYXRlX2hpd2F0ZXJfcnNzKG1tKSBoZXJlPyBidXQgbm9ib2R5IHNob3VsZCBiZSBsb29raW5nICovCiAJLyogVXNlIC0xIGhlcmUgdG8gZW5zdXJlIGFsbCBWTUFzIGluIHRoZSBtbSBhcmUgdW5tYXBwZWQgKi8KIAllbmQgPSB1bm1hcF92bWFzKCZ0bGIsIHZtYSwgMCwgLTEsICZucl9hY2NvdW50ZWQsIE5VTEwpOwogCXZtX3VuYWNjdF9tZW1vcnkobnJfYWNjb3VudGVkKTsKZGlmZiAtLWdpdCBhL21tL21wcm90ZWN0LmMgYi9tbS9tcHJvdGVjdC5jCmluZGV4IGNmYjRjNDguLmQwZjZlN2MgMTAwNjQ0Ci0tLSBhL21tL21wcm90ZWN0LmMKKysrIGIvbW0vbXByb3RlY3QuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtNTksOCArNjAsNyBAQAogCQkJCXB0ZW50ID0gcHRlX21rd3JpdGUocHRlbnQpOwogCiAJCQlwdGVwX21vZGlmeV9wcm90X2NvbW1pdChtbSwgYWRkciwgcHRlLCBwdGVudCk7Ci0jaWZkZWYgQ09ORklHX01JR1JBVElPTgotCQl9IGVsc2UgaWYgKCFwdGVfZmlsZShvbGRwdGUpKSB7CisJCX0gZWxzZSBpZiAoUEFHRV9NSUdSQVRJT04gJiYgIXB0ZV9maWxlKG9sZHB0ZSkpIHsKIAkJCXN3cF9lbnRyeV90IGVudHJ5ID0gcHRlX3RvX3N3cF9lbnRyeShvbGRwdGUpOwogCiAJCQlpZiAoaXNfd3JpdGVfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSkgewpAQCAtNzIsOSArNzIsNyBAQAogCQkJCXNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSwKIAkJCQkJc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpOwogCQkJfQotI2VuZGlmCiAJCX0KLQogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwogCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOwogCXB0ZV91bm1hcF91bmxvY2socHRlIC0gMSwgcHRsKTsKZGlmZiAtLWdpdCBhL21tL29vbV9raWxsLmMgYi9tbS9vb21fa2lsbC5jCmluZGV4IDU1OGY5YWZlLi42YjllNzU4IDEwMDY0NAotLS0gYS9tbS9vb21fa2lsbC5jCisrKyBiL21tL29vbV9raWxsLmMKQEAgLTMxLDcgKzMxLDcgQEAKIGludCBzeXNjdGxfcGFuaWNfb25fb29tOwogaW50IHN5c2N0bF9vb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2s7CiBpbnQgc3lzY3RsX29vbV9kdW1wX3Rhc2tzOwotc3RhdGljIERFRklORV9TUElOTE9DSyh6b25lX3NjYW5fbXV0ZXgpOworc3RhdGljIERFRklORV9TUElOTE9DSyh6b25lX3NjYW5fbG9jayk7CiAvKiAjZGVmaW5lIERFQlVHICovCiAKIC8qKgpAQCAtMzkyLDYgKzM5Miw5IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGludm9rZWQgb29tLWtpbGxlcjogIgogCQkJImdmcF9tYXNrPTB4JXgsIG9yZGVyPSVkLCBvb21raWxsYWRqPSVkXG4iLAogCQkJY3VycmVudC0+Y29tbSwgZ2ZwX21hc2ssIG9yZGVyLCBjdXJyZW50LT5vb21raWxsYWRqKTsKKwkJdGFza19sb2NrKGN1cnJlbnQpOworCQljcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoY3VycmVudCk7CisJCXRhc2tfdW5sb2NrKGN1cnJlbnQpOwogCQlkdW1wX3N0YWNrKCk7CiAJCXNob3dfbWVtKCk7CiAJCWlmIChzeXNjdGxfb29tX2R1bXBfdGFza3MpCkBAIC00NzAsNyArNDczLDcgQEAKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAlpbnQgcmV0ID0gMTsKIAotCXNwaW5fbG9jaygmem9uZV9zY2FuX211dGV4KTsKKwlzcGluX2xvY2soJnpvbmVfc2Nhbl9sb2NrKTsKIAlmb3JfZWFjaF96b25lX3pvbmVsaXN0KHpvbmUsIHosIHpvbmVsaXN0LCBnZnBfem9uZShnZnBfbWFzaykpIHsKIAkJaWYgKHpvbmVfaXNfb29tX2xvY2tlZCh6b25lKSkgewogCQkJcmV0ID0gMDsKQEAgLTQ4MCw3ICs0ODMsNyBAQAogCiAJZm9yX2VhY2hfem9uZV96b25lbGlzdCh6b25lLCB6LCB6b25lbGlzdCwgZ2ZwX3pvbmUoZ2ZwX21hc2spKSB7CiAJCS8qCi0JCSAqIExvY2sgZWFjaCB6b25lIGluIHRoZSB6b25lbGlzdCB1bmRlciB6b25lX3NjYW5fbXV0ZXggc28gYQorCQkgKiBMb2NrIGVhY2ggem9uZSBpbiB0aGUgem9uZWxpc3QgdW5kZXIgem9uZV9zY2FuX2xvY2sgc28gYQogCQkgKiBwYXJhbGxlbCBpbnZvY2F0aW9uIG9mIHRyeV9zZXRfem9uZV9vb20oKSBkb2Vzbid0IHN1Y2NlZWQKIAkJICogd2hlbiBpdCBzaG91bGRuJ3QuCiAJCSAqLwpAQCAtNDg4LDcgKzQ5MSw3IEBACiAJfQogCiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJnpvbmVfc2Nhbl9tdXRleCk7CisJc3Bpbl91bmxvY2soJnpvbmVfc2Nhbl9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MDIsMTEgKzUwNSw3NCBAQAogCXN0cnVjdCB6b25lcmVmICp6OwogCXN0cnVjdCB6b25lICp6b25lOwogCi0Jc3Bpbl9sb2NrKCZ6b25lX3NjYW5fbXV0ZXgpOworCXNwaW5fbG9jaygmem9uZV9zY2FuX2xvY2spOwogCWZvcl9lYWNoX3pvbmVfem9uZWxpc3Qoem9uZSwgeiwgem9uZWxpc3QsIGdmcF96b25lKGdmcF9tYXNrKSkgewogCQl6b25lX2NsZWFyX2ZsYWcoem9uZSwgWk9ORV9PT01fTE9DS0VEKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnpvbmVfc2Nhbl9tdXRleCk7CisJc3Bpbl91bmxvY2soJnpvbmVfc2Nhbl9sb2NrKTsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGFza2xpc3RfbG9jayBoZWxkIGZvciByZWFkLgorICovCitzdGF0aWMgdm9pZCBfX291dF9vZl9tZW1vcnkoZ2ZwX3QgZ2ZwX21hc2ssIGludCBvcmRlcikKK3sKKwlpZiAoc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzaykgeworCQlvb21fa2lsbF9wcm9jZXNzKGN1cnJlbnQsIGdmcF9tYXNrLCBvcmRlciwgMCwgTlVMTCwKKwkJCQkiT3V0IG9mIG1lbW9yeSAob29tX2tpbGxfYWxsb2NhdGluZ190YXNrKSIpOworCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBwb2ludHM7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKworcmV0cnk6CisJCS8qCisJCSAqIFJhbWJvIG1vZGU6IFNob290IGRvd24gYSBwcm9jZXNzIGFuZCBob3BlIGl0IHNvbHZlcyB3aGF0ZXZlcgorCQkgKiBpc3N1ZXMgd2UgbWF5IGhhdmUuCisJCSAqLworCQlwID0gc2VsZWN0X2JhZF9wcm9jZXNzKCZwb2ludHMsIE5VTEwpOworCisJCWlmIChQVFJfRVJSKHApID09IC0xVUwpCisJCQlyZXR1cm47CisKKwkJLyogRm91bmQgbm90aGluZz8hPyEgRWl0aGVyIHdlIGhhbmcgZm9yZXZlciwgb3Igd2UgcGFuaWMuICovCisJCWlmICghcCkgeworCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQkJcGFuaWMoIk91dCBvZiBtZW1vcnkgYW5kIG5vIGtpbGxhYmxlIHByb2Nlc3Nlcy4uLlxuIik7CisJCX0KKworCQlpZiAob29tX2tpbGxfcHJvY2VzcyhwLCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKKwkJCQkgICAgICJPdXQgb2YgbWVtb3J5IikpCisJCQlnb3RvIHJldHJ5OworCX0KK30KKworLyoKKyAqIHBhZ2VmYXVsdCBoYW5kbGVyIGNhbGxzIGludG8gaGVyZSBiZWNhdXNlIGl0IGlzIG91dCBvZiBtZW1vcnkgYnV0CisgKiBkb2Vzbid0IGtub3cgZXhhY3RseSBob3cgb3Igd2h5LgorICovCit2b2lkIHBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmcmVlZCA9IDA7CisKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZvb21fbm90aWZ5X2xpc3QsIDAsICZmcmVlZCk7CisJaWYgKGZyZWVkID4gMCkKKwkJLyogR290IHNvbWUgbWVtb3J5IGJhY2sgaW4gdGhlIGxhc3Qgc2Vjb25kLiAqLworCQlyZXR1cm47CisKKwlpZiAoc3lzY3RsX3BhbmljX29uX29vbSkKKwkJcGFuaWMoIm91dCBvZiBtZW1vcnkgZnJvbSBwYWdlIGZhdWx0LiBwYW5pY19vbl9vb20gaXMgc2VsZWN0ZWQuXG4iKTsKKworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJX19vdXRfb2ZfbWVtb3J5KDAsIDApOyAvKiB1bmtub3duIGdmcF9tYXNrIGFuZCBvcmRlciAqLworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCS8qCisJICogR2l2ZSAicCIgYSBnb29kIGNoYW5jZSBvZiBraWxsaW5nIGl0c2VsZiBiZWZvcmUgd2UKKwkgKiByZXRyeSB0byBhbGxvY2F0ZSBtZW1vcnkuCisJICovCisJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9NRU1ESUUpKQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIH0KIAogLyoqCkBAIC01MjIsOCArNTg4LDYgQEAKICAqLwogdm9pZCBvdXRfb2ZfbWVtb3J5KHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsIGdmcF90IGdmcF9tYXNrLCBpbnQgb3JkZXIpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCXVuc2lnbmVkIGxvbmcgcG9pbnRzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZyZWVkID0gMDsKIAllbnVtIG9vbV9jb25zdHJhaW50IGNvbnN0cmFpbnQ7CiAKQEAgLTU0NCw3ICs2MDgsNyBAQAogCiAJc3dpdGNoIChjb25zdHJhaW50KSB7CiAJY2FzZSBDT05TVFJBSU5UX01FTU9SWV9QT0xJQ1k6Ci0JCW9vbV9raWxsX3Byb2Nlc3MoY3VycmVudCwgZ2ZwX21hc2ssIG9yZGVyLCBwb2ludHMsIE5VTEwsCisJCW9vbV9raWxsX3Byb2Nlc3MoY3VycmVudCwgZ2ZwX21hc2ssIG9yZGVyLCAwLCBOVUxMLAogCQkJCSJObyBhdmFpbGFibGUgbWVtb3J5IChNUE9MX0JJTkQpIik7CiAJCWJyZWFrOwogCkBAIC01NTMsMzUgKzYxNywxMCBAQAogCQkJcGFuaWMoIm91dCBvZiBtZW1vcnkuIHBhbmljX29uX29vbSBpcyBzZWxlY3RlZFxuIik7CiAJCS8qIEZhbGwtdGhyb3VnaCAqLwogCWNhc2UgQ09OU1RSQUlOVF9DUFVTRVQ6Ci0JCWlmIChzeXNjdGxfb29tX2tpbGxfYWxsb2NhdGluZ190YXNrKSB7Ci0JCQlvb21fa2lsbF9wcm9jZXNzKGN1cnJlbnQsIGdmcF9tYXNrLCBvcmRlciwgcG9pbnRzLCBOVUxMLAotCQkJCQkiT3V0IG9mIG1lbW9yeSAob29tX2tpbGxfYWxsb2NhdGluZ190YXNrKSIpOwotCQkJYnJlYWs7Ci0JCX0KLXJldHJ5OgotCQkvKgotCQkgKiBSYW1ibyBtb2RlOiBTaG9vdCBkb3duIGEgcHJvY2VzcyBhbmQgaG9wZSBpdCBzb2x2ZXMgd2hhdGV2ZXIKLQkJICogaXNzdWVzIHdlIG1heSBoYXZlLgotCQkgKi8KLQkJcCA9IHNlbGVjdF9iYWRfcHJvY2VzcygmcG9pbnRzLCBOVUxMKTsKLQotCQlpZiAoUFRSX0VSUihwKSA9PSAtMVVMKQotCQkJZ290byBvdXQ7Ci0KLQkJLyogRm91bmQgbm90aGluZz8hPyEgRWl0aGVyIHdlIGhhbmcgZm9yZXZlciwgb3Igd2UgcGFuaWMuICovCi0JCWlmICghcCkgewotCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCQkJcGFuaWMoIk91dCBvZiBtZW1vcnkgYW5kIG5vIGtpbGxhYmxlIHByb2Nlc3Nlcy4uLlxuIik7Ci0JCX0KLQotCQlpZiAob29tX2tpbGxfcHJvY2VzcyhwLCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKLQkJCQkgICAgICJPdXQgb2YgbWVtb3J5IikpCi0JCQlnb3RvIHJldHJ5OwotCisJCV9fb3V0X29mX21lbW9yeShnZnBfbWFzaywgb3JkZXIpOwogCQlicmVhazsKIAl9CiAKLW91dDoKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggMjk3MGUzNS4uYjQ5M2RiNyAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC02OSw2ICs2OSwxMiBAQAogaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW8gPSA1OwogCiAvKgorICogZGlydHlfYmFja2dyb3VuZF9ieXRlcyBzdGFydHMgYXQgMCAoZGlzYWJsZWQpIHNvIHRoYXQgaXQgaXMgYSBmdW5jdGlvbiBvZgorICogZGlydHlfYmFja2dyb3VuZF9yYXRpbyAqIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIG1lbW9yeQorICovCit1bnNpZ25lZCBsb25nIGRpcnR5X2JhY2tncm91bmRfYnl0ZXM7CisKKy8qCiAgKiBmcmVlIGhpZ2htZW0gd2lsbCBub3QgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSB0b3RhbCBmcmVlIG1lbW9yeQogICogZm9yIGNhbGN1bGF0aW5nIGZyZWUgcmF0aW9zIGlmIHZtX2hpZ2htZW1faXNfZGlydHlhYmxlIGlzIHRydWUKICAqLwpAQCAtODAsNiArODYsMTIgQEAKIGludCB2bV9kaXJ0eV9yYXRpbyA9IDEwOwogCiAvKgorICogdm1fZGlydHlfYnl0ZXMgc3RhcnRzIGF0IDAgKGRpc2FibGVkKSBzbyB0aGF0IGl0IGlzIGEgZnVuY3Rpb24gb2YKKyAqIHZtX2RpcnR5X3JhdGlvICogdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgbWVtb3J5CisgKi8KK3Vuc2lnbmVkIGxvbmcgdm1fZGlydHlfYnl0ZXM7CisKKy8qCiAgKiBUaGUgaW50ZXJ2YWwgYmV0d2VlbiBga3VwZGF0ZSctc3R5bGUgd3JpdGViYWNrcywgaW4gamlmZmllcwogICovCiBpbnQgZGlydHlfd3JpdGViYWNrX2ludGVydmFsID0gNSAqIEhaOwpAQCAtMTM1LDIzICsxNDcsNzUgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGRpcnR5X3RvdGFsOwogCi0JZGlydHlfdG90YWwgPSAodm1fZGlydHlfcmF0aW8gKiBkZXRlcm1pbmVfZGlydHlhYmxlX21lbW9yeSgpKSAvIDEwMDsKKwlpZiAodm1fZGlydHlfYnl0ZXMpCisJCWRpcnR5X3RvdGFsID0gdm1fZGlydHlfYnl0ZXMgLyBQQUdFX1NJWkU7CisJZWxzZQorCQlkaXJ0eV90b3RhbCA9ICh2bV9kaXJ0eV9yYXRpbyAqIGRldGVybWluZV9kaXJ0eWFibGVfbWVtb3J5KCkpIC8KKwkJCQkxMDA7CiAJcmV0dXJuIDIgKyBpbG9nMihkaXJ0eV90b3RhbCAtIDEpOwogfQogCiAvKgotICogdXBkYXRlIHRoZSBwZXJpb2Qgd2hlbiB0aGUgZGlydHkgcmF0aW8gY2hhbmdlcy4KKyAqIHVwZGF0ZSB0aGUgcGVyaW9kIHdoZW4gdGhlIGRpcnR5IHRocmVzaG9sZCBjaGFuZ2VzLgogICovCitzdGF0aWMgdm9pZCB1cGRhdGVfY29tcGxldGlvbl9wZXJpb2Qodm9pZCkKK3sKKwlpbnQgc2hpZnQgPSBjYWxjX3BlcmlvZF9zaGlmdCgpOworCXByb3BfY2hhbmdlX3NoaWZ0KCZ2bV9jb21wbGV0aW9ucywgc2hpZnQpOworCXByb3BfY2hhbmdlX3NoaWZ0KCZ2bV9kaXJ0aWVzLCBzaGlmdCk7Cit9CisKK2ludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJbG9mZl90ICpwcG9zKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJldCA9PSAwICYmIHdyaXRlKQorCQlkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZGlydHlfYmFja2dyb3VuZF9ieXRlc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJldCA9PSAwICYmIHdyaXRlKQorCQlkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvID0gMDsKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgZGlydHlfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IG9sZF9yYXRpbyA9IHZtX2RpcnR5X3JhdGlvOwotCWludCByZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaW50IHJldDsKKworCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAocmV0ID09IDAgJiYgd3JpdGUgJiYgdm1fZGlydHlfcmF0aW8gIT0gb2xkX3JhdGlvKSB7Ci0JCWludCBzaGlmdCA9IGNhbGNfcGVyaW9kX3NoaWZ0KCk7Ci0JCXByb3BfY2hhbmdlX3NoaWZ0KCZ2bV9jb21wbGV0aW9ucywgc2hpZnQpOwotCQlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fZGlydGllcywgc2hpZnQpOworCQl1cGRhdGVfY29tcGxldGlvbl9wZXJpb2QoKTsKKwkJdm1fZGlydHlfYnl0ZXMgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBkaXJ0eV9ieXRlc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcykKK3sKKwlpbnQgb2xkX2J5dGVzID0gdm1fZGlydHlfYnl0ZXM7CisJaW50IHJldDsKKworCXJldCA9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmIChyZXQgPT0gMCAmJiB3cml0ZSAmJiB2bV9kaXJ0eV9ieXRlcyAhPSBvbGRfYnl0ZXMpIHsKKwkJdXBkYXRlX2NvbXBsZXRpb25fcGVyaW9kKCk7CisJCXZtX2RpcnR5X3JhdGlvID0gMDsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTM2MiwyNiArNDI2LDMyIEBACiB9CiAKIHZvaWQKLWdldF9kaXJ0eV9saW1pdHMobG9uZyAqcGJhY2tncm91bmQsIGxvbmcgKnBkaXJ0eSwgbG9uZyAqcGJkaV9kaXJ0eSwKLQkJIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpCitnZXRfZGlydHlfbGltaXRzKHVuc2lnbmVkIGxvbmcgKnBiYWNrZ3JvdW5kLCB1bnNpZ25lZCBsb25nICpwZGlydHksCisJCSB1bnNpZ25lZCBsb25nICpwYmRpX2RpcnR5LCBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKQogewotCWludCBiYWNrZ3JvdW5kX3JhdGlvOwkJLyogUGVyY2VudGFnZXMgKi8KLQlpbnQgZGlydHlfcmF0aW87Ci0JbG9uZyBiYWNrZ3JvdW5kOwotCWxvbmcgZGlydHk7CisJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kOworCXVuc2lnbmVkIGxvbmcgZGlydHk7CiAJdW5zaWduZWQgbG9uZyBhdmFpbGFibGVfbWVtb3J5ID0gZGV0ZXJtaW5lX2RpcnR5YWJsZV9tZW1vcnkoKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAotCWRpcnR5X3JhdGlvID0gdm1fZGlydHlfcmF0aW87Ci0JaWYgKGRpcnR5X3JhdGlvIDwgNSkKLQkJZGlydHlfcmF0aW8gPSA1OworCWlmICh2bV9kaXJ0eV9ieXRlcykKKwkJZGlydHkgPSBESVZfUk9VTkRfVVAodm1fZGlydHlfYnl0ZXMsIFBBR0VfU0laRSk7CisJZWxzZSB7CisJCWludCBkaXJ0eV9yYXRpbzsKIAotCWJhY2tncm91bmRfcmF0aW8gPSBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvOwotCWlmIChiYWNrZ3JvdW5kX3JhdGlvID49IGRpcnR5X3JhdGlvKQotCQliYWNrZ3JvdW5kX3JhdGlvID0gZGlydHlfcmF0aW8gLyAyOworCQlkaXJ0eV9yYXRpbyA9IHZtX2RpcnR5X3JhdGlvOworCQlpZiAoZGlydHlfcmF0aW8gPCA1KQorCQkJZGlydHlfcmF0aW8gPSA1OworCQlkaXJ0eSA9IChkaXJ0eV9yYXRpbyAqIGF2YWlsYWJsZV9tZW1vcnkpIC8gMTAwOworCX0KIAotCWJhY2tncm91bmQgPSAoYmFja2dyb3VuZF9yYXRpbyAqIGF2YWlsYWJsZV9tZW1vcnkpIC8gMTAwOwotCWRpcnR5ID0gKGRpcnR5X3JhdGlvICogYXZhaWxhYmxlX21lbW9yeSkgLyAxMDA7CisJaWYgKGRpcnR5X2JhY2tncm91bmRfYnl0ZXMpCisJCWJhY2tncm91bmQgPSBESVZfUk9VTkRfVVAoZGlydHlfYmFja2dyb3VuZF9ieXRlcywgUEFHRV9TSVpFKTsKKwllbHNlCisJCWJhY2tncm91bmQgPSAoZGlydHlfYmFja2dyb3VuZF9yYXRpbyAqIGF2YWlsYWJsZV9tZW1vcnkpIC8gMTAwOworCisJaWYgKGJhY2tncm91bmQgPj0gZGlydHkpCisJCWJhY2tncm91bmQgPSBkaXJ0eSAvIDI7CiAJdHNrID0gY3VycmVudDsKIAlpZiAodHNrLT5mbGFncyAmIFBGX0xFU1NfVEhST1RUTEUgfHwgcnRfdGFzayh0c2spKSB7CiAJCWJhY2tncm91bmQgKz0gYmFja2dyb3VuZCAvIDQ7CkBAIC00MjMsOSArNDkzLDkgQEAKIHsKIAlsb25nIG5yX3JlY2xhaW1hYmxlLCBiZGlfbnJfcmVjbGFpbWFibGU7CiAJbG9uZyBucl93cml0ZWJhY2ssIGJkaV9ucl93cml0ZWJhY2s7Ci0JbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKLQlsb25nIGRpcnR5X3RocmVzaDsKLQlsb25nIGJkaV90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGRpcnR5X3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGJkaV90aHJlc2g7CiAJdW5zaWduZWQgbG9uZyBwYWdlc193cml0dGVuID0gMDsKIAl1bnNpZ25lZCBsb25nIHdyaXRlX2NodW5rID0gc3luY193cml0ZWJhY2tfcGFnZXMoKTsKIApAQCAtNTgwLDggKzY1MCw4IEBACiAKIHZvaWQgdGhyb3R0bGVfdm1fd3JpdGVvdXQoZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKLQlsb25nIGRpcnR5X3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGJhY2tncm91bmRfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOwogCiAgICAgICAgIGZvciAoIDsgOyApIHsKIAkJZ2V0X2RpcnR5X2xpbWl0cygmYmFja2dyb3VuZF90aHJlc2gsICZkaXJ0eV90aHJlc2gsIE5VTEwsIE5VTEwpOwpAQCAtNjI0LDggKzY5NCw4IEBACiAJfTsKIAogCWZvciAoIDsgOyApIHsKLQkJbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKLQkJbG9uZyBkaXJ0eV90aHJlc2g7CisJCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF90aHJlc2g7CisJCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOwogCiAJCWdldF9kaXJ0eV9saW1pdHMoJmJhY2tncm91bmRfdGhyZXNoLCAmZGlydHlfdGhyZXNoLCBOVUxMLCBOVUxMKTsKIAkJaWYgKGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfRElSVFkpICsKQEAgLTg2OCw5ICs5MzgsMTEgQEAKIAlpbnQgZG9uZSA9IDA7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAlpbnQgbnJfcGFnZXM7CisJcGdvZmZfdCB1bmluaXRpYWxpemVkX3Zhcih3cml0ZWJhY2tfaW5kZXgpOwogCXBnb2ZmX3QgaW5kZXg7CiAJcGdvZmZfdCBlbmQ7CQkvKiBJbmNsdXNpdmUgKi8KLQlpbnQgc2Nhbm5lZCA9IDA7CisJcGdvZmZfdCBkb25lX2luZGV4OworCWludCBjeWNsZWQ7CiAJaW50IHJhbmdlX3dob2xlID0gMDsKIAlsb25nIG5yX3RvX3dyaXRlID0gd2JjLT5ucl90b193cml0ZTsKIApAQCAtODgxLDgzICs5NTMsMTM0IEBACiAKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDApOwogCWlmICh3YmMtPnJhbmdlX2N5Y2xpYykgewotCQlpbmRleCA9IG1hcHBpbmctPndyaXRlYmFja19pbmRleDsgLyogU3RhcnQgZnJvbSBwcmV2IG9mZnNldCAqLworCQl3cml0ZWJhY2tfaW5kZXggPSBtYXBwaW5nLT53cml0ZWJhY2tfaW5kZXg7IC8qIHByZXYgb2Zmc2V0ICovCisJCWluZGV4ID0gd3JpdGViYWNrX2luZGV4OworCQlpZiAoaW5kZXggPT0gMCkKKwkJCWN5Y2xlZCA9IDE7CisJCWVsc2UKKwkJCWN5Y2xlZCA9IDA7CiAJCWVuZCA9IC0xOwogCX0gZWxzZSB7CiAJCWluZGV4ID0gd2JjLT5yYW5nZV9zdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCQllbmQgPSB3YmMtPnJhbmdlX2VuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCQlpZiAod2JjLT5yYW5nZV9zdGFydCA9PSAwICYmIHdiYy0+cmFuZ2VfZW5kID09IExMT05HX01BWCkKIAkJCXJhbmdlX3dob2xlID0gMTsKLQkJc2Nhbm5lZCA9IDE7CisJCWN5Y2xlZCA9IDE7IC8qIGlnbm9yZSByYW5nZV9jeWNsaWMgdGVzdHMgKi8KIAl9CiByZXRyeToKLQl3aGlsZSAoIWRvbmUgJiYgKGluZGV4IDw9IGVuZCkgJiYKLQkgICAgICAgKG5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXBfdGFnKCZwdmVjLCBtYXBwaW5nLCAmaW5kZXgsCi0JCQkJCSAgICAgIFBBR0VDQUNIRV9UQUdfRElSVFksCi0JCQkJCSAgICAgIG1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFLTEpICsgMSkpKSB7Ci0JCXVuc2lnbmVkIGk7CisJZG9uZV9pbmRleCA9IGluZGV4OworCXdoaWxlICghZG9uZSAmJiAoaW5kZXggPD0gZW5kKSkgeworCQlpbnQgaTsKIAotCQlzY2FubmVkID0gMTsKKwkJbnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cF90YWcoJnB2ZWMsIG1hcHBpbmcsICZpbmRleCwKKwkJCSAgICAgIFBBR0VDQUNIRV9UQUdfRElSVFksCisJCQkgICAgICBtaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRS0xKSArIDEpOworCQlpZiAobnJfcGFnZXMgPT0gMCkKKwkJCWJyZWFrOworCiAJCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CiAKIAkJCS8qCi0JCQkgKiBBdCB0aGlzIHBvaW50IHdlIGhvbGQgbmVpdGhlciBtYXBwaW5nLT50cmVlX2xvY2sgbm9yCi0JCQkgKiBsb2NrIG9uIHRoZSBwYWdlIGl0c2VsZjogdGhlIHBhZ2UgbWF5IGJlIHRydW5jYXRlZCBvcgotCQkJICogaW52YWxpZGF0ZWQgKGNoYW5naW5nIHBhZ2UtPm1hcHBpbmcgdG8gTlVMTCksIG9yIGV2ZW4KLQkJCSAqIHN3aXp6bGVkIGJhY2sgZnJvbSBzd2FwcGVyX3NwYWNlIHRvIHRtcGZzIGZpbGUKLQkJCSAqIG1hcHBpbmcKKwkJCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBwYWdlIG1heSBiZSB0cnVuY2F0ZWQgb3IKKwkJCSAqIGludmFsaWRhdGVkIChjaGFuZ2luZyBwYWdlLT5tYXBwaW5nIHRvIE5VTEwpLCBvcgorCQkJICogZXZlbiBzd2l6emxlZCBiYWNrIGZyb20gc3dhcHBlcl9zcGFjZSB0byB0bXBmcyBmaWxlCisJCQkgKiBtYXBwaW5nLiBIb3dldmVyLCBwYWdlLT5pbmRleCB3aWxsIG5vdCBjaGFuZ2UKKwkJCSAqIGJlY2F1c2Ugd2UgaGF2ZSBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS4KIAkJCSAqLworCQkJaWYgKHBhZ2UtPmluZGV4ID4gZW5kKSB7CisJCQkJLyoKKwkJCQkgKiBjYW4ndCBiZSByYW5nZV9jeWNsaWMgKDFzdCBwYXNzKSBiZWNhdXNlCisJCQkJICogZW5kID09IC0xIGluIHRoYXQgY2FzZS4KKwkJCQkgKi8KKwkJCQlkb25lID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZG9uZV9pbmRleCA9IHBhZ2UtPmluZGV4ICsgMTsKKwogCQkJbG9ja19wYWdlKHBhZ2UpOwogCisJCQkvKgorCQkJICogUGFnZSB0cnVuY2F0ZWQgb3IgaW52YWxpZGF0ZWQuIFdlIGNhbiBmcmVlbHkgc2tpcCBpdAorCQkJICogdGhlbiwgZXZlbiBmb3IgZGF0YSBpbnRlZ3JpdHkgb3BlcmF0aW9uczogdGhlIHBhZ2UKKwkJCSAqIGhhcyBkaXNhcHBlYXJlZCBjb25jdXJyZW50bHksIHNvIHRoZXJlIGNvdWxkIGJlIG5vCisJCQkgKiByZWFsIGV4cGVjdGF0aW9uIG9mIHRoaXMgZGF0YSBpbnRlcml0eSBvcGVyYXRpb24KKwkJCSAqIGV2ZW4gaWYgdGhlcmUgaXMgbm93IGEgbmV3LCBkaXJ0eSBwYWdlIGF0IHRoZSBzYW1lCisJCQkgKiBwYWdlY2FjaGUgYWRkcmVzcy4KKwkJCSAqLwogCQkJaWYgKHVubGlrZWx5KHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykpIHsKK2NvbnRpbnVlX3VubG9jazoKIAkJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJaWYgKCF3YmMtPnJhbmdlX2N5Y2xpYyAmJiBwYWdlLT5pbmRleCA+IGVuZCkgewotCQkJCWRvbmUgPSAxOwotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCWNvbnRpbnVlOworCQkJaWYgKCFQYWdlRGlydHkocGFnZSkpIHsKKwkJCQkvKiBzb21lb25lIHdyb3RlIGl0IGZvciB1cyAqLworCQkJCWdvdG8gY29udGludWVfdW5sb2NrOwogCQkJfQogCi0JCQlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19OT05FKQotCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0KLQkJCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpIHx8Ci0JCQkgICAgIWNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKHBhZ2UpKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJY29udGludWU7CisJCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgeworCQkJCWlmICh3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX05PTkUpCisJCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisJCQkJZWxzZQorCQkJCQlnb3RvIGNvbnRpbnVlX3VubG9jazsKIAkJCX0KIAorCQkJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCQkJaWYgKCFjbGVhcl9wYWdlX2RpcnR5X2Zvcl9pbyhwYWdlKSkKKwkJCQlnb3RvIGNvbnRpbnVlX3VubG9jazsKKwogCQkJcmV0ID0gKCp3cml0ZXBhZ2UpKHBhZ2UsIHdiYywgZGF0YSk7CisJCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJCWlmIChyZXQgPT0gQU9QX1dSSVRFUEFHRV9BQ1RJVkFURSkgeworCQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQkJcmV0ID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBkb25lX2luZGV4IGlzIHNldCBwYXN0IHRoaXMgcGFnZSwKKwkJCQkJICogc28gbWVkaWEgZXJyb3JzIHdpbGwgbm90IGNob2tlCisJCQkJCSAqIGJhY2tncm91bmQgd3JpdGVvdXQgZm9yIHRoZSBlbnRpcmUKKwkJCQkJICogZmlsZS4gVGhpcyBoYXMgY29uc2VxdWVuY2VzIGZvcgorCQkJCQkgKiByYW5nZV9jeWNsaWMgc2VtYW50aWNzIChpZS4gaXQgbWF5CisJCQkJCSAqIG5vdCBiZSBzdWl0YWJsZSBmb3IgZGF0YSBpbnRlZ3JpdHkKKwkJCQkJICogd3JpdGVvdXQpLgorCQkJCQkgKi8KKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKyAJCQl9CiAKLQkJCWlmICh1bmxpa2VseShyZXQgPT0gQU9QX1dSSVRFUEFHRV9BQ1RJVkFURSkpIHsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQlyZXQgPSAwOworCQkJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSkgeworCQkJCXdiYy0+bnJfdG9fd3JpdGUtLTsKKwkJCQlpZiAod2JjLT5ucl90b193cml0ZSA8PSAwKSB7CisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CiAJCQl9Ci0JCQlpZiAocmV0IHx8ICgtLW5yX3RvX3dyaXRlIDw9IDApKQotCQkJCWRvbmUgPSAxOwogCQkJaWYgKHdiYy0+bm9uYmxvY2tpbmcgJiYgYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpKSB7CiAJCQkJd2JjLT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uID0gMTsKIAkJCQlkb25lID0gMTsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9Ci0JaWYgKCFzY2FubmVkICYmICFkb25lKSB7CisJaWYgKCFjeWNsZWQpIHsKIAkJLyoKKwkJICogcmFuZ2VfY3ljbGljOgogCQkgKiBXZSBoaXQgdGhlIGxhc3QgcGFnZSBhbmQgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGJlIGRvbmU6IHdyYXAKIAkJICogYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUKIAkJICovCi0JCXNjYW5uZWQgPSAxOworCQljeWNsZWQgPSAxOwogCQlpbmRleCA9IDA7CisJCWVuZCA9IHdyaXRlYmFja19pbmRleCAtIDE7CiAJCWdvdG8gcmV0cnk7CiAJfQogCWlmICghd2JjLT5ub19ucndyaXRlX2luZGV4X3VwZGF0ZSkgewogCQlpZiAod2JjLT5yYW5nZV9jeWNsaWMgfHwgKHJhbmdlX3dob2xlICYmIG5yX3RvX3dyaXRlID4gMCkpCi0JCQltYXBwaW5nLT53cml0ZWJhY2tfaW5kZXggPSBpbmRleDsKKwkJCW1hcHBpbmctPndyaXRlYmFja19pbmRleCA9IGRvbmVfaW5kZXg7CiAJCXdiYy0+bnJfdG9fd3JpdGUgPSBucl90b193cml0ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCBkOGFjMDE0Li43YmYyMmUwIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC02OSw3ICs2OSw3IEBACiAKIHVuc2lnbmVkIGxvbmcgdG90YWxyYW1fcGFnZXMgX19yZWFkX21vc3RseTsKIHVuc2lnbmVkIGxvbmcgdG90YWxyZXNlcnZlX3BhZ2VzIF9fcmVhZF9tb3N0bHk7Ci1sb25nIG5yX3N3YXBfcGFnZXM7Cit1bnNpZ25lZCBsb25nIGhpZ2hlc3RfbWVtbWFwX3BmbiBfX3JlYWRfbW9zdGx5OwogaW50IHBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbjsKIAogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV9WQVJJQUJMRQpAQCAtMjIzLDE5ICsyMjMsNDEgQEAKIAogc3RhdGljIHZvaWQgYmFkX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIkJhZCBwYWdlIHN0YXRlIGluIHByb2Nlc3MgJyVzJ1xuIiBLRVJOX0VNRVJHCi0JCSJwYWdlOiVwIGZsYWdzOjB4JTAqbHggbWFwcGluZzolcCBtYXBjb3VudDolZCBjb3VudDolZFxuIiwKLQkJY3VycmVudC0+Y29tbSwgcGFnZSwgKGludCkoMipzaXplb2YodW5zaWduZWQgbG9uZykpLAotCQkodW5zaWduZWQgbG9uZylwYWdlLT5mbGFncywgcGFnZS0+bWFwcGluZywKLQkJcGFnZV9tYXBjb3VudChwYWdlKSwgcGFnZV9jb3VudChwYWdlKSk7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzdW1lOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIG5yX3Nob3duOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIG5yX3Vuc2hvd247CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiVHJ5aW5nIHRvIGZpeCBpdCB1cCwgYnV0IGEgcmVib290IGlzIG5lZWRlZFxuIgotCQlLRVJOX0VNRVJHICJCYWNrdHJhY2U6XG4iKTsKKwkvKgorCSAqIEFsbG93IGEgYnVyc3Qgb2YgNjAgcmVwb3J0cywgdGhlbiBrZWVwIHF1aWV0IGZvciB0aGF0IG1pbnV0ZTsKKwkgKiBvciBhbGxvdyBhIHN0ZWFkeSBkcmlwIG9mIG9uZSByZXBvcnQgcGVyIHNlY29uZC4KKwkgKi8KKwlpZiAobnJfc2hvd24gPT0gNjApIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHJlc3VtZSkpIHsKKwkJCW5yX3Vuc2hvd24rKzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChucl91bnNob3duKSB7CisJCQlwcmludGsoS0VSTl9BTEVSVAorCQkJICAgICAgIkJVRzogQmFkIHBhZ2Ugc3RhdGU6ICVsdSBtZXNzYWdlcyBzdXBwcmVzc2VkXG4iLAorCQkJCW5yX3Vuc2hvd24pOworCQkJbnJfdW5zaG93biA9IDA7CisJCX0KKwkJbnJfc2hvd24gPSAwOworCX0KKwlpZiAobnJfc2hvd24rKyA9PSAwKQorCQlyZXN1bWUgPSBqaWZmaWVzICsgNjAgKiBIWjsKKworCXByaW50ayhLRVJOX0FMRVJUICJCVUc6IEJhZCBwYWdlIHN0YXRlIGluIHByb2Nlc3MgJXMgIHBmbjolMDVseFxuIiwKKwkJY3VycmVudC0+Y29tbSwgcGFnZV90b19wZm4ocGFnZSkpOworCXByaW50ayhLRVJOX0FMRVJUCisJCSJwYWdlOiVwIGZsYWdzOiVwIGNvdW50OiVkIG1hcGNvdW50OiVkIG1hcHBpbmc6JXAgaW5kZXg6JWx4XG4iLAorCQlwYWdlLCAodm9pZCAqKXBhZ2UtPmZsYWdzLCBwYWdlX2NvdW50KHBhZ2UpLAorCQlwYWdlX21hcGNvdW50KHBhZ2UpLCBwYWdlLT5tYXBwaW5nLCBwYWdlLT5pbmRleCk7CisKIAlkdW1wX3N0YWNrKCk7Ci0JcGFnZS0+ZmxhZ3MgJj0gflBBR0VfRkxBR1NfQ0xFQVJfV0hFTl9CQUQ7Ci0Jc2V0X3BhZ2VfY291bnQocGFnZSwgMCk7Ci0JcmVzZXRfcGFnZV9tYXBjb3VudChwYWdlKTsKLQlwYWdlLT5tYXBwaW5nID0gTlVMTDsKK291dDoKKwkvKiBMZWF2ZSBiYWQgZmllbGRzIGZvciBkZWJ1ZywgZXhjZXB0IFBhZ2VCdWRkeSBjb3VsZCBtYWtlIHRyb3VibGUgKi8KKwlfX0NsZWFyUGFnZUJ1ZGR5KHBhZ2UpOwogCWFkZF90YWludChUQUlOVF9CQURfUEFHRSk7CiB9CiAKQEAgLTI5MiwyNSArMzE0LDMxIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgZGVzdHJveV9jb21wb3VuZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9yZGVyKQorc3RhdGljIGludCBkZXN0cm95X2NvbXBvdW5kX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb3JkZXIpCiB7CiAJaW50IGk7CiAJaW50IG5yX3BhZ2VzID0gMSA8PCBvcmRlcjsKKwlpbnQgYmFkID0gMDsKIAotCWlmICh1bmxpa2VseShjb21wb3VuZF9vcmRlcihwYWdlKSAhPSBvcmRlcikpCisJaWYgKHVubGlrZWx5KGNvbXBvdW5kX29yZGVyKHBhZ2UpICE9IG9yZGVyKSB8fAorCSAgICB1bmxpa2VseSghUGFnZUhlYWQocGFnZSkpKSB7CiAJCWJhZF9wYWdlKHBhZ2UpOworCQliYWQrKzsKKwl9CiAKLQlpZiAodW5saWtlbHkoIVBhZ2VIZWFkKHBhZ2UpKSkKLQkJCWJhZF9wYWdlKHBhZ2UpOwogCV9fQ2xlYXJQYWdlSGVhZChwYWdlKTsKKwogCWZvciAoaSA9IDE7IGkgPCBucl9wYWdlczsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwID0gcGFnZSArIGk7CiAKLQkJaWYgKHVubGlrZWx5KCFQYWdlVGFpbChwKSB8Ci0JCQkJKHAtPmZpcnN0X3BhZ2UgIT0gcGFnZSkpKQorCQlpZiAodW5saWtlbHkoIVBhZ2VUYWlsKHApIHwgKHAtPmZpcnN0X3BhZ2UgIT0gcGFnZSkpKSB7CiAJCQliYWRfcGFnZShwYWdlKTsKKwkJCWJhZCsrOworCQl9CiAJCV9fQ2xlYXJQYWdlVGFpbChwKTsKIAl9CisKKwlyZXR1cm4gYmFkOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJlcF96ZXJvX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcmRlciwgZ2ZwX3QgZ2ZwX2ZsYWdzKQpAQCAtNDMwLDcgKzQ1OCw4IEBACiAJaW50IG1pZ3JhdGV0eXBlID0gZ2V0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlKTsKIAogCWlmICh1bmxpa2VseShQYWdlQ29tcG91bmQocGFnZSkpKQotCQlkZXN0cm95X2NvbXBvdW5kX3BhZ2UocGFnZSwgb3JkZXIpOworCQlpZiAodW5saWtlbHkoZGVzdHJveV9jb21wb3VuZF9wYWdlKHBhZ2UsIG9yZGVyKSkpCisJCQlyZXR1cm47CiAKIAlwYWdlX2lkeCA9IHBhZ2VfdG9fcGZuKHBhZ2UpICYgKCgxIDw8IE1BWF9PUkRFUikgLSAxKTsKIApAQCAtNDY3LDE4ICs0OTYsMTMgQEAKIAlpZiAodW5saWtlbHkocGFnZV9tYXBjb3VudChwYWdlKSB8CiAJCShwYWdlLT5tYXBwaW5nICE9IE5VTEwpICB8CiAJCShwYWdlX2NvdW50KHBhZ2UpICE9IDApICB8Ci0JCShwYWdlLT5mbGFncyAmIFBBR0VfRkxBR1NfQ0hFQ0tfQVRfRlJFRSkpKQorCQkocGFnZS0+ZmxhZ3MgJiBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUpKSkgewogCQliYWRfcGFnZShwYWdlKTsKLQlpZiAoUGFnZURpcnR5KHBhZ2UpKQotCQlfX0NsZWFyUGFnZURpcnR5KHBhZ2UpOwotCWlmIChQYWdlU3dhcEJhY2tlZChwYWdlKSkKLQkJX19DbGVhclBhZ2VTd2FwQmFja2VkKHBhZ2UpOwotCS8qCi0JICogRm9yIG5vdywgd2UgcmVwb3J0IGlmIFBHX3Jlc2VydmVkIHdhcyBmb3VuZCBzZXQsIGJ1dCBkbyBub3QKLQkgKiBjbGVhciBpdCwgYW5kIGRvIG5vdCBmcmVlIHRoZSBwYWdlLiAgQnV0IHdlIHNoYWxsIHNvb24gbmVlZAotCSAqIHRvIGRvIG1vcmUsIGZvciB3aGVuIHRoZSBaRVJPX1BBR0UgY291bnQgd3JhcHMgbmVnYXRpdmUuCi0JICovCi0JcmV0dXJuIFBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwYWdlLT5mbGFncyAmIFBBR0VfRkxBR1NfQ0hFQ0tfQVRfUFJFUCkKKwkJcGFnZS0+ZmxhZ3MgJj0gflBBR0VfRkxBR1NfQ0hFQ0tfQVRfUFJFUDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTUyMywxMSArNTQ3LDExIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKLQlpbnQgcmVzZXJ2ZWQgPSAwOworCWludCBiYWQgPSAwOwogCiAJZm9yIChpID0gMCA7IGkgPCAoMSA8PCBvcmRlcikgOyArK2kpCi0JCXJlc2VydmVkICs9IGZyZWVfcGFnZXNfY2hlY2socGFnZSArIGkpOwotCWlmIChyZXNlcnZlZCkKKwkJYmFkICs9IGZyZWVfcGFnZXNfY2hlY2socGFnZSArIGkpOworCWlmIChiYWQpCiAJCXJldHVybjsKIAogCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKQEAgLTYxMiwyMyArNjM2LDExIEBACiAJaWYgKHVubGlrZWx5KHBhZ2VfbWFwY291bnQocGFnZSkgfAogCQkocGFnZS0+bWFwcGluZyAhPSBOVUxMKSAgfAogCQkocGFnZV9jb3VudChwYWdlKSAhPSAwKSAgfAotCQkocGFnZS0+ZmxhZ3MgJiBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVApKSkKKwkJKHBhZ2UtPmZsYWdzICYgUEFHRV9GTEFHU19DSEVDS19BVF9QUkVQKSkpIHsKIAkJYmFkX3BhZ2UocGFnZSk7Ci0KLQkvKgotCSAqIEZvciBub3csIHdlIHJlcG9ydCBpZiBQR19yZXNlcnZlZCB3YXMgZm91bmQgc2V0LCBidXQgZG8gbm90Ci0JICogY2xlYXIgaXQsIGFuZCBkbyBub3QgYWxsb2NhdGUgdGhlIHBhZ2U6IGFzIGEgc2FmZXR5IG5ldC4KLQkgKi8KLQlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpKQogCQlyZXR1cm4gMTsKKwl9CiAKLQlwYWdlLT5mbGFncyAmPSB+KDEgPDwgUEdfdXB0b2RhdGUgfCAxIDw8IFBHX2Vycm9yIHwgMSA8PCBQR19yZWNsYWltIHwKLQkJCTEgPDwgUEdfcmVmZXJlbmNlZCB8IDEgPDwgUEdfYXJjaF8xIHwKLQkJCTEgPDwgUEdfb3duZXJfcHJpdl8xIHwgMSA8PCBQR19tYXBwZWR0b2Rpc2sKLSNpZmRlZiBDT05GSUdfVU5FVklDVEFCTEVfTFJVCi0JCQl8IDEgPDwgUEdfbWxvY2tlZAotI2VuZGlmCi0JCQkpOwogCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CiAJc2V0X3BhZ2VfcmVmY291bnRlZChwYWdlKTsKIApAQCAtMjYwOSw2ICsyNjIxLDkgQEAKIAl1bnNpZ25lZCBsb25nIHBmbjsKIAlzdHJ1Y3Qgem9uZSAqejsKIAorCWlmIChoaWdoZXN0X21lbW1hcF9wZm4gPCBlbmRfcGZuIC0gMSkKKwkJaGlnaGVzdF9tZW1tYXBfcGZuID0gZW5kX3BmbiAtIDE7CisKIAl6ID0gJk5PREVfREFUQShuaWQpLT5ub2RlX3pvbmVzW3pvbmVdOwogCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgewogCQkvKgpAQCAtMzM4MSwxMCArMzM5Niw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyB1c2VtYXBzaXplID0gdXNlbWFwX3NpemUoem9uZXNpemUpOwogCXpvbmUtPnBhZ2VibG9ja19mbGFncyA9IE5VTEw7Ci0JaWYgKHVzZW1hcHNpemUpIHsKKwlpZiAodXNlbWFwc2l6ZSkKIAkJem9uZS0+cGFnZWJsb2NrX2ZsYWdzID0gYWxsb2NfYm9vdG1lbV9ub2RlKHBnZGF0LCB1c2VtYXBzaXplKTsKLQkJbWVtc2V0KHpvbmUtPnBhZ2VibG9ja19mbGFncywgMCwgdXNlbWFwc2l6ZSk7Ci0JfQogfQogI2Vsc2UKIHN0YXRpYyB2b2lkIGlubGluZSBzZXR1cF91c2VtYXAoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKQEAgLTM0NjksOSArMzQ4MiwxMCBAQAogCQkJUEFHRV9BTElHTihzaXplICogc2l6ZW9mKHN0cnVjdCBwYWdlKSkgPj4gUEFHRV9TSElGVDsKIAkJaWYgKHJlYWxzaXplID49IG1lbW1hcF9wYWdlcykgewogCQkJcmVhbHNpemUgLT0gbWVtbWFwX3BhZ2VzOwotCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCQkiICAlcyB6b25lOiAlbHUgcGFnZXMgdXNlZCBmb3IgbWVtbWFwXG4iLAotCQkJCXpvbmVfbmFtZXNbal0sIG1lbW1hcF9wYWdlcyk7CisJCQlpZiAobWVtbWFwX3BhZ2VzKQorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIgICVzIHpvbmU6ICVsdSBwYWdlcyB1c2VkIGZvciBtZW1tYXBcbiIsCisJCQkJICAgICAgIHpvbmVfbmFtZXNbal0sIG1lbW1hcF9wYWdlcyk7CiAJCX0gZWxzZQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCSIgICVzIHpvbmU6ICVsdSBwYWdlcyBleGNlZWRzIHJlYWxzaXplICVsdVxuIiwKQEAgLTQzMTYsNyArNDMzMCw3IEBACiAgKiAgICAxVEIgICAgIDEwMSAgICAgICAgMTBHQgogICogICAxMFRCICAgICAzMjAgICAgICAgIDMyR0IKICAqLwotdm9pZCBzZXR1cF9wZXJfem9uZV9pbmFjdGl2ZV9yYXRpbyh2b2lkKQorc3RhdGljIHZvaWQgc2V0dXBfcGVyX3pvbmVfaW5hY3RpdmVfcmF0aW8odm9pZCkKIHsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIApAQCAtNDU3MywxOSArNDU4Nyw2IEBACiAJcmV0dXJuIHRhYmxlOwogfQogCi0jaWZkZWYgQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFCi1zdHJ1Y3QgcGFnZSAqcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JcmV0dXJuIF9fcGZuX3RvX3BhZ2UocGZuKTsKLX0KLXVuc2lnbmVkIGxvbmcgcGFnZV90b19wZm4oc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIF9fcGFnZV90b19wZm4ocGFnZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBmbl90b19wYWdlKTsKLUVYUE9SVF9TWU1CT0wocGFnZV90b19wZm4pOwotI2VuZGlmIC8qIENPTkZJR19PVVRfT0ZfTElORV9QRk5fVE9fUEFHRSAqLwotCiAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBiaXRtYXAgc3RvcmluZyBiaXRzIGFmZmVjdGluZyBhIGJsb2NrIG9mIHBhZ2VzICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKmdldF9wYWdlYmxvY2tfYml0bWFwKHN0cnVjdCB6b25lICp6b25lLAogCQkJCQkJCXVuc2lnbmVkIGxvbmcgcGZuKQpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9jZ3JvdXAuYyBiL21tL3BhZ2VfY2dyb3VwLmMKaW5kZXggYWIyN2ZmNy4uZDY1MDdhNiAxMDA2NDQKLS0tIGEvbW0vcGFnZV9jZ3JvdXAuYworKysgYi9tbS9wYWdlX2Nncm91cC5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIH0KIAogLyogX19hbGxvY19ib290bWVtLi4uKCkgaXMgcHJvdGVjdGVkIGJ5ICFzbGFiX2F2YWlsYWJsZSgpICovCi1pbnQgX19pbml0X3JlZm9rIGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cCh1bnNpZ25lZCBsb25nIHBmbikKK3N0YXRpYyBpbnQgX19pbml0X3JlZm9rIGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cCh1bnNpZ25lZCBsb25nIHBmbikKIHsKIAlzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb247CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpiYXNlLCAqcGM7CmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmMKaW5kZXggMDY1YzQ0OC4uZGM2Y2UwYSAxMDA2NDQKLS0tIGEvbW0vcGFnZV9pby5jCisrKyBiL21tL3BhZ2VfaW8uYwpAQCAtOTgsNyArOTgsNyBAQAogCXN0cnVjdCBiaW8gKmJpbzsKIAlpbnQgcmV0ID0gMCwgcncgPSBXUklURTsKIAotCWlmIChyZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShwYWdlKSkgeworCWlmICh0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpKSB7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMjUsOCArMTI1LDggQEAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJaW50IHJldCA9IDA7CiAKLQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwotCUJVR19PTihQYWdlVXB0b2RhdGUocGFnZSkpOworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKFBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAJYmlvID0gZ2V0X3N3YXBfYmlvKEdGUF9LRVJORUwsIHBhZ2VfcHJpdmF0ZShwYWdlKSwgcGFnZSwKIAkJCQllbmRfc3dhcF9iaW9fcmVhZCk7CiAJaWYgKGJpbyA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggMTA5OTM5NC4uYWM0YWY4YyAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtNDcsOSArNDcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KIAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCkBAIC0xOTEsNyArMTkxLDcgQEAKICAqIEdldHRpbmcgYSBsb2NrIG9uIGEgc3RhYmxlIGFub25fdm1hIGZyb20gYSBwYWdlIG9mZiB0aGUgTFJVIGlzCiAgKiB0cmlja3k6IHBhZ2VfbG9ja19hbm9uX3ZtYSByZWx5IG9uIFJDVSB0byBndWFyZCBhZ2FpbnN0IHRoZSByYWNlcy4KICAqLwotc3RydWN0IGFub25fdm1hICpwYWdlX2xvY2tfYW5vbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgc3RydWN0IGFub25fdm1hICpwYWdlX2xvY2tfYW5vbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYTsKIAl1bnNpZ25lZCBsb25nIGFub25fbWFwcGluZzsKQEAgLTIxMSw3ICsyMTEsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIHBhZ2VfdW5sb2NrX2Fub25fdm1hKHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpCitzdGF0aWMgdm9pZCBwYWdlX3VubG9ja19hbm9uX3ZtYShzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQogewogCXNwaW5fdW5sb2NrKCZhbm9uX3ZtYS0+bG9jayk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0zNTksOCArMzU5LDE3IEBACiAJCWdvdG8gb3V0X3VubWFwOwogCX0KIAotCWlmIChwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nX25vdGlmeSh2bWEsIGFkZHJlc3MsIHB0ZSkpCi0JCXJlZmVyZW5jZWQrKzsKKwlpZiAocHRlcF9jbGVhcl9mbHVzaF95b3VuZ19ub3RpZnkodm1hLCBhZGRyZXNzLCBwdGUpKSB7CisJCS8qCisJCSAqIERvbid0IHRyZWF0IGEgcmVmZXJlbmNlIHRocm91Z2ggYSBzZXF1ZW50aWFsbHkgcmVhZAorCQkgKiBtYXBwaW5nIGFzIHN1Y2guICBJZiB0aGUgcGFnZSBoYXMgYmVlbiB1c2VkIGluCisJCSAqIGFub3RoZXIgbWFwcGluZywgd2Ugd2lsbCBjYXRjaCBpdDsgaWYgdGhpcyBvdGhlcgorCQkgKiBtYXBwaW5nIGlzIGFscmVhZHkgZ29uZSwgdGhlIHVubWFwIHBhdGggd2lsbCBoYXZlCisJCSAqIHNldCBQR19yZWZlcmVuY2VkIG9yIGFjdGl2YXRlZCB0aGUgcGFnZS4KKwkJICovCisJCWlmIChsaWtlbHkoIVZNX1NlcXVlbnRpYWxSZWFkSGludCh2bWEpKSkKKwkJCXJlZmVyZW5jZWQrKzsKKwl9CiAKIAkvKiBQcmV0ZW5kIHRoZSBwYWdlIGlzIHJlZmVyZW5jZWQgaWYgdGhlIHRhc2sgaGFzIHRoZQogCSAgIHN3YXAgdG9rZW4gYW5kIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBwYWdlIGZhdWx0LiAqLwpAQCAtNjYxLDkgKzY3MCwxNCBAQAogdm9pZCBwYWdlX2FkZF9uZXdfYW5vbl9ybWFwKHN0cnVjdCBwYWdlICpwYWdlLAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JQlVHX09OKGFkZHJlc3MgPCB2bWEtPnZtX3N0YXJ0IHx8IGFkZHJlc3MgPj0gdm1hLT52bV9lbmQpOwotCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgMCk7IC8qIGVsZXZhdGUgY291bnQgYnkgMSAoc3RhcnRzIGF0IC0xKSAqLworCVZNX0JVR19PTihhZGRyZXNzIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyZXNzID49IHZtYS0+dm1fZW5kKTsKKwlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIDApOyAvKiBpbmNyZW1lbnQgY291bnQgKHN0YXJ0cyBhdCAtMSkgKi8KIAlfX3BhZ2Vfc2V0X2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOworCWlmIChwYWdlX2V2aWN0YWJsZShwYWdlLCB2bWEpKQorCQlscnVfY2FjaGVfYWRkX2xydShwYWdlLCBMUlVfQUNUSVZFX0FOT04pOworCWVsc2UKKwkJYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChwYWdlKTsKIH0KIAogLyoqCkBAIC02OTMsNyArNzA3LDYgQEAKICAqLwogdm9pZCBwYWdlX2R1cF9ybWFwKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCUJVR19PTihwYWdlX21hcGNvdW50KHBhZ2UpID09IDApOwogCWlmIChQYWdlQW5vbihwYWdlKSkKIAkJX19wYWdlX2NoZWNrX2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOwogCWF0b21pY19pbmMoJnBhZ2UtPl9tYXBjb3VudCk7CkBAIC03MDMsMjggKzcxNiwxMiBAQAogLyoqCiAgKiBwYWdlX3JlbW92ZV9ybWFwIC0gdGFrZSBkb3duIHB0ZSBtYXBwaW5nIGZyb20gYSBwYWdlCiAgKiBAcGFnZTogcGFnZSB0byByZW1vdmUgbWFwcGluZyBmcm9tCi0gKiBAdm1hOiB0aGUgdm0gYXJlYSBpbiB3aGljaCB0aGUgbWFwcGluZyBpcyByZW1vdmVkCiAgKgogICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwdGUgbG9jay4KICAqLwotdm9pZCBwYWdlX3JlbW92ZV9ybWFwKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3ZvaWQgcGFnZV9yZW1vdmVfcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAoYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSwgJnBhZ2UtPl9tYXBjb3VudCkpIHsKLQkJaWYgKHVubGlrZWx5KHBhZ2VfbWFwY291bnQocGFnZSkgPCAwKSkgewotCQkJcHJpbnRrIChLRVJOX0VNRVJHICJFZWVrISBwYWdlX21hcGNvdW50KHBhZ2UpIHdlbnQgbmVnYXRpdmUhICglZClcbiIsIHBhZ2VfbWFwY291bnQocGFnZSkpOwotCQkJcHJpbnRrIChLRVJOX0VNRVJHICIgIHBhZ2UgcGZuID0gJWx4XG4iLCBwYWdlX3RvX3BmbihwYWdlKSk7Ci0JCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+ZmxhZ3MgPSAlbHhcbiIsIHBhZ2UtPmZsYWdzKTsKLQkJCXByaW50ayAoS0VSTl9FTUVSRyAiICBwYWdlLT5jb3VudCA9ICV4XG4iLCBwYWdlX2NvdW50KHBhZ2UpKTsKLQkJCXByaW50ayAoS0VSTl9FTUVSRyAiICBwYWdlLT5tYXBwaW5nID0gJXBcbiIsIHBhZ2UtPm1hcHBpbmcpOwotCQkJcHJpbnRfc3ltYm9sIChLRVJOX0VNRVJHICIgIHZtYS0+dm1fb3BzID0gJXNcbiIsICh1bnNpZ25lZCBsb25nKXZtYS0+dm1fb3BzKTsKLQkJCWlmICh2bWEtPnZtX29wcykgewotCQkJCXByaW50X3N5bWJvbCAoS0VSTl9FTUVSRyAiICB2bWEtPnZtX29wcy0+ZmF1bHQgPSAlc1xuIiwgKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9vcHMtPmZhdWx0KTsKLQkJCX0KLQkJCWlmICh2bWEtPnZtX2ZpbGUgJiYgdm1hLT52bV9maWxlLT5mX29wKQotCQkJCXByaW50X3N5bWJvbCAoS0VSTl9FTUVSRyAiICB2bWEtPnZtX2ZpbGUtPmZfb3AtPm1tYXAgPSAlc1xuIiwgKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9maWxlLT5mX29wLT5tbWFwKTsKLQkJCUJVRygpOwotCQl9Ci0KIAkJLyoKIAkJICogTm93IHRoYXQgdGhlIGxhc3QgcHRlIGhhcyBnb25lLCBzMzkwIG11c3QgdHJhbnNmZXIgZGlydHkKIAkJICogZmxhZyBmcm9tIHN0b3JhZ2Uga2V5IHRvIHN0cnVjdCBwYWdlLiAgV2UgY2FuIHVzdWFsbHkgc2tpcApAQCAtODE4LDggKzgxNSw3IEBACiAJCQkJc3Bpbl91bmxvY2soJm1tbGlzdF9sb2NrKTsKIAkJCX0KIAkJCWRlY19tbV9jb3VudGVyKG1tLCBhbm9uX3Jzcyk7Ci0jaWZkZWYgQ09ORklHX01JR1JBVElPTgotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKFBBR0VfTUlHUkFUSU9OKSB7CiAJCQkvKgogCQkJICogU3RvcmUgdGhlIHBmbiBvZiB0aGUgcGFnZSBpbiBhIHNwZWNpYWwgbWlncmF0aW9uCiAJCQkgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uCkBAIC04MjcsMjMgKzgyMywxOSBAQAogCQkJICovCiAJCQlCVUdfT04oIW1pZ3JhdGlvbik7CiAJCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5KHBhZ2UsIHB0ZV93cml0ZShwdGV2YWwpKTsKLSNlbmRpZgogCQl9CiAJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB0ZSwgc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpOwogCQlCVUdfT04ocHRlX2ZpbGUoKnB0ZSkpOwotCX0gZWxzZQotI2lmZGVmIENPTkZJR19NSUdSQVRJT04KLQlpZiAobWlncmF0aW9uKSB7CisJfSBlbHNlIGlmIChQQUdFX01JR1JBVElPTiAmJiBtaWdyYXRpb24pIHsKIAkJLyogRXN0YWJsaXNoIG1pZ3JhdGlvbiBlbnRyeSBmb3IgYSBmaWxlIHBhZ2UgKi8KIAkJc3dwX2VudHJ5X3QgZW50cnk7CiAJCWVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnkocGFnZSwgcHRlX3dyaXRlKHB0ZXZhbCkpOwogCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdGUsIHN3cF9lbnRyeV90b19wdGUoZW50cnkpKTsKIAl9IGVsc2UKLSNlbmRpZgogCQlkZWNfbW1fY291bnRlcihtbSwgZmlsZV9yc3MpOwogCiAKLQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJcGFnZV9yZW1vdmVfcm1hcChwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAKIG91dF91bm1hcDoKQEAgLTk1OCw3ICs5NTAsNyBAQAogCQlpZiAocHRlX2RpcnR5KHB0ZXZhbCkpCiAJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKIAotCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKIAkJKCptYXBjb3VudCktLTsKZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IGYxYjBkNDguLjU5NDFmOTggMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtMTQsMzEgKzE0LDM5IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEx1a2UgS2VubmV0aCBDYXNzb24gTGVpZ2h0b24gPGxrY2xAbGtjbC5uZXQ+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CiAgKgorICogdGlueS1zaG1lbToKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4KKyAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNobV9tbnQ7CisKKyNpZmRlZiBDT05GSUdfU0hNRU0KIC8qCiAgKiBUaGlzIHZpcnR1YWwgbWVtb3J5IGZpbGVzeXN0ZW0gaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgcmFtZnMuIEl0CiAgKiBleHRlbmRzIHJhbWZzIGJ5IHRoZSBhYmlsaXR5IHRvIHVzZSBzd2FwIGFuZCBob25vciByZXNvdXJjZSBsaW1pdHMKICAqIHdoaWNoIG1ha2VzIGl0IGEgY29tcGxldGVseSB1c2FibGUgZmlsZXN5c3RlbS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfYWNsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgpAQCAtMTQ0NCw3ICsxNDUyLDYgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAoKGVycm9yID09IC1FTk9NRU0pID8gVk1fRkFVTFRfT09NIDogVk1fRkFVTFRfU0lHQlVTKTsKIAotCW1hcmtfcGFnZV9hY2Nlc3NlZCh2bWYtPnBhZ2UpOwogCXJldHVybiByZXQgfCBWTV9GQVVMVF9MT0NLRUQ7CiB9CiAKQEAgLTI0ODYsNyArMjQ5Myw2IEBACiAJLmdldF9zYgkJPSBzaG1lbV9nZXRfc2IsCiAJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKIH07Ci1zdGF0aWMgc3RydWN0IHZmc21vdW50ICpzaG1fbW50OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3RtcGZzKHZvaWQpCiB7CkBAIC0yNTI1LDcgKzI1MzEsNTEgQEAKIAlzaG1fbW50ID0gRVJSX1BUUihlcnJvcik7CiAJcmV0dXJuIGVycm9yOwogfQotbW9kdWxlX2luaXQoaW5pdF90bXBmcykKKworI2Vsc2UgLyogIUNPTkZJR19TSE1FTSAqLworCisvKgorICogdGlueS1zaG1lbTogc2ltcGxlIHNobWVtZnMgYW5kIHRtcGZzIHVzaW5nIHJhbWZzIGNvZGUKKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIGZvciBzbWFsbCBzeXN0ZW0gd2hlcmUgdGhlIGJlbmVmaXRzIG9mIHRoZSBmdWxsCisgKiBzaG1lbSBjb2RlIChzd2FwLWJhY2tlZCBhbmQgcmVzb3VyY2UtbGltaXRlZCkgYXJlIG91dHdlaWdoZWQgYnkKKyAqIHRoZWlyIGNvbXBsZXhpdHkuIE9uIHN5c3RlbXMgd2l0aG91dCBzd2FwIHRoaXMgY29kZSBzaG91bGQgYmUKKyAqIGVmZmVjdGl2ZWx5IGVxdWl2YWxlbnQsIGJ1dCBtdWNoIGxpZ2h0ZXIgd2VpZ2h0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yYW1mcy5oPgorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdG1wZnNfZnNfdHlwZSA9IHsKKwkubmFtZQkJPSAidG1wZnMiLAorCS5nZXRfc2IJCT0gcmFtZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RtcGZzKHZvaWQpCit7CisJQlVHX09OKHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnRtcGZzX2ZzX3R5cGUpICE9IDApOworCisJc2htX21udCA9IGtlcm5fbW91bnQoJnRtcGZzX2ZzX3R5cGUpOworCUJVR19PTihJU19FUlIoc2htX21udCkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgc2htZW1fZmlsZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfb3BlcmF0aW9ucworI2RlZmluZSBzaG1lbV92bV9vcHMgZ2VuZXJpY19maWxlX3ZtX29wcworI2RlZmluZSBzaG1lbV9nZXRfaW5vZGUgcmFtZnNfZ2V0X2lub2RlCisjZGVmaW5lIHNobWVtX2FjY3Rfc2l6ZShhLCBiKSAwCisjZGVmaW5lIHNobWVtX3VuYWNjdF9zaXplKGEsIGIpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBTSE1FTV9NQVhfQllURVMgTExPTkdfTUFYCisKKyNlbmRpZiAvKiBDT05GSUdfU0hNRU0gKi8KKworLyogY29tbW9uIGNvZGUgKi8KIAogLyoqCiAgKiBzaG1lbV9maWxlX3NldHVwIC0gZ2V0IGFuIHVubGlua2VkIGZpbGUgbGl2aW5nIGluIHRtcGZzCkBAIC0yNTY5LDEyICsyNjE5LDIwIEBACiAJaWYgKCFpbm9kZSkKIAkJZ290byBjbG9zZV9maWxlOwogCisjaWZkZWYgQ09ORklHX1NITUVNCiAJU0hNRU1fSShpbm9kZSktPmZsYWdzID0gZmxhZ3MgJiBWTV9BQ0NPVU5UOworI2VuZGlmCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAlpbm9kZS0+aV9zaXplID0gc2l6ZTsKIAlpbm9kZS0+aV9ubGluayA9IDA7CS8qIEl0IGlzIHVubGlua2VkICovCiAJaW5pdF9maWxlKGZpbGUsIHNobV9tbnQsIGRlbnRyeSwgRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFELAotCQkJJnNobWVtX2ZpbGVfb3BlcmF0aW9ucyk7CisJCSAgJnNobWVtX2ZpbGVfb3BlcmF0aW9ucyk7CisKKyNpZm5kZWYgQ09ORklHX01NVQorCWVycm9yID0gcmFtZnNfbm9tbXVfZXhwYW5kX2Zvcl9tYXBwaW5nKGlub2RlLCBzaXplKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xvc2VfZmlsZTsKKyNlbmRpZgogCXJldHVybiBmaWxlOwogCiBjbG9zZV9maWxlOgpAQCAtMjYwNiwzICsyNjY0LDUgQEAKIAl2bWEtPnZtX29wcyA9ICZzaG1lbV92bV9vcHM7CiAJcmV0dXJuIDA7CiB9CisKK21vZHVsZV9pbml0KGluaXRfdG1wZnMpCmRpZmYgLS1naXQgYS9tbS9zd2FwLmMgYi9tbS9zd2FwLmMKaW5kZXggYjEzNWVjOS4uYmEyYzBlOCAxMDA2NDQKLS0tIGEvbW0vc3dhcC5jCisrKyBiL21tL3N3YXAuYwpAQCAtMjQ2LDI1ICsyNDYsNiBAQAogCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogfQogCi0vKioKLSAqIGxydV9jYWNoZV9hZGRfYWN0aXZlX29yX3VuZXZpY3RhYmxlCi0gKiBAcGFnZTogIHRoZSBwYWdlIHRvIGJlIGFkZGVkIHRvIExSVQotICogQHZtYTogICB2bWEgaW4gd2hpY2ggcGFnZSBpcyBtYXBwZWQgZm9yIGRldGVybWluaW5nIHJlY2xhaW1hYmlsaXR5Ci0gKgotICogcGxhY2UgQHBhZ2Ugb24gYWN0aXZlIG9yIHVuZXZpY3RhYmxlIExSVSBsaXN0LCBkZXBlbmRpbmcgb24KLSAqIHBhZ2VfZXZpY3RhYmxlKCkuICBOb3RlIHRoYXQgaWYgdGhlIHBhZ2UgaXMgbm90IGV2aWN0YWJsZSwKLSAqIGl0IGdvZXMgZGlyZWN0bHkgYmFjayBvbnRvIGl0J3Mgem9uZSdzIHVuZXZpY3RhYmxlIGxpc3QuICBJdCBkb2VzCi0gKiBOT1QgdXNlIGEgcGVyIGNwdSBwYWdldmVjLgotICovCi12b2lkIGxydV9jYWNoZV9hZGRfYWN0aXZlX29yX3VuZXZpY3RhYmxlKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlpZiAocGFnZV9ldmljdGFibGUocGFnZSwgdm1hKSkKLQkJbHJ1X2NhY2hlX2FkZF9scnUocGFnZSwgTFJVX0FDVElWRSArIHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSk7Ci0JZWxzZQotCQlhZGRfcGFnZV90b191bmV2aWN0YWJsZV9saXN0KHBhZ2UpOwotfQotCiAvKgogICogRHJhaW4gcGFnZXMgb3V0IG9mIHRoZSBjcHUncyBwYWdldmVjcy4KICAqIEVpdGhlciAiY3B1IiBpcyB0aGUgY3VycmVudCBDUFUsIGFuZCBwcmVlbXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4KQEAgLTM5OCwyOCArMzc5LDYgQEAKIEVYUE9SVF9TWU1CT0woX19wYWdldmVjX3JlbGVhc2UpOwogCiAvKgotICogcGFnZXZlY19yZWxlYXNlKCkgZm9yIHBhZ2VzIHdoaWNoIGFyZSBrbm93biB0byBub3QgYmUgb24gdGhlIExSVQotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmVpbml0aWFsaXNlcyB0aGUgY2FsbGVyJ3MgcGFnZXZlYy4KLSAqLwotdm9pZCBfX3BhZ2V2ZWNfcmVsZWFzZV9ub25scnUoc3RydWN0IHBhZ2V2ZWMgKnB2ZWMpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHBhZ2V2ZWMgcGFnZXNfdG9fZnJlZTsKLQotCXBhZ2V2ZWNfaW5pdCgmcGFnZXNfdG9fZnJlZSwgcHZlYy0+Y29sZCk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQocHZlYyk7IGkrKykgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMtPnBhZ2VzW2ldOwotCi0JCVZNX0JVR19PTihQYWdlTFJVKHBhZ2UpKTsKLQkJaWYgKHB1dF9wYWdlX3Rlc3R6ZXJvKHBhZ2UpKQotCQkJcGFnZXZlY19hZGQoJnBhZ2VzX3RvX2ZyZWUsIHBhZ2UpOwotCX0KLQlwYWdldmVjX2ZyZWUoJnBhZ2VzX3RvX2ZyZWUpOwotCXBhZ2V2ZWNfcmVpbml0KHB2ZWMpOwotfQotCi0vKgogICogQWRkIHRoZSBwYXNzZWQgcGFnZXMgdG8gdGhlIExSVSwgdGhlbiBkcm9wIHRoZSBjYWxsZXIncyByZWZjb3VudAogICogb24gdGhlbS4gIFJlaW5pdGlhbGlzZXMgdGhlIGNhbGxlcidzIHBhZ2V2ZWMuCiAgKi8KQEAgLTQ5NSw4ICs0NTQsNyBAQAogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMtPnBhZ2VzW2ldOwogCiAJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmIHRyeWxvY2tfcGFnZShwYWdlKSkgewotCQkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCi0JCQkJcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfcmVmKHBhZ2UpOworCQkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDMzNTNjOTAuLjgxYzgyNWYgMTAwNjQ0Ci0tLSBhL21tL3N3YXBfc3RhdGUuYworKysgYi9tbS9zd2FwX3N0YXRlLmMKQEAgLTcyLDEwICs3MiwxMCBAQAogewogCWludCBlcnJvcjsKIAotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7Ci0JQlVHX09OKFBhZ2VTd2FwQ2FjaGUocGFnZSkpOwotCUJVR19PTihQYWdlUHJpdmF0ZShwYWdlKSk7Ci0JQlVHX09OKCFQYWdlU3dhcEJhY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlWTV9CVUdfT04oUGFnZVN3YXBDYWNoZShwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlU3dhcEJhY2tlZChwYWdlKSk7CisKIAllcnJvciA9IHJhZGl4X3RyZWVfcHJlbG9hZChnZnBfbWFzayk7CiAJaWYgKCFlcnJvcikgewogCQlwYWdlX2NhY2hlX2dldChwYWdlKTsKQEAgLTEwOCwxMCArMTA4LDkgQEAKICAqLwogdm9pZCBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQlCVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwotCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVByaXZhdGUocGFnZSkpOworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlU3dhcENhY2hlKHBhZ2UpKTsKKwlWTV9CVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CiAKIAlyYWRpeF90cmVlX2RlbGV0ZSgmc3dhcHBlcl9zcGFjZS5wYWdlX3RyZWUsIHBhZ2VfcHJpdmF0ZShwYWdlKSk7CiAJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAwKTsKQEAgLTEyOSwxMyArMTI4LDEzIEBACiAgKiBBbGxvY2F0ZSBzd2FwIHNwYWNlIGZvciB0aGUgcGFnZSBhbmQgYWRkIHRoZSBwYWdlIHRvIHRoZQogICogc3dhcCBjYWNoZS4gIENhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIGxvY2suIAogICovCi1pbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKiBwYWdlLCBnZnBfdCBnZnBfbWFzaykKK2ludCBhZGRfdG9fc3dhcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzd3BfZW50cnlfdCBlbnRyeTsKIAlpbnQgZXJyOwogCi0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAKIAlmb3IgKDs7KSB7CiAJCWVudHJ5ID0gZ2V0X3N3YXBfcGFnZSgpOwpAQCAtMTU0LDcgKzE1Myw3IEBACiAJCSAqIEFkZCBpdCB0byB0aGUgc3dhcCBjYWNoZSBhbmQgbWFyayBpdCBkaXJ0eQogCQkgKi8KIAkJZXJyID0gYWRkX3RvX3N3YXBfY2FjaGUocGFnZSwgZW50cnksCi0JCQkJZ2ZwX21hc2t8X19HRlBfTk9NRU1BTExPQ3xfX0dGUF9OT1dBUk4pOworCQkJCV9fR0ZQX0hJR0h8X19HRlBfTk9NRU1BTExPQ3xfX0dGUF9OT1dBUk4pOwogCiAJCXN3aXRjaCAoZXJyKSB7CiAJCWNhc2UgMDoJCQkJLyogU3VjY2VzcyAqLwpAQCAtMTk2LDE0ICsxOTUsMTQgQEAKICAqIElmIHdlIGFyZSB0aGUgb25seSB1c2VyLCB0aGVuIHRyeSB0byBmcmVlIHVwIHRoZSBzd2FwIGNhY2hlLiAKICAqIAogICogSXRzIG9rIHRvIGNoZWNrIGZvciBQYWdlU3dhcENhY2hlIHdpdGhvdXQgdGhlIHBhZ2UgbG9jawotICogaGVyZSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byByZWNoZWNrIGFnYWluIGluc2lkZSAKLSAqIGV4Y2x1c2l2ZV9zd2FwX3BhZ2UoKSBfd2l0aF8gdGhlIGxvY2suIAorICogaGVyZSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byByZWNoZWNrIGFnYWluIGluc2lkZQorICogdHJ5X3RvX2ZyZWVfc3dhcCgpIF93aXRoXyB0aGUgbG9jay4KICAqIAkJCQkJLSBNYXJjZWxvCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYgdHJ5bG9ja19wYWdlKHBhZ2UpKSB7Ci0JCXJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlKHBhZ2UpOworCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmICFwYWdlX21hcHBlZChwYWdlKSAmJiB0cnlsb2NrX3BhZ2UocGFnZSkpIHsKKwkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggNTRhOWY4Ny4uZWVjNWNhNyAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9zaG0uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTM1LDYgKzM2LDcgQEAKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spOwogc3RhdGljIHVuc2lnbmVkIGludCBucl9zd2FwZmlsZXM7Citsb25nIG5yX3N3YXBfcGFnZXM7CiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7CiBzdGF0aWMgaW50IHN3YXBfb3ZlcmZsb3c7CiBzdGF0aWMgaW50IGxlYXN0X3ByaW9yaXR5OwpAQCAtODMsMTUgKzg1LDk2IEBACiAJdXBfcmVhZCgmc3dhcF91bnBsdWdfc2VtKTsKIH0KIAorLyoKKyAqIHN3YXBvbiB0ZWxsIGRldmljZSB0aGF0IGFsbCB0aGUgb2xkIHN3YXAgY29udGVudHMgY2FuIGJlIGRpc2NhcmRlZCwKKyAqIHRvIGFsbG93IHRoZSBzd2FwIGRldmljZSB0byBvcHRpbWl6ZSBpdHMgd2Vhci1sZXZlbGxpbmcuCisgKi8KK3N0YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKK3sKKwlzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlOworCWludCBlcnIgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZSwgJnNpLT5leHRlbnRfbGlzdCwgbGlzdCkgeworCQlzZWN0b3JfdCBzdGFydF9ibG9jayA9IHNlLT5zdGFydF9ibG9jayA8PCAoUEFHRV9TSElGVCAtIDkpOworCQlzZWN0b3JfdCBucl9ibG9ja3MgPSAoc2VjdG9yX3Qpc2UtPm5yX3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gOSk7CisKKwkJaWYgKHNlLT5zdGFydF9wYWdlID09IDApIHsKKwkJCS8qIERvIG5vdCBkaXNjYXJkIHRoZSBzd2FwIGhlYWRlciBwYWdlISAqLworCQkJc3RhcnRfYmxvY2sgKz0gMSA8PCAoUEFHRV9TSElGVCAtIDkpOworCQkJbnJfYmxvY2tzIC09IDEgPDwgKFBBR0VfU0hJRlQgLSA5KTsKKwkJCWlmICghbnJfYmxvY2tzKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc2ktPmJkZXYsIHN0YXJ0X2Jsb2NrLAorCQkJCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gZXJyOwkJLyogVGhhdCB3aWxsIG9mdGVuIGJlIC1FT1BOT1RTVVBQICovCit9CisKKy8qCisgKiBzd2FwIGFsbG9jYXRpb24gdGVsbCBkZXZpY2UgdGhhdCBhIGNsdXN0ZXIgb2Ygc3dhcCBjYW4gbm93IGJlIGRpc2NhcmRlZCwKKyAqIHRvIGFsbG93IHRoZSBzd2FwIGRldmljZSB0byBvcHRpbWl6ZSBpdHMgd2Vhci1sZXZlbGxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGRpc2NhcmRfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKKwkJCQkgcGdvZmZfdCBzdGFydF9wYWdlLCBwZ29mZl90IG5yX3BhZ2VzKQoreworCXN0cnVjdCBzd2FwX2V4dGVudCAqc2UgPSBzaS0+Y3Vycl9zd2FwX2V4dGVudDsKKwlpbnQgZm91bmRfZXh0ZW50ID0gMDsKKworCXdoaWxlIChucl9wYWdlcykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKKworCQlpZiAoc2UtPnN0YXJ0X3BhZ2UgPD0gc3RhcnRfcGFnZSAmJgorCQkgICAgc3RhcnRfcGFnZSA8IHNlLT5zdGFydF9wYWdlICsgc2UtPm5yX3BhZ2VzKSB7CisJCQlwZ29mZl90IG9mZnNldCA9IHN0YXJ0X3BhZ2UgLSBzZS0+c3RhcnRfcGFnZTsKKwkJCXNlY3Rvcl90IHN0YXJ0X2Jsb2NrID0gc2UtPnN0YXJ0X2Jsb2NrICsgb2Zmc2V0OworCQkJc2VjdG9yX3QgbnJfYmxvY2tzID0gc2UtPm5yX3BhZ2VzIC0gb2Zmc2V0OworCisJCQlpZiAobnJfYmxvY2tzID4gbnJfcGFnZXMpCisJCQkJbnJfYmxvY2tzID0gbnJfcGFnZXM7CisJCQlzdGFydF9wYWdlICs9IG5yX2Jsb2NrczsKKwkJCW5yX3BhZ2VzIC09IG5yX2Jsb2NrczsKKworCQkJaWYgKCFmb3VuZF9leHRlbnQrKykKKwkJCQlzaS0+Y3Vycl9zd2FwX2V4dGVudCA9IHNlOworCisJCQlzdGFydF9ibG9jayA8PD0gUEFHRV9TSElGVCAtIDk7CisJCQlucl9ibG9ja3MgPDw9IFBBR0VfU0hJRlQgLSA5OworCQkJaWYgKGJsa2Rldl9pc3N1ZV9kaXNjYXJkKHNpLT5iZGV2LCBzdGFydF9ibG9jaywKKwkJCQkJCQlucl9ibG9ja3MsIEdGUF9OT0lPKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWxoID0gc2UtPmxpc3QubmV4dDsKKwkJaWYgKGxoID09ICZzaS0+ZXh0ZW50X2xpc3QpCisJCQlsaCA9IGxoLT5uZXh0OworCQlzZSA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzd2FwX2V4dGVudCwgbGlzdCk7CisJfQorfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX2Rpc2NhcmQodm9pZCAqd29yZCkKK3sKKwlzY2hlZHVsZSgpOworCXJldHVybiAwOworfQorCiAjZGVmaW5lIFNXQVBGSUxFX0NMVVNURVIJMjU2CiAjZGVmaW5lIExBVEVOQ1lfTElNSVQJCTI1NgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2Nhbl9zd2FwX21hcChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiB7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxhc3RfaW5fY2x1c3RlcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNjYW5fYmFzZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfaW5fY2x1c3RlciA9IDA7CiAJaW50IGxhdGVuY3lfcmF0aW9uID0gTEFURU5DWV9MSU1JVDsKKwlpbnQgZm91bmRfZnJlZV9jbHVzdGVyID0gMDsKIAotCS8qIAorCS8qCiAJICogV2UgdHJ5IHRvIGNsdXN0ZXIgc3dhcCBwYWdlcyBieSBhbGxvY2F0aW5nIHRoZW0gc2VxdWVudGlhbGx5CiAJICogaW4gc3dhcC4gIE9uY2Ugd2UndmUgYWxsb2NhdGVkIFNXQVBGSUxFX0NMVVNURVIgcGFnZXMgdGhpcwogCSAqIHdheSwgaG93ZXZlciwgd2UgcmVzb3J0IHRvIGZpcnN0LWZyZWUgYWxsb2NhdGlvbiwgc3RhcnRpbmcKQEAgLTk5LDE2ICsxODIsNDIgQEAKIAkgKiBhbGwgb3ZlciB0aGUgZW50aXJlIHN3YXAgcGFydGl0aW9uLCBzbyB0aGF0IHdlIHJlZHVjZQogCSAqIG92ZXJhbGwgZGlzayBzZWVrIHRpbWVzIGJldHdlZW4gc3dhcCBwYWdlcy4gIC0tIHNjdAogCSAqIEJ1dCB3ZSBkbyBub3cgdHJ5IHRvIGZpbmQgYW4gZW1wdHkgY2x1c3Rlci4gIC1BbmRyZWEKKwkgKiBBbmQgd2UgbGV0IHN3YXAgcGFnZXMgZ28gYWxsIG92ZXIgYW4gU1NEIHBhcnRpdGlvbi4gIEh1Z2gKIAkgKi8KIAogCXNpLT5mbGFncyArPSBTV1BfU0NBTk5JTkc7Ci0JaWYgKHVubGlrZWx5KCFzaS0+Y2x1c3Rlcl9ucikpIHsKLQkJc2ktPmNsdXN0ZXJfbnIgPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKLQkJaWYgKHNpLT5wYWdlcyAtIHNpLT5pbnVzZV9wYWdlcyA8IFNXQVBGSUxFX0NMVVNURVIpCi0JCQlnb3RvIGxvd2VzdDsKKwlzY2FuX2Jhc2UgPSBvZmZzZXQgPSBzaS0+Y2x1c3Rlcl9uZXh0OworCisJaWYgKHVubGlrZWx5KCFzaS0+Y2x1c3Rlcl9uci0tKSkgeworCQlpZiAoc2ktPnBhZ2VzIC0gc2ktPmludXNlX3BhZ2VzIDwgU1dBUEZJTEVfQ0xVU1RFUikgeworCQkJc2ktPmNsdXN0ZXJfbnIgPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKwkJCWdvdG8gY2hlY2tzOworCQl9CisJCWlmIChzaS0+ZmxhZ3MgJiBTV1BfRElTQ0FSREFCTEUpIHsKKwkJCS8qCisJCQkgKiBTdGFydCByYW5nZSBjaGVjayBvbiByYWNpbmcgYWxsb2NhdGlvbnMsIGluIGNhc2UKKwkJCSAqIHRoZXkgb3ZlcmxhcCB0aGUgY2x1c3RlciB3ZSBldmVudHVhbGx5IGRlY2lkZSBvbgorCQkJICogKHdlIHNjYW4gd2l0aG91dCBzd2FwX2xvY2sgdG8gYWxsb3cgcHJlZW1wdGlvbikuCisJCQkgKiBJdCdzIGhhcmRseSBjb25jZWl2YWJsZSB0aGF0IGNsdXN0ZXJfbnIgY291bGQgYmUKKwkJCSAqIHdyYXBwZWQgZHVyaW5nIG91ciBzY2FuLCBidXQgZG9uJ3QgZGVwZW5kIG9uIGl0LgorCQkJICovCisJCQlpZiAoc2ktPmxvd2VzdF9hbGxvYykKKwkJCQlnb3RvIGNoZWNrczsKKwkJCXNpLT5sb3dlc3RfYWxsb2MgPSBzaS0+bWF4OworCQkJc2ktPmhpZ2hlc3RfYWxsb2MgPSAwOworCQl9CiAJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCi0JCW9mZnNldCA9IHNpLT5sb3dlc3RfYml0OworCQkvKgorCQkgKiBJZiBzZWVrIGlzIGV4cGVuc2l2ZSwgc3RhcnQgc2VhcmNoaW5nIGZvciBuZXcgY2x1c3RlciBmcm9tCisJCSAqIHN0YXJ0IG9mIHBhcnRpdGlvbiwgdG8gbWluaW1pemUgdGhlIHNwYW4gb2YgYWxsb2NhdGVkIHN3YXAuCisJCSAqIEJ1dCBpZiBzZWVrIGlzIGNoZWFwLCBzZWFyY2ggZnJvbSBvdXIgY3VycmVudCBwb3NpdGlvbiwgc28KKwkJICogdGhhdCBzd2FwIGlzIGFsbG9jYXRlZCBmcm9tIGFsbCBvdmVyIHRoZSBwYXJ0aXRpb246IGlmIHRoZQorCQkgKiBGbGFzaCBUcmFuc2xhdGlvbiBMYXllciBvbmx5IHJlbWFwcyB3aXRoaW4gbGltaXRlZCB6b25lcywKKwkJICogd2UgZG9uJ3Qgd2FudCB0byB3ZWFyIG91dCB0aGUgZmlyc3Qgem9uZSB0b28gcXVpY2tseS4KKwkJICovCisJCWlmICghKHNpLT5mbGFncyAmIFNXUF9TT0xJRFNUQVRFKSkKKwkJCXNjYW5fYmFzZSA9IG9mZnNldCA9IHNpLT5sb3dlc3RfYml0OwogCQlsYXN0X2luX2NsdXN0ZXIgPSBvZmZzZXQgKyBTV0FQRklMRV9DTFVTVEVSIC0gMTsKIAogCQkvKiBMb2NhdGUgdGhlIGZpcnN0IGVtcHR5ICh1bmFsaWduZWQpIGNsdXN0ZXIgKi8KQEAgLTExNyw0MyArMjI2LDEyNCBAQAogCQkJCWxhc3RfaW5fY2x1c3RlciA9IG9mZnNldCArIFNXQVBGSUxFX0NMVVNURVI7CiAJCQllbHNlIGlmIChvZmZzZXQgPT0gbGFzdF9pbl9jbHVzdGVyKSB7CiAJCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwotCQkJCXNpLT5jbHVzdGVyX25leHQgPSBvZmZzZXQtU1dBUEZJTEVfQ0xVU1RFUisxOwotCQkJCWdvdG8gY2x1c3RlcjsKKwkJCQlvZmZzZXQgLT0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCQkJc2ktPmNsdXN0ZXJfbmV4dCA9IG9mZnNldDsKKwkJCQlzaS0+Y2x1c3Rlcl9uciA9IFNXQVBGSUxFX0NMVVNURVIgLSAxOworCQkJCWZvdW5kX2ZyZWVfY2x1c3RlciA9IDE7CisJCQkJZ290byBjaGVja3M7CiAJCQl9CiAJCQlpZiAodW5saWtlbHkoLS1sYXRlbmN5X3JhdGlvbiA8IDApKSB7CiAJCQkJY29uZF9yZXNjaGVkKCk7CiAJCQkJbGF0ZW5jeV9yYXRpb24gPSBMQVRFTkNZX0xJTUlUOwogCQkJfQogCQl9CisKKwkJb2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7CisJCWxhc3RfaW5fY2x1c3RlciA9IG9mZnNldCArIFNXQVBGSUxFX0NMVVNURVIgLSAxOworCisJCS8qIExvY2F0ZSB0aGUgZmlyc3QgZW1wdHkgKHVuYWxpZ25lZCkgY2x1c3RlciAqLworCQlmb3IgKDsgbGFzdF9pbl9jbHVzdGVyIDwgc2Nhbl9iYXNlOyBvZmZzZXQrKykgeworCQkJaWYgKHNpLT5zd2FwX21hcFtvZmZzZXRdKQorCQkJCWxhc3RfaW5fY2x1c3RlciA9IG9mZnNldCArIFNXQVBGSUxFX0NMVVNURVI7CisJCQllbHNlIGlmIChvZmZzZXQgPT0gbGFzdF9pbl9jbHVzdGVyKSB7CisJCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCQkJCW9mZnNldCAtPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKwkJCQlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0OworCQkJCXNpLT5jbHVzdGVyX25yID0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCQkJZm91bmRfZnJlZV9jbHVzdGVyID0gMTsKKwkJCQlnb3RvIGNoZWNrczsKKwkJCX0KKwkJCWlmICh1bmxpa2VseSgtLWxhdGVuY3lfcmF0aW9uIDwgMCkpIHsKKwkJCQljb25kX3Jlc2NoZWQoKTsKKwkJCQlsYXRlbmN5X3JhdGlvbiA9IExBVEVOQ1lfTElNSVQ7CisJCQl9CisJCX0KKworCQlvZmZzZXQgPSBzY2FuX2Jhc2U7CiAJCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKLQkJZ290byBsb3dlc3Q7CisJCXNpLT5jbHVzdGVyX25yID0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCXNpLT5sb3dlc3RfYWxsb2MgPSAwOwogCX0KIAotCXNpLT5jbHVzdGVyX25yLS07Ci1jbHVzdGVyOgotCW9mZnNldCA9IHNpLT5jbHVzdGVyX25leHQ7Ci0JaWYgKG9mZnNldCA+IHNpLT5oaWdoZXN0X2JpdCkKLWxvd2VzdDoJCW9mZnNldCA9IHNpLT5sb3dlc3RfYml0OwotY2hlY2tzOglpZiAoIShzaS0+ZmxhZ3MgJiBTV1BfV1JJVEVPSykpCitjaGVja3M6CisJaWYgKCEoc2ktPmZsYWdzICYgU1dQX1dSSVRFT0spKQogCQlnb3RvIG5vX3BhZ2U7CiAJaWYgKCFzaS0+aGlnaGVzdF9iaXQpCiAJCWdvdG8gbm9fcGFnZTsKLQlpZiAoIXNpLT5zd2FwX21hcFtvZmZzZXRdKSB7Ci0JCWlmIChvZmZzZXQgPT0gc2ktPmxvd2VzdF9iaXQpCi0JCQlzaS0+bG93ZXN0X2JpdCsrOwotCQlpZiAob2Zmc2V0ID09IHNpLT5oaWdoZXN0X2JpdCkKLQkJCXNpLT5oaWdoZXN0X2JpdC0tOwotCQlzaS0+aW51c2VfcGFnZXMrKzsKLQkJaWYgKHNpLT5pbnVzZV9wYWdlcyA9PSBzaS0+cGFnZXMpIHsKLQkJCXNpLT5sb3dlc3RfYml0ID0gc2ktPm1heDsKLQkJCXNpLT5oaWdoZXN0X2JpdCA9IDA7Ci0JCX0KLQkJc2ktPnN3YXBfbWFwW29mZnNldF0gPSAxOwotCQlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0ICsgMTsKLQkJc2ktPmZsYWdzIC09IFNXUF9TQ0FOTklORzsKLQkJcmV0dXJuIG9mZnNldDsKLQl9CisJaWYgKG9mZnNldCA+IHNpLT5oaWdoZXN0X2JpdCkKKwkJc2Nhbl9iYXNlID0gb2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7CisJaWYgKHNpLT5zd2FwX21hcFtvZmZzZXRdKQorCQlnb3RvIHNjYW47CiAKKwlpZiAob2Zmc2V0ID09IHNpLT5sb3dlc3RfYml0KQorCQlzaS0+bG93ZXN0X2JpdCsrOworCWlmIChvZmZzZXQgPT0gc2ktPmhpZ2hlc3RfYml0KQorCQlzaS0+aGlnaGVzdF9iaXQtLTsKKwlzaS0+aW51c2VfcGFnZXMrKzsKKwlpZiAoc2ktPmludXNlX3BhZ2VzID09IHNpLT5wYWdlcykgeworCQlzaS0+bG93ZXN0X2JpdCA9IHNpLT5tYXg7CisJCXNpLT5oaWdoZXN0X2JpdCA9IDA7CisJfQorCXNpLT5zd2FwX21hcFtvZmZzZXRdID0gMTsKKwlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0ICsgMTsKKwlzaS0+ZmxhZ3MgLT0gU1dQX1NDQU5OSU5HOworCisJaWYgKHNpLT5sb3dlc3RfYWxsb2MpIHsKKwkJLyoKKwkJICogT25seSBzZXQgd2hlbiBTV1BfRElTQ0FSREFCTEUsIGFuZCB0aGVyZSdzIGEgc2NhbgorCQkgKiBmb3IgYSBmcmVlIGNsdXN0ZXIgaW4gcHJvZ3Jlc3Mgb3IganVzdCBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAoZm91bmRfZnJlZV9jbHVzdGVyKSB7CisJCQkvKgorCQkJICogVG8gb3B0aW1pemUgd2Vhci1sZXZlbGxpbmcsIGRpc2NhcmQgdGhlCisJCQkgKiBvbGQgZGF0YSBvZiB0aGUgY2x1c3RlciwgdGFraW5nIGNhcmUgbm90IHRvCisJCQkgKiBkaXNjYXJkIGFueSBvZiBpdHMgcGFnZXMgdGhhdCBoYXZlIGFscmVhZHkKKwkJCSAqIGJlZW4gYWxsb2NhdGVkIGJ5IHJhY2luZyB0YXNrcyAob2Zmc2V0IGhhcworCQkJICogYWxyZWFkeSBzdGVwcGVkIG92ZXIgYW55IGF0IHRoZSBiZWdpbm5pbmcpLgorCQkJICovCisJCQlpZiAob2Zmc2V0IDwgc2ktPmhpZ2hlc3RfYWxsb2MgJiYKKwkJCSAgICBzaS0+bG93ZXN0X2FsbG9jIDw9IGxhc3RfaW5fY2x1c3RlcikKKwkJCQlsYXN0X2luX2NsdXN0ZXIgPSBzaS0+bG93ZXN0X2FsbG9jIC0gMTsKKwkJCXNpLT5mbGFncyB8PSBTV1BfRElTQ0FSRElORzsKKwkJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOworCisJCQlpZiAob2Zmc2V0IDwgbGFzdF9pbl9jbHVzdGVyKQorCQkJCWRpc2NhcmRfc3dhcF9jbHVzdGVyKHNpLCBvZmZzZXQsCisJCQkJCWxhc3RfaW5fY2x1c3RlciAtIG9mZnNldCArIDEpOworCisJCQlzcGluX2xvY2soJnN3YXBfbG9jayk7CisJCQlzaS0+bG93ZXN0X2FsbG9jID0gMDsKKwkJCXNpLT5mbGFncyAmPSB+U1dQX0RJU0NBUkRJTkc7CisKKwkJCXNtcF9tYigpOwkvKiB3YWtlX3VwX2JpdCBhZHZpc2VzIHRoaXMgKi8KKwkJCXdha2VfdXBfYml0KCZzaS0+ZmxhZ3MsIGlsb2cyKFNXUF9ESVNDQVJESU5HKSk7CisKKwkJfSBlbHNlIGlmIChzaS0+ZmxhZ3MgJiBTV1BfRElTQ0FSRElORykgeworCQkJLyoKKwkJCSAqIERlbGF5IHVzaW5nIHBhZ2VzIGFsbG9jYXRlZCBieSByYWNpbmcgdGFza3MKKwkJCSAqIHVudGlsIHRoZSB3aG9sZSBkaXNjYXJkIGhhcyBiZWVuIGlzc3VlZC4gV2UKKwkJCSAqIGNvdWxkIGRlZmVyIHRoYXQgZGVsYXkgdW50aWwgc3dhcF93cml0ZXBhZ2UsCisJCQkgKiBidXQgaXQncyBlYXNpZXIgdG8ga2VlcCB0aGlzIHNlbGYtY29udGFpbmVkLgorCQkJICovCisJCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKKwkJCXdhaXRfb25fYml0KCZzaS0+ZmxhZ3MsIGlsb2cyKFNXUF9ESVNDQVJESU5HKSwKKwkJCQl3YWl0X2Zvcl9kaXNjYXJkLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX2xvY2soJnN3YXBfbG9jayk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTm90ZSBwYWdlcyBhbGxvY2F0ZWQgYnkgcmFjaW5nIHRhc2tzIHdoaWxlCisJCQkgKiBzY2FuIGZvciBhIGZyZWUgY2x1c3RlciBpcyBpbiBwcm9ncmVzcywgc28KKwkJCSAqIHRoYXQgaXRzIGZpbmFsIGRpc2NhcmQgY2FuIGV4Y2x1ZGUgdGhlbS4KKwkJCSAqLworCQkJaWYgKG9mZnNldCA8IHNpLT5sb3dlc3RfYWxsb2MpCisJCQkJc2ktPmxvd2VzdF9hbGxvYyA9IG9mZnNldDsKKwkJCWlmIChvZmZzZXQgPiBzaS0+aGlnaGVzdF9hbGxvYykKKwkJCQlzaS0+aGlnaGVzdF9hbGxvYyA9IG9mZnNldDsKKwkJfQorCX0KKwlyZXR1cm4gb2Zmc2V0OworCitzY2FuOgogCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCXdoaWxlICgrK29mZnNldCA8PSBzaS0+aGlnaGVzdF9iaXQpIHsKIAkJaWYgKCFzaS0+c3dhcF9tYXBbb2Zmc2V0XSkgewpAQCAtMTY1LDggKzM1NSwxOCBAQAogCQkJbGF0ZW5jeV9yYXRpb24gPSBMQVRFTkNZX0xJTUlUOwogCQl9CiAJfQorCW9mZnNldCA9IHNpLT5sb3dlc3RfYml0OworCXdoaWxlICgrK29mZnNldCA8IHNjYW5fYmFzZSkgeworCQlpZiAoIXNpLT5zd2FwX21hcFtvZmZzZXRdKSB7CisJCQlzcGluX2xvY2soJnN3YXBfbG9jayk7CisJCQlnb3RvIGNoZWNrczsKKwkJfQorCQlpZiAodW5saWtlbHkoLS1sYXRlbmN5X3JhdGlvbiA8IDApKSB7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWxhdGVuY3lfcmF0aW9uID0gTEFURU5DWV9MSU1JVDsKKwkJfQorCX0KIAlzcGluX2xvY2soJnN3YXBfbG9jayk7Ci0JZ290byBsb3dlc3Q7CiAKIG5vX3BhZ2U6CiAJc2ktPmZsYWdzIC09IFNXUF9TQ0FOTklORzsKQEAgLTI2OCw3ICs0NjgsNyBAQAogCXByaW50ayhLRVJOX0VSUiAic3dhcF9mcmVlOiAlcyUwOGx4XG4iLCBCYWRfZmlsZSwgZW50cnkudmFsKTsKIG91dDoKIAlyZXR1cm4gTlVMTDsKLX0JCit9CiAKIHN0YXRpYyBpbnQgc3dhcF9lbnRyeV9mcmVlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKQEAgLTMyNiw5NyArNTI2LDU4IEBACiB9CiAKIC8qCi0gKiBXZSBjYW4gdXNlIHRoaXMgc3dhcCBjYWNoZSBlbnRyeSBkaXJlY3RseQotICogaWYgdGhlcmUgYXJlIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gaXQuCisgKiBXZSBjYW4gd3JpdGUgdG8gYW4gYW5vbiBwYWdlIHdpdGhvdXQgQ09XIGlmIHRoZXJlIGFyZSBubyBvdGhlciByZWZlcmVuY2VzCisgKiB0byBpdC4gIEFuZCBhcyBhIHNpZGUtZWZmZWN0LCBmcmVlIHVwIGl0cyBzd2FwOiBiZWNhdXNlIHRoZSBvbGQgY29udGVudAorICogb24gZGlzayB3aWxsIG5ldmVyIGJlIHJlYWQsIGFuZCBzZWVraW5nIGJhY2sgdGhlcmUgdG8gd3JpdGUgbmV3IGNvbnRlbnQKKyAqIGxhdGVyIHdvdWxkIG9ubHkgd2FzdGUgdGltZSBhd2F5IGZyb20gY2x1c3RlcmluZy4KICAqLwotaW50IGNhbl9zaGFyZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCitpbnQgcmV1c2Vfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWludCBjb3VudDsKIAotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAljb3VudCA9IHBhZ2VfbWFwY291bnQocGFnZSk7Ci0JaWYgKGNvdW50IDw9IDEgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkKKwlpZiAoY291bnQgPD0gMSAmJiBQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CiAJCWNvdW50ICs9IHBhZ2Vfc3dhcGNvdW50KHBhZ2UpOworCQlpZiAoY291bnQgPT0gMSAmJiAhUGFnZVdyaXRlYmFjayhwYWdlKSkgeworCQkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKKwkJCVNldFBhZ2VEaXJ0eShwYWdlKTsKKwkJfQorCX0KIAlyZXR1cm4gY291bnQgPT0gMTsKIH0KIAogLyoKLSAqIFdvcmsgb3V0IGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgcHJvY2Vzc2VzIHNoYXJpbmcgdGhpcwotICogc3dhcCBjYWNoZSBwYWdlLiBGcmVlIGl0IGlmIHlvdSBjYW4uIFJldHVybiBzdWNjZXNzLgorICogSWYgc3dhcCBpcyBnZXR0aW5nIGZ1bGwsIG9yIGlmIHRoZXJlIGFyZSBubyBtb3JlIG1hcHBpbmdzIG9mIHRoaXMgcGFnZSwKKyAqIHRoZW4gdHJ5X3RvX2ZyZWVfc3dhcCBpcyBjYWxsZWQgdG8gZnJlZSBpdHMgc3dhcCBzcGFjZS4KICAqLwotc3RhdGljIGludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9jb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGNvdW50KQoraW50IHRyeV90b19mcmVlX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaW50IHJldHZhbDsKLQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqIHA7Ci0Jc3dwX2VudHJ5X3QgZW50cnk7Ci0KLQlCVUdfT04oUGFnZVByaXZhdGUocGFnZSkpOwotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAogCWlmICghUGFnZVN3YXBDYWNoZShwYWdlKSkKIAkJcmV0dXJuIDA7CiAJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCiAJCXJldHVybiAwOwotCWlmIChwYWdlX2NvdW50KHBhZ2UpICE9IGNvdW50KSAvKiB1cyArIGNhY2hlICsgcHRlcyAqLworCWlmIChwYWdlX3N3YXBjb3VudChwYWdlKSkKIAkJcmV0dXJuIDA7CiAKLQllbnRyeS52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSk7Ci0JcCA9IHN3YXBfaW5mb19nZXQoZW50cnkpOwotCWlmICghcCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBJcyB0aGUgb25seSBzd2FwIGNhY2hlIHVzZXIgdGhlIGNhY2hlIGl0c2VsZj8gKi8KLQlyZXR2YWwgPSAwOwotCWlmIChwLT5zd2FwX21hcFtzd3Bfb2Zmc2V0KGVudHJ5KV0gPT0gMSkgewotCQkvKiBSZWNoZWNrIHRoZSBwYWdlIGNvdW50IHdpdGggdGhlIHN3YXBjYWNoZSBsb2NrIGhlbGQuLiAqLwotCQlzcGluX2xvY2tfaXJxKCZzd2FwcGVyX3NwYWNlLnRyZWVfbG9jayk7Ci0JCWlmICgocGFnZV9jb3VudChwYWdlKSA9PSBjb3VudCkgJiYgIVBhZ2VXcml0ZWJhY2socGFnZSkpIHsKLQkJCV9fZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKLQkJCVNldFBhZ2VEaXJ0eShwYWdlKTsKLQkJCXJldHZhbCA9IDE7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZzd2FwcGVyX3NwYWNlLnRyZWVfbG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwotCi0JaWYgKHJldHZhbCkgewotCQlzd2FwX2ZyZWUoZW50cnkpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIE1vc3Qgb2YgdGhlIHRpbWUgdGhlIHBhZ2Ugc2hvdWxkIGhhdmUgdHdvIHJlZmVyZW5jZXM6IG9uZSBmb3IgdGhlCi0gKiBwcm9jZXNzIGFuZCBvbmUgZm9yIHRoZSBzd2FwIGNhY2hlLgotICovCi1pbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX2NvdW50KHBhZ2UsIDIpOwotfQotCi0vKgotICogVGhlIHBhZ2VvdXQgY29kZSBob2xkcyBhbiBleHRyYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UuICBUaGF0IHJhaXNlcwotICogdGhlIHJlZmVyZW5jZSBjb3VudCB0byB0ZXN0IGZvciB0byAyIGZvciBhIHBhZ2UgdGhhdCBpcyBvbmx5IGluIHRoZQotICogc3dhcCBjYWNoZSBwbHVzIDEgZm9yIGVhY2ggcHJvY2VzcyB0aGF0IG1hcHMgdGhlIHBhZ2UuCi0gKi8KLWludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9yZWYoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX2NvdW50KHBhZ2UsIDIgKyBwYWdlX21hcGNvdW50KHBhZ2UpKTsKKwlkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHBhZ2UpOworCVNldFBhZ2VEaXJ0eShwYWdlKTsKKwlyZXR1cm4gMTsKIH0KIAogLyoKICAqIEZyZWUgdGhlIHN3YXAgZW50cnkgbGlrZSBhYm92ZSwgYnV0IGFsc28gdHJ5IHRvCiAgKiBmcmVlIHRoZSBwYWdlIGNhY2hlIGVudHJ5IGlmIGl0IGlzIHRoZSBsYXN0IHVzZXIuCiAgKi8KLXZvaWQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCBlbnRyeSkKK2ludCBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cF9lbnRyeV90IGVudHJ5KQogewotCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICogcDsKKwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAKIAlpZiAoaXNfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAogCXAgPSBzd2FwX2luZm9fZ2V0KGVudHJ5KTsKIAlpZiAocCkgewpAQCAtNDMwLDIwICs1OTEsMTkgQEAKIAkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJfQogCWlmIChwYWdlKSB7Ci0JCWludCBvbmVfdXNlcjsKLQotCQlCVUdfT04oUGFnZVByaXZhdGUocGFnZSkpOwotCQlvbmVfdXNlciA9IChwYWdlX2NvdW50KHBhZ2UpID09IDIpOwotCQkvKiBPbmx5IGNhY2hlIHVzZXIgKCt1cyksIG9yIHN3YXAgc3BhY2UgZnVsbD8gRnJlZSBpdCEgKi8KLQkJLyogQWxzbyByZWNoZWNrIFBhZ2VTd2FwQ2FjaGUgYWZ0ZXIgcGFnZSBpcyBsb2NrZWQgKGFib3ZlKSAqLworCQkvKgorCQkgKiBOb3QgbWFwcGVkIGVsc2V3aGVyZSwgb3Igc3dhcCBzcGFjZSBmdWxsPyBGcmVlIGl0IQorCQkgKiBBbHNvIHJlY2hlY2sgUGFnZVN3YXBDYWNoZSBub3cgcGFnZSBpcyBsb2NrZWQgKGFib3ZlKS4KKwkJICovCiAJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmICFQYWdlV3JpdGViYWNrKHBhZ2UpICYmCi0JCQkJCShvbmVfdXNlciB8fCB2bV9zd2FwX2Z1bGwoKSkpIHsKKwkJCQkoIXBhZ2VfbWFwcGVkKHBhZ2UpIHx8IHZtX3N3YXBfZnVsbCgpKSkgewogCQkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKIAkJCVNldFBhZ2VEaXJ0eShwYWdlKTsKIAkJfQogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCX0KKwlyZXR1cm4gcCAhPSBOVUxMOwogfQogCiAjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OCkBAIC03NzYsMTAgKzkzNiwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQkvKiAKKwkJLyoKIAkJICogR2V0IGEgcGFnZSBmb3IgdGhlIGVudHJ5LCB1c2luZyB0aGUgZXhpc3Rpbmcgc3dhcAogCQkgKiBjYWNoZSBwYWdlIGlmIHRoZXJlIGlzIG9uZS4gIE90aGVyd2lzZSwgZ2V0IGEgY2xlYW4KLQkJICogcGFnZSBhbmQgcmVhZCB0aGUgc3dhcCBpbnRvIGl0LiAKKwkJICogcGFnZSBhbmQgcmVhZCB0aGUgc3dhcCBpbnRvIGl0LgogCQkgKi8KIAkJc3dhcF9tYXAgPSAmc2ktPnN3YXBfbWFwW2ldOwogCQllbnRyeSA9IHN3cF9lbnRyeSh0eXBlLCBpKTsKQEAgLTkzMCw3ICsxMDkwLDE2IEBACiAJCQlsb2NrX3BhZ2UocGFnZSk7CiAJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCQl9Ci0JCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQorCisJCS8qCisJCSAqIEl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgYSByYWNpbmcgdGFzayByZW1vdmVkIHRoaXMgcGFnZSBmcm9tCisJCSAqIHN3YXAgY2FjaGUganVzdCBiZWZvcmUgd2UgYWNxdWlyZWQgdGhlIHBhZ2UgbG9jayBhdCB0aGUgdG9wLAorCQkgKiBvciB3aGlsZSB3ZSBkcm9wcGVkIGl0IGluIHVudXNlX21tKCkuICBUaGUgcGFnZSBtaWdodCBldmVuCisJCSAqIGJlIGJhY2sgaW4gc3dhcCBjYWNoZSBvbiBhbm90aGVyIHN3YXAgYXJlYTogdGhhdCB3ZSBtdXN0IG5vdAorCQkgKiBkZWxldGUsIHNpbmNlIGl0IG1heSBub3QgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0IHRvIHN3YXAgeWV0LgorCQkgKi8KKwkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYKKwkJICAgIGxpa2VseShwYWdlX3ByaXZhdGUocGFnZSkgPT0gZW50cnkudmFsKSkKIAkJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CiAKIAkJLyoKQEAgLTEyMDMsMjYgKzEzNzIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZiAwCS8qIFdlIGRvbid0IG5lZWQgdGhpcyB5ZXQgKi8KLSNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgotaW50IHBhZ2VfcXVldWVfY29uZ2VzdGVkKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGk7Ci0KLQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwkvKiBJdCBwaW5zIHRoZSBzd2FwX2luZm9fc3RydWN0ICovCi0KLQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkgewotCQlzd3BfZW50cnlfdCBlbnRyeSA9IHsgLnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKSB9OwotCQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzOwotCi0JCXNpcyA9IGdldF9zd2FwX2luZm9fc3RydWN0KHN3cF90eXBlKGVudHJ5KSk7Ci0JCWJkaSA9IHNpcy0+YmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKLQl9IGVsc2UKLQkJYmRpID0gcGFnZS0+bWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKLQlyZXR1cm4gYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpOwotfQotI2VuZGlmCi0KIGFzbWxpbmthZ2UgbG9uZyBzeXNfc3dhcG9mZihjb25zdCBjaGFyIF9fdXNlciAqIHNwZWNpYWxmaWxlKQogewogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICogcCA9IE5VTEw7CkBAIC0xMjMzLDcgKzEzODIsNyBAQAogCWNoYXIgKiBwYXRobmFtZTsKIAlpbnQgaSwgdHlwZSwgcHJldjsKIAlpbnQgZXJyOwotCQorCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCkBAIC0xMjUzLDcgKzE0MDIsNyBAQAogCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKIAlmb3IgKHR5cGUgPSBzd2FwX2xpc3QuaGVhZDsgdHlwZSA+PSAwOyB0eXBlID0gc3dhcF9pbmZvW3R5cGVdLm5leHQpIHsKIAkJcCA9IHN3YXBfaW5mbyArIHR5cGU7Ci0JCWlmICgocC0+ZmxhZ3MgJiBTV1BfQUNUSVZFKSA9PSBTV1BfQUNUSVZFKSB7CisJCWlmIChwLT5mbGFncyAmIFNXUF9XUklURU9LKSB7CiAJCQlpZiAocC0+c3dhcF9maWxlLT5mX21hcHBpbmcgPT0gbWFwcGluZykKIAkJCQlicmVhazsKIAkJfQpAQCAtMTQyNiwxMiArMTU3NSwxMiBAQAogCWZpbGUgPSBwdHItPnN3YXBfZmlsZTsKIAlsZW4gPSBzZXFfcGF0aChzd2FwLCAmZmlsZS0+Zl9wYXRoLCAiIFx0XG5cXCIpOwogCXNlcV9wcmludGYoc3dhcCwgIiUqcyVzXHQldVx0JXVcdCVkXG4iLAotCQkgICAgICAgbGVuIDwgNDAgPyA0MCAtIGxlbiA6IDEsICIgIiwKLQkJICAgICAgIFNfSVNCTEsoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSA/CisJCQlsZW4gPCA0MCA/IDQwIC0gbGVuIDogMSwgIiAiLAorCQkJU19JU0JMSyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpID8KIAkJCQkicGFydGl0aW9uIiA6ICJmaWxlXHQiLAotCQkgICAgICAgcHRyLT5wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDEwKSwKLQkJICAgICAgIHB0ci0+aW51c2VfcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksCi0JCSAgICAgICBwdHItPnByaW8pOworCQkJcHRyLT5wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDEwKSwKKwkJCXB0ci0+aW51c2VfcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksCisJCQlwdHItPnByaW8pOwogCXJldHVybiAwOwogfQogCkBAIC0xNDg3LDEyICsxNjM2LDExIEBACiAJaW50IGksIHByZXY7CiAJaW50IGVycm9yOwogCXVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlciA9IE5VTEw7Ci0JaW50IHN3YXBfaGVhZGVyX3ZlcnNpb247CiAJdW5zaWduZWQgaW50IG5yX2dvb2RfcGFnZXMgPSAwOwogCWludCBucl9leHRlbnRzID0gMDsKIAlzZWN0b3JfdCBzcGFuOwogCXVuc2lnbmVkIGxvbmcgbWF4cGFnZXMgPSAxOwotCWludCBzd2FwZmlsZXNpemU7CisJdW5zaWduZWQgbG9uZyBzd2FwZmlsZXBhZ2VzOwogCXVuc2lnbmVkIHNob3J0ICpzd2FwX21hcCA9IE5VTEw7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwpAQCAtMTU3MCw3ICsxNzE4LDcgQEAKIAkJZ290byBiYWRfc3dhcDsKIAl9CiAKLQlzd2FwZmlsZXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9TSElGVDsKKwlzd2FwZmlsZXBhZ2VzID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IFBBR0VfU0hJRlQ7CiAKIAkvKgogCSAqIFJlYWQgdGhlIHN3YXAgaGVhZGVyLgpAQCAtMTU4NCwxMDEgKzE3MzIsODYgQEAKIAkJZXJyb3IgPSBQVFJfRVJSKHBhZ2UpOwogCQlnb3RvIGJhZF9zd2FwOwogCX0KLQlrbWFwKHBhZ2UpOwotCXN3YXBfaGVhZGVyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXN3YXBfaGVhZGVyID0ga21hcChwYWdlKTsKIAotCWlmICghbWVtY21wKCJTV0FQLVNQQUNFIixzd2FwX2hlYWRlci0+bWFnaWMubWFnaWMsMTApKQotCQlzd2FwX2hlYWRlcl92ZXJzaW9uID0gMTsKLQllbHNlIGlmICghbWVtY21wKCJTV0FQU1BBQ0UyIixzd2FwX2hlYWRlci0+bWFnaWMubWFnaWMsMTApKQotCQlzd2FwX2hlYWRlcl92ZXJzaW9uID0gMjsKLQllbHNlIHsKKwlpZiAobWVtY21wKCJTV0FQU1BBQ0UyIiwgc3dhcF9oZWFkZXItPm1hZ2ljLm1hZ2ljLCAxMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZmluZCBzd2FwLXNwYWNlIHNpZ25hdHVyZVxuIik7CiAJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byBiYWRfc3dhcDsKIAl9Ci0JCi0Jc3dpdGNoIChzd2FwX2hlYWRlcl92ZXJzaW9uKSB7Ci0JY2FzZSAxOgotCQlwcmludGsoS0VSTl9FUlIgInZlcnNpb24gMCBzd2FwIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICIKLQkJCSJVc2UgbWtzd2FwIC12MSAlc1xuIiwgbmFtZSk7CisKKwkvKiBzd2FwIHBhcnRpdGlvbiBlbmRpYW5lc3MgaGFjay4uLiAqLworCWlmIChzd2FiMzIoc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbikgPT0gMSkgeworCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKTsKKwkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKTsKKwkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMpOworCQlmb3IgKGkgPSAwOyBpIDwgc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXM7IGkrKykKKwkJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLmJhZHBhZ2VzW2ldKTsKKwl9CisJLyogQ2hlY2sgdGhlIHN3YXAgaGVhZGVyJ3Mgc3ViLXZlcnNpb24gKi8KKwlpZiAoc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbiAhPSAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJVbmFibGUgdG8gaGFuZGxlIHN3YXAgaGVhZGVyIHZlcnNpb24gJWRcbiIsCisJCSAgICAgICBzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKTsKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIGJhZF9zd2FwOwotCWNhc2UgMjoKLQkJLyogc3dhcCBwYXJ0aXRpb24gZW5kaWFuZXNzIGhhY2suLi4gKi8KLQkJaWYgKHN3YWIzMihzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKSA9PSAxKSB7Ci0JCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKTsKLQkJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSk7Ci0JCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXM7IGkrKykKLQkJCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby5iYWRwYWdlc1tpXSk7Ci0JCX0KLQkJLyogQ2hlY2sgdGhlIHN3YXAgaGVhZGVyJ3Mgc3ViLXZlcnNpb24gYW5kIHRoZSBzaXplIG9mCi0gICAgICAgICAgICAgICAgICAgdGhlIHN3YXAgZmlsZSBhbmQgYmFkIGJsb2NrIGxpc3RzICovCi0JCWlmIChzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uICE9IDEpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiVW5hYmxlIHRvIGhhbmRsZSBzd2FwIGhlYWRlciB2ZXJzaW9uICVkXG4iLAotCQkJICAgICAgIHN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24pOworCX0KKworCXAtPmxvd2VzdF9iaXQgID0gMTsKKwlwLT5jbHVzdGVyX25leHQgPSAxOworCisJLyoKKwkgKiBGaW5kIG91dCBob3cgbWFueSBwYWdlcyBhcmUgYWxsb3dlZCBmb3IgYSBzaW5nbGUgc3dhcAorCSAqIGRldmljZS4gVGhlcmUgYXJlIHR3byBsaW1pdGluZyBmYWN0b3JzOiAxKSB0aGUgbnVtYmVyIG9mCisJICogYml0cyBmb3IgdGhlIHN3YXAgb2Zmc2V0IGluIHRoZSBzd3BfZW50cnlfdCB0eXBlIGFuZAorCSAqIDIpIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgYSBzd2FwIHB0ZSBhcyBkZWZpbmVkIGJ5CisJICogdGhlIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLiBJbiBvcmRlciB0byBmaW5kIHRoZQorCSAqIGxhcmdlc3QgcG9zc2libGUgYml0IG1hc2sgYSBzd2FwIGVudHJ5IHdpdGggc3dhcCB0eXBlIDAKKwkgKiBhbmQgc3dhcCBvZmZzZXQgfjBVTCBpcyBjcmVhdGVkLCBlbmNvZGVkIHRvIGEgc3dhcCBwdGUsCisJICogZGVjb2RlZCB0byBhIHN3cF9lbnRyeV90IGFnYWluIGFuZCBmaW5hbGx5IHRoZSBzd2FwCisJICogb2Zmc2V0IGlzIGV4dHJhY3RlZC4gVGhpcyB3aWxsIG1hc2sgYWxsIHRoZSBiaXRzIGZyb20KKwkgKiB0aGUgaW5pdGlhbCB+MFVMIG1hc2sgdGhhdCBjYW4ndCBiZSBlbmNvZGVkIGluIGVpdGhlcgorCSAqIHRoZSBzd3BfZW50cnlfdCBvciB0aGUgYXJjaGl0ZWN0dXJlIGRlZmluaXRpb24gb2YgYQorCSAqIHN3YXAgcHRlLgorCSAqLworCW1heHBhZ2VzID0gc3dwX29mZnNldChwdGVfdG9fc3dwX2VudHJ5KAorCQkJc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkoMCwgfjBVTCkpKSkgLSAxOworCWlmIChtYXhwYWdlcyA+IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSkKKwkJbWF4cGFnZXMgPSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2U7CisJcC0+aGlnaGVzdF9iaXQgPSBtYXhwYWdlcyAtIDE7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFtYXhwYWdlcykKKwkJZ290byBiYWRfc3dhcDsKKwlpZiAoc3dhcGZpbGVwYWdlcyAmJiBtYXhwYWdlcyA+IHN3YXBmaWxlcGFnZXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlN3YXAgYXJlYSBzaG9ydGVyIHRoYW4gc2lnbmF0dXJlIGluZGljYXRlc1xuIik7CisJCWdvdG8gYmFkX3N3YXA7CisJfQorCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlnb3RvIGJhZF9zd2FwOworCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyA+IE1BWF9TV0FQX0JBRFBBR0VTKQorCQlnb3RvIGJhZF9zd2FwOworCisJLyogT0ssIHNldCB1cCB0aGUgc3dhcCBtYXAgYW5kIGFwcGx5IHRoZSBiYWQgYmxvY2sgbGlzdCAqLworCXN3YXBfbWFwID0gdm1hbGxvYyhtYXhwYWdlcyAqIHNpemVvZihzaG9ydCkpOworCWlmICghc3dhcF9tYXApIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGJhZF9zd2FwOworCX0KKworCW1lbXNldChzd2FwX21hcCwgMCwgbWF4cGFnZXMgKiBzaXplb2Yoc2hvcnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXM7IGkrKykgeworCQlpbnQgcGFnZV9uciA9IHN3YXBfaGVhZGVyLT5pbmZvLmJhZHBhZ2VzW2ldOworCQlpZiAocGFnZV9uciA8PSAwIHx8IHBhZ2VfbnIgPj0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKSB7CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlnb3RvIGJhZF9zd2FwOwogCQl9Ci0KLQkJcC0+bG93ZXN0X2JpdCAgPSAxOwotCQlwLT5jbHVzdGVyX25leHQgPSAxOwotCi0JCS8qCi0JCSAqIEZpbmQgb3V0IGhvdyBtYW55IHBhZ2VzIGFyZSBhbGxvd2VkIGZvciBhIHNpbmdsZSBzd2FwCi0JCSAqIGRldmljZS4gVGhlcmUgYXJlIHR3byBsaW1pdGluZyBmYWN0b3JzOiAxKSB0aGUgbnVtYmVyIG9mCi0JCSAqIGJpdHMgZm9yIHRoZSBzd2FwIG9mZnNldCBpbiB0aGUgc3dwX2VudHJ5X3QgdHlwZSBhbmQKLQkJICogMikgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBhIHN3YXAgcHRlIGFzIGRlZmluZWQgYnkKLQkJICogdGhlIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLiBJbiBvcmRlciB0byBmaW5kIHRoZQotCQkgKiBsYXJnZXN0IHBvc3NpYmxlIGJpdCBtYXNrIGEgc3dhcCBlbnRyeSB3aXRoIHN3YXAgdHlwZSAwCi0JCSAqIGFuZCBzd2FwIG9mZnNldCB+MFVMIGlzIGNyZWF0ZWQsIGVuY29kZWQgdG8gYSBzd2FwIHB0ZSwKLQkJICogZGVjb2RlZCB0byBhIHN3cF9lbnRyeV90IGFnYWluIGFuZCBmaW5hbGx5IHRoZSBzd2FwCi0JCSAqIG9mZnNldCBpcyBleHRyYWN0ZWQuIFRoaXMgd2lsbCBtYXNrIGFsbCB0aGUgYml0cyBmcm9tCi0JCSAqIHRoZSBpbml0aWFsIH4wVUwgbWFzayB0aGF0IGNhbid0IGJlIGVuY29kZWQgaW4gZWl0aGVyCi0JCSAqIHRoZSBzd3BfZW50cnlfdCBvciB0aGUgYXJjaGl0ZWN0dXJlIGRlZmluaXRpb24gb2YgYQotCQkgKiBzd2FwIHB0ZS4KLQkJICovCi0JCW1heHBhZ2VzID0gc3dwX29mZnNldChwdGVfdG9fc3dwX2VudHJ5KHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KDAsfjBVTCkpKSkgLSAxOwotCQlpZiAobWF4cGFnZXMgPiBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpCi0JCQltYXhwYWdlcyA9IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZTsKLQkJcC0+aGlnaGVzdF9iaXQgPSBtYXhwYWdlcyAtIDE7Ci0KLQkJZXJyb3IgPSAtRUlOVkFMOwotCQlpZiAoIW1heHBhZ2VzKQotCQkJZ290byBiYWRfc3dhcDsKLQkJaWYgKHN3YXBmaWxlc2l6ZSAmJiBtYXhwYWdlcyA+IHN3YXBmaWxlc2l6ZSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJTd2FwIGFyZWEgc2hvcnRlciB0aGFuIHNpZ25hdHVyZSBpbmRpY2F0ZXNcbiIpOwotCQkJZ290byBiYWRfc3dhcDsKLQkJfQotCQlpZiAoc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJCWdvdG8gYmFkX3N3YXA7Ci0JCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyA+IE1BWF9TV0FQX0JBRFBBR0VTKQotCQkJZ290byBiYWRfc3dhcDsKLQotCQkvKiBPSywgc2V0IHVwIHRoZSBzd2FwIG1hcCBhbmQgYXBwbHkgdGhlIGJhZCBibG9jayBsaXN0ICovCi0JCXN3YXBfbWFwID0gdm1hbGxvYyhtYXhwYWdlcyAqIHNpemVvZihzaG9ydCkpOwotCQlpZiAoIXN3YXBfbWFwKSB7Ci0JCQllcnJvciA9IC1FTk9NRU07Ci0JCQlnb3RvIGJhZF9zd2FwOwotCQl9Ci0KLQkJZXJyb3IgPSAwOwotCQltZW1zZXQoc3dhcF9tYXAsIDAsIG1heHBhZ2VzICogc2l6ZW9mKHNob3J0KSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlczsgaSsrKSB7Ci0JCQlpbnQgcGFnZV9uciA9IHN3YXBfaGVhZGVyLT5pbmZvLmJhZHBhZ2VzW2ldOwotCQkJaWYgKHBhZ2VfbnIgPD0gMCB8fCBwYWdlX25yID49IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSkKLQkJCQllcnJvciA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQkJc3dhcF9tYXBbcGFnZV9ucl0gPSBTV0FQX01BUF9CQUQ7Ci0JCX0KLQkJbnJfZ29vZF9wYWdlcyA9IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSAtCi0JCQkJc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgLQotCQkJCTEgLyogaGVhZGVyIHBhZ2UgKi87Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gYmFkX3N3YXA7CisJCXN3YXBfbWFwW3BhZ2VfbnJdID0gU1dBUF9NQVBfQkFEOwogCX0KKwlucl9nb29kX3BhZ2VzID0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlIC0KKwkJCXN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzIC0KKwkJCTEgLyogaGVhZGVyIHBhZ2UgKi87CiAKIAlpZiAobnJfZ29vZF9wYWdlcykgewogCQlzd2FwX21hcFswXSA9IFNXQVBfTUFQX0JBRDsKQEAgLTE2OTcsNiArMTgzMCwxMyBAQAogCQlnb3RvIGJhZF9zd2FwOwogCX0KIAorCWlmIChibGtfcXVldWVfbm9ucm90KGJkZXZfZ2V0X3F1ZXVlKHAtPmJkZXYpKSkgeworCQlwLT5mbGFncyB8PSBTV1BfU09MSURTVEFURTsKKwkJcC0+Y2x1c3Rlcl9uZXh0ID0gMSArIChyYW5kb20zMigpICUgcC0+aGlnaGVzdF9iaXQpOworCX0KKwlpZiAoZGlzY2FyZF9zd2FwKHApID09IDApCisJCXAtPmZsYWdzIHw9IFNXUF9ESVNDQVJEQUJMRTsKKwogCW11dGV4X2xvY2soJnN3YXBvbl9tdXRleCk7CiAJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCWlmIChzd2FwX2ZsYWdzICYgU1dBUF9GTEFHX1BSRUZFUikKQEAgLTE3MDUsMTQgKzE4NDUsMTYgQEAKIAllbHNlCiAJCXAtPnByaW8gPSAtLWxlYXN0X3ByaW9yaXR5OwogCXAtPnN3YXBfbWFwID0gc3dhcF9tYXA7Ci0JcC0+ZmxhZ3MgPSBTV1BfQUNUSVZFOworCXAtPmZsYWdzIHw9IFNXUF9XUklURU9LOwogCW5yX3N3YXBfcGFnZXMgKz0gbnJfZ29vZF9wYWdlczsKIAl0b3RhbF9zd2FwX3BhZ2VzICs9IG5yX2dvb2RfcGFnZXM7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBZGRpbmcgJXVrIHN3YXAgb24gJXMuICAiCi0JCQkiUHJpb3JpdHk6JWQgZXh0ZW50czolZCBhY3Jvc3M6JWxsdWtcbiIsCisJCQkiUHJpb3JpdHk6JWQgZXh0ZW50czolZCBhY3Jvc3M6JWxsdWsgJXMlc1xuIiwKIAkJbnJfZ29vZF9wYWdlczw8KFBBR0VfU0hJRlQtMTApLCBuYW1lLCBwLT5wcmlvLAotCQlucl9leHRlbnRzLCAodW5zaWduZWQgbG9uZyBsb25nKXNwYW48PChQQUdFX1NISUZULTEwKSk7CisJCW5yX2V4dGVudHMsICh1bnNpZ25lZCBsb25nIGxvbmcpc3Bhbjw8KFBBR0VfU0hJRlQtMTApLAorCQkocC0+ZmxhZ3MgJiBTV1BfU09MSURTVEFURSkgPyAiU1MiIDogIiIsCisJCShwLT5mbGFncyAmIFNXUF9ESVNDQVJEQUJMRSkgPyAiRCIgOiAiIik7CiAKIAkvKiBpbnNlcnQgc3dhcCBzcGFjZSBpbnRvIHN3YXBfbGlzdDogKi8KIAlwcmV2ID0gLTE7CmRpZmYgLS1naXQgYS9tbS90aW55LXNobWVtLmMgYi9tbS90aW55LXNobWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjdkNTcuLjAwMDAwMDAKLS0tIGEvbW0vdGlueS1zaG1lbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiB0aW55LXNobWVtLmM6IHNpbXBsZSBzaG1lbWZzIGFuZCB0bXBmcyB1c2luZyByYW1mcyBjb2RlCi0gKgotICogTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+IEphbnVhcnksIDIwMDQKLSAqIGRlcml2ZWQgZnJvbSBtbS9zaG1lbS5jIGFuZCBmcy9yYW1mcy9pbm9kZS5jCi0gKgotICogVGhpcyBpcyBpbnRlbmRlZCBmb3Igc21hbGwgc3lzdGVtIHdoZXJlIHRoZSBiZW5lZml0cyBvZiB0aGUgZnVsbAotICogc2htZW0gY29kZSAoc3dhcC1iYWNrZWQgYW5kIHJlc291cmNlLWxpbWl0ZWQpIGFyZSBvdXR3ZWlnaGVkIGJ5Ci0gKiB0aGVpciBjb21wbGV4aXR5LiBPbiBzeXN0ZW1zIHdpdGhvdXQgc3dhcCB0aGlzIGNvZGUgc2hvdWxkIGJlCi0gKiBlZmZlY3RpdmVseSBlcXVpdmFsZW50LCBidXQgbXVjaCBsaWdodGVyIHdlaWdodC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW91bnQuaD4KLSNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zd2FwLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFtZnMuaD4KLQotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHRtcGZzX2ZzX3R5cGUgPSB7Ci0JLm5hbWUJCT0gInRtcGZzIiwKLQkuZ2V0X3NiCQk9IHJhbWZzX2dldF9zYiwKLQkua2lsbF9zYgk9IGtpbGxfbGl0dGVyX3N1cGVyLAotfTsKLQotc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqc2htX21udDsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdF90bXBmcyh2b2lkKQotewotCUJVR19PTihyZWdpc3Rlcl9maWxlc3lzdGVtKCZ0bXBmc19mc190eXBlKSAhPSAwKTsKLQotCXNobV9tbnQgPSBrZXJuX21vdW50KCZ0bXBmc19mc190eXBlKTsKLQlCVUdfT04oSVNfRVJSKHNobV9tbnQpKTsKLQotCXJldHVybiAwOwotfQotbW9kdWxlX2luaXQoaW5pdF90bXBmcykKLQotLyoqCi0gKiBzaG1lbV9maWxlX3NldHVwIC0gZ2V0IGFuIHVubGlua2VkIGZpbGUgbGl2aW5nIGluIHRtcGZzCi0gKiBAbmFtZTogbmFtZSBmb3IgZGVudHJ5ICh0byBiZSBzZWVuIGluIC9wcm9jLzxwaWQ+L21hcHMKLSAqIEBzaXplOiBzaXplIHRvIGJlIHNldCBmb3IgdGhlIGZpbGUKLSAqIEBmbGFnczogdm1fZmxhZ3MKLSAqLwotc3RydWN0IGZpbGUgKnNobWVtX2ZpbGVfc2V0dXAoY2hhciAqbmFtZSwgbG9mZl90IHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqcm9vdDsKLQlzdHJ1Y3QgcXN0ciB0aGlzOwotCi0JaWYgKElTX0VSUihzaG1fbW50KSkKLQkJcmV0dXJuICh2b2lkICopc2htX21udDsKLQotCWVycm9yID0gLUVOT01FTTsKLQl0aGlzLm5hbWUgPSBuYW1lOwotCXRoaXMubGVuID0gc3RybGVuKG5hbWUpOwotCXRoaXMuaGFzaCA9IDA7IC8qIHdpbGwgZ28gKi8KLQlyb290ID0gc2htX21udC0+bW50X3Jvb3Q7Ci0JZGVudHJ5ID0gZF9hbGxvYyhyb290LCAmdGhpcyk7Ci0JaWYgKCFkZW50cnkpCi0JCWdvdG8gcHV0X21lbW9yeTsKLQotCWVycm9yID0gLUVORklMRTsKLQlmaWxlID0gZ2V0X2VtcHR5X2ZpbHAoKTsKLQlpZiAoIWZpbGUpCi0JCWdvdG8gcHV0X2RlbnRyeTsKLQotCWVycm9yID0gLUVOT1NQQzsKLQlpbm9kZSA9IHJhbWZzX2dldF9pbm9kZShyb290LT5kX3NiLCBTX0lGUkVHIHwgU19JUldYVUdPLCAwKTsKLQlpZiAoIWlub2RlKQotCQlnb3RvIGNsb3NlX2ZpbGU7Ci0KLQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCWlub2RlLT5pX3NpemUgPSBzaXplOwotCWlub2RlLT5pX25saW5rID0gMDsJLyogSXQgaXMgdW5saW5rZWQgKi8KLQlpbml0X2ZpbGUoZmlsZSwgc2htX21udCwgZGVudHJ5LCBGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQsCi0JCQkmcmFtZnNfZmlsZV9vcGVyYXRpb25zKTsKLQotI2lmbmRlZiBDT05GSUdfTU1VCi0JZXJyb3IgPSByYW1mc19ub21tdV9leHBhbmRfZm9yX21hcHBpbmcoaW5vZGUsIHNpemUpOwotCWlmIChlcnJvcikKLQkJZ290byBjbG9zZV9maWxlOwotI2VuZGlmCi0JcmV0dXJuIGZpbGU7Ci0KLWNsb3NlX2ZpbGU6Ci0JcHV0X2ZpbHAoZmlsZSk7Ci1wdXRfZGVudHJ5OgotCWRwdXQoZGVudHJ5KTsKLXB1dF9tZW1vcnk6Ci0JcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc2htZW1fZmlsZV9zZXR1cCk7Ci0KLS8qKgotICogc2htZW1femVyb19zZXR1cCAtIHNldHVwIGEgc2hhcmVkIGFub255bW91cyBtYXBwaW5nCi0gKiBAdm1hOiB0aGUgdm1hIHRvIGJlIG1tYXBwZWQgaXMgcHJlcGFyZWQgYnkgZG9fbW1hcF9wZ29mZgotICovCi1pbnQgc2htZW1femVyb19zZXR1cChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQlsb2ZmX3Qgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQotCWZpbGUgPSBzaG1lbV9maWxlX3NldHVwKCJkZXYvemVybyIsIHNpemUsIHZtYS0+dm1fZmxhZ3MpOwotCWlmIChJU19FUlIoZmlsZSkpCi0JCXJldHVybiBQVFJfRVJSKGZpbGUpOwotCi0JaWYgKHZtYS0+dm1fZmlsZSkKLQkJZnB1dCh2bWEtPnZtX2ZpbGUpOwotCXZtYS0+dm1fZmlsZSA9IGZpbGU7Ci0Jdm1hLT52bV9vcHMgPSAmZ2VuZXJpY19maWxlX3ZtX29wczsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBDT05GSUdfTU1VCi11bnNpZ25lZCBsb25nIHNobWVtX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBnb2ZmLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JcmV0dXJuIHJhbWZzX25vbW11X2dldF91bm1hcHBlZF9hcmVhKGZpbGUsIGFkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IDc0NjVmMjIuLmM1ZGI5YTcgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTM4MSw4ICszODIsOSBAQAogCQkJZ290byByZXRyeTsKIAkJfQogCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidm1hcCBhbGxvY2F0aW9uIGZhaWxlZDogIgotCQkJCSAidXNlIHZtYWxsb2M9PHNpemU+IHRvIGluY3JlYXNlIHNpemUuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkidm1hcCBhbGxvY2F0aW9uIGZvciBzaXplICVsdSBmYWlsZWQ6ICIKKwkJCQkidXNlIHZtYWxsb2M9PHNpemU+IHRvIGluY3JlYXNlIHNpemUuXG4iLCBzaXplKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKIAl9CiAKQEAgLTQzMiw2ICs0MzQsMjcgQEAKIAl2dW5tYXBfcGFnZV9yYW5nZSh2YS0+dmFfc3RhcnQsIHZhLT52YV9lbmQpOwogfQogCitzdGF0aWMgdm9pZCB2bWFwX2RlYnVnX2ZyZWVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJLyoKKwkgKiBVbm1hcCBwYWdlIHRhYmxlcyBhbmQgZm9yY2UgYSBUTEIgZmx1c2ggaW1tZWRpYXRlbHkgaWYKKwkgKiBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIHNldC4gVGhpcyBjYXRjaGVzIHVzZSBhZnRlciBmcmVlCisJICogYnVncyBzaW1pbGFybHkgdG8gdGhvc2UgaW4gbGluZWFyIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBzcGFjZSBhZnRlciBhIHBhZ2UgaGFzIGJlZW4gZnJlZWQuCisJICoKKwkgKiBBbGwgdGhlIGxhenkgZnJlZWluZyBsb2dpYyBpcyBzdGlsbCByZXRhaW5lZCwgaW4gb3JkZXIgdG8KKwkgKiBtaW5pbWlzZSBpbnRydXNpdmVuZXNzIG9mIHRoaXMgZGVidWdnaW5nIGZlYXR1cmUuCisJICoKKwkgKiBUaGlzIGlzIGdvaW5nIHRvIGJlICpzbG93KiAobGluZWFyIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBkZWJ1Z2dpbmcgZG9lc24ndCBkbyBhIGJyb2FkY2FzdCBUTEIgZmx1c2ggc28gaXQgaXMgYSBsb3QKKwkgKiBmYXN0ZXIpLgorCSAqLworI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKKwl2dW5tYXBfcGFnZV9yYW5nZShzdGFydCwgZW5kKTsKKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpOworI2VuZGlmCit9CisKIC8qCiAgKiBsYXp5X21heF9wYWdlcyBpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHdlIGdhdGhlciB1cAogICogYmVmb3JlIGF0dGVtcHRpbmcgdG8gcHVyZ2Ugd2l0aCBhIFRMQiBmbHVzaC4KQEAgLTQ3Miw3ICs0OTUsNyBAQAogc3RhdGljIHZvaWQgX19wdXJnZV92bWFwX2FyZWFfbGF6eSh1bnNpZ25lZCBsb25nICpzdGFydCwgdW5zaWduZWQgbG9uZyAqZW5kLAogCQkJCQlpbnQgc3luYywgaW50IGZvcmNlX2ZsdXNoKQogewotCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHVyZ2VfbG9jayk7CisJc3RhdGljIERFRklORV9NVVRFWChwdXJnZV9sb2NrKTsKIAlMSVNUX0hFQUQodmFsaXN0KTsKIAlzdHJ1Y3Qgdm1hcF9hcmVhICp2YTsKIAlpbnQgbnIgPSAwOwpAQCAtNDgzLDEwICs1MDYsMTAgQEAKIAkgKiB0aGUgY2FzZSB0aGF0IGlzbid0IGFjdHVhbGx5IHVzZWQgYXQgdGhlIG1vbWVudCBhbnl3YXkuCiAJICovCiAJaWYgKCFzeW5jICYmICFmb3JjZV9mbHVzaCkgewotCQlpZiAoIXNwaW5fdHJ5bG9jaygmcHVyZ2VfbG9jaykpCisJCWlmICghbXV0ZXhfdHJ5bG9jaygmcHVyZ2VfbG9jaykpCiAJCQlyZXR1cm47CiAJfSBlbHNlCi0JCXNwaW5fbG9jaygmcHVyZ2VfbG9jayk7CisJCW11dGV4X2xvY2soJnB1cmdlX2xvY2spOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHZhLCAmdm1hcF9hcmVhX2xpc3QsIGxpc3QpIHsKQEAgLTUxOCw3ICs1NDEsNyBAQAogCQkJX19mcmVlX3ZtYXBfYXJlYSh2YSk7CiAJCXNwaW5fdW5sb2NrKCZ2bWFwX2FyZWFfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrKCZwdXJnZV9sb2NrKTsKKwltdXRleF91bmxvY2soJnB1cmdlX2xvY2spOwogfQogCiAvKgpAQCAtOTEyLDYgKzkzNSw3IEBACiAJQlVHX09OKGFkZHIgJiAoUEFHRV9TSVpFLTEpKTsKIAogCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKG1lbSwgc2l6ZSk7CisJdm1hcF9kZWJ1Z19mcmVlX3JhbmdlKGFkZHIsIGFkZHIrc2l6ZSk7CiAKIAlpZiAobGlrZWx5KGNvdW50IDw9IFZNQVBfTUFYX0FMTE9DKSkKIAkJdmJfZnJlZShtZW0sIHNpemUpOwpAQCAtMTEyOCw2ICsxMTUyLDggQEAKIAlpZiAodmEgJiYgdmEtPmZsYWdzICYgVk1fVk1fQVJFQSkgewogCQlzdHJ1Y3Qgdm1fc3RydWN0ICp2bSA9IHZhLT5wcml2YXRlOwogCQlzdHJ1Y3Qgdm1fc3RydWN0ICp0bXAsICoqcDsKKworCQl2bWFwX2RlYnVnX2ZyZWVfcmFuZ2UodmEtPnZhX3N0YXJ0LCB2YS0+dmFfZW5kKTsKIAkJZnJlZV91bm1hcF92bWFwX2FyZWEodmEpOwogCQl2bS0+c2l6ZSAtPSBQQUdFX1NJWkU7CiAKQEAgLTEzNzUsNyArMTQwMSw4IEBACiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKIAl2b2lkICpyZXQ7CiAKLQlyZXQgPSBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLCBQQUdFX0tFUk5FTCk7CisJcmV0ID0gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLAorCQkJICAgICBQQUdFX0tFUk5FTCwgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAJaWYgKHJldCkgewogCQlhcmVhID0gZmluZF92bV9hcmVhKHJldCk7CiAJCWFyZWEtPmZsYWdzIHw9IFZNX1VTRVJNQVA7CkBAIC0xNDIwLDcgKzE0NDcsOCBAQAogCiB2b2lkICp2bWFsbG9jX2V4ZWModW5zaWduZWQgbG9uZyBzaXplKQogewotCXJldHVybiBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMX0VYRUMpOworCXJldHVybiBfX3ZtYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUxfRVhFQywKKwkJCSAgICAgIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmIGRlZmluZWQoQ09ORklHX1pPTkVfRE1BMzIpCkBAIC0xNDQwLDcgKzE0NjgsOCBAQAogICovCiB2b2lkICp2bWFsbG9jXzMyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlyZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9WTUFMTE9DMzIsIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX1ZNQUxMT0MzMiwgUEFHRV9LRVJORUwsCisJCQkgICAgICAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1hbGxvY18zMik7CiAKQEAgLTE0NTYsNyArMTQ4NSw4IEBACiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKIAl2b2lkICpyZXQ7CiAKLQlyZXQgPSBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX1ZNQUxMT0MzMiB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMKTsKKwlyZXQgPSBfX3ZtYWxsb2Nfbm9kZShzaXplLCBHRlBfVk1BTExPQzMyIHwgX19HRlBfWkVSTywgUEFHRV9LRVJORUwsCisJCQkgICAgIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCWlmIChyZXQpIHsKIAkJYXJlYSA9IGZpbmRfdm1fYXJlYShyZXQpOwogCQlhcmVhLT5mbGFncyB8PSBWTV9VU0VSTUFQOwpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBkMTk2ZjQ2Li5iMDdjNDhiIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtNTIsNiArNTIsOSBAQAogCS8qIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgaW5hY3RpdmUgcGFnZXMgdGhhdCB3ZXJlIHNjYW5uZWQgKi8KIAl1bnNpZ25lZCBsb25nIG5yX3NjYW5uZWQ7CiAKKwkvKiBOdW1iZXIgb2YgcGFnZXMgZnJlZWQgc28gZmFyIGR1cmluZyBhIGNhbGwgdG8gc2hyaW5rX3pvbmVzKCkgKi8KKwl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDsKKwogCS8qIFRoaXMgY29udGV4dCdzIEdGUCBtYXNrICovCiAJZ2ZwX3QgZ2ZwX21hc2s7CiAKQEAgLTYxNyw3ICs2MjAsNiBAQAogCQkJCQlyZWZlcmVuY2VkICYmIHBhZ2VfbWFwcGluZ19pbnVzZShwYWdlKSkKIAkJCWdvdG8gYWN0aXZhdGVfbG9ja2VkOwogCi0jaWZkZWYgQ09ORklHX1NXQVAKIAkJLyoKIAkJICogQW5vbnltb3VzIHByb2Nlc3MgbWVtb3J5IGhhcyBiYWNraW5nIHN0b3JlPwogCQkgKiBUcnkgdG8gYWxsb2NhdGUgaXQgc29tZSBzd2FwIHNwYWNlIGhlcmUuCkBAIC02MjUsMjAgKzYyNywxMCBAQAogCQlpZiAoUGFnZUFub24ocGFnZSkgJiYgIVBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKIAkJCWlmICghKHNjLT5nZnBfbWFzayAmIF9fR0ZQX0lPKSkKIAkJCQlnb3RvIGtlZXBfbG9ja2VkOwotCQkJc3dpdGNoICh0cnlfdG9fbXVubG9jayhwYWdlKSkgewotCQkJY2FzZSBTV0FQX0ZBSUw6CQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCi0JCQljYXNlIFNXQVBfQUdBSU46Ci0JCQkJZ290byBrZWVwX2xvY2tlZDsKLQkJCWNhc2UgU1dBUF9NTE9DSzoKLQkJCQlnb3RvIGN1bGxfbWxvY2tlZDsKLQkJCWNhc2UgU1dBUF9TVUNDRVNTOgotCQkJCTsgLyogZmFsbCB0aHJ1JzsgYWRkIHRvIHN3YXAgY2FjaGUgKi8KLQkJCX0KLQkJCWlmICghYWRkX3RvX3N3YXAocGFnZSwgR0ZQX0FUT01JQykpCisJCQlpZiAoIWFkZF90b19zd2FwKHBhZ2UpKQogCQkJCWdvdG8gYWN0aXZhdGVfbG9ja2VkOwogCQkJbWF5X2VudGVyX2ZzID0gMTsKIAkJfQotI2VuZGlmIC8qIENPTkZJR19TV0FQICovCiAKIAkJbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKIApAQCAtNzUyLDYgKzc0NCw4IEBACiAJCWNvbnRpbnVlOwogCiBjdWxsX21sb2NrZWQ6CisJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXB1dGJhY2tfbHJ1X3BhZ2UocGFnZSk7CiAJCWNvbnRpbnVlOwpAQCAtNzU5LDcgKzc1Myw3IEBACiBhY3RpdmF0ZV9sb2NrZWQ6CiAJCS8qIE5vdCBhIGNhbmRpZGF0ZSBmb3Igc3dhcHBpbmcsIHNvIHJlY2xhaW0gc3dhcCBzcGFjZS4gKi8KIAkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYgdm1fc3dhcF9mdWxsKCkpCi0JCQlyZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9yZWYocGFnZSk7CisJCQl0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpOwogCQlWTV9CVUdfT04oUGFnZUFjdGl2ZShwYWdlKSk7CiAJCVNldFBhZ2VBY3RpdmUocGFnZSk7CiAJCXBnYWN0aXZhdGUrKzsKQEAgLTExNzMsMTEgKzExNjcsNiBAQAogCQl6b25lLT5wcmV2X3ByaW9yaXR5ID0gcHJpb3JpdHk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHpvbmVfaXNfbmVhcl9vb20oc3RydWN0IHpvbmUgKnpvbmUpCi17Ci0JcmV0dXJuIHpvbmUtPnBhZ2VzX3NjYW5uZWQgPj0gKHpvbmVfbHJ1X3BhZ2VzKHpvbmUpICogMyk7Ci19Ci0KIC8qCiAgKiBUaGlzIG1vdmVzIHBhZ2VzIGZyb20gdGhlIGFjdGl2ZSBsaXN0IHRvIHRoZSBpbmFjdGl2ZSBsaXN0LgogICoKQEAgLTEyNDgsNiArMTIzNywxMyBAQAogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmbF9pbmFjdGl2ZSk7CiAJfQogCisJLyoKKwkgKiBNb3ZlIHRoZSBwYWdlcyB0byB0aGUgW2ZpbGUgb3IgYW5vbl0gaW5hY3RpdmUgbGlzdC4KKwkgKi8KKwlwYWdldmVjX2luaXQoJnB2ZWMsIDEpOworCXBnbW92ZWQgPSAwOworCWxydSA9IExSVV9CQVNFICsgZmlsZSAqIExSVV9GSUxFOworCiAJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCS8qCiAJICogQ291bnQgcmVmZXJlbmNlZCBwYWdlcyBmcm9tIGN1cnJlbnRseSB1c2VkIG1hcHBpbmdzIGFzCkBAIC0xMjU1LDE1ICsxMjUxLDkgQEAKIAkgKiBUaGlzIGhlbHBzIGJhbGFuY2Ugc2NhbiBwcmVzc3VyZSBiZXR3ZWVuIGZpbGUgYW5kIGFub255bW91cwogCSAqIHBhZ2VzIGluIGdldF9zY2FuX3JhdGlvLgogCSAqLwotCXpvbmUtPnJlY2VudF9yb3RhdGVkWyEhZmlsZV0gKz0gcGdtb3ZlZDsKKwlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKKwkJem9uZS0+cmVjZW50X3JvdGF0ZWRbISFmaWxlXSArPSBwZ21vdmVkOwogCi0JLyoKLQkgKiBNb3ZlIHRoZSBwYWdlcyB0byB0aGUgW2ZpbGUgb3IgYW5vbl0gaW5hY3RpdmUgbGlzdC4KLQkgKi8KLQlwYWdldmVjX2luaXQoJnB2ZWMsIDEpOwotCi0JcGdtb3ZlZCA9IDA7Ci0JbHJ1ID0gTFJVX0JBU0UgKyBmaWxlICogTFJVX0ZJTEU7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsX2luYWN0aXZlKSkgewogCQlwYWdlID0gbHJ1X3RvX3BhZ2UoJmxfaW5hY3RpdmUpOwogCQlwcmVmZXRjaHdfcHJldl9scnVfcGFnZShwYWdlLCAmbF9pbmFjdGl2ZSwgZmxhZ3MpOwpAQCAtMTMzNiwxMiArMTMyNiw2IEBACiAJdW5zaWduZWQgbG9uZyBhbm9uX3ByaW8sIGZpbGVfcHJpbzsKIAl1bnNpZ25lZCBsb25nIGFwLCBmcDsKIAotCWFub24gID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9BTk9OKSArCi0JCXpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9BTk9OKTsKLQlmaWxlICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkVfRklMRSkgKwotCQl6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkVfRklMRSk7Ci0JZnJlZSAgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfRlJFRV9QQUdFUyk7Ci0KIAkvKiBJZiB3ZSBoYXZlIG5vIHN3YXAgc3BhY2UsIGRvIG5vdCBib3RoZXIgc2Nhbm5pbmcgYW5vbiBwYWdlcy4gKi8KIAlpZiAobnJfc3dhcF9wYWdlcyA8PSAwKSB7CiAJCXBlcmNlbnRbMF0gPSAwOwpAQCAtMTM0OSw2ICsxMzMzLDEyIEBACiAJCXJldHVybjsKIAl9CiAKKwlhbm9uICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkVfQU5PTikgKworCQl6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkVfQU5PTik7CisJZmlsZSAgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFX0ZJTEUpICsKKwkJem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0ZJTEUpOworCWZyZWUgID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0ZSRUVfUEFHRVMpOworCiAJLyogSWYgd2UgaGF2ZSB2ZXJ5IGZldyBwYWdlIGNhY2hlIHBhZ2VzLCBmb3JjZS1zY2FuIGFub24gcGFnZXMuICovCiAJaWYgKHVubGlrZWx5KGZpbGUgKyBmcmVlIDw9IHpvbmUtPnBhZ2VzX2hpZ2gpKSB7CiAJCXBlcmNlbnRbMF0gPSAxMDA7CkBAIC0xNDA4LDE0ICsxMzk4LDE1IEBACiAvKgogICogVGhpcyBpcyBhIGJhc2ljIHBlci16b25lIHBhZ2UgZnJlZXIuICBVc2VkIGJ5IGJvdGgga3N3YXBkIGFuZCBkaXJlY3QgcmVjbGFpbS4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hyaW5rX3pvbmUoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZSAqem9uZSwKK3N0YXRpYyB2b2lkIHNocmlua196b25lKGludCBwcmlvcml0eSwgc3RydWN0IHpvbmUgKnpvbmUsCiAJCQkJc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCiB7CiAJdW5zaWduZWQgbG9uZyBucltOUl9MUlVfTElTVFNdOwogCXVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbjsKLQl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBwZXJjZW50WzJdOwkvKiBhbm9uIEAgMDsgZmlsZSBAIDEgKi8KIAllbnVtIGxydV9saXN0IGw7CisJdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQgPSBzYy0+bnJfcmVjbGFpbWVkOworCXVuc2lnbmVkIGxvbmcgc3dhcF9jbHVzdGVyX21heCA9IHNjLT5zd2FwX2NsdXN0ZXJfbWF4OwogCiAJZ2V0X3NjYW5fcmF0aW8oem9uZSwgc2MsIHBlcmNlbnQpOwogCkBAIC0xNDMxLDcgKzE0MjIsNyBAQAogCQkJfQogCQkJem9uZS0+bHJ1W2xdLm5yX3NjYW4gKz0gc2NhbjsKIAkJCW5yW2xdID0gem9uZS0+bHJ1W2xdLm5yX3NjYW47Ci0JCQlpZiAobnJbbF0gPj0gc2MtPnN3YXBfY2x1c3Rlcl9tYXgpCisJCQlpZiAobnJbbF0gPj0gc3dhcF9jbHVzdGVyX21heCkKIAkJCQl6b25lLT5scnVbbF0ubnJfc2NhbiA9IDA7CiAJCQllbHNlCiAJCQkJbnJbbF0gPSAwOwpAQCAtMTQ1MCwxNiArMTQ0MSwyOCBAQAogCQkJCQlucltMUlVfSU5BQ1RJVkVfRklMRV0pIHsKIAkJZm9yX2VhY2hfZXZpY3RhYmxlX2xydShsKSB7CiAJCQlpZiAobnJbbF0pIHsKLQkJCQlucl90b19zY2FuID0gbWluKG5yW2xdLAotCQkJCQkodW5zaWduZWQgbG9uZylzYy0+c3dhcF9jbHVzdGVyX21heCk7CisJCQkJbnJfdG9fc2NhbiA9IG1pbihucltsXSwgc3dhcF9jbHVzdGVyX21heCk7CiAJCQkJbnJbbF0gLT0gbnJfdG9fc2NhbjsKIAogCQkJCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfbGlzdChsLCBucl90b19zY2FuLAotCQkJCQkJCXpvbmUsIHNjLCBwcmlvcml0eSk7CisJCQkJCQkJICAgIHpvbmUsIHNjLCBwcmlvcml0eSk7CiAJCQl9CiAJCX0KKwkJLyoKKwkJICogT24gbGFyZ2UgbWVtb3J5IHN5c3RlbXMsIHNjYW4gPj4gcHJpb3JpdHkgY2FuIGJlY29tZQorCQkgKiByZWFsbHkgbGFyZ2UuIFRoaXMgaXMgZmluZSBmb3IgdGhlIHN0YXJ0aW5nIHByaW9yaXR5OworCQkgKiB3ZSB3YW50IHRvIHB1dCBlcXVhbCBzY2FubmluZyBwcmVzc3VyZSBvbiBlYWNoIHpvbmUuCisJCSAqIEhvd2V2ZXIsIGlmIHRoZSBWTSBoYXMgYSBoYXJkZXIgdGltZSBvZiBmcmVlaW5nIHBhZ2VzLAorCQkgKiB3aXRoIG11bHRpcGxlIHByb2Nlc3NlcyByZWNsYWltaW5nIHBhZ2VzLCB0aGUgdG90YWwKKwkJICogZnJlZWluZyB0YXJnZXQgY2FuIGdldCB1bnJlYXNvbmFibHkgbGFyZ2UuCisJCSAqLworCQlpZiAobnJfcmVjbGFpbWVkID4gc3dhcF9jbHVzdGVyX21heCAmJgorCQkJcHJpb3JpdHkgPCBERUZfUFJJT1JJVFkgJiYgIWN1cnJlbnRfaXNfa3N3YXBkKCkpCisJCQlicmVhazsKIAl9CiAKKwlzYy0+bnJfcmVjbGFpbWVkID0gbnJfcmVjbGFpbWVkOworCiAJLyoKIAkgKiBFdmVuIGlmIHdlIGRpZCBub3QgdHJ5IHRvIGV2aWN0IGFub24gcGFnZXMgYXQgYWxsLCB3ZSB3YW50IHRvCiAJICogcmViYWxhbmNlIHRoZSBhbm9uIGxydSBhY3RpdmUvaW5hY3RpdmUgcmF0aW8uCkBAIC0xNDcwLDcgKzE0NzMsNiBAQAogCQlzaHJpbmtfYWN0aXZlX2xpc3QoU1dBUF9DTFVTVEVSX01BWCwgem9uZSwgc2MsIHByaW9yaXR5LCAwKTsKIAogCXRocm90dGxlX3ZtX3dyaXRlb3V0KHNjLT5nZnBfbWFzayk7Ci0JcmV0dXJuIG5yX3JlY2xhaW1lZDsKIH0KIAogLyoKQEAgLTE0ODQsMTYgKzE0ODYsMTMgQEAKICAqIGIpIFRoZSB6b25lcyBtYXkgYmUgb3ZlciBwYWdlc19oaWdoIGJ1dCB0aGV5IG11c3QgZ28gKm92ZXIqIHBhZ2VzX2hpZ2ggdG8KICAqICAgIHNhdGlzZnkgdGhlIGBpbmNyZW1lbnRhbCBtaW4nIHpvbmUgZGVmZW5zZSBhbGdvcml0aG0uCiAgKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY2xhaW1lZCBwYWdlcy4KLSAqCiAgKiBJZiBhIHpvbmUgaXMgZGVlbWVkIHRvIGJlIGZ1bGwgb2YgcGlubmVkIHBhZ2VzIHRoZW4ganVzdCBnaXZlIGl0IGEgbGlnaHQKICAqIHNjYW4gdGhlbiBnaXZlIHVwIG9uIGl0LgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzaHJpbmtfem9uZXMoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAorc3RhdGljIHZvaWQgc2hyaW5rX3pvbmVzKGludCBwcmlvcml0eSwgc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwKIAkJCQkJc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCiB7CiAJZW51bSB6b25lX3R5cGUgaGlnaF96b25laWR4ID0gZ2ZwX3pvbmUoc2MtPmdmcF9tYXNrKTsKLQl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CiAJc3RydWN0IHpvbmVyZWYgKno7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAKQEAgLTE1MjQsMTAgKzE1MjMsOCBAQAogCQkJCQkJCXByaW9yaXR5KTsKIAkJfQogCi0JCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgc2MpOworCQlzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgc2MpOwogCX0KLQotCXJldHVybiBucl9yZWNsYWltZWQ7CiB9CiAKIC8qCkBAIC0xNTUyLDcgKzE1NDksNiBAQAogCWludCBwcmlvcml0eTsKIAl1bnNpZ25lZCBsb25nIHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9zY2FubmVkID0gMDsKLQl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CiAJc3RydWN0IHJlY2xhaW1fc3RhdGUgKnJlY2xhaW1fc3RhdGUgPSBjdXJyZW50LT5yZWNsYWltX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgbHJ1X3BhZ2VzID0gMDsKIAlzdHJ1Y3Qgem9uZXJlZiAqejsKQEAgLTE1ODAsNyArMTU3Niw3IEBACiAJCXNjLT5ucl9zY2FubmVkID0gMDsKIAkJaWYgKCFwcmlvcml0eSkKIAkJCWRpc2FibGVfc3dhcF90b2tlbigpOwotCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpOworCQlzaHJpbmtfem9uZXMocHJpb3JpdHksIHpvbmVsaXN0LCBzYyk7CiAJCS8qCiAJCSAqIERvbid0IHNocmluayBzbGFicyB3aGVuIHJlY2xhaW1pbmcgbWVtb3J5IGZyb20KIAkJICogb3ZlciBsaW1pdCBjZ3JvdXBzCkBAIC0xNTg4LDEzICsxNTg0LDEzIEBACiAJCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKSB7CiAJCQlzaHJpbmtfc2xhYihzYy0+bnJfc2Nhbm5lZCwgc2MtPmdmcF9tYXNrLCBscnVfcGFnZXMpOwogCQkJaWYgKHJlY2xhaW1fc3RhdGUpIHsKLQkJCQlucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CisJCQkJc2MtPm5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKIAkJCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7CiAJCQl9CiAJCX0KIAkJdG90YWxfc2Nhbm5lZCArPSBzYy0+bnJfc2Nhbm5lZDsKLQkJaWYgKG5yX3JlY2xhaW1lZCA+PSBzYy0+c3dhcF9jbHVzdGVyX21heCkgewotCQkJcmV0ID0gbnJfcmVjbGFpbWVkOworCQlpZiAoc2MtPm5yX3JlY2xhaW1lZCA+PSBzYy0+c3dhcF9jbHVzdGVyX21heCkgeworCQkJcmV0ID0gc2MtPm5yX3JlY2xhaW1lZDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTE2MTcsNyArMTYxMyw3IEBACiAJfQogCS8qIHRvcCBwcmlvcml0eSBzaHJpbmtfem9uZXMgc3RpbGwgaGFkIG1vcmUgdG8gZG8/IGRvbid0IE9PTSwgdGhlbiAqLwogCWlmICghc2MtPmFsbF91bnJlY2xhaW1hYmxlICYmIHNjYW5fZ2xvYmFsX2xydShzYykpCi0JCXJldCA9IG5yX3JlY2xhaW1lZDsKKwkJcmV0ID0gc2MtPm5yX3JlY2xhaW1lZDsKIG91dDoKIAkvKgogCSAqIE5vdyB0aGF0IHdlJ3ZlIHNjYW5uZWQgYWxsIHRoZSB6b25lcyBhdCB0aGlzIHByaW9yaXR5IGxldmVsLCBub3RlCkBAIC0xNzEyLDcgKzE3MDgsNiBAQAogCWludCBwcmlvcml0eTsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX3NjYW5uZWQ7Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7CiAJc3RydWN0IHJlY2xhaW1fc3RhdGUgKnJlY2xhaW1fc3RhdGUgPSBjdXJyZW50LT5yZWNsYWltX3N0YXRlOwogCXN0cnVjdCBzY2FuX2NvbnRyb2wgc2MgPSB7CiAJCS5nZnBfbWFzayA9IEdGUF9LRVJORUwsCkBAIC0xNzMxLDcgKzE3MjYsNyBAQAogCiBsb29wX2FnYWluOgogCXRvdGFsX3NjYW5uZWQgPSAwOwotCW5yX3JlY2xhaW1lZCA9IDA7CisJc2MubnJfcmVjbGFpbWVkID0gMDsKIAlzYy5tYXlfd3JpdGVwYWdlID0gIWxhcHRvcF9tb2RlOwogCWNvdW50X3ZtX2V2ZW50KFBBR0VPVVRSVU4pOwogCkBAIC0xODE3LDExICsxODEyLDExIEBACiAJCQkgKi8KIAkJCWlmICghem9uZV93YXRlcm1hcmtfb2soem9uZSwgb3JkZXIsIDgqem9uZS0+cGFnZXNfaGlnaCwKIAkJCQkJCWVuZF96b25lLCAwKSkKLQkJCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsICZzYyk7CisJCQkJc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsICZzYyk7CiAJCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7CiAJCQlucl9zbGFiID0gc2hyaW5rX3NsYWIoc2MubnJfc2Nhbm5lZCwgR0ZQX0tFUk5FTCwKIAkJCQkJCWxydV9wYWdlcyk7Ci0JCQlucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CisJCQlzYy5ucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CiAJCQl0b3RhbF9zY2FubmVkICs9IHNjLm5yX3NjYW5uZWQ7CiAJCQlpZiAoem9uZV9pc19hbGxfdW5yZWNsYWltYWJsZSh6b25lKSkKIAkJCQljb250aW51ZTsKQEAgLTE4MzUsNyArMTgzMCw3IEBACiAJCQkgKiBldmVuIGluIGxhcHRvcCBtb2RlCiAJCQkgKi8KIAkJCWlmICh0b3RhbF9zY2FubmVkID4gU1dBUF9DTFVTVEVSX01BWCAqIDIgJiYKLQkJCSAgICB0b3RhbF9zY2FubmVkID4gbnJfcmVjbGFpbWVkICsgbnJfcmVjbGFpbWVkIC8gMikKKwkJCSAgICB0b3RhbF9zY2FubmVkID4gc2MubnJfcmVjbGFpbWVkICsgc2MubnJfcmVjbGFpbWVkIC8gMikKIAkJCQlzYy5tYXlfd3JpdGVwYWdlID0gMTsKIAkJfQogCQlpZiAoYWxsX3pvbmVzX29rKQpAQCAtMTg1Myw3ICsxODQ4LDcgQEAKIAkJICogbWF0Y2hlcyB0aGUgZGlyZWN0IHJlY2xhaW0gcGF0aCBiZWhhdmlvdXIgaW4gdGVybXMgb2YgaW1wYWN0CiAJCSAqIG9uIHpvbmUtPipfcHJpb3JpdHkuCiAJCSAqLwotCQlpZiAobnJfcmVjbGFpbWVkID49IFNXQVBfQ0xVU1RFUl9NQVgpCisJCWlmIChzYy5ucl9yZWNsYWltZWQgPj0gU1dBUF9DTFVTVEVSX01BWCkKIAkJCWJyZWFrOwogCX0KIG91dDoKQEAgLTE4NzIsMTAgKzE4NjcsMjcgQEAKIAogCQl0cnlfdG9fZnJlZXplKCk7CiAKKwkJLyoKKwkJICogRnJhZ21lbnRhdGlvbiBtYXkgbWVhbiB0aGF0IHRoZSBzeXN0ZW0gY2Fubm90IGJlCisJCSAqIHJlYmFsYW5jZWQgZm9yIGhpZ2gtb3JkZXIgYWxsb2NhdGlvbnMgaW4gYWxsIHpvbmVzLgorCQkgKiBBdCB0aGlzIHBvaW50LCBpZiBucl9yZWNsYWltZWQgPCBTV0FQX0NMVVNURVJfTUFYLAorCQkgKiBpdCBtZWFucyB0aGUgem9uZXMgaGF2ZSBiZWVuIGZ1bGx5IHNjYW5uZWQgYW5kIGFyZSBzdGlsbAorCQkgKiBub3QgYmFsYW5jZWQuIEZvciBoaWdoLW9yZGVyIGFsbG9jYXRpb25zLCB0aGVyZSBpcworCQkgKiBsaXR0bGUgcG9pbnQgdHJ5aW5nIGFsbCBvdmVyIGFnYWluIGFzIGtzd2FwZCBtYXkKKwkJICogaW5maW5pdGUgbG9vcC4KKwkJICoKKwkJICogSW5zdGVhZCwgcmVjaGVjayBhbGwgd2F0ZXJtYXJrcyBhdCBvcmRlci0wIGFzIHRoZXkKKwkJICogYXJlIHRoZSBtb3N0IGltcG9ydGFudC4gSWYgd2F0ZXJtYXJrcyBhcmUgb2ssIGtzd2FwZCB3aWxsIGdvCisJCSAqIGJhY2sgdG8gc2xlZXAuIEhpZ2gtb3JkZXIgdXNlcnMgY2FuIHN0aWxsIHBlcmZvcm0gZGlyZWN0CisJCSAqIHJlY2xhaW0gaWYgdGhleSB3aXNoLgorCQkgKi8KKwkJaWYgKHNjLm5yX3JlY2xhaW1lZCA8IFNXQVBfQ0xVU1RFUl9NQVgpCisJCQlvcmRlciA9IHNjLm9yZGVyID0gMDsKKwogCQlnb3RvIGxvb3BfYWdhaW47CiAJfQogCi0JcmV0dXJuIG5yX3JlY2xhaW1lZDsKKwlyZXR1cm4gc2MubnJfcmVjbGFpbWVkOwogfQogCiAvKgpAQCAtMjIyNyw3ICsyMjM5LDYgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBjdXJyZW50OwogCXN0cnVjdCByZWNsYWltX3N0YXRlIHJlY2xhaW1fc3RhdGU7CiAJaW50IHByaW9yaXR5OwotCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gMDsKIAlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0gewogCQkubWF5X3dyaXRlcGFnZSA9ICEhKHpvbmVfcmVjbGFpbV9tb2RlICYgUkVDTEFJTV9XUklURSksCiAJCS5tYXlfc3dhcCA9ICEhKHpvbmVfcmVjbGFpbV9tb2RlICYgUkVDTEFJTV9TV0FQKSwKQEAgLTIyNjAsOSArMjI3MSw5IEBACiAJCXByaW9yaXR5ID0gWk9ORV9SRUNMQUlNX1BSSU9SSVRZOwogCQlkbyB7CiAJCQlub3RlX3pvbmVfc2Nhbm5pbmdfcHJpb3JpdHkoem9uZSwgcHJpb3JpdHkpOwotCQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOworCQkJc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsICZzYyk7CiAJCQlwcmlvcml0eS0tOwotCQl9IHdoaWxlIChwcmlvcml0eSA+PSAwICYmIG5yX3JlY2xhaW1lZCA8IG5yX3BhZ2VzKTsKKwkJfSB3aGlsZSAocHJpb3JpdHkgPj0gMCAmJiBzYy5ucl9yZWNsYWltZWQgPCBucl9wYWdlcyk7CiAJfQogCiAJc2xhYl9yZWNsYWltYWJsZSA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9TTEFCX1JFQ0xBSU1BQkxFKTsKQEAgLTIyODYsMTMgKzIyOTcsMTMgQEAKIAkJICogVXBkYXRlIG5yX3JlY2xhaW1lZCBieSB0aGUgbnVtYmVyIG9mIHNsYWIgcGFnZXMgd2UKIAkJICogcmVjbGFpbWVkIGZyb20gdGhpcyB6b25lLgogCQkgKi8KLQkJbnJfcmVjbGFpbWVkICs9IHNsYWJfcmVjbGFpbWFibGUgLQorCQlzYy5ucl9yZWNsYWltZWQgKz0gc2xhYl9yZWNsYWltYWJsZSAtCiAJCQl6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfU0xBQl9SRUNMQUlNQUJMRSk7CiAJfQogCiAJcC0+cmVjbGFpbV9zdGF0ZSA9IE5VTEw7CiAJY3VycmVudC0+ZmxhZ3MgJj0gfihQRl9NRU1BTExPQyB8IFBGX1NXQVBXUklURSk7Ci0JcmV0dXJuIG5yX3JlY2xhaW1lZCA+PSBucl9wYWdlczsKKwlyZXR1cm4gc2MubnJfcmVjbGFpbWVkID49IG5yX3BhZ2VzOwogfQogCiBpbnQgem9uZV9yZWNsYWltKHN0cnVjdCB6b25lICp6b25lLCBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQpAQCAtMjQ3Miw3ICsyNDgzLDcgQEAKICAqIGJhY2sgb250byBAem9uZSdzIHVuZXZpY3RhYmxlIGxpc3QuCiAgKi8KICNkZWZpbmUgU0NBTl9VTkVWSUNUQUJMRV9CQVRDSF9TSVpFIDE2VUwgLyogYXJiaXRyYXJ5IGxvY2sgaG9sZCBiYXRjaCBzaXplICovCi12b2lkIHNjYW5fem9uZV91bmV2aWN0YWJsZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSkKK3N0YXRpYyB2b2lkIHNjYW5fem9uZV91bmV2aWN0YWJsZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsX3VuZXZpY3RhYmxlID0gJnpvbmUtPmxydVtMUlVfVU5FVklDVEFCTEVdLmxpc3Q7CiAJdW5zaWduZWQgbG9uZyBzY2FuOwpAQCAtMjUxNCw3ICsyNTI1LDcgQEAKICAqIHRoYXQgaGFzIHBvc3NpYmx5L3Byb2JhYmx5IG1hZGUgc29tZSBwcmV2aW91c2x5IHVuZXZpY3RhYmxlIHBhZ2VzCiAgKiBldmljdGFibGUuCiAgKi8KLXZvaWQgc2Nhbl9hbGxfem9uZXNfdW5ldmljdGFibGVfcGFnZXModm9pZCkKK3N0YXRpYyB2b2lkIHNjYW5fYWxsX3pvbmVzX3VuZXZpY3RhYmxlX3BhZ2VzKHZvaWQpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAKZGlmZiAtLWdpdCBhL25ldC9pdWN2L2l1Y3YuYyBiL25ldC9pdWN2L2l1Y3YuYwppbmRleCAwMzJmNjFlLi5hMzUyNDBmIDEwMDY0NAotLS0gYS9uZXQvaXVjdi9pdWN2LmMKKysrIGIvbmV0L2l1Y3YvaXVjdi5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zMzkwX2V4dC5oPgotI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAKIC8qCkBAIC0xNjk2LDcgKzE2OTUsNyBAQAogCXJjID0gcmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQpOwogCWlmIChyYykKIAkJZ290byBvdXQ7Ci0JaXVjdl9yb290ID0gczM5MF9yb290X2Rldl9yZWdpc3RlcigiaXVjdiIpOworCWl1Y3Zfcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJpdWN2Iik7CiAJaWYgKElTX0VSUihpdWN2X3Jvb3QpKSB7CiAJCXJjID0gUFRSX0VSUihpdWN2X3Jvb3QpOwogCQlnb3RvIG91dF9pbnQ7CkBAIC0xNzQwLDcgKzE3MzksNyBAQAogCQlrZnJlZShpdWN2X2lycV9kYXRhW2NwdV0pOwogCQlpdWN2X2lycV9kYXRhW2NwdV0gPSBOVUxMOwogCX0KLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoaXVjdl9yb290KTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CiBvdXRfaW50OgogCXVucmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQpOwogb3V0OgpAQCAtMTc3MCw3ICsxNzY5LDcgQEAKIAkJa2ZyZWUoaXVjdl9pcnFfZGF0YVtjcHVdKTsKIAkJaXVjdl9pcnFfZGF0YVtjcHVdID0gTlVMTDsKIAl9Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOwogCWJ1c191bnJlZ2lzdGVyKCZpdWN2X2J1cyk7CiAJdW5yZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHg0MDAwLCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCk7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Zpcm13YXJlX2NsYXNzL2Zpcm13YXJlX3NhbXBsZV9kcml2ZXIuYyBiL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCmluZGV4IDExMTE0ZjMuLjIxOWEyOTggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCisrKyBiL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJICAgICAgICIgcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZmFpbGVkXG4iKTsKIH0KIAotc3RhdGljIGludCBzYW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc2FtcGxlX2luaXQodm9pZCkKIHsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmZ2hvc3RfZGV2aWNlKTsKIAkvKiBzaW5jZSB0aGVyZSBpcyBubyByZWFsIGhhcmR3YXJlIGluc2VydGlvbiBJIGp1c3QgY2FsbCB0aGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYyBiL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYwppbmRleCAwOGQwZDNmLi44ZDliNTVhIDEwMDY0NAotLS0gYS9zYW1wbGVzL2tvYmplY3Qva29iamVjdC1leGFtcGxlLmMKKysrIGIvc2FtcGxlcy9rb2JqZWN0L2tvYmplY3QtZXhhbXBsZS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpleGFtcGxlX2tvYmo7CiAKLXN0YXRpYyBpbnQgZXhhbXBsZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBleGFtcGxlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC0xMjYsNyArMTI2LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBleGFtcGxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGFtcGxlX2V4aXQodm9pZCkKIHsKIAlrb2JqZWN0X3B1dChleGFtcGxlX2tvYmopOwogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jIGIvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jCmluZGV4IDczOTVjMGIuLjQ1YjdkNTYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMva29iamVjdC9rc2V0LWV4YW1wbGUuYworKysgYi9zYW1wbGVzL2tvYmplY3Qva3NldC1leGFtcGxlLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCWtvYmplY3RfcHV0KCZmb28tPmtvYmopOwogfQogCi1zdGF0aWMgaW50IGV4YW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXhhbXBsZV9pbml0KHZvaWQpCiB7CiAJLyoKIAkgKiBDcmVhdGUgYSBrc2V0IHdpdGggdGhlIG5hbWUgb2YgImtzZXRfZXhhbXBsZSIsCkBAIC0yNjQsNyArMjY0LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHZvaWQgZXhhbXBsZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhhbXBsZV9leGl0KHZvaWQpCiB7CiAJZGVzdHJveV9mb29fb2JqKGJhel9vYmopOwogCWRlc3Ryb3lfZm9vX29iaihiYXJfb2JqKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbWFya2Vycy9tYXJrZXItZXhhbXBsZS5jIGIvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKaW5kZXggZTkwZGM1ZC4uZTljZDljMCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKKysrIGIvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAkub3BlbiA9IG15X29wZW4sCiB9OwogCi1zdGF0aWMgaW50IGV4YW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXhhbXBsZV9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fQUxFUlQgImV4YW1wbGUgaW5pdFxuIik7CiAJcGVudHJ5X2V4YW1wbGUgPSBwcm9jX2NyZWF0ZSgibWFya2VyLWV4YW1wbGUiLCAwNDQ0LCBOVUxMLCAmbWFya19vcHMpOwpAQCAtMzksNyArMzksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBleGFtcGxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGFtcGxlX2V4aXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9BTEVSVCAiZXhhbXBsZSBleGl0XG4iKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgibWFya2VyLWV4YW1wbGUiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUuYyBiL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUuYwppbmRleCBlM2E5NjQ4Li45ZTYwZWI2IDEwMDY0NAotLS0gYS9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtcHJvYmUtc2FtcGxlLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiRXZlbnQgQiBpcyBlbmNvdW50ZXJlZFxuIik7CiB9CiAKLWludCBfX2luaXQgdHBfc2FtcGxlX3RyYWNlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHRwX3NhbXBsZV90cmFjZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIApAQCAtNDIsNyArNDIsNyBAQAogCiBtb2R1bGVfaW5pdCh0cF9zYW1wbGVfdHJhY2VfaW5pdCk7CiAKLXZvaWQgX19leGl0IHRwX3NhbXBsZV90cmFjZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgdHBfc2FtcGxlX3RyYWNlX2V4aXQodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX3RyYWNlX3N1YnN5c19ldmVudGIocHJvYmVfc3Vic3lzX2V2ZW50Yik7CiAJdW5yZWdpc3Rlcl90cmFjZV9zdWJzeXNfZXZlbnQocHJvYmVfc3Vic3lzX2V2ZW50KTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUyLmMgYi9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtcHJvYmUtc2FtcGxlMi5jCmluZGV4IDY4NWE1YWMuLmJlMmE5NjAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUyLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZTIuYwpAQCAtMTgsNyArMTgsNyBAQAogCQlpbm9kZS0+aV9pbm8pOwogfQogCi1pbnQgX19pbml0IHRwX3NhbXBsZV90cmFjZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB0cF9zYW1wbGVfdHJhY2VfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKQEAgLTMwLDcgKzMwLDcgQEAKIAogbW9kdWxlX2luaXQodHBfc2FtcGxlX3RyYWNlX2luaXQpOwogCi12b2lkIF9fZXhpdCB0cF9zYW1wbGVfdHJhY2VfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHRwX3NhbXBsZV90cmFjZV9leGl0KHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl90cmFjZV9zdWJzeXNfZXZlbnQocHJvYmVfc3Vic3lzX2V2ZW50KTsKIAl0cmFjZXBvaW50X3N5bmNocm9uaXplX3VucmVnaXN0ZXIoKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1zYW1wbGUuYyBiL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1zYW1wbGUuYwppbmRleCAwMGQxNjk3Li42OGQ1ZGMwIDEwMDY0NAotLS0gYS9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtc2FtcGxlLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXNhbXBsZS5jCkBAIC0zMiw3ICszMiw3IEBACiAJLm9wZW4gPSBteV9vcGVuLAogfTsKIAotc3RhdGljIGludCBleGFtcGxlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGV4YW1wbGVfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0FMRVJUICJleGFtcGxlIGluaXRcbiIpOwogCXBlbnRyeV9leGFtcGxlID0gcHJvY19jcmVhdGUoInRyYWNlcG9pbnQtZXhhbXBsZSIsIDA0NDQsIE5VTEwsCkBAIC00Miw3ICs0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGV4YW1wbGVfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGV4YW1wbGVfZXhpdCh2b2lkKQogewogCXByaW50ayhLRVJOX0FMRVJUICJleGFtcGxlIGV4aXRcbiIpOwogCXJlbW92ZV9wcm9jX2VudHJ5KCJ0cmFjZXBvaW50LWV4YW1wbGUiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCBmODhiYjNlLi43YmVkNGVkIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC0xLDcgKzEsOCBAQAogIyEvdXNyL2Jpbi9wZXJsIC13CiAjIChjKSAyMDAxLCBEYXZlIEpvbmVzLiA8ZGF2ZWpAcmVkaGF0LmNvbT4gKHRoZSBmaWxlIGhhbmRsaW5nIGJpdCkKICMgKGMpIDIwMDUsIEpvZWwgU2Nob3BwIDxqc2Nob3BwQGF1c3Rpbi5pYm0uY29tPiAodGhlIHVnbHkgYml0KQotIyAoYykgMjAwNywgQW5keSBXaGl0Y3JvZnQgPGFwd0B1ay5pYm0uY29tPiAobmV3IGNvbmRpdGlvbnMsIHRlc3Qgc3VpdGUsIGV0YykKKyMgKGMpIDIwMDcsMjAwOCwgQW5keSBXaGl0Y3JvZnQgPGFwd0B1ay5pYm0uY29tPiAobmV3IGNvbmRpdGlvbnMsIHRlc3Qgc3VpdGUpCisjIChjKSAyMDA4LCBBbmR5IFdoaXRjcm9mdCA8YXB3QGNhbm9uaWNhbC5jb20+CiAjIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMgogCiB1c2Ugc3RyaWN0OwpAQCAtOSw3ICsxMCw3IEBACiBteSAkUCA9ICQwOwogJFAgPX4gc0AuKi9AQGc7CiAKLW15ICRWID0gJzAuMjQnOworbXkgJFYgPSAnMC4yNic7CiAKIHVzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBub19hdXRvX2FiYnJldik7CiAKQEAgLTY4LDcgKzY5LDkgQEAKIG15ICRkYmdfdHlwZSA9IDA7CiBteSAkZGJnX2F0dHIgPSAwOwogZm9yIG15ICRrZXkgKGtleXMgJWRlYnVnKSB7Ci0JZXZhbCAiXCR7ZGJnXyRrZXl9ID0gJyRkZWJ1Z3ska2V5fSc7IgorCSMjIG5vIGNyaXRpYworCWV2YWwgIlwke2RiZ18ka2V5fSA9ICckZGVidWd7JGtleX0nOyI7CisJZGllICIkQCIgaWYgKCRAKTsKIH0KIAogaWYgKCR0ZXJzZSkgewpAQCAtMTE2LDcgKzExOSw4IEBACiAJCQlfXyg/Om1lbXxjcHV8ZGV2fCkoPzppbml0ZGF0YXxpbml0KXwKIAkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZHwKIAkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXB8Ci0JCQlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wCisJCQlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wfAorCQkJX193ZWFrCiAJCSAgfXg7CiBvdXIgJE1vZGlmaWVyOwogb3VyICRJbmxpbmUJPSBxcntpbmxpbmV8X19hbHdheXNfaW5saW5lfG5vaW5saW5lfTsKQEAgLTEyNSw2ICsxMjksNyBAQAogCiBvdXIgJENvbnN0YW50CT0gcXJ7KD86WzAtOV0rfDB4WzAtOWEtZkEtRl0rKVtVTF0qfTsKIG91ciAkQXNzaWdubWVudAk9IHFyeyg/OlwqXD18Lz18JT18XCs9fC09fDw8PXw+Pj18Jj18XF49fFx8PXw9KX07CitvdXIgJENvbXBhcmUgICAgPSBxcns8PXw+PXw9PXwhPXw8fD59Owogb3VyICRPcGVyYXRvcnMJPSBxcnsKIAkJCTw9fD49fD09fCE9fAogCQkJPT58LT58PDx8Pj58PHw+fCF8fnwKQEAgLTE5MCw3ICsxOTUsNyBAQAogCQkgIH14OwogCSRUeXBlCT0gcXJ7CiAJCQkkTm9ucHRyVHlwZQotCQkJKD86XHMqXCorXHMqY29uc3R8XHMqXCorfCg/OlxzKlxbXHMqXF0pKyk/CisJCQkoPzpbXHNcKl0rXHMqY29uc3R8W1xzXCpdK3woPzpccypcW1xzKlxdKSspPwogCQkJKD86XHMrJElubGluZXxccyskTW9kaWZpZXIpKgogCQkgIH14OwogCSREZWNsYXJlCT0gcXJ7KD86JFN0b3JhZ2VccyspPyRUeXBlfTsKQEAgLTIwMyw5ICsyMDgsOSBAQAogbXkgQGRlcF9mdW5jdGlvbnMgPSAoKTsKIG15ICRyZW1vdmFsID0gIkRvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCI7CiBpZiAoJHRyZWUgJiYgLWYgIiRyb290LyRyZW1vdmFsIikgewotCW9wZW4oUkVNT1ZFLCAiPCRyb290LyRyZW1vdmFsIikgfHwKKwlvcGVuKG15ICRSRU1PVkUsICc8JywgIiRyb290LyRyZW1vdmFsIikgfHwKIAkJCQlkaWUgIiRQOiAkcmVtb3ZhbDogb3BlbiBmYWlsZWQgLSAkIVxuIjsKLQl3aGlsZSAoPFJFTU9WRT4pIHsKKwl3aGlsZSAoPCRSRU1PVkU+KSB7CiAJCWlmICgvXkNoZWNrOlxzKyguKlxTKS8pIHsKIAkJCWZvciBteSAkZW50cnkgKHNwbGl0KC9bLCBdKy8sICQxKSkgewogCQkJCWlmICgkZW50cnkgPX4gbUBpbmNsdWRlLyguKilAKSB7CkBAIC0yMTcsMTcgKzIyMiwyMSBAQAogCQkJfQogCQl9CiAJfQorCWNsb3NlKCRSRU1PVkUpOwogfQogCiBteSBAcmF3bGluZXMgPSAoKTsKIG15IEBsaW5lcyA9ICgpOwogbXkgJHZuYW1lOwogZm9yIG15ICRmaWxlbmFtZSAoQEFSR1YpIHsKKwlteSAkRklMRTsKIAlpZiAoJGZpbGUpIHsKLQkJb3BlbihGSUxFLCAiZGlmZiAtdSAvZGV2L251bGwgJGZpbGVuYW1lfCIpIHx8CisJCW9wZW4oJEZJTEUsICctfCcsICJkaWZmIC11IC9kZXYvbnVsbCAkZmlsZW5hbWUiKSB8fAogCQkJZGllICIkUDogJGZpbGVuYW1lOiBkaWZmIGZhaWxlZCAtICQhXG4iOworCX0gZWxzaWYgKCRmaWxlbmFtZSBlcSAnLScpIHsKKwkJb3BlbigkRklMRSwgJzwmU1RESU4nKTsKIAl9IGVsc2UgewotCQlvcGVuKEZJTEUsICI8JGZpbGVuYW1lIikgfHwKKwkJb3BlbigkRklMRSwgJzwnLCAiJGZpbGVuYW1lIikgfHwKIAkJCWRpZSAiJFA6ICRmaWxlbmFtZTogb3BlbiBmYWlsZWQgLSAkIVxuIjsKIAl9CiAJaWYgKCRmaWxlbmFtZSBlcSAnLScpIHsKQEAgLTIzNSwxMSArMjQ0LDExIEBACiAJfSBlbHNlIHsKIAkJJHZuYW1lID0gJGZpbGVuYW1lOwogCX0KLQl3aGlsZSAoPEZJTEU+KSB7CisJd2hpbGUgKDwkRklMRT4pIHsKIAkJY2hvbXA7CiAJCXB1c2goQHJhd2xpbmVzLCAkXyk7CiAJfQotCWNsb3NlKEZJTEUpOworCWNsb3NlKCRGSUxFKTsKIAlpZiAoIXByb2Nlc3MoJGZpbGVuYW1lKSkgewogCQkkZXhpdCA9IDE7CiAJfQpAQCAtMzY2LDcgKzM3NSw3IEBACiAJCQl9CiAJCX0KIAotCQkjcHJpbnQgIlNROiRzYW5pdGlzZV9xdW90ZVxuIjsKKwkJI3ByaW50ICJjPCRjPiBTUTwkc2FuaXRpc2VfcXVvdGU+XG4iOwogCQlpZiAoJG9mZiAhPSAwICYmICRzYW5pdGlzZV9xdW90ZSBlcSAnKi8nICYmICRjIG5lICJcdCIpIHsKIAkJCXN1YnN0cigkcmVzLCAkb2ZmLCAxLCAkOyk7CiAJCX0gZWxzaWYgKCRvZmYgIT0gMCAmJiAkc2FuaXRpc2VfcXVvdGUgJiYgJGMgbmUgIlx0IikgewpAQCAtNDAyLDYgKzQxMSw3IEBACiAKIAlteSAkdHlwZSA9ICcnOwogCW15ICRsZXZlbCA9IDA7CisJbXkgQHN0YWNrID0gKFskdHlwZSwgJGxldmVsXSk7CiAJbXkgJHA7CiAJbXkgJGM7CiAJbXkgJGxlbiA9IDA7CkBAIC00MzMsNiArNDQzLDE2IEBACiAJCSRyZW1haW5kZXIgPSBzdWJzdHIoJGJsaywgJG9mZik7CiAKIAkJI3dhcm4gIkNTQjogYzwkYz4gdHlwZTwkdHlwZT4gbGV2ZWw8JGxldmVsPiByZW1haW5kZXI8JHJlbWFpbmRlcj4gY29mZl9zZXQ8JGNvZmZfc2V0PlxuIjsKKworCQkjIEhhbmRsZSBuZXN0ZWQgI2lmLyNlbHNlLgorCQlpZiAoJHJlbWFpbmRlciA9fiAvXiNccyooPzppZm5kZWZ8aWZkZWZ8aWYpXHMvKSB7CisJCQlwdXNoKEBzdGFjaywgWyAkdHlwZSwgJGxldmVsIF0pOworCQl9IGVsc2lmICgkcmVtYWluZGVyID1+IC9eI1xzKig/OmVsc2V8ZWxpZilcYi8pIHsKKwkJCSgkdHlwZSwgJGxldmVsKSA9IEB7JHN0YWNrWyQjc3RhY2sgLSAxXX07CisJCX0gZWxzaWYgKCRyZW1haW5kZXIgPX4gL14jXHMqZW5kaWZcYi8pIHsKKwkJCSgkdHlwZSwgJGxldmVsKSA9IEB7cG9wKEBzdGFjayl9OworCQl9CisKIAkJIyBTdGF0ZW1lbnQgZW5kcyBhdCB0aGUgJzsnIG9yIGEgY2xvc2UgJ30nIGF0IHRoZQogCQkjIG91dGVybW9zdCBsZXZlbC4KIAkJaWYgKCRsZXZlbCA9PSAwICYmICRjIGVxICc7JykgewpAQCAtNTc5LDExICs1OTksMjIgQEAKIAlteSBAcmVzID0gKCk7CiAKIAlteSAkbGV2ZWwgPSAwOworCW15IEBzdGFjayA9ICgkbGV2ZWwpOwogCWZvciAoJGxpbmUgPSAkc3RhcnQ7ICRyZW1haW4gPiAwOyAkbGluZSsrKSB7CiAJCW5leHQgaWYgKCRyYXdsaW5lc1skbGluZV0gPX4gL14tLyk7CiAJCSRyZW1haW4tLTsKIAogCQkkYmxrIC49ICRyYXdsaW5lc1skbGluZV07CisKKwkJIyBIYW5kbGUgbmVzdGVkICNpZi8jZWxzZS4KKwkJaWYgKCRyYXdsaW5lc1skbGluZV0gPX4gL14uXHMqI1xzKig/OmlmbmRlZnxpZmRlZnxpZilccy8pIHsKKwkJCXB1c2goQHN0YWNrLCAkbGV2ZWwpOworCQl9IGVsc2lmICgkcmF3bGluZXNbJGxpbmVdID1+IC9eLlxzKiNccyooPzplbHNlfGVsaWYpXGIvKSB7CisJCQkkbGV2ZWwgPSAkc3RhY2tbJCNzdGFjayAtIDFdOworCQl9IGVsc2lmICgkcmF3bGluZXNbJGxpbmVdID1+IC9eLlxzKiNccyplbmRpZlxiLykgeworCQkJJGxldmVsID0gcG9wKEBzdGFjayk7CisJCX0KKwogCQlmb3JlYWNoIG15ICRjIChzcGxpdCgvLywgJHJhd2xpbmVzWyRsaW5lXSkpIHsKIAkJCSMjcHJpbnQgIkM8JGM+TDwkbGV2ZWw+PCRvcGVuJGNsb3NlPk88JG9mZj5cbiI7CiAJCQlpZiAoJG9mZiA+IDApIHsKQEAgLTg0MywxMSArODc0LDExIEBACiAJCQkkdHlwZSA9ICdWJzsKIAkJCSRhdl9wZW5kaW5nID0gJ1YnOwogCi0JCX0gZWxzaWYgKCRjdXIgPX4gL14oJElkZW50XHMqKTovKSB7Ci0JCQlpZiAoJHR5cGUgZXEgJ0UnKSB7Ci0JCQkJJGF2X3BlbmRfY29sb24gPSAnTCc7Ci0JCQl9IGVsc2lmICgkdHlwZSBlcSAnVCcpIHsKKwkJfSBlbHNpZiAoJGN1ciA9fiAvXigkSWRlbnRccyopOig/OlxzKlxkK1xzKigsfD18OykpPy8pIHsKKwkJCWlmIChkZWZpbmVkICQyICYmICR0eXBlIGVxICdDJyB8fCAkdHlwZSBlcSAnVCcpIHsKIAkJCQkkYXZfcGVuZF9jb2xvbiA9ICdCJzsKKwkJCX0gZWxzaWYgKCR0eXBlIGVxICdFJykgeworCQkJCSRhdl9wZW5kX2NvbG9uID0gJ0wnOwogCQkJfQogCQkJcHJpbnQgIklERU5UX0NPTE9OKCQxLCR0eXBlPiRhdl9wZW5kX2NvbG9uKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ1YnOwpAQCAtODY1LDYgKzg5NiwxMCBAQAogCQkJJHR5cGUgPSAnRSc7CiAJCQkkYXZfcGVuZF9jb2xvbiA9ICdPJzsKIAorCQl9IGVsc2lmICgkY3VyID1+L14oLCkvKSB7CisJCQlwcmludCAiQ09NTUEoJDEpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOworCQkJJHR5cGUgPSAnQyc7CisKIAkJfSBlbHNpZiAoJGN1ciA9fiAvXihcPykvbykgewogCQkJcHJpbnQgIlFVRVNUSU9OKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwpAQCAtODgwLDcgKzkxNSw3IEBACiAJCQl9CiAJCQkkYXZfcGVuZF9jb2xvbiA9ICdPJzsKIAotCQl9IGVsc2lmICgkY3VyID1+IC9eKDt8XFspL28pIHsKKwkJfSBlbHNpZiAoJGN1ciA9fiAvXihcWykvbykgewogCQkJcHJpbnQgIkNMT1NFKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwogCkBAIC0xMDUxLDYgKzEwODYsNyBAQAogCW15ICRpbl9jb21tZW50ID0gMDsKIAlteSAkY29tbWVudF9lZGdlID0gMDsKIAlteSAkZmlyc3RfbGluZSA9IDA7CisJbXkgJHAxX3ByZWZpeCA9ICcnOwogCiAJbXkgJHByZXZfdmFsdWVzID0gJ0UnOwogCkBAIC0xMDk3LDkgKzExMzMsMTIgQEAKIAkJCQkJICRyYXdsaW5lc1skbG4gLSAxXSA9fiAvXi0vKTsKIAkJCQkkY250LS07CiAJCQkJI3ByaW50ICJSQVc8JHJhd2xpbmVzWyRsbiAtIDFdPlxuIjsKLQkJCQkoJGVkZ2UpID0gKGRlZmluZWQgJHJhd2xpbmVzWyRsbiAtIDFdICYmCi0JCQkJCSRyYXdsaW5lc1skbG4gLSAxXSA9fiBtQCgvXCp8XCovKUApOwotCQkJCWxhc3QgaWYgKGRlZmluZWQgJGVkZ2UpOworCQkJCWxhc3QgaWYgKCFkZWZpbmVkICRyYXdsaW5lc1skbG4gLSAxXSk7CisJCQkJaWYgKCRyYXdsaW5lc1skbG4gLSAxXSA9fiBtQCgvXCp8XCovKUAgJiYKKwkJCQkgICAgJHJhd2xpbmVzWyRsbiAtIDFdICF+IG1AIlteIl0qKD86L1wqfFwqLylbXiJdKiJAKSB7CisJCQkJCSgkZWRnZSkgPSAkMTsKKwkJCQkJbGFzdDsKKwkJCQl9CiAJCQl9CiAJCQlpZiAoZGVmaW5lZCAkZWRnZSAmJiAkZWRnZSBlcSAnKi8nKSB7CiAJCQkJJGluX2NvbW1lbnQgPSAxOwpAQCAtMTEwOSw3ICsxMTQ4LDcgQEAKIAkJCSMgaXMgdGhlIHN0YXJ0IG9mIGEgZGlmZiBibG9jayBhbmQgdGhpcyBsaW5lIHN0YXJ0cwogCQkJIyAnIConIHRoZW4gaXQgaXMgdmVyeSBsaWtlbHkgYSBjb21tZW50LgogCQkJaWYgKCFkZWZpbmVkICRlZGdlICYmCi0JCQkgICAgJHJhd2xpbmVzWyRsaW5lbnJdID1+IG1AXi5ccyogXCooPzpcc3wkKUApCisJCQkgICAgJHJhd2xpbmVzWyRsaW5lbnJdID1+IG1AXi5ccyooPzpcKlwqK3wgXCopKD86XHN8JClAKQogCQkJewogCQkJCSRpbl9jb21tZW50ID0gMTsKIAkJCX0KQEAgLTExOTYsNyArMTIzNSwxMiBAQAogCQkjIGV4dHJhY3QgdGhlIGZpbGVuYW1lIGFzIGl0IHBhc3NlcwogCQlpZiAoJGxpbmU9fi9eXCtcK1wrXHMrKFxTKykvKSB7CiAJCQkkcmVhbGZpbGUgPSAkMTsKLQkJCSRyZWFsZmlsZSA9fiBzQF5bXi9dKi9AQDsKKwkJCSRyZWFsZmlsZSA9fiBzQF4oW14vXSopL0BAOworCisJCQkkcDFfcHJlZml4ID0gJDE7CisJCQlpZiAoJHRyZWUgJiYgJHAxX3ByZWZpeCBuZSAnJyAmJiAtZSAiJHJvb3QvJHAxX3ByZWZpeCIpIHsKKwkJCQlXQVJOKCJwYXRjaCBwcmVmaXggJyRwMV9wcmVmaXgnIGV4aXN0cywgYXBwZWFycyB0byBiZSBhIC1wMCBwYXRjaFxuIik7CisJCQl9CiAKIAkJCWlmICgkcmVhbGZpbGUgPX4gbUBeaW5jbHVkZS9hc20vQCkgewogCQkJCUVSUk9SKCJkbyBub3QgbW9kaWZ5IGZpbGVzIGluIGluY2x1ZGUvYXNtLCBjaGFuZ2UgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZpbGVzIGluIGluY2x1ZGUvYXNtLTxhcmNoaXRlY3R1cmU+XG4iIC4gIiRoZXJlJHJhd2xpbmVcbiIpOwpAQCAtMTMzNiw3ICsxMzgwLDcgQEAKIAkJCX0KIAogCQkJIyBhbnkgKGZvbyAuLi4gKikgaXMgYSBwb2ludGVyIGNhc3QsIGFuZCBmb28gaXMgYSB0eXBlCi0JCQl3aGlsZSAoJHMgPX4gL1woKCRJZGVudCkoPzpccyskU3BhcnNlKSpccypcKitccypcKS9zZykgeworCQkJd2hpbGUgKCRzID1+IC9cKCgkSWRlbnQpKD86XHMrJFNwYXJzZSkqW1xzXCpdK1xzKlwpL3NnKSB7CiAJCQkJcG9zc2libGUoJDEsICJDOiIgLiAkcyk7CiAJCQl9CiAKQEAgLTE1OTQsNyArMTYzOCw3IEBACiAJCQkJJGhlcmVjdXJyKTsKIAkJfQogIyBjaGVjayBmb3Igc3RhdGljIGluaXRpYWxpc2Vycy4KLQkJaWYgKCRsaW5lID1+IC9ccypzdGF0aWNccy4qPVxzKigwfE5VTEx8ZmFsc2UpXHMqOy8pIHsKKwkJaWYgKCRsaW5lID1+IC9cYnN0YXRpY1xzLio9XHMqKDB8TlVMTHxmYWxzZSlccyo7LykgewogCQkJRVJST1IoImRvIG5vdCBpbml0aWFsaXNlIHN0YXRpY3MgdG8gMCBvciBOVUxMXG4iIC4KIAkJCQkkaGVyZWN1cnIpOwogCQl9CkBAIC0xNjAyLDcgKzE2NDYsNyBAQAogIyBjaGVjayBmb3IgbmV3IHR5cGVkZWZzLCBvbmx5IGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kIHNwYXJzZSBhbm5vdGF0aW9ucwogIyBtYWtlIHNlbnNlLgogCQlpZiAoJGxpbmUgPX4gL1xidHlwZWRlZlxzLyAmJgotCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMrXChccypcKj8kSWRlbnRccypcKVxzKlwoLyAmJgorCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMqXChccypcKj8kSWRlbnRccypcKVxzKlwoLyAmJgogCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMrJElkZW50XHMqXCgvICYmCiAJCSAgICAkbGluZSAhfiAvXGIkdHlwZVR5cGVkZWZzXGIvICYmCiAJCSAgICAkbGluZSAhfiAvXGJfX2JpdHdpc2UoPzpfX3wpXGIvKSB7CkBAIC0xNjEwLDIxICsxNjU0LDM5IEBACiAJCX0KIAogIyAqIGdvZXMgb24gdmFyaWFibGUgbm90IG9uIHR5cGUKLQkJaWYgKCRsaW5lID1+IG17XCgkTm9ucHRyVHlwZShcKispKD86XHMrY29uc3QpP1wpfSkgewotCQkJRVJST1IoIlwiKGZvbyQxKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiIgLgotCQkJCSRoZXJlY3Vycik7CisJCSMgKGNoYXIqWyBjb25zdF0pCisJCWlmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGUoXHMqXCpbXHNcKl0qKD86JE1vZGlmaWVyXHMqKSopXCl9KSB7CisJCQlteSAoJGZyb20sICR0bykgPSAoJDEsICQxKTsKIAotCQl9IGVsc2lmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGVccysoXCorKSg/IVxzK2NvbnN0KVxzK1wpfSkgewotCQkJRVJST1IoIlwiKGZvbyAkMSApXCIgc2hvdWxkIGJlIFwiKGZvbyAkMSlcIlxuIiAuCi0JCQkJJGhlcmVjdXJyKTsKKwkJCSMgU2hvdWxkIHN0YXJ0IHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL14oXFMpLyAkMS87CisJCQkjIFNob3VsZCBub3QgZW5kIHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL1xzKyQvLzsKKwkJCSMgJyoncyBzaG91bGQgbm90IGhhdmUgc3BhY2VzIGJldHdlZW4uCisJCQl3aGlsZSAoJHRvID1+IHMvKC4pXHNcKi8kMVwqLykgeworCQkJfQogCi0JCX0gZWxzaWYgKCRsaW5lID1+IG17XGIkTm9ucHRyVHlwZShcKispKD86XHMrKD86JEF0dHJpYnV0ZXwkU3BhcnNlKSk/XHMrW0EtWmEtelxkX10rfSkgewotCQkJRVJST1IoIlwiZm9vJDEgYmFyXCIgc2hvdWxkIGJlIFwiZm9vICQxYmFyXCJcbiIgLgotCQkJCSRoZXJlY3Vycik7CisJCQkjcHJpbnQgImZyb208JGZyb20+IHRvPCR0bz5cbiI7CisJCQlpZiAoJGZyb20gbmUgJHRvKSB7CisJCQkJRVJST1IoIlwiKGZvbyRmcm9tKVwiIHNob3VsZCBiZSBcIihmb28kdG8pXCJcbiIgLiAgJGhlcmVjdXJyKTsKKwkJCX0KKwkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcYiROb25wdHJUeXBlKFxzKlwqW1xzXCpdKig/OiRNb2RpZmllclxzKik/KSgkSWRlbnQpfSkgeworCQkJbXkgKCRmcm9tLCAkdG8sICRpZGVudCkgPSAoJDEsICQxLCAkMik7CiAKLQkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcYiROb25wdHJUeXBlXHMrKFwqKykoPyFccysoPzokQXR0cmlidXRlfCRTcGFyc2UpKVxzK1tBLVphLXpcZF9dK30pIHsKLQkJCUVSUk9SKCJcImZvbyAkMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIiAuCi0JCQkJJGhlcmVjdXJyKTsKKwkJCSMgU2hvdWxkIHN0YXJ0IHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL14oXFMpLyAkMS87CisJCQkjIFNob3VsZCBub3QgZW5kIHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL1xzKyQvLzsKKwkJCSMgJyoncyBzaG91bGQgbm90IGhhdmUgc3BhY2VzIGJldHdlZW4uCisJCQl3aGlsZSAoJHRvID1+IHMvKC4pXHNcKi8kMVwqLykgeworCQkJfQorCQkJIyBNb2RpZmllcnMgc2hvdWxkIGhhdmUgc3BhY2VzLgorCQkJJHRvID1+IHMvKFxiJE1vZGlmaWVyJCkvJDEgLzsKKworCQkJI3ByaW50ICJmcm9tPCRmcm9tPiB0bzwkdG8+XG4iOworCQkJaWYgKCRmcm9tIG5lICR0bykgeworCQkJCUVSUk9SKCJcImZvbyR7ZnJvbX1iYXJcIiBzaG91bGQgYmUgXCJmb28ke3RvfWJhclwiXG4iIC4gICRoZXJlY3Vycik7CisJCQl9CiAJCX0KIAogIyAjIG5vIEJVRygpIG9yIEJVR19PTigpCkBAIC0xNzU5LDcgKzE4MjEsNyBAQAogCQkJCQkkYyA9ICdDJyBpZiAoJGVsZW1lbnRzWyRuICsgMl0gPX4gL14kOy8pOwogCQkJCQkkYyA9ICdCJyBpZiAoJGVsZW1lbnRzWyRuICsgMl0gPX4gL14oXCl8XF18OykvKTsKIAkJCQkJJGMgPSAnTycgaWYgKCRlbGVtZW50c1skbiArIDJdIGVxICcnKTsKLQkJCQkJJGMgPSAnRScgaWYgKCRlbGVtZW50c1skbiArIDJdID1+IC9ccypcXCQvKTsKKwkJCQkJJGMgPSAnRScgaWYgKCRlbGVtZW50c1skbiArIDJdID1+IC9eXHMqXFwkLyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJJGMgPSAnRSc7CiAJCQkJfQpAQCAtMTk1MCw5ICsyMDEyLDkgQEAKIAkJCW15ICRzcGFjaW5nID0gJDE7CiAJCQlteSAkdmFsdWUgPSAkMjsKIAotCQkJIyBGbGF0dGVuIGFueSBwYXJlbnRoZXNlcyBhbmQgYnJhY2VzCisJCQkjIEZsYXR0ZW4gYW55IHBhcmVudGhlc2VzCiAJCQkkdmFsdWUgPX4gcy9cKVwoL1wpIFwoL2c7Ci0JCQl3aGlsZSAoJHZhbHVlID1+IHMvXChbXlwoXCldKlwpLzEvKSB7CisJCQl3aGlsZSAoJHZhbHVlICF+IC8oPzokSWRlbnR8LT8kQ29uc3RhbnQpXHMqJENvbXBhcmVccyooPzokSWRlbnR8LT8kQ29uc3RhbnQpLyAmJiAkdmFsdWUgPX4gcy9cKFteXChcKV0qXCkvMS8pIHsKIAkJCX0KIAogCQkJaWYgKCR2YWx1ZSA9fiAvXig/OiRJZGVudHwtPyRDb25zdGFudCkkLykgewpAQCAtMTk5Miw3ICsyMDU0LDcgQEAKIAkJICAgICRsaW5lID1+IC9cYig/OmlmfHdoaWxlfGZvcilccypcKC8gJiYgJGxpbmUgIX4gL14uXHMqIy8pIHsKIAkJCW15ICgkcywgJGMpID0gKCRzdGF0LCAkY29uZCk7CiAKLQkJCWlmICgkYyA9fiAvXGJpZlxzKlwoLipbXjw+IT1dPVtePV0uKi8pIHsKKwkJCWlmICgkYyA9fiAvXGJpZlxzKlwoLipbXjw+IT1dPVtePV0uKi9zKSB7CiAJCQkJRVJST1IoImRvIG5vdCB1c2UgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25cbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCkBAIC0yMTY3LDkgKzIyMjksMTAgQEAKIAkJCQlNT0RVTEVfUEFSQU1fREVTQ3wKIAkJCQlERUNMQVJFX1BFUl9DUFV8CiAJCQkJREVGSU5FX1BFUl9DUFV8Ci0JCQkJX190eXBlb2ZfX1woCisJCQkJX190eXBlb2ZfX1wofAorCQkJCVwuJElkZW50XHMqPVxzKgogCQkJfXg7Ci0JCQkjcHJpbnQgIlJFU1Q8JHJlc3Q+XG4iOworCQkJI3ByaW50ICJSRVNUPCRyZXN0PiBkc3RhdDwkZHN0YXQ+XG4iOwogCQkJaWYgKCRyZXN0IG5lICcnKSB7CiAJCQkJaWYgKCRyZXN0ICF+IC93aGlsZVxzKlwoLyAmJgogCQkJCSAgICAkZHN0YXQgIX4gLyRleGNlcHRpb25zLykKQEAgLTIxODksNiArMjI1MiwxNSBAQAogCQkJfQogCQl9CiAKKyMgbWFrZSBzdXJlIHN5bWJvbHMgYXJlIGFsd2F5cyB3cmFwcGVkIHdpdGggVk1MSU5VWF9TWU1CT0woKSAuLi4KKyMgYWxsIGFzc2lnbm1lbnRzIG1heSBoYXZlIG9ubHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgd2l0aCBhbiBhc3NpZ25tZW50OgorIwkuCisjCUFMSUdOKC4uLikKKyMJVk1MSU5VWF9TWU1CT0woLi4uKQorCQlpZiAoJHJlYWxmaWxlIGVxICd2bWxpbnV4Lmxkcy5oJyAmJiAkbGluZSA9fiAvKD86KD86XnxccykkSWRlbnRccyo9fD1ccyokSWRlbnQoPzpcc3wkKSkvKSB7CisJCQlXQVJOKCJ2bWxpbnV4Lmxkcy5oIG5lZWRzIFZNTElOVVhfU1lNQk9MKCkgYXJvdW5kIEMtdmlzaWJsZSBzeW1ib2xzXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCiAjIGNoZWNrIGZvciByZWR1bmRhbnQgYnJhY2luZyByb3VuZCBpZiBldGMKIAkJaWYgKCRsaW5lID1+IC8oXi4qKVxiaWZcYi8gJiYgJDEgIX4gL2Vsc2VccyokLykgewogCQkJbXkgKCRsZXZlbCwgJGVuZGxuLCBAY2h1bmtzKSA9CkBAIC0yNDQzLDYgKzI1MTUsMTEgQEAKIAkJaWYgKCRsaW5lID1+IC9eLlxzKl9faW5pdGNhbGxccypcKC8pIHsKIAkJCVdBUk4oInBsZWFzZSB1c2UgZGV2aWNlX2luaXRjYWxsKCkgaW5zdGVhZCBvZiBfX2luaXRjYWxsKClcbiIgLiAkaGVyZWN1cnIpOwogCQl9CisjIGNoZWNrIGZvciBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zLCBlbnN1cmUgdGhleSBhcmUgY29uc3QuCisJCWlmICgkbGluZSA9fiAvXGJzdHJ1Y3RccytmaWxlX29wZXJhdGlvbnNcYi8gJiYKKwkJICAgICRsaW5lICF+IC9cYmNvbnN0XGIvKSB7CisJCQlXQVJOKCJzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNob3VsZCBub3JtYWxseSBiZSBjb25zdFxuIiAuICRoZXJlY3Vycik7CisJCX0KIAogIyB1c2Ugb2YgTlJfQ1BVUyBpcyB1c3VhbGx5IHdyb25nCiAjIGlnbm9yZSBkZWZpbml0aW9ucyBvZiBOUl9DUFVTIGFuZCB1c2FnZSB0byBkZWZpbmUgYXJyYXlzIGFzIGxpa2VseSByaWdodApAQCAtMjQ2Niw2ICsyNTQzLDE1IEBACiAJCQkJbGFzdDsKIAkJCX0KIAkJfQorCisjIHdoaW5lIG1pZ2h0bHkgYWJvdXQgaW5fYXRvbWljCisJCWlmICgkbGluZSA9fiAvXGJpbl9hdG9taWNccypcKC8pIHsKKwkJCWlmICgkcmVhbGZpbGUgPX4gbUBeZHJpdmVycy9AKSB7CisJCQkJRVJST1IoImRvIG5vdCB1c2UgaW5fYXRvbWljIGluIGRyaXZlcnNcbiIgLiAkaGVyZWN1cnIpOworCQkJfSBlbHNlIHsKKwkJCQlXQVJOKCJ1c2Ugb2YgaW5fYXRvbWljKCkgaXMgaW5jb3JyZWN0IG91dHNpZGUgY29yZSBrZXJuZWwgY29kZVxuIiAuICRoZXJlY3Vycik7CisJCQl9CisJCX0KIAl9CiAKIAkjIElmIHdlIGhhdmUgbm8gaW5wdXQgYXQgYWxsLCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVwb3J0IG9uCmRpZmYgLS1naXQgYS9zY3JpcHRzL21hcmt1cF9vb3BzLnBsIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBhN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbApAQCAtMCwwICsxLDE2MiBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgQ29weXJpZ2h0IDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwKKyMKKyMgVGhpcyBwcm9ncmFtIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcnM6CisjIAlBcmphbiB2YW4gZGUgVmVuIDxhcmphbkBsaW51eC5pbnRlbC5jb20+CisKKworbXkgJHZtbGludXhfbmFtZSA9ICRBUkdWWzBdOworCisjCisjIFN0ZXAgMTogUGFyc2UgdGhlIG9vcHMgdG8gZmluZCB0aGUgRUlQIHZhbHVlCisjCisKK215ICR0YXJnZXQgPSAiMCI7Cit3aGlsZSAoPFNURElOPikgeworCWlmICgkXyA9fiAvRUlQOiAwMDYwOlxbXDwoW2EtejAtOV0rKVw+XF0vKSB7CisJCSR0YXJnZXQgPSAkMTsKKwl9Cit9CisKK2lmICgkdGFyZ2V0ID1+IC9eZjgvKSB7CisJcHJpbnQgIlRoaXMgc2NyaXB0IGRvZXMgbm90IHdvcmsgb24gbW9kdWxlcyAuLi4gXG4iOworCWV4aXQ7Cit9CisKK2lmICgkdGFyZ2V0IGVxICIwIikgeworCXByaW50ICJObyBvb3BzIGZvdW5kIVxuIjsKKwlwcmludCAiVXNhZ2U6IFxuIjsKKwlwcmludCAiICAgIGRtZXNnIHwgcGVybCBzY3JpcHRzL21hcmt1cF9vb3BzLnBsIHZtbGludXhcbiI7CisJZXhpdDsKK30KKworbXkgJGNvdW50ZXIgPSAwOworbXkgJHN0YXRlICAgPSAwOworbXkgJGNlbnRlciAgPSAwOworbXkgQGxpbmVzOworCitzdWIgSW5SYW5nZSB7CisJbXkgKCRhZGRyZXNzLCAkdGFyZ2V0KSA9IEBfOworCW15ICRhZCA9ICIweCIuJGFkZHJlc3M7CisJbXkgJHRhID0gIjB4Ii4kdGFyZ2V0OworCW15ICRkZWx0YSA9IGhleCgkYWQpIC0gaGV4KCR0YSk7CisKKwlpZiAoKCRkZWx0YSA+IC00MDk2KSAmJiAoJGRlbHRhIDwgNDA5NikpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKKworIyBmaXJzdCwgcGFyc2UgdGhlIGlucHV0IGludG8gdGhlIGxpbmVzIGFycmF5LCBidXQgdG8ga2VlcCBzaXplIGRvd24sCisjIHdlIG9ubHkgZG8gdGhpcyBmb3IgNEtiIGFyb3VuZCB0aGUgc3dlZXQgc3BvdAorCitteSAkZmlsZW5hbWU7CisKK29wZW4oRklMRSwgIm9iamR1bXAgLWRTICR2bWxpbnV4X25hbWUgfCIpIHx8IGRpZSAiQ2Fubm90IHN0YXJ0IG9iamR1bXAiOworCit3aGlsZSAoPEZJTEU+KSB7CisJbXkgJGxpbmUgPSAkXzsKKwljaG9tcCgkbGluZSk7CisJaWYgKCRzdGF0ZSA9PSAwKSB7CisJCWlmICgkbGluZSA9fiAvXihbYS1mMC05XSspXDovKSB7CisJCQlpZiAoSW5SYW5nZSgkMSwgJHRhcmdldCkpIHsKKwkJCQkkc3RhdGUgPSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKCRsaW5lID1+IC9eKFthLWYwLTldW2EtZjAtOV1bYS1mMC05XVthLWYwLTldW2EtZjAtOV1bYS1mMC05XSspXDovKSB7CisJCQlteSAkdmFsID0gJDE7CisJCQlpZiAoIUluUmFuZ2UoJHZhbCwgJHRhcmdldCkpIHsKKwkJCQlsYXN0OworCQkJfQorCQkJaWYgKCR2YWwgZXEgJHRhcmdldCkgeworCQkJCSRjZW50ZXIgPSAkY291bnRlcjsKKwkJCX0KKwkJfQorCQkkbGluZXNbJGNvdW50ZXJdID0gJGxpbmU7CisKKwkJJGNvdW50ZXIgPSAkY291bnRlciArIDE7CisJfQorfQorCitjbG9zZShGSUxFKTsKKworaWYgKCRjb3VudGVyID09IDApIHsKKwlwcmludCAiTm8gbWF0Y2hpbmcgY29kZSBmb3VuZCBcbiI7CisJZXhpdDsKK30KKworaWYgKCRjZW50ZXIgPT0gMCkgeworCXByaW50ICJObyBtYXRjaGluZyBjb2RlIGZvdW5kIFxuIjsKKwlleGl0OworfQorCitteSAkc3RhcnQ7CitteSAkZmluaXNoOworbXkgJGNvZGVsaW5lcyA9IDA7CitteSAkYmluYXJ5bGluZXMgPSAwOworIyBub3cgd2UgZ28gdXAgYW5kIGRvd24gaW4gdGhlIGFycmF5IHRvIGZpbmQgaG93IG11Y2ggd2Ugd2FudCB0byBwcmludAorCiskc3RhcnQgPSAkY2VudGVyOworCit3aGlsZSAoJHN0YXJ0ID4gMSkgeworCSRzdGFydCA9ICRzdGFydCAtIDE7CisJbXkgJGxpbmUgPSAkbGluZXNbJHN0YXJ0XTsKKwlpZiAoJGxpbmUgPX4gL14oW2EtZjAtOV0rKVw6LykgeworCQkkYmluYXJ5bGluZXMgPSAkYmluYXJ5bGluZXMgKyAxOworCX0gZWxzZSB7CisJCSRjb2RlbGluZXMgPSAkY29kZWxpbmVzICsgMTsKKwl9CisJaWYgKCRjb2RlbGluZXMgPiAxMCkgeworCQlsYXN0OworCX0KKwlpZiAoJGJpbmFyeWxpbmVzID4gMjApIHsKKwkJbGFzdDsKKwl9Cit9CisKKworJGZpbmlzaCA9ICRjZW50ZXI7CiskY29kZWxpbmVzID0gMDsKKyRiaW5hcnlsaW5lcyA9IDA7Cit3aGlsZSAoJGZpbmlzaCA8ICRjb3VudGVyKSB7CisJJGZpbmlzaCA9ICRmaW5pc2ggKyAxOworCW15ICRsaW5lID0gJGxpbmVzWyRmaW5pc2hdOworCWlmICgkbGluZSA9fiAvXihbYS1mMC05XSspXDovKSB7CisJCSRiaW5hcnlsaW5lcyA9ICRiaW5hcnlsaW5lcyArIDE7CisJfSBlbHNlIHsKKwkJJGNvZGVsaW5lcyA9ICRjb2RlbGluZXMgKyAxOworCX0KKwlpZiAoJGNvZGVsaW5lcyA+IDEwKSB7CisJCWxhc3Q7CisJfQorCWlmICgkYmluYXJ5bGluZXMgPiAyMCkgeworCQlsYXN0OworCX0KK30KKworCitteSAkaTsKKworbXkgJGZ1bGx0ZXh0ID0gIiI7CiskaSA9ICRzdGFydDsKK3doaWxlICgkaSA8ICRmaW5pc2gpIHsKKwlpZiAoJGkgPT0gJGNlbnRlcikgeworCQkkZnVsbHRleHQgPSAkZnVsbHRleHQgLiAiKiRsaW5lc1skaV0gICAgIDwtLS0tLSBmYXVsdGluZyBpbnN0cnVjdGlvblxuIjsKKwl9IGVsc2UgeworCQkkZnVsbHRleHQgPSAkZnVsbHRleHQgLiAgIiAkbGluZXNbJGldXG4iOworCX0KKwkkaSA9ICRpICsxOworfQorCitwcmludCAkZnVsbHRleHQ7CisKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc291bmQuYyBiL3NvdW5kL2NvcmUvc291bmQuYwppbmRleCA0NGE2OWJiLi43ODcyYTAyIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NvdW5kLmMKKysrIGIvc291bmQvY29yZS9zb3VuZC5jCkBAIC0xNTIsNiArMTUyLDEwIEBACiAJfQogCW9sZF9mb3BzID0gZmlsZS0+Zl9vcDsKIAlmaWxlLT5mX29wID0gZm9wc19nZXQobXB0ci0+Zl9vcHMpOworCWlmIChmaWxlLT5mX29wID09IE5VTEwpIHsKKwkJZmlsZS0+Zl9vcCA9IG9sZF9mb3BzOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJaWYgKGZpbGUtPmZfb3AtPm9wZW4pCiAJCWVyciA9IGZpbGUtPmZfb3AtPm9wZW4oaW5vZGUsIGZpbGUpOwogCWlmIChlcnIpIHsK